ZGlmZiAtLWdpdCBhL0FuZHJvaWQuYnAgYi9BbmRyb2lkLmJwCmluZGV4IGEzNjc5YjEuLmU0ZjEyYzggMTAwNjQ0Ci0tLSBhL0FuZHJvaWQuYnAKKysrIGIvQW5kcm9pZC5icApAQCAtMiw1ICsyLDYgQEAKICAgICAiY2FtZXJhIiwKICAgICAiZHJtLyoiLAogICAgICJtZWRpYS8qIiwKKyAgICAic2VydmljZXMvKiIsCiAgICAgInNvdW5kdHJpZ2dlciIsCiBdCmRpZmYgLS1naXQgYS9jYW1lcmEvQW5kcm9pZC5icCBiL2NhbWVyYS9BbmRyb2lkLmJwCmluZGV4IGM3NmFlNTAuLjI0YjM5MTggMTAwNjQ0Ci0tLSBhL2NhbWVyYS9BbmRyb2lkLmJwCisrKyBiL2NhbWVyYS9BbmRyb2lkLmJwCkBAIC0yOSwxMiArMjksNyBAQAogICAgICAgICAvLyBBSURMIGZpbGVzIGZvciBjYW1lcmEgaW50ZXJmYWNlcwogICAgICAgICAvLyBUaGUgaGVhZGVycyBmb3IgdGhlc2UgaW50ZXJmYWNlcyB3aWxsIGJlIGF2YWlsYWJsZSB0byBhbnkgbW9kdWxlcyB0aGF0CiAgICAgICAgIC8vIGluY2x1ZGUgbGliY2FtZXJhX2NsaWVudCwgYXQgdGhlIHBhdGggImFpZGwvcGFja2FnZS9wYXRoL0JuRm9vLmgiCi0gICAgICAgICJhaWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2UuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2VMaXN0ZW5lci5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZVByb3h5LmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmFpZGwiLAotCisgICAgICAgICI6bGliY2FtZXJhX2NsaWVudF9haWRsIiwKIAogICAgICAgICAvLyBTb3VyY2UgZm9yIGNhbWVyYSBpbnRlcmZhY2UgcGFyY2VsYWJsZXMsIGFuZCBtYW51YWxseS13cml0dGVuIGludGVyZmFjZXMKICAgICAgICAgIkNhbWVyYS5jcHAiLApAQCAtODEsMyArNzYsMjUgQEAKICAgICBdLAogCiB9CisKKy8vIEFJREwgaW50ZXJmYWNlIGJldHdlZW4gY2FtZXJhIGNsaWVudHMgYW5kIHRoZSBjYW1lcmEgc2VydmljZS4KK2ZpbGVncm91cCB7CisgICAgbmFtZTogImxpYmNhbWVyYV9jbGllbnRfYWlkbCIsCisgICAgc3JjczogWworICAgICAgICAiYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2VQcm94eS5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5haWRsIiwKKyAgICBdLAorfQorCisvLyBFeHRyYSBBSURMIGZpbGVzIHRoYXQgYXJlIHVzZWQgYnkgZnJhbWV3b3JrLmphciBidXQgbm90IGxpYmNhbWVyYV9jbGllbnQKKy8vIGJlY2F1c2UgdGhleSBoYXZlIGhhbmQtd3JpdHRlbiBuYXRpdmUgaW1wbGVtZW50YXRpb25zLgorZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAibGliY2FtZXJhX2NsaWVudF9mcmFtZXdvcmtfYWlkbCIsCisgICAgc3JjczogWworICAgICAgICAiYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmEuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYUNsaWVudC5haWRsIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL0NhcHR1cmVSZXN1bHQuY3BwIGIvY2FtZXJhL0NhcHR1cmVSZXN1bHQuY3BwCmluZGV4IGU2YzBkMDAuLjkyOGE2YmMgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9DYXB0dXJlUmVzdWx0LmNwcAorKysgYi9jYW1lcmEvQ2FwdHVyZVJlc3VsdC5jcHAKQEAgLTYwLDYgKzYwLDM5IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvOjpyZWFkRnJvbVBhcmNlbChjb25zdCBhbmRyb2lkOjpQYXJjZWwqIHBhcmNlbCkgeworICAgIHN0YXR1c190IHJlczsKKworICAgIG1QaHlzaWNhbENhbWVyYUlkLnJlbW92ZShtUGh5c2ljYWxDYW1lcmFJZC5zaXplKCkpOworICAgIG1QaHlzaWNhbENhbWVyYU1ldGFkYXRhLmNsZWFyKCk7CisKKyAgICBpZiAoKHJlcyA9IHBhcmNlbC0+cmVhZFN0cmluZzE2KCZtUGh5c2ljYWxDYW1lcmFJZCkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgY2FtZXJhIGlkOiAlZCIsIF9fRlVOQ1RJT05fXywgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBpZiAoKHJlcyA9IG1QaHlzaWNhbENhbWVyYU1ldGFkYXRhLnJlYWRGcm9tUGFyY2VsKHBhcmNlbCkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgbWV0YWRhdGEgZnJvbSBwYXJjZWw6ICVkIiwgX19GVU5DVElPTl9fLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm86OndyaXRlVG9QYXJjZWwoYW5kcm9pZDo6UGFyY2VsKiBwYXJjZWwpIGNvbnN0IHsKKyAgICBzdGF0dXNfdCByZXM7CisgICAgaWYgKChyZXMgPSBwYXJjZWwtPndyaXRlU3RyaW5nMTYobVBoeXNpY2FsQ2FtZXJhSWQpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSBwaHlzaWNhbCBjYW1lcmEgSUQgdG8gcGFyY2VsOiAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBpZiAoKHJlcyA9IG1QaHlzaWNhbENhbWVyYU1ldGFkYXRhLndyaXRlVG9QYXJjZWwocGFyY2VsKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gd3JpdGUgcGh5c2ljYWwgY2FtZXJhIG1ldGFkYXRhIHRvIHBhcmNlbDogJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCiBDYXB0dXJlUmVzdWx0OjpDYXB0dXJlUmVzdWx0KCkgOgogICAgICAgICBtTWV0YWRhdGEoKSwgbVJlc3VsdEV4dHJhcygpIHsKIH0KQEAgLTY3LDYgKzEwMCw3IEBACiBDYXB0dXJlUmVzdWx0OjpDYXB0dXJlUmVzdWx0KGNvbnN0IENhcHR1cmVSZXN1bHQgJm90aGVyUmVzdWx0KSB7CiAgICAgbVJlc3VsdEV4dHJhcyA9IG90aGVyUmVzdWx0Lm1SZXN1bHRFeHRyYXM7CiAgICAgbU1ldGFkYXRhID0gb3RoZXJSZXN1bHQubU1ldGFkYXRhOworICAgIG1QaHlzaWNhbE1ldGFkYXRhcyA9IG90aGVyUmVzdWx0Lm1QaHlzaWNhbE1ldGFkYXRhczsKIH0KIAogc3RhdHVzX3QgQ2FwdHVyZVJlc3VsdDo6cmVhZEZyb21QYXJjZWwoYW5kcm9pZDo6UGFyY2VsICpwYXJjZWwpIHsKQEAgLTc5LDYgKzExMyw3IEBACiAgICAgfQogCiAgICAgbU1ldGFkYXRhLmNsZWFyKCk7CisgICAgbVBoeXNpY2FsTWV0YWRhdGFzLmNsZWFyKCk7CiAKICAgICBzdGF0dXNfdCByZXMgPSBPSzsKICAgICByZXMgPSBtTWV0YWRhdGEucmVhZEZyb21QYXJjZWwocGFyY2VsKTsKQEAgLTg5LDYgKzEyNCwzNCBAQAogICAgIH0KICAgICBBTE9HVigiJXM6IFJlYWQgbWV0YWRhdGEgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOwogCisgICAgaW50MzJfdCBwaHlzaWNhbE1ldGFkYXRhQ291bnQ7CisgICAgaWYgKChyZXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmcGh5c2ljYWxNZXRhZGF0YUNvdW50KSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCB0aGUgcGh5c2ljYWwgbWV0YWRhdGEgY291bnQgZnJvbSBwYXJjZWw6ICVkIiwgX19GVU5DVElPTl9fLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBpZiAocGh5c2ljYWxNZXRhZGF0YUNvdW50IDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgcGh5c2ljYWwgbWV0YWRhdGEgY291bnQgZnJvbSBwYXJjZWw6ICVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBoeXNpY2FsTWV0YWRhdGFDb3VudCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgcGh5c2ljYWxNZXRhZGF0YUNvdW50OyBpKyspIHsKKyAgICAgICAgU3RyaW5nMTYgY2FtZXJhSWQ7CisgICAgICAgIGlmICgocmVzID0gcGFyY2VsLT5yZWFkU3RyaW5nMTYoJmNhbWVyYUlkKSkgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgY2FtZXJhIGlkOiAlZCIsIF9fRlVOQ1RJT05fXywgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKworICAgICAgICBDYW1lcmFNZXRhZGF0YSBwaHlzaWNhbE1ldGFkYXRhOworICAgICAgICBpZiAoKHJlcyA9IHBoeXNpY2FsTWV0YWRhdGEucmVhZEZyb21QYXJjZWwocGFyY2VsKSkgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgbWV0YWRhdGEgZnJvbSBwYXJjZWw6ICVkIiwgX19GVU5DVElPTl9fLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorCisgICAgICAgIG1QaHlzaWNhbE1ldGFkYXRhcy5lbXBsYWNlKG1QaHlzaWNhbE1ldGFkYXRhcy5lbmQoKSwgY2FtZXJhSWQsIHBoeXNpY2FsTWV0YWRhdGEpOworICAgIH0KKyAgICBBTE9HVigiJXM6IFJlYWQgcGh5c2ljYWwgbWV0YWRhdGEgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworCiAgICAgcmVzID0gbVJlc3VsdEV4dHJhcy5yZWFkRnJvbVBhcmNlbChwYXJjZWwpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCByZXN1bHQgZXh0cmFzIGZyb20gcGFyY2VsLiIsCkBAIC0xMTgsNiArMTgxLDI3IEBACiAgICAgfQogICAgIEFMT0dWKCIlczogV3JvdGUgbWV0YWRhdGEgdG8gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKIAorICAgIGludDMyX3QgcGh5c2ljYWxNZXRhZGF0YUNvdW50ID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4obVBoeXNpY2FsTWV0YWRhdGFzLnNpemUoKSk7CisgICAgcmVzID0gcGFyY2VsLT53cml0ZUludDMyKHBoeXNpY2FsTWV0YWRhdGFDb3VudCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSBwaHlzaWNhbCBtZXRhZGF0YSBjb3VudCB0byBwYXJjZWw6ICVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlcyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGZvciAoY29uc3QgYXV0byYgcGh5c2ljYWxNZXRhZGF0YSA6IG1QaHlzaWNhbE1ldGFkYXRhcykgeworICAgICAgICBpZiAoKHJlcyA9IHBhcmNlbC0+d3JpdGVTdHJpbmcxNihwaHlzaWNhbE1ldGFkYXRhLm1QaHlzaWNhbENhbWVyYUlkKSkgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHdyaXRlIHBoeXNpY2FsIGNhbWVyYSBJRCB0byBwYXJjZWw6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHJlcyA9IHBoeXNpY2FsTWV0YWRhdGEubVBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEud3JpdGVUb1BhcmNlbChwYXJjZWwpKSAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gd3JpdGUgcGh5c2ljYWwgY2FtZXJhIG1ldGFkYXRhIHRvIHBhcmNlbDogJWQiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCIlczogV3JvdGUgcGh5c2ljYWwgY2FtZXJhIG1ldGFkYXRhIHRvIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisKICAgICByZXMgPSBtUmVzdWx0RXh0cmFzLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHdyaXRlIHJlc3VsdCBleHRyYXMgdG8gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKZGlmZiAtLWdpdCBhL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2VQcm94eS5haWRsIGIvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZVByb3h5LmFpZGwKaW5kZXggNWRjMjNlYi4uNzU3NTk0OCAxMDA2NDQKLS0tIGEvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZVByb3h5LmFpZGwKKysrIGIvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZVByb3h5LmFpZGwKQEAgLTQ2LDggKzQ2LDE0IEBACiAgICAgY29uc3QgaW50IENBTUVSQV9GQUNJTkdfRVhURVJOQUwgPSAyOwogCiAgICAgLyoqCisgICAgICogVmFsdWVzIGZvciBub3RpZnlDYW1lcmFTdGF0ZSBhcGkgbGV2ZWwKKyAgICAgKi8KKyAgICAgY29uc3QgaW50IENBTUVSQV9BUElfTEVWRUxfMSA9IDE7CisgICAgIGNvbnN0IGludCBDQU1FUkFfQVBJX0xFVkVMXzIgPSAyOworCisgICAgLyoqCiAgICAgICogVXBkYXRlIHRoZSBzdGF0dXMgb2YgYSBjYW1lcmEgZGV2aWNlLgogICAgICAqLwogICAgIG9uZXdheSB2b2lkIG5vdGlmeUNhbWVyYVN0YXRlKFN0cmluZyBjYW1lcmFJZCwgaW50IGZhY2luZywgaW50IG5ld0NhbWVyYVN0YXRlLAotICAgICAgICAgICAgU3RyaW5nIGNsaWVudE5hbWUpOworICAgICAgICAgICAgU3RyaW5nIGNsaWVudE5hbWUsIGludCBhcGlMZXZlbCk7CiB9CmRpZmYgLS1naXQgYS9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5haWRsIGIvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuYWlkbAppbmRleCAyODI1MmMwLi41OGIxOWEzIDEwMDY0NAotLS0gYS9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5haWRsCisrKyBiL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmFpZGwKQEAgLTE4LDYgKzE4LDcgQEAKIAogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5pbXBsLkNhbWVyYU1ldGFkYXRhTmF0aXZlOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5pbXBsLkNhcHR1cmVSZXN1bHRFeHRyYXM7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLmltcGwuUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbzsKIAogLyoqIEBoaWRlICovCiBpbnRlcmZhY2UgSUNhbWVyYURldmljZUNhbGxiYWNrcwpAQCAtMzAsMTIgKzMxLDE0IEBACiAgICAgY29uc3QgaW50IEVSUk9SX0NBTUVSQV9SRVFVRVNUID0gMzsKICAgICBjb25zdCBpbnQgRVJST1JfQ0FNRVJBX1JFU1VMVCA9IDQ7CiAgICAgY29uc3QgaW50IEVSUk9SX0NBTUVSQV9CVUZGRVIgPSA1OworICAgIGNvbnN0IGludCBFUlJPUl9DQU1FUkFfRElTQUJMRUQgPSA2OwogCiAgICAgb25ld2F5IHZvaWQgb25EZXZpY2VFcnJvcihpbnQgZXJyb3JDb2RlLCBpbiBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdEV4dHJhcyk7CiAgICAgb25ld2F5IHZvaWQgb25EZXZpY2VJZGxlKCk7CiAgICAgb25ld2F5IHZvaWQgb25DYXB0dXJlU3RhcnRlZChpbiBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdEV4dHJhcywgbG9uZyB0aW1lc3RhbXApOwogICAgIG9uZXdheSB2b2lkIG9uUmVzdWx0UmVjZWl2ZWQoaW4gQ2FtZXJhTWV0YWRhdGFOYXRpdmUgcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gQ2FwdHVyZVJlc3VsdEV4dHJhcyByZXN1bHRFeHRyYXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gQ2FwdHVyZVJlc3VsdEV4dHJhcyByZXN1bHRFeHRyYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvW10gcGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MpOwogICAgIG9uZXdheSB2b2lkIG9uUHJlcGFyZWQoaW50IHN0cmVhbUlkKTsKIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmFpZGwgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuYWlkbAppbmRleCAwNzcxZmM4Li40Y2VkMDhjIDEwMDY0NAotLS0gYS9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuYWlkbAorKysgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuYWlkbApAQCAtNzksOCArNzksOSBAQAogICAgICAqIDxwPgogICAgICAqIEBwYXJhbSBvcGVyYXRpbmdNb2RlIFRoZSBraW5kIG9mIHNlc3Npb24gdG8gY3JlYXRlOyBlaXRoZXIgTk9STUFMX01PREUgb3IKICAgICAgKiAgICAgQ09OU1RSQUlORURfSElHSF9TUEVFRF9NT0RFLiBNdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIHZhbHVlLgorICAgICAqIEBwYXJhbSBzZXNzaW9uUGFyYW1zIFNlc3Npb24gd2lkZSBjYW1lcmEgcGFyYW1ldGVycwogICAgICAqLwotICAgIHZvaWQgZW5kQ29uZmlndXJlKGludCBvcGVyYXRpbmdNb2RlKTsKKyAgICB2b2lkIGVuZENvbmZpZ3VyZShpbnQgb3BlcmF0aW5nTW9kZSwgaW4gQ2FtZXJhTWV0YWRhdGFOYXRpdmUgc2Vzc2lvblBhcmFtcyk7CiAKICAgICB2b2lkIGRlbGV0ZVN0cmVhbShpbnQgc3RyZWFtSWQpOwogCkBAIC0xNDAsNSArMTQxLDcgQEAKIAogICAgIHZvaWQgcHJlcGFyZTIoaW50IG1heENvdW50LCBpbnQgc3RyZWFtSWQpOwogCisgICAgdm9pZCB1cGRhdGVPdXRwdXRDb25maWd1cmF0aW9uKGludCBzdHJlYW1JZCwgaW4gT3V0cHV0Q29uZmlndXJhdGlvbiBvdXRwdXRDb25maWd1cmF0aW9uKTsKKwogICAgIHZvaWQgZmluYWxpemVPdXRwdXRDb25maWd1cmF0aW9ucyhpbnQgc3RyZWFtSWQsIGluIE91dHB1dENvbmZpZ3VyYXRpb24gb3V0cHV0Q29uZmlndXJhdGlvbik7CiB9CmRpZmYgLS1naXQgYS9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvaW1wbC9QaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvLmFpZGwgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvaW1wbC9QaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhkOWI3YgotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9pbXBsL1BoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8uYWlkbApAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuaW1wbDsKKworLyoqIEBoaWRlICovCitwYXJjZWxhYmxlIFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8gY3BwX2hlYWRlciAiY2FtZXJhL0NhcHR1cmVSZXN1bHQuaCI7CmRpZmYgLS1naXQgYS9jYW1lcmEvY2FtZXJhMi9DYXB0dXJlUmVxdWVzdC5jcHAgYi9jYW1lcmEvY2FtZXJhMi9DYXB0dXJlUmVxdWVzdC5jcHAKaW5kZXggMDU5Nzk1MC4uMTg0M2VjNCAxMDA2NDQKLS0tIGEvY2FtZXJhL2NhbWVyYTIvQ2FwdHVyZVJlcXVlc3QuY3BwCisrKyBiL2NhbWVyYS9jYW1lcmEyL0NhcHR1cmVSZXF1ZXN0LmNwcApAQCAtMTgsNiArMTgsNyBAQAogLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhUmVxdWVzdCIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgogCiAjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvQ2FwdHVyZVJlcXVlc3QuaD4KIApAQCAtNDIsMTYgKzQzLDQ2IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgbU1ldGFkYXRhLmNsZWFyKCk7CiAgICAgbVN1cmZhY2VMaXN0LmNsZWFyKCk7CisgICAgbVN0cmVhbUlkeExpc3QuY2xlYXIoKTsKKyAgICBtU3VyZmFjZUlkeExpc3QuY2xlYXIoKTsKKyAgICBtUGh5c2ljYWxDYW1lcmFTZXR0aW5ncy5jbGVhcigpOwogCiAgICAgc3RhdHVzX3QgZXJyID0gT0s7CiAKLSAgICBpZiAoKGVyciA9IG1NZXRhZGF0YS5yZWFkRnJvbVBhcmNlbChwYXJjZWwpKSAhPSBPSykgewotICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIG1ldGFkYXRhIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICBpbnQzMl90IHNldHRpbmdzQ291bnQ7CisgICAgaWYgKChlcnIgPSBwYXJjZWwtPnJlYWRJbnQzMigmc2V0dGluZ3NDb3VudCkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgdGhlIHNldHRpbmdzIGNvdW50IGZyb20gcGFyY2VsOiAlZCIsIF9fRlVOQ1RJT05fXywgZXJyKTsKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9Ci0gICAgQUxPR1YoIiVzOiBSZWFkIG1ldGFkYXRhIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKworICAgIGlmIChzZXR0aW5nc0NvdW50IDw9IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBTZXR0aW5ncyBjb3VudCAlZCBzaG91bGQgYWx3YXlzIGJlIHBvc2l0aXZlISIsIF9fRlVOQ1RJT05fXywgc2V0dGluZ3NDb3VudCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgc2V0dGluZ3NDb3VudDsgaSsrKSB7CisgICAgICAgIFN0cmluZzE2IGlkOworICAgICAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZFN0cmluZzE2KCZpZCkpICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIGNhbWVyYSBpZCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIENhbWVyYU1ldGFkYXRhIHNldHRpbmdzOworICAgICAgICBpZiAoKGVyciA9IHNldHRpbmdzLnJlYWRGcm9tUGFyY2VsKHBhcmNlbCkpICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIG1ldGFkYXRhIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIiVzOiBSZWFkIG1ldGFkYXRhIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgbVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MucHVzaF9iYWNrKHtzdGQ6OnN0cmluZyhTdHJpbmc4KGlkKS5zdHJpbmcoKSksIHNldHRpbmdzfSk7CisgICAgfQorCisgICAgaW50IGlzUmVwcm9jZXNzID0gMDsKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEludDMyKCZpc1JlcHJvY2VzcykpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgcmVwcm9jZXNzaW5nIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgbUlzUmVwcm9jZXNzID0gKGlzUmVwcm9jZXNzICE9IDApOwogCiAgICAgaW50MzJfdCBzaXplOwogICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkSW50MzIoJnNpemUpKSAhPSBPSykgewpAQCAtNjEsNyArOTIsNyBAQAogICAgIEFMT0dWKCIlczogUmVhZCBzdXJmYWNlIGxpc3Qgc2l6ZSA9ICVkIiwgX19GVU5DVElPTl9fLCBzaXplKTsKIAogICAgIC8vIERvIG5vdCBkaXN0aW5ndWlzaCBudWxsIGFycmF5cyBmcm9tIDAtc2l6ZWQgYXJyYXlzLgotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CiAgICAgICAgIC8vIFBhcmNlbC53cml0ZVBhcmNlbGFibGVBcnJheQogICAgICAgICBzaXplX3QgbGVuOwogICAgICAgICBjb25zdCBjaGFyMTZfdCogY2xhc3NOYW1lID0gcGFyY2VsLT5yZWFkU3RyaW5nMTZJbnBsYWNlKCZsZW4pOwpAQCAtODgsMTIgKzExOSwzMiBAQAogICAgICAgICBtU3VyZmFjZUxpc3QucHVzaF9iYWNrKHN1cmZhY2UpOwogICAgIH0KIAotICAgIGludCBpc1JlcHJvY2VzcyA9IDA7Ci0gICAgaWYgKChlcnIgPSBwYXJjZWwtPnJlYWRJbnQzMigmaXNSZXByb2Nlc3MpKSAhPSBPSykgewotICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIHJlcHJvY2Vzc2luZyBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgaW50MzJfdCBzdHJlYW1TdXJmYWNlU2l6ZTsKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEludDMyKCZzdHJlYW1TdXJmYWNlU2l6ZSkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgc3RyZWFtU3VyZmFjZVNpemUgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KLSAgICBtSXNSZXByb2Nlc3MgPSAoaXNSZXByb2Nlc3MgIT0gMCk7CisKKyAgICBpZiAoc3RyZWFtU3VyZmFjZVNpemUgPCAwKSB7CisgICAgICAgIEFMT0dFKCIlczogQmFkIHN0cmVhbVN1cmZhY2VTaXplICVkIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fLCBzdHJlYW1TdXJmYWNlU2l6ZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgc3RyZWFtU3VyZmFjZVNpemU7ICsraSkgeworICAgICAgICBpbnQgc3RyZWFtSWR4OworICAgICAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEludDMyKCZzdHJlYW1JZHgpKSAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCBzdHJlYW0gaW5kZXggZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBtU3RyZWFtSWR4TGlzdC5wdXNoX2JhY2soc3RyZWFtSWR4KTsKKworICAgICAgICBpbnQgc3VyZmFjZUlkeDsKKyAgICAgICAgaWYgKChlcnIgPSBwYXJjZWwtPnJlYWRJbnQzMigmc3VyZmFjZUlkeCkpICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIHN1cmZhY2UgaW5kZXggZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBtU3VyZmFjZUlkeExpc3QucHVzaF9iYWNrKHN1cmZhY2VJZHgpOworICAgIH0KIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTEwNiwzMiArMTU3LDYyIEBACiAKICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKIAotICAgIGlmICgoZXJyID0gbU1ldGFkYXRhLndyaXRlVG9QYXJjZWwocGFyY2VsKSkgIT0gT0spIHsKKyAgICBpbnQzMl90IHNldHRpbmdzQ291bnQgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihtUGh5c2ljYWxDYW1lcmFTZXR0aW5ncy5zaXplKCkpOworCisgICAgaWYgKChlcnIgPSBwYXJjZWwtPndyaXRlSW50MzIoc2V0dGluZ3NDb3VudCkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHdyaXRlIHNldHRpbmdzIGNvdW50ISIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCi0gICAgaW50MzJfdCBzaXplID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4obVN1cmZhY2VMaXN0LnNpemUoKSk7CisgICAgZm9yIChjb25zdCBhdXRvICZpdCA6IG1QaHlzaWNhbENhbWVyYVNldHRpbmdzKSB7CisgICAgICAgIGlmICgoZXJyID0gcGFyY2VsLT53cml0ZVN0cmluZzE2KFN0cmluZzE2KGl0LmlkLmNfc3RyKCkpKSkgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGNhbWVyYSBpZCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQogCi0gICAgLy8gU2VuZCAwLXNpemVkIGFycmF5cyB3aGVuIGl0J3MgZW1wdHkuIERvIG5vdCBzZW5kIG51bGwgYXJyYXlzLgotICAgIHBhcmNlbC0+d3JpdGVJbnQzMihzaXplKTsKLQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgewotICAgICAgICAvLyBub3Qgc3VyZSBpZiByZWFkUGFyY2VsYWJsZUFycmF5IGRvZXMgdGhpcywgaGFyZCB0byB0ZWxsIGZyb20gc291cmNlCi0gICAgICAgIHBhcmNlbC0+d3JpdGVTdHJpbmcxNihTdHJpbmcxNigiYW5kcm9pZC52aWV3LlN1cmZhY2UiKSk7Ci0KLSAgICAgICAgLy8gU3VyZmFjZS53cml0ZVRvUGFyY2VsCi0gICAgICAgIHZpZXc6OlN1cmZhY2Ugc3VyZmFjZVNoaW07Ci0gICAgICAgIHN1cmZhY2VTaGltLm5hbWUgPSBTdHJpbmcxNigidW5rbm93bl9uYW1lIik7Ci0gICAgICAgIHN1cmZhY2VTaGltLmdyYXBoaWNCdWZmZXJQcm9kdWNlciA9IG1TdXJmYWNlTGlzdFtpXS0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpOwotICAgICAgICBpZiAoKGVyciA9IHN1cmZhY2VTaGltLndyaXRlVG9QYXJjZWwocGFyY2VsKSkgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHdyaXRlIG91dHB1dCB0YXJnZXQgU3VyZmFjZSAlZCB0byBwYXJjZWw6ICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGksIHN0cmVycm9yKC1lcnIpLCBlcnIpOworICAgICAgICBpZiAoKGVyciA9IGl0LnNldHRpbmdzLndyaXRlVG9QYXJjZWwocGFyY2VsKSkgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHdyaXRlIHNldHRpbmdzISIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcGFyY2VsLT53cml0ZUludDMyKG1Jc1JlcHJvY2VzcyA/IDEgOiAwKTsKIAorICAgIGlmIChtU3VyZmFjZUNvbnZlcnRlZCkgeworICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIoMCk7IC8vIDAtc2l6ZWQgYXJyYXkKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQzMl90IHNpemUgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihtU3VyZmFjZUxpc3Quc2l6ZSgpKTsKKworICAgICAgICAvLyBTZW5kIDAtc2l6ZWQgYXJyYXlzIHdoZW4gaXQncyBlbXB0eS4gRG8gbm90IHNlbmQgbnVsbCBhcnJheXMuCisgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihzaXplKTsKKworICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgICAgIC8vIG5vdCBzdXJlIGlmIHJlYWRQYXJjZWxhYmxlQXJyYXkgZG9lcyB0aGlzLCBoYXJkIHRvIHRlbGwgZnJvbSBzb3VyY2UKKyAgICAgICAgICAgIHBhcmNlbC0+d3JpdGVTdHJpbmcxNihTdHJpbmcxNigiYW5kcm9pZC52aWV3LlN1cmZhY2UiKSk7CisKKyAgICAgICAgICAgIC8vIFN1cmZhY2Uud3JpdGVUb1BhcmNlbAorICAgICAgICAgICAgdmlldzo6U3VyZmFjZSBzdXJmYWNlU2hpbTsKKyAgICAgICAgICAgIHN1cmZhY2VTaGltLm5hbWUgPSBTdHJpbmcxNigidW5rbm93bl9uYW1lIik7CisgICAgICAgICAgICBzdXJmYWNlU2hpbS5ncmFwaGljQnVmZmVyUHJvZHVjZXIgPSBtU3VyZmFjZUxpc3RbaV0tPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKTsKKyAgICAgICAgICAgIGlmICgoZXJyID0gc3VyZmFjZVNoaW0ud3JpdGVUb1BhcmNlbChwYXJjZWwpKSAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHdyaXRlIG91dHB1dCB0YXJnZXQgU3VyZmFjZSAlZCB0byBwYXJjZWw6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpLCBzdHJlcnJvcigtZXJyKSwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcGFyY2VsLT53cml0ZUludDMyKG1TdHJlYW1JZHhMaXN0LnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU3RyZWFtSWR4TGlzdC5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAoKGVyciA9IHBhcmNlbC0+d3JpdGVJbnQzMihtU3RyZWFtSWR4TGlzdFtpXSkpICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSBzdHJlYW0gaW5kZXggdG8gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChlcnIgPSBwYXJjZWwtPndyaXRlSW50MzIobVN1cmZhY2VJZHhMaXN0W2ldKSkgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHdyaXRlIHN1cmZhY2UgaW5kZXggdG8gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CiAgICAgcmV0dXJuIE9LOwogfQogCmRpZmYgLS1naXQgYS9jYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmNwcCBiL2NhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uY3BwCmluZGV4IDQ2OGExZWIuLmZlYjA0YzIgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uY3BwCisrKyBiL2NhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uY3BwCkBAIC0xLDYgKzEsNiBAQAogLyoKICoqCi0qKiBDb3B5cmlnaHQgMjAxNSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKiogQ29weXJpZ2h0IDIwMTUtMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogKioKICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtNjQsNiArNjQsMTAgQEAKICAgICByZXR1cm4gbUlzU2hhcmVkOwogfQogCitTdHJpbmcxNiBPdXRwdXRDb25maWd1cmF0aW9uOjpnZXRQaHlzaWNhbENhbWVyYUlkKCkgY29uc3QgeworICAgIHJldHVybiBtUGh5c2ljYWxDYW1lcmFJZDsKK30KKwogT3V0cHV0Q29uZmlndXJhdGlvbjo6T3V0cHV0Q29uZmlndXJhdGlvbigpIDoKICAgICAgICAgbVJvdGF0aW9uKElOVkFMSURfUk9UQVRJT04pLAogICAgICAgICBtU3VyZmFjZVNldElEKElOVkFMSURfU0VUX0lEKSwKQEAgLTEzOSw2ICsxNDMsOCBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAorICAgIHBhcmNlbC0+cmVhZFN0cmluZzE2KCZtUGh5c2ljYWxDYW1lcmFJZCk7CisKICAgICBtUm90YXRpb24gPSByb3RhdGlvbjsKICAgICBtU3VyZmFjZVNldElEID0gc2V0SUQ7CiAgICAgbVN1cmZhY2VUeXBlID0gc3VyZmFjZVR5cGU7CkBAIC0xNTMsMTkgKzE1OSwyMCBAQAogICAgICAgICBtR2Jwcy5wdXNoX2JhY2soc3VyZmFjZS5ncmFwaGljQnVmZmVyUHJvZHVjZXIpOwogICAgIH0KIAotICAgIEFMT0dWKCIlczogT3V0cHV0Q29uZmlndXJhdGlvbjogcm90YXRpb24gPSAlZCwgc2V0SWQgPSAlZCwgc3VyZmFjZVR5cGUgPSAlZCIsCi0gICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Sb3RhdGlvbiwgbVN1cmZhY2VTZXRJRCwgbVN1cmZhY2VUeXBlKTsKKyAgICBBTE9HVigiJXM6IE91dHB1dENvbmZpZ3VyYXRpb246IHJvdGF0aW9uID0gJWQsIHNldElkID0gJWQsIHN1cmZhY2VUeXBlID0gJWQsIgorICAgICAgICAgICIgcGh5c2ljYWxDYW1lcmFJZCA9ICVzIiwgX19GVU5DVElPTl9fLCBtUm90YXRpb24sIG1TdXJmYWNlU2V0SUQsCisgICAgICAgICAgbVN1cmZhY2VUeXBlLCBTdHJpbmc4KG1QaHlzaWNhbENhbWVyYUlkKS5zdHJpbmcoKSk7CiAKICAgICByZXR1cm4gZXJyOwogfQogCiBPdXRwdXRDb25maWd1cmF0aW9uOjpPdXRwdXRDb25maWd1cmF0aW9uKHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBnYnAsIGludCByb3RhdGlvbiwKLSAgICAgICAgaW50IHN1cmZhY2VTZXRJRCkgeworICAgICAgICBpbnQgc3VyZmFjZVNldElELCBib29sIGlzU2hhcmVkKSB7CiAgICAgbUdicHMucHVzaF9iYWNrKGdicCk7CiAgICAgbVJvdGF0aW9uID0gcm90YXRpb247CiAgICAgbVN1cmZhY2VTZXRJRCA9IHN1cmZhY2VTZXRJRDsKICAgICBtSXNEZWZlcnJlZCA9IGZhbHNlOwotICAgIG1Jc1NoYXJlZCA9IGZhbHNlOworICAgIG1Jc1NoYXJlZCA9IGlzU2hhcmVkOwogfQogCiBzdGF0dXNfdCBPdXRwdXRDb25maWd1cmF0aW9uOjp3cml0ZVRvUGFyY2VsKGFuZHJvaWQ6OlBhcmNlbCogcGFyY2VsKSBjb25zdCB7CkBAIC0yMDQsNiArMjExLDkgQEAKICAgICBlcnIgPSBwYXJjZWwtPndyaXRlUGFyY2VsYWJsZVZlY3RvcihzdXJmYWNlU2hpbXMpOwogICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CiAKKyAgICBlcnIgPSBwYXJjZWwtPndyaXRlU3RyaW5nMTYobVBoeXNpY2FsQ2FtZXJhSWQpOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKICAgICByZXR1cm4gT0s7CiB9CiAKZGlmZiAtLWdpdCBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYXB0dXJlUmVzdWx0LmggYi9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvQ2FwdHVyZVJlc3VsdC5oCmluZGV4IDkxN2Q5NTMuLjU2ZmExNzggMTAwNjQ0Ci0tLSBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYXB0dXJlUmVzdWx0LmgKKysrIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL0NhcHR1cmVSZXN1bHQuaApAQCAtOTEsMTQgKzkxLDM2IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgICAgICByZWFkRnJvbVBhcmNlbChjb25zdCBhbmRyb2lkOjpQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgICAgICB3cml0ZVRvUGFyY2VsKGFuZHJvaWQ6OlBhcmNlbCogcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKIH07CisKK3N0cnVjdCBQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvIDogcHVibGljIGFuZHJvaWQ6OlBhcmNlbGFibGUgeworCisgICAgUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbygpCisgICAgICAgIDogbVBoeXNpY2FsQ2FtZXJhSWQoKSwKKyAgICAgICAgICBtUGh5c2ljYWxDYW1lcmFNZXRhZGF0YSgpIHsKKyAgICB9CisgICAgUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyhjb25zdCBTdHJpbmcxNiYgY2FtZXJhSWQsCisgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgY2FtZXJhTWV0YWRhdGEpCisgICAgICAgICAgICA6IG1QaHlzaWNhbENhbWVyYUlkKGNhbWVyYUlkKSwKKyAgICAgICAgICAgICAgbVBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEoY2FtZXJhTWV0YWRhdGEpIHsKKyAgICB9CisKKyAgICBTdHJpbmcxNiAgbVBoeXNpY2FsQ2FtZXJhSWQ7CisgICAgQ2FtZXJhTWV0YWRhdGEgbVBoeXNpY2FsQ2FtZXJhTWV0YWRhdGE7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgICAgICAgIHJlYWRGcm9tUGFyY2VsKGNvbnN0IGFuZHJvaWQ6OlBhcmNlbCogcGFyY2VsKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgICAgICAgIHdyaXRlVG9QYXJjZWwoYW5kcm9pZDo6UGFyY2VsKiBwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOworfTsKKwogfSAvLyBuYW1lc3BhY2UgaW1wbAogfSAvLyBuYW1lc3BhY2UgY2FtZXJhMgogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIAogdXNpbmcgaGFyZHdhcmU6OmNhbWVyYTI6OmltcGw6OkNhcHR1cmVSZXN1bHRFeHRyYXM7Cit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhMjo6aW1wbDo6UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbzsKIAogc3RydWN0IENhcHR1cmVSZXN1bHQgOiBwdWJsaWMgdmlydHVhbCBMaWdodFJlZkJhc2U8Q2FwdHVyZVJlc3VsdD4gewogICAgIENhbWVyYU1ldGFkYXRhICAgICAgICAgIG1NZXRhZGF0YTsKKyAgICBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiBtUGh5c2ljYWxNZXRhZGF0YXM7CiAgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcyAgICAgbVJlc3VsdEV4dHJhczsKIAogICAgIENhcHR1cmVSZXN1bHQoKTsKZGlmZiAtLWdpdCBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL0NhcHR1cmVSZXF1ZXN0LmggYi9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9DYXB0dXJlUmVxdWVzdC5oCmluZGV4IDAxODAxODMuLjUwNmFiYWIgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL0NhcHR1cmVSZXF1ZXN0LmgKKysrIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvQ2FwdHVyZVJlcXVlc3QuaApAQCAtNDAsMTQgKzQwLDM1IEBACiAgICAgQ2FwdHVyZVJlcXVlc3QoQ2FwdHVyZVJlcXVlc3QmJiByaHMpIG5vZXhjZXB0OwogICAgIHZpcnR1YWwgfkNhcHR1cmVSZXF1ZXN0KCk7CiAKLSAgICBDYW1lcmFNZXRhZGF0YSAgICAgICAgICBtTWV0YWRhdGE7CisgICAgc3RydWN0IFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MgeworICAgICAgICBzdGQ6OnN0cmluZyBpZDsKKyAgICAgICAgQ2FtZXJhTWV0YWRhdGEgc2V0dGluZ3M7CisgICAgfTsKKyAgICBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhbWVyYVNldHRpbmdzPiBtUGh5c2ljYWxDYW1lcmFTZXR0aW5nczsKKworICAgIC8vIFVzZWQgYnkgTkRLIGNsaWVudCB0byBwYXNzIHN1cmZhY2VzIGJ5IHN0cmVhbS9zdXJmYWNlIGluZGV4LgorICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1TdXJmYWNlQ29udmVydGVkID0gZmFsc2U7CisKKyAgICAvLyBTdGFydGluZyBpbiBBbmRyb2lkIE8sIGNyZWF0ZSBhIFN1cmZhY2UgZnJvbSBQYXJjZWwgd2lsbCB0YWtlIG9uZSBleHRyYQorICAgIC8vIElQQyBjYWxsLgogICAgIFZlY3RvcjxzcDxTdXJmYWNlPiA+ICAgIG1TdXJmYWNlTGlzdDsKKyAgICAvLyBPcHRpb25hbCB3YXkgb2YgcGFzc2luZyBzdXJmYWNlIGxpc3Qgc2luY2UgcGFzc2luZyBTdXJmYWNlIG92ZXIgYmluZGVyCisgICAgLy8gaXMgZXhwZW5zaXZlLiBVc2UgdGhlIHN0cmVhbS9zdXJmYWNlIGluZGV4IGZyb20gY3VycmVudCBvdXRwdXQgY29uZmlndXJhdGlvbgorICAgIC8vIHRvIHJlcHJlc2VudCBhbiBjb25maWd1cmVkIG91dHB1dCBTdXJmYWNlLiBXaGVuIHN0cmVhbS9zdXJmYWNlIGluZGV4IGlzIHVzZWQsCisgICAgLy8gc2V0IG1TdXJmYWNlTGlzdCB0byB6ZXJvIGxlbmd0aCB0byBzYXZlIHVucGFyY2VsIHRpbWUuCisgICAgVmVjdG9yPGludD4gICAgICAgICAgICAgbVN0cmVhbUlkeExpc3Q7CisgICAgVmVjdG9yPGludD4gICAgICAgICAgICAgbVN1cmZhY2VJZHhMaXN0OyAvLyBwZXIgc3RyZWFtIHN1cmZhY2UgbGlzdCBpbmRleAorCiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbUlzUmVwcm9jZXNzOwogCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgbUNvbnRleHQ7IC8vIGFyYml0cmFyeSB1c2VyIGNvbnRleHQgZnJvbSBOREsgYXBwcywgbnVsbCBmb3IgamF2YSBhcHBzCisKICAgICAvKioKICAgICAgKiBLZWVwIGltcGwgdXAtdG8tZGF0ZSB3aXRoIENhcHR1cmVSZXF1ZXN0LmphdmEgaW4gZnJhbWV3b3Jrcy9iYXNlCiAgICAgICovCisgICAgLy8gdXNlZCBieSBjYW1lcmFzZXJ2ZXIgdG8gcmVjZWl2ZSBDYXB0dXJlUmVxdWVzdCBmcm9tIGphdmEvTkRLIGNsaWVudAogICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIHJlYWRGcm9tUGFyY2VsKGNvbnN0IGFuZHJvaWQ6OlBhcmNlbCogcGFyY2VsKSBvdmVycmlkZTsKKyAgICAvLyB1c2VkIGJ5IE5ESyBjbGllbnQgdG8gc2VuZCBDYXB0dXJlUmVxdWVzdCB0byBjYW1lcmFzZXJ2ZXIKICAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICB3cml0ZVRvUGFyY2VsKGFuZHJvaWQ6OlBhcmNlbCogcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKIH07CiAKZGlmZiAtLWdpdCBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaCBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaAppbmRleCA4ZTY0MWM3Li5hODBmNDRiIDEwMDY0NAotLS0gYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmgKKysrIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC00Niw2ICs0Niw3IEBACiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SGVpZ2h0KCkgY29uc3Q7CiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgaXNEZWZlcnJlZCgpIGNvbnN0OwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgIGlzU2hhcmVkKCkgY29uc3Q7CisgICAgU3RyaW5nMTYgICAgICAgICAgICAgICAgICAgZ2V0UGh5c2ljYWxDYW1lcmFJZCgpIGNvbnN0OwogICAgIC8qKgogICAgICAqIEtlZXAgaW1wbCB1cC10by1kYXRlIHdpdGggT3V0cHV0Q29uZmlndXJhdGlvbi5qYXZhIGluIGZyYW1ld29ya3MvYmFzZQogICAgICAqLwpAQCAtNjQsNyArNjUsNyBAQAogICAgIE91dHB1dENvbmZpZ3VyYXRpb24oY29uc3QgYW5kcm9pZDo6UGFyY2VsJiBwYXJjZWwpOwogCiAgICAgT3V0cHV0Q29uZmlndXJhdGlvbihzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgZ2JwLCBpbnQgcm90YXRpb24sCi0gICAgICAgICAgICBpbnQgc3VyZmFjZVNldElEID0gSU5WQUxJRF9TRVRfSUQpOworICAgICAgICAgICAgaW50IHN1cmZhY2VTZXRJRCA9IElOVkFMSURfU0VUX0lELCBib29sIGlzU2hhcmVkID0gZmFsc2UpOwogCiAgICAgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgT3V0cHV0Q29uZmlndXJhdGlvbiYgb3RoZXIpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuICggbVJvdGF0aW9uID09IG90aGVyLm1Sb3RhdGlvbiAmJgpAQCAtNzQsNyArNzUsOCBAQAogICAgICAgICAgICAgICAgIG1IZWlnaHQgPT0gb3RoZXIubUhlaWdodCAmJgogICAgICAgICAgICAgICAgIG1Jc0RlZmVycmVkID09IG90aGVyLm1Jc0RlZmVycmVkICYmCiAgICAgICAgICAgICAgICAgbUlzU2hhcmVkID09IG90aGVyLm1Jc1NoYXJlZCAmJgotICAgICAgICAgICAgICAgIGdicHNFcXVhbChvdGhlcikpOworICAgICAgICAgICAgICAgIGdicHNFcXVhbChvdGhlcikgJiYKKyAgICAgICAgICAgICAgICBtUGh5c2ljYWxDYW1lcmFJZCA9PSBvdGhlci5tUGh5c2ljYWxDYW1lcmFJZCApOwogICAgIH0KICAgICBib29sIG9wZXJhdG9yICE9IChjb25zdCBPdXRwdXRDb25maWd1cmF0aW9uJiBvdGhlcikgY29uc3QgewogICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CkBAIC0xMDIsNiArMTA0LDkgQEAKICAgICAgICAgaWYgKG1Jc1NoYXJlZCAhPSBvdGhlci5tSXNTaGFyZWQpIHsKICAgICAgICAgICAgIHJldHVybiBtSXNTaGFyZWQgPCBvdGhlci5tSXNTaGFyZWQ7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKG1QaHlzaWNhbENhbWVyYUlkICE9IG90aGVyLm1QaHlzaWNhbENhbWVyYUlkKSB7CisgICAgICAgICAgICByZXR1cm4gbVBoeXNpY2FsQ2FtZXJhSWQgPCBvdGhlci5tUGh5c2ljYWxDYW1lcmFJZDsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gZ2Jwc0xlc3NUaGFuKG90aGVyKTsKICAgICB9CiAgICAgYm9vbCBvcGVyYXRvciA+IChjb25zdCBPdXRwdXRDb25maWd1cmF0aW9uJiBvdGhlcikgY29uc3QgewpAQCAtMTEwLDYgKzExNSw3IEBACiAKICAgICBib29sIGdicHNFcXVhbChjb25zdCBPdXRwdXRDb25maWd1cmF0aW9uJiBvdGhlcikgY29uc3Q7CiAgICAgYm9vbCBnYnBzTGVzc1RoYW4oY29uc3QgT3V0cHV0Q29uZmlndXJhdGlvbiYgb3RoZXIpIGNvbnN0OworICAgIHZvaWQgYWRkR3JhcGhpY1Byb2R1Y2VyKHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGdicCkge21HYnBzLnB1c2hfYmFjayhnYnApO30KIHByaXZhdGU6CiAgICAgc3RkOjp2ZWN0b3I8c3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4+IG1HYnBzOwogICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIG1Sb3RhdGlvbjsKQEAgLTExOSw4ICsxMjUsNyBAQAogICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIG1IZWlnaHQ7CiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgbUlzRGVmZXJyZWQ7CiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgbUlzU2hhcmVkOwotICAgIC8vIGhlbHBlciBmdW5jdGlvbgotICAgIHN0YXRpYyBTdHJpbmcxNiByZWFkTWF5YmVFbXB0eVN0cmluZzE2KGNvbnN0IGFuZHJvaWQ6OlBhcmNlbCogcGFyY2VsKTsKKyAgICBTdHJpbmcxNiAgICAgICAgICAgICAgICAgICBtUGh5c2ljYWxDYW1lcmFJZDsKIH07CiB9IC8vIG5hbWVzcGFjZSBwYXJhbXMKIH0gLy8gbmFtZXNwYWNlIGNhbWVyYTIKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwIGIvY2FtZXJhL25kay9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAKaW5kZXggMmE2YjE4Mi4uZmQ5NTI5NiAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAKKysrIGIvY2FtZXJhL25kay9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAKQEAgLTEzNSwzICsxMzUsMTkgQEAKICAgICB9CiAgICAgcmV0dXJuIHNlc3Npb24tPmFib3J0Q2FwdHVyZXMoKTsKIH0KKworRVhQT1JUCitjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3VwZGF0ZVNoYXJlZE91dHB1dChBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24sCisgICAgICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dCogb3V0cHV0KSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBpZiAoc2Vzc2lvbiA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IHNlc3Npb24gaXMgbnVsbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIGlmIChzZXNzaW9uLT5pc0Nsb3NlZCgpKSB7CisgICAgICAgIEFMT0dFKCIlczogc2Vzc2lvbiAlcCBpcyBhbHJlYWR5IGNsb3NlZCIsIF9fRlVOQ1RJT05fXywgc2Vzc2lvbik7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1NFU1NJT05fQ0xPU0VEOworICAgIH0KKyAgICByZXR1cm4gc2Vzc2lvbi0+dXBkYXRlT3V0cHV0Q29uZmlndXJhdGlvbihvdXRwdXQpOworfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9OZGtDYW1lcmFEZXZpY2UuY3BwIGIvY2FtZXJhL25kay9OZGtDYW1lcmFEZXZpY2UuY3BwCmluZGV4IDlmNmQxZjcuLjgxMmEzMTIgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvTmRrQ2FtZXJhRGV2aWNlLmNwcAorKysgYi9jYW1lcmEvbmRrL05ka0NhbWVyYURldmljZS5jcHAKQEAgLTEwMywxMSArMTAzLDc0IEBACiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB3aW5kb3csIG91dCk7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOwogICAgIH0KLSAgICAqb3V0ID0gbmV3IEFDYXB0dXJlU2Vzc2lvbk91dHB1dCh3aW5kb3cpOworICAgICpvdXQgPSBuZXcgQUNhcHR1cmVTZXNzaW9uT3V0cHV0KHdpbmRvdywgZmFsc2UpOwogICAgIHJldHVybiBBQ0FNRVJBX09LOwogfQogCiBFWFBPUlQKK2NhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfY3JlYXRlKAorICAgICAgICBBTmF0aXZlV2luZG93KiB3aW5kb3csIC8qb3V0Ki9BQ2FwdHVyZVNlc3Npb25PdXRwdXQqKiBvdXQpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGlmICh3aW5kb3cgPT0gbnVsbHB0ciB8fCBvdXQgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBiYWQgYXJndW1lbnQuIHdpbmRvdyAlcCwgb3V0ICVwIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHdpbmRvdywgb3V0KTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorICAgICpvdXQgPSBuZXcgQUNhcHR1cmVTZXNzaW9uT3V0cHV0KHdpbmRvdywgdHJ1ZSk7CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK0VYUE9SVAorY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9hZGQoQUNhcHR1cmVTZXNzaW9uT3V0cHV0ICpvdXQsCisgICAgICAgIEFOYXRpdmVXaW5kb3cqIHdpbmRvdykgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaWYgKCh3aW5kb3cgPT0gbnVsbHB0cikgfHwgKG91dCA9PSBudWxscHRyKSkgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBiYWQgYXJndW1lbnQuIHdpbmRvdyAlcCwgb3V0ICVwIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHdpbmRvdywgb3V0KTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorICAgIGlmICghb3V0LT5tSXNTaGFyZWQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvciB0cnlpbmcgdG8gaW5zZXJ0IGEgbmV3IHdpbmRvdyBpbiBub24tc2hhcmVkIG91dHB1dCBjb25maWd1cmF0aW9uIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgaWYgKG91dC0+bVdpbmRvdyA9PSB3aW5kb3cpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvciB0cnlpbmcgdG8gYWRkIHRoZSBzYW1lIHdpbmRvdyBhc3NvY2lhdGVkIHdpdGggdGhlIG91dHB1dCBjb25maWd1cmF0aW9uIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBhdXRvIGluc2VydCA9IG91dC0+bVNoYXJlZFdpbmRvd3MuaW5zZXJ0KHdpbmRvdyk7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IChpbnNlcnQuc2Vjb25kKSA/IEFDQU1FUkFfT0sgOiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIHJldHVybiByZXQ7Cit9CisKK0VYUE9SVAorY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9yZW1vdmUoQUNhcHR1cmVTZXNzaW9uT3V0cHV0ICpvdXQsCisgICAgICAgIEFOYXRpdmVXaW5kb3cqIHdpbmRvdykgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaWYgKCh3aW5kb3cgPT0gbnVsbHB0cikgfHwgKG91dCA9PSBudWxscHRyKSkgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBiYWQgYXJndW1lbnQuIHdpbmRvdyAlcCwgb3V0ICVwIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHdpbmRvdywgb3V0KTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorICAgIGlmICghb3V0LT5tSXNTaGFyZWQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvciB0cnlpbmcgdG8gcmVtb3ZlIGEgIHdpbmRvdyBpbiBub24tc2hhcmVkIG91dHB1dCBjb25maWd1cmF0aW9uIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgaWYgKG91dC0+bVdpbmRvdyA9PSB3aW5kb3cpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvciB0cnlpbmcgdG8gcmVtb3ZlIHRoZSBzYW1lIHdpbmRvdyBhc3NvY2lhdGVkIHdpdGggdGhlIG91dHB1dCBjb25maWd1cmF0aW9uIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBhdXRvIHJlbW92ZSA9IG91dC0+bVNoYXJlZFdpbmRvd3MuZXJhc2Uod2luZG93KTsKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gKHJlbW92ZSkgPyBBQ0FNRVJBX09LIDogQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICByZXR1cm4gcmV0OworfQorCitFWFBPUlQKIHZvaWQgQUNhcHR1cmVTZXNzaW9uT3V0cHV0X2ZyZWUoQUNhcHR1cmVTZXNzaW9uT3V0cHV0KiBvdXRwdXQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIGlmIChvdXRwdXQgIT0gbnVsbHB0cikgewpAQCAtMTU3LDUgKzIyMCwyMSBAQAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGV2aWNlLCBvdXRwdXRzLCBjYWxsYmFja3MsIHNlc3Npb24pOwogICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKICAgICB9Ci0gICAgcmV0dXJuIGRldmljZS0+Y3JlYXRlQ2FwdHVyZVNlc3Npb24ob3V0cHV0cywgY2FsbGJhY2tzLCBzZXNzaW9uKTsKKyAgICByZXR1cm4gZGV2aWNlLT5jcmVhdGVDYXB0dXJlU2Vzc2lvbihvdXRwdXRzLCBudWxscHRyLCBjYWxsYmFja3MsIHNlc3Npb24pOworfQorCitFWFBPUlQKK2NhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVTZXNzaW9uV2l0aFNlc3Npb25QYXJhbWV0ZXJzKAorICAgICAgICBBQ2FtZXJhRGV2aWNlKiBkZXZpY2UsCisgICAgICAgIGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lciogICAgICAgb3V0cHV0cywKKyAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiBzZXNzaW9uUGFyYW1ldGVycywKKyAgICAgICAgY29uc3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3N0YXRlQ2FsbGJhY2tzKiBjYWxsYmFja3MsCisgICAgICAgIC8qb3V0Ki9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24qKiBzZXNzaW9uKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBpZiAoZGV2aWNlID09IG51bGxwdHIgfHwgb3V0cHV0cyA9PSBudWxscHRyIHx8IGNhbGxiYWNrcyA9PSBudWxscHRyIHx8IHNlc3Npb24gPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBpbnZhbGlkIGlucHV0OiBkZXZpY2UgJXAsIG91dHB1dHMgJXAsIGNhbGxiYWNrcyAlcCwgc2Vzc2lvbiAlcCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkZXZpY2UsIG91dHB1dHMsIGNhbGxiYWNrcywgc2Vzc2lvbik7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICByZXR1cm4gZGV2aWNlLT5jcmVhdGVDYXB0dXJlU2Vzc2lvbihvdXRwdXRzLCBzZXNzaW9uUGFyYW1ldGVycywgY2FsbGJhY2tzLCBzZXNzaW9uKTsKIH0KZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvTmRrQ2FwdHVyZVJlcXVlc3QuY3BwIGIvY2FtZXJhL25kay9OZGtDYXB0dXJlUmVxdWVzdC5jcHAKaW5kZXggNWI0YzE4MC4uYWMxODU2YiAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9OZGtDYXB0dXJlUmVxdWVzdC5jcHAKKysrIGIvY2FtZXJhL25kay9OZGtDYXB0dXJlUmVxdWVzdC5jcHAKQEAgLTE0MiwzICsxNDIsNDAgQEAKICAgICBkZWxldGUgcmVxdWVzdDsKICAgICByZXR1cm47CiB9CisKK0VYUE9SVAorY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlUmVxdWVzdF9zZXRVc2VyQ29udGV4dCgKKyAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCB2b2lkKiBjb250ZXh0KSB7CisgICAgaWYgKHJlcXVlc3QgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IGludmFsaWQgYXJndW1lbnQhIHJlcXVlc3QgaXMgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICByZXR1cm4gcmVxdWVzdC0+c2V0Q29udGV4dChjb250ZXh0KTsKK30KKworRVhQT1JUCitjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVSZXF1ZXN0X2dldFVzZXJDb250ZXh0KAorICAgICAgICBjb25zdCBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIC8qb3V0Ki92b2lkKiogY29udGV4dCkgeworICAgIGlmIChyZXF1ZXN0ID09IG51bGxwdHIgfHwgY29udGV4dCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCBhcmd1bWVudCEgcmVxdWVzdCAlcCwgY29udGV4dCAlcCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXF1ZXN0LCBjb250ZXh0KTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorICAgIHJldHVybiByZXF1ZXN0LT5nZXRDb250ZXh0KGNvbnRleHQpOworfQorCitFWFBPUlQKK0FDYXB0dXJlUmVxdWVzdCogQUNhcHR1cmVSZXF1ZXN0X2NvcHkoY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiBzcmMpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGlmIChzcmMgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IHNyYyBpcyBudWxsISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIEFDYXB0dXJlUmVxdWVzdCogcFJlcXVlc3QgPSBuZXcgQUNhcHR1cmVSZXF1ZXN0KCk7CisgICAgcFJlcXVlc3QtPnNldHRpbmdzID0gbmV3IEFDYW1lcmFNZXRhZGF0YSgqKHNyYy0+c2V0dGluZ3MpKTsKKyAgICBwUmVxdWVzdC0+dGFyZ2V0cyAgPSBuZXcgQUNhbWVyYU91dHB1dFRhcmdldHMoKTsKKyAgICAqKHBSZXF1ZXN0LT50YXJnZXRzKSAgPSAqKHNyYy0+dGFyZ2V0cyk7CisgICAgcFJlcXVlc3QtPmNvbnRleHQgPSBzcmMtPmNvbnRleHQ7CisgICAgcmV0dXJuIHBSZXF1ZXN0OworfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmNwcAppbmRleCBiOWMxNTlkLi5mNjBlNWZkIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmNwcAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmNwcApAQCAtMTQ4LDYgKzE0OCwyMyBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKK2NhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb246OnVwZGF0ZU91dHB1dENvbmZpZ3VyYXRpb24oQUNhcHR1cmVTZXNzaW9uT3V0cHV0ICpvdXRwdXQpIHsKKyAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CisgICAgaWYgKGRldiA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJFcnJvcjogRGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBzZXNzaW9uICVwIGhhcyBiZWVuIGNsb3NlZCEiLCB0aGlzKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfU0VTU0lPTl9DTE9TRUQ7CisgICAgfQorCisgICAgY2FtZXJhX3N0YXR1c190IHJldDsKKyAgICBkZXYtPmxvY2tEZXZpY2VGb3JTZXNzaW9uT3BzKCk7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVNlc3Npb25Mb2NrKTsKKyAgICAgICAgcmV0ID0gZGV2LT51cGRhdGVPdXRwdXRDb25maWd1cmF0aW9uTG9ja2VkKG91dHB1dCk7CisgICAgfQorICAgIGRldi0+dW5sb2NrRGV2aWNlKCk7CisgICAgcmV0dXJuIHJldDsKK30KKwogQUNhbWVyYURldmljZSoKIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbjo6Z2V0RGV2aWNlKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtU2Vzc2lvbkxvY2spOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oCmluZGV4IDMzOWM2NjUuLmEyMDY4ZTcgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmgKQEAgLTI0LDcgKzI0LDggQEAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCiBzdHJ1Y3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0IHsKLSAgICBleHBsaWNpdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQoQU5hdGl2ZVdpbmRvdyogd2luZG93KSA6IG1XaW5kb3cod2luZG93KSB7fTsKKyAgICBleHBsaWNpdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQoQU5hdGl2ZVdpbmRvdyogd2luZG93LCBib29sIGlzU2hhcmVkID0gZmFsc2UpIDoKKyAgICAgICAgICAgIG1XaW5kb3cod2luZG93KSwgbUlzU2hhcmVkKGlzU2hhcmVkKSB7fTsKIAogICAgIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dCYgb3RoZXIpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1XaW5kb3cgPT0gb3RoZXIubVdpbmRvdzsKQEAgLTQwLDYgKzQxLDggQEAKICAgICB9CiAKICAgICBBTmF0aXZlV2luZG93KiBtV2luZG93OworICAgIHN0ZDo6c2V0PEFOYXRpdmVXaW5kb3cgKj4gbVNoYXJlZFdpbmRvd3M7CisgICAgYm9vbCAgICAgICAgICAgbUlzU2hhcmVkOwogICAgIGludCAgICAgICAgICAgIG1Sb3RhdGlvbiA9IENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzA7CiB9OwogCkBAIC04OSw2ICs5Miw4IEBACiAgICAgICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAogICAgICAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCk7CiAKKyAgICBjYW1lcmFfc3RhdHVzX3QgdXBkYXRlT3V0cHV0Q29uZmlndXJhdGlvbihBQ2FwdHVyZVNlc3Npb25PdXRwdXQgKm91dHB1dCk7CisKICAgICBBQ2FtZXJhRGV2aWNlKiBnZXREZXZpY2UoKTsKIAogICBwcml2YXRlOgpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwCmluZGV4IGFmOTc3YjguLjkwN2RlYmMgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5jcHAKQEAgLTU5LDcgKzU5LDggQEAKICAgICAgICAgbVdyYXBwZXIod3JhcHBlciksCiAgICAgICAgIG1JbkVycm9yKGZhbHNlKSwKICAgICAgICAgbUVycm9yKEFDQU1FUkFfT0spLAotICAgICAgICBtSWRsZSh0cnVlKSB7CisgICAgICAgIG1JZGxlKHRydWUpLAorICAgICAgICBtQ3VycmVudFNlc3Npb24obnVsbHB0cikgewogICAgIG1DbG9zaW5nID0gZmFsc2U7CiAgICAgLy8gU2V0dXAgbG9vcGVyIHRocmVhZCB0byBwZXJmcm9tIGRldmljZSBjYWxsYmFja3MgdG8gYXBwCiAgICAgbUNiTG9vcGVyID0gbmV3IEFMb29wZXI7CkBAIC05OCwxOCArOTksMzAgQEAKIAogLy8gRGV2aWNlIGNsb3NlIGltcGxlbWVudGFpdG9uCiBDYW1lcmFEZXZpY2U6On5DYW1lcmFEZXZpY2UoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZXZpY2VMb2NrKTsKLSAgICBpZiAoIWlzQ2xvc2VkKCkpIHsKLSAgICAgICAgZGlzY29ubmVjdExvY2tlZCgpOwotICAgIH0KLSAgICBpZiAobUNiTG9vcGVyICE9IG51bGxwdHIpIHsKLSAgICAgICAgbUNiTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlci0+aWQoKSk7Ci0gICAgICAgIG1DYkxvb3Blci0+c3RvcCgpOworICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiA9IG1DdXJyZW50U2Vzc2lvbi5wcm9tb3RlKCk7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobURldmljZUxvY2spOworICAgICAgICBpZiAoIWlzQ2xvc2VkKCkpIHsKKyAgICAgICAgICAgIGRpc2Nvbm5lY3RMb2NrZWQoc2Vzc2lvbik7CisgICAgICAgIH0KKyAgICAgICAgbUN1cnJlbnRTZXNzaW9uID0gbnVsbHB0cjsKKyAgICAgICAgaWYgKG1DYkxvb3BlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBtQ2JMb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKG1IYW5kbGVyLT5pZCgpKTsKKyAgICAgICAgICAgIG1DYkxvb3Blci0+c3RvcCgpOworICAgICAgICB9CiAgICAgfQogICAgIG1DYkxvb3Blci5jbGVhcigpOwogICAgIG1IYW5kbGVyLmNsZWFyKCk7CiB9CiAKK3ZvaWQKK0NhbWVyYURldmljZTo6cG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKHNwPEFNZXNzYWdlPiYgbXNnKSB7CisgICAgbXNnLT5wb3N0KCk7CisgICAgbXNnLmNsZWFyKCk7CisgICAgc3A8QU1lc3NhZ2U+IGNsZWFudXBNc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDbGVhblVwU2Vzc2lvbnMsIG1IYW5kbGVyKTsKKyAgICBjbGVhbnVwTXNnLT5wb3N0KCk7Cit9CisKIC8vIFRPRE86IGNhY2hlZCBjcmVhdGVkIHJlcXVlc3Q/CiBjYW1lcmFfc3RhdHVzX3QKIENhbWVyYURldmljZTo6Y3JlYXRlQ2FwdHVyZVJlcXVlc3QoCkBAIC0xNDQsMjEgKzE1NywyMyBAQAogY2FtZXJhX3N0YXR1c190CiBDYW1lcmFEZXZpY2U6OmNyZWF0ZUNhcHR1cmVTZXNzaW9uKAogICAgICAgICBjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIqICAgICAgIG91dHB1dHMsCisgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogc2Vzc2lvblBhcmFtZXRlcnMsCiAgICAgICAgIGNvbnN0IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdGF0ZUNhbGxiYWNrcyogY2FsbGJhY2tzLAogICAgICAgICAvKm91dCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiogc2Vzc2lvbikgeworICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gY3VycmVudFNlc3Npb24gPSBtQ3VycmVudFNlc3Npb24ucHJvbW90ZSgpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGV2aWNlTG9jayk7CiAgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGNoZWNrQ2FtZXJhQ2xvc2VkT3JFcnJvckxvY2tlZCgpOwogICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgewogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIAotICAgIGlmIChtQ3VycmVudFNlc3Npb24gIT0gbnVsbHB0cikgewotICAgICAgICBtQ3VycmVudFNlc3Npb24tPmNsb3NlQnlEZXZpY2UoKTsKKyAgICBpZiAoY3VycmVudFNlc3Npb24gIT0gbnVsbHB0cikgeworICAgICAgICBjdXJyZW50U2Vzc2lvbi0+Y2xvc2VCeURldmljZSgpOwogICAgICAgICBzdG9wUmVwZWF0aW5nTG9ja2VkKCk7CiAgICAgfQogCiAgICAgLy8gQ3JlYXRlIG5ldyBzZXNzaW9uCi0gICAgcmV0ID0gY29uZmlndXJlU3RyZWFtc0xvY2tlZChvdXRwdXRzKTsKKyAgICByZXQgPSBjb25maWd1cmVTdHJlYW1zTG9ja2VkKG91dHB1dHMsIHNlc3Npb25QYXJhbWV0ZXJzKTsKICAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKICAgICAgICAgQUxPR0UoIkZhaWwgdG8gY3JlYXRlIG5ldyBzZXNzaW9uLiBjYW5ub3QgY29uZmlndXJlIHN0cmVhbXMiKTsKICAgICAgICAgcmV0dXJuIHJldDsKQEAgLTI2NCw3ICsyNzksNyBAQAogICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLmNvbnRleHQpOwogICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLm9uQWN0aXZlKTsKLSAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgICAgIHBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOwogICAgIH0KICAgICBtSWRsZSA9IGZhbHNlOwogICAgIG1CdXN5U2Vzc2lvbiA9IHNlc3Npb247CkBAIC0yNzUsMTMgKzI5MCw5MyBAQAogICAgIHJldHVybiBBQ0FNRVJBX09LOwogfQogCitjYW1lcmFfc3RhdHVzX3QgQ2FtZXJhRGV2aWNlOjp1cGRhdGVPdXRwdXRDb25maWd1cmF0aW9uTG9ja2VkKEFDYXB0dXJlU2Vzc2lvbk91dHB1dCAqb3V0cHV0KSB7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGNoZWNrQ2FtZXJhQ2xvc2VkT3JFcnJvckxvY2tlZCgpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmIChvdXRwdXQgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBpZiAoIW91dHB1dC0+bUlzU2hhcmVkKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBvdXRwdXQgY29uZmlndXJhdGlvbiBpcyBub3Qgc2hhcmVkIik7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGludDMyX3Qgc3RyZWFtSWQgPSAtMTsKKyAgICBmb3IgKGF1dG8mIGt2UGFpciA6IG1Db25maWd1cmVkT3V0cHV0cykgeworICAgICAgICBpZiAoa3ZQYWlyLnNlY29uZC5maXJzdCA9PSBvdXRwdXQtPm1XaW5kb3cpIHsKKyAgICAgICAgICAgIHN0cmVhbUlkID0ga3ZQYWlyLmZpcnN0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHN0cmVhbUlkIDwgMCkgeworICAgICAgICBBTE9HRSgiRXJyb3I6IEludmFsaWQgb3V0cHV0IGNvbmZpZ3VyYXRpb24iKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorCisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gaUdCUChudWxscHRyKTsKKyAgICByZXQgPSBnZXRJR0JQZnJvbUFudyhvdXRwdXQtPm1XaW5kb3csIGlHQlApOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICBBTE9HRSgiQ2FtZXJhIGRldmljZSAlcyBmYWlsZWQgdG8gZXh0cmFjdCBncmFwaGljIHByb2R1Y2VyIGZyb20gbmF0aXZlIHdpbmRvdyIsCisgICAgICAgICAgICAgICAgZ2V0SWQoKSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgT3V0cHV0Q29uZmlndXJhdGlvbiBvdXRDb25maWcoaUdCUCwgb3V0cHV0LT5tUm90YXRpb24sIE91dHB1dENvbmZpZ3VyYXRpb246OklOVkFMSURfU0VUX0lELAorICAgICAgICAgICAgdHJ1ZSk7CisKKyAgICBmb3IgKGF1dG8mIGFudyA6IG91dHB1dC0+bVNoYXJlZFdpbmRvd3MpIHsKKyAgICAgICAgcmV0ID0gZ2V0SUdCUGZyb21BbncoYW53LCBpR0JQKTsKKyAgICAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhIGRldmljZSAlcyBmYWlsZWQgdG8gZXh0cmFjdCBncmFwaGljIHByb2R1Y2VyIGZyb20gbmF0aXZlIHdpbmRvdyIsCisgICAgICAgICAgICAgICAgICAgIGdldElkKCkpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBvdXRDb25maWcuYWRkR3JhcGhpY1Byb2R1Y2VyKGlHQlApOworICAgIH0KKworICAgIGF1dG8gcmVtb3RlUmV0ID0gbVJlbW90ZS0+dXBkYXRlT3V0cHV0Q29uZmlndXJhdGlvbihzdHJlYW1JZCwgb3V0Q29uZmlnKTsKKyAgICBpZiAoIXJlbW90ZVJldC5pc09rKCkpIHsKKyAgICAgICAgc3dpdGNoIChyZW1vdGVSZXQuc2VydmljZVNwZWNpZmljRXJyb3JDb2RlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTlZBTElEX09QRVJBVElPTjoKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhIGRldmljZSAlcyBpbnZhbGlkIG9wZXJhdGlvbjogJXMiLCBnZXRJZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlUmV0LnRvU3RyaW5nOCgpLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpFUlJPUl9BTFJFQURZX0VYSVNUUzoKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhIGRldmljZSAlcyBvdXRwdXQgc3VyZmFjZSBhbHJlYWR5IGV4aXN0czogJXMiLCBnZXRJZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlUmV0LnRvU3RyaW5nOCgpLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5UOgorICAgICAgICAgICAgICAgIEFMT0dFKCJDYW1lcmEgZGV2aWNlICVzIGludmFsaWQgaW5wdXQgYXJndW1lbnQ6ICVzIiwgZ2V0SWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZVJldC50b1N0cmluZzgoKS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dFKCJDYW1lcmEgZGV2aWNlICVzIGZhaWxlZCB0byBhZGQgc2hhcmVkIG91dHB1dDogJXMiLCBnZXRJZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlUmV0LnRvU3RyaW5nOCgpLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9VTktOT1dOOworICAgICAgICB9CisgICAgfQorICAgIG1Db25maWd1cmVkT3V0cHV0c1tzdHJlYW1JZF0gPSBzdGQ6Om1ha2VfcGFpcihvdXRwdXQtPm1XaW5kb3csIG91dENvbmZpZyk7CisKKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKwogY2FtZXJhX3N0YXR1c190CiBDYW1lcmFEZXZpY2U6OmFsbG9jYXRlQ2FwdHVyZVJlcXVlc3QoCiAgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgLypvdXQqL3NwPENhcHR1cmVSZXF1ZXN0PiYgb3V0UmVxKSB7CiAgICAgY2FtZXJhX3N0YXR1c190IHJldDsKICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxKG5ldyBDYXB0dXJlUmVxdWVzdCgpKTsKLSAgICByZXEtPm1NZXRhZGF0YSA9IHJlcXVlc3QtPnNldHRpbmdzLT5nZXRJbnRlcm5hbERhdGEoKTsKKyAgICByZXEtPm1QaHlzaWNhbENhbWVyYVNldHRpbmdzLnB1c2hfYmFjayh7c3RkOjpzdHJpbmcobUNhbWVyYUlkLnN0cmluZygpKSwKKyAgICAgICAgICAgIHJlcXVlc3QtPnNldHRpbmdzLT5nZXRJbnRlcm5hbERhdGEoKX0pOwogICAgIHJlcS0+bUlzUmVwcm9jZXNzID0gZmFsc2U7IC8vIE5ESyBkb2VzIG5vdCBzdXBwb3J0IHJlcHJvY2Vzc2luZyB5ZXQKKyAgICByZXEtPm1Db250ZXh0ID0gcmVxdWVzdC0+Y29udGV4dDsKKyAgICByZXEtPm1TdXJmYWNlQ29udmVydGVkID0gdHJ1ZTsgLy8gc2V0IHRvIHRydWUsIGFuZCBmaWxsIGluIHN0cmVhbS9zdXJmYWNlIGlkeCB0byBzcGVlZCB1cCBJUEMKIAogICAgIGZvciAoYXV0byBvdXRwdXRUYXJnZXQgOiByZXF1ZXN0LT50YXJnZXRzLT5tT3V0cHV0cykgewogICAgICAgICBBTmF0aXZlV2luZG93KiBhbncgPSBvdXRwdXRUYXJnZXQubVdpbmRvdzsKQEAgLTI5Miw3ICszODcsMzEgQEAKICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgIH0KICAgICAgICAgcmVxLT5tU3VyZmFjZUxpc3QucHVzaF9iYWNrKHN1cmZhY2UpOworCisgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgLy8gbG9va3VwIHN0cmVhbS9zdXJmYWNlIElECisgICAgICAgIGZvciAoY29uc3QgYXV0byYga3ZQYWlyIDogbUNvbmZpZ3VyZWRPdXRwdXRzKSB7CisgICAgICAgICAgICBpbnQgc3RyZWFtSWQgPSBrdlBhaXIuZmlyc3Q7CisgICAgICAgICAgICBjb25zdCBPdXRwdXRDb25maWd1cmF0aW9uJiBvdXRDb25maWcgPSBrdlBhaXIuc2Vjb25kLnNlY29uZDsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8mIGdicHMgPSBvdXRDb25maWcuZ2V0R3JhcGhpY0J1ZmZlclByb2R1Y2VycygpOworICAgICAgICAgICAgZm9yIChpbnQgc3VyZmFjZUlkID0gMDsgc3VyZmFjZUlkIDwgKGludCkgZ2Jwcy5zaXplKCk7IHN1cmZhY2VJZCsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGdicHNbc3VyZmFjZUlkXSA9PSBzdXJmYWNlLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXEtPm1TdHJlYW1JZHhMaXN0LnB1c2hfYmFjayhzdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgICAgIHJlcS0+bVN1cmZhY2VJZHhMaXN0LnB1c2hfYmFjayhzdXJmYWNlSWQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZm91bmQpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICBBTE9HRSgiVW5jb25maWd1cmVkIG91dHB1dCB0YXJnZXQgJXAgaW4gY2FwdHVyZSByZXF1ZXN0ISIsIGFudyk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CiAgICAgfQorCiAgICAgb3V0UmVxID0gcmVxOwogICAgIHJldHVybiBBQ0FNRVJBX09LOwogfQpAQCAtMzAwLDcgKzQxOSw3IEBACiBBQ2FwdHVyZVJlcXVlc3QqCiBDYW1lcmFEZXZpY2U6OmFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHNwPENhcHR1cmVSZXF1ZXN0PiYgcmVxKSB7CiAgICAgQUNhcHR1cmVSZXF1ZXN0KiBwUmVxdWVzdCA9IG5ldyBBQ2FwdHVyZVJlcXVlc3QoKTsKLSAgICBDYW1lcmFNZXRhZGF0YSBjbG9uZSA9IHJlcS0+bU1ldGFkYXRhOworICAgIENhbWVyYU1ldGFkYXRhIGNsb25lID0gcmVxLT5tUGh5c2ljYWxDYW1lcmFTZXR0aW5ncy5iZWdpbigpLT5zZXR0aW5nczsKICAgICBwUmVxdWVzdC0+c2V0dGluZ3MgPSBuZXcgQUNhbWVyYU1ldGFkYXRhKGNsb25lLnJlbGVhc2UoKSwgQUNhbWVyYU1ldGFkYXRhOjpBQ01fUkVRVUVTVCk7CiAgICAgcFJlcXVlc3QtPnRhcmdldHMgID0gbmV3IEFDYW1lcmFPdXRwdXRUYXJnZXRzKCk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXEtPm1TdXJmYWNlTGlzdC5zaXplKCk7IGkrKykgewpAQCAtMzA4LDYgKzQyNyw3IEBACiAgICAgICAgIEFDYW1lcmFPdXRwdXRUYXJnZXQgb3V0cHV0VGFyZ2V0KGFudyk7CiAgICAgICAgIHBSZXF1ZXN0LT50YXJnZXRzLT5tT3V0cHV0cy5pbnNlcnQob3V0cHV0VGFyZ2V0KTsKICAgICB9CisgICAgcFJlcXVlc3QtPmNvbnRleHQgPSByZXEtPm1Db250ZXh0OwogICAgIHJldHVybiBwUmVxdWVzdDsKIH0KIApAQCAtMzI4LDcgKzQ0OCw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBpZiAoc2Vzc2lvbiAhPSBtQ3VycmVudFNlc3Npb24pIHsKKyAgICBpZiAobUN1cnJlbnRTZXNzaW9uICE9IHNlc3Npb24pIHsKICAgICAgICAgLy8gU2Vzc2lvbiBoYXMgYmVlbiByZXBsYWNlZCBieSBvdGhlciBzZWVzaW9uIG9yIGRldmljZSBpcyBjbG9zZWQKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTM0MiwxNCArNDYyLDE0IEBACiAgICAgfQogCiAgICAgLy8gTm8gbmV3IHNlc3Npb24sIHVuY29uZmlndXJlIG5vdwotICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBjb25maWd1cmVTdHJlYW1zTG9ja2VkKG51bGxwdHIpOworICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBjb25maWd1cmVTdHJlYW1zTG9ja2VkKG51bGxwdHIsIG51bGxwdHIpOwogICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgewogICAgICAgICBBTE9HRSgiVW5jb25maWd1cmUgc3RyZWFtIGZhaWxlZC4gRGV2aWNlIG1pZ2h0IHN0aWxsIGJlIGNvbmZpZ3VyZWQhIHJldCAlZCIsIHJldCk7CiAgICAgfQogfQogCiB2b2lkCi1DYW1lcmFEZXZpY2U6OmRpc2Nvbm5lY3RMb2NrZWQoKSB7CitDYW1lcmFEZXZpY2U6OmRpc2Nvbm5lY3RMb2NrZWQoc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiYgc2Vzc2lvbikgewogICAgIGlmIChtQ2xvc2luZy5leGNoYW5nZSh0cnVlKSkgewogICAgICAgICAvLyBBbHJlYWR5IGNsb3NpbmcsIGp1c3QgcmV0dXJuCiAgICAgICAgIEFMT0dXKCJDYW1lcmEgZGV2aWNlICVzIGlzIGFscmVhZHkgY2xvc2luZy4iLCBnZXRJZCgpKTsKQEAgLTM2MSw5ICs0ODEsOCBAQAogICAgIH0KICAgICBtUmVtb3RlID0gbnVsbHB0cjsKIAotICAgIGlmIChtQ3VycmVudFNlc3Npb24gIT0gbnVsbHB0cikgewotICAgICAgICBtQ3VycmVudFNlc3Npb24tPmNsb3NlQnlEZXZpY2UoKTsKLSAgICAgICAgbUN1cnJlbnRTZXNzaW9uID0gbnVsbHB0cjsKKyAgICBpZiAoc2Vzc2lvbiAhPSBudWxscHRyKSB7CisgICAgICAgIHNlc3Npb24tPmNsb3NlQnlEZXZpY2UoKTsKICAgICB9CiB9CiAKQEAgLTQwNCw3ICs1MjMsNyBAQAogICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBiZWNhdXNlIGNyZWF0aW5nIGEgbmV3IHNlc3Npb24gd2lsbCBjbG9zZQogICAgIC8vIHByZXZpb3VzIG9uZSBhbmQgdGh1cyByZWplY3QgYW55IEFQSSBjYWxsIGZyb20gcHJldmlvdXMgc2Vzc2lvbi4KICAgICAvLyBCdXQgc3RpbGwgZ29vZCB0byBjaGVjayBoZXJlIGluIGNhc2Ugc29tZXRoaW5nIHVuZXhwZWN0ZWQgaGFwcGVuLgotICAgIGlmIChzZXNzaW9uICE9IG1DdXJyZW50U2Vzc2lvbikgeworICAgIGlmIChtQ3VycmVudFNlc3Npb24gIT0gc2Vzc2lvbikgewogICAgICAgICBBTE9HRSgiQ2FtZXJhICVzIHNlc3Npb24gJXAgaXMgbm90IGN1cnJlbnQgYWN0aXZlIHNlc3Npb24hIiwgZ2V0SWQoKSwgc2Vzc2lvbik7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KQEAgLTQxNSwxMiArNTM0LDEzIEBACiAgICAgfQogCiAgICAgbUZsdXNoaW5nID0gdHJ1ZTsKKwogICAgIC8vIFNlbmQgb25BY3RpdmUgY2FsbGJhY2sgdG8gZ3VhcmFudGVlIHRoZXJlIGlzIGFsd2F5cyBhY3RpdmUtPnJlYWR5IHRyYW5zaXRpb24KICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2Vzc2lvblN0YXRlQ2IsIG1IYW5kbGVyKTsKICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLmNvbnRleHQpOwogICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIHNlc3Npb24pOwogICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBzZXNzaW9uLT5tVXNlclNlc3Npb25DYWxsYmFjay5vbkFjdGl2ZSk7Ci0gICAgbXNnLT5wb3N0KCk7CisgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CiAKICAgICAvLyBJZiBkZXZpY2UgaXMgYWxyZWFkeSBpZGxpbmcsIHNlbmQgY2FsbGJhY2sgYW5kIGV4aXQgZWFybHkKICAgICBpZiAobUlkbGUpIHsKQEAgLTQyOCw3ICs1NDgsNyBAQAogICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLmNvbnRleHQpOwogICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLm9uUmVhZHkpOwotICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICAgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CiAgICAgICAgIG1GbHVzaGluZyA9IGZhbHNlOwogICAgICAgICByZXR1cm4gQUNBTUVSQV9PSzsKICAgICB9CkBAIC00NzIsMTcgKzU5MiwxMSBAQAogQ2FtZXJhRGV2aWNlOjpnZXRJR0JQZnJvbUFudygKICAgICAgICAgQU5hdGl2ZVdpbmRvdyogYW53LAogICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgb3V0KSB7Ci0gICAgaWYgKGFudyA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJFcnJvcjogb3V0cHV0IEFOYXRpdmVXaW5kb3cgaXMgbnVsbCIpOwotICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICBzcDxTdXJmYWNlPiBzdXJmYWNlOworICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBnZXRTdXJmYWNlRnJvbUFOYXRpdmVXaW5kb3coYW53LCBzdXJmYWNlKTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgcmV0dXJuIHJldDsKICAgICB9Ci0gICAgaW50IHZhbHVlOwotICAgIGludCBlcnIgPSAoKmFudy0+cXVlcnkpKGFudywgTkFUSVZFX1dJTkRPV19DT05DUkVURV9UWVBFLCAmdmFsdWUpOwotICAgIGlmIChlcnIgIT0gT0sgfHwgdmFsdWUgIT0gTkFUSVZFX1dJTkRPV19TVVJGQUNFKSB7Ci0gICAgICAgIEFMT0dFKCJFcnJvcjogQU5hdGl2ZVdpbmRvdyBpcyBub3QgYmFja2VkIGJ5IFN1cmZhY2UhIik7Ci0gICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOwotICAgIH0KLSAgICBjb25zdCBzcDxTdXJmYWNlPiBzdXJmYWNlKHN0YXRpY19jYXN0PFN1cmZhY2UqPihhbncpKTsKICAgICBvdXQgPSBzdXJmYWNlLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCk7CiAgICAgcmV0dXJuIEFDQU1FUkFfT0s7CiB9CkBAIC01MDYsNyArNjIwLDggQEAKIH0KIAogY2FtZXJhX3N0YXR1c190Ci1DYW1lcmFEZXZpY2U6OmNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQoY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyKiBvdXRwdXRzKSB7CitDYW1lcmFEZXZpY2U6OmNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQoY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyKiBvdXRwdXRzLAorICAgICAgICBjb25zdCBBQ2FwdHVyZVJlcXVlc3QqIHNlc3Npb25QYXJhbWV0ZXJzKSB7CiAgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyIGVtcHR5T3V0cHV0OwogICAgIGlmIChvdXRwdXRzID09IG51bGxwdHIpIHsKICAgICAgICAgb3V0cHV0cyA9ICZlbXB0eU91dHB1dDsKQEAgLTUyNiw3ICs2NDEsOCBAQAogICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQogICAgICAgICBvdXRwdXRTZXQuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAotICAgICAgICAgICAgICAgIGFudywgT3V0cHV0Q29uZmlndXJhdGlvbihpR0JQLCBvdXRDb25maWcubVJvdGF0aW9uKSkpOworICAgICAgICAgICAgICAgIGFudywgT3V0cHV0Q29uZmlndXJhdGlvbihpR0JQLCBvdXRDb25maWcubVJvdGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0Q29uZmlndXJhdGlvbjo6SU5WQUxJRF9TRVRfSUQsIG91dENvbmZpZy5tSXNTaGFyZWQpKSk7CiAgICAgfQogICAgIGF1dG8gYWRkU2V0ID0gb3V0cHV0U2V0OwogICAgIHN0ZDo6dmVjdG9yPGludD4gZGVsZXRlTGlzdDsKQEAgLTU2OCw3ICs2ODQsNyBAQAogICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBtQnVzeVNlc3Npb24pOwogICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgbUJ1c3lTZXNzaW9uLT5tVXNlclNlc3Npb25DYWxsYmFjay5vblJlYWR5KTsKICAgICAgICAgbUJ1c3lTZXNzaW9uLmNsZWFyKCk7Ci0gICAgICAgIG1zZy0+cG9zdCgpOworICAgICAgICBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKICAgICB9CiAgICAgbUlkbGUgPSB0cnVlOwogCkBAIC02MDEsNyArNzE3LDExIEBACiAgICAgICAgIG1Db25maWd1cmVkT3V0cHV0cy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoc3RyZWFtSWQsIG91dHB1dFBhaXIpKTsKICAgICB9CiAKLSAgICByZW1vdGVSZXQgPSBtUmVtb3RlLT5lbmRDb25maWd1cmUoLyppc0NvbnN0cmFpbmVkSGlnaFNwZWVkKi8gZmFsc2UpOworICAgIENhbWVyYU1ldGFkYXRhIHBhcmFtczsKKyAgICBpZiAoKHNlc3Npb25QYXJhbWV0ZXJzICE9IG51bGxwdHIpICYmIChzZXNzaW9uUGFyYW1ldGVycy0+c2V0dGluZ3MgIT0gbnVsbHB0cikpIHsKKyAgICAgICAgcGFyYW1zLmFwcGVuZChzZXNzaW9uUGFyYW1ldGVycy0+c2V0dGluZ3MtPmdldEludGVybmFsRGF0YSgpKTsKKyAgICB9CisgICAgcmVtb3RlUmV0ID0gbVJlbW90ZS0+ZW5kQ29uZmlndXJlKC8qaXNDb25zdHJhaW5lZEhpZ2hTcGVlZCovIGZhbHNlLCBwYXJhbXMpOwogICAgIGlmIChyZW1vdGVSZXQuc2VydmljZVNwZWNpZmljRXJyb3JDb2RlKCkgPT0gaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5UKSB7CiAgICAgICAgIEFMT0dFKCJDYW1lcmEgZGV2aWNlICVzIGNhbm5ub3Qgc3VwcG9ydCBhcHAgb3V0cHV0IGNvbmZpZ3VyYXRpb246ICVzIiwgZ2V0SWQoKSwKICAgICAgICAgICAgICAgICByZW1vdGVSZXQudG9TdHJpbmc4KCkuc3RyaW5nKCkpOwpAQCAtNzE2LDE5ICs4MzYsMjYgQEAKICAgICAgICAgICAgIHNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX1NFUlZJQ0UpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIEFOYXRpdmVXaW5kb3cqIGFudyA9IG91dHB1dFBhaXJJdC0+c2Vjb25kLmZpcnN0OwogCi0gICAgICAgIEFMT0dWKCJDYW1lcmEgJXMgTG9zdCBvdXRwdXQgYnVmZmVyIGZvciBBTlcgJXAgZnJhbWUgJSIgUFJJZDY0LAotICAgICAgICAgICAgICAgIGdldElkKCksIGFudywgZnJhbWVOdW1iZXIpOworICAgICAgICBjb25zdCBhdXRvJiBnYnBzID0gb3V0cHV0UGFpckl0LT5zZWNvbmQuc2Vjb25kLmdldEdyYXBoaWNCdWZmZXJQcm9kdWNlcnMoKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBvdXRHYnAgOiBnYnBzKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8gc3VyZmFjZSA6IHJlcXVlc3QtPm1TdXJmYWNlTGlzdCkgeworICAgICAgICAgICAgICAgIGlmIChzdXJmYWNlLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCkgPT0gb3V0R2JwKSB7CisgICAgICAgICAgICAgICAgICAgIEFOYXRpdmVXaW5kb3cqIGFudyA9IHN0YXRpY19jYXN0PEFOYXRpdmVXaW5kb3cqPihzdXJmYWNlLmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkNhbWVyYSAlcyBMb3N0IG91dHB1dCBidWZmZXIgZm9yIEFOVyAlcCBmcmFtZSAlIiBQUklkNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SWQoKSwgYW53LCBmcmFtZU51bWJlcik7CiAKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENhcHR1cmVCdWZmZXJMb3N0LCBtSGFuZGxlcik7Ci0gICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1DYWxsYmFja3MuY29udGV4dCk7Ci0gICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIHNlc3Npb24pOwotICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgb25CdWZmZXJMb3N0KTsKLSAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVSZXF1ZXN0S2V5LCByZXF1ZXN0KTsKLSAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtBbndLZXksICh2b2lkKikgYW53KTsKLSAgICAgICAgbXNnLT5zZXRJbnQ2NChrRnJhbWVOdW1iZXJLZXksIGZyYW1lTnVtYmVyKTsKLSAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDYXB0dXJlQnVmZmVyTG9zdCwgbUhhbmRsZXIpOworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ2FsbGJhY2tzLmNvbnRleHQpOworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIG9uQnVmZmVyTG9zdCk7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtDYXB0dXJlUmVxdWVzdEtleSwgcmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQW53S2V5LCAodm9pZCopIGFudyk7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50NjQoa0ZyYW1lTnVtYmVyS2V5LCBmcmFtZU51bWJlcik7CisgICAgICAgICAgICAgICAgICAgIHBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0gZWxzZSB7IC8vIEhhbmRsZSBvdGhlciBjYXB0dXJlIGZhaWx1cmVzCiAgICAgICAgIC8vIEZpcmUgY2FwdHVyZSBmYWlsdXJlIGNhbGxiYWNrIGlmIHRoZXJlIGlzIG9uZSByZWdpc3RlcmVkCiAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfZmFpbGVkIG9uRXJyb3IgPSBjYmgubUNhbGxiYWNrcy5vbkNhcHR1cmVGYWlsZWQ7CkBAIC03NDYsNyArODczLDcgQEAKICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIG9uRXJyb3IpOwogICAgICAgICBtc2ctPnNldE9iamVjdChrQ2FwdHVyZVJlcXVlc3RLZXksIHJlcXVlc3QpOwogICAgICAgICBtc2ctPnNldE9iamVjdChrQ2FwdHVyZUZhaWx1cmVLZXksIGZhaWx1cmUpOwotICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICAgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CiAKICAgICAgICAgLy8gVXBkYXRlIHRyYWNrZXIKICAgICAgICAgbUZyYW1lTnVtYmVyVHJhY2tlci51cGRhdGVUcmFja2VyKGZyYW1lTnVtYmVyLCAvKmlzRXJyb3IqL3RydWUpOwpAQCAtNzY5LDYgKzg5Niw5IEBACiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlQnVmZmVyTG9zdDoKICAgICAgICAgICAgIEFMT0dWKCIlczogUmVjZWl2ZWQgbXNnICVkIiwgX19GVU5DVElPTl9fLCBtc2ctPndoYXQoKSk7CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBrV2hhdENsZWFuVXBTZXNzaW9uczoKKyAgICAgICAgICAgIG1DYWNoZWRTZXNzaW9ucy5jbGVhcigpOworICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR0UoIiVzOkVycm9yOiB1bmtub3duIGRldmljZSBjYWxsYmFjayAlZCIsIF9fRlVOQ1RJT05fXywgbXNnLT53aGF0KCkpOwogICAgICAgICAgICAgcmV0dXJuOwpAQCAtODQyLDYgKzk3Miw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uKHN0YXRpY19jYXN0PEFDYW1lcmFDYXB0dXJlU2Vzc2lvbio+KG9iai5nZXQoKSkpOworICAgICAgICAgICAgbUNhY2hlZFNlc3Npb25zLnB1c2goc2Vzc2lvbik7CiAgICAgICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdFNwID0gbnVsbHB0cjsKICAgICAgICAgICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKICAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVN0YXJ0OgpAQCAtMTA1Myw3ICsxMTg0LDcgQEAKICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgY2JoLm1TZXNzaW9uKTsKICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIGNiaC5tQ2FsbGJhY2tzLm9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZCk7CiAgICAgICAgIG1zZy0+c2V0SW50MzIoa1NlcXVlbmNlSWRLZXksIHNlcXVlbmNlSWQpOwotICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICAgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gVXNlIG1TZXF1ZW5jZUxhc3RGcmFtZU51bWJlck1hcCB0byB0cmFjawogICAgICAgICBtU2VxdWVuY2VMYXN0RnJhbWVOdW1iZXJNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHNlcXVlbmNlSWQsIGxhc3RGcmFtZU51bWJlcikpOwpAQCAtMTExMCw3ICsxMjQxLDcgQEAKICAgICAgICAgICAgIC8vIGJlZm9yZSBjYmggZ29lcyBvdXQgb2Ygc2NvcGUgYW5kIGNhdXNpbmcgd2UgY2FsbCB0aGUgc2Vzc2lvbgogICAgICAgICAgICAgLy8gZGVzdHJ1Y3RvciB3aGlsZSBob2xkaW5nIGRldmljZSBsb2NrCiAgICAgICAgICAgICBjYmgubVNlc3Npb24uY2xlYXIoKTsKLSAgICAgICAgICAgIG1zZy0+cG9zdCgpOworICAgICAgICAgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBObyBuZWVkIHRvIHRyYWNrIHNlcXVlbmNlIGNvbXBsZXRlIGlmIHRoZXJlIGlzIG5vIGNhbGxiYWNrIHJlZ2lzdGVyZWQKQEAgLTExMzcsNiArMTI2OCw3IEBACiAgICAgICAgIHJldHVybiByZXQ7IC8vIGRldmljZSBoYXMgYmVlbiBjbG9zZWQKICAgICB9CiAKKyAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24gPSBkZXYtPm1DdXJyZW50U2Vzc2lvbi5wcm9tb3RlKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGRldi0+bURldmljZUxvY2spOwogICAgIGlmIChkZXYtPm1SZW1vdGUgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gcmV0OyAvLyBkZXZpY2UgaGFzIGJlZW4gY2xvc2VkCkBAIC0xMTQ1LDEwICsxMjc3LDEwIEBACiAgICAgICAgIGNhc2UgRVJST1JfQ0FNRVJBX0RJU0NPTk5FQ1RFRDoKICAgICAgICAgewogICAgICAgICAgICAgLy8gQ2FtZXJhIGlzIGRpc2Nvbm5lY3RlZCwgY2xvc2UgdGhlIHNlc3Npb24gYW5kIGV4cGVjdCBubyBtb3JlIGNhbGxiYWNrcwotICAgICAgICAgICAgaWYgKGRldi0+bUN1cnJlbnRTZXNzaW9uICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBkZXYtPm1DdXJyZW50U2Vzc2lvbi0+Y2xvc2VCeURldmljZSgpOwotICAgICAgICAgICAgICAgIGRldi0+bUN1cnJlbnRTZXNzaW9uID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLT5jbG9zZUJ5RGV2aWNlKCk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXYtPm1DdXJyZW50U2Vzc2lvbiA9IG51bGxwdHI7CiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0T25EaXNjb25uZWN0ZWQsIGRldi0+bUhhbmRsZXIpOwogICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBkZXYtPm1BcHBDYWxsYmFja3MuY29udGV4dCk7CiAgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0RldmljZUtleSwgKHZvaWQqKSBkZXYtPmdldFdyYXBwZXIoKSk7CkBAIC0xMjE2LDYgKzEzNDgsNyBAQAogICAgICAgICAgICAgZGV2LT5zZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ERVZJQ0UpOwogICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQorCiAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXNzaW9uU3RhdGVDYiwgZGV2LT5tSGFuZGxlcik7CiAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgZGV2LT5tQnVzeVNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLmNvbnRleHQpOwogICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBkZXYtPm1CdXN5U2Vzc2lvbik7CkBAIC0xMjIzLDcgKzEzNTYsNyBAQAogICAgICAgICAvLyBNYWtlIHN1cmUgd2UgY2xlYXIgdGhlIHNwIGZpcnN0IHNvIHRoZSBzZXNzaW9uIGRlc3RydWN0b3IgY2FuCiAgICAgICAgIC8vIG9ubHkgaGFwcGVuIG9uIGhhbmRsZXIgdGhyZWFkICh3aGVyZSB3ZSBkb24ndCBob2xkIGRldmljZS9zZXNzaW9uIGxvY2spCiAgICAgICAgIGRldi0+bUJ1c3lTZXNzaW9uLmNsZWFyKCk7Ci0gICAgICAgIG1zZy0+cG9zdCgpOworICAgICAgICBkZXYtPnBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOwogICAgIH0KICAgICBkZXYtPm1JZGxlID0gdHJ1ZTsKICAgICBkZXYtPm1GbHVzaGluZyA9IGZhbHNlOwpAQCAtMTI2NSw3ICsxMzk4LDcgQEAKICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIG9uU3RhcnQpOwogICAgICAgICBtc2ctPnNldE9iamVjdChrQ2FwdHVyZVJlcXVlc3RLZXksIHJlcXVlc3QpOwogICAgICAgICBtc2ctPnNldEludDY0KGtUaW1lU3RhbXBLZXksIHRpbWVzdGFtcCk7Ci0gICAgICAgIG1zZy0+cG9zdCgpOworICAgICAgICBkZXYtPnBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOwogICAgIH0KICAgICByZXR1cm4gcmV0OwogfQpAQCAtMTI3Myw3ICsxNDA2LDkgQEAKIGJpbmRlcjo6U3RhdHVzCiBDYW1lcmFEZXZpY2U6OlNlcnZpY2VDYWxsYmFjazo6b25SZXN1bHRSZWNlaXZlZCgKICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhLAotICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIHsKKyAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiYgcGh5c2ljYWxSZXN1bHRJbmZvcykgeworICAgICh2b2lkKSBwaHlzaWNhbFJlc3VsdEluZm9zOwogICAgIGJpbmRlcjo6U3RhdHVzIHJldCA9IGJpbmRlcjo6U3RhdHVzOjpvaygpOwogCiAgICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBtRGV2aWNlLnByb21vdGUoKTsKQEAgLTEzMjgsNyArMTQ2Myw3IEBACiAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBvblJlc3VsdCk7CiAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtDYXB0dXJlUmVxdWVzdEtleSwgcmVxdWVzdCk7CiAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtDYXB0dXJlUmVzdWx0S2V5LCByZXN1bHQpOwotICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICAgICAgZGV2LT5wb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKICAgICB9CiAKICAgICBpZiAoIWlzUGFydGlhbFJlc3VsdCkgewpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuaCBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmgKaW5kZXggODU1ZWZlMS4uMTM2OTE0OCAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuaAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5oCkBAIC0zNiwxMiArMzYsMTMgQEAKICNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvQ2FwdHVyZVJlcXVlc3QuaD4KIAotI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFEZXZpY2UuaD4KKyNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FtZXJhTWFuYWdlci5oPgorI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oPgogI2luY2x1ZGUgIkFDYW1lcmFNZXRhZGF0YS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLS8vIFdyYXAgQUNhbWVyYUNhcHR1cmVGYWlsdXJlIHNvIGl0IGNhbiBiZSByZWYtY291bnRlcgorLy8gV3JhcCBBQ2FtZXJhQ2FwdHVyZUZhaWx1cmUgc28gaXQgY2FuIGJlIHJlZi1jb3VudGVkCiBzdHJ1Y3QgQ2FtZXJhQ2FwdHVyZUZhaWx1cmUgOiBwdWJsaWMgUmVmQmFzZSwgcHVibGljIEFDYW1lcmFDYXB0dXJlRmFpbHVyZSB7fTsKIAogY2xhc3MgQ2FtZXJhRGV2aWNlIGZpbmFsIDogcHVibGljIFJlZkJhc2UgewpAQCAtNTksNiArNjAsNyBAQAogCiAgICAgY2FtZXJhX3N0YXR1c190IGNyZWF0ZUNhcHR1cmVTZXNzaW9uKAogICAgICAgICAgICAgY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyKiAgICAgICBvdXRwdXRzLAorICAgICAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiBzZXNzaW9uUGFyYW1ldGVycywKICAgICAgICAgICAgIGNvbnN0IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdGF0ZUNhbGxiYWNrcyogY2FsbGJhY2tzLAogICAgICAgICAgICAgLypvdXQqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbioqIHNlc3Npb24pOwogCkBAIC03Miw3ICs3NCw4IEBACiAgICAgICAgIGJpbmRlcjo6U3RhdHVzIG9uQ2FwdHVyZVN0YXJ0ZWQoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXApIG92ZXJyaWRlOwogICAgICAgICBiaW5kZXI6OlN0YXR1cyBvblJlc3VsdFJlY2VpdmVkKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgb3ZlcnJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiYgcGh5c2ljYWxSZXN1bHRJbmZvcykgb3ZlcnJpZGU7CiAgICAgICAgIGJpbmRlcjo6U3RhdHVzIG9uUHJlcGFyZWQoaW50IHN0cmVhbUlkKSBvdmVycmlkZTsKICAgICAgICAgYmluZGVyOjpTdGF0dXMgb25SZXF1ZXN0UXVldWVFbXB0eSgpIG92ZXJyaWRlOwogICAgICAgICBiaW5kZXI6OlN0YXR1cyBvblJlcGVhdGluZ1JlcXVlc3RFcnJvcihpbnQ2NF90IGxhc3RGcmFtZU51bWJlciwKQEAgLTk2LDcgKzk5LDcgQEAKICAgICAvLyBkZXZpY2UgZ29lcyBpbnRvIGZhdGFsIGVycm9yIHN0YXRlIGFmdGVyIHRoaXMKICAgICB2b2lkIHNldENhbWVyYURldmljZUVycm9yTG9ja2VkKGNhbWVyYV9zdGF0dXNfdCBlcnJvcik7CiAKLSAgICB2b2lkIGRpc2Nvbm5lY3RMb2NrZWQoKTsgLy8gZGlzY29ubmVjdCBmcm9tIGNhbWVyYSBzZXJ2aWNlCisgICAgdm9pZCBkaXNjb25uZWN0TG9ja2VkKHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4mIHNlc3Npb24pOyAvLyBkaXNjb25uZWN0IGZyb20gY2FtZXJhIHNlcnZpY2UKIAogICAgIGNhbWVyYV9zdGF0dXNfdCBzdG9wUmVwZWF0aW5nTG9ja2VkKCk7CiAKQEAgLTEyMiw3ICsxMjUsOSBAQAogICAgICAgICAgICAgLypvdXQqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQsCiAgICAgICAgICAgICBib29sIGlzUmVwZWF0aW5nKTsKIAotICAgIHN0YXRpYyBjYW1lcmFfc3RhdHVzX3QgYWxsb2NhdGVDYXB0dXJlUmVxdWVzdCgKKyAgICBjYW1lcmFfc3RhdHVzX3QgdXBkYXRlT3V0cHV0Q29uZmlndXJhdGlvbkxvY2tlZChBQ2FwdHVyZVNlc3Npb25PdXRwdXQgKm91dHB1dCk7CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgYWxsb2NhdGVDYXB0dXJlUmVxdWVzdCgKICAgICAgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgc3A8Q2FwdHVyZVJlcXVlc3Q+JiBvdXRSZXEpOwogCiAgICAgc3RhdGljIEFDYXB0dXJlUmVxdWVzdCogYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3Qoc3A8Q2FwdHVyZVJlcXVlc3Q+JiByZXEpOwpAQCAtMTM2LDcgKzE0MSwxMSBAQAogICAgIC8vIEZvciBjYXB0dXJlIHNlc3Npb24gdG8gbm90aWZ5IGl0cyBlbmQgb2YgbGlmZQogICAgIHZvaWQgbm90aWZ5U2Vzc2lvbkVuZE9mTGlmZUxvY2tlZChBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24pOwogCi0gICAgY2FtZXJhX3N0YXR1c190IGNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQoY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyKiBvdXRwdXRzKTsKKyAgICBjYW1lcmFfc3RhdHVzX3QgY29uZmlndXJlU3RyZWFtc0xvY2tlZChjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIqIG91dHB1dHMsCisgICAgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogc2Vzc2lvblBhcmFtZXRlcnMpOworCisgICAgLy8gSW5wdXQgbWVzc2FnZSB3aWxsIGJlIHBvc3RlZCBhbmQgY2xlYXJlZCBhZnRlciB0aGlzIHJldHVybnMKKyAgICB2b2lkIHBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChzcDxBTWVzc2FnZT4mIG1zZyk7CiAKICAgICBzdGF0aWMgY2FtZXJhX3N0YXR1c190IGdldElHQlBmcm9tQW53KAogICAgICAgICAgICAgQU5hdGl2ZVdpbmRvdyogYW53LCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgb3V0KTsKQEAgLTE4NSw3ICsxOTQsOSBAQAogICAgICAgICBrV2hhdENhcHR1cmVGYWlsLCAgICAgIC8vIG9uQ2FwdHVyZUZhaWxlZAogICAgICAgICBrV2hhdENhcHR1cmVTZXFFbmQsICAgIC8vIG9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkCiAgICAgICAgIGtXaGF0Q2FwdHVyZVNlcUFib3J0LCAgLy8gb25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkCi0gICAgICAgIGtXaGF0Q2FwdHVyZUJ1ZmZlckxvc3QgLy8gb25DYXB0dXJlQnVmZmVyTG9zdAorICAgICAgICBrV2hhdENhcHR1cmVCdWZmZXJMb3N0LC8vIG9uQ2FwdHVyZUJ1ZmZlckxvc3QKKyAgICAgICAgLy8gSW50ZXJuYWwgY2xlYW51cAorICAgICAgICBrV2hhdENsZWFuVXBTZXNzaW9ucyAgIC8vIENsZWFudXAgY2FjaGVkIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4KICAgICB9OwogICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQ29udGV4dEtleTsKICAgICBzdGF0aWMgY29uc3QgY2hhcioga0RldmljZUtleTsKQEAgLTE5OSwxMCArMjEwLDE2IEBACiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtTZXF1ZW5jZUlkS2V5OwogICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrRnJhbWVOdW1iZXJLZXk7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtBbndLZXk7CisKICAgICBjbGFzcyBDYWxsYmFja0hhbmRsZXIgOiBwdWJsaWMgQUhhbmRsZXIgewogICAgICAgcHVibGljOgotICAgICAgICBDYWxsYmFja0hhbmRsZXIoKSB7fQogICAgICAgICB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSBvdmVycmlkZTsKKworICAgICAgcHJpdmF0ZToKKyAgICAgICAgLy8gVGhpcyBoYW5kbGVyIHdpbGwgY2FjaGUgYWxsIGNhcHR1cmUgc2Vzc2lvbiBzcCB1bnRpbCBrV2hhdENsZWFuVXBTZXNzaW9ucworICAgICAgICAvLyBpcyBwcm9jZXNzZWQuIFRoaXMgaXMgdXNlZCB0byBndWFyYW50ZWUgdGhlIGxhc3Qgc2Vzc2lvbiByZWZlcmVuY2UgaXMgYWx3YXlzCisgICAgICAgIC8vIGJlaW5nIHJlbW92ZWQgaW4gY2FsbGJhY2sgdGhyZWFkIHdpdGhvdXQgaG9sZGluZyBjYW1lcmEgZGV2aWNlIGxvY2sKKyAgICAgICAgVmVjdG9yPHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4+IG1DYWNoZWRTZXNzaW9uczsKICAgICB9OwogICAgIHNwPENhbGxiYWNrSGFuZGxlcj4gbUhhbmRsZXI7CiAKQEAgLTIxMCw3ICsyMjcsNyBAQAogICAgICAqIENhcHR1cmUgc2Vzc2lvbiByZWxhdGVkIG1lbWJlcnMgKgogICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgICAvLyBUaGUgY3VycmVudCBhY3RpdmUgc2Vzc2lvbgotICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogbUN1cnJlbnRTZXNzaW9uID0gbnVsbHB0cjsKKyAgICB3cDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IG1DdXJyZW50U2Vzc2lvbjsKICAgICBib29sIG1GbHVzaGluZyA9IGZhbHNlOwogCiAgICAgaW50IG1OZXh0U2Vzc2lvbklkID0gMDsKQEAgLTI5NSw5ICszMTIsMTAgQEAKIAogICAgIGNhbWVyYV9zdGF0dXNfdCBjcmVhdGVDYXB0dXJlU2Vzc2lvbigKICAgICAgICAgICAgIGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lciogICAgICAgb3V0cHV0cywKKyAgICAgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogc2Vzc2lvblBhcmFtZXRlcnMsCiAgICAgICAgICAgICBjb25zdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc3RhdGVDYWxsYmFja3MqIGNhbGxiYWNrcywKICAgICAgICAgICAgIC8qb3V0Ki9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24qKiBzZXNzaW9uKSB7Ci0gICAgICAgIHJldHVybiBtRGV2aWNlLT5jcmVhdGVDYXB0dXJlU2Vzc2lvbihvdXRwdXRzLCBjYWxsYmFja3MsIHNlc3Npb24pOworICAgICAgICByZXR1cm4gbURldmljZS0+Y3JlYXRlQ2FwdHVyZVNlc3Npb24ob3V0cHV0cywgc2Vzc2lvblBhcmFtZXRlcnMsIGNhbGxiYWNrcywgc2Vzc2lvbik7CiAgICAgfQogCiAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1hbmFnZXIuY3BwIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcAppbmRleCAzZjY0YmNjLi5jNTlkMGU3IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1hbmFnZXIuY3BwCisrKyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWFuYWdlci5jcHAKQEAgLTIyMSw3ICsyMjEsNyBAQAogICAgIG1DYWxsYmFja3MuZXJhc2UoY2IpOwogfQogCi12b2lkIENhbWVyYU1hbmFnZXJHbG9iYWw6OmdldENhbWVyYUlkTGlzdChzdGQ6OnZlY3RvcjxTdHJpbmc4PiAqY2FtZXJhSWRzKSB7Cit2b2lkIENhbWVyYU1hbmFnZXJHbG9iYWw6OmdldENhbWVyYUlkTGlzdChzdGQ6OnZlY3RvcjxTdHJpbmc4PiogY2FtZXJhSWRzKSB7CiAgICAgLy8gRW5zdXJlIHRoYXQgd2UgaGF2ZSBpbml0aWFsaXplZC9yZWZyZXNoZWQgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGRldmljZXMKICAgICBhdXRvIGNzID0gZ2V0Q2FtZXJhU2VydmljZSgpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC0zNDAsNiArMzQwLDkgQEAKICAgICAgICAgbXNnLT5zZXRTdHJpbmcoa0NhbWVyYUlkS2V5LCBBU3RyaW5nKGNhbWVyYUlkKSk7CiAgICAgICAgIG1zZy0+cG9zdCgpOwogICAgIH0KKyAgICBpZiAoc3RhdHVzID09IGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfTk9UX1BSRVNFTlQpIHsKKyAgICAgICAgbURldmljZVN0YXR1c01hcC5lcmFzZShjYW1lcmFJZCk7CisgICAgfQogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1hbmFnZXIuaCBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWFuYWdlci5oCmluZGV4IDRhMTcyZjMuLmNjNDJmNzcgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWFuYWdlci5oCisrKyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWFuYWdlci5oCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FtZXJhTWFuYWdlci5oPgogCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3BhcnNlaW50Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvQm5DYW1lcmFTZXJ2aWNlTGlzdGVuZXIuaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KQEAgLTE0MCw4ICsxNDEsMjkgQEAKICAgICBzdGF0aWMgYm9vbCB2YWxpZFN0YXR1cyhpbnQzMl90IHN0YXR1cyk7CiAgICAgc3RhdGljIGJvb2wgaXNTdGF0dXNBdmFpbGFibGUoaW50MzJfdCBzdGF0dXMpOwogCisgICAgLy8gVGhlIHNvcnQgbG9naWMgbXVzdCBtYXRjaCB0aGUgbG9naWMgaW4KKyAgICAvLyBsaWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwOjpnZXRBUEkxQ29tcGF0aWJsZUNhbWVyYURldmljZUlkcworICAgIHN0cnVjdCBDYW1lcmFJZENvbXBhcmF0b3IgeworICAgICAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgU3RyaW5nOCYgYSwgY29uc3QgU3RyaW5nOCYgYikgY29uc3QgeworICAgICAgICAgICAgdWludDMyX3QgYVVpbnQgPSAwLCBiVWludCA9IDA7CisgICAgICAgICAgICBib29sIGFJc1VpbnQgPSBiYXNlOjpQYXJzZVVpbnQoYS5jX3N0cigpLCAmYVVpbnQpOworICAgICAgICAgICAgYm9vbCBiSXNVaW50ID0gYmFzZTo6UGFyc2VVaW50KGIuY19zdHIoKSwgJmJVaW50KTsKKworICAgICAgICAgICAgLy8gVWludCBkZXZpY2UgSURzIGZpcnN0CisgICAgICAgICAgICBpZiAoYUlzVWludCAmJiBiSXNVaW50KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFVaW50IDwgYlVpbnQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFJc1VpbnQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYklzVWludCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFNpbXBsZSBzdHJpbmcgY29tcGFyZSBpZiBib3RoIGlkIGFyZSBub3QgdWludAorICAgICAgICAgICAgcmV0dXJuIGEgPCBiOworICAgICAgICB9CisgICAgfTsKKwogICAgIC8vIE1hcCBjYW1lcmFfaWQgLT4gc3RhdHVzCi0gICAgc3RkOjptYXA8U3RyaW5nOCwgaW50MzJfdD4gbURldmljZVN0YXR1c01hcDsKKyAgICBzdGQ6Om1hcDxTdHJpbmc4LCBpbnQzMl90LCBDYW1lcmFJZENvbXBhcmF0b3I+IG1EZXZpY2VTdGF0dXNNYXA7CiAKICAgICAvLyBGb3IgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZQogICAgIHN0YXRpYyBNdXRleCBzTG9jazsKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWV0YWRhdGEuY3BwIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNZXRhZGF0YS5jcHAKaW5kZXggN2IzM2MzMi4uZmMwMGEyZCAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNZXRhZGF0YS5jcHAKKysrIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNZXRhZGF0YS5jcHAKQEAgLTIzNSw3ICsyMzUsNyBAQAogfQogCiBjb25zdCBDYW1lcmFNZXRhZGF0YSYKLUFDYW1lcmFNZXRhZGF0YTo6Z2V0SW50ZXJuYWxEYXRhKCkgeworQUNhbWVyYU1ldGFkYXRhOjpnZXRJbnRlcm5hbERhdGEoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1EYXRhOwogfQogCkBAIC0zMDUsNiArMzA1LDcgQEAKICAgICAgICAgY2FzZSBBQ0FNRVJBX1NUQVRJU1RJQ1NfRkFDRV9ERVRFQ1RfTU9ERToKICAgICAgICAgY2FzZSBBQ0FNRVJBX1NUQVRJU1RJQ1NfSE9UX1BJWEVMX01BUF9NT0RFOgogICAgICAgICBjYXNlIEFDQU1FUkFfU1RBVElTVElDU19MRU5TX1NIQURJTkdfTUFQX01PREU6CisgICAgICAgIGNhc2UgQUNBTUVSQV9TVEFUSVNUSUNTX09JU19EQVRBX01PREU6CiAgICAgICAgIGNhc2UgQUNBTUVSQV9UT05FTUFQX0NVUlZFX0JMVUU6CiAgICAgICAgIGNhc2UgQUNBTUVSQV9UT05FTUFQX0NVUlZFX0dSRUVOOgogICAgICAgICBjYXNlIEFDQU1FUkFfVE9ORU1BUF9DVVJWRV9SRUQ6CkBAIC0zMTIsNiArMzEzLDcgQEAKICAgICAgICAgY2FzZSBBQ0FNRVJBX1RPTkVNQVBfR0FNTUE6CiAgICAgICAgIGNhc2UgQUNBTUVSQV9UT05FTUFQX1BSRVNFVF9DVVJWRToKICAgICAgICAgY2FzZSBBQ0FNRVJBX0JMQUNLX0xFVkVMX0xPQ0s6CisgICAgICAgIGNhc2UgQUNBTUVSQV9ESVNUT1JUSU9OX0NPUlJFQ1RJT05fTU9ERToKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNZXRhZGF0YS5oIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNZXRhZGF0YS5oCmluZGV4IDE0M2VmYzcuLjBmZDdlZmEgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWV0YWRhdGEuaAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1ldGFkYXRhLmgKQEAgLTY0LDcgKzY0LDcgQEAKICAgICB2b2lkIGZpbHRlclVuc3VwcG9ydGVkRmVhdHVyZXMoKTsgLy8gSGlkZSBmZWF0dXJlcyBub3QgeWV0IHN1cHBvcnRlZCBieSBOREsKICAgICB2b2lkIGZpbHRlclN0cmVhbUNvbmZpZ3VyYXRpb25zKCk7IC8vIEhpZGUgaW5wdXQgc3RyZWFtcywgdHJhbnNsYXRlIGhhbCBmb3JtYXQgdG8gTkRLIGZvcm1hdHMKIAotICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBnZXRJbnRlcm5hbERhdGEoKTsKKyAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgZ2V0SW50ZXJuYWxEYXRhKCkgY29uc3Q7CiAKICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJTlRFUk5BTF9ULCB0eXBlbmFtZSBOREtfVD4KICAgICBjYW1lcmFfc3RhdHVzX3QgdXBkYXRlSW1wbCh1aW50MzJfdCB0YWcsIHVpbnQzMl90IGNvdW50LCBjb25zdCBOREtfVCogZGF0YSkgewpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYXB0dXJlUmVxdWVzdC5oIGIvY2FtZXJhL25kay9pbXBsL0FDYXB0dXJlUmVxdWVzdC5oCmluZGV4IGU1YjQ1M2UuLjA2YjJjYzMgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FwdHVyZVJlcXVlc3QuaAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhcHR1cmVSZXF1ZXN0LmgKQEAgLTQ1LDggKzQ1LDE5IEBACiB9OwogCiBzdHJ1Y3QgQUNhcHR1cmVSZXF1ZXN0IHsKKyAgICBjYW1lcmFfc3RhdHVzX3Qgc2V0Q29udGV4dCh2b2lkKiBjdHgpIHsKKyAgICAgICAgY29udGV4dCA9IGN0eDsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfT0s7CisgICAgfQorCisgICAgY2FtZXJhX3N0YXR1c190IGdldENvbnRleHQodm9pZCoqIGN0eCkgY29uc3QgeworICAgICAgICAqY3R4ID0gY29udGV4dDsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfT0s7CisgICAgfQorCiAgICAgQUNhbWVyYU1ldGFkYXRhKiAgICAgIHNldHRpbmdzOwogICAgIEFDYW1lcmFPdXRwdXRUYXJnZXRzKiB0YXJnZXRzOworICAgIHZvaWQqICAgICAgICAgICAgICAgICBjb250ZXh0OwogfTsKIAogI2VuZGlmIC8vIF9BQ0FQVFVSRV9SRVFVRVNUX0gKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaCBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaAppbmRleCBkOTZmNTM4Li41MWNlZjhjIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmgKKysrIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oCkBAIC0zMyw2ICszMyw3IEBACiAgKiBEbyBub3QgI2luY2x1ZGUgZmlsZXMgdGhhdCBhcmVuJ3QgcGFydCBvZiB0aGUgTkRLLgogICovCiAjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgogCiAjaW5jbHVkZSA8YW5kcm9pZC9uYXRpdmVfd2luZG93Lmg+CiAjaW5jbHVkZSAiTmRrQ2FtZXJhRXJyb3IuaCIKQEAgLTU5MSw2ICs1OTIsNTQgQEAKIAogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyNCAqLwogCisjaWYgX19BTkRST0lEX0FQSV9fID49IDI4CisKK3R5cGVkZWYgc3RydWN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQ7CisKKy8qKgorICogVXBkYXRlIHNoYXJlZCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQuCisgKgorICogPHA+QSBzaGFyZWQgQUNhcHR1cmVTZXNzaW9uT3V0cHV0IChzZWUge0BsaW5rIEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9jcmVhdGV9KSB0aGF0CisgKiB3YXMgbW9kaWZpZWQgdmlhIGNhbGxzIHRvIHtAbGluayBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfYWRkfSBvcgorICoge0BsaW5rIEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9yZW1vdmV9IG11c3QgYmUgdXBkYXRlZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIGJlZm9yZSBpdHMKKyAqIGNoYW5nZXMgdGFrZSBlZmZlY3QuIEFmdGVyIHRoZSB1cGRhdGUgY2FsbCByZXR1cm5zICB3aXRoIHtAbGluayBBQ0FNRVJBX09LfSwgYW55IG5ld2x5IGFkZGVkCisgKiBuYXRpdmUgd2luZG93cyBjYW4gYmUgdXNlZCBhcyBhIHRhcmdldCBpbiBzdWJzZXF1ZW50IGNhcHR1cmUgcmVxdWVzdHMuPC9wPgorICoKKyAqIDxwPk5hdGl2ZSB3aW5kb3dzIHRoYXQgZ2V0IHJlbW92ZWQgbXVzdCBub3QgYmUgcGFydCBvZiBhbnkgYWN0aXZlIHJlcGVhdGluZyBvciBzaW5nbGUvYnVyc3QKKyAqIHJlcXVlc3Qgb3IgaGF2ZSBhbnkgcGVuZGluZyByZXN1bHRzLiBDb25zaWRlciB1cGRhdGluZyByZXBlYXRpbmcgcmVxdWVzdHMgdmlhCisgKiB7QGxpbmsgQUNhcHR1cmVTZXNzaW9uT3V0cHV0X3NldFJlcGVhdGluZ1JlcXVlc3R9IGFuZCB0aGVuIHdhaXQgZm9yIHRoZSBsYXN0IGZyYW1lIG51bWJlcgorICogd2hlbiB0aGUgc2VxdWVuY2UgY29tcGxldGVzCisgKiB7QGxpbmsgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFjayNvbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZH0uPC9wPgorICoKKyAqIDxwPk5hdGl2ZSB3aW5kb3dzIHRoYXQgZ2V0IGFkZGVkIG11c3Qgbm90IGJlIHBhcnQgb2YgYW55IG90aGVyIHJlZ2lzdGVyZWQgQUNhcHR1cmVTZXNzaW9uT3V0cHV0CisgKiBhbmQgbXVzdCBiZSBjb21wYXRpYmxlLiBDb21wYXRpYmxlIHdpbmRvd3MgbXVzdCBoYXZlIG1hdGNoaW5nIGZvcm1hdCwgcm90YXRpb24gYW5kCisgKiBjb25zdW1lciB1c2FnZS48L3A+CisgKgorICogPHA+QSBzaGFyZWQgQUNhbWVyYUNhcHR1cmVTZXNzaW9uIGNhbiBzdXBwb3J0IHVwIHRvIDQgYWRkaXRpb25hbCBuYXRpdmUgd2luZG93cy48L3A+CisgKgorICogQHBhcmFtIHNlc3Npb24gdGhlIGNhcHR1cmUgc2Vzc2lvbiBvZiBpbnRlcmVzdAorICogQHBhcmFtIG91dHB1dCB0aGUgbW9kaWZpZWQgb3V0cHV0IGNvbmZpZ3VyYXRpb24KKyAqCisgKiBAcmV0dXJuIDx1bD48bGk+CisgKiAgICAgICAgICAgICB7QGxpbmsgQUNBTUVSQV9PS30gaWYgdGhlIG1ldGhvZCBzdWNjZWVkcy48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVJ9IGlmIHNlc3Npb24gb3Igb3V0cHV0IGlzIE5VTEw7IG9yIG91dHB1dAorICogICAgICAgICAgICAgY29udGFpbnMgaW52YWxpZCBuYXRpdmUgd2luZG93czsgb3IgaWYgYW4gYXR0ZW1wdCB3YXMgbWFkZSB0byBhZGQKKyAqICAgICAgICAgICAgIGEgbmF0aXZlIHdpbmRvdyB0byBhIGRpZmZlcmVudCBvdXRwdXQgY29uZmlndXJhdGlvbjsgb3IgbmV3IG5hdGl2ZSB3aW5kb3cgaXMgbm90CisgKiAgICAgICAgICAgICBjb21wYXRpYmxlOyBvciBhbnkgcmVtb3ZlZCBuYXRpdmUgd2luZG93IHN0aWxsIGhhcyBwZW5kaW5nIHJlcXVlc3RzOzwvbGk+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9FUlJPUl9JTlZBTElEX09QRVJBVElPTn0gaWYgb3V0cHV0IGNvbmZpZ3VyYXRpb24gaXMgbm90IHNoYXJlZCAoc2VlCisgKiAgICAgICAgICAgICB7QGxpbmsgQUNhcHR1cmVTZXNzaW9uU2hhcmVkT3V0cHV0X2NyZWF0ZX07ICBvciB0aGUgbnVtYmVyIG9mIGFkZGl0aW9uYWwKKyAqICAgICAgICAgICAgIG5hdGl2ZSB3aW5kb3dzIGdvZXMgYmV5b25kIHRoZSBzdXBwb3J0ZWQgbGltaXQuPC9saT4KKyAqICAgICAgICAgPGxpPntAbGluayBBQ0FNRVJBX0VSUk9SX1NFU1NJT05fQ0xPU0VEfSBpZiB0aGUgY2FwdHVyZSBzZXNzaW9uIGhhcyBiZWVuIGNsb3NlZDwvbGk+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9FUlJPUl9DQU1FUkFfRElTQ09OTkVDVEVEfSBpZiB0aGUgY2FtZXJhIGRldmljZSBpcyBjbG9zZWQ8L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RFVklDRX0gaWYgdGhlIGNhbWVyYSBkZXZpY2UgZW5jb3VudGVycyBmYXRhbCBlcnJvcjwvbGk+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9FUlJPUl9DQU1FUkFfU0VSVklDRX0gaWYgdGhlIGNhbWVyYSBzZXJ2aWNlIGVuY291bnRlcnMgZmF0YWwKKyAqICAgICAgICAgICAgIGVycm9yPC9saT4KKyAqICAgICAgICAgPGxpPntAbGluayBBQ0FNRVJBX0VSUk9SX1VOS05PV059IGlmIHRoZSBtZXRob2QgZmFpbHMgZm9yIHNvbWUgb3RoZXIgcmVhc29uczwvbGk+PC91bD4KKyAqLworY2FtZXJhX3N0YXR1c190IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl91cGRhdGVTaGFyZWRPdXRwdXQoQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiBzZXNzaW9uLAorICAgICAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXQqIG91dHB1dCk7CisjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI4ICovCisKIF9fRU5EX0RFQ0xTCiAKICNlbmRpZiAvKiBfTkRLX0NBTUVSQV9DQVBUVVJFX1NFU1NJT05fSCAqLwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFEZXZpY2UuaCBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhRGV2aWNlLmgKaW5kZXggOWI3ZjZmNC4uYjcxNWIxMiAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFEZXZpY2UuaAorKysgYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYURldmljZS5oCkBAIC05MCwxOCArOTAsMTggQEAKIH07CiAKIC8qKgotICogQ2FtZXJhIGRldmljZSBzdGF0ZSBjYWxsYmFja3MgdG8gYmUgdXNlZCBpbiB7QGxpbmsgQUNhbWVyYURldmljZV9zdGF0ZUNhbGxiYWNrc30uCisgKiBDYW1lcmEgZGV2aWNlIHN0YXRlIGNhbGxiYWNrcyB0byBiZSB1c2VkIGluIHtAbGluayBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzfS4KICAqCi0gKiBAcGFyYW0gY29udGV4dCBUaGUgb3B0aW9uYWwgY29udGV4dCBpbiB7QGxpbmsgQUNhbWVyYURldmljZV9zdGF0ZUNhbGxiYWNrc30gd2lsbCBiZQorICogQHBhcmFtIGNvbnRleHQgVGhlIG9wdGlvbmFsIGNvbnRleHQgaW4ge0BsaW5rIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3N9IHdpbGwgYmUKICAqICAgICAgICAgICAgICAgIHBhc3NlZCB0byB0aGlzIGNhbGxiYWNrLgogICogQHBhcmFtIGRldmljZSBUaGUge0BsaW5rIEFDYW1lcmFEZXZpY2V9IHRoYXQgaXMgYmVpbmcgZGlzY29ubmVjdGVkLgogICovCiB0eXBlZGVmIHZvaWQgKCpBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2spKHZvaWQqIGNvbnRleHQsIEFDYW1lcmFEZXZpY2UqIGRldmljZSk7CiAKIC8qKgotICogQ2FtZXJhIGRldmljZSBlcnJvciBzdGF0ZSBjYWxsYmFja3MgdG8gYmUgdXNlZCBpbiB7QGxpbmsgQUNhbWVyYURldmljZV9zdGF0ZUNhbGxiYWNrc30uCisgKiBDYW1lcmEgZGV2aWNlIGVycm9yIHN0YXRlIGNhbGxiYWNrcyB0byBiZSB1c2VkIGluIHtAbGluayBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzfS4KICAqCi0gKiBAcGFyYW0gY29udGV4dCBUaGUgb3B0aW9uYWwgY29udGV4dCBpbiB7QGxpbmsgQUNhbWVyYURldmljZV9zdGF0ZUNhbGxiYWNrc30gd2lsbCBiZQorICogQHBhcmFtIGNvbnRleHQgVGhlIG9wdGlvbmFsIGNvbnRleHQgaW4ge0BsaW5rIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3N9IHdpbGwgYmUKICAqICAgICAgICAgICAgICAgIHBhc3NlZCB0byB0aGlzIGNhbGxiYWNrLgogICogQHBhcmFtIGRldmljZSBUaGUge0BsaW5rIEFDYW1lcmFEZXZpY2V9IHRoYXQgaXMgYmVpbmcgZGlzY29ubmVjdGVkLgogICogQHBhcmFtIGVycm9yIFRoZSBlcnJvciBjb2RlIGRlc2NyaWJlcyB0aGUgY2F1c2Ugb2YgdGhpcyBlcnJvciBjYWxsYmFjay4gU2VlIHRoZSBmb2xvd2luZwpAQCAtMTUwLDcgKzE1MCwxMiBAQAogICAgICAqCiAgICAgICovCiAgICAgQUNhbWVyYURldmljZV9FcnJvclN0YXRlQ2FsbGJhY2sgIG9uRXJyb3I7Ci19IEFDYW1lcmFEZXZpY2Vfc3RhdGVDYWxsYmFja3M7Cit9IEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3M7CisKKy8qKgorICogRm9yIGJhY2t3YXJkIGNvbXBhdGlibGl0eS4KKyAqLwordHlwZWRlZiBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzIEFDYW1lcmFEZXZpY2Vfc3RhdGVDYWxsYmFja3M7CiAKIC8qKgogICogQ2xvc2UgdGhlIGNvbm5lY3Rpb24gYW5kIGZyZWUgdGhpcyBBQ2FtZXJhRGV2aWNlIHN5bmNocm9ub3VzbHkuIEFjY2VzcyB0byB0aGUgQUNhbWVyYURldmljZQpAQCAtMjUxLDYgKzI1Niw3IEBACiAgICAgICogQHNlZSBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVSZXF1ZXN0CiAgICAgICovCiAgICAgVEVNUExBVEVfTUFOVUFMID0gNiwKKwogfSBBQ2FtZXJhRGV2aWNlX3JlcXVlc3RfdGVtcGxhdGU7CiAKIC8qKgpAQCAtNjYxLDkgKzY2NywxMDIgQEAKIAogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyNCAqLwogCisjaWYgX19BTkRST0lEX0FQSV9fID49IDI4CisKKy8qKgorICogQ3JlYXRlIGEgc2hhcmVkIEFDYXB0dXJlU2Vzc2lvbk91dHB1dCBvYmplY3QuCisgKgorICogPHA+VGhlIEFDYXB0dXJlU2Vzc2lvbk91dHB1dCBpcyB1c2VkIGluIHtAbGluayBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfYWRkfSBtZXRob2QgdG8gYWRkCisgKiBhbiBvdXRwdXQge0BsaW5rIEFOYXRpdmVXaW5kb3d9IHRvIEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lci4gVXNlCisgKiB7QGxpbmsgQUNhcHR1cmVTZXNzaW9uT3V0cHV0X2ZyZWV9IHRvIGZyZWUgdGhlIG9iamVjdCBhbmQgaXRzIG1lbW9yeSBhZnRlciBhcHBsaWNhdGlvbiBubyBsb25nZXIKKyAqIG5lZWRzIHRoZSB7QGxpbmsgQUNhcHR1cmVTZXNzaW9uT3V0cHV0fS4gQSBzaGFyZWQgQUNhcHR1cmVTZXNzaW9uT3V0cHV0IGNhbiBiZSBmdXJ0aGVyIG1vZGlmaWVkCisgKiB2aWEge0BsaW5rIEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9hZGR9IG9yIHtAbGluayBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfcmVtb3ZlfSBhbmQKKyAqIG11c3QgYmUgdXBkYXRlZCB2aWEge0BsaW5rIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl91cGRhdGVTaGFyZWRPdXRwdXR9LjwvcD4KKyAqCisgKiBAcGFyYW0gYW53IHRoZSB7QGxpbmsgQU5hdGl2ZVdpbmRvd30gdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSB7QGxpbmsgQUNhcHR1cmVTZXNzaW9uT3V0cHV0fQorICogQHBhcmFtIG91dHB1dCB0aGUgb3V0cHV0IHtAbGluayBBQ2FwdHVyZVNlc3Npb25PdXRwdXR9IHdpbGwgYmUgc3RvcmVkIGhlcmUgaWYgdGhlCisgKiAgICAgICAgICAgICAgICAgIG1ldGhvZCBjYWxsIHN1Y2NlZWRzLgorICoKKyAqIEByZXR1cm4gPHVsPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfT0t9IGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy4gVGhlIGNyZWF0ZWQgY29udGFpbmVyIHdpbGwgYmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsZWQgaW4gdGhlIG91dHB1dCBhcmd1bWVudC48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVJ9IGlmIGFudyBvciBvdXRwdXQgaXMgTlVMTC48L2xpPjwvdWw+CisgKgorICogQHNlZSBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfYWRkCisgKi8KK2NhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfY3JlYXRlKAorICAgICAgICBBTmF0aXZlV2luZG93KiBhbncsIC8qb3V0Ki9BQ2FwdHVyZVNlc3Npb25PdXRwdXQqKiBvdXRwdXQpOworCisvKioKKyAqIEFkZCBhIG5hdGl2ZSB3aW5kb3cgdG8gc2hhcmVkIEFDYXB0dXJlU2Vzc2lvbk91dHB1dC4KKyAqCisgKiBUaGUgQUNhcHR1cmVTZXNzaW9uT3V0cHV0IG11c3QgYmUgY3JlYXRlZCB2aWEge0BsaW5rIEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9jcmVhdGV9LgorICoKKyAqIEBwYXJhbSBvdXRwdXQgIHRoZSBzaGFyZWQgQUNhcHR1cmVTZXNzaW9uT3V0cHV0IHRvIGJlIGV4dGVuZGVkLgorICogQHBhcmFtIGFudyBUaGUgbmV3IG5hdGl2ZSB3aW5kb3cuCisgKgorICogQHJldHVybiA8dWw+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9PS30gaWYgdGhlIG1ldGhvZCBjYWxsIHN1Y2NlZWRzLjwvbGk+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUn0gaWYgYW53IG9yIG91dHB1dCBpcyBOVUxMOyBvciBvdXRwdXQgaXMgbm90CisgKiAgICAgICAgICAgICBzaGFyZWQgc2VlIHtAbGluayBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfY3JlYXRlfTsgb3IgYW53IG1hdGNoZXMgd2l0aCB0aGUgbmF0aXZlCisgKiAgICAgICAgICAgICB3aW5kb3cgYXNzb2NpYXRlZCB3aXRoIEFDYXB0dXJlU2Vzc2lvbk91dHB1dDsgb3IgYW53IGlzIGFscmVhZHkgcHJlc2VudCBpbnNpZGUKKyAqICAgICAgICAgICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dC48L2xpPjwvdWw+CisgKi8KK2NhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfYWRkKEFDYXB0dXJlU2Vzc2lvbk91dHB1dCAqb3V0cHV0LCBBTmF0aXZlV2luZG93ICphbncpOworCisvKioKKyAqIFJlbW92ZSBhIG5hdGl2ZSB3aW5kb3cgZnJvbSBzaGFyZWQgQUNhcHR1cmVTZXNzaW9uT3V0cHV0LgorICoKKyAqIEBwYXJhbSBvdXRwdXQgdGhlIHtAbGluayBBQ2FwdHVyZVNlc3Npb25PdXRwdXR9IHRvIGJlIG1vZGlmaWVkLgorICogQHBhcmFtIGFudyBUaGUgbmF0aXZlIHdpbmRvdyB0byBiZSByZW1vdmVkLgorICoKKyAqIEByZXR1cm4gPHVsPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfT0t9IGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVJ9IGlmIGFudyBvciBvdXRwdXQgaXMgTlVMTDsgb3Igb3V0cHV0IGlzIG5vdAorICogICAgICAgICAgICAgc2hhcmVkIHNlZSB7QGxpbmsgQUNhcHR1cmVTZXNzaW9uU2hhcmVkT3V0cHV0X2NyZWF0ZX07IG9yIGFudyBtYXRjaGVzIHdpdGggdGhlIG5hdGl2ZQorICogICAgICAgICAgICAgd2luZG93IGFzc29jaWF0ZWQgd2l0aCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQ7IG9yIGFudyBpcyBub3QgcHJlc2VudCBpbnNpZGUKKyAqICAgICAgICAgICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dC48L2xpPjwvdWw+CisgKi8KK2NhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfcmVtb3ZlKEFDYXB0dXJlU2Vzc2lvbk91dHB1dCAqb3V0cHV0LAorICAgICAgICBBTmF0aXZlV2luZG93KiBhbncpOworCisvKioKKyAqIENyZWF0ZSBhIG5ldyBjYW1lcmEgY2FwdHVyZSBzZXNzaW9uIHNpbWlsYXIgdG8ge0BsaW5rIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVNlc3Npb259LiBUaGlzCisgKiBmdW5jdGlvbiBhbGxvd3MgY2xpZW50cyB0byBwYXNzIGFkZGl0aW9uYWwgc2Vzc2lvbiBwYXJhbWV0ZXJzIGR1cmluZyBzZXNzaW9uIGluaXRpYWxpemF0aW9uLiBGb3IKKyAqIGZ1cnRoZXIgaW5mb3JtYXRpb24gYWJvdXQgc2Vzc2lvbiBwYXJhbWV0ZXJzIHNlZSB7QGxpbmsgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9TRVNTSU9OX0tFWVN9LgorICoKKyAqIEBwYXJhbSBkZXZpY2UgdGhlIGNhbWVyYSBkZXZpY2Ugb2YgaW50ZXJlc3QuCisgKiBAcGFyYW0gb3V0cHV0cyB0aGUge0BsaW5rIEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lcn0gZGVzY3JpYmVzIGFsbCBvdXRwdXQgc3RyZWFtcy4KKyAqIEBwYXJhbSBzZXNzaW9uUGFyYW1ldGVycyBBbiBvcHRpb25hbCBjYXB0dXJlIHJlcXVlc3QgdGhhdCBjb250YWlucyB0aGUgaW5pdGlhbCB2YWx1ZXMgb2Ygc2Vzc2lvbgorICogICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgYWR2ZXJ0aXNlZCBpbgorICogICAgICAgICAgICAgICAgICAgICAgICAgIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1NFU1NJT05fS0VZU30uCisgKiBAcGFyYW0gY2FsbGJhY2tzIHRoZSB7QGxpbmsgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3N0YXRlQ2FsbGJhY2tzfQorICogICAgICAgICAgICAgICAgICBjYXB0dXJlIHNlc3Npb24gc3RhdGUgY2FsbGJhY2tzLgorICogQHBhcmFtIHNlc3Npb24gdGhlIGNyZWF0ZWQge0BsaW5rIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbn0gd2lsbCBiZSBmaWxsZWQgaGVyZSBpZiB0aGUgbWV0aG9kIGNhbGwKKyAqICAgICAgICAgICAgICAgIHN1Y2NlZWRzLgorICoKKyAqIEByZXR1cm4gPHVsPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfT0t9IGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy4gVGhlIGNyZWF0ZWQgY2FwdHVyZSBzZXNzaW9uIHdpbGwgYmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsZWQgaW4gc2Vzc2lvbiBhcmd1bWVudC48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVJ9IGlmIGFueSBvZiBkZXZpY2UsIG91dHB1dHMsIGNhbGxiYWNrcyBvcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24gaXMgTlVMTC48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RJU0NPTk5FQ1RFRH0gaWYgdGhlIGNhbWVyYSBkZXZpY2UgaXMgY2xvc2VkLjwvbGk+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9FUlJPUl9DQU1FUkFfREVWSUNFfSBpZiB0aGUgY2FtZXJhIGRldmljZSBlbmNvdW50ZXJzIGZhdGFsIGVycm9yLjwvbGk+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9FUlJPUl9DQU1FUkFfU0VSVklDRX0gaWYgdGhlIGNhbWVyYSBzZXJ2aWNlIGVuY291bnRlcnMgZmF0YWwgZXJyb3IuCisgKiAgICAgICAgIDwvbGk+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9FUlJPUl9VTktOT1dOfSBpZiB0aGUgbWV0aG9kIGZhaWxzIGZvciBzb21lIG90aGVyIHJlYXNvbnMuPC9saT48L3VsPgorICovCitjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlU2Vzc2lvbldpdGhTZXNzaW9uUGFyYW1ldGVycygKKyAgICAgICAgQUNhbWVyYURldmljZSogZGV2aWNlLAorICAgICAgICBjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIqIG91dHB1dHMsCisgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogc2Vzc2lvblBhcmFtZXRlcnMsCisgICAgICAgIGNvbnN0IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdGF0ZUNhbGxiYWNrcyogY2FsbGJhY2tzLAorICAgICAgICAvKm91dCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiogc2Vzc2lvbik7CisKKyNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjggKi8KKwogX19FTkRfREVDTFMKIAogI2VuZGlmIC8qIF9OREtfQ0FNRVJBX0RFVklDRV9IICovCiAKIC8qKiBAfSAqLwotCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1hbmFnZXIuaCBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWFuYWdlci5oCmluZGV4IDViNWM5OGIuLmU1YjNhZDggMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWFuYWdlci5oCisrKyBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWFuYWdlci5oCkBAIC0yMzIsMTggKzIzMiwxOCBAQAogICogcHJpb3JpdHkgd2hlbiBhY2Nlc3NpbmcgdGhlIGNhbWVyYSwgYW5kIHRoaXMgbWV0aG9kIHdpbGwgc3VjY2VlZCBldmVuIGlmIHRoZSBjYW1lcmEgZGV2aWNlIGlzCiAgKiBpbiB1c2UgYnkgYW5vdGhlciBjYW1lcmEgQVBJIGNsaWVudC4gQW55IGxvd2VyLXByaW9yaXR5IGFwcGxpY2F0aW9uIHRoYXQgbG9zZXMgY29udHJvbCBvZiB0aGUKICAqIGNhbWVyYSBpbiB0aGlzIHdheSB3aWxsIHJlY2VpdmUgYW4KLSAqIHtAbGluayBBQ2FtZXJhRGV2aWNlX3N0YXRlQ2FsbGJhY2tzI29uRGlzY29ubmVjdGVkfSBjYWxsYmFjay48L3A+CisgKiB7QGxpbmsgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrcyNvbkRpc2Nvbm5lY3RlZH0gY2FsbGJhY2suPC9wPgogICoKICAqIDxwPk9uY2UgdGhlIGNhbWVyYSBpcyBzdWNjZXNzZnVsbHkgb3BlbmVkLHRoZSBBQ2FtZXJhRGV2aWNlIGNhbiB0aGVuIGJlIHNldCB1cAogICogZm9yIG9wZXJhdGlvbiBieSBjYWxsaW5nIHtAbGluayBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVTZXNzaW9ufSBhbmQKICAqIHtAbGluayBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVSZXF1ZXN0fS48L3A+CiAgKgogICogPHA+SWYgdGhlIGNhbWVyYSBiZWNvbWVzIGRpc2Nvbm5lY3RlZCBhZnRlciB0aGlzIGZ1bmN0aW9uIGNhbGwgcmV0dXJucywKLSAqIHtAbGluayBBQ2FtZXJhRGV2aWNlX3N0YXRlQ2FsbGJhY2tzI29uRGlzY29ubmVjdGVkfSB3aXRoIGEKKyAqIHtAbGluayBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzI29uRGlzY29ubmVjdGVkfSB3aXRoIGEKICAqIEFDYW1lcmFEZXZpY2UgaW4gdGhlIGRpc2Nvbm5lY3RlZCBzdGF0ZSB3aWxsIGJlIGNhbGxlZC48L3A+CiAgKgogICogPHA+SWYgdGhlIGNhbWVyYSBydW5zIGludG8gZXJyb3IgYWZ0ZXIgdGhpcyBmdW5jdGlvbiBjYWxsIHJldHVybnMsCi0gKiB7QGxpbmsgQUNhbWVyYURldmljZV9zdGF0ZUNhbGxiYWNrcyNvbkVycm9yfSB3aXRoIGEKKyAqIHtAbGluayBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzI29uRXJyb3J9IHdpdGggYQogICogQUNhbWVyYURldmljZSBpbiB0aGUgZXJyb3Igc3RhdGUgd2lsbCBiZSBjYWxsZWQuPC9wPgogICoKICAqIEBwYXJhbSBtYW5hZ2VyIHRoZSB7QGxpbmsgQUNhbWVyYU1hbmFnZXJ9IG9mIGludGVyZXN0LgpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNZXRhZGF0YVRhZ3MuaCBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWV0YWRhdGFUYWdzLmgKaW5kZXggNjI5ZDc1YS4uMzAxMDY0NiAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNZXRhZGF0YVRhZ3MuaAorKysgYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1ldGFkYXRhVGFncy5oCkBAIC02OSw2ICs2OSw4IEBACiAgICAgQUNBTUVSQV9TWU5DLAogICAgIEFDQU1FUkFfUkVQUk9DRVNTLAogICAgIEFDQU1FUkFfREVQVEgsCisgICAgQUNBTUVSQV9MT0dJQ0FMX01VTFRJX0NBTUVSQSwKKyAgICBBQ0FNRVJBX0RJU1RPUlRJT05fQ09SUkVDVElPTiwKICAgICBBQ0FNRVJBX1NFQ1RJT05fQ09VTlQsCiAKICAgICBBQ0FNRVJBX1ZFTkRPUiA9IDB4ODAwMApAQCAtMTA0LDYgKzEwNiwxMiBAQAogICAgIEFDQU1FUkFfU1lOQ19TVEFSVCAgICAgICAgICAgICA9IEFDQU1FUkFfU1lOQyAgICAgICAgICAgICAgPDwgMTYsCiAgICAgQUNBTUVSQV9SRVBST0NFU1NfU1RBUlQgICAgICAgID0gQUNBTUVSQV9SRVBST0NFU1MgICAgICAgICA8PCAxNiwKICAgICBBQ0FNRVJBX0RFUFRIX1NUQVJUICAgICAgICAgICAgPSBBQ0FNRVJBX0RFUFRIICAgICAgICAgICAgIDw8IDE2LAorICAgIEFDQU1FUkFfTE9HSUNBTF9NVUxUSV9DQU1FUkFfU1RBUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBQ0FNRVJBX0xPR0lDQUxfTVVMVElfQ0FNRVJBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgMTYsCisgICAgQUNBTUVSQV9ESVNUT1JUSU9OX0NPUlJFQ1RJT05fU1RBUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBQ0FNRVJBX0RJU1RPUlRJT05fQ09SUkVDVElPTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDE2LAogICAgIEFDQU1FUkFfVkVORE9SX1NUQVJUICAgICAgICAgICA9IEFDQU1FUkFfVkVORE9SICAgICAgICAgICAgPDwgMTYKIH0gYWNhbWVyYV9tZXRhZGF0YV9zZWN0aW9uX3N0YXJ0X3Q7CiAKQEAgLTQ3MSwxMCArNDc5LDYgQEAKICAgICAgKiBPdGhlcndpc2Ugd2lsbCBhbHdheXMgYmUgcHJlc2VudC48L3A+CiAgICAgICogPHA+VGhlIG1heGltdW0gbnVtYmVyIG9mIHJlZ2lvbnMgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UgaXMgZGV0ZXJtaW5lZCBieSB0aGUgdmFsdWUKICAgICAgKiBvZiBhbmRyb2lkLmNvbnRyb2wubWF4UmVnaW9uc0FlLjwvcD4KLSAgICAgKiA8cD5UaGUgZGF0YSByZXByZXNlbnRhdGlvbiBpcyBpbnRbNSAqIGFyZWFfY291bnRdLgotICAgICAqIEV2ZXJ5IGZpdmUgZWxlbWVudHMgcmVwcmVzZW50IGEgbWV0ZXJpbmcgcmVnaW9uIG9mICh4bWluLCB5bWluLCB4bWF4LCB5bWF4LCB3ZWlnaHQpLgotICAgICAqIFRoZSByZWN0YW5nbGUgaXMgZGVmaW5lZCB0byBiZSBpbmNsdXNpdmUgb24geG1pbiBhbmQgeW1pbiwgYnV0IGV4Y2x1c2l2ZSBvbiB4bWF4IGFuZAotICAgICAqIHltYXguPC9wPgogICAgICAqIDxwPlRoZSBjb29yZGluYXRlIHN5c3RlbSBpcyBiYXNlZCBvbiB0aGUgYWN0aXZlIHBpeGVsIGFycmF5LAogICAgICAqIHdpdGggKDAsMCkgYmVpbmcgdGhlIHRvcC1sZWZ0IHBpeGVsIGluIHRoZSBhY3RpdmUgcGl4ZWwgYXJyYXksIGFuZAogICAgICAqIChBQ0FNRVJBX1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFLndpZHRoIC0gMSwKQEAgLTQ5NSw2ICs0OTksMTAgQEAKICAgICAgKiByZWdpb24gYW5kIG91dHB1dCBvbmx5IHRoZSBpbnRlcnNlY3Rpb24gcmVjdGFuZ2xlIGFzIHRoZSBtZXRlcmluZyByZWdpb24gaW4gdGhlIHJlc3VsdAogICAgICAqIG1ldGFkYXRhLiAgSWYgdGhlIHJlZ2lvbiBpcyBlbnRpcmVseSBvdXRzaWRlIHRoZSBjcm9wIHJlZ2lvbiwgaXQgd2lsbCBiZSBpZ25vcmVkIGFuZAogICAgICAqIG5vdCByZXBvcnRlZCBpbiB0aGUgcmVzdWx0IG1ldGFkYXRhLjwvcD4KKyAgICAgKiA8cD5UaGUgZGF0YSByZXByZXNlbnRhdGlvbiBpcyA8Y29kZT5pbnRbNSAqIGFyZWFfY291bnRdPC9jb2RlPi4KKyAgICAgKiBFdmVyeSBmaXZlIGVsZW1lbnRzIHJlcHJlc2VudCBhIG1ldGVyaW5nIHJlZ2lvbiBvZiA8Y29kZT4oeG1pbiwgeW1pbiwgeG1heCwgeW1heCwgd2VpZ2h0KTwvY29kZT4uCisgICAgICogVGhlIHJlY3RhbmdsZSBpcyBkZWZpbmVkIHRvIGJlIGluY2x1c2l2ZSBvbiB4bWluIGFuZCB5bWluLCBidXQgZXhjbHVzaXZlIG9uIHhtYXggYW5kCisgICAgICogeW1heC48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0NBTEVSX0NST1BfUkVHSU9OCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFCkBAIC02MzMsMTAgKzY0MSw2IEBACiAgICAgICogT3RoZXJ3aXNlIHdpbGwgYWx3YXlzIGJlIHByZXNlbnQuPC9wPgogICAgICAqIDxwPlRoZSBtYXhpbXVtIG51bWJlciBvZiBmb2N1cyBhcmVhcyBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSB2YWx1ZQogICAgICAqIG9mIGFuZHJvaWQuY29udHJvbC5tYXhSZWdpb25zQWYuPC9wPgotICAgICAqIDxwPlRoZSBkYXRhIHJlcHJlc2VudGF0aW9uIGlzIGludFs1ICogYXJlYV9jb3VudF0uCi0gICAgICogRXZlcnkgZml2ZSBlbGVtZW50cyByZXByZXNlbnQgYSBtZXRlcmluZyByZWdpb24gb2YgKHhtaW4sIHltaW4sIHhtYXgsIHltYXgsIHdlaWdodCkuCi0gICAgICogVGhlIHJlY3RhbmdsZSBpcyBkZWZpbmVkIHRvIGJlIGluY2x1c2l2ZSBvbiB4bWluIGFuZCB5bWluLCBidXQgZXhjbHVzaXZlIG9uIHhtYXggYW5kCi0gICAgICogeW1heC48L3A+CiAgICAgICogPHA+VGhlIGNvb3JkaW5hdGUgc3lzdGVtIGlzIGJhc2VkIG9uIHRoZSBhY3RpdmUgcGl4ZWwgYXJyYXksCiAgICAgICogd2l0aCAoMCwwKSBiZWluZyB0aGUgdG9wLWxlZnQgcGl4ZWwgaW4gdGhlIGFjdGl2ZSBwaXhlbCBhcnJheSwgYW5kCiAgICAgICogKEFDQU1FUkFfU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkUud2lkdGggLSAxLApAQCAtNjUxLDEyICs2NTUsMTcgQEAKICAgICAgKiBpcyB1c2VkLCBhbGwgbm9uLXplcm8gd2VpZ2h0cyB3aWxsIGhhdmUgdGhlIHNhbWUgZWZmZWN0LiBBIHJlZ2lvbiB3aXRoIDAgd2VpZ2h0IGlzCiAgICAgICogaWdub3JlZC48L3A+CiAgICAgICogPHA+SWYgYWxsIHJlZ2lvbnMgaGF2ZSAwIHdlaWdodCwgdGhlbiBubyBzcGVjaWZpYyBtZXRlcmluZyBhcmVhIG5lZWRzIHRvIGJlIHVzZWQgYnkgdGhlCi0gICAgICogY2FtZXJhIGRldmljZS48L3A+CisgICAgICogY2FtZXJhIGRldmljZS4gVGhlIGNhcHR1cmUgcmVzdWx0IHdpbGwgZWl0aGVyIGJlIGEgemVybyB3ZWlnaHQgcmVnaW9uIGFzIHdlbGwsIG9yCisgICAgICogdGhlIHJlZ2lvbiBzZWxlY3RlZCBieSB0aGUgY2FtZXJhIGRldmljZSBhcyB0aGUgZm9jdXMgYXJlYSBvZiBpbnRlcmVzdC48L3A+CiAgICAgICogPHA+SWYgdGhlIG1ldGVyaW5nIHJlZ2lvbiBpcyBvdXRzaWRlIHRoZSB1c2VkIEFDQU1FUkFfU0NBTEVSX0NST1BfUkVHSU9OIHJldHVybmVkIGluCiAgICAgICogY2FwdHVyZSByZXN1bHQgbWV0YWRhdGEsIHRoZSBjYW1lcmEgZGV2aWNlIHdpbGwgaWdub3JlIHRoZSBzZWN0aW9ucyBvdXRzaWRlIHRoZSBjcm9wCiAgICAgICogcmVnaW9uIGFuZCBvdXRwdXQgb25seSB0aGUgaW50ZXJzZWN0aW9uIHJlY3RhbmdsZSBhcyB0aGUgbWV0ZXJpbmcgcmVnaW9uIGluIHRoZSByZXN1bHQKICAgICAgKiBtZXRhZGF0YS4gSWYgdGhlIHJlZ2lvbiBpcyBlbnRpcmVseSBvdXRzaWRlIHRoZSBjcm9wIHJlZ2lvbiwgaXQgd2lsbCBiZSBpZ25vcmVkIGFuZAogICAgICAqIG5vdCByZXBvcnRlZCBpbiB0aGUgcmVzdWx0IG1ldGFkYXRhLjwvcD4KKyAgICAgKiA8cD5UaGUgZGF0YSByZXByZXNlbnRhdGlvbiBpcyA8Y29kZT5pbnRbNSAqIGFyZWFfY291bnRdPC9jb2RlPi4KKyAgICAgKiBFdmVyeSBmaXZlIGVsZW1lbnRzIHJlcHJlc2VudCBhIG1ldGVyaW5nIHJlZ2lvbiBvZiA8Y29kZT4oeG1pbiwgeW1pbiwgeG1heCwgeW1heCwgd2VpZ2h0KTwvY29kZT4uCisgICAgICogVGhlIHJlY3RhbmdsZSBpcyBkZWZpbmVkIHRvIGJlIGluY2x1c2l2ZSBvbiB4bWluIGFuZCB5bWluLCBidXQgZXhjbHVzaXZlIG9uIHhtYXggYW5kCisgICAgICogeW1heC48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0NBTEVSX0NST1BfUkVHSU9OCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFCkBAIC03OTEsMTAgKzgwMCw2IEBACiAgICAgICogT3RoZXJ3aXNlIHdpbGwgYWx3YXlzIGJlIHByZXNlbnQuPC9wPgogICAgICAqIDxwPlRoZSBtYXhpbXVtIG51bWJlciBvZiByZWdpb25zIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlIGlzIGRldGVybWluZWQgYnkgdGhlIHZhbHVlCiAgICAgICogb2YgYW5kcm9pZC5jb250cm9sLm1heFJlZ2lvbnNBd2IuPC9wPgotICAgICAqIDxwPlRoZSBkYXRhIHJlcHJlc2VudGF0aW9uIGlzIGludFs1ICogYXJlYV9jb3VudF0uCi0gICAgICogRXZlcnkgZml2ZSBlbGVtZW50cyByZXByZXNlbnQgYSBtZXRlcmluZyByZWdpb24gb2YgKHhtaW4sIHltaW4sIHhtYXgsIHltYXgsIHdlaWdodCkuCi0gICAgICogVGhlIHJlY3RhbmdsZSBpcyBkZWZpbmVkIHRvIGJlIGluY2x1c2l2ZSBvbiB4bWluIGFuZCB5bWluLCBidXQgZXhjbHVzaXZlIG9uIHhtYXggYW5kCi0gICAgICogeW1heC48L3A+CiAgICAgICogPHA+VGhlIGNvb3JkaW5hdGUgc3lzdGVtIGlzIGJhc2VkIG9uIHRoZSBhY3RpdmUgcGl4ZWwgYXJyYXksCiAgICAgICogd2l0aCAoMCwwKSBiZWluZyB0aGUgdG9wLWxlZnQgcGl4ZWwgaW4gdGhlIGFjdGl2ZSBwaXhlbCBhcnJheSwgYW5kCiAgICAgICogKEFDQU1FUkFfU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkUud2lkdGggLSAxLApAQCAtODE1LDYgKzgyMCwxMCBAQAogICAgICAqIHJlZ2lvbiBhbmQgb3V0cHV0IG9ubHkgdGhlIGludGVyc2VjdGlvbiByZWN0YW5nbGUgYXMgdGhlIG1ldGVyaW5nIHJlZ2lvbiBpbiB0aGUgcmVzdWx0CiAgICAgICogbWV0YWRhdGEuICBJZiB0aGUgcmVnaW9uIGlzIGVudGlyZWx5IG91dHNpZGUgdGhlIGNyb3AgcmVnaW9uLCBpdCB3aWxsIGJlIGlnbm9yZWQgYW5kCiAgICAgICogbm90IHJlcG9ydGVkIGluIHRoZSByZXN1bHQgbWV0YWRhdGEuPC9wPgorICAgICAqIDxwPlRoZSBkYXRhIHJlcHJlc2VudGF0aW9uIGlzIDxjb2RlPmludFs1ICogYXJlYV9jb3VudF08L2NvZGU+LgorICAgICAqIEV2ZXJ5IGZpdmUgZWxlbWVudHMgcmVwcmVzZW50IGEgbWV0ZXJpbmcgcmVnaW9uIG9mIDxjb2RlPih4bWluLCB5bWluLCB4bWF4LCB5bWF4LCB3ZWlnaHQpPC9jb2RlPi4KKyAgICAgKiBUaGUgcmVjdGFuZ2xlIGlzIGRlZmluZWQgdG8gYmUgaW5jbHVzaXZlIG9uIHhtaW4gYW5kIHltaW4sIGJ1dCBleGNsdXNpdmUgb24geG1heCBhbmQKKyAgICAgKiB5bWF4LjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9TQ0FMRVJfQ1JPUF9SRUdJT04KICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkUKQEAgLTgzNywxMCArODQ2LDEzIEBACiAgICAgICoKICAgICAgKiA8cD5UaGlzIGNvbnRyb2wgKGV4Y2VwdCBmb3IgTUFOVUFMKSBpcyBvbmx5IGVmZmVjdGl2ZSBpZgogICAgICAqIDxjb2RlPkFDQU1FUkFfQ09OVFJPTF9NT0RFICE9IE9GRjwvY29kZT4gYW5kIGFueSAzQSByb3V0aW5lIGlzIGFjdGl2ZS48L3A+Ci0gICAgICogPHA+WkVST19TSFVUVEVSX0xBRyB3aWxsIGJlIHN1cHBvcnRlZCBpZiBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUwotICAgICAqIGNvbnRhaW5zIFBSSVZBVEVfUkVQUk9DRVNTSU5HIG9yIFlVVl9SRVBST0NFU1NJTkcuIE1BTlVBTCB3aWxsIGJlIHN1cHBvcnRlZCBpZgotICAgICAqIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTIGNvbnRhaW5zIE1BTlVBTF9TRU5TT1IuIE90aGVyIGludGVudCB2YWx1ZXMgYXJlCi0gICAgICogYWx3YXlzIHN1cHBvcnRlZC48L3A+CisgICAgICogPHA+QWxsIGludGVudHMgYXJlIHN1cHBvcnRlZCBieSBhbGwgZGV2aWNlcywgZXhjZXB0IHRoYXQ6CisgICAgICogICAqIFpFUk9fU0hVVFRFUl9MQUcgd2lsbCBiZSBzdXBwb3J0ZWQgaWYgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMgY29udGFpbnMKKyAgICAgKiBQUklWQVRFX1JFUFJPQ0VTU0lORyBvciBZVVZfUkVQUk9DRVNTSU5HLgorICAgICAqICAgKiBNQU5VQUwgd2lsbCBiZSBzdXBwb3J0ZWQgaWYgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMgY29udGFpbnMKKyAgICAgKiBNQU5VQUxfU0VOU09SLgorICAgICAqICAgKiBNT1RJT05fVFJBQ0tJTkcgd2lsbCBiZSBzdXBwb3J0ZWQgaWYgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMgY29udGFpbnMKKyAgICAgKiBNT1RJT05fVFJBQ0tJTkcuPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX0NPTlRST0xfTU9ERQogICAgICAqIEBzZWUgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMKQEAgLTg4NSwxMSArODk3LDEwIEBACiAgICAgICogPHA+V2hlbiBzZXQgdG8gQVVUTywgdGhlIGluZGl2aWR1YWwgYWxnb3JpdGhtIGNvbnRyb2xzIGluCiAgICAgICogQUNBTUVSQV9DT05UUk9MXyogYXJlIGluIGVmZmVjdCwgc3VjaCBhcyBBQ0FNRVJBX0NPTlRST0xfQUZfTU9ERS48L3A+CiAgICAgICogPHA+V2hlbiBzZXQgdG8gVVNFX1NDRU5FX01PREUsIHRoZSBpbmRpdmlkdWFsIGNvbnRyb2xzIGluCi0gICAgICogQUNBTUVSQV9DT05UUk9MXyogYXJlIG1vc3RseSBkaXNhYmxlZCwgYW5kIHRoZSBjYW1lcmEgZGV2aWNlIGltcGxlbWVudHMKLSAgICAgKiBvbmUgb2YgdGhlIHNjZW5lIG1vZGUgc2V0dGluZ3MgKHN1Y2ggYXMgQUNUSU9OLCBTVU5TRVQsIG9yIFBBUlRZKQotICAgICAqIGFzIGl0IHdpc2hlcy4gVGhlIGNhbWVyYSBkZXZpY2Ugc2NlbmUgbW9kZSAzQSBzZXR0aW5ncyBhcmUgcHJvdmlkZWQgYnkKLSAgICAgKiBjYXB0dXJlIHJlc3VsdHMge0BsaW5rIEFDYW1lcmFNZXRhZGF0YX0gZnJvbQotICAgICAqIHtAbGluayBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdH0uPC9wPgorICAgICAqIEFDQU1FUkFfQ09OVFJPTF8qIGFyZSBtb3N0bHkgZGlzYWJsZWQsIGFuZCB0aGUgY2FtZXJhIGRldmljZQorICAgICAqIGltcGxlbWVudHMgb25lIG9mIHRoZSBzY2VuZSBtb2RlIHNldHRpbmdzIChzdWNoIGFzIEFDVElPTiwKKyAgICAgKiBTVU5TRVQsIG9yIFBBUlRZKSBhcyBpdCB3aXNoZXMuIFRoZSBjYW1lcmEgZGV2aWNlIHNjZW5lIG1vZGUKKyAgICAgKiAzQSBzZXR0aW5ncyBhcmUgcHJvdmlkZWQgYnkge0BsaW5rIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IGNhcHR1cmUgcmVzdWx0c30uPC9wPgogICAgICAqIDxwPldoZW4gc2V0IHRvIE9GRl9LRUVQX1NUQVRFLCBpdCBpcyBzaW1pbGFyIHRvIE9GRiBtb2RlLCB0aGUgb25seSBkaWZmZXJlbmNlCiAgICAgICogaXMgdGhhdCB0aGlzIGZyYW1lIHdpbGwgbm90IGJlIHVzZWQgYnkgY2FtZXJhIGRldmljZSBiYWNrZ3JvdW5kIDNBIHN0YXRpc3RpY3MKICAgICAgKiB1cGRhdGUsIGFzIGlmIHRoaXMgZnJhbWUgaXMgbmV2ZXIgY2FwdHVyZWQuIFRoaXMgbW9kZSBjYW4gYmUgdXNlZCBpbiB0aGUgc2NlbmFyaW8KQEAgLTEwNDMsMjAgKzEwNTQsMTggQEAKICAgICAgKiA8cD5Gb3IgY29uc3RhbnQtZnJhbWVyYXRlIHJlY29yZGluZywgZm9yIGVhY2ggbm9ybWFsCiAgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvbWVkaWEvQ2FtY29yZGVyUHJvZmlsZS5odG1sIj5DYW1jb3JkZXJQcm9maWxlPC9hPiwgdGhhdCBpcywgYQogICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL21lZGlhL0NhbWNvcmRlclByb2ZpbGUuaHRtbCI+Q2FtY29yZGVyUHJvZmlsZTwvYT4gdGhhdCBoYXMKLSAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9tZWRpYS9DYW1jb3JkZXJQcm9maWxlLmh0bWwjcXVhbGl0eSI+cXVhbGl0eTwvYT4KLSAgICAgKiBpbiB0aGUgcmFuZ2UgWwotICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL21lZGlhL0NhbWNvcmRlclByb2ZpbGUuaHRtbCNRVUFMSVRZX0xPVyI+UVVBTElUWV9MT1c8L2E+LAotICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL21lZGlhL0NhbWNvcmRlclByb2ZpbGUuaHRtbCNRVUFMSVRZXzIxNjBQIj5RVUFMSVRZXzIxNjBQPC9hPl0sCi0gICAgICogaWYgdGhlIHByb2ZpbGUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UgYW5kIGhhcwotICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL21lZGlhL0NhbWNvcmRlclByb2ZpbGUuaHRtbCN2aWRlb0ZyYW1lUmF0ZSI+dmlkZW9GcmFtZVJhdGU8L2E+Ci0gICAgICogPGNvZGU+eDwvY29kZT4sIHRoaXMgbGlzdCB3aWxsIGFsd2F5cyBpbmNsdWRlICg8Y29kZT54PC9jb2RlPiw8Y29kZT54PC9jb2RlPikuPC9wPgorICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL21lZGlhL0NhbWNvcmRlclByb2ZpbGUuaHRtbCNxdWFsaXR5Ij5xdWFsaXR5PC9hPiBpbgorICAgICAqIHRoZSByYW5nZSBbPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvbWVkaWEvQ2FtY29yZGVyUHJvZmlsZS5odG1sI1FVQUxJVFlfTE9XIj5RVUFMSVRZX0xPVzwvYT4sCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvbWVkaWEvQ2FtY29yZGVyUHJvZmlsZS5odG1sI1FVQUxJVFlfMjE2MFAiPlFVQUxJVFlfMjE2MFA8L2E+XSwgaWYgdGhlIHByb2ZpbGUgaXMKKyAgICAgKiBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZSBhbmQgaGFzCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvbWVkaWEvQ2FtY29yZGVyUHJvZmlsZS5odG1sI3ZpZGVvRnJhbWVSYXRlIj52aWRlb0ZyYW1lUmF0ZTwvYT4gPGNvZGU+eDwvY29kZT4sIHRoaXMgbGlzdCB3aWxsCisgICAgICogYWx3YXlzIGluY2x1ZGUgKDxjb2RlPng8L2NvZGU+LDxjb2RlPng8L2NvZGU+KS48L3A+CiAgICAgICogPC9saT4KICAgICAgKiA8bGk+CiAgICAgICogPHA+QWxzbywgYSBjYW1lcmEgZGV2aWNlIG11c3QgZWl0aGVyIG5vdCBzdXBwb3J0IGFueQogICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL21lZGlhL0NhbWNvcmRlclByb2ZpbGUuaHRtbCI+Q2FtY29yZGVyUHJvZmlsZTwvYT4sCiAgICAgICogb3Igc3VwcG9ydCBhdCBsZWFzdCBvbmUKLSAgICAgKiBub3JtYWwgPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvbWVkaWEvQ2FtY29yZGVyUHJvZmlsZS5odG1sIj5DYW1jb3JkZXJQcm9maWxlPC9hPgotICAgICAqIHRoYXQgaGFzCisgICAgICogbm9ybWFsIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL21lZGlhL0NhbWNvcmRlclByb2ZpbGUuaHRtbCI+Q2FtY29yZGVyUHJvZmlsZTwvYT4gdGhhdCBoYXMKICAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9tZWRpYS9DYW1jb3JkZXJQcm9maWxlLmh0bWwjdmlkZW9GcmFtZVJhdGUiPnZpZGVvRnJhbWVSYXRlPC9hPiA8Y29kZT54PC9jb2RlPiAmZ3Q7PSAyNC48L3A+CiAgICAgICogPC9saT4KICAgICAgKiA8L3VsPgpAQCAtMTI4Miw3ICsxMjkxLDcgQEAKICAgICAgKiA8cD5TdGF0ZSAgICAgICB8IFRyYW5zaXRpb24gQ2F1c2UgfCBOZXcgU3RhdGUgfCBOb3RlcwogICAgICAqIDotLS0tLS0tLS0tLS06fDotLS0tLS0tLS0tLS0tLS0tOnw6LS0tLS0tLS0tOnw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS06CiAgICAgICogSU5BQ1RJVkUgICAgICB8ICAgICAgICAgICAgICAgICAgfCBJTkFDVElWRSAgfCBDYW1lcmEgZGV2aWNlIGF1dG8gZXhwb3N1cmUgYWxnb3JpdGhtIGlzIGRpc2FibGVkPC9wPgotICAgICAqIDxwPldoZW4gQUNBTUVSQV9DT05UUk9MX0FFX01PREUgaXMgQUVfTU9ERV9PTl8qOjwvcD4KKyAgICAgKiA8cD5XaGVuIEFDQU1FUkFfQ09OVFJPTF9BRV9NT0RFIGlzIEFFX01PREVfT04qOjwvcD4KICAgICAgKiA8cD5TdGF0ZSAgICAgICAgfCBUcmFuc2l0aW9uIENhdXNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5ldyBTdGF0ZSAgICAgIHwgTm90ZXMKICAgICAgKiA6LS0tLS0tLS0tLS0tLTp8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tOnw6LS0tLS0tLS0tLS0tLS06fDotLS0tLS0tLS0tLS0tLS0tLToKICAgICAgKiBJTkFDVElWRSAgICAgICB8IENhbWVyYSBkZXZpY2UgaW5pdGlhdGVzIEFFIHNjYW4gICAgICAgICAgICAgIHwgU0VBUkNISU5HICAgICAgfCBWYWx1ZXMgY2hhbmdpbmcKQEAgLTEzMDMsMTAgKzEzMTIsMTMgQEAKICAgICAgKiBMT0NLRUQgICAgICAgICB8IGFlTG9jayBpcyBPTiBhbmQgYWVQcmVjYXB0dXJlVHJpZ2dlciBpcyBDQU5DRUx8IExPQ0tFRCAgICAgICAgfCBQcmVjYXB0dXJlIHRyaWdnZXIgaXMgaWdub3JlZCB3aGVuIEFFIGlzIGFscmVhZHkgbG9ja2VkCiAgICAgICogQW55IHN0YXRlIChleGNsdWRpbmcgTE9DS0VEKSB8IEFDQU1FUkFfQ09OVFJPTF9BRV9QUkVDQVBUVVJFX1RSSUdHRVIgaXMgU1RBUlQgfCBQUkVDQVBUVVJFICAgICB8IFN0YXJ0IEFFIHByZWNhcHR1cmUgbWV0ZXJpbmcgc2VxdWVuY2UKICAgICAgKiBBbnkgc3RhdGUgKGV4Y2x1ZGluZyBMT0NLRUQpIHwgQUNBTUVSQV9DT05UUk9MX0FFX1BSRUNBUFRVUkVfVFJJR0dFUiBpcyBDQU5DRUx8IElOQUNUSVZFICAgICAgIHwgQ3VycmVudGx5IGFjdGl2ZSBwcmVjYXB0dXJlIG1ldGVyaW5nIHNlcXVlbmNlIGlzIGNhbmNlbGVkPC9wPgorICAgICAqIDxwPklmIHRoZSBjYW1lcmEgZGV2aWNlIHN1cHBvcnRzIEFFIGV4dGVybmFsIGZsYXNoIG1vZGUgKE9OX0VYVEVSTkFMX0ZMQVNIIGlzIGluY2x1ZGVkIGluCisgICAgICogQUNBTUVSQV9DT05UUk9MX0FFX0FWQUlMQUJMRV9NT0RFUyksIEFDQU1FUkFfQ09OVFJPTF9BRV9TVEFURSBtdXN0IGJlIEZMQVNIX1JFUVVJUkVEIGFmdGVyCisgICAgICogdGhlIGNhbWVyYSBkZXZpY2UgZmluaXNoZXMgQUUgc2NhbiBhbmQgaXQncyB0b28gZGFyayB3aXRob3V0IGZsYXNoLjwvcD4KICAgICAgKiA8cD5Gb3IgdGhlIGFib3ZlIHRhYmxlLCB0aGUgY2FtZXJhIGRldmljZSBtYXkgc2tpcCByZXBvcnRpbmcgYW55IHN0YXRlIGNoYW5nZXMgdGhhdCBoYXBwZW4KICAgICAgKiB3aXRob3V0IGFwcGxpY2F0aW9uIGludGVydmVudGlvbiAoaS5lLiBtb2RlIHN3aXRjaCwgdHJpZ2dlciwgbG9ja2luZykuIEFueSBzdGF0ZSB0aGF0CiAgICAgICogY2FuIGJlIHNraXBwZWQgaW4gdGhhdCBtYW5uZXIgaXMgY2FsbGVkIGEgdHJhbnNpZW50IHN0YXRlLjwvcD4KLSAgICAgKiA8cD5Gb3IgZXhhbXBsZSwgZm9yIGFib3ZlIEFFIG1vZGVzIChBRV9NT0RFX09OXyopLCBpbiBhZGRpdGlvbiB0byB0aGUgc3RhdGUgdHJhbnNpdGlvbnMKKyAgICAgKiA8cD5Gb3IgZXhhbXBsZSwgZm9yIGFib3ZlIEFFIG1vZGVzIChBRV9NT0RFX09OKiksIGluIGFkZGl0aW9uIHRvIHRoZSBzdGF0ZSB0cmFuc2l0aW9ucwogICAgICAqIGxpc3RlZCBpbiBhYm92ZSB0YWJsZSwgaXQgaXMgYWxzbyBsZWdhbCBmb3IgdGhlIGNhbWVyYSBkZXZpY2UgdG8gc2tpcCBvbmUgb3IgbW9yZQogICAgICAqIHRyYW5zaWVudCBzdGF0ZXMgYmV0d2VlbiB0d28gcmVzdWx0cy4gU2VlIGJlbG93IHRhYmxlIGZvciBleGFtcGxlczo8L3A+CiAgICAgICogPHA+U3RhdGUgICAgICAgIHwgVHJhbnNpdGlvbiBDYXVzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOZXcgU3RhdGUgICAgICB8IE5vdGVzCkBAIC0xMzE5LDkgKzEzMzEsMTEgQEAKICAgICAgKiBDT05WRVJHRUQgICAgICB8IENhbWVyYSBkZXZpY2UgZmluaXNoZWQgQUUgc2NhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRkxBU0hfUkVRVUlSRUQgfCBDb252ZXJnZWQgYnV0IHRvbyBkYXJrIHcvbyBmbGFzaCBhZnRlciBhIG5ldyBzY2FuLCB0cmFuc2llbnQgc3RhdGVzIGFyZSBza2lwcGVkIGJ5IGNhbWVyYSBkZXZpY2UuCiAgICAgICogRkxBU0hfUkVRVUlSRUQgfCBDYW1lcmEgZGV2aWNlIGZpbmlzaGVkIEFFIHNjYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENPTlZFUkdFRCAgICAgIHwgQ29udmVyZ2VkIGFmdGVyIGEgbmV3IHNjYW4sIHRyYW5zaWVudCBzdGF0ZXMgYXJlIHNraXBwZWQgYnkgY2FtZXJhIGRldmljZS48L3A+CiAgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfQ09OVFJPTF9BRV9BVkFJTEFCTEVfTU9ERVMKICAgICAgKiBAc2VlIEFDQU1FUkFfQ09OVFJPTF9BRV9MT0NLCiAgICAgICogQHNlZSBBQ0FNRVJBX0NPTlRST0xfQUVfTU9ERQogICAgICAqIEBzZWUgQUNBTUVSQV9DT05UUk9MX0FFX1BSRUNBUFRVUkVfVFJJR0dFUgorICAgICAqIEBzZWUgQUNBTUVSQV9DT05UUk9MX0FFX1NUQVRFCiAgICAgICogQHNlZSBBQ0FNRVJBX0NPTlRST0xfTU9ERQogICAgICAqIEBzZWUgQUNBTUVSQV9DT05UUk9MX1NDRU5FX01PREUKICAgICAgKi8KQEAgLTE2MTksMTMgKzE2MzMsMTMgQEAKICAgICAgKiBjb21wYXJlZCB0byBwcmV2aW91cyByZWd1bGFyIHJlcXVlc3RzLiBlbmFibGVac2wgZG9lcyBub3QgYWZmZWN0IHJlcXVlc3RzIHdpdGggb3RoZXIKICAgICAgKiBjYXB0dXJlIGludGVudHMuPC9wPgogICAgICAqIDxwPkZvciBleGFtcGxlLCB3aGVuIHJlcXVlc3RzIGFyZSBzdWJtaXR0ZWQgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKLSAgICAgKiAgIFJlcXVlc3QgQTogZW5hYmxlWnNsIGlzIDxjb2RlPnRydWU8L2NvZGU+LCBBQ0FNRVJBX0NPTlRST0xfQ0FQVFVSRV9JTlRFTlQgaXMgUFJFVklFVwotICAgICAqICAgUmVxdWVzdCBCOiBlbmFibGVac2wgaXMgPGNvZGU+dHJ1ZTwvY29kZT4sIEFDQU1FUkFfQ09OVFJPTF9DQVBUVVJFX0lOVEVOVCBpcyBTVElMTF9DQVBUVVJFPC9wPgorICAgICAqICAgUmVxdWVzdCBBOiBlbmFibGVac2wgaXMgT04sIEFDQU1FUkFfQ09OVFJPTF9DQVBUVVJFX0lOVEVOVCBpcyBQUkVWSUVXCisgICAgICogICBSZXF1ZXN0IEI6IGVuYWJsZVpzbCBpcyBPTiwgQUNBTUVSQV9DT05UUk9MX0NBUFRVUkVfSU5URU5UIGlzIFNUSUxMX0NBUFRVUkU8L3A+CiAgICAgICogPHA+VGhlIG91dHB1dCBpbWFnZXMgZm9yIHJlcXVlc3QgQiBtYXkgaGF2ZSBjb250ZW50cyBjYXB0dXJlZCBiZWZvcmUgdGhlIG91dHB1dCBpbWFnZXMgZm9yCiAgICAgICogcmVxdWVzdCBBLCBhbmQgdGhlIHJlc3VsdCBtZXRhZGF0YSBmb3IgcmVxdWVzdCBCIG1heSBiZSBvbGRlciB0aGFuIHRoZSByZXN1bHQgbWV0YWRhdGEgZm9yCiAgICAgICogcmVxdWVzdCBBLjwvcD4KLSAgICAgKiA8cD5Ob3RlIHRoYXQgd2hlbiBlbmFibGVac2wgaXMgPGNvZGU+dHJ1ZTwvY29kZT4sIGl0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGdldCBvdXRwdXQgaW1hZ2VzIGNhcHR1cmVkIGluIHRoZQotICAgICAqIHBhc3QgZm9yIHJlcXVlc3RzIHdpdGggU1RJTExfQ0FQVFVSRSBjYXB0dXJlIGludGVudC48L3A+CisgICAgICogPHA+Tm90ZSB0aGF0IHdoZW4gZW5hYmxlWnNsIGlzIDxjb2RlPnRydWU8L2NvZGU+LCBpdCBpcyBub3QgZ3VhcmFudGVlZCB0byBnZXQgb3V0cHV0IGltYWdlcyBjYXB0dXJlZCBpbgorICAgICAqIHRoZSBwYXN0IGZvciByZXF1ZXN0cyB3aXRoIFNUSUxMX0NBUFRVUkUgY2FwdHVyZSBpbnRlbnQuPC9wPgogICAgICAqIDxwPkZvciBhcHBsaWNhdGlvbnMgdGFyZ2V0aW5nIFNESyB2ZXJzaW9ucyBPIGFuZCBuZXdlciwgdGhlIHZhbHVlIG9mIGVuYWJsZVpzbCBpbgogICAgICAqIFRFTVBMQVRFX1NUSUxMX0NBUFRVUkUgdGVtcGxhdGUgbWF5IGJlIDxjb2RlPnRydWU8L2NvZGU+LiBUaGUgdmFsdWUgaW4gb3RoZXIgdGVtcGxhdGVzIGlzIGFsd2F5cwogICAgICAqIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBwcmVzZW50LjwvcD4KQEAgLTE2MzgsNiArMTY1MiwyNiBAQAogICAgICAqLwogICAgIEFDQU1FUkFfQ09OVFJPTF9FTkFCTEVfWlNMID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5dGUgKGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2NvbnRyb2xfZW5hYmxlX3pzbF90KQogICAgICAgICAgICAgQUNBTUVSQV9DT05UUk9MX1NUQVJUICsgNDEsCisgICAgLyoqCisgICAgICogPHA+V2hldGhlciBhIHNpZ25pZmljYW50IHNjZW5lIGNoYW5nZSBpcyBkZXRlY3RlZCB3aXRoaW4gdGhlIGN1cnJlbnRseS1zZXQgQUYKKyAgICAgKiByZWdpb24ocykuPC9wPgorICAgICAqCisgICAgICogPHA+VHlwZTogYnl0ZSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfY29udHJvbF9hZl9zY2VuZV9jaGFuZ2VfdCk8L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCBjYWxsYmFja3M8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+V2hlbiB0aGUgY2FtZXJhIGZvY3VzIHJvdXRpbmUgZGV0ZWN0cyBhIGNoYW5nZSBpbiB0aGUgc2NlbmUgaXQgaXMgbG9va2luZyBhdCwKKyAgICAgKiBzdWNoIGFzIGEgbGFyZ2Ugc2hpZnQgaW4gY2FtZXJhIHZpZXdwb2ludCwgc2lnbmlmaWNhbnQgbW90aW9uIGluIHRoZSBzY2VuZSwgb3IgYQorICAgICAqIHNpZ25pZmljYW50IGlsbHVtaW5hdGlvbiBjaGFuZ2UsIHRoaXMgdmFsdWUgd2lsbCBiZSBzZXQgdG8gREVURUNURUQgZm9yIGEgc2luZ2xlIGNhcHR1cmUKKyAgICAgKiByZXN1bHQuIE90aGVyd2lzZSB0aGUgdmFsdWUgd2lsbCBiZSBOT1RfREVURUNURUQuIFRoZSB0aHJlc2hvbGQgZm9yIGRldGVjdGlvbiBpcyBzaW1pbGFyCisgICAgICogdG8gd2hhdCB3b3VsZCB0cmlnZ2VyIGEgbmV3IHBhc3NpdmUgZm9jdXMgc2NhbiB0byBiZWdpbiBpbiBDT05USU5VT1VTIGF1dG9mb2N1cyBtb2Rlcy48L3A+CisgICAgICogPHA+VGhpcyBrZXkgd2lsbCBiZSBhdmFpbGFibGUgaWYgdGhlIGNhbWVyYSBkZXZpY2UgYWR2ZXJ0aXNlcyB0aGlzIGtleSB2aWEge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUkVTVUxUX0tFWVMgfS48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9DT05UUk9MX0FGX1NDRU5FX0NIQU5HRSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnl0ZSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfY29udHJvbF9hZl9zY2VuZV9jaGFuZ2VfdCkKKyAgICAgICAgICAgIEFDQU1FUkFfQ09OVFJPTF9TVEFSVCArIDQyLAogICAgIEFDQU1FUkFfQ09OVFJPTF9FTkQsCiAKICAgICAvKioKQEAgLTE4NzksOCArMTkxMyw4IEBACiAgICAgICogdGhlIHRodW1ibmFpbCBkYXRhIHdpbGwgYWxzbyBiZSByb3RhdGVkLjwvcD4KICAgICAgKiA8cD5Ob3RlIHRoYXQgdGhpcyBvcmllbnRhdGlvbiBpcyByZWxhdGl2ZSB0byB0aGUgb3JpZW50YXRpb24gb2YgdGhlIGNhbWVyYSBzZW5zb3IsIGdpdmVuCiAgICAgICogYnkgQUNBTUVSQV9TRU5TT1JfT1JJRU5UQVRJT04uPC9wPgotICAgICAqIDxwPlRvIHRyYW5zbGF0ZSBmcm9tIHRoZSBkZXZpY2Ugb3JpZW50YXRpb24gZ2l2ZW4gYnkgdGhlIEFuZHJvaWQgc2Vuc29yIEFQSXMsIHRoZSBmb2xsb3dpbmcKLSAgICAgKiBzYW1wbGUgY29kZSBtYXkgYmUgdXNlZDo8L3A+CisgICAgICogPHA+VG8gdHJhbnNsYXRlIGZyb20gdGhlIGRldmljZSBvcmllbnRhdGlvbiBnaXZlbiBieSB0aGUgQW5kcm9pZCBzZW5zb3IgQVBJcyBmb3IgY2FtZXJhCisgICAgICogc2Vuc29ycyB3aGljaCBhcmUgbm90IEVYVEVSTkFMLCB0aGUgZm9sbG93aW5nIHNhbXBsZSBjb2RlIG1heSBiZSB1c2VkOjwvcD4KICAgICAgKiA8cHJlPjxjb2RlPnByaXZhdGUgaW50IGdldEpwZWdPcmllbnRhdGlvbihDYW1lcmFDaGFyYWN0ZXJpc3RpY3MgYywgaW50IGRldmljZU9yaWVudGF0aW9uKSB7CiAgICAgICogICAgIGlmIChkZXZpY2VPcmllbnRhdGlvbiA9PSBhbmRyb2lkLnZpZXcuT3JpZW50YXRpb25FdmVudExpc3RlbmVyLk9SSUVOVEFUSU9OX1VOS05PV04pIHJldHVybiAwOwogICAgICAqICAgICBpbnQgc2Vuc29yT3JpZW50YXRpb24gPSBjLmdldChDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuU0VOU09SX09SSUVOVEFUSU9OKTsKQEAgLTE4OTksNiArMTkzMyw4IEBACiAgICAgICogICAgIHJldHVybiBqcGVnT3JpZW50YXRpb247CiAgICAgICogfQogICAgICAqIDwvY29kZT48L3ByZT4KKyAgICAgKiA8cD5Gb3IgRVhURVJOQUwgY2FtZXJhcyB0aGUgc2Vuc29yIG9yaWVudGF0aW9uIHdpbGwgYWx3YXlzIGJlIHNldCB0byAwIGFuZCB0aGUgZmFjaW5nIHdpbGwKKyAgICAgKiBhbHNvIGJlIHNldCB0byBFWFRFUk5BTC4gVGhlIGFib3ZlIGNvZGUgaXMgbm90IHJlbGV2YW50IGluIHN1Y2ggY2FzZS48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX09SSUVOVEFUSU9OCiAgICAgICovCkBAIC0xOTU5LDE0ICsxOTk1LDE0IEBACiAgICAgICogPHA+V2hlbiBhbiBBQ0FNRVJBX0pQRUdfT1JJRU5UQVRJT04gb2Ygbm9uLXplcm8gZGVncmVlIGlzIHJlcXVlc3RlZCwKICAgICAgKiB0aGUgY2FtZXJhIGRldmljZSB3aWxsIGhhbmRsZSB0aHVtYm5haWwgcm90YXRpb24gaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgd2F5czo8L3A+CiAgICAgICogPHVsPgotICAgICAqIDxsaT5TZXQgdGhlCi0gICAgICogICA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9tZWRpYS9FeGlmSW50ZXJmYWNlLmh0bWwjVEFHX09SSUVOVEFUSU9OIj5FWElGIG9yaWVudGF0aW9uIGZsYWc8L2E+CisgICAgICogPGxpPlNldCB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvbWVkaWEvRXhpZkludGVyZmFjZS5odG1sI1RBR19PUklFTlRBVElPTiI+RVhJRiBvcmllbnRhdGlvbiBmbGFnPC9hPgogICAgICAqICAgYW5kIGtlZXAganBlZyBhbmQgdGh1bWJuYWlsIGltYWdlIGRhdGEgdW5yb3RhdGVkLjwvbGk+CiAgICAgICogPGxpPlJvdGF0ZSB0aGUganBlZyBhbmQgdGh1bWJuYWlsIGltYWdlIGRhdGEgYW5kIG5vdCBzZXQKLSAgICAgKiAgIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL21lZGlhL0V4aWZJbnRlcmZhY2UuaHRtbCNUQUdfT1JJRU5UQVRJT04iPkVYSUYgb3JpZW50YXRpb24gZmxhZzwvYT4uCi0gICAgICogICBJbiB0aGlzIGNhc2UsIExJTUlURUQgb3IgRlVMTCBoYXJkd2FyZSBsZXZlbCBkZXZpY2VzIHdpbGwgcmVwb3J0IHJvdGF0ZWQgdGh1bW5haWwgc2l6ZQotICAgICAqICAgaW4gY2FwdHVyZSByZXN1bHQsIHNvIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IHdpbGwgYmUgaW50ZXJjaGFuZ2VkIGlmIDkwIG9yIDI3MCBkZWdyZWUKLSAgICAgKiAgIG9yaWVudGF0aW9uIGlzIHJlcXVlc3RlZC4gTEVHQUNZIGRldmljZSB3aWxsIGFsd2F5cyByZXBvcnQgdW5yb3RhdGVkIHRodW1ibmFpbCBzaXplLjwvbGk+CisgICAgICogICA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9tZWRpYS9FeGlmSW50ZXJmYWNlLmh0bWwjVEFHX09SSUVOVEFUSU9OIj5FWElGIG9yaWVudGF0aW9uIGZsYWc8L2E+LiBJbiB0aGlzCisgICAgICogICBjYXNlLCBMSU1JVEVEIG9yIEZVTEwgaGFyZHdhcmUgbGV2ZWwgZGV2aWNlcyB3aWxsIHJlcG9ydCByb3RhdGVkIHRodW1uYWlsIHNpemUgaW4KKyAgICAgKiAgIGNhcHR1cmUgcmVzdWx0LCBzbyB0aGUgd2lkdGggYW5kIGhlaWdodCB3aWxsIGJlIGludGVyY2hhbmdlZCBpZiA5MCBvciAyNzAgZGVncmVlCisgICAgICogICBvcmllbnRhdGlvbiBpcyByZXF1ZXN0ZWQuIExFR0FDWSBkZXZpY2Ugd2lsbCBhbHdheXMgcmVwb3J0IHVucm90YXRlZCB0aHVtYm5haWwKKyAgICAgKiAgIHNpemUuPC9saT4KICAgICAgKiA8L3VsPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX0pQRUdfT1JJRU5UQVRJT04KQEAgLTIyMTYsMzcgKzIyNTIsMzMgQEAKICAgICAgKiA8L3VsPjwvcD4KICAgICAgKgogICAgICAqIDxwPlRoZSBwb3NpdGlvbiBvZiB0aGUgY2FtZXJhIGRldmljZSdzIGxlbnMgb3B0aWNhbCBjZW50ZXIsCi0gICAgICogYXMgYSB0aHJlZS1kaW1lbnNpb25hbCB2ZWN0b3IgPGNvZGU+KHgseSx6KTwvY29kZT4sIHJlbGF0aXZlIHRvIHRoZQotICAgICAqIG9wdGljYWwgY2VudGVyIG9mIHRoZSBsYXJnZXN0IGNhbWVyYSBkZXZpY2UgZmFjaW5nIGluIHRoZQotICAgICAqIHNhbWUgZGlyZWN0aW9uIGFzIHRoaXMgY2FtZXJhLCBpbiB0aGUKLSAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9TZW5zb3JFdmVudC5odG1sIj5BbmRyb2lkIHNlbnNvciBjb29yZGluYXRlIGF4ZXM8L2E+LgotICAgICAqIE5vdGUgdGhhdCBvbmx5IHRoZSBheGlzIGRlZmluaXRpb25zIGFyZSBzaGFyZWQgd2l0aAotICAgICAqIHRoZSBzZW5zb3IgY29vcmRpbmF0ZSBzeXN0ZW0sIGJ1dCBub3QgdGhlIG9yaWdpbi48L3A+Ci0gICAgICogPHA+SWYgdGhpcyBkZXZpY2UgaXMgdGhlIGxhcmdlc3Qgb3Igb25seSBjYW1lcmEgZGV2aWNlIHdpdGggYQotICAgICAqIGdpdmVuIGZhY2luZywgdGhlbiB0aGlzIHBvc2l0aW9uIHdpbGwgYmUgPGNvZGU+KDAsIDAsIDApPC9jb2RlPjsgYQotICAgICAqIGNhbWVyYSBkZXZpY2Ugd2l0aCBhIGxlbnMgb3B0aWNhbCBjZW50ZXIgbG9jYXRlZCAzIGNtIGZyb20KLSAgICAgKiB0aGUgbWFpbiBzZW5zb3IgYWxvbmcgdGhlICtYIGF4aXMgKHRvIHRoZSByaWdodCBmcm9tIHRoZQotICAgICAqIHVzZXIncyBwZXJzcGVjdGl2ZSkgd2lsbCByZXBvcnQgPGNvZGU+KDAuMDMsIDAsIDApPC9jb2RlPi48L3A+Ci0gICAgICogPHA+VG8gdHJhbnNmb3JtIGEgcGl4ZWwgY29vcmRpbmF0ZXMgYmV0d2VlbiB0d28gY2FtZXJhcwotICAgICAqIGZhY2luZyB0aGUgc2FtZSBkaXJlY3Rpb24sIGZpcnN0IHRoZSBzb3VyY2UgY2FtZXJhCi0gICAgICogQUNBTUVSQV9MRU5TX1JBRElBTF9ESVNUT1JUSU9OIG11c3QgYmUgY29ycmVjdGVkIGZvci4gIFRoZW4KLSAgICAgKiB0aGUgc291cmNlIGNhbWVyYSBBQ0FNRVJBX0xFTlNfSU5UUklOU0lDX0NBTElCUkFUSU9OIG5lZWRzCi0gICAgICogdG8gYmUgYXBwbGllZCwgZm9sbG93ZWQgYnkgdGhlIEFDQU1FUkFfTEVOU19QT1NFX1JPVEFUSU9OCi0gICAgICogb2YgdGhlIHNvdXJjZSBjYW1lcmEsIHRoZSB0cmFuc2xhdGlvbiBvZiB0aGUgc291cmNlIGNhbWVyYQotICAgICAqIHJlbGF0aXZlIHRvIHRoZSBkZXN0aW5hdGlvbiBjYW1lcmEsIHRoZQotICAgICAqIEFDQU1FUkFfTEVOU19QT1NFX1JPVEFUSU9OIG9mIHRoZSBkZXN0aW5hdGlvbiBjYW1lcmEsIGFuZAotICAgICAqIGZpbmFsbHkgdGhlIGludmVyc2Ugb2YgQUNBTUVSQV9MRU5TX0lOVFJJTlNJQ19DQUxJQlJBVElPTgotICAgICAqIG9mIHRoZSBkZXN0aW5hdGlvbiBjYW1lcmEuIFRoaXMgb2J0YWlucyBhCi0gICAgICogcmFkaWFsLWRpc3RvcnRpb24tZnJlZSBjb29yZGluYXRlIGluIHRoZSBkZXN0aW5hdGlvbgotICAgICAqIGNhbWVyYSBwaXhlbCBjb29yZGluYXRlcy48L3A+Ci0gICAgICogPHA+VG8gY29tcGFyZSB0aGlzIGFnYWluc3QgYSByZWFsIGltYWdlIGZyb20gdGhlIGRlc3RpbmF0aW9uCi0gICAgICogY2FtZXJhLCB0aGUgZGVzdGluYXRpb24gY2FtZXJhIGltYWdlIHRoZW4gbmVlZHMgdG8gYmUKLSAgICAgKiBjb3JyZWN0ZWQgZm9yIHJhZGlhbCBkaXN0b3J0aW9uIGJlZm9yZSBjb21wYXJpc29uIG9yCi0gICAgICogc2FtcGxpbmcuPC9wPgorICAgICAqIGFzIGEgdGhyZWUtZGltZW5zaW9uYWwgdmVjdG9yIDxjb2RlPih4LHkseik8L2NvZGU+LjwvcD4KKyAgICAgKiA8cD5QcmlvciB0byBBbmRyb2lkIFAsIG9yIHdoZW4gQUNBTUVSQV9MRU5TX1BPU0VfUkVGRVJFTkNFIGlzIFBSSU1BUllfQ0FNRVJBLCB0aGlzIHBvc2l0aW9uCisgICAgICogaXMgcmVsYXRpdmUgdG8gdGhlIG9wdGljYWwgY2VudGVyIG9mIHRoZSBsYXJnZXN0IGNhbWVyYSBkZXZpY2UgZmFjaW5nIGluIHRoZSBzYW1lCisgICAgICogZGlyZWN0aW9uIGFzIHRoaXMgY2FtZXJhLCBpbiB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvU2Vuc29yRXZlbnQuaHRtbCI+QW5kcm9pZCBzZW5zb3IKKyAgICAgKiBjb29yZGluYXRlIGF4ZXM8L2E+LiBOb3RlIHRoYXQgb25seSB0aGUgYXhpcyBkZWZpbml0aW9ucyBhcmUgc2hhcmVkIHdpdGggdGhlIHNlbnNvcgorICAgICAqIGNvb3JkaW5hdGUgc3lzdGVtLCBidXQgbm90IHRoZSBvcmlnaW4uPC9wPgorICAgICAqIDxwPklmIHRoaXMgZGV2aWNlIGlzIHRoZSBsYXJnZXN0IG9yIG9ubHkgY2FtZXJhIGRldmljZSB3aXRoIGEgZ2l2ZW4gZmFjaW5nLCB0aGVuIHRoaXMKKyAgICAgKiBwb3NpdGlvbiB3aWxsIGJlIDxjb2RlPigwLCAwLCAwKTwvY29kZT47IGEgY2FtZXJhIGRldmljZSB3aXRoIGEgbGVucyBvcHRpY2FsIGNlbnRlciBsb2NhdGVkIDMgY20KKyAgICAgKiBmcm9tIHRoZSBtYWluIHNlbnNvciBhbG9uZyB0aGUgK1ggYXhpcyAodG8gdGhlIHJpZ2h0IGZyb20gdGhlIHVzZXIncyBwZXJzcGVjdGl2ZSkgd2lsbAorICAgICAqIHJlcG9ydCA8Y29kZT4oMC4wMywgMCwgMCk8L2NvZGU+LjwvcD4KKyAgICAgKiA8cD5UbyB0cmFuc2Zvcm0gYSBwaXhlbCBjb29yZGluYXRlcyBiZXR3ZWVuIHR3byBjYW1lcmFzIGZhY2luZyB0aGUgc2FtZSBkaXJlY3Rpb24sIGZpcnN0CisgICAgICogdGhlIHNvdXJjZSBjYW1lcmEgQUNBTUVSQV9MRU5TX0RJU1RPUlRJT04gbXVzdCBiZSBjb3JyZWN0ZWQgZm9yLiAgVGhlbiB0aGUgc291cmNlCisgICAgICogY2FtZXJhIEFDQU1FUkFfTEVOU19JTlRSSU5TSUNfQ0FMSUJSQVRJT04gbmVlZHMgdG8gYmUgYXBwbGllZCwgZm9sbG93ZWQgYnkgdGhlCisgICAgICogQUNBTUVSQV9MRU5TX1BPU0VfUk9UQVRJT04gb2YgdGhlIHNvdXJjZSBjYW1lcmEsIHRoZSB0cmFuc2xhdGlvbiBvZiB0aGUgc291cmNlIGNhbWVyYQorICAgICAqIHJlbGF0aXZlIHRvIHRoZSBkZXN0aW5hdGlvbiBjYW1lcmEsIHRoZSBBQ0FNRVJBX0xFTlNfUE9TRV9ST1RBVElPTiBvZiB0aGUgZGVzdGluYXRpb24KKyAgICAgKiBjYW1lcmEsIGFuZCBmaW5hbGx5IHRoZSBpbnZlcnNlIG9mIEFDQU1FUkFfTEVOU19JTlRSSU5TSUNfQ0FMSUJSQVRJT04gb2YgdGhlIGRlc3RpbmF0aW9uCisgICAgICogY2FtZXJhLiBUaGlzIG9idGFpbnMgYSByYWRpYWwtZGlzdG9ydGlvbi1mcmVlIGNvb3JkaW5hdGUgaW4gdGhlIGRlc3RpbmF0aW9uIGNhbWVyYSBwaXhlbAorICAgICAqIGNvb3JkaW5hdGVzLjwvcD4KKyAgICAgKiA8cD5UbyBjb21wYXJlIHRoaXMgYWdhaW5zdCBhIHJlYWwgaW1hZ2UgZnJvbSB0aGUgZGVzdGluYXRpb24gY2FtZXJhLCB0aGUgZGVzdGluYXRpb24gY2FtZXJhCisgICAgICogaW1hZ2UgdGhlbiBuZWVkcyB0byBiZSBjb3JyZWN0ZWQgZm9yIHJhZGlhbCBkaXN0b3J0aW9uIGJlZm9yZSBjb21wYXJpc29uIG9yIHNhbXBsaW5nLjwvcD4KKyAgICAgKiA8cD5XaGVuIEFDQU1FUkFfTEVOU19QT1NFX1JFRkVSRU5DRSBpcyBHWVJPU0NPUEUsIHRoZW4gdGhpcyBwb3NpdGlvbiBpcyByZWxhdGl2ZSB0bworICAgICAqIHRoZSBjZW50ZXIgb2YgdGhlIHByaW1hcnkgZ3lyb3Njb3BlIG9uIHRoZSBkZXZpY2UuPC9wPgogICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfRElTVE9SVElPTgogICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX0lOVFJJTlNJQ19DQUxJQlJBVElPTgorICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX1BPU0VfUkVGRVJFTkNFCiAgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfUE9TRV9ST1RBVElPTgotICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX1JBRElBTF9ESVNUT1JUSU9OCiAgICAgICovCiAgICAgQUNBTUVSQV9MRU5TX1BPU0VfVFJBTlNMQVRJT04gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmxvYXRbM10KICAgICAgICAgICAgIEFDQU1FUkFfTEVOU19TVEFSVCArIDcsCkBAIC0yMzU2LDcgKzIzODgsNyBAQAogICAgICAqIHdoZXJlIDxjb2RlPigwLDApPC9jb2RlPiBpcyB0aGUgdG9wLWxlZnQgb2YgdGhlCiAgICAgICogcHJlQ29ycmVjdGlvbkFjdGl2ZUFycmF5U2l6ZSByZWN0YW5nbGUuIE9uY2UgdGhlIHBvc2UgYW5kCiAgICAgICogaW50cmluc2ljIGNhbGlicmF0aW9uIHRyYW5zZm9ybXMgaGF2ZSBiZWVuIGFwcGxpZWQgdG8gYQotICAgICAqIHdvcmxkIHBvaW50LCB0aGVuIHRoZSBBQ0FNRVJBX0xFTlNfUkFESUFMX0RJU1RPUlRJT04KKyAgICAgKiB3b3JsZCBwb2ludCwgdGhlbiB0aGUgQUNBTUVSQV9MRU5TX0RJU1RPUlRJT04KICAgICAgKiB0cmFuc2Zvcm0gbmVlZHMgdG8gYmUgYXBwbGllZCwgYW5kIHRoZSByZXN1bHQgYWRqdXN0ZWQgdG8KICAgICAgKiBiZSBpbiB0aGUgQUNBTUVSQV9TRU5TT1JfSU5GT19BQ1RJVkVfQVJSQVlfU0laRSBjb29yZGluYXRlCiAgICAgICogc3lzdGVtICh3aGVyZSA8Y29kZT4oMCwgMCk8L2NvZGU+IGlzIHRoZSB0b3AtbGVmdCBvZiB0aGUKQEAgLTIzNjQsMTkgKzIzOTYsNDIgQEAKICAgICAgKiBjb29yZGluYXRlIG9mIHRoZSB3b3JsZCBwb2ludCBmb3IgcHJvY2Vzc2VkIChub24tUkFXKQogICAgICAqIG91dHB1dCBidWZmZXJzLjwvcD4KICAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX0RJU1RPUlRJT04KICAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19QT1NFX1JPVEFUSU9OCiAgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfUE9TRV9UUkFOU0xBVElPTgotICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX1JBRElBTF9ESVNUT1JUSU9OCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX1BSRV9DT1JSRUNUSU9OX0FDVElWRV9BUlJBWV9TSVpFCiAgICAgICovCiAgICAgQUNBTUVSQV9MRU5TX0lOVFJJTlNJQ19DQUxJQlJBVElPTiA9ICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmxvYXRbNV0KICAgICAgICAgICAgIEFDQU1FUkFfTEVOU19TVEFSVCArIDEwLAorICAgIEFDQU1FUkFfTEVOU19SQURJQUxfRElTVE9SVElPTiA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlcHJlY2F0ZWQhIERPIE5PVCBVU0UKKyAgICAgICAgICAgIEFDQU1FUkFfTEVOU19TVEFSVCArIDExLAorICAgIC8qKgorICAgICAqIDxwPlRoZSBvcmlnaW4gZm9yIEFDQU1FUkFfTEVOU19QT1NFX1RSQU5TTEFUSU9OLjwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX1BPU0VfVFJBTlNMQVRJT04KKyAgICAgKgorICAgICAqIDxwPlR5cGU6IGJ5dGUgKGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2xlbnNfcG9zZV9yZWZlcmVuY2VfdCk8L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3M8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+RGlmZmVyZW50IGNhbGlicmF0aW9uIG1ldGhvZHMgYW5kIHVzZSBjYXNlcyBjYW4gcHJvZHVjZSBiZXR0ZXIgb3Igd29yc2UgcmVzdWx0cworICAgICAqIGRlcGVuZGluZyBvbiB0aGUgc2VsZWN0ZWQgY29vcmRpbmF0ZSBvcmlnaW4uPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfTEVOU19QT1NFX1JFRkVSRU5DRSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5dGUgKGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2xlbnNfcG9zZV9yZWZlcmVuY2VfdCkKKyAgICAgICAgICAgIEFDQU1FUkFfTEVOU19TVEFSVCArIDEyLAogICAgIC8qKgogICAgICAqIDxwPlRoZSBjb3JyZWN0aW9uIGNvZWZmaWNpZW50cyB0byBjb3JyZWN0IGZvciB0aGlzIGNhbWVyYSBkZXZpY2UncwogICAgICAqIHJhZGlhbCBhbmQgdGFuZ2VudGlhbCBsZW5zIGRpc3RvcnRpb24uPC9wPgorICAgICAqIDxwPlJlcGxhY2VzIHRoZSBkZXByZWNhdGVkIEFDQU1FUkFfTEVOU19SQURJQUxfRElTVE9SVElPTiBmaWVsZCwgd2hpY2ggd2FzCisgICAgICogaW5jb25zaXN0ZW50bHkgZGVmaW5lZC48L3A+CiAgICAgICoKLSAgICAgKiA8cD5UeXBlOiBmbG9hdFs2XTwvcD4KKyAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19SQURJQUxfRElTVE9SVElPTgorICAgICAqCisgICAgICogPHA+VHlwZTogZmxvYXRbNV08L3A+CiAgICAgICoKICAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgogICAgICAqIDx1bD4KQEAgLTIzODQsMTMgKzI0MzksMTMgQEAKICAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCBjYWxsYmFja3M8L2xpPgogICAgICAqIDwvdWw+PC9wPgogICAgICAqCi0gICAgICogPHA+Rm91ciByYWRpYWwgZGlzdG9ydGlvbiBjb2VmZmljaWVudHMgPGNvZGU+W2thcHBhXzAsIGthcHBhXzEsIGthcHBhXzIsCisgICAgICogPHA+VGhyZWUgcmFkaWFsIGRpc3RvcnRpb24gY29lZmZpY2llbnRzIDxjb2RlPltrYXBwYV8xLCBrYXBwYV8yLAogICAgICAqIGthcHBhXzNdPC9jb2RlPiBhbmQgdHdvIHRhbmdlbnRpYWwgZGlzdG9ydGlvbiBjb2VmZmljaWVudHMKICAgICAgKiA8Y29kZT5ba2FwcGFfNCwga2FwcGFfNV08L2NvZGU+IHRoYXQgY2FuIGJlIHVzZWQgdG8gY29ycmVjdCB0aGUKICAgICAgKiBsZW5zJ3MgZ2VvbWV0cmljIGRpc3RvcnRpb24gd2l0aCB0aGUgbWFwcGluZyBlcXVhdGlvbnM6PC9wPgotICAgICAqIDxwcmU+PGNvZGU+IHhfYyA9IHhfaSAqICgga2FwcGFfMCArIGthcHBhXzEgKiByXjIgKyBrYXBwYV8yICogcl40ICsga2FwcGFfMyAqIHJeNiApICsKKyAgICAgKiA8cHJlPjxjb2RlPiB4X2MgPSB4X2kgKiAoIDEgKyBrYXBwYV8xICogcl4yICsga2FwcGFfMiAqIHJeNCArIGthcHBhXzMgKiByXjYgKSArCiAgICAgICogICAgICAgIGthcHBhXzQgKiAoMiAqIHhfaSAqIHlfaSkgKyBrYXBwYV81ICogKCByXjIgKyAyICogeF9pXjIgKQotICAgICAqICB5X2MgPSB5X2kgKiAoIGthcHBhXzAgKyBrYXBwYV8xICogcl4yICsga2FwcGFfMiAqIHJeNCArIGthcHBhXzMgKiByXjYgKSArCisgICAgICogIHlfYyA9IHlfaSAqICggMSArIGthcHBhXzEgKiByXjIgKyBrYXBwYV8yICogcl40ICsga2FwcGFfMyAqIHJeNiApICsKICAgICAgKiAgICAgICAga2FwcGFfNSAqICgyICogeF9pICogeV9pKSArIGthcHBhXzQgKiAoIHJeMiArIDIgKiB5X2leMiApCiAgICAgICogPC9jb2RlPjwvcHJlPgogICAgICAqIDxwPkhlcmUsIDxjb2RlPlt4X2MsIHlfY108L2NvZGU+IGFyZSB0aGUgY29vcmRpbmF0ZXMgdG8gc2FtcGxlIGluIHRoZQpAQCAtMjM5OCwyMyArMjQ1MywyMSBAQAogICAgICAqIGNvcnJlY3RlZCBpbWFnZSBhdCB0aGUgY29vcmRpbmF0ZSA8Y29kZT5beF9pLCB5X2ldPC9jb2RlPjo8L3A+CiAgICAgICogPHByZT48Y29kZT4gY29ycmVjdGVkSW1hZ2UoeF9pLCB5X2kpID0gc2FtcGxlX2F0KHhfYywgeV9jLCBpbnB1dEltYWdlKQogICAgICAqIDwvY29kZT48L3ByZT4KLSAgICAgKiA8cD5UaGUgcGl4ZWwgY29vcmRpbmF0ZXMgYXJlIGRlZmluZWQgaW4gYSBub3JtYWxpemVkCi0gICAgICogY29vcmRpbmF0ZSBzeXN0ZW0gcmVsYXRlZCB0byB0aGUKLSAgICAgKiBBQ0FNRVJBX0xFTlNfSU5UUklOU0lDX0NBTElCUkFUSU9OIGNhbGlicmF0aW9uIGZpZWxkcy4KLSAgICAgKiBCb3RoIDxjb2RlPlt4X2ksIHlfaV08L2NvZGU+IGFuZCA8Y29kZT5beF9jLCB5X2NdPC9jb2RlPiBoYXZlIDxjb2RlPigwLDApPC9jb2RlPiBhdCB0aGUKLSAgICAgKiBsZW5zIG9wdGljYWwgY2VudGVyIDxjb2RlPltjX3gsIGNfeV08L2NvZGU+LiBUaGUgbWF4aW11bSBtYWduaXR1ZGVzCi0gICAgICogb2YgYm90aCB4IGFuZCB5IGNvb3JkaW5hdGVzIGFyZSBub3JtYWxpemVkIHRvIGJlIDEgYXQgdGhlCi0gICAgICogZWRnZSBmdXJ0aGVyIGZyb20gdGhlIG9wdGljYWwgY2VudGVyLCBzbyB0aGUgcmFuZ2UKLSAgICAgKiBmb3IgYm90aCBkaW1lbnNpb25zIGlzIDxjb2RlPi0xICZsdDs9IHggJmx0Oz0gMTwvY29kZT4uPC9wPgorICAgICAqIDxwPlRoZSBwaXhlbCBjb29yZGluYXRlcyBhcmUgZGVmaW5lZCBpbiBhIGNvb3JkaW5hdGUgc3lzdGVtCisgICAgICogcmVsYXRlZCB0byB0aGUgQUNBTUVSQV9MRU5TX0lOVFJJTlNJQ19DQUxJQlJBVElPTgorICAgICAqIGNhbGlicmF0aW9uIGZpZWxkczsgc2VlIHRoYXQgZW50cnkgZm9yIGRldGFpbHMgb2YgdGhlIG1hcHBpbmcgc3RhZ2VzLgorICAgICAqIEJvdGggPGNvZGU+W3hfaSwgeV9pXTwvY29kZT4gYW5kIDxjb2RlPlt4X2MsIHlfY108L2NvZGU+CisgICAgICogaGF2ZSA8Y29kZT4oMCwwKTwvY29kZT4gYXQgdGhlIGxlbnMgb3B0aWNhbCBjZW50ZXIgPGNvZGU+W2NfeCwgY195XTwvY29kZT4sIGFuZAorICAgICAqIHRoZSByYW5nZSBvZiB0aGUgY29vcmRpbmF0ZXMgZGVwZW5kcyBvbiB0aGUgZm9jYWwgbGVuZ3RoCisgICAgICogdGVybXMgb2YgdGhlIGludHJpbnNpYyBjYWxpYnJhdGlvbi48L3A+CiAgICAgICogPHA+RmluYWxseSwgPGNvZGU+cjwvY29kZT4gcmVwcmVzZW50cyB0aGUgcmFkaWFsIGRpc3RhbmNlIGZyb20gdGhlCi0gICAgICogb3B0aWNhbCBjZW50ZXIsIDxjb2RlPnJeMiA9IHhfaV4yICsgeV9pXjI8L2NvZGU+LCBhbmQgaXRzIG1hZ25pdHVkZQotICAgICAqIGlzIHRoZXJlZm9yZSBubyBsYXJnZXIgdGhhbiA8Y29kZT58cnwgJmx0Oz0gc3FydCgyKTwvY29kZT4uPC9wPgorICAgICAqIG9wdGljYWwgY2VudGVyLCA8Y29kZT5yXjIgPSB4X2leMiArIHlfaV4yPC9jb2RlPi48L3A+CiAgICAgICogPHA+VGhlIGRpc3RvcnRpb24gbW9kZWwgdXNlZCBpcyB0aGUgQnJvd24tQ29ucmFkeSBtb2RlbC48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19JTlRSSU5TSUNfQ0FMSUJSQVRJT04KICAgICAgKi8KLSAgICBBQ0FNRVJBX0xFTlNfUkFESUFMX0RJU1RPUlRJT04gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmbG9hdFs2XQotICAgICAgICAgICAgQUNBTUVSQV9MRU5TX1NUQVJUICsgMTEsCisgICAgQUNBTUVSQV9MRU5TX0RJU1RPUlRJT04gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmxvYXRbNV0KKyAgICAgICAgICAgIEFDQU1FUkFfTEVOU19TVEFSVCArIDEzLAogICAgIEFDQU1FUkFfTEVOU19FTkQsCiAKICAgICAvKioKQEAgLTI2NjIsMTEgKzI3MTUsMTIgQEAKICAgICAgKiBpbnRvIHRoZSAzIHN0cmVhbSB0eXBlcyBhcyBiZWxvdzo8L3A+CiAgICAgICogPHVsPgogICAgICAqIDxsaT5Qcm9jZXNzZWQgKGJ1dCBzdGFsbGluZyk6IGFueSBub24tUkFXIGZvcm1hdCB3aXRoIGEgc3RhbGxEdXJhdGlvbnMgJmd0OyAwLgotICAgICAqICAgVHlwaWNhbGx5IHtAbGluayBBSU1BR0VfRk9STUFUX0pQRUd9IGZvcm1hdC48L2xpPgotICAgICAqIDxsaT5SYXcgZm9ybWF0czoge0BsaW5rIEFJTUFHRV9GT1JNQVRfUkFXMTZ9LCB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9SQVcxMH0sIG9yCi0gICAgICogICB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9SQVcxMn0uPC9saT4KLSAgICAgKiA8bGk+UHJvY2Vzc2VkIChidXQgbm90LXN0YWxsaW5nKTogYW55IG5vbi1SQVcgZm9ybWF0IHdpdGhvdXQgYSBzdGFsbCBkdXJhdGlvbi4KLSAgICAgKiAgIFR5cGljYWxseSB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9ZVVZfNDIwXzg4OH0uPC9saT4KKyAgICAgKiAgIFR5cGljYWxseSB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9KUEVHIEpQRUcgZm9ybWF0fS48L2xpPgorICAgICAqIDxsaT5SYXcgZm9ybWF0czoge0BsaW5rIEFJTUFHRV9GT1JNQVRfUkFXMTYgUkFXX1NFTlNPUn0sIHtAbGluayBBSU1BR0VfRk9STUFUX1JBVzEwIFJBVzEwfSwgb3IKKyAgICAgKiAgIHtAbGluayBBSU1BR0VfRk9STUFUX1JBVzEyIFJBVzEyfS48L2xpPgorICAgICAqIDxsaT5Qcm9jZXNzZWQgKGJ1dCBub3Qtc3RhbGxpbmcpOiBhbnkgbm9uLVJBVyBmb3JtYXQgd2l0aG91dCBhIHN0YWxsIGR1cmF0aW9uLiAgVHlwaWNhbGx5CisgICAgICogICB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9ZVVZfNDIwXzg4OCBZVVZfNDIwXzg4OH0sCisgICAgICogICA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9ncmFwaGljcy9JbWFnZUZvcm1hdC5odG1sI05WMjEiPk5WMjE8L2E+LCBvciA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9ncmFwaGljcy9JbWFnZUZvcm1hdC5odG1sI1lWMTIiPllWMTI8L2E+LjwvbGk+CiAgICAgICogPC91bD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUwpAQCAtMjc4Nyw3ICsyODQxLDcgQEAKICAgICAgICAgICAgIEFDQU1FUkFfUkVRVUVTVF9TVEFSVCArIDEyLAogICAgIC8qKgogICAgICAqIDxwPkEgbGlzdCBvZiBhbGwga2V5cyB0aGF0IHRoZSBjYW1lcmEgZGV2aWNlIGhhcyBhdmFpbGFibGUKLSAgICAgKiB0byB1c2Ugd2l0aCB7QGxpbmsgQUNhcHR1cmVSZXF1ZXN0fS48L3A+CisgICAgICogdG8gdXNlIHdpdGgge0BsaW5rIEFDYXB0dXJlUmVxdWVzdCB9LjwvcD4KICAgICAgKgogICAgICAqIDxwPlR5cGU6IGludDMyW25dPC9wPgogICAgICAqCkBAIC0yODA5LDkgKzI4NjMsNyBAQAogICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUkVRVUVTVF9LRVlTID0gICAgICAgICAgICAgICAgICAgIC8vIGludDMyW25dCiAgICAgICAgICAgICBBQ0FNRVJBX1JFUVVFU1RfU1RBUlQgKyAxMywKICAgICAvKioKLSAgICAgKiA8cD5BIGxpc3Qgb2YgYWxsIGtleXMgdGhhdCB0aGUgY2FtZXJhIGRldmljZSBoYXMgYXZhaWxhYmxlCi0gICAgICogdG8gcXVlcnkgd2l0aCB7QGxpbmsgQUNhbWVyYU1ldGFkYXRhfSBmcm9tCi0gICAgICoge0BsaW5rIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0fS48L3A+CisgICAgICogPHA+QSBsaXN0IG9mIGFsbCBrZXlzIHRoYXQgdGhlIGNhbWVyYSBkZXZpY2UgaGFzIGF2YWlsYWJsZSB0byB1c2Ugd2l0aCB7QGxpbmsgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgfS48L3A+CiAgICAgICoKICAgICAgKiA8cD5UeXBlOiBpbnQzMltuXTwvcD4KICAgICAgKgpAQCAtMjg0Miw5ICsyODk0LDcgQEAKICAgICBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1JFU1VMVF9LRVlTID0gICAgICAgICAgICAgICAgICAgICAvLyBpbnQzMltuXQogICAgICAgICAgICAgQUNBTUVSQV9SRVFVRVNUX1NUQVJUICsgMTQsCiAgICAgLyoqCi0gICAgICogPHA+QSBsaXN0IG9mIGFsbCBrZXlzIHRoYXQgdGhlIGNhbWVyYSBkZXZpY2UgaGFzIGF2YWlsYWJsZQotICAgICAqIHRvIHF1ZXJ5IHdpdGgge0BsaW5rIEFDYW1lcmFNZXRhZGF0YX0gZnJvbQotICAgICAqIHtAbGluayBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3N9LjwvcD4KKyAgICAgKiA8cD5BIGxpc3Qgb2YgYWxsIGtleXMgdGhhdCB0aGUgY2FtZXJhIGRldmljZSBoYXMgYXZhaWxhYmxlIHRvIHVzZSB3aXRoIHtAbGluayBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MgfS48L3A+CiAgICAgICoKICAgICAgKiA8cD5UeXBlOiBpbnQzMltuXTwvcD4KICAgICAgKgpAQCAtMjg2Miw2ICsyOTEyLDU5IEBACiAgICAgICovCiAgICAgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9DSEFSQUNURVJJU1RJQ1NfS0VZUyA9ICAgICAgICAgICAgLy8gaW50MzJbbl0KICAgICAgICAgICAgIEFDQU1FUkFfUkVRVUVTVF9TVEFSVCArIDE1LAorICAgIC8qKgorICAgICAqIDxwPkEgc3Vic2V0IG9mIHRoZSBhdmFpbGFibGUgcmVxdWVzdCBrZXlzIHRoYXQgdGhlIGNhbWVyYSBkZXZpY2UKKyAgICAgKiBjYW4gcGFzcyBhcyBwYXJ0IG9mIHRoZSBjYXB0dXJlIHNlc3Npb24gaW5pdGlhbGl6YXRpb24uPC9wPgorICAgICAqCisgICAgICogPHA+VHlwZTogaW50MzJbbl08L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3M8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyBpcyBhIHN1YnNldCBvZiBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1JFUVVFU1RfS0VZUyB3aGljaAorICAgICAqIGNvbnRhaW5zIGEgbGlzdCBvZiBrZXlzIHRoYXQgYXJlIGRpZmZpY3VsdCB0byBhcHBseSBwZXItZnJhbWUgYW5kCisgICAgICogY2FuIHJlc3VsdCBpbiB1bmV4cGVjdGVkIGRlbGF5cyB3aGVuIG1vZGlmaWVkIGR1cmluZyB0aGUgY2FwdHVyZSBzZXNzaW9uCisgICAgICogbGlmZXRpbWUuIFR5cGljYWwgZXhhbXBsZXMgaW5jbHVkZSBwYXJhbWV0ZXJzIHRoYXQgcmVxdWlyZSBhCisgICAgICogdGltZS1jb25zdW1pbmcgaGFyZHdhcmUgcmUtY29uZmlndXJhdGlvbiBvciBpbnRlcm5hbCBjYW1lcmEgcGlwZWxpbmUKKyAgICAgKiBjaGFuZ2UuIEZvciBwZXJmb3JtYW5jZSByZWFzb25zIHdlIGFkdmlzZSBjbGllbnRzIHRvIHBhc3MgdGhlaXIgaW5pdGlhbAorICAgICAqIHZhbHVlcyBhcyBwYXJ0IG9mCisgICAgICoge0BsaW5rIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVNlc3Npb25XaXRoU2Vzc2lvblBhcmFtZXRlcnMgfS4KKyAgICAgKiBPbmNlIHRoZSBjYW1lcmEgY2FwdHVyZSBzZXNzaW9uIGlzIGVuYWJsZWQgaXQgaXMgYWxzbyByZWNvbW1lbmRlZCB0byBhdm9pZAorICAgICAqIGNoYW5naW5nIHRoZW0gZnJvbSB0aGVpciBpbml0aWFsIHZhbHVlcyBzZXQgaW4KKyAgICAgKiB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlU2Vzc2lvbldpdGhTZXNzaW9uUGFyYW1ldGVycyB9LgorICAgICAqIENvbnRyb2wgb3ZlciBzZXNzaW9uIHBhcmFtZXRlcnMgY2FuIHN0aWxsIGJlIGV4ZXJ0ZWQgaW4gY2FwdHVyZSByZXF1ZXN0cworICAgICAqIGJ1dCBjbGllbnRzIHNob3VsZCBiZSBhd2FyZSBhbmQgZXhwZWN0IGRlbGF5cyBkdXJpbmcgdGhlaXIgYXBwbGljYXRpb24uCisgICAgICogQW4gZXhhbXBsZSB1c2FnZSBzY2VuYXJpbyBjb3VsZCBsb29rIGxpa2UgdGhpczo8L3A+CisgICAgICogPHVsPgorICAgICAqIDxsaT5UaGUgY2FtZXJhIGNsaWVudCBzdGFydHMgYnkgcXVlcmluZyB0aGUgc2Vzc2lvbiBwYXJhbWV0ZXIga2V5IGxpc3QgdmlhCisgICAgICogICB7QGxpbmsgQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzIH0uPC9saT4KKyAgICAgKiA8bGk+QmVmb3JlIHRyaWdnZXJpbmcgdGhlIGNhcHR1cmUgc2Vzc2lvbiBjcmVhdGUgc2VxdWVuY2UsIGEgY2FwdHVyZSByZXF1ZXN0CisgICAgICogICBtdXN0IGJlIGJ1aWx0IHZpYQorICAgICAqICAge0BsaW5rIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVJlcXVlc3QgfQorICAgICAqICAgdXNpbmcgYW4gYXBwcm9wcmlhdGUgdGVtcGxhdGUgbWF0Y2hpbmcgdGhlIHBhcnRpY3VsYXIgdXNlIGNhc2UuPC9saT4KKyAgICAgKiA8bGk+VGhlIGNsaWVudCBzaG91bGQgZ28gb3ZlciB0aGUgbGlzdCBvZiBzZXNzaW9uIHBhcmFtZXRlcnMgYW5kIGNoZWNrCisgICAgICogICB3aGV0aGVyIHNvbWUgb2YgdGhlIGtleXMgbGlzdGVkIG1hdGNoZXMgd2l0aCB0aGUgcGFyYW1ldGVycyB0aGF0CisgICAgICogICB0aGV5IGludGVuZCB0byBtb2RpZnkgYXMgcGFydCBvZiB0aGUgZmlyc3QgY2FwdHVyZSByZXF1ZXN0LjwvbGk+CisgICAgICogPGxpPklmIHRoZXJlIGlzIG5vIHN1Y2ggbWF0Y2gsIHRoZSBjYXB0dXJlIHJlcXVlc3QgY2FuIGJlICBwYXNzZWQKKyAgICAgKiAgIHVubW9kaWZpZWQgdG8KKyAgICAgKiAgIHtAbGluayBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVTZXNzaW9uV2l0aFNlc3Npb25QYXJhbWV0ZXJzIH0uPC9saT4KKyAgICAgKiA8bGk+SWYgbWF0Y2hlcyBkbyBleGlzdCwgdGhlIGNsaWVudCBzaG91bGQgdXBkYXRlIHRoZSByZXNwZWN0aXZlIHZhbHVlcworICAgICAqICAgYW5kIHBhc3MgdGhlIHJlcXVlc3QgdG8KKyAgICAgKiAgIHtAbGluayBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVTZXNzaW9uV2l0aFNlc3Npb25QYXJhbWV0ZXJzIH0uPC9saT4KKyAgICAgKiA8bGk+QWZ0ZXIgdGhlIGNhcHR1cmUgc2Vzc2lvbiBpbml0aWFsaXphdGlvbiBjb21wbGV0ZXMgdGhlIHNlc3Npb24gcGFyYW1ldGVyCisgICAgICogICBrZXkgbGlzdCBjYW4gY29udGludWUgdG8gc2VydmUgYXMgcmVmZXJlbmNlIHdoZW4gcG9zdGluZyBvciB1cGRhdGluZworICAgICAqICAgZnVydGhlciByZXF1ZXN0cy4gQXMgbWVudGlvbmVkIGFib3ZlIGZ1cnRoZXIgY2hhbmdlcyB0byBzZXNzaW9uCisgICAgICogICBwYXJhbWV0ZXJzIHNob3VsZCBpZGVhbGx5IGJlIGF2b2lkZWQsIGlmIHVwZGF0ZXMgYXJlIG5lY2Vzc2FyeQorICAgICAqICAgaG93ZXZlciBjbGllbnRzIGNvdWxkIGV4cGVjdCBhIGRlbGF5L2dsaXRjaCBkdXJpbmcgdGhlCisgICAgICogICBwYXJhbWV0ZXIgc3dpdGNoLjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9SRVFVRVNUX0tFWVMKKyAgICAgKi8KKyAgICBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1NFU1NJT05fS0VZUyA9ICAgICAgICAgICAgICAgICAgICAvLyBpbnQzMltuXQorICAgICAgICAgICAgQUNBTUVSQV9SRVFVRVNUX1NUQVJUICsgMTYsCiAgICAgQUNBTUVSQV9SRVFVRVNUX0VORCwKIAogICAgIC8qKgpAQCAtMjg3Niw3ICsyOTc5LDYgQEAKICAgICAgKiA8L3VsPjwvcD4KICAgICAgKgogICAgICAqIDxwPlRoaXMgY29udHJvbCBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgZGlnaXRhbCB6b29tLjwvcD4KLSAgICAgKiA8cD5UaGUgZGF0YSByZXByZXNlbnRhdGlvbiBpcyBpbnRbNF0sIHdoaWNoIG1hcHMgdG8gKGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCkuPC9wPgogICAgICAqIDxwPlRoZSBjcm9wIHJlZ2lvbiBjb29yZGluYXRlIHN5c3RlbSBpcyBiYXNlZCBvZmYKICAgICAgKiBBQ0FNRVJBX1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFLCB3aXRoIDxjb2RlPigwLCAwKTwvY29kZT4gYmVpbmcgdGhlCiAgICAgICogdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBzZW5zb3IgYWN0aXZlIGFycmF5LjwvcD4KQEAgLTI5MDYsNiArMzAwOCw3IEBACiAgICAgICogZm9yIHJvdW5kaW5nIGFuZCBvdGhlciBoYXJkd2FyZSByZXF1aXJlbWVudHM7IHRoZSBmaW5hbAogICAgICAqIGNyb3AgcmVnaW9uIHVzZWQgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGNhcHR1cmUKICAgICAgKiByZXN1bHQuPC9wPgorICAgICAqIDxwPlRoZSBkYXRhIHJlcHJlc2VudGF0aW9uIGlzIGludFs0XSwgd2hpY2ggbWFwcyB0byAobGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0KS48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9NQVhfRElHSVRBTF9aT09NCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFCkBAIC0zMDYxLDEzICszMTY0LDE0IEBACiAgICAgICogaWdub3JlZCkuPC9wPgogICAgICAqIDxwPlRoZSBmb2xsb3dpbmcgZm9ybWF0cyBtYXkgYWx3YXlzIGhhdmUgYSBzdGFsbCBkdXJhdGlvbjo8L3A+CiAgICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgQUlNQUdFX0ZPUk1BVF9KUEVHfTwvbGk+Ci0gICAgICogPGxpPntAbGluayBBSU1BR0VfRk9STUFUX1JBVzE2fTwvbGk+CisgICAgICogPGxpPntAbGluayBBSU1BR0VfRk9STUFUX0pQRUcgfTwvbGk+CisgICAgICogPGxpPntAbGluayBBSU1BR0VfRk9STUFUX1JBVzE2IH08L2xpPgogICAgICAqIDwvdWw+CiAgICAgICogPHA+VGhlIGZvbGxvd2luZyBmb3JtYXRzIHdpbGwgbmV2ZXIgaGF2ZSBhIHN0YWxsIGR1cmF0aW9uOjwvcD4KICAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayBBSU1BR0VfRk9STUFUX1lVVl80MjBfODg4fTwvbGk+Ci0gICAgICogPGxpPntAbGluayBBSU1BR0VfRk9STUFUX1JBVzEwfTwvbGk+CisgICAgICogPGxpPntAbGluayBBSU1BR0VfRk9STUFUX1lVVl80MjBfODg4IH08L2xpPgorICAgICAqIDxsaT57QGxpbmsgQUlNQUdFX0ZPUk1BVF9SQVcxMCB9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIEFJTUFHRV9GT1JNQVRfUkFXMTIgfTwvbGk+CiAgICAgICogPC91bD4KICAgICAgKiA8cD5BbGwgb3RoZXIgZm9ybWF0cyBtYXkgb3IgbWF5IG5vdCBoYXZlIGFuIGFsbG93ZWQgc3RhbGwgZHVyYXRpb24gb24KICAgICAgKiBhIHBlci1jYXBhYmlsaXR5IGJhc2lzOyByZWZlciB0byBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUwpAQCAtMzE3NywzOSArMzI4MSwyOSBAQAogICAgICAqIGNhbiBydW4gY29uY3VycmVudGx5IHRvIHRoZSByZXN0IG9mIHRoZSBjYW1lcmEgcGlwZWxpbmUsIGJ1dAogICAgICAqIGNhbm5vdCBwcm9jZXNzIG1vcmUgdGhhbiAxIGNhcHR1cmUgYXQgYSB0aW1lLjwvbGk+CiAgICAgICogPC91bD4KLSAgICAgKiA8cD5UaGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGZvciB0aGUgYXBwbGljYXRpb24sIGdpdmVuIHRoZSBtb2RlbCBhYm92ZSwKLSAgICAgKiBpcyBwcm92aWRlZCB2aWEKLSAgICAgKiB7QGxpbmsgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX01JTl9GUkFNRV9EVVJBVElPTlN9LgotICAgICAqIFRoZXNlIGFyZSB1c2VkIHRvIGRldGVybWluZSB0aGUgbWF4aW11bSBmcmFtZSByYXRlIC8gbWluaW11bSBmcmFtZQotICAgICAqIGR1cmF0aW9uIHRoYXQgaXMgcG9zc2libGUgZm9yIGEgZ2l2ZW4gc3RyZWFtIGNvbmZpZ3VyYXRpb24uPC9wPgorICAgICAqIDxwPlRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24gZm9yIHRoZSBhcHBsaWNhdGlvbiwgZ2l2ZW4gdGhlIG1vZGVsIGFib3ZlLCBpcyBwcm92aWRlZCB2aWEKKyAgICAgKiB7QGxpbmsgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX01JTl9GUkFNRV9EVVJBVElPTlMgfS4KKyAgICAgKiBUaGVzZSBhcmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIG1heGltdW0gZnJhbWUgcmF0ZSAvIG1pbmltdW0gZnJhbWUgZHVyYXRpb24gdGhhdCBpcworICAgICAqIHBvc3NpYmxlIGZvciBhIGdpdmVuIHN0cmVhbSBjb25maWd1cmF0aW9uLjwvcD4KICAgICAgKiA8cD5TcGVjaWZpY2FsbHksIHRoZSBhcHBsaWNhdGlvbiBjYW4gdXNlIHRoZSBmb2xsb3dpbmcgcnVsZXMgdG8KICAgICAgKiBkZXRlcm1pbmUgdGhlIG1pbmltdW0gZnJhbWUgZHVyYXRpb24gaXQgY2FuIHJlcXVlc3QgZnJvbSB0aGUgY2FtZXJhCiAgICAgICogZGV2aWNlOjwvcD4KICAgICAgKiA8b2w+Ci0gICAgICogPGxpPkxldCB0aGUgc2V0IG9mIGN1cnJlbnRseSBjb25maWd1cmVkIGlucHV0L291dHB1dCBzdHJlYW1zCi0gICAgICogYmUgY2FsbGVkIDxjb2RlPlM8L2NvZGU+LjwvbGk+Ci0gICAgICogPGxpPkZpbmQgdGhlIG1pbmltdW0gZnJhbWUgZHVyYXRpb25zIGZvciBlYWNoIHN0cmVhbSBpbiA8Y29kZT5TPC9jb2RlPiwgYnkgbG9va2luZwotICAgICAqIGl0IHVwIGluIHtAbGluayBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfTUlOX0ZSQU1FX0RVUkFUSU9OU30KLSAgICAgKiAod2l0aCBpdHMgcmVzcGVjdGl2ZSBzaXplL2Zvcm1hdCkuIExldCB0aGlzIHNldCBvZiBmcmFtZSBkdXJhdGlvbnMgYmUKLSAgICAgKiBjYWxsZWQgPGNvZGU+RjwvY29kZT4uPC9saT4KLSAgICAgKiA8bGk+Rm9yIGFueSBnaXZlbiByZXF1ZXN0IDxjb2RlPlI8L2NvZGU+LCB0aGUgbWluaW11bSBmcmFtZSBkdXJhdGlvbiBhbGxvd2VkCi0gICAgICogZm9yIDxjb2RlPlI8L2NvZGU+IGlzIHRoZSBtYXhpbXVtIG91dCBvZiBhbGwgdmFsdWVzIGluIDxjb2RlPkY8L2NvZGU+LiBMZXQgdGhlIHN0cmVhbXMKLSAgICAgKiB1c2VkIGluIDxjb2RlPlI8L2NvZGU+IGJlIGNhbGxlZCA8Y29kZT5TX3I8L2NvZGU+LjwvbGk+CisgICAgICogPGxpPkxldCB0aGUgc2V0IG9mIGN1cnJlbnRseSBjb25maWd1cmVkIGlucHV0L291dHB1dCBzdHJlYW1zIGJlIGNhbGxlZCA8Y29kZT5TPC9jb2RlPi48L2xpPgorICAgICAqIDxsaT5GaW5kIHRoZSBtaW5pbXVtIGZyYW1lIGR1cmF0aW9ucyBmb3IgZWFjaCBzdHJlYW0gaW4gPGNvZGU+UzwvY29kZT4sIGJ5IGxvb2tpbmcgaXQgdXAgaW4ge0BsaW5rIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9NSU5fRlJBTUVfRFVSQVRJT05TIH0KKyAgICAgKiAod2l0aCBpdHMgcmVzcGVjdGl2ZSBzaXplL2Zvcm1hdCkuIExldCB0aGlzIHNldCBvZiBmcmFtZSBkdXJhdGlvbnMgYmUgY2FsbGVkIDxjb2RlPkY8L2NvZGU+LjwvbGk+CisgICAgICogPGxpPkZvciBhbnkgZ2l2ZW4gcmVxdWVzdCA8Y29kZT5SPC9jb2RlPiwgdGhlIG1pbmltdW0gZnJhbWUgZHVyYXRpb24gYWxsb3dlZCBmb3IgPGNvZGU+UjwvY29kZT4gaXMgdGhlIG1heGltdW0KKyAgICAgKiBvdXQgb2YgYWxsIHZhbHVlcyBpbiA8Y29kZT5GPC9jb2RlPi4gTGV0IHRoZSBzdHJlYW1zIHVzZWQgaW4gPGNvZGU+UjwvY29kZT4gYmUgY2FsbGVkIDxjb2RlPlNfcjwvY29kZT4uPC9saT4KICAgICAgKiA8L29sPgotICAgICAqIDxwPklmIG5vbmUgb2YgdGhlIHN0cmVhbXMgaW4gPGNvZGU+U19yPC9jb2RlPiBoYXZlIGEgc3RhbGwgdGltZSAobGlzdGVkIGluIHtAbGluawotICAgICAqIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9TVEFMTF9EVVJBVElPTlN9Ci0gICAgICogdXNpbmcgaXRzIHJlc3BlY3RpdmUgc2l6ZS9mb3JtYXQpLCB0aGVuIHRoZSBmcmFtZSBkdXJhdGlvbiBpbiA8Y29kZT5GPC9jb2RlPgotICAgICAqIGRldGVybWluZXMgdGhlIHN0ZWFkeSBzdGF0ZSBmcmFtZSByYXRlIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHdpbGwgZ2V0Ci0gICAgICogaWYgaXQgdXNlcyA8Y29kZT5SPC9jb2RlPiBhcyBhIHJlcGVhdGluZyByZXF1ZXN0LiBMZXQgdGhpcyBzcGVjaWFsIGtpbmQgb2YKLSAgICAgKiByZXF1ZXN0IGJlIGNhbGxlZCA8Y29kZT5Sc2ltcGxlPC9jb2RlPi48L3A+Ci0gICAgICogPHA+QSByZXBlYXRpbmcgcmVxdWVzdCA8Y29kZT5Sc2ltcGxlPC9jb2RlPiBjYW4gYmUgPGVtPm9jY2FzaW9uYWxseTwvZW0+IGludGVybGVhdmVkCi0gICAgICogYnkgYSBzaW5nbGUgY2FwdHVyZSBvZiBhIG5ldyByZXF1ZXN0IDxjb2RlPlJzdGFsbDwvY29kZT4gKHdoaWNoIGhhcyBhdCBsZWFzdAotICAgICAqIG9uZSBpbi11c2Ugc3RyZWFtIHdpdGggYSBub24tMCBzdGFsbCB0aW1lKSBhbmQgaWYgPGNvZGU+UnN0YWxsPC9jb2RlPiBoYXMgdGhlCi0gICAgICogc2FtZSBtaW5pbXVtIGZyYW1lIGR1cmF0aW9uIHRoaXMgd2lsbCBub3QgY2F1c2UgYSBmcmFtZSByYXRlIGxvc3MKLSAgICAgKiBpZiBhbGwgYnVmZmVycyBmcm9tIHRoZSBwcmV2aW91cyA8Y29kZT5Sc3RhbGw8L2NvZGU+IGhhdmUgYWxyZWFkeSBiZWVuCi0gICAgICogZGVsaXZlcmVkLjwvcD4KLSAgICAgKiA8cD5Gb3IgbW9yZSBkZXRhaWxzIGFib3V0IHN0YWxsaW5nLCBzZWUKLSAgICAgKiB7QGxpbmsgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUQUxMX0RVUkFUSU9OU30uPC9wPgorICAgICAqIDxwPklmIG5vbmUgb2YgdGhlIHN0cmVhbXMgaW4gPGNvZGU+U19yPC9jb2RlPiBoYXZlIGEgc3RhbGwgdGltZSAobGlzdGVkIGluIHtAbGluayBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfU1RBTExfRFVSQVRJT05TIH0KKyAgICAgKiB1c2luZyBpdHMgcmVzcGVjdGl2ZSBzaXplL2Zvcm1hdCksIHRoZW4gdGhlIGZyYW1lIGR1cmF0aW9uIGluIDxjb2RlPkY8L2NvZGU+IGRldGVybWluZXMgdGhlIHN0ZWFkeQorICAgICAqIHN0YXRlIGZyYW1lIHJhdGUgdGhhdCB0aGUgYXBwbGljYXRpb24gd2lsbCBnZXQgaWYgaXQgdXNlcyA8Y29kZT5SPC9jb2RlPiBhcyBhIHJlcGVhdGluZyByZXF1ZXN0LiBMZXQKKyAgICAgKiB0aGlzIHNwZWNpYWwga2luZCBvZiByZXF1ZXN0IGJlIGNhbGxlZCA8Y29kZT5Sc2ltcGxlPC9jb2RlPi48L3A+CisgICAgICogPHA+QSByZXBlYXRpbmcgcmVxdWVzdCA8Y29kZT5Sc2ltcGxlPC9jb2RlPiBjYW4gYmUgPGVtPm9jY2FzaW9uYWxseTwvZW0+IGludGVybGVhdmVkIGJ5IGEgc2luZ2xlIGNhcHR1cmUgb2YgYQorICAgICAqIG5ldyByZXF1ZXN0IDxjb2RlPlJzdGFsbDwvY29kZT4gKHdoaWNoIGhhcyBhdCBsZWFzdCBvbmUgaW4tdXNlIHN0cmVhbSB3aXRoIGEgbm9uLTAgc3RhbGwgdGltZSkgYW5kIGlmCisgICAgICogPGNvZGU+UnN0YWxsPC9jb2RlPiBoYXMgdGhlIHNhbWUgbWluaW11bSBmcmFtZSBkdXJhdGlvbiB0aGlzIHdpbGwgbm90IGNhdXNlIGEgZnJhbWUgcmF0ZSBsb3NzIGlmIGFsbAorICAgICAqIGJ1ZmZlcnMgZnJvbSB0aGUgcHJldmlvdXMgPGNvZGU+UnN0YWxsPC9jb2RlPiBoYXZlIGFscmVhZHkgYmVlbiBkZWxpdmVyZWQuPC9wPgorICAgICAqIDxwPkZvciBtb3JlIGRldGFpbHMgYWJvdXQgc3RhbGxpbmcsIHNlZSB7QGxpbmsgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUQUxMX0RVUkFUSU9OUyB9LjwvcD4KICAgICAgKiA8cD5UaGlzIGNvbnRyb2wgaXMgb25seSBlZmZlY3RpdmUgaWYgQUNBTUVSQV9DT05UUk9MX0FFX01PREUgb3IgQUNBTUVSQV9DT05UUk9MX01PREUgaXMgc2V0IHRvCiAgICAgICogT0ZGOyBvdGhlcndpc2UgdGhlIGF1dG8tZXhwb3N1cmUgYWxnb3JpdGhtIHdpbGwgb3ZlcnJpZGUgdGhpcyB2YWx1ZS48L3A+CiAgICAgICoKQEAgLTM1NjcsMTQgKzM2NjEsMTIgQEAKICAgICAgKiB0aW1lc3RhbXBzIGZvciBvdGhlciBjYXB0dXJlcyBmcm9tIHRoZSBzYW1lIGNhbWVyYSBkZXZpY2UsIGJ1dCBhcmUKICAgICAgKiBub3QgZ3VhcmFudGVlZCB0byBiZSBjb21wYXJhYmxlIHRvIGFueSBvdGhlciB0aW1lIHNvdXJjZS48L3A+CiAgICAgICogPHA+V2hlbiBBQ0FNRVJBX1NFTlNPUl9JTkZPX1RJTUVTVEFNUF9TT1VSQ0UgPGNvZGU+PT08L2NvZGU+IFJFQUxUSU1FLCB0aGUKLSAgICAgKiB0aW1lc3RhbXBzIG1lYXN1cmUgdGltZSBpbiB0aGUgc2FtZSB0aW1lYmFzZSBhcwotICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL29zL1N5c3RlbUNsb2NrLmh0bWwjZWxhcHNlZFJlYWx0aW1lTmFub3MiPmVsYXBzZWRSZWFsdGltZU5hbm9zPC9hPgotICAgICAqIChvciBDTE9DS19CT09UVElNRSksIGFuZCB0aGV5IGNhbgorICAgICAqIHRpbWVzdGFtcHMgbWVhc3VyZSB0aW1lIGluIHRoZSBzYW1lIHRpbWViYXNlIGFzIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL29zL1N5c3RlbUNsb2NrLmh0bWwjZWxhcHNlZFJlYWx0aW1lTmFub3MiPlN5c3RlbUNsb2NrI2VsYXBzZWRSZWFsdGltZU5hbm9zPC9hPiwgYW5kIHRoZXkgY2FuCiAgICAgICogYmUgY29tcGFyZWQgdG8gb3RoZXIgdGltZXN0YW1wcyBmcm9tIG90aGVyIHN1YnN5c3RlbXMgdGhhdAogICAgICAqIGFyZSB1c2luZyB0aGF0IGJhc2UuPC9wPgogICAgICAqIDxwPkZvciByZXByb2Nlc3NpbmcsIHRoZSB0aW1lc3RhbXAgd2lsbCBtYXRjaCB0aGUgc3RhcnQgb2YgZXhwb3N1cmUgb2YKLSAgICAgKiB0aGUgaW5wdXQgaW1hZ2UsIGkuZS4ge0BsaW5rIENhcHR1cmVSZXN1bHQjU0VOU09SX1RJTUVTVEFNUCB0aGUKLSAgICAgKiB0aW1lc3RhbXB9IGluIHRoZSBUb3RhbENhcHR1cmVSZXN1bHQgdGhhdCB3YXMgdXNlZCB0byBjcmVhdGUgdGhlCisgICAgICogdGhlIGlucHV0IGltYWdlLCBpLmUuIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9DYXB0dXJlUmVzdWx0Lmh0bWwjU0VOU09SX1RJTUVTVEFNUCI+dGhlCisgICAgICogdGltZXN0YW1wPC9hPiBpbiB0aGUgVG90YWxDYXB0dXJlUmVzdWx0IHRoYXQgd2FzIHVzZWQgdG8gY3JlYXRlIHRoZQogICAgICAqIHJlcHJvY2VzcyBjYXB0dXJlIHJlcXVlc3QuPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX1RJTUVTVEFNUF9TT1VSQ0UKQEAgLTM3NzUsNyArMzg2Nyw2IEBACiAgICAgICogb3B0aWNhbGx5IHNoaWVsZGVkIHBpeGVsIGFyZWFzLiBCeSBibG9ja2luZyBsaWdodCwgdGhlc2UgcGl4ZWxzCiAgICAgICogcHJvdmlkZXMgYSByZWxpYWJsZSBibGFjayByZWZlcmVuY2UgZm9yIGJsYWNrIGxldmVsIGNvbXBlbnNhdGlvbgogICAgICAqIGluIGFjdGl2ZSBhcnJheSByZWdpb24uPC9wPgotICAgICAqIDxwPlRoZSBkYXRhIHJlcHJlc2VudGF0aW9uIGlzIGludFs0XSwgd2hpY2ggbWFwcyB0byAobGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0KS48L3A+CiAgICAgICogPHA+VGhpcyBrZXkgcHJvdmlkZXMgYSBsaXN0IG9mIGRpc2pvaW50IHJlY3RhbmdsZXMgc3BlY2lmeWluZyB0aGUKICAgICAgKiByZWdpb25zIG9mIG9wdGljYWxseSBzaGllbGRlZCAod2l0aCBtZXRhbCBzaGllbGQpIGJsYWNrIHBpeGVsCiAgICAgICogcmVnaW9ucyBpZiB0aGUgY2FtZXJhIGRldmljZSBpcyBjYXBhYmxlIG9mIHJlYWRpbmcgb3V0IHRoZXNlIGJsYWNrCkBAIC0zNzg1LDYgKzM4NzYsNyBAQAogICAgICAqIGJsYWNrIGxldmVsIG9mIGVhY2ggY2FwdHVyZWQgcmF3IGltYWdlcy48L3A+CiAgICAgICogPHA+V2hlbiB0aGlzIGtleSBpcyByZXBvcnRlZCwgdGhlIEFDQU1FUkFfU0VOU09SX0RZTkFNSUNfQkxBQ0tfTEVWRUwgYW5kCiAgICAgICogQUNBTUVSQV9TRU5TT1JfRFlOQU1JQ19XSElURV9MRVZFTCB3aWxsIGFsc28gYmUgcmVwb3J0ZWQuPC9wPgorICAgICAqIDxwPlRoZSBkYXRhIHJlcHJlc2VudGF0aW9uIGlzIDxjb2RlPmludFs0XTwvY29kZT4sIHdoaWNoIG1hcHMgdG8gPGNvZGU+KGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCk8L2NvZGU+LjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfQkxBQ0tfTEVWRUxfUEFUVEVSTgogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfRFlOQU1JQ19CTEFDS19MRVZFTApAQCAtMzgyNSw5ICszOTE3LDggQEAKICAgICAgKiBsYXlvdXQga2V5IChzZWUgQUNBTUVSQV9TRU5TT1JfSU5GT19DT0xPUl9GSUxURVJfQVJSQU5HRU1FTlQpLCBpLmUuIHRoZQogICAgICAqIG50aCB2YWx1ZSBnaXZlbiBjb3JyZXNwb25kcyB0byB0aGUgYmxhY2sgbGV2ZWwgb2Zmc2V0IGZvciB0aGUgbnRoCiAgICAgICogY29sb3IgY2hhbm5lbCBsaXN0ZWQgaW4gdGhlIENGQS48L3A+Ci0gICAgICogPHA+VGhpcyBrZXkgd2lsbCBiZSBhdmFpbGFibGUgaWYgQUNBTUVSQV9TRU5TT1JfT1BUSUNBTF9CTEFDS19SRUdJT05TIGlzCi0gICAgICogYXZhaWxhYmxlIG9yIHRoZSBjYW1lcmEgZGV2aWNlIGFkdmVydGlzZXMgdGhpcyBrZXkgdmlhCi0gICAgICoge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUkVTVUxUX0tFWVN9LjwvcD4KKyAgICAgKiA8cD5UaGlzIGtleSB3aWxsIGJlIGF2YWlsYWJsZSBpZiBBQ0FNRVJBX1NFTlNPUl9PUFRJQ0FMX0JMQUNLX1JFR0lPTlMgaXMgYXZhaWxhYmxlIG9yIHRoZQorICAgICAqIGNhbWVyYSBkZXZpY2UgYWR2ZXJ0aXNlcyB0aGlzIGtleSB2aWEge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUkVTVUxUX0tFWVMgfS48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0JMQUNLX0xFVkVMX1BBVFRFUk4KICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0lORk9fQ09MT1JfRklMVEVSX0FSUkFOR0VNRU5UCkBAIC0zODUzLDcgKzM5NDQsNyBAQAogICAgICAqIGVzdGltYXRlZCB3aGl0ZSBsZXZlbCBmb3IgZWFjaCBmcmFtZS48L3A+CiAgICAgICogPHA+VGhpcyBrZXkgd2lsbCBiZSBhdmFpbGFibGUgaWYgQUNBTUVSQV9TRU5TT1JfT1BUSUNBTF9CTEFDS19SRUdJT05TIGlzCiAgICAgICogYXZhaWxhYmxlIG9yIHRoZSBjYW1lcmEgZGV2aWNlIGFkdmVydGlzZXMgdGhpcyBrZXkgdmlhCi0gICAgICoge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUkVTVUxUX0tFWVN9LjwvcD4KKyAgICAgKiB7QGxpbmsgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9SRVNVTFRfS0VZUyB9LjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfQkxBQ0tfTEVWRUxfUEFUVEVSTgogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfSU5GT19XSElURV9MRVZFTApAQCAtMzg4MiwxMyArMzk3MywxMyBAQAogICAgICAqIDxwPlRoaXMgcmVjdGFuZ2xlIGlzIGRlZmluZWQgcmVsYXRpdmUgdG8gdGhlIGZ1bGwgcGl4ZWwgYXJyYXk7ICgwLDApIGlzIHRoZSB0b3AtbGVmdCBvZgogICAgICAqIHRoZSBmdWxsIHBpeGVsIGFycmF5LCBhbmQgdGhlIHNpemUgb2YgdGhlIGZ1bGwgcGl4ZWwgYXJyYXkgaXMgZ2l2ZW4gYnkKICAgICAgKiBBQ0FNRVJBX1NFTlNPUl9JTkZPX1BJWEVMX0FSUkFZX1NJWkUuPC9wPgotICAgICAqIDxwPlRoZSBkYXRhIHJlcHJlc2VudGF0aW9uIGlzIGludFs0XSwgd2hpY2ggbWFwcyB0byAobGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0KS48L3A+CiAgICAgICogPHA+VGhlIGNvb3JkaW5hdGUgc3lzdGVtIGZvciBtb3N0IG90aGVyIGtleXMgdGhhdCBsaXN0IHBpeGVsIGNvb3JkaW5hdGVzLCBpbmNsdWRpbmcKICAgICAgKiBBQ0FNRVJBX1NDQUxFUl9DUk9QX1JFR0lPTiwgaXMgZGVmaW5lZCByZWxhdGl2ZSB0byB0aGUgYWN0aXZlIGFycmF5IHJlY3RhbmdsZSBnaXZlbiBpbgogICAgICAqIHRoaXMgZmllbGQsIHdpdGggPGNvZGU+KDAsIDApPC9jb2RlPiBiZWluZyB0aGUgdG9wLWxlZnQgb2YgdGhpcyByZWN0YW5nbGUuPC9wPgogICAgICAqIDxwPlRoZSBhY3RpdmUgYXJyYXkgbWF5IGJlIHNtYWxsZXIgdGhhbiB0aGUgZnVsbCBwaXhlbCBhcnJheSwgc2luY2UgdGhlIGZ1bGwgYXJyYXkgbWF5CiAgICAgICogaW5jbHVkZSBibGFjayBjYWxpYnJhdGlvbiBwaXhlbHMgb3Igb3RoZXIgaW5hY3RpdmUgcmVnaW9ucywgYW5kIGdlb21ldHJpYyBjb3JyZWN0aW9uCiAgICAgICogcmVzdWx0aW5nIGluIHNjYWxpbmcgb3IgY3JvcHBpbmcgbWF5IGhhdmUgYmVlbiBhcHBsaWVkLjwvcD4KKyAgICAgKiA8cD5UaGUgZGF0YSByZXByZXNlbnRhdGlvbiBpcyA8Y29kZT5pbnRbNF08L2NvZGU+LCB3aGljaCBtYXBzIHRvIDxjb2RlPihsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQpPC9jb2RlPi48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0NBTEVSX0NST1BfUkVHSU9OCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX1BJWEVMX0FSUkFZX1NJWkUKQEAgLTM5NjAsOCArNDA1MSw3IEBACiAgICAgICogPHA+QXR0ZW1wdGluZyB0byB1c2UgZnJhbWUgZHVyYXRpb25zIGJleW9uZCB0aGUgbWF4aW11bSB3aWxsIHJlc3VsdCBpbiB0aGUgZnJhbWUKICAgICAgKiBkdXJhdGlvbiBiZWluZyBjbGlwcGVkIHRvIHRoZSBtYXhpbXVtLiBTZWUgdGhhdCBjb250cm9sIGZvciBhIGZ1bGwgZGVmaW5pdGlvbiBvZiBmcmFtZQogICAgICAqIGR1cmF0aW9ucy48L3A+Ci0gICAgICogPHA+UmVmZXIgdG8ge0BsaW5rCi0gICAgICogQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX01JTl9GUkFNRV9EVVJBVElPTlN9CisgICAgICogPHA+UmVmZXIgdG8ge0BsaW5rIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9NSU5fRlJBTUVfRFVSQVRJT05TIH0KICAgICAgKiBmb3IgdGhlIG1pbmltdW0gZnJhbWUgZHVyYXRpb24gdmFsdWVzLjwvcD4KICAgICAgKi8KICAgICBBQ0FNRVJBX1NFTlNPUl9JTkZPX01BWF9GUkFNRV9EVVJBVElPTiA9ICAgICAgICAgICAgICAgICAgICAvLyBpbnQ2NApAQCAtNDAwMCw5ICs0MDkwLDkgQEAKICAgICAgKiB0aGUgcmF3IGJ1ZmZlcnMgcHJvZHVjZWQgYnkgdGhpcyBzZW5zb3IuPC9wPgogICAgICAqIDxwPklmIGEgY2FtZXJhIGRldmljZSBzdXBwb3J0cyByYXcgc2Vuc29yIGZvcm1hdHMsIGVpdGhlciB0aGlzIG9yCiAgICAgICogQUNBTUVSQV9TRU5TT1JfSU5GT19QUkVfQ09SUkVDVElPTl9BQ1RJVkVfQVJSQVlfU0laRSBpcyB0aGUgbWF4aW11bSBkaW1lbnNpb25zIGZvciB0aGUgcmF3Ci0gICAgICogb3V0cHV0IGZvcm1hdHMgbGlzdGVkIGluIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMgKHRoaXMgZGVwZW5kcyBvbgotICAgICAqIHdoZXRoZXIgb3Igbm90IHRoZSBpbWFnZSBzZW5zb3IgcmV0dXJucyBidWZmZXJzIGNvbnRhaW5pbmcgcGl4ZWxzIHRoYXQgYXJlIG5vdAotICAgICAqIHBhcnQgb2YgdGhlIGFjdGl2ZSBhcnJheSByZWdpb24gZm9yIGJsYWNrbGV2ZWwgY2FsaWJyYXRpb24gb3Igb3RoZXIgcHVycG9zZXMpLjwvcD4KKyAgICAgKiBvdXRwdXQgZm9ybWF0cyBsaXN0ZWQgaW4ge0BsaW5rIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMgfQorICAgICAqICh0aGlzIGRlcGVuZHMgb24gd2hldGhlciBvciBub3QgdGhlIGltYWdlIHNlbnNvciByZXR1cm5zIGJ1ZmZlcnMgY29udGFpbmluZyBwaXhlbHMgdGhhdAorICAgICAqIGFyZSBub3QgcGFydCBvZiB0aGUgYWN0aXZlIGFycmF5IHJlZ2lvbiBmb3IgYmxhY2tsZXZlbCBjYWxpYnJhdGlvbiBvciBvdGhlciBwdXJwb3NlcykuPC9wPgogICAgICAqIDxwPlNvbWUgcGFydHMgb2YgdGhlIGZ1bGwgcGl4ZWwgYXJyYXkgbWF5IG5vdCByZWNlaXZlIGxpZ2h0IGZyb20gdGhlIHNjZW5lLAogICAgICAqIG9yIGJlIG90aGVyd2lzZSBpbmFjdGl2ZS4gIFRoZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX1BSRV9DT1JSRUNUSU9OX0FDVElWRV9BUlJBWV9TSVpFIGtleQogICAgICAqIGRlZmluZXMgdGhlIHJlY3RhbmdsZSBvZiBhY3RpdmUgcGl4ZWxzIHRoYXQgd2lsbCBiZSBpbmNsdWRlZCBpbiBwcm9jZXNzZWQgaW1hZ2UKQEAgLTQwOTIsNyArNDE4Miw2IEBACiAgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9saT4KICAgICAgKiA8L3VsPjwvcD4KICAgICAgKgotICAgICAqIDxwPlRoZSBkYXRhIHJlcHJlc2VudGF0aW9uIGlzIGludFs0XSwgd2hpY2ggbWFwcyB0byAobGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0KS48L3A+CiAgICAgICogPHA+VGhpcyBpcyB0aGUgcmVjdGFuZ2xlIHJlcHJlc2VudGluZyB0aGUgc2l6ZSBvZiB0aGUgYWN0aXZlIHJlZ2lvbiBvZiB0aGUgc2Vuc29yIChpLmUuCiAgICAgICogdGhlIHJlZ2lvbiB0aGF0IGFjdHVhbGx5IHJlY2VpdmVzIGxpZ2h0IGZyb20gdGhlIHNjZW5lKSBiZWZvcmUgYW55IGdlb21ldHJpYyBjb3JyZWN0aW9uCiAgICAgICogaGFzIGJlZW4gYXBwbGllZCwgYW5kIHNob3VsZCBiZSB0cmVhdGVkIGFzIHRoZSBhY3RpdmUgcmVnaW9uIHJlY3RhbmdsZSBmb3IgYW55IG9mIHRoZQpAQCAtNDEzMyw3ICs0MjIyLDcgQEAKICAgICAgKiBBQ0FNRVJBX1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFLjwvcD4KICAgICAgKiA8cD5UaGUgY3VycmVudGx5IHN1cHBvcnRlZCBmaWVsZHMgdGhhdCBjb3JyZWN0IGZvciBnZW9tZXRyaWMgZGlzdG9ydGlvbiBhcmU6PC9wPgogICAgICAqIDxvbD4KLSAgICAgKiA8bGk+QUNBTUVSQV9MRU5TX1JBRElBTF9ESVNUT1JUSU9OLjwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfTEVOU19ESVNUT1JUSU9OLjwvbGk+CiAgICAgICogPC9vbD4KICAgICAgKiA8cD5JZiBhbGwgb2YgdGhlIGdlb21ldHJpYyBkaXN0b3J0aW9uIGZpZWxkcyBhcmUgbm8tb3BzLCB0aGlzIHJlY3RhbmdsZSB3aWxsIGJlIHRoZSBzYW1lCiAgICAgICogYXMgdGhlIHBvc3QtZGlzdG9ydGlvbi1jb3JyZWN0ZWQgcmVjdGFuZ2xlIGdpdmVuIGluCkBAIC00MTQzLDggKzQyMzIsOSBAQAogICAgICAqIEFDQU1FUkFfU0VOU09SX0lORk9fUElYRUxfQVJSQVlfU0laRS48L3A+CiAgICAgICogPHA+VGhlIHByZS1jb3JyZWN0aW9uIGFjdGl2ZSBhcnJheSBtYXkgYmUgc21hbGxlciB0aGFuIHRoZSBmdWxsIHBpeGVsIGFycmF5LCBzaW5jZSB0aGUKICAgICAgKiBmdWxsIGFycmF5IG1heSBpbmNsdWRlIGJsYWNrIGNhbGlicmF0aW9uIHBpeGVscyBvciBvdGhlciBpbmFjdGl2ZSByZWdpb25zLjwvcD4KKyAgICAgKiA8cD5UaGUgZGF0YSByZXByZXNlbnRhdGlvbiBpcyA8Y29kZT5pbnRbNF08L2NvZGU+LCB3aGljaCBtYXBzIHRvIDxjb2RlPihsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQpPC9jb2RlPi48L3A+CiAgICAgICoKLSAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19SQURJQUxfRElTVE9SVElPTgorICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX0RJU1RPUlRJT04KICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkUKICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0lORk9fUElYRUxfQVJSQVlfU0laRQogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfSU5GT19QUkVfQ09SUkVDVElPTl9BQ1RJVkVfQVJSQVlfU0laRQpAQCAtNDMwMiwxMCArNDM5MiwxMCBAQAogICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IGNhbGxiYWNrczwvbGk+CiAgICAgICogPC91bD48L3A+CiAgICAgICoKLSAgICAgKiA8cD5UaGUgZGF0YSByZXByZXNlbnRhdGlvbiBpcyBpbnRbNF0sIHdoaWNoIG1hcHMgdG8gKGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCkuPC9wPgogICAgICAqIDxwPlRoZSBjb29yZGluYXRlIHN5c3RlbSBpcyB0aGF0IG9mIEFDQU1FUkFfU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkUsIHdpdGgKICAgICAgKiA8Y29kZT4oMCwgMCk8L2NvZGU+IGJlaW5nIHRoZSB0b3AtbGVmdCBwaXhlbCBvZiB0aGUgYWN0aXZlIGFycmF5LjwvcD4KLSAgICAgKiA8cD5Pbmx5IGF2YWlsYWJsZSBpZiBBQ0FNRVJBX1NUQVRJU1RJQ1NfRkFDRV9ERVRFQ1RfTU9ERSAhPSBPRkY8L3A+CisgICAgICogPHA+T25seSBhdmFpbGFibGUgaWYgQUNBTUVSQV9TVEFUSVNUSUNTX0ZBQ0VfREVURUNUX01PREUgIT0gT0ZGCisgICAgICogVGhlIGRhdGEgcmVwcmVzZW50YXRpb24gaXMgPGNvZGU+aW50WzRdPC9jb2RlPiwgd2hpY2ggbWFwcyB0byA8Y29kZT4obGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0KTwvY29kZT4uPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFCiAgICAgICogQHNlZSBBQ0FNRVJBX1NUQVRJU1RJQ1NfRkFDRV9ERVRFQ1RfTU9ERQpAQCAtNDQ4Myw2ICs0NTczLDgwIEBACiAgICAgICovCiAgICAgQUNBTUVSQV9TVEFUSVNUSUNTX0xFTlNfU0hBRElOR19NQVBfTU9ERSA9ICAgICAgICAgICAgICAgICAgLy8gYnl0ZSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc3RhdGlzdGljc19sZW5zX3NoYWRpbmdfbWFwX21vZGVfdCkKICAgICAgICAgICAgIEFDQU1FUkFfU1RBVElTVElDU19TVEFSVCArIDE2LAorICAgIC8qKgorICAgICAqIDxwPkEgY29udHJvbCBmb3Igc2VsZWN0aW5nIHdoZXRoZXIgT0lTIHBvc2l0aW9uIGluZm9ybWF0aW9uIGlzIGluY2x1ZGVkIGluIG91dHB1dAorICAgICAqIHJlc3VsdCBtZXRhZGF0YS48L3A+CisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBieXRlIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9zdGF0aXN0aWNzX29pc19kYXRhX21vZGVfdCk8L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCBjYWxsYmFja3M8L2xpPgorICAgICAqICAgPGxpPkFDYXB0dXJlUmVxdWVzdDwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NUQVRJU1RJQ1NfT0lTX0RBVEFfTU9ERSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBieXRlIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9zdGF0aXN0aWNzX29pc19kYXRhX21vZGVfdCkKKyAgICAgICAgICAgIEFDQU1FUkFfU1RBVElTVElDU19TVEFSVCArIDE3LAorICAgIC8qKgorICAgICAqIDxwPkFuIGFycmF5IG9mIHRpbWVzdGFtcHMgb2YgT0lTIHNhbXBsZXMsIGluIG5hbm9zZWNvbmRzLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlR5cGU6IGludDY0W25dPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgY2FsbGJhY2tzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoZSBhcnJheSBjb250YWlucyB0aGUgdGltZXN0YW1wcyBvZiBPSVMgc2FtcGxlcy4gVGhlIHRpbWVzdGFtcHMgYXJlIGluIHRoZSBzYW1lCisgICAgICogdGltZWJhc2UgYXMgYW5kIGNvbXBhcmFibGUgdG8gQUNBTUVSQV9TRU5TT1JfVElNRVNUQU1QLjwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfVElNRVNUQU1QCisgICAgICovCisgICAgQUNBTUVSQV9TVEFUSVNUSUNTX09JU19USU1FU1RBTVBTID0gICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50NjRbbl0KKyAgICAgICAgICAgIEFDQU1FUkFfU1RBVElTVElDU19TVEFSVCArIDE4LAorICAgIC8qKgorICAgICAqIDxwPkFuIGFycmF5IG9mIHNoaWZ0cyBvZiBPSVMgc2FtcGxlcywgaW4geCBkaXJlY3Rpb24uPC9wPgorICAgICAqCisgICAgICogPHA+VHlwZTogZmxvYXRbbl08L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCBjYWxsYmFja3M8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+VGhlIGFycmF5IGNvbnRhaW5zIHRoZSBhbW91bnQgb2Ygc2hpZnRzIGluIHggZGlyZWN0aW9uLCBpbiBwaXhlbHMsIGJhc2VkIG9uIE9JUyBzYW1wbGVzLgorICAgICAqIEEgcG9zaXRpdmUgdmFsdWUgaXMgYSBzaGlmdCBmcm9tIGxlZnQgdG8gcmlnaHQgaW4gYWN0aXZlIGFycmF5IGNvb3JkaW5hdGUgc3lzdGVtLiBGb3IKKyAgICAgKiBleGFtcGxlLCBpZiB0aGUgb3B0aWNhbCBjZW50ZXIgaXMgKDEwMDAsIDUwMCkgaW4gYWN0aXZlIGFycmF5IGNvb3JkaW5hdGVzLCBhIHNoaWZ0IG9mCisgICAgICogKDMsIDApIHB1dHMgdGhlIG5ldyBvcHRpY2FsIGNlbnRlciBhdCAoMTAwMywgNTAwKS48L3A+CisgICAgICogPHA+VGhlIG51bWJlciBvZiBzaGlmdHMgbXVzdCBtYXRjaCB0aGUgbnVtYmVyIG9mIHRpbWVzdGFtcHMgaW4KKyAgICAgKiBBQ0FNRVJBX1NUQVRJU1RJQ1NfT0lTX1RJTUVTVEFNUFMuPC9wPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX1NUQVRJU1RJQ1NfT0lTX1RJTUVTVEFNUFMKKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NUQVRJU1RJQ1NfT0lTX1hfU0hJRlRTID0gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmbG9hdFtuXQorICAgICAgICAgICAgQUNBTUVSQV9TVEFUSVNUSUNTX1NUQVJUICsgMTksCisgICAgLyoqCisgICAgICogPHA+QW4gYXJyYXkgb2Ygc2hpZnRzIG9mIE9JUyBzYW1wbGVzLCBpbiB5IGRpcmVjdGlvbi48L3A+CisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBmbG9hdFtuXTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IGNhbGxiYWNrczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGUgYXJyYXkgY29udGFpbnMgdGhlIGFtb3VudCBvZiBzaGlmdHMgaW4geSBkaXJlY3Rpb24sIGluIHBpeGVscywgYmFzZWQgb24gT0lTIHNhbXBsZXMuCisgICAgICogQSBwb3NpdGl2ZSB2YWx1ZSBpcyBhIHNoaWZ0IGZyb20gdG9wIHRvIGJvdHRvbSBpbiBhY3RpdmUgYXJyYXkgY29vcmRpbmF0ZSBzeXN0ZW0uIEZvcgorICAgICAqIGV4YW1wbGUsIGlmIHRoZSBvcHRpY2FsIGNlbnRlciBpcyAoMTAwMCwgNTAwKSBpbiBhY3RpdmUgYXJyYXkgY29vcmRpbmF0ZXMsIGEgc2hpZnQgb2YKKyAgICAgKiAoMCwgNSkgcHV0cyB0aGUgbmV3IG9wdGljYWwgY2VudGVyIGF0ICgxMDAwLCA1MDUpLjwvcD4KKyAgICAgKiA8cD5UaGUgbnVtYmVyIG9mIHNoaWZ0cyBtdXN0IG1hdGNoIHRoZSBudW1iZXIgb2YgdGltZXN0YW1wcyBpbgorICAgICAqIEFDQU1FUkFfU1RBVElTVElDU19PSVNfVElNRVNUQU1QUy48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfU1RBVElTVElDU19PSVNfVElNRVNUQU1QUworICAgICAqLworICAgIEFDQU1FUkFfU1RBVElTVElDU19PSVNfWV9TSElGVFMgPSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZsb2F0W25dCisgICAgICAgICAgICBBQ0FNRVJBX1NUQVRJU1RJQ1NfU1RBUlQgKyAyMCwKICAgICBBQ0FNRVJBX1NUQVRJU1RJQ1NfRU5ELAogCiAgICAgLyoqCkBAIC00NTU1LDYgKzQ3MTksMjQgQEAKICAgICAgKi8KICAgICBBQ0FNRVJBX1NUQVRJU1RJQ1NfSU5GT19BVkFJTEFCTEVfTEVOU19TSEFESU5HX01BUF9NT0RFUyA9ICAvLyBieXRlW25dCiAgICAgICAgICAgICBBQ0FNRVJBX1NUQVRJU1RJQ1NfSU5GT19TVEFSVCArIDcsCisgICAgLyoqCisgICAgICogPHA+TGlzdCBvZiBPSVMgZGF0YSBvdXRwdXQgbW9kZXMgZm9yIEFDQU1FUkFfU1RBVElTVElDU19PSVNfREFUQV9NT0RFIHRoYXQKKyAgICAgKiBhcmUgc3VwcG9ydGVkIGJ5IHRoaXMgY2FtZXJhIGRldmljZS48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfU1RBVElTVElDU19PSVNfREFUQV9NT0RFCisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBieXRlW25dPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPklmIG5vIE9JUyBkYXRhIG91dHB1dCBpcyBhdmFpbGFibGUgZm9yIHRoaXMgY2FtZXJhIGRldmljZSwgdGhpcyBrZXkgd2lsbAorICAgICAqIGNvbnRhaW4gb25seSBPRkYuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfU1RBVElTVElDU19JTkZPX0FWQUlMQUJMRV9PSVNfREFUQV9NT0RFUyA9ICAgICAgICAgIC8vIGJ5dGVbbl0KKyAgICAgICAgICAgIEFDQU1FUkFfU1RBVElTVElDU19JTkZPX1NUQVJUICsgOCwKICAgICBBQ0FNRVJBX1NUQVRJU1RJQ1NfSU5GT19FTkQsCiAKICAgICAvKioKQEAgLTQ2MjcsNiArNDgwOSw4IEBACiAgICAgICogb2YgcG9pbnRzIGNhbiBiZSBsZXNzIHRoYW4gbWF4ICh0aGF0IGlzLCB0aGUgcmVxdWVzdCBkb2Vzbid0IGhhdmUgdG8KICAgICAgKiBhbHdheXMgcHJvdmlkZSBhIGN1cnZlIHdpdGggbnVtYmVyIG9mIHBvaW50cyBlcXVpdmFsZW50IHRvCiAgICAgICogQUNBTUVSQV9UT05FTUFQX01BWF9DVVJWRV9QT0lOVFMpLjwvcD4KKyAgICAgKiA8cD5Gb3IgZGV2aWNlcyB3aXRoIE1PTk9DSFJPTUUgY2FwYWJpbGl0eSwgb25seSByZWQgY2hhbm5lbCBpcyB1c2VkLiBHcmVlbiBhbmQgYmx1ZSBjaGFubmVscworICAgICAqIGFyZSBpZ25vcmVkLjwvcD4KICAgICAgKiA8cD5BIGZldyBleGFtcGxlcywgYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcgZ3JhcGhpY2FsIG1hcHBpbmdzOyB0aGVzZQogICAgICAqIG9ubHkgc3BlY2lmeSB0aGUgcmVkIGNoYW5uZWwgYW5kIHRoZSBwcmVjaXNpb24gaXMgbGltaXRlZCB0byA0CiAgICAgICogZGlnaXRzLCBmb3IgY29uY2lzZW5lc3MuPC9wPgpAQCAtNDgzMiw3ICs1MDE2LDcgQEAKICAgICAgKiA8cD5TZWUgdGhlIGluZGl2aWR1YWwgbGV2ZWwgZW51bXMgZm9yIGZ1bGwgZGVzY3JpcHRpb25zIG9mIHRoZSBzdXBwb3J0ZWQgY2FwYWJpbGl0aWVzLiAgVGhlCiAgICAgICogQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMgZW50cnkgZGVzY3JpYmVzIHRoZSBkZXZpY2UncyBjYXBhYmlsaXRpZXMgYXQgYQogICAgICAqIGZpbmVyLWdyYWluIGxldmVsLCBpZiBuZWVkZWQuIEluIGFkZGl0aW9uLCBtYW55IGNvbnRyb2xzIGhhdmUgdGhlaXIgYXZhaWxhYmxlIHNldHRpbmdzIG9yCi0gICAgICogcmFuZ2VzIGRlZmluZWQgaW4gaW5kaXZpZHVhbCBtZXRhZGF0YSB0YWcgZW50cmllcyBpbiB0aGlzIGRvY3VtZW50LjwvcD4KKyAgICAgKiByYW5nZXMgZGVmaW5lZCBpbiBpbmRpdmlkdWFsIGVudHJpZXMgZnJvbSB7QGxpbmsgQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzIH0uPC9wPgogICAgICAqIDxwPlNvbWUgZmVhdHVyZXMgYXJlIG5vdCBwYXJ0IG9mIGFueSBwYXJ0aWN1bGFyIGhhcmR3YXJlIGxldmVsIG9yIGNhcGFiaWxpdHkgYW5kIG11c3QgYmUKICAgICAgKiBxdWVyaWVkIHNlcGFyYXRlbHkuIFRoZXNlIGluY2x1ZGU6PC9wPgogICAgICAqIDx1bD4KQEAgLTQ4NTMsNiArNTAzNywyMyBAQAogICAgICAqLwogICAgIEFDQU1FUkFfSU5GT19TVVBQT1JURURfSEFSRFdBUkVfTEVWRUwgPSAgICAgICAgICAgICAgICAgICAgIC8vIGJ5dGUgKGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2luZm9fc3VwcG9ydGVkX2hhcmR3YXJlX2xldmVsX3QpCiAgICAgICAgICAgICBBQ0FNRVJBX0lORk9fU1RBUlQsCisgICAgLyoqCisgICAgICogPHA+QSBzaG9ydCBzdHJpbmcgZm9yIG1hbnVmYWN0dXJlciB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjYW1lcmEgZGV2aWNlLCBzdWNoIGFzCisgICAgICogSVNQIGhhcmR3YXJlLCBzZW5zb3JzLCBldGMuPC9wPgorICAgICAqCisgICAgICogPHA+VHlwZTogYnl0ZTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIGNhbiBiZSB1c2VkIGluIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL21lZGlhL0V4aWZJbnRlcmZhY2UuaHRtbCNUQUdfSU1BR0VfREVTQ1JJUFRJT04iPlRBR19JTUFHRV9ERVNDUklQVElPTjwvYT4KKyAgICAgKiBpbiBqcGVnIEVYSUYuIFRoaXMga2V5IG1heSBiZSBhYnNlbnQgaWYgbm8gdmVyc2lvbiBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgb24gdGhlCisgICAgICogZGV2aWNlLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0lORk9fVkVSU0lPTiA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBieXRlCisgICAgICAgICAgICBBQ0FNRVJBX0lORk9fU1RBUlQgKyAxLAogICAgIEFDQU1FUkFfSU5GT19FTkQsCiAKICAgICAvKioKQEAgLTUwNjksNiArNTI3MCw4NiBAQAogICAgICAgICAgICAgQUNBTUVSQV9ERVBUSF9TVEFSVCArIDQsCiAgICAgQUNBTUVSQV9ERVBUSF9FTkQsCiAKKyAgICAvKioKKyAgICAgKiA8cD5UaGUgYWNjdXJhY3kgb2YgZnJhbWUgdGltZXN0YW1wIHN5bmNocm9uaXphdGlvbiBiZXR3ZWVuIHBoeXNpY2FsIGNhbWVyYXM8L3A+CisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBieXRlIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9sb2dpY2FsX211bHRpX2NhbWVyYV9zZW5zb3Jfc3luY190eXBlX3QpPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoZSBhY2N1cmFjeSBvZiB0aGUgZnJhbWUgdGltZXN0YW1wIHN5bmNocm9uaXphdGlvbiBkZXRlcm1pbmVzIHRoZSBwaHlzaWNhbCBjYW1lcmFzJworICAgICAqIGFiaWxpdHkgdG8gc3RhcnQgZXhwb3N1cmUgYXQgdGhlIHNhbWUgdGltZS4gSWYgdGhlIHNlbnNvclN5bmNUeXBlIGlzIENBTElCUkFURUQsCisgICAgICogdGhlIHBoeXNpY2FsIGNhbWVyYSBzZW5zb3JzIHVzdWFsbHkgcnVuIGluIG1hc3Rlci1zbGF2ZSBtb2RlIHNvIHRoYXQgdGhlaXIgc2h1dHRlcgorICAgICAqIHRpbWUgaXMgc3luY2hyb25pemVkLiBGb3IgQVBQUk9YSU1BVEUgc2Vuc29yU3luY1R5cGUsIHRoZSBjYW1lcmEgc2Vuc29ycyB1c3VhbGx5IHJ1biBpbgorICAgICAqIG1hc3Rlci1tYXN0ZXIgbW9kZSwgYW5kIHRoZXJlIGNvdWxkIGJlIG9mZnNldCBiZXR3ZWVuIHRoZWlyIHN0YXJ0IG9mIGV4cG9zdXJlLjwvcD4KKyAgICAgKiA8cD5JbiBib3RoIGNhc2VzLCBhbGwgaW1hZ2VzIGdlbmVyYXRlZCBmb3IgYSBwYXJ0aWN1bGFyIGNhcHR1cmUgcmVxdWVzdCBzdGlsbCBjYXJyeSB0aGUgc2FtZQorICAgICAqIHRpbWVzdGFtcHMsIHNvIHRoYXQgdGhleSBjYW4gYmUgdXNlZCB0byBsb29rIHVwIHRoZSBtYXRjaGluZyBmcmFtZSBudW1iZXIgYW5kCisgICAgICogb25DYXB0dXJlU3RhcnRlZCBjYWxsYmFjay48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9MT0dJQ0FMX01VTFRJX0NBTUVSQV9TRU5TT1JfU1lOQ19UWVBFID0gICAgICAgICAgICAgLy8gYnl0ZSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfbG9naWNhbF9tdWx0aV9jYW1lcmFfc2Vuc29yX3N5bmNfdHlwZV90KQorICAgICAgICAgICAgQUNBTUVSQV9MT0dJQ0FMX01VTFRJX0NBTUVSQV9TVEFSVCArIDEsCisgICAgQUNBTUVSQV9MT0dJQ0FMX01VTFRJX0NBTUVSQV9FTkQsCisKKyAgICAvKioKKyAgICAgKiA8cD5Nb2RlIG9mIG9wZXJhdGlvbiBmb3IgdGhlIGxlbnMgZGlzdG9ydGlvbiBjb3JyZWN0aW9uIGJsb2NrLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlR5cGU6IGJ5dGUgKGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2Rpc3RvcnRpb25fY29ycmVjdGlvbl9tb2RlX3QpPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgY2FsbGJhY2tzPC9saT4KKyAgICAgKiAgIDxsaT5BQ2FwdHVyZVJlcXVlc3Q8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+VGhlIGxlbnMgZGlzdG9ydGlvbiBjb3JyZWN0aW9uIGJsb2NrIGF0dGVtcHRzIHRvIGltcHJvdmUgaW1hZ2UgcXVhbGl0eSBieSBmaXhpbmcKKyAgICAgKiByYWRpYWwsIHRhbmdlbnRpYWwsIG9yIG90aGVyIGdlb21ldHJpYyBhYmVycmF0aW9ucyBpbiB0aGUgY2FtZXJhIGRldmljZSdzIG9wdGljcy4gIElmCisgICAgICogYXZhaWxhYmxlLCB0aGUgQUNBTUVSQV9MRU5TX0RJU1RPUlRJT04gZmllbGQgZG9jdW1lbnRzIHRoZSBsZW5zJ3MgZGlzdG9ydGlvbiBwYXJhbWV0ZXJzLjwvcD4KKyAgICAgKiA8cD5PRkYgbWVhbnMgbm8gZGlzdG9ydGlvbiBjb3JyZWN0aW9uIGlzIGRvbmUuPC9wPgorICAgICAqIDxwPkZBU1QvSElHSF9RVUFMSVRZIGJvdGggbWVhbiBjYW1lcmEgZGV2aWNlIGRldGVybWluZWQgZGlzdG9ydGlvbiBjb3JyZWN0aW9uIHdpbGwgYmUKKyAgICAgKiBhcHBsaWVkLiBISUdIX1FVQUxJVFkgbW9kZSBpbmRpY2F0ZXMgdGhhdCB0aGUgY2FtZXJhIGRldmljZSB3aWxsIHVzZSB0aGUgaGlnaGVzdC1xdWFsaXR5CisgICAgICogY29ycmVjdGlvbiBhbGdvcml0aG1zLCBldmVuIGlmIGl0IHNsb3dzIGRvd24gY2FwdHVyZSByYXRlLiBGQVNUIG1lYW5zIHRoZSBjYW1lcmEgZGV2aWNlCisgICAgICogd2lsbCBub3Qgc2xvdyBkb3duIGNhcHR1cmUgcmF0ZSB3aGVuIGFwcGx5aW5nIGNvcnJlY3Rpb24uIEZBU1QgbWF5IGJlIHRoZSBzYW1lIGFzIE9GRiBpZgorICAgICAqIGFueSBjb3JyZWN0aW9uIGF0IGFsbCB3b3VsZCBzbG93IGRvd24gY2FwdHVyZSByYXRlLiAgRXZlcnkgb3V0cHV0IHN0cmVhbSB3aWxsIGhhdmUgYQorICAgICAqIHNpbWlsYXIgYW1vdW50IG9mIGVuaGFuY2VtZW50IGFwcGxpZWQuPC9wPgorICAgICAqIDxwPlRoZSBjb3JyZWN0aW9uIG9ubHkgYXBwbGllcyB0byBwcm9jZXNzZWQgb3V0cHV0cyBzdWNoIGFzIFlVViwgSlBFRywgb3IgREVQVEgxNjsgaXQgaXMgbm90CisgICAgICogYXBwbGllZCB0byBhbnkgUkFXIG91dHB1dC4gIE1ldGFkYXRhIGNvb3JkaW5hdGVzIHN1Y2ggYXMgZmFjZSByZWN0YW5nbGVzIG9yIG1ldGVyaW5nCisgICAgICogcmVnaW9ucyBhcmUgYWxzbyBub3QgYWZmZWN0ZWQgYnkgY29ycmVjdGlvbi48L3A+CisgICAgICogPHA+QXBwbGljYXRpb25zIGVuYWJsaW5nIGRpc3RvcnRpb24gY29ycmVjdGlvbiBuZWVkIHRvIHBheSBleHRyYSBhdHRlbnRpb24gd2hlbiBjb252ZXJ0aW5nCisgICAgICogaW1hZ2UgY29vcmRpbmF0ZXMgYmV0d2VlbiBjb3JyZWN0ZWQgb3V0cHV0IGJ1ZmZlcnMgYW5kIHRoZSBzZW5zb3IgYXJyYXkuIEZvciBleGFtcGxlLCBpZgorICAgICAqIHRoZSBhcHAgc3VwcG9ydHMgdGFwLXRvLWZvY3VzIGFuZCBlbmFibGVzIGNvcnJlY3Rpb24sIGl0IHRoZW4gaGFzIHRvIGFwcGx5IHRoZSBkaXN0b3J0aW9uCisgICAgICogbW9kZWwgZGVzY3JpYmVkIGluIEFDQU1FUkFfTEVOU19ESVNUT1JUSU9OIHRvIHRoZSBpbWFnZSBidWZmZXIgdGFwIGNvb3JkaW5hdGVzIHRvIHByb3Blcmx5CisgICAgICogY2FsY3VsYXRlIHRoZSB0YXAgcG9zaXRpb24gb24gdGhlIHNlbnNvciBhY3RpdmUgYXJyYXkgdG8gYmUgdXNlZCB3aXRoCisgICAgICogQUNBTUVSQV9DT05UUk9MX0FGX1JFR0lPTlMuIFRoZSBzYW1lIGFwcGxpZXMgaW4gcmV2ZXJzZSB0byBkZXRlY3RlZCBmYWNlIHJlY3RhbmdsZXMgaWYKKyAgICAgKiB0aGV5IG5lZWQgdG8gYmUgZHJhd24gb24gdG9wIG9mIHRoZSBjb3JyZWN0ZWQgb3V0cHV0IGJ1ZmZlcnMuPC9wPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX0NPTlRST0xfQUZfUkVHSU9OUworICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX0RJU1RPUlRJT04KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0RJU1RPUlRJT05fQ09SUkVDVElPTl9NT0RFID0gICAgICAgICAgICAgICAgICAgICAgICAvLyBieXRlIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9kaXN0b3J0aW9uX2NvcnJlY3Rpb25fbW9kZV90KQorICAgICAgICAgICAgQUNBTUVSQV9ESVNUT1JUSU9OX0NPUlJFQ1RJT05fU1RBUlQsCisgICAgLyoqCisgICAgICogPHA+TGlzdCBvZiBkaXN0b3J0aW9uIGNvcnJlY3Rpb24gbW9kZXMgZm9yIEFDQU1FUkFfRElTVE9SVElPTl9DT1JSRUNUSU9OX01PREUgdGhhdCBhcmUKKyAgICAgKiBzdXBwb3J0ZWQgYnkgdGhpcyBjYW1lcmEgZGV2aWNlLjwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9ESVNUT1JUSU9OX0NPUlJFQ1RJT05fTU9ERQorICAgICAqCisgICAgICogPHA+VHlwZTogYnl0ZVtuXTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5ObyBkZXZpY2UgaXMgcmVxdWlyZWQgdG8gc3VwcG9ydCB0aGlzIEFQSTsgc3VjaCBkZXZpY2VzIHdpbGwgYWx3YXlzIGxpc3Qgb25seSAnT0ZGJy4KKyAgICAgKiBBbGwgZGV2aWNlcyB0aGF0IHN1cHBvcnQgdGhpcyBBUEkgd2lsbCBsaXN0IGJvdGggRkFTVCBhbmQgSElHSF9RVUFMSVRZLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0RJU1RPUlRJT05fQ09SUkVDVElPTl9BVkFJTEFCTEVfTU9ERVMgPSAgICAgICAgICAgICAvLyBieXRlW25dCisgICAgICAgICAgICBBQ0FNRVJBX0RJU1RPUlRJT05fQ09SUkVDVElPTl9TVEFSVCArIDEsCisgICAgQUNBTUVSQV9ESVNUT1JUSU9OX0NPUlJFQ1RJT05fRU5ELAorCiB9IGFjYW1lcmFfbWV0YWRhdGFfdGFnX3Q7CiAKIC8qKgpAQCAtNTI4Miw2ICs1NTYzLDIxIEBACiAgICAgICovCiAgICAgQUNBTUVSQV9DT05UUk9MX0FFX01PREVfT05fQVVUT19GTEFTSF9SRURFWUUgICAgICAgICAgICAgICAgICAgICA9IDQsCiAKKyAgICAvKioKKyAgICAgKiA8cD5BbiBleHRlcm5hbCBmbGFzaCBoYXMgYmVlbiB0dXJuZWQgb24uPC9wPgorICAgICAqIDxwPkl0IGluZm9ybXMgdGhlIGNhbWVyYSBkZXZpY2UgdGhhdCBhbiBleHRlcm5hbCBmbGFzaCBoYXMgYmVlbiB0dXJuZWQgb24sIGFuZCB0aGF0CisgICAgICogbWV0ZXJpbmcgKGFuZCBjb250aW51b3VzIGZvY3VzIGlmIGFjdGl2ZSkgc2hvdWxkIGJlIHF1aWNrbHkgcmVjYWN1bGF0ZWQgdG8gYWNjb3VudAorICAgICAqIGZvciB0aGUgZXh0ZXJuYWwgZmxhc2guIE90aGVyd2lzZSwgdGhpcyBtb2RlIGFjdHMgbGlrZSBPTi48L3A+CisgICAgICogPHA+V2hlbiB0aGUgZXh0ZXJuYWwgZmxhc2ggaXMgdHVybmVkIG9mZiwgQUUgbW9kZSBzaG91bGQgYmUgY2hhbmdlZCB0byBvbmUgb2YgdGhlCisgICAgICogb3RoZXIgYXZhaWxhYmxlIEFFIG1vZGVzLjwvcD4KKyAgICAgKiA8cD5JZiB0aGUgY2FtZXJhIGRldmljZSBzdXBwb3J0cyBBRSBleHRlcm5hbCBmbGFzaCBtb2RlLCBBQ0FNRVJBX0NPTlRST0xfQUVfU1RBVEUgbXVzdAorICAgICAqIGJlIEZMQVNIX1JFUVVJUkVEIGFmdGVyIHRoZSBjYW1lcmEgZGV2aWNlIGZpbmlzaGVzIEFFIHNjYW4gYW5kIGl0J3MgdG9vIGRhcmsgd2l0aG91dAorICAgICAqIGZsYXNoLjwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9DT05UUk9MX0FFX1NUQVRFCisgICAgICovCisgICAgQUNBTUVSQV9DT05UUk9MX0FFX01PREVfT05fRVhURVJOQUxfRkxBU0ggICAgICAgICAgICAgICAgICAgICAgICA9IDUsCisKIH0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfY29udHJvbF9hZV9tb2RlX3Q7CiAKIC8vIEFDQU1FUkFfQ09OVFJPTF9BRV9QUkVDQVBUVVJFX1RSSUdHRVIKQEAgLTU2NDUsNiArNTk0MSwxNSBAQAogICAgICAqLwogICAgIEFDQU1FUkFfQ09OVFJPTF9DQVBUVVJFX0lOVEVOVF9NQU5VQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LAogCisgICAgLyoqCisgICAgICogPHA+VGhpcyByZXF1ZXN0IGlzIGZvciBhIG1vdGlvbiB0cmFja2luZyB1c2UgY2FzZSwgd2hlcmUKKyAgICAgKiB0aGUgYXBwbGljYXRpb24gd2lsbCB1c2UgY2FtZXJhIGFuZCBpbmVydGlhbCBzZW5zb3IgZGF0YSB0bworICAgICAqIGxvY2F0ZSBhbmQgdHJhY2sgb2JqZWN0cyBpbiB0aGUgd29ybGQuPC9wPgorICAgICAqIDxwPlRoZSBjYW1lcmEgZGV2aWNlIGF1dG8tZXhwb3N1cmUgcm91dGluZSB3aWxsIGxpbWl0IHRoZSBleHBvc3VyZSB0aW1lCisgICAgICogb2YgdGhlIGNhbWVyYSB0byBubyBtb3JlIHRoYW4gMjAgbWlsbGlzZWNvbmRzLCB0byBtaW5pbWl6ZSBtb3Rpb24gYmx1ci48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9DT05UUk9MX0NBUFRVUkVfSU5URU5UX01PVElPTl9UUkFDS0lORyAgICAgICAgICAgICAgICAgICA9IDcsCisKIH0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfY29udHJvbF9jYXB0dXJlX2ludGVudF90OwogCiAvLyBBQ0FNRVJBX0NPTlRST0xfRUZGRUNUX01PREUKQEAgLTYxMzUsNiArNjQ0MCwyMCBAQAogCiB9IGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2NvbnRyb2xfZW5hYmxlX3pzbF90OwogCisvLyBBQ0FNRVJBX0NPTlRST0xfQUZfU0NFTkVfQ0hBTkdFCit0eXBlZGVmIGVudW0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FjYW1lcmFfY29udHJvbF9hZl9zY2VuZV9jaGFuZ2UgeworICAgIC8qKgorICAgICAqIDxwPlNjZW5lIGNoYW5nZSBpcyBub3QgZGV0ZWN0ZWQgd2l0aGluIHRoZSBBRiByZWdpb24ocykuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfQ09OVFJPTF9BRl9TQ0VORV9DSEFOR0VfTk9UX0RFVEVDVEVEICAgICAgICAgICAgICAgICAgICAgPSAwLAorCisgICAgLyoqCisgICAgICogPHA+U2NlbmUgY2hhbmdlIGlzIGRldGVjdGVkIHdpdGhpbiB0aGUgQUYgcmVnaW9uKHMpLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0NPTlRST0xfQUZfU0NFTkVfQ0hBTkdFX0RFVEVDVEVEICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwKKworfSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9jb250cm9sX2FmX3NjZW5lX2NoYW5nZV90OworCiAKIAogLy8gQUNBTUVSQV9FREdFX01PREUKQEAgLTYxNTcsMTMgKzY0NzYsMTMgQEAKICAgICBBQ0FNRVJBX0VER0VfTU9ERV9ISUdIX1FVQUxJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwKIAogICAgIC8qKgotICAgICAqIDxwPkVkZ2UgZW5oYW5jZW1lbnQgaXMgYXBwbGllZCBhdCBkaWZmZXJlbnQgbGV2ZWxzIGZvciBkaWZmZXJlbnQgb3V0cHV0IHN0cmVhbXMsCi0gICAgICogYmFzZWQgb24gcmVzb2x1dGlvbi4gU3RyZWFtcyBhdCBtYXhpbXVtIHJlY29yZGluZyByZXNvbHV0aW9uIChzZWUge0BsaW5rCi0gICAgICogQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlU2Vzc2lvbn0pIG9yIGJlbG93IGhhdmUKLSAgICAgKiBlZGdlIGVuaGFuY2VtZW50IGFwcGxpZWQsIHdoaWxlIGhpZ2hlci1yZXNvbHV0aW9uIHN0cmVhbXMgaGF2ZSBubyBlZGdlIGVuaGFuY2VtZW50Ci0gICAgICogYXBwbGllZC4gVGhlIGxldmVsIG9mIGVkZ2UgZW5oYW5jZW1lbnQgZm9yIGxvdy1yZXNvbHV0aW9uIHN0cmVhbXMgaXMgdHVuZWQgc28gdGhhdAotICAgICAqIGZyYW1lIHJhdGUgaXMgbm90IGltcGFjdGVkLCBhbmQgdGhlIHF1YWxpdHkgaXMgZXF1YWwgdG8gb3IgYmV0dGVyIHRoYW4gRkFTVCAoc2luY2UgaXQKLSAgICAgKiBpcyBvbmx5IGFwcGxpZWQgdG8gbG93ZXItcmVzb2x1dGlvbiBvdXRwdXRzLCBxdWFsaXR5IG1heSBpbXByb3ZlIGZyb20gRkFTVCkuPC9wPgorICAgICAqIDxwPkVkZ2UgZW5oYW5jZW1lbnQgaXMgYXBwbGllZCBhdCBkaWZmZXJlbnQKKyAgICAgKiBsZXZlbHMgZm9yIGRpZmZlcmVudCBvdXRwdXQgc3RyZWFtcywgYmFzZWQgb24gcmVzb2x1dGlvbi4gU3RyZWFtcyBhdCBtYXhpbXVtIHJlY29yZGluZworICAgICAqIHJlc29sdXRpb24gKHNlZSB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlU2Vzc2lvbiB9KQorICAgICAqIG9yIGJlbG93IGhhdmUgZWRnZSBlbmhhbmNlbWVudCBhcHBsaWVkLCB3aGlsZSBoaWdoZXItcmVzb2x1dGlvbiBzdHJlYW1zIGhhdmUgbm8gZWRnZQorICAgICAqIGVuaGFuY2VtZW50IGFwcGxpZWQuIFRoZSBsZXZlbCBvZiBlZGdlIGVuaGFuY2VtZW50IGZvciBsb3ctcmVzb2x1dGlvbiBzdHJlYW1zIGlzIHR1bmVkCisgICAgICogc28gdGhhdCBmcmFtZSByYXRlIGlzIG5vdCBpbXBhY3RlZCwgYW5kIHRoZSBxdWFsaXR5IGlzIGVxdWFsIHRvIG9yIGJldHRlciB0aGFuIEZBU1QKKyAgICAgKiAoc2luY2UgaXQgaXMgb25seSBhcHBsaWVkIHRvIGxvd2VyLXJlc29sdXRpb24gb3V0cHV0cywgcXVhbGl0eSBtYXkgaW1wcm92ZSBmcm9tIEZBU1QpLjwvcD4KICAgICAgKiA8cD5UaGlzIG1vZGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMgb3BlcmF0aW5nIGluIGEgemVyby1zaHV0dGVyLWxhZyBtb2RlCiAgICAgICogd2l0aCBZVVYgb3IgUFJJVkFURSByZXByb2Nlc3NpbmcsIHdoZXJlIHRoZSBhcHBsaWNhdGlvbiBjb250aW51b3VzbHkgY2FwdHVyZXMKICAgICAgKiBoaWdoLXJlc29sdXRpb24gaW50ZXJtZWRpYXRlIGJ1ZmZlcnMgaW50byBhIGNpcmN1bGFyIGJ1ZmZlciwgZnJvbSB3aGljaCBhIGZpbmFsIGltYWdlIGlzCkBAIC02MzQyLDYgKzY2NjEsMjcgQEAKIAogfSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9sZW5zX3N0YXRlX3Q7CiAKKy8vIEFDQU1FUkFfTEVOU19QT1NFX1JFRkVSRU5DRQordHlwZWRlZiBlbnVtIGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hY2FtZXJhX2xlbnNfcG9zZV9yZWZlcmVuY2UgeworICAgIC8qKgorICAgICAqIDxwPlRoZSB2YWx1ZSBvZiBBQ0FNRVJBX0xFTlNfUE9TRV9UUkFOU0xBVElPTiBpcyByZWxhdGl2ZSB0byB0aGUgb3B0aWNhbCBjZW50ZXIgb2YKKyAgICAgKiB0aGUgbGFyZ2VzdCBjYW1lcmEgZGV2aWNlIGZhY2luZyB0aGUgc2FtZSBkaXJlY3Rpb24gYXMgdGhpcyBjYW1lcmEuPC9wPgorICAgICAqIDxwPlRoaXMgaXMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIEFQSSBsZXZlbHMgYmVmb3JlIEFuZHJvaWQgUC48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19QT1NFX1RSQU5TTEFUSU9OCisgICAgICovCisgICAgQUNBTUVSQV9MRU5TX1BPU0VfUkVGRVJFTkNFX1BSSU1BUllfQ0FNRVJBICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisKKyAgICAvKioKKyAgICAgKiA8cD5UaGUgdmFsdWUgb2YgQUNBTUVSQV9MRU5TX1BPU0VfVFJBTlNMQVRJT04gaXMgcmVsYXRpdmUgdG8gdGhlIHBvc2l0aW9uIG9mIHRoZQorICAgICAqIHByaW1hcnkgZ3lyb3Njb3BlIG9mIHRoaXMgQW5kcm9pZCBkZXZpY2UuPC9wPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfUE9TRV9UUkFOU0xBVElPTgorICAgICAqLworICAgIEFDQU1FUkFfTEVOU19QT1NFX1JFRkVSRU5DRV9HWVJPU0NPUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLAorCit9IGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2xlbnNfcG9zZV9yZWZlcmVuY2VfdDsKKwogCiAvLyBBQ0FNRVJBX0xFTlNfSU5GT19GT0NVU19ESVNUQU5DRV9DQUxJQlJBVElPTgogdHlwZWRlZiBlbnVtIGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hY2FtZXJhX2xlbnNfaW5mb19mb2N1c19kaXN0YW5jZV9jYWxpYnJhdGlvbiB7CkBAIC02NDEyLDEzICs2NzUyLDEyIEBACiAKICAgICAvKioKICAgICAgKiA8cD5Ob2lzZSByZWR1Y3Rpb24gaXMgYXBwbGllZCBhdCBkaWZmZXJlbnQgbGV2ZWxzIGZvciBkaWZmZXJlbnQgb3V0cHV0IHN0cmVhbXMsCi0gICAgICogYmFzZWQgb24gcmVzb2x1dGlvbi4gU3RyZWFtcyBhdCBtYXhpbXVtIHJlY29yZGluZyByZXNvbHV0aW9uIChzZWUge0BsaW5rCi0gICAgICogQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlU2Vzc2lvbn0pIG9yIGJlbG93IGhhdmUgbm9pc2UKLSAgICAgKiByZWR1Y3Rpb24gYXBwbGllZCwgd2hpbGUgaGlnaGVyLXJlc29sdXRpb24gc3RyZWFtcyBoYXZlIE1JTklNQUwgKGlmIHN1cHBvcnRlZCkgb3Igbm8KLSAgICAgKiBub2lzZSByZWR1Y3Rpb24gYXBwbGllZCAoaWYgTUlOSU1BTCBpcyBub3Qgc3VwcG9ydGVkLikgVGhlIGRlZ3JlZSBvZiBub2lzZSByZWR1Y3Rpb24KLSAgICAgKiBmb3IgbG93LXJlc29sdXRpb24gc3RyZWFtcyBpcyB0dW5lZCBzbyB0aGF0IGZyYW1lIHJhdGUgaXMgbm90IGltcGFjdGVkLCBhbmQgdGhlIHF1YWxpdHkKLSAgICAgKiBpcyBlcXVhbCB0byBvciBiZXR0ZXIgdGhhbiBGQVNUIChzaW5jZSBpdCBpcyBvbmx5IGFwcGxpZWQgdG8gbG93ZXItcmVzb2x1dGlvbiBvdXRwdXRzLAotICAgICAqIHF1YWxpdHkgbWF5IGltcHJvdmUgZnJvbSBGQVNUKS48L3A+CisgICAgICogYmFzZWQgb24gcmVzb2x1dGlvbi4gU3RyZWFtcyBhdCBtYXhpbXVtIHJlY29yZGluZyByZXNvbHV0aW9uIChzZWUge0BsaW5rIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVNlc3Npb24gfSkKKyAgICAgKiBvciBiZWxvdyBoYXZlIG5vaXNlIHJlZHVjdGlvbiBhcHBsaWVkLCB3aGlsZSBoaWdoZXItcmVzb2x1dGlvbiBzdHJlYW1zIGhhdmUgTUlOSU1BTCAoaWYKKyAgICAgKiBzdXBwb3J0ZWQpIG9yIG5vIG5vaXNlIHJlZHVjdGlvbiBhcHBsaWVkIChpZiBNSU5JTUFMIGlzIG5vdCBzdXBwb3J0ZWQuKSBUaGUgZGVncmVlIG9mCisgICAgICogbm9pc2UgcmVkdWN0aW9uIGZvciBsb3ctcmVzb2x1dGlvbiBzdHJlYW1zIGlzIHR1bmVkIHNvIHRoYXQgZnJhbWUgcmF0ZSBpcyBub3QgaW1wYWN0ZWQsCisgICAgICogYW5kIHRoZSBxdWFsaXR5IGlzIGVxdWFsIHRvIG9yIGJldHRlciB0aGFuIEZBU1QgKHNpbmNlIGl0IGlzIG9ubHkgYXBwbGllZCB0bworICAgICAqIGxvd2VyLXJlc29sdXRpb24gb3V0cHV0cywgcXVhbGl0eSBtYXkgaW1wcm92ZSBmcm9tIEZBU1QpLjwvcD4KICAgICAgKiA8cD5UaGlzIG1vZGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMgb3BlcmF0aW5nIGluIGEgemVyby1zaHV0dGVyLWxhZyBtb2RlCiAgICAgICogd2l0aCBZVVYgb3IgUFJJVkFURSByZXByb2Nlc3NpbmcsIHdoZXJlIHRoZSBhcHBsaWNhdGlvbiBjb250aW51b3VzbHkgY2FwdHVyZXMKICAgICAgKiBoaWdoLXJlc29sdXRpb24gaW50ZXJtZWRpYXRlIGJ1ZmZlcnMgaW50byBhIGNpcmN1bGFyIGJ1ZmZlciwgZnJvbSB3aGljaCBhIGZpbmFsIGltYWdlIGlzCkBAIC02NjM1LDE4ICs2OTc0LDE2IEBACiAgICAgICogdG8gRkFTVC4gQWRkaXRpb25hbGx5LCBtYXhpbXVtLXJlc29sdXRpb24gaW1hZ2VzIGNhbiBiZSBjYXB0dXJlZCBhdCAmZ3Q7PSAxMCBmcmFtZXMKICAgICAgKiBwZXIgc2Vjb25kLiAgSGVyZSwgJ2hpZ2ggcmVzb2x1dGlvbicgbWVhbnMgYXQgbGVhc3QgOCBtZWdhcGl4ZWxzLCBvciB0aGUgbWF4aW11bQogICAgICAqIHJlc29sdXRpb24gb2YgdGhlIGRldmljZSwgd2hpY2hldmVyIGlzIHNtYWxsZXIuPC9wPgotICAgICAqIDxwPk1vcmUgc3BlY2lmaWNhbGx5LCB0aGlzIG1lYW5zIHRoYXQgYXQgbGVhc3Qgb25lIG91dHB1dCB7QGxpbmsKLSAgICAgKiBBSU1BR0VfRk9STUFUX1lVVl80MjBfODg4fSBzaXplIGxpc3RlZCBpbgotICAgICAqIHtAbGluayBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TfSBpcyBsYXJnZXIgb3IgZXF1YWwgdG8gdGhlCi0gICAgICogJ2hpZ2ggcmVzb2x1dGlvbicgZGVmaW5lZCBhYm92ZSwgYW5kIGNhbiBiZSBjYXB0dXJlZCBhdCBhdCBsZWFzdCAyMCBmcHMuCi0gICAgICogRm9yIHRoZSBsYXJnZXN0IHtAbGluayBBSU1BR0VfRk9STUFUX1lVVl80MjBfODg4fSBzaXplIGxpc3RlZCBpbgotICAgICAqIHtAbGluayBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TfSwgY2FtZXJhIGRldmljZSBjYW4gY2FwdHVyZSB0aGlzCi0gICAgICogc2l6ZSBmb3IgYXQgbGVhc3QgMTAgZnJhbWVzIHBlciBzZWNvbmQuCi0gICAgICogQWxzbyB0aGUgQUNBTUVSQV9DT05UUk9MX0FFX0FWQUlMQUJMRV9UQVJHRVRfRlBTX1JBTkdFUyBlbnRyeSBsaXN0cyBhdCBsZWFzdCBvbmUgRlBTIHJhbmdlCi0gICAgICogd2hlcmUgdGhlIG1pbmltdW0gRlBTIGlzICZndDs9IDEgLyBtaW5pbXVtRnJhbWVEdXJhdGlvbiBmb3IgdGhlIGxhcmdlc3QgWVVWXzQyMF84ODggc2l6ZS48L3A+Ci0gICAgICogPHA+SWYgdGhlIGRldmljZSBzdXBwb3J0cyB0aGUge0BsaW5rIEFJTUFHRV9GT1JNQVRfUkFXMTB9LCB7QGxpbmsKLSAgICAgKiBBSU1BR0VfRk9STUFUX1JBVzEyfSwgdGhlbiB0aG9zZSBjYW4gYWxzbyBiZSBjYXB0dXJlZCBhdCB0aGUgc2FtZSByYXRlCi0gICAgICogYXMgdGhlIG1heGltdW0tc2l6ZSBZVVZfNDIwXzg4OCByZXNvbHV0aW9uIGlzLjwvcD4KKyAgICAgKiA8cD5Nb3JlIHNwZWNpZmljYWxseSwgdGhpcyBtZWFucyB0aGF0IGF0IGxlYXN0IG9uZSBvdXRwdXQge0BsaW5rIEFJTUFHRV9GT1JNQVRfWVVWXzQyMF84ODggfSBzaXplIGxpc3RlZCBpbgorICAgICAqIHtAbGluayBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TIH0KKyAgICAgKiBpcyBsYXJnZXIgb3IgZXF1YWwgdG8gdGhlICdoaWdoIHJlc29sdXRpb24nIGRlZmluZWQgYWJvdmUsIGFuZCBjYW4gYmUgY2FwdHVyZWQgYXQgYXQKKyAgICAgKiBsZWFzdCAyMCBmcHMuICBGb3IgdGhlIGxhcmdlc3Qge0BsaW5rIEFJTUFHRV9GT1JNQVRfWVVWXzQyMF84ODggfSBzaXplIGxpc3RlZCBpbgorICAgICAqIHtAbGluayBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TIH0sCisgICAgICogY2FtZXJhIGRldmljZSBjYW4gY2FwdHVyZSB0aGlzIHNpemUgZm9yIGF0IGxlYXN0IDEwIGZyYW1lcyBwZXIgc2Vjb25kLiAgQWxzbyB0aGUKKyAgICAgKiBBQ0FNRVJBX0NPTlRST0xfQUVfQVZBSUxBQkxFX1RBUkdFVF9GUFNfUkFOR0VTIGVudHJ5IGxpc3RzIGF0IGxlYXN0IG9uZSBGUFMgcmFuZ2Ugd2hlcmUKKyAgICAgKiB0aGUgbWluaW11bSBGUFMgaXMgJmd0Oz0gMSAvIG1pbmltdW1GcmFtZUR1cmF0aW9uIGZvciB0aGUgbGFyZ2VzdCBZVVZfNDIwXzg4OCBzaXplLjwvcD4KKyAgICAgKiA8cD5JZiB0aGUgZGV2aWNlIHN1cHBvcnRzIHRoZSB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9SQVcxMCB9LCB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9SQVcxMiB9LCB0aGVuIHRob3NlIGNhbiBhbHNvIGJlCisgICAgICogY2FwdHVyZWQgYXQgdGhlIHNhbWUgcmF0ZSBhcyB0aGUgbWF4aW11bS1zaXplIFlVVl80MjBfODg4IHJlc29sdXRpb24gaXMuPC9wPgogICAgICAqIDxwPkluIGFkZGl0aW9uLCB0aGUgQUNBTUVSQV9TWU5DX01BWF9MQVRFTkNZIGZpZWxkIGlzIGd1YXJhbnRlZCB0byBoYXZlIGEgdmFsdWUgYmV0d2VlbiAwCiAgICAgICogYW5kIDQsIGluY2x1c2l2ZS4gQUNBTUVSQV9DT05UUk9MX0FFX0xPQ0tfQVZBSUxBQkxFIGFuZCBBQ0FNRVJBX0NPTlRST0xfQVdCX0xPQ0tfQVZBSUxBQkxFCiAgICAgICogYXJlIGFsc28gZ3VhcmFudGVlZCB0byBiZSA8Y29kZT50cnVlPC9jb2RlPiBzbyBidXJzdCBjYXB0dXJlIHdpdGggdGhlc2UgdHdvIGxvY2tzIE9OIHlpZWxkcwpAQCAtNjY2Myw0MiArNzAwMCwxMTQgQEAKICAgICAgKiA8cD5UaGUgY2FtZXJhIGRldmljZSBjYW4gcHJvZHVjZSBkZXB0aCBtZWFzdXJlbWVudHMgZnJvbSBpdHMgZmllbGQgb2Ygdmlldy48L3A+CiAgICAgICogPHA+VGhpcyBjYXBhYmlsaXR5IHJlcXVpcmVzIHRoZSBjYW1lcmEgZGV2aWNlIHRvIHN1cHBvcnQgdGhlIGZvbGxvd2luZzo8L3A+CiAgICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgQUlNQUdFX0ZPUk1BVF9ERVBUSDE2fSBpcyBzdXBwb3J0ZWQgYXMgYW4gb3V0cHV0IGZvcm1hdC48L2xpPgotICAgICAqIDxsaT57QGxpbmsgQUlNQUdFX0ZPUk1BVF9ERVBUSF9QT0lOVF9DTE9VRH0gaXMgb3B0aW9uYWxseSBzdXBwb3J0ZWQgYXMgYW4KLSAgICAgKiAgIG91dHB1dCBmb3JtYXQuPC9saT4KLSAgICAgKiA8bGk+VGhpcyBjYW1lcmEgZGV2aWNlLCBhbmQgYWxsIGNhbWVyYSBkZXZpY2VzIHdpdGggdGhlIHNhbWUgQUNBTUVSQV9MRU5TX0ZBQ0lORywKLSAgICAgKiAgIHdpbGwgbGlzdCB0aGUgZm9sbG93aW5nIGNhbGlicmF0aW9uIGVudHJpZXMgaW4ge0BsaW5rIEFDYW1lcmFNZXRhZGF0YX0gZnJvbSBib3RoCi0gICAgICogICB7QGxpbmsgQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzfSBhbmQKLSAgICAgKiAgIHtAbGluayBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdH06PHVsPgorICAgICAqIDxsaT57QGxpbmsgQUlNQUdFX0ZPUk1BVF9ERVBUSDE2IH0gaXMgc3VwcG9ydGVkIGFzCisgICAgICogICBhbiBvdXRwdXQgZm9ybWF0LjwvbGk+CisgICAgICogPGxpPntAbGluayBBSU1BR0VfRk9STUFUX0RFUFRIX1BPSU5UX0NMT1VEIH0gaXMKKyAgICAgKiAgIG9wdGlvbmFsbHkgc3VwcG9ydGVkIGFzIGFuIG91dHB1dCBmb3JtYXQuPC9saT4KKyAgICAgKiA8bGk+VGhpcyBjYW1lcmEgZGV2aWNlLCBhbmQgYWxsIGNhbWVyYSBkZXZpY2VzIHdpdGggdGhlIHNhbWUgQUNBTUVSQV9MRU5TX0ZBQ0lORywgd2lsbAorICAgICAqICAgbGlzdCB0aGUgZm9sbG93aW5nIGNhbGlicmF0aW9uIG1ldGFkYXRhIGVudHJpZXMgaW4gYm90aCB7QGxpbmsgQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzIH0KKyAgICAgKiAgIGFuZCB7QGxpbmsgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgfTo8dWw+CiAgICAgICogPGxpPkFDQU1FUkFfTEVOU19QT1NFX1RSQU5TTEFUSU9OPC9saT4KICAgICAgKiA8bGk+QUNBTUVSQV9MRU5TX1BPU0VfUk9UQVRJT048L2xpPgogICAgICAqIDxsaT5BQ0FNRVJBX0xFTlNfSU5UUklOU0lDX0NBTElCUkFUSU9OPC9saT4KLSAgICAgKiA8bGk+QUNBTUVSQV9MRU5TX1JBRElBTF9ESVNUT1JUSU9OPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9MRU5TX0RJU1RPUlRJT048L2xpPgogICAgICAqIDwvdWw+CiAgICAgICogPC9saT4KICAgICAgKiA8bGk+VGhlIEFDQU1FUkFfREVQVEhfREVQVEhfSVNfRVhDTFVTSVZFIGVudHJ5IGlzIGxpc3RlZCBieSB0aGlzIGRldmljZS48L2xpPgorICAgICAqIDxsaT5BcyBvZiBBbmRyb2lkIFAsIHRoZSBBQ0FNRVJBX0xFTlNfUE9TRV9SRUZFUkVOQ0UgZW50cnkgaXMgbGlzdGVkIGJ5IHRoaXMgZGV2aWNlLjwvbGk+CiAgICAgICogPGxpPkEgTElNSVRFRCBjYW1lcmEgd2l0aCBvbmx5IHRoZSBERVBUSF9PVVRQVVQgY2FwYWJpbGl0eSBkb2VzIG5vdCBoYXZlIHRvIHN1cHBvcnQKICAgICAgKiAgIG5vcm1hbCBZVVZfNDIwXzg4OCwgSlBFRywgYW5kIFBSSVYtZm9ybWF0IG91dHB1dHMuIEl0IG9ubHkgaGFzIHRvIHN1cHBvcnQgdGhlIERFUFRIMTYKICAgICAgKiAgIGZvcm1hdC48L2xpPgogICAgICAqIDwvdWw+CiAgICAgICogPHA+R2VuZXJhbGx5LCBkZXB0aCBvdXRwdXQgb3BlcmF0ZXMgYXQgYSBzbG93ZXIgZnJhbWUgcmF0ZSB0aGFuIHN0YW5kYXJkIGNvbG9yIGNhcHR1cmUsCiAgICAgICogc28gdGhlIERFUFRIMTYgYW5kIERFUFRIX1BPSU5UX0NMT1VEIGZvcm1hdHMgd2lsbCBjb21tb25seSBoYXZlIGEgc3RhbGwgZHVyYXRpb24gdGhhdAotICAgICAqIHNob3VsZCBiZSBhY2NvdW50ZWQgZm9yIChzZWUKLSAgICAgKiB7QGxpbmsgQUNBTUVSQV9ERVBUSF9BVkFJTEFCTEVfREVQVEhfU1RBTExfRFVSQVRJT05TfSkuCisgICAgICogc2hvdWxkIGJlIGFjY291bnRlZCBmb3IgKHNlZSB7QGxpbmsgQUNBTUVSQV9ERVBUSF9BVkFJTEFCTEVfREVQVEhfU1RBTExfRFVSQVRJT05TIH0pLgogICAgICAqIE9uIGEgZGV2aWNlIHRoYXQgc3VwcG9ydHMgYm90aCBkZXB0aCBhbmQgY29sb3ItYmFzZWQgb3V0cHV0LCB0byBlbmFibGUgc21vb3RoIHByZXZpZXcsCiAgICAgICogdXNpbmcgYSByZXBlYXRpbmcgYnVyc3QgaXMgcmVjb21tZW5kZWQsIHdoZXJlIGEgZGVwdGgtb3V0cHV0IHRhcmdldCBpcyBvbmx5IGluY2x1ZGVkCiAgICAgICogb25jZSBldmVyeSBOIGZyYW1lcywgd2hlcmUgTiBpcyB0aGUgcmF0aW8gYmV0d2VlbiBwcmV2aWV3IG91dHB1dCByYXRlIGFuZCBkZXB0aCBvdXRwdXQKICAgICAgKiByYXRlLCBpbmNsdWRpbmcgZGVwdGggc3RhbGwgdGltZS48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfREVQVEhfREVQVEhfSVNfRVhDTFVTSVZFCisgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfRElTVE9SVElPTgogICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX0ZBQ0lORwogICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX0lOVFJJTlNJQ19DQUxJQlJBVElPTgorICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX1BPU0VfUkVGRVJFTkNFCiAgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfUE9TRV9ST1RBVElPTgogICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX1BPU0VfVFJBTlNMQVRJT04KLSAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19SQURJQUxfRElTVE9SVElPTgogICAgICAqLwogICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX0RFUFRIX09VVFBVVCAgICAgICAgICAgICAgPSA4LAogCisgICAgLyoqCisgICAgICogPHA+VGhlIGNhbWVyYSBkZXZpY2Ugc3VwcG9ydHMgdGhlIE1PVElPTl9UUkFDS0lORyB2YWx1ZSBmb3IKKyAgICAgKiBBQ0FNRVJBX0NPTlRST0xfQ0FQVFVSRV9JTlRFTlQsIHdoaWNoIGxpbWl0cyBtYXhpbXVtIGV4cG9zdXJlIHRpbWUgdG8gMjAgbXMuPC9wPgorICAgICAqIDxwPlRoaXMgbGltaXRzIHRoZSBtb3Rpb24gYmx1ciBvZiBjYXB0dXJlIGltYWdlcywgcmVzdWx0aW5nIGluIGJldHRlciBpbWFnZSB0cmFja2luZworICAgICAqIHJlc3VsdHMgZm9yIHVzZSBjYXNlcyBzdWNoIGFzIGltYWdlIHN0YWJpbGl6YXRpb24gb3IgYXVnbWVudGVkIHJlYWxpdHkuPC9wPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX0NPTlRST0xfQ0FQVFVSRV9JTlRFTlQKKyAgICAgKi8KKyAgICBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19NT1RJT05fVFJBQ0tJTkcgICAgICAgICAgID0gMTAsCisKKyAgICAvKioKKyAgICAgKiA8cD5UaGUgY2FtZXJhIGRldmljZSBpcyBhIGxvZ2ljYWwgY2FtZXJhIGJhY2tlZCBieSB0d28gb3IgbW9yZSBwaHlzaWNhbCBjYW1lcmFzIHRoYXQgYXJlCisgICAgICogYWxzbyBleHBvc2VkIHRvIHRoZSBhcHBsaWNhdGlvbi48L3A+CisgICAgICogPHA+Q2FtZXJhIGFwcGxpY2F0aW9uIHNob3VsZG4ndCBhc3N1bWUgdGhhdCB0aGVyZSBhcmUgYXQgbW9zdCAxIHJlYXIgY2FtZXJhIGFuZCAxIGZyb250CisgICAgICogY2FtZXJhIGluIHRoZSBzeXN0ZW0uIEZvciBhbiBhcHBsaWNhdGlvbiB0aGF0IHN3aXRjaGVzIGJldHdlZW4gZnJvbnQgYW5kIGJhY2sgY2FtZXJhcywKKyAgICAgKiB0aGUgcmVjb21tZW5kYXRpb24gaXMgdG8gc3dpdGNoIGJldHdlZW4gdGhlIGZpcnN0IHJlYXIgY2FtZXJhIGFuZCB0aGUgZmlyc3QgZnJvbnQKKyAgICAgKiBjYW1lcmEgaW4gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGNhbWVyYSBkZXZpY2VzLjwvcD4KKyAgICAgKiA8cD5UaGlzIGNhcGFiaWxpdHkgcmVxdWlyZXMgdGhlIGNhbWVyYSBkZXZpY2UgdG8gc3VwcG9ydCB0aGUgZm9sbG93aW5nOjwvcD4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPlRoaXMgY2FtZXJhIGRldmljZSBtdXN0IGxpc3QgdGhlIGZvbGxvd2luZyBzdGF0aWMgbWV0YWRhdGEgZW50cmllcyBpbiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYUNoYXJhY3RlcmlzdGljcy5odG1sIj5DYW1lcmFDaGFyYWN0ZXJpc3RpY3M8L2E+Ojx1bD4KKyAgICAgKiA8bGk+YW5kcm9pZC5sb2dpY2FsTXVsdGlDYW1lcmEucGh5c2ljYWxJZHM8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX0xPR0lDQUxfTVVMVElfQ0FNRVJBX1NFTlNPUl9TWU5DX1RZUEU8L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9saT4KKyAgICAgKiA8bGk+VGhlIHVuZGVybHlpbmcgcGh5c2ljYWwgY2FtZXJhcycgc3RhdGljIG1ldGFkYXRhIG11c3QgbGlzdCB0aGUgZm9sbG93aW5nIGVudHJpZXMsCisgICAgICogICBzbyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBjYW4gY29ycmVsYXRlIHBpeGVscyBmcm9tIHRoZSBwaHlzaWNhbCBzdHJlYW1zOjx1bD4KKyAgICAgKiA8bGk+QUNBTUVSQV9MRU5TX1BPU0VfUkVGRVJFTkNFPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9MRU5TX1BPU0VfUk9UQVRJT048L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX0xFTlNfUE9TRV9UUkFOU0xBVElPTjwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfTEVOU19JTlRSSU5TSUNfQ0FMSUJSQVRJT048L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX0xFTlNfRElTVE9SVElPTjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L2xpPgorICAgICAqIDxsaT5UaGUgU0VOU09SX0lORk9fVElNRVNUQU1QX1NPVVJDRSBvZiB0aGUgbG9naWNhbCBkZXZpY2UgYW5kIHBoeXNpY2FsIGRldmljZXMgbXVzdCBiZQorICAgICAqICAgdGhlIHNhbWUuPC9saT4KKyAgICAgKiA8bGk+VGhlIGxvZ2ljYWwgY2FtZXJhIGRldmljZSBtdXN0IGJlIExJTUlURUQgb3IgaGlnaGVyIGRldmljZS48L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPHA+Qm90aCB0aGUgbG9naWNhbCBjYW1lcmEgZGV2aWNlIGFuZCBpdHMgdW5kZXJseWluZyBwaHlzaWNhbCBkZXZpY2VzIHN1cHBvcnQgdGhlCisgICAgICogbWFuZGF0b3J5IHN0cmVhbSBjb21iaW5hdGlvbnMgcmVxdWlyZWQgZm9yIHRoZWlyIGRldmljZSBsZXZlbHMuPC9wPgorICAgICAqIDxwPkFkZGl0aW9uYWxseSwgZm9yIGVhY2ggZ3VhcmFudGVlZCBzdHJlYW0gY29tYmluYXRpb24sIHRoZSBsb2dpY2FsIGNhbWVyYSBzdXBwb3J0czo8L3A+CisgICAgICogPHVsPgorICAgICAqIDxsaT5Gb3IgZWFjaCBndWFyYW50ZWVkIHN0cmVhbSBjb21iaW5hdGlvbiwgdGhlIGxvZ2ljYWwgY2FtZXJhIHN1cHBvcnRzIHJlcGxhY2luZyBvbmUKKyAgICAgKiAgIGxvZ2ljYWwge0BsaW5rIEFJTUFHRV9GT1JNQVRfWVVWXzQyMF84ODggWVVWXzQyMF84ODh9CisgICAgICogICBvciByYXcgc3RyZWFtIHdpdGggdHdvIHBoeXNpY2FsIHN0cmVhbXMgb2YgdGhlIHNhbWUgc2l6ZSBhbmQgZm9ybWF0LCBlYWNoIGZyb20gYQorICAgICAqICAgc2VwYXJhdGUgcGh5c2ljYWwgY2FtZXJhLCBnaXZlbiB0aGF0IHRoZSBzaXplIGFuZCBmb3JtYXQgYXJlIHN1cHBvcnRlZCBieSBib3RoCisgICAgICogICBwaHlzaWNhbCBjYW1lcmFzLjwvbGk+CisgICAgICogPGxpPklmIHRoZSBsb2dpY2FsIGNhbWVyYSBkb2Vzbid0IGFkdmVydGlzZSBSQVcgY2FwYWJpbGl0eSwgYnV0IHRoZSB1bmRlcmx5aW5nIHBoeXNpY2FsCisgICAgICogICBjYW1lcmFzIGRvLCB0aGUgbG9naWNhbCBjYW1lcmEgd2lsbCBzdXBwb3J0IGd1YXJhbnRlZWQgc3RyZWFtIGNvbWJpbmF0aW9ucyBmb3IgUkFXCisgICAgICogICBjYXBhYmlsaXR5LCBleGNlcHQgdGhhdCB0aGUgUkFXIHN0cmVhbXMgd2lsbCBiZSBwaHlzaWNhbCBzdHJlYW1zLCBlYWNoIGZyb20gYSBzZXBhcmF0ZQorICAgICAqICAgcGh5c2ljYWwgY2FtZXJhLiBUaGlzIGlzIHVzdWFsbHkgdGhlIGNhc2Ugd2hlbiB0aGUgcGh5c2ljYWwgY2FtZXJhcyBoYXZlIGRpZmZlcmVudAorICAgICAqICAgc2Vuc29yIHNpemVzLjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8cD5Vc2luZyBwaHlzaWNhbCBzdHJlYW1zIGluIHBsYWNlIG9mIGEgbG9naWNhbCBzdHJlYW0gb2YgdGhlIHNhbWUgc2l6ZSBhbmQgZm9ybWF0IHdpbGwKKyAgICAgKiBub3Qgc2xvdyBkb3duIHRoZSBmcmFtZSByYXRlIG9mIHRoZSBjYXB0dXJlLCBhcyBsb25nIGFzIHRoZSBtaW5pbXVtIGZyYW1lIGR1cmF0aW9uCisgICAgICogb2YgdGhlIHBoeXNpY2FsIGFuZCBsb2dpY2FsIHN0cmVhbXMgYXJlIHRoZSBzYW1lLjwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX0RJU1RPUlRJT04KKyAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19JTlRSSU5TSUNfQ0FMSUJSQVRJT04KKyAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19QT1NFX1JFRkVSRU5DRQorICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX1BPU0VfUk9UQVRJT04KKyAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19QT1NFX1RSQU5TTEFUSU9OCisgICAgICogQHNlZSBBQ0FNRVJBX0xPR0lDQUxfTVVMVElfQ0FNRVJBX1NFTlNPUl9TWU5DX1RZUEUKKyAgICAgKi8KKyAgICBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19MT0dJQ0FMX01VTFRJX0NBTUVSQSAgICAgID0gMTEsCisKKyAgICAvKioKKyAgICAgKiA8cD5UaGUgY2FtZXJhIGRldmljZSBpcyBhIG1vbm9jaHJvbWUgY2FtZXJhIHRoYXQgZG9lc24ndCBjb250YWluIGEgY29sb3IgZmlsdGVyIGFycmF5LAorICAgICAqIGFuZCB0aGUgcGl4ZWwgdmFsdWVzIG9uIFUgYW5kIFYgcGxhbmVzIGFyZSBhbGwgMTI4LjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19NT05PQ0hST01FICAgICAgICAgICAgICAgID0gMTIsCisKIH0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfcmVxdWVzdF9hdmFpbGFibGVfY2FwYWJpbGl0aWVzX3Q7CiAKIApAQCAtNjkxOCw4ICs3MzI3LDggQEAKIAogICAgIC8qKgogICAgICAqIDxwPlRpbWVzdGFtcHMgZnJvbSBBQ0FNRVJBX1NFTlNPUl9USU1FU1RBTVAgYXJlIGluIHRoZSBzYW1lIHRpbWViYXNlIGFzCi0gICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvb3MvU3lzdGVtQ2xvY2suaHRtbCNlbGFwc2VkUmVhbHRpbWVOYW5vcyI+ZWxhcHNlZFJlYWx0aW1lTmFub3M8L2E+Ci0gICAgICogKG9yIENMT0NLX0JPT1RUSU1FKSwgYW5kIHRoZXkgY2FuIGJlIGNvbXBhcmVkIHRvIG90aGVyIHRpbWVzdGFtcHMgdXNpbmcgdGhhdCBiYXNlLjwvcD4KKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9vcy9TeXN0ZW1DbG9jay5odG1sI2VsYXBzZWRSZWFsdGltZU5hbm9zIj5TeXN0ZW1DbG9jayNlbGFwc2VkUmVhbHRpbWVOYW5vczwvYT4sCisgICAgICogYW5kIHRoZXkgY2FuIGJlIGNvbXBhcmVkIHRvIG90aGVyIHRpbWVzdGFtcHMgdXNpbmcgdGhhdCBiYXNlLjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfVElNRVNUQU1QCiAgICAgICovCkBAIC03MDMwLDYgKzc0MzksMjYgQEAKIAogfSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9zdGF0aXN0aWNzX2xlbnNfc2hhZGluZ19tYXBfbW9kZV90OwogCisvLyBBQ0FNRVJBX1NUQVRJU1RJQ1NfT0lTX0RBVEFfTU9ERQordHlwZWRlZiBlbnVtIGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hY2FtZXJhX3N0YXRpc3RpY3Nfb2lzX2RhdGFfbW9kZSB7CisgICAgLyoqCisgICAgICogPHA+RG8gbm90IGluY2x1ZGUgT0lTIGRhdGEgaW4gdGhlIGNhcHR1cmUgcmVzdWx0LjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NUQVRJU1RJQ1NfT0lTX0RBVEFfTU9ERV9PRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKworICAgIC8qKgorICAgICAqIDxwPkluY2x1ZGUgT0lTIGRhdGEgaW4gdGhlIGNhcHR1cmUgcmVzdWx0LjwvcD4KKyAgICAgKiA8cD5BQ0FNRVJBX1NUQVRJU1RJQ1NfT0lTX1RJTUVTVEFNUFMsIEFDQU1FUkFfU1RBVElTVElDU19PSVNfWF9TSElGVFMsCisgICAgICogYW5kIEFDQU1FUkFfU1RBVElTVElDU19PSVNfWV9TSElGVFMgcHJvdmlkZSBPSVMgZGF0YSBpbiB0aGUgb3V0cHV0IHJlc3VsdCBtZXRhZGF0YS48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfU1RBVElTVElDU19PSVNfVElNRVNUQU1QUworICAgICAqIEBzZWUgQUNBTUVSQV9TVEFUSVNUSUNTX09JU19YX1NISUZUUworICAgICAqIEBzZWUgQUNBTUVSQV9TVEFUSVNUSUNTX09JU19ZX1NISUZUUworICAgICAqLworICAgIEFDQU1FUkFfU1RBVElTVElDU19PSVNfREFUQV9NT0RFX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLAorCit9IGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX3N0YXRpc3RpY3Nfb2lzX2RhdGFfbW9kZV90OworCiAKIAogLy8gQUNBTUVSQV9UT05FTUFQX01PREUKQEAgLTcxMDQsNyArNzUzMyw3IEBACiAgICAgICogPHA+VGhpcyBjYW1lcmEgZGV2aWNlIGRvZXMgbm90IGhhdmUgZW5vdWdoIGNhcGFiaWxpdGllcyB0byBxdWFsaWZ5IGFzIGEgPGNvZGU+RlVMTDwvY29kZT4gZGV2aWNlIG9yCiAgICAgICogYmV0dGVyLjwvcD4KICAgICAgKiA8cD5Pbmx5IHRoZSBzdHJlYW0gY29uZmlndXJhdGlvbnMgbGlzdGVkIGluIHRoZSA8Y29kZT5MRUdBQ1k8L2NvZGU+IGFuZCA8Y29kZT5MSU1JVEVEPC9jb2RlPiB0YWJsZXMgaW4gdGhlCi0gICAgICoge0BsaW5rIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVNlc3Npb259IGRvY3VtZW50YXRpb24gYXJlIGd1YXJhbnRlZWQgdG8gYmUgc3VwcG9ydGVkLjwvcD4KKyAgICAgKiB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlU2Vzc2lvbiBjcmVhdGVDYXB0dXJlU2Vzc2lvbn0gZG9jdW1lbnRhdGlvbiBhcmUgZ3VhcmFudGVlZCB0byBiZSBzdXBwb3J0ZWQuPC9wPgogICAgICAqIDxwPkFsbCA8Y29kZT5MSU1JVEVEPC9jb2RlPiBkZXZpY2VzIHN1cHBvcnQgdGhlIDxjb2RlPkJBQ0tXQVJEU19DT01QQVRJQkxFPC9jb2RlPiBjYXBhYmlsaXR5LCBpbmRpY2F0aW5nIGJhc2ljCiAgICAgICogc3VwcG9ydCBmb3IgY29sb3IgaW1hZ2UgY2FwdHVyZS4gVGhlIG9ubHkgZXhjZXB0aW9uIGlzIHRoYXQgdGhlIGRldmljZSBtYXkKICAgICAgKiBhbHRlcm5hdGl2ZWx5IHN1cHBvcnQgb25seSB0aGUgPGNvZGU+REVQVEhfT1VUUFVUPC9jb2RlPiBjYXBhYmlsaXR5LCBpZiBpdCBjYW4gb25seSBvdXRwdXQgZGVwdGgKQEAgLTcxMzAsNyArNzU1OSw3IEBACiAgICAgLyoqCiAgICAgICogPHA+VGhpcyBjYW1lcmEgZGV2aWNlIGlzIGNhcGFibGUgb2Ygc3VwcG9ydGluZyBhZHZhbmNlZCBpbWFnaW5nIGFwcGxpY2F0aW9ucy48L3A+CiAgICAgICogPHA+VGhlIHN0cmVhbSBjb25maWd1cmF0aW9ucyBsaXN0ZWQgaW4gdGhlIDxjb2RlPkZVTEw8L2NvZGU+LCA8Y29kZT5MRUdBQ1k8L2NvZGU+IGFuZCA8Y29kZT5MSU1JVEVEPC9jb2RlPiB0YWJsZXMgaW4gdGhlCi0gICAgICoge0BsaW5rIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVNlc3Npb259IGRvY3VtZW50YXRpb24gYXJlIGd1YXJhbnRlZWQgdG8gYmUgc3VwcG9ydGVkLjwvcD4KKyAgICAgKiB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlU2Vzc2lvbiBjcmVhdGVDYXB0dXJlU2Vzc2lvbn0gZG9jdW1lbnRhdGlvbiBhcmUgZ3VhcmFudGVlZCB0byBiZSBzdXBwb3J0ZWQuPC9wPgogICAgICAqIDxwPkEgPGNvZGU+RlVMTDwvY29kZT4gZGV2aWNlIHdpbGwgc3VwcG9ydCBiZWxvdyBjYXBhYmlsaXRpZXM6PC9wPgogICAgICAqIDx1bD4KICAgICAgKiA8bGk+PGNvZGU+QlVSU1RfQ0FQVFVSRTwvY29kZT4gY2FwYWJpbGl0eSAoQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMgY29udGFpbnMKQEAgLTcxNTcsOCArNzU4Niw3IEBACiAKICAgICAvKioKICAgICAgKiA8cD5UaGlzIGNhbWVyYSBkZXZpY2UgaXMgcnVubmluZyBpbiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IG1vZGUuPC9wPgotICAgICAqIDxwPk9ubHkgdGhlIHN0cmVhbSBjb25maWd1cmF0aW9ucyBsaXN0ZWQgaW4gdGhlIDxjb2RlPkxFR0FDWTwvY29kZT4gdGFibGUgaW4gdGhlIHtAbGluawotICAgICAqIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVNlc3Npb259IGRvY3VtZW50YXRpb24gYXJlIHN1cHBvcnRlZC48L3A+CisgICAgICogPHA+T25seSB0aGUgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIGxpc3RlZCBpbiB0aGUgPGNvZGU+TEVHQUNZPC9jb2RlPiB0YWJsZSBpbiB0aGUge0BsaW5rIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVNlc3Npb24gY3JlYXRlQ2FwdHVyZVNlc3Npb259IGRvY3VtZW50YXRpb24gYXJlIHN1cHBvcnRlZC48L3A+CiAgICAgICogPHA+QSA8Y29kZT5MRUdBQ1k8L2NvZGU+IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHBlci1mcmFtZSBjb250cm9sLCBtYW51YWwgc2Vuc29yIGNvbnRyb2wsIG1hbnVhbAogICAgICAqIHBvc3QtcHJvY2Vzc2luZywgYXJiaXRyYXJ5IGNyb3BwaW5nIHJlZ2lvbnMsIGFuZCBoYXMgcmVsYXhlZCBwZXJmb3JtYW5jZSBjb25zdHJhaW50cy4KICAgICAgKiBObyBhZGRpdGlvbmFsIGNhcGFiaWxpdGllcyBiZXlvbmQgPGNvZGU+QkFDS1dBUkRfQ09NUEFUSUJMRTwvY29kZT4gd2lsbCBldmVyIGJlIGxpc3RlZCBieSBhCkBAIC03MTc5LDkgKzc2MDcsNyBAQAogICAgICAqIDxwPlRoaXMgY2FtZXJhIGRldmljZSBpcyBjYXBhYmxlIG9mIFlVViByZXByb2Nlc3NpbmcgYW5kIFJBVyBkYXRhIGNhcHR1cmUsIGluIGFkZGl0aW9uIHRvCiAgICAgICogRlVMTC1sZXZlbCBjYXBhYmlsaXRpZXMuPC9wPgogICAgICAqIDxwPlRoZSBzdHJlYW0gY29uZmlndXJhdGlvbnMgbGlzdGVkIGluIHRoZSA8Y29kZT5MRVZFTF8zPC9jb2RlPiwgPGNvZGU+UkFXPC9jb2RlPiwgPGNvZGU+RlVMTDwvY29kZT4sIDxjb2RlPkxFR0FDWTwvY29kZT4gYW5kCi0gICAgICogPGNvZGU+TElNSVRFRDwvY29kZT4gdGFibGVzIGluIHRoZSB7QGxpbmsKLSAgICAgKiBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVTZXNzaW9ufQotICAgICAqIGRvY3VtZW50YXRpb24gYXJlIGd1YXJhbnRlZWQgdG8gYmUgc3VwcG9ydGVkLjwvcD4KKyAgICAgKiA8Y29kZT5MSU1JVEVEPC9jb2RlPiB0YWJsZXMgaW4gdGhlIHtAbGluayBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVTZXNzaW9uIGNyZWF0ZUNhcHR1cmVTZXNzaW9ufSBkb2N1bWVudGF0aW9uIGFyZSBndWFyYW50ZWVkIHRvIGJlIHN1cHBvcnRlZC48L3A+CiAgICAgICogPHA+VGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIGNhcGFiaWxpdGllcyBhcmUgZ3VhcmFudGVlZCB0byBiZSBzdXBwb3J0ZWQ6PC9wPgogICAgICAqIDx1bD4KICAgICAgKiA8bGk+PGNvZGU+WVVWX1JFUFJPQ0VTU0lORzwvY29kZT4gY2FwYWJpbGl0eSAoQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMgY29udGFpbnMKQEAgLTcxOTQsNiArNzYyMCwzNyBAQAogICAgICAqLwogICAgIEFDQU1FUkFfSU5GT19TVVBQT1JURURfSEFSRFdBUkVfTEVWRUxfMyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLAogCisgICAgLyoqCisgICAgICogPHA+VGhpcyBjYW1lcmEgZGV2aWNlIGlzIGJhY2tlZCBieSBhbiBleHRlcm5hbCBjYW1lcmEgY29ubmVjdGVkIHRvIHRoaXMgQW5kcm9pZCBkZXZpY2UuPC9wPgorICAgICAqIDxwPlRoZSBkZXZpY2UgaGFzIGNhcGFiaWxpdHkgaWRlbnRpY2FsIHRvIGEgTElNSVRFRCBsZXZlbCBkZXZpY2UsIHdpdGggdGhlIGZvbGxvd2luZworICAgICAqIGV4Y2VwdGlvbnM6PC9wPgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+VGhlIGRldmljZSBtYXkgbm90IHJlcG9ydCBsZW5zL3NlbnNvciByZWxhdGVkIGluZm9ybWF0aW9uIHN1Y2ggYXM8dWw+CisgICAgICogPGxpPkFDQU1FUkFfTEVOU19GT0NBTF9MRU5HVEg8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX0xFTlNfSU5GT19IWVBFUkZPQ0FMX0RJU1RBTkNFPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9TRU5TT1JfSU5GT19QSFlTSUNBTF9TSVpFPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9TRU5TT1JfSU5GT19XSElURV9MRVZFTDwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfU0VOU09SX0JMQUNLX0xFVkVMX1BBVFRFUk48L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX1NFTlNPUl9JTkZPX0NPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVDwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfU0VOU09SX1JPTExJTkdfU0hVVFRFUl9TS0VXPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvbGk+CisgICAgICogPGxpPlRoZSBkZXZpY2Ugd2lsbCByZXBvcnQgMCBmb3IgQUNBTUVSQV9TRU5TT1JfT1JJRU5UQVRJT048L2xpPgorICAgICAqIDxsaT5UaGUgZGV2aWNlIGhhcyBsZXNzIGd1YXJhbnRlZSBvbiBzdGFibGUgZnJhbWVyYXRlLCBhcyB0aGUgZnJhbWVyYXRlIHBhcnRseSBkZXBlbmRzCisgICAgICogICBvbiB0aGUgZXh0ZXJuYWwgY2FtZXJhIGJlaW5nIHVzZWQuPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfRk9DQUxfTEVOR1RICisgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfSU5GT19IWVBFUkZPQ0FMX0RJU1RBTkNFCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9CTEFDS19MRVZFTF9QQVRURVJOCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX0NPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVAorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfSU5GT19QSFlTSUNBTF9TSVpFCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX1dISVRFX0xFVkVMCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9PUklFTlRBVElPTgorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfUk9MTElOR19TSFVUVEVSX1NLRVcKKyAgICAgKi8KKyAgICBBQ0FNRVJBX0lORk9fU1VQUE9SVEVEX0hBUkRXQVJFX0xFVkVMX0VYVEVSTkFMICAgICAgICAgICAgICAgICAgID0gNCwKKwogfSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9pbmZvX3N1cHBvcnRlZF9oYXJkd2FyZV9sZXZlbF90OwogCiAKQEAgLTcyODEsNiArNzczOCw0OCBAQAogfSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9kZXB0aF9kZXB0aF9pc19leGNsdXNpdmVfdDsKIAogCisvLyBBQ0FNRVJBX0xPR0lDQUxfTVVMVElfQ0FNRVJBX1NFTlNPUl9TWU5DX1RZUEUKK3R5cGVkZWYgZW51bSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYWNhbWVyYV9sb2dpY2FsX211bHRpX2NhbWVyYV9zZW5zb3Jfc3luY190eXBlIHsKKyAgICAvKioKKyAgICAgKiA8cD5BIHNvZnR3YXJlIG1lY2hhbmlzbSBpcyB1c2VkIHRvIHN5bmNocm9uaXplIGJldHdlZW4gdGhlIHBoeXNpY2FsIGNhbWVyYXMuIEFzIGEgcmVzdWx0LAorICAgICAqIHRoZSB0aW1lc3RhbXAgb2YgYW4gaW1hZ2UgZnJvbSBhIHBoeXNpY2FsIHN0cmVhbSBpcyBvbmx5IGFuIGFwcHJveGltYXRpb24gb2YgdGhlCisgICAgICogaW1hZ2Ugc2Vuc29yIHN0YXJ0LW9mLWV4cG9zdXJlIHRpbWUuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfTE9HSUNBTF9NVUxUSV9DQU1FUkFfU0VOU09SX1NZTkNfVFlQRV9BUFBST1hJTUFURSAgICAgICAgPSAwLAorCisgICAgLyoqCisgICAgICogPHA+VGhlIGNhbWVyYSBkZXZpY2Ugc3VwcG9ydHMgZnJhbWUgdGltZXN0YW1wIHN5bmNocm9uaXphdGlvbiBhdCB0aGUgaGFyZHdhcmUgbGV2ZWwsCisgICAgICogYW5kIHRoZSB0aW1lc3RhbXAgb2YgYSBwaHlzaWNhbCBzdHJlYW0gaW1hZ2UgYWNjdXJhdGVseSByZWZsZWN0cyBpdHMKKyAgICAgKiBzdGFydC1vZi1leHBvc3VyZSB0aW1lLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0xPR0lDQUxfTVVMVElfQ0FNRVJBX1NFTlNPUl9TWU5DX1RZUEVfQ0FMSUJSQVRFRCAgICAgICAgID0gMSwKKworfSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9sb2dpY2FsX211bHRpX2NhbWVyYV9zZW5zb3Jfc3luY190eXBlX3Q7CisKKworLy8gQUNBTUVSQV9ESVNUT1JUSU9OX0NPUlJFQ1RJT05fTU9ERQordHlwZWRlZiBlbnVtIGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hY2FtZXJhX2Rpc3RvcnRpb25fY29ycmVjdGlvbl9tb2RlIHsKKyAgICAvKioKKyAgICAgKiA8cD5ObyBkaXN0b3J0aW9uIGNvcnJlY3Rpb24gaXMgYXBwbGllZC48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9ESVNUT1JUSU9OX0NPUlJFQ1RJT05fTU9ERV9PRkYgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisKKyAgICAvKioKKyAgICAgKiA8cD5MZW5zIGRpc3RvcnRpb24gY29ycmVjdGlvbiBpcyBhcHBsaWVkIHdpdGhvdXQgcmVkdWNpbmcgZnJhbWUgcmF0ZQorICAgICAqIHJlbGF0aXZlIHRvIHNlbnNvciBvdXRwdXQuIEl0IG1heSBiZSB0aGUgc2FtZSBhcyBPRkYgaWYgZGlzdG9ydGlvbiBjb3JyZWN0aW9uIHdvdWxkCisgICAgICogcmVkdWNlIGZyYW1lIHJhdGUgcmVsYXRpdmUgdG8gc2Vuc29yLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0RJU1RPUlRJT05fQ09SUkVDVElPTl9NT0RFX0ZBU1QgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwKKworICAgIC8qKgorICAgICAqIDxwPkhpZ2gtcXVhbGl0eSBkaXN0b3J0aW9uIGNvcnJlY3Rpb24gaXMgYXBwbGllZCwgYXQgdGhlIGNvc3Qgb2YKKyAgICAgKiBwb3NzaWJseSByZWR1Y2VkIGZyYW1lIHJhdGUgcmVsYXRpdmUgdG8gc2Vuc29yIG91dHB1dC48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9ESVNUT1JUSU9OX0NPUlJFQ1RJT05fTU9ERV9ISUdIX1FVQUxJVFkgICAgICAgICAgICAgICAgICA9IDIsCisKK30gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfZGlzdG9ydGlvbl9jb3JyZWN0aW9uX21vZGVfdDsKKworCiAjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI0ICovCiAKIF9fRU5EX0RFQ0xTCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhcHR1cmVSZXF1ZXN0LmggYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhcHR1cmVSZXF1ZXN0LmgKaW5kZXggYzYyYmEyYy4uNDk2MWNlMyAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYXB0dXJlUmVxdWVzdC5oCisrKyBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FwdHVyZVJlcXVlc3QuaApAQCAtMzA1LDYgKzMwNSw1OCBAQAogCiAjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI0ICovCiAKKyNpZiBfX0FORFJPSURfQVBJX18gPj0gMjgKKworLyoqCisgKiBBc3NvY2lhdGUgYW4gYXJiaXRyYXJ5IHVzZXIgY29udGV4dCBwb2ludGVyIHRvIHRoZSB7QGxpbmsgQUNhcHR1cmVSZXF1ZXN0fQorICoKKyAqIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBmb3IgdXNlciB0byBpZGVudGlmeSB0aGUgY2FwdHVyZSByZXF1ZXN0IGluIGNhcHR1cmUgc2Vzc2lvbiBjYWxsYmFja3MuCisgKiBUaGUgY29udGV4dCBpcyBOVUxMIGZvciBuZXdseSBjcmVhdGVkIHJlcXVlc3QuCisgKiB7QGxpbmsgQUNhbWVyYU91dHB1dFRhcmdldF9mcmVlfSB3aWxsIG5vdCBmcmVlIHRoZSBjb250ZXh0LiBBbHNvIGNhbGxpbmcgdGhpcyBtZXRob2QgdHdpY2UKKyAqIHdpbGwgbm90IGNhdXNlIHRoZSBwcmV2aW91cyBjb250ZXh0IGJlIGZyZWVkLgorICogQWxzbyBub3RlIHRoYXQgY2FsbGluZyB0aGlzIG1ldGhvZCBhZnRlciB0aGUgcmVxdWVzdCBoYXMgYmVlbiBzZW50IHRvIGNhcHR1cmUgc2Vzc2lvbiB3aWxsIG5vdAorICogY2hhbmdlIHRoZSBjb250ZXh0IHBvaW50ZXIgaW4gdGhlIGNhcHR1cmUgY2FsbGJhY2tzLgorICoKKyAqIEBwYXJhbSByZXF1ZXN0IHRoZSB7QGxpbmsgQUNhcHR1cmVSZXF1ZXN0fSBvZiBpbnRlcmVzdC4KKyAqIEBwYXJhbSBjb250ZXh0IHRoZSB1c2VyIGNvbnRleHQgcG9pbnRlciB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjYXB0dXJlIHJlcXVlc3QuCisgKgorICogQHJldHVybiA8dWw+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9PS30gaWYgdGhlIG1ldGhvZCBjYWxsIHN1Y2NlZWRzLjwvbGk+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUn0gaWYgcmVxdWVzdCBpcyBOVUxMLjwvbGk+PC91bD4KKyAqLworY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlUmVxdWVzdF9zZXRVc2VyQ29udGV4dCgKKyAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCB2b2lkKiBjb250ZXh0KTsKKworLyoqCisgKiBHZXQgdGhlIHVzZXIgY29udGV4dCBwb2ludGVyIG9mIHRoZSB7QGxpbmsgQUNhcHR1cmVSZXF1ZXN0fQorICoKKyAqIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBmb3IgdXNlciB0byBpZGVudGlmeSB0aGUgY2FwdHVyZSByZXF1ZXN0IGluIGNhcHR1cmUgc2Vzc2lvbiBjYWxsYmFja3MuCisgKiBUaGUgY29udGV4dCBpcyBOVUxMIGZvciBuZXdseSBjcmVhdGVkIHJlcXVlc3QuCisgKgorICogQHBhcmFtIHJlcXVlc3QgdGhlIHtAbGluayBBQ2FwdHVyZVJlcXVlc3R9IG9mIGludGVyZXN0LgorICogQHBhcmFtIGNvbnRleHQgdGhlIHVzZXIgY29udGV4dCBwb2ludGVyIG9mIHRoaXMgY2FwdHVyZSByZXF1ZXN0LgorICoKKyAqIEByZXR1cm4gPHVsPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfT0t9IGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVJ9IGlmIHJlcXVlc3QgaXMgTlVMTC48L2xpPjwvdWw+CisgKi8KK2NhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVJlcXVlc3RfZ2V0VXNlckNvbnRleHQoCisgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgLypvdXQqL3ZvaWQqKiBjb250ZXh0KTsKKworLyoqCisgKiBDcmVhdGUgYSBjb3B5IG9mIGlucHV0IHtAbGluayBBQ2FwdHVyZVJlcXVlc3R9LgorICoKKyAqIDxwPlRoZSByZXR1cm5lZCBBQ2FwdHVyZVJlcXVlc3QgbXVzdCBiZSBmcmVlZCBieSB0aGUgYXBwbGljYXRpb24gYnkge0BsaW5rIEFDYXB0dXJlUmVxdWVzdF9mcmVlfQorICogYWZ0ZXIgYXBwbGljYXRpb24gaXMgZG9uZSB1c2luZyBpdC48L3A+CisgKgorICogQHBhcmFtIHNyYyB0aGUgaW5wdXQge0BsaW5rIEFDYXB0dXJlUmVxdWVzdH0gdG8gYmUgY29waWVkLgorICoKKyAqIEByZXR1cm4gYSB2YWxpZCBBQ2FwdHVyZVJlcXVlc3QgcG9pbnRlciBvciBOVUxMIGlmIHRoZSBpbnB1dCByZXF1ZXN0IGNhbm5vdCBiZSBjb3BpZWQuCisgKi8KK0FDYXB0dXJlUmVxdWVzdCogQUNhcHR1cmVSZXF1ZXN0X2NvcHkoY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiBzcmMpOworCisjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI4ICovCisKIF9fRU5EX0RFQ0xTCiAKICNlbmRpZiAvKiBfTkRLX0NBUFRVUkVfUkVRVUVTVF9IICovCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2xpYmNhbWVyYTJuZGsubWFwLnR4dCBiL2NhbWVyYS9uZGsvbGliY2FtZXJhMm5kay5tYXAudHh0CmluZGV4IDQxYmIyMmIuLmQxNzlhYTAgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvbGliY2FtZXJhMm5kay5tYXAudHh0CisrKyBiL2NhbWVyYS9uZGsvbGliY2FtZXJhMm5kay5tYXAudHh0CkBAIC02LDkgKzYsMTEgQEAKICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fZ2V0RGV2aWNlOwogICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zZXRSZXBlYXRpbmdSZXF1ZXN0OwogICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdG9wUmVwZWF0aW5nOworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl91cGRhdGVTaGFyZWRPdXRwdXQ7CiAgICAgQUNhbWVyYURldmljZV9jbG9zZTsKICAgICBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVSZXF1ZXN0OwogICAgIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVNlc3Npb247CisgICAgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlU2Vzc2lvbldpdGhTZXNzaW9uUGFyYW1ldGVyczsKICAgICBBQ2FtZXJhRGV2aWNlX2dldElkOwogICAgIEFDYW1lcmFNYW5hZ2VyX2NyZWF0ZTsKICAgICBBQ2FtZXJhTWFuYWdlcl9kZWxldGU7CkBAIC0yNSw5ICsyNywxMSBAQAogICAgIEFDYW1lcmFPdXRwdXRUYXJnZXRfY3JlYXRlOwogICAgIEFDYW1lcmFPdXRwdXRUYXJnZXRfZnJlZTsKICAgICBBQ2FwdHVyZVJlcXVlc3RfYWRkVGFyZ2V0OworICAgIEFDYXB0dXJlUmVxdWVzdF9jb3B5OwogICAgIEFDYXB0dXJlUmVxdWVzdF9mcmVlOwogICAgIEFDYXB0dXJlUmVxdWVzdF9nZXRBbGxUYWdzOwogICAgIEFDYXB0dXJlUmVxdWVzdF9nZXRDb25zdEVudHJ5OworICAgIEFDYXB0dXJlUmVxdWVzdF9nZXRVc2VyQ29udGV4dDsKICAgICBBQ2FwdHVyZVJlcXVlc3RfcmVtb3ZlVGFyZ2V0OwogICAgIEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9kb3VibGU7CiAgICAgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X2Zsb2F0OwpAQCAtMzUsMTEgKzM5LDE1IEBACiAgICAgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X2k2NDsKICAgICBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfcmF0aW9uYWw7CiAgICAgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X3U4OworICAgIEFDYXB0dXJlUmVxdWVzdF9zZXRVc2VyQ29udGV4dDsKICAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfYWRkOwogICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lcl9jcmVhdGU7CiAgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2ZyZWU7CiAgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX3JlbW92ZTsKICAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXRfY3JlYXRlOworICAgIEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9jcmVhdGU7CisgICAgQUNhcHR1cmVTZXNzaW9uU2hhcmVkT3V0cHV0X2FkZDsKKyAgICBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfcmVtb3ZlOwogICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dF9mcmVlOwogICBsb2NhbDoKICAgICAqOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL3Rlc3RzL0NhbWVyYUJpbmRlclRlc3RzLmNwcCBiL2NhbWVyYS90ZXN0cy9DYW1lcmFCaW5kZXJUZXN0cy5jcHAKaW5kZXggNTFkOTIxNC4uMWRlNzAxMyAxMDA2NDQKLS0tIGEvY2FtZXJhL3Rlc3RzL0NhbWVyYUJpbmRlclRlc3RzLmNwcAorKysgYi9jYW1lcmEvdGVzdHMvQ2FtZXJhQmluZGVyVGVzdHMuY3BwCkBAIC0xOTgsOSArMTk4LDExIEBACiAKIAogICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgb25SZXN1bHRSZWNlaXZlZChjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEsCi0gICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIHsKKyAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+JiBwaHlzaWNhbFJlc3VsdEluZm9zKSB7CiAgICAgICAgICh2b2lkKSBtZXRhZGF0YTsKICAgICAgICAgKHZvaWQpIHJlc3VsdEV4dHJhczsKKyAgICAgICAgKHZvaWQpIHBoeXNpY2FsUmVzdWx0SW5mb3M7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKICAgICAgICAgbUxhc3RTdGF0dXMgPSBTRU5UX1JFU1VMVDsKICAgICAgICAgbVN0YXR1c2VzSGl0LnB1c2hfYmFjayhtTGFzdFN0YXR1cyk7CkBAIC0zMTcsNiArMzE5LDkgQEAKICAgICBFWFBFQ1RfVFJVRShyZXMuaXNPaygpKSA8PCByZXM7CiAKICAgICBFWFBFQ1RfRVEobnVtQ2FtZXJhcywgc3RhdGljX2Nhc3Q8Y29uc3QgaW50PihzdGF0dXNlcy5zaXplKCkpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0IDogc3RhdHVzZXMpIHsKKyAgICAgICAgbGlzdGVuZXItPm9uU3RhdHVzQ2hhbmdlZChpdC5zdGF0dXMsIFN0cmluZzE2KGl0LmNhbWVyYUlkKSk7CisgICAgfQogCiAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtQ2FtZXJhczsgaSsrKSB7CiAgICAgICAgIFN0cmluZzE2IGNhbWVyYUlkID0gU3RyaW5nMTYoU3RyaW5nODo6Zm9ybWF0KCIlZCIsIGkpKTsKQEAgLTQyMSw2ICs0MjYsOSBAQAogICAgICAgICBzZXJ2aWNlTGlzdGVuZXIgPSBuZXcgVGVzdENhbWVyYVNlcnZpY2VMaXN0ZW5lcigpOwogICAgICAgICBzdGQ6OnZlY3RvcjxoYXJkd2FyZTo6Q2FtZXJhU3RhdHVzPiBzdGF0dXNlczsKICAgICAgICAgc2VydmljZS0+YWRkTGlzdGVuZXIoc2VydmljZUxpc3RlbmVyLCAmc3RhdHVzZXMpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJml0IDogc3RhdHVzZXMpIHsKKyAgICAgICAgICAgIHNlcnZpY2VMaXN0ZW5lci0+b25TdGF0dXNDaGFuZ2VkKGl0LnN0YXR1cywgU3RyaW5nMTYoaXQuY2FtZXJhSWQpKTsKKyAgICAgICAgfQogICAgICAgICBzZXJ2aWNlLT5nZXROdW1iZXJPZkNhbWVyYXMoaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpDQU1FUkFfVFlQRV9CQUNLV0FSRF9DT01QQVRJQkxFLAogICAgICAgICAgICAgICAgICZudW1DYW1lcmFzKTsKICAgICB9CkBAIC00MzksOCArNDQ3LDkgQEAKICAgICBBU1NFUlRfTk9UX05VTEwoc2VydmljZSk7CiAgICAgRVhQRUNUX1RSVUUoc2VydmljZUxpc3RlbmVyLT53YWl0Rm9yTnVtQ2FtZXJhcyhudW1DYW1lcmFzKSk7CiAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtQ2FtZXJhczsgaSsrKSB7CisgICAgICAgIFN0cmluZzggY2FtZXJhSWQ4ID0gU3RyaW5nODo6Zm9ybWF0KCIlZCIsIGkpOwogICAgICAgICAvLyBNYWtlIHN1cmUgd2UncmUgYXZhaWxhYmxlLCBvciBza2lwIGRldmljZSB0ZXN0cyBvdGhlcndpc2UKLSAgICAgICAgU3RyaW5nMTYgY2FtZXJhSWQoU3RyaW5nODo6Zm9ybWF0KCIlZCIsaSkpOworICAgICAgICBTdHJpbmcxNiBjYW1lcmFJZChjYW1lcmFJZDgpOwogICAgICAgICBpbnQzMl90IHMgPSBzZXJ2aWNlTGlzdGVuZXItPmdldFN0YXR1cyhjYW1lcmFJZCk7CiAgICAgICAgIEVYUEVDVF9FUShoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX1BSRVNFTlQsIHMpOwogICAgICAgICBpZiAocyAhPSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX1BSRVNFTlQpIHsKQEAgLTQ3Niw3ICs0ODUsOCBAQAogICAgICAgICByZXMgPSBkZXZpY2UtPmNyZWF0ZVN0cmVhbShvdXRwdXQsICZzdHJlYW1JZCk7CiAgICAgICAgIEVYUEVDVF9UUlVFKHJlcy5pc09rKCkpIDw8IHJlczsKICAgICAgICAgRVhQRUNUX0xFKDAsIHN0cmVhbUlkKTsKLSAgICAgICAgcmVzID0gZGV2aWNlLT5lbmRDb25maWd1cmUoLyppc0NvbnN0cmFpbmVkSGlnaFNwZWVkKi8gZmFsc2UpOworICAgICAgICBDYW1lcmFNZXRhZGF0YSBzZXNzaW9uUGFyYW1zOworICAgICAgICByZXMgPSBkZXZpY2UtPmVuZENvbmZpZ3VyZSgvKmlzQ29uc3RyYWluZWRIaWdoU3BlZWQqLyBmYWxzZSwgc2Vzc2lvblBhcmFtcyk7CiAgICAgICAgIEVYUEVDVF9UUlVFKHJlcy5pc09rKCkpIDw8IHJlczsKICAgICAgICAgRVhQRUNUX0ZBTFNFKGNhbGxiYWNrcy0+aGFkRXJyb3IoKSk7CiAKQEAgLTQ4Nyw3ICs0OTcsNyBAQAogICAgICAgICBFWFBFQ1RfVFJVRShyZXMuaXNPaygpKSA8PCByZXM7CiAKICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTI6OkNhcHR1cmVSZXF1ZXN0IHJlcXVlc3Q7Ci0gICAgICAgIHJlcXVlc3QubU1ldGFkYXRhID0gcmVxdWVzdFRlbXBsYXRlOworICAgICAgICByZXF1ZXN0Lm1QaHlzaWNhbENhbWVyYVNldHRpbmdzLnB1c2hfYmFjayh7Y2FtZXJhSWQ4LnN0cmluZygpLCByZXF1ZXN0VGVtcGxhdGV9KTsKICAgICAgICAgcmVxdWVzdC5tU3VyZmFjZUxpc3QuYWRkKHN1cmZhY2UpOwogICAgICAgICByZXF1ZXN0Lm1Jc1JlcHJvY2VzcyA9IGZhbHNlOwogICAgICAgICBpbnQ2NF90IGxhc3RGcmFtZU51bWJlciA9IDA7CkBAIC01MTQsNyArNTI0LDcgQEAKICAgICAgICAgICAgICAgICAvKm91dCovJnJlcXVlc3RUZW1wbGF0ZSk7CiAgICAgICAgIEVYUEVDVF9UUlVFKHJlcy5pc09rKCkpIDw8IHJlczsKICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTI6OkNhcHR1cmVSZXF1ZXN0IHJlcXVlc3QyOwotICAgICAgICByZXF1ZXN0Mi5tTWV0YWRhdGEgPSByZXF1ZXN0VGVtcGxhdGU7CisgICAgICAgIHJlcXVlc3QyLm1QaHlzaWNhbENhbWVyYVNldHRpbmdzLnB1c2hfYmFjayh7Y2FtZXJhSWQ4LnN0cmluZygpLCByZXF1ZXN0VGVtcGxhdGV9KTsKICAgICAgICAgcmVxdWVzdDIubVN1cmZhY2VMaXN0LmFkZChzdXJmYWNlKTsKICAgICAgICAgcmVxdWVzdDIubUlzUmVwcm9jZXNzID0gZmFsc2U7CiAgICAgICAgIGNhbGxiYWNrcy0+Y2xlYXJTdGF0dXMoKTsKQEAgLTU0NywxMCArNTU3LDEwIEBACiAgICAgICAgIEVYUEVDVF9UUlVFKHJlcy5pc09rKCkpIDw8IHJlczsKICAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTI6OkNhcHR1cmVSZXF1ZXN0IHJlcXVlc3QzOwogICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhMjo6Q2FwdHVyZVJlcXVlc3QgcmVxdWVzdDQ7Ci0gICAgICAgIHJlcXVlc3QzLm1NZXRhZGF0YSA9IHJlcXVlc3RUZW1wbGF0ZTsKKyAgICAgICAgcmVxdWVzdDMubVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MucHVzaF9iYWNrKHtjYW1lcmFJZDguc3RyaW5nKCksIHJlcXVlc3RUZW1wbGF0ZX0pOwogICAgICAgICByZXF1ZXN0My5tU3VyZmFjZUxpc3QuYWRkKHN1cmZhY2UpOwogICAgICAgICByZXF1ZXN0My5tSXNSZXByb2Nlc3MgPSBmYWxzZTsKLSAgICAgICAgcmVxdWVzdDQubU1ldGFkYXRhID0gcmVxdWVzdFRlbXBsYXRlMjsKKyAgICAgICAgcmVxdWVzdDQubVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MucHVzaF9iYWNrKHtjYW1lcmFJZDguc3RyaW5nKCksIHJlcXVlc3RUZW1wbGF0ZTJ9KTsKICAgICAgICAgcmVxdWVzdDQubVN1cmZhY2VMaXN0LmFkZChzdXJmYWNlKTsKICAgICAgICAgcmVxdWVzdDQubUlzUmVwcm9jZXNzID0gZmFsc2U7CiAgICAgICAgIHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpjYW1lcmEyOjpDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdExpc3Q7CkBAIC01NzQsNyArNTg0LDcgQEAKICAgICAgICAgRVhQRUNUX1RSVUUocmVzLmlzT2soKSkgPDwgcmVzOwogICAgICAgICByZXMgPSBkZXZpY2UtPmRlbGV0ZVN0cmVhbShzdHJlYW1JZCk7CiAgICAgICAgIEVYUEVDVF9UUlVFKHJlcy5pc09rKCkpIDw8IHJlczsKLSAgICAgICAgcmVzID0gZGV2aWNlLT5lbmRDb25maWd1cmUoLyppc0NvbnN0cmFpbmVkSGlnaFNwZWVkKi8gZmFsc2UpOworICAgICAgICByZXMgPSBkZXZpY2UtPmVuZENvbmZpZ3VyZSgvKmlzQ29uc3RyYWluZWRIaWdoU3BlZWQqLyBmYWxzZSwgc2Vzc2lvblBhcmFtcyk7CiAgICAgICAgIEVYUEVDVF9UUlVFKHJlcy5pc09rKCkpIDw8IHJlczsKIAogICAgICAgICBzbGVlcCgvKnNlY29uZCovMSk7IC8vIGFsbG93IHNvbWUgdGltZSBmb3IgZXJyb3JzIHRvIHNob3cgdXAsIGlmIGFueQpAQCAtNTg0LDMgKzU5NCw2MiBAQAogICAgIH0KIAogfTsKKworVEVTVF9GKENhbWVyYUNsaWVudEJpbmRlclRlc3QsIENoZWNrQmluZGVyQ2FwdHVyZVJlcXVlc3QpIHsKKyAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdE9yaWdpbmFsLCByZXF1ZXN0UGFyY2VsZWQ7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gZ2JQcm9kdWNlcjsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBnYkNvbnN1bWVyOworICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmZ2JQcm9kdWNlciwgJmdiQ29uc3VtZXIpOworICAgIHNwPFN1cmZhY2U+IHN1cmZhY2UobmV3IFN1cmZhY2UoZ2JQcm9kdWNlciwgLypjb250cm9sbGVkQnlBcHAqL2ZhbHNlKSk7CisgICAgVmVjdG9yPHNwPFN1cmZhY2U+PiBzdXJmYWNlTGlzdDsKKyAgICBzdXJmYWNlTGlzdC5wdXNoX2JhY2soc3VyZmFjZSk7CisgICAgc3RkOjpzdHJpbmcgcGh5c2ljYWxEZXZpY2VJZDEgPSAiMCI7CisgICAgc3RkOjpzdHJpbmcgcGh5c2ljYWxEZXZpY2VJZDIgPSAiMSI7CisgICAgQ2FtZXJhTWV0YWRhdGEgcGh5c2ljYWxEZXZpY2VTZXR0aW5nczEsIHBoeXNpY2FsRGV2aWNlU2V0dGluZ3MyOworICAgIHVpbnQ4X3QgaW50ZW50MSA9IEFORFJPSURfQ09OVFJPTF9DQVBUVVJFX0lOVEVOVF9QUkVWSUVXOworICAgIHVpbnQ4X3QgaW50ZW50MiA9IEFORFJPSURfQ09OVFJPTF9DQVBUVVJFX0lOVEVOVF9WSURFT19SRUNPUkQ7CisgICAgRVhQRUNUX0VRKE9LLCBwaHlzaWNhbERldmljZVNldHRpbmdzMS51cGRhdGUoQU5EUk9JRF9DT05UUk9MX0NBUFRVUkVfSU5URU5ULCAmaW50ZW50MSwgMSkpOworICAgIEVYUEVDVF9FUShPSywgcGh5c2ljYWxEZXZpY2VTZXR0aW5nczIudXBkYXRlKEFORFJPSURfQ09OVFJPTF9DQVBUVVJFX0lOVEVOVCwgJmludGVudDIsIDEpKTsKKworICAgIHJlcXVlc3RQYXJjZWxlZCA9IG5ldyBDYXB0dXJlUmVxdWVzdCgpOworICAgIFBhcmNlbCBwOworICAgIEVYUEVDVF9UUlVFKHJlcXVlc3RQYXJjZWxlZC0+cmVhZEZyb21QYXJjZWwoJnApICE9IE9LKTsKKyAgICBwLndyaXRlSW50MzIoMCk7CisgICAgcC5zZXREYXRhUG9zaXRpb24oMCk7CisgICAgRVhQRUNUX1RSVUUocmVxdWVzdFBhcmNlbGVkLT5yZWFkRnJvbVBhcmNlbCgmcCkgIT0gT0spOworICAgIHAuZnJlZURhdGEoKTsKKyAgICBwLndyaXRlSW50MzIoLTEpOworICAgIHAuc2V0RGF0YVBvc2l0aW9uKDApOworICAgIEVYUEVDVF9UUlVFKHJlcXVlc3RQYXJjZWxlZC0+cmVhZEZyb21QYXJjZWwoJnApICE9IE9LKTsKKyAgICBwLmZyZWVEYXRhKCk7CisgICAgcC53cml0ZUludDMyKDEpOworICAgIHAuc2V0RGF0YVBvc2l0aW9uKDApOworICAgIEVYUEVDVF9UUlVFKHJlcXVlc3RQYXJjZWxlZC0+cmVhZEZyb21QYXJjZWwoJnApICE9IE9LKTsKKworICAgIHJlcXVlc3RPcmlnaW5hbCA9IG5ldyBDYXB0dXJlUmVxdWVzdCgpOworICAgIHJlcXVlc3RPcmlnaW5hbC0+bVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MucHVzaF9iYWNrKHtwaHlzaWNhbERldmljZUlkMSwKKyAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlU2V0dGluZ3MxfSk7CisgICAgcmVxdWVzdE9yaWdpbmFsLT5tUGh5c2ljYWxDYW1lcmFTZXR0aW5ncy5wdXNoX2JhY2soe3BoeXNpY2FsRGV2aWNlSWQyLAorICAgICAgICAgICAgcGh5c2ljYWxEZXZpY2VTZXR0aW5nczJ9KTsKKyAgICByZXF1ZXN0T3JpZ2luYWwtPm1TdXJmYWNlTGlzdC5wdXNoX2JhY2soc3VyZmFjZSk7CisgICAgcmVxdWVzdE9yaWdpbmFsLT5tSXNSZXByb2Nlc3MgPSBmYWxzZTsKKyAgICByZXF1ZXN0T3JpZ2luYWwtPm1TdXJmYWNlQ29udmVydGVkID0gZmFsc2U7CisKKyAgICBwLmZyZWVEYXRhKCk7CisgICAgRVhQRUNUX1RSVUUocmVxdWVzdE9yaWdpbmFsLT53cml0ZVRvUGFyY2VsKCZwKSA9PSBPSyk7CisgICAgcC5zZXREYXRhUG9zaXRpb24oMCk7CisgICAgRVhQRUNUX1RSVUUocmVxdWVzdFBhcmNlbGVkLT5yZWFkRnJvbVBhcmNlbCgmcCkgPT0gT0spOworICAgIEVYUEVDVF9FUShyZXF1ZXN0UGFyY2VsZWQtPm1Jc1JlcHJvY2VzcywgZmFsc2UpOworICAgIEVYUEVDVF9GQUxTRShyZXF1ZXN0UGFyY2VsZWQtPm1TdXJmYWNlTGlzdC5lbXB0eSgpKTsKKyAgICBFWFBFQ1RfRVEoMnUsIHJlcXVlc3RQYXJjZWxlZC0+bVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3Muc2l6ZSgpKTsKKyAgICBhdXRvIGl0ID0gcmVxdWVzdFBhcmNlbGVkLT5tUGh5c2ljYWxDYW1lcmFTZXR0aW5ncy5iZWdpbigpOworICAgIEVYUEVDVF9FUShwaHlzaWNhbERldmljZUlkMSwgaXQtPmlkKTsKKyAgICBFWFBFQ1RfVFJVRShpdC0+c2V0dGluZ3MuZXhpc3RzKEFORFJPSURfQ09OVFJPTF9DQVBUVVJFX0lOVEVOVCkpOworICAgIGF1dG8gZW50cnkgPSBpdC0+c2V0dGluZ3MuZmluZChBTkRST0lEX0NPTlRST0xfQ0FQVFVSRV9JTlRFTlQpOworICAgIEVYUEVDVF9FUShlbnRyeS5kYXRhLnU4WzBdLCBpbnRlbnQxKTsKKyAgICBpdCsrOworICAgIEVYUEVDVF9FUShwaHlzaWNhbERldmljZUlkMiwgaXQtPmlkKTsKKyAgICBFWFBFQ1RfVFJVRShpdC0+c2V0dGluZ3MuZXhpc3RzKEFORFJPSURfQ09OVFJPTF9DQVBUVVJFX0lOVEVOVCkpOworICAgIGVudHJ5ID0gaXQtPnNldHRpbmdzLmZpbmQoQU5EUk9JRF9DT05UUk9MX0NBUFRVUkVfSU5URU5UKTsKKyAgICBFWFBFQ1RfRVEoZW50cnkuZGF0YS51OFswXSwgaW50ZW50Mik7Cit9OwpkaWZmIC0tZ2l0IGEvY2FtZXJhL3Rlc3RzL0NhbWVyYVpTTFRlc3RzLmNwcCBiL2NhbWVyYS90ZXN0cy9DYW1lcmFaU0xUZXN0cy5jcHAKaW5kZXggZWNjYTM1NC4uMDJjNmUyYSAxMDA2NDQKLS0tIGEvY2FtZXJhL3Rlc3RzL0NhbWVyYVpTTFRlc3RzLmNwcAorKysgYi9jYW1lcmEvdGVzdHMvQ2FtZXJhWlNMVGVzdHMuY3BwCkBAIC0yNTYsMTAgKzI1NiwxMCBAQAogICAgICAgICBBU1NFUlRfVFJVRShudWxscHRyICE9IHN1cmZhY2VDb250cm9sLmdldCgpKTsKICAgICAgICAgQVNTRVJUX1RSVUUoc3VyZmFjZUNvbnRyb2wtPmlzVmFsaWQoKSk7CiAKLSAgICAgICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpvcGVuR2xvYmFsVHJhbnNhY3Rpb24oKTsKLSAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBzdXJmYWNlQ29udHJvbC0+c2V0TGF5ZXIoMHg3ZmZmZmZmZikpOwotICAgICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIHN1cmZhY2VDb250cm9sLT5zaG93KCkpOwotICAgICAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmNsb3NlR2xvYmFsVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpUcmFuc2FjdGlvbnt9CisgICAgICAgICAgICAgICAgLnNldExheWVyKHN1cmZhY2VDb250cm9sLCAweDdmZmZmZmZmKQorICAgICAgICAgICAgICAgIC5zaG93KHN1cmZhY2VDb250cm9sKQorICAgICAgICAgICAgICAgIC5hcHBseSgpOwogCiAgICAgICAgIHByZXZpZXdTdXJmYWNlID0gc3VyZmFjZUNvbnRyb2wtPmdldFN1cmZhY2UoKTsKICAgICAgICAgQVNTRVJUX1RSVUUocHJldmlld1N1cmZhY2UgIT0gTlVMTCk7CmRpZmYgLS1naXQgYS9jYW1lcmEvdGVzdHMvVmVuZG9yVGFnRGVzY3JpcHRvclRlc3RzLmNwcCBiL2NhbWVyYS90ZXN0cy9WZW5kb3JUYWdEZXNjcmlwdG9yVGVzdHMuY3BwCmluZGV4IDc1Y2ZiNzMuLjBlZTM1OGQgMTAwNjQ0Ci0tLSBhL2NhbWVyYS90ZXN0cy9WZW5kb3JUYWdEZXNjcmlwdG9yVGVzdHMuY3BwCisrKyBiL2NhbWVyYS90ZXN0cy9WZW5kb3JUYWdEZXNjcmlwdG9yVGVzdHMuY3BwCkBAIC0xNDIsNiArMTQyLDcgQEAKICAgICBFWFBFQ1RfRVEoT0ssIHZEZXNjT3JpZ2luYWwtPndyaXRlVG9QYXJjZWwoJnApKTsKICAgICBwLnNldERhdGFQb3NpdGlvbigwKTsKIAorICAgIHZEZXNjUGFyY2VsZWQgPSBuZXcgVmVuZG9yVGFnRGVzY3JpcHRvcigpOwogICAgIEFTU0VSVF9FUShPSywgdkRlc2NQYXJjZWxlZC0+cmVhZEZyb21QYXJjZWwoJnApKTsKIAogICAgIC8vIEVuc3VyZSBjb25zaXN0ZW50IHRhZyBjb3VudApkaWZmIC0tZ2l0IGEvY21kcy9zY3JlZW5yZWNvcmQvQW5kcm9pZC5tayBiL2NtZHMvc2NyZWVucmVjb3JkL0FuZHJvaWQubWsKaW5kZXggN2FhNjg0YS4uNWU4M2VkNiAxMDA2NDQKLS0tIGEvY21kcy9zY3JlZW5yZWNvcmQvQW5kcm9pZC5taworKysgYi9jbWRzL3NjcmVlbnJlY29yZC9BbmRyb2lkLm1rCkBAIC0yNSw4ICsyNSw4IEBACiAJUHJvZ3JhbS5jcHAKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0JbGlic3RhZ2VmcmlnaHQgbGlibWVkaWEgbGlidXRpbHMgbGliYmluZGVyIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gXAotCWxpYmpwZWcgbGliZ3VpIGxpYmN1dGlscyBsaWJsb2cgbGliRUdMIGxpYkdMRVN2MgorCWxpYnN0YWdlZnJpZ2h0IGxpYm1lZGlhIGxpYm1lZGlhX29teCBsaWJ1dGlscyBsaWJiaW5kZXIgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBcCisJbGlianBlZyBsaWJ1aSBsaWJndWkgbGliY3V0aWxzIGxpYmxvZyBsaWJFR0wgbGliR0xFU3YyCiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAogCWZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXApkaWZmIC0tZ2l0IGEvY21kcy9zY3JlZW5yZWNvcmQvc2NyZWVucmVjb3JkLmNwcCBiL2NtZHMvc2NyZWVucmVjb3JkL3NjcmVlbnJlY29yZC5jcHAKaW5kZXggYmMzMmJiZS4uNDYwMzUxNSAxMDA2NDQKLS0tIGEvY21kcy9zY3JlZW5yZWNvcmQvc2NyZWVucmVjb3JkLmNwcAorKysgYi9jbWRzL3NjcmVlbnJlY29yZC9zY3JlZW5yZWNvcmQuY3BwCkBAIC01MCw2ICs1MCw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1BlcnNpc3RlbnRTdXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNCdWZmZXIuaD4KIApAQCAtNzAsOSArNzEsMTEgQEAKIHN0YXRpYyBib29sIGdWZXJib3NlID0gZmFsc2U7ICAgICAgICAgICAvLyBjaGF0dHkgb24gc3Rkb3V0CiBzdGF0aWMgYm9vbCBnUm90YXRlID0gZmFsc2U7ICAgICAgICAgICAgLy8gcm90YXRlIDkwIGRlZ3JlZXMKIHN0YXRpYyBib29sIGdNb25vdG9uaWNUaW1lID0gZmFsc2U7ICAgICAvLyB1c2Ugc3lzdGVtIG1vbm90b25pYyB0aW1lIGZvciB0aW1lc3RhbXBzCitzdGF0aWMgYm9vbCBnUGVyc2lzdGVudFN1cmZhY2UgPSBmYWxzZTsgLy8gdXNlIHBlcnNpc3RlbnQgc3VyZmFjZQogc3RhdGljIGVudW0gewogICAgIEZPUk1BVF9NUDQsIEZPUk1BVF9IMjY0LCBGT1JNQVRfRlJBTUVTLCBGT1JNQVRfUkFXX0ZSQU1FUwogfSBnT3V0cHV0Rm9ybWF0ID0gRk9STUFUX01QNDsgICAgICAgICAgIC8vIGRhdGEgZm9ybWF0IGZvciBvdXRwdXQKK3N0YXRpYyBBU3RyaW5nIGdDb2RlY05hbWUgPSAiIjsgICAgICAgICAvLyBjb2RlYyBuYW1lIG92ZXJyaWRlCiBzdGF0aWMgYm9vbCBnU2l6ZVNwZWNpZmllZCA9IGZhbHNlOyAgICAgLy8gd2FzIHNpemUgZXhwbGljaXRseSByZXF1ZXN0ZWQ/CiBzdGF0aWMgYm9vbCBnV2FudEluZm9TY3JlZW4gPSBmYWxzZTsgICAgLy8gZG8gd2Ugd2FudCBpbml0aWFsIGluZm8gc2NyZWVuPwogc3RhdGljIGJvb2wgZ1dhbnRGcmFtZVRpbWUgPSBmYWxzZTsgICAgIC8vIGRvIHdlIHdhbnQgdGltZXMgb24gZWFjaCBmcmFtZT8KQEAgLTEzMiw2ICsxMzUsNyBAQAogICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQorICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKQEAgLTE1NCw2ICsxNTgsNyBAQAogICAgIGlmIChnVmVyYm9zZSkgewogICAgICAgICBwcmludGYoIkNvbmZpZ3VyaW5nIHJlY29yZGVyIGZvciAlZHglZCAlcyBhdCAlLjJmTWJwc1xuIiwKICAgICAgICAgICAgICAgICBnVmlkZW9XaWR0aCwgZ1ZpZGVvSGVpZ2h0LCBrTWltZVR5cGVBdmMsIGdCaXRSYXRlIC8gMTAwMDAwMC4wKTsKKyAgICAgICAgZmZsdXNoKHN0ZG91dCk7CiAgICAgfQogCiAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG5ldyBBTWVzc2FnZTsKQEAgLTE2OSwxMSArMTc0LDIxIEBACiAgICAgbG9vcGVyLT5zZXROYW1lKCJzY3JlZW5yZWNvcmRfbG9vcGVyIik7CiAgICAgbG9vcGVyLT5zdGFydCgpOwogICAgIEFMT0dWKCJDcmVhdGluZyBjb2RlYyIpOwotICAgIHNwPE1lZGlhQ29kZWM+IGNvZGVjID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlUeXBlKGxvb3Blciwga01pbWVUeXBlQXZjLCB0cnVlKTsKLSAgICBpZiAoY29kZWMgPT0gTlVMTCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiB1bmFibGUgdG8gY3JlYXRlICVzIGNvZGVjIGluc3RhbmNlXG4iLAotICAgICAgICAgICAgICAgIGtNaW1lVHlwZUF2Yyk7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIHNwPE1lZGlhQ29kZWM+IGNvZGVjOworICAgIGlmIChnQ29kZWNOYW1lLmVtcHR5KCkpIHsKKyAgICAgICAgY29kZWMgPSBNZWRpYUNvZGVjOjpDcmVhdGVCeVR5cGUobG9vcGVyLCBrTWltZVR5cGVBdmMsIHRydWUpOworICAgICAgICBpZiAoY29kZWMgPT0gTlVMTCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogdW5hYmxlIHRvIGNyZWF0ZSAlcyBjb2RlYyBpbnN0YW5jZVxuIiwKKyAgICAgICAgICAgICAgICAgICAga01pbWVUeXBlQXZjKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29kZWMgPSBNZWRpYUNvZGVjOjpDcmVhdGVCeUNvbXBvbmVudE5hbWUobG9vcGVyLCBnQ29kZWNOYW1lKTsKKyAgICAgICAgaWYgKGNvZGVjID09IE5VTEwpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IHVuYWJsZSB0byBjcmVhdGUgJXMgY29kZWMgaW5zdGFuY2VcbiIsCisgICAgICAgICAgICAgICAgICAgIGdDb2RlY05hbWUuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGVyciA9IGNvZGVjLT5jb25maWd1cmUoZm9ybWF0LCBOVUxMLCBOVUxMLApAQCAtMTg3LDEwICsyMDIsMTggQEAKIAogICAgIEFMT0dWKCJDcmVhdGluZyBlbmNvZGVyIGlucHV0IHN1cmZhY2UiKTsKICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBidWZmZXJQcm9kdWNlcjsKLSAgICBlcnIgPSBjb2RlYy0+Y3JlYXRlSW5wdXRTdXJmYWNlKCZidWZmZXJQcm9kdWNlcik7CisgICAgaWYgKGdQZXJzaXN0ZW50U3VyZmFjZSkgeworICAgICAgICBzcDxQZXJzaXN0ZW50U3VyZmFjZT4gc3VyZmFjZSA9IE1lZGlhQ29kZWM6OkNyZWF0ZVBlcnNpc3RlbnRJbnB1dFN1cmZhY2UoKTsKKyAgICAgICAgYnVmZmVyUHJvZHVjZXIgPSBzdXJmYWNlLT5nZXRCdWZmZXJQcm9kdWNlcigpOworICAgICAgICBlcnIgPSBjb2RlYy0+c2V0SW5wdXRTdXJmYWNlKHN1cmZhY2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIGVyciA9IGNvZGVjLT5jcmVhdGVJbnB1dFN1cmZhY2UoJmJ1ZmZlclByb2R1Y2VyKTsKKyAgICB9CiAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAgICJFUlJPUjogdW5hYmxlIHRvIGNyZWF0ZSBlbmNvZGVyIGlucHV0IHN1cmZhY2UgKGVycj0lZClcbiIsIGVycik7CisgICAgICAgICAgICAiRVJST1I6IHVuYWJsZSB0byAlcyBlbmNvZGVyIGlucHV0IHN1cmZhY2UgKGVycj0lZClcbiIsCisgICAgICAgICAgICBnUGVyc2lzdGVudFN1cmZhY2UgPyAic2V0IiA6ICJjcmVhdGUiLAorICAgICAgICAgICAgZXJyKTsKICAgICAgICAgY29kZWMtPnJlbGVhc2UoKTsKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CkBAIC0yMTMsNyArMjM2LDkgQEAKICAqIFNldHMgdGhlIGRpc3BsYXkgcHJvamVjdGlvbiwgYmFzZWQgb24gdGhlIGRpc3BsYXkgZGltZW5zaW9ucywgdmlkZW8gc2l6ZSwKICAqIGFuZCBkZXZpY2Ugb3JpZW50YXRpb24uCiAgKi8KLXN0YXRpYyBzdGF0dXNfdCBzZXREaXNwbGF5UHJvamVjdGlvbihjb25zdCBzcDxJQmluZGVyPiYgZHB5LAorc3RhdGljIHN0YXR1c190IHNldERpc3BsYXlQcm9qZWN0aW9uKAorICAgICAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OlRyYW5zYWN0aW9uJiB0LAorICAgICAgICBjb25zdCBzcDxJQmluZGVyPiYgZHB5LAogICAgICAgICBjb25zdCBEaXNwbGF5SW5mbyYgbWFpbkRweUluZm8pIHsKIAogICAgIC8vIFNldCB0aGUgcmVnaW9uIG9mIHRoZSBsYXllciBzdGFjayB3ZSdyZSBpbnRlcmVzdGVkIGluLCB3aGljaCBpbiBvdXIKQEAgLTI3MywxMyArMjk4LDE1IEBACiAgICAgICAgIGlmIChnUm90YXRlKSB7CiAgICAgICAgICAgICBwcmludGYoIlJvdGF0ZWQgY29udGVudCBhcmVhIGlzICV1eCV1IGF0IG9mZnNldCB4PSVkIHk9JWRcbiIsCiAgICAgICAgICAgICAgICAgICAgIG91dEhlaWdodCwgb3V0V2lkdGgsIG9mZlksIG9mZlgpOworICAgICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBwcmludGYoIkNvbnRlbnQgYXJlYSBpcyAldXgldSBhdCBvZmZzZXQgeD0lZCB5PSVkXG4iLAogICAgICAgICAgICAgICAgICAgICBvdXRXaWR0aCwgb3V0SGVpZ2h0LCBvZmZYLCBvZmZZKTsKKyAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpzZXREaXNwbGF5UHJvamVjdGlvbihkcHksCisgICAgdC5zZXREaXNwbGF5UHJvamVjdGlvbihkcHksCiAgICAgICAgICAgICBnUm90YXRlID8gRElTUExBWV9PUklFTlRBVElPTl85MCA6IERJU1BMQVlfT1JJRU5UQVRJT05fMCwKICAgICAgICAgICAgIGxheWVyU3RhY2tSZWN0LCBkaXNwbGF5UmVjdCk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtMjk1LDExICszMjIsMTEgQEAKICAgICBzcDxJQmluZGVyPiBkcHkgPSBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmNyZWF0ZURpc3BsYXkoCiAgICAgICAgICAgICBTdHJpbmc4KCJTY3JlZW5SZWNvcmRlciIpLCBmYWxzZSAvKnNlY3VyZSovKTsKIAotICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6b3Blbkdsb2JhbFRyYW5zYWN0aW9uKCk7Ci0gICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpzZXREaXNwbGF5U3VyZmFjZShkcHksIGJ1ZmZlclByb2R1Y2VyKTsKLSAgICBzZXREaXNwbGF5UHJvamVjdGlvbihkcHksIG1haW5EcHlJbmZvKTsKLSAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OnNldERpc3BsYXlMYXllclN0YWNrKGRweSwgMCk7ICAgIC8vIGRlZmF1bHQgc3RhY2sKLSAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmNsb3NlR2xvYmFsVHJhbnNhY3Rpb24oKTsKKyAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OlRyYW5zYWN0aW9uIHQ7CisgICAgdC5zZXREaXNwbGF5U3VyZmFjZShkcHksIGJ1ZmZlclByb2R1Y2VyKTsKKyAgICBzZXREaXNwbGF5UHJvamVjdGlvbih0LCBkcHksIG1haW5EcHlJbmZvKTsKKyAgICB0LnNldERpc3BsYXlMYXllclN0YWNrKGRweSwgMCk7ICAgIC8vIGRlZmF1bHQgc3RhY2sKKyAgICB0LmFwcGx5KCk7CiAKICAgICAqcERpc3BsYXlIYW5kbGUgPSBkcHk7CiAKQEAgLTM0NCw2ICszNzEsNyBAQAogICAgICAgICBpZiAoc3lzdGVtVGltZShDTE9DS19NT05PVE9OSUMpID4gZW5kV2hlbk5zZWMpIHsKICAgICAgICAgICAgIGlmIChnVmVyYm9zZSkgewogICAgICAgICAgICAgICAgIHByaW50ZigiVGltZSBsaW1pdCByZWFjaGVkXG4iKTsKKyAgICAgICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0zNzksOSArNDA3LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJnZXREaXNwbGF5SW5mbyhtYWluKSBmYWlsZWQ6ICVkIiwgZXJyKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcmllbnRhdGlvbiAhPSBtYWluRHB5SW5mby5vcmllbnRhdGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIm9yaWVudGF0aW9uIGNoYW5nZWQsIG5vdyAlZCIsIG1haW5EcHlJbmZvLm9yaWVudGF0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6b3Blbkdsb2JhbFRyYW5zYWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXREaXNwbGF5UHJvamVjdGlvbih2aXJ0dWFsRHB5LCBtYWluRHB5SW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmNsb3NlR2xvYmFsVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6VHJhbnNhY3Rpb24gdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldERpc3BsYXlQcm9qZWN0aW9uKHQsIHZpcnR1YWxEcHksIG1haW5EcHlJbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHQuYXBwbHkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uID0gbWFpbkRweUluZm8ub3JpZW50YXRpb247CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC00ODEsNiArNTA5LDcgQEAKICAgICAgICAgcHJpbnRmKCJFbmNvZGVyIHN0b3BwaW5nOyByZWNvcmRlZCAldSBmcmFtZXMgaW4gJSIgUFJJZDY0ICIgc2Vjb25kc1xuIiwKICAgICAgICAgICAgICAgICBkZWJ1Z051bUZyYW1lcywgbmFub3NlY29uZHNfdG9fc2Vjb25kcygKICAgICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbVRpbWUoQ0xPQ0tfTU9OT1RPTklDKSAtIHN0YXJ0V2hlbk5zZWMpKTsKKyAgICAgICAgZmZsdXNoKHN0ZG91dCk7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTU1NCw2ICs1ODMsNyBAQAogICAgICAgICBwcmludGYoIk1haW4gZGlzcGxheSBpcyAlZHglZCBAJS4yZmZwcyAob3JpZW50YXRpb249JXUpXG4iLAogICAgICAgICAgICAgICAgIG1haW5EcHlJbmZvLncsIG1haW5EcHlJbmZvLmgsIG1haW5EcHlJbmZvLmZwcywKICAgICAgICAgICAgICAgICBtYWluRHB5SW5mby5vcmllbnRhdGlvbik7CisgICAgICAgIGZmbHVzaChzdGRvdXQpOwogICAgIH0KIAogICAgIGJvb2wgcm90YXRlZCA9IGlzRGV2aWNlUm90YXRlZChtYWluRHB5SW5mby5vcmllbnRhdGlvbik7CkBAIC02MjEsNiArNjUxLDcgQEAKICAgICAgICAgfQogICAgICAgICBpZiAoZ1ZlcmJvc2UpIHsKICAgICAgICAgICAgIHByaW50ZigiQnVncmVwb3J0IG92ZXJsYXkgY3JlYXRlZFxuIik7CisgICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIFVzZSB0aGUgZW5jb2RlcidzIGlucHV0IHN1cmZhY2UgYXMgdGhlIHZpcnR1YWwgZGlzcGxheSBzdXJmYWNlLgpAQCAtNzEzLDYgKzc0NCw3IEBACiAKICAgICAgICAgaWYgKGdWZXJib3NlKSB7CiAgICAgICAgICAgICBwcmludGYoIlN0b3BwaW5nIGVuY29kZXIgYW5kIG11eGVyXG4iKTsKKyAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOwogICAgICAgICB9CiAgICAgfQogCkBAIC03NTksNiArNzkxLDcgQEAKICAgICAgICAgICAgIHByaW50ZigiICVzIiwgYXJndltpXSk7CiAgICAgICAgIH0KICAgICAgICAgcHV0Y2hhcignXG4nKTsKKyAgICAgICAgZmZsdXNoKHN0ZG91dCk7CiAgICAgfQogCiAgICAgcGlkX3QgcGlkID0gZm9yaygpOwpAQCAtODk2LDcgKzkyOSw5IEBACiAgICAgICAgIHsgInNob3ctZnJhbWUtdGltZSIsICAgIG5vX2FyZ3VtZW50LCAgICAgICAgTlVMTCwgJ2YnIH0sCiAgICAgICAgIHsgInJvdGF0ZSIsICAgICAgICAgICAgIG5vX2FyZ3VtZW50LCAgICAgICAgTlVMTCwgJ3InIH0sCiAgICAgICAgIHsgIm91dHB1dC1mb3JtYXQiLCAgICAgIHJlcXVpcmVkX2FyZ3VtZW50LCAgTlVMTCwgJ28nIH0sCisgICAgICAgIHsgImNvZGVjLW5hbWUiLCAgICAgICAgIHJlcXVpcmVkX2FyZ3VtZW50LCAgTlVMTCwgJ04nIH0sCiAgICAgICAgIHsgIm1vbm90b25pYy10aW1lIiwgICAgIG5vX2FyZ3VtZW50LCAgICAgICAgTlVMTCwgJ20nIH0sCisgICAgICAgIHsgInBlcnNpc3RlbnQtc3VyZmFjZSIsIG5vX2FyZ3VtZW50LCAgICAgICAgTlVMTCwgJ3AnIH0sCiAgICAgICAgIHsgTlVMTCwgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgTlVMTCwgMCB9CiAgICAgfTsKIApAQCAtOTc2LDkgKzEwMTEsMTUgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gMjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdOJzoKKyAgICAgICAgICAgIGdDb2RlY05hbWUgPSBvcHRhcmc7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAnbSc6CiAgICAgICAgICAgICBnTW9ub3RvbmljVGltZSA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAncCc6CisgICAgICAgICAgICBnUGVyc2lzdGVudFN1cmZhY2UgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBpZiAoaWMgIT0gJz8nKSB7CiAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZXRvcHRfbG9uZyByZXR1cm5lZCB1bmV4cGVjdGVkIHZhbHVlIDB4JXhcbiIsIGljKTsKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvQW5kcm9pZC5tayBiL2NtZHMvc3RhZ2VmcmlnaHQvQW5kcm9pZC5tawppbmRleCBmNjQ3ZmZkLi5jNzYxOWFmIDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L0FuZHJvaWQubWsKKysrIGIvY21kcy9zdGFnZWZyaWdodC9BbmRyb2lkLm1rCkBAIC04LDkgKzgsOSBAQAogICAgICAgICBTaW5lU291cmNlLmNwcAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHQgbGlibWVkaWEgbGlidXRpbHMgbGliYmluZGVyIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gXAotICAgICAgICBsaWJqcGVnIGxpYmd1aSBsaWJjdXRpbHMgbGlibG9nIFwKLSAgICAgICAgbGliaGlkbG1lbW9yeSBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYm1lZGlhIGxpYm1lZGlhX29teCBsaWJtZWRpYWV4dHJhY3RvciBsaWJ1dGlscyBsaWJiaW5kZXIgXAorICAgICAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIGxpYmpwZWcgbGlidWkgbGliZ3VpIGxpYmN1dGlscyBsaWJsb2cgXAorICAgICAgICBsaWJoaWRsYmFzZSBcCiAgICAgICAgIGFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCBcCiAKIExPQ0FMX0NfSU5DTFVERVM6PSBcCkBAIC0zNiw3ICszNiw4IEBACiAgICAgICAgIHJlY29yZC5jcHAKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYm1lZGlhIGxpYmxvZyBsaWJ1dGlscyBsaWJiaW5kZXIgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbgorICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJtZWRpYSBsaWJtZWRpYWV4dHJhY3RvciBsaWJsb2cgbGlidXRpbHMgbGliYmluZGVyIFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbgogCiBMT0NBTF9DX0lOQ0xVREVTOj0gXAogICAgICAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKQEAgLTYwLDcgKzYxLDggQEAKICAgICAgICAgcmVjb3JkdmlkZW8uY3BwCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJtZWRpYSBsaWJsb2cgbGlidXRpbHMgbGliYmluZGVyIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24KKyAgICAgICAgbGlic3RhZ2VmcmlnaHQgbGlibWVkaWEgbGlibWVkaWFleHRyYWN0b3IgbGlibG9nIGxpYnV0aWxzIGxpYmJpbmRlciBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24KIAogTE9DQUxfQ19JTkNMVURFUzo9IFwKICAgICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCkBAIC04NSw3ICs4Nyw4IEBACiAgICAgICAgIGF1ZGlvbG9vcC5jcHAKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYm1lZGlhIGxpYmxvZyBsaWJ1dGlscyBsaWJiaW5kZXIgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbgorICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJtZWRpYSBsaWJtZWRpYWV4dHJhY3RvciBsaWJsb2cgbGlidXRpbHMgbGliYmluZGVyIFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbgogCiBMT0NBTF9DX0lOQ0xVREVTOj0gXAogICAgICAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKQEAgLTEwNyw4ICsxMTAsOCBAQAogICAgICAgICBzdHJlYW0uY3BwICAgIFwKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYmxvZyBsaWJ1dGlscyBsaWJiaW5kZXIgbGliZ3VpIFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBsaWJtZWRpYSBsaWJjdXRpbHMKKyAgICAgICAgbGlic3RhZ2VmcmlnaHQgbGlibG9nIGxpYnV0aWxzIGxpYmJpbmRlciBsaWJ1aSBsaWJndWkgXAorICAgICAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIGxpYm1lZGlhIGxpYmN1dGlscyBsaWJtZWRpYWV4dHJhY3RvcgogCiBMT0NBTF9DX0lOQ0xVREVTOj0gXAogICAgICAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKQEAgLTEzMiw3ICsxMzUsNyBAQAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHQgbGlibG9nIGxpYnV0aWxzIGxpYmJpbmRlciBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKLSAgICAgICAgbGlibWVkaWEgbGliYXVkaW9jbGllbnQgbGliZ3VpIGxpYmN1dGlscworICAgICAgICBsaWJtZWRpYSBsaWJtZWRpYV9vbXggbGliYXVkaW9jbGllbnQgbGlidWkgbGliZ3VpIGxpYmN1dGlscwogCiBMT0NBTF9DX0lOQ0xVREVTOj0gXAogICAgICAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKQEAgLTE2Myw2ICsxNjYsOCBAQAogICAgICAgICBsaWJiaW5kZXIgXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKICAgICAgICAgbGlibWVkaWEgXAorICAgICAgICBsaWJtZWRpYV9vbXggXAorICAgICAgICBsaWJ1aSBcCiAgICAgICAgIGxpYmd1aSBcCiAgICAgICAgIGxpYmN1dGlscyBcCiAgICAgICAgIGxpYlJTY3BwIFwKQEAgLTE5OSw3ICsyMDQsNyBAQAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHQgbGlibG9nIGxpYnV0aWxzIGxpYmJpbmRlciBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKLSAgICAgICAgbGliY3V0aWxzIGxpYmMKKyAgICAgICAgbGliY3V0aWxzIGxpYmMgbGlibWVkaWFleHRyYWN0b3IKIAogTE9DQUxfQ19JTkNMVURFUzo9IFwKICAgICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L1NpbmVTb3VyY2UuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9TaW5lU291cmNlLmNwcAppbmRleCBjYWQ4Y2FmLi4wZWNjMTZjIDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L1NpbmVTb3VyY2UuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvU2luZVNvdXJjZS5jcHAKQEAgLTQsNiArNCw3IEBACiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAKQEAgLTU5LDEwICs2MCwxMCBAQAogfQogCiBzdGF0dXNfdCBTaW5lU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKiAvKiBvcHRpb25zICovKSB7CisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKiAvKiBvcHRpb25zICovKSB7CiAgICAgKm91dCA9IE5VTEw7CiAKLSAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyOworICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyOwogICAgIHN0YXR1c190IGVyciA9IG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJmJ1ZmZlcik7CiAKICAgICBpZiAoZXJyICE9IE9LKSB7CkBAIC04OCw3ICs4OSw3IEBACiAgICAgICAgIHggKz0gazsKICAgICB9CiAKLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKKyAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAogICAgICAgICAgICAga0tleVRpbWUsICgoaW50NjRfdCltUGhhc2UgKiAxMDAwMDAwKSAvIG1TYW1wbGVSYXRlKTsKIAogICAgIG1QaGFzZSArPSBudW1GcmFtZXNQZXJCdWZmZXI7CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L1NpbmVTb3VyY2UuaCBiL2NtZHMvc3RhZ2VmcmlnaHQvU2luZVNvdXJjZS5oCmluZGV4IGJlMDU2NjEuLjE4MTcyOTEgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvU2luZVNvdXJjZS5oCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvU2luZVNvdXJjZS5oCkBAIC0yLDcgKzIsNyBAQAogCiAjZGVmaW5lIFNJTkVfU09VUkNFX0hfCiAKLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvQ29tcGF0Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTE4LDcgKzE4LDcgQEAKICAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+U2luZVNvdXJjZSgpOwpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9hdWRpb2xvb3AuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9hdWRpb2xvb3AuY3BwCmluZGV4IGVkNDRiNGQuLmQ0ZjJlOGQgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvYXVkaW9sb29wLmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L2F1ZGlvbG9vcC5jcHAKQEAgLTE0LDYgKzE0LDEwIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJhdWRpb2xvb3AiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CkBAIC0yOSw3ICszMyw2IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9TaW1wbGVEZWNvZGluZ1NvdXJjZS5oPgogI2luY2x1ZGUgIlNpbmVTb3VyY2UuaCIKIApAQCAtMzcsMTEgKzQwLDEzIEBACiAKIHN0YXRpYyB2b2lkIHVzYWdlKGNvbnN0IGNoYXIqIG5hbWUpCiB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgWy1kIGR1LnJhdGlvbl0gWy1tXSBbLXddIFs8b3V0cHV0LWZpbGU+XVxuIiwgbmFtZSk7CisgICAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgWy1kIGR1LnJhdGlvbl0gWy1tXSBbLXddIFstTiBuYW1lXSBbPG91dHB1dC1maWxlPl1cbiIsIG5hbWUpOwogICAgIGZwcmludGYoc3RkZXJyLCAiRW5jb2RlcyBlaXRoZXIgYSBzaW5lIHdhdmUgb3IgbWljcm9waG9uZSBpbnB1dCB0byBBTVIgZm9ybWF0XG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtZCAgICBkdXJhdGlvbiBpbiBzZWNvbmRzLCBkZWZhdWx0IDUgc2Vjb25kc1xuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgLW0gICAgdXNlIG1pY3JvcGhvbmUgZm9yIGlucHV0LCBkZWZhdWx0IHNpbmUgc291cmNlXG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtdyAgICB1c2UgQU1SIHdpZGViYW5kIChkZWZhdWx0IG5hcnJvd2JhbmQpXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtTiAgICBuYW1lIG9mIHRoZSBlbmNvZGVyOyBtdXN0IGJlIHNldCB3aXRoIC1NXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtTSAgICBtZWRpYSB0eXBlIG9mIHRoZSBlbmNvZGVyOyBtdXN0IGJlIHNldCB3aXRoIC1OXG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICA8b3V0cHV0LWZpbGU+IG91dHB1dCBmaWxlIGZvciBBTVIgZW5jb2RpbmcsIgogICAgICAgICAgICAgIiBpZiB1bnNwZWNpZmllZCwgZGVjb2RlIHRvIHNwZWFrZXIuXG4iKTsKIH0KQEAgLTU0LDggKzU5LDEwIEBACiAgICAgYm9vbCBvdXRwdXRXQkFNUiA9IGZhbHNlOwogICAgIGJvb2wgcGxheVRvU3BlYWtlciA9IHRydWU7CiAgICAgY29uc3QgY2hhciogZmlsZU91dCA9IE5VTEw7CisgICAgQVN0cmluZyBuYW1lOworICAgIEFTdHJpbmcgbWVkaWFUeXBlOwogICAgIGludCBjaDsKLSAgICB3aGlsZSAoKGNoID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJkOm13IikpICE9IC0xKSB7CisgICAgd2hpbGUgKChjaCA9IGdldG9wdChhcmdjLCBhcmd2LCAiZDptd046TToiKSkgIT0gLTEpIHsKICAgICAgICAgc3dpdGNoIChjaCkgewogICAgICAgICBjYXNlICdkJzoKICAgICAgICAgICAgIGR1cmF0aW9uID0gYXRvaShvcHRhcmcpOwpAQCAtNjYsNiArNzMsMTIgQEAKICAgICAgICAgY2FzZSAndyc6CiAgICAgICAgICAgICBvdXRwdXRXQkFNUiA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnTic6CisgICAgICAgICAgICBuYW1lLnNldFRvKG9wdGFyZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnTSc6CisgICAgICAgICAgICBtZWRpYVR5cGUuc2V0VG8ob3B0YXJnKTsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CiAgICAgICAgICAgICByZXR1cm4gLTE7CkBAIC03Niw4ICs4OSwxOCBAQAogICAgIGlmIChhcmdjID09IDEpIHsKICAgICAgICAgZmlsZU91dCA9IGFyZ3ZbMF07CiAgICAgfQotICAgIGNvbnN0IGludDMyX3Qga1NhbXBsZVJhdGUgPSBvdXRwdXRXQkFNUiA/IDE2MDAwIDogODAwMDsKLSAgICBjb25zdCBpbnQzMl90IGtCaXRSYXRlID0gb3V0cHV0V0JBTVIgPyAxNjAwMCA6IDgwMDA7CisgICAgaWYgKChuYW1lLmVtcHR5KCkgJiYgIW1lZGlhVHlwZS5lbXB0eSgpKSB8fCAoIW5hbWUuZW1wdHkoKSAmJiBtZWRpYVR5cGUuZW1wdHkoKSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICItTiBhbmQgLU0gbXVzdCBiZSBzZXQgdG9nZXRoZXJcbiIpOworICAgICAgICB1c2FnZShhcmd2WzBdKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIW5hbWUuZW1wdHkoKSAmJiBmaWxlT3V0ICE9IE5VTEwpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICItTiBhbmQgLU0gY2Fubm90IGJlIHVzZWQgd2l0aCA8b3V0cHV0IGZpbGU+XG4iKTsKKyAgICAgICAgdXNhZ2UoYXJndlswXSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaW50MzJfdCBzYW1wbGVSYXRlID0gIW5hbWUuZW1wdHkoKSA/IDQ0MTAwIDogb3V0cHV0V0JBTVIgPyAxNjAwMCA6IDgwMDA7CisgICAgaW50MzJfdCBiaXRSYXRlID0gc2FtcGxlUmF0ZTsKIAogICAgIGFuZHJvaWQ6OlByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKICAgICBzcDxNZWRpYVNvdXJjZT4gc291cmNlOwpAQCAtODcsMjIgKzExMCwyNyBAQAogICAgICAgICBzb3VyY2UgPSBuZXcgQXVkaW9Tb3VyY2UoCiAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX01JQywKICAgICAgICAgICAgICAgICBTdHJpbmcxNigpLAotICAgICAgICAgICAgICAgIGtTYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgY2hhbm5lbHMpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIHVzZSBhIHNpbmUgc291cmNlIGF0IDUwMCBoei4KLSAgICAgICAgc291cmNlID0gbmV3IFNpbmVTb3VyY2Uoa1NhbXBsZVJhdGUsIGNoYW5uZWxzKTsKKyAgICAgICAgc291cmNlID0gbmV3IFNpbmVTb3VyY2Uoc2FtcGxlUmF0ZSwgY2hhbm5lbHMpOwogICAgIH0KIAogICAgIHNwPEFNZXNzYWdlPiBtZXRhID0gbmV3IEFNZXNzYWdlOwotICAgIG1ldGEtPnNldFN0cmluZygKLSAgICAgICAgICAgICJtaW1lIiwKLSAgICAgICAgICAgIG91dHB1dFdCQU1SID8gTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCCi0gICAgICAgICAgICAgICAgICAgIDogTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CKTsKKyAgICBpZiAobmFtZS5lbXB0eSgpKSB7CisgICAgICAgIG1ldGEtPnNldFN0cmluZygKKyAgICAgICAgICAgICAgICAibWltZSIsCisgICAgICAgICAgICAgICAgb3V0cHV0V0JBTVIgPyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IKKyAgICAgICAgICAgICAgICAgICAgICAgIDogTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtZXRhLT5zZXRTdHJpbmcoIm1pbWUiLCBtZWRpYVR5cGUpOworICAgICAgICBtZXRhLT5zZXRTdHJpbmcoInRlc3RpbmctbmFtZSIsIG5hbWUpOworICAgIH0KIAogICAgIG1ldGEtPnNldEludDMyKCJjaGFubmVsLWNvdW50IiwgY2hhbm5lbHMpOwotICAgIG1ldGEtPnNldEludDMyKCJzYW1wbGUtcmF0ZSIsIGtTYW1wbGVSYXRlKTsKLSAgICBtZXRhLT5zZXRJbnQzMigiYml0cmF0ZSIsIGtCaXRSYXRlKTsKKyAgICBtZXRhLT5zZXRJbnQzMigic2FtcGxlLXJhdGUiLCBzYW1wbGVSYXRlKTsKKyAgICBtZXRhLT5zZXRJbnQzMigiYml0cmF0ZSIsIGJpdFJhdGUpOwogICAgIGludDMyX3QgbWF4SW5wdXRTaXplOwogICAgIGlmIChzb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kSW50MzIoa0tleU1heElucHV0U2l6ZSwgJm1heElucHV0U2l6ZSkpIHsKICAgICAgICAgbWV0YS0+c2V0SW50MzIoIm1heC1pbnB1dC1zaXplIiwgbWF4SW5wdXRTaXplKTsKQEAgLTExMiw3ICsxNDAsNyBAQAogICAgIGxvb3Blci0+c2V0TmFtZSgiYXVkaW9sb29wIik7CiAgICAgbG9vcGVyLT5zdGFydCgpOwogCi0gICAgc3A8SU1lZGlhU291cmNlPiBlbmNvZGVyID0gTWVkaWFDb2RlY1NvdXJjZTo6Q3JlYXRlKGxvb3BlciwgbWV0YSwgc291cmNlKTsKKyAgICBzcDxNZWRpYVNvdXJjZT4gZW5jb2RlciA9IE1lZGlhQ29kZWNTb3VyY2U6OkNyZWF0ZShsb29wZXIsIG1ldGEsIHNvdXJjZSk7CiAKICAgICBpZiAoZmlsZU91dCAhPSBOVUxMKSB7CiAgICAgICAgIC8vIHRhcmdldCBmaWxlIHNwZWNpZmllZCwgd3JpdGUgZW5jb2RlZCBBTVIgb3V0cHV0CkBAIC0xMjgsMTkgKzE1NiwyMCBAQAogICAgICAgICB3cml0ZXItPnN0b3AoKTsKICAgICB9IGVsc2UgewogICAgICAgICAvLyBvdGhlcndpc2UgZGVjb2RlIHRvIHNwZWFrZXIKLSAgICAgICAgc3A8SU1lZGlhU291cmNlPiBkZWNvZGVyID0gU2ltcGxlRGVjb2RpbmdTb3VyY2U6OkNyZWF0ZShlbmNvZGVyKTsKKyAgICAgICAgc3A8TWVkaWFTb3VyY2U+IGRlY29kZXIgPSBTaW1wbGVEZWNvZGluZ1NvdXJjZTo6Q3JlYXRlKGVuY29kZXIpOwogCiAgICAgICAgIGlmIChwbGF5VG9TcGVha2VyKSB7Ci0gICAgICAgICAgICBBdWRpb1BsYXllciAqcGxheWVyID0gbmV3IEF1ZGlvUGxheWVyKE5VTEwpOwotICAgICAgICAgICAgcGxheWVyLT5zZXRTb3VyY2UoZGVjb2Rlcik7Ci0gICAgICAgICAgICBwbGF5ZXItPnN0YXJ0KCk7CisgICAgICAgICAgICBBdWRpb1BsYXllciBwbGF5ZXIoTlVMTCk7CisgICAgICAgICAgICBwbGF5ZXIuc2V0U291cmNlKGRlY29kZXIpOworICAgICAgICAgICAgcGxheWVyLnN0YXJ0KCk7CiAgICAgICAgICAgICBzbGVlcChkdXJhdGlvbik7CiAKK0FMT0dJKCJMaW5lOiAlZCIsIF9fTElORV9fKTsKICAgICAgICAgICAgIGRlY29kZXIuY2xlYXIoKTsgLy8gbXVzdCBjbGVhciB8ZGVjb2Rlcnwgb3RoZXJ3aXNlIGRlbGV0ZSBwbGF5ZXIgd2lsbCBoYW5nLgotICAgICAgICAgICAgZGVsZXRlIHBsYXllcjsgLy8gdGhlcmUgaXMgbm8gcGxheWVyLT5zdG9wKCkuLi4KK0FMT0dJKCJMaW5lOiAlZCIsIF9fTElORV9fKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIENIRUNLX0VRKGRlY29kZXItPnN0YXJ0KCksIChzdGF0dXNfdClPSyk7Ci0gICAgICAgICAgICBNZWRpYUJ1ZmZlciogYnVmZmVyOworICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlKiBidWZmZXI7CiAgICAgICAgICAgICB3aGlsZSAoZGVjb2Rlci0+cmVhZCgmYnVmZmVyKSA9PSBPSykgewogICAgICAgICAgICAgICAgIC8vIGRvIHNvbWV0aGluZyB3aXRoIGJ1ZmZlciAoc2F2ZSBpdCBldmVudHVhbGx5PykKICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIHN0b3AgYWZ0ZXIgc29tZSBjb3VudCB0aG91Z2guLi4KQEAgLTE1MSw2ICsxODAsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgQ0hFQ0tfRVEoZGVjb2Rlci0+c3RvcCgpLCAoc3RhdHVzX3QpT0spOwogICAgICAgICB9CitBTE9HSSgiTGluZTogJWQiLCBfX0xJTkVfXyk7CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L2NvZGVjLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvY29kZWMuY3BwCmluZGV4IDMxMDhhNjcuLjZhNTg0NjcgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvY29kZWMuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvY29kZWMuY3BwCkBAIC00MzAsMTAgKzQzMCwxMCBAQAogICAgICAgICBDSEVDSyhjb250cm9sICE9IE5VTEwpOwogICAgICAgICBDSEVDSyhjb250cm9sLT5pc1ZhbGlkKCkpOwogCi0gICAgICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6b3Blbkdsb2JhbFRyYW5zYWN0aW9uKCk7Ci0gICAgICAgIENIRUNLX0VRKGNvbnRyb2wtPnNldExheWVyKElOVF9NQVgpLCAoc3RhdHVzX3QpT0spOwotICAgICAgICBDSEVDS19FUShjb250cm9sLT5zaG93KCksIChzdGF0dXNfdClPSyk7Ci0gICAgICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6Y2xvc2VHbG9iYWxUcmFuc2FjdGlvbigpOworICAgICAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OlRyYW5zYWN0aW9ue30KKyAgICAgICAgICAgICAgICAgLnNldExheWVyKGNvbnRyb2wsIElOVF9NQVgpCisgICAgICAgICAgICAgICAgIC5zaG93KGNvbnRyb2wpCisgICAgICAgICAgICAgICAgIC5hcHBseSgpOwogCiAgICAgICAgIHN1cmZhY2UgPSBjb250cm9sLT5nZXRTdXJmYWNlKCk7CiAgICAgICAgIENIRUNLKHN1cmZhY2UgIT0gTlVMTCk7CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L21lZGlhZmlsdGVyLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvbWVkaWFmaWx0ZXIuY3BwCmluZGV4IGYyMTllNjkuLmYyNGQyZGQgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvbWVkaWFmaWx0ZXIuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvbWVkaWFmaWx0ZXIuY3BwCkBAIC03NjQsMTAgKzc2NCwxMCBAQAogICAgICAgICBDSEVDSyhjb250cm9sICE9IE5VTEwpOwogICAgICAgICBDSEVDSyhjb250cm9sLT5pc1ZhbGlkKCkpOwogCi0gICAgICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6b3Blbkdsb2JhbFRyYW5zYWN0aW9uKCk7Ci0gICAgICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywgY29udHJvbC0+c2V0TGF5ZXIoSU5UX01BWCkpOwotICAgICAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIGNvbnRyb2wtPnNob3coKSk7Ci0gICAgICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6Y2xvc2VHbG9iYWxUcmFuc2FjdGlvbigpOworICAgICAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OlRyYW5zYWN0aW9ue30KKyAgICAgICAgICAgICAgICAuc2V0TGF5ZXIoY29udHJvbCwgSU5UX01BWCkKKyAgICAgICAgICAgICAgICAuc2hvdyhjb250cm9sKQorICAgICAgICAgICAgICAgIC5hcHBseSgpOwogCiAgICAgICAgIHN1cmZhY2UgPSBjb250cm9sLT5nZXRTdXJmYWNlKCk7CiAgICAgICAgIENIRUNLKHN1cmZhY2UgIT0gTlVMTCk7CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZC5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZC5jcHAKaW5kZXggOTRjMmU5Ni4uNDRiMDAxNSAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9yZWNvcmQuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvcmVjb3JkLmNwcApAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgIlNpbmVTb3VyY2UuaCIKIAogI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgpAQCAtMjcsNyArMjgsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9TaW1wbGVEZWNvZGluZ1NvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmg+CkBAIC0xMjAsNyArMTIxLDcgQEAKICAgICBzcDxNZWRpYVNvdXJjZT4gc291cmNlOwogCiAgICAgc3A8TWVkaWFFeHRyYWN0b3I+IGV4dHJhY3RvciA9Ci0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpDcmVhdGUobmV3IEZpbGVTb3VyY2UoZmlsZW5hbWUpKTsKKyAgICAgICAgTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpDcmVhdGUobmV3IEZpbGVTb3VyY2UoZmlsZW5hbWUpKTsKICAgICBpZiAoZXh0cmFjdG9yID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMzIwLDE0ICszMjEsMTQgQEAKICAgICBsb29wZXItPnNldE5hbWUoInJlY29yZCIpOwogICAgIGxvb3Blci0+c3RhcnQoKTsKIAotICAgIHNwPElNZWRpYVNvdXJjZT4gZW5jb2RlciA9CisgICAgc3A8TWVkaWFTb3VyY2U+IGVuY29kZXIgPQogICAgICAgICBNZWRpYUNvZGVjU291cmNlOjpDcmVhdGUobG9vcGVyLCBlbmNNZXRhLCBhdWRpb1NvdXJjZSk7CiAKICAgICBlbmNvZGVyLT5zdGFydCgpOwogCiAgICAgaW50MzJfdCBuID0gMDsKICAgICBzdGF0dXNfdCBlcnI7Ci0gICAgTWVkaWFCdWZmZXIgKmJ1ZmZlcjsKKyAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcjsKICAgICB3aGlsZSAoKGVyciA9IGVuY29kZXItPnJlYWQoJmJ1ZmZlcikpID09IE9LKSB7CiAgICAgICAgIHByaW50ZigiLiIpOwogICAgICAgICBmZmx1c2goc3Rkb3V0KTsKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvcmVjb3JkdmlkZW8uY3BwIGIvY21kcy9zdGFnZWZyaWdodC9yZWNvcmR2aWRlby5jcHAKaW5kZXggN2EzYzg0Mi4uYTYzYjliOSAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9yZWNvcmR2aWRlby5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9yZWNvcmR2aWRlby5jcHAKQEAgLTkwLDcgKzkwLDcgQEAKICAgICB9CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zICpvcHRpb25zIF9fdW51c2VkKSB7CisgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucyBfX3VudXNlZCkgewogCiAgICAgICAgIGlmIChtTnVtRnJhbWVzT3V0cHV0ICUgMTAgPT0gMCkgewogICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIuIik7CkBAIC0xMTQsOCArMTE0LDggQEAKICAgICAgICAgeCA9IHggPj0gMHhhMCA/IDB4NjAgOiB4ICsgMTsKICNlbmRpZgogICAgICAgICAoKmJ1ZmZlciktPnNldF9yYW5nZSgwLCBtU2l6ZSk7Ci0gICAgICAgICgqYnVmZmVyKS0+bWV0YV9kYXRhKCktPmNsZWFyKCk7Ci0gICAgICAgICgqYnVmZmVyKS0+bWV0YV9kYXRhKCktPnNldEludDY0KAorICAgICAgICAoKmJ1ZmZlciktPm1ldGFfZGF0YSgpLmNsZWFyKCk7CisgICAgICAgICgqYnVmZmVyKS0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCiAgICAgICAgICAgICAgICAga0tleVRpbWUsIChtTnVtRnJhbWVzT3V0cHV0ICogMTAwMDAwMCkgLyBtRnJhbWVSYXRlKTsKICAgICAgICAgKyttTnVtRnJhbWVzT3V0cHV0OwogCkBAIC0zMDMsNyArMzAzLDcgQEAKICAgICBsb29wZXItPnNldE5hbWUoInJlY29yZHZpZGVvIik7CiAgICAgbG9vcGVyLT5zdGFydCgpOwogCi0gICAgc3A8SU1lZGlhU291cmNlPiBlbmNvZGVyID0KKyAgICBzcDxNZWRpYVNvdXJjZT4gZW5jb2RlciA9CiAgICAgICAgIE1lZGlhQ29kZWNTb3VyY2U6OkNyZWF0ZSgKICAgICAgICAgICAgICAgICBsb29wZXIsIGVuY19tZXRhLCBzb3VyY2UsIE5VTEwgLyogY29uc3VtZXIgKi8sCiAgICAgICAgICAgICAgICAgcHJlZmVyU29mdHdhcmVDb2RlYyA/IE1lZGlhQ29kZWNTb3VyY2U6OkZMQUdfUFJFRkVSX1NPRlRXQVJFX0NPREVDIDogMCk7CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvc3RhZ2VmcmlnaHQuY3BwCmluZGV4IGQ3MDI4MmIuLjYxZmM4OTcgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvc3RhZ2VmcmlnaHQuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvc3RhZ2VmcmlnaHQuY3BwCkBAIC0zMSw5ICszMSwxMSBAQAogCiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUNvZGVjU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KQEAgLTQxLDE0ICs0MywxNCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CiAjaW5jbHVkZSAiaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaCIKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BdWRpb1BsYXllci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlRmFjdG9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0pQRUdTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU2ltcGxlRGVjb2RpbmdTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgpAQCAtNjUsNyArNjcsNiBAQAogI2luY2x1ZGUgPGd1aS9TdXJmYWNlQ29tcG9zZXJDbGllbnQuaD4KIAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvb214LzEuMC9XT214Lmg+CiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCkBAIC03OSw2ICs4MCw3IEBACiBzdGF0aWMgYm9vbCBnRGlzcGxheUhpc3RvZ3JhbTsKIHN0YXRpYyBib29sIHNob3dQcm9ncmVzcyA9IHRydWU7CiBzdGF0aWMgU3RyaW5nOCBnV3JpdGVNUDRGaWxlbmFtZTsKK3N0YXRpYyBTdHJpbmc4IGdDb21wb25lbnROYW1lT3ZlcnJpZGU7CiAKIHN0YXRpYyBzcDxBTmF0aXZlV2luZG93PiBnU3VyZmFjZTsKIApAQCAtMTQxLDE0ICsxNDMsMTQgQEAKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGR1bXBTb3VyY2UoY29uc3Qgc3A8SU1lZGlhU291cmNlPiAmc291cmNlLCBjb25zdCBTdHJpbmc4ICZmaWxlbmFtZSkgeworc3RhdGljIHZvaWQgZHVtcFNvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSwgY29uc3QgU3RyaW5nOCAmZmlsZW5hbWUpIHsKICAgICBGSUxFICpvdXQgPSBmb3BlbihmaWxlbmFtZS5zdHJpbmcoKSwgIndiIik7CiAKICAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIHNvdXJjZS0+c3RhcnQoKSk7CiAKICAgICBzdGF0dXNfdCBlcnI7CiAgICAgZm9yICg7OykgewotICAgICAgICBNZWRpYUJ1ZmZlciAqbWJ1ZjsKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICptYnVmOwogICAgICAgICBlcnIgPSBzb3VyY2UtPnJlYWQoJm1idWYpOwogCiAgICAgICAgIGlmIChlcnIgPT0gSU5GT19GT1JNQVRfQ0hBTkdFRCkgewpAQCAtMTc0LDEzICsxNzYsMTMgQEAKICAgICBvdXQgPSBOVUxMOwogfQogCi1zdGF0aWMgdm9pZCBwbGF5U291cmNlKHNwPElNZWRpYVNvdXJjZT4gJnNvdXJjZSkgeworc3RhdGljIHZvaWQgcGxheVNvdXJjZShzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSkgewogICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gc291cmNlLT5nZXRGb3JtYXQoKTsKIAogICAgIGNvbnN0IGNoYXIgKm1pbWU7CiAgICAgQ0hFQ0sobWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOwogCi0gICAgc3A8SU1lZGlhU291cmNlPiByYXdTb3VyY2U7CisgICAgc3A8TWVkaWFTb3VyY2U+IHJhd1NvdXJjZTsKICAgICBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXLCBtaW1lKSkgewogICAgICAgICByYXdTb3VyY2UgPSBzb3VyY2U7CiAgICAgfSBlbHNlIHsKQEAgLTE5Miw3ICsxOTQsMTAgQEAKICAgICAgICAgICAgIENIRUNLKCFnUHJlZmVyU29mdHdhcmVDb2RlYyk7CiAgICAgICAgICAgICBmbGFncyB8PSBNZWRpYUNvZGVjTGlzdDo6a0hhcmR3YXJlQ29kZWNzT25seTsKICAgICAgICAgfQotICAgICAgICByYXdTb3VyY2UgPSBTaW1wbGVEZWNvZGluZ1NvdXJjZTo6Q3JlYXRlKHNvdXJjZSwgZmxhZ3MsIGdTdXJmYWNlKTsKKyAgICAgICAgcmF3U291cmNlID0gU2ltcGxlRGVjb2RpbmdTb3VyY2U6OkNyZWF0ZSgKKyAgICAgICAgICAgICAgICBzb3VyY2UsIGZsYWdzLCBnU3VyZmFjZSwKKyAgICAgICAgICAgICAgICBnQ29tcG9uZW50TmFtZU92ZXJyaWRlLmlzRW1wdHkoKSA/IG51bGxwdHIgOiBnQ29tcG9uZW50TmFtZU92ZXJyaWRlLmNfc3RyKCksCisgICAgICAgICAgICAgICAgIWdDb21wb25lbnROYW1lT3ZlcnJpZGUuaXNFbXB0eSgpKTsKICAgICAgICAgaWYgKHJhd1NvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KQEAgLTIyOSw3ICsyMzQsNyBAQAogICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb25VcykpOwogCiAgICAgICAgIHN0YXR1c190IGVycjsKLSAgICAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlcjsKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXI7CiAgICAgICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyBvcHRpb25zOwogICAgICAgICBpbnQ2NF90IHNlZWtUaW1lVXMgPSAtMTsKICAgICAgICAgZm9yICg7OykgewpAQCAtMjQ4LDcgKzI1Myw3IEBACiAgICAgICAgICAgICAgICAgc2hvdWxkU2VlayA9IHRydWU7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wVXM7Ci0gICAgICAgICAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZXN0YW1wVXMpKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhidWZmZXItPm1ldGFfZGF0YSgpLmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVzdGFtcFVzKSk7CiAKICAgICAgICAgICAgICAgICBib29sIGZhaWxlZCA9IGZhbHNlOwogCkBAIC0zMTYsNyArMzIxLDcgQEAKICAgICB3aGlsZSAobnVtSXRlcmF0aW9uc0xlZnQtLSA+IDApIHsKICAgICAgICAgbG9uZyBudW1GcmFtZXMgPSAwOwogCi0gICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXI7CisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyOwogCiAgICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgIGludDY0X3Qgc3RhcnREZWNvZGVVcyA9IGdldE5vd1VzKCk7CkBAIC00MDQsMTQgKzQwOSwxNCBAQAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogc3RydWN0IERldGVjdFN5bmNTb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UgewotICAgIGV4cGxpY2l0IERldGVjdFN5bmNTb3VyY2UoY29uc3Qgc3A8SU1lZGlhU291cmNlPiAmc291cmNlKTsKKyAgICBleHBsaWNpdCBEZXRlY3RTeW5jU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwogICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKTsKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpOwogCiBwcml2YXRlOgogICAgIGVudW0gU3RyZWFtVHlwZSB7CkBAIC00MjEsMTQgKzQyNiwxNCBAQAogICAgICAgICBPVEhFUiwKICAgICB9OwogCi0gICAgc3A8SU1lZGlhU291cmNlPiBtU291cmNlOworICAgIHNwPE1lZGlhU291cmNlPiBtU291cmNlOwogICAgIFN0cmVhbVR5cGUgbVN0cmVhbVR5cGU7CiAgICAgYm9vbCBtU2F3Rmlyc3RJRFJGcmFtZTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERldGVjdFN5bmNTb3VyY2UpOwogfTsKIAotRGV0ZWN0U3luY1NvdXJjZTo6RGV0ZWN0U3luY1NvdXJjZShjb25zdCBzcDxJTWVkaWFTb3VyY2U+ICZzb3VyY2UpCitEZXRlY3RTeW5jU291cmNlOjpEZXRlY3RTeW5jU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKQogICAgIDogbVNvdXJjZShzb3VyY2UpLAogICAgICAgbVN0cmVhbVR5cGUoT1RIRVIpLAogICAgICAgbVNhd0ZpcnN0SURSRnJhbWUoZmFsc2UpIHsKQEAgLTQ2MCw3ICs0NjUsNyBAQAogICAgIHJldHVybiBtU291cmNlLT5nZXRGb3JtYXQoKTsKIH0KIAotc3RhdGljIGJvb2wgaXNJRFJGcmFtZShNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7CitzdGF0aWMgYm9vbCBpc0lEUkZyYW1lKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKSB7CiAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9CiAgICAgICAgIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpOwogICAgIHNpemVfdCBzaXplID0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKQEAgLTQ3Nyw3ICs0ODIsNyBAQAogfQogCiBzdGF0dXNfdCBEZXRlY3RTeW5jU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogICAgIGZvciAoOzspIHsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+cmVhZChidWZmZXIsIG9wdGlvbnMpOwogCkBAIC00ODcsMTIgKzQ5MiwxMiBAQAogCiAgICAgICAgIGlmIChtU3RyZWFtVHlwZSA9PSBBVkMpIHsKICAgICAgICAgICAgIGJvb2wgaXNJRFIgPSBpc0lEUkZyYW1lKCpidWZmZXIpOwotICAgICAgICAgICAgKCpidWZmZXIpLT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCBpc0lEUik7CisgICAgICAgICAgICAoKmJ1ZmZlciktPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgaXNJRFIpOwogICAgICAgICAgICAgaWYgKGlzSURSKSB7CiAgICAgICAgICAgICAgICAgbVNhd0ZpcnN0SURSRnJhbWUgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKCpidWZmZXIpLT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCB0cnVlKTsKKyAgICAgICAgICAgICgqYnVmZmVyKS0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCB0cnVlKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChtU3RyZWFtVHlwZSAhPSBBVkMgfHwgbVNhd0ZpcnN0SURSRnJhbWUpIHsKQEAgLTUxMCw3ICs1MTUsNyBAQAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogc3RhdGljIHZvaWQgd3JpdGVTb3VyY2VzVG9NUDQoCi0gICAgICAgIFZlY3RvcjxzcDxJTWVkaWFTb3VyY2U+ID4gJnNvdXJjZXMsIGJvb2wgc3luY0luZm9QcmVzZW50KSB7CisgICAgICAgIFZlY3RvcjxzcDxNZWRpYVNvdXJjZT4gPiAmc291cmNlcywgYm9vbCBzeW5jSW5mb1ByZXNlbnQpIHsKICNpZiAwCiAgICAgc3A8TVBFRzRXcml0ZXI+IHdyaXRlciA9CiAgICAgICAgIG5ldyBNUEVHNFdyaXRlcihnV3JpdGVNUDRGaWxlbmFtZS5zdHJpbmcoKSk7CkBAIC01MjgsNyArNTMzLDcgQEAKICAgICB3cml0ZXItPnNldE1heEZpbGVEdXJhdGlvbig2MDAwMDAwMGxsKTsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc291cmNlcy5zaXplKCk7ICsraSkgewotICAgICAgICBzcDxJTWVkaWFTb3VyY2U+IHNvdXJjZSA9IHNvdXJjZXMuZWRpdEl0ZW1BdChpKTsKKyAgICAgICAgc3A8TWVkaWFTb3VyY2U+IHNvdXJjZSA9IHNvdXJjZXMuZWRpdEl0ZW1BdChpKTsKIAogICAgICAgICBDSEVDS19FUSh3cml0ZXItPmFkZFNvdXJjZSgKICAgICAgICAgICAgICAgICAgICAgc3luY0luZm9QcmVzZW50ID8gc291cmNlIDogbmV3IERldGVjdFN5bmNTb3VyY2Uoc291cmNlKSksCkBAIC01NDUsNyArNTUwLDcgQEAKICAgICB3cml0ZXItPnN0b3AoKTsKIH0KIAotc3RhdGljIHZvaWQgcGVyZm9ybVNlZWtUZXN0KGNvbnN0IHNwPElNZWRpYVNvdXJjZT4gJnNvdXJjZSkgeworc3RhdGljIHZvaWQgcGVyZm9ybVNlZWtUZXN0KGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKSB7CiAgICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBzb3VyY2UtPnN0YXJ0KCkpOwogCiAgICAgaW50NjRfdCBkdXJhdGlvblVzOwpAQCAtNTU3LDcgKzU2Miw3IEBACiAgICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKAogICAgICAgICAgICAgICAgIHNlZWtUaW1lVXMsIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DKTsKIAotICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyOworICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcjsKICAgICAgICAgc3RhdHVzX3QgZXJyOwogICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgICBlcnIgPSBzb3VyY2UtPnJlYWQoJmJ1ZmZlciwgJm9wdGlvbnMpOwpAQCAtNTg2LDcgKzU5MSw3IEBACiAKICAgICAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgICAgICAgICBDSEVDSyhidWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKKyAgICAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YV9kYXRhKCkuZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7CiAKICAgICAgICAgICAgIHByaW50ZigiJSIgUFJJZDY0ICJcdCUiIFBSSWQ2NCAiXHQlIiBQUklkNjQgIlxuIiwKICAgICAgICAgICAgICAgICAgICBzZWVrVGltZVVzLCB0aW1lVXMsIHNlZWtUaW1lVXMgLSB0aW1lVXMpOwpAQCAtNjE3LDYgKzYyMiw3IEBACiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLW8gcGxheWJhY2sgYXVkaW9cbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC13KHJpdGUpIGZpbGVuYW1lICh3cml0ZSB0byAubXA0IGZpbGUpXG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtayBzZWVrIHRlc3RcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1OKGFtZSkgb2YgdGhlIGNvbXBvbmVudFxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLXggZGlzcGxheSBhIGhpc3RvZ3JhbSBvZiBkZWNvZGluZyB0aW1lcy9mcHMgIgogICAgICAgICAgICAgICAgICAgICAiKHZpZGVvIG9ubHkpXG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtcSBkb24ndCBzaG93IHByb2dyZXNzIGluZGljYXRvclxuIik7CkBAIC03MDIsNyArNzA4LDcgQEAKICAgICBzcDxBTG9vcGVyPiBsb29wZXI7CiAKICAgICBpbnQgcmVzOwotICAgIHdoaWxlICgocmVzID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJoYXFuOmxtOmI6cHRzcm93Omt4U1RkOkQ6IikpID49IDApIHsKKyAgICB3aGlsZSAoKHJlcyA9IGdldG9wdChhcmdjLCBhcmd2LCAiaGFxbjpsbTpiOnB0c3JvdzprTjp4U1RkOkQ6IikpID49IDApIHsKICAgICAgICAgc3dpdGNoIChyZXMpIHsKICAgICAgICAgICAgIGNhc2UgJ2EnOgogICAgICAgICAgICAgewpAQCAtNzMxLDYgKzczNywxMiBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBjYXNlICdOJzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnQ29tcG9uZW50TmFtZU92ZXJyaWRlLnNldFRvKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGNhc2UgJ2wnOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGxpc3RDb21wb25lbnRzID0gdHJ1ZTsKQEAgLTg4MSw3ICs4OTMsNyBAQAogICAgICAgICAgICAgICAgIFZpZGVvRnJhbWUgKmZyYW1lID0gKFZpZGVvRnJhbWUgKiltZW0tPnBvaW50ZXIoKTsKIAogICAgICAgICAgICAgICAgIENIRUNLX0VRKHdyaXRlSnBlZ0ZpbGUoIi9zZGNhcmQvb3V0LmpwZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QgKilmcmFtZSArIHNpemVvZihWaWRlb0ZyYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+Z2V0RmxhdHRlbmVkRGF0YSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5tV2lkdGgsIGZyYW1lLT5tSGVpZ2h0KSwgMCk7CiAgICAgICAgICAgICB9CiAKQEAgLTkwOSwzNyArOTIxLDI0IEBACiAgICAgfQogCiAgICAgaWYgKGxpc3RDb21wb25lbnRzKSB7Ci0gICAgICAgIHNwPElPTVg+IG9teDsKLSAgICAgICAgaWYgKHByb3BlcnR5X2dldF9ib29sKCJwZXJzaXN0Lm1lZGlhLnRyZWJsZV9vbXgiLCB0cnVlKSkgewotICAgICAgICAgICAgdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA7Ci0gICAgICAgICAgICBzcDxJT214PiB0T214ID0gSU9teDo6Z2V0U2VydmljZSgpOworICAgICAgICB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKKyAgICAgICAgdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7CisgICAgICAgIHVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOworICAgICAgICBzcDxJT214PiBvbXggPSBJT214OjpnZXRTZXJ2aWNlKCk7CisgICAgICAgIENIRUNLKG9teC5nZXQoKSAhPSBudWxscHRyKTsKIAotICAgICAgICAgICAgQ0hFQ0sodE9teC5nZXQoKSAhPSBOVUxMKTsKLQotICAgICAgICAgICAgb214ID0gbmV3IHV0aWxzOjpMV09teCh0T214KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKLSAgICAgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5jb2RlYyIpKTsKLSAgICAgICAgICAgIHNwPElNZWRpYUNvZGVjU2VydmljZT4gc2VydmljZSA9IGludGVyZmFjZV9jYXN0PElNZWRpYUNvZGVjU2VydmljZT4oYmluZGVyKTsKLQotICAgICAgICAgICAgQ0hFQ0soc2VydmljZS5nZXQoKSAhPSBOVUxMKTsKLQotICAgICAgICAgICAgb214ID0gc2VydmljZS0+Z2V0T01YKCk7Ci0gICAgICAgIH0KLSAgICAgICAgQ0hFQ0sob214LmdldCgpICE9IE5VTEwpOwotCi0gICAgICAgIExpc3Q8SU9NWDo6Q29tcG9uZW50SW5mbz4gbGlzdDsKLSAgICAgICAgb214LT5saXN0Tm9kZXMoJmxpc3QpOwotCi0gICAgICAgIGZvciAoTGlzdDxJT01YOjpDb21wb25lbnRJbmZvPjo6aXRlcmF0b3IgaXQgPSBsaXN0LmJlZ2luKCk7Ci0gICAgICAgICAgICAgaXQgIT0gbGlzdC5lbmQoKTsgKytpdCkgewotICAgICAgICAgICAgcHJpbnRmKCIlc1x0IFJvbGVzOiAiLCAoKml0KS5tTmFtZS5zdHJpbmcoKSk7Ci0gICAgICAgICAgICBmb3IgKExpc3Q8U3RyaW5nOD46Oml0ZXJhdG9yIGl0Um9sZXMgPSAoKml0KS5tUm9sZXMuYmVnaW4oKSA7Ci0gICAgICAgICAgICAgICAgICAgIGl0Um9sZXMgIT0gKCppdCkubVJvbGVzLmVuZCgpIDsgKytpdFJvbGVzKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIlc1x0IiwgKCppdFJvbGVzKS5zdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcmludGYoIlxuIik7Ci0gICAgICAgIH0KKyAgICAgICAgaGlkbF92ZWM8SU9teDo6Q29tcG9uZW50SW5mbz4gbm9kZUxpc3Q7CisgICAgICAgIGF1dG8gdHJhbnNTdGF0dXMgPSBvbXgtPmxpc3ROb2RlcyhbXSgKKyAgICAgICAgICAgICAgICBjb25zdCBhdXRvJiBzdGF0dXMsIGNvbnN0IGF1dG8mIG5vZGVMaXN0KSB7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBpbmZvIDogbm9kZUxpc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXNcdCBSb2xlczogIiwgaW5mby5tTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgcm9sZSA6IGluZm8ubVJvbGVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlc1x0Iiwgcm9sZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICBDSEVDSyh0cmFuc1N0YXR1cy5pc09rKCkpOwogICAgIH0KIAogICAgIHNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4gY29tcG9zZXJDbGllbnQ7CkBAIC05NjAsMTAgKzk1OSwxMCBAQAogICAgICAgICAgICAgQ0hFQ0soY29udHJvbCAhPSBOVUxMKTsKICAgICAgICAgICAgIENIRUNLKGNvbnRyb2wtPmlzVmFsaWQoKSk7CiAKLSAgICAgICAgICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6b3Blbkdsb2JhbFRyYW5zYWN0aW9uKCk7Ci0gICAgICAgICAgICBDSEVDS19FUShjb250cm9sLT5zZXRMYXllcihJTlRfTUFYKSwgKHN0YXR1c190KU9LKTsKLSAgICAgICAgICAgIENIRUNLX0VRKGNvbnRyb2wtPnNob3coKSwgKHN0YXR1c190KU9LKTsKLSAgICAgICAgICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6Y2xvc2VHbG9iYWxUcmFuc2FjdGlvbigpOworICAgICAgICAgICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpUcmFuc2FjdGlvbnt9CisgICAgICAgICAgICAgICAgICAgIC5zZXRMYXllcihjb250cm9sLCBJTlRfTUFYKQorICAgICAgICAgICAgICAgICAgICAuc2hvdyhjb250cm9sKQorICAgICAgICAgICAgICAgICAgICAuYXBwbHkoKTsKIAogICAgICAgICAgICAgZ1N1cmZhY2UgPSBjb250cm9sLT5nZXRTdXJmYWNlKCk7CiAgICAgICAgICAgICBDSEVDSyhnU3VyZmFjZSAhPSBOVUxMKTsKQEAgLTk4OCw3ICs5ODcsNyBAQAogICAgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSA9IGFyZ3Zba107CiAKICAgICAgICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICBEYXRhU291cmNlOjpDcmVhdGVGcm9tVVJJKE5VTEwgLyogaHR0cFNlcnZpY2UgKi8sIGZpbGVuYW1lKTsKKyAgICAgICAgICAgIERhdGFTb3VyY2VGYWN0b3J5OjpDcmVhdGVGcm9tVVJJKE5VTEwgLyogaHR0cFNlcnZpY2UgKi8sIGZpbGVuYW1lKTsKIAogICAgICAgICBpZiAoc3RybmNhc2VjbXAoZmlsZW5hbWUsICJzaW5lOiIsIDUpICYmIGRhdGFTb3VyY2UgPT0gTlVMTCkgewogICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gY3JlYXRlIGRhdGEgc291cmNlLlxuIik7CkBAIC0xMDAyLDggKzEwMDEsOCBAQAogICAgICAgICAgICAgaXNKUEVHID0gdHJ1ZTsKICAgICAgICAgfQogCi0gICAgICAgIFZlY3RvcjxzcDxJTWVkaWFTb3VyY2U+ID4gbWVkaWFTb3VyY2VzOwotICAgICAgICBzcDxJTWVkaWFTb3VyY2U+IG1lZGlhU291cmNlOworICAgICAgICBWZWN0b3I8c3A8TWVkaWFTb3VyY2U+ID4gbWVkaWFTb3VyY2VzOworICAgICAgICBzcDxNZWRpYVNvdXJjZT4gbWVkaWFTb3VyY2U7CiAKICAgICAgICAgaWYgKGlzSlBFRykgewogICAgICAgICAgICAgbWVkaWFTb3VyY2UgPSBuZXcgSlBFR1NvdXJjZShkYXRhU291cmNlKTsKQEAgLTEwMjIsNyArMTAyMSw3IEBACiAgICAgICAgICAgICAgICAgbWVkaWFTb3VyY2VzLnB1c2gobWVkaWFTb3VyY2UpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3A8SU1lZGlhRXh0cmFjdG9yPiBleHRyYWN0b3IgPSBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRlKGRhdGFTb3VyY2UpOworICAgICAgICAgICAgc3A8SU1lZGlhRXh0cmFjdG9yPiBleHRyYWN0b3IgPSBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OkNyZWF0ZShkYXRhU291cmNlKTsKIAogICAgICAgICAgICAgaWYgKGV4dHJhY3RvciA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgY3JlYXRlIGV4dHJhY3Rvci5cbiIpOwpAQCAtMTA0OSw3ICsxMDQ4LDggQEAKICAgICAgICAgICAgICAgICBib29sIGhhdmVBdWRpbyA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGJvb2wgaGF2ZVZpZGVvID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1UcmFja3M7ICsraSkgewotICAgICAgICAgICAgICAgICAgICBzcDxJTWVkaWFTb3VyY2U+IHNvdXJjZSA9IGV4dHJhY3Rvci0+Z2V0VHJhY2soaSk7CisgICAgICAgICAgICAgICAgICAgIHNwPE1lZGlhU291cmNlPiBzb3VyY2UgPSBDcmVhdGVNZWRpYVNvdXJjZUZyb21JTWVkaWFTb3VyY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdG9yLT5nZXRUcmFjayhpKSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJza2lwIE5VTEwgdHJhY2sgJXp1LCB0cmFjayBjb3VudCAlenUuXG4iLCBpLCBudW1UcmFja3MpOwogICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC0xMDg0LDcgKzEwODQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIE1lZGlhRXh0cmFjdG9yOjprSW5jbHVkZUV4dGVuc2l2ZU1ldGFEYXRhKTsKIAogICAgICAgICAgICAgICAgICAgICBpZiAobWV0YSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7CiAgICAgICAgICAgICAgICAgICAgIG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpOwpAQCAtMTExNSw3ICsxMTE1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRodW1iVGltZVVzLCB0aHVtYlRpbWVVcyAvIDFFNik7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgbWVkaWFTb3VyY2UgPSBleHRyYWN0b3ItPmdldFRyYWNrKGkpOworICAgICAgICAgICAgICAgIG1lZGlhU291cmNlID0gQ3JlYXRlTWVkaWFTb3VyY2VGcm9tSU1lZGlhU291cmNlKGV4dHJhY3Rvci0+Z2V0VHJhY2soaSkpOwogICAgICAgICAgICAgICAgIGlmIChtZWRpYVNvdXJjZSA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic2tpcCBOVUxMIHRyYWNrICV6dSwgdG90YWwgdHJhY2tzICV6dS5cbiIsIGksIG51bVRyYWNrcyk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKQEAgLTExMjgsNyArMTEyOCw3IEBACiAgICAgICAgIH0gZWxzZSBpZiAoZHVtcFN0cmVhbSkgewogICAgICAgICAgICAgZHVtcFNvdXJjZShtZWRpYVNvdXJjZSwgZHVtcFN0cmVhbUZpbGVuYW1lKTsKICAgICAgICAgfSBlbHNlIGlmIChkdW1wUENNU3RyZWFtKSB7Ci0gICAgICAgICAgICBzcDxJTWVkaWFTb3VyY2U+IGRlY1NvdXJjZSA9IFNpbXBsZURlY29kaW5nU291cmNlOjpDcmVhdGUobWVkaWFTb3VyY2UpOworICAgICAgICAgICAgc3A8TWVkaWFTb3VyY2U+IGRlY1NvdXJjZSA9IFNpbXBsZURlY29kaW5nU291cmNlOjpDcmVhdGUobWVkaWFTb3VyY2UpOwogICAgICAgICAgICAgZHVtcFNvdXJjZShkZWNTb3VyY2UsIGR1bXBTdHJlYW1GaWxlbmFtZSk7CiAgICAgICAgIH0gZWxzZSBpZiAoc2Vla1Rlc3QpIHsKICAgICAgICAgICAgIHBlcmZvcm1TZWVrVGVzdChtZWRpYVNvdXJjZSk7CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L3N0cmVhbS5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L3N0cmVhbS5jcHAKaW5kZXggMmUxZDI0MC4uYjAxOTlkOCAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9zdHJlYW0uY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvc3RyZWFtLmNwcApAQCAtMjEsMTUgKzIxLDE4IEBACiAjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+IC8vIGZvciBwcm9wZXJ0eV9nZXQKIAorI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lTdHJlYW1Tb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZUZhY3RvcnkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01QRUcyVFNXcml0ZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KIAogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KQEAgLTE2MSwxMSArMTY0LDExIEBACiAgICAgOiBtQ3VycmVudEJ1ZmZlckluZGV4KC0xKSwKICAgICAgIG1DdXJyZW50QnVmZmVyT2Zmc2V0KDApIHsKICAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0KLSAgICAgICAgRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSShOVUxMIC8qIGh0dHBTZXJ2aWNlICovLCBmaWxlbmFtZSk7CisgICAgICAgIERhdGFTb3VyY2VGYWN0b3J5OjpDcmVhdGVGcm9tVVJJKE5VTEwgLyogaHR0cFNlcnZpY2UgKi8sIGZpbGVuYW1lKTsKIAogICAgIENIRUNLKGRhdGFTb3VyY2UgIT0gTlVMTCk7CiAKLSAgICBzcDxJTWVkaWFFeHRyYWN0b3I+IGV4dHJhY3RvciA9IE1lZGlhRXh0cmFjdG9yOjpDcmVhdGUoZGF0YVNvdXJjZSk7CisgICAgc3A8SU1lZGlhRXh0cmFjdG9yPiBleHRyYWN0b3IgPSBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OkNyZWF0ZShkYXRhU291cmNlKTsKICAgICBDSEVDSyhleHRyYWN0b3IgIT0gTlVMTCk7CiAKICAgICBtV3JpdGVyID0gbmV3IE1QRUcyVFNXcml0ZXIoCkBAIC0xODIsNyArMTg1LDcgQEAKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKLSAgICAgICAgc3A8SU1lZGlhU291cmNlPiB0cmFjayA9IGV4dHJhY3Rvci0+Z2V0VHJhY2soaSk7CisgICAgICAgIHNwPE1lZGlhU291cmNlPiB0cmFjayA9IENyZWF0ZU1lZGlhU291cmNlRnJvbUlNZWRpYVNvdXJjZShleHRyYWN0b3ItPmdldFRyYWNrKGkpKTsKICAgICAgICAgaWYgKHRyYWNrID09IG51bGxwdHIpIHsKICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic2tpcCBOVUxMIHRyYWNrICV6dSwgdG90YWwgdHJhY2tzICV6dVxuIiwgaSwgbnVtVHJhY2tzKTsKICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtMzM1LDEwICszMzgsMTAgQEAKICAgICBDSEVDSyhjb250cm9sICE9IE5VTEwpOwogICAgIENIRUNLKGNvbnRyb2wtPmlzVmFsaWQoKSk7CiAKLSAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6Om9wZW5HbG9iYWxUcmFuc2FjdGlvbigpOwotICAgIENIRUNLX0VRKGNvbnRyb2wtPnNldExheWVyKElOVF9NQVgpLCAoc3RhdHVzX3QpT0spOwotICAgIENIRUNLX0VRKGNvbnRyb2wtPnNob3coKSwgKHN0YXR1c190KU9LKTsKLSAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmNsb3NlR2xvYmFsVHJhbnNhY3Rpb24oKTsKKyAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OlRyYW5zYWN0aW9ue30KKyAgICAgICAgICAgIC5zZXRMYXllcihjb250cm9sLCBJTlRfTUFYKQorICAgICAgICAgICAgLnNob3coY29udHJvbCkKKyAgICAgICAgICAgIC5hcHBseSgpOwogCiAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZSA9IGNvbnRyb2wtPmdldFN1cmZhY2UoKTsKICAgICBDSEVDSyhzdXJmYWNlICE9IE5VTEwpOwpkaWZmIC0tZ2l0IGEvZHJtL2NvbW1vbi9BbmRyb2lkLmJwIGIvZHJtL2NvbW1vbi9BbmRyb2lkLmJwCmluZGV4IDAwOThjODkuLjE1NTJjM2YgMTAwNjQ0Ci0tLSBhL2RybS9jb21tb24vQW5kcm9pZC5icAorKysgYi9kcm0vY29tbW9uL0FuZHJvaWQuYnAKQEAgLTMzLDYgKzMzLDggQEAKICAgICAgICAgIlJlYWRXcml0ZVV0aWxzLmNwcCIsCiAgICAgXSwKIAorICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIl0sCisKICAgICBzdGF0aWNfbGliczogWyJsaWJiaW5kZXIiXSwKIAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLApkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi91dGlsL0FuZHJvaWQuYnAgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvY29tbW9uL3V0aWwvQW5kcm9pZC5icAppbmRleCAwYzBiNmYyLi43MzcyZWI3IDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvY29tbW9uL3V0aWwvQW5kcm9pZC5icAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvY29tbW9uL3V0aWwvQW5kcm9pZC5icApAQCAtMTksNSArMTksNyBAQAogCiAgICAgc3JjczogWyJzcmMvTWltZVR5cGVVdGlsLmNwcCJdLAogCisgICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiXSwKKwogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAogfQpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL0FuZHJvaWQuYnAgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvQW5kcm9pZC5icAppbmRleCAzZjBmNWY3Li4yOGE3OGFhIDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvQW5kcm9pZC5icAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvQW5kcm9pZC5icApAQCAtMjEsNiArMjEsOSBAQAogICAgICAgICAiLURVU0VfNjRCSVRfRFJNX0FQSSIsCiAgICAgICAgIC8vIFRoZSBmbGFnIGJlbG93IHR1cm5zIG9uIGxvY2FsIGRlYnVnIHByaW50b3V0cwogICAgICAgICAvLyItRERSTV9PTUFfRkxfRU5HSU5FX0RFQlVHIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVduby11bnVzZWQtdmFyaWFibGUiLAogICAgIF0sCiAKICAgICBzcmNzOiBbInNyYy9Gd2RMb2NrRW5naW5lLmNwcCJdLApkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL3NyYy9Gd2RMb2NrRW5naW5lLmNwcCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9zcmMvRndkTG9ja0VuZ2luZS5jcHAKaW5kZXggODMwZGVmOS4uNzNlZWE4OSAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL3NyYy9Gd2RMb2NrRW5naW5lLmNwcAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvc3JjL0Z3ZExvY2tFbmdpbmUuY3BwCkBAIC01MDIsOCArNTAyLDggQEAKICAgICAgICAgaW50IHJldFZhbCA9IEZ3ZExvY2tGaWxlX0NoZWNrSGVhZGVySW50ZWdyaXR5KGZpbGVEZXNjKTsKICAgICAgICAgRGVjb2RlU2Vzc2lvbiogZGVjb2RlU2Vzc2lvbiA9IG5ldyBEZWNvZGVTZXNzaW9uKGZpbGVEZXNjKTsKIAotICAgICAgICBpZiAocmV0VmFsICYmIE5VTEwgIT0gZGVjb2RlU2Vzc2lvbikgewotICAgICAgICAgICAgZGVjb2RlU2Vzc2lvbk1hcC5hZGRWYWx1ZShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQsIGRlY29kZVNlc3Npb24pOworICAgICAgICBpZiAocmV0VmFsICYmIE5VTEwgIT0gZGVjb2RlU2Vzc2lvbiAmJgorICAgICAgICAgICAgZGVjb2RlU2Vzc2lvbk1hcC5hZGRWYWx1ZShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQsIGRlY29kZVNlc3Npb24pKSB7CiAgICAgICAgICAgICBjb25zdCBjaGFyICpwbWltZT0gRndkTG9ja0ZpbGVfR2V0Q29udGVudFR5cGUoZmlsZURlc2MpOwogICAgICAgICAgICAgU3RyaW5nOCBjb250ZW50VHlwZSA9IFN0cmluZzgocG1pbWUgPT0gTlVMTCA/ICIiIDogcG1pbWUpOwogICAgICAgICAgICAgY29udGVudFR5cGUudG9Mb3dlcigpOwpAQCAtNTEzLDcgKzUxMywxMSBAQAogICAgICAgICAgICAgZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm8gPSBOVUxMOwogICAgICAgICAgICAgcmVzdWx0ID0gRFJNX05PX0VSUk9SOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTE9HX1ZFUkJPU0UoIkZ3ZExvY2tFbmdpbmU6Om9uT3BlbkRlY3J5cHRTZXNzaW9uIEludGVncml0eSBDaGVjayBmYWlsZWQgZm9yIHRoZSBmZCIpOworICAgICAgICAgICAgaWYgKHJldFZhbCAmJiBOVUxMICE9IGRlY29kZVNlc3Npb24pIHsKKyAgICAgICAgICAgICAgTE9HX1ZFUkJPU0UoIkZ3ZExvY2tFbmdpbmU6Om9uT3BlbkRlY3J5cHRTZXNzaW9uIEludGVncml0eSBDaGVjayBmYWlsZWQgZm9yIHRoZSBmZCIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgTE9HX1ZFUkJPU0UoIkZ3ZExvY2tFbmdpbmU6Om9uT3BlbkRlY3J5cHRTZXNzaW9uIERlY29kZVNlc3NzaW9uIGluc2VydGlvbiBmYWlsZWQiKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIEZ3ZExvY2tGaWxlX2RldGFjaChmaWxlRGVzYyk7CiAgICAgICAgICAgICBkZWxldGUgZGVjb2RlU2Vzc2lvbjsKICAgICAgICAgfQpAQCAtNjMxLDcgKzYzNSw3IEBACiAgICAgc3NpemVfdCBzaXplID0gLTE7CiAKICAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlICYmCi0gICAgICAgZGVjb2RlU2Vzc2lvbk1hcC5pc0NyZWF0ZWQoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSAmJgorICAgICAgICBkZWNvZGVTZXNzaW9uTWFwLmlzQ3JlYXRlZChkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpICYmCiAgICAgICAgIE5VTEwgIT0gYnVmZmVyICYmCiAgICAgICAgIG51bUJ5dGVzID4gLTEpIHsKICAgICAgICAgRGVjb2RlU2Vzc2lvbiogc2Vzc2lvbiA9IGRlY29kZVNlc3Npb25NYXAuZ2V0VmFsdWUoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKTsKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbW1vbi9BbmRyb2lkLmJwIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29tbW9uL0FuZHJvaWQuYnAKaW5kZXggNjk4ZjI3OC4uM2JlMzI3YSAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29tbW9uL0FuZHJvaWQuYnAKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29tbW9uL0FuZHJvaWQuYnAKQEAgLTE5LDYgKzE5LDggQEAKIAogICAgIHNyY3M6IFsiRndkTG9ja0dsdWUuYyJdLAogCisgICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiXSwKKwogICAgIHNoYXJlZF9saWJzOiBbImxpYmNyeXB0byJdLAogCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb252ZXJ0ZXIvQW5kcm9pZC5icCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbnZlcnRlci9BbmRyb2lkLmJwCmluZGV4IDMzZjJmZTAuLmQ0ZTA0YjggMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbnZlcnRlci9BbmRyb2lkLmJwCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbnZlcnRlci9BbmRyb2lkLmJwCkBAIC0xOSw2ICsxOSw4IEBACiAKICAgICBzcmNzOiBbIkZ3ZExvY2tDb252LmMiXSwKIAorICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIl0sCisKICAgICBzaGFyZWRfbGliczogWyJsaWJjcnlwdG8iXSwKICAgICBzdGF0aWNfbGliczogWyJsaWJmd2Rsb2NrLWNvbW1vbiJdLAogCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kZWNvZGVyL0FuZHJvaWQuYnAgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kZWNvZGVyL0FuZHJvaWQuYnAKaW5kZXggYjZkN2EwNi4uMGJmMjczNyAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZGVjb2Rlci9BbmRyb2lkLmJwCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RlY29kZXIvQW5kcm9pZC5icApAQCAtMTksNiArMTksOCBAQAogCiAgICAgc3JjczogWyJGd2RMb2NrRmlsZS5jIl0sCiAKKyAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAorCiAgICAgc2hhcmVkX2xpYnM6IFsibGliY3J5cHRvIl0sCiAgICAgc3RhdGljX2xpYnM6IFsibGliZndkbG9jay1jb21tb24iXSwKIApkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL3Bhc3N0aHJ1L0FuZHJvaWQuYnAgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvQW5kcm9pZC5icAppbmRleCAxZGNmODljLi4wNWI2NDQwIDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvQW5kcm9pZC5icAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvQW5kcm9pZC5icApAQCAtMzIsNSArMzIsNyBAQAogICAgIGNmbGFnczogWwogICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBmbGFnIHRvIGVuYWJsZSB0aGUgZGVjcnlwdGlvbiBwYXNzdGhydSBmbG93CiAgICAgICAgIC8vIi1ERU5BQkxFX1BBU1NUSFJVX0RFQ1JZUFRJT04iLAorICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCiAgICAgXSwKIH0KZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9BbmRyb2lkLmJwIGIvZHJtL2xpYm1lZGlhZHJtL0FuZHJvaWQuYnAKaW5kZXggZjkwNjU2NC4uNDk5MWU1MCAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL0FuZHJvaWQuYnAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL0FuZHJvaWQuYnAKQEAgLTIsMTAgKzIsMTEgQEAKIC8vIGxpYm1lZGlhZHJtCiAvLwogCi1jY19saWJyYXJ5X3NoYXJlZCB7CisvLyBUT0RPOiBjaGFuZ2UgaXQgYmFjayB0byBjY19saWJyYXJ5X3NoYXJlZCB3aGVuIE1lZGlhUGxheWVyMiBzd2l0Y2hlcyB0bworLy8gdXNpbmcgTmRrTWVkaWFEcm0sIGluc3RlYWQgb2YgTWVkaWFEcm0uamF2YS4KK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJtZWRpYWRybSIsCiAKLQogICAgIHNyY3M6IFsKICAgICAgICAgIkRybVBsdWdpblBhdGguY3BwIiwKICAgICAgICAgIkRybVNlc3Npb25NYW5hZ2VyLmNwcCIsCkBAIC0xMywyOSArMTQsMjYgQEAKICAgICAgICAgIklEcm0uY3BwIiwKICAgICAgICAgIklEcm1DbGllbnQuY3BwIiwKICAgICAgICAgIklNZWRpYURybVNlcnZpY2UuY3BwIiwKLSAgICAgICAgIlBsdWdpbk1ldHJpY3NSZXBvcnRpbmcuY3BwIiwKICAgICAgICAgIlNoYXJlZExpYnJhcnkuY3BwIiwKICAgICAgICAgIkRybUhhbC5jcHAiLAogICAgICAgICAiQ3J5cHRvSGFsLmNwcCIsCi0gICAgICAgICJwcm90b3MvcGx1Z2luX21ldHJpY3MucHJvdG8iLAogICAgIF0sCiAKLSAgICBwcm90bzogewotICAgICAgICB0eXBlOiAibGl0ZSIsCi0gICAgfSwKLQogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYmRsIiwKICAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYWRybW1ldHJpY3NfbGl0ZSIsCiAgICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAogICAgICAgICAibGlibWVkaWF1dGlscyIsCisgICAgICAgICJsaWJwcm90b2J1Zi1jcHAtbGl0ZSIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEiLAorICAgICAgICAibGliaGlkbGFsbG9jYXRvcnV0aWxzIiwKICAgICAgICAgImxpYmhpZGxiYXNlIiwKLSAgICAgICAgImxpYmhpZGxtZW1vcnkiLAogICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCiAgICAgXSwKIApAQCAtNDQsMyArNDIsNzAgQEAKICAgICAgICAgIi1XYWxsIiwKICAgICBdLAogfQorCisvLyBUaGlzIGlzIHRoZSB2ZXJzaW9uIG9mIHRoZSBkcm0gbWV0cmljcyBjb25maWd1cmVkIGZvciBwcm90b2J1ZiBsaXRlLgorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJtZWRpYWRybW1ldHJpY3NfbGl0ZSIsCisgICAgc3JjczogWworICAgICAgICAiRHJtTWV0cmljcy5jcHAiLAorICAgICAgICAiUGx1Z2luTWV0cmljc1JlcG9ydGluZy5jcHAiLAorICAgICAgICAicHJvdG9zL21ldHJpY3MucHJvdG8iLAorICAgIF0sCisKKyAgICBwcm90bzogeworICAgICAgICBleHBvcnRfcHJvdG9faGVhZGVyczogdHJ1ZSwKKyAgICAgICAgdHlwZTogImxpdGUiLAorICAgIH0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEiLAorICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCisgICAgICAgICJsaWJwcm90b2J1Zi1jcHAtbGl0ZSIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAvLyBTdXBwcmVzcyB1bnVzZWQgcGFyYW1ldGVyIGFuZCBubyBlcnJvciBvcHRpb25zLiBUaGVzZSBjYXVzZSBwcm9ibGVtcworICAgICAgICAvLyB3aXRoIHRoZSB3aGVuIHVzaW5nIHRoZSBtYXAgdHlwZSBpbiBhIHByb3RvIGRlZmluaXRpb24uCisgICAgICAgICItV25vLXVudXNlZC1wYXJhbWV0ZXIiLAorICAgICAgICAiLVduby1lcnJvciIsCisgICAgXSwKK30KKworLy8gVGhpcyBpcyB0aGUgdmVyc2lvbiBvZiB0aGUgZHJtIG1ldHJpY3MgbGlicmFyeSBjb25maWd1cmVkIGZvciBmdWxsIHByb3RvYnVmLgorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJtZWRpYWRybW1ldHJpY3NfZnVsbCIsCisgICAgc3JjczogWworICAgICAgICAiRHJtTWV0cmljcy5jcHAiLAorICAgICAgICAiUGx1Z2luTWV0cmljc1JlcG9ydGluZy5jcHAiLAorICAgICAgICAicHJvdG9zL21ldHJpY3MucHJvdG8iLAorICAgIF0sCisKKyAgICBwcm90bzogeworICAgICAgICBleHBvcnRfcHJvdG9faGVhZGVyczogdHJ1ZSwKKyAgICAgICAgdHlwZTogImZ1bGwiLAorICAgIH0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEiLAorICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCisgICAgICAgICJsaWJwcm90b2J1Zi1jcHAtZnVsbCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAvLyBTdXBwcmVzcyB1bnVzZWQgcGFyYW1ldGVyIGFuZCBubyBlcnJvciBvcHRpb25zLiBUaGVzZSBjYXVzZSBwcm9ibGVtcworICAgICAgICAvLyB3aGVuIHVzaW5nIHRoZSBtYXAgdHlwZSBpbiBhIHByb3RvIGRlZmluaXRpb24uCisgICAgICAgICItV25vLXVudXNlZC1wYXJhbWV0ZXIiLAorICAgICAgICAiLVduby1lcnJvciIsCisgICAgXSwKK30KKwpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0NyeXB0b0hhbC5jcHAgYi9kcm0vbGlibWVkaWFkcm0vQ3J5cHRvSGFsLmNwcAppbmRleCA1ZGQyNTYzLi4zMDM1YzVhIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vQ3J5cHRvSGFsLmNwcAorKysgYi9kcm0vbGlibWVkaWFkcm0vQ3J5cHRvSGFsLmNwcApAQCAtMjIsMTMgKzIyLDE0IEBACiAjaW5jbHVkZSA8YW5kcm9pZC9oaWRsL21hbmFnZXIvMS4wL0lTZXJ2aWNlTWFuYWdlci5oPgogCiAjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KLSNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgotI2luY2x1ZGUgPG1lZGlhL0NyeXB0b0hhbC5oPgorI2luY2x1ZGUgPGhpZGxtZW1vcnkvRnJhbWV3b3JrVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9DcnlwdG9BUEkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vQ3J5cHRvSGFsLmg+CisKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpCdWZmZXJUeXBlOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpEZXN0aW5hdGlvbkJ1ZmZlcjsKQEAgLTExNywxNSArMTE4LDI0IEBACiAKICAgICBhdXRvIG1hbmFnZXIgPSA6OklTZXJ2aWNlTWFuYWdlcjo6Z2V0U2VydmljZSgpOwogICAgIGlmIChtYW5hZ2VyICE9IE5VTEwpIHsKLSAgICAgICAgbWFuYWdlci0+bGlzdEJ5SW50ZXJmYWNlKElDcnlwdG9GYWN0b3J5OjpkZXNjcmlwdG9yLAorICAgICAgICBtYW5hZ2VyLT5saXN0QnlJbnRlcmZhY2UoZHJtOjpWMV8wOjpJQ3J5cHRvRmFjdG9yeTo6ZGVzY3JpcHRvciwKICAgICAgICAgICAgICAgICBbJmZhY3Rvcmllc10oY29uc3QgaGlkbF92ZWM8aGlkbF9zdHJpbmc+ICZyZWdpc3RlcmVkKSB7CiAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmaW5zdGFuY2UgOiByZWdpc3RlcmVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGZhY3RvcnkgPSBJQ3J5cHRvRmFjdG9yeTo6Z2V0U2VydmljZShpbnN0YW5jZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGZhY3RvcnkgPSBkcm06OlYxXzA6OklDcnlwdG9GYWN0b3J5OjpnZXRTZXJ2aWNlKGluc3RhbmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiZm91bmQgZHJtQDEuMCBJQ3J5cHRvRmFjdG9yeSAlcyIsIGluc3RhbmNlLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcmllcy5wdXNoX2JhY2soZmFjdG9yeSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0koIm1ha2VDcnlwdG9GYWN0b3JpZXM6IGZhY3RvcnkgaW5zdGFuY2UgJXMgaXMgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnktPmlzUmVtb3RlKCkgPyAiUmVtb3RlIiA6ICJOb3QgUmVtb3RlIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICApOworICAgICAgICBtYW5hZ2VyLT5saXN0QnlJbnRlcmZhY2UoZHJtOjpWMV8xOjpJQ3J5cHRvRmFjdG9yeTo6ZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICBbJmZhY3Rvcmllc10oY29uc3QgaGlkbF92ZWM8aGlkbF9zdHJpbmc+ICZyZWdpc3RlcmVkKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmaW5zdGFuY2UgOiByZWdpc3RlcmVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGZhY3RvcnkgPSBkcm06OlYxXzE6OklDcnlwdG9GYWN0b3J5OjpnZXRTZXJ2aWNlKGluc3RhbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiZm91bmQgZHJtQDEuMSBJQ3J5cHRvRmFjdG9yeSAlcyIsIGluc3RhbmNlLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcmllcy5wdXNoX2JhY2soZmFjdG9yeSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC0xMzYsNyArMTQ2LDcgQEAKICAgICAgICAgLy8gbXVzdCBiZSBpbiBwYXNzdGhyb3VnaCBtb2RlLCBsb2FkIHRoZSBkZWZhdWx0IHBhc3N0aHJvdWdoIHNlcnZpY2UKICAgICAgICAgYXV0byBwYXNzdGhyb3VnaCA9IElDcnlwdG9GYWN0b3J5OjpnZXRTZXJ2aWNlKCk7CiAgICAgICAgIGlmIChwYXNzdGhyb3VnaCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HSSgibWFrZUNyeXB0b0ZhY3RvcmllczogdXNpbmcgZGVmYXVsdCBjcnlwdG8gaW5zdGFuY2UiKTsKKyAgICAgICAgICAgIEFMT0dJKCJtYWtlQ3J5cHRvRmFjdG9yaWVzOiB1c2luZyBkZWZhdWx0IHBhc3N0aHJvdWdoIGNyeXB0byBpbnN0YW5jZSIpOwogICAgICAgICAgICAgZmFjdG9yaWVzLnB1c2hfYmFjayhwYXNzdGhyb3VnaCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGZpbmQgYW55IGNyeXB0byBmYWN0b3JpZXMiKTsKQEAgLTIxMywxMCArMjIzLDE0IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgcmV0dXJuIG1QbHVnaW4tPnJlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudChoaWRsX3N0cmluZyhtaW1lKSk7CisgICAgUmV0dXJuPGJvb2w+IGhSZXN1bHQgPSBtUGx1Z2luLT5yZXF1aXJlc1NlY3VyZURlY29kZXJDb21wb25lbnQoaGlkbF9zdHJpbmcobWltZSkpOworICAgIGlmICghaFJlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gaFJlc3VsdDsKIH0KIAogCkBAIC0yMjcsMjYgKzI0MSwyMCBAQAogICogYXJlIHNlbnQgYnkgcHJvdmlkaW5nIGFuIG9mZnNldCBpbnRvIHRoZSBoZWFwIGFuZCBhIGJ1ZmZlciBzaXplLgogICovCiBpbnQzMl90IENyeXB0b0hhbDo6c2V0SGVhcEJhc2UoY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwKSB7CisgICAgdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZnJvbUhlYXA7CisgICAgdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6SGlkbE1lbW9yeTsKKwogICAgIGlmIChoZWFwID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoInNldEhlYXBCYXNlKCk6IGhlYXAgaXMgTlVMTCIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIG5hdGl2ZV9oYW5kbGVfdCogbmF0aXZlSGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7Ci0gICAgaWYgKCFuYXRpdmVIYW5kbGUpIHsKLSAgICAgICAgQUxPR0UoInNldEhlYXBCYXNlKCksIGZhaWxlZCB0byBjcmVhdGUgbmF0aXZlIGhhbmRsZSIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIGludDMyX3Qgc2VxTnVtID0gbUhlYXBTZXFOdW0rKzsKLQotICAgIGludCBmZCA9IGhlYXAtPmdldEhlYXBJRCgpOwotICAgIG5hdGl2ZUhhbmRsZS0+ZGF0YVswXSA9IGZkOwotICAgIGF1dG8gaGlkbEhhbmRsZSA9IGhpZGxfaGFuZGxlKG5hdGl2ZUhhbmRsZSk7Ci0gICAgYXV0byBoaWRsTWVtb3J5ID0gaGlkbF9tZW1vcnkoImFzaG1lbSIsIGhpZGxIYW5kbGUsIGhlYXAtPmdldFNpemUoKSk7CisgICAgc3A8SGlkbE1lbW9yeT4gaGlkbE1lbW9yeSA9IGZyb21IZWFwKGhlYXApOwogICAgIG1IZWFwQmFzZXMuYWRkKHNlcU51bSwgSGVhcEJhc2UobU5leHRCdWZmZXJJZCwgaGVhcC0+Z2V0U2l6ZSgpKSk7Ci0gICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luLT5zZXRTaGFyZWRCdWZmZXJCYXNlKGhpZGxNZW1vcnksIG1OZXh0QnVmZmVySWQrKyk7CisgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luLT5zZXRTaGFyZWRCdWZmZXJCYXNlKCpoaWRsTWVtb3J5LCBtTmV4dEJ1ZmZlcklkKyspOwogICAgIEFMT0dFX0lGKCFoUmVzdWx0LmlzT2soKSwgInNldFNoYXJlZEJ1ZmZlckJhc2UoKTogcmVtb3RlIGNhbGwgZmFpbGVkIik7CiAgICAgcmV0dXJuIHNlcU51bTsKIH0KQEAgLTI1NCw3ICsyNjIsMjIgQEAKIHZvaWQgQ3J5cHRvSGFsOjpjbGVhckhlYXBCYXNlKGludDMyX3Qgc2VxTnVtKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAotICAgIG1IZWFwQmFzZXMucmVtb3ZlSXRlbShzZXFOdW0pOworICAgIC8qCisgICAgICogQ2xlYXIgdGhlIHJlbW90ZSBzaGFyZWQgbWVtb3J5IG1hcHBpbmcgYnkgc2V0dGluZyB0aGUgc2hhcmVkCisgICAgICogYnVmZmVyIGJhc2UgdG8gYSBudWxsIGhpZGxfbWVtb3J5LgorICAgICAqCisgICAgICogVE9ETzogQWRkIGEgcmVsZWFzZVNoYXJlZEJ1ZmZlciBtZXRob2QgaW4gYSBmdXR1cmUgRFJNIEhBTAorICAgICAqIEFQSSB2ZXJzaW9uIHRvIG1ha2UgdGhpcyBleHBsaWNpdC4KKyAgICAgKi8KKyAgICBzc2l6ZV90IGluZGV4ID0gbUhlYXBCYXNlcy5pbmRleE9mS2V5KHNlcU51bSk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgaWYgKG1QbHVnaW4gIT0gTlVMTCkgeworICAgICAgICAgICAgdWludDMyX3QgYnVmZmVySWQgPSBtSGVhcEJhc2VzW2luZGV4XS5nZXRCdWZmZXJJZCgpOworICAgICAgICAgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luLT5zZXRTaGFyZWRCdWZmZXJCYXNlKGhpZGxfbWVtb3J5KCksIGJ1ZmZlcklkKTsKKyAgICAgICAgICAgIEFMT0dFX0lGKCFoUmVzdWx0LmlzT2soKSwgInNldFNoYXJlZEJ1ZmZlckJhc2UoKTogcmVtb3RlIGNhbGwgZmFpbGVkIik7CisgICAgICAgIH0KKyAgICAgICAgbUhlYXBCYXNlcy5yZW1vdmVJdGVtKHNlcU51bSk7CisgICAgfQogfQogCiBzdGF0dXNfdCBDcnlwdG9IYWw6OnRvU2hhcmVkQnVmZmVyKGNvbnN0IHNwPElNZW1vcnk+JiBtZW1vcnksIGludDMyX3Qgc2VxTnVtLCA6OlNoYXJlZEJ1ZmZlciogYnVmZmVyKSB7CmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vRHJtSGFsLmNwcCBiL2RybS9saWJtZWRpYWRybS9Ecm1IYWwuY3BwCmluZGV4IGJjMzc1NTcuLmNmMDg2MTAgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9Ecm1IYWwuY3BwCisrKyBiL2RybS9saWJtZWRpYWRybS9Ecm1IYWwuY3BwCkBAIC0xNiw0OCArMTYsODEgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJEcm1IYWwiCisjaW5jbHVkZSA8aW9tYW5pcD4KKwogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL0lEcm1GYWN0b3J5Lmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL0lEcm1QbHVnaW4uaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvdHlwZXMuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWFuYWdlci8xLjAvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8aGlkbC9TZXJ2aWNlTWFuYWdlbWVudC5oPgogCi0jaW5jbHVkZSA8bWVkaWEvRHJtSGFsLmg+Ci0jaW5jbHVkZSA8bWVkaWEvRHJtU2Vzc2lvbkNsaWVudEludGVyZmFjZS5oPgotI2luY2x1ZGUgPG1lZGlhL0RybVNlc3Npb25NYW5hZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvRXZlbnRNZXRyaWMuaD4KICNpbmNsdWRlIDxtZWRpYS9QbHVnaW5NZXRyaWNzUmVwb3J0aW5nLmg+CiAjaW5jbHVkZSA8bWVkaWEvZHJtL0RybUFQSS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0RybUhhbC5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0RybVNlc3Npb25DbGllbnRJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9Ecm1TZXNzaW9uTWFuYWdlci5oPgogCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OkV2ZW50VHlwZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6SURybUZhY3Rvcnk7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OklEcm1QbHVnaW47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OktleWVkVmVjdG9yOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpLZXlSZXF1ZXN0VHlwZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6S2V5U3RhdHVzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpLZXlTdGF0dXNUeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpLZXlUeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpLZXlWYWx1ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U2VjdXJlU3RvcDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U3RhdHVzOwordXNpbmcgZHJtOjpWMV8wOjpLZXllZFZlY3RvcjsKK3VzaW5nIGRybTo6VjFfMDo6S2V5U3RhdHVzVHlwZTsKK3VzaW5nIGRybTo6VjFfMDo6S2V5VHlwZTsKK3VzaW5nIGRybTo6VjFfMDo6S2V5VmFsdWU7Cit1c2luZyBkcm06OlYxXzE6OkhkY3BMZXZlbDs7Cit1c2luZyBkcm06OlYxXzA6OlNlY3VyZVN0b3A7Cit1c2luZyBkcm06OlYxXzE6OlNlY3VyZVN0b3BSZWxlYXNlOwordXNpbmcgZHJtOjpWMV8wOjpTZWN1cmVTdG9wSWQ7Cit1c2luZyBkcm06OlYxXzE6OlNlY3VyaXR5TGV2ZWw7Cit1c2luZyBkcm06OlYxXzA6OlN0YXR1czsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6RHJtTWV0cmljR3JvdXA7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7CiB1c2luZyA6OmFuZHJvaWQ6OmhpZGw6Om1hbmFnZXI6OlYxXzA6OklTZXJ2aWNlTWFuYWdlcjsKK3VzaW5nIDo6YW5kcm9pZDo6b3M6OlBlcnNpc3RhYmxlQnVuZGxlOwogdXNpbmcgOjphbmRyb2lkOjpzcDsKIAorbmFtZXNwYWNlIHsKKworLy8gVGhpcyBjb25zdGFudCBjb3JyZXNwb25kcyB0byB0aGUgUFJPUEVSVFlfREVWSUNFX1VOSVFVRV9JRCBjb25zdGFudAorLy8gaW4gdGhlIE1lZGlhRHJtIEFQSS4KK2NvbnN0ZXhwciBjaGFyIGtQcm9wZXJ0eURldmljZVVuaXF1ZUlkW10gPSAiZGV2aWNlVW5pcXVlSWQiOworY29uc3RleHByIGNoYXIga0VxdWFsc1NpZ25bXSA9ICI9IjsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6c3RyaW5nIHRvQmFzZTY0U3RyaW5nTm9QYWQoY29uc3QgVCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICAvLyBOb3RlIHRoYXQgdGhlIGJhc2UgNjQgY29udmVyc2lvbiBvbmx5IHdvcmtzIHdpdGggYXJyYXlzIG9mIHNpbmdsZS1ieXRlCisgICAgLy8gdmFsdWVzLiBJZiB0aGUgc291cmNlIGlzIGVtcHR5IG9yIGlzIG5vdCBhbiBhcnJheSBvZiBzaW5nbGUtYnl0ZSB2YWx1ZXMsCisgICAgLy8gcmV0dXJuIGVtcHR5IHN0cmluZy4KKyAgICBpZiAoc2l6ZSA9PSAwIHx8IHNpemVvZihkYXRhWzBdKSAhPSAxKSB7CisgICAgICByZXR1cm4gIiI7CisgICAgfQorCisgICAgYW5kcm9pZDo6QVN0cmluZyBvdXRwdXRTdHJpbmc7CisgICAgZW5jb2RlQmFzZTY0KGRhdGEsIHNpemUsICZvdXRwdXRTdHJpbmcpOworICAgIC8vIFJlbW92ZSB0cmFpbGluZyBlcXVhbHMgcGFkZGluZyBpZiBpdCBleGlzdHMuCisgICAgd2hpbGUgKG91dHB1dFN0cmluZy5zaXplKCkgPiAwICYmIG91dHB1dFN0cmluZy5lbmRzV2l0aChrRXF1YWxzU2lnbikpIHsKKyAgICAgICAgb3V0cHV0U3RyaW5nLmVyYXNlKG91dHB1dFN0cmluZy5zaXplKCkgLSAxLCAxKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcob3V0cHV0U3RyaW5nLmNfc3RyKCksIG91dHB1dFN0cmluZy5zaXplKCkpOworfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorI2RlZmluZSBJTklUX0NIRUNLKCkge2lmIChtSW5pdENoZWNrICE9IE9LKSByZXR1cm4gbUluaXRDaGVjazt9CisKIHN0YXRpYyBpbmxpbmUgaW50IGdldENhbGxpbmdQaWQoKSB7CiAgICAgcmV0dXJuIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKIH0KQEAgLTg5LDYgKzEyMiw0MiBAQAogICAgIHJldHVybiBoaWRsX3N0cmluZyhzdHJpbmcuc3RyaW5nKCkpOwogfQogCitzdGF0aWMgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIHRvU2VjdXJpdHlMZXZlbChTZWN1cml0eUxldmVsIGxldmVsKSB7CisgICAgc3dpdGNoKGxldmVsKSB7CisgICAgY2FzZSBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfQ1JZUFRPOgorICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbFN3U2VjdXJlQ3J5cHRvOworICAgIGNhc2UgU2VjdXJpdHlMZXZlbDo6U1dfU0VDVVJFX0RFQ09ERToKKyAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxTd1NlY3VyZURlY29kZTsKKyAgICBjYXNlIFNlY3VyaXR5TGV2ZWw6OkhXX1NFQ1VSRV9DUllQVE86CisgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsSHdTZWN1cmVDcnlwdG87CisgICAgY2FzZSBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfREVDT0RFOgorICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbEh3U2VjdXJlRGVjb2RlOworICAgIGNhc2UgU2VjdXJpdHlMZXZlbDo6SFdfU0VDVVJFX0FMTDoKKyAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZUFsbDsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbFVua25vd247CisgICAgfQorfQorCitzdGF0aWMgRHJtUGx1Z2luOjpIZGNwTGV2ZWwgdG9IZGNwTGV2ZWwoSGRjcExldmVsIGxldmVsKSB7CisgICAgc3dpdGNoKGxldmVsKSB7CisgICAgY2FzZSBIZGNwTGV2ZWw6OkhEQ1BfTk9ORToKKyAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BOb25lOworICAgIGNhc2UgSGRjcExldmVsOjpIRENQX1YxOgorICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcFYxOworICAgIGNhc2UgSGRjcExldmVsOjpIRENQX1YyOgorICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcFYyOworICAgIGNhc2UgSGRjcExldmVsOjpIRENQX1YyXzE6CisgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtIZGNwVjJfMTsKKyAgICBjYXNlIEhkY3BMZXZlbDo6SERDUF9WMl8yOgorICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcFYyXzI7CisgICAgY2FzZSBIZGNwTGV2ZWw6OkhEQ1BfTk9fT1VUUFVUOgorICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcE5vT3V0cHV0OworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtIZGNwTGV2ZWxVbmtub3duOworICAgIH0KK30KKwogCiBzdGF0aWMgOjpLZXllZFZlY3RvciB0b0hpZGxLZXllZFZlY3Rvcihjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiYKICAgICAgICAga2V5ZWRWZWN0b3IpIHsKQEAgLTEyMSw2ICsxOTAsMTUgQEAKICAgICByZXR1cm4gc2VjdXJlU3RvcHM7CiB9CiAKK3N0YXRpYyBMaXN0PFZlY3Rvcjx1aW50OF90Pj4gdG9TZWN1cmVTdG9wSWRzKGNvbnN0IGhpZGxfdmVjPFNlY3VyZVN0b3BJZD4mCisgICAgICAgIGhTZWN1cmVTdG9wSWRzKSB7CisgICAgTGlzdDxWZWN0b3I8dWludDhfdD4+IHNlY3VyZVN0b3BJZHM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoU2VjdXJlU3RvcElkcy5zaXplKCk7IGkrKykgeworICAgICAgICBzZWN1cmVTdG9wSWRzLnB1c2hfYmFjayh0b1ZlY3RvcihoU2VjdXJlU3RvcElkc1tpXSkpOworICAgIH0KKyAgICByZXR1cm4gc2VjdXJlU3RvcElkczsKK30KKwogc3RhdGljIHN0YXR1c190IHRvU3RhdHVzVChTdGF0dXMgc3RhdHVzKSB7CiAgICAgc3dpdGNoIChzdGF0dXMpIHsKICAgICBjYXNlIFN0YXR1czo6T0s6CkBAIC0xOTYsMzUgKzI3NCw2MyBAQAogfQogCiB2b2lkIERybUhhbDo6Y2xvc2VPcGVuU2Vzc2lvbnMoKSB7Ci0gICAgaWYgKG1QbHVnaW4gIT0gTlVMTCkgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PcGVuU2Vzc2lvbnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIG1QbHVnaW4tPmNsb3NlU2Vzc2lvbih0b0hpZGxWZWMobU9wZW5TZXNzaW9uc1tpXSkpOwotICAgICAgICAgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnJlbW92ZVNlc3Npb24obU9wZW5TZXNzaW9uc1tpXSk7Ci0gICAgICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIGF1dG8gb3BlblNlc3Npb25zID0gbU9wZW5TZXNzaW9uczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG9wZW5TZXNzaW9ucy5zaXplKCk7IGkrKykgeworICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgY2xvc2VTZXNzaW9uKG9wZW5TZXNzaW9uc1tpXSk7CisgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICB9CiAgICAgbU9wZW5TZXNzaW9ucy5jbGVhcigpOwogfQogCiBEcm1IYWw6On5Ecm1IYWwoKSB7Ci0gICAgY2xvc2VPcGVuU2Vzc2lvbnMoKTsKICAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+cmVtb3ZlRHJtKG1Ecm1TZXNzaW9uQ2xpZW50KTsKIH0KIAordm9pZCBEcm1IYWw6OmNsZWFudXAoKSB7CisgICAgY2xvc2VPcGVuU2Vzc2lvbnMoKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgcmVwb3J0UGx1Z2luTWV0cmljcygpOworICAgIHJlcG9ydEZyYW1ld29ya01ldHJpY3MoKTsKKworICAgIHNldExpc3RlbmVyKE5VTEwpOworICAgIG1Jbml0Q2hlY2sgPSBOT19JTklUOworCisgICAgaWYgKG1QbHVnaW4gIT0gTlVMTCkgeworICAgICAgICBpZiAoIW1QbHVnaW4tPnNldExpc3RlbmVyKE5VTEwpLmlzT2soKSkgeworICAgICAgICAgICAgbUluaXRDaGVjayA9IERFQURfT0JKRUNUOworICAgICAgICB9CisgICAgfQorICAgIG1QbHVnaW4uY2xlYXIoKTsKKyAgICBtUGx1Z2luVjFfMS5jbGVhcigpOworfQorCiBWZWN0b3I8c3A8SURybUZhY3Rvcnk+PiBEcm1IYWw6Om1ha2VEcm1GYWN0b3JpZXMoKSB7CiAgICAgVmVjdG9yPHNwPElEcm1GYWN0b3J5Pj4gZmFjdG9yaWVzOwogCiAgICAgYXV0byBtYW5hZ2VyID0gaGFyZHdhcmU6OmRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwogCiAgICAgaWYgKG1hbmFnZXIgIT0gTlVMTCkgewotICAgICAgICBtYW5hZ2VyLT5saXN0QnlJbnRlcmZhY2UoSURybUZhY3Rvcnk6OmRlc2NyaXB0b3IsCisgICAgICAgIG1hbmFnZXItPmxpc3RCeUludGVyZmFjZShkcm06OlYxXzA6OklEcm1GYWN0b3J5OjpkZXNjcmlwdG9yLAogICAgICAgICAgICAgICAgIFsmZmFjdG9yaWVzXShjb25zdCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gJnJlZ2lzdGVyZWQpIHsKICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZpbnN0YW5jZSA6IHJlZ2lzdGVyZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gZmFjdG9yeSA9IElEcm1GYWN0b3J5OjpnZXRTZXJ2aWNlKGluc3RhbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gZmFjdG9yeSA9IGRybTo6VjFfMDo6SURybUZhY3Rvcnk6OmdldFNlcnZpY2UoaW5zdGFuY2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJmb3VuZCBkcm1AMS4wIElEcm1GYWN0b3J5ICVzIiwgaW5zdGFuY2UuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yaWVzLnB1c2hfYmFjayhmYWN0b3J5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HSSgibWFrZURybUZhY3RvcmllczogZmFjdG9yeSBpbnN0YW5jZSAlcyBpcyAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeS0+aXNSZW1vdGUoKSA/ICJSZW1vdGUiIDogIk5vdCBSZW1vdGUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICk7CisgICAgICAgIG1hbmFnZXItPmxpc3RCeUludGVyZmFjZShkcm06OlYxXzE6OklEcm1GYWN0b3J5OjpkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgIFsmZmFjdG9yaWVzXShjb25zdCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gJnJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZpbnN0YW5jZSA6IHJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gZmFjdG9yeSA9IGRybTo6VjFfMTo6SURybUZhY3Rvcnk6OmdldFNlcnZpY2UoaW5zdGFuY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJmb3VuZCBkcm1AMS4xIElEcm1GYWN0b3J5ICVzIiwgaW5zdGFuY2UuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yaWVzLnB1c2hfYmFjayhmYWN0b3J5KTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTIzNSw3ICszNDEsNyBAQAogICAgICAgICAvLyBtdXN0IGJlIGluIHBhc3N0aHJvdWdoIG1vZGUsIGxvYWQgdGhlIGRlZmF1bHQgcGFzc3Rocm91Z2ggc2VydmljZQogICAgICAgICBhdXRvIHBhc3N0aHJvdWdoID0gSURybUZhY3Rvcnk6OmdldFNlcnZpY2UoKTsKICAgICAgICAgaWYgKHBhc3N0aHJvdWdoICE9IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dJKCJtYWtlRHJtRmFjdG9yaWVzOiB1c2luZyBkZWZhdWx0IGRybSBpbnN0YW5jZSIpOworICAgICAgICAgICAgQUxPR0koIm1ha2VEcm1GYWN0b3JpZXM6IHVzaW5nIGRlZmF1bHQgcGFzc3Rocm91Z2ggZHJtIGluc3RhbmNlIik7CiAgICAgICAgICAgICBmYWN0b3JpZXMucHVzaF9iYWNrKHBhc3N0aHJvdWdoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZmluZCBhbnkgZHJtIGZhY3RvcmllcyIpOwpAQCAtMjQ2LDYgKzM1Miw4IEBACiAKIHNwPElEcm1QbHVnaW4+IERybUhhbDo6bWFrZURybVBsdWdpbihjb25zdCBzcDxJRHJtRmFjdG9yeT4mIGZhY3RvcnksCiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFN0cmluZzgmIGFwcFBhY2thZ2VOYW1lKSB7CisgICAgbUFwcFBhY2thZ2VOYW1lID0gYXBwUGFja2FnZU5hbWU7CisgICAgbU1ldHJpY3MuU2V0QXBwUGFja2FnZU5hbWUoYXBwUGFja2FnZU5hbWUpOwogCiAgICAgc3A8SURybVBsdWdpbj4gcGx1Z2luOwogICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gZmFjdG9yeS0+Y3JlYXRlUGx1Z2luKHV1aWQsIGFwcFBhY2thZ2VOYW1lLnN0cmluZygpLApAQCAtMjg0LDYgKzM5Miw3IEBACiAKIFJldHVybjx2b2lkPiBEcm1IYWw6OnNlbmRFdmVudChFdmVudFR5cGUgaEV2ZW50VHlwZSwKICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGRhdGEpIHsKKyAgICBtTWV0cmljcy5tRXZlbnRDb3VudGVyLkluY3JlbWVudChoRXZlbnRUeXBlKTsKIAogICAgIG1FdmVudExvY2subG9jaygpOwogICAgIHNwPElEcm1DbGllbnQ+IGxpc3RlbmVyID0gbUxpc3RlbmVyOwpAQCAtMzc0LDEyICs0ODMsMjEgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG9iai53cml0ZUludDMyKHR5cGUpOworICAgICAgICAgICAgbU1ldHJpY3MubUtleVN0YXR1c0NoYW5nZUNvdW50ZXIuSW5jcmVtZW50KGtleVN0YXR1cy50eXBlKTsKICAgICAgICAgfQogICAgICAgICBvYmoud3JpdGVJbnQzMihoYXNOZXdVc2FibGVLZXkpOwogCiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Ob3RpZnlMb2NrKTsKICAgICAgICAgbGlzdGVuZXItPm5vdGlmeShEcm1QbHVnaW46OmtEcm1QbHVnaW5FdmVudEtleXNDaGFuZ2UsIDAsICZvYmopOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFRoZXJlJ3Mgbm8gbGlzdGVuZXIuIEJ1dCB3ZSBzdGlsbCB3YW50IHRvIGNvdW50IHRoZSBrZXkgY2hhbmdlCisgICAgICAgIC8vIGV2ZW50cy4KKyAgICAgICAgc2l6ZV90IG5LZXlzID0ga2V5U3RhdHVzTGlzdC5zaXplKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbktleXM7IGkrKykgeworICAgICAgICAgICAgbU1ldHJpY3MubUtleVN0YXR1c0NoYW5nZUNvdW50ZXIuSW5jcmVtZW50KGtleVN0YXR1c0xpc3RbaV0udHlwZSk7CisgICAgICAgIH0KICAgICB9CisKICAgICByZXR1cm4gVm9pZCgpOwogfQogCkBAIC00MDcsNiArNTI1LDkgQEAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1GYWN0b3JpZXMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgaWYgKG1GYWN0b3JpZXNbaV0tPmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQpKSB7CiAgICAgICAgICAgICBtUGx1Z2luID0gbWFrZURybVBsdWdpbihtRmFjdG9yaWVzW2ldLCB1dWlkLCBhcHBQYWNrYWdlTmFtZSk7CisgICAgICAgICAgICBpZiAobVBsdWdpbiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbVBsdWdpblYxXzEgPSBkcm06OlYxXzE6OklEcm1QbHVnaW46OmNhc3RGcm9tKG1QbHVnaW4pOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC00MjQsNDYgKzU0NSw2NiBAQAogfQogCiBzdGF0dXNfdCBEcm1IYWw6OmRlc3Ryb3lQbHVnaW4oKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKLSAgICB9Ci0KLSAgICBjbG9zZU9wZW5TZXNzaW9ucygpOwotICAgIHJlcG9ydE1ldHJpY3MoKTsKLSAgICBzZXRMaXN0ZW5lcihOVUxMKTsKLSAgICBtSW5pdENoZWNrID0gTk9fSU5JVDsKLQotICAgIGlmIChtUGx1Z2luICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKCFtUGx1Z2luLT5zZXRMaXN0ZW5lcihOVUxMKS5pc09rKCkpIHsKLSAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBERUFEX09CSkVDVDsKLSAgICAgICAgfQotICAgIH0KLSAgICBtUGx1Z2luLmNsZWFyKCk7CisgICAgY2xlYW51cCgpOwogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgRHJtSGFsOjpvcGVuU2Vzc2lvbihWZWN0b3I8dWludDhfdD4gJnNlc3Npb25JZCkgeworc3RhdHVzX3QgRHJtSGFsOjpvcGVuU2Vzc2lvbihEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgbGV2ZWwsCisgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmc2Vzc2lvbklkKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CiAKLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICBTZWN1cml0eUxldmVsIGhTZWN1cml0eUxldmVsOworICAgIGJvb2wgc2V0U2VjdXJpdHlMZXZlbCA9IHRydWU7CisKKyAgICBzd2l0Y2gobGV2ZWwpIHsKKyAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxTd1NlY3VyZUNyeXB0bzoKKyAgICAgICAgaFNlY3VyaXR5TGV2ZWwgPSBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfQ1JZUFRPOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxTd1NlY3VyZURlY29kZToKKyAgICAgICAgaFNlY3VyaXR5TGV2ZWwgPSBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfREVDT0RFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZUNyeXB0bzoKKyAgICAgICAgaFNlY3VyaXR5TGV2ZWwgPSBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfQ1JZUFRPOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZURlY29kZToKKyAgICAgICAgaFNlY3VyaXR5TGV2ZWwgPSBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfREVDT0RFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZUFsbDoKKyAgICAgICAgaFNlY3VyaXR5TGV2ZWwgPSBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfQUxMOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxNYXg6CisgICAgICAgIHNldFNlY3VyaXR5TGV2ZWwgPSBmYWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwogICAgIH0KIAogICAgIHN0YXR1c190ICBlcnIgPSBVTktOT1dOX0VSUk9SOwotCiAgICAgYm9vbCByZXRyeSA9IHRydWU7CiAgICAgZG8gewogICAgICAgICBoaWRsX3ZlYzx1aW50OF90PiBoU2Vzc2lvbklkOwogCi0gICAgICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpbi0+b3BlblNlc3Npb24oCi0gICAgICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBpZCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCA9IHRvVmVjdG9yKGlkKTsKKyAgICAgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQ7CisgICAgICAgIGlmIChtUGx1Z2luVjFfMSA9PSBOVUxMIHx8ICFzZXRTZWN1cml0eUxldmVsKSB7CisgICAgICAgICAgICBoUmVzdWx0ID0gbVBsdWdpbi0+b3BlblNlc3Npb24oCisgICAgICAgICAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBpZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkID0gdG9WZWN0b3IoaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW5WMV8xLT5vcGVuU2Vzc2lvbl8xXzEoaFNlY3VyaXR5TGV2ZWwsCisgICAgICAgICAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCA9IHRvVmVjdG9yKGlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfQogCiAgICAgICAgIGlmICghaFJlc3VsdC5pc09rKCkpIHsKICAgICAgICAgICAgIGVyciA9IERFQURfT0JKRUNUOwpAQCAtNDg1LDE2ICs2MjYsMTYgQEAKICAgICAgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPmFkZFNlc3Npb24oZ2V0Q2FsbGluZ1BpZCgpLAogICAgICAgICAgICAgICAgIG1Ecm1TZXNzaW9uQ2xpZW50LCBzZXNzaW9uSWQpOwogICAgICAgICBtT3BlblNlc3Npb25zLnB1c2goc2Vzc2lvbklkKTsKKyAgICAgICAgbU1ldHJpY3MuU2V0U2Vzc2lvblN0YXJ0KHNlc3Npb25JZCk7CiAgICAgfQorCisgICAgbU1ldHJpY3MubU9wZW5TZXNzaW9uQ291bnRlci5JbmNyZW1lbnQoZXJyKTsKICAgICByZXR1cm4gZXJyOwogfQogCiBzdGF0dXNfdCBEcm1IYWw6OmNsb3NlU2Vzc2lvbihWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKLSAgICB9CisgICAgSU5JVF9DSEVDSygpOwogCiAgICAgUmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gbVBsdWdpbi0+Y2xvc2VTZXNzaW9uKHRvSGlkbFZlYyhzZXNzaW9uSWQpKTsKICAgICBpZiAoc3RhdHVzLmlzT2soKSkgewpAQCAtNTA3LDkgKzY0OCwxMiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICByZXBvcnRNZXRyaWNzKCk7Ci0gICAgICAgIHJldHVybiB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgc3RhdHVzX3QgcmVzcG9uc2UgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgbU1ldHJpY3MuU2V0U2Vzc2lvbkVuZChzZXNzaW9uSWQpOworICAgICAgICBtTWV0cmljcy5tQ2xvc2VTZXNzaW9uQ291bnRlci5JbmNyZW1lbnQocmVzcG9uc2UpOworICAgICAgICByZXR1cm4gcmVzcG9uc2U7CiAgICAgfQorICAgIG1NZXRyaWNzLm1DbG9zZVNlc3Npb25Db3VudGVyLkluY3JlbWVudChERUFEX09CSkVDVCk7CiAgICAgcmV0dXJuIERFQURfT0JKRUNUOwogfQogCkBAIC01MTksMTAgKzY2Myw4IEBACiAgICAgICAgIFN0cmluZzg+IGNvbnN0ICZvcHRpb25hbFBhcmFtZXRlcnMsIFZlY3Rvcjx1aW50OF90PiAmcmVxdWVzdCwKICAgICAgICAgU3RyaW5nOCAmZGVmYXVsdFVybCwgRHJtUGx1Z2luOjpLZXlSZXF1ZXN0VHlwZSAqa2V5UmVxdWVzdFR5cGUpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Ci0gICAgfQorICAgIElOSVRfQ0hFQ0soKTsKKyAgICBFdmVudFRpbWVyPHN0YXR1c190PiBrZXlSZXF1ZXN0VGltZXIoJm1NZXRyaWNzLm1HZXRLZXlSZXF1ZXN0VGltZVVzKTsKIAogICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7CiAKQEAgLTUzNCw2ICs2NzYsNyBAQAogICAgIH0gZWxzZSBpZiAoa2V5VHlwZSA9PSBEcm1QbHVnaW46OmtLZXlUeXBlX1JlbGVhc2UpIHsKICAgICAgICAgaEtleVR5cGUgPSBLZXlUeXBlOjpSRUxFQVNFOwogICAgIH0gZWxzZSB7CisgICAgICAgIGtleVJlcXVlc3RUaW1lci5TZXRBdHRyaWJ1dGUoQkFEX1ZBTFVFKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKQEAgLTU0MSwyMyArNjg0LDYzIEBACiAKICAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOwogCisgICAgaWYgKG1QbHVnaW5WMV8xICE9IE5VTEwpIHsKKyAgICAgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPQorICAgICAgICAgICAgbVBsdWdpblYxXzEtPmdldEtleVJlcXVlc3RfMV8xKAorICAgICAgICAgICAgICAgIHRvSGlkbFZlYyhzZXNzaW9uSWQpLCB0b0hpZGxWZWMoaW5pdERhdGEpLAorICAgICAgICAgICAgICAgIHRvSGlkbFN0cmluZyhtaW1lVHlwZSksIGhLZXlUeXBlLCBoT3B0aW9uYWxQYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaFJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgIGRybTo6VjFfMTo6S2V5UmVxdWVzdFR5cGUgaEtleVJlcXVlc3RUeXBlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgaERlZmF1bHRVcmwpIHsKKworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgcmVxdWVzdCA9IHRvVmVjdG9yKGhSZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0VXJsID0gdG9TdHJpbmc4KGhEZWZhdWx0VXJsKTsKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoaEtleVJlcXVlc3RUeXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgZHJtOjpWMV8xOjpLZXlSZXF1ZXN0VHlwZTo6SU5JVElBTDoKKyAgICAgICAgICAgICAgICAgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX0luaXRpYWw7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBkcm06OlYxXzE6OktleVJlcXVlc3RUeXBlOjpSRU5FV0FMOgorICAgICAgICAgICAgICAgICAgICAgICAgKmtleVJlcXVlc3RUeXBlID0gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfUmVuZXdhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIGRybTo6VjFfMTo6S2V5UmVxdWVzdFR5cGU6OlJFTEVBU0U6CisgICAgICAgICAgICAgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9SZWxlYXNlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgZHJtOjpWMV8xOjpLZXlSZXF1ZXN0VHlwZTo6Tk9ORToKKyAgICAgICAgICAgICAgICAgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX05vbmU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBkcm06OlYxXzE6OktleVJlcXVlc3RUeXBlOjpVUERBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9VcGRhdGU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1Vua25vd247CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKKyAgICB9CisKICAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW4tPmdldEtleVJlcXVlc3QodG9IaWRsVmVjKHNlc3Npb25JZCksCiAgICAgICAgICAgICB0b0hpZGxWZWMoaW5pdERhdGEpLCB0b0hpZGxTdHJpbmcobWltZVR5cGUpLCBoS2V5VHlwZSwgaE9wdGlvbmFsUGFyYW1ldGVycywKICAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaFJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgIEtleVJlcXVlc3RUeXBlIGhLZXlSZXF1ZXN0VHlwZSwgY29uc3QgaGlkbF9zdHJpbmcmIGhEZWZhdWx0VXJsKSB7CisgICAgICAgICAgICAgICAgICAgIGRybTo6VjFfMDo6S2V5UmVxdWVzdFR5cGUgaEtleVJlcXVlc3RUeXBlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgaERlZmF1bHRVcmwpIHsKIAogICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewogICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ID0gdG9WZWN0b3IoaFJlcXVlc3QpOwogICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VXJsID0gdG9TdHJpbmc4KGhEZWZhdWx0VXJsKTsKIAogICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGhLZXlSZXF1ZXN0VHlwZSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIEtleVJlcXVlc3RUeXBlOjpJTklUSUFMOgorICAgICAgICAgICAgICAgICAgICBjYXNlIGRybTo6VjFfMDo6S2V5UmVxdWVzdFR5cGU6OklOSVRJQUw6CiAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9Jbml0aWFsOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5UmVxdWVzdFR5cGU6OlJFTkVXQUw6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgZHJtOjpWMV8wOjpLZXlSZXF1ZXN0VHlwZTo6UkVORVdBTDoKICAgICAgICAgICAgICAgICAgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1JlbmV3YWw7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlSZXF1ZXN0VHlwZTo6UkVMRUFTRToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBkcm06OlYxXzA6OktleVJlcXVlc3RUeXBlOjpSRUxFQVNFOgogICAgICAgICAgICAgICAgICAgICAgICAgKmtleVJlcXVlc3RUeXBlID0gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfUmVsZWFzZTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgpAQCAtNTY4LDE2ICs3NTEsMTcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9KTsKIAotICAgIHJldHVybiBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOworICAgIGVyciA9IGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7CisgICAga2V5UmVxdWVzdFRpbWVyLlNldEF0dHJpYnV0ZShlcnIpOworICAgIHJldHVybiBlcnI7CiB9CiAKIHN0YXR1c190IERybUhhbDo6cHJvdmlkZUtleVJlc3BvbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAogICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJnJlc3BvbnNlLCBWZWN0b3I8dWludDhfdD4gJmtleVNldElkKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBFdmVudFRpbWVyPHN0YXR1c190PiBrZXlSZXNwb25zZVRpbWVyKCZtTWV0cmljcy5tUHJvdmlkZUtleVJlc3BvbnNlVGltZVVzKTsKIAotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBtSW5pdENoZWNrOwotICAgIH0KKyAgICBJTklUX0NIRUNLKCk7CiAKICAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+dXNlU2Vzc2lvbihzZXNzaW9uSWQpOwogCkBAIC01OTIsNDEgKzc3NiwzNSBAQAogICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOwogICAgICAgICAgICAgfQogICAgICAgICApOwotCi0gICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7CisgICAgZXJyID0gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKKyAgICBrZXlSZXNwb25zZVRpbWVyLlNldEF0dHJpYnV0ZShlcnIpOworICAgIHJldHVybiBlcnI7CiB9CiAKIHN0YXR1c190IERybUhhbDo6cmVtb3ZlS2V5cyhWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CiAKLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKLSAgICB9Ci0KLSAgICByZXR1cm4gdG9TdGF0dXNUKG1QbHVnaW4tPnJlbW92ZUtleXModG9IaWRsVmVjKGtleVNldElkKSkpOworICAgIFJldHVybjxTdGF0dXM+IHN0YXR1cyA9IG1QbHVnaW4tPnJlbW92ZUtleXModG9IaWRsVmVjKGtleVNldElkKSk7CisgICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOwogfQogCiBzdGF0dXNfdCBEcm1IYWw6OnJlc3RvcmVLZXlzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAogICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBtSW5pdENoZWNrOwotICAgIH0KKyAgICBJTklUX0NIRUNLKCk7CiAKICAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+dXNlU2Vzc2lvbihzZXNzaW9uSWQpOwogCi0gICAgcmV0dXJuIHRvU3RhdHVzVChtUGx1Z2luLT5yZXN0b3JlS2V5cyh0b0hpZGxWZWMoc2Vzc2lvbklkKSwKLSAgICAgICAgICAgICAgICAgICAgdG9IaWRsVmVjKGtleVNldElkKSkpOworICAgIFJldHVybjxTdGF0dXM+IHN0YXR1cyA9IG1QbHVnaW4tPnJlc3RvcmVLZXlzKHRvSGlkbFZlYyhzZXNzaW9uSWQpLAorICAgICAgICAgICAgdG9IaWRsVmVjKGtleVNldElkKSk7CisgICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOwogfQogCiBzdGF0dXNfdCBEcm1IYWw6OnF1ZXJ5S2V5U3RhdHVzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAogICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAmaW5mb01hcCkgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKLSAgICB9CisgICAgSU5JVF9DSEVDSygpOwogCiAgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKIApAQCAtNjUwLDEwICs4MjgsNyBAQAogICAgICAgICBTdHJpbmc4IGNvbnN0ICZjZXJ0QXV0aG9yaXR5LCBWZWN0b3I8dWludDhfdD4gJnJlcXVlc3QsCiAgICAgICAgIFN0cmluZzggJmRlZmF1bHRVcmwpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Ci0gICAgfQorICAgIElOSVRfQ0hFQ0soKTsKIAogICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CiAKQEAgLTY2OSwxNiArODQ0LDE1IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICk7CiAKLSAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKKyAgICBlcnIgPSBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOworICAgIG1NZXRyaWNzLm1HZXRQcm92aXNpb25SZXF1ZXN0Q291bnRlci5JbmNyZW1lbnQoZXJyKTsKKyAgICByZXR1cm4gZXJyOwogfQogCiBzdGF0dXNfdCBEcm1IYWw6OnByb3ZpZGVQcm92aXNpb25SZXNwb25zZShWZWN0b3I8dWludDhfdD4gY29uc3QgJnJlc3BvbnNlLAogICAgICAgICBWZWN0b3I8dWludDhfdD4gJmNlcnRpZmljYXRlLCBWZWN0b3I8dWludDhfdD4gJndyYXBwZWRLZXkpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Ci0gICAgfQorICAgIElOSVRfQ0hFQ0soKTsKIAogICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CiAKQEAgLTY5MywxNSArODY3LDE0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICk7CiAKLSAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKKyAgICBlcnIgPSBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOworICAgIG1NZXRyaWNzLm1Qcm92aWRlUHJvdmlzaW9uUmVzcG9uc2VDb3VudGVyLkluY3JlbWVudChlcnIpOworICAgIHJldHVybiBlcnI7CiB9CiAKIHN0YXR1c190IERybUhhbDo6Z2V0U2VjdXJlU3RvcHMoTGlzdDxWZWN0b3I8dWludDhfdD4+ICZzZWN1cmVTdG9wcykgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKLSAgICB9CisgICAgSU5JVF9DSEVDSygpOwogCiAgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKIApAQCAtNzE4LDEzICs4OTEsMzYgQEAKIH0KIAogCi1zdGF0dXNfdCBEcm1IYWw6OmdldFNlY3VyZVN0b3AoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzc2lkLCBWZWN0b3I8dWludDhfdD4gJnNlY3VyZVN0b3ApIHsKK3N0YXR1c190IERybUhhbDo6Z2V0U2VjdXJlU3RvcElkcyhMaXN0PFZlY3Rvcjx1aW50OF90Pj4gJnNlY3VyZVN0b3BJZHMpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CiAgICAgfQogCisgICAgaWYgKG1QbHVnaW5WMV8xID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW5WMV8xLT5nZXRTZWN1cmVTdG9wSWRzKAorICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPFNlY3VyZVN0b3BJZD4mIGhTZWN1cmVTdG9wSWRzKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIHNlY3VyZVN0b3BJZHMgPSB0b1NlY3VyZVN0b3BJZHMoaFNlY3VyZVN0b3BJZHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgIH0KKyAgICApOworCisgICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Cit9CisKKworc3RhdHVzX3QgRHJtSGFsOjpnZXRTZWN1cmVTdG9wKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc3NpZCwgVmVjdG9yPHVpbnQ4X3Q+ICZzZWN1cmVTdG9wKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKICAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOwogCiAgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luLT5nZXRTZWN1cmVTdG9wKHRvSGlkbFZlYyhzc2lkKSwKQEAgLTc0MSwyMiArOTM3LDEzMiBAQAogCiBzdGF0dXNfdCBEcm1IYWw6OnJlbGVhc2VTZWN1cmVTdG9wcyhWZWN0b3I8dWludDhfdD4gY29uc3QgJnNzUmVsZWFzZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOwogCi0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgUmV0dXJuPFN0YXR1cz4gc3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX1VOS05PV04pOworICAgIGlmIChtUGx1Z2luVjFfMSAhPSBOVUxMKSB7CisgICAgICAgIFNlY3VyZVN0b3BSZWxlYXNlIHNlY3VyZVN0b3BSZWxlYXNlOworICAgICAgICBzZWN1cmVTdG9wUmVsZWFzZS5vcGFxdWVEYXRhID0gdG9IaWRsVmVjKHNzUmVsZWFzZSk7CisgICAgICAgIHN0YXR1cyA9IG1QbHVnaW5WMV8xLT5yZWxlYXNlU2VjdXJlU3RvcHMoc2VjdXJlU3RvcFJlbGVhc2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXR1cyA9IG1QbHVnaW4tPnJlbGVhc2VTZWN1cmVTdG9wKHRvSGlkbFZlYyhzc1JlbGVhc2UpKTsKICAgICB9Ci0KLSAgICByZXR1cm4gdG9TdGF0dXNUKG1QbHVnaW4tPnJlbGVhc2VTZWN1cmVTdG9wKHRvSGlkbFZlYyhzc1JlbGVhc2UpKSk7CisgICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOwogfQogCi1zdGF0dXNfdCBEcm1IYWw6OnJlbGVhc2VBbGxTZWN1cmVTdG9wcygpIHsKK3N0YXR1c190IERybUhhbDo6cmVtb3ZlU2VjdXJlU3RvcChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNzaWQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CiAgICAgfQogCi0gICAgcmV0dXJuIHRvU3RhdHVzVChtUGx1Z2luLT5yZWxlYXNlQWxsU2VjdXJlU3RvcHMoKSk7CisgICAgaWYgKG1QbHVnaW5WMV8xID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIFJldHVybjxTdGF0dXM+IHN0YXR1cyA9IG1QbHVnaW5WMV8xLT5yZW1vdmVTZWN1cmVTdG9wKHRvSGlkbFZlYyhzc2lkKSk7CisgICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOworfQorCitzdGF0dXNfdCBEcm1IYWw6OnJlbW92ZUFsbFNlY3VyZVN0b3BzKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgUmV0dXJuPFN0YXR1cz4gc3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX1VOS05PV04pOworICAgIGlmIChtUGx1Z2luVjFfMSAhPSBOVUxMKSB7CisgICAgICAgIHN0YXR1cyA9IG1QbHVnaW5WMV8xLT5yZW1vdmVBbGxTZWN1cmVTdG9wcygpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXR1cyA9IG1QbHVnaW4tPnJlbGVhc2VBbGxTZWN1cmVTdG9wcygpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzLmlzT2soKSA/IHRvU3RhdHVzVChzdGF0dXMpIDogREVBRF9PQkpFQ1Q7Cit9CisKK3N0YXR1c190IERybUhhbDo6Z2V0SGRjcExldmVscyhEcm1QbHVnaW46OkhkY3BMZXZlbCAqY29ubmVjdGVkLAorICAgICAgICAgICAgRHJtUGx1Z2luOjpIZGNwTGV2ZWwgKm1heCkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgaWYgKGNvbm5lY3RlZCA9PSBOVUxMIHx8IG1heCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICBpZiAobVBsdWdpblYxXzEgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgKmNvbm5lY3RlZCA9IERybVBsdWdpbjo6a0hkY3BMZXZlbFVua25vd247CisgICAgKm1heCA9IERybVBsdWdpbjo6a0hkY3BMZXZlbFVua25vd247CisKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW5WMV8xLT5nZXRIZGNwTGV2ZWxzKAorICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IEhkY3BMZXZlbCYgaENvbm5lY3RlZCwgY29uc3QgSGRjcExldmVsJiBoTWF4KSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICpjb25uZWN0ZWQgPSB0b0hkY3BMZXZlbChoQ29ubmVjdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgKm1heCA9IHRvSGRjcExldmVsKGhNYXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgIH0KKyAgICApOworCisgICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Cit9CisKK3N0YXR1c190IERybUhhbDo6Z2V0TnVtYmVyT2ZTZXNzaW9ucyh1aW50MzJfdCAqb3BlbiwgdWludDMyX3QgKm1heCkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgaWYgKG9wZW4gPT0gTlVMTCB8fCBtYXggPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworCisgICAgKm9wZW4gPSAwOworICAgICptYXggPSAwOworCisgICAgaWYgKG1QbHVnaW5WMV8xID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpblYxXzEtPmdldE51bWJlck9mU2Vzc2lvbnMoCisgICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgdWludDMyX3QgaE9wZW4sIHVpbnQzMl90IGhNYXgpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKm9wZW4gPSBoT3BlbjsKKyAgICAgICAgICAgICAgICAgICAgKm1heCA9IGhNYXg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgfQorICAgICk7CisKKyAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK30KKworc3RhdHVzX3QgRHJtSGFsOjpnZXRTZWN1cml0eUxldmVsKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAorICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgKmxldmVsKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICBpZiAobGV2ZWwgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworCisgICAgaWYgKG1QbHVnaW5WMV8xID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgICpsZXZlbCA9IERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxVbmtub3duOworCisgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luVjFfMS0+Z2V0U2VjdXJpdHlMZXZlbCh0b0hpZGxWZWMoc2Vzc2lvbklkKSwKKyAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBTZWN1cml0eUxldmVsIGhMZXZlbCkgeworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAqbGV2ZWwgPSB0b1NlY3VyaXR5TGV2ZWwoaExldmVsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICB9CisgICAgKTsKKworICAgIHJldHVybiBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOwogfQogCiBzdGF0dXNfdCBEcm1IYWw6OmdldFByb3BlcnR5U3RyaW5nKFN0cmluZzggY29uc3QgJm5hbWUsIFN0cmluZzggJnZhbHVlICkgY29uc3QgewpAQCAtNzY3LDEwICsxMDczLDcgQEAKIHN0YXR1c190IERybUhhbDo6Z2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4IGNvbnN0ICZuYW1lLCBTdHJpbmc4ICZ2YWx1ZSkgY29uc3QgewogICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgaW50ZXJuYWwgdG8gdGhlIGNsYXNzIGFuZCBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hpbGUKICAgICAvLyBtTG9jayBpcyBhbHJlYWR5IGhlbGQuCi0KLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKLSAgICB9CisgICAgSU5JVF9DSEVDSygpOwogCiAgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKIApAQCAtNzk0LDEwICsxMDk3LDcgQEAKIHN0YXR1c190IERybUhhbDo6Z2V0UHJvcGVydHlCeXRlQXJyYXlJbnRlcm5hbChTdHJpbmc4IGNvbnN0ICZuYW1lLCBWZWN0b3I8dWludDhfdD4gJnZhbHVlICkgY29uc3QgewogICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgaW50ZXJuYWwgdG8gdGhlIGNsYXNzIGFuZCBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hpbGUKICAgICAvLyBtTG9jayBpcyBhbHJlYWR5IGhlbGQuCi0KLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKLSAgICB9CisgICAgSU5JVF9DSEVDSygpOwogCiAgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKIApAQCAtODEwLDczICsxMTEwLDEwNiBAQAogICAgICAgICAgICAgfQogICAgICk7CiAKLSAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKKyAgICBlcnIgPSBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOworICAgIGlmIChuYW1lID09IGtQcm9wZXJ0eURldmljZVVuaXF1ZUlkKSB7CisgICAgICAgIG1NZXRyaWNzLm1HZXREZXZpY2VVbmlxdWVJZENvdW50ZXIuSW5jcmVtZW50KGVycik7CisgICAgfQorICAgIHJldHVybiBlcnI7CiB9CiAKIHN0YXR1c190IERybUhhbDo6c2V0UHJvcGVydHlTdHJpbmcoU3RyaW5nOCBjb25zdCAmbmFtZSwgU3RyaW5nOCBjb25zdCAmdmFsdWUgKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CiAKLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKLSAgICB9Ci0KLSAgICBTdGF0dXMgc3RhdHVzID0gIG1QbHVnaW4tPnNldFByb3BlcnR5U3RyaW5nKHRvSGlkbFN0cmluZyhuYW1lKSwKKyAgICBSZXR1cm48U3RhdHVzPiBzdGF0dXMgPSBtUGx1Z2luLT5zZXRQcm9wZXJ0eVN0cmluZyh0b0hpZGxTdHJpbmcobmFtZSksCiAgICAgICAgICAgICB0b0hpZGxTdHJpbmcodmFsdWUpKTsKLSAgICByZXR1cm4gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOwogfQogCiBzdGF0dXNfdCBEcm1IYWw6OnNldFByb3BlcnR5Qnl0ZUFycmF5KFN0cmluZzggY29uc3QgJm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmdmFsdWUgKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CiAKLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKLSAgICB9Ci0KLSAgICBTdGF0dXMgc3RhdHVzID0gbVBsdWdpbi0+c2V0UHJvcGVydHlCeXRlQXJyYXkodG9IaWRsU3RyaW5nKG5hbWUpLAorICAgIFJldHVybjxTdGF0dXM+IHN0YXR1cyA9IG1QbHVnaW4tPnNldFByb3BlcnR5Qnl0ZUFycmF5KHRvSGlkbFN0cmluZyhuYW1lKSwKICAgICAgICAgICAgIHRvSGlkbFZlYyh2YWx1ZSkpOwotICAgIHJldHVybiB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICByZXR1cm4gc3RhdHVzLmlzT2soKSA/IHRvU3RhdHVzVChzdGF0dXMpIDogREVBRF9PQkpFQ1Q7CiB9CiAKK3N0YXR1c190IERybUhhbDo6Z2V0TWV0cmljcyhQZXJzaXN0YWJsZUJ1bmRsZSogbWV0cmljcykgeworICAgIGlmIChtZXRyaWNzID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIFVORVhQRUNURURfTlVMTDsKKyAgICB9CisgICAgbU1ldHJpY3MuRXhwb3J0KG1ldHJpY3MpOworCisgICAgLy8gQXBwZW5kIHZlbmRvciBtZXRyaWNzIGlmIHRoZXkgYXJlIHN1cHBvcnRlZC4KKyAgICBpZiAobVBsdWdpblYxXzEgIT0gTlVMTCkgeworICAgICAgICBTdHJpbmc4IHZlbmRvcjsKKyAgICAgICAgU3RyaW5nOCBkZXNjcmlwdGlvbjsKKyAgICAgICAgaWYgKGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCgidmVuZG9yIiksIHZlbmRvcikgIT0gT0sKKyAgICAgICAgICAgIHx8IHZlbmRvci5pc0VtcHR5KCkpIHsKKyAgICAgICAgICBBTE9HRSgiR2V0IHZlbmRvciBmYWlsZWQgb3IgaXMgZW1wdHkiKTsKKyAgICAgICAgICB2ZW5kb3IgPSAiTk9ORSI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCgiZGVzY3JpcHRpb24iKSwgZGVzY3JpcHRpb24pICE9IE9LCisgICAgICAgICAgICB8fCBkZXNjcmlwdGlvbi5pc0VtcHR5KCkpIHsKKyAgICAgICAgICBBTE9HRSgiR2V0IGRlc2NyaXB0aW9uIGZhaWxlZCBvciBpcyBlbXB0eS4iKTsKKyAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJOT05FIjsKKyAgICAgICAgfQorICAgICAgICB2ZW5kb3IgKz0gIi4iOworICAgICAgICB2ZW5kb3IgKz0gZGVzY3JpcHRpb247CisKKyAgICAgICAgaGlkbF92ZWM8RHJtTWV0cmljR3JvdXA+IHBsdWdpbk1ldHJpY3M7CisgICAgICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICAgICAgUmV0dXJuPHZvaWQ+IHN0YXR1cyA9IG1QbHVnaW5WMV8xLT5nZXRNZXRyaWNzKAorICAgICAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBoaWRsX3ZlYzxEcm1NZXRyaWNHcm91cD4gcGx1Z2luTWV0cmljcykgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiRXJyb3IgZ2V0dGluZyBwbHVnaW4gbWV0cmljczogJWQiLCBzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgUGVyc2lzdGFibGVCdW5kbGUgcGx1Z2luQnVuZGxlOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE1lZGlhRHJtTWV0cmljczo6SGlkbE1ldHJpY3NUb0J1bmRsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luTWV0cmljcywgJnBsdWdpbkJ1bmRsZSkgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNzLT5wdXRQZXJzaXN0YWJsZUJ1bmRsZShTdHJpbmcxNih2ZW5kb3IpLCBwbHVnaW5CdW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICByZXR1cm4gc3RhdHVzLmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KIAogc3RhdHVzX3QgRHJtSGFsOjpzZXRDaXBoZXJBbGdvcml0aG0oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGNvbnN0ICZhbGdvcml0aG0pIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Ci0gICAgfQorICAgIElOSVRfQ0hFQ0soKTsKIAogICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7CiAKLSAgICBTdGF0dXMgc3RhdHVzID0gbVBsdWdpbi0+c2V0Q2lwaGVyQWxnb3JpdGhtKHRvSGlkbFZlYyhzZXNzaW9uSWQpLAorICAgIFJldHVybjxTdGF0dXM+IHN0YXR1cyA9IG1QbHVnaW4tPnNldENpcGhlckFsZ29yaXRobSh0b0hpZGxWZWMoc2Vzc2lvbklkKSwKICAgICAgICAgICAgIHRvSGlkbFN0cmluZyhhbGdvcml0aG0pKTsKLSAgICByZXR1cm4gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOwogfQogCiBzdGF0dXNfdCBEcm1IYWw6OnNldE1hY0FsZ29yaXRobShWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggY29uc3QgJmFsZ29yaXRobSkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKLSAgICB9CisgICAgSU5JVF9DSEVDSygpOwogCiAgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKIAotICAgIFN0YXR1cyBzdGF0dXMgPSBtUGx1Z2luLT5zZXRNYWNBbGdvcml0aG0odG9IaWRsVmVjKHNlc3Npb25JZCksCisgICAgUmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gbVBsdWdpbi0+c2V0TWFjQWxnb3JpdGhtKHRvSGlkbFZlYyhzZXNzaW9uSWQpLAogICAgICAgICAgICAgdG9IaWRsU3RyaW5nKGFsZ29yaXRobSkpOwotICAgIHJldHVybiB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICByZXR1cm4gc3RhdHVzLmlzT2soKSA/IHRvU3RhdHVzVChzdGF0dXMpIDogREVBRF9PQkpFQ1Q7CiB9CiAKIHN0YXR1c190IERybUhhbDo6ZW5jcnlwdChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlJZCwgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZpbnB1dCwKICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZpdiwgVmVjdG9yPHVpbnQ4X3Q+ICZvdXRwdXQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Ci0gICAgfQorICAgIElOSVRfQ0hFQ0soKTsKIAogICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7CiAKQEAgLTg5OSwxMCArMTIzMiw3IEBACiAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5SWQsIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaW5wdXQsCiAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaXYsIFZlY3Rvcjx1aW50OF90PiAmb3V0cHV0KSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBtSW5pdENoZWNrOwotICAgIH0KKyAgICBJTklUX0NIRUNLKCk7CiAKICAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+dXNlU2Vzc2lvbihzZXNzaW9uSWQpOwogCkBAIC05MjUsMTAgKzEyNTUsNyBAQAogICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleUlkLCBWZWN0b3I8dWludDhfdD4gY29uc3QgJm1lc3NhZ2UsCiAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmc2lnbmF0dXJlKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBtSW5pdENoZWNrOwotICAgIH0KKyAgICBJTklUX0NIRUNLKCk7CiAKICAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+dXNlU2Vzc2lvbihzZXNzaW9uSWQpOwogCkBAIC05NTEsMTAgKzEyNzgsNyBAQAogICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleUlkLCBWZWN0b3I8dWludDhfdD4gY29uc3QgJm1lc3NhZ2UsCiAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2lnbmF0dXJlLCBib29sICZtYXRjaCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKLSAgICB9CisgICAgSU5JVF9DSEVDSygpOwogCiAgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKIApAQCAtOTc5LDEwICsxMzAzLDcgQEAKICAgICAgICAgU3RyaW5nOCBjb25zdCAmYWxnb3JpdGhtLCBWZWN0b3I8dWludDhfdD4gY29uc3QgJm1lc3NhZ2UsCiAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmd3JhcHBlZEtleSwgVmVjdG9yPHVpbnQ4X3Q+ICZzaWduYXR1cmUpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Ci0gICAgfQorICAgIElOSVRfQ0hFQ0soKTsKIAogICAgIGlmICghY2hlY2tQZXJtaXNzaW9uKCJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX0RSTV9DRVJUSUZJQ0FURVMiKSkgewogICAgICAgICByZXR1cm4gLUVQRVJNOwpAQCAtMTAwNywxNyArMTMyOCw3IEBACiAKIHZvaWQgRHJtSGFsOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICZ0aGVfbGF0ZV93aG8gX191bnVzZWQpCiB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBjbG9zZU9wZW5TZXNzaW9ucygpOwotICAgIHNldExpc3RlbmVyKE5VTEwpOwotICAgIG1Jbml0Q2hlY2sgPSBOT19JTklUOwotCi0gICAgaWYgKG1QbHVnaW4gIT0gTlVMTCkgewotICAgICAgICBpZiAoIW1QbHVnaW4tPnNldExpc3RlbmVyKE5VTEwpLmlzT2soKSkgewotICAgICAgICAgICAgbUluaXRDaGVjayA9IERFQURfT0JKRUNUOwotICAgICAgICB9Ci0gICAgfQotICAgIG1QbHVnaW4uY2xlYXIoKTsKKyAgICBjbGVhbnVwKCk7CiB9CiAKIHZvaWQgRHJtSGFsOjp3cml0ZUJ5dGVBcnJheShQYXJjZWwgJm9iaiwgaGlkbF92ZWM8dWludDhfdD4gY29uc3QgJnZlYykKQEAgLTEwMzAsMTggKzEzNDEsNTUgQEAKICAgICB9CiB9CiAKLXZvaWQgRHJtSGFsOjpyZXBvcnRNZXRyaWNzKCkgY29uc3QKK3ZvaWQgRHJtSGFsOjpyZXBvcnRGcmFtZXdvcmtNZXRyaWNzKCkgY29uc3QKIHsKLSAgICBWZWN0b3I8dWludDhfdD4gbWV0cmljczsKKyAgICBNZWRpYUFuYWx5dGljc0l0ZW0gaXRlbSgibWVkaWFkcm0iKTsKKyAgICBpdGVtLmdlbmVyYXRlU2Vzc2lvbklEKCk7CisgICAgaXRlbS5zZXRQa2dOYW1lKG1NZXRyaWNzLkdldEFwcFBhY2thZ2VOYW1lKCkuY19zdHIoKSk7CisgICAgU3RyaW5nOCB2ZW5kb3I7CisgICAgU3RyaW5nOCBkZXNjcmlwdGlvbjsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBnZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKFN0cmluZzgoInZlbmRvciIpLCB2ZW5kb3IpOworICAgIGlmIChyZXN1bHQgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgdmVuZG9yIGZyb20gZHJtIHBsdWdpbjogJWQiLCByZXN1bHQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGl0ZW0uc2V0Q1N0cmluZygidmVuZG9yIiwgdmVuZG9yLmNfc3RyKCkpOworICAgIH0KKyAgICByZXN1bHQgPSBnZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKFN0cmluZzgoImRlc2NyaXB0aW9uIiksIGRlc2NyaXB0aW9uKTsKKyAgICBpZiAocmVzdWx0ICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IGRlc2NyaXB0aW9uIGZyb20gZHJtIHBsdWdpbjogJWQiLCByZXN1bHQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGl0ZW0uc2V0Q1N0cmluZygiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbi5jX3N0cigpKTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkTWV0cmljczsKKyAgICByZXN1bHQgPSBtTWV0cmljcy5HZXRTZXJpYWxpemVkTWV0cmljcygmc2VyaWFsaXplZE1ldHJpY3MpOworICAgIGlmIChyZXN1bHQgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXJpYWxpemUgZnJhbWV3b3JrIG1ldHJpY3M6ICVkIiwgcmVzdWx0KTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgYjY0RW5jb2RlZE1ldHJpY3MgPSB0b0Jhc2U2NFN0cmluZ05vUGFkKHNlcmlhbGl6ZWRNZXRyaWNzLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZE1ldHJpY3Muc2l6ZSgpKTsKKyAgICBpZiAoIWI2NEVuY29kZWRNZXRyaWNzLmVtcHR5KCkpIHsKKyAgICAgICAgaXRlbS5zZXRDU3RyaW5nKCJzZXJpYWxpemVkX21ldHJpY3MiLCBiNjRFbmNvZGVkTWV0cmljcy5jX3N0cigpKTsKKyAgICB9CisgICAgaWYgKCFpdGVtLnNlbGZyZWNvcmQoKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNlbGYgcmVjb3JkIGZyYW1ld29yayBtZXRyaWNzIik7CisgICAgfQorfQorCit2b2lkIERybUhhbDo6cmVwb3J0UGx1Z2luTWV0cmljcygpIGNvbnN0Cit7CisgICAgVmVjdG9yPHVpbnQ4X3Q+IG1ldHJpY3NWZWN0b3I7CiAgICAgU3RyaW5nOCB2ZW5kb3I7CiAgICAgU3RyaW5nOCBkZXNjcmlwdGlvbjsKICAgICBpZiAoZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4KCJ2ZW5kb3IiKSwgdmVuZG9yKSA9PSBPSyAmJgogICAgICAgICAgICAgZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4KCJkZXNjcmlwdGlvbiIpLCBkZXNjcmlwdGlvbikgPT0gT0sgJiYKLSAgICAgICAgICAgIGdldFByb3BlcnR5Qnl0ZUFycmF5SW50ZXJuYWwoU3RyaW5nOCgibWV0cmljcyIpLCBtZXRyaWNzKSA9PSBPSykgewotICAgICAgICBzdGF0dXNfdCByZXMgPSBhbmRyb2lkOjpyZXBvcnREcm1QbHVnaW5NZXRyaWNzKAotICAgICAgICAgICAgICAgIG1ldHJpY3MsIHZlbmRvciwgZGVzY3JpcHRpb24pOworICAgICAgICAgICAgZ2V0UHJvcGVydHlCeXRlQXJyYXlJbnRlcm5hbChTdHJpbmc4KCJtZXRyaWNzIiksIG1ldHJpY3NWZWN0b3IpID09IE9LKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIG1ldHJpY3NTdHJpbmcgPSB0b0Jhc2U2NFN0cmluZ05vUGFkKG1ldHJpY3NWZWN0b3IuYXJyYXkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljc1ZlY3Rvci5zaXplKCkpOworICAgICAgICBzdGF0dXNfdCByZXMgPSBhbmRyb2lkOjpyZXBvcnREcm1QbHVnaW5NZXRyaWNzKG1ldHJpY3NTdHJpbmcsIHZlbmRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiwgbUFwcFBhY2thZ2VOYW1lKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIk1ldHJpY3Mgd2VyZSByZXRyaWV2ZWQgYnV0IGNvdWxkIG5vdCBiZSByZXBvcnRlZDogJWkiLCByZXMpOworICAgICAgICAgICAgQUxPR0UoIk1ldHJpY3Mgd2VyZSByZXRyaWV2ZWQgYnV0IGNvdWxkIG5vdCBiZSByZXBvcnRlZDogJWQiLCByZXMpOwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0RybU1ldHJpY3MuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL0RybU1ldHJpY3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZWQ3MDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGlibWVkaWFkcm0vRHJtTWV0cmljcy5jcHAKQEAgLTAsMCArMSw0MjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBMT0dfVEFHICJEcm1NZXRyaWNzIgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0RybU1ldHJpY3MuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorCisjaW5jbHVkZSAicHJvdG9zL21ldHJpY3MucGIuaCIKKwordXNpbmcgOjphbmRyb2lkOjpTdHJpbmcxNjsKK3VzaW5nIDo6YW5kcm9pZDo6U3RyaW5nODsKK3VzaW5nIDo6YW5kcm9pZDo6ZHJtX21ldHJpY3M6OkRybUZyYW1ld29ya01ldHJpY3M7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpFdmVudFR5cGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OktleVN0YXR1c1R5cGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OkRybU1ldHJpY0dyb3VwOwordXNpbmcgOjphbmRyb2lkOjpvczo6UGVyc2lzdGFibGVCdW5kbGU7CisKK25hbWVzcGFjZSB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdGQ6OnN0cmluZyBHZXRBdHRyaWJ1dGVOYW1lKFQgdHlwZSk7CisKK3RlbXBsYXRlIDw+IHN0ZDo6c3RyaW5nIEdldEF0dHJpYnV0ZU5hbWU8S2V5U3RhdHVzVHlwZT4oS2V5U3RhdHVzVHlwZSB0eXBlKSB7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKnR5cGVfbmFtZXNbXSA9IHsiVVNBQkxFIiwgIkVYUElSRUQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9VVFBVVF9OT1RfQUxMT1dFRCIsICJTVEFUVVNfUEVORElORyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSU5URVJOQUxfRVJST1IifTsKKyAgICBpZiAoKChzaXplX3QpdHlwZSkgPiBhcnJheXNpemUodHlwZV9uYW1lcykpIHsKKyAgICAgICAgcmV0dXJuICJVTktOT1dOX1RZUEUiOworICAgIH0KKyAgICByZXR1cm4gdHlwZV9uYW1lc1soc2l6ZV90KXR5cGVdOworfQorCit0ZW1wbGF0ZSA8PiBzdGQ6OnN0cmluZyBHZXRBdHRyaWJ1dGVOYW1lPEV2ZW50VHlwZT4oRXZlbnRUeXBlIHR5cGUpIHsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqdHlwZV9uYW1lc1tdID0geyJQUk9WSVNJT05fUkVRVUlSRUQiLCAiS0VZX05FRURFRCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS0VZX0VYUElSRUQiLCAiVkVORE9SX0RFRklORUQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNFU1NJT05fUkVDTEFJTUVEIn07CisgICAgaWYgKCgoc2l6ZV90KXR5cGUpID4gYXJyYXlzaXplKHR5cGVfbmFtZXMpKSB7CisgICAgICAgIHJldHVybiAiVU5LTk9XTl9UWVBFIjsKKyAgICB9CisgICAgcmV0dXJuIHR5cGVfbmFtZXNbKHNpemVfdCl0eXBlXTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIEV4cG9ydENvdW50ZXJNZXRyaWMoY29uc3QgYW5kcm9pZDo6Q291bnRlck1ldHJpYzxUPiAmY291bnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQZXJzaXN0YWJsZUJ1bmRsZSAqbWV0cmljcykgeworICAgIGlmICghbWV0cmljcykgeworICAgICAgICBBTE9HRSgibWV0cmljcyB3YXMgdW5leHBlY3RlZGx5IG51bGwuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgc3VjY2Vzc19jb3VudF9uYW1lID0gY291bnRlci5tZXRyaWNfbmFtZSgpICsgIi5vay5jb3VudCI7CisgICAgc3RkOjpzdHJpbmcgZXJyb3JfY291bnRfbmFtZSA9IGNvdW50ZXIubWV0cmljX25hbWUoKSArICIuZXJyb3IuY291bnQiOworICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IHN0YXR1c192YWx1ZXM7CisgICAgY291bnRlci5FeHBvcnRWYWx1ZXMoCisgICAgICAgIFsmXShjb25zdCBhbmRyb2lkOjpzdGF0dXNfdCBzdGF0dXMsIGNvbnN0IGludDY0X3QgdmFsdWUpIHsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gYW5kcm9pZDo6T0spIHsKKyAgICAgICAgICAgICAgICBtZXRyaWNzLT5wdXRMb25nKGFuZHJvaWQ6OlN0cmluZzE2KHN1Y2Nlc3NfY291bnRfbmFtZS5jX3N0cigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50NjRfdCB0b3RhbF9lcnJvcnMoMCk7CisgICAgICAgICAgICAgICAgbWV0cmljcy0+Z2V0TG9uZyhhbmRyb2lkOjpTdHJpbmcxNihlcnJvcl9jb3VudF9uYW1lLmNfc3RyKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRvdGFsX2Vycm9ycyk7CisgICAgICAgICAgICAgICAgbWV0cmljcy0+cHV0TG9uZyhhbmRyb2lkOjpTdHJpbmcxNihlcnJvcl9jb3VudF9uYW1lLmNfc3RyKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxfZXJyb3JzICsgdmFsdWUpOworICAgICAgICAgICAgICAgIHN0YXR1c192YWx1ZXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIGlmICghc3RhdHVzX3ZhbHVlcy5lbXB0eSgpKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGVycm9yX2xpc3RfbmFtZSA9IGNvdW50ZXIubWV0cmljX25hbWUoKSArICIuZXJyb3IubGlzdCI7CisgICAgICAgIG1ldHJpY3MtPnB1dExvbmdWZWN0b3IoYW5kcm9pZDo6U3RyaW5nMTYoZXJyb3JfbGlzdF9uYW1lLmNfc3RyKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c192YWx1ZXMpOworICAgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIEV4cG9ydENvdW50ZXJNZXRyaWNXaXRoQXR0cmlidXRlTmFtZXMoCisgICAgY29uc3QgYW5kcm9pZDo6Q291bnRlck1ldHJpYzxUPiAmY291bnRlciwgUGVyc2lzdGFibGVCdW5kbGUgKm1ldHJpY3MpIHsKKyAgICBpZiAoIW1ldHJpY3MpIHsKKyAgICAgICAgQUxPR0UoIm1ldHJpY3Mgd2FzIHVuZXhwZWN0ZWRseSBudWxsLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNvdW50ZXIuRXhwb3J0VmFsdWVzKFsmXShjb25zdCBUICZhdHRyaWJ1dGUsIGNvbnN0IGludDY0X3QgdmFsdWUpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSA9IGNvdW50ZXIubWV0cmljX25hbWUoKSArICIuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRBdHRyaWJ1dGVOYW1lKGF0dHJpYnV0ZSkgKyAiLmNvdW50IjsKKyAgICAgICAgbWV0cmljcy0+cHV0TG9uZyhhbmRyb2lkOjpTdHJpbmcxNihuYW1lLmNfc3RyKCkpLCB2YWx1ZSk7CisgICAgfSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBFeHBvcnRFdmVudE1ldHJpYyhjb25zdCBhbmRyb2lkOjpFdmVudE1ldHJpYzxUPiAmZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgIFBlcnNpc3RhYmxlQnVuZGxlICptZXRyaWNzKSB7CisgICAgaWYgKCFtZXRyaWNzKSB7CisgICAgICAgIEFMT0dFKCJtZXRyaWNzIHdhcyB1bmV4cGVjdGVkbHkgbnVsbC4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyBzdWNjZXNzX2NvdW50X25hbWUgPSBldmVudC5tZXRyaWNfbmFtZSgpICsgIi5vay5jb3VudCI7CisgICAgc3RkOjpzdHJpbmcgZXJyb3JfY291bnRfbmFtZSA9IGV2ZW50Lm1ldHJpY19uYW1lKCkgKyAiLmVycm9yLmNvdW50IjsKKyAgICBzdGQ6OnN0cmluZyB0aW1pbmdfbmFtZSA9IGV2ZW50Lm1ldHJpY19uYW1lKCkgKyAiLm9rLmF2ZXJhZ2VfdGltZV9taWNyb3MiOworICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IHN0YXR1c192YWx1ZXM7CisgICAgZXZlbnQuRXhwb3J0VmFsdWVzKFsmXShjb25zdCBhbmRyb2lkOjpzdGF0dXNfdCAmc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6RXZlbnRTdGF0aXN0aWNzICZ2YWx1ZSkgeworICAgICAgICBpZiAoc3RhdHVzID09IGFuZHJvaWQ6Ok9LKSB7CisgICAgICAgICAgICBtZXRyaWNzLT5wdXRMb25nKGFuZHJvaWQ6OlN0cmluZzE2KHN1Y2Nlc3NfY291bnRfbmFtZS5jX3N0cigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuY291bnQpOworICAgICAgICAgICAgbWV0cmljcy0+cHV0TG9uZyhhbmRyb2lkOjpTdHJpbmcxNih0aW1pbmdfbmFtZS5jX3N0cigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUubWVhbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQ2NF90IHRvdGFsX2Vycm9ycygwKTsKKyAgICAgICAgICAgIG1ldHJpY3MtPmdldExvbmcoYW5kcm9pZDo6U3RyaW5nMTYoZXJyb3JfY291bnRfbmFtZS5jX3N0cigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRvdGFsX2Vycm9ycyk7CisgICAgICAgICAgICBtZXRyaWNzLT5wdXRMb25nKGFuZHJvaWQ6OlN0cmluZzE2KGVycm9yX2NvdW50X25hbWUuY19zdHIoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX2Vycm9ycyArIHZhbHVlLmNvdW50KTsKKyAgICAgICAgICAgIHN0YXR1c192YWx1ZXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgIH0KKyAgICB9KTsKKyAgICBpZiAoIXN0YXR1c192YWx1ZXMuZW1wdHkoKSkgeworICAgICAgICBzdGQ6OnN0cmluZyBlcnJvcl9saXN0X25hbWUgPSBldmVudC5tZXRyaWNfbmFtZSgpICsgIi5lcnJvci5saXN0IjsKKyAgICAgICAgbWV0cmljcy0+cHV0TG9uZ1ZlY3RvcihhbmRyb2lkOjpTdHJpbmcxNihlcnJvcl9saXN0X25hbWUuY19zdHIoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3ZhbHVlcyk7CisgICAgfQorfQorCit2b2lkIEV4cG9ydFNlc3Npb25MaWZlc3BhbnMoCisgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6cGFpcjxpbnQ2NF90LCBpbnQ2NF90Pj4gJm1TZXNzaW9uTGlmZXNwYW5zLAorICAgIFBlcnNpc3RhYmxlQnVuZGxlICptZXRyaWNzKSB7CisgICAgaWYgKCFtZXRyaWNzKSB7CisgICAgICAgIEFMT0dFKCJtZXRyaWNzIHdhcyB1bmV4cGVjdGVkbHkgbnVsbC4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtU2Vzc2lvbkxpZmVzcGFucy5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBQZXJzaXN0YWJsZUJ1bmRsZSBzdGFydFRpbWVzQnVuZGxlOworICAgIFBlcnNpc3RhYmxlQnVuZGxlIGVuZFRpbWVzQnVuZGxlOworICAgIGZvciAoYXV0byBpdCA9IG1TZXNzaW9uTGlmZXNwYW5zLmJlZ2luKCk7IGl0ICE9IG1TZXNzaW9uTGlmZXNwYW5zLmVuZCgpOworICAgICAgICAgaXQrKykgeworICAgICAgICBTdHJpbmcxNiBrZXkoaXQtPmZpcnN0LmNfc3RyKCksIGl0LT5maXJzdC5zaXplKCkpOworICAgICAgICBzdGFydFRpbWVzQnVuZGxlLnB1dExvbmcoa2V5LCBpdC0+c2Vjb25kLmZpcnN0KTsKKyAgICAgICAgZW5kVGltZXNCdW5kbGUucHV0TG9uZyhrZXksIGl0LT5zZWNvbmQuc2Vjb25kKTsKKyAgICB9CisgICAgbWV0cmljcy0+cHV0UGVyc2lzdGFibGVCdW5kbGUoCisgICAgICAgIGFuZHJvaWQ6OlN0cmluZzE2KCJkcm0ubWVkaWFkcm0uc2Vzc2lvbl9zdGFydF90aW1lc19tcyIpLAorICAgICAgICBzdGFydFRpbWVzQnVuZGxlKTsKKyAgICBtZXRyaWNzLT5wdXRQZXJzaXN0YWJsZUJ1bmRsZSgKKyAgICAgICAgYW5kcm9pZDo6U3RyaW5nMTYoImRybS5tZWRpYWRybS5zZXNzaW9uX2VuZF90aW1lc19tcyIpLCBlbmRUaW1lc0J1bmRsZSk7Cit9CisKK3N0ZDo6c3RyaW5nIFRvSGV4U3RyaW5nKGNvbnN0IGFuZHJvaWQ6OlZlY3Rvcjx1aW50OF90PiAmc2Vzc2lvbklkKSB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgICBvdXQgPDwgc3RkOjpoZXggPDwgc3RkOjpzZXRmaWxsKCcwJyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzZXNzaW9uSWQuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgb3V0IDw8IHN0ZDo6c2V0dygyKSA8PCAoaW50KShzZXNzaW9uSWRbaV0pOworICAgIH0KKyAgICByZXR1cm4gb3V0LnN0cigpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ1Q+Cit2b2lkIFNldFZhbHVlKGNvbnN0IFN0cmluZzE2ICZuYW1lLCBEcm1NZXRyaWNHcm91cDo6VmFsdWVUeXBlIHR5cGUsCisgICAgICAgICAgICAgIGNvbnN0IENUICZ2YWx1ZSwgUGVyc2lzdGFibGVCdW5kbGUgKmJ1bmRsZSkgeworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgRHJtTWV0cmljR3JvdXA6OlZhbHVlVHlwZTo6SU5UNjRfVFlQRToKKyAgICAgICAgYnVuZGxlLT5wdXRMb25nKG5hbWUsIHZhbHVlLmludDY0VmFsdWUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERybU1ldHJpY0dyb3VwOjpWYWx1ZVR5cGU6OkRPVUJMRV9UWVBFOgorICAgICAgICBidW5kbGUtPnB1dERvdWJsZShuYW1lLCB2YWx1ZS5kb3VibGVWYWx1ZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRHJtTWV0cmljR3JvdXA6OlZhbHVlVHlwZTo6U1RSSU5HX1RZUEU6CisgICAgICAgIGJ1bmRsZS0+cHV0U3RyaW5nKG5hbWUsIFN0cmluZzE2KHZhbHVlLnN0cmluZ1ZhbHVlLmNfc3RyKCkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR0UoIlVuZXhwZWN0ZWQgdmFsdWUgdHlwZTogJWhodSIsIHR5cGUpOworICAgIH0KK30KKworaW5saW5lIFN0cmluZzE2IE1ha2VJbmRleFN0cmluZyh1bnNpZ25lZCBpbnQgaW5kZXgpIHsKKyAgc3RkOjpzdHJpbmcgc3RyKCJbIik7CisgIHN0ci5hcHBlbmQoc3RkOjp0b19zdHJpbmcoaW5kZXgpKTsKKyAgc3RyLmFwcGVuZCgiXSIpOworICByZXR1cm4gU3RyaW5nMTYoc3RyLmNfc3RyKCkpOworfQorCit9IC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK01lZGlhRHJtTWV0cmljczo6TWVkaWFEcm1NZXRyaWNzKCkKKyAgICA6IG1PcGVuU2Vzc2lvbkNvdW50ZXIoImRybS5tZWRpYWRybS5vcGVuX3Nlc3Npb24iLCAic3RhdHVzIiksCisgICAgICBtQ2xvc2VTZXNzaW9uQ291bnRlcigiZHJtLm1lZGlhZHJtLmNsb3NlX3Nlc3Npb24iLCAic3RhdHVzIiksCisgICAgICBtR2V0S2V5UmVxdWVzdFRpbWVVcygiZHJtLm1lZGlhZHJtLmdldF9rZXlfcmVxdWVzdCIsICJzdGF0dXMiKSwKKyAgICAgIG1Qcm92aWRlS2V5UmVzcG9uc2VUaW1lVXMoImRybS5tZWRpYWRybS5wcm92aWRlX2tleV9yZXNwb25zZSIsICJzdGF0dXMiKSwKKyAgICAgIG1HZXRQcm92aXNpb25SZXF1ZXN0Q291bnRlcigiZHJtLm1lZGlhZHJtLmdldF9wcm92aXNpb25fcmVxdWVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0YXR1cyIpLAorICAgICAgbVByb3ZpZGVQcm92aXNpb25SZXNwb25zZUNvdW50ZXIoCisgICAgICAgICAgImRybS5tZWRpYWRybS5wcm92aWRlX3Byb3Zpc2lvbl9yZXNwb25zZSIsICJzdGF0dXMiKSwKKyAgICAgIG1LZXlTdGF0dXNDaGFuZ2VDb3VudGVyKCJkcm0ubWVkaWFkcm0ua2V5X3N0YXR1c19jaGFuZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImtleV9zdGF0dXNfdHlwZSIpLAorICAgICAgbUV2ZW50Q291bnRlcigiZHJtLm1lZGlhZHJtLmV2ZW50IiwgImV2ZW50X3R5cGUiKSwKKyAgICAgIG1HZXREZXZpY2VVbmlxdWVJZENvdW50ZXIoImRybS5tZWRpYWRybS5nZXRfZGV2aWNlX3VuaXF1ZV9pZCIsICJzdGF0dXMiKSB7Cit9CisKK3ZvaWQgTWVkaWFEcm1NZXRyaWNzOjpTZXRTZXNzaW9uU3RhcnQoCisgICAgY29uc3QgYW5kcm9pZDo6VmVjdG9yPHVpbnQ4X3Q+ICZzZXNzaW9uSWQpIHsKKyAgICBzdGQ6OnN0cmluZyBzZXNzaW9uSWRIZXggPSBUb0hleFN0cmluZyhzZXNzaW9uSWQpOworICAgIG1TZXNzaW9uTGlmZXNwYW5zW3Nlc3Npb25JZEhleF0gPQorICAgICAgICBzdGQ6Om1ha2VfcGFpcihHZXRDdXJyZW50VGltZU1zKCksIChpbnQ2NF90KTApOworfQorCit2b2lkIE1lZGlhRHJtTWV0cmljczo6U2V0U2Vzc2lvbkVuZChjb25zdCBhbmRyb2lkOjpWZWN0b3I8dWludDhfdD4gJnNlc3Npb25JZCkgeworICAgIHN0ZDo6c3RyaW5nIHNlc3Npb25JZEhleCA9IFRvSGV4U3RyaW5nKHNlc3Npb25JZCk7CisgICAgaW50NjRfdCBlbmRUaW1lTXMgPSBHZXRDdXJyZW50VGltZU1zKCk7CisgICAgaWYgKG1TZXNzaW9uTGlmZXNwYW5zLmZpbmQoc2Vzc2lvbklkSGV4KSAhPSBtU2Vzc2lvbkxpZmVzcGFucy5lbmQoKSkgeworICAgICAgICBtU2Vzc2lvbkxpZmVzcGFuc1tzZXNzaW9uSWRIZXhdID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKG1TZXNzaW9uTGlmZXNwYW5zW3Nlc3Npb25JZEhleF0uZmlyc3QsIGVuZFRpbWVNcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVNlc3Npb25MaWZlc3BhbnNbc2Vzc2lvbklkSGV4XSA9IHN0ZDo6bWFrZV9wYWlyKChpbnQ2NF90KTAsIGVuZFRpbWVNcyk7CisgICAgfQorfQorCit2b2lkIE1lZGlhRHJtTWV0cmljczo6RXhwb3J0KFBlcnNpc3RhYmxlQnVuZGxlICptZXRyaWNzKSB7CisgICAgaWYgKCFtZXRyaWNzKSB7CisgICAgICAgIEFMT0dFKCJtZXRyaWNzIHdhcyB1bmV4cGVjdGVkbHkgbnVsbC4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBFeHBvcnRDb3VudGVyTWV0cmljKG1PcGVuU2Vzc2lvbkNvdW50ZXIsIG1ldHJpY3MpOworICAgIEV4cG9ydENvdW50ZXJNZXRyaWMobUNsb3NlU2Vzc2lvbkNvdW50ZXIsIG1ldHJpY3MpOworICAgIEV4cG9ydEV2ZW50TWV0cmljKG1HZXRLZXlSZXF1ZXN0VGltZVVzLCBtZXRyaWNzKTsKKyAgICBFeHBvcnRFdmVudE1ldHJpYyhtUHJvdmlkZUtleVJlc3BvbnNlVGltZVVzLCBtZXRyaWNzKTsKKyAgICBFeHBvcnRDb3VudGVyTWV0cmljKG1HZXRQcm92aXNpb25SZXF1ZXN0Q291bnRlciwgbWV0cmljcyk7CisgICAgRXhwb3J0Q291bnRlck1ldHJpYyhtUHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlQ291bnRlciwgbWV0cmljcyk7CisgICAgRXhwb3J0Q291bnRlck1ldHJpY1dpdGhBdHRyaWJ1dGVOYW1lcyhtS2V5U3RhdHVzQ2hhbmdlQ291bnRlciwgbWV0cmljcyk7CisgICAgRXhwb3J0Q291bnRlck1ldHJpY1dpdGhBdHRyaWJ1dGVOYW1lcyhtRXZlbnRDb3VudGVyLCBtZXRyaWNzKTsKKyAgICBFeHBvcnRDb3VudGVyTWV0cmljKG1HZXREZXZpY2VVbmlxdWVJZENvdW50ZXIsIG1ldHJpY3MpOworICAgIEV4cG9ydFNlc3Npb25MaWZlc3BhbnMobVNlc3Npb25MaWZlc3BhbnMsIG1ldHJpY3MpOworfQorCitzdGF0dXNfdCBNZWRpYURybU1ldHJpY3M6OkdldFNlcmlhbGl6ZWRNZXRyaWNzKHN0ZDo6c3RyaW5nICpzZXJpYWxpemVkTWV0cmljcykgeworCisgICAgaWYgKCFzZXJpYWxpemVkTWV0cmljcykgeworICAgICAgICBBTE9HRSgic2VyaWFsaXplZE1ldHJpY3Mgd2FzIHVuZXhwZWN0ZWRseSBudWxsLiIpOworICAgICAgICByZXR1cm4gVU5FWFBFQ1RFRF9OVUxMOworICAgIH0KKworICAgIERybUZyYW1ld29ya01ldHJpY3MgbWV0cmljczsKKworICAgIG1PcGVuU2Vzc2lvbkNvdW50ZXIuRXhwb3J0VmFsdWVzKAorICAgICAgICBbJl0oY29uc3QgYW5kcm9pZDo6c3RhdHVzX3Qgc3RhdHVzLCBjb25zdCBpbnQ2NF90IHZhbHVlKSB7CisgICAgICAgICAgICBEcm1GcmFtZXdvcmtNZXRyaWNzOjpDb3VudGVyICpjb3VudGVyID0KKyAgICAgICAgICAgICAgICBtZXRyaWNzLmFkZF9vcGVuX3Nlc3Npb25fY291bnRlcigpOworICAgICAgICAgICAgY291bnRlci0+c2V0X2NvdW50KHZhbHVlKTsKKyAgICAgICAgICAgIGNvdW50ZXItPm11dGFibGVfYXR0cmlidXRlcygpLT5zZXRfZXJyb3JfY29kZShzdGF0dXMpOworICAgICAgICB9KTsKKworICAgIG1DbG9zZVNlc3Npb25Db3VudGVyLkV4cG9ydFZhbHVlcygKKyAgICAgICAgWyZdKGNvbnN0IGFuZHJvaWQ6OnN0YXR1c190IHN0YXR1cywgY29uc3QgaW50NjRfdCB2YWx1ZSkgeworICAgICAgICAgICAgRHJtRnJhbWV3b3JrTWV0cmljczo6Q291bnRlciAqY291bnRlciA9CisgICAgICAgICAgICAgICAgbWV0cmljcy5hZGRfY2xvc2Vfc2Vzc2lvbl9jb3VudGVyKCk7CisgICAgICAgICAgICBjb3VudGVyLT5zZXRfY291bnQodmFsdWUpOworICAgICAgICAgICAgY291bnRlci0+bXV0YWJsZV9hdHRyaWJ1dGVzKCktPnNldF9lcnJvcl9jb2RlKHN0YXR1cyk7CisgICAgICAgIH0pOworCisgICAgbUdldFByb3Zpc2lvblJlcXVlc3RDb3VudGVyLkV4cG9ydFZhbHVlcygKKyAgICAgICAgWyZdKGNvbnN0IGFuZHJvaWQ6OnN0YXR1c190IHN0YXR1cywgY29uc3QgaW50NjRfdCB2YWx1ZSkgeworICAgICAgICAgICAgRHJtRnJhbWV3b3JrTWV0cmljczo6Q291bnRlciAqY291bnRlciA9CisgICAgICAgICAgICAgICAgbWV0cmljcy5hZGRfZ2V0X3Byb3Zpc2lvbmluZ19yZXF1ZXN0X2NvdW50ZXIoKTsKKyAgICAgICAgICAgIGNvdW50ZXItPnNldF9jb3VudCh2YWx1ZSk7CisgICAgICAgICAgICBjb3VudGVyLT5tdXRhYmxlX2F0dHJpYnV0ZXMoKS0+c2V0X2Vycm9yX2NvZGUoc3RhdHVzKTsKKyAgICAgICAgfSk7CisKKyAgICBtUHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlQ291bnRlci5FeHBvcnRWYWx1ZXMoCisgICAgICAgIFsmXShjb25zdCBhbmRyb2lkOjpzdGF0dXNfdCBzdGF0dXMsIGNvbnN0IGludDY0X3QgdmFsdWUpIHsKKyAgICAgICAgICAgIERybUZyYW1ld29ya01ldHJpY3M6OkNvdW50ZXIgKmNvdW50ZXIgPQorICAgICAgICAgICAgICAgIG1ldHJpY3MuYWRkX3Byb3ZpZGVfcHJvdmlzaW9uaW5nX3Jlc3BvbnNlX2NvdW50ZXIoKTsKKyAgICAgICAgICAgIGNvdW50ZXItPnNldF9jb3VudCh2YWx1ZSk7CisgICAgICAgICAgICBjb3VudGVyLT5tdXRhYmxlX2F0dHJpYnV0ZXMoKS0+c2V0X2Vycm9yX2NvZGUoc3RhdHVzKTsKKyAgICAgICAgfSk7CisKKyAgICBtS2V5U3RhdHVzQ2hhbmdlQ291bnRlci5FeHBvcnRWYWx1ZXMoCisgICAgICAgIFsmXShjb25zdCBLZXlTdGF0dXNUeXBlIGtleV9zdGF0dXNfdHlwZSwgY29uc3QgaW50NjRfdCB2YWx1ZSkgeworICAgICAgICAgICAgRHJtRnJhbWV3b3JrTWV0cmljczo6Q291bnRlciAqY291bnRlciA9CisgICAgICAgICAgICAgICAgbWV0cmljcy5hZGRfa2V5X3N0YXR1c19jaGFuZ2VfY291bnRlcigpOworICAgICAgICAgICAgY291bnRlci0+c2V0X2NvdW50KHZhbHVlKTsKKyAgICAgICAgICAgIGNvdW50ZXItPm11dGFibGVfYXR0cmlidXRlcygpLT5zZXRfa2V5X3N0YXR1c190eXBlKAorICAgICAgICAgICAgICAgICh1aW50MzJfdClrZXlfc3RhdHVzX3R5cGUpOworICAgICAgICB9KTsKKworICAgIG1FdmVudENvdW50ZXIuRXhwb3J0VmFsdWVzKAorICAgICAgICBbJl0oY29uc3QgRXZlbnRUeXBlIGV2ZW50X3R5cGUsIGNvbnN0IGludDY0X3QgdmFsdWUpIHsKKyAgICAgICAgICAgIERybUZyYW1ld29ya01ldHJpY3M6OkNvdW50ZXIgKmNvdW50ZXIgPQorICAgICAgICAgICAgICAgIG1ldHJpY3MuYWRkX2V2ZW50X2NhbGxiYWNrX2NvdW50ZXIoKTsKKyAgICAgICAgICAgIGNvdW50ZXItPnNldF9jb3VudCh2YWx1ZSk7CisgICAgICAgICAgICBjb3VudGVyLT5tdXRhYmxlX2F0dHJpYnV0ZXMoKS0+c2V0X2V2ZW50X3R5cGUoKHVpbnQzMl90KWV2ZW50X3R5cGUpOworICAgICAgICB9KTsKKworICAgIG1HZXREZXZpY2VVbmlxdWVJZENvdW50ZXIuRXhwb3J0VmFsdWVzKAorICAgICAgICBbJl0oY29uc3Qgc3RhdHVzX3Qgc3RhdHVzLCBjb25zdCBpbnQ2NF90IHZhbHVlKSB7CisgICAgICAgICAgICBEcm1GcmFtZXdvcmtNZXRyaWNzOjpDb3VudGVyICpjb3VudGVyID0KKyAgICAgICAgICAgICAgICBtZXRyaWNzLmFkZF9nZXRfZGV2aWNlX3VuaXF1ZV9pZF9jb3VudGVyKCk7CisgICAgICAgICAgICBjb3VudGVyLT5zZXRfY291bnQodmFsdWUpOworICAgICAgICAgICAgY291bnRlci0+bXV0YWJsZV9hdHRyaWJ1dGVzKCktPnNldF9lcnJvcl9jb2RlKHN0YXR1cyk7CisgICAgICAgIH0pOworCisgICAgbUdldEtleVJlcXVlc3RUaW1lVXMuRXhwb3J0VmFsdWVzKAorICAgICAgICBbJl0oY29uc3Qgc3RhdHVzX3Qgc3RhdHVzLCBjb25zdCBFdmVudFN0YXRpc3RpY3MgJnN0YXRzKSB7CisgICAgICAgICAgICBEcm1GcmFtZXdvcmtNZXRyaWNzOjpEaXN0cmlidXRpb25NZXRyaWMgKm1ldHJpYyA9CisgICAgICAgICAgICAgICAgbWV0cmljcy5hZGRfZ2V0X2tleV9yZXF1ZXN0X3RpbWVfdXMoKTsKKyAgICAgICAgICAgIG1ldHJpYy0+c2V0X21pbihzdGF0cy5taW4pOworICAgICAgICAgICAgbWV0cmljLT5zZXRfbWF4KHN0YXRzLm1heCk7CisgICAgICAgICAgICBtZXRyaWMtPnNldF9tZWFuKHN0YXRzLm1lYW4pOworICAgICAgICAgICAgbWV0cmljLT5zZXRfb3BlcmF0aW9uX2NvdW50KHN0YXRzLmNvdW50KTsKKyAgICAgICAgICAgIG1ldHJpYy0+c2V0X3ZhcmlhbmNlKHN0YXRzLnN1bV9zcXVhcmVkX2RldmlhdGlvbiAvIHN0YXRzLmNvdW50KTsKKyAgICAgICAgICAgIG1ldHJpYy0+bXV0YWJsZV9hdHRyaWJ1dGVzKCktPnNldF9lcnJvcl9jb2RlKHN0YXR1cyk7CisgICAgICAgIH0pOworCisgICAgbVByb3ZpZGVLZXlSZXNwb25zZVRpbWVVcy5FeHBvcnRWYWx1ZXMoCisgICAgICAgIFsmXShjb25zdCBzdGF0dXNfdCBzdGF0dXMsIGNvbnN0IEV2ZW50U3RhdGlzdGljcyAmc3RhdHMpIHsKKyAgICAgICAgICAgIERybUZyYW1ld29ya01ldHJpY3M6OkRpc3RyaWJ1dGlvbk1ldHJpYyAqbWV0cmljID0KKyAgICAgICAgICAgICAgICBtZXRyaWNzLmFkZF9wcm92aWRlX2tleV9yZXNwb25zZV90aW1lX3VzKCk7CisgICAgICAgICAgICBtZXRyaWMtPnNldF9taW4oc3RhdHMubWluKTsKKyAgICAgICAgICAgIG1ldHJpYy0+c2V0X21heChzdGF0cy5tYXgpOworICAgICAgICAgICAgbWV0cmljLT5zZXRfbWVhbihzdGF0cy5tZWFuKTsKKyAgICAgICAgICAgIG1ldHJpYy0+c2V0X29wZXJhdGlvbl9jb3VudChzdGF0cy5jb3VudCk7CisgICAgICAgICAgICBtZXRyaWMtPnNldF92YXJpYW5jZShzdGF0cy5zdW1fc3F1YXJlZF9kZXZpYXRpb24gLyBzdGF0cy5jb3VudCk7CisgICAgICAgICAgICBtZXRyaWMtPm11dGFibGVfYXR0cmlidXRlcygpLT5zZXRfZXJyb3JfY29kZShzdGF0dXMpOworICAgICAgICB9KTsKKworICAgIGZvciAoY29uc3QgYXV0byAmc2Vzc2lvbkxpZmVzcGFuIDogbVNlc3Npb25MaWZlc3BhbnMpIHsKKyAgICAgICAgYXV0byAqbWFwID0gbWV0cmljcy5tdXRhYmxlX3Nlc3Npb25fbGlmZXRpbWVzKCk7CisKKyAgICAgICAgKCptYXApW3Nlc3Npb25MaWZlc3Bhbi5maXJzdF0uc2V0X3N0YXJ0X3RpbWVfbXMoCisgICAgICAgICAgICBzZXNzaW9uTGlmZXNwYW4uc2Vjb25kLmZpcnN0KTsKKyAgICAgICAgKCptYXApW3Nlc3Npb25MaWZlc3Bhbi5maXJzdF0uc2V0X2VuZF90aW1lX21zKAorICAgICAgICAgICAgc2Vzc2lvbkxpZmVzcGFuLnNlY29uZC5zZWNvbmQpOworICAgIH0KKworICAgIGlmICghbWV0cmljcy5TZXJpYWxpemVUb1N0cmluZyhzZXJpYWxpemVkTWV0cmljcykpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXJpYWxpemUgbWV0cmljcy4iKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitpbnQ2NF90IE1lZGlhRHJtTWV0cmljczo6R2V0Q3VycmVudFRpbWVNcygpIHsKKyAgICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgICBnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKKyAgICByZXR1cm4gKChpbnQ2NF90KXR2LnR2X3NlYyAqIDEwMDApICsgKChpbnQ2NF90KXR2LnR2X3VzZWMgLyAxMDAwKTsKK30KKworc3RhdHVzX3QgTWVkaWFEcm1NZXRyaWNzOjpIaWRsTWV0cmljc1RvQnVuZGxlKAorICAgIGNvbnN0IGhpZGxfdmVjPERybU1ldHJpY0dyb3VwPiAmaGlkbE1ldHJpY0dyb3VwcywKKyAgICBQZXJzaXN0YWJsZUJ1bmRsZSAqYnVuZGxlTWV0cmljR3JvdXBzKSB7CisgICAgaWYgKGJ1bmRsZU1ldHJpY0dyb3VwcyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBVTkVYUEVDVEVEX05VTEw7CisgICAgfQorICAgIGlmIChoaWRsTWV0cmljR3JvdXBzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBpbnQgZ3JvdXBJbmRleCA9IDA7CisgICAgc3RkOjptYXA8U3RyaW5nMTYsIGludD4gaW5kZXhNYXA7CisgICAgZm9yIChjb25zdCBhdXRvICZoaWRsTWV0cmljR3JvdXAgOiBoaWRsTWV0cmljR3JvdXBzKSB7CisgICAgICAgIFBlcnNpc3RhYmxlQnVuZGxlIGJ1bmRsZU1ldHJpY0dyb3VwOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmhpZGxNZXRyaWMgOiBoaWRsTWV0cmljR3JvdXAubWV0cmljcykgeworICAgICAgICAgICAgU3RyaW5nMTYgbWV0cmljTmFtZShoaWRsTWV0cmljLm5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBQZXJzaXN0YWJsZUJ1bmRsZSBidW5kbGVNZXRyaWM7CisgICAgICAgICAgICAvLyBBZGQgbWV0cmljIGNvbXBvbmVudCB2YWx1ZXMuCisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnZhbHVlIDogaGlkbE1ldHJpYy52YWx1ZXMpIHsKKyAgICAgICAgICAgICAgICBTZXRWYWx1ZShTdHJpbmcxNih2YWx1ZS5jb21wb25lbnROYW1lLmNfc3RyKCkpLCB2YWx1ZS50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCAmYnVuZGxlTWV0cmljKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFNldCBtZXRyaWMgYXR0cmlidXRlcy4KKyAgICAgICAgICAgIFBlcnNpc3RhYmxlQnVuZGxlIGJ1bmRsZU1ldHJpY0F0dHJpYnV0ZXM7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmF0dHJpYnV0ZSA6IGhpZGxNZXRyaWMuYXR0cmlidXRlcykgeworICAgICAgICAgICAgICAgIFNldFZhbHVlKFN0cmluZzE2KGF0dHJpYnV0ZS5uYW1lLmNfc3RyKCkpLCBhdHRyaWJ1dGUudHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUsICZidW5kbGVNZXRyaWNBdHRyaWJ1dGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEFkZCBhdHRyaWJ1dGVzIHRvIHRoZSBidW5kbGUgbWV0cmljLgorICAgICAgICAgICAgYnVuZGxlTWV0cmljLnB1dFBlcnNpc3RhYmxlQnVuZGxlKFN0cmluZzE2KCJhdHRyaWJ1dGVzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlTWV0cmljQXR0cmlidXRlcyk7CisgICAgICAgICAgICAvLyBBZGQgb25lIGxheWVyIG9mIGluZGlyZWN0aW9uLCBhbGxvd2luZyBmb3IgcmVwZWF0ZWQgbWV0cmljIG5hbWVzLgorICAgICAgICAgICAgUGVyc2lzdGFibGVCdW5kbGUgcmVwZWF0ZWRNZXRyaWNzOworICAgICAgICAgICAgYnVuZGxlTWV0cmljR3JvdXAuZ2V0UGVyc2lzdGFibGVCdW5kbGUobWV0cmljTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXBlYXRlZE1ldHJpY3MpOworICAgICAgICAgICAgaW50IGluZGV4ID0gaW5kZXhNYXBbbWV0cmljTmFtZV07CisgICAgICAgICAgICByZXBlYXRlZE1ldHJpY3MucHV0UGVyc2lzdGFibGVCdW5kbGUoTWFrZUluZGV4U3RyaW5nKGluZGV4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidW5kbGVNZXRyaWMpOworICAgICAgICAgICAgaW5kZXhNYXBbbWV0cmljTmFtZV0gPSArK2luZGV4OworCisgICAgICAgICAgICAvLyBBZGQgdGhlIGJ1bmRsZSBtZXRyaWMgdG8gdGhlIGdyb3VwIG9mIG1ldHJpY3MuCisgICAgICAgICAgICBidW5kbGVNZXRyaWNHcm91cC5wdXRQZXJzaXN0YWJsZUJ1bmRsZShtZXRyaWNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwZWF0ZWRNZXRyaWNzKTsKKyAgICAgICAgfQorICAgICAgICAvLyBBZGQgdGhlIGJ1bmRsZSBtZXRyaWMgZ3JvdXAgdG8gdGhlIGNvbGxlY3Rpb24gb2YgZ3JvdXBzLgorICAgICAgICBidW5kbGVNZXRyaWNHcm91cHMtPnB1dFBlcnNpc3RhYmxlQnVuZGxlKE1ha2VJbmRleFN0cmluZyhncm91cEluZGV4KyspLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZU1ldHJpY0dyb3VwKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9Ecm1QbHVnaW5QYXRoLmNwcCBiL2RybS9saWJtZWRpYWRybS9Ecm1QbHVnaW5QYXRoLmNwcAppbmRleCBjNzYwODI1Li5hYzg2MDdjIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vRHJtUGx1Z2luUGF0aC5jcHAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL0RybVBsdWdpblBhdGguY3BwCkBAIC0xOSw3ICsxOSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPG1lZGlhL0RybVBsdWdpblBhdGguaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9Ecm1QbHVnaW5QYXRoLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0RybVNlc3Npb25NYW5hZ2VyLmNwcCBiL2RybS9saWJtZWRpYWRybS9Ecm1TZXNzaW9uTWFuYWdlci5jcHAKaW5kZXggMDIyNzBkMC4uMzc1NjQ0YyAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL0RybVNlc3Npb25NYW5hZ2VyLmNwcAorKysgYi9kcm0vbGlibWVkaWFkcm0vRHJtU2Vzc2lvbk1hbmFnZXIuY3BwCkBAIC0yMSw5ICsyMSw5IEBACiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQcm9jZXNzSW5mb1NlcnZpY2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvRHJtU2Vzc2lvbk1hbmFnZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9Ecm1TZXNzaW9uQ2xpZW50SW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvUHJvY2Vzc0luZm8uaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9Ecm1TZXNzaW9uQ2xpZW50SW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vRHJtU2Vzc2lvbk1hbmFnZXIuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9JQ3J5cHRvLmNwcCBiL2RybS9saWJtZWRpYWRybS9JQ3J5cHRvLmNwcAppbmRleCAxZDcwYTRlLi43M2VjZGExIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vSUNyeXB0by5jcHAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL0lDcnlwdG8uY3BwCkBAIC0xOSwxMCArMTksMTAgQEAKICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KICNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9JQ3J5cHRvLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTM0MSwxMCArMzQxLDEwIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSAqc3ViU2FtcGxlcyA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBDcnlwdG9QbHVnaW46OlN1YlNhbXBsZVtudW1TdWJTYW1wbGVzXTsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDcnlwdG9QbHVnaW46OlN1YlNhbXBsZVtdPiBzdWJTYW1wbGVzID0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxDcnlwdG9QbHVnaW46OlN1YlNhbXBsZVtdPihudW1TdWJTYW1wbGVzKTsKIAotICAgICAgICAgICAgZGF0YS5yZWFkKHN1YlNhbXBsZXMsCisgICAgICAgICAgICBkYXRhLnJlYWQoc3ViU2FtcGxlcy5nZXQoKSwKICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKENyeXB0b1BsdWdpbjo6U3ViU2FtcGxlKSAqIG51bVN1YlNhbXBsZXMpOwogCiAgICAgICAgICAgICBEZXN0aW5hdGlvbkJ1ZmZlciBkZXN0aW5hdGlvbjsKQEAgLTQwMiw3ICs0MDIsNyBAQAogICAgICAgICAgICAgICAgIHJlc3VsdCA9IC1FSU5WQUw7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHJlc3VsdCA9IGRlY3J5cHQoa2V5LCBpdiwgbW9kZSwgcGF0dGVybiwgc291cmNlLCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdWJTYW1wbGVzLCBudW1TdWJTYW1wbGVzLCBkZXN0aW5hdGlvbiwgJmVycm9yRGV0YWlsTXNnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1YlNhbXBsZXMuZ2V0KCksIG51bVN1YlNhbXBsZXMsIGRlc3RpbmF0aW9uLCAmZXJyb3JEZXRhaWxNc2cpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOwpAQCAtNDIxLDkgKzQyMSw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBkZWxldGVbXSBzdWJTYW1wbGVzOwotICAgICAgICAgICAgc3ViU2FtcGxlcyA9IE5VTEw7Ci0KKyAgICAgICAgICAgIHN1YlNhbXBsZXMucmVzZXQoKTsKICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vSURybS5jcHAgYi9kcm0vbGlibWVkaWFkcm0vSURybS5jcHAKaW5kZXggOGZmNmU2YS4uNTA5OTYxZiAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL0lEcm0uY3BwCisrKyBiL2RybS9saWJtZWRpYWRybS9JRHJtLmNwcApAQCAtMTksMTAgKzE5LDEwIEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSURybS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9JRHJtLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNDYsNiArNDYsNyBAQAogICAgIEdFVF9QUk9QRVJUWV9CWVRFX0FSUkFZLAogICAgIFNFVF9QUk9QRVJUWV9TVFJJTkcsCiAgICAgU0VUX1BST1BFUlRZX0JZVEVfQVJSQVksCisgICAgR0VUX01FVFJJQ1MsCiAgICAgU0VUX0NJUEhFUl9BTEdPUklUSE0sCiAgICAgU0VUX01BQ19BTEdPUklUSE0sCiAgICAgRU5DUllQVCwKQEAgLTU1LDcgKzU2LDEyIEBACiAgICAgVkVSSUZZLAogICAgIFNFVF9MSVNURU5FUiwKICAgICBHRVRfU0VDVVJFX1NUT1AsCi0gICAgUkVMRUFTRV9BTExfU0VDVVJFX1NUT1BTCisgICAgUkVNT1ZFX0FMTF9TRUNVUkVfU1RPUFMsCisgICAgR0VUX0hEQ1BfTEVWRUxTLAorICAgIEdFVF9OVU1CRVJfT0ZfU0VTU0lPTlMsCisgICAgR0VUX1NFQ1VSSVRZX0xFVkVMLAorICAgIFJFTU9WRV9TRUNVUkVfU1RPUCwKKyAgICBHRVRfU0VDVVJFX1NUT1BfSURTCiB9OwogCiBzdHJ1Y3QgQnBEcm0gOiBwdWJsaWMgQnBJbnRlcmZhY2U8SURybT4gewpAQCAtMTE0LDkgKzEyMCwxMSBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuU2Vzc2lvbihWZWN0b3I8dWludDhfdD4gJnNlc3Npb25JZCkgeworICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlblNlc3Npb24oRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIHNlY3VyaXR5TGV2ZWwsCisgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJnNlc3Npb25JZCkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoc2VjdXJpdHlMZXZlbCk7CiAKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KE9QRU5fU0VTU0lPTiwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgewpAQCAtMjk3LDYgKzMwNSwyNSBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cmVTdG9wSWRzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+ID4gJnNlY3VyZVN0b3BJZHMpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1NFQ1VSRV9TVE9QX0lEUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorCisgICAgICAgIHNlY3VyZVN0b3BJZHMuY2xlYXIoKTsKKyAgICAgICAgdWludDMyX3QgY291bnQgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gc2VjdXJlU3RvcElkOworICAgICAgICAgICAgcmVhZFZlY3RvcihyZXBseSwgc2VjdXJlU3RvcElkKTsKKyAgICAgICAgICAgIHNlY3VyZVN0b3BJZHMucHVzaF9iYWNrKHNlY3VyZVN0b3BJZCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgIH0KKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNzaWQsIFZlY3Rvcjx1aW50OF90PiAmc2VjdXJlU3RvcCkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwpAQCAtMzI0LDExICszNTEsMjQgQEAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUFsbFNlY3VyZVN0b3BzKCkgeworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlU2VjdXJlU3RvcChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNzaWQpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKIAotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoUkVMRUFTRV9BTExfU0VDVVJFX1NUT1BTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICB3cml0ZVZlY3RvcihkYXRhLCBzc2lkKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFJFTU9WRV9TRUNVUkVfU1RPUCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUFsbFNlY3VyZVN0b3BzKCkgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChSRU1PVkVfQUxMX1NFQ1VSRV9TVE9QUywgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgewogICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgfQpAQCAtMzUwLDYgKzM5MCw2NSBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRIZGNwTGV2ZWxzKERybVBsdWdpbjo6SGRjcExldmVsICpjb25uZWN0ZWQsCisgICAgICAgICAgICBEcm1QbHVnaW46OkhkY3BMZXZlbCAqbWF4KSBjb25zdCB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKworICAgICAgICBpZiAoY29ubmVjdGVkID09IE5VTEwgfHwgbWF4ID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0hEQ1BfTEVWRUxTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisKKyAgICAgICAgKmNvbm5lY3RlZCA9IHN0YXRpY19jYXN0PERybVBsdWdpbjo6SGRjcExldmVsPihyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgICptYXggPSBzdGF0aWNfY2FzdDxEcm1QbHVnaW46OkhkY3BMZXZlbD4ocmVwbHkucmVhZEludDMyKCkpOworICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXROdW1iZXJPZlNlc3Npb25zKHVpbnQzMl90ICpvcGVuLCB1aW50MzJfdCAqbWF4KSBjb25zdCB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKworICAgICAgICBpZiAob3BlbiA9PSBOVUxMIHx8IG1heCA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9OVU1CRVJfT0ZfU0VTU0lPTlMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKworICAgICAgICAqb3BlbiA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAqbWF4ID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyaXR5TGV2ZWwoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCisgICAgICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgKmxldmVsKSBjb25zdCB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKworICAgICAgICBpZiAobGV2ZWwgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworCisgICAgICAgIHdyaXRlVmVjdG9yKGRhdGEsIHNlc3Npb25JZCk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfU0VDVVJJVFlfTEVWRUwsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKworICAgICAgICAqbGV2ZWwgPSBzdGF0aWNfY2FzdDxEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWw+KHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgIH0KKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvcGVydHlCeXRlQXJyYXkoU3RyaW5nOCBjb25zdCAmbmFtZSwgVmVjdG9yPHVpbnQ4X3Q+ICZ2YWx1ZSkgY29uc3QgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwpAQCAtMzkzLDYgKzQ5MiwzNSBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRyaWNzKG9zOjpQZXJzaXN0YWJsZUJ1bmRsZSAqbWV0cmljcykgeworICAgICAgICBpZiAobWV0cmljcyA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9NRVRSSUNTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIC8vIFRoZSByZXBseSBkYXRhIGlzIG9yZGVyZWQgYXMKKyAgICAgICAgLy8gMSkgMzIgYml0IGludGVnZXIgcmVwbHkgZm9sbG93ZWQgYnkKKyAgICAgICAgLy8gMikgU2VyaWFsaXplZCBQZXJzaXN0YWJsZUJ1bmRsZSBjb250YWluaW5nIG1ldHJpY3MuCisgICAgICAgIHN0YXR1c190IHJlcGx5X3N0YXR1czsKKyAgICAgICAgaWYgKHJlcGx5LnJlYWRJbnQzMigmcmVwbHlfc3RhdHVzKSAhPSBPSworICAgICAgICAgICB8fCByZXBseV9zdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJlYWQgZ2V0TWV0cmljcyByZXNwb25zZSBjb2RlIGZyb20gcGFyY2VsLiAlZCIsCisgICAgICAgICAgICAgICAgcmVwbHlfc3RhdHVzKTsKKyAgICAgICAgICByZXR1cm4gcmVwbHlfc3RhdHVzOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzID0gbWV0cmljcy0+cmVhZEZyb21QYXJjZWwoJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZWFkIG1ldHJpY3MgZnJvbSBwYXJjZWwuICVkIiwgc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlcGx5X3N0YXR1czsKKyAgICB9CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldENpcGhlckFsZ29yaXRobShWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGNvbnN0ICZhbGdvcml0aG0pIHsKQEAgLTYxNSw4ICs3NDMsMTAgQEAKICAgICAgICAgY2FzZSBPUEVOX1NFU1NJT046CiAgICAgICAgIHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgbGV2ZWwgPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWw+KGRhdGEucmVhZEludDMyKCkpOwogICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZDsKLSAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IG9wZW5TZXNzaW9uKHNlc3Npb25JZCk7CisgICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBvcGVuU2Vzc2lvbihsZXZlbCwgc2Vzc2lvbklkKTsKICAgICAgICAgICAgIHdyaXRlVmVjdG9yKHJlcGx5LCBzZXNzaW9uSWQpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzdWx0KTsKICAgICAgICAgICAgIHJldHVybiBPSzsKQEAgLTc2MSw2ICs4OTEsMjQgQEAKICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgR0VUX1NFQ1VSRV9TVE9QX0lEUzoKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm0sIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIExpc3Q8VmVjdG9yPHVpbnQ4X3Q+ID4gc2VjdXJlU3RvcElkczsKKyAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IGdldFNlY3VyZVN0b3BJZHMoc2VjdXJlU3RvcElkcyk7CisgICAgICAgICAgICBzaXplX3QgY291bnQgPSBzZWN1cmVTdG9wSWRzLnNpemUoKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGNvdW50KTsKKyAgICAgICAgICAgIExpc3Q8VmVjdG9yPHVpbnQ4X3Q+ID46Oml0ZXJhdG9yIGl0ZXIgPSBzZWN1cmVTdG9wSWRzLmJlZ2luKCk7CisgICAgICAgICAgICB3aGlsZShpdGVyICE9IHNlY3VyZVN0b3BJZHMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IGl0ZXItPnNpemUoKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzaXplKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUoaXRlci0+YXJyYXkoKSwgaXRlci0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBpdGVyKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBHRVRfU0VDVVJFX1NUT1A6CiAgICAgICAgIHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtLCBkYXRhLCByZXBseSk7CkBAIC03ODEsMTAgKzkyOSw1NCBAQAogICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9CiAKLSAgICAgICAgY2FzZSBSRUxFQVNFX0FMTF9TRUNVUkVfU1RPUFM6CisgICAgICAgIGNhc2UgUkVNT1ZFX1NFQ1VSRV9TVE9QOgogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVsZWFzZUFsbFNlY3VyZVN0b3BzKCkpOworICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IHNzaWQ7CisgICAgICAgICAgICByZWFkVmVjdG9yKGRhdGEsIHNzaWQpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVtb3ZlU2VjdXJlU3RvcChzc2lkKSk7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFJFTU9WRV9BTExfU0VDVVJFX1NUT1BTOgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVtb3ZlQWxsU2VjdXJlU3RvcHMoKSk7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEdFVF9IRENQX0xFVkVMUzoKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm0sIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIERybVBsdWdpbjo6SGRjcExldmVsIGNvbm5lY3RlZCA9IERybVBsdWdpbjo6a0hkY3BMZXZlbFVua25vd247CisgICAgICAgICAgICBEcm1QbHVnaW46OkhkY3BMZXZlbCBtYXggPSBEcm1QbHVnaW46OmtIZGNwTGV2ZWxVbmtub3duOworICAgICAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gZ2V0SGRjcExldmVscygmY29ubmVjdGVkLCAmbWF4KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGNvbm5lY3RlZCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihtYXgpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgR0VUX05VTUJFUl9PRl9TRVNTSU9OUzoKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm0sIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHVpbnQzMl90IG9wZW4gPSAwLCBtYXggPSAwOworICAgICAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gZ2V0TnVtYmVyT2ZTZXNzaW9ucygmb3BlbiwgJm1heCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihvcGVuKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKG1heCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBHRVRfU0VDVVJJVFlfTEVWRUw6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gc2Vzc2lvbklkOworICAgICAgICAgICAgcmVhZFZlY3RvcihkYXRhLCBzZXNzaW9uSWQpOworICAgICAgICAgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIGxldmVsID0gRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbFVua25vd247CisgICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBnZXRTZWN1cml0eUxldmVsKHNlc3Npb25JZCwgJmxldmVsKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGxldmVsKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlc3VsdCk7CiAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIH0KIApAQCAtODI5LDYgKzEwMjEsMjQgQEAKICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgR0VUX01FVFJJQ1M6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtLCBkYXRhLCByZXBseSk7CisKKyAgICAgICAgICAgIG9zOjpQZXJzaXN0YWJsZUJ1bmRsZSBtZXRyaWNzOworICAgICAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gZ2V0TWV0cmljcygmbWV0cmljcyk7CisgICAgICAgICAgICAvLyBUaGUgcmVwbHkgZGF0YSBpcyBvcmRlcmVkIGFzCisgICAgICAgICAgICAvLyAxKSAzMiBiaXQgaW50ZWdlciByZXBseSBmb2xsb3dlZCBieQorICAgICAgICAgICAgLy8gMikgU2VyaWFsaXplZCBQZXJzaXN0YWJsZUJ1bmRsZSBjb250YWluaW5nIG1ldHJpY3MuCisgICAgICAgICAgICAvLyBPbmx5IHdyaXRlIHRoZSBtZXRyaWNzIGlmIHRoZSBnZXRNZXRyaWNzIHJlc3VsdCB3YXMKKyAgICAgICAgICAgIC8vIE9LIGFuZCB3ZSBzdWNjZXNzZnVsbHkgYWRkZWQgdGhlIHN0YXR1cyB0byByZXBseS4KKyAgICAgICAgICAgIHN0YXR1c190IHBhcmNlbF9yZXN1bHQgPSByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOworICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBPSyAmJiBwYXJjZWxfcmVzdWx0ID09IE9LKSB7CisgICAgICAgICAgICAgICAgcGFyY2VsX3Jlc3VsdCA9IG1ldHJpY3Mud3JpdGVUb1BhcmNlbChyZXBseSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcGFyY2VsX3Jlc3VsdDsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgU0VUX0NJUEhFUl9BTEdPUklUSE06CiAgICAgICAgIHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtLCBkYXRhLCByZXBseSk7CmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vSURybUNsaWVudC5jcHAgYi9kcm0vbGlibWVkaWFkcm0vSURybUNsaWVudC5jcHAKaW5kZXggNDQ0MjAxZi4uMzU3ZGU5ZCAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL0lEcm1DbGllbnQuY3BwCisrKyBiL2RybS9saWJtZWRpYWRybS9JRHJtQ2xpZW50LmNwcApAQCAtMjQsNyArMjQsNyBAQAogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KIAogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllckNsaWVudC5oPgotI2luY2x1ZGUgPG1lZGlhL0lEcm1DbGllbnQuaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9JRHJtQ2xpZW50Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0lNZWRpYURybVNlcnZpY2UuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL0lNZWRpYURybVNlcnZpY2UuY3BwCmluZGV4IDg0ODEyZGMuLmYzMjBkMGIgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9JTWVkaWFEcm1TZXJ2aWNlLmNwcAorKysgYi9kcm0vbGlibWVkaWFkcm0vSU1lZGlhRHJtU2VydmljZS5jcHAKQEAgLTIwLDkgKzIwLDkgQEAKIAogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KICNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KLSNpbmNsdWRlIDxtZWRpYS9JRHJtLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSU1lZGlhRHJtU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0lDcnlwdG8uaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9JRHJtLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vSU1lZGlhRHJtU2VydmljZS5oPgogCiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+ICAvLyBmb3Igc3RhdHVzX3QKICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vUGx1Z2luTWV0cmljc1JlcG9ydGluZy5jcHAgYi9kcm0vbGlibWVkaWFkcm0vUGx1Z2luTWV0cmljc1JlcG9ydGluZy5jcHAKaW5kZXggNTdmZjViOC4uNWNiNDhiZiAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuY3BwCisrKyBiL2RybS9saWJtZWRpYWRybS9QbHVnaW5NZXRyaWNzUmVwb3J0aW5nLmNwcApAQCAtMTYsODMgKzE2LDM1IEBACiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiUGx1Z2luTWV0cmljc1JlcG9ydGluZyIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPG1lZGlhL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuaD4KIAotI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAKLSNpbmNsdWRlICJwcm90b3MvcGx1Z2luX21ldHJpY3MucGIuaCIKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIG5hbWVzcGFjZSB7CiAKLXVzaW5nIGFuZHJvaWQ6OmRybV9tZXRyaWNzOjpNZXRyaWNzR3JvdXA7Ci11c2luZyBhbmRyb2lkOjpkcm1fbWV0cmljczo6TWV0cmljc0dyb3VwX01ldHJpYzsKLXVzaW5nIGFuZHJvaWQ6OmRybV9tZXRyaWNzOjpNZXRyaWNzR3JvdXBfTWV0cmljX01ldHJpY1ZhbHVlOworY29uc3RleHByIGNoYXIga1NlcmlhbGl6ZWRNZXRyaWNzRmllbGRbXSA9ICJzZXJpYWxpemVkX21ldHJpY3MiOwogCi1jb25zdCBjaGFyKiBjb25zdCBrUGFyZW50QXR0cmlidXRlID0gIi9wYXJlbnQvZXh0ZXJuYWwiOwotCi1zdGF0dXNfdCByZXBvcnRNZXRyaWNzR3JvdXAoY29uc3QgTWV0cmljc0dyb3VwJiBtZXRyaWNzR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYmF0Y2hOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QqIHBhcmVudElkKSB7Ci0gICAgTWVkaWFBbmFseXRpY3NJdGVtIGFuYWx5dGljc0l0ZW0oYmF0Y2hOYW1lLmNfc3RyKCkpOworc3RhdHVzX3QgcmVwb3J0VmVuZG9yTWV0cmljcyhjb25zdCBzdGQ6OnN0cmluZyYgbWV0cmljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYXBwUGFja2FnZU5hbWUpIHsKKyAgICBNZWRpYUFuYWx5dGljc0l0ZW0gYW5hbHl0aWNzSXRlbShuYW1lLmNfc3RyKCkpOwogICAgIGFuYWx5dGljc0l0ZW0uZ2VuZXJhdGVTZXNzaW9uSUQoKTsKLSAgICBpbnQ2NF90IHNlc3Npb25JZCA9IGFuYWx5dGljc0l0ZW0uZ2V0U2Vzc2lvbklEKCk7Ci0gICAgaWYgKHBhcmVudElkICE9IE5VTEwpIHsKLSAgICAgICAgYW5hbHl0aWNzSXRlbS5zZXRJbnQ2NChrUGFyZW50QXR0cmlidXRlLCAqcGFyZW50SWQpOworCisgICAgc3RkOjpzdHJpbmcgYXBwX3BhY2thZ2VfbmFtZShhcHBQYWNrYWdlTmFtZS5jX3N0cigpLCBhcHBQYWNrYWdlTmFtZS5zaXplKCkpOworICAgIGFuYWx5dGljc0l0ZW0uc2V0UGtnTmFtZShhcHBfcGFja2FnZV9uYW1lKTsKKyAgICBpZiAobWV0cmljcy5zaXplKCkgPiAwKSB7CisgICAgICAgIGFuYWx5dGljc0l0ZW0uc2V0Q1N0cmluZyhrU2VyaWFsaXplZE1ldHJpY3NGaWVsZCwgbWV0cmljcy5jX3N0cigpKTsKICAgICB9CiAKLSAgICAvLyBSZXBvcnQgdGhlIHBhY2thZ2UgbmFtZS4KLSAgICBpZiAobWV0cmljc0dyb3VwLmhhc19hcHBfcGFja2FnZV9uYW1lKCkpIHsKLSAgICAgIEFTdHJpbmcgYXBwX3BhY2thZ2VfbmFtZShtZXRyaWNzR3JvdXAuYXBwX3BhY2thZ2VfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljc0dyb3VwLmFwcF9wYWNrYWdlX25hbWUoKS5zaXplKCkpOwotICAgICAgYW5hbHl0aWNzSXRlbS5zZXRQa2dOYW1lKGFwcF9wYWNrYWdlX25hbWUpOwotICAgIH0KLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0cmljc0dyb3VwLm1ldHJpY19zaXplKCk7ICsraSkgewotICAgICAgICBjb25zdCBNZXRyaWNzR3JvdXBfTWV0cmljJiBtZXRyaWMgPSBtZXRyaWNzR3JvdXAubWV0cmljKGkpOwotICAgICAgICBpZiAoIW1ldHJpYy5oYXNfbmFtZSgpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiTWV0cmljIHdpdGggbm8gbmFtZS4iKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIW1ldHJpYy5oYXNfdmFsdWUoKSkgewotICAgICAgICAgICAgQUxPR0UoIk1ldHJpYyB3aXRoIG5vIHZhbHVlLiIpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IE1ldHJpY3NHcm91cF9NZXRyaWNfTWV0cmljVmFsdWUmIHZhbHVlID0gbWV0cmljLnZhbHVlKCk7Ci0gICAgICAgIGlmICh2YWx1ZS5oYXNfaW50X3ZhbHVlKCkpIHsKLSAgICAgICAgICAgIGFuYWx5dGljc0l0ZW0uc2V0SW50NjQobWV0cmljLm5hbWUoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5pbnRfdmFsdWUoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaGFzX2RvdWJsZV92YWx1ZSgpKSB7Ci0gICAgICAgICAgICBhbmFseXRpY3NJdGVtLnNldERvdWJsZShtZXRyaWMubmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5kb3VibGVfdmFsdWUoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaGFzX3N0cmluZ192YWx1ZSgpKSB7Ci0gICAgICAgICAgICBhbmFseXRpY3NJdGVtLnNldENTdHJpbmcobWV0cmljLm5hbWUoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLnN0cmluZ192YWx1ZSgpLmNfc3RyKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoIk1ldHJpYyBWYWx1ZSB3aXRoIG5vIGFjdHVhbCB2YWx1ZS4iKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBhbmFseXRpY3NJdGVtLnNldEZpbmFsaXplZCh0cnVlKTsKICAgICBpZiAoIWFuYWx5dGljc0l0ZW0uc2VsZnJlY29yZCgpKSB7Ci0gICAgICAvLyBOb3RlIHRoZSBjYXN0IHRvIGludCBpcyBiZWNhdXNlIHdlIGJ1aWxkIG9uIDMyIGFuZCA2NCBiaXQuCi0gICAgICAvLyBUaGUgY2FzdCBwcmV2ZW50cyBhIHBlY3VsaWFyIHByaW50ZiBwcm9ibGVtIHdoZXJlIG9uZSBmb3JtYXQgY2Fubm90Ci0gICAgICAvLyBzYXRpc2Z5IGJvdGguCi0gICAgICBBTE9HRSgic2VsZnJlY29yZCgpIHJldHVybmVkIGZhbHNlLiBzZXNzaW9JZCAlZCIsIChpbnQpIHNlc3Npb25JZCk7Ci0gICAgfQotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRyaWNzR3JvdXAubWV0cmljX3N1Yl9ncm91cF9zaXplKCk7ICsraSkgewotICAgICAgICBjb25zdCBNZXRyaWNzR3JvdXAmIHN1Ykdyb3VwID0gbWV0cmljc0dyb3VwLm1ldHJpY19zdWJfZ3JvdXAoaSk7Ci0gICAgICAgIHN0YXR1c190IHJlcyA9IHJlcG9ydE1ldHJpY3NHcm91cChzdWJHcm91cCwgYmF0Y2hOYW1lLCAmc2Vzc2lvbklkKTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgfQorICAgICAgQUxPR0UoInNlbGZyZWNvcmQoKSByZXR1cm5lZCBmYWxzZS4gc2Vzc2lvSWQgJSIgUFJJZDY0LCBhbmFseXRpY3NJdGVtLmdldFNlc3Npb25JRCgpKTsKICAgICB9CiAKICAgICByZXR1cm4gT0s7CkBAIC0xMTQsMjEgKzY2LDE2IEBACiAKIH0gIC8vIG5hbWVzcGFjZQogCi1zdGF0dXNfdCByZXBvcnREcm1QbHVnaW5NZXRyaWNzKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2VyaWFsaXplZE1ldHJpY3MsCitzdGF0dXNfdCByZXBvcnREcm1QbHVnaW5NZXRyaWNzKGNvbnN0IHN0ZDo6c3RyaW5nJiBiNjRFbmNvZGVkTWV0cmljcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgdmVuZG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBkZXNjcmlwdGlvbikgewotICAgIE1ldHJpY3NHcm91cCByb290X21ldHJpY3NfZ3JvdXA7Ci0gICAgaWYgKCFyb290X21ldHJpY3NfZ3JvdXAuUGFyc2VGcm9tQXJyYXkoc2VyaWFsaXplZE1ldHJpY3MuYXJyYXkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVkTWV0cmljcy5zaXplKCkpKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsdXJlIHRvIHBhcnNlLiIpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgZGVzY3JpcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFwcFBhY2thZ2VOYW1lKSB7CiAKICAgICBTdHJpbmc4IG5hbWUgPSBTdHJpbmc4Ojpmb3JtYXQoImRybS52ZW5kb3IuJXMuJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW5pdGl6ZSh2ZW5kb3IpLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbml0aXplKGRlc2NyaXB0aW9uKS5jX3N0cigpKTsKIAotICAgIHJldHVybiByZXBvcnRNZXRyaWNzR3JvdXAocm9vdF9tZXRyaWNzX2dyb3VwLCBuYW1lLCBOVUxMKTsKKyAgICByZXR1cm4gcmVwb3J0VmVuZG9yTWV0cmljcyhiNjRFbmNvZGVkTWV0cmljcywgbmFtZSwgYXBwUGFja2FnZU5hbWUpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL1NoYXJlZExpYnJhcnkuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL1NoYXJlZExpYnJhcnkuY3BwCmluZGV4IGJlYmFmYTguLmIyZDYzNWQgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9TaGFyZWRMaWJyYXJ5LmNwcAorKysgYi9kcm0vbGlibWVkaWFkcm0vU2hhcmVkTGlicmFyeS5jcHAKQEAgLTE5LDcgKzE5LDcgQEAKIAogI2luY2x1ZGUgPGRsZmNuLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9TaGFyZWRMaWJyYXJ5Lmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vU2hhcmVkTGlicmFyeS5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vcHJvdG9zL21ldHJpY3MucHJvdG8gYi9kcm0vbGlibWVkaWFkcm0vcHJvdG9zL21ldHJpY3MucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE2MGU2ZgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJtZWRpYWRybS9wcm90b3MvbWV0cmljcy5wcm90bwpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3N5bnRheCA9ICJwcm90bzIiOworCitwYWNrYWdlIGFuZHJvaWQuZHJtX21ldHJpY3M7CisKKworLy8gVGhpcyBtZXNzYWdlIGNvbnRhaW5zIHRoZSBzcGVjaWZpYyBtZXRyaWNzIGNhcHR1cmVkIGJ5IERybU1ldHJpY3MuIEl0IGlzCisvLyB1c2VkIGZvciBzZXJpYWxpemluZyBhbmQgbG9nZ2luZyBtZXRyaWNzLgorLy8gbmV4dCBpZDogMTEuCittZXNzYWdlIERybUZyYW1ld29ya01ldHJpY3MgeworICAvLyBUT0RPOiBDb25zaWRlciB1c2luZyBleHRlbnNpb25zLgorCisgIC8vIEF0dHJpYnV0ZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCBhIHJlY29yZGVkIHZhbHVlLiBFLmcuIEEgY291bnRlciBtYXkKKyAgLy8gcmVwcmVzZW50IGEgY291bnQgb2YgYW4gb3BlcmF0aW9uIHJldHVybmluZyBhIHNwZWNpZmljIGVycm9yIGNvZGUuIFRoZQorICAvLyBlcnJvciBjb2RlIHdpbGwgYmUgYW4gYXR0cmlidXRlLgorICBtZXNzYWdlIEF0dHJpYnV0ZXMgeworICAgIC8vIFJlc2VydmVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbG9nZ2luZyBwcm90by4KKyAgICByZXNlcnZlZCAyIHRvIDEzOworCisgICAgLy8gQSBnZW5lcmFsIHB1cnBvc2UgZXJyb3IgY29kZSB3aGVyZSAwIG1lYW5zIE9LLgorICAgIG9wdGlvbmFsIGludDMyIGVycm9yX2NvZGUgPSAxOworCisgICAgLy8gRGVmaW5lZCBhdCA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OktleVN0YXR1c1R5cGU7CisgICAgb3B0aW9uYWwgdWludDMyIGtleV9zdGF0dXNfdHlwZSA9IDE0OworCisgICAgLy8gRGVmaW5lZCBhdCA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OkV2ZW50VHlwZTsKKyAgICBvcHRpb25hbCB1aW50MzIgZXZlbnRfdHlwZSA9IDE1OworICB9CisKKyAgLy8gVGhlIENvdW50ZXIgbWVzc2FnZSBpcyB1c2VkIHRvIHN0b3JlIGEgY291bnQgdmFsdWUgd2l0aCBhbiBhc3NvY2lhdGVkCisgIC8vIEF0dHJpYnV0ZS4KKyAgbWVzc2FnZSBDb3VudGVyIHsKKyAgICBvcHRpb25hbCB1aW50NjQgY291bnQgPSAxOworICAgIC8vIFJlcHJlc2VudHMgdGhlIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY291bnRlciBpbnN0YW5jZS4KKyAgICBvcHRpb25hbCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgPSAyOworICB9CisKKyAgLy8gVGhlIERpc3RyaWJ1dGlvbk1ldHJpYyBpcyBtZWFudCB0byBjYXB0dXJlIHRoZSBtb21lbnRzIG9mIGEgbm9ybWFsbHkKKyAgLy8gZGlzdHJpYnV0ZWQgKG9yIGFwcHJveGltYXRlbHkgbm9ybWFsKSB2YWx1ZS4KKyAgbWVzc2FnZSBEaXN0cmlidXRpb25NZXRyaWMgeworICAgIG9wdGlvbmFsIGZsb2F0IG1pbiA9IDE7CisgICAgb3B0aW9uYWwgZmxvYXQgbWF4ID0gMjsKKyAgICBvcHRpb25hbCBmbG9hdCBtZWFuID0gMzsKKyAgICBvcHRpb25hbCBkb3VibGUgdmFyaWFuY2UgPSA0OworICAgIG9wdGlvbmFsIHVpbnQ2NCBvcGVyYXRpb25fY291bnQgPSA1OworCisgICAgLy8gUmVwcmVzZW50cyB0aGUgYXR0cmlidXRlcyBhc3NvY2F0ZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBtZXRyaWMKKyAgICAvLyBpbnN0YW5jZS4KKyAgICBvcHRpb25hbCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgPSA2OworICB9CisKKyAgbWVzc2FnZSBTZXNzaW9uTGlmZXRpbWUgeworICAgIC8vIFN0YXJ0IHRpbWUgb2YgdGhlIHNlc3Npb24gaW4gbWlsbGlzZWNvbmRzIHNpbmNlIGVwb2NoLgorICAgIG9wdGlvbmFsIHVpbnQ2NCBzdGFydF90aW1lX21zID0gMTsKKyAgICAvLyBFbmQgdGltZSBvZiB0aGUgc2Vzc2lvbiBpbiBtaWxsaXNlY29uZHMgc2luY2UgZXBvY2guCisgICAgb3B0aW9uYWwgdWludDY0IGVuZF90aW1lX21zID0gMjsKKyAgfQorCisgIC8vIFRoZSBjb3VudCBvZiBvcGVuIHNlc3Npb24gb3BlcmF0aW9ucy4gRWFjaCBpbnN0YW5jZSBoYXMgYSBzcGVjaWZpYyBlcnJvcgorICAvLyBjb2RlIGFzc29jaWF0ZWQgd2l0aCBpdC4KKyAgcmVwZWF0ZWQgQ291bnRlciBvcGVuX3Nlc3Npb25fY291bnRlciA9IDE7CisKKyAgLy8gVGhlIGNvdW50IG9mIGNsb3NlIHNlc3Npb24gb3BlcmF0aW9ucy4gRWFjaCBpbnN0YW5jZSBoYXMgYSBzcGVjaWZpYyBlcnJvcgorICAvLyBjb2RlIGFzc29jaWF0ZWQgd2l0aCBpdC4KKyAgcmVwZWF0ZWQgQ291bnRlciBjbG9zZV9zZXNzaW9uX2NvdW50ZXIgPSAyOworCisgIC8vIENvdW50IGFuZCBleGVjdXRpb24gdGltZSBvZiBnZXRLZXlSZXF1ZXN0IGNhbGxzLgorICByZXBlYXRlZCBEaXN0cmlidXRpb25NZXRyaWMgZ2V0X2tleV9yZXF1ZXN0X3RpbWVfdXMgPSAzOworCisgIC8vIENvdW50IGFuZCBleGVjdXRpb24gdGltZSBvZiBwcm92aWRlS2V5UmVzcG9uc2UgY2FsbHMuCisgIHJlcGVhdGVkIERpc3RyaWJ1dGlvbk1ldHJpYyBwcm92aWRlX2tleV9yZXNwb25zZV90aW1lX3VzID0gNDsKKworICAvLyBDb3VudCBvZiBnZXRQcm92aXNpb25SZXF1ZXN0IGNhbGxzLgorICByZXBlYXRlZCBDb3VudGVyIGdldF9wcm92aXNpb25pbmdfcmVxdWVzdF9jb3VudGVyID0gNTsKKworICAvLyBDb3VudCBvZiBwcm92aWRlUHJvdmlzaW9uUmVzcG9uc2UgY2FsbHMuCisgIHJlcGVhdGVkIENvdW50ZXIgcHJvdmlkZV9wcm92aXNpb25pbmdfcmVzcG9uc2VfY291bnRlciA9IDY7CisKKyAgLy8gQ291bnQgb2Yga2V5IHN0YXR1cyBldmVudHMgYnJva2VuIG91dCBieSBzdGF0dXMgdHlwZS4KKyAgcmVwZWF0ZWQgQ291bnRlciBrZXlfc3RhdHVzX2NoYW5nZV9jb3VudGVyID0gNzsKKworICAvLyBDb3VudCBvZiBldmVudHMgYnJva2VuIG91dCBieSBldmVudCB0eXBlCisgIHJlcGVhdGVkIENvdW50ZXIgZXZlbnRfY2FsbGJhY2tfY291bnRlciA9IDg7CisKKyAgLy8gQ291bnQgZ2V0UHJvcGVydHlCeXRlQXJyYXkgY2FsbHMgdG8gcmV0cmlldmUgdGhlIGRldmljZSB1bmlxdWUgaWQuCisgIHJlcGVhdGVkIENvdW50ZXIgZ2V0X2RldmljZV91bmlxdWVfaWRfY291bnRlciA9IDk7CisKKyAgLy8gU2Vzc2lvbiBpZHMgdG8gbGlmZXRpbWUgKHN0YXJ0IGFuZCBlbmQgdGltZSkgbWFwLgorICAvLyBTZXNzaW9uIGlkcyBhcmUgc3RyaW5ncyBvZiBoZXgtZW5jb2RlZCBieXRlIGFycmF5cy4KKyAgbWFwPHN0cmluZywgU2Vzc2lvbkxpZmV0aW1lPiBzZXNzaW9uX2xpZmV0aW1lcyA9IDEwOworfQorCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vcHJvdG9zL3BsdWdpbl9tZXRyaWNzLnByb3RvIGIvZHJtL2xpYm1lZGlhZHJtL3Byb3Rvcy9wbHVnaW5fbWV0cmljcy5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UzYmNmNS4uMDAwMDAwMAotLS0gYS9kcm0vbGlibWVkaWFkcm0vcHJvdG9zL3BsdWdpbl9tZXRyaWNzLnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXN5bnRheCA9ICJwcm90bzIiOwotCi1wYWNrYWdlIGFuZHJvaWQuZHJtX21ldHJpY3M7Ci0KLS8vIG5lZWQgdGhpcyBpZiB3ZSBhcmUgdXNpbmcgbGlicHJvdG9idWYtY3BwLTIuMy4wLWxpdGUKLW9wdGlvbiBvcHRpbWl6ZV9mb3IgPSBMSVRFX1JVTlRJTUU7Ci0KLS8vIFRoZSBNZXRyaWNzR3JvdXAgaXMgYSBjb2xsZWN0aW9uIG9mIG1ldHJpYyBuYW1lL3ZhbHVlIHBhaXIgaW5zdGFuY2VzCi0vLyB0aGF0IGNhbiBiZSBzZXJpYWxpemVkIGFuZCBwcm92aWRlZCB0byBhIGNhbGxlci4KLW1lc3NhZ2UgTWV0cmljc0dyb3VwIHsKLSAgbWVzc2FnZSBNZXRyaWMgewotICAgIG1lc3NhZ2UgTWV0cmljVmFsdWUgewotICAgICAgLy8gRXhhY3RseSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMgbXVzdCBiZSBzZXQuCi0gICAgICBvcHRpb25hbCBpbnQ2NCBpbnRfdmFsdWUgPSAxOwotICAgICAgb3B0aW9uYWwgZG91YmxlIGRvdWJsZV92YWx1ZSA9IDI7Ci0gICAgICBvcHRpb25hbCBzdHJpbmcgc3RyaW5nX3ZhbHVlID0gMzsKLSAgICB9Ci0KLSAgICAvLyBUaGUgbmFtZSBvZiB0aGUgbWV0cmljLiBNdXN0IGJlIHZhbGlkIFVURi04LiBSZXF1aXJlZC4KLSAgICBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7Ci0KLSAgICAvLyBUaGUgdmFsdWUgb2YgdGhlIG1ldHJpYy4gUmVxdWlyZWQuCi0gICAgb3B0aW9uYWwgTWV0cmljVmFsdWUgdmFsdWUgPSAyOwotICB9Ci0KLSAgLy8gVGhlIGxpc3Qgb2YgbmFtZS92YWx1ZSBwYWlycyBvZiBtZXRyaWNzLgotICByZXBlYXRlZCBNZXRyaWMgbWV0cmljID0gMTsKLQotICAvLyBBbGxvdyBtdWx0aXBsZSBzdWIgZ3JvdXBzIG9mIG1ldHJpY3MuCi0gIHJlcGVhdGVkIE1ldHJpY3NHcm91cCBtZXRyaWNfc3ViX2dyb3VwID0gMjsKLQotICAvLyBOYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWV0cmljcy4KLSAgb3B0aW9uYWwgc3RyaW5nIGFwcF9wYWNrYWdlX25hbWUgPSAzOwotfQpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0FuZHJvaWQuYnAgYi9kcm0vbGlibWVkaWFkcm0vdGVzdHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmM5MDZmCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1MyBAQAorLy8gQnVpbGQgZGVmaW5pdGlvbnMgZm9yIHVuaXQgdGVzdHMuCisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJDb3VudGVyTWV0cmljX3Rlc3QiLAorICAgIHNyY3M6IFsiQ291bnRlck1ldHJpY190ZXN0LmNwcCJdLAorICAgIHNoYXJlZF9saWJzOiBbImxpYm1lZGlhZHJtIl0sCisgICAgaW5jbHVkZV9kaXJzOiBbImZyYW1ld29ya3MvYXYvaW5jbHVkZS9tZWRpYSJdLAorICAgIGNmbGFnczogWworICAgICAgIi1XZXJyb3IiLAorICAgICAgIi1XYWxsIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiRHJtTWV0cmljc190ZXN0IiwKKyAgICBzcmNzOiBbIkRybU1ldHJpY3NfdGVzdC5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMCIsCisgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xIiwKKyAgICAgICJsaWJiaW5kZXIiLAorICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICJsaWJsb2ciLAorICAgICAgImxpYm1lZGlhZHJtbWV0cmljc19mdWxsIiwKKyAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAorICAgICAgImxpYnByb3RvYnVmLWNwcC1mdWxsIiwKKyAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWyJsaWJnbW9jayJdLAorICAgIGluY2x1ZGVfZGlyczogWworICAgICAgImZyYW1ld29ya3MvYXYvaW5jbHVkZS9tZWRpYSIsCisgICAgXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgLy8gU3VwcHJlc3MgdW51c2VkIHBhcmFtZXRlciBhbmQgbm8gZXJyb3Igb3B0aW9ucy4gVGhlc2UgY2F1c2UgcHJvYmxlbXMKKyAgICAgICAgLy8gd2hlbiB1c2luZyB0aGUgbWFwIHR5cGUgaW4gYSBwcm90byBkZWZpbml0aW9uLgorICAgICAgICAiLVduby11bnVzZWQtcGFyYW1ldGVyIiwKKyAgICAgICAgIi1Xbm8tZXJyb3IiLAorICAgIF0KK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogIkV2ZW50TWV0cmljX3Rlc3QiLAorICAgIHNyY3M6IFsiRXZlbnRNZXRyaWNfdGVzdC5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgImxpYmxvZyIsCisgICAgICAibGlibWVkaWFkcm0iLAorICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorICAgIGluY2x1ZGVfZGlyczogWyJmcmFtZXdvcmtzL2F2L2luY2x1ZGUvbWVkaWEiXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICItV2Vycm9yIiwKKyAgICAgICItV2FsbCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS90ZXN0cy9Db3VudGVyTWV0cmljX3Rlc3QuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0NvdW50ZXJNZXRyaWNfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJjYTBkYQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJtZWRpYWRybS90ZXN0cy9Db3VudGVyTWV0cmljX3Rlc3QuY3BwCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSAiQ291bnRlck1ldHJpYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogVW5pdCB0ZXN0cyBmb3IgdGhlIENvdW50ZXJNZXRyaWMgY2xhc3MuCisgKi8KK2NsYXNzIENvdW50ZXJNZXRyaWNUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Cit9OworCitURVNUX0YoQ291bnRlck1ldHJpY1Rlc3QsIEludERhdGFUeXBlRW1wdHkpIHsKKyAgQ291bnRlck1ldHJpYzxpbnQ+IG1ldHJpYygiTXlNZXRyaWNOYW1lIiwgIk1ldHJpY0F0dHJpYnV0ZU5hbWUiKTsKKworICBzdGQ6Om1hcDxpbnQsIGludDY0X3Q+IHZhbHVlczsKKworICBtZXRyaWMuRXhwb3J0VmFsdWVzKAorICAgICAgWyZdIChpbnQgYXR0cmlidXRlX3ZhbHVlLCBpbnQ2NF90IHZhbHVlKSB7CisgICAgICAgICAgdmFsdWVzW2F0dHJpYnV0ZV92YWx1ZV0gPSB2YWx1ZTsKKyAgICAgIH0pOworCisgIEVYUEVDVF9UUlVFKHZhbHVlcy5lbXB0eSgpKTsKK30KKworVEVTVF9GKENvdW50ZXJNZXRyaWNUZXN0LCBJbnREYXRhVHlwZSkgeworICBDb3VudGVyTWV0cmljPGludD4gbWV0cmljKCJNeU1ldHJpY05hbWUiLCAiTWV0cmljQXR0cmlidXRlTmFtZSIpOworCisgIHN0ZDo6bWFwPGludCwgaW50NjRfdD4gdmFsdWVzOworCisgIG1ldHJpYy5JbmNyZW1lbnQoNyk7CisgIG1ldHJpYy5JbmNyZW1lbnQoOCk7CisgIG1ldHJpYy5JbmNyZW1lbnQoOCk7CisKKyAgbWV0cmljLkV4cG9ydFZhbHVlcygKKyAgICAgIFsmXSAoaW50IGF0dHJpYnV0ZV92YWx1ZSwgaW50NjRfdCB2YWx1ZSkgeworICAgICAgICAgIHZhbHVlc1thdHRyaWJ1dGVfdmFsdWVdID0gdmFsdWU7CisgICAgICB9KTsKKworICBBU1NFUlRfRVEoMnUsIHZhbHVlcy5zaXplKCkpOworICBFWFBFQ1RfRVEoMSwgdmFsdWVzWzddKTsKKyAgRVhQRUNUX0VRKDIsIHZhbHVlc1s4XSk7Cit9CisKK1RFU1RfRihDb3VudGVyTWV0cmljVGVzdCwgU3RyaW5nRGF0YVR5cGUpIHsKKyAgQ291bnRlck1ldHJpYzxzdGQ6OnN0cmluZz4gbWV0cmljKCJNeU1ldHJpY05hbWUiLCAiTWV0cmljQXR0cmlidXRlTmFtZSIpOworCisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ2NF90PiB2YWx1ZXM7CisKKyAgbWV0cmljLkluY3JlbWVudCgiYSIpOworICBtZXRyaWMuSW5jcmVtZW50KCJiIik7CisgIG1ldHJpYy5JbmNyZW1lbnQoImIiKTsKKworICBtZXRyaWMuRXhwb3J0VmFsdWVzKAorICAgICAgWyZdIChzdGQ6OnN0cmluZyBhdHRyaWJ1dGVfdmFsdWUsIGludDY0X3QgdmFsdWUpIHsKKyAgICAgICAgICB2YWx1ZXNbYXR0cmlidXRlX3ZhbHVlXSA9IHZhbHVlOworICAgICAgfSk7CisKKyAgQVNTRVJUX0VRKDJ1LCB2YWx1ZXMuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDEsIHZhbHVlc1siYSJdKTsKKyAgRVhQRUNUX0VRKDIsIHZhbHVlc1siYiJdKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS90ZXN0cy9Ecm1NZXRyaWNzX3Rlc3QuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0RybU1ldHJpY3NfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRhYTlkMAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJtZWRpYWRybS90ZXN0cy9Ecm1NZXRyaWNzX3Rlc3QuY3BwCkBAIC0wLDAgKzEsNDc1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkRybU1ldHJpY3NUZXN0IgorI2luY2x1ZGUgIm1lZGlhZHJtL0RybU1ldHJpY3MuaCIKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMS90eXBlcy5oPgorI2luY2x1ZGUgPGJpbmRlci9QZXJzaXN0YWJsZUJ1bmRsZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXIuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAicHJvdG9zL21ldHJpY3MucGIuaCIKKwordXNpbmcgOjphbmRyb2lkOjpkcm1fbWV0cmljczo6RHJtRnJhbWV3b3JrTWV0cmljczsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpFdmVudFR5cGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OktleVN0YXR1c1R5cGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN0YXR1czsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6RHJtTWV0cmljR3JvdXA7Cit1c2luZyA6OmFuZHJvaWQ6Om9zOjpQZXJzaXN0YWJsZUJ1bmRsZTsKK3VzaW5nIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyOwordXNpbmcgOjpnb29nbGU6OnByb3RvYnVmOjpUZXh0Rm9ybWF0OworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogVW5pdCB0ZXN0cyBmb3IgdGhlIE1lZGlhRHJtTWV0cmljcyBjbGFzcy4KKyAqLworY2xhc3MgTWVkaWFEcm1NZXRyaWNzVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3Qge307CisKKy8qKgorICogVGhpcyBkZXJpdmVkIGNsYXNzIG1vY2tzIHRoZSBjbG9jayBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KKyAqLworY2xhc3MgRmFrZU1lZGlhRHJtTWV0cmljcyA6IHB1YmxpYyBNZWRpYURybU1ldHJpY3MgeworIHB1YmxpYzoKKyAgRmFrZU1lZGlhRHJtTWV0cmljcygpIDogTWVkaWFEcm1NZXRyaWNzKCksIHRpbWVfKDApIHt9OworCisgIGludDY0X3QgR2V0Q3VycmVudFRpbWVNcygpIHsgcmV0dXJuIHRpbWVfKys7IH0KKyAgaW50NjRfdCB0aW1lXzsKK307CisKK1RFU1RfRihNZWRpYURybU1ldHJpY3NUZXN0LCBFbXB0eVN1Y2Nlc3MpIHsKKyAgTWVkaWFEcm1NZXRyaWNzIG1ldHJpY3M7CisgIFBlcnNpc3RhYmxlQnVuZGxlIGJ1bmRsZTsKKworICBtZXRyaWNzLkV4cG9ydCgmYnVuZGxlKTsKKyAgRVhQRUNUX1RSVUUoYnVuZGxlLmVtcHR5KCkpOworfQorCitURVNUX0YoTWVkaWFEcm1NZXRyaWNzVGVzdCwgQWxsVmFsdWVzU3VjY2Vzc0NvdW50cykgeworICBNZWRpYURybU1ldHJpY3MgbWV0cmljczsKKworICBtZXRyaWNzLm1PcGVuU2Vzc2lvbkNvdW50ZXIuSW5jcmVtZW50KE9LKTsKKyAgbWV0cmljcy5tQ2xvc2VTZXNzaW9uQ291bnRlci5JbmNyZW1lbnQoT0spOworCisgIHsKKyAgICBFdmVudFRpbWVyPHN0YXR1c190PiBnZXRfa2V5X3JlcXVlc3RfdGltZXIoJm1ldHJpY3MubUdldEtleVJlcXVlc3RUaW1lVXMpOworICAgIEV2ZW50VGltZXI8c3RhdHVzX3Q+IHByb3ZpZGVfa2V5X3Jlc3BvbnNlX3RpbWVyKAorICAgICAgICAmbWV0cmljcy5tUHJvdmlkZUtleVJlc3BvbnNlVGltZVVzKTsKKyAgICBnZXRfa2V5X3JlcXVlc3RfdGltZXIuU2V0QXR0cmlidXRlKE9LKTsKKyAgICBwcm92aWRlX2tleV9yZXNwb25zZV90aW1lci5TZXRBdHRyaWJ1dGUoT0spOworICB9CisKKyAgbWV0cmljcy5tR2V0UHJvdmlzaW9uUmVxdWVzdENvdW50ZXIuSW5jcmVtZW50KE9LKTsKKyAgbWV0cmljcy5tUHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlQ291bnRlci5JbmNyZW1lbnQoT0spOworICBtZXRyaWNzLm1HZXREZXZpY2VVbmlxdWVJZENvdW50ZXIuSW5jcmVtZW50KE9LKTsKKworICBtZXRyaWNzLm1LZXlTdGF0dXNDaGFuZ2VDb3VudGVyLkluY3JlbWVudChLZXlTdGF0dXNUeXBlOjpVU0FCTEUpOworICBtZXRyaWNzLm1FdmVudENvdW50ZXIuSW5jcmVtZW50KEV2ZW50VHlwZTo6UFJPVklTSU9OX1JFUVVJUkVEKTsKKworICBQZXJzaXN0YWJsZUJ1bmRsZSBidW5kbGU7CisKKyAgbWV0cmljcy5FeHBvcnQoJmJ1bmRsZSk7CisgIEVYUEVDVF9FUSgxMVUsIGJ1bmRsZS5zaXplKCkpOworCisgIC8vIFZlcmlmeSB0aGUgbGlzdCBvZiBwYWlycyBvZiBpbnQ2NCBtZXRyaWNzLgorICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIGludDY0X3Q+PiBleHBlY3RlZF92YWx1ZXMgPSB7CisgICAgICB7ICJkcm0ubWVkaWFkcm0ub3Blbl9zZXNzaW9uLm9rLmNvdW50IiwgMSB9LAorICAgICAgeyAiZHJtLm1lZGlhZHJtLmNsb3NlX3Nlc3Npb24ub2suY291bnQiLCAxIH0sCisgICAgICB7ICJkcm0ubWVkaWFkcm0uZ2V0X2tleV9yZXF1ZXN0Lm9rLmNvdW50IiwgMSB9LAorICAgICAgeyAiZHJtLm1lZGlhZHJtLnByb3ZpZGVfa2V5X3Jlc3BvbnNlLm9rLmNvdW50IiwgMSB9LAorICAgICAgeyAiZHJtLm1lZGlhZHJtLmdldF9wcm92aXNpb25fcmVxdWVzdC5vay5jb3VudCIsIDEgfSwKKyAgICAgIHsgImRybS5tZWRpYWRybS5wcm92aWRlX3Byb3Zpc2lvbl9yZXNwb25zZS5vay5jb3VudCIsIDEgfSwKKyAgICAgIHsgImRybS5tZWRpYWRybS5rZXlfc3RhdHVzX2NoYW5nZS5VU0FCTEUuY291bnQiLCAxIH0sCisgICAgICB7ICJkcm0ubWVkaWFkcm0uZXZlbnQuUFJPVklTSU9OX1JFUVVJUkVELmNvdW50IiwgMSB9LAorICAgICAgeyAiZHJtLm1lZGlhZHJtLmdldF9kZXZpY2VfdW5pcXVlX2lkLm9rLmNvdW50IiwgMSB9fTsKKyAgZm9yIChjb25zdCBhdXRvJiBleHBlY3RlZF9wYWlyIDogZXhwZWN0ZWRfdmFsdWVzKSB7CisgICAgU3RyaW5nMTYga2V5KGV4cGVjdGVkX3BhaXIuZmlyc3QuY19zdHIoKSk7CisgICAgaW50NjRfdCB2YWx1ZSA9IC0xOworICAgIEVYUEVDVF9UUlVFKGJ1bmRsZS5nZXRMb25nKGtleSwgJnZhbHVlKSkKKyAgICAgICAgPDwgIlVuZXhwZWN0ZWQgZXJyb3IgcmV0cmlldmlpbmcga2V5OiAiIDw8IGtleTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRfcGFpci5zZWNvbmQsIHZhbHVlKQorICAgICAgICA8PCAiVW5leHBlY3RlZCB2YWx1ZSBmb3IgIiA8PCBleHBlY3RlZF9wYWlyLmZpcnN0IDw8ICIuICIgPDwgdmFsdWU7CisgIH0KKworICAvLyBWYWxpZGF0ZSB0aW1pbmcgdmFsdWVzIGV4aXN0LgorICBTdHJpbmcxNiBnZXRfa2V5X3JlcXVlc3Rfa2V5KAorICAgICAgImRybS5tZWRpYWRybS5nZXRfa2V5X3JlcXVlc3Qub2suYXZlcmFnZV90aW1lX21pY3JvcyIpOworICBTdHJpbmcxNiBwcm92aWRlX2tleV9yZXNwb25zZV9rZXkoCisgICAgICAiZHJtLm1lZGlhZHJtLnByb3ZpZGVfa2V5X3Jlc3BvbnNlLm9rLmF2ZXJhZ2VfdGltZV9taWNyb3MiKTsKKyAgaW50NjRfdCB2YWx1ZSA9IC0xOworICBFWFBFQ1RfVFJVRShidW5kbGUuZ2V0TG9uZyhnZXRfa2V5X3JlcXVlc3Rfa2V5LCAmdmFsdWUpKTsKKyAgRVhQRUNUX0dFKHZhbHVlLCAwKTsKKyAgdmFsdWUgPSAtMTsKKyAgRVhQRUNUX1RSVUUoYnVuZGxlLmdldExvbmcocHJvdmlkZV9rZXlfcmVzcG9uc2Vfa2V5LCAmdmFsdWUpKTsKKyAgRVhQRUNUX0dFKHZhbHVlLCAwKTsKK30KKworVEVTVF9GKE1lZGlhRHJtTWV0cmljc1Rlc3QsIEFsbFZhbHVlc0Z1bGwpIHsKKyAgTWVkaWFEcm1NZXRyaWNzIG1ldHJpY3M7CisKKyAgbWV0cmljcy5tT3BlblNlc3Npb25Db3VudGVyLkluY3JlbWVudChPSyk7CisgIG1ldHJpY3MubU9wZW5TZXNzaW9uQ291bnRlci5JbmNyZW1lbnQoVU5FWFBFQ1RFRF9OVUxMKTsKKworICBtZXRyaWNzLm1DbG9zZVNlc3Npb25Db3VudGVyLkluY3JlbWVudChPSyk7CisgIG1ldHJpY3MubUNsb3NlU2Vzc2lvbkNvdW50ZXIuSW5jcmVtZW50KFVORVhQRUNURURfTlVMTCk7CisKKyAgZm9yIChzdGF0dXNfdCBzIDoge09LLCBVTkVYUEVDVEVEX05VTEx9KSB7CisgICAgeworICAgICAgRXZlbnRUaW1lcjxzdGF0dXNfdD4gZ2V0X2tleV9yZXF1ZXN0X3RpbWVyKCZtZXRyaWNzLm1HZXRLZXlSZXF1ZXN0VGltZVVzKTsKKyAgICAgIEV2ZW50VGltZXI8c3RhdHVzX3Q+IHByb3ZpZGVfa2V5X3Jlc3BvbnNlX3RpbWVyKAorICAgICAgICAgICZtZXRyaWNzLm1Qcm92aWRlS2V5UmVzcG9uc2VUaW1lVXMpOworICAgICAgZ2V0X2tleV9yZXF1ZXN0X3RpbWVyLlNldEF0dHJpYnV0ZShzKTsKKyAgICAgIHByb3ZpZGVfa2V5X3Jlc3BvbnNlX3RpbWVyLlNldEF0dHJpYnV0ZShzKTsKKyAgICB9CisgIH0KKworICBtZXRyaWNzLm1HZXRQcm92aXNpb25SZXF1ZXN0Q291bnRlci5JbmNyZW1lbnQoT0spOworICBtZXRyaWNzLm1HZXRQcm92aXNpb25SZXF1ZXN0Q291bnRlci5JbmNyZW1lbnQoVU5FWFBFQ1RFRF9OVUxMKTsKKyAgbWV0cmljcy5tUHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlQ291bnRlci5JbmNyZW1lbnQoT0spOworICBtZXRyaWNzLm1Qcm92aWRlUHJvdmlzaW9uUmVzcG9uc2VDb3VudGVyLkluY3JlbWVudChVTkVYUEVDVEVEX05VTEwpOworICBtZXRyaWNzLm1HZXREZXZpY2VVbmlxdWVJZENvdW50ZXIuSW5jcmVtZW50KE9LKTsKKyAgbWV0cmljcy5tR2V0RGV2aWNlVW5pcXVlSWRDb3VudGVyLkluY3JlbWVudChVTkVYUEVDVEVEX05VTEwpOworCisgIG1ldHJpY3MubUtleVN0YXR1c0NoYW5nZUNvdW50ZXIuSW5jcmVtZW50KEtleVN0YXR1c1R5cGU6OlVTQUJMRSk7CisgIG1ldHJpY3MubUtleVN0YXR1c0NoYW5nZUNvdW50ZXIuSW5jcmVtZW50KEtleVN0YXR1c1R5cGU6OkVYUElSRUQpOworICBtZXRyaWNzLm1LZXlTdGF0dXNDaGFuZ2VDb3VudGVyLkluY3JlbWVudChLZXlTdGF0dXNUeXBlOjpPVVRQVVROT1RBTExPV0VEKTsKKyAgbWV0cmljcy5tS2V5U3RhdHVzQ2hhbmdlQ291bnRlci5JbmNyZW1lbnQoS2V5U3RhdHVzVHlwZTo6U1RBVFVTUEVORElORyk7CisgIG1ldHJpY3MubUtleVN0YXR1c0NoYW5nZUNvdW50ZXIuSW5jcmVtZW50KEtleVN0YXR1c1R5cGU6OklOVEVSTkFMRVJST1IpOworICBtZXRyaWNzLm1FdmVudENvdW50ZXIuSW5jcmVtZW50KEV2ZW50VHlwZTo6UFJPVklTSU9OX1JFUVVJUkVEKTsKKyAgbWV0cmljcy5tRXZlbnRDb3VudGVyLkluY3JlbWVudChFdmVudFR5cGU6OktFWV9ORUVERUQpOworICBtZXRyaWNzLm1FdmVudENvdW50ZXIuSW5jcmVtZW50KEV2ZW50VHlwZTo6S0VZX0VYUElSRUQpOworICBtZXRyaWNzLm1FdmVudENvdW50ZXIuSW5jcmVtZW50KEV2ZW50VHlwZTo6VkVORE9SX0RFRklORUQpOworICBtZXRyaWNzLm1FdmVudENvdW50ZXIuSW5jcmVtZW50KEV2ZW50VHlwZTo6U0VTU0lPTl9SRUNMQUlNRUQpOworCisgIGFuZHJvaWQ6OlZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWQxOworICBzZXNzaW9uSWQxLnB1c2hfYmFjaygxKTsKKyAgc2Vzc2lvbklkMS5wdXNoX2JhY2soMik7CisgIGFuZHJvaWQ6OlZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWQyOworICBzZXNzaW9uSWQyLnB1c2hfYmFjaygzKTsKKyAgc2Vzc2lvbklkMi5wdXNoX2JhY2soNCk7CisgIFN0cmluZzE2IGhleFNlc3Npb25JZDEoIjAxMDIiKTsKKyAgU3RyaW5nMTYgaGV4U2Vzc2lvbklkMigiMDMwNCIpOworCisgIG1ldHJpY3MuU2V0U2Vzc2lvblN0YXJ0KHNlc3Npb25JZDEpOworICBtZXRyaWNzLlNldFNlc3Npb25TdGFydChzZXNzaW9uSWQyKTsKKyAgbWV0cmljcy5TZXRTZXNzaW9uRW5kKHNlc3Npb25JZDIpOworICBtZXRyaWNzLlNldFNlc3Npb25FbmQoc2Vzc2lvbklkMSk7CisKKyAgUGVyc2lzdGFibGVCdW5kbGUgYnVuZGxlOworICBtZXRyaWNzLkV4cG9ydCgmYnVuZGxlKTsKKyAgRVhQRUNUX0VRKDM1VSwgYnVuZGxlLnNpemUoKSk7CisKKyAgLy8gVmVyaWZ5IHRoZSBsaXN0IG9mIHBhaXJzIG9mIGludDY0IG1ldHJpY3MuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgaW50NjRfdD4+IGV4cGVjdGVkX3ZhbHVlcyA9IHsKKyAgICAgIHsgImRybS5tZWRpYWRybS5vcGVuX3Nlc3Npb24ub2suY291bnQiLCAxIH0sCisgICAgICB7ICJkcm0ubWVkaWFkcm0uY2xvc2Vfc2Vzc2lvbi5vay5jb3VudCIsIDEgfSwKKyAgICAgIHsgImRybS5tZWRpYWRybS5nZXRfa2V5X3JlcXVlc3Qub2suY291bnQiLCAxIH0sCisgICAgICB7ICJkcm0ubWVkaWFkcm0ucHJvdmlkZV9rZXlfcmVzcG9uc2Uub2suY291bnQiLCAxIH0sCisgICAgICB7ICJkcm0ubWVkaWFkcm0uZ2V0X3Byb3Zpc2lvbl9yZXF1ZXN0Lm9rLmNvdW50IiwgMSB9LAorICAgICAgeyAiZHJtLm1lZGlhZHJtLnByb3ZpZGVfcHJvdmlzaW9uX3Jlc3BvbnNlLm9rLmNvdW50IiwgMSB9LAorICAgICAgeyAiZHJtLm1lZGlhZHJtLmdldF9kZXZpY2VfdW5pcXVlX2lkLm9rLmNvdW50IiwgMSB9LAorICAgICAgeyAiZHJtLm1lZGlhZHJtLm9wZW5fc2Vzc2lvbi5lcnJvci5jb3VudCIsIDEgfSwKKyAgICAgIHsgImRybS5tZWRpYWRybS5jbG9zZV9zZXNzaW9uLmVycm9yLmNvdW50IiwgMSB9LAorICAgICAgeyAiZHJtLm1lZGlhZHJtLmdldF9rZXlfcmVxdWVzdC5lcnJvci5jb3VudCIsIDEgfSwKKyAgICAgIHsgImRybS5tZWRpYWRybS5wcm92aWRlX2tleV9yZXNwb25zZS5lcnJvci5jb3VudCIsIDEgfSwKKyAgICAgIHsgImRybS5tZWRpYWRybS5nZXRfcHJvdmlzaW9uX3JlcXVlc3QuZXJyb3IuY291bnQiLCAxIH0sCisgICAgICB7ICJkcm0ubWVkaWFkcm0ucHJvdmlkZV9wcm92aXNpb25fcmVzcG9uc2UuZXJyb3IuY291bnQiLCAxIH0sCisgICAgICB7ICJkcm0ubWVkaWFkcm0uZ2V0X2RldmljZV91bmlxdWVfaWQuZXJyb3IuY291bnQiLCAxIH0sCisgICAgICB7ICJkcm0ubWVkaWFkcm0ua2V5X3N0YXR1c19jaGFuZ2UuVVNBQkxFLmNvdW50IiwgMSB9LAorICAgICAgeyAiZHJtLm1lZGlhZHJtLmtleV9zdGF0dXNfY2hhbmdlLkVYUElSRUQuY291bnQiLCAxIH0sCisgICAgICB7ICJkcm0ubWVkaWFkcm0ua2V5X3N0YXR1c19jaGFuZ2UuT1VUUFVUX05PVF9BTExPV0VELmNvdW50IiwgMSB9LAorICAgICAgeyAiZHJtLm1lZGlhZHJtLmtleV9zdGF0dXNfY2hhbmdlLlNUQVRVU19QRU5ESU5HLmNvdW50IiwgMSB9LAorICAgICAgeyAiZHJtLm1lZGlhZHJtLmtleV9zdGF0dXNfY2hhbmdlLklOVEVSTkFMX0VSUk9SLmNvdW50IiwgMSB9LAorICAgICAgeyAiZHJtLm1lZGlhZHJtLmV2ZW50LlBST1ZJU0lPTl9SRVFVSVJFRC5jb3VudCIsIDEgfSwKKyAgICAgIHsgImRybS5tZWRpYWRybS5ldmVudC5LRVlfTkVFREVELmNvdW50IiwgMSB9LAorICAgICAgeyAiZHJtLm1lZGlhZHJtLmV2ZW50LktFWV9FWFBJUkVELmNvdW50IiwgMSB9LAorICAgICAgeyAiZHJtLm1lZGlhZHJtLmV2ZW50LlZFTkRPUl9ERUZJTkVELmNvdW50IiwgMSB9LAorICAgICAgeyAiZHJtLm1lZGlhZHJtLmV2ZW50LlNFU1NJT05fUkVDTEFJTUVELmNvdW50IiwgMSB9fTsKKyAgZm9yIChjb25zdCBhdXRvJiBleHBlY3RlZF9wYWlyIDogZXhwZWN0ZWRfdmFsdWVzKSB7CisgICAgU3RyaW5nMTYga2V5KGV4cGVjdGVkX3BhaXIuZmlyc3QuY19zdHIoKSk7CisgICAgaW50NjRfdCB2YWx1ZSA9IC0xOworICAgIEVYUEVDVF9UUlVFKGJ1bmRsZS5nZXRMb25nKGtleSwgJnZhbHVlKSkKKyAgICAgICAgPDwgIlVuZXhwZWN0ZWQgZXJyb3IgcmV0cmlldmlpbmcga2V5OiAiIDw8IGtleTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRfcGFpci5zZWNvbmQsIHZhbHVlKQorICAgICAgICA8PCAiVW5leHBlY3RlZCB2YWx1ZSBmb3IgIiA8PCBleHBlY3RlZF9wYWlyLmZpcnN0IDw8ICIuICIgPDwgdmFsdWU7CisgIH0KKworICAvLyBWZXJpZnkgdGhlIGVycm9yIGxpc3RzCisgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3I8aW50NjRfdD4+PiBleHBlY3RlZF92ZWN0b3JfdmFsdWVzID0geworICAgICAgeyAiZHJtLm1lZGlhZHJtLmNsb3NlX3Nlc3Npb24uZXJyb3IubGlzdCIsIHsgVU5FWFBFQ1RFRF9OVUxMIH0gfSwKKyAgICAgIHsgImRybS5tZWRpYWRybS5nZXRfZGV2aWNlX3VuaXF1ZV9pZC5lcnJvci5saXN0IiwgeyBVTkVYUEVDVEVEX05VTEwgfSB9LAorICAgICAgeyAiZHJtLm1lZGlhZHJtLmdldF9rZXlfcmVxdWVzdC5lcnJvci5saXN0IiwgeyBVTkVYUEVDVEVEX05VTEwgfSB9LAorICAgICAgeyAiZHJtLm1lZGlhZHJtLmdldF9wcm92aXNpb25fcmVxdWVzdC5lcnJvci5saXN0IiwgeyBVTkVYUEVDVEVEX05VTEwgfSB9LAorICAgICAgeyAiZHJtLm1lZGlhZHJtLm9wZW5fc2Vzc2lvbi5lcnJvci5saXN0IiwgeyBVTkVYUEVDVEVEX05VTEwgfSB9LAorICAgICAgeyAiZHJtLm1lZGlhZHJtLnByb3ZpZGVfa2V5X3Jlc3BvbnNlLmVycm9yLmxpc3QiLCB7IFVORVhQRUNURURfTlVMTCB9IH0sCisgICAgICB7ICJkcm0ubWVkaWFkcm0ucHJvdmlkZV9wcm92aXNpb25fcmVzcG9uc2UuZXJyb3IubGlzdCIsIHsgVU5FWFBFQ1RFRF9OVUxMIH0gfX07CisgIGZvciAoY29uc3QgYXV0byYgZXhwZWN0ZWRfcGFpciA6IGV4cGVjdGVkX3ZlY3Rvcl92YWx1ZXMpIHsKKyAgICBTdHJpbmcxNiBrZXkoZXhwZWN0ZWRfcGFpci5maXJzdC5jX3N0cigpKTsKKyAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiB2YWx1ZXM7CisgICAgRVhQRUNUX1RSVUUoYnVuZGxlLmdldExvbmdWZWN0b3Ioa2V5LCAmdmFsdWVzKSkKKyAgICAgICAgPDwgIlVuZXhwZWN0ZWQgZXJyb3IgcmV0cmlldmlpbmcga2V5OiAiIDw8IGtleTsKKyAgICBmb3IgKGF1dG8gZXhwZWN0ZWQgOiBleHBlY3RlZF9wYWlyLnNlY29uZCkgeworICAgICAgRVhQRUNUX1RSVUUoc3RkOjpmaW5kKHZhbHVlcy5iZWdpbigpLCB2YWx1ZXMuZW5kKCksIGV4cGVjdGVkKSAhPSB2YWx1ZXMuZW5kKCkpCisgICAgICAgICAgPDwgIkNvdWxkIG5vdCBmaW5kICIgPDwgZXhwZWN0ZWQgPDwgIiBmb3Iga2V5ICIgPDwgZXhwZWN0ZWRfcGFpci5maXJzdDsKKyAgICB9CisgIH0KKworICAvLyBWZXJpZnkgdGhlIGxpZmVzcGFucworICBQZXJzaXN0YWJsZUJ1bmRsZSBzdGFydF90aW1lczsKKyAgUGVyc2lzdGFibGVCdW5kbGUgZW5kX3RpbWVzOworICBTdHJpbmcxNiBzdGFydF90aW1lX2tleSgiZHJtLm1lZGlhZHJtLnNlc3Npb25fc3RhcnRfdGltZXNfbXMiKTsKKyAgU3RyaW5nMTYgZW5kX3RpbWVfa2V5KCJkcm0ubWVkaWFkcm0uc2Vzc2lvbl9lbmRfdGltZXNfbXMiKTsKKyAgQVNTRVJUX1RSVUUoYnVuZGxlLmdldFBlcnNpc3RhYmxlQnVuZGxlKHN0YXJ0X3RpbWVfa2V5LCAmc3RhcnRfdGltZXMpKTsKKyAgQVNTRVJUX1RSVUUoYnVuZGxlLmdldFBlcnNpc3RhYmxlQnVuZGxlKGVuZF90aW1lX2tleSwgJmVuZF90aW1lcykpOworICBFWFBFQ1RfRVEoMlUsIHN0YXJ0X3RpbWVzLnNpemUoKSk7CisgIEVYUEVDVF9FUSgyVSwgZW5kX3RpbWVzLnNpemUoKSk7CisgIGludDY0X3Qgc3RhcnRfdGltZSwgZW5kX3RpbWU7CisgIGZvciAoY29uc3QgYXV0byYgc2lkIDogeyBoZXhTZXNzaW9uSWQxLCBoZXhTZXNzaW9uSWQyIH0pIHsKKyAgICBzdGFydF90aW1lID0gLTE7CisgICAgZW5kX3RpbWUgPSAtMTsKKyAgICBFWFBFQ1RfVFJVRShzdGFydF90aW1lcy5nZXRMb25nKHNpZCwgJnN0YXJ0X3RpbWUpKTsKKyAgICBFWFBFQ1RfVFJVRShlbmRfdGltZXMuZ2V0TG9uZyhzaWQsICZlbmRfdGltZSkpOworICAgIEVYUEVDVF9HVChzdGFydF90aW1lLCAwKTsKKyAgICBFWFBFQ1RfR0UoZW5kX3RpbWUsIHN0YXJ0X3RpbWUpOworICB9CisKKyAgLy8gVmFsaWRhdGUgdGltaW5nIHZhbHVlcyBleGlzdC4KKyAgU3RyaW5nMTYgZ2V0X2tleV9yZXF1ZXN0X2tleSgKKyAgICAgICJkcm0ubWVkaWFkcm0uZ2V0X2tleV9yZXF1ZXN0Lm9rLmF2ZXJhZ2VfdGltZV9taWNyb3MiKTsKKyAgU3RyaW5nMTYgcHJvdmlkZV9rZXlfcmVzcG9uc2Vfa2V5KAorICAgICAgImRybS5tZWRpYWRybS5wcm92aWRlX2tleV9yZXNwb25zZS5vay5hdmVyYWdlX3RpbWVfbWljcm9zIik7CisgIGludDY0X3QgdmFsdWUgPSAtMTsKKyAgRVhQRUNUX1RSVUUoYnVuZGxlLmdldExvbmcoZ2V0X2tleV9yZXF1ZXN0X2tleSwgJnZhbHVlKSk7CisgIEVYUEVDVF9HRSh2YWx1ZSwgMCk7CisgIHZhbHVlID0gLTE7CisgIEVYUEVDVF9UUlVFKGJ1bmRsZS5nZXRMb25nKHByb3ZpZGVfa2V5X3Jlc3BvbnNlX2tleSwgJnZhbHVlKSk7CisgIEVYUEVDVF9HRSh2YWx1ZSwgMCk7Cit9CisKKworVEVTVF9GKE1lZGlhRHJtTWV0cmljc1Rlc3QsIENvdW50ZXJWYWx1ZXNQcm90b1NlcmlhbGl6YXRpb24pIHsKKyAgTWVkaWFEcm1NZXRyaWNzIG1ldHJpY3M7CisKKyAgbWV0cmljcy5tT3BlblNlc3Npb25Db3VudGVyLkluY3JlbWVudChPSyk7CisgIG1ldHJpY3MubU9wZW5TZXNzaW9uQ291bnRlci5JbmNyZW1lbnQoVU5FWFBFQ1RFRF9OVUxMKTsKKyAgbWV0cmljcy5tQ2xvc2VTZXNzaW9uQ291bnRlci5JbmNyZW1lbnQoT0spOworICBtZXRyaWNzLm1DbG9zZVNlc3Npb25Db3VudGVyLkluY3JlbWVudChVTkVYUEVDVEVEX05VTEwpOworCisgIG1ldHJpY3MubUdldFByb3Zpc2lvblJlcXVlc3RDb3VudGVyLkluY3JlbWVudChPSyk7CisgIG1ldHJpY3MubUdldFByb3Zpc2lvblJlcXVlc3RDb3VudGVyLkluY3JlbWVudChVTkVYUEVDVEVEX05VTEwpOworICBtZXRyaWNzLm1Qcm92aWRlUHJvdmlzaW9uUmVzcG9uc2VDb3VudGVyLkluY3JlbWVudChPSyk7CisgIG1ldHJpY3MubVByb3ZpZGVQcm92aXNpb25SZXNwb25zZUNvdW50ZXIuSW5jcmVtZW50KFVORVhQRUNURURfTlVMTCk7CisgIG1ldHJpY3MubUdldERldmljZVVuaXF1ZUlkQ291bnRlci5JbmNyZW1lbnQoT0spOworICBtZXRyaWNzLm1HZXREZXZpY2VVbmlxdWVJZENvdW50ZXIuSW5jcmVtZW50KFVORVhQRUNURURfTlVMTCk7CisKKyAgbWV0cmljcy5tS2V5U3RhdHVzQ2hhbmdlQ291bnRlci5JbmNyZW1lbnQoS2V5U3RhdHVzVHlwZTo6VVNBQkxFKTsKKyAgbWV0cmljcy5tS2V5U3RhdHVzQ2hhbmdlQ291bnRlci5JbmNyZW1lbnQoS2V5U3RhdHVzVHlwZTo6RVhQSVJFRCk7CisgIG1ldHJpY3MubUtleVN0YXR1c0NoYW5nZUNvdW50ZXIuSW5jcmVtZW50KEtleVN0YXR1c1R5cGU6Ok9VVFBVVE5PVEFMTE9XRUQpOworICBtZXRyaWNzLm1LZXlTdGF0dXNDaGFuZ2VDb3VudGVyLkluY3JlbWVudChLZXlTdGF0dXNUeXBlOjpTVEFUVVNQRU5ESU5HKTsKKyAgbWV0cmljcy5tS2V5U3RhdHVzQ2hhbmdlQ291bnRlci5JbmNyZW1lbnQoS2V5U3RhdHVzVHlwZTo6SU5URVJOQUxFUlJPUik7CisgIG1ldHJpY3MubUV2ZW50Q291bnRlci5JbmNyZW1lbnQoRXZlbnRUeXBlOjpQUk9WSVNJT05fUkVRVUlSRUQpOworICBtZXRyaWNzLm1FdmVudENvdW50ZXIuSW5jcmVtZW50KEV2ZW50VHlwZTo6S0VZX05FRURFRCk7CisgIG1ldHJpY3MubUV2ZW50Q291bnRlci5JbmNyZW1lbnQoRXZlbnRUeXBlOjpLRVlfRVhQSVJFRCk7CisgIG1ldHJpY3MubUV2ZW50Q291bnRlci5JbmNyZW1lbnQoRXZlbnRUeXBlOjpWRU5ET1JfREVGSU5FRCk7CisgIG1ldHJpY3MubUV2ZW50Q291bnRlci5JbmNyZW1lbnQoRXZlbnRUeXBlOjpTRVNTSU9OX1JFQ0xBSU1FRCk7CisKKyAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZE1ldHJpY3M7CisgIEFTU0VSVF9FUShPSywgbWV0cmljcy5HZXRTZXJpYWxpemVkTWV0cmljcygmc2VyaWFsaXplZE1ldHJpY3MpKTsKKworICBEcm1GcmFtZXdvcmtNZXRyaWNzIG1ldHJpY3NQcm90bzsKKyAgQVNTRVJUX1RSVUUobWV0cmljc1Byb3RvLlBhcnNlRnJvbVN0cmluZyhzZXJpYWxpemVkTWV0cmljcykpOworCisgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkTWV0cmljcyA9CisgICAgICAib3Blbl9zZXNzaW9uX2NvdW50ZXIgeyBjb3VudDogMSBhdHRyaWJ1dGVzIHsgZXJyb3JfY29kZTogLTB4N0ZGRkZGRjggfSB9ICIKKyAgICAgICJvcGVuX3Nlc3Npb25fY291bnRlciB7IGNvdW50OiAxIGF0dHJpYnV0ZXMgeyBlcnJvcl9jb2RlOiAwIH0gfSAiCisgICAgICAiY2xvc2Vfc2Vzc2lvbl9jb3VudGVyIHsgY291bnQ6IDEgYXR0cmlidXRlcyB7IGVycm9yX2NvZGU6IC0weDdGRkZGRkY4IH0gfSAiCisgICAgICAiY2xvc2Vfc2Vzc2lvbl9jb3VudGVyIHsgY291bnQ6IDEgYXR0cmlidXRlcyB7IGVycm9yX2NvZGU6IDAgfSB9ICIKKyAgICAgICJnZXRfcHJvdmlzaW9uaW5nX3JlcXVlc3RfY291bnRlciB7IGNvdW50OiAxIGF0dHJpYnV0ZXMgeyBlcnJvcl9jb2RlOiAtMHg3RkZGRkZGOCB9IH0gIgorICAgICAgImdldF9wcm92aXNpb25pbmdfcmVxdWVzdF9jb3VudGVyIHsgY291bnQ6IDEgYXR0cmlidXRlcyB7IGVycm9yX2NvZGU6IDAgfSB9ICIKKyAgICAgICJwcm92aWRlX3Byb3Zpc2lvbmluZ19yZXNwb25zZV9jb3VudGVyIHsgY291bnQ6IDEgYXR0cmlidXRlcyB7IGVycm9yX2NvZGU6IC0weDdmZmZmZmY4IH0gfSAiCisgICAgICAicHJvdmlkZV9wcm92aXNpb25pbmdfcmVzcG9uc2VfY291bnRlciB7IGNvdW50OiAxIGF0dHJpYnV0ZXMgeyBlcnJvcl9jb2RlOiAwIH0gfSAiCisgICAgICAiZ2V0X2RldmljZV91bmlxdWVfaWRfY291bnRlciB7IGNvdW50OiAxIGF0dHJpYnV0ZXMgeyBlcnJvcl9jb2RlOiAtMHg3ZmZmZmZmOCB9IH0gIgorICAgICAgImdldF9kZXZpY2VfdW5pcXVlX2lkX2NvdW50ZXIgeyBjb3VudDogMSBhdHRyaWJ1dGVzIHsgZXJyb3JfY29kZTogMCB9IH0gIgorICAgICAgImtleV9zdGF0dXNfY2hhbmdlX2NvdW50ZXIgeyBjb3VudDogMSBhdHRyaWJ1dGVzIHsga2V5X3N0YXR1c190eXBlOiAwIH0gfSAiCisgICAgICAia2V5X3N0YXR1c19jaGFuZ2VfY291bnRlciB7IGNvdW50OiAxIGF0dHJpYnV0ZXMgeyBrZXlfc3RhdHVzX3R5cGU6IDEgfSB9ICIKKyAgICAgICJrZXlfc3RhdHVzX2NoYW5nZV9jb3VudGVyIHsgY291bnQ6IDEgYXR0cmlidXRlcyB7IGtleV9zdGF0dXNfdHlwZTogMiB9IH0gIgorICAgICAgImtleV9zdGF0dXNfY2hhbmdlX2NvdW50ZXIgeyBjb3VudDogMSBhdHRyaWJ1dGVzIHsga2V5X3N0YXR1c190eXBlOiAzIH0gfSAiCisgICAgICAia2V5X3N0YXR1c19jaGFuZ2VfY291bnRlciB7IGNvdW50OiAxIGF0dHJpYnV0ZXMgeyBrZXlfc3RhdHVzX3R5cGU6IDQgfSB9ICIKKyAgICAgICJldmVudF9jYWxsYmFja19jb3VudGVyIHsgY291bnQ6IDEgYXR0cmlidXRlcyB7IGV2ZW50X3R5cGU6IDAgfSB9ICIKKyAgICAgICJldmVudF9jYWxsYmFja19jb3VudGVyIHsgY291bnQ6IDEgYXR0cmlidXRlcyB7IGV2ZW50X3R5cGU6IDEgfSB9ICIKKyAgICAgICJldmVudF9jYWxsYmFja19jb3VudGVyIHsgY291bnQ6IDEgYXR0cmlidXRlcyB7IGV2ZW50X3R5cGU6IDIgfSB9ICIKKyAgICAgICJldmVudF9jYWxsYmFja19jb3VudGVyIHsgY291bnQ6IDEgYXR0cmlidXRlcyB7IGV2ZW50X3R5cGU6IDMgfSB9ICIKKyAgICAgICJldmVudF9jYWxsYmFja19jb3VudGVyIHsgY291bnQ6IDEgYXR0cmlidXRlcyB7IGV2ZW50X3R5cGU6IDQgfSB9ICI7CisKKyAgRHJtRnJhbWV3b3JrTWV0cmljcyBleHBlY3RlZE1ldHJpY3NQcm90bzsKKyAgQVNTRVJUX1RSVUUoVGV4dEZvcm1hdDo6TWVyZ2VGcm9tU3RyaW5nKGV4cGVjdGVkTWV0cmljcywgJmV4cGVjdGVkTWV0cmljc1Byb3RvKSk7CisKKyAgc3RkOjpzdHJpbmcgZGlmZlN0cmluZzsKKyAgTWVzc2FnZURpZmZlcmVuY2VyIGRpZmZlcjsKKyAgZGlmZmVyLlJlcG9ydERpZmZlcmVuY2VzVG9TdHJpbmcoJmRpZmZTdHJpbmcpOworICBBU1NFUlRfVFJVRShkaWZmZXIuQ29tcGFyZShleHBlY3RlZE1ldHJpY3NQcm90bywgbWV0cmljc1Byb3RvKSkKKyAgICAgIDw8IGRpZmZTdHJpbmc7Cit9CisKK1RFU1RfRihNZWRpYURybU1ldHJpY3NUZXN0LCBUaW1lTWV0cmljc1Byb3RvU2VyaWFsaXphdGlvbikgeworICBNZWRpYURybU1ldHJpY3MgbWV0cmljczsKKworICBmb3IgKHN0YXR1c190IHMgOiB7T0ssIFVORVhQRUNURURfTlVMTH0pIHsKKyAgICBkb3VibGUgdGltZSA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKKyAgICAgIHRpbWUgKz0gMS4wOworICAgICAgbWV0cmljcy5tR2V0S2V5UmVxdWVzdFRpbWVVcy5SZWNvcmQodGltZSwgcyk7CisgICAgICBtZXRyaWNzLm1Qcm92aWRlS2V5UmVzcG9uc2VUaW1lVXMuUmVjb3JkKHRpbWUsIHMpOworICAgIH0KKyAgfQorCisgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWRNZXRyaWNzOworICBBU1NFUlRfRVEoT0ssIG1ldHJpY3MuR2V0U2VyaWFsaXplZE1ldHJpY3MoJnNlcmlhbGl6ZWRNZXRyaWNzKSk7CisKKyAgRHJtRnJhbWV3b3JrTWV0cmljcyBtZXRyaWNzUHJvdG87CisgIEFTU0VSVF9UUlVFKG1ldHJpY3NQcm90by5QYXJzZUZyb21TdHJpbmcoc2VyaWFsaXplZE1ldHJpY3MpKTsKKworICBzdGQ6OnN0cmluZyBleHBlY3RlZE1ldHJpY3MgPQorICAgICAgImdldF9rZXlfcmVxdWVzdF90aW1lX3VzIHsgIgorICAgICAgIiAgbWluOiAxIG1heDogNSBtZWFuOiAzLjUgdmFyaWFuY2U6IDEgb3BlcmF0aW9uX2NvdW50OiA1ICIKKyAgICAgICIgIGF0dHJpYnV0ZXMgeyBlcnJvcl9jb2RlOiAtMHg3RkZGRkZGOCB9ICIKKyAgICAgICJ9ICIKKyAgICAgICJnZXRfa2V5X3JlcXVlc3RfdGltZV91cyB7ICIKKyAgICAgICIgIG1pbjogMSBtYXg6IDUgbWVhbjogMy41IHZhcmlhbmNlOiAxIG9wZXJhdGlvbl9jb3VudDogNSAiCisgICAgICAiICBhdHRyaWJ1dGVzIHsgZXJyb3JfY29kZTogMCB9ICIKKyAgICAgICJ9ICIKKyAgICAgICJwcm92aWRlX2tleV9yZXNwb25zZV90aW1lX3VzIHsgIgorICAgICAgIiAgbWluOiAxIG1heDogNSBtZWFuOiAzLjUgdmFyaWFuY2U6IDEgb3BlcmF0aW9uX2NvdW50OiA1ICIKKyAgICAgICIgIGF0dHJpYnV0ZXMgeyBlcnJvcl9jb2RlOiAtMHg3RkZGRkZGOCB9ICIKKyAgICAgICJ9ICIKKyAgICAgICJwcm92aWRlX2tleV9yZXNwb25zZV90aW1lX3VzIHsgIgorICAgICAgIiAgbWluOiAxIG1heDogNSBtZWFuOiAzLjUgdmFyaWFuY2U6IDEgb3BlcmF0aW9uX2NvdW50OiA1ICIKKyAgICAgICIgIGF0dHJpYnV0ZXMgeyBlcnJvcl9jb2RlOiAwIH0gIgorICAgICAgIn0gIjsKKworICBEcm1GcmFtZXdvcmtNZXRyaWNzIGV4cGVjdGVkTWV0cmljc1Byb3RvOworICBBU1NFUlRfVFJVRShUZXh0Rm9ybWF0OjpNZXJnZUZyb21TdHJpbmcoZXhwZWN0ZWRNZXRyaWNzLCAmZXhwZWN0ZWRNZXRyaWNzUHJvdG8pKTsKKworICBzdGQ6OnN0cmluZyBkaWZmU3RyaW5nOworICBNZXNzYWdlRGlmZmVyZW5jZXIgZGlmZmVyOworICBkaWZmZXIuUmVwb3J0RGlmZmVyZW5jZXNUb1N0cmluZygmZGlmZlN0cmluZyk7CisgIEFTU0VSVF9UUlVFKGRpZmZlci5Db21wYXJlKGV4cGVjdGVkTWV0cmljc1Byb3RvLCBtZXRyaWNzUHJvdG8pKQorICAgICAgPDwgZGlmZlN0cmluZzsKK30KKworVEVTVF9GKE1lZGlhRHJtTWV0cmljc1Rlc3QsIFNlc3Npb25MaWZldGltZVByb3RvU2VyaWFsaXphdGlvbikgeworICAvLyBVc2UgdGhlIGZha2Ugc28gdGhlIGNsb2NrIGlzIHByZWRpY3RhYmxlOworICBGYWtlTWVkaWFEcm1NZXRyaWNzIG1ldHJpY3M7CisKKyAgYW5kcm9pZDo6VmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZDE7CisgIHNlc3Npb25JZDEucHVzaF9iYWNrKDEpOworICBzZXNzaW9uSWQxLnB1c2hfYmFjaygyKTsKKyAgYW5kcm9pZDo6VmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZDI7CisgIHNlc3Npb25JZDIucHVzaF9iYWNrKDMpOworICBzZXNzaW9uSWQyLnB1c2hfYmFjayg0KTsKKworICBtZXRyaWNzLlNldFNlc3Npb25TdGFydChzZXNzaW9uSWQxKTsKKyAgbWV0cmljcy5TZXRTZXNzaW9uU3RhcnQoc2Vzc2lvbklkMik7CisgIG1ldHJpY3MuU2V0U2Vzc2lvbkVuZChzZXNzaW9uSWQyKTsKKyAgbWV0cmljcy5TZXRTZXNzaW9uRW5kKHNlc3Npb25JZDEpOworCisgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWRNZXRyaWNzOworICBBU1NFUlRfRVEoT0ssIG1ldHJpY3MuR2V0U2VyaWFsaXplZE1ldHJpY3MoJnNlcmlhbGl6ZWRNZXRyaWNzKSk7CisKKyAgRHJtRnJhbWV3b3JrTWV0cmljcyBtZXRyaWNzUHJvdG87CisgIEFTU0VSVF9UUlVFKG1ldHJpY3NQcm90by5QYXJzZUZyb21TdHJpbmcoc2VyaWFsaXplZE1ldHJpY3MpKTsKKworICBzdGQ6OnN0cmluZyBleHBlY3RlZE1ldHJpY3MgPQorICAgICAgInNlc3Npb25fbGlmZXRpbWVzOiB7ICIKKyAgICAgICIgIGtleTogJzAxMDInICIKKyAgICAgICIgIHZhbHVlIHsgc3RhcnRfdGltZV9tczogMCBlbmRfdGltZV9tczogMyB9ICIKKyAgICAgICJ9ICIKKyAgICAgICJzZXNzaW9uX2xpZmV0aW1lczogeyAiCisgICAgICAiICBrZXk6ICcwMzA0JyAiCisgICAgICAiICB2YWx1ZSB7IHN0YXJ0X3RpbWVfbXM6IDEgZW5kX3RpbWVfbXM6IDIgfSAiCisgICAgICAifSAiOworCisgIERybUZyYW1ld29ya01ldHJpY3MgZXhwZWN0ZWRNZXRyaWNzUHJvdG87CisgIEFTU0VSVF9UUlVFKFRleHRGb3JtYXQ6Ok1lcmdlRnJvbVN0cmluZyhleHBlY3RlZE1ldHJpY3MsICZleHBlY3RlZE1ldHJpY3NQcm90bykpOworCisgIHN0ZDo6c3RyaW5nIGRpZmZTdHJpbmc7CisgIE1lc3NhZ2VEaWZmZXJlbmNlciBkaWZmZXI7CisgIGRpZmZlci5SZXBvcnREaWZmZXJlbmNlc1RvU3RyaW5nKCZkaWZmU3RyaW5nKTsKKyAgQVNTRVJUX1RSVUUoZGlmZmVyLkNvbXBhcmUoZXhwZWN0ZWRNZXRyaWNzUHJvdG8sIG1ldHJpY3NQcm90bykpCisgICAgICA8PCBkaWZmU3RyaW5nOworfQorCitURVNUX0YoTWVkaWFEcm1NZXRyaWNzVGVzdCwgSGlkbFRvQnVuZGxlTWV0cmljc0VtcHR5KSB7CisgIGhpZGxfdmVjPERybU1ldHJpY0dyb3VwPiBoaWRsTWV0cmljR3JvdXBzOworICBQZXJzaXN0YWJsZUJ1bmRsZSBidW5kbGVNZXRyaWNHcm91cHM7CisKKyAgQVNTRVJUX0VRKE9LLCBNZWRpYURybU1ldHJpY3M6OkhpZGxNZXRyaWNzVG9CdW5kbGUoaGlkbE1ldHJpY0dyb3VwcywgJmJ1bmRsZU1ldHJpY0dyb3VwcykpOworICBBU1NFUlRfRVEoMFUsIGJ1bmRsZU1ldHJpY0dyb3Vwcy5zaXplKCkpOworfQorCitURVNUX0YoTWVkaWFEcm1NZXRyaWNzVGVzdCwgSGlkbFRvQnVuZGxlTWV0cmljc011bHRpcGxlKSB7CisgIERybU1ldHJpY0dyb3VwIGhpZGxNZXRyaWNHcm91cCA9CisgICAgICB7IHsgeworICAgICAgICAgICAgICAib3Blbl9zZXNzaW9uX29rIiwKKyAgICAgICAgICAgICAgeyB7ICJzdGF0dXMiLCBEcm1NZXRyaWNHcm91cDo6VmFsdWVUeXBlOjpJTlQ2NF9UWVBFLAorICAgICAgICAgICAgICAgICAgKGludDY0X3QpIFN0YXR1czo6T0ssIDAuMCwgIiIgfSB9LAorICAgICAgICAgICAgICB7IHsgImNvdW50IiwgRHJtTWV0cmljR3JvdXA6OlZhbHVlVHlwZTo6SU5UNjRfVFlQRSwgMywgMC4wLCAiIiB9IH0KKyAgICAgICAgICB9LAorICAgICAgICAgIHsKKyAgICAgICAgICAgICAgImNsb3NlX3Nlc3Npb25fbm90X29wZW5lZCIsCisgICAgICAgICAgICAgIHsgeyAic3RhdHVzIiwgRHJtTWV0cmljR3JvdXA6OlZhbHVlVHlwZTo6SU5UNjRfVFlQRSwKKyAgICAgICAgICAgICAgICAgIChpbnQ2NF90KSBTdGF0dXM6OkVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQsIDAuMCwgIiIgfSB9LAorICAgICAgICAgICAgICB7IHsgImNvdW50IiwgRHJtTWV0cmljR3JvdXA6OlZhbHVlVHlwZTo6SU5UNjRfVFlQRSwgNywgMC4wLCAiIiB9IH0KKyAgICAgICAgICB9IH0gfTsKKworICBQZXJzaXN0YWJsZUJ1bmRsZSBidW5kbGVNZXRyaWNHcm91cHM7CisgIEFTU0VSVF9FUShPSywgTWVkaWFEcm1NZXRyaWNzOjpIaWRsTWV0cmljc1RvQnVuZGxlKGhpZGxfdmVjPERybU1ldHJpY0dyb3VwPih7aGlkbE1ldHJpY0dyb3VwfSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidW5kbGVNZXRyaWNHcm91cHMpKTsKKyAgQVNTRVJUX0VRKDFVLCBidW5kbGVNZXRyaWNHcm91cHMuc2l6ZSgpKTsKKyAgUGVyc2lzdGFibGVCdW5kbGUgYnVuZGxlTWV0cmljR3JvdXA7CisgIEFTU0VSVF9UUlVFKGJ1bmRsZU1ldHJpY0dyb3Vwcy5nZXRQZXJzaXN0YWJsZUJ1bmRsZShTdHJpbmcxNigiWzBdIiksICZidW5kbGVNZXRyaWNHcm91cCkpOworICBBU1NFUlRfRVEoMlUsIGJ1bmRsZU1ldHJpY0dyb3VwLnNpemUoKSk7CisKKyAgLy8gVmVyaWZ5IGVhY2ggbWV0cmljLgorICBQZXJzaXN0YWJsZUJ1bmRsZSBtZXRyaWM7CisgIEFTU0VSVF9UUlVFKGJ1bmRsZU1ldHJpY0dyb3VwLmdldFBlcnNpc3RhYmxlQnVuZGxlKFN0cmluZzE2KCJvcGVuX3Nlc3Npb25fb2siKSwgJm1ldHJpYykpOworICBQZXJzaXN0YWJsZUJ1bmRsZSBtZXRyaWNJbnN0YW5jZTsKKyAgQVNTRVJUX1RSVUUobWV0cmljLmdldFBlcnNpc3RhYmxlQnVuZGxlKFN0cmluZzE2KCJbMF0iKSwgJm1ldHJpY0luc3RhbmNlKSk7CisgIGludDY0X3QgdmFsdWUgPSAwOworICBBU1NFUlRfVFJVRShtZXRyaWNJbnN0YW5jZS5nZXRMb25nKFN0cmluZzE2KCJjb3VudCIpLCAmdmFsdWUpKTsKKyAgQVNTRVJUX0VRKDMsIHZhbHVlKTsKKyAgUGVyc2lzdGFibGVCdW5kbGUgYXR0cmlidXRlQnVuZGxlOworICBBU1NFUlRfVFJVRShtZXRyaWNJbnN0YW5jZS5nZXRQZXJzaXN0YWJsZUJ1bmRsZShTdHJpbmcxNigiYXR0cmlidXRlcyIpLCAmYXR0cmlidXRlQnVuZGxlKSk7CisgIEFTU0VSVF9UUlVFKGF0dHJpYnV0ZUJ1bmRsZS5nZXRMb25nKFN0cmluZzE2KCJzdGF0dXMiKSwgJnZhbHVlKSk7CisgIEFTU0VSVF9FUSgoaW50NjRfdCkgU3RhdHVzOjpPSywgdmFsdWUpOworCisgIEFTU0VSVF9UUlVFKGJ1bmRsZU1ldHJpY0dyb3VwLmdldFBlcnNpc3RhYmxlQnVuZGxlKFN0cmluZzE2KCJjbG9zZV9zZXNzaW9uX25vdF9vcGVuZWQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1ldHJpYykpOworICBBU1NFUlRfVFJVRShtZXRyaWMuZ2V0UGVyc2lzdGFibGVCdW5kbGUoU3RyaW5nMTYoIlswXSIpLCAmbWV0cmljSW5zdGFuY2UpKTsKKyAgQVNTRVJUX1RSVUUobWV0cmljSW5zdGFuY2UuZ2V0TG9uZyhTdHJpbmcxNigiY291bnQiKSwgJnZhbHVlKSk7CisgIEFTU0VSVF9FUSg3LCB2YWx1ZSk7CisgIEFTU0VSVF9UUlVFKG1ldHJpY0luc3RhbmNlLmdldFBlcnNpc3RhYmxlQnVuZGxlKFN0cmluZzE2KCJhdHRyaWJ1dGVzIiksICZhdHRyaWJ1dGVCdW5kbGUpKTsKKyAgdmFsdWUgPSAwOworICBBU1NFUlRfVFJVRShhdHRyaWJ1dGVCdW5kbGUuZ2V0TG9uZyhTdHJpbmcxNigic3RhdHVzIiksICZ2YWx1ZSkpOworICBBU1NFUlRfRVEoKGludDY0X3QpIFN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRCwgdmFsdWUpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0V2ZW50TWV0cmljX3Rlc3QuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0V2ZW50TWV0cmljX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNmM0ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGlibWVkaWFkcm0vdGVzdHMvRXZlbnRNZXRyaWNfdGVzdC5jcHAKQEAgLTAsMCArMSwxNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSAiRXZlbnRNZXRyaWMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFVuaXQgdGVzdHMgZm9yIHRoZSBFdmVudE1ldHJpYyBjbGFzcy4KKyAqLworCitURVNUKEV2ZW50TWV0cmljVGVzdCwgSW50RGF0YVR5cGVFbXB0eSkgeworICBFdmVudE1ldHJpYzxpbnQ+IG1ldHJpYygiTXlNZXRyaWNOYW1lIiwgIk1ldHJpY0F0dHJpYnV0ZU5hbWUiKTsKKworICBzdGQ6Om1hcDxpbnQsIEV2ZW50U3RhdGlzdGljcz4gdmFsdWVzOworCisgIG1ldHJpYy5FeHBvcnRWYWx1ZXMoCisgICAgICBbJl0gKGludCBhdHRyaWJ1dGVfdmFsdWUsIGNvbnN0IEV2ZW50U3RhdGlzdGljcyYgdmFsdWUpIHsKKyAgICAgICAgICB2YWx1ZXNbYXR0cmlidXRlX3ZhbHVlXSA9IHZhbHVlOworICAgICAgfSk7CisKKyAgRVhQRUNUX1RSVUUodmFsdWVzLmVtcHR5KCkpOworfQorCitURVNUKEV2ZW50TWV0cmljVGVzdCwgSW50RGF0YVR5cGUpIHsKKyAgRXZlbnRNZXRyaWM8aW50PiBtZXRyaWMoIk15TWV0cmljTmFtZSIsICJNZXRyaWNBdHRyaWJ1dGVOYW1lIik7CisKKyAgc3RkOjptYXA8aW50LCBFdmVudFN0YXRpc3RpY3M+IHZhbHVlczsKKworICBtZXRyaWMuUmVjb3JkKDQsIDcpOworICBtZXRyaWMuUmVjb3JkKDUsIDgpOworICBtZXRyaWMuUmVjb3JkKDUsIDgpOworICBtZXRyaWMuUmVjb3JkKDUsIDgpOworICBtZXRyaWMuUmVjb3JkKDYsIDgpOworICBtZXRyaWMuUmVjb3JkKDYsIDgpOworICBtZXRyaWMuUmVjb3JkKDYsIDgpOworCisgIG1ldHJpYy5FeHBvcnRWYWx1ZXMoCisgICAgICBbJl0gKGludCBhdHRyaWJ1dGVfdmFsdWUsIGNvbnN0IEV2ZW50U3RhdGlzdGljcyYgdmFsdWUpIHsKKyAgICAgICAgICB2YWx1ZXNbYXR0cmlidXRlX3ZhbHVlXSA9IHZhbHVlOworICAgICAgfSk7CisKKyAgQVNTRVJUX0VRKDJ1LCB2YWx1ZXMuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDQsIHZhbHVlc1s3XS5taW4pOworICBFWFBFQ1RfRVEoNCwgdmFsdWVzWzddLm1heCk7CisgIEVYUEVDVF9FUSg0LCB2YWx1ZXNbN10ubWVhbik7CisgIEVYUEVDVF9FUSgxLCB2YWx1ZXNbN10uY291bnQpOworCisgIEVYUEVDVF9FUSg1LCB2YWx1ZXNbOF0ubWluKTsKKyAgRVhQRUNUX0VRKDYsIHZhbHVlc1s4XS5tYXgpOworICAvLyBUaGlzIGlzIGFuIGFwcHJveGltYXRlIHZhbHVlIGJlY2F1c2Ugb2YgdGhlIHRlY2huaXF1ZSB3ZSdyZSB1c2luZy4KKyAgRVhQRUNUX05FQVIoNS41LCB2YWx1ZXNbOF0ubWVhbiwgMC4yKTsKKyAgRVhQRUNUX0VRKDYsIHZhbHVlc1s4XS5jb3VudCk7Cit9CisKK1RFU1QoRXZlbnRNZXRyaWNUZXN0LCBTdHJpbmdEYXRhVHlwZSkgeworICBFdmVudE1ldHJpYzxzdGQ6OnN0cmluZz4gbWV0cmljKCJNeU1ldHJpY05hbWUiLCAiTWV0cmljQXR0cmlidXRlTmFtZSIpOworCisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBFdmVudFN0YXRpc3RpY3M+IHZhbHVlczsKKworICBtZXRyaWMuUmVjb3JkKDEsICJhIik7CisgIG1ldHJpYy5SZWNvcmQoMiwgImIiKTsKKyAgbWV0cmljLlJlY29yZCgyLCAiYiIpOworICBtZXRyaWMuUmVjb3JkKDMsICJiIik7CisgIG1ldHJpYy5SZWNvcmQoMywgImIiKTsKKworICBtZXRyaWMuRXhwb3J0VmFsdWVzKAorICAgICAgWyZdIChzdGQ6OnN0cmluZyBhdHRyaWJ1dGVfdmFsdWUsIGNvbnN0IEV2ZW50U3RhdGlzdGljcyYgdmFsdWUpIHsKKyAgICAgICAgICB2YWx1ZXNbYXR0cmlidXRlX3ZhbHVlXSA9IHZhbHVlOworICAgICAgfSk7CisKKyAgQVNTRVJUX0VRKDJ1LCB2YWx1ZXMuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDEsIHZhbHVlc1siYSJdLm1pbik7CisgIEVYUEVDVF9FUSgxLCB2YWx1ZXNbImEiXS5tYXgpOworICBFWFBFQ1RfRVEoMSwgdmFsdWVzWyJhIl0ubWVhbik7CisgIEVYUEVDVF9FUSgxLCB2YWx1ZXNbImEiXS5jb3VudCk7CisKKyAgRVhQRUNUX0VRKDIsIHZhbHVlc1siYiJdLm1pbik7CisgIEVYUEVDVF9FUSgzLCB2YWx1ZXNbImIiXS5tYXgpOworICBFWFBFQ1RfTkVBUigyLjUsIHZhbHVlc1siYiJdLm1lYW4sIDAuMik7CisgIEVYUEVDVF9FUSg0LCB2YWx1ZXNbImIiXS5jb3VudCk7Cit9CisKKy8vIEhlbHBlciBjbGFzcyB0aGF0IGFsbG93cyB1cyB0byBtb2NrIHRoZSBjbG9jay4KK3RlbXBsYXRlPHR5cGVuYW1lIEF0dHJpYnV0ZVR5cGU+CitjbGFzcyBNb2NrRXZlbnRUaW1lciA6IHB1YmxpYyBFdmVudFRpbWVyPEF0dHJpYnV0ZVR5cGU+IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IE1vY2tFdmVudFRpbWVyKG5zZWNzX3QgdGltZV9kZWx0YV9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRNZXRyaWM8QXR0cmlidXRlVHlwZT4qIG1ldHJpYykKKyAgICAgIDogRXZlbnRUaW1lcjxBdHRyaWJ1dGVUeXBlPihtZXRyaWMpIHsKKyAgICAvLyBQcmV0ZW5kIHRoZSBldmVudCBzdGFydGVkIGVhcmxpZXIuCisgICAgdGhpcy0+c3RhcnRfdGltZV8gPSBzeXN0ZW1UaW1lKCkgLSB0aW1lX2RlbHRhX25zOworICB9Cit9OworCitURVNUKEV2ZW50VGltZXJUZXN0LCBJbnREYXRhVHlwZSkgeworICBFdmVudE1ldHJpYzxpbnQ+IG1ldHJpYygiTXlNZXRyaWNOYW1lIiwgIk1ldHJpY0F0dHJpYnV0ZU5hbWUiKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgeworICAgIHsKKyAgICAgIC8vIEFkZCBhIG1vY2sgdGltZSBkZWx0YS4KKyAgICAgIE1vY2tFdmVudFRpbWVyPGludD4gbWV0cmljX3RpbWVyKGkgKiAxMDAwMDAwLCAmbWV0cmljKTsKKyAgICAgIG1ldHJpY190aW1lci5TZXRBdHRyaWJ1dGUoaSAlIDIpOworICAgIH0KKyAgfQorCisgIHN0ZDo6bWFwPGludCwgRXZlbnRTdGF0aXN0aWNzPiB2YWx1ZXM7CisgIG1ldHJpYy5FeHBvcnRWYWx1ZXMoCisgICAgICBbJl0gKGludCBhdHRyaWJ1dGVfdmFsdWUsIGNvbnN0IEV2ZW50U3RhdGlzdGljcyYgdmFsdWUpIHsKKyAgICAgICAgICB2YWx1ZXNbYXR0cmlidXRlX3ZhbHVlXSA9IHZhbHVlOworICAgICAgfSk7CisKKyAgQVNTRVJUX0VRKDJ1LCB2YWx1ZXMuc2l6ZSgpKTsKKyAgRVhQRUNUX0xUKHZhbHVlc1swXS5taW4sIHZhbHVlc1swXS5tYXgpOworICBFWFBFQ1RfR0UoNDAwMCwgdmFsdWVzWzBdLm1heCk7CisgIEVYUEVDVF9HVCh2YWx1ZXNbMF0ubWVhbiwgdmFsdWVzWzBdLm1pbik7CisgIEVYUEVDVF9MRSh2YWx1ZXNbMF0ubWVhbiwgdmFsdWVzWzBdLm1heCk7CisgIEVYUEVDVF9FUSgzLCB2YWx1ZXNbMF0uY291bnQpOworCisgIEVYUEVDVF9MVCh2YWx1ZXNbMV0ubWluLCB2YWx1ZXNbMV0ubWF4KTsKKyAgRVhQRUNUX0dFKDMwMDAsIHZhbHVlc1sxXS5tYXgpOworICBFWFBFQ1RfR1QodmFsdWVzWzFdLm1lYW4sIHZhbHVlc1sxXS5taW4pOworICBFWFBFQ1RfTEUodmFsdWVzWzFdLm1lYW4sIHZhbHVlc1sxXS5tYXgpOworICBFWFBFQ1RfRVEoMiwgdmFsdWVzWzFdLmNvdW50KTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5Q2FzUGx1Z2luLmNwcCBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5Q2FzUGx1Z2luLmNwcAppbmRleCBlMjc2MzFmLi43M2VkOGMzIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleUNhc1BsdWdpbi5jcHAKKysrIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlDYXNQbHVnaW4uY3BwCkBAIC01NSw3ICs1NSw3IEBACiAKIHN0YXR1c190IENsZWFyS2V5Q2FzRmFjdG9yeTo6Y3JlYXRlUGx1Z2luKAogICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9pZCwKLSAgICAgICAgdWludDY0X3QgYXBwRGF0YSwKKyAgICAgICAgdm9pZCAqYXBwRGF0YSwKICAgICAgICAgQ2FzUGx1Z2luQ2FsbGJhY2sgY2FsbGJhY2ssCiAgICAgICAgIENhc1BsdWdpbiAqKnBsdWdpbikgewogICAgIGlmICghaXNTeXN0ZW1JZFN1cHBvcnRlZChDQV9zeXN0ZW1faWQpKSB7CkBAIC04Myw3ICs4Myw3IEBACiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIENsZWFyS2V5Q2FzUGx1Z2luOjpDbGVhcktleUNhc1BsdWdpbigKLSAgICAgICAgdWludDY0X3QgYXBwRGF0YSwgQ2FzUGx1Z2luQ2FsbGJhY2sgY2FsbGJhY2spCisgICAgICAgIHZvaWQgKmFwcERhdGEsIENhc1BsdWdpbkNhbGxiYWNrIGNhbGxiYWNrKQogICAgIDogbUNhbGxiYWNrKGNhbGxiYWNrKSwgbUFwcERhdGEoYXBwRGF0YSkgewogICAgIEFMT0dWKCJDVE9SIik7CiB9CkBAIC0zNDcsNiArMzQ3LDkgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX0NBU19DQU5OT1RfSEFORExFOwogICAgIH0KIAorICAgIHNjcmFtYmxpbmdDb250cm9sID0gKERlc2NyYW1ibGVyUGx1Z2luOjpTY3JhbWJsaW5nQ29udHJvbCkKKyAgICAgICAgKHNjcmFtYmxpbmdDb250cm9sICYgRGVzY3JhbWJsZXJQbHVnaW46OmtTY3JhbWJsaW5nX01hc2tfS2V5KTsKKwogICAgIEFFU19LRVkgY29udGVudEtleTsKIAogICAgIGlmIChzY3JhbWJsaW5nQ29udHJvbCAhPSBEZXNjcmFtYmxlclBsdWdpbjo6a1NjcmFtYmxpbmdfVW5zY3JhbWJsZWQpIHsKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5Q2FzUGx1Z2luLmggYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleUNhc1BsdWdpbi5oCmluZGV4IGI3MTM0ZTQuLjQyY2ZiOGYgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5Q2FzUGx1Z2luLmgKKysrIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlDYXNQbHVnaW4uaApAQCAtNDQsNyArNDQsNyBAQAogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Q2FzUGx1Z2luRGVzY3JpcHRvcj4gKmRlc2NyaXB0b3JzKSBjb25zdCBvdmVycmlkZTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVBsdWdpbigKICAgICAgICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX2lkLAotICAgICAgICAgICAgdWludDY0X3QgYXBwRGF0YSwKKyAgICAgICAgICAgIHZvaWQgKmFwcERhdGEsCiAgICAgICAgICAgICBDYXNQbHVnaW5DYWxsYmFjayBjYWxsYmFjaywKICAgICAgICAgICAgIENhc1BsdWdpbiAqKnBsdWdpbikgb3ZlcnJpZGU7CiB9OwpAQCAtNjIsNyArNjIsNyBAQAogCiBjbGFzcyBDbGVhcktleUNhc1BsdWdpbiA6IHB1YmxpYyBDYXNQbHVnaW4gewogcHVibGljOgotICAgIENsZWFyS2V5Q2FzUGx1Z2luKHVpbnQ2NF90IGFwcERhdGEsIENhc1BsdWdpbkNhbGxiYWNrIGNhbGxiYWNrKTsKKyAgICBDbGVhcktleUNhc1BsdWdpbih2b2lkICphcHBEYXRhLCBDYXNQbHVnaW5DYWxsYmFjayBjYWxsYmFjayk7CiAgICAgdmlydHVhbCB+Q2xlYXJLZXlDYXNQbHVnaW4oKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJpdmF0ZURhdGEoCkBAIC05NCw3ICs5NCw3IEBACiAgICAgTXV0ZXggbUtleUZldGNoZXJMb2NrOwogICAgIHN0ZDo6dW5pcXVlX3B0cjxLZXlGZXRjaGVyPiBtS2V5RmV0Y2hlcjsKICAgICBDYXNQbHVnaW5DYWxsYmFjayBtQ2FsbGJhY2s7Ci0gICAgdWludDY0X3QgbUFwcERhdGE7CisgICAgdm9pZCogbUFwcERhdGE7CiB9OwogCiBjbGFzcyBDbGVhcktleURlc2NyYW1ibGVyUGx1Z2luIDogcHVibGljIERlc2NyYW1ibGVyUGx1Z2luIHsKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5RmV0Y2hlci5jcHAgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleUZldGNoZXIuY3BwCmluZGV4IGNiNjlmOTEuLmVhYTMzOTAgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5RmV0Y2hlci5jcHAKKysrIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlGZXRjaGVyLmNwcApAQCAtODksNyArODksNyBAQAogICAgIC8vIGFzc2V0X2lkIGNoYW5nZS4gSWYgaXQgc2VuZHMgYW4gRWNtQ29udGFpbmVyIHdpdGggMiBFY21zIHdpdGggZGlmZmVyZW50CiAgICAgLy8gYXNzZXRfaWRzIChvbGQgYW5kIG5ldykgdGhlbiBpdCBtaWdodCBiZSBiZXN0IHRvIHByZWZldGNoIHRoZSBFbW0uCiAgICAgaWYgKChhc3NldF8uaWQoKSAhPSAwKSAmJiAoKmFzc2V0X2lkICE9IGFzc2V0Xy5pZCgpKSkgewotICAgICAgICBBTE9HVygiQXNzZXRfaWQgY2hhbmdlIGZyb20gJSIgUFJJdTY0ICIgdG8gJSIgUFJJdTY0LCBhc3NldF8uaWQoKSwgKmFzc2V0X2lkKTsKKyAgICAgICAgQUxPR1coIkFzc2V0X2lkIGNoYW5nZSBmcm9tICVsbHUgdG8gJSIgUFJJdTY0LCBhc3NldF8uaWQoKSwgKmFzc2V0X2lkKTsKICAgICAgICAgYXNzZXRfLkNsZWFyKCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleVNlc3Npb25MaWJyYXJ5LmNwcCBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5U2Vzc2lvbkxpYnJhcnkuY3BwCmluZGV4IGZhZWEwMDguLjRiNDA1MWQgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5U2Vzc2lvbkxpYnJhcnkuY3BwCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5U2Vzc2lvbkxpYnJhcnkuY3BwCkBAIC05NSw3ICs5NSw3IEBACiB2b2lkIENsZWFyS2V5U2Vzc2lvbkxpYnJhcnk6OmRlc3Ryb3lQbHVnaW4oQ2FzUGx1Z2luICpwbHVnaW4pIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2Vzc2lvbnNMb2NrKTsKIAotICAgIGZvciAoc3NpemVfdCBpbmRleCA9IG1JRFRvU2Vzc2lvbk1hcC5zaXplKCkgLSAxOyBpbmRleCA+PSAwOyBpbmRleC0tKSB7CisgICAgZm9yIChzc2l6ZV90IGluZGV4ID0gKHNzaXplX3QpbUlEVG9TZXNzaW9uTWFwLnNpemUoKSAtIDE7IGluZGV4ID49IDA7IGluZGV4LS0pIHsKICAgICAgICAgc3A8Q2xlYXJLZXlDYXNTZXNzaW9uPiBzZXNzaW9uID0gbUlEVG9TZXNzaW9uTWFwLnZhbHVlQXQoaW5kZXgpOwogICAgICAgICBpZiAoc2Vzc2lvbi0+Z2V0UGx1Z2luKCkgPT0gcGx1Z2luKSB7CiAgICAgICAgICAgICBtSURUb1Nlc3Npb25NYXAucmVtb3ZlSXRlbXNBdChpbmRleCk7CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9Kc29uQXNzZXRMb2FkZXIuY3BwIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvSnNvbkFzc2V0TG9hZGVyLmNwcAppbmRleCA2ZTEwMDRjLi5lZThkYmEzIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9Kc29uQXNzZXRMb2FkZXIuY3BwCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0pzb25Bc3NldExvYWRlci5jcHAKQEAgLTM2LDggKzM2LDYgQEAKIGNvbnN0IFN0cmluZzgga0Nhc1R5cGVUYWcoImNhc190eXBlIik7CiBjb25zdCBTdHJpbmc4IGtCYXNlNjRQYWRkaW5nKCI9Iik7CiAKLWNvbnN0IHVpbnQzMl90IGtLZXlMZW5ndGggPSAxNjsKLQogSnNvbkFzc2V0TG9hZGVyOjpKc29uQXNzZXRMb2FkZXIoKSB7CiB9CiAKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L2VjbV9nZW5lcmF0b3IuY3BwIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvZWNtX2dlbmVyYXRvci5jcHAKaW5kZXggN2QyOTY1OS4uMjE4Y2UzNSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvZWNtX2dlbmVyYXRvci5jcHAKKysrIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvZWNtX2dlbmVyYXRvci5jcHAKQEAgLTM4LDggKzM4LDYgQEAKIGNvbnN0IHVpbnQxNl90IGtUb3RhbEVjbVNpemUgPQogICAgICAgICBrRWNtQ2xlYXJGaWVsZHNTaXplICsga0NvbnRlbnRLZXlCeXRlU2l6ZTsgLy8gY2xlYXIgZmllbGRzICsgY2xlYXIga2V5CiAKLWNvbnN0IHVpbnQzMl90IGtLZXlMZW5ndGggPSAxNjsKLQogI2RlZmluZSBVTkFMSUdORURfTE9BRDMyKF9wKSAoKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QgKj4oX3ApKQogCiBzdGF0aWMgdWludDMyX3QgTG9hZDMyKGNvbnN0IHZvaWQgKnApIHsKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0NsZWFyS2V5RmV0Y2hlclRlc3QuY3BwIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvQ2xlYXJLZXlGZXRjaGVyVGVzdC5jcHAKaW5kZXggYWNlMDg2YS4uZDEyY2ZlYiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvQ2xlYXJLZXlGZXRjaGVyVGVzdC5jcHAKKysrIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvQ2xlYXJLZXlGZXRjaGVyVGVzdC5jcHAKQEAgLTkzLDcgKzkzLDcgQEAKICAgICB1aW50NjRfdCBhc3NldF9pZDsKICAgICBzdGQ6OnZlY3RvcjxLZXlGZXRjaGVyOjpLZXlJbmZvPiBrZXlzOwogICAgIEVYUEVDVF9FUShPSywgZmV0Y2hlci5PYnRhaW5LZXkoZWNtXywgJmFzc2V0X2lkLCAma2V5cykpOwotICAgIEVYUEVDVF9FUSgyLCBrZXlzLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKDJVLCBrZXlzLnNpemUoKSk7CiAgICAgRVhQRUNUX0VRKDAsIGtleXNbMF0ua2V5X2lkKTsKICAgICBFWFBFQ1RfRVEoY29udGVudF9rZXlfWzBdLT5zaXplKCksIGtleXNbMF0ua2V5X2J5dGVzLT5zaXplKCkpOwogICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoY29udGVudF9rZXlfWzBdLT5kYXRhKCksCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9tb2NrL01vY2tDYXNQbHVnaW4uY3BwIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvbW9jay9Nb2NrQ2FzUGx1Z2luLmNwcAppbmRleCAxOGNkOWE0Li44NDA0YTgzIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9tb2NrL01vY2tDYXNQbHVnaW4uY3BwCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL21vY2svTW9ja0Nhc1BsdWdpbi5jcHAKQEAgLTQ5LDggKzQ5LDggQEAKIAogc3RhdHVzX3QgTW9ja0Nhc0ZhY3Rvcnk6OmNyZWF0ZVBsdWdpbigKICAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1faWQsCi0gICAgICAgIHVpbnQ2NF90IGFwcERhdGEsCi0gICAgICAgIENhc1BsdWdpbkNhbGxiYWNrIGNhbGxiYWNrLAorICAgICAgICB2b2lkKiAvKmFwcERhdGEqLywKKyAgICAgICAgQ2FzUGx1Z2luQ2FsbGJhY2sgLypjYWxsYmFjayovLAogICAgICAgICBDYXNQbHVnaW4gKipwbHVnaW4pIHsKICAgICBpZiAoIWlzU3lzdGVtSWRTdXBwb3J0ZWQoQ0Ffc3lzdGVtX2lkKSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtOTgsNyArOTgsNyBAQAogICAgIE1vY2tTZXNzaW9uTGlicmFyeTo6Z2V0KCktPmRlc3Ryb3lQbHVnaW4odGhpcyk7CiB9CiAKLXN0YXR1c190IE1vY2tDYXNQbHVnaW46OnNldFByaXZhdGVEYXRhKGNvbnN0IENhc0RhdGEgJmRhdGEpIHsKK3N0YXR1c190IE1vY2tDYXNQbHVnaW46OnNldFByaXZhdGVEYXRhKGNvbnN0IENhc0RhdGEmIC8qZGF0YSovKSB7CiAgICAgQUxPR1YoInNldFByaXZhdGVEYXRhIik7CiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMTIzLDcgKzEyMyw3IEBACiB9CiAKIHN0YXR1c190IE1vY2tDYXNQbHVnaW46OnNldFNlc3Npb25Qcml2YXRlRGF0YSgKLSAgICAgICAgY29uc3QgQ2FzU2Vzc2lvbklkICZzZXNzaW9uSWQsIGNvbnN0IENhc0RhdGEgJmRhdGEpIHsKKyAgICAgICAgY29uc3QgQ2FzU2Vzc2lvbklkICZzZXNzaW9uSWQsIGNvbnN0IENhc0RhdGEmIC8qZGF0YSovKSB7CiAgICAgQUxPR1YoInNldFNlc3Npb25Qcml2YXRlRGF0YTogc2Vzc2lvbklkPSVzIiwKICAgICAgICAgICAgIGFycmF5VG9TdHJpbmcoc2Vzc2lvbklkKS5zdHJpbmcoKSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwpAQCAtMTQ2LDcgKzE0Niw3IEBACiAgICAgaWYgKHNlc3Npb24gPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBBTE9HVigiRUNNOiBzaXplPSVkIiwgZWNtLnNpemUoKSk7CisgICAgQUxPR1YoIkVDTTogc2l6ZT0lenUiLCBlY20uc2l6ZSgpKTsKICAgICBBTE9HVigiRUNNOiBkYXRhPSVzIiwgYXJyYXlUb1N0cmluZyhlY20pLnN0cmluZygpKTsKIAogICAgIHJldHVybiBPSzsKQEAgLTE1NiwxNCArMTU2LDE0IEBACiAgICAgQUxPR1YoInByb2Nlc3NFbW0iKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAKLSAgICBBTE9HVigiRU1NOiBzaXplPSVkIiwgZW1tLnNpemUoKSk7CisgICAgQUxPR1YoIkVNTTogc2l6ZT0lenUiLCBlbW0uc2l6ZSgpKTsKICAgICBBTE9HVigiRU1NOiBkYXRhPSVzIiwgYXJyYXlUb1N0cmluZyhlbW0pLnN0cmluZygpKTsKIAogICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgTW9ja0Nhc1BsdWdpbjo6c2VuZEV2ZW50KAotICAgICAgICBpbnQzMl90IGV2ZW50LCBpbnQgYXJnLCBjb25zdCBDYXNEYXRhICZldmVudERhdGEpIHsKKyAgICAgICAgaW50MzJfdCBldmVudCwgaW50IC8qYXJnKi8sIGNvbnN0IENhc0RhdGEmIC8qZXZlbnREYXRhKi8pIHsKICAgICBBTE9HVigic2VuZEV2ZW50OiBldmVudD0lZCIsIGV2ZW50KTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAKQEAgLTE3OCw3ICsxNzgsNyBAQAogfQogCiBzdGF0dXNfdCBNb2NrQ2FzUGx1Z2luOjpyZWZyZXNoRW50aXRsZW1lbnRzKAotICAgICAgICBpbnQzMl90IHJlZnJlc2hUeXBlLCBjb25zdCBDYXNEYXRhICZyZWZyZXNoRGF0YSkgeworICAgICAgICBpbnQzMl90IC8qcmVmcmVzaFR5cGUqLywgY29uc3QgQ2FzRGF0YSAmcmVmcmVzaERhdGEpIHsKICAgICBBTE9HVigicmVmcmVzaEVudGl0bGVtZW50czogcmVmcmVzaERhdGE9JXMiLCBhcnJheVRvU3RyaW5nKHJlZnJlc2hEYXRhKS5zdHJpbmcoKSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogCkBAIC0yMTYsNyArMjE2LDcgQEAKICAgICAgICAgaW50MzJfdCBzcmNPZmZzZXQsCiAgICAgICAgIHZvaWQgKmRzdFB0ciwKICAgICAgICAgaW50MzJfdCBkc3RPZmZzZXQsCi0gICAgICAgIEFTdHJpbmcgKmVycm9yRGV0YWlsTXNnKSB7CisgICAgICAgIEFTdHJpbmcqIC8qZXJyb3JEZXRhaWxNc2cqLykgewogICAgIEFMT0dWKCJNb2NrRGVzY3JhbWJsZXJQbHVnaW46OmRlc2NyYW1ibGUoc2VjdXJlPSVkLCBzY3RybD0lZCwiCiAgICAgICAgICAgInN1YlNhbXBsZXM9JXMsIHNyY1B0cj0lcCwgZHN0UHRyPSVwLCBzcmNPZmZzZXQ9JWQsIGRzdE9mZnNldD0lZCkiLAogICAgICAgICAgIChpbnQpc2VjdXJlLCAoaW50KXNjcmFtYmxpbmdDb250cm9sLApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvbW9jay9Nb2NrQ2FzUGx1Z2luLmggYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9tb2NrL01vY2tDYXNQbHVnaW4uaAppbmRleCA5NjMyNDkyLi44MTA2OTkwIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9tb2NrL01vY2tDYXNQbHVnaW4uaAorKysgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9tb2NrL01vY2tDYXNQbHVnaW4uaApAQCAtMzksNyArMzksNyBAQAogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Q2FzUGx1Z2luRGVzY3JpcHRvcj4gKmRlc2NyaXB0b3JzKSBjb25zdCBvdmVycmlkZTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVBsdWdpbigKICAgICAgICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX2lkLAotICAgICAgICAgICAgdWludDY0X3QgYXBwRGF0YSwKKyAgICAgICAgICAgIHZvaWQgKmFwcERhdGEsCiAgICAgICAgICAgICBDYXNQbHVnaW5DYWxsYmFjayBjYWxsYmFjaywKICAgICAgICAgICAgIENhc1BsdWdpbiAqKnBsdWdpbikgb3ZlcnJpZGU7CiB9OwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQW5kcm9pZC5icCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NzNmY2YuLjAwMDAwMDAKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8vCi0vLyBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLWNjX2xpYnJhcnlfc2hhcmVkIHsKLSAgICBuYW1lOiAibGliZHJtY2xlYXJrZXlwbHVnaW4iLAotCi0gICAgc3JjczogWwotICAgICAgICAiQWVzQ3RyRGVjcnlwdG9yLmNwcCIsCi0gICAgICAgICJDbGVhcktleVVVSUQuY3BwIiwKLSAgICAgICAgIkNyZWF0ZVBsdWdpbkZhY3Rvcmllcy5jcHAiLAotICAgICAgICAiQ3J5cHRvRmFjdG9yeS5jcHAiLAotICAgICAgICAiQ3J5cHRvUGx1Z2luLmNwcCIsCi0gICAgICAgICJEcm1GYWN0b3J5LmNwcCIsCi0gICAgICAgICJEcm1QbHVnaW4uY3BwIiwKLSAgICAgICAgIkluaXREYXRhUGFyc2VyLmNwcCIsCi0gICAgICAgICJKc29uV2ViS2V5LmNwcCIsCi0gICAgICAgICJTZXNzaW9uLmNwcCIsCi0gICAgICAgICJTZXNzaW9uTGlicmFyeS5jcHAiLAotICAgICAgICAiVXRpbHMuY3BwIiwKLSAgICBdLAotCi0gICAgdmVuZG9yOiB0cnVlLAotICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogIm1lZGlhZHJtIiwKLQotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJjcnlwdG8iLAotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlidXRpbHMiLAotICAgIF0sCi0KLSAgICBzdGF0aWNfbGliczogWyJsaWJqc21uIl0sCi0KLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9pbmNsdWRlIiwKLSAgICBdLAotCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCi0gICAgZXhwb3J0X3N0YXRpY19saWJfaGVhZGVyczogWyJsaWJqc21uIl0sCi19Ci0KLS8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0vLyBCdWlsZCB1bml0IHRlc3RzCi0KLXN1YmRpcnMgPSBbInRlc3RzIl0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NyeXB0b0ZhY3RvcnkuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3J5cHRvRmFjdG9yeS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYjY0YzMuLjAwMDAwMDAKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3J5cHRvRmFjdG9yeS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJDbGVhcktleUNyeXB0b1BsdWdpbiIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KLQotI2luY2x1ZGUgIkNyeXB0b0ZhY3RvcnkuaCIKLQotI2luY2x1ZGUgIkNsZWFyS2V5VVVJRC5oIgotI2luY2x1ZGUgIkNyeXB0b1BsdWdpbi5oIgotI2luY2x1ZGUgIlNlc3Npb24uaCIKLSNpbmNsdWRlICJTZXNzaW9uTGlicmFyeS5oIgotCi1uYW1lc3BhY2UgY2xlYXJrZXlkcm0gewotCi1ib29sIENyeXB0b0ZhY3Rvcnk6OmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0pIGNvbnN0IHsKLSAgICByZXR1cm4gaXNDbGVhcktleVVVSUQodXVpZCk7Ci19Ci0KLWFuZHJvaWQ6OnN0YXR1c190IENyeXB0b0ZhY3Rvcnk6OmNyZWF0ZVBsdWdpbigKLSAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwKLSAgICAgICAgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUsCi0gICAgICAgIGFuZHJvaWQ6OkNyeXB0b1BsdWdpbioqIHBsdWdpbikgewotICAgIGlmICghaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCkpIHsKLSAgICAgICAgKnBsdWdpbiA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBhbmRyb2lkOjpCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgYW5kcm9pZDo6VmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZDsKLSAgICBzZXNzaW9uSWQuYXBwZW5kQXJyYXkocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oZGF0YSksIHNpemUpOwotCi0gICAgQ3J5cHRvUGx1Z2luICpjbGVhcktleVBsdWdpbiA9IG5ldyBDcnlwdG9QbHVnaW4oc2Vzc2lvbklkKTsKLSAgICBhbmRyb2lkOjpzdGF0dXNfdCByZXN1bHQgPSBjbGVhcktleVBsdWdpbi0+Z2V0SW5pdFN0YXR1cygpOwotICAgIGlmIChyZXN1bHQgPT0gYW5kcm9pZDo6T0spIHsKLSAgICAgICAgKnBsdWdpbiA9IGNsZWFyS2V5UGx1Z2luOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRlbGV0ZSBjbGVhcktleVBsdWdpbjsKLSAgICAgICAgKnBsdWdpbiA9IE5VTEw7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Ecm1GYWN0b3J5LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0RybUZhY3RvcnkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODMzMjFiLi4wMDAwMDAwCi0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0RybUZhY3RvcnkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiQ2xlYXJLZXlDcnlwdG9QbHVnaW4iCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLQotI2luY2x1ZGUgIkRybUZhY3RvcnkuaCIKLQotI2luY2x1ZGUgIkRybVBsdWdpbi5oIgotI2luY2x1ZGUgIkNsZWFyS2V5VVVJRC5oIgotI2luY2x1ZGUgIk1pbWVUeXBlLmgiCi0jaW5jbHVkZSAiU2Vzc2lvbkxpYnJhcnkuaCIKLQotbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKLQotYm9vbCBEcm1GYWN0b3J5Ojppc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90IHV1aWRbMTZdKSB7Ci0gICAgcmV0dXJuIGlzQ2xlYXJLZXlVVUlEKHV1aWQpOwotfQotCi1ib29sIERybUZhY3Rvcnk6OmlzQ29udGVudFR5cGVTdXBwb3J0ZWQoY29uc3QgYW5kcm9pZDo6U3RyaW5nOCAmdHlwZSkgewotICAgIC8vIFRoaXMgc2hvdWxkIG1hdGNoIHRoZSB0eXBlcyBoYW5kZWQgYnkgSW5pdERhdGFQYXJzZXIuCi0gICAgcmV0dXJuIHR5cGUgPT0ga0lzb0JtZmZWaWRlb01pbWVUeXBlIHx8Ci0gICAgICAgIHR5cGUgPT0ga0lzb0JtZmZBdWRpb01pbWVUeXBlIHx8Ci0gICAgICAgIHR5cGUgPT0ga0NlbmNJbml0RGF0YUZvcm1hdCB8fAotICAgICAgICB0eXBlID09IGtXZWJtVmlkZW9NaW1lVHlwZSB8fAotICAgICAgICB0eXBlID09IGtXZWJtQXVkaW9NaW1lVHlwZSB8fAotICAgICAgICB0eXBlID09IGtXZWJtSW5pdERhdGFGb3JtYXQ7Ci19Ci0KLWFuZHJvaWQ6OnN0YXR1c190IERybUZhY3Rvcnk6OmNyZWF0ZURybVBsdWdpbigKLSAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwKLSAgICAgICAgYW5kcm9pZDo6RHJtUGx1Z2luKiogcGx1Z2luKSB7Ci0gICAgaWYgKCFpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkKSkgewotICAgICAgICAqcGx1Z2luID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICAqcGx1Z2luID0gbmV3IERybVBsdWdpbihTZXNzaW9uTGlicmFyeTo6Z2V0KCkpOwotICAgIHJldHVybiBhbmRyb2lkOjpPSzsKLX0KLQotfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0RybVBsdWdpbi5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Ecm1QbHVnaW4uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzA3ZDg3Li4wMDAwMDAwCi0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0RybVBsdWdpbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiQ2xlYXJLZXlDcnlwdG9QbHVnaW4iCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KLQotI2luY2x1ZGUgIkRybVBsdWdpbi5oIgotCi0jaW5jbHVkZSAiU2Vzc2lvbi5oIgotCi1uYW1lc3BhY2UgewotY29uc3QgYW5kcm9pZDo6U3RyaW5nOCBrU3RyZWFtaW5nKCJTdHJlYW1pbmciKTsKLWNvbnN0IGFuZHJvaWQ6OlN0cmluZzgga09mZmxpbmUoIk9mZmxpbmUiKTsKLWNvbnN0IGFuZHJvaWQ6OlN0cmluZzgga1RydWUoIlRydWUiKTsKLQotY29uc3QgYW5kcm9pZDo6U3RyaW5nOCBrUXVlcnlLZXlMaWNlbnNlVHlwZSgiTGljZW5zZVR5cGUiKTsKLSAgICAvLyBWYWx1ZTogIlN0cmVhbWluZyIgb3IgIk9mZmxpbmUiCi1jb25zdCBhbmRyb2lkOjpTdHJpbmc4IGtRdWVyeUtleVBsYXlBbGxvd2VkKCJQbGF5QWxsb3dlZCIpOwotICAgIC8vIFZhbHVlOiAiVHJ1ZSIgb3IgIkZhbHNlIgotY29uc3QgYW5kcm9pZDo6U3RyaW5nOCBrUXVlcnlLZXlSZW5ld0FsbG93ZWQoIlJlbmV3QWxsb3dlZCIpOwotICAgIC8vIFZhbHVlOiAiVHJ1ZSIgb3IgIkZhbHNlIgotfTsKLQotbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKLQotdXNpbmcgYW5kcm9pZDo6c3A7Ci0KLURybVBsdWdpbjo6RHJtUGx1Z2luKFNlc3Npb25MaWJyYXJ5KiBzZXNzaW9uTGlicmFyeSkKLSAgICAgICAgOiBtU2Vzc2lvbkxpYnJhcnkoc2Vzc2lvbkxpYnJhcnkpIHsKLSAgICBtUGxheVBvbGljeS5jbGVhcigpOwotfQotCi1zdGF0dXNfdCBEcm1QbHVnaW46Om9wZW5TZXNzaW9uKFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKSB7Ci0gICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+Y3JlYXRlU2Vzc2lvbigpOwotICAgIHNlc3Npb25JZCA9IHNlc3Npb24tPnNlc3Npb25JZCgpOwotICAgIHJldHVybiBhbmRyb2lkOjpPSzsKLX0KLQotc3RhdHVzX3QgRHJtUGx1Z2luOjpjbG9zZVNlc3Npb24oY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpIHsKLSAgICBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25MaWJyYXJ5LT5maW5kU2Vzc2lvbihzZXNzaW9uSWQpOwotICAgIGlmIChzZXNzaW9uSWQuc2l6ZSgpID09IDApIHsKLSAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkJBRF9WQUxVRTsKLSAgICB9Ci0gICAgaWYgKHNlc3Npb24uZ2V0KCkpIHsKLSAgICAgICAgbVNlc3Npb25MaWJyYXJ5LT5kZXN0cm95U2Vzc2lvbihzZXNzaW9uKTsKLSAgICAgICAgcmV0dXJuIGFuZHJvaWQ6Ok9LOwotICAgIH0KLSAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKLX0KLQotc3RhdHVzX3QgRHJtUGx1Z2luOjpnZXRLZXlSZXF1ZXN0KAotICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNjb3BlLAotICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIGluaXREYXRhLAotICAgICAgICBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSwKLSAgICAgICAgS2V5VHlwZSBrZXlUeXBlLAotICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiYgb3B0aW9uYWxQYXJhbWV0ZXJzLAotICAgICAgICBWZWN0b3I8dWludDhfdD4mIHJlcXVlc3QsCi0gICAgICAgIFN0cmluZzgmIGRlZmF1bHRVcmwsCi0gICAgICAgIERybVBsdWdpbjo6S2V5UmVxdWVzdFR5cGUgKmtleVJlcXVlc3RUeXBlKSB7Ci0gICAgVU5VU0VEKG9wdGlvbmFsUGFyYW1ldGVycyk7Ci0gICAgaWYgKHNjb3BlLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBhbmRyb2lkOjpCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgaWYgKGtleVR5cGUgIT0ga0tleVR5cGVfU3RyZWFtaW5nKSB7Ci0gICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKLSAgICB9Ci0KLSAgICAqa2V5UmVxdWVzdFR5cGUgPSBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9Jbml0aWFsOwotICAgIGRlZmF1bHRVcmwuY2xlYXIoKTsKLSAgICBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25MaWJyYXJ5LT5maW5kU2Vzc2lvbihzY29wZSk7Ci0gICAgaWYgKCFzZXNzaW9uLmdldCgpKSB7Ci0gICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEOwotICAgIH0KLQotICAgIHJldHVybiBzZXNzaW9uLT5nZXRLZXlSZXF1ZXN0KGluaXREYXRhLCBtaW1lVHlwZSwgJnJlcXVlc3QpOwotfQotCi12b2lkIERybVBsdWdpbjo6c2V0UGxheVBvbGljeSgpIHsKLSAgICBtUGxheVBvbGljeS5jbGVhcigpOwotICAgIG1QbGF5UG9saWN5LmFkZChrUXVlcnlLZXlMaWNlbnNlVHlwZSwga1N0cmVhbWluZyk7Ci0gICAgbVBsYXlQb2xpY3kuYWRkKGtRdWVyeUtleVBsYXlBbGxvd2VkLCBrVHJ1ZSk7Ci0gICAgbVBsYXlQb2xpY3kuYWRkKGtRdWVyeUtleVJlbmV3QWxsb3dlZCwga1RydWUpOwotfQotCi1zdGF0dXNfdCBEcm1QbHVnaW46OnByb3ZpZGVLZXlSZXNwb25zZSgKLSAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzY29wZSwKLSAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiByZXNwb25zZSwKLSAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBrZXlTZXRJZCkgewotICAgIGlmIChzY29wZS5zaXplKCkgPT0gMCB8fCByZXNwb25zZS5zaXplKCkgPT0gMCkgewotICAgICAgICByZXR1cm4gYW5kcm9pZDo6QkFEX1ZBTFVFOwotICAgIH0KLSAgICBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25MaWJyYXJ5LT5maW5kU2Vzc2lvbihzY29wZSk7Ci0gICAgaWYgKCFzZXNzaW9uLmdldCgpKSB7Ci0gICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEOwotICAgIH0KLQotICAgIHNldFBsYXlQb2xpY3koKTsKLSAgICBzdGF0dXNfdCByZXMgPSBzZXNzaW9uLT5wcm92aWRlS2V5UmVzcG9uc2UocmVzcG9uc2UpOwotICAgIGlmIChyZXMgPT0gYW5kcm9pZDo6T0spIHsKLSAgICAgICAgLy8gVGhpcyBpcyBmb3IgdGVzdGluZyBBTWVkaWFEcm1fc2V0T25FdmVudExpc3RlbmVyIG9ubHkuCi0gICAgICAgIHNlbmRFdmVudChrRHJtUGx1Z2luRXZlbnRWZW5kb3JEZWZpbmVkLCAwLCAmc2NvcGUsIE5VTEwpOwotICAgICAgICBrZXlTZXRJZC5jbGVhcigpOwotICAgIH0KLSAgICByZXR1cm4gcmVzOwotfQotCi1zdGF0dXNfdCBEcm1QbHVnaW46OmdldFByb3BlcnR5U3RyaW5nKAotICAgICAgICBjb25zdCBTdHJpbmc4JiBuYW1lLCBTdHJpbmc4JiB2YWx1ZSkgY29uc3QgewotICAgIGlmIChuYW1lID09ICJ2ZW5kb3IiKSB7Ci0gICAgICAgIHZhbHVlID0gIkdvb2dsZSI7Ci0gICAgfSBlbHNlIGlmIChuYW1lID09ICJ2ZXJzaW9uIikgewotICAgICAgICB2YWx1ZSA9ICIxLjAiOwotICAgIH0gZWxzZSBpZiAobmFtZSA9PSAiZGVzY3JpcHRpb24iKSB7Ci0gICAgICAgIHZhbHVlID0gIkNsZWFyS2V5IENETSI7Ci0gICAgfSBlbHNlIGlmIChuYW1lID09ICJhbGdvcml0aG1zIikgewotICAgICAgICB2YWx1ZSA9ICIiOwotICAgIH0gZWxzZSBpZiAobmFtZSA9PSAibGlzdGVuZXJUZXN0U3VwcG9ydCIpIHsKLSAgICAgICAgdmFsdWUgPSAidHJ1ZSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIkFwcCByZXF1ZXN0ZWQgdW5rbm93biBzdHJpbmcgcHJvcGVydHkgJXMiLCBuYW1lLnN0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwotICAgIH0KLSAgICByZXR1cm4gYW5kcm9pZDo6T0s7Ci19Ci0KLXN0YXR1c190IERybVBsdWdpbjo6cXVlcnlLZXlTdGF0dXMoCi0gICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkLAotICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiYgaW5mb01hcCkgY29uc3QgewotCi0gICAgaWYgKHNlc3Npb25JZC5zaXplKCkgPT0gMCkgewotICAgICAgICByZXR1cm4gYW5kcm9pZDo6QkFEX1ZBTFVFOwotICAgIH0KLQotICAgIGluZm9NYXAuY2xlYXIoKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QbGF5UG9saWN5LnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGluZm9NYXAuYWRkKG1QbGF5UG9saWN5LmtleUF0KGkpLCBtUGxheVBvbGljeS52YWx1ZUF0KGkpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGFuZHJvaWQ6Ok9LOwotfQotfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Ecm1QbHVnaW4uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0RybVBsdWdpbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzdhNzA2Li4wMDAwMDAwCi0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0RybVBsdWdpbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIENMRUFSS0VZX0RSTV9QTFVHSU5fSF8KLSNkZWZpbmUgQ0xFQVJLRVlfRFJNX1BMVUdJTl9IXwotCi0jaW5jbHVkZSA8bWVkaWEvZHJtL0RybUFQSS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLQotI2luY2x1ZGUgIlNlc3Npb25MaWJyYXJ5LmgiCi0jaW5jbHVkZSAiVXRpbHMuaCIKLQotbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKLQotdXNpbmcgYW5kcm9pZDo6S2V5ZWRWZWN0b3I7Ci11c2luZyBhbmRyb2lkOjpMaXN0OwotdXNpbmcgYW5kcm9pZDo6c3RhdHVzX3Q7Ci11c2luZyBhbmRyb2lkOjpTdHJpbmc4OwotdXNpbmcgYW5kcm9pZDo6VmVjdG9yOwotCi1jbGFzcyBEcm1QbHVnaW4gOiBwdWJsaWMgYW5kcm9pZDo6RHJtUGx1Z2luIHsKLXB1YmxpYzoKLSAgICBleHBsaWNpdCBEcm1QbHVnaW4oU2Vzc2lvbkxpYnJhcnkqIHNlc3Npb25MaWJyYXJ5KTsKLQotICAgIHZpcnR1YWwgfkRybVBsdWdpbigpIHt9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5TZXNzaW9uKFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VTZXNzaW9uKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0S2V5UmVxdWVzdCgKLSAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2NvcGUsCi0gICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIG1pbWVUeXBlLAotICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgaW5pdERhdGFUeXBlLAotICAgICAgICAgICAgS2V5VHlwZSBrZXlUeXBlLAotICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4mIG9wdGlvbmFsUGFyYW1ldGVycywKLSAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgcmVxdWVzdCwKLSAgICAgICAgICAgIFN0cmluZzgmIGRlZmF1bHRVcmwsCi0gICAgICAgICAgICBEcm1QbHVnaW46OktleVJlcXVlc3RUeXBlICprZXlSZXF1ZXN0VHlwZSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHByb3ZpZGVLZXlSZXNwb25zZSgKLSAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2NvcGUsCi0gICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHJlc3BvbnNlLAotICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBrZXlTZXRJZCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUtleXMoY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpIHsKLSAgICAgICAgaWYgKHNlc3Npb25JZC5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkJBRF9WQUxVRTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3RvcmVLZXlzKAotICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCi0gICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIGtleVNldElkKSB7Ci0gICAgICAgIGlmIChzZXNzaW9uSWQuc2l6ZSgpID09IDAgfHwga2V5U2V0SWQuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlLZXlTdGF0dXMoCi0gICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCwKLSAgICAgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+JiBpbmZvTWFwKSBjb25zdDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvdmlzaW9uUmVxdWVzdCgKLSAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNlcnRfdHlwZSwKLSAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNlcnRfYXV0aG9yaXR5LAotICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiByZXF1ZXN0LAotICAgICAgICAgICAgU3RyaW5nOCYgZGVmYXVsdFVybCkgewotICAgICAgICBVTlVTRUQoY2VydF90eXBlKTsKLSAgICAgICAgVU5VU0VEKGNlcnRfYXV0aG9yaXR5KTsKLSAgICAgICAgVU5VU0VEKHJlcXVlc3QpOwotICAgICAgICBVTlVTRUQoZGVmYXVsdFVybCk7Ci0gICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHByb3ZpZGVQcm92aXNpb25SZXNwb25zZSgKLSAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgcmVzcG9uc2UsCi0gICAgICAgICAgICBWZWN0b3I8dWludDhfdD4mIGNlcnRpZmljYXRlLAotICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiB3cmFwcGVkS2V5KSB7Ci0gICAgICAgIFVOVVNFRChjZXJ0aWZpY2F0ZSk7Ci0gICAgICAgIFVOVVNFRCh3cmFwcGVkS2V5KTsKLSAgICAgICAgaWYgKHJlc3BvbnNlLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAvLyBlbXB0eSByZXNwb25zZQotICAgICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cmVTdG9wcyhMaXN0PFZlY3Rvcjx1aW50OF90PiA+JiBzZWN1cmVTdG9wcykgewotICAgICAgICBVTlVTRUQoc2VjdXJlU3RvcHMpOwotICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cmVTdG9wKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc3NpZCwgVmVjdG9yPHVpbnQ4X3Q+ICZzZWN1cmVTdG9wKSB7Ci0gICAgICAgIGlmIChzc2lkLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gYW5kcm9pZDo6QkFEX1ZBTFVFOwotICAgICAgICB9Ci0KLSAgICAgICAgVU5VU0VEKHNlY3VyZVN0b3ApOwotICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlU2VjdXJlU3RvcHMoY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzc1JlbGVhc2UpIHsKLSAgICAgICAgaWYgKHNzUmVsZWFzZS5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQWxsU2VjdXJlU3RvcHMoKSB7Ci0gICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb3BlcnR5U3RyaW5nKAotICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgbmFtZSwgU3RyaW5nOCYgdmFsdWUpIGNvbnN0OwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9wZXJ0eUJ5dGVBcnJheSgKLSAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIG5hbWUsIFZlY3Rvcjx1aW50OF90PiYgdmFsdWUpIGNvbnN0IHsKLSAgICAgICAgVU5VU0VEKG5hbWUpOwotICAgICAgICBVTlVTRUQodmFsdWUpOwotICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcm9wZXJ0eVN0cmluZygKLSAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIG5hbWUsIGNvbnN0IFN0cmluZzgmIHZhbHVlKSB7Ci0gICAgICAgIFVOVVNFRChuYW1lKTsKLSAgICAgICAgVU5VU0VEKHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJvcGVydHlCeXRlQXJyYXkoCi0gICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBuYW1lLCBjb25zdCBWZWN0b3I8dWludDhfdD4mIHZhbHVlKSB7Ci0gICAgICAgIFVOVVNFRChuYW1lKTsKLSAgICAgICAgVU5VU0VEKHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q2lwaGVyQWxnb3JpdGhtKAotICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsIGNvbnN0IFN0cmluZzgmIGFsZ29yaXRobSkgewotICAgICAgICBpZiAoc2Vzc2lvbklkLnNpemUoKSA9PSAwIHx8IGFsZ29yaXRobS5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYWNBbGdvcml0aG0oCi0gICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCwgY29uc3QgU3RyaW5nOCYgYWxnb3JpdGhtKSB7Ci0gICAgICAgIGlmIChzZXNzaW9uSWQuc2l6ZSgpID09IDAgfHwgYWxnb3JpdGhtLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gYW5kcm9pZDo6QkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGVuY3J5cHQoCi0gICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCwKLSAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYga2V5SWQsCi0gICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIGlucHV0LAotICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBpdiwKLSAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgb3V0cHV0KSB7Ci0gICAgICAgIGlmIChzZXNzaW9uSWQuc2l6ZSgpID09IDAgfHwga2V5SWQuc2l6ZSgpID09IDAgfHwKLSAgICAgICAgICAgICAgICBpbnB1dC5zaXplKCkgPT0gMCB8fCBpdi5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBVTlVTRUQob3V0cHV0KTsKLSAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVjcnlwdCgKLSAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkLAotICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBrZXlJZCwKLSAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgaW5wdXQsCi0gICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIGl2LAotICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBvdXRwdXQpIHsKLSAgICAgICAgaWYgKHNlc3Npb25JZC5zaXplKCkgPT0gMCB8fCBrZXlJZC5zaXplKCkgPT0gMCB8fAotICAgICAgICAgICAgICAgIGlucHV0LnNpemUoKSA9PSAwIHx8IGl2LnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gYW5kcm9pZDo6QkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIFVOVVNFRChvdXRwdXQpOwotICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzaWduKAotICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCi0gICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIGtleUlkLAotICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBtZXNzYWdlLAotICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBzaWduYXR1cmUpIHsKLSAgICAgICAgaWYgKHNlc3Npb25JZC5zaXplKCkgPT0gMCB8fCBrZXlJZC5zaXplKCkgPT0gMCB8fAotICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgVU5VU0VEKHNpZ25hdHVyZSk7Ci0gICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHZlcmlmeSgKLSAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkLAotICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBrZXlJZCwKLSAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgbWVzc2FnZSwKLSAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2lnbmF0dXJlLCBib29sJiBtYXRjaCkgewotICAgICAgICBpZiAoc2Vzc2lvbklkLnNpemUoKSA9PSAwIHx8IGtleUlkLnNpemUoKSA9PSAwIHx8Ci0gICAgICAgICAgICAgICAgbWVzc2FnZS5zaXplKCkgPT0gMCB8fCBzaWduYXR1cmUuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgVU5VU0VEKG1hdGNoKTsKLSAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2lnblJTQSgKLSAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkLAotICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWxnb3JpdGhtLAotICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBtZXNzYWdlLAotICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiB3cmFwcGVkS2V5LAotICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBzaWduYXR1cmUpIHsKLSAgICAgICAgaWYgKHNlc3Npb25JZC5zaXplKCkgPT0gMCB8fCBhbGdvcml0aG0uc2l6ZSgpID09IDAgfHwKLSAgICAgICAgICAgICAgICBtZXNzYWdlLnNpemUoKSA9PSAwIHx8IHdyYXBwZWRLZXkuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgVU5VU0VEKHNpZ25hdHVyZSk7Ci0gICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgdm9pZCBzZXRQbGF5UG9saWN5KCk7Ci0KLSAgICBhbmRyb2lkOjpLZXllZFZlY3RvcjxhbmRyb2lkOjpTdHJpbmc4LCBhbmRyb2lkOjpTdHJpbmc4PiBtUGxheVBvbGljeTsKLSAgICBTZXNzaW9uTGlicmFyeSogbVNlc3Npb25MaWJyYXJ5OwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRHJtUGx1Z2luKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCi0KLSNlbmRpZiAvLyBDTEVBUktFWV9EUk1fUExVR0lOX0hfCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9TZXNzaW9uLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1Nlc3Npb24uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjEwZjVlLi4wMDAwMDAwCi0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1Nlc3Npb24uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiQ2xlYXJLZXlDcnlwdG9QbHVnaW4iCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotI2luY2x1ZGUgIlNlc3Npb24uaCIKLQotI2luY2x1ZGUgIkFlc0N0ckRlY3J5cHRvci5oIgotI2luY2x1ZGUgIkluaXREYXRhUGFyc2VyLmgiCi0jaW5jbHVkZSAiSnNvbldlYktleS5oIgotCi1uYW1lc3BhY2UgY2xlYXJrZXlkcm0gewotCi11c2luZyBhbmRyb2lkOjpNdXRleDsKLXVzaW5nIGFuZHJvaWQ6OlN0cmluZzg7Ci11c2luZyBhbmRyb2lkOjpWZWN0b3I7Ci11c2luZyBhbmRyb2lkOjpzdGF0dXNfdDsKLQotc3RhdHVzX3QgU2Vzc2lvbjo6Z2V0S2V5UmVxdWVzdCgKLSAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwKLSAgICAgICAgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUsCi0gICAgICAgIFZlY3Rvcjx1aW50OF90Pioga2V5UmVxdWVzdCkgY29uc3QgewotICAgIEluaXREYXRhUGFyc2VyIHBhcnNlcjsKLSAgICByZXR1cm4gcGFyc2VyLnBhcnNlKGluaXREYXRhLCBtaW1lVHlwZSwga2V5UmVxdWVzdCk7Ci19Ci0KLXN0YXR1c190IFNlc3Npb246OnByb3ZpZGVLZXlSZXNwb25zZShjb25zdCBWZWN0b3I8dWludDhfdD4mIHJlc3BvbnNlKSB7Ci0gICAgU3RyaW5nOCByZXNwb25zZVN0cmluZygKLSAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHJlc3BvbnNlLmFycmF5KCkpLCByZXNwb25zZS5zaXplKCkpOwotICAgIEtleU1hcCBrZXlzOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU1hcExvY2spOwotICAgIEpzb25XZWJLZXkgcGFyc2VyOwotICAgIGlmIChwYXJzZXIuZXh0cmFjdEtleXNGcm9tSnNvbldlYktleVNldChyZXNwb25zZVN0cmluZywgJmtleXMpKSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga2V5cy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgY29uc3QgS2V5TWFwOjprZXlfdHlwZSYga2V5SWQgPSBrZXlzLmtleUF0KGkpOwotICAgICAgICAgICAgY29uc3QgS2V5TWFwOjp2YWx1ZV90eXBlJiBrZXkgPSBrZXlzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICBtS2V5TWFwLmFkZChrZXlJZCwga2V5KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5kcm9pZDo6T0s7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9VTktOT1dOOwotICAgIH0KLX0KLQotc3RhdHVzX3QgU2Vzc2lvbjo6ZGVjcnlwdCgKLSAgICAgICAgY29uc3QgS2V5SWQga2V5SWQsIGNvbnN0IEl2IGl2LCBjb25zdCB2b2lkKiBzb3VyY2UsCi0gICAgICAgIHZvaWQqIGRlc3RpbmF0aW9uLCBjb25zdCBTdWJTYW1wbGUqIHN1YlNhbXBsZXMsCi0gICAgICAgIHNpemVfdCBudW1TdWJTYW1wbGVzLCBzaXplX3QqIGJ5dGVzRGVjcnlwdGVkT3V0KSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU1hcExvY2spOwotCi0gICAgVmVjdG9yPHVpbnQ4X3Q+IGtleUlkVmVjdG9yOwotICAgIGtleUlkVmVjdG9yLmFwcGVuZEFycmF5KGtleUlkLCBrQmxvY2tTaXplKTsKLSAgICBpZiAobUtleU1hcC5pbmRleE9mS2V5KGtleUlkVmVjdG9yKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9OT19MSUNFTlNFOwotICAgIH0KLQotICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYga2V5ID0gbUtleU1hcC52YWx1ZUZvcihrZXlJZFZlY3Rvcik7Ci0gICAgQWVzQ3RyRGVjcnlwdG9yIGRlY3J5cHRvcjsKLSAgICByZXR1cm4gZGVjcnlwdG9yLmRlY3J5cHQoCi0gICAgICAgICAgICBrZXksIGl2LAotICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oc291cmNlKSwKLSAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGRlc3RpbmF0aW9uKSwgc3ViU2FtcGxlcywKLSAgICAgICAgICAgIG51bVN1YlNhbXBsZXMsIGJ5dGVzRGVjcnlwdGVkT3V0KTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1Nlc3Npb25MaWJyYXJ5LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1Nlc3Npb25MaWJyYXJ5LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQxOWY5Ny4uMDAwMDAwMAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9TZXNzaW9uTGlicmFyeS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJDbGVhcktleUNyeXB0b1BsdWdpbiIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotI2luY2x1ZGUgIlNlc3Npb25MaWJyYXJ5LmgiCi0KLW5hbWVzcGFjZSBjbGVhcmtleWRybSB7Ci0KLXVzaW5nIGFuZHJvaWQ6Ok11dGV4OwotdXNpbmcgYW5kcm9pZDo6c3A7Ci11c2luZyBhbmRyb2lkOjpTdHJpbmc4OwotdXNpbmcgYW5kcm9pZDo6VmVjdG9yOwotCi1NdXRleCBTZXNzaW9uTGlicmFyeTo6c1NpbmdsZXRvbkxvY2s7Ci1TZXNzaW9uTGlicmFyeSogU2Vzc2lvbkxpYnJhcnk6OnNTaW5nbGV0b24gPSBOVUxMOwotCi1TZXNzaW9uTGlicmFyeSogU2Vzc2lvbkxpYnJhcnk6OmdldCgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhzU2luZ2xldG9uTG9jayk7Ci0KLSAgICBpZiAoc1NpbmdsZXRvbiA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dEKCJJbnN0YW50aWF0aW5nIFNlc3Npb24gTGlicmFyeSBTaW5nbGV0b24uIik7Ci0gICAgICAgIHNTaW5nbGV0b24gPSBuZXcgU2Vzc2lvbkxpYnJhcnkoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc1NpbmdsZXRvbjsKLX0KLQotc3A8U2Vzc2lvbj4gU2Vzc2lvbkxpYnJhcnk6OmNyZWF0ZVNlc3Npb24oKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlc3Npb25zTG9jayk7Ci0KLSAgICBTdHJpbmc4IHNlc3Npb25JZFN0cmluZyA9IFN0cmluZzg6OmZvcm1hdCgiJXUiLCBtTmV4dFNlc3Npb25JZCk7Ci0gICAgbU5leHRTZXNzaW9uSWQgKz0gMTsKLSAgICBWZWN0b3I8dWludDhfdD4gc2Vzc2lvbklkOwotICAgIHNlc3Npb25JZC5hcHBlbmRBcnJheSgKLSAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHNlc3Npb25JZFN0cmluZy5zdHJpbmcoKSksCi0gICAgICAgICAgICBzZXNzaW9uSWRTdHJpbmcuc2l6ZSgpKTsKLQotICAgIG1TZXNzaW9ucy5hZGQoc2Vzc2lvbklkLCBuZXcgU2Vzc2lvbihzZXNzaW9uSWQpKTsKLSAgICByZXR1cm4gbVNlc3Npb25zLnZhbHVlRm9yKHNlc3Npb25JZCk7Ci19Ci0KLXNwPFNlc3Npb24+IFNlc3Npb25MaWJyYXJ5OjpmaW5kU2Vzc2lvbigKLSAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2Vzc2lvbnNMb2NrKTsKLSAgICBpZiAobVNlc3Npb25zLmluZGV4T2ZLZXkoc2Vzc2lvbklkKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIHNwPFNlc3Npb24+KE5VTEwpOwotICAgIH0KLSAgICByZXR1cm4gbVNlc3Npb25zLnZhbHVlRm9yKHNlc3Npb25JZCk7Ci19Ci0KLXZvaWQgU2Vzc2lvbkxpYnJhcnk6OmRlc3Ryb3lTZXNzaW9uKGNvbnN0IHNwPFNlc3Npb24+JiBzZXNzaW9uKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlc3Npb25zTG9jayk7XAotICAgIG1TZXNzaW9ucy5yZW1vdmVJdGVtKHNlc3Npb24tPnNlc3Npb25JZCgpKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9BbmRyb2lkLmJwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM2NzRlMQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzggQEAKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy8vCisKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGliY2xlYXJrZXljb21tb24iLAorICAgIHZlbmRvcjogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkNsZWFyS2V5VVVJRC5jcHAiLAorICAgICAgICAiVXRpbHMuY3BwIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiXSwKKworICAgIGluY2x1ZGVfZGlyczogWyJmcmFtZXdvcmtzL2F2L2luY2x1ZGUiXSwKKworICAgIHNoYXJlZF9saWJzOiBbImxpYnV0aWxzIl0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGludGVnZXJfb3ZlcmZsb3c6IHRydWUsCisgICAgfSwKK30KKwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlVVUlELmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9DbGVhcktleVVVSUQuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleVVVSUQuY3BwCnJlbmFtZSB0byBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vQ2xlYXJLZXlVVUlELmNwcApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvVXRpbHMuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL1V0aWxzLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvVXRpbHMuY3BwCnJlbmFtZSB0byBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vVXRpbHMuY3BwCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleVVVSUQuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL0NsZWFyS2V5VVVJRC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleVVVSUQuaApyZW5hbWUgdG8gZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvQ2xlYXJLZXlVVUlELmgKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L01pbWVUeXBlLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9NaW1lVHlwZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9NaW1lVHlwZS5oCnJlbmFtZSB0byBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9NaW1lVHlwZS5oCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9VdGlscy5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvVXRpbHMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvVXRpbHMuaApyZW5hbWUgdG8gZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvVXRpbHMuaApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQWVzQ3RyRGVjcnlwdG9yLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvQWVzQ3RyRGVjcnlwdG9yLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQWVzQ3RyRGVjcnlwdG9yLmNwcApyZW5hbWUgdG8gZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9BZXNDdHJEZWNyeXB0b3IuY3BwCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L0FuZHJvaWQuYnAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JhNTcwOAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvQW5kcm9pZC5icApAQCAtMCwwICsxLDY3IEBACisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisvLworCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmRybWNsZWFya2V5cGx1Z2luIiwKKyAgICB2ZW5kb3I6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJBZXNDdHJEZWNyeXB0b3IuY3BwIiwKKyAgICAgICAgIkNyZWF0ZVBsdWdpbkZhY3Rvcmllcy5jcHAiLAorICAgICAgICAiQ3J5cHRvRmFjdG9yeS5jcHAiLAorICAgICAgICAiQ3J5cHRvUGx1Z2luLmNwcCIsCisgICAgICAgICJEcm1GYWN0b3J5LmNwcCIsCisgICAgICAgICJEcm1QbHVnaW4uY3BwIiwKKyAgICAgICAgIkluaXREYXRhUGFyc2VyLmNwcCIsCisgICAgICAgICJKc29uV2ViS2V5LmNwcCIsCisgICAgICAgICJTZXNzaW9uLmNwcCIsCisgICAgICAgICJTZXNzaW9uTGlicmFyeS5jcHAiLAorICAgIF0sCisKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJtZWRpYWRybSIsCisKKyAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmNyeXB0byIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJjbGVhcmtleWNvbW1vbiIsCisgICAgICAgICJsaWJqc21uIgorICAgIF0sCisKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIGV4cG9ydF9zdGF0aWNfbGliX2hlYWRlcnM6IFsibGlianNtbiJdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvaW5jbHVkZSIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGludGVnZXJfb3ZlcmZsb3c6IHRydWUsCisgICAgfSwKK30KKworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vIEJ1aWxkIHVuaXQgdGVzdHMKKworc3ViZGlycyA9IFsidGVzdHMiXQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmNwcApyZW5hbWUgdG8gZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuY3BwCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L0NyeXB0b0ZhY3RvcnkuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9DcnlwdG9GYWN0b3J5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTVmOTJiCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9DcnlwdG9GYWN0b3J5LmNwcApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDbGVhcktleUNyeXB0b0ZhY3RvcnkiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisKKyNpbmNsdWRlICJDcnlwdG9GYWN0b3J5LmgiCisKKyNpbmNsdWRlICJDbGVhcktleVVVSUQuaCIKKyNpbmNsdWRlICJDcnlwdG9QbHVnaW4uaCIKKyNpbmNsdWRlICJTZXNzaW9uLmgiCisjaW5jbHVkZSAiU2Vzc2lvbkxpYnJhcnkuaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKworYm9vbCBDcnlwdG9GYWN0b3J5Ojppc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90IHV1aWRbMTZdKSBjb25zdCB7CisgICAgcmV0dXJuIGlzQ2xlYXJLZXlVVUlEKHV1aWQpOworfQorCithbmRyb2lkOjpzdGF0dXNfdCBDcnlwdG9GYWN0b3J5OjpjcmVhdGVQbHVnaW4oCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sCisgICAgICAgIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplLAorICAgICAgICBhbmRyb2lkOjpDcnlwdG9QbHVnaW4qKiBwbHVnaW4pIHsKKyAgICBpZiAoIWlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQpKSB7CisgICAgICAgICpwbHVnaW4gPSBOVUxMOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6QkFEX1ZBTFVFOworICAgIH0KKworICAgIGFuZHJvaWQ6OlZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWQ7CisgICAgc2Vzc2lvbklkLmFwcGVuZEFycmF5KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGRhdGEpLCBzaXplKTsKKworICAgIENyeXB0b1BsdWdpbiAqY2xlYXJLZXlQbHVnaW4gPSBuZXcgQ3J5cHRvUGx1Z2luKHNlc3Npb25JZCk7CisgICAgYW5kcm9pZDo6c3RhdHVzX3QgcmVzdWx0ID0gY2xlYXJLZXlQbHVnaW4tPmdldEluaXRTdGF0dXMoKTsKKyAgICBpZiAocmVzdWx0ID09IGFuZHJvaWQ6Ok9LKSB7CisgICAgICAgICpwbHVnaW4gPSBjbGVhcktleVBsdWdpbjsKKyAgICB9IGVsc2UgeworICAgICAgICBkZWxldGUgY2xlYXJLZXlQbHVnaW47CisgICAgICAgICpwbHVnaW4gPSBOVUxMOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3J5cHRvUGx1Z2luLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvQ3J5cHRvUGx1Z2luLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3J5cHRvUGx1Z2luLmNwcApyZW5hbWUgdG8gZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9DcnlwdG9QbHVnaW4uY3BwCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L0RybUZhY3RvcnkuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9Ecm1GYWN0b3J5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzAxZTQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9Ecm1GYWN0b3J5LmNwcApAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDbGVhcktleURybUZhY3RvcnkiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworI2luY2x1ZGUgIkRybUZhY3RvcnkuaCIKKworI2luY2x1ZGUgIkRybVBsdWdpbi5oIgorI2luY2x1ZGUgIkNsZWFyS2V5VVVJRC5oIgorI2luY2x1ZGUgIk1pbWVUeXBlLmgiCisjaW5jbHVkZSAiU2Vzc2lvbkxpYnJhcnkuaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKworYm9vbCBEcm1GYWN0b3J5Ojppc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90IHV1aWRbMTZdKSB7CisgICAgcmV0dXJuIGlzQ2xlYXJLZXlVVUlEKHV1aWQpOworfQorCitib29sIERybUZhY3Rvcnk6OmlzQ29udGVudFR5cGVTdXBwb3J0ZWQoY29uc3QgYW5kcm9pZDo6U3RyaW5nOCAmdHlwZSkgeworICAgIC8vIFRoaXMgc2hvdWxkIG1hdGNoIHRoZSB0eXBlcyBoYW5kZWQgYnkgSW5pdERhdGFQYXJzZXIuCisgICAgcmV0dXJuIHR5cGUgPT0ga0lzb0JtZmZWaWRlb01pbWVUeXBlIHx8CisgICAgICAgIHR5cGUgPT0ga0lzb0JtZmZBdWRpb01pbWVUeXBlIHx8CisgICAgICAgIHR5cGUgPT0ga0NlbmNJbml0RGF0YUZvcm1hdCB8fAorICAgICAgICB0eXBlID09IGtXZWJtVmlkZW9NaW1lVHlwZSB8fAorICAgICAgICB0eXBlID09IGtXZWJtQXVkaW9NaW1lVHlwZSB8fAorICAgICAgICB0eXBlID09IGtXZWJtSW5pdERhdGFGb3JtYXQ7Cit9CisKK2FuZHJvaWQ6OnN0YXR1c190IERybUZhY3Rvcnk6OmNyZWF0ZURybVBsdWdpbigKKyAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwKKyAgICAgICAgYW5kcm9pZDo6RHJtUGx1Z2luKiogcGx1Z2luKSB7CisgICAgaWYgKCFpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkKSkgeworICAgICAgICAqcGx1Z2luID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAqcGx1Z2luID0gbmV3IERybVBsdWdpbihTZXNzaW9uTGlicmFyeTo6Z2V0KCkpOworICAgIHJldHVybiBhbmRyb2lkOjpPSzsKK30KKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvRHJtUGx1Z2luLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvRHJtUGx1Z2luLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjhiOGMxCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9Ecm1QbHVnaW4uY3BwCkBAIC0wLDAgKzEsMjE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDbGVhcktleURybVBsdWdpbiIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorCisjaW5jbHVkZSAiRHJtUGx1Z2luLmgiCisjaW5jbHVkZSAiQ2xlYXJLZXlEcm1Qcm9wZXJ0aWVzLmgiCisjaW5jbHVkZSAiU2Vzc2lvbi5oIgorCituYW1lc3BhY2UgeworY29uc3QgYW5kcm9pZDo6U3RyaW5nOCBrU3RyZWFtaW5nKCJTdHJlYW1pbmciKTsKK2NvbnN0IGFuZHJvaWQ6OlN0cmluZzgga09mZmxpbmUoIk9mZmxpbmUiKTsKK2NvbnN0IGFuZHJvaWQ6OlN0cmluZzgga1RydWUoIlRydWUiKTsKKworY29uc3QgYW5kcm9pZDo6U3RyaW5nOCBrUXVlcnlLZXlMaWNlbnNlVHlwZSgiTGljZW5zZVR5cGUiKTsKKyAgICAvLyBWYWx1ZTogIlN0cmVhbWluZyIgb3IgIk9mZmxpbmUiCitjb25zdCBhbmRyb2lkOjpTdHJpbmc4IGtRdWVyeUtleVBsYXlBbGxvd2VkKCJQbGF5QWxsb3dlZCIpOworICAgIC8vIFZhbHVlOiAiVHJ1ZSIgb3IgIkZhbHNlIgorY29uc3QgYW5kcm9pZDo6U3RyaW5nOCBrUXVlcnlLZXlSZW5ld0FsbG93ZWQoIlJlbmV3QWxsb3dlZCIpOworICAgIC8vIFZhbHVlOiAiVHJ1ZSIgb3IgIkZhbHNlIgorfTsKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKwordXNpbmcgYW5kcm9pZDo6c3A7CisKK0RybVBsdWdpbjo6RHJtUGx1Z2luKFNlc3Npb25MaWJyYXJ5KiBzZXNzaW9uTGlicmFyeSkKKyAgICAgICAgOiBtU2Vzc2lvbkxpYnJhcnkoc2Vzc2lvbkxpYnJhcnkpIHsKKworICAgIG1QbGF5UG9saWN5LmNsZWFyKCk7CisgICAgaW5pdFByb3BlcnRpZXMoKTsKK30KKwordm9pZCBEcm1QbHVnaW46OmluaXRQcm9wZXJ0aWVzKCkgeworICAgIG1TdHJpbmdQcm9wZXJ0aWVzLmNsZWFyKCk7CisgICAgbVN0cmluZ1Byb3BlcnRpZXMuYWRkKGtWZW5kb3JLZXksIGtWZW5kb3JWYWx1ZSk7CisgICAgbVN0cmluZ1Byb3BlcnRpZXMuYWRkKGtWZXJzaW9uS2V5LCBrVmVyc2lvblZhbHVlKTsKKyAgICBtU3RyaW5nUHJvcGVydGllcy5hZGQoa1BsdWdpbkRlc2NyaXB0aW9uS2V5LCBrUGx1Z2luRGVzY3JpcHRpb25WYWx1ZSk7CisgICAgbVN0cmluZ1Byb3BlcnRpZXMuYWRkKGtBbGdvcml0aG1zS2V5LCBrQWxnb3JpdGhtc1ZhbHVlKTsKKyAgICBtU3RyaW5nUHJvcGVydGllcy5hZGQoa0xpc3RlbmVyVGVzdFN1cHBvcnRLZXksIGtMaXN0ZW5lclRlc3RTdXBwb3J0VmFsdWUpOworCisgICAgVmVjdG9yPHVpbnQ4X3Q+IHRlc3REZXZpY2VJZDsKKyAgICB0ZXN0RGV2aWNlSWQuYXBwZW5kQXJyYXkoa1Rlc3REZXZpY2VJZERhdGEsIHNpemVvZihrVGVzdERldmljZUlkRGF0YSkgLyBzaXplb2YodWludDhfdCkpOworICAgIG1CeXRlQXJyYXlQcm9wZXJ0aWVzLmFkZChrRGV2aWNlSWRLZXksIHRlc3REZXZpY2VJZCk7Cit9CisKK3N0YXR1c190IERybVBsdWdpbjo6b3BlblNlc3Npb24oVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpIHsKKyAgICBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25MaWJyYXJ5LT5jcmVhdGVTZXNzaW9uKCk7CisgICAgc2Vzc2lvbklkID0gc2Vzc2lvbi0+c2Vzc2lvbklkKCk7CisgICAgcmV0dXJuIGFuZHJvaWQ6Ok9LOworfQorCitzdGF0dXNfdCBEcm1QbHVnaW46OmNsb3NlU2Vzc2lvbihjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCkgeworICAgIHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmZpbmRTZXNzaW9uKHNlc3Npb25JZCk7CisgICAgaWYgKHNlc3Npb25JZC5zaXplKCkgPT0gMCkgeworICAgICAgICByZXR1cm4gYW5kcm9pZDo6QkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAoc2Vzc2lvbi5nZXQoKSkgeworICAgICAgICBtU2Vzc2lvbkxpYnJhcnktPmRlc3Ryb3lTZXNzaW9uKHNlc3Npb24pOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6T0s7CisgICAgfQorICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEOworfQorCitzdGF0dXNfdCBEcm1QbHVnaW46OmdldEtleVJlcXVlc3QoCisgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2NvcGUsCisgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgaW5pdERhdGEsCisgICAgICAgIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlLAorICAgICAgICBLZXlUeXBlIGtleVR5cGUsCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+JiBvcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgcmVxdWVzdCwKKyAgICAgICAgU3RyaW5nOCYgZGVmYXVsdFVybCwKKyAgICAgICAgRHJtUGx1Z2luOjpLZXlSZXF1ZXN0VHlwZSAqa2V5UmVxdWVzdFR5cGUpIHsKKyAgICBVTlVTRUQob3B0aW9uYWxQYXJhbWV0ZXJzKTsKKyAgICBpZiAoc2NvcGUuc2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAoa2V5VHlwZSAhPSBrS2V5VHlwZV9TdHJlYW1pbmcpIHsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgICprZXlSZXF1ZXN0VHlwZSA9IERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX0luaXRpYWw7CisgICAgZGVmYXVsdFVybC5jbGVhcigpOworICAgIHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmZpbmRTZXNzaW9uKHNjb3BlKTsKKyAgICBpZiAoIXNlc3Npb24uZ2V0KCkpIHsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CisgICAgfQorCisgICAgcmV0dXJuIHNlc3Npb24tPmdldEtleVJlcXVlc3QoaW5pdERhdGEsIG1pbWVUeXBlLCAmcmVxdWVzdCk7Cit9CisKK3ZvaWQgRHJtUGx1Z2luOjpzZXRQbGF5UG9saWN5KCkgeworICAgIG1QbGF5UG9saWN5LmNsZWFyKCk7CisgICAgbVBsYXlQb2xpY3kuYWRkKGtRdWVyeUtleUxpY2Vuc2VUeXBlLCBrU3RyZWFtaW5nKTsKKyAgICBtUGxheVBvbGljeS5hZGQoa1F1ZXJ5S2V5UGxheUFsbG93ZWQsIGtUcnVlKTsKKyAgICBtUGxheVBvbGljeS5hZGQoa1F1ZXJ5S2V5UmVuZXdBbGxvd2VkLCBrVHJ1ZSk7Cit9CisKK3N0YXR1c190IERybVBsdWdpbjo6cHJvdmlkZUtleVJlc3BvbnNlKAorICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNjb3BlLAorICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHJlc3BvbnNlLAorICAgICAgICBWZWN0b3I8dWludDhfdD4mIGtleVNldElkKSB7CisgICAgaWYgKHNjb3BlLnNpemUoKSA9PSAwIHx8IHJlc3BvbnNlLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpCQURfVkFMVUU7CisgICAgfQorICAgIHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmZpbmRTZXNzaW9uKHNjb3BlKTsKKyAgICBpZiAoIXNlc3Npb24uZ2V0KCkpIHsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CisgICAgfQorCisgICAgc2V0UGxheVBvbGljeSgpOworICAgIHN0YXR1c190IHJlcyA9IHNlc3Npb24tPnByb3ZpZGVLZXlSZXNwb25zZShyZXNwb25zZSk7CisgICAgaWYgKHJlcyA9PSBhbmRyb2lkOjpPSykgeworICAgICAgICAvLyBUaGlzIGlzIGZvciB0ZXN0aW5nIEFNZWRpYURybV9zZXRPbkV2ZW50TGlzdGVuZXIgb25seS4KKyAgICAgICAgc2VuZEV2ZW50KGtEcm1QbHVnaW5FdmVudFZlbmRvckRlZmluZWQsIDAsICZzY29wZSwgTlVMTCk7CisgICAgICAgIGtleVNldElkLmNsZWFyKCk7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK3N0YXR1c190IERybVBsdWdpbjo6Z2V0UHJvcGVydHlCeXRlQXJyYXkoCisgICAgICAgIGNvbnN0IFN0cmluZzgmIG5hbWUsIFZlY3Rvcjx1aW50OF90PiYgdmFsdWUpIGNvbnN0IHsKKyAgICBzc2l6ZV90IGluZGV4ID0gbUJ5dGVBcnJheVByb3BlcnRpZXMuaW5kZXhPZktleShuYW1lKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dFKCJBcHAgcmVxdWVzdGVkIHVua25vd24gcHJvcGVydHk6ICVzIiwgbmFtZS5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisgICAgdmFsdWUgPSBtQnl0ZUFycmF5UHJvcGVydGllcy52YWx1ZUF0KGluZGV4KTsKKyAgICByZXR1cm4gYW5kcm9pZDo6T0s7Cit9CisKK3N0YXR1c190IERybVBsdWdpbjo6c2V0UHJvcGVydHlCeXRlQXJyYXkoCisgICAgICAgIGNvbnN0IFN0cmluZzgmIG5hbWUsIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgdmFsdWUpCit7CisgICAgVU5VU0VEKHZhbHVlKTsKKyAgICBpZiAoMCA9PSBuYW1lLmNvbXBhcmUoa0RldmljZUlkS2V5KSkgeworICAgICAgICBBTE9HRCgiQ2Fubm90IHNldCBpbW11dGFibGUgcHJvcGVydHk6ICVzIiwgbmFtZS5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICAvLyBTZXR0aW5nIG9mIHVuZGVmaW5lZCBwcm9wZXJ0aWVzIGlzIG5vdCBzdXBwb3J0ZWQKKyAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBwcm9wZXJ0eSBieXRlIGFycmF5LCBrZXk9JXMiLCBuYW1lLnN0cmluZygpKTsKKyAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7Cit9CisKK3N0YXR1c190IERybVBsdWdpbjo6Z2V0UHJvcGVydHlTdHJpbmcoCisgICAgICAgIGNvbnN0IFN0cmluZzgmIG5hbWUsIFN0cmluZzgmIHZhbHVlKSBjb25zdCB7CisgICAgc3NpemVfdCBpbmRleCA9IG1TdHJpbmdQcm9wZXJ0aWVzLmluZGV4T2ZLZXkobmFtZSk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HRSgiQXBwIHJlcXVlc3RlZCB1bmtub3duIHByb3BlcnR5OiAlcyIsIG5hbWUuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorICAgIHZhbHVlID0gbVN0cmluZ1Byb3BlcnRpZXMudmFsdWVBdChpbmRleCk7CisgICAgcmV0dXJuIGFuZHJvaWQ6Ok9LOworfQorCitzdGF0dXNfdCBEcm1QbHVnaW46OnNldFByb3BlcnR5U3RyaW5nKAorICAgICAgICBjb25zdCBTdHJpbmc4JiBuYW1lLCBjb25zdCBTdHJpbmc4JiB2YWx1ZSkgeworICAgIFN0cmluZzggaW1tdXRhYmxlS2V5czsKKyAgICBpbW11dGFibGVLZXlzLmFwcGVuZEZvcm1hdCgiJXMsJXMsJXMsJXMiLAorICAgICAgICAgICAga0FsZ29yaXRobXNLZXkuc3RyaW5nKCksIGtQbHVnaW5EZXNjcmlwdGlvbktleS5zdHJpbmcoKSwKKyAgICAgICAgICAgIGtWZW5kb3JLZXkuc3RyaW5nKCksIGtWZXJzaW9uS2V5LnN0cmluZygpKTsKKyAgICBpZiAoaW1tdXRhYmxlS2V5cy5jb250YWlucyhuYW1lLnN0cmluZygpKSkgeworICAgICAgICBBTE9HRCgiQ2Fubm90IHNldCBpbW11dGFibGUgcHJvcGVydHk6ICVzIiwgbmFtZS5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICBzc2l6ZV90IGluZGV4ID0gbVN0cmluZ1Byb3BlcnRpZXMuaW5kZXhPZktleShuYW1lKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dFKCJDYW5ub3Qgc2V0IHVuZGVmaW5lZCBwcm9wZXJ0eSBzdHJpbmcsIGtleT0lcyIsIG5hbWUuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgaWYgKG1TdHJpbmdQcm9wZXJ0aWVzLmFkZChuYW1lLCB2YWx1ZSkgPCAwKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IHByb3BlcnR5IHN0cmluZywga2V5PSVzIiwgbmFtZS5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fVU5LTk9XTjsKKyAgICB9CisgICAgcmV0dXJuIGFuZHJvaWQ6Ok9LOworfQorCitzdGF0dXNfdCBEcm1QbHVnaW46OnF1ZXJ5S2V5U3RhdHVzKAorICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4mIGluZm9NYXApIGNvbnN0IHsKKworICAgIGlmIChzZXNzaW9uSWQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpbmZvTWFwLmNsZWFyKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGxheVBvbGljeS5zaXplKCk7ICsraSkgeworICAgICAgICBpbmZvTWFwLmFkZChtUGxheVBvbGljeS5rZXlBdChpKSwgbVBsYXlQb2xpY3kudmFsdWVBdChpKSk7CisgICAgfQorICAgIHJldHVybiBhbmRyb2lkOjpPSzsKK30KK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvSW5pdERhdGFQYXJzZXIuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9Jbml0RGF0YVBhcnNlci5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0luaXREYXRhUGFyc2VyLmNwcApyZW5hbWUgdG8gZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9Jbml0RGF0YVBhcnNlci5jcHAKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0pzb25XZWJLZXkuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9Kc29uV2ViS2V5LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvSnNvbldlYktleS5jcHAKcmVuYW1lIHRvIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvSnNvbldlYktleS5jcHAKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvU2Vzc2lvbi5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L1Nlc3Npb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzY2VhZWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L1Nlc3Npb24uY3BwCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNsZWFyS2V5U2Vzc2lvbiIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCisjaW5jbHVkZSAiU2Vzc2lvbi5oIgorCisjaW5jbHVkZSAiQWVzQ3RyRGVjcnlwdG9yLmgiCisjaW5jbHVkZSAiSW5pdERhdGFQYXJzZXIuaCIKKyNpbmNsdWRlICJKc29uV2ViS2V5LmgiCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK3VzaW5nIGFuZHJvaWQ6Ok11dGV4OwordXNpbmcgYW5kcm9pZDo6U3RyaW5nODsKK3VzaW5nIGFuZHJvaWQ6OlZlY3RvcjsKK3VzaW5nIGFuZHJvaWQ6OnN0YXR1c190OworCitzdGF0dXNfdCBTZXNzaW9uOjpnZXRLZXlSZXF1ZXN0KAorICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIGluaXREYXRhLAorICAgICAgICBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSwKKyAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+KiBrZXlSZXF1ZXN0KSBjb25zdCB7CisgICAgSW5pdERhdGFQYXJzZXIgcGFyc2VyOworICAgIHJldHVybiBwYXJzZXIucGFyc2UoaW5pdERhdGEsIG1pbWVUeXBlLCBrZXlSZXF1ZXN0KTsKK30KKworc3RhdHVzX3QgU2Vzc2lvbjo6cHJvdmlkZUtleVJlc3BvbnNlKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgcmVzcG9uc2UpIHsKKyAgICBTdHJpbmc4IHJlc3BvbnNlU3RyaW5nKAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4ocmVzcG9uc2UuYXJyYXkoKSksIHJlc3BvbnNlLnNpemUoKSk7CisgICAgS2V5TWFwIGtleXM7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTWFwTG9jayk7CisgICAgSnNvbldlYktleSBwYXJzZXI7CisgICAgaWYgKHBhcnNlci5leHRyYWN0S2V5c0Zyb21Kc29uV2ViS2V5U2V0KHJlc3BvbnNlU3RyaW5nLCAma2V5cykpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrZXlzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBLZXlNYXA6OmtleV90eXBlJiBrZXlJZCA9IGtleXMua2V5QXQoaSk7CisgICAgICAgICAgICBjb25zdCBLZXlNYXA6OnZhbHVlX3R5cGUmIGtleSA9IGtleXMudmFsdWVBdChpKTsKKyAgICAgICAgICAgIG1LZXlNYXAuYWRkKGtleUlkLCBrZXkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpPSzsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX1VOS05PV047CisgICAgfQorfQorCitzdGF0dXNfdCBTZXNzaW9uOjpkZWNyeXB0KAorICAgICAgICBjb25zdCBLZXlJZCBrZXlJZCwgY29uc3QgSXYgaXYsIGNvbnN0IHZvaWQqIHNvdXJjZSwKKyAgICAgICAgdm9pZCogZGVzdGluYXRpb24sIGNvbnN0IFN1YlNhbXBsZSogc3ViU2FtcGxlcywKKyAgICAgICAgc2l6ZV90IG51bVN1YlNhbXBsZXMsIHNpemVfdCogYnl0ZXNEZWNyeXB0ZWRPdXQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTWFwTG9jayk7CisKKyAgICBWZWN0b3I8dWludDhfdD4ga2V5SWRWZWN0b3I7CisgICAga2V5SWRWZWN0b3IuYXBwZW5kQXJyYXkoa2V5SWQsIGtCbG9ja1NpemUpOworICAgIGlmIChtS2V5TWFwLmluZGV4T2ZLZXkoa2V5SWRWZWN0b3IpIDwgMCkgeworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX05PX0xJQ0VOU0U7CisgICAgfQorCisgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBrZXkgPSBtS2V5TWFwLnZhbHVlRm9yKGtleUlkVmVjdG9yKTsKKyAgICBBZXNDdHJEZWNyeXB0b3IgZGVjcnlwdG9yOworICAgIHJldHVybiBkZWNyeXB0b3IuZGVjcnlwdCgKKyAgICAgICAgICAgIGtleSwgaXYsCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihzb3VyY2UpLAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oZGVzdGluYXRpb24pLCBzdWJTYW1wbGVzLAorICAgICAgICAgICAgbnVtU3ViU2FtcGxlcywgYnl0ZXNEZWNyeXB0ZWRPdXQpOworfQorCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9TZXNzaW9uTGlicmFyeS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L1Nlc3Npb25MaWJyYXJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjkyMzBlCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9TZXNzaW9uTGlicmFyeS5jcHAKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ2xlYXJLZXlTZXNzaW9uTGlicmFyeSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworI2luY2x1ZGUgIlNlc3Npb25MaWJyYXJ5LmgiCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK3VzaW5nIGFuZHJvaWQ6Ok11dGV4OwordXNpbmcgYW5kcm9pZDo6c3A7Cit1c2luZyBhbmRyb2lkOjpTdHJpbmc4OwordXNpbmcgYW5kcm9pZDo6VmVjdG9yOworCitNdXRleCBTZXNzaW9uTGlicmFyeTo6c1NpbmdsZXRvbkxvY2s7CitTZXNzaW9uTGlicmFyeSogU2Vzc2lvbkxpYnJhcnk6OnNTaW5nbGV0b24gPSBOVUxMOworCitTZXNzaW9uTGlicmFyeSogU2Vzc2lvbkxpYnJhcnk6OmdldCgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhzU2luZ2xldG9uTG9jayk7CisKKyAgICBpZiAoc1NpbmdsZXRvbiA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dEKCJJbnN0YW50aWF0aW5nIFNlc3Npb24gTGlicmFyeSBTaW5nbGV0b24uIik7CisgICAgICAgIHNTaW5nbGV0b24gPSBuZXcgU2Vzc2lvbkxpYnJhcnkoKTsKKyAgICB9CisKKyAgICByZXR1cm4gc1NpbmdsZXRvbjsKK30KKworc3A8U2Vzc2lvbj4gU2Vzc2lvbkxpYnJhcnk6OmNyZWF0ZVNlc3Npb24oKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlc3Npb25zTG9jayk7CisKKyAgICBTdHJpbmc4IHNlc3Npb25JZFN0cmluZyA9IFN0cmluZzg6OmZvcm1hdCgiJXUiLCBtTmV4dFNlc3Npb25JZCk7CisgICAgbU5leHRTZXNzaW9uSWQgKz0gMTsKKyAgICBWZWN0b3I8dWludDhfdD4gc2Vzc2lvbklkOworICAgIHNlc3Npb25JZC5hcHBlbmRBcnJheSgKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHNlc3Npb25JZFN0cmluZy5zdHJpbmcoKSksCisgICAgICAgICAgICBzZXNzaW9uSWRTdHJpbmcuc2l6ZSgpKTsKKworICAgIG1TZXNzaW9ucy5hZGQoc2Vzc2lvbklkLCBuZXcgU2Vzc2lvbihzZXNzaW9uSWQpKTsKKyAgICByZXR1cm4gbVNlc3Npb25zLnZhbHVlRm9yKHNlc3Npb25JZCk7Cit9CisKK3NwPFNlc3Npb24+IFNlc3Npb25MaWJyYXJ5OjpmaW5kU2Vzc2lvbigKKyAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2Vzc2lvbnNMb2NrKTsKKyAgICBpZiAobVNlc3Npb25zLmluZGV4T2ZLZXkoc2Vzc2lvbklkKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIHNwPFNlc3Npb24+KE5VTEwpOworICAgIH0KKyAgICByZXR1cm4gbVNlc3Npb25zLnZhbHVlRm9yKHNlc3Npb25JZCk7Cit9CisKK3ZvaWQgU2Vzc2lvbkxpYnJhcnk6OmRlc3Ryb3lTZXNzaW9uKGNvbnN0IHNwPFNlc3Npb24+JiBzZXNzaW9uKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlc3Npb25zTG9jayk7XAorICAgIG1TZXNzaW9ucy5yZW1vdmVJdGVtKHNlc3Npb24tPnNlc3Npb25JZCgpKTsKK30KKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0Flc0N0ckRlY3J5cHRvci5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9pbmNsdWRlL0Flc0N0ckRlY3J5cHRvci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9BZXNDdHJEZWNyeXB0b3IuaApyZW5hbWUgdG8gZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9pbmNsdWRlL0Flc0N0ckRlY3J5cHRvci5oCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L2luY2x1ZGUvQ2xlYXJLZXlEcm1Qcm9wZXJ0aWVzLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L2luY2x1ZGUvQ2xlYXJLZXlEcm1Qcm9wZXJ0aWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk5ZTE3NAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvaW5jbHVkZS9DbGVhcktleURybVByb3BlcnRpZXMuaApAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDTEVBUktFWV9EUk1fUFJPUEVSVElFU19IXworI2RlZmluZSBDTEVBUktFWV9EUk1fUFJPUEVSVElFU19IXworCisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCitzdGF0aWMgY29uc3QgYW5kcm9pZDo6U3RyaW5nOCBrVmVuZG9yS2V5KCJ2ZW5kb3IiKTsKK3N0YXRpYyBjb25zdCBhbmRyb2lkOjpTdHJpbmc4IGtWZW5kb3JWYWx1ZSgiR29vZ2xlIik7CitzdGF0aWMgY29uc3QgYW5kcm9pZDo6U3RyaW5nOCBrVmVyc2lvbktleSgidmVyc2lvbiIpOworc3RhdGljIGNvbnN0IGFuZHJvaWQ6OlN0cmluZzgga1ZlcnNpb25WYWx1ZSgiMS4wIik7CitzdGF0aWMgY29uc3QgYW5kcm9pZDo6U3RyaW5nOCBrUGx1Z2luRGVzY3JpcHRpb25LZXkoImRlc2NyaXB0aW9uIik7CitzdGF0aWMgY29uc3QgYW5kcm9pZDo6U3RyaW5nOCBrUGx1Z2luRGVzY3JpcHRpb25WYWx1ZSgiQ2xlYXJLZXkgQ0RNIik7CitzdGF0aWMgY29uc3QgYW5kcm9pZDo6U3RyaW5nOCBrQWxnb3JpdGhtc0tleSgiYWxnb3JpdGhtcyIpOworc3RhdGljIGNvbnN0IGFuZHJvaWQ6OlN0cmluZzgga0FsZ29yaXRobXNWYWx1ZSgiIik7CitzdGF0aWMgY29uc3QgYW5kcm9pZDo6U3RyaW5nOCBrTGlzdGVuZXJUZXN0U3VwcG9ydEtleSgibGlzdGVuZXJUZXN0U3VwcG9ydCIpOworc3RhdGljIGNvbnN0IGFuZHJvaWQ6OlN0cmluZzgga0xpc3RlbmVyVGVzdFN1cHBvcnRWYWx1ZSgidHJ1ZSIpOworCitzdGF0aWMgY29uc3QgYW5kcm9pZDo6U3RyaW5nOCBrRGV2aWNlSWRLZXkoImRldmljZUlkIik7CitzdGF0aWMgY29uc3QgdWludDhfdCBrVGVzdERldmljZUlkRGF0YVtdID0KKyAgICAgICAgezB4MCwgMHgxLCAweDIsIDB4MywgMHg0LCAweDUsIDB4NiwgMHg3LAorICAgICAgICAgMHg4LCAweDksIDB4YSwgMHhiLCAweGMsIDB4ZCwgMHhlLCAweGZ9OworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KKworI2VuZGlmIC8vIENMRUFSS0VZX0RSTV9QUk9QRVJUSUVTX0hfCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleVR5cGVzLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L2luY2x1ZGUvQ2xlYXJLZXlUeXBlcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleVR5cGVzLmgKcmVuYW1lIHRvIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvaW5jbHVkZS9DbGVhcktleVR5cGVzLmgKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9pbmNsdWRlL0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuaApyZW5hbWUgdG8gZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9pbmNsdWRlL0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5oCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DcnlwdG9GYWN0b3J5LmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L2luY2x1ZGUvQ3J5cHRvRmFjdG9yeS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DcnlwdG9GYWN0b3J5LmgKcmVuYW1lIHRvIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvaW5jbHVkZS9DcnlwdG9GYWN0b3J5LmgKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NyeXB0b1BsdWdpbi5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9pbmNsdWRlL0NyeXB0b1BsdWdpbi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DcnlwdG9QbHVnaW4uaApyZW5hbWUgdG8gZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9pbmNsdWRlL0NyeXB0b1BsdWdpbi5oCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Ecm1GYWN0b3J5LmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L2luY2x1ZGUvRHJtRmFjdG9yeS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Ecm1GYWN0b3J5LmgKcmVuYW1lIHRvIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvaW5jbHVkZS9Ecm1GYWN0b3J5LmgKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvaW5jbHVkZS9Ecm1QbHVnaW4uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvaW5jbHVkZS9Ecm1QbHVnaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmE0MmU1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9pbmNsdWRlL0RybVBsdWdpbi5oCkBAIC0wLDAgKzEsMjc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDTEVBUktFWV9EUk1fUExVR0lOX0hfCisjZGVmaW5lIENMRUFSS0VZX0RSTV9QTFVHSU5fSF8KKworI2luY2x1ZGUgPG1lZGlhL2RybS9Ecm1BUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKKyNpbmNsdWRlICJTZXNzaW9uTGlicmFyeS5oIgorI2luY2x1ZGUgIlV0aWxzLmgiCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK3VzaW5nIGFuZHJvaWQ6OktleWVkVmVjdG9yOwordXNpbmcgYW5kcm9pZDo6TGlzdDsKK3VzaW5nIGFuZHJvaWQ6OnN0YXR1c190OwordXNpbmcgYW5kcm9pZDo6U3RyaW5nODsKK3VzaW5nIGFuZHJvaWQ6OlZlY3RvcjsKKworY2xhc3MgRHJtUGx1Z2luIDogcHVibGljIGFuZHJvaWQ6OkRybVBsdWdpbiB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgRHJtUGx1Z2luKFNlc3Npb25MaWJyYXJ5KiBzZXNzaW9uTGlicmFyeSk7CisKKyAgICB2aXJ0dWFsIH5Ecm1QbHVnaW4oKSB7fQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuU2Vzc2lvbihWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlU2Vzc2lvbihjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEtleVJlcXVlc3QoCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNjb3BlLAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBtaW1lVHlwZSwKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGluaXREYXRhVHlwZSwKKyAgICAgICAgICAgIEtleVR5cGUga2V5VHlwZSwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+JiBvcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4mIHJlcXVlc3QsCisgICAgICAgICAgICBTdHJpbmc4JiBkZWZhdWx0VXJsLAorICAgICAgICAgICAgRHJtUGx1Z2luOjpLZXlSZXF1ZXN0VHlwZSAqa2V5UmVxdWVzdFR5cGUpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBwcm92aWRlS2V5UmVzcG9uc2UoCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNjb3BlLAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiByZXNwb25zZSwKKyAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYga2V5U2V0SWQpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVLZXlzKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKSB7CisgICAgICAgIGlmIChzZXNzaW9uSWQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCByZXN0b3JlS2V5cygKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBrZXlTZXRJZCkgeworICAgICAgICBpZiAoc2Vzc2lvbklkLnNpemUoKSA9PSAwIHx8IGtleVNldElkLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gYW5kcm9pZDo6QkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5S2V5U3RhdHVzKAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiYgaW5mb01hcCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb3Zpc2lvblJlcXVlc3QoCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBjZXJ0X3R5cGUsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBjZXJ0X2F1dGhvcml0eSwKKyAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgcmVxdWVzdCwKKyAgICAgICAgICAgIFN0cmluZzgmIGRlZmF1bHRVcmwpIHsKKyAgICAgICAgVU5VU0VEKGNlcnRfdHlwZSk7CisgICAgICAgIFVOVVNFRChjZXJ0X2F1dGhvcml0eSk7CisgICAgICAgIFVOVVNFRChyZXF1ZXN0KTsKKyAgICAgICAgVU5VU0VEKGRlZmF1bHRVcmwpOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBwcm92aWRlUHJvdmlzaW9uUmVzcG9uc2UoCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHJlc3BvbnNlLAorICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBjZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgd3JhcHBlZEtleSkgeworICAgICAgICBVTlVTRUQoY2VydGlmaWNhdGUpOworICAgICAgICBVTlVTRUQod3JhcHBlZEtleSk7CisgICAgICAgIGlmIChyZXNwb25zZS5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgLy8gZW1wdHkgcmVzcG9uc2UKKyAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcHMoTGlzdDxWZWN0b3I8dWludDhfdD4gPiYgc2VjdXJlU3RvcHMpIHsKKyAgICAgICAgVU5VU0VEKHNlY3VyZVN0b3BzKTsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNzaWQsIFZlY3Rvcjx1aW50OF90PiAmc2VjdXJlU3RvcCkgeworICAgICAgICBpZiAoc3NpZC5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIFVOVVNFRChzZWN1cmVTdG9wKTsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZVNlY3VyZVN0b3BzKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc3NSZWxlYXNlKSB7CisgICAgICAgIGlmIChzc1JlbGVhc2Uuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUFsbFNlY3VyZVN0b3BzKCkgeworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRIZGNwTGV2ZWxzKEhkY3BMZXZlbCAqY29ubmVjdGVkTGV2ZWwsCisgICAgICAgICAgICBIZGNwTGV2ZWwgKm1heExldmVsKSBjb25zdCB7CisgICAgICAgIFVOVVNFRChjb25uZWN0ZWRMZXZlbCk7CisgICAgICAgIFVOVVNFRChtYXhMZXZlbCk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TnVtYmVyT2ZTZXNzaW9ucyh1aW50MzJfdCAqY3VycmVudFNlc3Npb25zLAorICAgICAgICAgICAgdWludDMyX3QgKm1heFNlc3Npb25zKSBjb25zdCB7CisgICAgICAgIFVOVVNFRChjdXJyZW50U2Vzc2lvbnMpOworICAgICAgICBVTlVTRUQobWF4U2Vzc2lvbnMpOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cml0eUxldmVsKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAorICAgICAgICAgICAgU2VjdXJpdHlMZXZlbCAqbGV2ZWwpIGNvbnN0IHsKKyAgICAgICAgVU5VU0VEKHNlc3Npb25JZCk7CisgICAgICAgIFVOVVNFRChsZXZlbCk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFNlY3VyaXR5TGV2ZWwoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCisgICAgICAgICAgICBjb25zdCBTZWN1cml0eUxldmVsJiBsZXZlbCkgeworICAgICAgICBVTlVTRUQoc2Vzc2lvbklkKTsKKyAgICAgICAgVU5VU0VEKGxldmVsKTsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvcGVydHlTdHJpbmcoCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBuYW1lLCBTdHJpbmc4JiB2YWx1ZSkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb3BlcnR5Qnl0ZUFycmF5KAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgbmFtZSwgVmVjdG9yPHVpbnQ4X3Q+JiB2YWx1ZSkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByb3BlcnR5U3RyaW5nKAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgbmFtZSwgY29uc3QgU3RyaW5nOCYgdmFsdWUpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcm9wZXJ0eUJ5dGVBcnJheSgKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIG5hbWUsIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgdmFsdWUpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDaXBoZXJBbGdvcml0aG0oCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCwgY29uc3QgU3RyaW5nOCYgYWxnb3JpdGhtKSB7CisgICAgICAgIGlmIChzZXNzaW9uSWQuc2l6ZSgpID09IDAgfHwgYWxnb3JpdGhtLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gYW5kcm9pZDo6QkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hY0FsZ29yaXRobSgKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkLCBjb25zdCBTdHJpbmc4JiBhbGdvcml0aG0pIHsKKyAgICAgICAgaWYgKHNlc3Npb25JZC5zaXplKCkgPT0gMCB8fCBhbGdvcml0aG0uc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZW5jcnlwdCgKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBrZXlJZCwKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgaW5wdXQsCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIGl2LAorICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBvdXRwdXQpIHsKKyAgICAgICAgaWYgKHNlc3Npb25JZC5zaXplKCkgPT0gMCB8fCBrZXlJZC5zaXplKCkgPT0gMCB8fAorICAgICAgICAgICAgICAgIGlucHV0LnNpemUoKSA9PSAwIHx8IGl2LnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gYW5kcm9pZDo6QkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIFVOVVNFRChvdXRwdXQpOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBkZWNyeXB0KAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIGtleUlkLAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBpbnB1dCwKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgaXYsCisgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4mIG91dHB1dCkgeworICAgICAgICBpZiAoc2Vzc2lvbklkLnNpemUoKSA9PSAwIHx8IGtleUlkLnNpemUoKSA9PSAwIHx8CisgICAgICAgICAgICAgICAgaW5wdXQuc2l6ZSgpID09IDAgfHwgaXYuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgVU5VU0VEKG91dHB1dCk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNpZ24oCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYga2V5SWQsCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIG1lc3NhZ2UsCisgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4mIHNpZ25hdHVyZSkgeworICAgICAgICBpZiAoc2Vzc2lvbklkLnNpemUoKSA9PSAwIHx8IGtleUlkLnNpemUoKSA9PSAwIHx8CisgICAgICAgICAgICAgICAgbWVzc2FnZS5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBVTlVTRUQoc2lnbmF0dXJlKTsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgdmVyaWZ5KAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIGtleUlkLAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBtZXNzYWdlLAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzaWduYXR1cmUsIGJvb2wmIG1hdGNoKSB7CisgICAgICAgIGlmIChzZXNzaW9uSWQuc2l6ZSgpID09IDAgfHwga2V5SWQuc2l6ZSgpID09IDAgfHwKKyAgICAgICAgICAgICAgICBtZXNzYWdlLnNpemUoKSA9PSAwIHx8IHNpZ25hdHVyZS5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBVTlVTRUQobWF0Y2gpOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzaWduUlNBKAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhbGdvcml0aG0sCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIG1lc3NhZ2UsCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHdyYXBwZWRLZXksCisgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4mIHNpZ25hdHVyZSkgeworICAgICAgICBpZiAoc2Vzc2lvbklkLnNpemUoKSA9PSAwIHx8IGFsZ29yaXRobS5zaXplKCkgPT0gMCB8fAorICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2l6ZSgpID09IDAgfHwgd3JhcHBlZEtleS5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBVTlVTRUQoc2lnbmF0dXJlKTsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworcHJpdmF0ZToKKyAgICB2b2lkIGluaXRQcm9wZXJ0aWVzKCk7CisgICAgdm9pZCBzZXRQbGF5UG9saWN5KCk7CisKKyAgICBhbmRyb2lkOjpLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtUGxheVBvbGljeTsKKyAgICBhbmRyb2lkOjpLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtU3RyaW5nUHJvcGVydGllczsKKyAgICBhbmRyb2lkOjpLZXllZFZlY3RvcjxTdHJpbmc4LCBWZWN0b3I8dWludDhfdD4+IG1CeXRlQXJyYXlQcm9wZXJ0aWVzOworCisgICAgU2Vzc2lvbkxpYnJhcnkqIG1TZXNzaW9uTGlicmFyeTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERybVBsdWdpbik7Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQorCisjZW5kaWYgLy8gQ0xFQVJLRVlfRFJNX1BMVUdJTl9IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvSW5pdERhdGFQYXJzZXIuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvaW5jbHVkZS9Jbml0RGF0YVBhcnNlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Jbml0RGF0YVBhcnNlci5oCnJlbmFtZSB0byBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L2luY2x1ZGUvSW5pdERhdGFQYXJzZXIuaApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvSnNvbldlYktleS5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9pbmNsdWRlL0pzb25XZWJLZXkuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvSnNvbldlYktleS5oCnJlbmFtZSB0byBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L2luY2x1ZGUvSnNvbldlYktleS5oCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9TZXNzaW9uLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L2luY2x1ZGUvU2Vzc2lvbi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9TZXNzaW9uLmgKcmVuYW1lIHRvIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvaW5jbHVkZS9TZXNzaW9uLmgKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1Nlc3Npb25MaWJyYXJ5LmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L2luY2x1ZGUvU2Vzc2lvbkxpYnJhcnkuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvU2Vzc2lvbkxpYnJhcnkuaApyZW5hbWUgdG8gZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9pbmNsdWRlL1Nlc3Npb25MaWJyYXJ5LmgKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0Flc0N0ckRlY3J5cHRvclVuaXR0ZXN0LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvdGVzdHMvQWVzQ3RyRGVjcnlwdG9yVW5pdHRlc3QuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9BZXNDdHJEZWNyeXB0b3JVbml0dGVzdC5jcHAKcmVuYW1lIHRvIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvdGVzdHMvQWVzQ3RyRGVjcnlwdG9yVW5pdHRlc3QuY3BwCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L3Rlc3RzL0FuZHJvaWQuYnAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L3Rlc3RzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQxOTg2NQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvdGVzdHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDQyIEBACisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQnVpbGRzIENsZWFyS2V5IERybSBUZXN0cworLy8KKworY2NfdGVzdCB7CisgICAgbmFtZTogIkNsZWFyS2V5RHJtVW5pdFRlc3QiLAorICAgIHZlbmRvcjogdHJ1ZSwKKworICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIl0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJBZXNDdHJEZWNyeXB0b3JVbml0dGVzdC5jcHAiLAorICAgICAgICAiSW5pdERhdGFQYXJzZXJVbml0dGVzdC5jcHAiLAorICAgICAgICAiSnNvbldlYktleVVuaXR0ZXN0LmNwcCIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYmNsZWFya2V5Y29tbW9uIl0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY3J5cHRvIiwKKyAgICAgICAgImxpYmRybWNsZWFya2V5cGx1Z2luIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbIm1lZGlhX3BsdWdpbl9oZWFkZXJzIl0sCit9CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9Jbml0RGF0YVBhcnNlclVuaXR0ZXN0LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvdGVzdHMvSW5pdERhdGFQYXJzZXJVbml0dGVzdC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0luaXREYXRhUGFyc2VyVW5pdHRlc3QuY3BwCnJlbmFtZSB0byBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L3Rlc3RzL0luaXREYXRhUGFyc2VyVW5pdHRlc3QuY3BwCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9Kc29uV2ViS2V5VW5pdHRlc3QuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC90ZXN0cy9Kc29uV2ViS2V5VW5pdHRlc3QuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9Kc29uV2ViS2V5VW5pdHRlc3QuY3BwCnJlbmFtZSB0byBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L3Rlc3RzL0pzb25XZWJLZXlVbml0dGVzdC5jcHAKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQWVzQ3RyRGVjcnlwdG9yLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQWVzQ3RyRGVjcnlwdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmNlMDc5MAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQWVzQ3RyRGVjcnlwdG9yLmNwcApAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJoaWRsX0NsZWFya2V5RGVjcnlwdG9yIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9hZXMuaD4KKworI2luY2x1ZGUgIkFlc0N0ckRlY3J5cHRvci5oIgorI2luY2x1ZGUgIkNsZWFyS2V5VHlwZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBkcm0geworbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIGNsZWFya2V5IHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTdWJTYW1wbGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN0YXR1czsKKworc3RhdGljIGNvbnN0IHNpemVfdCBrQmxvY2tCaXRDb3VudCA9IGtCbG9ja1NpemUgKiA4OworCitTdGF0dXMgQWVzQ3RyRGVjcnlwdG9yOjpkZWNyeXB0KAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYga2V5LAorICAgICAgICBjb25zdCBJdiBpdiwgY29uc3QgdWludDhfdCogc291cmNlLAorICAgICAgICB1aW50OF90KiBkZXN0aW5hdGlvbiwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8U3ViU2FtcGxlPiBzdWJTYW1wbGVzLAorICAgICAgICBzaXplX3QgbnVtU3ViU2FtcGxlcywKKyAgICAgICAgc2l6ZV90KiBieXRlc0RlY3J5cHRlZE91dCkgeworICAgIHVpbnQzMl90IGJsb2NrT2Zmc2V0ID0gMDsKKyAgICB1aW50OF90IHByZXZpb3VzRW5jcnlwdGVkQ291bnRlcltrQmxvY2tTaXplXTsKKyAgICBtZW1zZXQocHJldmlvdXNFbmNyeXB0ZWRDb3VudGVyLCAwLCBrQmxvY2tTaXplKTsKKworICAgIGlmIChrZXkuc2l6ZSgpICE9IGtCbG9ja1NpemUgfHwgKHNpemVvZihJdikgLyBzaXplb2YodWludDhfdCkpICE9IGtCbG9ja1NpemUpIHsKKyAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI2Mzk4Mjc2OCIpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fREVDUllQVDsKKyAgICB9CisKKyAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICBBRVNfS0VZIG9wZW5zc2xLZXk7CisgICAgQUVTX3NldF9lbmNyeXB0X2tleShrZXkuZGF0YSgpLCBrQmxvY2tCaXRDb3VudCwgJm9wZW5zc2xLZXkpOworICAgIEl2IG9wZW5zc2xJdjsKKyAgICBtZW1jcHkob3BlbnNzbEl2LCBpdiwgc2l6ZW9mKG9wZW5zc2xJdikpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TdWJTYW1wbGVzOyArK2kpIHsKKyAgICAgICAgY29uc3QgU3ViU2FtcGxlJiBzdWJTYW1wbGUgPSBzdWJTYW1wbGVzW2ldOworCisgICAgICAgIGlmIChzdWJTYW1wbGUubnVtQnl0ZXNPZkNsZWFyRGF0YSA+IDApIHsKKyAgICAgICAgICAgIG1lbWNweShkZXN0aW5hdGlvbiArIG9mZnNldCwgc291cmNlICsgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICBzdWJTYW1wbGUubnVtQnl0ZXNPZkNsZWFyRGF0YSk7CisgICAgICAgICAgICBvZmZzZXQgKz0gc3ViU2FtcGxlLm51bUJ5dGVzT2ZDbGVhckRhdGE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3ViU2FtcGxlLm51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhID4gMCkgeworICAgICAgICAgICAgQUVTX2N0cjEyOF9lbmNyeXB0KHNvdXJjZSArIG9mZnNldCwgZGVzdGluYXRpb24gKyBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIHN1YlNhbXBsZS5udW1CeXRlc09mRW5jcnlwdGVkRGF0YSwgJm9wZW5zc2xLZXksCisgICAgICAgICAgICAgICAgICAgIG9wZW5zc2xJdiwgcHJldmlvdXNFbmNyeXB0ZWRDb3VudGVyLAorICAgICAgICAgICAgICAgICAgICAmYmxvY2tPZmZzZXQpOworICAgICAgICAgICAgb2Zmc2V0ICs9IHN1YlNhbXBsZS5udW1CeXRlc09mRW5jcnlwdGVkRGF0YTsKKyAgICAgICAgfQorICAgIH0KKworICAgICpieXRlc0RlY3J5cHRlZE91dCA9IG9mZnNldDsKKyAgICByZXR1cm4gU3RhdHVzOjpPSzsKK30KKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKK30gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIGRybQorfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9BbmRyb2lkLmJwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MWQ0ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw2OCBAQAorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8KKworY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xLXNlcnZpY2UuY2xlYXJrZXkiLAorICAgIHZlbmRvcjogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkFlc0N0ckRlY3J5cHRvci5jcHAiLAorICAgICAgICAiQmFzZTY0LmNwcCIsCisgICAgICAgICJCdWZmZXIuY3BwIiwKKyAgICAgICAgIkNyZWF0ZVBsdWdpbkZhY3Rvcmllcy5jcHAiLAorICAgICAgICAiQ3J5cHRvRmFjdG9yeS5jcHAiLAorICAgICAgICAiQ3J5cHRvUGx1Z2luLmNwcCIsCisgICAgICAgICJEcm1GYWN0b3J5LmNwcCIsCisgICAgICAgICJEcm1QbHVnaW4uY3BwIiwKKyAgICAgICAgIkluaXREYXRhUGFyc2VyLmNwcCIsCisgICAgICAgICJKc29uV2ViS2V5LmNwcCIsCisgICAgICAgICJTZXNzaW9uLmNwcCIsCisgICAgICAgICJTZXNzaW9uTGlicmFyeS5jcHAiLAorICAgICAgICAic2VydmljZS5jcHAiLAorICAgIF0sCisKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJodyIsCisKKyAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAorICAgIGluaXRfcmM6IFsiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xLXNlcnZpY2UuY2xlYXJrZXkucmMiXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmNyeXB0byIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJoaWRsbWVtb3J5IiwKKyAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmNsZWFya2V5Y29tbW9uIiwKKyAgICAgICAgImxpYmpzbW4iLAorICAgIF0sCisKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorCisgICAgZXhwb3J0X3N0YXRpY19saWJfaGVhZGVyczogWyJsaWJqc21uIl0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBpbnRlZ2VyX292ZXJmbG93OiB0cnVlLAorICAgIH0sCit9CisKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQmFzZTY0LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQmFzZTY0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmVkNzUxCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9CYXNlNjQuY3BwCkBAIC0wLDAgKzEsMTc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkJhc2U2NC5oIgorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCitzcDxCdWZmZXI+IGRlY29kZUJhc2U2NChjb25zdCBzdGQ6OnN0cmluZyAmcykgeworICAgIHNpemVfdCBuID0gcy5zaXplKCk7CisKKyAgICBpZiAoKG4gJSA0KSAhPSAwKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHNpemVfdCBwYWRkaW5nID0gMDsKKyAgICBpZiAobiA+PSAxICYmIHMuY19zdHIoKVtuIC0gMV0gPT0gJz0nKSB7CisgICAgICAgIHBhZGRpbmcgPSAxOworCisgICAgICAgIGlmIChuID49IDIgJiYgcy5jX3N0cigpW24gLSAyXSA9PSAnPScpIHsKKyAgICAgICAgICAgIHBhZGRpbmcgPSAyOworCisgICAgICAgICAgICBpZiAobiA+PSAzICYmIHMuY19zdHIoKVtuIC0gM10gPT0gJz0nKSB7CisgICAgICAgICAgICAgICAgcGFkZGluZyA9IDM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBXZSBkaXZpZGUgZmlyc3QgdG8gYXZvaWQgb3ZlcmZsb3cuIEl0J3MgT0sgdG8gZG8gdGhpcyBiZWNhdXNlIHdlCisgICAgLy8gYWxyZWFkeSBtYWRlIHN1cmUgdGhhdCBuICUgNCA9PSAwLgorICAgIHNpemVfdCBvdXRMZW4gPSAobiAvIDQpICogMyAtIHBhZGRpbmc7CisKKyAgICBzcDxCdWZmZXI+IGJ1ZmZlciA9IG5ldyBCdWZmZXIob3V0TGVuKTsKKyAgICB1aW50OF90ICpvdXQgPSBidWZmZXItPmRhdGEoKTsKKyAgICBpZiAob3V0ID09IG51bGxwdHIgfHwgYnVmZmVyLT5zaXplKCkgPCBvdXRMZW4pIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgc2l6ZV90IGogPSAwOworICAgIHVpbnQzMl90IGFjY3VtID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICBjaGFyIGMgPSBzLmNfc3RyKClbaV07CisgICAgICAgIHVuc2lnbmVkIHZhbHVlOworICAgICAgICBpZiAoYyA+PSAnQScgJiYgYyA8PSAnWicpIHsKKyAgICAgICAgICAgIHZhbHVlID0gYyAtICdBJzsKKyAgICAgICAgfSBlbHNlIGlmIChjID49ICdhJyAmJiBjIDw9ICd6JykgeworICAgICAgICAgICAgdmFsdWUgPSAyNiArIGMgLSAnYSc7CisgICAgICAgIH0gZWxzZSBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHsKKyAgICAgICAgICAgIHZhbHVlID0gNTIgKyBjIC0gJzAnOworICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJysnIHx8IGMgPT0gJy0nKSB7CisgICAgICAgICAgICB2YWx1ZSA9IDYyOworICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJy8nIHx8IGMgPT0gJ18nKSB7CisgICAgICAgICAgICB2YWx1ZSA9IDYzOworICAgICAgICB9IGVsc2UgaWYgKGMgIT0gJz0nKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChpIDwgbiAtIHBhZGRpbmcpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFsdWUgPSAwOworICAgICAgICB9CisKKyAgICAgICAgYWNjdW0gPSAoYWNjdW0gPDwgNikgfCB2YWx1ZTsKKworICAgICAgICBpZiAoKChpICsgMSkgJSA0KSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoaiA8IG91dExlbikgeyBvdXRbaisrXSA9IChhY2N1bSA+PiAxNik7IH0KKyAgICAgICAgICAgIGlmIChqIDwgb3V0TGVuKSB7IG91dFtqKytdID0gKGFjY3VtID4+IDgpICYgMHhmZjsgfQorICAgICAgICAgICAgaWYgKGogPCBvdXRMZW4pIHsgb3V0W2orK10gPSBhY2N1bSAmIDB4ZmY7IH0KKworICAgICAgICAgICAgYWNjdW0gPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGJ1ZmZlcjsKK30KKworc3RhdGljIGNoYXIgZW5jb2RlNkJpdCh1bnNpZ25lZCB4KSB7CisgICAgaWYgKHggPD0gMjUpIHsKKyAgICAgICAgcmV0dXJuICdBJyArIHg7CisgICAgfSBlbHNlIGlmICh4IDw9IDUxKSB7CisgICAgICAgIHJldHVybiAnYScgKyB4IC0gMjY7CisgICAgfSBlbHNlIGlmICh4IDw9IDYxKSB7CisgICAgICAgIHJldHVybiAnMCcgKyB4IC0gNTI7CisgICAgfSBlbHNlIGlmICh4ID09IDYyKSB7CisgICAgICAgIHJldHVybiAnKyc7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuICcvJzsKKyAgICB9Cit9CisKK3ZvaWQgZW5jb2RlQmFzZTY0KGNvbnN0IHZvaWQgKl9kYXRhLCBzaXplX3Qgc2l6ZSwgc3RkOjpzdHJpbmcgKm91dCkgeworICAgIG91dC0+Y2xlYXIoKTsKKworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSAoY29uc3QgdWludDhfdCAqKV9kYXRhOworCisgICAgc2l6ZV90IGk7CisgICAgZm9yIChpID0gMDsgaSA8IChzaXplIC8gMykgKiAzOyBpICs9IDMpIHsKKyAgICAgICAgdWludDhfdCB4MSA9IGRhdGFbaV07CisgICAgICAgIHVpbnQ4X3QgeDIgPSBkYXRhW2kgKyAxXTsKKyAgICAgICAgdWludDhfdCB4MyA9IGRhdGFbaSArIDJdOworCisgICAgICAgIG91dC0+cHVzaF9iYWNrKGVuY29kZTZCaXQoeDEgPj4gMikpOworICAgICAgICBvdXQtPnB1c2hfYmFjayhlbmNvZGU2Qml0KCh4MSA8PCA0IHwgeDIgPj4gNCkgJiAweDNmKSk7CisgICAgICAgIG91dC0+cHVzaF9iYWNrKGVuY29kZTZCaXQoKHgyIDw8IDIgfCB4MyA+PiA2KSAmIDB4M2YpKTsKKyAgICAgICAgb3V0LT5wdXNoX2JhY2soZW5jb2RlNkJpdCh4MyAmIDB4M2YpKTsKKyAgICB9CisgICAgc3dpdGNoIChzaXplICUgMykgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHgxID0gZGF0YVtpXTsKKyAgICAgICAgICAgIHVpbnQ4X3QgeDIgPSBkYXRhW2kgKyAxXTsKKyAgICAgICAgICAgIG91dC0+cHVzaF9iYWNrKGVuY29kZTZCaXQoeDEgPj4gMikpOworICAgICAgICAgICAgb3V0LT5wdXNoX2JhY2soZW5jb2RlNkJpdCgoeDEgPDwgNCB8IHgyID4+IDQpICYgMHgzZikpOworICAgICAgICAgICAgb3V0LT5wdXNoX2JhY2soZW5jb2RlNkJpdCgoeDIgPDwgMikgJiAweDNmKSk7CisgICAgICAgICAgICBvdXQtPnB1c2hfYmFjaygnPScpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB4MSA9IGRhdGFbaV07CisgICAgICAgICAgICBvdXQtPnB1c2hfYmFjayhlbmNvZGU2Qml0KHgxID4+IDIpKTsKKyAgICAgICAgICAgIG91dC0+cHVzaF9iYWNrKGVuY29kZTZCaXQoKHgxIDw8IDQpICYgMHgzZikpOworICAgICAgICAgICAgb3V0LT5hcHBlbmQoIj09Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBlbmNvZGVCYXNlNjRVcmwoY29uc3Qgdm9pZCAqX2RhdGEsIHNpemVfdCBzaXplLCBzdGQ6OnN0cmluZyAqb3V0KSB7CisgICAgZW5jb2RlQmFzZTY0KF9kYXRhLCBzaXplLCBvdXQpOworCisgICAgaWYgKChzdGQ6OnN0cmluZzo6bnBvcyAhPSBvdXQtPmZpbmQoIisiKSkgfHwKKyAgICAgICAgICAgIChzdGQ6OnN0cmluZzo6bnBvcyAhPSBvdXQtPmZpbmQoIi8iKSkpIHsKKyAgICAgICAgc2l6ZV90IG91dExlbiA9IG91dC0+c2l6ZSgpOworICAgICAgICBjaGFyICpiYXNlNjR1cmwgPSBuZXcgY2hhcltvdXRMZW5dOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dExlbjsgKytpKSB7CisgICAgICAgICAgICBpZiAob3V0LT5jX3N0cigpW2ldID09ICcrJykKKyAgICAgICAgICAgICAgICBiYXNlNjR1cmxbaV0gPSAnLSc7CisgICAgICAgICAgICBlbHNlIGlmIChvdXQtPmNfc3RyKClbaV0gPT0gJy8nKQorICAgICAgICAgICAgICAgIGJhc2U2NHVybFtpXSA9ICdfJzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBiYXNlNjR1cmxbaV0gPSBvdXQtPmNfc3RyKClbaV07CisgICAgICAgIH0KKworICAgICAgICBvdXQtPmFzc2lnbihiYXNlNjR1cmwsIG91dExlbik7CisgICAgICAgIGRlbGV0ZVtdIGJhc2U2NHVybDsKKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5Cit9IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBkcm0KK30gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0J1ZmZlci5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0J1ZmZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU4ZjU4YQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQnVmZmVyLmNwcApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkJ1ZmZlci5oIgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL3R5cGVzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgZHJtIHsKK25hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBjbGVhcmtleSB7CisKK0J1ZmZlcjo6QnVmZmVyKHNpemVfdCBjYXBhY2l0eSkKKyAgICAgIDogbVJhbmdlT2Zmc2V0KDApLAorICAgICAgbU93bnNEYXRhKHRydWUpIHsKKyAgICBtRGF0YSA9IG1hbGxvYyhjYXBhY2l0eSk7CisgICAgaWYgKG1EYXRhID09IG51bGxwdHIpIHsKKyAgICAgICAgbUNhcGFjaXR5ID0gMDsKKyAgICAgICAgbVJhbmdlTGVuZ3RoID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBtQ2FwYWNpdHkgPSBjYXBhY2l0eTsKKyAgICAgICAgbVJhbmdlTGVuZ3RoID0gY2FwYWNpdHk7CisgICAgfQorfQorCitCdWZmZXI6On5CdWZmZXIoKSB7CisgICAgaWYgKG1Pd25zRGF0YSkgeworICAgICAgICBpZiAobURhdGEgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgZnJlZShtRGF0YSk7CisgICAgICAgICAgICBtRGF0YSA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5Cit9IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBkcm0KK30gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJhNWM2YQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmNwcApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkNyZWF0ZVBsdWdpbkZhY3Rvcmllcy5oIgorCisjaW5jbHVkZSAiQ3J5cHRvRmFjdG9yeS5oIgorI2luY2x1ZGUgIkRybUZhY3RvcnkuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBkcm0geworbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIGNsZWFya2V5IHsKKworZXh0ZXJuICJDIiB7CisKK0lEcm1GYWN0b3J5KiBjcmVhdGVEcm1GYWN0b3J5KCkgeworICAgIHJldHVybiBuZXcgRHJtRmFjdG9yeSgpOworfQorCitJQ3J5cHRvRmFjdG9yeSogY3JlYXRlQ3J5cHRvRmFjdG9yeSgpIHsKKyAgICByZXR1cm4gbmV3IENyeXB0b0ZhY3RvcnkoKTsKK30KKworfSAvLyBleHRlcm4gIkMiCisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAgLy8gbmFtZXNwYWNlIFYxXzEKK30gIC8vIG5hbWVzcGFjZSBkcm0KK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQ3J5cHRvRmFjdG9yeS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyeXB0b0ZhY3RvcnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NDhjZWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyeXB0b0ZhY3RvcnkuY3BwCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgImhpZGxfQ2xlYXJLZXlDcnlwdG9GYWN0b3J5IgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiQ3J5cHRvRmFjdG9yeS5oIgorCisjaW5jbHVkZSAiQ2xlYXJLZXlVVUlELmgiCisjaW5jbHVkZSAiQ3J5cHRvUGx1Z2luLmgiCisjaW5jbHVkZSAiVHlwZUNvbnZlcnQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBkcm0geworbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIGNsZWFya2V5IHsKKworUmV0dXJuPGJvb2w+IENyeXB0b0ZhY3Rvcnk6OmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKAorICAgIGNvbnN0IGhpZGxfYXJyYXk8dWludDhfdCwgMTY+ICZ1dWlkKQoreworICAgIHJldHVybiBjbGVhcmtleWRybTo6aXNDbGVhcktleVVVSUQodXVpZC5kYXRhKCkpOworfQorCitSZXR1cm48dm9pZD4gQ3J5cHRvRmFjdG9yeTo6Y3JlYXRlUGx1Z2luKAorICAgIGNvbnN0IGhpZGxfYXJyYXk8dWludDhfdCwgMTY+ICZ1dWlkLAorICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+ICZpbml0RGF0YSwKKyAgICBjcmVhdGVQbHVnaW5fY2IgX2hpZGxfY2IpIHsKKworICAgIGlmICghaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZC5kYXRhKCkpKSB7CisgICAgICAgIEFMT0dFKCJDbGVhcmtleSBEcm0gSEFMOiBmYWlsZWQgdG8gY3JlYXRlIGNsZWFya2V5IHBsdWdpbiwgIiBcCisgICAgICAgICAgICAgICAgImludmFsaWQgY3J5cHRvIHNjaGVtZSIpOworICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkJBRF9WQUxVRSwgbnVsbHB0cik7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgQ3J5cHRvUGx1Z2luICpjcnlwdG9QbHVnaW4gPSBuZXcgQ3J5cHRvUGx1Z2luKGluaXREYXRhKTsKKyAgICBTdGF0dXMgc3RhdHVzID0gY3J5cHRvUGx1Z2luLT5nZXRJbml0U3RhdHVzKCk7CisgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6T0ssIGNyeXB0b1BsdWdpbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGVsZXRlIGNyeXB0b1BsdWdpbjsKKyAgICAgICAgX2hpZGxfY2Ioc3RhdHVzLCBudWxscHRyKTsKKyAgICB9CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKK30gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIGRybQorfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9DcnlwdG9QbHVnaW4uY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9DcnlwdG9QbHVnaW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzM2Y5NGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyeXB0b1BsdWdpbi5jcHAKQEAgLTAsMCArMSwxODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgImhpZGxfQ2xlYXJLZXlDcnlwdG9QbHVnaW4iCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJDcnlwdG9QbHVnaW4uaCIKKyNpbmNsdWRlICJTZXNzaW9uTGlicmFyeS5oIgorI2luY2x1ZGUgIlR5cGVDb252ZXJ0LmgiCisKKyNpbmNsdWRlIDxoaWRsbWVtb3J5L21hcHBpbmcuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBkcm0geworbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIGNsZWFya2V5IHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpCdWZmZXJUeXBlOworCitSZXR1cm48dm9pZD4gQ3J5cHRvUGx1Z2luOjpzZXRTaGFyZWRCdWZmZXJCYXNlKAorICAgICAgICBjb25zdCBoaWRsX21lbW9yeSYgYmFzZSwgdWludDMyX3QgYnVmZmVySWQpIHsKKyAgICBzcDxJTWVtb3J5PiBoaWRsTWVtb3J5ID0gbWFwTWVtb3J5KGJhc2UpOworICAgIEFMT0dFX0lGKGhpZGxNZW1vcnkgPT0gbnVsbHB0ciwgIm1hcE1lbW9yeSByZXR1cm5zIG51bGxwdHIiKTsKKworICAgIC8vIGFsbG93IG1hcE1lbW9yeSB0byByZXR1cm4gbnVsbHB0cgorICAgIG1TaGFyZWRCdWZmZXJNYXBbYnVmZmVySWRdID0gaGlkbE1lbW9yeTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCisvLyBSZXR1cm5zIG5lZ2F0aXZlIHZhbHVlcyBmb3IgZXJyb3IgY29kZSBhbmQgcG9zaXRpdmUgdmFsdWVzIGZvciB0aGUgc2l6ZSBvZgorLy8gZGVjcnlwdGVkIGRhdGEuICBJbiB0aGVvcnksIHRoZSBvdXRwdXQgc2l6ZSBjYW4gYmUgbGFyZ2VyIHRoYW4gdGhlIGlucHV0CisvLyBzaXplLCBidXQgaW4gcHJhY3RpY2UgdGhpcyB3aWxsIG5ldmVyIGhhcHBlbiBmb3IgQUVTLUNUUi4KK1JldHVybjx2b2lkPiBDcnlwdG9QbHVnaW46OmRlY3J5cHQoCisgICAgICAgIGJvb2wgc2VjdXJlLAorICAgICAgICBjb25zdCBoaWRsX2FycmF5PHVpbnQ4X3QsIEtFWV9JRF9TSVpFPiYga2V5SWQsCisgICAgICAgIGNvbnN0IGhpZGxfYXJyYXk8dWludDhfdCwgS0VZX0lWX1NJWkU+JiBpdiwKKyAgICAgICAgTW9kZSBtb2RlLAorICAgICAgICBjb25zdCBQYXR0ZXJuJiBwYXR0ZXJuLAorICAgICAgICBjb25zdCBoaWRsX3ZlYzxTdWJTYW1wbGU+JiBzdWJTYW1wbGVzLAorICAgICAgICBjb25zdCBTaGFyZWRCdWZmZXImIHNvdXJjZSwKKyAgICAgICAgdWludDY0X3Qgb2Zmc2V0LAorICAgICAgICBjb25zdCBEZXN0aW5hdGlvbkJ1ZmZlciYgZGVzdGluYXRpb24sCisgICAgICAgIGRlY3J5cHRfY2IgX2hpZGxfY2IpIHsKKyAgICBVTlVTRUQocGF0dGVybik7CisKKyAgICBpZiAoc2VjdXJlKSB7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsCisgICAgICAgICAgICAiU2VjdXJlIGRlY3J5cHRpb24gaXMgbm90IHN1cHBvcnRlZCB3aXRoIENsZWFyS2V5LiIpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIGlmIChtU2hhcmVkQnVmZmVyTWFwLmZpbmQoc291cmNlLmJ1ZmZlcklkKSA9PSBtU2hhcmVkQnVmZmVyTWFwLmVuZCgpKSB7CisgICAgICBfaGlkbF9jYihTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLAorICAgICAgICAgICAgICAgInNvdXJjZSBkZWNyeXB0IGJ1ZmZlciBiYXNlIG5vdCBzZXQiKTsKKyAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgaWYgKGRlc3RpbmF0aW9uLnR5cGUgPT0gQnVmZmVyVHlwZTo6U0hBUkVEX01FTU9SWSkgeworICAgICAgY29uc3QgU2hhcmVkQnVmZmVyJiBkZXN0ID0gZGVzdGluYXRpb24ubm9uc2VjdXJlTWVtb3J5OworICAgICAgaWYgKG1TaGFyZWRCdWZmZXJNYXAuZmluZChkZXN0LmJ1ZmZlcklkKSA9PSBtU2hhcmVkQnVmZmVyTWFwLmVuZCgpKSB7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsCisgICAgICAgICAgICAgICAgICJkZXN0aW5hdGlvbiBkZWNyeXB0IGJ1ZmZlciBiYXNlIG5vdCBzZXQiKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzcDxJTWVtb3J5PiBzb3VyY2VCYXNlID0gbVNoYXJlZEJ1ZmZlck1hcFtzb3VyY2UuYnVmZmVySWRdOworICAgIGlmIChzb3VyY2VCYXNlID09IG51bGxwdHIpIHsKKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgMCwgInNvdXJjZSBpcyBhIG51bGxwdHIiKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICBpZiAoc291cmNlLm9mZnNldCArIG9mZnNldCArIHNvdXJjZS5zaXplID4gc291cmNlQmFzZS0+Z2V0U2l6ZSgpKSB7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsICJpbnZhbGlkIGJ1ZmZlciBzaXplIik7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgdWludDhfdCAqYmFzZSA9IHN0YXRpY19jYXN0PHVpbnQ4X3QgKj4KKyAgICAgICAgICAgIChzdGF0aWNfY2FzdDx2b2lkICo+KHNvdXJjZUJhc2UtPmdldFBvaW50ZXIoKSkpOworICAgIHVpbnQ4X3QqIHNyY1B0ciA9IHN0YXRpY19jYXN0PHVpbnQ4X3QgKj4oYmFzZSArIHNvdXJjZS5vZmZzZXQgKyBvZmZzZXQpOworICAgIHZvaWQqIGRlc3RQdHIgPSBOVUxMOworICAgIGlmIChkZXN0aW5hdGlvbi50eXBlID09IEJ1ZmZlclR5cGU6OlNIQVJFRF9NRU1PUlkpIHsKKyAgICAgICAgY29uc3QgU2hhcmVkQnVmZmVyJiBkZXN0QnVmZmVyID0gZGVzdGluYXRpb24ubm9uc2VjdXJlTWVtb3J5OworICAgICAgICBzcDxJTWVtb3J5PiBkZXN0QmFzZSA9IG1TaGFyZWRCdWZmZXJNYXBbZGVzdEJ1ZmZlci5idWZmZXJJZF07CisgICAgICAgIGlmIChkZXN0QmFzZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLCAiZGVzdGluYXRpb24gaXMgYSBudWxscHRyIik7CisgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRlc3RCdWZmZXIub2Zmc2V0ICsgZGVzdEJ1ZmZlci5zaXplID4gZGVzdEJhc2UtPmdldFNpemUoKSkgeworICAgICAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgMCwgImludmFsaWQgYnVmZmVyIHNpemUiKTsKKyAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgICAgIH0KKyAgICAgICAgZGVzdFB0ciA9IHN0YXRpY19jYXN0PHZvaWQgKj4oYmFzZSArIGRlc3RpbmF0aW9uLm5vbnNlY3VyZU1lbW9yeS5vZmZzZXQpOworICAgIH0gZWxzZSBpZiAoZGVzdGluYXRpb24udHlwZSA9PSBCdWZmZXJUeXBlOjpOQVRJVkVfSEFORExFKSB7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlID0gY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4oCisgICAgICAgIGRlc3RpbmF0aW9uLnNlY3VyZU1lbW9yeS5nZXROYXRpdmVIYW5kbGUoKSk7CisgICAgICAgIGRlc3RQdHIgPSBzdGF0aWNfY2FzdDx2b2lkICo+KGhhbmRsZSk7CisgICAgfQorCisgICAgLy8gQ2FsY3VsYXRlIHRoZSBvdXRwdXQgYnVmZmVyIHNpemUgYW5kIGRldGVybWluZSBpZiBhbnkgc3Vic2FtcGxlcyBhcmUKKyAgICAvLyBlbmNyeXB0ZWQuCisgICAgc2l6ZV90IGRlc3RTaXplID0gMDsKKyAgICBib29sIGhhdmVFbmNyeXB0ZWRTdWJzYW1wbGVzID0gZmFsc2U7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdWJTYW1wbGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IFN1YlNhbXBsZSAmc3ViU2FtcGxlID0gc3ViU2FtcGxlc1tpXTsKKyAgICAgICAgZGVzdFNpemUgKz0gc3ViU2FtcGxlLm51bUJ5dGVzT2ZDbGVhckRhdGE7CisgICAgICAgIGRlc3RTaXplICs9IHN1YlNhbXBsZS5udW1CeXRlc09mRW5jcnlwdGVkRGF0YTsKKyAgICAgICAgaWYgKHN1YlNhbXBsZS5udW1CeXRlc09mRW5jcnlwdGVkRGF0YSA+IDApIHsKKyAgICAgICAgaGF2ZUVuY3J5cHRlZFN1YnNhbXBsZXMgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1vZGUgPT0gTW9kZTo6VU5FTkNSWVBURUQpIHsKKyAgICAgICAgaWYgKGhhdmVFbmNyeXB0ZWRTdWJzYW1wbGVzKSB7CisgICAgICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLAorICAgICAgICAgICAgICAgICAgICAiRW5jcnlwdGVkIHN1YnNhbXBsZXMgZm91bmQgaW4gYWxsZWdlZGx5IHVuZW5jcnlwdGVkIGRhdGEuIik7CisgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IG9mZnNldCA9IDA7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3ViU2FtcGxlcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgY29uc3QgU3ViU2FtcGxlJiBzdWJTYW1wbGUgPSBzdWJTYW1wbGVzW2ldOworICAgICAgICAgICAgaWYgKHN1YlNhbXBsZS5udW1CeXRlc09mQ2xlYXJEYXRhICE9IDApIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oZGVzdFB0cikgKyBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHNyY1B0cikgKyBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIHN1YlNhbXBsZS5udW1CeXRlc09mQ2xlYXJEYXRhKTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gc3ViU2FtcGxlLm51bUJ5dGVzT2ZDbGVhckRhdGE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBfaGlkbF9jYihTdGF0dXM6Ok9LLCBzdGF0aWNfY2FzdDxzc2l6ZV90PihvZmZzZXQpLCAiIik7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfSBlbHNlIGlmIChtb2RlID09IE1vZGU6OkFFU19DVFIpIHsKKyAgICAgICAgc2l6ZV90IGJ5dGVzRGVjcnlwdGVkOworICAgICAgICBTdGF0dXMgcmVzID0gbVNlc3Npb24tPmRlY3J5cHQoa2V5SWQuZGF0YSgpLCBpdi5kYXRhKCksIHNyY1B0ciwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90Kj4oZGVzdFB0ciksIHRvVmVjdG9yKHN1YlNhbXBsZXMpLCAmYnl0ZXNEZWNyeXB0ZWQpOworICAgICAgICBpZiAocmVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6T0ssIHN0YXRpY19jYXN0PHNzaXplX3Q+KGJ5dGVzRGVjcnlwdGVkKSwgIiIpOworICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX0RFQ1JZUFQsIHN0YXRpY19jYXN0PHNzaXplX3Q+KHJlcyksCisgICAgICAgICAgICAgICAgICAgICJEZWNyeXB0aW9uIEVycm9yIik7CisgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgMCwKKyAgICAgICAgICAgICAgICAiU2VsZWN0ZWQgZW5jcnlwdGlvbiBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIENsZWFyS2V5IERSTSBQbHVnaW4uIik7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorfQorCitSZXR1cm48U3RhdHVzPiBDcnlwdG9QbHVnaW46OnNldE1lZGlhRHJtU2Vzc2lvbigKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCkgeworICAgIGlmICghc2Vzc2lvbklkLnNpemUoKSkgeworICAgICAgICBtU2Vzc2lvbiA9IG51bGxwdHI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVNlc3Npb24gPSBTZXNzaW9uTGlicmFyeTo6Z2V0KCktPmZpbmRTZXNzaW9uKHNlc3Npb25JZCk7CisgICAgICAgIGlmICghbVNlc3Npb24uZ2V0KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czo6T0s7Cit9CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5Cit9IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBkcm0KK30gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0RybUZhY3RvcnkuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Ecm1GYWN0b3J5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzU1N2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Ecm1GYWN0b3J5LmNwcApAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJoaWRsX0NsZWFyS2V5RHJtRmFjdG9yeSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCisjaW5jbHVkZSAiRHJtRmFjdG9yeS5oIgorCisjaW5jbHVkZSAiRHJtUGx1Z2luLmgiCisjaW5jbHVkZSAiQ2xlYXJLZXlVVUlELmgiCisjaW5jbHVkZSAiTWltZVR5cGUuaCIKKyNpbmNsdWRlICJTZXNzaW9uTGlicmFyeS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN0YXR1czsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7CisKK1JldHVybjxib29sPiBEcm1GYWN0b3J5Ojppc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCgKKyAgICAgICAgY29uc3QgaGlkbF9hcnJheTx1aW50OF90LCAxNj4mIHV1aWQpIHsKKyAgICByZXR1cm4gY2xlYXJrZXlkcm06OmlzQ2xlYXJLZXlVVUlEKHV1aWQuZGF0YSgpKTsKK30KKworUmV0dXJuPGJvb2w+IERybUZhY3Rvcnk6OmlzQ29udGVudFR5cGVTdXBwb3J0ZWQoY29uc3QgaGlkbF9zdHJpbmcgJm1pbWVUeXBlKSB7CisgICAgLy8gVGhpcyBzaG91bGQgbWF0Y2ggdGhlIG1pbWVUeXBlcyBoYW5kZWQgYnkgSW5pdERhdGFQYXJzZXIuCisgICAgcmV0dXJuIG1pbWVUeXBlID09IGtJc29CbWZmVmlkZW9NaW1lVHlwZSB8fAorICAgICAgICAgICAgbWltZVR5cGUgPT0ga0lzb0JtZmZBdWRpb01pbWVUeXBlIHx8CisgICAgICAgICAgICBtaW1lVHlwZSA9PSBrQ2VuY0luaXREYXRhRm9ybWF0IHx8CisgICAgICAgICAgICBtaW1lVHlwZSA9PSBrV2VibVZpZGVvTWltZVR5cGUgfHwKKyAgICAgICAgICAgIG1pbWVUeXBlID09IGtXZWJtQXVkaW9NaW1lVHlwZSB8fAorICAgICAgICAgICAgbWltZVR5cGUgPT0ga1dlYm1Jbml0RGF0YUZvcm1hdDsKK30KKworUmV0dXJuPHZvaWQ+IERybUZhY3Rvcnk6OmNyZWF0ZVBsdWdpbigKKyAgICBjb25zdCBoaWRsX2FycmF5PHVpbnQ4X3QsIDE2PiYgdXVpZCwKKyAgICBjb25zdCBoaWRsX3N0cmluZyYgYXBwUGFja2FnZU5hbWUsCisgICAgY3JlYXRlUGx1Z2luX2NiIF9oaWRsX2NiKSB7CisgICAgVU5VU0VEKGFwcFBhY2thZ2VOYW1lKTsKKworICAgIERybVBsdWdpbiAqcGx1Z2luID0gTlVMTDsKKyAgICBpZiAoIWlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQuZGF0YSgpKSkgeworICAgICAgICBBTE9HRSgiQ2xlYXIga2V5IERybSBIQUw6IGZhaWxlZCB0byBjcmVhdGUgZHJtIHBsdWdpbiwgIiBcCisgICAgICAgICAgICAgICAgImludmFsaWQgY3J5cHRvIHNjaGVtZSIpOworICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkJBRF9WQUxVRSwgcGx1Z2luKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICBwbHVnaW4gPSBuZXcgRHJtUGx1Z2luKFNlc3Npb25MaWJyYXJ5OjpnZXQoKSk7CisgICAgX2hpZGxfY2IoU3RhdHVzOjpPSywgcGx1Z2luKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgZHJtCit9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Ecm1QbHVnaW4uY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Ecm1QbHVnaW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MWUyOWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0RybVBsdWdpbi5jcHAKQEAgLTAsMCArMSw1NzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgImhpZGxfQ2xlYXJLZXlQbHVnaW4iCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlICJEcm1QbHVnaW4uaCIKKyNpbmNsdWRlICJDbGVhcktleURybVByb3BlcnRpZXMuaCIKKyNpbmNsdWRlICJTZXNzaW9uLmgiCisjaW5jbHVkZSAiVHlwZUNvbnZlcnQuaCIKKworbmFtZXNwYWNlIHsKK2NvbnN0IGludCBrU2VjdXJlU3RvcElkU3RhcnQgPSAxMDA7Citjb25zdCBzdGQ6OnN0cmluZyBrU3RyZWFtaW5nKCJTdHJlYW1pbmciKTsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtPZmZsaW5lKCJPZmZsaW5lIik7Citjb25zdCBzdGQ6OnN0cmluZyBrVHJ1ZSgiVHJ1ZSIpOworCitjb25zdCBzdGQ6OnN0cmluZyBrUXVlcnlLZXlMaWNlbnNlVHlwZSgiTGljZW5zZVR5cGUiKTsKKyAgICAvLyBWYWx1ZTogIlN0cmVhbWluZyIgb3IgIk9mZmxpbmUiCitjb25zdCBzdGQ6OnN0cmluZyBrUXVlcnlLZXlQbGF5QWxsb3dlZCgiUGxheUFsbG93ZWQiKTsKKyAgICAvLyBWYWx1ZTogIlRydWUiIG9yICJGYWxzZSIKK2NvbnN0IHN0ZDo6c3RyaW5nIGtRdWVyeUtleVJlbmV3QWxsb3dlZCgiUmVuZXdBbGxvd2VkIik7CisgICAgLy8gVmFsdWU6ICJUcnVlIiBvciAiRmFsc2UiCisKK2NvbnN0IGludCBrU2VjdXJlU3RvcElkU2l6ZSA9IDEwOworCitzdGQ6OnZlY3Rvcjx1aW50OF90PiB1aW50MzJUb1ZlY3Rvcih1aW50MzJfdCB2YWx1ZSkgeworICAgIC8vIDEwIGJ5dGVzIHRvIGRpc3BsYXkgbWF4IHZhbHVlIDQyOTQ5NjcyOTUgKyBvbmUgYnl0ZSBudWxsIHRlcm1pbmF0b3IKKyAgICBjaGFyIGJ1ZmZlcltrU2VjdXJlU3RvcElkU2l6ZV07CisgICAgbWVtc2V0KGJ1ZmZlciwgMCwga1NlY3VyZVN0b3BJZFNpemUpOworICAgIHNucHJpbnRmKGJ1ZmZlciwga1NlY3VyZVN0b3BJZFNpemUsICIlIiBQUkl1MzIsIHZhbHVlKTsKKyAgICByZXR1cm4gc3RkOjp2ZWN0b3I8dWludDhfdD4oYnVmZmVyLCBidWZmZXIgKyBzaXplb2YoYnVmZmVyKSk7Cit9CisKK307IC8vIHVubmFtZWQgbmFtZXNwYWNlCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgZHJtIHsKK25hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBjbGVhcmtleSB7CisKK0RybVBsdWdpbjo6RHJtUGx1Z2luKFNlc3Npb25MaWJyYXJ5KiBzZXNzaW9uTGlicmFyeSkKKyAgICAgICAgOiBtU2Vzc2lvbkxpYnJhcnkoc2Vzc2lvbkxpYnJhcnkpLAorICAgICAgICAgIG1PcGVuU2Vzc2lvbk9rQ291bnQoMCksCisgICAgICAgICAgbUNsb3NlU2Vzc2lvbk9rQ291bnQoMCksCisgICAgICAgICAgbUNsb3NlU2Vzc2lvbk5vdE9wZW5lZENvdW50KDApLAorICAgICAgICAgIG1OZXh0U2VjdXJlU3RvcElkKGtTZWN1cmVTdG9wSWRTdGFydCkgeworICAgIG1QbGF5UG9saWN5LmNsZWFyKCk7CisgICAgaW5pdFByb3BlcnRpZXMoKTsKKyAgICBtU2VjdXJlU3RvcHMuY2xlYXIoKTsKK30KKwordm9pZCBEcm1QbHVnaW46OmluaXRQcm9wZXJ0aWVzKCkgeworICAgIG1TdHJpbmdQcm9wZXJ0aWVzLmNsZWFyKCk7CisgICAgbVN0cmluZ1Byb3BlcnRpZXNba1ZlbmRvcktleV0gPSBrVmVuZG9yVmFsdWU7CisgICAgbVN0cmluZ1Byb3BlcnRpZXNba1ZlcnNpb25LZXldID0ga1ZlcnNpb25WYWx1ZTsKKyAgICBtU3RyaW5nUHJvcGVydGllc1trUGx1Z2luRGVzY3JpcHRpb25LZXldID0ga1BsdWdpbkRlc2NyaXB0aW9uVmFsdWU7CisgICAgbVN0cmluZ1Byb3BlcnRpZXNba0FsZ29yaXRobXNLZXldID0ga0FsZ29yaXRobXNWYWx1ZTsKKyAgICBtU3RyaW5nUHJvcGVydGllc1trTGlzdGVuZXJUZXN0U3VwcG9ydEtleV0gPSBrTGlzdGVuZXJUZXN0U3VwcG9ydFZhbHVlOworCisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWVWZWN0b3I7CisgICAgdmFsdWVWZWN0b3IuY2xlYXIoKTsKKyAgICB2YWx1ZVZlY3Rvci5pbnNlcnQodmFsdWVWZWN0b3IuZW5kKCksCisgICAgICAgICAgICBrVGVzdERldmljZUlkRGF0YSwga1Rlc3REZXZpY2VJZERhdGEgKyBzaXplb2Yoa1Rlc3REZXZpY2VJZERhdGEpIC8gc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICBtQnl0ZUFycmF5UHJvcGVydGllc1trRGV2aWNlSWRLZXldID0gdmFsdWVWZWN0b3I7CisKKyAgICB2YWx1ZVZlY3Rvci5jbGVhcigpOworICAgIHZhbHVlVmVjdG9yLmluc2VydCh2YWx1ZVZlY3Rvci5lbmQoKSwKKyAgICAgICAgICAgIGtNZXRyaWNzRGF0YSwga01ldHJpY3NEYXRhICsgc2l6ZW9mKGtNZXRyaWNzRGF0YSkgLyBzaXplb2YodWludDhfdCkpOworICAgIG1CeXRlQXJyYXlQcm9wZXJ0aWVzW2tNZXRyaWNzS2V5XSA9IHZhbHVlVmVjdG9yOworfQorCisvLyBUaGUgc2VjdXJlIHN0b3AgaW4gQ2xlYXJLZXkgaW1wbGVtZW50YXRpb24gaXMgbm90IGluc3RhbGxlZCBzZWN1cmVseS4KKy8vIFRoaXMgZnVuY3Rpb24gbWVyZWx5IGNyZWF0ZXMgYSB0ZXN0IGVudmlyb25tZW50IGZvciB0ZXN0aW5nIHNlY3VyZSBzdG9wcyBBUElzLgorLy8gVGhlIGNvbnRlbnQgaW4gdGhpcyBzZWN1cmUgc3RvcCBpcyBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQsIHRoZSBjbGVhcmtleQorLy8gc2VjdXJlU3RvcCBkb2VzIG5vdCBzZXJ2ZSBhcyBhIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbi4KK3ZvaWQgRHJtUGx1Z2luOjppbnN0YWxsU2VjdXJlU3RvcChjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkKSB7CisgICAgQ2xlYXJrZXlTZWN1cmVTdG9wIGNsZWFya2V5U2VjdXJlU3RvcDsKKyAgICBjbGVhcmtleVNlY3VyZVN0b3AuaWQgPSB1aW50MzJUb1ZlY3RvcigrK21OZXh0U2VjdXJlU3RvcElkKTsKKyAgICBjbGVhcmtleVNlY3VyZVN0b3AuZGF0YS5hc3NpZ24oc2Vzc2lvbklkLmJlZ2luKCksIHNlc3Npb25JZC5lbmQoKSk7CisKKyAgICBtU2VjdXJlU3RvcHMuaW5zZXJ0KHN0ZDo6cGFpcjxzdGQ6OnZlY3Rvcjx1aW50OF90PiwgQ2xlYXJrZXlTZWN1cmVTdG9wPigKKyAgICAgICAgICAgIGNsZWFya2V5U2VjdXJlU3RvcC5pZCwgY2xlYXJrZXlTZWN1cmVTdG9wKSk7Cit9CisKK1JldHVybjx2b2lkPiBEcm1QbHVnaW46Om9wZW5TZXNzaW9uKG9wZW5TZXNzaW9uX2NiIF9oaWRsX2NiKSB7CisgICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+Y3JlYXRlU2Vzc2lvbigpOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZCA9IHNlc3Npb24tPnNlc3Npb25JZCgpOworCisgICAgU3RhdHVzIHN0YXR1cyA9IHNldFNlY3VyaXR5TGV2ZWwoc2Vzc2lvbklkLCBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfQ1JZUFRPKTsKKyAgICBfaGlkbF9jYihzdGF0dXMsIHRvSGlkbFZlYyhzZXNzaW9uSWQpKTsKKyAgICBtT3BlblNlc3Npb25Pa0NvdW50Kys7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPHZvaWQ+IERybVBsdWdpbjo6b3BlblNlc3Npb25fMV8xKFNlY3VyaXR5TGV2ZWwgc2VjdXJpdHlMZXZlbCwKKyAgICAgICAgb3BlblNlc3Npb25fMV8xX2NiIF9oaWRsX2NiKSB7CisgICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+Y3JlYXRlU2Vzc2lvbigpOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZCA9IHNlc3Npb24tPnNlc3Npb25JZCgpOworCisgICAgU3RhdHVzIHN0YXR1cyA9IHNldFNlY3VyaXR5TGV2ZWwoc2Vzc2lvbklkLCBzZWN1cml0eUxldmVsKTsKKyAgICBfaGlkbF9jYihzdGF0dXMsIHRvSGlkbFZlYyhzZXNzaW9uSWQpKTsKKyAgICBtT3BlblNlc3Npb25Pa0NvdW50Kys7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPFN0YXR1cz4gRHJtUGx1Z2luOjpjbG9zZVNlc3Npb24oY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCkgeworICAgIGlmIChzZXNzaW9uSWQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6QkFEX1ZBTFVFOworICAgIH0KKworICAgIHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmZpbmRTZXNzaW9uKHRvVmVjdG9yKHNlc3Npb25JZCkpOworICAgIGlmIChzZXNzaW9uLmdldCgpKSB7CisgICAgICAgIG1DbG9zZVNlc3Npb25Pa0NvdW50Kys7CisgICAgICAgIG1TZXNzaW9uTGlicmFyeS0+ZGVzdHJveVNlc3Npb24oc2Vzc2lvbik7CisgICAgICAgIHJldHVybiBTdGF0dXM6Ok9LOworICAgIH0KKyAgICBtQ2xvc2VTZXNzaW9uTm90T3BlbmVkQ291bnQrKzsKKyAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEOworfQorCitTdGF0dXMgRHJtUGx1Z2luOjpnZXRLZXlSZXF1ZXN0Q29tbW9uKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzY29wZSwKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGluaXREYXRhLAorICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbWltZVR5cGUsCisgICAgICAgIEtleVR5cGUga2V5VHlwZSwKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8S2V5VmFsdWU+JiBvcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICpyZXF1ZXN0LAorICAgICAgICBLZXlSZXF1ZXN0VHlwZSAqa2V5UmVxdWVzdFR5cGUsCisgICAgICAgIHN0ZDo6c3RyaW5nICpkZWZhdWx0VXJsKSB7CisgICAgICAgIFVOVVNFRChvcHRpb25hbFBhcmFtZXRlcnMpOworCisgICAgKmRlZmF1bHRVcmwgPSAiIjsKKyAgICAqa2V5UmVxdWVzdFR5cGUgPSBLZXlSZXF1ZXN0VHlwZTo6VU5LTk9XTjsKKyAgICAqcmVxdWVzdCA9IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KCk7CisKKyAgICBpZiAoc2NvcGUuc2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6QkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmIChrZXlUeXBlICE9IEtleVR5cGU6OlNUUkVBTUlORykgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25MaWJyYXJ5LT5maW5kU2Vzc2lvbih0b1ZlY3RvcihzY29wZSkpOworICAgIGlmICghc2Vzc2lvbi5nZXQoKSkgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEOworICAgIH0KKworICAgIFN0YXR1cyBzdGF0dXMgPSBzZXNzaW9uLT5nZXRLZXlSZXF1ZXN0KGluaXREYXRhLCBtaW1lVHlwZSwgcmVxdWVzdCk7CisgICAgKmtleVJlcXVlc3RUeXBlID0gS2V5UmVxdWVzdFR5cGU6OklOSVRJQUw7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworUmV0dXJuPHZvaWQ+IERybVBsdWdpbjo6Z2V0S2V5UmVxdWVzdCgKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNjb3BlLAorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaW5pdERhdGEsCisgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBtaW1lVHlwZSwKKyAgICAgICAgS2V5VHlwZSBrZXlUeXBlLAorICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlWYWx1ZT4mIG9wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgICAgZ2V0S2V5UmVxdWVzdF9jYiBfaGlkbF9jYikgeworICAgIFVOVVNFRChvcHRpb25hbFBhcmFtZXRlcnMpOworCisgICAgS2V5UmVxdWVzdFR5cGUga2V5UmVxdWVzdFR5cGUgPSBLZXlSZXF1ZXN0VHlwZTo6VU5LTk9XTjsKKyAgICBzdGQ6OnN0cmluZyBkZWZhdWx0VXJsKCIiKTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByZXF1ZXN0OworICAgIFN0YXR1cyBzdGF0dXMgPSBnZXRLZXlSZXF1ZXN0Q29tbW9uKAorICAgICAgICAgICAgc2NvcGUsIGluaXREYXRhLCBtaW1lVHlwZSwga2V5VHlwZSwgb3B0aW9uYWxQYXJhbWV0ZXJzLAorICAgICAgICAgICAgJnJlcXVlc3QsICZrZXlSZXF1ZXN0VHlwZSwgJmRlZmF1bHRVcmwpOworCisgICAgX2hpZGxfY2Ioc3RhdHVzLCB0b0hpZGxWZWMocmVxdWVzdCksCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxkcm06OlYxXzA6OktleVJlcXVlc3RUeXBlPihrZXlSZXF1ZXN0VHlwZSksCisgICAgICAgICAgICBoaWRsX3N0cmluZyhkZWZhdWx0VXJsKSk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPHZvaWQ+IERybVBsdWdpbjo6Z2V0S2V5UmVxdWVzdF8xXzEoCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzY29wZSwKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGluaXREYXRhLAorICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbWltZVR5cGUsCisgICAgICAgIEtleVR5cGUga2V5VHlwZSwKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8S2V5VmFsdWU+JiBvcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgIGdldEtleVJlcXVlc3RfMV8xX2NiIF9oaWRsX2NiKSB7CisgICAgVU5VU0VEKG9wdGlvbmFsUGFyYW1ldGVycyk7CisKKyAgICBLZXlSZXF1ZXN0VHlwZSBrZXlSZXF1ZXN0VHlwZSA9IEtleVJlcXVlc3RUeXBlOjpVTktOT1dOOworICAgIHN0ZDo6c3RyaW5nIGRlZmF1bHRVcmwoIiIpOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJlcXVlc3Q7CisgICAgU3RhdHVzIHN0YXR1cyA9IGdldEtleVJlcXVlc3RDb21tb24oCisgICAgICAgICAgICBzY29wZSwgaW5pdERhdGEsIG1pbWVUeXBlLCBrZXlUeXBlLCBvcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgICAgICAmcmVxdWVzdCwgJmtleVJlcXVlc3RUeXBlLCAmZGVmYXVsdFVybCk7CisKKyAgICBfaGlkbF9jYihzdGF0dXMsIHRvSGlkbFZlYyhyZXF1ZXN0KSwga2V5UmVxdWVzdFR5cGUsIGhpZGxfc3RyaW5nKGRlZmF1bHRVcmwpKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCit2b2lkIERybVBsdWdpbjo6c2V0UGxheVBvbGljeSgpIHsKKyAgICBtUGxheVBvbGljeS5jbGVhcigpOworCisgICAgS2V5VmFsdWUgcG9saWN5OworICAgIHBvbGljeS5rZXkgPSBrUXVlcnlLZXlMaWNlbnNlVHlwZTsKKyAgICBwb2xpY3kudmFsdWUgPSBrU3RyZWFtaW5nOworICAgIG1QbGF5UG9saWN5LnB1c2hfYmFjayhwb2xpY3kpOworCisgICAgcG9saWN5LmtleSA9IGtRdWVyeUtleVBsYXlBbGxvd2VkOworICAgIHBvbGljeS52YWx1ZSA9IGtUcnVlOworICAgIG1QbGF5UG9saWN5LnB1c2hfYmFjayhwb2xpY3kpOworCisgICAgcG9saWN5LmtleSA9IGtRdWVyeUtleVJlbmV3QWxsb3dlZDsKKyAgICBtUGxheVBvbGljeS5wdXNoX2JhY2socG9saWN5KTsKK30KKworUmV0dXJuPHZvaWQ+IERybVBsdWdpbjo6cHJvdmlkZUtleVJlc3BvbnNlKAorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2NvcGUsCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiByZXNwb25zZSwKKyAgICAgICAgcHJvdmlkZUtleVJlc3BvbnNlX2NiIF9oaWRsX2NiKSB7CisgICAgaWYgKHNjb3BlLnNpemUoKSA9PSAwIHx8IHJlc3BvbnNlLnNpemUoKSA9PSAwKSB7CisgICAgICAgIC8vIFJldHVybnMgZW1wdHkga2V5U2V0SWQKKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpCQURfVkFMVUUsIGhpZGxfdmVjPHVpbnQ4X3Q+KCkpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmZpbmRTZXNzaW9uKHRvVmVjdG9yKHNjb3BlKSk7CisgICAgaWYgKCFzZXNzaW9uLmdldCgpKSB7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRCwgaGlkbF92ZWM8dWludDhfdD4oKSk7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgc2V0UGxheVBvbGljeSgpOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGtleVNldElkOworICAgIFN0YXR1cyBzdGF0dXMgPSBzZXNzaW9uLT5wcm92aWRlS2V5UmVzcG9uc2UocmVzcG9uc2UpOworICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAvLyBUaGlzIGlzIGZvciB0ZXN0aW5nIEFNZWRpYURybV9zZXRPbkV2ZW50TGlzdGVuZXIgb25seS4KKyAgICAgICAgc2VuZEV2ZW50KEV2ZW50VHlwZTo6VkVORE9SX0RFRklORUQsIDAsIHNjb3BlKTsKKyAgICAgICAga2V5U2V0SWQuY2xlYXIoKTsKKyAgICB9CisKKyAgICBpbnN0YWxsU2VjdXJlU3RvcChzY29wZSk7CisKKyAgICAvLyBSZXR1cm5zIHN0YXR1cyBhbmQgZW1wdHkga2V5U2V0SWQKKyAgICBfaGlkbF9jYihzdGF0dXMsIHRvSGlkbFZlYyhrZXlTZXRJZCkpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBEcm1QbHVnaW46OmdldFByb3BlcnR5U3RyaW5nKAorICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgcHJvcGVydHlOYW1lLCBnZXRQcm9wZXJ0eVN0cmluZ19jYiBfaGlkbF9jYikgeworICAgIHN0ZDo6c3RyaW5nIG5hbWUocHJvcGVydHlOYW1lLmNfc3RyKCkpOworICAgIHN0ZDo6c3RyaW5nIHZhbHVlOworCisgICAgaWYgKG5hbWUgPT0ga1ZlbmRvcktleSkgeworICAgICAgICB2YWx1ZSA9IG1TdHJpbmdQcm9wZXJ0aWVzW2tWZW5kb3JLZXldOworICAgIH0gZWxzZSBpZiAobmFtZSA9PSBrVmVyc2lvbktleSkgeworICAgICAgICB2YWx1ZSA9IG1TdHJpbmdQcm9wZXJ0aWVzW2tWZXJzaW9uS2V5XTsKKyAgICB9IGVsc2UgaWYgKG5hbWUgPT0ga1BsdWdpbkRlc2NyaXB0aW9uS2V5KSB7CisgICAgICAgIHZhbHVlID0gbVN0cmluZ1Byb3BlcnRpZXNba1BsdWdpbkRlc2NyaXB0aW9uS2V5XTsKKyAgICB9IGVsc2UgaWYgKG5hbWUgPT0ga0FsZ29yaXRobXNLZXkpIHsKKyAgICAgICAgdmFsdWUgPSBtU3RyaW5nUHJvcGVydGllc1trQWxnb3JpdGhtc0tleV07CisgICAgfSBlbHNlIGlmIChuYW1lID09IGtMaXN0ZW5lclRlc3RTdXBwb3J0S2V5KSB7CisgICAgICAgIHZhbHVlID0gbVN0cmluZ1Byb3BlcnRpZXNba0xpc3RlbmVyVGVzdFN1cHBvcnRLZXldOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJBcHAgcmVxdWVzdGVkIHVua25vd24gc3RyaW5nIHByb3BlcnR5ICVzIiwgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgIiIpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKyAgICBfaGlkbF9jYihTdGF0dXM6Ok9LLCB2YWx1ZS5jX3N0cigpKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gRHJtUGx1Z2luOjpnZXRQcm9wZXJ0eUJ5dGVBcnJheSgKKyAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIHByb3BlcnR5TmFtZSwgZ2V0UHJvcGVydHlCeXRlQXJyYXlfY2IgX2hpZGxfY2IpIHsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3I8dWludDhfdD4gPjo6aXRlcmF0b3IgaXRyID0KKyAgICAgICAgICAgIG1CeXRlQXJyYXlQcm9wZXJ0aWVzLmZpbmQoc3RkOjpzdHJpbmcocHJvcGVydHlOYW1lLmNfc3RyKCkpKTsKKyAgICBpZiAoaXRyID09IG1CeXRlQXJyYXlQcm9wZXJ0aWVzLmVuZCgpKSB7CisgICAgICAgIEFMT0dFKCJBcHAgcmVxdWVzdGVkIHVua25vd24gcHJvcGVydHk6ICVzIiwgcHJvcGVydHlOYW1lLmNfc3RyKCkpOworICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkJBRF9WQUxVRSwgc3RkOjp2ZWN0b3I8dWludDhfdD4oKSk7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorICAgIF9oaWRsX2NiKFN0YXR1czo6T0ssIGl0ci0+c2Vjb25kKTsKKyAgICByZXR1cm4gVm9pZCgpOworCit9CisKK1JldHVybjxTdGF0dXM+IERybVBsdWdpbjo6c2V0UHJvcGVydHlTdHJpbmcoCisgICAgY29uc3QgaGlkbF9zdHJpbmcmIG5hbWUsIGNvbnN0IGhpZGxfc3RyaW5nJiB2YWx1ZSkgeworICAgIHN0ZDo6c3RyaW5nIGltbXV0YWJsZUtleXM7CisgICAgaW1tdXRhYmxlS2V5cy5hcHBlbmQoa0FsZ29yaXRobXNLZXkgKyAiLCIpOworICAgIGltbXV0YWJsZUtleXMuYXBwZW5kKGtQbHVnaW5EZXNjcmlwdGlvbktleSArICIsIik7CisgICAgaW1tdXRhYmxlS2V5cy5hcHBlbmQoa1ZlbmRvcktleSArICIsIik7CisgICAgaW1tdXRhYmxlS2V5cy5hcHBlbmQoa1ZlcnNpb25LZXkgKyAiLCIpOworCisgICAgc3RkOjpzdHJpbmcga2V5ID0gc3RkOjpzdHJpbmcobmFtZS5jX3N0cigpKTsKKyAgICBpZiAoaW1tdXRhYmxlS2V5cy5maW5kKGtleSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgQUxPR0QoIkNhbm5vdCBzZXQgaW1tdXRhYmxlIHByb3BlcnR5OiAlcyIsIGtleS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6QkFEX1ZBTFVFOworICAgIH0KKworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIGl0ciA9CisgICAgICAgICAgICBtU3RyaW5nUHJvcGVydGllcy5maW5kKGtleSk7CisgICAgaWYgKGl0ciA9PSBtU3RyaW5nUHJvcGVydGllcy5lbmQoKSkgeworICAgICAgICBBTE9HRSgiQ2Fubm90IHNldCB1bmRlZmluZWQgcHJvcGVydHkgc3RyaW5nLCBrZXk9JXMiLCBrZXkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBTdGF0dXM6OkJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBtU3RyaW5nUHJvcGVydGllc1trZXldID0gc3RkOjpzdHJpbmcodmFsdWUuY19zdHIoKSk7CisgICAgcmV0dXJuIFN0YXR1czo6T0s7Cit9CisKK1JldHVybjxTdGF0dXM+IERybVBsdWdpbjo6c2V0UHJvcGVydHlCeXRlQXJyYXkoCisgICAgY29uc3QgaGlkbF9zdHJpbmcmIG5hbWUsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiB2YWx1ZSkgeworICAgVU5VU0VEKHZhbHVlKTsKKyAgIGlmIChuYW1lID09IGtEZXZpY2VJZEtleSkgeworICAgICAgQUxPR0QoIkNhbm5vdCBzZXQgaW1tdXRhYmxlIHByb3BlcnR5OiAlcyIsIG5hbWUuY19zdHIoKSk7CisgICAgICByZXR1cm4gU3RhdHVzOjpCQURfVkFMVUU7CisgICB9CisKKyAgIC8vIFNldHRpbmcgb2YgdW5kZWZpbmVkIHByb3BlcnRpZXMgaXMgbm90IHN1cHBvcnRlZAorICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgcHJvcGVydHkgYnl0ZSBhcnJheSwga2V5PSVzIiwgbmFtZS5jX3N0cigpKTsKKyAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworfQorCitSZXR1cm48dm9pZD4gRHJtUGx1Z2luOjpxdWVyeUtleVN0YXR1cygKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgcXVlcnlLZXlTdGF0dXNfY2IgX2hpZGxfY2IpIHsKKworICAgIGlmIChzZXNzaW9uSWQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgLy8gUmV0dXJucyBlbXB0eSBrZXkgc3RhdHVzIEtleVZhbHVlIHBhaXIKKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpCQURfVkFMVUUsIGhpZGxfdmVjPEtleVZhbHVlPigpKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxLZXlWYWx1ZT4gaW5mb01hcFZlYzsKKyAgICBpbmZvTWFwVmVjLmNsZWFyKCk7CisKKyAgICBLZXlWYWx1ZSBrZXlWYWx1ZVBhaXI7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGxheVBvbGljeS5zaXplKCk7ICsraSkgeworICAgICAgICBrZXlWYWx1ZVBhaXIua2V5ID0gbVBsYXlQb2xpY3lbaV0ua2V5OworICAgICAgICBrZXlWYWx1ZVBhaXIudmFsdWUgPSBtUGxheVBvbGljeVtpXS52YWx1ZTsKKyAgICAgICAgaW5mb01hcFZlYy5wdXNoX2JhY2soa2V5VmFsdWVQYWlyKTsKKyAgICB9CisgICAgX2hpZGxfY2IoU3RhdHVzOjpPSywgdG9IaWRsVmVjKGluZm9NYXBWZWMpKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gRHJtUGx1Z2luOjpnZXROdW1iZXJPZlNlc3Npb25zKGdldE51bWJlck9mU2Vzc2lvbnNfY2IgX2hpZGxfY2IpIHsKKyAgICAgICAgdWludDMyX3QgY3VycmVudFNlc3Npb25zID0gbVNlc3Npb25MaWJyYXJ5LT5udW1PcGVuU2Vzc2lvbnMoKTsKKyAgICAgICAgdWludDMyX3QgbWF4U2Vzc2lvbnMgPSAxMDsKKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpPSywgY3VycmVudFNlc3Npb25zLCBtYXhTZXNzaW9ucyk7CisgICAgICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBEcm1QbHVnaW46OmdldFNlY3VyaXR5TGV2ZWwoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgICAgIGdldFNlY3VyaXR5TGV2ZWxfY2IgX2hpZGxfY2IpIHsKKyAgICBpZiAoc2Vzc2lvbklkLnNpemUoKSA9PSAwKSB7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6QkFEX1ZBTFVFLCBTZWN1cml0eUxldmVsOjpVTktOT1dOKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzaWQgPSB0b1ZlY3RvcihzZXNzaW9uSWQpOworICAgIHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmZpbmRTZXNzaW9uKHNpZCk7CisgICAgaWYgKCFzZXNzaW9uLmdldCgpKSB7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRCwgU2VjdXJpdHlMZXZlbDo6VU5LTk9XTik7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIFNlY3VyaXR5TGV2ZWw+OjppdGVyYXRvciBpdHIgPQorICAgICAgICAgICAgbVNlY3VyaXR5TGV2ZWwuZmluZChzaWQpOworICAgIGlmIChpdHIgPT0gbVNlY3VyaXR5TGV2ZWwuZW5kKCkpIHsKKyAgICAgICAgQUxPR0UoIlNlc3Npb24gaWQgbm90IGZvdW5kIik7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX0lOVkFMSURfU1RBVEUsIFNlY3VyaXR5TGV2ZWw6OlVOS05PV04pOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIF9oaWRsX2NiKFN0YXR1czo6T0ssIGl0ci0+c2Vjb25kKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48U3RhdHVzPiBEcm1QbHVnaW46OnNldFNlY3VyaXR5TGV2ZWwoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgICAgIFNlY3VyaXR5TGV2ZWwgbGV2ZWwpIHsKKyAgICBpZiAoc2Vzc2lvbklkLnNpemUoKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIGVtcHR5IHNlc3Npb24gaWQiKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6QkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmIChsZXZlbCA+IFNlY3VyaXR5TGV2ZWw6OlNXX1NFQ1VSRV9DUllQVE8pIHsKKyAgICAgICAgQUxPR0UoIkNhbm5vdCBzZXQgc2VjdXJpdHkgbGV2ZWwgPiBtYXgiKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2lkID0gdG9WZWN0b3Ioc2Vzc2lvbklkKTsKKyAgICBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25MaWJyYXJ5LT5maW5kU2Vzc2lvbihzaWQpOworICAgIGlmICghc2Vzc2lvbi5nZXQoKSkgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEOworICAgIH0KKworICAgIHN0ZDo6bWFwPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBTZWN1cml0eUxldmVsPjo6aXRlcmF0b3IgaXRyID0KKyAgICAgICAgICAgIG1TZWN1cml0eUxldmVsLmZpbmQoc2lkKTsKKyAgICBpZiAoaXRyICE9IG1TZWN1cml0eUxldmVsLmVuZCgpKSB7CisgICAgICAgIG1TZWN1cml0eUxldmVsW3NpZF0gPSBsZXZlbDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIW1TZWN1cml0eUxldmVsLmluc2VydCgKKyAgICAgICAgICAgICAgICBzdGQ6OnBhaXI8c3RkOjp2ZWN0b3I8dWludDhfdD4sIFNlY3VyaXR5TGV2ZWw+KHNpZCwgbGV2ZWwpKS5zZWNvbmQpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IHNlY3VyaXR5IGxldmVsIik7CisgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fSU5WQUxJRF9TVEFURTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpPSzsKK30KKworUmV0dXJuPHZvaWQ+IERybVBsdWdpbjo6Z2V0TWV0cmljcyhnZXRNZXRyaWNzX2NiIF9oaWRsX2NiKSB7CisgICAgLy8gU2V0IHRoZSBvcGVuIHNlc3Npb24gY291bnQgbWV0cmljLgorICAgIERybU1ldHJpY0dyb3VwOjpBdHRyaWJ1dGUgb3BlblNlc3Npb25Pa0F0dHJpYnV0ZSA9IHsKKyAgICAgICJzdGF0dXMiLCBEcm1NZXRyaWNHcm91cDo6VmFsdWVUeXBlOjpJTlQ2NF9UWVBFLCAoaW50NjRfdCkgU3RhdHVzOjpPSywgMC4wLCAiIgorICAgIH07CisgICAgRHJtTWV0cmljR3JvdXA6OlZhbHVlIG9wZW5TZXNzaW9uTWV0cmljVmFsdWUgPSB7CisgICAgICAiY291bnQiLCBEcm1NZXRyaWNHcm91cDo6VmFsdWVUeXBlOjpJTlQ2NF9UWVBFLCBtT3BlblNlc3Npb25Pa0NvdW50LCAwLjAsICIiCisgICAgfTsKKyAgICBEcm1NZXRyaWNHcm91cDo6TWV0cmljIG9wZW5TZXNzaW9uTWV0cmljID0geworICAgICAgIm9wZW5fc2Vzc2lvbiIsIHsgb3BlblNlc3Npb25Pa0F0dHJpYnV0ZSB9LCB7IG9wZW5TZXNzaW9uTWV0cmljVmFsdWUgfQorICAgIH07CisKKyAgICAvLyBTZXQgdGhlIGNsb3NlIHNlc3Npb24gY291bnQgbWV0cmljLgorICAgIERybU1ldHJpY0dyb3VwOjpBdHRyaWJ1dGUgY2xvc2VTZXNzaW9uT2tBdHRyaWJ1dGUgPSB7CisgICAgICAic3RhdHVzIiwgRHJtTWV0cmljR3JvdXA6OlZhbHVlVHlwZTo6SU5UNjRfVFlQRSwgKGludDY0X3QpIFN0YXR1czo6T0ssIDAuMCwgIiIKKyAgICB9OworICAgIERybU1ldHJpY0dyb3VwOjpWYWx1ZSBjbG9zZVNlc3Npb25NZXRyaWNWYWx1ZSA9IHsKKyAgICAgICJjb3VudCIsIERybU1ldHJpY0dyb3VwOjpWYWx1ZVR5cGU6OklOVDY0X1RZUEUsIG1DbG9zZVNlc3Npb25Pa0NvdW50LCAwLjAsICIiCisgICAgfTsKKyAgICBEcm1NZXRyaWNHcm91cDo6TWV0cmljIGNsb3NlU2Vzc2lvbk1ldHJpYyA9IHsKKyAgICAgICJjbG9zZV9zZXNzaW9uIiwgeyBjbG9zZVNlc3Npb25Pa0F0dHJpYnV0ZSB9LCB7IGNsb3NlU2Vzc2lvbk1ldHJpY1ZhbHVlIH0KKyAgICB9OworCisgICAgLy8gU2V0IHRoZSBjbG9zZSBzZXNzaW9uLCBub3Qgb3BlbmVkIG1ldHJpYy4KKyAgICBEcm1NZXRyaWNHcm91cDo6QXR0cmlidXRlIGNsb3NlU2Vzc2lvbk5vdE9wZW5lZEF0dHJpYnV0ZSA9IHsKKyAgICAgICJzdGF0dXMiLCBEcm1NZXRyaWNHcm91cDo6VmFsdWVUeXBlOjpJTlQ2NF9UWVBFLAorICAgICAgKGludDY0X3QpIFN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRCwgMC4wLCAiIgorICAgIH07CisgICAgRHJtTWV0cmljR3JvdXA6OlZhbHVlIGNsb3NlU2Vzc2lvbk5vdE9wZW5lZE1ldHJpY1ZhbHVlID0geworICAgICAgImNvdW50IiwgRHJtTWV0cmljR3JvdXA6OlZhbHVlVHlwZTo6SU5UNjRfVFlQRSwgbUNsb3NlU2Vzc2lvbk5vdE9wZW5lZENvdW50LCAwLjAsICIiCisgICAgfTsKKyAgICBEcm1NZXRyaWNHcm91cDo6TWV0cmljIGNsb3NlU2Vzc2lvbk5vdE9wZW5lZE1ldHJpYyA9IHsKKyAgICAgICJjbG9zZV9zZXNzaW9uIiwgeyBjbG9zZVNlc3Npb25Ob3RPcGVuZWRBdHRyaWJ1dGUgfSwgeyBjbG9zZVNlc3Npb25Ob3RPcGVuZWRNZXRyaWNWYWx1ZSB9CisgICAgfTsKKworICAgIERybU1ldHJpY0dyb3VwIG1ldHJpY3MgPSB7IHsgb3BlblNlc3Npb25NZXRyaWMsIGNsb3NlU2Vzc2lvbk1ldHJpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VTZXNzaW9uTm90T3BlbmVkTWV0cmljIH0gfTsKKworICAgIF9oaWRsX2NiKFN0YXR1czo6T0ssIGhpZGxfdmVjPERybU1ldHJpY0dyb3VwPih7bWV0cmljc30pKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gRHJtUGx1Z2luOjpnZXRTZWN1cmVTdG9wcyhnZXRTZWN1cmVTdG9wc19jYiBfaGlkbF9jYikgeworICAgIHN0ZDo6dmVjdG9yPFNlY3VyZVN0b3A+IHN0b3BzOworICAgIGZvciAoYXV0byBpdHIgPSBtU2VjdXJlU3RvcHMuYmVnaW4oKTsgaXRyICE9IG1TZWN1cmVTdG9wcy5lbmQoKTsgKytpdHIpIHsKKyAgICAgICAgQ2xlYXJrZXlTZWN1cmVTdG9wIGNsZWFya2V5U3RvcCA9IGl0ci0+c2Vjb25kOworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzdG9wVmVjOworICAgICAgICBzdG9wVmVjLmluc2VydChzdG9wVmVjLmVuZCgpLCBjbGVhcmtleVN0b3AuaWQuYmVnaW4oKSwgY2xlYXJrZXlTdG9wLmlkLmVuZCgpKTsKKyAgICAgICAgc3RvcFZlYy5pbnNlcnQoc3RvcFZlYy5lbmQoKSwgY2xlYXJrZXlTdG9wLmRhdGEuYmVnaW4oKSwgY2xlYXJrZXlTdG9wLmRhdGEuZW5kKCkpOworCisgICAgICAgIFNlY3VyZVN0b3Agc3RvcDsKKyAgICAgICAgc3RvcC5vcGFxdWVEYXRhID0gdG9IaWRsVmVjKHN0b3BWZWMpOworICAgICAgICBzdG9wcy5wdXNoX2JhY2soc3RvcCk7CisgICAgfQorICAgIF9oaWRsX2NiKFN0YXR1czo6T0ssIHN0b3BzKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gRHJtUGx1Z2luOjpnZXRTZWN1cmVTdG9wKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZWN1cmVTdG9wSWQsCisgICAgICAgIGdldFNlY3VyZVN0b3BfY2IgX2hpZGxfY2IpIHsKKyAgICBTZWN1cmVTdG9wIHN0b3A7CisgICAgYXV0byBpdHIgPSBtU2VjdXJlU3RvcHMuZmluZCh0b1ZlY3RvcihzZWN1cmVTdG9wSWQpKTsKKyAgICBpZiAoaXRyICE9IG1TZWN1cmVTdG9wcy5lbmQoKSkgeworICAgICAgICBDbGVhcmtleVNlY3VyZVN0b3AgY2xlYXJrZXlTdG9wID0gaXRyLT5zZWNvbmQ7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHN0b3BWZWM7CisgICAgICAgIHN0b3BWZWMuaW5zZXJ0KHN0b3BWZWMuZW5kKCksIGNsZWFya2V5U3RvcC5pZC5iZWdpbigpLCBjbGVhcmtleVN0b3AuaWQuZW5kKCkpOworICAgICAgICBzdG9wVmVjLmluc2VydChzdG9wVmVjLmVuZCgpLCBjbGVhcmtleVN0b3AuZGF0YS5iZWdpbigpLCBjbGVhcmtleVN0b3AuZGF0YS5lbmQoKSk7CisKKyAgICAgICAgc3RvcC5vcGFxdWVEYXRhID0gdG9IaWRsVmVjKHN0b3BWZWMpOworICAgICAgICBfaGlkbF9jYihTdGF0dXM6Ok9LLCBzdG9wKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkJBRF9WQUxVRSwgc3RvcCk7CisgICAgfQorCisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPFN0YXR1cz4gRHJtUGx1Z2luOjpyZWxlYXNlU2VjdXJlU3RvcChjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2VjdXJlU3RvcElkKSB7CisgICAgcmV0dXJuIHJlbW92ZVNlY3VyZVN0b3Aoc2VjdXJlU3RvcElkKTsKK30KKworUmV0dXJuPFN0YXR1cz4gRHJtUGx1Z2luOjpyZWxlYXNlQWxsU2VjdXJlU3RvcHMoKSB7CisgICAgcmV0dXJuIHJlbW92ZUFsbFNlY3VyZVN0b3BzKCk7Cit9CisKK1JldHVybjx2b2lkPiBEcm1QbHVnaW46OmdldFNlY3VyZVN0b3BJZHMoZ2V0U2VjdXJlU3RvcElkc19jYiBfaGlkbF9jYikgeworICAgIHN0ZDo6dmVjdG9yPFNlY3VyZVN0b3BJZD4gaWRzOworICAgIGZvciAoYXV0byBpdHIgPSBtU2VjdXJlU3RvcHMuYmVnaW4oKTsgaXRyICE9IG1TZWN1cmVTdG9wcy5lbmQoKTsgKytpdHIpIHsKKyAgICAgICAgaWRzLnB1c2hfYmFjayhpdHItPmZpcnN0KTsKKyAgICB9CisKKyAgICBfaGlkbF9jYihTdGF0dXM6Ok9LLCB0b0hpZGxWZWMoaWRzKSk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPFN0YXR1cz4gRHJtUGx1Z2luOjpyZWxlYXNlU2VjdXJlU3RvcHMoY29uc3QgU2VjdXJlU3RvcFJlbGVhc2UmIHNzUmVsZWFzZSkgeworICAgIGlmIChzc1JlbGVhc2Uub3BhcXVlRGF0YS5zaXplKCkgPT0gMCkgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpCQURfVkFMVUU7CisgICAgfQorCisgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6T0s7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gaW5wdXQgPSB0b1ZlY3Rvcihzc1JlbGVhc2Uub3BhcXVlRGF0YSk7CisKKyAgICAvLyBUaGUgZm9ybWF0IG9mIG9wYXF1ZURhdGEgaXMgc2hhcmVkIGJldHdlZW4gdGhlIHNlcnZlcgorICAgIC8vIGFuZCB0aGUgZHJtIHNlcnZpY2UuIFRoZSBjbGVhcmtleSBpbXBsZW1lbnRhdGlvbiBjb25zaXN0cyBvZjoKKyAgICAvLyAgICBjb3VudCAtIG51bWJlciBvZiBzZWN1cmUgc3RvcHMKKyAgICAvLyAgICBsaXN0IG9mIGZpeGVkIGxlbmd0aCBzZWN1cmUgc3RvcHMKKyAgICBzaXplX3QgY291bnRCdWZmZXJTaXplID0gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgc3NjYW5mKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGlucHV0LmRhdGEoKSksICIlMDQiIFBSSXUzMiwgJmNvdW50KTsKKworICAgIC8vIEF2b2lkIGRpdmlkZSBieSAwIGJlbG93LgorICAgIGlmIChjb3VudCA9PSAwKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OkJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzaXplX3Qgc2VjdXJlU3RvcFNpemUgPSAoaW5wdXQuc2l6ZSgpIC0gY291bnRCdWZmZXJTaXplKSAvIGNvdW50OworICAgIHVpbnQ4X3QgYnVmZmVyW3NlY3VyZVN0b3BTaXplXTsKKyAgICBzaXplX3Qgb2Zmc2V0ID0gY291bnRCdWZmZXJTaXplOyAvLyBza2lwIHRoZSBjb3VudAorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7ICsraSwgb2Zmc2V0ICs9IHNlY3VyZVN0b3BTaXplKSB7CisgICAgICAgIG1lbWNweShidWZmZXIsIGlucHV0LmRhdGEoKSArIG9mZnNldCwgc2VjdXJlU3RvcFNpemUpOworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBpZChidWZmZXIsIGJ1ZmZlciArIGtTZWN1cmVTdG9wSWRTaXplKTsKKworICAgICAgICBzdGF0dXMgPSByZW1vdmVTZWN1cmVTdG9wKHRvSGlkbFZlYyhpZCkpOworICAgICAgICBpZiAoU3RhdHVzOjpPSyAhPSBzdGF0dXMpIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK1JldHVybjxTdGF0dXM+IERybVBsdWdpbjo6cmVtb3ZlU2VjdXJlU3RvcChjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2VjdXJlU3RvcElkKSB7CisgICAgaWYgKDEgIT0gbVNlY3VyZVN0b3BzLmVyYXNlKHRvVmVjdG9yKHNlY3VyZVN0b3BJZCkpKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OkJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czo6T0s7Cit9CisKK1JldHVybjxTdGF0dXM+IERybVBsdWdpbjo6cmVtb3ZlQWxsU2VjdXJlU3RvcHMoKSB7CisgICAgbVNlY3VyZVN0b3BzLmNsZWFyKCk7CisgICAgbU5leHRTZWN1cmVTdG9wSWQgPSBrU2VjdXJlU3RvcElkU3RhcnQ7CisgICAgcmV0dXJuIFN0YXR1czo6T0s7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAgLy8gbmFtZXNwYWNlIFYxXzEKK30gIC8vIG5hbWVzcGFjZSBkcm0KK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvSW5pdERhdGFQYXJzZXIuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Jbml0RGF0YVBhcnNlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJiYjY1MQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvSW5pdERhdGFQYXJzZXIuY3BwCkBAIC0wLDAgKzEsMTYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJoaWRsX0luaXREYXRhUGFyc2VyIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiSW5pdERhdGFQYXJzZXIuaCIKKworI2luY2x1ZGUgIkJhc2U2NC5oIgorCisjaW5jbHVkZSAiQ2xlYXJLZXlVVUlELmgiCisjaW5jbHVkZSAiTWltZVR5cGUuaCIKKyNpbmNsdWRlICJVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCituYW1lc3BhY2UgeworICAgIGNvbnN0IHNpemVfdCBrS2V5SWRTaXplID0gMTY7CisgICAgY29uc3Qgc2l6ZV90IGtTeXN0ZW1JZFNpemUgPSAxNjsKK30KKworc3RkOjp2ZWN0b3I8dWludDhfdD4gU3RyVG9WZWN0b3IoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZlYyhzdHIuYmVnaW4oKSwgc3RyLmVuZCgpKTsKKyAgICByZXR1cm4gdmVjOworfQorCitTdGF0dXMgSW5pdERhdGFQYXJzZXI6OnBhcnNlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGUsCisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBsaWNlbnNlUmVxdWVzdCkgeworICAgIC8vIEJ1aWxkIGEgbGlzdCBvZiB0aGUga2V5IElEcworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IHVpbnQ4X3QqPiBrZXlJZHM7CisKKyAgICBpZiAodHlwZSA9PSBrSXNvQm1mZlZpZGVvTWltZVR5cGUgfHwKKyAgICAgICAgdHlwZSA9PSBrSXNvQm1mZkF1ZGlvTWltZVR5cGUgfHwKKyAgICAgICAgdHlwZSA9PSBrQ2VuY0luaXREYXRhRm9ybWF0KSB7CisgICAgICAgIFN0YXR1cyByZXMgPSBwYXJzZVBzc2goaW5pdERhdGEsICZrZXlJZHMpOworICAgICAgICBpZiAocmVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUgPT0ga1dlYm1WaWRlb01pbWVUeXBlIHx8CisgICAgICAgIHR5cGUgPT0ga1dlYm1BdWRpb01pbWVUeXBlIHx8CisgICAgICAgIHR5cGUgPT0ga1dlYm1Jbml0RGF0YUZvcm1hdCkgeworICAgICAgICAvLyBXZWJNICJpbml0IGRhdGEiIGlzIGp1c3QgYSBzaW5nbGUga2V5IElECisgICAgICAgIGlmIChpbml0RGF0YS5zaXplKCkgIT0ga0tleUlkU2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgICAgIH0KKyAgICAgICAga2V5SWRzLnB1c2hfYmFjayhpbml0RGF0YS5kYXRhKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIC8vIEJ1aWxkIHRoZSByZXF1ZXN0CisgICAgc3RkOjpzdHJpbmcgcmVxdWVzdEpzb24gPSBnZW5lcmF0ZVJlcXVlc3Qoa2V5SWRzKTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByZXF1ZXN0SnNvblZlYyA9IFN0clRvVmVjdG9yKHJlcXVlc3RKc29uKTsKKworICAgIGxpY2Vuc2VSZXF1ZXN0LT5jbGVhcigpOworICAgIGxpY2Vuc2VSZXF1ZXN0LT5pbnNlcnQobGljZW5zZVJlcXVlc3QtPmVuZCgpLCByZXF1ZXN0SnNvblZlYy5iZWdpbigpLCByZXF1ZXN0SnNvblZlYy5lbmQoKSk7CisgICAgcmV0dXJuIFN0YXR1czo6T0s7Cit9CisKK1N0YXR1cyBJbml0RGF0YVBhcnNlcjo6cGFyc2VQc3NoKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwKKyAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgdWludDhfdCo+KiBrZXlJZHMpIHsKKyAgICBzaXplX3QgcmVhZFBvc2l0aW9uID0gMDsKKworICAgIC8vIFZhbGlkYXRlIHNpemUgZmllbGQKKyAgICB1aW50MzJfdCBleHBlY3RlZFNpemUgPSBpbml0RGF0YS5zaXplKCk7CisgICAgZXhwZWN0ZWRTaXplID0gaHRvbmwoZXhwZWN0ZWRTaXplKTsKKyAgICBpZiAobWVtY21wKCZpbml0RGF0YVtyZWFkUG9zaXRpb25dLCAmZXhwZWN0ZWRTaXplLAorICAgICAgICAgICAgICAgc2l6ZW9mKGV4cGVjdGVkU2l6ZSkpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorICAgIHJlYWRQb3NpdGlvbiArPSBzaXplb2YoZXhwZWN0ZWRTaXplKTsKKworICAgIC8vIFZhbGlkYXRlIFBTU0ggYm94IGlkZW50aWZpZXIKKyAgICBjb25zdCBjaGFyIHBzc2hJZGVudGlmaWVyWzRdID0geydwJywgJ3MnLCAncycsICdoJ307CisgICAgaWYgKG1lbWNtcCgmaW5pdERhdGFbcmVhZFBvc2l0aW9uXSwgcHNzaElkZW50aWZpZXIsCisgICAgICAgICAgICAgICBzaXplb2YocHNzaElkZW50aWZpZXIpKSAhPSAwKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKyAgICByZWFkUG9zaXRpb24gKz0gc2l6ZW9mKHBzc2hJZGVudGlmaWVyKTsKKworICAgIC8vIFZhbGlkYXRlIEVNRSB2ZXJzaW9uIG51bWJlcgorICAgIGNvbnN0IHVpbnQ4X3QgcHNzaFZlcnNpb24xWzRdID0gezEsIDAsIDAsIDB9OworICAgIGlmIChtZW1jbXAoJmluaXREYXRhW3JlYWRQb3NpdGlvbl0sIHBzc2hWZXJzaW9uMSwKKyAgICAgICAgICAgICAgIHNpemVvZihwc3NoVmVyc2lvbjEpKSAhPSAwKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKyAgICByZWFkUG9zaXRpb24gKz0gc2l6ZW9mKHBzc2hWZXJzaW9uMSk7CisKKyAgICAvLyBWYWxpZGF0ZSBzeXN0ZW0gSUQKKyAgICBpZiAoIWNsZWFya2V5ZHJtOjppc0NsZWFyS2V5VVVJRCgmaW5pdERhdGFbcmVhZFBvc2l0aW9uXSkpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorICAgIHJlYWRQb3NpdGlvbiArPSBrU3lzdGVtSWRTaXplOworCisgICAgLy8gUmVhZCBrZXkgSUQgY291bnQKKyAgICB1aW50MzJfdCBrZXlJZENvdW50OworICAgIG1lbWNweSgma2V5SWRDb3VudCwgJmluaXREYXRhW3JlYWRQb3NpdGlvbl0sIHNpemVvZihrZXlJZENvdW50KSk7CisgICAga2V5SWRDb3VudCA9IG50b2hsKGtleUlkQ291bnQpOworICAgIHJlYWRQb3NpdGlvbiArPSBzaXplb2Yoa2V5SWRDb3VudCk7CisgICAgaWYgKHJlYWRQb3NpdGlvbiArICgodWludDY0X3Qpa2V5SWRDb3VudCAqIGtLZXlJZFNpemUpICE9CisgICAgICAgICAgICBpbml0RGF0YS5zaXplKCkgLSBzaXplb2YodWludDMyX3QpKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIC8vIENhbGN1bGF0ZSB0aGUga2V5IElEIG9mZnNldHMKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwga2V5SWRDb3VudDsgKytpKSB7CisgICAgICAgIHNpemVfdCBrZXlJZFBvc2l0aW9uID0gcmVhZFBvc2l0aW9uICsgKGkgKiBrS2V5SWRTaXplKTsKKyAgICAgICAga2V5SWRzLT5wdXNoX2JhY2soJmluaXREYXRhW2tleUlkUG9zaXRpb25dKTsKKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czo6T0s7Cit9CisKK3N0ZDo6c3RyaW5nIEluaXREYXRhUGFyc2VyOjpnZW5lcmF0ZVJlcXVlc3QoY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgdWludDhfdCo+JiBrZXlJZHMpIHsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBrUmVxdWVzdFByZWZpeCgie1wia2lkc1wiOlsiKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBrUmVxdWVzdFN1ZmZpeCgiXSxcInR5cGVcIjpcInRlbXBvcmFyeVwifSIpOworCisgICAgc3RkOjpzdHJpbmcgcmVxdWVzdChrUmVxdWVzdFByZWZpeCk7CisgICAgc3RkOjpzdHJpbmcgZW5jb2RlZElkOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga2V5SWRzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGVuY29kZWRJZC5jbGVhcigpOworICAgICAgICBlbmNvZGVCYXNlNjRVcmwoa2V5SWRzW2ldLCBrS2V5SWRTaXplLCAmZW5jb2RlZElkKTsKKyAgICAgICAgaWYgKGkgIT0gMCkgeworICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIiwiKTsKKyAgICAgICAgfQorICAgICAgICByZXF1ZXN0LnB1c2hfYmFjaygnXCInKTsKKyAgICAgICAgcmVxdWVzdC5hcHBlbmQoZW5jb2RlZElkKTsKKyAgICAgICAgcmVxdWVzdC5wdXNoX2JhY2soJ1wiJyk7CisgICAgfQorICAgIHJlcXVlc3QuYXBwZW5kKGtSZXF1ZXN0U3VmZml4KTsKKworICAgIC8vIEFuZHJvaWQncyBCYXNlNjQgZW5jb2RlciBwcm9kdWNlcyBwYWRkaW5nLiBFTUUgZm9yYmlkcyBwYWRkaW5nLgorICAgIGNvbnN0IGNoYXIga0Jhc2U2NFBhZGRpbmcgPSAnPSc7CisgICAgcmVxdWVzdC5lcmFzZShzdGQ6OnJlbW92ZShyZXF1ZXN0LmJlZ2luKCksIHJlcXVlc3QuZW5kKCksIGtCYXNlNjRQYWRkaW5nKSwgcmVxdWVzdC5lbmQoKSk7CisKKyAgICByZXR1cm4gcmVxdWVzdDsKK30KKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKK30gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIGRybQorfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvSnNvbldlYktleS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0pzb25XZWJLZXkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjY2I0MWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0pzb25XZWJLZXkuY3BwCkBAIC0wLDAgKzEsMjc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgTE9HX1RBRyAiaGlkbF9Kc29uV2ViS2V5IgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJKc29uV2ViS2V5LmgiCisKKyNpbmNsdWRlICJCYXNlNjQuaCIKKworbmFtZXNwYWNlIHsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtLZXlzVGFnKCJrZXlzIik7Citjb25zdCBzdGQ6OnN0cmluZyBrS2V5VHlwZVRhZygia3R5Iik7Citjb25zdCBzdGQ6OnN0cmluZyBrU3ltbWV0cmljS2V5VmFsdWUoIm9jdCIpOworY29uc3Qgc3RkOjpzdHJpbmcga0tleVRhZygiayIpOworY29uc3Qgc3RkOjpzdHJpbmcga0tleUlkVGFnKCJraWQiKTsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtCYXNlNjRQYWRkaW5nKCI9Iik7Cit9CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgZHJtIHsKK25hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBjbGVhcmtleSB7CisKK0pzb25XZWJLZXk6Okpzb25XZWJLZXkoKSB7Cit9CisKK0pzb25XZWJLZXk6On5Kc29uV2ViS2V5KCkgeworfQorCisvKgorICogUGFyc2VzIGEgSlNPTiBXZWIgS2V5IFNldCBzdHJpbmcsIGluaXRpYWxpemVzIGEgS2V5TWFwIHdpdGgga2V5IGlkOmtleQorICogcGFpcnMgZnJvbSB0aGUgSlNPTiBXZWIgS2V5IFNldC4gQm90aCBrZXkgaWRzIGFuZCBrZXlzIGFyZSBiYXNlNjR1cmwKKyAqIGVuY29kZWQuIFRoZSBLZXlNYXAgY29udGFpbnMgYmFzZTY0dXJsIGRlY29kZWQga2V5IGlkOmtleSBwYWlycy4KKyAqCisgKiBAcmV0dXJuIFJldHVybnMgZmFsc2UgZm9yIGVycm9ycywgdHJ1ZSBmb3Igc3VjY2Vzcy4KKyAqLworYm9vbCBKc29uV2ViS2V5OjpleHRyYWN0S2V5c0Zyb21Kc29uV2ViS2V5U2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBqc29uV2ViS2V5U2V0LAorICAgICAgICBLZXlNYXAqIGtleXMpIHsKKworICAgIGtleXMtPmNsZWFyKCk7CisKKyAgICBpZiAoIXBhcnNlSnNvbldlYktleVNldChqc29uV2ViS2V5U2V0LCAmbUpzb25PYmplY3RzKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gbUpzb25PYmplY3RzWzBdIGNvbnRhaW5zIHRoZSBlbnRpcmUgSlNPTiBXZWIgS2V5IFNldCwgaW5jbHVkaW5nCisgICAgLy8gYWxsIHRoZSBiYXNlNjQgZW5jb2RlZCBrZXlzLiBFYWNoIGtleSBpcyBhbHNvIHN0b3JlZCBzZXBhcmF0ZWx5IGFzCisgICAgLy8gYSBKU09OIG9iamVjdCBpbiBtSnNvbk9iamVjdHNbMS4ubl0gd2hlcmUgbiBpcyB0aGUgdG90YWwKKyAgICAvLyBudW1iZXIgb2Yga2V5cyBpbiB0aGUgc2V0LgorICAgIGlmICghaXNKc29uV2ViS2V5U2V0KG1Kc29uT2JqZWN0c1swXSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGVuY29kZWRLZXksIGVuY29kZWRLZXlJZDsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkZWNvZGVkS2V5LCBkZWNvZGVkS2V5SWQ7CisKKyAgICAvLyBtSnNvbk9iamVjdHNbMV0gY29udGFpbnMgdGhlIGZpcnN0IEpTT04gV2ViIEtleSBpbiB0aGUgc2V0CisgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBtSnNvbk9iamVjdHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgZW5jb2RlZEtleUlkLmNsZWFyKCk7CisgICAgICAgIGVuY29kZWRLZXkuY2xlYXIoKTsKKworICAgICAgICBpZiAoIXBhcnNlSnNvbk9iamVjdChtSnNvbk9iamVjdHNbaV0sICZtVG9rZW5zKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBpZiAoZmluZEtleShtSnNvbk9iamVjdHNbaV0sICZlbmNvZGVkS2V5SWQsICZlbmNvZGVkS2V5KSkgeworICAgICAgICAgICAgaWYgKGVuY29kZWRLZXlJZC5lbXB0eSgpIHx8IGVuY29kZWRLZXkuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJNdXN0IGhhdmUgYm90aCBrZXkgaWQgYW5kIGtleSBpbiB0aGUgSnNvbldlYktleSBzZXQuIik7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghZGVjb2RlQmFzZTY0U3RyaW5nKGVuY29kZWRLZXlJZCwgJmRlY29kZWRLZXlJZCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGRlY29kZSBrZXkgaWQoJXMpIiwgZW5jb2RlZEtleUlkLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWRlY29kZUJhc2U2NFN0cmluZyhlbmNvZGVkS2V5LCAmZGVjb2RlZEtleSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGRlY29kZSBrZXkoJXMpIiwgZW5jb2RlZEtleS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAga2V5cy0+aW5zZXJ0KHN0ZDo6cGFpcjxzdGQ6OnZlY3Rvcjx1aW50OF90PiwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gPihkZWNvZGVkS2V5SWQsIGRlY29kZWRLZXkpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBKc29uV2ViS2V5OjpkZWNvZGVCYXNlNjRTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGVuY29kZWRUZXh0LAorICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiogZGVjb2RlZFRleHQpIHsKKworICAgIGRlY29kZWRUZXh0LT5jbGVhcigpOworCisgICAgLy8gZW5jb2RlZFRleHQgc2hvdWxkIG5vdCBjb250YWluIHBhZGRpbmcgY2hhcmFjdGVycyBhcyBwZXIgRU1FIHNwZWMuCisgICAgaWYgKGVuY29kZWRUZXh0LmZpbmQoa0Jhc2U2NFBhZGRpbmcpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBTaW5jZSBkZWNvZGVCYXNlNjQoKSByZXF1aXJlcyBwYWRkaW5nIGNoYXJhY3RlcnMsCisgICAgLy8gYWRkIHRoZW0gc28gbGVuZ3RoIG9mIGVuY29kZWRUZXh0IGlzIGV4YWN0bHkgYSBtdWx0aXBsZSBvZiA0LgorICAgIGludCByZW1haW5kZXIgPSBlbmNvZGVkVGV4dC5sZW5ndGgoKSAlIDQ7CisgICAgc3RkOjpzdHJpbmcgcGFkZGVkVGV4dChlbmNvZGVkVGV4dCk7CisgICAgaWYgKHJlbWFpbmRlciA+IDApIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0IC0gcmVtYWluZGVyOyArK2kpIHsKKyAgICAgICAgICAgIHBhZGRlZFRleHQuYXBwZW5kKGtCYXNlNjRQYWRkaW5nKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNwPEJ1ZmZlcj4gYnVmZmVyID0gZGVjb2RlQmFzZTY0KHBhZGRlZFRleHQpOworICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiTWFsZm9ybWVkIGJhc2U2NCBlbmNvZGVkIGNvbnRlbnQgZm91bmQuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBkZWNvZGVkVGV4dC0+aW5zZXJ0KGRlY29kZWRUZXh0LT5lbmQoKSwgYnVmZmVyLT5iYXNlKCksIGJ1ZmZlci0+YmFzZSgpICsgYnVmZmVyLT5zaXplKCkpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEpzb25XZWJLZXk6OmZpbmRLZXkoY29uc3Qgc3RkOjpzdHJpbmcmIGpzb25PYmplY3QsIHN0ZDo6c3RyaW5nKiBrZXlJZCwKKyAgICAgICAgc3RkOjpzdHJpbmcqIGVuY29kZWRLZXkpIHsKKworICAgIHN0ZDo6c3RyaW5nIGtleSwgdmFsdWU7CisKKyAgICAvLyBPbmx5IGFsbG93IHN5bW1ldHJpYyBrZXksIGkuZS4gImt0eSI6Im9jdCIgcGFpci4KKyAgICBpZiAoanNvbk9iamVjdC5maW5kKGtLZXlUeXBlVGFnKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBmaW5kVmFsdWUoa0tleVR5cGVUYWcsICZ2YWx1ZSk7CisgICAgICAgIGlmICgwICE9IHZhbHVlLmNvbXBhcmUoa1N5bW1ldHJpY0tleVZhbHVlKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoanNvbk9iamVjdC5maW5kKGtLZXlJZFRhZykgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgZmluZFZhbHVlKGtLZXlJZFRhZywga2V5SWQpOworICAgIH0KKworICAgIGlmIChqc29uT2JqZWN0LmZpbmQoa0tleVRhZykgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgZmluZFZhbHVlKGtLZXlUYWcsIGVuY29kZWRLZXkpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBKc29uV2ViS2V5OjpmaW5kVmFsdWUoY29uc3Qgc3RkOjpzdHJpbmcgJmtleSwgc3RkOjpzdHJpbmcqIHZhbHVlKSB7CisgICAgdmFsdWUtPmNsZWFyKCk7CisgICAgY29uc3QgY2hhciogdmFsdWVUb2tlbjsKKyAgICBmb3IgKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgbmV4dFRva2VuID0gbVRva2Vucy5iZWdpbigpOworICAgICAgICBuZXh0VG9rZW4gIT0gbVRva2Vucy5lbmQoKTsgKytuZXh0VG9rZW4pIHsKKyAgICAgICAgaWYgKDAgPT0gKCpuZXh0VG9rZW4pLmNvbXBhcmUoa2V5KSkgeworICAgICAgICAgICAgaWYgKG5leHRUb2tlbiArIDEgPT0gbVRva2Vucy5lbmQoKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHZhbHVlVG9rZW4gPSAoKihuZXh0VG9rZW4gKyAxKSkuY19zdHIoKTsKKyAgICAgICAgICAgIHZhbHVlLT5hc3NpZ24odmFsdWVUb2tlbik7CisgICAgICAgICAgICBuZXh0VG9rZW4rKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCitib29sIEpzb25XZWJLZXk6OmlzSnNvbldlYktleVNldChjb25zdCBzdGQ6OnN0cmluZyYganNvbk9iamVjdCkgY29uc3QgeworICAgIGlmIChqc29uT2JqZWN0LmZpbmQoa0tleXNUYWcpID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIEFMT0dFKCJKU09OIFdlYiBLZXkgZG9lcyBub3QgY29udGFpbiBrZXlzLiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvKgorICogUGFyc2VzIGEgSlNPTiBvYmplY3RzIHN0cmluZyBhbmQgaW5pdGlhbGl6ZXMgYSB2ZWN0b3Igb2YgdG9rZW5zLgorICoKKyAqIEByZXR1cm4gUmV0dXJucyBmYWxzZSBmb3IgZXJyb3JzLCB0cnVlIGZvciBzdWNjZXNzLgorICovCitib29sIEpzb25XZWJLZXk6OnBhcnNlSnNvbk9iamVjdChjb25zdCBzdGQ6OnN0cmluZyYganNvbk9iamVjdCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiB0b2tlbnMpIHsKKyAgICBqc21uX3BhcnNlciBwYXJzZXI7CisKKyAgICBqc21uX2luaXQoJnBhcnNlcik7CisgICAgaW50IG51bVRva2VucyA9IGpzbW5fcGFyc2UoJnBhcnNlciwKKyAgICAgICAganNvbk9iamVjdC5jX3N0cigpLCBqc29uT2JqZWN0LnNpemUoKSwgbnVsbHB0ciwgMCk7CisgICAgaWYgKG51bVRva2VucyA8IDApIHsKKyAgICAgICAgQUxPR0UoIlBhcnNlciByZXR1cm5zIGVycm9yIGNvZGU9JWQiLCBudW1Ub2tlbnMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdW5zaWduZWQgaW50IGpzbW5Ub2tlbnNTaXplID0gbnVtVG9rZW5zICogc2l6ZW9mKGpzbW50b2tfdCk7CisgICAgbUpzbW5Ub2tlbnMuY2xlYXIoKTsKKyAgICBtSnNtblRva2Vucy5yZXNpemUoanNtblRva2Vuc1NpemUpOworCisgICAganNtbl9pbml0KCZwYXJzZXIpOworICAgIGludCBzdGF0dXMgPSBqc21uX3BhcnNlKCZwYXJzZXIsIGpzb25PYmplY3QuY19zdHIoKSwKKyAgICAgICAganNvbk9iamVjdC5zaXplKCksIG1Kc21uVG9rZW5zLmRhdGEoKSwgbnVtVG9rZW5zKTsKKyAgICBpZiAoc3RhdHVzIDwgMCkgeworICAgICAgICBBTE9HRSgiUGFyc2VyIHJldHVybnMgZXJyb3IgY29kZT0lZCIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB0b2tlbnMtPmNsZWFyKCk7CisgICAgc3RkOjpzdHJpbmcgdG9rZW47CisgICAgY29uc3QgY2hhciAqcGpzOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgbnVtVG9rZW5zOyArK2opIHsKKyAgICAgICAgcGpzID0ganNvbk9iamVjdC5jX3N0cigpICsgbUpzbW5Ub2tlbnNbal0uc3RhcnQ7CisgICAgICAgIGlmIChtSnNtblRva2Vuc1tqXS50eXBlID09IEpTTU5fU1RSSU5HIHx8CisgICAgICAgICAgICAgICAgbUpzbW5Ub2tlbnNbal0udHlwZSA9PSBKU01OX1BSSU1JVElWRSkgeworICAgICAgICAgICAgdG9rZW4uYXNzaWduKHBqcywgbUpzbW5Ub2tlbnNbal0uZW5kIC0gbUpzbW5Ub2tlbnNbal0uc3RhcnQpOworICAgICAgICAgICAgdG9rZW5zLT5wdXNoX2JhY2sodG9rZW4pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvKgorICogUGFyc2VzIEpTT04gV2ViIEtleSBTZXQgc3RyaW5nIGFuZCBpbml0aWFsaXplcyBhIHZlY3RvciBvZiBKU09OIG9iamVjdHMuCisgKgorICogQHJldHVybiBSZXR1cm5zIGZhbHNlIGZvciBlcnJvcnMsIHRydWUgZm9yIHN1Y2Nlc3MuCisgKi8KK2Jvb2wgSnNvbldlYktleTo6cGFyc2VKc29uV2ViS2V5U2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBqc29uV2ViS2V5U2V0LAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIGpzb25PYmplY3RzKSB7CisgICAgaWYgKGpzb25XZWJLZXlTZXQuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiRW1wdHkgSlNPTiBXZWIgS2V5Iik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBUaGUganNtbiBwYXJzZXIgb25seSBzdXBwb3J0cyB1bmljb2RlIGVuY29kaW5nLgorICAgIGpzbW5fcGFyc2VyIHBhcnNlcjsKKworICAgIC8vIENvbXB1dGVzIG51bWJlciBvZiB0b2tlbnMuIEEgdG9rZW4gbWFya3MgdGhlIHR5cGUsIG9mZnNldCBpbgorICAgIC8vIHRoZSBvcmlnaW5hbCBzdHJpbmcuCisgICAganNtbl9pbml0KCZwYXJzZXIpOworICAgIGludCBudW1Ub2tlbnMgPSBqc21uX3BhcnNlKCZwYXJzZXIsCisgICAgICAgICAgICBqc29uV2ViS2V5U2V0LmNfc3RyKCksIGpzb25XZWJLZXlTZXQuc2l6ZSgpLCBudWxscHRyLCAwKTsKKyAgICBpZiAobnVtVG9rZW5zIDwgMCkgeworICAgICAgICBBTE9HRSgiUGFyc2VyIHJldHVybnMgZXJyb3IgY29kZT0lZCIsIG51bVRva2Vucyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBpbnQganNtblRva2Vuc1NpemUgPSBudW1Ub2tlbnMgKiBzaXplb2YoanNtbnRva190KTsKKyAgICBtSnNtblRva2Vucy5yZXNpemUoanNtblRva2Vuc1NpemUpOworCisgICAganNtbl9pbml0KCZwYXJzZXIpOworICAgIGludCBzdGF0dXMgPSBqc21uX3BhcnNlKCZwYXJzZXIsIGpzb25XZWJLZXlTZXQuY19zdHIoKSwKKyAgICAgICAgICAgIGpzb25XZWJLZXlTZXQuc2l6ZSgpLCBtSnNtblRva2Vucy5kYXRhKCksIG51bVRva2Vucyk7CisgICAgaWYgKHN0YXR1cyA8IDApIHsKKyAgICAgICAgQUxPR0UoIlBhcnNlciByZXR1cm5zIGVycm9yIGNvZGU9JWQiLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgdG9rZW47CisgICAgY29uc3QgY2hhciAqcGpzOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtVG9rZW5zOyArK2kpIHsKKyAgICAgICAgcGpzID0ganNvbldlYktleVNldC5jX3N0cigpICsgbUpzbW5Ub2tlbnNbaV0uc3RhcnQ7CisgICAgICAgIGlmIChtSnNtblRva2Vuc1tpXS50eXBlID09IEpTTU5fT0JKRUNUKSB7CisgICAgICAgICAgICB0b2tlbi5hc3NpZ24ocGpzLCBtSnNtblRva2Vuc1tpXS5lbmQgLSBtSnNtblRva2Vuc1tpXS5zdGFydCk7CisgICAgICAgICAgICBqc29uT2JqZWN0cy0+cHVzaF9iYWNrKHRva2VuKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKK30gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIGRybQorfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9TZXNzaW9uLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvU2Vzc2lvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdjOTI2OQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvU2Vzc2lvbi5jcHAKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiaGlkbF9DbGVhcktleVNlc3Npb24iCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJTZXNzaW9uLmgiCisjaW5jbHVkZSAiVXRpbHMuaCIKKworI2luY2x1ZGUgIkFlc0N0ckRlY3J5cHRvci5oIgorI2luY2x1ZGUgIkluaXREYXRhUGFyc2VyLmgiCisjaW5jbHVkZSAiSnNvbldlYktleS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OktleVZhbHVlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTdGF0dXM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN1YlNhbXBsZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3VzaW5nIGFuZHJvaWQ6Ok11dGV4OworCitTdGF0dXMgU2Vzc2lvbjo6Z2V0S2V5UmVxdWVzdCgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluaXREYXRhLAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWltZVR5cGUsCisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBrZXlSZXF1ZXN0KSBjb25zdCB7CisgICAgSW5pdERhdGFQYXJzZXIgcGFyc2VyOworICAgIHJldHVybiBwYXJzZXIucGFyc2UoaW5pdERhdGEsIG1pbWVUeXBlLCBrZXlSZXF1ZXN0KTsKK30KKworU3RhdHVzIFNlc3Npb246OnByb3ZpZGVLZXlSZXNwb25zZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcmVzcG9uc2UpIHsKKyAgICBzdGQ6OnN0cmluZyByZXNwb25zZVN0cmluZygKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHJlc3BvbnNlLmRhdGEoKSksIHJlc3BvbnNlLnNpemUoKSk7CisgICAgS2V5TWFwIGtleXM7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTWFwTG9jayk7CisgICAgSnNvbldlYktleSBwYXJzZXI7CisgICAgaWYgKHBhcnNlci5leHRyYWN0S2V5c0Zyb21Kc29uV2ViS2V5U2V0KHJlc3BvbnNlU3RyaW5nLCAma2V5cykpIHsKKyAgICAgICAgZm9yIChhdXRvICZrZXkgOiBrZXlzKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaXJzdChrZXkuZmlyc3QuYmVnaW4oKSwga2V5LmZpcnN0LmVuZCgpKTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNlY29uZChrZXkuc2Vjb25kLmJlZ2luKCksIGtleS5zZWNvbmQuZW5kKCkpOworICAgICAgICAgICAgbUtleU1hcC5pbnNlcnQoc3RkOjpwYWlyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiA+KGtleS5maXJzdCwga2V5LnNlY29uZCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBTdGF0dXM6Ok9LOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9VTktOT1dOOworICAgIH0KK30KKworU3RhdHVzIFNlc3Npb246OmRlY3J5cHQoCisgICAgICAgIGNvbnN0IEtleUlkIGtleUlkLCBjb25zdCBJdiBpdiwgY29uc3QgdWludDhfdCogc3JjUHRyLAorICAgICAgICB1aW50OF90KiBkZXN0UHRyLCBjb25zdCBzdGQ6OnZlY3RvcjxTdWJTYW1wbGU+IHN1YlNhbXBsZXMsCisgICAgICAgIHNpemVfdCogYnl0ZXNEZWNyeXB0ZWRPdXQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTWFwTG9jayk7CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrZXlJZFZlY3RvcjsKKyAgICBrZXlJZFZlY3Rvci5jbGVhcigpOworICAgIGtleUlkVmVjdG9yLmluc2VydChrZXlJZFZlY3Rvci5lbmQoKSwga2V5SWQsIGtleUlkICsga0Jsb2NrU2l6ZSk7CisgICAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ID46Oml0ZXJhdG9yIGl0cjsKKyAgICBpdHIgPSBtS2V5TWFwLmZpbmQoa2V5SWRWZWN0b3IpOworICAgIGlmIChpdHIgPT0gbUtleU1hcC5lbmQoKSkgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fTk9fTElDRU5TRTsKKyAgICB9CisKKyAgICBBZXNDdHJEZWNyeXB0b3IgZGVjcnlwdG9yOworICAgIHJldHVybiBkZWNyeXB0b3IuZGVjcnlwdCgKKyAgICAgICAgICAgIGl0ci0+c2Vjb25kIC8qa2V5Ki8sIGl2LCBzcmNQdHIsIGRlc3RQdHIsIHN1YlNhbXBsZXMsCisgICAgICAgICAgICBzdWJTYW1wbGVzLnNpemUoKSwgYnl0ZXNEZWNyeXB0ZWRPdXQpOworfQorCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgZHJtCit9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9TZXNzaW9uTGlicmFyeS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL1Nlc3Npb25MaWJyYXJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDMxOWU2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9TZXNzaW9uTGlicmFyeS5jcHAKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiaGlkbF9DbGVhcktleVNlc3Npb25MaWJyYXJ5IgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiU2Vzc2lvbkxpYnJhcnkuaCIKKyNpbmNsdWRlICJVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKworTXV0ZXggU2Vzc2lvbkxpYnJhcnk6OnNTaW5nbGV0b25Mb2NrOworU2Vzc2lvbkxpYnJhcnkqIFNlc3Npb25MaWJyYXJ5OjpzU2luZ2xldG9uID0gTlVMTDsKKworU2Vzc2lvbkxpYnJhcnkqIFNlc3Npb25MaWJyYXJ5OjpnZXQoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soc1NpbmdsZXRvbkxvY2spOworCisgICAgaWYgKHNTaW5nbGV0b24gPT0gTlVMTCkgeworICAgICAgICBBTE9HRCgiSW5zdGFudGlhdGluZyBTZXNzaW9uIExpYnJhcnkgU2luZ2xldG9uLiIpOworICAgICAgICBzU2luZ2xldG9uID0gbmV3IFNlc3Npb25MaWJyYXJ5KCk7CisgICAgfQorCisgICAgcmV0dXJuIHNTaW5nbGV0b247Cit9CisKK3NwPFNlc3Npb24+IFNlc3Npb25MaWJyYXJ5OjpjcmVhdGVTZXNzaW9uKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXNzaW9uc0xvY2spOworCisgICAgY2hhciBzZXNzaW9uSWRSYXdbMTZdOworICAgIHNucHJpbnRmKHNlc3Npb25JZFJhdywgc2l6ZW9mKHNlc3Npb25JZFJhdyksICIldSIsIG1OZXh0U2Vzc2lvbklkKTsKKworICAgIG1OZXh0U2Vzc2lvbklkICs9IDE7CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWQ7CisgICAgc2Vzc2lvbklkLmluc2VydChzZXNzaW9uSWQuZW5kKCksIHNlc3Npb25JZFJhdywKKyAgICAgICAgICAgIHNlc3Npb25JZFJhdyArIHNpemVvZihzZXNzaW9uSWRSYXcpIC8gc2l6ZW9mKHVpbnQ4X3QpKTsKKworICAgIG1TZXNzaW9ucy5pbnNlcnQoc3RkOjpwYWlyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LAorICAgICAgICAgICAgc3A8U2Vzc2lvbj4gPihzZXNzaW9uSWQsIG5ldyBTZXNzaW9uKHNlc3Npb25JZCkpKTsKKyAgICBzdGQ6Om1hcDxzdGQ6OnZlY3Rvcjx1aW50OF90Piwgc3A8U2Vzc2lvbj4gPjo6aXRlcmF0b3IgaXRyID0gbVNlc3Npb25zLmZpbmQoc2Vzc2lvbklkKTsKKyAgICBpZiAoaXRyICE9IG1TZXNzaW9ucy5lbmQoKSkgeworICAgICAgICByZXR1cm4gaXRyLT5zZWNvbmQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorfQorCitzcDxTZXNzaW9uPiBTZXNzaW9uTGlicmFyeTo6ZmluZFNlc3Npb24oCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2Vzc2lvbnNMb2NrKTsKKyAgICBzdGQ6Om1hcDxzdGQ6OnZlY3Rvcjx1aW50OF90Piwgc3A8U2Vzc2lvbj4gPjo6aXRlcmF0b3IgaXRyID0gbVNlc3Npb25zLmZpbmQoc2Vzc2lvbklkKTsKKyAgICBpZiAoaXRyICE9IG1TZXNzaW9ucy5lbmQoKSkgeworICAgICAgICByZXR1cm4gaXRyLT5zZWNvbmQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorfQorCit2b2lkIFNlc3Npb25MaWJyYXJ5OjpkZXN0cm95U2Vzc2lvbihjb25zdCBzcDxTZXNzaW9uPiYgc2Vzc2lvbikgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXNzaW9uc0xvY2spOworICAgIG1TZXNzaW9ucy5lcmFzZShzZXNzaW9uLT5zZXNzaW9uSWQoKSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5Cit9IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBkcm0KK30gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMS1zZXJ2aWNlLmNsZWFya2V5LnJjIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEtc2VydmljZS5jbGVhcmtleS5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmU4NTZhCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEtc2VydmljZS5jbGVhcmtleS5yYwpAQCAtMCwwICsxLDYgQEAKK3NlcnZpY2UgdmVuZG9yLmRybS1jbGVhcmtleS1oYWwtMS0xIC92ZW5kb3IvYmluL2h3L2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMS1zZXJ2aWNlLmNsZWFya2V5CisgICAgY2xhc3MgaGFsCisgICAgdXNlciBtZWRpYQorICAgIGdyb3VwIG1lZGlhIG1lZGlhZHJtCisgICAgaW9wcmlvIHJ0IDQKKyAgICB3cml0ZXBpZCAvZGV2L2NwdXNldC9mb3JlZ3JvdW5kL3Rhc2tzCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQWVzQ3RyRGVjcnlwdG9yLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQWVzQ3RyRGVjcnlwdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM3ZWYyMAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9BZXNDdHJEZWNyeXB0b3IuaApAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDTEVBUktFWV9BRVNfQ1RSX0RFQ1JZUFRPUl9IXworI2RlZmluZSBDTEVBUktFWV9BRVNfQ1RSX0RFQ1JZUFRPUl9IXworCisjaW5jbHVkZSAiQ2xlYXJLZXlUeXBlcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN0YXR1czsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U3ViU2FtcGxlOworCitjbGFzcyBBZXNDdHJEZWNyeXB0b3IgeworcHVibGljOgorICAgIEFlc0N0ckRlY3J5cHRvcigpIHt9CisKKyAgICBTdGF0dXMgZGVjcnlwdChjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYga2V5LCBjb25zdCBJdiBpdiwKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNvdXJjZSwgdWludDhfdCogZGVzdGluYXRpb24sCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxTdWJTYW1wbGU+IHN1YlNhbXBsZXMsIHNpemVfdCBudW1TdWJTYW1wbGVzLAorICAgICAgICAgICAgc2l6ZV90KiBieXRlc0RlY3J5cHRlZE91dCk7CisKK3ByaXZhdGU6CisgICAgQ0xFQVJLRVlfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEFlc0N0ckRlY3J5cHRvcik7Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgZHJtCit9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQ0xFQVJLRVlfQUVTX0NUUl9ERUNSWVBUT1JfSF8KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9CYXNlNjQuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9CYXNlNjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTM4NWJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0Jhc2U2NC5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEJBU0VfNjRfSF8KKworI2RlZmluZSBCQVNFXzY0X0hfCisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvdHlwZXMuaD4KKworI2luY2x1ZGUgIkJ1ZmZlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCit1c2luZyA6OmFuZHJvaWQ6OnNwOworCitzdHJ1Y3QgQnVmZmVyOworCitzcDxCdWZmZXI+IGRlY29kZUJhc2U2NChjb25zdCBzdGQ6OnN0cmluZyAmcyk7Cit2b2lkIGVuY29kZUJhc2U2NChjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgc3RkOjpzdHJpbmcgKm91dCk7CisKK3ZvaWQgZW5jb2RlQmFzZTY0VXJsKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBzdGQ6OnN0cmluZyAqb3V0KTsKKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKK30gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIGRybQorfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBCQVNFXzY0X0hfCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQnVmZmVyLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJiYjI4YQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9CdWZmZXIuaApAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBCVUZGRVJfSF8KKyNkZWZpbmUgQlVGRkVSX0hfCisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKKyNpbmNsdWRlICJDbGVhcktleVR5cGVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgZHJtIHsKK25hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBjbGVhcmtleSB7CisKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3N0cnVjdCBCdWZmZXIgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgZXhwbGljaXQgQnVmZmVyKHNpemVfdCBjYXBhY2l0eSk7CisKKyAgICB1aW50OF90ICpiYXNlKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90ICo+KG1EYXRhKTsgfQorICAgIHVpbnQ4X3QgKmRhdGEoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4obURhdGEpICsgbVJhbmdlT2Zmc2V0OyB9CisgICAgc2l6ZV90IGNhcGFjaXR5KCkgY29uc3QgeyByZXR1cm4gbUNhcGFjaXR5OyB9CisgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBtUmFuZ2VMZW5ndGg7IH0KKyAgICBzaXplX3Qgb2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbVJhbmdlT2Zmc2V0OyB9CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5CdWZmZXIoKTsKKworcHJpdmF0ZToKKyAgICB2b2lkICptRGF0YTsKKyAgICBzaXplX3QgbUNhcGFjaXR5OworICAgIHNpemVfdCBtUmFuZ2VPZmZzZXQ7CisgICAgc2l6ZV90IG1SYW5nZUxlbmd0aDsKKworICAgIGJvb2wgbU93bnNEYXRhOworCisgICAgQ0xFQVJLRVlfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEJ1ZmZlcik7Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgZHJtCit9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEJVRkZFUl9IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NsZWFyS2V5RHJtUHJvcGVydGllcy5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NsZWFyS2V5RHJtUHJvcGVydGllcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NWIyNWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ2xlYXJLZXlEcm1Qcm9wZXJ0aWVzLmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ0xFQVJLRVlfRFJNX1BST1BFUlRJRVNfSF8KKyNkZWZpbmUgQ0xFQVJLRVlfRFJNX1BST1BFUlRJRVNfSF8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1ZlbmRvcktleSgidmVuZG9yIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1ZlbmRvclZhbHVlKCJHb29nbGUiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVmVyc2lvbktleSgidmVyc2lvbiIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtWZXJzaW9uVmFsdWUoIjEuMSIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtQbHVnaW5EZXNjcmlwdGlvbktleSgiZGVzY3JpcHRpb24iKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrUGx1Z2luRGVzY3JpcHRpb25WYWx1ZSgiQ2xlYXJLZXkgQ0RNIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0FsZ29yaXRobXNLZXkoImFsZ29yaXRobXMiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrQWxnb3JpdGhtc1ZhbHVlKCIiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrTGlzdGVuZXJUZXN0U3VwcG9ydEtleSgibGlzdGVuZXJUZXN0U3VwcG9ydCIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtMaXN0ZW5lclRlc3RTdXBwb3J0VmFsdWUoInRydWUiKTsKKworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtEZXZpY2VJZEtleSgiZGV2aWNlSWQiKTsKK3N0YXRpYyBjb25zdCB1aW50OF90IGtUZXN0RGV2aWNlSWREYXRhW10gPQorICAgICAgICB7MHgwLCAweDEsIDB4MiwgMHgzLCAweDQsIDB4NSwgMHg2LCAweDcsCisgICAgICAgICAweDgsIDB4OSwgMHhhLCAweGIsIDB4YywgMHhkLCAweGUsIDB4Zn07CisvLyBUT0RPIHN0dWIgb3V0IG1ldHJpY3MgZm9yIG53CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga01ldHJpY3NLZXkoIm1ldHJpY3MiKTsKK3N0YXRpYyBjb25zdCB1aW50OF90IGtNZXRyaWNzRGF0YVtdID0geyAwIH07CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5Cit9IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBkcm0KK30gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBDTEVBUktFWV9EUk1fUFJPUEVSVElFU19IXworCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ2xlYXJLZXlUeXBlcy5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NsZWFyS2V5VHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmNiNWU0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NsZWFyS2V5VHlwZXMuaApAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDTEVBUktFWV9NQUNST1NfSF8KKyNkZWZpbmUgQ0xFQVJLRVlfTUFDUk9TX0hfCisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvdHlwZXMuaD4KKworI2luY2x1ZGUgPG1hcD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBkcm0geworbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIGNsZWFya2V5IHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpLZXlWYWx1ZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOworCitjb25zdCB1aW50OF90IGtCbG9ja1NpemUgPSAxNjsgLy9BRVNfQkxPQ0tfU0laRTsKK3R5cGVkZWYgdWludDhfdCBLZXlJZFtrQmxvY2tTaXplXTsKK3R5cGVkZWYgdWludDhfdCBJdltrQmxvY2tTaXplXTsKKwordHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN1YlNhbXBsZSBTdWJTYW1wbGU7Cit0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBzdGQ6OnZlY3Rvcjx1aW50OF90PiA+IEtleU1hcDsKKworI2RlZmluZSBDTEVBUktFWV9ESVNBTExPV19DT1BZX0FORF9BU1NJR04oVHlwZU5hbWUpIFwKKyAgVHlwZU5hbWUoY29uc3QgVHlwZU5hbWUmKSA9IGRlbGV0ZTsgICAgICBcCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFR5cGVOYW1lJikgPSBkZWxldGU7CisKKyNkZWZpbmUgQ0xFQVJLRVlfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOX0FORF9ORVcoVHlwZU5hbWUpIFwKKyAgVHlwZU5hbWUoKSA9IGRlbGV0ZTsgICAgICAgICAgICAgICAgICAgICBcCisgIFR5cGVOYW1lKGNvbnN0IFR5cGVOYW1lJikgPSBkZWxldGU7ICAgICAgXAorICB2b2lkIG9wZXJhdG9yPShjb25zdCBUeXBlTmFtZSYpID0gZGVsZXRlOworCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgZHJtCit9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQ0xFQVJLRVlfTUFDUk9TX0hfCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk1MjAyNwotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuaApAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDTEVBUktFWV9DUkVBVEVfUExVR0lOX0ZBQ1RPUklFU19IXworI2RlZmluZSBDTEVBUktFWV9DUkVBVEVfUExVR0lOX0ZBQ1RPUklFU19IXworCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4xL0lDcnlwdG9GYWN0b3J5Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4xL0lEcm1GYWN0b3J5Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgZHJtIHsKK25hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBjbGVhcmtleSB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6SUNyeXB0b0ZhY3Rvcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OklEcm1GYWN0b3J5OworCitleHRlcm4gIkMiIHsKKyAgICBJRHJtRmFjdG9yeSogY3JlYXRlRHJtRmFjdG9yeSgpOworICAgIElDcnlwdG9GYWN0b3J5KiBjcmVhdGVDcnlwdG9GYWN0b3J5KCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAgLy8gbmFtZXNwYWNlIFYxXzEKK30gIC8vIG5hbWVzcGFjZSBkcm0KK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNlbmRpZiAvLyBDTEVBUktFWV9DUkVBVEVfUExVR0lOX0ZBQ1RPUklFU19IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NyeXB0b0ZhY3RvcnkuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcnlwdG9GYWN0b3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc1YWI3NgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcnlwdG9GYWN0b3J5LmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ0xFQVJLRVlfQ1JZUFRPX0ZBQ1RPUllfSF8KKyNkZWZpbmUgQ0xFQVJLRVlfQ1JZUFRPX0ZBQ1RPUllfSF8KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC9JQ3J5cHRvUGx1Z2luLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4xL0lDcnlwdG9GYWN0b3J5Lmg+CisKKyNpbmNsdWRlICJDbGVhcktleVR5cGVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgZHJtIHsKK25hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBjbGVhcmtleSB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6SUNyeXB0b0ZhY3Rvcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OklDcnlwdG9QbHVnaW47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47CisKK3N0cnVjdCBDcnlwdG9GYWN0b3J5IDogcHVibGljIElDcnlwdG9GYWN0b3J5IHsKKyAgICBDcnlwdG9GYWN0b3J5KCkge30KKyAgICB2aXJ0dWFsIH5DcnlwdG9GYWN0b3J5KCkge30KKworICAgIFJldHVybjxib29sPiBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCBoaWRsX2FycmF5PHVpbnQ4X3QsIDE2PiYgdXVpZCkKKyAgICAgICAgICAgIG92ZXJyaWRlOworCisgICAgUmV0dXJuPHZvaWQ+IGNyZWF0ZVBsdWdpbigKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfYXJyYXk8dWludDhfdCwgMTY+JiB1dWlkLAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGluaXREYXRhLAorICAgICAgICAgICAgY3JlYXRlUGx1Z2luX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBDTEVBUktFWV9ESVNBTExPV19DT1BZX0FORF9BU1NJR04oQ3J5cHRvRmFjdG9yeSk7CisKK307CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5Cit9IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBkcm0KK30gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBDTEVBUktFWV9DUllQVE9fRkFDVE9SWV9IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NyeXB0b1BsdWdpbi5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NyeXB0b1BsdWdpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNzM4MDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ3J5cHRvUGx1Z2luLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENMRUFSS0VZX0NSWVBUT19QTFVHSU5fSF8KKyNkZWZpbmUgQ0xFQVJLRVlfQ1JZUFRPX1BMVUdJTl9IXworCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL0lDcnlwdG9QbHVnaW4uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWVtb3J5LzEuMC9JTWVtb3J5Lmg+CisKKyNpbmNsdWRlICJDbGVhcktleVR5cGVzLmgiCisjaW5jbHVkZSAiU2Vzc2lvbi5oIgorI2luY2x1ZGUgIlV0aWxzLmgiCisKK25hbWVzcGFjZSB7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBLRVlfSURfU0laRSA9IDE2OworICAgIHN0YXRpYyBjb25zdCBzaXplX3QgS0VZX0lWX1NJWkUgPSAxNjsKK30KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBkcm0geworbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIGNsZWFya2V5IHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpEZXN0aW5hdGlvbkJ1ZmZlcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6SUNyeXB0b1BsdWdpbjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6TW9kZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6UGF0dGVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U2hhcmVkQnVmZmVyOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTdGF0dXM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN1YlNhbXBsZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpoaWRsOjptZW1vcnk6OlYxXzA6OklNZW1vcnk7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOworCitzdHJ1Y3QgQ3J5cHRvUGx1Z2luIDogcHVibGljIElDcnlwdG9QbHVnaW4geworICAgIGV4cGxpY2l0IENyeXB0b1BsdWdpbihjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkKSB7CisgICAgICAgIG1Jbml0U3RhdHVzID0gc2V0TWVkaWFEcm1TZXNzaW9uKHNlc3Npb25JZCk7CisgICAgfQorICAgIHZpcnR1YWwgfkNyeXB0b1BsdWdpbigpIHt9CisKKyAgICBSZXR1cm48Ym9vbD4gcmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50KGNvbnN0IGhpZGxfc3RyaW5nJiBtaW1lKSB7CisgICAgICAgIFVOVVNFRChtaW1lKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFJldHVybjx2b2lkPiBub3RpZnlSZXNvbHV0aW9uKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIHsKKyAgICAgICAgVU5VU0VEKHdpZHRoKTsKKyAgICAgICAgVU5VU0VEKGhlaWdodCk7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgUmV0dXJuPHZvaWQ+IGRlY3J5cHQoCisgICAgICAgICAgICBib29sIHNlY3VyZSwKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfYXJyYXk8dWludDhfdCwgS0VZX0lEX1NJWkU+JiBrZXlJZCwKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfYXJyYXk8dWludDhfdCwgS0VZX0lWX1NJWkU+JiBpdiwKKyAgICAgICAgICAgIE1vZGUgbW9kZSwKKyAgICAgICAgICAgIGNvbnN0IFBhdHRlcm4mIHBhdHRlcm4sCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxTdWJTYW1wbGU+JiBzdWJTYW1wbGVzLAorICAgICAgICAgICAgY29uc3QgU2hhcmVkQnVmZmVyJiBzb3VyY2UsCisgICAgICAgICAgICB1aW50NjRfdCBvZmZzZXQsCisgICAgICAgICAgICBjb25zdCBEZXN0aW5hdGlvbkJ1ZmZlciYgZGVzdGluYXRpb24sCisgICAgICAgICAgICBkZWNyeXB0X2NiIF9oaWRsX2NiKTsKKworICAgIFJldHVybjx2b2lkPiBzZXRTaGFyZWRCdWZmZXJCYXNlKGNvbnN0IGhpZGxfbWVtb3J5JiBiYXNlLAorICAgICAgICAgICAgdWludDMyX3QgYnVmZmVySWQpOworCisgICAgUmV0dXJuPFN0YXR1cz4gc2V0TWVkaWFEcm1TZXNzaW9uKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpOworCisgICAgUmV0dXJuPFN0YXR1cz4gZ2V0SW5pdFN0YXR1cygpIGNvbnN0IHsgcmV0dXJuIG1Jbml0U3RhdHVzOyB9CisKK3ByaXZhdGU6CisgICAgQ0xFQVJLRVlfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKENyeXB0b1BsdWdpbik7CisKKyAgICBzdGQ6Om1hcDx1aW50MzJfdCwgc3A8SU1lbW9yeT4gPiBtU2hhcmVkQnVmZmVyTWFwOworICAgIHNwPFNlc3Npb24+IG1TZXNzaW9uOworICAgIFN0YXR1cyBtSW5pdFN0YXR1czsKK307CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5Cit9IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBkcm0KK30gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBDTEVBUktFWV9DUllQVE9fUExVR0lOX0hfCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvRHJtRmFjdG9yeS5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RybUZhY3RvcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjU4MTk1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RybUZhY3RvcnkuaApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDTEVBUktFWV9EUk1fRkFDVE9SWV9IXworI2RlZmluZSBDTEVBUktFWV9EUk1fRkFDVE9SWV9IXworCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4xL0lEcm1QbHVnaW4uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvSURybUZhY3RvcnkuaD4KKworI2luY2x1ZGUgIkNsZWFyS2V5VHlwZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBkcm0geworbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIGNsZWFya2V5IHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOworCitzdHJ1Y3QgRHJtRmFjdG9yeSA6IHB1YmxpYyBJRHJtRmFjdG9yeSB7CisgICAgRHJtRmFjdG9yeSgpIHt9CisgICAgdmlydHVhbCB+RHJtRmFjdG9yeSgpIHt9CisKKyAgICBSZXR1cm48Ym9vbD4gaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgaGlkbF9hcnJheTx1aW50OF90LCAxNj4mIHV1aWQpCisgICAgICAgICAgICBvdmVycmlkZTsKKworICAgIFJldHVybjxib29sPiBpc0NvbnRlbnRUeXBlU3VwcG9ydGVkKGNvbnN0IGhpZGxfc3RyaW5nICZtaW1lVHlwZSkKKyAgICAgICAgICAgIG92ZXJyaWRlOworCisgICAgUmV0dXJuPHZvaWQ+IGNyZWF0ZVBsdWdpbigKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfYXJyYXk8dWludDhfdCwgMTY+JiB1dWlkLAorICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGFwcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgY3JlYXRlUGx1Z2luX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBDTEVBUktFWV9ESVNBTExPV19DT1BZX0FORF9BU1NJR04oRHJtRmFjdG9yeSk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgZHJtCit9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQ0xFQVJLRVlfRFJNX0ZBQ1RPUllfSF8KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Ecm1QbHVnaW4uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Ecm1QbHVnaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjA2OTVhCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RybVBsdWdpbi5oCkBAIC0wLDAgKzEsMzQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDTEVBUktFWV9EUk1fUExVR0lOX0hfCisjZGVmaW5lIENMRUFSS0VZX0RSTV9QTFVHSU5fSF8KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMS9JRHJtUGx1Z2luLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hcD4KKworI2luY2x1ZGUgIlNlc3Npb25MaWJyYXJ5LmgiCisjaW5jbHVkZSAiVXRpbHMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBkcm0geworbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIGNsZWFya2V5IHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpFdmVudFR5cGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OklEcm1QbHVnaW5MaXN0ZW5lcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6S2V5U3RhdHVzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpLZXlUeXBlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpLZXlWYWx1ZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U2VjdXJlU3RvcDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U2VjdXJlU3RvcElkOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTZXNzaW9uSWQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN0YXR1czsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6RHJtTWV0cmljR3JvdXA7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OklEcm1QbHVnaW47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OktleVJlcXVlc3RUeXBlOworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3N0cnVjdCBEcm1QbHVnaW4gOiBwdWJsaWMgSURybVBsdWdpbiB7CisgICAgZXhwbGljaXQgRHJtUGx1Z2luKFNlc3Npb25MaWJyYXJ5KiBzZXNzaW9uTGlicmFyeSk7CisKKyAgICB2aXJ0dWFsIH5Ecm1QbHVnaW4oKSB7fQorCisgICAgUmV0dXJuPHZvaWQ+IG9wZW5TZXNzaW9uKG9wZW5TZXNzaW9uX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKyAgICBSZXR1cm48dm9pZD4gb3BlblNlc3Npb25fMV8xKFNlY3VyaXR5TGV2ZWwgc2VjdXJpdHlMZXZlbCwKKyAgICAgICAgICAgIG9wZW5TZXNzaW9uX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIFJldHVybjxTdGF0dXM+IGNsb3NlU2Vzc2lvbihjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkKSBvdmVycmlkZTsKKworICAgIFJldHVybjx2b2lkPiBnZXRLZXlSZXF1ZXN0KAorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2NvcGUsCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBpbml0RGF0YSwKKyAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG1pbWVUeXBlLAorICAgICAgICBLZXlUeXBlIGtleVR5cGUsCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPEtleVZhbHVlPiYgb3B0aW9uYWxQYXJhbWV0ZXJzLAorICAgICAgICBnZXRLZXlSZXF1ZXN0X2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIFJldHVybjx2b2lkPiBnZXRLZXlSZXF1ZXN0XzFfMSgKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNjb3BlLAorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaW5pdERhdGEsCisgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBtaW1lVHlwZSwKKyAgICAgICAgS2V5VHlwZSBrZXlUeXBlLAorICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlWYWx1ZT4mIG9wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgICAgZ2V0S2V5UmVxdWVzdF8xXzFfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgUmV0dXJuPHZvaWQ+IHByb3ZpZGVLZXlSZXNwb25zZSgKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNjb3BlLAorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgcmVzcG9uc2UsCisgICAgICAgIHByb3ZpZGVLZXlSZXNwb25zZV9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICBSZXR1cm48U3RhdHVzPiByZW1vdmVLZXlzKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpIHsKKyAgICAgICAgaWYgKHNlc3Npb25JZC5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6QkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIFJldHVybjxTdGF0dXM+IHJlc3RvcmVLZXlzKAorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYga2V5U2V0SWQpIHsKKworICAgICAgICBpZiAoc2Vzc2lvbklkLnNpemUoKSA9PSAwIHx8IGtleVNldElkLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgUmV0dXJuPHZvaWQ+IHF1ZXJ5S2V5U3RhdHVzKAorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgICAgICBxdWVyeUtleVN0YXR1c19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICBSZXR1cm48dm9pZD4gZ2V0UHJvdmlzaW9uUmVxdWVzdCgKKyAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGNlcnRpZmljYXRlVHlwZSwKKyAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGNlcnRpZmljYXRlQXV0aG9yaXR5LAorICAgICAgICBnZXRQcm92aXNpb25SZXF1ZXN0X2NiIF9oaWRsX2NiKSB7CisgICAgICAgIFVOVVNFRChjZXJ0aWZpY2F0ZVR5cGUpOworICAgICAgICBVTlVTRUQoY2VydGlmaWNhdGVBdXRob3JpdHkpOworCisgICAgICAgIGhpZGxfc3RyaW5nIGRlZmF1bHRVcmw7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIGhpZGxfdmVjPHVpbnQ4X3Q+KCksIGRlZmF1bHRVcmwpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIFJldHVybjx2b2lkPiBwcm92aWRlUHJvdmlzaW9uUmVzcG9uc2UoCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiByZXNwb25zZSwKKyAgICAgICAgcHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlX2NiIF9oaWRsX2NiKSB7CisKKyAgICAgICAgaWYgKHJlc3BvbnNlLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkJBRF9WQUxVRSwgaGlkbF92ZWM8dWludDhfdD4oKSwgaGlkbF92ZWM8dWludDhfdD4oKSk7CisgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICB9CisgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIGhpZGxfdmVjPHVpbnQ4X3Q+KCksIGhpZGxfdmVjPHVpbnQ4X3Q+KCkpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIFJldHVybjx2b2lkPiBnZXRIZGNwTGV2ZWxzKGdldEhkY3BMZXZlbHNfY2IgX2hpZGxfY2IpIHsKKyAgICAgICAgSGRjcExldmVsIGNvbm5lY3RlZExldmVsID0gSGRjcExldmVsOjpIRENQX05PTkU7CisgICAgICAgIEhkY3BMZXZlbCBtYXhMZXZlbCA9IEhkY3BMZXZlbDo6SERDUF9OT19PVVRQVVQ7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6T0ssIGNvbm5lY3RlZExldmVsLCBtYXhMZXZlbCk7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgUmV0dXJuPHZvaWQ+IGdldE51bWJlck9mU2Vzc2lvbnMoZ2V0TnVtYmVyT2ZTZXNzaW9uc19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICBSZXR1cm48dm9pZD4gZ2V0U2VjdXJpdHlMZXZlbChjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgICAgICAgICAgZ2V0U2VjdXJpdHlMZXZlbF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICBSZXR1cm48dm9pZD4gZ2V0TWV0cmljcyhnZXRNZXRyaWNzX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIFJldHVybjx2b2lkPiBnZXRQcm9wZXJ0eVN0cmluZygKKyAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG5hbWUsCisgICAgICAgIGdldFByb3BlcnR5U3RyaW5nX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIFJldHVybjx2b2lkPiBnZXRQcm9wZXJ0eUJ5dGVBcnJheSgKKyAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG5hbWUsCisgICAgICAgIGdldFByb3BlcnR5Qnl0ZUFycmF5X2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIFJldHVybjxTdGF0dXM+IHNldFByb3BlcnR5U3RyaW5nKAorICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG5hbWUsIGNvbnN0IGhpZGxfc3RyaW5nJiB2YWx1ZSkgb3ZlcnJpZGU7CisKKyAgICBSZXR1cm48U3RhdHVzPiBzZXRQcm9wZXJ0eUJ5dGVBcnJheSgKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBuYW1lLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgdmFsdWUpIG92ZXJyaWRlOworCisgICAgUmV0dXJuPFN0YXR1cz4gc2V0Q2lwaGVyQWxnb3JpdGhtKAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwgY29uc3QgaGlkbF9zdHJpbmcmIGFsZ29yaXRobSkgeworICAgICAgICBpZiAoc2Vzc2lvbklkLnNpemUoKSA9PSAwIHx8IGFsZ29yaXRobS5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6QkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIFJldHVybjxTdGF0dXM+IHNldE1hY0FsZ29yaXRobSgKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsIGNvbnN0IGhpZGxfc3RyaW5nJiBhbGdvcml0aG0pIHsKKyAgICAgICAgaWYgKHNlc3Npb25JZC5zaXplKCkgPT0gMCB8fCBhbGdvcml0aG0uc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OkJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICBSZXR1cm48dm9pZD4gZW5jcnlwdCgKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYga2V5SWQsCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaW5wdXQsCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaXYsCisgICAgICAgICAgICBlbmNyeXB0X2NiIF9oaWRsX2NiKSB7CisgICAgICAgIGlmIChzZXNzaW9uSWQuc2l6ZSgpID09IDAgfHwga2V5SWQuc2l6ZSgpID09IDAgfHwKKyAgICAgICAgICAgICAgICBpbnB1dC5zaXplKCkgPT0gMCB8fCBpdi5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpCQURfVkFMVUUsIGhpZGxfdmVjPHVpbnQ4X3Q+KCkpOworICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICAgICAgfQorICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCBoaWRsX3ZlYzx1aW50OF90PigpKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICBSZXR1cm48dm9pZD4gZGVjcnlwdCgKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYga2V5SWQsCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaW5wdXQsCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaXYsCisgICAgICAgICAgICBkZWNyeXB0X2NiIF9oaWRsX2NiKSB7CisgICAgICAgIGlmIChzZXNzaW9uSWQuc2l6ZSgpID09IDAgfHwga2V5SWQuc2l6ZSgpID09IDAgfHwKKyAgICAgICAgICAgICAgICBpbnB1dC5zaXplKCkgPT0gMCB8fCBpdi5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpCQURfVkFMVUUsIGhpZGxfdmVjPHVpbnQ4X3Q+KCkpOworICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICAgICAgfQorICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCBoaWRsX3ZlYzx1aW50OF90PigpKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICBSZXR1cm48dm9pZD4gc2lnbigKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYga2V5SWQsCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgbWVzc2FnZSwKKyAgICAgICAgICAgIHNpZ25fY2IgX2hpZGxfY2IpIHsKKyAgICAgICAgaWYgKHNlc3Npb25JZC5zaXplKCkgPT0gMCB8fCBrZXlJZC5zaXplKCkgPT0gMCB8fAorICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6QkFEX1ZBTFVFLCBoaWRsX3ZlYzx1aW50OF90PigpKTsKKyAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgICAgIH0KKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgaGlkbF92ZWM8dWludDhfdD4oKSk7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgUmV0dXJuPHZvaWQ+IHZlcmlmeSgKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYga2V5SWQsCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgbWVzc2FnZSwKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzaWduYXR1cmUsCisgICAgICAgICAgICB2ZXJpZnlfY2IgX2hpZGxfY2IpIHsKKworICAgICAgICBpZiAoc2Vzc2lvbklkLnNpemUoKSA9PSAwIHx8IGtleUlkLnNpemUoKSA9PSAwIHx8CisgICAgICAgICAgICAgICAgbWVzc2FnZS5zaXplKCkgPT0gMCB8fCBzaWduYXR1cmUuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6QkFEX1ZBTFVFLCBmYWxzZSk7CisgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICB9CisgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICBSZXR1cm48dm9pZD4gc2lnblJTQSgKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgYWxnb3JpdGhtLAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIG1lc3NhZ2UsCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgd3JhcHBlZEtleSwKKyAgICAgICAgICAgIHNpZ25SU0FfY2IgX2hpZGxfY2IpIHsKKyAgICAgICAgaWYgKHNlc3Npb25JZC5zaXplKCkgPT0gMCB8fCBhbGdvcml0aG0uc2l6ZSgpID09IDAgfHwKKyAgICAgICAgICAgICAgICBtZXNzYWdlLnNpemUoKSA9PSAwIHx8IHdyYXBwZWRLZXkuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkJBRF9WQUxVRSwgaGlkbF92ZWM8dWludDhfdD4oKSk7CisgICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICAgICAgIH0KKyAgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIGhpZGxfdmVjPHVpbnQ4X3Q+KCkpOworICAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICBSZXR1cm48dm9pZD4gc2V0TGlzdGVuZXIoY29uc3Qgc3A8SURybVBsdWdpbkxpc3RlbmVyPiYgbGlzdGVuZXIpIHsKKyAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfTsKKworICAgIFJldHVybjx2b2lkPiBzZW5kRXZlbnQoRXZlbnRUeXBlIGV2ZW50VHlwZSwgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBkYXRhKSB7CisgICAgICAgIGlmIChtTGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgbUxpc3RlbmVyLT5zZW5kRXZlbnQoZXZlbnRUeXBlLCBzZXNzaW9uSWQsIGRhdGEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIk51bGwgZXZlbnQgbGlzdGVuZXIsIGV2ZW50IG5vdCBzZW50Iik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICBSZXR1cm48dm9pZD4gc2VuZEV4cGlyYXRpb25VcGRhdGUoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwgaW50NjRfdCBleHBpcnlUaW1lSW5NUykgeworICAgICAgICBpZiAobUxpc3RlbmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lci0+c2VuZEV4cGlyYXRpb25VcGRhdGUoc2Vzc2lvbklkLCBleHBpcnlUaW1lSW5NUyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiTnVsbCBldmVudCBsaXN0ZW5lciwgZXZlbnQgbm90IHNlbnQiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIFJldHVybjx2b2lkPiBzZW5kS2V5c0NoYW5nZShjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8S2V5U3RhdHVzPiYga2V5U3RhdHVzTGlzdCwgYm9vbCBoYXNOZXdVc2FibGVLZXkpIHsKKyAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBOVUxMKSB7CisgICAgICAgICAgICBtTGlzdGVuZXItPnNlbmRLZXlzQ2hhbmdlKHNlc3Npb25JZCwga2V5U3RhdHVzTGlzdCwgaGFzTmV3VXNhYmxlS2V5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJOdWxsIGV2ZW50IGxpc3RlbmVyLCBldmVudCBub3Qgc2VudCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgUmV0dXJuPHZvaWQ+IGdldFNlY3VyZVN0b3BzKGdldFNlY3VyZVN0b3BzX2NiIF9oaWRsX2NiKTsKKworICAgIFJldHVybjx2b2lkPiBnZXRTZWN1cmVTdG9wKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZWN1cmVTdG9wSWQsCisgICAgICAgICAgICBnZXRTZWN1cmVTdG9wX2NiIF9oaWRsX2NiKTsKKworICAgIFJldHVybjxTdGF0dXM+IHJlbGVhc2VTZWN1cmVTdG9wKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzc1JlbGVhc2UpOworCisgICAgUmV0dXJuPFN0YXR1cz4gcmVsZWFzZUFsbFNlY3VyZVN0b3BzKCk7CisKKyAgICBSZXR1cm48dm9pZD4gZ2V0U2VjdXJlU3RvcElkcyhnZXRTZWN1cmVTdG9wSWRzX2NiIF9oaWRsX2NiKTsKKworICAgIFJldHVybjxTdGF0dXM+IHJlbGVhc2VTZWN1cmVTdG9wcyhjb25zdCBTZWN1cmVTdG9wUmVsZWFzZSYgc3NSZWxlYXNlKTsKKworICAgIFJldHVybjxTdGF0dXM+IHJlbW92ZVNlY3VyZVN0b3AoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlY3VyZVN0b3BJZCk7CisKKyAgICBSZXR1cm48U3RhdHVzPiByZW1vdmVBbGxTZWN1cmVTdG9wcygpOworCitwcml2YXRlOgorICAgIHZvaWQgaW5pdFByb3BlcnRpZXMoKTsKKyAgICB2b2lkIGluc3RhbGxTZWN1cmVTdG9wKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpOworICAgIHZvaWQgc2V0UGxheVBvbGljeSgpOworCisgICAgUmV0dXJuPFN0YXR1cz4gc2V0U2VjdXJpdHlMZXZlbChjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgICAgICAgICAgU2VjdXJpdHlMZXZlbCBsZXZlbCk7CisKKyAgICBTdGF0dXMgZ2V0S2V5UmVxdWVzdENvbW1vbihjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2NvcGUsCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaW5pdERhdGEsCisgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbWltZVR5cGUsCisgICAgICAgICAgICBLZXlUeXBlIGtleVR5cGUsCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlWYWx1ZT4mIG9wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICpyZXF1ZXN0LAorICAgICAgICAgICAgS2V5UmVxdWVzdFR5cGUgKmdldEtleVJlcXVlc3RUeXBlLAorICAgICAgICAgICAgc3RkOjpzdHJpbmcgKmRlZmF1bHRVcmwpOworCisgICAgc3RydWN0IENsZWFya2V5U2VjdXJlU3RvcCB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGlkOworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhOworICAgIH07CisKKyAgICBzdGQ6Om1hcDxzdGQ6OnZlY3Rvcjx1aW50OF90PiwgQ2xlYXJrZXlTZWN1cmVTdG9wPiBtU2VjdXJlU3RvcHM7CisgICAgc3RkOjp2ZWN0b3I8S2V5VmFsdWU+IG1QbGF5UG9saWN5OworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gbVN0cmluZ1Byb3BlcnRpZXM7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ID4gbUJ5dGVBcnJheVByb3BlcnRpZXM7CisgICAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIFNlY3VyaXR5TGV2ZWw+IG1TZWN1cml0eUxldmVsOworICAgIHNwPElEcm1QbHVnaW5MaXN0ZW5lcj4gbUxpc3RlbmVyOworICAgIFNlc3Npb25MaWJyYXJ5ICptU2Vzc2lvbkxpYnJhcnk7CisgICAgaW50NjRfdCBtT3BlblNlc3Npb25Pa0NvdW50OworICAgIGludDY0X3QgbUNsb3NlU2Vzc2lvbk9rQ291bnQ7CisgICAgaW50NjRfdCBtQ2xvc2VTZXNzaW9uTm90T3BlbmVkQ291bnQ7CisgICAgdWludDMyX3QgbU5leHRTZWN1cmVTdG9wSWQ7CisKKyAgICBDTEVBUktFWV9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fQU5EX05FVyhEcm1QbHVnaW4pOworfTsKKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKK30gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIGRybQorfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIENMRUFSS0VZX0RSTV9QTFVHSU5fSF8KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Jbml0RGF0YVBhcnNlci5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0luaXREYXRhUGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE4OWM0YQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Jbml0RGF0YVBhcnNlci5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENMRUFSS0VZX0lOSVRfREFUQV9QQVJTRVJfSF8KKyNkZWZpbmUgQ0xFQVJLRVlfSU5JVF9EQVRBX1BBUlNFUl9IXworCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL3R5cGVzLmg+CisKKyNpbmNsdWRlICJDbGVhcktleVR5cGVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgZHJtIHsKK25hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBjbGVhcmtleSB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U3RhdHVzOworCitjbGFzcyBJbml0RGF0YVBhcnNlciB7CitwdWJsaWM6CisgICAgSW5pdERhdGFQYXJzZXIoKSB7fQorCisgICAgU3RhdHVzIHBhcnNlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4qIGxpY2Vuc2VSZXF1ZXN0KTsKKworcHJpdmF0ZToKKyAgICBDTEVBUktFWV9ESVNBTExPV19DT1BZX0FORF9BU1NJR04oSW5pdERhdGFQYXJzZXIpOworCisgICAgU3RhdHVzIHBhcnNlUHNzaChjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5pdERhdGEsCisgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCB1aW50OF90Kj4qIGtleUlkcyk7CisKKyAgICBzdGQ6OnN0cmluZyBnZW5lcmF0ZVJlcXVlc3QoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCB1aW50OF90Kj4mIGtleUlkcyk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgZHJtCit9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQ0xFQVJLRVlfSU5JVF9EQVRBX1BBUlNFUl9IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0pzb25XZWJLZXkuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Kc29uV2ViS2V5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFiMDM0YwotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Kc29uV2ViS2V5LmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIENMRUFSS0VZX0pTT05fV0VCX0tFWV9IXworI2RlZmluZSBDTEVBUktFWV9KU09OX1dFQl9LRVlfSF8KKworI2luY2x1ZGUgImpzbW4uaCIKKyNpbmNsdWRlICJVdGlscy5oIgorI2luY2x1ZGUgIkNsZWFyS2V5VHlwZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBkcm0geworbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIGNsZWFya2V5IHsKKworY2xhc3MgSnNvbldlYktleSB7CisgcHVibGljOgorICAgIEpzb25XZWJLZXkoKTsKKyAgICB2aXJ0dWFsIH5Kc29uV2ViS2V5KCk7CisKKyAgICBib29sIGV4dHJhY3RLZXlzRnJvbUpzb25XZWJLZXlTZXQoY29uc3Qgc3RkOjpzdHJpbmcmIGpzb25XZWJLZXlTZXQsCisgICAgICAgICAgICBLZXlNYXAqIGtleXMpOworCisgcHJpdmF0ZToKKyAgICBzdGQ6OnZlY3Rvcjxqc21udG9rX3Q+IG1Kc21uVG9rZW5zOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtSnNvbk9iamVjdHM7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1Ub2tlbnM7CisKKyAgICBib29sIGRlY29kZUJhc2U2NFN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgZW5jb2RlZFRleHQsCisgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiogZGVjb2RlZFRleHQpOworICAgIGJvb2wgZmluZEtleShjb25zdCBzdGQ6OnN0cmluZyYganNvbk9iamVjdCwgc3RkOjpzdHJpbmcqIGtleUlkLAorICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGVuY29kZWRLZXkpOworICAgIHZvaWQgZmluZFZhbHVlKGNvbnN0IHN0ZDo6c3RyaW5nICZrZXksIHN0ZDo6c3RyaW5nKiB2YWx1ZSk7CisgICAgYm9vbCBpc0pzb25XZWJLZXlTZXQoY29uc3Qgc3RkOjpzdHJpbmcmIGpzb25PYmplY3QpIGNvbnN0OworICAgIGJvb2wgcGFyc2VKc29uT2JqZWN0KGNvbnN0IHN0ZDo6c3RyaW5nJiBqc29uT2JqZWN0LAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiB0b2tlbnMpOworICAgIGJvb2wgcGFyc2VKc29uV2ViS2V5U2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBqc29uV2ViS2V5U2V0LAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBqc29uT2JqZWN0cyk7CisKKyAgICBDTEVBUktFWV9ESVNBTExPV19DT1BZX0FORF9BU1NJR04oSnNvbldlYktleSk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgZHJtCit9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENMRUFSS0VZX0pTT05fV0VCX0tFWV9IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1Nlc3Npb24uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9TZXNzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RkZmNhNQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9TZXNzaW9uLmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ0xFQVJLRVlfU0VTU0lPTl9IXworI2RlZmluZSBDTEVBUktFWV9TRVNTSU9OX0hfCisKKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJDbGVhcktleVR5cGVzLmgiCisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBkcm0geworbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIGNsZWFya2V5IHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTdGF0dXM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN1YlNhbXBsZTsKKworY2xhc3MgU2Vzc2lvbiA6IHB1YmxpYyBSZWZCYXNlIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBTZXNzaW9uKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpCisgICAgICAgICAgICA6IG1TZXNzaW9uSWQoc2Vzc2lvbklkKSB7fQorICAgIHZpcnR1YWwgflNlc3Npb24oKSB7fQorCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCgpIGNvbnN0IHsgcmV0dXJuIG1TZXNzaW9uSWQ7IH0KKworICAgIFN0YXR1cyBnZXRLZXlSZXF1ZXN0KAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIG1pbWVUeXBlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGluaXREYXRhVHlwZSwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBrZXlSZXF1ZXN0KSBjb25zdDsKKworICAgIFN0YXR1cyBwcm92aWRlS2V5UmVzcG9uc2UoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcmVzcG9uc2UpOworCisgICAgU3RhdHVzIGRlY3J5cHQoCisgICAgICAgICAgICBjb25zdCBLZXlJZCBrZXlJZCwgY29uc3QgSXYgaXYsIGNvbnN0IHVpbnQ4X3QqIHNyY1B0ciwKKyAgICAgICAgICAgIHVpbnQ4X3QqIGRzdFB0ciwgY29uc3Qgc3RkOjp2ZWN0b3I8U3ViU2FtcGxlPiBzdWJTYW1wbGVzLAorICAgICAgICAgICAgc2l6ZV90KiBieXRlc0RlY3J5cHRlZE91dCk7CisKK3ByaXZhdGU6CisgICAgQ0xFQVJLRVlfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFNlc3Npb24pOworCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gbVNlc3Npb25JZDsKKyAgICBLZXlNYXAgbUtleU1hcDsKKyAgICBNdXRleCBtTWFwTG9jazsKK307CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5Cit9IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBkcm0KK30gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBDTEVBUktFWV9TRVNTSU9OX0hfCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvU2Vzc2lvbkxpYnJhcnkuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9TZXNzaW9uTGlicmFyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNmEwYzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvU2Vzc2lvbkxpYnJhcnkuaApAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDTEVBUktFWV9TRVNTSU9OX0xJQlJBUllfSF8KKyNkZWZpbmUgQ0xFQVJLRVlfU0VTU0lPTl9MSUJSQVJZX0hfCisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKworI2luY2x1ZGUgIkNsZWFyS2V5VHlwZXMuaCIKKyNpbmNsdWRlICJTZXNzaW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgZHJtIHsKK25hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBjbGVhcmtleSB7CisKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK2NsYXNzIFNlc3Npb25MaWJyYXJ5IDogcHVibGljIFJlZkJhc2UgeworcHVibGljOgorICAgIHN0YXRpYyBTZXNzaW9uTGlicmFyeSogZ2V0KCk7CisKKyAgICBzcDxTZXNzaW9uPiBjcmVhdGVTZXNzaW9uKCk7CisKKyAgICBzcDxTZXNzaW9uPiBmaW5kU2Vzc2lvbigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpOworCisgICAgdm9pZCBkZXN0cm95U2Vzc2lvbihjb25zdCBzcDxTZXNzaW9uPiYgc2Vzc2lvbik7CisKKyAgICBzaXplX3QgbnVtT3BlblNlc3Npb25zKCkgY29uc3QgeyByZXR1cm4gbVNlc3Npb25zLnNpemUoKTsgfQorCitwcml2YXRlOgorICAgIENMRUFSS0VZX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihTZXNzaW9uTGlicmFyeSk7CisKKyAgICBTZXNzaW9uTGlicmFyeSgpIDogbU5leHRTZXNzaW9uSWQoMSkge30KKworICAgIHN0YXRpYyBNdXRleCBzU2luZ2xldG9uTG9jazsKKyAgICBzdGF0aWMgU2Vzc2lvbkxpYnJhcnkqIHNTaW5nbGV0b247CisKKyAgICBNdXRleCBtU2Vzc2lvbnNMb2NrOworICAgIHVpbnQzMl90IG1OZXh0U2Vzc2lvbklkOworICAgIHN0ZDo6bWFwPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBzcDxTZXNzaW9uPiA+IG1TZXNzaW9uczsKK307CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5Cit9IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBkcm0KK30gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBDTEVBUktFWV9TRVNTSU9OX0xJQlJBUllfSF8KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9UeXBlQ29udmVydC5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1R5cGVDb252ZXJ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MwNjMyOQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9UeXBlQ29udmVydC5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENMRUFSS0VZX0FORFJPSURfSEFSRFdBUkVfRFJNX1YxXzFfVFlQRUNPTlZFUlQKKyNkZWZpbmUgQ0xFQVJLRVlfQU5EUk9JRF9IQVJEV0FSRV9EUk1fVjFfMV9UWVBFQ09OVkVSVAorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL3R5cGVzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgZHJtIHsKK25hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBjbGVhcmtleSB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gY29uc3QgaGlkbF92ZWM8VD4gdG9IaWRsVmVjKGNvbnN0IHN0ZDo6dmVjdG9yPFQ+ICZ2ZWMpIHsKKyAgICBoaWRsX3ZlYzxUPiBoVmVjOworICAgIGhWZWMuc2V0VG9FeHRlcm5hbChjb25zdF9jYXN0PFQgKj4odmVjLmRhdGEoKSksIHZlYy5zaXplKCkpOworICAgIHJldHVybiBoVmVjOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBoaWRsX3ZlYzxUPiB0b0hpZGxWZWMoc3RkOjp2ZWN0b3I8VD4gJnZlYykgeworICAgIGhpZGxfdmVjPFQ+IGhWZWM7CisgICAgaFZlYy5zZXRUb0V4dGVybmFsKHZlYy5kYXRhKCksIHZlYy5zaXplKCkpOworICAgIHJldHVybiBoVmVjOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjb25zdCBzdGQ6OnZlY3RvcjxUPiB0b1ZlY3Rvcihjb25zdCBoaWRsX3ZlYzxUPiAmaFZlYykgeworICAgIHN0ZDo6dmVjdG9yPFQ+IHZlYzsKKyAgICB2ZWMuYXNzaWduKGhWZWMuZGF0YSgpLCBoVmVjLmRhdGEoKSArIGhWZWMuc2l6ZSgpKTsKKyAgICByZXR1cm4gKmNvbnN0X2Nhc3Q8Y29uc3Qgc3RkOjp2ZWN0b3I8VD4gKj4oJnZlYyk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0ZDo6dmVjdG9yPFQ+IHRvVmVjdG9yKGhpZGxfdmVjPFQ+ICZoVmVjKSB7CisgICAgc3RkOjp2ZWN0b3I8VD4gdmVjOworICAgIHZlYy5hc3NpZ24oaFZlYy5kYXRhKCksIGhWZWMuZGF0YSgpICsgaFZlYy5zaXplKCkpOworICAgIHJldHVybiB2ZWM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHNpemVfdCBTSVpFPiBjb25zdCBzdGQ6OnZlY3RvcjxUPiB0b1ZlY3RvcigKKyAgICAgICAgY29uc3QgaGlkbF9hcnJheTxULCBTSVpFPiAmaEFycmF5KSB7CisgICAgc3RkOjp2ZWN0b3I8VD4gdmVjOworICAgIHZlYy5hc3NpZ24oaEFycmF5LmRhdGEoKSwgaEFycmF5LmRhdGEoKSArIGhBcnJheS5zaXplKCkpOworICAgIHJldHVybiB2ZWM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHNpemVfdCBTSVpFPiBzdGQ6OnZlY3RvcjxUPiB0b1ZlY3RvcigKKyAgICAgICAgaGlkbF9hcnJheTxULCBTSVpFPiAmaEFycmF5KSB7CisgICAgc3RkOjp2ZWN0b3I8VD4gdmVjOworICAgIHZlYy5hc3NpZ24oaEFycmF5LmRhdGEoKSwgaEFycmF5LmRhdGEoKSArIGhBcnJheS5zaXplKCkpOworICAgIHJldHVybiB2ZWM7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAgLy8gbmFtZXNwYWNlIFYxXzEKK30gIC8vIG5hbWVzcGFjZSBkcm0KK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIENMRUFSS0VZX0FORFJPSURfSEFSRFdBUkVfRFJNX1YxXzFfVFlQRUNPTlZFUlQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvc2VydmljZS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL3NlcnZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhOTdiNzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL3NlcnZpY2UuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjZGVmaW5lIExPR19UQUcgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMS1zZXJ2aWNlLmNsZWFya2V5IgorCisjaW5jbHVkZSA8Q3J5cHRvRmFjdG9yeS5oPgorI2luY2x1ZGUgPERybUZhY3RvcnkuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29uZmlndXJlUnBjVGhyZWFkcG9vbDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmpvaW5ScGNUaHJlYWRwb29sOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6SUNyeXB0b0ZhY3Rvcnk7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8xOjpJRHJtRmFjdG9yeTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OmNsZWFya2V5OjpDcnlwdG9GYWN0b3J5OwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6Y2xlYXJrZXk6OkRybUZhY3Rvcnk7CisKKworaW50IG1haW4oaW50IC8qIGFyZ2MgKi8sIGNoYXIqKiAvKiBhcmd2ICovKSB7CisgICAgQUxPR0QoImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMS1zZXJ2aWNlLmNsZWFya2V5IHN0YXJ0aW5nLi4uIik7CisKKyAgICAvLyBUaGUgRFJNIEhBTCBtYXkgY29tbXVuaWNhdGUgdG8gb3RoZXIgdmVuZG9yIGNvbXBvbmVudHMgdmlhCisgICAgLy8gL2Rldi92bmRiaW5kZXIKKyAgICBhbmRyb2lkOjpQcm9jZXNzU3RhdGU6OmluaXRXaXRoRHJpdmVyKCIvZGV2L3ZuZGJpbmRlciIpOworCisgICAgc3A8SURybUZhY3Rvcnk+IGRybUZhY3RvcnkgPSBuZXcgRHJtRmFjdG9yeTsKKyAgICBzcDxJQ3J5cHRvRmFjdG9yeT4gY3J5cHRvRmFjdG9yeSA9IG5ldyBDcnlwdG9GYWN0b3J5OworCisgICAgY29uZmlndXJlUnBjVGhyZWFkcG9vbCg4LCB0cnVlIC8qIGNhbGxlcldpbGxKb2luICovKTsKKworICAgIC8vIFNldHVwIGh3YmluZGVyIHNlcnZpY2UKKyAgICBDSEVDS19FUShkcm1GYWN0b3J5LT5yZWdpc3RlckFzU2VydmljZSgiY2xlYXJrZXkiKSwgYW5kcm9pZDo6Tk9fRVJST1IpCisgICAgICAgIDw8ICJGYWlsZWQgdG8gcmVnaXN0ZXIgQ2xlYXJrZXkgRmFjdG9yeSBIQUwiOworICAgIENIRUNLX0VRKGNyeXB0b0ZhY3RvcnktPnJlZ2lzdGVyQXNTZXJ2aWNlKCJjbGVhcmtleSIpLCBhbmRyb2lkOjpOT19FUlJPUikKKyAgICAgICAgPDwgIkZhaWxlZCB0byByZWdpc3RlciBDbGVhcmtleSBDcnlwdG8gIEhBTCI7CisKKyAgICBqb2luUnBjVGhyZWFkcG9vbCgpOworfQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvQW5kcm9pZC5icCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmY2ZjNjQuLjAwMDAwMDAKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8vCi0vLyBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBCdWlsZHMgQ2xlYXJLZXkgRHJtIFRlc3RzCi0vLwotCi1jY190ZXN0IHsKLSAgICBuYW1lOiAiQ2xlYXJLZXlEcm1Vbml0VGVzdCIsCi0gICAgdmVuZG9yOiB0cnVlLAotCi0gICAgc3JjczogWwotICAgICAgICAiQWVzQ3RyRGVjcnlwdG9yVW5pdHRlc3QuY3BwIiwKLSAgICAgICAgIkluaXREYXRhUGFyc2VyVW5pdHRlc3QuY3BwIiwKLSAgICAgICAgIkpzb25XZWJLZXlVbml0dGVzdC5jcHAiLAotICAgIF0sCi0KLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliY3J5cHRvIiwKLSAgICAgICAgImxpYmRybWNsZWFya2V5cGx1Z2luIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICBdLAotICAgIGhlYWRlcl9saWJzOiBbIm1lZGlhX3BsdWdpbl9oZWFkZXJzIl0sCi19CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9tb2NrL0FuZHJvaWQuYnAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9tb2NrL0FuZHJvaWQuYnAKaW5kZXggYWJkMTg4NC4uZGQyYWQ3YiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvbW9jay9BbmRyb2lkLmJwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL21vY2svQW5kcm9pZC5icApAQCAtMzIsNSArMzIsNyBAQAogICAgIGNmbGFnczogWwogICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBmbGFnIHRvIGVuYWJsZSB0aGUgZGVjcnlwdGlvbiBwYXNzdGhydSBmbG93CiAgICAgICAgIC8vIi1ERU5BQkxFX1BBU1NUSFJVX0RFQ1JZUFRJT04iLAorICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCiAgICAgXSwKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvT1dORVJTIGIvaW5jbHVkZS9PV05FUlMKaW5kZXggM2NiNmQ5Yy4uZDZiZDk5OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9PV05FUlMKKysrIGIvaW5jbHVkZS9PV05FUlMKQEAgLTEsNSArMSw1IEBACiBlbGF1cmVudEBnb29nbGUuY29tCi1na2FzdGVuQGFuZHJvaWQuY29tCitna2FzdGVuQGdvb2dsZS5jb20KIGh1bmdhQGdvb2dsZS5jb20KIGp0aW5rZXJAZ29vZ2xlLmNvbQogbGFqb3NAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb21tb25fdGltZS9PV05FUlMgYi9pbmNsdWRlL2NvbW1vbl90aW1lL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWNiNTY3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jb21tb25fdGltZS9PV05FUlMKQEAgLTAsMCArMSBAQAorZ2thc3RlbkBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvQ2xpZW50LmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvQ2xpZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZmQ3NmQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9BdWRpb0NsaWVudC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotI2lmbmRlZiBBTkRST0lEX0FVRElPX0NMSUVOVF9ICi0jZGVmaW5lIEFORFJPSURfQVVESU9fQ0xJRU5UX0gKLQotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgQXVkaW9DbGllbnQgewotIHB1YmxpYzoKLSAgICBBdWRpb0NsaWVudCgpIDoKLSAgICAgICAgY2xpZW50VWlkKC0xKSwgY2xpZW50UGlkKC0xKSwgcGFja2FnZU5hbWUoIiIpIHt9Ci0KLSAgICB1aWRfdCBjbGllbnRVaWQ7Ci0gICAgcGlkX3QgY2xpZW50UGlkOwotICAgIFN0cmluZzE2IHBhY2thZ2VOYW1lOwotfTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBBTkRST0lEX0FVRElPX0NMSUVOVF9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvQ2xpZW50LmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvQ2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYTA1MzBlNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvQXVkaW9DbGllbnQuaApAQCAtMCwwICsxIEBACisuLi8uLi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvQ2xpZW50LmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvUHJlc2VudGF0aW9uSW5mby5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1ByZXNlbnRhdGlvbkluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTFhOTkyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1ByZXNlbnRhdGlvbkluZm8uaApAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBVURJT19QUkVTRU5UQVRJT05fSU5GT19IXworI2RlZmluZSBBVURJT19QUkVTRU5UQVRJT05fSU5GT19IXworCisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitlbnVtIG1hc3RlcmluZ19pbmRpY2F0aW9uIHsKKyAgICBNQVNURVJJTkdfTk9UX0lORElDQVRFRCwKKyAgICBNQVNURVJFRF9GT1JfU1RFUkVPLAorICAgIE1BU1RFUkVEX0ZPUl9TVVJST1VORCwKKyAgICBNQVNURVJFRF9GT1JfM0QsCisgICAgTUFTVEVSRURfRk9SX0hFQURQSE9ORSwKK307CisKK3N0cnVjdCBBdWRpb1ByZXNlbnRhdGlvbiA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBpbnQzMl90IG1QcmVzZW50YXRpb25JZDsKKyAgICBpbnQzMl90IG1Qcm9ncmFtSWQ7CisgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbUxhYmVsczsKKyAgICBTdHJpbmc4IG1MYW5ndWFnZTsKKyAgICBpbnQzMl90IG1NYXN0ZXJpbmdJbmRpY2F0aW9uOworICAgIGJvb2wgbUF1ZGlvRGVzY3JpcHRpb25BdmFpbGFibGU7CisgICAgYm9vbCBtU3Bva2VuU3VidGl0bGVzQXZhaWxhYmxlOworICAgIGJvb2wgbURpYWxvZ3VlRW5oYW5jZW1lbnRBdmFpbGFibGU7CisKKyAgICBBdWRpb1ByZXNlbnRhdGlvbigpIHsKKyAgICAgICAgbVByZXNlbnRhdGlvbklkID0gLTE7CisgICAgICAgIG1Qcm9ncmFtSWQgPSAtMTsKKyAgICAgICAgbUxhbmd1YWdlID0gIiI7CisgICAgICAgIG1NYXN0ZXJpbmdJbmRpY2F0aW9uID0gTUFTVEVSSU5HX05PVF9JTkRJQ0FURUQ7CisgICAgICAgIG1BdWRpb0Rlc2NyaXB0aW9uQXZhaWxhYmxlID0gZmFsc2U7CisgICAgICAgIG1TcG9rZW5TdWJ0aXRsZXNBdmFpbGFibGUgPSBmYWxzZTsKKyAgICAgICAgbURpYWxvZ3VlRW5oYW5jZW1lbnRBdmFpbGFibGUgPSBmYWxzZTsKKyAgICB9Cit9OworCit0eXBlZGVmIFZlY3RvcjxzcDxBdWRpb1ByZXNlbnRhdGlvbj4+IEF1ZGlvUHJlc2VudGF0aW9uczsKKworY2xhc3MgQXVkaW9QcmVzZW50YXRpb25JbmZvIDogcHVibGljIFJlZkJhc2UgeworIHB1YmxpYzoKKyAgICBBdWRpb1ByZXNlbnRhdGlvbkluZm8oKTsKKworICAgIH5BdWRpb1ByZXNlbnRhdGlvbkluZm8oKTsKKworICAgIHZvaWQgYWRkUHJlc2VudGF0aW9uKHNwPEF1ZGlvUHJlc2VudGF0aW9uPiBwcmVzZW50YXRpb24pOworCisgICAgc2l6ZV90IGNvdW50UHJlc2VudGF0aW9ucygpIGNvbnN0OworCisgICAgY29uc3Qgc3A8QXVkaW9QcmVzZW50YXRpb24+IGdldFByZXNlbnRhdGlvbihzaXplX3QgaW5kZXgpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgICBBdWRpb1ByZXNlbnRhdGlvbnMgbVByZXNlbnRhdGlvbnM7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFVRElPX1BSRVNFTlRBVElPTl9JTkZPX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0NvdW50ZXJNZXRyaWMuaCBiL2luY2x1ZGUvbWVkaWEvQ291bnRlck1ldHJpYy5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmJhYmEwNDMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL0NvdW50ZXJNZXRyaWMuaApAQCAtMCwwICsxIEBACisuLi8uLi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0NvdW50ZXJNZXRyaWMuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZS5oIGIvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uOTA1YmVjMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZS5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlQmFzZS5oIGIvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjU0YzgwNDcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2VCYXNlLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlQmFzZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9FdmVudE1ldHJpYy5oIGIvaW5jbHVkZS9tZWRpYS9FdmVudE1ldHJpYy5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjU3MDdkOWEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL0V2ZW50TWV0cmljLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9FdmVudE1ldHJpYy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9FeHRyYWN0b3JVdGlscy5oIGIvaW5jbHVkZS9tZWRpYS9FeHRyYWN0b3JVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmUyZGQwODIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL0V4dHJhY3RvclV0aWxzLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9FeHRyYWN0b3JVdGlscy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JQXVkaW9SZWNvcmQuaCBiL2luY2x1ZGUvbWVkaWEvSUF1ZGlvUmVjb3JkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDdmYmY4ZjIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9JQXVkaW9SZWNvcmQuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUmVjb3JkLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lIRENQLmggYi9pbmNsdWRlL21lZGlhL0lIRENQLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDlkNDU2OGUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9JSERDUC5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JSERDUC5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFDb2RlY1NlcnZpY2UuaCBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhQ29kZWNTZXJ2aWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDM3ZjY4MjIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFDb2RlY1NlcnZpY2UuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhQ29kZWNTZXJ2aWNlLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhRGVmcy5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYURlZnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggOTg1MDYwMy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL01lZGlhRGVmcy5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYURlZnMuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3IuaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3IuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi40YjM1ZmUxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYUV4dHJhY3Rvci5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3IuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFTb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4yZTE0N2M0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVNvdXJjZS5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvTWVkaWFTb3VyY2UuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFUcmFjay5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVRyYWNrLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNWE2MzI4N2EKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL01lZGlhVHJhY2suaApAQCAtMCwwICsxIEBACisuLi8uLi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL01lZGlhVHJhY2suaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWljcm9waG9uZUluZm8uaCBiL2luY2x1ZGUvbWVkaWEvTWljcm9waG9uZUluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjg3YWNhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9NaWNyb3Bob25lSW5mby5oCkBAIC0wLDAgKzEsMjQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01JQ1JPUEhPTkVfSU5GT19ICisjZGVmaW5lIEFORFJPSURfTUlDUk9QSE9ORV9JTkZPX0gKKworI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZS5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CisKKyNkZWZpbmUgUkVUVVJOX0lGX0ZBSUxFRChjYWxsZWRPbmNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdGF0dXNfdCByZXR1cm5TdGF0dXMgPSBjYWxsZWRPbmNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKHJldHVyblN0YXR1cykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIGF0ICVzOiVkICglcykiLCBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsgXAorICAgICAgICAgICAgcmV0dXJuIHJldHVyblN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCitjbGFzcyBNaWNyb3Bob25lSW5mbyA6IHB1YmxpYyBQYXJjZWxhYmxlIHsKK3B1YmxpYzoKKyAgICBNaWNyb3Bob25lSW5mbygpID0gZGVmYXVsdDsKKyAgICBNaWNyb3Bob25lSW5mbyhjb25zdCBNaWNyb3Bob25lSW5mbyYgbWljcm9waG9uZUluZm8pID0gZGVmYXVsdDsKKyAgICBNaWNyb3Bob25lSW5mbyhhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QmIGNoYXJhY3RlcmlzdGljKSB7CisgICAgICAgIG1EZXZpY2VJZCA9IFN0cmluZzE2KCZjaGFyYWN0ZXJpc3RpYy5kZXZpY2VfaWRbMF0pOworICAgICAgICBtUG9ydElkID0gY2hhcmFjdGVyaXN0aWMuaWQ7CisgICAgICAgIG1UeXBlID0gY2hhcmFjdGVyaXN0aWMuZGV2aWNlOworICAgICAgICBtQWRkcmVzcyA9IFN0cmluZzE2KCZjaGFyYWN0ZXJpc3RpYy5hZGRyZXNzWzBdKTsKKyAgICAgICAgbURldmljZUxvY2F0aW9uID0gY2hhcmFjdGVyaXN0aWMubG9jYXRpb247CisgICAgICAgIG1EZXZpY2VHcm91cCA9IGNoYXJhY3RlcmlzdGljLmdyb3VwOworICAgICAgICBtSW5kZXhJblRoZUdyb3VwID0gY2hhcmFjdGVyaXN0aWMuaW5kZXhfaW5fdGhlX2dyb3VwOworICAgICAgICBtR2VvbWV0cmljTG9jYXRpb24ucHVzaF9iYWNrKGNoYXJhY3RlcmlzdGljLmdlb21ldHJpY19sb2NhdGlvbi54KTsKKyAgICAgICAgbUdlb21ldHJpY0xvY2F0aW9uLnB1c2hfYmFjayhjaGFyYWN0ZXJpc3RpYy5nZW9tZXRyaWNfbG9jYXRpb24ueSk7CisgICAgICAgIG1HZW9tZXRyaWNMb2NhdGlvbi5wdXNoX2JhY2soY2hhcmFjdGVyaXN0aWMuZ2VvbWV0cmljX2xvY2F0aW9uLnopOworICAgICAgICBtT3JpZW50YXRpb24ucHVzaF9iYWNrKGNoYXJhY3RlcmlzdGljLm9yaWVudGF0aW9uLngpOworICAgICAgICBtT3JpZW50YXRpb24ucHVzaF9iYWNrKGNoYXJhY3RlcmlzdGljLm9yaWVudGF0aW9uLnkpOworICAgICAgICBtT3JpZW50YXRpb24ucHVzaF9iYWNrKGNoYXJhY3RlcmlzdGljLm9yaWVudGF0aW9uLnopOworICAgICAgICBWZWN0b3I8ZmxvYXQ+IGZyZXF1ZW5jaWVzOworICAgICAgICBWZWN0b3I8ZmxvYXQ+IHJlc3BvbnNlczsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjaGFyYWN0ZXJpc3RpYy5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlczsgaSsrKSB7CisgICAgICAgICAgICBmcmVxdWVuY2llcy5wdXNoX2JhY2soY2hhcmFjdGVyaXN0aWMuZnJlcXVlbmN5X3Jlc3BvbnNlc1swXVtpXSk7CisgICAgICAgICAgICByZXNwb25zZXMucHVzaF9iYWNrKGNoYXJhY3RlcmlzdGljLmZyZXF1ZW5jeV9yZXNwb25zZXNbMV1baV0pOworICAgICAgICB9CisgICAgICAgIG1GcmVxdWVuY3lSZXNwb25zZXMucHVzaF9iYWNrKGZyZXF1ZW5jaWVzKTsKKyAgICAgICAgbUZyZXF1ZW5jeVJlc3BvbnNlcy5wdXNoX2JhY2socmVzcG9uc2VzKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBVURJT19DSEFOTkVMX0NPVU5UX01BWDsgaSsrKSB7CisgICAgICAgICAgICBtQ2hhbm5lbE1hcHBpbmcucHVzaF9iYWNrKGNoYXJhY3RlcmlzdGljLmNoYW5uZWxfbWFwcGluZ1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgbVNlbnNpdGl2aXR5ID0gY2hhcmFjdGVyaXN0aWMuc2Vuc2l0aXZpdHk7CisgICAgICAgIG1NYXhTcGwgPSBjaGFyYWN0ZXJpc3RpYy5tYXhfc3BsOworICAgICAgICBtTWluU3BsID0gY2hhcmFjdGVyaXN0aWMubWluX3NwbDsKKyAgICAgICAgbURpcmVjdGlvbmFsaXR5ID0gY2hhcmFjdGVyaXN0aWMuZGlyZWN0aW9uYWxpdHk7CisgICAgfQorCisgICAgdmlydHVhbCB+TWljcm9waG9uZUluZm8oKSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IHsKKyAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPndyaXRlU3RyaW5nMTYobURldmljZUlkKSk7CisgICAgICAgIFJFVFVSTl9JRl9GQUlMRUQocGFyY2VsLT53cml0ZUludDMyKG1Qb3J0SWQpKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPndyaXRlVWludDMyKG1UeXBlKSk7CisgICAgICAgIFJFVFVSTl9JRl9GQUlMRUQocGFyY2VsLT53cml0ZVN0cmluZzE2KG1BZGRyZXNzKSk7CisgICAgICAgIFJFVFVSTl9JRl9GQUlMRUQocGFyY2VsLT53cml0ZUludDMyKG1EZXZpY2VMb2NhdGlvbikpOworICAgICAgICBSRVRVUk5fSUZfRkFJTEVEKHBhcmNlbC0+d3JpdGVJbnQzMihtRGV2aWNlR3JvdXApKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPndyaXRlSW50MzIobUluZGV4SW5UaGVHcm91cCkpOworICAgICAgICBSRVRVUk5fSUZfRkFJTEVEKHdyaXRlRmxvYXRWZWN0b3IocGFyY2VsLCBtR2VvbWV0cmljTG9jYXRpb24pKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRCh3cml0ZUZsb2F0VmVjdG9yKHBhcmNlbCwgbU9yaWVudGF0aW9uKSk7CisgICAgICAgIGlmIChtRnJlcXVlbmN5UmVzcG9uc2VzLnNpemUoKSAhPSAyKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZyZXF1ZW5jeVJlc3BvbnNlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPndyaXRlSW50MzIobUZyZXF1ZW5jeVJlc3BvbnNlc1tpXS5zaXplKCkpKTsKKyAgICAgICAgICAgIFJFVFVSTl9JRl9GQUlMRUQod3JpdGVGbG9hdFZlY3RvcihwYXJjZWwsIG1GcmVxdWVuY3lSZXNwb25zZXNbaV0pKTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IGNoYW5uZWxNYXBwaW5nOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DaGFubmVsTWFwcGluZy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgY2hhbm5lbE1hcHBpbmcucHVzaF9iYWNrKG1DaGFubmVsTWFwcGluZ1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPndyaXRlSW50MzJWZWN0b3IoY2hhbm5lbE1hcHBpbmcpKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPndyaXRlRmxvYXQobVNlbnNpdGl2aXR5KSk7CisgICAgICAgIFJFVFVSTl9JRl9GQUlMRUQocGFyY2VsLT53cml0ZUZsb2F0KG1NYXhTcGwpKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPndyaXRlRmxvYXQobU1pblNwbCkpOworICAgICAgICBSRVRVUk5fSUZfRkFJTEVEKHBhcmNlbC0+d3JpdGVJbnQzMihtRGlyZWN0aW9uYWxpdHkpKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIHsKKyAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPnJlYWRTdHJpbmcxNigmbURldmljZUlkKSk7CisgICAgICAgIFJFVFVSTl9JRl9GQUlMRUQocGFyY2VsLT5yZWFkSW50MzIoJm1Qb3J0SWQpKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPnJlYWRVaW50MzIoJm1UeXBlKSk7CisgICAgICAgIFJFVFVSTl9JRl9GQUlMRUQocGFyY2VsLT5yZWFkU3RyaW5nMTYoJm1BZGRyZXNzKSk7CisgICAgICAgIFJFVFVSTl9JRl9GQUlMRUQocGFyY2VsLT5yZWFkSW50MzIoJm1EZXZpY2VMb2NhdGlvbikpOworICAgICAgICBSRVRVUk5fSUZfRkFJTEVEKHBhcmNlbC0+cmVhZEludDMyKCZtRGV2aWNlR3JvdXApKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPnJlYWRJbnQzMigmbUluZGV4SW5UaGVHcm91cCkpOworICAgICAgICBSRVRVUk5fSUZfRkFJTEVEKHJlYWRGbG9hdFZlY3RvcihwYXJjZWwsICZtR2VvbWV0cmljTG9jYXRpb24sIDMpKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChyZWFkRmxvYXRWZWN0b3IocGFyY2VsLCAmbU9yaWVudGF0aW9uLCAzKSk7CisgICAgICAgIGludDMyX3QgZnJlcXVlbmNpZXNOdW07CisgICAgICAgIFJFVFVSTl9JRl9GQUlMRUQocGFyY2VsLT5yZWFkSW50MzIoJmZyZXF1ZW5jaWVzTnVtKSk7CisgICAgICAgIFZlY3RvcjxmbG9hdD4gZnJlcXVlbmNpZXM7CisgICAgICAgIFJFVFVSTl9JRl9GQUlMRUQocmVhZEZsb2F0VmVjdG9yKHBhcmNlbCwgJmZyZXF1ZW5jaWVzLCBmcmVxdWVuY2llc051bSkpOworICAgICAgICBpbnQzMl90IHJlc3BvbnNlc051bTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPnJlYWRJbnQzMigmcmVzcG9uc2VzTnVtKSk7CisgICAgICAgIFZlY3RvcjxmbG9hdD4gcmVzcG9uc2VzOworICAgICAgICBSRVRVUk5fSUZfRkFJTEVEKHJlYWRGbG9hdFZlY3RvcihwYXJjZWwsICZyZXNwb25zZXMsIHJlc3BvbnNlc051bSkpOworICAgICAgICBpZiAoZnJlcXVlbmNpZXMuc2l6ZSgpICE9IHJlc3BvbnNlcy5zaXplKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgbUZyZXF1ZW5jeVJlc3BvbnNlcy5wdXNoX2JhY2soZnJlcXVlbmNpZXMpOworICAgICAgICBtRnJlcXVlbmN5UmVzcG9uc2VzLnB1c2hfYmFjayhyZXNwb25zZXMpOworICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IGNoYW5uZWxNYXBwaW5nOworICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBwYXJjZWwtPnJlYWRJbnQzMlZlY3RvcigmY2hhbm5lbE1hcHBpbmcpOworICAgICAgICBpZiAocmVzdWx0ICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChjaGFubmVsTWFwcGluZy5zaXplKCkgIT0gQVVESU9fQ0hBTk5FTF9DT1VOVF9NQVgpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjaGFubmVsTWFwcGluZy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgbUNoYW5uZWxNYXBwaW5nLnB1c2hfYmFjayhjaGFubmVsTWFwcGluZ1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPnJlYWRGbG9hdCgmbVNlbnNpdGl2aXR5KSk7CisgICAgICAgIFJFVFVSTl9JRl9GQUlMRUQocGFyY2VsLT5yZWFkRmxvYXQoJm1NYXhTcGwpKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPnJlYWRGbG9hdCgmbU1pblNwbCkpOworICAgICAgICBSRVRVUk5fSUZfRkFJTEVEKHBhcmNlbC0+cmVhZEludDMyKCZtRGlyZWN0aW9uYWxpdHkpKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIFN0cmluZzE2IGdldERldmljZUlkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbURldmljZUlkOworICAgIH0KKworICAgIGludCBnZXRQb3J0SWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUG9ydElkOworICAgIH0KKworICAgIHVuc2lnbmVkIGludCBnZXRUeXBlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVR5cGU7CisgICAgfQorCisgICAgU3RyaW5nMTYgZ2V0QWRkcmVzcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1BZGRyZXNzOworICAgIH0KKworICAgIGludCBnZXREZXZpY2VMb2NhdGlvbigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1EZXZpY2VMb2NhdGlvbjsKKyAgICB9CisKKyAgICBpbnQgZ2V0RGV2aWNlR3JvdXAoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRGV2aWNlR3JvdXA7CisgICAgfQorCisgICAgaW50IGdldEluZGV4SW5UaGVHcm91cCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1JbmRleEluVGhlR3JvdXA7CisgICAgfQorCisgICAgY29uc3QgVmVjdG9yPGZsb2F0PiYgZ2V0R2VvbWV0cmljTG9jYXRpb24oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtR2VvbWV0cmljTG9jYXRpb247CisgICAgfQorCisgICAgY29uc3QgVmVjdG9yPGZsb2F0PiYgZ2V0T3JpZW50YXRpb24oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtT3JpZW50YXRpb247CisgICAgfQorCisgICAgY29uc3QgVmVjdG9yPFZlY3RvcjxmbG9hdD4+JiBnZXRGcmVxdWVuY3lSZXNwb25zZXMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRnJlcXVlbmN5UmVzcG9uc2VzOworICAgIH0KKworICAgIGNvbnN0IFZlY3RvcjxpbnQ+JiBnZXRDaGFubmVsTWFwcGluZygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1DaGFubmVsTWFwcGluZzsKKyAgICB9CisKKyAgICBmbG9hdCBnZXRTZW5zaXRpdml0eSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TZW5zaXRpdml0eTsKKyAgICB9CisKKyAgICBmbG9hdCBnZXRNYXhTcGwoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtTWF4U3BsOworICAgIH0KKworICAgIGZsb2F0IGdldE1pblNwbCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1NaW5TcGw7CisgICAgfQorCisgICAgaW50IGdldERpcmVjdGlvbmFsaXR5KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbURpcmVjdGlvbmFsaXR5OworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGF0dXNfdCByZWFkRmxvYXRWZWN0b3IoCisgICAgICAgICAgICBjb25zdCBQYXJjZWwqIHBhcmNlbCwgVmVjdG9yPGZsb2F0PiAqdmVjdG9yUHRyLCBzaXplX3QgZGVmYXVsdExlbmd0aCkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjp2ZWN0b3I8ZmxvYXQ+PiB2OworICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBwYXJjZWwtPnJlYWRGbG9hdFZlY3Rvcigmdik7CisgICAgICAgIGlmIChyZXN1bHQgIT0gT0spIHJldHVybiByZXN1bHQ7CisgICAgICAgIHZlY3RvclB0ci0+Y2xlYXIoKTsKKyAgICAgICAgaWYgKHYuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBpdGVyIDogKnYpIHsKKyAgICAgICAgICAgICAgICB2ZWN0b3JQdHItPnB1c2hfYmFjayhpdGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZlY3RvclB0ci0+cmVzaXplKGRlZmF1bHRMZW5ndGgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgc3RhdHVzX3Qgd3JpdGVGbG9hdFZlY3RvcihQYXJjZWwqIHBhcmNlbCwgY29uc3QgVmVjdG9yPGZsb2F0PiYgdmVjdG9yKSBjb25zdCB7CisgICAgICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiB2OworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZlY3Rvci5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgdi5wdXNoX2JhY2sodmVjdG9yW2ldKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFyY2VsLT53cml0ZUZsb2F0VmVjdG9yKHYpOworICAgIH0KKworICAgIFN0cmluZzE2IG1EZXZpY2VJZDsKKyAgICBpbnQzMl90IG1Qb3J0SWQ7CisgICAgdWludDMyX3QgbVR5cGU7CisgICAgU3RyaW5nMTYgbUFkZHJlc3M7CisgICAgaW50MzJfdCBtRGV2aWNlTG9jYXRpb247CisgICAgaW50MzJfdCBtRGV2aWNlR3JvdXA7CisgICAgaW50MzJfdCBtSW5kZXhJblRoZUdyb3VwOworICAgIFZlY3RvcjxmbG9hdD4gbUdlb21ldHJpY0xvY2F0aW9uOworICAgIFZlY3RvcjxmbG9hdD4gbU9yaWVudGF0aW9uOworICAgIFZlY3RvcjxWZWN0b3I8ZmxvYXQ+PiBtRnJlcXVlbmN5UmVzcG9uc2VzOworICAgIFZlY3RvcjxpbnQ+IG1DaGFubmVsTWFwcGluZzsKKyAgICBmbG9hdCBtU2Vuc2l0aXZpdHk7CisgICAgZmxvYXQgbU1heFNwbDsKKyAgICBmbG9hdCBtTWluU3BsOworICAgIGludDMyX3QgbURpcmVjdGlvbmFsaXR5OworfTsKKworfSAvLyBuYW1lc3BhY2UgbWVkaWEKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01tYXBTdHJlYW1DYWxsYmFjay5oIGIvaW5jbHVkZS9tZWRpYS9NbWFwU3RyZWFtQ2FsbGJhY2suaAppbmRleCA4MDk4ZTc5Li4zMWI4ZWI1IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL01tYXBTdHJlYW1DYWxsYmFjay5oCisrKyBiL2luY2x1ZGUvbWVkaWEvTW1hcFN0cmVhbUNhbGxiYWNrLmgKQEAgLTMxLDggKzMxLDkgQEAKICAgICAgKiBUaGUgbW1hcCBzdHJlYW0gc2hvdWxkIGJlIHRvcm4gZG93biBiZWNhdXNlIGNvbmRpdGlvbnMgdGhhdCBwZXJtaXR0ZWQgaXRzIGNyZWF0aW9uIHdpdGgKICAgICAgKiB0aGUgcmVxdWVzdGVkIHBhcmFtZXRlcnMgaGF2ZSBjaGFuZ2VkIGFuZCBkbyBub3QgYWxsb3cgaXQgdG8gb3BlcmF0ZSB3aXRoIHRoZSByZXF1ZXN0ZWQKICAgICAgKiBjb25zdHJhaW50cyBhbnkgbW9yZS4KKyAgICAgKiBccGFyYW1baW5dIGhhbmRsZSBoYW5kbGUgZm9yIHRoZSBjbGllbnQgc3RyZWFtIHRvIHRlYXIgZG93bi4KICAgICAgKi8KLSAgICB2aXJ0dWFsIHZvaWQgb25UZWFyRG93bigpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgb25UZWFyRG93bihhdWRpb19wb3J0X2hhbmRsZV90IGhhbmRsZSkgPSAwOwogCiAgICAgLyoqCiAgICAgICogVGhlIHZvbHVtZSB0byBiZSBhcHBsaWVkIHRvIHRoZSB1c2UgY2FzZSBzcGVjaWZpZWQgd2hlbiBvcGVuaW5nIHRoZSBzdHJlYW0gaGFzIGNoYW5nZWQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTW1hcFN0cmVhbUludGVyZmFjZS5oIGIvaW5jbHVkZS9tZWRpYS9NbWFwU3RyZWFtSW50ZXJmYWNlLmgKaW5kZXggZDY4OWUyNS4uMDE5NmEwYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9NbWFwU3RyZWFtSW50ZXJmYWNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9NbWFwU3RyZWFtSW50ZXJmYWNlLmgKQEAgLTUyLDYgKzUyLDkgQEAKICAgICAgKiBccGFyYW1baW4sb3V0XSBkZXZpY2VJZCBhdWRpbyBkZXZpY2UgdGhlIHN0cmVhbSBzaG91bGQgcHJlZmVyYWJseSBiZSByb3V0ZWQgdG8vZnJvbQogICAgICAqICAgICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0ZWQgYXMgaW5wdXQsCiAgICAgICogICAgICAgICAgICAgICAgICAgICAgIEFjdHVhbCBhcyBvdXRwdXQKKyAgICAgKiBccGFyYW1baW4sb3V0XSBzZXNzaW9uSWQgYXVkaW8gc2Vzc2lvbklkIGZvciB0aGUgc3RyZWFtCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RlZCBhcyBpbnB1dCwgbWF5IGJlIEFVRElPX1NFU1NJT05fQUxMT0NBVEUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgQWN0dWFsIGFzIG91dHB1dAogICAgICAqIFxwYXJhbVtpbl0gY2FsbGJhY2sgdGhlIE1tYXBTdHJlYW1DYWxsYmFjayBpbnRlcmZhY2UgdXNlZCBieSBBdWRpb0ZsaW5nZXIgdG8gbm90aWZ5CiAgICAgICogICAgICAgICAgICAgICAgICAgICBjb25kaXRpb24gY2hhbmdlcyBhZmZlY3RpbmcgdGhlIHN0cmVhbSBvcGVyYXRpb24KICAgICAgKiBccGFyYW1bb3V0XSBpbnRlcmZhY2UgdGhlIE1tYXBTdHJlYW1JbnRlcmZhY2UgaW50ZXJmYWNlIGNvbnRyb2xsaW5nIHRoZSBjcmVhdGVkIHN0cmVhbQpAQCAtNjYsNiArNjksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0NsaWVudCYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmRldmljZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPE1tYXBTdHJlYW1DYWxsYmFjaz4mIGNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPE1tYXBTdHJlYW1JbnRlcmZhY2U+JiBpbnRlcmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqaGFuZGxlKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvVGltZUNoZWNrLmggYi9pbmNsdWRlL21lZGlhL1RpbWVDaGVjay5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmUzZWYxMzQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL1RpbWVDaGVjay5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvVGltZUNoZWNrLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL1ZvbHVtZVNoYXBlci5oIGIvaW5jbHVkZS9tZWRpYS9Wb2x1bWVTaGFwZXIuaAppbmRleCAzMDI2NDFmLi5hM2FhZWNlIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL1ZvbHVtZVNoYXBlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvVm9sdW1lU2hhcGVyLmgKQEAgLTM3LDYgKzM3LDggQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCituYW1lc3BhY2UgbWVkaWEgeworCiAvLyBUaGUgbmF0aXZlIFZvbHVtZVNoYXBlciBjbGFzcyBtaXJyb3JzIHRoZSBqYXZhIFZvbHVtZVNoYXBlciBjbGFzczsKIC8vIGluIGFkZGl0aW9uLCB0aGUgbmF0aXZlIGNsYXNzIGNvbnRhaW5zIGltcGxlbWVudGF0aW9uIGZvciBhY3R1YWwgb3BlcmF0aW9uLgogLy8KQEAgLTEwMSw3ICsxMDMsNyBAQAogICAgICAqIFNlZSAiZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXIuamF2YSIgZm9yCiAgICAgICogZGV0YWlscyBvbiB0aGUgSmF2YSBpbXBsZW1lbnRhdGlvbi4KICAgICAgKi8KLSAgICBjbGFzcyBDb25maWd1cmF0aW9uIDogcHVibGljIEludGVycG9sYXRvcjxTLCBUPiwgcHVibGljIFJlZkJhc2UgeworICAgIGNsYXNzIENvbmZpZ3VyYXRpb24gOiBwdWJsaWMgSW50ZXJwb2xhdG9yPFMsIFQ+LCBwdWJsaWMgUmVmQmFzZSwgcHVibGljIFBhcmNlbGFibGUgewogICAgIHB1YmxpYzoKICAgICAgICAgLy8gTXVzdCBtYXRjaCB3aXRoIFZvbHVtZVNoYXBlci5qYXZhIGluIGZyYW1ld29ya3MvYmFzZS4KICAgICAgICAgZW51bSBUeXBlIDogaW50MzJfdCB7CkBAIC0yODMsNyArMjg1LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIFRoZSBwYXJjZWwgbGF5b3V0IG11c3QgbWF0Y2ggVm9sdW1lU2hhcGVyLmphdmEKLSAgICAgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3QgeworICAgICAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdCBvdmVycmlkZSB7CiAgICAgICAgICAgICBpZiAocGFyY2VsID09IG51bGxwdHIpIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICByZXR1cm4gcGFyY2VsLT53cml0ZUludDMyKChpbnQzMl90KW1UeXBlKQogICAgICAgICAgICAgICAgICAgICA/OiBwYXJjZWwtPndyaXRlSW50MzIobUlkKQpAQCAtMjk0LDE3ICsyOTYsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/OiBJbnRlcnBvbGF0b3I8UywgVD46OndyaXRlVG9QYXJjZWwocGFyY2VsKTsKICAgICAgICAgfQogCi0gICAgICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAmcGFyY2VsKSB7CisgICAgICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAqcGFyY2VsKSBvdmVycmlkZSB7CiAgICAgICAgICAgICBpbnQzMl90IHR5cGUsIG9wdGlvbkZsYWdzOwotICAgICAgICAgICAgcmV0dXJuIHBhcmNlbC5yZWFkSW50MzIoJnR5cGUpCisgICAgICAgICAgICByZXR1cm4gcGFyY2VsLT5yZWFkSW50MzIoJnR5cGUpCiAgICAgICAgICAgICAgICAgICAgID86IHNldFR5cGUoKFR5cGUpdHlwZSkKLSAgICAgICAgICAgICAgICAgICAgPzogcGFyY2VsLnJlYWRJbnQzMigmbUlkKQorICAgICAgICAgICAgICAgICAgICA/OiBwYXJjZWwtPnJlYWRJbnQzMigmbUlkKQogICAgICAgICAgICAgICAgICAgICA/OiBtVHlwZSA9PSBUWVBFX0lECiAgICAgICAgICAgICAgICAgICAgICAgICA/IE5PX0VSUk9SCi0gICAgICAgICAgICAgICAgICAgICAgICA6IHBhcmNlbC5yZWFkSW50MzIoJm9wdGlvbkZsYWdzKQorICAgICAgICAgICAgICAgICAgICAgICAgOiBwYXJjZWwtPnJlYWRJbnQzMigmb3B0aW9uRmxhZ3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPzogc2V0T3B0aW9uRmxhZ3MoKE9wdGlvbkZsYWcpb3B0aW9uRmxhZ3MpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPzogcGFyY2VsLnJlYWREb3VibGUoJm1EdXJhdGlvbk1zKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID86IEludGVycG9sYXRvcjxTLCBUPjo6cmVhZEZyb21QYXJjZWwocGFyY2VsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID86IHBhcmNlbC0+cmVhZERvdWJsZSgmbUR1cmF0aW9uTXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPzogSW50ZXJwb2xhdG9yPFMsIFQ+OjpyZWFkRnJvbVBhcmNlbCgqcGFyY2VsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgID86IGNoZWNrQ3VydmUoKTsKICAgICAgICAgfQogCkBAIC0zMzYsNyArMzM4LDcgQEAKICAgICAgKiBTZWUgImZyYW1ld29ya3MvYmFzZS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyLmphdmEiIGZvcgogICAgICAqIGRldGFpbHMgb24gdGhlIEphdmEgaW1wbGVtZW50YXRpb24uCiAgICAgICovCi0gICAgY2xhc3MgT3BlcmF0aW9uIDogcHVibGljIFJlZkJhc2UgeworICAgIGNsYXNzIE9wZXJhdGlvbiA6IHB1YmxpYyBSZWZCYXNlLCBwdWJsaWMgUGFyY2VsYWJsZSB7CiAgICAgcHVibGljOgogICAgICAgICAvLyBNdXN0IG1hdGNoIHdpdGggVm9sdW1lU2hhcGVyLmphdmEuCiAgICAgICAgIGVudW0gRmxhZyA6IGludDMyX3QgewpAQCAtNDE4LDE4ICs0MjAsMTggQEAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQogCi0gICAgICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0IHsKKyAgICAgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgICAgICAgaWYgKHBhcmNlbCA9PSBudWxscHRyKSByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgcmV0dXJuIHBhcmNlbC0+d3JpdGVJbnQzMigoaW50MzJfdCltRmxhZ3MpCiAgICAgICAgICAgICAgICAgICAgID86IHBhcmNlbC0+d3JpdGVJbnQzMihtUmVwbGFjZUlkKQogICAgICAgICAgICAgICAgICAgICA/OiBwYXJjZWwtPndyaXRlRmxvYXQobVhPZmZzZXQpOwogICAgICAgICB9CiAKLSAgICAgICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICZwYXJjZWwpIHsKKyAgICAgICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICpwYXJjZWwpIG92ZXJyaWRlIHsKICAgICAgICAgICAgIGludDMyX3QgZmxhZ3M7Ci0gICAgICAgICAgICByZXR1cm4gcGFyY2VsLnJlYWRJbnQzMigmZmxhZ3MpCi0gICAgICAgICAgICAgICAgICAgID86IHBhcmNlbC5yZWFkSW50MzIoJm1SZXBsYWNlSWQpCi0gICAgICAgICAgICAgICAgICAgID86IHBhcmNlbC5yZWFkRmxvYXQoJm1YT2Zmc2V0KQorICAgICAgICAgICAgcmV0dXJuIHBhcmNlbC0+cmVhZEludDMyKCZmbGFncykKKyAgICAgICAgICAgICAgICAgICAgPzogcGFyY2VsLT5yZWFkSW50MzIoJm1SZXBsYWNlSWQpCisgICAgICAgICAgICAgICAgICAgID86IHBhcmNlbC0+cmVhZEZsb2F0KCZtWE9mZnNldCkKICAgICAgICAgICAgICAgICAgICAgPzogc2V0RmxhZ3MoKEZsYWcpZmxhZ3MpOwogICAgICAgICB9CiAKQEAgLTQ1NSw3ICs0NTcsNyBAQAogICAgICAqIFNlZSAiZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXIuamF2YSIgZm9yCiAgICAgICogZGV0YWlscyBvbiB0aGUgSmF2YSBpbXBsZW1lbnRhdGlvbi4KICAgICAgKi8KLSAgICBjbGFzcyBTdGF0ZSA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBjbGFzcyBTdGF0ZSA6IHB1YmxpYyBSZWZCYXNlLCBwdWJsaWMgUGFyY2VsYWJsZSB7CiAgICAgcHVibGljOgogICAgICAgICBTdGF0ZShUIHZvbHVtZSwgUyB4T2Zmc2V0KQogICAgICAgICAgICAgOiBtVm9sdW1lKHZvbHVtZSkKQEAgLTQ4MSwxNSArNDgzLDE1IEBACiAgICAgICAgICAgICBtWE9mZnNldCA9IHhPZmZzZXQ7CiAgICAgICAgIH0KIAotICAgICAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdCB7CisgICAgICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgICAgICAgIGlmIChwYXJjZWwgPT0gbnVsbHB0cikgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIHJldHVybiBwYXJjZWwtPndyaXRlRmxvYXQobVZvbHVtZSkKICAgICAgICAgICAgICAgICAgICAgPzogcGFyY2VsLT53cml0ZUZsb2F0KG1YT2Zmc2V0KTsKICAgICAgICAgfQogCi0gICAgICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAmcGFyY2VsKSB7Ci0gICAgICAgICAgICByZXR1cm4gcGFyY2VsLnJlYWRGbG9hdCgmbVZvbHVtZSkKLSAgICAgICAgICAgICAgICAgICAgID86IHBhcmNlbC5yZWFkRmxvYXQoJm1YT2Zmc2V0KTsKKyAgICAgICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICpwYXJjZWwpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgIHJldHVybiBwYXJjZWwtPnJlYWRGbG9hdCgmbVZvbHVtZSkKKyAgICAgICAgICAgICAgICAgICAgID86IHBhcmNlbC0+cmVhZEZsb2F0KCZtWE9mZnNldCk7CiAgICAgICAgIH0KIAogICAgICAgICBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKQEAgLTEwMjAsNiArMTAyMiw4IEBACiAgICAgc3RkOjpsaXN0PFZvbHVtZVNoYXBlcj4gbVZvbHVtZVNoYXBlcnM7IC8vIGxpc3QgcHJvdmlkZXMgc3RhYmxlIGl0ZXJhdG9ycyBvbiBlcmFzZQogfTsgLy8gVm9sdW1lSGFuZGxlcgogCit9IC8vIG5hbWVzcGFjZSBtZWRpYQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNwcmFnbWEgcG9wX21hY3JvKCJMT0dfVEFHIikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvVm9yYmlzQ29tbWVudC5oIGIvaW5jbHVkZS9tZWRpYS9Wb3JiaXNDb21tZW50LmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYWRhYTQ4OQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvVm9yYmlzQ29tbWVudC5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvVm9yYmlzQ29tbWVudC5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9OQkxvZy5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9OQkxvZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCBjMzU0MDFlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJMb2cuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uLy4uL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJMb2cuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGVyZm9ybWFuY2VBbmFseXNpcy5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9QZXJmb3JtYW5jZUFuYWx5c2lzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDdhY2ZjOTAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9uYmFpby9QZXJmb3JtYW5jZUFuYWx5c2lzLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi8uLi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL1BlcmZvcm1hbmNlQW5hbHlzaXMuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJsb2cvTkJMb2cuaCBiL2luY2x1ZGUvbWVkaWEvbmJsb2cvTkJMb2cuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4zY2MzNjZjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmxvZy9OQkxvZy5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvTkJMb2cuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5oIGIvaW5jbHVkZS9tZWRpYS9uYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNmVhZDNiYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5oIGIvaW5jbHVkZS9tZWRpYS9uYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmU5YjhlODAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL25ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9DcnlwdG8uaCBiL2luY2x1ZGUvbWVkaWFkcm0vQ3J5cHRvLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvbWVkaWEvQ3J5cHRvLmgKcmVuYW1lIHRvIGluY2x1ZGUvbWVkaWFkcm0vQ3J5cHRvLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQ3J5cHRvSGFsLmggYi9pbmNsdWRlL21lZGlhZHJtL0NyeXB0b0hhbC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL21lZGlhL0NyeXB0b0hhbC5oCnJlbmFtZSB0byBpbmNsdWRlL21lZGlhZHJtL0NyeXB0b0hhbC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0RybS5oIGIvaW5jbHVkZS9tZWRpYWRybS9Ecm0uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9tZWRpYS9Ecm0uaApyZW5hbWUgdG8gaW5jbHVkZS9tZWRpYWRybS9Ecm0uaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9Ecm1IYWwuaCBiL2luY2x1ZGUvbWVkaWFkcm0vRHJtSGFsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvbWVkaWEvRHJtSGFsLmgKcmVuYW1lIHRvIGluY2x1ZGUvbWVkaWFkcm0vRHJtSGFsLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWFkcm0vRHJtTWV0cmljcy5oIGIvaW5jbHVkZS9tZWRpYWRybS9Ecm1NZXRyaWNzLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYWJjOTY2YgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWFkcm0vRHJtTWV0cmljcy5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRHJtTWV0cmljcy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9Ecm1QbHVnaW5QYXRoLmggYi9pbmNsdWRlL21lZGlhZHJtL0RybVBsdWdpblBhdGguaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9tZWRpYS9Ecm1QbHVnaW5QYXRoLmgKcmVuYW1lIHRvIGluY2x1ZGUvbWVkaWFkcm0vRHJtUGx1Z2luUGF0aC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0RybVNlc3Npb25DbGllbnRJbnRlcmZhY2UuaCBiL2luY2x1ZGUvbWVkaWFkcm0vRHJtU2Vzc2lvbkNsaWVudEludGVyZmFjZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL21lZGlhL0RybVNlc3Npb25DbGllbnRJbnRlcmZhY2UuaApyZW5hbWUgdG8gaW5jbHVkZS9tZWRpYWRybS9Ecm1TZXNzaW9uQ2xpZW50SW50ZXJmYWNlLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvRHJtU2Vzc2lvbk1hbmFnZXIuaCBiL2luY2x1ZGUvbWVkaWFkcm0vRHJtU2Vzc2lvbk1hbmFnZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9tZWRpYS9Ecm1TZXNzaW9uTWFuYWdlci5oCnJlbmFtZSB0byBpbmNsdWRlL21lZGlhZHJtL0RybVNlc3Npb25NYW5hZ2VyLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSUNyeXB0by5oIGIvaW5jbHVkZS9tZWRpYWRybS9JQ3J5cHRvLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvbWVkaWEvSUNyeXB0by5oCnJlbmFtZSB0byBpbmNsdWRlL21lZGlhZHJtL0lDcnlwdG8uaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JRHJtLmggYi9pbmNsdWRlL21lZGlhZHJtL0lEcm0uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9tZWRpYS9JRHJtLmgKcmVuYW1lIHRvIGluY2x1ZGUvbWVkaWFkcm0vSURybS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lEcm1DbGllbnQuaCBiL2luY2x1ZGUvbWVkaWFkcm0vSURybUNsaWVudC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL21lZGlhL0lEcm1DbGllbnQuaApyZW5hbWUgdG8gaW5jbHVkZS9tZWRpYWRybS9JRHJtQ2xpZW50LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhRHJtU2VydmljZS5oIGIvaW5jbHVkZS9tZWRpYWRybS9JTWVkaWFEcm1TZXJ2aWNlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvbWVkaWEvSU1lZGlhRHJtU2VydmljZS5oCnJlbmFtZSB0byBpbmNsdWRlL21lZGlhZHJtL0lNZWRpYURybVNlcnZpY2UuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYWRybS9PV05FUlMgYi9pbmNsdWRlL21lZGlhZHJtL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzg4NzU0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYWRybS9PV05FUlMKQEAgLTAsMCArMSBAQAoranRpbmtlckBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL1NoYXJlZExpYnJhcnkuaCBiL2luY2x1ZGUvbWVkaWFkcm0vU2hhcmVkTGlicmFyeS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL21lZGlhL1NoYXJlZExpYnJhcnkuaApyZW5hbWUgdG8gaW5jbHVkZS9tZWRpYWRybS9TaGFyZWRMaWJyYXJ5LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmggYi9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oCmluZGV4IGZmNDQwYmMuLmNhMTE5ZDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmgKKysrIGIvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaApAQCAtNjAsNiArNjAsOCBAQAogICAgIHZvbGF0aWxlIGludDMyX3QgbVJlYXI7ICAgICAvLyB3cml0dGVuIGJ5IHByb2R1Y2VyIChvdXRwdXQ6IGNsaWVudCwgaW5wdXQ6IHNlcnZlcikKICAgICB2b2xhdGlsZSBpbnQzMl90IG1GbHVzaDsgICAgLy8gaW5jcmVtZW50ZWQgYnkgY2xpZW50IHRvIGluZGljYXRlIGEgcmVxdWVzdCB0byBmbHVzaDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VydmVyIG5vdGljZXMgYW5kIGRpc2NhcmRzIGFsbCBkYXRhIGJldHdlZW4gbUZyb250IGFuZCBtUmVhcgorICAgIHZvbGF0aWxlIGludDMyX3QgbVN0b3A7ICAgICAvLyBzZXQgYnkgY2xpZW50IHRvIGluZGljYXRlIGEgc3RvcCBmcmFtZSBwb3NpdGlvbjsgc2VydmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgbm90IHJlYWQgYmV5b25kIHRoaXMgcG9zaXRpb24gdW50aWwgc3RhcnQgaXMgY2FsbGVkLgogICAgIHZvbGF0aWxlIHVpbnQzMl90IG1VbmRlcnJ1bkZyYW1lczsgLy8gc2VydmVyIGluY3JlbWVudHMgZm9yIGVhY2ggdW5hdmFpbGFibGUgYnV0IGRlc2lyZWQgZnJhbWUKICAgICB2b2xhdGlsZSB1aW50MzJfdCBtVW5kZXJydW5Db3VudDsgIC8vIHNlcnZlciBpbmNyZW1lbnRzIGZvciBlYWNoIHVuZGVycnVuIG9jY3VycmVuY2UKIH07CkBAIC0zMzUsNiArMzM3LDggQEAKICAgICAgICAgbVRpbWVzdGFtcC5jbGVhcigpOwogICAgIH0KIAorICAgIHZpcnR1YWwgdm9pZCBzdG9wKCkgeyB9OyAvLyBjYWxsZWQgYnkgY2xpZW50IGluIEF1ZGlvVHJhY2s6OnN0b3AoKQorCiBwcml2YXRlOgogICAgIC8vIFRoaXMgaXMgYSBjb3B5IG9mIG1DYmxrLT5tQnVmZmVyU2l6ZUluRnJhbWVzCiAgICAgdWludDMyX3QgICBtQnVmZmVyU2l6ZUluRnJhbWVzOyAgLy8gZWZmZWN0aXZlIHNpemUgb2YgdGhlIGJ1ZmZlcgpAQCAtMzgzLDggKzM4NywxNCBAQAogICAgICAgICBtUGxheWJhY2tSYXRlTXV0YXRvci5wdXNoKHBsYXliYWNrUmF0ZSk7CiAgICAgfQogCisgICAgLy8gU2VuZHMgZmx1c2ggYW5kIHN0b3AgcG9zaXRpb24gaW5mb3JtYXRpb24gZnJvbSB0aGUgY2xpZW50IHRvIHRoZSBzZXJ2ZXIsCisgICAgLy8gdXNlZCBieSBzdHJlYW1pbmcgQXVkaW9UcmFjayBmbHVzaCgpIG9yIHN0b3AoKS4KKyAgICB2b2lkIHNlbmRTdHJlYW1pbmdGbHVzaFN0b3AoYm9vbCBmbHVzaCk7CisKICAgICB2aXJ0dWFsIHZvaWQgZmx1c2goKTsKIAorICAgICAgICAgICAgdm9pZCBzdG9wKCkgb3ZlcnJpZGU7CisKICAgICB2aXJ0dWFsIHVpbnQzMl90ICAgIGdldFVuZGVycnVuRnJhbWVzKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbUNibGstPnUubVN0cmVhbWluZy5tVW5kZXJydW5GcmFtZXM7CiAgICAgfQpAQCAtNDEwLDYgKzQyMCw4IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgICAgZmx1c2goKTsKIAorICAgIHZvaWQgc3RvcCgpIG92ZXJyaWRlOworCiAjZGVmaW5lIE1JTl9MT09QICAgIDE2ICAvLyBtaW5pbXVtIGxlbmd0aCBvZiBlYWNoIGxvb3AgaXRlcmF0aW9uIGluIGZyYW1lcwogCiAgICAgICAgICAgICAvLyBzZXRMb29wKCksIHNldEJ1ZmZlclBvc2l0aW9uKCksIGFuZCBzZXRCdWZmZXJQb3NpdGlvbkFuZExvb3AoKSBzZXQgdGhlCkBAIC00MzgsNyArNDUwLDExIEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIHZpcnR1YWwgdWludDMyX3QgICAgZ2V0VW5kZXJydW5GcmFtZXMoKSBjb25zdCB7CisgICAgdmlydHVhbCB1aW50MzJfdCBnZXRVbmRlcnJ1bkZyYW1lcygpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdmlydHVhbCB1aW50MzJfdCBnZXRVbmRlcnJ1bkNvdW50KCkgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKQEAgLTUyOCw2ICs1NDQsMTAgQEAKICAgICAvLyAgIGNsaWVudCB3aWxsIGJlIG5vdGlmaWVkIHZpYSBGdXRleAogICAgIHZpcnR1YWwgdm9pZCAgICBmbHVzaEJ1ZmZlcklmTmVlZGVkKCk7CiAKKyAgICAvLyBSZXR1cm5zIHRoZSByZWFyIHBvc2l0aW9uIG9mIHRoZSBBdWRpb1RyYWNrIHNoYXJlZCByaW5nIGJ1ZmZlciwgbGltaXRlZCBieQorICAgIC8vIHRoZSBzdG9wIGZyYW1lIHBvc2l0aW9uIGxldmVsLgorICAgIHZpcnR1YWwgaW50MzJfdCBnZXRSZWFyKCkgY29uc3QgPSAwOworCiAgICAgLy8gVG90YWwgY291bnQgb2YgdGhlIG51bWJlciBvZiBmbHVzaGVkIGZyYW1lcyBzaW5jZSBjcmVhdGlvbiAobmV2ZXIgcmVzZXQpLgogICAgIHZpcnR1YWwgaW50NjRfdCAgICAgZnJhbWVzRmx1c2hlZCgpIGNvbnN0IHsgcmV0dXJuIG1GbHVzaGVkOyB9CiAKQEAgLTYwMywxMCArNjIzLDE4IEBACiAgICAgICAgIHJldHVybiBtRHJhaW5lZC5sb2FkKCk7CiAgICAgfQogCisgICAgaW50MzJfdCAgICAgICAgICAgICBnZXRSZWFyKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAvLyBDYWxsZWQgb24gc2VydmVyIHNpZGUgdHJhY2sgc3RhcnQoKS4KKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHN0YXJ0KCk7CisKIHByaXZhdGU6CiAgICAgQXVkaW9QbGF5YmFja1JhdGUgICAgICAgICAgICAgbVBsYXliYWNrUmF0ZTsgIC8vIGxhc3Qgb2JzZXJ2ZWQgcGxheWJhY2sgcmF0ZQogICAgIFBsYXliYWNrUmF0ZVF1ZXVlOjpPYnNlcnZlciAgIG1QbGF5YmFja1JhdGVPYnNlcnZlcjsKIAorICAgIC8vIExhc3QgY2xpZW50IHN0b3AtYXQgcG9zaXRpb24gd2hlbiBzdGFydCgpIHdhcyBjYWxsZWQuIFVzZWQgZm9yIHN0cmVhbWluZyBBdWRpb1RyYWNrcy4KKyAgICBzdGQ6OmF0b21pYzxpbnQzMl90PiAgICAgICAgICBtU3RvcExhc3R7MH07CisKICAgICAvLyBUaGUgc2VydmVyIGtlZXBzIGEgY29weSBoZXJlIHdoZXJlIGl0IGlzIHNhZmUgZnJvbSB0aGUgY2xpZW50LgogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgIG1VbmRlcnJ1bkNvdW50OyAvLyBlY2hvZWQgdG8gbUNibGsKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICBtVW5kZXJydW5uaW5nOyAgLy8gdXNlZCB0byBkZXRlY3QgZWRnZSBvZiB1bmRlcnJ1bgpAQCAtNjMwLDYgKzY1OCwxMCBAQAogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgdGFsbHlVbmRlcnJ1bkZyYW1lcyh1aW50MzJfdCBmcmFtZUNvdW50KTsKICAgICB2aXJ0dWFsIHVpbnQzMl90ICAgIGdldFVuZGVycnVuRnJhbWVzKCkgY29uc3QgeyByZXR1cm4gMDsgfQogCisgICAgaW50MzJfdCBnZXRSZWFyKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICB2b2lkIHN0YXJ0KCkgb3ZlcnJpZGUgeyB9IC8vIGlnbm9yZSBmb3Igc3RhdGljIHRyYWNrcworCiBwcml2YXRlOgogICAgIHN0YXR1c190ICAgICAgICAgICAgdXBkYXRlU3RhdGVXaXRoTG9vcChTdGF0aWNBdWRpb1RyYWNrU3RhdGUgKmxvY2FsU3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0YXRpY0F1ZGlvVHJhY2tTdGF0ZSAmdXBkYXRlKSBjb25zdDsKQEAgLTY1Nyw2ICs2ODksMTAgQEAKICAgICAgICAgICAgIHNpemVfdCBmcmFtZVNpemUsIGJvb2wgY2xpZW50SW5TZXJ2ZXIpCiAgICAgICAgIDogU2VydmVyUHJveHkoY2JsaywgYnVmZmVycywgZnJhbWVDb3VudCwgZnJhbWVTaXplLCBmYWxzZSAvKmlzT3V0Ki8sIGNsaWVudEluU2VydmVyKSB7IH0KIAorICAgIGludDMyX3QgZ2V0UmVhcigpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1DYmxrLT51Lm1TdHJlYW1pbmcubVJlYXI7IC8vIEZvciBjb21wbGV0ZW5lc3Mgb25seTsgbVJlYXIgd3JpdHRlbiBieSBzZXJ2ZXIuCisgICAgfQorCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QXVkaW9SZWNvcmRTZXJ2ZXJQcm94eSgpIHsgfQogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9PV05FUlMgYi9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNzIzYmEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvT1dORVJTCkBAIC0wLDAgKzEsMyBAQAorZWxhdXJlbnRAZ29vZ2xlLmNvbQorZ2thc3RlbkBnb29nbGUuY29tCitodW5nYUBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvVmlkZW9GcmFtZS5oIGIvaW5jbHVkZS9wcml2YXRlL21lZGlhL1ZpZGVvRnJhbWUuaAppbmRleCBhOWQ0ZGQxLi43MTJmMTE4IDEwMDY0NAotLS0gYS9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvVmlkZW9GcmFtZS5oCisrKyBiL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9WaWRlb0ZyYW1lLmgKQEAgLTI1LDk0ICsyNSwzNCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLS8vIFJlcHJlc2VudHMgYSBjb2xvciBjb252ZXJ0ZWQgKFJHQi1iYXNlZCkgdmlkZW8gZnJhbWUKLS8vIHdpdGggYml0bWFwIHBpeGVscyBzdG9yZWQgaW4gRnJhbWVCdWZmZXIKKy8vIFJlcHJlc2VudHMgYSBjb2xvciBjb252ZXJ0ZWQgKFJHQi1iYXNlZCkgdmlkZW8gZnJhbWUgd2l0aCBiaXRtYXAKKy8vIHBpeGVscyBzdG9yZWQgaW4gRnJhbWVCdWZmZXIuCisvLyBJbiBhIFZpZGVvRnJhbWUgc3RydWN0IHN0b3JlZCBpbiBJTWVtb3J5LCBmcmFtZSBkYXRhIGFuZCBJQ0MgZGF0YQorLy8gY29tZSBhZnRlciB0aGUgVmlkZW9GcmFtZSBzdHJ1Y3R1cmUuIFRoZWlyIGxvY2F0aW9ucyBjYW4gYmUgcmV0cmlldmVkCisvLyBieSBnZXRGbGF0dGVuZWREYXRhKCkgYW5kIGdldEZsYXR0ZW5lZEljY0RhdGEoKTsKIGNsYXNzIFZpZGVvRnJhbWUKIHsKIHB1YmxpYzoKICAgICAvLyBDb25zdHJ1Y3QgYSBWaWRlb0ZyYW1lIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycywKLSAgICAvLyB3aWxsIGFsbG9jYXRlIGZyYW1lIGJ1ZmZlciBpZiB8YWxsb2NhdGV8IGlzIHNldCB0byB0cnVlLCB3aWxsCi0gICAgLy8gYWxsb2NhdGUgYnVmZmVyIHRvIGhvbGQgSUNDIGRhdGEgaWYgfGljY0RhdGF8IGFuZCB8aWNjU2l6ZXwKLSAgICAvLyBpbmRpY2F0ZSBpdHMgcHJlc2VuY2UuCisgICAgLy8gd2lsbCBjYWxjdWxhdGUgZnJhbWUgYnVmZmVyIHNpemUgaWYgfGhhc0RhdGF8IGlzIHNldCB0byB0cnVlLgogICAgIFZpZGVvRnJhbWUodWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKICAgICAgICAgICAgIHVpbnQzMl90IGRpc3BsYXlXaWR0aCwgdWludDMyX3QgZGlzcGxheUhlaWdodCwKLSAgICAgICAgICAgIHVpbnQzMl90IGFuZ2xlLCB1aW50MzJfdCBicHAsIGJvb2wgYWxsb2NhdGUsCi0gICAgICAgICAgICBjb25zdCB2b2lkICppY2NEYXRhLCBzaXplX3QgaWNjU2l6ZSk6CisgICAgICAgICAgICB1aW50MzJfdCB0aWxlV2lkdGgsIHVpbnQzMl90IHRpbGVIZWlnaHQsCisgICAgICAgICAgICB1aW50MzJfdCBhbmdsZSwgdWludDMyX3QgYnBwLCBib29sIGhhc0RhdGEsIHNpemVfdCBpY2NTaXplKToKICAgICAgICAgbVdpZHRoKHdpZHRoKSwgbUhlaWdodChoZWlnaHQpLAogICAgICAgICBtRGlzcGxheVdpZHRoKGRpc3BsYXlXaWR0aCksIG1EaXNwbGF5SGVpZ2h0KGRpc3BsYXlIZWlnaHQpLAorICAgICAgICBtVGlsZVdpZHRoKHRpbGVXaWR0aCksIG1UaWxlSGVpZ2h0KHRpbGVIZWlnaHQpLAogICAgICAgICBtUm90YXRpb25BbmdsZShhbmdsZSksIG1CeXRlc1BlclBpeGVsKGJwcCksIG1Sb3dCeXRlcyhicHAgKiB3aWR0aCksCi0gICAgICAgIG1TaXplKDApLCBtSWNjU2l6ZSgwKSwgbVJlc2VydmVkKDApLCBtRGF0YSgwKSwgbUljY0RhdGEoMCkgewotICAgICAgICBpZiAoYWxsb2NhdGUpIHsKLSAgICAgICAgICAgIG1TaXplID0gbVJvd0J5dGVzICogbUhlaWdodDsKLSAgICAgICAgICAgIG1EYXRhID0gbmV3IHVpbnQ4X3RbbVNpemVdOwotICAgICAgICAgICAgaWYgKG1EYXRhID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtU2l6ZSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaWNjRGF0YSAhPSBOVUxMICYmIGljY1NpemUgPiAwKSB7Ci0gICAgICAgICAgICBtSWNjU2l6ZSA9IGljY1NpemU7Ci0gICAgICAgICAgICBtSWNjRGF0YSA9IG5ldyB1aW50OF90W2ljY1NpemVdOwotICAgICAgICAgICAgaWYgKG1JY2NEYXRhICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkobUljY0RhdGEsIGljY0RhdGEsIGljY1NpemUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtSWNjU2l6ZSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgbVNpemUoaGFzRGF0YSA/IChicHAgKiB3aWR0aCAqIGhlaWdodCkgOiAwKSwKKyAgICAgICAgbUljY1NpemUoaWNjU2l6ZSksIG1SZXNlcnZlZCgwKSB7CiAgICAgfQogCi0gICAgLy8gRGVlcCBjb3B5IG9mIGJvdGggdGhlIGluZm9ybWF0aW9uIGZpZWxkcyBhbmQgdGhlIGZyYW1lIGRhdGEKLSAgICBWaWRlb0ZyYW1lKGNvbnN0IFZpZGVvRnJhbWUmIGNvcHkpIHsKLSAgICAgICAgY29weUluZm9Pbmx5KGNvcHkpOwotCi0gICAgICAgIG1TaXplID0gY29weS5tU2l6ZTsKLSAgICAgICAgbURhdGEgPSBOVUxMOyAgLy8gaW5pdGlhbGl6ZSBpdCBmaXJzdAotICAgICAgICBpZiAobVNpemUgPiAwICYmIGNvcHkubURhdGEgIT0gTlVMTCkgewotICAgICAgICAgICAgbURhdGEgPSBuZXcgdWludDhfdFttU2l6ZV07Ci0gICAgICAgICAgICBpZiAobURhdGEgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIG1lbWNweShtRGF0YSwgY29weS5tRGF0YSwgbVNpemUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtU2l6ZSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBtSWNjU2l6ZSA9IGNvcHkubUljY1NpemU7Ci0gICAgICAgIG1JY2NEYXRhID0gTlVMTDsgIC8vIGluaXRpYWxpemUgaXQgZmlyc3QKLSAgICAgICAgaWYgKG1JY2NTaXplID4gMCAmJiBjb3B5Lm1JY2NEYXRhICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1JY2NEYXRhID0gbmV3IHVpbnQ4X3RbbUljY1NpemVdOwotICAgICAgICAgICAgaWYgKG1JY2NEYXRhICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkobUljY0RhdGEsIGNvcHkubUljY0RhdGEsIG1JY2NTaXplKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUljY1NpemUgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgflZpZGVvRnJhbWUoKSB7Ci0gICAgICAgIGlmIChtRGF0YSAhPSAwKSB7Ci0gICAgICAgICAgICBkZWxldGVbXSBtRGF0YTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUljY0RhdGEgIT0gMCkgewotICAgICAgICAgICAgZGVsZXRlW10gbUljY0RhdGE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBDb3B5IHxjb3B5fCB0byBhIGZsYXR0ZW5lZCBWaWRlb0ZyYW1lIGluIElNZW1vcnksICd0aGlzJyBtdXN0IHBvaW50IHRvCi0gICAgLy8gYSBjaHVuayBvZiBtZW1vcnkgYmFjayBieSBJTWVtb3J5IG9mIHNpemUgYXQgbGVhc3QgZ2V0RmxhdHRlbmVkU2l6ZSgpCi0gICAgLy8gb2YgfGNvcHl8LgotICAgIHZvaWQgY29weUZsYXR0ZW5lZChjb25zdCBWaWRlb0ZyYW1lJiBjb3B5KSB7Ci0gICAgICAgIGNvcHlJbmZvT25seShjb3B5KTsKLQotICAgICAgICBtU2l6ZSA9IGNvcHkubVNpemU7Ci0gICAgICAgIG1EYXRhID0gTlVMTDsgIC8vIGluaXRpYWxpemUgaXQgZmlyc3QKLSAgICAgICAgaWYgKGNvcHkubVNpemUgPiAwICYmIGNvcHkubURhdGEgIT0gTlVMTCkgewotICAgICAgICAgICAgbWVtY3B5KGdldEZsYXR0ZW5lZERhdGEoKSwgY29weS5tRGF0YSwgY29weS5tU2l6ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtSWNjU2l6ZSA9IGNvcHkubUljY1NpemU7Ci0gICAgICAgIG1JY2NEYXRhID0gTlVMTDsgIC8vIGluaXRpYWxpemUgaXQgZmlyc3QKLSAgICAgICAgaWYgKGNvcHkubUljY1NpemUgPiAwICYmIGNvcHkubUljY0RhdGEgIT0gTlVMTCkgewotICAgICAgICAgICAgbWVtY3B5KGdldEZsYXR0ZW5lZEljY0RhdGEoKSwgY29weS5tSWNjRGF0YSwgY29weS5tSWNjU2l6ZSk7CisgICAgdm9pZCBpbml0KGNvbnN0IFZpZGVvRnJhbWUmIGNvcHksIGNvbnN0IHZvaWQqIGljY0RhdGEsIHNpemVfdCBpY2NTaXplKSB7CisgICAgICAgICp0aGlzID0gY29weTsKKyAgICAgICAgaWYgKG1JY2NTaXplID09IGljY1NpemUgJiYgaWNjU2l6ZSA+IDAgJiYgaWNjRGF0YSAhPSBOVUxMKSB7CisgICAgICAgICAgICBtZW1jcHkoZ2V0RmxhdHRlbmVkSWNjRGF0YSgpLCBpY2NEYXRhLCBpY2NTaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1JY2NTaXplID0gMDsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTM2LDM4ICs3NiwxNCBAQAogICAgIHVpbnQzMl90IG1IZWlnaHQ7ICAgICAgICAgIC8vIERlY29kZWQgaW1hZ2UgaGVpZ2h0IGJlZm9yZSByb3RhdGlvbgogICAgIHVpbnQzMl90IG1EaXNwbGF5V2lkdGg7ICAgIC8vIERpc3BsYXkgd2lkdGggYmVmb3JlIHJvdGF0aW9uCiAgICAgdWludDMyX3QgbURpc3BsYXlIZWlnaHQ7ICAgLy8gRGlzcGxheSBoZWlnaHQgYmVmb3JlIHJvdGF0aW9uCisgICAgdWludDMyX3QgbVRpbGVXaWR0aDsgICAgICAgLy8gVGlsZSB3aWR0aCAoMCBpZiBpbWFnZSBkb2Vzbid0IGhhdmUgZ3JpZCkKKyAgICB1aW50MzJfdCBtVGlsZUhlaWdodDsgICAgICAvLyBUaWxlIGhlaWdodCAoMCBpZiBpbWFnZSBkb2Vzbid0IGhhdmUgZ3JpZCkKICAgICBpbnQzMl90ICBtUm90YXRpb25BbmdsZTsgICAvLyBSb3RhdGlvbiBhbmdsZSwgY2xvY2t3aXNlLCBzaG91bGQgYmUgbXVsdGlwbGUgb2YgOTAKICAgICB1aW50MzJfdCBtQnl0ZXNQZXJQaXhlbDsgICAvLyBOdW1iZXIgb2YgYnl0ZXMgcGVyIHBpeGVsCiAgICAgdWludDMyX3QgbVJvd0J5dGVzOyAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIHBlciByb3cgYmVmb3JlIHJvdGF0aW9uCi0gICAgdWludDMyX3QgbVNpemU7ICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIGluIG1EYXRhCi0gICAgdWludDMyX3QgbUljY1NpemU7ICAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIGluIG1JY2NEYXRhCisgICAgdWludDMyX3QgbVNpemU7ICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIG9mIGZyYW1lIGRhdGEKKyAgICB1aW50MzJfdCBtSWNjU2l6ZTsgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgb2YgSUNDIGRhdGEKICAgICB1aW50MzJfdCBtUmVzZXJ2ZWQ7ICAgICAgICAvLyAocGFkZGluZyB0byBtYWtlIG1EYXRhIDY0LWJpdCBhbGlnbmVkKQotCi0gICAgLy8gbURhdGEgc2hvdWxkIGJlIDY0LWJpdCBhbGlnbmVkIHRvIHByZXZlbnQgYWRkaXRpb25hbCBwYWRkaW5nCi0gICAgdWludDhfdCogbURhdGE7ICAgICAgICAgICAgLy8gQWN0dWFsIGJpbmFyeSBkYXRhCi0gICAgLy8gcGFkIHN0cnVjdHVyZSBzbyBpdCdzIHRoZSBzYW1lIHNpemUgb24gNjQtYml0IGFuZCAzMi1iaXQKLSAgICBjaGFyICAgICBtUGFkZGluZ1s4IC0gc2l6ZW9mKG1EYXRhKV07Ci0KLSAgICAvLyBtSWNjRGF0YSBzaG91bGQgYmUgNjQtYml0IGFsaWduZWQgdG8gcHJldmVudCBhZGRpdGlvbmFsIHBhZGRpbmcKLSAgICB1aW50OF90KiBtSWNjRGF0YTsgICAgICAgICAgICAvLyBBY3R1YWwgYmluYXJ5IGRhdGEKLSAgICAvLyBwYWQgc3RydWN0dXJlIHNvIGl0J3MgdGhlIHNhbWUgc2l6ZSBvbiA2NC1iaXQgYW5kIDMyLWJpdAotICAgIGNoYXIgICAgIG1JY2NQYWRkaW5nWzggLSBzaXplb2YobUljY0RhdGEpXTsKLQotcHJpdmF0ZToKLSAgICAvLwotICAgIC8vIFV0aWxpdHkgbWV0aG9kcyB1c2VkIG9ubHkgd2l0aGluIFZpZGVvRnJhbWUgc3RydWN0Ci0gICAgLy8KLQotICAgIC8vIENvcHkgdGhlIGluZm9ybWF0aW9uIGZpZWxkcyBvbmx5Ci0gICAgdm9pZCBjb3B5SW5mb09ubHkoY29uc3QgVmlkZW9GcmFtZSYgY29weSkgewotICAgICAgICBtV2lkdGggPSBjb3B5Lm1XaWR0aDsKLSAgICAgICAgbUhlaWdodCA9IGNvcHkubUhlaWdodDsKLSAgICAgICAgbURpc3BsYXlXaWR0aCA9IGNvcHkubURpc3BsYXlXaWR0aDsKLSAgICAgICAgbURpc3BsYXlIZWlnaHQgPSBjb3B5Lm1EaXNwbGF5SGVpZ2h0OwotICAgICAgICBtUm90YXRpb25BbmdsZSA9IGNvcHkubVJvdGF0aW9uQW5nbGU7Ci0gICAgICAgIG1CeXRlc1BlclBpeGVsID0gY29weS5tQnl0ZXNQZXJQaXhlbDsKLSAgICAgICAgbVJvd0J5dGVzID0gY29weS5tUm93Qnl0ZXM7Ci0gICAgfQogfTsKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmR0cmlnZ2VyL09XTkVSUyBiL2luY2x1ZGUvc291bmR0cmlnZ2VyL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODNmNmI5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zb3VuZHRyaWdnZXIvT1dORVJTCkBAIC0wLDAgKzEsMiBAQAorZWxhdXJlbnRAZ29vZ2xlLmNvbQordGhvcm50b25jQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL09XTkVSUyBiL21lZGlhL09XTkVSUwppbmRleCAxNjA1ZWZkLi5kNDllYjhkIDEwMDY0NAotLS0gYS9tZWRpYS9PV05FUlMKKysrIGIvbWVkaWEvT1dORVJTCkBAIC0yLDYgKzIsNyBAQAogZHdrYW5nQGdvb2dsZS5jb20KIGVsYXVyZW50QGdvb2dsZS5jb20KIGVzc2lja0Bnb29nbGUuY29tCitoa3VhbmdAZ29vZ2xlLmNvbQogaHVuZ2FAZ29vZ2xlLmNvbQogam10cml2aUBnb29nbGUuY29tCiBrcm9jYXJkQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2F1ZGlvc2VydmVyL0FuZHJvaWQubWsgYi9tZWRpYS9hdWRpb3NlcnZlci9BbmRyb2lkLm1rCmluZGV4IDNlZTc0OTQuLjcwYzI4MWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2F1ZGlvc2VydmVyL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvQW5kcm9pZC5tawpAQCAtMyw3ICszLDggQEAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9TUkNfRklMRVMgOj0gXAotCW1haW5fYXVkaW9zZXJ2ZXIuY3BwCisJbWFpbl9hdWRpb3NlcnZlci5jcHAgXAorCS4uL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9SZWNvcmQuYWlkbAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKIAlsaWJhYXVkaW9zZXJ2aWNlIFwKQEAgLTEyLDExICsxMywxMyBAQAogCWxpYmJpbmRlciBcCiAJbGliY3V0aWxzIFwKIAlsaWJsb2cgXAorCWxpYmhpZGx0cmFuc3BvcnQgXAorCWxpYmh3YmluZGVyIFwKKwlsaWJtZWRpYSBcCiAJbGlibWVkaWFsb2dzZXJ2aWNlIFwKIAlsaWJuYmFpbyBcCiAJbGlic291bmR0cmlnZ2Vyc2VydmljZSBcCi0JbGlidXRpbHMgXAotCWxpYmh3YmluZGVyCisJbGlidXRpbHMKIAogIyBUT0RPIG9ib2VzZXJ2aWNlIGlzIHRoZSBvbGQgZm9sZGVyIG5hbWUgZm9yIGFhdWRpb3NlcnZpY2UuIEl0IHdpbGwgYmUgY2hhbmdlZC4KIExPQ0FMX0NfSU5DTFVERVMgOj0gXApAQCAtMzMsOSArMzYsMTMgQEAKIAlmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9pbmNsdWRlIFwKIAlmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9zcmMgXAogCWZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nIFwKKwlmcmFtZXdvcmtzL2F2L21lZGlhL2xpYm1lZGlhIFwKIAkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKIAlleHRlcm5hbC9zb25pYyBcCiAKK0xPQ0FMX0FJRExfSU5DTFVERVMgOj0gXAorICAgICAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwKKwogIyBJZiBBVURJT1NFUlZFUl9NVUxUSUxJQiBpbiBkZXZpY2UubWsgaXMgbm9uLWVtcHR5IHRoZW4gaXQgaXMgdXNlZCB0byBjb250cm9sCiAjIHRoZSBMT0NBTF9NVUxUSUxJQiBmb3IgYWxsIGF1ZGlvc2VydmVyIGV4Y2x1c2l2ZSBsaWJyYXJpZXMuCiAjIFRoaXMgaXMgcmVsZXZhbnQgZm9yIDY0IGJpdCBhcmNoaXRlY3R1cmVzIHdoZXJlIGVpdGhlciBvciBib3RoCmRpZmYgLS1naXQgYS9tZWRpYS9hdWRpb3NlcnZlci9PV05FUlMgYi9tZWRpYS9hdWRpb3NlcnZlci9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjljYjU2NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2F1ZGlvc2VydmVyL09XTkVSUwpAQCAtMCwwICsxIEBACitna2FzdGVuQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2F1ZGlvc2VydmVyL2F1ZGlvc2VydmVyLnJjIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvYXVkaW9zZXJ2ZXIucmMKaW5kZXggOWQ0MmJjZS4uNzU2NzVhOSAxMDA2NDQKLS0tIGEvbWVkaWEvYXVkaW9zZXJ2ZXIvYXVkaW9zZXJ2ZXIucmMKKysrIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvYXVkaW9zZXJ2ZXIucmMKQEAgLTEsMTAgKzEsMTMgQEAKIHNlcnZpY2UgYXVkaW9zZXJ2ZXIgL3N5c3RlbS9iaW4vYXVkaW9zZXJ2ZXIKLSAgICBjbGFzcyBtYWluCisgICAgY2xhc3MgY29yZQogICAgIHVzZXIgYXVkaW9zZXJ2ZXIKICAgICAjIG1lZGlhIGdpZCBuZWVkZWQgZm9yIC9kZXYvZm0gKHJhZGlvKSBhbmQgZm9yIC9kYXRhL21pc2MvbWVkaWEgKHRlZSkKICAgICBncm91cCBhdWRpbyBjYW1lcmEgZHJtcnBjIGluZXQgbWVkaWEgbWVkaWFkcm0gbmV0X2J0IG5ldF9idF9hZG1pbiBuZXRfYndfYWNjdAogICAgIGlvcHJpbyBydCA0CiAgICAgd3JpdGVwaWQgL2Rldi9jcHVzZXQvZm9yZWdyb3VuZC90YXNrcyAvZGV2L3N0dW5lL2ZvcmVncm91bmQvdGFza3MKKyAgICBvbnJlc3RhcnQgcmVzdGFydCB2ZW5kb3IuYXVkaW8taGFsLTItMAorICAgICMgS2VlcCB0aGUgb3JpZ2luYWwgc2VydmljZSBuYW1lIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdoZW4gdXBncmFkaW5nCisgICAgIyBPLU1SMSBkZXZpY2VzIHdpdGggZnJhbWV3b3JrLW9ubHkuCiAgICAgb25yZXN0YXJ0IHJlc3RhcnQgYXVkaW8taGFsLTItMAogCiBvbiBwcm9wZXJ0eTp2dHMubmF0aXZlX3NlcnZlci5vbj0xCmRpZmYgLS1naXQgYS9tZWRpYS9hdWRpb3NlcnZlci9tYWluX2F1ZGlvc2VydmVyLmNwcCBiL21lZGlhL2F1ZGlvc2VydmVyL21haW5fYXVkaW9zZXJ2ZXIuY3BwCmluZGV4IDQ3NGVmOTcuLmRiNTcyNDggMTAwNjQ0Ci0tLSBhL21lZGlhL2F1ZGlvc2VydmVyL21haW5fYXVkaW9zZXJ2ZXIuY3BwCisrKyBiL21lZGlhL2F1ZGlvc2VydmVyL21haW5fYXVkaW9zZXJ2ZXIuY3BwCkBAIC0yNSwxMiArMjUsOSBAQAogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsVHJhbnNwb3J0U3VwcG9ydC5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0vLyBGSVhNRTogcmVtb3ZlIHdoZW4gQlVHIDMxNzQ4OTk2IGlzIGZpeGVkCi0jaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDxod2JpbmRlci9Qcm9jZXNzU3RhdGUuaD4KLQogLy8gZnJvbSBMT0NBTF9DX0lOQ0xVREVTCiAjaW5jbHVkZSAiYWF1ZGlvL0FBdWRpb1Rlc3RpbmcuaCIKICNpbmNsdWRlICJBdWRpb0ZsaW5nZXIuaCIKQEAgLTM4LDEyICszNSwxOSBAQAogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2UuaCIKICNpbmNsdWRlICJ1dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oIgogI2luY2x1ZGUgIk1lZGlhTG9nU2VydmljZS5oIgorI2luY2x1ZGUgIk1lZGlhVXRpbHMuaCIKICNpbmNsdWRlICJTb3VuZFRyaWdnZXJId1NlcnZpY2UuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKIGludCBtYWluKGludCBhcmdjIF9fdW51c2VkLCBjaGFyICoqYXJndikKIHsKKyAgICAvLyBUT0RPOiB1cGRhdGUgd2l0aCByZWZpbmVkIHBhcmFtZXRlcnMKKyAgICBsaW1pdFByb2Nlc3NNZW1vcnkoCisgICAgICAgICJhdWRpby5tYXhtZW0iLCAvKiAicm8uYXVkaW8ubWF4bWVtIiwgcHJvcGVydHkgdGhhdCBkZWZpbmVzIGxpbWl0ICovCisgICAgICAgIChzaXplX3QpNTEyICogKDEgPDwgMjApLCAvKiBTSVpFX01BWCwgdXBwZXIgbGltaXQgaW4gYnl0ZXMgKi8KKyAgICAgICAgMjAgLyogdXBwZXIgbGltaXQgYXMgcGVyY2VudGFnZSBvZiBwaHlzaWNhbCBSQU0gKi8pOworCiAgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOwogCiAgICAgYm9vbCBkb0xvZyA9IChib29sKSBwcm9wZXJ0eV9nZXRfYm9vbCgicm8udGVzdF9oYXJuZXNzIiwgMCk7CkBAIC0xMjgsNiArMTMyLDcgQEAKICAgICAgICAgICAgIHByY3RsKFBSX1NFVF9QREVBVEhTSUcsIFNJR0tJTEwpOyAgIC8vIGlmIHBhcmVudCBtZWRpYS5sb2cgZGllcyBiZWZvcmUgbWUsIGtpbGwgbWUgYWxzbwogICAgICAgICAgICAgc2V0cGdpZCgwLCAwKTsgICAgICAgICAgICAgICAgICAgICAgLy8gYnV0IGlmIEkgZGllIGZpcnN0LCBkb24ndCBraWxsIG15IHBhcmVudAogICAgICAgICB9CisgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpjb25maWd1cmVScGNUaHJlYWRwb29sKDQsIGZhbHNlIC8qY2FsbGVyV2lsbEpvaW4qLyk7CiAgICAgICAgIHNwPFByb2Nlc3NTdGF0ZT4gcHJvYyhQcm9jZXNzU3RhdGU6OnNlbGYoKSk7CiAgICAgICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKICAgICAgICAgQUxPR0koIlNlcnZpY2VNYW5hZ2VyOiAlcCIsIHNtLmdldCgpKTsKQEAgLTE0NSwxMCArMTUwLDYgQEAKIAogICAgICAgICBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Omluc3RhbnRpYXRlKCk7CiAgICAgICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKLQotLy8gRklYTUU6IHJlbW92ZSB3aGVuIEJVRyAzMTc0ODk5NiBpcyBmaXhlZAotICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6UHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwotCiAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmpvaW5UaHJlYWRQb29sKCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29tbW9uX3RpbWUvT1dORVJTIGIvbWVkaWEvY29tbW9uX3RpbWUvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5Y2I1NjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb21tb25fdGltZS9PV05FUlMKQEAgLTAsMCArMSBAQAorZ2thc3RlbkBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgxNzZjZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvQW5kcm9pZC5icApAQCAtMCwwICsxLDMgQEAKK3N1YmRpcnMgPSBbCisgICAgIioiLAorXQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQUFDRXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FBQ0V4dHJhY3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZjNWE3NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FBQ0V4dHJhY3Rvci5jcHAKQEAgLTAsMCArMSw0MDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkFBQ0V4dHJhY3RvciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkFBQ0V4dHJhY3Rvci5oIgorI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBBQUNTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFjayB7CitwdWJsaWM6CisgICAgQUFDU291cmNlKAorICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKKyAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50NjRfdD4gJm9mZnNldF92ZWN0b3IsCisgICAgICAgICAgICBpbnQ2NF90IGZyYW1lX2R1cmF0aW9uX3VzKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSYpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+QUFDU291cmNlKCk7CisKK3ByaXZhdGU6CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4RnJhbWVTaXplOworICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBNZXRhRGF0YUJhc2UgbU1ldGE7CisKKyAgICBvZmY2NF90IG1PZmZzZXQ7CisgICAgaW50NjRfdCBtQ3VycmVudFRpbWVVczsKKyAgICBib29sIG1TdGFydGVkOworICAgIE1lZGlhQnVmZmVyR3JvdXAgKm1Hcm91cDsKKworICAgIFZlY3Rvcjx1aW50NjRfdD4gbU9mZnNldFZlY3RvcjsKKyAgICBpbnQ2NF90IG1GcmFtZUR1cmF0aW9uVXM7CisKKyAgICBBQUNTb3VyY2UoY29uc3QgQUFDU291cmNlICYpOworICAgIEFBQ1NvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IEFBQ1NvdXJjZSAmKTsKK307CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIFJldHVybnMgdGhlIHNhbXBsZSByYXRlIGJhc2VkIG9uIHRoZSBzYW1wbGluZyBmcmVxdWVuY3kgaW5kZXgKK3VpbnQzMl90IGdldF9zYW1wbGVfcmF0ZShjb25zdCB1aW50OF90IHNmX2luZGV4KQoreworICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBzYW1wbGVfcmF0ZXNbXSA9CisgICAgeworICAgICAgICA5NjAwMCwgODgyMDAsIDY0MDAwLCA0ODAwMCwgNDQxMDAsIDMyMDAwLAorICAgICAgICAyNDAwMCwgMjIwNTAsIDE2MDAwLCAxMjAwMCwgMTEwMjUsIDgwMDAKKyAgICB9OworCisgICAgaWYgKHNmX2luZGV4IDwgc2l6ZW9mKHNhbXBsZV9yYXRlcykgLyBzaXplb2Yoc2FtcGxlX3JhdGVzWzBdKSkgeworICAgICAgICByZXR1cm4gc2FtcGxlX3JhdGVzW3NmX2luZGV4XTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLy8gUmV0dXJucyB0aGUgZnJhbWUgbGVuZ3RoIGluIGJ5dGVzIGFzIGRlc2NyaWJlZCBpbiBhbiBBRFRTIGhlYWRlciBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gb2Zmc2V0LAorLy8gICAgIG9yIDAgaWYgdGhlIHNpemUgY2FuJ3QgYmUgcmVhZCBkdWUgdG8gYW4gZXJyb3IgaW4gdGhlIGhlYWRlciBvciBhIHJlYWQgZmFpbHVyZS4KKy8vIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyB0aGUgQUFDIGZyYW1lIHNpemUgd2l0aCB0aGUgQURUUyBoZWFkZXIgbGVuZ3RoIChyZWdhcmRsZXNzIG9mCisvLyAgICAgdGhlIHByZXNlbmNlIG9mIHRoZSBDUkMpLgorLy8gSWYgaGVhZGVyU2l6ZSBpcyBub24tTlVMTCwgaXQgd2lsbCBiZSB1c2VkIHRvIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgaGVhZGVyIG9mIHRoaXMgQURUUyBmcmFtZS4KK3N0YXRpYyBzaXplX3QgZ2V0QWR0c0ZyYW1lTGVuZ3RoKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3QqIGhlYWRlclNpemUpIHsKKworICAgIGNvbnN0IHNpemVfdCBrQWR0c0hlYWRlckxlbmd0aE5vQ3JjID0gNzsKKyAgICBjb25zdCBzaXplX3Qga0FkdHNIZWFkZXJMZW5ndGhXaXRoQ3JjID0gOTsKKworICAgIHNpemVfdCBmcmFtZVNpemUgPSAwOworCisgICAgdWludDhfdCBzeW5jd29yZFsyXTsKKyAgICBpZiAoc291cmNlLT5yZWFkQXQob2Zmc2V0LCAmc3luY3dvcmQsIDIpICE9IDIpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICgoc3luY3dvcmRbMF0gIT0gMHhmZikgfHwgKChzeW5jd29yZFsxXSAmIDB4ZjYpICE9IDB4ZjApKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHVpbnQ4X3QgcHJvdGVjdGlvbkFic2VudDsKKyAgICBpZiAoc291cmNlLT5yZWFkQXQob2Zmc2V0ICsgMSwgJnByb3RlY3Rpb25BYnNlbnQsIDEpIDwgMSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcHJvdGVjdGlvbkFic2VudCAmPSAweDE7CisKKyAgICB1aW50OF90IGhlYWRlclszXTsKKyAgICBpZiAoc291cmNlLT5yZWFkQXQob2Zmc2V0ICsgMywgJmhlYWRlciwgMykgPCAzKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGZyYW1lU2l6ZSA9IChoZWFkZXJbMF0gJiAweDMpIDw8IDExIHwgaGVhZGVyWzFdIDw8IDMgfCBoZWFkZXJbMl0gPj4gNTsKKworICAgIC8vIHByb3RlY3Rpb25BYnNlbnQgaXMgMCBpZiB0aGVyZSBpcyBDUkMKKyAgICBzaXplX3QgaGVhZFNpemUgPSBwcm90ZWN0aW9uQWJzZW50ID8ga0FkdHNIZWFkZXJMZW5ndGhOb0NyYyA6IGtBZHRzSGVhZGVyTGVuZ3RoV2l0aENyYzsKKyAgICBpZiAoaGVhZFNpemUgPiBmcmFtZVNpemUpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChoZWFkZXJTaXplICE9IE5VTEwpIHsKKyAgICAgICAgKmhlYWRlclNpemUgPSBoZWFkU2l6ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZnJhbWVTaXplOworfQorCitBQUNFeHRyYWN0b3I6OkFBQ0V4dHJhY3RvcigKKyAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgb2ZmNjRfdCBvZmZzZXQpCisgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAorICAgICAgbUluaXRDaGVjayhOT19JTklUKSwKKyAgICAgIG1GcmFtZUR1cmF0aW9uVXMoMCkgeworCisgICAgdWludDhfdCBwcm9maWxlLCBzZl9pbmRleCwgY2hhbm5lbCwgaGVhZGVyWzJdOworICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCArIDIsICZoZWFkZXIsIDIpIDwgMikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcHJvZmlsZSA9IChoZWFkZXJbMF0gPj4gNikgJiAweDM7CisgICAgc2ZfaW5kZXggPSAoaGVhZGVyWzBdID4+IDIpICYgMHhmOworICAgIHVpbnQzMl90IHNyID0gZ2V0X3NhbXBsZV9yYXRlKHNmX2luZGV4KTsKKyAgICBpZiAoc3IgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNoYW5uZWwgPSAoaGVhZGVyWzBdICYgMHgxKSA8PCAyIHwgKGhlYWRlclsxXSA+PiA2KTsKKworICAgIE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YShtTWV0YSwgcHJvZmlsZSwgc2ZfaW5kZXgsIGNoYW5uZWwpOworCisgICAgb2ZmNjRfdCBzdHJlYW1TaXplLCBudW1GcmFtZXMgPSAwOworICAgIHNpemVfdCBmcmFtZVNpemUgPSAwOworICAgIGludDY0X3QgZHVyYXRpb24gPSAwOworCisgICAgaWYgKG1EYXRhU291cmNlLT5nZXRTaXplKCZzdHJlYW1TaXplKSA9PSBPSykgeworICAgICAgICAgd2hpbGUgKG9mZnNldCA8IHN0cmVhbVNpemUpIHsKKyAgICAgICAgICAgIGlmICgoZnJhbWVTaXplID0gZ2V0QWR0c0ZyYW1lTGVuZ3RoKHNvdXJjZSwgb2Zmc2V0LCBOVUxMKSkgPT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJwcmVtYXR1cmVkIEFBQyBzdHJlYW0gKCVsbGQgdnMgJWxsZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylvZmZzZXQsIChsb25nIGxvbmcpc3RyZWFtU2l6ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1PZmZzZXRWZWN0b3IucHVzaChvZmZzZXQpOworCisgICAgICAgICAgICBvZmZzZXQgKz0gZnJhbWVTaXplOworICAgICAgICAgICAgbnVtRnJhbWVzICsrOworICAgICAgICB9CisKKyAgICAgICAgLy8gUm91bmQgdXAgYW5kIGdldCB0aGUgZHVyYXRpb24KKyAgICAgICAgbUZyYW1lRHVyYXRpb25VcyA9ICgxMDI0ICogMTAwMDAwMGxsICsgKHNyIC0gMSkpIC8gc3I7CisgICAgICAgIGR1cmF0aW9uID0gbnVtRnJhbWVzICogbUZyYW1lRHVyYXRpb25VczsKKyAgICAgICAgbU1ldGEuc2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvbik7CisgICAgfQorCisgICAgbUluaXRDaGVjayA9IE9LOworfQorCitBQUNFeHRyYWN0b3I6On5BQUNFeHRyYWN0b3IoKSB7Cit9CisKK3N0YXR1c190IEFBQ0V4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhKSB7CisgICAgbWV0YS5jbGVhcigpOworICAgIGlmIChtSW5pdENoZWNrID09IE9LKSB7CisgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3NpemVfdCBBQUNFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgeworICAgIHJldHVybiBtSW5pdENoZWNrID09IE9LID8gMSA6IDA7Cit9CisKK01lZGlhVHJhY2sgKkFBQ0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggIT0gMCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3IEFBQ1NvdXJjZShtRGF0YVNvdXJjZSwgbU1ldGEsIG1PZmZzZXRWZWN0b3IsIG1GcmFtZUR1cmF0aW9uVXMpOworfQorCitzdGF0dXNfdCBBQUNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggIT0gMCkgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBtZXRhID0gbU1ldGE7CisgICAgcmV0dXJuIE9LOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyA4MTkyID0gMl4xMywgMTNiaXQgQUFDIGZyYW1lIHNpemUgKGluIGJ5dGVzKQorY29uc3Qgc2l6ZV90IEFBQ1NvdXJjZTo6a01heEZyYW1lU2l6ZSA9IDgxOTI7CisKK0FBQ1NvdXJjZTo6QUFDU291cmNlKAorICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50NjRfdD4gJm9mZnNldF92ZWN0b3IsCisgICAgICAgIGludDY0X3QgZnJhbWVfZHVyYXRpb25fdXMpCisgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAorICAgICAgbU1ldGEobWV0YSksCisgICAgICBtT2Zmc2V0KDApLAorICAgICAgbUN1cnJlbnRUaW1lVXMoMCksCisgICAgICBtU3RhcnRlZChmYWxzZSksCisgICAgICBtR3JvdXAoTlVMTCksCisgICAgICBtT2Zmc2V0VmVjdG9yKG9mZnNldF92ZWN0b3IpLAorICAgICAgbUZyYW1lRHVyYXRpb25VcyhmcmFtZV9kdXJhdGlvbl91cykgeworfQorCitBQUNTb3VyY2U6On5BQUNTb3VyY2UoKSB7CisgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIHN0b3AoKTsKKyAgICB9Cit9CisKK3N0YXR1c190IEFBQ1NvdXJjZTo6c3RhcnQoTWV0YURhdGFCYXNlICogLyogcGFyYW1zICovKSB7CisgICAgQ0hFQ0soIW1TdGFydGVkKTsKKworICAgIGlmIChtT2Zmc2V0VmVjdG9yLmVtcHR5KCkpIHsKKyAgICAgICAgbU9mZnNldCA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbU9mZnNldCA9IG1PZmZzZXRWZWN0b3IuaXRlbUF0KDApOworICAgIH0KKworICAgIG1DdXJyZW50VGltZVVzID0gMDsKKyAgICBtR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cDsKKyAgICBtR3JvdXAtPmFkZF9idWZmZXIoTWVkaWFCdWZmZXJCYXNlOjpDcmVhdGUoa01heEZyYW1lU2l6ZSkpOworICAgIG1TdGFydGVkID0gdHJ1ZTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQUFDU291cmNlOjpzdG9wKCkgeworICAgIENIRUNLKG1TdGFydGVkKTsKKworICAgIGRlbGV0ZSBtR3JvdXA7CisgICAgbUdyb3VwID0gTlVMTDsKKworICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBQUNTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKKyAgICBtZXRhID0gbU1ldGE7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBQUNTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKyAgICAqb3V0ID0gTlVMTDsKKworICAgIGludDY0X3Qgc2Vla1RpbWVVczsKKyAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKKyAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSkgeworICAgICAgICBpZiAobUZyYW1lRHVyYXRpb25VcyA+IDApIHsKKyAgICAgICAgICAgIGludDY0X3Qgc2Vla0ZyYW1lID0gc2Vla1RpbWVVcyAvIG1GcmFtZUR1cmF0aW9uVXM7CisgICAgICAgICAgICBpZiAoc2Vla0ZyYW1lIDwgMCB8fCBzZWVrRnJhbWUgPj0gKGludDY0X3QpbU9mZnNldFZlY3Rvci5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjcwMjM5NTA3Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DdXJyZW50VGltZVVzID0gc2Vla0ZyYW1lICogbUZyYW1lRHVyYXRpb25VczsKKworICAgICAgICAgICAgbU9mZnNldCA9IG1PZmZzZXRWZWN0b3IuaXRlbUF0KHNlZWtGcmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzaXplX3QgZnJhbWVTaXplLCBmcmFtZVNpemVXaXRob3V0SGVhZGVyLCBoZWFkZXJTaXplOworICAgIGlmICgoZnJhbWVTaXplID0gZ2V0QWR0c0ZyYW1lTGVuZ3RoKG1EYXRhU291cmNlLCBtT2Zmc2V0LCAmaGVhZGVyU2l6ZSkpID09IDApIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgfQorCisgICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXI7CisgICAgc3RhdHVzX3QgZXJyID0gbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgZnJhbWVTaXplV2l0aG91dEhlYWRlciA9IGZyYW1lU2l6ZSAtIGhlYWRlclNpemU7CisgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQobU9mZnNldCArIGhlYWRlclNpemUsIGJ1ZmZlci0+ZGF0YSgpLAorICAgICAgICAgICAgICAgIGZyYW1lU2l6ZVdpdGhvdXRIZWFkZXIpICE9IChzc2l6ZV90KWZyYW1lU2l6ZVdpdGhvdXRIZWFkZXIpIHsKKyAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgIGJ1ZmZlciA9IE5VTEw7CisKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKworICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIGZyYW1lU2l6ZVdpdGhvdXRIZWFkZXIpOworICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIG1DdXJyZW50VGltZVVzKTsKKyAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CisKKyAgICBtT2Zmc2V0ICs9IGZyYW1lU2l6ZTsKKyAgICBtQ3VycmVudFRpbWVVcyArPSBtRnJhbWVEdXJhdGlvblVzOworCisgICAgKm91dCA9IGJ1ZmZlcjsKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyBNZWRpYUV4dHJhY3RvciogQ3JlYXRlRXh0cmFjdG9yKAorICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorICAgICAgICB2b2lkICptZXRhKSB7CisgICAgb2ZmNjRfdCBvZmZzZXQgPSAqc3RhdGljX2Nhc3Q8b2ZmNjRfdCo+KG1ldGEpOworICAgIHJldHVybiBuZXcgQUFDRXh0cmFjdG9yKHNvdXJjZSwgb2Zmc2V0KTsKK30KKworc3RhdGljIE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyBTbmlmZigKKyAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UsIHZvaWQgKiptZXRhLAorICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICpmcmVlTWV0YSkgeworICAgIG9mZjY0X3QgcG9zID0gMDsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgdWludDhfdCBpZDNoZWFkZXJbMTBdOworICAgICAgICBpZiAoc291cmNlLT5yZWFkQXQocG9zLCBpZDNoZWFkZXIsIHNpemVvZihpZDNoZWFkZXIpKQorICAgICAgICAgICAgICAgIDwgKHNzaXplX3Qpc2l6ZW9mKGlkM2hlYWRlcikpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1lbWNtcCgiSUQzIiwgaWQzaGVhZGVyLCAzKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBTa2lwIHRoZSBJRDN2MiBoZWFkZXIuCisKKyAgICAgICAgc2l6ZV90IGxlbiA9CisgICAgICAgICAgICAoKGlkM2hlYWRlcls2XSAmIDB4N2YpIDw8IDIxKQorICAgICAgICAgICAgfCAoKGlkM2hlYWRlcls3XSAmIDB4N2YpIDw8IDE0KQorICAgICAgICAgICAgfCAoKGlkM2hlYWRlcls4XSAmIDB4N2YpIDw8IDcpCisgICAgICAgICAgICB8IChpZDNoZWFkZXJbOV0gJiAweDdmKTsKKworICAgICAgICBsZW4gKz0gMTA7CisKKyAgICAgICAgcG9zICs9IGxlbjsKKworICAgICAgICBBTE9HVigic2tpcHBlZCBJRDMgdGFnLCBuZXcgc3RhcnRpbmcgb2Zmc2V0IGlzICVsbGQgKDB4JTAxNmxseCkiLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpcG9zLCAobG9uZyBsb25nKXBvcyk7CisgICAgfQorCisgICAgdWludDhfdCBoZWFkZXJbMl07CisKKyAgICBpZiAoc291cmNlLT5yZWFkQXQocG9zLCAmaGVhZGVyLCAyKSAhPSAyKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8vIEFEVFMgc3luY3dvcmQKKyAgICBpZiAoKGhlYWRlclswXSA9PSAweGZmKSAmJiAoKGhlYWRlclsxXSAmIDB4ZjYpID09IDB4ZjApKSB7CisgICAgICAgICpjb25maWRlbmNlID0gMC4yOworCisgICAgICAgIG9mZjY0X3QgKm9mZlB0ciA9IChvZmY2NF90KikgbWFsbG9jKHNpemVvZihvZmY2NF90KSk7CisgICAgICAgICpvZmZQdHIgPSBwb3M7CisgICAgICAgICptZXRhID0gb2ZmUHRyOworICAgICAgICAqZnJlZU1ldGEgPSA6OmZyZWU7CisKKyAgICAgICAgcmV0dXJuIENyZWF0ZUV4dHJhY3RvcjsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworCitleHRlcm4gIkMiIHsKKy8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKK19fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKK01lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgeworICAgIHJldHVybiB7CisgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTiwKKyAgICAgICAgVVVJRCgiNGZkODBlYWUtMDNkMi00ZDcyLTllYjktNDhmYTZiYjU0NjEzIiksCisgICAgICAgIDEsIC8vIHZlcnNpb24KKyAgICAgICAgIkFBQyBFeHRyYWN0b3IiLAorICAgICAgICBTbmlmZgorICAgIH07Cit9CisKK30gLy8gZXh0ZXJuICJDIgorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9BQUNFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FBQ0V4dHJhY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYWRiZWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2FhYy9BQUNFeHRyYWN0b3IuaApAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBQUNfRVhUUkFDVE9SX0hfCisKKyNkZWZpbmUgQUFDX0VYVFJBQ1RPUl9IXworCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KKworI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBTWVzc2FnZTsKK2NsYXNzIFN0cmluZzg7CisKK2NsYXNzIEFBQ0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7CitwdWJsaWM6CisgICAgQUFDRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIG9mZjY0X3Qgb2Zmc2V0KTsKKworICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOworICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiQUFDRXh0cmFjdG9yIjsgfQorCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+QUFDRXh0cmFjdG9yKCk7CisKK3ByaXZhdGU6CisgICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIE1ldGFEYXRhQmFzZSBtTWV0YTsKKyAgICBzdGF0dXNfdCBtSW5pdENoZWNrOworCisgICAgVmVjdG9yPHVpbnQ2NF90PiBtT2Zmc2V0VmVjdG9yOworICAgIGludDY0X3QgbUZyYW1lRHVyYXRpb25VczsKKworICAgIEFBQ0V4dHJhY3Rvcihjb25zdCBBQUNFeHRyYWN0b3IgJik7CisgICAgQUFDRXh0cmFjdG9yICZvcGVyYXRvcj0oY29uc3QgQUFDRXh0cmFjdG9yICYpOworfTsKKworYm9vbCBTbmlmZkFBQygKKyAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlLCBvZmY2NF90ICpvZmZzZXQpOworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFBQ19FWFRSQUNUT1JfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL2FhYy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMDViNDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2FhYy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDMgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKworICAgIHNyY3M6IFsiQUFDRXh0cmFjdG9yLmNwcCJdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0LyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tZXRhZGF0YXV0aWxzIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgbmFtZTogImxpYmFhY2V4dHJhY3RvciIsCisgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAiZXh0cmFjdG9ycyIsCisKKyAgICBjb21waWxlX211bHRpbGliOiAiZmlyc3QiLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAorICAgIF0sCisgICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBkaWFnOiB7CisgICAgICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIH0sCisgICAgfSwKKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9leHRyYWN0b3JzL2FhYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpyZW5hbWUgdG8gbWVkaWEvZXh0cmFjdG9ycy9hYWMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL05PVElDRSBiL21lZGlhL2V4dHJhY3RvcnMvYWFjL05PVElDRQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL05PVElDRQpyZW5hbWUgdG8gbWVkaWEvZXh0cmFjdG9ycy9hYWMvTk9USUNFCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9leHBvcnRzLmxkcyBiL21lZGlhL2V4dHJhY3RvcnMvYWFjL2V4cG9ydHMubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMzA5ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2FhYy9leHBvcnRzLmxkcwpAQCAtMCwwICsxIEBACit7IGdsb2JhbDogR0VURVhUUkFDVE9SREVGOyBsb2NhbDogKjsgfTsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FNUkV4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL2Ftci9BTVJFeHRyYWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NmQ1ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Ftci9BTVJFeHRyYWN0b3IuY3BwCkBAIC0wLDAgKzEsMzkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJBTVJFeHRyYWN0b3IiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJBTVJFeHRyYWN0b3IuaCIKKworI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQU1SU291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworcHVibGljOgorICAgIEFNUlNvdXJjZSgKKyAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCisgICAgICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgICAgICBib29sIGlzV2lkZSwKKyAgICAgICAgICAgIGNvbnN0IG9mZjY0X3QgKm9mZnNldF90YWJsZSwKKyAgICAgICAgICAgIHNpemVfdCBvZmZzZXRfdGFibGVfbGVuZ3RoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkFNUlNvdXJjZSgpOworCitwcml2YXRlOgorICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBNZXRhRGF0YUJhc2UgbU1ldGE7CisgICAgYm9vbCBtSXNXaWRlOworCisgICAgb2ZmNjRfdCBtT2Zmc2V0OworICAgIGludDY0X3QgbUN1cnJlbnRUaW1lVXM7CisgICAgYm9vbCBtU3RhcnRlZDsKKyAgICBNZWRpYUJ1ZmZlckdyb3VwICptR3JvdXA7CisKKyAgICBvZmY2NF90IG1PZmZzZXRUYWJsZVtPRkZTRVRfVEFCTEVfTEVOXTsKKyAgICBzaXplX3QgbU9mZnNldFRhYmxlTGVuZ3RoOworCisgICAgQU1SU291cmNlKGNvbnN0IEFNUlNvdXJjZSAmKTsKKyAgICBBTVJTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBBTVJTb3VyY2UgJik7Cit9OworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgc2l6ZV90IGdldEZyYW1lU2l6ZShib29sIGlzV2lkZSwgdW5zaWduZWQgRlQpIHsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtGcmFtZVNpemVOQlsxNl0gPSB7CisgICAgICAgIDk1LCAxMDMsIDExOCwgMTM0LCAxNDgsIDE1OSwgMjA0LCAyNDQsCisgICAgICAgIDM5LCA0MywgMzgsIDM3LCAvLyBTSUQKKyAgICAgICAgMCwgMCwgMCwgLy8gZnV0dXJlIHVzZQorICAgICAgICAwIC8vIG5vIGRhdGEKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0ZyYW1lU2l6ZVdCWzE2XSA9IHsKKyAgICAgICAgMTMyLCAxNzcsIDI1MywgMjg1LCAzMTcsIDM2NSwgMzk3LCA0NjEsIDQ3NywKKyAgICAgICAgNDAsIC8vIFNJRAorICAgICAgICAwLCAwLCAwLCAwLCAvLyBmdXR1cmUgdXNlCisgICAgICAgIDAsIC8vIHNwZWVjaCBsb3N0CisgICAgICAgIDAgLy8gbm8gZGF0YQorICAgIH07CisKKyAgICBpZiAoRlQgPiAxNSB8fCAoaXNXaWRlICYmIEZUID4gOSAmJiBGVCA8IDE0KSB8fCAoIWlzV2lkZSAmJiBGVCA+IDExICYmIEZUIDwgMTUpKSB7CisgICAgICAgIEFMT0dFKCJpbGxlZ2FsIEFNUiBmcmFtZSB0eXBlICVkIiwgRlQpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBzaXplX3QgZnJhbWVTaXplID0gaXNXaWRlID8ga0ZyYW1lU2l6ZVdCW0ZUXSA6IGtGcmFtZVNpemVOQltGVF07CisKKyAgICAvLyBSb3VuZCB1cCBiaXRzIHRvIGJ5dGVzIGFuZCBhZGQgMSBmb3IgdGhlIGhlYWRlciBieXRlLgorICAgIGZyYW1lU2l6ZSA9IChmcmFtZVNpemUgKyA3KSAvIDggKyAxOworCisgICAgcmV0dXJuIGZyYW1lU2l6ZTsKK30KKworc3RhdGljIHN0YXR1c190IGdldEZyYW1lU2l6ZUJ5T2Zmc2V0KERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCisgICAgICAgIG9mZjY0X3Qgb2Zmc2V0LCBib29sIGlzV2lkZSwgc2l6ZV90ICpmcmFtZVNpemUpIHsKKyAgICB1aW50OF90IGhlYWRlcjsKKyAgICBzc2l6ZV90IGNvdW50ID0gc291cmNlLT5yZWFkQXQob2Zmc2V0LCAmaGVhZGVyLCAxKTsKKyAgICBpZiAoY291bnQgPT0gMCkgeworICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICB9IGVsc2UgaWYgKGNvdW50IDwgMCkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorCisgICAgdW5zaWduZWQgRlQgPSAoaGVhZGVyID4+IDMpICYgMHgwZjsKKworICAgICpmcmFtZVNpemUgPSBnZXRGcmFtZVNpemUoaXNXaWRlLCBGVCk7CisgICAgaWYgKCpmcmFtZVNpemUgPT0gMCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXRpYyBib29sIFNuaWZmQU1SKAorICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBib29sICppc1dpZGUsIGZsb2F0ICpjb25maWRlbmNlKSB7CisgICAgY2hhciBoZWFkZXJbOV07CisKKyAgICBpZiAoc291cmNlLT5yZWFkQXQoMCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkgIT0gc2l6ZW9mKGhlYWRlcikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghbWVtY21wKGhlYWRlciwgIiMhQU1SXG4iLCA2KSkgeworICAgICAgICBpZiAoaXNXaWRlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICppc1dpZGUgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAqY29uZmlkZW5jZSA9IDAuNTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKCFtZW1jbXAoaGVhZGVyLCAiIyFBTVItV0JcbiIsIDkpKSB7CisgICAgICAgIGlmIChpc1dpZGUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgKmlzV2lkZSA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgKmNvbmZpZGVuY2UgPSAwLjU7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitBTVJFeHRyYWN0b3I6OkFNUkV4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKQorICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKKyAgICAgIG1Jbml0Q2hlY2soTk9fSU5JVCksCisgICAgICBtT2Zmc2V0VGFibGVMZW5ndGgoMCkgeworICAgIGZsb2F0IGNvbmZpZGVuY2U7CisgICAgaWYgKCFTbmlmZkFNUihtRGF0YVNvdXJjZSwgJm1Jc1dpZGUsICZjb25maWRlbmNlKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbU1ldGEuc2V0Q1N0cmluZygKKyAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwgbUlzV2lkZSA/IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CKTsKKworICAgIG1NZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIDEpOworICAgIG1NZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBtSXNXaWRlID8gMTYwMDAgOiA4MDAwKTsKKworICAgIG9mZjY0X3Qgb2Zmc2V0ID0gbUlzV2lkZSA/IDkgOiA2OworICAgIG9mZjY0X3Qgc3RyZWFtU2l6ZTsKKyAgICBzaXplX3QgZnJhbWVTaXplLCBudW1GcmFtZXMgPSAwOworICAgIGludDY0X3QgZHVyYXRpb24gPSAwOworCisgICAgaWYgKG1EYXRhU291cmNlLT5nZXRTaXplKCZzdHJlYW1TaXplKSA9PSBPSykgeworICAgICAgICAgd2hpbGUgKG9mZnNldCA8IHN0cmVhbVNpemUpIHsKKyAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRGcmFtZVNpemVCeU9mZnNldChzb3VyY2UsIG9mZnNldCwgbUlzV2lkZSwgJmZyYW1lU2l6ZSk7CisgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKG51bUZyYW1lcyAlIDUwID09IDApICYmIChudW1GcmFtZXMgLyA1MCA8IE9GRlNFVF9UQUJMRV9MRU4pKSB7CisgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobU9mZnNldFRhYmxlTGVuZ3RoLCBudW1GcmFtZXMgLyA1MCk7CisgICAgICAgICAgICAgICAgbU9mZnNldFRhYmxlW21PZmZzZXRUYWJsZUxlbmd0aF0gPSBvZmZzZXQgLSAobUlzV2lkZSA/IDk6IDYpOworICAgICAgICAgICAgICAgIG1PZmZzZXRUYWJsZUxlbmd0aCArKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb2Zmc2V0ICs9IGZyYW1lU2l6ZTsKKyAgICAgICAgICAgIGR1cmF0aW9uICs9IDIwMDAwOyAgLy8gRWFjaCBmcmFtZSBpcyAyMG1zCisgICAgICAgICAgICBudW1GcmFtZXMgKys7CisgICAgICAgIH0KKworICAgICAgICBtTWV0YS5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uKTsKKyAgICB9CisKKyAgICBtSW5pdENoZWNrID0gT0s7Cit9CisKK0FNUkV4dHJhY3Rvcjo6fkFNUkV4dHJhY3RvcigpIHsKK30KKworc3RhdHVzX3QgQU1SRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpIHsKKyAgICBtZXRhLmNsZWFyKCk7CisKKyAgICBpZiAobUluaXRDaGVjayA9PSBPSykgeworICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBtSXNXaWRlID8gImF1ZGlvL2Ftci13YiIgOiAiYXVkaW8vYW1yIik7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzaXplX3QgQU1SRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpIHsKKyAgICByZXR1cm4gbUluaXRDaGVjayA9PSBPSyA/IDEgOiAwOworfQorCitNZWRpYVRyYWNrICpBTVJFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ICE9IDApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIG5ldyBBTVJTb3VyY2UobURhdGFTb3VyY2UsIG1NZXRhLCBtSXNXaWRlLAorICAgICAgICAgICAgbU9mZnNldFRhYmxlLCBtT2Zmc2V0VGFibGVMZW5ndGgpOworfQorCitzdGF0dXNfdCBBTVJFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggIT0gMCkgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBtZXRhID0gbU1ldGE7CisgICAgcmV0dXJuIE9LOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitBTVJTb3VyY2U6OkFNUlNvdXJjZSgKKyAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgTWV0YURhdGFCYXNlICZtZXRhLAorICAgICAgICBib29sIGlzV2lkZSwgY29uc3Qgb2ZmNjRfdCAqb2Zmc2V0X3RhYmxlLCBzaXplX3Qgb2Zmc2V0X3RhYmxlX2xlbmd0aCkKKyAgICA6IG1EYXRhU291cmNlKHNvdXJjZSksCisgICAgICBtTWV0YShtZXRhKSwKKyAgICAgIG1Jc1dpZGUoaXNXaWRlKSwKKyAgICAgIG1PZmZzZXQobUlzV2lkZSA/IDkgOiA2KSwKKyAgICAgIG1DdXJyZW50VGltZVVzKDApLAorICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAorICAgICAgbUdyb3VwKE5VTEwpLAorICAgICAgbU9mZnNldFRhYmxlTGVuZ3RoKG9mZnNldF90YWJsZV9sZW5ndGgpIHsKKyAgICBpZiAobU9mZnNldFRhYmxlTGVuZ3RoID4gMCAmJiBtT2Zmc2V0VGFibGVMZW5ndGggPD0gT0ZGU0VUX1RBQkxFX0xFTikgeworICAgICAgICBtZW1jcHkgKChjaGFyKiltT2Zmc2V0VGFibGUsIChjaGFyKilvZmZzZXRfdGFibGUsIHNpemVvZihvZmY2NF90KSAqIG1PZmZzZXRUYWJsZUxlbmd0aCk7CisgICAgfQorfQorCitBTVJTb3VyY2U6On5BTVJTb3VyY2UoKSB7CisgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIHN0b3AoKTsKKyAgICB9Cit9CisKK3N0YXR1c190IEFNUlNvdXJjZTo6c3RhcnQoTWV0YURhdGFCYXNlICogLyogcGFyYW1zICovKSB7CisgICAgQ0hFQ0soIW1TdGFydGVkKTsKKworICAgIG1PZmZzZXQgPSBtSXNXaWRlID8gOSA6IDY7CisgICAgbUN1cnJlbnRUaW1lVXMgPSAwOworICAgIG1Hcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwOworICAgIG1Hcm91cC0+YWRkX2J1ZmZlcihNZWRpYUJ1ZmZlckJhc2U6OkNyZWF0ZSgxMjgpKTsKKyAgICBtU3RhcnRlZCA9IHRydWU7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEFNUlNvdXJjZTo6c3RvcCgpIHsKKyAgICBDSEVDSyhtU3RhcnRlZCk7CisKKyAgICBkZWxldGUgbUdyb3VwOworICAgIG1Hcm91cCA9IE5VTEw7CisKKyAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQU1SU291cmNlOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKSB7CisgICAgbWV0YSA9IG1NZXRhOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQU1SU291cmNlOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CisgICAgKm91dCA9IE5VTEw7CisKKyAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CisgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7CisgICAgaWYgKG1PZmZzZXRUYWJsZUxlbmd0aCA+IDAgJiYgb3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSkgeworICAgICAgICBzaXplX3Qgc2l6ZTsKKyAgICAgICAgaW50NjRfdCBzZWVrRnJhbWUgPSBzZWVrVGltZVVzIC8gMjAwMDBsbDsgIC8vIDIwbXMgcGVyIGZyYW1lLgorICAgICAgICBtQ3VycmVudFRpbWVVcyA9IHNlZWtGcmFtZSAqIDIwMDAwbGw7CisKKyAgICAgICAgc2l6ZV90IGluZGV4ID0gc2Vla0ZyYW1lIDwgMCA/IDAgOiBzZWVrRnJhbWUgLyA1MDsKKyAgICAgICAgaWYgKGluZGV4ID49IG1PZmZzZXRUYWJsZUxlbmd0aCkgeworICAgICAgICAgICAgaW5kZXggPSBtT2Zmc2V0VGFibGVMZW5ndGggLSAxOworICAgICAgICB9CisKKyAgICAgICAgbU9mZnNldCA9IG1PZmZzZXRUYWJsZVtpbmRleF0gKyAobUlzV2lkZSA/IDkgOiA2KTsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaTwgc2Vla0ZyYW1lIC0gaW5kZXggKiA1MDsgaSsrKSB7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnI7CisgICAgICAgICAgICBpZiAoKGVyciA9IGdldEZyYW1lU2l6ZUJ5T2Zmc2V0KG1EYXRhU291cmNlLCBtT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Jc1dpZGUsICZzaXplKSkgIT0gT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU9mZnNldCArPSBzaXplOworICAgICAgICB9CisgICAgfQorCisgICAgdWludDhfdCBoZWFkZXI7CisgICAgc3NpemVfdCBuID0gbURhdGFTb3VyY2UtPnJlYWRBdChtT2Zmc2V0LCAmaGVhZGVyLCAxKTsKKworICAgIGlmIChuIDwgMSkgeworICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICB9CisKKyAgICBpZiAoaGVhZGVyICYgMHg4MykgeworICAgICAgICAvLyBQYWRkaW5nIGJpdHMgbXVzdCBiZSAwLgorCisgICAgICAgIEFMT0dFKCJwYWRkaW5nIGJpdHMgbXVzdCBiZSAwLCBoZWFkZXIgaXMgMHglMDJ4IiwgaGVhZGVyKTsKKworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHVuc2lnbmVkIEZUID0gKGhlYWRlciA+PiAzKSAmIDB4MGY7CisKKyAgICBzaXplX3QgZnJhbWVTaXplID0gZ2V0RnJhbWVTaXplKG1Jc1dpZGUsIEZUKTsKKyAgICBpZiAoZnJhbWVTaXplID09IDApIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcjsKKyAgICBzdGF0dXNfdCBlcnIgPSBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBuID0gbURhdGFTb3VyY2UtPnJlYWRBdChtT2Zmc2V0LCBidWZmZXItPmRhdGEoKSwgZnJhbWVTaXplKTsKKworICAgIGlmIChuICE9IChzc2l6ZV90KWZyYW1lU2l6ZSkgeworICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgYnVmZmVyID0gTlVMTDsKKworICAgICAgICBpZiAobiA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIG9ubHkgcGFydGlhbCBmcmFtZSBpcyBhdmFpbGFibGUsIHRyZWF0IGl0IGFzIEVPUy4KKyAgICAgICAgICAgIG1PZmZzZXQgKz0gbjsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICB9CisgICAgfQorCisgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgZnJhbWVTaXplKTsKKyAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCBtQ3VycmVudFRpbWVVcyk7CisgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworCisgICAgbU9mZnNldCArPSBmcmFtZVNpemU7CisgICAgbUN1cnJlbnRUaW1lVXMgKz0gMjAwMDA7ICAvLyBFYWNoIGZyYW1lIGlzIDIwbXMKKworICAgICpvdXQgPSBidWZmZXI7CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2V4dGVybiAiQyIgeworLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAorX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQorTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CisgICAgcmV0dXJuIHsKKyAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkVYVFJBQ1RPUkRFRl9WRVJTSU9OLAorICAgICAgICBVVUlEKCJjODY2MzljOS0yZjMxLTQwYWMtYTcxNS1mYTAxYjQ0OTNhYWYiKSwKKyAgICAgICAgMSwKKyAgICAgICAgIkFNUiBFeHRyYWN0b3IiLAorICAgICAgICBbXSgKKyAgICAgICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorICAgICAgICAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLAorICAgICAgICAgICAgICAgIHZvaWQgKiosCisgICAgICAgICAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyAqKSAtPiBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgeworICAgICAgICAgICAgaWYgKFNuaWZmQU1SKHNvdXJjZSwgbnVsbHB0ciwgY29uZmlkZW5jZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gW10oCisgICAgICAgICAgICAgICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKSAtPiBNZWRpYUV4dHJhY3RvciogeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFNUkV4dHJhY3Rvcihzb3VyY2UpO307CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH07Cit9CisKK30gLy8gZXh0ZXJuICJDIgorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQU1SRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL2Ftci9BTVJFeHRyYWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTBiMzI1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQU1SRXh0cmFjdG9yLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU1SX0VYVFJBQ1RPUl9IXworCisjZGVmaW5lIEFNUl9FWFRSQUNUT1JfSF8KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFNZXNzYWdlOworY2xhc3MgU3RyaW5nODsKKyNkZWZpbmUgT0ZGU0VUX1RBQkxFX0xFTiAgICAzMDAKKworY2xhc3MgQU1SRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBBTVJFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CisKKyAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOworICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKTsKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIkFNUkV4dHJhY3RvciI7IH0KKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkFNUkV4dHJhY3RvcigpOworCitwcml2YXRlOgorICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBNZXRhRGF0YUJhc2UgbU1ldGE7CisgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKKyAgICBib29sIG1Jc1dpZGU7CisKKyAgICBvZmY2NF90IG1PZmZzZXRUYWJsZVtPRkZTRVRfVEFCTEVfTEVOXTsgLy81IG1pbgorICAgIHNpemVfdCBtT2Zmc2V0VGFibGVMZW5ndGg7CisKKyAgICBBTVJFeHRyYWN0b3IoY29uc3QgQU1SRXh0cmFjdG9yICYpOworICAgIEFNUkV4dHJhY3RvciAmb3BlcmF0b3I9KGNvbnN0IEFNUkV4dHJhY3RvciAmKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU1SX0VYVFJBQ1RPUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk2MmI5MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw0MSBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworCisgICAgc3JjczogWyJBTVJFeHRyYWN0b3IuY3BwIl0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgXSwKKworICAgIG5hbWU6ICJsaWJhbXJleHRyYWN0b3IiLAorICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogImV4dHJhY3RvcnMiLAorCisgICAgY29tcGlsZV9tdWx0aWxpYjogImZpcnN0IiwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItZnZpc2liaWxpdHk9aGlkZGVuIiwKKyAgICBdLAorICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgZGlhZzogeworICAgICAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICB9LAorICAgIH0sCisKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9leHRyYWN0b3JzL2Ftci9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpjb3B5IHRvIG1lZGlhL2V4dHJhY3RvcnMvYW1yL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL05PVElDRSBiL21lZGlhL2V4dHJhY3RvcnMvYW1yL05PVElDRQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL05PVElDRQpjb3B5IHRvIG1lZGlhL2V4dHJhY3RvcnMvYW1yL05PVElDRQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9hbXIvZXhwb3J0cy5sZHMgYi9tZWRpYS9leHRyYWN0b3JzL2Ftci9leHBvcnRzLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTMwOWVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9hbXIvZXhwb3J0cy5sZHMKQEAgLTAsMCArMSBAQAoreyBnbG9iYWw6IEdFVEVYVFJBQ1RPUkRFRjsgbG9jYWw6ICo7IH07CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyODI3OTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvQW5kcm9pZC5icApAQCAtMCwwICsxLDQzIEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisKKyAgICBzcmNzOiBbIkZMQUNFeHRyYWN0b3IuY3BwIl0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCisgICAgICAgICJleHRlcm5hbC9mbGFjL2luY2x1ZGUiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYkZMQUMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgXSwKKworICAgIG5hbWU6ICJsaWJmbGFjZXh0cmFjdG9yIiwKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJleHRyYWN0b3JzIiwKKworICAgIGNvbXBpbGVfbXVsdGlsaWI6ICJmaXJzdCIsCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCisgICAgXSwKKyAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGRpYWc6IHsKKyAgICAgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9LAorCit9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvRkxBQ0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvRkxBQ0V4dHJhY3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNkYTI1OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9GTEFDRXh0cmFjdG9yLmNwcApAQCAtMCwwICsxLDg4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiRkxBQ0V4dHJhY3RvciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkZMQUNFeHRyYWN0b3IuaCIKKy8vIGxpYkZMQUMgcGFyc2VyCisjaW5jbHVkZSAiRkxBQy9zdHJlYW1fZGVjb2Rlci5oIgorCisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+CisjaW5jbHVkZSA8bWVkaWEvVm9yYmlzQ29tbWVudC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBGTEFDUGFyc2VyOworCitjbGFzcyBGTEFDU291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworCitwdWJsaWM6CisgICAgRkxBQ1NvdXJjZSgKKyAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlLAorICAgICAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5GTEFDU291cmNlKCk7CisKK3ByaXZhdGU6CisgICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIE1ldGFEYXRhQmFzZSBtVHJhY2tNZXRhZGF0YTsKKyAgICBGTEFDUGFyc2VyICptUGFyc2VyOworICAgIGJvb2wgbUluaXRDaGVjazsKKyAgICBib29sIG1TdGFydGVkOworCisgICAgLy8gbm8gY29weSBjb25zdHJ1Y3RvciBvciBhc3NpZ25tZW50CisgICAgRkxBQ1NvdXJjZShjb25zdCBGTEFDU291cmNlICYpOworICAgIEZMQUNTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBGTEFDU291cmNlICYpOworCit9OworCisvLyBGTEFDUGFyc2VyIHdyYXBzIGEgQyBsaWJGTEFDIHBhcnNlciBha2Egc3RyZWFtIGRlY29kZXIKKworY2xhc3MgRkxBQ1BhcnNlciB7CisKK3B1YmxpYzoKKyAgICBlbnVtIHsKKyAgICAgICAga01heENoYW5uZWxzID0gOCwKKyAgICB9OworCisgICAgZXhwbGljaXQgRkxBQ1BhcnNlcigKKyAgICAgICAgRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UsCisgICAgICAgIC8vIElmIG1ldGFkYXRhIHBvaW50ZXJzIGFyZW4ndCBwcm92aWRlZCwgd2UgZG9uJ3QgZmlsbCB0aGVtCisgICAgICAgIE1ldGFEYXRhQmFzZSAqZmlsZU1ldGFkYXRhID0gMCwKKyAgICAgICAgTWV0YURhdGFCYXNlICp0cmFja01ldGFkYXRhID0gMCk7CisKKyAgICB2aXJ0dWFsIH5GTEFDUGFyc2VyKCk7CisKKyAgICBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIC8vIHN0cmVhbSBwcm9wZXJ0aWVzCisgICAgdW5zaWduZWQgZ2V0TWF4QmxvY2tTaXplKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVN0cmVhbUluZm8ubWF4X2Jsb2Nrc2l6ZTsKKyAgICB9CisgICAgdW5zaWduZWQgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TdHJlYW1JbmZvLnNhbXBsZV9yYXRlOworICAgIH0KKyAgICB1bnNpZ25lZCBnZXRDaGFubmVscygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TdHJlYW1JbmZvLmNoYW5uZWxzOworICAgIH0KKyAgICB1bnNpZ25lZCBnZXRCaXRzUGVyU2FtcGxlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVN0cmVhbUluZm8uYml0c19wZXJfc2FtcGxlOworICAgIH0KKyAgICBGTEFDX191aW50NjQgZ2V0VG90YWxTYW1wbGVzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVN0cmVhbUluZm8udG90YWxfc2FtcGxlczsKKyAgICB9CisKKyAgICAvLyBtZWRpYSBidWZmZXJzCisgICAgdm9pZCBhbGxvY2F0ZUJ1ZmZlcnMoKTsKKyAgICB2b2lkIHJlbGVhc2VCdWZmZXJzKCk7CisgICAgTWVkaWFCdWZmZXJCYXNlICpyZWFkQnVmZmVyKCkgeworICAgICAgICByZXR1cm4gcmVhZEJ1ZmZlcihmYWxzZSwgMExMKTsKKyAgICB9CisgICAgTWVkaWFCdWZmZXJCYXNlICpyZWFkQnVmZmVyKEZMQUNfX3VpbnQ2NCBzYW1wbGUpIHsKKyAgICAgICAgcmV0dXJuIHJlYWRCdWZmZXIodHJ1ZSwgc2FtcGxlKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIE1ldGFEYXRhQmFzZSAqbUZpbGVNZXRhZGF0YTsKKyAgICBNZXRhRGF0YUJhc2UgKm1UcmFja01ldGFkYXRhOworICAgIGJvb2wgbUluaXRDaGVjazsKKworICAgIC8vIG1lZGlhIGJ1ZmZlcnMKKyAgICBzaXplX3QgbU1heEJ1ZmZlclNpemU7CisgICAgTWVkaWFCdWZmZXJHcm91cCAqbUdyb3VwOworICAgIHZvaWQgKCptQ29weSkoc2hvcnQgKmRzdCwgY29uc3QgaW50ICogc3JjW2tNYXhDaGFubmVsc10sIHVuc2lnbmVkIG5TYW1wbGVzLCB1bnNpZ25lZCBuQ2hhbm5lbHMpOworCisgICAgLy8gaGFuZGxlIHRvIHVuZGVybHlpbmcgbGliRkxBQyBwYXJzZXIKKyAgICBGTEFDX19TdHJlYW1EZWNvZGVyICptRGVjb2RlcjsKKworICAgIC8vIGN1cnJlbnQgcG9zaXRpb24gd2l0aGluIHRoZSBkYXRhIHNvdXJjZQorICAgIG9mZjY0X3QgbUN1cnJlbnRQb3M7CisgICAgYm9vbCBtRU9GOworCisgICAgLy8gY2FjaGVkIHdoZW4gdGhlIFNUUkVBTUlORk8gbWV0YWRhdGEgaXMgcGFyc2VkIGJ5IGxpYkZMQUMKKyAgICBGTEFDX19TdHJlYW1NZXRhZGF0YV9TdHJlYW1JbmZvIG1TdHJlYW1JbmZvOworICAgIGJvb2wgbVN0cmVhbUluZm9WYWxpZDsKKworICAgIC8vIGNhY2hlZCB3aGVuIGEgZGVjb2RlZCBQQ00gYmxvY2sgaXMgIndyaXR0ZW4iIGJ5IGxpYkZMQUMgcGFyc2VyCisgICAgYm9vbCBtV3JpdGVSZXF1ZXN0ZWQ7CisgICAgYm9vbCBtV3JpdGVDb21wbGV0ZWQ7CisgICAgRkxBQ19fRnJhbWVIZWFkZXIgbVdyaXRlSGVhZGVyOworICAgIEZMQUNfX2ludDMyIGNvbnN0ICogbVdyaXRlQnVmZmVyW2tNYXhDaGFubmVsc107CisKKyAgICAvLyBtb3N0IHJlY2VudCBlcnJvciByZXBvcnRlZCBieSBsaWJGTEFDIHBhcnNlcgorICAgIEZMQUNfX1N0cmVhbURlY29kZXJFcnJvclN0YXR1cyBtRXJyb3JTdGF0dXM7CisKKyAgICBzdGF0dXNfdCBpbml0KCk7CisgICAgTWVkaWFCdWZmZXJCYXNlICpyZWFkQnVmZmVyKGJvb2wgZG9TZWVrLCBGTEFDX191aW50NjQgc2FtcGxlKTsKKworICAgIC8vIG5vIGNvcHkgY29uc3RydWN0b3Igb3IgYXNzaWdubWVudAorICAgIEZMQUNQYXJzZXIoY29uc3QgRkxBQ1BhcnNlciAmKTsKKyAgICBGTEFDUGFyc2VyICZvcGVyYXRvcj0oY29uc3QgRkxBQ1BhcnNlciAmKTsKKworICAgIC8vIEZMQUMgcGFyc2VyIGNhbGxiYWNrcyBhcyBDKysgaW5zdGFuY2UgbWV0aG9kcworICAgIEZMQUNfX1N0cmVhbURlY29kZXJSZWFkU3RhdHVzIHJlYWRDYWxsYmFjaygKKyAgICAgICAgICAgIEZMQUNfX2J5dGUgYnVmZmVyW10sIHNpemVfdCAqYnl0ZXMpOworICAgIEZMQUNfX1N0cmVhbURlY29kZXJTZWVrU3RhdHVzIHNlZWtDYWxsYmFjaygKKyAgICAgICAgICAgIEZMQUNfX3VpbnQ2NCBhYnNvbHV0ZV9ieXRlX29mZnNldCk7CisgICAgRkxBQ19fU3RyZWFtRGVjb2RlclRlbGxTdGF0dXMgdGVsbENhbGxiYWNrKAorICAgICAgICAgICAgRkxBQ19fdWludDY0ICphYnNvbHV0ZV9ieXRlX29mZnNldCk7CisgICAgRkxBQ19fU3RyZWFtRGVjb2Rlckxlbmd0aFN0YXR1cyBsZW5ndGhDYWxsYmFjaygKKyAgICAgICAgICAgIEZMQUNfX3VpbnQ2NCAqc3RyZWFtX2xlbmd0aCk7CisgICAgRkxBQ19fYm9vbCBlb2ZDYWxsYmFjaygpOworICAgIEZMQUNfX1N0cmVhbURlY29kZXJXcml0ZVN0YXR1cyB3cml0ZUNhbGxiYWNrKAorICAgICAgICAgICAgY29uc3QgRkxBQ19fRnJhbWUgKmZyYW1lLCBjb25zdCBGTEFDX19pbnQzMiAqIGNvbnN0IGJ1ZmZlcltdKTsKKyAgICB2b2lkIG1ldGFkYXRhQ2FsbGJhY2soY29uc3QgRkxBQ19fU3RyZWFtTWV0YWRhdGEgKm1ldGFkYXRhKTsKKyAgICB2b2lkIGVycm9yQ2FsbGJhY2soRkxBQ19fU3RyZWFtRGVjb2RlckVycm9yU3RhdHVzIHN0YXR1cyk7CisKKyAgICAvLyBGTEFDIHBhcnNlciBjYWxsYmFja3MgYXMgQy1jYWxsYWJsZSBmdW5jdGlvbnMKKyAgICBzdGF0aWMgRkxBQ19fU3RyZWFtRGVjb2RlclJlYWRTdGF0dXMgcmVhZF9jYWxsYmFjaygKKyAgICAgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKmRlY29kZXIsCisgICAgICAgICAgICBGTEFDX19ieXRlIGJ1ZmZlcltdLCBzaXplX3QgKmJ5dGVzLAorICAgICAgICAgICAgdm9pZCAqY2xpZW50X2RhdGEpOworICAgIHN0YXRpYyBGTEFDX19TdHJlYW1EZWNvZGVyU2Vla1N0YXR1cyBzZWVrX2NhbGxiYWNrKAorICAgICAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqZGVjb2RlciwKKyAgICAgICAgICAgIEZMQUNfX3VpbnQ2NCBhYnNvbHV0ZV9ieXRlX29mZnNldCwKKyAgICAgICAgICAgIHZvaWQgKmNsaWVudF9kYXRhKTsKKyAgICBzdGF0aWMgRkxBQ19fU3RyZWFtRGVjb2RlclRlbGxTdGF0dXMgdGVsbF9jYWxsYmFjaygKKyAgICAgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKmRlY29kZXIsCisgICAgICAgICAgICBGTEFDX191aW50NjQgKmFic29sdXRlX2J5dGVfb2Zmc2V0LAorICAgICAgICAgICAgdm9pZCAqY2xpZW50X2RhdGEpOworICAgIHN0YXRpYyBGTEFDX19TdHJlYW1EZWNvZGVyTGVuZ3RoU3RhdHVzIGxlbmd0aF9jYWxsYmFjaygKKyAgICAgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKmRlY29kZXIsCisgICAgICAgICAgICBGTEFDX191aW50NjQgKnN0cmVhbV9sZW5ndGgsCisgICAgICAgICAgICB2b2lkICpjbGllbnRfZGF0YSk7CisgICAgc3RhdGljIEZMQUNfX2Jvb2wgZW9mX2NhbGxiYWNrKAorICAgICAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqZGVjb2RlciwKKyAgICAgICAgICAgIHZvaWQgKmNsaWVudF9kYXRhKTsKKyAgICBzdGF0aWMgRkxBQ19fU3RyZWFtRGVjb2RlcldyaXRlU3RhdHVzIHdyaXRlX2NhbGxiYWNrKAorICAgICAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqZGVjb2RlciwKKyAgICAgICAgICAgIGNvbnN0IEZMQUNfX0ZyYW1lICpmcmFtZSwgY29uc3QgRkxBQ19faW50MzIgKiBjb25zdCBidWZmZXJbXSwKKyAgICAgICAgICAgIHZvaWQgKmNsaWVudF9kYXRhKTsKKyAgICBzdGF0aWMgdm9pZCBtZXRhZGF0YV9jYWxsYmFjaygKKyAgICAgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKmRlY29kZXIsCisgICAgICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1NZXRhZGF0YSAqbWV0YWRhdGEsCisgICAgICAgICAgICB2b2lkICpjbGllbnRfZGF0YSk7CisgICAgc3RhdGljIHZvaWQgZXJyb3JfY2FsbGJhY2soCisgICAgICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1EZWNvZGVyICpkZWNvZGVyLAorICAgICAgICAgICAgRkxBQ19fU3RyZWFtRGVjb2RlckVycm9yU3RhdHVzIHN0YXR1cywKKyAgICAgICAgICAgIHZvaWQgKmNsaWVudF9kYXRhKTsKKworfTsKKworLy8gVGhlIEZMQUMgcGFyc2VyIGNhbGxzIG91ciBDKysgc3RhdGljIGNhbGxiYWNrcyB1c2luZyBDIGNhbGxpbmcgY29udmVudGlvbnMsCisvLyBpbnNpZGUgRkxBQ19fc3RyZWFtX2RlY29kZXJfcHJvY2Vzc191bnRpbF9lbmRfb2ZfbWV0YWRhdGEKKy8vIGFuZCBGTEFDX19zdHJlYW1fZGVjb2Rlcl9wcm9jZXNzX3NpbmdsZS4KKy8vIFdlIGltbWVkaWF0ZWx5IHRoZW4gY2FsbCBvdXIgY29ycmVzcG9uZGluZyBDKysgaW5zdGFuY2UgbWV0aG9kcworLy8gd2l0aCB0aGUgc2FtZSBwYXJhbWV0ZXIgbGlzdCwgYnV0IGRpc2NhcmQgcmVkdW5kYW50IGluZm9ybWF0aW9uLgorCitGTEFDX19TdHJlYW1EZWNvZGVyUmVhZFN0YXR1cyBGTEFDUGFyc2VyOjpyZWFkX2NhbGxiYWNrKAorICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1EZWNvZGVyICogLyogZGVjb2RlciAqLywgRkxBQ19fYnl0ZSBidWZmZXJbXSwKKyAgICAgICAgc2l6ZV90ICpieXRlcywgdm9pZCAqY2xpZW50X2RhdGEpCit7CisgICAgcmV0dXJuICgoRkxBQ1BhcnNlciAqKSBjbGllbnRfZGF0YSktPnJlYWRDYWxsYmFjayhidWZmZXIsIGJ5dGVzKTsKK30KKworRkxBQ19fU3RyZWFtRGVjb2RlclNlZWtTdGF0dXMgRkxBQ1BhcnNlcjo6c2Vla19jYWxsYmFjaygKKyAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqIC8qIGRlY29kZXIgKi8sCisgICAgICAgIEZMQUNfX3VpbnQ2NCBhYnNvbHV0ZV9ieXRlX29mZnNldCwgdm9pZCAqY2xpZW50X2RhdGEpCit7CisgICAgcmV0dXJuICgoRkxBQ1BhcnNlciAqKSBjbGllbnRfZGF0YSktPnNlZWtDYWxsYmFjayhhYnNvbHV0ZV9ieXRlX29mZnNldCk7Cit9CisKK0ZMQUNfX1N0cmVhbURlY29kZXJUZWxsU3RhdHVzIEZMQUNQYXJzZXI6OnRlbGxfY2FsbGJhY2soCisgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKiAvKiBkZWNvZGVyICovLAorICAgICAgICBGTEFDX191aW50NjQgKmFic29sdXRlX2J5dGVfb2Zmc2V0LCB2b2lkICpjbGllbnRfZGF0YSkKK3sKKyAgICByZXR1cm4gKChGTEFDUGFyc2VyICopIGNsaWVudF9kYXRhKS0+dGVsbENhbGxiYWNrKGFic29sdXRlX2J5dGVfb2Zmc2V0KTsKK30KKworRkxBQ19fU3RyZWFtRGVjb2Rlckxlbmd0aFN0YXR1cyBGTEFDUGFyc2VyOjpsZW5ndGhfY2FsbGJhY2soCisgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKiAvKiBkZWNvZGVyICovLAorICAgICAgICBGTEFDX191aW50NjQgKnN0cmVhbV9sZW5ndGgsIHZvaWQgKmNsaWVudF9kYXRhKQoreworICAgIHJldHVybiAoKEZMQUNQYXJzZXIgKikgY2xpZW50X2RhdGEpLT5sZW5ndGhDYWxsYmFjayhzdHJlYW1fbGVuZ3RoKTsKK30KKworRkxBQ19fYm9vbCBGTEFDUGFyc2VyOjplb2ZfY2FsbGJhY2soCisgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKiAvKiBkZWNvZGVyICovLCB2b2lkICpjbGllbnRfZGF0YSkKK3sKKyAgICByZXR1cm4gKChGTEFDUGFyc2VyICopIGNsaWVudF9kYXRhKS0+ZW9mQ2FsbGJhY2soKTsKK30KKworRkxBQ19fU3RyZWFtRGVjb2RlcldyaXRlU3RhdHVzIEZMQUNQYXJzZXI6OndyaXRlX2NhbGxiYWNrKAorICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1EZWNvZGVyICogLyogZGVjb2RlciAqLywgY29uc3QgRkxBQ19fRnJhbWUgKmZyYW1lLAorICAgICAgICBjb25zdCBGTEFDX19pbnQzMiAqIGNvbnN0IGJ1ZmZlcltdLCB2b2lkICpjbGllbnRfZGF0YSkKK3sKKyAgICByZXR1cm4gKChGTEFDUGFyc2VyICopIGNsaWVudF9kYXRhKS0+d3JpdGVDYWxsYmFjayhmcmFtZSwgYnVmZmVyKTsKK30KKwordm9pZCBGTEFDUGFyc2VyOjptZXRhZGF0YV9jYWxsYmFjaygKKyAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqIC8qIGRlY29kZXIgKi8sCisgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbU1ldGFkYXRhICptZXRhZGF0YSwgdm9pZCAqY2xpZW50X2RhdGEpCit7CisgICAgKChGTEFDUGFyc2VyICopIGNsaWVudF9kYXRhKS0+bWV0YWRhdGFDYWxsYmFjayhtZXRhZGF0YSk7Cit9CisKK3ZvaWQgRkxBQ1BhcnNlcjo6ZXJyb3JfY2FsbGJhY2soCisgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKiAvKiBkZWNvZGVyICovLAorICAgICAgICBGTEFDX19TdHJlYW1EZWNvZGVyRXJyb3JTdGF0dXMgc3RhdHVzLCB2b2lkICpjbGllbnRfZGF0YSkKK3sKKyAgICAoKEZMQUNQYXJzZXIgKikgY2xpZW50X2RhdGEpLT5lcnJvckNhbGxiYWNrKHN0YXR1cyk7Cit9CisKKy8vIFRoZXNlIGFyZSB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFja3Mgd2l0aCBDKysgY2FsbGluZyBjb252ZW50aW9ucworCitGTEFDX19TdHJlYW1EZWNvZGVyUmVhZFN0YXR1cyBGTEFDUGFyc2VyOjpyZWFkQ2FsbGJhY2soCisgICAgICAgIEZMQUNfX2J5dGUgYnVmZmVyW10sIHNpemVfdCAqYnl0ZXMpCit7CisgICAgc2l6ZV90IHJlcXVlc3RlZCA9ICpieXRlczsKKyAgICBzc2l6ZV90IGFjdHVhbCA9IG1EYXRhU291cmNlLT5yZWFkQXQobUN1cnJlbnRQb3MsIGJ1ZmZlciwgcmVxdWVzdGVkKTsKKyAgICBpZiAoMCA+IGFjdHVhbCkgeworICAgICAgICAqYnl0ZXMgPSAwOworICAgICAgICByZXR1cm4gRkxBQ19fU1RSRUFNX0RFQ09ERVJfUkVBRF9TVEFUVVNfQUJPUlQ7CisgICAgfSBlbHNlIGlmICgwID09IGFjdHVhbCkgeworICAgICAgICAqYnl0ZXMgPSAwOworICAgICAgICBtRU9GID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIEZMQUNfX1NUUkVBTV9ERUNPREVSX1JFQURfU1RBVFVTX0VORF9PRl9TVFJFQU07CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXNzZXJ0KGFjdHVhbCA8PSByZXF1ZXN0ZWQpOworICAgICAgICAqYnl0ZXMgPSBhY3R1YWw7CisgICAgICAgIG1DdXJyZW50UG9zICs9IGFjdHVhbDsKKyAgICAgICAgcmV0dXJuIEZMQUNfX1NUUkVBTV9ERUNPREVSX1JFQURfU1RBVFVTX0NPTlRJTlVFOworICAgIH0KK30KKworRkxBQ19fU3RyZWFtRGVjb2RlclNlZWtTdGF0dXMgRkxBQ1BhcnNlcjo6c2Vla0NhbGxiYWNrKAorICAgICAgICBGTEFDX191aW50NjQgYWJzb2x1dGVfYnl0ZV9vZmZzZXQpCit7CisgICAgbUN1cnJlbnRQb3MgPSBhYnNvbHV0ZV9ieXRlX29mZnNldDsKKyAgICBtRU9GID0gZmFsc2U7CisgICAgcmV0dXJuIEZMQUNfX1NUUkVBTV9ERUNPREVSX1NFRUtfU1RBVFVTX09LOworfQorCitGTEFDX19TdHJlYW1EZWNvZGVyVGVsbFN0YXR1cyBGTEFDUGFyc2VyOjp0ZWxsQ2FsbGJhY2soCisgICAgICAgIEZMQUNfX3VpbnQ2NCAqYWJzb2x1dGVfYnl0ZV9vZmZzZXQpCit7CisgICAgKmFic29sdXRlX2J5dGVfb2Zmc2V0ID0gbUN1cnJlbnRQb3M7CisgICAgcmV0dXJuIEZMQUNfX1NUUkVBTV9ERUNPREVSX1RFTExfU1RBVFVTX09LOworfQorCitGTEFDX19TdHJlYW1EZWNvZGVyTGVuZ3RoU3RhdHVzIEZMQUNQYXJzZXI6Omxlbmd0aENhbGxiYWNrKAorICAgICAgICBGTEFDX191aW50NjQgKnN0cmVhbV9sZW5ndGgpCit7CisgICAgb2ZmNjRfdCBzaXplOworICAgIGlmIChPSyA9PSBtRGF0YVNvdXJjZS0+Z2V0U2l6ZSgmc2l6ZSkpIHsKKyAgICAgICAgKnN0cmVhbV9sZW5ndGggPSBzaXplOworICAgICAgICByZXR1cm4gRkxBQ19fU1RSRUFNX0RFQ09ERVJfTEVOR1RIX1NUQVRVU19PSzsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gRkxBQ19fU1RSRUFNX0RFQ09ERVJfTEVOR1RIX1NUQVRVU19VTlNVUFBPUlRFRDsKKyAgICB9Cit9CisKK0ZMQUNfX2Jvb2wgRkxBQ1BhcnNlcjo6ZW9mQ2FsbGJhY2soKQoreworICAgIHJldHVybiBtRU9GOworfQorCitGTEFDX19TdHJlYW1EZWNvZGVyV3JpdGVTdGF0dXMgRkxBQ1BhcnNlcjo6d3JpdGVDYWxsYmFjaygKKyAgICAgICAgY29uc3QgRkxBQ19fRnJhbWUgKmZyYW1lLCBjb25zdCBGTEFDX19pbnQzMiAqIGNvbnN0IGJ1ZmZlcltdKQoreworICAgIGlmIChtV3JpdGVSZXF1ZXN0ZWQpIHsKKyAgICAgICAgbVdyaXRlUmVxdWVzdGVkID0gZmFsc2U7CisgICAgICAgIC8vIEZMQUMgcGFyc2VyIGRvZXNuJ3QgZnJlZSBvciByZWFsbG9jIGJ1ZmZlciB1bnRpbCBuZXh0IGZyYW1lIG9yIGZpbmlzaAorICAgICAgICBtV3JpdGVIZWFkZXIgPSBmcmFtZS0+aGVhZGVyOworICAgICAgICBtZW1tb3ZlKG1Xcml0ZUJ1ZmZlciwgYnVmZmVyLCBzaXplb2YoY29uc3QgRkxBQ19faW50MzIgKiBjb25zdCkgKiBnZXRDaGFubmVscygpKTsKKyAgICAgICAgbVdyaXRlQ29tcGxldGVkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIEZMQUNfX1NUUkVBTV9ERUNPREVSX1dSSVRFX1NUQVRVU19DT05USU5VRTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiRkxBQ1BhcnNlcjo6d3JpdGVDYWxsYmFjayB1bmV4cGVjdGVkIik7CisgICAgICAgIHJldHVybiBGTEFDX19TVFJFQU1fREVDT0RFUl9XUklURV9TVEFUVVNfQUJPUlQ7CisgICAgfQorfQorCit2b2lkIEZMQUNQYXJzZXI6Om1ldGFkYXRhQ2FsbGJhY2soY29uc3QgRkxBQ19fU3RyZWFtTWV0YWRhdGEgKm1ldGFkYXRhKQoreworICAgIHN3aXRjaCAobWV0YWRhdGEtPnR5cGUpIHsKKyAgICBjYXNlIEZMQUNfX01FVEFEQVRBX1RZUEVfU1RSRUFNSU5GTzoKKyAgICAgICAgaWYgKCFtU3RyZWFtSW5mb1ZhbGlkKSB7CisgICAgICAgICAgICBtU3RyZWFtSW5mbyA9IG1ldGFkYXRhLT5kYXRhLnN0cmVhbV9pbmZvOworICAgICAgICAgICAgbVN0cmVhbUluZm9WYWxpZCA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiRkxBQ1BhcnNlcjo6bWV0YWRhdGFDYWxsYmFjayB1bmV4cGVjdGVkIFNUUkVBTUlORk8iKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZMQUNfX01FVEFEQVRBX1RZUEVfVk9SQklTX0NPTU1FTlQ6CisgICAgICAgIHsKKyAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtTWV0YWRhdGFfVm9yYmlzQ29tbWVudCAqdmM7CisgICAgICAgIHZjID0gJm1ldGFkYXRhLT5kYXRhLnZvcmJpc19jb21tZW50OworICAgICAgICBmb3IgKEZMQUNfX3VpbnQzMiBpID0gMDsgaSA8IHZjLT5udW1fY29tbWVudHM7ICsraSkgeworICAgICAgICAgICAgRkxBQ19fU3RyZWFtTWV0YWRhdGFfVm9yYmlzQ29tbWVudF9FbnRyeSAqdmNlOworICAgICAgICAgICAgdmNlID0gJnZjLT5jb21tZW50c1tpXTsKKyAgICAgICAgICAgIGlmIChtRmlsZU1ldGFkYXRhICE9IDAgJiYgdmNlLT5lbnRyeSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcGFyc2VWb3JiaXNDb21tZW50KG1GaWxlTWV0YWRhdGEsIChjb25zdCBjaGFyICopIHZjZS0+ZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICB2Y2UtPmxlbmd0aCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZMQUNfX01FVEFEQVRBX1RZUEVfUElDVFVSRToKKyAgICAgICAgaWYgKG1GaWxlTWV0YWRhdGEgIT0gMCkgeworICAgICAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtTWV0YWRhdGFfUGljdHVyZSAqcCA9ICZtZXRhZGF0YS0+ZGF0YS5waWN0dXJlOworICAgICAgICAgICAgbUZpbGVNZXRhZGF0YS0+c2V0RGF0YShrS2V5QWxidW1BcnQsCisgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhOjpUWVBFX05PTkUsIHAtPmRhdGEsIHAtPmRhdGFfbGVuZ3RoKTsKKyAgICAgICAgICAgIG1GaWxlTWV0YWRhdGEtPnNldENTdHJpbmcoa0tleUFsYnVtQXJ0TUlNRSwgcC0+bWltZV90eXBlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HVygiRkxBQ1BhcnNlcjo6bWV0YWRhdGFDYWxsYmFjayB1bmV4cGVjdGVkIHR5cGUgJXUiLCBtZXRhZGF0YS0+dHlwZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCBGTEFDUGFyc2VyOjplcnJvckNhbGxiYWNrKEZMQUNfX1N0cmVhbURlY29kZXJFcnJvclN0YXR1cyBzdGF0dXMpCit7CisgICAgQUxPR0UoIkZMQUNQYXJzZXI6OmVycm9yQ2FsbGJhY2sgc3RhdHVzPSVkIiwgc3RhdHVzKTsKKyAgICBtRXJyb3JTdGF0dXMgPSBzdGF0dXM7Cit9CisKKy8vIENvcHkgc2FtcGxlcyBmcm9tIEZMQUMgbmF0aXZlIDMyLWJpdCBub24taW50ZXJsZWF2ZWQgdG8gMTYtYml0IGludGVybGVhdmVkLgorLy8gVGhlc2UgYXJlIGNhbmRpZGF0ZXMgZm9yIG9wdGltaXphdGlvbiBpZiBuZWVkZWQuCisKK3N0YXRpYyB2b2lkIGNvcHlNb25vOCgKKyAgICAgICAgc2hvcnQgKmRzdCwKKyAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNQYXJzZXI6OmtNYXhDaGFubmVsc10sCisgICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAorICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgeworICAgICAgICAqZHN0KysgPSBzcmNbMF1baV0gPDwgODsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlTdGVyZW84KAorICAgICAgICBzaG9ydCAqZHN0LAorICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ1BhcnNlcjo6a01heENoYW5uZWxzXSwKKyAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCisgICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgeworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7CisgICAgICAgICpkc3QrKyA9IHNyY1swXVtpXSA8PCA4OworICAgICAgICAqZHN0KysgPSBzcmNbMV1baV0gPDwgODsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlNdWx0aUNoOChzaG9ydCAqZHN0LCBjb25zdCBpbnQgKiBzcmNbRkxBQ1BhcnNlcjo6a01heENoYW5uZWxzXSwgdW5zaWduZWQgblNhbXBsZXMsIHVuc2lnbmVkIG5DaGFubmVscykKK3sKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgeworICAgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgbkNoYW5uZWxzOyArK2MpIHsKKyAgICAgICAgICAgICpkc3QrKyA9IHNyY1tjXVtpXSA8PCA4OworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjb3B5TW9ubzE2KAorICAgICAgICBzaG9ydCAqZHN0LAorICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ1BhcnNlcjo6a01heENoYW5uZWxzXSwKKyAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCisgICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgeworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7CisgICAgICAgICpkc3QrKyA9IHNyY1swXVtpXTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlTdGVyZW8xNigKKyAgICAgICAgc2hvcnQgKmRzdCwKKyAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNQYXJzZXI6OmtNYXhDaGFubmVsc10sCisgICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAorICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgeworICAgICAgICAqZHN0KysgPSBzcmNbMF1baV07CisgICAgICAgICpkc3QrKyA9IHNyY1sxXVtpXTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlNdWx0aUNoMTYoc2hvcnQgKmRzdCwgY29uc3QgaW50ICogc3JjW0ZMQUNQYXJzZXI6OmtNYXhDaGFubmVsc10sIHVuc2lnbmVkIG5TYW1wbGVzLCB1bnNpZ25lZCBuQ2hhbm5lbHMpCit7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG5DaGFubmVsczsgKytjKSB7CisgICAgICAgICAgICAqZHN0KysgPSBzcmNbY11baV07CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIDI0LWJpdCB2ZXJzaW9ucyBzaG91bGQgZG8gZGl0aGVyaW5nIG9yIG5vaXNlLXNoYXBpbmcsIGhlcmUgb3IgaW4gQXVkaW9GbGluZ2VyCisKK3N0YXRpYyB2b2lkIGNvcHlNb25vMjQoCisgICAgICAgIHNob3J0ICpkc3QsCisgICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDUGFyc2VyOjprTWF4Q2hhbm5lbHNdLAorICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKKyAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKKyAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldID4+IDg7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjb3B5U3RlcmVvMjQoCisgICAgICAgIHNob3J0ICpkc3QsCisgICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDUGFyc2VyOjprTWF4Q2hhbm5lbHNdLAorICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKKyAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKKyAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldID4+IDg7CisgICAgICAgICpkc3QrKyA9IHNyY1sxXVtpXSA+PiA4OworICAgIH0KK30KKworc3RhdGljIHZvaWQgY29weU11bHRpQ2gyNChzaG9ydCAqZHN0LCBjb25zdCBpbnQgKiBzcmNbRkxBQ1BhcnNlcjo6a01heENoYW5uZWxzXSwgdW5zaWduZWQgblNhbXBsZXMsIHVuc2lnbmVkIG5DaGFubmVscykKK3sKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgeworICAgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgbkNoYW5uZWxzOyArK2MpIHsKKyAgICAgICAgICAgICpkc3QrKyA9IHNyY1tjXVtpXSA+PiA4OworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjb3B5VHJlc3Bhc3MoCisgICAgICAgIHNob3J0ICogLyogZHN0ICovLAorICAgICAgICBjb25zdCBpbnQgKltGTEFDUGFyc2VyOjprTWF4Q2hhbm5lbHNdIC8qIHNyYyAqLywKKyAgICAgICAgdW5zaWduZWQgLyogblNhbXBsZXMgKi8sCisgICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgeworICAgIFRSRVNQQVNTKCk7Cit9CisKKy8vIEZMQUNQYXJzZXIKKworRkxBQ1BhcnNlcjo6RkxBQ1BhcnNlcigKKyAgICAgICAgRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UsCisgICAgICAgIE1ldGFEYXRhQmFzZSAqZmlsZU1ldGFkYXRhLAorICAgICAgICBNZXRhRGF0YUJhc2UgKnRyYWNrTWV0YWRhdGEpCisgICAgOiBtRGF0YVNvdXJjZShkYXRhU291cmNlKSwKKyAgICAgIG1GaWxlTWV0YWRhdGEoZmlsZU1ldGFkYXRhKSwKKyAgICAgIG1UcmFja01ldGFkYXRhKHRyYWNrTWV0YWRhdGEpLAorICAgICAgbUluaXRDaGVjayhmYWxzZSksCisgICAgICBtTWF4QnVmZmVyU2l6ZSgwKSwKKyAgICAgIG1Hcm91cChOVUxMKSwKKyAgICAgIG1Db3B5KGNvcHlUcmVzcGFzcyksCisgICAgICBtRGVjb2RlcihOVUxMKSwKKyAgICAgIG1DdXJyZW50UG9zKDBMTCksCisgICAgICBtRU9GKGZhbHNlKSwKKyAgICAgIG1TdHJlYW1JbmZvVmFsaWQoZmFsc2UpLAorICAgICAgbVdyaXRlUmVxdWVzdGVkKGZhbHNlKSwKKyAgICAgIG1Xcml0ZUNvbXBsZXRlZChmYWxzZSksCisgICAgICBtRXJyb3JTdGF0dXMoKEZMQUNfX1N0cmVhbURlY29kZXJFcnJvclN0YXR1cykgLTEpCit7CisgICAgQUxPR1YoIkZMQUNQYXJzZXI6OkZMQUNQYXJzZXIiKTsKKyAgICBtZW1zZXQoJm1TdHJlYW1JbmZvLCAwLCBzaXplb2YobVN0cmVhbUluZm8pKTsKKyAgICBtZW1zZXQoJm1Xcml0ZUhlYWRlciwgMCwgc2l6ZW9mKG1Xcml0ZUhlYWRlcikpOworICAgIG1Jbml0Q2hlY2sgPSBpbml0KCk7Cit9CisKK0ZMQUNQYXJzZXI6On5GTEFDUGFyc2VyKCkKK3sKKyAgICBBTE9HVigiRkxBQ1BhcnNlcjo6fkZMQUNQYXJzZXIiKTsKKyAgICBpZiAobURlY29kZXIgIT0gTlVMTCkgeworICAgICAgICBGTEFDX19zdHJlYW1fZGVjb2Rlcl9kZWxldGUobURlY29kZXIpOworICAgICAgICBtRGVjb2RlciA9IE5VTEw7CisgICAgfQorfQorCitzdGF0dXNfdCBGTEFDUGFyc2VyOjppbml0KCkKK3sKKyAgICAvLyBzZXR1cCBsaWJGTEFDIHBhcnNlcgorICAgIG1EZWNvZGVyID0gRkxBQ19fc3RyZWFtX2RlY29kZXJfbmV3KCk7CisgICAgaWYgKG1EZWNvZGVyID09IE5VTEwpIHsKKyAgICAgICAgLy8gVGhlIG5ldyBzaG91bGQgc3VjY2VlZCwgc2luY2UgcHJvYmFibHkgYWxsIGl0IGRvZXMgaXMgYSBtYWxsb2MKKyAgICAgICAgLy8gdGhhdCBhbHdheXMgc3VjY2VlZHMgaW4gQW5kcm9pZC4gIEJ1dCB0byBhdm9pZCBkZXBlbmRlbmNlIG9uIHRoZQorICAgICAgICAvLyBsaWJGTEFDIGludGVybmFscywgd2UgY2hlY2sgYW5kIGxvZyBoZXJlLgorICAgICAgICBBTE9HRSgibmV3IGZhaWxlZCIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgRkxBQ19fc3RyZWFtX2RlY29kZXJfc2V0X21kNV9jaGVja2luZyhtRGVjb2RlciwgZmFsc2UpOworICAgIEZMQUNfX3N0cmVhbV9kZWNvZGVyX3NldF9tZXRhZGF0YV9pZ25vcmVfYWxsKG1EZWNvZGVyKTsKKyAgICBGTEFDX19zdHJlYW1fZGVjb2Rlcl9zZXRfbWV0YWRhdGFfcmVzcG9uZCgKKyAgICAgICAgICAgIG1EZWNvZGVyLCBGTEFDX19NRVRBREFUQV9UWVBFX1NUUkVBTUlORk8pOworICAgIEZMQUNfX3N0cmVhbV9kZWNvZGVyX3NldF9tZXRhZGF0YV9yZXNwb25kKAorICAgICAgICAgICAgbURlY29kZXIsIEZMQUNfX01FVEFEQVRBX1RZUEVfUElDVFVSRSk7CisgICAgRkxBQ19fc3RyZWFtX2RlY29kZXJfc2V0X21ldGFkYXRhX3Jlc3BvbmQoCisgICAgICAgICAgICBtRGVjb2RlciwgRkxBQ19fTUVUQURBVEFfVFlQRV9WT1JCSVNfQ09NTUVOVCk7CisgICAgRkxBQ19fU3RyZWFtRGVjb2RlckluaXRTdGF0dXMgaW5pdFN0YXR1czsKKyAgICBpbml0U3RhdHVzID0gRkxBQ19fc3RyZWFtX2RlY29kZXJfaW5pdF9zdHJlYW0oCisgICAgICAgICAgICBtRGVjb2RlciwKKyAgICAgICAgICAgIHJlYWRfY2FsbGJhY2ssIHNlZWtfY2FsbGJhY2ssIHRlbGxfY2FsbGJhY2ssCisgICAgICAgICAgICBsZW5ndGhfY2FsbGJhY2ssIGVvZl9jYWxsYmFjaywgd3JpdGVfY2FsbGJhY2ssCisgICAgICAgICAgICBtZXRhZGF0YV9jYWxsYmFjaywgZXJyb3JfY2FsbGJhY2ssICh2b2lkICopIHRoaXMpOworICAgIGlmIChpbml0U3RhdHVzICE9IEZMQUNfX1NUUkVBTV9ERUNPREVSX0lOSVRfU1RBVFVTX09LKSB7CisgICAgICAgIC8vIEEgZmFpbHVyZSBoZXJlIHByb2JhYmx5IGluZGljYXRlcyBhIHByb2dyYW1taW5nIGVycm9yIGFuZCBzbyBpcworICAgICAgICAvLyB1bmxpa2VseSB0byBoYXBwZW4uIEJ1dCB3ZSBjaGVjayBhbmQgbG9nIGhlcmUgc2ltaWxhcmx5IHRvIGFib3ZlLgorICAgICAgICBBTE9HRSgiaW5pdF9zdHJlYW0gZmFpbGVkICVkIiwgaW5pdFN0YXR1cyk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICAvLyBwYXJzZSBhbGwgbWV0YWRhdGEKKyAgICBpZiAoIUZMQUNfX3N0cmVhbV9kZWNvZGVyX3Byb2Nlc3NfdW50aWxfZW5kX29mX21ldGFkYXRhKG1EZWNvZGVyKSkgeworICAgICAgICBBTE9HRSgiZW5kX29mX21ldGFkYXRhIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgaWYgKG1TdHJlYW1JbmZvVmFsaWQpIHsKKyAgICAgICAgLy8gY2hlY2sgY2hhbm5lbCBjb3VudAorICAgICAgICBpZiAoZ2V0Q2hhbm5lbHMoKSA9PSAwIHx8IGdldENoYW5uZWxzKCkgPiBrTWF4Q2hhbm5lbHMpIHsKKyAgICAgICAgICAgIEFMT0dFKCJ1bnN1cHBvcnRlZCBjaGFubmVsIGNvdW50ICV1IiwgZ2V0Q2hhbm5lbHMoKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgfQorICAgICAgICAvLyBjaGVjayBiaXQgZGVwdGgKKyAgICAgICAgc3dpdGNoIChnZXRCaXRzUGVyU2FtcGxlKCkpIHsKKyAgICAgICAgY2FzZSA4OgorICAgICAgICBjYXNlIDE2OgorICAgICAgICBjYXNlIDI0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgidW5zdXBwb3J0ZWQgYml0cyBwZXIgc2FtcGxlICV1IiwgZ2V0Qml0c1BlclNhbXBsZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICB9CisgICAgICAgIC8vIGNoZWNrIHNhbXBsZSByYXRlCisgICAgICAgIHN3aXRjaCAoZ2V0U2FtcGxlUmF0ZSgpKSB7CisgICAgICAgIGNhc2UgIDgwMDA6CisgICAgICAgIGNhc2UgMTEwMjU6CisgICAgICAgIGNhc2UgMTIwMDA6CisgICAgICAgIGNhc2UgMTYwMDA6CisgICAgICAgIGNhc2UgMjIwNTA6CisgICAgICAgIGNhc2UgMjQwMDA6CisgICAgICAgIGNhc2UgMzIwMDA6CisgICAgICAgIGNhc2UgNDQxMDA6CisgICAgICAgIGNhc2UgNDgwMDA6CisgICAgICAgIGNhc2UgODgyMDA6CisgICAgICAgIGNhc2UgOTYwMDA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJ1bnN1cHBvcnRlZCBzYW1wbGUgcmF0ZSAldSIsIGdldFNhbXBsZVJhdGUoKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgfQorICAgICAgICAvLyBjb25maWd1cmUgdGhlIGFwcHJvcHJpYXRlIGNvcHkgZnVuY3Rpb24sIGRlZmF1bHRpbmcgdG8gdHJlc3Bhc3MKKyAgICAgICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgICAgICAgICB1bnNpZ25lZCBtQ2hhbm5lbHM7CisgICAgICAgICAgICB1bnNpZ25lZCBtQml0c1BlclNhbXBsZTsKKyAgICAgICAgICAgIHZvaWQgKCptQ29weSkoc2hvcnQgKmRzdCwgY29uc3QgaW50ICogc3JjW2tNYXhDaGFubmVsc10sIHVuc2lnbmVkIG5TYW1wbGVzLCB1bnNpZ25lZCBuQ2hhbm5lbHMpOworICAgICAgICB9IHRhYmxlW10gPSB7CisgICAgICAgICAgICB7IDEsICA4LCBjb3B5TW9ubzggICAgfSwKKyAgICAgICAgICAgIHsgMiwgIDgsIGNvcHlTdGVyZW84ICB9LAorICAgICAgICAgICAgeyA4LCAgOCwgY29weU11bHRpQ2g4ICB9LAorICAgICAgICAgICAgeyAxLCAxNiwgY29weU1vbm8xNiAgIH0sCisgICAgICAgICAgICB7IDIsIDE2LCBjb3B5U3RlcmVvMTYgfSwKKyAgICAgICAgICAgIHsgOCwgMTYsIGNvcHlNdWx0aUNoMTYgfSwKKyAgICAgICAgICAgIHsgMSwgMjQsIGNvcHlNb25vMjQgICB9LAorICAgICAgICAgICAgeyAyLCAyNCwgY29weVN0ZXJlbzI0IH0sCisgICAgICAgICAgICB7IDgsIDI0LCBjb3B5TXVsdGlDaDI0IH0sCisgICAgICAgIH07CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzaXplb2YodGFibGUpL3NpemVvZih0YWJsZVswXSk7ICsraSkgeworICAgICAgICAgICAgaWYgKHRhYmxlW2ldLm1DaGFubmVscyA+PSBnZXRDaGFubmVscygpICYmCisgICAgICAgICAgICAgICAgICAgIHRhYmxlW2ldLm1CaXRzUGVyU2FtcGxlID09IGdldEJpdHNQZXJTYW1wbGUoKSkgeworICAgICAgICAgICAgICAgIG1Db3B5ID0gdGFibGVbaV0ubUNvcHk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gcG9wdWxhdGUgdHJhY2sgbWV0YWRhdGEKKyAgICAgICAgaWYgKG1UcmFja01ldGFkYXRhICE9IDApIHsKKyAgICAgICAgICAgIG1UcmFja01ldGFkYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKKyAgICAgICAgICAgIG1UcmFja01ldGFkYXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBnZXRDaGFubmVscygpKTsKKyAgICAgICAgICAgIG1UcmFja01ldGFkYXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgZ2V0U2FtcGxlUmF0ZSgpKTsKKyAgICAgICAgICAgIG1UcmFja01ldGFkYXRhLT5zZXRJbnQzMihrS2V5UGNtRW5jb2RpbmcsIGtBdWRpb0VuY29kaW5nUGNtMTZiaXQpOworICAgICAgICAgICAgLy8gc2FtcGxlIHJhdGUgaXMgbm9uLXplcm8sIHNvIGRpdmlzaW9uIGJ5IHplcm8gbm90IHBvc3NpYmxlCisgICAgICAgICAgICBtVHJhY2tNZXRhZGF0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAoZ2V0VG90YWxTYW1wbGVzKCkgKiAxMDAwMDAwTEwpIC8gZ2V0U2FtcGxlUmF0ZSgpKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJtaXNzaW5nIFNUUkVBTUlORk8iKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGlmIChtRmlsZU1ldGFkYXRhICE9IDApIHsKKyAgICAgICAgbUZpbGVNZXRhZGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgRkxBQ1BhcnNlcjo6YWxsb2NhdGVCdWZmZXJzKCkKK3sKKyAgICBDSEVDSyhtR3JvdXAgPT0gTlVMTCk7CisgICAgbUdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXA7CisgICAgbU1heEJ1ZmZlclNpemUgPSBnZXRNYXhCbG9ja1NpemUoKSAqIGdldENoYW5uZWxzKCkgKiBzaXplb2Yoc2hvcnQpOworICAgIG1Hcm91cC0+YWRkX2J1ZmZlcihNZWRpYUJ1ZmZlckJhc2U6OkNyZWF0ZShtTWF4QnVmZmVyU2l6ZSkpOworfQorCit2b2lkIEZMQUNQYXJzZXI6OnJlbGVhc2VCdWZmZXJzKCkKK3sKKyAgICBDSEVDSyhtR3JvdXAgIT0gTlVMTCk7CisgICAgZGVsZXRlIG1Hcm91cDsKKyAgICBtR3JvdXAgPSBOVUxMOworfQorCitNZWRpYUJ1ZmZlckJhc2UgKkZMQUNQYXJzZXI6OnJlYWRCdWZmZXIoYm9vbCBkb1NlZWssIEZMQUNfX3VpbnQ2NCBzYW1wbGUpCit7CisgICAgbVdyaXRlUmVxdWVzdGVkID0gdHJ1ZTsKKyAgICBtV3JpdGVDb21wbGV0ZWQgPSBmYWxzZTsKKyAgICBpZiAoZG9TZWVrKSB7CisgICAgICAgIC8vIFdlIGltcGxlbWVudCB0aGUgc2VlayBjYWxsYmFjaywgc28gdGhpcyB3b3JrcyB3aXRob3V0IGV4cGxpY2l0IGZsdXNoCisgICAgICAgIGlmICghRkxBQ19fc3RyZWFtX2RlY29kZXJfc2Vla19hYnNvbHV0ZShtRGVjb2Rlciwgc2FtcGxlKSkgeworICAgICAgICAgICAgQUxPR0UoIkZMQUNQYXJzZXI6OnJlYWRCdWZmZXIgc2VlayB0byBzYW1wbGUgJWxsZCBmYWlsZWQiLCAobG9uZyBsb25nKXNhbXBsZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiRkxBQ1BhcnNlcjo6cmVhZEJ1ZmZlciBzZWVrIHRvIHNhbXBsZSAlbGxkIHN1Y2NlZWRlZCIsIChsb25nIGxvbmcpc2FtcGxlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIUZMQUNfX3N0cmVhbV9kZWNvZGVyX3Byb2Nlc3Nfc2luZ2xlKG1EZWNvZGVyKSkgeworICAgICAgICAgICAgQUxPR0UoIkZMQUNQYXJzZXI6OnJlYWRCdWZmZXIgcHJvY2Vzc19zaW5nbGUgZmFpbGVkIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIW1Xcml0ZUNvbXBsZXRlZCkgeworICAgICAgICBBTE9HVigiRkxBQ1BhcnNlcjo6cmVhZEJ1ZmZlciB3cml0ZSBkaWQgbm90IGNvbXBsZXRlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAvLyB2ZXJpZnkgdGhhdCBibG9jayBoZWFkZXIga2VlcHMgdGhlIHByb21pc2VzIG1hZGUgYnkgU1RSRUFNSU5GTworICAgIHVuc2lnbmVkIGJsb2Nrc2l6ZSA9IG1Xcml0ZUhlYWRlci5ibG9ja3NpemU7CisgICAgaWYgKGJsb2Nrc2l6ZSA9PSAwIHx8IGJsb2Nrc2l6ZSA+IGdldE1heEJsb2NrU2l6ZSgpKSB7CisgICAgICAgIEFMT0dFKCJGTEFDUGFyc2VyOjpyZWFkQnVmZmVyIHdyaXRlIGludmFsaWQgYmxvY2tzaXplICV1IiwgYmxvY2tzaXplKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChtV3JpdGVIZWFkZXIuc2FtcGxlX3JhdGUgIT0gZ2V0U2FtcGxlUmF0ZSgpIHx8CisgICAgICAgIG1Xcml0ZUhlYWRlci5jaGFubmVscyAhPSBnZXRDaGFubmVscygpIHx8CisgICAgICAgIG1Xcml0ZUhlYWRlci5iaXRzX3Blcl9zYW1wbGUgIT0gZ2V0Qml0c1BlclNhbXBsZSgpKSB7CisgICAgICAgIEFMT0dFKCJGTEFDUGFyc2VyOjpyZWFkQnVmZmVyIHdyaXRlIGNoYW5nZWQgcGFyYW1ldGVycyBtaWQtc3RyZWFtOiAlZC8lZC8lZCAtPiAlZC8lZC8lZCIsCisgICAgICAgICAgICAgICAgZ2V0U2FtcGxlUmF0ZSgpLCBnZXRDaGFubmVscygpLCBnZXRCaXRzUGVyU2FtcGxlKCksCisgICAgICAgICAgICAgICAgbVdyaXRlSGVhZGVyLnNhbXBsZV9yYXRlLCBtV3JpdGVIZWFkZXIuY2hhbm5lbHMsIG1Xcml0ZUhlYWRlci5iaXRzX3Blcl9zYW1wbGUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLy8gYWNxdWlyZSBhIG1lZGlhIGJ1ZmZlcgorICAgIENIRUNLKG1Hcm91cCAhPSBOVUxMKTsKKyAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcjsKKyAgICBzdGF0dXNfdCBlcnIgPSBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHNpemVfdCBidWZmZXJTaXplID0gYmxvY2tzaXplICogZ2V0Q2hhbm5lbHMoKSAqIHNpemVvZihzaG9ydCk7CisgICAgQ0hFQ0soYnVmZmVyU2l6ZSA8PSBtTWF4QnVmZmVyU2l6ZSk7CisgICAgc2hvcnQgKmRhdGEgPSAoc2hvcnQgKikgYnVmZmVyLT5kYXRhKCk7CisgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgYnVmZmVyU2l6ZSk7CisgICAgLy8gY29weSBQQ00gZnJvbSBGTEFDIHdyaXRlIGJ1ZmZlciB0byBvdXIgbWVkaWEgYnVmZmVyLCB3aXRoIGludGVybGVhdmluZworICAgICgqbUNvcHkpKGRhdGEsIG1Xcml0ZUJ1ZmZlciwgYmxvY2tzaXplLCBnZXRDaGFubmVscygpKTsKKyAgICAvLyBmaWxsIGluIGJ1ZmZlciBtZXRhZGF0YQorICAgIENIRUNLKG1Xcml0ZUhlYWRlci5udW1iZXJfdHlwZSA9PSBGTEFDX19GUkFNRV9OVU1CRVJfVFlQRV9TQU1QTEVfTlVNQkVSKTsKKyAgICBGTEFDX191aW50NjQgc2FtcGxlTnVtYmVyID0gbVdyaXRlSGVhZGVyLm51bWJlci5zYW1wbGVfbnVtYmVyOworICAgIGludDY0X3QgdGltZVVzID0gKDEwMDAwMDBMTCAqIHNhbXBsZU51bWJlcikgLyBnZXRTYW1wbGVSYXRlKCk7CisgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKKyAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CisgICAgcmV0dXJuIGJ1ZmZlcjsKK30KKworLy8gRkxBQ3NvdXJjZQorCitGTEFDU291cmNlOjpGTEFDU291cmNlKAorICAgICAgICBEYXRhU291cmNlQmFzZSAqZGF0YVNvdXJjZSwKKyAgICAgICAgTWV0YURhdGFCYXNlICZ0cmFja01ldGFkYXRhKQorICAgIDogbURhdGFTb3VyY2UoZGF0YVNvdXJjZSksCisgICAgICBtVHJhY2tNZXRhZGF0YSh0cmFja01ldGFkYXRhKSwKKyAgICAgIG1QYXJzZXIoMCksCisgICAgICBtSW5pdENoZWNrKGZhbHNlKSwKKyAgICAgIG1TdGFydGVkKGZhbHNlKQoreworICAgIEFMT0dWKCJGTEFDU291cmNlOjpGTEFDU291cmNlIik7CisgICAgLy8gcmUtdXNlIHRoZSBzYW1lIHRyYWNrIG1ldGFkYXRhIHBhc3NlZCBpbnRvIGNvbnN0cnVjdG9yIGZyb20gRkxBQ0V4dHJhY3RvcgorICAgIG1QYXJzZXIgPSBuZXcgRkxBQ1BhcnNlcihtRGF0YVNvdXJjZSk7CisgICAgbUluaXRDaGVjayAgPSBtUGFyc2VyLT5pbml0Q2hlY2soKTsKK30KKworRkxBQ1NvdXJjZTo6fkZMQUNTb3VyY2UoKQoreworICAgIEFMT0dWKCJ+RkxBQ1NvdXJjZTo6RkxBQ1NvdXJjZSIpOworICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICBzdG9wKCk7CisgICAgfQorICAgIGRlbGV0ZSBtUGFyc2VyOworfQorCitzdGF0dXNfdCBGTEFDU291cmNlOjpzdGFydChNZXRhRGF0YUJhc2UgKiAvKiBwYXJhbXMgKi8pCit7CisgICAgQUxPR1YoIkZMQUNTb3VyY2U6OnN0YXJ0Iik7CisKKyAgICBDSEVDSyghbVN0YXJ0ZWQpOworICAgIG1QYXJzZXItPmFsbG9jYXRlQnVmZmVycygpOworICAgIG1TdGFydGVkID0gdHJ1ZTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgRkxBQ1NvdXJjZTo6c3RvcCgpCit7CisgICAgQUxPR1YoIkZMQUNTb3VyY2U6OnN0b3AiKTsKKworICAgIENIRUNLKG1TdGFydGVkKTsKKyAgICBtUGFyc2VyLT5yZWxlYXNlQnVmZmVycygpOworICAgIG1TdGFydGVkID0gZmFsc2U7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEZMQUNTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpCit7CisgICAgbWV0YSA9IG1UcmFja01ldGFkYXRhOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgRkxBQ1NvdXJjZTo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0QnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykKK3sKKyAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcjsKKyAgICAvLyBwcm9jZXNzIGFuIG9wdGlvbmFsIHNlZWsgcmVxdWVzdAorICAgIGludDY0X3Qgc2Vla1RpbWVVczsKKyAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKKyAgICBpZiAoKE5VTEwgIT0gb3B0aW9ucykgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKKyAgICAgICAgRkxBQ19fdWludDY0IHNhbXBsZTsKKyAgICAgICAgaWYgKHNlZWtUaW1lVXMgPD0gMExMKSB7CisgICAgICAgICAgICBzYW1wbGUgPSAwTEw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBzYW1wbGUgYW5kIHRvdGFsIHNhbXBsZXMgYXJlIGJvdGggemVyby1iYXNlZCwgYW5kIHNlZWsgdG8gRU9GIG9rCisgICAgICAgICAgICBzYW1wbGUgPSAoc2Vla1RpbWVVcyAqIG1QYXJzZXItPmdldFNhbXBsZVJhdGUoKSkgLyAxMDAwMDAwTEw7CisgICAgICAgICAgICBpZiAoc2FtcGxlID49IG1QYXJzZXItPmdldFRvdGFsU2FtcGxlcygpKSB7CisgICAgICAgICAgICAgICAgc2FtcGxlID0gbVBhcnNlci0+Z2V0VG90YWxTYW1wbGVzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyID0gbVBhcnNlci0+cmVhZEJ1ZmZlcihzYW1wbGUpOworICAgIC8vIG90aGVyd2lzZSByZWFkIHNlcXVlbnRpYWxseQorICAgIH0gZWxzZSB7CisgICAgICAgIGJ1ZmZlciA9IG1QYXJzZXItPnJlYWRCdWZmZXIoKTsKKyAgICB9CisgICAgKm91dEJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICByZXR1cm4gYnVmZmVyICE9IE5VTEwgPyAoc3RhdHVzX3QpIE9LIDogKHN0YXR1c190KSBFUlJPUl9FTkRfT0ZfU1RSRUFNOworfQorCisvLyBGTEFDRXh0cmFjdG9yCisKK0ZMQUNFeHRyYWN0b3I6OkZMQUNFeHRyYWN0b3IoCisgICAgICAgIERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlKQorICAgIDogbURhdGFTb3VyY2UoZGF0YVNvdXJjZSksCisgICAgICBtUGFyc2VyKG51bGxwdHIpLAorICAgICAgbUluaXRDaGVjayhmYWxzZSkKK3sKKyAgICBBTE9HVigiRkxBQ0V4dHJhY3Rvcjo6RkxBQ0V4dHJhY3RvciIpOworICAgIC8vIEZMQUNQYXJzZXIgd2lsbCBmaWxsIGluIHRoZSBtZXRhZGF0YSBmb3IgdXMKKyAgICBtUGFyc2VyID0gbmV3IEZMQUNQYXJzZXIobURhdGFTb3VyY2UsICZtRmlsZU1ldGFkYXRhLCAmbVRyYWNrTWV0YWRhdGEpOworICAgIG1Jbml0Q2hlY2sgPSBtUGFyc2VyLT5pbml0Q2hlY2soKTsKK30KKworRkxBQ0V4dHJhY3Rvcjo6fkZMQUNFeHRyYWN0b3IoKQoreworICAgIEFMT0dWKCJ+RkxBQ0V4dHJhY3Rvcjo6RkxBQ0V4dHJhY3RvciIpOworICAgIGRlbGV0ZSBtUGFyc2VyOworfQorCitzaXplX3QgRkxBQ0V4dHJhY3Rvcjo6Y291bnRUcmFja3MoKQoreworICAgIHJldHVybiBtSW5pdENoZWNrID09IE9LID8gMSA6IDA7Cit9CisKK01lZGlhVHJhY2sgKkZMQUNFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkKK3sKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCA+IDApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBuZXcgRkxBQ1NvdXJjZShtRGF0YVNvdXJjZSwgbVRyYWNrTWV0YWRhdGEpOworfQorCitzdGF0dXNfdCBGTEFDRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAorICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCA+IDApIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIG1ldGEgPSBtVHJhY2tNZXRhZGF0YTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEZMQUNFeHRyYWN0b3I6OmdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkKK3sKKyAgICBtZXRhID0gbUZpbGVNZXRhZGF0YTsKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vIFNuaWZmZXIKKworYm9vbCBTbmlmZkZMQUMoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpCit7CisgICAgLy8gZmlyc3QgNCBpcyB0aGUgc2lnbmF0dXJlIHdvcmQKKyAgICAvLyBzZWNvbmQgNCBpcyB0aGUgc2l6ZW9mIFNUUkVBTUlORk8KKyAgICAvLyAwNDIgaXMgdGhlIG1hbmRhdG9yeSBTVFJFQU1JTkZPCisgICAgLy8gbm8gbmVlZCB0byByZWFkIHJlc3Qgb2YgdGhlIGhlYWRlciwgYXMgYSBwcmVtYXR1cmUgRU9GIHdpbGwgYmUgY2F1Z2h0IGxhdGVyCisgICAgdWludDhfdCBoZWFkZXJbNCs0XTsKKyAgICBpZiAoc291cmNlLT5yZWFkQXQoMCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkgIT0gc2l6ZW9mKGhlYWRlcikKKyAgICAgICAgICAgIHx8IG1lbWNtcCgiZkxhQ1wwXDBcMFwwNDIiLCBoZWFkZXIsIDQrNCkpCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgKmNvbmZpZGVuY2UgPSAwLjU7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworCitleHRlcm4gIkMiIHsKKy8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKK19fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKK01lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgeworICAgIHJldHVybiB7CisgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTiwKKyAgICAgICAgICAgIFVVSUQoIjEzNjRiMDQ4LWNjNDUtNGZkYS05OTM0LTMyN2QwZWJmOTgyOSIpLAorICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICJGTEFDIEV4dHJhY3RvciIsCisgICAgICAgICAgICBbXSgKKyAgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKiosCisgICAgICAgICAgICAgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKikgLT4gTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIHsKKyAgICAgICAgICAgICAgICBpZiAoU25pZmZGTEFDKHNvdXJjZSwgY29uZmlkZW5jZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKSAtPiBNZWRpYUV4dHJhY3RvciogeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGTEFDRXh0cmFjdG9yKHNvdXJjZSk7fTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgIH07Cit9CisKK30gLy8gZXh0ZXJuICJDIgorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0ZMQUNFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9GTEFDRXh0cmFjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZiNmVjNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9GTEFDRXh0cmFjdG9yLmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgRkxBQ19FWFRSQUNUT1JfSF8KKyNkZWZpbmUgRkxBQ19FWFRSQUNUT1JfSF8KKworI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgRkxBQ1BhcnNlcjsKKworY2xhc3MgRkxBQ0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7CisKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBGTEFDRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOworCisgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJGTEFDRXh0cmFjdG9yIjsgfQorCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+RkxBQ0V4dHJhY3RvcigpOworCitwcml2YXRlOgorICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBGTEFDUGFyc2VyICptUGFyc2VyOworICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CisgICAgTWV0YURhdGFCYXNlIG1GaWxlTWV0YWRhdGE7CisKKyAgICAvLyBUaGVyZSBpcyBvbmx5IG9uZSB0cmFjaworICAgIE1ldGFEYXRhQmFzZSBtVHJhY2tNZXRhZGF0YTsKKworICAgIEZMQUNFeHRyYWN0b3IoY29uc3QgRkxBQ0V4dHJhY3RvciAmKTsKKyAgICBGTEFDRXh0cmFjdG9yICZvcGVyYXRvcj0oY29uc3QgRkxBQ0V4dHJhY3RvciAmKTsKKworfTsKKworYm9vbCBTbmlmZkZMQUMoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpOworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEZMQUNfRVhUUkFDVE9SX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKY29weSB0byBtZWRpYS9leHRyYWN0b3JzL2ZsYWMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL05PVElDRSBiL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9OT1RJQ0UKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvTk9USUNFCmNvcHkgdG8gbWVkaWEvZXh0cmFjdG9ycy9mbGFjL05PVElDRQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL2V4cG9ydHMubGRzIGIvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL2V4cG9ydHMubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMzA5ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvZXhwb3J0cy5sZHMKQEAgLTAsMCArMSBAQAoreyBnbG9iYWw6IEdFVEVYVFJBQ1RPUkRFRjsgbG9jYWw6ICo7IH07CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21pZGkvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZTA5ZGYxOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDIgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKworICAgIHNyY3M6IFsiTWlkaUV4dHJhY3Rvci5jcHAiXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJtZWRpYV9taWRpaW93cmFwcGVyIiwKKyAgICAgICAgImxpYnNvbml2b3giLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIKKyAgICBdLAorICAgIG5hbWU6ICJsaWJtaWRpZXh0cmFjdG9yIiwKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJleHRyYWN0b3JzIiwKKworICAgIGNvbXBpbGVfbXVsdGlsaWI6ICJmaXJzdCIsCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCisgICAgXSwKKyAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGRpYWc6IHsKKyAgICAgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9LAorCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvZXh0cmFjdG9ycy9taWRpL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmNvcHkgdG8gbWVkaWEvZXh0cmFjdG9ycy9taWRpL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9NaWRpRXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9NaWRpRXh0cmFjdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDlmYmUwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9taWRpL01pZGlFeHRyYWN0b3IuY3BwCkBAIC0wLDAgKzEsMzUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNaWRpRXh0cmFjdG9yIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiTWlkaUV4dHJhY3Rvci5oIgorCisjaW5jbHVkZSA8bWVkaWEvTWlkaUlvV3JhcHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgorI2luY2x1ZGUgPGxpYnNvbml2b3gvZWFzX3JldmVyYi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIGhvdyBtYW55IFNvbml2b3ggb3V0cHV0IGJ1ZmZlcnMgdG8gYWdncmVnYXRlIGludG8gb25lIE1lZGlhQnVmZmVyQmFzZQorc3RhdGljIGNvbnN0IGludCBOVU1fQ09NQklORV9CVUZGRVJTID0gNDsKKworY2xhc3MgTWlkaVNvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrIHsKKworcHVibGljOgorICAgIE1pZGlTb3VyY2UoCisgICAgICAgICAgICBNaWRpRW5naW5lICZlbmdpbmUsCisgICAgICAgICAgICBNZXRhRGF0YUJhc2UgJnRyYWNrTWV0YWRhdGEpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcyk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlJik7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5NaWRpU291cmNlKCk7CisKK3ByaXZhdGU6CisgICAgTWlkaUVuZ2luZSAmbUVuZ2luZTsKKyAgICBNZXRhRGF0YUJhc2UgJm1UcmFja01ldGFkYXRhOworICAgIGJvb2wgbUluaXRDaGVjazsKKyAgICBib29sIG1TdGFydGVkOworCisgICAgc3RhdHVzX3QgaW5pdCgpOworCisgICAgLy8gbm8gY29weSBjb25zdHJ1Y3RvciBvciBhc3NpZ25tZW50CisgICAgTWlkaVNvdXJjZShjb25zdCBNaWRpU291cmNlICYpOworICAgIE1pZGlTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBNaWRpU291cmNlICYpOworCit9OworCisKKy8vIE1pZGlzb3VyY2UKKworTWlkaVNvdXJjZTo6TWlkaVNvdXJjZSgKKyAgICAgICAgTWlkaUVuZ2luZSAmZW5naW5lLAorICAgICAgICBNZXRhRGF0YUJhc2UgJnRyYWNrTWV0YWRhdGEpCisgICAgOiBtRW5naW5lKGVuZ2luZSksCisgICAgICBtVHJhY2tNZXRhZGF0YSh0cmFja01ldGFkYXRhKSwKKyAgICAgIG1Jbml0Q2hlY2soZmFsc2UpLAorICAgICAgbVN0YXJ0ZWQoZmFsc2UpCit7CisgICAgQUxPR1YoIk1pZGlTb3VyY2UgY3RvciIpOworICAgIG1Jbml0Q2hlY2sgPSBpbml0KCk7Cit9CisKK01pZGlTb3VyY2U6On5NaWRpU291cmNlKCkKK3sKKyAgICBBTE9HVigiTWlkaVNvdXJjZSBkdG9yIik7CisgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIHN0b3AoKTsKKyAgICB9Cit9CisKK3N0YXR1c190IE1pZGlTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqIC8qIHBhcmFtcyAqLykKK3sKKyAgICBBTE9HVigiTWlkaVNvdXJjZTo6c3RhcnQiKTsKKworICAgIENIRUNLKCFtU3RhcnRlZCk7CisgICAgbVN0YXJ0ZWQgPSB0cnVlOworICAgIG1FbmdpbmUuYWxsb2NhdGVCdWZmZXJzKCk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNaWRpU291cmNlOjpzdG9wKCkKK3sKKyAgICBBTE9HVigiTWlkaVNvdXJjZTo6c3RvcCIpOworCisgICAgQ0hFQ0sobVN0YXJ0ZWQpOworICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgbUVuZ2luZS5yZWxlYXNlQnVmZmVycygpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNaWRpU291cmNlOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKQoreworICAgIG1ldGEgPSBtVHJhY2tNZXRhZGF0YTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1pZGlTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dEJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpCit7CisgICAgQUxPR1YoIk1pZGlTb3VyY2U6OnJlYWQiKTsKKyAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcjsKKyAgICAvLyBwcm9jZXNzIGFuIG9wdGlvbmFsIHNlZWsgcmVxdWVzdAorICAgIGludDY0X3Qgc2Vla1RpbWVVczsKKyAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKKyAgICBpZiAoKE5VTEwgIT0gb3B0aW9ucykgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKKyAgICAgICAgaWYgKHNlZWtUaW1lVXMgPD0gMExMKSB7CisgICAgICAgICAgICBzZWVrVGltZVVzID0gMExMOworICAgICAgICB9CisgICAgICAgIG1FbmdpbmUuc2Vla1RvKHNlZWtUaW1lVXMpOworICAgIH0KKyAgICBidWZmZXIgPSBtRW5naW5lLnJlYWRCdWZmZXIoKTsKKyAgICAqb3V0QnVmZmVyID0gYnVmZmVyOworICAgIEFMT0dWKCJNaWRpU291cmNlOjpyZWFkICVwIGRvbmUiLCB0aGlzKTsKKyAgICByZXR1cm4gYnVmZmVyICE9IE5VTEwgPyAoc3RhdHVzX3QpIE9LIDogKHN0YXR1c190KSBFUlJPUl9FTkRfT0ZfU1RSRUFNOworfQorCitzdGF0dXNfdCBNaWRpU291cmNlOjppbml0KCkKK3sKKyAgICBBTE9HVigiTWlkaVNvdXJjZTo6aW5pdCIpOworICAgIHJldHVybiBPSzsKK30KKworLy8gTWlkaUVuZ2luZQorCitNaWRpRW5naW5lOjpNaWRpRW5naW5lKERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlLAorICAgICAgICBNZXRhRGF0YUJhc2UgKmZpbGVNZXRhZGF0YSwKKyAgICAgICAgTWV0YURhdGFCYXNlICp0cmFja01ldGFkYXRhKSA6CisgICAgICAgICAgICBtR3JvdXAoTlVMTCksCisgICAgICAgICAgICBtRWFzRGF0YShOVUxMKSwKKyAgICAgICAgICAgIG1FYXNIYW5kbGUoTlVMTCksCisgICAgICAgICAgICBtRWFzQ29uZmlnKE5VTEwpLAorICAgICAgICAgICAgbUlzSW5pdGlhbGl6ZWQoZmFsc2UpIHsKKyAgICBtSW9XcmFwcGVyID0gbmV3IE1pZGlJb1dyYXBwZXIoZGF0YVNvdXJjZSk7CisgICAgLy8gc3BpbiB1cCBhIG5ldyBFQVMgZW5naW5lCisgICAgRUFTX0kzMiB0ZW1wOworICAgIEVBU19SRVNVTFQgcmVzdWx0ID0gRUFTX0luaXQoJm1FYXNEYXRhKTsKKworICAgIGlmIChyZXN1bHQgPT0gRUFTX1NVQ0NFU1MpIHsKKyAgICAgICAgcmVzdWx0ID0gRUFTX09wZW5GaWxlKG1FYXNEYXRhLCBtSW9XcmFwcGVyLT5nZXRMb2NhdG9yKCksICZtRWFzSGFuZGxlKTsKKyAgICB9CisgICAgaWYgKHJlc3VsdCA9PSBFQVNfU1VDQ0VTUykgeworICAgICAgICByZXN1bHQgPSBFQVNfUHJlcGFyZShtRWFzRGF0YSwgbUVhc0hhbmRsZSk7CisgICAgfQorICAgIGlmIChyZXN1bHQgPT0gRUFTX1NVQ0NFU1MpIHsKKyAgICAgICAgcmVzdWx0ID0gRUFTX1BhcnNlTWV0YURhdGEobUVhc0RhdGEsIG1FYXNIYW5kbGUsICZ0ZW1wKTsKKyAgICB9CisKKyAgICBpZiAocmVzdWx0ICE9IEVBU19TVUNDRVNTKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoZmlsZU1ldGFkYXRhICE9IE5VTEwpIHsKKyAgICAgICAgZmlsZU1ldGFkYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTUlESSk7CisgICAgfQorCisgICAgaWYgKHRyYWNrTWV0YWRhdGEgIT0gTlVMTCkgeworICAgICAgICB0cmFja01ldGFkYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKKyAgICAgICAgdHJhY2tNZXRhZGF0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCAxMDAwbGwgKiB0ZW1wKTsgLy8gbWlsbGktPm1pY3JvCisgICAgICAgIG1FYXNDb25maWcgPSBFQVNfQ29uZmlnKCk7CisgICAgICAgIHRyYWNrTWV0YWRhdGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBtRWFzQ29uZmlnLT5zYW1wbGVSYXRlKTsKKyAgICAgICAgdHJhY2tNZXRhZGF0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbUVhc0NvbmZpZy0+bnVtQ2hhbm5lbHMpOworICAgICAgICB0cmFja01ldGFkYXRhLT5zZXRJbnQzMihrS2V5UGNtRW5jb2RpbmcsIGtBdWRpb0VuY29kaW5nUGNtMTZiaXQpOworICAgIH0KKyAgICBtSXNJbml0aWFsaXplZCA9IHRydWU7Cit9CisKK01pZGlFbmdpbmU6On5NaWRpRW5naW5lKCkgeworICAgIGlmIChtRWFzSGFuZGxlKSB7CisgICAgICAgIEVBU19DbG9zZUZpbGUobUVhc0RhdGEsIG1FYXNIYW5kbGUpOworICAgIH0KKyAgICBpZiAobUVhc0RhdGEpIHsKKyAgICAgICAgRUFTX1NodXRkb3duKG1FYXNEYXRhKTsKKyAgICB9CisgICAgZGVsZXRlIG1Hcm91cDsKKyAgICBkZWxldGUgbUlvV3JhcHBlcjsKK30KKworc3RhdHVzX3QgTWlkaUVuZ2luZTo6aW5pdENoZWNrKCkgeworICAgIHJldHVybiBtSXNJbml0aWFsaXplZCA/IE9LIDogVU5LTk9XTl9FUlJPUjsKK30KKworc3RhdHVzX3QgTWlkaUVuZ2luZTo6YWxsb2NhdGVCdWZmZXJzKCkgeworICAgIC8vIHNlbGVjdCByZXZlcmIgcHJlc2V0IGFuZCBlbmFibGUKKyAgICBFQVNfU2V0UGFyYW1ldGVyKG1FYXNEYXRhLCBFQVNfTU9EVUxFX1JFVkVSQiwgRUFTX1BBUkFNX1JFVkVSQl9QUkVTRVQsIEVBU19QQVJBTV9SRVZFUkJfQ0hBTUJFUik7CisgICAgRUFTX1NldFBhcmFtZXRlcihtRWFzRGF0YSwgRUFTX01PRFVMRV9SRVZFUkIsIEVBU19QQVJBTV9SRVZFUkJfQllQQVNTLCBFQVNfRkFMU0UpOworCisgICAgbUdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXA7CisgICAgaW50IGJ1ZnNpemUgPSBzaXplb2YoRUFTX1BDTSkKKyAgICAgICAgICAgICogbUVhc0NvbmZpZy0+bWl4QnVmZmVyU2l6ZSAqIG1FYXNDb25maWctPm51bUNoYW5uZWxzICogTlVNX0NPTUJJTkVfQlVGRkVSUzsKKyAgICBBTE9HVigidXNpbmcgJWQgYnl0ZSBidWZmZXIiLCBidWZzaXplKTsKKyAgICBtR3JvdXAtPmFkZF9idWZmZXIoTWVkaWFCdWZmZXJCYXNlOjpDcmVhdGUoYnVmc2l6ZSkpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTWlkaUVuZ2luZTo6cmVsZWFzZUJ1ZmZlcnMoKSB7CisgICAgZGVsZXRlIG1Hcm91cDsKKyAgICBtR3JvdXAgPSBOVUxMOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTWlkaUVuZ2luZTo6c2Vla1RvKGludDY0X3QgcG9zaXRpb25VcykgeworICAgIEFMT0dWKCJzZWVrVG8gJWxsZCIsIChsb25nIGxvbmcpcG9zaXRpb25Vcyk7CisgICAgRUFTX1JFU1VMVCByZXN1bHQgPSBFQVNfTG9jYXRlKG1FYXNEYXRhLCBtRWFzSGFuZGxlLCBwb3NpdGlvblVzIC8gMTAwMCwgZmFsc2UpOworICAgIHJldHVybiByZXN1bHQgPT0gRUFTX1NVQ0NFU1MgPyBPSyA6IFVOS05PV05fRVJST1I7Cit9CisKK01lZGlhQnVmZmVyQmFzZSogTWlkaUVuZ2luZTo6cmVhZEJ1ZmZlcigpIHsKKyAgICBFQVNfU1RBVEUgc3RhdGU7CisgICAgRUFTX1N0YXRlKG1FYXNEYXRhLCBtRWFzSGFuZGxlLCAmc3RhdGUpOworICAgIGlmICgoc3RhdGUgPT0gRUFTX1NUQVRFX1NUT1BQRUQpIHx8IChzdGF0ZSA9PSBFQVNfU1RBVEVfRVJST1IpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcjsKKyAgICBzdGF0dXNfdCBlcnIgPSBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoInJlYWRCdWZmZXI6IG5vIGJ1ZmZlciIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgRUFTX0kzMiB0aW1lTXM7CisgICAgRUFTX0dldExvY2F0aW9uKG1FYXNEYXRhLCBtRWFzSGFuZGxlLCAmdGltZU1zKTsKKyAgICBpbnQ2NF90IHRpbWVVcyA9IDEwMDBsbCAqIHRpbWVNczsKKyAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOworCisgICAgRUFTX1BDTSogcCA9IChFQVNfUENNKikgYnVmZmVyLT5kYXRhKCk7CisgICAgaW50IG51bUJ5dGVzT3V0cHV0ID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9DT01CSU5FX0JVRkZFUlM7IGkrKykgeworICAgICAgICBFQVNfSTMyIG51bVJlbmRlcmVkOworICAgICAgICBFQVNfUkVTVUxUIHJlc3VsdCA9IEVBU19SZW5kZXIobUVhc0RhdGEsIHAsIG1FYXNDb25maWctPm1peEJ1ZmZlclNpemUsICZudW1SZW5kZXJlZCk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gRUFTX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFQVNfUmVuZGVyIHJldHVybmVkICVsZCIsIHJlc3VsdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBwICs9IG51bVJlbmRlcmVkICogbUVhc0NvbmZpZy0+bnVtQ2hhbm5lbHM7CisgICAgICAgIG51bUJ5dGVzT3V0cHV0ICs9IG51bVJlbmRlcmVkICogbUVhc0NvbmZpZy0+bnVtQ2hhbm5lbHMgKiBzaXplb2YoRUFTX1BDTSk7CisgICAgfQorICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIG51bUJ5dGVzT3V0cHV0KTsKKyAgICBBTE9HVigicmVhZEJ1ZmZlcjogcmV0dXJuaW5nICV6ZCBpbiBidWZmZXIgJXAiLCBidWZmZXItPnJhbmdlX2xlbmd0aCgpLCBidWZmZXIpOworICAgIHJldHVybiBidWZmZXI7Cit9CisKKworLy8gTWlkaUV4dHJhY3RvcgorCitNaWRpRXh0cmFjdG9yOjpNaWRpRXh0cmFjdG9yKAorICAgICAgICBEYXRhU291cmNlQmFzZSAqZGF0YVNvdXJjZSkKKyAgICA6IG1EYXRhU291cmNlKGRhdGFTb3VyY2UpLAorICAgICAgbUluaXRDaGVjayhmYWxzZSkKK3sKKyAgICBBTE9HVigiTWlkaUV4dHJhY3RvciBjdG9yIik7CisgICAgbUVuZ2luZSA9IG5ldyBNaWRpRW5naW5lKG1EYXRhU291cmNlLCAmbUZpbGVNZXRhZGF0YSwgJm1UcmFja01ldGFkYXRhKTsKKyAgICBtSW5pdENoZWNrID0gbUVuZ2luZS0+aW5pdENoZWNrKCk7Cit9CisKK01pZGlFeHRyYWN0b3I6On5NaWRpRXh0cmFjdG9yKCkKK3sKKyAgICBBTE9HVigiTWlkaUV4dHJhY3RvciBkdG9yIik7Cit9CisKK3NpemVfdCBNaWRpRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpCit7CisgICAgcmV0dXJuIG1Jbml0Q2hlY2sgPT0gT0sgPyAxIDogMDsKK30KKworTWVkaWFUcmFjayAqTWlkaUV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KQoreworICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ID4gMCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBNaWRpU291cmNlKCptRW5naW5lLCBtVHJhY2tNZXRhZGF0YSk7Cit9CisKK3N0YXR1c190IE1pZGlFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCisgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgeworICAgIEFMT0dWKCJNaWRpRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhIik7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggPiAwKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBtZXRhID0gbVRyYWNrTWV0YWRhdGE7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNaWRpRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpCit7CisgICAgQUxPR1YoIk1pZGlFeHRyYWN0b3I6OmdldE1ldGFEYXRhIik7CisgICAgbWV0YSA9IG1GaWxlTWV0YWRhdGE7CisgICAgcmV0dXJuIE9LOworfQorCisvLyBTbmlmZmVyCisKK2Jvb2wgU25pZmZNaWRpKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKQoreworICAgIE1pZGlFbmdpbmUgcChzb3VyY2UsIE5VTEwsIE5VTEwpOworICAgIGlmIChwLmluaXRDaGVjaygpID09IE9LKSB7CisgICAgICAgICpjb25maWRlbmNlID0gMC44OworICAgICAgICBBTE9HVigiU25pZmZNaWRpOiB5ZXMiKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIEFMT0dWKCJTbmlmZk1pZGk6IG5vIik7CisgICAgcmV0dXJuIGZhbHNlOworCit9CisKK2V4dGVybiAiQyIgeworLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAorX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQorTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CisgICAgcmV0dXJuIHsKKyAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkVYVFJBQ1RPUkRFRl9WRVJTSU9OLAorICAgICAgICBVVUlEKCJlZjZjY2EwYS1mOGEyLTQzZTYtYmE1Zi1kZmNkN2M5YTdlZjIiKSwKKyAgICAgICAgMSwKKyAgICAgICAgIk1JREkgRXh0cmFjdG9yIiwKKyAgICAgICAgW10oCisgICAgICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICBmbG9hdCAqY29uZmlkZW5jZSwKKyAgICAgICAgICAgICAgICB2b2lkICoqLAorICAgICAgICAgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKikgLT4gTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIHsKKyAgICAgICAgICAgIGlmIChTbmlmZk1pZGkoc291cmNlLCBjb25maWRlbmNlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBbXSgKKyAgICAgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopIC0+IE1lZGlhRXh0cmFjdG9yKiB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTWlkaUV4dHJhY3Rvcihzb3VyY2UpO307CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH07Cit9CisKK30gLy8gZXh0ZXJuICJDIgorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9taWRpL01pZGlFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9NaWRpRXh0cmFjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ0ZGQwZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9NaWRpRXh0cmFjdG9yLmgKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUlESV9FWFRSQUNUT1JfSF8KKyNkZWZpbmUgTUlESV9FWFRSQUNUT1JfSF8KKworI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWlkaUlvV3JhcHBlci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDxsaWJzb25pdm94L2Vhcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE1pZGlFbmdpbmUgeworcHVibGljOgorICAgIGV4cGxpY2l0IE1pZGlFbmdpbmUoRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UsCisgICAgICAgICAgICBNZXRhRGF0YUJhc2UgKmZpbGVNZXRhZGF0YSwKKyAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAqdHJhY2tNZXRhZGF0YSk7CisgICAgfk1pZGlFbmdpbmUoKTsKKworICAgIHN0YXR1c190IGluaXRDaGVjaygpOworCisgICAgc3RhdHVzX3QgYWxsb2NhdGVCdWZmZXJzKCk7CisgICAgc3RhdHVzX3QgcmVsZWFzZUJ1ZmZlcnMoKTsKKyAgICBzdGF0dXNfdCBzZWVrVG8oaW50NjRfdCBwb3NpdGlvblVzKTsKKyAgICBNZWRpYUJ1ZmZlckJhc2UqIHJlYWRCdWZmZXIoKTsKK3ByaXZhdGU6CisgICAgTWlkaUlvV3JhcHBlciAqbUlvV3JhcHBlcjsKKyAgICBNZWRpYUJ1ZmZlckdyb3VwICptR3JvdXA7CisgICAgRUFTX0RBVEFfSEFORExFIG1FYXNEYXRhOworICAgIEVBU19IQU5ETEUgbUVhc0hhbmRsZTsKKyAgICBjb25zdCBTX0VBU19MSUJfQ09ORklHKiBtRWFzQ29uZmlnOworICAgIGJvb2wgbUlzSW5pdGlhbGl6ZWQ7Cit9OworCitjbGFzcyBNaWRpRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKKworcHVibGljOgorICAgIGV4cGxpY2l0IE1pZGlFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CisKKyAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOworICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKTsKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIk1pZGlFeHRyYWN0b3IiOyB9CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5NaWRpRXh0cmFjdG9yKCk7CisKK3ByaXZhdGU6CisgICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CisgICAgTWV0YURhdGFCYXNlIG1GaWxlTWV0YWRhdGE7CisKKyAgICAvLyBUaGVyZSBpcyBvbmx5IG9uZSB0cmFjaworICAgIE1ldGFEYXRhQmFzZSBtVHJhY2tNZXRhZGF0YTsKKworICAgIE1pZGlFbmdpbmUgKm1FbmdpbmU7CisKKyAgICBFQVNfREFUQV9IQU5ETEUgICAgIG1FYXNEYXRhOworICAgIEVBU19IQU5ETEUgICAgICAgICAgbUVhc0hhbmRsZTsKKyAgICBFQVNfUENNKiAgICAgICAgICAgIG1BdWRpb0J1ZmZlcjsKKyAgICBFQVNfSTMyICAgICAgICAgICAgIG1QbGF5VGltZTsKKyAgICBFQVNfSTMyICAgICAgICAgICAgIG1EdXJhdGlvbjsKKyAgICBFQVNfU1RBVEUgICAgICAgICAgIG1TdGF0ZTsKKyAgICBFQVNfRklMRSAgICAgICAgICAgIG1GaWxlTG9jYXRvcjsKKworICAgIE1pZGlFeHRyYWN0b3IoY29uc3QgTWlkaUV4dHJhY3RvciAmKTsKKyAgICBNaWRpRXh0cmFjdG9yICZvcGVyYXRvcj0oY29uc3QgTWlkaUV4dHJhY3RvciAmKTsKKworfTsKKworYm9vbCBTbmlmZk1pZGkoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpOworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1JRElfRVhUUkFDVE9SX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9OT1RJQ0UgYi9tZWRpYS9leHRyYWN0b3JzL21pZGkvTk9USUNFCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTk9USUNFCmNvcHkgdG8gbWVkaWEvZXh0cmFjdG9ycy9taWRpL05PVElDRQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9taWRpL2V4cG9ydHMubGRzIGIvbWVkaWEvZXh0cmFjdG9ycy9taWRpL2V4cG9ydHMubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMzA5ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21pZGkvZXhwb3J0cy5sZHMKQEAgLTAsMCArMSBAQAoreyBnbG9iYWw6IEdFVEVYVFJBQ1RPUkRFRjsgbG9jYWw6ICo7IH07CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21rdi9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9ta3YvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODFmZDM1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9ta3YvQW5kcm9pZC5icApAQCAtMCwwICsxLDQ4IEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisKKyAgICBzcmNzOiBbIk1hdHJvc2thRXh0cmFjdG9yLmNwcCJdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJleHRlcm5hbC9mbGFjL2luY2x1ZGUiLAorICAgICAgICAiZXh0ZXJuYWwvbGlidnB4L2xpYndlYm0iLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYyIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZsYWNkZWMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tZXRhZGF0YXV0aWxzIiwKKyAgICAgICAgImxpYndlYm0iLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBuYW1lOiAibGlibWt2ZXh0cmFjdG9yIiwKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJleHRyYWN0b3JzIiwKKworICAgIGNvbXBpbGVfbXVsdGlsaWI6ICJmaXJzdCIsCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCisgICAgXSwKKyAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGRpYWc6IHsKKyAgICAgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9LAorCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvZXh0cmFjdG9ycy9ta3YvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKY29weSB0byBtZWRpYS9leHRyYWN0b3JzL21rdi9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21rdi9NYXRyb3NrYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21rdi9NYXRyb3NrYUV4dHJhY3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY1NzU4MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbWt2L01hdHJvc2thRXh0cmFjdG9yLmNwcApAQCAtMCwwICsxLDE2NjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1hdHJvc2thRXh0cmFjdG9yIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiRkxBQ0RlY29kZXIuaCIKKyNpbmNsdWRlICJNYXRyb3NrYUV4dHJhY3Rvci5oIgorCisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9FeHRyYWN0b3JVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBEYXRhU291cmNlQmFzZVJlYWRlciA6IHB1YmxpYyBta3ZwYXJzZXI6OklNa3ZSZWFkZXIgeworICAgIGV4cGxpY2l0IERhdGFTb3VyY2VCYXNlUmVhZGVyKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCisgICAgICAgIDogbVNvdXJjZShzb3VyY2UpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGludCBSZWFkKGxvbmcgbG9uZyBwb3NpdGlvbiwgbG9uZyBsZW5ndGgsIHVuc2lnbmVkIGNoYXIqIGJ1ZmZlcikgeworICAgICAgICBDSEVDSyhwb3NpdGlvbiA+PSAwKTsKKyAgICAgICAgQ0hFQ0sobGVuZ3RoID49IDApOworCisgICAgICAgIGlmIChsZW5ndGggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBzc2l6ZV90IG4gPSBtU291cmNlLT5yZWFkQXQocG9zaXRpb24sIGJ1ZmZlciwgbGVuZ3RoKTsKKworICAgICAgICBpZiAobiA8PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGludCBMZW5ndGgobG9uZyBsb25nKiB0b3RhbCwgbG9uZyBsb25nKiBhdmFpbGFibGUpIHsKKyAgICAgICAgb2ZmNjRfdCBzaXplOworICAgICAgICBpZiAobVNvdXJjZS0+Z2V0U2l6ZSgmc2l6ZSkgIT0gT0spIHsKKyAgICAgICAgICAgICp0b3RhbCA9IC0xOworICAgICAgICAgICAgKmF2YWlsYWJsZSA9IChsb25nIGxvbmcpKCgxdWxsIDw8IDYzKSAtIDEpOworCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0b3RhbCkgeworICAgICAgICAgICAgKnRvdGFsID0gc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhdmFpbGFibGUpIHsKKyAgICAgICAgICAgICphdmFpbGFibGUgPSBzaXplOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCitwcml2YXRlOgorICAgIERhdGFTb3VyY2VCYXNlICptU291cmNlOworCisgICAgRGF0YVNvdXJjZUJhc2VSZWFkZXIoY29uc3QgRGF0YVNvdXJjZUJhc2VSZWFkZXIgJik7CisgICAgRGF0YVNvdXJjZUJhc2VSZWFkZXIgJm9wZXJhdG9yPShjb25zdCBEYXRhU291cmNlQmFzZVJlYWRlciAmKTsKK307CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0cnVjdCBCbG9ja0l0ZXJhdG9yIHsKKyAgICBCbG9ja0l0ZXJhdG9yKE1hdHJvc2thRXh0cmFjdG9yICpleHRyYWN0b3IsIHVuc2lnbmVkIGxvbmcgdHJhY2tOdW0sIHVuc2lnbmVkIGxvbmcgaW5kZXgpOworCisgICAgYm9vbCBlb3MoKSBjb25zdDsKKworICAgIHZvaWQgYWR2YW5jZSgpOworICAgIHZvaWQgcmVzZXQoKTsKKworICAgIHZvaWQgc2VlaygKKyAgICAgICAgICAgIGludDY0X3Qgc2Vla1RpbWVVcywgYm9vbCBpc0F1ZGlvLAorICAgICAgICAgICAgaW50NjRfdCAqYWN0dWFsRnJhbWVUaW1lVXMpOworCisgICAgY29uc3QgbWt2cGFyc2VyOjpCbG9jayAqYmxvY2soKSBjb25zdDsKKyAgICBpbnQ2NF90IGJsb2NrVGltZVVzKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgTWF0cm9za2FFeHRyYWN0b3IgKm1FeHRyYWN0b3I7CisgICAgbG9uZyBsb25nIG1UcmFja051bTsKKyAgICB1bnNpZ25lZCBsb25nIG1JbmRleDsKKworICAgIGNvbnN0IG1rdnBhcnNlcjo6Q2x1c3RlciAqbUNsdXN0ZXI7CisgICAgY29uc3QgbWt2cGFyc2VyOjpCbG9ja0VudHJ5ICptQmxvY2tFbnRyeTsKKyAgICBsb25nIG1CbG9ja0VudHJ5SW5kZXg7CisKKyAgICB2b2lkIGFkdmFuY2VfbCgpOworCisgICAgQmxvY2tJdGVyYXRvcihjb25zdCBCbG9ja0l0ZXJhdG9yICYpOworICAgIEJsb2NrSXRlcmF0b3IgJm9wZXJhdG9yPShjb25zdCBCbG9ja0l0ZXJhdG9yICYpOworfTsKKworc3RydWN0IE1hdHJvc2thU291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworICAgIE1hdHJvc2thU291cmNlKE1hdHJvc2thRXh0cmFjdG9yICpleHRyYWN0b3IsIHNpemVfdCBpbmRleCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+TWF0cm9za2FTb3VyY2UoKTsKKworcHJpdmF0ZToKKyAgICBlbnVtIFR5cGUgeworICAgICAgICBBVkMsCisgICAgICAgIEFBQywKKyAgICAgICAgSEVWQywKKyAgICAgICAgT1RIRVIKKyAgICB9OworCisgICAgTWF0cm9za2FFeHRyYWN0b3IgKm1FeHRyYWN0b3I7CisgICAgc2l6ZV90IG1UcmFja0luZGV4OworICAgIFR5cGUgbVR5cGU7CisgICAgYm9vbCBtSXNBdWRpbzsKKyAgICBCbG9ja0l0ZXJhdG9yIG1CbG9ja0l0ZXI7CisgICAgc3NpemVfdCBtTkFMU2l6ZUxlbjsgIC8vIGZvciB0eXBlIEFWQyBvciBIRVZDCisKKyAgICBMaXN0PE1lZGlhQnVmZmVyQmFzZSAqPiBtUGVuZGluZ0ZyYW1lczsKKworICAgIHN0YXR1c190IGFkdmFuY2UoKTsKKworICAgIHN0YXR1c190IHNldFdlYm1CbG9ja0NyeXB0b0luZm8oTWVkaWFCdWZmZXJCYXNlICptYnVmKTsKKyAgICBzdGF0dXNfdCByZWFkQmxvY2soKTsKKyAgICB2b2lkIGNsZWFyUGVuZGluZ0ZyYW1lcygpOworCisgICAgTWF0cm9za2FTb3VyY2UoY29uc3QgTWF0cm9za2FTb3VyY2UgJik7CisgICAgTWF0cm9za2FTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBNYXRyb3NrYVNvdXJjZSAmKTsKK307CisKK2NvbnN0IG1rdnBhcnNlcjo6VHJhY2sqIE1hdHJvc2thRXh0cmFjdG9yOjpUcmFja0luZm86OmdldFRyYWNrKCkgY29uc3QgeworICAgIHJldHVybiBtRXh0cmFjdG9yLT5tU2VnbWVudC0+R2V0VHJhY2tzKCktPkdldFRyYWNrQnlOdW1iZXIobVRyYWNrTnVtKTsKK30KKworLy8gVGhpcyBmdW5jdGlvbiBkb2VzIGV4YWN0bHkgdGhlIHNhbWUgYXMgbWt2cGFyc2VyOjpDdWVzOjpGaW5kLCBleGNlcHQgdGhhdCBpdAorLy8gc2VhcmNoZXMgaW4gb3VyIG93biB0cmFjayBiYXNlZCB2ZWN0b3JzLiBXZSBzaG91bGQgbm90IG5lZWQgdGhpcyBvbmNlIG1rdnBhcnNlcgorLy8gYWRkcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5LgorY29uc3QgbWt2cGFyc2VyOjpDdWVQb2ludDo6VHJhY2tQb3NpdGlvbiAqTWF0cm9za2FFeHRyYWN0b3I6OlRyYWNrSW5mbzo6ZmluZCgKKyAgICAgICAgbG9uZyBsb25nIHRpbWVOcykgY29uc3QgeworICAgIEFMT0dWKCJtQ3VlUG9pbnRzLnNpemUgJXp1IiwgbUN1ZVBvaW50cy5zaXplKCkpOworICAgIGlmIChtQ3VlUG9pbnRzLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgY29uc3QgbWt2cGFyc2VyOjpDdWVQb2ludCogY3AgPSBtQ3VlUG9pbnRzLml0ZW1BdCgwKTsKKyAgICBjb25zdCBta3ZwYXJzZXI6OlRyYWNrKiB0cmFjayA9IGdldFRyYWNrKCk7CisgICAgaWYgKHRpbWVOcyA8PSBjcC0+R2V0VGltZShtRXh0cmFjdG9yLT5tU2VnbWVudCkpIHsKKyAgICAgICAgcmV0dXJuIGNwLT5GaW5kKHRyYWNrKTsKKyAgICB9CisKKyAgICAvLyBCaW5hcnkgc2VhcmNoZXMgdGhyb3VnaCByZWxldmFudCBjdWVzOyBhc3N1bWVzIGN1ZXMgYXJlIG9yZGVyZWQgYnkgdGltZWNvZGUuCisgICAgLy8gSWYgd2UgZG8gZGV0ZWN0IG91dC1vZi1vcmRlciBjdWVzLCByZXR1cm4gTlVMTC4KKyAgICBzaXplX3QgbG8gPSAwOworICAgIHNpemVfdCBoaSA9IG1DdWVQb2ludHMuc2l6ZSgpOworICAgIHdoaWxlIChsbyA8IGhpKSB7CisgICAgICAgIGNvbnN0IHNpemVfdCBtaWQgPSBsbyArIChoaSAtIGxvKSAvIDI7CisgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6Q3VlUG9pbnQqIGNvbnN0IG1pZENwID0gbUN1ZVBvaW50cy5pdGVtQXQobWlkKTsKKyAgICAgICAgY29uc3QgbG9uZyBsb25nIGN1ZVRpbWVOcyA9IG1pZENwLT5HZXRUaW1lKG1FeHRyYWN0b3ItPm1TZWdtZW50KTsKKyAgICAgICAgaWYgKGN1ZVRpbWVOcyA8PSB0aW1lTnMpIHsKKyAgICAgICAgICAgIGxvID0gbWlkICsgMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGhpID0gbWlkOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGxvID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgY3AgPSBtQ3VlUG9pbnRzLml0ZW1BdChsbyAtIDEpOworICAgIGlmIChjcC0+R2V0VGltZShtRXh0cmFjdG9yLT5tU2VnbWVudCkgPiB0aW1lTnMpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGNwLT5GaW5kKHRyYWNrKTsKK30KKworTWF0cm9za2FTb3VyY2U6Ok1hdHJvc2thU291cmNlKAorICAgICAgICBNYXRyb3NrYUV4dHJhY3RvciAqZXh0cmFjdG9yLCBzaXplX3QgaW5kZXgpCisgICAgOiBtRXh0cmFjdG9yKGV4dHJhY3RvciksCisgICAgICBtVHJhY2tJbmRleChpbmRleCksCisgICAgICBtVHlwZShPVEhFUiksCisgICAgICBtSXNBdWRpbyhmYWxzZSksCisgICAgICBtQmxvY2tJdGVyKG1FeHRyYWN0b3IsCisgICAgICAgICAgICAgICAgIG1FeHRyYWN0b3ItPm1UcmFja3MuaXRlbUF0KGluZGV4KS5tVHJhY2tOdW0sCisgICAgICAgICAgICAgICAgIGluZGV4KSwKKyAgICAgIG1OQUxTaXplTGVuKC0xKSB7CisgICAgTWV0YURhdGFCYXNlICZtZXRhID0gbUV4dHJhY3Rvci0+bVRyYWNrcy5lZGl0SXRlbUF0KGluZGV4KS5tTWV0YTsKKworICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgQ0hFQ0sobWV0YS5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisKKyAgICBtSXNBdWRpbyA9ICFzdHJuY2FzZWNtcCgiYXVkaW8vIiwgbWltZSwgNik7CisKKyAgICBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKSkgeworICAgICAgICBtVHlwZSA9IEFWQzsKKworICAgICAgICB1aW50MzJfdCBkdW1teTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqYXZjYzsKKyAgICAgICAgc2l6ZV90IGF2Y2NTaXplOworICAgICAgICBpbnQzMl90IG5hbFNpemVMZW4gPSAwOworICAgICAgICBpZiAobWV0YS5maW5kSW50MzIoa0tleU5hbExlbmd0aFNpemUsICZuYWxTaXplTGVuKSkgeworICAgICAgICAgICAgaWYgKG5hbFNpemVMZW4gPj0gMCAmJiBuYWxTaXplTGVuIDw9IDQpIHsKKyAgICAgICAgICAgICAgICBtTkFMU2l6ZUxlbiA9IG5hbFNpemVMZW47CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobWV0YS5maW5kRGF0YShrS2V5QVZDQywgJmR1bW15LCAoY29uc3Qgdm9pZCAqKikmYXZjYywgJmF2Y2NTaXplKQorICAgICAgICAgICAgICAgICYmIGF2Y2NTaXplID49IDV1KSB7CisgICAgICAgICAgICBtTkFMU2l6ZUxlbiA9IDEgKyAoYXZjY1s0XSAmIDMpOworICAgICAgICAgICAgQUxPR1YoIm1OQUxTaXplTGVuID0gJXpkIiwgbU5BTFNpemVMZW4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIk5vIG1OQUxTaXplTGVuIik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpKSB7CisgICAgICAgIG1UeXBlID0gSEVWQzsKKworICAgICAgICB1aW50MzJfdCBkdW1teTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqaHZjYzsKKyAgICAgICAgc2l6ZV90IGh2Y2NTaXplOworICAgICAgICBpZiAobWV0YS5maW5kRGF0YShrS2V5SFZDQywgJmR1bW15LCAoY29uc3Qgdm9pZCAqKikmaHZjYywgJmh2Y2NTaXplKQorICAgICAgICAgICAgICAgICYmIGh2Y2NTaXplID49IDIydSkgeworICAgICAgICAgICAgbU5BTFNpemVMZW4gPSAxICsgKGh2Y2NbMTQrN10gJiAzKTsKKyAgICAgICAgICAgIEFMT0dWKCJtTkFMU2l6ZUxlbiA9ICV6dSIsIG1OQUxTaXplTGVuKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJObyBtTkFMU2l6ZUxlbiIpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpKSB7CisgICAgICAgIG1UeXBlID0gQUFDOworICAgIH0KK30KKworTWF0cm9za2FTb3VyY2U6On5NYXRyb3NrYVNvdXJjZSgpIHsKKyAgICBjbGVhclBlbmRpbmdGcmFtZXMoKTsKK30KKworc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqIC8qIHBhcmFtcyAqLykgeworICAgIGlmIChtVHlwZSA9PSBBVkMgJiYgbU5BTFNpemVMZW4gPCAwKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgbUJsb2NrSXRlci5yZXNldCgpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6c3RvcCgpIHsKKyAgICBjbGVhclBlbmRpbmdGcmFtZXMoKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKKyAgICBtZXRhID0gbUV4dHJhY3Rvci0+bVRyYWNrcy5pdGVtQXQobVRyYWNrSW5kZXgpLm1NZXRhOworICAgIHJldHVybiBPSzsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQmxvY2tJdGVyYXRvcjo6QmxvY2tJdGVyYXRvcigKKyAgICAgICAgTWF0cm9za2FFeHRyYWN0b3IgKmV4dHJhY3RvciwgdW5zaWduZWQgbG9uZyB0cmFja051bSwgdW5zaWduZWQgbG9uZyBpbmRleCkKKyAgICA6IG1FeHRyYWN0b3IoZXh0cmFjdG9yKSwKKyAgICAgIG1UcmFja051bSh0cmFja051bSksCisgICAgICBtSW5kZXgoaW5kZXgpLAorICAgICAgbUNsdXN0ZXIoTlVMTCksCisgICAgICBtQmxvY2tFbnRyeShOVUxMKSwKKyAgICAgIG1CbG9ja0VudHJ5SW5kZXgoMCkgeworICAgIHJlc2V0KCk7Cit9CisKK2Jvb2wgQmxvY2tJdGVyYXRvcjo6ZW9zKCkgY29uc3QgeworICAgIHJldHVybiBtQ2x1c3RlciA9PSBOVUxMIHx8IG1DbHVzdGVyLT5FT1MoKTsKK30KKwordm9pZCBCbG9ja0l0ZXJhdG9yOjphZHZhbmNlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtRXh0cmFjdG9yLT5tTG9jayk7CisgICAgYWR2YW5jZV9sKCk7Cit9CisKK3ZvaWQgQmxvY2tJdGVyYXRvcjo6YWR2YW5jZV9sKCkgeworICAgIGZvciAoOzspIHsKKyAgICAgICAgbG9uZyByZXMgPSBtQ2x1c3Rlci0+R2V0RW50cnkobUJsb2NrRW50cnlJbmRleCwgbUJsb2NrRW50cnkpOworICAgICAgICBBTE9HVigiR2V0RW50cnkgcmV0dXJuZWQgJWxkIiwgcmVzKTsKKworICAgICAgICBsb25nIGxvbmcgcG9zOworICAgICAgICBsb25nIGxlbjsKKyAgICAgICAgaWYgKHJlcyA8IDApIHsKKyAgICAgICAgICAgIC8vIE5lZWQgdG8gcGFyc2UgdGhpcyBjbHVzdGVyIHNvbWUgbW9yZQorCisgICAgICAgICAgICBDSEVDS19FUShyZXMsIG1rdnBhcnNlcjo6RV9CVUZGRVJfTk9UX0ZVTEwpOworCisgICAgICAgICAgICByZXMgPSBtQ2x1c3Rlci0+UGFyc2UocG9zLCBsZW4pOworICAgICAgICAgICAgQUxPR1YoIlBhcnNlIHJldHVybmVkICVsZCIsIHJlcyk7CisKKyAgICAgICAgICAgIGlmIChyZXMgPCAwKSB7CisgICAgICAgICAgICAgICAgLy8gSS9PIGVycm9yCisKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ2x1c3Rlcjo6UGFyc2UgcmV0dXJuZWQgcmVzdWx0ICVsZCIsIHJlcyk7CisKKyAgICAgICAgICAgICAgICBtQ2x1c3RlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgaWYgKHJlcyA9PSAwKSB7CisgICAgICAgICAgICAvLyBXZSdyZSBkb25lIHdpdGggdGhpcyBjbHVzdGVyCisKKyAgICAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6Q2x1c3RlciAqbmV4dENsdXN0ZXI7CisgICAgICAgICAgICByZXMgPSBtRXh0cmFjdG9yLT5tU2VnbWVudC0+UGFyc2VOZXh0KAorICAgICAgICAgICAgICAgICAgICBtQ2x1c3RlciwgbmV4dENsdXN0ZXIsIHBvcywgbGVuKTsKKyAgICAgICAgICAgIEFMT0dWKCJQYXJzZU5leHQgcmV0dXJuZWQgJWxkIiwgcmVzKTsKKworICAgICAgICAgICAgaWYgKHJlcyAhPSAwKSB7CisgICAgICAgICAgICAgICAgLy8gRU9GIG9yIGVycm9yCisKKyAgICAgICAgICAgICAgICBtQ2x1c3RlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENIRUNLX0VRKHJlcywgMCk7CisgICAgICAgICAgICBDSEVDSyhuZXh0Q2x1c3RlciAhPSBOVUxMKTsKKyAgICAgICAgICAgIENIRUNLKCFuZXh0Q2x1c3Rlci0+RU9TKCkpOworCisgICAgICAgICAgICBtQ2x1c3RlciA9IG5leHRDbHVzdGVyOworCisgICAgICAgICAgICByZXMgPSBtQ2x1c3Rlci0+UGFyc2UocG9zLCBsZW4pOworICAgICAgICAgICAgQUxPR1YoIlBhcnNlICgyKSByZXR1cm5lZCAlbGQiLCByZXMpOworCisgICAgICAgICAgICBpZiAocmVzIDwgMCkgeworICAgICAgICAgICAgICAgIC8vIEkvTyBlcnJvcgorCisgICAgICAgICAgICAgICAgQUxPR0UoIkNsdXN0ZXI6OlBhcnNlIHJldHVybmVkIHJlc3VsdCAlbGQiLCByZXMpOworCisgICAgICAgICAgICAgICAgbUNsdXN0ZXIgPSBOVUxMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtQmxvY2tFbnRyeUluZGV4ID0gMDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgQ0hFQ0sobUJsb2NrRW50cnkgIT0gTlVMTCk7CisgICAgICAgIENIRUNLKG1CbG9ja0VudHJ5LT5HZXRCbG9jaygpICE9IE5VTEwpOworICAgICAgICArK21CbG9ja0VudHJ5SW5kZXg7CisKKyAgICAgICAgaWYgKG1CbG9ja0VudHJ5LT5HZXRCbG9jaygpLT5HZXRUcmFja051bWJlcigpID09IG1UcmFja051bSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQmxvY2tJdGVyYXRvcjo6cmVzZXQoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1FeHRyYWN0b3ItPm1Mb2NrKTsKKworICAgIG1DbHVzdGVyID0gbUV4dHJhY3Rvci0+bVNlZ21lbnQtPkdldEZpcnN0KCk7CisgICAgbUJsb2NrRW50cnkgPSBOVUxMOworICAgIG1CbG9ja0VudHJ5SW5kZXggPSAwOworCisgICAgZG8geworICAgICAgICBhZHZhbmNlX2woKTsKKyAgICB9IHdoaWxlICghZW9zKCkgJiYgYmxvY2soKS0+R2V0VHJhY2tOdW1iZXIoKSAhPSBtVHJhY2tOdW0pOworfQorCit2b2lkIEJsb2NrSXRlcmF0b3I6OnNlZWsoCisgICAgICAgIGludDY0X3Qgc2Vla1RpbWVVcywgYm9vbCBpc0F1ZGlvLAorICAgICAgICBpbnQ2NF90ICphY3R1YWxGcmFtZVRpbWVVcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtRXh0cmFjdG9yLT5tTG9jayk7CisKKyAgICAqYWN0dWFsRnJhbWVUaW1lVXMgPSAtMWxsOworCisgICAgaWYgKHNlZWtUaW1lVXMgPiBJTlQ2NF9NQVggLyAxMDAwbGwgfHwKKyAgICAgICAgICAgIHNlZWtUaW1lVXMgPCBJTlQ2NF9NSU4gLyAxMDAwbGwgfHwKKyAgICAgICAgICAgIChtRXh0cmFjdG9yLT5tU2Vla1ByZVJvbGxOcyA+IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgKHNlZWtUaW1lVXMgKiAxMDAwbGwpIDwgSU5UNjRfTUlOICsgbUV4dHJhY3Rvci0+bVNlZWtQcmVSb2xsTnMpIHx8CisgICAgICAgICAgICAobUV4dHJhY3Rvci0+bVNlZWtQcmVSb2xsTnMgPCAwICYmCisgICAgICAgICAgICAgICAgICAgIChzZWVrVGltZVVzICogMTAwMGxsKSA+IElOVDY0X01BWCArIG1FeHRyYWN0b3ItPm1TZWVrUHJlUm9sbE5zKSkgeworICAgICAgICBBTE9HRSgiY2Fubm90IHNlZWsgdG8gJWxsZCIsIChsb25nIGxvbmcpIHNlZWtUaW1lVXMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgaW50NjRfdCBzZWVrVGltZU5zID0gc2Vla1RpbWVVcyAqIDEwMDBsbCAtIG1FeHRyYWN0b3ItPm1TZWVrUHJlUm9sbE5zOworCisgICAgbWt2cGFyc2VyOjpTZWdtZW50KiBjb25zdCBwU2VnbWVudCA9IG1FeHRyYWN0b3ItPm1TZWdtZW50OworCisgICAgLy8gU3BlY2lhbCBjYXNlIHRoZSAwIHNlZWsgdG8gYXZvaWQgbG9hZGluZyBDdWVzIHdoZW4gdGhlIGFwcGxpY2F0aW9uCisgICAgLy8gZXh0cmFuZW91c2x5IHNlZWtzIHRvIDAgYmVmb3JlIHBsYXlpbmcuCisgICAgaWYgKHNlZWtUaW1lTnMgPD0gMCkgeworICAgICAgICBBTE9HVigiU2VlayB0byBiZWdpbm5pbmc6ICUiIFBSSWQ2NCwgc2Vla1RpbWVVcyk7CisgICAgICAgIG1DbHVzdGVyID0gcFNlZ21lbnQtPkdldEZpcnN0KCk7CisgICAgICAgIG1CbG9ja0VudHJ5SW5kZXggPSAwOworICAgICAgICBkbyB7CisgICAgICAgICAgICBhZHZhbmNlX2woKTsKKyAgICAgICAgfSB3aGlsZSAoIWVvcygpICYmIGJsb2NrKCktPkdldFRyYWNrTnVtYmVyKCkgIT0gbVRyYWNrTnVtKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFMT0dWKCJTZWVraW5nIHRvOiAlIiBQUklkNjQsIHNlZWtUaW1lVXMpOworCisgICAgLy8gSWYgdGhlIEN1ZXMgaGF2ZSBub3QgYmVlbiBsb2NhdGVkIHRoZW4gZmluZCB0aGVtLgorICAgIGNvbnN0IG1rdnBhcnNlcjo6Q3VlcyogcEN1ZXMgPSBwU2VnbWVudC0+R2V0Q3VlcygpOworICAgIGNvbnN0IG1rdnBhcnNlcjo6U2Vla0hlYWQqIHBTSCA9IHBTZWdtZW50LT5HZXRTZWVrSGVhZCgpOworICAgIGlmICghcEN1ZXMgJiYgcFNIKSB7CisgICAgICAgIGNvbnN0IHNpemVfdCBjb3VudCA9IHBTSC0+R2V0Q291bnQoKTsKKyAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpTZWVrSGVhZDo6RW50cnkqIHBFbnRyeTsKKyAgICAgICAgQUxPR1YoIk5vIEN1ZXMgeWV0Iik7CisKKyAgICAgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IGNvdW50OyBpbmRleCsrKSB7CisgICAgICAgICAgICBwRW50cnkgPSBwU0gtPkdldEVudHJ5KGluZGV4KTsKKworICAgICAgICAgICAgaWYgKHBFbnRyeS0+aWQgPT0gMHgwQzUzQkI2QikgeyAvLyBDdWVzIElECisgICAgICAgICAgICAgICAgbG9uZyBsZW47IGxvbmcgbG9uZyBwb3M7CisgICAgICAgICAgICAgICAgcFNlZ21lbnQtPlBhcnNlQ3VlcyhwRW50cnktPnBvcywgcG9zLCBsZW4pOworICAgICAgICAgICAgICAgIHBDdWVzID0gcFNlZ21lbnQtPkdldEN1ZXMoKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiQ3VlcyBmb3VuZCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFwQ3VlcykgeworICAgICAgICAgICAgQUxPR0UoIk5vIEN1ZXMgaW4gZmlsZSIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKCFwU0gpIHsKKyAgICAgICAgQUxPR0UoIk5vIFNlZWtIZWFkIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBta3ZwYXJzZXI6OkN1ZVBvaW50KiBwQ1A7CisgICAgbWt2cGFyc2VyOjpUcmFja3MgY29uc3QgKnBUcmFja3MgPSBwU2VnbWVudC0+R2V0VHJhY2tzKCk7CisgICAgd2hpbGUgKCFwQ3Vlcy0+RG9uZVBhcnNpbmcoKSkgeworICAgICAgICBwQ3Vlcy0+TG9hZEN1ZVBvaW50KCk7CisgICAgICAgIHBDUCA9IHBDdWVzLT5HZXRMYXN0KCk7CisgICAgICAgIENIRUNLKHBDUCk7CisKKyAgICAgICAgc2l6ZV90IHRyYWNrQ291bnQgPSBtRXh0cmFjdG9yLT5tVHJhY2tzLnNpemUoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHRyYWNrQ291bnQ7ICsraW5kZXgpIHsKKyAgICAgICAgICAgIE1hdHJvc2thRXh0cmFjdG9yOjpUcmFja0luZm8mIHRyYWNrID0gbUV4dHJhY3Rvci0+bVRyYWNrcy5lZGl0SXRlbUF0KGluZGV4KTsKKyAgICAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6VHJhY2sgKnBUcmFjayA9IHBUcmFja3MtPkdldFRyYWNrQnlOdW1iZXIodHJhY2subVRyYWNrTnVtKTsKKyAgICAgICAgICAgIGlmIChwVHJhY2sgJiYgcFRyYWNrLT5HZXRUeXBlKCkgPT0gMSAmJiBwQ1AtPkZpbmQocFRyYWNrKSkgeyAvLyBWSURFT19UUkFDSworICAgICAgICAgICAgICAgIHRyYWNrLm1DdWVQb2ludHMucHVzaF9iYWNrKHBDUCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocENQLT5HZXRUaW1lKHBTZWdtZW50KSA+PSBzZWVrVGltZU5zKSB7CisgICAgICAgICAgICBBTE9HVigiUGFyc2VkIHBhc3QgcmVsZXZhbnQgQ3VlIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbnN0IG1rdnBhcnNlcjo6Q3VlUG9pbnQ6OlRyYWNrUG9zaXRpb24gKnBUUCA9IE5VTEw7CisgICAgY29uc3QgbWt2cGFyc2VyOjpUcmFjayAqdGhpc1RyYWNrID0gcFRyYWNrcy0+R2V0VHJhY2tCeU51bWJlcihtVHJhY2tOdW0pOworICAgIGlmICh0aGlzVHJhY2stPkdldFR5cGUoKSA9PSAxKSB7IC8vIHZpZGVvCisgICAgICAgIE1hdHJvc2thRXh0cmFjdG9yOjpUcmFja0luZm8mIHRyYWNrID0gbUV4dHJhY3Rvci0+bVRyYWNrcy5lZGl0SXRlbUF0KG1JbmRleCk7CisgICAgICAgIHBUUCA9IHRyYWNrLmZpbmQoc2Vla1RpbWVOcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVGhlIEN1ZSBpbmRleCBpcyBidWlsdCBhcm91bmQgdmlkZW8ga2V5ZnJhbWVzCisgICAgICAgIHVuc2lnbmVkIGxvbmcgaW50IHRyYWNrQ291bnQgPSBwVHJhY2tzLT5HZXRUcmFja3NDb3VudCgpOworICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgdHJhY2tDb3VudDsgKytpbmRleCkgeworICAgICAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpUcmFjayAqcFRyYWNrID0gcFRyYWNrcy0+R2V0VHJhY2tCeUluZGV4KGluZGV4KTsKKyAgICAgICAgICAgIGlmIChwVHJhY2sgJiYgcFRyYWNrLT5HZXRUeXBlKCkgPT0gMSAmJiBwQ3Vlcy0+RmluZChzZWVrVGltZU5zLCBwVHJhY2ssIHBDUCwgcFRQKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlbyB0cmFjayBsb2NhdGVkIGF0ICV6dSIsIGluZGV4KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLy8gQWx3YXlzICpzZWFyY2gqIGJhc2VkIG9uIHRoZSB2aWRlbyB0cmFjaywgYnV0IGZpbmFsaXplIGJhc2VkIG9uIG1UcmFja051bQorICAgIGlmICghcFRQKSB7CisgICAgICAgIEFMT0dFKCJEaWQgbm90IGxvY2F0ZSB0aGUgdmlkZW8gdHJhY2sgZm9yIHNlZWtpbmciKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1DbHVzdGVyID0gcFNlZ21lbnQtPkZpbmRPclByZWxvYWRDbHVzdGVyKHBUUC0+bV9wb3MpOworCisgICAgQ0hFQ0sobUNsdXN0ZXIpOworICAgIENIRUNLKCFtQ2x1c3Rlci0+RU9TKCkpOworCisgICAgLy8gbUJsb2NrRW50cnlJbmRleCBzdGFydHMgYXQgMCBidXQgbV9ibG9jayBzdGFydHMgYXQgMQorICAgIENIRUNLX0dUKHBUUC0+bV9ibG9jaywgMCk7CisgICAgbUJsb2NrRW50cnlJbmRleCA9IHBUUC0+bV9ibG9jayAtIDE7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGFkdmFuY2VfbCgpOworCisgICAgICAgIGlmIChlb3MoKSkgYnJlYWs7CisKKyAgICAgICAgaWYgKGlzQXVkaW8gfHwgYmxvY2soKS0+SXNLZXkoKSkgeworICAgICAgICAgICAgLy8gQWNjZXB0IHRoZSBmaXJzdCBrZXkgZnJhbWUKKyAgICAgICAgICAgIGludDY0X3QgZnJhbWVUaW1lVXMgPSAoYmxvY2soKS0+R2V0VGltZShtQ2x1c3RlcikgKyA1MDBMTCkgLyAxMDAwTEw7CisgICAgICAgICAgICBpZiAodGhpc1RyYWNrLT5HZXRUeXBlKCkgPT0gMSB8fCBmcmFtZVRpbWVVcyA+PSBzZWVrVGltZVVzKSB7CisgICAgICAgICAgICAgICAgKmFjdHVhbEZyYW1lVGltZVVzID0gZnJhbWVUaW1lVXM7CisgICAgICAgICAgICAgICAgQUxPR1YoIlJlcXVlc3RlZCBzZWVrIHBvaW50OiAlIiBQUklkNjQgIiBhY3R1YWw6ICUiIFBSSWQ2NCwKKyAgICAgICAgICAgICAgICAgICAgICBzZWVrVGltZVVzLCAqYWN0dWFsRnJhbWVUaW1lVXMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitjb25zdCBta3ZwYXJzZXI6OkJsb2NrICpCbG9ja0l0ZXJhdG9yOjpibG9jaygpIGNvbnN0IHsKKyAgICBDSEVDSyghZW9zKCkpOworCisgICAgcmV0dXJuIG1CbG9ja0VudHJ5LT5HZXRCbG9jaygpOworfQorCitpbnQ2NF90IEJsb2NrSXRlcmF0b3I6OmJsb2NrVGltZVVzKCkgY29uc3QgeworICAgIGlmIChtQ2x1c3RlciA9PSBOVUxMIHx8IG1CbG9ja0VudHJ5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gKG1CbG9ja0VudHJ5LT5HZXRCbG9jaygpLT5HZXRUaW1lKG1DbHVzdGVyKSArIDUwMGxsKSAvIDEwMDBsbDsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIHVuc2lnbmVkIFUyNF9BVChjb25zdCB1aW50OF90ICpwdHIpIHsKKyAgICByZXR1cm4gcHRyWzBdIDw8IDE2IHwgcHRyWzFdIDw8IDggfCBwdHJbMl07Cit9CisKK3N0YXRpYyBBU3RyaW5nIHVyaURlYnVnU3RyaW5nKGNvbnN0IGNoYXIgKnVyaSkgeworICAgIC8vIGZpbmQgc2NoZW1lCisgICAgQVN0cmluZyBzY2hlbWU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHJsZW4odXJpKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IGNoYXIgYyA9IHVyaVtpXTsKKyAgICAgICAgaWYgKCFpc2FzY2lpKGMpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmIChpc2FscGhhKGMpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGlmIChpID09IDApIHsKKyAgICAgICAgICAgIC8vIGZpcnN0IGNoYXJhY3RlciBtdXN0IGJlIGEgbGV0dGVyCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmIChpc2RpZ2l0KGMpIHx8IGMgPT0gJysnIHx8IGMgPT0gJy4nIHx8IGMgPT0nLScpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgaWYgKGMgIT0gJzonKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzY2hlbWUgPSBBU3RyaW5nKHVyaSwgMCwgaSk7CisgICAgICAgIHNjaGVtZS5hcHBlbmQoIjovLzxzdXBwcmVzc2VkPiIpOworICAgICAgICByZXR1cm4gc2NoZW1lOworICAgIH0KKyAgICByZXR1cm4gQVN0cmluZygiPG5vLXNjaGVtZSBVUkkgc3VwcHJlc3NlZD4iKTsKK30KKwordm9pZCBNYXRyb3NrYVNvdXJjZTo6Y2xlYXJQZW5kaW5nRnJhbWVzKCkgeworICAgIHdoaWxlICghbVBlbmRpbmdGcmFtZXMuZW1wdHkoKSkgeworICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKmZyYW1lID0gKm1QZW5kaW5nRnJhbWVzLmJlZ2luKCk7CisgICAgICAgIG1QZW5kaW5nRnJhbWVzLmVyYXNlKG1QZW5kaW5nRnJhbWVzLmJlZ2luKCkpOworCisgICAgICAgIGZyYW1lLT5yZWxlYXNlKCk7CisgICAgICAgIGZyYW1lID0gTlVMTDsKKyAgICB9Cit9CisKK3N0YXR1c190IE1hdHJvc2thU291cmNlOjpzZXRXZWJtQmxvY2tDcnlwdG9JbmZvKE1lZGlhQnVmZmVyQmFzZSAqbWJ1ZikgeworICAgIGlmIChtYnVmLT5yYW5nZV9sZW5ndGgoKSA8IDEgfHwgbWJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgLSAxID4gSU5UMzJfTUFYKSB7CisgICAgICAgIC8vIDEtYnl0ZSBzaWduYWwKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gKGNvbnN0IHVpbnQ4X3QgKiltYnVmLT5kYXRhKCkgKyBtYnVmLT5yYW5nZV9vZmZzZXQoKTsKKyAgICBib29sIGVuY3J5cHRlZCA9IGRhdGFbMF0gJiAweDE7CisgICAgYm9vbCBwYXJ0aXRpb25lZCA9IGRhdGFbMF0gJiAweDI7CisgICAgaWYgKGVuY3J5cHRlZCAmJiBtYnVmLT5yYW5nZV9sZW5ndGgoKSA8IDkpIHsKKyAgICAgICAgLy8gMS1ieXRlIHNpZ25hbCArIDgtYnl0ZSBJVgorICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIE1ldGFEYXRhQmFzZSAmbWV0YSA9IG1idWYtPm1ldGFfZGF0YSgpOworICAgIGlmIChlbmNyeXB0ZWQpIHsKKyAgICAgICAgdWludDhfdCBjdHJDb3VudGVyWzE2XSA9IHsgMCB9OworICAgICAgICB1aW50MzJfdCB0eXBlOworICAgICAgICBjb25zdCB1aW50OF90ICprZXlJZDsKKyAgICAgICAgc2l6ZV90IGtleUlkU2l6ZTsKKyAgICAgICAgY29uc3QgTWV0YURhdGFCYXNlICZ0cmFja01ldGEgPSBtRXh0cmFjdG9yLT5tVHJhY2tzLml0ZW1BdChtVHJhY2tJbmRleCkubU1ldGE7CisgICAgICAgIENIRUNLKHRyYWNrTWV0YS5maW5kRGF0YShrS2V5Q3J5cHRvS2V5LCAmdHlwZSwgKGNvbnN0IHZvaWQgKiopJmtleUlkLCAma2V5SWRTaXplKSk7CisgICAgICAgIG1ldGEuc2V0RGF0YShrS2V5Q3J5cHRvS2V5LCAwLCBrZXlJZCwga2V5SWRTaXplKTsKKyAgICAgICAgbWVtY3B5KGN0ckNvdW50ZXIsIGRhdGEgKyAxLCA4KTsKKyAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlDcnlwdG9JViwgMCwgY3RyQ291bnRlciwgMTYpOworICAgICAgICBpZiAocGFydGl0aW9uZWQpIHsKKyAgICAgICAgICAgIC8qICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAgICAgICAgICAgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgICAgICAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgICAgICogfCAgU2lnbmFsIEJ5dGUgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAqICstKy0rLSstKy0rLSstKy0rICAgICAgICAgICAgIElWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICogfCAgICAgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgICAgICAqIHwgICAgICAgICAgICAgICB8IG51bV9wYXJ0aXRpb24gfCAgICAgUGFydGl0aW9uIDAgb2Zmc2V0IC0+ICAgICB8CisgICAgICAgICAgICAgKiB8LSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstfAorICAgICAgICAgICAgICogfCAgICAgLT4gUGFydGl0aW9uIDAgb2Zmc2V0ICAgICB8ICAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAqIHwtKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy18CisgICAgICAgICAgICAgKiB8ICAgICAgICAgICAgIC4uLiAgICAgICAgICAgICAgIHwgICAgIFBhcnRpdGlvbiBuLTEgb2Zmc2V0IC0+ICAgfAorICAgICAgICAgICAgICogfC0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLXwKKyAgICAgICAgICAgICAqIHwgICAgIC0+IFBhcnRpdGlvbiBuLTEgb2Zmc2V0ICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICogfCAgICAgICAgICAgICAgICAgICAgQ2xlYXIvZW5jcnlwdGVkIHNhbXBsZSBkYXRhICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKG1idWYtPnJhbmdlX2xlbmd0aCgpIDwgMTApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWludDhfdCBudW1QYXJ0aXRpb25zID0gZGF0YVs5XTsKKyAgICAgICAgICAgIGlmIChtYnVmLT5yYW5nZV9sZW5ndGgoKSAtIDEwIDwgbnVtUGFydGl0aW9ucyAqIHNpemVvZih1aW50MzJfdCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IHBsYWluU2l6ZXMsIGVuY3J5cHRlZFNpemVzOworICAgICAgICAgICAgdWludDMyX3QgcHJldiA9IDA7CisgICAgICAgICAgICB1aW50MzJfdCBmcmFtZU9mZnNldCA9IDEwICsgbnVtUGFydGl0aW9ucyAqIHNpemVvZih1aW50MzJfdCk7CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCAqcGFydGl0aW9ucyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QqPihkYXRhICsgMTApOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8PSBudW1QYXJ0aXRpb25zOyArK2kpIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwX2kgPSBpIDwgbnVtUGFydGl0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgPyBudG9obChwYXJ0aXRpb25zW2ldKQorICAgICAgICAgICAgICAgICAgICAgICAgOiAobWJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgLSBmcmFtZU9mZnNldCk7CisgICAgICAgICAgICAgICAgaWYgKHBfaSA8IHByZXYpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSA9IHBfaSAtIHByZXY7CisgICAgICAgICAgICAgICAgcHJldiA9IHBfaTsKKyAgICAgICAgICAgICAgICBpZiAoaSAlIDIpIHsKKyAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGVkU2l6ZXMucHVzaF9iYWNrKHNpemUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBsYWluU2l6ZXMucHVzaF9iYWNrKHNpemUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwbGFpblNpemVzLnNpemUoKSA+IGVuY3J5cHRlZFNpemVzLnNpemUoKSkgeworICAgICAgICAgICAgICAgIGVuY3J5cHRlZFNpemVzLnB1c2hfYmFjaygwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVpbnQzMl90IHNpemVvZlBsYWluU2l6ZXMgPSBzaXplb2YodWludDMyX3QpICogcGxhaW5TaXplcy5zaXplKCk7CisgICAgICAgICAgICB1aW50MzJfdCBzaXplb2ZFbmNyeXB0ZWRTaXplcyA9IHNpemVvZih1aW50MzJfdCkgKiBlbmNyeXB0ZWRTaXplcy5zaXplKCk7CisgICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleVBsYWluU2l6ZXMsIDAsIHBsYWluU2l6ZXMuZGF0YSgpLCBzaXplb2ZQbGFpblNpemVzKTsKKyAgICAgICAgICAgIG1ldGEuc2V0RGF0YShrS2V5RW5jcnlwdGVkU2l6ZXMsIDAsIGVuY3J5cHRlZFNpemVzLmRhdGEoKSwgc2l6ZW9mRW5jcnlwdGVkU2l6ZXMpOworICAgICAgICAgICAgbWJ1Zi0+c2V0X3JhbmdlKGZyYW1lT2Zmc2V0LCBtYnVmLT5yYW5nZV9sZW5ndGgoKSAtIGZyYW1lT2Zmc2V0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICAgICAgICAgICAgICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICAgICAgICAgICAgICogICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICAgICAgKiAgfCAgU2lnbmFsIEJ5dGUgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAqICArLSstKy0rLSstKy0rLSstKyAgICAgICAgICAgICBJViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgKiAgfCAgICAgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgICAgICAqICB8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICogIHwtKy0rLSstKy0rLSstKy0rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgKiAgOiAgICAgICAgICAgICAgIEJ5dGVzIDEuLk4gb2YgZW5jcnlwdGVkIGZyYW1lICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgICAqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgKiAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaW50MzJfdCBwbGFpblNpemVzW10gPSB7IDAgfTsKKyAgICAgICAgICAgIGludDMyX3QgZW5jcnlwdGVkU2l6ZXNbXSA9IHsgc3RhdGljX2Nhc3Q8aW50MzJfdD4obWJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgLSA5KSB9OworICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlQbGFpblNpemVzLCAwLCBwbGFpblNpemVzLCBzaXplb2YocGxhaW5TaXplcykpOworICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlFbmNyeXB0ZWRTaXplcywgMCwgZW5jcnlwdGVkU2l6ZXMsIHNpemVvZihlbmNyeXB0ZWRTaXplcykpOworICAgICAgICAgICAgbWJ1Zi0+c2V0X3JhbmdlKDksIG1idWYtPnJhbmdlX2xlbmd0aCgpIC0gOSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvKgorICAgICAgICAgKiAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICAgICAgICAgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgICAgICAgICAqICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgKiAgfCAgU2lnbmFsIEJ5dGUgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICogICstKy0rLSstKy0rLSstKy0rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAqICA6ICAgICAgICAgICAgICAgQnl0ZXMgMS4uTiBvZiB1bmVuY3J5cHRlZCBmcmFtZSAgICAgICAgICAgICAgICAgOgorICAgICAgICAgKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAqICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgKi8KKyAgICAgICAgaW50MzJfdCBwbGFpblNpemVzW10gPSB7IHN0YXRpY19jYXN0PGludDMyX3Q+KG1idWYtPnJhbmdlX2xlbmd0aCgpIC0gMSkgfTsKKyAgICAgICAgaW50MzJfdCBlbmNyeXB0ZWRTaXplc1tdID0geyAwIH07CisgICAgICAgIG1ldGEuc2V0RGF0YShrS2V5UGxhaW5TaXplcywgMCwgcGxhaW5TaXplcywgc2l6ZW9mKHBsYWluU2l6ZXMpKTsKKyAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlFbmNyeXB0ZWRTaXplcywgMCwgZW5jcnlwdGVkU2l6ZXMsIHNpemVvZihlbmNyeXB0ZWRTaXplcykpOworICAgICAgICBtYnVmLT5zZXRfcmFuZ2UoMSwgbWJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgLSAxKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1hdHJvc2thU291cmNlOjpyZWFkQmxvY2soKSB7CisgICAgQ0hFQ0sobVBlbmRpbmdGcmFtZXMuZW1wdHkoKSk7CisKKyAgICBpZiAobUJsb2NrSXRlci5lb3MoKSkgeworICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICB9CisKKyAgICBjb25zdCBta3ZwYXJzZXI6OkJsb2NrICpibG9jayA9IG1CbG9ja0l0ZXIuYmxvY2soKTsKKworICAgIGludDY0X3QgdGltZVVzID0gbUJsb2NrSXRlci5ibG9ja1RpbWVVcygpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBibG9jay0+R2V0RnJhbWVDb3VudCgpOyArK2kpIHsKKyAgICAgICAgTWF0cm9za2FFeHRyYWN0b3I6OlRyYWNrSW5mbyAqdHJhY2tJbmZvID0gJm1FeHRyYWN0b3ItPm1UcmFja3MuZWRpdEl0ZW1BdChtVHJhY2tJbmRleCk7CisgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6QmxvY2s6OkZyYW1lICZmcmFtZSA9IGJsb2NrLT5HZXRGcmFtZShpKTsKKyAgICAgICAgc2l6ZV90IGxlbiA9IGZyYW1lLmxlbjsKKyAgICAgICAgaWYgKFNJWkVfTUFYIC0gbGVuIDwgdHJhY2tJbmZvLT5tSGVhZGVyTGVuKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKKyAgICAgICAgbGVuICs9IHRyYWNrSW5mby0+bUhlYWRlckxlbjsKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICptYnVmID0gTWVkaWFCdWZmZXJCYXNlOjpDcmVhdGUobGVuKTsKKyAgICAgICAgdWludDhfdCAqZGF0YSA9IHN0YXRpY19jYXN0PHVpbnQ4X3QgKj4obWJ1Zi0+ZGF0YSgpKTsKKyAgICAgICAgaWYgKHRyYWNrSW5mby0+bUhlYWRlcikgeworICAgICAgICAgICAgbWVtY3B5KGRhdGEsIHRyYWNrSW5mby0+bUhlYWRlciwgdHJhY2tJbmZvLT5tSGVhZGVyTGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIG1idWYtPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOworICAgICAgICBtYnVmLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIGJsb2NrLT5Jc0tleSgpKTsKKworICAgICAgICBzdGF0dXNfdCBlcnIgPSBmcmFtZS5SZWFkKG1FeHRyYWN0b3ItPm1SZWFkZXIsIGRhdGEgKyB0cmFja0luZm8tPm1IZWFkZXJMZW4pOworICAgICAgICBpZiAoZXJyID09IE9LCisgICAgICAgICAgICAgICAgJiYgbUV4dHJhY3Rvci0+bUlzV2VibQorICAgICAgICAgICAgICAgICYmIHRyYWNrSW5mby0+bUVuY3J5cHRlZCkgeworICAgICAgICAgICAgZXJyID0gc2V0V2VibUJsb2NrQ3J5cHRvSW5mbyhtYnVmKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIG1QZW5kaW5nRnJhbWVzLmNsZWFyKCk7CisKKyAgICAgICAgICAgIG1CbG9ja0l0ZXIuYWR2YW5jZSgpOworICAgICAgICAgICAgbWJ1Zi0+cmVsZWFzZSgpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCisgICAgICAgIG1QZW5kaW5nRnJhbWVzLnB1c2hfYmFjayhtYnVmKTsKKyAgICB9CisKKyAgICBtQmxvY2tJdGVyLmFkdmFuY2UoKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKyAgICAqb3V0ID0gTlVMTDsKKworICAgIGludDY0X3QgdGFyZ2V0U2FtcGxlVGltZVVzID0gLTFsbDsKKworICAgIGludDY0X3Qgc2Vla1RpbWVVczsKKyAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKKyAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSkgeworICAgICAgICBpZiAobW9kZSA9PSBSZWFkT3B0aW9uczo6U0VFS19GUkFNRV9JTkRFWCkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtRXh0cmFjdG9yLT5pc0xpdmVTdHJlYW1pbmcoKSkgeworICAgICAgICAgICAgY2xlYXJQZW5kaW5nRnJhbWVzKCk7CisKKyAgICAgICAgICAgIC8vIFRoZSBhdWRpbyB3ZSB3YW50IGlzIGxvY2F0ZWQgYnkgdXNpbmcgdGhlIEN1ZXMgdG8gc2VlayB0aGUgdmlkZW8KKyAgICAgICAgICAgIC8vIHN0cmVhbSB0byBmaW5kIHRoZSB0YXJnZXQgQ2x1c3RlciB0aGVuIGl0ZXJhdGluZyB0byBmaW5hbGl6ZSBmb3IKKyAgICAgICAgICAgIC8vIGF1ZGlvLgorICAgICAgICAgICAgaW50NjRfdCBhY3R1YWxGcmFtZVRpbWVVczsKKyAgICAgICAgICAgIG1CbG9ja0l0ZXIuc2VlayhzZWVrVGltZVVzLCBtSXNBdWRpbywgJmFjdHVhbEZyYW1lVGltZVVzKTsKKyAgICAgICAgICAgIGlmIChtb2RlID09IFJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1QpIHsKKyAgICAgICAgICAgICAgICB0YXJnZXRTYW1wbGVUaW1lVXMgPSBhY3R1YWxGcmFtZVRpbWVVczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHdoaWxlIChtUGVuZGluZ0ZyYW1lcy5lbXB0eSgpKSB7CisgICAgICAgIHN0YXR1c190IGVyciA9IHJlYWRCbG9jaygpOworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIGNsZWFyUGVuZGluZ0ZyYW1lcygpOworCisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorCisgICAgTWVkaWFCdWZmZXJCYXNlICpmcmFtZSA9ICptUGVuZGluZ0ZyYW1lcy5iZWdpbigpOworICAgIG1QZW5kaW5nRnJhbWVzLmVyYXNlKG1QZW5kaW5nRnJhbWVzLmJlZ2luKCkpOworCisgICAgaWYgKChtVHlwZSAhPSBBVkMgJiYgbVR5cGUgIT0gSEVWQykgfHwgbU5BTFNpemVMZW4gPT0gMCkgeworICAgICAgICBpZiAodGFyZ2V0U2FtcGxlVGltZVVzID49IDBsbCkgeworICAgICAgICAgICAgZnJhbWUtPm1ldGFfZGF0YSgpLnNldEludDY0KAorICAgICAgICAgICAgICAgICAgICBrS2V5VGFyZ2V0VGltZSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKKyAgICAgICAgfQorCisgICAgICAgICpvdXQgPSBmcmFtZTsKKworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgLy8gRWFjaCBpbnB1dCBmcmFtZSBjb250YWlucyBvbmUgb3IgbW9yZSBOQUwgZnJhZ21lbnRzLCBlYWNoIGZyYWdtZW50CisgICAgLy8gaXMgcHJlZml4ZWQgYnkgbU5BTFNpemVMZW4gYnl0ZXMgZ2l2aW5nIHRoZSBmcmFnbWVudCBsZW5ndGgsCisgICAgLy8gZm9sbG93ZWQgYnkgYSBjb3JyZXNwb25kaW5nIG51bWJlciBvZiBieXRlcyBjb250YWluaW5nIHRoZSBmcmFnbWVudC4KKyAgICAvLyBXZSBvdXRwdXQgYWxsIHRoZXNlIGZyYWdtZW50cyBpbnRvIGEgc2luZ2xlIGxhcmdlIGJ1ZmZlciBzZXBhcmF0ZWQKKyAgICAvLyBieSBzdGFydGNvZGVzICgweDAwIDB4MDAgMHgwMCAweDAxKS4KKyAgICAvLworICAgIC8vIFdoZW4gbU5BTFNpemVMZW4gaXMgMCwgd2UgYXNzdW1lIHRoZSBkYXRhIGlzIGFscmVhZHkgaW4gdGhlIGZvcm1hdAorICAgIC8vIGRlc2lyZWQuCisKKyAgICBjb25zdCB1aW50OF90ICpzcmNQdHIgPQorICAgICAgICAoY29uc3QgdWludDhfdCAqKWZyYW1lLT5kYXRhKCkgKyBmcmFtZS0+cmFuZ2Vfb2Zmc2V0KCk7CisKKyAgICBzaXplX3Qgc3JjU2l6ZSA9IGZyYW1lLT5yYW5nZV9sZW5ndGgoKTsKKworICAgIHNpemVfdCBkc3RTaXplID0gMDsKKyAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciA9IE5VTEw7CisgICAgdWludDhfdCAqZHN0UHRyID0gTlVMTDsKKworICAgIGZvciAoaW50MzJfdCBwYXNzID0gMDsgcGFzcyA8IDI7ICsrcGFzcykgeworICAgICAgICBzaXplX3Qgc3JjT2Zmc2V0ID0gMDsKKyAgICAgICAgc2l6ZV90IGRzdE9mZnNldCA9IDA7CisgICAgICAgIHdoaWxlIChzcmNPZmZzZXQgKyBtTkFMU2l6ZUxlbiA8PSBzcmNTaXplKSB7CisgICAgICAgICAgICBzaXplX3QgTkFMc2l6ZTsKKyAgICAgICAgICAgIHN3aXRjaCAobU5BTFNpemVMZW4pIHsKKyAgICAgICAgICAgICAgICBjYXNlIDE6IE5BTHNpemUgPSBzcmNQdHJbc3JjT2Zmc2V0XTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOiBOQUxzaXplID0gVTE2X0FUKHNyY1B0ciArIHNyY09mZnNldCk7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzogTkFMc2l6ZSA9IFUyNF9BVChzcmNQdHIgKyBzcmNPZmZzZXQpOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQ6IE5BTHNpemUgPSBVMzJfQVQoc3JjUHRyICsgc3JjT2Zmc2V0KTsgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNyY09mZnNldCArIG1OQUxTaXplTGVuICsgTkFMc2l6ZSA8PSBzcmNPZmZzZXQgKyBtTkFMU2l6ZUxlbikgeworICAgICAgICAgICAgICAgIGZyYW1lLT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgZnJhbWUgPSBOVUxMOworCisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3JjT2Zmc2V0ICsgbU5BTFNpemVMZW4gKyBOQUxzaXplID4gc3JjU2l6ZSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocGFzcyA9PSAxKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZkc3RQdHJbZHN0T2Zmc2V0XSwgIlx4MDBceDAwXHgwMFx4MDEiLCA0KTsKKworICAgICAgICAgICAgICAgIGlmIChmcmFtZSAhPSBidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCZkc3RQdHJbZHN0T2Zmc2V0ICsgNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjUHRyW3NyY09mZnNldCArIG1OQUxTaXplTGVuXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BTHNpemUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZHN0T2Zmc2V0ICs9IDQ7ICAvLyAweDAwIDAwIDAwIDAxCisgICAgICAgICAgICBkc3RPZmZzZXQgKz0gTkFMc2l6ZTsKKworICAgICAgICAgICAgc3JjT2Zmc2V0ICs9IG1OQUxTaXplTGVuICsgTkFMc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzcmNPZmZzZXQgPCBzcmNTaXplKSB7CisgICAgICAgICAgICAvLyBUaGVyZSB3ZXJlIHRyYWlsaW5nIGJ5dGVzIG9yIG5vdCBlbm91Z2ggZGF0YSB0byBjb21wbGV0ZQorICAgICAgICAgICAgLy8gYSBmcmFnbWVudC4KKworICAgICAgICAgICAgZnJhbWUtPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGZyYW1lID0gTlVMTDsKKworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwYXNzID09IDApIHsKKyAgICAgICAgICAgIGRzdFNpemUgPSBkc3RPZmZzZXQ7CisKKyAgICAgICAgICAgIGlmIChkc3RTaXplID09IHNyY1NpemUgJiYgbU5BTFNpemVMZW4gPT0gNCkgeworICAgICAgICAgICAgICAgIC8vIEluIHRoaXMgc3BlY2lhbCBjYXNlIHdlIGNhbiByZS11c2UgdGhlIGlucHV0IGJ1ZmZlciBieSBzdWJzdGl0dXRpbmcKKyAgICAgICAgICAgICAgICAvLyBlYWNoIDQtYnl0ZSBuYWwgc2l6ZSB3aXRoIGEgNC1ieXRlIHN0YXJ0IGNvZGUKKyAgICAgICAgICAgICAgICBidWZmZXIgPSBmcmFtZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnVmZmVyID0gTWVkaWFCdWZmZXJCYXNlOjpDcmVhdGUoZHN0U2l6ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICAgICAgQ0hFQ0soZnJhbWUtPm1ldGFfZGF0YSgpLmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOworICAgICAgICAgICAgaW50MzJfdCBpc1N5bmM7CisgICAgICAgICAgICBDSEVDSyhmcmFtZS0+bWV0YV9kYXRhKCkuZmluZEludDMyKGtLZXlJc1N5bmNGcmFtZSwgJmlzU3luYykpOworCisgICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOworICAgICAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIGlzU3luYyk7CisKKyAgICAgICAgICAgIGRzdFB0ciA9ICh1aW50OF90ICopYnVmZmVyLT5kYXRhKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZnJhbWUgIT0gYnVmZmVyKSB7CisgICAgICAgIGZyYW1lLT5yZWxlYXNlKCk7CisgICAgICAgIGZyYW1lID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAodGFyZ2V0U2FtcGxlVGltZVVzID49IDBsbCkgeworICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAorICAgICAgICAgICAgICAgIGtLZXlUYXJnZXRUaW1lLCB0YXJnZXRTYW1wbGVUaW1lVXMpOworICAgIH0KKworICAgICpvdXQgPSBidWZmZXI7CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK01hdHJvc2thRXh0cmFjdG9yOjpNYXRyb3NrYUV4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKQorICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKKyAgICAgIG1SZWFkZXIobmV3IERhdGFTb3VyY2VCYXNlUmVhZGVyKG1EYXRhU291cmNlKSksCisgICAgICBtU2VnbWVudChOVUxMKSwKKyAgICAgIG1FeHRyYWN0ZWRUaHVtYm5haWxzKGZhbHNlKSwKKyAgICAgIG1Jc1dlYm0oZmFsc2UpLAorICAgICAgbVNlZWtQcmVSb2xsTnMoMCkgeworICAgIG9mZjY0X3Qgc2l6ZTsKKyAgICBtSXNMaXZlU3RyZWFtaW5nID0KKyAgICAgICAgKG1EYXRhU291cmNlLT5mbGFncygpCisgICAgICAgICAgICAmIChEYXRhU291cmNlQmFzZTo6a1dhbnRzUHJlZmV0Y2hpbmcKKyAgICAgICAgICAgICAgICB8IERhdGFTb3VyY2VCYXNlOjprSXNDYWNoaW5nRGF0YVNvdXJjZSkpCisgICAgICAgICYmIG1EYXRhU291cmNlLT5nZXRTaXplKCZzaXplKSAhPSBPSzsKKworICAgIG1rdnBhcnNlcjo6RUJNTEhlYWRlciBlYm1sSGVhZGVyOworICAgIGxvbmcgbG9uZyBwb3M7CisgICAgaWYgKGVibWxIZWFkZXIuUGFyc2UobVJlYWRlciwgcG9zKSA8IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChlYm1sSGVhZGVyLm1fZG9jVHlwZSAmJiAhc3RyY21wKCJ3ZWJtIiwgZWJtbEhlYWRlci5tX2RvY1R5cGUpKSB7CisgICAgICAgIG1Jc1dlYm0gPSB0cnVlOworICAgIH0KKworICAgIGxvbmcgbG9uZyByZXQgPQorICAgICAgICBta3ZwYXJzZXI6OlNlZ21lbnQ6OkNyZWF0ZUluc3RhbmNlKG1SZWFkZXIsIHBvcywgbVNlZ21lbnQpOworCisgICAgaWYgKHJldCkgeworICAgICAgICBDSEVDSyhtU2VnbWVudCA9PSBOVUxMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGZyb20gbWt2cGFyc2VyOjpTZWdtZW50OjpMb2FkKCksIGJ1dCBzdG9wIGF0IGZpcnN0IGNsdXN0ZXIKKyAgICByZXQgPSBtU2VnbWVudC0+UGFyc2VIZWFkZXJzKCk7CisgICAgaWYgKHJldCA9PSAwKSB7CisgICAgICAgIGxvbmcgbGVuOworICAgICAgICByZXQgPSBtU2VnbWVudC0+TG9hZENsdXN0ZXIocG9zLCBsZW4pOworICAgICAgICBpZiAocmV0ID49IDEpIHsKKyAgICAgICAgICAgIC8vIG5vIG1vcmUgY2x1c3RlcnMKKyAgICAgICAgICAgIHJldCA9IDA7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHJldCA+IDApIHsKKyAgICAgICAgcmV0ID0gbWt2cGFyc2VyOjpFX0JVRkZFUl9OT1RfRlVMTDsKKyAgICB9CisKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBjaGFyIHVyaVsxMDI0XTsKKyAgICAgICAgaWYoIW1EYXRhU291cmNlLT5nZXRVcmkodXJpLCBzaXplb2YodXJpKSkpIHsKKyAgICAgICAgICAgIHVyaVswXSA9ICdcMCc7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1coIkNvcnJ1cHQgJXMgc291cmNlOiAlcyIsIG1Jc1dlYm0gPyAid2VibSIgOiAibWF0cm9za2EiLAorICAgICAgICAgICAgICAgIHVyaURlYnVnU3RyaW5nKHVyaSkuY19zdHIoKSk7CisgICAgICAgIGRlbGV0ZSBtU2VnbWVudDsKKyAgICAgICAgbVNlZ21lbnQgPSBOVUxMOworICAgICAgICByZXR1cm47CisgICAgfQorCisjaWYgMAorICAgIGNvbnN0IG1rdnBhcnNlcjo6U2VnbWVudEluZm8gKmluZm8gPSBtU2VnbWVudC0+R2V0SW5mbygpOworICAgIEFMT0dJKCJtdXhpbmcgYXBwOiAlcywgd3JpdGluZyBhcHA6ICVzIiwKKyAgICAgICAgIGluZm8tPkdldE11eGluZ0FwcEFzVVRGOCgpLAorICAgICAgICAgaW5mby0+R2V0V3JpdGluZ0FwcEFzVVRGOCgpKTsKKyNlbmRpZgorCisgICAgYWRkVHJhY2tzKCk7Cit9CisKK01hdHJvc2thRXh0cmFjdG9yOjp+TWF0cm9za2FFeHRyYWN0b3IoKSB7CisgICAgZGVsZXRlIG1TZWdtZW50OworICAgIG1TZWdtZW50ID0gTlVMTDsKKworICAgIGRlbGV0ZSBtUmVhZGVyOworICAgIG1SZWFkZXIgPSBOVUxMOworfQorCitzaXplX3QgTWF0cm9za2FFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgeworICAgIHJldHVybiBtVHJhY2tzLnNpemUoKTsKK30KKworTWVkaWFUcmFjayAqTWF0cm9za2FFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgeworICAgIGlmIChpbmRleCA+PSBtVHJhY2tzLnNpemUoKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3IE1hdHJvc2thU291cmNlKHRoaXMsIGluZGV4KTsKK30KKworc3RhdHVzX3QgTWF0cm9za2FFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCisgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncykgeworICAgIGlmIChpbmRleCA+PSBtVHJhY2tzLnNpemUoKSkgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAoKGZsYWdzICYga0luY2x1ZGVFeHRlbnNpdmVNZXRhRGF0YSkgJiYgIW1FeHRyYWN0ZWRUaHVtYm5haWxzCisgICAgICAgICAgICAmJiAhaXNMaXZlU3RyZWFtaW5nKCkpIHsKKyAgICAgICAgZmluZFRodW1ibmFpbHMoKTsKKyAgICAgICAgbUV4dHJhY3RlZFRodW1ibmFpbHMgPSB0cnVlOworICAgIH0KKworICAgIG1ldGEgPSBtVHJhY2tzLml0ZW1BdChpbmRleCkubU1ldGE7CisgICAgcmV0dXJuIE9LOworfQorCitib29sIE1hdHJvc2thRXh0cmFjdG9yOjppc0xpdmVTdHJlYW1pbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Jc0xpdmVTdHJlYW1pbmc7Cit9CisKK3N0YXRpYyBpbnQgYnl0ZXNGb3JTaXplKHNpemVfdCBzaXplKSB7CisgICAgLy8gdXNlIGF0IG1vc3QgMjggYml0cyAoNCB0aW1lcyA3KQorICAgIENIRUNLKHNpemUgPD0gMHhmZmZmZmZmKTsKKworICAgIGlmIChzaXplID4gMHgxZmZmZmYpIHsKKyAgICAgICAgcmV0dXJuIDQ7CisgICAgfSBlbHNlIGlmIChzaXplID4gMHgzZmZmKSB7CisgICAgICAgIHJldHVybiAzOworICAgIH0gZWxzZSBpZiAoc2l6ZSA+IDB4N2YpIHsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorICAgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBzdG9yZVNpemUodWludDhfdCAqZGF0YSwgc2l6ZV90ICZpZHgsIHNpemVfdCBzaXplKSB7CisgICAgaW50IG51bUJ5dGVzID0gYnl0ZXNGb3JTaXplKHNpemUpOworICAgIGlkeCArPSBudW1CeXRlczsKKworICAgIGRhdGEgKz0gaWR4OworICAgIHNpemVfdCBuZXh0ID0gMDsKKyAgICB3aGlsZSAobnVtQnl0ZXMtLSkgeworICAgICAgICAqLS1kYXRhID0gKHNpemUgJiAweDdmKSB8IG5leHQ7CisgICAgICAgIHNpemUgPj49IDc7CisgICAgICAgIG5leHQgPSAweDgwOworICAgIH0KK30KKworc3RhdGljIHZvaWQgYWRkRVNEU0Zyb21Db2RlY1ByaXZhdGUoCisgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgYm9vbCBpc0F1ZGlvLCBjb25zdCB2b2lkICpwcml2LCBzaXplX3QgcHJpdlNpemUpIHsKKworICAgIGludCBwcml2U2l6ZUJ5dGVzUmVxdWlyZWQgPSBieXRlc0ZvclNpemUocHJpdlNpemUpOworICAgIGludCBlc2RzU2l6ZTIgPSAxNCArIHByaXZTaXplQnl0ZXNSZXF1aXJlZCArIHByaXZTaXplOworICAgIGludCBlc2RzU2l6ZTJCeXRlc1JlcXVpcmVkID0gYnl0ZXNGb3JTaXplKGVzZHNTaXplMik7CisgICAgaW50IGVzZHNTaXplMSA9IDQgKyBlc2RzU2l6ZTJCeXRlc1JlcXVpcmVkICsgZXNkc1NpemUyOworICAgIGludCBlc2RzU2l6ZTFCeXRlc1JlcXVpcmVkID0gYnl0ZXNGb3JTaXplKGVzZHNTaXplMSk7CisgICAgc2l6ZV90IGVzZHNTaXplID0gMSArIGVzZHNTaXplMUJ5dGVzUmVxdWlyZWQgKyBlc2RzU2l6ZTE7CisgICAgdWludDhfdCAqZXNkcyA9IG5ldyB1aW50OF90W2VzZHNTaXplXTsKKworICAgIHNpemVfdCBpZHggPSAwOworICAgIGVzZHNbaWR4KytdID0gMHgwMzsKKyAgICBzdG9yZVNpemUoZXNkcywgaWR4LCBlc2RzU2l6ZTEpOworICAgIGVzZHNbaWR4KytdID0gMHgwMDsgLy8gRVNfSUQKKyAgICBlc2RzW2lkeCsrXSA9IDB4MDA7IC8vIEVTX0lECisgICAgZXNkc1tpZHgrK10gPSAweDAwOyAvLyBzdHJlYW1EZXBlbmRlbmNlRmxhZywgVVJMX0ZsYWcsIE9DUnN0cmVhbUZsYWcKKyAgICBlc2RzW2lkeCsrXSA9IDB4MDQ7CisgICAgc3RvcmVTaXplKGVzZHMsIGlkeCwgZXNkc1NpemUyKTsKKyAgICBlc2RzW2lkeCsrXSA9IGlzQXVkaW8gPyAweDQwICAgLy8gQXVkaW8gSVNPL0lFQyAxNDQ5Ni0zCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogMHgyMDsgIC8vIFZpc3VhbCBJU08vSUVDIDE0NDk2LTIKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDEyOyBpKyspIHsKKyAgICAgICAgZXNkc1tpZHgrK10gPSAweDAwOworICAgIH0KKyAgICBlc2RzW2lkeCsrXSA9IDB4MDU7CisgICAgc3RvcmVTaXplKGVzZHMsIGlkeCwgcHJpdlNpemUpOworICAgIG1lbWNweShlc2RzICsgaWR4LCBwcml2LCBwcml2U2l6ZSk7CisKKyAgICBtZXRhLnNldERhdGEoa0tleUVTRFMsIDAsIGVzZHMsIGVzZHNTaXplKTsKKworICAgIGRlbGV0ZVtdIGVzZHM7CisgICAgZXNkcyA9IE5VTEw7Cit9CisKK3N0YXR1c190IGFkZFZvcmJpc0NvZGVjSW5mbygKKyAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorICAgICAgICBjb25zdCB2b2lkICpfY29kZWNQcml2YXRlLCBzaXplX3QgY29kZWNQcml2YXRlU2l6ZSkgeworICAgIC8vIGhleGR1bXAoX2NvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CisKKyAgICBpZiAoY29kZWNQcml2YXRlU2l6ZSA8IDEpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBjb25zdCB1aW50OF90ICpjb2RlY1ByaXZhdGUgPSAoY29uc3QgdWludDhfdCAqKV9jb2RlY1ByaXZhdGU7CisKKyAgICBpZiAoY29kZWNQcml2YXRlWzBdICE9IDB4MDIpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICAvLyBjb2RlY0luZm8gc3RhcnRzIHdpdGggdHdvIGxlbmd0aHMsIGxlbjEgYW5kIGxlbjIsIHRoYXQgYXJlCisgICAgLy8gIlhpcGgtc3R5bGUtbGFjaW5nIGVuY29kZWQiLi4uCisKKyAgICBzaXplX3Qgb2Zmc2V0ID0gMTsKKyAgICBzaXplX3QgbGVuMSA9IDA7CisgICAgd2hpbGUgKG9mZnNldCA8IGNvZGVjUHJpdmF0ZVNpemUgJiYgY29kZWNQcml2YXRlW29mZnNldF0gPT0gMHhmZikgeworICAgICAgICBpZiAobGVuMSA+IChTSVpFX01BWCAtIDB4ZmYpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOyAvLyB3b3VsZCBvdmVyZmxvdworICAgICAgICB9CisgICAgICAgIGxlbjEgKz0gMHhmZjsKKyAgICAgICAgKytvZmZzZXQ7CisgICAgfQorICAgIGlmIChvZmZzZXQgPj0gY29kZWNQcml2YXRlU2l6ZSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICBpZiAobGVuMSA+IChTSVpFX01BWCAtIGNvZGVjUHJpdmF0ZVtvZmZzZXRdKSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOyAvLyB3b3VsZCBvdmVyZmxvdworICAgIH0KKyAgICBsZW4xICs9IGNvZGVjUHJpdmF0ZVtvZmZzZXQrK107CisKKyAgICBzaXplX3QgbGVuMiA9IDA7CisgICAgd2hpbGUgKG9mZnNldCA8IGNvZGVjUHJpdmF0ZVNpemUgJiYgY29kZWNQcml2YXRlW29mZnNldF0gPT0gMHhmZikgeworICAgICAgICBpZiAobGVuMiA+IChTSVpFX01BWCAtIDB4ZmYpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOyAvLyB3b3VsZCBvdmVyZmxvdworICAgICAgICB9CisgICAgICAgIGxlbjIgKz0gMHhmZjsKKyAgICAgICAgKytvZmZzZXQ7CisgICAgfQorICAgIGlmIChvZmZzZXQgPj0gY29kZWNQcml2YXRlU2l6ZSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICBpZiAobGVuMiA+IChTSVpFX01BWCAtIGNvZGVjUHJpdmF0ZVtvZmZzZXRdKSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOyAvLyB3b3VsZCBvdmVyZmxvdworICAgIH0KKyAgICBsZW4yICs9IGNvZGVjUHJpdmF0ZVtvZmZzZXQrK107CisKKyAgICBpZiAobGVuMSA+IFNJWkVfTUFYIC0gbGVuMiB8fCBvZmZzZXQgPiBTSVpFX01BWCAtIChsZW4xICsgbGVuMikgfHwKKyAgICAgICAgICAgIGNvZGVjUHJpdmF0ZVNpemUgPCBvZmZzZXQgKyBsZW4xICsgbGVuMikgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIGlmIChjb2RlY1ByaXZhdGVbb2Zmc2V0XSAhPSAweDAxKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIG1ldGEuc2V0RGF0YShrS2V5Vm9yYmlzSW5mbywgMCwgJmNvZGVjUHJpdmF0ZVtvZmZzZXRdLCBsZW4xKTsKKworICAgIG9mZnNldCArPSBsZW4xOworICAgIGlmIChjb2RlY1ByaXZhdGVbb2Zmc2V0XSAhPSAweDAzKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgb2Zmc2V0ICs9IGxlbjI7CisgICAgaWYgKGNvZGVjUHJpdmF0ZVtvZmZzZXRdICE9IDB4MDUpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBtZXRhLnNldERhdGEoCisgICAgICAgICAgICBrS2V5Vm9yYmlzQm9va3MsIDAsICZjb2RlY1ByaXZhdGVbb2Zmc2V0XSwKKyAgICAgICAgICAgIGNvZGVjUHJpdmF0ZVNpemUgLSBvZmZzZXQpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0aWMgc3RhdHVzX3QgYWRkRmxhY01ldGFkYXRhKAorICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgIGNvbnN0IHZvaWQgKmNvZGVjUHJpdmF0ZSwgc2l6ZV90IGNvZGVjUHJpdmF0ZVNpemUpIHsKKyAgICAvLyBoZXhkdW1wKGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CisKKyAgICBtZXRhLnNldERhdGEoa0tleUZsYWNNZXRhZGF0YSwgMCwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKworICAgIGludDMyX3QgbWF4SW5wdXRTaXplID0gNjQgPDwgMTA7CisgICAgRkxBQ0RlY29kZXIgKmZsYWNEZWNvZGVyID0gRkxBQ0RlY29kZXI6OkNyZWF0ZSgpOworICAgIGlmIChmbGFjRGVjb2RlciAhPSBOVUxMCisgICAgICAgICAgICAmJiBmbGFjRGVjb2Rlci0+cGFyc2VNZXRhZGF0YSgoY29uc3QgdWludDhfdCopY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKSA9PSBPSykgeworICAgICAgICBGTEFDX19TdHJlYW1NZXRhZGF0YV9TdHJlYW1JbmZvIHN0cmVhbUluZm8gPSBmbGFjRGVjb2Rlci0+Z2V0U3RyZWFtSW5mbygpOworICAgICAgICBtYXhJbnB1dFNpemUgPSBzdHJlYW1JbmZvLm1heF9mcmFtZXNpemU7CisgICAgICAgIGlmIChtYXhJbnB1dFNpemUgPT0gMCkgeworICAgICAgICAgICAgLy8gSW4gY2FzZSBtYXggZnJhbWVzaXplIGlzIG5vdCBhdmFpbGFibGUsIHVzZSByYXcgZGF0YSBzaXplIGFzIG1heCBmcmFtZXNpemUsCisgICAgICAgICAgICAvLyBhc3N1bWluZyB0aGVyZSBpcyBubyBleHBhbnNpb24uCisgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5tYXhfYmxvY2tzaXplICE9IDAKKyAgICAgICAgICAgICAgICAgICAgJiYgc3RyZWFtSW5mby5jaGFubmVscyAhPSAwCisgICAgICAgICAgICAgICAgICAgICYmICgoc3RyZWFtSW5mby5iaXRzX3Blcl9zYW1wbGUgKyA3KSAvIDgpID4KKyAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyX01BWCAvIHN0cmVhbUluZm8ubWF4X2Jsb2Nrc2l6ZSAvIHN0cmVhbUluZm8uY2hhbm5lbHMpIHsKKyAgICAgICAgICAgICAgICBkZWxldGUgZmxhY0RlY29kZXI7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1heElucHV0U2l6ZSA9ICgoc3RyZWFtSW5mby5iaXRzX3Blcl9zYW1wbGUgKyA3KSAvIDgpCisgICAgICAgICAgICAgICAgKiBzdHJlYW1JbmZvLm1heF9ibG9ja3NpemUgKiBzdHJlYW1JbmZvLmNoYW5uZWxzOworICAgICAgICB9CisgICAgfQorICAgIG1ldGEuc2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgbWF4SW5wdXRTaXplKTsKKworICAgIGRlbGV0ZSBmbGFjRGVjb2RlcjsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1hdHJvc2thRXh0cmFjdG9yOjpzeW50aGVzaXplQVZDQyhUcmFja0luZm8gKnRyYWNrSW5mbywgc2l6ZV90IGluZGV4KSB7CisgICAgQmxvY2tJdGVyYXRvciBpdGVyKHRoaXMsIHRyYWNrSW5mby0+bVRyYWNrTnVtLCBpbmRleCk7CisgICAgaWYgKGl0ZXIuZW9zKCkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBjb25zdCBta3ZwYXJzZXI6OkJsb2NrICpibG9jayA9IGl0ZXIuYmxvY2soKTsKKyAgICBpZiAoYmxvY2stPkdldEZyYW1lQ291bnQoKSA8PSAwKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgY29uc3QgbWt2cGFyc2VyOjpCbG9jazo6RnJhbWUgJmZyYW1lID0gYmxvY2stPkdldEZyYW1lKDApOworICAgIGF1dG8gdG1wRGF0YSA9IGhlYXBidWZmZXI8dW5zaWduZWQgY2hhcj4oZnJhbWUubGVuKTsKKyAgICBsb25nIG4gPSBmcmFtZS5SZWFkKG1SZWFkZXIsIHRtcERhdGEuZ2V0KCkpOworICAgIGlmIChuICE9IDApIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBpZiAoIU1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YSh0cmFja0luZm8tPm1NZXRhLCB0bXBEYXRhLmdldCgpLCBmcmFtZS5sZW4pKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgLy8gT3ZlcnJpZGUgdGhlIHN5bnRoZXNpemVkIG5hbCBsZW5ndGggc2l6ZSwgd2hpY2ggaXMgYXJiaXRyYXJ5CisgICAgdHJhY2tJbmZvLT5tTWV0YS5zZXRJbnQzMihrS2V5TmFsTGVuZ3RoU2l6ZSwgMCk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaXNWYWxpZEludDMyQ29sb3VyVmFsdWUobG9uZyBsb25nIHZhbHVlKSB7CisgICAgcmV0dXJuIHZhbHVlICE9IG1rdnBhcnNlcjo6Q29sb3VyOjprVmFsdWVOb3RQcmVzZW50CisgICAgICAgICAgICAmJiB2YWx1ZSA+PSBJTlQzMl9NSU4KKyAgICAgICAgICAgICYmIHZhbHVlIDw9IElOVDMyX01BWDsKK30KKworc3RhdGljIGlubGluZSBib29sIGlzVmFsaWRVaW50MTZDb2xvdXJWYWx1ZShsb25nIGxvbmcgdmFsdWUpIHsKKyAgICByZXR1cm4gdmFsdWUgIT0gbWt2cGFyc2VyOjpDb2xvdXI6OmtWYWx1ZU5vdFByZXNlbnQKKyAgICAgICAgICAgICYmIHZhbHVlID49IDAKKyAgICAgICAgICAgICYmIHZhbHVlIDw9IFVJTlQxNl9NQVg7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc1ZhbGlkUHJpbWFyeShjb25zdCBta3ZwYXJzZXI6OlByaW1hcnlDaHJvbWF0aWNpdHkgKnByaW1hcnkpIHsKKyAgICByZXR1cm4gcHJpbWFyeSAhPSBOVUxMICYmIHByaW1hcnktPnggPj0gMCAmJiBwcmltYXJ5LT54IDw9IDEKKyAgICAgICAgICAgICAmJiBwcmltYXJ5LT55ID49IDAgJiYgcHJpbWFyeS0+eSA8PSAxOworfQorCit2b2lkIE1hdHJvc2thRXh0cmFjdG9yOjpnZXRDb2xvckluZm9ybWF0aW9uKAorICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlZpZGVvVHJhY2sgKnZ0cmFjaywgTWV0YURhdGFCYXNlICZtZXRhKSB7CisgICAgY29uc3QgbWt2cGFyc2VyOjpDb2xvdXIgKmNvbG9yID0gdnRyYWNrLT5HZXRDb2xvdXIoKTsKKyAgICBpZiAoY29sb3IgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gQ29sb3IgQXNwZWN0cworICAgIHsKKyAgICAgICAgaW50MzJfdCBwcmltYXJpZXMgPSAyOyAvLyBJU08gdW5zcGVjaWZpZWQKKyAgICAgICAgaW50MzJfdCB0cmFuc2ZlciA9IDI7IC8vIElTTyB1bnNwZWNpZmllZAorICAgICAgICBpbnQzMl90IGNvZWZmcyA9IDI7IC8vIElTTyB1bnNwZWNpZmllZAorICAgICAgICBib29sIGZ1bGxSYW5nZSA9IGZhbHNlOyAvLyBkZWZhdWx0CisgICAgICAgIGJvb2wgcmFuZ2VTcGVjaWZpZWQgPSBmYWxzZTsKKworICAgICAgICBpZiAoaXNWYWxpZEludDMyQ29sb3VyVmFsdWUoY29sb3ItPnByaW1hcmllcykpIHsKKyAgICAgICAgICAgIHByaW1hcmllcyA9IGNvbG9yLT5wcmltYXJpZXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzVmFsaWRJbnQzMkNvbG91clZhbHVlKGNvbG9yLT50cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3MpKSB7CisgICAgICAgICAgICB0cmFuc2ZlciA9IGNvbG9yLT50cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3M7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzVmFsaWRJbnQzMkNvbG91clZhbHVlKGNvbG9yLT5tYXRyaXhfY29lZmZpY2llbnRzKSkgeworICAgICAgICAgICAgY29lZmZzID0gY29sb3ItPm1hdHJpeF9jb2VmZmljaWVudHM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbG9yLT5yYW5nZSAhPSBta3ZwYXJzZXI6OkNvbG91cjo6a1ZhbHVlTm90UHJlc2VudAorICAgICAgICAgICAgICAgICYmIGNvbG9yLT5yYW5nZSAhPSAwIC8qIE1LViB1bnNwZWNpZmllZCAqLykgeworICAgICAgICAgICAgLy8gV2Ugb25seSBzdXBwb3J0IE1LViBicm9hZGNhc3QgcmFuZ2UgKD09IGxpbWl0ZWQpIGFuZCBmdWxsIHJhbmdlLgorICAgICAgICAgICAgLy8gV2UgdHJlYXQgYWxsIG90aGVyIHZhbHVlIGFzIHRoZSBkZWZhdWx0IGxpbWl0ZWQgcmFuZ2UuCisgICAgICAgICAgICBmdWxsUmFuZ2UgPSBjb2xvci0+cmFuZ2UgPT0gMiAvKiBNS1YgZnVsbFJhbmdlICovOworICAgICAgICAgICAgcmFuZ2VTcGVjaWZpZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQ29sb3JBc3BlY3RzIGFzcGVjdHM7CisgICAgICAgIENvbG9yVXRpbHM6OmNvbnZlcnRJc29Db2xvckFzcGVjdHNUb0NvZGVjQXNwZWN0cygKKyAgICAgICAgICAgICAgICBwcmltYXJpZXMsIHRyYW5zZmVyLCBjb2VmZnMsIGZ1bGxSYW5nZSwgYXNwZWN0cyk7CisgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleUNvbG9yUHJpbWFyaWVzLCBhc3BlY3RzLm1QcmltYXJpZXMpOworICAgICAgICBtZXRhLnNldEludDMyKGtLZXlUcmFuc2ZlckZ1bmN0aW9uLCBhc3BlY3RzLm1UcmFuc2Zlcik7CisgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleUNvbG9yTWF0cml4LCBhc3BlY3RzLm1NYXRyaXhDb2VmZnMpOworICAgICAgICBtZXRhLnNldEludDMyKAorICAgICAgICAgICAgICAgIGtLZXlDb2xvclJhbmdlLCByYW5nZVNwZWNpZmllZCA/IGFzcGVjdHMubVJhbmdlIDogQ29sb3JBc3BlY3RzOjpSYW5nZVVuc3BlY2lmaWVkKTsKKyAgICB9CisKKyAgICAvLyBIRFIgU3RhdGljIEluZm8KKyAgICB7CisgICAgICAgIEhEUlN0YXRpY0luZm8gaW5mbywgbnVsbEluZm87IC8vIG51bGxJbmZvIGlzIGEgZnVsbHkgdW5zcGVjaWZpZWQgc3RhdGljIGluZm8KKyAgICAgICAgbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOworICAgICAgICBtZW1zZXQoJm51bGxJbmZvLCAwLCBzaXplb2YobnVsbEluZm8pKTsKKyAgICAgICAgaWYgKGlzVmFsaWRVaW50MTZDb2xvdXJWYWx1ZShjb2xvci0+bWF4X2NsbCkpIHsKKyAgICAgICAgICAgIGluZm8uc1R5cGUxLm1NYXhDb250ZW50TGlnaHRMZXZlbCA9IGNvbG9yLT5tYXhfY2xsOworICAgICAgICB9CisgICAgICAgIGlmIChpc1ZhbGlkVWludDE2Q29sb3VyVmFsdWUoY29sb3ItPm1heF9mYWxsKSkgeworICAgICAgICAgICAgaW5mby5zVHlwZTEubU1heEZyYW1lQXZlcmFnZUxpZ2h0TGV2ZWwgPSBjb2xvci0+bWF4X2ZhbGw7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpNYXN0ZXJpbmdNZXRhZGF0YSAqbWFzdGVyaW5nID0gY29sb3ItPm1hc3RlcmluZ19tZXRhZGF0YTsKKyAgICAgICAgaWYgKG1hc3RlcmluZyAhPSBOVUxMKSB7CisgICAgICAgICAgICAvLyBDb252ZXJ0IG1hdHJvc2thIHZhbHVlcyB0byBIRFJTdGF0aWNJbmZvIGVxdWl2YWxlbnQgdmFsdWVzIGZvciBlYWNoIGZ1bGx5IHNwZWNpZmllZAorICAgICAgICAgICAgLy8gZ3JvdXAuIFNlZSBDVEEtNjgxLjMgc2VjdGlvbiAzLjIuMSBmb3IgbW9yZSBpbmZvLgorICAgICAgICAgICAgaWYgKG1hc3RlcmluZy0+bHVtaW5hbmNlX21heCA+PSAwLjUgJiYgbWFzdGVyaW5nLT5sdW1pbmFuY2VfbWF4IDwgNjU1MzUuNSkgeworICAgICAgICAgICAgICAgIGluZm8uc1R5cGUxLm1NYXhEaXNwbGF5THVtaW5hbmNlID0gKHVpbnQxNl90KShtYXN0ZXJpbmctPmx1bWluYW5jZV9tYXggKyAwLjUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1hc3RlcmluZy0+bHVtaW5hbmNlX21pbiA+PSAwLjAwMDA1ICYmIG1hc3RlcmluZy0+bHVtaW5hbmNlX21pbiA8IDYuNTUzNTUpIHsKKyAgICAgICAgICAgICAgICAvLyBIRFJTdGF0aWNJbmZvIFR5cGUxIHN0b3JlcyBtaW4gbHVtaW5hbmNlIHNjYWxlZCAxMDAwMDoxCisgICAgICAgICAgICAgICAgaW5mby5zVHlwZTEubU1pbkRpc3BsYXlMdW1pbmFuY2UgPQorICAgICAgICAgICAgICAgICAgICAodWludDE2X3QpKDEwMDAwICogbWFzdGVyaW5nLT5sdW1pbmFuY2VfbWluICsgMC41KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEhEUlN0YXRpY0luZm8gVHlwZTEgc3RvcmVzIHByaW1hcmllcyBzY2FsZWQgNTAwMDA6MQorICAgICAgICAgICAgaWYgKGlzVmFsaWRQcmltYXJ5KG1hc3RlcmluZy0+d2hpdGVfcG9pbnQpKSB7CisgICAgICAgICAgICAgICAgaW5mby5zVHlwZTEubVcueCA9ICh1aW50MTZfdCkoNTAwMDAgKiBtYXN0ZXJpbmctPndoaXRlX3BvaW50LT54ICsgMC41KTsKKyAgICAgICAgICAgICAgICBpbmZvLnNUeXBlMS5tVy55ID0gKHVpbnQxNl90KSg1MDAwMCAqIG1hc3RlcmluZy0+d2hpdGVfcG9pbnQtPnkgKyAwLjUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlzVmFsaWRQcmltYXJ5KG1hc3RlcmluZy0+cikgJiYgaXNWYWxpZFByaW1hcnkobWFzdGVyaW5nLT5nKQorICAgICAgICAgICAgICAgICAgICAmJiBpc1ZhbGlkUHJpbWFyeShtYXN0ZXJpbmctPmIpKSB7CisgICAgICAgICAgICAgICAgaW5mby5zVHlwZTEubVIueCA9ICh1aW50MTZfdCkoNTAwMDAgKiBtYXN0ZXJpbmctPnItPnggKyAwLjUpOworICAgICAgICAgICAgICAgIGluZm8uc1R5cGUxLm1SLnkgPSAodWludDE2X3QpKDUwMDAwICogbWFzdGVyaW5nLT5yLT55ICsgMC41KTsKKyAgICAgICAgICAgICAgICBpbmZvLnNUeXBlMS5tRy54ID0gKHVpbnQxNl90KSg1MDAwMCAqIG1hc3RlcmluZy0+Zy0+eCArIDAuNSk7CisgICAgICAgICAgICAgICAgaW5mby5zVHlwZTEubUcueSA9ICh1aW50MTZfdCkoNTAwMDAgKiBtYXN0ZXJpbmctPmctPnkgKyAwLjUpOworICAgICAgICAgICAgICAgIGluZm8uc1R5cGUxLm1CLnggPSAodWludDE2X3QpKDUwMDAwICogbWFzdGVyaW5nLT5iLT54ICsgMC41KTsKKyAgICAgICAgICAgICAgICBpbmZvLnNUeXBlMS5tQi55ID0gKHVpbnQxNl90KSg1MDAwMCAqIG1hc3RlcmluZy0+Yi0+eSArIDAuNSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gT25seSBhZHZlcnRpc2Ugc3RhdGljIGluZm8gaWYgYXQgbGVhc3Qgb25lIG9mIHRoZSBncm91cHMgaGF2ZSBiZWVuIHNwZWNpZmllZC4KKyAgICAgICAgaWYgKG1lbWNtcCgmaW5mbywgJm51bGxJbmZvLCBzaXplb2YoaW5mbykpICE9IDApIHsKKyAgICAgICAgICAgIGluZm8ubUlEID0gSERSU3RhdGljSW5mbzo6a1R5cGUxOworICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlIZHJTdGF0aWNJbmZvLCAnaGRyUycsICZpbmZvLCBzaXplb2YoaW5mbykpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0dXNfdCBNYXRyb3NrYUV4dHJhY3Rvcjo6aW5pdFRyYWNrSW5mbygKKyAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpUcmFjayAqdHJhY2ssIE1ldGFEYXRhQmFzZSAmbWV0YSwgVHJhY2tJbmZvICp0cmFja0luZm8pIHsKKyAgICB0cmFja0luZm8tPm1UcmFja051bSA9IHRyYWNrLT5HZXROdW1iZXIoKTsKKyAgICB0cmFja0luZm8tPm1NZXRhID0gbWV0YTsKKyAgICB0cmFja0luZm8tPm1FeHRyYWN0b3IgPSB0aGlzOworICAgIHRyYWNrSW5mby0+bUVuY3J5cHRlZCA9IGZhbHNlOworICAgIHRyYWNrSW5mby0+bUhlYWRlciA9IE5VTEw7CisgICAgdHJhY2tJbmZvLT5tSGVhZGVyTGVuID0gMDsKKworICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCB0cmFjay0+R2V0Q29udGVudEVuY29kaW5nQ291bnQoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6Q29udGVudEVuY29kaW5nICplbmNvZGluZyA9IHRyYWNrLT5HZXRDb250ZW50RW5jb2RpbmdCeUluZGV4KGkpOworICAgICAgICBmb3Ioc2l6ZV90IGogPSAwOyBqIDwgZW5jb2RpbmctPkdldEVuY3J5cHRpb25Db3VudCgpOyBqKyspIHsKKyAgICAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6Q29udGVudEVuY29kaW5nOjpDb250ZW50RW5jcnlwdGlvbiAqZW5jcnlwdGlvbjsKKyAgICAgICAgICAgIGVuY3J5cHRpb24gPSBlbmNvZGluZy0+R2V0RW5jcnlwdGlvbkJ5SW5kZXgoaik7CisgICAgICAgICAgICB0cmFja0luZm8tPm1NZXRhLnNldERhdGEoa0tleUNyeXB0b0tleSwgMCwgZW5jcnlwdGlvbi0+a2V5X2lkLCBlbmNyeXB0aW9uLT5rZXlfaWRfbGVuKTsKKyAgICAgICAgICAgIHRyYWNrSW5mby0+bUVuY3J5cHRlZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGZvcihzaXplX3QgaiA9IDA7IGogPCBlbmNvZGluZy0+R2V0Q29tcHJlc3Npb25Db3VudCgpOyBqKyspIHsKKyAgICAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6Q29udGVudEVuY29kaW5nOjpDb250ZW50Q29tcHJlc3Npb24gKmNvbXByZXNzaW9uOworICAgICAgICAgICAgY29tcHJlc3Npb24gPSBlbmNvZGluZy0+R2V0Q29tcHJlc3Npb25CeUluZGV4KGopOworICAgICAgICAgICAgQUxPR1YoImNvbXByZXNzaW9uIGFsZ28gJWxsdSBzZXR0aW5nc19sZW4gJWxsZCIsCisgICAgICAgICAgICAgICAgY29tcHJlc3Npb24tPmFsZ28sIGNvbXByZXNzaW9uLT5zZXR0aW5nc19sZW4pOworICAgICAgICAgICAgaWYgKGNvbXByZXNzaW9uLT5hbGdvID09IDMKKyAgICAgICAgICAgICAgICAgICAgJiYgY29tcHJlc3Npb24tPnNldHRpbmdzCisgICAgICAgICAgICAgICAgICAgICYmIGNvbXByZXNzaW9uLT5zZXR0aW5nc19sZW4gPiAwKSB7CisgICAgICAgICAgICAgICAgdHJhY2tJbmZvLT5tSGVhZGVyID0gY29tcHJlc3Npb24tPnNldHRpbmdzOworICAgICAgICAgICAgICAgIHRyYWNrSW5mby0+bUhlYWRlckxlbiA9IGNvbXByZXNzaW9uLT5zZXR0aW5nc19sZW47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgTWF0cm9za2FFeHRyYWN0b3I6OmFkZFRyYWNrcygpIHsKKyAgICBjb25zdCBta3ZwYXJzZXI6OlRyYWNrcyAqdHJhY2tzID0gbVNlZ21lbnQtPkdldFRyYWNrcygpOworCisgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHRyYWNrcy0+R2V0VHJhY2tzQ291bnQoKTsgKytpbmRleCkgeworICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlRyYWNrICp0cmFjayA9IHRyYWNrcy0+R2V0VHJhY2tCeUluZGV4KGluZGV4KTsKKworICAgICAgICBpZiAodHJhY2sgPT0gTlVMTCkgeworICAgICAgICAgICAgLy8gQXBwYXJlbnRseSB0aGlzIGlzIGN1cnJlbnRseSB2YWxpZCAoaWYgdW5leHBlY3RlZCkgYmVoYXZpb3VyCisgICAgICAgICAgICAvLyBvZiB0aGUgbWt2IHBhcnNlciBsaWIuCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IGNoYXIgKmNvbnN0IGNvZGVjSUQgPSB0cmFjay0+R2V0Q29kZWNJZCgpOworICAgICAgICBBTE9HVigiY29kZWMgaWQgPSAlcyIsIGNvZGVjSUQpOworICAgICAgICBBTE9HVigiY29kZWMgbmFtZSA9ICVzIiwgdHJhY2stPkdldENvZGVjTmFtZUFzVVRGOCgpKTsKKworICAgICAgICBpZiAoY29kZWNJRCA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HVygidW5rbm93biBjb2RlY0lEIGlzIG5vdCBzdXBwb3J0ZWQuIik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBjb2RlY1ByaXZhdGVTaXplOworICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpjb2RlY1ByaXZhdGUgPQorICAgICAgICAgICAgdHJhY2stPkdldENvZGVjUHJpdmF0ZShjb2RlY1ByaXZhdGVTaXplKTsKKworICAgICAgICBlbnVtIHsgVklERU9fVFJBQ0sgPSAxLCBBVURJT19UUkFDSyA9IDIgfTsKKworICAgICAgICBNZXRhRGF0YUJhc2UgbWV0YTsKKworICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKworICAgICAgICBzd2l0Y2ggKHRyYWNrLT5HZXRUeXBlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgVklERU9fVFJBQ0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpWaWRlb1RyYWNrICp2dHJhY2sgPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBta3ZwYXJzZXI6OlZpZGVvVHJhY2sgKj4odHJhY2spOworCisgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAoIlZfTVBFRzQvSVNPL0FWQyIsIGNvZGVjSUQpKSB7CisgICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CisgICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0RGF0YShrS2V5QVZDQywgMCwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIlZfTVBFR0gvSVNPL0hFVkMiLCBjb2RlY0lEKSkgeworICAgICAgICAgICAgICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVjUHJpdmF0ZVNpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleUhWQ0MsIGtUeXBlSFZDQywgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJIRVZDIGlzIGRldGVjdGVkLCBidXQgZG9lcyBub3QgaGF2ZSBjb25maWd1cmF0aW9uLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIlZfTVBFRzQvSVNPL0FTUCIsIGNvZGVjSUQpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlY1ByaXZhdGVTaXplID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRDU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVTRFNGcm9tQ29kZWNQcml2YXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLCBmYWxzZSwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBpcyBkZXRlY3RlZCwgYnV0IGRvZXMgbm90IGhhdmUgY29uZmlndXJhdGlvbi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY0lEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJWX1ZQOCIsIGNvZGVjSUQpKSB7CisgICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJWX1ZQOSIsIGNvZGVjSUQpKSB7CisgICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlY1ByaXZhdGVTaXplID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgIC8vICdjc2QtMCcgZm9yIFZQOSBpcyB0aGUgQmxvYiBvZiBDb2RlYyBQcml2YXRlIGRhdGEgYXMKKyAgICAgICAgICAgICAgICAgICAgICAvLyBzcGVjaWZpZWQgaW4gaHR0cDovL3d3dy53ZWJtcHJvamVjdC5vcmcvdnA5L3Byb2ZpbGVzLy4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0RGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlWcDlDb2RlY1ByaXZhdGUsIDAsIGNvZGVjUHJpdmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjUHJpdmF0ZVNpemUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzIGlzIG5vdCBzdXBwb3J0ZWQuIiwgY29kZWNJRCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNvbnN0IGxvbmcgbG9uZyB3aWR0aCA9IHZ0cmFjay0+R2V0V2lkdGgoKTsKKyAgICAgICAgICAgICAgICBjb25zdCBsb25nIGxvbmcgaGVpZ2h0ID0gdnRyYWNrLT5HZXRIZWlnaHQoKTsKKyAgICAgICAgICAgICAgICBpZiAod2lkdGggPD0gMCB8fCB3aWR0aCA+IElOVDMyX01BWCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygidHJhY2sgd2lkdGggZXhjZWVkcyBpbnQzMl90LCAlbGxkIiwgd2lkdGgpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGhlaWdodCA8PSAwIHx8IGhlaWdodCA+IElOVDMyX01BWCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygidHJhY2sgaGVpZ2h0IGV4Y2VlZHMgaW50MzJfdCwgJWxsZCIsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZXRhLnNldEludDMyKGtLZXlXaWR0aCwgKGludDMyX3Qpd2lkdGgpOworICAgICAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleUhlaWdodCwgKGludDMyX3QpaGVpZ2h0KTsKKworICAgICAgICAgICAgICAgIC8vIHNldHRpbmcgZGlzcGxheSB3aWR0aC9oZWlnaHQgaXMgb3B0aW9uYWwKKyAgICAgICAgICAgICAgICBjb25zdCBsb25nIGxvbmcgZGlzcGxheVVuaXQgPSB2dHJhY2stPkdldERpc3BsYXlVbml0KCk7CisgICAgICAgICAgICAgICAgY29uc3QgbG9uZyBsb25nIGRpc3BsYXlXaWR0aCA9IHZ0cmFjay0+R2V0RGlzcGxheVdpZHRoKCk7CisgICAgICAgICAgICAgICAgY29uc3QgbG9uZyBsb25nIGRpc3BsYXlIZWlnaHQgPSB2dHJhY2stPkdldERpc3BsYXlIZWlnaHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcGxheVdpZHRoID4gMCAmJiBkaXNwbGF5V2lkdGggPD0gSU5UMzJfTUFYCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBkaXNwbGF5SGVpZ2h0ID4gMCAmJiBkaXNwbGF5SGVpZ2h0IDw9IElOVDMyX01BWCkgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGRpc3BsYXlVbml0KSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMDogLy8gcGl4ZWxzCisgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLnNldEludDMyKGtLZXlEaXNwbGF5V2lkdGgsIChpbnQzMl90KWRpc3BsYXlXaWR0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLnNldEludDMyKGtLZXlEaXNwbGF5SGVpZ2h0LCAoaW50MzJfdClkaXNwbGF5SGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IC8vIGNlbnRpbWV0ZXJzCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjogLy8gaW5jaGVzCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzogLy8gYXNwZWN0IHJhdGlvCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBoeXNpY2FsIGxheW91dCBzaXplIGlzIHRyZWF0ZWQgdGhlIHNhbWUgYXMgYXNwZWN0IHJhdGlvLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogZGlzcGxheVdpZHRoIGFuZCBkaXNwbGF5SGVpZ2h0IGFyZSBuZXZlciB6ZXJvIGFzIHRoZXkgYXJlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVja2VkIGluIHRoZSBpZiBhYm92ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBjb21wdXRlZFdpZHRoID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXgod2lkdGgsIGhlaWdodCAqIGRpc3BsYXlXaWR0aCAvIGRpc3BsYXlIZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9uZyBsb25nIGNvbXB1dGVkSGVpZ2h0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXgoaGVpZ2h0LCB3aWR0aCAqIGRpc3BsYXlIZWlnaHQgLyBkaXNwbGF5V2lkdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXB1dGVkV2lkdGggPD0gSU5UMzJfTUFYICYmIGNvbXB1dGVkSGVpZ2h0IDw9IElOVDMyX01BWCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleURpc3BsYXlXaWR0aCwgKGludDMyX3QpY29tcHV0ZWRXaWR0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5RGlzcGxheUhlaWdodCwgKGludDMyX3QpY29tcHV0ZWRIZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogLy8gdW5rbm93biBkaXNwbGF5IHVuaXRzLCBwZXJoYXBzIGZ1dHVyZSB2ZXJzaW9uIG9mIHNwZWMuCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGdldENvbG9ySW5mb3JtYXRpb24odnRyYWNrLCBtZXRhKTsKKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIEFVRElPX1RSQUNLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6QXVkaW9UcmFjayAqYXRyYWNrID0KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgbWt2cGFyc2VyOjpBdWRpb1RyYWNrICo+KHRyYWNrKTsKKworICAgICAgICAgICAgICAgIGlmICghc3RyY21wKCJBX0FBQyIsIGNvZGVjSUQpKSB7CisgICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyk7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKGNvZGVjUHJpdmF0ZVNpemUgPj0gMik7CisKKyAgICAgICAgICAgICAgICAgICAgYWRkRVNEU0Zyb21Db2RlY1ByaXZhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YSwgdHJ1ZSwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIkFfVk9SQklTIiwgY29kZWNJRCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTKTsKKworICAgICAgICAgICAgICAgICAgICBlcnIgPSBhZGRWb3JiaXNDb2RlY0luZm8oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YSwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIkFfT1BVUyIsIGNvZGVjSUQpKSB7CisgICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMpOworICAgICAgICAgICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleU9wdXNIZWFkZXIsIDAsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0SW50NjQoa0tleU9wdXNDb2RlY0RlbGF5LCB0cmFjay0+R2V0Q29kZWNEZWxheSgpKTsKKyAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRJbnQ2NChrS2V5T3B1c1NlZWtQcmVSb2xsLCB0cmFjay0+R2V0U2Vla1ByZVJvbGwoKSk7CisgICAgICAgICAgICAgICAgICAgIG1TZWVrUHJlUm9sbE5zID0gdHJhY2stPkdldFNlZWtQcmVSb2xsKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJBX01QRUcvTDMiLCBjb2RlY0lEKSkgeworICAgICAgICAgICAgICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIkFfRkxBQyIsIGNvZGVjSUQpKSB7CisgICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMpOworICAgICAgICAgICAgICAgICAgICBlcnIgPSBhZGRGbGFjTWV0YWRhdGEobWV0YSwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMgaXMgbm90IHN1cHBvcnRlZC4iLCBjb2RlY0lEKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgYXRyYWNrLT5HZXRTYW1wbGluZ1JhdGUoKSk7CisgICAgICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBhdHJhY2stPkdldENoYW5uZWxzKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgY2hhciAqbGFuZ3VhZ2UgPSB0cmFjay0+R2V0TGFuZ3VhZ2UoKTsKKyAgICAgICAgaWYgKGxhbmd1YWdlICE9IE5VTEwpIHsKKyAgICAgICAgICAgY2hhciBsYW5nWzRdOworICAgICAgICAgICBzdHJuY3B5KGxhbmcsIGxhbmd1YWdlLCAzKTsKKyAgICAgICAgICAgbGFuZ1szXSA9ICdcMCc7CisgICAgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TWVkaWFMYW5ndWFnZSwgbGFuZyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgic2tpcHBpbmcgdHJhY2ssIGNvZGVjIHNwZWNpZmljIGRhdGEgd2FzIG1hbGZvcm1lZC4iKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgbG9uZyBsb25nIGR1cmF0aW9uTnMgPSBtU2VnbWVudC0+R2V0RHVyYXRpb24oKTsKKyAgICAgICAgbWV0YS5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIChkdXJhdGlvbk5zICsgNTAwKSAvIDEwMDApOworCisgICAgICAgIG1UcmFja3MucHVzaCgpOworICAgICAgICBzaXplX3QgbiA9IG1UcmFja3Muc2l6ZSgpIC0gMTsKKyAgICAgICAgVHJhY2tJbmZvICp0cmFja0luZm8gPSAmbVRyYWNrcy5lZGl0SXRlbUF0KG4pOworICAgICAgICBpbml0VHJhY2tJbmZvKHRyYWNrLCBtZXRhLCB0cmFja0luZm8pOworCisgICAgICAgIGlmICghc3RyY21wKCJWX01QRUc0L0lTTy9BVkMiLCBjb2RlY0lEKSAmJiBjb2RlY1ByaXZhdGVTaXplID09IDApIHsKKyAgICAgICAgICAgIC8vIEF0dGVtcHQgdG8gcmVjb3ZlciBmcm9tIEFWQyB0cmFjayB3aXRob3V0IGNvZGVjIHByaXZhdGUgZGF0YQorICAgICAgICAgICAgZXJyID0gc3ludGhlc2l6ZUFWQ0ModHJhY2tJbmZvLCBuKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBtVHJhY2tzLnBvcCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIE1hdHJvc2thRXh0cmFjdG9yOjpmaW5kVGh1bWJuYWlscygpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgVHJhY2tJbmZvICppbmZvID0gJm1UcmFja3MuZWRpdEl0ZW1BdChpKTsKKworICAgICAgICBjb25zdCBjaGFyICptaW1lOworICAgICAgICBDSEVDSyhpbmZvLT5tTWV0YS5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisKKyAgICAgICAgaWYgKHN0cm5jYXNlY21wKG1pbWUsICJ2aWRlby8iLCA2KSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBCbG9ja0l0ZXJhdG9yIGl0ZXIodGhpcywgaW5mby0+bVRyYWNrTnVtLCBpKTsKKyAgICAgICAgaW50MzJfdCBqID0gMDsKKyAgICAgICAgaW50NjRfdCB0aHVtYm5haWxUaW1lVXMgPSAwOworICAgICAgICBzaXplX3QgbWF4QmxvY2tTaXplID0gMDsKKyAgICAgICAgd2hpbGUgKCFpdGVyLmVvcygpICYmIGogPCAyMCkgeworICAgICAgICAgICAgaWYgKGl0ZXIuYmxvY2soKS0+SXNLZXkoKSkgeworICAgICAgICAgICAgICAgICsrajsKKworICAgICAgICAgICAgICAgIHNpemVfdCBibG9ja1NpemUgPSAwOworICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgaXRlci5ibG9jaygpLT5HZXRGcmFtZUNvdW50KCk7ICsraykgeworICAgICAgICAgICAgICAgICAgICBibG9ja1NpemUgKz0gaXRlci5ibG9jaygpLT5HZXRGcmFtZShrKS5sZW47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGJsb2NrU2l6ZSA+IG1heEJsb2NrU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBtYXhCbG9ja1NpemUgPSBibG9ja1NpemU7CisgICAgICAgICAgICAgICAgICAgIHRodW1ibmFpbFRpbWVVcyA9IGl0ZXIuYmxvY2tUaW1lVXMoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpdGVyLmFkdmFuY2UoKTsKKyAgICAgICAgfQorICAgICAgICBpbmZvLT5tTWV0YS5zZXRJbnQ2NChrS2V5VGh1bWJuYWlsVGltZSwgdGh1bWJuYWlsVGltZVVzKTsKKyAgICB9Cit9CisKK3N0YXR1c190IE1hdHJvc2thRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpIHsKKyAgICBtZXRhLnNldENTdHJpbmcoCisgICAgICAgICAgICBrS2V5TUlNRVR5cGUsCisgICAgICAgICAgICBtSXNXZWJtID8gInZpZGVvL3dlYm0iIDogTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01BVFJPU0tBKTsKKworICAgIHJldHVybiBPSzsKK30KKwordWludDMyX3QgTWF0cm9za2FFeHRyYWN0b3I6OmZsYWdzKCkgY29uc3QgeworICAgIHVpbnQzMl90IHggPSBDQU5fUEFVU0U7CisgICAgaWYgKCFpc0xpdmVTdHJlYW1pbmcoKSkgeworICAgICAgICB4IHw9IENBTl9TRUVLX0JBQ0tXQVJEIHwgQ0FOX1NFRUtfRk9SV0FSRCB8IENBTl9TRUVLOworICAgIH0KKworICAgIHJldHVybiB4OworfQorCitib29sIFNuaWZmTWF0cm9za2EoCisgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKSB7CisgICAgRGF0YVNvdXJjZUJhc2VSZWFkZXIgcmVhZGVyKHNvdXJjZSk7CisgICAgbWt2cGFyc2VyOjpFQk1MSGVhZGVyIGVibWxIZWFkZXI7CisgICAgbG9uZyBsb25nIHBvczsKKyAgICBpZiAoZWJtbEhlYWRlci5QYXJzZSgmcmVhZGVyLCBwb3MpIDwgMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgKmNvbmZpZGVuY2UgPSAwLjY7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworCitleHRlcm4gIkMiIHsKKy8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKK19fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKK01lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgeworICAgIHJldHVybiB7CisgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTiwKKyAgICAgICAgVVVJRCgiYWJiZWRkOTItMzhjNC00OTA0LWE0YzEtYjNmNDVmODk5OTgwIiksCisgICAgICAgIDEsCisgICAgICAgICJNYXRyb3NrYSBFeHRyYWN0b3IiLAorICAgICAgICBbXSgKKyAgICAgICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorICAgICAgICAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLAorICAgICAgICAgICAgICAgIHZvaWQgKiosCisgICAgICAgICAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyAqKSAtPiBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgeworICAgICAgICAgICAgaWYgKFNuaWZmTWF0cm9za2Eoc291cmNlLCBjb25maWRlbmNlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBbXSgKKyAgICAgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopIC0+IE1lZGlhRXh0cmFjdG9yKiB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTWF0cm9za2FFeHRyYWN0b3Ioc291cmNlKTt9OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9OworfQorCit9IC8vIGV4dGVybiAiQyIKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbWt2L01hdHJvc2thRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL21rdi9NYXRyb3NrYUV4dHJhY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NjhlYTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21rdi9NYXRyb3NrYUV4dHJhY3Rvci5oCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNQVRST1NLQV9FWFRSQUNUT1JfSF8KKworI2RlZmluZSBNQVRST1NLQV9FWFRSQUNUT1JfSF8KKworI2luY2x1ZGUgIm1rdnBhcnNlci9ta3ZwYXJzZXIuaCIKKworI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBTWVzc2FnZTsKK2NsYXNzIFN0cmluZzg7CisKK2NsYXNzIE1ldGFEYXRhOworc3RydWN0IERhdGFTb3VyY2VCYXNlUmVhZGVyOworc3RydWN0IE1hdHJvc2thU291cmNlOworCitzdHJ1Y3QgTWF0cm9za2FFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgeworICAgIGV4cGxpY2l0IE1hdHJvc2thRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOworCisgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKKworICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOworCisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIGNvbnN0OworCisgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJNYXRyb3NrYUV4dHJhY3RvciI7IH0KKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfk1hdHJvc2thRXh0cmFjdG9yKCk7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBNYXRyb3NrYVNvdXJjZTsKKyAgICBmcmllbmQgc3RydWN0IEJsb2NrSXRlcmF0b3I7CisKKyAgICBzdHJ1Y3QgVHJhY2tJbmZvIHsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBtVHJhY2tOdW07CisgICAgICAgIGJvb2wgbUVuY3J5cHRlZDsKKyAgICAgICAgTWV0YURhdGFCYXNlIG1NZXRhOworICAgICAgICBjb25zdCBNYXRyb3NrYUV4dHJhY3RvciAqbUV4dHJhY3RvcjsKKyAgICAgICAgVmVjdG9yPGNvbnN0IG1rdnBhcnNlcjo6Q3VlUG9pbnQqPiBtQ3VlUG9pbnRzOworCisgICAgICAgIC8vIG1IZWFkZXIgcG9pbnRzIHRvIG1lbW9yeSBtYW5hZ2VkIGJ5IG1rdnBhcnNlcjsKKyAgICAgICAgLy8gbUhlYWRlciB3b3VsZCBiZSBkZWxldGVkIHdoZW4gbVNlZ21lbnQgaXMgZGVsZXRlZAorICAgICAgICAvLyBpbiB+TWF0cm9za2FFeHRyYWN0b3IuCisgICAgICAgIHVuc2lnbmVkIGNoYXIgKm1IZWFkZXI7CisgICAgICAgIHNpemVfdCBtSGVhZGVyTGVuOworCisgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6VHJhY2sqIGdldFRyYWNrKCkgY29uc3Q7CisgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6Q3VlUG9pbnQ6OlRyYWNrUG9zaXRpb24gKmZpbmQobG9uZyBsb25nIHRpbWVOcykgY29uc3Q7CisgICAgfTsKKworICAgIE11dGV4IG1Mb2NrOworICAgIFZlY3RvcjxUcmFja0luZm8+IG1UcmFja3M7CisKKyAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgRGF0YVNvdXJjZUJhc2VSZWFkZXIgKm1SZWFkZXI7CisgICAgbWt2cGFyc2VyOjpTZWdtZW50ICptU2VnbWVudDsKKyAgICBib29sIG1FeHRyYWN0ZWRUaHVtYm5haWxzOworICAgIGJvb2wgbUlzTGl2ZVN0cmVhbWluZzsKKyAgICBib29sIG1Jc1dlYm07CisgICAgaW50NjRfdCBtU2Vla1ByZVJvbGxOczsKKworICAgIHN0YXR1c190IHN5bnRoZXNpemVBVkNDKFRyYWNrSW5mbyAqdHJhY2tJbmZvLCBzaXplX3QgaW5kZXgpOworICAgIHN0YXR1c190IGluaXRUcmFja0luZm8oCisgICAgICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlRyYWNrICp0cmFjaywKKyAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgICAgIFRyYWNrSW5mbyAqdHJhY2tJbmZvKTsKKyAgICB2b2lkIGFkZFRyYWNrcygpOworICAgIHZvaWQgZmluZFRodW1ibmFpbHMoKTsKKyAgICB2b2lkIGdldENvbG9ySW5mb3JtYXRpb24oCisgICAgICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlZpZGVvVHJhY2sgKnZ0cmFjaywKKyAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSk7CisgICAgYm9vbCBpc0xpdmVTdHJlYW1pbmcoKSBjb25zdDsKKworICAgIE1hdHJvc2thRXh0cmFjdG9yKGNvbnN0IE1hdHJvc2thRXh0cmFjdG9yICYpOworICAgIE1hdHJvc2thRXh0cmFjdG9yICZvcGVyYXRvcj0oY29uc3QgTWF0cm9za2FFeHRyYWN0b3IgJik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1BVFJPU0tBX0VYVFJBQ1RPUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTk9USUNFIGIvbWVkaWEvZXh0cmFjdG9ycy9ta3YvTk9USUNFCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTk9USUNFCmNvcHkgdG8gbWVkaWEvZXh0cmFjdG9ycy9ta3YvTk9USUNFCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21rdi9leHBvcnRzLmxkcyBiL21lZGlhL2V4dHJhY3RvcnMvbWt2L2V4cG9ydHMubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMzA5ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21rdi9leHBvcnRzLmxkcwpAQCAtMCwwICsxIEBACit7IGdsb2JhbDogR0VURVhUUkFDVE9SREVGOyBsb2NhbDogKjsgfTsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYWVhY2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDcgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKworICAgIHNyY3M6IFsKKyAgICAgICAgICAgICJNUDNFeHRyYWN0b3IuY3BwIiwKKyAgICAgICAgICAgICJWQlJJU2Vla2VyLmNwcCIsCisgICAgICAgICAgICAiWElOR1NlZWtlci5jcHAiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9pZDMiLAorICAgIF0sCisKKyAgICBuYW1lOiAibGlibXAzZXh0cmFjdG9yIiwKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJleHRyYWN0b3JzIiwKKworICAgIGNvbXBpbGVfbXVsdGlsaWI6ICJmaXJzdCIsCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCisgICAgXSwKKyAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGRpYWc6IHsKKyAgICAgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9LAorCit9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wMy9NUDNFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvTVAzRXh0cmFjdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2NmZjk2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvTVAzRXh0cmFjdG9yLmNwcApAQCAtMCwwICsxLDcyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTVAzRXh0cmFjdG9yIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiTVAzRXh0cmFjdG9yLmgiCisKKyNpbmNsdWRlICJJRDMuaCIKKyNpbmNsdWRlICJWQlJJU2Vla2VyLmgiCisjaW5jbHVkZSAiWElOR1NlZWtlci5oIgorCisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9hdmNfdXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIEV2ZXJ5dGhpbmcgbXVzdCBtYXRjaCBleGNlcHQgZm9yCisvLyBwcm90ZWN0aW9uLCBiaXRyYXRlLCBwYWRkaW5nLCBwcml2YXRlIGJpdHMsIG1vZGUsIG1vZGUgZXh0ZW5zaW9uLAorLy8gY29weXJpZ2h0IGJpdCwgb3JpZ2luYWwgYml0IGFuZCBlbXBoYXNpcy4KKy8vIFllcyAuLi4gdGhlcmUgYXJlIHRoaW5ncyB0aGF0IG11c3QgaW5kZWVkIG1hdGNoLi4uCitzdGF0aWMgY29uc3QgdWludDMyX3Qga01hc2sgPSAweGZmZmUwYzAwOworCitzdGF0aWMgYm9vbCBSZXN5bmMoCisgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIHVpbnQzMl90IG1hdGNoX2hlYWRlciwKKyAgICAgICAgb2ZmNjRfdCAqaW5vdXRfcG9zLCBvZmY2NF90ICpwb3N0X2lkM19wb3MsIHVpbnQzMl90ICpvdXRfaGVhZGVyKSB7CisgICAgaWYgKHBvc3RfaWQzX3BvcyAhPSBOVUxMKSB7CisgICAgICAgICpwb3N0X2lkM19wb3MgPSAwOworICAgIH0KKworICAgIGlmICgqaW5vdXRfcG9zID09IDApIHsKKyAgICAgICAgLy8gU2tpcCBhbiBvcHRpb25hbCBJRDMgaGVhZGVyIGlmIHN5bmNpbmcgYXQgdGhlIHZlcnkgYmVnaW5uaW5nCisgICAgICAgIC8vIG9mIHRoZSBkYXRhc291cmNlLgorCisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgaWQzaGVhZGVyWzEwXTsKKyAgICAgICAgICAgIGlmIChzb3VyY2UtPnJlYWRBdCgqaW5vdXRfcG9zLCBpZDNoZWFkZXIsIHNpemVvZihpZDNoZWFkZXIpKQorICAgICAgICAgICAgICAgICAgICA8IChzc2l6ZV90KXNpemVvZihpZDNoZWFkZXIpKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgd2UgY2FuJ3QgZXZlbiByZWFkIHRoZXNlIDEwIGJ5dGVzLCB3ZSBtaWdodCBhcyB3ZWxsIGJhaWwKKyAgICAgICAgICAgICAgICAvLyBvdXQsIGV2ZW4gaWYgdGhlcmUgX3dlcmVfIDEwIGJ5dGVzIG9mIHZhbGlkIG1wMyBhdWRpbyBkYXRhLi4uCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobWVtY21wKCJJRDMiLCBpZDNoZWFkZXIsIDMpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFNraXAgdGhlIElEM3YyIGhlYWRlci4KKworICAgICAgICAgICAgc2l6ZV90IGxlbiA9CisgICAgICAgICAgICAgICAgKChpZDNoZWFkZXJbNl0gJiAweDdmKSA8PCAyMSkKKyAgICAgICAgICAgICAgICB8ICgoaWQzaGVhZGVyWzddICYgMHg3ZikgPDwgMTQpCisgICAgICAgICAgICAgICAgfCAoKGlkM2hlYWRlcls4XSAmIDB4N2YpIDw8IDcpCisgICAgICAgICAgICAgICAgfCAoaWQzaGVhZGVyWzldICYgMHg3Zik7CisKKyAgICAgICAgICAgIGxlbiArPSAxMDsKKworICAgICAgICAgICAgKmlub3V0X3BvcyArPSBsZW47CisKKyAgICAgICAgICAgIEFMT0dWKCJza2lwcGVkIElEMyB0YWcsIG5ldyBzdGFydGluZyBvZmZzZXQgaXMgJWxsZCAoMHglMDE2bGx4KSIsCisgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpKmlub3V0X3BvcywgKGxvbmcgbG9uZykqaW5vdXRfcG9zKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwb3N0X2lkM19wb3MgIT0gTlVMTCkgeworICAgICAgICAgICAgKnBvc3RfaWQzX3BvcyA9ICppbm91dF9wb3M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBvZmY2NF90IHBvcyA9ICppbm91dF9wb3M7CisgICAgYm9vbCB2YWxpZCA9IGZhbHNlOworCisgICAgY29uc3Qgc2l6ZV90IGtNYXhSZWFkQnl0ZXMgPSAxMDI0OworICAgIGNvbnN0IHNpemVfdCBrTWF4Qnl0ZXNDaGVja2VkID0gMTI4ICogMTAyNDsKKyAgICB1aW50OF90IGJ1ZltrTWF4UmVhZEJ5dGVzXTsKKyAgICBzc2l6ZV90IGJ5dGVzVG9SZWFkID0ga01heFJlYWRCeXRlczsKKyAgICBzc2l6ZV90IHRvdGFsQnl0ZXNSZWFkID0gMDsKKyAgICBzc2l6ZV90IHJlbWFpbmluZ0J5dGVzID0gMDsKKyAgICBib29sIHJlYWNoRU9TID0gZmFsc2U7CisgICAgdWludDhfdCAqdG1wID0gYnVmOworCisgICAgZG8geworICAgICAgICBpZiAocG9zID49IChvZmY2NF90KSgqaW5vdXRfcG9zICsga01heEJ5dGVzQ2hlY2tlZCkpIHsKKyAgICAgICAgICAgIC8vIERvbid0IHNjYW4gZm9yZXZlci4KKyAgICAgICAgICAgIEFMT0dWKCJnaXZpbmcgdXAgYXQgb2Zmc2V0ICVsbGQiLCAobG9uZyBsb25nKXBvcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZW1haW5pbmdCeXRlcyA8IDQpIHsKKyAgICAgICAgICAgIGlmIChyZWFjaEVPUykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoYnVmLCB0bXAsIHJlbWFpbmluZ0J5dGVzKTsKKyAgICAgICAgICAgICAgICBieXRlc1RvUmVhZCA9IGtNYXhSZWFkQnl0ZXMgLSByZW1haW5pbmdCeXRlczsKKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogVGhlIG5leHQgcmVhZCBwb3NpdGlvbiBzaG91bGQgc3RhcnQgZnJvbSB0aGUgZW5kIG9mCisgICAgICAgICAgICAgICAgICogdGhlIGxhc3QgYnVmZmVyLCBhbmQgdGh1cyBzaG91bGQgaW5jbHVkZSB0aGUgcmVtYWluaW5nCisgICAgICAgICAgICAgICAgICogYnl0ZXMgaW4gdGhlIGJ1ZmZlci4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICB0b3RhbEJ5dGVzUmVhZCA9IHNvdXJjZS0+cmVhZEF0KHBvcyArIHJlbWFpbmluZ0J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmICsgcmVtYWluaW5nQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1RvUmVhZCk7CisgICAgICAgICAgICAgICAgaWYgKHRvdGFsQnl0ZXNSZWFkIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlYWNoRU9TID0gKHRvdGFsQnl0ZXNSZWFkICE9IGJ5dGVzVG9SZWFkKTsKKyAgICAgICAgICAgICAgICB0b3RhbEJ5dGVzUmVhZCArPSByZW1haW5pbmdCeXRlczsKKyAgICAgICAgICAgICAgICByZW1haW5pbmdCeXRlcyA9IHRvdGFsQnl0ZXNSZWFkOworICAgICAgICAgICAgICAgIHRtcCA9IGJ1ZjsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHVpbnQzMl90IGhlYWRlciA9IFUzMl9BVCh0bXApOworCisgICAgICAgIGlmIChtYXRjaF9oZWFkZXIgIT0gMCAmJiAoaGVhZGVyICYga01hc2spICE9IChtYXRjaF9oZWFkZXIgJiBrTWFzaykpIHsKKyAgICAgICAgICAgICsrcG9zOworICAgICAgICAgICAgKyt0bXA7CisgICAgICAgICAgICAtLXJlbWFpbmluZ0J5dGVzOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgZnJhbWVfc2l6ZTsKKyAgICAgICAgaW50IHNhbXBsZV9yYXRlLCBudW1fY2hhbm5lbHMsIGJpdHJhdGU7CisgICAgICAgIGlmICghR2V0TVBFR0F1ZGlvRnJhbWVTaXplKAorICAgICAgICAgICAgICAgICAgICBoZWFkZXIsICZmcmFtZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAmc2FtcGxlX3JhdGUsICZudW1fY2hhbm5lbHMsICZiaXRyYXRlKSkgeworICAgICAgICAgICAgKytwb3M7CisgICAgICAgICAgICArK3RtcDsKKyAgICAgICAgICAgIC0tcmVtYWluaW5nQnl0ZXM7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCJmb3VuZCBwb3NzaWJsZSAxc3QgZnJhbWUgYXQgJWxsZCAoaGVhZGVyID0gMHglMDh4KSIsIChsb25nIGxvbmcpcG9zLCBoZWFkZXIpOworCisgICAgICAgIC8vIFdlIGZvdW5kIHdoYXQgbG9va3MgbGlrZSBhIHZhbGlkIGZyYW1lLAorICAgICAgICAvLyBub3cgZmluZCBpdHMgc3VjY2Vzc29ycy4KKworICAgICAgICBvZmY2NF90IHRlc3RfcG9zID0gcG9zICsgZnJhbWVfc2l6ZTsKKworICAgICAgICB2YWxpZCA9IHRydWU7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CisgICAgICAgICAgICB1aW50OF90IHRtcFs0XTsKKyAgICAgICAgICAgIGlmIChzb3VyY2UtPnJlYWRBdCh0ZXN0X3BvcywgdG1wLCA0KSA8IDQpIHsKKyAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50MzJfdCB0ZXN0X2hlYWRlciA9IFUzMl9BVCh0bXApOworCisgICAgICAgICAgICBBTE9HVigic3Vic2VxdWVudCBoZWFkZXIgaXMgJTA4eCIsIHRlc3RfaGVhZGVyKTsKKworICAgICAgICAgICAgaWYgKCh0ZXN0X2hlYWRlciAmIGtNYXNrKSAhPSAoaGVhZGVyICYga01hc2spKSB7CisgICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2l6ZV90IHRlc3RfZnJhbWVfc2l6ZTsKKyAgICAgICAgICAgIGlmICghR2V0TVBFR0F1ZGlvRnJhbWVTaXplKAorICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9oZWFkZXIsICZ0ZXN0X2ZyYW1lX3NpemUpKSB7CisgICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQUxPR1YoImZvdW5kIHN1YnNlcXVlbnQgZnJhbWUgIyVkIGF0ICVsbGQiLCBqICsgMiwgKGxvbmcgbG9uZyl0ZXN0X3Bvcyk7CisKKyAgICAgICAgICAgIHRlc3RfcG9zICs9IHRlc3RfZnJhbWVfc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2YWxpZCkgeworICAgICAgICAgICAgKmlub3V0X3BvcyA9IHBvczsKKworICAgICAgICAgICAgaWYgKG91dF9oZWFkZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICpvdXRfaGVhZGVyID0gaGVhZGVyOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1YoIm5vIGRpY2UsIG5vIHZhbGlkIHNlcXVlbmNlIG9mIGZyYW1lcyBmb3VuZC4iKTsKKyAgICAgICAgfQorCisgICAgICAgICsrcG9zOworICAgICAgICArK3RtcDsKKyAgICAgICAgLS1yZW1haW5pbmdCeXRlczsKKyAgICB9IHdoaWxlICghdmFsaWQpOworCisgICAgcmV0dXJuIHZhbGlkOworfQorCitjbGFzcyBNUDNTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFjayB7CitwdWJsaWM6CisgICAgTVAzU291cmNlKAorICAgICAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLCBEYXRhU291cmNlQmFzZSAqc291cmNlLAorICAgICAgICAgICAgb2ZmNjRfdCBmaXJzdF9mcmFtZV9wb3MsIHVpbnQzMl90IGZpeGVkX2hlYWRlciwKKyAgICAgICAgICAgIE1QM1NlZWtlciAqc2Vla2VyKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5NUDNTb3VyY2UoKTsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhGcmFtZVNpemU7CisgICAgTWV0YURhdGFCYXNlICZtTWV0YTsKKyAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgb2ZmNjRfdCBtRmlyc3RGcmFtZVBvczsKKyAgICB1aW50MzJfdCBtRml4ZWRIZWFkZXI7CisgICAgb2ZmNjRfdCBtQ3VycmVudFBvczsKKyAgICBpbnQ2NF90IG1DdXJyZW50VGltZVVzOworICAgIGJvb2wgbVN0YXJ0ZWQ7CisgICAgTVAzU2Vla2VyICptU2Vla2VyOworICAgIE1lZGlhQnVmZmVyR3JvdXAgKm1Hcm91cDsKKworICAgIGludDY0X3QgbUJhc2lzVGltZVVzOworICAgIGludDY0X3QgbVNhbXBsZXNSZWFkOworCisgICAgTVAzU291cmNlKGNvbnN0IE1QM1NvdXJjZSAmKTsKKyAgICBNUDNTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBNUDNTb3VyY2UgJik7Cit9OworCitzdHJ1Y3QgTXAzTWV0YSB7CisgICAgb2ZmNjRfdCBwb3M7CisgICAgb2ZmNjRfdCBwb3N0X2lkM19wb3M7CisgICAgdWludDMyX3QgaGVhZGVyOworfTsKKworTVAzRXh0cmFjdG9yOjpNUDNFeHRyYWN0b3IoCisgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIE1wM01ldGEgKm1ldGEpCisgICAgOiBtSW5pdENoZWNrKE5PX0lOSVQpLAorICAgICAgbURhdGFTb3VyY2Uoc291cmNlKSwKKyAgICAgIG1GaXJzdEZyYW1lUG9zKC0xKSwKKyAgICAgIG1GaXhlZEhlYWRlcigwKSwKKyAgICAgIG1TZWVrZXIoTlVMTCkgeworCisgICAgb2ZmNjRfdCBwb3MgPSAwOworICAgIG9mZjY0X3QgcG9zdF9pZDNfcG9zOworICAgIHVpbnQzMl90IGhlYWRlcjsKKyAgICBib29sIHN1Y2Nlc3M7CisKKyAgICBpZiAobWV0YSAhPSBOVUxMKSB7CisgICAgICAgIC8vIFRoZSBzbmlmZmVyIGhhcyBhbHJlYWR5IGRvbmUgYWxsIHRoZSBoYXJkIHdvcmsgZm9yIHVzLCBzaW1wbHkKKyAgICAgICAgLy8gYWNjZXB0IGl0cyBqdWRnZW1lbnQuCisgICAgICAgIHBvcyA9IG1ldGEtPnBvczsKKyAgICAgICAgaGVhZGVyID0gbWV0YS0+aGVhZGVyOworICAgICAgICBwb3N0X2lkM19wb3MgPSBtZXRhLT5wb3N0X2lkM19wb3M7CisgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIHN1Y2Nlc3MgPSBSZXN5bmMobURhdGFTb3VyY2UsIDAsICZwb3MsICZwb3N0X2lkM19wb3MsICZoZWFkZXIpOworICAgIH0KKworICAgIGlmICghc3VjY2VzcykgeworICAgICAgICAvLyBtSW5pdENoZWNrIHdpbGwgcmVtYWluIE5PX0lOSVQKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1GaXJzdEZyYW1lUG9zID0gcG9zOworICAgIG1GaXhlZEhlYWRlciA9IGhlYWRlcjsKKyAgICBYSU5HU2Vla2VyICpzZWVrZXIgPSBYSU5HU2Vla2VyOjpDcmVhdGVGcm9tU291cmNlKG1EYXRhU291cmNlLCBtRmlyc3RGcmFtZVBvcyk7CisKKyAgICBpZiAoc2Vla2VyID09IE5VTEwpIHsKKyAgICAgICAgbVNlZWtlciA9IFZCUklTZWVrZXI6OkNyZWF0ZUZyb21Tb3VyY2UobURhdGFTb3VyY2UsIHBvc3RfaWQzX3Bvcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVNlZWtlciA9IHNlZWtlcjsKKyAgICAgICAgaW50IGVuY2QgPSBzZWVrZXItPmdldEVuY29kZXJEZWxheSgpOworICAgICAgICBpbnQgZW5jcCA9IHNlZWtlci0+Z2V0RW5jb2RlclBhZGRpbmcoKTsKKyAgICAgICAgaWYgKGVuY2QgIT0gMCB8fCBlbmNwICE9IDApIHsKKyAgICAgICAgICAgIG1NZXRhLnNldEludDMyKGtLZXlFbmNvZGVyRGVsYXksIGVuY2QpOworICAgICAgICAgICAgbU1ldGEuc2V0SW50MzIoa0tleUVuY29kZXJQYWRkaW5nLCBlbmNwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtU2Vla2VyICE9IE5VTEwpIHsKKyAgICAgICAgLy8gV2hpbGUgaXQgaXMgc2FmZSB0byBzZW5kIHRoZSBYSU5HL1ZCUkkgZnJhbWUgdG8gdGhlIGRlY29kZXIsIHRoaXMgd2lsbAorICAgICAgICAvLyByZXN1bHQgaW4gYW4gZXh0cmEgMTE1MiBzYW1wbGVzIGJlaW5nIG91dHB1dC4gSW4gYWRkaXRpb24sIHRoZSBiaXRyYXRlCisgICAgICAgIC8vIG9mIHRoZSBYaW5nIGhlYWRlciBtaWdodCBub3QgbWF0Y2ggdGhlIHJlc3Qgb2YgdGhlIGZpbGUsIHdoaWNoIGNvdWxkCisgICAgICAgIC8vIGxlYWQgdG8gcHJvYmxlbXMgd2hlbiBzZWVraW5nLiBUaGUgcmVhbCBmaXJzdCBmcmFtZSB0byBkZWNvZGUgaXMgYWZ0ZXIKKyAgICAgICAgLy8gdGhlIFhJTkcvVkJSSSBmcmFtZSwgc28gc2tpcCB0aGVyZS4KKyAgICAgICAgc2l6ZV90IGZyYW1lX3NpemU7CisgICAgICAgIGludCBzYW1wbGVfcmF0ZTsKKyAgICAgICAgaW50IG51bV9jaGFubmVsczsKKyAgICAgICAgaW50IGJpdHJhdGU7CisgICAgICAgIEdldE1QRUdBdWRpb0ZyYW1lU2l6ZSgKKyAgICAgICAgICAgICAgICBoZWFkZXIsICZmcmFtZV9zaXplLCAmc2FtcGxlX3JhdGUsICZudW1fY2hhbm5lbHMsICZiaXRyYXRlKTsKKyAgICAgICAgcG9zICs9IGZyYW1lX3NpemU7CisgICAgICAgIGlmICghUmVzeW5jKG1EYXRhU291cmNlLCAwLCAmcG9zLCAmcG9zdF9pZDNfcG9zLCAmaGVhZGVyKSkgeworICAgICAgICAgICAgLy8gbUluaXRDaGVjayB3aWxsIHJlbWFpbiBOT19JTklUCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbUZpcnN0RnJhbWVQb3MgPSBwb3M7CisgICAgICAgIG1GaXhlZEhlYWRlciA9IGhlYWRlcjsKKyAgICB9CisKKyAgICBzaXplX3QgZnJhbWVfc2l6ZTsKKyAgICBpbnQgc2FtcGxlX3JhdGU7CisgICAgaW50IG51bV9jaGFubmVsczsKKyAgICBpbnQgYml0cmF0ZTsKKyAgICBHZXRNUEVHQXVkaW9GcmFtZVNpemUoCisgICAgICAgICAgICBoZWFkZXIsICZmcmFtZV9zaXplLCAmc2FtcGxlX3JhdGUsICZudW1fY2hhbm5lbHMsICZiaXRyYXRlKTsKKworICAgIHVuc2lnbmVkIGxheWVyID0gNCAtICgoaGVhZGVyID4+IDE3KSAmIDMpOworCisgICAgc3dpdGNoIChsYXllcikgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBtTWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR19MQVlFUl9JKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBtTWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR19MQVlFUl9JSSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgbU1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBUUkVTUEFTUygpOworICAgIH0KKworICAgIG1NZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVfcmF0ZSk7CisgICAgbU1ldGEuc2V0SW50MzIoa0tleUJpdFJhdGUsIGJpdHJhdGUgKiAxMDAwKTsKKyAgICBtTWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBudW1fY2hhbm5lbHMpOworCisgICAgaW50NjRfdCBkdXJhdGlvblVzOworCisgICAgaWYgKG1TZWVrZXIgPT0gTlVMTCB8fCAhbVNlZWtlci0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uVXMpKSB7CisgICAgICAgIG9mZjY0X3QgZmlsZVNpemU7CisgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+Z2V0U2l6ZSgmZmlsZVNpemUpID09IE9LKSB7CisgICAgICAgICAgICBvZmY2NF90IGRhdGFMZW5ndGggPSBmaWxlU2l6ZSAtIG1GaXJzdEZyYW1lUG9zOworICAgICAgICAgICAgaWYgKGRhdGFMZW5ndGggPiBJTlQ2NF9NQVggLyA4MDAwTEwpIHsKKyAgICAgICAgICAgICAgICAvLyBkdXJhdGlvbiB3b3VsZCBvdmVyZmxvdworICAgICAgICAgICAgICAgIGR1cmF0aW9uVXMgPSBJTlQ2NF9NQVg7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGR1cmF0aW9uVXMgPSA4MDAwTEwgKiBkYXRhTGVuZ3RoIC8gYml0cmF0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGR1cmF0aW9uVXMgPSAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChkdXJhdGlvblVzID49IDApIHsKKyAgICAgICAgbU1ldGEuc2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvblVzKTsKKyAgICB9CisKKyAgICBtSW5pdENoZWNrID0gT0s7CisKKyAgICAvLyBHZXQgaVR1bmVzLXN0eWxlIGdhcGxlc3MgaW5mbyBpZiBwcmVzZW50LgorICAgIC8vIFdoZW4gZ2V0dGluZyB0aGUgaWQzIHRhZywgc2tpcCB0aGUgVjEgdGFncyB0byBwcmV2ZW50IHRoZSBzb3VyY2UgY2FjaGUKKyAgICAvLyBmcm9tIGJlaW5nIGl0ZXJhdGVkIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUuCisgICAgSUQzIGlkMyhtRGF0YVNvdXJjZSwgdHJ1ZSk7CisgICAgaWYgKGlkMy5pc1ZhbGlkKCkpIHsKKyAgICAgICAgSUQzOjpJdGVyYXRvciAqY29tID0gbmV3IElEMzo6SXRlcmF0b3IoaWQzLCAiQ09NIik7CisgICAgICAgIGlmIChjb20tPmRvbmUoKSkgeworICAgICAgICAgICAgZGVsZXRlIGNvbTsKKyAgICAgICAgICAgIGNvbSA9IG5ldyBJRDM6Okl0ZXJhdG9yKGlkMywgIkNPTU0iKTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSghY29tLT5kb25lKCkpIHsKKyAgICAgICAgICAgIFN0cmluZzggY29tbWVudGRlc2M7CisgICAgICAgICAgICBTdHJpbmc4IGNvbW1lbnR2YWx1ZTsKKyAgICAgICAgICAgIGNvbS0+Z2V0U3RyaW5nKCZjb21tZW50ZGVzYywgJmNvbW1lbnR2YWx1ZSk7CisgICAgICAgICAgICBjb25zdCBjaGFyICogZGVzYyA9IGNvbW1lbnRkZXNjLnN0cmluZygpOworICAgICAgICAgICAgY29uc3QgY2hhciAqIHZhbHVlID0gY29tbWVudHZhbHVlLnN0cmluZygpOworCisgICAgICAgICAgICAvLyBmaXJzdCAzIGNoYXJhY3RlcnMgYXJlIHRoZSBsYW5ndWFnZSwgd2hpY2ggd2UgZG9uJ3QgY2FyZSBhYm91dAorICAgICAgICAgICAgaWYoc3RybGVuKGRlc2MpID4gMyAmJiBzdHJjbXAoZGVzYyArIDMsICJpVHVuU01QQiIpID09IDApIHsKKworICAgICAgICAgICAgICAgIGludDMyX3QgZGVsYXksIHBhZGRpbmc7CisgICAgICAgICAgICAgICAgaWYgKHNzY2FuZih2YWx1ZSwgIiAlKnggJXggJXggJSp4IiwgJmRlbGF5LCAmcGFkZGluZykgPT0gMikgeworICAgICAgICAgICAgICAgICAgICBtTWV0YS5zZXRJbnQzMihrS2V5RW5jb2RlckRlbGF5LCBkZWxheSk7CisgICAgICAgICAgICAgICAgICAgIG1NZXRhLnNldEludDMyKGtLZXlFbmNvZGVyUGFkZGluZywgcGFkZGluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29tLT5uZXh0KCk7CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlIGNvbTsKKyAgICAgICAgY29tID0gTlVMTDsKKyAgICB9Cit9CisKK01QM0V4dHJhY3Rvcjo6fk1QM0V4dHJhY3RvcigpIHsKKyAgICBkZWxldGUgbVNlZWtlcjsKK30KKworc2l6ZV90IE1QM0V4dHJhY3Rvcjo6Y291bnRUcmFja3MoKSB7CisgICAgcmV0dXJuIG1Jbml0Q2hlY2sgIT0gT0sgPyAwIDogMTsKK30KKworTWVkaWFUcmFjayAqTVAzRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCAhPSAwKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBuZXcgTVAzU291cmNlKAorICAgICAgICAgICAgbU1ldGEsIG1EYXRhU291cmNlLCBtRmlyc3RGcmFtZVBvcywgbUZpeGVkSGVhZGVyLAorICAgICAgICAgICAgbVNlZWtlcik7Cit9CisKK3N0YXR1c190IE1QM0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggIT0gMCkgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgbWV0YSA9IG1NZXRhOworICAgIHJldHVybiBPSzsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gVGhlIHRoZW9yZXRpY2FsIG1heGltdW0gZnJhbWUgc2l6ZSBmb3IgYW4gTVBFRyBhdWRpbyBzdHJlYW0gc2hvdWxkIG9jY3VyCisvLyB3aGlsZSBwbGF5aW5nIGEgTGF5ZXIgMiwgTVBFR3YyLjUgYXVkaW8gc3RyZWFtIGF0IDE2MGticHMgKHdpdGggcGFkZGluZykuCisvLyBUaGUgc2l6ZSBvZiB0aGlzIGZyYW1lIHNob3VsZCBiZS4uLgorLy8gKCgxMTUyIHNhbXBsZXMvZnJhbWUgKiAxNjAwMDAgYml0cy9zZWMpIC8KKy8vICAoODAwMCBzYW1wbGVzL3NlYyAqIDggYml0cy9ieXRlKSkgKyAxIHBhZGRpbmcgYnl0ZS9mcmFtZSA9IDI4ODEgYnl0ZXMvZnJhbWUuCisvLyBTZXQgb3VyIG1heCBmcmFtZSBzaXplIHRvIHRoZSBuZWFyZXN0IHBvd2VyIG9mIDIgYWJvdmUgdGhpcyBzaXplIChha2EsIDRrQikKK2NvbnN0IHNpemVfdCBNUDNTb3VyY2U6OmtNYXhGcmFtZVNpemUgPSAoMSA8PCAxMik7IC8qIDQwOTYgYnl0ZXMgKi8KK01QM1NvdXJjZTo6TVAzU291cmNlKAorICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCisgICAgICAgIG9mZjY0X3QgZmlyc3RfZnJhbWVfcG9zLCB1aW50MzJfdCBmaXhlZF9oZWFkZXIsCisgICAgICAgIE1QM1NlZWtlciAqc2Vla2VyKQorICAgIDogbU1ldGEobWV0YSksCisgICAgICBtRGF0YVNvdXJjZShzb3VyY2UpLAorICAgICAgbUZpcnN0RnJhbWVQb3MoZmlyc3RfZnJhbWVfcG9zKSwKKyAgICAgIG1GaXhlZEhlYWRlcihmaXhlZF9oZWFkZXIpLAorICAgICAgbUN1cnJlbnRQb3MoMCksCisgICAgICBtQ3VycmVudFRpbWVVcygwKSwKKyAgICAgIG1TdGFydGVkKGZhbHNlKSwKKyAgICAgIG1TZWVrZXIoc2Vla2VyKSwKKyAgICAgIG1Hcm91cChOVUxMKSwKKyAgICAgIG1CYXNpc1RpbWVVcygwKSwKKyAgICAgIG1TYW1wbGVzUmVhZCgwKSB7Cit9CisKK01QM1NvdXJjZTo6fk1QM1NvdXJjZSgpIHsKKyAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgc3RvcCgpOworICAgIH0KK30KKworc3RhdHVzX3QgTVAzU291cmNlOjpzdGFydChNZXRhRGF0YUJhc2UgKikgeworICAgIENIRUNLKCFtU3RhcnRlZCk7CisKKyAgICBtR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cDsKKworICAgIG1Hcm91cC0+YWRkX2J1ZmZlcihNZWRpYUJ1ZmZlckJhc2U6OkNyZWF0ZShrTWF4RnJhbWVTaXplKSk7CisKKyAgICBtQ3VycmVudFBvcyA9IG1GaXJzdEZyYW1lUG9zOworICAgIG1DdXJyZW50VGltZVVzID0gMDsKKworICAgIG1CYXNpc1RpbWVVcyA9IG1DdXJyZW50VGltZVVzOworICAgIG1TYW1wbGVzUmVhZCA9IDA7CisKKyAgICBtU3RhcnRlZCA9IHRydWU7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1QM1NvdXJjZTo6c3RvcCgpIHsKKyAgICBDSEVDSyhtU3RhcnRlZCk7CisKKyAgICBkZWxldGUgbUdyb3VwOworICAgIG1Hcm91cCA9IE5VTEw7CisKKyAgICBtU3RhcnRlZCA9IGZhbHNlOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNUDNTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKKyAgICBtZXRhID0gbU1ldGE7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNUDNTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKyAgICAqb3V0ID0gTlVMTDsKKworICAgIGludDY0X3Qgc2Vla1RpbWVVczsKKyAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKKyAgICBib29sIHNlZWtDQlIgPSBmYWxzZTsKKworICAgIGlmIChvcHRpb25zICE9IE5VTEwgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKKyAgICAgICAgaW50NjRfdCBhY3R1YWxTZWVrVGltZVVzID0gc2Vla1RpbWVVczsKKyAgICAgICAgaWYgKG1TZWVrZXIgPT0gTlVMTAorICAgICAgICAgICAgICAgIHx8ICFtU2Vla2VyLT5nZXRPZmZzZXRGb3JUaW1lKCZhY3R1YWxTZWVrVGltZVVzLCAmbUN1cnJlbnRQb3MpKSB7CisgICAgICAgICAgICBpbnQzMl90IGJpdHJhdGU7CisgICAgICAgICAgICBpZiAoIW1NZXRhLmZpbmRJbnQzMihrS2V5Qml0UmF0ZSwgJmJpdHJhdGUpKSB7CisgICAgICAgICAgICAgICAgLy8gYml0cmF0ZSBpcyBpbiBiaXRzL3NlYy4KKyAgICAgICAgICAgICAgICBBTE9HSSgibm8gYml0cmF0ZSIpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtQ3VycmVudFRpbWVVcyA9IHNlZWtUaW1lVXM7CisgICAgICAgICAgICBtQ3VycmVudFBvcyA9IG1GaXJzdEZyYW1lUG9zICsgc2Vla1RpbWVVcyAqIGJpdHJhdGUgLyA4MDAwMDAwOworICAgICAgICAgICAgc2Vla0NCUiA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQ3VycmVudFRpbWVVcyA9IGFjdHVhbFNlZWtUaW1lVXM7CisgICAgICAgIH0KKworICAgICAgICBtQmFzaXNUaW1lVXMgPSBtQ3VycmVudFRpbWVVczsKKyAgICAgICAgbVNhbXBsZXNSZWFkID0gMDsKKyAgICB9CisKKyAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcjsKKyAgICBzdGF0dXNfdCBlcnIgPSBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBzaXplX3QgZnJhbWVfc2l6ZTsKKyAgICBpbnQgYml0cmF0ZTsKKyAgICBpbnQgbnVtX3NhbXBsZXM7CisgICAgaW50IHNhbXBsZV9yYXRlOworICAgIGZvciAoOzspIHsKKyAgICAgICAgc3NpemVfdCBuID0gbURhdGFTb3VyY2UtPnJlYWRBdChtQ3VycmVudFBvcywgYnVmZmVyLT5kYXRhKCksIDQpOworICAgICAgICBpZiAobiA8IDQpIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKKworICAgICAgICAgICAgcmV0dXJuIChuIDwgMCA/IG4gOiBFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQzMl90IGhlYWRlciA9IFUzMl9BVCgoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpKTsKKworICAgICAgICBpZiAoKGhlYWRlciAmIGtNYXNrKSA9PSAobUZpeGVkSGVhZGVyICYga01hc2spCisgICAgICAgICAgICAmJiBHZXRNUEVHQXVkaW9GcmFtZVNpemUoCisgICAgICAgICAgICAgICAgaGVhZGVyLCAmZnJhbWVfc2l6ZSwgJnNhbXBsZV9yYXRlLCBOVUxMLAorICAgICAgICAgICAgICAgICZiaXRyYXRlLCAmbnVtX3NhbXBsZXMpKSB7CisKKyAgICAgICAgICAgIC8vIHJlLWNhbGN1bGF0ZSBtQ3VycmVudFRpbWVVcyBiZWNhdXNlIHdlIG1pZ2h0IGhhdmUgY2FsbGVkIFJlc3luYygpCisgICAgICAgICAgICBpZiAoc2Vla0NCUikgeworICAgICAgICAgICAgICAgIG1DdXJyZW50VGltZVVzID0gKG1DdXJyZW50UG9zIC0gbUZpcnN0RnJhbWVQb3MpICogODAwMCAvIGJpdHJhdGU7CisgICAgICAgICAgICAgICAgbUJhc2lzVGltZVVzID0gbUN1cnJlbnRUaW1lVXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gTG9zdCBzeW5jLgorICAgICAgICBBTE9HVigibG9zdCBzeW5jISBoZWFkZXIgPSAweCUwOHgsIG9sZCBoZWFkZXIgPSAweCUwOHhcbiIsIGhlYWRlciwgbUZpeGVkSGVhZGVyKTsKKworICAgICAgICBvZmY2NF90IHBvcyA9IG1DdXJyZW50UG9zOworICAgICAgICBpZiAoIVJlc3luYyhtRGF0YVNvdXJjZSwgbUZpeGVkSGVhZGVyLCAmcG9zLCBOVUxMLCBOVUxMKSkgeworICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byByZXN5bmMuIFNpZ25hbGxpbmcgZW5kIG9mIHN0cmVhbS4iKTsKKworICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBidWZmZXIgPSBOVUxMOworCisgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgfQorCisgICAgICAgIG1DdXJyZW50UG9zID0gcG9zOworCisgICAgICAgIC8vIFRyeSBhZ2FpbiB3aXRoIHRoZSBuZXcgcG9zaXRpb24uCisgICAgfQorCisgICAgQ0hFQ0soZnJhbWVfc2l6ZSA8PSBidWZmZXItPnNpemUoKSk7CisKKyAgICBzc2l6ZV90IG4gPSBtRGF0YVNvdXJjZS0+cmVhZEF0KG1DdXJyZW50UG9zLCBidWZmZXItPmRhdGEoKSwgZnJhbWVfc2l6ZSk7CisgICAgaWYgKG4gPCAoc3NpemVfdClmcmFtZV9zaXplKSB7CisgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICBidWZmZXIgPSBOVUxMOworCisgICAgICAgIHJldHVybiAobiA8IDAgPyBuIDogRVJST1JfRU5EX09GX1NUUkVBTSk7CisgICAgfQorCisgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgZnJhbWVfc2l6ZSk7CisKKyAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCBtQ3VycmVudFRpbWVVcyk7CisgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworCisgICAgbUN1cnJlbnRQb3MgKz0gZnJhbWVfc2l6ZTsKKworICAgIG1TYW1wbGVzUmVhZCArPSBudW1fc2FtcGxlczsKKyAgICBtQ3VycmVudFRpbWVVcyA9IG1CYXNpc1RpbWVVcyArICgobVNhbXBsZXNSZWFkICogMTAwMDAwMCkgLyBzYW1wbGVfcmF0ZSk7CisKKyAgICAqb3V0ID0gYnVmZmVyOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNUDNFeHRyYWN0b3I6OmdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkgeworICAgIG1ldGEuY2xlYXIoKTsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgImF1ZGlvL21wZWciKTsKKworICAgIElEMyBpZDMobURhdGFTb3VyY2UpOworCisgICAgaWYgKCFpZDMuaXNWYWxpZCgpKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzdHJ1Y3QgTWFwIHsKKyAgICAgICAgaW50IGtleTsKKyAgICAgICAgY29uc3QgY2hhciAqdGFnMTsKKyAgICAgICAgY29uc3QgY2hhciAqdGFnMjsKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBNYXAga01hcFtdID0geworICAgICAgICB7IGtLZXlBbGJ1bSwgIlRBTEIiLCAiVEFMIiB9LAorICAgICAgICB7IGtLZXlBcnRpc3QsICJUUEUxIiwgIlRQMSIgfSwKKyAgICAgICAgeyBrS2V5QWxidW1BcnRpc3QsICJUUEUyIiwgIlRQMiIgfSwKKyAgICAgICAgeyBrS2V5Q29tcG9zZXIsICJUQ09NIiwgIlRDTSIgfSwKKyAgICAgICAgeyBrS2V5R2VucmUsICJUQ09OIiwgIlRDTyIgfSwKKyAgICAgICAgeyBrS2V5VGl0bGUsICJUSVQyIiwgIlRUMiIgfSwKKyAgICAgICAgeyBrS2V5WWVhciwgIlRZRSIsICJUWUVSIiB9LAorICAgICAgICB7IGtLZXlBdXRob3IsICJUWFQiLCAiVEVYVCIgfSwKKyAgICAgICAgeyBrS2V5Q0RUcmFja051bWJlciwgIlRSSyIsICJUUkNLIiB9LAorICAgICAgICB7IGtLZXlEaXNjTnVtYmVyLCAiVFBBIiwgIlRQT1MiIH0sCisgICAgICAgIHsga0tleUNvbXBpbGF0aW9uLCAiVENQIiwgIlRDTVAiIH0sCisgICAgfTsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtOdW1NYXBFbnRyaWVzID0gc2l6ZW9mKGtNYXApIC8gc2l6ZW9mKGtNYXBbMF0pOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTnVtTWFwRW50cmllczsgKytpKSB7CisgICAgICAgIElEMzo6SXRlcmF0b3IgKml0ID0gbmV3IElEMzo6SXRlcmF0b3IoaWQzLCBrTWFwW2ldLnRhZzEpOworICAgICAgICBpZiAoaXQtPmRvbmUoKSkgeworICAgICAgICAgICAgZGVsZXRlIGl0OworICAgICAgICAgICAgaXQgPSBuZXcgSUQzOjpJdGVyYXRvcihpZDMsIGtNYXBbaV0udGFnMik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXQtPmRvbmUoKSkgeworICAgICAgICAgICAgZGVsZXRlIGl0OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmc4IHM7CisgICAgICAgIGl0LT5nZXRTdHJpbmcoJnMpOworICAgICAgICBkZWxldGUgaXQ7CisKKyAgICAgICAgbWV0YS5zZXRDU3RyaW5nKGtNYXBbaV0ua2V5LCBzKTsKKyAgICB9CisKKyAgICBzaXplX3QgZGF0YVNpemU7CisgICAgU3RyaW5nOCBtaW1lOworICAgIGNvbnN0IHZvaWQgKmRhdGEgPSBpZDMuZ2V0QWxidW1BcnQoJmRhdGFTaXplLCAmbWltZSk7CisKKyAgICBpZiAoZGF0YSkgeworICAgICAgICBtZXRhLnNldERhdGEoa0tleUFsYnVtQXJ0LCBNZXRhRGF0YTo6VFlQRV9OT05FLCBkYXRhLCBkYXRhU2l6ZSk7CisgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5QWxidW1BcnRNSU1FLCBtaW1lLnN0cmluZygpKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXRpYyBNZWRpYUV4dHJhY3RvciogQ3JlYXRlRXh0cmFjdG9yKAorICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorICAgICAgICB2b2lkICptZXRhKSB7CisgICAgTXAzTWV0YSAqbWV0YURhdGEgPSBzdGF0aWNfY2FzdDxNcDNNZXRhICo+KG1ldGEpOworICAgIHJldHVybiBuZXcgTVAzRXh0cmFjdG9yKHNvdXJjZSwgbWV0YURhdGEpOworfQorCitzdGF0aWMgTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIFNuaWZmKAorICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSwgdm9pZCAqKm1ldGEsCisgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKmZyZWVNZXRhKSB7CisgICAgb2ZmNjRfdCBwb3MgPSAwOworICAgIG9mZjY0X3QgcG9zdF9pZDNfcG9zOworICAgIHVpbnQzMl90IGhlYWRlcjsKKyAgICB1aW50OF90IG1wZWdfaGVhZGVyWzVdOworICAgIGlmIChzb3VyY2UtPnJlYWRBdCgwLCBtcGVnX2hlYWRlciwgc2l6ZW9mKG1wZWdfaGVhZGVyKSkgPCAoc3NpemVfdClzaXplb2YobXBlZ19oZWFkZXIpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmICghbWVtY21wKCJceDAwXHgwMFx4MDFceGJhIiwgbXBlZ19oZWFkZXIsIDQpICYmIChtcGVnX2hlYWRlcls0XSA+PiA0KSA9PSAyKSB7CisgICAgICAgIEFMT0dWKCJNUEVHMVBTIGNvbnRhaW5lciBpcyBub3Qgc3VwcG9ydGVkISIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKCFSZXN5bmMoc291cmNlLCAwLCAmcG9zLCAmcG9zdF9pZDNfcG9zLCAmaGVhZGVyKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBNcDNNZXRhICptcDNNZXRhID0gbmV3IE1wM01ldGE7CisgICAgbXAzTWV0YS0+cG9zID0gcG9zOworICAgIG1wM01ldGEtPmhlYWRlciA9IGhlYWRlcjsKKyAgICBtcDNNZXRhLT5wb3N0X2lkM19wb3MgPSBwb3N0X2lkM19wb3M7CisgICAgKm1ldGEgPSBtcDNNZXRhOworICAgICpmcmVlTWV0YSA9IDo6ZnJlZTsKKworICAgICpjb25maWRlbmNlID0gMC4yZjsKKworICAgIHJldHVybiBDcmVhdGVFeHRyYWN0b3I7Cit9CisKK2V4dGVybiAiQyIgeworLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAorX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQorTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CisgICAgcmV0dXJuIHsKKyAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkVYVFJBQ1RPUkRFRl9WRVJTSU9OLAorICAgICAgICBVVUlEKCI4MTJhM2Y2Yy1jOGNmLTQ2ZGUtYjUyOS0zNzc0YjE0MTAzZDQiKSwKKyAgICAgICAgMSwgLy8gdmVyc2lvbgorICAgICAgICAiTVAzIEV4dHJhY3RvciIsCisgICAgICAgIFNuaWZmCisgICAgfTsKK30KKworfSAvLyBleHRlcm4gIkMiCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wMy9NUDNFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL01QM0V4dHJhY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NWIwY2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9NUDNFeHRyYWN0b3IuaApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNUDNfRVhUUkFDVE9SX0hfCisKKyNkZWZpbmUgTVAzX0VYVFJBQ1RPUl9IXworCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQU1lc3NhZ2U7CitjbGFzcyBEYXRhU291cmNlQmFzZTsKK3N0cnVjdCBNUDNTZWVrZXI7CitjbGFzcyBTdHJpbmc4Oworc3RydWN0IE1wM01ldGE7CisKK2NsYXNzIE1QM0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7CitwdWJsaWM6CisgICAgTVAzRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIE1wM01ldGEgKm1ldGEpOworICAgIH5NUDNFeHRyYWN0b3IoKTsKKworICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOworICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiTVAzRXh0cmFjdG9yIjsgfQorCitwcml2YXRlOgorICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CisKKyAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgb2ZmNjRfdCBtRmlyc3RGcmFtZVBvczsKKyAgICBNZXRhRGF0YUJhc2UgbU1ldGE7CisgICAgdWludDMyX3QgbUZpeGVkSGVhZGVyOworICAgIE1QM1NlZWtlciAqbVNlZWtlcjsKKworICAgIE1QM0V4dHJhY3Rvcihjb25zdCBNUDNFeHRyYWN0b3IgJik7CisgICAgTVAzRXh0cmFjdG9yICZvcGVyYXRvcj0oY29uc3QgTVAzRXh0cmFjdG9yICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNUDNfRVhUUkFDVE9SX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wMy9NUDNTZWVrZXIuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL01QM1NlZWtlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlM2FmMjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9NUDNTZWVrZXIuaApAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNUDNfU0VFS0VSX0hfCisKKyNkZWZpbmUgTVAzX1NFRUtFUl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgTVAzU2Vla2VyIHsKKyAgICBNUDNTZWVrZXIoKSB7fQorCisgICAgdmlydHVhbCBib29sIGdldER1cmF0aW9uKGludDY0X3QgKmR1cmF0aW9uVXMpID0gMDsKKworICAgIC8vIEdpdmVuIGEgcmVxdWVzdCBzZWVrIHRpbWUgaW4gIip0aW1lVXMiLCBmaW5kIHRoZSBieXRlIG9mZnNldCBjbG9zZXN0CisgICAgLy8gdG8gdGhhdCBwb3NpdGlvbiBhbmQgcmV0dXJuIGl0IGluICIqcG9zIi4gVXBkYXRlICIqdGltZVVzIiB0byByZWZsZWN0CisgICAgLy8gdGhlIGFjdHVhbCB0aW1lIHRoYXQgc2Vla3BvaW50IHJlcHJlc2VudHMuCisgICAgdmlydHVhbCBib29sIGdldE9mZnNldEZvclRpbWUoaW50NjRfdCAqdGltZVVzLCBvZmY2NF90ICpwb3MpID0gMDsKKworICAgIHZpcnR1YWwgfk1QM1NlZWtlcigpIHt9CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTVAzU2Vla2VyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTVAzX1NFRUtFUl9IXworCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wMy9WQlJJU2Vla2VyLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL1ZCUklTZWVrZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyM2YxNGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9WQlJJU2Vla2VyLmNwcApAQCAtMCwwICsxLDE4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiVkJSSVNlZWtlciIKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIlZCUklTZWVrZXIuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYXZjX3V0aWxzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgdWludDMyX3QgVTI0X0FUKGNvbnN0IHVpbnQ4X3QgKnB0cikgeworICAgIHJldHVybiBwdHJbMF0gPDwgMTYgfCBwdHJbMV0gPDwgOCB8IHB0clsyXTsKK30KKworLy8gc3RhdGljCitWQlJJU2Vla2VyICpWQlJJU2Vla2VyOjpDcmVhdGVGcm9tU291cmNlKAorICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBvZmY2NF90IHBvc3RfaWQzX3BvcykgeworICAgIG9mZjY0X3QgcG9zID0gcG9zdF9pZDNfcG9zOworCisgICAgdWludDhfdCBoZWFkZXJbNF07CisgICAgc3NpemVfdCBuID0gc291cmNlLT5yZWFkQXQocG9zLCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKTsKKyAgICBpZiAobiA8IChzc2l6ZV90KXNpemVvZihoZWFkZXIpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHVpbnQzMl90IHRtcCA9IFUzMl9BVCgmaGVhZGVyWzBdKTsKKyAgICBzaXplX3QgZnJhbWVTaXplOworICAgIGludCBzYW1wbGVSYXRlOworICAgIGlmICghR2V0TVBFR0F1ZGlvRnJhbWVTaXplKHRtcCwgJmZyYW1lU2l6ZSwgJnNhbXBsZVJhdGUpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8vIFZCUkkgaGVhZGVyIGZvbGxvd3MgMzIgYnl0ZXMgYWZ0ZXIgdGhlIGhlYWRlciBfZW5kc18uCisgICAgcG9zICs9IHNpemVvZihoZWFkZXIpICsgMzI7CisKKyAgICB1aW50OF90IHZicmlIZWFkZXJbMjZdOworICAgIG4gPSBzb3VyY2UtPnJlYWRBdChwb3MsIHZicmlIZWFkZXIsIHNpemVvZih2YnJpSGVhZGVyKSk7CisgICAgaWYgKG4gPCAoc3NpemVfdClzaXplb2YodmJyaUhlYWRlcikpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKG1lbWNtcCh2YnJpSGVhZGVyLCAiVkJSSSIsIDQpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNpemVfdCBudW1GcmFtZXMgPSBVMzJfQVQoJnZicmlIZWFkZXJbMTRdKTsKKworICAgIGludDY0X3QgZHVyYXRpb25VcyA9CisgICAgICAgIG51bUZyYW1lcyAqIDEwMDAwMDBsbCAqIChzYW1wbGVSYXRlID49IDMyMDAwID8gMTE1MiA6IDU3NikgLyBzYW1wbGVSYXRlOworCisgICAgQUxPR1YoImR1cmF0aW9uID0gJS4yZiBzZWNzIiwgZHVyYXRpb25VcyAvIDFFNik7CisKKyAgICBzaXplX3QgbnVtRW50cmllcyA9IFUxNl9BVCgmdmJyaUhlYWRlclsxOF0pOworICAgIHNpemVfdCBlbnRyeVNpemUgPSBVMTZfQVQoJnZicmlIZWFkZXJbMjJdKTsKKyAgICBzaXplX3Qgc2NhbGUgPSBVMTZfQVQoJnZicmlIZWFkZXJbMjBdKTsKKworICAgIEFMT0dWKCIlenUgZW50cmllcywgc2NhbGU9JXp1LCBzaXplX3Blcl9lbnRyeT0lenUiLAorICAgICAgICAgbnVtRW50cmllcywKKyAgICAgICAgIHNjYWxlLAorICAgICAgICAgZW50cnlTaXplKTsKKworICAgIGlmIChlbnRyeVNpemUgPiA0KSB7CisgICAgICAgIEFMT0dFKCJpbnZhbGlkIFZCUkkgZW50cnkgc2l6ZTogJXp1IiwgZW50cnlTaXplKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgVkJSSVNlZWtlciAqc2Vla2VyID0gbmV3IChzdGQ6Om5vdGhyb3cpIFZCUklTZWVrZXI7CisgICAgaWYgKHNlZWtlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCJDb3VsZG4ndCBhbGxvY2F0ZSBWQlJJU2Vla2VyIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNpemVfdCB0b3RhbEVudHJ5U2l6ZSA9IG51bUVudHJpZXMgKiBlbnRyeVNpemU7CisgICAgdWludDhfdCAqYnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQ4X3RbdG90YWxFbnRyeVNpemVdOworICAgIGlmICghYnVmZmVyKSB7CisgICAgICAgIEFMT0dXKCJDb3VsZG4ndCBhbGxvY2F0ZSAlenUgYnl0ZXMiLCB0b3RhbEVudHJ5U2l6ZSk7CisgICAgICAgIGRlbGV0ZSBzZWVrZXI7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIG4gPSBzb3VyY2UtPnJlYWRBdChwb3MgKyBzaXplb2YodmJyaUhlYWRlciksIGJ1ZmZlciwgdG90YWxFbnRyeVNpemUpOworICAgIGlmIChuIDwgKHNzaXplX3QpdG90YWxFbnRyeVNpemUpIHsKKyAgICAgICAgZGVsZXRlW10gYnVmZmVyOworICAgICAgICBidWZmZXIgPSBOVUxMOworICAgICAgICBkZWxldGUgc2Vla2VyOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzZWVrZXItPm1CYXNlUG9zID0gcG9zdF9pZDNfcG9zICsgZnJhbWVTaXplOworICAgIC8vIG9ubHkgdXBkYXRlIG1EdXJhdGlvblVzIGlmIHRoZSBjYWxjdWxhdGVkIGR1cmF0aW9uIGlzIHZhbGlkIChub24gemVybykKKyAgICAvLyBvdGhlcndpc2UsIGxlYXZlIGR1cmF0aW9uIGF0IC0xIHNvIHRoYXQgZ2V0RHVyYXRpb24oKSBhbmQgZ2V0T2Zmc2V0Rm9yVGltZSgpCisgICAgLy8gcmV0dXJuIGZhbHNlIHdoZW4gY2FsbGVkLCB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgdmJyaSB0YWcgZG9lcyBub3QgaGF2ZSB0aGUKKyAgICAvLyByZXF1ZXN0ZWQgaW5mb3JtYXRpb24KKyAgICBpZiAoZHVyYXRpb25VcykgeworICAgICAgICBzZWVrZXItPm1EdXJhdGlvblVzID0gZHVyYXRpb25VczsKKyAgICB9CisKKyAgICBvZmY2NF90IG9mZnNldCA9IHBvc3RfaWQzX3BvczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUVudHJpZXM7ICsraSkgeworICAgICAgICB1aW50MzJfdCBudW1CeXRlczsKKyAgICAgICAgc3dpdGNoIChlbnRyeVNpemUpIHsKKyAgICAgICAgICAgIGNhc2UgMTogbnVtQnl0ZXMgPSBidWZmZXJbaV07IGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOiBudW1CeXRlcyA9IFUxNl9BVChidWZmZXIgKyAyICogaSk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOiBudW1CeXRlcyA9IFUyNF9BVChidWZmZXIgKyAzICogaSk7IGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDSEVDS19FUShlbnRyeVNpemUsIDR1KTsKKyAgICAgICAgICAgICAgICBudW1CeXRlcyA9IFUzMl9BVChidWZmZXIgKyA0ICogaSk7IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbnVtQnl0ZXMgKj0gc2NhbGU7CisKKyAgICAgICAgc2Vla2VyLT5tU2VnbWVudHMucHVzaChudW1CeXRlcyk7CisKKyAgICAgICAgQUxPR1YoImVudHJ5ICMlenU6ICV1IG9mZnNldCAlIzAxNmxseCIsIGksIG51bUJ5dGVzLCAobG9uZyBsb25nKW9mZnNldCk7CisgICAgICAgIG9mZnNldCArPSBudW1CeXRlczsKKyAgICB9CisKKyAgICBkZWxldGVbXSBidWZmZXI7CisgICAgYnVmZmVyID0gTlVMTDsKKworICAgIEFMT0dJKCJGb3VuZCBWQlJJIGhlYWRlci4iKTsKKworICAgIHJldHVybiBzZWVrZXI7Cit9CisKK1ZCUklTZWVrZXI6OlZCUklTZWVrZXIoKQorICAgIDogbUR1cmF0aW9uVXMoLTEpIHsKK30KKworYm9vbCBWQlJJU2Vla2VyOjpnZXREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzKSB7CisgICAgaWYgKG1EdXJhdGlvblVzIDwgMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgKmR1cmF0aW9uVXMgPSBtRHVyYXRpb25VczsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFZCUklTZWVrZXI6OmdldE9mZnNldEZvclRpbWUoaW50NjRfdCAqdGltZVVzLCBvZmY2NF90ICpwb3MpIHsKKyAgICBpZiAobUR1cmF0aW9uVXMgPCAwIHx8IG1TZWdtZW50cy5zaXplKCkgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50NjRfdCBzZWdtZW50RHVyYXRpb25VcyA9IG1EdXJhdGlvblVzIC8gbVNlZ21lbnRzLnNpemUoKTsKKworICAgIGludDY0X3Qgbm93VXMgPSAwOworICAgICpwb3MgPSBtQmFzZVBvczsKKyAgICBzaXplX3Qgc2VnbWVudEluZGV4ID0gMDsKKyAgICB3aGlsZSAoc2VnbWVudEluZGV4IDwgbVNlZ21lbnRzLnNpemUoKSAmJiBub3dVcyA8ICp0aW1lVXMpIHsKKyAgICAgICAgbm93VXMgKz0gc2VnbWVudER1cmF0aW9uVXM7CisgICAgICAgICpwb3MgKz0gbVNlZ21lbnRzLml0ZW1BdChzZWdtZW50SW5kZXgrKyk7CisgICAgfQorCisgICAgQUxPR1YoImdldE9mZnNldEZvclRpbWUgJWxsZCB1cyA9PiAweCUwMTZsbHgiLCAobG9uZyBsb25nKSp0aW1lVXMsIChsb25nIGxvbmcpKnBvcyk7CisKKyAgICAqdGltZVVzID0gbm93VXM7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvVkJSSVNlZWtlci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvVkJSSVNlZWtlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMTNmNmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9WQlJJU2Vla2VyLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVkJSSV9TRUVLRVJfSF8KKworI2RlZmluZSBWQlJJX1NFRUtFUl9IXworCisjaW5jbHVkZSAiTVAzU2Vla2VyLmgiCisKKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBEYXRhU291cmNlQmFzZTsKKworc3RydWN0IFZCUklTZWVrZXIgOiBwdWJsaWMgTVAzU2Vla2VyIHsKKyAgICBzdGF0aWMgVkJSSVNlZWtlciAqQ3JlYXRlRnJvbVNvdXJjZSgKKyAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIG9mZjY0X3QgcG9zdF9pZDNfcG9zKTsKKworICAgIHZpcnR1YWwgYm9vbCBnZXREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzKTsKKyAgICB2aXJ0dWFsIGJvb2wgZ2V0T2Zmc2V0Rm9yVGltZShpbnQ2NF90ICp0aW1lVXMsIG9mZjY0X3QgKnBvcyk7CisKK3ByaXZhdGU6CisgICAgb2ZmNjRfdCBtQmFzZVBvczsKKyAgICBpbnQ2NF90IG1EdXJhdGlvblVzOworICAgIFZlY3Rvcjx1aW50MzJfdD4gbVNlZ21lbnRzOworCisgICAgVkJSSVNlZWtlcigpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVkJSSVNlZWtlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFZCUklfU0VFS0VSX0hfCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvWElOR1NlZWtlci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9YSU5HU2Vla2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWNhNTU2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvWElOR1NlZWtlci5jcHAKQEAgLTAsMCArMSwyMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlhJTkdTRUVLRVIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJYSU5HU2Vla2VyLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9hdmNfdXRpbHMuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitYSU5HU2Vla2VyOjpYSU5HU2Vla2VyKCkKKyAgICA6IG1EdXJhdGlvblVzKC0xKSwKKyAgICAgIG1TaXplQnl0ZXMoMCksCisgICAgICBtRW5jb2RlckRlbGF5KDApLAorICAgICAgbUVuY29kZXJQYWRkaW5nKDApLAorICAgICAgbVRPQ1ZhbGlkKGZhbHNlKSB7Cit9CisKK2Jvb2wgWElOR1NlZWtlcjo6Z2V0RHVyYXRpb24oaW50NjRfdCAqZHVyYXRpb25VcykgeworICAgIGlmIChtRHVyYXRpb25VcyA8IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgICpkdXJhdGlvblVzID0gbUR1cmF0aW9uVXM7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBYSU5HU2Vla2VyOjpnZXRPZmZzZXRGb3JUaW1lKGludDY0X3QgKnRpbWVVcywgb2ZmNjRfdCAqcG9zKSB7CisgICAgaWYgKG1TaXplQnl0ZXMgPT0gMCB8fCAhbVRPQ1ZhbGlkIHx8IG1EdXJhdGlvblVzIDwgMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZmxvYXQgcGVyY2VudCA9IChmbG9hdCkoKnRpbWVVcykgKiAxMDAgLyBtRHVyYXRpb25VczsKKyAgICBmbG9hdCBmeDsKKyAgICBpZiggcGVyY2VudCA8PSAwLjBmICkgeworICAgICAgICBmeCA9IDAuMGY7CisgICAgfSBlbHNlIGlmKCBwZXJjZW50ID49IDEwMC4wZiApIHsKKyAgICAgICAgZnggPSAyNTYuMGY7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGEgPSAoaW50KXBlcmNlbnQ7CisgICAgICAgIGZsb2F0IGZhLCBmYjsKKyAgICAgICAgaWYgKCBhID09IDAgKSB7CisgICAgICAgICAgICBmYSA9IDAuMGY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmYSA9IChmbG9hdCltVE9DW2EtMV07CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBhIDwgOTkgKSB7CisgICAgICAgICAgICBmYiA9IChmbG9hdCltVE9DW2FdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmIgPSAyNTYuMGY7CisgICAgICAgIH0KKyAgICAgICAgZnggPSBmYSArIChmYi1mYSkqKHBlcmNlbnQtYSk7CisgICAgfQorCisgICAgKnBvcyA9IChpbnQpKCgxLjBmLzI1Ni4wZikqZngqbVNpemVCeXRlcykgKyBtRmlyc3RGcmFtZVBvczsKKworICAgIHJldHVybiB0cnVlOworfQorCisvLyBzdGF0aWMKK1hJTkdTZWVrZXIgKlhJTkdTZWVrZXI6OkNyZWF0ZUZyb21Tb3VyY2UoCisgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIG9mZjY0X3QgZmlyc3RfZnJhbWVfcG9zKSB7CisKKyAgICB1aW50OF90IGJ1ZmZlcls0XTsKKyAgICBpbnQgb2Zmc2V0ID0gZmlyc3RfZnJhbWVfcG9zOworICAgIGlmIChzb3VyY2UtPnJlYWRBdChvZmZzZXQsICZidWZmZXIsIDQpIDwgNCkgeyAvLyBnZXQgaGVhZGVyCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBvZmZzZXQgKz0gNDsKKworICAgIGludCBoZWFkZXIgPSBVMzJfQVQoYnVmZmVyKTs7CisgICAgc2l6ZV90IHhpbmdmcmFtZXNpemUgPSAwOworICAgIGludCBzYW1wbGluZ19yYXRlID0gMDsKKyAgICBpbnQgbnVtX2NoYW5uZWxzOworICAgIGludCBzYW1wbGVzX3Blcl9mcmFtZSA9IDA7CisgICAgaWYgKCFHZXRNUEVHQXVkaW9GcmFtZVNpemUoaGVhZGVyLCAmeGluZ2ZyYW1lc2l6ZSwgJnNhbXBsaW5nX3JhdGUsICZudW1fY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgJnNhbXBsZXNfcGVyX2ZyYW1lKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgdWludDhfdCB2ZXJzaW9uID0gKGJ1ZmZlclsxXSA+PiAzKSAmIDM7CisKKyAgICAvLyBkZXRlcm1pbmUgb2Zmc2V0IG9mIFhJTkcgaGVhZGVyCisgICAgaWYodmVyc2lvbiAmIDEpIHsgLy8gbXBlZzEKKyAgICAgICAgaWYgKG51bV9jaGFubmVscyAhPSAxKSBvZmZzZXQgKz0gMzI7CisgICAgICAgIGVsc2Ugb2Zmc2V0ICs9IDE3OworICAgIH0gZWxzZSB7IC8vIG1wZWcgMiBvciAyLjUKKyAgICAgICAgaWYgKG51bV9jaGFubmVscyAhPSAxKSBvZmZzZXQgKz0gMTc7CisgICAgICAgIGVsc2Ugb2Zmc2V0ICs9IDk7CisgICAgfQorCisgICAgaW50IHhpbmdiYXNlID0gb2Zmc2V0OworCisgICAgaWYgKHNvdXJjZS0+cmVhZEF0KG9mZnNldCwgJmJ1ZmZlciwgNCkgPCA0KSB7IC8vIFhJTkcgaGVhZGVyIElECisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBvZmZzZXQgKz0gNDsKKyAgICAvLyBDaGVjayBYSU5HIElECisgICAgaWYgKChidWZmZXJbMF0gIT0gJ1gnKSB8fCAoYnVmZmVyWzFdICE9ICdpJykKKyAgICAgICAgICAgICAgICB8fCAoYnVmZmVyWzJdICE9ICduJykgfHwgKGJ1ZmZlclszXSAhPSAnZycpKSB7CisgICAgICAgIGlmICgoYnVmZmVyWzBdICE9ICdJJykgfHwgKGJ1ZmZlclsxXSAhPSAnbicpCisgICAgICAgICAgICAgICAgICAgIHx8IChidWZmZXJbMl0gIT0gJ2YnKSB8fCAoYnVmZmVyWzNdICE9ICdvJykpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHNvdXJjZS0+cmVhZEF0KG9mZnNldCwgJmJ1ZmZlciwgNCkgPCA0KSB7IC8vIGZsYWdzCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBvZmZzZXQgKz0gNDsKKyAgICB1aW50MzJfdCBmbGFncyA9IFUzMl9BVChidWZmZXIpOworCisgICAgWElOR1NlZWtlciAqc2Vla2VyID0gbmV3IFhJTkdTZWVrZXI7CisgICAgc2Vla2VyLT5tRmlyc3RGcmFtZVBvcyA9IGZpcnN0X2ZyYW1lX3BvcyArIHhpbmdmcmFtZXNpemU7CisKKyAgICBpZiAoZmxhZ3MgJiAweDAwMDEpIHsgIC8vIEZyYW1lcyBmaWVsZCBpcyBwcmVzZW50CisgICAgICAgIGlmIChzb3VyY2UtPnJlYWRBdChvZmZzZXQsIGJ1ZmZlciwgNCkgPCA0KSB7CisgICAgICAgICAgICBkZWxldGUgc2Vla2VyOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaW50MzJfdCBmcmFtZXMgPSBVMzJfQVQoYnVmZmVyKTsKKyAgICAgICAgLy8gb25seSB1cGRhdGUgbUR1cmF0aW9uVXMgaWYgdGhlIGNhbGN1bGF0ZWQgZHVyYXRpb24gaXMgdmFsaWQgKG5vbiB6ZXJvKQorICAgICAgICAvLyBvdGhlcndpc2UsIGxlYXZlIGR1cmF0aW9uIGF0IC0xIHNvIHRoYXQgZ2V0RHVyYXRpb24oKSBhbmQgZ2V0T2Zmc2V0Rm9yVGltZSgpCisgICAgICAgIC8vIHJldHVybiBmYWxzZSB3aGVuIGNhbGxlZCwgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIHhpbmcgdGFnIGRvZXMgbm90IGhhdmUgdGhlCisgICAgICAgIC8vIHJlcXVlc3RlZCBpbmZvcm1hdGlvbgorICAgICAgICBpZiAoZnJhbWVzKSB7CisgICAgICAgICAgICBzZWVrZXItPm1EdXJhdGlvblVzID0gKGludDY0X3QpZnJhbWVzICogc2FtcGxlc19wZXJfZnJhbWUgKiAxMDAwMDAwTEwgLyBzYW1wbGluZ19yYXRlOworICAgICAgICB9CisgICAgICAgIG9mZnNldCArPSA0OworICAgIH0KKyAgICBpZiAoZmxhZ3MgJiAweDAwMDIpIHsgIC8vIEJ5dGVzIGZpZWxkIGlzIHByZXNlbnQKKyAgICAgICAgaWYgKHNvdXJjZS0+cmVhZEF0KG9mZnNldCwgYnVmZmVyLCA0KSA8IDQpIHsKKyAgICAgICAgICAgIGRlbGV0ZSBzZWVrZXI7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBzZWVrZXItPm1TaXplQnl0ZXMgPSBVMzJfQVQoYnVmZmVyKTsKKyAgICAgICAgb2Zmc2V0ICs9IDQ7CisgICAgfQorICAgIGlmIChmbGFncyAmIDB4MDAwNCkgeyAgLy8gVE9DIGZpZWxkIGlzIHByZXNlbnQKKyAgICAgICAgaWYgKHNvdXJjZS0+cmVhZEF0KG9mZnNldCArIDEsIHNlZWtlci0+bVRPQywgOTkpIDwgOTkpIHsKKyAgICAgICAgICAgIGRlbGV0ZSBzZWVrZXI7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBzZWVrZXItPm1UT0NWYWxpZCA9IHRydWU7CisgICAgICAgIG9mZnNldCArPSAxMDA7CisgICAgfQorCisjaWYgMAorICAgIGlmIChmbGFncyAmIDB4MDAwOCkgeyAgLy8gUXVhbGl0eSBpbmRpY2F0b3IgZmllbGQgaXMgcHJlc2VudAorICAgICAgICBpZiAoc291cmNlLT5yZWFkQXQob2Zmc2V0LCBidWZmZXIsIDQpIDwgNCkgeworICAgICAgICAgICAgZGVsZXRlIHNlZWtlcjsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIC8vIGRvIHNvbWV0aGluZyB3aXRoIHRoZSBxdWFsaXR5IGluZGljYXRvcgorICAgICAgICBvZmZzZXQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoc291cmNlLT5yZWFkQXQoeGluZ2Jhc2UgKyAweGFmIC0gMHgyNCwgJmJ1ZmZlciwgMSkgPCAxKSB7IC8vIGVuY29kaW5nIGZsYWdzCisgICAgICAgIGRlbGV0ZSBzZWVrZXI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBBTE9HVigibm9nYXAgcHJlY2VkaW5nOiAlcywgbm9nYXAgY29udGludWVkIGluIG5leHQ6ICVzIiwKKyAgICAgICAgICAgICAgKGJ1ZmZlclswXSAmIDB4ODApID8gInRydWUiIDogImZhbHNlIiwKKyAgICAgICAgICAgICAgKGJ1ZmZlclswXSAmIDB4NDApID8gInRydWUiIDogImZhbHNlIik7CisjZW5kaWYKKworICAgIGlmIChzb3VyY2UtPnJlYWRBdCh4aW5nYmFzZSArIDB4YjEgLSAweDI0LCAmYnVmZmVyLCAzKSA9PSAzKSB7CisgICAgICAgIHNlZWtlci0+bUVuY29kZXJEZWxheSA9IChidWZmZXJbMF0gPDwgNCkgKyAoYnVmZmVyWzFdID4+IDQpOworICAgICAgICBzZWVrZXItPm1FbmNvZGVyUGFkZGluZyA9ICgoYnVmZmVyWzFdICYgMHhmKSA8PCA4KSArIGJ1ZmZlclsyXTsKKyAgICB9CisKKyAgICByZXR1cm4gc2Vla2VyOworfQorCitpbnQzMl90IFhJTkdTZWVrZXI6OmdldEVuY29kZXJEZWxheSgpIHsKKyAgICByZXR1cm4gbUVuY29kZXJEZWxheTsKK30KKworaW50MzJfdCBYSU5HU2Vla2VyOjpnZXRFbmNvZGVyUGFkZGluZygpIHsKKyAgICByZXR1cm4gbUVuY29kZXJQYWRkaW5nOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wMy9YSU5HU2Vla2VyLmggYi9tZWRpYS9leHRyYWN0b3JzL21wMy9YSU5HU2Vla2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg2N2VhZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL1hJTkdTZWVrZXIuaApAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBYSU5HX1NFRUtFUl9IXworCisjZGVmaW5lIFhJTkdfU0VFS0VSX0hfCisKKyNpbmNsdWRlICJNUDNTZWVrZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBEYXRhU291cmNlQmFzZTsKKworc3RydWN0IFhJTkdTZWVrZXIgOiBwdWJsaWMgTVAzU2Vla2VyIHsKKyAgICBzdGF0aWMgWElOR1NlZWtlciAqQ3JlYXRlRnJvbVNvdXJjZSgKKyAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIG9mZjY0X3QgZmlyc3RfZnJhbWVfcG9zKTsKKworICAgIHZpcnR1YWwgYm9vbCBnZXREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzKTsKKyAgICB2aXJ0dWFsIGJvb2wgZ2V0T2Zmc2V0Rm9yVGltZShpbnQ2NF90ICp0aW1lVXMsIG9mZjY0X3QgKnBvcyk7CisKKyAgICB2aXJ0dWFsIGludDMyX3QgZ2V0RW5jb2RlckRlbGF5KCk7CisgICAgdmlydHVhbCBpbnQzMl90IGdldEVuY29kZXJQYWRkaW5nKCk7CisKK3ByaXZhdGU6CisgICAgaW50NjRfdCBtRmlyc3RGcmFtZVBvczsKKyAgICBpbnQ2NF90IG1EdXJhdGlvblVzOworICAgIGludDMyX3QgbVNpemVCeXRlczsKKyAgICBpbnQzMl90IG1FbmNvZGVyRGVsYXk7CisgICAgaW50MzJfdCBtRW5jb2RlclBhZGRpbmc7CisKKyAgICAvLyBUT0MgZW50cmllcyBpbiBYSU5HIGhlYWRlci4gU2tpcCB0aGUgZmlyc3Qgb25lIHNpbmNlIGl0J3MgYWx3YXlzIDAuCisgICAgdW5zaWduZWQgY2hhciBtVE9DWzk5XTsKKyAgICBib29sIG1UT0NWYWxpZDsKKworICAgIFhJTkdTZWVrZXIoKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFhJTkdTZWVrZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBYSU5HX1NFRUtFUl9IXworCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wMy9leHBvcnRzLmxkcyBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL2V4cG9ydHMubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMzA5ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9leHBvcnRzLmxkcwpAQCAtMCwwICsxIEBACit7IGdsb2JhbDogR0VURVhUUkFDVE9SREVGOyBsb2NhbDogKjsgfTsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNzM5ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNjAgQEAKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGlibXA0ZXh0cmFjdG9yX2RlZmF1bHRzIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkl0ZW1UYWJsZS5jcHAiLAorICAgICAgICAiTVBFRzRFeHRyYWN0b3IuY3BwIiwKKyAgICAgICAgIlNhbXBsZUl0ZXJhdG9yLmNwcCIsCisgICAgICAgICJTYW1wbGVUYWJsZS5jcHAiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9lc2RzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfaWQzIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAorICAgIF0sCisgICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCisgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAiZXh0cmFjdG9ycyIsCisgICAgY29tcGlsZV9tdWx0aWxpYjogImZpcnN0IiwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworCisKKyAgICBuYW1lOiAibGlibXA0ZXh0cmFjdG9yIiwKKyAgICBkZWZhdWx0czogWyJsaWJtcDRleHRyYWN0b3JfZGVmYXVsdHMiXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGRpYWc6IHsKKyAgICAgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9LAorCit9CisKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGlibXA0ZXh0cmFjdG9yX2Z1enppbmciLAorCisgICAgZGVmYXVsdHM6IFsibGlibXA0ZXh0cmFjdG9yX2RlZmF1bHRzIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9JdGVtVGFibGUuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvSXRlbVRhYmxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTlkZWFiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvSXRlbVRhYmxlLmNwcApAQCAtMCwwICsxLDE2ODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkl0ZW1UYWJsZSIKKworI2luY2x1ZGUgPEl0ZW1UYWJsZS5oPgorI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgaGVpZiB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBzdHJ1Y3QgdG8ga2VlcCB0cmFjayBvZiBvbmUgaW1hZ2UgaXRlbQorLy8KKworc3RydWN0IEltYWdlSXRlbSB7CisgICAgZnJpZW5kIHN0cnVjdCBJdGVtUmVmZXJlbmNlOworICAgIGZyaWVuZCBzdHJ1Y3QgSXRlbVByb3BlcnR5OworCisgICAgSW1hZ2VJdGVtKCkgOiBJbWFnZUl0ZW0oMCwgMCwgZmFsc2UpIHt9CisgICAgSW1hZ2VJdGVtKHVpbnQzMl90IF90eXBlLCB1aW50MzJfdCBfaWQsIGJvb2wgX2hpZGRlbikgOgorICAgICAgICAgICAgdHlwZShfdHlwZSksIGl0ZW1JZChfaWQpLCBoaWRkZW4oX2hpZGRlbiksCisgICAgICAgICAgICByb3dzKDApLCBjb2x1bW5zKDApLCB3aWR0aCgwKSwgaGVpZ2h0KDApLCByb3RhdGlvbigwKSwKKyAgICAgICAgICAgIG9mZnNldCgwKSwgc2l6ZSgwKSwgbmV4dFRpbGVJbmRleCgwKSB7fQorCisgICAgYm9vbCBpc0dyaWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiB0eXBlID09IEZPVVJDQygnZycsICdyJywgJ2knLCAnZCcpOworICAgIH0KKworICAgIHN0YXR1c190IGdldE5leHRUaWxlSXRlbUlkKHVpbnQzMl90ICpuZXh0VGlsZUl0ZW1JZCwgYm9vbCByZXNldCkgeworICAgICAgICBpZiAocmVzZXQpIHsKKyAgICAgICAgICAgIG5leHRUaWxlSW5kZXggPSAwOworICAgICAgICB9CisgICAgICAgIGlmIChuZXh0VGlsZUluZGV4ID49IGRpbWdSZWZzLnNpemUoKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIH0KKyAgICAgICAgKm5leHRUaWxlSXRlbUlkID0gZGltZ1JlZnNbbmV4dFRpbGVJbmRleCsrXTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHVpbnQzMl90IHR5cGU7CisgICAgdWludDMyX3QgaXRlbUlkOworICAgIGJvb2wgaGlkZGVuOworICAgIGludDMyX3Qgcm93czsKKyAgICBpbnQzMl90IGNvbHVtbnM7CisgICAgaW50MzJfdCB3aWR0aDsKKyAgICBpbnQzMl90IGhlaWdodDsKKyAgICBpbnQzMl90IHJvdGF0aW9uOworICAgIG9mZjY0X3Qgb2Zmc2V0OworICAgIHNpemVfdCBzaXplOworICAgIHNwPEFCdWZmZXI+IGh2Y2M7CisgICAgc3A8QUJ1ZmZlcj4gaWNjOworCisgICAgVmVjdG9yPHVpbnQzMl90PiB0aHVtYm5haWxzOworICAgIFZlY3Rvcjx1aW50MzJfdD4gZGltZ1JlZnM7CisgICAgVmVjdG9yPHVpbnQzMl90PiBjZHNjUmVmczsKKyAgICBzaXplX3QgbmV4dFRpbGVJbmRleDsKK307CisKK3N0cnVjdCBFeGlmSXRlbSB7CisgICAgb2ZmNjRfdCBvZmZzZXQ7CisgICAgc2l6ZV90IHNpemU7Cit9OworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSVNPIGJveGVzCisvLworCitzdHJ1Y3QgQm94IHsKK3Byb3RlY3RlZDoKKyAgICBCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgdWludDMyX3QgdHlwZSkgOgorICAgICAgICBtRGF0YVNvdXJjZShzb3VyY2UpLCBtVHlwZSh0eXBlKSB7fQorCisgICAgdmlydHVhbCB+Qm94KCkge30KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25DaHVua0RhdGEoCisgICAgICAgICAgICB1aW50MzJfdCAvKnR5cGUqLywgb2ZmNjRfdCAvKm9mZnNldCovLCBzaXplX3QgLypzaXplKi8pIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGlubGluZSB1aW50MzJfdCB0eXBlKCkgY29uc3QgeyByZXR1cm4gbVR5cGU7IH0KKworICAgIGlubGluZSBEYXRhU291cmNlQmFzZSAqc291cmNlKCkgY29uc3QgeyByZXR1cm4gbURhdGFTb3VyY2U7IH0KKworICAgIHN0YXR1c190IHBhcnNlQ2h1bmsob2ZmNjRfdCAqb2Zmc2V0KTsKKworICAgIHN0YXR1c190IHBhcnNlQ2h1bmtzKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CisKK3ByaXZhdGU6CisgICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIHVpbnQzMl90IG1UeXBlOworfTsKKworc3RhdHVzX3QgQm94OjpwYXJzZUNodW5rKG9mZjY0X3QgKm9mZnNldCkgeworICAgIGlmICgqb2Zmc2V0IDwgMCkgeworICAgICAgICBBTE9HRSgiYi8yMzU0MDkxNCIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICB1aW50MzJfdCBoZHJbMl07CisgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoKm9mZnNldCwgaGRyLCA4KSA8IDgpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKyAgICB1aW50NjRfdCBjaHVua19zaXplID0gbnRvaGwoaGRyWzBdKTsKKyAgICBpbnQzMl90IGNodW5rX3R5cGUgPSBudG9obChoZHJbMV0pOworICAgIG9mZjY0X3QgZGF0YV9vZmZzZXQgPSAqb2Zmc2V0ICsgODsKKworICAgIGlmIChjaHVua19zaXplID09IDEpIHsKKyAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoKm9mZnNldCArIDgsICZjaHVua19zaXplLCA4KSA8IDgpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfQorICAgICAgICBjaHVua19zaXplID0gbnRvaDY0KGNodW5rX3NpemUpOworICAgICAgICBkYXRhX29mZnNldCArPSA4OworCisgICAgICAgIGlmIChjaHVua19zaXplIDwgMTYpIHsKKyAgICAgICAgICAgIC8vIFRoZSBzbWFsbGVzdCB2YWxpZCBjaHVuayBpcyAxNiBieXRlcyBsb25nIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGNodW5rX3NpemUgPT0gMCkgeworICAgICAgICAvLyBUaGlzIHNob3VsZG4ndCBoYXBwZW4gc2luY2Ugd2Ugc2hvdWxkIG5ldmVyIGJlIHRvcCBsZXZlbAorICAgICAgICBBTE9HRSgiaW52YWxpZCBjaHVuayBzaXplIDAgZm9yIG5vbi10b3AgbGV2ZWwgYm94Iik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfSBlbHNlIGlmIChjaHVua19zaXplIDwgOCkgeworICAgICAgICAvLyBUaGUgc21hbGxlc3QgdmFsaWQgY2h1bmsgaXMgOCBieXRlcyBsb25nLgorICAgICAgICBBTE9HRSgiaW52YWxpZCBjaHVuayBzaXplOiAlbGxkIiwgKGxvbmcgbG9uZyljaHVua19zaXplKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBjaGFyIGNodW5rWzVdOworICAgIE1ha2VGb3VyQ0NTdHJpbmcoY2h1bmtfdHlwZSwgY2h1bmspOworICAgIEFMT0dWKCJjaHVuazogJXMgQCAlbGxkIiwgY2h1bmssIChsb25nIGxvbmcpKm9mZnNldCk7CisKKyAgICBvZmY2NF90IGNodW5rX2RhdGFfc2l6ZSA9IGNodW5rX3NpemUgLSAoZGF0YV9vZmZzZXQgLSAqb2Zmc2V0KTsKKyAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgMCkgeworICAgICAgICBBTE9HRSgiYi8yMzU0MDkxNCIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IG9uQ2h1bmtEYXRhKGNodW5rX3R5cGUsIGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBCb3g6OnBhcnNlQ2h1bmtzKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIG9mZjY0X3Qgc3RvcE9mZnNldCA9IG9mZnNldCArIHNpemU7CisgICAgd2hpbGUgKG9mZnNldCA8IHN0b3BPZmZzZXQpIHsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VDaHVuaygmb2Zmc2V0KTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAob2Zmc2V0ICE9IHN0b3BPZmZzZXQpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdHJ1Y3QgRnVsbEJveCA6IHB1YmxpYyBCb3ggeworcHJvdGVjdGVkOgorICAgIEZ1bGxCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgdWludDMyX3QgdHlwZSkgOgorICAgICAgICBCb3goc291cmNlLCB0eXBlKSwgbVZlcnNpb24oMCksIG1GbGFncygwKSB7fQorCisgICAgaW5saW5lIHVpbnQ4X3QgdmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1WZXJzaW9uOyB9CisKKyAgICBpbmxpbmUgdWludDMyX3QgZmxhZ3MoKSBjb25zdCB7IHJldHVybiBtRmxhZ3M7IH0KKworICAgIHN0YXR1c190IHBhcnNlRnVsbEJveEhlYWRlcihvZmY2NF90ICpvZmZzZXQsIHNpemVfdCAqc2l6ZSk7CisKK3ByaXZhdGU6CisgICAgdWludDhfdCBtVmVyc2lvbjsKKyAgICB1aW50MzJfdCBtRmxhZ3M7Cit9OworCitzdGF0dXNfdCBGdWxsQm94OjpwYXJzZUZ1bGxCb3hIZWFkZXIob2ZmNjRfdCAqb2Zmc2V0LCBzaXplX3QgKnNpemUpIHsKKyAgICBpZiAoKnNpemUgPCA0KSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIGlmICghc291cmNlKCktPnJlYWRBdCgqb2Zmc2V0LCAmbVZlcnNpb24sIDEpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDI0KCpvZmZzZXQgKyAxLCAmbUZsYWdzKSkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorICAgICpvZmZzZXQgKz0gNDsKKyAgICAqc2l6ZSAtPSA0OworICAgIHJldHVybiBPSzsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIFByaW1hcnlJbWFnZSBib3gKKy8vCisKK3N0cnVjdCBQaXRtQm94IDogcHVibGljIEZ1bGxCb3ggeworICAgIFBpdG1Cb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkgOgorICAgICAgICBGdWxsQm94KHNvdXJjZSwgRk9VUkNDKCdwJywgJ2knLCAndCcsICdtJykpIHt9CisKKyAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUsIHVpbnQzMl90ICpwcmltYXJ5SXRlbUlkKTsKK307CisKK3N0YXR1c190IFBpdG1Cb3g6OnBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgdWludDMyX3QgKnByaW1hcnlJdGVtSWQpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUZ1bGxCb3hIZWFkZXIoJm9mZnNldCwgJnNpemUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBzaXplX3QgaXRlbUlkU2l6ZSA9ICh2ZXJzaW9uKCkgPT0gMCkgPyAyIDogNDsKKyAgICBpZiAoc2l6ZSA8IGl0ZW1JZFNpemUpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgdWludDMyX3QgaXRlbUlkOworICAgIGlmICghc291cmNlKCktPmdldFVJbnQzMlZhcihvZmZzZXQsICZpdGVtSWQsIGl0ZW1JZFNpemUpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisKKyAgICBBTE9HVigicHJpbWFyeSBpZCAlZCIsIGl0ZW1JZCk7CisgICAgKnByaW1hcnlJdGVtSWQgPSBpdGVtSWQ7CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJdGVtTG9jYXRpb24gcmVsYXRlZCBib3hlcworLy8KKworc3RydWN0IEV4dGVudEVudHJ5IHsKKyAgICB1aW50NjRfdCBleHRlbnRJbmRleDsKKyAgICB1aW50NjRfdCBleHRlbnRPZmZzZXQ7CisgICAgdWludDY0X3QgZXh0ZW50TGVuZ3RoOworfTsKKworc3RydWN0IEl0ZW1Mb2MgeworICAgIEl0ZW1Mb2MoKSA6IEl0ZW1Mb2MoMCwgMCwgMCwgMCkge30KKyAgICBJdGVtTG9jKHVpbnQzMl90IGl0ZW1faWQsIHVpbnQxNl90IGNvbnN0cnVjdGlvbl9tZXRob2QsCisgICAgICAgICAgICB1aW50MTZfdCBkYXRhX3JlZmVyZW5jZV9pbmRleCwgdWludDY0X3QgYmFzZV9vZmZzZXQpIDoKKyAgICAgICAgaXRlbUlkKGl0ZW1faWQpLAorICAgICAgICBjb25zdHJ1Y3Rpb25NZXRob2QoY29uc3RydWN0aW9uX21ldGhvZCksCisgICAgICAgIGRhdGFSZWZlcmVuY2VJbmRleChkYXRhX3JlZmVyZW5jZV9pbmRleCksCisgICAgICAgIGJhc2VPZmZzZXQoYmFzZV9vZmZzZXQpIHt9CisKKyAgICB2b2lkIGFkZEV4dGVudChjb25zdCBFeHRlbnRFbnRyeSYgZXh0ZW50KSB7CisgICAgICAgIGV4dGVudHMucHVzaF9iYWNrKGV4dGVudCk7CisgICAgfQorCisgICAgc3RhdHVzX3QgZ2V0TG9jKG9mZjY0X3QgKm9mZnNldCwgc2l6ZV90ICpzaXplLAorICAgICAgICAgICAgb2ZmNjRfdCBpZGF0T2Zmc2V0LCBzaXplX3QgaWRhdFNpemUpIGNvbnN0IHsKKyAgICAgICAgLy8gVE9ETzogZml4IGV4dGVudCBoYW5kbGluZywgZml4IGNvbnN0cnVjdGlvbk1ldGhvZCA9IDIKKyAgICAgICAgQ0hFQ0soZXh0ZW50cy5zaXplKCkgPT0gMSk7CisgICAgICAgIGlmIChjb25zdHJ1Y3Rpb25NZXRob2QgPT0gMCkgeworICAgICAgICAgICAgKm9mZnNldCA9IGJhc2VPZmZzZXQgKyBleHRlbnRzWzBdLmV4dGVudE9mZnNldDsKKyAgICAgICAgICAgICpzaXplID0gZXh0ZW50c1swXS5leHRlbnRMZW5ndGg7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0gZWxzZSBpZiAoY29uc3RydWN0aW9uTWV0aG9kID09IDEpIHsKKyAgICAgICAgICAgIGlmIChiYXNlT2Zmc2V0ICsgZXh0ZW50c1swXS5leHRlbnRPZmZzZXQgKyBleHRlbnRzWzBdLmV4dGVudExlbmd0aAorICAgICAgICAgICAgICAgICAgICA+IGlkYXRTaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpvZmZzZXQgPSBiYXNlT2Zmc2V0ICsgZXh0ZW50c1swXS5leHRlbnRPZmZzZXQgKyBpZGF0T2Zmc2V0OworICAgICAgICAgICAgKnNpemUgPSBleHRlbnRzWzBdLmV4dGVudExlbmd0aDsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgLy8gcGFyc2VkIGluZm8KKyAgICB1aW50MzJfdCBpdGVtSWQ7CisgICAgdWludDE2X3QgY29uc3RydWN0aW9uTWV0aG9kOworICAgIHVpbnQxNl90IGRhdGFSZWZlcmVuY2VJbmRleDsKKyAgICBvZmY2NF90IGJhc2VPZmZzZXQ7CisgICAgVmVjdG9yPEV4dGVudEVudHJ5PiBleHRlbnRzOworfTsKKworc3RydWN0IElsb2NCb3ggOiBwdWJsaWMgRnVsbEJveCB7CisgICAgSWxvY0JveChEYXRhU291cmNlQmFzZSAqc291cmNlLCBLZXllZFZlY3Rvcjx1aW50MzJfdCwgSXRlbUxvYz4gKml0ZW1Mb2NzKSA6CisgICAgICAgIEZ1bGxCb3goc291cmNlLCBGT1VSQ0MoJ2knLCAnbCcsICdvJywgJ2MnKSksCisgICAgICAgIG1JdGVtTG9jcyhpdGVtTG9jcyksIG1IYXNDb25zdHJ1Y3RNZXRob2QxKGZhbHNlKSB7fQorCisgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKKworICAgIGJvb2wgaGFzQ29uc3RydWN0TWV0aG9kMSgpIHsgcmV0dXJuIG1IYXNDb25zdHJ1Y3RNZXRob2QxOyB9CisKK3ByaXZhdGU6CisgICAgc3RhdGljIGJvb2wgaXNTaXplRmllbGRWYWxpZCh1aW50MzJfdCBvZmZzZXRfc2l6ZSkgeworICAgICAgICByZXR1cm4gb2Zmc2V0X3NpemUgPT0gMCB8fCBvZmZzZXRfc2l6ZSA9PSA0IHx8IG9mZnNldF9zaXplID09IDg7CisgICAgfQorICAgIEtleWVkVmVjdG9yPHVpbnQzMl90LCBJdGVtTG9jPiAqbUl0ZW1Mb2NzOworICAgIGJvb2wgbUhhc0NvbnN0cnVjdE1ldGhvZDE7Cit9OworCitzdGF0dXNfdCBJbG9jQm94OjpwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUZ1bGxCb3hIZWFkZXIoJm9mZnNldCwgJnNpemUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgaWYgKHZlcnNpb24oKSA+IDIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIHZlcnNpb24gJWQiLCBfX0ZVTkNUSU9OX18sIHZlcnNpb24oKSk7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgaWYgKHNpemUgPCAyKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIHVpbnQ4X3Qgb2Zmc2V0X3NpemU7CisgICAgaWYgKCFzb3VyY2UoKS0+cmVhZEF0KG9mZnNldCsrLCAmb2Zmc2V0X3NpemUsIDEpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisgICAgdWludDhfdCBsZW5ndGhfc2l6ZSA9IChvZmZzZXRfc2l6ZSAmIDB4Rik7CisgICAgb2Zmc2V0X3NpemUgPj49IDQ7CisKKyAgICB1aW50OF90IGJhc2Vfb2Zmc2V0X3NpemU7CisgICAgaWYgKCFzb3VyY2UoKS0+cmVhZEF0KG9mZnNldCsrLCAmYmFzZV9vZmZzZXRfc2l6ZSwgMSkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKyAgICB1aW50OF90IGluZGV4X3NpemUgPSAwOworICAgIGlmICh2ZXJzaW9uKCkgPT0gMSB8fCB2ZXJzaW9uKCkgPT0gMikgeworICAgICAgICBpbmRleF9zaXplID0gKGJhc2Vfb2Zmc2V0X3NpemUgJiAweEYpOworICAgIH0KKyAgICBiYXNlX29mZnNldF9zaXplID4+PSA0OworICAgIHNpemUgLT0gMjsKKworICAgIGlmICghaXNTaXplRmllbGRWYWxpZChvZmZzZXRfc2l6ZSkKKyAgICAgICAgICAgIHx8ICFpc1NpemVGaWVsZFZhbGlkKGxlbmd0aF9zaXplKQorICAgICAgICAgICAgfHwgIWlzU2l6ZUZpZWxkVmFsaWQoYmFzZV9vZmZzZXRfc2l6ZSkKKyAgICAgICAgICAgIHx8ICFpc1NpemVGaWVsZFZhbGlkKChpbmRleF9zaXplKSkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBvZmZzZXQgc2l6ZSBub3QgdmFsaWQ6ICVkLCAlZCwgJWQsICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIG9mZnNldF9zaXplLCBsZW5ndGhfc2l6ZSwgYmFzZV9vZmZzZXRfc2l6ZSwgaW5kZXhfc2l6ZSk7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgdWludDMyX3QgaXRlbV9jb3VudDsKKyAgICBzaXplX3QgaXRlbUZpZWxkU2l6ZSA9IHZlcnNpb24oKSA8IDIgPyAyIDogNDsKKyAgICBpZiAoc2l6ZSA8IGl0ZW1GaWVsZFNpemUpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDMyVmFyKG9mZnNldCwgJml0ZW1fY291bnQsIGl0ZW1GaWVsZFNpemUpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisKKyAgICBBTE9HVigiaXRlbV9jb3VudCAlbGxkIiwgKGxvbmcgbG9uZykgaXRlbV9jb3VudCk7CisgICAgb2Zmc2V0ICs9IGl0ZW1GaWVsZFNpemU7CisgICAgc2l6ZSAtPSBpdGVtRmllbGRTaXplOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpdGVtX2NvdW50OyBpKyspIHsKKyAgICAgICAgdWludDMyX3QgaXRlbV9pZDsKKyAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDMyVmFyKG9mZnNldCwgJml0ZW1faWQsIGl0ZW1GaWVsZFNpemUpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIml0ZW1bJXp1XTogaWQgJWxsZCIsIGksIChsb25nIGxvbmcpaXRlbV9pZCk7CisgICAgICAgIG9mZnNldCArPSBpdGVtRmllbGRTaXplOworCisgICAgICAgIHVpbnQ4X3QgY29uc3RydWN0aW9uX21ldGhvZCA9IDA7CisgICAgICAgIGlmICh2ZXJzaW9uKCkgPT0gMSB8fCB2ZXJzaW9uKCkgPT0gMikgeworICAgICAgICAgICAgdWludDhfdCBidWZbMl07CisgICAgICAgICAgICBpZiAoIXNvdXJjZSgpLT5yZWFkQXQob2Zmc2V0LCBidWYsIDIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3RydWN0aW9uX21ldGhvZCA9IChidWZbMV0gJiAweEYpOworICAgICAgICAgICAgQUxPR1YoImNvbnN0cnVjdGlvbl9tZXRob2QgJWQiLCBjb25zdHJ1Y3Rpb25fbWV0aG9kKTsKKyAgICAgICAgICAgIGlmIChjb25zdHJ1Y3Rpb25fbWV0aG9kID09IDEpIHsKKyAgICAgICAgICAgICAgICBtSGFzQ29uc3RydWN0TWV0aG9kMSA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG9mZnNldCArPSAyOworICAgICAgICB9CisKKyAgICAgICAgdWludDE2X3QgZGF0YV9yZWZlcmVuY2VfaW5kZXg7CisgICAgICAgIGlmICghc291cmNlKCktPmdldFVJbnQxNihvZmZzZXQsICZkYXRhX3JlZmVyZW5jZV9pbmRleCkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiZGF0YV9yZWZlcmVuY2VfaW5kZXggJWQiLCBkYXRhX3JlZmVyZW5jZV9pbmRleCk7CisgICAgICAgIGlmIChkYXRhX3JlZmVyZW5jZV9pbmRleCAhPSAwKSB7CisgICAgICAgICAgICAvLyB3ZSBkb24ndCBzdXBwb3J0IHJlZmVyZW5jZSB0byBvdGhlciBmaWxlcworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICB9CisgICAgICAgIG9mZnNldCArPSAyOworCisgICAgICAgIHVpbnQ2NF90IGJhc2Vfb2Zmc2V0ID0gMDsKKyAgICAgICAgaWYgKGJhc2Vfb2Zmc2V0X3NpemUgIT0gMCkgeworICAgICAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDY0VmFyKG9mZnNldCwgJmJhc2Vfb2Zmc2V0LCBiYXNlX29mZnNldF9zaXplKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9mZnNldCArPSBiYXNlX29mZnNldF9zaXplOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJiYXNlX29mZnNldCAlbGxkIiwgKGxvbmcgbG9uZykgYmFzZV9vZmZzZXQpOworCisgICAgICAgIHNzaXplX3QgaW5kZXggPSBtSXRlbUxvY3MtPmFkZChpdGVtX2lkLCBJdGVtTG9jKAorICAgICAgICAgICAgICAgIGl0ZW1faWQsIGNvbnN0cnVjdGlvbl9tZXRob2QsIGRhdGFfcmVmZXJlbmNlX2luZGV4LCBiYXNlX29mZnNldCkpOworICAgICAgICBJdGVtTG9jICZpdGVtID0gbUl0ZW1Mb2NzLT5lZGl0VmFsdWVBdChpbmRleCk7CisKKyAgICAgICAgdWludDE2X3QgZXh0ZW50X2NvdW50OworICAgICAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MTYob2Zmc2V0LCAmZXh0ZW50X2NvdW50KSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJleHRlbnRfY291bnQgJWQiLCBleHRlbnRfY291bnQpOworCisgICAgICAgIGlmIChleHRlbnRfY291bnQgPiAxICYmIChvZmZzZXRfc2l6ZSA9PSAwIHx8IGxlbmd0aF9zaXplID09IDApKSB7CisgICAgICAgICAgICAvLyBpZiB0aGUgaXRlbSBpcyBkaXZpZGVjIGludG8gbW9yZSB0aGFuIG9uZSBleHRlbnRzLCBvZmZzZXQgYW5kCisgICAgICAgICAgICAvLyBsZW5ndGggbXVzdCBiZSBwcmVzZW50LgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgICAgICBvZmZzZXQgKz0gMjsKKworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGV4dGVudF9jb3VudDsgaisrKSB7CisgICAgICAgICAgICB1aW50NjRfdCBleHRlbnRfaW5kZXggPSAxOyAvLyBkZWZhdWx0PTEKKyAgICAgICAgICAgIGlmICgodmVyc2lvbigpID09IDEgfHwgdmVyc2lvbigpID09IDIpICYmIChpbmRleF9zaXplID4gMCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50NjRWYXIob2Zmc2V0LCAmZXh0ZW50X2luZGV4LCBpbmRleF9zaXplKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFRPRE86IGFkZCBzdXBwb3J0IGZvciB0aGlzIG1vZGUKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gaW5kZXhfc2l6ZTsKKyAgICAgICAgICAgICAgICBBTE9HVigiZXh0ZW50X2luZGV4ICVsbGQiLCAobG9uZyBsb25nKWV4dGVudF9pbmRleCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQ2NF90IGV4dGVudF9vZmZzZXQgPSAwOyAvLyBkZWZhdWx0PTAKKyAgICAgICAgICAgIGlmIChvZmZzZXRfc2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50NjRWYXIob2Zmc2V0LCAmZXh0ZW50X29mZnNldCwgb2Zmc2V0X3NpemUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IG9mZnNldF9zaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoImV4dGVudF9vZmZzZXQgJWxsZCIsIChsb25nIGxvbmcpZXh0ZW50X29mZnNldCk7CisKKyAgICAgICAgICAgIHVpbnQ2NF90IGV4dGVudF9sZW5ndGggPSAwOyAvLyB0aGlzIGluZGljYXRlcyBmdWxsIGxlbmd0aCBvZiBmaWxlCisgICAgICAgICAgICBpZiAobGVuZ3RoX3NpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDY0VmFyKG9mZnNldCwgJmV4dGVudF9sZW5ndGgsIGxlbmd0aF9zaXplKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9mZnNldCArPSBsZW5ndGhfc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJleHRlbnRfbGVuZ3RoICVsbGQiLCAobG9uZyBsb25nKWV4dGVudF9sZW5ndGgpOworCisgICAgICAgICAgICBpdGVtLmFkZEV4dGVudCh7IGV4dGVudF9pbmRleCwgZXh0ZW50X29mZnNldCwgZXh0ZW50X2xlbmd0aCB9KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJdGVtUmVmZXJlbmNlIHJlbGF0ZWQgYm94ZXMKKy8vCisKK3N0cnVjdCBJdGVtUmVmZXJlbmNlIDogcHVibGljIEJveCwgcHVibGljIFJlZkJhc2UgeworICAgIEl0ZW1SZWZlcmVuY2UoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgdWludDMyX3QgdHlwZSwgdWludDMyX3QgaXRlbUlkU2l6ZSkgOgorICAgICAgICBCb3goc291cmNlLCB0eXBlKSwgbUl0ZW1JZCgwKSwgbVJlZklkU2l6ZShpdGVtSWRTaXplKSB7fQorCisgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKKworICAgIHVpbnQzMl90IGl0ZW1JZCgpIHsgcmV0dXJuIG1JdGVtSWQ7IH0KKworICAgIHZvaWQgYXBwbHkoCisgICAgICAgICAgICBLZXllZFZlY3Rvcjx1aW50MzJfdCwgSW1hZ2VJdGVtPiAmaXRlbUlkVG9JdGVtTWFwLAorICAgICAgICAgICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIEV4aWZJdGVtPiAmaXRlbUlkVG9FeGlmTWFwKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICB1aW50MzJfdCBtSXRlbUlkOworICAgIHVpbnQzMl90IG1SZWZJZFNpemU7CisgICAgVmVjdG9yPHVpbnQzMl90PiBtUmVmczsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEl0ZW1SZWZlcmVuY2UpOworfTsKKwordm9pZCBJdGVtUmVmZXJlbmNlOjphcHBseSgKKyAgICAgICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIEltYWdlSXRlbT4gJml0ZW1JZFRvSXRlbU1hcCwKKyAgICAgICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIEV4aWZJdGVtPiAmaXRlbUlkVG9FeGlmTWFwKSBjb25zdCB7CisgICAgQUxPR1YoImF0dGFjaCByZWZlcmVuY2UgdHlwZSAweCV4IHRvIGl0ZW0gaWQgJWQpIiwgdHlwZSgpLCBtSXRlbUlkKTsKKworICAgIHN3aXRjaCh0eXBlKCkpIHsKKyAgICBjYXNlIEZPVVJDQygnZCcsICdpJywgJ20nLCAnZycpOiB7CisgICAgICAgIHNzaXplX3QgaXRlbUluZGV4ID0gaXRlbUlkVG9JdGVtTWFwLmluZGV4T2ZLZXkobUl0ZW1JZCk7CisKKyAgICAgICAgLy8gaWdub3JlIG5vbi1pbWFnZSBpdGVtcworICAgICAgICBpZiAoaXRlbUluZGV4IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgSW1hZ2VJdGVtICZkZXJpdmVkSW1hZ2UgPSBpdGVtSWRUb0l0ZW1NYXAuZWRpdFZhbHVlQXQoaXRlbUluZGV4KTsKKyAgICAgICAgaWYgKCFkZXJpdmVkSW1hZ2UuZGltZ1JlZnMuZW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR1coImRpbWdSZWZzIG5vdCBjbGVhbiEiKTsKKyAgICAgICAgfQorICAgICAgICBkZXJpdmVkSW1hZ2UuZGltZ1JlZnMuYXBwZW5kVmVjdG9yKG1SZWZzKTsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1SZWZzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpdGVtSW5kZXggPSBpdGVtSWRUb0l0ZW1NYXAuaW5kZXhPZktleShtUmVmc1tpXSk7CisKKyAgICAgICAgICAgIC8vIGlnbm9yZSBub24taW1hZ2UgaXRlbXMKKyAgICAgICAgICAgIGlmIChpdGVtSW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBJbWFnZUl0ZW0gJnNvdXJjZUltYWdlID0gaXRlbUlkVG9JdGVtTWFwLmVkaXRWYWx1ZUF0KGl0ZW1JbmRleCk7CisKKyAgICAgICAgICAgIC8vIG1hcmsgdGhlIHNvdXJjZSBpbWFnZSBvZiB0aGUgZGVyaXZhdGlvbiBhcyBoaWRkZW4KKyAgICAgICAgICAgIHNvdXJjZUltYWdlLmhpZGRlbiA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRk9VUkNDKCd0JywgJ2gnLCAnbScsICdiJyk6IHsKKyAgICAgICAgc3NpemVfdCBpdGVtSW5kZXggPSBpdGVtSWRUb0l0ZW1NYXAuaW5kZXhPZktleShtSXRlbUlkKTsKKworICAgICAgICAvLyBpZ25vcmUgbm9uLWltYWdlIGl0ZW1zCisgICAgICAgIGlmIChpdGVtSW5kZXggPCAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBtYXJrIHRodW1ibmFpbCBpbWFnZSBhcyBoaWRkZW4sIHRoZXNlIGNhbiBiZSByZXRyaWV2ZWQgaWYgdGhlIGNsaWVudAorICAgICAgICAvLyByZXF1ZXN0IHRodW1ibmFpbCBleHBsaWNpdGx5LCBidXQgd29uJ3QgYmUgZXhwb3NlZCBhcyBkaXNwbGF5YWJsZXMuCisgICAgICAgIEltYWdlSXRlbSAmdGh1bWJJbWFnZSA9IGl0ZW1JZFRvSXRlbU1hcC5lZGl0VmFsdWVBdChpdGVtSW5kZXgpOworICAgICAgICB0aHVtYkltYWdlLmhpZGRlbiA9IHRydWU7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUmVmcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaXRlbUluZGV4ID0gaXRlbUlkVG9JdGVtTWFwLmluZGV4T2ZLZXkobVJlZnNbaV0pOworCisgICAgICAgICAgICAvLyBpZ25vcmUgbm9uLWltYWdlIGl0ZW1zCisgICAgICAgICAgICBpZiAoaXRlbUluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoIkltYWdlIGl0ZW0gaWQgJWQgdXNlcyB0aHVtYm5haWwgaXRlbSBpZCAlZCIsIG1SZWZzW2ldLCBtSXRlbUlkKTsKKyAgICAgICAgICAgIEltYWdlSXRlbSAmbWFzdGVySW1hZ2UgPSBpdGVtSWRUb0l0ZW1NYXAuZWRpdFZhbHVlQXQoaXRlbUluZGV4KTsKKyAgICAgICAgICAgIGlmICghbWFzdGVySW1hZ2UudGh1bWJuYWlscy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImFscmVhZHkgaGFzIHRodW1ibmFpbHMhIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXN0ZXJJbWFnZS50aHVtYm5haWxzLnB1c2hfYmFjayhtSXRlbUlkKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGT1VSQ0MoJ2MnLCAnZCcsICdzJywgJ2MnKTogeworICAgICAgICBzc2l6ZV90IGl0ZW1JbmRleCA9IGl0ZW1JZFRvRXhpZk1hcC5pbmRleE9mS2V5KG1JdGVtSWQpOworCisgICAgICAgIC8vIGlnbm9yZSBub24tZXhpZiBibG9jayBpdGVtcworICAgICAgICBpZiAoaXRlbUluZGV4IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUmVmcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaXRlbUluZGV4ID0gaXRlbUlkVG9JdGVtTWFwLmluZGV4T2ZLZXkobVJlZnNbaV0pOworCisgICAgICAgICAgICAvLyBpZ25vcmUgbm9uLWltYWdlIGl0ZW1zCisgICAgICAgICAgICBpZiAoaXRlbUluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoIkltYWdlIGl0ZW0gaWQgJWQgdXNlcyBtZXRhZGF0YSBpdGVtIGlkICVkIiwgbVJlZnNbaV0sIG1JdGVtSWQpOworICAgICAgICAgICAgSW1hZ2VJdGVtICZpbWFnZSA9IGl0ZW1JZFRvSXRlbU1hcC5lZGl0VmFsdWVBdChpdGVtSW5kZXgpOworICAgICAgICAgICAgaW1hZ2UuY2RzY1JlZnMucHVzaF9iYWNrKG1JdGVtSWQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZPVVJDQygnYScsICd1JywgJ3gnLCAnbCcpOiB7CisgICAgICAgIHNzaXplX3QgaXRlbUluZGV4ID0gaXRlbUlkVG9JdGVtTWFwLmluZGV4T2ZLZXkobUl0ZW1JZCk7CisKKyAgICAgICAgLy8gaWdub3JlIG5vbi1pbWFnZSBpdGVtcworICAgICAgICBpZiAoaXRlbUluZGV4IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gbWFyayBhdXhpbGlhcnkgaW1hZ2UgYXMgaGlkZGVuCisgICAgICAgIEltYWdlSXRlbSAmYXV4SW1hZ2UgPSBpdGVtSWRUb0l0ZW1NYXAuZWRpdFZhbHVlQXQoaXRlbUluZGV4KTsKKyAgICAgICAgYXV4SW1hZ2UuaGlkZGVuID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dXKCJpZ25vcmluZyB1bnN1cHBvcnRlZCByZWYgdHlwZSAweCV4IiwgdHlwZSgpKTsKKyAgICB9Cit9CisKK3N0YXR1c190IEl0ZW1SZWZlcmVuY2U6OnBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChzaXplIDwgbVJlZklkU2l6ZSArIDIpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDMyVmFyKG9mZnNldCwgJm1JdGVtSWQsIG1SZWZJZFNpemUpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisgICAgb2Zmc2V0ICs9IG1SZWZJZFNpemU7CisKKyAgICB1aW50MTZfdCBjb3VudDsKKyAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MTYob2Zmc2V0LCAmY291bnQpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisgICAgb2Zmc2V0ICs9IDI7CisgICAgc2l6ZSAtPSAobVJlZklkU2l6ZSArIDIpOworCisgICAgaWYgKHNpemUgPCBjb3VudCAqIG1SZWZJZFNpemUpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgdWludDMyX3QgcmVmSXRlbUlkOworICAgICAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MzJWYXIob2Zmc2V0LCAmcmVmSXRlbUlkLCBtUmVmSWRTaXplKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICB9CisgICAgICAgIG9mZnNldCArPSBtUmVmSWRTaXplOworICAgICAgICBtUmVmcy5wdXNoX2JhY2socmVmSXRlbUlkKTsKKyAgICAgICAgQUxPR1YoIml0ZW0gaWQgJWQ6IHJlZmVyZW5jaW5nIGl0ZW0gaWQgJWQiLCBtSXRlbUlkLCByZWZJdGVtSWQpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RydWN0IElyZWZCb3ggOiBwdWJsaWMgRnVsbEJveCB7CisgICAgSXJlZkJveChEYXRhU291cmNlQmFzZSAqc291cmNlLCBWZWN0b3I8c3A8SXRlbVJlZmVyZW5jZT4gPiAqaXRlbVJlZnMpIDoKKyAgICAgICAgRnVsbEJveChzb3VyY2UsIEZPVVJDQygnaScsICdyJywgJ2UnLCAnZicpKSwgbVJlZklkU2l6ZSgwKSwgbUl0ZW1SZWZzKGl0ZW1SZWZzKSB7fQorCisgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKKworcHJvdGVjdGVkOgorICAgIHN0YXR1c190IG9uQ2h1bmtEYXRhKHVpbnQzMl90IHR5cGUsIG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgdWludDMyX3QgbVJlZklkU2l6ZTsKKyAgICBWZWN0b3I8c3A8SXRlbVJlZmVyZW5jZT4gPiAqbUl0ZW1SZWZzOworfTsKKworc3RhdHVzX3QgSXJlZkJveDo6cGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgQUxPR1YoIiVzOiBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUZ1bGxCb3hIZWFkZXIoJm9mZnNldCwgJnNpemUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBtUmVmSWRTaXplID0gKHZlcnNpb24oKSA9PSAwKSA/IDIgOiA0OworICAgIHJldHVybiBwYXJzZUNodW5rcyhvZmZzZXQsIHNpemUpOworfQorCitzdGF0dXNfdCBJcmVmQm94OjpvbkNodW5rRGF0YSh1aW50MzJfdCB0eXBlLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBzcDxJdGVtUmVmZXJlbmNlPiBpdGVtUmVmID0gbmV3IEl0ZW1SZWZlcmVuY2Uoc291cmNlKCksIHR5cGUsIG1SZWZJZFNpemUpOworCisgICAgc3RhdHVzX3QgZXJyID0gaXRlbVJlZi0+cGFyc2Uob2Zmc2V0LCBzaXplKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIG1JdGVtUmVmcy0+cHVzaF9iYWNrKGl0ZW1SZWYpOworICAgIHJldHVybiBPSzsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIEl0ZW1Qcm9wZXJ0eSByZWxhdGVkIGJveGVzCisvLworCitzdHJ1Y3QgQXNzb2NpYXRpb25FbnRyeSB7CisgICAgdWludDMyX3QgaXRlbUlkOworICAgIGJvb2wgZXNzZW50aWFsOworICAgIHVpbnQxNl90IGluZGV4OworfTsKKworc3RydWN0IEl0ZW1Qcm9wZXJ0eSA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBJdGVtUHJvcGVydHkoKSB7fQorCisgICAgdmlydHVhbCB2b2lkIGF0dGFjaFRvKEltYWdlSXRlbSAmLyppbWFnZSovKSBjb25zdCB7CisgICAgICAgIEFMT0dXKCJVbnJlY29nbml6ZWQgcHJvcGVydHkiKTsKKyAgICB9CisgICAgdmlydHVhbCBzdGF0dXNfdCBwYXJzZShvZmY2NF90IC8qb2Zmc2V0Ki8sIHNpemVfdCAvKnNpemUqLykgeworICAgICAgICBBTE9HVygiVW5yZWNvZ25pemVkIHByb3BlcnR5Iik7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSXRlbVByb3BlcnR5KTsKK307CisKK3N0cnVjdCBJc3BlQm94IDogcHVibGljIEZ1bGxCb3gsIHB1YmxpYyBJdGVtUHJvcGVydHkgeworICAgIElzcGVCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkgOgorICAgICAgICBGdWxsQm94KHNvdXJjZSwgRk9VUkNDKCdpJywgJ3MnLCAncCcsICdlJykpLCBtV2lkdGgoMCksIG1IZWlnaHQoMCkge30KKworICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIGF0dGFjaFRvKEltYWdlSXRlbSAmaW1hZ2UpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgaW1hZ2Uud2lkdGggPSBtV2lkdGg7CisgICAgICAgIGltYWdlLmhlaWdodCA9IG1IZWlnaHQ7CisgICAgfQorCitwcml2YXRlOgorICAgIHVpbnQzMl90IG1XaWR0aDsKKyAgICB1aW50MzJfdCBtSGVpZ2h0OworfTsKKworc3RhdHVzX3QgSXNwZUJveDo6cGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgQUxPR1YoIiVzOiBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKKworICAgIHN0YXR1c190IGVyciA9IHBhcnNlRnVsbEJveEhlYWRlcigmb2Zmc2V0LCAmc2l6ZSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmIChzaXplIDwgOCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MzIob2Zmc2V0LCAmbVdpZHRoKQorICAgICAgICAgICAgfHwgIXNvdXJjZSgpLT5nZXRVSW50MzIob2Zmc2V0ICsgNCwgJm1IZWlnaHQpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisgICAgQUxPR1YoInByb3BlcnR5IGlzcGU6ICVkeCVkIiwgbVdpZHRoLCBtSGVpZ2h0KTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RydWN0IEh2Y2NCb3ggOiBwdWJsaWMgQm94LCBwdWJsaWMgSXRlbVByb3BlcnR5IHsKKyAgICBIdmNjQm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UpIDoKKyAgICAgICAgQm94KHNvdXJjZSwgRk9VUkNDKCdoJywgJ3YnLCAnYycsICdDJykpIHt9CisKKyAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworCisgICAgdm9pZCBhdHRhY2hUbyhJbWFnZUl0ZW0gJmltYWdlKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIGltYWdlLmh2Y2MgPSBtSFZDQzsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3A8QUJ1ZmZlcj4gbUhWQ0M7Cit9OworCitzdGF0dXNfdCBIdmNjQm94OjpwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBBTE9HVigiJXM6IG9mZnNldCAlbGxkLCBzaXplICV6dSIsIF9fRlVOQ1RJT05fXywgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOworCisgICAgbUhWQ0MgPSBuZXcgQUJ1ZmZlcihzaXplKTsKKworICAgIGlmIChtSFZDQy0+ZGF0YSgpID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImIvMjg0NzEyMDYiKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICBpZiAoc291cmNlKCktPnJlYWRBdChvZmZzZXQsIG1IVkNDLT5kYXRhKCksIHNpemUpIDwgKHNzaXplX3Qpc2l6ZSkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorCisgICAgQUxPR1YoInByb3BlcnR5IGh2Y0MiKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RydWN0IElyb3RCb3ggOiBwdWJsaWMgQm94LCBwdWJsaWMgSXRlbVByb3BlcnR5IHsKKyAgICBJcm90Qm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UpIDoKKyAgICAgICAgQm94KHNvdXJjZSwgRk9VUkNDKCdpJywgJ3InLCAnbycsICd0JykpLCBtQW5nbGUoMCkge30KKworICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIGF0dGFjaFRvKEltYWdlSXRlbSAmaW1hZ2UpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgaW1hZ2Uucm90YXRpb24gPSBtQW5nbGUgKiA5MDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgdWludDhfdCBtQW5nbGU7Cit9OworCitzdGF0dXNfdCBJcm90Qm94OjpwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBBTE9HVigiJXM6IG9mZnNldCAlbGxkLCBzaXplICV6dSIsIF9fRlVOQ1RJT05fXywgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOworCisgICAgaWYgKHNpemUgPCAxKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIGlmIChzb3VyY2UoKS0+cmVhZEF0KG9mZnNldCwgJm1BbmdsZSwgMSkgIT0gMSkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorICAgIG1BbmdsZSAmPSAweDM7CisgICAgQUxPR1YoInByb3BlcnR5IGlyb3Q6ICVkIiwgbUFuZ2xlKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RydWN0IENvbHJCb3ggOiBwdWJsaWMgQm94LCBwdWJsaWMgSXRlbVByb3BlcnR5IHsKKyAgICBDb2xyQm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UpIDoKKyAgICAgICAgQm94KHNvdXJjZSwgRk9VUkNDKCdjJywgJ28nLCAnbCcsICdyJykpIHt9CisKKyAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworCisgICAgdm9pZCBhdHRhY2hUbyhJbWFnZUl0ZW0gJmltYWdlKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIGltYWdlLmljYyA9IG1JQ0NEYXRhOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzcDxBQnVmZmVyPiBtSUNDRGF0YTsKK307CisKK3N0YXR1c190IENvbHJCb3g6OnBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIEFMT0dWKCIlczogb2Zmc2V0ICVsbGQsIHNpemUgJXp1IiwgX19GVU5DVElPTl9fLCAobG9uZyBsb25nKW9mZnNldCwgc2l6ZSk7CisKKyAgICBpZiAoc2l6ZSA8IDQpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgdWludDMyX3QgY29sb3VyX3R5cGU7CisgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDMyKG9mZnNldCwgJmNvbG91cl90eXBlKSkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorICAgIG9mZnNldCArPSA0OworICAgIHNpemUgLT0gNDsKKyAgICBpZiAoY29sb3VyX3R5cGUgPT0gRk9VUkNDKCduJywgJ2MnLCAnbCcsICd4JykpIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICBpZiAoKGNvbG91cl90eXBlICE9IEZPVVJDQygncicsICdJJywgJ0MnLCAnQycpKSAmJgorICAgICAgICAoY29sb3VyX3R5cGUgIT0gRk9VUkNDKCdwJywgJ3InLCAnbycsICdmJykpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgbUlDQ0RhdGEgPSBuZXcgQUJ1ZmZlcihzaXplKTsKKyAgICBpZiAobUlDQ0RhdGEtPmRhdGEoKSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJiLzI4NDcxMjA2Iik7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgaWYgKHNvdXJjZSgpLT5yZWFkQXQob2Zmc2V0LCBtSUNDRGF0YS0+ZGF0YSgpLCBzaXplKSAhPSAoc3NpemVfdClzaXplKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisKKyAgICBBTE9HVigicHJvcGVydHkgQ29scjogc2l6ZSAlemQiLCBzaXplKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0cnVjdCBJcG1hQm94IDogcHVibGljIEZ1bGxCb3ggeworICAgIElwbWFCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgVmVjdG9yPEFzc29jaWF0aW9uRW50cnk+ICphc3NvY2lhdGlvbnMpIDoKKyAgICAgICAgRnVsbEJveChzb3VyY2UsIEZPVVJDQygnaScsICdwJywgJ20nLCAnYScpKSwgbUFzc29jaWF0aW9ucyhhc3NvY2lhdGlvbnMpIHt9CisKKyAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOworcHJpdmF0ZToKKyAgICBWZWN0b3I8QXNzb2NpYXRpb25FbnRyeT4gKm1Bc3NvY2lhdGlvbnM7Cit9OworCitzdGF0dXNfdCBJcG1hQm94OjpwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUZ1bGxCb3hIZWFkZXIoJm9mZnNldCwgJnNpemUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoc2l6ZSA8IDQpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgdWludDMyX3QgZW50cnlDb3VudDsKKyAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MzIob2Zmc2V0LCAmZW50cnlDb3VudCkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKyAgICBvZmZzZXQgKz0gNDsKKyAgICBzaXplIC09IDQ7CisKKyAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IGVudHJ5Q291bnQ7ICsraykgeworICAgICAgICB1aW50MzJfdCBpdGVtSWQgPSAwOworICAgICAgICBzaXplX3QgaXRlbUlkU2l6ZSA9ICh2ZXJzaW9uKCkgPCAxKSA/IDIgOiA0OworCisgICAgICAgIGlmIChzaXplIDwgaXRlbUlkU2l6ZSArIDEpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MzJWYXIob2Zmc2V0LCAmaXRlbUlkLCBpdGVtSWRTaXplKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICB9CisgICAgICAgIG9mZnNldCArPSBpdGVtSWRTaXplOworICAgICAgICBzaXplIC09IGl0ZW1JZFNpemU7CisKKyAgICAgICAgdWludDhfdCBhc3NvY2lhdGlvbkNvdW50OworICAgICAgICBpZiAoIXNvdXJjZSgpLT5yZWFkQXQob2Zmc2V0LCAmYXNzb2NpYXRpb25Db3VudCwgMSkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfQorICAgICAgICBvZmZzZXQrKzsKKyAgICAgICAgc2l6ZS0tOworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXNzb2NpYXRpb25Db3VudDsgKytpKSB7CisgICAgICAgICAgICBzaXplX3QgcHJvcEluZGV4U2l6ZSA9IChmbGFncygpICYgMSkgPyAyIDogMTsKKyAgICAgICAgICAgIGlmIChzaXplIDwgcHJvcEluZGV4U2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1aW50MTZfdCBwcm9wSW5kZXg7CisgICAgICAgICAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MTZWYXIob2Zmc2V0LCAmcHJvcEluZGV4LCBwcm9wSW5kZXhTaXplKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9mZnNldCArPSBwcm9wSW5kZXhTaXplOworICAgICAgICAgICAgc2l6ZSAtPSBwcm9wSW5kZXhTaXplOworICAgICAgICAgICAgdWludDE2X3QgYml0bWFzayA9ICgxIDw8ICg4ICogcHJvcEluZGV4U2l6ZSAtIDEpKTsKKyAgICAgICAgICAgIEFzc29jaWF0aW9uRW50cnkgZW50cnkgPSB7CisgICAgICAgICAgICAgICAgICAgIC5pdGVtSWQgPSBpdGVtSWQsCisgICAgICAgICAgICAgICAgICAgIC5lc3NlbnRpYWwgPSAhIShwcm9wSW5kZXggJiBiaXRtYXNrKSwKKyAgICAgICAgICAgICAgICAgICAgLmluZGV4ID0gKHVpbnQxNl90KSAocHJvcEluZGV4ICYgfmJpdG1hc2spCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBBTE9HVigiaXRlbSBpZCAlZCBhc3NvY2lhdGVkIHRvIHByb3BlcnR5ICVkIChlc3NlbnRpYWwgJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgaXRlbUlkLCBlbnRyeS5pbmRleCwgZW50cnkuZXNzZW50aWFsKTsKKworICAgICAgICAgICAgbUFzc29jaWF0aW9ucy0+cHVzaF9iYWNrKGVudHJ5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RydWN0IElwY29Cb3ggOiBwdWJsaWMgQm94IHsKKyAgICBJcGNvQm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIFZlY3RvcjxzcDxJdGVtUHJvcGVydHk+ID4gKnByb3BlcnRpZXMpIDoKKyAgICAgICAgQm94KHNvdXJjZSwgRk9VUkNDKCdpJywgJ3AnLCAnYycsICdvJykpLCBtSXRlbVByb3BlcnRpZXMocHJvcGVydGllcykge30KKworICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7Citwcm90ZWN0ZWQ6CisgICAgc3RhdHVzX3Qgb25DaHVua0RhdGEodWludDMyX3QgdHlwZSwgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBWZWN0b3I8c3A8SXRlbVByb3BlcnR5PiA+ICptSXRlbVByb3BlcnRpZXM7Cit9OworCitzdGF0dXNfdCBJcGNvQm94OjpwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBBTE9HVigiJXM6IG9mZnNldCAlbGxkLCBzaXplICV6dSIsIF9fRlVOQ1RJT05fXywgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOworICAgIC8vIHB1c2ggZHVtbXkgYXMgdGhlIGluZGV4IGlzIDEtYmFzZWQKKyAgICBtSXRlbVByb3BlcnRpZXMtPnB1c2hfYmFjayhuZXcgSXRlbVByb3BlcnR5KCkpOworICAgIHJldHVybiBwYXJzZUNodW5rcyhvZmZzZXQsIHNpemUpOworfQorCitzdGF0dXNfdCBJcGNvQm94OjpvbkNodW5rRGF0YSh1aW50MzJfdCB0eXBlLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBzcDxJdGVtUHJvcGVydHk+IGl0ZW1Qcm9wZXJ0eTsKKyAgICBzd2l0Y2godHlwZSkgeworICAgICAgICBjYXNlIEZPVVJDQygnaCcsICd2JywgJ2MnLCAnQycpOgorICAgICAgICB7CisgICAgICAgICAgICBpdGVtUHJvcGVydHkgPSBuZXcgSHZjY0JveChzb3VyY2UoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQygnaScsICdzJywgJ3AnLCAnZScpOgorICAgICAgICB7CisgICAgICAgICAgICBpdGVtUHJvcGVydHkgPSBuZXcgSXNwZUJveChzb3VyY2UoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQygnaScsICdyJywgJ28nLCAndCcpOgorICAgICAgICB7CisgICAgICAgICAgICBpdGVtUHJvcGVydHkgPSBuZXcgSXJvdEJveChzb3VyY2UoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQygnYycsICdvJywgJ2wnLCAncicpOgorICAgICAgICB7CisgICAgICAgICAgICBpdGVtUHJvcGVydHkgPSBuZXcgQ29sckJveChzb3VyY2UoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICAvLyBwdXNoIGR1bW15IHRvIG1haW50YWluIGNvcnJlY3QgaXRlbSBwcm9wZXJ0eSBpbmRleAorICAgICAgICAgICAgaXRlbVByb3BlcnR5ID0gbmV3IEl0ZW1Qcm9wZXJ0eSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgc3RhdHVzX3QgZXJyID0gaXRlbVByb3BlcnR5LT5wYXJzZShvZmZzZXQsIHNpemUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgbUl0ZW1Qcm9wZXJ0aWVzLT5wdXNoX2JhY2soaXRlbVByb3BlcnR5KTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0cnVjdCBJcHJwQm94IDogcHVibGljIEJveCB7CisgICAgSXBycEJveChEYXRhU291cmNlQmFzZSAqc291cmNlLAorICAgICAgICAgICAgVmVjdG9yPHNwPEl0ZW1Qcm9wZXJ0eT4gPiAqcHJvcGVydGllcywKKyAgICAgICAgICAgIFZlY3RvcjxBc3NvY2lhdGlvbkVudHJ5PiAqYXNzb2NpYXRpb25zKSA6CisgICAgICAgIEJveChzb3VyY2UsIEZPVVJDQygnaScsICdwJywgJ3InLCAncCcpKSwKKyAgICAgICAgbVByb3BlcnRpZXMocHJvcGVydGllcyksIG1Bc3NvY2lhdGlvbnMoYXNzb2NpYXRpb25zKSB7fQorCisgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKK3Byb3RlY3RlZDoKKyAgICBzdGF0dXNfdCBvbkNodW5rRGF0YSh1aW50MzJfdCB0eXBlLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIFZlY3RvcjxzcDxJdGVtUHJvcGVydHk+ID4gKm1Qcm9wZXJ0aWVzOworICAgIFZlY3RvcjxBc3NvY2lhdGlvbkVudHJ5PiAqbUFzc29jaWF0aW9uczsKK307CisKK3N0YXR1c190IElwcnBCb3g6OnBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIEFMT0dWKCIlczogb2Zmc2V0ICVsbGQsIHNpemUgJXp1IiwgX19GVU5DVElPTl9fLCAobG9uZyBsb25nKW9mZnNldCwgc2l6ZSk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUNodW5rcyhvZmZzZXQsIHNpemUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBJcHJwQm94OjpvbkNodW5rRGF0YSh1aW50MzJfdCB0eXBlLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBzd2l0Y2godHlwZSkgeworICAgICAgICBjYXNlIEZPVVJDQygnaScsICdwJywgJ2MnLCAnbycpOgorICAgICAgICB7CisgICAgICAgICAgICBJcGNvQm94IGlwY29Cb3goc291cmNlKCksIG1Qcm9wZXJ0aWVzKTsKKyAgICAgICAgICAgIHJldHVybiBpcGNvQm94LnBhcnNlKG9mZnNldCwgc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAncCcsICdtJywgJ2EnKToKKyAgICAgICAgeworICAgICAgICAgICAgSXBtYUJveCBpcG1hQm94KHNvdXJjZSgpLCBtQXNzb2NpYXRpb25zKTsKKyAgICAgICAgICAgIHJldHVybiBpcG1hQm94LnBhcnNlKG9mZnNldCwgc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgQUxPR1coIlVucmVjb2duaXplZCBib3guIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJdGVtSW5mbyByZWxhdGVkIGJveGVzCisvLworc3RydWN0IEl0ZW1JbmZvIHsKKyAgICB1aW50MzJfdCBpdGVtSWQ7CisgICAgdWludDMyX3QgaXRlbVR5cGU7CisgICAgYm9vbCBoaWRkZW47Cit9OworCitzdHJ1Y3QgSW5mZUJveCA6IHB1YmxpYyBGdWxsQm94IHsKKyAgICBJbmZlQm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UpIDoKKyAgICAgICAgRnVsbEJveChzb3VyY2UsIEZPVVJDQygnaScsICduJywgJ2YnLCAnZScpKSB7fQorCisgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplLCBJdGVtSW5mbyAqaXRlbUluZm8pOworCitwcml2YXRlOgorICAgIGJvb2wgcGFyc2VOdWxsVGVybWluYXRlZFN0cmluZyhvZmY2NF90ICpvZmZzZXQsIHNpemVfdCAqc2l6ZSwgU3RyaW5nOCAqb3V0KTsKK307CisKK2Jvb2wgSW5mZUJveDo6cGFyc2VOdWxsVGVybWluYXRlZFN0cmluZygKKyAgICAgICAgb2ZmNjRfdCAqb2Zmc2V0LCBzaXplX3QgKnNpemUsIFN0cmluZzggKm91dCkgeworICAgIGNoYXIgdG1wOworICAgIFZlY3RvcjxjaGFyPiBidWY7CisgICAgYnVmLnNldENhcGFjaXR5KDI1Nik7CisgICAgb2ZmNjRfdCBuZXdPZmZzZXQgPSAqb2Zmc2V0OworICAgIG9mZjY0X3Qgc3RvcE9mZnNldCA9ICpvZmZzZXQgKyAqc2l6ZTsKKyAgICB3aGlsZSAobmV3T2Zmc2V0IDwgc3RvcE9mZnNldCkgeworICAgICAgICBpZiAoIXNvdXJjZSgpLT5yZWFkQXQobmV3T2Zmc2V0KyssICZ0bXAsIDEpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgYnVmLnB1c2hfYmFjayh0bXApOworICAgICAgICBpZiAodG1wID09IDApIHsKKyAgICAgICAgICAgIG91dC0+c2V0VG8oYnVmLmFycmF5KCkpOworCisgICAgICAgICAgICAqb2Zmc2V0ID0gbmV3T2Zmc2V0OworICAgICAgICAgICAgKnNpemUgPSBzdG9wT2Zmc2V0IC0gbmV3T2Zmc2V0OworCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXR1c190IEluZmVCb3g6OnBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgSXRlbUluZm8gKml0ZW1JbmZvKSB7CisgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VGdWxsQm94SGVhZGVyKCZvZmZzZXQsICZzaXplKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKHZlcnNpb24oKSA9PSAwIHx8IHZlcnNpb24oKSA9PSAxKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9IGVsc2UgeyAvLyB2ZXJzaW9uID49IDIKKyAgICAgICAgdWludDMyX3QgaXRlbV9pZDsKKyAgICAgICAgc2l6ZV90IGl0ZW1JZFNpemUgPSAodmVyc2lvbigpID09IDIpID8gMiA6IDQ7CisgICAgICAgIGlmIChzaXplIDwgaXRlbUlkU2l6ZSArIDYpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDMyVmFyKG9mZnNldCwgJml0ZW1faWQsIGl0ZW1JZFNpemUpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIml0ZW1faWQgJWQiLCBpdGVtX2lkKTsKKyAgICAgICAgb2Zmc2V0ICs9IGl0ZW1JZFNpemU7CisgICAgICAgIHVpbnQxNl90IGl0ZW1fcHJvdGVjdGlvbl9pbmRleDsKKyAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDE2KG9mZnNldCwgJml0ZW1fcHJvdGVjdGlvbl9pbmRleCkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiaXRlbV9wcm90ZWN0aW9uX2luZGV4ICVkIiwgaXRlbV9wcm90ZWN0aW9uX2luZGV4KTsKKyAgICAgICAgb2Zmc2V0ICs9IDI7CisgICAgICAgIHVpbnQzMl90IGl0ZW1fdHlwZTsKKyAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDMyKG9mZnNldCwgJml0ZW1fdHlwZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfQorCisgICAgICAgIGl0ZW1JbmZvLT5pdGVtSWQgPSBpdGVtX2lkOworICAgICAgICBpdGVtSW5mby0+aXRlbVR5cGUgPSBpdGVtX3R5cGU7CisgICAgICAgIC8vIEFjY29yZGluZyB0byBIRUlGIHNwZWMsIChmbGFncyAmIDEpIGluZGljYXRlcyB0aGUgaW1hZ2UgaXMgaGlkZGVuCisgICAgICAgIC8vIGFuZCBub3Qgc3VwcG9zZWQgdG8gYmUgZGlzcGxheWVkLgorICAgICAgICBpdGVtSW5mby0+aGlkZGVuID0gKGZsYWdzKCkgJiAxKTsKKworICAgICAgICBjaGFyIGl0ZW1UeXBlU3RyaW5nWzVdOworICAgICAgICBNYWtlRm91ckNDU3RyaW5nKGl0ZW1fdHlwZSwgaXRlbVR5cGVTdHJpbmcpOworICAgICAgICBBTE9HVigiaXRlbV90eXBlICVzIiwgaXRlbVR5cGVTdHJpbmcpOworICAgICAgICBvZmZzZXQgKz0gNDsKKyAgICAgICAgc2l6ZSAtPSBpdGVtSWRTaXplICsgNjsKKworICAgICAgICBTdHJpbmc4IGl0ZW1fbmFtZTsKKyAgICAgICAgaWYgKCFwYXJzZU51bGxUZXJtaW5hdGVkU3RyaW5nKCZvZmZzZXQsICZzaXplLCAmaXRlbV9uYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiaXRlbV9uYW1lICVzIiwgaXRlbV9uYW1lLmNfc3RyKCkpOworCisgICAgICAgIGlmIChpdGVtX3R5cGUgPT0gRk9VUkNDKCdtJywgJ2knLCAnbScsICdlJykpIHsKKyAgICAgICAgICAgIFN0cmluZzggY29udGVudF90eXBlOworICAgICAgICAgICAgaWYgKCFwYXJzZU51bGxUZXJtaW5hdGVkU3RyaW5nKCZvZmZzZXQsICZzaXplLCAmY29udGVudF90eXBlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGNvbnRlbnRfZW5jb2RpbmcgaXMgb3B0aW9uYWw7IGNhbiBiZSBvbWl0dGVkIGlmIHdvdWxkIGJlIGVtcHR5CisgICAgICAgICAgICBpZiAoc2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBTdHJpbmc4IGNvbnRlbnRfZW5jb2Rpbmc7CisgICAgICAgICAgICAgICAgaWYgKCFwYXJzZU51bGxUZXJtaW5hdGVkU3RyaW5nKCZvZmZzZXQsICZzaXplLCAmY29udGVudF9lbmNvZGluZykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoaXRlbV90eXBlID09IEZPVVJDQygndScsICdyJywgJ2knLCAnICcpKSB7CisgICAgICAgICAgICBTdHJpbmc4IGl0ZW1fdXJpX3R5cGU7CisgICAgICAgICAgICBpZiAoIXBhcnNlTnVsbFRlcm1pbmF0ZWRTdHJpbmcoJm9mZnNldCwgJnNpemUsICZpdGVtX3VyaV90eXBlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdHJ1Y3QgSWluZkJveCA6IHB1YmxpYyBGdWxsQm94IHsKKyAgICBJaW5mQm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIFZlY3RvcjxJdGVtSW5mbz4gKml0ZW1JbmZvcykgOgorICAgICAgICBGdWxsQm94KHNvdXJjZSwgRk9VUkNDKCdpJywgJ2knLCAnbicsICdmJykpLAorICAgICAgICBtSXRlbUluZm9zKGl0ZW1JbmZvcyksIG1IYXNHcmlkcyhmYWxzZSkge30KKworICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CisKKyAgICBib29sIGhhc0dyaWRzKCkgeyByZXR1cm4gbUhhc0dyaWRzOyB9CisKK3Byb3RlY3RlZDoKKyAgICBzdGF0dXNfdCBvbkNodW5rRGF0YSh1aW50MzJfdCB0eXBlLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIFZlY3RvcjxJdGVtSW5mbz4gKm1JdGVtSW5mb3M7CisgICAgYm9vbCBtSGFzR3JpZHM7Cit9OworCitzdGF0dXNfdCBJaW5mQm94OjpwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBBTE9HVigiJXM6IG9mZnNldCAlbGxkLCBzaXplICV6dSIsIF9fRlVOQ1RJT05fXywgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOworCisgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VGdWxsQm94SGVhZGVyKCZvZmZzZXQsICZzaXplKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgc2l6ZV90IGVudHJ5Q291bnRTaXplID0gdmVyc2lvbigpID09IDAgPyAyIDogNDsKKyAgICBpZiAoc2l6ZSA8IGVudHJ5Q291bnRTaXplKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIHVpbnQzMl90IGVudHJ5X2NvdW50OworICAgIGlmICghc291cmNlKCktPmdldFVJbnQzMlZhcihvZmZzZXQsICZlbnRyeV9jb3VudCwgZW50cnlDb3VudFNpemUpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisgICAgQUxPR1YoImVudHJ5X2NvdW50ICVkIiwgZW50cnlfY291bnQpOworCisgICAgb2ZmNjRfdCBzdG9wT2Zmc2V0ID0gb2Zmc2V0ICsgc2l6ZTsKKyAgICBvZmZzZXQgKz0gZW50cnlDb3VudFNpemU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbnRyeV9jb3VudCAmJiBvZmZzZXQgPCBzdG9wT2Zmc2V0OyBpKyspIHsKKyAgICAgICAgQUxPR1YoImVudHJ5ICV6dSIsIGkpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUNodW5rKCZvZmZzZXQpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorICAgIGlmIChvZmZzZXQgIT0gc3RvcE9mZnNldCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgSWluZkJveDo6b25DaHVua0RhdGEodWludDMyX3QgdHlwZSwgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKHR5cGUgIT0gRk9VUkNDKCdpJywgJ24nLCAnZicsICdlJykpIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIEluZmVCb3ggaW5mZUJveChzb3VyY2UoKSk7CisgICAgSXRlbUluZm8gaXRlbUluZm87CisgICAgc3RhdHVzX3QgZXJyID0gaW5mZUJveC5wYXJzZShvZmZzZXQsIHNpemUsICZpdGVtSW5mbyk7CisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICBtSXRlbUluZm9zLT5wdXNoX2JhY2soaXRlbUluZm8pOworICAgICAgICBtSGFzR3JpZHMgfD0gKGl0ZW1JbmZvLml0ZW1UeXBlID09IEZPVVJDQygnZycsICdyJywgJ2knLCAnZCcpKTsKKyAgICB9CisgICAgLy8gSW5mZUJveCBwYXJzZSByZXR1cm5zIEVSUk9SX1VOU1VQUE9SVEVEIGlmIHRoZSBib3ggaWYgYW4gdW5zdXBwb3J0ZWQKKyAgICAvLyB2ZXJzaW9uLiBJZ25vcmUgdGhpcyBlcnJvciBhcyBpdCdzIG5vdCBmYXRhbC4KKyAgICByZXR1cm4gKGVyciA9PSBFUlJPUl9VTlNVUFBPUlRFRCkgPyBPSyA6IGVycjsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0l0ZW1UYWJsZTo6SXRlbVRhYmxlKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCisgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAorICAgICAgbVByaW1hcnlJdGVtSWQoMCksCisgICAgICBtSWRhdE9mZnNldCgwKSwKKyAgICAgIG1JZGF0U2l6ZSgwKSwKKyAgICAgIG1JbWFnZUl0ZW1zVmFsaWQoZmFsc2UpLAorICAgICAgbUN1cnJlbnRJdGVtSW5kZXgoMCkgeworICAgIG1SZXF1aXJlZEJveGVzLmluc2VydCgnaXBycCcpOworICAgIG1SZXF1aXJlZEJveGVzLmluc2VydCgnaWxvYycpOworICAgIG1SZXF1aXJlZEJveGVzLmluc2VydCgncGl0bScpOworICAgIG1SZXF1aXJlZEJveGVzLmluc2VydCgnaWluZicpOworfQorCitJdGVtVGFibGU6On5JdGVtVGFibGUoKSB7fQorCitzdGF0dXNfdCBJdGVtVGFibGU6OnBhcnNlKHVpbnQzMl90IHR5cGUsIG9mZjY0X3QgZGF0YV9vZmZzZXQsIHNpemVfdCBjaHVua19kYXRhX3NpemUpIHsKKyAgICBzd2l0Y2godHlwZSkgeworICAgICAgICBjYXNlIEZPVVJDQygnaScsICdsJywgJ28nLCAnYycpOgorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcGFyc2VJbG9jQm94KGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOworICAgICAgICB9CisgICAgICAgIGNhc2UgRk9VUkNDKCdpJywgJ2knLCAnbicsICdmJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBwYXJzZUlpbmZCb3goZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAncCcsICdyJywgJ3AnKToKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHBhcnNlSXBycEJveChkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQygncCcsICdpJywgJ3QnLCAnbScpOgorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcGFyc2VQaXRtQm94KGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOworICAgICAgICB9CisgICAgICAgIGNhc2UgRk9VUkNDKCdpJywgJ2QnLCAnYScsICd0Jyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBwYXJzZUlkYXRCb3goZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAncicsICdlJywgJ2YnKToKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHBhcnNlSXJlZkJveChkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQygnaScsICdwJywgJ3InLCAnbycpOgorICAgICAgICB7CisgICAgICAgICAgICBBTE9HVygiaXBybyBib3ggbm90IHN1cHBvcnRlZCEiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIEFMT0dXKCJ1bnJlY29nbml6ZWQgYm94IHR5cGU6IDB4JXgiLCB0eXBlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdHVzX3QgSXRlbVRhYmxlOjpwYXJzZUlsb2NCb3gob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgQUxPR1YoIiVzOiBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKKworICAgIElsb2NCb3ggaWxvY0JveChtRGF0YVNvdXJjZSwgJm1JdGVtTG9jcyk7CisgICAgc3RhdHVzX3QgZXJyID0gaWxvY0JveC5wYXJzZShvZmZzZXQsIHNpemUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoaWxvY0JveC5oYXNDb25zdHJ1Y3RNZXRob2QxKCkpIHsKKyAgICAgICAgbVJlcXVpcmVkQm94ZXMuaW5zZXJ0KCdpZGF0Jyk7CisgICAgfQorCisgICAgcmV0dXJuIGJ1aWxkSW1hZ2VJdGVtc0lmUG9zc2libGUoJ2lsb2MnKTsKK30KKworc3RhdHVzX3QgSXRlbVRhYmxlOjpwYXJzZUlpbmZCb3gob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgQUxPR1YoIiVzOiBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKKworICAgIElpbmZCb3ggaWluZkJveChtRGF0YVNvdXJjZSwgJm1JdGVtSW5mb3MpOworICAgIHN0YXR1c190IGVyciA9IGlpbmZCb3gucGFyc2Uob2Zmc2V0LCBzaXplKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKGlpbmZCb3guaGFzR3JpZHMoKSkgeworICAgICAgICBtUmVxdWlyZWRCb3hlcy5pbnNlcnQoJ2lyZWYnKTsKKyAgICB9CisKKyAgICByZXR1cm4gYnVpbGRJbWFnZUl0ZW1zSWZQb3NzaWJsZSgnaWluZicpOworfQorCitzdGF0dXNfdCBJdGVtVGFibGU6OnBhcnNlUGl0bUJveChvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBBTE9HVigiJXM6IG9mZnNldCAlbGxkLCBzaXplICV6dSIsIF9fRlVOQ1RJT05fXywgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOworCisgICAgUGl0bUJveCBwaXRtQm94KG1EYXRhU291cmNlKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBwaXRtQm94LnBhcnNlKG9mZnNldCwgc2l6ZSwgJm1QcmltYXJ5SXRlbUlkKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgcmV0dXJuIGJ1aWxkSW1hZ2VJdGVtc0lmUG9zc2libGUoJ3BpdG0nKTsKK30KKworc3RhdHVzX3QgSXRlbVRhYmxlOjpwYXJzZUlwcnBCb3gob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgQUxPR1YoIiVzOiBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKKworICAgIElwcnBCb3ggaXBycEJveChtRGF0YVNvdXJjZSwgJm1JdGVtUHJvcGVydGllcywgJm1Bc3NvY2lhdGlvbnMpOworICAgIHN0YXR1c190IGVyciA9IGlwcnBCb3gucGFyc2Uob2Zmc2V0LCBzaXplKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgcmV0dXJuIGJ1aWxkSW1hZ2VJdGVtc0lmUG9zc2libGUoJ2lwcnAnKTsKK30KKworc3RhdHVzX3QgSXRlbVRhYmxlOjpwYXJzZUlkYXRCb3gob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgQUxPR1YoIiVzOiBpZGF0IG9mZnNldCAlbGxkLCBzaXplICV6dSIsIF9fRlVOQ1RJT05fXywgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOworCisgICAgLy8gb25seSByZW1lbWJlciB0aGUgb2Zmc2V0IGFuZCBzaXplIG9mIGlkYXQgYm94IGZvciBsYXRlciB1c2UKKyAgICBtSWRhdE9mZnNldCA9IG9mZnNldDsKKyAgICBtSWRhdFNpemUgPSBzaXplOworCisgICAgcmV0dXJuIGJ1aWxkSW1hZ2VJdGVtc0lmUG9zc2libGUoJ2lkYXQnKTsKK30KKworc3RhdHVzX3QgSXRlbVRhYmxlOjpwYXJzZUlyZWZCb3gob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgQUxPR1YoIiVzOiBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKKworICAgIElyZWZCb3ggaXJlZkJveChtRGF0YVNvdXJjZSwgJm1JdGVtUmVmZXJlbmNlcyk7CisgICAgc3RhdHVzX3QgZXJyID0gaXJlZkJveC5wYXJzZShvZmZzZXQsIHNpemUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICByZXR1cm4gYnVpbGRJbWFnZUl0ZW1zSWZQb3NzaWJsZSgnaXJlZicpOworfQorCitzdGF0dXNfdCBJdGVtVGFibGU6OmJ1aWxkSW1hZ2VJdGVtc0lmUG9zc2libGUodWludDMyX3QgdHlwZSkgeworICAgIGlmIChtSW1hZ2VJdGVtc1ZhbGlkKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBtQm94ZXNTZWVuLmluc2VydCh0eXBlKTsKKworICAgIC8vIG5lZWQgYXQgbGVhc3QgJ2lwcnAnLCAnaWxvYycsICdwaXRtJywgJ2lpbmYnOworICAgIC8vIG5lZWQgJ2lkYXQnIGlmIGFueSBpdGVtcyB1c2VkIGNvbnN0cnVjdGlvbl9tZXRob2Qgb2YgMjsKKyAgICAvLyBuZWVkICdpcmVmJyBpZiB0aGVyZSBhcmUgZ3JpZHMuCisgICAgaWYgKCFzdGQ6OmluY2x1ZGVzKAorICAgICAgICAgICAgbUJveGVzU2Vlbi5iZWdpbigpLCBtQm94ZXNTZWVuLmVuZCgpLAorICAgICAgICAgICAgbVJlcXVpcmVkQm94ZXMuYmVnaW4oKSwgbVJlcXVpcmVkQm94ZXMuZW5kKCkpKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBBTE9HVigiYnVpbGRpbmcgaW1hZ2UgdGFibGUuLi4iKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUl0ZW1JbmZvcy5zaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBJdGVtSW5mbyAmaW5mbyA9IG1JdGVtSW5mb3NbaV07CisKKyAgICAgICAgLy8gT25seSBoYW5kbGUgMyB0eXBlcyBvZiBpdGVtcywgYWxsIG90aGVycyBhcmUgaWdub3JlZDoKKyAgICAgICAgLy8gICAnZ3JpZCc6IGRlcml2ZWQgaW1hZ2UgZnJvbSB0aWxlcworICAgICAgICAvLyAgICdodmMxJzogY29kZWQgaW1hZ2UgKG9yIHRpbGUpCisgICAgICAgIC8vICAgJ0V4aWYnOiBFWElGIG1ldGFkYXRhCisgICAgICAgIGlmIChpbmZvLml0ZW1UeXBlICE9IEZPVVJDQygnZycsICdyJywgJ2knLCAnZCcpICYmCisgICAgICAgICAgICBpbmZvLml0ZW1UeXBlICE9IEZPVVJDQygnaCcsICd2JywgJ2MnLCAnMScpICYmCisgICAgICAgICAgICBpbmZvLml0ZW1UeXBlICE9IEZPVVJDQygnRScsICd4JywgJ2knLCAnZicpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHNzaXplX3QgaXRlbUluZGV4ID0gbUl0ZW1JZFRvSXRlbU1hcC5pbmRleE9mS2V5KGluZm8uaXRlbUlkKTsKKyAgICAgICAgaWYgKGl0ZW1JbmRleCA+PSAwKSB7CisgICAgICAgICAgICBBTE9HVygiaWdub3JpbmcgZHVwbGljYXRlIGltYWdlIGl0ZW0gaWQgJWQiLCBpbmZvLml0ZW1JZCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHNzaXplX3QgaWxvY0luZGV4ID0gbUl0ZW1Mb2NzLmluZGV4T2ZLZXkoaW5mby5pdGVtSWQpOworICAgICAgICBpZiAoaWxvY0luZGV4IDwgMCkgeworICAgICAgICAgICAgQUxPR0UoImlsb2MgbWlzc2luZyBmb3IgaW1hZ2UgaXRlbSBpZCAlZCIsIGluZm8uaXRlbUlkKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGNvbnN0IEl0ZW1Mb2MgJmlsb2MgPSBtSXRlbUxvY3NbaWxvY0luZGV4XTsKKworICAgICAgICBvZmY2NF90IG9mZnNldDsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgIGlmIChpbG9jLmdldExvYygmb2Zmc2V0LCAmc2l6ZSwgbUlkYXRPZmZzZXQsIG1JZGF0U2l6ZSkgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW5mby5pdGVtVHlwZSA9PSBGT1VSQ0MoJ0UnLCAneCcsICdpJywgJ2YnKSkgeworICAgICAgICAgICAgLy8gT25seSBhZGQgaWYgdGhlIEV4aWYgZGF0YSBpcyBub24tZW1wdHkuIFRoZSBmaXJzdCA0IGJ5dGVzIGNvbnRhaW4KKyAgICAgICAgICAgIC8vIHRoZSBvZmZzZXQgdG8gVElGRiBoZWFkZXIsIHdoaWNoIHRoZSBFeGlmIHBhcnNlciBkb2Vzbid0IHVzZS4KKyAgICAgICAgICAgIGlmIChzaXplID4gNCkgeworICAgICAgICAgICAgICAgIEV4aWZJdGVtIGV4aWZJdGVtID0geworICAgICAgICAgICAgICAgICAgICAgICAgLm9mZnNldCA9IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zaXplID0gc2l6ZSwKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIG1JdGVtSWRUb0V4aWZNYXAuYWRkKGluZm8uaXRlbUlkLCBleGlmSXRlbSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEltYWdlSXRlbSBpbWFnZShpbmZvLml0ZW1UeXBlLCBpbmZvLml0ZW1JZCwgaW5mby5oaWRkZW4pOworCisgICAgICAgIEFMT0dWKCJhZGRpbmcgJXM6IGl0ZW1JZCAlZCIsIGltYWdlLmlzR3JpZCgpID8gImdyaWQiIDogImltYWdlIiwgaW5mby5pdGVtSWQpOworCisgICAgICAgIGlmIChpbWFnZS5pc0dyaWQoKSkgeworICAgICAgICAgICAgLy8gSW1hZ2VHcmlkIHN0cnVjdCBpcyBhdCBsZWFzdCA4LWJ5dGUsIGF0IG1vc3QgMTItYnl0ZSAoaWYgZmxhZ3MmMSkKKyAgICAgICAgICAgIGlmIChzaXplIDwgOCB8fCBzaXplID4gMTIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWludDhfdCBidWZbMTJdOworICAgICAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgYnVmLCBzaXplKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW1hZ2Uucm93cyA9IGJ1ZlsyXSArIDE7CisgICAgICAgICAgICBpbWFnZS5jb2x1bW5zID0gYnVmWzNdICsgMTsKKworICAgICAgICAgICAgQUxPR1YoInJvd3MgJWQsIGNvbHVtYW5zICVkIiwgaW1hZ2Uucm93cywgaW1hZ2UuY29sdW1ucyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbWFnZS5vZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgICAgICBpbWFnZS5zaXplID0gc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBtSXRlbUlkVG9JdGVtTWFwLmFkZChpbmZvLml0ZW1JZCwgaW1hZ2UpOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUFzc29jaWF0aW9ucy5zaXplKCk7IGkrKykgeworICAgICAgICBhdHRhY2hQcm9wZXJ0eShtQXNzb2NpYXRpb25zW2ldKTsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JdGVtUmVmZXJlbmNlcy5zaXplKCk7IGkrKykgeworICAgICAgICBtSXRlbVJlZmVyZW5jZXNbaV0tPmFwcGx5KG1JdGVtSWRUb0l0ZW1NYXAsIG1JdGVtSWRUb0V4aWZNYXApOworICAgIH0KKworICAgIGJvb2wgZm91bmRQcmltYXJ5ID0gZmFsc2U7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSXRlbUlkVG9JdGVtTWFwLnNpemUoKTsgaSsrKSB7CisgICAgICAgIC8vIGFkZCBhbGwgbm9uLWhpZGRlbiBpbWFnZXMsIGFsc28gYWRkIHRoZSBwcmltYXJ5IGV2ZW4gaWYgaXQncyBtYXJrZWQKKyAgICAgICAgLy8gaGlkZGVuLCBpbiBjYXNlIHRoZSBwcmltYXJ5IGlzIHNldCB0byBhIHRodW1ibmFpbAorICAgICAgICBib29sIGlzUHJpbWFyeSA9IChtSXRlbUlkVG9JdGVtTWFwW2ldLml0ZW1JZCA9PSBtUHJpbWFyeUl0ZW1JZCk7CisgICAgICAgIGlmICghbUl0ZW1JZFRvSXRlbU1hcFtpXS5oaWRkZW4gfHwgaXNQcmltYXJ5KSB7CisgICAgICAgICAgICBtRGlzcGxheWFibGVzLnB1c2hfYmFjayhpKTsKKyAgICAgICAgfQorICAgICAgICBmb3VuZFByaW1hcnkgfD0gaXNQcmltYXJ5OworICAgIH0KKworICAgIEFMT0dWKCJmb3VuZCAlenUgZGlzcGxheWFibGVzIiwgbURpc3BsYXlhYmxlcy5zaXplKCkpOworCisgICAgLy8gZmFpbCBpZiBubyBkaXNwbGF5YWJsZXMgYXJlIGZvdW5kCisgICAgaWYgKG1EaXNwbGF5YWJsZXMuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIC8vIGlmIHRoZSBwcmltYXJ5IGl0ZW0gaWQgaXMgaW52YWxpZCwgc2V0IHByaW1hcnkgdG8gdGhlIGZpcnN0IGRpc3BsYXlhYmxlCisgICAgaWYgKCFmb3VuZFByaW1hcnkpIHsKKyAgICAgICAgbVByaW1hcnlJdGVtSWQgPSBtSXRlbUlkVG9JdGVtTWFwW21EaXNwbGF5YWJsZXNbMF1dLml0ZW1JZDsKKyAgICB9CisKKyAgICBtSW1hZ2VJdGVtc1ZhbGlkID0gdHJ1ZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgSXRlbVRhYmxlOjphdHRhY2hQcm9wZXJ0eShjb25zdCBBc3NvY2lhdGlvbkVudHJ5ICZhc3NvY2lhdGlvbikgeworICAgIHNzaXplX3QgaXRlbUluZGV4ID0gbUl0ZW1JZFRvSXRlbU1hcC5pbmRleE9mS2V5KGFzc29jaWF0aW9uLml0ZW1JZCk7CisKKyAgICAvLyBpZ25vcmUgbm9uLWltYWdlIGl0ZW1zCisgICAgaWYgKGl0ZW1JbmRleCA8IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQxNl90IHByb3BlcnR5SW5kZXggPSBhc3NvY2lhdGlvbi5pbmRleDsKKyAgICBpZiAocHJvcGVydHlJbmRleCA+PSBtSXRlbVByb3BlcnRpZXMuc2l6ZSgpKSB7CisgICAgICAgIEFMT0dXKCJJZ25vcmluZyBpbnZhbGlkIHByb3BlcnR5IGluZGV4ICVkIiwgcHJvcGVydHlJbmRleCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBTE9HVigiYXR0YWNoIHByb3BlcnR5ICVkIHRvIGl0ZW0gaWQgJWQpIiwKKyAgICAgICAgICAgIHByb3BlcnR5SW5kZXgsIGFzc29jaWF0aW9uLml0ZW1JZCk7CisKKyAgICBtSXRlbVByb3BlcnRpZXNbcHJvcGVydHlJbmRleF0tPmF0dGFjaFRvKG1JdGVtSWRUb0l0ZW1NYXAuZWRpdFZhbHVlQXQoaXRlbUluZGV4KSk7Cit9CisKK3VpbnQzMl90IEl0ZW1UYWJsZTo6Y291bnRJbWFnZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbWFnZUl0ZW1zVmFsaWQgPyBtRGlzcGxheWFibGVzLnNpemUoKSA6IDA7Cit9CisKK3NwPE1ldGFEYXRhPiBJdGVtVGFibGU6OmdldEltYWdlTWV0YShjb25zdCB1aW50MzJfdCBpbWFnZUluZGV4KSB7CisgICAgaWYgKCFtSW1hZ2VJdGVtc1ZhbGlkKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChpbWFnZUluZGV4ID49IG1EaXNwbGF5YWJsZXMuc2l6ZSgpKSB7CisgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCBpbWFnZSBpbmRleCAldSIsIF9fRlVOQ1RJT05fXywgaW1hZ2VJbmRleCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBjb25zdCB1aW50MzJfdCBpdGVtSW5kZXggPSBtRGlzcGxheWFibGVzW2ltYWdlSW5kZXhdOworICAgIEFMT0dWKCJpbWFnZVsldV06IGl0ZW0gaW5kZXggJXUiLCBpbWFnZUluZGV4LCBpdGVtSW5kZXgpOworCisgICAgY29uc3QgSW1hZ2VJdGVtICppbWFnZSA9ICZtSXRlbUlkVG9JdGVtTWFwW2l0ZW1JbmRleF07CisKKyAgICBzc2l6ZV90IHRpbGVJdGVtSW5kZXggPSAtMTsKKyAgICBpZiAoaW1hZ2UtPmlzR3JpZCgpKSB7CisgICAgICAgIGlmIChpbWFnZS0+ZGltZ1JlZnMuZW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgdGlsZUl0ZW1JbmRleCA9IG1JdGVtSWRUb0l0ZW1NYXAuaW5kZXhPZktleShpbWFnZS0+ZGltZ1JlZnNbMF0pOworICAgICAgICBpZiAodGlsZUl0ZW1JbmRleCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7CisgICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQyk7CisKKyAgICBpZiAoaW1hZ2UtPml0ZW1JZCA9PSBtUHJpbWFyeUl0ZW1JZCkgeworICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5VHJhY2tJc0RlZmF1bHQsIDEpOworICAgIH0KKworICAgIEFMT0dWKCJpbWFnZVsldV06IHNpemUgJWR4JWQiLCBpbWFnZUluZGV4LCBpbWFnZS0+d2lkdGgsIGltYWdlLT5oZWlnaHQpOworCisgICAgbWV0YS0+c2V0SW50MzIoa0tleVdpZHRoLCBpbWFnZS0+d2lkdGgpOworICAgIG1ldGEtPnNldEludDMyKGtLZXlIZWlnaHQsIGltYWdlLT5oZWlnaHQpOworICAgIGlmIChpbWFnZS0+cm90YXRpb24gIT0gMCkgeworICAgICAgICAvLyBSb3RhdGlvbiBhbmdsZSBpbiBIRUlGIGlzIENDVywgY29udmVydCB0byBDVyBoZXJlIHRvIGJlCisgICAgICAgIC8vIGNvbnNpc3RlbnQgd2l0aCB0aGUgb3RoZXIgbWVkaWEgZm9ybWF0cy4KKyAgICAgICAgc3dpdGNoKGltYWdlLT5yb3RhdGlvbikgeworICAgICAgICAgICAgY2FzZSA5MDogbWV0YS0+c2V0SW50MzIoa0tleVJvdGF0aW9uLCAyNzApOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTgwOiBtZXRhLT5zZXRJbnQzMihrS2V5Um90YXRpb24sIDE4MCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNzA6IG1ldGEtPnNldEludDMyKGtLZXlSb3RhdGlvbiwgOTApOyBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrOyAvLyBkb24ndCBzZXQgaWYgaW52YWxpZAorICAgICAgICB9CisgICAgfQorICAgIG1ldGEtPnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIGltYWdlLT53aWR0aCAqIGltYWdlLT5oZWlnaHQgKiAxLjUpOworCisgICAgaWYgKCFpbWFnZS0+dGh1bWJuYWlscy5lbXB0eSgpKSB7CisgICAgICAgIHNzaXplX3QgdGh1bWJJdGVtSW5kZXggPSBtSXRlbUlkVG9JdGVtTWFwLmluZGV4T2ZLZXkoaW1hZ2UtPnRodW1ibmFpbHNbMF0pOworICAgICAgICBpZiAodGh1bWJJdGVtSW5kZXggPj0gMCkgeworICAgICAgICAgICAgY29uc3QgSW1hZ2VJdGVtICZ0aHVtYm5haWwgPSBtSXRlbUlkVG9JdGVtTWFwW3RodW1iSXRlbUluZGV4XTsKKworICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVRodW1ibmFpbFdpZHRoLCB0aHVtYm5haWwud2lkdGgpOworICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVRodW1ibmFpbEhlaWdodCwgdGh1bWJuYWlsLmhlaWdodCk7CisgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlUaHVtYm5haWxIVkNDLCBrVHlwZUhWQ0MsCisgICAgICAgICAgICAgICAgICAgIHRodW1ibmFpbC5odmNjLT5kYXRhKCksIHRodW1ibmFpbC5odmNjLT5zaXplKCkpOworICAgICAgICAgICAgQUxPR1YoImltYWdlWyV1XTogdGh1bWJuYWlsOiBzaXplICVkeCVkLCBpdGVtIGluZGV4ICV6ZCIsCisgICAgICAgICAgICAgICAgICAgIGltYWdlSW5kZXgsIHRodW1ibmFpbC53aWR0aCwgdGh1bWJuYWlsLmhlaWdodCwgdGh1bWJJdGVtSW5kZXgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coIiVzOiBSZWZlcmVuY2VkIHRodW1ibmFpbCBkb2VzIG5vdCBleGlzdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGltYWdlLT5pc0dyaWQoKSkgeworICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5R3JpZFJvd3MsIGltYWdlLT5yb3dzKTsKKyAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUdyaWRDb2xzLCBpbWFnZS0+Y29sdW1ucyk7CisKKyAgICAgICAgLy8gcG9pbnQgaW1hZ2UgdG8gdGhlIGZpcnN0IHRpbGUgZm9yIGdyaWQgc2l6ZSBhbmQgSFZDQworICAgICAgICBpbWFnZSA9ICZtSXRlbUlkVG9JdGVtTWFwLmVkaXRWYWx1ZUF0KHRpbGVJdGVtSW5kZXgpOworICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5VGlsZVdpZHRoLCBpbWFnZS0+d2lkdGgpOworICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5VGlsZUhlaWdodCwgaW1hZ2UtPmhlaWdodCk7CisgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIGltYWdlLT53aWR0aCAqIGltYWdlLT5oZWlnaHQgKiAxLjUpOworICAgIH0KKworICAgIGlmIChpbWFnZS0+aHZjYyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogaHZjYyBpcyBtaXNzaW5nIGZvciBpbWFnZVsldV0hIiwgX19GVU5DVElPTl9fLCBpbWFnZUluZGV4KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG1ldGEtPnNldERhdGEoa0tleUhWQ0MsIGtUeXBlSFZDQywgaW1hZ2UtPmh2Y2MtPmRhdGEoKSwgaW1hZ2UtPmh2Y2MtPnNpemUoKSk7CisKKyAgICBpZiAoaW1hZ2UtPmljYyAhPSBOVUxMKSB7CisgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUljY1Byb2ZpbGUsIDAsIGltYWdlLT5pY2MtPmRhdGEoKSwgaW1hZ2UtPmljYy0+c2l6ZSgpKTsKKyAgICB9CisgICAgcmV0dXJuIG1ldGE7Cit9CisKK3N0YXR1c190IEl0ZW1UYWJsZTo6ZmluZEltYWdlSXRlbShjb25zdCB1aW50MzJfdCBpbWFnZUluZGV4LCB1aW50MzJfdCAqaXRlbUluZGV4KSB7CisgICAgaWYgKCFtSW1hZ2VJdGVtc1ZhbGlkKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAoaW1hZ2VJbmRleCA+PSBtRGlzcGxheWFibGVzLnNpemUoKSkgeworICAgICAgICBBTE9HRSgiJXM6IGludmFsaWQgaW1hZ2UgaW5kZXggJWQiLCBfX0ZVTkNUSU9OX18sIGltYWdlSW5kZXgpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgICppdGVtSW5kZXggPSBtRGlzcGxheWFibGVzW2ltYWdlSW5kZXhdOworCisgICAgQUxPR1YoImltYWdlWyV1XTogaXRlbSBpbmRleCAldSIsIGltYWdlSW5kZXgsICppdGVtSW5kZXgpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgSXRlbVRhYmxlOjpmaW5kVGh1bWJuYWlsSXRlbShjb25zdCB1aW50MzJfdCBpbWFnZUluZGV4LCB1aW50MzJfdCAqaXRlbUluZGV4KSB7CisgICAgaWYgKCFtSW1hZ2VJdGVtc1ZhbGlkKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAoaW1hZ2VJbmRleCA+PSBtRGlzcGxheWFibGVzLnNpemUoKSkgeworICAgICAgICBBTE9HRSgiJXM6IGludmFsaWQgaW1hZ2UgaW5kZXggJWQiLCBfX0ZVTkNUSU9OX18sIGltYWdlSW5kZXgpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHVpbnQzMl90IG1hc3Rlckl0ZW1JbmRleCA9IG1EaXNwbGF5YWJsZXNbaW1hZ2VJbmRleF07CisKKyAgICBjb25zdCBJbWFnZUl0ZW0gJm1hc3RlckltYWdlID0gbUl0ZW1JZFRvSXRlbU1hcFttYXN0ZXJJdGVtSW5kZXhdOworICAgIGlmIChtYXN0ZXJJbWFnZS50aHVtYm5haWxzLmVtcHR5KCkpIHsKKyAgICAgICAgKml0ZW1JbmRleCA9IG1hc3Rlckl0ZW1JbmRleDsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHNzaXplX3QgdGh1bWJJdGVtSW5kZXggPSBtSXRlbUlkVG9JdGVtTWFwLmluZGV4T2ZLZXkobWFzdGVySW1hZ2UudGh1bWJuYWlsc1swXSk7CisgICAgaWYgKHRodW1iSXRlbUluZGV4IDwgMCkgeworICAgICAgICAvLyBEbyBub3QgcmV0dXJuIHRoZSBtYXN0ZXIgaW1hZ2UgaW4gdGhpcyBjYXNlLCBmYWlsIGl0IHNvIHRoYXQgdGhlCisgICAgICAgIC8vIHRodW1ibmFpbCBleHRyYWN0aW9uIGNvZGUga25vd3Mgd2UgcmVhbGx5IGRvbid0IGhhdmUgaXQuCisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICAqaXRlbUluZGV4ID0gdGh1bWJJdGVtSW5kZXg7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBJdGVtVGFibGU6OmdldEltYWdlT2Zmc2V0QW5kU2l6ZSgKKyAgICAgICAgdWludDMyX3QgKml0ZW1JbmRleCwgb2ZmNjRfdCAqb2Zmc2V0LCBzaXplX3QgKnNpemUpIHsKKyAgICBpZiAoIW1JbWFnZUl0ZW1zVmFsaWQpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGlmIChpdGVtSW5kZXggIT0gTlVMTCkgeworICAgICAgICBpZiAoKml0ZW1JbmRleCA+PSBtSXRlbUlkVG9JdGVtTWFwLnNpemUoKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBCYWQgaXRlbSBpbmRleCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBtQ3VycmVudEl0ZW1JbmRleCA9ICppdGVtSW5kZXg7CisgICAgfQorCisgICAgSW1hZ2VJdGVtICZpbWFnZSA9IG1JdGVtSWRUb0l0ZW1NYXAuZWRpdFZhbHVlQXQobUN1cnJlbnRJdGVtSW5kZXgpOworICAgIGlmIChpbWFnZS5pc0dyaWQoKSkgeworICAgICAgICB1aW50MzJfdCB0aWxlSXRlbUlkOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBpbWFnZS5nZXROZXh0VGlsZUl0ZW1JZCgmdGlsZUl0ZW1JZCwgaXRlbUluZGV4ICE9IE5VTEwpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIHNzaXplX3QgdGlsZUl0ZW1JbmRleCA9IG1JdGVtSWRUb0l0ZW1NYXAuaW5kZXhPZktleSh0aWxlSXRlbUlkKTsKKyAgICAgICAgaWYgKHRpbGVJdGVtSW5kZXggPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgfQorICAgICAgICAqb2Zmc2V0ID0gbUl0ZW1JZFRvSXRlbU1hcFt0aWxlSXRlbUluZGV4XS5vZmZzZXQ7CisgICAgICAgICpzaXplID0gbUl0ZW1JZFRvSXRlbU1hcFt0aWxlSXRlbUluZGV4XS5zaXplOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChpdGVtSW5kZXggPT0gTlVMTCkgeworICAgICAgICAgICAgLy8gRm9yIHNpbmdsZSBpbWFnZXMsIHdlIG9ubHkgYWxsb3cgaXQgdG8gYmUgcmVhZCBvbmNlLCBhZnRlciB0aGF0CisgICAgICAgICAgICAvLyBpdCdzIEVPUy4gIE5ldyBpdGVtIGluZGV4IG11c3QgYmUgcmVxdWVzdGVkIGVhY2ggdGltZS4KKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICB9CisgICAgICAgICpvZmZzZXQgPSBtSXRlbUlkVG9JdGVtTWFwW21DdXJyZW50SXRlbUluZGV4XS5vZmZzZXQ7CisgICAgICAgICpzaXplID0gbUl0ZW1JZFRvSXRlbU1hcFttQ3VycmVudEl0ZW1JbmRleF0uc2l6ZTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEl0ZW1UYWJsZTo6Z2V0RXhpZk9mZnNldEFuZFNpemUob2ZmNjRfdCAqb2Zmc2V0LCBzaXplX3QgKnNpemUpIHsKKyAgICBpZiAoIW1JbWFnZUl0ZW1zVmFsaWQpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHNzaXplX3QgaXRlbUluZGV4ID0gbUl0ZW1JZFRvSXRlbU1hcC5pbmRleE9mS2V5KG1QcmltYXJ5SXRlbUlkKTsKKworICAgIC8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4sIHNvbWV0aGluZydzIHNlcmlvdXNseSB3cm9uZy4KKyAgICBpZiAoaXRlbUluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgY29uc3QgSW1hZ2VJdGVtICZpbWFnZSA9IG1JdGVtSWRUb0l0ZW1NYXBbaXRlbUluZGV4XTsKKyAgICBpZiAoaW1hZ2UuY2RzY1JlZnMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgIH0KKworICAgIHNzaXplX3QgZXhpZkluZGV4ID0gbUl0ZW1JZFRvRXhpZk1hcC5pbmRleE9mS2V5KGltYWdlLmNkc2NSZWZzWzBdKTsKKyAgICBpZiAoZXhpZkluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgfQorCisgICAgLy8gc2tpcCB0aGUgZmlyc3QgNC1ieXRlIG9mIHRoZSBvZmZzZXQgdG8gVElGRiBoZWFkZXIKKyAgICAqb2Zmc2V0ID0gbUl0ZW1JZFRvRXhpZk1hcFtleGlmSW5kZXhdLm9mZnNldCArIDQ7CisgICAgKnNpemUgPSBtSXRlbUlkVG9FeGlmTWFwW2V4aWZJbmRleF0uc2l6ZSAtIDQ7CisgICAgcmV0dXJuIE9LOworfQorCit9IC8vIG5hbWVzcGFjZSBoZWlmCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9JdGVtVGFibGUuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L0l0ZW1UYWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNmRjYjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9JdGVtVGFibGUuaApAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSVRFTV9UQUJMRV9IXworI2RlZmluZSBJVEVNX1RBQkxFX0hfCisKKyNpbmNsdWRlIDxzZXQ+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIERhdGFTb3VyY2VCYXNlOworY2xhc3MgTWV0YURhdGE7CisKK25hbWVzcGFjZSBoZWlmIHsKKworc3RydWN0IEFzc29jaWF0aW9uRW50cnk7CitzdHJ1Y3QgSW1hZ2VJdGVtOworc3RydWN0IEV4aWZJdGVtOworc3RydWN0IEl0ZW1Mb2M7CitzdHJ1Y3QgSXRlbUluZm87CitzdHJ1Y3QgSXRlbVByb3BlcnR5Oworc3RydWN0IEl0ZW1SZWZlcmVuY2U7CisKKy8qCisgKiBJdGVtVGFibGUga2VlcHMgdHJhY2sgb2YgYWxsIGltYWdlIGl0ZW1zIChpbmNsdWRpbmcgY29kZWQgaW1hZ2VzLCBncmlkcyBhbmQKKyAqIHRpbGVzKSBpbnNpZGUgYSBIRUlGIHN0aWxsIGltYWdlIChJU08vSUVDIEZESVMgMjMwMDgtMTIuMjoyMDE3KEUpKS4KKyAqLworCitjbGFzcyBJdGVtVGFibGUgOiBwdWJsaWMgUmVmQmFzZSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSXRlbVRhYmxlKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOworCisgICAgc3RhdHVzX3QgcGFyc2UodWludDMyX3QgdHlwZSwgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKKworICAgIGJvb2wgaXNWYWxpZCgpIHsgcmV0dXJuIG1JbWFnZUl0ZW1zVmFsaWQ7IH0KKyAgICB1aW50MzJfdCBjb3VudEltYWdlcygpIGNvbnN0OworICAgIHNwPE1ldGFEYXRhPiBnZXRJbWFnZU1ldGEoY29uc3QgdWludDMyX3QgaW1hZ2VJbmRleCk7CisgICAgc3RhdHVzX3QgZmluZEltYWdlSXRlbShjb25zdCB1aW50MzJfdCBpbWFnZUluZGV4LCB1aW50MzJfdCAqaXRlbUluZGV4KTsKKyAgICBzdGF0dXNfdCBmaW5kVGh1bWJuYWlsSXRlbShjb25zdCB1aW50MzJfdCBpbWFnZUluZGV4LCB1aW50MzJfdCAqaXRlbUluZGV4KTsKKyAgICBzdGF0dXNfdCBnZXRJbWFnZU9mZnNldEFuZFNpemUoCisgICAgICAgICAgICB1aW50MzJfdCAqaXRlbUluZGV4LCBvZmY2NF90ICpvZmZzZXQsIHNpemVfdCAqc2l6ZSk7CisgICAgc3RhdHVzX3QgZ2V0RXhpZk9mZnNldEFuZFNpemUob2ZmNjRfdCAqb2Zmc2V0LCBzaXplX3QgKnNpemUpOworCitwcm90ZWN0ZWQ6CisgICAgfkl0ZW1UYWJsZSgpOworCitwcml2YXRlOgorICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKworICAgIEtleWVkVmVjdG9yPHVpbnQzMl90LCBJdGVtTG9jPiBtSXRlbUxvY3M7CisgICAgVmVjdG9yPEl0ZW1JbmZvPiBtSXRlbUluZm9zOworICAgIFZlY3RvcjxBc3NvY2lhdGlvbkVudHJ5PiBtQXNzb2NpYXRpb25zOworICAgIFZlY3RvcjxzcDxJdGVtUHJvcGVydHk+ID4gbUl0ZW1Qcm9wZXJ0aWVzOworICAgIFZlY3RvcjxzcDxJdGVtUmVmZXJlbmNlPiA+IG1JdGVtUmVmZXJlbmNlczsKKworICAgIHVpbnQzMl90IG1QcmltYXJ5SXRlbUlkOworICAgIG9mZjY0X3QgbUlkYXRPZmZzZXQ7CisgICAgc2l6ZV90IG1JZGF0U2l6ZTsKKworICAgIHN0ZDo6c2V0PHVpbnQzMl90PiBtUmVxdWlyZWRCb3hlczsKKyAgICBzdGQ6OnNldDx1aW50MzJfdD4gbUJveGVzU2VlbjsKKworICAgIGJvb2wgbUltYWdlSXRlbXNWYWxpZDsKKyAgICB1aW50MzJfdCBtQ3VycmVudEl0ZW1JbmRleDsKKyAgICBLZXllZFZlY3Rvcjx1aW50MzJfdCwgSW1hZ2VJdGVtPiBtSXRlbUlkVG9JdGVtTWFwOworICAgIEtleWVkVmVjdG9yPHVpbnQzMl90LCBFeGlmSXRlbT4gbUl0ZW1JZFRvRXhpZk1hcDsKKyAgICBWZWN0b3I8dWludDMyX3Q+IG1EaXNwbGF5YWJsZXM7CisKKyAgICBzdGF0dXNfdCBwYXJzZUlsb2NCb3gob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKKyAgICBzdGF0dXNfdCBwYXJzZUlpbmZCb3gob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKKyAgICBzdGF0dXNfdCBwYXJzZVBpdG1Cb3gob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKKyAgICBzdGF0dXNfdCBwYXJzZUlwcnBCb3gob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKKyAgICBzdGF0dXNfdCBwYXJzZUlkYXRCb3gob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKKyAgICBzdGF0dXNfdCBwYXJzZUlyZWZCb3gob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKKworICAgIHZvaWQgYXR0YWNoUHJvcGVydHkoY29uc3QgQXNzb2NpYXRpb25FbnRyeSAmYXNzb2NpYXRpb24pOworICAgIHN0YXR1c190IGJ1aWxkSW1hZ2VJdGVtc0lmUG9zc2libGUodWludDMyX3QgdHlwZSk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhJdGVtVGFibGUpOworfTsKKworfSAvLyBuYW1lc3BhY2UgaGVpZgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIElURU1fVEFCTEVfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpjb3B5IHRvIG1lZGlhL2V4dHJhY3RvcnMvbXA0L01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L01QRUc0RXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L01QRUc0RXh0cmFjdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjNiODFkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuY3BwCkBAIC0wLDAgKzEsNTU4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTVBFRzRFeHRyYWN0b3IiCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJNUEVHNEV4dHJhY3Rvci5oIgorI2luY2x1ZGUgIlNhbXBsZVRhYmxlLmgiCisjaW5jbHVkZSAiSXRlbVRhYmxlLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9FU0RTLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9FeHRyYWN0b3JVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9hdmNfdXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKKyNpbmNsdWRlIDxieXRlc3dhcC5oPgorI2luY2x1ZGUgImluY2x1ZGUvSUQzLmgiCisKKyNpZm5kZWYgVUlOVDMyX01BWAorI2RlZmluZSBVSU5UMzJfTUFYICAgICAgICg0Mjk0OTY3Mjk1VSkKKyNlbmRpZgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2VudW0geworICAgIC8vIG1heCB0cmFjayBoZWFkZXIgY2h1bmsgdG8gcmV0dXJuCisgICAga01heFRyYWNrSGVhZGVyU2l6ZSA9IDMyLAorCisgICAgLy8gbWF4aW11bSBzaXplIG9mIGFuIGF0b20uIFNvbWUgYXRvbXMgY2FuIGJlIGJpZ2dlciBhY2NvcmRpbmcgdG8gdGhlIHNwZWMsCisgICAgLy8gYnV0IHdlIG9ubHkgYWxsb3cgdXAgdG8gdGhpcyBzaXplLgorICAgIGtNYXhBdG9tU2l6ZSA9IDY0ICogMTAyNCAqIDEwMjQsCit9OworCitjbGFzcyBNUEVHNFNvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrIHsKK3B1YmxpYzoKKyAgICAvLyBDYWxsZXIgcmV0YWlucyBvd25lcnNoaXAgb2YgYm90aCAiZGF0YVNvdXJjZSIgYW5kICJzYW1wbGVUYWJsZSIuCisgICAgTVBFRzRTb3VyY2UoTWV0YURhdGFCYXNlICZmb3JtYXQsCisgICAgICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UsCisgICAgICAgICAgICAgICAgaW50MzJfdCB0aW1lU2NhbGUsCisgICAgICAgICAgICAgICAgY29uc3Qgc3A8U2FtcGxlVGFibGU+ICZzYW1wbGVUYWJsZSwKKyAgICAgICAgICAgICAgICBWZWN0b3I8U2lkeEVudHJ5PiAmc2lkeCwKKyAgICAgICAgICAgICAgICBjb25zdCBUcmV4ICp0cmV4LAorICAgICAgICAgICAgICAgIG9mZjY0X3QgZmlyc3RNb29mT2Zmc2V0LAorICAgICAgICAgICAgICAgIGNvbnN0IHNwPEl0ZW1UYWJsZT4gJml0ZW1UYWJsZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0KCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zID0gTlVMTCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UgJik7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0Tm9uYmxvY2tpbmdSZWFkKCkgeyByZXR1cm4gdHJ1ZTsgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgZnJhZ21lbnRlZFJlYWQoTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworCisgICAgdmlydHVhbCB+TVBFRzRTb3VyY2UoKTsKKworcHJpdmF0ZToKKyAgICBNdXRleCBtTG9jazsKKworICAgIE1ldGFEYXRhQmFzZSAmbUZvcm1hdDsKKyAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgaW50MzJfdCBtVGltZXNjYWxlOworICAgIHNwPFNhbXBsZVRhYmxlPiBtU2FtcGxlVGFibGU7CisgICAgdWludDMyX3QgbUN1cnJlbnRTYW1wbGVJbmRleDsKKyAgICB1aW50MzJfdCBtQ3VycmVudEZyYWdtZW50SW5kZXg7CisgICAgVmVjdG9yPFNpZHhFbnRyeT4gJm1TZWdtZW50czsKKyAgICBjb25zdCBUcmV4ICptVHJleDsKKyAgICBvZmY2NF90IG1GaXJzdE1vb2ZPZmZzZXQ7CisgICAgb2ZmNjRfdCBtQ3VycmVudE1vb2ZPZmZzZXQ7CisgICAgb2ZmNjRfdCBtTmV4dE1vb2ZPZmZzZXQ7CisgICAgdWludDMyX3QgbUN1cnJlbnRUaW1lOworICAgIGludDMyX3QgbUxhc3RQYXJzZWRUcmFja0lkOworICAgIGludDMyX3QgbVRyYWNrSWQ7CisKKyAgICBpbnQzMl90IG1DcnlwdG9Nb2RlOyAgICAvLyBwYXNzZWQgaW4gZnJvbSBleHRyYWN0b3IKKyAgICBpbnQzMl90IG1EZWZhdWx0SVZTaXplOyAvLyBwYXNzZWQgaW4gZnJvbSBleHRyYWN0b3IKKyAgICB1aW50OF90IG1DcnlwdG9LZXlbMTZdOyAvLyBwYXNzZWQgaW4gZnJvbSBleHRyYWN0b3IKKyAgICBpbnQzMl90IG1EZWZhdWx0RW5jcnlwdGVkQnl0ZUJsb2NrOworICAgIGludDMyX3QgbURlZmF1bHRTa2lwQnl0ZUJsb2NrOworICAgIHVpbnQzMl90IG1DdXJyZW50QXV4SW5mb1R5cGU7CisgICAgdWludDMyX3QgbUN1cnJlbnRBdXhJbmZvVHlwZVBhcmFtZXRlcjsKKyAgICBpbnQzMl90IG1DdXJyZW50RGVmYXVsdFNhbXBsZUluZm9TaXplOworICAgIHVpbnQzMl90IG1DdXJyZW50U2FtcGxlSW5mb0NvdW50OworICAgIHVpbnQzMl90IG1DdXJyZW50U2FtcGxlSW5mb0FsbG9jU2l6ZTsKKyAgICB1aW50OF90KiBtQ3VycmVudFNhbXBsZUluZm9TaXplczsKKyAgICB1aW50MzJfdCBtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRDb3VudDsKKyAgICB1aW50MzJfdCBtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRzQWxsb2NTaXplOworICAgIHVpbnQ2NF90KiBtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRzOworCisgICAgYm9vbCBtSXNBVkM7CisgICAgYm9vbCBtSXNIRVZDOworICAgIHNpemVfdCBtTkFMTGVuZ3RoU2l6ZTsKKworICAgIGJvb2wgbVN0YXJ0ZWQ7CisKKyAgICBNZWRpYUJ1ZmZlckdyb3VwICptR3JvdXA7CisKKyAgICBNZWRpYUJ1ZmZlckJhc2UgKm1CdWZmZXI7CisKKyAgICBib29sIG1XYW50c05BTEZyYWdtZW50czsKKworICAgIHVpbnQ4X3QgKm1TcmNCdWZmZXI7CisKKyAgICBib29sIG1Jc0hlaWY7CisgICAgc3A8SXRlbVRhYmxlPiBtSXRlbVRhYmxlOworCisgICAgc2l6ZV90IHBhcnNlTkFMU2l6ZShjb25zdCB1aW50OF90ICpkYXRhKSBjb25zdDsKKyAgICBzdGF0dXNfdCBwYXJzZUNodW5rKG9mZjY0X3QgKm9mZnNldCk7CisgICAgc3RhdHVzX3QgcGFyc2VUcmFja0ZyYWdtZW50SGVhZGVyKG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IHNpemUpOworICAgIHN0YXR1c190IHBhcnNlVHJhY2tGcmFnbWVudFJ1bihvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBzaXplKTsKKyAgICBzdGF0dXNfdCBwYXJzZVNhbXBsZUF1eGlsaWFyeUluZm9ybWF0aW9uU2l6ZXMob2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3Qgc2l6ZSk7CisgICAgc3RhdHVzX3QgcGFyc2VTYW1wbGVBdXhpbGlhcnlJbmZvcm1hdGlvbk9mZnNldHMob2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3Qgc2l6ZSk7CisgICAgc3RhdHVzX3QgcGFyc2VDbGVhckVuY3J5cHRlZFNpemVzKG9mZjY0X3Qgb2Zmc2V0LCBib29sIGlzU3Vic2FtcGxlRW5jcnlwdGlvbiwgdWludDMyX3QgZmxhZ3MpOworICAgIHN0YXR1c190IHBhcnNlU2FtcGxlRW5jcnlwdGlvbihvZmY2NF90IG9mZnNldCk7CisKKyAgICBzdHJ1Y3QgVHJhY2tGcmFnbWVudEhlYWRlckluZm8geworICAgICAgICBlbnVtIEZsYWdzIHsKKyAgICAgICAgICAgIGtCYXNlRGF0YU9mZnNldFByZXNlbnQgICAgICAgICA9IDB4MDEsCisgICAgICAgICAgICBrU2FtcGxlRGVzY3JpcHRpb25JbmRleFByZXNlbnQgPSAweDAyLAorICAgICAgICAgICAga0RlZmF1bHRTYW1wbGVEdXJhdGlvblByZXNlbnQgID0gMHgwOCwKKyAgICAgICAgICAgIGtEZWZhdWx0U2FtcGxlU2l6ZVByZXNlbnQgICAgICA9IDB4MTAsCisgICAgICAgICAgICBrRGVmYXVsdFNhbXBsZUZsYWdzUHJlc2VudCAgICAgPSAweDIwLAorICAgICAgICAgICAga0R1cmF0aW9uSXNFbXB0eSAgICAgICAgICAgICAgID0gMHgxMDAwMCwKKyAgICAgICAgfTsKKworICAgICAgICB1aW50MzJfdCBtVHJhY2tJRDsKKyAgICAgICAgdWludDMyX3QgbUZsYWdzOworICAgICAgICB1aW50NjRfdCBtQmFzZURhdGFPZmZzZXQ7CisgICAgICAgIHVpbnQzMl90IG1TYW1wbGVEZXNjcmlwdGlvbkluZGV4OworICAgICAgICB1aW50MzJfdCBtRGVmYXVsdFNhbXBsZUR1cmF0aW9uOworICAgICAgICB1aW50MzJfdCBtRGVmYXVsdFNhbXBsZVNpemU7CisgICAgICAgIHVpbnQzMl90IG1EZWZhdWx0U2FtcGxlRmxhZ3M7CisKKyAgICAgICAgdWludDY0X3QgbURhdGFPZmZzZXQ7CisgICAgfTsKKyAgICBUcmFja0ZyYWdtZW50SGVhZGVySW5mbyBtVHJhY2tGcmFnbWVudEhlYWRlckluZm87CisKKyAgICBzdHJ1Y3QgU2FtcGxlIHsKKyAgICAgICAgb2ZmNjRfdCBvZmZzZXQ7CisgICAgICAgIHNpemVfdCBzaXplOworICAgICAgICB1aW50MzJfdCBkdXJhdGlvbjsKKyAgICAgICAgaW50MzJfdCBjb21wb3NpdGlvbk9mZnNldDsKKyAgICAgICAgdWludDhfdCBpdlsxNl07CisgICAgICAgIFZlY3RvcjxzaXplX3Q+IGNsZWFyc2l6ZXM7CisgICAgICAgIFZlY3RvcjxzaXplX3Q+IGVuY3J5cHRlZHNpemVzOworICAgIH07CisgICAgVmVjdG9yPFNhbXBsZT4gbUN1cnJlbnRTYW1wbGVzOworCisgICAgTVBFRzRTb3VyY2UoY29uc3QgTVBFRzRTb3VyY2UgJik7CisgICAgTVBFRzRTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBNUEVHNFNvdXJjZSAmKTsKK307CisKKy8vIFRoaXMgY3VzdG9tIGRhdGEgc291cmNlIHdyYXBzIGFuIGV4aXN0aW5nIG9uZSBhbmQgc2F0aXNmaWVzIHJlcXVlc3RzCisvLyBmYWxsaW5nIGVudGlyZWx5IHdpdGhpbiBhIGNhY2hlZCByYW5nZSBmcm9tIHRoZSBjYWNoZSB3aGlsZSBmb3J3YXJkaW5nCisvLyBhbGwgcmVtYWluaW5nIHJlcXVlc3RzIHRvIHRoZSB3cmFwcGVkIGRhdGFzb3VyY2UuCisvLyBUaGlzIGlzIHVzZWQgdG8gY2FjaGUgdGhlIGZ1bGwgc2FtcGxldGFibGUgbWV0YWRhdGEgZm9yIGEgc2luZ2xlIHRyYWNrLAorLy8gcG9zc2libHkgd3JhcHBpbmcgbXVsdGlwbGUgdGltZXMgdG8gY292ZXIgYWxsIHRyYWNrcywgaS5lLgorLy8gRWFjaCBDYWNoZWRSYW5nZWREYXRhU291cmNlIGNhY2hlcyB0aGUgc2FtcGxldGFibGUgbWV0YWRhdGEgZm9yIGEgc2luZ2xlIHRyYWNrLgorCitzdHJ1Y3QgQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZSA6IHB1YmxpYyBEYXRhU291cmNlQmFzZSB7CisgICAgZXhwbGljaXQgQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZShEYXRhU291cmNlQmFzZSAqc291cmNlKTsKKyAgICB2aXJ0dWFsIH5DYWNoZWRSYW5nZWREYXRhU291cmNlKCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OworICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSk7CisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpOworCisgICAgc3RhdHVzX3Qgc2V0Q2FjaGVkUmFuZ2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplLCBib29sIGFzc3VtZVNvdXJjZU93bmVyc2hpcE9uU3VjY2Vzcyk7CisKKworcHJpdmF0ZToKKyAgICBNdXRleCBtTG9jazsKKworICAgIERhdGFTb3VyY2VCYXNlICptU291cmNlOworICAgIGJvb2wgbU93bnNEYXRhU291cmNlOworICAgIG9mZjY0X3QgbUNhY2hlZE9mZnNldDsKKyAgICBzaXplX3QgbUNhY2hlZFNpemU7CisgICAgdWludDhfdCAqbUNhY2hlOworCisgICAgdm9pZCBjbGVhckNhY2hlKCk7CisKKyAgICBDYWNoZWRSYW5nZWREYXRhU291cmNlKGNvbnN0IENhY2hlZFJhbmdlZERhdGFTb3VyY2UgJik7CisgICAgQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IENhY2hlZFJhbmdlZERhdGFTb3VyY2UgJik7Cit9OworCitDYWNoZWRSYW5nZWREYXRhU291cmNlOjpDYWNoZWRSYW5nZWREYXRhU291cmNlKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCisgICAgOiBtU291cmNlKHNvdXJjZSksCisgICAgICBtT3duc0RhdGFTb3VyY2UoZmFsc2UpLAorICAgICAgbUNhY2hlZE9mZnNldCgwKSwKKyAgICAgIG1DYWNoZWRTaXplKDApLAorICAgICAgbUNhY2hlKE5VTEwpIHsKK30KKworQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZTo6fkNhY2hlZFJhbmdlZERhdGFTb3VyY2UoKSB7CisgICAgY2xlYXJDYWNoZSgpOworICAgIGlmIChtT3duc0RhdGFTb3VyY2UpIHsKKyAgICAgICAgZGVsZXRlIChDYWNoZWRSYW5nZWREYXRhU291cmNlKiltU291cmNlOworICAgIH0KK30KKwordm9pZCBDYWNoZWRSYW5nZWREYXRhU291cmNlOjpjbGVhckNhY2hlKCkgeworICAgIGlmIChtQ2FjaGUpIHsKKyAgICAgICAgZnJlZShtQ2FjaGUpOworICAgICAgICBtQ2FjaGUgPSBOVUxMOworICAgIH0KKworICAgIG1DYWNoZWRPZmZzZXQgPSAwOworICAgIG1DYWNoZWRTaXplID0gMDsKK30KKworc3RhdHVzX3QgQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZTo6aW5pdENoZWNrKCkgY29uc3QgeworICAgIHJldHVybiBtU291cmNlLT5pbml0Q2hlY2soKTsKK30KKworc3NpemVfdCBDYWNoZWRSYW5nZWREYXRhU291cmNlOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChpc0luUmFuZ2UobUNhY2hlZE9mZnNldCwgbUNhY2hlZFNpemUsIG9mZnNldCwgc2l6ZSkpIHsKKyAgICAgICAgbWVtY3B5KGRhdGEsICZtQ2FjaGVbb2Zmc2V0IC0gbUNhY2hlZE9mZnNldF0sIHNpemUpOworICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICB9CisKKyAgICByZXR1cm4gbVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgZGF0YSwgc2l6ZSk7Cit9CisKK3N0YXR1c190IENhY2hlZFJhbmdlZERhdGFTb3VyY2U6OmdldFNpemUob2ZmNjRfdCAqc2l6ZSkgeworICAgIHJldHVybiBtU291cmNlLT5nZXRTaXplKHNpemUpOworfQorCit1aW50MzJfdCBDYWNoZWRSYW5nZWREYXRhU291cmNlOjpmbGFncygpIHsKKyAgICByZXR1cm4gbVNvdXJjZS0+ZmxhZ3MoKTsKK30KKworc3RhdHVzX3QgQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZTo6c2V0Q2FjaGVkUmFuZ2Uob2ZmNjRfdCBvZmZzZXQsCisgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICBib29sIGFzc3VtZVNvdXJjZU93bmVyc2hpcE9uU3VjY2VzcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBjbGVhckNhY2hlKCk7CisKKyAgICBtQ2FjaGUgPSAodWludDhfdCAqKW1hbGxvYyhzaXplKTsKKworICAgIGlmIChtQ2FjaGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICB9CisKKyAgICBtQ2FjaGVkT2Zmc2V0ID0gb2Zmc2V0OworICAgIG1DYWNoZWRTaXplID0gc2l6ZTsKKworICAgIHNzaXplX3QgZXJyID0gbVNvdXJjZS0+cmVhZEF0KG1DYWNoZWRPZmZzZXQsIG1DYWNoZSwgbUNhY2hlZFNpemUpOworCisgICAgaWYgKGVyciA8IChzc2l6ZV90KXNpemUpIHsKKyAgICAgICAgY2xlYXJDYWNoZSgpOworCisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisgICAgbU93bnNEYXRhU291cmNlID0gYXNzdW1lU291cmNlT3duZXJzaGlwT25TdWNjZXNzOworICAgIHJldHVybiBPSzsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIGNvbnN0IGJvb2wga1VzZUhleER1bXAgPSBmYWxzZTsKKworc3RhdGljIGNvbnN0IGNoYXIgKkZvdXJDQzJNSU1FKHVpbnQzMl90IGZvdXJjYykgeworICAgIHN3aXRjaCAoZm91cmNjKSB7CisgICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ3AnLCAnNCcsICdhJyk6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDOworCisgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ2EnLCAnbScsICdyJyk6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05COworCisgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ2EnLCAndycsICdiJyk6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCOworCisgICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ3AnLCAnNCcsICd2Jyk6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQ7CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAnMicsICc2JywgJzMnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2gnLCAnMicsICc2JywgJzMnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ0gnLCAnMicsICc2JywgJzMnKToKKyAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzOworCisgICAgICAgIGNhc2UgRk9VUkNDKCdhJywgJ3YnLCAnYycsICcxJyk6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfVklERU9fQVZDOworCisgICAgICAgIGNhc2UgRk9VUkNDKCdoJywgJ3YnLCAnYycsICcxJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdoJywgJ2UnLCAndicsICcxJyk6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQzsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dXKCJVbmtub3duIGZvdXJjYzogJWMlYyVjJWMiLAorICAgICAgICAgICAgICAgICAgIChmb3VyY2MgPj4gMjQpICYgMHhmZiwKKyAgICAgICAgICAgICAgICAgICAoZm91cmNjID4+IDE2KSAmIDB4ZmYsCisgICAgICAgICAgICAgICAgICAgKGZvdXJjYyA+PiA4KSAmIDB4ZmYsCisgICAgICAgICAgICAgICAgICAgZm91cmNjICYgMHhmZgorICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICByZXR1cm4gImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSI7CisgICAgfQorfQorCitzdGF0aWMgYm9vbCBBZGp1c3RDaGFubmVsc0FuZFJhdGUodWludDMyX3QgZm91cmNjLCB1aW50MzJfdCAqY2hhbm5lbHMsIHVpbnQzMl90ICpyYXRlKSB7CisgICAgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQiwgRm91ckNDMk1JTUUoZm91cmNjKSkpIHsKKyAgICAgICAgLy8gQU1SIE5CIGF1ZGlvIGlzIGFsd2F5cyBtb25vLCA4a0h6CisgICAgICAgICpjaGFubmVscyA9IDE7CisgICAgICAgICpyYXRlID0gODAwMDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IsIEZvdXJDQzJNSU1FKGZvdXJjYykpKSB7CisgICAgICAgIC8vIEFNUiBXQiBhdWRpbyBpcyBhbHdheXMgbW9ubywgMTZrSHoKKyAgICAgICAgKmNoYW5uZWxzID0gMTsKKyAgICAgICAgKnJhdGUgPSAxNjAwMDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworTVBFRzRFeHRyYWN0b3I6Ok1QRUc0RXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUpCisgICAgOiBtTW9vZk9mZnNldCgwKSwKKyAgICAgIG1Nb29mRm91bmQoZmFsc2UpLAorICAgICAgbU1kYXRGb3VuZChmYWxzZSksCisgICAgICBtRGF0YVNvdXJjZShzb3VyY2UpLAorICAgICAgbUNhY2hlZFNvdXJjZShOVUxMKSwKKyAgICAgIG1Jbml0Q2hlY2soTk9fSU5JVCksCisgICAgICBtSGVhZGVyVGltZXNjYWxlKDApLAorICAgICAgbUlzUVQoZmFsc2UpLAorICAgICAgbUlzSGVpZihmYWxzZSksCisgICAgICBtSGFzTW9vdkJveChmYWxzZSksCisgICAgICBtUHJlZmVySGVpZihtaW1lICE9IE5VTEwgJiYgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX0hFSUYpKSwKKyAgICAgIG1GaXJzdFRyYWNrKE5VTEwpLAorICAgICAgbUxhc3RUcmFjayhOVUxMKSB7CisgICAgQUxPR1YoIm1pbWU9JXMsIG1QcmVmZXJIZWlmPSVkIiwgbWltZSwgbVByZWZlckhlaWYpOworfQorCitNUEVHNEV4dHJhY3Rvcjo6fk1QRUc0RXh0cmFjdG9yKCkgeworICAgIFRyYWNrICp0cmFjayA9IG1GaXJzdFRyYWNrOworICAgIHdoaWxlICh0cmFjaykgeworICAgICAgICBUcmFjayAqbmV4dCA9IHRyYWNrLT5uZXh0OworCisgICAgICAgIGRlbGV0ZSB0cmFjazsKKyAgICAgICAgdHJhY2sgPSBuZXh0OworICAgIH0KKyAgICBtRmlyc3RUcmFjayA9IG1MYXN0VHJhY2sgPSBOVUxMOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUHNzaC5zaXplKCk7IGkrKykgeworICAgICAgICBkZWxldGUgW10gbVBzc2hbaV0uZGF0YTsKKyAgICB9CisgICAgbVBzc2guY2xlYXIoKTsKKworICAgIGRlbGV0ZSBtQ2FjaGVkU291cmNlOworfQorCit1aW50MzJfdCBNUEVHNEV4dHJhY3Rvcjo6ZmxhZ3MoKSBjb25zdCB7CisgICAgcmV0dXJuIENBTl9QQVVTRSB8CisgICAgICAgICAgICAoKG1Nb29mT2Zmc2V0ID09IDAgfHwgbVNpZHhFbnRyaWVzLnNpemUoKSAhPSAwKSA/CisgICAgICAgICAgICAgICAgICAgIChDQU5fU0VFS19CQUNLV0FSRCB8IENBTl9TRUVLX0ZPUldBUkQgfCBDQU5fU0VFSykgOiAwKTsKK30KKworc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OmdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkgeworICAgIHN0YXR1c190IGVycjsKKyAgICBpZiAoKGVyciA9IHJlYWRNZXRhRGF0YSgpKSAhPSBPSykgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgbWV0YSA9IG1GaWxlTWV0YURhdGE7CisgICAgcmV0dXJuIE9LOworfQorCitzaXplX3QgTVBFRzRFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgeworICAgIHN0YXR1c190IGVycjsKKyAgICBpZiAoKGVyciA9IHJlYWRNZXRhRGF0YSgpKSAhPSBPSykgeworICAgICAgICBBTE9HVigiTVBFRzRFeHRyYWN0b3I6OmNvdW50VHJhY2tzOiBubyB0cmFja3MiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgc2l6ZV90IG4gPSAwOworICAgIFRyYWNrICp0cmFjayA9IG1GaXJzdFRyYWNrOworICAgIHdoaWxlICh0cmFjaykgeworICAgICAgICArK247CisgICAgICAgIHRyYWNrID0gdHJhY2stPm5leHQ7CisgICAgfQorCisgICAgQUxPR1YoIk1QRUc0RXh0cmFjdG9yOjpjb3VudFRyYWNrczogJXp1IHRyYWNrcyIsIG4pOworICAgIHJldHVybiBuOworfQorCitzdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKSB7CisgICAgc3RhdHVzX3QgZXJyOworICAgIGlmICgoZXJyID0gcmVhZE1ldGFEYXRhKCkpICE9IE9LKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIFRyYWNrICp0cmFjayA9IG1GaXJzdFRyYWNrOworICAgIHdoaWxlIChpbmRleCA+IDApIHsKKyAgICAgICAgaWYgKHRyYWNrID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgdHJhY2sgPSB0cmFjay0+bmV4dDsKKyAgICAgICAgLS1pbmRleDsKKyAgICB9CisKKyAgICBpZiAodHJhY2sgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBbPV0geworICAgICAgICBpbnQ2NF90IGR1cmF0aW9uOworICAgICAgICBpbnQzMl90IHNhbXBsZXJhdGU7CisgICAgICAgIGlmICh0cmFjay0+aGFzX2Vsc3QgJiYgbUhlYWRlclRpbWVzY2FsZSAhPSAwICYmCisgICAgICAgICAgICAgICAgdHJhY2stPm1ldGEuZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uKSAmJgorICAgICAgICAgICAgICAgIHRyYWNrLT5tZXRhLmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnNhbXBsZXJhdGUpKSB7CisKKyAgICAgICAgICAgIHRyYWNrLT5oYXNfZWxzdCA9IGZhbHNlOworCisgICAgICAgICAgICBpZiAodHJhY2stPmVsc3Rfc2VnbWVudF9kdXJhdGlvbiA+IElOVDY0X01BWCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludDY0X3Qgc2VnbWVudF9kdXJhdGlvbiA9IHRyYWNrLT5lbHN0X3NlZ21lbnRfZHVyYXRpb247CisgICAgICAgICAgICBpbnQ2NF90IG1lZGlhX3RpbWUgPSB0cmFjay0+ZWxzdF9tZWRpYV90aW1lOworICAgICAgICAgICAgaW50NjRfdCBoYWxmc2NhbGUgPSBtSGVhZGVyVGltZXNjYWxlIC8gMjsKKyAgICAgICAgICAgIEFMT0dWKCJzZWdtZW50X2R1cmF0aW9uID0gJSIgUFJJZDY0ICIsIG1lZGlhX3RpbWUgPSAlIiBQUklkNjQKKyAgICAgICAgICAgICAgICAgICIsIGhhbGZzY2FsZSA9ICUiIFBSSWQ2NCAiLCB0aW1lc2NhbGUgPSAlZCIsCisgICAgICAgICAgICAgICAgICBzZWdtZW50X2R1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgbWVkaWFfdGltZSwKKyAgICAgICAgICAgICAgICAgIGhhbGZzY2FsZSwKKyAgICAgICAgICAgICAgICAgIG1IZWFkZXJUaW1lc2NhbGUpOworCisgICAgICAgICAgICBpbnQ2NF90IGRlbGF5OworICAgICAgICAgICAgLy8gZGVsYXkgPSAoKG1lZGlhX3RpbWUgKiBzYW1wbGVyYXRlKSArIGhhbGZzY2FsZSkgLyBtSGVhZGVyVGltZXNjYWxlOworICAgICAgICAgICAgaWYgKF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3cobWVkaWFfdGltZSwgc2FtcGxlcmF0ZSwgJmRlbGF5KSB8fAorICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fYWRkX292ZXJmbG93KGRlbGF5LCBoYWxmc2NhbGUsICZkZWxheSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKGRlbGF5IC89IG1IZWFkZXJUaW1lc2NhbGUsIGZhbHNlKSB8fAorICAgICAgICAgICAgICAgICAgICBkZWxheSA+IElOVDMyX01BWCB8fAorICAgICAgICAgICAgICAgICAgICBkZWxheSA8IElOVDMyX01JTikgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJkZWxheSA9ICUiIFBSSWQ2NCwgZGVsYXkpOworICAgICAgICAgICAgdHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUVuY29kZXJEZWxheSwgZGVsYXkpOworCisgICAgICAgICAgICBpbnQ2NF90IHNjYWxlZF9kdXJhdGlvbjsKKyAgICAgICAgICAgIC8vIHNjYWxlZF9kdXJhdGlvbiA9IGR1cmF0aW9uICogbUhlYWRlclRpbWVzY2FsZTsKKyAgICAgICAgICAgIGlmIChfX2J1aWx0aW5fbXVsX292ZXJmbG93KGR1cmF0aW9uLCBtSGVhZGVyVGltZXNjYWxlLCAmc2NhbGVkX2R1cmF0aW9uKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJzY2FsZWRfZHVyYXRpb24gPSAlIiBQUklkNjQsIHNjYWxlZF9kdXJhdGlvbik7CisKKyAgICAgICAgICAgIGludDY0X3Qgc2VnbWVudF9lbmQ7CisgICAgICAgICAgICBpbnQ2NF90IHBhZGRpbmc7CisgICAgICAgICAgICAvLyBwYWRkaW5nID0gc2NhbGVkX2R1cmF0aW9uIC0gKChzZWdtZW50X2R1cmF0aW9uICsgbWVkaWFfdGltZSkgKiAxMDAwMDAwKTsKKyAgICAgICAgICAgIGlmIChfX2J1aWx0aW5fYWRkX292ZXJmbG93KHNlZ21lbnRfZHVyYXRpb24sIG1lZGlhX3RpbWUsICZzZWdtZW50X2VuZCkgfHwKKyAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX211bF9vdmVyZmxvdyhzZWdtZW50X2VuZCwgMTAwMDAwMCwgJnNlZ21lbnRfZW5kKSB8fAorICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fc3ViX292ZXJmbG93KHNjYWxlZF9kdXJhdGlvbiwgc2VnbWVudF9lbmQsICZwYWRkaW5nKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJzZWdtZW50X2VuZCA9ICUiIFBSSWQ2NCAiLCBwYWRkaW5nID0gJSIgUFJJZDY0LCBzZWdtZW50X2VuZCwgcGFkZGluZyk7CisKKyAgICAgICAgICAgIGlmIChwYWRkaW5nIDwgMCkgeworICAgICAgICAgICAgICAgIC8vIHRyYWNrIGR1cmF0aW9uIGZyb20gbWVkaWEgaGVhZGVyICh3aGljaCBpcyB3aGF0IGtLZXlEdXJhdGlvbiBpcykgbWlnaHQKKyAgICAgICAgICAgICAgICAvLyBiZSBzbGlnaHRseSBzaG9ydGVyIHRoYW4gdGhlIHNlZ21lbnQgZHVyYXRpb24sIHdoaWNoIHdvdWxkIG1ha2UgdGhlCisgICAgICAgICAgICAgICAgLy8gcGFkZGluZyBuZWdhdGl2ZS4gQ2xhbXAgdG8gemVyby4KKyAgICAgICAgICAgICAgICBwYWRkaW5nID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50NjRfdCBwYWRkaW5nc2FtcGxlczsKKyAgICAgICAgICAgIGludDY0X3QgaGFsZnNjYWxlX2U2OworICAgICAgICAgICAgaW50NjRfdCB0aW1lc2NhbGVfZTY7CisgICAgICAgICAgICAvLyBwYWRkaW5nc2FtcGxlcyA9ICgocGFkZGluZyAqIHNhbXBsZXJhdGUpICsgKGhhbGZzY2FsZSAqIDEwMDAwMDApKQorICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgLyAobUhlYWRlclRpbWVzY2FsZSAqIDEwMDAwMDApOworICAgICAgICAgICAgaWYgKF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3cocGFkZGluZywgc2FtcGxlcmF0ZSwgJnBhZGRpbmdzYW1wbGVzKSB8fAorICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fbXVsX292ZXJmbG93KGhhbGZzY2FsZSwgMTAwMDAwMCwgJmhhbGZzY2FsZV9lNikgfHwKKyAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX211bF9vdmVyZmxvdyhtSGVhZGVyVGltZXNjYWxlLCAxMDAwMDAwLCAmdGltZXNjYWxlX2U2KSB8fAorICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fYWRkX292ZXJmbG93KHBhZGRpbmdzYW1wbGVzLCBoYWxmc2NhbGVfZTYsICZwYWRkaW5nc2FtcGxlcykgfHwKKyAgICAgICAgICAgICAgICAgICAgKHBhZGRpbmdzYW1wbGVzIC89IHRpbWVzY2FsZV9lNiwgZmFsc2UpIHx8CisgICAgICAgICAgICAgICAgICAgIHBhZGRpbmdzYW1wbGVzID4gSU5UMzJfTUFYKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoInBhZGRpbmdzYW1wbGVzID0gJSIgUFJJZDY0LCBwYWRkaW5nc2FtcGxlcyk7CisgICAgICAgICAgICB0cmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RW5jb2RlclBhZGRpbmcsIHBhZGRpbmdzYW1wbGVzKTsKKyAgICAgICAgfQorICAgIH0oKTsKKworICAgIGlmICgoZmxhZ3MgJiBrSW5jbHVkZUV4dGVuc2l2ZU1ldGFEYXRhKQorICAgICAgICAgICAgJiYgIXRyYWNrLT5pbmNsdWRlc19leHBlbnNpdmVfbWV0YWRhdGEpIHsKKyAgICAgICAgdHJhY2stPmluY2x1ZGVzX2V4cGVuc2l2ZV9tZXRhZGF0YSA9IHRydWU7CisKKyAgICAgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICAgICAgQ0hFQ0sodHJhY2stPm1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgICAgICBpZiAoIXN0cm5jYXNlY21wKCJ2aWRlby8iLCBtaW1lLCA2KSkgeworICAgICAgICAgICAgLy8gTVBFRzIgdHJhY2tzIGRvIG5vdCBwcm92aWRlIENTRCwgc28gcmVhZCB0aGUgc3RyZWFtIGhlYWRlcgorICAgICAgICAgICAgaWYgKCFzdHJjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzIpKSB7CisgICAgICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQ7CisgICAgICAgICAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5zYW1wbGVUYWJsZS0+Z2V0TWV0YURhdGFGb3JTYW1wbGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBzYW1wbGVJbmRleCAqLywgJm9mZnNldCwgJnNpemUsIE5VTEwgLyogc2FtcGxlVGltZSAqLykgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPiBrTWF4VHJhY2tIZWFkZXJTaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0ga01heFRyYWNrSGVhZGVyU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB1aW50OF90IGhlYWRlcltrTWF4VHJhY2tIZWFkZXJTaXplXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCAmaGVhZGVyLCBzaXplKSA9PSAoc3NpemVfdClzaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bWV0YS5zZXREYXRhKGtLZXlTdHJlYW1IZWFkZXIsICdtZGF0JywgaGVhZGVyLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1Nb29mT2Zmc2V0ID4gMCkgeworICAgICAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb247CisgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5tZXRhLmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvbikpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZyBmYW5jeSwganVzdCBwaWNrIGEgZnJhbWUgbmVhciAxLzR0aCBvZiB0aGUgZHVyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1ldGEuc2V0SW50NjQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleVRodW1ibmFpbFRpbWUsIGR1cmF0aW9uIC8gNCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVJbmRleDsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVUaW1lOworICAgICAgICAgICAgICAgIGlmICh0cmFjay0+dGltZXNjYWxlICE9IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5zYW1wbGVUYWJsZS0+ZmluZFRodW1ibmFpbFNhbXBsZSgmc2FtcGxlSW5kZXgpID09IE9LCisgICAgICAgICAgICAgICAgICAgICAgICAmJiB0cmFjay0+c2FtcGxlVGFibGUtPmdldE1ldGFEYXRhRm9yU2FtcGxlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUluZGV4LCBOVUxMIC8qIG9mZnNldCAqLywgTlVMTCAvKiBzaXplICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVUaW1lKSA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICB0cmFjay0+bWV0YS5zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5VGh1bWJuYWlsVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGludDY0X3Qpc2FtcGxlVGltZSAqIDEwMDAwMDApIC8gdHJhY2stPnRpbWVzY2FsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgbWV0YSA9IHRyYWNrLT5tZXRhOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnJlYWRNZXRhRGF0YSgpIHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBOT19JTklUKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIG9mZjY0X3Qgb2Zmc2V0ID0gMDsKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgYm9vbCBzYXdNb292T3JTaWR4ID0gZmFsc2U7CisKKyAgICB3aGlsZSAoISgobUhhc01vb3ZCb3ggJiYgc2F3TW9vdk9yU2lkeCAmJiAobU1kYXRGb3VuZCB8fCBtTW9vZkZvdW5kKSkgfHwKKyAgICAgICAgICAgICAobUlzSGVpZiAmJiAobVByZWZlckhlaWYgfHwgIW1IYXNNb292Qm94KSAmJgorICAgICAgICAgICAgICAgICAgICAgKG1JdGVtVGFibGUgIT0gTlVMTCkgJiYgbUl0ZW1UYWJsZS0+aXNWYWxpZCgpKSkpIHsKKyAgICAgICAgb2ZmNjRfdCBvcmlnX29mZnNldCA9IG9mZnNldDsKKyAgICAgICAgZXJyID0gcGFyc2VDaHVuaygmb2Zmc2V0LCAwKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LICYmIGVyciAhPSBVTktOT1dOX0VSUk9SKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmIChvZmZzZXQgPD0gb3JpZ19vZmZzZXQpIHsKKyAgICAgICAgICAgIC8vIG9ubHkgY29udGludWUgcGFyc2luZyBpZiB0aGUgb2Zmc2V0IHdhcyBhZHZhbmNlZCwKKyAgICAgICAgICAgIC8vIG90aGVyd2lzZSB3ZSBtaWdodCBlbmQgdXAgaW4gYW4gaW5maW5pdGUgbG9vcAorICAgICAgICAgICAgQUxPR0UoImRpZCBub3QgYWR2YW5jZTogJWxsZC0+JWxsZCIsIChsb25nIGxvbmcpb3JpZ19vZmZzZXQsIChsb25nIGxvbmcpb2Zmc2V0KTsKKyAgICAgICAgICAgIGVyciA9IEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBVTktOT1dOX0VSUk9SKSB7CisgICAgICAgICAgICBzYXdNb292T3JTaWR4ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtSXNIZWlmICYmIChtSXRlbVRhYmxlICE9IE5VTEwpICYmIChtSXRlbVRhYmxlLT5jb3VudEltYWdlcygpID4gMCkpIHsKKyAgICAgICAgb2ZmNjRfdCBleGlmT2Zmc2V0OworICAgICAgICBzaXplX3QgZXhpZlNpemU7CisgICAgICAgIGlmIChtSXRlbVRhYmxlLT5nZXRFeGlmT2Zmc2V0QW5kU2l6ZSgmZXhpZk9mZnNldCwgJmV4aWZTaXplKSA9PSBPSykgeworICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRJbnQ2NChrS2V5RXhpZk9mZnNldCwgKGludDY0X3QpZXhpZk9mZnNldCk7CisgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldEludDY0KGtLZXlFeGlmU2l6ZSwgKGludDY0X3QpZXhpZlNpemUpOworICAgICAgICB9CisgICAgICAgIGZvciAodWludDMyX3QgaW1hZ2VJbmRleCA9IDA7CisgICAgICAgICAgICAgICAgaW1hZ2VJbmRleCA8IG1JdGVtVGFibGUtPmNvdW50SW1hZ2VzKCk7IGltYWdlSW5kZXgrKykgeworICAgICAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtSXRlbVRhYmxlLT5nZXRJbWFnZU1ldGEoaW1hZ2VJbmRleCk7CisgICAgICAgICAgICBpZiAobWV0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImhlaWYgaW1hZ2UgJXUgaGFzIG5vIG1ldGEhIiwgaW1hZ2VJbmRleCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBTb21lIGhlaWYgZmlsZXMgYWR2ZXJ0aXNlIGltYWdlIHNlcXVlbmNlIGJyYW5kcyAoZWcuICdoZXZjJykgaW4KKyAgICAgICAgICAgIC8vIGZ0eXAgYm94LCBidXQgZG9uJ3QgaGF2ZSBhbnkgdmFsaWQgdHJhY2tzIGluIHRoZW0uIEluc3RlYWQgb2YKKyAgICAgICAgICAgIC8vIHJlcG9ydGluZyB0aGUgZW50aXJlIGZpbGUgYXMgbWFsZm9ybWVkLCB3ZSBvdmVycmlkZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIC8vIHRvIGFsbG93IHN0aWxsIGltYWdlcyB0byBiZSBleHRyYWN0ZWQuCisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIkV4dHJhY3Rpbmcgc3RpbGwgaW1hZ2VzIG9ubHkiKTsKKyAgICAgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBPSzsKKworICAgICAgICAgICAgQUxPR1YoImFkZGluZyBIRUlGIGltYWdlIHRyYWNrICV1IiwgaW1hZ2VJbmRleCk7CisgICAgICAgICAgICBUcmFjayAqdHJhY2sgPSBuZXcgVHJhY2s7CisgICAgICAgICAgICB0cmFjay0+bmV4dCA9IE5VTEw7CisgICAgICAgICAgICBpZiAobUxhc3RUcmFjayAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bmV4dCA9IHRyYWNrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtRmlyc3RUcmFjayA9IHRyYWNrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUxhc3RUcmFjayA9IHRyYWNrOworCisgICAgICAgICAgICB0cmFjay0+bWV0YSA9ICoobWV0YS5nZXQoKSk7CisgICAgICAgICAgICB0cmFjay0+bWV0YS5zZXRJbnQzMihrS2V5VHJhY2tJRCwgaW1hZ2VJbmRleCk7CisgICAgICAgICAgICB0cmFjay0+aW5jbHVkZXNfZXhwZW5zaXZlX21ldGFkYXRhID0gZmFsc2U7CisgICAgICAgICAgICB0cmFjay0+c2tpcFRyYWNrID0gZmFsc2U7CisgICAgICAgICAgICB0cmFjay0+dGltZXNjYWxlID0gMTAwMDAwMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtSW5pdENoZWNrID09IE9LKSB7CisgICAgICAgIGlmIChmaW5kVHJhY2tCeU1pbWVQcmVmaXgoInZpZGVvLyIpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZygKKyAgICAgICAgICAgICAgICAgICAga0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzQpOworICAgICAgICB9IGVsc2UgaWYgKGZpbmRUcmFja0J5TWltZVByZWZpeCgiYXVkaW8vIikgIT0gTlVMTCkgeworICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgImF1ZGlvL21wNCIpOworICAgICAgICB9IGVsc2UgaWYgKGZpbmRUcmFja0J5TWltZVByZWZpeCgKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZygKKyAgICAgICAgICAgICAgICAgICAga0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfSEVJRik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBtSW5pdENoZWNrID0gZXJyOworICAgIH0KKworICAgIENIRUNLX05FKGVyciwgKHN0YXR1c190KU5PX0lOSVQpOworCisgICAgLy8gY29weSBwc3NoIGRhdGEgaW50byBmaWxlIG1ldGFkYXRhCisgICAgdWludDY0X3QgcHNzaHNpemUgPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBzc2guc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgcHNzaHNpemUgKz0gMjAgKyBtUHNzaFtpXS5kYXRhbGVuOworICAgIH0KKyAgICBpZiAocHNzaHNpemUgPiAwICYmIHBzc2hzaXplIDw9IFVJTlQzMl9NQVgpIHsKKyAgICAgICAgY2hhciAqYnVmID0gKGNoYXIqKW1hbGxvYyhwc3Noc2l6ZSk7CisgICAgICAgIGlmICghYnVmKSB7CisgICAgICAgICAgICBBTE9HRSgiYi8yODQ3MTIwNiIpOworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQorICAgICAgICBjaGFyICpwdHIgPSBidWY7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBzc2guc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIG1lbWNweShwdHIsIG1Qc3NoW2ldLnV1aWQsIDIwKTsgLy8gdXVpZCArIGxlbmd0aAorICAgICAgICAgICAgbWVtY3B5KHB0ciArIDIwLCBtUHNzaFtpXS5kYXRhLCBtUHNzaFtpXS5kYXRhbGVuKTsKKyAgICAgICAgICAgIHB0ciArPSAoMjAgKyBtUHNzaFtpXS5kYXRhbGVuKTsKKyAgICAgICAgfQorICAgICAgICBtRmlsZU1ldGFEYXRhLnNldERhdGEoa0tleVBzc2gsICdwc3NoJywgYnVmLCBwc3Noc2l6ZSk7CisgICAgICAgIGZyZWUoYnVmKTsKKyAgICB9CisKKyAgICByZXR1cm4gbUluaXRDaGVjazsKK30KKworc3RydWN0IFBhdGhBZGRlciB7CisgICAgUGF0aEFkZGVyKFZlY3Rvcjx1aW50MzJfdD4gKnBhdGgsIHVpbnQzMl90IGNodW5rVHlwZSkKKyAgICAgICAgOiBtUGF0aChwYXRoKSB7CisgICAgICAgIG1QYXRoLT5wdXNoKGNodW5rVHlwZSk7CisgICAgfQorCisgICAgflBhdGhBZGRlcigpIHsKKyAgICAgICAgbVBhdGgtPnBvcCgpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBWZWN0b3I8dWludDMyX3Q+ICptUGF0aDsKKworICAgIFBhdGhBZGRlcihjb25zdCBQYXRoQWRkZXIgJik7CisgICAgUGF0aEFkZGVyICZvcGVyYXRvcj0oY29uc3QgUGF0aEFkZGVyICYpOworfTsKKworc3RhdGljIGJvb2wgdW5kZXJNZXRhRGF0YVBhdGgoY29uc3QgVmVjdG9yPHVpbnQzMl90PiAmcGF0aCkgeworICAgIHJldHVybiBwYXRoLnNpemUoKSA+PSA1CisgICAgICAgICYmIHBhdGhbMF0gPT0gRk9VUkNDKCdtJywgJ28nLCAnbycsICd2JykKKyAgICAgICAgJiYgcGF0aFsxXSA9PSBGT1VSQ0MoJ3UnLCAnZCcsICd0JywgJ2EnKQorICAgICAgICAmJiBwYXRoWzJdID09IEZPVVJDQygnbScsICdlJywgJ3QnLCAnYScpCisgICAgICAgICYmIHBhdGhbM10gPT0gRk9VUkNDKCdpJywgJ2wnLCAncycsICd0Jyk7Cit9CisKK3N0YXRpYyBib29sIHVuZGVyUVRNZXRhUGF0aChjb25zdCBWZWN0b3I8dWludDMyX3Q+ICZwYXRoLCBpbnQzMl90IGRlcHRoKSB7CisgICAgcmV0dXJuIHBhdGguc2l6ZSgpID49IDIKKyAgICAgICAgICAgICYmIHBhdGhbMF0gPT0gRk9VUkNDKCdtJywgJ28nLCAnbycsICd2JykKKyAgICAgICAgICAgICYmIHBhdGhbMV0gPT0gRk9VUkNDKCdtJywgJ2UnLCAndCcsICdhJykKKyAgICAgICAgICAgICYmIChkZXB0aCA9PSAyCisgICAgICAgICAgICB8fCAoZGVwdGggPT0gMworICAgICAgICAgICAgICAgICAgICAmJiAocGF0aFsyXSA9PSBGT1VSQ0MoJ2gnLCAnZCcsICdsJywgJ3InKQorICAgICAgICAgICAgICAgICAgICB8fCAgcGF0aFsyXSA9PSBGT1VSQ0MoJ2knLCAnbCcsICdzJywgJ3QnKQorICAgICAgICAgICAgICAgICAgICB8fCAgcGF0aFsyXSA9PSBGT1VSQ0MoJ2snLCAnZScsICd5JywgJ3MnKSkpKTsKK30KKworLy8gR2l2ZW4gYSB0aW1lIGluIHNlY29uZHMgc2luY2UgSmFuIDEgMTkwNCwgcHJvZHVjZSBhIGh1bWFuLXJlYWRhYmxlIHN0cmluZy4KK3N0YXRpYyBib29sIGNvbnZlcnRUaW1lVG9EYXRlKGludDY0X3QgdGltZV8xOTA0LCBTdHJpbmc4ICpzKSB7CisgICAgLy8gZGVsdGEgYmV0d2VlbiBtcGVnNCB0aW1lIGFuZCB1bml4IGVwb2NoIHRpbWUKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBkZWx0YSA9ICgoKDY2ICogMzY1ICsgMTcpICogMjQpICogMzYwMCk7CisgICAgaWYgKHRpbWVfMTkwNCA8IElOVDY0X01JTiArIGRlbHRhKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdGltZV90IHRpbWVfMTk3MCA9IHRpbWVfMTkwNCAtIGRlbHRhOworCisgICAgY2hhciB0bXBbMzJdOworICAgIHN0cnVjdCB0bSogdG0gPSBnbXRpbWUoJnRpbWVfMTk3MCk7CisgICAgaWYgKHRtICE9IE5VTEwgJiYKKyAgICAgICAgICAgIHN0cmZ0aW1lKHRtcCwgc2l6ZW9mKHRtcCksICIlWSVtJWRUJUglTSVTLjAwMFoiLCB0bSkgPiAwKSB7CisgICAgICAgIHMtPnNldFRvKHRtcCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZUNodW5rKG9mZjY0X3QgKm9mZnNldCwgaW50IGRlcHRoKSB7CisgICAgQUxPR1YoImVudGVyaW5nIHBhcnNlQ2h1bmsgJWxsZC8lZCIsIChsb25nIGxvbmcpKm9mZnNldCwgZGVwdGgpOworCisgICAgaWYgKCpvZmZzZXQgPCAwKSB7CisgICAgICAgIEFMT0dFKCJiLzIzNTQwOTE0Iik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIGlmIChkZXB0aCA+IDEwMCkgeworICAgICAgICBBTE9HRSgiYi8yNzQ1NjI5OSIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICB1aW50MzJfdCBoZHJbMl07CisgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoKm9mZnNldCwgaGRyLCA4KSA8IDgpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKyAgICB1aW50NjRfdCBjaHVua19zaXplID0gbnRvaGwoaGRyWzBdKTsKKyAgICBpbnQzMl90IGNodW5rX3R5cGUgPSBudG9obChoZHJbMV0pOworICAgIG9mZjY0X3QgZGF0YV9vZmZzZXQgPSAqb2Zmc2V0ICsgODsKKworICAgIGlmIChjaHVua19zaXplID09IDEpIHsKKyAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoKm9mZnNldCArIDgsICZjaHVua19zaXplLCA4KSA8IDgpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfQorICAgICAgICBjaHVua19zaXplID0gbnRvaDY0KGNodW5rX3NpemUpOworICAgICAgICBkYXRhX29mZnNldCArPSA4OworCisgICAgICAgIGlmIChjaHVua19zaXplIDwgMTYpIHsKKyAgICAgICAgICAgIC8vIFRoZSBzbWFsbGVzdCB2YWxpZCBjaHVuayBpcyAxNiBieXRlcyBsb25nIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGNodW5rX3NpemUgPT0gMCkgeworICAgICAgICBpZiAoZGVwdGggPT0gMCkgeworICAgICAgICAgICAgLy8gYXRvbSBleHRlbmRzIHRvIGVuZCBvZiBmaWxlCisgICAgICAgICAgICBvZmY2NF90IHNvdXJjZVNpemU7CisgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPmdldFNpemUoJnNvdXJjZVNpemUpID09IE9LKSB7CisgICAgICAgICAgICAgICAgY2h1bmtfc2l6ZSA9IChzb3VyY2VTaXplIC0gKm9mZnNldCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFhYWCBjb3VsZCB3ZSBqdXN0IHBpY2sgYSAic3VmZmljaWVudGx5IGxhcmdlIiB2YWx1ZSBoZXJlPworICAgICAgICAgICAgICAgIEFMT0dFKCJhdG9tIHNpemUgaXMgMCwgYW5kIGRhdGEgc291cmNlIGhhcyBubyBzaXplIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIG5vdCBhbGxvd2VkIGZvciBub24tdG9wbGV2ZWwgYXRvbXMsIHNraXAgaXQKKyAgICAgICAgICAgICpvZmZzZXQgKz0gNDsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoY2h1bmtfc2l6ZSA8IDgpIHsKKyAgICAgICAgLy8gVGhlIHNtYWxsZXN0IHZhbGlkIGNodW5rIGlzIDggYnl0ZXMgbG9uZy4KKyAgICAgICAgQUxPR0UoImludmFsaWQgY2h1bmsgc2l6ZTogJSIgUFJJdTY0LCBjaHVua19zaXplKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBjaGFyIGNodW5rWzVdOworICAgIE1ha2VGb3VyQ0NTdHJpbmcoY2h1bmtfdHlwZSwgY2h1bmspOworICAgIEFMT0dWKCJjaHVuazogJXMgQCAlbGxkLCAlZCIsIGNodW5rLCAobG9uZyBsb25nKSpvZmZzZXQsIGRlcHRoKTsKKworICAgIGlmIChrVXNlSGV4RHVtcCkgeworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBrV2hpdGVzcGFjZVtdID0gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOworICAgICAgICBjb25zdCBjaGFyICppbmRlbnQgPSAma1doaXRlc3BhY2Vbc2l6ZW9mKGtXaGl0ZXNwYWNlKSAtIDEgLSAyICogZGVwdGhdOworICAgICAgICBwcmludGYoIiVzZm91bmQgY2h1bmsgJyVzJyBvZiBzaXplICUiIFBSSXU2NCAiXG4iLCBpbmRlbnQsIGNodW5rLCBjaHVua19zaXplKTsKKworICAgICAgICBjaGFyIGJ1ZmZlclsyNTZdOworICAgICAgICBzaXplX3QgbiA9IGNodW5rX3NpemU7CisgICAgICAgIGlmIChuID4gc2l6ZW9mKGJ1ZmZlcikpIHsKKyAgICAgICAgICAgIG4gPSBzaXplb2YoYnVmZmVyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgqb2Zmc2V0LCBidWZmZXIsIG4pCisgICAgICAgICAgICAgICAgPCAoc3NpemVfdCluKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgIH0KKworICAgICAgICBoZXhkdW1wKGJ1ZmZlciwgbik7CisgICAgfQorCisgICAgUGF0aEFkZGVyIGF1dG9BZGRlcigmbVBhdGgsIGNodW5rX3R5cGUpOworCisgICAgLy8gKGRhdGFfb2Zmc2V0IC0gKm9mZnNldCkgaXMgZWl0aGVyIDggb3IgMTYKKyAgICBvZmY2NF90IGNodW5rX2RhdGFfc2l6ZSA9IGNodW5rX3NpemUgLSAoZGF0YV9vZmZzZXQgLSAqb2Zmc2V0KTsKKyAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgMCkgeworICAgICAgICBBTE9HRSgiYi8yMzU0MDkxNCIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICBpZiAoY2h1bmtfdHlwZSAhPSBGT1VSQ0MoJ20nLCAnZCcsICdhJywgJ3QnKSAmJiBjaHVua19kYXRhX3NpemUgPiBrTWF4QXRvbVNpemUpIHsKKyAgICAgICAgY2hhciBlcnJNc2dbMTAwXTsKKyAgICAgICAgc3ByaW50ZihlcnJNc2csICIlcyBhdG9tIGhhcyBzaXplICUiIFBSSWQ2NCwgY2h1bmssIGNodW5rX2RhdGFfc2l6ZSk7CisgICAgICAgIEFMT0dFKCIlcyAoYi8yODYxNTQ0OCkiLCBlcnJNc2cpOworICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVXaXRoSW5mb0xvZygweDUzNGU0NTU0LCAiMjg2MTU0NDgiLCAtMSwgZXJyTXNnLCBzdHJsZW4oZXJyTXNnKSk7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgaWYgKGNodW5rX3R5cGUgIT0gRk9VUkNDKCdjJywgJ3AnLCAncicsICd0JykKKyAgICAgICAgICAgICYmIGNodW5rX3R5cGUgIT0gRk9VUkNDKCdjJywgJ28nLCAndicsICdyJykKKyAgICAgICAgICAgICYmIG1QYXRoLnNpemUoKSA9PSA1ICYmIHVuZGVyTWV0YURhdGFQYXRoKG1QYXRoKSkgeworICAgICAgICBvZmY2NF90IHN0b3Bfb2Zmc2V0ID0gKm9mZnNldCArIGNodW5rX3NpemU7CisgICAgICAgICpvZmZzZXQgPSBkYXRhX29mZnNldDsKKyAgICAgICAgd2hpbGUgKCpvZmZzZXQgPCBzdG9wX29mZnNldCkgeworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VDaHVuayhvZmZzZXQsIGRlcHRoICsgMSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICgqb2Zmc2V0ICE9IHN0b3Bfb2Zmc2V0KSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHN3aXRjaChjaHVua190eXBlKSB7CisgICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ28nLCAnbycsICd2Jyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCd0JywgJ3InLCAnYScsICdrJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ2QnLCAnaScsICdhJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ2knLCAnbicsICdmJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdkJywgJ2knLCAnbicsICdmJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ3QnLCAnYicsICdsJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ3YnLCAnZScsICd4Jyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ28nLCAnbycsICdmJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCd0JywgJ3InLCAnYScsICdmJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ2YnLCAncicsICdhJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCd1JywgJ2QnLCAndCcsICdhJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdpJywgJ2wnLCAncycsICd0Jyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ2knLCAnbicsICdmJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ2MnLCAnaCcsICdpJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdlJywgJ2QnLCAndCcsICdzJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCd3JywgJ2EnLCAndicsICdlJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjaHVua190eXBlID09IEZPVVJDQygnbScsICdvJywgJ28nLCAndicpICYmIGRlcHRoICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgibW9vdjogZGVwdGggJWQiLCBkZXB0aCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCdtJywgJ28nLCAnbycsICd2JykgJiYgbUluaXRDaGVjayA9PSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJkdXBsaWNhdGUgbW9vdiIpOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjaHVua190eXBlID09IEZPVVJDQygnbScsICdvJywgJ28nLCAnZicpICYmICFtTW9vZkZvdW5kKSB7CisgICAgICAgICAgICAgICAgLy8gc3RvcmUgdGhlIG9mZnNldCBvZiB0aGUgZmlyc3Qgc2VnbWVudAorICAgICAgICAgICAgICAgIG1Nb29mRm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIG1Nb29mT2Zmc2V0ID0gKm9mZnNldDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCdzJywgJ3QnLCAnYicsICdsJykpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigic2FtcGxlVGFibGUgY2h1bmsgaXMgJSIgUFJJdTY0ICIgYnl0ZXMgbG9uZy4iLCBjaHVua19zaXplKTsKKworICAgICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+ZmxhZ3MoKQorICAgICAgICAgICAgICAgICAgICAgICAgJiAoRGF0YVNvdXJjZUJhc2U6OmtXYW50c1ByZWZldGNoaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEYXRhU291cmNlQmFzZTo6a0lzQ2FjaGluZ0RhdGFTb3VyY2UpKSB7CisgICAgICAgICAgICAgICAgICAgIENhY2hlZFJhbmdlZERhdGFTb3VyY2UgKmNhY2hlZFNvdXJjZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZShtRGF0YVNvdXJjZSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlZFNvdXJjZS0+c2V0Q2FjaGVkUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm9mZnNldCwgY2h1bmtfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FjaGVkU291cmNlICE9IE5VTEwgLyogYXNzdW1lIG93bmVyc2hpcCBvbiBzdWNjZXNzICovKSA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgbURhdGFTb3VyY2UgPSBtQ2FjaGVkU291cmNlID0gY2FjaGVkU291cmNlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGNhY2hlZFNvdXJjZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZSA9IG5ldyBTYW1wbGVUYWJsZShtRGF0YVNvdXJjZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2wgaXNUcmFjayA9IGZhbHNlOworICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCd0JywgJ3InLCAnYScsICdrJykpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGVwdGggIT0gMSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgidHJhazogZGVwdGggJWQiLCBkZXB0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlzVHJhY2sgPSB0cnVlOworCisgICAgICAgICAgICAgICAgQUxPR1YoImFkZGluZyBuZXcgdHJhY2siKTsKKyAgICAgICAgICAgICAgICBUcmFjayAqdHJhY2sgPSBuZXcgVHJhY2s7CisgICAgICAgICAgICAgICAgdHJhY2stPm5leHQgPSBOVUxMOworICAgICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrKSB7CisgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm5leHQgPSB0cmFjazsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtRmlyc3RUcmFjayA9IHRyYWNrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtTGFzdFRyYWNrID0gdHJhY2s7CisKKyAgICAgICAgICAgICAgICB0cmFjay0+aW5jbHVkZXNfZXhwZW5zaXZlX21ldGFkYXRhID0gZmFsc2U7CisgICAgICAgICAgICAgICAgdHJhY2stPnNraXBUcmFjayA9IGZhbHNlOworICAgICAgICAgICAgICAgIHRyYWNrLT50aW1lc2NhbGUgPSAwOworICAgICAgICAgICAgICAgIHRyYWNrLT5tZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CisgICAgICAgICAgICAgICAgdHJhY2stPmhhc19lbHN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgdHJhY2stPnN1YnNhbXBsZV9lbmNyeXB0aW9uID0gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG9mZjY0X3Qgc3RvcF9vZmZzZXQgPSAqb2Zmc2V0ICsgY2h1bmtfc2l6ZTsKKyAgICAgICAgICAgICpvZmZzZXQgPSBkYXRhX29mZnNldDsKKyAgICAgICAgICAgIHdoaWxlICgqb2Zmc2V0IDwgc3RvcF9vZmZzZXQpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUNodW5rKG9mZnNldCwgZGVwdGggKyAxKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc1RyYWNrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5za2lwVHJhY2sgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgqb2Zmc2V0ICE9IHN0b3Bfb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGlzVHJhY2spIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHRyYWNrSWQ7CisgICAgICAgICAgICAgICAgLy8gVGhlcmUgbXVzdCBiZSBleGFjdCBvbmUgdHJhY2sgaGVhZGVyIHBlciB0cmFjay4KKyAgICAgICAgICAgICAgICBpZiAoIW1MYXN0VHJhY2stPm1ldGEuZmluZEludDMyKGtLZXlUcmFja0lELCAmdHJhY2tJZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2tpcFRyYWNrID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSB2ZXJpZnlUcmFjayhtTGFzdFRyYWNrKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnNraXBUcmFjayA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2stPnNraXBUcmFjaykgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigic2tpcHBpbmcgdGhpcyB0cmFjay4uLiIpOworICAgICAgICAgICAgICAgICAgICBUcmFjayAqY3VyID0gbUZpcnN0VHJhY2s7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1ciA9PSBtTGFzdFRyYWNrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgY3VyOworICAgICAgICAgICAgICAgICAgICAgICAgbUZpcnN0VHJhY2sgPSBtTGFzdFRyYWNrID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjdXIgJiYgY3VyLT5uZXh0ICE9IG1MYXN0VHJhY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXIgPSBjdXItPm5leHQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyLT5uZXh0ID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBtTGFzdFRyYWNrOworICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjayA9IGN1cjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCdtJywgJ28nLCAnbycsICd2JykpIHsKKyAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gT0s7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsgIC8vIFJldHVybiBhIGR1bW15IGVycm9yLgorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygncycsICdjJywgJ2gnLCAnbScpOgorICAgICAgICB7CisKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKyAgICAgICAgICAgIGlmICghbUxhc3RUcmFjaykgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQzMl90IHNjaGVtZV90eXBlOworICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQgKyA0LCAmc2NoZW1lX3R5cGUsIDQpIDwgNCkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNjaGVtZV90eXBlID0gbnRvaGwoc2NoZW1lX3R5cGUpOworICAgICAgICAgICAgaW50MzJfdCBtb2RlID0ga0NyeXB0b01vZGVVbmVuY3J5cHRlZDsKKyAgICAgICAgICAgIHN3aXRjaChzY2hlbWVfdHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgRk9VUkNDKCdjJywgJ2InLCAnYycsICcxJyk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtb2RlID0ga0NyeXB0b01vZGVBZXNDYmM7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIEZPVVJDQygnYycsICdiJywgJ2MnLCAncycpOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbW9kZSA9IGtDcnlwdG9Nb2RlQWVzQ2JjOworICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5zdWJzYW1wbGVfZW5jcnlwdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIEZPVVJDQygnYycsICdlJywgJ24nLCAnYycpOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbW9kZSA9IGtDcnlwdG9Nb2RlQWVzQ3RyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBGT1VSQ0MoJ2MnLCAnZScsICduJywgJ3MnKToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1vZGUgPSBrQ3J5cHRvTW9kZUFlc0N0cjsKKyAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c3Vic2FtcGxlX2VuY3J5cHRpb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobW9kZSAhPSBrQ3J5cHRvTW9kZVVuZW5jcnlwdGVkKSB7CisgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Q3J5cHRvTW9kZSwgbW9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2UnLCAnbCcsICdzJywgJ3QnKToKKyAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCisgICAgICAgICAgICBpZiAoIW1MYXN0VHJhY2spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTZWUgMTQ0OTYtMTIgOC42LjYKKyAgICAgICAgICAgIHVpbnQ4X3QgdmVyc2lvbjsKKyAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0LCAmdmVyc2lvbiwgMSkgPCAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50MzJfdCBlbnRyeV9jb3VudDsKKyAgICAgICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihkYXRhX29mZnNldCArIDQsICZlbnRyeV9jb3VudCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChlbnRyeV9jb3VudCAhPSAxKSB7CisgICAgICAgICAgICAgICAgLy8gd2Ugb25seSBzdXBwb3J0IGEgc2luZ2xlIGVudHJ5IGF0IHRoZSBtb21lbnQsIGZvciBnYXBsZXNzIHBsYXliYWNrCisgICAgICAgICAgICAgICAgQUxPR1coImlnbm9yaW5nIGVkaXQgbGlzdCB3aXRoICVkIGVudHJpZXMiLCBlbnRyeV9jb3VudCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG9mZjY0X3QgZW50cmllc29mZnNldCA9IGRhdGFfb2Zmc2V0ICsgODsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCBzZWdtZW50X2R1cmF0aW9uOworICAgICAgICAgICAgICAgIGludDY0X3QgbWVkaWFfdGltZTsKKworICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDY0KGVudHJpZXNvZmZzZXQsICZzZWdtZW50X2R1cmF0aW9uKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICFtRGF0YVNvdXJjZS0+Z2V0VUludDY0KGVudHJpZXNvZmZzZXQgKyA4LCAodWludDY0X3QqKSZtZWRpYV90aW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2Q7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbXQ7CisgICAgICAgICAgICAgICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihlbnRyaWVzb2Zmc2V0LCAmc2QpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIW1EYXRhU291cmNlLT5nZXRVSW50MzIoZW50cmllc29mZnNldCArIDQsICh1aW50MzJfdCopJm10KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNlZ21lbnRfZHVyYXRpb24gPSBzZDsKKyAgICAgICAgICAgICAgICAgICAgbWVkaWFfdGltZSA9IG10OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBzYXZlIHRoZXNlIGZvciBsYXRlciwgYmVjYXVzZSB0aGUgZWxzdCBhdG9tIG1pZ2h0IHByZWNlZGUKKyAgICAgICAgICAgICAgICAvLyB0aGUgYXRvbXMgdGhhdCBhY3R1YWxseSBnaXZlcyB1cyB0aGUgZHVyYXRpb24gYW5kIHNhbXBsZSByYXRlCisgICAgICAgICAgICAgICAgLy8gbmVlZGVkIHRvIGNhbGN1bGF0ZSB0aGUgcGFkZGluZyBhbmQgZGVsYXkgdmFsdWVzCisgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+aGFzX2Vsc3QgPSB0cnVlOworICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPmVsc3RfbWVkaWFfdGltZSA9IG1lZGlhX3RpbWU7CisgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+ZWxzdF9zZWdtZW50X2R1cmF0aW9uID0gc2VnbWVudF9kdXJhdGlvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2YnLCAncicsICdtJywgJ2EnKToKKyAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCisgICAgICAgICAgICB1aW50MzJfdCBvcmlnaW5hbF9mb3VyY2M7CisgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChkYXRhX29mZnNldCwgJm9yaWdpbmFsX2ZvdXJjYywgNCkgPCA0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3JpZ2luYWxfZm91cmNjID0gbnRvaGwob3JpZ2luYWxfZm91cmNjKTsKKyAgICAgICAgICAgIEFMT0dWKCJyZWFkIG9yaWdpbmFsIGZvcm1hdDogJWQiLCBvcmlnaW5hbF9mb3VyY2MpOworCisgICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgRm91ckNDMk1JTUUob3JpZ2luYWxfZm91cmNjKSk7CisgICAgICAgICAgICB1aW50MzJfdCBudW1fY2hhbm5lbHMgPSAwOworICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlX3JhdGUgPSAwOworICAgICAgICAgICAgaWYgKEFkanVzdENoYW5uZWxzQW5kUmF0ZShvcmlnaW5hbF9mb3VyY2MsICZudW1fY2hhbm5lbHMsICZzYW1wbGVfcmF0ZSkpIHsKKyAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG51bV9jaGFubmVscyk7CisgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlX3JhdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygndCcsICdlJywgJ24nLCAnYycpOgorICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKKyAgICAgICAgICAgIGlmIChjaHVua19zaXplIDwgMzIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB0ZW5jIGJveCBjb250YWlucyAxIGJ5dGUgdmVyc2lvbiwgMyBieXRlIGZsYWdzLCAzIGJ5dGUgZGVmYXVsdCBhbGdvcml0aG0gaWQsIG9uZSBieXRlCisgICAgICAgICAgICAvLyBkZWZhdWx0IElWIHNpemUsIDE2IGJ5dGVzIGRlZmF1bHQgS2V5SUQKKyAgICAgICAgICAgIC8vIChJU08gMjMwMDEtNykKKworICAgICAgICAgICAgdWludDhfdCB2ZXJzaW9uOworICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQsICZ2ZXJzaW9uLCBzaXplb2YodmVyc2lvbikpCisgICAgICAgICAgICAgICAgICAgIDwgKHNzaXplX3Qpc2l6ZW9mKHZlcnNpb24pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50OF90IGJ1Zls0XTsKKyAgICAgICAgICAgIG1lbXNldChidWYsIDAsIDQpOworICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQgKyA0LCBidWYgKyAxLCAzKSA8IDMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50OF90IGRlZmF1bHRFbmNyeXB0ZWRCeXRlQmxvY2sgPSAwOworICAgICAgICAgICAgdWludDhfdCBkZWZhdWx0U2tpcEJ5dGVCbG9jayA9IDA7CisgICAgICAgICAgICB1aW50MzJfdCBkZWZhdWx0QWxnb3JpdGhtSWQgPSBudG9obCgqKChpbnQzMl90KilidWYpKTsKKyAgICAgICAgICAgIGlmICh2ZXJzaW9uID09IDEpIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwYXR0ZXJuID0gYnVmWzJdOworICAgICAgICAgICAgICAgIGRlZmF1bHRFbmNyeXB0ZWRCeXRlQmxvY2sgPSBwYXR0ZXJuID4+IDQ7CisgICAgICAgICAgICAgICAgZGVmYXVsdFNraXBCeXRlQmxvY2sgPSBwYXR0ZXJuICYgMHhmOworICAgICAgICAgICAgICAgIGlmIChkZWZhdWx0RW5jcnlwdGVkQnl0ZUJsb2NrID09IDAgJiYgZGVmYXVsdFNraXBCeXRlQmxvY2sgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyB1c2UgKDEsMCkgdG8gbWVhbiAiZW5jcnlwdCBldmVyeXRoaW5nIgorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0RW5jcnlwdGVkQnl0ZUJsb2NrID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1MYXN0VHJhY2stPnN1YnNhbXBsZV9lbmNyeXB0aW9uKSB7CisgICAgICAgICAgICAgICAgQUxPR1coInN1YnNhbXBsZV9lbmNyeXB0aW9uIHNob3VsZCBiZSB2ZXJzaW9uIDEiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVmYXVsdEFsZ29yaXRobUlkID4gMSkgeworICAgICAgICAgICAgICAgIC8vIG9ubHkgMCAoY2xlYXIpIGFuZCAxIChBRVMtMTI4KSBhcmUgdmFsaWQKKyAgICAgICAgICAgICAgICBBTE9HVygiZGVmYXVsdEFsZ29yaXRobUlkOiAldSBpcyBhIHJlc2VydmVkIHZhbHVlIiwgZGVmYXVsdEFsZ29yaXRobUlkKTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0QWxnb3JpdGhtSWQgPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtZW1zZXQoYnVmLCAwLCA0KTsKKyAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0ICsgNywgYnVmICsgMywgMSkgPCAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWludDMyX3QgZGVmYXVsdElWU2l6ZSA9IG50b2hsKCooKGludDMyX3QqKWJ1ZikpOworCisgICAgICAgICAgICBpZiAoZGVmYXVsdEFsZ29yaXRobUlkID09IDAgJiYgZGVmYXVsdElWU2l6ZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgLy8gb25seSB1bmVuY3J5cHRlZCBkYXRhIG11c3QgaGF2ZSAwIElWIHNpemUKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfSBlbHNlIGlmIChkZWZhdWx0SVZTaXplICE9IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdElWU2l6ZSAhPSA4ICYmCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRJVlNpemUgIT0gMTYpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50OF90IGRlZmF1bHRLZXlJZFsxNl07CisKKyAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0ICsgOCwgJmRlZmF1bHRLZXlJZCwgMTYpIDwgMTYpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGRlZmF1bHRDb25zdGFudEl2OworICAgICAgICAgICAgaWYgKGRlZmF1bHRBbGdvcml0aG1JZCAhPSAwICYmIGRlZmF1bHRJVlNpemUgPT0gMCkgeworCisgICAgICAgICAgICAgICAgdWludDhfdCBpdmxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChkYXRhX29mZnNldCArIDI0LCAmaXZsZW5ndGgsIHNpemVvZihpdmxlbmd0aCkpCisgICAgICAgICAgICAgICAgICAgICAgICA8IChzc2l6ZV90KXNpemVvZihpdmxlbmd0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChpdmxlbmd0aCAhPSA4ICYmIGl2bGVuZ3RoICE9IDE2KSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJ1bnN1cHBvcnRlZCBJViBsZW5ndGg6ICV1IiwgaXZsZW5ndGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHRDb25zdGFudEl2ID0gbmV3IEFCdWZmZXIoaXZsZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0ICsgMjUsIGRlZmF1bHRDb25zdGFudEl2LT5kYXRhKCksIGl2bGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICAgICAgPCAoc3NpemVfdClpdmxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdENvbnN0YW50SXYtPnNldFJhbmdlKDAsIGl2bGVuZ3RoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50MzJfdCB0bXBBbGdvcml0aG1JZDsKKyAgICAgICAgICAgIGlmICghbUxhc3RUcmFjay0+bWV0YS5maW5kSW50MzIoa0tleUNyeXB0b01vZGUsICZ0bXBBbGdvcml0aG1JZCkpIHsKKyAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDcnlwdG9Nb2RlLCBkZWZhdWx0QWxnb3JpdGhtSWQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDcnlwdG9EZWZhdWx0SVZTaXplLCBkZWZhdWx0SVZTaXplKTsKKyAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0RGF0YShrS2V5Q3J5cHRvS2V5LCAndGVuYycsIGRlZmF1bHRLZXlJZCwgMTYpOworICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RW5jcnlwdGVkQnl0ZUJsb2NrLCBkZWZhdWx0RW5jcnlwdGVkQnl0ZUJsb2NrKTsKKyAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVNraXBCeXRlQmxvY2ssIGRlZmF1bHRTa2lwQnl0ZUJsb2NrKTsKKyAgICAgICAgICAgIGlmIChkZWZhdWx0Q29uc3RhbnRJdiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXREYXRhKGtLZXlDcnlwdG9JViwgJ2RjaXYnLCBkZWZhdWx0Q29uc3RhbnRJdi0+ZGF0YSgpLCBkZWZhdWx0Q29uc3RhbnRJdi0+c2l6ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAnaycsICdoJywgJ2QnKToKKyAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCisgICAgICAgICAgICBzdGF0dXNfdCBlcnI7CisgICAgICAgICAgICBpZiAoKGVyciA9IHBhcnNlVHJhY2tIZWFkZXIoZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSkpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygndCcsICdyJywgJ2UnLCAnZicpOgorICAgICAgICB7CisgICAgICAgICAgICBvZmY2NF90IHN0b3Bfb2Zmc2V0ID0gKm9mZnNldCArIGNodW5rX3NpemU7CisgICAgICAgICAgICAqb2Zmc2V0ID0gZGF0YV9vZmZzZXQ7CisgICAgICAgICAgICB3aGlsZSAoKm9mZnNldCA8IHN0b3Bfb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VDaHVuayhvZmZzZXQsIGRlcHRoICsgMSk7CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgqb2Zmc2V0ICE9IHN0b3Bfb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAnaCcsICdtJywgJ2InKToKKyAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCisgICAgICAgICAgICBpZiAobUxhc3RUcmFjayAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgLy8gU2tpcCB0aHVtYm5haWwgdHJhY2sgZm9yIG5vdyBzaW5jZSB3ZSBkb24ndCBoYXZlIGFuCisgICAgICAgICAgICAgICAgLy8gQVBJIHRvIHJldHJpZXZlIGl0IHlldC4KKyAgICAgICAgICAgICAgICAvLyBUaGUgdGh1bWJuYWlsIHRyYWNrIGNhbid0IGJlIGFjY2Vzc2VkIGJ5IG5lZ2F0aXZlIGluZGV4IG9yIHRpbWUsCisgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSBlYWNoIHRpbWVkIHNhbXBsZSBoYXMgaXRzIG93biBjb3JyZXNwb25kaW5nIHRodW1ibmFpbAorICAgICAgICAgICAgICAgIC8vIGluIHRoZSB0aHVtYm5haWwgdHJhY2suIFdlJ2xsIG5lZWQgYSBkZWRpY2F0ZWQgQVBJIHRvIHJldHJpZXZlCisgICAgICAgICAgICAgICAgLy8gdGh1bWJuYWlsIGF0IHRpbWUgaW5zdGVhZC4KKyAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5za2lwVHJhY2sgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRk9VUkNDKCdwJywgJ3MnLCAncycsICdoJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKworICAgICAgICAgICAgUHNzaEluZm8gcHNzaDsKKworICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQgKyA0LCAmcHNzaC51dWlkLCAxNikgPCAxNikgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdWludDMyX3QgcHNzaGRhdGFsZW4gPSAwOworICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQgKyAyMCwgJnBzc2hkYXRhbGVuLCA0KSA8IDQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwc3NoLmRhdGFsZW4gPSBudG9obChwc3NoZGF0YWxlbik7CisgICAgICAgICAgICBBTE9HVigicHNzaCBkYXRhIHNpemU6ICVkIiwgcHNzaC5kYXRhbGVuKTsKKyAgICAgICAgICAgIGlmIChjaHVua19zaXplIDwgMjAgfHwgcHNzaC5kYXRhbGVuID4gY2h1bmtfc2l6ZSAtIDIwKSB7CisgICAgICAgICAgICAgICAgLy8gcHNzaCBkYXRhIGxlbmd0aCBleGNlZWRzIHNpemUgb2YgY29udGFpbmluZyBib3gKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwc3NoLmRhdGEgPSBuZXcgKHN0ZDo6bm90aHJvdykgdWludDhfdFtwc3NoLmRhdGFsZW5dOworICAgICAgICAgICAgaWYgKHBzc2guZGF0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJhbGxvY2F0ZWQgcHNzaCBAICVwIiwgcHNzaC5kYXRhKTsKKyAgICAgICAgICAgIHNzaXplX3QgcmVxdWVzdGVkID0gKHNzaXplX3QpIHBzc2guZGF0YWxlbjsKKyAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0ICsgMjQsIHBzc2guZGF0YSwgcmVxdWVzdGVkKSA8IHJlcXVlc3RlZCkgeworICAgICAgICAgICAgICAgIGRlbGV0ZVtdIHBzc2guZGF0YTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUHNzaC5wdXNoX2JhY2socHNzaCk7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnZCcsICdoJywgJ2QnKToKKyAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCisgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgNCB8fCBtTGFzdFRyYWNrID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50OF90IHZlcnNpb247CisgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCAmdmVyc2lvbiwgc2l6ZW9mKHZlcnNpb24pKQorICAgICAgICAgICAgICAgICAgICA8IChzc2l6ZV90KXNpemVvZih2ZXJzaW9uKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb2ZmNjRfdCB0aW1lc2NhbGVfb2Zmc2V0OworCisgICAgICAgICAgICBpZiAodmVyc2lvbiA9PSAxKSB7CisgICAgICAgICAgICAgICAgdGltZXNjYWxlX29mZnNldCA9IGRhdGFfb2Zmc2V0ICsgNCArIDE2OworICAgICAgICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uID09IDApIHsKKyAgICAgICAgICAgICAgICB0aW1lc2NhbGVfb2Zmc2V0ID0gZGF0YV9vZmZzZXQgKyA0ICsgODsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50MzJfdCB0aW1lc2NhbGU7CisgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzY2FsZV9vZmZzZXQsICZ0aW1lc2NhbGUsIHNpemVvZih0aW1lc2NhbGUpKQorICAgICAgICAgICAgICAgICAgICA8IChzc2l6ZV90KXNpemVvZih0aW1lc2NhbGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIXRpbWVzY2FsZSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJ0aW1lc2NhbGUgc2hvdWxkIG5vdCBiZSBaRVJPLiIpOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1MYXN0VHJhY2stPnRpbWVzY2FsZSA9IG50b2hsKHRpbWVzY2FsZSk7CisKKyAgICAgICAgICAgIC8vIDE0NDk2LTEyIHNheXMgYWxsIG9uZXMgbWVhbnMgaW5kZXRlcm1pbmF0ZSwgYnV0IHNvbWUgZmlsZXMgc2VlbSB0byB1c2UKKyAgICAgICAgICAgIC8vIDAgaW5zdGVhZC4gV2UgdHJlYXQgYm90aCB0aGUgc2FtZS4KKyAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb24gPSAwOworICAgICAgICAgICAgaWYgKHZlcnNpb24gPT0gMSkgeworICAgICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzY2FsZV9vZmZzZXQgKyA0LCAmZHVyYXRpb24sIHNpemVvZihkdXJhdGlvbikpCisgICAgICAgICAgICAgICAgICAgICAgICA8IChzc2l6ZV90KXNpemVvZihkdXJhdGlvbikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZHVyYXRpb24gIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24gPSBudG9oNjQoZHVyYXRpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgZHVyYXRpb24zMjsKKyAgICAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc2NhbGVfb2Zmc2V0ICsgNCwgJmR1cmF0aW9uMzIsIHNpemVvZihkdXJhdGlvbjMyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIDwgKHNzaXplX3Qpc2l6ZW9mKGR1cmF0aW9uMzIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGR1cmF0aW9uMzIgIT0gMHhmZmZmZmZmZikgeworICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IG50b2hsKGR1cmF0aW9uMzIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkdXJhdGlvbiAhPSAwICYmIG1MYXN0VHJhY2stPnRpbWVzY2FsZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlEdXJhdGlvbiwgKGR1cmF0aW9uICogMTAwMDAwMCkgLyBtTGFzdFRyYWNrLT50aW1lc2NhbGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50OF90IGxhbmdbMl07CisgICAgICAgICAgICBvZmY2NF90IGxhbmdfb2Zmc2V0OworICAgICAgICAgICAgaWYgKHZlcnNpb24gPT0gMSkgeworICAgICAgICAgICAgICAgIGxhbmdfb2Zmc2V0ID0gdGltZXNjYWxlX29mZnNldCArIDQgKyA4OworICAgICAgICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uID09IDApIHsKKyAgICAgICAgICAgICAgICBsYW5nX29mZnNldCA9IHRpbWVzY2FsZV9vZmZzZXQgKyA0ICsgNDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChsYW5nX29mZnNldCwgJmxhbmcsIHNpemVvZihsYW5nKSkKKyAgICAgICAgICAgICAgICAgICAgPCAoc3NpemVfdClzaXplb2YobGFuZykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRvIGdldCB0aGUgSVNPLTYzOS0yL1QgdGhyZWUgY2hhcmFjdGVyIGxhbmd1YWdlIGNvZGUKKyAgICAgICAgICAgIC8vIDEgYml0IHBhZCBmb2xsb3dlZCBieSAzIDUtYml0cyBjaGFyYWN0ZXJzLiBFYWNoIGNoYXJhY3RlcgorICAgICAgICAgICAgLy8gaXMgcGFja2VkIGFzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gaXRzIEFTQ0lJIHZhbHVlIGFuZCAweDYwLgorICAgICAgICAgICAgY2hhciBsYW5nX2NvZGVbNF07CisgICAgICAgICAgICBsYW5nX2NvZGVbMF0gPSAoKGxhbmdbMF0gPj4gMikgJiAweDFmKSArIDB4NjA7CisgICAgICAgICAgICBsYW5nX2NvZGVbMV0gPSAoKGxhbmdbMF0gJiAweDMpIDw8IDMgfCAobGFuZ1sxXSA+PiA1KSkgKyAweDYwOworICAgICAgICAgICAgbGFuZ19jb2RlWzJdID0gKGxhbmdbMV0gJiAweDFmKSArIDB4NjA7CisgICAgICAgICAgICBsYW5nX2NvZGVbM10gPSAnXDAnOworCisgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldENTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIGtLZXlNZWRpYUxhbmd1YWdlLCBsYW5nX2NvZGUpOworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ3QnLCAncycsICdkJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgYnVmZmVyWzhdOworICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IChvZmY2NF90KXNpemVvZihidWZmZXIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgYnVmZmVyLCA4KSA8IDgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChVMzJfQVQoYnVmZmVyKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgLy8gU2hvdWxkIGJlIHZlcnNpb24gMCwgZmxhZ3MgMC4KKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50MzJfdCBlbnRyeV9jb3VudCA9IFUzMl9BVCgmYnVmZmVyWzRdKTsKKworICAgICAgICAgICAgaWYgKGVudHJ5X2NvdW50ID4gMSkgeworICAgICAgICAgICAgICAgIC8vIEZvciAzR1BQIHRpbWVkIHRleHQsIHRoZXJlIGNvdWxkIGJlIG11bHRpcGxlIHR4M2cgYm94ZXMgY29udGFpbgorICAgICAgICAgICAgICAgIC8vIG11bHRpcGxlIHRleHQgZGlzcGxheSBmb3JtYXRzLiBUaGVzZSBmb3JtYXRzIHdpbGwgYmUgdXNlZCB0bworICAgICAgICAgICAgICAgIC8vIGRpc3BsYXkgdGhlIHRpbWVkIHRleHQuCisgICAgICAgICAgICAgICAgLy8gRm9yIGVuY3J5cHRlZCBmaWxlcywgdGhlcmUgbWF5IGFsc28gYmUgbW9yZSB0aGFuIG9uZSBlbnRyeS4KKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lOworCisgICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKworICAgICAgICAgICAgICAgIENIRUNLKG1MYXN0VHJhY2stPm1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgICAgICAgICAgICAgIGlmIChzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1RFWFRfM0dQUCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNhc2VjbXAobWltZSwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZvciBub3cgd2Ugb25seSBzdXBwb3J0IGEgc2luZ2xlIHR5cGUgb2YgbWVkaWEgcGVyIHRyYWNrLgorICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5za2lwVHJhY2sgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9mZjY0X3Qgc3RvcF9vZmZzZXQgPSAqb2Zmc2V0ICsgY2h1bmtfc2l6ZTsKKyAgICAgICAgICAgICpvZmZzZXQgPSBkYXRhX29mZnNldCArIDg7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZW50cnlfY291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlQ2h1bmsob2Zmc2V0LCBkZXB0aCArIDEpOworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgqb2Zmc2V0ICE9IHN0b3Bfb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ2UnLCAndCcsICd0Jyk6CisgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKworICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworCisgICAgICAgICAgICBhdXRvIGJ1ZmZlciA9IGhlYXBidWZmZXI8dWludDhfdD4oY2h1bmtfZGF0YV9zaXplKTsKKyAgICAgICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGJ1ZmZlci5nZXQoKSwgY2h1bmtfZGF0YV9zaXplKSA8IGNodW5rX2RhdGFfc2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nOCBtaW1lRm9ybWF0KChjb25zdCBjaGFyICopKGJ1ZmZlci5nZXQoKSksIGNodW5rX2RhdGFfc2l6ZSk7CisgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBtaW1lRm9ybWF0LnN0cmluZygpKTsKKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygnbScsICdwJywgJzQnLCAnYScpOgorICAgICAgICBjYXNlIEZPVVJDQygnZScsICduJywgJ2MnLCAnYScpOgorICAgICAgICBjYXNlIEZPVVJDQygncycsICdhJywgJ20nLCAncicpOgorICAgICAgICBjYXNlIEZPVVJDQygncycsICdhJywgJ3cnLCAnYicpOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAobUlzUVQgJiYgY2h1bmtfdHlwZSA9PSBGT1VSQ0MoJ20nLCAncCcsICc0JywgJ2EnKQorICAgICAgICAgICAgICAgICAgICAmJiBkZXB0aCA+PSAxICYmIG1QYXRoW2RlcHRoIC0gMV0gPT0gRk9VUkNDKCd3JywgJ2EnLCAndicsICdlJykpIHsKKyAgICAgICAgICAgICAgICAvLyBJZ25vcmUgbXA0YSBlbWJlZGRlZCBpbiBRVCB3YXZlIGF0b20KKyAgICAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQ4X3QgYnVmZmVyWzggKyAyMF07CisgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgKHNzaXplX3Qpc2l6ZW9mKGJ1ZmZlcikpIHsKKyAgICAgICAgICAgICAgICAvLyBCYXNpYyBBdWRpb1NhbXBsZUVudHJ5IHNpemUuCisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSkgPCAoc3NpemVfdClzaXplb2YoYnVmZmVyKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdWludDE2X3QgZGF0YV9yZWZfaW5kZXggX191bnVzZWQgPSBVMTZfQVQoJmJ1ZmZlcls2XSk7CisgICAgICAgICAgICB1aW50MTZfdCB2ZXJzaW9uID0gVTE2X0FUKCZidWZmZXJbOF0pOworICAgICAgICAgICAgdWludDMyX3QgbnVtX2NoYW5uZWxzID0gVTE2X0FUKCZidWZmZXJbMTZdKTsKKworICAgICAgICAgICAgdWludDE2X3Qgc2FtcGxlX3NpemUgPSBVMTZfQVQoJmJ1ZmZlclsxOF0pOworICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlX3JhdGUgPSBVMzJfQVQoJmJ1ZmZlclsyNF0pID4+IDE2OworCisgICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisKKyAgICAgICAgICAgIG9mZjY0X3Qgc3RvcF9vZmZzZXQgPSAqb2Zmc2V0ICsgY2h1bmtfc2l6ZTsKKyAgICAgICAgICAgICpvZmZzZXQgPSBkYXRhX29mZnNldCArIHNpemVvZihidWZmZXIpOworCisgICAgICAgICAgICBpZiAobUlzUVQgJiYgY2h1bmtfdHlwZSA9PSBGT1VSQ0MoJ20nLCAncCcsICc0JywgJ2EnKSkgeworICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoKm9mZnNldCwgYnVmZmVyLCAxNikgPCAxNikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgICAgICAgICB9CisKKyNpZiAwCisgICAgICAgICAgICAgICAgICAgIFUzMl9BVChidWZmZXIpOyAgLy8gc2FtcGxlcyBwZXIgcGFja2V0CisgICAgICAgICAgICAgICAgICAgIFUzMl9BVCgmYnVmZmVyWzRdKTsgIC8vIGJ5dGVzIHBlciBwYWNrZXQKKyAgICAgICAgICAgICAgICAgICAgVTMyX0FUKCZidWZmZXJbOF0pOyAgLy8gYnl0ZXMgcGVyIGZyYW1lCisgICAgICAgICAgICAgICAgICAgIFUzMl9BVCgmYnVmZmVyWzEyXSk7ICAvLyBieXRlcyBwZXIgc2FtcGxlCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgKm9mZnNldCArPSAxNjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb24gPT0gMikgeworICAgICAgICAgICAgICAgICAgICB1aW50OF90IHYyYnVmZmVyWzM2XTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoKm9mZnNldCwgdjJidWZmZXIsIDM2KSA8IDM2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICAgICAgICAgIH0KKworI2lmIDAKKyAgICAgICAgICAgICAgICAgICAgVTMyX0FUKHYyYnVmZmVyKTsgIC8vIHNpemUgb2Ygc3RydWN0IG9ubHkKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxlX3JhdGUgPSAodWludDMyX3QpVTY0X0FUKCZ2MmJ1ZmZlcls0XSk7ICAvLyBhdWRpbyBzYW1wbGUgcmF0ZQorICAgICAgICAgICAgICAgICAgICBudW1fY2hhbm5lbHMgPSBVMzJfQVQoJnYyYnVmZmVyWzEyXSk7ICAvLyBudW0gYXVkaW8gY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAgVTMyX0FUKCZ2MmJ1ZmZlclsxNl0pOyAgLy8gYWx3YXlzIDB4N2YwMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxlX3NpemUgPSAodWludDE2X3QpVTMyX0FUKCZ2MmJ1ZmZlclsyMF0pOyAgLy8gY29uc3QgYml0cyBwZXIgY2hhbm5lbAorICAgICAgICAgICAgICAgICAgICBVMzJfQVQoJnYyYnVmZmVyWzI0XSk7ICAvLyBmb3JtYXQgc3BlY2lmYyBmbGFncworICAgICAgICAgICAgICAgICAgICBVMzJfQVQoJnYyYnVmZmVyWzI4XSk7ICAvLyBjb25zdCBieXRlcyBwZXIgYXVkaW8gcGFja2V0CisgICAgICAgICAgICAgICAgICAgIFUzMl9BVCgmdjJidWZmZXJbMzJdKTsgIC8vIGNvbnN0IExQQ00gZnJhbWVzIHBlciBhdWRpbyBwYWNrZXQKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAqb2Zmc2V0ICs9IDM2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgIT0gRk9VUkNDKCdlJywgJ24nLCAnYycsICdhJykpIHsKKyAgICAgICAgICAgICAgICAvLyBpZiB0aGUgY2h1bmsgdHlwZSBpcyBlbmNhLCB3ZSdsbCBnZXQgdGhlIHR5cGUgZnJvbSB0aGUgZnJtYSBib3ggbGF0ZXIKKyAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBGb3VyQ0MyTUlNRShjaHVua190eXBlKSk7CisgICAgICAgICAgICAgICAgQWRqdXN0Q2hhbm5lbHNBbmRSYXRlKGNodW5rX3R5cGUsICZudW1fY2hhbm5lbHMsICZzYW1wbGVfcmF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigiKioqIGNvZGluZz0nJXMnICVkIGNoYW5uZWxzLCBzaXplICVkLCByYXRlICVkXG4iLAorICAgICAgICAgICAgICAgICAgIGNodW5rLCBudW1fY2hhbm5lbHMsIHNhbXBsZV9zaXplLCBzYW1wbGVfcmF0ZSk7CisgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG51bV9jaGFubmVscyk7CisgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVfcmF0ZSk7CisKKyAgICAgICAgICAgIHdoaWxlICgqb2Zmc2V0IDwgc3RvcF9vZmZzZXQpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUNodW5rKG9mZnNldCwgZGVwdGggKyAxKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKm9mZnNldCAhPSBzdG9wX29mZnNldCkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ3AnLCAnNCcsICd2Jyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdlJywgJ24nLCAnYycsICd2Jyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJzInLCAnNicsICczJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdIJywgJzInLCAnNicsICczJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdoJywgJzInLCAnNicsICczJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdhJywgJ3YnLCAnYycsICcxJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdoJywgJ3YnLCAnYycsICcxJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdoJywgJ2UnLCAndicsICcxJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgYnVmZmVyWzc4XTsKKyAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPCAoc3NpemVfdClzaXplb2YoYnVmZmVyKSkgeworICAgICAgICAgICAgICAgIC8vIEJhc2ljIFZpZGVvU2FtcGxlRW50cnkgc2l6ZS4KKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBidWZmZXIsIHNpemVvZihidWZmZXIpKSA8IChzc2l6ZV90KXNpemVvZihidWZmZXIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50MTZfdCBkYXRhX3JlZl9pbmRleCBfX3VudXNlZCA9IFUxNl9BVCgmYnVmZmVyWzZdKTsKKyAgICAgICAgICAgIHVpbnQxNl90IHdpZHRoID0gVTE2X0FUKCZidWZmZXJbNiArIDE4XSk7CisgICAgICAgICAgICB1aW50MTZfdCBoZWlnaHQgPSBVMTZfQVQoJmJ1ZmZlcls2ICsgMjBdKTsKKworICAgICAgICAgICAgLy8gVGhlIHZpZGVvIHNhbXBsZSBpcyBub3Qgc3RhbmRhcmQtY29tcGxpYW50IGlmIGl0IGhhcyBpbnZhbGlkIGRpbWVuc2lvbi4KKyAgICAgICAgICAgIC8vIFVzZSBzb21lIGRlZmF1bHQgd2lkdGggYW5kIGhlaWdodCB2YWx1ZSwgYW5kCisgICAgICAgICAgICAvLyBsZXQgdGhlIGRlY29kZXIgZmlndXJlIG91dCB0aGUgYWN0dWFsIHdpZHRoIGFuZCBoZWlnaHQgKGFuZCB0aHVzCisgICAgICAgICAgICAvLyBiZSBwcmVwYXJlZCBmb3IgSU5GT19GT01SQVRfQ0hBTkdFRCBldmVudCkuCisgICAgICAgICAgICBpZiAod2lkdGggPT0gMCkgIHdpZHRoICA9IDM1MjsKKyAgICAgICAgICAgIGlmIChoZWlnaHQgPT0gMCkgaGVpZ2h0ID0gMjg4OworCisgICAgICAgICAgICAvLyBwcmludGYoIioqKiBjb2Rpbmc9JyVzJyB3aWR0aD0lZCBoZWlnaHQ9JWRcbiIsCisgICAgICAgICAgICAvLyAgICAgICAgY2h1bmssIHdpZHRoLCBoZWlnaHQpOworCisgICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisKKyAgICAgICAgICAgIGlmIChjaHVua190eXBlICE9IEZPVVJDQygnZScsICduJywgJ2MnLCAndicpKSB7CisgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGNodW5rIHR5cGUgaXMgZW5jdiwgd2UnbGwgZ2V0IHRoZSB0eXBlIGZyb20gdGhlIGZybWEgYm94IGxhdGVyCisgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgRm91ckNDMk1JTUUoY2h1bmtfdHlwZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKKyAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKKworICAgICAgICAgICAgb2ZmNjRfdCBzdG9wX29mZnNldCA9ICpvZmZzZXQgKyBjaHVua19zaXplOworICAgICAgICAgICAgKm9mZnNldCA9IGRhdGFfb2Zmc2V0ICsgc2l6ZW9mKGJ1ZmZlcik7CisgICAgICAgICAgICB3aGlsZSAoKm9mZnNldCA8IHN0b3Bfb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VDaHVuayhvZmZzZXQsIGRlcHRoICsgMSk7CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCpvZmZzZXQgIT0gc3RvcF9vZmZzZXQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygncycsICd0JywgJ2MnLCAnbycpOgorICAgICAgICBjYXNlIEZPVVJDQygnYycsICdvJywgJzYnLCAnNCcpOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKG1MYXN0VHJhY2sgPT0gTlVMTCkgfHwgKG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlID09IE5VTEwpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0KKyAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZS0+c2V0Q2h1bmtPZmZzZXRQYXJhbXMoCisgICAgICAgICAgICAgICAgICAgICAgICBjaHVua190eXBlLCBkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKKworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygncycsICd0JywgJ3MnLCAnYycpOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKG1MYXN0VHJhY2sgPT0gTlVMTCkgfHwgKG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9CisgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2FtcGxlVGFibGUtPnNldFNhbXBsZVRvQ2h1bmtQYXJhbXMoCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKKworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygncycsICd0JywgJ3MnLCAneicpOgorICAgICAgICBjYXNlIEZPVVJDQygncycsICd0JywgJ3onLCAnMicpOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKG1MYXN0VHJhY2sgPT0gTlVMTCkgfHwgKG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlID09IE5VTEwpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0KKyAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZS0+c2V0U2FtcGxlU2l6ZVBhcmFtcygKKyAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rX3R5cGUsIGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOworCisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzaXplX3QgbWF4X3NpemU7CisgICAgICAgICAgICBlcnIgPSBtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZS0+Z2V0TWF4U2FtcGxlU2l6ZSgmbWF4X3NpemUpOworCisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1heF9zaXplICE9IDApIHsKKyAgICAgICAgICAgICAgICAvLyBBc3N1bWUgdGhhdCBhIGdpdmVuIGJ1ZmZlciBvbmx5IGNvbnRhaW5zIGF0IG1vc3QgMTAgY2h1bmtzLAorICAgICAgICAgICAgICAgIC8vIGVhY2ggY2h1bmsgb3JpZ2luYWxseSBwcmVmaXhlZCB3aXRoIGEgMiBieXRlIGxlbmd0aCB3aWxsCisgICAgICAgICAgICAgICAgLy8gaGF2ZSBhIDQgYnl0ZSBoZWFkZXIgKDB4MDAgMHgwMCAweDAwIDB4MDEpIGFmdGVyIGNvbnZlcnNpb24sCisgICAgICAgICAgICAgICAgLy8gYW5kIHRodXMgd2lsbCBncm93IGJ5IDIgYnl0ZXMgcGVyIGNodW5rLgorICAgICAgICAgICAgICAgIGlmIChtYXhfc2l6ZSA+IFNJWkVfTUFYIC0gMTAgKiAyKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJtYXggc2FtcGxlIHNpemUgdG9vIGJpZzogJXp1IiwgbWF4X3NpemUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIG1heF9zaXplICsgMTAgKiAyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gTm8gc2l6ZSB3YXMgc3BlY2lmaWVkLiBQaWNrIGEgY29uc2VydmF0aXZlbHkgbGFyZ2Ugc2l6ZS4KKyAgICAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgICAgICAgICAgICAgIGlmICghbUxhc3RUcmFjay0+bWV0YS5maW5kSW50MzIoa0tleVdpZHRoLCAoaW50MzJfdCopJndpZHRoKSB8fAorICAgICAgICAgICAgICAgICAgICAhbUxhc3RUcmFjay0+bWV0YS5maW5kSW50MzIoa0tleUhlaWdodCwoaW50MzJfdCopICZoZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJObyB3aWR0aCBvciBoZWlnaHQsIGFzc3VtaW5nIHdvcnN0IGNhc2UgMTA4MHAiKTsKKyAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAxOTIwOworICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSAxMDgwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEEgcmVzb2x1dGlvbiB3YXMgc3BlY2lmaWVkLCBjaGVjayB0aGF0IGl0J3Mgbm90IHRvbyBiaWcuIFRoZSB2YWx1ZXMgYmVsb3cKKyAgICAgICAgICAgICAgICAgICAgLy8gd2VyZSBjaG9zZW4gc28gdGhhdCB0aGUgY2FsY3VsYXRpb25zIGJlbG93IGRvbid0IGNhdXNlIG92ZXJmbG93cywgdGhleSdyZQorICAgICAgICAgICAgICAgICAgICAvLyBub3QgaW5kaWNhdGluZyB0aGF0IHJlc29sdXRpb25zIHVwIHRvIDMya3gzMmsgYXJlIGFjdHVhbGx5IHN1cHBvcnRlZC4KKyAgICAgICAgICAgICAgICAgICAgaWYgKHdpZHRoID4gMzI3NjggfHwgaGVpZ2h0ID4gMzI3NjgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJjYW4ndCBzdXBwb3J0ICV1IHggJXUgdmlkZW8iLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lOworICAgICAgICAgICAgICAgIENIRUNLKG1MYXN0VHJhY2stPm1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgICAgICAgICAgICAgIGlmICghc3RybmNtcChtaW1lLCAiYXVkaW8vIiwgNikpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGF1ZGlvLCB1c2UgMTI4S0IKKyAgICAgICAgICAgICAgICAgICAgbWF4X3NpemUgPSAxMDI0ICogMTI4OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAhc3RyY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEFWQyAmIEhFVkMgcmVxdWlyZXMgY29tcHJlc3Npb24gcmF0aW8gb2YgYXQgbGVhc3QgMiwgYW5kIHVzZXMKKyAgICAgICAgICAgICAgICAgICAgLy8gbWFjcm9ibG9ja3MKKyAgICAgICAgICAgICAgICAgICAgbWF4X3NpemUgPSAoKHdpZHRoICsgMTUpIC8gMTYpICogKChoZWlnaHQgKyAxNSkgLyAxNikgKiAxOTI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGFsbCBvdGhlciBmb3JtYXRzIHRoZXJlIGlzIG5vIG1pbmltdW0gY29tcHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgLy8gcmF0aW8uIFVzZSBjb21wcmVzc2lvbiByYXRpbyBvZiAxLgorICAgICAgICAgICAgICAgICAgICBtYXhfc2l6ZSA9IHdpZHRoICogaGVpZ2h0ICogMyAvIDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIEhBQ0s6IGFsbG93IDEwJSBvdmVyaGVhZAorICAgICAgICAgICAgICAgIC8vIFRPRE86IHJlYWQgc2FtcGxlIHNpemUgZnJvbSB0cmFmIGF0b20gZm9yIGZyYWdtZW50ZWQgTVBFRzQuCisgICAgICAgICAgICAgICAgbWF4X3NpemUgKz0gbWF4X3NpemUgLyAxMDsKKyAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIG1heF9zaXplKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gTk9URTogc2V0dGluZyBhbm90aGVyIHBpZWNlIG9mIG1ldGFkYXRhIGludmFsaWRhdGVzIGFueSBwb2ludGVycyAoc3VjaCBhcyB0aGUKKyAgICAgICAgICAgIC8vIG1pbWV0eXBlKSBwcmV2aW91c2x5IG9idGFpbmVkLCBzbyBkb24ndCBjYWNoZSB0aGVtLgorICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICAgICAgICAgIENIRUNLKG1MYXN0VHJhY2stPm1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGF2ZXJhZ2UgZnJhbWUgcmF0ZS4KKyAgICAgICAgICAgIGlmICghc3RybmNhc2VjbXAoInZpZGVvLyIsIG1pbWUsIDYpKSB7CisgICAgICAgICAgICAgICAgc2l6ZV90IG5TYW1wbGVzID0gbUxhc3RUcmFjay0+c2FtcGxlVGFibGUtPmNvdW50U2FtcGxlcygpOworICAgICAgICAgICAgICAgIGlmIChuU2FtcGxlcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdHJhY2tJZDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2stPm1ldGEuZmluZEludDMyKGtLZXlUcmFja0lELCAmdHJhY2tJZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyZXguc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmV4ICp0ID0gJm1UcmV4LmVkaXRJdGVtQXQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQtPnRyYWNrX0lEID09ICh1aW50MzJfdCkgdHJhY2tJZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC0+ZGVmYXVsdF9zYW1wbGVfZHVyYXRpb24gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZyYW1lUmF0ZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnRpbWVzY2FsZSAvIHQtPmRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RnJhbWVSYXRlLCBmcmFtZVJhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2stPm1ldGEuZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uVXMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHVyYXRpb25VcyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZyYW1lUmF0ZSA9IChuU2FtcGxlcyAqIDEwMDAwMDBMTCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGR1cmF0aW9uVXMgPj4gMSkpIC8gZHVyYXRpb25VczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlGcmFtZVJhdGUsIGZyYW1lUmF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoInNldHRpbmcgZnJhbWUgY291bnQgJXp1IiwgblNhbXBsZXMpOworICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlGcmFtZUNvdW50LCBuU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ3QnLCAndCcsICdzJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgobUxhc3RUcmFjayA9PSBOVUxMKSB8fCAobUxhc3RUcmFjay0+c2FtcGxlVGFibGUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPQorICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlLT5zZXRUaW1lVG9TYW1wbGVQYXJhbXMoCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKKworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2MnLCAndCcsICd0JywgJ3MnKToKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChtTGFzdFRyYWNrID09IE5VTEwpIHx8IChtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworCisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9CisgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2FtcGxlVGFibGUtPnNldENvbXBvc2l0aW9uVGltZVRvU2FtcGxlUGFyYW1zKAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7CisKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ3QnLCAncycsICdzJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgobUxhc3RUcmFjayA9PSBOVUxMKSB8fCAobUxhc3RUcmFjay0+c2FtcGxlVGFibGUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPQorICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlLT5zZXRTeW5jU2FtcGxlUGFyYW1zKAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7CisKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFx4QTl4eXoKKyAgICAgICAgY2FzZSBGT1VSQ0MoMHhBOSwgJ3gnLCAneScsICd6Jyk6CisgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKworICAgICAgICAgICAgLy8gQmVzdCBjYXNlIHRoZSB0b3RhbCBkYXRhIGxlbmd0aCBpbnNpZGUgIlx4QTl4eXoiIGJveCB3b3VsZAorICAgICAgICAgICAgLy8gYmUgOSwgZm9yIGluc3RhbmNlICJceEE5eHl6IiArICJceDAwXHgwNVx4MTVceGM3IiArICIrMCswLyIsCisgICAgICAgICAgICAvLyB3aGVyZSAiXHgwMFx4MDUiIGlzIHRoZSB0ZXh0IHN0cmluZyBsZW5ndGggd2l0aCB2YWx1ZSA9IDUsCisgICAgICAgICAgICAvLyAiXDB4MTVceGM3IiBpcyB0aGUgbGFuZ3VhZ2UgY29kZSA9IGVuLCBhbmQgIiswKzAvIiBpcyBhCisgICAgICAgICAgICAvLyBsb2NhdGlvbiAoc3RyaW5nKSB2YWx1ZSB3aXRoIGxvbmdpdHVkZSA9IDAgYW5kIGxhdGl0dWRlID0gMC4KKyAgICAgICAgICAgIC8vIFNpbmNlIHNvbWUgZGV2aWNlcyBlbmNvdW50ZXJlZCBpbiB0aGUgd2lsZCBvbWl0IHRoZSB0cmFpbGluZworICAgICAgICAgICAgLy8gc2xhc2gsIHdlJ2xsIGFsbG93IHRoYXQuCisgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgOCkgeyAvLyA4IGluc3RlYWQgb2YgOSB0byBhbGxvdyBmb3IgbWlzc2luZyAvCisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdWludDE2X3QgbGVuOworICAgICAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDE2KGRhdGFfb2Zmc2V0LCAmbGVuKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gYWxsb3cgIiswKzAiIHdpdGhvdXQgdHJhaWxpbmcgc2xhc2gKKyAgICAgICAgICAgIGlmIChsZW4gPCA0IHx8IGxlbiA+IGNodW5rX2RhdGFfc2l6ZSAtIDQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gVGhlIGxvY2F0aW9uIHN0cmluZyBmb2xsb3dpbmcgdGhlIGxhbmd1YWdlIGNvZGUgaXMgZm9ybWF0dGVkCisgICAgICAgICAgICAvLyBhY2NvcmRpbmcgdG8gSVNPIDY3MDk6MjAwOCAoaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzY3MDkpLgorICAgICAgICAgICAgLy8gQWxsb2NhdGUgMiBleHRyYSBieXRlcywgaW4gY2FzZSB3ZSBuZWVkIHRvIGFkZCBhIHRyYWlsaW5nIHNsYXNoLAorICAgICAgICAgICAgLy8gYW5kIHRvIGFkZCBhIHRlcm1pbmF0aW5nIDAuCisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Y2hhcltdPiBidWZmZXIobmV3IChzdGQ6Om5vdGhyb3cpIGNoYXJbbGVuKzJdKCkpOworICAgICAgICAgICAgaWYgKCFidWZmZXIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0ICsgNCwgJmJ1ZmZlclswXSwgbGVuKSA8IGxlbikgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbGVuID0gc3RybGVuKCZidWZmZXJbMF0pOworICAgICAgICAgICAgaWYgKGxlbiA8IDQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQWRkIGEgdHJhaWxpbmcgc2xhc2ggaWYgdGhlcmUgd2Fzbid0IG9uZS4KKyAgICAgICAgICAgIGlmIChidWZmZXJbbGVuIC0gMV0gIT0gJy8nKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyW2xlbl0gPSAnLyc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa0tleUxvY2F0aW9uLCAmYnVmZmVyWzBdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2UnLCAncycsICdkJywgJ3MnKToKKyAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCisgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgNCkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQ4X3QgYnVmZmVyWzI1Nl07CisgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplID4gKG9mZjY0X3Qpc2l6ZW9mKGJ1ZmZlcikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfQlVGRkVSX1RPT19TTUFMTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgYnVmZmVyLCBjaHVua19kYXRhX3NpemUpIDwgY2h1bmtfZGF0YV9zaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoVTMyX0FUKGJ1ZmZlcikgIT0gMCkgeworICAgICAgICAgICAgICAgIC8vIFNob3VsZCBiZSB2ZXJzaW9uIDAsIGZsYWdzIDAuCisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworCisgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldERhdGEoCisgICAgICAgICAgICAgICAgICAgIGtLZXlFU0RTLCBrVHlwZUVTRFMsICZidWZmZXJbNF0sIGNodW5rX2RhdGFfc2l6ZSAtIDQpOworCisgICAgICAgICAgICBpZiAobVBhdGguc2l6ZSgpID49IDIKKyAgICAgICAgICAgICAgICAgICAgJiYgbVBhdGhbbVBhdGguc2l6ZSgpIC0gMl0gPT0gRk9VUkNDKCdtJywgJ3AnLCAnNCcsICdhJykpIHsKKyAgICAgICAgICAgICAgICAvLyBJbmZvcm1hdGlvbiBmcm9tIHRoZSBFU0RTIG11c3QgYmUgcmVsaWVkIG9uIGZvciBwcm9wZXIKKyAgICAgICAgICAgICAgICAvLyBzZXR1cCBvZiBzYW1wbGUgcmF0ZSBhbmQgY2hhbm5lbCBjb3VudCBmb3IgTVBFRzQgQXVkaW8uCisgICAgICAgICAgICAgICAgLy8gVGhlIGdlbmVyaWMgaGVhZGVyIGFwcGVhcnMgdG8gb25seSBjb250YWluIGdlbmVyaWMKKyAgICAgICAgICAgICAgICAvLyBpbmZvcm1hdGlvbi4uLgorCisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gdXBkYXRlQXVkaW9UcmFja0luZm9Gcm9tRVNEU19NUEVHNEF1ZGlvKAorICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlcls0XSwgY2h1bmtfZGF0YV9zaXplIC0gNCk7CisKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1QYXRoLnNpemUoKSA+PSAyCisgICAgICAgICAgICAgICAgICAgICYmIG1QYXRoW21QYXRoLnNpemUoKSAtIDJdID09IEZPVVJDQygnbScsICdwJywgJzQnLCAndicpKSB7CisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHZpZGVvIGlzIE1QRUcyCisgICAgICAgICAgICAgICAgRVNEUyBlc2RzKCZidWZmZXJbNF0sIGNodW5rX2RhdGFfc2l6ZSAtIDQpOworCisgICAgICAgICAgICAgICAgdWludDhfdCBvYmplY3RUeXBlSW5kaWNhdGlvbjsKKyAgICAgICAgICAgICAgICBpZiAoZXNkcy5nZXRPYmplY3RUeXBlSW5kaWNhdGlvbigmb2JqZWN0VHlwZUluZGljYXRpb24pID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3RUeXBlSW5kaWNhdGlvbiA+PSAweDYwICYmIG9iamVjdFR5cGVJbmRpY2F0aW9uIDw9IDB4NjUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2InLCAndCcsICdyJywgJ3QnKToKKyAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQ4X3QgYnVmZmVyWzEyXTsKKyAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgIT0gc2l6ZW9mKGJ1ZmZlcikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGJ1ZmZlciwgY2h1bmtfZGF0YV9zaXplKSA8IGNodW5rX2RhdGFfc2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdWludDMyX3QgbWF4Qml0cmF0ZSA9IFUzMl9BVCgmYnVmZmVyWzRdKTsKKyAgICAgICAgICAgIHVpbnQzMl90IGF2Z0JpdHJhdGUgPSBVMzJfQVQoJmJ1ZmZlcls4XSk7CisgICAgICAgICAgICBpZiAobWF4Qml0cmF0ZSA+IDAgJiYgbWF4Qml0cmF0ZSA8IElOVDMyX01BWCkgeworICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleU1heEJpdFJhdGUsIChpbnQzMl90KW1heEJpdHJhdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGF2Z0JpdHJhdGUgPiAwICYmIGF2Z0JpdHJhdGUgPCBJTlQzMl9NQVgpIHsKKyAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlCaXRSYXRlLCAoaW50MzJfdClhdmdCaXRyYXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2EnLCAndicsICdjJywgJ0MnKToKKyAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCisgICAgICAgICAgICBhdXRvIGJ1ZmZlciA9IGhlYXBidWZmZXI8dWludDhfdD4oY2h1bmtfZGF0YV9zaXplKTsKKworICAgICAgICAgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImIvMjg0NzEyMDYiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBidWZmZXIuZ2V0KCksIGNodW5rX2RhdGFfc2l6ZSkgPCBjaHVua19kYXRhX3NpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKworICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXREYXRhKAorICAgICAgICAgICAgICAgICAgICBrS2V5QVZDQywga1R5cGVBVkNDLCBidWZmZXIuZ2V0KCksIGNodW5rX2RhdGFfc2l6ZSk7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRk9VUkNDKCdoJywgJ3YnLCAnYycsICdDJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIGF1dG8gYnVmZmVyID0gaGVhcGJ1ZmZlcjx1aW50OF90PihjaHVua19kYXRhX3NpemUpOworCisgICAgICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYi8yODQ3MTIwNiIpOworICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGJ1ZmZlci5nZXQoKSwgY2h1bmtfZGF0YV9zaXplKSA8IGNodW5rX2RhdGFfc2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworCisgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldERhdGEoCisgICAgICAgICAgICAgICAgICAgIGtLZXlIVkNDLCBrVHlwZUhWQ0MsIGJ1ZmZlci5nZXQoKSwgY2h1bmtfZGF0YV9zaXplKTsKKworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygnZCcsICcyJywgJzYnLCAnMycpOgorICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogZDI2MyBjb250YWlucyBhIGZpeGVkIDcgYnl0ZXMgcGFydDoKKyAgICAgICAgICAgICAqICAgdmVuZG9yIC0gNCBieXRlcworICAgICAgICAgICAgICogICB2ZXJzaW9uIC0gMSBieXRlCisgICAgICAgICAgICAgKiAgIGxldmVsIC0gMSBieXRlCisgICAgICAgICAgICAgKiAgIHByb2ZpbGUgLSAxIGJ5dGUKKyAgICAgICAgICAgICAqIG9wdGlvbmFsbHksICJkMjYzIiBib3ggaXRzZWxmIG1heSBjb250YWluIGEgMTYtYnl0ZQorICAgICAgICAgICAgICogYml0IHJhdGUgYm94IChiaXRyKQorICAgICAgICAgICAgICogICBhdmVyYWdlIGJpdCByYXRlIC0gNCBieXRlcworICAgICAgICAgICAgICogICBtYXggYml0IHJhdGUgLSA0IGJ5dGVzCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGNoYXIgYnVmZmVyWzIzXTsKKyAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgIT0gNyAmJgorICAgICAgICAgICAgICAgIGNodW5rX2RhdGFfc2l6ZSAhPSAyMykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJJbmNvcnJlY3QgRDI2MyBib3ggc2l6ZSAlbGxkIiwgKGxvbmcgbG9uZyljaHVua19kYXRhX3NpemUpOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgYnVmZmVyLCBjaHVua19kYXRhX3NpemUpIDwgY2h1bmtfZGF0YV9zaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisKKyAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0RGF0YShrS2V5RDI2Mywga1R5cGVEMjYzLCBidWZmZXIsIGNodW5rX2RhdGFfc2l6ZSk7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnZScsICd0JywgJ2EnKToKKyAgICAgICAgeworICAgICAgICAgICAgb2ZmNjRfdCBzdG9wX29mZnNldCA9ICpvZmZzZXQgKyBjaHVua19zaXplOworICAgICAgICAgICAgKm9mZnNldCA9IGRhdGFfb2Zmc2V0OworICAgICAgICAgICAgYm9vbCBpc1BhcnNpbmdNZXRhS2V5cyA9IHVuZGVyUVRNZXRhUGF0aChtUGF0aCwgMik7CisgICAgICAgICAgICBpZiAoIWlzUGFyc2luZ01ldGFLZXlzKSB7CisgICAgICAgICAgICAgICAgdWludDhfdCBidWZmZXJbNF07CisgICAgICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IChvZmY2NF90KXNpemVvZihidWZmZXIpKSB7CisgICAgICAgICAgICAgICAgICAgICpvZmZzZXQgPSBzdG9wX29mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgYnVmZmVyLCA0KSA8IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgKm9mZnNldCA9IHN0b3Bfb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKFUzMl9BVChidWZmZXIpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2hvdWxkIGJlIHZlcnNpb24gMCwgZmxhZ3MgMC4KKworICAgICAgICAgICAgICAgICAgICAvLyBJZiBpdCdzIG5vdCwgbGV0J3MgYXNzdW1lIHRoaXMgaXMgb25lIG9mIHRob3NlCisgICAgICAgICAgICAgICAgICAgIC8vIGFwcGFyZW50bHkgbWFsZm9ybWVkIGNodW5rcyB0aGF0IGRvbid0IGhhdmUgZmxhZ3MKKyAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGNvbXBsZXRlbHkgZGlmZmVyZW50IHNlbWFudGljcyB0aGFuIHdoYXQncworICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgTVBFRzQgc3BlY3MgYW5kIHNraXAgaXQuCisgICAgICAgICAgICAgICAgICAgICpvZmZzZXQgPSBzdG9wX29mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqb2Zmc2V0ICs9ICBzaXplb2YoYnVmZmVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd2hpbGUgKCpvZmZzZXQgPCBzdG9wX29mZnNldCkgeworICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlQ2h1bmsob2Zmc2V0LCBkZXB0aCArIDEpOworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgqb2Zmc2V0ICE9IHN0b3Bfb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAnbCcsICdvJywgJ2MnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAnaScsICduJywgJ2YnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAncCcsICdyJywgJ3AnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ3AnLCAnaScsICd0JywgJ20nKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAnZCcsICdhJywgJ3QnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAncicsICdlJywgJ2YnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAncCcsICdyJywgJ28nKToKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1Jc0hlaWYpIHsKKyAgICAgICAgICAgICAgICBpZiAobUl0ZW1UYWJsZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIG1JdGVtVGFibGUgPSBuZXcgSXRlbVRhYmxlKG1EYXRhU291cmNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUl0ZW1UYWJsZS0+cGFyc2UoCisgICAgICAgICAgICAgICAgICAgICAgICBjaHVua190eXBlLCBkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygnbScsICdlJywgJ2EnLCAnbicpOgorICAgICAgICBjYXNlIEZPVVJDQygnbicsICdhJywgJ20nLCAnZScpOgorICAgICAgICBjYXNlIEZPVVJDQygnZCcsICdhJywgJ3QnLCAnYScpOgorICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKKyAgICAgICAgICAgIGlmIChtUGF0aC5zaXplKCkgPT0gNiAmJiB1bmRlck1ldGFEYXRhUGF0aChtUGF0aCkpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUlUdW5lc01ldGFEYXRhKGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOworCisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygnbScsICd2JywgJ2gnLCAnZCcpOgorICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKKyAgICAgICAgICAgIGlmIChkZXB0aCAhPSAxKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIm12aGQ6IGRlcHRoICVkIiwgZGVwdGgpOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgMzIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50OF90IGhlYWRlclszMl07CisgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKQorICAgICAgICAgICAgICAgICAgICA8IChzc2l6ZV90KXNpemVvZihoZWFkZXIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50NjRfdCBjcmVhdGlvblRpbWU7CisgICAgICAgICAgICB1aW50NjRfdCBkdXJhdGlvbiA9IDA7CisgICAgICAgICAgICBpZiAoaGVhZGVyWzBdID09IDEpIHsKKyAgICAgICAgICAgICAgICBjcmVhdGlvblRpbWUgPSBVNjRfQVQoJmhlYWRlcls0XSk7CisgICAgICAgICAgICAgICAgbUhlYWRlclRpbWVzY2FsZSA9IFUzMl9BVCgmaGVhZGVyWzIwXSk7CisgICAgICAgICAgICAgICAgZHVyYXRpb24gPSBVNjRfQVQoJmhlYWRlclsyNF0pOworICAgICAgICAgICAgICAgIGlmIChkdXJhdGlvbiA9PSAweGZmZmZmZmZmZmZmZmZmZmYpIHsKKyAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaGVhZGVyWzBdICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjcmVhdGlvblRpbWUgPSBVMzJfQVQoJmhlYWRlcls0XSk7CisgICAgICAgICAgICAgICAgbUhlYWRlclRpbWVzY2FsZSA9IFUzMl9BVCgmaGVhZGVyWzEyXSk7CisgICAgICAgICAgICAgICAgdWludDMyX3QgZDMyID0gVTMyX0FUKCZoZWFkZXJbMTZdKTsKKyAgICAgICAgICAgICAgICBpZiAoZDMyID09IDB4ZmZmZmZmZmYpIHsKKyAgICAgICAgICAgICAgICAgICAgZDMyID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZHVyYXRpb24gPSBkMzI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZHVyYXRpb24gIT0gMCAmJiBtSGVhZGVyVGltZXNjYWxlICE9IDAgJiYgZHVyYXRpb24gPCBVSU5UNjRfTUFYIC8gMTAwMDAwMCkgeworICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvbiAqIDEwMDAwMDAgLyBtSGVhZGVyVGltZXNjYWxlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nOCBzOworICAgICAgICAgICAgaWYgKGNvbnZlcnRUaW1lVG9EYXRlKGNyZWF0aW9uVGltZSwgJnMpKSB7CisgICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKGtLZXlEYXRlLCBzLnN0cmluZygpKTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ2UnLCAnaCcsICdkJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKworICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IDgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50OF90IGZsYWdzWzRdOworICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgZmxhZ3MsIHNpemVvZihmbGFncykpCisgICAgICAgICAgICAgICAgICAgIDwgKHNzaXplX3Qpc2l6ZW9mKGZsYWdzKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdWludDY0X3QgZHVyYXRpb24gPSAwOworICAgICAgICAgICAgaWYgKGZsYWdzWzBdID09IDEpIHsKKyAgICAgICAgICAgICAgICAvLyA2NCBiaXQKKyAgICAgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgMTIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbURhdGFTb3VyY2UtPmdldFVJbnQ2NChkYXRhX29mZnNldCArIDQsICZkdXJhdGlvbik7CisgICAgICAgICAgICAgICAgaWYgKGR1cmF0aW9uID09IDB4ZmZmZmZmZmZmZmZmZmZmZikgeworICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChmbGFnc1swXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gMzIgYml0CisgICAgICAgICAgICAgICAgdWludDMyX3QgZDMyOworICAgICAgICAgICAgICAgIG1EYXRhU291cmNlLT5nZXRVSW50MzIoZGF0YV9vZmZzZXQgKyA0LCAmZDMyKTsKKyAgICAgICAgICAgICAgICBpZiAoZDMyID09IDB4ZmZmZmZmZmYpIHsKKyAgICAgICAgICAgICAgICAgICAgZDMyID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZHVyYXRpb24gPSBkMzI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChkdXJhdGlvbiAhPSAwICYmIG1IZWFkZXJUaW1lc2NhbGUgIT0gMCkgeworICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvbiAqIDEwMDAwMDAgLyBtSGVhZGVyVGltZXNjYWxlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygnbScsICdkJywgJ2EnLCAndCcpOgorICAgICAgICB7CisgICAgICAgICAgICBtTWRhdEZvdW5kID0gdHJ1ZTsKKworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygnaCcsICdkJywgJ2wnLCAncicpOgorICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKKyAgICAgICAgICAgIGlmICh1bmRlclFUTWV0YVBhdGgobVBhdGgsIDMpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQzMl90IGJ1ZmZlcjsKKyAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQgKyA4LCAmYnVmZmVyLCA0KSA8IDQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQzMl90IHR5cGUgPSBudG9obChidWZmZXIpOworICAgICAgICAgICAgLy8gRm9yIHRoZSAzR1BQIGZpbGUgZm9ybWF0LCB0aGUgaGFuZGxlci10eXBlIHdpdGhpbiB0aGUgJ2hkbHInIGJveAorICAgICAgICAgICAgLy8gc2hhbGwgYmUgJ3RleHQnLiBXZSBhbHNvIHdhbnQgdG8gc3VwcG9ydCAnc2J0bCcgaGFuZGxlciB0eXBlCisgICAgICAgICAgICAvLyBmb3IgYSBwcmFjdGljYWwgcmVhc29uIGFzIHZhcmlvdXMgTVBFRzQgY29udGFpbmVycyB1c2UgaXQuCisgICAgICAgICAgICBpZiAodHlwZSA9PSBGT1VSQ0MoJ3QnLCAnZScsICd4JywgJ3QnKSB8fCB0eXBlID09IEZPVVJDQygncycsICdiJywgJ3QnLCAnbCcpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9URVhUXzNHUFApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygnaycsICdlJywgJ3knLCAncycpOgorICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKKyAgICAgICAgICAgIGlmICh1bmRlclFUTWV0YVBhdGgobVBhdGgsIDMpKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VRVE1ldGFLZXkoZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAncicsICdlJywgJ3gnKToKKyAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCisgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgMjQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUcmV4IHRyZXg7CisgICAgICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIoZGF0YV9vZmZzZXQgKyA0LCAmdHJleC50cmFja19JRCkgfHwKKyAgICAgICAgICAgICAgICAhbURhdGFTb3VyY2UtPmdldFVJbnQzMihkYXRhX29mZnNldCArIDgsICZ0cmV4LmRlZmF1bHRfc2FtcGxlX2Rlc2NyaXB0aW9uX2luZGV4KSB8fAorICAgICAgICAgICAgICAgICFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKGRhdGFfb2Zmc2V0ICsgMTIsICZ0cmV4LmRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uKSB8fAorICAgICAgICAgICAgICAgICFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKGRhdGFfb2Zmc2V0ICsgMTYsICZ0cmV4LmRlZmF1bHRfc2FtcGxlX3NpemUpIHx8CisgICAgICAgICAgICAgICAgIW1EYXRhU291cmNlLT5nZXRVSW50MzIoZGF0YV9vZmZzZXQgKyAyMCwgJnRyZXguZGVmYXVsdF9zYW1wbGVfZmxhZ3MpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVRyZXguYWRkKHRyZXgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygndCcsICd4JywgJzMnLCAnZycpOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisKKyAgICAgICAgICAgIHVpbnQzMl90IHR5cGU7CisgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhOworICAgICAgICAgICAgc2l6ZV90IHNpemUgPSAwOworICAgICAgICAgICAgaWYgKCFtTGFzdFRyYWNrLT5tZXRhLmZpbmREYXRhKAorICAgICAgICAgICAgICAgICAgICBrS2V5VGV4dEZvcm1hdERhdGEsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgICAgICAgICAgc2l6ZSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoY2h1bmtfc2l6ZSA+IFNJWkVfTUFYKSB8fCAoU0laRV9NQVggLSBjaHVua19zaXplIDw9IHNpemUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdWludDhfdCAqYnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQ4X3Rbc2l6ZSArIGNodW5rX3NpemVdOworICAgICAgICAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KGJ1ZmZlciwgZGF0YSwgc2l6ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoc2l6ZV90KShtRGF0YVNvdXJjZS0+cmVhZEF0KCpvZmZzZXQsIGJ1ZmZlciArIHNpemUsIGNodW5rX3NpemUpKQorICAgICAgICAgICAgICAgICAgICA8IGNodW5rX3NpemUpIHsKKyAgICAgICAgICAgICAgICBkZWxldGVbXSBidWZmZXI7CisgICAgICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKKworICAgICAgICAgICAgICAgIC8vIGFkdmFuY2UgcmVhZCBwb2ludGVyIHNvIHdlIGRvbid0IGVuZCB1cCByZWFkaW5nIHRoaXMgYWdhaW4KKyAgICAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldERhdGEoCisgICAgICAgICAgICAgICAgICAgIGtLZXlUZXh0Rm9ybWF0RGF0YSwgMCwgYnVmZmVyLCBzaXplICsgY2h1bmtfc2l6ZSk7CisKKyAgICAgICAgICAgIGRlbGV0ZVtdIGJ1ZmZlcjsKKworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygnYycsICdvJywgJ3YnLCAncicpOgorICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKKyAgICAgICAgICAgIEFMT0dWKCJjaHVua19kYXRhX3NpemUgPSAlIiBQUklkNjQgIiBhbmQgZGF0YV9vZmZzZXQgPSAlIiBQUklkNjQsCisgICAgICAgICAgICAgICAgICBjaHVua19kYXRhX3NpemUsIGRhdGFfb2Zmc2V0KTsKKworICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IDAgfHwgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGNodW5rX2RhdGFfc2l6ZSkgPj0gU0laRV9NQVggLSAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gYnVmZmVyID0gaGVhcGJ1ZmZlcjx1aW50OF90PihjaHVua19kYXRhX3NpemUpOworICAgICAgICAgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImIvMjg0NzEyMDYiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCisgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGJ1ZmZlci5nZXQoKSwgY2h1bmtfZGF0YV9zaXplKSAhPSAoc3NpemVfdCljaHVua19kYXRhX3NpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25zdCBpbnQga1NraXBCeXRlc09mRGF0YUJveCA9IDE2OworICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8PSBrU2tpcEJ5dGVzT2ZEYXRhQm94KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXREYXRhKAorICAgICAgICAgICAgICAgIGtLZXlBbGJ1bUFydCwgTWV0YURhdGE6OlRZUEVfTk9ORSwKKyAgICAgICAgICAgICAgICBidWZmZXIuZ2V0KCkgKyBrU2tpcEJ5dGVzT2ZEYXRhQm94LCBjaHVua19kYXRhX3NpemUgLSBrU2tpcEJ5dGVzT2ZEYXRhQm94KTsKKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygnYycsICdvJywgJ2wnLCAncicpOgorICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgICAgICAgICAvLyB0aGlzIG11c3QgYmUgaW4gYSBWaXN1YWxTYW1wbGVFbnRyeSBib3ggdW5kZXIgdGhlIFNhbXBsZSBEZXNjcmlwdGlvbiBCb3ggKCdzdHNkJykKKyAgICAgICAgICAgIC8vIGlnbm9yZSBvdGhlcndpc2UKKyAgICAgICAgICAgIGlmIChkZXB0aCA+PSAyICYmIG1QYXRoW2RlcHRoIC0gMl0gPT0gRk9VUkNDKCdzJywgJ3QnLCAncycsICdkJykpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUNvbG9ySW5mbyhkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRk9VUkNDKCd0JywgJ2knLCAndCcsICdsJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdwJywgJ2UnLCAncicsICdmJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdhJywgJ3UnLCAndCcsICdoJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdnJywgJ24nLCAncicsICdlJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdhJywgJ2wnLCAnYicsICdtJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCd5JywgJ3InLCAncicsICdjJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2UzR1BQTWV0YURhdGEoZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSwgZGVwdGgpOworCisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygnSScsICdEJywgJzMnLCAnMicpOgorICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKKyAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPCA2KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcGFyc2VJRDN2Mk1ldGFEYXRhKGRhdGFfb2Zmc2V0ICsgNik7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoJy0nLCAnLScsICctJywgJy0nKToKKyAgICAgICAgeworICAgICAgICAgICAgbUxhc3RDb21tZW50TWVhbi5jbGVhcigpOworICAgICAgICAgICAgbUxhc3RDb21tZW50TmFtZS5jbGVhcigpOworICAgICAgICAgICAgbUxhc3RDb21tZW50RGF0YS5jbGVhcigpOworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygncycsICdpJywgJ2QnLCAneCcpOgorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZVNlZ21lbnRJbmRleChkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7IC8vIHN0b3AgcGFyc2luZyBhZnRlciBzaWR4CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygnYScsICdjJywgJy0nLCAnMycpOgorICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgICAgICAgICByZXR1cm4gcGFyc2VBQzNTYW1wbGVFbnRyeShkYXRhX29mZnNldCk7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygnZicsICd0JywgJ3knLCAncCcpOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgOCB8fCBkZXB0aCAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb2ZmNjRfdCBzdG9wX29mZnNldCA9ICpvZmZzZXQgKyBjaHVua19zaXplOworICAgICAgICAgICAgdWludDMyX3QgbnVtQ29tcGF0aWJsZUJyYW5kcyA9IChjaHVua19kYXRhX3NpemUgLSA4KSAvIDQ7CisgICAgICAgICAgICBzdGQ6OnNldDx1aW50MzJfdD4gYnJhbmRTZXQ7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUNvbXBhdGlibGVCcmFuZHMgKyAyOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgdGhpcyBpbmRleCwgaXQgcmVmZXJzIHRvIHRoZSBtaW5vclZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBhIGJyYW5kLgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBicmFuZDsKKyAgICAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChkYXRhX29mZnNldCArIDQgKiBpLCAmYnJhbmQsIDQpIDwgNCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJyYW5kID0gbnRvaGwoYnJhbmQpOworICAgICAgICAgICAgICAgIGJyYW5kU2V0Lmluc2VydChicmFuZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChicmFuZFNldC5jb3VudChGT1VSQ0MoJ3EnLCAndCcsICcgJywgJyAnKSkgPiAwKSB7CisgICAgICAgICAgICAgICAgbUlzUVQgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoYnJhbmRTZXQuY291bnQoRk9VUkNDKCdtJywgJ2knLCAnZicsICcxJykpID4gMAorICAgICAgICAgICAgICAgICAmJiBicmFuZFNldC5jb3VudChGT1VSQ0MoJ2gnLCAnZScsICdpJywgJ2MnKSkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJpZGVudGlmaWVkIEhFSUYgaW1hZ2UiKTsKKworICAgICAgICAgICAgICAgICAgICBtSXNIZWlmID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJhbmRTZXQuZXJhc2UoRk9VUkNDKCdtJywgJ2knLCAnZicsICcxJykpOworICAgICAgICAgICAgICAgICAgICBicmFuZFNldC5lcmFzZShGT1VSQ0MoJ2gnLCAnZScsICdpJywgJ2MnKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFicmFuZFNldC5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgbWVhbnMgdGhhdCB0aGUgZmlsZSBzaG91bGQgaGF2ZSBtb292IGJveC4KKyAgICAgICAgICAgICAgICAgICAgLy8gSXQgY291bGQgYmUgYW55IGlzbyBmaWxlcyAobXA0LCBoZWlmcywgZXRjLikKKyAgICAgICAgICAgICAgICAgICAgbUhhc01vb3ZCb3ggPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBpZiAobUlzSGVpZikgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImlkZW50aWZpZWQgSEVJRiBpbWFnZSB3aXRoIG90aGVyIHRyYWNrcyIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAqb2Zmc2V0ID0gc3RvcF9vZmZzZXQ7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgLy8gY2hlY2sgaWYgd2UncmUgcGFyc2luZyAnaWxzdCcgZm9yIG1ldGEga2V5cworICAgICAgICAgICAgLy8gaWYgc28sIHRyZWF0IHR5cGUgYXMgYSBudW1iZXIgKGtleS1pZCkuCisgICAgICAgICAgICBpZiAodW5kZXJRVE1ldGFQYXRoKG1QYXRoLCAzKSkgeworICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlUVRNZXRhVmFsKGNodW5rX3R5cGUsIGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6cGFyc2VBQzNTYW1wbGVFbnRyeShvZmY2NF90IG9mZnNldCkgeworICAgIC8vIHNraXAgMTYgYnl0ZXM6CisgICAgLy8gICsgNi1ieXRlIHJlc2VydmVkLAorICAgIC8vICArIDItYnl0ZSBkYXRhIHJlZmVyZW5jZSBpbmRleCwKKyAgICAvLyAgKyA4LWJ5dGUgcmVzZXJ2ZWQKKyAgICBvZmZzZXQgKz0gMTY7CisgICAgdWludDE2X3QgY2hhbm5lbENvdW50OworICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQxNihvZmZzZXQsICZjaGFubmVsQ291bnQpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIC8vIHNraXAgOCBieXRlczoKKyAgICAvLyAgKyAyLWJ5dGUgY2hhbm5lbENvdW50LAorICAgIC8vICArIDItYnl0ZSBzYW1wbGUgc2l6ZSwKKyAgICAvLyAgKyA0LWJ5dGUgcmVzZXJ2ZWQKKyAgICBvZmZzZXQgKz0gODsKKyAgICB1aW50MTZfdCBzYW1wbGVSYXRlOworICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQxNihvZmZzZXQsICZzYW1wbGVSYXRlKSkgeworICAgICAgICBBTE9HRSgiTVBFRzRFeHRyYWN0b3I6IGVycm9yIHdoaWxlIHJlYWRpbmcgYWMtMyBibG9jazogY2Fubm90IHJlYWQgc2FtcGxlIHJhdGUiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICAvLyBza2lwIDQgYnl0ZXM6CisgICAgLy8gICsgMi1ieXRlIHNhbXBsZVJhdGUsCisgICAgLy8gICsgMi1ieXRlIHJlc2VydmVkCisgICAgb2Zmc2V0ICs9IDQ7CisgICAgcmV0dXJuIHBhcnNlQUMzU3BlY2lmaWNCb3gob2Zmc2V0LCBzYW1wbGVSYXRlKTsKK30KKworc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlQUMzU3BlY2lmaWNCb3goCisgICAgICAgIG9mZjY0X3Qgb2Zmc2V0LCB1aW50MTZfdCBzYW1wbGVSYXRlKSB7CisgICAgdWludDMyX3Qgc2l6ZTsKKyAgICAvLyArIDQtYnl0ZSBzaXplCisgICAgLy8gKyA0LWJ5dGUgdHlwZQorICAgIC8vICsgMy1ieXRlIHBheWxvYWQKKyAgICBjb25zdCB1aW50MzJfdCBrQUMzU3BlY2lmaWNCb3hTaXplID0gMTE7CisgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJnNpemUpIHx8IHNpemUgPCBrQUMzU3BlY2lmaWNCb3hTaXplKSB7CisgICAgICAgIEFMT0dFKCJNUEVHNEV4dHJhY3RvcjogZXJyb3Igd2hpbGUgcmVhZGluZyBhYy0zIGJsb2NrOiBjYW5ub3QgcmVhZCBzcGVjaWZpYyBib3ggc2l6ZSIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIG9mZnNldCArPSA0OworICAgIHVpbnQzMl90IHR5cGU7CisgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJnR5cGUpIHx8IHR5cGUgIT0gRk9VUkNDKCdkJywgJ2EnLCAnYycsICczJykpIHsKKyAgICAgICAgQUxPR0UoIk1QRUc0RXh0cmFjdG9yOiBlcnJvciB3aGlsZSByZWFkaW5nIGFjLTMgc3BlY2lmaWMgYmxvY2s6IGhlYWRlciBub3QgZGFjMyIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIG9mZnNldCArPSA0OworICAgIGNvbnN0IHVpbnQzMl90IGtBQzNTcGVjaWZpY0JveFBheWxvYWRTaXplID0gMzsKKyAgICB1aW50OF90IGNodW5rW2tBQzNTcGVjaWZpY0JveFBheWxvYWRTaXplXTsKKyAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIGNodW5rLCBzaXplb2YoY2h1bmspKSAhPSBzaXplb2YoY2h1bmspKSB7CisgICAgICAgIEFMT0dFKCJNUEVHNEV4dHJhY3RvcjogZXJyb3Igd2hpbGUgcmVhZGluZyBhYy0zIHNwZWNpZmljIGJsb2NrOiBiaXRzdHJlYW0gZmllbGRzIik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgQUJpdFJlYWRlciBicihjaHVuaywgc2l6ZW9mKGNodW5rKSk7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYW5uZWxDb3VudFRhYmxlW10gPSB7MiwgMSwgMiwgMywgMywgNCwgNCwgNX07CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNhbXBsZVJhdGVUYWJsZVtdID0gezQ4MDAwLCA0NDEwMCwgMzIwMDB9OworCisgICAgdW5zaWduZWQgZnNjb2QgPSBici5nZXRCaXRzKDIpOworICAgIGlmIChmc2NvZCA9PSAzKSB7CisgICAgICAgIEFMT0dFKCJJbmNvcnJlY3QgZnNjb2QgKDMpIGluIEFDMyBoZWFkZXIiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgdW5zaWduZWQgYm94U2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGVUYWJsZVtmc2NvZF07CisgICAgaWYgKGJveFNhbXBsZVJhdGUgIT0gc2FtcGxlUmF0ZSkgeworICAgICAgICBBTE9HRSgic2FtcGxlIHJhdGUgbWlzbWF0Y2g6IGJveFNhbXBsZVJhdGUgPSAlZCwgc2FtcGxlUmF0ZSA9ICVkIiwKKyAgICAgICAgICAgIGJveFNhbXBsZVJhdGUsIHNhbXBsZVJhdGUpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHVuc2lnbmVkIGJzaWQgPSBici5nZXRCaXRzKDUpOworICAgIGlmIChic2lkID4gOCkgeworICAgICAgICBBTE9HVygiSW5jb3JyZWN0IGJzaWQgaW4gQUMzIGhlYWRlci4gUG9zc2libHkgRS1BQy0zPyIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIC8vIHNraXAKKyAgICB1bnNpZ25lZCBic21vZCBfX3VudXNlZCA9IGJyLmdldEJpdHMoMyk7CisKKyAgICB1bnNpZ25lZCBhY21vZCA9IGJyLmdldEJpdHMoMyk7CisgICAgdW5zaWduZWQgbGZlb24gPSBici5nZXRCaXRzKDEpOworICAgIHVuc2lnbmVkIGNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudFRhYmxlW2FjbW9kXSArIGxmZW9uOworCisgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICBtTGFzdFRyYWNrLT5tZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQzMpOworICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgY2hhbm5lbENvdW50KTsKKyAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVSYXRlKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZVNlZ21lbnRJbmRleChvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgQUxPR1YoIk1QRUc0RXh0cmFjdG9yOjpwYXJzZVNlZ21lbnRJbmRleCIpOworCisgICAgaWYgKHNpemUgPCAxMikgeworICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgdWludDMyX3QgZmxhZ3M7CisgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJmZsYWdzKSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHVpbnQzMl90IHZlcnNpb24gPSBmbGFncyA+PiAyNDsKKyAgICBmbGFncyAmPSAweGZmZmZmZjsKKworICAgIEFMT0dWKCJzaWR4IHZlcnNpb24gJWQiLCB2ZXJzaW9uKTsKKworICAgIHVpbnQzMl90IHJlZmVyZW5jZUlkOworICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQgKyA0LCAmcmVmZXJlbmNlSWQpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgdWludDMyX3QgdGltZVNjYWxlOworICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQgKyA4LCAmdGltZVNjYWxlKSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICBBTE9HVigic2lkeCByZWZpZC90aW1lc2NhbGU6ICVkLyVkIiwgcmVmZXJlbmNlSWQsIHRpbWVTY2FsZSk7CisgICAgaWYgKHRpbWVTY2FsZSA9PSAwKQorICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworCisgICAgdWludDY0X3QgZWFybGllc3RQcmVzZW50YXRpb25UaW1lOworICAgIHVpbnQ2NF90IGZpcnN0T2Zmc2V0OworCisgICAgb2Zmc2V0ICs9IDEyOworICAgIHNpemUgLT0gMTI7CisKKyAgICBpZiAodmVyc2lvbiA9PSAwKSB7CisgICAgICAgIGlmIChzaXplIDwgOCkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgdWludDMyX3QgdG1wOworICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmdG1wKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgICAgICBlYXJsaWVzdFByZXNlbnRhdGlvblRpbWUgPSB0bXA7CisgICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQgKyA0LCAmdG1wKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgICAgICBmaXJzdE9mZnNldCA9IHRtcDsKKyAgICAgICAgb2Zmc2V0ICs9IDg7CisgICAgICAgIHNpemUgLT0gODsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoc2l6ZSA8IDE2KSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50NjQob2Zmc2V0LCAmZWFybGllc3RQcmVzZW50YXRpb25UaW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50NjQob2Zmc2V0ICsgOCwgJmZpcnN0T2Zmc2V0KSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgICAgICBvZmZzZXQgKz0gMTY7CisgICAgICAgIHNpemUgLT0gMTY7CisgICAgfQorICAgIEFMT0dWKCJzaWR4IHByZXMvb2ZmOiAlIiBQUkl1NjQgIi8lIiBQUkl1NjQsIGVhcmxpZXN0UHJlc2VudGF0aW9uVGltZSwgZmlyc3RPZmZzZXQpOworCisgICAgaWYgKHNpemUgPCA0KSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIHVpbnQxNl90IHJlZmVyZW5jZUNvdW50OworICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQxNihvZmZzZXQgKyAyLCAmcmVmZXJlbmNlQ291bnQpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIG9mZnNldCArPSA0OworICAgIHNpemUgLT0gNDsKKyAgICBBTE9HVigicmVmY291bnQ6ICVkIiwgcmVmZXJlbmNlQ291bnQpOworCisgICAgaWYgKHNpemUgPCByZWZlcmVuY2VDb3VudCAqIDEyKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIHVpbnQ2NF90IHRvdGFsX2R1cmF0aW9uID0gMDsKKyAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHJlZmVyZW5jZUNvdW50OyBpKyspIHsKKyAgICAgICAgdWludDMyX3QgZDEsIGQyLCBkMzsKKworICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmZDEpIHx8ICAgICAvLyBzaXplCisgICAgICAgICAgICAhbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQgKyA0LCAmZDIpIHx8IC8vIGR1cmF0aW9uCisgICAgICAgICAgICAhbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQgKyA4LCAmZDMpKSB7IC8vIGZsYWdzCisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGQxICYgMHg4MDAwMDAwMCkgeworICAgICAgICAgICAgQUxPR1coInN1Yi1zaWR4IGJveGVzIG5vdCBzdXBwb3J0ZWQgeWV0Iik7CisgICAgICAgIH0KKyAgICAgICAgYm9vbCBzYXAgPSBkMyAmIDB4ODAwMDAwMDA7CisgICAgICAgIHVpbnQzMl90IHNhcHR5cGUgPSAoZDMgPj4gMjgpICYgNzsKKyAgICAgICAgaWYgKCFzYXAgfHwgKHNhcHR5cGUgIT0gMSAmJiBzYXB0eXBlICE9IDIpKSB7CisgICAgICAgICAgICAvLyB0eXBlIDEgYW5kIDIgYXJlIHN5bmMgc2FtcGxlcworICAgICAgICAgICAgQUxPR1coIm5vdCBhIHN0cmVhbSBhY2Nlc3MgcG9pbnQsIG9yIHVuc3VwcG9ydGVkIHR5cGU6ICUwOHgiLCBkMyk7CisgICAgICAgIH0KKyAgICAgICAgdG90YWxfZHVyYXRpb24gKz0gZDI7CisgICAgICAgIG9mZnNldCArPSAxMjsKKyAgICAgICAgQUxPR1YoIiBpdGVtICVkLCAlMDh4ICUwOHggJTA4eCIsIGksIGQxLCBkMiwgZDMpOworICAgICAgICBTaWR4RW50cnkgc2U7CisgICAgICAgIHNlLm1TaXplID0gZDEgJiAweDdmZmZmZmZmOworICAgICAgICBzZS5tRHVyYXRpb25VcyA9IDEwMDAwMDBMTCAqIGQyIC8gdGltZVNjYWxlOworICAgICAgICBtU2lkeEVudHJpZXMuYWRkKHNlKTsKKyAgICB9CisKKyAgICB1aW50NjRfdCBzaWR4RHVyYXRpb24gPSB0b3RhbF9kdXJhdGlvbiAqIDEwMDAwMDAgLyB0aW1lU2NhbGU7CisKKyAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQorICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworCisgICAgaW50NjRfdCBtZXRhRHVyYXRpb247CisgICAgaWYgKCFtTGFzdFRyYWNrLT5tZXRhLmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZtZXRhRHVyYXRpb24pIHx8IG1ldGFEdXJhdGlvbiA9PSAwKSB7CisgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50NjQoa0tleUR1cmF0aW9uLCBzaWR4RHVyYXRpb24pOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZVFUTWV0YUtleShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAoc2l6ZSA8IDgpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICB1aW50MzJfdCBjb3VudDsKKyAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0ICsgNCwgJmNvdW50KSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIGlmIChtTWV0YUtleU1hcC5zaXplKCkgPiAwKSB7CisgICAgICAgIEFMT0dXKCIna2V5cycgYXRvbSBzZWVuIGFnYWluLCBkaXNjYXJkaW5nIGV4aXN0aW5nIGVudHJpZXMiKTsKKyAgICAgICAgbU1ldGFLZXlNYXAuY2xlYXIoKTsKKyAgICB9CisKKyAgICBvZmY2NF90IGtleU9mZnNldCA9IG9mZnNldCArIDg7CisgICAgb2ZmNjRfdCBzdG9wT2Zmc2V0ID0gb2Zmc2V0ICsgc2l6ZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8PSBjb3VudDsgaSsrKSB7CisgICAgICAgIGlmIChrZXlPZmZzZXQgKyA4ID4gc3RvcE9mZnNldCkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQzMl90IGtleVNpemU7CisgICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihrZXlPZmZzZXQsICZrZXlTaXplKQorICAgICAgICAgICAgICAgIHx8IGtleVNpemUgPCA4CisgICAgICAgICAgICAgICAgfHwga2V5T2Zmc2V0ICsga2V5U2l6ZSA+IHN0b3BPZmZzZXQpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKworICAgICAgICB1aW50MzJfdCB0eXBlOworICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIoa2V5T2Zmc2V0ICsgNCwgJnR5cGUpCisgICAgICAgICAgICAgICAgfHwgdHlwZSAhPSBGT1VSQ0MoJ20nLCAnZCcsICd0JywgJ2EnKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIGtleVNpemUgLT0gODsKKyAgICAgICAga2V5T2Zmc2V0ICs9IDg7CisKKyAgICAgICAgYXV0byBrZXlEYXRhID0gaGVhcGJ1ZmZlcjx1aW50OF90PihrZXlTaXplKTsKKyAgICAgICAgaWYgKGtleURhdGEuZ2V0KCkgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICBrZXlPZmZzZXQsIGtleURhdGEuZ2V0KCksIGtleVNpemUpIDwgKHNzaXplX3QpIGtleVNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKworICAgICAgICBBU3RyaW5nIGtleSgoY29uc3QgY2hhciAqKWtleURhdGEuZ2V0KCksIGtleVNpemUpOworICAgICAgICBtTWV0YUtleU1hcC5hZGQoaSwga2V5KTsKKworICAgICAgICBrZXlPZmZzZXQgKz0ga2V5U2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6cGFyc2VRVE1ldGFWYWwoCisgICAgICAgIGludDMyX3Qga2V5SWQsIG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIHNzaXplX3QgaW5kZXggPSBtTWV0YUtleU1hcC5pbmRleE9mS2V5KGtleUlkKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIC8vIGNvcnJlc3BvbmRpbmcga2V5IGlzIG5vdCBwcmVzZW50LCBpZ25vcmUKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBpZiAoc2l6ZSA8PSAxNikgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICB1aW50MzJfdCBkYXRhU2l6ZTsKKyAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmZGF0YVNpemUpCisgICAgICAgICAgICB8fCBkYXRhU2l6ZSA+IHNpemUgfHwgZGF0YVNpemUgPD0gMTYpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgdWludDMyX3QgYXRvbUZvdXJDQzsKKyAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0ICsgNCwgJmF0b21Gb3VyQ0MpCisgICAgICAgICAgICB8fCBhdG9tRm91ckNDICE9IEZPVVJDQygnZCcsICdhJywgJ3QnLCAnYScpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIHVpbnQzMl90IGRhdGFUeXBlOworICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQgKyA4LCAmZGF0YVR5cGUpCisgICAgICAgICAgICB8fCAoKGRhdGFUeXBlICYgMHhmZjAwMDAwMCkgIT0gMCkpIHsKKyAgICAgICAgLy8gbm90IHdlbGwta25vd24gdHlwZQorICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIGRhdGFTaXplIC09IDE2OworICAgIG9mZnNldCArPSAxNjsKKworICAgIGlmIChkYXRhVHlwZSA9PSAyMyAmJiBkYXRhU2l6ZSA+PSA0KSB7CisgICAgICAgIC8vIEJFIEZsb2F0MzIKKyAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmdmFsKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXN0cmNhc2VjbXAobU1ldGFLZXlNYXBbaW5kZXhdLmNfc3RyKCksICJjb20uYW5kcm9pZC5jYXB0dXJlLmZwcyIpKSB7CisgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldEZsb2F0KGtLZXlDYXB0dXJlRnJhbWVyYXRlLCAqKGZsb2F0ICopJnZhbCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGRhdGFUeXBlID09IDY3ICYmIGRhdGFTaXplID49IDQpIHsKKyAgICAgICAgLy8gQkUgc2lnbmVkIGludDMyCisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJnZhbCkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzdHJjYXNlY21wKG1NZXRhS2V5TWFwW2luZGV4XS5jX3N0cigpLCAiY29tLmFuZHJvaWQudmlkZW8udGVtcG9yYWxfbGF5ZXJzX2NvdW50IikpIHsKKyAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0SW50MzIoa0tleVRlbXBvcmFsTGF5ZXJDb3VudCwgdmFsKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGFkZCBtb3JlIGtleXMgaWYgbmVlZGVkCisgICAgICAgIEFMT0dWKCJpZ25vcmluZyBrZXk6IHR5cGUgJWQsIHNpemUgJWQiLCBkYXRhVHlwZSwgZGF0YVNpemUpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlVHJhY2tIZWFkZXIoCisgICAgICAgIG9mZjY0X3QgZGF0YV9vZmZzZXQsIG9mZjY0X3QgZGF0YV9zaXplKSB7CisgICAgaWYgKGRhdGFfc2l6ZSA8IDQpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICB1aW50OF90IHZlcnNpb247CisgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQsICZ2ZXJzaW9uLCAxKSA8IDEpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKworICAgIHNpemVfdCBkeW5TaXplID0gKHZlcnNpb24gPT0gMSkgPyAzNiA6IDI0OworCisgICAgdWludDhfdCBidWZmZXJbMzYgKyA2MF07CisKKyAgICBpZiAoZGF0YV9zaXplICE9IChvZmY2NF90KWR5blNpemUgKyA2MCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBidWZmZXIsIGRhdGFfc2l6ZSkgPCAoc3NpemVfdClkYXRhX3NpemUpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKworICAgIHVpbnQ2NF90IGN0aW1lIF9fdW51c2VkLCBtdGltZSBfX3VudXNlZCwgZHVyYXRpb24gX191bnVzZWQ7CisgICAgaW50MzJfdCBpZDsKKworICAgIGlmICh2ZXJzaW9uID09IDEpIHsKKyAgICAgICAgY3RpbWUgPSBVNjRfQVQoJmJ1ZmZlcls0XSk7CisgICAgICAgIG10aW1lID0gVTY0X0FUKCZidWZmZXJbMTJdKTsKKyAgICAgICAgaWQgPSBVMzJfQVQoJmJ1ZmZlclsyMF0pOworICAgICAgICBkdXJhdGlvbiA9IFU2NF9BVCgmYnVmZmVyWzI4XSk7CisgICAgfSBlbHNlIGlmICh2ZXJzaW9uID09IDApIHsKKyAgICAgICAgY3RpbWUgPSBVMzJfQVQoJmJ1ZmZlcls0XSk7CisgICAgICAgIG10aW1lID0gVTMyX0FUKCZidWZmZXJbOF0pOworICAgICAgICBpZCA9IFUzMl9BVCgmYnVmZmVyWzEyXSk7CisgICAgICAgIGR1cmF0aW9uID0gVTMyX0FUKCZidWZmZXJbMjBdKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKworICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVRyYWNrSUQsIGlkKTsKKworICAgIHNpemVfdCBtYXRyaXhPZmZzZXQgPSBkeW5TaXplICsgMTY7CisgICAgaW50MzJfdCBhMDAgPSBVMzJfQVQoJmJ1ZmZlclttYXRyaXhPZmZzZXRdKTsKKyAgICBpbnQzMl90IGEwMSA9IFUzMl9BVCgmYnVmZmVyW21hdHJpeE9mZnNldCArIDRdKTsKKyAgICBpbnQzMl90IGExMCA9IFUzMl9BVCgmYnVmZmVyW21hdHJpeE9mZnNldCArIDEyXSk7CisgICAgaW50MzJfdCBhMTEgPSBVMzJfQVQoJmJ1ZmZlclttYXRyaXhPZmZzZXQgKyAxNl0pOworCisjaWYgMAorICAgIGludDMyX3QgZHggPSBVMzJfQVQoJmJ1ZmZlclttYXRyaXhPZmZzZXQgKyA4XSk7CisgICAgaW50MzJfdCBkeSA9IFUzMl9BVCgmYnVmZmVyW21hdHJpeE9mZnNldCArIDIwXSk7CisKKyAgICBBTE9HSSgieCcgPSAlLjJmICogeCArICUuMmYgKiB5ICsgJS4yZiIsCisgICAgICAgICBhMDAgLyA2NTUzNi4wZiwgYTAxIC8gNjU1MzYuMGYsIGR4IC8gNjU1MzYuMGYpOworICAgIEFMT0dJKCJ5JyA9ICUuMmYgKiB4ICsgJS4yZiAqIHkgKyAlLjJmIiwKKyAgICAgICAgIGExMCAvIDY1NTM2LjBmLCBhMTEgLyA2NTUzNi4wZiwgZHkgLyA2NTUzNi4wZik7CisjZW5kaWYKKworICAgIHVpbnQzMl90IHJvdGF0aW9uRGVncmVlczsKKworICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtGaXhlZE9uZSA9IDB4MTAwMDA7CisgICAgaWYgKGEwMCA9PSBrRml4ZWRPbmUgJiYgYTAxID09IDAgJiYgYTEwID09IDAgJiYgYTExID09IGtGaXhlZE9uZSkgeworICAgICAgICAvLyBJZGVudGl0eSwgbm8gcm90YXRpb24KKyAgICAgICAgcm90YXRpb25EZWdyZWVzID0gMDsKKyAgICB9IGVsc2UgaWYgKGEwMCA9PSAwICYmIGEwMSA9PSBrRml4ZWRPbmUgJiYgYTEwID09IC1rRml4ZWRPbmUgJiYgYTExID09IDApIHsKKyAgICAgICAgcm90YXRpb25EZWdyZWVzID0gOTA7CisgICAgfSBlbHNlIGlmIChhMDAgPT0gMCAmJiBhMDEgPT0gLWtGaXhlZE9uZSAmJiBhMTAgPT0ga0ZpeGVkT25lICYmIGExMSA9PSAwKSB7CisgICAgICAgIHJvdGF0aW9uRGVncmVlcyA9IDI3MDsKKyAgICB9IGVsc2UgaWYgKGEwMCA9PSAta0ZpeGVkT25lICYmIGEwMSA9PSAwICYmIGExMCA9PSAwICYmIGExMSA9PSAta0ZpeGVkT25lKSB7CisgICAgICAgIHJvdGF0aW9uRGVncmVlcyA9IDE4MDsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVygiV2Ugb25seSBzdXBwb3J0IDAsOTAsMTgwLDI3MCBkZWdyZWUgcm90YXRpb24gbWF0cmljZXMiKTsKKyAgICAgICAgcm90YXRpb25EZWdyZWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAocm90YXRpb25EZWdyZWVzICE9IDApIHsKKyAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Um90YXRpb24sIHJvdGF0aW9uRGVncmVlcyk7CisgICAgfQorCisgICAgLy8gSGFuZGxlIHByZXNlbnRhdGlvbiBkaXNwbGF5IHNpemUsIHdoaWNoIGNvdWxkIGJlIGRpZmZlcmVudAorICAgIC8vIGZyb20gdGhlIGltYWdlIHNpemUgaW5kaWNhdGVkIGJ5IGtLZXlXaWR0aCBhbmQga0tleUhlaWdodC4KKyAgICB1aW50MzJfdCB3aWR0aCA9IFUzMl9BVCgmYnVmZmVyW2R5blNpemUgKyA1Ml0pOworICAgIHVpbnQzMl90IGhlaWdodCA9IFUzMl9BVCgmYnVmZmVyW2R5blNpemUgKyA1Nl0pOworICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleURpc3BsYXlXaWR0aCwgd2lkdGggPj4gMTYpOworICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleURpc3BsYXlIZWlnaHQsIGhlaWdodCA+PiAxNik7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZUlUdW5lc01ldGFEYXRhKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGlmIChzaXplIDwgNCB8fCBzaXplID09IFNJWkVfTUFYKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgdWludDhfdCAqYnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQ4X3Rbc2l6ZSArIDFdOworICAgIGlmIChidWZmZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICBvZmZzZXQsIGJ1ZmZlciwgc2l6ZSkgIT0gKHNzaXplX3Qpc2l6ZSkgeworICAgICAgICBkZWxldGVbXSBidWZmZXI7CisgICAgICAgIGJ1ZmZlciA9IE5VTEw7CisKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKworICAgIHVpbnQzMl90IGZsYWdzID0gVTMyX0FUKGJ1ZmZlcik7CisKKyAgICB1aW50MzJfdCBtZXRhZGF0YUtleSA9IDA7CisgICAgY2hhciBjaHVua1s1XTsKKyAgICBNYWtlRm91ckNDU3RyaW5nKG1QYXRoWzRdLCBjaHVuayk7CisgICAgQUxPR1YoIm1ldGE6ICVzIEAgJWxsZCIsIGNodW5rLCAobG9uZyBsb25nKW9mZnNldCk7CisgICAgc3dpdGNoICgoaW50MzJfdCltUGF0aFs0XSkgeworICAgICAgICBjYXNlIEZPVVJDQygweGE5LCAnYScsICdsJywgJ2InKToKKyAgICAgICAgeworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5QWxidW07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQygweGE5LCAnQScsICdSJywgJ1QnKToKKyAgICAgICAgeworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5QXJ0aXN0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2EnLCAnQScsICdSJywgJ1QnKToKKyAgICAgICAgeworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5QWxidW1BcnRpc3Q7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQygweGE5LCAnZCcsICdhJywgJ3knKToKKyAgICAgICAgeworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5WWVhcjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRk9VUkNDKDB4YTksICduJywgJ2EnLCAnbScpOgorICAgICAgICB7CisgICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlUaXRsZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRk9VUkNDKDB4YTksICd3JywgJ3InLCAndCcpOgorICAgICAgICB7CisgICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlXcml0ZXI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQygnYycsICdvJywgJ3YnLCAncicpOgorICAgICAgICB7CisgICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlBbGJ1bUFydDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRk9VUkNDKCdnJywgJ24nLCAncicsICdlJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleUdlbnJlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGT1VSQ0MoMHhhOSwgJ2cnLCAnZScsICduJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleUdlbnJlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2MnLCAncCcsICdpJywgJ2wnKToKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNpemUgPT0gOSAmJiBmbGFncyA9PSAyMSkgeworICAgICAgICAgICAgICAgIGNoYXIgdG1wWzE2XTsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIiVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpYnVmZmVyW3NpemUgLSAxXSk7CisKKyAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa0tleUNvbXBpbGF0aW9uLCB0bXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAncicsICdrJywgJ24nKToKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNpemUgPT0gMTYgJiYgZmxhZ3MgPT0gMCkgeworICAgICAgICAgICAgICAgIGNoYXIgdG1wWzE2XTsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCogcFRyYWNrID0gKHVpbnQxNl90KikmYnVmZmVyWzEwXTsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCogcFRvdGFsVHJhY2tzID0gKHVpbnQxNl90KikmYnVmZmVyWzEyXTsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIiVkLyVkIiwgbnRvaHMoKnBUcmFjayksIG50b2hzKCpwVG90YWxUcmFja3MpKTsKKworICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhrS2V5Q0RUcmFja051bWJlciwgdG1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRk9VUkNDKCdkJywgJ2knLCAncycsICdrJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoc2l6ZSA9PSAxNCB8fCBzaXplID09IDE2KSAmJiBmbGFncyA9PSAwKSB7CisgICAgICAgICAgICAgICAgY2hhciB0bXBbMTZdOworICAgICAgICAgICAgICAgIHVpbnQxNl90KiBwRGlzYyA9ICh1aW50MTZfdCopJmJ1ZmZlclsxMF07CisgICAgICAgICAgICAgICAgdWludDE2X3QqIHBUb3RhbERpc2NzID0gKHVpbnQxNl90KikmYnVmZmVyWzEyXTsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIiVkLyVkIiwgbnRvaHMoKnBEaXNjKSwgbnRvaHMoKnBUb3RhbERpc2NzKSk7CisKKyAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa0tleURpc2NOdW1iZXIsIHRtcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQygnLScsICctJywgJy0nLCAnLScpOgorICAgICAgICB7CisgICAgICAgICAgICBidWZmZXJbc2l6ZV0gPSAnXDAnOworICAgICAgICAgICAgc3dpdGNoIChtUGF0aFs1XSkgeworICAgICAgICAgICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ2UnLCAnYScsICduJyk6CisgICAgICAgICAgICAgICAgICAgIG1MYXN0Q29tbWVudE1lYW4uc2V0VG8oKGNvbnN0IGNoYXIgKilidWZmZXIgKyA0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBGT1VSQ0MoJ24nLCAnYScsICdtJywgJ2UnKToKKyAgICAgICAgICAgICAgICAgICAgbUxhc3RDb21tZW50TmFtZS5zZXRUbygoY29uc3QgY2hhciAqKWJ1ZmZlciArIDQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEZPVVJDQygnZCcsICdhJywgJ3QnLCAnYScpOgorICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZVtdIGJ1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiYi8yNDM0NjQzMCIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtTGFzdENvbW1lbnREYXRhLnNldFRvKChjb25zdCBjaGFyICopYnVmZmVyICsgOCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBPbmNlIHdlIGhhdmUgYSBzZXQgb2YgbWVhbi9uYW1lL2RhdGEgaW5mbywgZ28gYWhlYWQgYW5kIHByb2Nlc3MKKyAgICAgICAgICAgIC8vIGl0IHRvIHNlZSBpZiBpdHMgc29tZXRoaW5nIHdlIGFyZSBpbnRlcmVzdGVkIGluLiAgV2hldGhlciBvciBub3QKKyAgICAgICAgICAgIC8vIHdlcmUgYXJlIGludGVyZXN0ZWQgaW4gdGhlIHNwZWNpZmljIHRhZywgbWFrZSBzdXJlIHRvIGNsZWFyIG91dAorICAgICAgICAgICAgLy8gdGhlIHNldCBzbyB3ZSBjYW4gYmUgcmVhZHkgdG8gcHJvY2VzcyBhbm90aGVyIHR1cGxlIHNob3VsZCBvbmUKKyAgICAgICAgICAgIC8vIHNob3cgdXAgbGF0ZXIgaW4gdGhlIGZpbGUuCisgICAgICAgICAgICBpZiAoKG1MYXN0Q29tbWVudE1lYW4ubGVuZ3RoKCkgIT0gMCkgJiYKKyAgICAgICAgICAgICAgICAobUxhc3RDb21tZW50TmFtZS5sZW5ndGgoKSAhPSAwKSAmJgorICAgICAgICAgICAgICAgIChtTGFzdENvbW1lbnREYXRhLmxlbmd0aCgpICE9IDApKSB7CisKKyAgICAgICAgICAgICAgICBpZiAobUxhc3RDb21tZW50TWVhbiA9PSAiY29tLmFwcGxlLmlUdW5lcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIG1MYXN0Q29tbWVudE5hbWUgPT0gImlUdW5TTVBCIikgeworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRlbGF5LCBwYWRkaW5nOworICAgICAgICAgICAgICAgICAgICBpZiAoc3NjYW5mKG1MYXN0Q29tbWVudERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAlKnggJXggJXggJSp4IiwgJmRlbGF5LCAmcGFkZGluZykgPT0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZVtdIGJ1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlFbmNvZGVyRGVsYXksIGRlbGF5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUVuY29kZXJQYWRkaW5nLCBwYWRkaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1MYXN0Q29tbWVudE1lYW4uY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtTGFzdENvbW1lbnROYW1lLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgbUxhc3RDb21tZW50RGF0YS5jbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHNpemUgPj0gOCAmJiBtZXRhZGF0YUtleSAmJiAhbUZpbGVNZXRhRGF0YS5oYXNEYXRhKG1ldGFkYXRhS2V5KSkgeworICAgICAgICBpZiAobWV0YWRhdGFLZXkgPT0ga0tleUFsYnVtQXJ0KSB7CisgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldERhdGEoCisgICAgICAgICAgICAgICAgICAgIGtLZXlBbGJ1bUFydCwgTWV0YURhdGE6OlRZUEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyICsgOCwgc2l6ZSAtIDgpOworICAgICAgICB9IGVsc2UgaWYgKG1ldGFkYXRhS2V5ID09IGtLZXlHZW5yZSkgeworICAgICAgICAgICAgaWYgKGZsYWdzID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyB1aW50OF90IGdlbnJlIGNvZGUsIGlUdW5lcyBnZW5yZSBjb2RlcyBhcmUKKyAgICAgICAgICAgICAgICAvLyB0aGUgc3RhbmRhcmQgaWQzIGNvZGVzLCBleGNlcHQgdGhleSBzdGFydAorICAgICAgICAgICAgICAgIC8vIGF0IDEgaW5zdGVhZCBvZiAwIChlLmcuIFBvcCBpcyAxNCwgbm90IDEzKQorICAgICAgICAgICAgICAgIC8vIFdlIHVzZSBzdGFuZGFyZCBpZDMgbnVtYmVyaW5nLCBzbyBzdWJ0cmFjdCAxLgorICAgICAgICAgICAgICAgIGludCBnZW5yZWNvZGUgPSAoaW50KWJ1ZmZlcltzaXplIC0gMV07CisgICAgICAgICAgICAgICAgZ2VucmVjb2RlLS07CisgICAgICAgICAgICAgICAgaWYgKGdlbnJlY29kZSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZ2VucmVjb2RlID0gMjU1OyAvLyByZXNlcnZlZCBmb3IgJ3Vua25vd24gZ2VucmUnCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNoYXIgZ2VucmVbMTBdOworICAgICAgICAgICAgICAgIHNwcmludGYoZ2VucmUsICIlZCIsIGdlbnJlY29kZSk7CisKKyAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcobWV0YWRhdGFLZXksIGdlbnJlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZmxhZ3MgPT0gMSkgeworICAgICAgICAgICAgICAgIC8vIGN1c3RvbSBnZW5yZSBzdHJpbmcKKyAgICAgICAgICAgICAgICBidWZmZXJbc2l6ZV0gPSAnXDAnOworCisgICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFLZXksIChjb25zdCBjaGFyICopYnVmZmVyICsgOCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBidWZmZXJbc2l6ZV0gPSAnXDAnOworCisgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhS2V5LCAoY29uc3QgY2hhciAqKWJ1ZmZlciArIDgpOworICAgICAgICB9CisgICAgfQorCisgICAgZGVsZXRlW10gYnVmZmVyOworICAgIGJ1ZmZlciA9IE5VTEw7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZUNvbG9ySW5mbyhvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAoc2l6ZSA8IDQgfHwgc2l6ZSA9PSBTSVpFX01BWCB8fCBtTGFzdFRyYWNrID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICB1aW50OF90ICpidWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgdWludDhfdFtzaXplICsgMV07CisgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgYnVmZmVyLCBzaXplKSAhPSAoc3NpemVfdClzaXplKSB7CisgICAgICAgIGRlbGV0ZVtdIGJ1ZmZlcjsKKyAgICAgICAgYnVmZmVyID0gTlVMTDsKKworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorCisgICAgaW50MzJfdCB0eXBlID0gVTMyX0FUKCZidWZmZXJbMF0pOworICAgIGlmICgodHlwZSA9PSBGT1VSQ0MoJ24nLCAnYycsICdsJywgJ3gnKSAmJiBzaXplID49IDExKQorICAgICAgICAgICAgfHwgKHR5cGUgPT0gRk9VUkNDKCduJywgJ2MnLCAnbCcsICdjJykgJiYgc2l6ZSA+PSAxMCkpIHsKKyAgICAgICAgaW50MzJfdCBwcmltYXJpZXMgPSBVMTZfQVQoJmJ1ZmZlcls0XSk7CisgICAgICAgIGludDMyX3QgdHJhbnNmZXIgPSBVMTZfQVQoJmJ1ZmZlcls2XSk7CisgICAgICAgIGludDMyX3QgY29lZmZzID0gVTE2X0FUKCZidWZmZXJbOF0pOworICAgICAgICBib29sIGZ1bGxSYW5nZSA9ICh0eXBlID09IEZPVVJDQygnbicsICdjJywgJ2wnLCAneCcpKSAmJiAoYnVmZmVyWzEwXSAmIDEyOCk7CisKKyAgICAgICAgQ29sb3JBc3BlY3RzIGFzcGVjdHM7CisgICAgICAgIENvbG9yVXRpbHM6OmNvbnZlcnRJc29Db2xvckFzcGVjdHNUb0NvZGVjQXNwZWN0cygKKyAgICAgICAgICAgICAgICBwcmltYXJpZXMsIHRyYW5zZmVyLCBjb2VmZnMsIGZ1bGxSYW5nZSwgYXNwZWN0cyk7CisKKyAgICAgICAgLy8gb25seSBzdG9yZSB0aGUgZmlyc3QgY29sb3Igc3BlY2lmaWNhdGlvbgorICAgICAgICBpZiAoIW1MYXN0VHJhY2stPm1ldGEuaGFzRGF0YShrS2V5Q29sb3JQcmltYXJpZXMpKSB7CisgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDb2xvclByaW1hcmllcywgYXNwZWN0cy5tUHJpbWFyaWVzKTsKKyAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVRyYW5zZmVyRnVuY3Rpb24sIGFzcGVjdHMubVRyYW5zZmVyKTsKKyAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUNvbG9yTWF0cml4LCBhc3BlY3RzLm1NYXRyaXhDb2VmZnMpOworICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Q29sb3JSYW5nZSwgYXNwZWN0cy5tUmFuZ2UpOworICAgICAgICB9CisgICAgfQorCisgICAgZGVsZXRlW10gYnVmZmVyOworICAgIGJ1ZmZlciA9IE5VTEw7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZTNHUFBNZXRhRGF0YShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUsIGludCBkZXB0aCkgeworICAgIGlmIChzaXplIDwgNCB8fCBzaXplID09IFNJWkVfTUFYKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgdWludDhfdCAqYnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQ4X3Rbc2l6ZSArIDFdOworICAgIGlmIChidWZmZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICBvZmZzZXQsIGJ1ZmZlciwgc2l6ZSkgIT0gKHNzaXplX3Qpc2l6ZSkgeworICAgICAgICBkZWxldGVbXSBidWZmZXI7CisgICAgICAgIGJ1ZmZlciA9IE5VTEw7CisKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKworICAgIHVpbnQzMl90IG1ldGFkYXRhS2V5ID0gMDsKKyAgICBzd2l0Y2ggKG1QYXRoW2RlcHRoXSkgeworICAgICAgICBjYXNlIEZPVVJDQygndCcsICdpJywgJ3QnLCAnbCcpOgorICAgICAgICB7CisgICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlUaXRsZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRk9VUkNDKCdwJywgJ2UnLCAncicsICdmJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleUFydGlzdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRk9VUkNDKCdhJywgJ3UnLCAndCcsICdoJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleVdyaXRlcjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRk9VUkNDKCdnJywgJ24nLCAncicsICdlJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleUdlbnJlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2EnLCAnbCcsICdiJywgJ20nKToKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJ1ZmZlcltzaXplIC0gMV0gIT0gJ1wwJykgeworICAgICAgICAgICAgICBjaGFyIHRtcFs0XTsKKyAgICAgICAgICAgICAgc3ByaW50Zih0bXAsICIldSIsIGJ1ZmZlcltzaXplIC0gMV0pOworCisgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhrS2V5Q0RUcmFja051bWJlciwgdG1wKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5QWxidW07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQygneScsICdyJywgJ3InLCAnYycpOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc2l6ZSA8IDYpIHsKKyAgICAgICAgICAgICAgICBkZWxldGVbXSBidWZmZXI7CisgICAgICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYi82MjEzMzIyNyIpOworICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNjIxMzMyMjciKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2hhciB0bXBbNV07CisgICAgICAgICAgICB1aW50MTZfdCB5ZWFyID0gVTE2X0FUKCZidWZmZXJbNF0pOworCisgICAgICAgICAgICBpZiAoeWVhciA8IDEwMDAwKSB7CisgICAgICAgICAgICAgICAgc3ByaW50Zih0bXAsICIldSIsIHllYXIpOworCisgICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKGtLZXlZZWFyLCB0bXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKG1ldGFkYXRhS2V5ID4gMCkgeworICAgICAgICBib29sIGlzVVRGOCA9IHRydWU7IC8vIENvbW1vbiBjYXNlCisgICAgICAgIGNoYXIxNl90ICpmcmFtZWRhdGEgPSBOVUxMOworICAgICAgICBpbnQgbGVuMTYgPSAwOyAvLyBOdW1iZXIgb2YgVVRGLTE2IGNoYXJhY3RlcnMKKworICAgICAgICAvLyBzbWFsbGVzdCBwb3NzaWJsZSB2YWxpZCBVVEYtMTYgc3RyaW5nIHcgQk9NOiAweGZlIDB4ZmYgMHgwMCAweDAwCisgICAgICAgIGlmIChzaXplIDwgNikgeworICAgICAgICAgICAgZGVsZXRlW10gYnVmZmVyOworICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2l6ZSAtIDYgPj0gNCkgeworICAgICAgICAgICAgbGVuMTYgPSAoKHNpemUgLSA2KSAvIDIpIC0gMTsgLy8gZG9uJ3QgaW5jbHVkZSAweDAwMDAgdGVybWluYXRvcgorICAgICAgICAgICAgZnJhbWVkYXRhID0gKGNoYXIxNl90ICopKGJ1ZmZlciArIDYpOworICAgICAgICAgICAgaWYgKDB4ZmZmZSA9PSAqZnJhbWVkYXRhKSB7CisgICAgICAgICAgICAgICAgLy8gZW5kaWFubmVzcyBtYXJrZXIgKEJPTSkgZG9lc24ndCBtYXRjaCBob3N0IGVuZGlhbm5lc3MKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjE2OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVkYXRhW2ldID0gYnN3YXBfMTYoZnJhbWVkYXRhW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gQk9NIGlzIG5vdyBzd2FwcGVkIHRvIDB4ZmVmZiwgd2Ugd2lsbCBleGVjdXRlIG5leHQgYmxvY2sgdG9vCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgweGZlZmYgPT0gKmZyYW1lZGF0YSkgeworICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgQk9NCisgICAgICAgICAgICAgICAgZnJhbWVkYXRhKys7CisgICAgICAgICAgICAgICAgbGVuMTYtLTsKKyAgICAgICAgICAgICAgICBpc1VURjggPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGVsc2Ugbm9ybWFsIG5vbi16ZXJvLWxlbmd0aCBVVEYtOCBzdHJpbmcKKyAgICAgICAgICAgIC8vIHdlIGNhbid0IGhhbmRsZSBVVEYtMTYgd2l0aG91dCBCT00gYXMgdGhlcmUgaXMgbm8gb3RoZXIKKyAgICAgICAgICAgIC8vIGluZGljYXRpb24gb2YgZW5jb2RpbmcuCisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNVVEY4KSB7CisgICAgICAgICAgICBidWZmZXJbc2l6ZV0gPSAwOworICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKG1ldGFkYXRhS2V5LCAoY29uc3QgY2hhciAqKWJ1ZmZlciArIDYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gQ29udmVydCBmcm9tIFVURi0xNiBzdHJpbmcgdG8gVVRGLTggc3RyaW5nLgorICAgICAgICAgICAgU3RyaW5nOCB0bXBVVEY4c3RyKGZyYW1lZGF0YSwgbGVuMTYpOworICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKG1ldGFkYXRhS2V5LCB0bXBVVEY4c3RyLnN0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGRlbGV0ZVtdIGJ1ZmZlcjsKKyAgICBidWZmZXIgPSBOVUxMOworCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIE1QRUc0RXh0cmFjdG9yOjpwYXJzZUlEM3YyTWV0YURhdGEob2ZmNjRfdCBvZmZzZXQpIHsKKyAgICBJRDMgaWQzKG1EYXRhU291cmNlLCB0cnVlIC8qIGlnbm9yZXYxICovLCBvZmZzZXQpOworCisgICAgaWYgKGlkMy5pc1ZhbGlkKCkpIHsKKyAgICAgICAgc3RydWN0IE1hcCB7CisgICAgICAgICAgICBpbnQga2V5OworICAgICAgICAgICAgY29uc3QgY2hhciAqdGFnMTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRhZzI7CisgICAgICAgIH07CisgICAgICAgIHN0YXRpYyBjb25zdCBNYXAga01hcFtdID0geworICAgICAgICAgICAgeyBrS2V5QWxidW0sICJUQUxCIiwgIlRBTCIgfSwKKyAgICAgICAgICAgIHsga0tleUFydGlzdCwgIlRQRTEiLCAiVFAxIiB9LAorICAgICAgICAgICAgeyBrS2V5QWxidW1BcnRpc3QsICJUUEUyIiwgIlRQMiIgfSwKKyAgICAgICAgICAgIHsga0tleUNvbXBvc2VyLCAiVENPTSIsICJUQ00iIH0sCisgICAgICAgICAgICB7IGtLZXlHZW5yZSwgIlRDT04iLCAiVENPIiB9LAorICAgICAgICAgICAgeyBrS2V5VGl0bGUsICJUSVQyIiwgIlRUMiIgfSwKKyAgICAgICAgICAgIHsga0tleVllYXIsICJUWUUiLCAiVFlFUiIgfSwKKyAgICAgICAgICAgIHsga0tleUF1dGhvciwgIlRYVCIsICJURVhUIiB9LAorICAgICAgICAgICAgeyBrS2V5Q0RUcmFja051bWJlciwgIlRSSyIsICJUUkNLIiB9LAorICAgICAgICAgICAgeyBrS2V5RGlzY051bWJlciwgIlRQQSIsICJUUE9TIiB9LAorICAgICAgICAgICAgeyBrS2V5Q29tcGlsYXRpb24sICJUQ1AiLCAiVENNUCIgfSwKKyAgICAgICAgfTsKKyAgICAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTnVtTWFwRW50cmllcyA9IHNpemVvZihrTWFwKSAvIHNpemVvZihrTWFwWzBdKTsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1NYXBFbnRyaWVzOyArK2kpIHsKKyAgICAgICAgICAgIGlmICghbUZpbGVNZXRhRGF0YS5oYXNEYXRhKGtNYXBbaV0ua2V5KSkgeworICAgICAgICAgICAgICAgIElEMzo6SXRlcmF0b3IgKml0ID0gbmV3IElEMzo6SXRlcmF0b3IoaWQzLCBrTWFwW2ldLnRhZzEpOworICAgICAgICAgICAgICAgIGlmIChpdC0+ZG9uZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBpdDsKKyAgICAgICAgICAgICAgICAgICAgaXQgPSBuZXcgSUQzOjpJdGVyYXRvcihpZDMsIGtNYXBbaV0udGFnMik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGl0LT5kb25lKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGl0OworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBTdHJpbmc4IHM7CisgICAgICAgICAgICAgICAgaXQtPmdldFN0cmluZygmcyk7CisgICAgICAgICAgICAgICAgZGVsZXRlIGl0OworCisgICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKGtNYXBbaV0ua2V5LCBzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBkYXRhU2l6ZTsKKyAgICAgICAgU3RyaW5nOCBtaW1lOworICAgICAgICBjb25zdCB2b2lkICpkYXRhID0gaWQzLmdldEFsYnVtQXJ0KCZkYXRhU2l6ZSwgJm1pbWUpOworCisgICAgICAgIGlmIChkYXRhKSB7CisgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldERhdGEoa0tleUFsYnVtQXJ0LCBNZXRhRGF0YTo6VFlQRV9OT05FLCBkYXRhLCBkYXRhU2l6ZSk7CisgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa0tleUFsYnVtQXJ0TUlNRSwgbWltZS5zdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK01lZGlhVHJhY2sgKk1QRUc0RXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgaWYgKChlcnIgPSByZWFkTWV0YURhdGEoKSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgVHJhY2sgKnRyYWNrID0gbUZpcnN0VHJhY2s7CisgICAgd2hpbGUgKGluZGV4ID4gMCkgeworICAgICAgICBpZiAodHJhY2sgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICB0cmFjayA9IHRyYWNrLT5uZXh0OworICAgICAgICAtLWluZGV4OworICAgIH0KKworICAgIGlmICh0cmFjayA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworCisgICAgVHJleCAqdHJleCA9IE5VTEw7CisgICAgaW50MzJfdCB0cmFja0lkOworICAgIGlmICh0cmFjay0+bWV0YS5maW5kSW50MzIoa0tleVRyYWNrSUQsICZ0cmFja0lkKSkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmV4LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBUcmV4ICp0ID0gJm1UcmV4LmVkaXRJdGVtQXQoaSk7CisgICAgICAgICAgICBpZiAodC0+dHJhY2tfSUQgPT0gKHVpbnQzMl90KSB0cmFja0lkKSB7CisgICAgICAgICAgICAgICAgdHJleCA9IHQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiYi8yMTY1Nzk1NyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBBTE9HVigiZ2V0VHJhY2sgY2FsbGVkLCBwc3NoOiAlenUiLCBtUHNzaC5zaXplKCkpOworCisgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICBpZiAoIXRyYWNrLT5tZXRhLmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNwPEl0ZW1UYWJsZT4gaXRlbVRhYmxlOworICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpKSB7CisgICAgICAgIHVpbnQzMl90IHR5cGU7CisgICAgICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgICAgIHNpemVfdCBzaXplOworICAgICAgICBpZiAoIXRyYWNrLT5tZXRhLmZpbmREYXRhKGtLZXlBVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCB1aW50OF90ICpwdHIgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7CisKKyAgICAgICAgaWYgKHNpemUgPCA3IHx8IHB0clswXSAhPSAxKSB7ICAvLyBjb25maWd1cmF0aW9uVmVyc2lvbiA9PSAxCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQykKKyAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQykpIHsKKyAgICAgICAgdWludDMyX3QgdHlwZTsKKyAgICAgICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgIGlmICghdHJhY2stPm1ldGEuZmluZERhdGEoa0tleUhWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9IChjb25zdCB1aW50OF90ICopZGF0YTsKKworICAgICAgICBpZiAoc2l6ZSA8IDIyIHx8IHB0clswXSAhPSAxKSB7ICAvLyBjb25maWd1cmF0aW9uVmVyc2lvbiA9PSAxCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDKSkgeworICAgICAgICAgICAgaXRlbVRhYmxlID0gbUl0ZW1UYWJsZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIE1QRUc0U291cmNlICpzb3VyY2UgPSAgbmV3IE1QRUc0U291cmNlKAorICAgICAgICAgICAgdHJhY2stPm1ldGEsIG1EYXRhU291cmNlLCB0cmFjay0+dGltZXNjYWxlLCB0cmFjay0+c2FtcGxlVGFibGUsCisgICAgICAgICAgICBtU2lkeEVudHJpZXMsIHRyZXgsIG1Nb29mT2Zmc2V0LCBpdGVtVGFibGUpOworICAgIGlmIChzb3VyY2UtPmluaXQoKSAhPSBPSykgeworICAgICAgICBkZWxldGUgc291cmNlOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHNvdXJjZTsKK30KKworLy8gc3RhdGljCitzdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6dmVyaWZ5VHJhY2soVHJhY2sgKnRyYWNrKSB7CisgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICBDSEVDSyh0cmFjay0+bWV0YS5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisKKyAgICB1aW50MzJfdCB0eXBlOworICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgc2l6ZV90IHNpemU7CisgICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQykpIHsKKyAgICAgICAgaWYgKCF0cmFjay0+bWV0YS5maW5kRGF0YShrS2V5QVZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkKKyAgICAgICAgICAgICAgICB8fCB0eXBlICE9IGtUeXBlQVZDQykgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQykpIHsKKyAgICAgICAgaWYgKCF0cmFjay0+bWV0YS5maW5kRGF0YShrS2V5SFZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgfHwgdHlwZSAhPSBrVHlwZUhWQ0MpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KQorICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzIpCisgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpKSB7CisgICAgICAgIGlmICghdHJhY2stPm1ldGEuZmluZERhdGEoa0tleUVTRFMsICZ0eXBlLCAmZGF0YSwgJnNpemUpCisgICAgICAgICAgICAgICAgfHwgdHlwZSAhPSBrVHlwZUVTRFMpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodHJhY2stPnNhbXBsZVRhYmxlID09IE5VTEwgfHwgIXRyYWNrLT5zYW1wbGVUYWJsZS0+aXNWYWxpZCgpKSB7CisgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIGFsbCB0aGUgbWV0YWRhdGEgd2UgbmVlZC4KKyAgICAgICAgQUxPR0UoInN0YmwgYXRvbSBtaXNzaW5nL2ludmFsaWQuIik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgaWYgKHRyYWNrLT50aW1lc2NhbGUgPT0gMCkgeworICAgICAgICBBTE9HRSgidGltZXNjYWxlIGludmFsaWQuIik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCit0eXBlZGVmIGVudW0geworICAgIC8vQU9UX05PTkUgICAgICAgICAgICAgPSAtMSwKKyAgICAvL0FPVF9OVUxMX09CSkVDVCAgICAgID0gMCwKKyAgICAvL0FPVF9BQUNfTUFJTiAgICAgICAgID0gMSwgLyoqPCBNYWluIHByb2ZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIEFPVF9BQUNfTEMgICAgICAgICAgID0gMiwgICAvKio8IExvdyBDb21wbGV4aXR5IG9iamVjdCAgICAgICAgICAgICAgICAgICAgICovCisgICAgLy9BT1RfQUFDX1NTUiAgICAgICAgICA9IDMsCisgICAgLy9BT1RfQUFDX0xUUCAgICAgICAgICA9IDQsCisgICAgQU9UX1NCUiAgICAgICAgICAgICAgPSA1LAorICAgIC8vQU9UX0FBQ19TQ0FMICAgICAgICAgPSA2LAorICAgIC8vQU9UX1RXSU5fVlEgICAgICAgICAgPSA3LAorICAgIC8vQU9UX0NFTFAgICAgICAgICAgICAgPSA4LAorICAgIC8vQU9UX0hWWEMgICAgICAgICAgICAgPSA5LAorICAgIC8vQU9UX1JTVkRfMTAgICAgICAgICAgPSAxMCwgLyoqPCAocmVzZXJ2ZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8vQU9UX1JTVkRfMTEgICAgICAgICAgPSAxMSwgLyoqPCAocmVzZXJ2ZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8vQU9UX1RUU0kgICAgICAgICAgICAgPSAxMiwgLyoqPCBUVFNJIE9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8vQU9UX01BSU5fU1lOVEggICAgICAgPSAxMywgLyoqPCBNYWluIFN5bnRoZXRpYyBvYmplY3QgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8vQU9UX1dBVl9UQUJfU1lOVEggICAgPSAxNCwgLyoqPCBXYXZldGFibGUgU3ludGhlc2lzIG9iamVjdCAgICAgICAgICAgICAgICAqLworICAgIC8vQU9UX0dFTl9NSURJICAgICAgICAgPSAxNSwgLyoqPCBHZW5lcmFsIE1JREkgb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8vQU9UX0FMR19TWU5USF9BVURfRlggPSAxNiwgLyoqPCBBbGdvcml0aG1pYyBTeW50aGVzaXMgYW5kIEF1ZGlvIEZYIG9iamVjdCAqLworICAgIEFPVF9FUl9BQUNfTEMgICAgICAgID0gMTcsICAgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIEFBQyBMb3cgQ29tcGxleGl0eSAgICAqLworICAgIC8vQU9UX1JTVkRfMTggICAgICAgICAgPSAxOCwgLyoqPCAocmVzZXJ2ZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8vQU9UX0VSX0FBQ19MVFAgICAgICAgPSAxOSwgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIEFBQyBMVFAgb2JqZWN0ICAgICAgICAqLworICAgIEFPVF9FUl9BQUNfU0NBTCAgICAgID0gMjAsICAgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIEFBQyBTY2FsYWJsZSBvYmplY3QgICAqLworICAgIC8vQU9UX0VSX1RXSU5fVlEgICAgICAgPSAyMSwgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIFR3aW5WUSBvYmplY3QgICAgICAgICAqLworICAgIEFPVF9FUl9CU0FDICAgICAgICAgID0gMjIsICAgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIEJTQUMgb2JqZWN0ICAgICAgICAgICAqLworICAgIEFPVF9FUl9BQUNfTEQgICAgICAgID0gMjMsICAgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIEFBQyBMb3dEZWxheSBvYmplY3QgICAqLworICAgIC8vQU9UX0VSX0NFTFAgICAgICAgICAgPSAyNCwgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIENFTFAgb2JqZWN0ICAgICAgICAgICAqLworICAgIC8vQU9UX0VSX0hWWEMgICAgICAgICAgPSAyNSwgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIEhWWEMgb2JqZWN0ICAgICAgICAgICAqLworICAgIC8vQU9UX0VSX0hJTE4gICAgICAgICAgPSAyNiwgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIEhJTE4gb2JqZWN0ICAgICAgICAgICAqLworICAgIC8vQU9UX0VSX1BBUkEgICAgICAgICAgPSAyNywgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIFBhcmFtZXRyaWMgb2JqZWN0ICAgICAqLworICAgIC8vQU9UX1JTVkRfMjggICAgICAgICAgPSAyOCwgLyoqPCBtaWdodCBiZWNvbWUgU1NDICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIEFPVF9QUyAgICAgICAgICAgICAgID0gMjksICAgLyoqPCBQUywgUGFyYW1ldHJpYyBTdGVyZW8gKGluY2x1ZGVzIFNCUikgICAgICAqLworICAgIC8vQU9UX01QRUdTICAgICAgICAgICAgPSAzMCwgLyoqPCBNUEVHIFN1cnJvdW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgQU9UX0VTQ0FQRSAgICAgICAgICAgPSAzMSwgICAvKio8IFNpZ25hbCBBT1QgdXNlcyBtb3JlIHRoYW4gNSBiaXRzICAgICAgICAgICovCisKKyAgICAvL0FPVF9NUDNPTk1QNF9MMSAgICAgID0gMzIsIC8qKjwgTVBFRy1MYXllcjEgaW4gbXA0ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9NUDNPTk1QNF9MMiAgICAgID0gMzMsIC8qKjwgTVBFRy1MYXllcjIgaW4gbXA0ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9NUDNPTk1QNF9MMyAgICAgID0gMzQsIC8qKjwgTVBFRy1MYXllcjMgaW4gbXA0ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9SU1ZEXzM1ICAgICAgICAgID0gMzUsIC8qKjwgbWlnaHQgYmVjb21lIERTVCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9SU1ZEXzM2ICAgICAgICAgID0gMzYsIC8qKjwgbWlnaHQgYmVjb21lIEFMUyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9BQUNfU0xTICAgICAgICAgID0gMzcsIC8qKjwgQUFDICsgU0xTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9TTFMgICAgICAgICAgICAgID0gMzgsIC8qKjwgU0xTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9FUl9BQUNfRUxEICAgICAgID0gMzksIC8qKjwgQUFDIEVuaGFuY2VkIExvdyBEZWxheSAgICAgICAgICAgICAgICAgICAgKi8KKworICAgIC8vQU9UX1VTQUMgICAgICAgICAgICAgPSA0MiwgLyoqPCBVU0FDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8vQU9UX1NBT0MgICAgICAgICAgICAgPSA0MywgLyoqPCBTQU9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8vQU9UX0xEX01QRUdTICAgICAgICAgPSA0NCwgLyoqPCBMb3cgRGVsYXkgTVBFRyBTdXJyb3VuZCAgICAgICAgICAgICAgICAgICAqLworCisgICAgLy9BT1RfUlNWRDUwICAgICAgICAgICA9IDUwLCAgLyoqPCBJbnRlcmltIEFPVCBmb3IgUnN2ZDUwICAgICAgICAgICAgICAgICAgICovCit9IEFVRElPX09CSkVDVF9UWVBFOworCitzdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6dXBkYXRlQXVkaW9UcmFja0luZm9Gcm9tRVNEU19NUEVHNEF1ZGlvKAorICAgICAgICBjb25zdCB2b2lkICplc2RzX2RhdGEsIHNpemVfdCBlc2RzX3NpemUpIHsKKyAgICBFU0RTIGVzZHMoZXNkc19kYXRhLCBlc2RzX3NpemUpOworCisgICAgdWludDhfdCBvYmplY3RUeXBlSW5kaWNhdGlvbjsKKyAgICBpZiAoZXNkcy5nZXRPYmplY3RUeXBlSW5kaWNhdGlvbigmb2JqZWN0VHlwZUluZGljYXRpb24pICE9IE9LKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgaWYgKG9iamVjdFR5cGVJbmRpY2F0aW9uID09IDB4ZTEpIHsKKyAgICAgICAgLy8gVGhpcyBpc24ndCBNUEVHNCBhdWRpbyBhdCBhbGwsIGl0J3MgUUNFTFAgMTRrLi4uCisgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworCisgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX1FDRUxQKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGlmIChvYmplY3RUeXBlSW5kaWNhdGlvbiAgPT0gMHg2YikgeworICAgICAgICAvLyBUaGUgbWVkaWEgc3VidHlwZSBpcyBNUDMgYXVkaW8KKyAgICAgICAgLy8gT3VyIHNvZnR3YXJlIE1QMyBhdWRpbyBkZWNvZGVyIG1heSBub3QgYmUgYWJsZSB0byBoYW5kbGUKKyAgICAgICAgLy8gcGFja2V0aXplZCBNUDMgYXVkaW87IGZvciBub3csIGxldHMganVzdCByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQKKyAgICAgICAgQUxPR0UoIk1QMyB0cmFjayBpbiBNUDQvM0dQUCBmaWxlIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIGlmIChtTGFzdFRyYWNrICE9IE5VTEwpIHsKKyAgICAgICAgdWludDMyX3QgbWF4Qml0cmF0ZSA9IDA7CisgICAgICAgIHVpbnQzMl90IGF2Z0JpdHJhdGUgPSAwOworICAgICAgICBlc2RzLmdldEJpdFJhdGUoJm1heEJpdHJhdGUsICZhdmdCaXRyYXRlKTsKKyAgICAgICAgaWYgKG1heEJpdHJhdGUgPiAwICYmIG1heEJpdHJhdGUgPCBJTlQzMl9NQVgpIHsKKyAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleU1heEJpdFJhdGUsIChpbnQzMl90KW1heEJpdHJhdGUpOworICAgICAgICB9CisgICAgICAgIGlmIChhdmdCaXRyYXRlID4gMCAmJiBhdmdCaXRyYXRlIDwgSU5UMzJfTUFYKSB7CisgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlCaXRSYXRlLCAoaW50MzJfdClhdmdCaXRyYXRlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbnN0IHVpbnQ4X3QgKmNzZDsKKyAgICBzaXplX3QgY3NkX3NpemU7CisgICAgaWYgKGVzZHMuZ2V0Q29kZWNTcGVjaWZpY0luZm8oCisgICAgICAgICAgICAgICAgKGNvbnN0IHZvaWQgKiopJmNzZCwgJmNzZF9zaXplKSAhPSBPSykgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIGlmIChrVXNlSGV4RHVtcCkgeworICAgICAgICBwcmludGYoIkVTRCBvZiBzaXplICV6dVxuIiwgY3NkX3NpemUpOworICAgICAgICBoZXhkdW1wKGNzZCwgY3NkX3NpemUpOworICAgIH0KKworICAgIGlmIChjc2Rfc2l6ZSA9PSAwKSB7CisgICAgICAgIC8vIFRoZXJlJ3Mgbm8gZnVydGhlciBpbmZvcm1hdGlvbiwgaS5lLiBubyBjb2RlYyBzcGVjaWZpYyBkYXRhCisgICAgICAgIC8vIExldCdzIGFzc3VtZSB0aGF0IHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBpbiB0aGUgbXBlZzQgaGVhZGVycworICAgICAgICAvLyBpcyBhY2N1cmF0ZSBhbmQgaG9wZSBmb3IgdGhlIGJlc3QuCisKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGlmIChjc2Rfc2l6ZSA8IDIpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBzdGF0aWMgdWludDMyX3Qga1NhbXBsaW5nUmF0ZVtdID0geworICAgICAgICA5NjAwMCwgODgyMDAsIDY0MDAwLCA0ODAwMCwgNDQxMDAsIDMyMDAwLCAyNDAwMCwgMjIwNTAsCisgICAgICAgIDE2MDAwLCAxMjAwMCwgMTEwMjUsIDgwMDAsIDczNTAKKyAgICB9OworCisgICAgQUJpdFJlYWRlciBicihjc2QsIGNzZF9zaXplKTsKKyAgICB1aW50MzJfdCBvYmplY3RUeXBlID0gYnIuZ2V0Qml0cyg1KTsKKworICAgIGlmIChvYmplY3RUeXBlID09IDMxKSB7ICAvLyBBQUMtRUxEID0+IGFkZGl0aW9uYWwgNiBiaXRzCisgICAgICAgIG9iamVjdFR5cGUgPSAzMiArIGJyLmdldEJpdHMoNik7CisgICAgfQorCisgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKworICAgIC8va2VlcCBBT1QgdHlwZQorICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUFBQ0FPVCwgb2JqZWN0VHlwZSk7CisKKyAgICB1aW50MzJfdCBmcmVxSW5kZXggPSBici5nZXRCaXRzKDQpOworCisgICAgaW50MzJfdCBzYW1wbGVSYXRlID0gMDsKKyAgICBpbnQzMl90IG51bUNoYW5uZWxzID0gMDsKKyAgICBpZiAoZnJlcUluZGV4ID09IDE1KSB7CisgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgMjgpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHNhbXBsZVJhdGUgPSBici5nZXRCaXRzKDI0KTsKKyAgICAgICAgbnVtQ2hhbm5lbHMgPSBici5nZXRCaXRzKDQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgNCkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgbnVtQ2hhbm5lbHMgPSBici5nZXRCaXRzKDQpOworCisgICAgICAgIGlmIChmcmVxSW5kZXggPT0gMTMgfHwgZnJlcUluZGV4ID09IDE0KSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKKyAgICAgICAgc2FtcGxlUmF0ZSA9IGtTYW1wbGluZ1JhdGVbZnJlcUluZGV4XTsKKyAgICB9CisKKyAgICBpZiAob2JqZWN0VHlwZSA9PSBBT1RfU0JSIHx8IG9iamVjdFR5cGUgPT0gQU9UX1BTKSB7Ly9TQlIgc3BlY2lmaWMgY29uZmlnIHBlciAxNDQ5Ni0zIHRhYmxlIDEuMTMKKyAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA0KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB1aW50MzJfdCBleHRGcmVxSW5kZXggPSBici5nZXRCaXRzKDQpOworICAgICAgICBpbnQzMl90IGV4dFNhbXBsZVJhdGUgX191bnVzZWQ7CisgICAgICAgIGlmIChleHRGcmVxSW5kZXggPT0gMTUpIHsKKyAgICAgICAgICAgIGlmIChjc2Rfc2l6ZSA8IDgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCAyNCkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIGV4dFNhbXBsZVJhdGUgPSBici5nZXRCaXRzKDI0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChleHRGcmVxSW5kZXggPT0gMTMgfHwgZXh0RnJlcUluZGV4ID09IDE0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGV4dFNhbXBsZVJhdGUgPSBrU2FtcGxpbmdSYXRlW2V4dEZyZXFJbmRleF07CisgICAgICAgIH0KKyAgICAgICAgLy9UT0RPOiBzYXZlIHRoZSBleHRlbnNpb24gc2FtcGxpbmcgcmF0ZSB2YWx1ZSBpbiBtZXRhIGRhdGEgPT4KKyAgICAgICAgLy8gICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlFeHRTYW1wbGVSYXRlLCBleHRTYW1wbGVSYXRlKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG51bUNoYW5uZWxzKSB7CisgICAgICAgIC8vIHZhbHVlcyBkZWZpbmVkIGluIDE0NDk2LTNfMjAwOSBhbWVuZG1lbnQtNCBUYWJsZSAxLjE5IC0gQ2hhbm5lbCBDb25maWd1cmF0aW9uCisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgY2FzZSAxOi8vIEZDCisgICAgICAgIGNhc2UgMjovLyBGTCBGUgorICAgICAgICBjYXNlIDM6Ly8gRkMsIEZMIEZSCisgICAgICAgIGNhc2UgNDovLyBGQywgRkwgRlIsIFJDCisgICAgICAgIGNhc2UgNTovLyBGQywgRkwgRlIsIFNMIFNSCisgICAgICAgIGNhc2UgNjovLyBGQywgRkwgRlIsIFNMIFNSLCBMRkUKKyAgICAgICAgICAgIC8vbnVtQ2hhbm5lbHMgYWxyZWFkeSBjb250YWlucyB0aGUgcmlnaHQgdmFsdWUKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDExOi8vIEZDLCBGTCBGUiwgU0wgU1IsIFJDLCBMRkUKKyAgICAgICAgICAgIG51bUNoYW5uZWxzID0gNzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDc6IC8vIEZDLCBGQ0wgRkNSLCBGTCBGUiwgU0wgU1IsIExGRQorICAgICAgICBjYXNlIDEyOi8vIEZDLCBGTCAgRlIsICBTTCBTUiwgUkwgUlIsIExGRQorICAgICAgICBjYXNlIDE0Oi8vIEZDLCBGTCAgRlIsICBTTCBTUiwgTEZFLCBGSEwgRkhSCisgICAgICAgICAgICBudW1DaGFubmVscyA9IDg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIGlmIChvYmplY3RUeXBlID09IEFPVF9TQlIgfHwgb2JqZWN0VHlwZSA9PSBBT1RfUFMpIHsKKyAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgNSkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIG9iamVjdFR5cGUgPSBici5nZXRCaXRzKDUpOworCisgICAgICAgICAgICBpZiAob2JqZWN0VHlwZSA9PSBBT1RfRVNDQVBFKSB7CisgICAgICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA2KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIG9iamVjdFR5cGUgPSAzMiArIGJyLmdldEJpdHMoNik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9iamVjdFR5cGUgPT0gQU9UX0FBQ19MQyB8fCBvYmplY3RUeXBlID09IEFPVF9FUl9BQUNfTEMgfHwKKyAgICAgICAgICAgICAgICBvYmplY3RUeXBlID09IEFPVF9FUl9BQUNfTEQgfHwgb2JqZWN0VHlwZSA9PSBBT1RfRVJfQUFDX1NDQUwgfHwKKyAgICAgICAgICAgICAgICBvYmplY3RUeXBlID09IEFPVF9FUl9CU0FDKSB7CisgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDIpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICBjb25zdCBpbnQzMl90IGZyYW1lTGVuZ3RoRmxhZyBfX3VudXNlZCA9IGJyLmdldEJpdHMoMSk7CisKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZGVwZW5kc09uQ29yZUNvZGVyID0gYnIuZ2V0Qml0cygxKTsKKworICAgICAgICAgICAgaWYgKGRlcGVuZHNPbkNvcmVDb2RlciApIHsKKyAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDE0KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgY29yZUNvZGVyRGVsYXkgX191bnVzZWQgPSBici5nZXRCaXRzKDE0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50MzJfdCBleHRlbnNpb25GbGFnID0gLTE7CisgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBleHRlbnNpb25GbGFnID0gYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChvYmplY3RUeXBlKSB7CisgICAgICAgICAgICAgICAgLy8gMTQ0OTYtMyA0LjUuMS4xIGV4dGVuc2lvbkZsYWcKKyAgICAgICAgICAgICAgICBjYXNlIEFPVF9BQUNfTEM6CisgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbkZsYWcgPSAwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEFPVF9FUl9BQUNfTEM6CisgICAgICAgICAgICAgICAgY2FzZSBBT1RfRVJfQUFDX1NDQUw6CisgICAgICAgICAgICAgICAgY2FzZSBBT1RfRVJfQlNBQzoKKyAgICAgICAgICAgICAgICBjYXNlIEFPVF9FUl9BQUNfTEQ6CisgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbkZsYWcgPSAxOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1coImNzZCBtaXNzaW5nIGV4dGVuc2lvbiBmbGFnOyBhc3N1bWluZyAlZCBmb3Igb2JqZWN0IHR5cGUgJXUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbkZsYWcsIG9iamVjdFR5cGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobnVtQ2hhbm5lbHMgPT0gMCkgeworICAgICAgICAgICAgICAgIGludDMyX3QgY2hhbm5lbHNFZmZlY3RpdmVOdW0gPSAwOworICAgICAgICAgICAgICAgIGludDMyX3QgY2hhbm5lbHNOdW0gPSAwOworICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgMzIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBFbGVtZW50SW5zdGFuY2VUYWcgX191bnVzZWQgPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgUHJvZmlsZSBfX3VudXNlZCA9IGJyLmdldEJpdHMoMik7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBTYW1wbGluZ0ZyZXF1ZW5jeUluZGV4IF9fdW51c2VkID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE51bUZyb250Q2hhbm5lbEVsZW1lbnRzID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE51bVNpZGVDaGFubmVsRWxlbWVudHMgPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTnVtQmFja0NoYW5uZWxFbGVtZW50cyA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBOdW1MZmVDaGFubmVsRWxlbWVudHMgPSBici5nZXRCaXRzKDIpOworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTnVtQXNzb2NEYXRhRWxlbWVudHMgX191bnVzZWQgPSBici5nZXRCaXRzKDMpOworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTnVtVmFsaWRDY0VsZW1lbnRzIF9fdW51c2VkID0gYnIuZ2V0Qml0cyg0KTsKKworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTW9ub01peGRvd25QcmVzZW50ID0gYnIuZ2V0Qml0cygxKTsKKworICAgICAgICAgICAgICAgIGlmIChNb25vTWl4ZG93blByZXNlbnQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDQpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTW9ub01peGRvd25FbGVtZW50TnVtYmVyIF9fdW51c2VkID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDEpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBTdGVyZW9NaXhkb3duUHJlc2VudCA9IGJyLmdldEJpdHMoMSk7CisgICAgICAgICAgICAgICAgaWYgKFN0ZXJlb01peGRvd25QcmVzZW50ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA0KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFN0ZXJlb01peGRvd25FbGVtZW50TnVtYmVyIF9fdW51c2VkID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDEpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBNYXRyaXhNaXhkb3duSW5kZXhQcmVzZW50ID0gYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgICAgICAgICBpZiAoTWF0cml4TWl4ZG93bkluZGV4UHJlc2VudCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgMykgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBNYXRyaXhNaXhkb3duSW5kZXggX191bnVzZWQgPSBici5nZXRCaXRzKDIpOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFBzZXVkb1N1cnJvdW5kRW5hYmxlIF9fdW51c2VkID0gYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IE51bUZyb250Q2hhbm5lbEVsZW1lbnRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA1KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IEZyb250RWxlbWVudElzQ3BlID0gYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBGcm9udEVsZW1lbnRUYWdTZWxlY3QgX191bnVzZWQgPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgICAgICBjaGFubmVsc051bSArPSBGcm9udEVsZW1lbnRJc0NwZSA/IDIgOiAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgTnVtU2lkZUNoYW5uZWxFbGVtZW50czsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgNSkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBTaWRlRWxlbWVudElzQ3BlID0gYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBTaWRlRWxlbWVudFRhZ1NlbGVjdCBfX3VudXNlZCA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzTnVtICs9IFNpZGVFbGVtZW50SXNDcGUgPyAyIDogMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IE51bUJhY2tDaGFubmVsRWxlbWVudHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDUpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgQmFja0VsZW1lbnRJc0NwZSA9IGJyLmdldEJpdHMoMSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgQmFja0VsZW1lbnRUYWdTZWxlY3QgX191bnVzZWQgPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgICAgICBjaGFubmVsc051bSArPSBCYWNrRWxlbWVudElzQ3BlID8gMiA6IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNoYW5uZWxzRWZmZWN0aXZlTnVtID0gY2hhbm5lbHNOdW07CisKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IE51bUxmZUNoYW5uZWxFbGVtZW50czsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgNCkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBMZmVFbGVtZW50VGFnU2VsZWN0IF9fdW51c2VkID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHNOdW0gKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1YoIm1wZWc0IGF1ZGlvIGNoYW5uZWxzTnVtID0gJWQiLCBjaGFubmVsc051bSk7CisgICAgICAgICAgICAgICAgQUxPR1YoIm1wZWc0IGF1ZGlvIGNoYW5uZWxzRWZmZWN0aXZlTnVtID0gJWQiLCBjaGFubmVsc0VmZmVjdGl2ZU51bSk7CisgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMgPSBjaGFubmVsc051bTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChudW1DaGFubmVscyA9PSAwKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQorICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworCisgICAgaW50MzJfdCBwcmV2U2FtcGxlUmF0ZTsKKyAgICBDSEVDSyhtTGFzdFRyYWNrLT5tZXRhLmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnByZXZTYW1wbGVSYXRlKSk7CisKKyAgICBpZiAocHJldlNhbXBsZVJhdGUgIT0gc2FtcGxlUmF0ZSkgeworICAgICAgICBBTE9HVigibXBlZzQgYXVkaW8gc2FtcGxlIHJhdGUgZGlmZmVyZW50IGZyb20gcHJldmlvdXMgc2V0dGluZy4gIgorICAgICAgICAgICAgICJ3YXM6ICVkLCBub3c6ICVkIiwgcHJldlNhbXBsZVJhdGUsIHNhbXBsZVJhdGUpOworICAgIH0KKworICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsZVJhdGUpOworCisgICAgaW50MzJfdCBwcmV2Q2hhbm5lbENvdW50OworICAgIENIRUNLKG1MYXN0VHJhY2stPm1ldGEuZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZwcmV2Q2hhbm5lbENvdW50KSk7CisKKyAgICBpZiAocHJldkNoYW5uZWxDb3VudCAhPSBudW1DaGFubmVscykgeworICAgICAgICBBTE9HVigibXBlZzQgYXVkaW8gY2hhbm5lbCBjb3VudCBkaWZmZXJlbnQgZnJvbSBwcmV2aW91cyBzZXR0aW5nLiAiCisgICAgICAgICAgICAgIndhczogJWQsIG5vdzogJWQiLCBwcmV2Q2hhbm5lbENvdW50LCBudW1DaGFubmVscyk7CisgICAgfQorCisgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBudW1DaGFubmVscyk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK01QRUc0U291cmNlOjpNUEVHNFNvdXJjZSgKKyAgICAgICAgTWV0YURhdGFCYXNlICZmb3JtYXQsCisgICAgICAgIERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlLAorICAgICAgICBpbnQzMl90IHRpbWVTY2FsZSwKKyAgICAgICAgY29uc3Qgc3A8U2FtcGxlVGFibGU+ICZzYW1wbGVUYWJsZSwKKyAgICAgICAgVmVjdG9yPFNpZHhFbnRyeT4gJnNpZHgsCisgICAgICAgIGNvbnN0IFRyZXggKnRyZXgsCisgICAgICAgIG9mZjY0X3QgZmlyc3RNb29mT2Zmc2V0LAorICAgICAgICBjb25zdCBzcDxJdGVtVGFibGU+ICZpdGVtVGFibGUpCisgICAgOiBtRm9ybWF0KGZvcm1hdCksCisgICAgICBtRGF0YVNvdXJjZShkYXRhU291cmNlKSwKKyAgICAgIG1UaW1lc2NhbGUodGltZVNjYWxlKSwKKyAgICAgIG1TYW1wbGVUYWJsZShzYW1wbGVUYWJsZSksCisgICAgICBtQ3VycmVudFNhbXBsZUluZGV4KDApLAorICAgICAgbUN1cnJlbnRGcmFnbWVudEluZGV4KDApLAorICAgICAgbVNlZ21lbnRzKHNpZHgpLAorICAgICAgbVRyZXgodHJleCksCisgICAgICBtRmlyc3RNb29mT2Zmc2V0KGZpcnN0TW9vZk9mZnNldCksCisgICAgICBtQ3VycmVudE1vb2ZPZmZzZXQoZmlyc3RNb29mT2Zmc2V0KSwKKyAgICAgIG1OZXh0TW9vZk9mZnNldCgtMSksCisgICAgICBtQ3VycmVudFRpbWUoMCksCisgICAgICBtRGVmYXVsdEVuY3J5cHRlZEJ5dGVCbG9jaygwKSwKKyAgICAgIG1EZWZhdWx0U2tpcEJ5dGVCbG9jaygwKSwKKyAgICAgIG1DdXJyZW50U2FtcGxlSW5mb0FsbG9jU2l6ZSgwKSwKKyAgICAgIG1DdXJyZW50U2FtcGxlSW5mb1NpemVzKE5VTEwpLAorICAgICAgbUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0c0FsbG9jU2l6ZSgwKSwKKyAgICAgIG1DdXJyZW50U2FtcGxlSW5mb09mZnNldHMoTlVMTCksCisgICAgICBtSXNBVkMoZmFsc2UpLAorICAgICAgbUlzSEVWQyhmYWxzZSksCisgICAgICBtTkFMTGVuZ3RoU2l6ZSgwKSwKKyAgICAgIG1TdGFydGVkKGZhbHNlKSwKKyAgICAgIG1Hcm91cChOVUxMKSwKKyAgICAgIG1CdWZmZXIoTlVMTCksCisgICAgICBtV2FudHNOQUxGcmFnbWVudHMoZmFsc2UpLAorICAgICAgbVNyY0J1ZmZlcihOVUxMKSwKKyAgICAgIG1Jc0hlaWYoaXRlbVRhYmxlICE9IE5VTEwpLAorICAgICAgbUl0ZW1UYWJsZShpdGVtVGFibGUpIHsKKworICAgIG1lbXNldCgmbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLCAwLCBzaXplb2YobVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvKSk7CisKKyAgICBtRm9ybWF0LmZpbmRJbnQzMihrS2V5Q3J5cHRvTW9kZSwgJm1DcnlwdG9Nb2RlKTsKKyAgICBtRGVmYXVsdElWU2l6ZSA9IDA7CisgICAgbUZvcm1hdC5maW5kSW50MzIoa0tleUNyeXB0b0RlZmF1bHRJVlNpemUsICZtRGVmYXVsdElWU2l6ZSk7CisgICAgdWludDMyX3Qga2V5dHlwZTsKKyAgICBjb25zdCB2b2lkICprZXk7CisgICAgc2l6ZV90IGtleXNpemU7CisgICAgaWYgKG1Gb3JtYXQuZmluZERhdGEoa0tleUNyeXB0b0tleSwgJmtleXR5cGUsICZrZXksICZrZXlzaXplKSkgeworICAgICAgICBDSEVDSyhrZXlzaXplIDw9IDE2KTsKKyAgICAgICAgbWVtc2V0KG1DcnlwdG9LZXksIDAsIDE2KTsKKyAgICAgICAgbWVtY3B5KG1DcnlwdG9LZXksIGtleSwga2V5c2l6ZSk7CisgICAgfQorCisgICAgbUZvcm1hdC5maW5kSW50MzIoa0tleUVuY3J5cHRlZEJ5dGVCbG9jaywgJm1EZWZhdWx0RW5jcnlwdGVkQnl0ZUJsb2NrKTsKKyAgICBtRm9ybWF0LmZpbmRJbnQzMihrS2V5U2tpcEJ5dGVCbG9jaywgJm1EZWZhdWx0U2tpcEJ5dGVCbG9jayk7CisKKyAgICBjb25zdCBjaGFyICptaW1lOworICAgIGJvb2wgc3VjY2VzcyA9IG1Gb3JtYXQuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSk7CisgICAgQ0hFQ0soc3VjY2Vzcyk7CisKKyAgICBtSXNBVkMgPSAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOworICAgIG1Jc0hFVkMgPSAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKSB8fAorICAgICAgICAgICAgICAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpOworCisgICAgaWYgKG1Jc0FWQykgeworICAgICAgICB1aW50MzJfdCB0eXBlOworICAgICAgICBjb25zdCB2b2lkICpkYXRhOworICAgICAgICBzaXplX3Qgc2l6ZTsKKyAgICAgICAgQ0hFQ0soZm9ybWF0LmZpbmREYXRhKGtLZXlBVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSk7CisKKyAgICAgICAgY29uc3QgdWludDhfdCAqcHRyID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhOworCisgICAgICAgIENIRUNLKHNpemUgPj0gNyk7CisgICAgICAgIENIRUNLX0VRKCh1bnNpZ25lZClwdHJbMF0sIDF1KTsgIC8vIGNvbmZpZ3VyYXRpb25WZXJzaW9uID09IDEKKworICAgICAgICAvLyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHVzZWQgdG8gZW5jb2RlIHRoZSBsZW5ndGggb2YgYSBOQUwgdW5pdC4KKyAgICAgICAgbU5BTExlbmd0aFNpemUgPSAxICsgKHB0cls0XSAmIDMpOworICAgIH0gZWxzZSBpZiAobUlzSEVWQykgeworICAgICAgICB1aW50MzJfdCB0eXBlOworICAgICAgICBjb25zdCB2b2lkICpkYXRhOworICAgICAgICBzaXplX3Qgc2l6ZTsKKyAgICAgICAgQ0hFQ0soZm9ybWF0LmZpbmREYXRhKGtLZXlIVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSk7CisKKyAgICAgICAgY29uc3QgdWludDhfdCAqcHRyID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhOworCisgICAgICAgIENIRUNLKHNpemUgPj0gMjIpOworICAgICAgICBDSEVDS19FUSgodW5zaWduZWQpcHRyWzBdLCAxdSk7ICAvLyBjb25maWd1cmF0aW9uVmVyc2lvbiA9PSAxCisKKyAgICAgICAgbU5BTExlbmd0aFNpemUgPSAxICsgKHB0clsxNCArIDddICYgMyk7CisgICAgfQorCisgICAgQ0hFQ0soZm9ybWF0LmZpbmRJbnQzMihrS2V5VHJhY2tJRCwgJm1UcmFja0lkKSk7CisKK30KKworc3RhdHVzX3QgTVBFRzRTb3VyY2U6OmluaXQoKSB7CisgICAgaWYgKG1GaXJzdE1vb2ZPZmZzZXQgIT0gMCkgeworICAgICAgICBvZmY2NF90IG9mZnNldCA9IG1GaXJzdE1vb2ZPZmZzZXQ7CisgICAgICAgIHJldHVybiBwYXJzZUNodW5rKCZvZmZzZXQpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK01QRUc0U291cmNlOjp+TVBFRzRTb3VyY2UoKSB7CisgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIHN0b3AoKTsKKyAgICB9CisgICAgZnJlZShtQ3VycmVudFNhbXBsZUluZm9TaXplcyk7CisgICAgZnJlZShtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRzKTsKK30KKworc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIENIRUNLKCFtU3RhcnRlZCk7CisKKyAgICBpbnQzMl90IHZhbDsKKyAgICBpZiAocGFyYW1zICYmIHBhcmFtcy0+ZmluZEludDMyKGtLZXlXYW50c05BTEZyYWdtZW50cywgJnZhbCkKKyAgICAgICAgJiYgdmFsICE9IDApIHsKKyAgICAgICAgbVdhbnRzTkFMRnJhZ21lbnRzID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBtV2FudHNOQUxGcmFnbWVudHMgPSBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQzMl90IHRtcDsKKyAgICBDSEVDSyhtRm9ybWF0LmZpbmRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCAmdG1wKSk7CisgICAgc2l6ZV90IG1heF9zaXplID0gdG1wOworCisgICAgLy8gQSBzb21ld2hhdCBhcmJpdHJhcnkgbGltaXQgdGhhdCBzaG91bGQgYmUgc3VmZmljaWVudCBmb3IgOGsgdmlkZW8gZnJhbWVzCisgICAgLy8gSWYgeW91IHNlZSB0aGUgbWVzc2FnZSBiZWxvdyBmb3IgYSB2YWxpZCBpbnB1dCBzdHJlYW06IGluY3JlYXNlIHRoZSBsaW1pdAorICAgIGNvbnN0IHNpemVfdCBrTWF4QnVmZmVyU2l6ZSA9IDY0ICogMTAyNCAqIDEwMjQ7CisgICAgaWYgKG1heF9zaXplID4ga01heEJ1ZmZlclNpemUpIHsKKyAgICAgICAgQUxPR0UoImJvZ3VzIG1heCBpbnB1dCBzaXplOiAlenUgPiAlenUiLCBtYXhfc2l6ZSwga01heEJ1ZmZlclNpemUpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICBpZiAobWF4X3NpemUgPT0gMCkgeworICAgICAgICBBTE9HRSgiemVybyBtYXggaW5wdXQgc2l6ZSIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIC8vIEFsbG93IHVwIHRvIGtNYXhCdWZmZXJzLCBidXQgbm90IGlmIHRoZSB0b3RhbCBleGNlZWRzIGtNYXhCdWZmZXJTaXplLgorICAgIGNvbnN0IHNpemVfdCBrSW5pdGlhbEJ1ZmZlcnMgPSAyOworICAgIGNvbnN0IHNpemVfdCBrTWF4QnVmZmVycyA9IDg7CisgICAgY29uc3Qgc2l6ZV90IHJlYWxNYXhCdWZmZXJzID0gbWluKGtNYXhCdWZmZXJTaXplIC8gbWF4X3NpemUsIGtNYXhCdWZmZXJzKTsKKyAgICBtR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cChrSW5pdGlhbEJ1ZmZlcnMsIG1heF9zaXplLCByZWFsTWF4QnVmZmVycyk7CisgICAgbVNyY0J1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSB1aW50OF90W21heF9zaXplXTsKKyAgICBpZiAobVNyY0J1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIC8vIGZpbGUgcHJvYmFibHkgc3BlY2lmaWVkIGEgYmFkIG1heCBzaXplCisgICAgICAgIGRlbGV0ZSBtR3JvdXA7CisgICAgICAgIG1Hcm91cCA9IE5VTEw7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgbVN0YXJ0ZWQgPSB0cnVlOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNUEVHNFNvdXJjZTo6c3RvcCgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgQ0hFQ0sobVN0YXJ0ZWQpOworCisgICAgaWYgKG1CdWZmZXIgIT0gTlVMTCkgeworICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgIG1CdWZmZXIgPSBOVUxMOworICAgIH0KKworICAgIGRlbGV0ZVtdIG1TcmNCdWZmZXI7CisgICAgbVNyY0J1ZmZlciA9IE5VTEw7CisKKyAgICBkZWxldGUgbUdyb3VwOworICAgIG1Hcm91cCA9IE5VTEw7CisKKyAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgIG1DdXJyZW50U2FtcGxlSW5kZXggPSAwOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNUEVHNFNvdXJjZTo6cGFyc2VDaHVuayhvZmY2NF90ICpvZmZzZXQpIHsKKyAgICB1aW50MzJfdCBoZHJbMl07CisgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoKm9mZnNldCwgaGRyLCA4KSA8IDgpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKyAgICB1aW50NjRfdCBjaHVua19zaXplID0gbnRvaGwoaGRyWzBdKTsKKyAgICB1aW50MzJfdCBjaHVua190eXBlID0gbnRvaGwoaGRyWzFdKTsKKyAgICBvZmY2NF90IGRhdGFfb2Zmc2V0ID0gKm9mZnNldCArIDg7CisKKyAgICBpZiAoY2h1bmtfc2l6ZSA9PSAxKSB7CisgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KCpvZmZzZXQgKyA4LCAmY2h1bmtfc2l6ZSwgOCkgPCA4KSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgIH0KKyAgICAgICAgY2h1bmtfc2l6ZSA9IG50b2g2NChjaHVua19zaXplKTsKKyAgICAgICAgZGF0YV9vZmZzZXQgKz0gODsKKworICAgICAgICBpZiAoY2h1bmtfc2l6ZSA8IDE2KSB7CisgICAgICAgICAgICAvLyBUaGUgc21hbGxlc3QgdmFsaWQgY2h1bmsgaXMgMTYgYnl0ZXMgbG9uZyBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChjaHVua19zaXplIDwgOCkgeworICAgICAgICAvLyBUaGUgc21hbGxlc3QgdmFsaWQgY2h1bmsgaXMgOCBieXRlcyBsb25nLgorICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIGNoYXIgY2h1bmtbNV07CisgICAgTWFrZUZvdXJDQ1N0cmluZyhjaHVua190eXBlLCBjaHVuayk7CisgICAgQUxPR1YoIk1QRUc0U291cmNlIGNodW5rICVzIEAgJSNsbHgiLCBjaHVuaywgKGxvbmcgbG9uZykqb2Zmc2V0KTsKKworICAgIG9mZjY0X3QgY2h1bmtfZGF0YV9zaXplID0gKm9mZnNldCArIGNodW5rX3NpemUgLSBkYXRhX29mZnNldDsKKworICAgIHN3aXRjaChjaHVua190eXBlKSB7CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAncicsICdhJywgJ2YnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ2YnKTogeworICAgICAgICAgICAgb2ZmNjRfdCBzdG9wX29mZnNldCA9ICpvZmZzZXQgKyBjaHVua19zaXplOworICAgICAgICAgICAgKm9mZnNldCA9IGRhdGFfb2Zmc2V0OworICAgICAgICAgICAgd2hpbGUgKCpvZmZzZXQgPCBzdG9wX29mZnNldCkgeworICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlQ2h1bmsob2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCdtJywgJ28nLCAnbycsICdmJykpIHsKKyAgICAgICAgICAgICAgICAvLyAqb2Zmc2V0IHBvaW50cyB0byB0aGUgYm94IGZvbGxvd2luZyB0aGlzIG1vb2YuIEZpbmQgdGhlIG5leHQgbW9vZiBmcm9tIHRoZXJlLgorCisgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoKm9mZnNldCwgaGRyLCA4KSA8IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIG1vcmUgYm94IHRvIHRoZSBlbmQgb2YgZmlsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNodW5rX3NpemUgPSBudG9obChoZHJbMF0pOworICAgICAgICAgICAgICAgICAgICBjaHVua190eXBlID0gbnRvaGwoaGRyWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNodW5rX3NpemUgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSVNPL0lFQyAxNDQ5Ni0xMjoyMDEyLCA4LjguNCBNb3ZpZSBGcmFnbWVudCBCb3gsIG1vb2YgaXMgYSBCb3gKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGlzIGRlZmluZWQgaW4gNC4yIE9iamVjdCBTdHJ1Y3R1cmUuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIGNodW5rX3NpemU9PTEsIDggYnl0ZXMgZm9sbG93cyBhcyAibGFyZ2VzaXplIi4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KCpvZmZzZXQgKyA4LCAmY2h1bmtfc2l6ZSwgOCkgPCA4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtfc2l6ZSA9IG50b2g2NChjaHVua19zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaHVua19zaXplIDwgMTYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgc21hbGxlc3QgdmFsaWQgY2h1bmsgaXMgMTYgYnl0ZXMgbG9uZyBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaHVua19zaXplID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5leHQgYm94IGV4dGVuZHMgdG8gZW5kIG9mIGZpbGUuCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2h1bmtfc2l6ZSA8IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBzbWFsbGVzdCB2YWxpZCBjaHVuayBpcyA4IGJ5dGVzIGxvbmcgaW4gdGhpcyBjYXNlLgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChjaHVua190eXBlID09IEZPVVJDQygnbScsICdvJywgJ28nLCAnZicpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtTmV4dE1vb2ZPZmZzZXQgPSAqb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2h1bmtfc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygndCcsICdmJywgJ2gnLCAnZCcpOiB7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyOworICAgICAgICAgICAgICAgIGlmICgoZXJyID0gcGFyc2VUcmFja0ZyYWdtZW50SGVhZGVyKGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpKSAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygndCcsICdyJywgJ3UnLCAnbicpOiB7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyOworICAgICAgICAgICAgICAgIGlmIChtTGFzdFBhcnNlZFRyYWNrSWQgPT0gbVRyYWNrSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChlcnIgPSBwYXJzZVRyYWNrRnJhZ21lbnRSdW4oZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSkpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAnYScsICdpJywgJ3onKTogeworICAgICAgICAgICAgc3RhdHVzX3QgZXJyOworICAgICAgICAgICAgaWYgKChlcnIgPSBwYXJzZVNhbXBsZUF1eGlsaWFyeUluZm9ybWF0aW9uU2l6ZXMoZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSkpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ2EnLCAnaScsICdvJyk6IHsKKyAgICAgICAgICAgIHN0YXR1c190IGVycjsKKyAgICAgICAgICAgIGlmICgoZXJyID0gcGFyc2VTYW1wbGVBdXhpbGlhcnlJbmZvcm1hdGlvbk9mZnNldHMoZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSkpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAnZScsICduJywgJ2MnKTogeworICAgICAgICAgICAgc3RhdHVzX3QgZXJyOworICAgICAgICAgICAgaWYgKChlcnIgPSBwYXJzZVNhbXBsZUVuY3J5cHRpb24oZGF0YV9vZmZzZXQpKSAhPSBPSykgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ2QnLCAnYScsICd0Jyk6IHsKKyAgICAgICAgICAgIC8vIHBhcnNlIERSTSBpbmZvIGlmIHByZXNlbnQKKyAgICAgICAgICAgIEFMT0dWKCJNUEVHNFNvdXJjZTo6cGFyc2VDaHVuayBtZGF0Iik7CisgICAgICAgICAgICAvLyBpZiBzYWl6L3Nhb2kgd2FzIHByZXZpb3VzbHkgb2JzZXJ2ZWQsIGRvIHNvbWV0aGluZyB3aXRoIHRoZSBzYW1wbGVpbmZvcworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1QRUc0U291cmNlOjpwYXJzZVNhbXBsZUF1eGlsaWFyeUluZm9ybWF0aW9uU2l6ZXMoCisgICAgICAgIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IC8qIHNpemUgKi8pIHsKKyAgICBBTE9HVigicGFyc2VTYW1wbGVBdXhpbGlhcnlJbmZvcm1hdGlvblNpemVzIik7CisgICAgLy8gMTQ0OTYtMTIgOC43LjEyCisgICAgdWludDhfdCB2ZXJzaW9uOworICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgb2Zmc2V0LCAmdmVyc2lvbiwgc2l6ZW9mKHZlcnNpb24pKQorICAgICAgICAgICAgPCAoc3NpemVfdClzaXplb2YodmVyc2lvbikpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKworICAgIGlmICh2ZXJzaW9uICE9IDApIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKyAgICBvZmZzZXQrKzsKKworICAgIHVpbnQzMl90IGZsYWdzOworICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQyNChvZmZzZXQsICZmbGFncykpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKyAgICBvZmZzZXQgKz0gMzsKKworICAgIGlmIChmbGFncyAmIDEpIHsKKyAgICAgICAgdWludDMyX3QgdG1wOworICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmdG1wKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgICAgICBtQ3VycmVudEF1eEluZm9UeXBlID0gdG1wOworICAgICAgICBvZmZzZXQgKz0gNDsKKyAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJnRtcCkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICAgICAgbUN1cnJlbnRBdXhJbmZvVHlwZVBhcmFtZXRlciA9IHRtcDsKKyAgICAgICAgb2Zmc2V0ICs9IDQ7CisgICAgfQorCisgICAgdWludDhfdCBkZWZzaXplOworICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgJmRlZnNpemUsIDEpICE9IDEpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgbUN1cnJlbnREZWZhdWx0U2FtcGxlSW5mb1NpemUgPSBkZWZzaXplOworICAgIG9mZnNldCsrOworCisgICAgdWludDMyX3Qgc21wbGNudDsKKyAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmc21wbGNudCkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgbUN1cnJlbnRTYW1wbGVJbmZvQ291bnQgPSBzbXBsY250OworICAgIG9mZnNldCArPSA0OworCisgICAgaWYgKG1DdXJyZW50RGVmYXVsdFNhbXBsZUluZm9TaXplICE9IDApIHsKKyAgICAgICAgQUxPR1YoIkBAQEAgdXNpbmcgZGVmYXVsdCBzYW1wbGUgaW5mbyBzaXplIG9mICVkIiwgbUN1cnJlbnREZWZhdWx0U2FtcGxlSW5mb1NpemUpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIGlmIChzbXBsY250ID4gbUN1cnJlbnRTYW1wbGVJbmZvQWxsb2NTaXplKSB7CisgICAgICAgIHVpbnQ4X3QgKiBuZXdQdHIgPSAgKHVpbnQ4X3QqKSByZWFsbG9jKG1DdXJyZW50U2FtcGxlSW5mb1NpemVzLCBzbXBsY250KTsKKyAgICAgICAgaWYgKG5ld1B0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHJlYWxsb2MgJXUgLT4gJXUiLCBtQ3VycmVudFNhbXBsZUluZm9BbGxvY1NpemUsIHNtcGxjbnQpOworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQorICAgICAgICBtQ3VycmVudFNhbXBsZUluZm9TaXplcyA9IG5ld1B0cjsKKyAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmZvQWxsb2NTaXplID0gc21wbGNudDsKKyAgICB9CisKKyAgICBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgbUN1cnJlbnRTYW1wbGVJbmZvU2l6ZXMsIHNtcGxjbnQpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnBhcnNlU2FtcGxlQXV4aWxpYXJ5SW5mb3JtYXRpb25PZmZzZXRzKAorICAgICAgICBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCAvKiBzaXplICovKSB7CisgICAgQUxPR1YoInBhcnNlU2FtcGxlQXV4aWxpYXJ5SW5mb3JtYXRpb25PZmZzZXRzIik7CisgICAgLy8gMTQ0OTYtMTIgOC43LjEzCisgICAgdWludDhfdCB2ZXJzaW9uOworICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgJnZlcnNpb24sIHNpemVvZih2ZXJzaW9uKSkgIT0gMSkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorICAgIG9mZnNldCsrOworCisgICAgdWludDMyX3QgZmxhZ3M7CisgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDI0KG9mZnNldCwgJmZsYWdzKSkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorICAgIG9mZnNldCArPSAzOworCisgICAgdWludDMyX3QgZW50cnljb3VudDsKKyAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmZW50cnljb3VudCkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKyAgICBvZmZzZXQgKz0gNDsKKyAgICBpZiAoZW50cnljb3VudCA9PSAwKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgaWYgKGVudHJ5Y291bnQgPiBVSU5UMzJfTUFYIC8gOCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIGlmIChlbnRyeWNvdW50ID4gbUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0c0FsbG9jU2l6ZSkgeworICAgICAgICB1aW50NjRfdCAqbmV3UHRyID0gKHVpbnQ2NF90ICopcmVhbGxvYyhtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRzLCBlbnRyeWNvdW50ICogOCk7CisgICAgICAgIGlmIChuZXdQdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0byByZWFsbG9jICV1IC0+ICV1IiwgbUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0c0FsbG9jU2l6ZSwgZW50cnljb3VudCAqIDgpOworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQorICAgICAgICBtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRzID0gbmV3UHRyOworICAgICAgICBtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRzQWxsb2NTaXplID0gZW50cnljb3VudDsKKyAgICB9CisgICAgbUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0Q291bnQgPSBlbnRyeWNvdW50OworCisgICAgaWYgKG1DdXJyZW50U2FtcGxlSW5mb09mZnNldHMgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbnRyeWNvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKHZlcnNpb24gPT0gMCkgeworICAgICAgICAgICAgdWludDMyX3QgdG1wOworICAgICAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJnRtcCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRzW2ldID0gdG1wOworICAgICAgICAgICAgb2Zmc2V0ICs9IDQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1aW50NjRfdCB0bXA7CisgICAgICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50NjQob2Zmc2V0LCAmdG1wKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlSW5mb09mZnNldHNbaV0gPSB0bXA7CisgICAgICAgICAgICBvZmZzZXQgKz0gODsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHBhcnNlIGNsZWFyL2VuY3J5cHRlZCBkYXRhCisKKyAgICBvZmY2NF90IGRybW9mZnNldCA9IG1DdXJyZW50U2FtcGxlSW5mb09mZnNldHNbMF07IC8vIGZyb20gbW9vZgorCisgICAgZHJtb2Zmc2V0ICs9IG1DdXJyZW50TW9vZk9mZnNldDsKKworICAgIHJldHVybiBwYXJzZUNsZWFyRW5jcnlwdGVkU2l6ZXMoZHJtb2Zmc2V0LCBmYWxzZSwgMCk7Cit9CisKK3N0YXR1c190IE1QRUc0U291cmNlOjpwYXJzZUNsZWFyRW5jcnlwdGVkU2l6ZXMob2ZmNjRfdCBvZmZzZXQsIGJvb2wgaXNTdWJzYW1wbGVFbmNyeXB0aW9uLCB1aW50MzJfdCBmbGFncykgeworCisgICAgaW50IGl2bGVuZ3RoOworICAgIENIRUNLKG1Gb3JtYXQuZmluZEludDMyKGtLZXlDcnlwdG9EZWZhdWx0SVZTaXplLCAmaXZsZW5ndGgpKTsKKworICAgIC8vIG9ubHkgMCwgOCBhbmQgMTYgYnl0ZSBpbml0aWFsaXphdGlvbiB2ZWN0b3JzIGFyZSBzdXBwb3J0ZWQKKyAgICBpZiAoaXZsZW5ndGggIT0gMCAmJiBpdmxlbmd0aCAhPSA4ICYmIGl2bGVuZ3RoICE9IDE2KSB7CisgICAgICAgIEFMT0dXKCJ1bnN1cHBvcnRlZCBJViBsZW5ndGg6ICVkIiwgaXZsZW5ndGgpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHVpbnQzMl90IHNhbXBsZUNvdW50ID0gbUN1cnJlbnRTYW1wbGVJbmZvQ291bnQ7CisgICAgaWYgKGlzU3Vic2FtcGxlRW5jcnlwdGlvbikgeworICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmc2FtcGxlQ291bnQpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgIH0KKyAgICAgICAgb2Zmc2V0ICs9IDQ7CisgICAgfQorCisgICAgLy8gcmVhZCBDZW5jU2FtcGxlQXV4aWxpYXJ5RGF0YUZvcm1hdHMKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNhbXBsZUNvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKGkgPj0gbUN1cnJlbnRTYW1wbGVzLnNpemUoKSkgeworICAgICAgICAgICAgQUxPR1coInRvbyBmZXcgc2FtcGxlcyIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgU2FtcGxlICpzbXBsID0gJm1DdXJyZW50U2FtcGxlcy5lZGl0SXRlbUF0KGkpOworICAgICAgICBpZiAoIXNtcGwtPmNsZWFyc2l6ZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIG1lbXNldChzbXBsLT5pdiwgMCwgMTYpOworICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIHNtcGwtPml2LCBpdmxlbmd0aCkgIT0gaXZsZW5ndGgpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfQorCisgICAgICAgIG9mZnNldCArPSBpdmxlbmd0aDsKKworICAgICAgICBib29sIHJlYWRTdWJzYW1wbGVzOworICAgICAgICBpZiAoaXNTdWJzYW1wbGVFbmNyeXB0aW9uKSB7CisgICAgICAgICAgICByZWFkU3Vic2FtcGxlcyA9IGZsYWdzICYgMjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludDMyX3Qgc21wbGluZm9zaXplID0gbUN1cnJlbnREZWZhdWx0U2FtcGxlSW5mb1NpemU7CisgICAgICAgICAgICBpZiAoc21wbGluZm9zaXplID09IDApIHsKKyAgICAgICAgICAgICAgICBzbXBsaW5mb3NpemUgPSBtQ3VycmVudFNhbXBsZUluZm9TaXplc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlYWRTdWJzYW1wbGVzID0gc21wbGluZm9zaXplID4gaXZsZW5ndGg7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVhZFN1YnNhbXBsZXMpIHsKKyAgICAgICAgICAgIHVpbnQxNl90IG51bXN1YnNhbXBsZXM7CisgICAgICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MTYob2Zmc2V0LCAmbnVtc3Vic2FtcGxlcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbnVtc3Vic2FtcGxlczsgaisrKSB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgbnVtY2xlYXI7CisgICAgICAgICAgICAgICAgdWludDMyX3QgbnVtZW5jcnlwdGVkOworICAgICAgICAgICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQxNihvZmZzZXQsICZudW1jbGVhcikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmbnVtZW5jcnlwdGVkKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9mZnNldCArPSA0OworICAgICAgICAgICAgICAgIHNtcGwtPmNsZWFyc2l6ZXMuYWRkKG51bWNsZWFyKTsKKyAgICAgICAgICAgICAgICBzbXBsLT5lbmNyeXB0ZWRzaXplcy5hZGQobnVtZW5jcnlwdGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNtcGwtPmNsZWFyc2l6ZXMuYWRkKDApOworICAgICAgICAgICAgc21wbC0+ZW5jcnlwdGVkc2l6ZXMuYWRkKHNtcGwtPnNpemUpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNUEVHNFNvdXJjZTo6cGFyc2VTYW1wbGVFbmNyeXB0aW9uKG9mZjY0X3Qgb2Zmc2V0KSB7CisgICAgdWludDMyX3QgZmxhZ3M7CisgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJmZsYWdzKSkgeyAvLyBhY3R1YWxseSB2ZXJzaW9uICsgZmxhZ3MKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgcmV0dXJuIHBhcnNlQ2xlYXJFbmNyeXB0ZWRTaXplcyhvZmZzZXQgKyA0LCB0cnVlLCBmbGFncyk7Cit9CisKK3N0YXR1c190IE1QRUc0U291cmNlOjpwYXJzZVRyYWNrRnJhZ21lbnRIZWFkZXIob2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3Qgc2l6ZSkgeworCisgICAgaWYgKHNpemUgPCA4KSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIHVpbnQzMl90IGZsYWdzOworICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQsICZmbGFncykpIHsgLy8gYWN0dWFsbHkgdmVyc2lvbiArIGZsYWdzCisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgaWYgKGZsYWdzICYgMHhmZjAwMDAwMCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0ICsgNCwgKHVpbnQzMl90KikmbUxhc3RQYXJzZWRUcmFja0lkKSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIGlmIChtTGFzdFBhcnNlZFRyYWNrSWQgIT0gbVRyYWNrSWQpIHsKKyAgICAgICAgLy8gdGhpcyBpcyBub3QgdGhlIHJpZ2h0IHRyYWNrLCBza2lwIGl0CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubUZsYWdzID0gZmxhZ3M7CisgICAgbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1UcmFja0lEID0gbUxhc3RQYXJzZWRUcmFja0lkOworICAgIG9mZnNldCArPSA4OworICAgIHNpemUgLT0gODsKKworICAgIEFMT0dWKCJmcmFnbWVudCBoZWFkZXI6ICUwOHggJTA4eCIsIGZsYWdzLCBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubVRyYWNrSUQpOworCisgICAgaWYgKGZsYWdzICYgVHJhY2tGcmFnbWVudEhlYWRlckluZm86OmtCYXNlRGF0YU9mZnNldFByZXNlbnQpIHsKKyAgICAgICAgaWYgKHNpemUgPCA4KSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQ2NChvZmZzZXQsICZtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubUJhc2VEYXRhT2Zmc2V0KSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgICAgICBvZmZzZXQgKz0gODsKKyAgICAgICAgc2l6ZSAtPSA4OworICAgIH0KKworICAgIGlmIChmbGFncyAmIFRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvOjprU2FtcGxlRGVzY3JpcHRpb25JbmRleFByZXNlbnQpIHsKKyAgICAgICAgaWYgKHNpemUgPCA0KSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQsICZtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubVNhbXBsZURlc2NyaXB0aW9uSW5kZXgpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgICAgIG9mZnNldCArPSA0OworICAgICAgICBzaXplIC09IDQ7CisgICAgfQorCisgICAgaWYgKGZsYWdzICYgVHJhY2tGcmFnbWVudEhlYWRlckluZm86OmtEZWZhdWx0U2FtcGxlRHVyYXRpb25QcmVzZW50KSB7CisgICAgICAgIGlmIChzaXplIDwgNCkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1EZWZhdWx0U2FtcGxlRHVyYXRpb24pKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgICAgIG9mZnNldCArPSA0OworICAgICAgICBzaXplIC09IDQ7CisgICAgfQorCisgICAgaWYgKGZsYWdzICYgVHJhY2tGcmFnbWVudEhlYWRlckluZm86OmtEZWZhdWx0U2FtcGxlU2l6ZVByZXNlbnQpIHsKKyAgICAgICAgaWYgKHNpemUgPCA0KSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQsICZtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubURlZmF1bHRTYW1wbGVTaXplKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgICAgICBvZmZzZXQgKz0gNDsKKyAgICAgICAgc2l6ZSAtPSA0OworICAgIH0KKworICAgIGlmIChmbGFncyAmIFRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvOjprRGVmYXVsdFNhbXBsZUZsYWdzUHJlc2VudCkgeworICAgICAgICBpZiAoc2l6ZSA8IDQpIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJm1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRGVmYXVsdFNhbXBsZUZsYWdzKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgICAgICBvZmZzZXQgKz0gNDsKKyAgICAgICAgc2l6ZSAtPSA0OworICAgIH0KKworICAgIGlmICghKGZsYWdzICYgVHJhY2tGcmFnbWVudEhlYWRlckluZm86OmtCYXNlRGF0YU9mZnNldFByZXNlbnQpKSB7CisgICAgICAgIG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tQmFzZURhdGFPZmZzZXQgPSBtQ3VycmVudE1vb2ZPZmZzZXQ7CisgICAgfQorCisgICAgbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1EYXRhT2Zmc2V0ID0gMDsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1QRUc0U291cmNlOjpwYXJzZVRyYWNrRnJhZ21lbnRSdW4ob2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3Qgc2l6ZSkgeworCisgICAgQUxPR1YoIk1QRUc0RXh0cmFjdG9yOjpwYXJzZVRyYWNrRnJhZ21lbnRSdW4iKTsKKyAgICBpZiAoc2l6ZSA8IDgpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgZW51bSB7CisgICAgICAgIGtEYXRhT2Zmc2V0UHJlc2VudCAgICAgICAgICAgICAgICAgID0gMHgwMSwKKyAgICAgICAga0ZpcnN0U2FtcGxlRmxhZ3NQcmVzZW50ICAgICAgICAgICAgPSAweDA0LAorICAgICAgICBrU2FtcGxlRHVyYXRpb25QcmVzZW50ICAgICAgICAgICAgICA9IDB4MTAwLAorICAgICAgICBrU2FtcGxlU2l6ZVByZXNlbnQgICAgICAgICAgICAgICAgICA9IDB4MjAwLAorICAgICAgICBrU2FtcGxlRmxhZ3NQcmVzZW50ICAgICAgICAgICAgICAgICA9IDB4NDAwLAorICAgICAgICBrU2FtcGxlQ29tcG9zaXRpb25UaW1lT2Zmc2V0UHJlc2VudCA9IDB4ODAwLAorICAgIH07CisKKyAgICB1aW50MzJfdCBmbGFnczsKKyAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmZmxhZ3MpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIC8vIHx2ZXJzaW9ufCBvbmx5IGFmZmVjdHMgU2FtcGxlQ29tcG9zaXRpb25UaW1lT2Zmc2V0IGZpZWxkLgorICAgIC8vIElmIHZlcnNpb24gPT0gMCwgU2FtcGxlQ29tcG9zaXRpb25UaW1lT2Zmc2V0IGlzIHVpbnQzMl90OworICAgIC8vIE90aGVyd2lzZSwgU2FtcGxlQ29tcG9zaXRpb25UaW1lT2Zmc2V0IGlzIGludDMyX3QuCisgICAgLy8gU2FtcGxlLmNvbXBvc2l0aW9uT2Zmc2V0IGlzIGRlZmluZWQgYXMgaW50MzJfdC4KKyAgICB1aW50OF90IHZlcnNpb24gPSBmbGFncyA+PiAyNDsKKyAgICBmbGFncyAmPSAweGZmZmZmZjsKKyAgICBBTE9HVigiZnJhZ21lbnQgcnVuIHZlcnNpb246IDB4JTAyeCwgZmxhZ3M6IDB4JTA2eCIsIHZlcnNpb24sIGZsYWdzKTsKKworICAgIGlmICgoZmxhZ3MgJiBrRmlyc3RTYW1wbGVGbGFnc1ByZXNlbnQpICYmIChmbGFncyAmIGtTYW1wbGVGbGFnc1ByZXNlbnQpKSB7CisgICAgICAgIC8vIFRoZXNlIHR3byBzaGFsbCBub3QgYmUgdXNlZCB0b2dldGhlci4KKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgdWludDMyX3Qgc2FtcGxlQ291bnQ7CisgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCArIDQsICZzYW1wbGVDb3VudCkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgb2Zmc2V0ICs9IDg7CisgICAgc2l6ZSAtPSA4OworCisgICAgdWludDY0X3QgZGF0YU9mZnNldCA9IG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRGF0YU9mZnNldDsKKworICAgIHVpbnQzMl90IGZpcnN0U2FtcGxlRmxhZ3MgPSAwOworCisgICAgaWYgKGZsYWdzICYga0RhdGFPZmZzZXRQcmVzZW50KSB7CisgICAgICAgIGlmIChzaXplIDwgNCkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IGRhdGFPZmZzZXREZWx0YTsKKyAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgKHVpbnQzMl90KikmZGF0YU9mZnNldERlbHRhKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIGRhdGFPZmZzZXQgPSBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubUJhc2VEYXRhT2Zmc2V0ICsgZGF0YU9mZnNldERlbHRhOworCisgICAgICAgIG9mZnNldCArPSA0OworICAgICAgICBzaXplIC09IDQ7CisgICAgfQorCisgICAgaWYgKGZsYWdzICYga0ZpcnN0U2FtcGxlRmxhZ3NQcmVzZW50KSB7CisgICAgICAgIGlmIChzaXplIDwgNCkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmZmlyc3RTYW1wbGVGbGFncykpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICAgICAgb2Zmc2V0ICs9IDQ7CisgICAgICAgIHNpemUgLT0gNDsKKyAgICB9CisKKyAgICB1aW50MzJfdCBzYW1wbGVEdXJhdGlvbiA9IDAsIHNhbXBsZVNpemUgPSAwLCBzYW1wbGVGbGFncyA9IDAsCisgICAgICAgICAgICAgc2FtcGxlQ3RzT2Zmc2V0ID0gMDsKKworICAgIHNpemVfdCBieXRlc1BlclNhbXBsZSA9IDA7CisgICAgaWYgKGZsYWdzICYga1NhbXBsZUR1cmF0aW9uUHJlc2VudCkgeworICAgICAgICBieXRlc1BlclNhbXBsZSArPSA0OworICAgIH0gZWxzZSBpZiAobVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1GbGFncworICAgICAgICAgICAgJiBUcmFja0ZyYWdtZW50SGVhZGVySW5mbzo6a0RlZmF1bHRTYW1wbGVEdXJhdGlvblByZXNlbnQpIHsKKyAgICAgICAgc2FtcGxlRHVyYXRpb24gPSBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubURlZmF1bHRTYW1wbGVEdXJhdGlvbjsKKyAgICB9IGVsc2UgaWYgKG1UcmV4KSB7CisgICAgICAgIHNhbXBsZUR1cmF0aW9uID0gbVRyZXgtPmRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uOworICAgIH0KKworICAgIGlmIChmbGFncyAmIGtTYW1wbGVTaXplUHJlc2VudCkgeworICAgICAgICBieXRlc1BlclNhbXBsZSArPSA0OworICAgIH0gZWxzZSBpZiAobVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1GbGFncworICAgICAgICAgICAgJiBUcmFja0ZyYWdtZW50SGVhZGVySW5mbzo6a0RlZmF1bHRTYW1wbGVTaXplUHJlc2VudCkgeworICAgICAgICBzYW1wbGVTaXplID0gbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1EZWZhdWx0U2FtcGxlU2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBzYW1wbGVTaXplID0gbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1EZWZhdWx0U2FtcGxlU2l6ZTsKKyAgICB9CisKKyAgICBpZiAoZmxhZ3MgJiBrU2FtcGxlRmxhZ3NQcmVzZW50KSB7CisgICAgICAgIGJ5dGVzUGVyU2FtcGxlICs9IDQ7CisgICAgfSBlbHNlIGlmIChtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubUZsYWdzCisgICAgICAgICAgICAmIFRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvOjprRGVmYXVsdFNhbXBsZUZsYWdzUHJlc2VudCkgeworICAgICAgICBzYW1wbGVGbGFncyA9IG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRGVmYXVsdFNhbXBsZUZsYWdzOworICAgIH0gZWxzZSB7CisgICAgICAgIHNhbXBsZUZsYWdzID0gbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1EZWZhdWx0U2FtcGxlRmxhZ3M7CisgICAgfQorCisgICAgaWYgKGZsYWdzICYga1NhbXBsZUNvbXBvc2l0aW9uVGltZU9mZnNldFByZXNlbnQpIHsKKyAgICAgICAgYnl0ZXNQZXJTYW1wbGUgKz0gNDsKKyAgICB9IGVsc2UgeworICAgICAgICBzYW1wbGVDdHNPZmZzZXQgPSAwOworICAgIH0KKworICAgIGlmIChzaXplIDwgKG9mZjY0X3QpKHNhbXBsZUNvdW50ICogYnl0ZXNQZXJTYW1wbGUpKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIFNhbXBsZSB0bXA7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHNhbXBsZUNvdW50OyArK2kpIHsKKyAgICAgICAgaWYgKGZsYWdzICYga1NhbXBsZUR1cmF0aW9uUHJlc2VudCkgeworICAgICAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJnNhbXBsZUR1cmF0aW9uKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvZmZzZXQgKz0gNDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmbGFncyAmIGtTYW1wbGVTaXplUHJlc2VudCkgeworICAgICAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJnNhbXBsZVNpemUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9mZnNldCArPSA0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZsYWdzICYga1NhbXBsZUZsYWdzUHJlc2VudCkgeworICAgICAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJnNhbXBsZUZsYWdzKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvZmZzZXQgKz0gNDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmbGFncyAmIGtTYW1wbGVDb21wb3NpdGlvblRpbWVPZmZzZXRQcmVzZW50KSB7CisgICAgICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmc2FtcGxlQ3RzT2Zmc2V0KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvZmZzZXQgKz0gNDsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCJhZGRpbmcgc2FtcGxlICVkIGF0IG9mZnNldCAweCUwOCIgUFJJeDY0ICIsIHNpemUgJXUsIGR1cmF0aW9uICV1LCAiCisgICAgICAgICAgICAgICIgZmxhZ3MgMHglMDh4IiwgaSArIDEsCisgICAgICAgICAgICAgICAgZGF0YU9mZnNldCwgc2FtcGxlU2l6ZSwgc2FtcGxlRHVyYXRpb24sCisgICAgICAgICAgICAgICAgKGZsYWdzICYga0ZpcnN0U2FtcGxlRmxhZ3NQcmVzZW50KSAmJiBpID09IDAKKyAgICAgICAgICAgICAgICAgICAgPyBmaXJzdFNhbXBsZUZsYWdzIDogc2FtcGxlRmxhZ3MpOworICAgICAgICB0bXAub2Zmc2V0ID0gZGF0YU9mZnNldDsKKyAgICAgICAgdG1wLnNpemUgPSBzYW1wbGVTaXplOworICAgICAgICB0bXAuZHVyYXRpb24gPSBzYW1wbGVEdXJhdGlvbjsKKyAgICAgICAgdG1wLmNvbXBvc2l0aW9uT2Zmc2V0ID0gc2FtcGxlQ3RzT2Zmc2V0OworICAgICAgICBtZW1zZXQodG1wLml2LCAwLCBzaXplb2YodG1wLml2KSk7CisgICAgICAgIG1DdXJyZW50U2FtcGxlcy5hZGQodG1wKTsKKworICAgICAgICBkYXRhT2Zmc2V0ICs9IHNhbXBsZVNpemU7CisgICAgfQorCisgICAgbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1EYXRhT2Zmc2V0ID0gZGF0YU9mZnNldDsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTVBFRzRTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIG1ldGEgPSBtRm9ybWF0OworICAgIHJldHVybiBPSzsKK30KKworc2l6ZV90IE1QRUc0U291cmNlOjpwYXJzZU5BTFNpemUoY29uc3QgdWludDhfdCAqZGF0YSkgY29uc3QgeworICAgIHN3aXRjaCAobU5BTExlbmd0aFNpemUpIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgcmV0dXJuICpkYXRhOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICByZXR1cm4gVTE2X0FUKGRhdGEpOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICByZXR1cm4gKChzaXplX3QpZGF0YVswXSA8PCAxNikgfCBVMTZfQVQoJmRhdGFbMV0pOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICByZXR1cm4gVTMyX0FUKGRhdGEpOworICAgIH0KKworICAgIC8vIFRoaXMgY2Fubm90IGhhcHBlbiwgbU5BTExlbmd0aFNpemUgc3ByaW5ncyB0byBsaWZlIGJ5IGFkZGluZyAxIHRvCisgICAgLy8gYSAyLWJpdCBpbnRlZ2VyLgorICAgIENIRUNLKCEiU2hvdWxkIG5vdCBiZSBoZXJlLiIpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXR1c190IE1QRUc0U291cmNlOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIENIRUNLKG1TdGFydGVkKTsKKworICAgIGlmIChvcHRpb25zICE9IG51bGxwdHIgJiYgb3B0aW9ucy0+Z2V0Tm9uQmxvY2tpbmcoKSAmJiAhbUdyb3VwLT5oYXNfYnVmZmVycygpKSB7CisgICAgICAgICpvdXQgPSBudWxscHRyOworICAgICAgICByZXR1cm4gV09VTERfQkxPQ0s7CisgICAgfQorCisgICAgaWYgKG1GaXJzdE1vb2ZPZmZzZXQgPiAwKSB7CisgICAgICAgIHJldHVybiBmcmFnbWVudGVkUmVhZChvdXQsIG9wdGlvbnMpOworICAgIH0KKworICAgICpvdXQgPSBOVUxMOworCisgICAgaW50NjRfdCB0YXJnZXRTYW1wbGVUaW1lVXMgPSAtMTsKKworICAgIGludDY0X3Qgc2Vla1RpbWVVczsKKyAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKKyAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSkgeworICAgICAgICBpZiAobUlzSGVpZikgeworICAgICAgICAgICAgQ0hFQ0sobVNhbXBsZVRhYmxlID09IE5VTEwpOworICAgICAgICAgICAgQ0hFQ0sobUl0ZW1UYWJsZSAhPSBOVUxMKTsKKyAgICAgICAgICAgIGludDMyX3QgaW1hZ2VJbmRleDsKKyAgICAgICAgICAgIGlmICghbUZvcm1hdC5maW5kSW50MzIoa0tleVRyYWNrSUQsICZpbWFnZUluZGV4KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXR1c190IGVycjsKKyAgICAgICAgICAgIGlmIChzZWVrVGltZVVzID49IDApIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBtSXRlbVRhYmxlLT5maW5kSW1hZ2VJdGVtKGltYWdlSW5kZXgsICZtQ3VycmVudFNhbXBsZUluZGV4KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXJyID0gbUl0ZW1UYWJsZS0+ZmluZFRodW1ibmFpbEl0ZW0oaW1hZ2VJbmRleCwgJm1DdXJyZW50U2FtcGxlSW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1aW50MzJfdCBmaW5kRmxhZ3MgPSAwOworICAgICAgICAgICAgc3dpdGNoIChtb2RlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DOgorICAgICAgICAgICAgICAgICAgICBmaW5kRmxhZ3MgPSBTYW1wbGVUYWJsZTo6a0ZsYWdCZWZvcmU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUmVhZE9wdGlvbnM6OlNFRUtfTkVYVF9TWU5DOgorICAgICAgICAgICAgICAgICAgICBmaW5kRmxhZ3MgPSBTYW1wbGVUYWJsZTo6a0ZsYWdBZnRlcjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUX1NZTkM6CisgICAgICAgICAgICAgICAgY2FzZSBSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUOgorICAgICAgICAgICAgICAgICAgICBmaW5kRmxhZ3MgPSBTYW1wbGVUYWJsZTo6a0ZsYWdDbG9zZXN0OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFJlYWRPcHRpb25zOjpTRUVLX0ZSQU1FX0lOREVYOgorICAgICAgICAgICAgICAgICAgICBmaW5kRmxhZ3MgPSBTYW1wbGVUYWJsZTo6a0ZsYWdGcmFtZUluZGV4OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBDSEVDSyghIlNob3VsZCBub3QgYmUgaGVyZS4iKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZUluZGV4OworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNhbXBsZVRhYmxlLT5maW5kU2FtcGxlQXRUaW1lKAorICAgICAgICAgICAgICAgICAgICBzZWVrVGltZVVzLCAxMDAwMDAwLCBtVGltZXNjYWxlLAorICAgICAgICAgICAgICAgICAgICAmc2FtcGxlSW5kZXgsIGZpbmRGbGFncyk7CisKKyAgICAgICAgICAgIGlmIChtb2RlID09IFJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1QKKyAgICAgICAgICAgICAgICAgICAgfHwgbW9kZSA9PSBSZWFkT3B0aW9uczo6U0VFS19GUkFNRV9JTkRFWCkgeworICAgICAgICAgICAgICAgIC8vIFdlIGZvdW5kIHRoZSBjbG9zZXN0IHNhbXBsZSBhbHJlYWR5LCBub3cgd2Ugd2FudCB0aGUgc3luYworICAgICAgICAgICAgICAgIC8vIHNhbXBsZSBwcmVjZWRpbmcgaXQgKG9yIHRoZSBzYW1wbGUgaXRzZWxmIG9mIGNvdXJzZSksIGV2ZW4KKyAgICAgICAgICAgICAgICAvLyBpZiB0aGUgc3Vic2VxdWVudCBzeW5jIHNhbXBsZSBpcyBjbG9zZXIuCisgICAgICAgICAgICAgICAgZmluZEZsYWdzID0gU2FtcGxlVGFibGU6OmtGbGFnQmVmb3JlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50MzJfdCBzeW5jU2FtcGxlSW5kZXg7CisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgZXJyID0gbVNhbXBsZVRhYmxlLT5maW5kU3luY1NhbXBsZU5lYXIoCisgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVJbmRleCwgJnN5bmNTYW1wbGVJbmRleCwgZmluZEZsYWdzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlVGltZTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBtU2FtcGxlVGFibGUtPmdldE1ldGFEYXRhRm9yU2FtcGxlKAorICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlSW5kZXgsIE5VTEwsIE5VTEwsICZzYW1wbGVUaW1lKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gRVJST1JfT1VUX09GX1JBTkdFKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEFuIGF0dGVtcHQgdG8gc2VlayBwYXN0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbSB3b3VsZAorICAgICAgICAgICAgICAgICAgICAvLyBub3JtYWxseSBjYXVzZSB0aGlzIEVSUk9SX09VVF9PRl9SQU5HRSBlcnJvci4gUHJvcGFnYXRpbmcKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBhbGwgdGhlIHdheSB0byB0aGUgTWVkaWFQbGF5ZXIgd291bGQgY2F1c2UgYWJub3JtYWwKKyAgICAgICAgICAgICAgICAgICAgLy8gdGVybWluYXRpb24uIExlZ2FjeSBiZWhhdmlvdXIgYXBwZWFycyB0byBiZSB0byBiZWhhdmUgYXMgaWYKKyAgICAgICAgICAgICAgICAgICAgLy8gd2UgaGFkIHNlZWtlZCB0byB0aGUgZW5kIG9mIHN0cmVhbSwgZW5kaW5nIG5vcm1hbGx5LgorICAgICAgICAgICAgICAgICAgICBlcnIgPSBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVigiZW5kIG9mIHN0cmVhbSIpOworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtb2RlID09IFJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1QKKyAgICAgICAgICAgICAgICB8fCBtb2RlID09IFJlYWRPcHRpb25zOjpTRUVLX0ZSQU1FX0lOREVYKSB7CisgICAgICAgICAgICAgICAgdGFyZ2V0U2FtcGxlVGltZVVzID0gKHNhbXBsZVRpbWUgKiAxMDAwMDAwbGwpIC8gbVRpbWVzY2FsZTsKKyAgICAgICAgICAgIH0KKworI2lmIDAKKyAgICAgICAgICAgIHVpbnQzMl90IHN5bmNTYW1wbGVUaW1lOworICAgICAgICAgICAgQ0hFQ0tfRVEoT0ssIG1TYW1wbGVUYWJsZS0+Z2V0TWV0YURhdGFGb3JTYW1wbGUoCisgICAgICAgICAgICAgICAgICAgICAgICBzeW5jU2FtcGxlSW5kZXgsIE5VTEwsIE5VTEwsICZzeW5jU2FtcGxlVGltZSkpOworCisgICAgICAgICAgICBBTE9HSSgic2VlayB0byB0aW1lICVsbGQgdXMgPT4gc2FtcGxlIGF0IHRpbWUgJWxsZCB1cywgIgorICAgICAgICAgICAgICAgICAic3luYyBzYW1wbGUgYXQgdGltZSAlbGxkIHVzIiwKKyAgICAgICAgICAgICAgICAgc2Vla1RpbWVVcywKKyAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSAqIDEwMDAwMDBsbCAvIG1UaW1lc2NhbGUsCisgICAgICAgICAgICAgICAgIHN5bmNTYW1wbGVUaW1lICogMTAwMDAwMGxsIC8gbVRpbWVzY2FsZSk7CisjZW5kaWYKKworICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCA9IHN5bmNTYW1wbGVJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtQnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgfQorCisgICAgb2ZmNjRfdCBvZmZzZXQgPSAwOworICAgIHNpemVfdCBzaXplID0gMDsKKyAgICB1aW50MzJfdCBjdHMsIHN0dHM7CisgICAgYm9vbCBpc1N5bmNTYW1wbGU7CisgICAgYm9vbCBuZXdCdWZmZXIgPSBmYWxzZTsKKyAgICBpZiAobUJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIG5ld0J1ZmZlciA9IHRydWU7CisKKyAgICAgICAgc3RhdHVzX3QgZXJyOworICAgICAgICBpZiAoIW1Jc0hlaWYpIHsKKyAgICAgICAgICAgIGVyciA9IG1TYW1wbGVUYWJsZS0+Z2V0TWV0YURhdGFGb3JTYW1wbGUoCisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlSW5kZXgsICZvZmZzZXQsICZzaXplLCAmY3RzLCAmaXNTeW5jU2FtcGxlLCAmc3R0cyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlcnIgPSBtSXRlbVRhYmxlLT5nZXRJbWFnZU9mZnNldEFuZFNpemUoCisgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtQ3VycmVudFNhbXBsZUluZGV4IDogTlVMTCwgJm9mZnNldCwgJnNpemUpOworCisgICAgICAgICAgICBjdHMgPSBzdHRzID0gMDsKKyAgICAgICAgICAgIGlzU3luY1NhbXBsZSA9IDA7CisgICAgICAgICAgICBBTE9HVigiaW1hZ2Ugb2Zmc2V0ICVsbGQsIHNpemUgJXp1IiwgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCisgICAgICAgIGVyciA9IG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJm1CdWZmZXIpOworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIENIRUNLKG1CdWZmZXIgPT0gTlVMTCk7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIGlmIChzaXplID4gbUJ1ZmZlci0+c2l6ZSgpKSB7CisgICAgICAgICAgICBBTE9HRSgiYnVmZmVyIHRvbyBzbWFsbDogJXp1ID4gJXp1Iiwgc2l6ZSwgbUJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0JVRkZFUl9UT09fU01BTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKCFtSXNBVkMgJiYgIW1Jc0hFVkMpIHx8IG1XYW50c05BTEZyYWdtZW50cykgeworICAgICAgICBpZiAobmV3QnVmZmVyKSB7CisgICAgICAgICAgICBzc2l6ZV90IG51bV9ieXRlc19yZWFkID0KKyAgICAgICAgICAgICAgICBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgKHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCksIHNpemUpOworCisgICAgICAgICAgICBpZiAobnVtX2J5dGVzX3JlYWQgPCAoc3NpemVfdClzaXplKSB7CisgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOworCisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOworICAgICAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIHNpemUpOworICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuY2xlYXIoKTsKKyAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAorICAgICAgICAgICAgICAgICAgICBrS2V5VGltZSwgKChpbnQ2NF90KWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAga0tleUR1cmF0aW9uLCAoKGludDY0X3Qpc3R0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisKKyAgICAgICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMCkgeworICAgICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAorICAgICAgICAgICAgICAgICAgICAgICAga0tleVRhcmdldFRpbWUsIHRhcmdldFNhbXBsZVRpbWVVcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpc1N5bmNTYW1wbGUpIHsKKyAgICAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICArK21DdXJyZW50U2FtcGxlSW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1Jc0FWQyAmJiAhbUlzSEVWQykgeworICAgICAgICAgICAgKm91dCA9IG1CdWZmZXI7CisgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKKyAgICAgICAgLy8gRWFjaCBOQUwgdW5pdCBpcyBzcGxpdCB1cCBpbnRvIGl0cyBjb25zdGl0dWVudCBmcmFnbWVudHMgYW5kCisgICAgICAgIC8vIGVhY2ggb25lIG9mIHRoZW0gcmV0dXJuZWQgaW4gaXRzIG93biBidWZmZXIuCisKKyAgICAgICAgQ0hFQ0sobUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPj0gbU5BTExlbmd0aFNpemUpOworCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYyA9CisgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKW1CdWZmZXItPmRhdGEoKSArIG1CdWZmZXItPnJhbmdlX29mZnNldCgpOworCisgICAgICAgIHNpemVfdCBuYWxfc2l6ZSA9IHBhcnNlTkFMU2l6ZShzcmMpOworICAgICAgICBpZiAobU5BTExlbmd0aFNpemUgPiBTSVpFX01BWCAtIG5hbF9zaXplKSB7CisgICAgICAgICAgICBBTE9HRSgiYi8yNDQ0MTU1MywgYi8yNDQ0NTEyMiIpOworICAgICAgICB9CisgICAgICAgIGlmIChtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSAtIG1OQUxMZW5ndGhTaXplIDwgbmFsX3NpemUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJpbmNvbXBsZXRlIE5BTCB1bml0LiIpOworCisgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqY2xvbmUgPSBtQnVmZmVyLT5jbG9uZSgpOworICAgICAgICBDSEVDSyhjbG9uZSAhPSBOVUxMKTsKKyAgICAgICAgY2xvbmUtPnNldF9yYW5nZShtQnVmZmVyLT5yYW5nZV9vZmZzZXQoKSArIG1OQUxMZW5ndGhTaXplLCBuYWxfc2l6ZSk7CisKKyAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKKyAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKAorICAgICAgICAgICAgICAgIG1CdWZmZXItPnJhbmdlX29mZnNldCgpICsgbU5BTExlbmd0aFNpemUgKyBuYWxfc2l6ZSwKKyAgICAgICAgICAgICAgICBtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSAtIG1OQUxMZW5ndGhTaXplIC0gbmFsX3NpemUpOworCisgICAgICAgIGlmIChtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgICpvdXQgPSBjbG9uZTsKKworICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gV2hvbGUgTkFMIHVuaXRzIGFyZSByZXR1cm5lZCBidXQgZWFjaCBmcmFnbWVudCBpcyBwcmVmaXhlZCBieQorICAgICAgICAvLyB0aGUgc3RhcnQgY29kZSAoMHgwMCAwMCAwMCAwMSkuCisgICAgICAgIHNzaXplX3QgbnVtX2J5dGVzX3JlYWQgPSAwOworICAgICAgICBpbnQzMl90IGRybSA9IDA7CisgICAgICAgIGJvb2wgdXNlc0RSTSA9IChtRm9ybWF0LmZpbmRJbnQzMihrS2V5SXNEUk0sICZkcm0pICYmIGRybSAhPSAwKTsKKyAgICAgICAgaWYgKHVzZXNEUk0pIHsKKyAgICAgICAgICAgIG51bV9ieXRlc19yZWFkID0KKyAgICAgICAgICAgICAgICBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgKHVpbnQ4X3QqKW1CdWZmZXItPmRhdGEoKSwgc2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBudW1fYnl0ZXNfcmVhZCA9IG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBtU3JjQnVmZmVyLCBzaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChudW1fYnl0ZXNfcmVhZCA8IChzc2l6ZV90KXNpemUpIHsKKyAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOworCisgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgIH0KKworICAgICAgICBpZiAodXNlc0RSTSkgeworICAgICAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKKyAgICAgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBzaXplKTsKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdWludDhfdCAqZHN0RGF0YSA9ICh1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpOworICAgICAgICAgICAgc2l6ZV90IHNyY09mZnNldCA9IDA7CisgICAgICAgICAgICBzaXplX3QgZHN0T2Zmc2V0ID0gMDsKKworICAgICAgICAgICAgd2hpbGUgKHNyY09mZnNldCA8IHNpemUpIHsKKyAgICAgICAgICAgICAgICBib29sIGlzTWFsRm9ybWVkID0gIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBzaXplLCBzcmNPZmZzZXQsIG1OQUxMZW5ndGhTaXplKTsKKyAgICAgICAgICAgICAgICBzaXplX3QgbmFsTGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoIWlzTWFsRm9ybWVkKSB7CisgICAgICAgICAgICAgICAgICAgIG5hbExlbmd0aCA9IHBhcnNlTkFMU2l6ZSgmbVNyY0J1ZmZlcltzcmNPZmZzZXRdKTsKKyAgICAgICAgICAgICAgICAgICAgc3JjT2Zmc2V0ICs9IG1OQUxMZW5ndGhTaXplOworICAgICAgICAgICAgICAgICAgICBpc01hbEZvcm1lZCA9ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgc2l6ZSwgc3JjT2Zmc2V0LCBuYWxMZW5ndGgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChpc01hbEZvcm1lZCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiVmlkZW8gaXMgbWFsZm9ybWVkIik7CisgICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG5hbExlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChkc3RPZmZzZXQgPiBTSVpFX01BWCAtIDQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCArIDQgPiBTSVpFX01BWCAtIG5hbExlbmd0aCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICsgNCArIG5hbExlbmd0aCA+IG1CdWZmZXItPnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiYi8yNzIwODYyMSA6ICV6dSAlenUiLCBkc3RPZmZzZXQsIG1CdWZmZXItPnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjcyMDg2MjEiKTsKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7CisgICAgICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOworICAgICAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKKyAgICAgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDE7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZkc3REYXRhW2RzdE9mZnNldF0sICZtU3JjQnVmZmVyW3NyY09mZnNldF0sIG5hbExlbmd0aCk7CisgICAgICAgICAgICAgICAgc3JjT2Zmc2V0ICs9IG5hbExlbmd0aDsKKyAgICAgICAgICAgICAgICBkc3RPZmZzZXQgKz0gbmFsTGVuZ3RoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ0hFQ0tfRVEoc3JjT2Zmc2V0LCBzaXplKTsKKyAgICAgICAgICAgIENIRUNLKG1CdWZmZXIgIT0gTlVMTCk7CisgICAgICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UoMCwgZHN0T2Zmc2V0KTsKKyAgICAgICAgfQorCisgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLmNsZWFyKCk7CisgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAorICAgICAgICAgICAgICAgIGtLZXlUaW1lLCAoKGludDY0X3QpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKKyAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCisgICAgICAgICAgICAgICAga0tleUR1cmF0aW9uLCAoKGludDY0X3Qpc3R0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisKKyAgICAgICAgaWYgKHRhcmdldFNhbXBsZVRpbWVVcyA+PSAwKSB7CisgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAga0tleVRhcmdldFRpbWUsIHRhcmdldFNhbXBsZVRpbWVVcyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUlzQVZDKSB7CisgICAgICAgICAgICB1aW50MzJfdCBsYXllcklkID0gRmluZEFWQ0xheWVySWQoCisgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CisgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5VGVtcG9yYWxMYXllcklkLCBsYXllcklkKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc1N5bmNTYW1wbGUpIHsKKyAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CisgICAgICAgIH0KKworICAgICAgICArK21DdXJyZW50U2FtcGxlSW5kZXg7CisKKyAgICAgICAgKm91dCA9IG1CdWZmZXI7CisgICAgICAgIG1CdWZmZXIgPSBOVUxMOworCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9Cit9CisKK3N0YXR1c190IE1QRUc0U291cmNlOjpmcmFnbWVudGVkUmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworCisgICAgQUxPR1YoIk1QRUc0U291cmNlOjpmcmFnbWVudGVkUmVhZCIpOworCisgICAgQ0hFQ0sobVN0YXJ0ZWQpOworCisgICAgKm91dCA9IE5VTEw7CisKKyAgICBpbnQ2NF90IHRhcmdldFNhbXBsZVRpbWVVcyA9IC0xOworCisgICAgaW50NjRfdCBzZWVrVGltZVVzOworICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOworICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7CisKKyAgICAgICAgaW50IG51bVNpZHhFbnRyaWVzID0gbVNlZ21lbnRzLnNpemUoKTsKKyAgICAgICAgaWYgKG51bVNpZHhFbnRyaWVzICE9IDApIHsKKyAgICAgICAgICAgIGludDY0X3QgdG90YWxUaW1lID0gMDsKKyAgICAgICAgICAgIG9mZjY0X3QgdG90YWxPZmZzZXQgPSBtRmlyc3RNb29mT2Zmc2V0OworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TaWR4RW50cmllczsgaSsrKSB7CisgICAgICAgICAgICAgICAgY29uc3QgU2lkeEVudHJ5ICpzZSA9ICZtU2VnbWVudHNbaV07CisgICAgICAgICAgICAgICAgaWYgKHRvdGFsVGltZSArIHNlLT5tRHVyYXRpb25VcyA+IHNlZWtUaW1lVXMpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlcXVlc3RlZCB0aW1lIGlzIHNvbWV3aGVyZSBpbiB0aGlzIHNlZ21lbnQKKyAgICAgICAgICAgICAgICAgICAgaWYgKChtb2RlID09IFJlYWRPcHRpb25zOjpTRUVLX05FWFRfU1lOQyAmJiBzZWVrVGltZVVzID4gdG90YWxUaW1lKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKG1vZGUgPT0gUmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVF9TWU5DICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoc2Vla1RpbWVVcyAtIHRvdGFsVGltZSkgPiAodG90YWxUaW1lICsgc2UtPm1EdXJhdGlvblVzIC0gc2Vla1RpbWVVcykpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1ZXN0ZWQgbmV4dCBzeW5jLCBvciBjbG9zZXN0IHN5bmMgYW5kIGl0IHdhcyBjbG9zZXIgdG8gdGhlIGVuZCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBzZWdtZW50CisgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFRpbWUgKz0gc2UtPm1EdXJhdGlvblVzOworICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxPZmZzZXQgKz0gc2UtPm1TaXplOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0b3RhbFRpbWUgKz0gc2UtPm1EdXJhdGlvblVzOworICAgICAgICAgICAgICAgIHRvdGFsT2Zmc2V0ICs9IHNlLT5tU2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DdXJyZW50TW9vZk9mZnNldCA9IHRvdGFsT2Zmc2V0OworICAgICAgICAgICAgbU5leHRNb29mT2Zmc2V0ID0gLTE7CisgICAgICAgICAgICBtQ3VycmVudFNhbXBsZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlSW5kZXggPSAwOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VDaHVuaygmdG90YWxPZmZzZXQpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ3VycmVudFRpbWUgPSB0b3RhbFRpbWUgKiBtVGltZXNjYWxlIC8gMTAwMDAwMGxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gd2l0aG91dCBzaWR4IGJveGVzLCB3ZSBjYW4gb25seSBzZWVrIHRvIDAKKyAgICAgICAgICAgIG1DdXJyZW50TW9vZk9mZnNldCA9IG1GaXJzdE1vb2ZPZmZzZXQ7CisgICAgICAgICAgICBtTmV4dE1vb2ZPZmZzZXQgPSAtMTsKKyAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlcy5jbGVhcigpOworICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCA9IDA7CisgICAgICAgICAgICBvZmY2NF90IHRtcCA9IG1DdXJyZW50TW9vZk9mZnNldDsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlQ2h1bmsoJnRtcCk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DdXJyZW50VGltZSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgIH0KKworICAgIG9mZjY0X3Qgb2Zmc2V0ID0gMDsKKyAgICBzaXplX3Qgc2l6ZSA9IDA7CisgICAgdWludDMyX3QgY3RzID0gMDsKKyAgICBib29sIGlzU3luY1NhbXBsZSA9IGZhbHNlOworICAgIGJvb2wgbmV3QnVmZmVyID0gZmFsc2U7CisgICAgaWYgKG1CdWZmZXIgPT0gTlVMTCkgeworICAgICAgICBuZXdCdWZmZXIgPSB0cnVlOworCisgICAgICAgIGlmIChtQ3VycmVudFNhbXBsZUluZGV4ID49IG1DdXJyZW50U2FtcGxlcy5zaXplKCkpIHsKKyAgICAgICAgICAgIC8vIG1vdmUgdG8gbmV4dCBmcmFnbWVudCBpZiB0aGVyZSBpcyBvbmUKKyAgICAgICAgICAgIGlmIChtTmV4dE1vb2ZPZmZzZXQgPD0gbUN1cnJlbnRNb29mT2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvZmY2NF90IG5leHRNb29mID0gbU5leHRNb29mT2Zmc2V0OworICAgICAgICAgICAgbUN1cnJlbnRNb29mT2Zmc2V0ID0gbmV4dE1vb2Y7CisgICAgICAgICAgICBtQ3VycmVudFNhbXBsZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlSW5kZXggPSAwOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VDaHVuaygmbmV4dE1vb2YpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUN1cnJlbnRTYW1wbGVJbmRleCA+PSBtQ3VycmVudFNhbXBsZXMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBTYW1wbGUgKnNtcGwgPSAmbUN1cnJlbnRTYW1wbGVzW21DdXJyZW50U2FtcGxlSW5kZXhdOworICAgICAgICBvZmZzZXQgPSBzbXBsLT5vZmZzZXQ7CisgICAgICAgIHNpemUgPSBzbXBsLT5zaXplOworICAgICAgICBjdHMgPSBtQ3VycmVudFRpbWUgKyBzbXBsLT5jb21wb3NpdGlvbk9mZnNldDsKKyAgICAgICAgbUN1cnJlbnRUaW1lICs9IHNtcGwtPmR1cmF0aW9uOworICAgICAgICBpc1N5bmNTYW1wbGUgPSAobUN1cnJlbnRTYW1wbGVJbmRleCA9PSAwKTsgLy8gWFhYCisKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmbUJ1ZmZlcik7CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQ0hFQ0sobUJ1ZmZlciA9PSBOVUxMKTsKKyAgICAgICAgICAgIEFMT0dWKCJhY3F1aXJlX2J1ZmZlciByZXR1cm5lZCAlZCIsIGVycik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIGlmIChzaXplID4gbUJ1ZmZlci0+c2l6ZSgpKSB7CisgICAgICAgICAgICBBTE9HRSgiYnVmZmVyIHRvbyBzbWFsbDogJXp1ID4gJXp1Iiwgc2l6ZSwgbUJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0JVRkZFUl9UT09fU01BTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCBTYW1wbGUgKnNtcGwgPSAmbUN1cnJlbnRTYW1wbGVzW21DdXJyZW50U2FtcGxlSW5kZXhdOworICAgIE1ldGFEYXRhQmFzZSAmYnVmbWV0YSA9IG1CdWZmZXItPm1ldGFfZGF0YSgpOworICAgIGJ1Zm1ldGEuY2xlYXIoKTsKKyAgICBpZiAoc21wbC0+ZW5jcnlwdGVkc2l6ZXMuc2l6ZSgpKSB7CisgICAgICAgIC8vIHN0b3JlIGNsZWFyL2VuY3J5cHRlZCBsZW5ndGhzIGluIG1ldGFkYXRhCisgICAgICAgIGJ1Zm1ldGEuc2V0RGF0YShrS2V5UGxhaW5TaXplcywgMCwKKyAgICAgICAgICAgICAgICBzbXBsLT5jbGVhcnNpemVzLmFycmF5KCksIHNtcGwtPmNsZWFyc2l6ZXMuc2l6ZSgpICogNCk7CisgICAgICAgIGJ1Zm1ldGEuc2V0RGF0YShrS2V5RW5jcnlwdGVkU2l6ZXMsIDAsCisgICAgICAgICAgICAgICAgc21wbC0+ZW5jcnlwdGVkc2l6ZXMuYXJyYXkoKSwgc21wbC0+ZW5jcnlwdGVkc2l6ZXMuc2l6ZSgpICogNCk7CisgICAgICAgIGJ1Zm1ldGEuc2V0SW50MzIoa0tleUNyeXB0b0RlZmF1bHRJVlNpemUsIG1EZWZhdWx0SVZTaXplKTsKKyAgICAgICAgYnVmbWV0YS5zZXRJbnQzMihrS2V5Q3J5cHRvTW9kZSwgbUNyeXB0b01vZGUpOworICAgICAgICBidWZtZXRhLnNldERhdGEoa0tleUNyeXB0b0tleSwgMCwgbUNyeXB0b0tleSwgMTYpOworICAgICAgICBidWZtZXRhLnNldEludDMyKGtLZXlFbmNyeXB0ZWRCeXRlQmxvY2ssIG1EZWZhdWx0RW5jcnlwdGVkQnl0ZUJsb2NrKTsKKyAgICAgICAgYnVmbWV0YS5zZXRJbnQzMihrS2V5U2tpcEJ5dGVCbG9jaywgbURlZmF1bHRTa2lwQnl0ZUJsb2NrKTsKKworICAgICAgICB1aW50MzJfdCB0eXBlID0gMDsKKyAgICAgICAgY29uc3Qgdm9pZCAqaXYgPSBOVUxMOworICAgICAgICBzaXplX3QgaXZsZW5ndGggPSAwOworICAgICAgICBpZiAoIW1Gb3JtYXQuZmluZERhdGEoCisgICAgICAgICAgICAgICAga0tleUNyeXB0b0lWLCAmdHlwZSwgJml2LCAmaXZsZW5ndGgpKSB7CisgICAgICAgICAgICBpdiA9IHNtcGwtPml2OworICAgICAgICAgICAgaXZsZW5ndGggPSAxNjsgLy8gdXNlIDE2IG9yIHRoZSBhY3R1YWwgc2l6ZT8KKyAgICAgICAgfQorICAgICAgICBidWZtZXRhLnNldERhdGEoa0tleUNyeXB0b0lWLCAwLCBpdiwgaXZsZW5ndGgpOworCisgICAgfQorCisgICAgaWYgKCghbUlzQVZDICYmICFtSXNIRVZDKXx8IG1XYW50c05BTEZyYWdtZW50cykgeworICAgICAgICBpZiAobmV3QnVmZmVyKSB7CisgICAgICAgICAgICBpZiAoIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBtQnVmZmVyLT5zaXplKCksIHNpemUpKSB7CisgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOworCisgICAgICAgICAgICAgICAgQUxPR0UoImZyYWdtZW50ZWRSZWFkIEVSUk9SX01BTEZPUk1FRCBzaXplICV6dSIsIHNpemUpOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNzaXplX3QgbnVtX2J5dGVzX3JlYWQgPQorICAgICAgICAgICAgICAgIG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCAodWludDhfdCAqKW1CdWZmZXItPmRhdGEoKSwgc2l6ZSk7CisKKyAgICAgICAgICAgIGlmIChudW1fYnl0ZXNfcmVhZCA8IChzc2l6ZV90KXNpemUpIHsKKyAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CisKKyAgICAgICAgICAgICAgICBBTE9HRSgiaS9vIGVycm9yIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOworICAgICAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIHNpemUpOworICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCisgICAgICAgICAgICAgICAgICAgIGtLZXlUaW1lLCAoKGludDY0X3QpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKKyAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAorICAgICAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sICgoaW50NjRfdClzbXBsLT5kdXJhdGlvbiAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisKKyAgICAgICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMCkgeworICAgICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAorICAgICAgICAgICAgICAgICAgICAgICAga0tleVRhcmdldFRpbWUsIHRhcmdldFNhbXBsZVRpbWVVcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtSXNBVkMpIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBsYXllcklkID0gRmluZEFWQ0xheWVySWQoCisgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKW1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlUZW1wb3JhbExheWVySWQsIGxheWVySWQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaXNTeW5jU2FtcGxlKSB7CisgICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgKyttQ3VycmVudFNhbXBsZUluZGV4OworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtSXNBVkMgJiYgIW1Jc0hFVkMpIHsKKyAgICAgICAgICAgICpvdXQgPSBtQnVmZmVyOworICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CisKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEVhY2ggTkFMIHVuaXQgaXMgc3BsaXQgdXAgaW50byBpdHMgY29uc3RpdHVlbnQgZnJhZ21lbnRzIGFuZAorICAgICAgICAvLyBlYWNoIG9uZSBvZiB0aGVtIHJldHVybmVkIGluIGl0cyBvd24gYnVmZmVyLgorCisgICAgICAgIENIRUNLKG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpID49IG1OQUxMZW5ndGhTaXplKTsKKworICAgICAgICBjb25zdCB1aW50OF90ICpzcmMgPQorICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCkgKyBtQnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKKworICAgICAgICBzaXplX3QgbmFsX3NpemUgPSBwYXJzZU5BTFNpemUoc3JjKTsKKyAgICAgICAgaWYgKG1OQUxMZW5ndGhTaXplID4gU0laRV9NQVggLSBuYWxfc2l6ZSkgeworICAgICAgICAgICAgQUxPR0UoImIvMjQ0NDE1NTMsIGIvMjQ0NDUxMjIiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSAtIG1OQUxMZW5ndGhTaXplIDwgbmFsX3NpemUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJpbmNvbXBsZXRlIE5BTCB1bml0LiIpOworCisgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqY2xvbmUgPSBtQnVmZmVyLT5jbG9uZSgpOworICAgICAgICBDSEVDSyhjbG9uZSAhPSBOVUxMKTsKKyAgICAgICAgY2xvbmUtPnNldF9yYW5nZShtQnVmZmVyLT5yYW5nZV9vZmZzZXQoKSArIG1OQUxMZW5ndGhTaXplLCBuYWxfc2l6ZSk7CisKKyAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKKyAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKAorICAgICAgICAgICAgICAgIG1CdWZmZXItPnJhbmdlX29mZnNldCgpICsgbU5BTExlbmd0aFNpemUgKyBuYWxfc2l6ZSwKKyAgICAgICAgICAgICAgICBtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSAtIG1OQUxMZW5ndGhTaXplIC0gbmFsX3NpemUpOworCisgICAgICAgIGlmIChtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgICpvdXQgPSBjbG9uZTsKKworICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIndob2xlIE5BTCIpOworICAgICAgICAvLyBXaG9sZSBOQUwgdW5pdHMgYXJlIHJldHVybmVkIGJ1dCBlYWNoIGZyYWdtZW50IGlzIHByZWZpeGVkIGJ5CisgICAgICAgIC8vIHRoZSBzdGFydCBjb2RlICgweDAwIDAwIDAwIDAxKS4KKyAgICAgICAgc3NpemVfdCBudW1fYnl0ZXNfcmVhZCA9IDA7CisgICAgICAgIGludDMyX3QgZHJtID0gMDsKKyAgICAgICAgYm9vbCB1c2VzRFJNID0gKG1Gb3JtYXQuZmluZEludDMyKGtLZXlJc0RSTSwgJmRybSkgJiYgZHJtICE9IDApOworICAgICAgICB2b2lkICpkYXRhID0gTlVMTDsKKyAgICAgICAgYm9vbCBpc01hbEZvcm1lZCA9IGZhbHNlOworICAgICAgICBpZiAodXNlc0RSTSkgeworICAgICAgICAgICAgaWYgKG1CdWZmZXIgPT0gTlVMTCB8fCAhaXNJblJhbmdlKChzaXplX3QpMHUsIG1CdWZmZXItPnNpemUoKSwgc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICBpc01hbEZvcm1lZCA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRhdGEgPSBtQnVmZmVyLT5kYXRhKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQzMl90IG1heF9zaXplOworICAgICAgICAgICAgaWYgKCFtRm9ybWF0LmZpbmRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCAmbWF4X3NpemUpCisgICAgICAgICAgICAgICAgICAgIHx8ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgKHNpemVfdCltYXhfc2l6ZSwgc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICBpc01hbEZvcm1lZCA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRhdGEgPSBtU3JjQnVmZmVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzTWFsRm9ybWVkIHx8IGRhdGEgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoImlzTWFsRm9ybWVkIHNpemUgJXp1Iiwgc2l6ZSk7CisgICAgICAgICAgICBpZiAobUJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgICAgICBudW1fYnl0ZXNfcmVhZCA9IG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBkYXRhLCBzaXplKTsKKworICAgICAgICBpZiAobnVtX2J5dGVzX3JlYWQgPCAoc3NpemVfdClzaXplKSB7CisgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKworICAgICAgICAgICAgQUxPR0UoImkvbyBlcnJvciIpOworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHVzZXNEUk0pIHsKKyAgICAgICAgICAgIENIRUNLKG1CdWZmZXIgIT0gTlVMTCk7CisgICAgICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UoMCwgc2l6ZSk7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmRzdERhdGEgPSAodWludDhfdCAqKW1CdWZmZXItPmRhdGEoKTsKKyAgICAgICAgICAgIHNpemVfdCBzcmNPZmZzZXQgPSAwOworICAgICAgICAgICAgc2l6ZV90IGRzdE9mZnNldCA9IDA7CisKKyAgICAgICAgICAgIHdoaWxlIChzcmNPZmZzZXQgPCBzaXplKSB7CisgICAgICAgICAgICAgICAgaXNNYWxGb3JtZWQgPSAhaXNJblJhbmdlKChzaXplX3QpMHUsIHNpemUsIHNyY09mZnNldCwgbU5BTExlbmd0aFNpemUpOworICAgICAgICAgICAgICAgIHNpemVfdCBuYWxMZW5ndGggPSAwOworICAgICAgICAgICAgICAgIGlmICghaXNNYWxGb3JtZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbmFsTGVuZ3RoID0gcGFyc2VOQUxTaXplKCZtU3JjQnVmZmVyW3NyY09mZnNldF0pOworICAgICAgICAgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbU5BTExlbmd0aFNpemU7CisgICAgICAgICAgICAgICAgICAgIGlzTWFsRm9ybWVkID0gIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBzaXplLCBzcmNPZmZzZXQsIG5hbExlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhaXNJblJhbmdlKChzaXplX3QpMHUsIG1CdWZmZXItPnNpemUoKSwgZHN0T2Zmc2V0LCAoc2l6ZV90KTR1KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgbUJ1ZmZlci0+c2l6ZSgpLCBkc3RPZmZzZXQgKyA0LCBuYWxMZW5ndGgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChpc01hbEZvcm1lZCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiVmlkZW8gaXMgbWFsZm9ybWVkOyBuYWxMZW5ndGggJXp1IiwgbmFsTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobmFsTGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGRzdE9mZnNldCA+IFNJWkVfTUFYIC0gNCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICsgNCA+IFNJWkVfTUFYIC0gbmFsTGVuZ3RoIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQgKyA0ICsgbmFsTGVuZ3RoID4gbUJ1ZmZlci0+c2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJiLzI2MzY1MzQ5IDogJXp1ICV6dSIsIGRzdE9mZnNldCwgbUJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNjM2NTM0OSIpOworICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKKyAgICAgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7CisgICAgICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOworICAgICAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoJmRzdERhdGFbZHN0T2Zmc2V0XSwgJm1TcmNCdWZmZXJbc3JjT2Zmc2V0XSwgbmFsTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbmFsTGVuZ3RoOworICAgICAgICAgICAgICAgIGRzdE9mZnNldCArPSBuYWxMZW5ndGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDSEVDS19FUShzcmNPZmZzZXQsIHNpemUpOworICAgICAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKKyAgICAgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBkc3RPZmZzZXQpOworICAgICAgICB9CisKKyAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCisgICAgICAgICAgICAgICAga0tleVRpbWUsICgoaW50NjRfdCljdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOworICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sICgoaW50NjRfdClzbXBsLT5kdXJhdGlvbiAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisKKyAgICAgICAgaWYgKHRhcmdldFNhbXBsZVRpbWVVcyA+PSAwKSB7CisgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAga0tleVRhcmdldFRpbWUsIHRhcmdldFNhbXBsZVRpbWVVcyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNTeW5jU2FtcGxlKSB7CisgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgICAgICB9CisKKyAgICAgICAgKyttQ3VycmVudFNhbXBsZUluZGV4OworCisgICAgICAgICpvdXQgPSBtQnVmZmVyOworICAgICAgICBtQnVmZmVyID0gTlVMTDsKKworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorfQorCitNUEVHNEV4dHJhY3Rvcjo6VHJhY2sgKk1QRUc0RXh0cmFjdG9yOjpmaW5kVHJhY2tCeU1pbWVQcmVmaXgoCisgICAgICAgIGNvbnN0IGNoYXIgKm1pbWVQcmVmaXgpIHsKKyAgICBmb3IgKFRyYWNrICp0cmFjayA9IG1GaXJzdFRyYWNrOyB0cmFjayAhPSBOVUxMOyB0cmFjayA9IHRyYWNrLT5uZXh0KSB7CisgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgICAgIGlmICh0cmFjay0+bWV0YS5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKQorICAgICAgICAgICAgICAgICYmICFzdHJuY2FzZWNtcChtaW1lLCBtaW1lUHJlZml4LCBzdHJsZW4obWltZVByZWZpeCkpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJhY2s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGJvb2wgTGVnYWN5U25pZmZNUEVHNChEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkgeworICAgIHVpbnQ4X3QgaGVhZGVyWzhdOworCisgICAgc3NpemVfdCBuID0gc291cmNlLT5yZWFkQXQoNCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSk7CisgICAgaWYgKG4gPCAoc3NpemVfdClzaXplb2YoaGVhZGVyKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFtZW1jbXAoaGVhZGVyLCAiZnR5cDNncCIsIDcpIHx8ICFtZW1jbXAoaGVhZGVyLCAiZnR5cG1wNDIiLCA4KQorICAgICAgICB8fCAhbWVtY21wKGhlYWRlciwgImZ0eXAzZ3I2IiwgOCkgfHwgIW1lbWNtcChoZWFkZXIsICJmdHlwM2dzNiIsIDgpCisgICAgICAgIHx8ICFtZW1jbXAoaGVhZGVyLCAiZnR5cDNnZTYiLCA4KSB8fCAhbWVtY21wKGhlYWRlciwgImZ0eXAzZ2c2IiwgOCkKKyAgICAgICAgfHwgIW1lbWNtcChoZWFkZXIsICJmdHlwaXNvbSIsIDgpIHx8ICFtZW1jbXAoaGVhZGVyLCAiZnR5cE00ViAiLCA4KQorICAgICAgICB8fCAhbWVtY21wKGhlYWRlciwgImZ0eXBNNEEgIiwgOCkgfHwgIW1lbWNtcChoZWFkZXIsICJmdHlwZjR2ICIsIDgpCisgICAgICAgIHx8ICFtZW1jbXAoaGVhZGVyLCAiZnR5cGtkZGkiLCA4KSB8fCAhbWVtY21wKGhlYWRlciwgImZ0eXBNNFZQIiwgOCkKKyAgICAgICAgfHwgIW1lbWNtcChoZWFkZXIsICJmdHlwbWlmMSIsIDgpIHx8ICFtZW1jbXAoaGVhZGVyLCAiZnR5cGhlaWMiLCA4KQorICAgICAgICB8fCAhbWVtY21wKGhlYWRlciwgImZ0eXBtc2YxIiwgOCkgfHwgIW1lbWNtcChoZWFkZXIsICJmdHlwaGV2YyIsIDgpKSB7CisgICAgICAgICpjb25maWRlbmNlID0gMC40OworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgaXNDb21wYXRpYmxlQnJhbmQodWludDMyX3QgZm91cmNjKSB7CisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtDb21wYXRpYmxlQnJhbmRzW10gPSB7CisgICAgICAgIEZPVVJDQygnaScsICdzJywgJ28nLCAnbScpLAorICAgICAgICBGT1VSQ0MoJ2knLCAncycsICdvJywgJzInKSwKKyAgICAgICAgRk9VUkNDKCdhJywgJ3YnLCAnYycsICcxJyksCisgICAgICAgIEZPVVJDQygnaCcsICd2JywgJ2MnLCAnMScpLAorICAgICAgICBGT1VSQ0MoJ2gnLCAnZScsICd2JywgJzEnKSwKKyAgICAgICAgRk9VUkNDKCczJywgJ2cnLCAncCcsICc0JyksCisgICAgICAgIEZPVVJDQygnbScsICdwJywgJzQnLCAnMScpLAorICAgICAgICBGT1VSQ0MoJ20nLCAncCcsICc0JywgJzInKSwKKyAgICAgICAgRk9VUkNDKCdkJywgJ2EnLCAncycsICdoJyksCisKKyAgICAgICAgLy8gV29uJ3QgcHJvbWlzZSB0aGF0IHRoZSBmb2xsb3dpbmcgZmlsZSB0eXBlcyBjYW4gYmUgcGxheWVkLgorICAgICAgICAvLyBKdXN0IGdpdmUgdGhlc2UgZmlsZSB0eXBlcyBhIGNoYW5jZS4KKyAgICAgICAgRk9VUkNDKCdxJywgJ3QnLCAnICcsICcgJyksICAvLyBBcHBsZSdzIFF1aWNrVGltZQorICAgICAgICBGT1VSQ0MoJ00nLCAnUycsICdOJywgJ1YnKSwgIC8vIFNvbnkncyBQU1AKKworICAgICAgICBGT1VSQ0MoJzMnLCAnZycsICcyJywgJ2EnKSwgIC8vIDNHUFAyCisgICAgICAgIEZPVVJDQygnMycsICdnJywgJzInLCAnYicpLAorICAgICAgICBGT1VSQ0MoJ20nLCAnaScsICdmJywgJzEnKSwgIC8vIEhFSUYgaW1hZ2UKKyAgICAgICAgRk9VUkNDKCdoJywgJ2UnLCAnaScsICdjJyksICAvLyBIRUlGIGltYWdlCisgICAgICAgIEZPVVJDQygnbScsICdzJywgJ2YnLCAnMScpLCAgLy8gSEVJRiBpbWFnZSBzZXF1ZW5jZQorICAgICAgICBGT1VSQ0MoJ2gnLCAnZScsICd2JywgJ2MnKSwgIC8vIEhFSUYgaW1hZ2Ugc2VxdWVuY2UKKyAgICB9OworCisgICAgZm9yIChzaXplX3QgaSA9IDA7CisgICAgICAgICBpIDwgc2l6ZW9mKGtDb21wYXRpYmxlQnJhbmRzKSAvIHNpemVvZihrQ29tcGF0aWJsZUJyYW5kc1swXSk7CisgICAgICAgICArK2kpIHsKKyAgICAgICAgaWYgKGtDb21wYXRpYmxlQnJhbmRzW2ldID09IGZvdXJjYykgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIEF0dGVtcHQgdG8gYWN0dWFsbHkgcGFyc2UgdGhlICdmdHlwJyBhdG9tIGFuZCBkZXRlcm1pbmUgaWYgYSBzdWl0YWJsZQorLy8gY29tcGF0aWJsZSBicmFuZCBpcyBwcmVzZW50LgorLy8gQWxzbyB0cnkgdG8gaWRlbnRpZnkgd2hlcmUgdGhpcyBmaWxlJ3MgbWV0YWRhdGEgZW5kcworLy8gKGVuZCBvZiB0aGUgJ21vb3YnIGF0b20pIGFuZCByZXBvcnQgaXQgdG8gdGhlIGNhbGxlciBhcyBwYXJ0IG9mCisvLyB0aGUgbWV0YWRhdGEuCitzdGF0aWMgYm9vbCBCZXR0ZXJTbmlmZk1QRUc0KERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKSB7CisgICAgLy8gV2Ugc2NhbiB1cCB0byAxMjggYnl0ZXMgdG8gaWRlbnRpZnkgdGhpcyBmaWxlIGFzIGFuIE1QNC4KKyAgICBzdGF0aWMgY29uc3Qgb2ZmNjRfdCBrTWF4U2Nhbk9mZnNldCA9IDEyOGxsOworCisgICAgb2ZmNjRfdCBvZmZzZXQgPSAwbGw7CisgICAgYm9vbCBmb3VuZEdvb2RGaWxlVHlwZSA9IGZhbHNlOworICAgIG9mZjY0X3QgbW9vdkF0b21FbmRPZmZzZXQgPSAtMWxsOworICAgIGJvb2wgZG9uZSA9IGZhbHNlOworCisgICAgd2hpbGUgKCFkb25lICYmIG9mZnNldCA8IGtNYXhTY2FuT2Zmc2V0KSB7CisgICAgICAgIHVpbnQzMl90IGhkclsyXTsKKyAgICAgICAgaWYgKHNvdXJjZS0+cmVhZEF0KG9mZnNldCwgaGRyLCA4KSA8IDgpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQ2NF90IGNodW5rU2l6ZSA9IG50b2hsKGhkclswXSk7CisgICAgICAgIHVpbnQzMl90IGNodW5rVHlwZSA9IG50b2hsKGhkclsxXSk7CisgICAgICAgIG9mZjY0X3QgY2h1bmtEYXRhT2Zmc2V0ID0gb2Zmc2V0ICsgODsKKworICAgICAgICBpZiAoY2h1bmtTaXplID09IDEpIHsKKyAgICAgICAgICAgIGlmIChzb3VyY2UtPnJlYWRBdChvZmZzZXQgKyA4LCAmY2h1bmtTaXplLCA4KSA8IDgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNodW5rU2l6ZSA9IG50b2g2NChjaHVua1NpemUpOworICAgICAgICAgICAgY2h1bmtEYXRhT2Zmc2V0ICs9IDg7CisKKyAgICAgICAgICAgIGlmIChjaHVua1NpemUgPCAxNikgeworICAgICAgICAgICAgICAgIC8vIFRoZSBzbWFsbGVzdCB2YWxpZCBjaHVuayBpcyAxNiBieXRlcyBsb25nIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIGlmIChjaHVua1NpemUgPCA4KSB7CisgICAgICAgICAgICAvLyBUaGUgc21hbGxlc3QgdmFsaWQgY2h1bmsgaXMgOCBieXRlcyBsb25nLgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gKGRhdGFfb2Zmc2V0IC0gb2Zmc2V0KSBpcyBlaXRoZXIgOCBvciAxNgorICAgICAgICBvZmY2NF90IGNodW5rRGF0YVNpemUgPSBjaHVua1NpemUgLSAoY2h1bmtEYXRhT2Zmc2V0IC0gb2Zmc2V0KTsKKyAgICAgICAgaWYgKGNodW5rRGF0YVNpemUgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiYi8yMzU0MDkxNCIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgY2hhciBjaHVua3N0cmluZ1s1XTsKKyAgICAgICAgTWFrZUZvdXJDQ1N0cmluZyhjaHVua1R5cGUsIGNodW5rc3RyaW5nKTsKKyAgICAgICAgQUxPR1YoInNhdyBjaHVuayB0eXBlICVzLCBzaXplICUiIFBSSXU2NCAiIEAgJWxsZCIsIGNodW5rc3RyaW5nLCBjaHVua1NpemUsIChsb25nIGxvbmcpb2Zmc2V0KTsKKyAgICAgICAgc3dpdGNoIChjaHVua1R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgRk9VUkNDKCdmJywgJ3QnLCAneScsICdwJyk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNodW5rRGF0YVNpemUgPCA4KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBudW1Db21wYXRpYmxlQnJhbmRzID0gKGNodW5rRGF0YVNpemUgLSA4KSAvIDQ7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1Db21wYXRpYmxlQnJhbmRzICsgMjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgdGhpcyBpbmRleCwgaXQgcmVmZXJzIHRvIHRoZSBtaW5vclZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3QgYSBicmFuZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYnJhbmQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtEYXRhT2Zmc2V0ICsgNCAqIGksICZicmFuZCwgNCkgPCA0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBicmFuZCA9IG50b2hsKGJyYW5kKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoaXNDb21wYXRpYmxlQnJhbmQoYnJhbmQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEdvb2RGaWxlVHlwZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghZm91bmRHb29kRmlsZVR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIEZPVVJDQygnbScsICdvJywgJ28nLCAndicpOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1vb3ZBdG9tRW5kT2Zmc2V0ID0gb2Zmc2V0ICsgY2h1bmtTaXplOworCisgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBvZmZzZXQgKz0gY2h1bmtTaXplOworICAgIH0KKworICAgIGlmICghZm91bmRHb29kRmlsZVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgICpjb25maWRlbmNlID0gMC40ZjsKKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgTWVkaWFFeHRyYWN0b3IqIENyZWF0ZUV4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlLCB2b2lkICopIHsKKyAgICByZXR1cm4gbmV3IE1QRUc0RXh0cmFjdG9yKHNvdXJjZSk7Cit9CisKK3N0YXRpYyBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgU25pZmYoCisgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlLCB2b2lkICoqLAorICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICopIHsKKyAgICBpZiAoQmV0dGVyU25pZmZNUEVHNChzb3VyY2UsIGNvbmZpZGVuY2UpKSB7CisgICAgICAgIHJldHVybiBDcmVhdGVFeHRyYWN0b3I7CisgICAgfQorCisgICAgaWYgKExlZ2FjeVNuaWZmTVBFRzQoc291cmNlLCBjb25maWRlbmNlKSkgeworICAgICAgICBBTE9HVygiSWRlbnRpZmllZCBzdXBwb3J0ZWQgbXBlZzQgdGhyb3VnaCBMZWdhY3lTbmlmZk1QRUc0LiIpOworICAgICAgICByZXR1cm4gQ3JlYXRlRXh0cmFjdG9yOworICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCitleHRlcm4gIkMiIHsKKy8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKK19fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKK01lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgeworICAgIHJldHVybiB7CisgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTiwKKyAgICAgICAgVVVJRCgiMjc1NzVjNjctNDQxNy00YzU0LThkM2QtOGU2MjY5ODVhMTY0IiksCisgICAgICAgIDEsIC8vIHZlcnNpb24KKyAgICAgICAgIk1QNCBFeHRyYWN0b3IiLAorICAgICAgICBTbmlmZgorICAgIH07Cit9CisKK30gLy8gZXh0ZXJuICJDIgorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L01QRUc0RXh0cmFjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VhMDk2MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L01QRUc0RXh0cmFjdG9yLmgKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1QRUc0X0VYVFJBQ1RPUl9IXworCisjZGVmaW5lIE1QRUc0X0VYVFJBQ1RPUl9IXworCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CitzdHJ1Y3QgQU1lc3NhZ2U7CitjbGFzcyBEYXRhU291cmNlQmFzZTsKK3N0cnVjdCBDYWNoZWRSYW5nZWREYXRhU291cmNlOworY2xhc3MgU2FtcGxlVGFibGU7CitjbGFzcyBTdHJpbmc4OworbmFtZXNwYWNlIGhlaWYgeworY2xhc3MgSXRlbVRhYmxlOworfQordXNpbmcgaGVpZjo6SXRlbVRhYmxlOworCitzdHJ1Y3QgU2lkeEVudHJ5IHsKKyAgICBzaXplX3QgbVNpemU7CisgICAgdWludDMyX3QgbUR1cmF0aW9uVXM7Cit9OworCitzdHJ1Y3QgVHJleCB7CisgICAgdWludDMyX3QgdHJhY2tfSUQ7CisgICAgdWludDMyX3QgZGVmYXVsdF9zYW1wbGVfZGVzY3JpcHRpb25faW5kZXg7CisgICAgdWludDMyX3QgZGVmYXVsdF9zYW1wbGVfZHVyYXRpb247CisgICAgdWludDMyX3QgZGVmYXVsdF9zYW1wbGVfc2l6ZTsKKyAgICB1aW50MzJfdCBkZWZhdWx0X3NhbXBsZV9mbGFnczsKK307CisKK2NsYXNzIE1QRUc0RXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBNUEVHNEV4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlLCBjb25zdCBjaGFyICptaW1lID0gTlVMTCk7CisKKyAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOworICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKTsKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgY29uc3Q7CisgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJNUEVHNEV4dHJhY3RvciI7IH0KKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfk1QRUc0RXh0cmFjdG9yKCk7CisKK3ByaXZhdGU6CisKKyAgICBzdHJ1Y3QgUHNzaEluZm8geworICAgICAgICB1aW50OF90IHV1aWRbMTZdOworICAgICAgICB1aW50MzJfdCBkYXRhbGVuOworICAgICAgICB1aW50OF90ICpkYXRhOworICAgIH07CisgICAgc3RydWN0IFRyYWNrIHsKKyAgICAgICAgVHJhY2sgKm5leHQ7CisgICAgICAgIE1ldGFEYXRhQmFzZSBtZXRhOworICAgICAgICB1aW50MzJfdCB0aW1lc2NhbGU7CisgICAgICAgIHNwPFNhbXBsZVRhYmxlPiBzYW1wbGVUYWJsZTsKKyAgICAgICAgYm9vbCBpbmNsdWRlc19leHBlbnNpdmVfbWV0YWRhdGE7CisgICAgICAgIGJvb2wgc2tpcFRyYWNrOworICAgICAgICBib29sIGhhc19lbHN0OworICAgICAgICBpbnQ2NF90IGVsc3RfbWVkaWFfdGltZTsKKyAgICAgICAgdWludDY0X3QgZWxzdF9zZWdtZW50X2R1cmF0aW9uOworICAgICAgICBib29sIHN1YnNhbXBsZV9lbmNyeXB0aW9uOworICAgIH07CisKKyAgICBWZWN0b3I8U2lkeEVudHJ5PiBtU2lkeEVudHJpZXM7CisgICAgb2ZmNjRfdCBtTW9vZk9mZnNldDsKKyAgICBib29sIG1Nb29mRm91bmQ7CisgICAgYm9vbCBtTWRhdEZvdW5kOworCisgICAgVmVjdG9yPFBzc2hJbmZvPiBtUHNzaDsKKworICAgIFZlY3RvcjxUcmV4PiBtVHJleDsKKworICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBDYWNoZWRSYW5nZWREYXRhU291cmNlICptQ2FjaGVkU291cmNlOworICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CisgICAgdWludDMyX3QgbUhlYWRlclRpbWVzY2FsZTsKKyAgICBib29sIG1Jc1FUOworICAgIGJvb2wgbUlzSGVpZjsKKyAgICBib29sIG1IYXNNb292Qm94OworICAgIGJvb2wgbVByZWZlckhlaWY7CisKKyAgICBUcmFjayAqbUZpcnN0VHJhY2ssICptTGFzdFRyYWNrOworCisgICAgTWV0YURhdGFCYXNlIG1GaWxlTWV0YURhdGE7CisKKyAgICBWZWN0b3I8dWludDMyX3Q+IG1QYXRoOworICAgIFN0cmluZzggbUxhc3RDb21tZW50TWVhbjsKKyAgICBTdHJpbmc4IG1MYXN0Q29tbWVudE5hbWU7CisgICAgU3RyaW5nOCBtTGFzdENvbW1lbnREYXRhOworCisgICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIEFTdHJpbmc+IG1NZXRhS2V5TWFwOworCisgICAgc3RhdHVzX3QgcmVhZE1ldGFEYXRhKCk7CisgICAgc3RhdHVzX3QgcGFyc2VDaHVuayhvZmY2NF90ICpvZmZzZXQsIGludCBkZXB0aCk7CisgICAgc3RhdHVzX3QgcGFyc2VJVHVuZXNNZXRhRGF0YShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOworICAgIHN0YXR1c190IHBhcnNlQ29sb3JJbmZvKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CisgICAgc3RhdHVzX3QgcGFyc2UzR1BQTWV0YURhdGEob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplLCBpbnQgZGVwdGgpOworICAgIHZvaWQgcGFyc2VJRDN2Mk1ldGFEYXRhKG9mZjY0X3Qgb2Zmc2V0KTsKKyAgICBzdGF0dXNfdCBwYXJzZVFUTWV0YUtleShvZmY2NF90IGRhdGFfb2Zmc2V0LCBzaXplX3QgZGF0YV9zaXplKTsKKyAgICBzdGF0dXNfdCBwYXJzZVFUTWV0YVZhbChpbnQzMl90IGtleUlkLCBvZmY2NF90IGRhdGFfb2Zmc2V0LCBzaXplX3QgZGF0YV9zaXplKTsKKworICAgIHN0YXR1c190IHVwZGF0ZUF1ZGlvVHJhY2tJbmZvRnJvbUVTRFNfTVBFRzRBdWRpbygKKyAgICAgICAgICAgIGNvbnN0IHZvaWQgKmVzZHNfZGF0YSwgc2l6ZV90IGVzZHNfc2l6ZSk7CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgdmVyaWZ5VHJhY2soVHJhY2sgKnRyYWNrKTsKKworICAgIHNwPEl0ZW1UYWJsZT4gbUl0ZW1UYWJsZTsKKworICAgIHN0YXR1c190IHBhcnNlVHJhY2tIZWFkZXIob2ZmNjRfdCBkYXRhX29mZnNldCwgb2ZmNjRfdCBkYXRhX3NpemUpOworCisgICAgc3RhdHVzX3QgcGFyc2VTZWdtZW50SW5kZXgob2ZmNjRfdCBkYXRhX29mZnNldCwgc2l6ZV90IGRhdGFfc2l6ZSk7CisKKyAgICBUcmFjayAqZmluZFRyYWNrQnlNaW1lUHJlZml4KGNvbnN0IGNoYXIgKm1pbWVQcmVmaXgpOworCisgICAgc3RhdHVzX3QgcGFyc2VBQzNTYW1wbGVFbnRyeShvZmY2NF90IG9mZnNldCk7CisgICAgc3RhdHVzX3QgcGFyc2VBQzNTcGVjaWZpY0JveChvZmY2NF90IG9mZnNldCwgdWludDE2X3Qgc2FtcGxlUmF0ZSk7CisKKyAgICBNUEVHNEV4dHJhY3Rvcihjb25zdCBNUEVHNEV4dHJhY3RvciAmKTsKKyAgICBNUEVHNEV4dHJhY3RvciAmb3BlcmF0b3I9KGNvbnN0IE1QRUc0RXh0cmFjdG9yICYpOworfTsKKworYm9vbCBTbmlmZk1QRUc0KAorICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UsCisgICAgICAgIHNwPEFNZXNzYWdlPiAqKTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNUEVHNF9FWFRSQUNUT1JfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL05PVElDRSBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L05PVElDRQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL05PVElDRQpjb3B5IHRvIG1lZGlhL2V4dHJhY3RvcnMvbXA0L05PVElDRQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlSXRlcmF0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlSXRlcmF0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZWU3YzYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVJdGVyYXRvci5jcHAKQEAgLTAsMCArMSwzNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlNhbXBsZUl0ZXJhdG9yIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiU2FtcGxlSXRlcmF0b3IuaCIKKworI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CisKKyNpbmNsdWRlICJTYW1wbGVUYWJsZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1NhbXBsZUl0ZXJhdG9yOjpTYW1wbGVJdGVyYXRvcihTYW1wbGVUYWJsZSAqdGFibGUpCisgICAgOiBtVGFibGUodGFibGUpLAorICAgICAgbUluaXRpYWxpemVkKGZhbHNlKSwKKyAgICAgIG1UaW1lVG9TYW1wbGVJbmRleCgwKSwKKyAgICAgIG1UVFNTYW1wbGVJbmRleCgwKSwKKyAgICAgIG1UVFNTYW1wbGVUaW1lKDApLAorICAgICAgbVRUU0NvdW50KDApLAorICAgICAgbVRUU0R1cmF0aW9uKDApIHsKKyAgICByZXNldCgpOworfQorCit2b2lkIFNhbXBsZUl0ZXJhdG9yOjpyZXNldCgpIHsKKyAgICBtU2FtcGxlVG9DaHVua0luZGV4ID0gMDsKKyAgICBtRmlyc3RDaHVuayA9IDA7CisgICAgbUZpcnN0Q2h1bmtTYW1wbGVJbmRleCA9IDA7CisgICAgbVN0b3BDaHVuayA9IDA7CisgICAgbVN0b3BDaHVua1NhbXBsZUluZGV4ID0gMDsKKyAgICBtU2FtcGxlc1BlckNodW5rID0gMDsKKyAgICBtQ2h1bmtEZXNjID0gMDsKK30KKworc3RhdHVzX3QgU2FtcGxlSXRlcmF0b3I6OnNlZWtUbyh1aW50MzJfdCBzYW1wbGVJbmRleCkgeworICAgIEFMT0dWKCJzZWVrVG8oJWQpIiwgc2FtcGxlSW5kZXgpOworCisgICAgaWYgKHNhbXBsZUluZGV4ID49IG1UYWJsZS0+bU51bVNhbXBsZVNpemVzKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgIH0KKworICAgIGlmIChtVGFibGUtPm1TYW1wbGVUb0NodW5rT2Zmc2V0IDwgMAorICAgICAgICAgICAgfHwgbVRhYmxlLT5tQ2h1bmtPZmZzZXRPZmZzZXQgPCAwCisgICAgICAgICAgICB8fCBtVGFibGUtPm1TYW1wbGVTaXplT2Zmc2V0IDwgMAorICAgICAgICAgICAgfHwgbVRhYmxlLT5tVGltZVRvU2FtcGxlQ291bnQgPT0gMCkgeworCisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgaWYgKG1Jbml0aWFsaXplZCAmJiBtQ3VycmVudFNhbXBsZUluZGV4ID09IHNhbXBsZUluZGV4KSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBpZiAoIW1Jbml0aWFsaXplZCB8fCBzYW1wbGVJbmRleCA8IG1GaXJzdENodW5rU2FtcGxlSW5kZXgpIHsKKyAgICAgICAgcmVzZXQoKTsKKyAgICB9CisKKyAgICBpZiAoc2FtcGxlSW5kZXggPj0gbVN0b3BDaHVua1NhbXBsZUluZGV4KSB7CisgICAgICAgIHN0YXR1c190IGVycjsKKyAgICAgICAgaWYgKChlcnIgPSBmaW5kQ2h1bmtSYW5nZShzYW1wbGVJbmRleCkpICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiZmluZENodW5rUmFuZ2UgZmFpbGVkIik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorCisgICAgQ0hFQ0soc2FtcGxlSW5kZXggPCBtU3RvcENodW5rU2FtcGxlSW5kZXgpOworCisgICAgaWYgKG1TYW1wbGVzUGVyQ2h1bmsgPT0gMCkgeworICAgICAgICBBTE9HRSgiYi8yMjgwMjM0NCIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHVpbnQzMl90IGNodW5rID0KKyAgICAgICAgKHNhbXBsZUluZGV4IC0gbUZpcnN0Q2h1bmtTYW1wbGVJbmRleCkgLyBtU2FtcGxlc1BlckNodW5rCisgICAgICAgICsgbUZpcnN0Q2h1bms7CisKKyAgICBpZiAoIW1Jbml0aWFsaXplZCB8fCBjaHVuayAhPSBtQ3VycmVudENodW5rSW5kZXgpIHsKKyAgICAgICAgc3RhdHVzX3QgZXJyOworICAgICAgICBpZiAoKGVyciA9IGdldENodW5rT2Zmc2V0KGNodW5rLCAmbUN1cnJlbnRDaHVua09mZnNldCkpICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiZ2V0Q2h1bmtPZmZzZXQgcmV0dXJuIGVycm9yIik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisKKyAgICAgICAgbUN1cnJlbnRDaHVua1NhbXBsZVNpemVzLmNsZWFyKCk7CisKKyAgICAgICAgdWludDMyX3QgZmlyc3RDaHVua1NhbXBsZUluZGV4ID0KKyAgICAgICAgICAgIG1GaXJzdENodW5rU2FtcGxlSW5kZXgKKyAgICAgICAgICAgICAgICArIG1TYW1wbGVzUGVyQ2h1bmsgKiAoY2h1bmsgLSBtRmlyc3RDaHVuayk7CisKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1TYW1wbGVzUGVyQ2h1bms7ICsraSkgeworICAgICAgICAgICAgc2l6ZV90IHNhbXBsZVNpemU7CisgICAgICAgICAgICBpZiAoKGVyciA9IGdldFNhbXBsZVNpemVEaXJlY3QoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDaHVua1NhbXBsZUluZGV4ICsgaSwgJnNhbXBsZVNpemUpKSAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJnZXRTYW1wbGVTaXplRGlyZWN0IHJldHVybiBlcnJvciIpOworICAgICAgICAgICAgICAgIG1DdXJyZW50Q2h1bmtTYW1wbGVTaXplcy5jbGVhcigpOworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1DdXJyZW50Q2h1bmtTYW1wbGVTaXplcy5wdXNoKHNhbXBsZVNpemUpOworICAgICAgICB9CisKKyAgICAgICAgbUN1cnJlbnRDaHVua0luZGV4ID0gY2h1bms7CisgICAgfQorCisgICAgdWludDMyX3QgY2h1bmtSZWxhdGl2ZVNhbXBsZUluZGV4ID0KKyAgICAgICAgKHNhbXBsZUluZGV4IC0gbUZpcnN0Q2h1bmtTYW1wbGVJbmRleCkgJSBtU2FtcGxlc1BlckNodW5rOworCisgICAgbUN1cnJlbnRTYW1wbGVPZmZzZXQgPSBtQ3VycmVudENodW5rT2Zmc2V0OworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjaHVua1JlbGF0aXZlU2FtcGxlSW5kZXg7ICsraSkgeworICAgICAgICBtQ3VycmVudFNhbXBsZU9mZnNldCArPSBtQ3VycmVudENodW5rU2FtcGxlU2l6ZXNbaV07CisgICAgfQorCisgICAgbUN1cnJlbnRTYW1wbGVTaXplID0gbUN1cnJlbnRDaHVua1NhbXBsZVNpemVzW2NodW5rUmVsYXRpdmVTYW1wbGVJbmRleF07CisgICAgaWYgKHNhbXBsZUluZGV4IDwgbVRUU1NhbXBsZUluZGV4KSB7CisgICAgICAgIG1UaW1lVG9TYW1wbGVJbmRleCA9IDA7CisgICAgICAgIG1UVFNTYW1wbGVJbmRleCA9IDA7CisgICAgICAgIG1UVFNTYW1wbGVUaW1lID0gMDsKKyAgICAgICAgbVRUU0NvdW50ID0gMDsKKyAgICAgICAgbVRUU0R1cmF0aW9uID0gMDsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgaWYgKChlcnIgPSBmaW5kU2FtcGxlVGltZUFuZER1cmF0aW9uKAorICAgICAgICAgICAgc2FtcGxlSW5kZXgsICZtQ3VycmVudFNhbXBsZVRpbWUsICZtQ3VycmVudFNhbXBsZUR1cmF0aW9uKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoImZpbmRTYW1wbGVUaW1lIHJldHVybiBlcnJvciIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIG1DdXJyZW50U2FtcGxlSW5kZXggPSBzYW1wbGVJbmRleDsKKworICAgIG1Jbml0aWFsaXplZCA9IHRydWU7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFNhbXBsZUl0ZXJhdG9yOjpmaW5kQ2h1bmtSYW5nZSh1aW50MzJfdCBzYW1wbGVJbmRleCkgeworICAgIENIRUNLKHNhbXBsZUluZGV4ID49IG1GaXJzdENodW5rU2FtcGxlSW5kZXgpOworCisgICAgd2hpbGUgKHNhbXBsZUluZGV4ID49IG1TdG9wQ2h1bmtTYW1wbGVJbmRleCkgeworICAgICAgICBpZiAobVNhbXBsZVRvQ2h1bmtJbmRleCA9PSBtVGFibGUtPm1OdW1TYW1wbGVUb0NodW5rT2Zmc2V0cykgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKKyAgICAgICAgfQorCisgICAgICAgIG1GaXJzdENodW5rU2FtcGxlSW5kZXggPSBtU3RvcENodW5rU2FtcGxlSW5kZXg7CisKKyAgICAgICAgY29uc3QgU2FtcGxlVGFibGU6OlNhbXBsZVRvQ2h1bmtFbnRyeSAqZW50cnkgPQorICAgICAgICAgICAgJm1UYWJsZS0+bVNhbXBsZVRvQ2h1bmtFbnRyaWVzW21TYW1wbGVUb0NodW5rSW5kZXhdOworCisgICAgICAgIG1GaXJzdENodW5rID0gZW50cnktPnN0YXJ0Q2h1bms7CisgICAgICAgIG1TYW1wbGVzUGVyQ2h1bmsgPSBlbnRyeS0+c2FtcGxlc1BlckNodW5rOworICAgICAgICBtQ2h1bmtEZXNjID0gZW50cnktPmNodW5rRGVzYzsKKworICAgICAgICBpZiAobVNhbXBsZVRvQ2h1bmtJbmRleCArIDEgPCBtVGFibGUtPm1OdW1TYW1wbGVUb0NodW5rT2Zmc2V0cykgeworICAgICAgICAgICAgbVN0b3BDaHVuayA9IGVudHJ5WzFdLnN0YXJ0Q2h1bms7CisKKyAgICAgICAgICAgIGlmIChtU2FtcGxlc1BlckNodW5rID09IDAgfHwgbVN0b3BDaHVuayA8IG1GaXJzdENodW5rIHx8CisgICAgICAgICAgICAgICAgKG1TdG9wQ2h1bmsgLSBtRmlyc3RDaHVuaykgPiBVSU5UMzJfTUFYIC8gbVNhbXBsZXNQZXJDaHVuayB8fAorICAgICAgICAgICAgICAgICgobVN0b3BDaHVuayAtIG1GaXJzdENodW5rKSAqIG1TYW1wbGVzUGVyQ2h1bmsgPgorICAgICAgICAgICAgICAgICBVSU5UMzJfTUFYIC0gbUZpcnN0Q2h1bmtTYW1wbGVJbmRleCkpIHsKKworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU3RvcENodW5rU2FtcGxlSW5kZXggPQorICAgICAgICAgICAgICAgIG1GaXJzdENodW5rU2FtcGxlSW5kZXgKKyAgICAgICAgICAgICAgICAgICAgKyAobVN0b3BDaHVuayAtIG1GaXJzdENodW5rKSAqIG1TYW1wbGVzUGVyQ2h1bms7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU3RvcENodW5rID0gMHhmZmZmZmZmZjsKKyAgICAgICAgICAgIG1TdG9wQ2h1bmtTYW1wbGVJbmRleCA9IDB4ZmZmZmZmZmY7CisgICAgICAgIH0KKworICAgICAgICArK21TYW1wbGVUb0NodW5rSW5kZXg7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTYW1wbGVJdGVyYXRvcjo6Z2V0Q2h1bmtPZmZzZXQodWludDMyX3QgY2h1bmssIG9mZjY0X3QgKm9mZnNldCkgeworICAgICpvZmZzZXQgPSAwOworCisgICAgaWYgKGNodW5rID49IG1UYWJsZS0+bU51bUNodW5rT2Zmc2V0cykgeworICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOworICAgIH0KKworICAgIGlmIChtVGFibGUtPm1DaHVua09mZnNldFR5cGUgPT0gU2FtcGxlVGFibGU6OmtDaHVua09mZnNldFR5cGUzMikgeworICAgICAgICB1aW50MzJfdCBvZmZzZXQzMjsKKworICAgICAgICBpZiAobVRhYmxlLT5tRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgICAgICAgICBtVGFibGUtPm1DaHVua09mZnNldE9mZnNldCArIDggKyA0ICogY2h1bmssCisgICAgICAgICAgICAgICAgICAgICZvZmZzZXQzMiwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9mZnNldDMyKSkgPCAoc3NpemVfdClzaXplb2Yob2Zmc2V0MzIpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgIH0KKworICAgICAgICAqb2Zmc2V0ID0gbnRvaGwob2Zmc2V0MzIpOworICAgIH0gZWxzZSB7CisgICAgICAgIENIRUNLX0VRKG1UYWJsZS0+bUNodW5rT2Zmc2V0VHlwZSwgU2FtcGxlVGFibGU6OmtDaHVua09mZnNldFR5cGU2NCk7CisKKyAgICAgICAgdWludDY0X3Qgb2Zmc2V0NjQ7CisgICAgICAgIGlmIChtVGFibGUtPm1EYXRhU291cmNlLT5yZWFkQXQoCisgICAgICAgICAgICAgICAgICAgIG1UYWJsZS0+bUNodW5rT2Zmc2V0T2Zmc2V0ICsgOCArIDggKiBjaHVuaywKKyAgICAgICAgICAgICAgICAgICAgJm9mZnNldDY0LAorICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2Zmc2V0NjQpKSA8IChzc2l6ZV90KXNpemVvZihvZmZzZXQ2NCkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfQorCisgICAgICAgICpvZmZzZXQgPSBudG9oNjQob2Zmc2V0NjQpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU2FtcGxlSXRlcmF0b3I6OmdldFNhbXBsZVNpemVEaXJlY3QoCisgICAgICAgIHVpbnQzMl90IHNhbXBsZUluZGV4LCBzaXplX3QgKnNpemUpIHsKKyAgICAqc2l6ZSA9IDA7CisKKyAgICBpZiAoc2FtcGxlSW5kZXggPj0gbVRhYmxlLT5tTnVtU2FtcGxlU2l6ZXMpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKKyAgICB9CisKKyAgICBpZiAobVRhYmxlLT5tRGVmYXVsdFNhbXBsZVNpemUgPiAwKSB7CisgICAgICAgICpzaXplID0gbVRhYmxlLT5tRGVmYXVsdFNhbXBsZVNpemU7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1UYWJsZS0+bVNhbXBsZVNpemVGaWVsZFNpemUpIHsKKyAgICAgICAgY2FzZSAzMjoKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgeDsKKyAgICAgICAgICAgIGlmIChtVGFibGUtPm1EYXRhU291cmNlLT5yZWFkQXQoCisgICAgICAgICAgICAgICAgICAgICAgICBtVGFibGUtPm1TYW1wbGVTaXplT2Zmc2V0ICsgMTIgKyA0ICogc2FtcGxlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAmeCwgc2l6ZW9mKHgpKSA8IChzc2l6ZV90KXNpemVvZih4KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgKnNpemUgPSBudG9obCh4KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgeDsKKyAgICAgICAgICAgIGlmIChtVGFibGUtPm1EYXRhU291cmNlLT5yZWFkQXQoCisgICAgICAgICAgICAgICAgICAgICAgICBtVGFibGUtPm1TYW1wbGVTaXplT2Zmc2V0ICsgMTIgKyAyICogc2FtcGxlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAmeCwgc2l6ZW9mKHgpKSA8IChzc2l6ZV90KXNpemVvZih4KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgKnNpemUgPSBudG9ocyh4KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSA4OgorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHg7CisgICAgICAgICAgICBpZiAobVRhYmxlLT5tRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgICAgICAgICAgICAgbVRhYmxlLT5tU2FtcGxlU2l6ZU9mZnNldCArIDEyICsgc2FtcGxlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAmeCwgc2l6ZW9mKHgpKSA8IChzc2l6ZV90KXNpemVvZih4KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgKnNpemUgPSB4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19FUShtVGFibGUtPm1TYW1wbGVTaXplRmllbGRTaXplLCA0dSk7CisKKyAgICAgICAgICAgIHVpbnQ4X3QgeDsKKyAgICAgICAgICAgIGlmIChtVGFibGUtPm1EYXRhU291cmNlLT5yZWFkQXQoCisgICAgICAgICAgICAgICAgICAgICAgICBtVGFibGUtPm1TYW1wbGVTaXplT2Zmc2V0ICsgMTIgKyBzYW1wbGVJbmRleCAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAmeCwgc2l6ZW9mKHgpKSA8IChzc2l6ZV90KXNpemVvZih4KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgKnNpemUgPSAoc2FtcGxlSW5kZXggJiAxKSA/IHggJiAweDBmIDogeCA+PiA0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFNhbXBsZUl0ZXJhdG9yOjpmaW5kU2FtcGxlVGltZUFuZER1cmF0aW9uKAorICAgICAgICB1aW50MzJfdCBzYW1wbGVJbmRleCwgdWludDMyX3QgKnRpbWUsIHVpbnQzMl90ICpkdXJhdGlvbikgeworICAgIGlmIChzYW1wbGVJbmRleCA+PSBtVGFibGUtPm1OdW1TYW1wbGVTaXplcykgeworICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOworICAgIH0KKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGlmIChtVFRTU2FtcGxlSW5kZXggPiBVSU5UMzJfTUFYIC0gbVRUU0NvdW50KSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOworICAgICAgICB9CisgICAgICAgIGlmKHNhbXBsZUluZGV4IDwgbVRUU1NhbXBsZUluZGV4ICsgbVRUU0NvdW50KSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAobVRpbWVUb1NhbXBsZUluZGV4ID09IG1UYWJsZS0+bVRpbWVUb1NhbXBsZUNvdW50IHx8CisgICAgICAgICAgICAobVRUU0R1cmF0aW9uICE9IDAgJiYgbVRUU0NvdW50ID4gVUlOVDMyX01BWCAvIG1UVFNEdXJhdGlvbikgfHwKKyAgICAgICAgICAgIG1UVFNTYW1wbGVUaW1lID4gVUlOVDMyX01BWCAtIChtVFRTQ291bnQgKiBtVFRTRHVyYXRpb24pKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOworICAgICAgICB9CisKKyAgICAgICAgbVRUU1NhbXBsZUluZGV4ICs9IG1UVFNDb3VudDsKKyAgICAgICAgbVRUU1NhbXBsZVRpbWUgKz0gbVRUU0NvdW50ICogbVRUU0R1cmF0aW9uOworCisgICAgICAgIG1UVFNDb3VudCA9IG1UYWJsZS0+bVRpbWVUb1NhbXBsZVsyICogbVRpbWVUb1NhbXBsZUluZGV4XTsKKyAgICAgICAgbVRUU0R1cmF0aW9uID0gbVRhYmxlLT5tVGltZVRvU2FtcGxlWzIgKiBtVGltZVRvU2FtcGxlSW5kZXggKyAxXTsKKworICAgICAgICArK21UaW1lVG9TYW1wbGVJbmRleDsKKyAgICB9CisKKyAgICAqdGltZSA9IG1UVFNTYW1wbGVUaW1lICsgbVRUU0R1cmF0aW9uICogKHNhbXBsZUluZGV4IC0gbVRUU1NhbXBsZUluZGV4KTsKKworICAgIGludDMyX3Qgb2Zmc2V0ID0gbVRhYmxlLT5nZXRDb21wb3NpdGlvblRpbWVPZmZzZXQoc2FtcGxlSW5kZXgpOworICAgIGlmICgob2Zmc2V0IDwgMCAmJiAqdGltZSA8IChvZmZzZXQgPT0gSU5UMzJfTUlOID8KKyAgICAgICAgICAgIElOVDMyX01BWCA6IHVpbnQzMl90KC1vZmZzZXQpKSkgfHwKKyAgICAgICAgICAgIChvZmZzZXQgPiAwICYmICp0aW1lID4gVUlOVDMyX01BWCAtIG9mZnNldCkpIHsKKyAgICAgICAgQUxPR0UoIiV1ICsgJWQgd291bGQgb3ZlcmZsb3ciLCAqdGltZSwgb2Zmc2V0KTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKKyAgICB9CisgICAgaWYgKG9mZnNldCA+IDApIHsKKyAgICAgICAgKnRpbWUgKz0gb2Zmc2V0OworICAgIH0gZWxzZSB7CisgICAgICAgICp0aW1lIC09IChvZmZzZXQgPT0gSU5UMzJfTUlOID8gSU5UMzJfTUFYIDogKC1vZmZzZXQpKTsKKyAgICB9CisKKyAgICAqZHVyYXRpb24gPSBtVFRTRHVyYXRpb247CisKKyAgICByZXR1cm4gT0s7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU2FtcGxlSXRlcmF0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZUl0ZXJhdG9yLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU2FtcGxlSXRlcmF0b3IuaApyZW5hbWUgdG8gbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlSXRlcmF0b3IuaApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlVGFibGUuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlVGFibGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYzM1M2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVUYWJsZS5jcHAKQEAgLTAsMCArMSwxMDA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJTYW1wbGVUYWJsZSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGxpbWl0cz4KKworI2luY2x1ZGUgIlNhbXBsZVRhYmxlLmgiCisjaW5jbHVkZSAiU2FtcGxlSXRlcmF0b3IuaCIKKworI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CisKKy8qIFRPRE86IHJlbW92ZSBhZnRlciBiZWluZyBtZXJnZWQgaW50byBvdGhlciBicmFuY2hlcyAqLworI2lmbmRlZiBVSU5UMzJfTUFYCisjZGVmaW5lIFVJTlQzMl9NQVggICAgICAgKDQyOTQ5NjcyOTVVKQorI2VuZGlmCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gc3RhdGljCitjb25zdCB1aW50MzJfdCBTYW1wbGVUYWJsZTo6a0NodW5rT2Zmc2V0VHlwZTMyID0gRk9VUkNDKCdzJywgJ3QnLCAnYycsICdvJyk7CisvLyBzdGF0aWMKK2NvbnN0IHVpbnQzMl90IFNhbXBsZVRhYmxlOjprQ2h1bmtPZmZzZXRUeXBlNjQgPSBGT1VSQ0MoJ2MnLCAnbycsICc2JywgJzQnKTsKKy8vIHN0YXRpYworY29uc3QgdWludDMyX3QgU2FtcGxlVGFibGU6OmtTYW1wbGVTaXplVHlwZTMyID0gRk9VUkNDKCdzJywgJ3QnLCAncycsICd6Jyk7CisvLyBzdGF0aWMKK2NvbnN0IHVpbnQzMl90IFNhbXBsZVRhYmxlOjprU2FtcGxlU2l6ZVR5cGVDb21wYWN0ID0gRk9VUkNDKCdzJywgJ3QnLCAneicsICcyJyk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NvbnN0IG9mZjY0X3Qga01heE9mZnNldCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8b2ZmNjRfdD46Om1heCgpOworCitzdHJ1Y3QgU2FtcGxlVGFibGU6OkNvbXBvc2l0aW9uRGVsdGFMb29rdXAgeworICAgIENvbXBvc2l0aW9uRGVsdGFMb29rdXAoKTsKKworICAgIHZvaWQgc2V0RW50cmllcygKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgKmRlbHRhRW50cmllcywgc2l6ZV90IG51bURlbHRhRW50cmllcyk7CisKKyAgICBpbnQzMl90IGdldENvbXBvc2l0aW9uVGltZU9mZnNldCh1aW50MzJfdCBzYW1wbGVJbmRleCk7CisKK3ByaXZhdGU6CisgICAgTXV0ZXggbUxvY2s7CisKKyAgICBjb25zdCBpbnQzMl90ICptRGVsdGFFbnRyaWVzOworICAgIHNpemVfdCBtTnVtRGVsdGFFbnRyaWVzOworCisgICAgc2l6ZV90IG1DdXJyZW50RGVsdGFFbnRyeTsKKyAgICBzaXplX3QgbUN1cnJlbnRFbnRyeVNhbXBsZUluZGV4OworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ29tcG9zaXRpb25EZWx0YUxvb2t1cCk7Cit9OworCitTYW1wbGVUYWJsZTo6Q29tcG9zaXRpb25EZWx0YUxvb2t1cDo6Q29tcG9zaXRpb25EZWx0YUxvb2t1cCgpCisgICAgOiBtRGVsdGFFbnRyaWVzKE5VTEwpLAorICAgICAgbU51bURlbHRhRW50cmllcygwKSwKKyAgICAgIG1DdXJyZW50RGVsdGFFbnRyeSgwKSwKKyAgICAgIG1DdXJyZW50RW50cnlTYW1wbGVJbmRleCgwKSB7Cit9CisKK3ZvaWQgU2FtcGxlVGFibGU6OkNvbXBvc2l0aW9uRGVsdGFMb29rdXA6OnNldEVudHJpZXMoCisgICAgICAgIGNvbnN0IGludDMyX3QgKmRlbHRhRW50cmllcywgc2l6ZV90IG51bURlbHRhRW50cmllcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7CisKKyAgICBtRGVsdGFFbnRyaWVzID0gZGVsdGFFbnRyaWVzOworICAgIG1OdW1EZWx0YUVudHJpZXMgPSBudW1EZWx0YUVudHJpZXM7CisgICAgbUN1cnJlbnREZWx0YUVudHJ5ID0gMDsKKyAgICBtQ3VycmVudEVudHJ5U2FtcGxlSW5kZXggPSAwOworfQorCitpbnQzMl90IFNhbXBsZVRhYmxlOjpDb21wb3NpdGlvbkRlbHRhTG9va3VwOjpnZXRDb21wb3NpdGlvblRpbWVPZmZzZXQoCisgICAgICAgIHVpbnQzMl90IHNhbXBsZUluZGV4KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKKworICAgIGlmIChtRGVsdGFFbnRyaWVzID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKHNhbXBsZUluZGV4IDwgbUN1cnJlbnRFbnRyeVNhbXBsZUluZGV4KSB7CisgICAgICAgIG1DdXJyZW50RGVsdGFFbnRyeSA9IDA7CisgICAgICAgIG1DdXJyZW50RW50cnlTYW1wbGVJbmRleCA9IDA7CisgICAgfQorCisgICAgd2hpbGUgKG1DdXJyZW50RGVsdGFFbnRyeSA8IG1OdW1EZWx0YUVudHJpZXMpIHsKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlQ291bnQgPSBtRGVsdGFFbnRyaWVzWzIgKiBtQ3VycmVudERlbHRhRW50cnldOworICAgICAgICBpZiAoc2FtcGxlSW5kZXggPCBtQ3VycmVudEVudHJ5U2FtcGxlSW5kZXggKyBzYW1wbGVDb3VudCkgeworICAgICAgICAgICAgcmV0dXJuIG1EZWx0YUVudHJpZXNbMiAqIG1DdXJyZW50RGVsdGFFbnRyeSArIDFdOworICAgICAgICB9CisKKyAgICAgICAgbUN1cnJlbnRFbnRyeVNhbXBsZUluZGV4ICs9IHNhbXBsZUNvdW50OworICAgICAgICArK21DdXJyZW50RGVsdGFFbnRyeTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworU2FtcGxlVGFibGU6OlNhbXBsZVRhYmxlKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCisgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAorICAgICAgbUNodW5rT2Zmc2V0T2Zmc2V0KC0xKSwKKyAgICAgIG1DaHVua09mZnNldFR5cGUoMCksCisgICAgICBtTnVtQ2h1bmtPZmZzZXRzKDApLAorICAgICAgbVNhbXBsZVRvQ2h1bmtPZmZzZXQoLTEpLAorICAgICAgbU51bVNhbXBsZVRvQ2h1bmtPZmZzZXRzKDApLAorICAgICAgbVNhbXBsZVNpemVPZmZzZXQoLTEpLAorICAgICAgbVNhbXBsZVNpemVGaWVsZFNpemUoMCksCisgICAgICBtRGVmYXVsdFNhbXBsZVNpemUoMCksCisgICAgICBtTnVtU2FtcGxlU2l6ZXMoMCksCisgICAgICBtSGFzVGltZVRvU2FtcGxlKGZhbHNlKSwKKyAgICAgIG1UaW1lVG9TYW1wbGVDb3VudCgwKSwKKyAgICAgIG1UaW1lVG9TYW1wbGUoTlVMTCksCisgICAgICBtU2FtcGxlVGltZUVudHJpZXMoTlVMTCksCisgICAgICBtQ29tcG9zaXRpb25UaW1lRGVsdGFFbnRyaWVzKE5VTEwpLAorICAgICAgbU51bUNvbXBvc2l0aW9uVGltZURlbHRhRW50cmllcygwKSwKKyAgICAgIG1Db21wb3NpdGlvbkRlbHRhTG9va3VwKG5ldyBDb21wb3NpdGlvbkRlbHRhTG9va3VwKSwKKyAgICAgIG1TeW5jU2FtcGxlT2Zmc2V0KC0xKSwKKyAgICAgIG1OdW1TeW5jU2FtcGxlcygwKSwKKyAgICAgIG1TeW5jU2FtcGxlcyhOVUxMKSwKKyAgICAgIG1MYXN0U3luY1NhbXBsZUluZGV4KDApLAorICAgICAgbVNhbXBsZVRvQ2h1bmtFbnRyaWVzKE5VTEwpLAorICAgICAgbVRvdGFsU2l6ZSgwKSB7CisgICAgbVNhbXBsZUl0ZXJhdG9yID0gbmV3IFNhbXBsZUl0ZXJhdG9yKHRoaXMpOworfQorCitTYW1wbGVUYWJsZTo6flNhbXBsZVRhYmxlKCkgeworICAgIGRlbGV0ZVtdIG1TYW1wbGVUb0NodW5rRW50cmllczsKKyAgICBtU2FtcGxlVG9DaHVua0VudHJpZXMgPSBOVUxMOworCisgICAgZGVsZXRlW10gbVN5bmNTYW1wbGVzOworICAgIG1TeW5jU2FtcGxlcyA9IE5VTEw7CisKKyAgICBkZWxldGVbXSBtVGltZVRvU2FtcGxlOworICAgIG1UaW1lVG9TYW1wbGUgPSBOVUxMOworCisgICAgZGVsZXRlIG1Db21wb3NpdGlvbkRlbHRhTG9va3VwOworICAgIG1Db21wb3NpdGlvbkRlbHRhTG9va3VwID0gTlVMTDsKKworICAgIGRlbGV0ZVtdIG1Db21wb3NpdGlvblRpbWVEZWx0YUVudHJpZXM7CisgICAgbUNvbXBvc2l0aW9uVGltZURlbHRhRW50cmllcyA9IE5VTEw7CisKKyAgICBkZWxldGVbXSBtU2FtcGxlVGltZUVudHJpZXM7CisgICAgbVNhbXBsZVRpbWVFbnRyaWVzID0gTlVMTDsKKworICAgIGRlbGV0ZSBtU2FtcGxlSXRlcmF0b3I7CisgICAgbVNhbXBsZUl0ZXJhdG9yID0gTlVMTDsKK30KKworYm9vbCBTYW1wbGVUYWJsZTo6aXNWYWxpZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUNodW5rT2Zmc2V0T2Zmc2V0ID49IDAKKyAgICAgICAgJiYgbVNhbXBsZVRvQ2h1bmtPZmZzZXQgPj0gMAorICAgICAgICAmJiBtU2FtcGxlU2l6ZU9mZnNldCA+PSAwCisgICAgICAgICYmIG1IYXNUaW1lVG9TYW1wbGU7Cit9CisKK3N0YXR1c190IFNhbXBsZVRhYmxlOjpzZXRDaHVua09mZnNldFBhcmFtcygKKyAgICAgICAgdWludDMyX3QgdHlwZSwgb2ZmNjRfdCBkYXRhX29mZnNldCwgc2l6ZV90IGRhdGFfc2l6ZSkgeworICAgIGlmIChtQ2h1bmtPZmZzZXRPZmZzZXQgPj0gMCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIENIRUNLKHR5cGUgPT0ga0NodW5rT2Zmc2V0VHlwZTMyIHx8IHR5cGUgPT0ga0NodW5rT2Zmc2V0VHlwZTY0KTsKKworICAgIG1DaHVua09mZnNldE9mZnNldCA9IGRhdGFfb2Zmc2V0OworICAgIG1DaHVua09mZnNldFR5cGUgPSB0eXBlOworCisgICAgaWYgKGRhdGFfc2l6ZSA8IDgpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICB1aW50OF90IGhlYWRlcls4XTsKKyAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkgPCAoc3NpemVfdClzaXplb2YoaGVhZGVyKSkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorCisgICAgaWYgKFUzMl9BVChoZWFkZXIpICE9IDApIHsKKyAgICAgICAgLy8gRXhwZWN0ZWQgdmVyc2lvbiA9IDAsIGZsYWdzID0gMC4KKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBtTnVtQ2h1bmtPZmZzZXRzID0gVTMyX0FUKCZoZWFkZXJbNF0pOworCisgICAgaWYgKG1DaHVua09mZnNldFR5cGUgPT0ga0NodW5rT2Zmc2V0VHlwZTMyKSB7CisgICAgICBpZiAoKGRhdGFfc2l6ZSAtIDgpIC8gNCA8IG1OdW1DaHVua09mZnNldHMpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKChkYXRhX3NpemUgLSA4KSAvIDggPCBtTnVtQ2h1bmtPZmZzZXRzKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTYW1wbGVUYWJsZTo6c2V0U2FtcGxlVG9DaHVua1BhcmFtcygKKyAgICAgICAgb2ZmNjRfdCBkYXRhX29mZnNldCwgc2l6ZV90IGRhdGFfc2l6ZSkgeworICAgIGlmIChtU2FtcGxlVG9DaHVua09mZnNldCA+PSAwKSB7CisgICAgICAgIC8vIGFscmVhZHkgc2V0CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgaWYgKGRhdGFfb2Zmc2V0IDwgMCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIG1TYW1wbGVUb0NodW5rT2Zmc2V0ID0gZGF0YV9vZmZzZXQ7CisKKyAgICBpZiAoZGF0YV9zaXplIDwgOCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHVpbnQ4X3QgaGVhZGVyWzhdOworICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKSA8IChzc2l6ZV90KXNpemVvZihoZWFkZXIpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisKKyAgICBpZiAoVTMyX0FUKGhlYWRlcikgIT0gMCkgeworICAgICAgICAvLyBFeHBlY3RlZCB2ZXJzaW9uID0gMCwgZmxhZ3MgPSAwLgorICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIG1OdW1TYW1wbGVUb0NodW5rT2Zmc2V0cyA9IFUzMl9BVCgmaGVhZGVyWzRdKTsKKworICAgIGlmICgoZGF0YV9zaXplIC0gOCkgLyBzaXplb2YoU2FtcGxlVG9DaHVua0VudHJ5KSA8IG1OdW1TYW1wbGVUb0NodW5rT2Zmc2V0cykgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIGlmICgodWludDY0X3Qpa01heFRvdGFsU2l6ZSAvIHNpemVvZihTYW1wbGVUb0NodW5rRW50cnkpIDw9CisgICAgICAgICAgICAodWludDY0X3QpbU51bVNhbXBsZVRvQ2h1bmtPZmZzZXRzKSB7CisgICAgICAgIEFMT0dFKCJTYW1wbGUtdG8tY2h1bmsgdGFibGUgc2l6ZSB0b28gbGFyZ2UuIik7CisgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CisgICAgfQorCisgICAgbVRvdGFsU2l6ZSArPSAodWludDY0X3QpbU51bVNhbXBsZVRvQ2h1bmtPZmZzZXRzICoKKyAgICAgICAgICAgIHNpemVvZihTYW1wbGVUb0NodW5rRW50cnkpOworICAgIGlmIChtVG90YWxTaXplID4ga01heFRvdGFsU2l6ZSkgeworICAgICAgICBBTE9HRSgiU2FtcGxlLXRvLWNodW5rIHRhYmxlIHNpemUgd291bGQgbWFrZSBzYW1wbGUgdGFibGUgdG9vIGxhcmdlLlxuIgorICAgICAgICAgICAgICAiICAgIFJlcXVlc3RlZCBzYW1wbGUtdG8tY2h1bmsgdGFibGUgc2l6ZSA9ICVsbHVcbiIKKyAgICAgICAgICAgICAgIiAgICBFdmVudHVhbCBzYW1wbGUgdGFibGUgc2l6ZSA+PSAlbGx1XG4iCisgICAgICAgICAgICAgICIgICAgQWxsb3dlZCBzYW1wbGUgdGFibGUgc2l6ZSA9ICVsbHVcbiIsCisgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbU51bVNhbXBsZVRvQ2h1bmtPZmZzZXRzICoKKyAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoU2FtcGxlVG9DaHVua0VudHJ5KSwKKyAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyltVG90YWxTaXplLAorICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWtNYXhUb3RhbFNpemUpOworICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOworICAgIH0KKworICAgIG1TYW1wbGVUb0NodW5rRW50cmllcyA9CisgICAgICAgIG5ldyAoc3RkOjpub3Rocm93KSBTYW1wbGVUb0NodW5rRW50cnlbbU51bVNhbXBsZVRvQ2h1bmtPZmZzZXRzXTsKKyAgICBpZiAoIW1TYW1wbGVUb0NodW5rRW50cmllcykgeworICAgICAgICBBTE9HRSgiQ2Fubm90IGFsbG9jYXRlIHNhbXBsZS10by1jaHVuayB0YWJsZSB3aXRoICVsbHUgZW50cmllcy4iLAorICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbU51bVNhbXBsZVRvQ2h1bmtPZmZzZXRzKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKKyAgICB9CisKKyAgICBpZiAobU51bVNhbXBsZVRvQ2h1bmtPZmZzZXRzID09IDApIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGlmICgob2ZmNjRfdCkoa01heE9mZnNldCAtIDggLQorICAgICAgICAgICAgKChtTnVtU2FtcGxlVG9DaHVua09mZnNldHMgLSAxKSAqIHNpemVvZihTYW1wbGVUb0NodW5rRW50cnkpKSkKKyAgICAgICAgICAgIDwgbVNhbXBsZVRvQ2h1bmtPZmZzZXQpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbU51bVNhbXBsZVRvQ2h1bmtPZmZzZXRzOyArK2kpIHsKKyAgICAgICAgdWludDhfdCBidWZmZXJbc2l6ZW9mKFNhbXBsZVRvQ2h1bmtFbnRyeSldOworCisgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgICAgICAgICBtU2FtcGxlVG9DaHVua09mZnNldCArIDggKyBpICogc2l6ZW9mKFNhbXBsZVRvQ2h1bmtFbnRyeSksCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGJ1ZmZlcikpCisgICAgICAgICAgICAgICAgIT0gKHNzaXplX3Qpc2l6ZW9mKGJ1ZmZlcikpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfQorICAgICAgICAvLyBjaHVuayBpbmRleCBpcyAxIGJhc2VkIGluIHRoZSBzcGVjLgorICAgICAgICBpZiAoVTMyX0FUKGJ1ZmZlcikgPCAxKSB7CisgICAgICAgICAgICBBTE9HRSgiYi8yMzUzNDE2MCIpOworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdlIHdhbnQgdGhlIGNodW5rIGluZGV4IHRvIGJlIDAtYmFzZWQuCisgICAgICAgIG1TYW1wbGVUb0NodW5rRW50cmllc1tpXS5zdGFydENodW5rID0gVTMyX0FUKGJ1ZmZlcikgLSAxOworICAgICAgICBtU2FtcGxlVG9DaHVua0VudHJpZXNbaV0uc2FtcGxlc1BlckNodW5rID0gVTMyX0FUKCZidWZmZXJbNF0pOworICAgICAgICBtU2FtcGxlVG9DaHVua0VudHJpZXNbaV0uY2h1bmtEZXNjID0gVTMyX0FUKCZidWZmZXJbOF0pOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU2FtcGxlVGFibGU6OnNldFNhbXBsZVNpemVQYXJhbXMoCisgICAgICAgIHVpbnQzMl90IHR5cGUsIG9mZjY0X3QgZGF0YV9vZmZzZXQsIHNpemVfdCBkYXRhX3NpemUpIHsKKyAgICBpZiAobVNhbXBsZVNpemVPZmZzZXQgPj0gMCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIENIRUNLKHR5cGUgPT0ga1NhbXBsZVNpemVUeXBlMzIgfHwgdHlwZSA9PSBrU2FtcGxlU2l6ZVR5cGVDb21wYWN0KTsKKworICAgIG1TYW1wbGVTaXplT2Zmc2V0ID0gZGF0YV9vZmZzZXQ7CisKKyAgICBpZiAoZGF0YV9zaXplIDwgMTIpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICB1aW50OF90IGhlYWRlclsxMl07CisgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCisgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpIDwgKHNzaXplX3Qpc2l6ZW9mKGhlYWRlcikpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKworICAgIGlmIChVMzJfQVQoaGVhZGVyKSAhPSAwKSB7CisgICAgICAgIC8vIEV4cGVjdGVkIHZlcnNpb24gPSAwLCBmbGFncyA9IDAuCisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgbURlZmF1bHRTYW1wbGVTaXplID0gVTMyX0FUKCZoZWFkZXJbNF0pOworICAgIG1OdW1TYW1wbGVTaXplcyA9IFUzMl9BVCgmaGVhZGVyWzhdKTsKKyAgICBpZiAobU51bVNhbXBsZVNpemVzID4gKFVJTlQzMl9NQVggLSAxMikgLyAxNikgeworICAgICAgICBBTE9HRSgiYi8yMzI0NzA1NSwgbU51bVNhbXBsZVNpemVzKCV1KSIsIG1OdW1TYW1wbGVTaXplcyk7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgaWYgKHR5cGUgPT0ga1NhbXBsZVNpemVUeXBlMzIpIHsKKyAgICAgICAgbVNhbXBsZVNpemVGaWVsZFNpemUgPSAzMjsKKworICAgICAgICBpZiAobURlZmF1bHRTYW1wbGVTaXplICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkYXRhX3NpemUgPCAxMiArIG1OdW1TYW1wbGVTaXplcyAqIDQpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoKG1EZWZhdWx0U2FtcGxlU2l6ZSAmIDB4ZmZmZmZmMDApICE9IDApIHsKKyAgICAgICAgICAgIC8vIFRoZSBoaWdoIDI0IGJpdHMgYXJlIHJlc2VydmVkIGFuZCBtdXN0IGJlIDAuCisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKKyAgICAgICAgbVNhbXBsZVNpemVGaWVsZFNpemUgPSBtRGVmYXVsdFNhbXBsZVNpemUgJiAweGZmOworICAgICAgICBtRGVmYXVsdFNhbXBsZVNpemUgPSAwOworCisgICAgICAgIGlmIChtU2FtcGxlU2l6ZUZpZWxkU2l6ZSAhPSA0ICYmIG1TYW1wbGVTaXplRmllbGRTaXplICE9IDgKKyAgICAgICAgICAgICYmIG1TYW1wbGVTaXplRmllbGRTaXplICE9IDE2KSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRhdGFfc2l6ZSA8IDEyICsgKG1OdW1TYW1wbGVTaXplcyAqIG1TYW1wbGVTaXplRmllbGRTaXplICsgNCkgLyA4KSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTYW1wbGVUYWJsZTo6c2V0VGltZVRvU2FtcGxlUGFyYW1zKAorICAgICAgICBvZmY2NF90IGRhdGFfb2Zmc2V0LCBzaXplX3QgZGF0YV9zaXplKSB7CisgICAgaWYgKG1IYXNUaW1lVG9TYW1wbGUgfHwgZGF0YV9zaXplIDwgOCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHVpbnQ4X3QgaGVhZGVyWzhdOworICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKSA8IChzc2l6ZV90KXNpemVvZihoZWFkZXIpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisKKyAgICBpZiAoVTMyX0FUKGhlYWRlcikgIT0gMCkgeworICAgICAgICAvLyBFeHBlY3RlZCB2ZXJzaW9uID0gMCwgZmxhZ3MgPSAwLgorICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIG1UaW1lVG9TYW1wbGVDb3VudCA9IFUzMl9BVCgmaGVhZGVyWzRdKTsKKyAgICBpZiAobVRpbWVUb1NhbXBsZUNvdW50ID4gVUlOVDMyX01BWCAvICgyICogc2l6ZW9mKHVpbnQzMl90KSkpIHsKKyAgICAgICAgLy8gQ2hvb3NlIHRoaXMgYm91bmQgYmVjYXVzZQorICAgICAgICAvLyAxKSAyICogc2l6ZW9mKHVpbnQzMl90KSBpcyB0aGUgYW1vdW50IG9mIG1lbW9yeSBuZWVkZWQgZm9yIG9uZQorICAgICAgICAvLyAgICB0aW1lLXRvLXNhbXBsZSBlbnRyeSBpbiB0aGUgdGltZS10by1zYW1wbGUgdGFibGUuCisgICAgICAgIC8vIDIpIG1UaW1lVG9TYW1wbGVDb3VudCBpcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgb2YgdGhlIHRpbWUtdG8tc2FtcGxlCisgICAgICAgIC8vICAgIHRhYmxlLgorICAgICAgICAvLyAzKSBXZSBob3BlIHRoYXQgdGhlIHRhYmxlIHNpemUgZG9lcyBub3QgZXhjZWVkIFVJTlQzMl9NQVguCisgICAgICAgIEFMT0dFKCJUaW1lLXRvLXNhbXBsZSB0YWJsZSBzaXplIHRvbyBsYXJnZS4iKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKKyAgICB9CisKKyAgICAvLyBOb3RlOiBBdCB0aGlzIHBvaW50LCB3ZSBrbm93IHRoYXQgbVRpbWVUb1NhbXBsZUNvdW50ICogMiB3aWxsIG5vdAorICAgIC8vIG92ZXJmbG93IGJlY2F1c2Ugb2YgdGhlIGFib3ZlIGNvbmRpdGlvbi4KKworICAgIHVpbnQ2NF90IGFsbG9jU2l6ZSA9ICh1aW50NjRfdCltVGltZVRvU2FtcGxlQ291bnQgKiAyICogc2l6ZW9mKHVpbnQzMl90KTsKKyAgICBtVG90YWxTaXplICs9IGFsbG9jU2l6ZTsKKyAgICBpZiAobVRvdGFsU2l6ZSA+IGtNYXhUb3RhbFNpemUpIHsKKyAgICAgICAgQUxPR0UoIlRpbWUtdG8tc2FtcGxlIHRhYmxlIHNpemUgd291bGQgbWFrZSBzYW1wbGUgdGFibGUgdG9vIGxhcmdlLlxuIgorICAgICAgICAgICAgICAiICAgIFJlcXVlc3RlZCB0aW1lLXRvLXNhbXBsZSB0YWJsZSBzaXplID0gJWxsdVxuIgorICAgICAgICAgICAgICAiICAgIEV2ZW50dWFsIHNhbXBsZSB0YWJsZSBzaXplID49ICVsbHVcbiIKKyAgICAgICAgICAgICAgIiAgICBBbGxvd2VkIHNhbXBsZSB0YWJsZSBzaXplID0gJWxsdVxuIiwKKyAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylhbGxvY1NpemUsCisgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbVRvdGFsU2l6ZSwKKyAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylrTWF4VG90YWxTaXplKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKKyAgICB9CisKKyAgICBtVGltZVRvU2FtcGxlID0gbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQzMl90W21UaW1lVG9TYW1wbGVDb3VudCAqIDJdOworICAgIGlmICghbVRpbWVUb1NhbXBsZSkgeworICAgICAgICBBTE9HRSgiQ2Fubm90IGFsbG9jYXRlIHRpbWUtdG8tc2FtcGxlIHRhYmxlIHdpdGggJWxsdSBlbnRyaWVzLiIsCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyltVGltZVRvU2FtcGxlQ291bnQpOworICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOworICAgIH0KKworICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0ICsgOCwgbVRpbWVUb1NhbXBsZSwKKyAgICAgICAgICAgIChzaXplX3QpYWxsb2NTaXplKSA8IChzc2l6ZV90KWFsbG9jU2l6ZSkgeworICAgICAgICBBTE9HRSgiSW5jb21wbGV0ZSBkYXRhIHJlYWQgZm9yIHRpbWUtdG8tc2FtcGxlIHRhYmxlLiIpOworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVGltZVRvU2FtcGxlQ291bnQgKiAyOyArK2kpIHsKKyAgICAgICAgbVRpbWVUb1NhbXBsZVtpXSA9IG50b2hsKG1UaW1lVG9TYW1wbGVbaV0pOworICAgIH0KKworICAgIG1IYXNUaW1lVG9TYW1wbGUgPSB0cnVlOworICAgIHJldHVybiBPSzsKK30KKworLy8gTk9URTogcGVyIDE0OTk2LTEyLCB2ZXJzaW9uIDAgY3R0cyBjb250YWlucyB1bnNpZ25lZCB2YWx1ZXMsIHdoaWxlIHZlcnNpb24gMQorLy8gY29udGFpbnMgc2lnbmVkIHZhbHVlcywgaG93ZXZlciBzb21lIHNvZnR3YXJlIGNyZWF0ZXMgdmVyc2lvbiAwIGZpbGVzIHRoYXQKKy8vIGNvbnRhaW4gc2lnbmVkIHZhbHVlcywgc28gd2UncmUgYWx3YXlzIHRyZWF0aW5nIHRoZSB2YWx1ZXMgYXMgc2lnbmVkLAorLy8gcmVnYXJkbGVzcyBvZiB2ZXJzaW9uLgorc3RhdHVzX3QgU2FtcGxlVGFibGU6OnNldENvbXBvc2l0aW9uVGltZVRvU2FtcGxlUGFyYW1zKAorICAgICAgICBvZmY2NF90IGRhdGFfb2Zmc2V0LCBzaXplX3QgZGF0YV9zaXplKSB7CisgICAgQUxPR0koIlRoZXJlIGFyZSByZW9yZGVyZWQgZnJhbWVzIHByZXNlbnQuIik7CisKKyAgICBpZiAobUNvbXBvc2l0aW9uVGltZURlbHRhRW50cmllcyAhPSBOVUxMIHx8IGRhdGFfc2l6ZSA8IDgpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICB1aW50OF90IGhlYWRlcls4XTsKKyAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkKKyAgICAgICAgICAgIDwgKHNzaXplX3Qpc2l6ZW9mKGhlYWRlcikpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKworICAgIHVpbnQzMl90IGZsYWdzID0gVTMyX0FUKGhlYWRlcik7CisgICAgdWludDMyX3QgdmVyc2lvbiA9IGZsYWdzID4+IDI0OworICAgIGZsYWdzICY9IDB4ZmZmZmZmOworCisgICAgaWYgKCh2ZXJzaW9uICE9IDAgJiYgdmVyc2lvbiAhPSAxKSB8fCBmbGFncyAhPSAwKSB7CisgICAgICAgIC8vIEV4cGVjdGVkIHZlcnNpb24gPSAwIG9yIDEsIGZsYWdzID0gMC4KKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBzaXplX3QgbnVtRW50cmllcyA9IFUzMl9BVCgmaGVhZGVyWzRdKTsKKworICAgIGlmICgoKFNJWkVfTUFYIC8gOCkgLSAxIDwgbnVtRW50cmllcykgfHwgKGRhdGFfc2l6ZSAhPSAobnVtRW50cmllcyArIDEpICogOCkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBtTnVtQ29tcG9zaXRpb25UaW1lRGVsdGFFbnRyaWVzID0gbnVtRW50cmllczsKKyAgICB1aW50NjRfdCBhbGxvY1NpemUgPSAodWludDY0X3QpbnVtRW50cmllcyAqIDIgKiBzaXplb2YoaW50MzJfdCk7CisgICAgaWYgKGFsbG9jU2l6ZSA+IGtNYXhUb3RhbFNpemUpIHsKKyAgICAgICAgQUxPR0UoIkNvbXBvc2l0aW9uLXRpbWUtdG8tc2FtcGxlIHRhYmxlIHNpemUgdG9vIGxhcmdlLiIpOworICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOworICAgIH0KKworICAgIG1Ub3RhbFNpemUgKz0gYWxsb2NTaXplOworICAgIGlmIChtVG90YWxTaXplID4ga01heFRvdGFsU2l6ZSkgeworICAgICAgICBBTE9HRSgiQ29tcG9zaXRpb24tdGltZS10by1zYW1wbGUgdGFibGUgd291bGQgbWFrZSBzYW1wbGUgdGFibGUgdG9vIGxhcmdlLlxuIgorICAgICAgICAgICAgICAiICAgIFJlcXVlc3RlZCBjb21wb3NpdGlvbi10aW1lLXRvLXNhbXBsZSB0YWJsZSBzaXplID0gJWxsdVxuIgorICAgICAgICAgICAgICAiICAgIEV2ZW50dWFsIHNhbXBsZSB0YWJsZSBzaXplID49ICVsbHVcbiIKKyAgICAgICAgICAgICAgIiAgICBBbGxvd2VkIHNhbXBsZSB0YWJsZSBzaXplID0gJWxsdVxuIiwKKyAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylhbGxvY1NpemUsCisgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbVRvdGFsU2l6ZSwKKyAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylrTWF4VG90YWxTaXplKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKKyAgICB9CisKKyAgICBtQ29tcG9zaXRpb25UaW1lRGVsdGFFbnRyaWVzID0gbmV3IChzdGQ6Om5vdGhyb3cpIGludDMyX3RbMiAqIG51bUVudHJpZXNdOworICAgIGlmICghbUNvbXBvc2l0aW9uVGltZURlbHRhRW50cmllcykgeworICAgICAgICBBTE9HRSgiQ2Fubm90IGFsbG9jYXRlIGNvbXBvc2l0aW9uLXRpbWUtdG8tc2FtcGxlIHRhYmxlIHdpdGggJWxsdSAiCisgICAgICAgICAgICAgICAgImVudHJpZXMuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZyludW1FbnRyaWVzKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKKyAgICB9CisKKyAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChkYXRhX29mZnNldCArIDgsIG1Db21wb3NpdGlvblRpbWVEZWx0YUVudHJpZXMsCisgICAgICAgICAgICAoc2l6ZV90KWFsbG9jU2l6ZSkgPCAoc3NpemVfdClhbGxvY1NpemUpIHsKKyAgICAgICAgZGVsZXRlW10gbUNvbXBvc2l0aW9uVGltZURlbHRhRW50cmllczsKKyAgICAgICAgbUNvbXBvc2l0aW9uVGltZURlbHRhRW50cmllcyA9IE5VTEw7CisKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgMiAqIG51bUVudHJpZXM7ICsraSkgeworICAgICAgICBtQ29tcG9zaXRpb25UaW1lRGVsdGFFbnRyaWVzW2ldID0gbnRvaGwobUNvbXBvc2l0aW9uVGltZURlbHRhRW50cmllc1tpXSk7CisgICAgfQorCisgICAgbUNvbXBvc2l0aW9uRGVsdGFMb29rdXAtPnNldEVudHJpZXMoCisgICAgICAgICAgICBtQ29tcG9zaXRpb25UaW1lRGVsdGFFbnRyaWVzLCBtTnVtQ29tcG9zaXRpb25UaW1lRGVsdGFFbnRyaWVzKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU2FtcGxlVGFibGU6OnNldFN5bmNTYW1wbGVQYXJhbXMob2ZmNjRfdCBkYXRhX29mZnNldCwgc2l6ZV90IGRhdGFfc2l6ZSkgeworICAgIGlmIChtU3luY1NhbXBsZU9mZnNldCA+PSAwIHx8IGRhdGFfc2l6ZSA8IDgpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICB1aW50OF90IGhlYWRlcls4XTsKKyAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkgPCAoc3NpemVfdClzaXplb2YoaGVhZGVyKSkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorCisgICAgaWYgKFUzMl9BVChoZWFkZXIpICE9IDApIHsKKyAgICAgICAgLy8gRXhwZWN0ZWQgdmVyc2lvbiA9IDAsIGZsYWdzID0gMC4KKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICB1aW50MzJfdCBudW1TeW5jU2FtcGxlcyA9IFUzMl9BVCgmaGVhZGVyWzRdKTsKKworICAgIGlmIChudW1TeW5jU2FtcGxlcyA8IDIpIHsKKyAgICAgICAgQUxPR1YoIlRhYmxlIG9mIHN5bmMgc2FtcGxlcyBpcyBlbXB0eSBvciBoYXMgb25seSBhIHNpbmdsZSBlbnRyeSEiKTsKKyAgICB9CisKKyAgICB1aW50NjRfdCBhbGxvY1NpemUgPSAodWludDY0X3QpbnVtU3luY1NhbXBsZXMgKiBzaXplb2YodWludDMyX3QpOworICAgIGlmIChhbGxvY1NpemUgPiBrTWF4VG90YWxTaXplKSB7CisgICAgICAgIEFMT0dFKCJTeW5jIHNhbXBsZSB0YWJsZSBzaXplIHRvbyBsYXJnZS4iKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKKyAgICB9CisKKyAgICBtVG90YWxTaXplICs9IGFsbG9jU2l6ZTsKKyAgICBpZiAobVRvdGFsU2l6ZSA+IGtNYXhUb3RhbFNpemUpIHsKKyAgICAgICAgQUxPR0UoIlN5bmMgc2FtcGxlIHRhYmxlIHNpemUgd291bGQgbWFrZSBzYW1wbGUgdGFibGUgdG9vIGxhcmdlLlxuIgorICAgICAgICAgICAgICAiICAgIFJlcXVlc3RlZCBzeW5jIHNhbXBsZSB0YWJsZSBzaXplID0gJWxsdVxuIgorICAgICAgICAgICAgICAiICAgIEV2ZW50dWFsIHNhbXBsZSB0YWJsZSBzaXplID49ICVsbHVcbiIKKyAgICAgICAgICAgICAgIiAgICBBbGxvd2VkIHNhbXBsZSB0YWJsZSBzaXplID0gJWxsdVxuIiwKKyAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylhbGxvY1NpemUsCisgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbVRvdGFsU2l6ZSwKKyAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylrTWF4VG90YWxTaXplKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKKyAgICB9CisKKyAgICBtU3luY1NhbXBsZXMgPSBuZXcgKHN0ZDo6bm90aHJvdykgdWludDMyX3RbbnVtU3luY1NhbXBsZXNdOworICAgIGlmICghbVN5bmNTYW1wbGVzKSB7CisgICAgICAgIEFMT0dFKCJDYW5ub3QgYWxsb2NhdGUgc3luYyBzYW1wbGUgdGFibGUgd2l0aCAlbGx1IGVudHJpZXMuIiwKKyAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKW51bVN5bmNTYW1wbGVzKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKKyAgICB9CisKKyAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChkYXRhX29mZnNldCArIDgsIG1TeW5jU2FtcGxlcywKKyAgICAgICAgICAgIChzaXplX3QpYWxsb2NTaXplKSAhPSAoc3NpemVfdClhbGxvY1NpemUpIHsKKyAgICAgICAgZGVsZXRlW10gbVN5bmNTYW1wbGVzOworICAgICAgICBtU3luY1NhbXBsZXMgPSBOVUxMOworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TeW5jU2FtcGxlczsgKytpKSB7CisgICAgICAgIGlmIChtU3luY1NhbXBsZXNbaV0gPT0gMCkgeworICAgICAgICAgICAgQUxPR0UoImIvMzI0MjM4NjIsIHVuZXhwZWN0ZWQgemVybyB2YWx1ZSBpbiBzdHNzIik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBtU3luY1NhbXBsZXNbaV0gPSBudG9obChtU3luY1NhbXBsZXNbaV0pIC0gMTsKKyAgICB9CisKKyAgICBtU3luY1NhbXBsZU9mZnNldCA9IGRhdGFfb2Zmc2V0OworICAgIG1OdW1TeW5jU2FtcGxlcyA9IG51bVN5bmNTYW1wbGVzOworCisgICAgcmV0dXJuIE9LOworfQorCit1aW50MzJfdCBTYW1wbGVUYWJsZTo6Y291bnRDaHVua09mZnNldHMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1OdW1DaHVua09mZnNldHM7Cit9CisKK3VpbnQzMl90IFNhbXBsZVRhYmxlOjpjb3VudFNhbXBsZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1OdW1TYW1wbGVTaXplczsKK30KKworc3RhdHVzX3QgU2FtcGxlVGFibGU6OmdldE1heFNhbXBsZVNpemUoc2l6ZV90ICptYXhfc2l6ZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICAqbWF4X3NpemUgPSAwOworCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1OdW1TYW1wbGVTaXplczsgKytpKSB7CisgICAgICAgIHNpemVfdCBzYW1wbGVfc2l6ZTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gZ2V0U2FtcGxlU2l6ZV9sKGksICZzYW1wbGVfc2l6ZSk7CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzYW1wbGVfc2l6ZSA+ICptYXhfc2l6ZSkgeworICAgICAgICAgICAgKm1heF9zaXplID0gc2FtcGxlX3NpemU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3VpbnQzMl90IGFic19kaWZmZXJlbmNlKHVpbnQzMl90IHRpbWUxLCB1aW50MzJfdCB0aW1lMikgeworICAgIHJldHVybiB0aW1lMSA+IHRpbWUyID8gdGltZTEgLSB0aW1lMiA6IHRpbWUyIC0gdGltZTE7Cit9CisKKy8vIHN0YXRpYworaW50IFNhbXBsZVRhYmxlOjpDb21wYXJlSW5jcmVhc2luZ1RpbWUoY29uc3Qgdm9pZCAqX2EsIGNvbnN0IHZvaWQgKl9iKSB7CisgICAgY29uc3QgU2FtcGxlVGltZUVudHJ5ICphID0gKGNvbnN0IFNhbXBsZVRpbWVFbnRyeSAqKV9hOworICAgIGNvbnN0IFNhbXBsZVRpbWVFbnRyeSAqYiA9IChjb25zdCBTYW1wbGVUaW1lRW50cnkgKilfYjsKKworICAgIGlmIChhLT5tQ29tcG9zaXRpb25UaW1lIDwgYi0+bUNvbXBvc2l0aW9uVGltZSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIGlmIChhLT5tQ29tcG9zaXRpb25UaW1lID4gYi0+bUNvbXBvc2l0aW9uVGltZSkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBTYW1wbGVUYWJsZTo6YnVpbGRTYW1wbGVFbnRyaWVzVGFibGUoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtU2FtcGxlVGltZUVudHJpZXMgIT0gTlVMTCB8fCBtTnVtU2FtcGxlU2l6ZXMgPT0gMCkgeworICAgICAgICBpZiAobU51bVNhbXBsZVNpemVzID09IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJiLzIzMjQ3MDU1LCBtTnVtU2FtcGxlU2l6ZXMoJXUpIiwgbU51bVNhbXBsZVNpemVzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbVRvdGFsU2l6ZSArPSAodWludDY0X3QpbU51bVNhbXBsZVNpemVzICogc2l6ZW9mKFNhbXBsZVRpbWVFbnRyeSk7CisgICAgaWYgKG1Ub3RhbFNpemUgPiBrTWF4VG90YWxTaXplKSB7CisgICAgICAgIEFMT0dFKCJTYW1wbGUgZW50cnkgdGFibGUgc2l6ZSB3b3VsZCBtYWtlIHNhbXBsZSB0YWJsZSB0b28gbGFyZ2UuXG4iCisgICAgICAgICAgICAgICIgICAgUmVxdWVzdGVkIHNhbXBsZSBlbnRyeSB0YWJsZSBzaXplID0gJWxsdVxuIgorICAgICAgICAgICAgICAiICAgIEV2ZW50dWFsIHNhbXBsZSB0YWJsZSBzaXplID49ICVsbHVcbiIKKyAgICAgICAgICAgICAgIiAgICBBbGxvd2VkIHNhbXBsZSB0YWJsZSBzaXplID0gJWxsdVxuIiwKKyAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyltTnVtU2FtcGxlU2l6ZXMgKiBzaXplb2YoU2FtcGxlVGltZUVudHJ5KSwKKyAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyltVG90YWxTaXplLAorICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWtNYXhUb3RhbFNpemUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbVNhbXBsZVRpbWVFbnRyaWVzID0gbmV3IChzdGQ6Om5vdGhyb3cpIFNhbXBsZVRpbWVFbnRyeVttTnVtU2FtcGxlU2l6ZXNdOworICAgIGlmICghbVNhbXBsZVRpbWVFbnRyaWVzKSB7CisgICAgICAgIEFMT0dFKCJDYW5ub3QgYWxsb2NhdGUgc2FtcGxlIGVudHJ5IHRhYmxlIHdpdGggJWxsdSBlbnRyaWVzLiIsCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyltTnVtU2FtcGxlU2l6ZXMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdWludDMyX3Qgc2FtcGxlSW5kZXggPSAwOworICAgIHVpbnQzMl90IHNhbXBsZVRpbWUgPSAwOworCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1UaW1lVG9TYW1wbGVDb3VudDsgKytpKSB7CisgICAgICAgIHVpbnQzMl90IG4gPSBtVGltZVRvU2FtcGxlWzIgKiBpXTsKKyAgICAgICAgdWludDMyX3QgZGVsdGEgPSBtVGltZVRvU2FtcGxlWzIgKiBpICsgMV07CisKKyAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IG47ICsraikgeworICAgICAgICAgICAgaWYgKHNhbXBsZUluZGV4IDwgbU51bVNhbXBsZVNpemVzKSB7CisgICAgICAgICAgICAgICAgLy8gVGVjaG5pY2FsbHkgdGhpcyBzaG91bGQgYWx3YXlzIGJlIHRoZSBjYXNlIGlmIHRoZSBmaWxlCisgICAgICAgICAgICAgICAgLy8gaXMgd2VsbC1mb3JtZWQsIGJ1dCB5b3Uga25vdy4uLiB0aGVyZSdzIChnYXNwKSBtYWxmb3JtZWQKKyAgICAgICAgICAgICAgICAvLyBjb250ZW50IG91dCB0aGVyZS4KKworICAgICAgICAgICAgICAgIG1TYW1wbGVUaW1lRW50cmllc1tzYW1wbGVJbmRleF0ubVNhbXBsZUluZGV4ID0gc2FtcGxlSW5kZXg7CisKKyAgICAgICAgICAgICAgICBpbnQzMl90IGNvbXBUaW1lRGVsdGEgPQorICAgICAgICAgICAgICAgICAgICBtQ29tcG9zaXRpb25EZWx0YUxvb2t1cC0+Z2V0Q29tcG9zaXRpb25UaW1lT2Zmc2V0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUluZGV4KTsKKworICAgICAgICAgICAgICAgIGlmICgoY29tcFRpbWVEZWx0YSA8IDAgJiYgc2FtcGxlVGltZSA8CisgICAgICAgICAgICAgICAgICAgICAgICAoY29tcFRpbWVEZWx0YSA9PSBJTlQzMl9NSU4gPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMl9NQVggOiB1aW50MzJfdCgtY29tcFRpbWVEZWx0YSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGNvbXBUaW1lRGVsdGEgPiAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUgPiBVSU5UMzJfTUFYIC0gY29tcFRpbWVEZWx0YSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiV1ICsgJWQgd291bGQgb3ZlcmZsb3csIGNsYW1waW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lLCBjb21wVGltZURlbHRhKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBUaW1lRGVsdGEgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUgPSBVSU5UMzJfTUFYOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvbXBUaW1lRGVsdGEgPSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1TYW1wbGVUaW1lRW50cmllc1tzYW1wbGVJbmRleF0ubUNvbXBvc2l0aW9uVGltZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBjb21wVGltZURlbHRhID4gMCA/IHNhbXBsZVRpbWUgKyBjb21wVGltZURlbHRhOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lIC0gKC1jb21wVGltZURlbHRhKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgKytzYW1wbGVJbmRleDsKKyAgICAgICAgICAgIGlmIChzYW1wbGVUaW1lID4gVUlOVDMyX01BWCAtIGRlbHRhKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiV1ICsgJXUgd291bGQgb3ZlcmZsb3csIGNsYW1waW5nIiwKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSwgZGVsdGEpOworICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUgPSBVSU5UMzJfTUFYOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzYW1wbGVUaW1lICs9IGRlbHRhOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcXNvcnQobVNhbXBsZVRpbWVFbnRyaWVzLCBtTnVtU2FtcGxlU2l6ZXMsIHNpemVvZihTYW1wbGVUaW1lRW50cnkpLAorICAgICAgICAgIENvbXBhcmVJbmNyZWFzaW5nVGltZSk7Cit9CisKK3N0YXR1c190IFNhbXBsZVRhYmxlOjpmaW5kU2FtcGxlQXRUaW1lKAorICAgICAgICB1aW50NjRfdCByZXFfdGltZSwgdWludDY0X3Qgc2NhbGVfbnVtLCB1aW50NjRfdCBzY2FsZV9kZW4sCisgICAgICAgIHVpbnQzMl90ICpzYW1wbGVfaW5kZXgsIHVpbnQzMl90IGZsYWdzKSB7CisgICAgYnVpbGRTYW1wbGVFbnRyaWVzVGFibGUoKTsKKworICAgIGlmIChtU2FtcGxlVGltZUVudHJpZXMgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOworICAgIH0KKworICAgIGlmIChmbGFncyA9PSBrRmxhZ0ZyYW1lSW5kZXgpIHsKKyAgICAgICAgaWYgKHJlcV90aW1lID49IG1OdW1TYW1wbGVTaXplcykgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKKyAgICAgICAgfQorICAgICAgICAqc2FtcGxlX2luZGV4ID0gbVNhbXBsZVRpbWVFbnRyaWVzW3JlcV90aW1lXS5tU2FtcGxlSW5kZXg7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICB1aW50MzJfdCBsZWZ0ID0gMDsKKyAgICB1aW50MzJfdCByaWdodF9wbHVzX29uZSA9IG1OdW1TYW1wbGVTaXplczsKKyAgICB3aGlsZSAobGVmdCA8IHJpZ2h0X3BsdXNfb25lKSB7CisgICAgICAgIHVpbnQzMl90IGNlbnRlciA9IGxlZnQgKyAocmlnaHRfcGx1c19vbmUgLSBsZWZ0KSAvIDI7CisgICAgICAgIHVpbnQ2NF90IGNlbnRlclRpbWUgPQorICAgICAgICAgICAgZ2V0U2FtcGxlVGltZShjZW50ZXIsIHNjYWxlX251bSwgc2NhbGVfZGVuKTsKKworICAgICAgICBpZiAocmVxX3RpbWUgPCBjZW50ZXJUaW1lKSB7CisgICAgICAgICAgICByaWdodF9wbHVzX29uZSA9IGNlbnRlcjsKKyAgICAgICAgfSBlbHNlIGlmIChyZXFfdGltZSA+IGNlbnRlclRpbWUpIHsKKyAgICAgICAgICAgIGxlZnQgPSBjZW50ZXIgKyAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKnNhbXBsZV9pbmRleCA9IG1TYW1wbGVUaW1lRW50cmllc1tjZW50ZXJdLm1TYW1wbGVJbmRleDsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHVpbnQzMl90IGNsb3Nlc3RJbmRleCA9IGxlZnQ7CisKKyAgICBpZiAoY2xvc2VzdEluZGV4ID09IG1OdW1TYW1wbGVTaXplcykgeworICAgICAgICBpZiAoZmxhZ3MgPT0ga0ZsYWdBZnRlcikgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKKyAgICAgICAgfQorICAgICAgICBmbGFncyA9IGtGbGFnQmVmb3JlOworICAgIH0gZWxzZSBpZiAoY2xvc2VzdEluZGV4ID09IDApIHsKKyAgICAgICAgaWYgKGZsYWdzID09IGtGbGFnQmVmb3JlKSB7CisgICAgICAgICAgICAvLyBub3JtYWxseSB3ZSBzaG91bGQgcmV0dXJuIG91dCBvZiByYW5nZSwgYnV0IHRoYXQgaXMKKyAgICAgICAgICAgIC8vIHRyZWF0ZWQgYXMgZW5kLW9mLXN0cmVhbS4gIGluc3RlYWQgcmV0dXJuIGZpcnN0IHNhbXBsZQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CisgICAgICAgIH0KKyAgICAgICAgZmxhZ3MgPSBrRmxhZ0FmdGVyOworICAgIH0KKworICAgIHN3aXRjaCAoZmxhZ3MpIHsKKyAgICAgICAgY2FzZSBrRmxhZ0JlZm9yZToKKyAgICAgICAgeworICAgICAgICAgICAgLS1jbG9zZXN0SW5kZXg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga0ZsYWdBZnRlcjoKKyAgICAgICAgeworICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDSyhmbGFncyA9PSBrRmxhZ0Nsb3Nlc3QpOworICAgICAgICAgICAgLy8gcGljayBjbG9zZXN0IGJhc2VkIG9uIHRpbWVzdGFtcC4gdXNlIGFic19kaWZmZXJlbmNlIGZvciBzYWZldHkKKyAgICAgICAgICAgIGlmIChhYnNfZGlmZmVyZW5jZSgKKyAgICAgICAgICAgICAgICAgICAgZ2V0U2FtcGxlVGltZShjbG9zZXN0SW5kZXgsIHNjYWxlX251bSwgc2NhbGVfZGVuKSwgcmVxX3RpbWUpID4KKyAgICAgICAgICAgICAgICBhYnNfZGlmZmVyZW5jZSgKKyAgICAgICAgICAgICAgICAgICAgcmVxX3RpbWUsIGdldFNhbXBsZVRpbWUoY2xvc2VzdEluZGV4IC0gMSwgc2NhbGVfbnVtLCBzY2FsZV9kZW4pKSkgeworICAgICAgICAgICAgICAgIC0tY2xvc2VzdEluZGV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqc2FtcGxlX2luZGV4ID0gbVNhbXBsZVRpbWVFbnRyaWVzW2Nsb3Nlc3RJbmRleF0ubVNhbXBsZUluZGV4OworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU2FtcGxlVGFibGU6OmZpbmRTeW5jU2FtcGxlTmVhcigKKyAgICAgICAgdWludDMyX3Qgc3RhcnRfc2FtcGxlX2luZGV4LCB1aW50MzJfdCAqc2FtcGxlX2luZGV4LCB1aW50MzJfdCBmbGFncykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICAqc2FtcGxlX2luZGV4ID0gMDsKKworICAgIGlmIChtU3luY1NhbXBsZU9mZnNldCA8IDApIHsKKyAgICAgICAgLy8gQWxsIHNhbXBsZXMgYXJlIHN5bmMtc2FtcGxlcy4KKyAgICAgICAgKnNhbXBsZV9pbmRleCA9IHN0YXJ0X3NhbXBsZV9pbmRleDsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGlmIChtTnVtU3luY1NhbXBsZXMgPT0gMCkgeworICAgICAgICAqc2FtcGxlX2luZGV4ID0gMDsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHVpbnQzMl90IGxlZnQgPSAwOworICAgIHVpbnQzMl90IHJpZ2h0X3BsdXNfb25lID0gbU51bVN5bmNTYW1wbGVzOworICAgIHdoaWxlIChsZWZ0IDwgcmlnaHRfcGx1c19vbmUpIHsKKyAgICAgICAgdWludDMyX3QgY2VudGVyID0gbGVmdCArIChyaWdodF9wbHVzX29uZSAtIGxlZnQpIC8gMjsKKyAgICAgICAgdWludDMyX3QgeCA9IG1TeW5jU2FtcGxlc1tjZW50ZXJdOworCisgICAgICAgIGlmIChzdGFydF9zYW1wbGVfaW5kZXggPCB4KSB7CisgICAgICAgICAgICByaWdodF9wbHVzX29uZSA9IGNlbnRlcjsKKyAgICAgICAgfSBlbHNlIGlmIChzdGFydF9zYW1wbGVfaW5kZXggPiB4KSB7CisgICAgICAgICAgICBsZWZ0ID0gY2VudGVyICsgMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpzYW1wbGVfaW5kZXggPSB4OworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGxlZnQgPT0gbU51bVN5bmNTYW1wbGVzKSB7CisgICAgICAgIGlmIChmbGFncyA9PSBrRmxhZ0FmdGVyKSB7CisgICAgICAgICAgICBBTE9HRSgidHJpZWQgdG8gZmluZCBhIHN5bmMgZnJhbWUgYWZ0ZXIgdGhlIGxhc3Qgb25lOiAlZCIsIGxlZnQpOworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKKyAgICAgICAgfQorICAgICAgICBmbGFncyA9IGtGbGFnQmVmb3JlOworICAgIH0KKyAgICBlbHNlIGlmIChsZWZ0ID09IDApIHsKKyAgICAgICAgaWYgKGZsYWdzID09IGtGbGFnQmVmb3JlKSB7CisgICAgICAgICAgICBBTE9HRSgidHJpZWQgdG8gZmluZCBhIHN5bmMgZnJhbWUgYmVmb3JlIHRoZSBmaXJzdCBvbmU6ICVkIiwgbGVmdCk7CisKKyAgICAgICAgICAgIC8vIG5vcm1hbGx5IHdlIHNob3VsZCByZXR1cm4gb3V0IG9mIHJhbmdlLCBidXQgdGhhdCBpcworICAgICAgICAgICAgLy8gdHJlYXRlZCBhcyBlbmQtb2Ytc3RyZWFtLiAgaW5zdGVhZCBzZWVrIHRvIGZpcnN0IHN5bmMKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOworICAgICAgICB9CisgICAgICAgIGZsYWdzID0ga0ZsYWdBZnRlcjsKKyAgICB9CisKKyAgICAvLyBOb3cgc3NpW2xlZnQgLSAxXSA8KD0pIHN0YXJ0X3NhbXBsZV9pbmRleCA8PSBzc2lbbGVmdF0KKyAgICBzd2l0Y2ggKGZsYWdzKSB7CisgICAgICAgIGNhc2Uga0ZsYWdCZWZvcmU6CisgICAgICAgIHsKKyAgICAgICAgICAgIC0tbGVmdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga0ZsYWdBZnRlcjoKKyAgICAgICAgeworICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgLy8gdGhpcyByb3V0ZSBpcyBub3QgdXNlZCwgYnV0IGltcGxlbWVudCBpdCBub25ldGhlbGVzcworICAgICAgICAgICAgQ0hFQ0soZmxhZ3MgPT0ga0ZsYWdDbG9zZXN0KTsKKworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNhbXBsZUl0ZXJhdG9yLT5zZWVrVG8oc3RhcnRfc2FtcGxlX2luZGV4KTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlX3RpbWUgPSBtU2FtcGxlSXRlcmF0b3ItPmdldFNhbXBsZVRpbWUoKTsKKworICAgICAgICAgICAgZXJyID0gbVNhbXBsZUl0ZXJhdG9yLT5zZWVrVG8obVN5bmNTYW1wbGVzW2xlZnRdKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWludDMyX3QgdXBwZXJfdGltZSA9IG1TYW1wbGVJdGVyYXRvci0+Z2V0U2FtcGxlVGltZSgpOworCisgICAgICAgICAgICBlcnIgPSBtU2FtcGxlSXRlcmF0b3ItPnNlZWtUbyhtU3luY1NhbXBsZXNbbGVmdCAtIDFdKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWludDMyX3QgbG93ZXJfdGltZSA9IG1TYW1wbGVJdGVyYXRvci0+Z2V0U2FtcGxlVGltZSgpOworCisgICAgICAgICAgICAvLyB1c2UgYWJzX2RpZmZlcmVuY2UgZm9yIHNhZmV0eQorICAgICAgICAgICAgaWYgKGFic19kaWZmZXJlbmNlKHVwcGVyX3RpbWUsIHNhbXBsZV90aW1lKSA+CisgICAgICAgICAgICAgICAgYWJzX2RpZmZlcmVuY2Uoc2FtcGxlX3RpbWUsIGxvd2VyX3RpbWUpKSB7CisgICAgICAgICAgICAgICAgLS1sZWZ0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqc2FtcGxlX2luZGV4ID0gbVN5bmNTYW1wbGVzW2xlZnRdOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU2FtcGxlVGFibGU6OmZpbmRUaHVtYm5haWxTYW1wbGUodWludDMyX3QgKnNhbXBsZV9pbmRleCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobVN5bmNTYW1wbGVPZmZzZXQgPCAwKSB7CisgICAgICAgIC8vIEFsbCBzYW1wbGVzIGFyZSBzeW5jLXNhbXBsZXMuCisgICAgICAgICpzYW1wbGVfaW5kZXggPSAwOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgdWludDMyX3QgYmVzdFNhbXBsZUluZGV4ID0gMDsKKyAgICBzaXplX3QgbWF4U2FtcGxlU2l6ZSA9IDA7CisKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhOdW1TeW5jU2FtcGxlc1RvU2NhbiA9IDIwOworCisgICAgLy8gQ29uc2lkZXIgdGhlIGZpcnN0IGtNYXhOdW1TeW5jU2FtcGxlc1RvU2NhbiBzeW5jIHNhbXBsZXMgYW5kCisgICAgLy8gcGljayB0aGUgb25lIHdpdGggdGhlIGxhcmdlc3QgKGNvbXByZXNzZWQpIHNpemUgYXMgdGhlIHRodW1ibmFpbC4KKworICAgIHNpemVfdCBudW1TYW1wbGVzVG9TY2FuID0gbU51bVN5bmNTYW1wbGVzOworICAgIGlmIChudW1TYW1wbGVzVG9TY2FuID4ga01heE51bVN5bmNTYW1wbGVzVG9TY2FuKSB7CisgICAgICAgIG51bVNhbXBsZXNUb1NjYW4gPSBrTWF4TnVtU3luY1NhbXBsZXNUb1NjYW47CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TYW1wbGVzVG9TY2FuOyArK2kpIHsKKyAgICAgICAgdWludDMyX3QgeCA9IG1TeW5jU2FtcGxlc1tpXTsKKworICAgICAgICAvLyBOb3cgeCBpcyBhIHNhbXBsZSBpbmRleC4KKyAgICAgICAgc2l6ZV90IHNhbXBsZVNpemU7CisgICAgICAgIHN0YXR1c190IGVyciA9IGdldFNhbXBsZVNpemVfbCh4LCAmc2FtcGxlU2l6ZSk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaSA9PSAwIHx8IHNhbXBsZVNpemUgPiBtYXhTYW1wbGVTaXplKSB7CisgICAgICAgICAgICBiZXN0U2FtcGxlSW5kZXggPSB4OworICAgICAgICAgICAgbWF4U2FtcGxlU2l6ZSA9IHNhbXBsZVNpemU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqc2FtcGxlX2luZGV4ID0gYmVzdFNhbXBsZUluZGV4OworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTYW1wbGVUYWJsZTo6Z2V0U2FtcGxlU2l6ZV9sKAorICAgICAgICB1aW50MzJfdCBzYW1wbGVJbmRleCwgc2l6ZV90ICpzYW1wbGVTaXplKSB7CisgICAgcmV0dXJuIG1TYW1wbGVJdGVyYXRvci0+Z2V0U2FtcGxlU2l6ZURpcmVjdCgKKyAgICAgICAgICAgIHNhbXBsZUluZGV4LCBzYW1wbGVTaXplKTsKK30KKworc3RhdHVzX3QgU2FtcGxlVGFibGU6OmdldE1ldGFEYXRhRm9yU2FtcGxlKAorICAgICAgICB1aW50MzJfdCBzYW1wbGVJbmRleCwKKyAgICAgICAgb2ZmNjRfdCAqb2Zmc2V0LAorICAgICAgICBzaXplX3QgKnNpemUsCisgICAgICAgIHVpbnQzMl90ICpjb21wb3NpdGlvblRpbWUsCisgICAgICAgIGJvb2wgKmlzU3luY1NhbXBsZSwKKyAgICAgICAgdWludDMyX3QgKnNhbXBsZUR1cmF0aW9uKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIHN0YXR1c190IGVycjsKKyAgICBpZiAoKGVyciA9IG1TYW1wbGVJdGVyYXRvci0+c2Vla1RvKHNhbXBsZUluZGV4KSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAob2Zmc2V0KSB7CisgICAgICAgICpvZmZzZXQgPSBtU2FtcGxlSXRlcmF0b3ItPmdldFNhbXBsZU9mZnNldCgpOworICAgIH0KKworICAgIGlmIChzaXplKSB7CisgICAgICAgICpzaXplID0gbVNhbXBsZUl0ZXJhdG9yLT5nZXRTYW1wbGVTaXplKCk7CisgICAgfQorCisgICAgaWYgKGNvbXBvc2l0aW9uVGltZSkgeworICAgICAgICAqY29tcG9zaXRpb25UaW1lID0gbVNhbXBsZUl0ZXJhdG9yLT5nZXRTYW1wbGVUaW1lKCk7CisgICAgfQorCisgICAgaWYgKGlzU3luY1NhbXBsZSkgeworICAgICAgICAqaXNTeW5jU2FtcGxlID0gZmFsc2U7CisgICAgICAgIGlmIChtU3luY1NhbXBsZU9mZnNldCA8IDApIHsKKyAgICAgICAgICAgIC8vIEV2ZXJ5IHNhbXBsZSBpcyBhIHN5bmMgc2FtcGxlLgorICAgICAgICAgICAgKmlzU3luY1NhbXBsZSA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzaXplX3QgaSA9IChtTGFzdFN5bmNTYW1wbGVJbmRleCA8IG1OdW1TeW5jU2FtcGxlcykKKyAgICAgICAgICAgICAgICAgICAgJiYgKG1TeW5jU2FtcGxlc1ttTGFzdFN5bmNTYW1wbGVJbmRleF0gPD0gc2FtcGxlSW5kZXgpCisgICAgICAgICAgICAgICAgPyBtTGFzdFN5bmNTYW1wbGVJbmRleCA6IDA7CisKKyAgICAgICAgICAgIHdoaWxlIChpIDwgbU51bVN5bmNTYW1wbGVzICYmIG1TeW5jU2FtcGxlc1tpXSA8IHNhbXBsZUluZGV4KSB7CisgICAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaSA8IG1OdW1TeW5jU2FtcGxlcyAmJiBtU3luY1NhbXBsZXNbaV0gPT0gc2FtcGxlSW5kZXgpIHsKKyAgICAgICAgICAgICAgICAqaXNTeW5jU2FtcGxlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUxhc3RTeW5jU2FtcGxlSW5kZXggPSBpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHNhbXBsZUR1cmF0aW9uKSB7CisgICAgICAgICpzYW1wbGVEdXJhdGlvbiA9IG1TYW1wbGVJdGVyYXRvci0+Z2V0U2FtcGxlRHVyYXRpb24oKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK2ludDMyX3QgU2FtcGxlVGFibGU6OmdldENvbXBvc2l0aW9uVGltZU9mZnNldCh1aW50MzJfdCBzYW1wbGVJbmRleCkgeworICAgIHJldHVybiBtQ29tcG9zaXRpb25EZWx0YUxvb2t1cC0+Z2V0Q29tcG9zaXRpb25UaW1lT2Zmc2V0KHNhbXBsZUluZGV4KTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZVRhYmxlLmggYi9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVUYWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZTk3NGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVUYWJsZS5oCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTQU1QTEVfVEFCTEVfSF8KKworI2RlZmluZSBTQU1QTEVfVEFCTEVfSF8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIERhdGFTb3VyY2VCYXNlOworc3RydWN0IFNhbXBsZUl0ZXJhdG9yOworCitjbGFzcyBTYW1wbGVUYWJsZSA6IHB1YmxpYyBSZWZCYXNlIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBTYW1wbGVUYWJsZShEYXRhU291cmNlQmFzZSAqc291cmNlKTsKKworICAgIGJvb2wgaXNWYWxpZCgpIGNvbnN0OworCisgICAgLy8gdHlwZSBjYW4gYmUgJ3N0Y28nIG9yICdjbzY0Jy4KKyAgICBzdGF0dXNfdCBzZXRDaHVua09mZnNldFBhcmFtcygKKyAgICAgICAgICAgIHVpbnQzMl90IHR5cGUsIG9mZjY0X3QgZGF0YV9vZmZzZXQsIHNpemVfdCBkYXRhX3NpemUpOworCisgICAgc3RhdHVzX3Qgc2V0U2FtcGxlVG9DaHVua1BhcmFtcyhvZmY2NF90IGRhdGFfb2Zmc2V0LCBzaXplX3QgZGF0YV9zaXplKTsKKworICAgIC8vIHR5cGUgY2FuIGJlICdzdHN6JyBvciAnc3R6MicuCisgICAgc3RhdHVzX3Qgc2V0U2FtcGxlU2l6ZVBhcmFtcygKKyAgICAgICAgICAgIHVpbnQzMl90IHR5cGUsIG9mZjY0X3QgZGF0YV9vZmZzZXQsIHNpemVfdCBkYXRhX3NpemUpOworCisgICAgc3RhdHVzX3Qgc2V0VGltZVRvU2FtcGxlUGFyYW1zKG9mZjY0X3QgZGF0YV9vZmZzZXQsIHNpemVfdCBkYXRhX3NpemUpOworCisgICAgc3RhdHVzX3Qgc2V0Q29tcG9zaXRpb25UaW1lVG9TYW1wbGVQYXJhbXMoCisgICAgICAgICAgICBvZmY2NF90IGRhdGFfb2Zmc2V0LCBzaXplX3QgZGF0YV9zaXplKTsKKworICAgIHN0YXR1c190IHNldFN5bmNTYW1wbGVQYXJhbXMob2ZmNjRfdCBkYXRhX29mZnNldCwgc2l6ZV90IGRhdGFfc2l6ZSk7CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICB1aW50MzJfdCBjb3VudENodW5rT2Zmc2V0cygpIGNvbnN0OworCisgICAgdWludDMyX3QgY291bnRTYW1wbGVzKCkgY29uc3Q7CisKKyAgICBzdGF0dXNfdCBnZXRNYXhTYW1wbGVTaXplKHNpemVfdCAqc2l6ZSk7CisKKyAgICBzdGF0dXNfdCBnZXRNZXRhRGF0YUZvclNhbXBsZSgKKyAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZUluZGV4LAorICAgICAgICAgICAgb2ZmNjRfdCAqb2Zmc2V0LAorICAgICAgICAgICAgc2l6ZV90ICpzaXplLAorICAgICAgICAgICAgdWludDMyX3QgKmNvbXBvc2l0aW9uVGltZSwKKyAgICAgICAgICAgIGJvb2wgKmlzU3luY1NhbXBsZSA9IE5VTEwsCisgICAgICAgICAgICB1aW50MzJfdCAqc2FtcGxlRHVyYXRpb24gPSBOVUxMKTsKKworICAgIGVudW0geworICAgICAgICBrRmxhZ0JlZm9yZSwKKyAgICAgICAga0ZsYWdBZnRlciwKKyAgICAgICAga0ZsYWdDbG9zZXN0LAorICAgICAgICBrRmxhZ0ZyYW1lSW5kZXgsCisgICAgfTsKKyAgICBzdGF0dXNfdCBmaW5kU2FtcGxlQXRUaW1lKAorICAgICAgICAgICAgdWludDY0X3QgcmVxX3RpbWUsIHVpbnQ2NF90IHNjYWxlX251bSwgdWludDY0X3Qgc2NhbGVfZGVuLAorICAgICAgICAgICAgdWludDMyX3QgKnNhbXBsZV9pbmRleCwgdWludDMyX3QgZmxhZ3MpOworCisgICAgc3RhdHVzX3QgZmluZFN5bmNTYW1wbGVOZWFyKAorICAgICAgICAgICAgdWludDMyX3Qgc3RhcnRfc2FtcGxlX2luZGV4LCB1aW50MzJfdCAqc2FtcGxlX2luZGV4LAorICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpOworCisgICAgc3RhdHVzX3QgZmluZFRodW1ibmFpbFNhbXBsZSh1aW50MzJfdCAqc2FtcGxlX2luZGV4KTsKKworcHJvdGVjdGVkOgorICAgIH5TYW1wbGVUYWJsZSgpOworCitwcml2YXRlOgorICAgIHN0cnVjdCBDb21wb3NpdGlvbkRlbHRhTG9va3VwOworCisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtDaHVua09mZnNldFR5cGUzMjsKKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga0NodW5rT2Zmc2V0VHlwZTY0OworICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrU2FtcGxlU2l6ZVR5cGUzMjsKKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga1NhbXBsZVNpemVUeXBlQ29tcGFjdDsKKworICAgIC8vIExpbWl0IHRoZSB0b3RhbCBzaXplIG9mIGFsbCBpbnRlcm5hbCB0YWJsZXMgdG8gMjAwTWlCLgorICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heFRvdGFsU2l6ZSA9IDIwMCAqICgxIDw8IDIwKTsKKworICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBNdXRleCBtTG9jazsKKworICAgIG9mZjY0X3QgbUNodW5rT2Zmc2V0T2Zmc2V0OworICAgIHVpbnQzMl90IG1DaHVua09mZnNldFR5cGU7CisgICAgdWludDMyX3QgbU51bUNodW5rT2Zmc2V0czsKKworICAgIG9mZjY0X3QgbVNhbXBsZVRvQ2h1bmtPZmZzZXQ7CisgICAgdWludDMyX3QgbU51bVNhbXBsZVRvQ2h1bmtPZmZzZXRzOworCisgICAgb2ZmNjRfdCBtU2FtcGxlU2l6ZU9mZnNldDsKKyAgICB1aW50MzJfdCBtU2FtcGxlU2l6ZUZpZWxkU2l6ZTsKKyAgICB1aW50MzJfdCBtRGVmYXVsdFNhbXBsZVNpemU7CisgICAgdWludDMyX3QgbU51bVNhbXBsZVNpemVzOworCisgICAgYm9vbCBtSGFzVGltZVRvU2FtcGxlOworICAgIHVpbnQzMl90IG1UaW1lVG9TYW1wbGVDb3VudDsKKyAgICB1aW50MzJfdCogbVRpbWVUb1NhbXBsZTsKKworICAgIHN0cnVjdCBTYW1wbGVUaW1lRW50cnkgeworICAgICAgICB1aW50MzJfdCBtU2FtcGxlSW5kZXg7CisgICAgICAgIHVpbnQzMl90IG1Db21wb3NpdGlvblRpbWU7CisgICAgfTsKKyAgICBTYW1wbGVUaW1lRW50cnkgKm1TYW1wbGVUaW1lRW50cmllczsKKworICAgIGludDMyX3QgKm1Db21wb3NpdGlvblRpbWVEZWx0YUVudHJpZXM7CisgICAgc2l6ZV90IG1OdW1Db21wb3NpdGlvblRpbWVEZWx0YUVudHJpZXM7CisgICAgQ29tcG9zaXRpb25EZWx0YUxvb2t1cCAqbUNvbXBvc2l0aW9uRGVsdGFMb29rdXA7CisKKyAgICBvZmY2NF90IG1TeW5jU2FtcGxlT2Zmc2V0OworICAgIHVpbnQzMl90IG1OdW1TeW5jU2FtcGxlczsKKyAgICB1aW50MzJfdCAqbVN5bmNTYW1wbGVzOworICAgIHNpemVfdCBtTGFzdFN5bmNTYW1wbGVJbmRleDsKKworICAgIFNhbXBsZUl0ZXJhdG9yICptU2FtcGxlSXRlcmF0b3I7CisKKyAgICBzdHJ1Y3QgU2FtcGxlVG9DaHVua0VudHJ5IHsKKyAgICAgICAgdWludDMyX3Qgc3RhcnRDaHVuazsKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlc1BlckNodW5rOworICAgICAgICB1aW50MzJfdCBjaHVua0Rlc2M7CisgICAgfTsKKyAgICBTYW1wbGVUb0NodW5rRW50cnkgKm1TYW1wbGVUb0NodW5rRW50cmllczsKKworICAgIC8vIEFwcHJveGltYXRlIHNpemUgb2YgYWxsIHRhYmxlcyBjb21iaW5lZC4KKyAgICB1aW50NjRfdCBtVG90YWxTaXplOworCisgICAgZnJpZW5kIHN0cnVjdCBTYW1wbGVJdGVyYXRvcjsKKworICAgIC8vIG5vcm1hbGx5IHdlIGRvbid0IHJvdW5kCisgICAgaW5saW5lIHVpbnQ2NF90IGdldFNhbXBsZVRpbWUoCisgICAgICAgICAgICBzaXplX3Qgc2FtcGxlX2luZGV4LCB1aW50NjRfdCBzY2FsZV9udW0sIHVpbnQ2NF90IHNjYWxlX2RlbikgY29uc3QgeworICAgICAgICByZXR1cm4gKHNhbXBsZV9pbmRleCA8IChzaXplX3QpbU51bVNhbXBsZVNpemVzICYmIG1TYW1wbGVUaW1lRW50cmllcyAhPSBOVUxMCisgICAgICAgICAgICAgICAgJiYgc2NhbGVfZGVuICE9IDApCisgICAgICAgICAgICAgICAgPyAobVNhbXBsZVRpbWVFbnRyaWVzW3NhbXBsZV9pbmRleF0ubUNvbXBvc2l0aW9uVGltZSAqIHNjYWxlX251bSkgLyBzY2FsZV9kZW4gOiAwOworICAgIH0KKworICAgIHN0YXR1c190IGdldFNhbXBsZVNpemVfbCh1aW50MzJfdCBzYW1wbGVfaW5kZXgsIHNpemVfdCAqc2FtcGxlX3NpemUpOworICAgIGludDMyX3QgZ2V0Q29tcG9zaXRpb25UaW1lT2Zmc2V0KHVpbnQzMl90IHNhbXBsZUluZGV4KTsKKworICAgIHN0YXRpYyBpbnQgQ29tcGFyZUluY3JlYXNpbmdUaW1lKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKTsKKworICAgIHZvaWQgYnVpbGRTYW1wbGVFbnRyaWVzVGFibGUoKTsKKworICAgIFNhbXBsZVRhYmxlKGNvbnN0IFNhbXBsZVRhYmxlICYpOworICAgIFNhbXBsZVRhYmxlICZvcGVyYXRvcj0oY29uc3QgU2FtcGxlVGFibGUgJik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFNBTVBMRV9UQUJMRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvZXhwb3J0cy5sZHMgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9leHBvcnRzLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTMwOWVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvZXhwb3J0cy5sZHMKQEAgLTAsMCArMSBAQAoreyBnbG9iYWw6IEdFVEVYVFJBQ1RPUkRFRjsgbG9jYWw6ICo7IH07CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU0YTU5MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvQW5kcm9pZC5icApAQCAtMCwwICsxLDU2IEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisKKyAgICBzcmNzOiBbCisgICAgICAgICJFeHRyYWN0b3JCdW5kbGUuY3BwIiwKKyAgICAgICAgIk1QRUcyUFNFeHRyYWN0b3IuY3BwIiwKKyAgICAgICAgIk1QRUcyVFNFeHRyYWN0b3IuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhc0AxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYXMubmF0aXZlQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhpZGwudG9rZW5AMS4wLXV0aWxzIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjcnlwdG8iLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmhpZGxhbGxvY2F0b3J1dGlscyIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tcGVnMnN1cHBvcnQiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBuYW1lOiAibGlibXBlZzJleHRyYWN0b3IiLAorICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogImV4dHJhY3RvcnMiLAorCisgICAgY29tcGlsZV9tdWx0aWxpYjogImZpcnN0IiwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItZnZpc2liaWxpdHk9aGlkZGVuIiwKKyAgICBdLAorICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgZGlhZzogeworICAgICAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICB9LAorICAgIH0sCisKK30KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvRXh0cmFjdG9yQnVuZGxlLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvRXh0cmFjdG9yQnVuZGxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTBmYTAzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9FeHRyYWN0b3JCdW5kbGUuY3BwCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1QRUcyRXh0cmFjdG9yQnVuZGxlIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlICJNUEVHMlBTRXh0cmFjdG9yLmgiCisjaW5jbHVkZSAiTVBFRzJUU0V4dHJhY3Rvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2V4dGVybiAiQyIgeworLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAorX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQorTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CisgICAgcmV0dXJuIHsKKyAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkVYVFJBQ1RPUkRFRl9WRVJTSU9OLAorICAgICAgICBVVUlEKCIzZDFkY2ZlYi1lNDBhLTQzNmQtYTU3NC1jMjQzOGE1NTVlNWYiKSwKKyAgICAgICAgMSwKKyAgICAgICAgIk1QRUcyLVBTL1RTIEV4dHJhY3RvciIsCisgICAgICAgIFtdKAorICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCisgICAgICAgICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsCisgICAgICAgICAgICAgICAgdm9pZCAqKiwKKyAgICAgICAgICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICopIC0+IE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyB7CisgICAgICAgICAgICBpZiAoU25pZmZNUEVHMlRTKHNvdXJjZSwgY29uZmlkZW5jZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gW10oCisgICAgICAgICAgICAgICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKSAtPiBNZWRpYUV4dHJhY3RvciogeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1QRUcyVFNFeHRyYWN0b3Ioc291cmNlKTt9OworICAgICAgICAgICAgfSBlbHNlIGlmIChTbmlmZk1QRUcyUFMoc291cmNlLCBjb25maWRlbmNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopIC0+IE1lZGlhRXh0cmFjdG9yKiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNUEVHMlBTRXh0cmFjdG9yKHNvdXJjZSk7fTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfTsKK30KKworfSAvLyBleHRlcm4gIkMiCisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmNvcHkgdG8gbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyUFNFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlBTRXh0cmFjdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTgwYjgyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlBTRXh0cmFjdG9yLmNwcApAQCAtMCwwICsxLDc3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTVBFRzJQU0V4dHJhY3RvciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIk1QRUcyUFNFeHRyYWN0b3IuaCIKKworI2luY2x1ZGUgIm1wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oIgorI2luY2x1ZGUgIm1wZWcydHMvRVNRdWV1ZS5oIgorCisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgTVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2sgOiBwdWJsaWMgTWVkaWFUcmFjaywgcHVibGljIFJlZkJhc2UgeworICAgIFRyYWNrKE1QRUcyUFNFeHRyYWN0b3IgKmV4dHJhY3RvciwKKyAgICAgICAgICB1bnNpZ25lZCBzdHJlYW1faWQsIHVuc2lnbmVkIHN0cmVhbV90eXBlKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+VHJhY2soKTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgc3RydWN0IE1QRUcyUFNFeHRyYWN0b3I7CisKKyAgICBNUEVHMlBTRXh0cmFjdG9yICptRXh0cmFjdG9yOworCisgICAgdW5zaWduZWQgbVN0cmVhbUlEOworICAgIHVuc2lnbmVkIG1TdHJlYW1UeXBlOworICAgIEVsZW1lbnRhcnlTdHJlYW1RdWV1ZSAqbVF1ZXVlOworICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IG1Tb3VyY2U7CisKKyAgICBzdGF0dXNfdCBhcHBlbmRQRVNEYXRhKAorICAgICAgICAgICAgdW5zaWduZWQgUFRTX0RUU19mbGFncywKKyAgICAgICAgICAgIHVpbnQ2NF90IFBUUywgdWludDY0X3QgRFRTLAorICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVHJhY2spOworfTsKKworc3RydWN0IE1QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjayA6IHB1YmxpYyBNZWRpYVRyYWNrIHsKKyAgICBXcmFwcGVkVHJhY2soTVBFRzJQU0V4dHJhY3RvciAqZXh0cmFjdG9yLCBjb25zdCBzcDxUcmFjaz4gJnRyYWNrKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+V3JhcHBlZFRyYWNrKCk7CisKK3ByaXZhdGU6CisgICAgTVBFRzJQU0V4dHJhY3RvciAqbUV4dHJhY3RvcjsKKyAgICBzcDxNUEVHMlBTRXh0cmFjdG9yOjpUcmFjaz4gbVRyYWNrOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoV3JhcHBlZFRyYWNrKTsKK307CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK01QRUcyUFNFeHRyYWN0b3I6Ok1QRUcyUFNFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkKKyAgICA6IG1EYXRhU291cmNlKHNvdXJjZSksCisgICAgICBtT2Zmc2V0KDApLAorICAgICAgbUZpbmFsUmVzdWx0KE9LKSwKKyAgICAgIG1CdWZmZXIobmV3IEFCdWZmZXIoMCkpLAorICAgICAgbVNjYW5uaW5nKHRydWUpLAorICAgICAgbVByb2dyYW1TdHJlYW1NYXBWYWxpZChmYWxzZSkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgNTAwOyArK2kpIHsKKyAgICAgICAgaWYgKGZlZWRNb3JlKCkgIT0gT0spIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gUmVtb3ZlIGFsbCB0cmFja3MgdGhhdCB3ZXJlIHVuYWJsZSB0byBkZXRlcm1pbmUgdGhlaXIgZm9ybWF0LgorICAgIE1ldGFEYXRhQmFzZSBtZXRhOworICAgIGZvciAoc2l6ZV90IGkgPSBtVHJhY2tzLnNpemUoKTsgaSA+IDA7KSB7CisgICAgICAgIGktLTsKKyAgICAgICAgaWYgKG1UcmFja3MudmFsdWVBdChpKS0+Z2V0Rm9ybWF0KG1ldGEpICE9IE9LKSB7CisgICAgICAgICAgICBtVHJhY2tzLnJlbW92ZUl0ZW1zQXQoaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtU2Nhbm5pbmcgPSBmYWxzZTsKK30KKworTVBFRzJQU0V4dHJhY3Rvcjo6fk1QRUcyUFNFeHRyYWN0b3IoKSB7Cit9CisKK3NpemVfdCBNUEVHMlBTRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpIHsKKyAgICByZXR1cm4gbVRyYWNrcy5zaXplKCk7Cit9CisKK01lZGlhVHJhY2sgKk1QRUcyUFNFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgeworICAgIGlmIChpbmRleCA+PSBtVHJhY2tzLnNpemUoKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3IFdyYXBwZWRUcmFjayh0aGlzLCBtVHJhY2tzLnZhbHVlQXQoaW5kZXgpKTsKK30KKworc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CisgICAgaWYgKGluZGV4ID49IG1UcmFja3Muc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBtVHJhY2tzLnZhbHVlQXQoaW5kZXgpLT5nZXRGb3JtYXQobWV0YSk7Cit9CisKK3N0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OmdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkgeworICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHMlBTKTsKKworICAgIHJldHVybiBPSzsKK30KKwordWludDMyX3QgTVBFRzJQU0V4dHJhY3Rvcjo6ZmxhZ3MoKSBjb25zdCB7CisgICAgcmV0dXJuIENBTl9QQVVTRTsKK30KKworc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6ZmVlZE1vcmUoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIC8vIEhvdyBtdWNoIGRhdGEgd2UncmUgcmVhZGluZyBhdCBhIHRpbWUKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtDaHVua1NpemUgPSA4MTkyOworCisgICAgZm9yICg7OykgeworICAgICAgICBzdGF0dXNfdCBlcnIgPSBkZXF1ZXVlQ2h1bmsoKTsKKworICAgICAgICBpZiAoZXJyID09IC1FQUdBSU4gJiYgbUZpbmFsUmVzdWx0ID09IE9LKSB7CisgICAgICAgICAgICBtZW1tb3ZlKG1CdWZmZXItPmJhc2UoKSwgbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCkpOworICAgICAgICAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgbUJ1ZmZlci0+c2l6ZSgpKTsKKworICAgICAgICAgICAgaWYgKG1CdWZmZXItPnNpemUoKSArIGtDaHVua1NpemUgPiBtQnVmZmVyLT5jYXBhY2l0eSgpKSB7CisgICAgICAgICAgICAgICAgc2l6ZV90IG5ld0NhcGFjaXR5ID0gbUJ1ZmZlci0+Y2FwYWNpdHkoKSArIGtDaHVua1NpemU7CisgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gbmV3QnVmZmVyID0gbmV3IEFCdWZmZXIobmV3Q2FwYWNpdHkpOworICAgICAgICAgICAgICAgIG1lbWNweShuZXdCdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCkpOworICAgICAgICAgICAgICAgIG5ld0J1ZmZlci0+c2V0UmFuZ2UoMCwgbUJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyID0gbmV3QnVmZmVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzc2l6ZV90IG4gPSBtRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgICAgICAgICBtT2Zmc2V0LCBtQnVmZmVyLT5kYXRhKCkgKyBtQnVmZmVyLT5zaXplKCksIGtDaHVua1NpemUpOworCisgICAgICAgICAgICBpZiAobiA8IChzc2l6ZV90KWtDaHVua1NpemUpIHsKKyAgICAgICAgICAgICAgICBtRmluYWxSZXN1bHQgPSAobiA8IDApID8gKHN0YXR1c190KW4gOiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgICAgIHJldHVybiBtRmluYWxSZXN1bHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1CdWZmZXItPnNldFJhbmdlKG1CdWZmZXItPm9mZnNldCgpLCBtQnVmZmVyLT5zaXplKCkgKyBuKTsKKyAgICAgICAgICAgIG1PZmZzZXQgKz0gbjsKKyAgICAgICAgfSBlbHNlIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIG1GaW5hbFJlc3VsdCA9IGVycjsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OmRlcXVldWVDaHVuaygpIHsKKyAgICBpZiAobUJ1ZmZlci0+c2l6ZSgpIDwgNCkgeworICAgICAgICByZXR1cm4gLUVBR0FJTjsKKyAgICB9CisKKyAgICBpZiAobWVtY21wKCJceDAwXHgwMFx4MDEiLCBtQnVmZmVyLT5kYXRhKCksIDMpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgdW5zaWduZWQgY2h1bmtUeXBlID0gbUJ1ZmZlci0+ZGF0YSgpWzNdOworCisgICAgc3NpemVfdCByZXM7CisKKyAgICBzd2l0Y2ggKGNodW5rVHlwZSkgeworICAgICAgICBjYXNlIDB4YmE6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlcyA9IGRlcXVldWVQYWNrKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgMHhiYjoKKyAgICAgICAgeworICAgICAgICAgICAgcmVzID0gZGVxdWV1ZVN5c3RlbUhlYWRlcigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICByZXMgPSBkZXF1ZXVlUEVTKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChyZXMgPiAwKSB7CisgICAgICAgIGlmIChtQnVmZmVyLT5zaXplKCkgPCAoc2l6ZV90KXJlcykgeworICAgICAgICAgICAgcmV0dXJuIC1FQUdBSU47CisgICAgICAgIH0KKworICAgICAgICBtQnVmZmVyLT5zZXRSYW5nZShtQnVmZmVyLT5vZmZzZXQoKSArIHJlcywgbUJ1ZmZlci0+c2l6ZSgpIC0gcmVzKTsKKyAgICAgICAgcmVzID0gT0s7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworc3NpemVfdCBNUEVHMlBTRXh0cmFjdG9yOjpkZXF1ZXVlUGFjaygpIHsKKyAgICAvLyAzMiArIDIgKyAzICsgMSArIDE1ICsgMSArIDE1KyAxICsgOSArIDEgKyAyMiArIDEgKyAxIHwgKzUKKworICAgIGlmIChtQnVmZmVyLT5zaXplKCkgPCAxNCkgeworICAgICAgICByZXR1cm4gLUVBR0FJTjsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBwYWNrX3N0dWZmaW5nX2xlbmd0aCA9IG1CdWZmZXItPmRhdGEoKVsxM10gJiA3OworCisgICAgcmV0dXJuIHBhY2tfc3R1ZmZpbmdfbGVuZ3RoICsgMTQ7Cit9CisKK3NzaXplX3QgTVBFRzJQU0V4dHJhY3Rvcjo6ZGVxdWV1ZVN5c3RlbUhlYWRlcigpIHsKKyAgICBpZiAobUJ1ZmZlci0+c2l6ZSgpIDwgNikgeworICAgICAgICByZXR1cm4gLUVBR0FJTjsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBoZWFkZXJfbGVuZ3RoID0gVTE2X0FUKG1CdWZmZXItPmRhdGEoKSArIDQpOworCisgICAgcmV0dXJuIGhlYWRlcl9sZW5ndGggKyA2OworfQorCitzc2l6ZV90IE1QRUcyUFNFeHRyYWN0b3I6OmRlcXVldWVQRVMoKSB7CisgICAgaWYgKG1CdWZmZXItPnNpemUoKSA8IDYpIHsKKyAgICAgICAgcmV0dXJuIC1FQUdBSU47CisgICAgfQorCisgICAgdW5zaWduZWQgUEVTX3BhY2tldF9sZW5ndGggPSBVMTZfQVQobUJ1ZmZlci0+ZGF0YSgpICsgNCk7CisgICAgaWYgKFBFU19wYWNrZXRfbGVuZ3RoID09IDB1KSB7CisgICAgICAgIEFMT0dFKCJQRVNfcGFja2V0X2xlbmd0aCBpcyAwIik7CisgICAgICAgIHJldHVybiAtRUFHQUlOOworICAgIH0KKworICAgIHNpemVfdCBuID0gUEVTX3BhY2tldF9sZW5ndGggKyA2OworCisgICAgaWYgKG1CdWZmZXItPnNpemUoKSA8IG4pIHsKKyAgICAgICAgcmV0dXJuIC1FQUdBSU47CisgICAgfQorCisgICAgQUJpdFJlYWRlciBicihtQnVmZmVyLT5kYXRhKCksIG4pOworCisgICAgdW5zaWduZWQgcGFja2V0X3N0YXJ0Y29kZV9wcmVmaXggPSBici5nZXRCaXRzKDI0KTsKKworICAgIEFMT0dWKCJwYWNrZXRfc3RhcnRjb2RlX3ByZWZpeCA9IDB4JTA4eCIsIHBhY2tldF9zdGFydGNvZGVfcHJlZml4KTsKKworICAgIGlmIChwYWNrZXRfc3RhcnRjb2RlX3ByZWZpeCAhPSAxKSB7CisgICAgICAgIEFMT0dWKCJTdXBwb3NlZGx5IHBheWxvYWRfdW5pdF9zdGFydD0xIHVuaXQgZG9lcyBub3Qgc3RhcnQgIgorICAgICAgICAgICAgICJ3aXRoIHN0YXJ0Y29kZS4iKTsKKworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIGlmIChwYWNrZXRfc3RhcnRjb2RlX3ByZWZpeCAhPSAweDAwMDAwMXUpIHsKKyAgICAgICAgQUxPR0UoIldyb25nIFBFUyBwcmVmaXgiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBzdHJlYW1faWQgPSBici5nZXRCaXRzKDgpOworICAgIEFMT0dWKCJzdHJlYW1faWQgPSAweCUwMngiLCBzdHJlYW1faWQpOworCisgICAgLyogdW5zaWduZWQgUEVTX3BhY2tldF9sZW5ndGggPSAqL2JyLmdldEJpdHMoMTYpOworCisgICAgaWYgKHN0cmVhbV9pZCA9PSAweGJjKSB7CisgICAgICAgIC8vIHByb2dyYW1fc3RyZWFtX21hcAorCisgICAgICAgIGlmICghbVNjYW5uaW5nKSB7CisgICAgICAgICAgICByZXR1cm4gbjsKKyAgICAgICAgfQorCisgICAgICAgIG1TdHJlYW1UeXBlQnlFU0lELmNsZWFyKCk7CisKKyAgICAgICAgLyogdW5zaWduZWQgY3VycmVudF9uZXh0X2luZGljYXRvciA9ICovYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgLyogdW5zaWduZWQgcmVzZXJ2ZWQgPSAqL2JyLmdldEJpdHMoMik7CisgICAgICAgIC8qIHVuc2lnbmVkIHByb2dyYW1fc3RyZWFtX21hcF92ZXJzaW9uID0gKi9ici5nZXRCaXRzKDUpOworICAgICAgICAvKiB1bnNpZ25lZCByZXNlcnZlZCA9ICovYnIuZ2V0Qml0cyg3KTsKKyAgICAgICAgLyogdW5zaWduZWQgbWFya2VyX2JpdCA9ICovYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgdW5zaWduZWQgcHJvZ3JhbV9zdHJlYW1faW5mb19sZW5ndGggPSBici5nZXRCaXRzKDE2KTsKKworICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICAgICAgd2hpbGUgKG9mZnNldCA8IHByb2dyYW1fc3RyZWFtX2luZm9fbGVuZ3RoKSB7CisgICAgICAgICAgICBpZiAob2Zmc2V0ICsgMiA+IHByb2dyYW1fc3RyZWFtX2luZm9fbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdW5zaWduZWQgZGVzY3JpcHRvcl90YWcgPSBici5nZXRCaXRzKDgpOworICAgICAgICAgICAgdW5zaWduZWQgZGVzY3JpcHRvcl9sZW5ndGggPSBici5nZXRCaXRzKDgpOworCisgICAgICAgICAgICBBTE9HSSgiZm91bmQgZGVzY3JpcHRvciB0YWcgMHglMDJ4IG9mIGxlbmd0aCAldSIsCisgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfdGFnLCBkZXNjcmlwdG9yX2xlbmd0aCk7CisKKyAgICAgICAgICAgIGlmIChvZmZzZXQgKyAyICsgZGVzY3JpcHRvcl9sZW5ndGggPiBwcm9ncmFtX3N0cmVhbV9pbmZvX2xlbmd0aCkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyLnNraXBCaXRzKDggKiBkZXNjcmlwdG9yX2xlbmd0aCk7CisKKyAgICAgICAgICAgIG9mZnNldCArPSAyICsgZGVzY3JpcHRvcl9sZW5ndGg7CisgICAgICAgIH0KKworICAgICAgICB1bnNpZ25lZCBlbGVtZW50YXJ5X3N0cmVhbV9tYXBfbGVuZ3RoID0gYnIuZ2V0Qml0cygxNik7CisKKyAgICAgICAgb2Zmc2V0ID0gMDsKKyAgICAgICAgd2hpbGUgKG9mZnNldCA8IGVsZW1lbnRhcnlfc3RyZWFtX21hcF9sZW5ndGgpIHsKKyAgICAgICAgICAgIGlmIChvZmZzZXQgKyA0ID4gZWxlbWVudGFyeV9zdHJlYW1fbWFwX2xlbmd0aCkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVuc2lnbmVkIHN0cmVhbV90eXBlID0gYnIuZ2V0Qml0cyg4KTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGVsZW1lbnRhcnlfc3RyZWFtX2lkID0gYnIuZ2V0Qml0cyg4KTsKKworICAgICAgICAgICAgQUxPR0koImVsZW1lbnRhcnkgc3RyZWFtIGlkIDB4JTAyeCBoYXMgc3RyZWFtIHR5cGUgMHglMDJ4IiwKKyAgICAgICAgICAgICAgICAgZWxlbWVudGFyeV9zdHJlYW1faWQsIHN0cmVhbV90eXBlKTsKKworICAgICAgICAgICAgbVN0cmVhbVR5cGVCeUVTSUQuYWRkKGVsZW1lbnRhcnlfc3RyZWFtX2lkLCBzdHJlYW1fdHlwZSk7CisKKyAgICAgICAgICAgIHVuc2lnbmVkIGVsZW1lbnRhcnlfc3RyZWFtX2luZm9fbGVuZ3RoID0gYnIuZ2V0Qml0cygxNik7CisKKyAgICAgICAgICAgIGlmIChvZmZzZXQgKyA0ICsgZWxlbWVudGFyeV9zdHJlYW1faW5mb19sZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgPiBlbGVtZW50YXJ5X3N0cmVhbV9tYXBfbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb2Zmc2V0ICs9IDQgKyBlbGVtZW50YXJ5X3N0cmVhbV9pbmZvX2xlbmd0aDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHVuc2lnbmVkIENSQzMyID0gKi9ici5nZXRCaXRzKDMyKTsKKworICAgICAgICBtUHJvZ3JhbVN0cmVhbU1hcFZhbGlkID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKHN0cmVhbV9pZCAhPSAweGJlICAvLyBwYWRkaW5nX3N0cmVhbQorICAgICAgICAgICAgJiYgc3RyZWFtX2lkICE9IDB4YmYgIC8vIHByaXZhdGVfc3RyZWFtXzIKKyAgICAgICAgICAgICYmIHN0cmVhbV9pZCAhPSAweGYwICAvLyBFQ00KKyAgICAgICAgICAgICYmIHN0cmVhbV9pZCAhPSAweGYxICAvLyBFTU0KKyAgICAgICAgICAgICYmIHN0cmVhbV9pZCAhPSAweGZmICAvLyBwcm9ncmFtX3N0cmVhbV9kaXJlY3RvcnkKKyAgICAgICAgICAgICYmIHN0cmVhbV9pZCAhPSAweGYyICAvLyBEU01DQworICAgICAgICAgICAgJiYgc3RyZWFtX2lkICE9IDB4ZjgpIHsgIC8vIEguMjIyLjEgdHlwZSBFCisgICAgICAgIC8qIHVuc2lnbmVkIFBFU19tYXJrZXJfYml0cyA9ICovYnIuZ2V0Qml0cygyKTsgIC8vIHNob3VsZCBiZSAweDIoaGV4KQorICAgICAgICAvKiB1bnNpZ25lZCBQRVNfc2NyYW1ibGluZ19jb250cm9sID0gKi9ici5nZXRCaXRzKDIpOworICAgICAgICAvKiB1bnNpZ25lZCBQRVNfcHJpb3JpdHkgPSAqL2JyLmdldEJpdHMoMSk7CisgICAgICAgIC8qIHVuc2lnbmVkIGRhdGFfYWxpZ25tZW50X2luZGljYXRvciA9ICovYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgLyogdW5zaWduZWQgY29weXJpZ2h0ID0gKi9ici5nZXRCaXRzKDEpOworICAgICAgICAvKiB1bnNpZ25lZCBvcmlnaW5hbF9vcl9jb3B5ID0gKi9ici5nZXRCaXRzKDEpOworCisgICAgICAgIHVuc2lnbmVkIFBUU19EVFNfZmxhZ3MgPSBici5nZXRCaXRzKDIpOworICAgICAgICBBTE9HVigiUFRTX0RUU19mbGFncyA9ICV1IiwgUFRTX0RUU19mbGFncyk7CisKKyAgICAgICAgdW5zaWduZWQgRVNDUl9mbGFnID0gYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgQUxPR1YoIkVTQ1JfZmxhZyA9ICV1IiwgRVNDUl9mbGFnKTsKKworICAgICAgICB1bnNpZ25lZCBFU19yYXRlX2ZsYWcgPSBici5nZXRCaXRzKDEpOworICAgICAgICBBTE9HVigiRVNfcmF0ZV9mbGFnID0gJXUiLCBFU19yYXRlX2ZsYWcpOworCisgICAgICAgIHVuc2lnbmVkIERTTV90cmlja19tb2RlX2ZsYWcgPSBici5nZXRCaXRzKDEpOworICAgICAgICBBTE9HVigiRFNNX3RyaWNrX21vZGVfZmxhZyA9ICV1IiwgRFNNX3RyaWNrX21vZGVfZmxhZyk7CisKKyAgICAgICAgdW5zaWduZWQgYWRkaXRpb25hbF9jb3B5X2luZm9fZmxhZyA9IGJyLmdldEJpdHMoMSk7CisgICAgICAgIEFMT0dWKCJhZGRpdGlvbmFsX2NvcHlfaW5mb19mbGFnID0gJXUiLCBhZGRpdGlvbmFsX2NvcHlfaW5mb19mbGFnKTsKKworICAgICAgICAvKiB1bnNpZ25lZCBQRVNfQ1JDX2ZsYWcgPSAqL2JyLmdldEJpdHMoMSk7CisgICAgICAgIC8qIFBFU19leHRlbnNpb25fZmxhZyA9ICovYnIuZ2V0Qml0cygxKTsKKworICAgICAgICB1bnNpZ25lZCBQRVNfaGVhZGVyX2RhdGFfbGVuZ3RoID0gYnIuZ2V0Qml0cyg4KTsKKyAgICAgICAgQUxPR1YoIlBFU19oZWFkZXJfZGF0YV9sZW5ndGggPSAldSIsIFBFU19oZWFkZXJfZGF0YV9sZW5ndGgpOworCisgICAgICAgIHVuc2lnbmVkIG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZyA9IFBFU19oZWFkZXJfZGF0YV9sZW5ndGg7CisKKyAgICAgICAgdWludDY0X3QgUFRTID0gMCwgRFRTID0gMDsKKworICAgICAgICBpZiAoUFRTX0RUU19mbGFncyA9PSAyIHx8IFBUU19EVFNfZmxhZ3MgPT0gMykgeworICAgICAgICAgICAgaWYgKG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZyA8IDV1KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGJyLmdldEJpdHMoNCkgIT0gUFRTX0RUU19mbGFncykgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFBUUyA9ICgodWludDY0X3QpYnIuZ2V0Qml0cygzKSkgPDwgMzA7CisgICAgICAgICAgICBpZiAoYnIuZ2V0Qml0cygxKSAhPSAxdSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQVFMgfD0gKCh1aW50NjRfdClici5nZXRCaXRzKDE1KSkgPDwgMTU7CisgICAgICAgICAgICBpZiAoYnIuZ2V0Qml0cygxKSAhPSAxdSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQVFMgfD0gYnIuZ2V0Qml0cygxNSk7CisgICAgICAgICAgICBpZiAoYnIuZ2V0Qml0cygxKSAhPSAxdSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFMT0dWKCJQVFMgPSAlIiBQUkl1NjQsIFBUUyk7CisgICAgICAgICAgICAvLyBBTE9HSSgiUFRTID0gJS4yZiBzZWNzIiwgUFRTIC8gOTAwMDAuMGYpOworCisgICAgICAgICAgICBvcHRpb25hbF9ieXRlc19yZW1haW5pbmcgLT0gNTsKKworICAgICAgICAgICAgaWYgKFBUU19EVFNfZmxhZ3MgPT0gMykgeworICAgICAgICAgICAgICAgIGlmIChvcHRpb25hbF9ieXRlc19yZW1haW5pbmcgPCA1dSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChici5nZXRCaXRzKDQpICE9IDF1KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgRFRTID0gKCh1aW50NjRfdClici5nZXRCaXRzKDMpKSA8PCAzMDsKKyAgICAgICAgICAgICAgICBpZiAoYnIuZ2V0Qml0cygxKSAhPSAxdSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBEVFMgfD0gKCh1aW50NjRfdClici5nZXRCaXRzKDE1KSkgPDwgMTU7CisgICAgICAgICAgICAgICAgaWYgKGJyLmdldEJpdHMoMSkgIT0gMXUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRFRTIHw9IGJyLmdldEJpdHMoMTUpOworICAgICAgICAgICAgICAgIGlmIChici5nZXRCaXRzKDEpICE9IDF1KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQUxPR1YoIkRUUyA9ICUiIFBSSXU2NCwgRFRTKTsKKworICAgICAgICAgICAgICAgIG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZyAtPSA1OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKEVTQ1JfZmxhZykgeworICAgICAgICAgICAgaWYgKG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZyA8IDZ1KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnIuZ2V0Qml0cygyKTsKKworICAgICAgICAgICAgdWludDY0X3QgRVNDUiA9ICgodWludDY0X3QpYnIuZ2V0Qml0cygzKSkgPDwgMzA7CisgICAgICAgICAgICBpZiAoYnIuZ2V0Qml0cygxKSAhPSAxdSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFU0NSIHw9ICgodWludDY0X3QpYnIuZ2V0Qml0cygxNSkpIDw8IDE1OworICAgICAgICAgICAgaWYgKGJyLmdldEJpdHMoMSkgIT0gMXUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRVNDUiB8PSBici5nZXRCaXRzKDE1KTsKKyAgICAgICAgICAgIGlmIChici5nZXRCaXRzKDEpICE9IDF1KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQUxPR1YoIkVTQ1IgPSAlIiBQUkl1NjQsIEVTQ1IpOworICAgICAgICAgICAgLyogdW5zaWduZWQgRVNDUl9leHRlbnNpb24gPSAqL2JyLmdldEJpdHMoOSk7CisKKyAgICAgICAgICAgIGlmIChici5nZXRCaXRzKDEpICE9IDF1KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nIC09IDY7CisgICAgICAgIH0KKworICAgICAgICBpZiAoRVNfcmF0ZV9mbGFnKSB7CisgICAgICAgICAgICBpZiAob3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nIDwgM3UpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYnIuZ2V0Qml0cygxKSAhPSAxdSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiB1bnNpZ25lZCBFU19yYXRlID0gKi9ici5nZXRCaXRzKDIyKTsKKyAgICAgICAgICAgIGlmIChici5nZXRCaXRzKDEpICE9IDF1KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nIC09IDM7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZyAqIDgpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKworICAgICAgICBici5za2lwQml0cyhvcHRpb25hbF9ieXRlc19yZW1haW5pbmcgKiA4KTsKKworICAgICAgICAvLyBFUyBkYXRhIGZvbGxvd3MuCisKKyAgICAgICAgaWYgKFBFU19wYWNrZXRfbGVuZ3RoIDwgUEVTX2hlYWRlcl9kYXRhX2xlbmd0aCArIDMpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKworICAgICAgICB1bnNpZ25lZCBkYXRhTGVuZ3RoID0KKyAgICAgICAgICAgIFBFU19wYWNrZXRfbGVuZ3RoIC0gMyAtIFBFU19oZWFkZXJfZGF0YV9sZW5ndGg7CisKKyAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCBkYXRhTGVuZ3RoICogOCkgeworICAgICAgICAgICAgQUxPR0UoIlBFUyBwYWNrZXQgZG9lcyBub3QgY2FycnkgZW5vdWdoIGRhdGEgdG8gY29udGFpbiAiCisgICAgICAgICAgICAgICAgICJwYXlsb2FkLiAobnVtQml0c0xlZnQgPSAlenUsIHJlcXVpcmVkID0gJXUpIiwKKyAgICAgICAgICAgICAgICAgYnIubnVtQml0c0xlZnQoKSwgZGF0YUxlbmd0aCAqIDgpOworCisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCBkYXRhTGVuZ3RoICogOCkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIHNzaXplX3QgaW5kZXggPSBtVHJhY2tzLmluZGV4T2ZLZXkoc3RyZWFtX2lkKTsKKyAgICAgICAgaWYgKGluZGV4IDwgMCAmJiBtU2Nhbm5pbmcpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIHN0cmVhbVR5cGU7CisKKyAgICAgICAgICAgIHNzaXplX3Qgc3RyZWFtVHlwZUluZGV4OworICAgICAgICAgICAgaWYgKG1Qcm9ncmFtU3RyZWFtTWFwVmFsaWQKKyAgICAgICAgICAgICAgICAgICAgJiYgKHN0cmVhbVR5cGVJbmRleCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbVR5cGVCeUVTSUQuaW5kZXhPZktleShzdHJlYW1faWQpKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IG1TdHJlYW1UeXBlQnlFU0lELnZhbHVlQXQoc3RyZWFtVHlwZUluZGV4KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKHN0cmVhbV9pZCAmIH4weDFmKSA9PSAweGMwKSB7CisgICAgICAgICAgICAgICAgLy8gSVNPL0lFQyAxMzgxOC0zIG9yIElTTy9JRUMgMTExNzItMyBvciBJU08vSUVDIDEzODE4LTcKKyAgICAgICAgICAgICAgICAvLyBvciBJU08vSUVDIDE0NDk2LTMgYXVkaW8KKyAgICAgICAgICAgICAgICBzdHJlYW1UeXBlID0gQVRTUGFyc2VyOjpTVFJFQU1UWVBFX01QRUcyX0FVRElPOworICAgICAgICAgICAgfSBlbHNlIGlmICgoc3RyZWFtX2lkICYgfjB4MGYpID09IDB4ZTApIHsKKyAgICAgICAgICAgICAgICAvLyBJU08vSUVDIDEzODE4LTIgb3IgSVNPL0lFQyAxMTE3Mi0yIG9yIElTTy9JRUMgMTQ0OTYtMiB2aWRlbworICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUgPSBBVFNQYXJzZXI6OlNUUkVBTVRZUEVfTVBFRzJfVklERU87CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUgPSBBVFNQYXJzZXI6OlNUUkVBTVRZUEVfUkVTRVJWRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGluZGV4ID0gbVRyYWNrcy5hZGQoCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbV9pZCwgbmV3IFRyYWNrKHRoaXMsIHN0cmVhbV9pZCwgc3RyZWFtVHlwZSkpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7CisKKyAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgIGVyciA9CisgICAgICAgICAgICAgICAgbVRyYWNrcy5lZGl0VmFsdWVBdChpbmRleCktPmFwcGVuZFBFU0RhdGEoCisgICAgICAgICAgICAgICAgICAgIFBUU19EVFNfZmxhZ3MsIFBUUywgRFRTLCBici5kYXRhKCksIGRhdGFMZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgYnIuc2tpcEJpdHMoZGF0YUxlbmd0aCAqIDgpOworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHN0cmVhbV9pZCA9PSAweGJlKSB7ICAvLyBwYWRkaW5nX3N0cmVhbQorICAgICAgICBpZiAoUEVTX3BhY2tldF9sZW5ndGggPT0gMHUpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICAgICAgYnIuc2tpcEJpdHMoUEVTX3BhY2tldF9sZW5ndGggKiA4KTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoUEVTX3BhY2tldF9sZW5ndGggPT0gMHUpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICAgICAgYnIuc2tpcEJpdHMoUEVTX3BhY2tldF9sZW5ndGggKiA4KTsKKyAgICB9CisKKyAgICByZXR1cm4gbjsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworTVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2s6OlRyYWNrKAorICAgICAgICBNUEVHMlBTRXh0cmFjdG9yICpleHRyYWN0b3IsIHVuc2lnbmVkIHN0cmVhbV9pZCwgdW5zaWduZWQgc3RyZWFtX3R5cGUpCisgICAgOiBtRXh0cmFjdG9yKGV4dHJhY3RvciksCisgICAgICBtU3RyZWFtSUQoc3RyZWFtX2lkKSwKKyAgICAgIG1TdHJlYW1UeXBlKHN0cmVhbV90eXBlKSwKKyAgICAgIG1RdWV1ZShOVUxMKSB7CisgICAgYm9vbCBzdXBwb3J0ZWQgPSB0cnVlOworICAgIEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6TW9kZSBtb2RlOworCisgICAgc3dpdGNoIChtU3RyZWFtVHlwZSkgeworICAgICAgICBjYXNlIEFUU1BhcnNlcjo6U1RSRUFNVFlQRV9IMjY0OgorICAgICAgICAgICAgbW9kZSA9IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6SDI2NDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFUU1BhcnNlcjo6U1RSRUFNVFlQRV9NUEVHMl9BVURJT19BRFRTOgorICAgICAgICAgICAgbW9kZSA9IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6QUFDOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVRTUGFyc2VyOjpTVFJFQU1UWVBFX01QRUcxX0FVRElPOgorICAgICAgICBjYXNlIEFUU1BhcnNlcjo6U1RSRUFNVFlQRV9NUEVHMl9BVURJTzoKKyAgICAgICAgICAgIG1vZGUgPSBFbGVtZW50YXJ5U3RyZWFtUXVldWU6Ok1QRUdfQVVESU87CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEFUU1BhcnNlcjo6U1RSRUFNVFlQRV9NUEVHMV9WSURFTzoKKyAgICAgICAgY2FzZSBBVFNQYXJzZXI6OlNUUkVBTVRZUEVfTVBFRzJfVklERU86CisgICAgICAgICAgICBtb2RlID0gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpNUEVHX1ZJREVPOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBVFNQYXJzZXI6OlNUUkVBTVRZUEVfTVBFRzRfVklERU86CisgICAgICAgICAgICBtb2RlID0gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpNUEVHNF9WSURFTzsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBzdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChzdXBwb3J0ZWQpIHsKKyAgICAgICAgbVF1ZXVlID0gbmV3IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZShtb2RlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HSSgidW5zdXBwb3J0ZWQgc3RyZWFtIElEIDB4JTAyeCIsIHN0cmVhbV9pZCk7CisgICAgfQorfQorCitNUEVHMlBTRXh0cmFjdG9yOjpUcmFjazo6flRyYWNrKCkgeworICAgIGRlbGV0ZSBtUXVldWU7CisgICAgbVF1ZXVlID0gTlVMTDsKK30KKworc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2s6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqKSB7CisgICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICByZXR1cm4gbVNvdXJjZS0+c3RhcnQoTlVMTCk7IC8vIEFub3RoZXJQYWNrZXRTb3VyY2U6OnN0YXJ0IGRvZXNuJ3QgdXNlIGl0cyBhcmd1bWVudAorfQorCitzdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjazo6c3RvcCgpIHsKKyAgICBpZiAobVNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHJldHVybiBtU291cmNlLT5zdG9wKCk7Cit9CisKK3N0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKSB7CisgICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBzcDxNZXRhRGF0YT4gc291cmNlTWV0YSA9IG1Tb3VyY2UtPmdldEZvcm1hdCgpOworICAgIG1ldGEgPSAqc291cmNlTWV0YTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CisgICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBmaW5hbFJlc3VsdDsKKyAgICB3aGlsZSAoIW1Tb3VyY2UtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZmluYWxSZXN1bHQpKSB7CisgICAgICAgIGlmIChmaW5hbFJlc3VsdCAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtRXh0cmFjdG9yLT5mZWVkTW9yZSgpOworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIG1Tb3VyY2UtPnNpZ25hbEVPUyhlcnIpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG1Tb3VyY2UtPnJlYWQoYnVmZmVyLCBvcHRpb25zKTsKK30KKworc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2s6OmFwcGVuZFBFU0RhdGEoCisgICAgICAgIHVuc2lnbmVkIFBUU19EVFNfZmxhZ3MsCisgICAgICAgIHVpbnQ2NF90IFBUUywgdWludDY0X3QgLyogRFRTICovLAorICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChtUXVldWUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgaW50NjRfdCB0aW1lVXM7CisgICAgaWYgKFBUU19EVFNfZmxhZ3MgPT0gMiB8fCBQVFNfRFRTX2ZsYWdzID09IDMpIHsKKyAgICAgICAgdGltZVVzID0gKFBUUyAqIDEwMCkgLyA5OworICAgIH0gZWxzZSB7CisgICAgICAgIHRpbWVVcyA9IDA7CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyID0gbVF1ZXVlLT5hcHBlbmREYXRhKGRhdGEsIHNpemUsIHRpbWVVcyk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdDsKKyAgICB3aGlsZSAoKGFjY2Vzc1VuaXQgPSBtUXVldWUtPmRlcXVldWVBY2Nlc3NVbml0KCkpICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgeworICAgICAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtUXVldWUtPmdldEZvcm1hdCgpOworCisgICAgICAgICAgICBpZiAobWV0YSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIlN0cmVhbSBJRCAweCUwMnggbm93IGhhcyBkYXRhLiIsIG1TdHJlYW1JRCk7CisKKyAgICAgICAgICAgICAgICBtU291cmNlID0gbmV3IEFub3RoZXJQYWNrZXRTb3VyY2UobWV0YSk7CisgICAgICAgICAgICAgICAgbVNvdXJjZS0+cXVldWVBY2Nlc3NVbml0KGFjY2Vzc1VuaXQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG1RdWV1ZS0+Z2V0Rm9ybWF0KCkgIT0gTlVMTCkgeworICAgICAgICAgICAgbVNvdXJjZS0+cXVldWVBY2Nlc3NVbml0KGFjY2Vzc1VuaXQpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitNUEVHMlBTRXh0cmFjdG9yOjpXcmFwcGVkVHJhY2s6OldyYXBwZWRUcmFjaygKKyAgICAgICAgTVBFRzJQU0V4dHJhY3RvciAqZXh0cmFjdG9yLCBjb25zdCBzcDxUcmFjaz4gJnRyYWNrKQorICAgIDogbUV4dHJhY3RvcihleHRyYWN0b3IpLAorICAgICAgbVRyYWNrKHRyYWNrKSB7Cit9CisKK01QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjazo6fldyYXBwZWRUcmFjaygpIHsKK30KKworc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6V3JhcHBlZFRyYWNrOjpzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcykgeworICAgIHJldHVybiBtVHJhY2stPnN0YXJ0KHBhcmFtcyk7Cit9CisKK3N0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjazo6c3RvcCgpIHsKKyAgICByZXR1cm4gbVRyYWNrLT5zdG9wKCk7Cit9CisKK3N0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjazo6Z2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSkgeworICAgIHJldHVybiBtVHJhY2stPmdldEZvcm1hdChtZXRhKTsKK30KKworc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6V3JhcHBlZFRyYWNrOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CisgICAgcmV0dXJuIG1UcmFjay0+cmVhZChidWZmZXIsIG9wdGlvbnMpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIFNuaWZmTVBFRzJQUygKKyAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpIHsKKyAgICB1aW50OF90IGhlYWRlcls1XTsKKyAgICBpZiAoc291cmNlLT5yZWFkQXQoMCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkgPCAoc3NpemVfdClzaXplb2YoaGVhZGVyKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKG1lbWNtcCgiXHgwMFx4MDBceDAxXHhiYSIsIGhlYWRlciwgNCkgfHwgKGhlYWRlcls0XSA+PiA2KSAhPSAxKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAqY29uZmlkZW5jZSA9IDAuMjVmOyAgLy8gU2xpZ2h0bHkgbGFyZ2VyIHRoYW4gLm1wMyBleHRyYWN0b3IncyBjb25maWRlbmNlCisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJQU0V4dHJhY3Rvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlBTRXh0cmFjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI5ZGFkOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJQU0V4dHJhY3Rvci5oCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1QRUcyX1BTX0VYVFJBQ1RPUl9IXworCisjZGVmaW5lIE1QRUcyX1BTX0VYVFJBQ1RPUl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFCdWZmZXI7CitzdHJ1Y3QgQU1lc3NhZ2U7CitzdHJ1Y3QgVHJhY2s7CitjbGFzcyBTdHJpbmc4OworCitzdHJ1Y3QgTVBFRzJQU0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7CisgICAgZXhwbGljaXQgTVBFRzJQU0V4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKTsKKworICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOworCisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIGNvbnN0OworICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiTVBFRzJQU0V4dHJhY3RvciI7IH0KKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfk1QRUcyUFNFeHRyYWN0b3IoKTsKKworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgVHJhY2s7CisgICAgc3RydWN0IFdyYXBwZWRUcmFjazsKKworICAgIG11dGFibGUgTXV0ZXggbUxvY2s7CisgICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworCisgICAgb2ZmNjRfdCBtT2Zmc2V0OworICAgIHN0YXR1c190IG1GaW5hbFJlc3VsdDsKKyAgICBzcDxBQnVmZmVyPiBtQnVmZmVyOworICAgIEtleWVkVmVjdG9yPHVuc2lnbmVkLCBzcDxUcmFjaz4gPiBtVHJhY2tzOworICAgIGJvb2wgbVNjYW5uaW5nOworCisgICAgYm9vbCBtUHJvZ3JhbVN0cmVhbU1hcFZhbGlkOworICAgIEtleWVkVmVjdG9yPHVuc2lnbmVkLCB1bnNpZ25lZD4gbVN0cmVhbVR5cGVCeUVTSUQ7CisKKyAgICBzdGF0dXNfdCBmZWVkTW9yZSgpOworCisgICAgc3RhdHVzX3QgZGVxdWV1ZUNodW5rKCk7CisgICAgc3NpemVfdCBkZXF1ZXVlUGFjaygpOworICAgIHNzaXplX3QgZGVxdWV1ZVN5c3RlbUhlYWRlcigpOworICAgIHNzaXplX3QgZGVxdWV1ZVBFUygpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTVBFRzJQU0V4dHJhY3Rvcik7Cit9OworCitib29sIFNuaWZmTVBFRzJQUyhEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSk7CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTVBFRzJfUFNfRVhUUkFDVE9SX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJUU0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyVFNFeHRyYWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4M2Y3Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyVFNFeHRyYWN0b3IuY3BwCkBAIC0wLDAgKzEsNjY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNUEVHMlRTRXh0cmFjdG9yIgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIk1QRUcyVFNFeHRyYWN0b3IuaCIKKworI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvSVN0cmVhbVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUtleXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCisjaW5jbHVkZSAibXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmgiCisjaW5jbHVkZSAibXBlZzJ0cy9BVFNQYXJzZXIuaCIKKworI2luY2x1ZGUgPGhpZGwvSHlicmlkSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYXMvMS4wL0lDYXMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyBoYXJkd2FyZTo6Y2FzOjpWMV8wOjpJQ2FzOworCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtUU1BhY2tldFNpemUgPSAxODg7CitzdGF0aWMgY29uc3QgaW50IGtNYXhEdXJhdGlvblJlYWRTaXplID0gMjUwMDAwTEw7CitzdGF0aWMgY29uc3QgaW50IGtNYXhEdXJhdGlvblJldHJ5ID0gNjsKKworc3RydWN0IE1QRUcyVFNTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFjayB7CisgICAgTVBFRzJUU1NvdXJjZSgKKyAgICAgICAgICAgIE1QRUcyVFNFeHRyYWN0b3IgKmV4dHJhY3RvciwKKyAgICAgICAgICAgIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZpbXBsLAorICAgICAgICAgICAgYm9vbCBkb2VzU2Vlayk7CisgICAgdmlydHVhbCB+TVBFRzJUU1NvdXJjZSgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcyA9IE5VTEwpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKworcHJpdmF0ZToKKyAgICBNUEVHMlRTRXh0cmFjdG9yICptRXh0cmFjdG9yOworICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IG1JbXBsOworCisgICAgLy8gSWYgdGhlcmUgYXJlIGJvdGggYXVkaW8gYW5kIHZpZGVvIHN0cmVhbXMsIG9ubHkgdGhlIHZpZGVvIHN0cmVhbQorICAgIC8vIHdpbGwgc2lnbmFsIHNlZWsgb24gdGhlIGV4dHJhY3Rvcjsgb3RoZXJ3aXNlIHRoZSBzaW5nbGUgc3RyZWFtIHdpbGwgc2Vlay4KKyAgICBib29sIG1Eb2VzU2VlazsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1QRUcyVFNTb3VyY2UpOworfTsKKworTVBFRzJUU1NvdXJjZTo6TVBFRzJUU1NvdXJjZSgKKyAgICAgICAgTVBFRzJUU0V4dHJhY3RvciAqZXh0cmFjdG9yLAorICAgICAgICBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmaW1wbCwKKyAgICAgICAgYm9vbCBkb2VzU2VlaykKKyAgICA6IG1FeHRyYWN0b3IoZXh0cmFjdG9yKSwKKyAgICAgIG1JbXBsKGltcGwpLAorICAgICAgbURvZXNTZWVrKGRvZXNTZWVrKSB7Cit9CisKK01QRUcyVFNTb3VyY2U6On5NUEVHMlRTU291cmNlKCkgeworfQorCitzdGF0dXNfdCBNUEVHMlRTU291cmNlOjpzdGFydChNZXRhRGF0YUJhc2UgKikgeworICAgIHJldHVybiBtSW1wbC0+c3RhcnQoTlVMTCk7IC8vIEFub3RoZXJQYWNrZXRTb3VyY2U6OnN0YXJ0KCkgZG9lc24ndCB1c2UgaXRzIGFyZ3VtZW50Cit9CisKK3N0YXR1c190IE1QRUcyVFNTb3VyY2U6OnN0b3AoKSB7CisgICAgcmV0dXJuIG1JbXBsLT5zdG9wKCk7Cit9CisKK3N0YXR1c190IE1QRUcyVFNTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKKyAgICBzcDxNZXRhRGF0YT4gaW1wbE1ldGEgPSBtSW1wbC0+Z2V0Rm9ybWF0KCk7CisgICAgbWV0YSA9ICppbXBsTWV0YTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1QRUcyVFNTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKyAgICAqb3V0ID0gTlVMTDsKKworICAgIGludDY0X3Qgc2Vla1RpbWVVczsKKyAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgc2Vla01vZGU7CisgICAgaWYgKG1Eb2VzU2VlayAmJiBvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJnNlZWtNb2RlKSkgeworICAgICAgICAvLyBzZWVrIGlzIG5lZWRlZAorICAgICAgICBzdGF0dXNfdCBlcnIgPSBtRXh0cmFjdG9yLT5zZWVrKHNlZWtUaW1lVXMsIHNlZWtNb2RlKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtRXh0cmFjdG9yLT5mZWVkVW50aWxCdWZmZXJBdmFpbGFibGUobUltcGwpICE9IE9LKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgIH0KKworICAgIHJldHVybiBtSW1wbC0+cmVhZChvdXQsIG9wdGlvbnMpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitNUEVHMlRTRXh0cmFjdG9yOjpNUEVHMlRTRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCisgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAorICAgICAgbVBhcnNlcihuZXcgQVRTUGFyc2VyKSwKKyAgICAgIG1MYXN0U3luY0V2ZW50KDApLAorICAgICAgbU9mZnNldCgwKSB7CisgICAgaW5pdCgpOworfQorCitzaXplX3QgTVBFRzJUU0V4dHJhY3Rvcjo6Y291bnRUcmFja3MoKSB7CisgICAgcmV0dXJuIG1Tb3VyY2VJbXBscy5zaXplKCk7Cit9CisKK01lZGlhVHJhY2sgKk1QRUcyVFNFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgeworICAgIGlmIChpbmRleCA+PSBtU291cmNlSW1wbHMuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8vIFRoZSBzZWVrIHJlZmVyZW5jZSB0cmFjayAodmlkZW8gaWYgcHJlc2VudDsgYXVkaW8gb3RoZXJ3aXNlKSBwZXJmb3JtcworICAgIC8vIHNlZWsgcmVxdWVzdHMsIHdoaWxlIG90aGVyIHRyYWNrcyBpZ25vcmUgcmVxdWVzdHMuCisgICAgcmV0dXJuIG5ldyBNUEVHMlRTU291cmNlKHRoaXMsIG1Tb3VyY2VJbXBscy5lZGl0SXRlbUF0KGluZGV4KSwKKyAgICAgICAgICAgIChtU2Vla1N5bmNQb2ludHMgPT0gJm1TeW5jUG9pbnRzLmVkaXRJdGVtQXQoaW5kZXgpKSk7Cit9CisKK3N0YXR1c190IE1QRUcyVFNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCisgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgeworICAgIHNwPE1ldGFEYXRhPiBpbXBsTWV0YSA9IGluZGV4IDwgbVNvdXJjZUltcGxzLnNpemUoKQorICAgICAgICA/IG1Tb3VyY2VJbXBscy5lZGl0SXRlbUF0KGluZGV4KS0+Z2V0Rm9ybWF0KCkgOiBOVUxMOworICAgIGlmIChpbXBsTWV0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBtZXRhID0gKmltcGxNZXRhOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhKSB7CisgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUcyVFMpOworCisgICAgcmV0dXJuIE9LOworfQorCisvL3N0YXRpYworYm9vbCBNUEVHMlRTRXh0cmFjdG9yOjppc1NjcmFtYmxlZEZvcm1hdChNZXRhRGF0YUJhc2UgJmZvcm1hdCkgeworICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgcmV0dXJuIGZvcm1hdC5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKQorICAgICAgICAgICAgJiYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX1NDUkFNQkxFRCwgbWltZSkKKyAgICAgICAgICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfQVVESU9fU0NSQU1CTEVELCBtaW1lKSk7Cit9CisKK3N0YXR1c190IE1QRUcyVFNFeHRyYWN0b3I6OnNldE1lZGlhQ2FzKGNvbnN0IHVpbnQ4X3QqIGNhc1Rva2VuLCBzaXplX3Qgc2l6ZSkgeworICAgIEhhbFRva2VuIGhhbFRva2VuOworICAgIGhhbFRva2VuLnNldFRvRXh0ZXJuYWwoKHVpbnQ4X3QqKWNhc1Rva2VuLCBzaXplKTsKKyAgICBzcDxJQ2FzPiBjYXMgPSBJQ2FzOjpjYXN0RnJvbShyZXRyaWV2ZUhhbEludGVyZmFjZShoYWxUb2tlbikpOworICAgIEFMT0dEKCJzZXRNZWRpYUNhczogJXAiLCBjYXMuZ2V0KCkpOworCisgICAgc3RhdHVzX3QgZXJyID0gbVBhcnNlci0+c2V0TWVkaWFDYXMoY2FzKTsKKyAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgIEFMT0dJKCJBbGwgdHJhY2tzIG5vdyBoYXZlIGRlc2NyYW1ibGVycyIpOworICAgICAgICBpbml0KCk7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3ZvaWQgTVBFRzJUU0V4dHJhY3Rvcjo6YWRkU291cmNlKGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZpbXBsKSB7CisgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNvdXJjZUltcGxzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtU291cmNlSW1wbHNbaV0gPT0gaW1wbCkgeworICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFmb3VuZCkgeworICAgICAgICBtU291cmNlSW1wbHMucHVzaChpbXBsKTsKKyAgICB9Cit9CisKK3ZvaWQgTVBFRzJUU0V4dHJhY3Rvcjo6aW5pdCgpIHsKKyAgICBib29sIGhhdmVBdWRpbyA9IGZhbHNlOworICAgIGJvb2wgaGF2ZVZpZGVvID0gZmFsc2U7CisgICAgaW50NjRfdCBzdGFydFRpbWUgPSBBTG9vcGVyOjpHZXROb3dVcygpOworCisgICAgc3RhdHVzX3QgZXJyOworICAgIHdoaWxlICgoZXJyID0gZmVlZE1vcmUodHJ1ZSAvKiBpc0luaXQgKi8pKSA9PSBPSworICAgICAgICAgICAgfHwgZXJyID09IEVSUk9SX0RSTV9ERUNSWVBUX1VOSVRfTk9UX0lOSVRJQUxJWkVEKSB7CisgICAgICAgIGlmIChoYXZlQXVkaW8gJiYgaGF2ZVZpZGVvKSB7CisgICAgICAgICAgICBhZGRTeW5jUG9pbnRfbChtTGFzdFN5bmNFdmVudCk7CisgICAgICAgICAgICBtTGFzdFN5bmNFdmVudC5yZXNldCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFoYXZlVmlkZW8pIHsKKyAgICAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IGltcGwgPSBtUGFyc2VyLT5nZXRTb3VyY2UoQVRTUGFyc2VyOjpWSURFTyk7CisKKyAgICAgICAgICAgIGlmIChpbXBsICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBzcDxNZXRhRGF0YT4gZm9ybWF0ID0gaW1wbC0+Z2V0Rm9ybWF0KCk7CisgICAgICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGhhdmVWaWRlbyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGFkZFNvdXJjZShpbXBsKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1NjcmFtYmxlZEZvcm1hdCgqKGZvcm1hdC5nZXQoKSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3luY1BvaW50cy5wdXNoKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtU2Vla1N5bmNQb2ludHMgPSAmbVN5bmNQb2ludHMuZWRpdFRvcCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFoYXZlQXVkaW8pIHsKKyAgICAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IGltcGwgPSBtUGFyc2VyLT5nZXRTb3VyY2UoQVRTUGFyc2VyOjpBVURJTyk7CisKKyAgICAgICAgICAgIGlmIChpbXBsICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBzcDxNZXRhRGF0YT4gZm9ybWF0ID0gaW1wbC0+Z2V0Rm9ybWF0KCk7CisgICAgICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGhhdmVBdWRpbyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGFkZFNvdXJjZShpbXBsKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1NjcmFtYmxlZEZvcm1hdCgqKGZvcm1hdC5nZXQoKSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3luY1BvaW50cy5wdXNoKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhhdmVWaWRlbykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZWVrU3luY1BvaW50cyA9ICZtU3luY1BvaW50cy5lZGl0VG9wKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBhZGRTeW5jUG9pbnRfbChtTGFzdFN5bmNFdmVudCk7CisgICAgICAgIG1MYXN0U3luY0V2ZW50LnJlc2V0KCk7CisKKyAgICAgICAgLy8gRVJST1JfRFJNX0RFQ1JZUFRfVU5JVF9OT1RfSU5JVElBTElaRUQgaXMgcmV0dXJuZWQgd2hlbiB0aGUgbXBlZzJ0cworICAgICAgICAvLyBpcyBzY3JhbWJsZWQgYnV0IHdlIGRvbid0IGhhdmUgYSBNZWRpYUNhcyBvYmplY3Qgc2V0LiBUaGUgZXh0cmFjdGlvbgorICAgICAgICAvLyB3aWxsIG9ubHkgY29udGludWUgd2hlbiBzZXRNZWRpYUNhcygpIGlzIGNhbGxlZCBzdWNjZXNzZnVsbHkuCisgICAgICAgIGlmIChlcnIgPT0gRVJST1JfRFJNX0RFQ1JZUFRfVU5JVF9OT1RfSU5JVElBTElaRUQpIHsKKyAgICAgICAgICAgIEFMT0dJKCJzdG9wcGVkIHBhcnNpbmcgc2NyYW1ibGVkIGNvbnRlbnQsICIKKyAgICAgICAgICAgICAgICAgICJoYXZlQXVkaW89JWQsIGhhdmVWaWRlbz0lZCwgZWxhc3BlZFRpbWU9JSIgUFJJZDY0LAorICAgICAgICAgICAgICAgICAgICBoYXZlQXVkaW8sIGhhdmVWaWRlbywgQUxvb3Blcjo6R2V0Tm93VXMoKSAtIHN0YXJ0VGltZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBXYWl0IG9ubHkgZm9yIDIgc2Vjb25kcyB0byBkZXRlY3QgYXVkaW8vdmlkZW8gc3RyZWFtcy4KKyAgICAgICAgaWYgKEFMb29wZXI6OkdldE5vd1VzKCkgLSBzdGFydFRpbWUgPiAyMDAwMDAwbGwpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgb2ZmNjRfdCBzaXplOworICAgIGlmIChtRGF0YVNvdXJjZS0+Z2V0U2l6ZSgmc2l6ZSkgPT0gT0sgJiYgKGhhdmVBdWRpbyB8fCBoYXZlVmlkZW8pKSB7CisgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IGltcGwgPSBoYXZlVmlkZW8KKyAgICAgICAgICAgICAgICA/IG1QYXJzZXItPmdldFNvdXJjZShBVFNQYXJzZXI6OlZJREVPKQorICAgICAgICAgICAgICAgIDogbVBhcnNlci0+Z2V0U291cmNlKEFUU1BhcnNlcjo6QVVESU8pOworICAgICAgICBzaXplX3QgcHJldlN5bmNTaXplID0gMTsKKyAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzID0gLTE7CisgICAgICAgIExpc3Q8aW50NjRfdD4gZHVyYXRpb25zOworICAgICAgICAvLyBFc3RpbWF0ZSBkdXJhdGlvbiAtLS0gc3RhYmlsaXplIHVudGlsIHlvdSBnZXQgPDUwMG1zIGRldmlhdGlvbi4KKyAgICAgICAgd2hpbGUgKGZlZWRNb3JlKCkgPT0gT0sKKyAgICAgICAgICAgICAgICAmJiBBTG9vcGVyOjpHZXROb3dVcygpIC0gc3RhcnRUaW1lIDw9IDIwMDAwMDBsbCkgeworICAgICAgICAgICAgaWYgKG1TZWVrU3luY1BvaW50cy0+c2l6ZSgpID4gcHJldlN5bmNTaXplKSB7CisgICAgICAgICAgICAgICAgcHJldlN5bmNTaXplID0gbVNlZWtTeW5jUG9pbnRzLT5zaXplKCk7CisgICAgICAgICAgICAgICAgaW50NjRfdCBkaWZmVXMgPSBtU2Vla1N5bmNQb2ludHMtPmtleUF0KHByZXZTeW5jU2l6ZSAtIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAtIG1TZWVrU3luY1BvaW50cy0+a2V5QXQoMCk7CisgICAgICAgICAgICAgICAgb2ZmNjRfdCBkaWZmT2Zmc2V0ID0gbVNlZWtTeW5jUG9pbnRzLT52YWx1ZUF0KHByZXZTeW5jU2l6ZSAtIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAtIG1TZWVrU3luY1BvaW50cy0+dmFsdWVBdCgwKTsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IGN1cnJlbnREdXJhdGlvblVzID0gc2l6ZSAqIGRpZmZVcyAvIGRpZmZPZmZzZXQ7CisgICAgICAgICAgICAgICAgZHVyYXRpb25zLnB1c2hfYmFjayhjdXJyZW50RHVyYXRpb25Vcyk7CisgICAgICAgICAgICAgICAgaWYgKGR1cmF0aW9ucy5zaXplKCkgPiA1KSB7CisgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9ucy5lcmFzZShkdXJhdGlvbnMuYmVnaW4oKSk7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgbWluID0gKmR1cmF0aW9ucy5iZWdpbigpOworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG1heCA9ICpkdXJhdGlvbnMuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChhdXRvIGR1cmF0aW9uIDogZHVyYXRpb25zKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWluID4gZHVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4gPSBkdXJhdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXggPCBkdXJhdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heCA9IGR1cmF0aW9uOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChtYXggLSBtaW4gPCA1MDAgKiAxMDAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvblVzID0gY3VycmVudER1cmF0aW9uVXM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdGF0dXNfdCBlcnI7CisgICAgICAgIGludDY0X3QgYnVmZmVyZWREdXJhdGlvblVzOworICAgICAgICBidWZmZXJlZER1cmF0aW9uVXMgPSBpbXBsLT5nZXRCdWZmZXJlZER1cmF0aW9uVXMoJmVycik7CisgICAgICAgIGlmIChlcnIgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgZHVyYXRpb25VcyA9IGJ1ZmZlcmVkRHVyYXRpb25VczsKKyAgICAgICAgfQorICAgICAgICBpZiAoZHVyYXRpb25VcyA+IDApIHsKKyAgICAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiBtZXRhID0gaW1wbC0+Z2V0Rm9ybWF0KCk7CisgICAgICAgICAgICBtZXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uVXMpOworICAgICAgICAgICAgaW1wbC0+c2V0Rm9ybWF0KG1ldGEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXN0aW1hdGVEdXJhdGlvbnNGcm9tVGltZXNVc0F0RW5kKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HSSgiaGF2ZUF1ZGlvPSVkLCBoYXZlVmlkZW89JWQsIGVsYXNwZWRUaW1lPSUiIFBSSWQ2NCwKKyAgICAgICAgICAgIGhhdmVBdWRpbywgaGF2ZVZpZGVvLCBBTG9vcGVyOjpHZXROb3dVcygpIC0gc3RhcnRUaW1lKTsKK30KKworc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6ZmVlZE1vcmUoYm9vbCBpc0luaXQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgdWludDhfdCBwYWNrZXRba1RTUGFja2V0U2l6ZV07CisgICAgc3NpemVfdCBuID0gbURhdGFTb3VyY2UtPnJlYWRBdChtT2Zmc2V0LCBwYWNrZXQsIGtUU1BhY2tldFNpemUpOworCisgICAgaWYgKG4gPCAoc3NpemVfdClrVFNQYWNrZXRTaXplKSB7CisgICAgICAgIGlmIChuID49IDApIHsKKyAgICAgICAgICAgIG1QYXJzZXItPnNpZ25hbEVPUyhFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKG4gPCAwKSA/IChzdGF0dXNfdCluIDogRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICB9CisKKyAgICBBVFNQYXJzZXI6OlN5bmNFdmVudCBldmVudChtT2Zmc2V0KTsKKyAgICBtT2Zmc2V0ICs9IG47CisgICAgc3RhdHVzX3QgZXJyID0gbVBhcnNlci0+ZmVlZFRTUGFja2V0KHBhY2tldCwga1RTUGFja2V0U2l6ZSwgJmV2ZW50KTsKKyAgICBpZiAoZXZlbnQuaGFzUmV0dXJuZWREYXRhKCkpIHsKKyAgICAgICAgaWYgKGlzSW5pdCkgeworICAgICAgICAgICAgbUxhc3RTeW5jRXZlbnQgPSBldmVudDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFkZFN5bmNQb2ludF9sKGV2ZW50KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCit2b2lkIE1QRUcyVFNFeHRyYWN0b3I6OmFkZFN5bmNQb2ludF9sKGNvbnN0IEFUU1BhcnNlcjo6U3luY0V2ZW50ICZldmVudCkgeworICAgIGlmICghZXZlbnQuaGFzUmV0dXJuZWREYXRhKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNvdXJjZUltcGxzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmIChtU291cmNlSW1wbHNbaV0uZ2V0KCkgPT0gZXZlbnQuZ2V0TWVkaWFTb3VyY2UoKS5nZXQoKSkgeworICAgICAgICAgICAgS2V5ZWRWZWN0b3I8aW50NjRfdCwgb2ZmNjRfdD4gKnN5bmNQb2ludHMgPSAmbVN5bmNQb2ludHMuZWRpdEl0ZW1BdChpKTsKKyAgICAgICAgICAgIHN5bmNQb2ludHMtPmFkZChldmVudC5nZXRUaW1lVXMoKSwgZXZlbnQuZ2V0T2Zmc2V0KCkpOworICAgICAgICAgICAgLy8gV2UncmUga2VlcGluZyB0aGUgc2l6ZSBvZiB0aGUgc3luYyBwb2ludHMgYXQgbW9zdCA1bWIgcGVyIGEgdHJhY2suCisgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IHN5bmNQb2ludHMtPnNpemUoKTsKKyAgICAgICAgICAgIGlmIChzaXplID49IDMyNzY4MCkgeworICAgICAgICAgICAgICAgIGludDY0X3QgZmlyc3RUaW1lVXMgPSBzeW5jUG9pbnRzLT5rZXlBdCgwKTsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IGxhc3RUaW1lVXMgPSBzeW5jUG9pbnRzLT5rZXlBdChzaXplIC0gMSk7CisgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmdldFRpbWVVcygpIC0gZmlyc3RUaW1lVXMgPiBsYXN0VGltZVVzIC0gZXZlbnQuZ2V0VGltZVVzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3luY1BvaW50cy0+cmVtb3ZlSXRlbXNBdCgwLCA0MDk2KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzeW5jUG9pbnRzLT5yZW1vdmVJdGVtc0F0KHNpemUgLSA0MDk2LCA0MDk2KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6ZXN0aW1hdGVEdXJhdGlvbnNGcm9tVGltZXNVc0F0RW5kKCkgIHsKKyAgICBpZiAoIShtRGF0YVNvdXJjZS0+ZmxhZ3MoKSAmIERhdGFTb3VyY2VCYXNlOjprSXNMb2NhbEZpbGVTb3VyY2UpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICBvZmY2NF90IHNpemUgPSAwOworICAgIHN0YXR1c190IGVyciA9IG1EYXRhU291cmNlLT5nZXRTaXplKCZzaXplKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgdWludDhfdCBwYWNrZXRba1RTUGFja2V0U2l6ZV07CisgICAgY29uc3Qgb2ZmNjRfdCB6ZXJvID0gMDsKKyAgICBvZmY2NF90IG9mZnNldCA9IG1heCh6ZXJvLCBzaXplIC0ga01heER1cmF0aW9uUmVhZFNpemUpOworICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgJnBhY2tldCwgMCkgPCAwKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisKKyAgICBpbnQgcmV0cnkgPSAwOworICAgIGJvb2wgYWxsRHVyYXRpb25zRm91bmQgPSBmYWxzZTsKKyAgICBpbnQ2NF90IHRpbWVBbmNob3JVcyA9IG1QYXJzZXItPmdldEZpcnN0UFRTVGltZVVzKCk7CisgICAgZG8geworICAgICAgICBpbnQgYnl0ZXNSZWFkID0gMDsKKyAgICAgICAgc3A8QVRTUGFyc2VyPiBwYXJzZXIgPSBuZXcgQVRTUGFyc2VyKEFUU1BhcnNlcjo6VFNfVElNRVNUQU1QU19BUkVfQUJTT0xVVEUpOworICAgICAgICBBVFNQYXJzZXI6OlN5bmNFdmVudCBldigwKTsKKyAgICAgICAgb2Zmc2V0ID0gbWF4KHplcm8sIHNpemUgLSAoa01heER1cmF0aW9uUmVhZFNpemUgPDwgcmV0cnkpKTsKKyAgICAgICAgb2Zmc2V0ID0gKG9mZnNldCAvIGtUU1BhY2tldFNpemUpICoga1RTUGFja2V0U2l6ZTsKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgaWYgKGJ5dGVzUmVhZCA+PSBrTWF4RHVyYXRpb25SZWFkU2l6ZSA8PCBtYXgoMCwgcmV0cnkgLSAxKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzc2l6ZV90IG4gPSBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgcGFja2V0LCBrVFNQYWNrZXRTaXplKTsKKyAgICAgICAgICAgIGlmIChuIDwgMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuOworICAgICAgICAgICAgfSBlbHNlIGlmIChuIDwgKHNzaXplX3Qpa1RTUGFja2V0U2l6ZSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvZmZzZXQgKz0ga1RTUGFja2V0U2l6ZTsKKyAgICAgICAgICAgIGJ5dGVzUmVhZCArPSBrVFNQYWNrZXRTaXplOworICAgICAgICAgICAgZXJyID0gcGFyc2VyLT5mZWVkVFNQYWNrZXQocGFja2V0LCBrVFNQYWNrZXRTaXplLCAmZXYpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChldi5oYXNSZXR1cm5lZERhdGEoKSkgeworICAgICAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VcyA9IGV2LmdldFRpbWVVcygpOworICAgICAgICAgICAgICAgIEFUU1BhcnNlcjo6U291cmNlVHlwZSB0eXBlID0gZXYuZ2V0VHlwZSgpOworICAgICAgICAgICAgICAgIGV2LnJlc2V0KCk7CisKKyAgICAgICAgICAgICAgICBpbnQ2NF90IGZpcnN0VGltZVVzOworICAgICAgICAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHNyYyA9IG1QYXJzZXItPmdldFNvdXJjZSh0eXBlKTsKKyAgICAgICAgICAgICAgICBpZiAoc3JjID09IE5VTEwgfHwgc3JjLT5uZXh0QnVmZmVyVGltZSgmZmlyc3RUaW1lVXMpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkdXJhdGlvblVzICs9IHNyYy0+Z2V0RXN0aW1hdGVkQnVmZmVyRHVyYXRpb25VcygpOworICAgICAgICAgICAgICAgIGR1cmF0aW9uVXMgLT0gdGltZUFuY2hvclVzOworICAgICAgICAgICAgICAgIGR1cmF0aW9uVXMgLT0gZmlyc3RUaW1lVXM7CisgICAgICAgICAgICAgICAgaWYgKGR1cmF0aW9uVXMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgb3JpZ0R1cmF0aW9uVXMsIGxhc3REdXJhdGlvblVzOworICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gbWV0YSA9IHNyYy0+Z2V0Rm9ybWF0KCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGtLZXlMYXN0RHVyYXRpb24gPSAnbGR1cic7CisgICAgICAgICAgICAgICAgICAgIC8vIFJlcXVpcmUgdHdvIGNvbnNlY3V0aXZlIGR1cmF0aW9uIGNhbGN1bGF0aW9ucyB0byBiZSB3aXRoaW4gMSBzZWMgYmVmb3JlCisgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0aW5nOyB1c2UgTWV0YURhdGEgdG8gc3RvcmUgcHJldmlvdXMgZHVyYXRpb24gZXN0aW1hdGUgaW4gcGVyLXN0cmVhbQorICAgICAgICAgICAgICAgICAgICAvLyBjb250ZXh0LgorICAgICAgICAgICAgICAgICAgICBpZiAoIW1ldGEtPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZvcmlnRHVyYXRpb25VcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhbWV0YS0+ZmluZEludDY0KGtLZXlMYXN0RHVyYXRpb24sICZsYXN0RHVyYXRpb25VcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAob3JpZ0R1cmF0aW9uVXMgPCBkdXJhdGlvblVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGFicyhkdXJhdGlvblVzIC0gbGFzdER1cmF0aW9uVXMpIDwgNjAwMDAwMDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uVXMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldEludDY0KGtLZXlMYXN0RHVyYXRpb24sIGR1cmF0aW9uVXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghYWxsRHVyYXRpb25zRm91bmQpIHsKKyAgICAgICAgICAgIGFsbER1cmF0aW9uc0ZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvciAoYXV0byB0OiB7QVRTUGFyc2VyOjpWSURFTywgQVRTUGFyc2VyOjpBVURJT30pIHsKKyAgICAgICAgICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBzcmMgPSBtUGFyc2VyLT5nZXRTb3VyY2UodCk7CisgICAgICAgICAgICAgICAgaWYgKHNyYyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXM7CisgICAgICAgICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+IG1ldGEgPSBzcmMtPmdldEZvcm1hdCgpOworICAgICAgICAgICAgICAgIGlmICghbWV0YS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uVXMpKSB7CisgICAgICAgICAgICAgICAgICAgIGFsbER1cmF0aW9uc0ZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICsrcmV0cnk7CisgICAgfSB3aGlsZSghYWxsRHVyYXRpb25zRm91bmQgJiYgb2Zmc2V0ID4gMCAmJiByZXRyeSA8PSBrTWF4RHVyYXRpb25SZXRyeSk7CisKKyAgICByZXR1cm4gYWxsRHVyYXRpb25zRm91bmQ/IE9LIDogRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK3VpbnQzMl90IE1QRUcyVFNFeHRyYWN0b3I6OmZsYWdzKCkgY29uc3QgeworICAgIHJldHVybiBDQU5fUEFVU0UgfCBDQU5fU0VFS19CQUNLV0FSRCB8IENBTl9TRUVLX0ZPUldBUkQ7Cit9CisKK3N0YXR1c190IE1QRUcyVFNFeHRyYWN0b3I6OnNlZWsoaW50NjRfdCBzZWVrVGltZVVzLAorICAgICAgICBjb25zdCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6U2Vla01vZGUgJnNlZWtNb2RlKSB7CisgICAgaWYgKG1TZWVrU3luY1BvaW50cyA9PSBOVUxMIHx8IG1TZWVrU3luY1BvaW50cy0+aXNFbXB0eSgpKSB7CisgICAgICAgIEFMT0dXKCJObyBzeW5jIHBvaW50IHRvIHNlZWsgdG8uIik7CisgICAgICAgIC8vIC4uLiBhbmQgdGhlcmVmb3JlIHdlIGhhdmUgbm90aGluZyB1c2VmdWwgdG8gZG8gaGVyZS4KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIC8vIERldGVybWluZSB3aGV0aGVyIHdlJ3JlIHNlZWtpbmcgYmV5b25kIHRoZSBrbm93biBhcmVhLgorICAgIGJvb2wgc2hvdWxkU2Vla0JleW9uZCA9CisgICAgICAgICAgICAoc2Vla1RpbWVVcyA+IG1TZWVrU3luY1BvaW50cy0+a2V5QXQobVNlZWtTeW5jUG9pbnRzLT5zaXplKCkgLSAxKSk7CisKKyAgICAvLyBEZXRlcm1pbmUgdGhlIHN5bmMgcG9pbnQgdG8gc2Vlay4KKyAgICBzaXplX3QgaW5kZXggPSAwOworICAgIGZvciAoOyBpbmRleCA8IG1TZWVrU3luY1BvaW50cy0+c2l6ZSgpOyArK2luZGV4KSB7CisgICAgICAgIGludDY0X3QgdGltZVVzID0gbVNlZWtTeW5jUG9pbnRzLT5rZXlBdChpbmRleCk7CisgICAgICAgIGlmICh0aW1lVXMgPiBzZWVrVGltZVVzKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN3aXRjaCAoc2Vla01vZGUpIHsKKyAgICAgICAgY2FzZSBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6U0VFS19ORVhUX1NZTkM6CisgICAgICAgICAgICBpZiAoaW5kZXggPT0gbVNlZWtTeW5jUG9pbnRzLT5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiTmV4dCBzeW5jIG5vdCBmb3VuZDsgc3RhcnRpbmcgZnJvbSB0aGUgbGF0ZXN0IHN5bmMuIik7CisgICAgICAgICAgICAgICAgLS1pbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1RfU1lOQzoKKyAgICAgICAgY2FzZSBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUOgorICAgICAgICAgICAgQUxPR1coInNlZWtNb2RlIG5vdCBzdXBwb3J0ZWQ6ICVkOyBmYWxsaW5nIGJhY2sgdG8gUFJFVklPVVNfU1lOQyIsCisgICAgICAgICAgICAgICAgICAgIHNlZWtNb2RlKTsKKyAgICAgICAgICAgIC8vIGZhbGwtdGhyb3VnaAorICAgICAgICBjYXNlIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkM6CisgICAgICAgICAgICBpZiAoaW5kZXggPT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJQcmV2aW91cyBzeW5jIG5vdCBmb3VuZDsgc3RhcnRpbmcgZnJvbSB0aGUgZWFybGllc3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgInN5bmMuIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC0taW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisgICAgaWYgKCFzaG91bGRTZWVrQmV5b25kIHx8IG1PZmZzZXQgPD0gbVNlZWtTeW5jUG9pbnRzLT52YWx1ZUF0KGluZGV4KSkgeworICAgICAgICBpbnQ2NF90IGFjdHVhbFNlZWtUaW1lVXMgPSBtU2Vla1N5bmNQb2ludHMtPmtleUF0KGluZGV4KTsKKyAgICAgICAgbU9mZnNldCA9IG1TZWVrU3luY1BvaW50cy0+dmFsdWVBdChpbmRleCk7CisgICAgICAgIHN0YXR1c190IGVyciA9IHF1ZXVlRGlzY29udGludWl0eUZvclNlZWsoYWN0dWFsU2Vla1RpbWVVcyk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc2hvdWxkU2Vla0JleW9uZCkgeworICAgICAgICBzdGF0dXNfdCBlcnIgPSBzZWVrQmV5b25kKHNlZWtUaW1lVXMpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gRmFzdC1mb3J3YXJkIHRvIHN5bmMgZnJhbWUuCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU291cmNlSW1wbHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJmltcGwgPSBtU291cmNlSW1wbHNbaV07CisgICAgICAgIHN0YXR1c190IGVycjsKKyAgICAgICAgZmVlZFVudGlsQnVmZmVyQXZhaWxhYmxlKGltcGwpOworICAgICAgICB3aGlsZSAoaW1wbC0+aGFzQnVmZmVyQXZhaWxhYmxlKCZlcnIpKSB7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbWV0YSA9IGltcGwtPmdldE1ldGFBZnRlckxhc3REZXF1ZXVlZCgwKTsKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKKyAgICAgICAgICAgIGlmIChtZXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludDMyX3Qgc3luYzsKKyAgICAgICAgICAgIGlmIChtZXRhLT5maW5kSW50MzIoImlzU3luYyIsICZzeW5jKSAmJiBzeW5jKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlcnIgPSBpbXBsLT5kZXF1ZXVlQWNjZXNzVW5pdCgmYnVmZmVyKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmVlZFVudGlsQnVmZmVyQXZhaWxhYmxlKGltcGwpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNUEVHMlRTRXh0cmFjdG9yOjpxdWV1ZURpc2NvbnRpbnVpdHlGb3JTZWVrKGludDY0X3QgYWN0dWFsU2Vla1RpbWVVcykgeworICAgIC8vIFNpZ25hbCBkaXNjb250aW51aXR5CisgICAgc3A8QU1lc3NhZ2U+IGV4dHJhKG5ldyBBTWVzc2FnZSk7CisgICAgZXh0cmEtPnNldEludDY0KGtBVFNQYXJzZXJLZXlNZWRpYVRpbWVVcywgYWN0dWFsU2Vla1RpbWVVcyk7CisgICAgbVBhcnNlci0+c2lnbmFsRGlzY29udGludWl0eShBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfVElNRSwgZXh0cmEpOworCisgICAgLy8gQWZ0ZXIgZGlzY29udGludWl0eSwgaW1wbCBzaG91bGQgb25seSBoYXZlIGRpc2NvbnRpbnVpdGllcworICAgIC8vIHdpdGggdGhlIGxhc3QgYmVpbmcgd2hhdCB3ZSBxdWV1ZWQuIERlcXVldWUgdGhlbSBhbGwgaGVyZS4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Tb3VyY2VJbXBscy5zaXplKCk7ICsraSkgeworICAgICAgICBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmaW1wbCA9IG1Tb3VyY2VJbXBscy5pdGVtQXQoaSk7CisgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKKyAgICAgICAgc3RhdHVzX3QgZXJyOworICAgICAgICB3aGlsZSAoaW1wbC0+aGFzQnVmZmVyQXZhaWxhYmxlKCZlcnIpKSB7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVyciA9IGltcGwtPmRlcXVldWVBY2Nlc3NVbml0KCZidWZmZXIpOworICAgICAgICAgICAgLy8gSWYgdGhlIHNvdXJjZSBjb250YWlucyBhbnl0aGluZyBidXQgZGlzY29udGludWl0eSwgdGhhdCdzCisgICAgICAgICAgICAvLyBhIHByb2dyYW1taW5nIG1pc3Rha2UuCisgICAgICAgICAgICBDSEVDSyhlcnIgPT0gSU5GT19ESVNDT05USU5VSVRZKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEZlZWQgdW50aWwgd2UgaGF2ZSBhIGJ1ZmZlciBmb3IgZWFjaCBzb3VyY2UuCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU291cmNlSW1wbHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJmltcGwgPSBtU291cmNlSW1wbHMuaXRlbUF0KGkpOworICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXI7CisgICAgICAgIHN0YXR1c190IGVyciA9IGZlZWRVbnRpbEJ1ZmZlckF2YWlsYWJsZShpbXBsKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6c2Vla0JleW9uZChpbnQ2NF90IHNlZWtUaW1lVXMpIHsKKyAgICAvLyBJZiB3ZSdyZSBzZWVraW5nIGJleW9uZCB3aGVyZSB3ZSBrbm93IC0tLSByZWFkIHVudGlsIHdlIHJlYWNoIHRoZXJlLgorICAgIHNpemVfdCBzeW5jUG9pbnRzU2l6ZSA9IG1TZWVrU3luY1BvaW50cy0+c2l6ZSgpOworCisgICAgd2hpbGUgKHNlZWtUaW1lVXMgPiBtU2Vla1N5bmNQb2ludHMtPmtleUF0KAorICAgICAgICAgICAgbVNlZWtTeW5jUG9pbnRzLT5zaXplKCkgLSAxKSkgeworICAgICAgICBzdGF0dXNfdCBlcnI7CisgICAgICAgIGlmIChzeW5jUG9pbnRzU2l6ZSA8IG1TZWVrU3luY1BvaW50cy0+c2l6ZSgpKSB7CisgICAgICAgICAgICBzeW5jUG9pbnRzU2l6ZSA9IG1TZWVrU3luY1BvaW50cy0+c2l6ZSgpOworICAgICAgICAgICAgaW50NjRfdCBzeW5jVGltZVVzID0gbVNlZWtTeW5jUG9pbnRzLT5rZXlBdChzeW5jUG9pbnRzU2l6ZSAtIDEpOworICAgICAgICAgICAgLy8gRGVxdWV1ZSBidWZmZXJzIGJlZm9yZSBzeW5jIHBvaW50IGluIG9yZGVyIHRvIGF2b2lkIHRvbyBtdWNoCisgICAgICAgICAgICAvLyBjYWNoZSBidWlsZGluZyB1cC4KKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNvdXJjZUltcGxzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJmltcGwgPSBtU291cmNlSW1wbHNbaV07CisgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7CisgICAgICAgICAgICAgICAgd2hpbGUgKChlcnIgPSBpbXBsLT5uZXh0QnVmZmVyVGltZSgmdGltZVVzKSkgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVVcyA8IHN5bmNUaW1lVXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGltcGwtPmRlcXVldWVBY2Nlc3NVbml0KCZidWZmZXIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSyAmJiBlcnIgIT0gLUVXT1VMREJMT0NLKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChmZWVkTW9yZSgpICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6ZmVlZFVudGlsQnVmZmVyQXZhaWxhYmxlKAorICAgICAgICBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmaW1wbCkgeworICAgIHN0YXR1c190IGZpbmFsUmVzdWx0OworICAgIHdoaWxlICghaW1wbC0+aGFzQnVmZmVyQXZhaWxhYmxlKCZmaW5hbFJlc3VsdCkpIHsKKyAgICAgICAgaWYgKGZpbmFsUmVzdWx0ICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZmluYWxSZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXNfdCBlcnIgPSBmZWVkTW9yZSgpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBpbXBsLT5zaWduYWxFT1MoZXJyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgU25pZmZNUEVHMlRTKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyArK2kpIHsKKyAgICAgICAgY2hhciBoZWFkZXI7CisgICAgICAgIGlmIChzb3VyY2UtPnJlYWRBdChrVFNQYWNrZXRTaXplICogaSwgJmhlYWRlciwgMSkgIT0gMQorICAgICAgICAgICAgICAgIHx8IGhlYWRlciAhPSAweDQ3KSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqY29uZmlkZW5jZSA9IDAuMWY7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJUU0V4dHJhY3Rvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JkZDNjYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJUU0V4dHJhY3Rvci5oCkBAIC0wLDAgKzEsMTA4IEBACisvKgorCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1QRUcyX1RTX0VYVFJBQ1RPUl9IXworCisjZGVmaW5lIE1QRUcyX1RTX0VYVFJBQ1RPUl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCisjaW5jbHVkZSAibXBlZzJ0cy9BVFNQYXJzZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQU1lc3NhZ2U7CitzdHJ1Y3QgQW5vdGhlclBhY2tldFNvdXJjZTsKK3N0cnVjdCBBVFNQYXJzZXI7CitjbGFzcyBEYXRhU291cmNlQmFzZTsKK3N0cnVjdCBNUEVHMlRTU291cmNlOworY2xhc3MgU3RyaW5nODsKKworc3RydWN0IE1QRUcyVFNFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgeworICAgIGV4cGxpY2l0IE1QRUcyVFNFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CisKKyAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOworICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWVkaWFDYXMoY29uc3QgdWludDhfdCogLypjYXNUb2tlbiovLCBzaXplX3QgLypzaXplKi8pIG92ZXJyaWRlOworCisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIGNvbnN0OworICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiTVBFRzJUU0V4dHJhY3RvciI7IH0KKworcHJpdmF0ZToKKyAgICBmcmllbmQgc3RydWN0IE1QRUcyVFNTb3VyY2U7CisKKyAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOworCisgICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworCisgICAgc3A8QVRTUGFyc2VyPiBtUGFyc2VyOworCisgICAgLy8gVXNlZCB0byByZW1lbWJlciBTeW5jRXZlbnQgb2NjdXJyZWQgaW4gZmVlZE1vcmUoKSB3aGVuIGNhbGxlZCBmcm9tIGluaXQoKSwKKyAgICAvLyBiZWNhdXNlIGluaXQoKSBuZWVkcyB0byB1cGRhdGUgfG1Tb3VyY2VJbXBsc3wgYmVmb3JlIGFkZGluZyBTeW5jUG9pbnQuCisgICAgQVRTUGFyc2VyOjpTeW5jRXZlbnQgbUxhc3RTeW5jRXZlbnQ7CisKKyAgICBWZWN0b3I8c3A8QW5vdGhlclBhY2tldFNvdXJjZT4gPiBtU291cmNlSW1wbHM7CisKKyAgICBWZWN0b3I8S2V5ZWRWZWN0b3I8aW50NjRfdCwgb2ZmNjRfdD4gPiBtU3luY1BvaW50czsKKyAgICAvLyBTeW5jIHBvaW50cyB1c2VkIGZvciBzZWVraW5nIC0tLSBub3JtYWxseSBvbmUgZm9yIHZpZGVvIHRyYWNrIGlzIHVzZWQuCisgICAgLy8gSWYgbm8gdmlkZW8gdHJhY2sgaXMgcHJlc2VudCwgYXVkaW8gdHJhY2sgd2lsbCBiZSB1c2VkIGluc3RlYWQuCisgICAgS2V5ZWRWZWN0b3I8aW50NjRfdCwgb2ZmNjRfdD4gKm1TZWVrU3luY1BvaW50czsKKworICAgIG9mZjY0X3QgbU9mZnNldDsKKworICAgIHN0YXRpYyBib29sIGlzU2NyYW1ibGVkRm9ybWF0KE1ldGFEYXRhQmFzZSAmZm9ybWF0KTsKKworICAgIHZvaWQgaW5pdCgpOworICAgIHZvaWQgYWRkU291cmNlKGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZpbXBsKTsKKyAgICAvLyBUcnkgdG8gZmVlZCBtb3JlIGRhdGEgZnJvbSBzb3VyY2UgdG8gcGFyc2VyLgorICAgIC8vIHxpc0luaXR8IG1lYW5zIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluc2lkZSBpbml0KCkuIFRoaXMgaXMgYSBzaWduYWwgdG8KKyAgICAvLyBzYXZlIFN5bmNFdmVudCBzbyB0aGF0IGluaXQoKSBjYW4gYWRkIFN5bmNQb2ludCBhZnRlciBpdCB1cGRhdGVzIHxtU291cmNlSW1wbHN8LgorICAgIC8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBPSyBpZiBleHBlY3RlZCBhbW91bnQgb2YgZGF0YSBpcyBmZWQgZnJvbSBEYXRhU291cmNlQmFzZSB0bworICAgIC8vIHBhcnNlciBhbmQgaXMgc3VjY2Vzc2Z1bGx5IHBhcnNlZC4gT3RoZXJ3aXNlLCB2YXJpb3VzIGVycm9yIGNvZGVzIGNvdWxkIGJlCisgICAgLy8gcmV0dXJuZWQsIGUuZy4sIEVSUk9SX0VORF9PRl9TVFJFQU0sIG9yIG5vIGRhdGEgYXZhaWxhbGJlIGZyb20gRGF0YVNvdXJjZUJhc2UsIG9yCisgICAgLy8gdGhlIGRhdGEgaGFzIHN5bnRheCBlcnJvciBkdXJpbmcgcGFyc2luZywgZXRjLgorICAgIHN0YXR1c190IGZlZWRNb3JlKGJvb2wgaXNJbml0ID0gZmFsc2UpOworICAgIHN0YXR1c190IHNlZWsoaW50NjRfdCBzZWVrVGltZVVzLAorICAgICAgICAgICAgY29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSYgc2Vla01vZGUpOworICAgIHN0YXR1c190IHF1ZXVlRGlzY29udGludWl0eUZvclNlZWsoaW50NjRfdCBhY3R1YWxTZWVrVGltZVVzKTsKKyAgICBzdGF0dXNfdCBzZWVrQmV5b25kKGludDY0X3Qgc2Vla1RpbWVVcyk7CisKKyAgICBzdGF0dXNfdCBmZWVkVW50aWxCdWZmZXJBdmFpbGFibGUoY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJmltcGwpOworCisgICAgLy8gQWRkIGEgU3luUG9pbnQgZGVyaXZlZCBmcm9tIHxldmVudHwuCisgICAgdm9pZCBhZGRTeW5jUG9pbnRfbChjb25zdCBBVFNQYXJzZXI6OlN5bmNFdmVudCAmZXZlbnQpOworCisgICAgc3RhdHVzX3QgIGVzdGltYXRlRHVyYXRpb25zRnJvbVRpbWVzVXNBdEVuZCgpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTVBFRzJUU0V4dHJhY3Rvcik7Cit9OworCitib29sIFNuaWZmTVBFRzJUUyhEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSk7CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTVBFRzJfVFNfRVhUUkFDVE9SX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9OT1RJQ0UgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL05PVElDRQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL05PVElDRQpjb3B5IHRvIG1lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTk9USUNFCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL2V4cG9ydHMubGRzIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9leHBvcnRzLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTMwOWVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9leHBvcnRzLmxkcwpAQCAtMCwwICsxIEBACit7IGdsb2JhbDogR0VURVhUUkFDVE9SREVGOyBsb2NhbDogKjsgfTsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvb2dnL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL29nZy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNmZjNzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL29nZy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDQgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKworICAgIHNyY3M6IFsiT2dnRXh0cmFjdG9yLmNwcCJdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAorICAgICAgICAiZXh0ZXJuYWwvdHJlbW9sbyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJ2b3JiaXNpZGVjIiwKKyAgICBdLAorCisgICAgbmFtZTogImxpYm9nZ2V4dHJhY3RvciIsCisgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAiZXh0cmFjdG9ycyIsCisKKyAgICBjb21waWxlX211bHRpbGliOiAiZmlyc3QiLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAorICAgIF0sCisgICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBkaWFnOiB7CisgICAgICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIH0sCisgICAgfSwKKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2V4dHJhY3RvcnMvb2dnL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmNvcHkgdG8gbWVkaWEvZXh0cmFjdG9ycy9vZ2cvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTk9USUNFIGIvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvTk9USUNFCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTk9USUNFCmNvcHkgdG8gbWVkaWEvZXh0cmFjdG9ycy9vZ2cvTk9USUNFCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL29nZy9PZ2dFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvT2dnRXh0cmFjdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmZlNjljCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvT2dnRXh0cmFjdG9yLmNwcApAQCAtMCwwICsxLDEyODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk9nZ0V4dHJhY3RvciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIk9nZ0V4dHJhY3Rvci5oIgorCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL0V4dHJhY3RvclV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgorI2luY2x1ZGUgPG1lZGlhL1ZvcmJpc0NvbW1lbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKK2V4dGVybiAiQyIgeworICAgICNpbmNsdWRlIDxUcmVtb2xvL2NvZGVjX2ludGVybmFsLmg+CisKKyAgICBpbnQgX3ZvcmJpc191bnBhY2tfYm9va3Modm9yYmlzX2luZm8gKnZpLG9nZ3BhY2tfYnVmZmVyICpvcGIpOworICAgIGludCBfdm9yYmlzX3VucGFja19pbmZvKHZvcmJpc19pbmZvICp2aSxvZ2dwYWNrX2J1ZmZlciAqb3BiKTsKKyAgICBpbnQgX3ZvcmJpc191bnBhY2tfY29tbWVudCh2b3JiaXNfY29tbWVudCAqdmMsb2dncGFja19idWZmZXIgKm9wYik7CisgICAgbG9uZyB2b3JiaXNfcGFja2V0X2Jsb2Nrc2l6ZSh2b3JiaXNfaW5mbyAqdmksb2dnX3BhY2tldCAqb3ApOworfQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBPZ2dTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFjayB7CisgICAgZXhwbGljaXQgT2dnU291cmNlKE9nZ0V4dHJhY3RvciAqZXh0cmFjdG9yKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfk9nZ1NvdXJjZSgpOworCitwcml2YXRlOgorICAgIE9nZ0V4dHJhY3RvciAqbUV4dHJhY3RvcjsKKyAgICBib29sIG1TdGFydGVkOworCisgICAgT2dnU291cmNlKGNvbnN0IE9nZ1NvdXJjZSAmKTsKKyAgICBPZ2dTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBPZ2dTb3VyY2UgJik7Cit9OworCitzdHJ1Y3QgTXlPZ2dFeHRyYWN0b3IgeworICAgIE15T2dnRXh0cmFjdG9yKAorICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWVUeXBlLAorICAgICAgICAgICAgc2l6ZV90IG51bUhlYWRlcnMsCisgICAgICAgICAgICBpbnQ2NF90IHNlZWtQcmVSb2xsVXMpOworICAgIHZpcnR1YWwgfk15T2dnRXh0cmFjdG9yKCk7CisKKyAgICBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlICYpIGNvbnN0OworCisgICAgLy8gUmV0dXJucyBhbiBhcHByb3hpbWF0ZSBiaXRyYXRlIGluIGJpdHMgcGVyIHNlY29uZC4KKyAgICB2aXJ0dWFsIHVpbnQ2NF90IGFwcHJveEJpdHJhdGUoKSBjb25zdCA9IDA7CisKKyAgICBzdGF0dXNfdCBzZWVrVG9UaW1lKGludDY0X3QgdGltZVVzKTsKKyAgICBzdGF0dXNfdCBzZWVrVG9PZmZzZXQob2ZmNjRfdCBvZmZzZXQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyKSA9IDA7CisKKyAgICBzdGF0dXNfdCBpbml0KCk7CisKKyAgICBzdGF0dXNfdCBnZXRGaWxlTWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhKSB7CisgICAgICAgIG1ldGEgPSBtRmlsZU1ldGE7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBzdHJ1Y3QgUGFnZSB7CisgICAgICAgIHVpbnQ2NF90IG1HcmFudWxlUG9zaXRpb247CisgICAgICAgIGludDMyX3QgbVByZXZQYWNrZXRTaXplOworICAgICAgICB1aW50NjRfdCBtUHJldlBhY2tldFBvczsKKyAgICAgICAgdWludDMyX3QgbVNlcmlhbE5vOworICAgICAgICB1aW50MzJfdCBtUGFnZU5vOworICAgICAgICB1aW50OF90IG1GbGFnczsKKyAgICAgICAgdWludDhfdCBtTnVtU2VnbWVudHM7CisgICAgICAgIHVpbnQ4X3QgbUxhY2VbMjU1XTsKKyAgICB9OworCisgICAgc3RydWN0IFRPQ0VudHJ5IHsKKyAgICAgICAgb2ZmNjRfdCBtUGFnZU9mZnNldDsKKyAgICAgICAgaW50NjRfdCBtVGltZVVzOworICAgIH07CisKKyAgICBEYXRhU291cmNlQmFzZSAqbVNvdXJjZTsKKyAgICBvZmY2NF90IG1PZmZzZXQ7CisgICAgUGFnZSBtQ3VycmVudFBhZ2U7CisgICAgdWludDY0X3QgbUN1ckdyYW51bGVQb3NpdGlvbjsKKyAgICB1aW50NjRfdCBtUHJldkdyYW51bGVQb3NpdGlvbjsKKyAgICBzaXplX3QgbUN1cnJlbnRQYWdlU2l6ZTsKKyAgICBib29sIG1GaXJzdFBhY2tldEluUGFnZTsKKyAgICB1aW50NjRfdCBtQ3VycmVudFBhZ2VTYW1wbGVzOworICAgIHNpemVfdCBtTmV4dExhY2VJbmRleDsKKworICAgIGNvbnN0IGNoYXIgKm1NaW1lVHlwZTsKKyAgICBzaXplX3QgbU51bUhlYWRlcnM7CisgICAgaW50NjRfdCBtU2Vla1ByZVJvbGxVczsKKworICAgIG9mZjY0X3QgbUZpcnN0RGF0YU9mZnNldDsKKworICAgIHZvcmJpc19pbmZvIG1WaTsKKyAgICB2b3JiaXNfY29tbWVudCBtVmM7CisKKyAgICBNZXRhRGF0YUJhc2UgbU1ldGE7CisgICAgTWV0YURhdGFCYXNlIG1GaWxlTWV0YTsKKworICAgIFZlY3RvcjxUT0NFbnRyeT4gbVRhYmxlT2ZDb250ZW50czsKKworICAgIHNzaXplX3QgcmVhZFBhZ2Uob2ZmNjRfdCBvZmZzZXQsIFBhZ2UgKnBhZ2UpOworICAgIHN0YXR1c190IGZpbmROZXh0UGFnZShvZmY2NF90IHN0YXJ0T2Zmc2V0LCBvZmY2NF90ICpwYWdlT2Zmc2V0KTsKKworICAgIHZpcnR1YWwgaW50NjRfdCBnZXRUaW1lVXNPZkdyYW51bGUodWludDY0X3QgZ3JhbnVsZVBvcykgY29uc3QgPSAwOworCisgICAgLy8gRXh0cmFjdCBjb2RlYyBmb3JtYXQsIG1ldGFkYXRhIHRhZ3MsIGFuZCB2YXJpb3VzIGNvZGVjIHNwZWNpZmljIGRhdGE7CisgICAgLy8gdGhlIGZvcm1hdCBhbmQgQ1NEJ3MgYXJlIHJlcXVpcmVkIHRvIHNldHVwIHRoZSBkZWNvZGVycyBmb3IgdGhlIGVuY2xvc2VkIG1lZGlhIGNvbnRlbnQuCisgICAgLy8KKyAgICAvLyBWYWxpZCB2YWx1ZXMgZm9yIGB0eXBlYCBhcmU6CisgICAgLy8gMSAtIGJpdHN0cmVhbSBpZGVudGlmaWNhdGlvbiBoZWFkZXIKKyAgICAvLyAzIC0gY29tbWVudCBoZWFkZXIKKyAgICAvLyA1IC0gY29kZWMgc2V0dXAgaGVhZGVyIChWb3JiaXMgb25seSkKKyAgICB2aXJ0dWFsIHN0YXR1c190IHZlcmlmeUhlYWRlcihNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciwgdWludDhfdCB0eXBlKSA9IDA7CisKKyAgICAvLyBSZWFkIHRoZSBuZXh0IG9nZyBwYWNrZXQgZnJvbSB0aGUgdW5kZXJseWluZyBkYXRhIHNvdXJjZTsgb3B0aW9uYWxseQorICAgIC8vIGNhbGN1bGF0ZSB0aGUgdGltZXN0YW1wIGZvciB0aGUgb3V0cHV0IHBhY2tldCB3aGlsc3QgcHJldGVuZGluZworICAgIC8vIHRoYXQgd2UgYXJlIHBhcnNpbmcgYW4gT2dnIFZvcmJpcyBzdHJlYW0uCisgICAgLy8KKyAgICAvLyAqYnVmZmVyIGlzIE5VTEwnZWQgb3V0IGltbWVkaWF0ZWx5IHVwb24gZW50cnksIGFuZCBpZiBzdWNjZXNzZnVsIGEgbmV3IGJ1ZmZlciBpcyBhbGxvY2F0ZWQ7CisgICAgLy8gY2xpZW50cyBhcmUgcmVzcG9uc2libGUgZm9yIHJlbGVhc2luZyB0aGUgb3JpZ2luYWwgYnVmZmVyLgorICAgIHN0YXR1c190IF9yZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGJvb2wgY2FsY1ZvcmJpc1RpbWVzdGFtcCk7CisKKyAgICBpbnQzMl90IGdldFBhY2tldEJsb2NrU2l6ZShNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcik7CisKKyAgICB2b2lkIHBhcnNlRmlsZU1ldGFEYXRhKCk7CisKKyAgICBzdGF0dXNfdCBmaW5kUHJldkdyYW51bGVQb3NpdGlvbihvZmY2NF90IHBhZ2VPZmZzZXQsIHVpbnQ2NF90ICpncmFudWxlUG9zKTsKKworICAgIHZvaWQgYnVpbGRUYWJsZU9mQ29udGVudHMoKTsKKworICAgIE15T2dnRXh0cmFjdG9yKGNvbnN0IE15T2dnRXh0cmFjdG9yICYpOworICAgIE15T2dnRXh0cmFjdG9yICZvcGVyYXRvcj0oY29uc3QgTXlPZ2dFeHRyYWN0b3IgJik7Cit9OworCitzdHJ1Y3QgTXlWb3JiaXNFeHRyYWN0b3IgOiBwdWJsaWMgTXlPZ2dFeHRyYWN0b3IgeworICAgIGV4cGxpY2l0IE15Vm9yYmlzRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCisgICAgICAgIDogTXlPZ2dFeHRyYWN0b3Ioc291cmNlLAorICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUywKKyAgICAgICAgICAgICAgICAvKiBudW1IZWFkZXJzICovIDMsCisgICAgICAgICAgICAgICAgLyogc2Vla1ByZVJvbGxVcyAqLyAwKSB7CisgICAgfQorCisgICAgdmlydHVhbCB1aW50NjRfdCBhcHByb3hCaXRyYXRlKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlcikgeworICAgICAgICByZXR1cm4gX3JlYWROZXh0UGFja2V0KGJ1ZmZlciwgLyogY2FsY1ZvcmJpc1RpbWVzdGFtcCA9ICovIHRydWUpOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgaW50NjRfdCBnZXRUaW1lVXNPZkdyYW51bGUodWludDY0X3QgZ3JhbnVsZVBvcykgY29uc3QgeworICAgICAgICBpZiAoZ3JhbnVsZVBvcyA+IElOVDY0X01BWCAvIDEwMDAwMDBsbCkgeworICAgICAgICAgICAgcmV0dXJuIElOVDY0X01BWDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZ3JhbnVsZVBvcyAqIDEwMDAwMDBsbCAvIG1WaS5yYXRlOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgdmVyaWZ5SGVhZGVyKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyLCB1aW50OF90IHR5cGUpOworfTsKKworc3RydWN0IE15T3B1c0V4dHJhY3RvciA6IHB1YmxpYyBNeU9nZ0V4dHJhY3RvciB7CisgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga09wdXNTYW1wbGVSYXRlID0gNDgwMDA7CisgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga09wdXNTZWVrUHJlUm9sbFVzID0gODAwMDA7IC8vIDgwIG1zCisKKyAgICBleHBsaWNpdCBNeU9wdXNFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkKKyAgICAgICAgOiBNeU9nZ0V4dHJhY3Rvcihzb3VyY2UsIE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMsIC8qbnVtSGVhZGVycyovIDIsIGtPcHVzU2Vla1ByZVJvbGxVcyksCisgICAgICAgICAgbUNoYW5uZWxDb3VudCgwKSwKKyAgICAgICAgICBtQ29kZWNEZWxheSgwKSwKKyAgICAgICAgICBtU3RhcnRHcmFudWxlUG9zaXRpb24oLTEpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHVpbnQ2NF90IGFwcHJveEJpdHJhdGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgaW50NjRfdCBnZXRUaW1lVXNPZkdyYW51bGUodWludDY0X3QgZ3JhbnVsZVBvcykgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCB2ZXJpZnlIZWFkZXIoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIsIHVpbnQ4X3QgdHlwZSk7CisKK3ByaXZhdGU6CisgICAgc3RhdHVzX3QgdmVyaWZ5T3B1c0hlYWRlcihNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcik7CisgICAgc3RhdHVzX3QgdmVyaWZ5T3B1c0NvbW1lbnRzKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKTsKKyAgICB1aW50MzJfdCBnZXROdW1TYW1wbGVzSW5QYWNrZXQoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpIGNvbnN0OworCisgICAgdWludDhfdCBtQ2hhbm5lbENvdW50OworICAgIHVpbnQxNl90IG1Db2RlY0RlbGF5OworICAgIGludDY0X3QgbVN0YXJ0R3JhbnVsZVBvc2l0aW9uOworfTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworT2dnU291cmNlOjpPZ2dTb3VyY2UoT2dnRXh0cmFjdG9yICpleHRyYWN0b3IpCisgICAgOiBtRXh0cmFjdG9yKGV4dHJhY3RvciksCisgICAgICBtU3RhcnRlZChmYWxzZSkgeworfQorCitPZ2dTb3VyY2U6On5PZ2dTb3VyY2UoKSB7CisgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIHN0b3AoKTsKKyAgICB9Cit9CisKK3N0YXR1c190IE9nZ1NvdXJjZTo6Z2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSkgeworICAgIHJldHVybiBtRXh0cmFjdG9yLT5tSW1wbC0+Z2V0Rm9ybWF0KG1ldGEpOworfQorCitzdGF0dXNfdCBPZ2dTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqIC8qIHBhcmFtcyAqLykgeworICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgbVN0YXJ0ZWQgPSB0cnVlOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBPZ2dTb3VyY2U6OnN0b3AoKSB7CisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgT2dnU291cmNlOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CisgICAgKm91dCA9IE5VTEw7CisKKyAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CisgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7CisgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUV4dHJhY3Rvci0+bUltcGwtPnNlZWtUb1RpbWUoc2Vla1RpbWVVcyk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBNZWRpYUJ1ZmZlckJhc2UgKnBhY2tldDsKKyAgICBzdGF0dXNfdCBlcnIgPSBtRXh0cmFjdG9yLT5tSW1wbC0+cmVhZE5leHRQYWNrZXQoJnBhY2tldCk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisjaWYgMAorICAgIGludDY0X3QgdGltZVVzOworICAgIGlmIChwYWNrZXQtPm1ldGFfZGF0YSgpLmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpIHsKKyAgICAgICAgQUxPR0koImZvdW5kIHRpbWUgPSAlbGxkIHVzIiwgdGltZVVzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HSSgiTk8gdGltZSIpOworICAgIH0KKyNlbmRpZgorCisgICAgcGFja2V0LT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworCisgICAgKm91dCA9IHBhY2tldDsKKworICAgIHJldHVybiBPSzsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworTXlPZ2dFeHRyYWN0b3I6Ok15T2dnRXh0cmFjdG9yKAorICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorICAgICAgICBjb25zdCBjaGFyICptaW1lVHlwZSwKKyAgICAgICAgc2l6ZV90IG51bUhlYWRlcnMsCisgICAgICAgIGludDY0X3Qgc2Vla1ByZVJvbGxVcykKKyAgICA6IG1Tb3VyY2Uoc291cmNlKSwKKyAgICAgIG1PZmZzZXQoMCksCisgICAgICBtQ3VyR3JhbnVsZVBvc2l0aW9uKDApLAorICAgICAgbVByZXZHcmFudWxlUG9zaXRpb24oMCksCisgICAgICBtQ3VycmVudFBhZ2VTaXplKDApLAorICAgICAgbUZpcnN0UGFja2V0SW5QYWdlKHRydWUpLAorICAgICAgbUN1cnJlbnRQYWdlU2FtcGxlcygwKSwKKyAgICAgIG1OZXh0TGFjZUluZGV4KDApLAorICAgICAgbU1pbWVUeXBlKG1pbWVUeXBlKSwKKyAgICAgIG1OdW1IZWFkZXJzKG51bUhlYWRlcnMpLAorICAgICAgbVNlZWtQcmVSb2xsVXMoc2Vla1ByZVJvbGxVcyksCisgICAgICBtRmlyc3REYXRhT2Zmc2V0KC0xKSB7CisgICAgbUN1cnJlbnRQYWdlLm1OdW1TZWdtZW50cyA9IDA7CisKKyAgICB2b3JiaXNfaW5mb19pbml0KCZtVmkpOworICAgIHZvcmJpc19jb21tZW50X2luaXQoJm1WYyk7Cit9CisKK015T2dnRXh0cmFjdG9yOjp+TXlPZ2dFeHRyYWN0b3IoKSB7CisgICAgdm9yYmlzX2NvbW1lbnRfY2xlYXIoJm1WYyk7CisgICAgdm9yYmlzX2luZm9fY2xlYXIoJm1WaSk7Cit9CisKK3N0YXR1c190IE15T2dnRXh0cmFjdG9yOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKSBjb25zdCB7CisgICAgbWV0YSA9IG1NZXRhOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTXlPZ2dFeHRyYWN0b3I6OmZpbmROZXh0UGFnZSgKKyAgICAgICAgb2ZmNjRfdCBzdGFydE9mZnNldCwgb2ZmNjRfdCAqcGFnZU9mZnNldCkgeworICAgICpwYWdlT2Zmc2V0ID0gc3RhcnRPZmZzZXQ7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGNoYXIgc2lnbmF0dXJlWzRdOworICAgICAgICBzc2l6ZV90IG4gPSBtU291cmNlLT5yZWFkQXQoKnBhZ2VPZmZzZXQsICZzaWduYXR1cmUsIDQpOworCisgICAgICAgIGlmIChuIDwgNCkgeworICAgICAgICAgICAgKnBhZ2VPZmZzZXQgPSAwOworCisgICAgICAgICAgICByZXR1cm4gKG4gPCAwKSA/IG4gOiAoc3RhdHVzX3QpRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbWVtY21wKHNpZ25hdHVyZSwgIk9nZ1MiLCA0KSkgeworICAgICAgICAgICAgaWYgKCpwYWdlT2Zmc2V0ID4gc3RhcnRPZmZzZXQpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigic2tpcHBlZCAlbGxkIGJ5dGVzIG9mIGp1bmsgdG8gcmVhY2ggbmV4dCBmcmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSgqcGFnZU9mZnNldCAtIHN0YXJ0T2Zmc2V0KSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorCisgICAgICAgICsrKnBhZ2VPZmZzZXQ7CisgICAgfQorfQorCisvLyBHaXZlbiB0aGUgb2Zmc2V0IG9mIHRoZSAiY3VycmVudCIgcGFnZSwgZmluZCB0aGUgcGFnZSBpbW1lZGlhdGVseSBwcmVjZWRpbmcKKy8vIGl0IChpZiBhbnkpIGFuZCByZXR1cm4gaXRzIGdyYW51bGUgcG9zaXRpb24uCisvLyBUbyBkbyB0aGlzIHdlIGJhY2sgdXAgZnJvbSB0aGUgImN1cnJlbnQiIHBhZ2UncyBvZmZzZXQgdW50aWwgd2UgZmluZCBhbnkKKy8vIHBhZ2UgcHJlY2VkaW5nIGl0IGFuZCB0aGVuIHNjYW4gZm9yd2FyZCB0byBqdXN0IGJlZm9yZSB0aGUgY3VycmVudCBwYWdlLgorc3RhdHVzX3QgTXlPZ2dFeHRyYWN0b3I6OmZpbmRQcmV2R3JhbnVsZVBvc2l0aW9uKAorICAgICAgICBvZmY2NF90IHBhZ2VPZmZzZXQsIHVpbnQ2NF90ICpncmFudWxlUG9zKSB7CisgICAgKmdyYW51bGVQb3MgPSAwOworCisgICAgb2ZmNjRfdCBwcmV2UGFnZU9mZnNldCA9IDA7CisgICAgb2ZmNjRfdCBwcmV2R3Vlc3MgPSBwYWdlT2Zmc2V0OworICAgIGZvciAoOzspIHsKKyAgICAgICAgaWYgKHByZXZHdWVzcyA+PSA1MDAwKSB7CisgICAgICAgICAgICBwcmV2R3Vlc3MgLT0gNTAwMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByZXZHdWVzcyA9IDA7CisgICAgICAgIH0KKworICAgICAgICBBTE9HVigiYmFja2luZyB1cCAlbGxkIGJ5dGVzIiwgKGxvbmcgbG9uZykocGFnZU9mZnNldCAtIHByZXZHdWVzcykpOworCisgICAgICAgIHN0YXR1c190IGVyciA9IGZpbmROZXh0UGFnZShwcmV2R3Vlc3MsICZwcmV2UGFnZU9mZnNldCk7CisgICAgICAgIGlmIChlcnIgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgLy8gV2UgYXJlIGF0IHRoZSBsYXN0IHBhZ2UgYW5kIGRpZG4ndCBiYWNrIG9mZiBlbm91Z2g7CisgICAgICAgICAgICAvLyBiYWNrIG9mZiA1MDAwIGJ5dGVzIG1vcmUgYW5kIHRyeSBhZ2Fpbi4KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwcmV2UGFnZU9mZnNldCA8IHBhZ2VPZmZzZXQgfHwgcHJldkd1ZXNzID09IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHByZXZQYWdlT2Zmc2V0ID09IHBhZ2VPZmZzZXQpIHsKKyAgICAgICAgLy8gV2UgZGlkIG5vdCBmaW5kIGEgcGFnZSBwcmVjZWRpbmcgdGhpcyBvbmUuCisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIEFMT0dWKCJwcmV2UGFnZU9mZnNldCBhdCAlbGxkLCBwYWdlT2Zmc2V0IGF0ICVsbGQiLAorICAgICAgICAgICAgKGxvbmcgbG9uZylwcmV2UGFnZU9mZnNldCwgKGxvbmcgbG9uZylwYWdlT2Zmc2V0KTsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgUGFnZSBwcmV2UGFnZTsKKyAgICAgICAgc3NpemVfdCBuID0gcmVhZFBhZ2UocHJldlBhZ2VPZmZzZXQsICZwcmV2UGFnZSk7CisKKyAgICAgICAgaWYgKG4gPD0gMCkgeworICAgICAgICAgICAgcmV0dXJuIChzdGF0dXNfdCluOworICAgICAgICB9CisKKyAgICAgICAgcHJldlBhZ2VPZmZzZXQgKz0gbjsKKworICAgICAgICBpZiAocHJldlBhZ2VPZmZzZXQgPT0gcGFnZU9mZnNldCkgeworICAgICAgICAgICAgKmdyYW51bGVQb3MgPSBwcmV2UGFnZS5tR3JhbnVsZVBvc2l0aW9uOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0dXNfdCBNeU9nZ0V4dHJhY3Rvcjo6c2Vla1RvVGltZShpbnQ2NF90IHRpbWVVcykgeworICAgIHRpbWVVcyAtPSBtU2Vla1ByZVJvbGxVczsKKyAgICBpZiAodGltZVVzIDwgMCkgeworICAgICAgICB0aW1lVXMgPSAwOworICAgIH0KKworICAgIGlmIChtVGFibGVPZkNvbnRlbnRzLmlzRW1wdHkoKSkgeworICAgICAgICAvLyBQZXJmb3JtIGFwcHJveGltYXRlIHNlZWtpbmcgYmFzZWQgb24gYXZnLiBiaXRyYXRlLgorICAgICAgICB1aW50NjRfdCBicHMgPSBhcHByb3hCaXRyYXRlKCk7CisgICAgICAgIGlmIChicHMgPD0gMCkgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisKKyAgICAgICAgb2ZmNjRfdCBwb3MgPSB0aW1lVXMgKiBicHMgLyA4MDAwMDAwbGw7CisKKyAgICAgICAgQUxPR1YoInNlZWtpbmcgdG8gb2Zmc2V0ICVsbGQiLCAobG9uZyBsb25nKXBvcyk7CisgICAgICAgIHJldHVybiBzZWVrVG9PZmZzZXQocG9zKTsKKyAgICB9CisKKyAgICBzaXplX3QgbGVmdCA9IDA7CisgICAgc2l6ZV90IHJpZ2h0X3BsdXNfb25lID0gbVRhYmxlT2ZDb250ZW50cy5zaXplKCk7CisgICAgd2hpbGUgKGxlZnQgPCByaWdodF9wbHVzX29uZSkgeworICAgICAgICBzaXplX3QgY2VudGVyID0gbGVmdCArIChyaWdodF9wbHVzX29uZSAtIGxlZnQpIC8gMjsKKworICAgICAgICBjb25zdCBUT0NFbnRyeSAmZW50cnkgPSBtVGFibGVPZkNvbnRlbnRzLml0ZW1BdChjZW50ZXIpOworCisgICAgICAgIGlmICh0aW1lVXMgPCBlbnRyeS5tVGltZVVzKSB7CisgICAgICAgICAgICByaWdodF9wbHVzX29uZSA9IGNlbnRlcjsKKyAgICAgICAgfSBlbHNlIGlmICh0aW1lVXMgPiBlbnRyeS5tVGltZVVzKSB7CisgICAgICAgICAgICBsZWZ0ID0gY2VudGVyICsgMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxlZnQgPSBjZW50ZXI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChsZWZ0ID09IG1UYWJsZU9mQ29udGVudHMuc2l6ZSgpKSB7CisgICAgICAgIC0tbGVmdDsKKyAgICB9CisKKyAgICBjb25zdCBUT0NFbnRyeSAmZW50cnkgPSBtVGFibGVPZkNvbnRlbnRzLml0ZW1BdChsZWZ0KTsKKworICAgIEFMT0dWKCJzZWVraW5nIHRvIGVudHJ5ICV6dSAvICV6dSBhdCBvZmZzZXQgJWxsZCIsCisgICAgICAgICBsZWZ0LCBtVGFibGVPZkNvbnRlbnRzLnNpemUoKSwgKGxvbmcgbG9uZyllbnRyeS5tUGFnZU9mZnNldCk7CisKKyAgICByZXR1cm4gc2Vla1RvT2Zmc2V0KGVudHJ5Lm1QYWdlT2Zmc2V0KTsKK30KKworc3RhdHVzX3QgTXlPZ2dFeHRyYWN0b3I6OnNlZWtUb09mZnNldChvZmY2NF90IG9mZnNldCkgeworICAgIGlmIChtRmlyc3REYXRhT2Zmc2V0ID49IDAgJiYgb2Zmc2V0IDwgbUZpcnN0RGF0YU9mZnNldCkgeworICAgICAgICAvLyBPbmNlIHdlIGtub3cgd2hlcmUgdGhlIGFjdHVhbCBhdWRpbyBkYXRhIHN0YXJ0cyAocGFzdCB0aGUgaGVhZGVycykKKyAgICAgICAgLy8gZG9uJ3QgZXZlciBzZWVrIHRvIGFueXdoZXJlIGJlZm9yZSB0aGF0LgorICAgICAgICBvZmZzZXQgPSBtRmlyc3REYXRhT2Zmc2V0OworICAgIH0KKworICAgIG9mZjY0X3QgcGFnZU9mZnNldDsKKyAgICBzdGF0dXNfdCBlcnIgPSBmaW5kTmV4dFBhZ2Uob2Zmc2V0LCAmcGFnZU9mZnNldCk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgLy8gV2UgZm91bmQgdGhlIHBhZ2Ugd2Ugd2FudGVkIHRvIHNlZWsgdG8sIGJ1dCB3ZSdsbCBhbHNvIG5lZWQKKyAgICAvLyB0aGUgcGFnZSBwcmVjZWRpbmcgaXQgdG8gZGV0ZXJtaW5lIGhvdyBtYW55IHZhbGlkIHNhbXBsZXMgYXJlIG9uCisgICAgLy8gdGhpcyBwYWdlLgorICAgIGZpbmRQcmV2R3JhbnVsZVBvc2l0aW9uKHBhZ2VPZmZzZXQsICZtUHJldkdyYW51bGVQb3NpdGlvbik7CisKKyAgICBtT2Zmc2V0ID0gcGFnZU9mZnNldDsKKworICAgIG1DdXJyZW50UGFnZVNpemUgPSAwOworICAgIG1GaXJzdFBhY2tldEluUGFnZSA9IHRydWU7CisgICAgbUN1cnJlbnRQYWdlU2FtcGxlcyA9IDA7CisgICAgbUN1cnJlbnRQYWdlLm1OdW1TZWdtZW50cyA9IDA7CisgICAgbUN1cnJlbnRQYWdlLm1QcmV2UGFja2V0U2l6ZSA9IC0xOworICAgIG1OZXh0TGFjZUluZGV4ID0gMDsKKworICAgIC8vIFhYWCB3aGF0IGlmIG5ldyBwYWdlIGNvbnRpbnVlcyBwYWNrZXQgZnJvbSBsYXN0Pz8/CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3NzaXplX3QgTXlPZ2dFeHRyYWN0b3I6OnJlYWRQYWdlKG9mZjY0X3Qgb2Zmc2V0LCBQYWdlICpwYWdlKSB7CisgICAgdWludDhfdCBoZWFkZXJbMjddOworICAgIHNzaXplX3QgbjsKKyAgICBpZiAoKG4gPSBtU291cmNlLT5yZWFkQXQob2Zmc2V0LCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKSkKKyAgICAgICAgICAgIDwgKHNzaXplX3Qpc2l6ZW9mKGhlYWRlcikpIHsKKyAgICAgICAgQUxPR1YoImZhaWxlZCB0byByZWFkICV6dSBieXRlcyBhdCBvZmZzZXQgJSMwMTZsbHgsIGdvdCAlemQgYnl0ZXMiLAorICAgICAgICAgICAgICAgIHNpemVvZihoZWFkZXIpLCAobG9uZyBsb25nKW9mZnNldCwgbik7CisKKyAgICAgICAgaWYgKG4gPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gbjsKKyAgICAgICAgfSBlbHNlIGlmIChuID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1lbWNtcChoZWFkZXIsICJPZ2dTIiwgNCkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBpZiAoaGVhZGVyWzRdICE9IDApIHsKKyAgICAgICAgLy8gV3JvbmcgdmVyc2lvbi4KKworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgcGFnZS0+bUZsYWdzID0gaGVhZGVyWzVdOworCisgICAgaWYgKHBhZ2UtPm1GbGFncyAmIH43KSB7CisgICAgICAgIC8vIE9ubHkgYml0cyAwLTIgYXJlIGRlZmluZWQgaW4gdmVyc2lvbiAwLgorICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHBhZ2UtPm1HcmFudWxlUG9zaXRpb24gPSBVNjRMRV9BVCgmaGVhZGVyWzZdKTsKKworI2lmIDAKKyAgICBwcmludGYoImdyYW51bGVQb3NpdGlvbiA9ICVsbHUgKDB4JWxseClcbiIsCisgICAgICAgICAgIHBhZ2UtPm1HcmFudWxlUG9zaXRpb24sIHBhZ2UtPm1HcmFudWxlUG9zaXRpb24pOworI2VuZGlmCisKKyAgICBwYWdlLT5tU2VyaWFsTm8gPSBVMzJMRV9BVCgmaGVhZGVyWzE0XSk7CisgICAgcGFnZS0+bVBhZ2VObyA9IFUzMkxFX0FUKCZoZWFkZXJbMThdKTsKKworICAgIHBhZ2UtPm1OdW1TZWdtZW50cyA9IGhlYWRlclsyNl07CisgICAgaWYgKG1Tb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICBvZmZzZXQgKyBzaXplb2YoaGVhZGVyKSwgcGFnZS0+bUxhY2UsIHBhZ2UtPm1OdW1TZWdtZW50cykKKyAgICAgICAgICAgIDwgKHNzaXplX3QpcGFnZS0+bU51bVNlZ21lbnRzKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisKKyAgICBzaXplX3QgdG90YWxTaXplID0gMDs7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYWdlLT5tTnVtU2VnbWVudHM7ICsraSkgeworICAgICAgICB0b3RhbFNpemUgKz0gcGFnZS0+bUxhY2VbaV07CisgICAgfQorCisjaWYgMAorICAgIFN0cmluZzggdG1wOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGFnZS0+bU51bVNlZ21lbnRzOyArK2kpIHsKKyAgICAgICAgY2hhciB4WzMyXTsKKyAgICAgICAgc3ByaW50Zih4LCAiJXMldSIsIGkgPiAwID8gIiwgIiA6ICIiLCAodW5zaWduZWQpcGFnZS0+bUxhY2VbaV0pOworCisgICAgICAgIHRtcC5hcHBlbmQoeCk7CisgICAgfQorCisgICAgQUxPR1YoIiVjICVzIiwgcGFnZS0+bUZsYWdzICYgMSA/ICcrJyA6ICcgJywgdG1wLnN0cmluZygpKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIHNpemVvZihoZWFkZXIpICsgcGFnZS0+bU51bVNlZ21lbnRzICsgdG90YWxTaXplOworfQorCitzdGF0dXNfdCBNeU9wdXNFeHRyYWN0b3I6OnJlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVyQmFzZSAqKm91dCkgeworICAgIGlmIChtT2Zmc2V0IDw9IG1GaXJzdERhdGFPZmZzZXQgJiYgbVN0YXJ0R3JhbnVsZVBvc2l0aW9uIDwgMCkgeworICAgICAgICAvLyBUaGUgZmlyc3Qgc2FtcGxlIG1pZ2h0IG5vdCBzdGFydCBhdCB0aW1lIDA7IGZpbmQgb3V0IHdoZXJlIGJ5IHN1YnRyYWN0aW5nCisgICAgICAgIC8vIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBvbiB0aGUgZmlyc3QgcGFnZSBmcm9tIHRoZSBncmFudWxlIHBvc2l0aW9uCisgICAgICAgIC8vIChwb3NpdGlvbiBvZiBsYXN0IGNvbXBsZXRlIHNhbXBsZSkgb2YgdGhlIGZpcnN0IHBhZ2UuIFRoaXMgaGFwcGVucworICAgICAgICAvLyB0aGUgZmlyc3QgdGltZSBiZWZvcmUgd2UgYXR0ZW1wdCB0byByZWFkIGEgcGFja2V0IGZyb20gdGhlIGZpcnN0IHBhZ2UuCisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqbUJ1ZjsKKyAgICAgICAgdWludDMyX3QgbnVtU2FtcGxlcyA9IDA7CisgICAgICAgIHVpbnQ2NF90IGN1ckdyYW51bGVQb3NpdGlvbiA9IDA7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBfcmVhZE5leHRQYWNrZXQoJm1CdWYsIC8qIGNhbGNWb3JiaXNUaW1lc3RhbXAgPSAqL2ZhbHNlKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0sgJiYgZXJyICE9IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRmlyc3QgdHdvIHBhZ2VzIGFyZSBoZWFkZXIgcGFnZXMuCisgICAgICAgICAgICBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0gfHwgbUN1cnJlbnRQYWdlLm1QYWdlTm8gPiAyKSB7CisgICAgICAgICAgICAgICAgaWYgKG1CdWYgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBtQnVmLT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgICAgIG1CdWYgPSBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGN1ckdyYW51bGVQb3NpdGlvbiA9IG1DdXJyZW50UGFnZS5tR3JhbnVsZVBvc2l0aW9uOworICAgICAgICAgICAgbnVtU2FtcGxlcyArPSBnZXROdW1TYW1wbGVzSW5QYWNrZXQobUJ1Zik7CisgICAgICAgICAgICBtQnVmLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtQnVmID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjdXJHcmFudWxlUG9zaXRpb24gPiBudW1TYW1wbGVzKSB7CisgICAgICAgICAgICBtU3RhcnRHcmFudWxlUG9zaXRpb24gPSBjdXJHcmFudWxlUG9zaXRpb24gLSBudW1TYW1wbGVzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVN0YXJ0R3JhbnVsZVBvc2l0aW9uID0gMDsKKyAgICAgICAgfQorICAgICAgICBzZWVrVG9PZmZzZXQoMCk7CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyID0gX3JlYWROZXh0UGFja2V0KG91dCwgLyogY2FsY1ZvcmJpc1RpbWVzdGFtcCA9ICovZmFsc2UpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpbnQzMl90IGN1cnJlbnRQYWdlU2FtcGxlczsKKyAgICAvLyBDYWxjdWxhdGUgdGltZXN0YW1wcyBieSBhY2N1bXVsYXRpbmcgZHVyYXRpb25zIHN0YXJ0aW5nIGZyb20gdGhlIGZpcnN0IHNhbXBsZSBvZiBhIHBhZ2U7CisgICAgLy8gV2UgYXNzdW1lIHRoYXQgd2Ugb25seSBzZWVrIHRvIHBhZ2UgYm91bmRhcmllcy4KKyAgICBpZiAoKCpvdXQpLT5tZXRhX2RhdGEoKS5maW5kSW50MzIoa0tleVZhbGlkU2FtcGxlcywgJmN1cnJlbnRQYWdlU2FtcGxlcykpIHsKKyAgICAgICAgLy8gZmlyc3QgcGFja2V0IGluIHBhZ2UKKyAgICAgICAgaWYgKG1PZmZzZXQgPT0gbUZpcnN0RGF0YU9mZnNldCkgeworICAgICAgICAgICAgY3VycmVudFBhZ2VTYW1wbGVzIC09IG1TdGFydEdyYW51bGVQb3NpdGlvbjsKKyAgICAgICAgICAgICgqb3V0KS0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleVZhbGlkU2FtcGxlcywgY3VycmVudFBhZ2VTYW1wbGVzKTsKKyAgICAgICAgfQorICAgICAgICBtQ3VyR3JhbnVsZVBvc2l0aW9uID0gbUN1cnJlbnRQYWdlLm1HcmFudWxlUG9zaXRpb24gLSBjdXJyZW50UGFnZVNhbXBsZXM7CisgICAgfQorCisgICAgaW50NjRfdCB0aW1lVXMgPSBnZXRUaW1lVXNPZkdyYW51bGUobUN1ckdyYW51bGVQb3NpdGlvbik7CisgICAgKCpvdXQpLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKKworICAgIHVpbnQzMl90IGZyYW1lcyA9IGdldE51bVNhbXBsZXNJblBhY2tldCgqb3V0KTsKKyAgICBtQ3VyR3JhbnVsZVBvc2l0aW9uICs9IGZyYW1lczsKKyAgICByZXR1cm4gT0s7Cit9CisKK3VpbnQzMl90IE15T3B1c0V4dHJhY3Rvcjo6Z2V0TnVtU2FtcGxlc0luUGFja2V0KE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKSBjb25zdCB7CisgICAgaWYgKGJ1ZmZlciA9PSBOVUxMIHx8IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPCAxKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHVpbnQ4X3QgKmRhdGEgPSAodWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKKyAgICB1aW50OF90IHRvYyA9IGRhdGFbMF07CisgICAgdWludDhfdCBjb25maWcgPSAodG9jID4+IDMpICYgMHgxZjsKKyAgICB1aW50MzJfdCBmcmFtZVNpemVzVXNbXSA9IHsKKyAgICAgICAgMTAwMDAsIDIwMDAwLCA0MDAwMCwgNjAwMDAsIC8vIDAuLi4zCisgICAgICAgIDEwMDAwLCAyMDAwMCwgNDAwMDAsIDYwMDAwLCAvLyA0Li4uNworICAgICAgICAxMDAwMCwgMjAwMDAsIDQwMDAwLCA2MDAwMCwgLy8gOC4uLjExCisgICAgICAgIDEwMDAwLCAyMDAwMCwgICAgICAgICAgICAgICAvLyAxMi4uLjEzCisgICAgICAgIDEwMDAwLCAyMDAwMCwgICAgICAgICAgICAgICAvLyAxNC4uLjE1CisgICAgICAgIDI1MDAsIDUwMDAsIDEwMDAwLCAyMDAwMCwgICAvLyAxNi4uLjE5CisgICAgICAgIDI1MDAsIDUwMDAsIDEwMDAwLCAyMDAwMCwgICAvLyAyMC4uLjIzCisgICAgICAgIDI1MDAsIDUwMDAsIDEwMDAwLCAyMDAwMCwgICAvLyAyNC4uLjI3CisgICAgICAgIDI1MDAsIDUwMDAsIDEwMDAwLCAyMDAwMCAgICAvLyAyOC4uLjMxCisgICAgfTsKKyAgICB1aW50MzJfdCBmcmFtZVNpemVVcyA9IGZyYW1lU2l6ZXNVc1tjb25maWddOworCisgICAgdWludDMyX3QgbnVtRnJhbWVzOworICAgIHVpbnQ4X3QgYyA9IHRvYyAmIDM7CisgICAgc3dpdGNoIChjKSB7CisgICAgY2FzZSAwOgorICAgICAgICBudW1GcmFtZXMgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgY2FzZSAyOgorICAgICAgICBudW1GcmFtZXMgPSAyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAgIGlmIChidWZmZXItPnJhbmdlX2xlbmd0aCgpIDwgMykgeworICAgICAgICAgICAgbnVtRnJhbWVzID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG51bUZyYW1lcyA9IGRhdGFbMl0gJiAweDNmOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIFRSRVNQQVNTKCk7CisgICAgfQorCisgICAgdWludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lU2l6ZVVzICogbnVtRnJhbWVzICoga09wdXNTYW1wbGVSYXRlIC8gMTAwMDAwMDsKKyAgICByZXR1cm4gbnVtU2FtcGxlczsKK30KKworc3RhdHVzX3QgTXlPZ2dFeHRyYWN0b3I6Ol9yZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGJvb2wgY2FsY1ZvcmJpc1RpbWVzdGFtcCkgeworICAgICpvdXQgPSBOVUxMOworCisgICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXIgPSBOVUxMOworICAgIGludDY0X3QgdGltZVVzID0gLTE7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIHNpemVfdCBpOworICAgICAgICBzaXplX3QgcGFja2V0U2l6ZSA9IDA7CisgICAgICAgIGJvb2wgZ290RnVsbFBhY2tldCA9IGZhbHNlOworICAgICAgICBmb3IgKGkgPSBtTmV4dExhY2VJbmRleDsgaSA8IG1DdXJyZW50UGFnZS5tTnVtU2VnbWVudHM7ICsraSkgeworICAgICAgICAgICAgdWludDhfdCBsYWNlID0gbUN1cnJlbnRQYWdlLm1MYWNlW2ldOworCisgICAgICAgICAgICBwYWNrZXRTaXplICs9IGxhY2U7CisKKyAgICAgICAgICAgIGlmIChsYWNlIDwgMjU1KSB7CisgICAgICAgICAgICAgICAgZ290RnVsbFBhY2tldCA9IHRydWU7CisgICAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG1OZXh0TGFjZUluZGV4IDwgbUN1cnJlbnRQYWdlLm1OdW1TZWdtZW50cykgeworICAgICAgICAgICAgb2ZmNjRfdCBkYXRhT2Zmc2V0ID0gbU9mZnNldCArIDI3ICsgbUN1cnJlbnRQYWdlLm1OdW1TZWdtZW50czsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbU5leHRMYWNlSW5kZXg7ICsraikgeworICAgICAgICAgICAgICAgIGRhdGFPZmZzZXQgKz0gbUN1cnJlbnRQYWdlLm1MYWNlW2pdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzaXplX3QgZnVsbFNpemUgPSBwYWNrZXRTaXplOworICAgICAgICAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZnVsbFNpemUgKz0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmdWxsU2l6ZSA+IDE2ICogMTAyNCAqIDEwMjQpIHsgLy8gYXJiaXRyYXJ5IGxpbWl0IG9mIDE2IE1CIHBhY2tldCBzaXplCisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HRSgiYi8zNjU5MjIwMiIpOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKnRtcCA9IE1lZGlhQnVmZmVyQmFzZTo6Q3JlYXRlKGZ1bGxTaXplKTsKKyAgICAgICAgICAgIGlmICh0bXAgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmIChidWZmZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR0UoImIvMzY1OTIyMDIiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KHRtcC0+ZGF0YSgpLCBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgdG1wLT5zZXRfcmFuZ2UoMCwgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRtcC0+c2V0X3JhbmdlKDAsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmZmVyID0gdG1wOworCisgICAgICAgICAgICBzc2l6ZV90IG4gPSBtU291cmNlLT5yZWFkQXQoCisgICAgICAgICAgICAgICAgICAgIGRhdGFPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICh1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX2xlbmd0aCgpLAorICAgICAgICAgICAgICAgICAgICBwYWNrZXRTaXplKTsKKworICAgICAgICAgICAgaWYgKG4gPCAoc3NpemVfdClwYWNrZXRTaXplKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgQUxPR1YoImZhaWxlZCB0byByZWFkICV6dSBieXRlcyBhdCAlIzAxNmxseCwgZ290ICV6ZCBieXRlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBwYWNrZXRTaXplLCAobG9uZyBsb25nKWRhdGFPZmZzZXQsIG4pOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgZnVsbFNpemUpOworCisgICAgICAgICAgICBtTmV4dExhY2VJbmRleCA9IGk7CisKKyAgICAgICAgICAgIGlmIChnb3RGdWxsUGFja2V0KSB7CisgICAgICAgICAgICAgICAgLy8gV2UndmUganVzdCByZWFkIHRoZSBlbnRpcmUgcGFja2V0LgorCisgICAgICAgICAgICAgICAgaWYgKG1GaXJzdFBhY2tldEluUGFnZSkgeworICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlWYWxpZFNhbXBsZXMsIG1DdXJyZW50UGFnZVNhbXBsZXMpOworICAgICAgICAgICAgICAgICAgICBtRmlyc3RQYWNrZXRJblBhZ2UgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoY2FsY1ZvcmJpc1RpbWVzdGFtcCkgeworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGN1ckJsb2NrU2l6ZSA9IGdldFBhY2tldEJsb2NrU2l6ZShidWZmZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRQYWdlLm1QcmV2UGFja2V0U2l6ZSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50UGFnZS5tUHJldlBhY2tldFNpemUgPSBjdXJCbG9ja1NpemU7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFBhZ2UubVByZXZQYWNrZXRQb3MgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFBhZ2UubUdyYW51bGVQb3NpdGlvbiAtIG1DdXJyZW50UGFnZVNhbXBsZXM7CisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lVXMgPSBtQ3VycmVudFBhZ2UubVByZXZQYWNrZXRQb3MgKiAxMDAwMDAwbGwgLyBtVmkucmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBlZmZlY3RpdmUgYmxvY2sgc2l6ZSBpcyB0aGUgYXZlcmFnZSBvZiB0aGUgdHdvIG92ZXJsYXBwZWQgYmxvY2tzCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGFjdHVhbEJsb2NrU2l6ZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjdXJCbG9ja1NpemUgKyBtQ3VycmVudFBhZ2UubVByZXZQYWNrZXRTaXplKSAvIDI7CisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lVXMgPSBtQ3VycmVudFBhZ2UubVByZXZQYWNrZXRQb3MgKiAxMDAwMDAwbGwgLyBtVmkucmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBhY3R1YWwgc2l6ZSBvdXRwdXQgYnkgdGhlIGRlY29kZXIgd2lsbCBiZSBoYWxmIHRoZSBlZmZlY3RpdmUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpemUsIGR1ZSB0byB0aGUgb3ZlcmxhcAorICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRQYWdlLm1QcmV2UGFja2V0UG9zICs9IGFjdHVhbEJsb2NrU2l6ZSAvIDI7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFBhZ2UubVByZXZQYWNrZXRTaXplID0gY3VyQmxvY2tTaXplOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpvdXQgPSBidWZmZXI7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaCwgdGhlIGJ1ZmZlciBub3cgY29udGFpbnMgdGhlIHN0YXJ0IG9mIHRoZSBwYWNrZXQuCisgICAgICAgIH0KKworICAgICAgICBDSEVDS19FUShtTmV4dExhY2VJbmRleCwgbUN1cnJlbnRQYWdlLm1OdW1TZWdtZW50cyk7CisKKyAgICAgICAgbU9mZnNldCArPSBtQ3VycmVudFBhZ2VTaXplOworICAgICAgICBzc2l6ZV90IG4gPSByZWFkUGFnZShtT2Zmc2V0LCAmbUN1cnJlbnRQYWdlKTsKKworICAgICAgICBpZiAobiA8PSAwKSB7CisgICAgICAgICAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQUxPR1YoInJlYWRQYWdlIHJldHVybmVkICV6ZCIsIG4pOworCisgICAgICAgICAgICByZXR1cm4gbiA8IDAgPyBuIDogKHN0YXR1c190KUVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIH0KKworICAgICAgICAvLyBQcmV2ZW50IGEgaGFybWxlc3MgdW5zaWduZWQgaW50ZWdlciBvdmVyZmxvdyBieSBjbGFtcGluZyB0byAwCisgICAgICAgIGlmIChtQ3VycmVudFBhZ2UubUdyYW51bGVQb3NpdGlvbiA+PSBtUHJldkdyYW51bGVQb3NpdGlvbikgeworICAgICAgICAgICAgbUN1cnJlbnRQYWdlU2FtcGxlcyA9CisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50UGFnZS5tR3JhbnVsZVBvc2l0aW9uIC0gbVByZXZHcmFudWxlUG9zaXRpb247CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQ3VycmVudFBhZ2VTYW1wbGVzID0gMDsKKyAgICAgICAgfQorICAgICAgICBtRmlyc3RQYWNrZXRJblBhZ2UgPSB0cnVlOworCisgICAgICAgIG1QcmV2R3JhbnVsZVBvc2l0aW9uID0gbUN1cnJlbnRQYWdlLm1HcmFudWxlUG9zaXRpb247CisKKyAgICAgICAgbUN1cnJlbnRQYWdlU2l6ZSA9IG47CisgICAgICAgIG1OZXh0TGFjZUluZGV4ID0gMDsKKworICAgICAgICBpZiAoYnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmICgobUN1cnJlbnRQYWdlLm1GbGFncyAmIDEpID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIHBhZ2UgZG9lcyBub3QgY29udGludWUgdGhlIHBhY2tldCwgaS5lLiB0aGUgcGFja2V0CisgICAgICAgICAgICAgICAgLy8gaXMgYWxyZWFkeSBjb21wbGV0ZS4KKworICAgICAgICAgICAgICAgIGlmICh0aW1lVXMgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoCisgICAgICAgICAgICAgICAgICAgICAgICBrS2V5VmFsaWRTYW1wbGVzLCBtQ3VycmVudFBhZ2VTYW1wbGVzKTsKKyAgICAgICAgICAgICAgICBtRmlyc3RQYWNrZXRJblBhZ2UgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgICpvdXQgPSBidWZmZXI7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXR1c190IE15T2dnRXh0cmFjdG9yOjppbml0KCkgeworICAgIG1NZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBtTWltZVR5cGUpOworCisgICAgc3RhdHVzX3QgZXJyOworICAgIE1lZGlhQnVmZmVyQmFzZSAqcGFja2V0OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU51bUhlYWRlcnM7ICsraSkgeworICAgICAgICAvLyBpZ25vcmUgdGltZXN0YW1wIGZvciBjb25maWd1cmF0aW9uIHBhY2tldHMKKyAgICAgICAgaWYgKChlcnIgPSBfcmVhZE5leHRQYWNrZXQoJnBhY2tldCwgLyogY2FsY1ZvcmJpc1RpbWVzdGFtcCA9ICovIGZhbHNlKSkgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoInJlYWQgcGFja2V0IG9mIHNpemUgJXp1XG4iLCBwYWNrZXQtPnJhbmdlX2xlbmd0aCgpKTsKKyAgICAgICAgZXJyID0gdmVyaWZ5SGVhZGVyKHBhY2tldCwgLyogdHlwZSA9ICovIGkgKiAyICsgMSk7CisgICAgICAgIHBhY2tldC0+cmVsZWFzZSgpOworICAgICAgICBwYWNrZXQgPSBOVUxMOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorCisgICAgbUZpcnN0RGF0YU9mZnNldCA9IG1PZmZzZXQgKyBtQ3VycmVudFBhZ2VTaXplOworCisgICAgb2ZmNjRfdCBzaXplOworICAgIHVpbnQ2NF90IGxhc3RHcmFudWxlUG9zaXRpb247CisgICAgaWYgKCEobVNvdXJjZS0+ZmxhZ3MoKSAmIERhdGFTb3VyY2VCYXNlOjprSXNDYWNoaW5nRGF0YVNvdXJjZSkKKyAgICAgICAgICAgICYmIG1Tb3VyY2UtPmdldFNpemUoJnNpemUpID09IE9LCisgICAgICAgICAgICAmJiBmaW5kUHJldkdyYW51bGVQb3NpdGlvbihzaXplLCAmbGFzdEdyYW51bGVQb3NpdGlvbikgPT0gT0spIHsKKyAgICAgICAgLy8gTGV0J3MgYXNzdW1lIGl0J3MgY2hlYXAgdG8gc2VlayB0byB0aGUgZW5kLgorICAgICAgICAvLyBUaGUgZ3JhbnVsZSBwb3NpdGlvbiBvZiB0aGUgZmluYWwgcGFnZSBpbiB0aGUgc3RyZWFtIHdpbGwKKyAgICAgICAgLy8gZ2l2ZSB1cyB0aGUgZXhhY3QgZHVyYXRpb24gb2YgdGhlIGNvbnRlbnQsIHNvbWV0aGluZyB0aGF0CisgICAgICAgIC8vIHdlIGNhbiBvbmx5IGFwcHJveGltYXRlIHVzaW5nIGF2Zy4gYml0cmF0ZSBpZiBzZWVraW5nIHRvCisgICAgICAgIC8vIHRoZSBlbmQgaXMgdG9vIGV4cGVuc2l2ZSBvciBpbXBvc3NpYmxlIChsaXZlIHN0cmVhbWluZykuCisKKyAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzID0gZ2V0VGltZVVzT2ZHcmFudWxlKGxhc3RHcmFudWxlUG9zaXRpb24pOworCisgICAgICAgIG1NZXRhLnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb25Vcyk7CisKKyAgICAgICAgYnVpbGRUYWJsZU9mQ29udGVudHMoKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgTXlPZ2dFeHRyYWN0b3I6OmJ1aWxkVGFibGVPZkNvbnRlbnRzKCkgeworICAgIG9mZjY0X3Qgb2Zmc2V0ID0gbUZpcnN0RGF0YU9mZnNldDsKKyAgICBQYWdlIHBhZ2U7CisgICAgc3NpemVfdCBwYWdlU2l6ZTsKKyAgICB3aGlsZSAoKHBhZ2VTaXplID0gcmVhZFBhZ2Uob2Zmc2V0LCAmcGFnZSkpID4gMCkgeworICAgICAgICBtVGFibGVPZkNvbnRlbnRzLnB1c2goKTsKKworICAgICAgICBUT0NFbnRyeSAmZW50cnkgPQorICAgICAgICAgICAgbVRhYmxlT2ZDb250ZW50cy5lZGl0SXRlbUF0KG1UYWJsZU9mQ29udGVudHMuc2l6ZSgpIC0gMSk7CisKKyAgICAgICAgZW50cnkubVBhZ2VPZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgIGVudHJ5Lm1UaW1lVXMgPSBnZXRUaW1lVXNPZkdyYW51bGUocGFnZS5tR3JhbnVsZVBvc2l0aW9uKTsKKworICAgICAgICBvZmZzZXQgKz0gKHNpemVfdClwYWdlU2l6ZTsKKyAgICB9CisKKyAgICAvLyBMaW1pdCB0aGUgbWF4aW11bSBhbW91bnQgb2YgUkFNIHdlIHNwZW5kIG9uIHRoZSB0YWJsZSBvZiBjb250ZW50cywKKyAgICAvLyBpZiBuZWNlc3NhcnkgdGhpbiBvdXQgdGhlIHRhYmxlIGV2ZW5seSB0byB0cmltIGl0IGRvd24gdG8gbWF4aW11bQorICAgIC8vIHNpemUuCisKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhUT0NTaXplID0gODE5MjsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhOdW1UT0NFbnRyaWVzID0ga01heFRPQ1NpemUgLyBzaXplb2YoVE9DRW50cnkpOworCisgICAgc2l6ZV90IG51bWVyYXRvciA9IG1UYWJsZU9mQ29udGVudHMuc2l6ZSgpOworCisgICAgaWYgKG51bWVyYXRvciA+IGtNYXhOdW1UT0NFbnRyaWVzKSB7CisgICAgICAgIHNpemVfdCBkZW5vbSA9IG51bWVyYXRvciAtIGtNYXhOdW1UT0NFbnRyaWVzOworCisgICAgICAgIHNpemVfdCBhY2N1bSA9IDA7CisgICAgICAgIGZvciAoc3NpemVfdCBpID0gbVRhYmxlT2ZDb250ZW50cy5zaXplKCkgLSAxOyBpID49IDA7IC0taSkgeworICAgICAgICAgICAgYWNjdW0gKz0gZGVub207CisgICAgICAgICAgICBpZiAoYWNjdW0gPj0gbnVtZXJhdG9yKSB7CisgICAgICAgICAgICAgICAgbVRhYmxlT2ZDb250ZW50cy5yZW1vdmVBdChpKTsKKyAgICAgICAgICAgICAgICBhY2N1bSAtPSBudW1lcmF0b3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ludDMyX3QgTXlPZ2dFeHRyYWN0b3I6OmdldFBhY2tldEJsb2NrU2l6ZShNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcikgeworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPQorICAgICAgICAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKKworICAgIHNpemVfdCBzaXplID0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKKworICAgIG9nZ19idWZmZXIgYnVmOworICAgIGJ1Zi5kYXRhID0gKHVpbnQ4X3QgKilkYXRhOworICAgIGJ1Zi5zaXplID0gc2l6ZTsKKyAgICBidWYucmVmY291bnQgPSAxOworICAgIGJ1Zi5wdHIub3duZXIgPSBOVUxMOworCisgICAgb2dnX3JlZmVyZW5jZSByZWY7CisgICAgcmVmLmJ1ZmZlciA9ICZidWY7CisgICAgcmVmLmJlZ2luID0gMDsKKyAgICByZWYubGVuZ3RoID0gc2l6ZTsKKyAgICByZWYubmV4dCA9IE5VTEw7CisKKyAgICBvZ2dfcGFja2V0IHBhY2s7CisgICAgcGFjay5wYWNrZXQgPSAmcmVmOworICAgIHBhY2suYnl0ZXMgPSByZWYubGVuZ3RoOworICAgIHBhY2suYl9vX3MgPSAwOworICAgIHBhY2suZV9vX3MgPSAwOworICAgIHBhY2suZ3JhbnVsZXBvcyA9IDA7CisgICAgcGFjay5wYWNrZXRubyA9IDA7CisKKyAgICByZXR1cm4gdm9yYmlzX3BhY2tldF9ibG9ja3NpemUoJm1WaSwgJnBhY2spOworfQorCitpbnQ2NF90IE15T3B1c0V4dHJhY3Rvcjo6Z2V0VGltZVVzT2ZHcmFudWxlKHVpbnQ2NF90IGdyYW51bGVQb3MpIGNvbnN0IHsKKyAgICB1aW50NjRfdCBwY21TYW1wbGVQb3NpdGlvbiA9IDA7CisgICAgaWYgKGdyYW51bGVQb3MgPiBtQ29kZWNEZWxheSkgeworICAgICAgICBwY21TYW1wbGVQb3NpdGlvbiA9IGdyYW51bGVQb3MgLSBtQ29kZWNEZWxheTsKKyAgICB9CisgICAgaWYgKHBjbVNhbXBsZVBvc2l0aW9uID4gSU5UNjRfTUFYIC8gMTAwMDAwMGxsKSB7CisgICAgICAgIHJldHVybiBJTlQ2NF9NQVg7CisgICAgfQorICAgIHJldHVybiBwY21TYW1wbGVQb3NpdGlvbiAqIDEwMDAwMDBsbCAvIGtPcHVzU2FtcGxlUmF0ZTsKK30KKworc3RhdHVzX3QgTXlPcHVzRXh0cmFjdG9yOjp2ZXJpZnlIZWFkZXIoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIsIHVpbnQ4X3QgdHlwZSkgeworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAvLyB0aGVyZSBhcmUgYWN0dWFsbHkgbm8gaGVhZGVyIHR5cGVzIGRlZmluZWQgaW4gdGhlIE9wdXMgc3BlYzsgd2UgY2hvb3NlIDEgYW5kIDMgdG8gbWVhbgorICAgICAgICAvLyBoZWFkZXIgYW5kIGNvbW1lbnRzIHN1Y2ggdGhhdCB3ZSBjYW4gc2hhcmUgY29kZSB3aXRoIE15Vm9yYmlzRXh0cmFjdG9yLgorICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICByZXR1cm4gdmVyaWZ5T3B1c0hlYWRlcihidWZmZXIpOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICByZXR1cm4gdmVyaWZ5T3B1c0NvbW1lbnRzKGJ1ZmZlcik7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorfQorCitzdGF0dXNfdCBNeU9wdXNFeHRyYWN0b3I6OnZlcmlmeU9wdXNIZWFkZXIoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpIHsKKyAgICBjb25zdCBzaXplX3Qga09wdXNIZWFkZXJTaXplID0gMTk7CisgICAgY29uc3QgdWludDhfdCAqZGF0YSA9CisgICAgICAgIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpOworCisgICAgc2l6ZV90IHNpemUgPSBidWZmZXItPnJhbmdlX2xlbmd0aCgpOworCisgICAgaWYgKHNpemUgPCBrT3B1c0hlYWRlclNpemUKKyAgICAgICAgICAgIHx8IG1lbWNtcChkYXRhLCAiT3B1c0hlYWQiLCA4KQorICAgICAgICAgICAgfHwgLyogdmVyc2lvbiA9ICovIGRhdGFbOF0gIT0gMSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIG1DaGFubmVsQ291bnQgPSBkYXRhWzldOworICAgIG1Db2RlY0RlbGF5ID0gVTE2TEVfQVQoJmRhdGFbMTBdKTsKKworICAgIG1NZXRhLnNldERhdGEoa0tleU9wdXNIZWFkZXIsIDAsIGRhdGEsIHNpemUpOworICAgIG1NZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBrT3B1c1NhbXBsZVJhdGUpOworICAgIG1NZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG1DaGFubmVsQ291bnQpOworICAgIG1NZXRhLnNldEludDY0KGtLZXlPcHVzU2Vla1ByZVJvbGwgLyogbnMgKi8sIGtPcHVzU2Vla1ByZVJvbGxVcyAqIDEwMDAgLyogPSA4MCBtcyovKTsKKyAgICBtTWV0YS5zZXRJbnQ2NChrS2V5T3B1c0NvZGVjRGVsYXkgLyogbnMgKi8sCisgICAgICAgICAgICBtQ29kZWNEZWxheSAvKiBzYW1wbGUvcyAqLyAqIDEwMDAwMDAwMDBsbCAvIGtPcHVzU2FtcGxlUmF0ZSk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE15T3B1c0V4dHJhY3Rvcjo6dmVyaWZ5T3B1c0NvbW1lbnRzKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKSB7CisgICAgLy8gYWRkIGFydGlmaWNpYWwgZnJhbWluZyBiaXQgc28gd2UgY2FuIHJldXNlIF92b3JiaXNfdW5wYWNrX2NvbW1lbnQKKyAgICBpbnQzMl90IGNvbW1lbnRTaXplID0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSArIDE7CisgICAgYXV0byB0bXAgPSBoZWFwYnVmZmVyPHVpbnQ4X3Q+KGNvbW1lbnRTaXplKTsKKyAgICB1aW50OF90ICpjb21tZW50RGF0YSA9IHRtcC5nZXQoKTsKKyAgICBpZiAoY29tbWVudERhdGEgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIG1lbWNweShjb21tZW50RGF0YSwKKyAgICAgICAgICAgICh1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpLAorICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CisKKyAgICBvZ2dfYnVmZmVyIGJ1ZjsKKyAgICBidWYuZGF0YSA9IGNvbW1lbnREYXRhOworICAgIGJ1Zi5zaXplID0gY29tbWVudFNpemU7CisgICAgYnVmLnJlZmNvdW50ID0gMTsKKyAgICBidWYucHRyLm93bmVyID0gTlVMTDsKKworICAgIG9nZ19yZWZlcmVuY2UgcmVmOworICAgIHJlZi5idWZmZXIgPSAmYnVmOworICAgIHJlZi5iZWdpbiA9IDA7CisgICAgcmVmLmxlbmd0aCA9IGNvbW1lbnRTaXplOworICAgIHJlZi5uZXh0ID0gTlVMTDsKKworICAgIG9nZ3BhY2tfYnVmZmVyIGJpdHM7CisgICAgb2dncGFja19yZWFkaW5pdCgmYml0cywgJnJlZik7CisKKyAgICAvLyBza2lwICdPcHVzVGFncycKKyAgICBjb25zdCBjaGFyICpPcHVzVGFncyA9ICJPcHVzVGFncyI7CisgICAgY29uc3QgaW50MzJfdCBoZWFkZXJMZW4gPSBzdHJsZW4oT3B1c1RhZ3MpOworICAgIGludDMyX3QgZnJhbWluZ0JpdE9mZnNldCA9IGhlYWRlckxlbjsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGhlYWRlckxlbjsgKytpKSB7CisgICAgICAgIGNoYXIgY2hyID0gb2dncGFja19yZWFkKCZiaXRzLCA4KTsKKyAgICAgICAgaWYgKGNociAhPSBPcHVzVGFnc1tpXSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGludDMyX3QgdmVuZG9yTGVuID0gb2dncGFja19yZWFkKCZiaXRzLCAzMik7CisgICAgZnJhbWluZ0JpdE9mZnNldCArPSA0OworICAgIGlmICh2ZW5kb3JMZW4gPCAwIHx8IHZlbmRvckxlbiA+IGNvbW1lbnRTaXplIC0gOCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICAvLyBza2lwIHZlbmRvciBzdHJpbmcKKyAgICBmcmFtaW5nQml0T2Zmc2V0ICs9IHZlbmRvckxlbjsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHZlbmRvckxlbjsgKytpKSB7CisgICAgICAgIG9nZ3BhY2tfcmVhZCgmYml0cywgOCk7CisgICAgfQorCisgICAgaW50MzJfdCBuID0gb2dncGFja19yZWFkKCZiaXRzLCAzMik7CisgICAgZnJhbWluZ0JpdE9mZnNldCArPSA0OworICAgIGlmIChuIDwgMCB8fCBuID4gKChjb21tZW50U2l6ZSAtIG9nZ3BhY2tfYnl0ZXMoJmJpdHMpKSA+PiAyKSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICBpbnQzMl90IGxlbiA9IG9nZ3BhY2tfcmVhZCgmYml0cywgMzIpOworICAgICAgICBmcmFtaW5nQml0T2Zmc2V0ICs9IDQ7CisgICAgICAgIGlmIChsZW4gIDwgMCB8fCBsZW4gID4gKGNvbW1lbnRTaXplIC0gb2dncGFja19ieXRlcygmYml0cykpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgICAgIGZyYW1pbmdCaXRPZmZzZXQgKz0gbGVuOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGxlbjsgKytqKSB7CisgICAgICAgICAgICBvZ2dwYWNrX3JlYWQoJmJpdHMsIDgpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChmcmFtaW5nQml0T2Zmc2V0IDwgMCB8fCBmcmFtaW5nQml0T2Zmc2V0ID49IGNvbW1lbnRTaXplKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIGNvbW1lbnREYXRhW2ZyYW1pbmdCaXRPZmZzZXRdID0gMTsKKworICAgIGJ1Zi5kYXRhID0gY29tbWVudERhdGEgKyBoZWFkZXJMZW47CisgICAgYnVmLnNpemUgPSBjb21tZW50U2l6ZSAtIGhlYWRlckxlbjsKKyAgICBidWYucmVmY291bnQgPSAxOworICAgIGJ1Zi5wdHIub3duZXIgPSBOVUxMOworCisgICAgcmVmLmJ1ZmZlciA9ICZidWY7CisgICAgcmVmLmJlZ2luID0gMDsKKyAgICByZWYubGVuZ3RoID0gY29tbWVudFNpemUgLSBoZWFkZXJMZW47CisgICAgcmVmLm5leHQgPSBOVUxMOworCisgICAgb2dncGFja19yZWFkaW5pdCgmYml0cywgJnJlZik7CisgICAgaW50IGVyciA9IF92b3JiaXNfdW5wYWNrX2NvbW1lbnQoJm1WYywgJmJpdHMpOworICAgIGlmICgwICE9IGVycikgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHBhcnNlRmlsZU1ldGFEYXRhKCk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNeVZvcmJpc0V4dHJhY3Rvcjo6dmVyaWZ5SGVhZGVyKAorICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciwgdWludDhfdCB0eXBlKSB7CisgICAgY29uc3QgdWludDhfdCAqZGF0YSA9CisgICAgICAgIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpOworCisgICAgc2l6ZV90IHNpemUgPSBidWZmZXItPnJhbmdlX2xlbmd0aCgpOworCisgICAgaWYgKHNpemUgPCA3IHx8IGRhdGFbMF0gIT0gdHlwZSB8fCBtZW1jbXAoJmRhdGFbMV0sICJ2b3JiaXMiLCA2KSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIG9nZ19idWZmZXIgYnVmOworICAgIGJ1Zi5kYXRhID0gKHVpbnQ4X3QgKilkYXRhOworICAgIGJ1Zi5zaXplID0gc2l6ZTsKKyAgICBidWYucmVmY291bnQgPSAxOworICAgIGJ1Zi5wdHIub3duZXIgPSBOVUxMOworCisgICAgb2dnX3JlZmVyZW5jZSByZWY7CisgICAgcmVmLmJ1ZmZlciA9ICZidWY7CisgICAgcmVmLmJlZ2luID0gMDsKKyAgICByZWYubGVuZ3RoID0gc2l6ZTsKKyAgICByZWYubmV4dCA9IE5VTEw7CisKKyAgICBvZ2dwYWNrX2J1ZmZlciBiaXRzOworICAgIG9nZ3BhY2tfcmVhZGluaXQoJmJpdHMsICZyZWYpOworCisgICAgaWYgKG9nZ3BhY2tfcmVhZCgmYml0cywgOCkgIT0gdHlwZSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDY7ICsraSkgeworICAgICAgICBvZ2dwYWNrX3JlYWQoJmJpdHMsIDgpOyAgLy8gc2tpcCAndm9yYmlzJworICAgIH0KKworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIDE6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgwICE9IF92b3JiaXNfdW5wYWNrX2luZm8oJm1WaSwgJmJpdHMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbU1ldGEuc2V0RGF0YShrS2V5Vm9yYmlzSW5mbywgMCwgZGF0YSwgc2l6ZSk7CisgICAgICAgICAgICBtTWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgbVZpLnJhdGUpOworICAgICAgICAgICAgbU1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbVZpLmNoYW5uZWxzKTsKKyAgICAgICAgICAgIG1NZXRhLnNldEludDMyKGtLZXlCaXRSYXRlLCBtVmkuYml0cmF0ZV9ub21pbmFsKTsKKworICAgICAgICAgICAgQUxPR1YoImxvd2VyLWJpdHJhdGUgPSAlbGQiLCBtVmkuYml0cmF0ZV9sb3dlcik7CisgICAgICAgICAgICBBTE9HVigidXBwZXItYml0cmF0ZSA9ICVsZCIsIG1WaS5iaXRyYXRlX3VwcGVyKTsKKyAgICAgICAgICAgIEFMT0dWKCJub21pbmFsLWJpdHJhdGUgPSAlbGQiLCBtVmkuYml0cmF0ZV9ub21pbmFsKTsKKyAgICAgICAgICAgIEFMT0dWKCJ3aW5kb3ctYml0cmF0ZSA9ICVsZCIsIG1WaS5iaXRyYXRlX3dpbmRvdyk7CisgICAgICAgICAgICBBTE9HVigiYmxvY2tzaXplczogJWQvJWQiLAorICAgICAgICAgICAgICAgICAgICB2b3JiaXNfaW5mb19ibG9ja3NpemUoJm1WaSwgMCksCisgICAgICAgICAgICAgICAgICAgIHZvcmJpc19pbmZvX2Jsb2Nrc2l6ZSgmbVZpLCAxKQorICAgICAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICBvZmY2NF90IHNpemU7CisgICAgICAgICAgICBpZiAobVNvdXJjZS0+Z2V0U2l6ZSgmc2l6ZSkgPT0gT0spIHsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCBicHMgPSBhcHByb3hCaXRyYXRlKCk7CisgICAgICAgICAgICAgICAgaWYgKGJwcyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1NZXRhLnNldEludDY0KGtLZXlEdXJhdGlvbiwgc2l6ZSAqIDgwMDAwMDBsbCAvIGJwcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIDM6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgwICE9IF92b3JiaXNfdW5wYWNrX2NvbW1lbnQoJm1WYywgJmJpdHMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcGFyc2VGaWxlTWV0YURhdGEoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSA1OgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoMCAhPSBfdm9yYmlzX3VucGFja19ib29rcygmbVZpLCAmYml0cykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtTWV0YS5zZXREYXRhKGtLZXlWb3JiaXNCb29rcywgMCwgZGF0YSwgc2l6ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKwordWludDY0X3QgTXlWb3JiaXNFeHRyYWN0b3I6OmFwcHJveEJpdHJhdGUoKSBjb25zdCB7CisgICAgaWYgKG1WaS5iaXRyYXRlX25vbWluYWwgIT0gMCkgeworICAgICAgICByZXR1cm4gbVZpLmJpdHJhdGVfbm9taW5hbDsKKyAgICB9CisKKyAgICByZXR1cm4gKG1WaS5iaXRyYXRlX2xvd2VyICsgbVZpLmJpdHJhdGVfdXBwZXIpIC8gMjsKK30KKworCit2b2lkIE15T2dnRXh0cmFjdG9yOjpwYXJzZUZpbGVNZXRhRGF0YSgpIHsKKyAgICBtRmlsZU1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9PR0cpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtVmMuY29tbWVudHM7ICsraSkgeworICAgICAgICBjb25zdCBjaGFyICpjb21tZW50ID0gbVZjLnVzZXJfY29tbWVudHNbaV07CisgICAgICAgIHNpemVfdCBjb21tZW50TGVuZ3RoID0gbVZjLmNvbW1lbnRfbGVuZ3Roc1tpXTsKKyAgICAgICAgcGFyc2VWb3JiaXNDb21tZW50KCZtRmlsZU1ldGEsIGNvbW1lbnQsIGNvbW1lbnRMZW5ndGgpOworICAgICAgICAvL0FMT0dJKCJjb21tZW50ICMlZDogJyVzJyIsIGkgKyAxLCBtVmMudXNlcl9jb21tZW50c1tpXSk7CisgICAgfQorfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK09nZ0V4dHJhY3Rvcjo6T2dnRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCisgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAorICAgICAgbUluaXRDaGVjayhOT19JTklUKSwKKyAgICAgIG1JbXBsKE5VTEwpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgICAgICBpZiAobUltcGwgIT0gTlVMTCkgeworICAgICAgICAgICAgZGVsZXRlIG1JbXBsOworICAgICAgICB9CisgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgIG1JbXBsID0gbmV3IE15Vm9yYmlzRXh0cmFjdG9yKG1EYXRhU291cmNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1JbXBsID0gbmV3IE15T3B1c0V4dHJhY3RvcihtRGF0YVNvdXJjZSk7CisgICAgICAgIH0KKyAgICAgICAgbUluaXRDaGVjayA9IG1JbXBsLT5zZWVrVG9PZmZzZXQoMCk7CisKKyAgICAgICAgaWYgKG1Jbml0Q2hlY2sgPT0gT0spIHsKKyAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBtSW1wbC0+aW5pdCgpOworICAgICAgICAgICAgaWYgKG1Jbml0Q2hlY2sgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworT2dnRXh0cmFjdG9yOjp+T2dnRXh0cmFjdG9yKCkgeworICAgIGRlbGV0ZSBtSW1wbDsKKyAgICBtSW1wbCA9IE5VTEw7Cit9CisKK3NpemVfdCBPZ2dFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgeworICAgIHJldHVybiBtSW5pdENoZWNrICE9IE9LID8gMCA6IDE7Cit9CisKK01lZGlhVHJhY2sgKk9nZ0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CisgICAgaWYgKGluZGV4ID49IDEpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIG5ldyBPZ2dTb3VyY2UodGhpcyk7Cit9CisKK3N0YXR1c190IE9nZ0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CisgICAgaWYgKGluZGV4ID49IDEpIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIG1JbXBsLT5nZXRGb3JtYXQobWV0YSk7Cit9CisKK3N0YXR1c190IE9nZ0V4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhKSB7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRGaWxlTWV0YURhdGEobWV0YSk7Cit9CisKK3N0YXRpYyBNZWRpYUV4dHJhY3RvciogQ3JlYXRlRXh0cmFjdG9yKAorICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorICAgICAgICB2b2lkICopIHsKKyAgICByZXR1cm4gbmV3IE9nZ0V4dHJhY3Rvcihzb3VyY2UpOworfQorCitzdGF0aWMgTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIFNuaWZmKAorICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorICAgICAgICBmbG9hdCAqY29uZmlkZW5jZSwKKyAgICAgICAgdm9pZCAqKiwKKyAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyAqKSB7CisgICAgY2hhciB0bXBbNF07CisgICAgaWYgKHNvdXJjZS0+cmVhZEF0KDAsIHRtcCwgNCkgPCA0IHx8IG1lbWNtcCh0bXAsICJPZ2dTIiwgNCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgKmNvbmZpZGVuY2UgPSAwLjJmOworCisgICAgcmV0dXJuIENyZWF0ZUV4dHJhY3RvcjsKK30KKworZXh0ZXJuICJDIiB7CisvLyBUaGlzIGlzIHRoZSBvbmx5IHN5bWJvbCB0aGF0IG5lZWRzIHRvIGJlIGV4cG9ydGVkCitfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpCitNZWRpYUV4dHJhY3Rvcjo6RXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKKyAgICByZXR1cm4geworICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RVhUUkFDVE9SREVGX1ZFUlNJT04sCisgICAgICAgIFVVSUQoIjhjYzVjZDA2LWY3NzItNDk1ZS04YTYyLWNiYTk2NDkzNzRlOSIpLAorICAgICAgICAxLCAvLyB2ZXJzaW9uCisgICAgICAgICJPZ2cgRXh0cmFjdG9yIiwKKyAgICAgICAgU25pZmYKKyAgICB9OworfQorCit9IC8vIGV4dGVybiAiQyIKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvb2dnL09nZ0V4dHJhY3Rvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvT2dnRXh0cmFjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZlMjk0NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvb2dnL09nZ0V4dHJhY3Rvci5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE9HR19FWFRSQUNUT1JfSF8KKworI2RlZmluZSBPR0dfRVhUUkFDVE9SX0hfCisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBTWVzc2FnZTsKK2NsYXNzIERhdGFTb3VyY2VCYXNlOworY2xhc3MgU3RyaW5nODsKKworc3RydWN0IE15T2dnRXh0cmFjdG9yOworc3RydWN0IE9nZ1NvdXJjZTsKKworc3RydWN0IE9nZ0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7CisgICAgZXhwbGljaXQgT2dnRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOworCisgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJPZ2dFeHRyYWN0b3IiOyB9CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5PZ2dFeHRyYWN0b3IoKTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgc3RydWN0IE9nZ1NvdXJjZTsKKworICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBzdGF0dXNfdCBtSW5pdENoZWNrOworCisgICAgTXlPZ2dFeHRyYWN0b3IgKm1JbXBsOworCisgICAgT2dnRXh0cmFjdG9yKGNvbnN0IE9nZ0V4dHJhY3RvciAmKTsKKyAgICBPZ2dFeHRyYWN0b3IgJm9wZXJhdG9yPShjb25zdCBPZ2dFeHRyYWN0b3IgJik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE9HR19FWFRSQUNUT1JfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvb2dnL2V4cG9ydHMubGRzIGIvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvZXhwb3J0cy5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEzMDllZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvb2dnL2V4cG9ydHMubGRzCkBAIC0wLDAgKzEgQEAKK3sgZ2xvYmFsOiBHRVRFWFRSQUNUT1JERUY7IGxvY2FsOiAqOyB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy93YXYvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvd2F2L0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY3OTMzZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvd2F2L0FuZHJvaWQuYnAKQEAgLTAsMCArMSw0MiBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworCisgICAgc3JjczogWyJXQVZFeHRyYWN0b3IuY3BwIl0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliZmlmbyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICBdLAorCisgICAgbmFtZTogImxpYndhdmV4dHJhY3RvciIsCisgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAiZXh0cmFjdG9ycyIsCisKKyAgICBjb21waWxlX211bHRpbGliOiAiZmlyc3QiLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAorICAgIF0sCisgICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBkaWFnOiB7CisgICAgICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIH0sCisgICAgfSwKKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2V4dHJhY3RvcnMvd2F2L01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmNvcHkgdG8gbWVkaWEvZXh0cmFjdG9ycy93YXYvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTk9USUNFIGIvbWVkaWEvZXh0cmFjdG9ycy93YXYvTk9USUNFCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTk9USUNFCmNvcHkgdG8gbWVkaWEvZXh0cmFjdG9ycy93YXYvTk9USUNFCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL3dhdi9XQVZFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy93YXYvV0FWRXh0cmFjdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWExYjAxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy93YXYvV0FWRXh0cmFjdG9yLmNwcApAQCAtMCwwICsxLDU5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiV0FWRXh0cmFjdG9yIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiV0FWRXh0cmFjdG9yLmgiCisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDxjdXRpbHMvYml0b3BzLmg+CisKKyNkZWZpbmUgQ0hBTk5FTF9NQVNLX1VTRV9DSEFOTkVMX09SREVSIDAKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitlbnVtIHsKKyAgICBXQVZFX0ZPUk1BVF9QQ00gICAgICAgID0gMHgwMDAxLAorICAgIFdBVkVfRk9STUFUX0lFRUVfRkxPQVQgPSAweDAwMDMsCisgICAgV0FWRV9GT1JNQVRfQUxBVyAgICAgICA9IDB4MDAwNiwKKyAgICBXQVZFX0ZPUk1BVF9NVUxBVyAgICAgID0gMHgwMDA3LAorICAgIFdBVkVfRk9STUFUX01TR1NNICAgICAgPSAweDAwMzEsCisgICAgV0FWRV9GT1JNQVRfRVhURU5TSUJMRSA9IDB4RkZGRQorfTsKKworc3RhdGljIGNvbnN0IGNoYXIqIFdBVkVFWFRfU1VCRk9STUFUID0gIlx4MDBceDAwXHgwMFx4MDBceDEwXHgwMFx4ODBceDAwXHgwMFx4QUFceDAwXHgzOFx4OUJceDcxIjsKK3N0YXRpYyBjb25zdCBjaGFyKiBBTUJJU09OSUNfU1VCRk9STUFUID0gIlx4MDBceDAwXHgyMVx4MDdceEQzXHgxMVx4ODZceDQ0XHhDOFx4QzFceENBXHgwMFx4MDBceDAwIjsKKworc3RhdGljIHVpbnQzMl90IFUzMl9MRV9BVChjb25zdCB1aW50OF90ICpwdHIpIHsKKyAgICByZXR1cm4gcHRyWzNdIDw8IDI0IHwgcHRyWzJdIDw8IDE2IHwgcHRyWzFdIDw8IDggfCBwdHJbMF07Cit9CisKK3N0YXRpYyB1aW50MTZfdCBVMTZfTEVfQVQoY29uc3QgdWludDhfdCAqcHRyKSB7CisgICAgcmV0dXJuIHB0clsxXSA8PCA4IHwgcHRyWzBdOworfQorCitzdHJ1Y3QgV0FWU291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworICAgIFdBVlNvdXJjZSgKKyAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlLAorICAgICAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorICAgICAgICAgICAgdWludDE2X3Qgd2F2ZUZvcm1hdCwKKyAgICAgICAgICAgIGludDMyX3QgYml0c1BlclNhbXBsZSwKKyAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zID0gTlVMTCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKworICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0Tm9uYmxvY2tpbmdSZWFkKCkgeyByZXR1cm4gdHJ1ZTsgfQorCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+V0FWU291cmNlKCk7CisKK3ByaXZhdGU6CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4RnJhbWVTaXplOworCisgICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIE1ldGFEYXRhQmFzZSAmbU1ldGE7CisgICAgdWludDE2X3QgbVdhdmVGb3JtYXQ7CisgICAgaW50MzJfdCBtU2FtcGxlUmF0ZTsKKyAgICBpbnQzMl90IG1OdW1DaGFubmVsczsKKyAgICBpbnQzMl90IG1CaXRzUGVyU2FtcGxlOworICAgIG9mZjY0X3QgbU9mZnNldDsKKyAgICBzaXplX3QgbVNpemU7CisgICAgYm9vbCBtU3RhcnRlZDsKKyAgICBNZWRpYUJ1ZmZlckdyb3VwICptR3JvdXA7CisgICAgb2ZmNjRfdCBtQ3VycmVudFBvczsKKworICAgIFdBVlNvdXJjZShjb25zdCBXQVZTb3VyY2UgJik7CisgICAgV0FWU291cmNlICZvcGVyYXRvcj0oY29uc3QgV0FWU291cmNlICYpOworfTsKKworV0FWRXh0cmFjdG9yOjpXQVZFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkKKyAgICA6IG1EYXRhU291cmNlKHNvdXJjZSksCisgICAgICBtVmFsaWRGb3JtYXQoZmFsc2UpLAorICAgICAgbUNoYW5uZWxNYXNrKENIQU5ORUxfTUFTS19VU0VfQ0hBTk5FTF9PUkRFUikgeworICAgIG1Jbml0Q2hlY2sgPSBpbml0KCk7Cit9CisKK1dBVkV4dHJhY3Rvcjo6fldBVkV4dHJhY3RvcigpIHsKK30KKworc3RhdHVzX3QgV0FWRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpIHsKKyAgICBtZXRhLmNsZWFyKCk7CisgICAgaWYgKG1Jbml0Q2hlY2sgPT0gT0spIHsKKyAgICAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX1dBVik7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzaXplX3QgV0FWRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpIHsKKyAgICByZXR1cm4gbUluaXRDaGVjayA9PSBPSyA/IDEgOiAwOworfQorCitNZWRpYVRyYWNrICpXQVZFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ID4gMCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3IFdBVlNvdXJjZSgKKyAgICAgICAgICAgIG1EYXRhU291cmNlLCBtVHJhY2tNZXRhLAorICAgICAgICAgICAgbVdhdmVGb3JtYXQsIG1CaXRzUGVyU2FtcGxlLCBtRGF0YU9mZnNldCwgbURhdGFTaXplKTsKK30KKworc3RhdHVzX3QgV0FWRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAorICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCA+IDApIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgbWV0YSA9IG1UcmFja01ldGE7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBXQVZFeHRyYWN0b3I6OmluaXQoKSB7CisgICAgdWludDhfdCBoZWFkZXJbMTJdOworICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgICAgIDAsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpIDwgKHNzaXplX3Qpc2l6ZW9mKGhlYWRlcikpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgaWYgKG1lbWNtcChoZWFkZXIsICJSSUZGIiwgNCkgfHwgbWVtY21wKCZoZWFkZXJbOF0sICJXQVZFIiwgNCkpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgc2l6ZV90IHRvdGFsU2l6ZSA9IFUzMl9MRV9BVCgmaGVhZGVyWzRdKTsKKworICAgIG9mZjY0X3Qgb2Zmc2V0ID0gMTI7CisgICAgc2l6ZV90IHJlbWFpbmluZ1NpemUgPSB0b3RhbFNpemU7CisgICAgd2hpbGUgKHJlbWFpbmluZ1NpemUgPj0gOCkgeworICAgICAgICB1aW50OF90IGNodW5rSGVhZGVyWzhdOworICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIGNodW5rSGVhZGVyLCA4KSA8IDgpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICB9CisKKyAgICAgICAgcmVtYWluaW5nU2l6ZSAtPSA4OworICAgICAgICBvZmZzZXQgKz0gODsKKworICAgICAgICB1aW50MzJfdCBjaHVua1NpemUgPSBVMzJfTEVfQVQoJmNodW5rSGVhZGVyWzRdKTsKKworICAgICAgICBpZiAoY2h1bmtTaXplID4gcmVtYWluaW5nU2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1lbWNtcChjaHVua0hlYWRlciwgImZtdCAiLCA0KSkgeworICAgICAgICAgICAgaWYgKGNodW5rU2l6ZSA8IDE2KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQ4X3QgZm9ybWF0U3BlY1s0MF07CisgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIGZvcm1hdFNwZWMsIDIpIDwgMikgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtV2F2ZUZvcm1hdCA9IFUxNl9MRV9BVChmb3JtYXRTcGVjKTsKKyAgICAgICAgICAgIGlmIChtV2F2ZUZvcm1hdCAhPSBXQVZFX0ZPUk1BVF9QQ00KKyAgICAgICAgICAgICAgICAgICAgJiYgbVdhdmVGb3JtYXQgIT0gV0FWRV9GT1JNQVRfSUVFRV9GTE9BVAorICAgICAgICAgICAgICAgICAgICAmJiBtV2F2ZUZvcm1hdCAhPSBXQVZFX0ZPUk1BVF9BTEFXCisgICAgICAgICAgICAgICAgICAgICYmIG1XYXZlRm9ybWF0ICE9IFdBVkVfRk9STUFUX01VTEFXCisgICAgICAgICAgICAgICAgICAgICYmIG1XYXZlRm9ybWF0ICE9IFdBVkVfRk9STUFUX01TR1NNCisgICAgICAgICAgICAgICAgICAgICYmIG1XYXZlRm9ybWF0ICE9IFdBVkVfRk9STUFUX0VYVEVOU0lCTEUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQ4X3QgZm10U2l6ZSA9IDE2OworICAgICAgICAgICAgaWYgKG1XYXZlRm9ybWF0ID09IFdBVkVfRk9STUFUX0VYVEVOU0lCTEUpIHsKKyAgICAgICAgICAgICAgICBmbXRTaXplID0gNDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIGZvcm1hdFNwZWMsIGZtdFNpemUpIDwgZm10U2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtTnVtQ2hhbm5lbHMgPSBVMTZfTEVfQVQoJmZvcm1hdFNwZWNbMl0pOworCisgICAgICAgICAgICBpZiAobU51bUNoYW5uZWxzIDwgMSB8fCBtTnVtQ2hhbm5lbHMgPiA4KSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIG51bWJlciBvZiBjaGFubmVscyAoJWQpIiwgbU51bUNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtV2F2ZUZvcm1hdCAhPSBXQVZFX0ZPUk1BVF9FWFRFTlNJQkxFKSB7CisgICAgICAgICAgICAgICAgaWYgKG1OdW1DaGFubmVscyAhPSAxICYmIG1OdW1DaGFubmVscyAhPSAyKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJNb3JlIHRoYW4gMiBjaGFubmVscyAoJWQpIGluIG5vbi1XQVZFX0VYVCwgdW5rbm93biBjaGFubmVsIG1hc2siLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1DaGFubmVscyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtU2FtcGxlUmF0ZSA9IFUzMl9MRV9BVCgmZm9ybWF0U3BlY1s0XSk7CisKKyAgICAgICAgICAgIGlmIChtU2FtcGxlUmF0ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUJpdHNQZXJTYW1wbGUgPSBVMTZfTEVfQVQoJmZvcm1hdFNwZWNbMTRdKTsKKworICAgICAgICAgICAgaWYgKG1XYXZlRm9ybWF0ID09IFdBVkVfRk9STUFUX0VYVEVOU0lCTEUpIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCB2YWxpZEJpdHNQZXJTYW1wbGUgPSBVMTZfTEVfQVQoJmZvcm1hdFNwZWNbMThdKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsaWRCaXRzUGVyU2FtcGxlICE9IG1CaXRzUGVyU2FtcGxlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZEJpdHNQZXJTYW1wbGUgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoInZhbGlkQml0cyglZCkgIT0gYml0c1BlclNhbXBsZSglZCkgYXJlIG5vdCBzdXBwb3J0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZEJpdHNQZXJTYW1wbGUsIG1CaXRzUGVyU2FtcGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgc3VwcG9ydCB2YWxpdEJpdHNQZXJTYW1wbGUgPT0gYml0c1BlclNhbXBsZSBidXQgc29tZSBXQVZfRVhUCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZXJzIGRvbid0IGNvcnJlY3RseSBzZXQgdGhlIHZhbGlkIGJpdHMgdmFsdWUsIGFuZCBsZWF2ZSBpdCBhdCAwLgorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIldBVkVfRVhUIGhhcyAwIHZhbGlkIGJpdHMgcGVyIHNhbXBsZSwgaWdub3JpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1DaGFubmVsTWFzayA9IFUzMl9MRV9BVCgmZm9ybWF0U3BlY1syMF0pOworICAgICAgICAgICAgICAgIEFMT0dWKCJudW1DaGFubmVscz0lZCBjaGFubmVsTWFzaz0weCV4IiwgbU51bUNoYW5uZWxzLCBtQ2hhbm5lbE1hc2spOworICAgICAgICAgICAgICAgIGlmICgobUNoYW5uZWxNYXNrID4+IDE4KSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJpbnZhbGlkIGNoYW5uZWwgbWFzayAweCV4IiwgbUNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKG1DaGFubmVsTWFzayAhPSBDSEFOTkVMX01BU0tfVVNFX0NIQU5ORUxfT1JERVIpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAocG9wY291bnQobUNoYW5uZWxNYXNrKSAhPSBtTnVtQ2hhbm5lbHMpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJpbnZhbGlkIG51bWJlciBvZiBjaGFubmVscyAoJWQpIGluIGNoYW5uZWwgbWFzayAoMHgleCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcGNvdW50KG1DaGFubmVsTWFzayksIG1DaGFubmVsTWFzayk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gSW4gYSBXQVZFX0VYVCBoZWFkZXIsIHRoZSBmaXJzdCB0d28gYnl0ZXMgb2YgdGhlIEdVSUQgc3RvcmVkIGF0IGJ5dGUgMjQgY29udGFpbgorICAgICAgICAgICAgICAgIC8vIHRoZSBzYW1wbGUgZm9ybWF0LCB1c2luZyB0aGUgc2FtZSBkZWZpbml0aW9ucyBhcyBhIHJlZ3VsYXIgV0FWIGhlYWRlcgorICAgICAgICAgICAgICAgIG1XYXZlRm9ybWF0ID0gVTE2X0xFX0FUKCZmb3JtYXRTcGVjWzI0XSk7CisgICAgICAgICAgICAgICAgaWYgKG1lbWNtcCgmZm9ybWF0U3BlY1syNl0sIFdBVkVFWFRfU1VCRk9STUFULCAxNCkgJiYKKyAgICAgICAgICAgICAgICAgICAgbWVtY21wKCZmb3JtYXRTcGVjWzI2XSwgQU1CSVNPTklDX1NVQkZPUk1BVCwgMTQpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJ1bnN1cHBvcnRlZCBHVUlEIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtV2F2ZUZvcm1hdCA9PSBXQVZFX0ZPUk1BVF9QQ00pIHsKKyAgICAgICAgICAgICAgICBpZiAobUJpdHNQZXJTYW1wbGUgIT0gOCAmJiBtQml0c1BlclNhbXBsZSAhPSAxNgorICAgICAgICAgICAgICAgICAgICAmJiBtQml0c1BlclNhbXBsZSAhPSAyNCAmJiBtQml0c1BlclNhbXBsZSAhPSAzMikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChtV2F2ZUZvcm1hdCA9PSBXQVZFX0ZPUk1BVF9JRUVFX0ZMT0FUKSB7CisgICAgICAgICAgICAgICAgaWYgKG1CaXRzUGVyU2FtcGxlICE9IDMyKSB7ICAvLyBUT0RPIHdlIGRvbid0IHN1cHBvcnQgZG91YmxlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChtV2F2ZUZvcm1hdCA9PSBXQVZFX0ZPUk1BVF9NU0dTTSkgeworICAgICAgICAgICAgICAgIGlmIChtQml0c1BlclNhbXBsZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1XYXZlRm9ybWF0ID09IFdBVkVfRk9STUFUX01VTEFXIHx8IG1XYXZlRm9ybWF0ID09IFdBVkVfRk9STUFUX0FMQVcpIHsKKyAgICAgICAgICAgICAgICBpZiAobUJpdHNQZXJTYW1wbGUgIT0gOCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1WYWxpZEZvcm1hdCA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoIW1lbWNtcChjaHVua0hlYWRlciwgImRhdGEiLCA0KSkgeworICAgICAgICAgICAgaWYgKG1WYWxpZEZvcm1hdCkgeworICAgICAgICAgICAgICAgIG1EYXRhT2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICAgICAgICAgIG1EYXRhU2l6ZSA9IGNodW5rU2l6ZTsKKworICAgICAgICAgICAgICAgIG1UcmFja01ldGEuY2xlYXIoKTsKKworICAgICAgICAgICAgICAgIHN3aXRjaCAobVdhdmVGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBXQVZFX0ZPUk1BVF9QQ006CisgICAgICAgICAgICAgICAgICAgIGNhc2UgV0FWRV9GT1JNQVRfSUVFRV9GTE9BVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFja01ldGEuc2V0Q1N0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgV0FWRV9GT1JNQVRfQUxBVzoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFja01ldGEuc2V0Q1N0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVcpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgV0FWRV9GT1JNQVRfTVNHU006CisgICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLnNldENTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVNHU00pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtV2F2ZUZvcm1hdCwgKHVpbnQxNl90KVdBVkVfRk9STUFUX01VTEFXKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFja01ldGEuc2V0Q1N0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX01MQVcpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbVRyYWNrTWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBtTnVtQ2hhbm5lbHMpOworICAgICAgICAgICAgICAgIG1UcmFja01ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxNYXNrLCBtQ2hhbm5lbE1hc2spOworICAgICAgICAgICAgICAgIG1UcmFja01ldGEuc2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIG1TYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLnNldEludDMyKGtLZXlQY21FbmNvZGluZywga0F1ZGlvRW5jb2RpbmdQY20xNmJpdCk7CisKKyAgICAgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPSAwOworICAgICAgICAgICAgICAgIGlmIChtV2F2ZUZvcm1hdCA9PSBXQVZFX0ZPUk1BVF9NU0dTTSkgeworICAgICAgICAgICAgICAgICAgICAvLyA2NSBieXRlcyBkZWNvZGUgdG8gMzIwIDhrSHogc2FtcGxlcworICAgICAgICAgICAgICAgICAgICBkdXJhdGlvblVzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMDBMTCAqIChtRGF0YVNpemUgLyA2NSAqIDMyMCkgLyA4MDAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBieXRlc1BlclNhbXBsZSA9IG1CaXRzUGVyU2FtcGxlID4+IDM7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFieXRlc1BlclNhbXBsZSB8fCAhbU51bUNoYW5uZWxzKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKworICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtX3NhbXBsZXMgPSBtRGF0YVNpemUgLyAobU51bUNoYW5uZWxzICogYnl0ZXNQZXJTYW1wbGUpOworCisgICAgICAgICAgICAgICAgICAgIGlmICghbVNhbXBsZVJhdGUpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworCisgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uVXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMExMICogbnVtX3NhbXBsZXMgLyBtU2FtcGxlUmF0ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb25Vcyk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBvZmZzZXQgKz0gY2h1bmtTaXplOworICAgIH0KKworICAgIHJldHVybiBOT19JTklUOworfQorCitjb25zdCBzaXplX3QgV0FWU291cmNlOjprTWF4RnJhbWVTaXplID0gMzI3Njg7CisKK1dBVlNvdXJjZTo6V0FWU291cmNlKAorICAgICAgICBEYXRhU291cmNlQmFzZSAqZGF0YVNvdXJjZSwKKyAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorICAgICAgICB1aW50MTZfdCB3YXZlRm9ybWF0LAorICAgICAgICBpbnQzMl90IGJpdHNQZXJTYW1wbGUsCisgICAgICAgIG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKKyAgICA6IG1EYXRhU291cmNlKGRhdGFTb3VyY2UpLAorICAgICAgbU1ldGEobWV0YSksCisgICAgICBtV2F2ZUZvcm1hdCh3YXZlRm9ybWF0KSwKKyAgICAgIG1TYW1wbGVSYXRlKDApLAorICAgICAgbU51bUNoYW5uZWxzKDApLAorICAgICAgbUJpdHNQZXJTYW1wbGUoYml0c1BlclNhbXBsZSksCisgICAgICBtT2Zmc2V0KG9mZnNldCksCisgICAgICBtU2l6ZShzaXplKSwKKyAgICAgIG1TdGFydGVkKGZhbHNlKSwKKyAgICAgIG1Hcm91cChOVUxMKSB7CisgICAgQ0hFQ0sobU1ldGEuZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmbVNhbXBsZVJhdGUpKTsKKyAgICBDSEVDSyhtTWV0YS5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm1OdW1DaGFubmVscykpOworCisgICAgbU1ldGEuc2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwga01heEZyYW1lU2l6ZSk7Cit9CisKK1dBVlNvdXJjZTo6fldBVlNvdXJjZSgpIHsKKyAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgc3RvcCgpOworICAgIH0KK30KKworc3RhdHVzX3QgV0FWU291cmNlOjpzdGFydChNZXRhRGF0YUJhc2UgKiAvKiBwYXJhbXMgKi8pIHsKKyAgICBBTE9HVigiV0FWU291cmNlOjpzdGFydCIpOworCisgICAgQ0hFQ0soIW1TdGFydGVkKTsKKworICAgIC8vIHNvbWUgV0FWIGZpbGVzIG1heSBoYXZlIGxhcmdlIGF1ZGlvIGJ1ZmZlcnMgdGhhdCB1c2Ugc2hhcmVkIG1lbW9yeSB0cmFuc2Zlci4KKyAgICBtR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cCg0IC8qIGJ1ZmZlcnMgKi8sIGtNYXhGcmFtZVNpemUpOworCisgICAgaWYgKG1CaXRzUGVyU2FtcGxlID09IDgpIHsKKyAgICAgICAgLy8gQXMgYSB0ZW1wb3JhcnkgYnVmZmVyIGZvciA4LT4xNiBiaXQgY29udmVyc2lvbi4KKyAgICAgICAgbUdyb3VwLT5hZGRfYnVmZmVyKE1lZGlhQnVmZmVyQmFzZTo6Q3JlYXRlKGtNYXhGcmFtZVNpemUpKTsKKyAgICB9CisKKyAgICBtQ3VycmVudFBvcyA9IG1PZmZzZXQ7CisKKyAgICBtU3RhcnRlZCA9IHRydWU7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFdBVlNvdXJjZTo6c3RvcCgpIHsKKyAgICBBTE9HVigiV0FWU291cmNlOjpzdG9wIik7CisKKyAgICBDSEVDSyhtU3RhcnRlZCk7CisKKyAgICBkZWxldGUgbUdyb3VwOworICAgIG1Hcm91cCA9IE5VTEw7CisKKyAgICBtU3RhcnRlZCA9IGZhbHNlOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBXQVZTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKKyAgICBBTE9HVigiV0FWU291cmNlOjpnZXRGb3JtYXQiKTsKKworICAgIG1ldGEgPSBtTWV0YTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFdBVlNvdXJjZTo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworICAgICpvdXQgPSBOVUxMOworCisgICAgaWYgKG9wdGlvbnMgIT0gbnVsbHB0ciAmJiBvcHRpb25zLT5nZXROb25CbG9ja2luZygpICYmICFtR3JvdXAtPmhhc19idWZmZXJzKCkpIHsKKyAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOworICAgIH0KKworICAgIGludDY0X3Qgc2Vla1RpbWVVczsKKyAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKKyAgICBpZiAob3B0aW9ucyAhPSBOVUxMICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7CisgICAgICAgIGludDY0X3QgcG9zID0gMDsKKworICAgICAgICBpZiAobVdhdmVGb3JtYXQgPT0gV0FWRV9GT1JNQVRfTVNHU00pIHsKKyAgICAgICAgICAgIC8vIDY1IGJ5dGVzIGRlY29kZSB0byAzMjAgOGtIeiBzYW1wbGVzCisgICAgICAgICAgICBpbnQ2NF90IHNhbXBsZW51bWJlciA9IChzZWVrVGltZVVzICogbVNhbXBsZVJhdGUpIC8gMTAwMDAwMDsKKyAgICAgICAgICAgIGludDY0X3QgZnJhbWVudW1iZXIgPSBzYW1wbGVudW1iZXIgLyAzMjA7CisgICAgICAgICAgICBwb3MgPSBmcmFtZW51bWJlciAqIDY1OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcG9zID0gKHNlZWtUaW1lVXMgKiBtU2FtcGxlUmF0ZSkgLyAxMDAwMDAwICogbU51bUNoYW5uZWxzICogKG1CaXRzUGVyU2FtcGxlID4+IDMpOworICAgICAgICB9CisgICAgICAgIGlmIChwb3MgPiAob2ZmNjRfdCltU2l6ZSkgeworICAgICAgICAgICAgcG9zID0gbVNpemU7CisgICAgICAgIH0KKyAgICAgICAgbUN1cnJlbnRQb3MgPSBwb3MgKyBtT2Zmc2V0OworICAgIH0KKworICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyOworICAgIHN0YXR1c190IGVyciA9IG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJmJ1ZmZlcik7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIC8vIG1ha2Ugc3VyZSB0aGF0IG1heEJ5dGVzVG9SZWFkIGlzIG11bHRpcGxlIG9mIDMsIGluIDI0LWJpdCBjYXNlCisgICAgc2l6ZV90IG1heEJ5dGVzVG9SZWFkID0KKyAgICAgICAgbUJpdHNQZXJTYW1wbGUgPT0gOCA/IGtNYXhGcmFtZVNpemUgLyAyIDogCisgICAgICAgIChtQml0c1BlclNhbXBsZSA9PSAyNCA/IDMqKGtNYXhGcmFtZVNpemUvMyk6IGtNYXhGcmFtZVNpemUpOworCisgICAgc2l6ZV90IG1heEJ5dGVzQXZhaWxhYmxlID0KKyAgICAgICAgKG1DdXJyZW50UG9zIC0gbU9mZnNldCA+PSAob2ZmNjRfdCltU2l6ZSkKKyAgICAgICAgICAgID8gMCA6IG1TaXplIC0gKG1DdXJyZW50UG9zIC0gbU9mZnNldCk7CisKKyAgICBpZiAobWF4Qnl0ZXNUb1JlYWQgPiBtYXhCeXRlc0F2YWlsYWJsZSkgeworICAgICAgICBtYXhCeXRlc1RvUmVhZCA9IG1heEJ5dGVzQXZhaWxhYmxlOworICAgIH0KKworICAgIGlmIChtV2F2ZUZvcm1hdCA9PSBXQVZFX0ZPUk1BVF9NU0dTTSkgeworICAgICAgICAvLyBNaWNyb3NvZnQgcGFja3MgMiBmcmFtZXMgaW50byA2NSBieXRlcywgcmF0aGVyIHRoYW4gdXNpbmcgc2VwYXJhdGUgMzMtYnl0ZSBmcmFtZXMsCisgICAgICAgIC8vIHNvIHJlYWQgbXVsdGlwbGVzIG9mIDY1LCBhbmQgdXNlIHNtYWxsZXIgYnVmZmVycyB0byBhY2NvdW50IGZvciB+MTA6MSBleHBhbnNpb24gcmF0aW8KKyAgICAgICAgaWYgKG1heEJ5dGVzVG9SZWFkID4gMTAyNCkgeworICAgICAgICAgICAgbWF4Qnl0ZXNUb1JlYWQgPSAxMDI0OworICAgICAgICB9CisgICAgICAgIG1heEJ5dGVzVG9SZWFkID0gKG1heEJ5dGVzVG9SZWFkIC8gNjUpICogNjU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gcmVhZCBvbmx5IGludGVncmFsIGFtb3VudHMgb2YgYXVkaW8gdW5pdCBmcmFtZXMuCisgICAgICAgIGNvbnN0IHNpemVfdCBpbnB1dFVuaXRGcmFtZVNpemUgPSBtTnVtQ2hhbm5lbHMgKiBtQml0c1BlclNhbXBsZSAvIDg7CisgICAgICAgIG1heEJ5dGVzVG9SZWFkIC09IG1heEJ5dGVzVG9SZWFkICUgaW5wdXRVbml0RnJhbWVTaXplOworICAgIH0KKworICAgIHNzaXplX3QgbiA9IG1EYXRhU291cmNlLT5yZWFkQXQoCisgICAgICAgICAgICBtQ3VycmVudFBvcywgYnVmZmVyLT5kYXRhKCksCisgICAgICAgICAgICBtYXhCeXRlc1RvUmVhZCk7CisKKyAgICBpZiAobiA8PSAwKSB7CisgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICBidWZmZXIgPSBOVUxMOworCisgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgIH0KKworICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIG4pOworCisgICAgLy8gVE9ETzogYWRkIGNhcGFiaWxpdHkgdG8gcmV0dXJuIGRhdGEgYXMgZmxvYXQgUENNIGluc3RlYWQgb2YgMTYgYml0IFBDTS4KKyAgICBpZiAobVdhdmVGb3JtYXQgPT0gV0FWRV9GT1JNQVRfUENNKSB7CisgICAgICAgIGlmIChtQml0c1BlclNhbXBsZSA9PSA4KSB7CisgICAgICAgICAgICAvLyBDb252ZXJ0IDgtYml0IHVuc2lnbmVkIHNhbXBsZXMgdG8gMTYtYml0IHNpZ25lZC4KKworICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyBidWZmZXIgd2l0aCAyIGJ5dGUgd2lkZSBzYW1wbGVzCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKnRtcDsKKyAgICAgICAgICAgIENIRUNLX0VRKG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJnRtcCksIChzdGF0dXNfdClPSyk7CisgICAgICAgICAgICB0bXAtPnNldF9yYW5nZSgwLCAyICogbik7CisKKyAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV91OCgoaW50MTZfdCAqKXRtcC0+ZGF0YSgpLCAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpLCBuKTsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgYnVmZmVyID0gdG1wOworICAgICAgICB9IGVsc2UgaWYgKG1CaXRzUGVyU2FtcGxlID09IDI0KSB7CisgICAgICAgICAgICAvLyBDb252ZXJ0IDI0LWJpdCBzaWduZWQgc2FtcGxlcyB0byAxNi1iaXQgc2lnbmVkIGluIHBsYWNlCisgICAgICAgICAgICBjb25zdCBzaXplX3QgbnVtU2FtcGxlcyA9IG4gLyAzOworCisgICAgICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fcDI0KChpbnQxNl90ICopYnVmZmVyLT5kYXRhKCksIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCksIG51bVNhbXBsZXMpOworICAgICAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgMiAqIG51bVNhbXBsZXMpOworICAgICAgICB9ICBlbHNlIGlmIChtQml0c1BlclNhbXBsZSA9PSAzMikgeworICAgICAgICAgICAgLy8gQ29udmVydCAzMi1iaXQgc2lnbmVkIHNhbXBsZXMgdG8gMTYtYml0IHNpZ25lZCBpbiBwbGFjZQorICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG51bVNhbXBsZXMgPSBuIC8gNDsKKworICAgICAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX2kzMigoaW50MTZfdCAqKWJ1ZmZlci0+ZGF0YSgpLCAoY29uc3QgaW50MzJfdCAqKWJ1ZmZlci0+ZGF0YSgpLCBudW1TYW1wbGVzKTsKKyAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIDIgKiBudW1TYW1wbGVzKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobVdhdmVGb3JtYXQgPT0gV0FWRV9GT1JNQVRfSUVFRV9GTE9BVCkgeworICAgICAgICBpZiAobUJpdHNQZXJTYW1wbGUgPT0gMzIpIHsKKyAgICAgICAgICAgIC8vIENvbnZlcnQgMzItYml0IGZsb2F0IHNhbXBsZXMgdG8gMTYtYml0IHNpZ25lZCBpbiBwbGFjZQorICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG51bVNhbXBsZXMgPSBuIC8gNDsKKworICAgICAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX2Zsb2F0KChpbnQxNl90ICopYnVmZmVyLT5kYXRhKCksIChjb25zdCBmbG9hdCAqKWJ1ZmZlci0+ZGF0YSgpLCBudW1TYW1wbGVzKTsKKyAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIDIgKiBudW1TYW1wbGVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGludDY0X3QgdGltZVN0YW1wVXMgPSAwOworCisgICAgaWYgKG1XYXZlRm9ybWF0ID09IFdBVkVfRk9STUFUX01TR1NNKSB7CisgICAgICAgIHRpbWVTdGFtcFVzID0gMTAwMDAwMExMICogKG1DdXJyZW50UG9zIC0gbU9mZnNldCkgKiAzMjAgLyA2NSAvIG1TYW1wbGVSYXRlOworICAgIH0gZWxzZSB7CisgICAgICAgIHNpemVfdCBieXRlc1BlclNhbXBsZSA9IG1CaXRzUGVyU2FtcGxlID4+IDM7CisgICAgICAgIHRpbWVTdGFtcFVzID0gMTAwMDAwMExMICogKG1DdXJyZW50UG9zIC0gbU9mZnNldCkKKyAgICAgICAgICAgICAgICAvIChtTnVtQ2hhbm5lbHMgKiBieXRlc1BlclNhbXBsZSkgLyBtU2FtcGxlUmF0ZTsKKyAgICB9CisKKyAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCB0aW1lU3RhbXBVcyk7CisKKyAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CisgICAgbUN1cnJlbnRQb3MgKz0gbjsKKworICAgICpvdXQgPSBidWZmZXI7CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyBNZWRpYUV4dHJhY3RvciogQ3JlYXRlRXh0cmFjdG9yKAorICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorICAgICAgICB2b2lkICopIHsKKyAgICByZXR1cm4gbmV3IFdBVkV4dHJhY3Rvcihzb3VyY2UpOworfQorCitzdGF0aWMgTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIFNuaWZmKAorICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorICAgICAgICBmbG9hdCAqY29uZmlkZW5jZSwKKyAgICAgICAgdm9pZCAqKiwKKyAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyAqKSB7CisgICAgY2hhciBoZWFkZXJbMTJdOworICAgIGlmIChzb3VyY2UtPnJlYWRBdCgwLCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKSA8IChzc2l6ZV90KXNpemVvZihoZWFkZXIpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChtZW1jbXAoaGVhZGVyLCAiUklGRiIsIDQpIHx8IG1lbWNtcCgmaGVhZGVyWzhdLCAiV0FWRSIsIDQpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIE1lZGlhRXh0cmFjdG9yICpleHRyYWN0b3IgPSBuZXcgV0FWRXh0cmFjdG9yKHNvdXJjZSk7CisgICAgaW50IG51bVRyYWNrcyA9IGV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKKyAgICBkZWxldGUgZXh0cmFjdG9yOworICAgIGlmIChudW1UcmFja3MgPT0gMCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAqY29uZmlkZW5jZSA9IDAuM2Y7CisKKyAgICByZXR1cm4gQ3JlYXRlRXh0cmFjdG9yOworfQorCitleHRlcm4gIkMiIHsKKy8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKK19fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKK01lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgeworICAgIHJldHVybiB7CisgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTiwKKyAgICAgICAgVVVJRCgiN2Q2MTM4NTgtNTgzNy00YTM4LTg0YzUtMzMyZDFjZGRlZTI3IiksCisgICAgICAgIDEsIC8vIHZlcnNpb24KKyAgICAgICAgIldBViBFeHRyYWN0b3IiLAorICAgICAgICBTbmlmZgorICAgIH07Cit9CisKK30gLy8gZXh0ZXJuICJDIgorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL3dhdi9XQVZFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvd2F2L1dBVkV4dHJhY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2N2QwYjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL3dhdi9XQVZFeHRyYWN0b3IuaApAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBXQVZfRVhUUkFDVE9SX0hfCisKKyNkZWZpbmUgV0FWX0VYVFJBQ1RPUl9IXworCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQU1lc3NhZ2U7CitjbGFzcyBEYXRhU291cmNlQmFzZTsKK2NsYXNzIFN0cmluZzg7CisKK2NsYXNzIFdBVkV4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgV0FWRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOworCisgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJXQVZFeHRyYWN0b3IiOyB9CisKKyAgICB2aXJ0dWFsIH5XQVZFeHRyYWN0b3IoKTsKKworcHJpdmF0ZToKKyAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKKyAgICBib29sIG1WYWxpZEZvcm1hdDsKKyAgICB1aW50MTZfdCBtV2F2ZUZvcm1hdDsKKyAgICB1aW50MTZfdCBtTnVtQ2hhbm5lbHM7CisgICAgdWludDMyX3QgbUNoYW5uZWxNYXNrOworICAgIHVpbnQzMl90IG1TYW1wbGVSYXRlOworICAgIHVpbnQxNl90IG1CaXRzUGVyU2FtcGxlOworICAgIG9mZjY0X3QgbURhdGFPZmZzZXQ7CisgICAgc2l6ZV90IG1EYXRhU2l6ZTsKKyAgICBNZXRhRGF0YUJhc2UgbVRyYWNrTWV0YTsKKworICAgIHN0YXR1c190IGluaXQoKTsKKworICAgIFdBVkV4dHJhY3Rvcihjb25zdCBXQVZFeHRyYWN0b3IgJik7CisgICAgV0FWRXh0cmFjdG9yICZvcGVyYXRvcj0oY29uc3QgV0FWRXh0cmFjdG9yICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBXQVZfRVhUUkFDVE9SX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvd2F2L2V4cG9ydHMubGRzIGIvbWVkaWEvZXh0cmFjdG9ycy93YXYvZXhwb3J0cy5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEzMDllZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvd2F2L2V4cG9ydHMubGRzCkBAIC0wLDAgKzEgQEAKK3sgZ2xvYmFsOiBHRVRFWFRSQUNUT1JERUY7IGxvY2FsOiAqOyB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0RuZ1V0aWxzLmggYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvRG5nVXRpbHMuaAppbmRleCAxZDhkZjljLi5kZThmMTIwIDEwMDY0NAotLS0gYS9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvRG5nVXRpbHMuaAorKysgYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvRG5nVXRpbHMuaApAQCAtMzksMTEgKzM5LDE2IEBACiAgKi8KIGNsYXNzIEFORFJPSURfQVBJIE9wY29kZUxpc3RCdWlsZGVyIDogcHVibGljIExpZ2h0UmVmQmFzZTxPcGNvZGVMaXN0QnVpbGRlcj4gewogICAgIHB1YmxpYzoKKyAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBBZG9iZSBETkcgMS40IHNwZWMgZm9yIEJheWVyIHBoYXNlIChkZWZpbmVkIGZvciB0aGUKKyAgICAgICAgLy8gRml4QmFkUGl4ZWxzQ29uc3RhbnQgYW5kIEZpeEJhZFBpeGVsc0xpc3Qgb3Bjb2RlcykgaXMgaW5jb3JyZWN0LiBJdCdzCisgICAgICAgIC8vIGluY29uc2lzdGVudCB3aXRoIHRoZSBETkcgU0RLIChjZi4gZG5nX25lZ2F0aXZlOjpTZXRCYXllck1vc2FpYyBhbmQKKyAgICAgICAgLy8gZG5nX29wY29kZV9GaXhCYWRQaXhlbHNMaXN0OjpJc0dyZWVuKSwgYW5kIEFkb2JlIGNvbmZpcm1zIHRoYXQgdGhlCisgICAgICAgIC8vIHNwZWMgc2hvdWxkIGJlIHVwZGF0ZWQgdG8gbWF0Y2ggdGhlIFNESy4KICAgICAgICAgZW51bSBDZmFMYXlvdXQgewotICAgICAgICAgICAgQ0ZBX1JHR0IgPSAwLAotICAgICAgICAgICAgQ0ZBX0dSQkcsCi0gICAgICAgICAgICBDRkFfR0JSRywKKyAgICAgICAgICAgIENGQV9HUkJHID0gMCwKKyAgICAgICAgICAgIENGQV9SR0dCLAogICAgICAgICAgICAgQ0ZBX0JHR1IsCisgICAgICAgICAgICBDRkFfR0JSRywKICAgICAgICAgfTsKIAogICAgICAgICBPcGNvZGVMaXN0QnVpbGRlcigpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL3NyYy9EbmdVdGlscy5jcHAgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL0RuZ1V0aWxzLmNwcAppbmRleCA5ZGM1ZjA1Li45YWM3ZTJhIDEwMDY0NAotLS0gYS9tZWRpYS9pbWdfdXRpbHMvc3JjL0RuZ1V0aWxzLmNwcAorKysgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL0RuZ1V0aWxzLmNwcApAQCAtMTgsNiArMTgsNyBAQAogCiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KIAorI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDx2ZWN0b3I+CiAjaW5jbHVkZSA8bWF0aC5oPgogCkBAIC02MSw4ICs2Miw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogbGVuc1NoYWRpbmdNYXApIHsKICAgICB1aW50MzJfdCBhY3RpdmVBcmVhV2lkdGggPSBhY3RpdmVBcmVhUmlnaHQgLSBhY3RpdmVBcmVhTGVmdDsKICAgICB1aW50MzJfdCBhY3RpdmVBcmVhSGVpZ2h0ID0gYWN0aXZlQXJlYUJvdHRvbSAtIGFjdGl2ZUFyZWFUb3A7Ci0gICAgZG91YmxlIHNwYWNpbmdWID0gMS4wIC8gbHNtSGVpZ2h0OwotICAgIGRvdWJsZSBzcGFjaW5nSCA9IDEuMCAvIGxzbVdpZHRoOworICAgIGRvdWJsZSBzcGFjaW5nViA9IDEuMCAvIHN0ZDo6bWF4KDF1LCBsc21IZWlnaHQgLSAxKTsKKyAgICBkb3VibGUgc3BhY2luZ0ggPSAxLjAgLyBzdGQ6Om1heCgxdSwgbHNtV2lkdGggLSAxKTsKIAogICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiByZWRNYXBWZWN0b3IobHNtV2lkdGggKiBsc21IZWlnaHQpOwogICAgIGZsb2F0ICpyZWRNYXAgPSByZWRNYXBWZWN0b3IuZGF0YSgpOwpAQCAtMzAxLDI5ICszMDIsMTQgQEAKICAgICBub3JtYWxpemVkT0NYID0gQ0xBTVAobm9ybWFsaXplZE9DWCwgMCwgMSk7CiAgICAgbm9ybWFsaXplZE9DWSA9IENMQU1QKG5vcm1hbGl6ZWRPQ1ksIDAsIDEpOwogCi0gICAgLy8gQ29udmVyc2lvbiBmYWN0b3JzIGZyb20gQ2FtZXJhMiBLIGZhY3RvcnMgdG8gRE5HIHNwZWMuIEsgZmFjdG9yczoKLSAgICAvLwotICAgIC8vICAgICAgTm90ZTogdGhlc2UgYXJlIG5lY2Vzc2FyeSBiZWNhdXNlIG91ciB1bml0IHN5c3RlbSBhc3N1bWVzIGEKLSAgICAvLyAgICAgIG5vcm1hbGl6ZWQgbWF4IHJhZGl1cyBvZiBzcXJ0KDIpLCB3aGVyZWFzIHRoZSBETkcgc3BlYydzCi0gICAgLy8gICAgICBXYXJwUmVjdGlsaW5lYXIgb3Bjb2RlIGFzc3VtZXMgYSBub3JtYWxpemVkIG1heCByYWRpdXMgb2YgMS4KLSAgICAvLyAgICAgIFRodXMsIGVhY2ggSyBjb2VmZmljaWVudCBtdXN0IGluY2x1ZGUgdGhlIGRvbWFpbiBzY2FsaW5nCi0gICAgLy8gICAgICBmYWN0b3IgKHRoZSBETkcgZG9tYWluIGlzIHNjYWxlZCBieSBzcXJ0KDIpIHRvIGVtdWxhdGUgdGhlCi0gICAgLy8gICAgICBkb21haW4gdXNlZCBieSB0aGUgQ2FtZXJhMiBzcGVjaWZpY2F0aW9uKS4KLQotICAgIGNvbnN0IGRvdWJsZSBjXzAgPSBzcXJ0KDIpOwotICAgIGNvbnN0IGRvdWJsZSBjXzEgPSAyICogc3FydCgyKTsKLSAgICBjb25zdCBkb3VibGUgY18yID0gNCAqIHNxcnQoMik7Ci0gICAgY29uc3QgZG91YmxlIGNfMyA9IDggKiBzcXJ0KDIpOwotICAgIGNvbnN0IGRvdWJsZSBjXzQgPSAyOwotICAgIGNvbnN0IGRvdWJsZSBjXzUgPSAyOwotCi0gICAgY29uc3QgZG91YmxlIGNvZWZmc1tdID0geyBjXzAgKiBrQ29lZmZzWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY18xICoga0NvZWZmc1sxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfMiAqIGtDb2VmZnNbMl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjXzMgKiBrQ29lZmZzWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY180ICoga0NvZWZmc1s0XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfNSAqIGtDb2VmZnNbNV0gfTsKLQorICAgIGRvdWJsZSBjb2VmZnNbNl0gPSB7CisgICAgICAgIGtDb2VmZnNbMF0sCisgICAgICAgIGtDb2VmZnNbMV0sCisgICAgICAgIGtDb2VmZnNbMl0sCisgICAgICAgIGtDb2VmZnNbM10sCisgICAgICAgIGtDb2VmZnNbNF0sCisgICAgICAgIGtDb2VmZnNbNV0KKyAgICB9OwogCiAgICAgcmV0dXJuIGFkZFdhcnBSZWN0aWxpbmVhcigvKm51bVBsYW5lcyovMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3B0aWNhbENlbnRlclgqL25vcm1hbGl6ZWRPQ1gsCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvc3JjL1RpZmZXcml0ZXIuY3BwIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9UaWZmV3JpdGVyLmNwcAppbmRleCA1NjQ0NzRmLi4xNzExMjQyIDEwMDY0NAotLS0gYS9tZWRpYS9pbWdfdXRpbHMvc3JjL1RpZmZXcml0ZXIuY3BwCisrKyBiL21lZGlhL2ltZ191dGlscy9zcmMvVGlmZldyaXRlci5jcHAKQEAgLTM1MCw3ICszNTAsNyBAQAogICAgICAgICBpZiAobmV4dElmZCA9PSBOVUxMKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBpZmQgPSBuZXh0SWZkOworICAgICAgICBpZmQgPSBzdGQ6Om1vdmUobmV4dElmZCk7CiAgICAgfQogICAgIHJldHVybiBpZmQ7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vQW5kcm9pZC5icCBiL21lZGlhL2xpYmFhdWRpby9BbmRyb2lkLmJwCmluZGV4IDZlNjBmMjQuLmYwMGY3YTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmFhdWRpby9BbmRyb2lkLmJwCkBAIC0yOCwzICsyOCwxMCBAQAogICAgIGZpcnN0X3ZlcnNpb246ICIyNiIsCiAgICAgdW52ZXJzaW9uZWRfdW50aWw6ICJjdXJyZW50IiwKIH0KKworY2NfbGlicmFyeV9oZWFkZXJzIHsKKyAgICBuYW1lOiAibGliYWF1ZGlvX2hlYWRlcnMiLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorfQorCitzdWJkaXJzID0gWyIqIl0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9BbmRyb2lkLm1rIGIvbWVkaWEvbGliYWF1ZGlvL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNTNlN2QuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1pbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM5ZmFiMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNiBAQAorc3ViZGlycyA9IFsiKiJdCisKK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogImxpYmFhdWRpb19leGFtcGxlX3V0aWxzIiwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbInV0aWxzIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvQW5kcm9pZC5tayBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDUzZTdkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotaW5jbHVkZSAkKGNhbGwgYWxsLXN1YmRpci1tYWtlZmlsZXMpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3IvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGM1ODQzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3IvQW5kcm9pZC5icApAQCAtMCwwICsxLDE3IEBACitjY190ZXN0IHsKKyAgICBuYW1lOiAiaW5wdXRfbW9uaXRvciIsCisgICAgZ3Rlc3Q6IGZhbHNlLAorICAgIHNyY3M6IFsic3JjL2lucHV0X21vbml0b3IuY3BwIl0sCisgICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiXSwKKyAgICBzaGFyZWRfbGliczogWyJsaWJhYXVkaW8iXSwKKyAgICBoZWFkZXJfbGliczogWyJsaWJhYXVkaW9fZXhhbXBsZV91dGlscyJdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiaW5wdXRfbW9uaXRvcl9jYWxsYmFjayIsCisgICAgZ3Rlc3Q6IGZhbHNlLAorICAgIHNyY3M6IFsic3JjL2lucHV0X21vbml0b3JfY2FsbGJhY2suY3BwIl0sCisgICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiXSwKKyAgICBzaGFyZWRfbGliczogWyJsaWJhYXVkaW8iXSwKKyAgICBoZWFkZXJfbGliczogWyJsaWJhYXVkaW9fZXhhbXBsZV91dGlscyJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3IvQW5kcm9pZC5tayBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNTNlN2QuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3IvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWluY2x1ZGUgJChjYWxsIGFsbC1zdWJkaXItbWFrZWZpbGVzKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3Ivam5pL0FuZHJvaWQubWsgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9qbmkvQW5kcm9pZC5tawppbmRleCA5YjFjZTJjLi5hMGI5ODFjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9qbmkvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9qbmkvQW5kcm9pZC5tawpAQCAtMTAsNiArMTAsNyBAQAogCiAjIE5ESyByZWNvbW1lbmRzIHVzaW5nIHRoaXMga2luZCBvZiByZWxhdGl2ZSBwYXRoIGluc3RlYWQgb2YgYW4gYWJzb2x1dGUgcGF0aC4KIExPQ0FMX1NSQ19GSUxFUzo9IC4uL3NyYy9pbnB1dF9tb25pdG9yLmNwcAorTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYWF1ZGlvCiBMT0NBTF9NT0RVTEUgOj0gaW5wdXRfbW9uaXRvcgogaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCkBAIC0yMiw2ICsyMyw3IEBACiAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMKIAogTE9DQUxfU1JDX0ZJTEVTOj0gLi4vc3JjL2lucHV0X21vbml0b3JfY2FsbGJhY2suY3BwCitMT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvcgogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJhYXVkaW8KIExPQ0FMX01PRFVMRSA6PSBpbnB1dF9tb25pdG9yX2NhbGxiYWNrCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL3NyYy9pbnB1dF9tb25pdG9yLmNwcCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL3NyYy9pbnB1dF9tb25pdG9yLmNwcAppbmRleCA5ZmViMTE4Li5jMWZmMzRiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9zcmMvaW5wdXRfbW9uaXRvci5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3Ivc3JjL2lucHV0X21vbml0b3IuY3BwCkBAIC0yNiwyNCArMjYsMjIgQEAKICNpbmNsdWRlICJBQXVkaW9FeGFtcGxlVXRpbHMuaCIKICNpbmNsdWRlICJBQXVkaW9TaW1wbGVSZWNvcmRlci5oIgogCi0vLyBUT0RPIHN1cHBvcnQgRkxPQVQKLSNkZWZpbmUgUkVRVUlSRURfRk9STUFUICAgIEFBVURJT19GT1JNQVRfUENNX0kxNgogI2RlZmluZSBNSU5fRlJBTUVTX1RPX1JFQUQgNDggIC8qIGFyYml0cmFyeSwgMSBtc2VjIGF0IDQ4MDAwIEh6ICovCiAKIHN0YXRpYyBjb25zdCBpbnQgRlJBTUVTX1BFUl9MSU5FID0gMjAwMDA7CiAKIGludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKIHsKLSAgICBBQXVkaW9BcmdzUGFyc2VyICAgYXJnUGFyc2VyOwotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQ7Ci0gICAgQUF1ZGlvU2ltcGxlUmVjb3JkZXIgcmVjb3JkZXI7Ci0gICAgaW50IGFjdHVhbFNhbXBsZXNQZXJGcmFtZTsKLSAgICBpbnQgYWN0dWFsU2FtcGxlUmF0ZTsKLSAgICBhYXVkaW9fZm9ybWF0X3QgICAgICAgYWN0dWFsRGF0YUZvcm1hdDsKLSAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3QgYWN0dWFsU2hhcmluZ01vZGU7CisgICAgQUF1ZGlvQXJnc1BhcnNlciAgICAgIGFyZ1BhcnNlcjsKKyAgICBBQXVkaW9TaW1wbGVSZWNvcmRlciAgcmVjb3JkZXI7CisgICAgQUF1ZGlvU3RyZWFtICAgICAgICAgKmFhdWRpb1N0cmVhbSA9IG51bGxwdHI7CiAKLSAgICBBQXVkaW9TdHJlYW0gKmFhdWRpb1N0cmVhbSA9IG51bGxwdHI7CisgICAgYWF1ZGlvX3Jlc3VsdF90ICAgICAgIHJlc3VsdDsKKyAgICBhYXVkaW9fZm9ybWF0X3QgICAgICAgYWN0dWFsRGF0YUZvcm1hdDsKICAgICBhYXVkaW9fc3RyZWFtX3N0YXRlX3Qgc3RhdGU7CisKKyAgICBpbnQzMl90IGFjdHVhbFNhbXBsZXNQZXJGcmFtZTsKKyAgICBpbnQzMl90IGFjdHVhbFNhbXBsZVJhdGU7CiAgICAgaW50MzJfdCBmcmFtZXNQZXJCdXJzdCA9IDA7CiAgICAgaW50MzJfdCBmcmFtZXNQZXJSZWFkID0gMDsKICAgICBpbnQzMl90IGZyYW1lc1RvUmVjb3JkID0gMDsKQEAgLTUxLDE5ICs0OSwxOCBAQAogICAgIGludDMyX3QgbmV4dEZyYW1lQ291bnQgPSAwOwogICAgIGludDMyX3QgZnJhbWVDb3VudCA9IDA7CiAgICAgaW50MzJfdCB4UnVuQ291bnQgPSAwOwotICAgIGludDY0X3QgcHJldmlvdXNGcmFtZVBvc2l0aW9uID0gLTE7Ci0gICAgaW50MTZfdCAqZGF0YSA9IG51bGxwdHI7Ci0gICAgZmxvYXQgcGVha0xldmVsID0gMC4wOwotICAgIGludCBsb29wQ291bnRlciA9IDA7CiAgICAgaW50MzJfdCBkZXZpY2VJZDsKIAorICAgIGludDE2X3QgKnNob3J0RGF0YSA9IG51bGxwdHI7CisgICAgZmxvYXQgICAqZmxvYXREYXRhID0gbnVsbHB0cjsKKyAgICBmbG9hdCAgICBwZWFrTGV2ZWwgPSAwLjA7CisKICAgICAvLyBNYWtlIHByaW50ZiBwcmludCBpbW1lZGlhdGVseSBzbyB0aGF0IGRlYnVnIGluZm8gaXMgbm90IHN0dWNrCiAgICAgLy8gaW4gYSBidWZmZXIgaWYgd2UgaGFuZyBvciBjcmFzaC4KICAgICBzZXR2YnVmKHN0ZG91dCwgbnVsbHB0ciwgX0lPTkJGLCAoc2l6ZV90KSAwKTsKIAotICAgIHByaW50ZigiJXMgLSBNb25pdG9yIGlucHV0IGxldmVsIHVzaW5nIEFBdWRpbyByZWFkLCBWMC4xLjJcbiIsIGFyZ3ZbMF0pOworICAgIHByaW50ZigiJXMgLSBNb25pdG9yIGlucHV0IGxldmVsIHVzaW5nIEFBdWRpbyByZWFkLCBWMC4xLjNcbiIsIGFyZ3ZbMF0pOwogCi0gICAgYXJnUGFyc2VyLnNldEZvcm1hdChSRVFVSVJFRF9GT1JNQVQpOwogICAgIGlmIChhcmdQYXJzZXIucGFyc2VBcmdzKGFyZ2MsIGFyZ3YpKSB7CiAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CiAgICAgfQpAQCAtNzEsNiArNjgsNyBAQAogICAgIHJlc3VsdCA9IHJlY29yZGVyLm9wZW4oYXJnUGFyc2VyKTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIC0gIHJlY29yZGVyLm9wZW4oKSByZXR1cm5lZCAlZFxuIiwgcmVzdWx0KTsKKyAgICAgICAgcHJpbnRmKCJJTVBPUlRBTlQgLSBEaWQgeW91IHJlbWVtYmVyIHRvIGVudGVyOiAgIGFkYiByb290XG4iKTsKICAgICAgICAgZ290byBmaW5pc2g7CiAgICAgfQogICAgIGFhdWRpb1N0cmVhbSA9IHJlY29yZGVyLmdldFN0cmVhbSgpOwpAQCAtOTgsMTcgKzk2LDE4IEBACiAgICAgcHJpbnRmKCJEYXRhRm9ybWF0OiBmcmFtZXNQZXJSZWFkICA9ICVkXG4iLGZyYW1lc1BlclJlYWQpOwogCiAgICAgYWN0dWFsRGF0YUZvcm1hdCA9IEFBdWRpb1N0cmVhbV9nZXRGb3JtYXQoYWF1ZGlvU3RyZWFtKTsKLSAgICBwcmludGYoIkRhdGFGb3JtYXQ6IHJlcXVlc3RlZCAgICAgID0gJWQsIGFjdHVhbCA9ICVkXG4iLAotICAgICAgICAgICBSRVFVSVJFRF9GT1JNQVQsIGFjdHVhbERhdGFGb3JtYXQpOwotICAgIC8vIFRPRE8gaGFuZGxlIG90aGVyIGRhdGEgZm9ybWF0cwotICAgIGFzc2VydChhY3R1YWxEYXRhRm9ybWF0ID09IFJFUVVJUkVEX0ZPUk1BVCk7CiAKICAgICAvLyBBbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgdGhlIFBDTV8xNiBhdWRpbyBkYXRhLgotICAgIGRhdGEgPSBuZXcoc3RkOjpub3Rocm93KSBpbnQxNl90W2ZyYW1lc1BlclJlYWQgKiBhY3R1YWxTYW1wbGVzUGVyRnJhbWVdOwotICAgIGlmIChkYXRhID09IG51bGxwdHIpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUiAtIGNvdWxkIG5vdCBhbGxvY2F0ZSBkYXRhIGJ1ZmZlclxuIik7Ci0gICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9OT19NRU1PUlk7Ci0gICAgICAgIGdvdG8gZmluaXNoOworICAgIHN3aXRjaCAoYWN0dWFsRGF0YUZvcm1hdCkgeworICAgICAgICBjYXNlIEFBVURJT19GT1JNQVRfUENNX0kxNjoKKyAgICAgICAgICAgIHNob3J0RGF0YSA9IG5ldyBpbnQxNl90W2ZyYW1lc1BlclJlYWQgKiBhY3R1YWxTYW1wbGVzUGVyRnJhbWVdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CisgICAgICAgICAgICBmbG9hdERhdGEgPSBuZXcgZmxvYXRbZnJhbWVzUGVyUmVhZCAqIGFjdHVhbFNhbXBsZXNQZXJGcmFtZV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVU5FWFBFQ1RFRCBGT1JNQVQhICVkIiwgYWN0dWFsRGF0YUZvcm1hdCk7CisgICAgICAgICAgICBnb3RvIGZpbmlzaDsKICAgICB9CiAKICAgICAvLyBTdGFydCB0aGUgc3RyZWFtLgpAQCAtMTI4LDcgKzEyNywxMiBAQAogICAgICAgICAvLyBSZWFkIGF1ZGlvIGRhdGEgZnJvbSB0aGUgc3RyZWFtLgogICAgICAgICBjb25zdCBpbnQ2NF90IHRpbWVvdXROYW5vcyA9IDEwMDAgKiBOQU5PU19QRVJfTUlMTElTRUNPTkQ7CiAgICAgICAgIGludCBtaW5GcmFtZXMgPSAoZnJhbWVzVG9SZWNvcmQgPCBmcmFtZXNQZXJSZWFkKSA/IGZyYW1lc1RvUmVjb3JkIDogZnJhbWVzUGVyUmVhZDsKLSAgICAgICAgaW50IGFjdHVhbCA9IEFBdWRpb1N0cmVhbV9yZWFkKGFhdWRpb1N0cmVhbSwgZGF0YSwgbWluRnJhbWVzLCB0aW1lb3V0TmFub3MpOworICAgICAgICBpbnQgYWN0dWFsID0gMDsKKyAgICAgICAgaWYgKGFjdHVhbERhdGFGb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2KSB7CisgICAgICAgICAgICBhY3R1YWwgPSBBQXVkaW9TdHJlYW1fcmVhZChhYXVkaW9TdHJlYW0sIHNob3J0RGF0YSwgbWluRnJhbWVzLCB0aW1lb3V0TmFub3MpOworICAgICAgICB9IGVsc2UgaWYgKGFjdHVhbERhdGFGb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKKyAgICAgICAgICAgIGFjdHVhbCA9IEFBdWRpb1N0cmVhbV9yZWFkKGFhdWRpb1N0cmVhbSwgZmxvYXREYXRhLCBtaW5GcmFtZXMsIHRpbWVvdXROYW5vcyk7CisgICAgICAgIH0KICAgICAgICAgaWYgKGFjdHVhbCA8IDApIHsKICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1IgLSBBQXVkaW9TdHJlYW1fcmVhZCgpIHJldHVybmVkICVkXG4iLCBhY3R1YWwpOwogICAgICAgICAgICAgcmVzdWx0ID0gYWN0dWFsOwpAQCAtMTQyLDcgKzE0NiwxMiBAQAogCiAgICAgICAgIC8vIFBlYWsgZmluZGVyLgogICAgICAgICBmb3IgKGludCBmcmFtZUluZGV4ID0gMDsgZnJhbWVJbmRleCA8IGFjdHVhbDsgZnJhbWVJbmRleCsrKSB7Ci0gICAgICAgICAgICBmbG9hdCBzYW1wbGUgPSBkYXRhW2ZyYW1lSW5kZXggKiBhY3R1YWxTYW1wbGVzUGVyRnJhbWVdICogKDEuMC8zMjc2OCk7CisgICAgICAgICAgICBmbG9hdCBzYW1wbGUgPSAwLjBmOworICAgICAgICAgICAgaWYgKGFjdHVhbERhdGFGb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2KSB7CisgICAgICAgICAgICAgICAgc2FtcGxlID0gc2hvcnREYXRhW2ZyYW1lSW5kZXggKiBhY3R1YWxTYW1wbGVzUGVyRnJhbWVdICogKDEuMC8zMjc2OCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdHVhbERhdGFGb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKKyAgICAgICAgICAgICAgICBzYW1wbGUgPSBmbG9hdERhdGFbZnJhbWVJbmRleCAqIGFjdHVhbFNhbXBsZXNQZXJGcmFtZV07CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoc2FtcGxlID4gcGVha0xldmVsKSB7CiAgICAgICAgICAgICAgICAgcGVha0xldmVsID0gc2FtcGxlOwogICAgICAgICAgICAgfQpAQCAtMTUzLDE3ICsxNjIsMTUgQEAKICAgICAgICAgICAgIGRpc3BsYXlQZWFrTGV2ZWwocGVha0xldmVsKTsKICAgICAgICAgICAgIHBlYWtMZXZlbCA9IDAuMDsKICAgICAgICAgICAgIG5leHRGcmFtZUNvdW50ICs9IEZSQU1FU19QRVJfTElORTsKLSAgICAgICAgfQogCi0gICAgICAgIC8vIFByaW50IHRpbWVzdGFtcHMuCi0gICAgICAgIGludDY0X3QgZnJhbWVQb3NpdGlvbiA9IDA7Ci0gICAgICAgIGludDY0X3QgZnJhbWVUaW1lID0gMDsKLSAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IHRpbWVSZXN1bHQ7Ci0gICAgICAgIHRpbWVSZXN1bHQgPSBBQXVkaW9TdHJlYW1fZ2V0VGltZXN0YW1wKGFhdWRpb1N0cmVhbSwgQ0xPQ0tfTU9OT1RPTklDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJhbWVQb3NpdGlvbiwgJmZyYW1lVGltZSk7CisgICAgICAgICAgICAvLyBQcmludCB0aW1lc3RhbXBzLgorICAgICAgICAgICAgaW50NjRfdCBmcmFtZVBvc2l0aW9uID0gMDsKKyAgICAgICAgICAgIGludDY0X3QgZnJhbWVUaW1lID0gMDsKKyAgICAgICAgICAgIGFhdWRpb19yZXN1bHRfdCB0aW1lUmVzdWx0OworICAgICAgICAgICAgdGltZVJlc3VsdCA9IEFBdWRpb1N0cmVhbV9nZXRUaW1lc3RhbXAoYWF1ZGlvU3RyZWFtLCBDTE9DS19NT05PVE9OSUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJhbWVQb3NpdGlvbiwgJmZyYW1lVGltZSk7CiAKLSAgICAgICAgaWYgKHRpbWVSZXN1bHQgPT0gQUFVRElPX09LKSB7Ci0gICAgICAgICAgICBpZiAoZnJhbWVQb3NpdGlvbiA+IChwcmV2aW91c0ZyYW1lUG9zaXRpb24gKyBGUkFNRVNfUEVSX0xJTkUpKSB7CisgICAgICAgICAgICBpZiAodGltZVJlc3VsdCA9PSBBQVVESU9fT0spIHsKICAgICAgICAgICAgICAgICBpbnQ2NF90IHJlYWxUaW1lID0gZ2V0TmFub3NlY29uZHMoKTsKICAgICAgICAgICAgICAgICBpbnQ2NF90IGZyYW1lc1JlYWQgPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUmVhZChhYXVkaW9TdHJlYW0pOwogCkBAIC0xNzcsMTEgKzE4NCwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSBmcmFtZVBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSBmcmFtZVRpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVuY3lNaWxsaXMpOwotICAgICAgICAgICAgICAgIHByZXZpb3VzRnJhbWVQb3NpdGlvbiA9IGZyYW1lUG9zaXRpb247CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByaW50ZigiV0FSTklORyAtIEFBdWRpb1N0cmVhbV9nZXRUaW1lc3RhbXAoKSByZXR1cm5lZCAlZFxuIiwgdGltZVJlc3VsdCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBzdGF0ZSA9IEFBdWRpb1N0cmVhbV9nZXRTdGF0ZShhYXVkaW9TdHJlYW0pOworICAgIHByaW50ZigiYWZ0ZXIgbG9vcCwgc3RhdGUgPSAlc1xuIiwgQUF1ZGlvX2NvbnZlcnRTdHJlYW1TdGF0ZVRvVGV4dChzdGF0ZSkpOworCiAgICAgeFJ1bkNvdW50ID0gQUF1ZGlvU3RyZWFtX2dldFhSdW5Db3VudChhYXVkaW9TdHJlYW0pOwogICAgIHByaW50ZigiQUF1ZGlvU3RyZWFtX2dldFhSdW5Db3VudCAlZFxuIiwgeFJ1bkNvdW50KTsKIApAQCAtMTk0LDcgKzIwNSw4IEBACiAKIGZpbmlzaDoKICAgICByZWNvcmRlci5jbG9zZSgpOwotICAgIGRlbGV0ZVtdIGRhdGE7CisgICAgZGVsZXRlW10gc2hvcnREYXRhOworICAgIGRlbGV0ZVtdIGZsb2F0RGF0YTsKICAgICBwcmludGYoImV4aXRpbmcgLSBBQXVkaW8gcmVzdWx0ID0gJWQgPSAlc1xuIiwgcmVzdWx0LCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKICAgICByZXR1cm4gKHJlc3VsdCAhPSBBQVVESU9fT0spID8gRVhJVF9GQUlMVVJFIDogRVhJVF9TVUNDRVNTOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3Ivc3JjL2lucHV0X21vbml0b3JfY2FsbGJhY2suY3BwIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3Ivc3JjL2lucHV0X21vbml0b3JfY2FsbGJhY2suY3BwCmluZGV4IDg5Mzc5NWIuLmQxMGY4MTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL3NyYy9pbnB1dF9tb25pdG9yX2NhbGxiYWNrLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9zcmMvaW5wdXRfbW9uaXRvcl9jYWxsYmFjay5jcHAKQEAgLTI2LDI5ICsyNiwzOSBAQAogI2luY2x1ZGUgIkFBdWRpb0V4YW1wbGVVdGlscy5oIgogI2luY2x1ZGUgIkFBdWRpb1NpbXBsZVJlY29yZGVyLmgiCiAKLSNkZWZpbmUgTlVNX1NFQ09ORFMgICAgICAgICAgIDUKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoraW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQogewotICAgICh2b2lkKWFyZ2M7IC8vIHVudXNlZAotICAgIEFBdWRpb1NpbXBsZVJlY29yZGVyIHJlY29yZGVyOwotICAgIFBlYWtUcmFja2VyRGF0YV90IG15RGF0YSA9IHswLjB9OwotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQ7CisgICAgQUF1ZGlvQXJnc1BhcnNlciAgICAgIGFyZ1BhcnNlcjsKKyAgICBBQXVkaW9TaW1wbGVSZWNvcmRlciAgcmVjb3JkZXI7CisgICAgUGVha1RyYWNrZXJEYXRhX3QgICAgIG15RGF0YSA9IHswLjB9OworICAgIEFBdWRpb1N0cmVhbSAgICAgICAgICphYXVkaW9TdHJlYW0gPSBudWxscHRyOworICAgIGFhdWRpb19yZXN1bHRfdCAgICAgICByZXN1bHQ7CiAgICAgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IHN0YXRlOworCisgICAgaW50ICAgICAgIGxvb3BzTmVlZGVkID0gMDsKICAgICBjb25zdCBpbnQgZGlzcGxheVJhdGVIeiA9IDIwOyAvLyBhcmJpdHJhcnkKLSAgICBjb25zdCBpbnQgbG9vcHNOZWVkZWQgPSBOVU1fU0VDT05EUyAqIGRpc3BsYXlSYXRlSHo7CiAKICAgICAvLyBNYWtlIHByaW50ZiBwcmludCBpbW1lZGlhdGVseSBzbyB0aGF0IGRlYnVnIGluZm8gaXMgbm90IHN0dWNrCiAgICAgLy8gaW4gYSBidWZmZXIgaWYgd2UgaGFuZyBvciBjcmFzaC4KICAgICBzZXR2YnVmKHN0ZG91dCwgbnVsbHB0ciwgX0lPTkJGLCAoc2l6ZV90KSAwKTsKLSAgICBwcmludGYoIiVzIC0gRGlzcGxheSBhdWRpbyBpbnB1dCB1c2luZyBhbiBBQXVkaW8gY2FsbGJhY2ssIFYwLjEuMlxuIiwgYXJndlswXSk7CisgICAgcHJpbnRmKCIlcyAtIERpc3BsYXkgYXVkaW8gaW5wdXQgdXNpbmcgYW4gQUF1ZGlvIGNhbGxiYWNrLCBWMC4xLjNcbiIsIGFyZ3ZbMF0pOwogCi0gICAgcmVzdWx0ID0gcmVjb3JkZXIub3BlbigyLCA0ODAwMCwgQUFVRElPX0ZPUk1BVF9QQ01fSTE2LAotICAgICAgICAgICAgICAgICAgICAgICBTaW1wbGVSZWNvcmRlckRhdGFDYWxsYmFja1Byb2MsIFNpbXBsZVJlY29yZGVyRXJyb3JDYWxsYmFja1Byb2MsICZteURhdGEpOworICAgIGlmIChhcmdQYXJzZXIucGFyc2VBcmdzKGFyZ2MsIGFyZ3YpKSB7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorCisgICAgcmVzdWx0ID0gcmVjb3JkZXIub3BlbihhcmdQYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTaW1wbGVSZWNvcmRlckRhdGFDYWxsYmFja1Byb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTaW1wbGVSZWNvcmRlckVycm9yQ2FsbGJhY2tQcm9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJm15RGF0YSk7CiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUiAtICByZWNvcmRlci5vcGVuKCkgcmV0dXJuZWQgJWRcbiIsIHJlc3VsdCk7CisgICAgICAgIHByaW50ZigiSU1QT1JUQU5UIC0gRGlkIHlvdSByZW1lbWJlciB0byBlbnRlcjogICBhZGIgcm9vdFxuIik7CiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQorICAgIGFhdWRpb1N0cmVhbSA9IHJlY29yZGVyLmdldFN0cmVhbSgpOworICAgIGFyZ1BhcnNlci5jb21wYXJlV2l0aFN0cmVhbShhYXVkaW9TdHJlYW0pOworCiAgICAgcHJpbnRmKCJyZWNvcmRlci5nZXRGcmFtZXNQZXJTZWNvbmQoKSA9ICVkXG4iLCByZWNvcmRlci5nZXRGcmFtZXNQZXJTZWNvbmQoKSk7CiAgICAgcHJpbnRmKCJyZWNvcmRlci5nZXRTYW1wbGVzUGVyRnJhbWUoKSA9ICVkXG4iLCByZWNvcmRlci5nZXRTYW1wbGVzUGVyRnJhbWUoKSk7CiAKQEAgLTU4LDcgKzY4LDkgQEAKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAKLSAgICBwcmludGYoIlNsZWVwIGZvciAlZCBzZWNvbmRzIHdoaWxlIGF1ZGlvIHJlY29yZCBpbiBhIGNhbGxiYWNrIHRocmVhZC5cbiIsIE5VTV9TRUNPTkRTKTsKKyAgICBwcmludGYoIlNsZWVwIGZvciAlZCBzZWNvbmRzIHdoaWxlIGF1ZGlvIHJlY29yZCBpbiBhIGNhbGxiYWNrIHRocmVhZC5cbiIsCisgICAgICAgICAgIGFyZ1BhcnNlci5nZXREdXJhdGlvblNlY29uZHMoKSk7CisgICAgbG9vcHNOZWVkZWQgPSBhcmdQYXJzZXIuZ2V0RHVyYXRpb25TZWNvbmRzKCkgKiBkaXNwbGF5UmF0ZUh6OwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbG9vcHNOZWVkZWQ7IGkrKykKICAgICB7CiAgICAgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyByZXF1ZXN0ID0geyAudHZfc2VjID0gMCwKQEAgLTY3LDcgKzc5LDcgQEAKICAgICAgICAgcHJpbnRmKCIlMDhkOiAiLCAoaW50KXJlY29yZGVyLmdldEZyYW1lc1JlYWQoKSk7CiAgICAgICAgIGRpc3BsYXlQZWFrTGV2ZWwobXlEYXRhLnBlYWtMZXZlbCk7CiAKLSAgICAgICAgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX3dhaXRGb3JTdGF0ZUNoYW5nZShyZWNvcmRlci5nZXRTdHJlYW0oKSwKKyAgICAgICAgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX3dhaXRGb3JTdGF0ZUNoYW5nZShhYXVkaW9TdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwpAQCAtOTMsNyArMTA1LDggQEAKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAKLSAgICBwcmludGYoIlNsZWVwIGZvciAlZCBzZWNvbmRzIHdoaWxlIGF1ZGlvIHJlY29yZHMgaW4gYSBjYWxsYmFjayB0aHJlYWQuXG4iLCBOVU1fU0VDT05EUyk7CisgICAgcHJpbnRmKCJTbGVlcCBmb3IgJWQgc2Vjb25kcyB3aGlsZSBhdWRpbyByZWNvcmRzIGluIGEgY2FsbGJhY2sgdGhyZWFkLlxuIiwKKyAgICAgICAgICAgYXJnUGFyc2VyLmdldER1cmF0aW9uU2Vjb25kcygpKTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxvb3BzTmVlZGVkOyBpKyspCiAgICAgewogICAgICAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgcmVxdWVzdCA9IHsgLnR2X3NlYyA9IDAsCkBAIC0xMDIsMTMgKzExNSwxNCBAQAogICAgICAgICBwcmludGYoIiUwOGQ6ICIsIChpbnQpcmVjb3JkZXIuZ2V0RnJhbWVzUmVhZCgpKTsKICAgICAgICAgZGlzcGxheVBlYWtMZXZlbChteURhdGEucGVha0xldmVsKTsKIAotICAgICAgICBzdGF0ZSA9IEFBdWRpb1N0cmVhbV9nZXRTdGF0ZShyZWNvcmRlci5nZXRTdHJlYW0oKSk7CisgICAgICAgIHN0YXRlID0gQUF1ZGlvU3RyZWFtX2dldFN0YXRlKGFhdWRpb1N0cmVhbSk7CiAgICAgICAgIGlmIChzdGF0ZSAhPSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJUSU5HICYmIHN0YXRlICE9IEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRFRCkgewogICAgICAgICAgICAgcHJpbnRmKCJTdHJlYW0gc3RhdGUgaXMgJWQgJXMhXG4iLCBzdGF0ZSwgQUF1ZGlvX2NvbnZlcnRTdHJlYW1TdGF0ZVRvVGV4dChzdGF0ZSkpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAgICAgcHJpbnRmKCJXb2tlIHVwIG5vdy5cbiIpOworICAgIGFyZ1BhcnNlci5jb21wYXJlV2l0aFN0cmVhbShhYXVkaW9TdHJlYW0pOwogCiAgICAgcmVzdWx0ID0gcmVjb3JkZXIuc3RvcCgpOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svQW5kcm9pZC5icCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViN2Q5NTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svQW5kcm9pZC5icApAQCAtMCwwICsxLDEyIEBACitjY190ZXN0IHsKKyAgICBuYW1lOiAiYWF1ZGlvX2xvb3BiYWNrIiwKKyAgICBndGVzdDogZmFsc2UsCisgICAgc3JjczogWyJzcmMvbG9vcGJhY2suY3BwIl0sCisgICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiXSwKKyAgICBzdGF0aWNfbGliczogWyJsaWJzbmRmaWxlIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmFhdWRpbyIsCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgXSwKKyAgICBoZWFkZXJfbGliczogWyJsaWJhYXVkaW9fZXhhbXBsZV91dGlscyJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL0FuZHJvaWQubWsgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA1M2U3ZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWluY2x1ZGUgJChjYWxsIGFsbC1zdWJkaXItbWFrZWZpbGVzKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL2puaS9BbmRyb2lkLm1rIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL2puaS9BbmRyb2lkLm1rCmluZGV4IGQ3OGYyODYuLmFlYmU4NzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9qbmkvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svam5pL0FuZHJvaWQubWsKQEAgLTksNiArOSw4IEBACiAKICMgTkRLIHJlY29tbWVuZHMgdXNpbmcgdGhpcyBraW5kIG9mIHJlbGF0aXZlIHBhdGggaW5zdGVhZCBvZiBhbiBhYnNvbHV0ZSBwYXRoLgogTE9DQUxfU1JDX0ZJTEVTOj0gLi4vc3JjL2xvb3BiYWNrLmNwcAotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJhYXVkaW8KK0xPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYnNuZGZpbGUKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYWF1ZGlvIGxpYmF1ZGlvdXRpbHMKIExPQ0FMX01PRFVMRSA6PSBhYXVkaW9fbG9vcGJhY2sKIGluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9Mb29wYmFja0FuYWx5emVyLmggYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL0xvb3BiYWNrQW5hbHl6ZXIuaAppbmRleCAyMWNmMzQxLi5lZjlhNzUzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL0xvb3BiYWNrQW5hbHl6ZXIuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL0xvb3BiYWNrQW5hbHl6ZXIuaApAQCAtMzAsNiArMzAsOCBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvc25kZmlsZS5oPgorCiAvLyBUYWcgZm9yIG1hY2hpbmUgcmVhZGFibGUgcmVzdWx0cyBhcyBwcm9wZXJ0eSA9IHZhbHVlIHBhaXJzCiAjZGVmaW5lIExPT1BCQUNLX1JFU1VMVF9UQUcgICAgICAiUkVTVUxUOiAiCiAjZGVmaW5lIExPT1BCQUNLX1NBTVBMRV9SQVRFICAgICA0ODAwMApAQCAtMzcsMTMgKzM5LDE4IEBACiAjZGVmaW5lIE1JTExJU19QRVJfU0VDT05EICAgICAgICAxMDAwCiAKICNkZWZpbmUgTUFYX1pFUk9USF9QQVJUSUFMX0JJTlMgIDQwCitjb25zdGV4cHIgZG91YmxlIE1BWF9FQ0hPX0dBSU4gPSAxMC4wOyAvLyBiYXNlZCBvbiBleHBlcmltZW50cywgb3RoZXJ3aXNlIGF1dG9jb3JyZWxhdGlvbiB0b28gbm9pc3kKIAorLy8gQSBuYXJyb3cgaW1wdWxzZSBzZWVtcyB0byBoYXZlIGJldHRlciBpbW11bml0eSBhZ2FpbnN0IG92ZXIgZXN0aW1hdGluZyB0aGUKKy8vIGxhdGVuY3kgZHVlIHRvIGRldGVjdGluZyBzdWJoYXJtb25pY3MgYnkgdGhlIGF1dG8tY29ycmVsYXRvci4KIHN0YXRpYyBjb25zdCBmbG9hdCBzX0ltcHVsc2VbXSA9IHsKLSAgICAgICAgMC4wZiwgMC4wZiwgMC4wZiwgMC4wZiwgMC4yZiwgLy8gc2lsZW5jZSBvbiBlYWNoIHNpZGUgb2YgdGhlIGltcHVsc2UKLSAgICAgICAgMC41ZiwgMC45OTk5ZiwgMC4wZiwgLTAuOTk5OSwgLTAuNWYsIC8vIGJpcG9sYXIKLSAgICAgICAgLTAuMmYsIDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYKKyAgICAgICAgMC4wZiwgMC4wZiwgMC4wZiwgMC4wZiwgMC4zZiwgLy8gc2lsZW5jZSBvbiBlYWNoIHNpZGUgb2YgdGhlIGltcHVsc2UKKyAgICAgICAgMC45OWYsIDAuMGYsIC0wLjk5ZiwgLy8gYmlwb2xhciB3aXRoIG9uZSB6ZXJvIGNyb3NzaW5nIGluIG1pZGRsZQorICAgICAgICAtMC4zZiwgMC4wZiwgMC4wZiwgMC4wZiwgMC4wZgogfTsKIAorY29uc3RleHByIGludDMyX3Qga0ltcHVsc2VTaXplSW5GcmFtZXMgPSAoaW50MzJfdCkoc2l6ZW9mKHNfSW1wdWxzZSkgLyBzaXplb2Yoc19JbXB1bHNlWzBdKSk7CisKIGNsYXNzIFBzZXVkb1JhbmRvbSB7CiBwdWJsaWM6CiAgICAgUHNldWRvUmFuZG9tKCkge30KQEAgLTE1Niw2ICsxNjMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpuZWVkbGUsIGludCBuZWVkbGVTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhdGVuY3lSZXBvcnQgKnJlcG9ydCkgewogICAgIGNvbnN0IGRvdWJsZSB0aHJlc2hvbGQgPSAwLjE7CisgICAgcHJpbnRmKCJtZWFzdXJlTGF0ZW5jeUZyb21FY2hvczogaGF5c3RhY2tTaXplID0gJWQsIG5lZWRsZVNpemUgPSAlZFxuIiwKKyAgICAgICAgICAgaGF5c3RhY2tTaXplLCBuZWVkbGVTaXplKTsKIAogICAgIC8vIEZpbmQgZmlyc3QgcGVhawogICAgIGludCBmaXJzdCA9IChpbnQpIChmaW5kRmlyc3RNYXRjaChoYXlzdGFjaywKQEAgLTE3Myw3ICsxODIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkbGVTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2hvbGQpICsgMC41KTsKIAotICAgIHByaW50ZigiZmlyc3QgPSAlZCwgYWdhaW4gYXQgJWRcbiIsIGZpcnN0LCBhZ2Fpbik7CisgICAgcHJpbnRmKCJtZWFzdXJlTGF0ZW5jeUZyb21FY2hvczogZmlyc3QgPSAlZCwgYWdhaW4gYXQgJWRcbiIsIGZpcnN0LCBhZ2Fpbik7CiAgICAgZmlyc3QgPSBhZ2FpbjsKIAogICAgIC8vIEFsbG9jYXRlIHJlc3VsdHMgYXJyYXkKQEAgLTI3MCwzNyArMjc5LDYwIEBACiAgICAgICAgIHJldHVybiBtRGF0YTsKICAgICB9CiAKKyAgICB2b2lkIHNldFNhbXBsZVJhdGUoaW50MzJfdCBzYW1wbGVSYXRlKSB7CisgICAgICAgIG1TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKKyAgICB9CisKKyAgICBpbnQzMl90IGdldFNhbXBsZVJhdGUoKSB7CisgICAgICAgIHJldHVybiBtU2FtcGxlUmF0ZTsKKyAgICB9CisKICAgICBpbnQgc2F2ZShjb25zdCBjaGFyICpmaWxlTmFtZSwgYm9vbCB3cml0ZVNob3J0cyA9IHRydWUpIHsKKyAgICAgICAgU05ERklMRSAqc25kRmlsZSA9IG51bGxwdHI7CiAgICAgICAgIGludCB3cml0dGVuID0gMDsKLSAgICAgICAgY29uc3QgaW50IGNodW5rU2l6ZSA9IDY0OwotICAgICAgICBGSUxFICpmaWQgPSBmb3BlbihmaWxlTmFtZSwgIndiIik7Ci0gICAgICAgIGlmIChmaWQgPT0gTlVMTCkgeworICAgICAgICBTRl9JTkZPIGluZm8gPSB7CisgICAgICAgICAgICAgICAgLmZyYW1lcyA9IG1GcmFtZUNvdW50ZXIsCisgICAgICAgICAgICAgICAgLnNhbXBsZXJhdGUgPSBtU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAuY2hhbm5lbHMgPSAxLAorICAgICAgICAgICAgICAgIC5mb3JtYXQgPSBTRl9GT1JNQVRfV0FWIHwgKHdyaXRlU2hvcnRzID8gU0ZfRk9STUFUX1BDTV8xNiA6IFNGX0ZPUk1BVF9GTE9BVCkKKyAgICAgICAgfTsKKworICAgICAgICBzbmRGaWxlID0gc2Zfb3BlbihmaWxlTmFtZSwgU0ZNX1dSSVRFLCAmaW5mbyk7CisgICAgICAgIGlmIChzbmRGaWxlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHByaW50ZigiQXVkaW9SZWNvcmRpbmc6OnNhdmUoJXMpIGZhaWxlZCB0byBvcGVuIGZpbGVcbiIsIGZpbGVOYW1lKTsKICAgICAgICAgICAgIHJldHVybiAtZXJybm87CiAgICAgICAgIH0KIAotICAgICAgICBpZiAod3JpdGVTaG9ydHMpIHsKLSAgICAgICAgICAgIGludDE2X3QgYnVmZmVyW2NodW5rU2l6ZV07Ci0gICAgICAgICAgICBpbnQzMl90IGZyYW1lc0xlZnQgPSBtRnJhbWVDb3VudGVyOwotICAgICAgICAgICAgaW50MzJfdCBjdXJzb3IgPSAwOwotICAgICAgICAgICAgd2hpbGUgKGZyYW1lc0xlZnQpIHsKLSAgICAgICAgICAgICAgICBpbnQzMl90IGZyYW1lc1RvV3JpdGUgPSBmcmFtZXNMZWZ0IDwgY2h1bmtTaXplID8gZnJhbWVzTGVmdCA6IGNodW5rU2l6ZTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lc1RvV3JpdGU7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBidWZmZXJbaV0gPSAoaW50MTZfdCkgKG1EYXRhW2N1cnNvcisrXSAqIDMyNzY3KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgd3JpdHRlbiArPSBmd3JpdGUoYnVmZmVyLCBzaXplb2YoaW50MTZfdCksIGZyYW1lc1RvV3JpdGUsIGZpZCk7Ci0gICAgICAgICAgICAgICAgZnJhbWVzTGVmdCAtPSBmcmFtZXNUb1dyaXRlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgd3JpdHRlbiA9IChpbnQpIGZ3cml0ZShtRGF0YSwgc2l6ZW9mKGZsb2F0KSwgbUZyYW1lQ291bnRlciwgZmlkKTsKLSAgICAgICAgfQotICAgICAgICBmY2xvc2UoZmlkKTsKKyAgICAgICAgd3JpdHRlbiA9IHNmX3dyaXRlZl9mbG9hdChzbmRGaWxlLCBtRGF0YSwgbUZyYW1lQ291bnRlcik7CisKKyAgICAgICAgc2ZfY2xvc2Uoc25kRmlsZSk7CiAgICAgICAgIHJldHVybiB3cml0dGVuOwogICAgIH0KIAorICAgIGludCBsb2FkKGNvbnN0IGNoYXIgKmZpbGVOYW1lKSB7CisgICAgICAgIFNOREZJTEUgKnNuZEZpbGUgPSBudWxscHRyOworICAgICAgICBTRl9JTkZPIGluZm87CisKKyAgICAgICAgc25kRmlsZSA9IHNmX29wZW4oZmlsZU5hbWUsIFNGTV9SRUFELCAmaW5mbyk7CisgICAgICAgIGlmIChzbmRGaWxlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHByaW50ZigiQXVkaW9SZWNvcmRpbmc6OmxvYWQoJXMpIGZhaWxlZCB0byBvcGVuIGZpbGVcbiIsIGZpbGVOYW1lKTsKKyAgICAgICAgICAgIHJldHVybiAtZXJybm87CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnQoaW5mby5jaGFubmVscyA9PSAxKTsKKworICAgICAgICBhbGxvY2F0ZShpbmZvLmZyYW1lcyk7CisgICAgICAgIG1GcmFtZUNvdW50ZXIgPSBzZl9yZWFkZl9mbG9hdChzbmRGaWxlLCBtRGF0YSwgaW5mby5mcmFtZXMpOworCisgICAgICAgIHNmX2Nsb3NlKHNuZEZpbGUpOworICAgICAgICByZXR1cm4gbUZyYW1lQ291bnRlcjsKKyAgICB9CisKIHByaXZhdGU6CiAgICAgZmxvYXQgICptRGF0YSA9IG51bGxwdHI7CiAgICAgaW50MzJfdCBtRnJhbWVDb3VudGVyID0gMDsKICAgICBpbnQzMl90IG1NYXhGcmFtZXMgPSAwOworICAgIGludDMyX3QgbVNhbXBsZVJhdGUgPSA0ODAwMDsgLy8gY29tbW9uIGRlZmF1bHQKIH07CiAKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMzIwLDExICszNTIsMjUgQEAKIAogICAgIHZpcnR1YWwgdm9pZCBwcmludFN0YXR1cygpIHt9OwogCisgICAgdmlydHVhbCBpbnQgZ2V0UmVzdWx0KCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCiAgICAgdmlydHVhbCBib29sIGlzRG9uZSgpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHZvaWQgc2V0U2FtcGxlUmF0ZShpbnQzMl90IHNhbXBsZVJhdGUpIHsKKyAgICB2aXJ0dWFsIGludCBzYXZlKGNvbnN0IGNoYXIgKmZpbGVOYW1lKSB7CisgICAgICAgICh2b2lkKSBmaWxlTmFtZTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9VTklNUExFTUVOVEVEOworICAgIH0KKworICAgIHZpcnR1YWwgaW50IGxvYWQoY29uc3QgY2hhciAqZmlsZU5hbWUpIHsKKyAgICAgICAgKHZvaWQpIGZpbGVOYW1lOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOSU1QTEVNRU5URUQ7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHNldFNhbXBsZVJhdGUoaW50MzJfdCBzYW1wbGVSYXRlKSB7CiAgICAgICAgIG1TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKICAgICB9CiAKQEAgLTM2OCw4ICs0MTQsNyBAQAogCiAKIHN0YXRpYyB2b2lkIHByaW50QXVkaW9TY29wZShmbG9hdCBzYW1wbGUpIHsKLSAgICBjb25zdCBpbnQgbWF4U3RhcnMgPSA4MAotICAgIDsgLy8gYXJiaXRyYXJ5LCBmaXRzIG9uIG9uZSBsaW5lCisgICAgY29uc3QgaW50IG1heFN0YXJzID0gODA7IC8vIGFyYml0cmFyeSwgZml0cyBvbiBvbmUgbGluZQogICAgIGNoYXIgYyA9ICcqJzsKICAgICBpZiAoc2FtcGxlIDwgLTEuMCkgewogICAgICAgICBzYW1wbGUgPSAtMS4wOwpAQCAtMzk1LDcgKzQ0MCwxMyBAQAogcHVibGljOgogCiAgICAgRWNob0FuYWx5emVyKCkgOiBMb29wYmFja1Byb2Nlc3NvcigpIHsKLSAgICAgICAgYXVkaW9SZWNvcmRlci5hbGxvY2F0ZSgyICogTE9PUEJBQ0tfU0FNUExFX1JBVEUpOworICAgICAgICBtQXVkaW9SZWNvcmRpbmcuYWxsb2NhdGUoMiAqIGdldFNhbXBsZVJhdGUoKSk7CisgICAgICAgIG1BdWRpb1JlY29yZGluZy5zZXRTYW1wbGVSYXRlKGdldFNhbXBsZVJhdGUoKSk7CisgICAgfQorCisgICAgdm9pZCBzZXRTYW1wbGVSYXRlKGludDMyX3Qgc2FtcGxlUmF0ZSkgb3ZlcnJpZGUgeworICAgICAgICBMb29wYmFja1Byb2Nlc3Nvcjo6c2V0U2FtcGxlUmF0ZShzYW1wbGVSYXRlKTsKKyAgICAgICAgbUF1ZGlvUmVjb3JkaW5nLnNldFNhbXBsZVJhdGUoc2FtcGxlUmF0ZSk7CiAgICAgfQogCiAgICAgdm9pZCByZXNldCgpIG92ZXJyaWRlIHsKQEAgLTQwNiw4ICs0NTcsMTIgQEAKICAgICAgICAgbVN0YXRlID0gU1RBVEVfSU5JVElBTF9TSUxFTkNFOwogICAgIH0KIAorICAgIHZpcnR1YWwgaW50IGdldFJlc3VsdCgpIHsKKyAgICAgICAgcmV0dXJuIG1TdGF0ZSA9PSBTVEFURV9ET05FID8gMCA6IC0xOworICAgIH0KKwogICAgIHZpcnR1YWwgYm9vbCBpc0RvbmUoKSB7Ci0gICAgICAgIHJldHVybiBtU3RhdGUgPT0gU1RBVEVfRE9ORTsKKyAgICAgICAgcmV0dXJuIG1TdGF0ZSA9PSBTVEFURV9ET05FIHx8IG1TdGF0ZSA9PSBTVEFURV9GQUlMRUQ7CiAgICAgfQogCiAgICAgdm9pZCBzZXRHYWluKGZsb2F0IGdhaW4pIHsKQEAgLTQyMyw0NiArNDc4LDQ3IEBACiAgICAgICAgIHByaW50ZigiRWNob0FuYWx5emVyIC0tLS0tLS0tLS0tLS0tLVxuIik7CiAgICAgICAgIHByaW50ZihMT09QQkFDS19SRVNVTFRfVEFHICJtZWFzdXJlZC5nYWluICAgICAgICAgID0gJWZcbiIsIG1NZWFzdXJlZExvb3BHYWluKTsKICAgICAgICAgcHJpbnRmKExPT1BCQUNLX1JFU1VMVF9UQUcgImVjaG8uZ2FpbiAgICAgICAgICAgICAgPSAlZlxuIiwgbUVjaG9HYWluKTsKLSAgICAgICAgcHJpbnRmKExPT1BCQUNLX1JFU1VMVF9UQUcgImZyYW1lLmNvdW50ICAgICAgICAgICAgPSAlZFxuIiwgbUZyYW1lQ291bnRlcik7CiAgICAgICAgIHByaW50ZihMT09QQkFDS19SRVNVTFRfVEFHICJ0ZXN0LnN0YXRlICAgICAgICAgICAgID0gJWRcbiIsIG1TdGF0ZSk7CiAgICAgICAgIGlmIChtTWVhc3VyZWRMb29wR2FpbiA+PSAwLjk5OTkpIHsKICAgICAgICAgICAgIHByaW50ZigiICAgRVJST1IgLSBjbGlwcGluZywgdHVybiBkb3duIHZvbHVtZSBzbGlnaHRseVxuIik7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBjb25zdCBmbG9hdCAqbmVlZGxlID0gc19JbXB1bHNlOwogICAgICAgICAgICAgaW50IG5lZWRsZVNpemUgPSAoaW50KSAoc2l6ZW9mKHNfSW1wdWxzZSkgLyBzaXplb2YoZmxvYXQpKTsKLSAgICAgICAgICAgIGZsb2F0ICpoYXlzdGFjayA9IGF1ZGlvUmVjb3JkZXIuZ2V0RGF0YSgpOwotICAgICAgICAgICAgaW50IGhheXN0YWNrU2l6ZSA9IGF1ZGlvUmVjb3JkZXIuc2l6ZSgpOwotICAgICAgICAgICAgaW50IHJlc3VsdCA9IG1lYXN1cmVMYXRlbmN5RnJvbUVjaG9zKGhheXN0YWNrLCBoYXlzdGFja1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGxlLCBuZWVkbGVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsYXRlbmN5UmVwb3J0KTsKLSAgICAgICAgICAgIGlmIChsYXRlbmN5UmVwb3J0LmNvbmZpZGVuY2UgPCAwLjAxKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIgICBFUlJPUiAtIGNvbmZpZGVuY2UgdG9vIGxvdyA9ICVmXG4iLCBsYXRlbmN5UmVwb3J0LmNvbmZpZGVuY2UpOworICAgICAgICAgICAgZmxvYXQgKmhheXN0YWNrID0gbUF1ZGlvUmVjb3JkaW5nLmdldERhdGEoKTsKKyAgICAgICAgICAgIGludCBoYXlzdGFja1NpemUgPSBtQXVkaW9SZWNvcmRpbmcuc2l6ZSgpOworICAgICAgICAgICAgbWVhc3VyZUxhdGVuY3lGcm9tRWNob3MoaGF5c3RhY2ssIGhheXN0YWNrU2l6ZSwgbmVlZGxlLCBuZWVkbGVTaXplLCAmbUxhdGVuY3lSZXBvcnQpOworICAgICAgICAgICAgaWYgKG1MYXRlbmN5UmVwb3J0LmNvbmZpZGVuY2UgPCAwLjAxKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIgICBFUlJPUiAtIGNvbmZpZGVuY2UgdG9vIGxvdyA9ICVmXG4iLCBtTGF0ZW5jeVJlcG9ydC5jb25maWRlbmNlKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZG91YmxlIGxhdGVuY3lNaWxsaXMgPSAxMDAwLjAgKiBsYXRlbmN5UmVwb3J0LmxhdGVuY3lJbkZyYW1lcyAvIGdldFNhbXBsZVJhdGUoKTsKLSAgICAgICAgICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAibGF0ZW5jeS5mcmFtZXMgICAgICAgID0gJTguMmZcbiIsIGxhdGVuY3lSZXBvcnQubGF0ZW5jeUluRnJhbWVzKTsKKyAgICAgICAgICAgICAgICBkb3VibGUgbGF0ZW5jeU1pbGxpcyA9IDEwMDAuMCAqIG1MYXRlbmN5UmVwb3J0LmxhdGVuY3lJbkZyYW1lcyAvIGdldFNhbXBsZVJhdGUoKTsKKyAgICAgICAgICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAibGF0ZW5jeS5mcmFtZXMgICAgICAgID0gJTguMmZcbiIsIG1MYXRlbmN5UmVwb3J0LmxhdGVuY3lJbkZyYW1lcyk7CiAgICAgICAgICAgICAgICAgcHJpbnRmKExPT1BCQUNLX1JFU1VMVF9UQUcgImxhdGVuY3kubXNlYyAgICAgICAgICA9ICU4LjJmXG4iLCBsYXRlbmN5TWlsbGlzKTsKLSAgICAgICAgICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAibGF0ZW5jeS5jb25maWRlbmNlICAgID0gJTguNmZcbiIsIGxhdGVuY3lSZXBvcnQuY29uZmlkZW5jZSk7CisgICAgICAgICAgICAgICAgcHJpbnRmKExPT1BCQUNLX1JFU1VMVF9UQUcgImxhdGVuY3kuY29uZmlkZW5jZSAgICA9ICU4LjZmXG4iLCBtTGF0ZW5jeVJlcG9ydC5jb25maWRlbmNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotCi0gICAgICAgIHsKLSNkZWZpbmUgRUNIT19GSUxFTkFNRSAiL2RhdGEvb2JvZV9lY2hvLnJhdyIKLSAgICAgICAgICAgIGludCB3cml0dGVuID0gYXVkaW9SZWNvcmRlci5zYXZlKEVDSE9fRklMRU5BTUUpOwotICAgICAgICAgICAgcHJpbnRmKCJFY2hvIHdyb3RlICVkIG1vbm8gc2FtcGxlcyB0byAlcyBvbiBBbmRyb2lkIGRldmljZVxuIiwgd3JpdHRlbiwgRUNIT19GSUxFTkFNRSk7Ci0gICAgICAgIH0KICAgICB9CiAKICAgICB2b2lkIHByaW50U3RhdHVzKCkgb3ZlcnJpZGUgewotICAgICAgICBwcmludGYoInN0YXRlID0gJWQsIGVjaG8gZ2FpbiA9ICVmICIsIG1TdGF0ZSwgbUVjaG9HYWluKTsKKyAgICAgICAgcHJpbnRmKCJzdCA9ICVkLCBlY2hvIGdhaW4gPSAlZiAiLCBtU3RhdGUsIG1FY2hvR2Fpbik7CiAgICAgfQogCi0gICAgc3RhdGljIHZvaWQgc2VuZEltcHVsc2UoZmxvYXQgKm91dHB1dERhdGEsIGludCBvdXRwdXRDaGFubmVsQ291bnQpIHsKLSAgICAgICAgZm9yIChmbG9hdCBzYW1wbGUgOiBzX0ltcHVsc2UpIHsKKyAgICB2b2lkIHNlbmRJbXB1bHNlcyhmbG9hdCAqb3V0cHV0RGF0YSwgaW50IG91dHB1dENoYW5uZWxDb3VudCwgaW50IG51bUZyYW1lcykgeworICAgICAgICB3aGlsZSAobnVtRnJhbWVzLS0gPiAwKSB7CisgICAgICAgICAgICBmbG9hdCBzYW1wbGUgPSBzX0ltcHVsc2VbbVNhbXBsZUluZGV4KytdOworICAgICAgICAgICAgaWYgKG1TYW1wbGVJbmRleCA+PSBrSW1wdWxzZVNpemVJbkZyYW1lcykgeworICAgICAgICAgICAgICAgIG1TYW1wbGVJbmRleCA9IDA7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgICpvdXRwdXREYXRhID0gc2FtcGxlOwogICAgICAgICAgICAgb3V0cHV0RGF0YSArPSBvdXRwdXRDaGFubmVsQ291bnQ7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICB2b2lkIHNlbmRPbmVJbXB1bHNlKGZsb2F0ICpvdXRwdXREYXRhLCBpbnQgb3V0cHV0Q2hhbm5lbENvdW50KSB7CisgICAgICAgIG1TYW1wbGVJbmRleCA9IDA7CisgICAgICAgIHNlbmRJbXB1bHNlcyhvdXRwdXREYXRhLCBvdXRwdXRDaGFubmVsQ291bnQsIGtJbXB1bHNlU2l6ZUluRnJhbWVzKTsKKyAgICB9CisKICAgICB2b2lkIHByb2Nlc3MoZmxvYXQgKmlucHV0RGF0YSwgaW50IGlucHV0Q2hhbm5lbENvdW50LAogICAgICAgICAgICAgICAgICBmbG9hdCAqb3V0cHV0RGF0YSwgaW50IG91dHB1dENoYW5uZWxDb3VudCwKICAgICAgICAgICAgICAgICAgaW50IG51bUZyYW1lcykgb3ZlcnJpZGUgewpAQCAtNDg4LDI2ICs1NDQsMzEgQEAKICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgY2FzZSBTVEFURV9NRUFTVVJJTkdfR0FJTjoKLSAgICAgICAgICAgICAgICBzZW5kSW1wdWxzZShvdXRwdXREYXRhLCBvdXRwdXRDaGFubmVsQ291bnQpOworICAgICAgICAgICAgICAgIHNlbmRJbXB1bHNlcyhvdXRwdXREYXRhLCBvdXRwdXRDaGFubmVsQ291bnQsIG51bUZyYW1lcyk7CiAgICAgICAgICAgICAgICAgcGVhayA9IG1lYXN1cmVQZWFrQW1wbGl0dWRlKGlucHV0RGF0YSwgaW5wdXRDaGFubmVsQ291bnQsIG51bUZyYW1lcyk7CiAgICAgICAgICAgICAgICAgLy8gSWYgd2UgZ2V0IHNldmVyYWwgaW4gYSByb3cgdGhlbiBnbyB0byBuZXh0IHN0YXRlLgogICAgICAgICAgICAgICAgIGlmIChwZWFrID4gbVB1bHNlVGhyZXNob2xkKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtRG93bkNvdW50ZXItLSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXh0U3RhdGUgPSBTVEFURV9XQUlUSU5HX0ZPUl9TSUxFTkNFOwogICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmludGYoIiU1ZDogc3dpdGNoIHRvIFNUQVRFX1dBSVRJTkdfRk9SX1NJTEVOQ0UsIG1lYXN1cmVkIHBlYWsgPSAlZlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIG1Mb29wQ291bnRlciwgcGVhayk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtRG93bkNvdW50ZXIgPSA4OwogICAgICAgICAgICAgICAgICAgICAgICAgbU1lYXN1cmVkTG9vcEdhaW4gPSBwZWFrOyAgLy8gYXNzdW1lcyBvcmlnaW5hbCBwdWxzZSBhbXBsaXR1ZGUgaXMgb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgZ2FpbiB0aGF0IHdpbGwgZ2l2ZSB1cyBhIG5pY2UgZGVjYXlpbmcgZWNoby4KICAgICAgICAgICAgICAgICAgICAgICAgIG1FY2hvR2FpbiA9IG1EZXNpcmVkRWNob0dhaW4gLyBtTWVhc3VyZWRMb29wR2FpbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRWNob0dhaW4gPiBNQVhfRUNIT19HQUlOKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJFUlJPUiAtIGxvb3AgZ2FpbiB0b28gbG93LiBJbmNyZWFzZSB0aGUgdm9sdW1lLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFN0YXRlID0gU1RBVEVfRkFJTEVEOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U3RhdGUgPSBTVEFURV9XQUlUSU5HX0ZPUl9TSUxFTkNFOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bUZyYW1lcyA+IGtJbXB1bHNlU2l6ZUluRnJhbWVzKXsgLy8gaWdub3JlIHNob3J0IGNhbGxiYWNrcwogICAgICAgICAgICAgICAgICAgICBtRG93bkNvdW50ZXIgPSA4OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgY2FzZSBTVEFURV9XQUlUSU5HX0ZPUl9TSUxFTkNFOgotICAgICAgICAgICAgICAgIC8vIE91dHB1dCBzaWxlbmNlLgorICAgICAgICAgICAgICAgIC8vIE91dHB1dCBzaWxlbmNlIGFuZCB3YWl0IGZvciB0aGUgZWNob3MgdG8gZGllIGRvd24uCiAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcyA9IG51bUZyYW1lcyAqIG91dHB1dENoYW5uZWxDb3VudDsKICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVNhbXBsZXM7IGkrKykgewogICAgICAgICAgICAgICAgICAgICBvdXRwdXREYXRhW2ldID0gMDsKQEAgLTUyNiwxNCArNTg3LDE0IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGNhc2UgU1RBVEVfU0VORElOR19QVUxTRToKLSAgICAgICAgICAgICAgICBhdWRpb1JlY29yZGVyLndyaXRlKGlucHV0RGF0YSwgaW5wdXRDaGFubmVsQ291bnQsIG51bUZyYW1lcyk7Ci0gICAgICAgICAgICAgICAgc2VuZEltcHVsc2Uob3V0cHV0RGF0YSwgb3V0cHV0Q2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgICAgICBtQXVkaW9SZWNvcmRpbmcud3JpdGUoaW5wdXREYXRhLCBpbnB1dENoYW5uZWxDb3VudCwgbnVtRnJhbWVzKTsKKyAgICAgICAgICAgICAgICBzZW5kT25lSW1wdWxzZShvdXRwdXREYXRhLCBvdXRwdXRDaGFubmVsQ291bnQpOwogICAgICAgICAgICAgICAgIG5leHRTdGF0ZSA9IFNUQVRFX0dBVEhFUklOR19FQ0hPUzsKICAgICAgICAgICAgICAgICAvL3ByaW50ZigiJTVkOiBzd2l0Y2ggdG8gU1RBVEVfR0FUSEVSSU5HX0VDSE9TXG4iLCBtTG9vcENvdW50ZXIpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICBjYXNlIFNUQVRFX0dBVEhFUklOR19FQ0hPUzoKLSAgICAgICAgICAgICAgICBudW1Xcml0dGVuID0gYXVkaW9SZWNvcmRlci53cml0ZShpbnB1dERhdGEsIGlucHV0Q2hhbm5lbENvdW50LCBudW1GcmFtZXMpOworICAgICAgICAgICAgICAgIG51bVdyaXR0ZW4gPSBtQXVkaW9SZWNvcmRpbmcud3JpdGUoaW5wdXREYXRhLCBpbnB1dENoYW5uZWxDb3VudCwgbnVtRnJhbWVzKTsKICAgICAgICAgICAgICAgICBwZWFrID0gbWVhc3VyZVBlYWtBbXBsaXR1ZGUoaW5wdXREYXRhLCBpbnB1dENoYW5uZWxDb3VudCwgbnVtRnJhbWVzKTsKICAgICAgICAgICAgICAgICBpZiAocGVhayA+IG1NZWFzdXJlZExvb3BHYWluKSB7CiAgICAgICAgICAgICAgICAgICAgIG1NZWFzdXJlZExvb3BHYWluID0gcGVhazsgIC8vIEFHQyBtaWdodCBiZSByYWlzaW5nIGdhaW4gc28gYWRqdXN0IGl0IG9uIHRoZSBmbHkuCkBAIC01NjcsNiArNjI4LDE0IEBACiAgICAgICAgIG1Mb29wQ291bnRlcisrOwogICAgIH0KIAorICAgIGludCBzYXZlKGNvbnN0IGNoYXIgKmZpbGVOYW1lKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtQXVkaW9SZWNvcmRpbmcuc2F2ZShmaWxlTmFtZSk7CisgICAgfQorCisgICAgaW50IGxvYWQoY29uc3QgY2hhciAqZmlsZU5hbWUpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1BdWRpb1JlY29yZGluZy5sb2FkKGZpbGVOYW1lKTsKKyAgICB9CisKIHByaXZhdGU6CiAKICAgICBlbnVtIGVjaG9fc3RhdGVfdCB7CkBAIC01NzUsMjMgKzY0NCwyMyBAQAogICAgICAgICBTVEFURV9XQUlUSU5HX0ZPUl9TSUxFTkNFLAogICAgICAgICBTVEFURV9TRU5ESU5HX1BVTFNFLAogICAgICAgICBTVEFURV9HQVRIRVJJTkdfRUNIT1MsCi0gICAgICAgIFNUQVRFX0RPTkUKKyAgICAgICAgU1RBVEVfRE9ORSwKKyAgICAgICAgU1RBVEVfRkFJTEVECiAgICAgfTsKIAotICAgIGludCAgICAgICAgICAgbURvd25Db3VudGVyID0gNTAwOwotICAgIGludCAgICAgICAgICAgbUxvb3BDb3VudGVyID0gMDsKLSAgICBpbnQgICAgICAgICAgIG1Mb29wU3RhcnQgPSAxMDAwOwotICAgIGZsb2F0ICAgICAgICAgbVB1bHNlVGhyZXNob2xkID0gMC4wMmY7Ci0gICAgZmxvYXQgICAgICAgICBtU2lsZW5jZVRocmVzaG9sZCA9IDAuMDAyZjsKLSAgICBmbG9hdCAgICAgICAgIG1NZWFzdXJlZExvb3BHYWluID0gMC4wZjsKLSAgICBmbG9hdCAgICAgICAgIG1EZXNpcmVkRWNob0dhaW4gPSAwLjk1ZjsKLSAgICBmbG9hdCAgICAgICAgIG1FY2hvR2FpbiA9IDEuMGY7Ci0gICAgZWNob19zdGF0ZV90ICBtU3RhdGUgPSBTVEFURV9JTklUSUFMX1NJTEVOQ0U7Ci0gICAgaW50MzJfdCAgICAgICBtRnJhbWVDb3VudGVyID0gMDsKKyAgICBpbnQzMl90ICAgICAgICAgbURvd25Db3VudGVyID0gNTAwOworICAgIGludDMyX3QgICAgICAgICBtTG9vcENvdW50ZXIgPSAwOworICAgIGludDMyX3QgICAgICAgICBtU2FtcGxlSW5kZXggPSAwOworICAgIGZsb2F0ICAgICAgICAgICBtUHVsc2VUaHJlc2hvbGQgPSAwLjAyZjsKKyAgICBmbG9hdCAgICAgICAgICAgbVNpbGVuY2VUaHJlc2hvbGQgPSAwLjAwMmY7CisgICAgZmxvYXQgICAgICAgICAgIG1NZWFzdXJlZExvb3BHYWluID0gMC4wZjsKKyAgICBmbG9hdCAgICAgICAgICAgbURlc2lyZWRFY2hvR2FpbiA9IDAuOTVmOworICAgIGZsb2F0ICAgICAgICAgICBtRWNob0dhaW4gPSAxLjBmOworICAgIGVjaG9fc3RhdGVfdCAgICBtU3RhdGUgPSBTVEFURV9JTklUSUFMX1NJTEVOQ0U7CiAKLSAgICBBdWRpb1JlY29yZGluZyAgICAgYXVkaW9SZWNvcmRlcjsKLSAgICBMYXRlbmN5UmVwb3J0ICAgICAgbGF0ZW5jeVJlcG9ydDsKLSAgICBQZWFrRGV0ZWN0b3IgICAgICAgbVBlYWtEZXRlY3RvcjsKKyAgICBBdWRpb1JlY29yZGluZyAgbUF1ZGlvUmVjb3JkaW5nOyAvLyBjb250YWlucyBvbmx5IHRoZSBpbnB1dCBhZnRlciB0aGUgZ2FpbiBkZXRlY3Rpb24gYnVyc3QKKyAgICBMYXRlbmN5UmVwb3J0ICAgbUxhdGVuY3lSZXBvcnQ7CisgICAgLy8gUGVha0RldGVjdG9yICAgIG1QZWFrRGV0ZWN0b3I7CiB9OwogCiAKQEAgLTYwNSw2ICs2NzQsMTAgQEAKIGNsYXNzIFNpbmVBbmFseXplciA6IHB1YmxpYyBMb29wYmFja1Byb2Nlc3NvciB7CiBwdWJsaWM6CiAKKyAgICB2aXJ0dWFsIGludCBnZXRSZXN1bHQoKSB7CisgICAgICAgIHJldHVybiBtU3RhdGUgPT0gU1RBVEVfTE9DS0VEID8gMCA6IC0xOworICAgIH0KKwogICAgIHZvaWQgcmVwb3J0KCkgb3ZlcnJpZGUgewogICAgICAgICBwcmludGYoIlNpbmVBbmFseXplciAtLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwogICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAicGVhay5hbXBsaXR1ZGUgICAgID0gJTcuNWZcbiIsIG1QZWFrQW1wbGl0dWRlKTsKQEAgLTYxMiw3ICs2ODUsNyBAQAogICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAicGhhc2Uub2Zmc2V0ICAgICAgID0gJTcuNWZcbiIsIG1QaGFzZU9mZnNldCk7CiAgICAgICAgIHByaW50ZihMT09QQkFDS19SRVNVTFRfVEFHICJyZWYucGhhc2UgICAgICAgICAgPSAlNy41ZlxuIiwgbVBoYXNlKTsKICAgICAgICAgcHJpbnRmKExPT1BCQUNLX1JFU1VMVF9UQUcgImZyYW1lcy5hY2N1bXVsYXRlZCA9ICU2ZFxuIiwgbUZyYW1lc0FjY3VtdWxhdGVkKTsKLSAgICAgICAgcHJpbnRmKExPT1BCQUNLX1JFU1VMVF9UQUcgInNpbmUucGVyaW9kICAgICAgICA9ICU2ZFxuIiwgbVBlcmlvZCk7CisgICAgICAgIHByaW50ZihMT09QQkFDS19SRVNVTFRfVEFHICJzaW5lLnBlcmlvZCAgICAgICAgPSAlNmRcbiIsIG1TaW5lUGVyaW9kKTsKICAgICAgICAgcHJpbnRmKExPT1BCQUNLX1JFU1VMVF9UQUcgInRlc3Quc3RhdGUgICAgICAgICA9ICU2ZFxuIiwgbVN0YXRlKTsKICAgICAgICAgcHJpbnRmKExPT1BCQUNLX1JFU1VMVF9UQUcgImZyYW1lLmNvdW50ICAgICAgICA9ICU2ZFxuIiwgbUZyYW1lQ291bnRlcik7CiAgICAgICAgIC8vIERpZCB3ZSBldmVyIGdldCBhIGxvY2s/CkBAIC02MjYsNyArNjk5LDcgQEAKICAgICB9CiAKICAgICB2b2lkIHByaW50U3RhdHVzKCkgb3ZlcnJpZGUgewotICAgICAgICBwcmludGYoIiAgc3RhdGUgPSAlZCwgZ2xpdGNoZXMgPSAlZCwiLCBtU3RhdGUsIG1HbGl0Y2hDb3VudCk7CisgICAgICAgIHByaW50Zigic3QgPSAlZCwgI2dsID0gJTNkLCIsIG1TdGF0ZSwgbUdsaXRjaENvdW50KTsKICAgICB9CiAKICAgICBkb3VibGUgY2FsY3VsYXRlTWFnbml0dWRlKGRvdWJsZSAqcGhhc2VQdHIgPSBOVUxMKSB7CkBAIC02NTEsNyArNzI0LDggQEAKICAgICB2b2lkIHByb2Nlc3MoZmxvYXQgKmlucHV0RGF0YSwgaW50IGlucHV0Q2hhbm5lbENvdW50LAogICAgICAgICAgICAgICAgICBmbG9hdCAqb3V0cHV0RGF0YSwgaW50IG91dHB1dENoYW5uZWxDb3VudCwKICAgICAgICAgICAgICAgICAgaW50IG51bUZyYW1lcykgb3ZlcnJpZGUgewotICAgICAgICBmbG9hdCBzYW1wbGU7CisgICAgICAgIG1Qcm9jZXNzQ291bnQrKzsKKwogICAgICAgICBmbG9hdCBwZWFrID0gbWVhc3VyZVBlYWtBbXBsaXR1ZGUoaW5wdXREYXRhLCBpbnB1dENoYW5uZWxDb3VudCwgbnVtRnJhbWVzKTsKICAgICAgICAgaWYgKHBlYWsgPiBtUGVha0FtcGxpdHVkZSkgewogICAgICAgICAgICAgbVBlYWtBbXBsaXR1ZGUgPSBwZWFrOwpAQCAtNjYzLDYgKzczNyw3IEBACiAgICAgICAgICAgICBmbG9hdCBzaW5PdXQgPSBzaW5mKG1QaGFzZSk7CiAKICAgICAgICAgICAgIHN3aXRjaCAobVN0YXRlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9JRExFOgogICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfSU1NVU5FOgogICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfV0FJVElOR19GT1JfU0lHTkFMOgogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTY3MSw3ICs3NDYsNyBAQAogICAgICAgICAgICAgICAgICAgICBtQ29zQWNjdW11bGF0b3IgKz0gc2FtcGxlICogY29zZihtUGhhc2UpOwogICAgICAgICAgICAgICAgICAgICBtRnJhbWVzQWNjdW11bGF0ZWQrKzsKICAgICAgICAgICAgICAgICAgICAgLy8gTXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBwZXJpb2Qgb3IgdGhlIGNhbGN1bGF0aW9uIHdpbGwgbm90IGJlIGFjY3VyYXRlLgotICAgICAgICAgICAgICAgICAgICBpZiAobUZyYW1lc0FjY3VtdWxhdGVkID09IG1QZXJpb2QgKiA0KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtRnJhbWVzQWNjdW11bGF0ZWQgPT0gbVNpbmVQZXJpb2QgKiBQRVJJT0RTX05FRURFRF9GT1JfTE9DSykgewogICAgICAgICAgICAgICAgICAgICAgICAgbVBoYXNlT2Zmc2V0ID0gMC4wOwogICAgICAgICAgICAgICAgICAgICAgICAgbU1hZ25pdHVkZSA9IGNhbGN1bGF0ZU1hZ25pdHVkZSgmbVBoYXNlT2Zmc2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtTWFnbml0dWRlID4gbVRocmVzaG9sZCkgewpAQCAtNjk3LDcgKzc3MiwyMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgbUZyYW1lQ291bnRlciwgbUdsaXRjaENvdW50LCBwcmVkaWN0ZWQsIHNhbXBsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9JTU1VTkU7CiAgICAgICAgICAgICAgICAgICAgICAgICAvL3ByaW50ZigiJTVkOiBzd2l0Y2ggdG8gU1RBVEVfSU1NVU5FXG4iLCBtRnJhbWVDb3VudGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Eb3duQ291bnRlciA9IG1QZXJpb2Q7ICAvLyBTZXQgZHVyYXRpb24gb2YgSU1NVU5FIHN0YXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgbURvd25Db3VudGVyID0gbVNpbmVQZXJpb2Q7ICAvLyBTZXQgZHVyYXRpb24gb2YgSU1NVU5FIHN0YXRlLgorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVHJhY2sgaW5jb21pbmcgc2lnbmFsIGFuZCBzbG93bHkgYWRqdXN0IG1hZ25pdHVkZSB0byBhY2NvdW50CisgICAgICAgICAgICAgICAgICAgIC8vIGZvciBkcmlmdCBpbiB0aGUgRFJDIG9yIEFHQy4KKyAgICAgICAgICAgICAgICAgICAgbVNpbkFjY3VtdWxhdG9yICs9IHNhbXBsZSAqIHNpbk91dDsKKyAgICAgICAgICAgICAgICAgICAgbUNvc0FjY3VtdWxhdG9yICs9IHNhbXBsZSAqIGNvc2YobVBoYXNlKTsKKyAgICAgICAgICAgICAgICAgICAgbUZyYW1lc0FjY3VtdWxhdGVkKys7CisgICAgICAgICAgICAgICAgICAgIC8vIE11c3QgYmUgYSBtdWx0aXBsZSBvZiB0aGUgcGVyaW9kIG9yIHRoZSBjYWxjdWxhdGlvbiB3aWxsIG5vdCBiZSBhY2N1cmF0ZS4KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1GcmFtZXNBY2N1bXVsYXRlZCA9PSBtU2luZVBlcmlvZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlIGNvZWZmaWNpZW50ID0gMC4xOworICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBoYXNlT2Zmc2V0ID0gMC4wOworICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG1hZ25pdHVkZSA9IGNhbGN1bGF0ZU1hZ25pdHVkZSgmcGhhc2VPZmZzZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25lIHBvbGUgYXZlcmFnaW5nIGZpbHRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1NYWduaXR1ZGUgPSAobU1hZ25pdHVkZSAqICgxLjAgLSBjb2VmZmljaWVudCkpICsgKG1hZ25pdHVkZSAqIGNvZWZmaWNpZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0QWNjdW11bGF0b3IoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC03MTgsNiArODA4LDkgQEAKIAogICAgICAgICAvLyBEbyB0aGVzZSBvbmNlIHBlciBidWZmZXIuCiAgICAgICAgIHN3aXRjaCAobVN0YXRlKSB7CisgICAgICAgICAgICBjYXNlIFNUQVRFX0lETEU6CisgICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfSU1NVU5FOyAvLyBzbyB3ZSBjYW4gdGVsbCB3aGVuCisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFNUQVRFX0lNTVVORToKICAgICAgICAgICAgICAgICBtRG93bkNvdW50ZXIgLT0gbnVtRnJhbWVzOwogICAgICAgICAgICAgICAgIGlmIChtRG93bkNvdW50ZXIgPD0gMCkgewpAQCAtNzQ4LDIxICs4NDEsMjkgQEAKICAgICB2b2lkIHJlc2V0KCkgb3ZlcnJpZGUgewogICAgICAgICBtR2xpdGNoQ291bnQgPSAwOwogICAgICAgICBtU3RhdGUgPSBTVEFURV9JTU1VTkU7Ci0gICAgICAgIG1QaGFzZUluY3JlbWVudCA9IDIuMCAqIE1fUEkgLyBtUGVyaW9kOwotICAgICAgICBwcmludGYoInBoYXNlSW5jID0gJWYgZm9yIHBlcmlvZCAlZFxuIiwgbVBoYXNlSW5jcmVtZW50LCBtUGVyaW9kKTsKKyAgICAgICAgbURvd25Db3VudGVyID0gSU1NVU5FX0ZSQU1FX0NPVU5UOworICAgICAgICBtUGhhc2VJbmNyZW1lbnQgPSAyLjAgKiBNX1BJIC8gbVNpbmVQZXJpb2Q7CisgICAgICAgIHByaW50ZigicGhhc2VJbmMgPSAlZiBmb3IgcGVyaW9kICVkXG4iLCBtUGhhc2VJbmNyZW1lbnQsIG1TaW5lUGVyaW9kKTsKICAgICAgICAgcmVzZXRBY2N1bXVsYXRvcigpOworICAgICAgICBtUHJvY2Vzc0NvdW50ID0gMDsKICAgICB9CiAKIHByaXZhdGU6CiAKICAgICBlbnVtIHNpbmVfc3RhdGVfdCB7CisgICAgICAgIFNUQVRFX0lETEUsCiAgICAgICAgIFNUQVRFX0lNTVVORSwKICAgICAgICAgU1RBVEVfV0FJVElOR19GT1JfU0lHTkFMLAogICAgICAgICBTVEFURV9XQUlUSU5HX0ZPUl9MT0NLLAogICAgICAgICBTVEFURV9MT0NLRUQKICAgICB9OwogCi0gICAgaW50ICAgICBtUGVyaW9kID0gNzk7CisgICAgZW51bSBjb25zdGFudHMgeworICAgICAgICBJTU1VTkVfRlJBTUVfQ09VTlQgPSA0OCAqIDUwMCwKKyAgICAgICAgUEVSSU9EU19ORUVERURfRk9SX0xPQ0sgPSA4CisgICAgfTsKKworICAgIGludCAgICAgbVNpbmVQZXJpb2QgPSA3OTsKICAgICBkb3VibGUgIG1QaGFzZUluY3JlbWVudCA9IDAuMDsKICAgICBkb3VibGUgIG1QaGFzZSA9IDAuMDsKICAgICBkb3VibGUgIG1QaGFzZU9mZnNldCA9IDAuMDsKQEAgLTc3MSwyMCArODcyLDE5IEBACiAgICAgZG91YmxlICBtVGhyZXNob2xkID0gMC4wMDU7CiAgICAgZG91YmxlICBtVG9sZXJhbmNlID0gMC4wMTsKICAgICBpbnQzMl90IG1GcmFtZXNBY2N1bXVsYXRlZCA9IDA7CisgICAgaW50MzJfdCBtUHJvY2Vzc0NvdW50ID0gMDsKICAgICBkb3VibGUgIG1TaW5BY2N1bXVsYXRvciA9IDAuMDsKICAgICBkb3VibGUgIG1Db3NBY2N1bXVsYXRvciA9IDAuMDsKICAgICBpbnQzMl90IG1HbGl0Y2hDb3VudCA9IDA7CiAgICAgZG91YmxlICBtUGVha0FtcGxpdHVkZSA9IDAuMDsKLSAgICBpbnQgICAgIG1Eb3duQ291bnRlciA9IDQwMDA7CisgICAgaW50ICAgICBtRG93bkNvdW50ZXIgPSBJTU1VTkVfRlJBTUVfQ09VTlQ7CiAgICAgaW50MzJfdCBtRnJhbWVDb3VudGVyID0gMDsKICAgICBmbG9hdCAgIG1PdXRwdXRBbXBsaXR1ZGUgPSAwLjc1OwogCi0gICAgaW50MzJfdCBtWmVyb0Nyb3NzaW5ncyA9IDA7Ci0KICAgICBQc2V1ZG9SYW5kb20gIG1XaGl0ZU5vaXNlOwogICAgIGZsb2F0ICAgbU5vaXNlQW1wbGl0dWRlID0gMC4wMDsgLy8gVXNlZCB0byBleHBlcmltZW50IHdpdGggd2FyYmxpbmcgY2F1c2VkIGJ5IERSQy4KIAotICAgIHNpbmVfc3RhdGVfdCAgbVN0YXRlID0gU1RBVEVfSU1NVU5FOworICAgIHNpbmVfc3RhdGVfdCAgbVN0YXRlID0gU1RBVEVfSURMRTsKIH07CiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9sb29wYmFjay5jcHAgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL2xvb3BiYWNrLmNwcAppbmRleCBkZjBkZjA0Li45MWViZjczIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL2xvb3BiYWNrLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL2xvb3BiYWNrLmNwcApAQCAtMTksOSArMTksMTIgQEAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8Y2N0eXBlPgorI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8bWF0aC5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CkBAIC0zNCwyMyArMzcsMzIgQEAKIAogLy8gVGFnIGZvciBtYWNoaW5lIHJlYWRhYmxlIHJlc3VsdHMgYXMgcHJvcGVydHkgPSB2YWx1ZSBwYWlycwogI2RlZmluZSBSRVNVTFRfVEFHICAgICAgICAgICAgICAiUkVTVUxUOiAiCi0jZGVmaW5lIFNBTVBMRV9SQVRFICAgICAgICAgICAgIDQ4MDAwCiAjZGVmaW5lIE5VTV9TRUNPTkRTICAgICAgICAgICAgIDUKKyNkZWZpbmUgUEVSSU9EX01JTExJUyAgICAgICAgICAgMTAwMAogI2RlZmluZSBOVU1fSU5QVVRfQ0hBTk5FTFMgICAgICAxCi0jZGVmaW5lIEZJTEVOQU1FICAgICAgICAgICAgICAgICIvZGF0YS9vYm9lX2lucHV0LnJhdyIKLSNkZWZpbmUgQVBQX1ZFUlNJT04gICAgICAgICAgICAgIjAuMS4yMiIKKyNkZWZpbmUgRklMRU5BTUVfQUxMICAgICAgICAgICAgIi9kYXRhL2xvb3BiYWNrX2FsbC53YXYiCisjZGVmaW5lIEZJTEVOQU1FX0VDSE9TICAgICAgICAgICIvZGF0YS9sb29wYmFja19lY2hvcy53YXYiCisjZGVmaW5lIEFQUF9WRVJTSU9OICAgICAgICAgICAgICIwLjIuMDQiCisKK2NvbnN0ZXhwciBpbnQga051bUNhbGxiYWNrc1RvRHJhaW4gICA9IDIwOworY29uc3RleHByIGludCBrTnVtQ2FsbGJhY2tzVG9EaXNjYXJkID0gMjA7CiAKIHN0cnVjdCBMb29wYmFja0RhdGEgewogICAgIEFBdWRpb1N0cmVhbSAgICAgICppbnB1dFN0cmVhbSA9IG51bGxwdHI7CiAgICAgaW50MzJfdCAgICAgICAgICAgIGlucHV0RnJhbWVzTWF4aW11bSA9IDA7Ci0gICAgaW50MTZfdCAgICAgICAgICAgKmlucHV0RGF0YSA9IG51bGxwdHI7Ci0gICAgaW50MTZfdCAgICAgICAgICAgIHBlYWtTaG9ydCA9IDA7Ci0gICAgZmxvYXQgICAgICAgICAgICAgKmNvbnZlcnNpb25CdWZmZXIgPSBudWxscHRyOworICAgIGludDE2X3QgICAgICAgICAgICppbnB1dFNob3J0RGF0YSA9IG51bGxwdHI7CisgICAgZmxvYXQgICAgICAgICAgICAgKmlucHV0RmxvYXREYXRhID0gbnVsbHB0cjsKKyAgICBhYXVkaW9fZm9ybWF0X3QgICAgYWN0dWFsSW5wdXRGb3JtYXQgPSBBQVVESU9fRk9STUFUX0lOVkFMSUQ7CiAgICAgaW50MzJfdCAgICAgICAgICAgIGFjdHVhbElucHV0Q2hhbm5lbENvdW50ID0gMDsKICAgICBpbnQzMl90ICAgICAgICAgICAgYWN0dWFsT3V0cHV0Q2hhbm5lbENvdW50ID0gMDsKLSAgICBpbnQzMl90ICAgICAgICAgICAgaW5wdXRCdWZmZXJzVG9EaXNjYXJkID0gMTA7CisgICAgaW50MzJfdCAgICAgICAgICAgIG51bUNhbGxiYWNrc1RvRHJhaW4gPSBrTnVtQ2FsbGJhY2tzVG9EcmFpbjsKKyAgICBpbnQzMl90ICAgICAgICAgICAgbnVtQ2FsbGJhY2tzVG9EaXNjYXJkID0ga051bUNhbGxiYWNrc1RvRGlzY2FyZDsKICAgICBpbnQzMl90ICAgICAgICAgICAgbWluTnVtRnJhbWVzID0gSU5UMzJfTUFYOwogICAgIGludDMyX3QgICAgICAgICAgICBtYXhOdW1GcmFtZXMgPSAwOworICAgIGludDMyX3QgICAgICAgICAgICBpbnN1ZmZpY2llbnRSZWFkQ291bnQgPSAwOworICAgIGludDMyX3QgICAgICAgICAgICBpbnN1ZmZpY2llbnRSZWFkRnJhbWVzID0gMDsKKyAgICBpbnQzMl90ICAgICAgICAgICAgZnJhbWVzUmVhZFRvdGFsID0gMDsKKyAgICBpbnQzMl90ICAgICAgICAgICAgZnJhbWVzV3JpdHRlblRvdGFsID0gMDsKICAgICBib29sICAgICAgICAgICAgICAgaXNEb25lID0gZmFsc2U7CiAKICAgICBhYXVkaW9fcmVzdWx0X3QgICAgaW5wdXRFcnJvciA9IEFBVURJT19PSzsKQEAgLTU4LDE0ICs3MCwxNCBAQAogCiAgICAgU2luZUFuYWx5emVyICAgICAgIHNpbmVBbmFseXplcjsKICAgICBFY2hvQW5hbHl6ZXIgICAgICAgZWNob0FuYWx5emVyOwotICAgIEF1ZGlvUmVjb3JkaW5nICAgICBhdWRpb1JlY29yZGVyOworICAgIEF1ZGlvUmVjb3JkaW5nICAgICBhdWRpb1JlY29yZGluZzsKICAgICBMb29wYmFja1Byb2Nlc3NvciAqbG9vcGJhY2tQcm9jZXNzb3I7CiB9OwogCiBzdGF0aWMgdm9pZCBjb252ZXJ0UGNtMTZUb0Zsb2F0KGNvbnN0IGludDE2X3QgKnNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmRlc3RpbmF0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMpIHsKLSAgICBjb25zdCBmbG9hdCBzY2FsZXIgPSAxLjBmIC8gMzI3NjguMGY7CisgICAgY29uc3RleHByIGZsb2F0IHNjYWxlciA9IDEuMGYgLyAzMjc2OC4wZjsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVNhbXBsZXM7IGkrKykgewogICAgICAgICBkZXN0aW5hdGlvbltpXSA9IHNvdXJjZVtpXSAqIHNjYWxlcjsKICAgICB9CkBAIC03NSw2ICs4NywzMSBAQAogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBDQUxMQkFDSyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIC8vIENhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgZmlsbHMgdGhlIGF1ZGlvIG91dHB1dCBidWZmZXIuCisKK3N0YXRpYyBpbnQzMl90IHJlYWRGb3JtYXR0ZWREYXRhKExvb3BiYWNrRGF0YSAqbXlEYXRhLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIGludDMyX3QgZnJhbWVzUmVhZCA9IEFBVURJT19FUlJPUl9JTlZBTElEX0ZPUk1BVDsKKyAgICBpZiAobXlEYXRhLT5hY3R1YWxJbnB1dEZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKKyAgICAgICAgZnJhbWVzUmVhZCA9IEFBdWRpb1N0cmVhbV9yZWFkKG15RGF0YS0+aW5wdXRTdHJlYW0sIG15RGF0YS0+aW5wdXRTaG9ydERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIHRpbWVvdXROYW5vc2Vjb25kcyAqLyk7CisgICAgfSBlbHNlIGlmIChteURhdGEtPmFjdHVhbElucHV0Rm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7CisgICAgICAgIGZyYW1lc1JlYWQgPSBBQXVkaW9TdHJlYW1fcmVhZChteURhdGEtPmlucHV0U3RyZWFtLCBteURhdGEtPmlucHV0RmxvYXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiB0aW1lb3V0TmFub3NlY29uZHMgKi8pOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiRVJST1IgYWN0dWFsSW5wdXRGb3JtYXQgPSAlZFxuIiwgbXlEYXRhLT5hY3R1YWxJbnB1dEZvcm1hdCk7CisgICAgICAgIGFzc2VydChmYWxzZSk7CisgICAgfQorICAgIGlmIChmcmFtZXNSZWFkIDwgMCkgeworICAgICAgICBteURhdGEtPmlucHV0RXJyb3IgPSBmcmFtZXNSZWFkOworICAgICAgICBwcmludGYoIkVSUk9SIGluIHJlYWQgPSAlZCA9ICVzXG4iLCBmcmFtZXNSZWFkLAorICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQoZnJhbWVzUmVhZCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIG15RGF0YS0+ZnJhbWVzUmVhZFRvdGFsICs9IGZyYW1lc1JlYWQ7CisgICAgfQorICAgIHJldHVybiBmcmFtZXNSZWFkOworfQorCiBzdGF0aWMgYWF1ZGlvX2RhdGFfY2FsbGJhY2tfcmVzdWx0X3QgTXlEYXRhQ2FsbGJhY2tQcm9jKAogICAgICAgICBBQXVkaW9TdHJlYW0gKm91dHB1dFN0cmVhbSwKICAgICAgICAgdm9pZCAqdXNlckRhdGEsCkBAIC04Nyw3ICsxMjQsNyBAQAogICAgIGZsb2F0ICAqb3V0cHV0RGF0YSA9IChmbG9hdCAgKikgYXVkaW9EYXRhOwogCiAgICAgLy8gUmVhZCBhdWRpbyBkYXRhIGZyb20gdGhlIGlucHV0IHN0cmVhbS4KLSAgICBpbnQzMl90IGZyYW1lc1JlYWQ7CisgICAgaW50MzJfdCBhY3R1YWxGcmFtZXNSZWFkOwogCiAgICAgaWYgKG51bUZyYW1lcyA+IG15RGF0YS0+aW5wdXRGcmFtZXNNYXhpbXVtKSB7CiAgICAgICAgIG15RGF0YS0+aW5wdXRFcnJvciA9IEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7CkBAIC0xMDEsNDYgKzEzOCw4NiBAQAogICAgICAgICBteURhdGEtPm1pbk51bUZyYW1lcyA9IG51bUZyYW1lczsKICAgICB9CiAKLSAgICBpZiAobXlEYXRhLT5pbnB1dEJ1ZmZlcnNUb0Rpc2NhcmQgPiAwKSB7CisgICAgLy8gU2lsZW5jZSB0aGUgb3V0cHV0LgorICAgIGludDMyX3QgbnVtQnl0ZXMgPSBudW1GcmFtZXMgKiBteURhdGEtPmFjdHVhbE91dHB1dENoYW5uZWxDb3VudCAqIHNpemVvZihmbG9hdCk7CisgICAgbWVtc2V0KGF1ZGlvRGF0YSwgMCAvKiB2YWx1ZSAqLywgbnVtQnl0ZXMpOworCisgICAgaWYgKG15RGF0YS0+bnVtQ2FsbGJhY2tzVG9EcmFpbiA+IDApIHsKICAgICAgICAgLy8gRHJhaW4gdGhlIGlucHV0LgorICAgICAgICBpbnQzMl90IHRvdGFsRnJhbWVzUmVhZCA9IDA7CiAgICAgICAgIGRvIHsKLSAgICAgICAgICAgIGZyYW1lc1JlYWQgPSBBQXVkaW9TdHJlYW1fcmVhZChteURhdGEtPmlucHV0U3RyZWFtLCBteURhdGEtPmlucHV0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcywgMCk7Ci0gICAgICAgICAgICBpZiAoZnJhbWVzUmVhZCA8IDApIHsKLSAgICAgICAgICAgICAgICBteURhdGEtPmlucHV0RXJyb3IgPSBmcmFtZXNSZWFkOwotICAgICAgICAgICAgICAgIHByaW50ZigiRVJST1IgaW4gcmVhZCA9ICVkIiwgZnJhbWVzUmVhZCk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QOwotICAgICAgICAgICAgfSBlbHNlIGlmIChmcmFtZXNSZWFkID4gMCkgewotICAgICAgICAgICAgICAgIG15RGF0YS0+aW5wdXRCdWZmZXJzVG9EaXNjYXJkLS07CisgICAgICAgICAgICBhY3R1YWxGcmFtZXNSZWFkID0gcmVhZEZvcm1hdHRlZERhdGEobXlEYXRhLCBudW1GcmFtZXMpOworICAgICAgICAgICAgaWYgKGFjdHVhbEZyYW1lc1JlYWQpIHsKKyAgICAgICAgICAgICAgICB0b3RhbEZyYW1lc1JlYWQgKz0gYWN0dWFsRnJhbWVzUmVhZDsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZShmcmFtZXNSZWFkID4gMCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZnJhbWVzUmVhZCA9IEFBdWRpb1N0cmVhbV9yZWFkKG15RGF0YS0+aW5wdXRTdHJlYW0sIG15RGF0YS0+aW5wdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLCAwKTsKLSAgICAgICAgaWYgKGZyYW1lc1JlYWQgPCAwKSB7Ci0gICAgICAgICAgICBteURhdGEtPmlucHV0RXJyb3IgPSBmcmFtZXNSZWFkOwotICAgICAgICAgICAgcHJpbnRmKCJFUlJPUiBpbiByZWFkID0gJWQiLCBmcmFtZXNSZWFkKTsKKyAgICAgICAgICAgIC8vIElnbm9yZSBlcnJvcnMgYmVjYXVzZSBpbnB1dCBzdHJlYW0gbWF5IG5vdCBiZSBzdGFydGVkIHlldC4KKyAgICAgICAgfSB3aGlsZSAoYWN0dWFsRnJhbWVzUmVhZCA+IDApOworICAgICAgICAvLyBPbmx5IGNvdW50cyBpZiB3ZSBhY3R1YWxseSBnb3Qgc29tZSBkYXRhLgorICAgICAgICBpZiAodG90YWxGcmFtZXNSZWFkID4gMCkgeworICAgICAgICAgICAgbXlEYXRhLT5udW1DYWxsYmFja3NUb0RyYWluLS07CisgICAgICAgIH0KKworICAgIH0gZWxzZSBpZiAobXlEYXRhLT5udW1DYWxsYmFja3NUb0Rpc2NhcmQgPiAwKSB7CisgICAgICAgIC8vIElnbm9yZS4gQWxsb3cgdGhlIGlucHV0IHRvIGZpbGwgYmFjayB1cCB0byBlcXVpbGlicml1bSB3aXRoIHRoZSBvdXRwdXQuCisgICAgICAgIGFjdHVhbEZyYW1lc1JlYWQgPSByZWFkRm9ybWF0dGVkRGF0YShteURhdGEsIG51bUZyYW1lcyk7CisgICAgICAgIGlmIChhY3R1YWxGcmFtZXNSZWFkIDwgMCkgewogICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QOwotICAgICAgICB9IGVsc2UgaWYgKGZyYW1lc1JlYWQgPiAwKSB7CisgICAgICAgIH0KKyAgICAgICAgbXlEYXRhLT5udW1DYWxsYmFja3NUb0Rpc2NhcmQtLTsKIAotICAgICAgICAgICAgbXlEYXRhLT5hdWRpb1JlY29yZGVyLndyaXRlKG15RGF0YS0+aW5wdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15RGF0YS0+YWN0dWFsSW5wdXRDaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzKTsKKyAgICB9IGVsc2UgewogCi0gICAgICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMgPSBmcmFtZXNSZWFkICogbXlEYXRhLT5hY3R1YWxJbnB1dENoYW5uZWxDb3VudDsKLSAgICAgICAgICAgIGNvbnZlcnRQY20xNlRvRmxvYXQobXlEYXRhLT5pbnB1dERhdGEsIG15RGF0YS0+Y29udmVyc2lvbkJ1ZmZlciwgbnVtU2FtcGxlcyk7CisgICAgICAgIGludDMyX3QgbnVtSW5wdXRCeXRlcyA9IG51bUZyYW1lcyAqIG15RGF0YS0+YWN0dWFsSW5wdXRDaGFubmVsQ291bnQgKiBzaXplb2YoZmxvYXQpOworICAgICAgICBtZW1zZXQobXlEYXRhLT5pbnB1dEZsb2F0RGF0YSwgMCAvKiB2YWx1ZSAqLywgbnVtSW5wdXRCeXRlcyk7CiAKLSAgICAgICAgICAgIG15RGF0YS0+bG9vcGJhY2tQcm9jZXNzb3ItPnByb2Nlc3MobXlEYXRhLT5jb252ZXJzaW9uQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15RGF0YS0+YWN0dWFsSW5wdXRDaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteURhdGEtPmFjdHVhbE91dHB1dENoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNSZWFkKTsKKyAgICAgICAgLy8gUHJvY2VzcyBkYXRhIGFmdGVyIGVxdWlsaWJyaXVtLgorICAgICAgICBpbnQ2NF90IGlucHV0RnJhbWVzV3JpdHRlbiA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKG15RGF0YS0+aW5wdXRTdHJlYW0pOworICAgICAgICBpbnQ2NF90IGlucHV0RnJhbWVzUmVhZCA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKG15RGF0YS0+aW5wdXRTdHJlYW0pOworICAgICAgICBpbnQ2NF90IGZyYW1lc0F2YWlsYWJsZSA9IGlucHV0RnJhbWVzV3JpdHRlbiAtIGlucHV0RnJhbWVzUmVhZDsKKyAgICAgICAgYWN0dWFsRnJhbWVzUmVhZCA9IHJlYWRGb3JtYXR0ZWREYXRhKG15RGF0YSwgbnVtRnJhbWVzKTsKKyAgICAgICAgaWYgKGFjdHVhbEZyYW1lc1JlYWQgPCAwKSB7CisgICAgICAgICAgICByZXN1bHQgPSBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1A7CisgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgIGlmIChhY3R1YWxGcmFtZXNSZWFkIDwgbnVtRnJhbWVzKSB7CisgICAgICAgICAgICAgICAgaWYoYWN0dWFsRnJhbWVzUmVhZCA8IChpbnQzMl90KSBmcmFtZXNBdmFpbGFibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJpbnN1ZmZpY2llbnQgYnV0IG51bUZyYW1lcyA9ICVkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBhY3R1YWxGcmFtZXNSZWFkID0gJWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIGlucHV0RnJhbWVzV3JpdHRlbiA9ICVkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBpbnB1dEZyYW1lc1JlYWQgPSAlZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgYXZhaWxhYmxlID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxGcmFtZXNSZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgaW5wdXRGcmFtZXNXcml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgaW5wdXRGcmFtZXNSZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgZnJhbWVzQXZhaWxhYmxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbXlEYXRhLT5pbnN1ZmZpY2llbnRSZWFkQ291bnQrKzsKKyAgICAgICAgICAgICAgICBteURhdGEtPmluc3VmZmljaWVudFJlYWRGcmFtZXMgKz0gbnVtRnJhbWVzIC0gYWN0dWFsRnJhbWVzUmVhZDsgLy8gZGVmaWNpdAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMgPSBhY3R1YWxGcmFtZXNSZWFkICogbXlEYXRhLT5hY3R1YWxJbnB1dENoYW5uZWxDb3VudDsKKworICAgICAgICAgICAgaWYgKG15RGF0YS0+YWN0dWFsSW5wdXRGb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2KSB7CisgICAgICAgICAgICAgICAgY29udmVydFBjbTE2VG9GbG9hdChteURhdGEtPmlucHV0U2hvcnREYXRhLCBteURhdGEtPmlucHV0RmxvYXREYXRhLCBudW1TYW1wbGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFNhdmUgZm9yIGxhdGVyLgorICAgICAgICAgICAgbXlEYXRhLT5hdWRpb1JlY29yZGluZy53cml0ZShteURhdGEtPmlucHV0RmxvYXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteURhdGEtPmFjdHVhbElucHV0Q2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMpOworICAgICAgICAgICAgLy8gQW5hbHl6ZSB0aGUgZGF0YS4KKyAgICAgICAgICAgIG15RGF0YS0+bG9vcGJhY2tQcm9jZXNzb3ItPnByb2Nlc3MobXlEYXRhLT5pbnB1dEZsb2F0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlEYXRhLT5hY3R1YWxJbnB1dENoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlEYXRhLT5hY3R1YWxPdXRwdXRDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcyk7CiAgICAgICAgICAgICBteURhdGEtPmlzRG9uZSA9IG15RGF0YS0+bG9vcGJhY2tQcm9jZXNzb3ItPmlzRG9uZSgpOwogICAgICAgICAgICAgaWYgKG15RGF0YS0+aXNEb25lKSB7CiAgICAgICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQorICAgIG15RGF0YS0+ZnJhbWVzV3JpdHRlblRvdGFsICs9IG51bUZyYW1lczsKIAogICAgIHJldHVybiByZXN1bHQ7CiB9CkBAIC0xNDgsMjkgKzIyNSwyOSBAQAogc3RhdGljIHZvaWQgTXlFcnJvckNhbGxiYWNrUHJvYygKICAgICAgICAgQUF1ZGlvU3RyZWFtICpzdHJlYW0gX191bnVzZWQsCiAgICAgICAgIHZvaWQgKnVzZXJEYXRhIF9fdW51c2VkLAotICAgICAgICBhYXVkaW9fcmVzdWx0X3QgZXJyb3IpCi17CisgICAgICAgIGFhdWRpb19yZXN1bHRfdCBlcnJvcikgewogICAgIHByaW50ZigiRXJyb3IgQ2FsbGJhY2ssIGVycm9yOiAlZFxuIiwoaW50KWVycm9yKTsKICAgICBMb29wYmFja0RhdGEgKm15RGF0YSA9IChMb29wYmFja0RhdGEgKikgdXNlckRhdGE7CiAgICAgbXlEYXRhLT5vdXRwdXRFcnJvciA9IGVycm9yOwogfQogCiBzdGF0aWMgdm9pZCB1c2FnZSgpIHsKLSAgICBwcmludGYoImxvb3BiYWNrOiAtbntudW1CdXJzdHN9IC1we291dFBlcmZ9IC1Qe2luUGVyZn0gLXR7dGVzdH0gLWd7Z2Fpbn0gLWZ7ZnJlcX1cbiIpOwotICAgIHByaW50ZigiICAgICAgICAgIC1je2lucHV0Q2hhbm5lbHN9XG4iKTsKLSAgICBwcmludGYoIiAgICAgICAgICAtZntmcmVxfSAgc2luZSBmcmVxdWVuY3lcbiIpOwotICAgIHByaW50ZigiICAgICAgICAgIC1ne2dhaW59ICByZWNpcmN1bGF0aW5nIGxvb3BiYWNrIGdhaW5cbiIpOwotICAgIHByaW50ZigiICAgICAgICAgIC1tIGVuYWJsZSBNTUFQIG1vZGVcbiIpOwotICAgIHByaW50ZigiICAgICAgICAgIC1ue251bUJ1cnN0c30gYnVmZmVyIHNpemUsIGZvciBleGFtcGxlIDIgZm9yIGRvdWJsZSBidWZmZXJlZFxuIik7Ci0gICAgcHJpbnRmKCIgICAgICAgICAgLXB7b3V0UGVyZn0gIHNldCBvdXRwdXQgQUFVRElPX1BFUkZPUk1BTkNFX01PREUqXG4iKTsKLSAgICBwcmludGYoIiAgICAgICAgICAtUHtpblBlcmZ9ICAgc2V0IGlucHV0IEFBVURJT19QRVJGT1JNQU5DRV9NT0RFKlxuIik7Ci0gICAgcHJpbnRmKCIgICAgICAgICAgICAgIG4gZm9yIF9OT05FXG4iKTsKLSAgICBwcmludGYoIiAgICAgICAgICAgICAgbCBmb3IgX0xBVEVOQ1lcbiIpOwotICAgIHByaW50ZigiICAgICAgICAgICAgICBwIGZvciBfUE9XRVJfU0FWSU5HO1xuIik7Ci0gICAgcHJpbnRmKCIgICAgICAgICAgLXR7dGVzdH0gICBzZWxlY3QgdGVzdCBtb2RlXG4iKTsKLSAgICBwcmludGYoIiAgICAgICAgICAgICAgbSBmb3Igc2luZSBtYWduaXR1ZGVcbiIpOwotICAgIHByaW50ZigiICAgICAgICAgICAgICBlIGZvciBlY2hvIGxhdGVuY3kgKGRlZmF1bHQpXG4iKTsKLSAgICBwcmludGYoIkZvciBleGFtcGxlOiAgbG9vcGJhY2sgLWIyIC1wbCAtUG5cbiIpOworICAgIHByaW50ZigiVXNhZ2U6IGFhdWRpb19sb29wYmFjayBbT1BUSU9OXS4uLlxuXG4iKTsKKyAgICBBQXVkaW9BcmdzUGFyc2VyOjp1c2FnZSgpOworICAgIHByaW50ZigiICAgICAgLUJ7ZnJhbWVzfSAgICAgICAgaW5wdXQgY2FwYWNpdHkgaW4gZnJhbWVzXG4iKTsKKyAgICBwcmludGYoIiAgICAgIC1De2NoYW5uZWxzfSAgICAgIG51bWJlciBvZiBpbnB1dCBjaGFubmVsc1xuIik7CisgICAgcHJpbnRmKCIgICAgICAtRnswLDEsMn0gICAgICAgICBpbnB1dCBmb3JtYXQsIDE9STE2LCAyPUZMT0FUXG4iKTsKKyAgICBwcmludGYoIiAgICAgIC1ne2dhaW59ICAgICAgICAgIHJlY2lyY3VsYXRpbmcgbG9vcGJhY2sgZ2FpblxuIik7CisgICAgcHJpbnRmKCIgICAgICAtUHtpblBlcmZ9ICAgICAgICBzZXQgaW5wdXQgQUFVRElPX1BFUkZPUk1BTkNFX01PREUqXG4iKTsKKyAgICBwcmludGYoIiAgICAgICAgICBuIGZvciBfTk9ORVxuIik7CisgICAgcHJpbnRmKCIgICAgICAgICAgbCBmb3IgX0xBVEVOQ1lcbiIpOworICAgIHByaW50ZigiICAgICAgICAgIHAgZm9yIF9QT1dFUl9TQVZJTkdcbiIpOworICAgIHByaW50ZigiICAgICAgLXR7dGVzdH0gICAgICAgICAgc2VsZWN0IHRlc3QgbW9kZVxuIik7CisgICAgcHJpbnRmKCIgICAgICAgICAgbSBmb3Igc2luZSBtYWduaXR1ZGVcbiIpOworICAgIHByaW50ZigiICAgICAgICAgIGUgZm9yIGVjaG8gbGF0ZW5jeSAoZGVmYXVsdClcbiIpOworICAgIHByaW50ZigiICAgICAgICAgIGYgZm9yIGZpbGUgbGF0ZW5jeSwgYW5hbHl6ZXMgJXNcblxuIiwgRklMRU5BTUVfRUNIT1MpOworICAgIHByaW50ZigiICAgICAgLVggIHVzZSBFWENMVVNJVkUgbW9kZSBmb3IgaW5wdXRcbiIpOworICAgIHByaW50ZigiRXhhbXBsZTogIGFhdWRpb19sb29wYmFjayAtbjIgLXBsIC1QbCAteFxuIik7CiB9CiAKIHN0YXRpYyBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IHBhcnNlUGVyZm9ybWFuY2VNb2RlKGNoYXIgYykgewpAQCAtMTk2LDYgKzI3Myw3IEBACiBlbnVtIHsKICAgICBURVNUX1NJTkVfTUFHTklUVURFID0gMCwKICAgICBURVNUX0VDSE9fTEFURU5DWSwKKyAgICBURVNUX0ZJTEVfTEFURU5DWSwKIH07CiAKIHN0YXRpYyBpbnQgcGFyc2VUZXN0TW9kZShjaGFyIGMpIHsKQEAgLTIwOCw2ICsyODYsOSBAQAogICAgICAgICBjYXNlICdlJzoKICAgICAgICAgICAgIHRlc3RNb2RlID0gVEVTVF9FQ0hPX0xBVEVOQ1k7CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnZic6CisgICAgICAgICAgICB0ZXN0TW9kZSA9IFRFU1RfRklMRV9MQVRFTkNZOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBwcmludGYoIkVSUk9SIGluIHZhbHVlIHRlc3QgbW9kZSAlY1xuIiwgYyk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTIzMSw5ICszMTIsMTAgQEAKICAgICAgICAgfQogICAgIH0KICAgICBmbG9hdCBnYWluID0gMC45OGYgLyBtYXhTYW1wbGU7CisKICAgICBmb3IgKGludDMyX3QgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgICAgZmxvYXQgc2FtcGxlID0gZGF0YVtpXTsKLSAgICAgICAgcHJpbnRmKCIlNS4zZiAiLCBzYW1wbGUpOyAvLyBhY3R1YWwgdmFsdWUKKyAgICAgICAgcHJpbnRmKCIlNmQ6ICU3LjRmICIsIGksIHNhbXBsZSk7IC8vIGFjdHVhbCB2YWx1ZQogICAgICAgICBzYW1wbGUgKj0gZ2FpbjsKICAgICAgICAgcHJpbnRBdWRpb1Njb3BlKHNhbXBsZSk7CiAgICAgfQpAQCAtMjQ1LDMzICszMjcsMjggQEAKIGludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKIHsKIAotICAgIEFBdWRpb0FyZ3NQYXJzZXIgICAgIGFyZ1BhcnNlcjsKLSAgICBBQXVkaW9TaW1wbGVQbGF5ZXIgICBwbGF5ZXI7Ci0gICAgQUF1ZGlvU2ltcGxlUmVjb3JkZXIgcmVjb3JkZXI7Ci0gICAgTG9vcGJhY2tEYXRhICAgICAgICAgbG9vcGJhY2tEYXRhOwotICAgIEFBdWRpb1N0cmVhbSAgICAgICAgKm91dHB1dFN0cmVhbSA9IG51bGxwdHI7CisgICAgQUF1ZGlvQXJnc1BhcnNlciAgICAgIGFyZ1BhcnNlcjsKKyAgICBBQXVkaW9TaW1wbGVQbGF5ZXIgICAgcGxheWVyOworICAgIEFBdWRpb1NpbXBsZVJlY29yZGVyICByZWNvcmRlcjsKKyAgICBMb29wYmFja0RhdGEgICAgICAgICAgbG9vcGJhY2tEYXRhOworICAgIEFBdWRpb1N0cmVhbSAgICAgICAgICppbnB1dFN0cmVhbSAgICAgICAgICAgICAgICA9IG51bGxwdHI7CisgICAgQUF1ZGlvU3RyZWFtICAgICAgICAgKm91dHB1dFN0cmVhbSAgICAgICAgICAgICAgID0gbnVsbHB0cjsKIAotICAgIGFhdWRpb19yZXN1bHRfdCAgICAgIHJlc3VsdCA9IEFBVURJT19PSzsKLSAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3QgcmVxdWVzdGVkSW5wdXRTaGFyaW5nTW9kZSAgICAgPSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRDsKKyAgICBhYXVkaW9fcmVzdWx0X3QgICAgICAgcmVzdWx0ID0gQUFVRElPX09LOworICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCByZXF1ZXN0ZWRJbnB1dFNoYXJpbmdNb2RlICA9IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEOwogICAgIGludCAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRJbnB1dENoYW5uZWxDb3VudCA9IE5VTV9JTlBVVF9DSEFOTkVMUzsKLSAgICBjb25zdCBpbnQgICAgICAgICAgICAgcmVxdWVzdGVkT3V0cHV0Q2hhbm5lbENvdW50ID0gQUFVRElPX1VOU1BFQ0lGSUVEOwotICAgIGludCAgICAgICAgICAgICAgICAgICBhY3R1YWxTYW1wbGVSYXRlID0gMDsKLSAgICBjb25zdCBhYXVkaW9fZm9ybWF0X3QgcmVxdWVzdGVkSW5wdXRGb3JtYXQgPSBBQVVESU9fRk9STUFUX1BDTV9JMTY7Ci0gICAgY29uc3QgYWF1ZGlvX2Zvcm1hdF90IHJlcXVlc3RlZE91dHB1dEZvcm1hdCA9IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUOwotICAgIGFhdWRpb19mb3JtYXRfdCAgICAgICBhY3R1YWxJbnB1dEZvcm1hdDsKLSAgICBhYXVkaW9fZm9ybWF0X3QgICAgICAgYWN0dWFsT3V0cHV0Rm9ybWF0OwotICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3Qgb3V0cHV0UGVyZm9ybWFuY2VMZXZlbCA9IEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZOwotICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgaW5wdXRQZXJmb3JtYW5jZUxldmVsID0gQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1k7CisgICAgYWF1ZGlvX2Zvcm1hdF90ICAgICAgIHJlcXVlc3RlZElucHV0Rm9ybWF0ICAgICAgID0gQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRDsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgcmVxdWVzdGVkSW5wdXRDYXBhY2l0eSAgICAgPSAtMTsKKyAgICBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IGlucHV0UGVyZm9ybWFuY2VMZXZlbCAgPSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWTsKIAotICAgIGludCB0ZXN0TW9kZSA9IFRFU1RfRUNIT19MQVRFTkNZOwotICAgIGRvdWJsZSBnYWluID0gMS4wOworICAgIGludDMyX3QgICAgICAgICAgICAgICBvdXRwdXRGcmFtZXNQZXJCdXJzdCA9IDA7CiAKLSAgICBhYXVkaW9fc3RyZWFtX3N0YXRlX3Qgc3RhdGUgPSBBQVVESU9fU1RSRUFNX1NUQVRFX1VOSU5JVElBTElaRUQ7Ci0gICAgaW50MzJfdCBmcmFtZXNQZXJCdXJzdCA9IDA7Ci0gICAgZmxvYXQgKm91dHB1dERhdGEgPSBOVUxMOwotICAgIGRvdWJsZSBkZXZpYXRpb247Ci0gICAgZG91YmxlIGxhdGVuY3k7Ci0gICAgaW50MzJfdCBidXJzdHNQZXJCdWZmZXIgPSAxOyAvLyBzaW5nbGUgYnVmZmVyZWQKKyAgICBhYXVkaW9fZm9ybWF0X3QgICAgICAgYWN0dWFsT3V0cHV0Rm9ybWF0ICAgICAgICAgPSBBQVVESU9fRk9STUFUX0lOVkFMSUQ7CisgICAgaW50MzJfdCAgICAgICAgICAgICAgIGFjdHVhbFNhbXBsZVJhdGUgICAgICAgICAgID0gMDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgd3JpdHRlbiAgICAgICAgICAgICAgICAgICAgPSAwOworCisgICAgaW50ICAgICAgICAgICAgICAgICAgIHRlc3RNb2RlICAgICAgICAgICAgICAgICAgID0gVEVTVF9FQ0hPX0xBVEVOQ1k7CisgICAgZG91YmxlICAgICAgICAgICAgICAgIGdhaW4gICAgICAgICAgICAgICAgICAgICAgID0gMS4wOwogCiAgICAgLy8gTWFrZSBwcmludGYgcHJpbnQgaW1tZWRpYXRlbHkgc28gdGhhdCBkZWJ1ZyBpbmZvIGlzIG5vdCBzdHVjawogICAgIC8vIGluIGEgYnVmZmVyIGlmIHdlIGhhbmcgb3IgY3Jhc2guCkBAIC0yODYsOSArMzYzLDE1IEBACiAgICAgICAgICAgICBpZiAoYXJnWzBdID09ICctJykgewogICAgICAgICAgICAgICAgIGNoYXIgb3B0aW9uID0gYXJnWzFdOwogICAgICAgICAgICAgICAgIHN3aXRjaCAob3B0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0InOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkSW5wdXRDYXBhY2l0eSA9IGF0b2koJmFyZ1syXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQyc6CiAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRJbnB1dENoYW5uZWxDb3VudCA9IGF0b2koJmFyZ1syXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnRic6CisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRJbnB1dEZvcm1hdCA9IGF0b2koJmFyZ1syXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZyc6CiAgICAgICAgICAgICAgICAgICAgICAgICBnYWluID0gYXRvZigmYXJnWzJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMzIxLDggKzQwNCw5IEBACiAgICAgfQogCiAgICAgaW50MzJfdCByZXF1ZXN0ZWREdXJhdGlvbiA9IGFyZ1BhcnNlci5nZXREdXJhdGlvblNlY29uZHMoKTsKLSAgICBpbnQzMl90IHJlY29yZGluZ0R1cmF0aW9uID0gc3RkOjptaW4oNjAsIHJlcXVlc3RlZER1cmF0aW9uKTsKLSAgICBsb29wYmFja0RhdGEuYXVkaW9SZWNvcmRlci5hbGxvY2F0ZShyZWNvcmRpbmdEdXJhdGlvbiAqIFNBTVBMRV9SQVRFKTsKKyAgICBpbnQzMl90IHJlcXVlc3RlZER1cmF0aW9uTWlsbGlzID0gcmVxdWVzdGVkRHVyYXRpb24gKiBNSUxMSVNfUEVSX1NFQ09ORDsKKyAgICBpbnQzMl90IHRpbWVNaWxsaXMgPSAwOworICAgIGludDMyX3QgcmVjb3JkaW5nRHVyYXRpb24gPSBzdGQ6Om1pbig2MCAqIDUsIHJlcXVlc3RlZER1cmF0aW9uKTsKIAogICAgIHN3aXRjaCh0ZXN0TW9kZSkgewogICAgICAgICBjYXNlIFRFU1RfU0lORV9NQUdOSVRVREU6CkBAIC0zMzIsNjEgKzQxNiwxMTIgQEAKICAgICAgICAgICAgIGxvb3BiYWNrRGF0YS5lY2hvQW5hbHl6ZXIuc2V0R2FpbihnYWluKTsKICAgICAgICAgICAgIGxvb3BiYWNrRGF0YS5sb29wYmFja1Byb2Nlc3NvciA9ICZsb29wYmFja0RhdGEuZWNob0FuYWx5emVyOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVEVTVF9GSUxFX0xBVEVOQ1k6IHsKKyAgICAgICAgICAgIGxvb3BiYWNrRGF0YS5lY2hvQW5hbHl6ZXIuc2V0R2FpbihnYWluKTsKKworICAgICAgICAgICAgbG9vcGJhY2tEYXRhLmxvb3BiYWNrUHJvY2Vzc29yID0gJmxvb3BiYWNrRGF0YS5lY2hvQW5hbHl6ZXI7CisgICAgICAgICAgICBpbnQgcmVhZCA9IGxvb3BiYWNrRGF0YS5sb29wYmFja1Byb2Nlc3Nvci0+bG9hZChGSUxFTkFNRV9FQ0hPUyk7CisgICAgICAgICAgICBwcmludGYoIm1haW4oKSByZWFkICVkIG1vbm8gc2FtcGxlcyBmcm9tICVzIG9uIEFuZHJvaWQgZGV2aWNlXG4iLCByZWFkLCBGSUxFTkFNRV9FQ0hPUyk7CisgICAgICAgICAgICBsb29wYmFja0RhdGEubG9vcGJhY2tQcm9jZXNzb3ItPnJlcG9ydCgpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAogICAgIHByaW50ZigiT1VUUFVUIHN0cmVhbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKLSAgICBhcmdQYXJzZXIuc2V0Rm9ybWF0KHJlcXVlc3RlZE91dHB1dEZvcm1hdCk7CiAgICAgcmVzdWx0ID0gcGxheWVyLm9wZW4oYXJnUGFyc2VyLCBNeURhdGFDYWxsYmFja1Byb2MsIE15RXJyb3JDYWxsYmFja1Byb2MsICZsb29wYmFja0RhdGEpOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1IgLSAgcGxheWVyLm9wZW4oKSByZXR1cm5lZCAlZFxuIiwgcmVzdWx0KTsKLSAgICAgICAgZ290byBmaW5pc2g7CisgICAgICAgIGV4aXQoMSk7CiAgICAgfQogICAgIG91dHB1dFN0cmVhbSA9IHBsYXllci5nZXRTdHJlYW0oKTsKLSAgICBhcmdQYXJzZXIuY29tcGFyZVdpdGhTdHJlYW0ob3V0cHV0U3RyZWFtKTsKIAogICAgIGFjdHVhbE91dHB1dEZvcm1hdCA9IEFBdWRpb1N0cmVhbV9nZXRGb3JtYXQob3V0cHV0U3RyZWFtKTsKLSAgICBhc3NlcnQoYWN0dWFsT3V0cHV0Rm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsKKyAgICBpZiAoYWN0dWFsT3V0cHV0Rm9ybWF0ICE9IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1IgLSBvbmx5IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUIHN1cHBvcnRlZFxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQogCi0gICAgcHJpbnRmKCJJTlBVVCBzdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisgICAgYWN0dWFsU2FtcGxlUmF0ZSA9IEFBdWRpb1N0cmVhbV9nZXRTYW1wbGVSYXRlKG91dHB1dFN0cmVhbSk7CisgICAgbG9vcGJhY2tEYXRhLmF1ZGlvUmVjb3JkaW5nLmFsbG9jYXRlKHJlY29yZGluZ0R1cmF0aW9uICogYWN0dWFsU2FtcGxlUmF0ZSk7CisgICAgbG9vcGJhY2tEYXRhLmF1ZGlvUmVjb3JkaW5nLnNldFNhbXBsZVJhdGUoYWN0dWFsU2FtcGxlUmF0ZSk7CisgICAgb3V0cHV0RnJhbWVzUGVyQnVyc3QgPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUGVyQnVyc3Qob3V0cHV0U3RyZWFtKTsKKworICAgIGFyZ1BhcnNlci5jb21wYXJlV2l0aFN0cmVhbShvdXRwdXRTdHJlYW0pOworCisgICAgcHJpbnRmKCJJTlBVVCAgc3RyZWFtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwogICAgIC8vIFVzZSBkaWZmZXJlbnQgcGFyYW1ldGVycyBmb3IgdGhlIGlucHV0LgogICAgIGFyZ1BhcnNlci5zZXROdW1iZXJPZkJ1cnN0cyhBQVVESU9fVU5TUEVDSUZJRUQpOwogICAgIGFyZ1BhcnNlci5zZXRGb3JtYXQocmVxdWVzdGVkSW5wdXRGb3JtYXQpOwogICAgIGFyZ1BhcnNlci5zZXRQZXJmb3JtYW5jZU1vZGUoaW5wdXRQZXJmb3JtYW5jZUxldmVsKTsKICAgICBhcmdQYXJzZXIuc2V0Q2hhbm5lbENvdW50KHJlcXVlc3RlZElucHV0Q2hhbm5lbENvdW50KTsKICAgICBhcmdQYXJzZXIuc2V0U2hhcmluZ01vZGUocmVxdWVzdGVkSW5wdXRTaGFyaW5nTW9kZSk7CisKKyAgICAvLyBNYWtlIHN1cmUgdGhlIGlucHV0IGJ1ZmZlciBoYXMgcGxlbnR5IG9mIGNhcGFjaXR5LgorICAgIC8vIEV4dHJhIGNhcGFjaXR5IG9uIGlucHV0IHNob3VsZCBub3QgaW5jcmVhc2UgbGF0ZW5jeSBpZiB3ZSBrZWVwIGl0IGRyYWluZWQuCisgICAgaW50MzJfdCBpbnB1dEJ1ZmZlckNhcGFjaXR5ID0gcmVxdWVzdGVkSW5wdXRDYXBhY2l0eTsKKyAgICBpZiAoaW5wdXRCdWZmZXJDYXBhY2l0eSA8IDApIHsKKyAgICAgICAgaW50MzJfdCBvdXRwdXRCdWZmZXJDYXBhY2l0eSA9IEFBdWRpb1N0cmVhbV9nZXRCdWZmZXJDYXBhY2l0eUluRnJhbWVzKG91dHB1dFN0cmVhbSk7CisgICAgICAgIGlucHV0QnVmZmVyQ2FwYWNpdHkgPSAyICogb3V0cHV0QnVmZmVyQ2FwYWNpdHk7CisgICAgfQorICAgIGFyZ1BhcnNlci5zZXRCdWZmZXJDYXBhY2l0eShpbnB1dEJ1ZmZlckNhcGFjaXR5KTsKKwogICAgIHJlc3VsdCA9IHJlY29yZGVyLm9wZW4oYXJnUGFyc2VyKTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIC0gIHJlY29yZGVyLm9wZW4oKSByZXR1cm5lZCAlZFxuIiwgcmVzdWx0KTsKICAgICAgICAgZ290byBmaW5pc2g7CiAgICAgfQotICAgIGxvb3BiYWNrRGF0YS5pbnB1dFN0cmVhbSA9IHJlY29yZGVyLmdldFN0cmVhbSgpOwotICAgIGFyZ1BhcnNlci5jb21wYXJlV2l0aFN0cmVhbShsb29wYmFja0RhdGEuaW5wdXRTdHJlYW0pOworICAgIGlucHV0U3RyZWFtID0gbG9vcGJhY2tEYXRhLmlucHV0U3RyZWFtID0gcmVjb3JkZXIuZ2V0U3RyZWFtKCk7CiAKLSAgICAvLyBUaGlzIGlzIHRoZSBudW1iZXIgb2YgZnJhbWVzIHRoYXQgYXJlIHJlYWQgaW4gb25lIGNodW5rIGJ5IGEgRE1BIGNvbnRyb2xsZXIKLSAgICAvLyBvciBhIERTUCBvciBhIG1peGVyLgotICAgIGZyYW1lc1BlckJ1cnN0ID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1BlckJ1cnN0KG91dHB1dFN0cmVhbSk7CisgICAgeworICAgICAgICBpbnQzMl90IGFjdHVhbENhcGFjaXR5ID0gQUF1ZGlvU3RyZWFtX2dldEJ1ZmZlckNhcGFjaXR5SW5GcmFtZXMoaW5wdXRTdHJlYW0pOworICAgICAgICByZXN1bHQgPSBBQXVkaW9TdHJlYW1fc2V0QnVmZmVyU2l6ZUluRnJhbWVzKGlucHV0U3RyZWFtLCBhY3R1YWxDYXBhY2l0eSk7CisgICAgICAgIGlmIChyZXN1bHQgPCAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIC0gIEFBdWRpb1N0cmVhbV9zZXRCdWZmZXJTaXplSW5GcmFtZXMoKSByZXR1cm5lZCAlZFxuIiwgcmVzdWx0KTsKKyAgICAgICAgICAgIGdvdG8gZmluaXNoOworICAgICAgICB9IGVsc2Uge30KKyAgICB9CiAKLSAgICBhY3R1YWxJbnB1dEZvcm1hdCA9IEFBdWRpb1N0cmVhbV9nZXRGb3JtYXQob3V0cHV0U3RyZWFtKTsKLSAgICBhc3NlcnQoYWN0dWFsSW5wdXRGb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2KTsKKyAgICBhcmdQYXJzZXIuY29tcGFyZVdpdGhTdHJlYW0oaW5wdXRTdHJlYW0pOwogCisgICAgLy8gSWYgdGhlIGlucHV0IHN0cmVhbSBpcyB0b28gc21hbGwgdGhlbiB3ZSBjYW5ub3Qgc2F0aXNmeSB0aGUgb3V0cHV0IGNhbGxiYWNrLgorICAgIHsKKyAgICAgICAgaW50MzJfdCBhY3R1YWxDYXBhY2l0eSA9IEFBdWRpb1N0cmVhbV9nZXRCdWZmZXJDYXBhY2l0eUluRnJhbWVzKGlucHV0U3RyZWFtKTsKKyAgICAgICAgaWYgKGFjdHVhbENhcGFjaXR5IDwgMiAqIG91dHB1dEZyYW1lc1BlckJ1cnN0KSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIC0gaW5wdXQgY2FwYWNpdHkgPCAyICogb3V0cHV0RnJhbWVzUGVyQnVyc3RcbiIpOworICAgICAgICAgICAgZ290byBmaW5pc2g7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAtLS0tLS0tIFNldHVwIGxvb3BiYWNrRGF0YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIGxvb3BiYWNrRGF0YS5hY3R1YWxJbnB1dEZvcm1hdCA9IEFBdWRpb1N0cmVhbV9nZXRGb3JtYXQoaW5wdXRTdHJlYW0pOwogCiAgICAgbG9vcGJhY2tEYXRhLmFjdHVhbElucHV0Q2hhbm5lbENvdW50ID0gcmVjb3JkZXIuZ2V0Q2hhbm5lbENvdW50KCk7CiAgICAgbG9vcGJhY2tEYXRhLmFjdHVhbE91dHB1dENoYW5uZWxDb3VudCA9IHBsYXllci5nZXRDaGFubmVsQ291bnQoKTsKIAogICAgIC8vIEFsbG9jYXRlIGEgYnVmZmVyIGZvciB0aGUgYXVkaW8gZGF0YS4KLSAgICBsb29wYmFja0RhdGEuaW5wdXRGcmFtZXNNYXhpbXVtID0gMzIgKiBmcmFtZXNQZXJCdXJzdDsKLSAgICBsb29wYmFja0RhdGEuaW5wdXRCdWZmZXJzVG9EaXNjYXJkID0gMTAwOworICAgIGxvb3BiYWNrRGF0YS5pbnB1dEZyYW1lc01heGltdW0gPSAzMiAqIEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNQZXJCdXJzdChpbnB1dFN0cmVhbSk7CiAKLSAgICBsb29wYmFja0RhdGEuaW5wdXREYXRhID0gbmV3IGludDE2X3RbbG9vcGJhY2tEYXRhLmlucHV0RnJhbWVzTWF4aW11bQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGxvb3BiYWNrRGF0YS5hY3R1YWxJbnB1dENoYW5uZWxDb3VudF07Ci0gICAgbG9vcGJhY2tEYXRhLmNvbnZlcnNpb25CdWZmZXIgPSBuZXcgZmxvYXRbbG9vcGJhY2tEYXRhLmlucHV0RnJhbWVzTWF4aW11bSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcGJhY2tEYXRhLmFjdHVhbElucHV0Q2hhbm5lbENvdW50XTsKKyAgICBpZiAobG9vcGJhY2tEYXRhLmFjdHVhbElucHV0Rm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0kxNikgeworICAgICAgICBsb29wYmFja0RhdGEuaW5wdXRTaG9ydERhdGEgPSBuZXcgaW50MTZfdFtsb29wYmFja0RhdGEuaW5wdXRGcmFtZXNNYXhpbXVtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbG9vcGJhY2tEYXRhLmFjdHVhbElucHV0Q2hhbm5lbENvdW50XXt9OworICAgIH0KKyAgICBsb29wYmFja0RhdGEuaW5wdXRGbG9hdERhdGEgPSBuZXcgZmxvYXRbbG9vcGJhY2tEYXRhLmlucHV0RnJhbWVzTWF4aW11bSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcGJhY2tEYXRhLmFjdHVhbElucHV0Q2hhbm5lbENvdW50XXt9OwogCiAgICAgbG9vcGJhY2tEYXRhLmxvb3BiYWNrUHJvY2Vzc29yLT5yZXNldCgpOwogCisgICAgLy8gU3RhcnQgT1VUUFVUIGZpcnN0IHNvIElOUFVUIGRvZXMgbm90IG92ZXJmbG93LgorICAgIHJlc3VsdCA9IHBsYXllci5zdGFydCgpOworICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgIHByaW50ZigiRVJST1IgLSBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KG91dHB1dCkgcmV0dXJuZWQgJWQgPSAlc1xuIiwKKyAgICAgICAgICAgICAgIHJlc3VsdCwgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CisgICAgICAgIGdvdG8gZmluaXNoOworICAgIH0KKwogICAgIHJlc3VsdCA9IHJlY29yZGVyLnN0YXJ0KCk7CiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKICAgICAgICAgcHJpbnRmKCJFUlJPUiAtIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoaW5wdXQpIHJldHVybmVkICVkID0gJXNcbiIsCkBAIC0zOTQsMTYgKzUyOSw4IEBACiAgICAgICAgIGdvdG8gZmluaXNoOwogICAgIH0KIAotICAgIHJlc3VsdCA9IHBsYXllci5zdGFydCgpOwotICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgIHByaW50ZigiRVJST1IgLSBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KG91dHB1dCkgcmV0dXJuZWQgJWQgPSAlc1xuIiwKLSAgICAgICAgICAgICAgIHJlc3VsdCwgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7Ci0gICAgICAgIGdvdG8gZmluaXNoOwotICAgIH0KLQotICAgIHByaW50ZigiLS0tLS0tLSBzbGVlcCB3aGlsZSB0aGUgY2FsbGJhY2sgcnVucyAtLS0tLS0tLS0tLS0tLVxuIik7Ci0gICAgZmZsdXNoKHN0ZG91dCk7Ci0gICAgZm9yIChpbnQgaSA9IHJlcXVlc3RlZER1cmF0aW9uOyBpID4gMCA7IGktLSkgeworICAgIHByaW50ZigiLS0tLS0tLSBzbGVlcCBhbmQgbG9nIHdoaWxlIHRoZSBjYWxsYmFjayBydW5zIC0tLS0tLS0tLS0tLS0tXG4iKTsKKyAgICB3aGlsZSAodGltZU1pbGxpcyA8PSByZXF1ZXN0ZWREdXJhdGlvbk1pbGxpcykgewogICAgICAgICBpZiAobG9vcGJhY2tEYXRhLmlucHV0RXJyb3IgIT0gQUFVRElPX09LKSB7CiAgICAgICAgICAgICBwcmludGYoIiAgRVJST1Igb24gaW5wdXQgc3RyZWFtXG4iKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtNDExLDYwICs1MzgsMTI4IEBACiAgICAgICAgICAgICAgICAgcHJpbnRmKCIgIEVSUk9SIG9uIG91dHB1dCBzdHJlYW1cbiIpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9IGVsc2UgaWYgKGxvb3BiYWNrRGF0YS5pc0RvbmUpIHsKLSAgICAgICAgICAgICAgICBwcmludGYoIiAgdGVzdCBzYXlzIGl0IGlzIGRvbmUhXG4iKTsKKyAgICAgICAgICAgICAgICBwcmludGYoIiAgVGVzdCBzYXlzIGl0IGlzIERPTkUhXG4iKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNsZWVwKDEpOwotICAgICAgICAgICAgcHJpbnRmKCIlNGQ6ICIsIGkpOworICAgICAgICAgICAgLy8gTG9nIGEgbGluZSBvZiBzdHJlYW0gZGF0YS4KKyAgICAgICAgICAgIHByaW50ZigiJTcuM2Y6ICIsIDAuMDAxICogdGltZU1pbGxpcyk7IC8vIGRpc3BsYXkgaW4gc2Vjb25kcwogICAgICAgICAgICAgbG9vcGJhY2tEYXRhLmxvb3BiYWNrUHJvY2Vzc29yLT5wcmludFN0YXR1cygpOworICAgICAgICAgICAgcHJpbnRmKCIgaW5zZiAlM2QsIiwgKGludCkgbG9vcGJhY2tEYXRhLmluc3VmZmljaWVudFJlYWRDb3VudCk7CiAKLSAgICAgICAgICAgIGludDY0X3QgaW5wdXRGcmFtZXNXcml0dGVuID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1dyaXR0ZW4obG9vcGJhY2tEYXRhLmlucHV0U3RyZWFtKTsKLSAgICAgICAgICAgIGludDY0X3QgaW5wdXRGcmFtZXNSZWFkID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQobG9vcGJhY2tEYXRhLmlucHV0U3RyZWFtKTsKKyAgICAgICAgICAgIGludDY0X3QgaW5wdXRGcmFtZXNXcml0dGVuID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1dyaXR0ZW4oaW5wdXRTdHJlYW0pOworICAgICAgICAgICAgaW50NjRfdCBpbnB1dEZyYW1lc1JlYWQgPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUmVhZChpbnB1dFN0cmVhbSk7CiAgICAgICAgICAgICBpbnQ2NF90IG91dHB1dEZyYW1lc1dyaXR0ZW4gPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzV3JpdHRlbihvdXRwdXRTdHJlYW0pOwogICAgICAgICAgICAgaW50NjRfdCBvdXRwdXRGcmFtZXNSZWFkID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQob3V0cHV0U3RyZWFtKTsKLSAgICAgICAgICAgIHByaW50ZigiIElOUFVUOiB3ciAlbGxkIHJkICVsbGQgc3RhdGUgJXMsIE9VVFBVVDogd3IgJWxsZCByZCAlbGxkIHN0YXRlICVzLCB4cnVucyAlZFxuIiwKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgdGV4dE9mZnNldCA9IHN0cmxlbigiQUFVRElPX1NUUkVBTV9TVEFURV8iKTsgLy8gc3RyaXAgdGhpcyBvZmYKKyAgICAgICAgICAgIHByaW50ZigiIHwgSU5QVVQ6IHdyICU3bGxkIC0gcmQgJTdsbGQgPSAlNWxsZCwgc3QgJThzLCBvcnVucyAlM2QiLAogICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIGlucHV0RnJhbWVzV3JpdHRlbiwKICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSBpbnB1dEZyYW1lc1JlYWQsCi0gICAgICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRTdHJlYW1TdGF0ZVRvVGV4dChBQXVkaW9TdHJlYW1fZ2V0U3RhdGUobG9vcGJhY2tEYXRhLmlucHV0U3RyZWFtKSksCisgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgKGlucHV0RnJhbWVzV3JpdHRlbiAtIGlucHV0RnJhbWVzUmVhZCksCisgICAgICAgICAgICAgICAgICAgJkFBdWRpb19jb252ZXJ0U3RyZWFtU3RhdGVUb1RleHQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBQXVkaW9TdHJlYW1fZ2V0U3RhdGUoaW5wdXRTdHJlYW0pKVt0ZXh0T2Zmc2V0XSwKKyAgICAgICAgICAgICAgICAgICBBQXVkaW9TdHJlYW1fZ2V0WFJ1bkNvdW50KGlucHV0U3RyZWFtKSk7CisKKyAgICAgICAgICAgIHByaW50ZigiIHwgT1VUUFVUOiB3ciAlN2xsZCAtIHJkICU3bGxkID0gJTVsbGQsIHN0ICU4cywgdXJ1bnMgJTNkXG4iLAogICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIG91dHB1dEZyYW1lc1dyaXR0ZW4sCiAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgb3V0cHV0RnJhbWVzUmVhZCwKLSAgICAgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFN0cmVhbVN0YXRlVG9UZXh0KEFBdWRpb1N0cmVhbV9nZXRTdGF0ZShvdXRwdXRTdHJlYW0pKSwKKyAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgKG91dHB1dEZyYW1lc1dyaXR0ZW4gLSBvdXRwdXRGcmFtZXNSZWFkKSwKKyAgICAgICAgICAgICAgICAgICAmQUF1ZGlvX2NvbnZlcnRTdHJlYW1TdGF0ZVRvVGV4dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBdWRpb1N0cmVhbV9nZXRTdGF0ZShvdXRwdXRTdHJlYW0pKVt0ZXh0T2Zmc2V0XSwKICAgICAgICAgICAgICAgICAgICBBQXVkaW9TdHJlYW1fZ2V0WFJ1bkNvdW50KG91dHB1dFN0cmVhbSkKICAgICAgICAgICAgICk7CiAgICAgICAgIH0KKyAgICAgICAgaW50MzJfdCBwZXJpb2RNaWxsaXMgPSAodGltZU1pbGxpcyA8IDIwMDApID8gUEVSSU9EX01JTExJUyAvIDQgOiBQRVJJT0RfTUlMTElTOworICAgICAgICB1c2xlZXAocGVyaW9kTWlsbGlzICogMTAwMCk7CisgICAgICAgIHRpbWVNaWxsaXMgKz0gcGVyaW9kTWlsbGlzOworICAgIH0KKworICAgIHJlc3VsdCA9IHBsYXllci5zdG9wKCk7CisgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgcHJpbnRmKCJFUlJPUiAtIHBsYXllci5zdG9wKCkgcmV0dXJuZWQgJWQgPSAlc1xuIiwKKyAgICAgICAgICAgICAgIHJlc3VsdCwgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CisgICAgICAgIGdvdG8gZmluaXNoOworICAgIH0KKworICAgIHJlc3VsdCA9IHJlY29yZGVyLnN0b3AoKTsKKyAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICBwcmludGYoIkVSUk9SIC0gcmVjb3JkZXIuc3RvcCgpIHJldHVybmVkICVkID0gJXNcbiIsCisgICAgICAgICAgICAgICByZXN1bHQsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOworICAgICAgICBnb3RvIGZpbmlzaDsKICAgICB9CiAKICAgICBwcmludGYoImlucHV0IGVycm9yID0gJWQgPSAlc1xuIiwKLSAgICAgICAgICAgICAgICBsb29wYmFja0RhdGEuaW5wdXRFcnJvciwgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQobG9vcGJhY2tEYXRhLmlucHV0RXJyb3IpKTsKLQotICAgIHByaW50ZigiQUF1ZGlvU3RyZWFtX2dldFhSdW5Db3VudCAlZFxuIiwgQUF1ZGlvU3RyZWFtX2dldFhSdW5Db3VudChvdXRwdXRTdHJlYW0pKTsKLSAgICBwcmludGYoImZyYW1lc1JlYWQgICAgPSAlOGRcbiIsIChpbnQpIEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKG91dHB1dFN0cmVhbSkpOwotICAgIHByaW50ZigiZnJhbWVzV3JpdHRlbiA9ICU4ZFxuIiwgKGludCkgQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1dyaXR0ZW4ob3V0cHV0U3RyZWFtKSk7Ci0gICAgcHJpbnRmKCJtaW4gbnVtRnJhbWVzID0gJThkXG4iLCAoaW50KSBsb29wYmFja0RhdGEubWluTnVtRnJhbWVzKTsKLSAgICBwcmludGYoIm1heCBudW1GcmFtZXMgPSAlOGRcbiIsIChpbnQpIGxvb3BiYWNrRGF0YS5tYXhOdW1GcmFtZXMpOworICAgICAgICAgICBsb29wYmFja0RhdGEuaW5wdXRFcnJvciwgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQobG9vcGJhY2tEYXRhLmlucHV0RXJyb3IpKTsKIAogICAgIGlmIChsb29wYmFja0RhdGEuaW5wdXRFcnJvciA9PSBBQVVESU9fT0spIHsKICAgICAgICAgaWYgKHRlc3RNb2RlID09IFRFU1RfU0lORV9NQUdOSVRVREUpIHsKLSAgICAgICAgICAgIHByaW50QXVkaW9HcmFwaChsb29wYmFja0RhdGEuYXVkaW9SZWNvcmRlciwgMjAwKTsKKyAgICAgICAgICAgIHByaW50QXVkaW9HcmFwaChsb29wYmFja0RhdGEuYXVkaW9SZWNvcmRpbmcsIDIwMCk7CiAgICAgICAgIH0KKyAgICAgICAgLy8gUHJpbnQgYWdhaW4gc28gd2UgZG9uJ3QgaGF2ZSB0byBzY3JvbGwgcGFzdCB3YXZlZm9ybS4KKyAgICAgICAgcHJpbnRmKCJPVVRQVVQgU3RyZWFtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworICAgICAgICBhcmdQYXJzZXIuY29tcGFyZVdpdGhTdHJlYW0ob3V0cHV0U3RyZWFtKTsKKyAgICAgICAgcHJpbnRmKCJJTlBVVCAgU3RyZWFtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworICAgICAgICBhcmdQYXJzZXIuY29tcGFyZVdpdGhTdHJlYW0oaW5wdXRTdHJlYW0pOworCiAgICAgICAgIGxvb3BiYWNrRGF0YS5sb29wYmFja1Byb2Nlc3Nvci0+cmVwb3J0KCk7CiAgICAgfQogCiAgICAgewotICAgICAgICBpbnQgd3JpdHRlbiA9IGxvb3BiYWNrRGF0YS5hdWRpb1JlY29yZGVyLnNhdmUoRklMRU5BTUUpOwotICAgICAgICBwcmludGYoIm1haW4oKSB3cm90ZSAlZCBtb25vIHNhbXBsZXMgdG8gJXMgb24gQW5kcm9pZCBkZXZpY2VcbiIsIHdyaXR0ZW4sIEZJTEVOQU1FKTsKKyAgICAgICAgaW50MzJfdCBmcmFtZXNSZWFkID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQoaW5wdXRTdHJlYW0pOworICAgICAgICBpbnQzMl90IGZyYW1lc1dyaXR0ZW4gPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzV3JpdHRlbihpbnB1dFN0cmVhbSk7CisgICAgICAgIHByaW50ZigiQ2FsbGJhY2sgUmVzdWx0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIElOUFVUXG4iKTsKKyAgICAgICAgcHJpbnRmKCIgIGlucHV0IG92ZXJydW5zICAgPSAlZFxuIiwgQUF1ZGlvU3RyZWFtX2dldFhSdW5Db3VudChpbnB1dFN0cmVhbSkpOworICAgICAgICBwcmludGYoIiAgZnJhbWVzV3JpdHRlbiAgICA9ICU4ZFxuIiwgZnJhbWVzV3JpdHRlbik7CisgICAgICAgIHByaW50ZigiICBmcmFtZXNSZWFkICAgICAgID0gJThkXG4iLCBmcmFtZXNSZWFkKTsKKyAgICAgICAgcHJpbnRmKCIgIG15RnJhbWVzUmVhZCAgICAgPSAlOGRcbiIsIChpbnQpIGxvb3BiYWNrRGF0YS5mcmFtZXNSZWFkVG90YWwpOworICAgICAgICBwcmludGYoIiAgd3JpdHRlbiAtIHJlYWQgICA9ICU4ZFxuIiwgKGludCkgKGZyYW1lc1dyaXR0ZW4gLSBmcmFtZXNSZWFkKSk7CisgICAgICAgIHByaW50ZigiICBpbnN1ZmZpY2llbnQgIyAgID0gJThkXG4iLCAoaW50KSBsb29wYmFja0RhdGEuaW5zdWZmaWNpZW50UmVhZENvdW50KTsKKyAgICAgICAgaWYgKGxvb3BiYWNrRGF0YS5pbnN1ZmZpY2llbnRSZWFkQ291bnQgPiAwKSB7CisgICAgICAgICAgICBwcmludGYoIiAgaW5zdWZmaWNpZW50IGZyYW1lcyA9ICU4ZFxuIiwgKGludCkgbG9vcGJhY2tEYXRhLmluc3VmZmljaWVudFJlYWRGcmFtZXMpOworICAgICAgICB9CisgICAgfQorICAgIHsKKyAgICAgICAgaW50MzJfdCBmcmFtZXNSZWFkID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQob3V0cHV0U3RyZWFtKTsKKyAgICAgICAgaW50MzJfdCBmcmFtZXNXcml0dGVuID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1dyaXR0ZW4ob3V0cHV0U3RyZWFtKTsKKyAgICAgICAgcHJpbnRmKCJDYWxsYmFjayBSZXN1bHRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gT1VUUFVUXG4iKTsKKyAgICAgICAgcHJpbnRmKCIgIG91dHB1dCB1bmRlcnJ1bnMgPSAlZFxuIiwgQUF1ZGlvU3RyZWFtX2dldFhSdW5Db3VudChvdXRwdXRTdHJlYW0pKTsKKyAgICAgICAgcHJpbnRmKCIgIG15RnJhbWVzV3JpdHRlbiAgPSAlOGRcbiIsIChpbnQpIGxvb3BiYWNrRGF0YS5mcmFtZXNXcml0dGVuVG90YWwpOworICAgICAgICBwcmludGYoIiAgZnJhbWVzV3JpdHRlbiAgICA9ICU4ZFxuIiwgZnJhbWVzV3JpdHRlbik7CisgICAgICAgIHByaW50ZigiICBmcmFtZXNSZWFkICAgICAgID0gJThkXG4iLCBmcmFtZXNSZWFkKTsKKyAgICAgICAgcHJpbnRmKCIgIG1pbiBudW1GcmFtZXMgICAgPSAlOGRcbiIsIChpbnQpIGxvb3BiYWNrRGF0YS5taW5OdW1GcmFtZXMpOworICAgICAgICBwcmludGYoIiAgbWF4IG51bUZyYW1lcyAgICA9ICU4ZFxuIiwgKGludCkgbG9vcGJhY2tEYXRhLm1heE51bUZyYW1lcyk7CisgICAgfQorCisgICAgd3JpdHRlbiA9IGxvb3BiYWNrRGF0YS5sb29wYmFja1Byb2Nlc3Nvci0+c2F2ZShGSUxFTkFNRV9FQ0hPUyk7CisgICAgaWYgKHdyaXR0ZW4gPiAwKSB7CisgICAgICAgIHByaW50ZigibWFpbigpIHdyb3RlICU4ZCBtb25vIHNhbXBsZXMgdG8gXCIlc1wiIG9uIEFuZHJvaWQgZGV2aWNlXG4iLAorICAgICAgICAgICAgICAgd3JpdHRlbiwgRklMRU5BTUVfRUNIT1MpOworICAgIH0KKworICAgIHdyaXR0ZW4gPSBsb29wYmFja0RhdGEuYXVkaW9SZWNvcmRpbmcuc2F2ZShGSUxFTkFNRV9BTEwpOworICAgIGlmICh3cml0dGVuID4gMCkgeworICAgICAgICBwcmludGYoIm1haW4oKSB3cm90ZSAlOGQgbW9ubyBzYW1wbGVzIHRvIFwiJXNcIiBvbiBBbmRyb2lkIGRldmljZVxuIiwKKyAgICAgICAgICAgICAgIHdyaXR0ZW4sIEZJTEVOQU1FX0FMTCk7CisgICAgfQorCisgICAgaWYgKGxvb3BiYWNrRGF0YS5sb29wYmFja1Byb2Nlc3Nvci0+Z2V0UmVzdWx0KCkgPCAwKSB7CisgICAgICAgIHByaW50ZigiRVJST1I6IExPT1BCQUNLIFBST0NFU1NJTkcgRkFJTEVELiBNYXliZSBiZWNhdXNlIHRoZSB2b2x1bWUgd2FzIHRvbyBsb3cuXG4iKTsKKyAgICAgICAgcmVzdWx0ID0gbG9vcGJhY2tEYXRhLmxvb3BiYWNrUHJvY2Vzc29yLT5nZXRSZXN1bHQoKTsKKyAgICB9CisgICAgaWYgKGxvb3BiYWNrRGF0YS5pbnN1ZmZpY2llbnRSZWFkQ291bnQgPiAzKSB7CisgICAgICAgIHByaW50ZigiRVJST1I6IExPT1BCQUNLIFBST0NFU1NJTkcgRkFJTEVELiBpbnN1ZmZpY2llbnRSZWFkQ291bnQgdG9vIGhpZ2hcbiIpOworICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CiAgICAgfQogCiBmaW5pc2g6CiAgICAgcGxheWVyLmNsb3NlKCk7CiAgICAgcmVjb3JkZXIuY2xvc2UoKTsKLSAgICBkZWxldGVbXSBsb29wYmFja0RhdGEuY29udmVyc2lvbkJ1ZmZlcjsKLSAgICBkZWxldGVbXSBsb29wYmFja0RhdGEuaW5wdXREYXRhOwotICAgIGRlbGV0ZVtdIG91dHB1dERhdGE7CisgICAgZGVsZXRlW10gbG9vcGJhY2tEYXRhLmlucHV0RmxvYXREYXRhOworICAgIGRlbGV0ZVtdIGxvb3BiYWNrRGF0YS5pbnB1dFNob3J0RGF0YTsKIAotICAgIHByaW50ZihSRVNVTFRfVEFHICJlcnJvciA9ICVkID0gJXNcbiIsIHJlc3VsdCwgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7Ci0gICAgaWYgKChyZXN1bHQgIT0gQUFVRElPX09LKSkgewotICAgICAgICBwcmludGYoImVycm9yICVkID0gJXNcbiIsIHJlc3VsdCwgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CisgICAgcHJpbnRmKFJFU1VMVF9UQUcgInJlc3VsdCA9ICVkIFxuIiwgcmVzdWx0KTsgLy8gbWFjaGluZSByZWFkYWJsZQorICAgIHByaW50ZigicmVzdWx0IGlzICVzXG4iLCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsgLy8gaHVtYW4gcmVhZGFibGUKKyAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICBwcmludGYoIkZBSUxVUkVcbiIpOwogICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHByaW50ZigiU1VDQ0VTU1xuIik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL2xvb3BiYWNrLnNoIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9sb29wYmFjay5zaAppbmRleCBiYzYzMTI1Li5hNTcxMmI4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL2xvb3BiYWNrLnNoCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvbG9vcGJhY2suc2gKQEAgLTEsMTAgKzEsMzAgQEAKICMhL3N5c3RlbS9iaW4vc2gKICMgUnVuIGEgbG9vcGJhY2sgdGVzdCBpbiB0aGUgYmFja2dyb3VuZCBhZnRlciBhIGRlbGF5LgotIyBUbyBydW4gdGhlIHNjcmlwdCBlbnRlcjoKKyMgVG8gcnVuIHRoZSBzY3JpcHQsIGVudGVyIHRoZXNlIGNvbW1hbmRzIG9uY2U6CisjICAgIGFkYiBkaXNhYmxlLXZlcml0eQorIyAgICBhZGIgcmVib290CisjICAgIGFkYiByZW1vdW50CisjICAgIGFkYiBzeW5jCisjICAgIGFkYiBwdXNoIGxvb3BiYWNrLnNoIC9kYXRhLworIyBGb3IgZWFjaCB0ZXN0IHJ1bjoKICMgICAgYWRiIHNoZWxsICJub2h1cCBzaCAvZGF0YS9sb29wYmFjay5zaCAmIgorIyBRdWlja2x5IGNvbm5lY3QgVVNCIGF1ZGlvIGlmIG5lZWRlZCwgZWl0aGVyIG1hbnVhbGx5IG9yIHZpYSBUaWdlcnRhaWwgc3dpdGNoLgorIyBXYWl0IHVudGlsIHRoZSB0ZXN0IGNvbXBsZXRlcywgcmVzdG9yZSBVU0IgdG8gaG9zdCBpZiBuZWVkZWQsIGFuZCB0aGVuOgorIyAgICBhZGIgcHVsbCAvZGF0YS9sb29wcmVwb3J0LnR4dAorIyAgICBhZGIgcHVsbCAvZGF0YS9sb29wYmFja19hbGwud2F2CisjICAgIGFkYiBwdWxsIC9kYXRhL2xvb3BiYWNrX2VjaG9zLndhdgogCiBTTEVFUF9USU1FPTEwCi1URVNUX0NPTU1BTkQ9ImFhdWRpb19sb29wYmFjayAtcGwgLVBsIC1DMSAtbjIgLW0yIC10bSAtZDUiCitURVNUX0NPTU1BTkQ9Ii9kYXRhL25hdGl2ZXRlc3QvYWF1ZGlvX2xvb3BiYWNrL2FhdWRpb19sb29wYmFjayAtcGwgLVBsIC1DMSAtbjIgLW0yIC10ZSAtZDUiCisjIFBhcnRpYWwgbGlzdCBvZiBvcHRpb25zOgorIyAgIC1wbCAob3V0cHV0KSBwZXJmb3JtYW5jZSBtb2RlOiBsb3cgbGF0ZW5jeQorIyAgIC1QbCBpbnB1dCBwZXJmb3JtYW5jZSBtb2RlOiBsb3cgbGF0ZW5jeQorIyAgIC1DMSBpbnB1dCBjaGFubmVsIGNvdW50OiAxCisjICAgLW4yIG51bWJlciBvZiBidXJzdHM6IDIKKyMgICAtbTIgbW1hcCBwb2xpY3k6IDIKKyMgICAtdD8gdGVzdCBtb2RlOiAtdG0gZm9yIHNpbmUgbWFnbml0dWRlLCAtdGUgZm9yIGVjaG8gbGF0ZW5jeSwgLXRmIGZvciBmaWxlIGxhdGVuY3kKKyMgICAtZDUgZGV2aWNlIElECisjIEZvciBmdWxsIGxpc3Qgb2YgYXZhaWxhYmxlIG9wdGlvbnMsIHNlZSBBQXVkaW9BcmdzUGFyc2VyLmggYW5kIGxvb3BiYWNrLmNwcAogCiBlY2hvICJQbHVnIGluIFVTQiBNaXIgYW5kIEZ1biBQbHVnLiIKIGVjaG8gIlRlc3Qgd2lsbCBzdGFydCBpbiAke1NMRUVQX1RJTUV9IHNlY29uZHM6ICR7VEVTVF9DT01NQU5EfSIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9BcmdzUGFyc2VyLmggYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvQXJnc1BhcnNlci5oCmluZGV4IGFkYTM3ZTIuLjg4ZDc0MDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9BcmdzUGFyc2VyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb0FyZ3NQYXJzZXIuaApAQCAtMTcsNyArMTcsMTAgQEAKICNpZm5kZWYgQUFVRElPX0VYQU1QTEVfQVJHU19QQVJTRVJfSAogI2RlZmluZSBBQVVESU9fRVhBTVBMRV9BUkdTX1BBUlNFUl9ICiAKLSNpbmNsdWRlIDxjY3R5cGU+CisjZGVmaW5lIE1BWF9DSEFOTkVMUyAgICAgICAgICAgICAgICAgICAgIDgKKworLy8jaW5jbHVkZSA8Y2N0eXBlPgorI2luY2x1ZGUgPGRsZmNuLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KQEAgLTI3LDcgKzMwLDYzIEBACiAKICNpbmNsdWRlICJBQXVkaW9FeGFtcGxlVXRpbHMuaCIKIAotLy8gVE9ETyB1c2UgdGhpcyBhcyBhIGJhc2UgY2xhc3Mgd2l0aGluIEFBdWRpbworCitzdGF0aWMgdm9pZCAoKnNfc2V0VXNhZ2UpKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsIGFhdWRpb191c2FnZV90IHVzYWdlKSA9IG51bGxwdHI7CitzdGF0aWMgdm9pZCAoKnNfc2V0Q29udGVudFR5cGUpKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19jb250ZW50X3R5cGVfdCBjb250ZW50VHlwZSkgPSBudWxscHRyOworc3RhdGljIHZvaWQgKCpzX3NldElucHV0UHJlc2V0KShBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9faW5wdXRfcHJlc2V0X3QgaW5wdXRQcmVzZXQpID0gbnVsbHB0cjsKKworc3RhdGljIGJvb2wgc19sb2FkQXR0ZW1wdGVkID0gZmFsc2U7CitzdGF0aWMgYWF1ZGlvX3VzYWdlX3QgKCpzX2dldFVzYWdlKShBQXVkaW9TdHJlYW0gKnN0cmVhbSkgPSBudWxscHRyOworc3RhdGljIGFhdWRpb19jb250ZW50X3R5cGVfdCAoKnNfZ2V0Q29udGVudFR5cGUpKEFBdWRpb1N0cmVhbSAqc3RyZWFtKSA9IG51bGxwdHI7CitzdGF0aWMgYWF1ZGlvX2lucHV0X3ByZXNldF90ICgqc19nZXRJbnB1dFByZXNldCkoQUF1ZGlvU3RyZWFtICpzdHJlYW0pID0gbnVsbHB0cjsKKworLy8gTGluayB0byB0ZXN0IGZ1bmN0aW9ucyBpbiBzaGFyZWQgbGlicmFyeS4KK3N0YXRpYyB2b2lkIGxvYWRGdXR1cmVGdW5jdGlvbnMoKSB7CisgICAgaWYgKHNfbG9hZEF0dGVtcHRlZCkgIHJldHVybjsgLy8gb25seSB0cnkgb25jZQorICAgIHNfbG9hZEF0dGVtcHRlZCA9IHRydWU7CisKKyAgICB2b2lkICpoYW5kbGUgPSBkbG9wZW4oImxpYmFhdWRpby5zbyIsIFJUTERfTk9XKTsKKyAgICBpZiAoaGFuZGxlICE9IG51bGxwdHIpIHsKKyAgICAgICAgc19zZXRVc2FnZSA9ICh2b2lkICgqKShBQXVkaW9TdHJlYW1CdWlsZGVyICosIGFhdWRpb191c2FnZV90KSkKKyAgICAgICAgICAgICAgICBkbHN5bShoYW5kbGUsICJBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFVzYWdlIik7CisgICAgICAgIGlmIChzX3NldFVzYWdlID09IG51bGxwdHIpIGdvdG8gZXJyb3I7CisKKyAgICAgICAgc19zZXRDb250ZW50VHlwZSA9ICh2b2lkICgqKShBQXVkaW9TdHJlYW1CdWlsZGVyICosIGFhdWRpb19jb250ZW50X3R5cGVfdCkpCisgICAgICAgICAgICAgICAgZGxzeW0oaGFuZGxlLCAiQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRDb250ZW50VHlwZSIpOworICAgICAgICBpZiAoc19zZXRDb250ZW50VHlwZSA9PSBudWxscHRyKSBnb3RvIGVycm9yOworCisgICAgICAgIHNfc2V0SW5wdXRQcmVzZXQgPSAodm9pZCAoKikoQUF1ZGlvU3RyZWFtQnVpbGRlciAqLCBhYXVkaW9faW5wdXRfcHJlc2V0X3QpKQorICAgICAgICAgICAgICAgIGRsc3ltKGhhbmRsZSwgIkFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0SW5wdXRQcmVzZXQiKTsKKyAgICAgICAgaWYgKHNfc2V0SW5wdXRQcmVzZXQgPT0gbnVsbHB0cikgZ290byBlcnJvcjsKKworICAgICAgICBzX2dldFVzYWdlID0gKGFhdWRpb191c2FnZV90ICgqKShBQXVkaW9TdHJlYW0gKikpCisgICAgICAgICAgICAgICAgZGxzeW0oaGFuZGxlLCAiQUF1ZGlvU3RyZWFtX2dldFVzYWdlIik7CisgICAgICAgIGlmIChzX2dldFVzYWdlID09IG51bGxwdHIpIGdvdG8gZXJyb3I7CisKKyAgICAgICAgc19nZXRDb250ZW50VHlwZSA9IChhYXVkaW9fY29udGVudF90eXBlX3QgKCopKEFBdWRpb1N0cmVhbSAqKSkKKyAgICAgICAgICAgICAgICBkbHN5bShoYW5kbGUsICJBQXVkaW9TdHJlYW1fZ2V0Q29udGVudFR5cGUiKTsKKyAgICAgICAgaWYgKHNfZ2V0Q29udGVudFR5cGUgPT0gbnVsbHB0cikgZ290byBlcnJvcjsKKworICAgICAgICBzX2dldElucHV0UHJlc2V0ID0gKGFhdWRpb19pbnB1dF9wcmVzZXRfdCAoKikoQUF1ZGlvU3RyZWFtICopKQorICAgICAgICAgICAgICAgIGRsc3ltKGhhbmRsZSwgIkFBdWRpb1N0cmVhbV9nZXRJbnB1dFByZXNldCIpOworICAgICAgICBpZiAoc19nZXRJbnB1dFByZXNldCA9PSBudWxscHRyKSBnb3RvIGVycm9yOworICAgIH0KKyAgICByZXR1cm47CisKK2Vycm9yOgorICAgIC8vIHByZXZlbnQgYW55IGNhbGxzIHRvIHRoZXNlIGZ1bmN0aW9ucworICAgIHNfc2V0VXNhZ2UgPSBudWxscHRyOworICAgIHNfc2V0Q29udGVudFR5cGUgPSBudWxscHRyOworICAgIHNfc2V0SW5wdXRQcmVzZXQgPSBudWxscHRyOworICAgIHNfZ2V0VXNhZ2UgPSBudWxscHRyOworICAgIHNfZ2V0Q29udGVudFR5cGUgPSBudWxscHRyOworICAgIHNfZ2V0SW5wdXRQcmVzZXQgPSBudWxscHRyOworICAgIGRsY2xvc2UoaGFuZGxlKTsKKyAgICByZXR1cm47Cit9CisKIGNsYXNzIEFBdWRpb1BhcmFtZXRlcnMgewogcHVibGljOgogCkBAIC0zOSw2ICs5OCwxMCBAQAogICAgIH0KIAogICAgIHZvaWQgc2V0Q2hhbm5lbENvdW50KGludDMyX3QgY2hhbm5lbENvdW50KSB7CisgICAgICAgIGlmIChjaGFubmVsQ291bnQgPiBNQVhfQ0hBTk5FTFMpIHsKKyAgICAgICAgICAgIHByaW50ZigiU29ycnksIE1BWCBvZiAlZCBjaGFubmVscyFcbiIsIE1BWF9DSEFOTkVMUyk7CisgICAgICAgICAgICBjaGFubmVsQ291bnQgPSBNQVhfQ0hBTk5FTFM7CisgICAgICAgIH0KICAgICAgICAgbUNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudDsKICAgICB9CiAKQEAgLTgyLDYgKzE0NSwzMCBAQAogICAgICAgICBtUGVyZm9ybWFuY2VNb2RlID0gcGVyZm9ybWFuY2VNb2RlOwogICAgIH0KIAorICAgIGFhdWRpb191c2FnZV90IGdldFVzYWdlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVVzYWdlOworICAgIH0KKworICAgIHZvaWQgc2V0VXNhZ2UoYWF1ZGlvX3VzYWdlX3QgdXNhZ2UpIHsKKyAgICAgICAgbVVzYWdlID0gdXNhZ2U7CisgICAgfQorCisgICAgYWF1ZGlvX2NvbnRlbnRfdHlwZV90IGdldENvbnRlbnRUeXBlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUNvbnRlbnRUeXBlOworICAgIH0KKworICAgIHZvaWQgc2V0Q29udGVudFR5cGUoYWF1ZGlvX2NvbnRlbnRfdHlwZV90IGNvbnRlbnRUeXBlKSB7CisgICAgICAgIG1Db250ZW50VHlwZSA9IGNvbnRlbnRUeXBlOworICAgIH0KKworICAgIGFhdWRpb19pbnB1dF9wcmVzZXRfdCBnZXRJbnB1dFByZXNldCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1JbnB1dFByZXNldDsKKyAgICB9CisKKyAgICB2b2lkIHNldElucHV0UHJlc2V0KGFhdWRpb19pbnB1dF9wcmVzZXRfdCBpbnB1dFByZXNldCkgeworICAgICAgICBtSW5wdXRQcmVzZXQgPSBpbnB1dFByZXNldDsKKyAgICB9CisKICAgICBpbnQzMl90IGdldERldmljZUlkKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbURldmljZUlkOwogICAgIH0KQEAgLTExMCw2ICsxOTcsMjQgQEAKICAgICAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXREZXZpY2VJZChidWlsZGVyLCBtRGV2aWNlSWQpOwogICAgICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNoYXJpbmdNb2RlKGJ1aWxkZXIsIG1TaGFyaW5nTW9kZSk7CiAgICAgICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0UGVyZm9ybWFuY2VNb2RlKGJ1aWxkZXIsIG1QZXJmb3JtYW5jZU1vZGUpOworCisgICAgICAgIC8vIENhbGwgUCBmdW5jdGlvbnMgaWYgc3VwcG9ydGVkLgorICAgICAgICBsb2FkRnV0dXJlRnVuY3Rpb25zKCk7CisgICAgICAgIGlmIChzX3NldFVzYWdlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHNfc2V0VXNhZ2UoYnVpbGRlciwgbVVzYWdlKTsKKyAgICAgICAgfSBlbHNlIGlmIChtVXNhZ2UgIT0gQUFVRElPX1VOU1BFQ0lGSUVEKXsKKyAgICAgICAgICAgIHByaW50ZigiV0FSTklORzogc2V0VXNhZ2Ugbm90IHN1cHBvcnRlZCIpOworICAgICAgICB9CisgICAgICAgIGlmIChzX3NldENvbnRlbnRUeXBlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHNfc2V0Q29udGVudFR5cGUoYnVpbGRlciwgbUNvbnRlbnRUeXBlKTsKKyAgICAgICAgfSBlbHNlIGlmIChtVXNhZ2UgIT0gQUFVRElPX1VOU1BFQ0lGSUVEKXsKKyAgICAgICAgICAgIHByaW50ZigiV0FSTklORzogc2V0Q29udGVudFR5cGUgbm90IHN1cHBvcnRlZCIpOworICAgICAgICB9CisgICAgICAgIGlmIChzX3NldElucHV0UHJlc2V0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHNfc2V0SW5wdXRQcmVzZXQoYnVpbGRlciwgbUlucHV0UHJlc2V0KTsKKyAgICAgICAgfSBlbHNlIGlmIChtVXNhZ2UgIT0gQUFVRElPX1VOU1BFQ0lGSUVEKXsKKyAgICAgICAgICAgIHByaW50ZigiV0FSTklORzogc2V0SW5wdXRQcmVzZXQgbm90IHN1cHBvcnRlZCIpOworICAgICAgICB9CiAgICAgfQogCiBwcml2YXRlOgpAQCAtMTIyLDYgKzIyNywxMCBAQAogICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCAgICAgIG1TaGFyaW5nTW9kZSAgICAgPSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRDsKICAgICBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90ICBtUGVyZm9ybWFuY2VNb2RlID0gQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORTsKIAorICAgIGFhdWRpb191c2FnZV90ICAgICAgICAgICAgIG1Vc2FnZSAgICAgICAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CisgICAgYWF1ZGlvX2NvbnRlbnRfdHlwZV90ICAgICAgbUNvbnRlbnRUeXBlICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKKyAgICBhYXVkaW9faW5wdXRfcHJlc2V0X3QgICAgICBtSW5wdXRQcmVzZXQgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOworCiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgbU51bWJlck9mQnVyc3RzICA9IEFBVURJT19VTlNQRUNJRklFRDsKIH07CiAKQEAgLTE1Miw4ICsyNjEsMTEgQEAKICAgICAgICAgICAgICAgICBjYXNlICdkJzoKICAgICAgICAgICAgICAgICAgICAgc2V0RGV2aWNlSWQoYXRvaSgmYXJnWzJdKSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgJ3MnOgotICAgICAgICAgICAgICAgICAgICBtRHVyYXRpb25TZWNvbmRzID0gYXRvaSgmYXJnWzJdKTsKKyAgICAgICAgICAgICAgICBjYXNlICdmJzoKKyAgICAgICAgICAgICAgICAgICAgc2V0Rm9ybWF0KGF0b2koJmFyZ1syXSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdpJzoKKyAgICAgICAgICAgICAgICAgICAgc2V0SW5wdXRQcmVzZXQoYXRvaSgmYXJnWzJdKSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgJ20nOiB7CiAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19wb2xpY3lfdCBwb2xpY3kgPSBBQVVESU9fUE9MSUNZX0FVVE87CkBAIC0xNzEsOSArMjgzLDE4IEBACiAgICAgICAgICAgICAgICAgY2FzZSAncic6CiAgICAgICAgICAgICAgICAgICAgIHNldFNhbXBsZVJhdGUoYXRvaSgmYXJnWzJdKSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ3MnOgorICAgICAgICAgICAgICAgICAgICBtRHVyYXRpb25TZWNvbmRzID0gYXRvaSgmYXJnWzJdKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAndSc6CisgICAgICAgICAgICAgICAgICAgIHNldFVzYWdlKGF0b2koJmFyZ1syXSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlICd4JzoKICAgICAgICAgICAgICAgICAgICAgc2V0U2hhcmluZ01vZGUoQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICd5JzoKKyAgICAgICAgICAgICAgICAgICAgc2V0Q29udGVudFR5cGUoYXRvaSgmYXJnWzJdKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgIHVucmVjb2duaXplZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjAxLDI0ICszMjIsMzIgQEAKICAgICB9CiAKICAgICBzdGF0aWMgdm9pZCB1c2FnZSgpIHsKLSAgICAgICAgcHJpbnRmKCItY3tjaGFubmVsc30gLWR7ZHVyYXRpb259IC1tIC1ue2J1cnN0c1BlckJ1ZmZlcn0gLXB7cGVyZk1vZGV9IC1ye3JhdGV9IC14XG4iKTsKKyAgICAgICAgcHJpbnRmKCItY3tjaGFubmVsc30gLWR7ZGV2aWNlSWR9IC1te21tYXBQb2xpY3l9IC1ue2J1cnN0c1BlckJ1ZmZlcn0gLXB7cGVyZk1vZGV9Iik7CisgICAgICAgIHByaW50ZigiIC1ye3JhdGV9IC1ze3NlY29uZHN9IC14XG4iKTsKICAgICAgICAgcHJpbnRmKCIgICAgICBEZWZhdWx0IHZhbHVlcyBhcmUgVU5TUEVDSUZJRUQgdW5sZXNzIG90aGVyd2lzZSBzdGF0ZWQuXG4iKTsKICAgICAgICAgcHJpbnRmKCIgICAgICAtYntidWZmZXJDYXBhY2l0eX0gZnJhbWVzXG4iKTsKICAgICAgICAgcHJpbnRmKCIgICAgICAtY3tjaGFubmVsc30gZm9yIGV4YW1wbGUgMiBmb3Igc3RlcmVvXG4iKTsKICAgICAgICAgcHJpbnRmKCIgICAgICAtZHtkZXZpY2VJZH0gZGVmYXVsdCBpcyAlZFxuIiwgQUFVRElPX1VOU1BFQ0lGSUVEKTsKLSAgICAgICAgcHJpbnRmKCIgICAgICAtc3tkdXJhdGlvbn0gaW4gc2Vjb25kcywgZGVmYXVsdCBpcyAlZFxuIiwgREVGQVVMVF9EVVJBVElPTl9TRUNPTkRTKTsKKyAgICAgICAgcHJpbnRmKCIgICAgICAtZnswfDF8Mn0gc2V0IGZvcm1hdFxuIik7CisgICAgICAgIHByaW50ZigiICAgICAgICAgIDAgPSBVTlNQRUNJRklFRFxuIik7CisgICAgICAgIHByaW50ZigiICAgICAgICAgIDEgPSBQQ01fSTE2XG4iKTsKKyAgICAgICAgcHJpbnRmKCIgICAgICAgICAgMiA9IEZMT0FUXG4iKTsKKyAgICAgICAgcHJpbnRmKCIgICAgICAtaXtpbnB1dFByZXNldH0gZWcuIDUgZm9yIEFBVURJT19JTlBVVF9QUkVTRVRfQ0FNQ09SREVSXG4iKTsKICAgICAgICAgcHJpbnRmKCIgICAgICAtbXswfDF8MnwzfSBzZXQgTU1BUCBwb2xpY3lcbiIpOwotICAgICAgICBwcmludGYoIiAgICAgICAgICAwID0gX1VOU1BFQ0lGSUVELCBkZWZhdWx0XG4iKTsKLSAgICAgICAgcHJpbnRmKCIgICAgICAgICAgMSA9IF9ORVZFUlxuIik7Ci0gICAgICAgIHByaW50ZigiICAgICAgICAgIDIgPSBfQVVUTywgYWxzbyBpZiAtbSBpcyB1c2VkIHdpdGggbm8gbnVtYmVyXG4iKTsKLSAgICAgICAgcHJpbnRmKCIgICAgICAgICAgMyA9IF9BTFdBWVNcbiIpOworICAgICAgICBwcmludGYoIiAgICAgICAgICAwID0gX1VOU1BFQ0lGSUVELCB1c2UgYWF1ZGlvLm1tYXBfcG9saWN5IHN5c3RlbSBwcm9wZXJ0eSwgZGVmYXVsdFxuIik7CisgICAgICAgIHByaW50ZigiICAgICAgICAgIDEgPSBfTkVWRVIsIG5ldmVyIHVzZSBNTUFQXG4iKTsKKyAgICAgICAgcHJpbnRmKCIgICAgICAgICAgMiA9IF9BVVRPLCB1c2UgTU1BUCBpZiBhdmFpbGFibGUsIGRlZmF1bHQgZm9yIC1tIHdpdGggbm8gbnVtYmVyXG4iKTsKKyAgICAgICAgcHJpbnRmKCIgICAgICAgICAgMyA9IF9BTFdBWVMsIHVzZSBNTUFQIG9yIGZhaWxcbiIpOwogICAgICAgICBwcmludGYoIiAgICAgIC1ue251bWJlck9mQnVyc3RzfSBmb3Igc2V0QnVmZmVyU2l6ZVxuIik7CiAgICAgICAgIHByaW50ZigiICAgICAgLXB7cGVyZm9ybWFuY2VNb2RlfSBzZXQgb3V0cHV0IEFBVURJT19QRVJGT1JNQU5DRV9NT0RFKiwgZGVmYXVsdCBOT05FXG4iKTsKICAgICAgICAgcHJpbnRmKCIgICAgICAgICAgbiBmb3IgX05PTkVcbiIpOwogICAgICAgICBwcmludGYoIiAgICAgICAgICBsIGZvciBfTEFURU5DWVxuIik7CiAgICAgICAgIHByaW50ZigiICAgICAgICAgIHAgZm9yIF9QT1dFUl9TQVZJTkc7XG4iKTsKICAgICAgICAgcHJpbnRmKCIgICAgICAtcntzYW1wbGVSYXRlfSBmb3IgZXhhbXBsZSA0NDEwMFxuIik7CisgICAgICAgIHByaW50ZigiICAgICAgLXN7ZHVyYXRpb259IGluIHNlY29uZHMsIGRlZmF1bHQgaXMgJWRcbiIsIERFRkFVTFRfRFVSQVRJT05fU0VDT05EUyk7CisgICAgICAgIHByaW50ZigiICAgICAgLXV7dXNhZ2V9IGVnLiAxNCBmb3IgQUFVRElPX1VTQUdFX0dBTUVcbiIpOwogICAgICAgICBwcmludGYoIiAgICAgIC14IHRvIHVzZSBFWENMVVNJVkUgbW9kZVxuIik7CisgICAgICAgIHByaW50ZigiICAgICAgLXl7Y29udGVudFR5cGV9IGVnLiAxIGZvciBBQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSFxuIik7CiAgICAgfQogCiAgICAgc3RhdGljIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGFyc2VQZXJmb3JtYW5jZU1vZGUoY2hhciBjKSB7CkBAIC0yODEsNiArNDEwLDI0IEBACiAKICAgICAgICAgcHJpbnRmKCIgIFBlcmZvcm1hbmNlTW9kZTogcmVxdWVzdGVkID0gJWQsIGFjdHVhbCA9ICVkXG4iLAogICAgICAgICAgICAgICAgZ2V0UGVyZm9ybWFuY2VNb2RlKCksIEFBdWRpb1N0cmVhbV9nZXRQZXJmb3JtYW5jZU1vZGUoc3RyZWFtKSk7CisKKyAgICAgICAgbG9hZEZ1dHVyZUZ1bmN0aW9ucygpOworCisgICAgICAgIGlmIChzX3NldFVzYWdlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHByaW50ZigiICBVc2FnZTogICAgICAgIHJlcXVlc3RlZCA9ICVkLCBhY3R1YWwgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBnZXRVc2FnZSgpLCBzX2dldFVzYWdlKHN0cmVhbSkpOworICAgICAgICB9CisgICAgICAgIGlmIChzX2dldENvbnRlbnRUeXBlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHByaW50ZigiICBDb250ZW50VHlwZTogIHJlcXVlc3RlZCA9ICVkLCBhY3R1YWwgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBnZXRDb250ZW50VHlwZSgpLCBzX2dldENvbnRlbnRUeXBlKHN0cmVhbSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKEFBdWRpb1N0cmVhbV9nZXREaXJlY3Rpb24oc3RyZWFtKSA9PSBBQVVESU9fRElSRUNUSU9OX0lOUFVUCisgICAgICAgICAgICAmJiBzX2dldElucHV0UHJlc2V0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIiAgSW5wdXRQcmVzZXQ6ICByZXF1ZXN0ZWQgPSAlZCwgYWN0dWFsID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGdldElucHV0UHJlc2V0KCksIHNfZ2V0SW5wdXRQcmVzZXQoc3RyZWFtKSk7CisgICAgICAgIH0KKwogICAgICAgICBwcmludGYoIiAgSXMgTU1BUCB1c2VkPyAlc1xuIiwgQUF1ZGlvU3RyZWFtX2lzTU1hcFVzZWQoc3RyZWFtKQogICAgICAgICAgICAgICAgPyAieWVzIiA6ICJubyIpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvRXhhbXBsZVV0aWxzLmggYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvRXhhbXBsZVV0aWxzLmgKaW5kZXggYzE3OWNlNi4uNDZiODg5NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb0V4YW1wbGVVdGlscy5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9FeGFtcGxlVXRpbHMuaApAQCAtMTgsOCArMTgsMTAgQEAKICNkZWZpbmUgQUFVRElPX0VYQU1QTEVfVVRJTFNfSAogCiAjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KICNpbmNsdWRlIDxzY2hlZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKQEAgLTMwLDYgKzMyLDcgQEAKICNkZWZpbmUgTkFOT1NfUEVSX01JTExJU0VDT05EIChOQU5PU19QRVJfTUlDUk9TRUNPTkQgKiAxMDAwKQogI2RlZmluZSBOQU5PU19QRVJfU0VDT05EICAgICAgKE5BTk9TX1BFUl9NSUxMSVNFQ09ORCAqIDEwMDApCiAKK3RlbXBsYXRlIDxjbGFzcyBUID0gYWF1ZGlvX3NoYXJpbmdfbW9kZV90PgogY29uc3QgY2hhciAqZ2V0U2hhcmluZ01vZGVUZXh0KGFhdWRpb19zaGFyaW5nX21vZGVfdCBtb2RlKSB7CiAgICAgY29uc3QgY2hhciAqdGV4dCA9ICJ1bmtub3duIjsKICAgICBzd2l0Y2ggKG1vZGUpIHsKQEAgLTc4LDEzICs4MSwxNSBAQAogICAgIHJldHVybiB0ZXh0OwogfQogCi1zdGF0aWMgdm9pZCBjb252ZXJ0TmFub3NlY29uZHNUb1RpbWVzcGVjKGludDY0X3QgbmFub3NlY29uZHMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZSkgewordGVtcGxhdGUgPGNsYXNzIFQgPSBpbnQ2NF90Pgordm9pZCBjb252ZXJ0TmFub3NlY29uZHNUb1RpbWVzcGVjKGludDY0X3QgbmFub3NlY29uZHMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZSkgewogICAgIHRpbWUtPnR2X3NlYyA9IG5hbm9zZWNvbmRzIC8gTkFOT1NfUEVSX1NFQ09ORDsKICAgICAvLyBDYWxjdWxhdGUgdGhlIGZyYWN0aW9uYWwgbmFub3NlY29uZHMuIEF2b2lkcyBleHBlbnNpdmUgJSBvcGVyYXRpb24uCiAgICAgdGltZS0+dHZfbnNlYyA9IG5hbm9zZWNvbmRzIC0gKHRpbWUtPnR2X3NlYyAqIE5BTk9TX1BFUl9TRUNPTkQpOwogfQogCi1zdGF0aWMgaW50NjRfdCBnZXROYW5vc2Vjb25kcyhjbG9ja2lkX3QgY2xvY2tJZCA9IENMT0NLX01PTk9UT05JQykgewordGVtcGxhdGUgPGNsYXNzIFQgPSBjbG9ja2lkX3Q+CitpbnQ2NF90IGdldE5hbm9zZWNvbmRzKGNsb2NraWRfdCBjbG9ja0lkID0gQ0xPQ0tfTU9OT1RPTklDKSB7CiAgICAgc3RydWN0IHRpbWVzcGVjIHRpbWU7CiAgICAgaW50IHJlc3VsdCA9IGNsb2NrX2dldHRpbWUoY2xvY2tJZCwgJnRpbWUpOwogICAgIGlmIChyZXN1bHQgPCAwKSB7CkBAIC05Myw3ICs5OCw4IEBACiAgICAgcmV0dXJuICh0aW1lLnR2X3NlYyAqIE5BTk9TX1BFUl9TRUNPTkQpICsgdGltZS50dl9uc2VjOwogfQogCi1zdGF0aWMgdm9pZCBkaXNwbGF5UGVha0xldmVsKGZsb2F0IHBlYWtMZXZlbCkgewordGVtcGxhdGUgPGNsYXNzIFQgPSBmbG9hdD4KK3ZvaWQgZGlzcGxheVBlYWtMZXZlbChmbG9hdCBwZWFrTGV2ZWwpIHsKICAgICBwcmludGYoIiU1LjNmICIsIHBlYWtMZXZlbCk7CiAgICAgY29uc3QgaW50IG1heFN0YXJzID0gNTA7IC8vIGFyYml0cmFyeSwgZml0cyBvbiBvbmUgbGluZQogICAgIGludCBudW1TdGFycyA9IChpbnQpIChwZWFrTGV2ZWwgKiBtYXhTdGFycyk7CkBAIC0xMTEsNyArMTE3LDggQEAKICAqIEBwYXJhbSBzYW1wbGVSYXRlCiAgKiBAcmV0dXJuIGxhdGVuY3kgaW4gbWlsbGlzZWNvbmRzCiAgKi8KLXN0YXRpYyBkb3VibGUgY2FsY3VsYXRlTGF0ZW5jeU1pbGxpcyhpbnQ2NF90IHBvc2l0aW9uMSwgaW50NjRfdCBuYW5vc2Vjb25kczEsCit0ZW1wbGF0ZSA8Y2xhc3MgVCA9IGludDY0X3Q+Citkb3VibGUgY2FsY3VsYXRlTGF0ZW5jeU1pbGxpcyhpbnQ2NF90IHBvc2l0aW9uMSwgaW50NjRfdCBuYW5vc2Vjb25kczEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHBvc2l0aW9uMiwgaW50NjRfdCBuYW5vc2Vjb25kczIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHNhbXBsZVJhdGUpIHsKICAgICBpbnQ2NF90IGRlbHRhRnJhbWVzID0gcG9zaXRpb24yIC0gcG9zaXRpb24xOwpAQCAtMTI1LDcgKzEzMiw4IEBACiAKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLyBUaGVzZSBGdXRleCBjYWxscyBhcmUgY29tbW9uIG9ubGluZSBleGFtcGxlcy4KLXN0YXRpYyBhbmRyb2lkOjpzdGF0dXNfdCBzeXNfZnV0ZXgodm9pZCAqYWRkcjEsIGludCBvcCwgaW50IHZhbDEsCit0ZW1wbGF0ZSA8Y2xhc3MgVCA9IGludD4KK2FuZHJvaWQ6OnN0YXR1c190IHN5c19mdXRleCh2b2lkICphZGRyMSwgaW50IG9wLCBpbnQgdmFsMSwKICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVvdXQsIHZvaWQgKmFkZHIyLCBpbnQgdmFsMykgewogICAgIGFuZHJvaWQ6OnN0YXR1c190IHJlc3VsdCA9IChhbmRyb2lkOjpzdGF0dXNfdCkgc3lzY2FsbChTWVNfZnV0ZXgsIGFkZHIxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcCwgdmFsMSwgdGltZW91dCwKQEAgLTEzMywxMiArMTQxLDE0IEBACiAgICAgcmV0dXJuIChyZXN1bHQgPT0gMCkgPyAwIDogLWVycm5vOwogfQogCi1zdGF0aWMgYW5kcm9pZDo6c3RhdHVzX3QgZnV0ZXhfd2FrZSh2b2lkICphZGRyLCBpbnQgbnVtV2FrZSkgewordGVtcGxhdGUgPGNsYXNzIFQgPSBpbnQ+CithbmRyb2lkOjpzdGF0dXNfdCBmdXRleF93YWtlKHZvaWQgKmFkZHIsIGludCBudW1XYWtlKSB7CiAgICAgLy8gVXNlIF9QUklWQVRFIGJlY2F1c2Ugd2UgYXJlIGp1c3QgdXNpbmcgdGhlIGZ1dGV4IGluIG9uZSBwcm9jZXNzLgogICAgIHJldHVybiBzeXNfZnV0ZXgoYWRkciwgRlVURVhfV0FLRV9QUklWQVRFLCBudW1XYWtlLCBOVUxMLCBOVUxMLCAwKTsKIH0KIAotc3RhdGljIGFuZHJvaWQ6OnN0YXR1c190IGZ1dGV4X3dhaXQodm9pZCAqYWRkciwgaW50IGN1cnJlbnQsIHN0cnVjdCB0aW1lc3BlYyAqdGltZSkgewordGVtcGxhdGUgPGNsYXNzIFQgPSBpbnQ+CithbmRyb2lkOjpzdGF0dXNfdCBmdXRleF93YWl0KHZvaWQgKmFkZHIsIGludCBjdXJyZW50LCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWUpIHsKICAgICAvLyBVc2UgX1BSSVZBVEUgYmVjYXVzZSB3ZSBhcmUganVzdCB1c2luZyB0aGUgZnV0ZXggaW4gb25lIHByb2Nlc3MuCiAgICAgcmV0dXJuIHN5c19mdXRleChhZGRyLCBGVVRFWF9XQUlUX1BSSVZBVEUsIGN1cnJlbnQsIHRpbWUsIE5VTEwsIDApOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb1NpbXBsZVBsYXllci5oIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb1NpbXBsZVBsYXllci5oCmluZGV4IDYwNmM0YmEuLjU0Yjc3YmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9TaW1wbGVQbGF5ZXIuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvU2ltcGxlUGxheWVyLmgKQEAgLTE5LDExICsxOSwxMCBAQAogI2lmbmRlZiBBQVVESU9fU0lNUExFX1BMQVlFUl9ICiAjZGVmaW5lIEFBVURJT19TSU1QTEVfUExBWUVSX0gKIAotI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHNjaGVkLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+Ci0jaW5jbHVkZSA8YXRvbWljPgogI2luY2x1ZGUgIkFBdWRpb0FyZ3NQYXJzZXIuaCIKICNpbmNsdWRlICJTaW5lR2VuZXJhdG9yLmgiCiAKQEAgLTMxLDEyICszMCwxMiBAQAogI2RlZmluZSBTSEFSSU5HX01PREUgIEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVECiAjZGVmaW5lIFBFUkZPUk1BTkNFX01PREUgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORQogCi0vLyBBcmJpdHJhcnkgcGVyaW9kIGZvciBnbGl0Y2hlcywgb25jZSBwZXIgc2Vjb25kIGF0IDQ4MDAwIEh6LgotI2RlZmluZSBGT1JDRURfVU5ERVJSVU5fUEVSSU9EX0ZSQU1FUyAgICA0ODAwMAorLy8gQXJiaXRyYXJ5IHBlcmlvZCBmb3IgZ2xpdGNoZXMKKyNkZWZpbmUgRk9SQ0VEX1VOREVSUlVOX1BFUklPRF9GUkFNRVMgICAgKDIgKiA0ODAwMCkKIC8vIEhvdyBsb25nIHRvIHNsZWVwIGluIGEgY2FsbGJhY2sgdG8gY2F1c2UgYW4gaW50ZW50aW9uYWwgZ2xpdGNoLiBGb3IgdGVzdGluZy4KICNkZWZpbmUgRk9SQ0VEX1VOREVSUlVOX1NMRUVQX01JQ1JPUyAgICAgKDEwICogMTAwMCkKIAotI2RlZmluZSBNQVhfVElNRVNUQU1QUyAgIDE2CisjZGVmaW5lIE1BWF9USU1FU1RBTVBTICAgICAgICAgICAgICAgICAgIDE2CiAKIHR5cGVkZWYgc3RydWN0IFRpbWVzdGFtcCB7CiAgICAgaW50NjRfdCBwb3NpdGlvbjsKQEAgLTcwLDEzICs2OSw2IEBACiAgICAgfQogCiAgICAgLy8gVE9ETyBFeHRyYWN0IGEgY29tbW9uIGJhc2UgY2xhc3MgZm9yIHJlY29yZCBhbmQgcGxheWJhY2suCi0gICAgLyoqCi0gICAgICogQWxzbyBrbm93biBhcyAic2FtcGxlIHJhdGUiCi0gICAgICogT25seSBjYWxsIHRoaXMgYWZ0ZXIgb3BlbigpIGhhcyBiZWVuIGNhbGxlZC4KLSAgICAgKi8KLSAgICBpbnQzMl90IGdldEZyYW1lc1BlclNlY29uZCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIGdldFNhbXBsZVJhdGUoKTsgLy8gYWxpYXMKLSAgICB9CiAKICAgICAvKioKICAgICAgKiBPbmx5IGNhbGwgdGhpcyBhZnRlciBvcGVuKCkgaGFzIGJlZW4gY2FsbGVkLgpAQCAtMTcyLDEyICsxNjQsMTIgQEAKICAgICAgICAgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKGJ1aWxkZXIsICZtU3RyZWFtKTsKIAogICAgICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX2RlbGV0ZShidWlsZGVyKTsKKwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAogICAgIGFhdWRpb19yZXN1bHRfdCBjbG9zZSgpIHsKICAgICAgICAgaWYgKG1TdHJlYW0gIT0gbnVsbHB0cikgewotICAgICAgICAgICAgcHJpbnRmKCJjYWxsIEFBdWRpb1N0cmVhbV9jbG9zZSglcClcbiIsIG1TdHJlYW0pOyAgZmZsdXNoKHN0ZG91dCk7CiAgICAgICAgICAgICBBQXVkaW9TdHJlYW1fY2xvc2UobVN0cmVhbSk7CiAgICAgICAgICAgICBtU3RyZWFtID0gbnVsbHB0cjsKICAgICAgICAgfQpAQCAtMjEyLDEzICsyMDQsMzUgQEAKICAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcChtU3RyZWFtKTsKICAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKICAgICAgICAgICAgIHByaW50ZigiRVJST1IgLSBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0b3AoKSByZXR1cm5lZCAlZCAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKKyAgICAgICAgICAgICAgICAgICByZXN1bHQsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOwogICAgICAgICB9CiAgICAgICAgIGludDMyX3QgeFJ1bkNvdW50ID0gQUF1ZGlvU3RyZWFtX2dldFhSdW5Db3VudChtU3RyZWFtKTsKICAgICAgICAgcHJpbnRmKCJBQXVkaW9TdHJlYW1fZ2V0WFJ1bkNvdW50ICVkXG4iLCB4UnVuQ291bnQpOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAorICAgIC8vIFBhdXNlIHRoZSBzdHJlYW0uIEFBdWRpbyB3aWxsIHN0b3AgY2FsbGluZyB5b3VyIGNhbGxiYWNrIGZ1bmN0aW9uLgorICAgIGFhdWRpb19yZXN1bHRfdCBwYXVzZSgpIHsKKyAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1N0cmVhbV9yZXF1ZXN0UGF1c2UobVN0cmVhbSk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICBwcmludGYoIkVSUk9SIC0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RQYXVzZSgpIHJldHVybmVkICVkICVzXG4iLAorICAgICAgICAgICAgICAgICAgIHJlc3VsdCwgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CisgICAgICAgIH0KKyAgICAgICAgaW50MzJfdCB4UnVuQ291bnQgPSBBQXVkaW9TdHJlYW1fZ2V0WFJ1bkNvdW50KG1TdHJlYW0pOworICAgICAgICBwcmludGYoIkFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQgJWRcbiIsIHhSdW5Db3VudCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLy8gRmx1c2ggdGhlIHN0cmVhbS4gQUF1ZGlvIHdpbGwgc3RvcCBjYWxsaW5nIHlvdXIgY2FsbGJhY2sgZnVuY3Rpb24uCisgICAgYWF1ZGlvX3Jlc3VsdF90IGZsdXNoKCkgeworICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RGbHVzaChtU3RyZWFtKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgIHByaW50ZigiRVJST1IgLSBBQXVkaW9TdHJlYW1fcmVxdWVzdEZsdXNoKCkgcmV0dXJuZWQgJWQgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgcmVzdWx0LCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKwogICAgIEFBdWRpb1N0cmVhbSAqZ2V0U3RyZWFtKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbVN0cmVhbTsKICAgICB9CkBAIC0yMzIsMjMgKzI0Niw0OSBAQAogCiB0eXBlZGVmIHN0cnVjdCBTaW5lVGhyZWFkZWREYXRhX3MgewogCi0gICAgU2luZUdlbmVyYXRvciAgc2luZU9zYzE7Ci0gICAgU2luZUdlbmVyYXRvciAgc2luZU9zYzI7Ci0gICAgVGltZXN0YW1wICAgICAgdGltZXN0YW1wc1tNQVhfVElNRVNUQU1QU107Ci0gICAgaW50NjRfdCAgICAgICAgZnJhbWVzVG90YWwgPSAwOwotICAgIGludDY0X3QgICAgICAgIG5leHRGcmFtZVRvR2xpdGNoID0gRk9SQ0VEX1VOREVSUlVOX1BFUklPRF9GUkFNRVM7Ci0gICAgaW50MzJfdCAgICAgICAgbWluTnVtRnJhbWVzID0gSU5UMzJfTUFYOwotICAgIGludDMyX3QgICAgICAgIG1heE51bUZyYW1lcyA9IDA7Ci0gICAgaW50MzJfdCAgICAgICAgdGltZXN0YW1wQ291bnQgPSAwOyAvLyBpbiB0aW1lc3RhbXBzCisgICAgU2luZUdlbmVyYXRvciAgICAgIHNpbmVPc2NpbGxhdG9yc1tNQVhfQ0hBTk5FTFNdOworICAgIFRpbWVzdGFtcCAgICAgICAgICB0aW1lc3RhbXBzW01BWF9USU1FU1RBTVBTXTsKKyAgICBpbnQ2NF90ICAgICAgICAgICAgZnJhbWVzVG90YWwgPSAwOworICAgIGludDY0X3QgICAgICAgICAgICBuZXh0RnJhbWVUb0dsaXRjaCA9IEZPUkNFRF9VTkRFUlJVTl9QRVJJT0RfRlJBTUVTOworICAgIGludDMyX3QgICAgICAgICAgICBtaW5OdW1GcmFtZXMgPSBJTlQzMl9NQVg7CisgICAgaW50MzJfdCAgICAgICAgICAgIG1heE51bUZyYW1lcyA9IDA7CisgICAgaW50MzJfdCAgICAgICAgICAgIHRpbWVzdGFtcENvdW50ID0gMDsgLy8gaW4gdGltZXN0YW1wcworICAgIGludDMyX3QgICAgICAgICAgICBzYW1wbGVSYXRlID0gNDgwMDA7CisgICAgaW50MzJfdCAgICAgICAgICAgIHByZWZpeFRvbmVGcmFtZXMgPSAwOworICAgIGJvb2wgICAgICAgICAgICAgICBzd2VlcFNldHVwID0gZmFsc2U7CiAKLSAgICBpbnQgICAgICAgICAgICBzY2hlZHVsZXIgPSAwOwotICAgIGJvb2wgICAgICAgICAgIHNjaGVkdWxlckNoZWNrZWQgPSBmYWxzZTsKLSAgICBib29sICAgICAgICAgICBmb3JjZVVuZGVycnVucyA9IGZhbHNlOworICAgIGludCAgICAgICAgICAgICAgICBzY2hlZHVsZXIgPSAwOworICAgIGJvb2wgICAgICAgICAgICAgICBzY2hlZHVsZXJDaGVja2VkID0gZmFsc2U7CisgICAgYm9vbCAgICAgICAgICAgICAgIGZvcmNlVW5kZXJydW5zID0gZmFsc2U7CiAKICAgICBBQXVkaW9TaW1wbGVQbGF5ZXIgc2ltcGxlUGxheWVyOwogICAgIGludDMyX3QgICAgICAgICAgICBjYWxsYmFja0NvdW50ID0gMDsKICAgICBXYWtlVXAgICAgICAgICAgICAgd2FrZXJ7QUFVRElPX09LfTsKIAorICAgIC8qKgorICAgICAqIFNldCBzYW1wbGVSYXRlIGZpcnN0LgorICAgICAqLworICAgIHZvaWQgc2V0dXBTaW5lQmxpcCgpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfQ0hBTk5FTFM7ICsraSkgeworICAgICAgICAgICAgZG91YmxlIGNlbnRlckZyZXF1ZW5jeSA9IDg4MC4wICogKGkgKyAyKTsKKyAgICAgICAgICAgIHNpbmVPc2NpbGxhdG9yc1tpXS5zZXR1cChjZW50ZXJGcmVxdWVuY3ksIHNhbXBsZVJhdGUpOworICAgICAgICAgICAgc2luZU9zY2lsbGF0b3JzW2ldLnNldFN3ZWVwKGNlbnRlckZyZXF1ZW5jeSwgY2VudGVyRnJlcXVlbmN5LCAwLjApOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBzZXR1cFNpbmVTd2VlcHMoKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0NIQU5ORUxTOyArK2kpIHsKKyAgICAgICAgICAgIGRvdWJsZSBjZW50ZXJGcmVxdWVuY3kgPSAyMjAuMCAqIChpICsgMik7CisgICAgICAgICAgICBzaW5lT3NjaWxsYXRvcnNbaV0uc2V0dXAoY2VudGVyRnJlcXVlbmN5LCBzYW1wbGVSYXRlKTsKKyAgICAgICAgICAgIGRvdWJsZSBtaW5GcmVxdWVuY3kgPSBjZW50ZXJGcmVxdWVuY3kgKiAyLjAgLyAzLjA7CisgICAgICAgICAgICAvLyBDaGFuZ2UgcmFuZ2Ugc2xpZ2h0bHkgc28gdGhleSB3aWxsIGdvIG91dCBvZiBwaGFzZS4KKyAgICAgICAgICAgIGRvdWJsZSBtYXhGcmVxdWVuY3kgPSBjZW50ZXJGcmVxdWVuY3kgKiAzLjAgLyAyLjA7CisgICAgICAgICAgICBkb3VibGUgc3dlZXBTZWNvbmRzID0gNS4wICsgaTsKKyAgICAgICAgICAgIHNpbmVPc2NpbGxhdG9yc1tpXS5zZXRTd2VlcChtaW5GcmVxdWVuY3ksIG1heEZyZXF1ZW5jeSwgc3dlZXBTZWNvbmRzKTsKKyAgICAgICAgfQorICAgICAgICBzd2VlcFNldHVwID0gdHJ1ZTsKKyAgICB9CisKIH0gU2luZVRocmVhZGVkRGF0YV90OwogCiAvLyBDYWxsYmFjayBmdW5jdGlvbiB0aGF0IGZpbGxzIHRoZSBhdWRpbyBvdXRwdXQgYnVmZmVyLgpAQCAtMjY1LDkgKzMwNSwxMSBAQAogICAgICAgICByZXR1cm4gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QOwogICAgIH0KICAgICBTaW5lVGhyZWFkZWREYXRhX3QgKnNpbmVEYXRhID0gKFNpbmVUaHJlYWRlZERhdGFfdCAqKSB1c2VyRGF0YTsKLSAgICBzaW5lRGF0YS0+Y2FsbGJhY2tDb3VudCsrOwogCi0gICAgc2luZURhdGEtPmZyYW1lc1RvdGFsICs9IG51bUZyYW1lczsKKyAgICAvLyBQbGF5IGFuIGluaXRpYWwgaGlnaCB0b25lIHNvIHdlIGNhbiB0ZWxsIHdoZXRoZXIgdGhlIGJlZ2lubmluZyB3YXMgdHJ1bmNhdGVkLgorICAgIGlmICghc2luZURhdGEtPnN3ZWVwU2V0dXAgJiYgc2luZURhdGEtPmZyYW1lc1RvdGFsID49IHNpbmVEYXRhLT5wcmVmaXhUb25lRnJhbWVzKSB7CisgICAgICAgIHNpbmVEYXRhLT5zZXR1cFNpbmVTd2VlcHMoKTsKKyAgICB9CiAKICAgICBpZiAoc2luZURhdGEtPmZvcmNlVW5kZXJydW5zKSB7CiAgICAgICAgIGlmIChzaW5lRGF0YS0+ZnJhbWVzVG90YWwgPiBzaW5lRGF0YS0+bmV4dEZyYW1lVG9HbGl0Y2gpIHsKQEAgLTMwMSwzMyArMzQzLDMyIEBACiAgICAgfQogCiAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUgPSBBQXVkaW9TdHJlYW1fZ2V0Q2hhbm5lbENvdW50KHN0cmVhbSk7Ci0gICAgLy8gVGhpcyBjb2RlIG9ubHkgcGxheXMgb24gdGhlIGZpcnN0IG9uZSBvciB0d28gY2hhbm5lbHMuCi0gICAgLy8gVE9ETyBTdXBwb3J0IGFyYml0cmFyeSBudW1iZXIgb2YgY2hhbm5lbHMuCisKKworICAgIGludCBudW1BY3RpdmVPc2NpbGF0b3JzID0gKHNhbXBsZXNQZXJGcmFtZSA+IE1BWF9DSEFOTkVMUykgPyBNQVhfQ0hBTk5FTFMgOiBzYW1wbGVzUGVyRnJhbWU7CiAgICAgc3dpdGNoIChBQXVkaW9TdHJlYW1fZ2V0Rm9ybWF0KHN0cmVhbSkpIHsKICAgICAgICAgY2FzZSBBQVVESU9fRk9STUFUX1BDTV9JMTY6IHsKICAgICAgICAgICAgIGludDE2X3QgKmF1ZGlvQnVmZmVyID0gKGludDE2X3QgKikgYXVkaW9EYXRhOwotICAgICAgICAgICAgLy8gUmVuZGVyIHNpbmUgd2F2ZXMgYXMgc2hvcnRzIHRvIGZpcnN0IGNoYW5uZWwuCi0gICAgICAgICAgICBzaW5lRGF0YS0+c2luZU9zYzEucmVuZGVyKCZhdWRpb0J1ZmZlclswXSwgc2FtcGxlc1BlckZyYW1lLCBudW1GcmFtZXMpOwotICAgICAgICAgICAgLy8gUmVuZGVyIHNpbmUgd2F2ZXMgdG8gc2Vjb25kIGNoYW5uZWwgaWYgdGhlcmUgaXMgb25lLgotICAgICAgICAgICAgaWYgKHNhbXBsZXNQZXJGcmFtZSA+IDEpIHsKLSAgICAgICAgICAgICAgICBzaW5lRGF0YS0+c2luZU9zYzIucmVuZGVyKCZhdWRpb0J1ZmZlclsxXSwgc2FtcGxlc1BlckZyYW1lLCBudW1GcmFtZXMpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BY3RpdmVPc2NpbGF0b3JzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBzaW5lRGF0YS0+c2luZU9zY2lsbGF0b3JzW2ldLnJlbmRlcigmYXVkaW9CdWZmZXJbaV0sIHNhbXBsZXNQZXJGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGJyZWFrOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6IHsKICAgICAgICAgICAgIGZsb2F0ICphdWRpb0J1ZmZlciA9IChmbG9hdCAqKSBhdWRpb0RhdGE7Ci0gICAgICAgICAgICAvLyBSZW5kZXIgc2luZSB3YXZlcyBhcyBmbG9hdHMgdG8gZmlyc3QgY2hhbm5lbC4KLSAgICAgICAgICAgIHNpbmVEYXRhLT5zaW5lT3NjMS5yZW5kZXIoJmF1ZGlvQnVmZmVyWzBdLCBzYW1wbGVzUGVyRnJhbWUsIG51bUZyYW1lcyk7Ci0gICAgICAgICAgICAvLyBSZW5kZXIgc2luZSB3YXZlcyB0byBzZWNvbmQgY2hhbm5lbCBpZiB0aGVyZSBpcyBvbmUuCi0gICAgICAgICAgICBpZiAoc2FtcGxlc1BlckZyYW1lID4gMSkgewotICAgICAgICAgICAgICAgIHNpbmVEYXRhLT5zaW5lT3NjMi5yZW5kZXIoJmF1ZGlvQnVmZmVyWzFdLCBzYW1wbGVzUGVyRnJhbWUsIG51bUZyYW1lcyk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUFjdGl2ZU9zY2lsYXRvcnM7ICsraSkgeworICAgICAgICAgICAgICAgIHNpbmVEYXRhLT5zaW5lT3NjaWxsYXRvcnNbaV0ucmVuZGVyKCZhdWRpb0J1ZmZlcltpXSwgc2FtcGxlc1BlckZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1A7CiAgICAgfQogCisgICAgc2luZURhdGEtPmNhbGxiYWNrQ291bnQrKzsKKyAgICBzaW5lRGF0YS0+ZnJhbWVzVG90YWwgKz0gbnVtRnJhbWVzOwogICAgIHJldHVybiBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX0NPTlRJTlVFOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvU2ltcGxlUmVjb3JkZXIuaCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9TaW1wbGVSZWNvcmRlci5oCmluZGV4IDEzNDQyNzMuLjg2OWZhZDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9TaW1wbGVSZWNvcmRlci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9TaW1wbGVSZWNvcmRlci5oCkBAIC0xNzgsNyArMTc4LDYgQEAKIAogICAgIGFhdWRpb19yZXN1bHRfdCBjbG9zZSgpIHsKICAgICAgICAgaWYgKG1TdHJlYW0gIT0gbnVsbHB0cikgewotICAgICAgICAgICAgcHJpbnRmKCJjYWxsIEFBdWRpb1N0cmVhbV9jbG9zZSglcClcbiIsIG1TdHJlYW0pOyAgZmZsdXNoKHN0ZG91dCk7CiAgICAgICAgICAgICBBQXVkaW9TdHJlYW1fY2xvc2UobVN0cmVhbSk7CiAgICAgICAgICAgICBtU3RyZWFtID0gbnVsbHB0cjsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL1NpbmVHZW5lcmF0b3IuaCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9TaW5lR2VuZXJhdG9yLmgKaW5kZXggYTc1NTU4Mi4uOWU2ZDQ2ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL1NpbmVHZW5lcmF0b3IuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvU2luZUdlbmVyYXRvci5oCkBAIC0zMSwyMCArMzEsMjAgQEAKICAgICB9CiAKICAgICB2b2lkIHNldFN3ZWVwKGRvdWJsZSBmcmVxdWVuY3lMb3csIGRvdWJsZSBmcmVxdWVuY3lIaWdoLCBkb3VibGUgc2Vjb25kcykgewotICAgICAgICBtUGhhc2VJbmNyZW1lbnRMb3cgPSBmcmVxdWVuY3lMb3cgKiBNX1BJICogMiAvIG1GcmFtZVJhdGU7Ci0gICAgICAgIG1QaGFzZUluY3JlbWVudEhpZ2ggPSBmcmVxdWVuY3lIaWdoICogTV9QSSAqIDIgLyBtRnJhbWVSYXRlOwotCi0gICAgICAgIGRvdWJsZSBudW1GcmFtZXMgPSBzZWNvbmRzICogbUZyYW1lUmF0ZTsKLSAgICAgICAgbVVwU2NhbGVyID0gcG93KChmcmVxdWVuY3lIaWdoIC8gZnJlcXVlbmN5TG93KSwgKDEuMCAvIG51bUZyYW1lcykpOwotICAgICAgICBtRG93blNjYWxlciA9IDEuMCAvIG1VcFNjYWxlcjsKLSAgICAgICAgbUdvaW5nVXAgPSB0cnVlOwotICAgICAgICBtU3dlZXBpbmcgPSB0cnVlOworICAgICAgICBtU3dlZXBpbmcgPSBzZWNvbmRzID4gMC4wOworICAgICAgICBpZiAobVN3ZWVwaW5nKSB7CisgICAgICAgICAgICBtUGhhc2VJbmNyZW1lbnRMb3cgPSBmcmVxdWVuY3lMb3cgKiBNX1BJICogMiAvIG1GcmFtZVJhdGU7CisgICAgICAgICAgICBtUGhhc2VJbmNyZW1lbnRIaWdoID0gZnJlcXVlbmN5SGlnaCAqIE1fUEkgKiAyIC8gbUZyYW1lUmF0ZTsKKyAgICAgICAgICAgIGRvdWJsZSBudW1GcmFtZXMgPSBzZWNvbmRzICogbUZyYW1lUmF0ZTsKKyAgICAgICAgICAgIG1VcFNjYWxlciA9IHBvdygoZnJlcXVlbmN5SGlnaCAvIGZyZXF1ZW5jeUxvdyksICgxLjAgLyBudW1GcmFtZXMpKTsKKyAgICAgICAgICAgIG1Eb3duU2NhbGVyID0gMS4wIC8gbVVwU2NhbGVyOworICAgICAgICB9CiAgICAgfQogCiAgICAgdm9pZCByZW5kZXIoaW50MTZfdCAqYnVmZmVyLCBpbnQzMl90IGNoYW5uZWxTdHJpZGUsIGludDMyX3QgbnVtRnJhbWVzKSB7CiAgICAgICAgIGludCBzYW1wbGVJbmRleCA9IDA7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRnJhbWVzOyBpKyspIHsKLSAgICAgICAgICAgIGJ1ZmZlcltzYW1wbGVJbmRleF0gPSAoaW50MTZfdCkgKDMyNzY3ICogc2luKG1QaGFzZSkgKiBtQW1wbGl0dWRlKTsKKyAgICAgICAgICAgIGJ1ZmZlcltzYW1wbGVJbmRleF0gPSAoaW50MTZfdCkgKElOVDE2X01BWCAqIHNpbihtUGhhc2UpICogbUFtcGxpdHVkZSk7CiAgICAgICAgICAgICBzYW1wbGVJbmRleCArPSBjaGFubmVsU3RyaWRlOwogICAgICAgICAgICAgYWR2YW5jZVBoYXNlKCk7CiAgICAgICAgIH0KQEAgLTYxLDYgKzYxLDcgQEAKICAgICB2b2lkIHNldEFtcGxpdHVkZShkb3VibGUgYW1wbGl0dWRlKSB7CiAgICAgICAgIG1BbXBsaXR1ZGUgPSBhbXBsaXR1ZGU7CiAgICAgfQorCiAgICAgZG91YmxlIGdldEFtcGxpdHVkZSgpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1BbXBsaXR1ZGU7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvQW5kcm9pZC5icCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEyNWU2NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxNSBAQAorY2NfdGVzdCB7CisgICAgbmFtZTogIndyaXRlX3NpbmUiLAorICAgIHNyY3M6IFsic3JjL3dyaXRlX3NpbmUuY3BwIl0sCisgICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiXSwKKyAgICBzaGFyZWRfbGliczogWyJsaWJhYXVkaW8iXSwKKyAgICBoZWFkZXJfbGliczogWyJsaWJhYXVkaW9fZXhhbXBsZV91dGlscyJdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAid3JpdGVfc2luZV9jYWxsYmFjayIsCisgICAgc3JjczogWyJzcmMvd3JpdGVfc2luZV9jYWxsYmFjay5jcHAiXSwKKyAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAorICAgIHNoYXJlZF9saWJzOiBbImxpYmFhdWRpbyJdLAorICAgIGhlYWRlcl9saWJzOiBbImxpYmFhdWRpb19leGFtcGxlX3V0aWxzIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9BbmRyb2lkLm1rIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA1M2U3ZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotaW5jbHVkZSAkKGNhbGwgYWxsLXN1YmRpci1tYWtlZmlsZXMpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9qbmkvQW5kcm9pZC5tayBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL2puaS9BbmRyb2lkLm1rCmluZGV4IGQ2MzBlNzYuLjFhMWJkNDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL2puaS9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL2puaS9BbmRyb2lkLm1rCkBAIC0xMCw2ICsxMCw3IEBACiAKICMgTkRLIHJlY29tbWVuZHMgdXNpbmcgdGhpcyBraW5kIG9mIHJlbGF0aXZlIHBhdGggaW5zdGVhZCBvZiBhbiBhYnNvbHV0ZSBwYXRoLgogTE9DQUxfU1JDX0ZJTEVTOj0gLi4vc3JjL3dyaXRlX3NpbmUuY3BwCitMT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvcgogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJhYXVkaW8KIExPQ0FMX01PRFVMRSA6PSB3cml0ZV9zaW5lCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKQEAgLTIyLDYgKzIzLDcgQEAKICAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscwogCiBMT0NBTF9TUkNfRklMRVM6PSAuLi9zcmMvd3JpdGVfc2luZV9jYWxsYmFjay5jcHAKK0xPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmFhdWRpbwogTE9DQUxfTU9EVUxFIDo9IHdyaXRlX3NpbmVfY2FsbGJhY2sKIGluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvc3JjL3dyaXRlX3NpbmUuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvc3JjL3dyaXRlX3NpbmUuY3BwCmluZGV4IDY3N2ZiNmMuLjhlMzNhMzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL3NyYy93cml0ZV9zaW5lLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9zcmMvd3JpdGVfc2luZS5jcHAKQEAgLTQ0LDEwICs0NCwxMCBAQAogICAgIEFBdWRpb1N0cmVhbSAqYWF1ZGlvU3RyZWFtID0gbnVsbHB0cjsKICAgICBpbnQzMl90ICBmcmFtZXNQZXJCdXJzdCA9IDA7CiAgICAgaW50MzJfdCAgZnJhbWVzUGVyV3JpdGUgPSAwOwotICAgIGludDMyX3QgIGJ1ZmZlckNhcGFjaXR5ID0gMDsKICAgICBpbnQzMl90ICBmcmFtZXNUb1BsYXkgPSAwOwogICAgIGludDMyX3QgIGZyYW1lc0xlZnQgPSAwOwogICAgIGludDMyX3QgIHhSdW5Db3VudCA9IDA7CisgICAgaW50ICAgICAgbnVtQWN0aXZlT3NjaWxhdG9ycyA9IDA7CiAgICAgZmxvYXQgICAqZmxvYXREYXRhID0gbnVsbHB0cjsKICAgICBpbnQxNl90ICpzaG9ydERhdGEgPSBudWxscHRyOwogCkBAIC01Nyw3ICs1Nyw3IEBACiAgICAgLy8gaW4gYSBidWZmZXIgaWYgd2UgaGFuZyBvciBjcmFzaC4KICAgICBzZXR2YnVmKHN0ZG91dCwgbnVsbHB0ciwgX0lPTkJGLCAoc2l6ZV90KSAwKTsKIAotICAgIHByaW50ZigiJXMgLSBQbGF5IGEgc2luZSB3YXZlIHVzaW5nIEFBdWRpbyBWMC4xLjJcbiIsIGFyZ3ZbMF0pOworICAgIHByaW50ZigiJXMgLSBQbGF5IGEgc2luZSB3YXZlIHVzaW5nIEFBdWRpbyBWMC4xLjNcbiIsIGFyZ3ZbMF0pOwogCiAgICAgaWYgKGFyZ1BhcnNlci5wYXJzZUFyZ3MoYXJnYywgYXJndikpIHsKICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKQEAgLTc3LDggKzc3LDggQEAKICAgICBhY3R1YWxTYW1wbGVSYXRlID0gQUF1ZGlvU3RyZWFtX2dldFNhbXBsZVJhdGUoYWF1ZGlvU3RyZWFtKTsKICAgICBhY3R1YWxEYXRhRm9ybWF0ID0gQUF1ZGlvU3RyZWFtX2dldEZvcm1hdChhYXVkaW9TdHJlYW0pOwogCi0gICAgbXlEYXRhLnNpbmVPc2MxLnNldHVwKDQ0MC4wLCBhY3R1YWxTYW1wbGVSYXRlKTsKLSAgICBteURhdGEuc2luZU9zYzIuc2V0dXAoNjYwLjAsIGFjdHVhbFNhbXBsZVJhdGUpOworICAgIG15RGF0YS5zYW1wbGVSYXRlID0gYWN0dWFsU2FtcGxlUmF0ZTsKKyAgICBteURhdGEuc2V0dXBTaW5lU3dlZXBzKCk7CiAKICAgICAvLyBTb21lIERNQSBtaWdodCB1c2UgdmVyeSBzaG9ydCBidXJzdHMgb2YgMTYgZnJhbWVzLiBXZSBkb24ndCBuZWVkIHRvIHdyaXRlIHN1Y2ggc21hbGwKICAgICAvLyBidWZmZXJzLiBCdXQgaXQgaGVscHMgdG8gdXNlIGEgbXVsdGlwbGUgb2YgdGhlIGJ1cnN0IHNpemUgZm9yIHByZWRpY3RhYmxlIHNjaGVkdWxpbmcuCkBAIC0xMTcsMTkgKzExNywxOCBAQAogICAgIC8vIFBsYXkgZm9yIGEgd2hpbGUuCiAgICAgZnJhbWVzVG9QbGF5ID0gYWN0dWFsU2FtcGxlUmF0ZSAqIGFyZ1BhcnNlci5nZXREdXJhdGlvblNlY29uZHMoKTsKICAgICBmcmFtZXNMZWZ0ID0gZnJhbWVzVG9QbGF5OworICAgIG51bUFjdGl2ZU9zY2lsYXRvcnMgPSAoYWN0dWFsQ2hhbm5lbENvdW50ID4gTUFYX0NIQU5ORUxTKSA/IE1BWF9DSEFOTkVMUyA6IGFjdHVhbENoYW5uZWxDb3VudDsKICAgICB3aGlsZSAoZnJhbWVzTGVmdCA+IDApIHsKLQorICAgICAgICAvLyBSZW5kZXIgYXMgRkxPQVQgb3IgUENNCiAgICAgICAgIGlmIChhY3R1YWxEYXRhRm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7Ci0gICAgICAgICAgICAvLyBSZW5kZXIgc2luZSB3YXZlcyB0byBsZWZ0IGFuZCByaWdodCBjaGFubmVscy4KLSAgICAgICAgICAgIG15RGF0YS5zaW5lT3NjMS5yZW5kZXIoJmZsb2F0RGF0YVswXSwgYWN0dWFsQ2hhbm5lbENvdW50LCBmcmFtZXNQZXJXcml0ZSk7Ci0gICAgICAgICAgICBpZiAoYWN0dWFsQ2hhbm5lbENvdW50ID4gMSkgewotICAgICAgICAgICAgICAgIG15RGF0YS5zaW5lT3NjMi5yZW5kZXIoJmZsb2F0RGF0YVsxXSwgYWN0dWFsQ2hhbm5lbENvdW50LCBmcmFtZXNQZXJXcml0ZSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUFjdGl2ZU9zY2lsYXRvcnM7ICsraSkgeworICAgICAgICAgICAgICAgIG15RGF0YS5zaW5lT3NjaWxsYXRvcnNbaV0ucmVuZGVyKCZmbG9hdERhdGFbaV0sIGFjdHVhbENoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzUGVyV3JpdGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKGFjdHVhbERhdGFGb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2KSB7Ci0gICAgICAgICAgICAvLyBSZW5kZXIgc2luZSB3YXZlcyB0byBsZWZ0IGFuZCByaWdodCBjaGFubmVscy4KLSAgICAgICAgICAgIG15RGF0YS5zaW5lT3NjMS5yZW5kZXIoJnNob3J0RGF0YVswXSwgYWN0dWFsQ2hhbm5lbENvdW50LCBmcmFtZXNQZXJXcml0ZSk7Ci0gICAgICAgICAgICBpZiAoYWN0dWFsQ2hhbm5lbENvdW50ID4gMSkgewotICAgICAgICAgICAgICAgIG15RGF0YS5zaW5lT3NjMi5yZW5kZXIoJnNob3J0RGF0YVsxXSwgYWN0dWFsQ2hhbm5lbENvdW50LCBmcmFtZXNQZXJXcml0ZSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUFjdGl2ZU9zY2lsYXRvcnM7ICsraSkgeworICAgICAgICAgICAgICAgIG15RGF0YS5zaW5lT3NjaWxsYXRvcnNbaV0ucmVuZGVyKCZzaG9ydERhdGFbaV0sIGFjdHVhbENoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzUGVyV3JpdGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL3NyYy93cml0ZV9zaW5lX2NhbGxiYWNrLmNwcCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL3NyYy93cml0ZV9zaW5lX2NhbGxiYWNrLmNwcAppbmRleCA0ZjljZGU2Li5lMzNlOWY4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9zcmMvd3JpdGVfc2luZV9jYWxsYmFjay5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvc3JjL3dyaXRlX3NpbmVfY2FsbGJhY2suY3BwCkBAIC0yOCw3ICsyOCw3IEBACiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgogI2luY2x1ZGUgIkFBdWRpb0V4YW1wbGVVdGlscy5oIgogI2luY2x1ZGUgIkFBdWRpb1NpbXBsZVBsYXllci5oIgotI2luY2x1ZGUgIi4uLy4uL3V0aWxzL0FBdWRpb1NpbXBsZVBsYXllci5oIgorI2luY2x1ZGUgIkFBdWRpb0FyZ3NQYXJzZXIuaCIKIAogLyoqCiAgKiBPcGVuIHN0cmVhbSwgcGxheSBzb21lIHNpbmUgd2F2ZXMsIHRoZW4gY2xvc2UgdGhlIHN0cmVhbS4KQEAgLTM2LDM3ICszNiwzOSBAQAogICogQHBhcmFtIGFyZ1BhcnNlcgogICogQHJldHVybiBBQVVESU9fT0sgb3IgbmVnYXRpdmUgZXJyb3IgY29kZQogICovCi1zdGF0aWMgYWF1ZGlvX3Jlc3VsdF90IHRlc3RPcGVuUGxheUNsb3NlKEFBdWRpb0FyZ3NQYXJzZXIgJmFyZ1BhcnNlcikKK3N0YXRpYyBhYXVkaW9fcmVzdWx0X3QgdGVzdE9wZW5QbGF5Q2xvc2UoQUF1ZGlvQXJnc1BhcnNlciAmYXJnUGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxvb3BDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmVmaXhUb25lTXNlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZVVuZGVycnVucykKIHsKICAgICBTaW5lVGhyZWFkZWREYXRhX3QgbXlEYXRhOwogICAgIEFBdWRpb1NpbXBsZVBsYXllciAmcGxheWVyID0gbXlEYXRhLnNpbXBsZVBsYXllcjsKICAgICBhYXVkaW9fcmVzdWx0X3QgICAgcmVzdWx0ID0gQUFVRElPX09LOwogICAgIGJvb2wgICAgICAgICAgICAgICBkaXNjb25uZWN0ZWQgPSBmYWxzZTsKKyAgICBib29sICAgICAgICAgICAgICAgYmFpbE91dCA9IGZhbHNlOwogICAgIGludDY0X3QgICAgICAgICAgICBzdGFydGVkQXROYW5vczsKIAogICAgIHByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcnVuIGNvbXBsZXRlIHRlc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwogICAgIG15RGF0YS5zY2hlZHVsZXJDaGVja2VkID0gZmFsc2U7CiAgICAgbXlEYXRhLmNhbGxiYWNrQ291bnQgPSAwOwotICAgIG15RGF0YS5mb3JjZVVuZGVycnVucyA9IGZhbHNlOyAvLyBzZXQgdHJ1ZSB0byB0ZXN0IEFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQoKQorICAgIG15RGF0YS5mb3JjZVVuZGVycnVucyA9IGZvcmNlVW5kZXJydW5zOyAvLyB0ZXN0IEFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQoKQogCiAgICAgcmVzdWx0ID0gcGxheWVyLm9wZW4oYXJnUGFyc2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgIFNpbXBsZVBsYXllckRhdGFDYWxsYmFja1Byb2MsIFNpbXBsZVBsYXllckVycm9yQ2FsbGJhY2tQcm9jLCAmbXlEYXRhKTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIC0gIHBsYXllci5vcGVuKCkgcmV0dXJuZWQgJWRcbiIsIHJlc3VsdCk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1IgLSAgcGxheWVyLm9wZW4oKSByZXR1cm5lZCAlc1xuIiwKKyAgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAKICAgICBhcmdQYXJzZXIuY29tcGFyZVdpdGhTdHJlYW0ocGxheWVyLmdldFN0cmVhbSgpKTsKIAotICAgIC8vIFNldHVwIHNpbmUgd2F2ZSBnZW5lcmF0b3JzLgotICAgIHsKLSAgICAgICAgaW50MzJfdCBhY3R1YWxTYW1wbGVSYXRlID0gcGxheWVyLmdldFNhbXBsZVJhdGUoKTsKLSAgICAgICAgbXlEYXRhLnNpbmVPc2MxLnNldHVwKDQ0MC4wLCBhY3R1YWxTYW1wbGVSYXRlKTsKLSAgICAgICAgbXlEYXRhLnNpbmVPc2MxLnNldFN3ZWVwKDMwMC4wLCA2MDAuMCwgNS4wKTsKLSAgICAgICAgbXlEYXRhLnNpbmVPc2MxLnNldEFtcGxpdHVkZSgwLjIpOwotICAgICAgICBteURhdGEuc2luZU9zYzIuc2V0dXAoNjYwLjAsIGFjdHVhbFNhbXBsZVJhdGUpOwotICAgICAgICBteURhdGEuc2luZU9zYzIuc2V0U3dlZXAoMzUwLjAsIDkwMC4wLCA3LjApOwotICAgICAgICBteURhdGEuc2luZU9zYzIuc2V0QW1wbGl0dWRlKDAuMik7CisgICAgbXlEYXRhLnNhbXBsZVJhdGUgPSBwbGF5ZXIuZ2V0U2FtcGxlUmF0ZSgpOworICAgIG15RGF0YS5wcmVmaXhUb25lRnJhbWVzID0gcHJlZml4VG9uZU1zZWMgKiBteURhdGEuc2FtcGxlUmF0ZSAvIDEwMDA7CisgICAgaWYgKG15RGF0YS5wcmVmaXhUb25lRnJhbWVzID4gMCkgeworICAgICAgICBteURhdGEuc2V0dXBTaW5lQmxpcCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIG15RGF0YS5zZXR1cFNpbmVTd2VlcHMoKTsKICAgICB9CiAKICNpZiAwCkBAIC03OCw0MiArODAsOTMgQEAKICAgICB9CiAjZW5kaWYKIAotICAgIHJlc3VsdCA9IHBsYXllci5zdGFydCgpOwotICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1IgLSBwbGF5ZXIuc3RhcnQoKSByZXR1cm5lZCAlZFxuIiwgcmVzdWx0KTsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9CisgICAgZm9yIChpbnQgbG9vcEluZGV4ID0gMDsgbG9vcEluZGV4IDwgbG9vcENvdW50OyBsb29wSW5kZXgrKykgeworICAgICAgICAvLyBPbmx5IHBsYXkgZGF0YSBvbiBldmVyeSBvdGhlciBsb29wIHNvIHdlIGNhbiBoZWFyIGlmIHRoZXJlIGlzIHN0YWxlIGRhdGEuCisgICAgICAgIGRvdWJsZSBhbXBsaXR1ZGU7CisgICAgICAgIGludDMyX3QgZHVyYXRpb25TZWNvbmRzOworICAgICAgICBpZiAoKGxvb3BJbmRleCAmIDEpID09IDApIHsKKyAgICAgICAgICAgIHByaW50ZigiLS0tLS0tLS0tLS0tLS0tIFNJTkUgLS0tLS0tXG4iKTsKKyAgICAgICAgICAgIGFtcGxpdHVkZSA9IDAuMjsKKyAgICAgICAgICAgIGR1cmF0aW9uU2Vjb25kcyA9IGFyZ1BhcnNlci5nZXREdXJhdGlvblNlY29uZHMoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZigiLS0tLS0tLS0tLS0tLS0tIFFVSUVUIC0tLS0tXG4iKTsKKyAgICAgICAgICAgIGFtcGxpdHVkZSA9IDAuMDsKKyAgICAgICAgICAgIGR1cmF0aW9uU2Vjb25kcyA9IDI7IC8vIGp1c3Qgd2FpdCBicmllZmx5IHdoZW4gcXVpZXQKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9DSEFOTkVMUzsgKytpKSB7CisgICAgICAgICAgICBteURhdGEuc2luZU9zY2lsbGF0b3JzW2ldLnNldEFtcGxpdHVkZShhbXBsaXR1ZGUpOworICAgICAgICB9CiAKLSAgICAvLyBQbGF5IGEgc2luZSB3YXZlIGluIHRoZSBiYWNrZ3JvdW5kLgotICAgIHByaW50ZigiU2xlZXAgZm9yICVkIHNlY29uZHMgd2hpbGUgYXVkaW8gcGxheXMgaW4gYSBjYWxsYmFjayB0aHJlYWQuXG4iLAotICAgICAgICAgICBhcmdQYXJzZXIuZ2V0RHVyYXRpb25TZWNvbmRzKCkpOwotICAgIHN0YXJ0ZWRBdE5hbm9zID0gZ2V0TmFub3NlY29uZHMoQ0xPQ0tfTU9OT1RPTklDKTsKLSAgICBmb3IgKGludCBzZWNvbmQgPSAwOyBzZWNvbmQgPCBhcmdQYXJzZXIuZ2V0RHVyYXRpb25TZWNvbmRzKCk7IHNlY29uZCsrKQotICAgIHsKLSAgICAgICAgLy8gU2xlZXAgYSB3aGlsZS4gV2FrZSB1cCBlYXJseSBpZiB0aGVyZSBpcyBhbiBlcnJvciwgZm9yIGV4YW1wbGUgYSBESVNDT05ORUNULgotICAgICAgICBsb25nIHJldCA9IG15RGF0YS53YWtlci53YWl0KEFBVURJT19PSywgTkFOT1NfUEVSX1NFQ09ORCk7Ci0gICAgICAgIGludDY0X3QgbWlsbGlzID0gKGdldE5hbm9zZWNvbmRzKENMT0NLX01PTk9UT05JQykgLSBzdGFydGVkQXROYW5vcykgLyBOQU5PU19QRVJfTUlMTElTRUNPTkQ7Ci0gICAgICAgIHJlc3VsdCA9IG15RGF0YS53YWtlci5nZXQoKTsKLSAgICAgICAgcHJpbnRmKCJ3YWl0KCkgcmV0dXJucyAlbGQsIGFhdWRpb19yZXN1bHQgPSAlZCwgYXQgJTZkIG1pbGxpcyIKLSAgICAgICAgICAgICAgICIsIHNlY29uZCA9ICVkLCBmcmFtZXNXcml0dGVuID0gJThkLCB1bmRlcnJ1bnMgPSAlZFxuIiwKLSAgICAgICAgICAgICAgIHJldCwgcmVzdWx0LCAoaW50KSBtaWxsaXMsCi0gICAgICAgICAgICAgICBzZWNvbmQsCi0gICAgICAgICAgICAgICAoaW50KSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzV3JpdHRlbihwbGF5ZXIuZ2V0U3RyZWFtKCkpLAotICAgICAgICAgICAgICAgKGludCkgQUF1ZGlvU3RyZWFtX2dldFhSdW5Db3VudChwbGF5ZXIuZ2V0U3RyZWFtKCkpKTsKKyAgICAgICAgcmVzdWx0ID0gcGxheWVyLnN0YXJ0KCk7CiAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ID09IEFBVURJT19FUlJPUl9ESVNDT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICBkaXNjb25uZWN0ZWQgPSB0cnVlOworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUiAtIHBsYXllci5zdGFydCgpIHJldHVybmVkICVkXG4iLCByZXN1bHQpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBsYXkgYSBzaW5lIHdhdmUgaW4gdGhlIGJhY2tncm91bmQuCisgICAgICAgIHByaW50ZigiU2xlZXAgZm9yICVkIHNlY29uZHMgd2hpbGUgYXVkaW8gcGxheXMgaW4gYSBjYWxsYmFjayB0aHJlYWQuICVkIG9mICVkXG4iLAorICAgICAgICAgICAgICAgYXJnUGFyc2VyLmdldER1cmF0aW9uU2Vjb25kcygpLCAobG9vcEluZGV4ICsgMSksIGxvb3BDb3VudCk7CisgICAgICAgIHN0YXJ0ZWRBdE5hbm9zID0gZ2V0TmFub3NlY29uZHMoQ0xPQ0tfTU9OT1RPTklDKTsKKyAgICAgICAgZm9yIChpbnQgc2Vjb25kID0gMDsgc2Vjb25kIDwgZHVyYXRpb25TZWNvbmRzOyBzZWNvbmQrKykgeworICAgICAgICAgICAgLy8gU2xlZXAgYSB3aGlsZS4gV2FrZSB1cCBlYXJseSBpZiB0aGVyZSBpcyBhbiBlcnJvciwgZm9yIGV4YW1wbGUgYSBESVNDT05ORUNULgorICAgICAgICAgICAgbG9uZyByZXQgPSBteURhdGEud2FrZXIud2FpdChBQVVESU9fT0ssIE5BTk9TX1BFUl9TRUNPTkQpOworICAgICAgICAgICAgaW50NjRfdCBtaWxsaXMgPQorICAgICAgICAgICAgICAgICAgICAoZ2V0TmFub3NlY29uZHMoQ0xPQ0tfTU9OT1RPTklDKSAtIHN0YXJ0ZWRBdE5hbm9zKSAvIE5BTk9TX1BFUl9NSUxMSVNFQ09ORDsKKyAgICAgICAgICAgIHJlc3VsdCA9IG15RGF0YS53YWtlci5nZXQoKTsKKyAgICAgICAgICAgIHByaW50Zigid2FpdCgpIHJldHVybnMgJWxkLCBhYXVkaW9fcmVzdWx0ID0gJWQsIGF0ICU2ZCBtaWxsaXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBzZWNvbmQgPSAlM2QsIGZyYW1lc1dyaXR0ZW4gPSAlOGQsIHVuZGVycnVucyA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgIHJldCwgcmVzdWx0LCAoaW50KSBtaWxsaXMsCisgICAgICAgICAgICAgICAgICAgc2Vjb25kLAorICAgICAgICAgICAgICAgICAgIChpbnQpIEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKHBsYXllci5nZXRTdHJlYW0oKSksCisgICAgICAgICAgICAgICAgICAgKGludCkgQUF1ZGlvU3RyZWFtX2dldFhSdW5Db3VudChwbGF5ZXIuZ2V0U3RyZWFtKCkpKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICAgICAgZGlzY29ubmVjdGVkID0gKHJlc3VsdCA9PSBBQVVESU9fRVJST1JfRElTQ09OTkVDVEVEKTsKKyAgICAgICAgICAgICAgICBiYWlsT3V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcmludGYoIkFBdWRpbyByZXN1bHQgPSAlZCA9ICVzXG4iLCByZXN1bHQsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOworCisgICAgICAgIC8vIEFsdGVybmF0ZSBiZXR3ZWVuIHVzaW5nIHN0b3Agb3IgcGF1c2UgZm9yIGVhY2ggc2luZS9xdWlldCBwYWlyLgorICAgICAgICAvLyBSZXBlYXQgdGhpcyBwYXR0ZXJuOiB7c2luZS1zdG9wLXF1aWV0LXN0b3Atc2luZS1wYXVzZS1xdWlldC1wYXVzZX0KKyAgICAgICAgaWYgKChsb29wSW5kZXggJiAyKSA9PSAwKSB7CisgICAgICAgICAgICBwcmludGYoIlNUT1AsIGNhbGxiYWNrICMgPSAlZFxuIiwgbXlEYXRhLmNhbGxiYWNrQ291bnQpOworICAgICAgICAgICAgcmVzdWx0ID0gcGxheWVyLnN0b3AoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZigiUEFVU0UvRkxVU0gsIGNhbGxiYWNrICMgPSAlZFxuIiwgbXlEYXRhLmNhbGxiYWNrQ291bnQpOworICAgICAgICAgICAgcmVzdWx0ID0gcGxheWVyLnBhdXNlKCk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQgPSBwbGF5ZXIuZmx1c2goKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChiYWlsT3V0KSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgIH0KLSAgICBwcmludGYoIkFBdWRpbyByZXN1bHQgPSAlZCA9ICVzXG4iLCByZXN1bHQsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOwogCi0gICAgcHJpbnRmKCJjYWxsIHN0b3AoKSBjYWxsYmFjayAjID0gJWRcbiIsIG15RGF0YS5jYWxsYmFja0NvdW50KTsKLSAgICByZXN1bHQgPSBwbGF5ZXIuc3RvcCgpOwotICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIHsKKyAgICAgICAgICAgIGFhdWRpb19zdHJlYW1fc3RhdGVfdCBzdGF0ZSA9IEFBdWRpb1N0cmVhbV9nZXRTdGF0ZShwbGF5ZXIuZ2V0U3RyZWFtKCkpOworICAgICAgICAgICAgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IGZpbmFsU3RhdGUgPSBBQVVESU9fU1RSRUFNX1NUQVRFX1VOSU5JVElBTElaRUQ7CisgICAgICAgICAgICBpbnQ2NF90IHRpbWVvdXROYW5vcyA9IDIwMDAgKiBOQU5PU19QRVJfTUlMTElTRUNPTkQ7CisgICAgICAgICAgICByZXN1bHQgPSBBQXVkaW9TdHJlYW1fd2FpdEZvclN0YXRlQ2hhbmdlKHBsYXllci5nZXRTdHJlYW0oKSwgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaW5hbFN0YXRlLCB0aW1lb3V0TmFub3MpOworICAgICAgICAgICAgcHJpbnRmKCJ3YWl0Rm9yU3RhdGVDaGFuZ2UgcmV0dXJucyAlcywgc3RhdGUgPSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpLAorICAgICAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0U3RyZWFtU3RhdGVUb1RleHQoZmluYWxTdGF0ZSkpOworICAgICAgICAgICAgaW50NjRfdCB3cml0dGVuID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1dyaXR0ZW4ocGxheWVyLmdldFN0cmVhbSgpKTsKKyAgICAgICAgICAgIGludDY0X3QgcmVhZCA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKHBsYXllci5nZXRTdHJlYW0oKSk7CisgICAgICAgICAgICBwcmludGYoIiAgIGZyYW1lc1dyaXR0ZW4gPSAlbGxkLCBmcmFtZXNSZWFkID0gJWxsZCwgZGlmZiA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIHdyaXR0ZW4sCisgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgcmVhZCwKKyAgICAgICAgICAgICAgICAgICAoaW50KSAod3JpdHRlbiAtIHJlYWQpKTsKKyAgICAgICAgfQorCiAgICAgfQorCiAgICAgcHJpbnRmKCJjYWxsIGNsb3NlKClcbiIpOwogICAgIHJlc3VsdCA9IHBsYXllci5jbG9zZSgpOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CkBAIC0xNDcsMjMgKzIwMCw1OSBAQAogICAgIHJldHVybiBkaXNjb25uZWN0ZWQgPyBBQVVESU9fRVJST1JfRElTQ09OTkVDVEVEIDogcmVzdWx0OwogfQogCitzdGF0aWMgdm9pZCB1c2FnZSgpIHsKKyAgICBBQXVkaW9BcmdzUGFyc2VyOjp1c2FnZSgpOworICAgIHByaW50ZigiICAgICAgLWx7Y291bnR9IGxvb3BDb3VudCBzdGFydC9zdG9wLCBldmVyeSBvdGhlciBvbmUgaXMgc2lsZW50XG4iKTsKKyAgICBwcmludGYoIiAgICAgIC10e21zZWN9ICBwbGF5IGEgaGlnaCBwaXRjaGVkIHRvbmUgYXQgdGhlIGJlZ2lubmluZ1xuIik7CisgICAgcHJpbnRmKCIgICAgICAteiAgICAgICAgZm9yY2UgcGVyaW9kaWMgdW5kZXJydW5zIGJ5IHNsZWVwaW5nIGluIGNhbGxiYWNrXG4iKTsKK30KKwogaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQogewogICAgIEFBdWRpb0FyZ3NQYXJzZXIgICBhcmdQYXJzZXI7CiAgICAgYWF1ZGlvX3Jlc3VsdF90ICAgIHJlc3VsdDsKKyAgICBpbnQzMl90ICAgICAgICAgICAgbG9vcENvdW50ID0gMTsKKyAgICBpbnQzMl90ICAgICAgICAgICAgcHJlZml4VG9uZU1zZWMgPSAwOworICAgIGJvb2wgICAgICAgICAgICAgICBmb3JjZVVuZGVycnVucyA9IGZhbHNlOwogCiAgICAgLy8gTWFrZSBwcmludGYgcHJpbnQgaW1tZWRpYXRlbHkgc28gdGhhdCBkZWJ1ZyBpbmZvIGlzIG5vdCBzdHVjawogICAgIC8vIGluIGEgYnVmZmVyIGlmIHdlIGhhbmcgb3IgY3Jhc2guCiAgICAgc2V0dmJ1ZihzdGRvdXQsIG51bGxwdHIsIF9JT05CRiwgKHNpemVfdCkgMCk7CiAKLSAgICBwcmludGYoIiVzIC0gUGxheSBhIHNpbmUgc3dlZXAgdXNpbmcgYW4gQUF1ZGlvIGNhbGxiYWNrIFYwLjEuMlxuIiwgYXJndlswXSk7CisgICAgcHJpbnRmKCIlcyAtIFBsYXkgYSBzaW5lIHN3ZWVwIHVzaW5nIGFuIEFBdWRpbyBjYWxsYmFjayBWMC4xLjRcbiIsIGFyZ3ZbMF0pOwogCi0gICAgaWYgKGFyZ1BhcnNlci5wYXJzZUFyZ3MoYXJnYywgYXJndikpIHsKLSAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICBmb3IgKGludCBpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworICAgICAgICBjb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOworICAgICAgICBpZiAoYXJnUGFyc2VyLnBhcnNlQXJnKGFyZykpIHsKKyAgICAgICAgICAgIC8vIEhhbmRsZSBvcHRpb25zIHRoYXQgYXJlIG5vdCBoYW5kbGVkIGJ5IHRoZSBBcmdQYXJzZXIKKyAgICAgICAgICAgIGlmIChhcmdbMF0gPT0gJy0nKSB7CisgICAgICAgICAgICAgICAgY2hhciBvcHRpb24gPSBhcmdbMV07CisgICAgICAgICAgICAgICAgc3dpdGNoIChvcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnbCc6CisgICAgICAgICAgICAgICAgICAgICAgICBsb29wQ291bnQgPSBhdG9pKCZhcmdbMl0pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3QnOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4VG9uZU1zZWMgPSBhdG9pKCZhcmdbMl0pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3onOgorICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VVbmRlcnJ1bnMgPSB0cnVlOyAgLy8gWnp6enp6egorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1c2FnZSgpOworICAgICAgICAgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIC8vIEtlZXAgbG9vcGluZyB1bnRpbCB3ZSBjYW4gY29tcGxldGUgdGhlIHRlc3Qgd2l0aG91dCBkaXNjb25uZWN0aW5nLgotICAgIHdoaWxlKChyZXN1bHQgPSB0ZXN0T3BlblBsYXlDbG9zZShhcmdQYXJzZXIpKSA9PSBBQVVESU9fRVJST1JfRElTQ09OTkVDVEVEKTsKKyAgICB3aGlsZSgocmVzdWx0ID0gdGVzdE9wZW5QbGF5Q2xvc2UoYXJnUGFyc2VyLCBsb29wQ291bnQsIHByZWZpeFRvbmVNc2VjLCBmb3JjZVVuZGVycnVucykpCisgICAgICAgICAgICA9PSBBQVVESU9fRVJST1JfRElTQ09OTkVDVEVEKTsKIAogICAgIHJldHVybiAocmVzdWx0KSA/IEVYSVRfRkFJTFVSRSA6IEVYSVRfU1VDQ0VTUzsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9pbmNsdWRlL2FhdWRpby9BQXVkaW8uaCBiL21lZGlhL2xpYmFhdWRpby9pbmNsdWRlL2FhdWRpby9BQXVkaW8uaAppbmRleCAzYzIzNzM2Li41YjI5NDE5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZS9hYXVkaW8vQUF1ZGlvLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUvYWF1ZGlvL0FBdWRpby5oCkBAIC00NCw3ICs0NCwxNSBAQAogI2RlZmluZSBBQVVESU9fVU5TUEVDSUZJRUQgICAgICAgICAgIDAKIAogZW51bSB7CisgICAgLyoqCisgICAgICogQXVkaW8gZGF0YSB3aWxsIHRyYXZlbCBvdXQgb2YgdGhlIGRldmljZSwgZm9yIGV4YW1wbGUgdGhyb3VnaCBhIHNwZWFrZXIuCisgICAgICovCiAgICAgQUFVRElPX0RJUkVDVElPTl9PVVRQVVQsCisKKworICAgIC8qKgorICAgICAqIEF1ZGlvIGRhdGEgd2lsbCB0cmF2ZWwgaW50byB0aGUgZGV2aWNlLCBmb3IgZXhhbXBsZSBmcm9tIGEgbWljcm9waG9uZS4KKyAgICAgKi8KICAgICBBQVVESU9fRElSRUNUSU9OX0lOUFVUCiB9OwogdHlwZWRlZiBpbnQzMl90IGFhdWRpb19kaXJlY3Rpb25fdDsKQEAgLTUyLDMzICs2MCwxMTIgQEAKIGVudW0gewogICAgIEFBVURJT19GT1JNQVRfSU5WQUxJRCA9IC0xLAogICAgIEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQgPSAwLAorCisgICAgLyoqCisgICAgICogVGhpcyBmb3JtYXQgdXNlcyB0aGUgaW50MTZfdCBkYXRhIHR5cGUuCisgICAgICogVGhlIG1heGltdW0gcmFuZ2Ugb2YgdGhlIGRhdGEgaXMgLTMyNzY4IHRvIDMyNzY3LgorICAgICAqLwogICAgIEFBVURJT19GT1JNQVRfUENNX0kxNiwKKworICAgIC8qKgorICAgICAqIFRoaXMgZm9ybWF0IHVzZXMgdGhlIGZsb2F0IGRhdGEgdHlwZS4KKyAgICAgKiBUaGUgbm9taW5hbCByYW5nZSBvZiB0aGUgZGF0YSBpcyBbLTEuMGYsIDEuMGYpLgorICAgICAqIFZhbHVlcyBvdXRzaWRlIHRoYXQgcmFuZ2UgbWF5IGJlIGNsaXBwZWQuCisgICAgICoKKyAgICAgKiBTZWUgYWxzbyAnZmxvYXREYXRhJyBhdAorICAgICAqIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL21lZGlhL0F1ZGlvVHJhY2sjd3JpdGUoZmxvYXRbXSwlMjBpbnQsJTIwaW50LCUyMGludCkKKyAgICAgKi8KICAgICBBQVVESU9fRk9STUFUX1BDTV9GTE9BVAogfTsKIHR5cGVkZWYgaW50MzJfdCBhYXVkaW9fZm9ybWF0X3Q7CiAKKy8qKgorICogVGhlc2UgcmVzdWx0IGNvZGVzIGFyZSByZXR1cm5lZCBmcm9tIEFBdWRpbyBmdW5jdGlvbnMgdG8gaW5kaWNhdGUgc3VjY2VzcyBvciBmYWlsdXJlLgorICogTm90ZSB0aGF0IGVycm9yIHJldHVybiBjb2RlcyBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUgc28gYXBwbGljYXRpb25zIHNob3VsZCBnZW5lcmFsbHkKKyAqIG5vdCByZWx5IG9uIHNwZWNpZmljIHJldHVybiBjb2Rlcy4KKyAqLwogZW51bSB7CisgICAgLyoqCisgICAgICogVGhlIGNhbGwgd2FzIHN1Y2Nlc3NmdWwuCisgICAgICovCiAgICAgQUFVRElPX09LLAogICAgIEFBVURJT19FUlJPUl9CQVNFID0gLTkwMCwgLy8gVE9ETyByZXZpZXcKKworICAgIC8qKgorICAgICAqIFRoZSBhdWRpbyBkZXZpY2Ugd2FzIGRpc2Nvbm5lY3RlZC4gVGhpcyBjb3VsZCBvY2N1ciwgZm9yIGV4YW1wbGUsIHdoZW4gaGVhZHBob25lcworICAgICAqIGFyZSBwbHVnZ2VkIGluIG9yIHVucGx1Z2dlZC4gVGhlIHN0cmVhbSBjYW5ub3QgYmUgdXNlZCBhZnRlciB0aGUgZGV2aWNlIGlzIGRpc2Nvbm5lY3RlZC4KKyAgICAgKiBBcHBsaWNhdGlvbnMgc2hvdWxkIHN0b3AgYW5kIGNsb3NlIHRoZSBzdHJlYW0uCisgICAgICogSWYgdGhpcyBlcnJvciBpcyByZWNlaXZlZCBpbiBhbiBlcnJvciBjYWxsYmFjayB0aGVuIGFub3RoZXIgdGhyZWFkIHNob3VsZCBiZQorICAgICAqIHVzZWQgdG8gc3RvcCBhbmQgY2xvc2UgdGhlIHN0cmVhbS4KKyAgICAgKi8KICAgICBBQVVESU9fRVJST1JfRElTQ09OTkVDVEVELAorCisgICAgLyoqCisgICAgICogQW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZCB0byBBQXVkaW8uCisgICAgICovCiAgICAgQUFVRElPX0VSUk9SX0lMTEVHQUxfQVJHVU1FTlQsCiAgICAgLy8gcmVzZXJ2ZWQKICAgICBBQVVESU9fRVJST1JfSU5URVJOQUwgPSBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVCArIDIsCisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVxdWVzdGVkIG9wZXJhdGlvbiBpcyBub3QgYXBwcm9wcmlhdGUgZm9yIHRoZSBjdXJyZW50IHN0YXRlIG9mIEFBdWRpby4KKyAgICAgKi8KICAgICBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURSwKICAgICAvLyByZXNlcnZlZAogICAgIC8vIHJlc2VydmVkCisgICAgLyogVGhlIHNlcnZlciByZWplY3RlZCB0aGUgaGFuZGxlIHVzZWQgdG8gaWRlbnRpZnkgdGhlIHN0cmVhbS4KKyAgICAgKi8KICAgICBBQVVESU9fRVJST1JfSU5WQUxJRF9IQU5ETEUgPSBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURSArIDMsCiAgICAgLy8gcmVzZXJ2ZWQKKworICAgIC8qKgorICAgICAqIFRoZSBmdW5jdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIHRoaXMgc3RyZWFtLgorICAgICAqLwogICAgIEFBVURJT19FUlJPUl9VTklNUExFTUVOVEVEID0gQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFICsgMiwKKworICAgIC8qKgorICAgICAqIEEgcmVzb3VyY2Ugb3IgaW5mb3JtYXRpb24gaXMgdW5hdmFpbGFibGUuCisgICAgICogVGhpcyBjb3VsZCBvY2N1ciB3aGVuIGFuIGFwcGxpY2F0aW9uIHRyaWVzIHRvIG9wZW4gdG9vIG1hbnkgc3RyZWFtcywKKyAgICAgKiBvciBhIHRpbWVzdGFtcCBpcyBub3QgYXZhaWxhYmxlLgorICAgICAqLwogICAgIEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRSwKICAgICBBQVVESU9fRVJST1JfTk9fRlJFRV9IQU5ETEVTLAorCisgICAgLyoqCisgICAgICogTWVtb3J5IGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQuCisgICAgICovCiAgICAgQUFVRElPX0VSUk9SX05PX01FTU9SWSwKKworICAgIC8qKgorICAgICAqIEEgTlVMTCBwb2ludGVyIHdhcyBwYXNzZWQgdG8gQUF1ZGlvLgorICAgICAqIE9yIGEgTlVMTCBwb2ludGVyIHdhcyBkZXRlY3RlZCBpbnRlcm5hbGx5LgorICAgICAqLwogICAgIEFBVURJT19FUlJPUl9OVUxMLAorCisgICAgLyoqCisgICAgICogQW4gb3BlcmF0aW9uIHRvb2sgbG9uZ2VyIHRoYW4gZXhwZWN0ZWQuCisgICAgICovCiAgICAgQUFVRElPX0VSUk9SX1RJTUVPVVQsCiAgICAgQUFVRElPX0VSUk9SX1dPVUxEX0JMT0NLLAorCisgICAgLyoqCisgICAgICogVGhlIHJlcXVlc3RlZCBkYXRhIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAqLwogICAgIEFBVURJT19FUlJPUl9JTlZBTElEX0ZPUk1BVCwKKworICAgIC8qKgorICAgICAqIEEgcmVxdWVzdGVkIHdhcyBvdXQgb2YgcmFuZ2UuCisgICAgICovCiAgICAgQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRSwKKworICAgIC8qKgorICAgICAqIFRoZSBhdWRpbyBzZXJ2aWNlIHdhcyBub3QgYXZhaWxhYmxlLgorICAgICAqLwogICAgIEFBVURJT19FUlJPUl9OT19TRVJWSUNFLAorCisgICAgLyoqCisgICAgICogVGhlIHJlcXVlc3RlZCBzYW1wbGUgcmF0ZSB3YXMgbm90IHN1cHBvcnRlZC4KKyAgICAgKi8KICAgICBBQVVESU9fRVJST1JfSU5WQUxJRF9SQVRFCiB9OwogdHlwZWRlZiBpbnQzMl90ICBhYXVkaW9fcmVzdWx0X3Q7CkBAIC0xMjMsMjAgKzIxMCwyMDAgQEAKICAgICAvKioKICAgICAgKiBObyBwYXJ0aWN1bGFyIHBlcmZvcm1hbmNlIG5lZWRzLiBEZWZhdWx0LgogICAgICAqLwotICAgICAgICAgICAgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORSA9IDEwLAorICAgIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUgPSAxMCwKIAogICAgIC8qKgotICAgICAqIEV4dGVuZGluZyBiYXR0ZXJ5IGxpZmUgaXMgbW9zdCBpbXBvcnRhbnQuCisgICAgICogRXh0ZW5kaW5nIGJhdHRlcnkgbGlmZSBpcyBtb3JlIGltcG9ydGFudCB0aGFuIGxvdyBsYXRlbmN5LgorICAgICAqCisgICAgICogVGhpcyBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gaW5wdXQgc3RyZWFtcy4KKyAgICAgKiBGb3IgaW5wdXQsIG1vZGUgTk9ORSB3aWxsIGJlIHVzZWQgaWYgdGhpcyBpcyByZXF1ZXN0ZWQuCiAgICAgICovCi0gICAgICAgICAgICBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9QT1dFUl9TQVZJTkcsCisgICAgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfUE9XRVJfU0FWSU5HLAogCiAgICAgLyoqCi0gICAgICogUmVkdWNpbmcgbGF0ZW5jeSBpcyBtb3N0IGltcG9ydGFudC4KKyAgICAgKiBSZWR1Y2luZyBsYXRlbmN5IGlzIG1vcmUgaW1wb3J0YW50IHRoYW4gYmF0dGVyeSBsaWZlLgogICAgICAqLwotICAgICAgICAgICAgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1kKKyAgICBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWQogfTsKIHR5cGVkZWYgaW50MzJfdCBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90OwogCisvKioKKyAqIFRoZSBVU0FHRSBhdHRyaWJ1dGUgZXhwcmVzc2VzICJ3aHkiIHlvdSBhcmUgcGxheWluZyBhIHNvdW5kLCB3aGF0IGlzIHRoaXMgc291bmQgdXNlZCBmb3IuCisgKiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgYnkgY2VydGFpbiBwbGF0Zm9ybXMgb3Igcm91dGluZyBwb2xpY2llcworICogdG8gbWFrZSBtb3JlIHJlZmluZWQgdm9sdW1lIG9yIHJvdXRpbmcgZGVjaXNpb25zLgorICoKKyAqIE5vdGUgdGhhdCB0aGVzZSBtYXRjaCB0aGUgZXF1aXZhbGVudCB2YWx1ZXMgaW4gQXVkaW9BdHRyaWJ1dGVzIGluIHRoZSBBbmRyb2lkIEphdmEgQVBJLgorICoKKyAqIEFkZGVkIGluIEFQSSBsZXZlbCAyOC4KKyAqLworZW51bSB7CisgICAgLyoqCisgICAgICogVXNlIHRoaXMgZm9yIHN0cmVhbWluZyBtZWRpYSwgbXVzaWMgcGVyZm9ybWFuY2UsIHZpZGVvLCBwb2RjYXN0cywgZXRjZXRlcmEuCisgICAgICovCisgICAgQUFVRElPX1VTQUdFX01FRElBID0gMSwKKworICAgIC8qKgorICAgICAqIFVzZSB0aGlzIGZvciB2b2ljZSBvdmVyIElQLCB0ZWxlcGhvbnksIGV0Y2V0ZXJhLgorICAgICAqLworICAgIEFBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OID0gMiwKKworICAgIC8qKgorICAgICAqIFVzZSB0aGlzIGZvciBzb3VuZHMgYXNzb2NpYXRlZCB3aXRoIHRlbGVwaG9ueSBzdWNoIGFzIGJ1c3kgdG9uZXMsIERUTUYsIGV0Y2V0ZXJhLgorICAgICAqLworICAgIEFBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkcgPSAzLAorCisgICAgLyoqCisgICAgICogVXNlIHRoaXMgdG8gZGVtYW5kIHRoZSB1c2VycyBhdHRlbnRpb24uCisgICAgICovCisgICAgQUFVRElPX1VTQUdFX0FMQVJNID0gNCwKKworICAgIC8qKgorICAgICAqIFVzZSB0aGlzIGZvciBub3RpZnlpbmcgdGhlIHVzZXIgd2hlbiBhIG1lc3NhZ2UgaGFzIGFycml2ZWQgb3Igc29tZQorICAgICAqIG90aGVyIGJhY2tncm91bmQgZXZlbnQgaGFzIG9jY3VyZWQuCisgICAgICovCisgICAgQUFVRElPX1VTQUdFX05PVElGSUNBVElPTiA9IDUsCisKKyAgICAvKioKKyAgICAgKiBVc2UgdGhpcyB3aGVuIHRoZSBwaG9uZSByaW5ncy4KKyAgICAgKi8KKyAgICBBQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1JJTkdUT05FID0gNiwKKworICAgIC8qKgorICAgICAqIFVzZSB0aGlzIHRvIGF0dHJhY3QgdGhlIHVzZXJzIGF0dGVudGlvbiB3aGVuLCBmb3IgZXhhbXBsZSwgdGhlIGJhdHRlcnkgaXMgbG93LgorICAgICAqLworICAgIEFBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQgPSAxMCwKKworICAgIC8qKgorICAgICAqIFVzZSB0aGlzIGZvciBzY3JlZW4gcmVhZGVycywgZXRjZXRlcmEuCisgICAgICovCisgICAgQUFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWSA9IDExLAorCisgICAgLyoqCisgICAgICogVXNlIHRoaXMgZm9yIGRyaXZpbmcgb3IgbmF2aWdhdGlvbiBkaXJlY3Rpb25zLgorICAgICAqLworICAgIEFBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0UgPSAxMiwKKworICAgIC8qKgorICAgICAqIFVzZSB0aGlzIGZvciB1c2VyIGludGVyZmFjZSBzb3VuZHMsIGJlZXBzLCBldGNldGVyYS4KKyAgICAgKi8KKyAgICBBQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT04gPSAxMywKKworICAgIC8qKgorICAgICAqIFVzZSB0aGlzIGZvciBnYW1lIGF1ZGlvIGFuZCBzb3VuZCBlZmZlY3RzLgorICAgICAqLworICAgIEFBVURJT19VU0FHRV9HQU1FID0gMTQsCisKKyAgICAvKioKKyAgICAgKiBVc2UgdGhpcyBmb3IgYXVkaW8gcmVzcG9uc2VzIHRvIHVzZXIgcXVlcmllcywgYXVkaW8gaW5zdHJ1Y3Rpb25zIG9yIGhlbHAgdXR0ZXJhbmNlcy4KKyAgICAgKi8KKyAgICBBQVVESU9fVVNBR0VfQVNTSVNUQU5UID0gMTYKK307Cit0eXBlZGVmIGludDMyX3QgYWF1ZGlvX3VzYWdlX3Q7CisKKy8qKgorICogVGhlIENPTlRFTlRfVFlQRSBhdHRyaWJ1dGUgZGVzY3JpYmVzICJ3aGF0IiB5b3UgYXJlIHBsYXlpbmcuCisgKiBJdCBleHByZXNzZXMgdGhlIGdlbmVyYWwgY2F0ZWdvcnkgb2YgdGhlIGNvbnRlbnQuIFRoaXMgaW5mb3JtYXRpb24gaXMgb3B0aW9uYWwuCisgKiBCdXQgaW4gY2FzZSBpdCBpcyBrbm93biAoZm9yIGluc3RhbmNlIHtAbGluayAjQUFVRElPX0NPTlRFTlRfVFlQRV9NT1ZJRX0gZm9yIGEKKyAqIG1vdmllIHN0cmVhbWluZyBzZXJ2aWNlIG9yIHtAbGluayAjQUFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0h9IGZvcgorICogYW4gYXVkaW8gYm9vayBhcHBsaWNhdGlvbikgdGhpcyBpbmZvcm1hdGlvbiBtaWdodCBiZSB1c2VkIGJ5IHRoZSBhdWRpbyBmcmFtZXdvcmsgdG8KKyAqIGVuZm9yY2UgYXVkaW8gZm9jdXMuCisgKgorICogTm90ZSB0aGF0IHRoZXNlIG1hdGNoIHRoZSBlcXVpdmFsZW50IHZhbHVlcyBpbiBBdWRpb0F0dHJpYnV0ZXMgaW4gdGhlIEFuZHJvaWQgSmF2YSBBUEkuCisgKgorICogQWRkZWQgaW4gQVBJIGxldmVsIDI4LgorICovCitlbnVtIHsKKworICAgIC8qKgorICAgICAqIFVzZSB0aGlzIGZvciBzcG9rZW4gdm9pY2UsIGF1ZGlvIGJvb2tzLCBldGNldGVyYS4KKyAgICAgKi8KKyAgICBBQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSCA9IDEsCisKKyAgICAvKioKKyAgICAgKiBVc2UgdGhpcyBmb3IgcHJlLXJlY29yZGVkIG9yIGxpdmUgbXVzaWMuCisgICAgICovCisgICAgQUFVRElPX0NPTlRFTlRfVFlQRV9NVVNJQyA9IDIsCisKKyAgICAvKioKKyAgICAgKiBVc2UgdGhpcyBmb3IgYSBtb3ZpZSBvciB2aWRlbyBzb3VuZHRyYWNrLgorICAgICAqLworICAgIEFBVURJT19DT05URU5UX1RZUEVfTU9WSUUgPSAzLAorCisgICAgLyoqCisgICAgICogVXNlIHRoaXMgZm9yIHNvdW5kIGlzIGRlc2lnbmVkIHRvIGFjY29tcGFueSBhIHVzZXIgYWN0aW9uLAorICAgICAqIHN1Y2ggYXMgYSBjbGljayBvciBiZWVwIHNvdW5kIG1hZGUgd2hlbiB0aGUgdXNlciBwcmVzc2VzIGEgYnV0dG9uLgorICAgICAqLworICAgIEFBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OID0gNAorfTsKK3R5cGVkZWYgaW50MzJfdCBhYXVkaW9fY29udGVudF90eXBlX3Q7CisKKy8qKgorICogRGVmaW5lcyB0aGUgYXVkaW8gc291cmNlLgorICogQW4gYXVkaW8gc291cmNlIGRlZmluZXMgYm90aCBhIGRlZmF1bHQgcGh5c2ljYWwgc291cmNlIG9mIGF1ZGlvIHNpZ25hbCwgYW5kIGEgcmVjb3JkaW5nCisgKiBjb25maWd1cmF0aW9uLgorICoKKyAqIE5vdGUgdGhhdCB0aGVzZSBtYXRjaCB0aGUgZXF1aXZhbGVudCB2YWx1ZXMgaW4gTWVkaWFSZWNvcmRlci5BdWRpb1NvdXJjZSBpbiB0aGUgQW5kcm9pZCBKYXZhIEFQSS4KKyAqCisgKiBBZGRlZCBpbiBBUEkgbGV2ZWwgMjguCisgKi8KK2VudW0geworICAgIC8qKgorICAgICAqIFVzZSB0aGlzIHByZXNldCB3aGVuIG90aGVyIHByZXNldHMgZG8gbm90IGFwcGx5LgorICAgICAqLworICAgIEFBVURJT19JTlBVVF9QUkVTRVRfR0VORVJJQyA9IDEsCisKKyAgICAvKioKKyAgICAgKiBVc2UgdGhpcyBwcmVzZXQgd2hlbiByZWNvcmRpbmcgdmlkZW8uCisgICAgICovCisgICAgQUFVRElPX0lOUFVUX1BSRVNFVF9DQU1DT1JERVIgPSA1LAorCisgICAgLyoqCisgICAgICogVXNlIHRoaXMgcHJlc2V0IHdoZW4gZG9pbmcgc3BlZWNoIHJlY29nbml0aW9uLgorICAgICAqLworICAgIEFBVURJT19JTlBVVF9QUkVTRVRfVk9JQ0VfUkVDT0dOSVRJT04gPSA2LAorCisgICAgLyoqCisgICAgICogVXNlIHRoaXMgcHJlc2V0IHdoZW4gZG9pbmcgdGVsZXBob255IG9yIHZvaWNlIG1lc3NhZ2luZy4KKyAgICAgKi8KKyAgICBBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX0NPTU1VTklDQVRJT04gPSA3LAorCisgICAgLyoqCisgICAgICogVXNlIHRoaXMgcHJlc2V0IHRvIG9idGFpbiBhbiBpbnB1dCB3aXRoIG5vIGVmZmVjdHMuCisgICAgICogTm90ZSB0aGF0IHRoaXMgaW5wdXQgd2lsbCBub3QgaGF2ZSBhdXRvbWF0aWMgZ2FpbiBjb250cm9sCisgICAgICogc28gdGhlIHJlY29yZGVkIHZvbHVtZSBtYXkgYmUgdmVyeSBsb3cuCisgICAgICovCisgICAgQUFVRElPX0lOUFVUX1BSRVNFVF9VTlBST0NFU1NFRCA9IDksCit9OwordHlwZWRlZiBpbnQzMl90IGFhdWRpb19pbnB1dF9wcmVzZXRfdDsKKworLyoqCisgKiBUaGVzZSBtYXkgYmUgdXNlZCB3aXRoIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2Vzc2lvbklkKCkuCisgKgorICogQWRkZWQgaW4gQVBJIGxldmVsIDI4LgorICovCitlbnVtIHsKKyAgICAvKioKKyAgICAgKiBEbyBub3QgYWxsb2NhdGUgYSBzZXNzaW9uIElELgorICAgICAqIEVmZmVjdHMgY2Fubm90IGJlIHVzZWQgd2l0aCB0aGlzIHN0cmVhbS4KKyAgICAgKiBEZWZhdWx0LgorICAgICAqCisgICAgICogQWRkZWQgaW4gQVBJIGxldmVsIDI4LgorICAgICAqLworICAgIEFBVURJT19TRVNTSU9OX0lEX05PTkUgPSAtMSwKKworICAgIC8qKgorICAgICAqIEFsbG9jYXRlIGEgc2Vzc2lvbiBJRCB0aGF0IGNhbiBiZSB1c2VkIHRvIGF0dGFjaCBhbmQgY29udHJvbAorICAgICAqIGVmZmVjdHMgdXNpbmcgdGhlIEphdmEgQXVkaW9FZmZlY3RzIEFQSS4KKyAgICAgKiBOb3RlIHRoYXQgdXNpbmcgdGhpcyBtYXkgcmVzdWx0IGluIGhpZ2hlciBsYXRlbmN5LgorICAgICAqCisgICAgICogTm90ZSB0aGF0IHRoaXMgbWF0Y2hlcyB0aGUgdmFsdWUgb2YgQXVkaW9NYW5hZ2VyLkFVRElPX1NFU1NJT05fSURfR0VORVJBVEUuCisgICAgICoKKyAgICAgKiBBZGRlZCBpbiBBUEkgbGV2ZWwgMjguCisgICAgICovCisgICAgQUFVRElPX1NFU1NJT05fSURfQUxMT0NBVEUgPSAwLAorfTsKK3R5cGVkZWYgaW50MzJfdCBhYXVkaW9fc2Vzc2lvbl9pZF90OworCiB0eXBlZGVmIHN0cnVjdCBBQXVkaW9TdHJlYW1TdHJ1Y3QgICAgICAgICBBQXVkaW9TdHJlYW07CiB0eXBlZGVmIHN0cnVjdCBBQXVkaW9TdHJlYW1CdWlsZGVyU3RydWN0ICBBQXVkaW9TdHJlYW1CdWlsZGVyOwogCkBAIC0yOTksOCArNTY2LDE0IEBACiAvKioKICAqIFNldCB0aGUgcmVxdWVzdGVkIHBlcmZvcm1hbmNlIG1vZGUuCiAgKgorICogU3VwcG9ydGVkIG1vZGVzIGFyZSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FLCBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9QT1dFUl9TQVZJTkcKKyAqIGFuZCBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWS4KKyAqCiAgKiBUaGUgZGVmYXVsdCwgaWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24sIGlzIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUuCiAgKgorICogWW91IG1heSBub3QgZ2V0IHRoZSBtb2RlIHlvdSByZXF1ZXN0ZWQuCisgKiBZb3UgY2FuIGNhbGwgQUF1ZGlvU3RyZWFtX2dldFBlcmZvcm1hbmNlTW9kZSgpIHRvIGZpbmQgb3V0IHRoZSBmaW5hbCBtb2RlIGZvciB0aGUgc3RyZWFtLgorICoKICAqIEBwYXJhbSBidWlsZGVyIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlcigpCiAgKiBAcGFyYW0gbW9kZSB0aGUgZGVzaXJlZCBwZXJmb3JtYW5jZSBtb2RlLCBlZy4gQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1kKICAqLwpAQCAtMzA4LDYgKzU4MSw5MCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBtb2RlKTsKIAogLyoqCisgKiBTZXQgdGhlIGludGVuZGVkIHVzZSBjYXNlIGZvciB0aGUgc3RyZWFtLgorICoKKyAqIFRoZSBBQXVkaW8gc3lzdGVtIHdpbGwgdXNlIHRoaXMgaW5mb3JtYXRpb24gdG8gb3B0aW1pemUgdGhlCisgKiBiZWhhdmlvciBvZiB0aGUgc3RyZWFtLgorICogVGhpcyBjb3VsZCwgZm9yIGV4YW1wbGUsIGFmZmVjdCBob3cgdm9sdW1lIGFuZCBmb2N1cyBpcyBoYW5kbGVkIGZvciB0aGUgc3RyZWFtLgorICoKKyAqIFRoZSBkZWZhdWx0LCBpZiB5b3UgZG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiwgaXMgQUFVRElPX1VTQUdFX01FRElBLgorICoKKyAqIEFkZGVkIGluIEFQSSBsZXZlbCAyOC4KKyAqCisgKiBAcGFyYW0gYnVpbGRlciByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIoKQorICogQHBhcmFtIHVzYWdlIHRoZSBkZXNpcmVkIHVzYWdlLCBlZy4gQUFVRElPX1VTQUdFX0dBTUUKKyAqLworQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0VXNhZ2UoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fdXNhZ2VfdCB1c2FnZSk7CisKKy8qKgorICogU2V0IHRoZSB0eXBlIG9mIGF1ZGlvIGRhdGEgdGhhdCB0aGUgc3RyZWFtIHdpbGwgY2FycnkuCisgKgorICogVGhlIEFBdWRpbyBzeXN0ZW0gd2lsbCB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBvcHRpbWl6ZSB0aGUKKyAqIGJlaGF2aW9yIG9mIHRoZSBzdHJlYW0uCisgKiBUaGlzIGNvdWxkLCBmb3IgZXhhbXBsZSwgYWZmZWN0IHdoZXRoZXIgYSBzdHJlYW0gaXMgcGF1c2VkIHdoZW4gYSBub3RpZmljYXRpb24gb2NjdXJzLgorICoKKyAqIFRoZSBkZWZhdWx0LCBpZiB5b3UgZG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiwgaXMgQUFVRElPX0NPTlRFTlRfVFlQRV9NVVNJQy4KKyAqCisgKiBBZGRlZCBpbiBBUEkgbGV2ZWwgMjguCisgKgorICogQHBhcmFtIGJ1aWxkZXIgcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyKCkKKyAqIEBwYXJhbSBjb250ZW50VHlwZSB0aGUgdHlwZSBvZiBhdWRpbyBkYXRhLCBlZy4gQUFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0gKKyAqLworQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0Q29udGVudFR5cGUoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19jb250ZW50X3R5cGVfdCBjb250ZW50VHlwZSk7CisKKy8qKgorICogU2V0IHRoZSBpbnB1dCAoY2FwdHVyZSkgcHJlc2V0IGZvciB0aGUgc3RyZWFtLgorICoKKyAqIFRoZSBBQXVkaW8gc3lzdGVtIHdpbGwgdXNlIHRoaXMgaW5mb3JtYXRpb24gdG8gb3B0aW1pemUgdGhlCisgKiBiZWhhdmlvciBvZiB0aGUgc3RyZWFtLgorICogVGhpcyBjb3VsZCwgZm9yIGV4YW1wbGUsIGFmZmVjdCB3aGljaCBtaWNyb3Bob25lcyBhcmUgdXNlZCBhbmQgaG93IHRoZQorICogcmVjb3JkZWQgZGF0YSBpcyBwcm9jZXNzZWQuCisgKgorICogVGhlIGRlZmF1bHQsIGlmIHlvdSBkbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uLCBpcyBBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX1JFQ09HTklUSU9OLgorICogVGhhdCBpcyBiZWNhdXNlIFZPSUNFX1JFQ09HTklUSU9OIGlzIHRoZSBwcmVzZXQgd2l0aCB0aGUgbG93ZXN0IGxhdGVuY3kKKyAqIG9uIG1hbnkgcGxhdGZvcm1zLgorICoKKyAqIEFkZGVkIGluIEFQSSBsZXZlbCAyOC4KKyAqCisgKiBAcGFyYW0gYnVpbGRlciByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIoKQorICogQHBhcmFtIGlucHV0UHJlc2V0IHRoZSBkZXNpcmVkIGNvbmZpZ3VyYXRpb24gZm9yIHJlY29yZGluZworICovCitBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRJbnB1dFByZXNldChBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX2lucHV0X3ByZXNldF90IGlucHV0UHJlc2V0KTsKKworLyoqIFNldCB0aGUgcmVxdWVzdGVkIHNlc3Npb24gSUQuCisgKgorICogVGhlIHNlc3Npb24gSUQgY2FuIGJlIHVzZWQgdG8gYXNzb2NpYXRlIGEgc3RyZWFtIHdpdGggZWZmZWN0cyBwcm9jZXNzb3JzLgorICogVGhlIGVmZmVjdHMgYXJlIGNvbnRyb2xsZWQgdXNpbmcgdGhlIEFuZHJvaWQgQXVkaW9FZmZlY3QgSmF2YSBBUEkuCisgKgorICogVGhlIGRlZmF1bHQsIGlmIHlvdSBkbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uLCBpcyBBQVVESU9fU0VTU0lPTl9JRF9OT05FLgorICoKKyAqIElmIHNldCB0byBBQVVESU9fU0VTU0lPTl9JRF9BTExPQ0FURSB0aGVuIGEgc2Vzc2lvbiBJRCB3aWxsIGJlIGFsbG9jYXRlZAorICogd2hlbiB0aGUgc3RyZWFtIGlzIG9wZW5lZC4KKyAqCisgKiBUaGUgYWxsb2NhdGVkIHNlc3Npb24gSUQgY2FuIGJlIG9idGFpbmVkIGJ5IGNhbGxpbmcgQUF1ZGlvU3RyZWFtX2dldFNlc3Npb25JZCgpCisgKiBhbmQgdGhlbiB1c2VkIHdpdGggdGhpcyBmdW5jdGlvbiB3aGVuIG9wZW5pbmcgYW5vdGhlciBzdHJlYW0uCisgKiBUaGlzIGFsbG93cyBlZmZlY3RzIHRvIGJlIHNoYXJlZCBiZXR3ZWVuIHN0cmVhbXMuCisgKgorICogU2Vzc2lvbiBJRHMgZnJvbSBBQXVkaW8gY2FuIGJlIHVzZWQgd2l0aCB0aGUgQW5kcm9pZCBKYXZhIEFQSXMgYW5kIHZpY2UgdmVyc2EuCisgKiBTbyBhIHNlc3Npb24gSUQgZnJvbSBhbiBBQXVkaW8gc3RyZWFtIGNhbiBiZSBwYXNzZWQgdG8gSmF2YQorICogYW5kIGVmZmVjdHMgYXBwbGllZCB1c2luZyB0aGUgSmF2YSBBdWRpb0VmZmVjdCBBUEkuCisgKgorICogTm90ZSB0aGF0IGFsbG9jYXRpbmcgb3Igc2V0dGluZyBhIHNlc3Npb24gSUQgbWF5IHJlc3VsdCBpbiBhIHN0cmVhbSB3aXRoIGhpZ2hlciBsYXRlbmN5LgorICoKKyAqIEFsbG9jYXRlZCBzZXNzaW9uIElEcyB3aWxsIGFsd2F5cyBiZSBwb3NpdGl2ZSBhbmQgbm9uemVyby4KKyAqCisgKiBBZGRlZCBpbiBBUEkgbGV2ZWwgMjguCisgKgorICogQHBhcmFtIGJ1aWxkZXIgcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyKCkKKyAqIEBwYXJhbSBzZXNzaW9uSWQgYW4gYWxsb2NhdGVkIHNlc3Npb25JRCBvciBBQVVESU9fU0VTU0lPTl9JRF9BTExPQ0FURQorICovCitBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTZXNzaW9uSWQoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19zZXNzaW9uX2lkX3Qgc2Vzc2lvbklkKTsKKworLyoqCiAgKiBSZXR1cm4gb25lIG9mIHRoZXNlIHZhbHVlcyBmcm9tIHRoZSBkYXRhIGNhbGxiYWNrIGZ1bmN0aW9uLgogICovCiBlbnVtIHsKQEAgLTMzNyw3ICs2OTQsMTMgQEAKICAqIEZvciBhbiBpbnB1dCBzdHJlYW0sIHRoaXMgZnVuY3Rpb24gc2hvdWxkIHJlYWQgYW5kIHByb2Nlc3MgbnVtRnJhbWVzIG9mIGRhdGEKICAqIGZyb20gdGhlIGF1ZGlvRGF0YSBidWZmZXIuCiAgKgotICogTm90ZSB0aGF0IHRoaXMgY2FsbGJhY2sgZnVuY3Rpb24gc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSAicmVhbC10aW1lIiBmdW5jdGlvbi4KKyAqIFRoZSBhdWRpbyBkYXRhIGlzIHBhc3NlZCB0aHJvdWdoIHRoZSBidWZmZXIuIFNvIGRvIE5PVCBjYWxsIEFBdWRpb1N0cmVhbV9yZWFkKCkgb3IKKyAqIEFBdWRpb1N0cmVhbV93cml0ZSgpIG9uIHRoZSBzdHJlYW0gdGhhdCBpcyBtYWtpbmcgdGhlIGNhbGxiYWNrLgorICoKKyAqIE5vdGUgdGhhdCBudW1GcmFtZXMgY2FuIHZhcnkgdW5sZXNzIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RnJhbWVzUGVyRGF0YUNhbGxiYWNrKCkKKyAqIGlzIGNhbGxlZC4KKyAqCisgKiBBbHNvIG5vdGUgdGhhdCB0aGlzIGNhbGxiYWNrIGZ1bmN0aW9uIHNob3VsZCBiZSBjb25zaWRlcmVkIGEgInJlYWwtdGltZSIgZnVuY3Rpb24uCiAgKiBJdCBtdXN0IG5vdCBkbyBhbnl0aGluZyB0aGF0IGNvdWxkIGNhdXNlIGFuIHVuYm91bmRlZCBkZWxheSBiZWNhdXNlIHRoYXQgY2FuIGNhdXNlIHRoZQogICogYXVkaW8gdG8gZ2xpdGNoIG9yIHBvcC4KICAqCkBAIC0zNDgsNiArNzExLDE1IEBACiAgKiA8bGk+YW55IG5ldHdvcmsgb3BlcmF0aW9ucyBzdWNoIGFzIHN0cmVhbWluZzwvbGk+CiAgKiA8bGk+dXNlIGFueSBtdXRleGVzIG9yIG90aGVyIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzPC9saT4KICAqIDxsaT5zbGVlcDwvbGk+CisgKiA8bGk+c3RvcCBvciBjbG9zZSB0aGUgc3RyZWFtPC9saT4KKyAqIDxsaT5BQXVkaW9TdHJlYW1fcmVhZCgpPC9saT4KKyAqIDxsaT5BQXVkaW9TdHJlYW1fd3JpdGUoKTwvbGk+CisgKiA8L3VsPgorICoKKyAqIFRoZSBmb2xsb3dpbmcgYXJlIE9LIHRvIGNhbGwgZnJvbSB0aGUgZGF0YSBjYWxsYmFjazoKKyAqIDx1bD4KKyAqIDxsaT5BQXVkaW9TdHJlYW1fZ2V0KigpPC9saT4KKyAqIDxsaT5BQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dCgpPC9saT4KICAqIDwvdWw+CiAgKgogICogSWYgeW91IG5lZWQgdG8gbW92ZSBkYXRhLCBlZy4gTUlESSBjb21tYW5kcywgaW4gb3Igb3V0IG9mIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB0aGVuCkBAIC0zNTYsNyArNzI4LDcgQEAKICAqIEBwYXJhbSBzdHJlYW0gcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpCiAgKiBAcGFyYW0gdXNlckRhdGEgdGhlIHNhbWUgYWRkcmVzcyB0aGF0IHdhcyBwYXNzZWQgdG8gQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRDYWxsYmFjaygpCiAgKiBAcGFyYW0gYXVkaW9EYXRhIGEgcG9pbnRlciB0byB0aGUgYXVkaW8gZGF0YQotICogQHBhcmFtIG51bUZyYW1lcyB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0byBiZSBwcm9jZXNzZWQKKyAqIEBwYXJhbSBudW1GcmFtZXMgdGhlIG51bWJlciBvZiBmcmFtZXMgdG8gYmUgcHJvY2Vzc2VkLCB3aGljaCBjYW4gdmFyeQogICogQHJldHVybiBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUXyoKICAqLwogdHlwZWRlZiBhYXVkaW9fZGF0YV9jYWxsYmFja19yZXN1bHRfdCAoKkFBdWRpb1N0cmVhbV9kYXRhQ2FsbGJhY2spKApAQCAtNDIxLDYgKzc5MywyMiBAQAogICogUHJvdG90eXBlIGZvciB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBwYXNzZWQgdG8KICAqIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RXJyb3JDYWxsYmFjaygpLgogICoKKyAqIFRoZSBmb2xsb3dpbmcgbWF5IE5PVCBiZSBjYWxsZWQgZnJvbSB0aGUgZXJyb3IgY2FsbGJhY2s6CisgKiA8dWw+CisgKiA8bGk+QUF1ZGlvU3RyZWFtX3JlcXVlc3RTdG9wKCk8L2xpPgorICogPGxpPkFBdWRpb1N0cmVhbV9yZXF1ZXN0UGF1c2UoKTwvbGk+CisgKiA8bGk+QUF1ZGlvU3RyZWFtX2Nsb3NlKCk8L2xpPgorICogPGxpPkFBdWRpb1N0cmVhbV93YWl0Rm9yU3RhdGVDaGFuZ2UoKTwvbGk+CisgKiA8bGk+QUF1ZGlvU3RyZWFtX3JlYWQoKTwvbGk+CisgKiA8bGk+QUF1ZGlvU3RyZWFtX3dyaXRlKCk8L2xpPgorICogPC91bD4KKyAqCisgKiBUaGUgZm9sbG93aW5nIGFyZSBPSyB0byBjYWxsIGZyb20gdGhlIGVycm9yIGNhbGxiYWNrOgorICogPHVsPgorICogPGxpPkFBdWRpb1N0cmVhbV9nZXQqKCk8L2xpPgorICogPGxpPkFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KCk8L2xpPgorICogPC91bD4KKyAqCiAgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQogICogQHBhcmFtIHVzZXJEYXRhIHRoZSBzYW1lIGFkZHJlc3MgdGhhdCB3YXMgcGFzc2VkIHRvIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RXJyb3JDYWxsYmFjaygpCiAgKiBAcGFyYW0gZXJyb3IgYW4gQUFVRElPX0VSUk9SXyogdmFsdWUuCkBAIC00MzEsMTggKzgxOSwxOSBAQAogICAgICAgICBhYXVkaW9fcmVzdWx0X3QgZXJyb3IpOwogCiAvKioKLSAqIFJlcXVlc3QgdGhhdCBBQXVkaW8gY2FsbCB0aGlzIGZ1bmN0aW9ucyBpZiBhbnkgZXJyb3Igb2NjdXJzIG9uIGEgY2FsbGJhY2sgdGhyZWFkLgorICogUmVxdWVzdCB0aGF0IEFBdWRpbyBjYWxsIHRoaXMgZnVuY3Rpb24gaWYgYW55IGVycm9yIG9jY3VycyBvciB0aGUgc3RyZWFtIGlzIGRpc2Nvbm5lY3RlZC4KICAqCiAgKiBJdCB3aWxsIGJlIGNhbGxlZCwgZm9yIGV4YW1wbGUsIGlmIGEgaGVhZHNldCBvciBhIFVTQiBkZXZpY2UgaXMgdW5wbHVnZ2VkIGNhdXNpbmcgdGhlIHN0cmVhbSdzCi0gKiBkZXZpY2UgdG8gYmUgdW5hdmFpbGFibGUuCi0gKiBJbiByZXNwb25zZSwgdGhpcyBmdW5jdGlvbiBjb3VsZCBzaWduYWwgb3IgbGF1bmNoIGFub3RoZXIgdGhyZWFkIHRvIHJlb3BlbiBhCi0gKiBzdHJlYW0gb24gYW5vdGhlciBkZXZpY2UuIERvIG5vdCByZW9wZW4gdGhlIHN0cmVhbSBpbiB0aGlzIGNhbGxiYWNrLgotICoKLSAqIFRoaXMgd2lsbCBub3QgYmUgY2FsbGVkIGJlY2F1c2Ugb2YgYWN0aW9ucyBieSB0aGUgYXBwbGljYXRpb24sIHN1Y2ggYXMgc3RvcHBpbmcKLSAqIG9yIGNsb3NpbmcgYSBzdHJlYW0uCi0gKgorICogZGV2aWNlIHRvIGJlIHVuYXZhaWxhYmxlIG9yICJkaXNjb25uZWN0ZWQiLgogICogQW5vdGhlciBwb3NzaWJsZSBjYXVzZSBvZiBlcnJvciB3b3VsZCBiZSBhIHRpbWVvdXQgb3IgYW4gdW5hbnRpY2lwYXRlZCBpbnRlcm5hbCBlcnJvci4KICAqCisgKiBJbiByZXNwb25zZSwgdGhpcyBmdW5jdGlvbiBzaG91bGQgc2lnbmFsIG9yIGNyZWF0ZSBhbm90aGVyIHRocmVhZCB0byBzdG9wCisgKiBhbmQgY2xvc2UgdGhpcyBzdHJlYW0uIFRoZSBvdGhlciB0aHJlYWQgY291bGQgdGhlbiByZW9wZW4gYSBzdHJlYW0gb24gYW5vdGhlciBkZXZpY2UuCisgKiBEbyBub3Qgc3RvcCBvciBjbG9zZSB0aGUgc3RyZWFtLCBvciByZW9wZW4gdGhlIG5ldyBzdHJlYW0sIGRpcmVjdGx5IGZyb20gdGhpcyBjYWxsYmFjay4KKyAqCisgKiBUaGlzIGNhbGxiYWNrIHdpbGwgbm90IGJlIGNhbGxlZCBiZWNhdXNlIG9mIGFjdGlvbnMgYnkgdGhlIGFwcGxpY2F0aW9uLCBzdWNoIGFzIHN0b3BwaW5nCisgKiBvciBjbG9zaW5nIGEgc3RyZWFtLgorICoKICAqIE5vdGUgdGhhdCB0aGUgQUF1ZGlvIGNhbGxiYWNrcyB3aWxsIG5ldmVyIGJlIGNhbGxlZCBzaW11bHRhbmVvdXNseSBmcm9tIG11bHRpcGxlIHRocmVhZHMuCiAgKgogICogQHBhcmFtIGJ1aWxkZXIgcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyKCkKQEAgLTU1NCwxMSArOTQzLDEzIEBACiAgKiBUaGlzIHdpbGwgdXBkYXRlIHRoZSBjdXJyZW50IGNsaWVudCBzdGF0ZS4KICAqCiAgKiA8cHJlPjxjb2RlPgotICogYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IGN1cnJlbnRTdGF0ZTsKLSAqIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TdHJlYW1fZ2V0U3RhdGUoc3RyZWFtLCAmY3VycmVudFN0YXRlKTsKLSAqIHdoaWxlIChyZXN1bHQgPT0gQUFVRElPX09LICYmIGN1cnJlbnRTdGF0ZSAhPSBBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNJTkcpIHsKKyAqIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CisgKiBhYXVkaW9fc3RyZWFtX3N0YXRlX3QgY3VycmVudFN0YXRlID0gQUF1ZGlvU3RyZWFtX2dldFN0YXRlKHN0cmVhbSk7CisgKiBhYXVkaW9fc3RyZWFtX3N0YXRlX3QgaW5wdXRTdGF0ZSA9IGN1cnJlbnRTdGF0ZTsKKyAqIHdoaWxlIChyZXN1bHQgPT0gQUFVRElPX09LICYmIGN1cnJlbnRTdGF0ZSAhPSBBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNFRCkgewogICogICAgIHJlc3VsdCA9IEFBdWRpb1N0cmVhbV93YWl0Rm9yU3RhdGVDaGFuZ2UoCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLCBjdXJyZW50U3RhdGUsICZjdXJyZW50U3RhdGUsIE1ZX1RJTUVPVVRfTkFOT1MpOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgaW5wdXRTdGF0ZSwgJmN1cnJlbnRTdGF0ZSwgTVlfVElNRU9VVF9OQU5PUyk7CisgKiAgICAgaW5wdXRTdGF0ZSA9IGN1cnJlbnRTdGF0ZTsKICAqIH0KICAqIDwvY29kZT48L3ByZT4KICAqCkBAIC01ODksNiArOTgwLDggQEAKICAqCiAgKiBUaGlzIGNhbGwgaXMgInN0cm9uZyBub24tYmxvY2tpbmciIHVubGVzcyBpdCBoYXMgdG8gd2FpdCBmb3IgZGF0YS4KICAqCisgKiBJZiB0aGUgY2FsbCB0aW1lcyBvdXQgdGhlbiB6ZXJvIG9yIGEgcGFydGlhbCBmcmFtZSBjb3VudCB3aWxsIGJlIHJldHVybmVkLgorICoKICAqIEBwYXJhbSBzdHJlYW0gQSBzdHJlYW0gY3JlYXRlZCB1c2luZyBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKS4KICAqIEBwYXJhbSBidWZmZXIgVGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IHNhbXBsZS4KICAqIEBwYXJhbSBudW1GcmFtZXMgTnVtYmVyIG9mIGZyYW1lcyB0byByZWFkLiBPbmx5IGNvbXBsZXRlIGZyYW1lcyB3aWxsIGJlIHdyaXR0ZW4uCkBAIC02MTIsNiArMTAwNSw4IEBACiAgKgogICogVGhpcyBjYWxsIGlzICJzdHJvbmcgbm9uLWJsb2NraW5nIiB1bmxlc3MgaXQgaGFzIHRvIHdhaXQgZm9yIHJvb20gaW4gdGhlIGJ1ZmZlci4KICAqCisgKiBJZiB0aGUgY2FsbCB0aW1lcyBvdXQgdGhlbiB6ZXJvIG9yIGEgcGFydGlhbCBmcmFtZSBjb3VudCB3aWxsIGJlIHJldHVybmVkLgorICoKICAqIEBwYXJhbSBzdHJlYW0gQSBzdHJlYW0gY3JlYXRlZCB1c2luZyBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKS4KICAqIEBwYXJhbSBidWZmZXIgVGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IHNhbXBsZS4KICAqIEBwYXJhbSBudW1GcmFtZXMgTnVtYmVyIG9mIGZyYW1lcyB0byB3cml0ZS4gT25seSBjb21wbGV0ZSBmcmFtZXMgd2lsbCBiZSB3cml0dGVuLgpAQCAtNjM2LDcgKzEwMzEsOCBAQAogICogVGhpcyBjYW5ub3QgYmUgc2V0IGhpZ2hlciB0aGFuIEFBdWRpb1N0cmVhbV9nZXRCdWZmZXJDYXBhY2l0eUluRnJhbWVzKCkuCiAgKgogICogTm90ZSB0aGF0IHlvdSB3aWxsIHByb2JhYmx5IG5vdCBnZXQgdGhlIGV4YWN0IHNpemUgeW91IHJlcXVlc3QuCi0gKiBDYWxsIEFBdWRpb1N0cmVhbV9nZXRCdWZmZXJTaXplSW5GcmFtZXMoKSB0byBzZWUgd2hhdCB0aGUgYWN0dWFsIGZpbmFsIHNpemUgaXMuCisgKiBZb3UgY2FuIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgb3IgY2FsbCBBQXVkaW9TdHJlYW1fZ2V0QnVmZmVyU2l6ZUluRnJhbWVzKCkKKyAqIHRvIHNlZSB3aGF0IHRoZSBhY3R1YWwgZmluYWwgc2l6ZSBpcy4KICAqCiAgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQogICogQHBhcmFtIG51bUZyYW1lcyByZXF1ZXN0ZWQgbnVtYmVyIG9mIGZyYW1lcyB0aGF0IGNhbiBiZSBmaWxsZWQgd2l0aG91dCBibG9ja2luZwpAQCAtNjgzLDEwICsxMDc5LDEwIEBACiAgKiBUaGlzIGNhbGwgY2FuIGJlIHVzZWQgaWYgdGhlIGFwcGxpY2F0aW9uIG5lZWRzIHRvIGtub3cgdGhlIHZhbHVlIG9mIG51bUZyYW1lcyBiZWZvcmUKICAqIHRoZSBzdHJlYW0gaXMgc3RhcnRlZC4gVGhpcyBpcyBub3Qgbm9ybWFsbHkgbmVjZXNzYXJ5LgogICoKLSAqIElmIGEgc3BlY2lmaWMgc2l6ZSB3YXMgcmVxdWVzdGVkIGJ5IGNhbGxpbmcgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRDYWxsYmFja1NpemVJbkZyYW1lcygpCisgKiBJZiBhIHNwZWNpZmljIHNpemUgd2FzIHJlcXVlc3RlZCBieSBjYWxsaW5nIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RnJhbWVzUGVyRGF0YUNhbGxiYWNrKCkKICAqIHRoZW4gdGhpcyB3aWxsIGJlIHRoZSBzYW1lIHNpemUuCiAgKgotICogSWYgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRDYWxsYmFja1NpemVJbkZyYW1lcygpIHdhcyBub3QgY2FsbGVkIHRoZW4gdGhpcyB3aWxsCisgKiBJZiBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEZyYW1lc1BlckRhdGFDYWxsYmFjaygpIHdhcyBub3QgY2FsbGVkIHRoZW4gdGhpcyB3aWxsCiAgKiByZXR1cm4gdGhlIHNpemUgY2hvc2VuIGJ5IEFBdWRpbywgb3IgQUFVRElPX1VOU1BFQ0lGSUVELgogICoKICAqIEFBVURJT19VTlNQRUNJRklFRCBpbmRpY2F0ZXMgdGhhdCB0aGUgY2FsbGJhY2sgYnVmZmVyIHNpemUgZm9yIHRoaXMgc3RyZWFtCkBAIC03NzEsNyArMTE2Nyw4IEBACiAKIC8qKgogICogUGFzc2VzIGJhY2sgdGhlIG51bWJlciBvZiBmcmFtZXMgdGhhdCBoYXZlIGJlZW4gd3JpdHRlbiBzaW5jZSB0aGUgc3RyZWFtIHdhcyBjcmVhdGVkLgotICogRm9yIGFuIG91dHB1dCBzdHJlYW0sIHRoaXMgd2lsbCBiZSBhZHZhbmNlZCBieSB0aGUgYXBwbGljYXRpb24gY2FsbGluZyB3cml0ZSgpLgorICogRm9yIGFuIG91dHB1dCBzdHJlYW0sIHRoaXMgd2lsbCBiZSBhZHZhbmNlZCBieSB0aGUgYXBwbGljYXRpb24gY2FsbGluZyB3cml0ZSgpCisgKiBvciBieSBhIGRhdGEgY2FsbGJhY2suCiAgKiBGb3IgYW4gaW5wdXQgc3RyZWFtLCB0aGlzIHdpbGwgYmUgYWR2YW5jZWQgYnkgdGhlIGVuZHBvaW50LgogICoKICAqIFRoZSBmcmFtZSBwb3NpdGlvbiBpcyBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcuCkBAIC03ODQsNyArMTE4MSw4IEBACiAvKioKICAqIFBhc3NlcyBiYWNrIHRoZSBudW1iZXIgb2YgZnJhbWVzIHRoYXQgaGF2ZSBiZWVuIHJlYWQgc2luY2UgdGhlIHN0cmVhbSB3YXMgY3JlYXRlZC4KICAqIEZvciBhbiBvdXRwdXQgc3RyZWFtLCB0aGlzIHdpbGwgYmUgYWR2YW5jZWQgYnkgdGhlIGVuZHBvaW50LgotICogRm9yIGFuIGlucHV0IHN0cmVhbSwgdGhpcyB3aWxsIGJlIGFkdmFuY2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiBjYWxsaW5nIHJlYWQoKS4KKyAqIEZvciBhbiBpbnB1dCBzdHJlYW0sIHRoaXMgd2lsbCBiZSBhZHZhbmNlZCBieSB0aGUgYXBwbGljYXRpb24gY2FsbGluZyByZWFkKCkKKyAqIG9yIGJ5IGEgZGF0YSBjYWxsYmFjay4KICAqCiAgKiBUaGUgZnJhbWUgcG9zaXRpb24gaXMgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nLgogICoKQEAgLTc5NCw2ICsxMTkyLDMwIEBACiBBQVVESU9fQVBJIGludDY0X3QgQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pOwogCiAvKioKKyAqIFBhc3NlcyBiYWNrIHRoZSBzZXNzaW9uIElEIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN0cmVhbS4KKyAqCisgKiBUaGUgc2Vzc2lvbiBJRCBjYW4gYmUgdXNlZCB0byBhc3NvY2lhdGUgYSBzdHJlYW0gd2l0aCBlZmZlY3RzIHByb2Nlc3NvcnMuCisgKiBUaGUgZWZmZWN0cyBhcmUgY29udHJvbGxlZCB1c2luZyB0aGUgQW5kcm9pZCBBdWRpb0VmZmVjdCBKYXZhIEFQSS4KKyAqCisgKiBJZiBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNlc3Npb25JZCgpIHdhcyBjYWxsZWQgd2l0aCBBQVVESU9fU0VTU0lPTl9JRF9BTExPQ0FURQorICogdGhlbiBhIG5ldyBzZXNzaW9uIElEIHNob3VsZCBiZSBhbGxvY2F0ZWQgb25jZSB3aGVuIHRoZSBzdHJlYW0gaXMgb3BlbmVkLgorICoKKyAqIElmIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2Vzc2lvbklkKCkgd2FzIGNhbGxlZCB3aXRoIGEgcHJldmlvdXNseSBhbGxvY2F0ZWQKKyAqIHNlc3Npb24gSUQgdGhlbiB0aGF0IHZhbHVlIHNob3VsZCBiZSByZXR1cm5lZC4KKyAqCisgKiBJZiBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNlc3Npb25JZCgpIHdhcyBub3QgY2FsbGVkIHRoZW4gdGhpcyBmdW5jdGlvbiBzaG91bGQKKyAqIHJldHVybiBBQVVESU9fU0VTU0lPTl9JRF9OT05FLgorICoKKyAqIFRoZSBzZXNzaW9uSUQgZm9yIGEgc3RyZWFtIHNob3VsZCBub3QgY2hhbmdlIG9uY2UgdGhlIHN0cmVhbSBoYXMgYmVlbiBvcGVuZWQuCisgKgorICogQWRkZWQgaW4gQVBJIGxldmVsIDI4LgorICoKKyAqIEBwYXJhbSBzdHJlYW0gcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpCisgKiBAcmV0dXJuIHNlc3Npb24gSUQgb3IgQUFVRElPX1NFU1NJT05fSURfTk9ORQorICovCitBQVVESU9fQVBJIGFhdWRpb19zZXNzaW9uX2lkX3QgQUF1ZGlvU3RyZWFtX2dldFNlc3Npb25JZChBQXVkaW9TdHJlYW0qIHN0cmVhbSk7CisKKy8qKgogICogUGFzc2VzIGJhY2sgdGhlIHRpbWUgYXQgd2hpY2ggYSBwYXJ0aWN1bGFyIGZyYW1lIHdhcyBwcmVzZW50ZWQuCiAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIHN5bmNocm9uaXplIGF1ZGlvIHdpdGggdmlkZW8gb3IgTUlESS4KICAqIEl0IGNhbiBhbHNvIGJlIHVzZWQgdG8gYWxpZ24gYSByZWNvcmRlZCBzdHJlYW0gd2l0aCBhIHBsYXliYWNrIHN0cmVhbS4KQEAgLTgyMCw2ICsxMjQyLDM2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmZyYW1lUG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVOYW5vc2Vjb25kcyk7CiAKKy8qKgorICogUmV0dXJuIHRoZSB1c2UgY2FzZSBmb3IgdGhlIHN0cmVhbS4KKyAqCisgKiBBZGRlZCBpbiBBUEkgbGV2ZWwgMjguCisgKgorICogQHBhcmFtIHN0cmVhbSByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKCkKKyAqIEByZXR1cm4gZnJhbWVzIHJlYWQKKyAqLworQUFVRElPX0FQSSBhYXVkaW9fdXNhZ2VfdCBBQXVkaW9TdHJlYW1fZ2V0VXNhZ2UoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pOworCisvKioKKyAqIFJldHVybiB0aGUgY29udGVudCB0eXBlIGZvciB0aGUgc3RyZWFtLgorICoKKyAqIEFkZGVkIGluIEFQSSBsZXZlbCAyOC4KKyAqCisgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQorICogQHJldHVybiBjb250ZW50IHR5cGUsIGZvciBleGFtcGxlIEFBVURJT19DT05URU5UX1RZUEVfTVVTSUMKKyAqLworQUFVRElPX0FQSSBhYXVkaW9fY29udGVudF90eXBlX3QgQUF1ZGlvU3RyZWFtX2dldENvbnRlbnRUeXBlKEFBdWRpb1N0cmVhbSogc3RyZWFtKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIGlucHV0IHByZXNldCBmb3IgdGhlIHN0cmVhbS4KKyAqCisgKiBBZGRlZCBpbiBBUEkgbGV2ZWwgMjguCisgKgorICogQHBhcmFtIHN0cmVhbSByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKCkKKyAqIEByZXR1cm4gaW5wdXQgcHJlc2V0LCBmb3IgZXhhbXBsZSBBQVVESU9fSU5QVVRfUFJFU0VUX0NBTUNPUkRFUgorICovCitBQVVESU9fQVBJIGFhdWRpb19pbnB1dF9wcmVzZXRfdCBBQXVkaW9TdHJlYW1fZ2V0SW5wdXRQcmVzZXQoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pOworCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2xpYmFhdWRpby5tYXAudHh0IGIvbWVkaWEvbGliYWF1ZGlvL2xpYmFhdWRpby5tYXAudHh0CmluZGV4IDJiYTUyNTAuLmNiZjU5MjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9saWJhYXVkaW8ubWFwLnR4dAorKysgYi9tZWRpYS9saWJhYXVkaW8vbGliYWF1ZGlvLm1hcC50eHQKQEAgLTE3LDYgKzE3LDEwIEBACiAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTaGFyaW5nTW9kZTsKICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldERpcmVjdGlvbjsKICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEJ1ZmZlckNhcGFjaXR5SW5GcmFtZXM7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRVc2FnZTsgICAgICAgIyBpbnRyb2R1Y2VkPTI4CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRDb250ZW50VHlwZTsgIyBpbnRyb2R1Y2VkPTI4CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRJbnB1dFByZXNldDsgIyBpbnRyb2R1Y2VkPTI4CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTZXNzaW9uSWQ7ICAgIyBpbnRyb2R1Y2VkPTI4CiAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtOwogICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfZGVsZXRlOwogICAgIEFBdWRpb1N0cmVhbV9jbG9zZTsKQEAgLTQyLDggKzQ2LDEyIEBACiAgICAgQUF1ZGlvU3RyZWFtX2dldEZvcm1hdDsKICAgICBBQXVkaW9TdHJlYW1fZ2V0U2hhcmluZ01vZGU7CiAgICAgQUF1ZGlvU3RyZWFtX2dldERpcmVjdGlvbjsKKyAgICBBQXVkaW9TdHJlYW1fZ2V0VXNhZ2U7ICAgICAgICMgaW50cm9kdWNlZD0yOAorICAgIEFBdWRpb1N0cmVhbV9nZXRDb250ZW50VHlwZTsgIyBpbnRyb2R1Y2VkPTI4CisgICAgQUF1ZGlvU3RyZWFtX2dldElucHV0UHJlc2V0OyAjIGludHJvZHVjZWQ9MjgKICAgICBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzV3JpdHRlbjsKICAgICBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUmVhZDsKKyAgICBBQXVkaW9TdHJlYW1fZ2V0U2Vzc2lvbklkOyAgICMgaW50cm9kdWNlZD0yOAogICAgIEFBdWRpb1N0cmVhbV9nZXRUaW1lc3RhbXA7CiAgICAgQUF1ZGlvU3RyZWFtX2lzTU1hcFVzZWQ7CiAgIGxvY2FsOgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZTI4YTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw2NyBAQAorY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYmFhdWRpbyIsCisKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImJpbmRpbmciLAorICAgICAgICAiY2xpZW50IiwKKyAgICAgICAgImNvcmUiLAorICAgICAgICAiZmlmbyIsCisgICAgICAgICJsZWdhY3kiLAorICAgICAgICAidXRpbGl0eSIsCisgICAgXSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4iXSwKKyAgICBoZWFkZXJfbGliczogWyJsaWJhYXVkaW9faGVhZGVycyJdLAorICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsibGliYWF1ZGlvX2hlYWRlcnMiXSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgImNvcmUvQXVkaW9TdHJlYW0uY3BwIiwKKyAgICAgICAgImNvcmUvQXVkaW9TdHJlYW1CdWlsZGVyLmNwcCIsCisgICAgICAgICJjb3JlL0FBdWRpb0F1ZGlvLmNwcCIsCisgICAgICAgICJjb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuY3BwIiwKKyAgICAgICAgImxlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5jcHAiLAorICAgICAgICAibGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmNwcCIsCisgICAgICAgICJsZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5jcHAiLAorICAgICAgICAidXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuY3BwIiwKKyAgICAgICAgInV0aWxpdHkvRml4ZWRCbG9ja0FkYXB0ZXIuY3BwIiwKKyAgICAgICAgInV0aWxpdHkvRml4ZWRCbG9ja1JlYWRlci5jcHAiLAorICAgICAgICAidXRpbGl0eS9GaXhlZEJsb2NrV3JpdGVyLmNwcCIsCisgICAgICAgICJ1dGlsaXR5L0xpbmVhclJhbXAuY3BwIiwKKyAgICAgICAgImZpZm8vRmlmb0J1ZmZlci5jcHAiLAorICAgICAgICAiZmlmby9GaWZvQ29udHJvbGxlckJhc2UuY3BwIiwKKyAgICAgICAgImNsaWVudC9BdWRpb0VuZHBvaW50LmNwcCIsCisgICAgICAgICJjbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5jcHAiLAorICAgICAgICAiY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmNwcCIsCisgICAgICAgICJjbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuY3BwIiwKKyAgICAgICAgImNsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuY3BwIiwKKyAgICAgICAgImJpbmRpbmcvQXVkaW9FbmRwb2ludFBhcmNlbGFibGUuY3BwIiwKKyAgICAgICAgImJpbmRpbmcvQUF1ZGlvQmluZGVyQ2xpZW50LmNwcCIsCisgICAgICAgICJiaW5kaW5nL0FBdWRpb1N0cmVhbVJlcXVlc3QuY3BwIiwKKyAgICAgICAgImJpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5jcHAiLAorICAgICAgICAiYmluZGluZy9JQUF1ZGlvQ2xpZW50LmNwcCIsCisgICAgICAgICJiaW5kaW5nL0lBQXVkaW9TZXJ2aWNlLmNwcCIsCisgICAgICAgICJiaW5kaW5nL1JpbmdCdWZmZXJQYXJjZWxhYmxlLmNwcCIsCisgICAgICAgICJiaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuY3BwIiwKKyAgICAgICAgImJpbmRpbmcvU2hhcmVkUmVnaW9uUGFyY2VsYWJsZS5jcHAiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1Xbm8tdW51c2VkLXBhcmFtZXRlciIsCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKworICAgICAgICAvLyBCeSBkZWZhdWx0LCBhbGwgc3ltYm9scyBhcmUgaGlkZGVuLgorICAgICAgICAvLyAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCisgICAgICAgIC8vIEFBVURJT19BUEkgaXMgdXNlZCB0byBleHBsaWNpdGx5IGV4cG9ydCBhIGZ1bmN0aW9uIG9yIGEgdmFyaWFibGUgYXMgYSB2aXNpYmxlIHN5bWJvbC4KKyAgICAgICAgIi1EQUFVRElPX0FQST1fX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KFwiZGVmYXVsdFwiKSkpIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50IiwKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliYXVkaW9tYW5hZ2VyIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODYxMjQ4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PSBTVEFUSUMgTElCUkFSWSA9PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUaGlzIGlzIGJlaW5nIGJ1aWx0IGJlY2F1c2UgaXQgbWFrZSBBQXVkaW8gdGVzdGluZyB2ZXJ5IGVhc3kgd2l0aCBhIGNvbXBsZXRlIGV4ZWN1dGFibGUuCi0jIFRPRE8gUmVtb3ZlIHRoaXMgdGFyZ2V0IGxhdGVyLCB3aGVuIG5vdCBuZWVkZWQuCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IGxpYmFhdWRpbwotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTElCQUFVRElPX0RJUiA6PSAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8KLUxJQkFBVURJT19TUkNfRElSIDo9ICQoTElCQUFVRElPX0RJUikvc3JjCi0KLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAotICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUgXAotICAgIHN5c3RlbS9jb3JlL2Jhc2UvaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9uYXRpdmUvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUvaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlIFwKLSAgICAkKExPQ0FMX1BBVEgpIFwKLSAgICAkKExPQ0FMX1BBVEgpL2JpbmRpbmcgXAotICAgICQoTE9DQUxfUEFUSCkvY2xpZW50IFwKLSAgICAkKExPQ0FMX1BBVEgpL2NvcmUgXAotICAgICQoTE9DQUxfUEFUSCkvZmlmbyBcCi0gICAgJChMT0NBTF9QQVRIKS9sZWdhY3kgXAotICAgICQoTE9DQUxfUEFUSCkvdXRpbGl0eQotCi0jIElmIHlvdSBhZGQgYSBmaWxlIGhlcmUgdGhlbiBhbHNvIGFkZCBpdCBiZWxvdyBpbiB0aGUgU0hBUkVEIHRhcmdldAotTE9DQUxfU1JDX0ZJTEVTID0gXAotICAgIGNvcmUvQXVkaW9TdHJlYW0uY3BwIFwKLSAgICBjb3JlL0F1ZGlvU3RyZWFtQnVpbGRlci5jcHAgXAotICAgIGNvcmUvQUF1ZGlvQXVkaW8uY3BwIFwKLSAgICBjb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuY3BwIFwKLSAgICBsZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuY3BwIFwKLSAgICBsZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuY3BwIFwKLSAgICBsZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5jcHAgXAotICAgIHV0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmNwcCBcCi0gICAgdXRpbGl0eS9GaXhlZEJsb2NrQWRhcHRlci5jcHAgXAotICAgIHV0aWxpdHkvRml4ZWRCbG9ja1JlYWRlci5jcHAgXAotICAgIHV0aWxpdHkvRml4ZWRCbG9ja1dyaXRlci5jcHAgXAotICAgIHV0aWxpdHkvTGluZWFyUmFtcC5jcHAgXAotICAgIGZpZm8vRmlmb0J1ZmZlci5jcHAgXAotICAgIGZpZm8vRmlmb0NvbnRyb2xsZXJCYXNlLmNwcCBcCi0gICAgY2xpZW50L0F1ZGlvRW5kcG9pbnQuY3BwIFwKLSAgICBjbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5jcHAgXAotICAgIGNsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5jcHAgXAotICAgIGNsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5jcHAgXAotICAgIGNsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuY3BwIFwKLSAgICBiaW5kaW5nL0F1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlLmNwcCBcCi0gICAgYmluZGluZy9BQXVkaW9CaW5kZXJDbGllbnQuY3BwIFwKLSAgICBiaW5kaW5nL0FBdWRpb1N0cmVhbVJlcXVlc3QuY3BwIFwKLSAgICBiaW5kaW5nL0FBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24uY3BwIFwKLSAgICBiaW5kaW5nL0lBQXVkaW9DbGllbnQuY3BwIFwKLSAgICBiaW5kaW5nL0lBQXVkaW9TZXJ2aWNlLmNwcCBcCi0gICAgYmluZGluZy9SaW5nQnVmZmVyUGFyY2VsYWJsZS5jcHAgXAotICAgIGJpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5jcHAgXAotICAgIGJpbmRpbmcvU2hhcmVkUmVnaW9uUGFyY2VsYWJsZS5jcHAKLQotTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tdW51c2VkLXBhcmFtZXRlciAtV2FsbCAtV2Vycm9yCi0KLSMgQnkgZGVmYXVsdCwgYWxsIHN5bWJvbHMgYXJlIGhpZGRlbi4KLSMgTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4KLSMgQUFVRElPX0FQSSBpcyB1c2VkIHRvIGV4cGxpY2l0bHkgZXhwb3J0IGEgZnVuY3Rpb24gb3IgYSB2YXJpYWJsZSBhcyBhIHZpc2libGUgc3ltYm9sLgotTE9DQUxfQ0ZMQUdTICs9IC1EQUFVRElPX0FQST0nX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSknCi0KLWluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PSBTSEFSRUQgTElCUkFSWSA9PT09PT09PT09PT09PT09PT09PT09PT09PQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRSA6PSBsaWJhYXVkaW8KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAotICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUgXAotICAgIHN5c3RlbS9jb3JlL2Jhc2UvaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9uYXRpdmUvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUvaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZSBcCi0gICAgJChMT0NBTF9QQVRIKSBcCi0gICAgJChMT0NBTF9QQVRIKS9iaW5kaW5nIFwKLSAgICAkKExPQ0FMX1BBVEgpL2NsaWVudCBcCi0gICAgJChMT0NBTF9QQVRIKS9jb3JlIFwKLSAgICAkKExPQ0FMX1BBVEgpL2ZpZm8gXAotICAgICQoTE9DQUxfUEFUSCkvbGVnYWN5IFwKLSAgICAkKExPQ0FMX1BBVEgpL3V0aWxpdHkKLQotTE9DQUxfU1JDX0ZJTEVTID0gY29yZS9BdWRpb1N0cmVhbS5jcHAgXAotICAgIGNvcmUvQXVkaW9TdHJlYW1CdWlsZGVyLmNwcCBcCi0gICAgY29yZS9BQXVkaW9BdWRpby5jcHAgXAotICAgIGNvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5jcHAgXAotICAgIGxlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5jcHAgXAotICAgIGxlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5jcHAgXAotICAgIGxlZ2FjeS9BdWRpb1N0cmVhbVRyYWNrLmNwcCBcCi0gICAgdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuY3BwIFwKLSAgICB1dGlsaXR5L0ZpeGVkQmxvY2tBZGFwdGVyLmNwcCBcCi0gICAgdXRpbGl0eS9GaXhlZEJsb2NrUmVhZGVyLmNwcCBcCi0gICAgdXRpbGl0eS9GaXhlZEJsb2NrV3JpdGVyLmNwcCBcCi0gICAgdXRpbGl0eS9MaW5lYXJSYW1wLmNwcCBcCi0gICAgZmlmby9GaWZvQnVmZmVyLmNwcCBcCi0gICAgZmlmby9GaWZvQ29udHJvbGxlckJhc2UuY3BwIFwKLSAgICBjbGllbnQvQXVkaW9FbmRwb2ludC5jcHAgXAotICAgIGNsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmNwcCBcCi0gICAgY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmNwcCBcCi0gICAgY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmNwcCBcCi0gICAgY2xpZW50L0lzb2Nocm9ub3VzQ2xvY2tNb2RlbC5jcHAgXAotICAgIGJpbmRpbmcvQXVkaW9FbmRwb2ludFBhcmNlbGFibGUuY3BwIFwKLSAgICBiaW5kaW5nL0FBdWRpb0JpbmRlckNsaWVudC5jcHAgXAotICAgIGJpbmRpbmcvQUF1ZGlvU3RyZWFtUmVxdWVzdC5jcHAgXAotICAgIGJpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5jcHAgXAotICAgIGJpbmRpbmcvSUFBdWRpb0NsaWVudC5jcHAgXAotICAgIGJpbmRpbmcvSUFBdWRpb1NlcnZpY2UuY3BwIFwKLSAgICBiaW5kaW5nL1JpbmdCdWZmZXJQYXJjZWxhYmxlLmNwcCBcCi0gICAgYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmNwcCBcCi0gICAgYmluZGluZy9TaGFyZWRSZWdpb25QYXJjZWxhYmxlLmNwcAotCi1MT0NBTF9DRkxBR1MgKz0gLVduby11bnVzZWQtcGFyYW1ldGVyIC1XYWxsIC1XZXJyb3IKLQotIyBCeSBkZWZhdWx0LCBhbGwgc3ltYm9scyBhcmUgaGlkZGVuLgotIyBMT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbgotIyBBQVVESU9fQVBJIGlzIHVzZWQgdG8gZXhwbGljaXRseSBleHBvcnQgYSBmdW5jdGlvbiBvciBhIHZhcmlhYmxlIGFzIGEgdmlzaWJsZSBzeW1ib2wuCi1MT0NBTF9DRkxBR1MgKz0gLURBQVVESU9fQVBJPSdfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKScKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJhdWRpb2NsaWVudCBsaWJsb2cgbGliY3V0aWxzIGxpYnV0aWxzIGxpYmJpbmRlciBsaWJhdWRpb21hbmFnZXIKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckNsaWVudC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQmluZGVyQ2xpZW50LmNwcAppbmRleCAwN2VlMmRlLi5kZDYyMGUzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQmluZGVyQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQmluZGVyQ2xpZW50LmNwcApAQCAtMTUsNyArMTUsNyBAQAogICovCiAKIAotI2RlZmluZSBMT0dfVEFHICJBQXVkaW8iCisjZGVmaW5lIExPR19UQUcgIkFBdWRpb0JpbmRlckNsaWVudCIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIApAQCAtNjEsMTEgKzYxLDExIEBACiAgICAgICAgICwgU2luZ2xldG9uPEFBdWRpb0JpbmRlckNsaWVudD4oKSB7CiAgICAgZ0tlZXBCaW5kZXJDbGllbnQgPSB0aGlzOyAvLyBzbyB0aGlzIHNpbmdsZXRvbiB3b24ndCBnZXQgZGVsZXRlZAogICAgIG1BQXVkaW9DbGllbnQgPSBuZXcgQUF1ZGlvQ2xpZW50KHRoaXMpOwotICAgIEFMT0dWKCJBQXVkaW9CaW5kZXJDbGllbnQoKSB0aGlzID0gJXAsIGNyZWF0ZWQgbUFBdWRpb0NsaWVudCA9ICVwIiwgdGhpcywgbUFBdWRpb0NsaWVudC5nZXQoKSk7CisgICAgQUxPR1YoIiVzIC0gdGhpcyA9ICVwLCBjcmVhdGVkIG1BQXVkaW9DbGllbnQgPSAlcCIsIF9fZnVuY19fLCB0aGlzLCBtQUF1ZGlvQ2xpZW50LmdldCgpKTsKIH0KIAogQUF1ZGlvQmluZGVyQ2xpZW50Ojp+QUF1ZGlvQmluZGVyQ2xpZW50KCkgewotICAgIEFMT0dWKCJBQXVkaW9CaW5kZXJDbGllbnQoKTo6fkFBdWRpb0JpbmRlckNsaWVudCgpIGRlc3Ryb3lpbmcgJXAiLCB0aGlzKTsKKyAgICBBTE9HVigiJXMgLSBkZXN0cm95aW5nICVwIiwgX19mdW5jX18sIHRoaXMpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtU2VydmljZUxvY2spOwogICAgIGlmIChtQUF1ZGlvU2VydmljZSAhPSAwKSB7CiAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKG1BQXVkaW9TZXJ2aWNlKS0+dW5saW5rVG9EZWF0aChtQUF1ZGlvQ2xpZW50KTsKQEAgLTEzNyw3ICsxMzcsNyBAQAogICAgICAgICBzdHJlYW0gPSBzZXJ2aWNlLT5vcGVuU3RyZWFtKHJlcXVlc3QsIGNvbmZpZ3VyYXRpb25PdXRwdXQpOwogCiAgICAgICAgIGlmIChzdHJlYW0gPT0gQUFVRElPX0VSUk9SX05PX1NFUlZJQ0UpIHsKLSAgICAgICAgICAgIEFMT0dFKCJBQXVkaW9CaW5kZXJDbGllbnQ6Om9wZW5TdHJlYW0gbG9zdCBjb25uZWN0aW9uIHRvIEFBdWRpb1NlcnZpY2UuIik7CisgICAgICAgICAgICBBTE9HRSgib3BlblN0cmVhbSBsb3N0IGNvbm5lY3Rpb24gdG8gQUF1ZGlvU2VydmljZS4iKTsKICAgICAgICAgICAgIGRyb3BBQXVkaW9TZXJ2aWNlKCk7IC8vIGZvcmNlIGEgcmVjb25uZWN0CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TZXJ2aWNlTWVzc2FnZS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1NlcnZpY2VNZXNzYWdlLmgKaW5kZXggNTRlODAwMS4uMzk4MTQ1NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1NlcnZpY2VNZXNzYWdlLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1NlcnZpY2VNZXNzYWdlLmgKQEAgLTM2LDE1ICszNiwxNyBAQAogICAgIEFBVURJT19TRVJWSUNFX0VWRU5UX1BBVVNFRCwKICAgICBBQVVESU9fU0VSVklDRV9FVkVOVF9TVE9QUEVELAogICAgIEFBVURJT19TRVJWSUNFX0VWRU5UX0ZMVVNIRUQsCi0gICAgQUFVRElPX1NFUlZJQ0VfRVZFTlRfQ0xPU0VELAogICAgIEFBVURJT19TRVJWSUNFX0VWRU5UX0RJU0NPTk5FQ1RFRCwKLSAgICBBQVVESU9fU0VSVklDRV9FVkVOVF9WT0xVTUUKKyAgICBBQVVESU9fU0VSVklDRV9FVkVOVF9WT0xVTUUsCisgICAgQUFVRElPX1NFUlZJQ0VfRVZFTlRfWFJVTgogfSBhYXVkaW9fc2VydmljZV9ldmVudF90OwogCiBzdHJ1Y3QgQUF1ZGlvTWVzc2FnZUV2ZW50IHsKICAgICBhYXVkaW9fc2VydmljZV9ldmVudF90IGV2ZW50OwotICAgIGRvdWJsZSAgICAgICAgICAgICAgICAgZGF0YURvdWJsZTsKLSAgICBpbnQ2NF90ICAgICAgICAgICAgICAgIGRhdGFMb25nOworICAgIHVuaW9uIHsKKyAgICAgICAgZG91YmxlICBkYXRhRG91YmxlOworICAgICAgICBpbnQ2NF90IGRhdGFMb25nOworICAgIH07CiB9OwogCiB0eXBlZGVmIHN0cnVjdCBBQXVkaW9TZXJ2aWNlTWVzc2FnZV9zIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uLmNwcAppbmRleCAxNTNmY2UzLi45NTlkYjYxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24uY3BwCkBAIC01MCw2ICs1MCwxNCBAQAogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CiAgICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKGdldEJ1ZmZlckNhcGFjaXR5KCkpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CisgICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKChpbnQzMl90KSBnZXRVc2FnZSgpKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOworICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMigoaW50MzJfdCkgZ2V0Q29udGVudFR5cGUoKSk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKKyAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIoKGludDMyX3QpIGdldElucHV0UHJlc2V0KCkpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CisgICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKGdldFNlc3Npb25JZCgpKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwogICAgIHJldHVybiBOT19FUlJPUjsKIGVycm9yOgogICAgIEFMT0dFKCJBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uLndyaXRlVG9QYXJjZWwoKTogd3JpdGUgZmFpbGVkID0gJWQiLCBzdGF0dXMpOwpAQCAtNjksMTYgKzc3LDI4IEBACiAgICAgc2V0U2FtcGxlc1BlckZyYW1lKHZhbHVlKTsKICAgICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdmFsdWUpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgc2V0U2hhcmluZ01vZGUodmFsdWUpOworICAgIHNldFNoYXJpbmdNb2RlKChhYXVkaW9fc2hhcmluZ19tb2RlX3QpIHZhbHVlKTsKICAgICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdmFsdWUpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgc2V0Rm9ybWF0KHZhbHVlKTsKKyAgICBzZXRGb3JtYXQoKGFhdWRpb19mb3JtYXRfdCkgdmFsdWUpOwogICAgIHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZ2YWx1ZSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKICAgICBzZXREaXJlY3Rpb24oKGFhdWRpb19kaXJlY3Rpb25fdCkgdmFsdWUpOwogICAgIHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZ2YWx1ZSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKICAgICBzZXRCdWZmZXJDYXBhY2l0eSh2YWx1ZSk7CisgICAgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJnZhbHVlKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOworICAgIHNldFVzYWdlKChhYXVkaW9fdXNhZ2VfdCkgdmFsdWUpOworICAgIHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZ2YWx1ZSk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKKyAgICBzZXRDb250ZW50VHlwZSgoYWF1ZGlvX2NvbnRlbnRfdHlwZV90KSB2YWx1ZSk7CisgICAgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJnZhbHVlKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOworICAgIHNldElucHV0UHJlc2V0KChhYXVkaW9faW5wdXRfcHJlc2V0X3QpIHZhbHVlKTsKKyAgICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdmFsdWUpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CisgICAgc2V0U2Vzc2lvbklkKHZhbHVlKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiBlcnJvcjoKICAgICBBTE9HRSgiQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5yZWFkRnJvbVBhcmNlbCgpOiByZWFkIGZhaWxlZCA9ICVkIiwgc3RhdHVzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1SZXF1ZXN0LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1SZXF1ZXN0LmNwcAppbmRleCAxMjAwYWIyLi5jMzBjNWI5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtUmVxdWVzdC5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1N0cmVhbVJlcXVlc3QuY3BwCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jZGVmaW5lIExPR19UQUcgIkFBdWRpbyIKKyNkZWZpbmUgTE9HX1RBRyAiQUF1ZGlvU3RyZWFtUmVxdWVzdCIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIApAQCAtNTgsNyArNTgsNyBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIAogZXJyb3I6Ci0gICAgQUxPR0UoIkFBdWRpb1N0cmVhbVJlcXVlc3Qud3JpdGVUb1BhcmNlbCgpOiB3cml0ZSBmYWlsZWQgPSAlZCIsIHN0YXR1cyk7CisgICAgQUxPR0UoIndyaXRlVG9QYXJjZWwoKTogd3JpdGUgZmFpbGVkID0gJWQiLCBzdGF0dXMpOwogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTgwLDcgKzgwLDcgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiAKIGVycm9yOgotICAgIEFMT0dFKCJBQXVkaW9TdHJlYW1SZXF1ZXN0LnJlYWRGcm9tUGFyY2VsKCk6IHJlYWQgZmFpbGVkID0gJWQiLCBzdGF0dXMpOworICAgIEFMT0dFKCJyZWFkRnJvbVBhcmNlbCgpOiByZWFkIGZhaWxlZCA9ICVkIiwgc3RhdHVzKTsKICAgICByZXR1cm4gc3RhdHVzOwogfQogCkBAIC04OSw5ICs4OSw5IEBACiB9CiAKIHZvaWQgQUF1ZGlvU3RyZWFtUmVxdWVzdDo6ZHVtcCgpIGNvbnN0IHsKLSAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtUmVxdWVzdCBtVXNlcklkICAgID0gJWQiLCBtVXNlcklkKTsKLSAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtUmVxdWVzdCBtUHJvY2Vzc0lkID0gJWQiLCBtUHJvY2Vzc0lkKTsKLSAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtUmVxdWVzdCBtU2hhcmluZ01vZGVNYXRjaFJlcXVpcmVkID0gJWQiLCBtU2hhcmluZ01vZGVNYXRjaFJlcXVpcmVkKTsKLSAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtUmVxdWVzdCBtSW5TZXJ2aWNlID0gJWQiLCBtSW5TZXJ2aWNlKTsKKyAgICBBTE9HRCgibVVzZXJJZCAgICA9ICVkIiwgbVVzZXJJZCk7CisgICAgQUxPR0QoIm1Qcm9jZXNzSWQgPSAlZCIsIG1Qcm9jZXNzSWQpOworICAgIEFMT0dEKCJtU2hhcmluZ01vZGVNYXRjaFJlcXVpcmVkID0gJWQiLCBtU2hhcmluZ01vZGVNYXRjaFJlcXVpcmVkKTsKKyAgICBBTE9HRCgibUluU2VydmljZSA9ICVkIiwgbUluU2VydmljZSk7CiAgICAgbUNvbmZpZ3VyYXRpb24uZHVtcCgpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0F1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BdWRpb0VuZHBvaW50UGFyY2VsYWJsZS5jcHAKaW5kZXggMWE5NzU1NS4uNjFkN2QyNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0F1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQXVkaW9FbmRwb2ludFBhcmNlbGFibGUuY3BwCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jZGVmaW5lIExPR19UQUcgIkFBdWRpbyIKKyNkZWZpbmUgTE9HX1RBRyAiQXVkaW9FbmRwb2ludFBhcmNlbGFibGUiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKQEAgLTY0LDI3ICs2NCw1NCBAQAogICogVGhlIHJlYWQgYW5kIHdyaXRlIG11c3QgYmUgc3ltbWV0cmljLgogICovCiBzdGF0dXNfdCBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZTo6d3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3QgewotICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtTnVtU2hhcmVkTWVtb3JpZXMpOworICAgIHN0YXR1c190IHN0YXR1cyA9IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU3RhdHVzKHZhbGlkYXRlKCkpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CisKKyAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIobU51bVNoYXJlZE1lbW9yaWVzKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOworCiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTnVtU2hhcmVkTWVtb3JpZXM7IGkrKykgewotICAgICAgICBtU2hhcmVkTWVtb3JpZXNbaV0ud3JpdGVUb1BhcmNlbChwYXJjZWwpOworICAgICAgICBzdGF0dXMgPSBtU2hhcmVkTWVtb3JpZXNbaV0ud3JpdGVUb1BhcmNlbChwYXJjZWwpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwogICAgIH0KLSAgICBtVXBNZXNzYWdlUXVldWVQYXJjZWxhYmxlLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKLSAgICBtRG93bk1lc3NhZ2VRdWV1ZVBhcmNlbGFibGUud3JpdGVUb1BhcmNlbChwYXJjZWwpOwotICAgIG1VcERhdGFRdWV1ZVBhcmNlbGFibGUud3JpdGVUb1BhcmNlbChwYXJjZWwpOwotICAgIG1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZS53cml0ZVRvUGFyY2VsKHBhcmNlbCk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOyAvLyBUT0RPIGNoZWNrIGZvciBlcnJvcnMgYWJvdmUKKyAgICBzdGF0dXMgPSBtVXBNZXNzYWdlUXVldWVQYXJjZWxhYmxlLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOworICAgIHN0YXR1cyA9IG1Eb3duTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZS53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKKyAgICBzdGF0dXMgPSBtVXBEYXRhUXVldWVQYXJjZWxhYmxlLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOworICAgIHN0YXR1cyA9IG1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZS53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKKworICAgIHJldHVybiBOT19FUlJPUjsKKworZXJyb3I6CisgICAgQUxPR0UoIiVzIHJldHVybmluZyAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOworICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHN0YXR1c190IEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlOjpyZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgewotICAgIHBhcmNlbC0+cmVhZEludDMyKCZtTnVtU2hhcmVkTWVtb3JpZXMpOworICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZtTnVtU2hhcmVkTWVtb3JpZXMpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CisKICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OdW1TaGFyZWRNZW1vcmllczsgaSsrKSB7CiAgICAgICAgIG1TaGFyZWRNZW1vcmllc1tpXS5yZWFkRnJvbVBhcmNlbChwYXJjZWwpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwogICAgIH0KLSAgICBtVXBNZXNzYWdlUXVldWVQYXJjZWxhYmxlLnJlYWRGcm9tUGFyY2VsKHBhcmNlbCk7Ci0gICAgbURvd25NZXNzYWdlUXVldWVQYXJjZWxhYmxlLnJlYWRGcm9tUGFyY2VsKHBhcmNlbCk7Ci0gICAgbVVwRGF0YVF1ZXVlUGFyY2VsYWJsZS5yZWFkRnJvbVBhcmNlbChwYXJjZWwpOwotICAgIG1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZS5yZWFkRnJvbVBhcmNlbChwYXJjZWwpOwotICAgIHJldHVybiBOT19FUlJPUjsgLy8gVE9ETyBjaGVjayBmb3IgZXJyb3JzIGFib3ZlCisgICAgc3RhdHVzID0gbVVwTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZS5yZWFkRnJvbVBhcmNlbChwYXJjZWwpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CisgICAgc3RhdHVzID0gbURvd25NZXNzYWdlUXVldWVQYXJjZWxhYmxlLnJlYWRGcm9tUGFyY2VsKHBhcmNlbCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKKyAgICBzdGF0dXMgPSBtVXBEYXRhUXVldWVQYXJjZWxhYmxlLnJlYWRGcm9tUGFyY2VsKHBhcmNlbCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKKyAgICBzdGF0dXMgPSBtRG93bkRhdGFRdWV1ZVBhcmNlbGFibGUucmVhZEZyb21QYXJjZWwocGFyY2VsKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOworCisgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU3RhdHVzKHZhbGlkYXRlKCkpOworCitlcnJvcjoKKyAgICBBTE9HRSgiJXMgcmV0dXJuaW5nICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlOjpyZXNvbHZlKEVuZHBvaW50RGVzY3JpcHRvciAqZGVzY3JpcHRvcikgewpAQCAtMTA5LDUyICsxMzYsMjggQEAKICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoZXJyKTsKIH0KIAotYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlOjp2YWxpZGF0ZSgpIHsKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0OworYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlOjp2YWxpZGF0ZSgpIGNvbnN0IHsKICAgICBpZiAobU51bVNoYXJlZE1lbW9yaWVzIDwgMCB8fCBtTnVtU2hhcmVkTWVtb3JpZXMgPj0gTUFYX1NIQVJFRF9NRU1PUklFUykgewotICAgICAgICBBTE9HRSgiQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgaW52YWxpZCBtTnVtU2hhcmVkTWVtb3JpZXMgPSAlZCIsIG1OdW1TaGFyZWRNZW1vcmllcyk7CisgICAgICAgIEFMT0dFKCJpbnZhbGlkIG1OdW1TaGFyZWRNZW1vcmllcyA9ICVkIiwgbU51bVNoYXJlZE1lbW9yaWVzKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlRFUk5BTDsKICAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTnVtU2hhcmVkTWVtb3JpZXM7IGkrKykgewotICAgICAgICByZXN1bHQgPSBtU2hhcmVkTWVtb3JpZXNbaV0udmFsaWRhdGUoKTsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSBpbnZhbGlkIG1TaGFyZWRNZW1vcmllc1slZF0gPSAlZCIsIGksIHJlc3VsdCk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICgocmVzdWx0ID0gbVVwTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZS52YWxpZGF0ZSgpKSAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgQUxPR0UoIkF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlIGludmFsaWQgbVVwTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZSA9ICVkIiwgcmVzdWx0KTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgaWYgKChyZXN1bHQgPSBtRG93bk1lc3NhZ2VRdWV1ZVBhcmNlbGFibGUudmFsaWRhdGUoKSkgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgIEFMT0dFKCJBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSBpbnZhbGlkIG1Eb3duTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZSA9ICVkIiwgcmVzdWx0KTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgaWYgKChyZXN1bHQgPSBtVXBEYXRhUXVldWVQYXJjZWxhYmxlLnZhbGlkYXRlKCkpICE9IEFBVURJT19PSykgewotICAgICAgICBBTE9HRSgiQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgaW52YWxpZCBtVXBEYXRhUXVldWVQYXJjZWxhYmxlID0gJWQiLCByZXN1bHQpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBpZiAoKHJlc3VsdCA9IG1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZS52YWxpZGF0ZSgpKSAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgQUxPR0UoIkF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlIGludmFsaWQgbURvd25EYXRhUXVldWVQYXJjZWxhYmxlID0gJWQiLCByZXN1bHQpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KICAgICByZXR1cm4gQUFVRElPX09LOwogfQogCiB2b2lkIEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlOjpkdW1wKCkgewotICAgIEFMT0dEKCJBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQkVHSU4iKTsKLSAgICBBTE9HRCgiQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgbU51bVNoYXJlZE1lbW9yaWVzID0gJWQiLCBtTnVtU2hhcmVkTWVtb3JpZXMpOworICAgIEFMT0dEKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQkVHSU4iKTsKKyAgICBBTE9HRCgibU51bVNoYXJlZE1lbW9yaWVzID0gJWQiLCBtTnVtU2hhcmVkTWVtb3JpZXMpOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU51bVNoYXJlZE1lbW9yaWVzOyBpKyspIHsKICAgICAgICAgbVNoYXJlZE1lbW9yaWVzW2ldLmR1bXAoKTsKICAgICB9Ci0gICAgQUxPR0QoIkF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlIG1VcE1lc3NhZ2VRdWV1ZVBhcmNlbGFibGUgPT09PT09PT09Iik7CisgICAgQUxPR0QoIm1VcE1lc3NhZ2VRdWV1ZVBhcmNlbGFibGUgPT09PT09PT09Iik7CiAgICAgbVVwTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZS5kdW1wKCk7Ci0gICAgQUxPR0QoIkF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlIG1Eb3duTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZSA9PT09PT09Iik7CisgICAgQUxPR0QoIm1Eb3duTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZSA9PT09PT09Iik7CiAgICAgbURvd25NZXNzYWdlUXVldWVQYXJjZWxhYmxlLmR1bXAoKTsKLSAgICBBTE9HRCgiQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgbVVwRGF0YVF1ZXVlUGFyY2VsYWJsZSA9PT09PT09PT09PT0iKTsKKyAgICBBTE9HRCgibVVwRGF0YVF1ZXVlUGFyY2VsYWJsZSA9PT09PT09PT09PT0iKTsKICAgICBtVXBEYXRhUXVldWVQYXJjZWxhYmxlLmR1bXAoKTsKLSAgICBBTE9HRCgiQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgbURvd25EYXRhUXVldWVQYXJjZWxhYmxlID09PT09PT09PT0iKTsKKyAgICBBTE9HRCgibURvd25EYXRhUXVldWVQYXJjZWxhYmxlID09PT09PT09PT0iKTsKICAgICBtRG93bkRhdGFRdWV1ZVBhcmNlbGFibGUuZHVtcCgpOwotICAgIEFMT0dEKCJBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRU5EIik7CisgICAgQUxPR0QoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFTkQiKTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0F1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQXVkaW9FbmRwb2ludFBhcmNlbGFibGUuaAppbmRleCBhYTg1NzNmLi5lNGY4YjllIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQXVkaW9FbmRwb2ludFBhcmNlbGFibGUuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQXVkaW9FbmRwb2ludFBhcmNlbGFibGUuaApAQCAtNTYsOCArNTYsNiBAQAogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc29sdmUoRW5kcG9pbnREZXNjcmlwdG9yICpkZXNjcmlwdG9yKTsKIAotICAgIGFhdWRpb19yZXN1bHRfdCB2YWxpZGF0ZSgpOwotCiAgICAgYWF1ZGlvX3Jlc3VsdF90IGNsb3NlKCk7CiAKICAgICB2b2lkIGR1bXAoKTsKQEAgLTcwLDYgKzY4LDggQEAKICAgICBSaW5nQnVmZmVyUGFyY2VsYWJsZSAgICBtRG93bkRhdGFRdWV1ZVBhcmNlbGFibGU7ICAgIC8vIGVnLiBwbGF5YmFjawogCiBwcml2YXRlOgorICAgIGFhdWRpb19yZXN1bHRfdCAgICAgICAgIHZhbGlkYXRlKCkgY29uc3Q7CisKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBtTnVtU2hhcmVkTWVtb3JpZXMgPSAwOwogICAgIFNoYXJlZE1lbW9yeVBhcmNlbGFibGUgIG1TaGFyZWRNZW1vcmllc1tNQVhfU0hBUkVEX01FTU9SSUVTXTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvSUFBdWRpb1NlcnZpY2UuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0lBQXVkaW9TZXJ2aWNlLmNwcAppbmRleCBiM2M0OTM0Li42MjBlZGM3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvSUFBdWRpb1NlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9JQUF1ZGlvU2VydmljZS5jcHAKQEAgLTEyMSwxNyArMTIxLDExIEBACiAgICAgICAgICAgICBBTE9HRSgiQnBBQXVkaW9TZXJ2aWNlOjpjbGllbnQgR0VUX1NUUkVBTV9ERVNDUklQVElPTiBwYXNzZWQgcmVzdWx0ICVkIiwgcmVzdWx0KTsKICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgIH0KLSAgICAgICAgZXJyID0gcGFyY2VsYWJsZS5yZWFkRnJvbVBhcmNlbCgmcmVwbHkpOzsKKyAgICAgICAgZXJyID0gcGFyY2VsYWJsZS5yZWFkRnJvbVBhcmNlbCgmcmVwbHkpOwogICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBBTE9HRSgiQnBBQXVkaW9TZXJ2aWNlOjpjbGllbnQgdHJhbnNhY3QoR0VUX1NUUkVBTV9ERVNDUklQVElPTikgcmVhZCBlbmRwb2ludCAlZCIsIGVycik7CiAgICAgICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoZXJyKTsKICAgICAgICAgfQotICAgICAgICAvL3BhcmNlbGFibGUuZHVtcCgpOwotICAgICAgICByZXN1bHQgPSBwYXJjZWxhYmxlLnZhbGlkYXRlKCk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQnBBQXVkaW9TZXJ2aWNlOjpjbGllbnQgR0VUX1NUUkVBTV9ERVNDUklQVElPTiB2YWxpZGF0aW9uIGZhaWxzICVkIiwgcmVzdWx0KTsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKQEAgLTI1MCw2ICsyNDQsNyBAQAogICAgIHBpZF90IHRpZDsKICAgICBpbnQ2NF90IG5hbm9zZWNvbmRzOwogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQ7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CiAgICAgQUxPR1YoIkJuQUF1ZGlvU2VydmljZTo6b25UcmFuc2FjdCglaSkgJWkiLCBjb2RlLCBmbGFncyk7CiAKICAgICBzd2l0Y2goY29kZSkgewpAQCAtMjk0LDIxICsyODksMjAgQEAKIAogICAgICAgICBjYXNlIEdFVF9TVFJFQU1fREVTQ1JJUFRJT046IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQUF1ZGlvU2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgZGF0YS5yZWFkSW50MzIoJnN0cmVhbUhhbmRsZSk7CisgICAgICAgICAgICBzdGF0dXMgPSBkYXRhLnJlYWRJbnQzMigmc3RyZWFtSGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQogICAgICAgICAgICAgYWF1ZGlvOjpBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSBwYXJjZWxhYmxlOwogICAgICAgICAgICAgcmVzdWx0ID0gZ2V0U3RyZWFtRGVzY3JpcHRpb24oc3RyZWFtSGFuZGxlLCBwYXJjZWxhYmxlKTsKICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU3RhdHVzKHJlc3VsdCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXN1bHQgPSBwYXJjZWxhYmxlLnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICAgICAgICAgIEFMT0dFKCJCbkFBdWRpb1NlcnZpY2U6Om9uVHJhbnNhY3QgZ2V0U3RyZWFtRGVzY3JpcHRpb24oKSByZXR1cm5zICVkIiwgcmVzdWx0KTsKLSAgICAgICAgICAgICAgICBwYXJjZWxhYmxlLmR1bXAoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTdGF0dXMocmVzdWx0KTsKKyAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LT53cml0ZUludDMyKHJlc3VsdCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlc3VsdCk7Ci0gICAgICAgICAgICBwYXJjZWxhYmxlLndyaXRlVG9QYXJjZWwocmVwbHkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgcmV0dXJuIHBhcmNlbGFibGUud3JpdGVUb1BhcmNlbChyZXBseSk7CiAgICAgICAgIH0gYnJlYWs7CiAKICAgICAgICAgY2FzZSBTVEFSVF9TVFJFQU06IHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9SaW5nQnVmZmVyUGFyY2VsYWJsZS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvUmluZ0J1ZmZlclBhcmNlbGFibGUuY3BwCmluZGV4IDZiNzRiMjEuLjQ5OTZiM2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9SaW5nQnVmZmVyUGFyY2VsYWJsZS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1JpbmdCdWZmZXJQYXJjZWxhYmxlLmNwcApAQCAtMTQsMTMgKzE0LDE0IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jZGVmaW5lIExPR19UQUcgIkFBdWRpbyIKKyNkZWZpbmUgTE9HX1RBRyAiUmluZ0J1ZmZlclBhcmNlbGFibGUiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxzdGRpbnQuaD4KIAogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+CisjaW5jbHVkZSA8dXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaD4KIAogI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvU2VydmljZURlZmluaXRpb25zLmgiCiAjaW5jbHVkZSAiYmluZGluZy9TaGFyZWRSZWdpb25QYXJjZWxhYmxlLmgiCkBAIC03OSw3ICs4MCwxMCBAQAogICogVGhlIHJlYWQgYW5kIHdyaXRlIG11c3QgYmUgc3ltbWV0cmljLgogICovCiBzdGF0dXNfdCBSaW5nQnVmZmVyUGFyY2VsYWJsZTo6d3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3QgewotICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihtQ2FwYWNpdHlJbkZyYW1lcyk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTdGF0dXModmFsaWRhdGUoKSk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKKworICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihtQ2FwYWNpdHlJbkZyYW1lcyk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKICAgICBpZiAobUNhcGFjaXR5SW5GcmFtZXMgPiAwKSB7CiAgICAgICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihtQnl0ZXNQZXJGcmFtZSk7CkBAIC05Nyw3ICsxMDEsNyBAQAogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiBlcnJvcjoKLSAgICBBTE9HRSgiUmluZ0J1ZmZlclBhcmNlbGFibGU6OndyaXRlVG9QYXJjZWwoKSBlcnJvciA9ICVkIiwgc3RhdHVzKTsKKyAgICBBTE9HRSgiJXMgcmV0dXJuaW5nICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMTE4LDkgKzEyMiw5IEBACiAgICAgICAgIHN0YXR1cyA9IG1EYXRhUGFyY2VsYWJsZS5yZWFkRnJvbVBhcmNlbChwYXJjZWwpOwogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwogICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU3RhdHVzKHZhbGlkYXRlKCkpOwogZXJyb3I6Ci0gICAgQUxPR0UoIlJpbmdCdWZmZXJQYXJjZWxhYmxlOjpyZWFkRnJvbVBhcmNlbCgpIGVycm9yID0gJWQiLCBzdGF0dXMpOworICAgIEFMT0dFKCIlcyByZXR1cm5pbmcgJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKICAgICByZXR1cm4gc3RhdHVzOwogfQogCkBAIC0xNTEsNDIgKzE1NSwyOSBAQAogICAgIHJldHVybiBBQVVESU9fT0s7CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBSaW5nQnVmZmVyUGFyY2VsYWJsZTo6dmFsaWRhdGUoKSB7Ci0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdDsKK2FhdWRpb19yZXN1bHRfdCBSaW5nQnVmZmVyUGFyY2VsYWJsZTo6dmFsaWRhdGUoKSBjb25zdCB7CiAgICAgaWYgKG1DYXBhY2l0eUluRnJhbWVzIDwgMCB8fCBtQ2FwYWNpdHlJbkZyYW1lcyA+PSAzMiAqIDEwMjQpIHsKLSAgICAgICAgQUxPR0UoIlJpbmdCdWZmZXJQYXJjZWxhYmxlIGludmFsaWQgbUNhcGFjaXR5SW5GcmFtZXMgPSAlZCIsIG1DYXBhY2l0eUluRnJhbWVzKTsKKyAgICAgICAgQUxPR0UoImludmFsaWQgbUNhcGFjaXR5SW5GcmFtZXMgPSAlZCIsIG1DYXBhY2l0eUluRnJhbWVzKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlRFUk5BTDsKICAgICB9CiAgICAgaWYgKG1CeXRlc1BlckZyYW1lIDwgMCB8fCBtQnl0ZXNQZXJGcmFtZSA+PSAyNTYpIHsKLSAgICAgICAgQUxPR0UoIlJpbmdCdWZmZXJQYXJjZWxhYmxlIGludmFsaWQgbUJ5dGVzUGVyRnJhbWUgPSAlZCIsIG1CeXRlc1BlckZyYW1lKTsKKyAgICAgICAgQUxPR0UoImludmFsaWQgbUJ5dGVzUGVyRnJhbWUgPSAlZCIsIG1CeXRlc1BlckZyYW1lKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlRFUk5BTDsKICAgICB9CiAgICAgaWYgKG1GcmFtZXNQZXJCdXJzdCA8IDAgfHwgbUZyYW1lc1BlckJ1cnN0ID49IDE2ICogMTAyNCkgewotICAgICAgICBBTE9HRSgiUmluZ0J1ZmZlclBhcmNlbGFibGUgaW52YWxpZCBtRnJhbWVzUGVyQnVyc3QgPSAlZCIsIG1GcmFtZXNQZXJCdXJzdCk7CisgICAgICAgIEFMT0dFKCJpbnZhbGlkIG1GcmFtZXNQZXJCdXJzdCA9ICVkIiwgbUZyYW1lc1BlckJ1cnN0KTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlRFUk5BTDsKICAgICB9Ci0gICAgaWYgKChyZXN1bHQgPSBtUmVhZENvdW50ZXJQYXJjZWxhYmxlLnZhbGlkYXRlKCkpICE9IEFBVURJT19PSykgewotICAgICAgICBBTE9HRSgiUmluZ0J1ZmZlclBhcmNlbGFibGUgaW52YWxpZCBtUmVhZENvdW50ZXJQYXJjZWxhYmxlID0gJWQiLCByZXN1bHQpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBpZiAoKHJlc3VsdCA9IG1Xcml0ZUNvdW50ZXJQYXJjZWxhYmxlLnZhbGlkYXRlKCkpICE9IEFBVURJT19PSykgewotICAgICAgICBBTE9HRSgiUmluZ0J1ZmZlclBhcmNlbGFibGUgaW52YWxpZCBtV3JpdGVDb3VudGVyUGFyY2VsYWJsZSA9ICVkIiwgcmVzdWx0KTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgaWYgKChyZXN1bHQgPSBtRGF0YVBhcmNlbGFibGUudmFsaWRhdGUoKSkgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgIEFMT0dFKCJSaW5nQnVmZmVyUGFyY2VsYWJsZSBpbnZhbGlkIG1EYXRhUGFyY2VsYWJsZSA9ICVkIiwgcmVzdWx0KTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9CiAgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KIAogCiB2b2lkIFJpbmdCdWZmZXJQYXJjZWxhYmxlOjpkdW1wKCkgewotICAgIEFMT0dEKCJSaW5nQnVmZmVyUGFyY2VsYWJsZSBtQ2FwYWNpdHlJbkZyYW1lcyA9ICVkIC0tLS0tLS0tLSIsIG1DYXBhY2l0eUluRnJhbWVzKTsKKyAgICBBTE9HRCgibUNhcGFjaXR5SW5GcmFtZXMgPSAlZCAtLS0tLS0tLS0iLCBtQ2FwYWNpdHlJbkZyYW1lcyk7CiAgICAgaWYgKG1DYXBhY2l0eUluRnJhbWVzID4gMCkgewotICAgICAgICBBTE9HRCgiUmluZ0J1ZmZlclBhcmNlbGFibGUgbUJ5dGVzUGVyRnJhbWUgPSAlZCIsIG1CeXRlc1BlckZyYW1lKTsKLSAgICAgICAgQUxPR0QoIlJpbmdCdWZmZXJQYXJjZWxhYmxlIG1GcmFtZXNQZXJCdXJzdCA9ICVkIiwgbUZyYW1lc1BlckJ1cnN0KTsKLSAgICAgICAgQUxPR0QoIlJpbmdCdWZmZXJQYXJjZWxhYmxlIG1GbGFncyA9ICV1IiwgbUZsYWdzKTsKKyAgICAgICAgQUxPR0QoIm1CeXRlc1BlckZyYW1lID0gJWQiLCBtQnl0ZXNQZXJGcmFtZSk7CisgICAgICAgIEFMT0dEKCJtRnJhbWVzUGVyQnVyc3QgPSAlZCIsIG1GcmFtZXNQZXJCdXJzdCk7CisgICAgICAgIEFMT0dEKCJtRmxhZ3MgPSAldSIsIG1GbGFncyk7CiAgICAgICAgIG1SZWFkQ291bnRlclBhcmNlbGFibGUuZHVtcCgpOwogICAgICAgICBtV3JpdGVDb3VudGVyUGFyY2VsYWJsZS5kdW1wKCk7CiAgICAgICAgIG1EYXRhUGFyY2VsYWJsZS5kdW1wKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvUmluZ0J1ZmZlclBhcmNlbGFibGUuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9SaW5nQnVmZmVyUGFyY2VsYWJsZS5oCmluZGV4IGJkNTYyZjIuLjFkYmNmMDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9SaW5nQnVmZmVyUGFyY2VsYWJsZS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9SaW5nQnVmZmVyUGFyY2VsYWJsZS5oCkBAIC02NiwxMSArNjYsMTIgQEAKIAogICAgIGFhdWRpb19yZXN1bHRfdCByZXNvbHZlKFNoYXJlZE1lbW9yeVBhcmNlbGFibGUgKm1lbW9yeVBhcmNlbHMsIFJpbmdCdWZmZXJEZXNjcmlwdG9yICpkZXNjcmlwdG9yKTsKIAotICAgIGFhdWRpb19yZXN1bHRfdCB2YWxpZGF0ZSgpOwotCiAgICAgdm9pZCBkdW1wKCk7CiAKIHByaXZhdGU6CisKKyAgICBhYXVkaW9fcmVzdWx0X3QgdmFsaWRhdGUoKSBjb25zdDsKKwogICAgIFNoYXJlZFJlZ2lvblBhcmNlbGFibGUgIG1SZWFkQ291bnRlclBhcmNlbGFibGU7CiAgICAgU2hhcmVkUmVnaW9uUGFyY2VsYWJsZSAgbVdyaXRlQ291bnRlclBhcmNlbGFibGU7CiAgICAgU2hhcmVkUmVnaW9uUGFyY2VsYWJsZSAgbURhdGFQYXJjZWxhYmxlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuY3BwCmluZGV4IDkwMjE3YWIuLjBiMGNmNzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5jcHAKQEAgLTE0LDcgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNkZWZpbmUgTE9HX1RBRyAiQUF1ZGlvIgorI2RlZmluZSBMT0dfVEFHICJTaGFyZWRNZW1vcnlQYXJjZWxhYmxlIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCkBAIC00MywxNiArNDMsMTggQEAKIAogdm9pZCBTaGFyZWRNZW1vcnlQYXJjZWxhYmxlOjpzZXR1cChjb25zdCB1bmlxdWVfZmQmIGZkLCBpbnQzMl90IHNpemVJbkJ5dGVzKSB7CiAgICAgbUZkLnJlc2V0KGR1cChmZC5nZXQoKSkpOyAvLyBzdG9yZSBhIGR1cGxpY2F0ZSBmZAotICAgIEFMT0dWKCJTaGFyZWRNZW1vcnlQYXJjZWxhYmxlOjpzZXR1cCglZCAtPiAlZCwgJWQpIHRoaXMgPSAlcFxuIiwKLSAgICAgICAgICBmZC5nZXQoKSwgbUZkLmdldCgpLCBzaXplSW5CeXRlcywgdGhpcyk7CisgICAgQUxPR1YoInNldHVwKCVkIC0+ICVkLCAlZCkgdGhpcyA9ICVwXG4iLCBmZC5nZXQoKSwgbUZkLmdldCgpLCBzaXplSW5CeXRlcywgdGhpcyk7CiAgICAgbVNpemVJbkJ5dGVzID0gc2l6ZUluQnl0ZXM7CiB9CiAKIHN0YXR1c190IFNoYXJlZE1lbW9yeVBhcmNlbGFibGU6OndyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IHsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIobVNpemVJbkJ5dGVzKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFN0YXR1cyh2YWxpZGF0ZSgpKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOworCisgICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKG1TaXplSW5CeXRlcyk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKICAgICBpZiAobVNpemVJbkJ5dGVzID4gMCkgewotICAgICAgICBBTE9HVigiU2hhcmVkTWVtb3J5UGFyY2VsYWJsZTo6d3JpdGVUb1BhcmNlbCgpIG1GZCA9ICVkLCB0aGlzID0gJXBcbiIsIG1GZC5nZXQoKSwgdGhpcyk7CisgICAgICAgIEFMT0dWKCJ3cml0ZVRvUGFyY2VsKCkgbUZkID0gJWQsIHRoaXMgPSAlcFxuIiwgbUZkLmdldCgpLCB0aGlzKTsKICAgICAgICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZVVuaXF1ZUZpbGVEZXNjcmlwdG9yKG1GZCk7CiAgICAgICAgIEFMT0dFX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwgIlNoYXJlZE1lbW9yeVBhcmNlbGFibGUgd3JpdGVEdXBGaWxlRGVzY3JpcHRvciBmYWlsZWQgOiAlZCIsCiAgICAgICAgICAgICAgICAgIHN0YXR1cyk7CkBAIC02MiwyMiArNjQsMjcgQEAKIAogc3RhdHVzX3QgU2hhcmVkTWVtb3J5UGFyY2VsYWJsZTo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIHsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmbVNpemVJbkJ5dGVzKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQorICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CisKICAgICBpZiAobVNpemVJbkJ5dGVzID4gMCkgewogICAgICAgICAvLyBUaGUgUGFyY2VsIG93bnMgdGhlIGZpbGUgZGVzY3JpcHRvciBhbmQgd2lsbCBjbG9zZSBpdCBsYXRlci4KICAgICAgICAgdW5pcXVlX2ZkIG1tYXBGZDsKICAgICAgICAgc3RhdHVzID0gcGFyY2VsLT5yZWFkVW5pcXVlRmlsZURlc2NyaXB0b3IoJm1tYXBGZCk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dFKCJTaGFyZWRNZW1vcnlQYXJjZWxhYmxlOjpyZWFkRnJvbVBhcmNlbCgpIHJlYWRVbmlxdWVGaWxlRGVzY3JpcHRvcigpIGZhaWxlZCA6ICVkIiwKLSAgICAgICAgICAgICAgICAgIHN0YXR1cyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBSZXNvbHZlIHRoZSBtZW1vcnkgbm93IHdoaWxlIHdlIHN0aWxsIGhhdmUgdGhlIEZEIGZyb20gdGhlIFBhcmNlbC4KLSAgICAgICAgICAgIC8vIENsb3NpbmcgdGhlIEZEIHdpbGwgbm90IGFmZmVjdCB0aGUgc2hhcmVkIG1lbW9yeSBvbmNlIG1tYXAoKSBoYXMgYmVlbiBjYWxsZWQuCi0gICAgICAgICAgICBzdGF0dXMgPSBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChyZXNvbHZlU2hhcmVkTWVtb3J5KG1tYXBGZCkpOworICAgICAgICAgICAgQUxPR0UoInJlYWRGcm9tUGFyY2VsKCkgcmVhZFVuaXF1ZUZpbGVEZXNjcmlwdG9yKCkgZmFpbGVkIDogJWQiLCBzdGF0dXMpOworICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQorCisgICAgICAgIC8vIFJlc29sdmUgdGhlIG1lbW9yeSBub3cgd2hpbGUgd2Ugc3RpbGwgaGF2ZSB0aGUgRkQgZnJvbSB0aGUgUGFyY2VsLgorICAgICAgICAvLyBDbG9zaW5nIHRoZSBGRCB3aWxsIG5vdCBhZmZlY3QgdGhlIHNoYXJlZCBtZW1vcnkgb25jZSBtbWFwKCkgaGFzIGJlZW4gY2FsbGVkLgorICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gcmVzb2x2ZVNoYXJlZE1lbW9yeShtbWFwRmQpOworICAgICAgICBzdGF0dXMgPSBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFN0YXR1cyhyZXN1bHQpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwogICAgIH0KKworICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFN0YXR1cyh2YWxpZGF0ZSgpKTsKKworZXJyb3I6CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtODUsNyArOTIsNyBAQAogICAgIGlmIChtUmVzb2x2ZWRBZGRyZXNzICE9IE1NQVBfVU5SRVNPTFZFRF9BRERSRVNTKSB7CiAgICAgICAgIGludCBlcnIgPSBtdW5tYXAobVJlc29sdmVkQWRkcmVzcywgbVNpemVJbkJ5dGVzKTsKICAgICAgICAgaWYgKGVyciA8IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJTaGFyZWRNZW1vcnlQYXJjZWxhYmxlOjpjbG9zZSgpIG11bm1hcCgpIGZhaWxlZCAlZCIsIGVycik7CisgICAgICAgICAgICBBTE9HRSgiY2xvc2UoKSBtdW5tYXAoKSBmYWlsZWQgJWQiLCBlcnIpOwogICAgICAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KGVycik7CiAgICAgICAgIH0KICAgICAgICAgbVJlc29sdmVkQWRkcmVzcyA9IE1NQVBfVU5SRVNPTFZFRF9BRERSRVNTOwpAQCAtOTcsOCArMTA0LDcgQEAKICAgICBtUmVzb2x2ZWRBZGRyZXNzID0gKHVpbnQ4X3QgKikgbW1hcCgwLCBtU2l6ZUluQnl0ZXMsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFQX1NIQVJFRCwgZmQuZ2V0KCksIDApOwogICAgIGlmIChtUmVzb2x2ZWRBZGRyZXNzID09IE1NQVBfVU5SRVNPTFZFRF9BRERSRVNTKSB7Ci0gICAgICAgIEFMT0dFKCJTaGFyZWRNZW1vcnlQYXJjZWxhYmxlIG1tYXAoKSBmYWlsZWQgZm9yIGZkID0gJWQsIGVycm5vID0gJXMiLAotICAgICAgICAgICAgICBmZC5nZXQoKSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgQUxPR0UoIm1tYXAoKSBmYWlsZWQgZm9yIGZkID0gJWQsIGVycm5vID0gJXMiLCBmZC5nZXQoKSwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlRFUk5BTDsKICAgICB9CiAgICAgcmV0dXJuIEFBVURJT19PSzsKQEAgLTEwNywxMCArMTEzLDEwIEBACiBhYXVkaW9fcmVzdWx0X3QgU2hhcmVkTWVtb3J5UGFyY2VsYWJsZTo6cmVzb2x2ZShpbnQzMl90IG9mZnNldEluQnl0ZXMsIGludDMyX3Qgc2l6ZUluQnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKnJlZ2lvbkFkZHJlc3NQdHIpIHsKICAgICBpZiAob2Zmc2V0SW5CeXRlcyA8IDApIHsKLSAgICAgICAgQUxPR0UoIlNoYXJlZE1lbW9yeVBhcmNlbGFibGUgaWxsZWdhbCBvZmZzZXRJbkJ5dGVzID0gJWQiLCBvZmZzZXRJbkJ5dGVzKTsKKyAgICAgICAgQUxPR0UoImlsbGVnYWwgb2Zmc2V0SW5CeXRlcyA9ICVkIiwgb2Zmc2V0SW5CeXRlcyk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFOwogICAgIH0gZWxzZSBpZiAoKG9mZnNldEluQnl0ZXMgKyBzaXplSW5CeXRlcykgPiBtU2l6ZUluQnl0ZXMpIHsKLSAgICAgICAgQUxPR0UoIlNoYXJlZE1lbW9yeVBhcmNlbGFibGUgb3V0IG9mIHJhbmdlLCBvZmZzZXRJbkJ5dGVzID0gJWQsICIKKyAgICAgICAgQUxPR0UoIm91dCBvZiByYW5nZSwgb2Zmc2V0SW5CeXRlcyA9ICVkLCAiCiAgICAgICAgICAgICAgICAgICAgICAgInNpemVJbkJ5dGVzID0gJWQsIG1TaXplSW5CeXRlcyA9ICVkIiwKICAgICAgICAgICAgICAgb2Zmc2V0SW5CeXRlcywgc2l6ZUluQnl0ZXMsIG1TaXplSW5CeXRlcyk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFOwpAQCAtMTIyLDE2ICsxMjgsMTUgQEAKICAgICAgICAgaWYgKG1GZC5nZXQoKSAhPSAtMSkgewogICAgICAgICAgICAgcmVzdWx0ID0gcmVzb2x2ZVNoYXJlZE1lbW9yeShtRmQpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoIlNoYXJlZE1lbW9yeVBhcmNlbGFibGUgaGFzIG5vIGZpbGUgZGVzY3JpcHRvciBmb3Igc2hhcmVkIG1lbW9yeS4iKTsKKyAgICAgICAgICAgIEFMT0dFKCJoYXMgbm8gZmlsZSBkZXNjcmlwdG9yIGZvciBzaGFyZWQgbWVtb3J5LiIpOwogICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX0lOVEVSTkFMOwogICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0sgJiYgbVJlc29sdmVkQWRkcmVzcyAhPSBNTUFQX1VOUkVTT0xWRURfQUREUkVTUykgewogICAgICAgICAqcmVnaW9uQWRkcmVzc1B0ciA9IG1SZXNvbHZlZEFkZHJlc3MgKyBvZmZzZXRJbkJ5dGVzOwotICAgICAgICBBTE9HVigiU2hhcmVkTWVtb3J5UGFyY2VsYWJsZSBtUmVzb2x2ZWRBZGRyZXNzID0gJXAiLCBtUmVzb2x2ZWRBZGRyZXNzKTsKLSAgICAgICAgQUxPR1YoIlNoYXJlZE1lbW9yeVBhcmNlbGFibGUgb2Zmc2V0IGJ5ICVkLCAqcmVnaW9uQWRkcmVzc1B0ciA9ICVwIiwKLSAgICAgICAgICAgICAgb2Zmc2V0SW5CeXRlcywgKnJlZ2lvbkFkZHJlc3NQdHIpOworICAgICAgICBBTE9HVigibVJlc29sdmVkQWRkcmVzcyA9ICVwIiwgbVJlc29sdmVkQWRkcmVzcyk7CisgICAgICAgIEFMT0dWKCJvZmZzZXQgYnkgJWQsICpyZWdpb25BZGRyZXNzUHRyID0gJXAiLCBvZmZzZXRJbkJ5dGVzLCAqcmVnaW9uQWRkcmVzc1B0cik7CiAgICAgfQogICAgIHJldHVybiByZXN1bHQ7CiB9CkBAIC0xNDAsMTYgKzE0NSwxNiBAQAogICAgIHJldHVybiBtU2l6ZUluQnl0ZXM7CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBTaGFyZWRNZW1vcnlQYXJjZWxhYmxlOjp2YWxpZGF0ZSgpIHsKK2FhdWRpb19yZXN1bHRfdCBTaGFyZWRNZW1vcnlQYXJjZWxhYmxlOjp2YWxpZGF0ZSgpIGNvbnN0IHsKICAgICBpZiAobVNpemVJbkJ5dGVzIDwgMCB8fCBtU2l6ZUluQnl0ZXMgPj0gTUFYX01NQVBfU0laRV9CWVRFUykgewotICAgICAgICBBTE9HRSgiU2hhcmVkTWVtb3J5UGFyY2VsYWJsZSBpbnZhbGlkIG1TaXplSW5CeXRlcyA9ICVkIiwgbVNpemVJbkJ5dGVzKTsKKyAgICAgICAgQUxPR0UoImludmFsaWQgbVNpemVJbkJ5dGVzID0gJWQiLCBtU2l6ZUluQnl0ZXMpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKICAgICB9CiAgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KIAogdm9pZCBTaGFyZWRNZW1vcnlQYXJjZWxhYmxlOjpkdW1wKCkgewotICAgIEFMT0dEKCJTaGFyZWRNZW1vcnlQYXJjZWxhYmxlIG1GZCA9ICVkIiwgbUZkLmdldCgpKTsKLSAgICBBTE9HRCgiU2hhcmVkTWVtb3J5UGFyY2VsYWJsZSBtU2l6ZUluQnl0ZXMgPSAlZCIsIG1TaXplSW5CeXRlcyk7Ci0gICAgQUxPR0QoIlNoYXJlZE1lbW9yeVBhcmNlbGFibGUgbVJlc29sdmVkQWRkcmVzcyA9ICVwIiwgbVJlc29sdmVkQWRkcmVzcyk7CisgICAgQUxPR0QoIm1GZCA9ICVkIiwgbUZkLmdldCgpKTsKKyAgICBBTE9HRCgibVNpemVJbkJ5dGVzID0gJWQiLCBtU2l6ZUluQnl0ZXMpOworICAgIEFMT0dEKCJtUmVzb2x2ZWRBZGRyZXNzID0gJXAiLCBtUmVzb2x2ZWRBZGRyZXNzKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5oCmluZGV4IDJhNjM0ZTAuLjgyYzIyNDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuaApAQCAtNjEsOCArNjEsNiBAQAogCiAgICAgaW50MzJfdCBnZXRTaXplSW5CeXRlcygpOwogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHZhbGlkYXRlKCk7Ci0KICAgICB2b2lkIGR1bXAoKTsKIAogcHJvdGVjdGVkOgpAQCAtNzQsNiArNzIsMTEgQEAKICAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgICBtRmQ7CiAgICAgaW50MzJfdCAgICAgbVNpemVJbkJ5dGVzID0gMDsKICAgICB1aW50OF90ICAgICptUmVzb2x2ZWRBZGRyZXNzID0gTU1BUF9VTlJFU09MVkVEX0FERFJFU1M7CisKK3ByaXZhdGU6CisKKyAgICBhYXVkaW9fcmVzdWx0X3QgdmFsaWRhdGUoKSBjb25zdDsKKwogfTsKIAogfSAvKiBuYW1lc3BhY2UgYWF1ZGlvICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkUmVnaW9uUGFyY2VsYWJsZS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkUmVnaW9uUGFyY2VsYWJsZS5jcHAKaW5kZXggNzM4MWRjYi4uYzc3NjExNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZFJlZ2lvblBhcmNlbGFibGUuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRSZWdpb25QYXJjZWxhYmxlLmNwcApAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2RlZmluZSBMT0dfVEFHICJBQXVkaW8iCisjZGVmaW5lIExPR19UQUcgIlNoYXJlZFJlZ2lvblBhcmNlbGFibGUiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZS5oPgogCiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgorI2luY2x1ZGUgPHV0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmg+CiAKICNpbmNsdWRlICJiaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuaCIKICNpbmNsdWRlICJiaW5kaW5nL1NoYXJlZFJlZ2lvblBhcmNlbGFibGUuaCIKQEAgLTQ3LDIxICs0OCwzOCBAQAogfQogCiBzdGF0dXNfdCBTaGFyZWRSZWdpb25QYXJjZWxhYmxlOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCB7Ci0gICAgcGFyY2VsLT53cml0ZUludDMyKG1TaXplSW5CeXRlcyk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTdGF0dXModmFsaWRhdGUoKSk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKKworICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihtU2l6ZUluQnl0ZXMpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CiAgICAgaWYgKG1TaXplSW5CeXRlcyA+IDApIHsKLSAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKG1TaGFyZWRNZW1vcnlJbmRleCk7Ci0gICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtT2Zmc2V0SW5CeXRlcyk7CisgICAgICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihtU2hhcmVkTWVtb3J5SW5kZXgpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOworICAgICAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIobU9mZnNldEluQnl0ZXMpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwogICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7IC8vIFRPRE8gY2hlY2sgZm9yIGVycm9ycyBhYm92ZQorICAgIHJldHVybiBOT19FUlJPUjsKKworZXJyb3I6CisgICAgQUxPR0UoIiVzIHJldHVybmluZyAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOworICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHN0YXR1c190IFNoYXJlZFJlZ2lvblBhcmNlbGFibGU6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSB7Ci0gICAgcGFyY2VsLT5yZWFkSW50MzIoJm1TaXplSW5CeXRlcyk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJm1TaXplSW5CeXRlcyk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKICAgICBpZiAobVNpemVJbkJ5dGVzID4gMCkgewotICAgICAgICBwYXJjZWwtPnJlYWRJbnQzMigmbVNoYXJlZE1lbW9yeUluZGV4KTsKLSAgICAgICAgcGFyY2VsLT5yZWFkSW50MzIoJm1PZmZzZXRJbkJ5dGVzKTsKKyAgICAgICAgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJm1TaGFyZWRNZW1vcnlJbmRleCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CisgICAgICAgIHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZtT2Zmc2V0SW5CeXRlcyk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CiAgICAgfQotICAgIHJldHVybiBOT19FUlJPUjsgLy8gVE9ETyBjaGVjayBmb3IgZXJyb3JzIGFib3ZlCisgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU3RhdHVzKHZhbGlkYXRlKCkpOworCitlcnJvcjoKKyAgICBBTE9HRSgiJXMgcmV0dXJuaW5nICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IFNoYXJlZFJlZ2lvblBhcmNlbGFibGU6OnJlc29sdmUoU2hhcmVkTWVtb3J5UGFyY2VsYWJsZSAqbWVtb3J5UGFyY2VscywKQEAgLTcxLDI1ICs4OSwyNSBAQAogICAgICAgICByZXR1cm4gQUFVRElPX09LOwogICAgIH0KICAgICBpZiAobVNoYXJlZE1lbW9yeUluZGV4IDwgMCkgewotICAgICAgICBBTE9HRSgiU2hhcmVkUmVnaW9uUGFyY2VsYWJsZSBpbnZhbGlkIG1TaGFyZWRNZW1vcnlJbmRleCA9ICVkIiwgbVNoYXJlZE1lbW9yeUluZGV4KTsKKyAgICAgICAgQUxPR0UoImludmFsaWQgbVNoYXJlZE1lbW9yeUluZGV4ID0gJWQiLCBtU2hhcmVkTWVtb3J5SW5kZXgpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVEVSTkFMOwogICAgIH0KICAgICBTaGFyZWRNZW1vcnlQYXJjZWxhYmxlICptZW1vcnlQYXJjZWwgPSAmbWVtb3J5UGFyY2Vsc1ttU2hhcmVkTWVtb3J5SW5kZXhdOwogICAgIHJldHVybiBtZW1vcnlQYXJjZWwtPnJlc29sdmUobU9mZnNldEluQnl0ZXMsIG1TaXplSW5CeXRlcywgcmVnaW9uQWRkcmVzc1B0cik7CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBTaGFyZWRSZWdpb25QYXJjZWxhYmxlOjp2YWxpZGF0ZSgpIHsKK2FhdWRpb19yZXN1bHRfdCBTaGFyZWRSZWdpb25QYXJjZWxhYmxlOjp2YWxpZGF0ZSgpIGNvbnN0IHsKICAgICBpZiAobVNpemVJbkJ5dGVzIDwgMCB8fCBtU2l6ZUluQnl0ZXMgPj0gTUFYX01NQVBfU0laRV9CWVRFUykgewotICAgICAgICBBTE9HRSgiU2hhcmVkUmVnaW9uUGFyY2VsYWJsZSBpbnZhbGlkIG1TaXplSW5CeXRlcyA9ICVkIiwgbVNpemVJbkJ5dGVzKTsKKyAgICAgICAgQUxPR0UoImludmFsaWQgbVNpemVJbkJ5dGVzID0gJWQiLCBtU2l6ZUluQnl0ZXMpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKICAgICB9CiAgICAgaWYgKG1TaXplSW5CeXRlcyA+IDApIHsKICAgICAgICAgaWYgKG1PZmZzZXRJbkJ5dGVzIDwgMCB8fCBtT2Zmc2V0SW5CeXRlcyA+PSBNQVhfTU1BUF9PRkZTRVRfQllURVMpIHsKLSAgICAgICAgICAgIEFMT0dFKCJTaGFyZWRSZWdpb25QYXJjZWxhYmxlIGludmFsaWQgbU9mZnNldEluQnl0ZXMgPSAlZCIsIG1PZmZzZXRJbkJ5dGVzKTsKKyAgICAgICAgICAgIEFMT0dFKCJpbnZhbGlkIG1PZmZzZXRJbkJ5dGVzID0gJWQiLCBtT2Zmc2V0SW5CeXRlcyk7CiAgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKICAgICAgICAgfQogICAgICAgICBpZiAobVNoYXJlZE1lbW9yeUluZGV4IDwgMCB8fCBtU2hhcmVkTWVtb3J5SW5kZXggPj0gTUFYX1NIQVJFRF9NRU1PUklFUykgewotICAgICAgICAgICAgQUxPR0UoIlNoYXJlZFJlZ2lvblBhcmNlbGFibGUgaW52YWxpZCBtU2hhcmVkTWVtb3J5SW5kZXggPSAlZCIsIG1TaGFyZWRNZW1vcnlJbmRleCk7CisgICAgICAgICAgICBBTE9HRSgiaW52YWxpZCBtU2hhcmVkTWVtb3J5SW5kZXggPSAlZCIsIG1TaGFyZWRNZW1vcnlJbmRleCk7CiAgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVEVSTkFMOwogICAgICAgICB9CiAgICAgfQpAQCAtOTcsOSArMTE1LDkgQEAKIH0KIAogdm9pZCBTaGFyZWRSZWdpb25QYXJjZWxhYmxlOjpkdW1wKCkgewotICAgIEFMT0dEKCJTaGFyZWRSZWdpb25QYXJjZWxhYmxlIG1TaXplSW5CeXRlcyA9ICVkIC0tLS0tIiwgbVNpemVJbkJ5dGVzKTsKKyAgICBBTE9HRCgibVNpemVJbkJ5dGVzID0gJWQgLS0tLS0iLCBtU2l6ZUluQnl0ZXMpOwogICAgIGlmIChtU2l6ZUluQnl0ZXMgPiAwKSB7Ci0gICAgICAgIEFMT0dEKCJTaGFyZWRSZWdpb25QYXJjZWxhYmxlIG1TaGFyZWRNZW1vcnlJbmRleCA9ICVkIiwgbVNoYXJlZE1lbW9yeUluZGV4KTsKLSAgICAgICAgQUxPR0QoIlNoYXJlZFJlZ2lvblBhcmNlbGFibGUgbU9mZnNldEluQnl0ZXMgPSAlZCIsIG1PZmZzZXRJbkJ5dGVzKTsKKyAgICAgICAgQUxPR0QoIm1TaGFyZWRNZW1vcnlJbmRleCA9ICVkIiwgbVNoYXJlZE1lbW9yeUluZGV4KTsKKyAgICAgICAgQUxPR0QoIm1PZmZzZXRJbkJ5dGVzID0gJWQiLCBtT2Zmc2V0SW5CeXRlcyk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZFJlZ2lvblBhcmNlbGFibGUuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRSZWdpb25QYXJjZWxhYmxlLmgKaW5kZXggZjZiYWJmZC4uMGNkOGMwNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZFJlZ2lvblBhcmNlbGFibGUuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkUmVnaW9uUGFyY2VsYWJsZS5oCkBAIC00NywxNCArNDcsMTUgQEAKIAogICAgIGJvb2wgaXNGaWxlRGVzY3JpcHRvclNhZmUoU2hhcmVkTWVtb3J5UGFyY2VsYWJsZSAqbWVtb3J5UGFyY2Vscyk7CiAKLSAgICBhYXVkaW9fcmVzdWx0X3QgdmFsaWRhdGUoKTsKLQogICAgIHZvaWQgZHVtcCgpOwogCiBwcm90ZWN0ZWQ6CiAgICAgaW50MzJfdCBtU2hhcmVkTWVtb3J5SW5kZXggPSAtMTsKICAgICBpbnQzMl90IG1PZmZzZXRJbkJ5dGVzICAgICA9IDA7CiAgICAgaW50MzJfdCBtU2l6ZUluQnl0ZXMgICAgICAgPSAwOworCitwcml2YXRlOgorICAgIGFhdWRpb19yZXN1bHRfdCB2YWxpZGF0ZSgpIGNvbnN0OwogfTsKIAogfSAvKiBuYW1lc3BhY2UgYWF1ZGlvICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb0VuZHBvaW50LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvRW5kcG9pbnQuY3BwCmluZGV4IDYwNGVlZDUuLmY4ZTM0ZDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvRW5kcG9pbnQuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvRW5kcG9pbnQuY3BwCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jZGVmaW5lIExPR19UQUcgIkFBdWRpbyIKKyNkZWZpbmUgTE9HX1RBRyAiQXVkaW9FbmRwb2ludCIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIApAQCAtNDUsNiArNDUsNyBAQAogICAgIGRlbGV0ZSBtVXBDb21tYW5kUXVldWU7CiB9CiAKKy8vIFRPRE8gQ29uc2lkZXIgbW92aW5nIHRvIGEgbWV0aG9kIGluIFJpbmdCdWZmZXJEZXNjcmlwdG9yCiBzdGF0aWMgYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvRW5kcG9pbnRfdmFsaWRhdGVRdWV1ZURlc2NyaXB0b3IoY29uc3QgY2hhciAqdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmluZ0J1ZmZlckRlc2NyaXB0b3IgKmRlc2NyaXB0b3IpIHsKICAgICBpZiAoZGVzY3JpcHRvciA9PSBudWxscHRyKSB7CkBAIC0xMjcsMTkgKzEyOCwxOSBAQAogICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gdXAgbWVzc2FnZSBxdWV1ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIGNvbnN0IFJpbmdCdWZmZXJEZXNjcmlwdG9yICpkZXNjcmlwdG9yID0gJnBFbmRwb2ludERlc2NyaXB0b3ItPnVwTWVzc2FnZVF1ZXVlRGVzY3JpcHRvcjsKICAgICBpZihkZXNjcmlwdG9yLT5ieXRlc1BlckZyYW1lICE9IHNpemVvZihBQXVkaW9TZXJ2aWNlTWVzc2FnZSkpIHsKLSAgICAgICAgQUxPR0UoIkF1ZGlvRW5kcG9pbnQuY29uZmlndXJlKCkgYnl0ZXNQZXJGcmFtZSAhPSBzaXplb2YoQUF1ZGlvU2VydmljZU1lc3NhZ2UpID0gJWQiLAorICAgICAgICBBTE9HRSgiY29uZmlndXJlKCkgYnl0ZXNQZXJGcmFtZSAhPSBzaXplb2YoQUF1ZGlvU2VydmljZU1lc3NhZ2UpID0gJWQiLAogICAgICAgICAgICAgICBkZXNjcmlwdG9yLT5ieXRlc1BlckZyYW1lKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlRFUk5BTDsKICAgICB9CiAKICAgICBpZihkZXNjcmlwdG9yLT5yZWFkQ291bnRlckFkZHJlc3MgPT0gbnVsbHB0ciB8fCBkZXNjcmlwdG9yLT53cml0ZUNvdW50ZXJBZGRyZXNzID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIkF1ZGlvRW5kcG9pbnQuY29uZmlndXJlKCkgTlVMTCBjb3VudGVyIGFkZHJlc3MiKTsKKyAgICAgICAgQUxPR0UoImNvbmZpZ3VyZSgpIE5VTEwgY291bnRlciBhZGRyZXNzIik7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfTlVMTDsKICAgICB9CiAKICAgICAvLyBQcmV2ZW50IG1lbW9yeSBsZWFrIGFuZCByZXVzZS4KICAgICBpZihtVXBDb21tYW5kUXVldWUgIT0gbnVsbHB0ciB8fCBtRGF0YVF1ZXVlICE9IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIkF1ZGlvRW5kcG9pbnQuY29uZmlndXJlKCkgZW5kcG9pbnQgYWxyZWFkeSB1c2VkIik7CisgICAgICAgIEFMT0dFKCJjb25maWd1cmUoKSBlbmRwb2ludCBhbHJlYWR5IHVzZWQiKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlRFUk5BTDsKICAgICB9CiAKQEAgLTE1Myw4ICsxNTQsOCBAQAogCiAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBkYXRhIHF1ZXVlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgZGVzY3JpcHRvciA9ICZwRW5kcG9pbnREZXNjcmlwdG9yLT5kYXRhUXVldWVEZXNjcmlwdG9yOwotICAgIEFMT0dWKCJBdWRpb0VuZHBvaW50LmNvbmZpZ3VyZSgpIGRhdGEgZnJhbWVzUGVyQnVyc3QgPSAlZCIsIGRlc2NyaXB0b3ItPmZyYW1lc1BlckJ1cnN0KTsKLSAgICBBTE9HVigiQXVkaW9FbmRwb2ludC5jb25maWd1cmUoKSBkYXRhIHJlYWRDb3VudGVyQWRkcmVzcyA9ICVwIiwKKyAgICBBTE9HVigiY29uZmlndXJlKCkgZGF0YSBmcmFtZXNQZXJCdXJzdCA9ICVkIiwgZGVzY3JpcHRvci0+ZnJhbWVzUGVyQnVyc3QpOworICAgIEFMT0dWKCJjb25maWd1cmUoKSBkYXRhIHJlYWRDb3VudGVyQWRkcmVzcyA9ICVwIiwKICAgICAgICAgICBkZXNjcmlwdG9yLT5yZWFkQ291bnRlckFkZHJlc3MpOwogCiAgICAgLy8gQW4gZXhhbXBsZSBvZiBmcmVlIHJ1bm5pbmcgaXMgd2hlbiB0aGUgb3RoZXIgc2lkZSBpcyByZWFkIG9yIHdyaXR0ZW4gYnkgaGFyZHdhcmUgRE1BCkBAIC0xNjMsNyArMTY0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBkZXNjcmlwdG9yLT5yZWFkQ291bnRlckFkZHJlc3MgLy8gcmVhZCBieSBvdGhlciBzaWRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZGVzY3JpcHRvci0+d3JpdGVDb3VudGVyQWRkcmVzczsgLy8gd3JpdHRlbiBieSBvdGhlciBzaWRlCiAgICAgbUZyZWVSdW5uaW5nID0gKHJlbW90ZUNvdW50ZXIgPT0gbnVsbHB0cik7Ci0gICAgQUxPR1YoIkF1ZGlvRW5kcG9pbnQuY29uZmlndXJlKCkgbUZyZWVSdW5uaW5nID0gJWQiLCBtRnJlZVJ1bm5pbmcgPyAxIDogMCk7CisgICAgQUxPR1YoImNvbmZpZ3VyZSgpIG1GcmVlUnVubmluZyA9ICVkIiwgbUZyZWVSdW5uaW5nID8gMSA6IDApOwogCiAgICAgaW50NjRfdCAqcmVhZENvdW50ZXJBZGRyZXNzID0gKGRlc2NyaXB0b3ItPnJlYWRDb3VudGVyQWRkcmVzcyA9PSBudWxscHRyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJm1EYXRhUmVhZENvdW50ZXIKQEAgLTI1OCw4ICsyNTksOCBAQAogfQogCiB2b2lkIEF1ZGlvRW5kcG9pbnQ6OmR1bXAoKSBjb25zdCB7Ci0gICAgQUxPR0QoIkF1ZGlvRW5kcG9pbnQ6IGRhdGEgcmVhZENvdW50ZXIgID0gJWxsZCIsIChsb25nIGxvbmcpIG1EYXRhUXVldWUtPmdldFJlYWRDb3VudGVyKCkpOwotICAgIEFMT0dEKCJBdWRpb0VuZHBvaW50OiBkYXRhIHdyaXRlQ291bnRlciA9ICVsbGQiLCAobG9uZyBsb25nKSBtRGF0YVF1ZXVlLT5nZXRXcml0ZUNvdW50ZXIoKSk7CisgICAgQUxPR0QoImRhdGEgcmVhZENvdW50ZXIgID0gJWxsZCIsIChsb25nIGxvbmcpIG1EYXRhUXVldWUtPmdldFJlYWRDb3VudGVyKCkpOworICAgIEFMT0dEKCJkYXRhIHdyaXRlQ291bnRlciA9ICVsbGQiLCAobG9uZyBsb25nKSBtRGF0YVF1ZXVlLT5nZXRXcml0ZUNvdW50ZXIoKSk7CiB9CiAKIHZvaWQgQXVkaW9FbmRwb2ludDo6ZXJhc2VEYXRhTWVtb3J5KCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmNwcAppbmRleCAyZmRiZmFmLi45MjA0ODI0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmNwcApAQCAtNjEsMTUgKzYxLDEyIEBACiAgICAgICAgICwgbUNsb2NrTW9kZWwoKQogICAgICAgICAsIG1BdWRpb0VuZHBvaW50KCkKICAgICAgICAgLCBtU2VydmljZVN0cmVhbUhhbmRsZShBQVVESU9fSEFORExFX0lOVkFMSUQpCi0gICAgICAgICwgbUZyYW1lc1BlckJ1cnN0KDE2KQogICAgICAgICAsIG1JblNlcnZpY2UoaW5TZXJ2aWNlKQogICAgICAgICAsIG1TZXJ2aWNlSW50ZXJmYWNlKHNlcnZpY2VJbnRlcmZhY2UpCiAgICAgICAgICwgbUF0b21pY1RpbWVzdGFtcCgpCiAgICAgICAgICwgbVdha2V1cERlbGF5TmFub3MoQUF1ZGlvUHJvcGVydHlfZ2V0V2FrZXVwRGVsYXlNaWNyb3MoKSAqIEFBVURJT19OQU5PU19QRVJfTUlDUk9TRUNPTkQpCiAgICAgICAgICwgbU1pbmltdW1TbGVlcE5hbm9zKEFBdWRpb1Byb3BlcnR5X2dldE1pbmltdW1TbGVlcE1pY3JvcygpICogQUFVRElPX05BTk9TX1BFUl9NSUNST1NFQ09ORCkKICAgICAgICAgewotICAgIEFMT0dEKCJBdWRpb1N0cmVhbUludGVybmFsKCk6IG1XYWtldXBEZWxheU5hbm9zID0gJWQsIG1NaW5pbXVtU2xlZXBOYW5vcyA9ICVkIiwKLSAgICAgICAgICBtV2FrZXVwRGVsYXlOYW5vcywgbU1pbmltdW1TbGVlcE5hbm9zKTsKIH0KIAogQXVkaW9TdHJlYW1JbnRlcm5hbDo6fkF1ZGlvU3RyZWFtSW50ZXJuYWwoKSB7CkBAIC03OSwxMSArNzYsMTIgQEAKIAogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CiAgICAgaW50MzJfdCBjYXBhY2l0eTsKKyAgICBpbnQzMl90IGZyYW1lc1BlckJ1cnN0OwogICAgIEFBdWRpb1N0cmVhbVJlcXVlc3QgcmVxdWVzdDsKICAgICBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb25PdXRwdXQ7CiAKICAgICBpZiAoZ2V0U3RhdGUoKSAhPSBBQVVESU9fU1RSRUFNX1NUQVRFX1VOSU5JVElBTElaRUQpIHsKLSAgICAgICAgQUxPR0UoIkF1ZGlvU3RyZWFtSW50ZXJuYWw6Om9wZW4oKTogYWxyZWFkeSBvcGVuISBzdGF0ZSA9ICVkIiwgZ2V0U3RhdGUoKSk7CisgICAgICAgIEFMT0dFKCIlcyAtIGFscmVhZHkgb3BlbiEgc3RhdGUgPSAlZCIsIF9fZnVuY19fLCBnZXRTdGF0ZSgpKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KIApAQCAtMTA0LDcgKzEwMiw3IEBACiAgICAgcmVxdWVzdC5zZXRVc2VySWQoZ2V0dWlkKCkpOwogICAgIHJlcXVlc3Quc2V0UHJvY2Vzc0lkKGdldHBpZCgpKTsKICAgICByZXF1ZXN0LnNldFNoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZChpc1NoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZCgpKTsKLSAgICByZXF1ZXN0LnNldEluU2VydmljZShtSW5TZXJ2aWNlKTsKKyAgICByZXF1ZXN0LnNldEluU2VydmljZShpc0luU2VydmljZSgpKTsKIAogICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldERldmljZUlkKGdldERldmljZUlkKCkpOwogICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldFNhbXBsZVJhdGUoZ2V0U2FtcGxlUmF0ZSgpKTsKQEAgLTExMiwxMyArMTEwLDMwIEBACiAgICAgcmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkuc2V0RGlyZWN0aW9uKGdldERpcmVjdGlvbigpKTsKICAgICByZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5zZXRTaGFyaW5nTW9kZShnZXRTaGFyaW5nTW9kZSgpKTsKIAorICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldFVzYWdlKGdldFVzYWdlKCkpOworICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldENvbnRlbnRUeXBlKGdldENvbnRlbnRUeXBlKCkpOworICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldElucHV0UHJlc2V0KGdldElucHV0UHJlc2V0KCkpOworCiAgICAgcmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkuc2V0QnVmZmVyQ2FwYWNpdHkoYnVpbGRlci5nZXRCdWZmZXJDYXBhY2l0eSgpKTsKIAorICAgIG1EZXZpY2VDaGFubmVsQ291bnQgPSBnZXRTYW1wbGVzUGVyRnJhbWUoKTsgLy8gQXNzdW1lIGl0IHdpbGwgYmUgdGhlIHNhbWUuIFVwZGF0ZSBpZiBub3QuCisKICAgICBtU2VydmljZVN0cmVhbUhhbmRsZSA9IG1TZXJ2aWNlSW50ZXJmYWNlLm9wZW5TdHJlYW0ocmVxdWVzdCwgY29uZmlndXJhdGlvbk91dHB1dCk7CisgICAgaWYgKG1TZXJ2aWNlU3RyZWFtSGFuZGxlIDwgMAorICAgICAgICAgICAgJiYgcmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkuZ2V0U2FtcGxlc1BlckZyYW1lKCkgPT0gMSAvLyBtb25vPworICAgICAgICAgICAgJiYgZ2V0RGlyZWN0aW9uKCkgPT0gQUFVRElPX0RJUkVDVElPTl9PVVRQVVQKKyAgICAgICAgICAgICYmICFpc0luU2VydmljZSgpKSB7CisgICAgICAgIC8vIGlmIHRoYXQgZmFpbGVkIHRoZW4gdHJ5IHN3aXRjaGluZyBmcm9tIG1vbm8gdG8gc3RlcmVvIGlmIE9VVFBVVC4KKyAgICAgICAgLy8gT25seSBkbyB0aGlzIGluIHRoZSBjbGllbnQuIE90aGVyd2lzZSB3ZSBlbmQgdXAgd2l0aCBhIG1vbm8gbWl4ZXIgaW4gdGhlIHNlcnZpY2UKKyAgICAgICAgLy8gdGhhdCB3cml0ZXMgdG8gYSBzdGVyZW8gTU1BUCBzdHJlYW0uCisgICAgICAgIEFMT0dEKCIlcyAtIG9wZW5TdHJlYW0oKSByZXR1cm5lZCAlZCwgdHJ5IHN3aXRjaGluZyBmcm9tIE1PTk8gdG8gU1RFUkVPIiwKKyAgICAgICAgICAgICAgX19mdW5jX18sIG1TZXJ2aWNlU3RyZWFtSGFuZGxlKTsKKyAgICAgICAgcmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkuc2V0U2FtcGxlc1BlckZyYW1lKDIpOyAvLyBzdGVyZW8KKyAgICAgICAgbVNlcnZpY2VTdHJlYW1IYW5kbGUgPSBtU2VydmljZUludGVyZmFjZS5vcGVuU3RyZWFtKHJlcXVlc3QsIGNvbmZpZ3VyYXRpb25PdXRwdXQpOworICAgIH0KICAgICBpZiAobVNlcnZpY2VTdHJlYW1IYW5kbGUgPCAwKSB7Ci0gICAgICAgIHJlc3VsdCA9IG1TZXJ2aWNlU3RyZWFtSGFuZGxlOwotICAgICAgICBBTE9HRSgiQXVkaW9TdHJlYW1JbnRlcm5hbDo6b3BlbigpOiBvcGVuU3RyZWFtKCkgcmV0dXJuZWQgJWQiLCByZXN1bHQpOwotICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICBBTE9HRSgiJXMgLSBvcGVuU3RyZWFtKCkgcmV0dXJuZWQgJWQiLCBfX2Z1bmNfXywgbVNlcnZpY2VTdHJlYW1IYW5kbGUpOworICAgICAgICByZXR1cm4gbVNlcnZpY2VTdHJlYW1IYW5kbGU7CiAgICAgfQogCiAgICAgcmVzdWx0ID0gY29uZmlndXJhdGlvbk91dHB1dC52YWxpZGF0ZSgpOwpAQCAtMTI2LDEzICsxNDEsMjIgQEAKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAgICAgLy8gU2F2ZSByZXN1bHRzIG9mIHRoZSBvcGVuLgorICAgIGlmIChnZXRTYW1wbGVzUGVyRnJhbWUoKSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKKyAgICAgICAgc2V0U2FtcGxlc1BlckZyYW1lKGNvbmZpZ3VyYXRpb25PdXRwdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCkpOworICAgIH0KKyAgICBtRGV2aWNlQ2hhbm5lbENvdW50ID0gY29uZmlndXJhdGlvbk91dHB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKKwogICAgIHNldFNhbXBsZVJhdGUoY29uZmlndXJhdGlvbk91dHB1dC5nZXRTYW1wbGVSYXRlKCkpOwotICAgIHNldFNhbXBsZXNQZXJGcmFtZShjb25maWd1cmF0aW9uT3V0cHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpKTsKICAgICBzZXREZXZpY2VJZChjb25maWd1cmF0aW9uT3V0cHV0LmdldERldmljZUlkKCkpOworICAgIHNldFNlc3Npb25JZChjb25maWd1cmF0aW9uT3V0cHV0LmdldFNlc3Npb25JZCgpKTsKICAgICBzZXRTaGFyaW5nTW9kZShjb25maWd1cmF0aW9uT3V0cHV0LmdldFNoYXJpbmdNb2RlKCkpOwogCisgICAgc2V0VXNhZ2UoY29uZmlndXJhdGlvbk91dHB1dC5nZXRVc2FnZSgpKTsKKyAgICBzZXRDb250ZW50VHlwZShjb25maWd1cmF0aW9uT3V0cHV0LmdldENvbnRlbnRUeXBlKCkpOworICAgIHNldElucHV0UHJlc2V0KGNvbmZpZ3VyYXRpb25PdXRwdXQuZ2V0SW5wdXRQcmVzZXQoKSk7CisKICAgICAvLyBTYXZlIGRldmljZSBmb3JtYXQgc28gd2UgY2FuIGRvIGZvcm1hdCBjb252ZXJzaW9uIGFuZCB2b2x1bWUgc2NhbGluZyB0b2dldGhlci4KLSAgICBtRGV2aWNlRm9ybWF0ID0gY29uZmlndXJhdGlvbk91dHB1dC5nZXRGb3JtYXQoKTsKKyAgICBzZXREZXZpY2VGb3JtYXQoY29uZmlndXJhdGlvbk91dHB1dC5nZXRGb3JtYXQoKSk7CiAKICAgICByZXN1bHQgPSBtU2VydmljZUludGVyZmFjZS5nZXRTdHJlYW1EZXNjcmlwdGlvbihtU2VydmljZVN0cmVhbUhhbmRsZSwgbUVuZFBvaW50UGFyY2VsYWJsZSk7CiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKQEAgLTE1MSwxNyArMTc1LDE4IEBACiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCi0gICAgbUZyYW1lc1BlckJ1cnN0ID0gbUVuZHBvaW50RGVzY3JpcHRvci5kYXRhUXVldWVEZXNjcmlwdG9yLmZyYW1lc1BlckJ1cnN0OwotICAgIGNhcGFjaXR5ID0gbUVuZHBvaW50RGVzY3JpcHRvci5kYXRhUXVldWVEZXNjcmlwdG9yLmNhcGFjaXR5SW5GcmFtZXM7Ci0KICAgICAvLyBWYWxpZGF0ZSByZXN1bHQgZnJvbSBzZXJ2ZXIuCi0gICAgaWYgKG1GcmFtZXNQZXJCdXJzdCA8IDE2IHx8IG1GcmFtZXNQZXJCdXJzdCA+IDE2ICogMTAyNCkgewotICAgICAgICBBTE9HRSgiQXVkaW9TdHJlYW1JbnRlcm5hbDo6b3BlbigpOiBmcmFtZXNQZXJCdXJzdCBvdXQgb2YgcmFuZ2UgPSAlZCIsIG1GcmFtZXNQZXJCdXJzdCk7CisgICAgZnJhbWVzUGVyQnVyc3QgPSBtRW5kcG9pbnREZXNjcmlwdG9yLmRhdGFRdWV1ZURlc2NyaXB0b3IuZnJhbWVzUGVyQnVyc3Q7CisgICAgaWYgKGZyYW1lc1BlckJ1cnN0IDwgTUlOX0ZSQU1FU19QRVJfQlVSU1QgfHwgZnJhbWVzUGVyQnVyc3QgPiBNQVhfRlJBTUVTX1BFUl9CVVJTVCkgeworICAgICAgICBBTE9HRSgiJXMgLSBmcmFtZXNQZXJCdXJzdCBvdXQgb2YgcmFuZ2UgPSAlZCIsIF9fZnVuY19fLCBmcmFtZXNQZXJCdXJzdCk7CiAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQotICAgIGlmIChjYXBhY2l0eSA8IG1GcmFtZXNQZXJCdXJzdCB8fCBjYXBhY2l0eSA+IDMyICogMTAyNCkgewotICAgICAgICBBTE9HRSgiQXVkaW9TdHJlYW1JbnRlcm5hbDo6b3BlbigpOiBidWZmZXJDYXBhY2l0eSBvdXQgb2YgcmFuZ2UgPSAlZCIsIGNhcGFjaXR5KTsKKyAgICBtRnJhbWVzUGVyQnVyc3QgPSBmcmFtZXNQZXJCdXJzdDsgLy8gb25seSBzYXZlIGdvb2QgdmFsdWUKKworICAgIGNhcGFjaXR5ID0gbUVuZHBvaW50RGVzY3JpcHRvci5kYXRhUXVldWVEZXNjcmlwdG9yLmNhcGFjaXR5SW5GcmFtZXM7CisgICAgaWYgKGNhcGFjaXR5IDwgbUZyYW1lc1BlckJ1cnN0IHx8IGNhcGFjaXR5ID4gTUFYX0JVRkZFUl9DQVBBQ0lUWV9JTl9GUkFNRVMpIHsKKyAgICAgICAgQUxPR0UoIiVzIC0gYnVmZmVyQ2FwYWNpdHkgb3V0IG9mIHJhbmdlID0gJWQiLCBfX2Z1bmNfXywgY2FwYWNpdHkpOwogICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFOwogICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KQEAgLTE2OSwxNiArMTk0LDE2IEBACiAgICAgbUNsb2NrTW9kZWwuc2V0U2FtcGxlUmF0ZShnZXRTYW1wbGVSYXRlKCkpOwogICAgIG1DbG9ja01vZGVsLnNldEZyYW1lc1BlckJ1cnN0KG1GcmFtZXNQZXJCdXJzdCk7CiAKLSAgICBpZiAoZ2V0RGF0YUNhbGxiYWNrUHJvYygpKSB7CisgICAgaWYgKGlzRGF0YUNhbGxiYWNrU2V0KCkpIHsKICAgICAgICAgbUNhbGxiYWNrRnJhbWVzID0gYnVpbGRlci5nZXRGcmFtZXNQZXJEYXRhQ2FsbGJhY2soKTsKICAgICAgICAgaWYgKG1DYWxsYmFja0ZyYW1lcyA+IGdldEJ1ZmZlckNhcGFjaXR5KCkgLyAyKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQXVkaW9TdHJlYW1JbnRlcm5hbDo6b3BlbigpOiBmcmFtZXNQZXJDYWxsYmFjayB0b28gYmlnID0gJWQsIGNhcGFjaXR5ID0gJWQiLAotICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrRnJhbWVzLCBnZXRCdWZmZXJDYXBhY2l0eSgpKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcyAtIGZyYW1lc1BlckNhbGxiYWNrIHRvbyBiaWcgPSAlZCwgY2FwYWNpdHkgPSAlZCIsCisgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUNhbGxiYWNrRnJhbWVzLCBnZXRCdWZmZXJDYXBhY2l0eSgpKTsKICAgICAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgICAgICAgICBnb3RvIGVycm9yOwogCiAgICAgICAgIH0gZWxzZSBpZiAobUNhbGxiYWNrRnJhbWVzIDwgMCkgewotICAgICAgICAgICAgQUxPR0UoIkF1ZGlvU3RyZWFtSW50ZXJuYWw6Om9wZW4oKTogZnJhbWVzUGVyQ2FsbGJhY2sgbmVnYXRpdmUiKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcyAtIGZyYW1lc1BlckNhbGxiYWNrIG5lZ2F0aXZlIiwgX19mdW5jX18pOwogICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAKQEAgLTIwNCw4ICsyMjksNyBAQAogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6Y2xvc2UoKSB7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKLSAgICBBTE9HRCgiY2xvc2UoKTogbVNlcnZpY2VTdHJlYW1IYW5kbGUgPSAweCUwOFgiLAotICAgICAgICAgICAgIG1TZXJ2aWNlU3RyZWFtSGFuZGxlKTsKKyAgICBBTE9HRCgiJXMoKTogbVNlcnZpY2VTdHJlYW1IYW5kbGUgPSAweCUwOFgiLCBfX2Z1bmNfXywgbVNlcnZpY2VTdHJlYW1IYW5kbGUpOwogICAgIGlmIChtU2VydmljZVN0cmVhbUhhbmRsZSAhPSBBQVVESU9fSEFORExFX0lOVkFMSUQpIHsKICAgICAgICAgLy8gRG9uJ3QgY2xvc2UgYSBzdHJlYW0gd2hpbGUgaXQgaXMgcnVubmluZy4KICAgICAgICAgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IGN1cnJlbnRTdGF0ZSA9IGdldFN0YXRlKCk7CkBAIC0yMTYsOCArMjQwLDggQEAKICAgICAgICAgICAgIHJlc3VsdCA9IHdhaXRGb3JTdGF0ZUNoYW5nZShjdXJyZW50U3RhdGUsICZuZXh0U3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dE5hbm9zZWNvbmRzKTsKICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImNsb3NlKCkgd2FpdEZvclN0YXRlQ2hhbmdlKCkgcmV0dXJuZWQgJWQgJXMiLAotICAgICAgICAgICAgICAgIHJlc3VsdCwgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzKCkgd2FpdEZvclN0YXRlQ2hhbmdlKCkgcmV0dXJuZWQgJWQgJXMiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCByZXN1bHQsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0lORyk7CkBAIC0yNDAsNyArMjY0LDcgQEAKIHN0YXRpYyB2b2lkICphYXVkaW9fY2FsbGJhY2tfdGhyZWFkX3Byb2Modm9pZCAqY29udGV4dCkKIHsKICAgICBBdWRpb1N0cmVhbUludGVybmFsICpzdHJlYW0gPSAoQXVkaW9TdHJlYW1JbnRlcm5hbCAqKWNvbnRleHQ7Ci0gICAgLy9MT0dEKCJBdWRpb1N0cmVhbUludGVybmFsKCk6IG9ib2VfY2FsbGJhY2tfdGhyZWFkLCBzdHJlYW0gPSAlcCIsIHN0cmVhbSk7CisgICAgLy9MT0dEKCJvYm9lX2NhbGxiYWNrX3RocmVhZCwgc3RyZWFtID0gJXAiLCBzdHJlYW0pOwogICAgIGlmIChzdHJlYW0gIT0gTlVMTCkgewogICAgICAgICByZXR1cm4gc3RyZWFtLT5jYWxsYmFja0xvb3AoKTsKICAgICB9IGVsc2UgewpAQCAtMjg4LDcgKzMxMiw3IEBACiAgICAgbU5lZWRDYXRjaFVwLnJlcXVlc3QoKTsgIC8vIEFzayBkYXRhIHByb2Nlc3NpbmcgY29kZSB0byBjYXRjaCB1cCB3aGVuIGZpcnN0IHRpbWVzdGFtcCByZWNlaXZlZC4KIAogICAgIC8vIFN0YXJ0IGRhdGEgY2FsbGJhY2sgdGhyZWFkLgotICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LICYmIGdldERhdGFDYWxsYmFja1Byb2MoKSAhPSBudWxscHRyKSB7CisgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0sgJiYgaXNEYXRhQ2FsbGJhY2tTZXQoKSkgewogICAgICAgICAvLyBMYXVuY2ggdGhlIGNhbGxiYWNrIGxvb3AgdGhyZWFkLgogICAgICAgICBpbnQ2NF90IHBlcmlvZE5hbm9zID0gbUNhbGxiYWNrRnJhbWVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEFBVURJT19OQU5PU19QRVJfU0VDT05ECkBAIC0zMjksOCArMzUzLDEzIEBACiAgICAgfQogfQogCi1hYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6cmVxdWVzdFN0b3BJbnRlcm5hbCgpCithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6cmVxdWVzdFN0b3AoKQogeworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzdG9wQ2FsbGJhY2soKTsKKyAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKwogICAgIGlmIChtU2VydmljZVN0cmVhbUhhbmRsZSA9PSBBQVVESU9fSEFORExFX0lOVkFMSUQpIHsKICAgICAgICAgQUxPR0UoInJlcXVlc3RTdG9wSW50ZXJuYWwoKSBtU2VydmljZVN0cmVhbUhhbmRsZSBpbnZhbGlkID0gMHglMDhYIiwKICAgICAgICAgICAgICAgbVNlcnZpY2VTdHJlYW1IYW5kbGUpOwpAQCAtMzQ0LDE2ICszNzMsNiBAQAogICAgIHJldHVybiBtU2VydmljZUludGVyZmFjZS5zdG9wU3RyZWFtKG1TZXJ2aWNlU3RyZWFtSGFuZGxlKTsKIH0KIAotYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6OnJlcXVlc3RTdG9wKCkKLXsKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gc3RvcENhbGxiYWNrKCk7Ci0gICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgcmVzdWx0ID0gcmVxdWVzdFN0b3BJbnRlcm5hbCgpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpyZWdpc3RlclRocmVhZCgpIHsKICAgICBpZiAobVNlcnZpY2VTdHJlYW1IYW5kbGUgPT0gQUFVRElPX0hBTkRMRV9JTlZBTElEKSB7CiAgICAgICAgIEFMT0dFKCJyZWdpc3RlclRocmVhZCgpIG1TZXJ2aWNlU3RyZWFtSGFuZGxlIGludmFsaWQiKTsKQEAgLTM3MywxOSArMzkyLDI1IEBACiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpzdGFydENsaWVudChjb25zdCBhbmRyb2lkOjpBdWRpb0NsaWVudCYgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmNsaWVudEhhbmRsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRIYW5kbGUpIHsKKyAgICBBTE9HVigiJXMoKSBjYWxsZWQiLCBfX2Z1bmNfXyk7CiAgICAgaWYgKG1TZXJ2aWNlU3RyZWFtSGFuZGxlID09IEFBVURJT19IQU5ETEVfSU5WQUxJRCkgewogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQotCi0gICAgcmV0dXJuIG1TZXJ2aWNlSW50ZXJmYWNlLnN0YXJ0Q2xpZW50KG1TZXJ2aWNlU3RyZWFtSGFuZGxlLCBjbGllbnQsIGNsaWVudEhhbmRsZSk7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9ICBtU2VydmljZUludGVyZmFjZS5zdGFydENsaWVudChtU2VydmljZVN0cmVhbUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCwgcG9ydEhhbmRsZSk7CisgICAgQUxPR1YoIiVzKCVkKSByZXR1cm5pbmcgJWQiLCBfX2Z1bmNfXywgKnBvcnRIYW5kbGUsIHJlc3VsdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6OnN0b3BDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBjbGllbnRIYW5kbGUpIHsKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpzdG9wQ2xpZW50KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydEhhbmRsZSkgeworICAgIEFMT0dWKCIlcyglZCkgY2FsbGVkIiwgX19mdW5jX18sIHBvcnRIYW5kbGUpOwogICAgIGlmIChtU2VydmljZVN0cmVhbUhhbmRsZSA9PSBBQVVESU9fSEFORExFX0lOVkFMSUQpIHsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KLSAgICByZXR1cm4gbVNlcnZpY2VJbnRlcmZhY2Uuc3RvcENsaWVudChtU2VydmljZVN0cmVhbUhhbmRsZSwgY2xpZW50SGFuZGxlKTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gbVNlcnZpY2VJbnRlcmZhY2Uuc3RvcENsaWVudChtU2VydmljZVN0cmVhbUhhbmRsZSwgcG9ydEhhbmRsZSk7CisgICAgQUxPR1YoIiVzKCVkKSByZXR1cm5pbmcgJWQiLCBfX2Z1bmNfXywgcG9ydEhhbmRsZSwgcmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6Z2V0VGltZXN0YW1wKGNsb2NraWRfdCBjbG9ja0lkLApAQCAtNDQ4LDM0ICs0NzMsMzAgQEAKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOwogICAgIHN3aXRjaCAobWVzc2FnZS0+ZXZlbnQuZXZlbnQpIHsKICAgICAgICAgY2FzZSBBQVVESU9fU0VSVklDRV9FVkVOVF9TVEFSVEVEOgotICAgICAgICAgICAgQUxPR0QoIkF1ZGlvU3RyZWFtSW50ZXJuYWw6Om9uRXZlbnRGcm9tU2VydmVyKCkgZ290IEFBVURJT19TRVJWSUNFX0VWRU5UX1NUQVJURUQiKTsKKyAgICAgICAgICAgIEFMT0dEKCIlcyAtIGdvdCBBQVVESU9fU0VSVklDRV9FVkVOVF9TVEFSVEVEIiwgX19mdW5jX18pOwogICAgICAgICAgICAgaWYgKGdldFN0YXRlKCkgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVElORykgewogICAgICAgICAgICAgICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRFRCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBQVVESU9fU0VSVklDRV9FVkVOVF9QQVVTRUQ6Ci0gICAgICAgICAgICBBTE9HRCgiQXVkaW9TdHJlYW1JbnRlcm5hbDo6b25FdmVudEZyb21TZXJ2ZXIoKSBnb3QgQUFVRElPX1NFUlZJQ0VfRVZFTlRfUEFVU0VEIik7CisgICAgICAgICAgICBBTE9HRCgiJXMgLSBnb3QgQUFVRElPX1NFUlZJQ0VfRVZFTlRfUEFVU0VEIiwgX19mdW5jX18pOwogICAgICAgICAgICAgaWYgKGdldFN0YXRlKCkgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTSU5HKSB7CiAgICAgICAgICAgICAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTRUQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQUFVRElPX1NFUlZJQ0VfRVZFTlRfU1RPUFBFRDoKLSAgICAgICAgICAgIEFMT0dEKCJBdWRpb1N0cmVhbUludGVybmFsOjpvbkV2ZW50RnJvbVNlcnZlcigpIGdvdCBBQVVESU9fU0VSVklDRV9FVkVOVF9TVE9QUEVEIik7CisgICAgICAgICAgICBBTE9HRCgiJXMgLSBnb3QgQUFVRElPX1NFUlZJQ0VfRVZFTlRfU1RPUFBFRCIsIF9fZnVuY19fKTsKICAgICAgICAgICAgIGlmIChnZXRTdGF0ZSgpID09IEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBJTkcpIHsKICAgICAgICAgICAgICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQRUQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQUFVRElPX1NFUlZJQ0VfRVZFTlRfRkxVU0hFRDoKLSAgICAgICAgICAgIEFMT0dEKCJBdWRpb1N0cmVhbUludGVybmFsOjpvbkV2ZW50RnJvbVNlcnZlcigpIGdvdCBBQVVESU9fU0VSVklDRV9FVkVOVF9GTFVTSEVEIik7CisgICAgICAgICAgICBBTE9HRCgiJXMgLSBnb3QgQUFVRElPX1NFUlZJQ0VfRVZFTlRfRkxVU0hFRCIsIF9fZnVuY19fKTsKICAgICAgICAgICAgIGlmIChnZXRTdGF0ZSgpID09IEFBVURJT19TVFJFQU1fU1RBVEVfRkxVU0hJTkcpIHsKICAgICAgICAgICAgICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX0ZMVVNIRUQpOwogICAgICAgICAgICAgICAgIG9uRmx1c2hGcm9tU2VydmVyKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBQVVESU9fU0VSVklDRV9FVkVOVF9DTE9TRUQ6Ci0gICAgICAgICAgICBBTE9HRCgiQXVkaW9TdHJlYW1JbnRlcm5hbDo6b25FdmVudEZyb21TZXJ2ZXIoKSBnb3QgQUFVRElPX1NFUlZJQ0VfRVZFTlRfQ0xPU0VEIik7Ci0gICAgICAgICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRCk7Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBQVVESU9fU0VSVklDRV9FVkVOVF9ESVNDT05ORUNURUQ6CiAgICAgICAgICAgICAvLyBQcmV2ZW50IGhhcmR3YXJlIGZyb20gbG9vcGluZyBvbiBvbGQgZGF0YSBhbmQgbWFraW5nIGJ1enppbmcgc291bmRzLgogICAgICAgICAgICAgaWYgKGdldERpcmVjdGlvbigpID09IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUKSB7CkBAIC00ODMsMTggKzUwNCwxOCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX0RJU0NPTk5FQ1RFRDsKICAgICAgICAgICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVEKTsKLSAgICAgICAgICAgIEFMT0dXKCJXQVJOSU5HIC0gQXVkaW9TdHJlYW1JbnRlcm5hbDo6b25FdmVudEZyb21TZXJ2ZXIoKSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIiBBQVVESU9fU0VSVklDRV9FVkVOVF9ESVNDT05ORUNURUQgLSBGSUZPIGNsZWFyZWQiKTsKKyAgICAgICAgICAgIEFMT0dXKCIlcyAtIEFBVURJT19TRVJWSUNFX0VWRU5UX0RJU0NPTk5FQ1RFRCAtIEZJRk8gY2xlYXJlZCIsIF9fZnVuY19fKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFBVURJT19TRVJWSUNFX0VWRU5UX1ZPTFVNRToKKyAgICAgICAgICAgIEFMT0dEKCIlcyAtIEFBVURJT19TRVJWSUNFX0VWRU5UX1ZPTFVNRSAlbGYiLCBfX2Z1bmNfXywgbWVzc2FnZS0+ZXZlbnQuZGF0YURvdWJsZSk7CiAgICAgICAgICAgICBtU3RyZWFtVm9sdW1lID0gKGZsb2F0KW1lc3NhZ2UtPmV2ZW50LmRhdGFEb3VibGU7CiAgICAgICAgICAgICBkb1NldFZvbHVtZSgpOwotICAgICAgICAgICAgQUxPR0QoIkF1ZGlvU3RyZWFtSW50ZXJuYWw6Om9uRXZlbnRGcm9tU2VydmVyKCkgQUFVRElPX1NFUlZJQ0VfRVZFTlRfVk9MVU1FICVsZiIsCi0gICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLT5ldmVudC5kYXRhRG91YmxlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFBVURJT19TRVJWSUNFX0VWRU5UX1hSVU46CisgICAgICAgICAgICBtWFJ1bkNvdW50ID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4obWVzc2FnZS0+ZXZlbnQuZGF0YUxvbmcpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HVygiV0FSTklORyAtIEF1ZGlvU3RyZWFtSW50ZXJuYWw6Om9uRXZlbnRGcm9tU2VydmVyKCkgVW5yZWNvZ25pemVkIGV2ZW50ID0gJWQiLAotICAgICAgICAgICAgICAgICAoaW50KSBtZXNzYWdlLT5ldmVudC5ldmVudCk7CisgICAgICAgICAgICBBTE9HRSgiJXMgLSBVbnJlY29nbml6ZWQgZXZlbnQgPSAlZCIsIF9fZnVuY19fLCAoaW50KSBtZXNzYWdlLT5ldmVudC5ldmVudCk7CiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTUxOSw4ICs1NDAsNyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIEFMT0dFKCJXQVJOSU5HIC0gZHJhaW5UaW1lc3RhbXBzRnJvbVNlcnZpY2UoKSBVbnJlY29nbml6ZWQgd2hhdCA9ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAoaW50KSBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgICAgIEFMT0dFKCIlcyAtIHVucmVjb2duaXplZCBtZXNzYWdlLndoYXQgPSAlZCIsIF9fZnVuY19fLCAoaW50KSBtZXNzYWdlLndoYXQpOwogICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9JTlRFUk5BTDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtNTMzLDcgKzU1Myw2IEBACiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKIAogICAgIHdoaWxlIChyZXN1bHQgPT0gQUFVRElPX09LKSB7Ci0gICAgICAgIC8vQUxPR0QoIkF1ZGlvU3RyZWFtSW50ZXJuYWw6OnByb2Nlc3NDb21tYW5kcygpIC0gbG9vcGluZywgJWQiLCByZXN1bHQpOwogICAgICAgICBBQXVkaW9TZXJ2aWNlTWVzc2FnZSBtZXNzYWdlOwogICAgICAgICBpZiAobUF1ZGlvRW5kcG9pbnQucmVhZFVwQ29tbWFuZCgmbWVzc2FnZSkgIT0gMSkgewogICAgICAgICAgICAgYnJlYWs7IC8vIG5vIGNvbW1hbmQgdGhpcyB0aW1lLCBubyBwcm9ibGVtCkBAIC01NTIsOCArNTcxLDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HRSgiV0FSTklORyAtIHByb2Nlc3NDb21tYW5kcygpIFVucmVjb2duaXplZCB3aGF0ID0gJWQiLAotICAgICAgICAgICAgICAgICAoaW50KSBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgQUxPR0UoIiVzIC0gdW5yZWNvZ25pemVkIG1lc3NhZ2Uud2hhdCA9ICVkIiwgX19mdW5jX18sIChpbnQpIG1lc3NhZ2Uud2hhdCk7CiAgICAgICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfSU5URVJOQUw7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtNjE0LDEzICs2MzIsMTMgQEAKICAgICAgICAgICAgIGlmICh3YWtlVGltZU5hbm9zID4gZGVhZGxpbmVOYW5vcykgewogICAgICAgICAgICAgICAgIC8vIElmIHdlIHRpbWUgb3V0LCBqdXN0IHJldHVybiB0aGUgZnJhbWVzV3JpdHRlbiBzbyBmYXIuCiAgICAgICAgICAgICAgICAgLy8gVE9ETyByZW1vdmUgYWZ0ZXIgd2UgZml4IHRoZSBkZWFkbGluZSBidWcKLSAgICAgICAgICAgICAgICBBTE9HVygiQXVkaW9TdHJlYW1JbnRlcm5hbDo6cHJvY2Vzc0RhdGEoKTogZW50ZXJlZCBhdCAlbGxkIG5hbm9zLCBjdXJyZW50bHkgJWxsZCIsCisgICAgICAgICAgICAgICAgQUxPR1coInByb2Nlc3NEYXRhKCk6IGVudGVyZWQgYXQgJWxsZCBuYW5vcywgY3VycmVudGx5ICVsbGQiLAogICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIGVudHJ5VGltZU5hbm9zLCAobG9uZyBsb25nKSBjdXJyZW50VGltZU5hbm9zKTsKLSAgICAgICAgICAgICAgICBBTE9HVygiQXVkaW9TdHJlYW1JbnRlcm5hbDo6cHJvY2Vzc0RhdGEoKTogVElNRU9VVCBhZnRlciAlbGxkIG5hbm9zIiwKKyAgICAgICAgICAgICAgICBBTE9HVygicHJvY2Vzc0RhdGEoKTogVElNRU9VVCBhZnRlciAlbGxkIG5hbm9zIiwKICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSB0aW1lb3V0TmFub3NlY29uZHMpOwotICAgICAgICAgICAgICAgIEFMT0dXKCJBdWRpb1N0cmVhbUludGVybmFsOjpwcm9jZXNzRGF0YSgpOiB3YWtlVGltZSA9ICVsbGQsIGRlYWRsaW5lID0gJWxsZCBuYW5vcyIsCisgICAgICAgICAgICAgICAgQUxPR1coInByb2Nlc3NEYXRhKCk6IHdha2VUaW1lID0gJWxsZCwgZGVhZGxpbmUgPSAlbGxkIG5hbm9zIiwKICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSB3YWtlVGltZU5hbm9zLCAobG9uZyBsb25nKSBkZWFkbGluZU5hbm9zKTsKLSAgICAgICAgICAgICAgICBBTE9HVygiQXVkaW9TdHJlYW1JbnRlcm5hbDo6cHJvY2Vzc0RhdGEoKTogcGFzdCBkZWFkbGluZSBieSAlZCBtaWNyb3MiLAorICAgICAgICAgICAgICAgIEFMT0dXKCJwcm9jZXNzRGF0YSgpOiBwYXN0IGRlYWRsaW5lIGJ5ICVkIG1pY3JvcyIsCiAgICAgICAgICAgICAgICAgICAgICAgKGludCkoKHdha2VUaW1lTmFub3MgLSBkZWFkbGluZU5hbm9zKSAvIEFBVURJT19OQU5PU19QRVJfTUlDUk9TRUNPTkQpKTsKICAgICAgICAgICAgICAgICBtQ2xvY2tNb2RlbC5kdW1wKCk7CiAgICAgICAgICAgICAgICAgbUF1ZGlvRW5kcG9pbnQuZHVtcCgpOwpAQCAtNjU1LDE0ICs2NzMsMjkgQEAKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6OnNldEJ1ZmZlclNpemUoaW50MzJfdCByZXF1ZXN0ZWRGcmFtZXMpIHsKKyAgICBpbnQzMl90IGFkanVzdGVkRnJhbWVzID0gcmVxdWVzdGVkRnJhbWVzOwogICAgIGludDMyX3QgYWN0dWFsRnJhbWVzID0gMDsKLSAgICAvLyBSb3VuZCB0byB0aGUgbmV4dCBoaWdoZXN0IGJ1cnN0IHNpemUuCi0gICAgaWYgKGdldEZyYW1lc1BlckJ1cnN0KCkgPiAwKSB7Ci0gICAgICAgIGludDMyX3QgbnVtQnVyc3RzID0gKHJlcXVlc3RlZEZyYW1lcyArIGdldEZyYW1lc1BlckJ1cnN0KCkgLSAxKSAvIGdldEZyYW1lc1BlckJ1cnN0KCk7Ci0gICAgICAgIHJlcXVlc3RlZEZyYW1lcyA9IG51bUJ1cnN0cyAqIGdldEZyYW1lc1BlckJ1cnN0KCk7CisgICAgaW50MzJfdCBtYXhpbXVtU2l6ZSA9IGdldEJ1ZmZlckNhcGFjaXR5KCk7CisKKyAgICAvLyBDbGlwIHRvIG1pbmltdW0gc2l6ZSBzbyB0aGF0IHJvdW5kaW5nIHVwIHdpbGwgd29yayBiZXR0ZXIuCisgICAgaWYgKGFkanVzdGVkRnJhbWVzIDwgMSkgeworICAgICAgICBhZGp1c3RlZEZyYW1lcyA9IDE7CiAgICAgfQogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IG1BdWRpb0VuZHBvaW50LnNldEJ1ZmZlclNpemVJbkZyYW1lcyhyZXF1ZXN0ZWRGcmFtZXMsICZhY3R1YWxGcmFtZXMpOworICAgIGlmIChhZGp1c3RlZEZyYW1lcyA+IG1heGltdW1TaXplKSB7CisgICAgICAgIC8vIENsaXAgdG8gbWF4aW11bSBzaXplLgorICAgICAgICBhZGp1c3RlZEZyYW1lcyA9IG1heGltdW1TaXplOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFJvdW5kIHRvIHRoZSBuZXh0IGhpZ2hlc3QgYnVyc3Qgc2l6ZS4KKyAgICAgICAgaW50MzJfdCBudW1CdXJzdHMgPSAoYWRqdXN0ZWRGcmFtZXMgKyBtRnJhbWVzUGVyQnVyc3QgLSAxKSAvIG1GcmFtZXNQZXJCdXJzdDsKKyAgICAgICAgYWRqdXN0ZWRGcmFtZXMgPSBudW1CdXJzdHMgKiBtRnJhbWVzUGVyQnVyc3Q7CisgICAgICAgIC8vIFJvdW5kaW5nIG1heSBoYXZlIGdvbmUgYWJvdmUgbWF4aW11bS4KKyAgICAgICAgaWYgKGFkanVzdGVkRnJhbWVzID4gbWF4aW11bVNpemUpIHsKKyAgICAgICAgICAgIGFkanVzdGVkRnJhbWVzID0gbWF4aW11bVNpemU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gbUF1ZGlvRW5kcG9pbnQuc2V0QnVmZmVyU2l6ZUluRnJhbWVzKGFkanVzdGVkRnJhbWVzLCAmYWN0dWFsRnJhbWVzKTsKICAgICBBTE9HRCgic2V0QnVmZmVyU2l6ZSgpIHJlcSA9ICVkID0+ICVkIiwgcmVxdWVzdGVkRnJhbWVzLCBhY3R1YWxGcmFtZXMpOwogICAgIGlmIChyZXN1bHQgPCAwKSB7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CkBAIC02ODAsNyArNzEzLDcgQEAKIH0KIAogaW50MzJfdCBBdWRpb1N0cmVhbUludGVybmFsOjpnZXRGcmFtZXNQZXJCdXJzdCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbUVuZHBvaW50RGVzY3JpcHRvci5kYXRhUXVldWVEZXNjcmlwdG9yLmZyYW1lc1BlckJ1cnN0OworICAgIHJldHVybiBtRnJhbWVzUGVyQnVyc3Q7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpqb2luVGhyZWFkKHZvaWQqKiByZXR1cm5BcmcpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuaAppbmRleCA0NzAyNGMwLi4wNDI1Y2Q1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5oCkBAIC0zNCw2ICszNCwxMiBAQAogCiBuYW1lc3BhY2UgYWF1ZGlvIHsKIAorICAgIC8vIFRoZXNlIGFyZSBpbnRlbmRlZCB0byBiZSBvdXRzaWRlIHRoZSByYW5nZSBvZiB3aGF0IGlzIG5vcm1hbGx5IGVuY291bnRlcmVkLgorICAgIC8vIFRPRE8gTUFYZXMgc2hvdWxkIHByb2JhYmx5IGJlIG11Y2ggYmlnZ2VyLgorICAgIGNvbnN0ZXhwciBpbnQzMl90IE1JTl9GUkFNRVNfUEVSX0JVUlNUID0gMTY7IC8vIGFyYml0cmFyeQorICAgIGNvbnN0ZXhwciBpbnQzMl90IE1BWF9GUkFNRVNfUEVSX0JVUlNUID0gMTYgKiAxMDI0OyAgLy8gYXJiaXRyYXJ5CisgICAgY29uc3RleHByIGludDMyX3QgTUFYX0JVRkZFUl9DQVBBQ0lUWV9JTl9GUkFNRVMgPSAzMiAqIDEwMjQ7ICAvLyBhcmJpdHJhcnkKKwogLy8gQSBzdHJlYW0gdGhhdCB0YWxrcyB0byB0aGUgQUF1ZGlvU2VydmljZSBvciBkaXJlY3RseSB0byBhIEhBTC4KIGNsYXNzIEF1ZGlvU3RyZWFtSW50ZXJuYWwgOiBwdWJsaWMgQXVkaW9TdHJlYW0gewogCkBAIC0xMTUsOCArMTIxLDYgQEAKIAogICAgIGFhdWRpb19yZXN1bHRfdCBwcm9jZXNzQ29tbWFuZHMoKTsKIAotICAgIGFhdWRpb19yZXN1bHRfdCByZXF1ZXN0U3RvcEludGVybmFsKCk7Ci0KICAgICBhYXVkaW9fcmVzdWx0X3Qgc3RvcENhbGxiYWNrKCk7CiAKICAgICB2aXJ0dWFsIHZvaWQgYWR2YW5jZUNsaWVudFRvTWF0Y2hTZXJ2ZXJQb3NpdGlvbigpID0gMDsKQEAgLTEzNCwxNCArMTM4LDE5IEBACiAgICAgLy8gQ2FsY3VsYXRlIHRpbWVvdXQgZm9yIGFuIG9wZXJhdGlvbiBpbnZvbHZpbmcgZnJhbWVzUGVyT3BlcmF0aW9uLgogICAgIGludDY0X3QgY2FsY3VsYXRlUmVhc29uYWJsZVRpbWVvdXQoaW50MzJfdCBmcmFtZXNQZXJPcGVyYXRpb24pOwogCi0gICAgYWF1ZGlvX2Zvcm1hdF90ICAgICAgICAgIG1EZXZpY2VGb3JtYXQgPSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEOworICAgIGludDMyX3QgZ2V0RGV2aWNlQ2hhbm5lbENvdW50KCkgY29uc3QgeyByZXR1cm4gbURldmljZUNoYW5uZWxDb3VudDsgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0cnVlIGlmIHJ1bm5pbmcgaW4gYXVkaW8gc2VydmljZSwgdmVyc3VzIGluIGFwcCBwcm9jZXNzCisgICAgICovCisgICAgYm9vbCBpc0luU2VydmljZSgpIGNvbnN0IHsgcmV0dXJuIG1JblNlcnZpY2U7IH0KIAogICAgIElzb2Nocm9ub3VzQ2xvY2tNb2RlbCAgICBtQ2xvY2tNb2RlbDsgICAgICAvLyB0aW1pbmcgbW9kZWwgZm9yIGNoYXNpbmcgdGhlIEhBTAogCiAgICAgQXVkaW9FbmRwb2ludCAgICAgICAgICAgIG1BdWRpb0VuZHBvaW50OyAgIC8vIHNvdXJjZSBmb3IgcmVhZHMgb3Igc2luayBmb3Igd3JpdGVzCiAgICAgYWF1ZGlvX2hhbmRsZV90ICAgICAgICAgIG1TZXJ2aWNlU3RyZWFtSGFuZGxlOyAvLyBvcGFxdWUgaGFuZGxlIHJldHVybmVkIGZyb20gc2VydmljZQogCi0gICAgaW50MzJfdCAgICAgICAgICAgICAgICAgIG1GcmFtZXNQZXJCdXJzdDsgICAgIC8vIGZyYW1lcyBwZXIgSEFMIHRyYW5zZmVyCisgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgIG1GcmFtZXNQZXJCdXJzdCA9IE1JTl9GUkFNRVNfUEVSX0JVUlNUOyAvLyBmcmFtZXMgcGVyIEhBTCB0cmFuc2ZlcgogICAgIGludDMyX3QgICAgICAgICAgICAgICAgICBtWFJ1bkNvdW50ID0gMDsgICAgICAvLyBob3cgbWFueSB1bmRlcnJ1biBldmVudHM/CiAKICAgICAvLyBPZmZzZXQgZnJvbSB1bmRlcmx5aW5nIGZyYW1lIHBvc2l0aW9uLgpAQCAtMTgzLDYgKzE5Miw4IEBACiAgICAgRW5kcG9pbnREZXNjcmlwdG9yICAgICAgIG1FbmRwb2ludERlc2NyaXB0b3I7IC8vIGJ1ZmZlciBkZXNjcmlwdGlvbiB3aXRoIHJlc29sdmVkIGFkZHJlc3NlcwogCiAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlTGF0ZW5jeU5hbm9zID0gMDsKKworICAgIGludDMyX3QgICAgICAgICAgICAgICAgICBtRGV2aWNlQ2hhbm5lbENvdW50ID0gMDsKIH07CiAKIH0gLyogbmFtZXNwYWNlIGFhdWRpbyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuY3BwCmluZGV4IGI3OTJlY2QuLjA3MTlmZTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5jcHAKQEAgLTE0LDcgKzE0LDggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNkZWZpbmUgTE9HX1RBRyAobUluU2VydmljZSA/ICJBQXVkaW9TZXJ2aWNlIiA6ICJBQXVkaW8iKQorI2RlZmluZSBMT0dfVEFHIChtSW5TZXJ2aWNlID8gIkF1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlX1NlcnZpY2UiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmVfQ2xpZW50IikKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIApAQCAtMTAxLDcgKzEwMiw4IEBACiAgICAgfQogCiAgICAgLy8gSWYgdGhlIHdyaXRlIGluZGV4IHBhc3NlZCB0aGUgcmVhZCBpbmRleCB0aGVuIGNvbnNpZGVyIGl0IGFuIG92ZXJydW4uCi0gICAgaWYgKG1BdWRpb0VuZHBvaW50LmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCkgPCAwKSB7CisgICAgLy8gRm9yIHNoYXJlZCBzdHJlYW1zLCB0aGUgeFJ1bkNvdW50IGlzIHBhc3NlZCB1cCBmcm9tIHRoZSBzZXJ2aWNlLgorICAgIGlmIChtQXVkaW9FbmRwb2ludC5pc0ZyZWVSdW5uaW5nKCkgJiYgbUF1ZGlvRW5kcG9pbnQuZ2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKSA8IDApIHsKICAgICAgICAgbVhSdW5Db3VudCsrOwogICAgICAgICBpZiAoQVRSQUNFX0VOQUJMRUQoKSkgewogICAgICAgICAgICAgQVRSQUNFX0lOVCgiYWFPdmVyUnVucyIsIG1YUnVuQ291bnQpOwpAQCAtMTUyLDcgKzE1NCw3IEBACiAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZTo6cmVhZE5vd1dpdGhDb252ZXJzaW9uKHZvaWQgKmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcykgewotICAgIC8vIEFMT0dEKCJBdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZTo6cmVhZE5vd1dpdGhDb252ZXJzaW9uKCVwLCAlZCkiLAorICAgIC8vIEFMT0dEKCJyZWFkTm93V2l0aENvbnZlcnNpb24oJXAsICVkKSIsCiAgICAgLy8gICAgICAgICAgICAgIGJ1ZmZlciwgbnVtRnJhbWVzKTsKICAgICBXcmFwcGluZ0J1ZmZlciB3cmFwcGluZ0J1ZmZlcjsKICAgICB1aW50OF90ICpkZXN0aW5hdGlvbiA9ICh1aW50OF90ICopIGJ1ZmZlcjsKQEAgLTE3NCwxNiArMTc2LDE2IEBACiAgICAgICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1RvUHJvY2VzcyAqIGdldFNhbXBsZXNQZXJGcmFtZSgpOwogCiAgICAgICAgIC8vIFRPRE8gZmFjdG9yIHRoaXMgb3V0IGludG8gYSB1dGlsaXR5IGZ1bmN0aW9uCi0gICAgICAgIGlmIChtRGV2aWNlRm9ybWF0ID09IGdldEZvcm1hdCgpKSB7CisgICAgICAgIGlmIChnZXREZXZpY2VGb3JtYXQoKSA9PSBnZXRGb3JtYXQoKSkgewogICAgICAgICAgICAgbWVtY3B5KGRlc3RpbmF0aW9uLCB3cmFwcGluZ0J1ZmZlci5kYXRhW3BhcnRJbmRleF0sIG51bUJ5dGVzKTsKLSAgICAgICAgfSBlbHNlIGlmIChtRGV2aWNlRm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0kxNgorICAgICAgICB9IGVsc2UgaWYgKGdldERldmljZUZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfUENNX0kxNgogICAgICAgICAgICAgICAgICAgICYmIGdldEZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7CiAgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X3BjbTE2VG9GbG9hdCgKICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGludDE2X3QgKikgd3JhcHBpbmdCdWZmZXIuZGF0YVtwYXJ0SW5kZXhdLAogICAgICAgICAgICAgICAgICAgICAoZmxvYXQgKikgZGVzdGluYXRpb24sCiAgICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMsCiAgICAgICAgICAgICAgICAgICAgIDEuMGYpOwotICAgICAgICB9IGVsc2UgaWYgKG1EZXZpY2VGb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQKKyAgICAgICAgfSBlbHNlIGlmIChnZXREZXZpY2VGb3JtYXQoKSA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVAogICAgICAgICAgICAgICAgICAgICYmIGdldEZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfUENNX0kxNikgewogICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9mbG9hdFRvUGNtMTYoCiAgICAgICAgICAgICAgICAgICAgIChjb25zdCBmbG9hdCAqKSB3cmFwcGluZ0J1ZmZlci5kYXRhW3BhcnRJbmRleF0sCkBAIC0yMDEsNyArMjAzLDcgQEAKICAgICBpbnQzMl90IGZyYW1lc1Byb2Nlc3NlZCA9IG51bUZyYW1lcyAtIGZyYW1lc0xlZnQ7CiAgICAgbUF1ZGlvRW5kcG9pbnQuYWR2YW5jZVJlYWRJbmRleChmcmFtZXNQcm9jZXNzZWQpOwogCi0gICAgLy9BTE9HRCgiQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmU6OnJlYWROb3dXaXRoQ29udmVyc2lvbigpIHJldHVybnMgJWQiLCBmcmFtZXNQcm9jZXNzZWQpOworICAgIC8vQUxPR0QoInJlYWROb3dXaXRoQ29udmVyc2lvbigpIHJldHVybnMgJWQiLCBmcmFtZXNQcm9jZXNzZWQpOwogICAgIHJldHVybiBmcmFtZXNQcm9jZXNzZWQ7CiB9CiAKQEAgLTIxNSwxNCArMjE3LDE0IEBACiAgICAgLy8gUHJldmVudCByZXRyb2dyYWRlIG1vdGlvbi4KICAgICBtTGFzdEZyYW1lc1dyaXR0ZW4gPSBzdGQ6Om1heChtTGFzdEZyYW1lc1dyaXR0ZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzV3JpdHRlbkhhcmR3YXJlICsgbUZyYW1lc09mZnNldEZyb21TZXJ2aWNlKTsKLSAgICAvL0FMT0dEKCJBdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZTo6Z2V0RnJhbWVzV3JpdHRlbigpIHJldHVybnMgJWxsZCIsCisgICAgLy9BTE9HRCgiZ2V0RnJhbWVzV3JpdHRlbigpIHJldHVybnMgJWxsZCIsCiAgICAgLy8gICAgICAobG9uZyBsb25nKW1MYXN0RnJhbWVzV3JpdHRlbik7CiAgICAgcmV0dXJuIG1MYXN0RnJhbWVzV3JpdHRlbjsKIH0KIAogaW50NjRfdCBBdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZTo6Z2V0RnJhbWVzUmVhZCgpIHsKICAgICBpbnQ2NF90IGZyYW1lcyA9IG1BdWRpb0VuZHBvaW50LmdldERhdGFSZWFkQ291bnRlcigpICsgbUZyYW1lc09mZnNldEZyb21TZXJ2aWNlOwotICAgIC8vQUxPR0QoIkF1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlOjpnZXRGcmFtZXNSZWFkKCkgcmV0dXJucyAlbGxkIiwgKGxvbmcgbG9uZylmcmFtZXMpOworICAgIC8vQUxPR0QoImdldEZyYW1lc1JlYWQoKSByZXR1cm5zICVsbGQiLCAobG9uZyBsb25nKWZyYW1lcyk7CiAgICAgcmV0dXJuIGZyYW1lczsKIH0KIApAQCAtMjMwLDggKzIzMiw3IEBACiB2b2lkICpBdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZTo6Y2FsbGJhY2tMb29wKCkgewogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CiAgICAgYWF1ZGlvX2RhdGFfY2FsbGJhY2tfcmVzdWx0X3QgY2FsbGJhY2tSZXN1bHQgPSBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX0NPTlRJTlVFOwotICAgIEFBdWRpb1N0cmVhbV9kYXRhQ2FsbGJhY2sgYXBwQ2FsbGJhY2sgPSBnZXREYXRhQ2FsbGJhY2tQcm9jKCk7Ci0gICAgaWYgKGFwcENhbGxiYWNrID09IG51bGxwdHIpIHJldHVybiBOVUxMOworICAgIGlmICghaXNEYXRhQ2FsbGJhY2tTZXQoKSkgcmV0dXJuIE5VTEw7CiAKICAgICAvLyByZXN1bHQgbWlnaHQgYmUgYSBmcmFtZSBjb3VudAogICAgIHdoaWxlIChtQ2FsbGJhY2tFbmFibGVkLmxvYWQoKSAmJiBpc0FjdGl2ZSgpICYmIChyZXN1bHQgPj0gMCkpIHsKQEAgLTI0MiwzNSArMjQzLDI1IEBACiAgICAgICAgIC8vIFRoaXMgaXMgYSBCTE9DS0lORyBSRUFEIQogICAgICAgICByZXN1bHQgPSByZWFkKG1DYWxsYmFja0J1ZmZlciwgbUNhbGxiYWNrRnJhbWVzLCB0aW1lb3V0TmFub3MpOwogICAgICAgICBpZiAoKHJlc3VsdCAhPSBtQ2FsbGJhY2tGcmFtZXMpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUoKTogY2FsbGJhY2tMb29wOiByZWFkKCkgcmV0dXJuZWQgJWQiLCByZXN1bHQpOworICAgICAgICAgICAgQUxPR0UoImNhbGxiYWNrTG9vcDogcmVhZCgpIHJldHVybmVkICVkIiwgcmVzdWx0KTsKICAgICAgICAgICAgIGlmIChyZXN1bHQgPj0gMCkgewogICAgICAgICAgICAgICAgIC8vIE9ubHkgcmVhZCBzb21lIG9mIHRoZSBmcmFtZXMgcmVxdWVzdGVkLiBNdXN0IGhhdmUgdGltZWQgb3V0LgogICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9USU1FT1VUOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgQUF1ZGlvU3RyZWFtX2Vycm9yQ2FsbGJhY2sgZXJyb3JDYWxsYmFjayA9IGdldEVycm9yQ2FsbGJhY2tQcm9jKCk7Ci0gICAgICAgICAgICBpZiAoZXJyb3JDYWxsYmFjayAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgKCplcnJvckNhbGxiYWNrKSgKLSAgICAgICAgICAgICAgICAgICAgICAgIChBQXVkaW9TdHJlYW0gKikgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEVycm9yQ2FsbGJhY2tVc2VyRGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1heWJlQ2FsbEVycm9yQ2FsbGJhY2socmVzdWx0KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgLy8gQ2FsbCBhcHBsaWNhdGlvbiB1c2luZyB0aGUgQUF1ZGlvIGNhbGxiYWNrIGludGVyZmFjZS4KLSAgICAgICAgY2FsbGJhY2tSZXN1bHQgPSAoKmFwcENhbGxiYWNrKSgKLSAgICAgICAgICAgICAgICAoQUF1ZGlvU3RyZWFtICopIHRoaXMsCi0gICAgICAgICAgICAgICAgZ2V0RGF0YUNhbGxiYWNrVXNlckRhdGEoKSwKLSAgICAgICAgICAgICAgICBtQ2FsbGJhY2tCdWZmZXIsCi0gICAgICAgICAgICAgICAgbUNhbGxiYWNrRnJhbWVzKTsKKyAgICAgICAgY2FsbGJhY2tSZXN1bHQgPSBtYXliZUNhbGxEYXRhQ2FsbGJhY2sobUNhbGxiYWNrQnVmZmVyLCBtQ2FsbGJhY2tGcmFtZXMpOwogCiAgICAgICAgIGlmIChjYWxsYmFja1Jlc3VsdCA9PSBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1ApIHsKLSAgICAgICAgICAgIEFMT0dEKCJBdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZSgpOiBjYWxsYmFjayByZXR1cm5lZCBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1AiKTsKKyAgICAgICAgICAgIEFMT0dEKCJjYWxsYmFjayByZXR1cm5lZCBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1AiKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogCi0gICAgQUxPR0QoIkF1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlKCk6IGNhbGxiYWNrTG9vcCgpIGV4aXRpbmcsIHJlc3VsdCA9ICVkLCBpc0FjdGl2ZSgpID0gJWQiLAorICAgIEFMT0dEKCJjYWxsYmFja0xvb3AoKSBleGl0aW5nLCByZXN1bHQgPSAlZCwgaXNBY3RpdmUoKSA9ICVkIiwKICAgICAgICAgICByZXN1bHQsIChpbnQpIGlzQWN0aXZlKCkpOwogICAgIHJldHVybiBOVUxMOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuY3BwCmluZGV4IDFlMDJlZWUuLjc5NWJhMmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5jcHAKQEAgLTE0LDcgKzE0LDggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNkZWZpbmUgTE9HX1RBRyAobUluU2VydmljZSA/ICJBQXVkaW9TZXJ2aWNlIiA6ICJBQXVkaW8iKQorI2RlZmluZSBMT0dfVEFHIChtSW5TZXJ2aWNlID8gIkF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5X1NlcnZpY2UiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXlfQ2xpZW50IikKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIApAQCAtMzcsMTIgKzM4LDI2IEBACiAKIEF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5Ojp+QXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkoKSB7fQogCitjb25zdGV4cHIgaW50IGtSYW1wTVNlYyA9IDEwOyAvLyB0aW1lIHRvIGFwcGx5IGEgY2hhbmdlIGluIHZvbHVtZQogCi1hYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXk6OnJlcXVlc3RQYXVzZUludGVybmFsKCkKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsUGxheTo6b3Blbihjb25zdCBBdWRpb1N0cmVhbUJ1aWxkZXIgJmJ1aWxkZXIpIHsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQXVkaW9TdHJlYW1JbnRlcm5hbDo6b3BlbihidWlsZGVyKTsKKyAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgeworICAgICAgICAvLyBTYW1wbGUgcmF0ZSBpcyBjb25zdHJhaW5lZCB0byBjb21tb24gdmFsdWVzIGJ5IG5vdyBhbmQgc2hvdWxkIG5vdCBvdmVyZmxvdy4KKyAgICAgICAgaW50MzJfdCBudW1GcmFtZXMgPSBrUmFtcE1TZWMgKiBnZXRTYW1wbGVSYXRlKCkgLyBBQVVESU9fTUlMTElTX1BFUl9TRUNPTkQ7CisgICAgICAgIG1Wb2x1bWVSYW1wLnNldExlbmd0aEluRnJhbWVzKG51bUZyYW1lcyk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsUGxheTo6cmVxdWVzdFBhdXNlKCkKIHsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gc3RvcENhbGxiYWNrKCk7CisgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CiAgICAgaWYgKG1TZXJ2aWNlU3RyZWFtSGFuZGxlID09IEFBVURJT19IQU5ETEVfSU5WQUxJRCkgewotICAgICAgICBBTE9HRSgiQXVkaW9TdHJlYW1JbnRlcm5hbDo6cmVxdWVzdFBhdXNlSW50ZXJuYWwoKSBtU2VydmljZVN0cmVhbUhhbmRsZSBpbnZhbGlkID0gMHglMDhYIiwKLSAgICAgICAgICAgICAgbVNlcnZpY2VTdHJlYW1IYW5kbGUpOworICAgICAgICBBTE9HRSgiJXMoKSBtU2VydmljZVN0cmVhbUhhbmRsZSBpbnZhbGlkIiwgX19mdW5jX18pOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogCkBAIC01MiwyMCArNjcsOSBAQAogICAgIHJldHVybiBtU2VydmljZUludGVyZmFjZS5wYXVzZVN0cmVhbShtU2VydmljZVN0cmVhbUhhbmRsZSk7CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsUGxheTo6cmVxdWVzdFBhdXNlKCkKLXsKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gc3RvcENhbGxiYWNrKCk7Ci0gICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgcmVzdWx0ID0gcmVxdWVzdFBhdXNlSW50ZXJuYWwoKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXk6OnJlcXVlc3RGbHVzaCgpIHsKICAgICBpZiAobVNlcnZpY2VTdHJlYW1IYW5kbGUgPT0gQUFVRElPX0hBTkRMRV9JTlZBTElEKSB7Ci0gICAgICAgIEFMT0dFKCJBdWRpb1N0cmVhbUludGVybmFsOjpyZXF1ZXN0Rmx1c2goKSBtU2VydmljZVN0cmVhbUhhbmRsZSBpbnZhbGlkID0gMHglMDhYIiwKLSAgICAgICAgICAgICAgbVNlcnZpY2VTdHJlYW1IYW5kbGUpOworICAgICAgICBBTE9HRSgiJXMoKSBtU2VydmljZVN0cmVhbUhhbmRsZSBpbnZhbGlkIiwgX19mdW5jX18pOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogCkBAIC04MCw3ICs4NCw3IEBACiAgICAgLy8gQnVtcCBvZmZzZXQgc28gY2FsbGVyIGRvZXMgbm90IHNlZSB0aGUgcmV0cm9ncmFkZSBtb3Rpb24gaW4gZ2V0RnJhbWVzUmVhZCgpLgogICAgIGludDY0X3Qgb2Zmc2V0ID0gd3JpdGVDb3VudGVyIC0gcmVhZENvdW50ZXI7CiAgICAgbUZyYW1lc09mZnNldEZyb21TZXJ2aWNlICs9IG9mZnNldDsKLSAgICBBTE9HRCgiYWR2YW5jZUNsaWVudFRvTWF0Y2hTZXJ2ZXJQb3NpdGlvbigpIHJlYWROID0gJWxsZCwgd3JpdGVOID0gJWxsZCwgb2Zmc2V0ID0gJWxsZCIsCisgICAgQUxPR1YoIiVzKCkgcmVhZE4gPSAlbGxkLCB3cml0ZU4gPSAlbGxkLCBvZmZzZXQgPSAlbGxkIiwgX19mdW5jX18sCiAgICAgICAgICAgKGxvbmcgbG9uZylyZWFkQ291bnRlciwgKGxvbmcgbG9uZyl3cml0ZUNvdW50ZXIsIChsb25nIGxvbmcpbUZyYW1lc09mZnNldEZyb21TZXJ2aWNlKTsKIAogICAgIC8vIEZvcmNlIHdyaXRlQ291bnRlciB0byBtYXRjaCByZWFkQ291bnRlci4KQEAgLTk0LDkgKzk4LDcgQEAKIAogLy8gV3JpdGUgdGhlIGRhdGEsIGJsb2NrIGlmIG5lZWRlZCBhbmQgdGltZW91dE1pbGxpcyA+IDAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsUGxheTo6d3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVvdXROYW5vc2Vjb25kcykKLQoteworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVvdXROYW5vc2Vjb25kcykgewogICAgIHJldHVybiBwcm9jZXNzRGF0YSgodm9pZCAqKWJ1ZmZlciwgbnVtRnJhbWVzLCB0aW1lb3V0TmFub3NlY29uZHMpOwogfQogCkBAIC0xMTUsNyArMTE3LDcgQEAKICAgICAgICAgLy8gU3RpbGwgaGF2ZW4ndCBnb3QgYW55IHRpbWVzdGFtcHMgZnJvbSBzZXJ2ZXIuCiAgICAgICAgIC8vIEtlZXAgd2FpdGluZyB1bnRpbCB3ZSBnZXQgc29tZSB2YWxpZCB0aW1lc3RhbXBzIHRoZW4gc3RhcnQgd3JpdGluZyB0byB0aGUKICAgICAgICAgLy8gY3VycmVudCBidWZmZXIgcG9zaXRpb24uCi0gICAgICAgIEFMT0dEKCJwcm9jZXNzRGF0YU5vdygpIHdhaXQgZm9yIHZhbGlkIHRpbWVzdGFtcHMiKTsKKyAgICAgICAgQUxPR1YoIiVzKCkgd2FpdCBmb3IgdmFsaWQgdGltZXN0YW1wcyIsIF9fZnVuY19fKTsKICAgICAgICAgLy8gU2xlZXAgdmVyeSBicmllZmx5IGFuZCBob3BlIHdlIGdldCBhIHRpbWVzdGFtcCBzb29uLgogICAgICAgICAqd2FrZVRpbWVQdHIgPSBjdXJyZW50TmFub1RpbWUgKyAoMjAwMCAqIEFBVURJT19OQU5PU19QRVJfTUlDUk9TRUNPTkQpOwogICAgICAgICBBVFJBQ0VfRU5EKCk7CkBAIC0xMzksNyArMTQxLDggQEAKICAgICB9CiAKICAgICAvLyBJZiB0aGUgcmVhZCBpbmRleCBwYXNzZWQgdGhlIHdyaXRlIGluZGV4IHRoZW4gY29uc2lkZXIgaXQgYW4gdW5kZXJydW4uCi0gICAgaWYgKG1BdWRpb0VuZHBvaW50LmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKSA8IDApIHsKKyAgICAvLyBGb3Igc2hhcmVkIHN0cmVhbXMsIHRoZSB4UnVuQ291bnQgaXMgcGFzc2VkIHVwIGZyb20gdGhlIHNlcnZpY2UuCisgICAgaWYgKG1BdWRpb0VuZHBvaW50LmlzRnJlZVJ1bm5pbmcoKSAmJiBtQXVkaW9FbmRwb2ludC5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCkgPCAwKSB7CiAgICAgICAgIG1YUnVuQ291bnQrKzsKICAgICAgICAgaWYgKEFUUkFDRV9FTkFCTEVEKCkpIHsKICAgICAgICAgICAgIEFUUkFDRV9JTlQoImFhVW5kZXJSdW5zIiwgbVhSdW5Db3VudCk7CkBAIC0xOTYsMTAgKzE5OSw4IEBACiAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsUGxheTo6d3JpdGVOb3dXaXRoQ29udmVyc2lvbihjb25zdCB2b2lkICpidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcykgewotICAgIC8vIEFMT0dEKCJBdWRpb1N0cmVhbUludGVybmFsOjp3cml0ZU5vd1dpdGhDb252ZXJzaW9uKCVwLCAlZCkiLAotICAgIC8vICAgICAgICAgICAgICBidWZmZXIsIG51bUZyYW1lcyk7CiAgICAgV3JhcHBpbmdCdWZmZXIgd3JhcHBpbmdCdWZmZXI7Ci0gICAgdWludDhfdCAqc291cmNlID0gKHVpbnQ4X3QgKikgYnVmZmVyOworICAgIHVpbnQ4X3QgKmJ5dGVCdWZmZXIgPSAodWludDhfdCAqKSBidWZmZXI7CiAgICAgaW50MzJfdCBmcmFtZXNMZWZ0ID0gbnVtRnJhbWVzOwogCiAgICAgbUF1ZGlvRW5kcG9pbnQuZ2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoJndyYXBwaW5nQnVmZmVyKTsKQEAgLTIxMyw3MCArMjE0LDI2IEBACiAgICAgICAgICAgICBpZiAoZnJhbWVzVG9Xcml0ZSA+IGZyYW1lc0F2YWlsYWJsZSkgewogICAgICAgICAgICAgICAgIGZyYW1lc1RvV3JpdGUgPSBmcmFtZXNBdmFpbGFibGU7CiAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGludDMyX3QgbnVtQnl0ZXMgPSBnZXRCeXRlc1BlckZyYW1lKCkgKiBmcmFtZXNUb1dyaXRlOwotICAgICAgICAgICAgaW50MzJfdCBudW1TYW1wbGVzID0gZnJhbWVzVG9Xcml0ZSAqIGdldFNhbXBsZXNQZXJGcmFtZSgpOwogICAgICAgICAgICAgLy8gRGF0YSBjb252ZXJzaW9uLgogICAgICAgICAgICAgZmxvYXQgbGV2ZWxGcm9tOwogICAgICAgICAgICAgZmxvYXQgbGV2ZWxUbzsKLSAgICAgICAgICAgIGJvb2wgcmFtcGluZyA9IG1Wb2x1bWVSYW1wLm5leHRTZWdtZW50KGZyYW1lc1RvV3JpdGUgKiBnZXRTYW1wbGVzUGVyRnJhbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZXZlbEZyb20sICZsZXZlbFRvKTsKLSAgICAgICAgICAgIC8vIFRoZSBmb3JtYXRzIGFyZSB2YWxpZGF0ZWQgd2hlbiB0aGUgc3RyZWFtIGlzIG9wZW5lZCBzbyB3ZSBkbyBub3QgaGF2ZSB0bwotICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGlsbGVnYWwgY29tYmluYXRpb25zIGhlcmUuCi0gICAgICAgICAgICAvLyBUT0RPIGZhY3RvciB0aGlzIG91dCBpbnRvIGEgdXRpbGl0eSBmdW5jdGlvbgotICAgICAgICAgICAgaWYgKGdldEZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1EZXZpY2VGb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKLSAgICAgICAgICAgICAgICAgICAgQUF1ZGlvX2xpbmVhclJhbXAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICopIHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQgKikgd3JhcHBpbmdCdWZmZXIuZGF0YVtwYXJ0SW5kZXhdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc1RvV3JpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2FtcGxlc1BlckZyYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxGcm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobURldmljZUZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJhbXBpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfZmxvYXRUb1BjbTE2KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZmxvYXQgKikgc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MTZfdCAqKSB3cmFwcGluZ0J1ZmZlci5kYXRhW3BhcnRJbmRleF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc1RvV3JpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFNhbXBsZXNQZXJGcmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9mbG9hdFRvUGNtMTYoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBmbG9hdCAqKSBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQxNl90ICopIHdyYXBwaW5nQnVmZmVyLmRhdGFbcGFydEluZGV4XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGdldEZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfUENNX0kxNikgewotICAgICAgICAgICAgICAgIGlmIChtRGV2aWNlRm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyYW1waW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X3BjbTE2VG9GbG9hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGludDE2X3QgKikgc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQgKikgd3JhcHBpbmdCdWZmZXIuZGF0YVtwYXJ0SW5kZXhdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNUb1dyaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTYW1wbGVzUGVyRnJhbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxGcm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfcGNtMTZUb0Zsb2F0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgaW50MTZfdCAqKSBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCAqKSB3cmFwcGluZ0J1ZmZlci5kYXRhW3BhcnRJbmRleF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtRGV2aWNlRm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0kxNikgewotICAgICAgICAgICAgICAgICAgICBBQXVkaW9fbGluZWFyUmFtcCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgaW50MTZfdCAqKSBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDE2X3QgKikgd3JhcHBpbmdCdWZmZXIuZGF0YVtwYXJ0SW5kZXhdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc1RvV3JpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2FtcGxlc1BlckZyYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxGcm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNvdXJjZSArPSBudW1CeXRlczsKKyAgICAgICAgICAgIG1Wb2x1bWVSYW1wLm5leHRTZWdtZW50KGZyYW1lc1RvV3JpdGUsICZsZXZlbEZyb20sICZsZXZlbFRvKTsKKworICAgICAgICAgICAgQUF1ZGlvRGF0YUNvbnZlcnRlcjo6Rm9ybWF0dGVkRGF0YSBzb3VyY2UoCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopYnl0ZUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgZ2V0Rm9ybWF0KCksCisgICAgICAgICAgICAgICAgICAgIGdldFNhbXBsZXNQZXJGcmFtZSgpKTsKKyAgICAgICAgICAgIEFBdWRpb0RhdGFDb252ZXJ0ZXI6OkZvcm1hdHRlZERhdGEgZGVzdGluYXRpb24oCisgICAgICAgICAgICAgICAgICAgIHdyYXBwaW5nQnVmZmVyLmRhdGFbcGFydEluZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlRm9ybWF0KCksCisgICAgICAgICAgICAgICAgICAgIGdldERldmljZUNoYW5uZWxDb3VudCgpKTsKKworICAgICAgICAgICAgQUF1ZGlvRGF0YUNvbnZlcnRlcjo6Y29udmVydChzb3VyY2UsIGRlc3RpbmF0aW9uLCBmcmFtZXNUb1dyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sIGxldmVsVG8pOworCisgICAgICAgICAgICBieXRlQnVmZmVyICs9IG51bUJ5dGVzOwogICAgICAgICAgICAgZnJhbWVzTGVmdCAtPSBmcmFtZXNUb1dyaXRlOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgYnJlYWs7CkBAIC0yODYsNyArMjQzLDYgQEAKICAgICBpbnQzMl90IGZyYW1lc1dyaXR0ZW4gPSBudW1GcmFtZXMgLSBmcmFtZXNMZWZ0OwogICAgIG1BdWRpb0VuZHBvaW50LmFkdmFuY2VXcml0ZUluZGV4KGZyYW1lc1dyaXR0ZW4pOwogCi0gICAgLy8gQUxPR0QoIkF1ZGlvU3RyZWFtSW50ZXJuYWw6OndyaXRlTm93V2l0aENvbnZlcnNpb24oKSByZXR1cm5zICVkIiwgZnJhbWVzV3JpdHRlbik7CiAgICAgcmV0dXJuIGZyYW1lc1dyaXR0ZW47CiB9CiAKQEAgLTMwNSw3ICsyNjEsNiBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIG1MYXN0RnJhbWVzUmVhZCA9IGZyYW1lc1JlYWQ7CiAgICAgfQotICAgIC8vQUxPR0QoIkF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5OjpnZXRGcmFtZXNSZWFkKCkgcmV0dXJucyAlbGxkIiwgKGxvbmcgbG9uZylmcmFtZXNSZWFkKTsKICAgICByZXR1cm4gZnJhbWVzUmVhZDsKIH0KIApAQCAtMzEzLDYwICsyNjgsNTEgQEAKIHsKICAgICBpbnQ2NF90IGZyYW1lc1dyaXR0ZW4gPSBtQXVkaW9FbmRwb2ludC5nZXREYXRhV3JpdGVDb3VudGVyKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1GcmFtZXNPZmZzZXRGcm9tU2VydmljZTsKLSAgICAvL0FMT0dEKCJBdWRpb1N0cmVhbUludGVybmFsUGxheTo6Z2V0RnJhbWVzV3JpdHRlbigpIHJldHVybnMgJWxsZCIsIChsb25nIGxvbmcpZnJhbWVzV3JpdHRlbik7CiAgICAgcmV0dXJuIGZyYW1lc1dyaXR0ZW47CiB9CiAKIAogLy8gUmVuZGVyIGF1ZGlvIGluIHRoZSBhcHBsaWNhdGlvbiBjYWxsYmFjayBhbmQgdGhlbiB3cml0ZSB0aGUgZGF0YSB0byB0aGUgc3RyZWFtLgogdm9pZCAqQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXk6OmNhbGxiYWNrTG9vcCgpIHsKKyAgICBBTE9HRCgiJXMoKSBlbnRlcmluZyA+Pj4+Pj4+Pj4+Pj4+Pj4iLCBfX2Z1bmNfXyk7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKICAgICBhYXVkaW9fZGF0YV9jYWxsYmFja19yZXN1bHRfdCBjYWxsYmFja1Jlc3VsdCA9IEFBVURJT19DQUxMQkFDS19SRVNVTFRfQ09OVElOVUU7Ci0gICAgQUF1ZGlvU3RyZWFtX2RhdGFDYWxsYmFjayBhcHBDYWxsYmFjayA9IGdldERhdGFDYWxsYmFja1Byb2MoKTsKLSAgICBpZiAoYXBwQ2FsbGJhY2sgPT0gbnVsbHB0cikgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFpc0RhdGFDYWxsYmFja1NldCgpKSByZXR1cm4gTlVMTDsKICAgICBpbnQ2NF90IHRpbWVvdXROYW5vcyA9IGNhbGN1bGF0ZVJlYXNvbmFibGVUaW1lb3V0KG1DYWxsYmFja0ZyYW1lcyk7CiAKICAgICAvLyByZXN1bHQgbWlnaHQgYmUgYSBmcmFtZSBjb3VudAogICAgIHdoaWxlIChtQ2FsbGJhY2tFbmFibGVkLmxvYWQoKSAmJiBpc0FjdGl2ZSgpICYmIChyZXN1bHQgPj0gMCkpIHsKICAgICAgICAgLy8gQ2FsbCBhcHBsaWNhdGlvbiB1c2luZyB0aGUgQUF1ZGlvIGNhbGxiYWNrIGludGVyZmFjZS4KLSAgICAgICAgY2FsbGJhY2tSZXN1bHQgPSAoKmFwcENhbGxiYWNrKSgKLSAgICAgICAgICAgICAgICAoQUF1ZGlvU3RyZWFtICopIHRoaXMsCi0gICAgICAgICAgICAgICAgZ2V0RGF0YUNhbGxiYWNrVXNlckRhdGEoKSwKLSAgICAgICAgICAgICAgICBtQ2FsbGJhY2tCdWZmZXIsCi0gICAgICAgICAgICAgICAgbUNhbGxiYWNrRnJhbWVzKTsKKyAgICAgICAgY2FsbGJhY2tSZXN1bHQgPSBtYXliZUNhbGxEYXRhQ2FsbGJhY2sobUNhbGxiYWNrQnVmZmVyLCBtQ2FsbGJhY2tGcmFtZXMpOwogCiAgICAgICAgIGlmIChjYWxsYmFja1Jlc3VsdCA9PSBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX0NPTlRJTlVFKSB7CiAgICAgICAgICAgICAvLyBXcml0ZSBhdWRpbyBkYXRhIHRvIHN0cmVhbS4gVGhpcyBpcyBhIEJMT0NLSU5HIFdSSVRFIQogICAgICAgICAgICAgcmVzdWx0ID0gd3JpdGUobUNhbGxiYWNrQnVmZmVyLCBtQ2FsbGJhY2tGcmFtZXMsIHRpbWVvdXROYW5vcyk7CiAgICAgICAgICAgICBpZiAoKHJlc3VsdCAhPSBtQ2FsbGJhY2tGcmFtZXMpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5KCk6IGNhbGxiYWNrTG9vcDogd3JpdGUoKSByZXR1cm5lZCAlZCIsIHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgd3JvdGUgc29tZSBvZiB0aGUgZnJhbWVzIHJlcXVlc3RlZC4gTXVzdCBoYXZlIHRpbWVkIG91dC4KICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX1RJTUVPVVQ7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFBdWRpb1N0cmVhbV9lcnJvckNhbGxiYWNrIGVycm9yQ2FsbGJhY2sgPSBnZXRFcnJvckNhbGxiYWNrUHJvYygpOwotICAgICAgICAgICAgICAgIGlmIChlcnJvckNhbGxiYWNrICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICAgICAgKCplcnJvckNhbGxiYWNrKSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQUF1ZGlvU3RyZWFtICopIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RXJyb3JDYWxsYmFja1VzZXJEYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWF5YmVDYWxsRXJyb3JDYWxsYmFjayhyZXN1bHQpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKGNhbGxiYWNrUmVzdWx0ID09IEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUCkgewotICAgICAgICAgICAgQUxPR0QoIkF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5KCk6IGNhbGxiYWNrIHJldHVybmVkIEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUCIpOworICAgICAgICAgICAgQUxPR1YoIiVzKCk6IGNhbGxiYWNrIHJldHVybmVkIEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUCIsIF9fZnVuY19fKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogCi0gICAgQUxPR0QoIkF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5KCk6IGNhbGxiYWNrTG9vcCgpIGV4aXRpbmcsIHJlc3VsdCA9ICVkLCBpc0FjdGl2ZSgpID0gJWQiLAotICAgICAgICAgIHJlc3VsdCwgKGludCkgaXNBY3RpdmUoKSk7CisgICAgQUxPR0QoIiVzKCkgZXhpdGluZywgcmVzdWx0ID0gJWQsIGlzQWN0aXZlKCkgPSAlZCA8PDw8PDw8PDw8PDw8PCIsCisgICAgICAgICAgX19mdW5jX18sIHJlc3VsdCwgKGludCkgaXNBY3RpdmUoKSk7CiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBJbXBsZW1lbnRhdGlvbiBvZiBQbGF5ZXJCYXNlCiBzdGF0dXNfdCBBdWRpb1N0cmVhbUludGVybmFsUGxheTo6ZG9TZXRWb2x1bWUoKSB7Ci0gICAgbVZvbHVtZVJhbXAuc2V0VGFyZ2V0KG1TdHJlYW1Wb2x1bWUgKiBnZXREdWNrQW5kTXV0ZVZvbHVtZSgpKTsKKyAgICBmbG9hdCBjb21iaW5lZFZvbHVtZSA9IG1TdHJlYW1Wb2x1bWUgKiBnZXREdWNrQW5kTXV0ZVZvbHVtZSgpOworICAgIEFMT0dEKCIlcygpIG1TdHJlYW1Wb2x1bWUgKiBkdWNrQW5kTXV0ZVZvbHVtZSA9ICVmICogJWYgPSAlZiIsCisgICAgICAgICAgX19mdW5jX18sIG1TdHJlYW1Wb2x1bWUsIGdldER1Y2tBbmRNdXRlVm9sdW1lKCksIGNvbWJpbmVkVm9sdW1lKTsKKyAgICBtVm9sdW1lUmFtcC5zZXRUYXJnZXQoY29tYmluZWRWb2x1bWUpOwogICAgIHJldHVybiBhbmRyb2lkOjpOT19FUlJPUjsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5oCmluZGV4IGQ1YzFiMWUuLjk3N2E5MDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuaApAQCAtMzMsMTAgKzMzLDIyIEBACiAgICAgQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkoQUF1ZGlvU2VydmljZUludGVyZmFjZSAgJnNlcnZpY2VJbnRlcmZhY2UsIGJvb2wgaW5TZXJ2aWNlID0gZmFsc2UpOwogICAgIHZpcnR1YWwgfkF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5KCk7CiAKKyAgICBhYXVkaW9fcmVzdWx0X3Qgb3Blbihjb25zdCBBdWRpb1N0cmVhbUJ1aWxkZXIgJmJ1aWxkZXIpIG92ZXJyaWRlOworCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlcXVlc3RQYXVzZSgpIG92ZXJyaWRlOwogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlcXVlc3RGbHVzaCgpIG92ZXJyaWRlOwogCisgICAgYm9vbCBpc0ZsdXNoU3VwcG9ydGVkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAvLyBPbmx5IGltcGxlbWVudCBGTFVTSCBmb3IgT1VUUFVUIHN0cmVhbXMuCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2wgaXNQYXVzZVN1cHBvcnRlZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgLy8gT25seSBpbXBsZW1lbnQgUEFVU0UgZm9yIE9VVFBVVCBzdHJlYW1zLgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKICAgICBhYXVkaW9fcmVzdWx0X3Qgd3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lb3V0TmFub3NlY29uZHMpIG92ZXJyaWRlOwpAQCAtNTIsOCArNjQsNiBAQAogCiBwcm90ZWN0ZWQ6CiAKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVxdWVzdFBhdXNlSW50ZXJuYWwoKTsKLQogICAgIHZvaWQgYWR2YW5jZUNsaWVudFRvTWF0Y2hTZXJ2ZXJQb3NpdGlvbigpIG92ZXJyaWRlOwogCiAgICAgdm9pZCBvbkZsdXNoRnJvbVNlcnZlcigpIG92ZXJyaWRlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0lzb2Nocm9ub3VzQ2xvY2tNb2RlbC5jcHAKaW5kZXggYmFjNjlmMS4uOTViNTJiZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuY3BwCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jZGVmaW5lIExPR19UQUcgIkFBdWRpbyIKKyNkZWZpbmUgTE9HX1RBRyAiSXNvY2hyb25vdXNDbG9ja01vZGVsIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2luY2x1ZGUgPGxvZy9sb2cuaD4KIApAQCAtNDEsMjAgKzQxLDIwIEBACiB9CiAKIHZvaWQgSXNvY2hyb25vdXNDbG9ja01vZGVsOjpzZXRQb3NpdGlvbkFuZFRpbWUoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQ2NF90IG5hbm9UaW1lKSB7Ci0gICAgQUxPR1YoIklzb2Nocm9ub3VzQ2xvY2tNb2RlbDo6c2V0UG9zaXRpb25BbmRUaW1lKCVsbGQsICVsbGQpIiwKKyAgICBBTE9HVigic2V0UG9zaXRpb25BbmRUaW1lKCVsbGQsICVsbGQpIiwKICAgICAgICAgICAobG9uZyBsb25nKSBmcmFtZVBvc2l0aW9uLCAobG9uZyBsb25nKSBuYW5vVGltZSk7CiAgICAgbU1hcmtlckZyYW1lUG9zaXRpb24gPSBmcmFtZVBvc2l0aW9uOwogICAgIG1NYXJrZXJOYW5vVGltZSA9IG5hbm9UaW1lOwogfQogCiB2b2lkIElzb2Nocm9ub3VzQ2xvY2tNb2RlbDo6c3RhcnQoaW50NjRfdCBuYW5vVGltZSkgewotICAgIEFMT0dWKCJJc29jaHJvbm91c0Nsb2NrTW9kZWw6OnN0YXJ0KG5hbm9zID0gJWxsZClcbiIsIChsb25nIGxvbmcpIG5hbm9UaW1lKTsKKyAgICBBTE9HVigic3RhcnQobmFub3MgPSAlbGxkKVxuIiwgKGxvbmcgbG9uZykgbmFub1RpbWUpOwogICAgIG1NYXJrZXJOYW5vVGltZSA9IG5hbm9UaW1lOwogICAgIG1TdGF0ZSA9IFNUQVRFX1NUQVJUSU5HOwogfQogCiB2b2lkIElzb2Nocm9ub3VzQ2xvY2tNb2RlbDo6c3RvcChpbnQ2NF90IG5hbm9UaW1lKSB7Ci0gICAgQUxPR1YoIklzb2Nocm9ub3VzQ2xvY2tNb2RlbDo6c3RvcChuYW5vcyA9ICVsbGQpXG4iLCAobG9uZyBsb25nKSBuYW5vVGltZSk7CisgICAgQUxPR1YoInN0b3AobmFub3MgPSAlbGxkKVxuIiwgKGxvbmcgbG9uZykgbmFub1RpbWUpOwogICAgIHNldFBvc2l0aW9uQW5kVGltZShjb252ZXJ0VGltZVRvUG9zaXRpb24obmFub1RpbWUpLCBuYW5vVGltZSk7CiAgICAgLy8gVE9ETyBzaG91bGQgd2Ugc2V0IHBvc2l0aW9uPwogICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRUQ7CkBAIC0xNTYsNyArMTU2LDcgQEAKICAgICBpbnQ2NF90IGZyYW1lc0RlbHRhID0gbmV4dEJ1cnN0UG9zaXRpb24gLSBtTWFya2VyRnJhbWVQb3NpdGlvbjsKICAgICBpbnQ2NF90IG5hbm9zRGVsdGEgPSBjb252ZXJ0RGVsdGFQb3NpdGlvblRvVGltZShmcmFtZXNEZWx0YSk7CiAgICAgaW50NjRfdCB0aW1lID0gbU1hcmtlck5hbm9UaW1lICsgbmFub3NEZWx0YTsKLS8vICAgIEFMT0dEKCJJc29jaHJvbm91c0Nsb2NrTW9kZWw6OmNvbnZlcnRQb3NpdGlvblRvVGltZTogcG9zID0gJWxsdSAtLT4gdGltZSA9ICVsbHUiLAorLy8gICAgQUxPR0QoImNvbnZlcnRQb3NpdGlvblRvVGltZTogcG9zID0gJWxsdSAtLT4gdGltZSA9ICVsbHUiLAogLy8gICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWZyYW1lUG9zaXRpb24sCiAvLyAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpdGltZSk7CiAgICAgcmV0dXJuIHRpbWU7CkBAIC0xNzEsMTkgKzE3MSwxOSBAQAogICAgIGludDY0X3QgbmV4dEJ1cnN0UG9zaXRpb24gPSBtTWFya2VyRnJhbWVQb3NpdGlvbiArIGZyYW1lc0RlbHRhOwogICAgIGludDY0X3QgbmV4dEJ1cnN0SW5kZXggPSBuZXh0QnVyc3RQb3NpdGlvbiAvIG1GcmFtZXNQZXJCdXJzdDsKICAgICBpbnQ2NF90IHBvc2l0aW9uID0gbmV4dEJ1cnN0SW5kZXggKiBtRnJhbWVzUGVyQnVyc3Q7Ci0vLyAgICBBTE9HRCgiSXNvY2hyb25vdXNDbG9ja01vZGVsOjpjb252ZXJ0VGltZVRvUG9zaXRpb246IHRpbWUgPSAlbGx1IC0tPiBwb3MgPSAlbGx1IiwKKy8vICAgIEFMT0dEKCJjb252ZXJ0VGltZVRvUG9zaXRpb246IHRpbWUgPSAlbGx1IC0tPiBwb3MgPSAlbGx1IiwKIC8vICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyluYW5vVGltZSwKIC8vICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylwb3NpdGlvbik7Ci0vLyAgICBBTE9HRCgiSXNvY2hyb25vdXNDbG9ja01vZGVsOjpjb252ZXJ0VGltZVRvUG9zaXRpb246IGZyYW1lc0RlbHRhID0gJWxsdSwgbUZyYW1lc1BlckJ1cnN0ID0gJWQiLAorLy8gICAgQUxPR0QoImNvbnZlcnRUaW1lVG9Qb3NpdGlvbjogZnJhbWVzRGVsdGEgPSAlbGx1LCBtRnJhbWVzUGVyQnVyc3QgPSAlZCIsCiAvLyAgICAgICAgIChsb25nIGxvbmcpIGZyYW1lc0RlbHRhLCBtRnJhbWVzUGVyQnVyc3QpOwogICAgIHJldHVybiBwb3NpdGlvbjsKIH0KIAogdm9pZCBJc29jaHJvbm91c0Nsb2NrTW9kZWw6OmR1bXAoKSBjb25zdCB7Ci0gICAgQUxPR0QoIklzb2Nocm9ub3VzQ2xvY2tNb2RlbDo6bU1hcmtlckZyYW1lUG9zaXRpb24gPSAlbGxkIiwgKGxvbmcgbG9uZykgbU1hcmtlckZyYW1lUG9zaXRpb24pOwotICAgIEFMT0dEKCJJc29jaHJvbm91c0Nsb2NrTW9kZWw6Om1NYXJrZXJOYW5vVGltZSAgICAgID0gJWxsZCIsIChsb25nIGxvbmcpIG1NYXJrZXJOYW5vVGltZSk7Ci0gICAgQUxPR0QoIklzb2Nocm9ub3VzQ2xvY2tNb2RlbDo6bVNhbXBsZVJhdGUgICAgICAgICAgPSAlNmQiLCBtU2FtcGxlUmF0ZSk7Ci0gICAgQUxPR0QoIklzb2Nocm9ub3VzQ2xvY2tNb2RlbDo6bUZyYW1lc1BlckJ1cnN0ICAgICAgPSAlNmQiLCBtRnJhbWVzUGVyQnVyc3QpOwotICAgIEFMT0dEKCJJc29jaHJvbm91c0Nsb2NrTW9kZWw6Om1NYXhMYXRlbmVzc0luTmFub3MgID0gJTZkIiwgbU1heExhdGVuZXNzSW5OYW5vcyk7Ci0gICAgQUxPR0QoIklzb2Nocm9ub3VzQ2xvY2tNb2RlbDo6bVN0YXRlICAgICAgICAgICAgICAgPSAlNmQiLCBtU3RhdGUpOworICAgIEFMT0dEKCJtTWFya2VyRnJhbWVQb3NpdGlvbiA9ICVsbGQiLCAobG9uZyBsb25nKSBtTWFya2VyRnJhbWVQb3NpdGlvbik7CisgICAgQUxPR0QoIm1NYXJrZXJOYW5vVGltZSAgICAgID0gJWxsZCIsIChsb25nIGxvbmcpIG1NYXJrZXJOYW5vVGltZSk7CisgICAgQUxPR0QoIm1TYW1wbGVSYXRlICAgICAgICAgID0gJTZkIiwgbVNhbXBsZVJhdGUpOworICAgIEFMT0dEKCJtRnJhbWVzUGVyQnVyc3QgICAgICA9ICU2ZCIsIG1GcmFtZXNQZXJCdXJzdCk7CisgICAgQUxPR0QoIm1NYXhMYXRlbmVzc0luTmFub3MgID0gJTZkIiwgbU1heExhdGVuZXNzSW5OYW5vcyk7CisgICAgQUxPR0QoIm1TdGF0ZSAgICAgICAgICAgICAgID0gJTZkIiwgbVN0YXRlKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9BdWRpby5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvQXVkaW8uY3BwCmluZGV4IDFlYWVlODEuLmRmMGRiNzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9BdWRpby5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb0F1ZGlvLmNwcApAQCAtMTgsNiArMTgsOCBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxtdXRleD4KICNpbmNsdWRlIDx0aW1lLmg+CiAjaW5jbHVkZSA8cHRocmVhZC5oPgogCkBAIC0xNzUsMTMgKzE3NywzOCBAQAogICAgIHN0cmVhbUJ1aWxkZXItPnNldFNoYXJpbmdNb2RlKHNoYXJpbmdNb2RlKTsKIH0KIAorQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0VXNhZ2UoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb191c2FnZV90IHVzYWdlKSB7CisgICAgQXVkaW9TdHJlYW1CdWlsZGVyICpzdHJlYW1CdWlsZGVyID0gY29udmVydEFBdWRpb0J1aWxkZXJUb1N0cmVhbUJ1aWxkZXIoYnVpbGRlcik7CisgICAgc3RyZWFtQnVpbGRlci0+c2V0VXNhZ2UodXNhZ2UpOworfQorCitBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRDb250ZW50VHlwZShBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX2NvbnRlbnRfdHlwZV90IGNvbnRlbnRUeXBlKSB7CisgICAgQXVkaW9TdHJlYW1CdWlsZGVyICpzdHJlYW1CdWlsZGVyID0gY29udmVydEFBdWRpb0J1aWxkZXJUb1N0cmVhbUJ1aWxkZXIoYnVpbGRlcik7CisgICAgc3RyZWFtQnVpbGRlci0+c2V0Q29udGVudFR5cGUoY29udGVudFR5cGUpOworfQorCitBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRJbnB1dFByZXNldChBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX2lucHV0X3ByZXNldF90IGlucHV0UHJlc2V0KSB7CisgICAgQXVkaW9TdHJlYW1CdWlsZGVyICpzdHJlYW1CdWlsZGVyID0gY29udmVydEFBdWRpb0J1aWxkZXJUb1N0cmVhbUJ1aWxkZXIoYnVpbGRlcik7CisgICAgc3RyZWFtQnVpbGRlci0+c2V0SW5wdXRQcmVzZXQoaW5wdXRQcmVzZXQpOworfQorCiBBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRCdWZmZXJDYXBhY2l0eUluRnJhbWVzKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZyYW1lcykKIHsKICAgICBBdWRpb1N0cmVhbUJ1aWxkZXIgKnN0cmVhbUJ1aWxkZXIgPSBjb252ZXJ0QUF1ZGlvQnVpbGRlclRvU3RyZWFtQnVpbGRlcihidWlsZGVyKTsKICAgICBzdHJlYW1CdWlsZGVyLT5zZXRCdWZmZXJDYXBhY2l0eShmcmFtZXMpOwogfQogCitBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTZXNzaW9uSWQoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fc2Vzc2lvbl9pZF90IHNlc3Npb25JZCkKK3sKKyAgICBBdWRpb1N0cmVhbUJ1aWxkZXIgKnN0cmVhbUJ1aWxkZXIgPSBjb252ZXJ0QUF1ZGlvQnVpbGRlclRvU3RyZWFtQnVpbGRlcihidWlsZGVyKTsKKyAgICBzdHJlYW1CdWlsZGVyLT5zZXRTZXNzaW9uSWQoc2Vzc2lvbklkKTsKK30KKwogQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RGF0YUNhbGxiYWNrKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUF1ZGlvU3RyZWFtX2RhdGFDYWxsYmFjayBjYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyRGF0YSkKQEAgLTIzOCwxNSArMjY1LDI2IEBACiAKIEFBVURJT19BUEkgYWF1ZGlvX3Jlc3VsdF90ICBBQXVkaW9TdHJlYW1fY2xvc2UoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pCiB7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19FUlJPUl9OVUxMOwogICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IGNvbnZlcnRBQXVkaW9TdHJlYW1Ub0F1ZGlvU3RyZWFtKHN0cmVhbSk7Ci0gICAgQUxPR0QoIkFBdWRpb1N0cmVhbV9jbG9zZSglcCkiLCBzdHJlYW0pOworICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1fY2xvc2UoJXApIGNhbGxlZCAtLS0tLS0tLS0tLS0tLS0iLCBzdHJlYW0pOwogICAgIGlmIChhdWRpb1N0cmVhbSAhPSBudWxscHRyKSB7Ci0gICAgICAgIGF1ZGlvU3RyZWFtLT5jbG9zZSgpOwotICAgICAgICBhdWRpb1N0cmVhbS0+dW5yZWdpc3RlclBsYXllckJhc2UoKTsKLSAgICAgICAgZGVsZXRlIGF1ZGlvU3RyZWFtOwotICAgICAgICByZXR1cm4gQUFVRElPX09LOworICAgICAgICByZXN1bHQgPSBhdWRpb1N0cmVhbS0+c2FmZUNsb3NlKCk7CisgICAgICAgIC8vIENsb3NlIHdpbGwgb25seSBmYWlsIGlmIGNhbGxlZCBpbGxlZ2FsbHksIGZvciBleGFtcGxlLCBmcm9tIGEgY2FsbGJhY2suCisgICAgICAgIC8vIFRoYXQgd291bGQgcmVzdWx0IGluIGRlbGV0aW5nIGFuIGFjdGl2ZSBzdHJlYW0sIHdoaWNoIHdvdWxkIGNhdXNlIGEgY3Jhc2guCisgICAgICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICBhdWRpb1N0cmVhbS0+dW5yZWdpc3RlclBsYXllckJhc2UoKTsKKyAgICAgICAgICAgIGRlbGV0ZSBhdWRpb1N0cmVhbTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCIlcyBhdHRlbXB0IHRvIGNsb3NlIGZhaWxlZC4gQ2xvc2UgaXQgZnJvbSBhbm90aGVyIHRocmVhZC4iLCBfX2Z1bmNfXyk7CisgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEFBVURJT19FUlJPUl9OVUxMOworICAgIC8vIFdlJ3JlIHBvdGVudGlhbGx5IGZyZWVpbmcgYHN0cmVhbWAgYWJvdmUsIHNvIGl0cyB1c2UgaGVyZSBtYWtlcyBzb21lCisgICAgLy8gc3RhdGljIGFuYWx5c2lzIHRvb2xzIHVuaGFwcHkuIENhc3RpbmcgdG8gdWludHB0cl90IGhlbHBzIGFzc3VyZQorICAgIC8vIHNhaWQgdG9vbHMgdGhhdCB3ZSdyZSBub3QgZG9pbmcgYW55dGhpbmcgYmFkIGhlcmUuCisgICAgQUxPR0QoIkFBdWRpb1N0cmVhbV9jbG9zZSglIyIgUFJJeFBUUiAiKSByZXR1cm5lZCAlZCAtLS0tLS0tLS0iLAorICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihzdHJlYW0pLCByZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIEFBVURJT19BUEkgYWF1ZGlvX3Jlc3VsdF90ICBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KEFBdWRpb1N0cmVhbSogc3RyZWFtKQpAQCAtMjY5LDcgKzMwNyw3IEBACiB7CiAgICAgQXVkaW9TdHJlYW0gKmF1ZGlvU3RyZWFtID0gY29udmVydEFBdWRpb1N0cmVhbVRvQXVkaW9TdHJlYW0oc3RyZWFtKTsKICAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtX3JlcXVlc3RGbHVzaCglcCkiLCBzdHJlYW0pOwotICAgIHJldHVybiBhdWRpb1N0cmVhbS0+cmVxdWVzdEZsdXNoKCk7CisgICAgcmV0dXJuIGF1ZGlvU3RyZWFtLT5zYWZlRmx1c2goKTsKIH0KIAogQUFVRElPX0FQSSBhYXVkaW9fcmVzdWx0X3QgIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcChBQXVkaW9TdHJlYW0qIHN0cmVhbSkKQEAgLTMyNCw3ICszNjIsNyBAQAogICAgIH0KIAogICAgIC8vIERvbid0IGFsbG93IHdyaXRlcyB3aGVuIHBsYXlpbmcgd2l0aCBhIGNhbGxiYWNrLgotICAgIGlmIChhdWRpb1N0cmVhbS0+Z2V0RGF0YUNhbGxiYWNrUHJvYygpICE9IG51bGxwdHIgJiYgYXVkaW9TdHJlYW0tPmlzQWN0aXZlKCkpIHsKKyAgICBpZiAoYXVkaW9TdHJlYW0tPmlzRGF0YUNhbGxiYWNrQWN0aXZlKCkpIHsKICAgICAgICAgQUxPR0UoIkNhbm5vdCB3cml0ZSB0byBhIGNhbGxiYWNrIHN0cmVhbSB3aGVuIHJ1bm5pbmcuIik7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CkBAIC00MzQsNiArNDcyLDMwIEBACiAgICAgcmV0dXJuIGF1ZGlvU3RyZWFtLT5nZXRTaGFyaW5nTW9kZSgpOwogfQogCitBQVVESU9fQVBJIGFhdWRpb191c2FnZV90IEFBdWRpb1N0cmVhbV9nZXRVc2FnZShBQXVkaW9TdHJlYW0qIHN0cmVhbSkKK3sKKyAgICBBdWRpb1N0cmVhbSAqYXVkaW9TdHJlYW0gPSBjb252ZXJ0QUF1ZGlvU3RyZWFtVG9BdWRpb1N0cmVhbShzdHJlYW0pOworICAgIHJldHVybiBhdWRpb1N0cmVhbS0+Z2V0VXNhZ2UoKTsKK30KKworQUFVRElPX0FQSSBhYXVkaW9fY29udGVudF90eXBlX3QgQUF1ZGlvU3RyZWFtX2dldENvbnRlbnRUeXBlKEFBdWRpb1N0cmVhbSogc3RyZWFtKQoreworICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IGNvbnZlcnRBQXVkaW9TdHJlYW1Ub0F1ZGlvU3RyZWFtKHN0cmVhbSk7CisgICAgcmV0dXJuIGF1ZGlvU3RyZWFtLT5nZXRDb250ZW50VHlwZSgpOworfQorCitBQVVESU9fQVBJIGFhdWRpb19pbnB1dF9wcmVzZXRfdCBBQXVkaW9TdHJlYW1fZ2V0SW5wdXRQcmVzZXQoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pCit7CisgICAgQXVkaW9TdHJlYW0gKmF1ZGlvU3RyZWFtID0gY29udmVydEFBdWRpb1N0cmVhbVRvQXVkaW9TdHJlYW0oc3RyZWFtKTsKKyAgICByZXR1cm4gYXVkaW9TdHJlYW0tPmdldElucHV0UHJlc2V0KCk7Cit9CisKK0FBVURJT19BUEkgaW50MzJfdCBBQXVkaW9TdHJlYW1fZ2V0U2Vzc2lvbklkKEFBdWRpb1N0cmVhbSogc3RyZWFtKQoreworICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IGNvbnZlcnRBQXVkaW9TdHJlYW1Ub0F1ZGlvU3RyZWFtKHN0cmVhbSk7CisgICAgcmV0dXJuIGF1ZGlvU3RyZWFtLT5nZXRTZXNzaW9uSWQoKTsKK30KKwogQUFVRElPX0FQSSBpbnQ2NF90IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKEFBdWRpb1N0cmVhbSogc3RyZWFtKQogewogICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IGNvbnZlcnRBQXVkaW9TdHJlYW1Ub0F1ZGlvU3RyZWFtKHN0cmVhbSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5jcHAKaW5kZXggODI0NDVlNy4uZDU2NzAxYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmNwcApAQCAtMTUsOSArMTUsOSBAQAogICovCiAKIAotI2RlZmluZSBMT0dfVEFHICJBQXVkaW8iCisjZGVmaW5lIExPR19UQUcgIkFBdWRpb1N0cmVhbVBhcmFtZXRlcnMiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW8uaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KIAogI2luY2x1ZGUgIkFBdWRpb1N0cmVhbVBhcmFtZXRlcnMuaCIKIApAQCAtMzgsMzAgKzM4LDQzIEBACiAgICAgbVNhbXBsZXNQZXJGcmFtZSA9IG90aGVyLm1TYW1wbGVzUGVyRnJhbWU7CiAgICAgbVNhbXBsZVJhdGUgICAgICA9IG90aGVyLm1TYW1wbGVSYXRlOwogICAgIG1EZXZpY2VJZCAgICAgICAgPSBvdGhlci5tRGV2aWNlSWQ7CisgICAgbVNlc3Npb25JZCAgICAgICA9IG90aGVyLm1TZXNzaW9uSWQ7CiAgICAgbVNoYXJpbmdNb2RlICAgICA9IG90aGVyLm1TaGFyaW5nTW9kZTsKICAgICBtQXVkaW9Gb3JtYXQgICAgID0gb3RoZXIubUF1ZGlvRm9ybWF0OwogICAgIG1EaXJlY3Rpb24gICAgICAgPSBvdGhlci5tRGlyZWN0aW9uOwogICAgIG1CdWZmZXJDYXBhY2l0eSAgPSBvdGhlci5tQnVmZmVyQ2FwYWNpdHk7CisgICAgbVVzYWdlICAgICAgICAgICA9IG90aGVyLm1Vc2FnZTsKKyAgICBtQ29udGVudFR5cGUgICAgID0gb3RoZXIubUNvbnRlbnRUeXBlOworICAgIG1JbnB1dFByZXNldCAgICAgPSBvdGhlci5tSW5wdXRQcmVzZXQ7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TdHJlYW1QYXJhbWV0ZXJzOjp2YWxpZGF0ZSgpIGNvbnN0IHsKICAgICBpZiAobVNhbXBsZXNQZXJGcmFtZSAhPSBBQVVESU9fVU5TUEVDSUZJRUQKICAgICAgICAgJiYgKG1TYW1wbGVzUGVyRnJhbWUgPCBTQU1QTEVTX1BFUl9GUkFNRV9NSU4gfHwgbVNhbXBsZXNQZXJGcmFtZSA+IFNBTVBMRVNfUEVSX0ZSQU1FX01BWCkpIHsKLSAgICAgICAgQUxPR0UoIkFBdWRpb1N0cmVhbVBhcmFtZXRlcnM6IGNoYW5uZWxDb3VudCBvdXQgb2YgcmFuZ2UgPSAlZCIsIG1TYW1wbGVzUGVyRnJhbWUpOworICAgICAgICBBTE9HRSgiY2hhbm5lbENvdW50IG91dCBvZiByYW5nZSA9ICVkIiwgbVNhbXBsZXNQZXJGcmFtZSk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFOwogICAgIH0KIAogICAgIGlmIChtRGV2aWNlSWQgPCAwKSB7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9TdHJlYW1QYXJhbWV0ZXJzOiBkZXZpY2VJZCBvdXQgb2YgcmFuZ2UgPSAlZCIsIG1EZXZpY2VJZCk7CisgICAgICAgIEFMT0dFKCJkZXZpY2VJZCBvdXQgb2YgcmFuZ2UgPSAlZCIsIG1EZXZpY2VJZCk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFOwogICAgIH0KIAorICAgIC8vIEFsbCBTZXNzaW9uIElEIHZhbHVlcyBhcmUgbGVnYWwuCisgICAgc3dpdGNoIChtU2Vzc2lvbklkKSB7CisgICAgICAgIGNhc2UgQUFVRElPX1NFU1NJT05fSURfTk9ORToKKyAgICAgICAgY2FzZSBBQVVESU9fU0VTU0lPTl9JRF9BTExPQ0FURToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCiAgICAgc3dpdGNoIChtU2hhcmluZ01vZGUpIHsKICAgICAgICAgY2FzZSBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRToKICAgICAgICAgY2FzZSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRDoKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoIkFBdWRpb1N0cmVhbVBhcmFtZXRlcnM6IGlsbGVnYWwgc2hhcmluZ01vZGUgPSAlZCIsIG1TaGFyaW5nTW9kZSk7CisgICAgICAgICAgICBBTE9HRSgiaWxsZWdhbCBzaGFyaW5nTW9kZSA9ICVkIiwgbVNoYXJpbmdNb2RlKTsKICAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVDsKICAgICAgICAgICAgIC8vIGJyZWFrOwogICAgIH0KQEAgLTcyLDE5ICs4NSwxOSBAQAogICAgICAgICBjYXNlIEFBVURJT19GT1JNQVRfUENNX0ZMT0FUOgogICAgICAgICAgICAgYnJlYWs7IC8vIHZhbGlkCiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HRSgiQUF1ZGlvU3RyZWFtUGFyYW1ldGVyczogYXVkaW9Gb3JtYXQgbm90IHZhbGlkID0gJWQiLCBtQXVkaW9Gb3JtYXQpOworICAgICAgICAgICAgQUxPR0UoImF1ZGlvRm9ybWF0IG5vdCB2YWxpZCA9ICVkIiwgbUF1ZGlvRm9ybWF0KTsKICAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9GT1JNQVQ7CiAgICAgICAgICAgICAvLyBicmVhazsKICAgICB9CiAKICAgICBpZiAobVNhbXBsZVJhdGUgIT0gQUFVRElPX1VOU1BFQ0lGSUVECiAgICAgICAgICYmIChtU2FtcGxlUmF0ZSA8IFNBTVBMRV9SQVRFX0haX01JTiB8fCBtU2FtcGxlUmF0ZSA+IFNBTVBMRV9SQVRFX0haX01BWCkpIHsKLSAgICAgICAgQUxPR0UoIkFBdWRpb1N0cmVhbVBhcmFtZXRlcnM6IHNhbXBsZVJhdGUgb3V0IG9mIHJhbmdlID0gJWQiLCBtU2FtcGxlUmF0ZSk7CisgICAgICAgIEFMT0dFKCJzYW1wbGVSYXRlIG91dCBvZiByYW5nZSA9ICVkIiwgbVNhbXBsZVJhdGUpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfUkFURTsKICAgICB9CiAKICAgICBpZiAobUJ1ZmZlckNhcGFjaXR5IDwgMCkgewotICAgICAgICBBTE9HRSgiQUF1ZGlvU3RyZWFtUGFyYW1ldGVyczogYnVmZmVyQ2FwYWNpdHkgb3V0IG9mIHJhbmdlID0gJWQiLCBtQnVmZmVyQ2FwYWNpdHkpOworICAgICAgICBBTE9HRSgiYnVmZmVyQ2FwYWNpdHkgb3V0IG9mIHJhbmdlID0gJWQiLCBtQnVmZmVyQ2FwYWNpdHkpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKICAgICB9CiAKQEAgLTkzLDcgKzEwNiw1NSBAQAogICAgICAgICBjYXNlIEFBVURJT19ESVJFQ1RJT05fT1VUUFVUOgogICAgICAgICAgICAgYnJlYWs7IC8vIHZhbGlkCiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HRSgiQUF1ZGlvU3RyZWFtUGFyYW1ldGVyczogZGlyZWN0aW9uIG5vdCB2YWxpZCA9ICVkIiwgbURpcmVjdGlvbik7CisgICAgICAgICAgICBBTE9HRSgiZGlyZWN0aW9uIG5vdCB2YWxpZCA9ICVkIiwgbURpcmVjdGlvbik7CisgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lMTEVHQUxfQVJHVU1FTlQ7CisgICAgICAgICAgICAvLyBicmVhazsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1Vc2FnZSkgeworICAgICAgICBjYXNlIEFBVURJT19VTlNQRUNJRklFRDoKKyAgICAgICAgY2FzZSBBQVVESU9fVVNBR0VfTUVESUE6CisgICAgICAgIGNhc2UgQUFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT046CisgICAgICAgIGNhc2UgQUFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORzoKKyAgICAgICAgY2FzZSBBQVVESU9fVVNBR0VfQUxBUk06CisgICAgICAgIGNhc2UgQUFVRElPX1VTQUdFX05PVElGSUNBVElPTjoKKyAgICAgICAgY2FzZSBBQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1JJTkdUT05FOgorICAgICAgICBjYXNlIEFBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQ6CisgICAgICAgIGNhc2UgQUFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWToKKyAgICAgICAgY2FzZSBBQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFOgorICAgICAgICBjYXNlIEFBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTjoKKyAgICAgICAgY2FzZSBBQVVESU9fVVNBR0VfR0FNRToKKyAgICAgICAgY2FzZSBBQVVESU9fVVNBR0VfQVNTSVNUQU5UOgorICAgICAgICAgICAgYnJlYWs7IC8vIHZhbGlkCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgidXNhZ2Ugbm90IHZhbGlkID0gJWQiLCBtVXNhZ2UpOworICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTExFR0FMX0FSR1VNRU5UOworICAgICAgICAgICAgLy8gYnJlYWs7CisgICAgfQorCisgICAgc3dpdGNoIChtQ29udGVudFR5cGUpIHsKKyAgICAgICAgY2FzZSBBQVVESU9fVU5TUEVDSUZJRUQ6CisgICAgICAgIGNhc2UgQUFVRElPX0NPTlRFTlRfVFlQRV9NVVNJQzoKKyAgICAgICAgY2FzZSBBQVVESU9fQ09OVEVOVF9UWVBFX01PVklFOgorICAgICAgICBjYXNlIEFBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OOgorICAgICAgICBjYXNlIEFBVURJT19DT05URU5UX1RZUEVfU1BFRUNIOgorICAgICAgICAgICAgYnJlYWs7IC8vIHZhbGlkCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiY29udGVudCB0eXBlIG5vdCB2YWxpZCA9ICVkIiwgbUNvbnRlbnRUeXBlKTsKKyAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVDsKKyAgICAgICAgICAgIC8vIGJyZWFrOworICAgIH0KKworICAgIHN3aXRjaCAobUlucHV0UHJlc2V0KSB7CisgICAgICAgIGNhc2UgQUFVRElPX1VOU1BFQ0lGSUVEOgorICAgICAgICBjYXNlIEFBVURJT19JTlBVVF9QUkVTRVRfR0VORVJJQzoKKyAgICAgICAgY2FzZSBBQVVESU9fSU5QVVRfUFJFU0VUX0NBTUNPUkRFUjoKKyAgICAgICAgY2FzZSBBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX0NPTU1VTklDQVRJT046CisgICAgICAgIGNhc2UgQUFVRElPX0lOUFVUX1BSRVNFVF9WT0lDRV9SRUNPR05JVElPTjoKKyAgICAgICAgY2FzZSBBQVVESU9fSU5QVVRfUFJFU0VUX1VOUFJPQ0VTU0VEOgorICAgICAgICAgICAgYnJlYWs7IC8vIHZhbGlkCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiaW5wdXQgcHJlc2V0IG5vdCB2YWxpZCA9ICVkIiwgbUlucHV0UHJlc2V0KTsKICAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVDsKICAgICAgICAgICAgIC8vIGJyZWFrOwogICAgIH0KQEAgLTEwMiwxMiArMTYzLDE1IEBACiB9CiAKIHZvaWQgQUF1ZGlvU3RyZWFtUGFyYW1ldGVyczo6ZHVtcCgpIGNvbnN0IHsKLSAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtUGFyYW1ldGVycyBtRGV2aWNlSWQgICAgICAgID0gJWQiLCBtRGV2aWNlSWQpOwotICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1QYXJhbWV0ZXJzIG1TYW1wbGVSYXRlICAgICAgPSAlZCIsIG1TYW1wbGVSYXRlKTsKLSAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtUGFyYW1ldGVycyBtU2FtcGxlc1BlckZyYW1lID0gJWQiLCBtU2FtcGxlc1BlckZyYW1lKTsKLSAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtUGFyYW1ldGVycyBtU2hhcmluZ01vZGUgICAgID0gJWQiLCAoaW50KW1TaGFyaW5nTW9kZSk7Ci0gICAgQUxPR0QoIkFBdWRpb1N0cmVhbVBhcmFtZXRlcnMgbUF1ZGlvRm9ybWF0ICAgICA9ICVkIiwgKGludCltQXVkaW9Gb3JtYXQpOwotICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1QYXJhbWV0ZXJzIG1EaXJlY3Rpb24gICAgICAgPSAlZCIsIG1EaXJlY3Rpb24pOwotICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1QYXJhbWV0ZXJzIG1CdWZmZXJDYXBhY2l0eSAgPSAlZCIsIG1CdWZmZXJDYXBhY2l0eSk7CisgICAgQUxPR0QoIm1EZXZpY2VJZCAgICAgICAgPSAlNmQiLCBtRGV2aWNlSWQpOworICAgIEFMT0dEKCJtU2Vzc2lvbklkICAgICAgID0gJTZkIiwgbVNlc3Npb25JZCk7CisgICAgQUxPR0QoIm1TYW1wbGVSYXRlICAgICAgPSAlNmQiLCBtU2FtcGxlUmF0ZSk7CisgICAgQUxPR0QoIm1TYW1wbGVzUGVyRnJhbWUgPSAlNmQiLCBtU2FtcGxlc1BlckZyYW1lKTsKKyAgICBBTE9HRCgibVNoYXJpbmdNb2RlICAgICA9ICU2ZCIsIChpbnQpbVNoYXJpbmdNb2RlKTsKKyAgICBBTE9HRCgibUF1ZGlvRm9ybWF0ICAgICA9ICU2ZCIsIChpbnQpbUF1ZGlvRm9ybWF0KTsKKyAgICBBTE9HRCgibURpcmVjdGlvbiAgICAgICA9ICU2ZCIsIG1EaXJlY3Rpb24pOworICAgIEFMT0dEKCJtQnVmZmVyQ2FwYWNpdHkgID0gJTZkIiwgbUJ1ZmZlckNhcGFjaXR5KTsKKyAgICBBTE9HRCgibVVzYWdlICAgICAgICAgICA9ICU2ZCIsIG1Vc2FnZSk7CisgICAgQUxPR0QoIm1Db250ZW50VHlwZSAgICAgPSAlNmQiLCBtQ29udGVudFR5cGUpOworICAgIEFMT0dEKCJtSW5wdXRQcmVzZXQgICAgID0gJTZkIiwgbUlucHV0UHJlc2V0KTsKIH0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmgKaW5kZXggNWU2N2M5My4uY2U1ZGFjZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5oCkBAIC04OCw2ICs4OCwzOCBAQAogICAgICAgICBtRGlyZWN0aW9uID0gZGlyZWN0aW9uOwogICAgIH0KIAorICAgIGFhdWRpb191c2FnZV90IGdldFVzYWdlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVVzYWdlOworICAgIH0KKworICAgIHZvaWQgc2V0VXNhZ2UoYWF1ZGlvX3VzYWdlX3QgdXNhZ2UpIHsKKyAgICAgICAgbVVzYWdlID0gdXNhZ2U7CisgICAgfQorCisgICAgYWF1ZGlvX2NvbnRlbnRfdHlwZV90IGdldENvbnRlbnRUeXBlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUNvbnRlbnRUeXBlOworICAgIH0KKworICAgIHZvaWQgc2V0Q29udGVudFR5cGUoYWF1ZGlvX2NvbnRlbnRfdHlwZV90IGNvbnRlbnRUeXBlKSB7CisgICAgICAgIG1Db250ZW50VHlwZSA9IGNvbnRlbnRUeXBlOworICAgIH0KKworICAgIGFhdWRpb19pbnB1dF9wcmVzZXRfdCBnZXRJbnB1dFByZXNldCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1JbnB1dFByZXNldDsKKyAgICB9CisKKyAgICB2b2lkIHNldElucHV0UHJlc2V0KGFhdWRpb19pbnB1dF9wcmVzZXRfdCBpbnB1dFByZXNldCkgeworICAgICAgICBtSW5wdXRQcmVzZXQgPSBpbnB1dFByZXNldDsKKyAgICB9CisKKyAgICBhYXVkaW9fc2Vzc2lvbl9pZF90IGdldFNlc3Npb25JZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TZXNzaW9uSWQ7CisgICAgfQorCisgICAgdm9pZCBzZXRTZXNzaW9uSWQoYWF1ZGlvX3Nlc3Npb25faWRfdCBzZXNzaW9uSWQpIHsKKyAgICAgICAgbVNlc3Npb25JZCA9IHNlc3Npb25JZDsKKyAgICB9CisKICAgICBpbnQzMl90IGNhbGN1bGF0ZUJ5dGVzUGVyRnJhbWUoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBnZXRTYW1wbGVzUGVyRnJhbWUoKSAqIEFBdWRpb0NvbnZlcnRfZm9ybWF0VG9TaXplSW5CeXRlcyhnZXRGb3JtYXQoKSk7CiAgICAgfQpAQCAtMTA5LDcgKzE0MSwxMSBAQAogICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCAgICAgIG1TaGFyaW5nTW9kZSAgICAgPSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRDsKICAgICBhYXVkaW9fZm9ybWF0X3QgICAgICAgICAgICBtQXVkaW9Gb3JtYXQgICAgID0gQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRDsKICAgICBhYXVkaW9fZGlyZWN0aW9uX3QgICAgICAgICBtRGlyZWN0aW9uICAgICAgID0gQUFVRElPX0RJUkVDVElPTl9PVVRQVVQ7CisgICAgYWF1ZGlvX3VzYWdlX3QgICAgICAgICAgICAgbVVzYWdlICAgICAgICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKKyAgICBhYXVkaW9fY29udGVudF90eXBlX3QgICAgICBtQ29udGVudFR5cGUgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOworICAgIGFhdWRpb19pbnB1dF9wcmVzZXRfdCAgICAgIG1JbnB1dFByZXNldCAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlckNhcGFjaXR5ICA9IEFBVURJT19VTlNQRUNJRklFRDsKKyAgICBhYXVkaW9fc2Vzc2lvbl9pZF90ICAgICAgICBtU2Vzc2lvbklkICAgICAgID0gQUFVRElPX1NFU1NJT05fSURfTk9ORTsKIH07CiAKIH0gLyogbmFtZXNwYWNlIGFhdWRpbyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5jcHAKaW5kZXggOGRjYzM3YS4uMzU4MDIxYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW0uY3BwCkBAIC00Myw3ICs0Myw3IEBACiAgICAgTE9HX0FMV0FZU19GQVRBTF9JRighKGdldFN0YXRlKCkgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQKICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZ2V0U3RhdGUoKSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX1VOSU5JVElBTElaRUQKICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZ2V0U3RhdGUoKSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRCksCi0gICAgICAgICAgICAgICAgICAgICAgICAiYWF1ZGlvIHN0cmVhbSBzdGlsbCBpbiB1c2UsIHN0YXRlID0gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIn5BdWRpb1N0cmVhbSgpIC0gc3RpbGwgaW4gdXNlLCBzdGF0ZSA9ICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0U3RyZWFtU3RhdGVUb1RleHQoZ2V0U3RhdGUoKSkpOwogCiAgICAgbVBsYXllckJhc2UtPmNsZWFyUGFyZW50UmVmZXJlbmNlKCk7IC8vIHJlbW92ZSByZWZlcmVuY2UgdG8gdGhpcyBBdWRpb1N0cmVhbQpAQCAtNzQsMTUgKzc0LDI4IEBACiAgICAgfQogCiAgICAgLy8gQ29weSBwYXJhbWV0ZXJzIGZyb20gdGhlIEJ1aWxkZXIgYmVjYXVzZSB0aGUgQnVpbGRlciBtYXkgYmUgZGVsZXRlZCBhZnRlciB0aGlzIGNhbGwuCisgICAgLy8gVE9ETyBBdWRpb1N0cmVhbSBzaG91bGQgYmUgYSBzdWJjbGFzcyBvZiBBdWRpb1N0cmVhbVBhcmFtZXRlcnMKICAgICBtU2FtcGxlc1BlckZyYW1lID0gYnVpbGRlci5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKICAgICBtU2FtcGxlUmF0ZSA9IGJ1aWxkZXIuZ2V0U2FtcGxlUmF0ZSgpOwogICAgIG1EZXZpY2VJZCA9IGJ1aWxkZXIuZ2V0RGV2aWNlSWQoKTsKICAgICBtRm9ybWF0ID0gYnVpbGRlci5nZXRGb3JtYXQoKTsKICAgICBtU2hhcmluZ01vZGUgPSBidWlsZGVyLmdldFNoYXJpbmdNb2RlKCk7CiAgICAgbVNoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZCA9IGJ1aWxkZXIuaXNTaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQoKTsKLQogICAgIG1QZXJmb3JtYW5jZU1vZGUgPSBidWlsZGVyLmdldFBlcmZvcm1hbmNlTW9kZSgpOwogCisgICAgbVVzYWdlID0gYnVpbGRlci5nZXRVc2FnZSgpOworICAgIGlmIChtVXNhZ2UgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7CisgICAgICAgIG1Vc2FnZSA9IEFBVURJT19VU0FHRV9NRURJQTsKKyAgICB9CisgICAgbUNvbnRlbnRUeXBlID0gYnVpbGRlci5nZXRDb250ZW50VHlwZSgpOworICAgIGlmIChtQ29udGVudFR5cGUgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7CisgICAgICAgIG1Db250ZW50VHlwZSA9IEFBVURJT19DT05URU5UX1RZUEVfTVVTSUM7CisgICAgfQorICAgIG1JbnB1dFByZXNldCA9IGJ1aWxkZXIuZ2V0SW5wdXRQcmVzZXQoKTsKKyAgICBpZiAobUlucHV0UHJlc2V0ID09IEFBVURJT19VTlNQRUNJRklFRCkgeworICAgICAgICBtSW5wdXRQcmVzZXQgPSBBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX1JFQ09HTklUSU9OOworICAgIH0KKwogICAgIC8vIGNhbGxiYWNrcwogICAgIG1GcmFtZXNQZXJEYXRhQ2FsbGJhY2sgPSBidWlsZGVyLmdldEZyYW1lc1BlckRhdGFDYWxsYmFjaygpOwogICAgIG1EYXRhQ2FsbGJhY2tQcm9jID0gYnVpbGRlci5nZXREYXRhQ2FsbGJhY2tQcm9jKCk7CkBAIC05MSwxOCArMTA0LDE1OSBAQAogICAgIG1FcnJvckNhbGxiYWNrVXNlckRhdGEgPSBidWlsZGVyLmdldEVycm9yQ2FsbGJhY2tVc2VyRGF0YSgpOwogCiAgICAgLy8gVGhpcyBpcyB2ZXJ5IGhlbHBmdWwgZm9yIGRlYnVnZ2luZyBpbiB0aGUgZnV0dXJlLiBQbGVhc2UgbGVhdmUgaXQgaW4uCi0gICAgQUxPR0koIkF1ZGlvU3RyZWFtOjpvcGVuKCkgcmF0ZSA9ICVkLCBjaGFubmVscyA9ICVkLCBmb3JtYXQgPSAlZCwgc2hhcmluZyA9ICVzLCBkaXIgPSAlcyIsCisgICAgQUxPR0koIm9wZW4oKSByYXRlICAgPSAlZCwgY2hhbm5lbHMgICAgPSAlZCwgZm9ybWF0ICAgPSAlZCwgc2hhcmluZyA9ICVzLCBkaXIgPSAlcyIsCiAgICAgICAgICAgbVNhbXBsZVJhdGUsIG1TYW1wbGVzUGVyRnJhbWUsIG1Gb3JtYXQsCiAgICAgICAgICAgQXVkaW9TdHJlYW1fY29udmVydFNoYXJpbmdNb2RlVG9TaG9ydFRleHQobVNoYXJpbmdNb2RlKSwKICAgICAgICAgICAoZ2V0RGlyZWN0aW9uKCkgPT0gQUFVRElPX0RJUkVDVElPTl9PVVRQVVQpID8gIk9VVFBVVCIgOiAiSU5QVVQiKTsKLSAgICBBTE9HSSgiQXVkaW9TdHJlYW06Om9wZW4oKSBkZXZpY2UgPSAlZCwgcGVyZk1vZGUgPSAlZCwgY2FsbGJhY2s6ICVzIHdpdGggZnJhbWVzID0gJWQiLAotICAgICAgICAgIG1EZXZpY2VJZCwgbVBlcmZvcm1hbmNlTW9kZSwKLSAgICAgICAgICAobURhdGFDYWxsYmFja1Byb2MgPT0gbnVsbHB0ciA/ICJPRkYiIDogIk9OIiksCisgICAgQUxPR0koIm9wZW4oKSBkZXZpY2UgPSAlZCwgc2Vzc2lvbklkICAgPSAlZCwgcGVyZk1vZGUgPSAlZCwgY2FsbGJhY2s6ICVzIHdpdGggZnJhbWVzID0gJWQiLAorICAgICAgICAgIG1EZXZpY2VJZCwKKyAgICAgICAgICBtU2Vzc2lvbklkLAorICAgICAgICAgIG1QZXJmb3JtYW5jZU1vZGUsCisgICAgICAgICAgKGlzRGF0YUNhbGxiYWNrU2V0KCkgPyAiT04iIDogIk9GRiIpLAogICAgICAgICAgIG1GcmFtZXNQZXJEYXRhQ2FsbGJhY2spOworICAgIEFMT0dJKCJvcGVuKCkgdXNhZ2UgID0gJWQsIGNvbnRlbnRUeXBlID0gJWQsIGlucHV0UHJlc2V0ID0gJWQiLAorICAgICAgICAgIG1Vc2FnZSwgbUNvbnRlbnRUeXBlLCBtSW5wdXRQcmVzZXQpOwogCiAgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KIAorYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtOjpzYWZlU3RhcnQoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVN0cmVhbUxvY2spOworICAgIGlmIChjb2xsaWRlc1dpdGhDYWxsYmFjaygpKSB7CisgICAgICAgIEFMT0dFKCIlcyBjYW5ub3QgYmUgY2FsbGVkIGZyb20gYSBjYWxsYmFjayEiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKKyAgICB9CisgICAgcmV0dXJuIHJlcXVlc3RTdGFydCgpOworfQorCithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW06OnNhZmVQYXVzZSgpIHsKKyAgICBpZiAoIWlzUGF1c2VTdXBwb3J0ZWQoKSkgeworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOSU1QTEVNRU5URUQ7CisgICAgfQorCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVN0cmVhbUxvY2spOworICAgIGlmIChjb2xsaWRlc1dpdGhDYWxsYmFjaygpKSB7CisgICAgICAgIEFMT0dFKCIlcyBjYW5ub3QgYmUgY2FsbGVkIGZyb20gYSBjYWxsYmFjayEiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGdldFN0YXRlKCkpIHsKKyAgICAgICAgLy8gUHJvY2VlZCB3aXRoIHBhdXNpbmcuCisgICAgICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVElORzoKKyAgICAgICAgY2FzZSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJURUQ6CisgICAgICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQ6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgLy8gVHJhbnNpdGlvbiBmcm9tIG9uZSBpbmFjdGl2ZSBzdGF0ZSB0byBhbm90aGVyLgorICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfT1BFTjoKKyAgICAgICAgY2FzZSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQRUQ6CisgICAgICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9GTFVTSEVEOgorICAgICAgICAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTRUQpOworICAgICAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKKworICAgICAgICAgICAgLy8gUmVkdW5kYW50PworICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0lORzoKKyAgICAgICAgY2FzZSBBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNFRDoKKyAgICAgICAgICAgIHJldHVybiBBQVVESU9fT0s7CisKKyAgICAgICAgICAgIC8vIERvbid0IGludGVyZmVyZSB3aXRoIHRyYW5zaXRpb25hbCBzdGF0ZXMgb3Igd2hlbiBjbG9zZWQuCisgICAgICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUElORzoKKyAgICAgICAgY2FzZSBBQVVESU9fU1RSRUFNX1NUQVRFX0ZMVVNISU5HOgorICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0lORzoKKyAgICAgICAgY2FzZSBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dXKCJzYWZlUGF1c2UoKSBzdHJlYW0gbm90IHJ1bm5pbmcsIHN0YXRlID0gJXMiLAorICAgICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRTdHJlYW1TdGF0ZVRvVGV4dChnZXRTdGF0ZSgpKSk7CisgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CisgICAgfQorCisgICAgcmV0dXJuIHJlcXVlc3RQYXVzZSgpOworfQorCithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW06OnNhZmVGbHVzaCgpIHsKKyAgICBpZiAoIWlzRmx1c2hTdXBwb3J0ZWQoKSkgeworICAgICAgICBBTE9HRSgiZmx1c2ggbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBzdHJlYW0iKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9VTklNUExFTUVOVEVEOworICAgIH0KKworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJlYW1Mb2NrKTsKKyAgICBpZiAoY29sbGlkZXNXaXRoQ2FsbGJhY2soKSkgeworICAgICAgICBBTE9HRSgic3RyZWFtIGNhbm5vdCBiZSBmbHVzaGVkIGZyb20gYSBjYWxsYmFjayEiKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOworICAgIH0KKworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9faXNGbHVzaEFsbG93ZWQoZ2V0U3RhdGUoKSk7CisgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICByZXR1cm4gcmVxdWVzdEZsdXNoKCk7Cit9CisKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6c2FmZVN0b3AoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVN0cmVhbUxvY2spOworICAgIGlmIChjb2xsaWRlc1dpdGhDYWxsYmFjaygpKSB7CisgICAgICAgIEFMT0dFKCJzdHJlYW0gY2Fubm90IGJlIHN0b3BwZWQgZnJvbSBhIGNhbGxiYWNrISIpOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CisgICAgfQorCisgICAgc3dpdGNoIChnZXRTdGF0ZSgpKSB7CisgICAgICAgIC8vIFByb2NlZWQgd2l0aCBzdG9wcGluZy4KKyAgICAgICAgY2FzZSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJUSU5HOgorICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRFRDoKKyAgICAgICAgY2FzZSBBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRDoKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8vIFRyYW5zaXRpb24gZnJvbSBvbmUgaW5hY3RpdmUgc3RhdGUgdG8gYW5vdGhlci4KKyAgICAgICAgY2FzZSBBQVVESU9fU1RSRUFNX1NUQVRFX09QRU46CisgICAgICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTRUQ6CisgICAgICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9GTFVTSEVEOgorICAgICAgICAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUEVEKTsKKyAgICAgICAgICAgIHJldHVybiBBQVVESU9fT0s7CisKKyAgICAgICAgLy8gUmVkdW5kYW50PworICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBJTkc6CisgICAgICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUEVEOgorICAgICAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKKworICAgICAgICAvLyBEb24ndCBpbnRlcmZlcmUgd2l0aCB0cmFuc2l0aW9uYWwgc3RhdGVzIG9yIHdoZW4gY2xvc2VkLgorICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0lORzoKKyAgICAgICAgY2FzZSBBQVVESU9fU1RSRUFNX1NUQVRFX0ZMVVNISU5HOgorICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0lORzoKKyAgICAgICAgY2FzZSBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dXKCJyZXF1ZXN0U3RvcCgpIHN0cmVhbSBub3QgcnVubmluZywgc3RhdGUgPSAlcyIsCisgICAgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFN0cmVhbVN0YXRlVG9UZXh0KGdldFN0YXRlKCkpKTsKKyAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVxdWVzdFN0b3AoKTsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtOjpzYWZlQ2xvc2UoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVN0cmVhbUxvY2spOworICAgIGlmIChjb2xsaWRlc1dpdGhDYWxsYmFjaygpKSB7CisgICAgICAgIEFMT0dFKCIlcyBjYW5ub3QgYmUgY2FsbGVkIGZyb20gYSBjYWxsYmFjayEiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKKyAgICB9CisgICAgcmV0dXJuIGNsb3NlKCk7Cit9CisKK3ZvaWQgQXVkaW9TdHJlYW06OnNldFN0YXRlKGFhdWRpb19zdHJlYW1fc3RhdGVfdCBzdGF0ZSkgeworICAgIEFMT0dWKCIlcyglcCkgZnJvbSAlZCB0byAlZCIsIF9fZnVuY19fLCB0aGlzLCBtU3RhdGUsIHN0YXRlKTsKKyAgICAvLyBDTE9TRUQgaXMgYSBmaW5hbCBzdGF0ZQorICAgIGlmIChtU3RhdGUgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQpIHsKKyAgICAgICAgQUxPR0UoIiVzKCVwKSB0cmllZCB0byBzZXQgdG8gJWQgYnV0IGFscmVhZHkgQ0xPU0VEIiwgX19mdW5jX18sIHRoaXMsIHN0YXRlKTsKKworICAgIC8vIE9uY2UgRElTQ09OTkVDVEVELCB3ZSBjYW4gb25seSBtb3ZlIHRvIENMT1NFRCBzdGF0ZS4KKyAgICB9IGVsc2UgaWYgKG1TdGF0ZSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRAorICAgICAgICAgICAgICAgJiYgc3RhdGUgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQpIHsKKyAgICAgICAgQUxPR0UoIiVzKCVwKSB0cmllZCB0byBzZXQgdG8gJWQgYnV0IGFscmVhZHkgRElTQ09OTkVDVEVEIiwgX19mdW5jX18sIHRoaXMsIHN0YXRlKTsKKworICAgIH0gZWxzZSB7CisgICAgICAgIG1TdGF0ZSA9IHN0YXRlOworICAgIH0KK30KIAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtOjp3YWl0Rm9yU3RhdGVDaGFuZ2UoYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IGN1cnJlbnRTdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19zdHJlYW1fc3RhdGVfdCAqbmV4dFN0YXRlLApAQCAtMTYzLDcgKzMxNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdGhyZWFkQXJnKQogewogICAgIGlmIChtSGFzVGhyZWFkKSB7Ci0gICAgICAgIEFMT0dFKCJBdWRpb1N0cmVhbTo6Y3JlYXRlVGhyZWFkKCkgLSBtSGFzVGhyZWFkIGFscmVhZHkgdHJ1ZSIpOworICAgICAgICBBTE9HRSgiY3JlYXRlVGhyZWFkKCkgLSBtSGFzVGhyZWFkIGFscmVhZHkgdHJ1ZSIpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogICAgIGlmICh0aHJlYWRQcm9jID09IG51bGxwdHIpIHsKQEAgLTE3NSw4ICszMjksMjIgQEAKICAgICBzZXRQZXJpb2ROYW5vc2Vjb25kcyhwZXJpb2ROYW5vc2Vjb25kcyk7CiAgICAgaW50IGVyciA9IHB0aHJlYWRfY3JlYXRlKCZtVGhyZWFkLCBudWxscHRyLCBBdWRpb1N0cmVhbV9pbnRlcm5hbFRocmVhZFByb2MsIHRoaXMpOwogICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoLWVycm5vKTsKKyAgICAgICAgYW5kcm9pZDo6c3RhdHVzX3Qgc3RhdHVzID0gLWVycm5vOworICAgICAgICBBTE9HRSgiY3JlYXRlVGhyZWFkKCkgLSBwdGhyZWFkX2NyZWF0ZSgpIGZhaWxlZCwgJWQiLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoc3RhdHVzKTsKICAgICB9IGVsc2UgeworICAgICAgICAvLyBUT0RPIFVzZSBBQXVkaW9UaHJlYWQgb3IgbWF5YmUgQW5kcm9pZFRocmVhZAorICAgICAgICAvLyBOYW1lIHRoZSB0aHJlYWQgd2l0aCBhbiBpbmNyZWFzaW5nIGluZGV4LCAiQUF1ZGlvXyMiLCBmb3IgZGVidWdnaW5nLgorICAgICAgICBzdGF0aWMgc3RkOjphdG9taWM8dWludDMyX3Q+IG5leHRUaHJlYWRJbmRleHsxfTsKKyAgICAgICAgY2hhciBuYW1lWzE2XTsgLy8gbWF4IGxlbmd0aCBmb3IgYSBwdGhyZWFkX25hbWUKKyAgICAgICAgdWludDMyX3QgaW5kZXggPSBuZXh0VGhyZWFkSW5kZXgrKzsKKyAgICAgICAgLy8gV3JhcCB0aGUgaW5kZXggc28gdGhhdCB3ZSBkbyBub3QgaGl0IHRoZSAxNiBjaGFyIGxpbWl0CisgICAgICAgIC8vIGFuZCB0byBhdm9pZCBoYXJkLXRvLXJlYWQgbGFyZ2UgbnVtYmVycy4KKyAgICAgICAgaW5kZXggPSBpbmRleCAlIDEwMDAwMDsgIC8vIGFyYml0cmFyeQorICAgICAgICBzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJBQXVkaW9fJXUiLCBpbmRleCk7CisgICAgICAgIGVyciA9IHB0aHJlYWRfc2V0bmFtZV9ucChtVGhyZWFkLCBuYW1lKTsKKyAgICAgICAgQUxPR1dfSUYoKGVyciAhPSAwKSwgIkNvdWxkIG5vdCBzZXQgbmFtZSBvZiBBQXVkaW8gdGhyZWFkLiBlcnIgPSAlZCIsIGVycik7CisKICAgICAgICAgbUhhc1RocmVhZCA9IHRydWU7CiAgICAgICAgIHJldHVybiBBQVVESU9fT0s7CiAgICAgfQpAQCAtMTg1LDcgKzM1Myw3IEBACiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW06OmpvaW5UaHJlYWQodm9pZCoqIHJldHVybkFyZywgaW50NjRfdCB0aW1lb3V0TmFub3NlY29uZHMpCiB7CiAgICAgaWYgKCFtSGFzVGhyZWFkKSB7Ci0gICAgICAgIEFMT0dFKCJBdWRpb1N0cmVhbTo6am9pblRocmVhZCgpIC0gYnV0IGhhcyBubyB0aHJlYWQiKTsKKyAgICAgICAgQUxPR0UoImpvaW5UaHJlYWQoKSAtIGJ1dCBoYXMgbm8gdGhyZWFkIik7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CiAjaWYgMApAQCAtMTk5LDYgKzM2Nyw1NyBAQAogICAgIHJldHVybiBlcnIgPyBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdCgtZXJybm8pIDogbVRocmVhZFJlZ2lzdHJhdGlvblJlc3VsdDsKIH0KIAorYWF1ZGlvX2RhdGFfY2FsbGJhY2tfcmVzdWx0X3QgQXVkaW9TdHJlYW06Om1heWJlQ2FsbERhdGFDYWxsYmFjayh2b2lkICphdWRpb0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgYWF1ZGlvX2RhdGFfY2FsbGJhY2tfcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QOworICAgIEFBdWRpb1N0cmVhbV9kYXRhQ2FsbGJhY2sgZGF0YUNhbGxiYWNrID0gZ2V0RGF0YUNhbGxiYWNrUHJvYygpOworICAgIGlmIChkYXRhQ2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICAvLyBTdG9yZSB0aHJlYWQgSUQgb2YgY2FsbGVyIHRvIGRldGVjdCBzdG9wKCkgYW5kIGNsb3NlKCkgY2FsbHMgZnJvbSBjYWxsYmFjay4KKyAgICAgICAgcGlkX3QgZXhwZWN0ZWQgPSBDQUxMQkFDS19USFJFQURfTk9ORTsKKyAgICAgICAgaWYgKG1EYXRhQ2FsbGJhY2tUaHJlYWQuY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoZXhwZWN0ZWQsIGdldHRpZCgpKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gKCpkYXRhQ2FsbGJhY2spKAorICAgICAgICAgICAgICAgICAgICAoQUF1ZGlvU3RyZWFtICopIHRoaXMsCisgICAgICAgICAgICAgICAgICAgIGdldERhdGFDYWxsYmFja1VzZXJEYXRhKCksCisgICAgICAgICAgICAgICAgICAgIGF1ZGlvRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzKTsKKyAgICAgICAgICAgIG1EYXRhQ2FsbGJhY2tUaHJlYWQuc3RvcmUoQ0FMTEJBQ0tfVEhSRUFEX05PTkUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coIiVzKCkgZGF0YSBjYWxsYmFjayBhbHJlYWR5IHJ1bm5pbmchIiwgX19mdW5jX18pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgQXVkaW9TdHJlYW06Om1heWJlQ2FsbEVycm9yQ2FsbGJhY2soYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCkgeworICAgIEFBdWRpb1N0cmVhbV9lcnJvckNhbGxiYWNrIGVycm9yQ2FsbGJhY2sgPSBnZXRFcnJvckNhbGxiYWNrUHJvYygpOworICAgIGlmIChlcnJvckNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgLy8gU3RvcmUgdGhyZWFkIElEIG9mIGNhbGxlciB0byBkZXRlY3Qgc3RvcCgpIGFuZCBjbG9zZSgpIGNhbGxzIGZyb20gY2FsbGJhY2suCisgICAgICAgIHBpZF90IGV4cGVjdGVkID0gQ0FMTEJBQ0tfVEhSRUFEX05PTkU7CisgICAgICAgIGlmIChtRXJyb3JDYWxsYmFja1RocmVhZC5jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhleHBlY3RlZCwgZ2V0dGlkKCkpKSB7CisgICAgICAgICAgICAoKmVycm9yQ2FsbGJhY2spKAorICAgICAgICAgICAgICAgICAgICAoQUF1ZGlvU3RyZWFtICopIHRoaXMsCisgICAgICAgICAgICAgICAgICAgIGdldEVycm9yQ2FsbGJhY2tVc2VyRGF0YSgpLAorICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworICAgICAgICAgICAgbUVycm9yQ2FsbGJhY2tUaHJlYWQuc3RvcmUoQ0FMTEJBQ0tfVEhSRUFEX05PTkUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coIiVzKCkgZXJyb3IgY2FsbGJhY2sgYWxyZWFkeSBydW5uaW5nISIsIF9fZnVuY19fKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gSXMgdGhpcyBydW5uaW5nIG9uIHRoZSBzYW1lIHRocmVhZCBhcyBhIGNhbGxiYWNrPworLy8gTm90ZTogVGhpcyBjYW5ub3QgYmUgaW1wbGVtZW50ZWQgdXNpbmcgYSB0aHJlYWRfbG9jYWwgYmVjYXVzZSB0aGF0IHdvdWxkCisvLyByZXF1aXJlIHVzaW5nIGEgdGhyZWFkX2xvY2FsIHZhcmlhYmxlIHRoYXQgaXMgc2hhcmVkIGJldHdlZW4gc3RyZWFtcy4KKy8vIFNvIGEgdGhyZWFkX2xvY2FsIHZhcmlhYmxlIHdvdWxkIHByZXZlbnQgc3RvcHBpbmcgb3IgY2xvc2luZyBzdHJlYW0gQSBmcm9tCisvLyBhIGNhbGxiYWNrIG9uIHN0cmVhbSBCLCB3aGljaCBpcyBjdXJyZW50bHkgbGVnYWwgYW5kIG5vdCBzbyB0ZXJyaWJsZS4KK2Jvb2wgQXVkaW9TdHJlYW06OmNvbGxpZGVzV2l0aENhbGxiYWNrKCkgY29uc3QgeworICAgIHBpZF90IHRoaXNUaHJlYWQgPSBnZXR0aWQoKTsKKyAgICAvLyBDb21wYXJlIHRoZSBjdXJyZW50IHRocmVhZCBJRCB3aXRoIHRoZSB0aHJlYWQgSUQgb2YgdGhlIGNhbGxiYWNrCisgICAgLy8gdGhyZWFkcyB0byBzZWUgaXQgdGhleSBtYXRjaC4gSWYgc28gdGhlbiB0aGlzIGNvZGUgaXMgYmVpbmcKKyAgICAvLyBjYWxsZWQgZnJvbSBvbmUgb2YgdGhlIHN0cmVhbSBjYWxsYmFjayBmdW5jdGlvbnMuCisgICAgcmV0dXJuICgobUVycm9yQ2FsbGJhY2tUaHJlYWQubG9hZCgpID09IHRoaXNUaHJlYWQpCisgICAgICAgICAgICB8fCAobURhdGFDYWxsYmFja1RocmVhZC5sb2FkKCkgPT0gdGhpc1RocmVhZCkpOworfQogCiAjaWYgQUFVRElPX1VTRV9WT0xVTUVfU0hBUEVSCiBhbmRyb2lkOjptZWRpYTo6Vm9sdW1lU2hhcGVyOjpTdGF0dXMgQXVkaW9TdHJlYW06OmFwcGx5Vm9sdW1lU2hhcGVyKApAQCAtMjA5LDYgKzQyOCwxMiBAQAogfQogI2VuZGlmCiAKK3ZvaWQgQXVkaW9TdHJlYW06OnNldER1Y2tBbmRNdXRlVm9sdW1lKGZsb2F0IGR1Y2tBbmRNdXRlVm9sdW1lKSB7CisgICAgQUxPR0QoIiVzKCkgdG8gJWYiLCBfX2Z1bmNfXywgZHVja0FuZE11dGVWb2x1bWUpOworICAgIG1EdWNrQW5kTXV0ZVZvbHVtZSA9IGR1Y2tBbmRNdXRlVm9sdW1lOworICAgIGRvU2V0Vm9sdW1lKCk7IC8vIGFwcGx5IHRoaXMgY2hhbmdlCit9CisKIEF1ZGlvU3RyZWFtOjpNeVBsYXllckJhc2U6Ok15UGxheWVyQmFzZShBdWRpb1N0cmVhbSAqcGFyZW50KSA6IG1QYXJlbnQocGFyZW50KSB7CiB9CiAKQEAgLTIzMCw3ICs0NTUsNiBAQAogICAgIH0KIH0KIAotCiB2b2lkIEF1ZGlvU3RyZWFtOjpNeVBsYXllckJhc2U6OmRlc3Ryb3koKSB7CiAgICAgdW5yZWdpc3RlcldpdGhBdWRpb01hbmFnZXIoKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmgKaW5kZXggMzQyMDJkMi4uMzFiODk1YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmgKQEAgLTM5LDYgKzM5LDggQEAKIAogY2xhc3MgQXVkaW9TdHJlYW1CdWlsZGVyOwogCitjb25zdGV4cHIgcGlkX3QgICAgICAgIENBTExCQUNLX1RIUkVBRF9OT05FID0gMDsKKwogLyoqCiAgKiBBQXVkaW8gYXVkaW8gc3RyZWFtLgogICovCkBAIC00OSwxNCArNTEsNDYgQEAKIAogICAgIHZpcnR1YWwgfkF1ZGlvU3RyZWFtKCk7CiAKKyAgICAvKioKKyAgICAgKiBMb2NrIGEgbXV0ZXggYW5kIG1ha2Ugc3VyZSB3ZSBhcmUgbm90IGNhbGxpbmcgZnJvbSBhIGNhbGxiYWNrIGZ1bmN0aW9uLgorICAgICAqIEByZXR1cm4gcmVzdWx0IG9mIHJlcXVlc3RTdGFydCgpOworICAgICAqLworICAgIGFhdWRpb19yZXN1bHRfdCBzYWZlU3RhcnQoKTsKKworICAgIGFhdWRpb19yZXN1bHRfdCBzYWZlUGF1c2UoKTsKKworICAgIGFhdWRpb19yZXN1bHRfdCBzYWZlRmx1c2goKTsKKworICAgIGFhdWRpb19yZXN1bHRfdCBzYWZlU3RvcCgpOworCisgICAgYWF1ZGlvX3Jlc3VsdF90IHNhZmVDbG9zZSgpOwogCiAgICAgLy8gPT09PT09PT09PT0gQmVnaW4gQUJTVFJBQ1QgbWV0aG9kcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3Byb3RlY3RlZDoKIAogICAgIC8qIEFzeW5jaHJvbm91cyByZXF1ZXN0cy4KICAgICAgKiBVc2Ugd2FpdEZvclN0YXRlQ2hhbmdlKCkgdG8gd2FpdCBmb3IgY29tcGxldGlvbi4KICAgICAgKi8KICAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCByZXF1ZXN0U3RhcnQoKSA9IDA7CiAKKyAgICAvKioKKyAgICAgKiBDaGVjayB0aGUgc3RhdGUgdG8gc2VlIGlmIFBhdXNlIGlmIGN1cnJlbnRseSBsZWdhbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXN1bHQgcG9pbnRlciB0byByZXR1cm4gY29kZQorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBPSyB0byBjb250aW51ZSwgaWYgZmFsc2UgdGhlbiByZXR1cm4gcmVzdWx0CisgICAgICovCisgICAgYm9vbCBjaGVja1BhdXNlU3RhdGVUcmFuc2l0aW9uKGFhdWRpb19yZXN1bHRfdCAqcmVzdWx0KTsKKworICAgIHZpcnR1YWwgYm9vbCBpc0ZsdXNoU3VwcG9ydGVkKCkgY29uc3QgeworICAgICAgICAvLyBPbmx5IGltcGxlbWVudCBGTFVTSCBmb3IgT1VUUFVUIHN0cmVhbXMuCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNQYXVzZVN1cHBvcnRlZCgpIGNvbnN0IHsKKyAgICAgICAgLy8gT25seSBpbXBsZW1lbnQgUEFVU0UgZm9yIE9VVFBVVCBzdHJlYW1zLgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCiAgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgcmVxdWVzdFBhdXNlKCkKICAgICB7CiAgICAgICAgIC8vIE9ubHkgaW1wbGVtZW50IHRoaXMgZm9yIE9VVFBVVCBzdHJlYW1zLgpAQCAtNzAsNiArMTA0LDcgQEAKIAogICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHJlcXVlc3RTdG9wKCkgPSAwOwogCitwdWJsaWM6CiAgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgZ2V0VGltZXN0YW1wKGNsb2NraWRfdCBjbG9ja0lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqZnJhbWVQb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVOYW5vc2Vjb25kcykgPSAwOwpAQCAtODEsNyArMTE2LDYgQEAKICAgICAgKi8KICAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCB1cGRhdGVTdGF0ZU1hY2hpbmUoKSA9IDA7CiAKLQogICAgIC8vID09PT09PT09PT09IEVuZCBBQlNUUkFDVCBtZXRob2RzID09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiAgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3Qgd2FpdEZvclN0YXRlQ2hhbmdlKGFhdWRpb19zdHJlYW1fc3RhdGVfdCBjdXJyZW50U3RhdGUsCkBAIC0xODgsNiArMjIyLDIyIEBACiAKICAgICB2aXJ0dWFsIGFhdWRpb19kaXJlY3Rpb25fdCBnZXREaXJlY3Rpb24oKSBjb25zdCA9IDA7CiAKKyAgICBhYXVkaW9fdXNhZ2VfdCBnZXRVc2FnZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Vc2FnZTsKKyAgICB9CisKKyAgICBhYXVkaW9fY29udGVudF90eXBlX3QgZ2V0Q29udGVudFR5cGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQ29udGVudFR5cGU7CisgICAgfQorCisgICAgYWF1ZGlvX2lucHV0X3ByZXNldF90IGdldElucHV0UHJlc2V0KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUlucHV0UHJlc2V0OworICAgIH0KKworICAgIGludDMyX3QgZ2V0U2Vzc2lvbklkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVNlc3Npb25JZDsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBUaGlzIGlzIG9ubHkgdmFsaWQgYWZ0ZXIgc2V0U2FtcGxlc1BlckZyYW1lKCkgYW5kIHNldEZvcm1hdCgpIGhhdmUgYmVlbiBjYWxsZWQuCiAgICAgICovCkBAIC0yMDIsNiArMjUyLDIwIEBACiAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2Zvcm1hdFRvU2l6ZUluQnl0ZXMobUZvcm1hdCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogVGhpcyBpcyBvbmx5IHZhbGlkIGFmdGVyIHNldFNhbXBsZXNQZXJGcmFtZSgpIGFuZCBzZXREZXZpY2VGb3JtYXQoKSBoYXZlIGJlZW4gY2FsbGVkLgorICAgICAqLworICAgIGludDMyX3QgZ2V0Qnl0ZXNQZXJEZXZpY2VGcmFtZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TYW1wbGVzUGVyRnJhbWUgKiBnZXRCeXRlc1BlckRldmljZVNhbXBsZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgb25seSB2YWxpZCBhZnRlciBzZXREZXZpY2VGb3JtYXQoKSBoYXMgYmVlbiBjYWxsZWQuCisgICAgICovCisgICAgaW50MzJfdCBnZXRCeXRlc1BlckRldmljZVNhbXBsZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfZm9ybWF0VG9TaXplSW5CeXRlcyhnZXREZXZpY2VGb3JtYXQoKSk7CisgICAgfQorCiAgICAgdmlydHVhbCBpbnQ2NF90IGdldEZyYW1lc1dyaXR0ZW4oKSA9IDA7CiAKICAgICB2aXJ0dWFsIGludDY0X3QgZ2V0RnJhbWVzUmVhZCgpID0gMDsKQEAgLTIwOSwxMyArMjczLDE5IEBACiAgICAgQUF1ZGlvU3RyZWFtX2RhdGFDYWxsYmFjayBnZXREYXRhQ2FsbGJhY2tQcm9jKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbURhdGFDYWxsYmFja1Byb2M7CiAgICAgfQorCiAgICAgQUF1ZGlvU3RyZWFtX2Vycm9yQ2FsbGJhY2sgZ2V0RXJyb3JDYWxsYmFja1Byb2MoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtRXJyb3JDYWxsYmFja1Byb2M7CiAgICAgfQogCisgICAgYWF1ZGlvX2RhdGFfY2FsbGJhY2tfcmVzdWx0X3QgbWF5YmVDYWxsRGF0YUNhbGxiYWNrKHZvaWQgKmF1ZGlvRGF0YSwgaW50MzJfdCBudW1GcmFtZXMpOworCisgICAgdm9pZCBtYXliZUNhbGxFcnJvckNhbGxiYWNrKGFhdWRpb19yZXN1bHRfdCByZXN1bHQpOworCiAgICAgdm9pZCAqZ2V0RGF0YUNhbGxiYWNrVXNlckRhdGEoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtRGF0YUNhbGxiYWNrVXNlckRhdGE7CiAgICAgfQorCiAgICAgdm9pZCAqZ2V0RXJyb3JDYWxsYmFja1VzZXJEYXRhKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbUVycm9yQ2FsbGJhY2tVc2VyRGF0YTsKICAgICB9CkBAIC0yMjQsMTAgKzI5NCwyNSBAQAogICAgICAgICByZXR1cm4gbUZyYW1lc1BlckRhdGFDYWxsYmFjazsKICAgICB9CiAKLSAgICBib29sIGlzRGF0YUNhbGxiYWNrQWN0aXZlKCkgewotICAgICAgICByZXR1cm4gKG1EYXRhQ2FsbGJhY2tQcm9jICE9IG51bGxwdHIpICYmIGlzQWN0aXZlKCk7CisgICAgLyoqCisgICAgICogQHJldHVybiB0cnVlIGlmIGRhdGEgY2FsbGJhY2sgaGFzIGJlZW4gc3BlY2lmaWVkCisgICAgICovCisgICAgYm9vbCBpc0RhdGFDYWxsYmFja1NldCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1EYXRhQ2FsbGJhY2tQcm9jICE9IG51bGxwdHI7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQHJldHVybiB0cnVlIGlmIGRhdGEgY2FsbGJhY2sgaGFzIGJlZW4gc3BlY2lmaWVkIGFuZCBzdHJlYW0gaXMgcnVubmluZworICAgICAqLworICAgIGJvb2wgaXNEYXRhQ2FsbGJhY2tBY3RpdmUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBpc0RhdGFDYWxsYmFja1NldCgpICYmIGlzQWN0aXZlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0cnVlIGlmIGNhbGxlZCBmcm9tIHRoZSBzYW1lIHRocmVhZCBhcyB0aGUgY2FsbGJhY2sKKyAgICAgKi8KKyAgICBib29sIGNvbGxpZGVzV2l0aENhbGxiYWNrKCkgY29uc3Q7CisKICAgICAvLyA9PT09PT09PT09PT09PSBJL08gPT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgLy8gQSBTdHJlYW0gd2lsbCBvbmx5IGltcGxlbWVudCByZWFkKCkgb3Igd3JpdGUoKSBkZXBlbmRpbmcgb24gaXRzIGRpcmVjdGlvbi4KICAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCB3cml0ZShjb25zdCB2b2lkICpidWZmZXIgX191bnVzZWQsCkBAIC0yNDMsMTIgKzMyOCw5IEBACiAgICAgfQogCiAgICAgLy8gVGhpcyBpcyB1c2VkIGJ5IHRoZSBBdWRpb01hbmFnZXIgdG8gZHVjayBhbmQgbXV0ZSB0aGUgc3RyZWFtIHdoZW4gY2hhbmdpbmcgYXVkaW8gZm9jdXMuCi0gICAgdm9pZCBzZXREdWNrQW5kTXV0ZVZvbHVtZShmbG9hdCBkdWNrQW5kTXV0ZVZvbHVtZSkgewotICAgICAgICBtRHVja0FuZE11dGVWb2x1bWUgPSBkdWNrQW5kTXV0ZVZvbHVtZTsKLSAgICAgICAgZG9TZXRWb2x1bWUoKTsgLy8gYXBwbHkgdGhpcyBjaGFuZ2UKLSAgICB9CisgICAgdm9pZCBzZXREdWNrQW5kTXV0ZVZvbHVtZShmbG9hdCBkdWNrQW5kTXV0ZVZvbHVtZSk7CiAKLSAgICBmbG9hdCBnZXREdWNrQW5kTXV0ZVZvbHVtZSgpIHsKKyAgICBmbG9hdCBnZXREdWNrQW5kTXV0ZVZvbHVtZSgpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1EdWNrQW5kTXV0ZVZvbHVtZTsKICAgICB9CiAKQEAgLTI4OCwxMSArMzcwLDEzIEBACiAgICAgICAgIHJldHVybiBtUGxheWVyQmFzZS0+Z2V0UmVzdWx0KCk7CiAgICAgfQogCisgICAgLy8gUGFzcyBwYXVzZSByZXF1ZXN0IHRocm91Z2ggUGxheWVyQmFzZSBmb3IgdHJhY2tpbmcuCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHN5c3RlbVBhdXNlKCkgewogICAgICAgICBtUGxheWVyQmFzZS0+cGF1c2UoKTsKICAgICAgICAgcmV0dXJuIG1QbGF5ZXJCYXNlLT5nZXRSZXN1bHQoKTsKICAgICB9CiAKKyAgICAvLyBQYXNzIHN0b3AgcmVxdWVzdCB0aHJvdWdoIFBsYXllckJhc2UgZm9yIHRyYWNraW5nLgogICAgIGFhdWRpb19yZXN1bHRfdCBzeXN0ZW1TdG9wKCkgewogICAgICAgICBtUGxheWVyQmFzZS0+c3RvcCgpOwogICAgICAgICByZXR1cm4gbVBsYXllckJhc2UtPmdldFJlc3VsdCgpOwpAQCAtMzMxLDE3ICs0MTUsMTcgQEAKIAogICAgICAgICBhbmRyb2lkOjpzdGF0dXNfdCBwbGF5ZXJTdGFydCgpIG92ZXJyaWRlIHsKICAgICAgICAgICAgIC8vIG1QYXJlbnQgc2hvdWxkIE5PVCBiZSBudWxsLiBTbyBnbyBhaGVhZCBhbmQgY3Jhc2ggaWYgaXQgaXMuCi0gICAgICAgICAgICBtUmVzdWx0ID0gbVBhcmVudC0+cmVxdWVzdFN0YXJ0KCk7CisgICAgICAgICAgICBtUmVzdWx0ID0gbVBhcmVudC0+c2FmZVN0YXJ0KCk7CiAgICAgICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTdGF0dXMobVJlc3VsdCk7CiAgICAgICAgIH0KIAogICAgICAgICBhbmRyb2lkOjpzdGF0dXNfdCBwbGF5ZXJQYXVzZSgpIG92ZXJyaWRlIHsKLSAgICAgICAgICAgIG1SZXN1bHQgPSBtUGFyZW50LT5yZXF1ZXN0UGF1c2UoKTsKKyAgICAgICAgICAgIG1SZXN1bHQgPSBtUGFyZW50LT5zYWZlUGF1c2UoKTsKICAgICAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFN0YXR1cyhtUmVzdWx0KTsKICAgICAgICAgfQogCiAgICAgICAgIGFuZHJvaWQ6OnN0YXR1c190IHBsYXllclN0b3AoKSBvdmVycmlkZSB7Ci0gICAgICAgICAgICBtUmVzdWx0ID0gbVBhcmVudC0+cmVxdWVzdFN0b3AoKTsKKyAgICAgICAgICAgIG1SZXN1bHQgPSBtUGFyZW50LT5zYWZlU3RvcCgpOwogICAgICAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU3RhdHVzKG1SZXN1bHQpOwogICAgICAgICB9CiAKQEAgLTM3MSw2ICs0NTUsNyBAQAogCiAgICAgLyoqCiAgICAgICogVGhpcyBzaG91bGQgbm90IGJlIGNhbGxlZCBhZnRlciB0aGUgb3BlbigpIGNhbGwuCisgICAgICogVE9ETyBmb3IgbXVsdGlwbGUgc2V0dGVyczogYXNzZXJ0KG1TdGF0ZSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX1VOSU5JVElBTElaRUQpCiAgICAgICovCiAgICAgdm9pZCBzZXRTYW1wbGVSYXRlKGludDMyX3Qgc2FtcGxlUmF0ZSkgewogICAgICAgICBtU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CkBAIC0zOTcsMTUgKzQ4MiwyNiBAQAogICAgICAgICBtRm9ybWF0ID0gZm9ybWF0OwogICAgIH0KIAotICAgIHZvaWQgc2V0U3RhdGUoYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IHN0YXRlKSB7Ci0gICAgICAgIG1TdGF0ZSA9IHN0YXRlOworICAgIC8qKgorICAgICAqIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIG9wZW4oKSBjYWxsLgorICAgICAqLworICAgIHZvaWQgc2V0RGV2aWNlRm9ybWF0KGFhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKKyAgICAgICAgbURldmljZUZvcm1hdCA9IGZvcm1hdDsKICAgICB9CiAKKyAgICBhYXVkaW9fZm9ybWF0X3QgZ2V0RGV2aWNlRm9ybWF0KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbURldmljZUZvcm1hdDsKKyAgICB9CisKKyAgICB2b2lkIHNldFN0YXRlKGFhdWRpb19zdHJlYW1fc3RhdGVfdCBzdGF0ZSk7CisKICAgICB2b2lkIHNldERldmljZUlkKGludDMyX3QgZGV2aWNlSWQpIHsKICAgICAgICAgbURldmljZUlkID0gZGV2aWNlSWQ7CiAgICAgfQogCi0gICAgc3RkOjptdXRleCAgICAgICAgICAgbVN0cmVhbU11dGV4OworICAgIHZvaWQgc2V0U2Vzc2lvbklkKGludDMyX3Qgc2Vzc2lvbklkKSB7CisgICAgICAgIG1TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisgICAgfQogCiAgICAgc3RkOjphdG9taWM8Ym9vbD4gICAgbUNhbGxiYWNrRW5hYmxlZHtmYWxzZX07CiAKQEAgLTQxMyw2ICs1MDksMjEgQEAKIAogcHJvdGVjdGVkOgogCisgICAgLyoqCisgICAgICogRWl0aGVyIGNvbnZlcnQgdGhlIGRhdGEgZnJvbSBkZXZpY2UgZm9ybWF0IHRvIGFwcCBmb3JtYXQgYW5kIHJldHVybiBhIHBvaW50ZXIKKyAgICAgKiB0byB0aGUgY29udmVyc2lvbiBidWZmZXIsCisgICAgICogT1IganVzdCBwYXNzIGJhY2sgdGhlIG9yaWdpbmFsIHBvaW50ZXIuCisgICAgICoKKyAgICAgKiBOb3RlIHRoYXQgdGhpcyBpcyBvbmx5IHVzZWQgZm9yIHRoZSBJTlBVVCBwYXRoLgorICAgICAqCisgICAgICogQHBhcmFtIGF1ZGlvRGF0YQorICAgICAqIEBwYXJhbSBudW1GcmFtZXMKKyAgICAgKiBAcmV0dXJuIG9yaWdpbmFsIHBvaW50ZXIgb3IgdGhlIGNvbnZlcnNpb24gYnVmZmVyCisgICAgICovCisgICAgdmlydHVhbCBjb25zdCB2b2lkICogbWF5YmVDb252ZXJ0RGV2aWNlRGF0YShjb25zdCB2b2lkICphdWRpb0RhdGEsIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgICAgIHJldHVybiBhdWRpb0RhdGE7CisgICAgfQorCiAgICAgdm9pZCBzZXRQZXJpb2ROYW5vc2Vjb25kcyhpbnQ2NF90IHBlcmlvZE5hbm9zZWNvbmRzKSB7CiAgICAgICAgIG1QZXJpb2ROYW5vc2Vjb25kcy5zdG9yZShwZXJpb2ROYW5vc2Vjb25kcywgc3RkOjptZW1vcnlfb3JkZXJfcmVsZWFzZSk7CiAgICAgfQpAQCAtNDIxLDQwICs1MzIsNzQgQEAKICAgICAgICAgcmV0dXJuIG1QZXJpb2ROYW5vc2Vjb25kcy5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX2FjcXVpcmUpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIG9wZW4oKSBjYWxsLgorICAgICAqLworICAgIHZvaWQgc2V0VXNhZ2UoYWF1ZGlvX3VzYWdlX3QgdXNhZ2UpIHsKKyAgICAgICAgbVVzYWdlID0gdXNhZ2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBzaG91bGQgbm90IGJlIGNhbGxlZCBhZnRlciB0aGUgb3BlbigpIGNhbGwuCisgICAgICovCisgICAgdm9pZCBzZXRDb250ZW50VHlwZShhYXVkaW9fY29udGVudF90eXBlX3QgY29udGVudFR5cGUpIHsKKyAgICAgICAgbUNvbnRlbnRUeXBlID0gY29udGVudFR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBzaG91bGQgbm90IGJlIGNhbGxlZCBhZnRlciB0aGUgb3BlbigpIGNhbGwuCisgICAgICovCisgICAgdm9pZCBzZXRJbnB1dFByZXNldChhYXVkaW9faW5wdXRfcHJlc2V0X3QgaW5wdXRQcmVzZXQpIHsKKyAgICAgICAgbUlucHV0UHJlc2V0ID0gaW5wdXRQcmVzZXQ7CisgICAgfQorCiBwcml2YXRlOgorCisgICAgc3RkOjptdXRleCAgICAgICAgICAgICAgICAgbVN0cmVhbUxvY2s7CisKICAgICBjb25zdCBhbmRyb2lkOjpzcDxNeVBsYXllckJhc2U+ICAgbVBsYXllckJhc2U7CiAKICAgICAvLyBUaGVzZSBkbyBub3QgY2hhbmdlIGFmdGVyIG9wZW4oKS4KLSAgICBpbnQzMl90ICAgICAgICAgICAgICAgIG1TYW1wbGVzUGVyRnJhbWUgPSBBQVVESU9fVU5TUEVDSUZJRUQ7Ci0gICAgaW50MzJfdCAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSA9IEFBVURJT19VTlNQRUNJRklFRDsKLSAgICBpbnQzMl90ICAgICAgICAgICAgICAgIG1EZXZpY2VJZCA9IEFBVURJT19VTlNQRUNJRklFRDsKLSAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3QgIG1TaGFyaW5nTW9kZSA9IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEOwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgbVNoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZCA9IGZhbHNlOyAvLyBtdXN0IG1hdGNoIHNoYXJpbmcgbW9kZSByZXF1ZXN0ZWQKLSAgICBhYXVkaW9fZm9ybWF0X3QgICAgICAgIG1Gb3JtYXQgPSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEOwotICAgIGFhdWRpb19zdHJlYW1fc3RhdGVfdCAgbVN0YXRlID0gQUFVRElPX1NUUkVBTV9TVEFURV9VTklOSVRJQUxJWkVEOworICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICBtU2FtcGxlc1BlckZyYW1lID0gQUFVRElPX1VOU1BFQ0lGSUVEOworICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSA9IEFBVURJT19VTlNQRUNJRklFRDsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgbURldmljZUlkID0gQUFVRElPX1VOU1BFQ0lGSUVEOworICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCAgICAgICBtU2hhcmluZ01vZGUgPSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRDsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbVNoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZCA9IGZhbHNlOyAvLyBtdXN0IG1hdGNoIHNoYXJpbmcgbW9kZSByZXF1ZXN0ZWQKKyAgICBhYXVkaW9fZm9ybWF0X3QgICAgICAgICAgICAgbUZvcm1hdCA9IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQ7CisgICAgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90ICAgICAgIG1TdGF0ZSA9IEFBVURJT19TVFJFQU1fU1RBVEVfVU5JTklUSUFMSVpFRDsKKyAgICBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90ICAgbVBlcmZvcm1hbmNlTW9kZSA9IEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkU7CiAKLSAgICBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IG1QZXJmb3JtYW5jZU1vZGUgPSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FOworICAgIGFhdWRpb191c2FnZV90ICAgICAgICAgICAgICBtVXNhZ2UgICAgICAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOworICAgIGFhdWRpb19jb250ZW50X3R5cGVfdCAgICAgICBtQ29udGVudFR5cGUgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOworICAgIGFhdWRpb19pbnB1dF9wcmVzZXRfdCAgICAgICBtSW5wdXRQcmVzZXQgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOworCisgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CisKKyAgICAvLyBTb21ldGltZXMgdGhlIGhhcmR3YXJlIGlzIG9wZXJhdGluZyB3aXRoIGEgZGlmZmVyZW50IGZvcm1hdCBmcm9tIHRoZSBhcHAuCisgICAgLy8gVGhlbiB3ZSByZXF1aXJlIGNvbnZlcnNpb24gaW4gQUF1ZGlvLgorICAgIGFhdWRpb19mb3JtYXRfdCAgICAgICAgICAgICBtRGV2aWNlRm9ybWF0ID0gQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRDsKIAogICAgIC8vIGNhbGxiYWNrIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogICAgIEFBdWRpb1N0cmVhbV9kYXRhQ2FsbGJhY2sgICBtRGF0YUNhbGxiYWNrUHJvYyA9IG51bGxwdHI7ICAvLyBleHRlcm5hbCBjYWxsYmFjayBmdW5jdGlvbnMKICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAqbURhdGFDYWxsYmFja1VzZXJEYXRhID0gbnVsbHB0cjsKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgbUZyYW1lc1BlckRhdGFDYWxsYmFjayA9IEFBVURJT19VTlNQRUNJRklFRDsgLy8gZnJhbWVzCisgICAgc3RkOjphdG9taWM8cGlkX3Q+ICAgICAgICAgIG1EYXRhQ2FsbGJhY2tUaHJlYWR7Q0FMTEJBQ0tfVEhSRUFEX05PTkV9OwogCiAgICAgQUF1ZGlvU3RyZWFtX2Vycm9yQ2FsbGJhY2sgIG1FcnJvckNhbGxiYWNrUHJvYyA9IG51bGxwdHI7CiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgKm1FcnJvckNhbGxiYWNrVXNlckRhdGEgPSBudWxscHRyOworICAgIHN0ZDo6YXRvbWljPHBpZF90PiAgICAgICAgICBtRXJyb3JDYWxsYmFja1RocmVhZHtDQUxMQkFDS19USFJFQURfTk9ORX07CiAKICAgICAvLyBiYWNrZ3JvdW5kIHRocmVhZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgYm9vbCAgICAgICAgICAgICAgICAgICBtSGFzVGhyZWFkID0gZmFsc2U7Ci0gICAgcHRocmVhZF90ICAgICAgICAgICAgICBtVGhyZWFkOyAvLyBpbml0aWFsaXplZCBpbiBjb25zdHJ1Y3RvcgorICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtSGFzVGhyZWFkID0gZmFsc2U7CisgICAgcHRocmVhZF90ICAgICAgICAgICAgICAgICAgIG1UaHJlYWQ7IC8vIGluaXRpYWxpemVkIGluIGNvbnN0cnVjdG9yCiAKICAgICAvLyBUaGVzZSBhcmUgc2V0IGJ5IHRoZSBhcHBsaWNhdGlvbiB0aHJlYWQgYW5kIHRoZW4gcmVhZCBieSB0aGUgYXVkaW8gcHRocmVhZC4KLSAgICBzdGQ6OmF0b21pYzxpbnQ2NF90PiAgIG1QZXJpb2ROYW5vc2Vjb25kczsgLy8gZm9yIHR1bmluZyBTQ0hFRF9GSUZPIHRocmVhZHMKKyAgICBzdGQ6OmF0b21pYzxpbnQ2NF90PiAgICAgICAgbVBlcmlvZE5hbm9zZWNvbmRzOyAvLyBmb3IgdHVuaW5nIFNDSEVEX0ZJRk8gdGhyZWFkcwogICAgIC8vIFRPRE8gbWFrZSBhdG9taWM/Ci0gICAgYWF1ZGlvX2F1ZGlvX3RocmVhZF9wcm9jX3QgbVRocmVhZFByb2MgPSBudWxscHRyOwotICAgIHZvaWQqICAgICAgICAgICAgICAgICAgbVRocmVhZEFyZyA9IG51bGxwdHI7Ci0gICAgYWF1ZGlvX3Jlc3VsdF90ICAgICAgICBtVGhyZWFkUmVnaXN0cmF0aW9uUmVzdWx0ID0gQUFVRElPX09LOwotCisgICAgYWF1ZGlvX2F1ZGlvX3RocmVhZF9wcm9jX3QgIG1UaHJlYWRQcm9jID0gbnVsbHB0cjsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAqbVRocmVhZEFyZyA9IG51bGxwdHI7CisgICAgYWF1ZGlvX3Jlc3VsdF90ICAgICAgICAgICAgIG1UaHJlYWRSZWdpc3RyYXRpb25SZXN1bHQgPSBBQVVESU9fT0s7CiAKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtQnVpbGRlci5jcHAKaW5kZXggMDllYmIzZS4uM2E3YTU3OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtQnVpbGRlci5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtQnVpbGRlci5jcHAKQEAgLTE0LDcgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNkZWZpbmUgTE9HX1RBRyAiQUF1ZGlvIgorI2RlZmluZSBMT0dfVEFHICJBdWRpb1N0cmVhbUJ1aWxkZXIiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKQEAgLTg3LDcgKzg3LDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HRSgiQXVkaW9TdHJlYW1CdWlsZGVyKCk6IGJhZCBkaXJlY3Rpb24gPSAlZCIsIGRpcmVjdGlvbik7CisgICAgICAgICAgICBBTE9HRSgiJXMoKSBiYWQgZGlyZWN0aW9uID0gJWQiLCBfX2Z1bmNfXywgZGlyZWN0aW9uKTsKICAgICAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9JTExFR0FMX0FSR1VNRU5UOwogICAgIH0KICAgICByZXR1cm4gcmVzdWx0OwpAQCAtOTksNyArOTksNyBAQAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtQnVpbGRlcjo6YnVpbGQoQXVkaW9TdHJlYW0qKiBzdHJlYW1QdHIpIHsKICAgICBBdWRpb1N0cmVhbSAqYXVkaW9TdHJlYW0gPSBudWxscHRyOwogICAgIGlmIChzdHJlYW1QdHIgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiQXVkaW9TdHJlYW1CdWlsZGVyOjpidWlsZCgpIHN0cmVhbVB0ciBpcyBudWxsIik7CisgICAgICAgIEFMT0dFKCIlcygpIHN0cmVhbVB0ciBpcyBudWxsIiwgX19mdW5jX18pOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX05VTEw7CiAgICAgfQogICAgICpzdHJlYW1QdHIgPSBudWxscHRyOwpAQCAtMTI0LDEzICsxMjQsMTEgQEAKICAgICBpZiAobWFwRXhjbHVzaXZlUG9saWN5ID09IEFBVURJT19VTlNQRUNJRklFRCkgewogICAgICAgICBtYXBFeGNsdXNpdmVQb2xpY3kgPSBBQVVESU9fTU1BUF9FWENMVVNJVkVfUE9MSUNZX0RFRkFVTFQ7CiAgICAgfQotICAgIEFMT0dEKCJBdWRpb1N0cmVhbUJ1aWxkZXIoKTogbW1hcFBvbGljeSA9ICVkLCBtYXBFeGNsdXNpdmVQb2xpY3kgPSAlZCIsCi0gICAgICAgICAgbW1hcFBvbGljeSwgbWFwRXhjbHVzaXZlUG9saWN5KTsKIAogICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSA9IGdldFNoYXJpbmdNb2RlKCk7CiAgICAgaWYgKChzaGFyaW5nTW9kZSA9PSBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSkKICAgICAgICAgJiYgKG1hcEV4Y2x1c2l2ZVBvbGljeSA9PSBBQVVESU9fUE9MSUNZX05FVkVSKSkgewotICAgICAgICBBTE9HVygiQXVkaW9TdHJlYW1CdWlsZGVyKCk6IEVYQ0xVU0lWRSBzaGFyaW5nIG1vZGUgbm90IHN1cHBvcnRlZC4gVXNlIFNIQVJFRC4iKTsKKyAgICAgICAgQUxPR0QoIiVzKCkgRVhDTFVTSVZFIHNoYXJpbmcgbW9kZSBub3Qgc3VwcG9ydGVkLiBVc2UgU0hBUkVELiIsIF9fZnVuY19fKTsKICAgICAgICAgc2hhcmluZ01vZGUgPSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRDsKICAgICAgICAgc2V0U2hhcmluZ01vZGUoc2hhcmluZ01vZGUpOwogICAgIH0KQEAgLTE0MSw2ICsxMzksMTQgQEAKICAgICAvLyBUT0RPIFN1cHBvcnQgb3RoZXIgcGVyZm9ybWFuY2Ugc2V0dGluZ3MgaW4gTU1BUCBtb2RlLgogICAgIC8vIERpc2FibGUgTU1BUCBpZiBsb3cgbGF0ZW5jeSBub3QgcmVxdWVzdGVkLgogICAgIGlmIChnZXRQZXJmb3JtYW5jZU1vZGUoKSAhPSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSkgeworICAgICAgICBBTE9HRCgiJXMoKSBNTUFQIG5vdCBhdmFpbGFibGUgYmVjYXVzZSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSBub3QgdXNlZC4iLAorICAgICAgICAgICAgICBfX2Z1bmNfXyk7CisgICAgICAgIGFsbG93TU1hcCA9IGZhbHNlOworICAgIH0KKworICAgIC8vIFNlc3Npb25JRCBhbmQgRWZmZWN0cyBhcmUgb25seSBzdXBwb3J0ZWQgaW4gTGVnYWN5IG1vZGUuCisgICAgaWYgKGdldFNlc3Npb25JZCgpICE9IEFBVURJT19TRVNTSU9OX0lEX05PTkUpIHsKKyAgICAgICAgQUxPR0QoIiVzKCkgTU1BUCBub3QgYXZhaWxhYmxlIGJlY2F1c2Ugc2Vzc2lvbklkIHVzZWQuIiwgX19mdW5jX18pOwogICAgICAgICBhbGxvd01NYXAgPSBmYWxzZTsKICAgICB9CiAKQEAgLTE1Niw3ICsxNjIsNyBAQAogICAgICAgICAgICAgYXVkaW9TdHJlYW0gPSBudWxscHRyOwogCiAgICAgICAgICAgICBpZiAoaXNNTWFwICYmIGFsbG93TGVnYWN5KSB7Ci0gICAgICAgICAgICAgICAgQUxPR0QoIkF1ZGlvU3RyZWFtQnVpbGRlci5idWlsZCgpIE1NQVAgc3RyZWFtIGRpZCBub3Qgb3BlbiBzbyB0cnkgTGVnYWN5IHBhdGgiKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMoKSBNTUFQIHN0cmVhbSBkaWQgbm90IG9wZW4gc28gdHJ5IExlZ2FjeSBwYXRoIiwgX19mdW5jX18pOwogICAgICAgICAgICAgICAgIC8vIElmIE1NQVAgc3RyZWFtIGZhaWxlZCB0byBvcGVuIHRoZW4gVFJZIHVzaW5nIGEgbGVnYWN5IHN0cmVhbS4KICAgICAgICAgICAgICAgICByZXN1bHQgPSBidWlsZGVyX2NyZWF0ZVN0cmVhbShnZXREaXJlY3Rpb24oKSwgc2hhcmluZ01vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsICZhdWRpb1N0cmVhbSk7CkBAIC0xOTAsNyArMTk2LDcgQEAKICAgICAgICAgY2FzZSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWToKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoIkF1ZGlvU3RyZWFtQnVpbGRlcjogaWxsZWdhbCBwZXJmb3JtYW5jZU1vZGUgPSAlZCIsIG1QZXJmb3JtYW5jZU1vZGUpOworICAgICAgICAgICAgQUxPR0UoImlsbGVnYWwgcGVyZm9ybWFuY2VNb2RlID0gJWQiLCBtUGVyZm9ybWFuY2VNb2RlKTsKICAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVDsKICAgICAgICAgICAgIC8vIGJyZWFrOwogICAgIH0KQEAgLTE5OSw3ICsyMDUsNyBAQAogICAgIGlmIChtRnJhbWVzUGVyRGF0YUNhbGxiYWNrICE9IEFBVURJT19VTlNQRUNJRklFRAogICAgICAgICAmJiAobUZyYW1lc1BlckRhdGFDYWxsYmFjayA8IEZSQU1FU19QRVJfREFUQV9DQUxMQkFDS19NSU4KICAgICAgICAgICAgIHx8IG1GcmFtZXNQZXJEYXRhQ2FsbGJhY2sgPiBGUkFNRVNfUEVSX0RBVEFfQ0FMTEJBQ0tfTUFYKSkgewotICAgICAgICBBTE9HRSgiQXVkaW9TdHJlYW1CdWlsZGVyOiBmcmFtZXNQZXJEYXRhQ2FsbGJhY2sgb3V0IG9mIHJhbmdlID0gJWQiLAorICAgICAgICBBTE9HRSgiZnJhbWVzUGVyRGF0YUNhbGxiYWNrIG91dCBvZiByYW5nZSA9ICVkIiwKICAgICAgICAgICAgICAgbUZyYW1lc1BlckRhdGFDYWxsYmFjayk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQnVmZmVyLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQnVmZmVyLmNwcAppbmRleCBhODY5ODg2Li5iMDkyNThlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuY3BwCkBAIC0yMiw2ICsyMiw4IEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKICNpbmNsdWRlICJGaWZvQ29udHJvbGxlckJhc2UuaCIKICNpbmNsdWRlICJGaWZvQ29udHJvbGxlci5oIgogI2luY2x1ZGUgIkZpZm9Db250cm9sbGVySW5kaXJlY3QuaCIKQEAgLTQzLDcgKzQ1LDcgQEAKICAgICBpbnQzMl90IGJ5dGVzUGVyQnVmZmVyID0gYnl0ZXNQZXJGcmFtZSAqIGNhcGFjaXR5SW5GcmFtZXM7CiAgICAgbVN0b3JhZ2UgPSBuZXcgdWludDhfdFtieXRlc1BlckJ1ZmZlcl07CiAgICAgbVN0b3JhZ2VPd25lZCA9IHRydWU7Ci0gICAgQUxPR0QoIkZpZm9CdWZmZXI6IGNhcGFjaXR5SW5GcmFtZXMgPSAlZCwgYnl0ZXNQZXJGcmFtZSA9ICVkIiwKKyAgICBBTE9HVigiY2FwYWNpdHlJbkZyYW1lcyA9ICVkLCBieXRlc1BlckZyYW1lID0gJWQiLAogICAgICAgICAgIGNhcGFjaXR5SW5GcmFtZXMsIGJ5dGVzUGVyRnJhbWUpOwogfQogCkBAIC04NSwxNSArODcsMTQgQEAKICAgICB3cmFwcGluZ0J1ZmZlci0+ZGF0YVsxXSA9IG51bGxwdHI7CiAgICAgd3JhcHBpbmdCdWZmZXItPm51bUZyYW1lc1sxXSA9IDA7CiAgICAgaWYgKGZyYW1lc0F2YWlsYWJsZSA+IDApIHsKLQogICAgICAgICB1aW50OF90ICpzb3VyY2UgPSAmbVN0b3JhZ2VbY29udmVydEZyYW1lc1RvQnl0ZXMoc3RhcnRJbmRleCldOwogICAgICAgICAvLyBEb2VzIHRoZSBhdmFpbGFibGUgZGF0YSBjcm9zcyB0aGUgZW5kIG9mIHRoZSBGSUZPPwogICAgICAgICBpZiAoKHN0YXJ0SW5kZXggKyBmcmFtZXNBdmFpbGFibGUpID4gbUZyYW1lQ2FwYWNpdHkpIHsKICAgICAgICAgICAgIHdyYXBwaW5nQnVmZmVyLT5kYXRhWzBdID0gc291cmNlOwotICAgICAgICAgICAgd3JhcHBpbmdCdWZmZXItPm51bUZyYW1lc1swXSA9IG1GcmFtZUNhcGFjaXR5IC0gc3RhcnRJbmRleDsKKyAgICAgICAgICAgIGZpZm9fZnJhbWVzX3QgZmlyc3RGcmFtZXMgPSBtRnJhbWVDYXBhY2l0eSAtIHN0YXJ0SW5kZXg7CisgICAgICAgICAgICB3cmFwcGluZ0J1ZmZlci0+bnVtRnJhbWVzWzBdID0gZmlyc3RGcmFtZXM7CiAgICAgICAgICAgICB3cmFwcGluZ0J1ZmZlci0+ZGF0YVsxXSA9ICZtU3RvcmFnZVswXTsKLSAgICAgICAgICAgIHdyYXBwaW5nQnVmZmVyLT5udW1GcmFtZXNbMV0gPSBtRnJhbWVDYXBhY2l0eSAtIHN0YXJ0SW5kZXg7Ci0KKyAgICAgICAgICAgIHdyYXBwaW5nQnVmZmVyLT5udW1GcmFtZXNbMV0gPSBmcmFtZXNBdmFpbGFibGUgLSBmaXJzdEZyYW1lczsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHdyYXBwaW5nQnVmZmVyLT5kYXRhWzBdID0gc291cmNlOwogICAgICAgICAgICAgd3JhcHBpbmdCdWZmZXItPm51bUZyYW1lc1swXSA9IGZyYW1lc0F2YWlsYWJsZTsKQEAgLTEwMiwxOCArMTAzLDE5IEBACiAgICAgICAgIHdyYXBwaW5nQnVmZmVyLT5kYXRhWzBdID0gbnVsbHB0cjsKICAgICAgICAgd3JhcHBpbmdCdWZmZXItPm51bUZyYW1lc1swXSA9IDA7CiAgICAgfQotCiB9CiAKIGZpZm9fZnJhbWVzX3QgRmlmb0J1ZmZlcjo6Z2V0RnVsbERhdGFBdmFpbGFibGUoV3JhcHBpbmdCdWZmZXIgKndyYXBwaW5nQnVmZmVyKSB7Ci0gICAgZmlmb19mcmFtZXNfdCBmcmFtZXNBdmFpbGFibGUgPSBtRmlmby0+Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOworICAgIC8vIFRoZSBGSUZPIG1pZ2h0IGJlIG92ZXJmdWxsIHNvIGNsaXAgdG8gY2FwYWNpdHkuCisgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNBdmFpbGFibGUgPSBzdGQ6Om1pbihtRmlmby0+Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpLCBtRnJhbWVDYXBhY2l0eSk7CiAgICAgZmlmb19mcmFtZXNfdCBzdGFydEluZGV4ID0gbUZpZm8tPmdldFJlYWRJbmRleCgpOwogICAgIGZpbGxXcmFwcGluZ0J1ZmZlcih3cmFwcGluZ0J1ZmZlciwgZnJhbWVzQXZhaWxhYmxlLCBzdGFydEluZGV4KTsKICAgICByZXR1cm4gZnJhbWVzQXZhaWxhYmxlOwogfQogCiBmaWZvX2ZyYW1lc190IEZpZm9CdWZmZXI6OmdldEVtcHR5Um9vbUF2YWlsYWJsZShXcmFwcGluZ0J1ZmZlciAqd3JhcHBpbmdCdWZmZXIpIHsKLSAgICBmaWZvX2ZyYW1lc190IGZyYW1lc0F2YWlsYWJsZSA9IG1GaWZvLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpOworICAgIC8vIFRoZSBGSUZPIG1pZ2h0IGhhdmUgdW5kZXJydW4gc28gY2xpcCB0byBjYXBhY2l0eS4KKyAgICBmaWZvX2ZyYW1lc190IGZyYW1lc0F2YWlsYWJsZSA9IHN0ZDo6bWluKG1GaWZvLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpLCBtRnJhbWVDYXBhY2l0eSk7CiAgICAgZmlmb19mcmFtZXNfdCBzdGFydEluZGV4ID0gbUZpZm8tPmdldFdyaXRlSW5kZXgoKTsKICAgICBmaWxsV3JhcHBpbmdCdWZmZXIod3JhcHBpbmdCdWZmZXIsIGZyYW1lc0F2YWlsYWJsZSwgc3RhcnRJbmRleCk7CiAgICAgcmV0dXJuIGZyYW1lc0F2YWlsYWJsZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmNwcAppbmRleCBlZTI1MDRkLi5hNmI5ZjVkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuY3BwCkBAIC0xOSwxMCArMTksMTIgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CisKKyNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1RpbWVzdGFtcC5oPgotI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgogCiAjaW5jbHVkZSAiY29yZS9BdWRpb1N0cmVhbS5oIgogI2luY2x1ZGUgImxlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5oIgpAQCAtNDgsMTkgKzUwLDE3IEBACiAgICAgcmV0dXJuIEF1ZGlvU3RyZWFtTGVnYWN5X2NhbGxiYWNrOwogfQogCi1pbnQzMl90IEF1ZGlvU3RyZWFtTGVnYWN5OjpjYWxsRGF0YUNhbGxiYWNrRnJhbWVzKHVpbnQ4X3QgKmJ1ZmZlciwgaW50MzJfdCBudW1GcmFtZXMpIHsKK2FhdWRpb19kYXRhX2NhbGxiYWNrX3Jlc3VsdF90IEF1ZGlvU3RyZWFtTGVnYWN5OjpjYWxsRGF0YUNhbGxiYWNrRnJhbWVzKHVpbnQ4X3QgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgdm9pZCAqZmluYWxBdWRpb0RhdGEgPSBidWZmZXI7CiAgICAgaWYgKGdldERpcmVjdGlvbigpID09IEFBVURJT19ESVJFQ1RJT05fSU5QVVQpIHsKICAgICAgICAgLy8gSW5jcmVtZW50IGJlZm9yZSBiZWNhdXNlIHdlIGFscmVhZHkgZ290IHRoZSBkYXRhIGZyb20gdGhlIGRldmljZS4KICAgICAgICAgaW5jcmVtZW50RnJhbWVzUmVhZChudW1GcmFtZXMpOworICAgICAgICBmaW5hbEF1ZGlvRGF0YSA9ICh2b2lkICopIG1heWJlQ29udmVydERldmljZURhdGEoYnVmZmVyLCBudW1GcmFtZXMpOwogICAgIH0KIAogICAgIC8vIENhbGwgdXNpbmcgdGhlIEFBdWRpbyBjYWxsYmFjayBpbnRlcmZhY2UuCi0gICAgQUF1ZGlvU3RyZWFtX2RhdGFDYWxsYmFjayBhcHBDYWxsYmFjayA9IGdldERhdGFDYWxsYmFja1Byb2MoKTsKLSAgICBhYXVkaW9fZGF0YV9jYWxsYmFja19yZXN1bHRfdCBjYWxsYmFja1Jlc3VsdCA9ICgqYXBwQ2FsbGJhY2spKAotICAgICAgICAgICAgKEFBdWRpb1N0cmVhbSAqKSB0aGlzLAotICAgICAgICAgICAgZ2V0RGF0YUNhbGxiYWNrVXNlckRhdGEoKSwKLSAgICAgICAgICAgIGJ1ZmZlciwKLSAgICAgICAgICAgIG51bUZyYW1lcyk7CisgICAgYWF1ZGlvX2RhdGFfY2FsbGJhY2tfcmVzdWx0X3QgY2FsbGJhY2tSZXN1bHQgPSBtYXliZUNhbGxEYXRhQ2FsbGJhY2soZmluYWxBdWRpb0RhdGEsIG51bUZyYW1lcyk7CiAKICAgICBpZiAoY2FsbGJhY2tSZXN1bHQgPT0gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9DT05USU5VRQogICAgICAgICAgICAgJiYgZ2V0RGlyZWN0aW9uKCkgPT0gQUFVRElPX0RJUkVDVElPTl9PVVRQVVQpIHsKQEAgLTcyLDMxICs3Miw0MCBAQAogCiAvLyBJbXBsZW1lbnQgRml4ZWRCbG9ja1Byb2Nlc3NvcgogaW50MzJfdCBBdWRpb1N0cmVhbUxlZ2FjeTo6b25Qcm9jZXNzRml4ZWRCbG9jayh1aW50OF90ICpidWZmZXIsIGludDMyX3QgbnVtQnl0ZXMpIHsKLSAgICBpbnQzMl90IG51bUZyYW1lcyA9IG51bUJ5dGVzIC8gZ2V0Qnl0ZXNQZXJGcmFtZSgpOwotICAgIHJldHVybiBjYWxsRGF0YUNhbGxiYWNrRnJhbWVzKGJ1ZmZlciwgbnVtRnJhbWVzKTsKKyAgICBpbnQzMl90IG51bUZyYW1lcyA9IG51bUJ5dGVzIC8gZ2V0Qnl0ZXNQZXJEZXZpY2VGcmFtZSgpOworICAgIHJldHVybiAoaW50MzJfdCkgY2FsbERhdGFDYWxsYmFja0ZyYW1lcyhidWZmZXIsIG51bUZyYW1lcyk7CiB9CiAKIHZvaWQgQXVkaW9TdHJlYW1MZWdhY3k6OnByb2Nlc3NDYWxsYmFja0NvbW1vbihhYXVkaW9fY2FsbGJhY2tfb3BlcmF0aW9uX3Qgb3Bjb2RlLCB2b2lkICppbmZvKSB7CiAgICAgYWF1ZGlvX2RhdGFfY2FsbGJhY2tfcmVzdWx0X3QgY2FsbGJhY2tSZXN1bHQ7CisgICAgLy8gVGhpcyBpbGxlZ2FsIHNpemUgY2FuIGJlIHVzZWQgdG8gdGVsbCBBdWRpb0ZsaW5nZXIgdG8gc3RvcCBjYWxsaW5nIHVzLgorICAgIC8vIFRoaXMgdGFrZXMgYWR2YW50YWdlIG9mIEF1ZGlvRmxpbmdlciBraWxsaW5nIHRoZSBzdHJlYW0uCisgICAgLy8gVE9ETyBhZGQgdG8gQVBJIGluIEF1ZGlvUmVjb3JkIGFuZCBBdWRpb1RyYWNrCisgICAgY29uc3Qgc2l6ZV90IFNJWkVfU1RPUF9DQUxMQkFDS1MgPSBTSVpFX01BWDsKIAogICAgIHN3aXRjaCAob3Bjb2RlKSB7CiAgICAgICAgIGNhc2UgQUFVRElPX0NBTExCQUNLX09QRVJBVElPTl9QUk9DRVNTX0RBVEE6IHsKLSAgICAgICAgICAgIGNoZWNrRm9yRGlzY29ubmVjdFJlcXVlc3QoKTsKKyAgICAgICAgICAgICh2b2lkKSBjaGVja0ZvckRpc2Nvbm5lY3RSZXF1ZXN0KHRydWUpOwogCiAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBjb2RlIGFzc3VtZXMgYW4gQXVkaW9UcmFjazo6QnVmZmVyIGlzIHRoZSBzYW1lIGFzCiAgICAgICAgICAgICAvLyBBdWRpb1JlY29yZDo6QnVmZmVyCiAgICAgICAgICAgICAvLyBUT0RPIGRlZmluZSBvdXIgb3duIEF1ZGlvQnVmZmVyIGFuZCBwYXNzIGl0IGZyb20gdGhlIHN1YmNsYXNzZXMuCiAgICAgICAgICAgICBBdWRpb1RyYWNrOjpCdWZmZXIgKmF1ZGlvQnVmZmVyID0gc3RhdGljX2Nhc3Q8QXVkaW9UcmFjazo6QnVmZmVyICo+KGluZm8pOwotICAgICAgICAgICAgaWYgKGdldFN0YXRlKCkgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQgfHwgIW1DYWxsYmFja0VuYWJsZWQubG9hZCgpKSB7Ci0gICAgICAgICAgICAgICAgYXVkaW9CdWZmZXItPnNpemUgPSAwOyAvLyBzaWxlbmNlIHRoZSBidWZmZXIKKyAgICAgICAgICAgIGlmIChnZXRTdGF0ZSgpID09IEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVEKSB7CisgICAgICAgICAgICAgICAgQUxPR1coInByb2Nlc3NDYWxsYmFja0NvbW1vbigpIGRhdGEsIHN0cmVhbSBkaXNjb25uZWN0ZWQiKTsKKyAgICAgICAgICAgICAgICBhdWRpb0J1ZmZlci0+c2l6ZSA9IFNJWkVfU1RPUF9DQUxMQkFDS1M7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFtQ2FsbGJhY2tFbmFibGVkLmxvYWQoKSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJwcm9jZXNzQ2FsbGJhY2tDb21tb24oKSBzdG9wcGluZyBiZWNhdXNlIGNhbGxiYWNrIGRpc2FibGVkIik7CisgICAgICAgICAgICAgICAgYXVkaW9CdWZmZXItPnNpemUgPSBTSVpFX1NUT1BfQ0FMTEJBQ0tTOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoYXVkaW9CdWZmZXItPmZyYW1lQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygicHJvY2Vzc0NhbGxiYWNrQ29tbW9uKCkgZGF0YSwgZnJhbWVDb3VudCBpcyB6ZXJvIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY2FsbGVyIHNwZWNpZmllZCBhbiBleGFjdCBzaXplIHRoZW4gdXNlIGEgYmxvY2sgc2l6ZSBhZGFwdGVyLgogICAgICAgICAgICAgICAgIGlmIChtQmxvY2tBZGFwdGVyICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBieXRlQ291bnQgPSBhdWRpb0J1ZmZlci0+ZnJhbWVDb3VudCAqIGdldEJ5dGVzUGVyRnJhbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBieXRlQ291bnQgPSBhdWRpb0J1ZmZlci0+ZnJhbWVDb3VudCAqIGdldEJ5dGVzUGVyRGV2aWNlRnJhbWUoKTsKICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tSZXN1bHQgPSBtQmxvY2tBZGFwdGVyLT5wcm9jZXNzVmFyaWFibGVCbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCAqKSBhdWRpb0J1ZmZlci0+cmF3LCBieXRlQ291bnQpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0xMDUsOSArMTE0LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb0J1ZmZlci0+ZnJhbWVDb3VudCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja1Jlc3VsdCA9PSBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX0NPTlRJTlVFKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF1ZGlvQnVmZmVyLT5zaXplID0gYXVkaW9CdWZmZXItPmZyYW1lQ291bnQgKiBnZXRCeXRlc1BlckZyYW1lKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9CdWZmZXItPnNpemUgPSAwOworICAgICAgICAgICAgICAgICAgICBhdWRpb0J1ZmZlci0+c2l6ZSA9IGF1ZGlvQnVmZmVyLT5mcmFtZUNvdW50ICogZ2V0Qnl0ZXNQZXJEZXZpY2VGcmFtZSgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIFNUT1Agb3IgaW52YWxpZCByZXN1bHQKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgY2FsbGJhY2sgcmVxdWVzdGVkIHN0b3AsIGZha2UgYW4gZXJyb3IiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICAgICAgICAgIGF1ZGlvQnVmZmVyLT5zaXplID0gU0laRV9TVE9QX0NBTExCQUNLUzsKKyAgICAgICAgICAgICAgICAgICAgLy8gRGlzYWJsZSB0aGUgY2FsbGJhY2sganVzdCBpbiBjYXNlIEF1ZGlvRmxpbmdlciBrZWVwcyB0cnlpbmcgdG8gY2FsbCB1cy4KKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrRW5hYmxlZC5zdG9yZShmYWxzZSk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZVN0YXRlTWFjaGluZSgpICE9IEFBVURJT19PSykgewpAQCAtMTMwLDI2ICsxNDIsMjMgQEAKICAgICB9CiB9CiAKLQotCi12b2lkIEF1ZGlvU3RyZWFtTGVnYWN5OjpjaGVja0ZvckRpc2Nvbm5lY3RSZXF1ZXN0KCkgeworYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtTGVnYWN5OjpjaGVja0ZvckRpc2Nvbm5lY3RSZXF1ZXN0KGJvb2wgZXJyb3JDYWxsYmFja0VuYWJsZWQpIHsKICAgICBpZiAobVJlcXVlc3REaXNjb25uZWN0LmlzUmVxdWVzdGVkKCkpIHsKICAgICAgICAgQUxPR0QoImNoZWNrRm9yRGlzY29ubmVjdFJlcXVlc3QoKSBtUmVxdWVzdERpc2Nvbm5lY3QgYWNrbm93bGVkZ2VkIik7Ci0gICAgICAgIGZvcmNlRGlzY29ubmVjdCgpOworICAgICAgICBmb3JjZURpc2Nvbm5lY3QoZXJyb3JDYWxsYmFja0VuYWJsZWQpOwogICAgICAgICBtUmVxdWVzdERpc2Nvbm5lY3QuYWNrbm93bGVkZ2UoKTsKICAgICAgICAgbUNhbGxiYWNrRW5hYmxlZC5zdG9yZShmYWxzZSk7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfRElTQ09OTkVDVEVEOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBBQVVESU9fT0s7CiAgICAgfQogfQogCi12b2lkIEF1ZGlvU3RyZWFtTGVnYWN5Ojpmb3JjZURpc2Nvbm5lY3QoKSB7Cit2b2lkIEF1ZGlvU3RyZWFtTGVnYWN5Ojpmb3JjZURpc2Nvbm5lY3QoYm9vbCBlcnJvckNhbGxiYWNrRW5hYmxlZCkgewogICAgIGlmIChnZXRTdGF0ZSgpICE9IEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVEKSB7CiAgICAgICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVEKTsKLSAgICAgICAgaWYgKGdldEVycm9yQ2FsbGJhY2tQcm9jKCkgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgKCpnZXRFcnJvckNhbGxiYWNrUHJvYygpKSgKLSAgICAgICAgICAgICAgICAgICAgKEFBdWRpb1N0cmVhbSAqKSB0aGlzLAotICAgICAgICAgICAgICAgICAgICBnZXRFcnJvckNhbGxiYWNrVXNlckRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgQUFVRElPX0VSUk9SX0RJU0NPTk5FQ1RFRAotICAgICAgICAgICAgKTsKKyAgICAgICAgaWYgKGVycm9yQ2FsbGJhY2tFbmFibGVkKSB7CisgICAgICAgICAgICBtYXliZUNhbGxFcnJvckNhbGxiYWNrKEFBVURJT19FUlJPUl9ESVNDT05ORUNURUQpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtMTc1LDE5ICsxODQsMTcgQEAKICAgICBpbnQ2NF90IGxvY2FsUG9zaXRpb247CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZXh0ZW5kZWRUaW1lc3RhbXAtPmdldEJlc3RUaW1lc3RhbXAoJmxvY2FsUG9zaXRpb24sIHRpbWVOYW5vc2Vjb25kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lYmFzZSwgJmxvY2F0aW9uKTsKLSAgICAvLyB1c2UgTW9ub3RvbmljQ291bnRlciB0byBwcmV2ZW50IHJldHJvZ3JhZGUgbW90aW9uLgotICAgIG1UaW1lc3RhbXBQb3NpdGlvbi51cGRhdGUzMigoaW50MzJfdClsb2NhbFBvc2l0aW9uKTsKLSAgICAqZnJhbWVQb3NpdGlvbiA9IG1UaW1lc3RhbXBQb3NpdGlvbi5nZXQoKTsKKyAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgIC8vIHVzZSBNb25vdG9uaWNDb3VudGVyIHRvIHByZXZlbnQgcmV0cm9ncmFkZSBtb3Rpb24uCisgICAgICAgIG1UaW1lc3RhbXBQb3NpdGlvbi51cGRhdGUzMigoaW50MzJfdCkgbG9jYWxQb3NpdGlvbik7CisgICAgICAgICpmcmFtZVBvc2l0aW9uID0gbVRpbWVzdGFtcFBvc2l0aW9uLmdldCgpOworICAgIH0KIAogLy8gICAgQUxPR0QoImdldEJlc3RUaW1lc3RhbXAoKSBmcG9zaXRpb246IHNlcnZlciA9ICU2bGxkLCBrZXJuZWwgPSAlNmxsZCwgbG9jYXRpb24gPSAlZCIsCiAvLyAgICAgICAgICAobG9uZyBsb25nKSBleHRlbmRlZFRpbWVzdGFtcC0+bVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMb2NhdGlvbjo6TE9DQVRJT05fU0VSVkVSXSwKIC8vICAgICAgICAgIChsb25nIGxvbmcpIGV4dGVuZGVkVGltZXN0YW1wLT5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxvY2F0aW9uOjpMT0NBVElPTl9LRVJORUxdLAogLy8gICAgICAgICAgKGludClsb2NhdGlvbik7Ci0gICAgaWYgKHN0YXR1cyA9PSBXT1VMRF9CTE9DSykgewotICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KHN0YXR1cyk7Ci0gICAgfQorICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChzdGF0dXMpOwogfQogCiB2b2lkIEF1ZGlvU3RyZWFtTGVnYWN5OjpvbkF1ZGlvRGV2aWNlVXBkYXRlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuaAppbmRleCA3ZTI4NTc5Li40OTRlZGJjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmgKQEAgLTExMiwxMiArMTEyLDE0IEBACiAKICAgICB2b2lkIG9uQXVkaW9EZXZpY2VVcGRhdGUoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCk7CiAKLSAgICB2b2lkIGNoZWNrRm9yRGlzY29ubmVjdFJlcXVlc3QoKTsKKyAgICAvKgorICAgICAqIENoZWNrIHRvIHNlZSB3aGV0aGVyIGEgY2FsbGJhY2sgdGhyZWFkIGhhcyByZXF1ZXN0ZWQgYSBkaXNjb25uZWN0ZWQuCisgICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2tFbmFibGVkIHNldCB0cnVlIHRvIGNhbGwgZXJyb3JDYWxsYmFjayBvbiBkaXNjb25uZWN0CisgICAgICogQHJldHVybiBBQVVESU9fT0sgb3IgQUFVRElPX0VSUk9SX0RJU0NPTk5FQ1RFRAorICAgICAqLworICAgIGFhdWRpb19yZXN1bHRfdCBjaGVja0ZvckRpc2Nvbm5lY3RSZXF1ZXN0KGJvb2wgZXJyb3JDYWxsYmFja0VuYWJsZWQpOwogCi0gICAgdm9pZCBmb3JjZURpc2Nvbm5lY3QoKTsKLQotICAgIHZvaWQgb25TdGFydCgpIHsgbUNhbGxiYWNrRW5hYmxlZC5zdG9yZSh0cnVlKTsgfQotICAgIHZvaWQgb25TdG9wKCkgeyBtQ2FsbGJhY2tFbmFibGVkLnN0b3JlKGZhbHNlKTsgfQorICAgIHZvaWQgZm9yY2VEaXNjb25uZWN0KGJvb2wgZXJyb3JDYWxsYmFja0VuYWJsZWQgPSB0cnVlKTsKIAogICAgIGludDY0X3QgaW5jcmVtZW50RnJhbWVzV3JpdHRlbihpbnQzMl90IGZyYW1lcykgewogICAgICAgICByZXR1cm4gbUZyYW1lc1dyaXR0ZW4uaW5jcmVtZW50KGZyYW1lcyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5jcHAKaW5kZXggYmM2ZTYwYy4uNTA1ZjJlZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmNwcApAQCAtMTksMTMgKzE5LDE1IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVjb3JkLmg+Ci0jaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgogCi0jaW5jbHVkZSAiQXVkaW9DbG9jay5oIgorI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZWNvcmQuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgorCiAjaW5jbHVkZSAibGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmgiCiAjaW5jbHVkZSAibGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmgiCisjaW5jbHVkZSAidXRpbGl0eS9BdWRpb0Nsb2NrLmgiCiAjaW5jbHVkZSAidXRpbGl0eS9GaXhlZEJsb2NrV3JpdGVyLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwpAQCAtNjMsMTAgKzY1LDYgQEAKICAgICBzaXplX3QgZnJhbWVDb3VudCA9IChidWlsZGVyLmdldEJ1ZmZlckNhcGFjaXR5KCkgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSA/IDAKICAgICAgICAgICAgICAgICAgICAgICAgIDogYnVpbGRlci5nZXRCdWZmZXJDYXBhY2l0eSgpOwogCi0gICAgLy8gVE9ETyBpbXBsZW1lbnQgYW4gdW5zcGVjaWZpZWQgQW5kcm9pZCBmb3JtYXQgdGhlbiB1c2UgdGhhdC4KLSAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSAoZ2V0Rm9ybWF0KCkgPT0gQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRCkKLSAgICAgICAgICAgID8gQVVESU9fRk9STUFUX1BDTV9GTE9BVAotICAgICAgICAgICAgOiBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZERhdGFGb3JtYXQoZ2V0Rm9ybWF0KCkpOwogCiAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORTsKICAgICBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IHBlcmZNb2RlID0gZ2V0UGVyZm9ybWFuY2VNb2RlKCk7CkBAIC04Miw2ICs4MCwzNSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCisgICAgLy8gUHJlc2VydmUgYmVoYXZpb3Igb2YgQVBJIDI2CisgICAgaWYgKGdldEZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQpIHsKKyAgICAgICAgc2V0Rm9ybWF0KEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsKKyAgICB9CisKKyAgICAvLyBNYXliZSBjaGFuZ2UgZGV2aWNlIGZvcm1hdCB0byBnZXQgYSBGQVNUIHBhdGguCisgICAgLy8gQXVkaW9SZWNvcmQgZG9lcyBub3Qgc3VwcG9ydCBGQVNUIG1vZGUgZm9yIEZMT0FUIGRhdGEuCisgICAgLy8gVE9ETyBBdWRpb1JlY29yZCBzaG91bGQgYWxsb3cgRkxPQVQgZGF0YSBwYXRocyBmb3IgRkFTVCB0cmFja3MuCisgICAgLy8gU28gSUYgdGhlIHVzZXIgYXNrcyBmb3IgbG93IGxhdGVuY3kgRkxPQVQKKyAgICAvLyBBTkQgdGhlIHNhbXBsZVJhdGUgaXMgbGlrZWx5IHRvIGJlIGNvbXBhdGlibGUgd2l0aCBGQVNUCisgICAgLy8gVEhFTiByZXF1ZXN0IEkxNiBhbmQgY29udmVydCB0byBGTE9BVCB3aGVuIHBhc3NpbmcgdG8gdXNlci4KKyAgICAvLyBOb3RlIHRoYXQgaGFyZCBjb2RpbmcgNDgwMDAgSHogaXMgbm90IGlkZWFsIGJlY2F1c2UgdGhlIHNhbXBsZVJhdGUKKyAgICAvLyBmb3IgYSBGQVNUIHBhdGggbWlnaHQgbm90IGJlIDQ4MDAwIEh6LgorICAgIC8vIEl0IG5vcm1hbGx5IGlzIGJ1dCB0aGVyZSBpcyBhIGNoYW5jZSB0aGF0IGl0IGlzIG5vdC4KKyAgICAvLyBBbmQgdGhlcmUgaXMgbm8gcmVsaWFibGUgd2F5IHRvIGtub3cgdGhhdCBpbiBhZHZhbmNlLgorICAgIC8vIEx1Y2tpbHkgdGhlIGNvbnNlcXVlbmNlcyBvZiBhIHdyb25nIGd1ZXNzIGFyZSBtaW5vci4KKyAgICAvLyBXZSBqdXN0IG1heSBub3QgZ2V0IGEgRkFTVCB0cmFjay4KKyAgICAvLyBCdXQgd2Ugd291bGRuJ3QgaGF2ZSBhbnl3YXkgd2l0aG91dCB0aGlzIGhhY2suCisgICAgY29uc3RleHByIGludDMyX3Qga01vc3RMaWtlbHlTYW1wbGVSYXRlRm9yRmFzdCA9IDQ4MDAwOworICAgIGlmIChnZXRGb3JtYXQoKSA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVAorICAgICAgICAgICAgJiYgcGVyZk1vZGUgPT0gQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1kKKyAgICAgICAgICAgICYmIChzYW1wbGVzUGVyRnJhbWUgPD0gMikgLy8gRkFTVCBvbmx5IGZvciBtb25vIGFuZCBzdGVyZW8KKyAgICAgICAgICAgICYmIChnZXRTYW1wbGVSYXRlKCkgPT0ga01vc3RMaWtlbHlTYW1wbGVSYXRlRm9yRmFzdAorICAgICAgICAgICAgICAgIHx8IGdldFNhbXBsZVJhdGUoKSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpKSB7CisgICAgICAgIHNldERldmljZUZvcm1hdChBQVVESU9fRk9STUFUX1BDTV9JMTYpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNldERldmljZUZvcm1hdChnZXRGb3JtYXQoKSk7CisgICAgfQorCiAgICAgdWludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzID0gMDsKIAogICAgIC8vIFNldHVwIHRoZSBjYWxsYmFjayBpZiB0aGVyZSBpcyBvbmUuCkBAIC05Niw0NyArMTIzLDg0IEBACiAgICAgfQogICAgIG1DYWxsYmFja0J1ZmZlclNpemUgPSBidWlsZGVyLmdldEZyYW1lc1BlckRhdGFDYWxsYmFjaygpOwogCi0gICAgQUxPR0QoIkF1ZGlvU3RyZWFtUmVjb3JkOjpvcGVuKCksIHJlcXVlc3Qgbm90aWZpY2F0aW9uRnJhbWVzID0gJXUsIGZyYW1lQ291bnQgPSAldSIsCi0gICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVzLCAodWludClmcmFtZUNvdW50KTsKLSAgICBtQXVkaW9SZWNvcmQgPSBuZXcgQXVkaW9SZWNvcmQoCi0gICAgICAgICAgICBtT3BQYWNrYWdlTmFtZSAvLyBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSBUT0RPIGRvZXMgbm90IGNvbXBpbGUKLSAgICAgICAgICAgICk7Ci0gICAgaWYgKGdldERldmljZUlkKCkgIT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7Ci0gICAgICAgIG1BdWRpb1JlY29yZC0+c2V0SW5wdXREZXZpY2UoZ2V0RGV2aWNlSWQoKSk7Ci0gICAgfQotICAgIG1BdWRpb1JlY29yZC0+c2V0KAotICAgICAgICAgICAgQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OLAotICAgICAgICAgICAgZ2V0U2FtcGxlUmF0ZSgpLAotICAgICAgICAgICAgZm9ybWF0LAotICAgICAgICAgICAgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICBmcmFtZUNvdW50LAotICAgICAgICAgICAgY2FsbGJhY2ssCi0gICAgICAgICAgICBjYWxsYmFja0RhdGEsCi0gICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZXMsCi0gICAgICAgICAgICBmYWxzZSAvKnRocmVhZENhbkNhbGxKYXZhKi8sCi0gICAgICAgICAgICBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAotICAgICAgICAgICAgc3RyZWFtVHJhbnNmZXJUeXBlLAotICAgICAgICAgICAgZmxhZ3MKLSAgICAgICAgICAgIC8vICAgaW50IHVpZCA9IC0xLAotICAgICAgICAgICAgLy8gICBwaWRfdCBwaWQgPSAtMSwKLSAgICAgICAgICAgIC8vICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcyA9IG51bGxwdHIKLSAgICAgICAgICAgICk7CisgICAgLy8gRG9uJ3QgY2FsbCBtQXVkaW9SZWNvcmQtPnNldElucHV0RGV2aWNlKCkgYmVjYXVzZSBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5IHNldCgpIQorICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IChnZXREZXZpY2VJZCgpID09IEFBVURJT19VTlNQRUNJRklFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEFVRElPX1BPUlRfSEFORExFX05PTkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGdldERldmljZUlkKCk7CiAKLSAgICAvLyBEaWQgd2UgZ2V0IGEgdmFsaWQgdHJhY2s/Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbUF1ZGlvUmVjb3JkLT5pbml0Q2hlY2soKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgIGNsb3NlKCk7Ci0gICAgICAgIEFMT0dFKCJBdWRpb1N0cmVhbVJlY29yZDo6b3BlbigpLCBpbml0Q2hlY2soKSByZXR1cm5lZCAlZCIsIHN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChzdGF0dXMpOworICAgIGNvbnN0IGF1ZGlvX2NvbnRlbnRfdHlwZV90IGNvbnRlbnRUeXBlID0KKyAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfY29udGVudFR5cGVUb0ludGVybmFsKGJ1aWxkZXIuZ2V0Q29udGVudFR5cGUoKSk7CisgICAgY29uc3QgYXVkaW9fc291cmNlX3Qgc291cmNlID0KKyAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfaW5wdXRQcmVzZXRUb0F1ZGlvU291cmNlKGJ1aWxkZXIuZ2V0SW5wdXRQcmVzZXQoKSk7CisKKyAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IHsKKyAgICAgICAgICAgIC5jb250ZW50X3R5cGUgPSBjb250ZW50VHlwZSwKKyAgICAgICAgICAgIC51c2FnZSA9IEFVRElPX1VTQUdFX1VOS05PV04sIC8vIG9ubHkgdXNlZCBmb3Igb3V0cHV0CisgICAgICAgICAgICAuc291cmNlID0gc291cmNlLAorICAgICAgICAgICAgLmZsYWdzID0gQVVESU9fRkxBR19OT05FLCAvLyBEaWZmZXJlbnQgdGhhbiB0aGUgQVVESU9fSU5QVVRfRkxBR1MKKyAgICAgICAgICAgIC50YWdzID0gIiIKKyAgICB9OworCisgICAgYWF1ZGlvX3Nlc3Npb25faWRfdCByZXF1ZXN0ZWRTZXNzaW9uSWQgPSBidWlsZGVyLmdldFNlc3Npb25JZCgpOworICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgPSBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFNlc3Npb25JZChyZXF1ZXN0ZWRTZXNzaW9uSWQpOworCisgICAgLy8gLS0tLS0tLS0tLS0gb3BlbiB0aGUgQXVkaW9SZWNvcmQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gTWlnaHQgcmV0cnksIGJ1dCBuZXZlciBtb3JlIHRoYW4gb25jZS4KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkgKyspIHsKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgcmVxdWVzdGVkSW50ZXJuYWxGb3JtYXQgPQorICAgICAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkRGF0YUZvcm1hdChnZXREZXZpY2VGb3JtYXQoKSk7CisKKyAgICAgICAgbUF1ZGlvUmVjb3JkID0gbmV3IEF1ZGlvUmVjb3JkKAorICAgICAgICAgICAgICAgIG1PcFBhY2thZ2VOYW1lIC8vIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lIFRPRE8gZG9lcyBub3QgY29tcGlsZQorICAgICAgICApOworICAgICAgICBtQXVkaW9SZWNvcmQtPnNldCgKKyAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgLy8gaWdub3JlZCBiZWNhdXNlIHdlIHBhc3MgYXR0cmlidXRlcyBiZWxvdworICAgICAgICAgICAgICAgIGdldFNhbXBsZVJhdGUoKSwKKyAgICAgICAgICAgICAgICByZXF1ZXN0ZWRJbnRlcm5hbEZvcm1hdCwKKyAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgIGNhbGxiYWNrRGF0YSwKKyAgICAgICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZXMsCisgICAgICAgICAgICAgICAgZmFsc2UgLyp0aHJlYWRDYW5DYWxsSmF2YSovLAorICAgICAgICAgICAgICAgIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICBzdHJlYW1UcmFuc2ZlclR5cGUsCisgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgQVVESU9fVUlEX0lOVkFMSUQsIC8vIERFRkFVTFQgdWlkCisgICAgICAgICAgICAgICAgLTEsICAgICAgICAgICAgICAgIC8vIERFRkFVTFQgcGlkCisgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgc2VsZWN0ZWREZXZpY2VJZAorICAgICAgICApOworCisgICAgICAgIC8vIERpZCB3ZSBnZXQgYSB2YWxpZCB0cmFjaz8KKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUF1ZGlvUmVjb3JkLT5pbml0Q2hlY2soKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgICAgIEFMT0dFKCJvcGVuKCksIGluaXRDaGVjaygpIHJldHVybmVkICVkIiwgc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChzdGF0dXMpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIGl0IHdhcyB3b3J0aCBoYWNraW5nIHRoZSBkZXZpY2VGb3JtYXQuCisgICAgICAgIGJvb2wgZ290RmFzdFBhdGggPSAobUF1ZGlvUmVjb3JkLT5nZXRGbGFncygpICYgQVVESU9fSU5QVVRfRkxBR19GQVNUKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gQVVESU9fSU5QVVRfRkxBR19GQVNUOworICAgICAgICBpZiAoZ2V0Rm9ybWF0KCkgIT0gZ2V0RGV2aWNlRm9ybWF0KCkgJiYgIWdvdEZhc3RQYXRoKSB7CisgICAgICAgICAgICAvLyBXZSB0cmllZCB0byBnZXQgYSBGQVNUIHBhdGggYnkgc3dpdGNoaW5nIHRoZSBkZXZpY2UgZm9ybWF0LgorICAgICAgICAgICAgLy8gQnV0IGl0IGRpZG4ndCB3b3JrLiBTbyB3ZSBtaWdodCBhcyB3ZWxsIHJlb3BlbiB1c2luZyB0aGUgc2FtZQorICAgICAgICAgICAgLy8gZm9ybWF0IGZvciBkZXZpY2UgYW5kIGZvciBhcHAuCisgICAgICAgICAgICBBTE9HRCgiJXMoKSB1c2VkIGEgZGlmZmVyZW50IGRldmljZSBmb3JtYXQgYnV0IG5vIEZBU1QgcGF0aCwgcmVvcGVuIiwgX19mdW5jX18pOworICAgICAgICAgICAgbUF1ZGlvUmVjb3JkLmNsZWFyKCk7CisgICAgICAgICAgICBzZXREZXZpY2VGb3JtYXQoZ2V0Rm9ybWF0KCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnJlYWs7IC8vIEtlZXAgdGhlIG9uZSB3ZSBqdXN0IG9wZW5lZC4KKyAgICAgICAgfQogICAgIH0KIAogICAgIC8vIEdldCB0aGUgYWN0dWFsIHZhbHVlcyBmcm9tIHRoZSBBdWRpb1JlY29yZC4KICAgICBzZXRTYW1wbGVzUGVyRnJhbWUobUF1ZGlvUmVjb3JkLT5jaGFubmVsQ291bnQoKSk7Ci0gICAgc2V0Rm9ybWF0KEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvRGF0YUZvcm1hdChtQXVkaW9SZWNvcmQtPmZvcm1hdCgpKSk7CiAKICAgICBpbnQzMl90IGFjdHVhbFNhbXBsZVJhdGUgPSBtQXVkaW9SZWNvcmQtPmdldFNhbXBsZVJhdGUoKTsKICAgICBBTE9HV19JRihhY3R1YWxTYW1wbGVSYXRlICE9IGdldFNhbXBsZVJhdGUoKSwKLSAgICAgICAgICAgICAiQXVkaW9TdHJlYW1SZWNvcmQ6Om9wZW4oKSBzYW1wbGVSYXRlIGNoYW5nZWQgZnJvbSAlZCB0byAlZCIsCisgICAgICAgICAgICAgIm9wZW4oKSBzYW1wbGVSYXRlIGNoYW5nZWQgZnJvbSAlZCB0byAlZCIsCiAgICAgICAgICAgICAgZ2V0U2FtcGxlUmF0ZSgpLCBhY3R1YWxTYW1wbGVSYXRlKTsKICAgICBzZXRTYW1wbGVSYXRlKGFjdHVhbFNhbXBsZVJhdGUpOwogCkBAIC0xNDksNiArMjEzLDI5IEBACiAgICAgICAgIG1CbG9ja0FkYXB0ZXIgPSBudWxscHRyOwogICAgIH0KIAorICAgIC8vIEFsbG9jYXRlIGZvcm1hdCBjb252ZXJzaW9uIGJ1ZmZlciBpZiBuZWVkZWQuCisgICAgaWYgKGdldERldmljZUZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfUENNX0kxNgorICAgICAgICAmJiBnZXRGb3JtYXQoKSA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgeworCisgICAgICAgIGlmIChidWlsZGVyLmdldERhdGFDYWxsYmFja1Byb2MoKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgY2FsbGJhY2sgdGhlbiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhlIGRhdGEgaW50byBhbiBpbnRlcm5hbCBmbG9hdAorICAgICAgICAgICAgLy8gYXJyYXkgYW5kIHRoZW4gcGFzcyB0aGF0IGVudGlyZSBhcnJheSB0byB0aGUgYXBwLgorICAgICAgICAgICAgbUZvcm1hdENvbnZlcnNpb25CdWZmZXJTaXplSW5GcmFtZXMgPQorICAgICAgICAgICAgICAgICAgICAobUNhbGxiYWNrQnVmZmVyU2l6ZSAhPSBBQVVESU9fVU5TUEVDSUZJRUQpCisgICAgICAgICAgICAgICAgICAgID8gbUNhbGxiYWNrQnVmZmVyU2l6ZSA6IGdldEZyYW1lc1BlckJ1cnN0KCk7CisgICAgICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMgPSBtRm9ybWF0Q29udmVyc2lvbkJ1ZmZlclNpemVJbkZyYW1lcyAqIGdldFNhbXBsZXNQZXJGcmFtZSgpOworICAgICAgICAgICAgbUZvcm1hdENvbnZlcnNpb25CdWZmZXJGbG9hdCA9IHN0ZDo6bWFrZV91bmlxdWU8ZmxvYXRbXT4obnVtU2FtcGxlcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgY2FsbGJhY2sgdGhlbiB3ZSB3aWxsIHJlYWQgaW50byBhbiBpbnRlcm5hbCBzaG9ydCBhcnJheQorICAgICAgICAgICAgLy8gYW5kIHRoZW4gY29udmVydCBpbnRvIHRoZSBhcHAgZmxvYXQgYXJyYXkgaW4gcmVhZCgpLgorICAgICAgICAgICAgbUZvcm1hdENvbnZlcnNpb25CdWZmZXJTaXplSW5GcmFtZXMgPSBnZXRGcmFtZXNQZXJCdXJzdCgpOworICAgICAgICAgICAgaW50MzJfdCBudW1TYW1wbGVzID0gbUZvcm1hdENvbnZlcnNpb25CdWZmZXJTaXplSW5GcmFtZXMgKiBnZXRTYW1wbGVzUGVyRnJhbWUoKTsKKyAgICAgICAgICAgIG1Gb3JtYXRDb252ZXJzaW9uQnVmZmVySTE2ID0gc3RkOjptYWtlX3VuaXF1ZTxpbnQxNl90W10+KG51bVNhbXBsZXMpOworICAgICAgICB9CisgICAgICAgIEFMT0dEKCIlcygpIHNldHVwIEkxNj5GTE9BVCBjb252ZXJzaW9uIGJ1ZmZlciB3aXRoICVkIGZyYW1lcyIsCisgICAgICAgICAgICAgIF9fZnVuY19fLCBtRm9ybWF0Q29udmVyc2lvbkJ1ZmZlclNpemVJbkZyYW1lcyk7CisgICAgfQorCiAgICAgLy8gVXBkYXRlIHBlcmZvcm1hbmNlIG1vZGUgYmFzZWQgb24gdGhlIGFjdHVhbCBzdHJlYW0uCiAgICAgLy8gRm9yIGV4YW1wbGUsIGlmIHRoZSBzYW1wbGUgcmF0ZSBkb2VzIG5vdCBtYXRjaCBuYXRpdmUgdGhlbiB5b3Ugd29uJ3QgZ2V0IGEgRkFTVCB0cmFjay4KICAgICBhdWRpb19pbnB1dF9mbGFnc190IGFjdHVhbEZsYWdzID0gbUF1ZGlvUmVjb3JkLT5nZXRGbGFncygpOwpAQCAtMTY0LDE0ICsyNTEsMjEgQEAKIAogICAgIC8vIExvZyB3YXJuaW5nIGlmIHdlIGRpZCBub3QgZ2V0IHdoYXQgd2UgYXNrZWQgZm9yLgogICAgIEFMT0dXX0lGKGFjdHVhbEZsYWdzICE9IGZsYWdzLAotICAgICAgICAgICAgICJBdWRpb1N0cmVhbVJlY29yZDo6b3BlbigpIGZsYWdzIGNoYW5nZWQgZnJvbSAweCUwOFggdG8gMHglMDhYIiwKKyAgICAgICAgICAgICAib3BlbigpIGZsYWdzIGNoYW5nZWQgZnJvbSAweCUwOFggdG8gMHglMDhYIiwKICAgICAgICAgICAgICBmbGFncywgYWN0dWFsRmxhZ3MpOwogICAgIEFMT0dXX0lGKGFjdHVhbFBlcmZvcm1hbmNlTW9kZSAhPSBwZXJmTW9kZSwKLSAgICAgICAgICAgICAiQXVkaW9TdHJlYW1SZWNvcmQ6Om9wZW4oKSBwZXJmTW9kZSBjaGFuZ2VkIGZyb20gJWQgdG8gJWQiLAorICAgICAgICAgICAgICJvcGVuKCkgcGVyZk1vZGUgY2hhbmdlZCBmcm9tICVkIHRvICVkIiwKICAgICAgICAgICAgICBwZXJmTW9kZSwgYWN0dWFsUGVyZm9ybWFuY2VNb2RlKTsKIAogICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfT1BFTik7CiAgICAgc2V0RGV2aWNlSWQobUF1ZGlvUmVjb3JkLT5nZXRSb3V0ZWREZXZpY2VJZCgpKTsKKworICAgIGFhdWRpb19zZXNzaW9uX2lkX3QgYWN0dWFsU2Vzc2lvbklkID0KKyAgICAgICAgICAgIChyZXF1ZXN0ZWRTZXNzaW9uSWQgPT0gQUFVRElPX1NFU1NJT05fSURfTk9ORSkKKyAgICAgICAgICAgID8gQUFVRElPX1NFU1NJT05fSURfTk9ORQorICAgICAgICAgICAgOiAoYWF1ZGlvX3Nlc3Npb25faWRfdCkgbUF1ZGlvUmVjb3JkLT5nZXRTZXNzaW9uSWQoKTsKKyAgICBzZXRTZXNzaW9uSWQoYWN0dWFsU2Vzc2lvbklkKTsKKwogICAgIG1BdWRpb1JlY29yZC0+YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhtRGV2aWNlQ2FsbGJhY2spOwogCiAgICAgcmV0dXJuIEFBVURJT19PSzsKQEAgLTE4OSw2ICsyODMsMjQgQEAKICAgICByZXR1cm4gQXVkaW9TdHJlYW06OmNsb3NlKCk7CiB9CiAKK2NvbnN0IHZvaWQgKiBBdWRpb1N0cmVhbVJlY29yZDo6bWF5YmVDb252ZXJ0RGV2aWNlRGF0YShjb25zdCB2b2lkICphdWRpb0RhdGEsIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgaWYgKG1Gb3JtYXRDb252ZXJzaW9uQnVmZmVyRmxvYXQuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG51bUZyYW1lcyA+IG1Gb3JtYXRDb252ZXJzaW9uQnVmZmVyU2l6ZUluRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcygpIGNvbnZlcnNpb24gc2l6ZSAlZCB0b28gbGFyZ2UgZm9yIGJ1ZmZlciAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG51bUZyYW1lcywgbUZvcm1hdENvbnZlcnNpb25CdWZmZXJTaXplSW5GcmFtZXMpOworCisgICAgICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IG51bUZyYW1lcyAqIGdldFNhbXBsZXNQZXJGcmFtZSgpOworICAgICAgICAvLyBPbmx5IGNvbnZlcnNpb24gc3VwcG9ydGVkIGlzIEkxNiB0byBGTE9BVAorICAgICAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9pMTYoCisgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXRDb252ZXJzaW9uQnVmZmVyRmxvYXQuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgIChjb25zdCBpbnQxNl90ICopIGF1ZGlvRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcyk7CisgICAgICAgIHJldHVybiBtRm9ybWF0Q29udmVyc2lvbkJ1ZmZlckZsb2F0LmdldCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBhdWRpb0RhdGE7CisgICAgfQorfQorCiB2b2lkIEF1ZGlvU3RyZWFtUmVjb3JkOjpwcm9jZXNzQ2FsbGJhY2soaW50IGV2ZW50LCB2b2lkICppbmZvKSB7CiAgICAgc3dpdGNoIChldmVudCkgewogICAgICAgICBjYXNlIEF1ZGlvUmVjb3JkOjpFVkVOVF9NT1JFX0RBVEE6CkBAIC0yMTcsMTEgKzMyOSwxMyBAQAogICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoZXJyKTsKICAgICB9CiAKKyAgICAvLyBFbmFibGUgY2FsbGJhY2sgYmVmb3JlIHN0YXJ0aW5nIEF1ZGlvVHJhY2sgdG8gYXZvaWQgc2h1dHRpbmcKKyAgICAvLyBkb3duIGJlY2F1c2Ugb2YgYSByYWNlIGNvbmRpdGlvbi4KKyAgICBtQ2FsbGJhY2tFbmFibGVkLnN0b3JlKHRydWUpOwogICAgIGVyciA9IG1BdWRpb1JlY29yZC0+c3RhcnQoKTsKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChlcnIpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIG9uU3RhcnQoKTsKICAgICAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVElORyk7CiAgICAgfQogICAgIHJldHVybiBBQVVESU9fT0s7CkBAIC0yMzEsMTUgKzM0NSwxNiBAQAogICAgIGlmIChtQXVkaW9SZWNvcmQuZ2V0KCkgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQotICAgIG9uU3RvcCgpOwogICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBJTkcpOwogICAgIGluY3JlbWVudEZyYW1lc1dyaXR0ZW4oZ2V0RnJhbWVzUmVhZCgpIC0gZ2V0RnJhbWVzV3JpdHRlbigpKTsgLy8gVE9ETyByZXZpZXcKICAgICBtVGltZXN0YW1wUG9zaXRpb24uc2V0KGdldEZyYW1lc1JlYWQoKSk7CiAgICAgbUF1ZGlvUmVjb3JkLT5zdG9wKCk7Ci0gICAgbUZyYW1lc1JlYWQucmVzZXQzMigpOworICAgIG1DYWxsYmFja0VuYWJsZWQuc3RvcmUoZmFsc2UpOworICAgIG1GcmFtZXNXcml0dGVuLnJlc2V0MzIoKTsgLy8gc2VydmljZSB3cml0ZXMgZnJhbWVzLCBzZXJ2aWNlIHBvc2l0aW9uIHJlc2V0IG9uIGZsdXNoCiAgICAgbVRpbWVzdGFtcFBvc2l0aW9uLnJlc2V0MzIoKTsKLSAgICBjaGVja0ZvckRpc2Nvbm5lY3RSZXF1ZXN0KCk7Ci0gICAgcmV0dXJuIEFBVURJT19PSzsKKyAgICAvLyBQYXNzIGZhbHNlIHRvIHByZXZlbnQgZXJyb3JDYWxsYmFjayBmcm9tIGJlaW5nIGNhbGxlZCBhZnRlciBkaXNjb25uZWN0CisgICAgLy8gd2hlbiBhcHAgaGFzIGFscmVhZHkgcmVxdWVzdGVkIGEgc3RvcCgpLgorICAgIHJldHVybiBjaGVja0ZvckRpc2Nvbm5lY3RSZXF1ZXN0KGZhbHNlKTsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtUmVjb3JkOjp1cGRhdGVTdGF0ZU1hY2hpbmUoKQpAQCAtMjcyLDkgKzM4NywxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lb3V0TmFub3NlY29uZHMpCiB7Ci0gICAgaW50MzJfdCBieXRlc1BlckZyYW1lID0gZ2V0Qnl0ZXNQZXJGcmFtZSgpOworICAgIGludDMyX3QgYnl0ZXNQZXJEZXZpY2VGcmFtZSA9IGdldEJ5dGVzUGVyRGV2aWNlRnJhbWUoKTsKICAgICBpbnQzMl90IG51bUJ5dGVzOwotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9Db252ZXJ0X2ZyYW1lc1RvQnl0ZXMobnVtRnJhbWVzLCBieXRlc1BlckZyYW1lLCAmbnVtQnl0ZXMpOworICAgIC8vIFRoaXMgd2lsbCBkZXRlY3Qgb3V0IG9mIHJhbmdlIHZhbHVlcyBmb3IgbnVtRnJhbWVzLgorICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9Db252ZXJ0X2ZyYW1lc1RvQnl0ZXMobnVtRnJhbWVzLCBieXRlc1BlckRldmljZUZyYW1lLCAmbnVtQnl0ZXMpOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQpAQCAtMjg1LDE5ICs0MDEsNDkgQEAKIAogICAgIC8vIFRPRE8gYWRkIHRpbWVvdXQgdG8gQXVkaW9SZWNvcmQKICAgICBib29sIGJsb2NraW5nID0gKHRpbWVvdXROYW5vc2Vjb25kcyA+IDApOwotICAgIHNzaXplX3QgYnl0ZXNSZWFkID0gbUF1ZGlvUmVjb3JkLT5yZWFkKGJ1ZmZlciwgbnVtQnl0ZXMsIGJsb2NraW5nKTsKLSAgICBpZiAoYnl0ZXNSZWFkID09IFdPVUxEX0JMT0NLKSB7CisKKyAgICBzc2l6ZV90IGJ5dGVzQWN0dWFsbHlSZWFkID0gMDsKKyAgICBzc2l6ZV90IHRvdGFsQnl0ZXNSZWFkID0gMDsKKyAgICBpZiAobUZvcm1hdENvbnZlcnNpb25CdWZmZXJJMTYuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICAvLyBDb252ZXJ0IEkxNiBkYXRhIHRvIGZsb2F0IHVzaW5nIGFuIGludGVybWVkaWF0ZSBidWZmZXIuCisgICAgICAgIGZsb2F0ICpmbG9hdEJ1ZmZlciA9IChmbG9hdCAqKSBidWZmZXI7CisgICAgICAgIGludDMyX3QgZnJhbWVzTGVmdCA9IG51bUZyYW1lczsKKyAgICAgICAgLy8gUGVyZm9ybSBjb252ZXJzaW9uIHVzaW5nIG11bHRpcGxlIHJlYWQoKXMgaWYgbmVjZXNzYXJ5LgorICAgICAgICB3aGlsZSAoZnJhbWVzTGVmdCA+IDApIHsKKyAgICAgICAgICAgIC8vIFJlYWQgaW50byBzaG9ydCBpbnRlcm5hbCBidWZmZXIuCisgICAgICAgICAgICBpbnQzMl90IGZyYW1lc1RvUmVhZCA9IHN0ZDo6bWluKGZyYW1lc0xlZnQsIG1Gb3JtYXRDb252ZXJzaW9uQnVmZmVyU2l6ZUluRnJhbWVzKTsKKyAgICAgICAgICAgIHNpemVfdCBieXRlc1RvUmVhZCA9IGZyYW1lc1RvUmVhZCAqIGJ5dGVzUGVyRGV2aWNlRnJhbWU7CisgICAgICAgICAgICBieXRlc0FjdHVhbGx5UmVhZCA9IG1BdWRpb1JlY29yZC0+cmVhZChtRm9ybWF0Q29udmVyc2lvbkJ1ZmZlckkxNi5nZXQoKSwgYnl0ZXNUb1JlYWQsIGJsb2NraW5nKTsKKyAgICAgICAgICAgIGlmIChieXRlc0FjdHVhbGx5UmVhZCA8PSAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0b3RhbEJ5dGVzUmVhZCArPSBieXRlc0FjdHVhbGx5UmVhZDsKKyAgICAgICAgICAgIGludDMyX3QgZnJhbWVzVG9Db252ZXJ0ID0gYnl0ZXNBY3R1YWxseVJlYWQgLyBieXRlc1BlckRldmljZUZyYW1lOworICAgICAgICAgICAgLy8gQ29udmVydCBpbnRvIGFwcCBmbG9hdCBidWZmZXIuCisgICAgICAgICAgICBzaXplX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1RvQ29udmVydCAqIGdldFNhbXBsZXNQZXJGcmFtZSgpOworICAgICAgICAgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21faTE2KAorICAgICAgICAgICAgICAgICAgICBmbG9hdEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgbUZvcm1hdENvbnZlcnNpb25CdWZmZXJJMTYuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMpOworICAgICAgICAgICAgZmxvYXRCdWZmZXIgKz0gbnVtU2FtcGxlczsKKyAgICAgICAgICAgIGZyYW1lc0xlZnQgLT0gZnJhbWVzVG9Db252ZXJ0OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgYnl0ZXNBY3R1YWxseVJlYWQgPSBtQXVkaW9SZWNvcmQtPnJlYWQoYnVmZmVyLCBudW1CeXRlcywgYmxvY2tpbmcpOworICAgICAgICB0b3RhbEJ5dGVzUmVhZCA9IGJ5dGVzQWN0dWFsbHlSZWFkOworICAgIH0KKyAgICBpZiAoYnl0ZXNBY3R1YWxseVJlYWQgPT0gV09VTERfQkxPQ0spIHsKICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfSBlbHNlIGlmIChieXRlc1JlYWQgPCAwKSB7Ci0gICAgICAgIC8vIGluIHRoaXMgY29udGV4dCwgYSBERUFEX09CSkVDVCBpcyBtb3JlIGxpa2VseSB0byBiZSBhIGRpc2Nvbm5lY3Qgbm90aWZpY2F0aW9uIGR1ZSB0bwotICAgICAgICAvLyBBdWRpb1JlY29yZCBpbnZhbGlkYXRpb24KLSAgICAgICAgaWYgKGJ5dGVzUmVhZCA9PSBERUFEX09CSkVDVCkgeworICAgIH0gZWxzZSBpZiAoYnl0ZXNBY3R1YWxseVJlYWQgPCAwKSB7CisgICAgICAgIC8vIEluIHRoaXMgY29udGV4dCwgYSBERUFEX09CSkVDVCBpcyBtb3JlIGxpa2VseSB0byBiZSBhIGRpc2Nvbm5lY3Qgbm90aWZpY2F0aW9uIGR1ZSB0bworICAgICAgICAvLyBBdWRpb1JlY29yZCBpbnZhbGlkYXRpb24uCisgICAgICAgIGlmIChieXRlc0FjdHVhbGx5UmVhZCA9PSBERUFEX09CSkVDVCkgewogICAgICAgICAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQpOwogICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9ESVNDT05ORUNURUQ7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KGJ5dGVzUmVhZCk7CisgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChieXRlc0FjdHVhbGx5UmVhZCk7CiAgICAgfQotICAgIGludDMyX3QgZnJhbWVzUmVhZCA9IChpbnQzMl90KShieXRlc1JlYWQgLyBieXRlc1BlckZyYW1lKTsKKyAgICBpbnQzMl90IGZyYW1lc1JlYWQgPSAoaW50MzJfdCkodG90YWxCeXRlc1JlYWQgLyBieXRlc1BlckRldmljZUZyYW1lKTsKICAgICBpbmNyZW1lbnRGcmFtZXNSZWFkKGZyYW1lc1JlYWQpOwogCiAgICAgcmVzdWx0ID0gdXBkYXRlU3RhdGVNYWNoaW5lKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuaAppbmRleCBjMTcyM2JhLi4yZjQxZDM0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmgKQEAgLTc2LDYgKzc2LDggQEAKICAgICAgICAgcmV0dXJuIGluY3JlbWVudEZyYW1lc1JlYWQoZnJhbWVzKTsKICAgICB9CiAKKyAgICBjb25zdCB2b2lkICogbWF5YmVDb252ZXJ0RGV2aWNlRGF0YShjb25zdCB2b2lkICphdWRpb0RhdGEsIGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKKwogcHJpdmF0ZToKICAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjpBdWRpb1JlY29yZD4gbUF1ZGlvUmVjb3JkOwogICAgIC8vIGFkYXB0cyBiZXR3ZWVuIHZhcmlhYmxlIHNpemVkIGJsb2NrcyBhbmQgZml4ZWQgc2l6ZSBibG9ja3MKQEAgLTgzLDYgKzg1LDExIEBACiAKICAgICAvLyBUT0RPIGFkZCA2NC1iaXQgcG9zaXRpb24gcmVwb3J0aW5nIHRvIEF1ZGlvUmVjb3JkIGFuZCB1c2UgaXQuCiAgICAgYW5kcm9pZDo6U3RyaW5nMTYgICAgICAgICAgICAgICAgbU9wUGFja2FnZU5hbWU7CisKKyAgICAvLyBPbmx5IG9uZSB0eXBlIG9mIGNvbnZlcnNpb24gYnVmZmVyIGlzIHVzZWQuCisgICAgc3RkOjp1bmlxdWVfcHRyPGZsb2F0W10+ICAgICAgICAgbUZvcm1hdENvbnZlcnNpb25CdWZmZXJGbG9hdDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8aW50MTZfdFtdPiAgICAgICBtRm9ybWF0Q29udmVyc2lvbkJ1ZmZlckkxNjsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICBtRm9ybWF0Q29udmVyc2lvbkJ1ZmZlclNpemVJbkZyYW1lcyA9IDA7CiB9OwogCiB9IC8qIG5hbWVzcGFjZSBhYXVkaW8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5jcHAKaW5kZXggMGU5YWFlZi4uNTA1Y2Q3NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5jcHAKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb1RyYWNrLmg+CiAKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSAidXRpbGl0eS9BdWRpb0Nsb2NrLmgiCiAjaW5jbHVkZSAibGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmgiCiAjaW5jbHVkZSAibGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suaCIKQEAgLTExMywxNCArMTE0LDM1IEBACiAgICAgfQogICAgIG1DYWxsYmFja0J1ZmZlclNpemUgPSBidWlsZGVyLmdldEZyYW1lc1BlckRhdGFDYWxsYmFjaygpOwogCi0gICAgQUxPR0QoIkF1ZGlvU3RyZWFtVHJhY2s6Om9wZW4oKSwgcmVxdWVzdCBub3RpZmljYXRpb25GcmFtZXMgPSAlZCwgZnJhbWVDb3VudCA9ICV1IiwKKyAgICBBTE9HRCgib3BlbigpLCByZXF1ZXN0IG5vdGlmaWNhdGlvbkZyYW1lcyA9ICVkLCBmcmFtZUNvdW50ID0gJXUiLAogICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lcywgKHVpbnQpZnJhbWVDb3VudCk7Ci0gICAgbUF1ZGlvVHJhY2sgPSBuZXcgQXVkaW9UcmFjaygpOyAvLyBUT0RPIHJldmlldwotICAgIGlmIChnZXREZXZpY2VJZCgpICE9IEFBVURJT19VTlNQRUNJRklFRCkgewotICAgICAgICBtQXVkaW9UcmFjay0+c2V0T3V0cHV0RGV2aWNlKGdldERldmljZUlkKCkpOwotICAgIH0KKworICAgIC8vIERvbid0IGNhbGwgbUF1ZGlvVHJhY2stPnNldERldmljZUlkKCkgYmVjYXVzZSBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5IHNldCgpIQorICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IChnZXREZXZpY2VJZCgpID09IEFBVURJT19VTlNQRUNJRklFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEFVRElPX1BPUlRfSEFORExFX05PTkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGdldERldmljZUlkKCk7CisKKyAgICBjb25zdCBhdWRpb19jb250ZW50X3R5cGVfdCBjb250ZW50VHlwZSA9CisgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X2NvbnRlbnRUeXBlVG9JbnRlcm5hbChidWlsZGVyLmdldENvbnRlbnRUeXBlKCkpOworICAgIGNvbnN0IGF1ZGlvX3VzYWdlX3QgdXNhZ2UgPQorICAgICAgICAgICAgQUF1ZGlvQ29udmVydF91c2FnZVRvSW50ZXJuYWwoYnVpbGRlci5nZXRVc2FnZSgpKTsKKworICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzID0geworICAgICAgICAgICAgLmNvbnRlbnRfdHlwZSA9IGNvbnRlbnRUeXBlLAorICAgICAgICAgICAgLnVzYWdlID0gdXNhZ2UsCisgICAgICAgICAgICAuc291cmNlID0gQVVESU9fU09VUkNFX0RFRkFVTFQsIC8vIG9ubHkgdXNlZCBmb3IgcmVjb3JkaW5nCisgICAgICAgICAgICAuZmxhZ3MgPSBBVURJT19GTEFHX05PTkUsIC8vIERpZmZlcmVudCB0aGFuIHRoZSBBVURJT19PVVRQVVRfRkxBR1MKKyAgICAgICAgICAgIC50YWdzID0gIiIKKyAgICB9OworCisgICAgc3RhdGljX2Fzc2VydChBQVVESU9fVU5TUEVDSUZJRUQgPT0gQVVESU9fU0VTU0lPTl9BTExPQ0FURSwgIlNlc3Npb24gSURzIHNob3VsZCBtYXRjaCIpOworCisgICAgYWF1ZGlvX3Nlc3Npb25faWRfdCByZXF1ZXN0ZWRTZXNzaW9uSWQgPSBidWlsZGVyLmdldFNlc3Npb25JZCgpOworICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgPSBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFNlc3Npb25JZChyZXF1ZXN0ZWRTZXNzaW9uSWQpOworCisgICAgbUF1ZGlvVHJhY2sgPSBuZXcgQXVkaW9UcmFjaygpOwogICAgIG1BdWRpb1RyYWNrLT5zZXQoCi0gICAgICAgICAgICAoYXVkaW9fc3RyZWFtX3R5cGVfdCkgQVVESU9fU1RSRUFNX01VU0lDLAorICAgICAgICAgICAgQVVESU9fU1RSRUFNX0RFRkFVTFQsICAvLyBpZ25vcmVkIGJlY2F1c2Ugd2UgcGFzcyBhdHRyaWJ1dGVzIGJlbG93CiAgICAgICAgICAgICBnZXRTYW1wbGVSYXRlKCksCiAgICAgICAgICAgICBmb3JtYXQsCiAgICAgICAgICAgICBjaGFubmVsTWFzaywKQEAgLTEyOSwxNyArMTUxLDI2IEBACiAgICAgICAgICAgICBjYWxsYmFjaywKICAgICAgICAgICAgIGNhbGxiYWNrRGF0YSwKICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lcywKLSAgICAgICAgICAgIDAgLypzaGFyZWRCdWZmZXIqLywKLSAgICAgICAgICAgIGZhbHNlIC8qdGhyZWFkQ2FuQ2FsbEphdmEqLywKLSAgICAgICAgICAgIEFVRElPX1NFU1NJT05fQUxMT0NBVEUsCi0gICAgICAgICAgICBzdHJlYW1UcmFuc2ZlclR5cGUKLSAgICAgICAgICAgICk7CisgICAgICAgICAgICAwLCAgICAgICAvLyBERUZBVUxUIHNoYXJlZEJ1ZmZlciovLAorICAgICAgICAgICAgZmFsc2UsICAgLy8gREVGQVVMVCB0aHJlYWRDYW5DYWxsSmF2YQorICAgICAgICAgICAgc2Vzc2lvbklkLAorICAgICAgICAgICAgc3RyZWFtVHJhbnNmZXJUeXBlLAorICAgICAgICAgICAgTlVMTCwgICAgLy8gREVGQVVMVCBhdWRpb19vZmZsb2FkX2luZm9fdAorICAgICAgICAgICAgQVVESU9fVUlEX0lOVkFMSUQsIC8vIERFRkFVTFQgdWlkCisgICAgICAgICAgICAtMSwgICAgICAvLyBERUZBVUxUIHBpZAorICAgICAgICAgICAgJmF0dHJpYnV0ZXMsCisgICAgICAgICAgICAvLyBXQVJOSU5HIC0gSWYgZG9Ob3RSZWNvbm5lY3Qgc2V0IHRydWUgdGhlbiBhdWRpbyBzdG9wcyBhZnRlciBwbHVnZ2luZyBhbmQgdW5wbHVnZ2luZworICAgICAgICAgICAgLy8gaGVhZHBob25lcyBhIGZldyB0aW1lcy4KKyAgICAgICAgICAgIGZhbHNlLCAgIC8vIERFRkFVTFQgZG9Ob3RSZWNvbm5lY3QsCisgICAgICAgICAgICAxLjBmLCAgICAvLyBERUZBVUxUIG1heFJlcXVpcmVkU3BlZWQKKyAgICAgICAgICAgIHNlbGVjdGVkRGV2aWNlSWQKKyAgICApOwogCiAgICAgLy8gRGlkIHdlIGdldCBhIHZhbGlkIHRyYWNrPwogICAgIHN0YXR1c190IHN0YXR1cyA9IG1BdWRpb1RyYWNrLT5pbml0Q2hlY2soKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIGNsb3NlKCk7Ci0gICAgICAgIEFMT0dFKCJBdWRpb1N0cmVhbVRyYWNrOjpvcGVuKCksIGluaXRDaGVjaygpIHJldHVybmVkICVkIiwgc3RhdHVzKTsKKyAgICAgICAgQUxPR0UoIm9wZW4oKSwgaW5pdENoZWNrKCkgcmV0dXJuZWQgJWQiLCBzdGF0dXMpOwogICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoc3RhdHVzKTsKICAgICB9CiAKQEAgLTE1MCwxMCArMTgxLDExIEBACiAgICAgYWF1ZGlvX2Zvcm1hdF90IGFhdWRpb0Zvcm1hdCA9CiAgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb0RhdGFGb3JtYXQobUF1ZGlvVHJhY2stPmZvcm1hdCgpKTsKICAgICBzZXRGb3JtYXQoYWF1ZGlvRm9ybWF0KTsKKyAgICBzZXREZXZpY2VGb3JtYXQoYWF1ZGlvRm9ybWF0KTsKIAogICAgIGludDMyX3QgYWN0dWFsU2FtcGxlUmF0ZSA9IG1BdWRpb1RyYWNrLT5nZXRTYW1wbGVSYXRlKCk7CiAgICAgQUxPR1dfSUYoYWN0dWFsU2FtcGxlUmF0ZSAhPSBnZXRTYW1wbGVSYXRlKCksCi0gICAgICAgICAgICAgIkF1ZGlvU3RyZWFtVHJhY2s6Om9wZW4oKSBzYW1wbGVSYXRlIGNoYW5nZWQgZnJvbSAlZCB0byAlZCIsCisgICAgICAgICAgICAgIm9wZW4oKSBzYW1wbGVSYXRlIGNoYW5nZWQgZnJvbSAlZCB0byAlZCIsCiAgICAgICAgICAgICAgZ2V0U2FtcGxlUmF0ZSgpLCBhY3R1YWxTYW1wbGVSYXRlKTsKICAgICBzZXRTYW1wbGVSYXRlKGFjdHVhbFNhbXBsZVJhdGUpOwogCkBAIC0xNjgsNiArMjAwLDEzIEBACiAKICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX09QRU4pOwogICAgIHNldERldmljZUlkKG1BdWRpb1RyYWNrLT5nZXRSb3V0ZWREZXZpY2VJZCgpKTsKKworICAgIGFhdWRpb19zZXNzaW9uX2lkX3QgYWN0dWFsU2Vzc2lvbklkID0KKyAgICAgICAgICAgIChyZXF1ZXN0ZWRTZXNzaW9uSWQgPT0gQUFVRElPX1NFU1NJT05fSURfTk9ORSkKKyAgICAgICAgICAgID8gQUFVRElPX1NFU1NJT05fSURfTk9ORQorICAgICAgICAgICAgOiAoYWF1ZGlvX3Nlc3Npb25faWRfdCkgbUF1ZGlvVHJhY2stPmdldFNlc3Npb25JZCgpOworICAgIHNldFNlc3Npb25JZChhY3R1YWxTZXNzaW9uSWQpOworCiAgICAgbUF1ZGlvVHJhY2stPmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2sobURldmljZUNhbGxiYWNrKTsKIAogICAgIC8vIFVwZGF0ZSBwZXJmb3JtYW5jZSBtb2RlIGJhc2VkIG9uIHRoZSBhY3R1YWwgc3RyZWFtIGZsYWdzLgpAQCAtMTg2LDEwICsyMjUsMTAgQEAKIAogICAgIC8vIExvZyB3YXJuaW5nIGlmIHdlIGRpZCBub3QgZ2V0IHdoYXQgd2UgYXNrZWQgZm9yLgogICAgIEFMT0dXX0lGKGFjdHVhbEZsYWdzICE9IGZsYWdzLAotICAgICAgICAgICAgICJBdWRpb1N0cmVhbVRyYWNrOjpvcGVuKCkgZmxhZ3MgY2hhbmdlZCBmcm9tIDB4JTA4WCB0byAweCUwOFgiLAorICAgICAgICAgICAgICJvcGVuKCkgZmxhZ3MgY2hhbmdlZCBmcm9tIDB4JTA4WCB0byAweCUwOFgiLAogICAgICAgICAgICAgIGZsYWdzLCBhY3R1YWxGbGFncyk7CiAgICAgQUxPR1dfSUYoYWN0dWFsUGVyZm9ybWFuY2VNb2RlICE9IHBlcmZNb2RlLAotICAgICAgICAgICAgICJBdWRpb1N0cmVhbVRyYWNrOjpvcGVuKCkgcGVyZk1vZGUgY2hhbmdlZCBmcm9tICVkIHRvICVkIiwKKyAgICAgICAgICAgICAib3BlbigpIHBlcmZNb2RlIGNoYW5nZWQgZnJvbSAlZCB0byAlZCIsCiAgICAgICAgICAgICAgcGVyZk1vZGUsIGFjdHVhbFBlcmZvcm1hbmNlTW9kZSk7CiAKICAgICByZXR1cm4gQUFVRElPX09LOwpAQCAtMjI0LDEwICsyNjMsOCBAQAogfQogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1UcmFjazo6cmVxdWVzdFN0YXJ0KCkgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJlYW1NdXRleCk7Ci0KICAgICBpZiAobUF1ZGlvVHJhY2suZ2V0KCkgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiQXVkaW9TdHJlYW1UcmFjazo6cmVxdWVzdFN0YXJ0KCkgbm8gQXVkaW9UcmFjayIpOworICAgICAgICBBTE9HRSgicmVxdWVzdFN0YXJ0KCkgbm8gQXVkaW9UcmFjayIpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogICAgIC8vIEdldCBjdXJyZW50IHBvc2l0aW9uIHNvIHdlIGNhbiBkZXRlY3Qgd2hlbiB0aGUgdHJhY2sgaXMgcGxheWluZy4KQEAgLTIzNiw3MyArMjczLDYyIEBACiAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChlcnIpOwogICAgIH0KIAorICAgIC8vIEVuYWJsZSBjYWxsYmFjayBiZWZvcmUgc3RhcnRpbmcgQXVkaW9UcmFjayB0byBhdm9pZCBzaHV0dGluZworICAgIC8vIGRvd24gYmVjYXVzZSBvZiBhIHJhY2UgY29uZGl0aW9uLgorICAgIG1DYWxsYmFja0VuYWJsZWQuc3RvcmUodHJ1ZSk7CiAgICAgZXJyID0gbUF1ZGlvVHJhY2stPnN0YXJ0KCk7CiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoZXJyKTsKICAgICB9IGVsc2UgewotICAgICAgICBvblN0YXJ0KCk7CiAgICAgICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRJTkcpOwogICAgIH0KICAgICByZXR1cm4gQUFVRElPX09LOwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1UcmFjazo6cmVxdWVzdFBhdXNlKCkgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJlYW1NdXRleCk7Ci0KICAgICBpZiAobUF1ZGlvVHJhY2suZ2V0KCkgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgicmVxdWVzdFBhdXNlKCkgbm8gQXVkaW9UcmFjayIpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7Ci0gICAgfSBlbHNlIGlmIChnZXRTdGF0ZSgpICE9IEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRJTkcKLSAgICAgICAgICAgICYmIGdldFN0YXRlKCkgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVEVEKSB7Ci0gICAgICAgIEFMT0dFKCJyZXF1ZXN0UGF1c2UoKSwgY2FsbGVkIHdoZW4gc3RhdGUgaXMgJXMiLAotICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFN0cmVhbVN0YXRlVG9UZXh0KGdldFN0YXRlKCkpKTsKLSAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KLSAgICBvblN0b3AoKTsKKwogICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0lORyk7CiAgICAgbUF1ZGlvVHJhY2stPnBhdXNlKCk7Ci0gICAgY2hlY2tGb3JEaXNjb25uZWN0UmVxdWVzdCgpOworICAgIG1DYWxsYmFja0VuYWJsZWQuc3RvcmUoZmFsc2UpOwogICAgIHN0YXR1c190IGVyciA9IG1BdWRpb1RyYWNrLT5nZXRQb3NpdGlvbigmbVBvc2l0aW9uV2hlblBhdXNpbmcpOwogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KGVycik7CiAgICAgfQotICAgIHJldHVybiBBQVVESU9fT0s7CisgICAgcmV0dXJuIGNoZWNrRm9yRGlzY29ubmVjdFJlcXVlc3QoZmFsc2UpOwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1UcmFjazo6cmVxdWVzdEZsdXNoKCkgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJlYW1NdXRleCk7Ci0KICAgICBpZiAobUF1ZGlvVHJhY2suZ2V0KCkgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiQXVkaW9TdHJlYW1UcmFjazo6cmVxdWVzdEZsdXNoKCkgbm8gQXVkaW9UcmFjayIpOwotICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7Ci0gICAgfSBlbHNlIGlmIChnZXRTdGF0ZSgpICE9IEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0VEKSB7Ci0gICAgICAgIEFMT0dFKCJBdWRpb1N0cmVhbVRyYWNrOjpyZXF1ZXN0Rmx1c2goKSBub3QgcGF1c2VkIik7CisgICAgICAgIEFMT0dFKCJyZXF1ZXN0Rmx1c2goKSBubyBBdWRpb1RyYWNrIik7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CisKICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX0ZMVVNISU5HKTsKICAgICBpbmNyZW1lbnRGcmFtZXNSZWFkKGdldEZyYW1lc1dyaXR0ZW4oKSAtIGdldEZyYW1lc1JlYWQoKSk7CiAgICAgbUF1ZGlvVHJhY2stPmZsdXNoKCk7Ci0gICAgbUZyYW1lc1dyaXR0ZW4ucmVzZXQzMigpOworICAgIG1GcmFtZXNSZWFkLnJlc2V0MzIoKTsgLy8gc2VydmljZSByZWFkcyBmcmFtZXMsIHNlcnZpY2UgcG9zaXRpb24gcmVzZXQgb24gZmx1c2gKICAgICBtVGltZXN0YW1wUG9zaXRpb24ucmVzZXQzMigpOwogICAgIHJldHVybiBBQVVESU9fT0s7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbVRyYWNrOjpyZXF1ZXN0U3RvcCgpIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtU3RyZWFtTXV0ZXgpOwotCiAgICAgaWYgKG1BdWRpb1RyYWNrLmdldCgpID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIkF1ZGlvU3RyZWFtVHJhY2s6OnJlcXVlc3RTdG9wKCkgbm8gQXVkaW9UcmFjayIpOworICAgICAgICBBTE9HRSgicmVxdWVzdFN0b3AoKSBubyBBdWRpb1RyYWNrIik7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9Ci0gICAgb25TdG9wKCk7CisKICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQSU5HKTsKICAgICBpbmNyZW1lbnRGcmFtZXNSZWFkKGdldEZyYW1lc1dyaXR0ZW4oKSAtIGdldEZyYW1lc1JlYWQoKSk7IC8vIFRPRE8gcmV2aWV3CiAgICAgbVRpbWVzdGFtcFBvc2l0aW9uLnNldChnZXRGcmFtZXNXcml0dGVuKCkpOwotICAgIG1GcmFtZXNXcml0dGVuLnJlc2V0MzIoKTsKKyAgICBtRnJhbWVzUmVhZC5yZXNldDMyKCk7IC8vIHNlcnZpY2UgcmVhZHMgZnJhbWVzLCBzZXJ2aWNlIHBvc2l0aW9uIHJlc2V0IG9uIHN0b3AKICAgICBtVGltZXN0YW1wUG9zaXRpb24ucmVzZXQzMigpOwogICAgIG1BdWRpb1RyYWNrLT5zdG9wKCk7Ci0gICAgY2hlY2tGb3JEaXNjb25uZWN0UmVxdWVzdCgpOwotICAgIHJldHVybiBBQVVESU9fT0s7CisgICAgbUNhbGxiYWNrRW5hYmxlZC5zdG9yZShmYWxzZSk7CisgICAgcmV0dXJuIGNoZWNrRm9yRGlzY29ubmVjdFJlcXVlc3QoZmFsc2UpOzsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtVHJhY2s6OnVwZGF0ZVN0YXRlTWFjaGluZSgpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVRyYWNrLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVRyYWNrLmgKaW5kZXggYTg3MWRiNC4uNjg2MDhkZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suaApAQCAtNDgsNiArNDgsMTYgQEAKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVxdWVzdEZsdXNoKCkgb3ZlcnJpZGU7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlcXVlc3RTdG9wKCkgb3ZlcnJpZGU7CiAKKyAgICBib29sIGlzRmx1c2hTdXBwb3J0ZWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIC8vIE9ubHkgaW1wbGVtZW50IEZMVVNIIGZvciBPVVRQVVQgc3RyZWFtcy4KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbCBpc1BhdXNlU3VwcG9ydGVkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAvLyBPbmx5IGltcGxlbWVudCBQQVVTRSBmb3IgT1VUUFVUIHN0cmVhbXMuCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKwogICAgIGFhdWRpb19yZXN1bHRfdCBnZXRUaW1lc3RhbXAoY2xvY2tpZF90IGNsb2NrSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpmcmFtZVBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZU5hbm9zZWNvbmRzKSBvdmVycmlkZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5jcHAKaW5kZXggMjQ1MDkyMC4uNDBlYmI3NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5jcHAKQEAgLTI1LDYgKzI1LDkgQEAKIAogI2luY2x1ZGUgImFhdWRpby9BQXVkaW8uaCIKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvVGVzdGluZy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8tYmFzZS5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgogCiAjaW5jbHVkZSAidXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaCIKIApAQCAtNTAsNTAgKzUzLDIxIEBACiAgICAgcmV0dXJuIHNpemU7CiB9CiAKLQogLy8gVE9ETyBleHBvc2UgYW5kIGNhbGwgY2xhbXAxNl9mcm9tX2Zsb2F0IGZ1bmN0aW9uIGluIHByaW1pdGl2ZXMuaAogc3RhdGljIGlubGluZSBpbnQxNl90IGNsYW1wMTZfZnJvbV9mbG9hdChmbG9hdCBmKSB7Ci0gICAgLyogT2Zmc2V0IGlzIHVzZWQgdG8gZXhwYW5kIHRoZSB2YWxpZCByYW5nZSBvZiBbLTEuMCwgMS4wKSBpbnRvIHRoZSAxNiBsc2JzIG9mIHRoZQotICAgICAqIGZsb2F0aW5nIHBvaW50IHNpZ25pZmljYW5kLiBUaGUgbm9ybWFsIHNoaWZ0IGlzIDM8PDIyLCBidXQgdGhlIC0xNSBvZmZzZXQKLSAgICAgKiBpcyB1c2VkIHRvIG11bHRpcGx5IGJ5IDMyNzY4LgotICAgICAqLwotICAgIHN0YXRpYyBjb25zdCBmbG9hdCBvZmZzZXQgPSAoZmxvYXQpKDMgPDwgKDIyIC0gMTUpKTsKLSAgICAvKiB6ZXJvID0gKDB4MTBmIDw8IDIyKSA9ICAweDQzYzAwMDAwIChub3QgZGlyZWN0bHkgdXNlZCkgKi8KLSAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBsaW1uZWcgPSAoMHgxMGYgPDwgMjIpIC8qemVybyovIC0gMzI3Njg7IC8qIDB4NDNiZjgwMDAgKi8KLSAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBsaW1wb3MgPSAoMHgxMGYgPDwgMjIpIC8qemVybyovICsgMzI3Njc7IC8qIDB4NDNjMDdmZmYgKi8KLQotICAgIHVuaW9uIHsKLSAgICAgICAgZmxvYXQgZjsKLSAgICAgICAgaW50MzJfdCBpOwotICAgIH0gdTsKLQotICAgIHUuZiA9IGYgKyBvZmZzZXQ7IC8qIHJlY2VudGVyIHZhbGlkIHJhbmdlICovCi0gICAgLyogTm93IHRoZSB2YWxpZCByYW5nZSBpcyByZXByZXNlbnRlZCBhcyBpbnRlZ2VycyBiZXR3ZWVuIFtsaW1uZWcsIGxpbXBvc10uCi0gICAgICogQ2xhbXAgdXNpbmcgdGhlIGZhY3QgdGhhdCBmbG9hdCByZXByZXNlbnRhdGlvbiAoYXMgYW4gaW50ZWdlcikgaXMgYW4gb3JkZXJlZCBzZXQuCi0gICAgICovCi0gICAgaWYgKHUuaSA8IGxpbW5lZykKLSAgICAgICAgdS5pID0gLTMyNzY4OwotICAgIGVsc2UgaWYgKHUuaSA+IGxpbXBvcykKLSAgICAgICAgdS5pID0gMzI3Njc7Ci0gICAgcmV0dXJuIHUuaTsgLyogUmV0dXJuIGxvd2VyIDE2IGJpdHMsIHRoZSBwYXJ0IG9mIGludGVyZXN0IGluIHRoZSBzaWduaWZpY2FuZC4gKi8KKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgc2NhbGUgPSAxIDw8IDE1OworICAgIHJldHVybiAoaW50MTZfdCkgcm91bmRmKGZtYXhmKGZtaW5mKGYgKiBzY2FsZSwgc2NhbGUgLSAxLmYpLCAtc2NhbGUpKTsKIH0KIAotLy8gU2FtZSBidXQgd2l0aG91dCBjbGlwcGluZy4KLS8vIENvbnZlcnQgLTEuMGYgdG8gKzEuMGYgdG8gLTMyNzY4IHRvICszMjc2Nwotc3RhdGljIGlubGluZSBpbnQxNl90IGZsb2F0VG9JbnQxNihmbG9hdCBmKSB7Ci0gICAgc3RhdGljIGNvbnN0IGZsb2F0IG9mZnNldCA9IChmbG9hdCkoMyA8PCAoMjIgLSAxNSkpOwotICAgIHVuaW9uIHsKLSAgICAgICAgZmxvYXQgZjsKLSAgICAgICAgaW50MzJfdCBpOwotICAgIH0gdTsKLSAgICB1LmYgPSBmICsgb2Zmc2V0OyAvKiByZWNlbnRlciB2YWxpZCByYW5nZSAqLwotICAgIHJldHVybiB1Lmk7IC8qIFJldHVybiBsb3dlciAxNiBiaXRzLCB0aGUgcGFydCBvZiBpbnRlcmVzdCBpbiB0aGUgc2lnbmlmaWNhbmQuICovCisvLyBDbGlwIHRvIHZhbGlkIHJhbmdlIG9mIGEgZmxvYXQgc2FtcGxlIHRvIHByZXZlbnQgZXhjZXNzaXZlIHZvbHVtZS4KKy8vIEJ5IHVzaW5nIGZtaW4gYW5kIGZtYXggd2UgYWxzbyBwcm90ZWN0IGFnYWluc3QgTmFOLgorc3RhdGljIGZsb2F0IGNsaXBUb01pbk1heEhlYWRyb29tKGZsb2F0IGlucHV0KSB7CisgICAgcmV0dXJuIGZtaW4oTUFYX0hFQURST09NLCBmbWF4KE1JTl9IRUFEUk9PTSwgaW5wdXQpKTsKIH0KIAogc3RhdGljIGZsb2F0IGNsaXBBbmRDbGFtcEZsb2F0VG9QY20xNihmbG9hdCBzYW1wbGUsIGZsb2F0IHNjYWxlcikgewogICAgIC8vIENsaXAgdG8gdmFsaWQgcmFuZ2Ugb2YgYSBmbG9hdCBzYW1wbGUgdG8gcHJldmVudCBleGNlc3NpdmUgdm9sdW1lLgotICAgIGlmIChzYW1wbGUgPiBNQVhfSEVBRFJPT00pIHNhbXBsZSA9IE1BWF9IRUFEUk9PTTsKLSAgICBlbHNlIGlmIChzYW1wbGUgPCBNSU5fSEVBRFJPT00pIHNhbXBsZSA9IE1JTl9IRUFEUk9PTTsKKyAgICBzYW1wbGUgPSBjbGlwVG9NaW5NYXhIZWFkcm9vbShzYW1wbGUpOwogCiAgICAgLy8gU2NhbGUgYW5kIGNvbnZlcnQgdG8gYSBzaG9ydC4KICAgICBmbG9hdCBmdmFsID0gc2FtcGxlICogc2NhbGVyOwpAQCAtMTA0LDcgKzc4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZGVzdGluYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtU2FtcGxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlKSB7Ci0gICAgZmxvYXQgc2NhbGVyID0gYW1wbGl0dWRlOworICAgIGNvbnN0IGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVNhbXBsZXM7IGkrKykgewogICAgICAgICBmbG9hdCBzYW1wbGUgPSAqc291cmNlKys7CiAgICAgICAgICpkZXN0aW5hdGlvbisrID0gY2xpcEFuZENsYW1wRmxvYXRUb1BjbTE2KHNhbXBsZSwgc2NhbGVyKTsKQEAgLTEzNSw3ICsxMDksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtU2FtcGxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlKSB7Ci0gICAgZmxvYXQgc2NhbGVyID0gYW1wbGl0dWRlIC8gU0hPUlRfU0NBTEU7CisgICAgY29uc3QgZmxvYXQgc2NhbGVyID0gYW1wbGl0dWRlIC8gU0hPUlRfU0NBTEU7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKICAgICAgICAgZGVzdGluYXRpb25baV0gPSBzb3VyY2VbaV0gKiBzY2FsZXI7CiAgICAgfQpAQCAtMTQ5LDcgKzEyMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTIpIHsKICAgICBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGUxIC8gU0hPUlRfU0NBTEU7Ci0gICAgZmxvYXQgZGVsdGEgPSAoYW1wbGl0dWRlMiAtIGFtcGxpdHVkZTEpIC8gKFNIT1JUX1NDQUxFICogKGZsb2F0KSBudW1GcmFtZXMpOworICAgIGNvbnN0IGZsb2F0IGRlbHRhID0gKGFtcGxpdHVkZTIgLSBhbXBsaXR1ZGUxKSAvIChTSE9SVF9TQ0FMRSAqIChmbG9hdCkgbnVtRnJhbWVzKTsKICAgICBmb3IgKGludCBmcmFtZUluZGV4ID0gMDsgZnJhbWVJbmRleCA8IG51bUZyYW1lczsgZnJhbWVJbmRleCsrKSB7CiAgICAgICAgIGZvciAoaW50IHNhbXBsZUluZGV4ID0gMDsgc2FtcGxlSW5kZXggPCBzYW1wbGVzUGVyRnJhbWU7IHNhbXBsZUluZGV4KyspIHsKICAgICAgICAgICAgICpkZXN0aW5hdGlvbisrID0gKnNvdXJjZSsrICogc2NhbGVyOwpAQCAtMTU4LDYgKzEzMiw3IEBACiAgICAgfQogfQogCisKIC8vIFRoaXMgY29kZSBhc3N1bWVzIGFtcGxpdHVkZTEgYW5kIGFtcGxpdHVkZTIgYXJlIGJldHdlZW4gMC4wIGFuZCAxLjAKIHZvaWQgQUF1ZGlvX2xpbmVhclJhbXAoY29uc3QgZmxvYXQgKnNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmRlc3RpbmF0aW9uLApAQCAtMTY2LDE0ICsxNDEsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMikgewogICAgIGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZTE7Ci0gICAgZmxvYXQgZGVsdGEgPSAoYW1wbGl0dWRlMiAtIGFtcGxpdHVkZTEpIC8gbnVtRnJhbWVzOworICAgIGNvbnN0IGZsb2F0IGRlbHRhID0gKGFtcGxpdHVkZTIgLSBhbXBsaXR1ZGUxKSAvIG51bUZyYW1lczsKICAgICBmb3IgKGludCBmcmFtZUluZGV4ID0gMDsgZnJhbWVJbmRleCA8IG51bUZyYW1lczsgZnJhbWVJbmRleCsrKSB7CiAgICAgICAgIGZvciAoaW50IHNhbXBsZUluZGV4ID0gMDsgc2FtcGxlSW5kZXggPCBzYW1wbGVzUGVyRnJhbWU7IHNhbXBsZUluZGV4KyspIHsKICAgICAgICAgICAgIGZsb2F0IHNhbXBsZSA9ICpzb3VyY2UrKzsKLQogICAgICAgICAgICAgLy8gQ2xpcCB0byB2YWxpZCByYW5nZSBvZiBhIGZsb2F0IHNhbXBsZSB0byBwcmV2ZW50IGV4Y2Vzc2l2ZSB2b2x1bWUuCi0gICAgICAgICAgICBpZiAoc2FtcGxlID4gTUFYX0hFQURST09NKSBzYW1wbGUgPSBNQVhfSEVBRFJPT007Ci0gICAgICAgICAgICBlbHNlIGlmIChzYW1wbGUgPCBNSU5fSEVBRFJPT00pIHNhbXBsZSA9IE1JTl9IRUFEUk9PTTsKKyAgICAgICAgICAgIHNhbXBsZSA9IGNsaXBUb01pbk1heEhlYWRyb29tKHNhbXBsZSk7CiAKICAgICAgICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlICogc2NhbGVyOwogICAgICAgICB9CkBAIC0xODgsMTggKzE2MSwyNjcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCiAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTIpIHsKLSAgICBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGUxIC8gU0hPUlRfU0NBTEU7Ci0gICAgZmxvYXQgZGVsdGEgPSAoYW1wbGl0dWRlMiAtIGFtcGxpdHVkZTEpIC8gKFNIT1JUX1NDQUxFICogKGZsb2F0KSBudW1GcmFtZXMpOworICAgIC8vIEJlY2F1c2Ugd2UgYXJlIGNvbnZlcnRpbmcgZnJvbSBpbnQxNiB0byAxbnQxNiwgd2UgZG8gbm90IGhhdmUgdG8gc2NhbGUgYnkgMS8zMjc2OC4KKyAgICBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGUxOworICAgIGNvbnN0IGZsb2F0IGRlbHRhID0gKGFtcGxpdHVkZTIgLSBhbXBsaXR1ZGUxKSAvIG51bUZyYW1lczsKICAgICBmb3IgKGludCBmcmFtZUluZGV4ID0gMDsgZnJhbWVJbmRleCA8IG51bUZyYW1lczsgZnJhbWVJbmRleCsrKSB7CiAgICAgICAgIGZvciAoaW50IHNhbXBsZUluZGV4ID0gMDsgc2FtcGxlSW5kZXggPCBzYW1wbGVzUGVyRnJhbWU7IHNhbXBsZUluZGV4KyspIHsKICAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gY2xpcCBiZWNhdXNlIGludDE2X3QgcmFuZ2UgaXMgaW5oZXJlbnRseSBsaW1pdGVkLgogICAgICAgICAgICAgZmxvYXQgc2FtcGxlID0gICpzb3VyY2UrKyAqIHNjYWxlcjsKLSAgICAgICAgICAgICpkZXN0aW5hdGlvbisrID0gIGZsb2F0VG9JbnQxNihzYW1wbGUpOworICAgICAgICAgICAgKmRlc3RpbmF0aW9uKysgPSAoaW50MTZfdCkgcm91bmRmKHNhbXBsZSk7CiAgICAgICAgIH0KICAgICAgICAgc2NhbGVyICs9IGRlbHRhOwogICAgIH0KIH0KIAorLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gQ29udmVydCBNb25vIFRvIFN0ZXJlbyBhdCB0aGUgc2FtZSB0aW1lIGFzIGNvbnZlcnRpbmcgZm9ybWF0Lgordm9pZCBBQXVkaW9Db252ZXJ0X2Zvcm1hdE1vbm9Ub1N0ZXJlbyhjb25zdCBmbG9hdCAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpkZXN0aW5hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZSkgeworICAgIGNvbnN0IGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUZyYW1lczsgaSsrKSB7CisgICAgICAgIGZsb2F0IHNhbXBsZSA9ICpzb3VyY2UrKzsKKyAgICAgICAgaW50MTZfdCBzYW1wbGUxNiA9IGNsaXBBbmRDbGFtcEZsb2F0VG9QY20xNihzYW1wbGUsIHNjYWxlcik7CisgICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlMTY7CisgICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlMTY7CisgICAgfQorfQorCit2b2lkIEFBdWRpb0NvbnZlcnRfZm9ybWF0TW9ub1RvU3RlcmVvKGNvbnN0IGZsb2F0ICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRlc3RpbmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMikgeworICAgIC8vIGRpdmlkZSBieSBudW1GcmFtZXMgc28gdGhhdCB3ZSBhbG1vc3QgcmVhY2ggYW1wbGl0dWRlMgorICAgIGNvbnN0IGZsb2F0IGRlbHRhID0gKGFtcGxpdHVkZTIgLSBhbXBsaXR1ZGUxKSAvIG51bUZyYW1lczsKKyAgICBmb3IgKGludCBmcmFtZUluZGV4ID0gMDsgZnJhbWVJbmRleCA8IG51bUZyYW1lczsgZnJhbWVJbmRleCsrKSB7CisgICAgICAgIGNvbnN0IGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZTEgKyAoZnJhbWVJbmRleCAqIGRlbHRhKTsKKyAgICAgICAgY29uc3QgZmxvYXQgc2FtcGxlID0gKnNvdXJjZSsrOworICAgICAgICBpbnQxNl90IHNhbXBsZTE2ID0gY2xpcEFuZENsYW1wRmxvYXRUb1BjbTE2KHNhbXBsZSwgc2NhbGVyKTsKKyAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGUxNjsKKyAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGUxNjsKKyAgICB9Cit9CisKK3ZvaWQgQUF1ZGlvQ29udmVydF9mb3JtYXRNb25vVG9TdGVyZW8oY29uc3QgaW50MTZfdCAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUpIHsKKyAgICBjb25zdCBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGUgLyBTSE9SVF9TQ0FMRTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUZyYW1lczsgaSsrKSB7CisgICAgICAgIGZsb2F0IHNhbXBsZSA9IHNvdXJjZVtpXSAqIHNjYWxlcjsKKyAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGU7CisgICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlOworICAgIH0KK30KKworLy8gVGhpcyBjb2RlIGFzc3VtZXMgYW1wbGl0dWRlMSBhbmQgYW1wbGl0dWRlMiBhcmUgYmV0d2VlbiAwLjAgYW5kIDEuMAordm9pZCBBQXVkaW9Db252ZXJ0X2Zvcm1hdE1vbm9Ub1N0ZXJlbyhjb25zdCBpbnQxNl90ICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpkZXN0aW5hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTIpIHsKKyAgICBjb25zdCBmbG9hdCBzY2FsZXIxID0gYW1wbGl0dWRlMSAvIFNIT1JUX1NDQUxFOworICAgIGNvbnN0IGZsb2F0IGRlbHRhID0gKGFtcGxpdHVkZTIgLSBhbXBsaXR1ZGUxKSAvIChTSE9SVF9TQ0FMRSAqIChmbG9hdCkgbnVtRnJhbWVzKTsKKyAgICBmb3IgKGludCBmcmFtZUluZGV4ID0gMDsgZnJhbWVJbmRleCA8IG51bUZyYW1lczsgZnJhbWVJbmRleCsrKSB7CisgICAgICAgIGZsb2F0IHNjYWxlciA9IHNjYWxlcjEgKyAoZnJhbWVJbmRleCAqIGRlbHRhKTsKKyAgICAgICAgZmxvYXQgc2FtcGxlID0gc291cmNlW2ZyYW1lSW5kZXhdICogc2NhbGVyOworICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZTsKKyAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGU7CisgICAgfQorfQorCisvLyBUaGlzIGNvZGUgYXNzdW1lcyBhbXBsaXR1ZGUxIGFuZCBhbXBsaXR1ZGUyIGFyZSBiZXR3ZWVuIDAuMCBhbmQgMS4wCit2b2lkIEFBdWRpb19saW5lYXJSYW1wTW9ub1RvU3RlcmVvKGNvbnN0IGZsb2F0ICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpkZXN0aW5hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTIpIHsKKyAgICBjb25zdCBmbG9hdCBkZWx0YSA9IChhbXBsaXR1ZGUyIC0gYW1wbGl0dWRlMSkgLyBudW1GcmFtZXM7CisgICAgZm9yIChpbnQgZnJhbWVJbmRleCA9IDA7IGZyYW1lSW5kZXggPCBudW1GcmFtZXM7IGZyYW1lSW5kZXgrKykgeworICAgICAgICBmbG9hdCBzYW1wbGUgPSAqc291cmNlKys7CisKKyAgICAgICAgLy8gQ2xpcCB0byB2YWxpZCByYW5nZSBvZiBhIGZsb2F0IHNhbXBsZSB0byBwcmV2ZW50IGV4Y2Vzc2l2ZSB2b2x1bWUuCisgICAgICAgIHNhbXBsZSA9IGNsaXBUb01pbk1heEhlYWRyb29tKHNhbXBsZSk7CisKKyAgICAgICAgY29uc3QgZmxvYXQgc2NhbGVyID0gYW1wbGl0dWRlMSArIChmcmFtZUluZGV4ICogZGVsdGEpOworICAgICAgICBmbG9hdCBzYW1wbGVTY2FsZWQgPSBzYW1wbGUgKiBzY2FsZXI7CisgICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlU2NhbGVkOworICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZVNjYWxlZDsKKyAgICB9Cit9CisKKy8vIFRoaXMgY29kZSBhc3N1bWVzIGFtcGxpdHVkZTEgYW5kIGFtcGxpdHVkZTIgYXJlIGJldHdlZW4gMC4wIGFuZCAxLjAKK3ZvaWQgQUF1ZGlvX2xpbmVhclJhbXBNb25vVG9TdGVyZW8oY29uc3QgaW50MTZfdCAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpkZXN0aW5hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTIpIHsKKyAgICAvLyBCZWNhdXNlIHdlIGFyZSBjb252ZXJ0aW5nIGZyb20gaW50MTYgdG8gMW50MTYsIHdlIGRvIG5vdCBoYXZlIHRvIHNjYWxlIGJ5IDEvMzI3NjguCisgICAgY29uc3QgZmxvYXQgZGVsdGEgPSAoYW1wbGl0dWRlMiAtIGFtcGxpdHVkZTEpIC8gbnVtRnJhbWVzOworICAgIGZvciAoaW50IGZyYW1lSW5kZXggPSAwOyBmcmFtZUluZGV4IDwgbnVtRnJhbWVzOyBmcmFtZUluZGV4KyspIHsKKyAgICAgICAgY29uc3QgZmxvYXQgc2NhbGVyID0gYW1wbGl0dWRlMSArIChmcmFtZUluZGV4ICogZGVsdGEpOworICAgICAgICAvLyBObyBuZWVkIHRvIGNsaXAgYmVjYXVzZSBpbnQxNl90IHJhbmdlIGlzIGluaGVyZW50bHkgbGltaXRlZC4KKyAgICAgICAgY29uc3QgZmxvYXQgc2FtcGxlID0gICpzb3VyY2UrKyAqIHNjYWxlcjsKKyAgICAgICAgaW50MTZfdCBzYW1wbGUxNiA9IChpbnQxNl90KSByb3VuZGYoc2FtcGxlKTsKKyAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGUxNjsKKyAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGUxNjsKKyAgICB9Cit9CisKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3ZvaWQgQUF1ZGlvRGF0YUNvbnZlcnRlcjo6Y29udmVydCgKKyAgICAgICAgY29uc3QgRm9ybWF0dGVkRGF0YSAmc291cmNlLAorICAgICAgICBjb25zdCBGb3JtYXR0ZWREYXRhICZkZXN0aW5hdGlvbiwKKyAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCisgICAgICAgIGZsb2F0IGxldmVsRnJvbSwKKyAgICAgICAgZmxvYXQgbGV2ZWxUbykgeworCisgICAgaWYgKHNvdXJjZS5jaGFubmVsQ291bnQgPT0gMSAmJiBkZXN0aW5hdGlvbi5jaGFubmVsQ291bnQgPT0gMikgeworICAgICAgICBjb252ZXJ0TW9ub1RvU3RlcmVvKHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxGcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFdlIG9ubHkgc3VwcG9ydCBtb25vIHRvIHN0ZXJlbyBjb252ZXJzaW9uLiBPdGhlcndpc2Ugc291cmNlIGFuZCBkZXN0aW5hdGlvbgorICAgICAgICAvLyBtdXN0IG1hdGNoLgorICAgICAgICBhc3NlcnQoc291cmNlLmNoYW5uZWxDb3VudCA9PSBkZXN0aW5hdGlvbi5jaGFubmVsQ291bnQpOworICAgICAgICBjb252ZXJ0Q2hhbm5lbHNNYXRjaChzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7CisgICAgfQorfQorCit2b2lkIEFBdWRpb0RhdGFDb252ZXJ0ZXI6OmNvbnZlcnRNb25vVG9TdGVyZW8oCisgICAgICAgIGNvbnN0IEZvcm1hdHRlZERhdGEgJnNvdXJjZSwKKyAgICAgICAgY29uc3QgRm9ybWF0dGVkRGF0YSAmZGVzdGluYXRpb24sCisgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAorICAgICAgICBmbG9hdCBsZXZlbEZyb20sCisgICAgICAgIGZsb2F0IGxldmVsVG8pIHsKKworICAgIC8vIFRoZSBmb3JtYXRzIGFyZSB2YWxpZGF0ZWQgd2hlbiB0aGUgc3RyZWFtIGlzIG9wZW5lZCBzbyB3ZSBkbyBub3QgaGF2ZSB0bworICAgIC8vIGNoZWNrIGZvciBpbGxlZ2FsIGNvbWJpbmF0aW9ucyBoZXJlLgorICAgIGlmIChzb3VyY2UuZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7CisgICAgICAgIGlmIChkZXN0aW5hdGlvbi5mb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKKyAgICAgICAgICAgIEFBdWRpb19saW5lYXJSYW1wTW9ub1RvU3RlcmVvKAorICAgICAgICAgICAgICAgICAgICAoY29uc3QgZmxvYXQgKikgc291cmNlLmRhdGEsCisgICAgICAgICAgICAgICAgICAgIChmbG9hdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAorICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCisgICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7CisgICAgICAgIH0gZWxzZSBpZiAoZGVzdGluYXRpb24uZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0kxNikgeworICAgICAgICAgICAgaWYgKGxldmVsRnJvbSAhPSBsZXZlbFRvKSB7CisgICAgICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9mb3JtYXRNb25vVG9TdGVyZW8oCisgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZmxvYXQgKikgc291cmNlLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50MTZfdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxGcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfZm9ybWF0TW9ub1RvU3RlcmVvKAorICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICopIHNvdXJjZS5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludDE2X3QgKikgZGVzdGluYXRpb24uZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIGlmIChzb3VyY2UuZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0kxNikgeworICAgICAgICBpZiAoZGVzdGluYXRpb24uZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7CisgICAgICAgICAgICBpZiAobGV2ZWxGcm9tICE9IGxldmVsVG8pIHsKKyAgICAgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X2Zvcm1hdE1vbm9Ub1N0ZXJlbygKKyAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBpbnQxNl90ICopIHNvdXJjZS5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0ICopIGRlc3RpbmF0aW9uLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sCisgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9mb3JtYXRNb25vVG9TdGVyZW8oCisgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgaW50MTZfdCAqKSBzb3VyY2UuZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZGVzdGluYXRpb24uZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0kxNikgeworICAgICAgICAgICAgQUF1ZGlvX2xpbmVhclJhbXBNb25vVG9TdGVyZW8oCisgICAgICAgICAgICAgICAgICAgIChjb25zdCBpbnQxNl90ICopIHNvdXJjZS5kYXRhLAorICAgICAgICAgICAgICAgICAgICAoaW50MTZfdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAorICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCisgICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQUF1ZGlvRGF0YUNvbnZlcnRlcjo6Y29udmVydENoYW5uZWxzTWF0Y2goCisgICAgICAgIGNvbnN0IEZvcm1hdHRlZERhdGEgJnNvdXJjZSwKKyAgICAgICAgY29uc3QgRm9ybWF0dGVkRGF0YSAmZGVzdGluYXRpb24sCisgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAorICAgICAgICBmbG9hdCBsZXZlbEZyb20sCisgICAgICAgIGZsb2F0IGxldmVsVG8pIHsKKyAgICBjb25zdCBpbnQzMl90IG51bVNhbXBsZXMgPSBudW1GcmFtZXMgKiBzb3VyY2UuY2hhbm5lbENvdW50OworCisgICAgLy8gVGhlIGZvcm1hdHMgYXJlIHZhbGlkYXRlZCB3aGVuIHRoZSBzdHJlYW0gaXMgb3BlbmVkIHNvIHdlIGRvIG5vdCBoYXZlIHRvCisgICAgLy8gY2hlY2sgZm9yIGlsbGVnYWwgY29tYmluYXRpb25zIGhlcmUuCisgICAgaWYgKHNvdXJjZS5mb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKKyAgICAgICAgaWYgKGRlc3RpbmF0aW9uLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgeworICAgICAgICAgICAgQUF1ZGlvX2xpbmVhclJhbXAoCisgICAgICAgICAgICAgICAgICAgIChjb25zdCBmbG9hdCAqKSBzb3VyY2UuZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgKGZsb2F0ICopIGRlc3RpbmF0aW9uLmRhdGEsCisgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgc291cmNlLmNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWxGcm9tLAorICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKKyAgICAgICAgfSBlbHNlIGlmIChkZXN0aW5hdGlvbi5mb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2KSB7CisgICAgICAgICAgICBpZiAobGV2ZWxGcm9tICE9IGxldmVsVG8pIHsKKyAgICAgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X2Zsb2F0VG9QY20xNigKKyAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBmbG9hdCAqKSBzb3VyY2UuZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQxNl90ICopIGRlc3RpbmF0aW9uLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UuY2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxGcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfZmxvYXRUb1BjbTE2KAorICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICopIHNvdXJjZS5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludDE2X3QgKikgZGVzdGluYXRpb24uZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoc291cmNlLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKKyAgICAgICAgaWYgKGRlc3RpbmF0aW9uLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgeworICAgICAgICAgICAgaWYgKGxldmVsRnJvbSAhPSBsZXZlbFRvKSB7CisgICAgICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9wY20xNlRvRmxvYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgaW50MTZfdCAqKSBzb3VyY2UuZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLmNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X3BjbTE2VG9GbG9hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBpbnQxNl90ICopIHNvdXJjZS5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0ICopIGRlc3RpbmF0aW9uLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZGVzdGluYXRpb24uZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0kxNikgeworICAgICAgICAgICAgQUF1ZGlvX2xpbmVhclJhbXAoCisgICAgICAgICAgICAgICAgICAgIChjb25zdCBpbnQxNl90ICopIHNvdXJjZS5kYXRhLAorICAgICAgICAgICAgICAgICAgICAoaW50MTZfdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAorICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCisgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5jaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7CisgICAgICAgIH0KKyAgICB9Cit9CisKIHN0YXR1c190IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU3RhdHVzKGFhdWRpb19yZXN1bHRfdCByZXN1bHQpIHsKICAgICAvLyBUaGlzIGNvdmVycyB0aGUgY2FzZSBmb3IgQUFVRElPX09LIGFuZCBmb3IgcG9zaXRpdmUgcmVzdWx0cy4KICAgICBpZiAocmVzdWx0ID49IDApIHsKQEAgLTI4MSw2ICs1MDMsMTMgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCithdWRpb19zZXNzaW9uX3QgQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTZXNzaW9uSWQoYWF1ZGlvX3Nlc3Npb25faWRfdCBzZXNzaW9uSWQpIHsKKyAgICAvLyBJZiBub3QgYSByZWd1bGFyIHNlc3Npb25JZCB0aGVuIGNvbnZlcnQgdG8gYSBzYWZlIHZhbHVlIG9mIEFVRElPX1NFU1NJT05fQUxMT0NBVEUuCisgICAgcmV0dXJuIChzZXNzaW9uSWQgPT0gQUFVRElPX1NFU1NJT05fSURfQUxMT0NBVEUgfHwgc2Vzc2lvbklkID09IEFBVURJT19TRVNTSU9OX0lEX05PTkUpCisgICAgICAgICAgID8gQVVESU9fU0VTU0lPTl9BTExPQ0FURQorICAgICAgICAgICA6IChhdWRpb19zZXNzaW9uX3QpIHNlc3Npb25JZDsKK30KKwogYXVkaW9fZm9ybWF0X3QgQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWREYXRhRm9ybWF0KGFhdWRpb19mb3JtYXRfdCBhYXVkaW9Gb3JtYXQpIHsKICAgICBhdWRpb19mb3JtYXRfdCBhbmRyb2lkRm9ybWF0OwogICAgIHN3aXRjaCAoYWF1ZGlvRm9ybWF0KSB7CkBAIC0zMTUsMTcgKzU0NCw3NyBAQAogICAgIHJldHVybiBhYXVkaW9Gb3JtYXQ7CiB9CiAKKy8vIE1ha2UgYSBtZXNzYWdlIHN0cmluZyBmcm9tIHRoZSBjb25kaXRpb24uCisjZGVmaW5lIFNUQVRJQ19BU1NFUlQoY29uZGl0aW9uKSBzdGF0aWNfYXNzZXJ0KGNvbmRpdGlvbiwgI2NvbmRpdGlvbikKKworYXVkaW9fdXNhZ2VfdCBBQXVkaW9Db252ZXJ0X3VzYWdlVG9JbnRlcm5hbChhYXVkaW9fdXNhZ2VfdCB1c2FnZSkgeworICAgIC8vIFRoZSBwdWJsaWMgYWF1ZGlvX2NvbnRlbnRfdHlwZV90IGNvbnN0YW50cyBhcmUgc3VwcG9zZWQgdG8gaGF2ZSB0aGUgc2FtZQorICAgIC8vIHZhbHVlcyBhcyB0aGUgaW50ZXJuYWwgYXVkaW9fY29udGVudF90eXBlX3QgdmFsdWVzLgorICAgIFNUQVRJQ19BU1NFUlQoQUFVRElPX1VTQUdFX01FRElBID09IEFVRElPX1VTQUdFX01FRElBKTsKKyAgICBTVEFUSUNfQVNTRVJUKEFBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OID09IEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT04pOworICAgIFNUQVRJQ19BU1NFUlQoQUFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORworICAgICAgICAgICAgICAgICAgPT0gQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HKTsKKyAgICBTVEFUSUNfQVNTRVJUKEFBVURJT19VU0FHRV9BTEFSTSA9PSBBVURJT19VU0FHRV9BTEFSTSk7CisgICAgU1RBVElDX0FTU0VSVChBQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OID09IEFVRElPX1VTQUdFX05PVElGSUNBVElPTik7CisgICAgU1RBVElDX0FTU0VSVChBQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1JJTkdUT05FCisgICAgICAgICAgICAgICAgICA9PSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FKTsKKyAgICBTVEFUSUNfQVNTRVJUKEFBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQgPT0gQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5UKTsKKyAgICBTVEFUSUNfQVNTRVJUKEFBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFkgPT0gQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZKTsKKyAgICBTVEFUSUNfQVNTRVJUKEFBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0UKKyAgICAgICAgICAgICAgICAgID09IEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSk7CisgICAgU1RBVElDX0FTU0VSVChBQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT04gPT0gQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT04pOworICAgIFNUQVRJQ19BU1NFUlQoQUFVRElPX1VTQUdFX0dBTUUgPT0gQVVESU9fVVNBR0VfR0FNRSk7CisgICAgU1RBVElDX0FTU0VSVChBQVVESU9fVVNBR0VfQVNTSVNUQU5UID09IEFVRElPX1VTQUdFX0FTU0lTVEFOVCk7CisgICAgaWYgKHVzYWdlID09IEFBVURJT19VTlNQRUNJRklFRCkgeworICAgICAgICB1c2FnZSA9IEFBVURJT19VU0FHRV9NRURJQTsKKyAgICB9CisgICAgcmV0dXJuIChhdWRpb191c2FnZV90KSB1c2FnZTsgLy8gc2FtZSB2YWx1ZQorfQorCithdWRpb19jb250ZW50X3R5cGVfdCBBQXVkaW9Db252ZXJ0X2NvbnRlbnRUeXBlVG9JbnRlcm5hbChhYXVkaW9fY29udGVudF90eXBlX3QgY29udGVudFR5cGUpIHsKKyAgICAvLyBUaGUgcHVibGljIGFhdWRpb19jb250ZW50X3R5cGVfdCBjb25zdGFudHMgYXJlIHN1cHBvc2VkIHRvIGhhdmUgdGhlIHNhbWUKKyAgICAvLyB2YWx1ZXMgYXMgdGhlIGludGVybmFsIGF1ZGlvX2NvbnRlbnRfdHlwZV90IHZhbHVlcy4KKyAgICBTVEFUSUNfQVNTRVJUKEFBVURJT19DT05URU5UX1RZUEVfTVVTSUMgPT0gQVVESU9fQ09OVEVOVF9UWVBFX01VU0lDKTsKKyAgICBTVEFUSUNfQVNTRVJUKEFBVURJT19DT05URU5UX1RZUEVfU1BFRUNIID09IEFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0gpOworICAgIFNUQVRJQ19BU1NFUlQoQUFVRElPX0NPTlRFTlRfVFlQRV9TT05JRklDQVRJT04gPT0gQVVESU9fQ09OVEVOVF9UWVBFX1NPTklGSUNBVElPTik7CisgICAgU1RBVElDX0FTU0VSVChBQVVESU9fQ09OVEVOVF9UWVBFX01PVklFID09IEFVRElPX0NPTlRFTlRfVFlQRV9NT1ZJRSk7CisgICAgaWYgKGNvbnRlbnRUeXBlID09IEFBVURJT19VTlNQRUNJRklFRCkgeworICAgICAgICBjb250ZW50VHlwZSA9IEFBVURJT19DT05URU5UX1RZUEVfTVVTSUM7CisgICAgfQorICAgIHJldHVybiAoYXVkaW9fY29udGVudF90eXBlX3QpIGNvbnRlbnRUeXBlOyAvLyBzYW1lIHZhbHVlCit9CisKK2F1ZGlvX3NvdXJjZV90IEFBdWRpb0NvbnZlcnRfaW5wdXRQcmVzZXRUb0F1ZGlvU291cmNlKGFhdWRpb19pbnB1dF9wcmVzZXRfdCBwcmVzZXQpIHsKKyAgICAvLyBUaGUgcHVibGljIGFhdWRpb19pbnB1dF9wcmVzZXRfdCBjb25zdGFudHMgYXJlIHN1cHBvc2VkIHRvIGhhdmUgdGhlIHNhbWUKKyAgICAvLyB2YWx1ZXMgYXMgdGhlIGludGVybmFsIGF1ZGlvX3NvdXJjZV90IHZhbHVlcy4KKyAgICBTVEFUSUNfQVNTRVJUKEFBVURJT19VTlNQRUNJRklFRCA9PSBBVURJT19TT1VSQ0VfREVGQVVMVCk7CisgICAgU1RBVElDX0FTU0VSVChBQVVESU9fSU5QVVRfUFJFU0VUX0dFTkVSSUMgPT0gQVVESU9fU09VUkNFX01JQyk7CisgICAgU1RBVElDX0FTU0VSVChBQVVESU9fSU5QVVRfUFJFU0VUX0NBTUNPUkRFUiA9PSBBVURJT19TT1VSQ0VfQ0FNQ09SREVSKTsKKyAgICBTVEFUSUNfQVNTRVJUKEFBVURJT19JTlBVVF9QUkVTRVRfVk9JQ0VfUkVDT0dOSVRJT04gPT0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OKTsKKyAgICBTVEFUSUNfQVNTRVJUKEFBVURJT19JTlBVVF9QUkVTRVRfVk9JQ0VfQ09NTVVOSUNBVElPTiA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTik7CisgICAgU1RBVElDX0FTU0VSVChBQVVESU9fSU5QVVRfUFJFU0VUX1VOUFJPQ0VTU0VEID09IEFVRElPX1NPVVJDRV9VTlBST0NFU1NFRCk7CisgICAgaWYgKHByZXNldCA9PSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKKyAgICAgICAgcHJlc2V0ID0gQUFVRElPX0lOUFVUX1BSRVNFVF9WT0lDRV9SRUNPR05JVElPTjsKKyAgICB9CisgICAgcmV0dXJuIChhdWRpb19zb3VyY2VfdCkgcHJlc2V0OyAvLyBzYW1lIHZhbHVlCit9CisKIGludDMyX3QgQUF1ZGlvQ29udmVydF9mcmFtZXNUb0J5dGVzKGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGJ5dGVzUGVyRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKnNpemVJbkJ5dGVzKSB7Ci0gICAgLy8gVE9ETyBpbXBsZW1lbnQgbW9yZSBlbGVnYW50bHkKLSAgICBjb25zdCBpbnQzMl90IG1heENoYW5uZWxzID0gMjU2OyAvLyByaWRpY3Vsb3VzbHkgbGFyZ2UKLSAgICBjb25zdCBpbnQzMl90IG1heEJ5dGVzUGVyRnJhbWUgPSBtYXhDaGFubmVscyAqIHNpemVvZihmbG9hdCk7Ci0gICAgLy8gUHJldmVudCBvdmVyZmxvdyBieSBsaW1pdGluZyBtdWx0aXBsaWNhbmRzLgotICAgIGlmIChieXRlc1BlckZyYW1lID4gbWF4Qnl0ZXNQZXJGcmFtZSB8fCBudW1GcmFtZXMgPiAoMHgzRkZGRkZGRiAvIG1heEJ5dGVzUGVyRnJhbWUpKSB7Ci0gICAgICAgIEFMT0dFKCJzaXplIG92ZXJmbG93LCBudW1GcmFtZXMgPSAlZCwgZnJhbWVTaXplID0gJXpkIiwgbnVtRnJhbWVzLCBieXRlc1BlckZyYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYnl0ZXNQZXJGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKnNpemVJbkJ5dGVzKSB7CisgICAgKnNpemVJbkJ5dGVzID0gMDsKKworICAgIGlmIChudW1GcmFtZXMgPCAwIHx8IGJ5dGVzUGVyRnJhbWUgPCAwKSB7CisgICAgICAgIEFMT0dFKCJuZWdhdGl2ZSBzaXplLCBudW1GcmFtZXMgPSAlZCwgZnJhbWVTaXplID0gJWQiLCBudW1GcmFtZXMsIGJ5dGVzUGVyRnJhbWUpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKICAgICB9CisKKyAgICAvLyBQcmV2ZW50IG51bWVyaWMgb3ZlcmZsb3cuCisgICAgaWYgKG51bUZyYW1lcyA+IChJTlQzMl9NQVggLyBieXRlc1BlckZyYW1lKSkgeworICAgICAgICBBTE9HRSgic2l6ZSBvdmVyZmxvdywgbnVtRnJhbWVzID0gJWQsIGZyYW1lU2l6ZSA9ICVkIiwgbnVtRnJhbWVzLCBieXRlc1BlckZyYW1lKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7CisgICAgfQorCiAgICAgKnNpemVJbkJ5dGVzID0gbnVtRnJhbWVzICogYnl0ZXNQZXJGcmFtZTsKICAgICByZXR1cm4gQUFVRElPX09LOwogfQpAQCAtNDEwLDMgKzY5OSwzMSBAQAogICAgIH0KICAgICByZXR1cm4gcHJvcDsKIH0KKworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb19pc0ZsdXNoQWxsb3dlZChhYXVkaW9fc3RyZWFtX3N0YXRlX3Qgc3RhdGUpIHsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOworICAgIHN3aXRjaCAoc3RhdGUpIHsKKy8vIFByb2NlZWQgd2l0aCBmbHVzaGluZy4KKyAgICAgICAgY2FzZSBBQVVESU9fU1RSRUFNX1NUQVRFX09QRU46CisgICAgICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTRUQ6CisgICAgICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUEVEOgorICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfRkxVU0hFRDoKKyAgICAgICAgICAgIGJyZWFrOworCisvLyBUcmFuc2l0aW9uIGZyb20gb25lIGluYWN0aXZlIHN0YXRlIHRvIGFub3RoZXIuCisgICAgICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVElORzoKKyAgICAgICAgY2FzZSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJURUQ6CisgICAgICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUElORzoKKyAgICAgICAgY2FzZSBBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNJTkc6CisgICAgICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9GTFVTSElORzoKKyAgICAgICAgY2FzZSBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NJTkc6CisgICAgICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQ6CisgICAgICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiY2FuIG9ubHkgZmx1c2ggc3RyZWFtIHdoZW4gUEFVU0VELCBPUEVOIG9yIFNUT1BQRUQsIHN0YXRlID0gJXMiLAorICAgICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRTdHJlYW1TdGF0ZVRvVGV4dChzdGF0ZSkpOworICAgICAgICAgICAgcmVzdWx0ID0gIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmgKaW5kZXggM2FmYTk3Ni4uNGI5NzVlOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaApAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW8uaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KIAogI2luY2x1ZGUgImFhdWRpby9BQXVkaW8uaCIKIApAQCAtMzgsNiArMzgsMTMgQEAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChhbmRyb2lkOjpzdGF0dXNfdCBzdGF0dXMpOwogCiAvKioKKyAqIENvbnZlcnQgYW4gYWF1ZGlvX3Nlc3Npb25faWRfdCB0byBhIHZhbHVlIHRoYXQgaXMgc2FmZSB0byBwYXNzIHRvIEF1ZGlvRmxpbmdlci4KKyAqIEBwYXJhbSBzZXNzaW9uSWQKKyAqIEByZXR1cm4gc2FmZSB2YWx1ZQorICovCithdWRpb19zZXNzaW9uX3QgQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTZXNzaW9uSWQoYWF1ZGlvX3Nlc3Npb25faWRfdCBzZXNzaW9uSWQpOworCisvKioKICAqIENvbnZlcnQgYW4gYXJyYXkgb2YgZmxvYXRzIHRvIGFuIGFycmF5IG9mIGludDE2X3QuCiAgKgogICogQHBhcmFtIHNvdXJjZQpAQCAtMTUyLDIxICsxNTksODEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMik7CiAKK2NsYXNzIEFBdWRpb0RhdGFDb252ZXJ0ZXIgeworcHVibGljOgorCisgICAgc3RydWN0IEZvcm1hdHRlZERhdGEgeworCisgICAgICAgIEZvcm1hdHRlZERhdGEodm9pZCAqZGF0YSwgYWF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgICAgICA6IGRhdGEoZGF0YSkKKyAgICAgICAgICAgICwgZm9ybWF0KGZvcm1hdCkKKyAgICAgICAgICAgICwgY2hhbm5lbENvdW50KGNoYW5uZWxDb3VudCkge30KKworICAgICAgICBjb25zdCB2b2lkICAgICAgICAgICAgKmRhdGEgPSBudWxscHRyOworICAgICAgICBjb25zdCBhYXVkaW9fZm9ybWF0X3QgIGZvcm1hdCA9IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQ7CisgICAgICAgIGNvbnN0IGludDMyX3QgICAgICAgICAgY2hhbm5lbENvdW50ID0gMTsKKyAgICB9OworCisgICAgc3RhdGljIHZvaWQgY29udmVydChjb25zdCBGb3JtYXR0ZWREYXRhICZzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGb3JtYXR0ZWREYXRhICZkZXN0aW5hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbGV2ZWxGcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbGV2ZWxUbyk7CisKK3ByaXZhdGU6CisgICAgc3RhdGljIHZvaWQgY29udmVydE1vbm9Ub1N0ZXJlbyhjb25zdCBGb3JtYXR0ZWREYXRhICZzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGb3JtYXR0ZWREYXRhICZkZXN0aW5hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbGV2ZWxGcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbGV2ZWxUbyk7CisKKyAgICBzdGF0aWMgdm9pZCBjb252ZXJ0Q2hhbm5lbHNNYXRjaChjb25zdCBGb3JtYXR0ZWREYXRhICZzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRm9ybWF0dGVkRGF0YSAmZGVzdGluYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbGV2ZWxGcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxldmVsVG8pOworfTsKKwogLyoqCiAgKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBieXRlcyBhbmQgcHJldmVudCBudW1lcmljIG92ZXJmbG93LgorICogVGhlICpzaXplSW5CeXRlcyB3aWxsIGJlIHNldCB0byB6ZXJvIGlmIHRoZXJlIGlzIGFuIGVycm9yLgorICoKICAqIEBwYXJhbSBudW1GcmFtZXMgZnJhbWUgY291bnQKICAqIEBwYXJhbSBieXRlc1BlckZyYW1lIHNpemUgb2YgYSBmcmFtZSBpbiBieXRlcwotICogQHBhcmFtIHNpemVJbkJ5dGVzIHRvdGFsIHNpemUgaW4gYnl0ZXMKKyAqIEBwYXJhbSBzaXplSW5CeXRlcyBwb2ludGVyIHRvIGEgdmFyaWFibGUgdG8gcmVjZWl2ZSB0b3RhbCBzaXplIGluIGJ5dGVzCiAgKiBAcmV0dXJuIEFBVURJT19PSyBvciBuZWdhdGl2ZSBlcnJvciwgZWcuIEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0UKICAqLwogaW50MzJfdCBBQXVkaW9Db252ZXJ0X2ZyYW1lc1RvQnl0ZXMoaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYnl0ZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAqc2l6ZUluQnl0ZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBieXRlc1BlckZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAqc2l6ZUluQnl0ZXMpOwogCiBhdWRpb19mb3JtYXRfdCBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZERhdGFGb3JtYXQoYWF1ZGlvX2Zvcm1hdF90IGFhdWRpb19mb3JtYXQpOwogCiBhYXVkaW9fZm9ybWF0X3QgQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9EYXRhRm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCk7CiAKKworLyoqCisgKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCB2YWxpZGF0ZSB0aGUgcGFzc2VkIGluIHZhbHVlLgorICogVGhhdCBpcyBkb25lIHNvbWV3aGVyZSBlbHNlLgorICogQHJldHVybiBpbnRlcm5hbCB2YWx1ZQorICovCisKK2F1ZGlvX3VzYWdlX3QgQUF1ZGlvQ29udmVydF91c2FnZVRvSW50ZXJuYWwoYWF1ZGlvX3VzYWdlX3QgdXNhZ2UpOworCisvKioKKyAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IHZhbGlkYXRlIHRoZSBwYXNzZWQgaW4gdmFsdWUuCisgKiBUaGF0IGlzIGRvbmUgc29tZXdoZXJlIGVsc2UuCisgKiBAcmV0dXJuIGludGVybmFsIHZhbHVlCisgKi8KK2F1ZGlvX2NvbnRlbnRfdHlwZV90IEFBdWRpb0NvbnZlcnRfY29udGVudFR5cGVUb0ludGVybmFsKGFhdWRpb19jb250ZW50X3R5cGVfdCBjb250ZW50VHlwZSk7CisKKy8qKgorICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgdmFsaWRhdGUgdGhlIHBhc3NlZCBpbiB2YWx1ZS4KKyAqIFRoYXQgaXMgZG9uZSBzb21ld2hlcmUgZWxzZS4KKyAqIEByZXR1cm4gaW50ZXJuYWwgYXVkaW8gc291cmNlCisgKi8KK2F1ZGlvX3NvdXJjZV90IEFBdWRpb0NvbnZlcnRfaW5wdXRQcmVzZXRUb0F1ZGlvU291cmNlKGFhdWRpb19pbnB1dF9wcmVzZXRfdCBwcmVzZXQpOworCiAvKioKICAqIEByZXR1cm4gdGhlIHNpemUgb2YgYSBzYW1wbGUgb2YgdGhlIGdpdmVuIGZvcm1hdCBpbiBieXRlcyBvciBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVAogICovCkBAIC0yMzUsNiArMzAyLDE0IEBACiAgKi8KIGludDMyX3QgQUF1ZGlvUHJvcGVydHlfZ2V0SGFyZHdhcmVCdXJzdE1pbk1pY3JvcygpOwogCisKKy8qKgorICogSXMgZmx1c2ggYWxsb3dlZCBmb3IgdGhlIGdpdmVuIHN0YXRlPworICogQHBhcmFtIHN0YXRlCisgKiBAcmV0dXJuIEFBVURJT19PSyBpZiBhbGxvd2VkIG9yIGFuIGVycm9yCisgKi8KK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9faXNGbHVzaEFsbG93ZWQoYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IHN0YXRlKTsKKwogLyoqCiAgKiBUcnkgYSBmdW5jdGlvbiBmIHVudGlsIGl0IHJldHVybnMgdHJ1ZS4KICAqCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQXVkaW9DbG9jay5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0F1ZGlvQ2xvY2suaAppbmRleCA0M2I3MWIwLi5kNWQ0ZWY0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQXVkaW9DbG9jay5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BdWRpb0Nsb2NrLmgKQEAgLTE3LDYgKzE3LDcgQEAKICNpZm5kZWYgVVRJTElUWV9BVURJT19DTE9DS19ICiAjZGVmaW5lIFVUSUxJVFlfQVVESU9fQ0xPQ0tfSAogCisjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDx0aW1lLmg+CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9MaW5lYXJSYW1wLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvTGluZWFyUmFtcC5oCmluZGV4IGZmMDlkY2UuLjJiMWI4ZTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9MaW5lYXJSYW1wLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0xpbmVhclJhbXAuaApAQCAtODcsNyArODcsNyBAQAogCiAgICAgc3RkOjphdG9taWM8ZmxvYXQ+ICAgbVRhcmdldDsKIAotICAgIGludDMyX3QgbUxlbmd0aEluRnJhbWVzICA9IDQ4MDAwIC8gNTA7IC8vIDIwIG1zZWMgYXQgNDgwMDAgSHoKKyAgICBpbnQzMl90IG1MZW5ndGhJbkZyYW1lcyAgPSA0ODAwMCAvIDEwMDsgLy8gMTAgbXNlYyBhdCA0ODAwMCBIegogICAgIGludDMyX3QgbVJlbWFpbmluZyAgICAgICA9IDA7CiAgICAgZmxvYXQgICBtTGV2ZWxGcm9tICAgICAgID0gMC4wZjsKICAgICBmbG9hdCAgIG1MZXZlbFRvICAgICAgICAgPSAwLjBmOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODE5NGRiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxNjkgQEAKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIiwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJ0ZXN0X2FhdWRpb19tYXJzaGFsbGluZyIsCisgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJ0ZXN0X21hcnNoYWxsaW5nLmNwcCJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhYXVkaW8iLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogInRlc3RfYmxvY2tfYWRhcHRlciIsCisgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJ0ZXN0X2Jsb2NrX2FkYXB0ZXIuY3BwIl0sCisgICAgc2hhcmVkX2xpYnM6IFsibGliYWF1ZGlvIl0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJ0ZXN0X3RpbWVzdGFtcHMiLAorICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsidGVzdF90aW1lc3RhbXBzLmNwcCJdLAorICAgIGhlYWRlcl9saWJzOiBbImxpYmFhdWRpb19leGFtcGxlX3V0aWxzIl0sCisgICAgc2hhcmVkX2xpYnM6IFsibGliYWF1ZGlvIl0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJ0ZXN0X2xpbmVhcl9yYW1wIiwKKyAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbInRlc3RfbGluZWFyX3JhbXAuY3BwIl0sCisgICAgc2hhcmVkX2xpYnM6IFsibGliYWF1ZGlvIl0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJ0ZXN0X29wZW5fcGFyYW1zIiwKKyAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbInRlc3Rfb3Blbl9wYXJhbXMuY3BwIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmFhdWRpbyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAidGVzdF9ub19jbG9zZSIsCisgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJ0ZXN0X25vX2Nsb3NlLmNwcCJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhYXVkaW8iLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogInRlc3RfYWF1ZGlvX3JlY292ZXJ5IiwKKyAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbInRlc3RfcmVjb3ZlcnkuY3BwIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmFhdWRpbyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAidGVzdF9uX3N0cmVhbXMiLAorICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsidGVzdF9uX3N0cmVhbXMuY3BwIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmFhdWRpbyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAidGVzdF9iYWRfZGlzY29ubmVjdCIsCisgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJ0ZXN0X2JhZF9kaXNjb25uZWN0LmNwcCJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhYXVkaW8iLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogInRlc3RfdmFyaW91cyIsCisgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJ0ZXN0X3ZhcmlvdXMuY3BwIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmFhdWRpbyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAidGVzdF9zZXNzaW9uX2lkIiwKKyAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbInRlc3Rfc2Vzc2lvbl9pZC5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYWF1ZGlvIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJ0ZXN0X2FhdWRpb19tb25rZXkiLAorICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsidGVzdF9hYXVkaW9fbW9ua2V5LmNwcCJdLAorICAgIGhlYWRlcl9saWJzOiBbImxpYmFhdWRpb19leGFtcGxlX3V0aWxzIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmFhdWRpbyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAidGVzdF9hdHRyaWJ1dGVzIiwKKyAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbInRlc3RfYXR0cmlidXRlcy5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYWF1ZGlvIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJ0ZXN0X2ludGVyZmVyZW5jZSIsCisgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJ0ZXN0X2ludGVyZmVyZW5jZS5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYWF1ZGlvIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJ0ZXN0X2F0b21pY19maWZvIiwKKyAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbInRlc3RfYXRvbWljX2ZpZm8uY3BwIl0sCisgICAgc2hhcmVkX2xpYnM6IFsibGliYWF1ZGlvIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvQW5kcm9pZC5tayBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2IwMTBkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL3NyYwotTE9DQUxfU1JDX0ZJTEVTOj0gdGVzdF9tYXJzaGFsbGluZy5jcHAKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYWF1ZGlvIGxpYmJpbmRlciBsaWJjdXRpbHMgbGlidXRpbHMKLUxPQ0FMX01PRFVMRSA6PSB0ZXN0X2FhdWRpb19tYXJzaGFsbGluZwotaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL3NyYwotTE9DQUxfU1JDX0ZJTEVTOj0gdGVzdF9ibG9ja19hZGFwdGVyLmNwcAotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJhYXVkaW8KLUxPQ0FMX01PRFVMRSA6PSB0ZXN0X2Jsb2NrX2FkYXB0ZXIKLWluY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9zcmMgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzCi1MT0NBTF9TUkNfRklMRVM6PSB0ZXN0X3RpbWVzdGFtcHMuY3BwCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmFhdWRpbwotTE9DQUxfTU9EVUxFIDo9IHRlc3RfdGltZXN0YW1wcwotaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL3NyYwotTE9DQUxfU1JDX0ZJTEVTOj0gdGVzdF9saW5lYXJfcmFtcC5jcHAKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYWF1ZGlvCi1MT0NBTF9NT0RVTEUgOj0gdGVzdF9saW5lYXJfcmFtcAotaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL3NyYwotTE9DQUxfU1JDX0ZJTEVTOj0gdGVzdF9vcGVuX3BhcmFtcy5jcHAKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYWF1ZGlvIGxpYmJpbmRlciBsaWJjdXRpbHMgbGlidXRpbHMKLUxPQ0FMX01PRFVMRSA6PSB0ZXN0X29wZW5fcGFyYW1zCi1pbmNsdWRlICQoQlVJTERfTkFUSVZFX1RFU1QpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vc3JjCi1MT0NBTF9TUkNfRklMRVM6PSB0ZXN0X25vX2Nsb3NlLmNwcAotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJhYXVkaW8gbGliYmluZGVyIGxpYmN1dGlscyBsaWJ1dGlscwotTE9DQUxfTU9EVUxFIDo9IHRlc3Rfbm9fY2xvc2UKLWluY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9zcmMKLUxPQ0FMX1NSQ19GSUxFUzo9IHRlc3RfcmVjb3ZlcnkuY3BwCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmFhdWRpbyBsaWJiaW5kZXIgbGliY3V0aWxzIGxpYnV0aWxzCi1MT0NBTF9NT0RVTEUgOj0gdGVzdF9hYXVkaW9fcmVjb3ZlcnkKLWluY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9zcmMKLUxPQ0FMX1NSQ19GSUxFUzo9IHRlc3Rfbl9zdHJlYW1zLmNwcAotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJhYXVkaW8gbGliYmluZGVyIGxpYmN1dGlscyBsaWJ1dGlscwotTE9DQUxfTU9EVUxFIDo9IHRlc3Rfbl9zdHJlYW1zCi1pbmNsdWRlICQoQlVJTERfTkFUSVZFX1RFU1QpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9hYXVkaW9fbW9ua2V5LmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2FhdWRpb19tb25rZXkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNTQ4MzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9hYXVkaW9fbW9ua2V5LmNwcApAQCAtMCwwICsxLDMwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFRyeSB0byB0cmlnZ2VyIGJ1Z3MgYnkgcGxheWluZyByYW5kb21seSBvbiBtdWx0aXBsZSBzdHJlYW1zLgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CisjaW5jbHVkZSAiQUF1ZGlvQXJnc1BhcnNlci5oIgorI2luY2x1ZGUgIkFBdWRpb0V4YW1wbGVVdGlscy5oIgorI2luY2x1ZGUgIkFBdWRpb1NpbXBsZVBsYXllci5oIgorI2luY2x1ZGUgIlNpbmVHZW5lcmF0b3IuaCIKKworI2RlZmluZSBERUZBVUxUX1RJTUVPVVRfTkFOT1MgICgxICogTkFOT1NfUEVSX1NFQ09ORCkKKworI2RlZmluZSBOVU1fTE9PUFMgICAgICAgICAgMTAwMAorI2RlZmluZSBNQVhfTUlDUk9TX0RFTEFZICAgKDIgKiAxMDAwICogMTAwMCkKKworLy8gVE9ETyBDb25zaWRlciBhZGRpbmcgYW4gaW5wdXQgc3RyZWFtLgorI2RlZmluZSBQUk9CX1NUQVJUICAgKDAuMjApCisjZGVmaW5lIFBST0JfUEFVU0UgICAoUFJPQl9TVEFSVCArIDAuMTApCisjZGVmaW5lIFBST0JfRkxVU0ggICAoUFJPQl9QQVVTRSArIDAuMTApCisjZGVmaW5lIFBST0JfU1RPUCAgICAoUFJPQl9GTFVTSCArIDAuMTApCisjZGVmaW5lIFBST0JfQ0xPU0UgICAoUFJPQl9TVE9QICsgMC4xMCkKK3N0YXRpY19hc3NlcnQoUFJPQl9DTE9TRSA8IDAuOSwgIlByb2JhYmlsaXR5IHN1bSB0b28gaGlnaC4iKTsKKworYWF1ZGlvX2RhdGFfY2FsbGJhY2tfcmVzdWx0X3QgQUF1ZGlvTW9ua2V5RGF0YUNhbGxiYWNrKAorICAgICAgICBBQXVkaW9TdHJlYW0gKnN0cmVhbSwKKyAgICAgICAgdm9pZCAqdXNlckRhdGEsCisgICAgICAgIHZvaWQgKmF1ZGlvRGF0YSwKKyAgICAgICAgaW50MzJfdCBudW1GcmFtZXMpOworCit2b2lkIEFBdWRpb01vbmtleUVycm9yQ2FsbGJhY2tQcm9jKAorICAgICAgICBBQXVkaW9TdHJlYW0gKnN0cmVhbSBfX3VudXNlZCwKKyAgICAgICAgdm9pZCAqdXNlckRhdGEgX191bnVzZWQsCisgICAgICAgIGFhdWRpb19yZXN1bHRfdCBlcnJvcikgeworICAgIHByaW50ZigiRXJyb3IgQ2FsbGJhY2ssIGVycm9yOiAlZFxuIiwoaW50KWVycm9yKTsKK30KKworLy8gVGhpcyBmdW5jdGlvbiBpcyBub3QgdGhyZWFkIHNhZmUuIE9ubHkgdXNlIHRoaXMgZnJvbSBhIHNpbmdsZSB0aHJlYWQuCitkb3VibGUgbmV4dFJhbmRvbURvdWJsZSgpIHsKKyAgICByZXR1cm4gZHJhbmQ0OCgpOworfQorCitjbGFzcyBBQXVkaW9Nb25rZXkgOiBwdWJsaWMgQUF1ZGlvU2ltcGxlUGxheWVyIHsKK3B1YmxpYzoKKworICAgIEFBdWRpb01vbmtleShpbnQgaW5kZXgsIEFBdWRpb0FyZ3NQYXJzZXIgKmFyZ1BhcnNlcikKKyAgICAgICAgICAgIDogbUFyZ1BhcnNlcihhcmdQYXJzZXIpCisgICAgICAgICAgICAsIG1JbmRleChpbmRleCkge30KKworICAgIGFhdWRpb19yZXN1bHRfdCBvcGVuKCkgeworICAgICAgICBwcmludGYoIk1vbmtleSAjICVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gT1BFTlxuIiwgbUluZGV4KTsKKyAgICAgICAgZG91YmxlIG9mZnNldCA9IG1JbmRleCAqIDUwOworICAgICAgICBtU2luZTEuc2V0dXAoNDQwLjAsIDQ4MDAwKTsKKyAgICAgICAgbVNpbmUxLnNldFN3ZWVwKDMwMC4wICsgb2Zmc2V0LCA2MDAuMCArIG9mZnNldCwgNS4wKTsKKyAgICAgICAgbVNpbmUyLnNldHVwKDY2MC4wLCA0ODAwMCk7CisgICAgICAgIG1TaW5lMi5zZXRTd2VlcCgzNTAuMCArIG9mZnNldCwgOTAwLjAgKyBvZmZzZXQsIDcuMCk7CisKKyAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1NpbXBsZVBsYXllcjo6b3BlbigqbUFyZ1BhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUF1ZGlvTW9ua2V5RGF0YUNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQXVkaW9Nb25rZXlFcnJvckNhbGxiYWNrUHJvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICBwcmludGYoIkVSUk9SIC0gIHBsYXllci5vcGVuKCkgcmV0dXJuZWQgJWRcbiIsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBtQXJnUGFyc2VyLT5jb21wYXJlV2l0aFN0cmVhbShnZXRTdHJlYW0oKSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgYm9vbCBpc09wZW4oKSB7CisgICAgICAgIHJldHVybiAoZ2V0U3RyZWFtKCkgIT0gbnVsbHB0cik7CisKKyAgICB9CisgICAgLyoqCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgc3RyZWFtIHBhc3NlcyB0ZXN0cworICAgICAqLworICAgIGJvb2wgdmFsaWRhdGUoKSB7CisgICAgICAgIGlmICghaXNPcGVuKCkpIHJldHVybiB0cnVlOyAvLyBjbG9zZWQgaXMgT0sKKworICAgICAgICAvLyB1cGRhdGUgYW5kIHF1ZXJ5IHN0cmVhbSBzdGF0ZQorICAgICAgICBhYXVkaW9fc3RyZWFtX3N0YXRlX3Qgc3RhdGUgPSBBQVVESU9fU1RSRUFNX1NUQVRFX1VOS05PV047CisgICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TdHJlYW1fd2FpdEZvclN0YXRlQ2hhbmdlKGdldFN0cmVhbSgpLAorICAgICAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9VTktOT1dOLCAmc3RhdGUsIDApOworICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICAgICAgcHJpbnRmKCJFUlJPUiAtIEFBdWRpb1N0cmVhbV93YWl0Rm9yU3RhdGVDaGFuZ2UgcmV0dXJuZWQgJWRcbiIsIHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpbnQ2NF90IGZyYW1lc1JlYWQgPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUmVhZChnZXRTdHJlYW0oKSk7CisgICAgICAgIGludDY0X3QgZnJhbWVzV3JpdHRlbiA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKGdldFN0cmVhbSgpKTsKKyAgICAgICAgaW50MzJfdCB4UnVucyA9IEFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQoZ2V0U3RyZWFtKCkpOworICAgICAgICAvLyBQcmludCBzdGF0dXMKKyAgICAgICAgcHJpbnRmKCIlMzBzLCBmcmFtZXNXcml0dGVuID0gJThsbGQsIGZyYW1lc1JlYWQgPSAlOGxsZCwgeFJ1bnMgPSAlZFxuIiwKKyAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0U3RyZWFtU3RhdGVUb1RleHQoc3RhdGUpLAorICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgZnJhbWVzV3JpdHRlbiwKKyAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGZyYW1lc1JlYWQsCisgICAgICAgICAgICAgICB4UnVucyk7CisKKyAgICAgICAgaWYgKGZyYW1lc1dyaXR0ZW4gPCBmcmFtZXNSZWFkKSB7CisgICAgICAgICAgICBwcmludGYoIldBUk5JTkcgLSBVTkRFUkZMT1cgLSBkaWZmID0gJWQgISEhISEhISEhISEhXG4iLAorICAgICAgICAgICAgICAgICAgIChpbnQpIChmcmFtZXNXcml0dGVuIC0gZnJhbWVzUmVhZCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGFhdWRpb19yZXN1bHRfdCBpbnZva2UoKSB7CisgICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CisgICAgICAgIGlmICghaXNPcGVuKCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG9wZW4oKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKCF2YWxpZGF0ZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBkb3VibGUgZGljZSA9IG5leHRSYW5kb21Eb3VibGUoKTsKKyAgICAgICAgLy8gU2VsZWN0IGFuIGFjdGlvbiBiYXNlZCBvbiBhIHdlaWdodGVkIHByb2JhYmlsaXR5LgorICAgICAgICBpZiAoZGljZSA8IFBST0JfU1RBUlQpIHsKKyAgICAgICAgICAgIHByaW50Zigic3RhcnRcbiIpOworICAgICAgICAgICAgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydChnZXRTdHJlYW0oKSk7CisgICAgICAgIH0gZWxzZSBpZiAoZGljZSA8IFBST0JfUEFVU0UpIHsKKyAgICAgICAgICAgIHByaW50ZigicGF1c2VcbiIpOworICAgICAgICAgICAgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RQYXVzZShnZXRTdHJlYW0oKSk7CisgICAgICAgIH0gZWxzZSBpZiAoZGljZSA8IFBST0JfRkxVU0gpIHsKKyAgICAgICAgICAgIHByaW50ZigiZmx1c2hcbiIpOworICAgICAgICAgICAgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RGbHVzaChnZXRTdHJlYW0oKSk7CisgICAgICAgIH0gZWxzZSBpZiAoZGljZSA8IFBST0JfU1RPUCkgeworICAgICAgICAgICAgcHJpbnRmKCJzdG9wXG4iKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcChnZXRTdHJlYW0oKSk7CisgICAgICAgIH0gZWxzZSBpZiAoZGljZSA8IFBST0JfQ0xPU0UpIHsKKyAgICAgICAgICAgIHByaW50ZigiY2xvc2VcbiIpOworICAgICAgICAgICAgcmVzdWx0ID0gY2xvc2UoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZigiZG8gbm90aGluZ1xuIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVzdWx0ID09IEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFKSB7CisgICAgICAgICAgICBwcmludGYoIiAgICBnb3QgQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEUgLSBleHBlY3RlZCBmcm9tIGEgbW9ua2V5XG4iKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IEFBVURJT19PSzsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSyAmJiBpc09wZW4oKSkgeworICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZSgpKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBhYXVkaW9fZGF0YV9jYWxsYmFja19yZXN1bHRfdCByZW5kZXJBdWRpbygKKyAgICAgICAgICAgIEFBdWRpb1N0cmVhbSAqc3RyZWFtLAorICAgICAgICAgICAgdm9pZCAqYXVkaW9EYXRhLAorICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMpIHsKKworICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSA9IEFBdWRpb1N0cmVhbV9nZXRDaGFubmVsQ291bnQoc3RyZWFtKTsKKyAgICAgICAgLy8gVGhpcyBjb2RlIG9ubHkgcGxheXMgb24gdGhlIGZpcnN0IG9uZSBvciB0d28gY2hhbm5lbHMuCisgICAgICAgIC8vIFRPRE8gU3VwcG9ydCBhcmJpdHJhcnkgbnVtYmVyIG9mIGNoYW5uZWxzLgorICAgICAgICBzd2l0Y2ggKEFBdWRpb1N0cmVhbV9nZXRGb3JtYXQoc3RyZWFtKSkgeworICAgICAgICAgICAgY2FzZSBBQVVESU9fRk9STUFUX1BDTV9JMTY6IHsKKyAgICAgICAgICAgICAgICBpbnQxNl90ICphdWRpb0J1ZmZlciA9IChpbnQxNl90ICopIGF1ZGlvRGF0YTsKKyAgICAgICAgICAgICAgICAvLyBSZW5kZXIgc2luZSB3YXZlcyBhcyBzaG9ydHMgdG8gZmlyc3QgY2hhbm5lbC4KKyAgICAgICAgICAgICAgICBtU2luZTEucmVuZGVyKCZhdWRpb0J1ZmZlclswXSwgc2FtcGxlc1BlckZyYW1lLCBudW1GcmFtZXMpOworICAgICAgICAgICAgICAgIC8vIFJlbmRlciBzaW5lIHdhdmVzIHRvIHNlY29uZCBjaGFubmVsIGlmIHRoZXJlIGlzIG9uZS4KKyAgICAgICAgICAgICAgICBpZiAoc2FtcGxlc1BlckZyYW1lID4gMSkgeworICAgICAgICAgICAgICAgICAgICBtU2luZTIucmVuZGVyKCZhdWRpb0J1ZmZlclsxXSwgc2FtcGxlc1BlckZyYW1lLCBudW1GcmFtZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6IHsKKyAgICAgICAgICAgICAgICBmbG9hdCAqYXVkaW9CdWZmZXIgPSAoZmxvYXQgKikgYXVkaW9EYXRhOworICAgICAgICAgICAgICAgIC8vIFJlbmRlciBzaW5lIHdhdmVzIGFzIGZsb2F0cyB0byBmaXJzdCBjaGFubmVsLgorICAgICAgICAgICAgICAgIG1TaW5lMS5yZW5kZXIoJmF1ZGlvQnVmZmVyWzBdLCBzYW1wbGVzUGVyRnJhbWUsIG51bUZyYW1lcyk7CisgICAgICAgICAgICAgICAgLy8gUmVuZGVyIHNpbmUgd2F2ZXMgdG8gc2Vjb25kIGNoYW5uZWwgaWYgdGhlcmUgaXMgb25lLgorICAgICAgICAgICAgICAgIGlmIChzYW1wbGVzUGVyRnJhbWUgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgIG1TaW5lMi5yZW5kZXIoJmF1ZGlvQnVmZmVyWzFdLCBzYW1wbGVzUGVyRnJhbWUsIG51bUZyYW1lcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QOworICAgICAgICB9CisgICAgICAgIHJldHVybiBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX0NPTlRJTlVFOworICAgIH0KKworcHJpdmF0ZToKKyAgICBjb25zdCBBQXVkaW9BcmdzUGFyc2VyICAqbUFyZ1BhcnNlcjsKKyAgICBjb25zdCBpbnQgICAgICAgICAgICAgICAgbUluZGV4OworICAgIFNpbmVHZW5lcmF0b3IgICAgICAgICAgICBtU2luZTE7CisgICAgU2luZUdlbmVyYXRvciAgICAgICAgICAgIG1TaW5lMjsKK307CisKKy8vIENhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgZmlsbHMgdGhlIGF1ZGlvIG91dHB1dCBidWZmZXIuCithYXVkaW9fZGF0YV9jYWxsYmFja19yZXN1bHRfdCBBQXVkaW9Nb25rZXlEYXRhQ2FsbGJhY2soCisgICAgICAgIEFBdWRpb1N0cmVhbSAqc3RyZWFtLAorICAgICAgICB2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgdm9pZCAqYXVkaW9EYXRhLAorICAgICAgICBpbnQzMl90IG51bUZyYW1lcworKSB7CisgICAgLy8gc2hvdWxkIG5vdCBoYXBwZW4gYnV0IGp1c3QgaW4gY2FzZS4uLgorICAgIGlmICh1c2VyRGF0YSA9PSBudWxscHRyKSB7CisgICAgICAgIHByaW50ZigiRVJST1IgLSBBQXVkaW9Nb25rZXlEYXRhQ2FsbGJhY2sgbmVlZHMgdXNlckRhdGFcbiIpOworICAgICAgICByZXR1cm4gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QOworICAgIH0KKyAgICBBQXVkaW9Nb25rZXkgKm1vbmtleSA9IChBQXVkaW9Nb25rZXkgKikgdXNlckRhdGE7CisgICAgcmV0dXJuIG1vbmtleS0+cmVuZGVyQXVkaW8oc3RyZWFtLCBhdWRpb0RhdGEsIG51bUZyYW1lcyk7Cit9CisKKworc3RhdGljIHZvaWQgdXNhZ2UoKSB7CisgICAgQUF1ZGlvQXJnc1BhcnNlcjo6dXNhZ2UoKTsKKyAgICBwcmludGYoIiAgICAgIC1pe3NlZWR9ICBJbml0aWFsIHJhbmRvbSBzZWVkXG4iKTsKKyAgICBwcmludGYoIiAgICAgIC10e2NvdW50fSBudW1iZXIgb2YgbW9ua2V5cyBpbiB0aGUgVHJvb3BcbiIpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpIHsKKyAgICBBQXVkaW9BcmdzUGFyc2VyIGFyZ1BhcnNlcjsKKyAgICBzdGQ6OnZlY3RvcjxBQXVkaW9Nb25rZXk+IG1vbmtleXM7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdDsKKyAgICBpbnQgbnVtTW9ua2V5cyA9IDE7CisKKyAgICAvLyBNYWtlIHByaW50ZiBwcmludCBpbW1lZGlhdGVseSBzbyB0aGF0IGRlYnVnIGluZm8gaXMgbm90IHN0dWNrCisgICAgLy8gaW4gYSBidWZmZXIgaWYgd2UgaGFuZyBvciBjcmFzaC4KKyAgICBzZXR2YnVmKHN0ZG91dCwgbnVsbHB0ciwgX0lPTkJGLCAoc2l6ZV90KSAwKTsKKworICAgIHByaW50ZigiJXMgLSBNb25rZXlzXG4iLCBhcmd2WzBdKTsKKworICAgIGxvbmcgaW50IHNlZWQgPSAobG9uZyBpbnQpZ2V0TmFub3NlY29uZHMoKTsgIC8vIGRpZmZlcmVudCBldmVyeSB0aW1lIGJ5IGRlZmF1bHQKKworICAgIGZvciAoaW50IGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisgICAgICAgIGlmIChhcmdQYXJzZXIucGFyc2VBcmcoYXJnKSkgeworICAgICAgICAgICAgLy8gSGFuZGxlIG9wdGlvbnMgdGhhdCBhcmUgbm90IGhhbmRsZWQgYnkgdGhlIEFyZ1BhcnNlcgorICAgICAgICAgICAgaWYgKGFyZ1swXSA9PSAnLScpIHsKKyAgICAgICAgICAgICAgICBjaGFyIG9wdGlvbiA9IGFyZ1sxXTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wdGlvbikgeworICAgICAgICAgICAgICAgICAgICBjYXNlICdpJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlZWQgPSBhdG9sKCZhcmdbMl0pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3QnOgorICAgICAgICAgICAgICAgICAgICAgICAgbnVtTW9ua2V5cyA9IGF0b2koJmFyZ1syXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHVzYWdlKCk7CisgICAgICAgICAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgc3JhbmQ0OChzZWVkKTsKKyAgICBwcmludGYoInNlZWQgPSAlbGQsIG5leHRSYW5kb21Eb3VibGUoKSA9ICVmXG4iLCBzZWVkLCBuZXh0UmFuZG9tRG91YmxlKCkpOworCisgICAgZm9yIChpbnQgbSA9IDA7IG0gPCBudW1Nb25rZXlzOyBtKyspIHsKKyAgICAgICAgbW9ua2V5cy5lbXBsYWNlX2JhY2sobSwgJmFyZ1BhcnNlcik7CisgICAgfQorCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fTE9PUFM7IGkrKykgeworICAgICAgICAvLyBwaWNrIGEgcmFuZG9tIG1vbmtleSBhbmQgaW52b2tlIGl0CisgICAgICAgIGRvdWJsZSBkaWNlID0gbmV4dFJhbmRvbURvdWJsZSgpOworICAgICAgICBpbnQgbW9ua2V5SW5kZXggPSBmbG9vcihkaWNlICogbnVtTW9ua2V5cyk7CisgICAgICAgIHByaW50ZigiLS0tLS0tLS0tLS0gTW9ua2V5ICMlZFxuIiwgbW9ua2V5SW5kZXgpOworICAgICAgICByZXN1bHQgPSBtb25rZXlzW21vbmtleUluZGV4XS5pbnZva2UoKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKworICAgICAgICAvLyBzbGVlcCBzb21lIHJhbmRvbSB0aW1lCisgICAgICAgIGRpY2UgPSBuZXh0UmFuZG9tRG91YmxlKCk7CisgICAgICAgIGRpY2UgPSBkaWNlICogZGljZSAqIGRpY2U7IC8vIHNrZXcgdG93YXJkcyBzbWFsbGVyIGRlbGF5cworICAgICAgICBpbnQgbWljcm9zID0gKGludCkgKGRpY2UgKiBNQVhfTUlDUk9TX0RFTEFZKTsKKyAgICAgICAgdXNsZWVwKG1pY3Jvcyk7CisKKyAgICAgICAgLy8gVE9ETyBjb25zaWRlciBtYWtpbmcgdGhpcyBtdWx0aS10aHJlYWRlZCwgb25lIHRocmVhZCBwZXIgbW9ua2V5LCB0byBjYXRjaCBtb3JlIGJ1Z3MKKyAgICB9CisKKyAgICBwcmludGYoIlBBU1NcbiIpOworICAgIHJldHVybiBFWElUX1NVQ0NFU1M7CisKK2Vycm9yOgorICAgIHByaW50ZigiRkFJTCAtIEFBdWRpbyByZXN1bHQgPSAlZCA9ICVzXG4iLCByZXN1bHQsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOworICAgIHVzbGVlcCgxMDAwICogMTAwMCk7IC8vIGdpdmUgbWUgdGltZSB0byBzdG9wIHRoZSBsb2djYXQKKyAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9hdG9taWNfZmlmby5jcHAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9hdG9taWNfZmlmby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA4NTIxNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2F0b21pY19maWZvLmNwcApAQCAtMCwwICsxLDIyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJmaWZvL0ZpZm9CdWZmZXIuaCIKKyNpbmNsdWRlICJmaWZvL0ZpZm9Db250cm9sbGVyLmgiCisKK3VzaW5nIGFuZHJvaWQ6OmZpZm9fZnJhbWVzX3Q7Cit1c2luZyBhbmRyb2lkOjpGaWZvQ29udHJvbGxlcjsKK3VzaW5nIGFuZHJvaWQ6OkZpZm9CdWZmZXI7Cit1c2luZyBhbmRyb2lkOjpXcmFwcGluZ0J1ZmZlcjsKKworLy92b2lkIGZvbygpIHsKK1RFU1QodGVzdF9maWZpX2NvbnRyb2xsZXIsIGZpZm9faW5kaWNlcykgeworICAgIC8vIFZhbHVlcyBhcmUgYXJiaXRyYXJ5IHByaW1lcyBkZXNpZ25lZCB0byB0cmlnZ2VyIGVkZ2UgY2FzZXMuCisgICAgY29uc3RleHByIGludCBjYXBhY2l0eSA9IDgzOworICAgIGNvbnN0ZXhwciBpbnQgdGhyZXNob2xkID0gNDc7CisgICAgRmlmb0NvbnRyb2xsZXIgICBmaWZvQ29udHJvbGxlcihjYXBhY2l0eSwgdGhyZXNob2xkKTsKKyAgICBBU1NFUlRfRVEoY2FwYWNpdHksIGZpZm9Db250cm9sbGVyLmdldENhcGFjaXR5KCkpOworICAgIEFTU0VSVF9FUSh0aHJlc2hvbGQsIGZpZm9Db250cm9sbGVyLmdldFRocmVzaG9sZCgpKTsKKworICAgIEFTU0VSVF9FUSgwLCBmaWZvQ29udHJvbGxlci5nZXRSZWFkQ291bnRlcigpKTsKKyAgICBBU1NFUlRfRVEoMCwgZmlmb0NvbnRyb2xsZXIuZ2V0V3JpdGVDb3VudGVyKCkpOworICAgIEFTU0VSVF9FUSgwLCBmaWZvQ29udHJvbGxlci5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCkpOworICAgIEFTU0VSVF9FUSh0aHJlc2hvbGQsIGZpZm9Db250cm9sbGVyLmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCkpOworCisgICAgLy8gUHJldGVuZCB0byB3cml0ZSBzb21lIGRhdGEuCisgICAgY29uc3RleHByIGludCBhZHZhbmNlMSA9IDIzOworICAgIGZpZm9Db250cm9sbGVyLmFkdmFuY2VXcml0ZUluZGV4KGFkdmFuY2UxKTsKKyAgICBpbnQgYWR2YW5jZWQgPSBhZHZhbmNlMTsKKyAgICBBU1NFUlRfRVEoMCwgZmlmb0NvbnRyb2xsZXIuZ2V0UmVhZENvdW50ZXIoKSk7CisgICAgQVNTRVJUX0VRKDAsIGZpZm9Db250cm9sbGVyLmdldFJlYWRJbmRleCgpKTsKKyAgICBBU1NFUlRfRVEoYWR2YW5jZWQsIGZpZm9Db250cm9sbGVyLmdldFdyaXRlQ291bnRlcigpKTsKKyAgICBBU1NFUlRfRVEoYWR2YW5jZWQsIGZpZm9Db250cm9sbGVyLmdldFdyaXRlSW5kZXgoKSk7CisgICAgQVNTRVJUX0VRKGFkdmFuY2VkLCBmaWZvQ29udHJvbGxlci5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCkpOworICAgIEFTU0VSVF9FUSh0aHJlc2hvbGQgLSBhZHZhbmNlZCwgZmlmb0NvbnRyb2xsZXIuZ2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKSk7CisKKyAgICAvLyBQcmV0ZW5kIHRvIHJlYWQgdGhlIGRhdGEuCisgICAgZmlmb0NvbnRyb2xsZXIuYWR2YW5jZVJlYWRJbmRleChhZHZhbmNlMSk7CisgICAgQVNTRVJUX0VRKGFkdmFuY2VkLCBmaWZvQ29udHJvbGxlci5nZXRSZWFkQ291bnRlcigpKTsKKyAgICBBU1NFUlRfRVEoYWR2YW5jZWQsIGZpZm9Db250cm9sbGVyLmdldFJlYWRJbmRleCgpKTsKKyAgICBBU1NFUlRfRVEoYWR2YW5jZWQsIGZpZm9Db250cm9sbGVyLmdldFdyaXRlQ291bnRlcigpKTsKKyAgICBBU1NFUlRfRVEoYWR2YW5jZWQsIGZpZm9Db250cm9sbGVyLmdldFdyaXRlSW5kZXgoKSk7CisgICAgQVNTRVJUX0VRKDAsIGZpZm9Db250cm9sbGVyLmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKSk7CisgICAgQVNTRVJUX0VRKHRocmVzaG9sZCwgZmlmb0NvbnRyb2xsZXIuZ2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKSk7CisKKyAgICAvLyBXcml0ZSBwYXN0IGVuZCBvZiBidWZmZXIuCisgICAgY29uc3RleHByIGludCBhZHZhbmNlMiA9IDEzICsgY2FwYWNpdHkgLSBhZHZhbmNlMTsKKyAgICBmaWZvQ29udHJvbGxlci5hZHZhbmNlV3JpdGVJbmRleChhZHZhbmNlMik7CisgICAgYWR2YW5jZWQgKz0gYWR2YW5jZTI7CisgICAgQVNTRVJUX0VRKGFkdmFuY2UxLCBmaWZvQ29udHJvbGxlci5nZXRSZWFkQ291bnRlcigpKTsKKyAgICBBU1NFUlRfRVEoYWR2YW5jZTEsIGZpZm9Db250cm9sbGVyLmdldFJlYWRJbmRleCgpKTsKKyAgICBBU1NFUlRfRVEoYWR2YW5jZWQsIGZpZm9Db250cm9sbGVyLmdldFdyaXRlQ291bnRlcigpKTsKKyAgICBBU1NFUlRfRVEoYWR2YW5jZWQgLSBjYXBhY2l0eSwgZmlmb0NvbnRyb2xsZXIuZ2V0V3JpdGVJbmRleCgpKTsKKyAgICBBU1NFUlRfRVEoYWR2YW5jZTIsIGZpZm9Db250cm9sbGVyLmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKSk7CisgICAgQVNTRVJUX0VRKHRocmVzaG9sZCAtIGFkdmFuY2UyLCBmaWZvQ29udHJvbGxlci5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpKTsKK30KKworLy8gVE9ETyBjb25zaWRlciB1c2luZyBhIHRlbXBsYXRlIGZvciBvdGhlciBkYXRhIHR5cGVzLgorY2xhc3MgVGVzdEZpZm9CdWZmZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IFRlc3RGaWZvQnVmZmVyKGZpZm9fZnJhbWVzX3QgY2FwYWNpdHksIGZpZm9fZnJhbWVzX3QgdGhyZXNob2xkID0gMCkKKyAgICAgICAgOiBtRmlmb0J1ZmZlcihzaXplb2YoaW50MTZfdCksIGNhcGFjaXR5KSB7CisgICAgICAgIC8vIEZvciByZWFkaW5nIGFuZCB3cml0aW5nLgorICAgICAgICBtRGF0YSA9IG5ldyBpbnQxNl90W2NhcGFjaXR5XTsKKyAgICAgICAgaWYgKHRocmVzaG9sZCA8PSAwKSB7CisgICAgICAgICAgICB0aHJlc2hvbGQgPSBjYXBhY2l0eTsKKyAgICAgICAgfQorICAgICAgICBtRmlmb0J1ZmZlci5zZXRUaHJlc2hvbGQodGhyZXNob2xkKTsKKyAgICAgICAgbVRocmVzaG9sZCA9IHRocmVzaG9sZDsKKyAgICB9CisKKyAgICB2b2lkIGNoZWNrTWlzYygpIHsKKyAgICAgICAgQVNTRVJUX0VRKChpbnQzMl90KSgyICogc2l6ZW9mKGludDE2X3QpKSwgbUZpZm9CdWZmZXIuY29udmVydEZyYW1lc1RvQnl0ZXMoMikpOworICAgICAgICBBU1NFUlRfRVEobVRocmVzaG9sZCwgbUZpZm9CdWZmZXIuZ2V0VGhyZXNob2xkKCkpOworICAgIH0KKworICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBhdmFpbGFibGUgZnJhbWVzIGluIGVhY2ggcGFydCBhZGQgdXAgY29ycmVjdGx5LgorICAgIHZvaWQgY2hlY2tXcmFwcGluZ0J1ZmZlcigpIHsKKyAgICAgICAgV3JhcHBpbmdCdWZmZXIgd3JhcHBpbmdCdWZmZXI7CisgICAgICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzQXZhaWxhYmxlID0KKyAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKTsKKyAgICAgICAgZmlmb19mcmFtZXNfdCB3cmFwQXZhaWxhYmxlID0gbUZpZm9CdWZmZXIuZ2V0RW1wdHlSb29tQXZhaWxhYmxlKCZ3cmFwcGluZ0J1ZmZlcik7CisgICAgICAgIEVYUEVDVF9FUShmcmFtZXNBdmFpbGFibGUsIHdyYXBBdmFpbGFibGUpOworICAgICAgICBmaWZvX2ZyYW1lc190IGJvdGhBdmFpbGFibGUgPSB3cmFwcGluZ0J1ZmZlci5udW1GcmFtZXNbMF0gKyB3cmFwcGluZ0J1ZmZlci5udW1GcmFtZXNbMV07CisgICAgICAgIEVYUEVDVF9FUShmcmFtZXNBdmFpbGFibGUsIGJvdGhBdmFpbGFibGUpOworCisgICAgICAgIGZyYW1lc0F2YWlsYWJsZSA9CisgICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKTsKKyAgICAgICAgd3JhcEF2YWlsYWJsZSA9IG1GaWZvQnVmZmVyLmdldEZ1bGxEYXRhQXZhaWxhYmxlKCZ3cmFwcGluZ0J1ZmZlcik7CisgICAgICAgIEVYUEVDVF9FUShmcmFtZXNBdmFpbGFibGUsIHdyYXBBdmFpbGFibGUpOworICAgICAgICBib3RoQXZhaWxhYmxlID0gd3JhcHBpbmdCdWZmZXIubnVtRnJhbWVzWzBdICsgd3JhcHBpbmdCdWZmZXIubnVtRnJhbWVzWzFdOworICAgICAgICBFWFBFQ1RfRVEoZnJhbWVzQXZhaWxhYmxlLCBib3RoQXZhaWxhYmxlKTsKKyAgICB9CisKKyAgICAvLyBXcml0ZSBkYXRhIGJ1dCBkbyBub3Qgb3ZlcmZsb3cuCisgICAgdm9pZCB3cml0ZURhdGEoZmlmb19mcmFtZXNfdCBudW1GcmFtZXMpIHsKKyAgICAgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNBdmFpbGFibGUgPQorICAgICAgICAgICAgICAgIG1GaWZvQnVmZmVyLmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpOworICAgICAgICBmaWZvX2ZyYW1lc190IGZyYW1lc1RvV3JpdGUgPSBzdGQ6Om1pbihmcmFtZXNBdmFpbGFibGUsIG51bUZyYW1lcyk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVzVG9Xcml0ZTsgaSsrKSB7CisgICAgICAgICAgICBtRGF0YVtpXSA9IG1OZXh0V3JpdGVJbmRleCsrOworICAgICAgICB9CisgICAgICAgIGZpZm9fZnJhbWVzX3QgYWN0dWFsID0gbUZpZm9CdWZmZXIud3JpdGUobURhdGEsIGZyYW1lc1RvV3JpdGUpOworICAgICAgICBBU1NFUlRfRVEoZnJhbWVzVG9Xcml0ZSwgYWN0dWFsKTsKKyAgICB9CisKKyAgICAvLyBSZWFkIGRhdGEgYnV0IGRvIG5vdCB1bmRlcmZsb3cuCisgICAgdm9pZCB2ZXJpZnlEYXRhKGZpZm9fZnJhbWVzX3QgbnVtRnJhbWVzKSB7CisgICAgICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzQXZhaWxhYmxlID0KKyAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOworICAgICAgICBmaWZvX2ZyYW1lc190IGZyYW1lc1RvUmVhZCA9IHN0ZDo6bWluKGZyYW1lc0F2YWlsYWJsZSwgbnVtRnJhbWVzKTsKKyAgICAgICAgZmlmb19mcmFtZXNfdCBhY3R1YWwgPSBtRmlmb0J1ZmZlci5yZWFkKG1EYXRhLCBmcmFtZXNUb1JlYWQpOworICAgICAgICBBU1NFUlRfRVEoZnJhbWVzVG9SZWFkLCBhY3R1YWwpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lc1RvUmVhZDsgaSsrKSB7CisgICAgICAgICAgICBBU1NFUlRfRVEobU5leHRWZXJpZnlJbmRleCsrLCBtRGF0YVtpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBXcmFwIGFyb3VuZCB0aGUgZW5kIG9mIHRoZSBidWZmZXIuCisgICAgdm9pZCBjaGVja1dyYXBwaW5nV3JpdGVSZWFkKCkgeworICAgICAgICBjb25zdGV4cHIgaW50IGZyYW1lczEgPSA0MzsKKyAgICAgICAgY29uc3RleHByIGludCBmcmFtZXMyID0gMTU7CisKKyAgICAgICAgd3JpdGVEYXRhKGZyYW1lczEpOworICAgICAgICBjaGVja1dyYXBwaW5nQnVmZmVyKCk7CisgICAgICAgIHZlcmlmeURhdGEoZnJhbWVzMSk7CisgICAgICAgIGNoZWNrV3JhcHBpbmdCdWZmZXIoKTsKKworICAgICAgICB3cml0ZURhdGEoZnJhbWVzMik7CisgICAgICAgIGNoZWNrV3JhcHBpbmdCdWZmZXIoKTsKKyAgICAgICAgdmVyaWZ5RGF0YShmcmFtZXMyKTsKKyAgICAgICAgY2hlY2tXcmFwcGluZ0J1ZmZlcigpOworICAgIH0KKworICAgIC8vIFdyaXRlIGFuZCBSZWFkIGEgc3BlY2lmaWMgYW1vdW50IG9mIGRhdGEuCisgICAgdm9pZCBjaGVja1dyaXRlUmVhZCgpIHsKKyAgICAgICAgY29uc3QgZmlmb19mcmFtZXNfdCBjYXBhY2l0eSA9IG1GaWZvQnVmZmVyLmdldEJ1ZmZlckNhcGFjaXR5SW5GcmFtZXMoKTsKKyAgICAgICAgLy8gV3JhcCBhcm91bmQgd2l0aCB0aGUgc21hbGxlciByZWdpb24gaW4gdGhlIHNlY29uZCBoYWxmLgorICAgICAgICBjb25zdCBpbnQgZnJhbWVzMSA9IGNhcGFjaXR5IC0gNDsKKyAgICAgICAgY29uc3QgaW50IGZyYW1lczIgPSA3OyAvLyBhcmJpdHJhcnksIHNtYWxsCisgICAgICAgIHdyaXRlRGF0YShmcmFtZXMxKTsKKyAgICAgICAgdmVyaWZ5RGF0YShmcmFtZXMxKTsKKyAgICAgICAgd3JpdGVEYXRhKGZyYW1lczIpOworICAgICAgICB2ZXJpZnlEYXRhKGZyYW1lczIpOworICAgIH0KKworICAgIC8vIFdyaXRlIGFuZCBSZWFkIGEgc3BlY2lmaWMgYW1vdW50IG9mIGRhdGEuCisgICAgdm9pZCBjaGVja1dyaXRlUmVhZFNtYWxsTGFyZ2UoKSB7CisgICAgICAgIGNvbnN0IGZpZm9fZnJhbWVzX3QgY2FwYWNpdHkgPSBtRmlmb0J1ZmZlci5nZXRCdWZmZXJDYXBhY2l0eUluRnJhbWVzKCk7CisgICAgICAgIC8vIFdyYXAgYXJvdW5kIHdpdGggdGhlIGxhcmdlciByZWdpb24gaW4gdGhlIHNlY29uZCBoYWxmLgorICAgICAgICBjb25zdCBpbnQgZnJhbWVzMSA9IGNhcGFjaXR5IC0gNDsKKyAgICAgICAgY29uc3QgaW50IGZyYW1lczIgPSBjYXBhY2l0eSAtIDk7IC8vIGFyYml0cmFyeSwgbGFyZ2UKKyAgICAgICAgd3JpdGVEYXRhKGZyYW1lczEpOworICAgICAgICB2ZXJpZnlEYXRhKGZyYW1lczEpOworICAgICAgICB3cml0ZURhdGEoZnJhbWVzMik7CisgICAgICAgIHZlcmlmeURhdGEoZnJhbWVzMik7CisgICAgfQorCisgICAgLy8gUmFuZG9tbHkgcmVhZCBvciB3cml0ZSB1cCB0byB0aGUgbWF4aW11bSBhbW91bnQgb2YgZGF0YS4KKyAgICB2b2lkIGNoZWNrUmFuZG9tV3JpdGVSZWFkKCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKKyAgICAgICAgICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzRW1wdHkgPQorICAgICAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKTsKKyAgICAgICAgICAgIGZpZm9fZnJhbWVzX3QgbnVtRnJhbWVzID0gKGZpZm9fZnJhbWVzX3QpKGRyYW5kNDgoKSAqIGZyYW1lc0VtcHR5KTsKKyAgICAgICAgICAgIHdyaXRlRGF0YShudW1GcmFtZXMpOworCisgICAgICAgICAgICBmaWZvX2ZyYW1lc190IGZyYW1lc0Z1bGwgPQorICAgICAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOworICAgICAgICAgICAgbnVtRnJhbWVzID0gKGZpZm9fZnJhbWVzX3QpKGRyYW5kNDgoKSAqIGZyYW1lc0Z1bGwpOworICAgICAgICAgICAgdmVyaWZ5RGF0YShudW1GcmFtZXMpOworICAgICAgICB9CisgICAgfQorCisgICAgRmlmb0J1ZmZlciAgICAgbUZpZm9CdWZmZXI7CisgICAgaW50MTZfdCAgICAgICAqbURhdGE7CisgICAgZmlmb19mcmFtZXNfdCAgbU5leHRXcml0ZUluZGV4ID0gMDsKKyAgICBmaWZvX2ZyYW1lc190ICBtTmV4dFZlcmlmeUluZGV4ID0gMDsKKyAgICBmaWZvX2ZyYW1lc190ICBtVGhyZXNob2xkOworfTsKKworVEVTVCh0ZXN0X2ZpZm9fYnVmZmVyLCBmaWZvX3JlYWRfd3JpdGUpIHsKKyAgICBjb25zdGV4cHIgaW50IGNhcGFjaXR5ID0gNTE7IC8vIGFyYml0cmFyeQorICAgIFRlc3RGaWZvQnVmZmVyIHRlc3RlcihjYXBhY2l0eSk7CisgICAgdGVzdGVyLmNoZWNrTWlzYygpOworICAgIHRlc3Rlci5jaGVja1dyaXRlUmVhZCgpOworfQorCitURVNUKHRlc3RfZmlmb19idWZmZXIsIGZpZm9fd3JhcHBpbmdfcmVhZF93cml0ZSkgeworICAgIGNvbnN0ZXhwciBpbnQgY2FwYWNpdHkgPSA1OTsgLy8gYXJiaXRyYXJ5LCBhIGxpdHRsZSBiaWdnZXIgdGhpcyB0aW1lCisgICAgVGVzdEZpZm9CdWZmZXIgdGVzdGVyKGNhcGFjaXR5KTsKKyAgICB0ZXN0ZXIuY2hlY2tXcmFwcGluZ1dyaXRlUmVhZCgpOworfQorCitURVNUKHRlc3RfZmlmb19idWZmZXIsIGZpZm9fcmVhZF93cml0ZV9zbWFsbF9sYXJnZSkgeworICAgIGNvbnN0ZXhwciBpbnQgY2FwYWNpdHkgPSA1MTsgLy8gYXJiaXRyYXJ5CisgICAgVGVzdEZpZm9CdWZmZXIgdGVzdGVyKGNhcGFjaXR5KTsKKyAgICB0ZXN0ZXIuY2hlY2tXcml0ZVJlYWRTbWFsbExhcmdlKCk7Cit9CisKK1RFU1QodGVzdF9maWZvX2J1ZmZlciwgZmlmb19yYW5kb21fcmVhZF93cml0ZSkgeworICAgIGNvbnN0ZXhwciBpbnQgY2FwYWNpdHkgPSA1MTsgLy8gYXJiaXRyYXJ5CisgICAgVGVzdEZpZm9CdWZmZXIgdGVzdGVyKGNhcGFjaXR5KTsKKyAgICB0ZXN0ZXIuY2hlY2tSYW5kb21Xcml0ZVJlYWQoKTsKK30KKworVEVTVCh0ZXN0X2ZpZm9fYnVmZmVyLCBmaWZvX3JhbmRvbV90aHJlc2hvbGQpIHsKKyAgICBjb25zdGV4cHIgaW50IGNhcGFjaXR5ID0gNjc7IC8vIGFyYml0cmFyeQorICAgIGNvbnN0ZXhwciBpbnQgdGhyZXNob2xkID0gMzc7IC8vIGFyYml0cmFyeQorICAgIFRlc3RGaWZvQnVmZmVyIHRlc3RlcihjYXBhY2l0eSwgdGhyZXNob2xkKTsKKyAgICB0ZXN0ZXIuY2hlY2tSYW5kb21Xcml0ZVJlYWQoKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2F0dHJpYnV0ZXMuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYXR0cmlidXRlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAxYWYyNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2F0dHJpYnV0ZXMuY3BwCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gVGVzdCBBQXVkaW8gYXR0cmlidXRlcyBzdWNoIGFzIFVzYWdlLCBDb250ZW50VHlwZSBhbmQgSW5wdXRQcmVzZXQuCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK2NvbnN0ZXhwciBpbnQ2NF90IGtOYW5vc1BlclNlY29uZCA9IDEwMDAwMDAwMDA7Citjb25zdGV4cHIgaW50IGtOdW1GcmFtZXMgPSAyNTY7Citjb25zdGV4cHIgaW50IGtDaGFubmVsQ291bnQgPSAyOworCitjb25zdGV4cHIgaW50MzJfdCBET05UX1NFVCA9IC0xMDAwOworCitzdGF0aWMgdm9pZCBjaGVja0F0dHJpYnV0ZXMoYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBwZXJmTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fdXNhZ2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fY29udGVudF90eXBlX3QgY29udGVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX2lucHV0X3ByZXNldF90IHByZXNldCA9IERPTlRfU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24gPSBBQVVESU9fRElSRUNUSU9OX09VVFBVVCkgeworCisgICAgZmxvYXQgKmJ1ZmZlciA9IG5ldyBmbG9hdFtrTnVtRnJhbWVzICoga0NoYW5uZWxDb3VudF07CisKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyICphYXVkaW9CdWlsZGVyID0gbnVsbHB0cjsKKyAgICBBQXVkaW9TdHJlYW0gKmFhdWRpb1N0cmVhbSA9IG51bGxwdHI7CisKKyAgICAvLyBVc2UgYW4gQUF1ZGlvU3RyZWFtQnVpbGRlciB0byBjb250YWluIHJlcXVlc3RlZCBwYXJhbWV0ZXJzLgorICAgIEFTU0VSVF9FUShBQVVESU9fT0ssIEFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyKCZhYXVkaW9CdWlsZGVyKSk7CisKKyAgICAvLyBSZXF1ZXN0IHN0cmVhbSBwcm9wZXJ0aWVzLgorICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0UGVyZm9ybWFuY2VNb2RlKGFhdWRpb0J1aWxkZXIsIHBlcmZNb2RlKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldERpcmVjdGlvbihhYXVkaW9CdWlsZGVyLCBkaXJlY3Rpb24pOworCisgICAgLy8gU2V0IHRoZSBhdHRyaWJ1dGUgaW4gdGhlIGJ1aWxkZXIuCisgICAgaWYgKHVzYWdlICE9IERPTlRfU0VUKSB7CisgICAgICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0VXNhZ2UoYWF1ZGlvQnVpbGRlciwgdXNhZ2UpOworICAgIH0KKyAgICBpZiAoY29udGVudFR5cGUgIT0gRE9OVF9TRVQpIHsKKyAgICAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRDb250ZW50VHlwZShhYXVkaW9CdWlsZGVyLCBjb250ZW50VHlwZSk7CisgICAgfQorICAgIGlmIChwcmVzZXQgIT0gRE9OVF9TRVQpIHsKKyAgICAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRJbnB1dFByZXNldChhYXVkaW9CdWlsZGVyLCBwcmVzZXQpOworICAgIH0KKworICAgIC8vIENyZWF0ZSBhbiBBQXVkaW9TdHJlYW0gdXNpbmcgdGhlIEJ1aWxkZXIuCisgICAgQVNTRVJUX0VRKEFBVURJT19PSywgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKGFhdWRpb0J1aWxkZXIsICZhYXVkaW9TdHJlYW0pKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX2RlbGV0ZShhYXVkaW9CdWlsZGVyKTsKKworICAgIC8vIE1ha2Ugc3VyZSB3ZSBnZXQgdGhlIHNhbWUgYXR0cmlidXRlcyBiYWNrIGZyb20gdGhlIHN0cmVhbS4KKyAgICBhYXVkaW9fdXNhZ2VfdCBleHBlY3RlZFVzYWdlID0KKyAgICAgICAgICAgICh1c2FnZSA9PSBET05UX1NFVCB8fCB1c2FnZSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpCisgICAgICAgICAgICA/IEFBVURJT19VU0FHRV9NRURJQSAvLyBkZWZhdWx0CisgICAgICAgICAgICA6IHVzYWdlOworICAgIEVYUEVDVF9FUShleHBlY3RlZFVzYWdlLCBBQXVkaW9TdHJlYW1fZ2V0VXNhZ2UoYWF1ZGlvU3RyZWFtKSk7CisKKyAgICBhYXVkaW9fY29udGVudF90eXBlX3QgZXhwZWN0ZWRDb250ZW50VHlwZSA9CisgICAgICAgICAgICAoY29udGVudFR5cGUgPT0gRE9OVF9TRVQgfHwgY29udGVudFR5cGUgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKQorICAgICAgICAgICAgPyBBQVVESU9fQ09OVEVOVF9UWVBFX01VU0lDIC8vIGRlZmF1bHQKKyAgICAgICAgICAgIDogY29udGVudFR5cGU7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkQ29udGVudFR5cGUsIEFBdWRpb1N0cmVhbV9nZXRDb250ZW50VHlwZShhYXVkaW9TdHJlYW0pKTsKKworICAgIGFhdWRpb19pbnB1dF9wcmVzZXRfdCBleHBlY3RlZFByZXNldCA9CisgICAgICAgICAgICAocHJlc2V0ID09IERPTlRfU0VUIHx8IHByZXNldCA9PSBBQVVESU9fVU5TUEVDSUZJRUQpCisgICAgICAgICAgICA/IEFBVURJT19JTlBVVF9QUkVTRVRfVk9JQ0VfUkVDT0dOSVRJT04gLy8gZGVmYXVsdAorICAgICAgICAgICAgOiBwcmVzZXQ7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkUHJlc2V0LCBBQXVkaW9TdHJlYW1fZ2V0SW5wdXRQcmVzZXQoYWF1ZGlvU3RyZWFtKSk7CisKKyAgICBFWFBFQ1RfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KGFhdWRpb1N0cmVhbSkpOworCisgICAgaWYgKGRpcmVjdGlvbiA9PSBBQVVESU9fRElSRUNUSU9OX0lOUFVUKSB7CisgICAgICAgIEVYUEVDVF9FUShrTnVtRnJhbWVzLAorICAgICAgICAgICAgICAgICAgQUF1ZGlvU3RyZWFtX3JlYWQoYWF1ZGlvU3RyZWFtLCBidWZmZXIsIGtOdW1GcmFtZXMsIGtOYW5vc1BlclNlY29uZCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIEVYUEVDVF9FUShrTnVtRnJhbWVzLAorICAgICAgICAgICAgICAgICAgQUF1ZGlvU3RyZWFtX3dyaXRlKGFhdWRpb1N0cmVhbSwgYnVmZmVyLCBrTnVtRnJhbWVzLCBrTmFub3NQZXJTZWNvbmQpKTsKKyAgICB9CisKKyAgICBFWFBFQ1RfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0b3AoYWF1ZGlvU3RyZWFtKSk7CisKKyAgICBFWFBFQ1RfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1fY2xvc2UoYWF1ZGlvU3RyZWFtKSk7CisgICAgZGVsZXRlW10gYnVmZmVyOworfQorCitzdGF0aWMgY29uc3QgYWF1ZGlvX3VzYWdlX3Qgc1VzYWdlc1tdID0geworICAgIERPTlRfU0VULAorICAgIEFBVURJT19VTlNQRUNJRklFRCwKKyAgICBBQVVESU9fVVNBR0VfTUVESUEsCisgICAgQUFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT04sCisgICAgQUFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORywKKyAgICBBQVVESU9fVVNBR0VfQUxBUk0sCisgICAgQUFVRElPX1VTQUdFX05PVElGSUNBVElPTiwKKyAgICBBQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1JJTkdUT05FLAorICAgIEFBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQsCisgICAgQUFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWSwKKyAgICBBQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFLAorICAgIEFBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTiwKKyAgICBBQVVESU9fVVNBR0VfR0FNRSwKKyAgICBBQVVESU9fVVNBR0VfQVNTSVNUQU5UCit9OworCitzdGF0aWMgY29uc3QgYWF1ZGlvX2NvbnRlbnRfdHlwZV90IHNDb250ZW50eXBlc1tdID0geworICAgIERPTlRfU0VULAorICAgIEFBVURJT19VTlNQRUNJRklFRCwKKyAgICBBQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSCwKKyAgICBBQVVESU9fQ09OVEVOVF9UWVBFX01VU0lDLAorICAgIEFBVURJT19DT05URU5UX1RZUEVfTU9WSUUsCisgICAgQUFVRElPX0NPTlRFTlRfVFlQRV9TT05JRklDQVRJT04KK307CisKK3N0YXRpYyBjb25zdCBhYXVkaW9faW5wdXRfcHJlc2V0X3Qgc0lucHV0UHJlc2V0c1tdID0geworICAgIERPTlRfU0VULAorICAgIEFBVURJT19VTlNQRUNJRklFRCwKKyAgICBBQVVESU9fSU5QVVRfUFJFU0VUX0dFTkVSSUMsCisgICAgQUFVRElPX0lOUFVUX1BSRVNFVF9DQU1DT1JERVIsCisgICAgQUFVRElPX0lOUFVUX1BSRVNFVF9WT0lDRV9SRUNPR05JVElPTiwKKyAgICBBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX0NPTU1VTklDQVRJT04sCisgICAgQUFVRElPX0lOUFVUX1BSRVNFVF9VTlBST0NFU1NFRCwKK307CisKK3N0YXRpYyB2b2lkIGNoZWNrQXR0cmlidXRlc1VzYWdlKGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZk1vZGUpIHsKKyAgICBmb3IgKGFhdWRpb191c2FnZV90IHVzYWdlIDogc1VzYWdlcykgeworICAgICAgICBjaGVja0F0dHJpYnV0ZXMocGVyZk1vZGUsIHVzYWdlLCBET05UX1NFVCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjaGVja0F0dHJpYnV0ZXNDb250ZW50VHlwZShhYXVkaW9faW5wdXRfcHJlc2V0X3QgcGVyZk1vZGUpIHsKKyAgICBmb3IgKGFhdWRpb19jb250ZW50X3R5cGVfdCBjb250ZW50VHlwZSA6IHNDb250ZW50eXBlcykgeworICAgICAgICBjaGVja0F0dHJpYnV0ZXMocGVyZk1vZGUsIERPTlRfU0VULCBjb250ZW50VHlwZSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjaGVja0F0dHJpYnV0ZXNJbnB1dFByZXNldChhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IHBlcmZNb2RlKSB7CisgICAgZm9yIChhYXVkaW9faW5wdXRfcHJlc2V0X3QgaW5wdXRQcmVzZXQgOiBzSW5wdXRQcmVzZXRzKSB7CisgICAgICAgIGNoZWNrQXR0cmlidXRlcyhwZXJmTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERPTlRfU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgRE9OVF9TRVQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFByZXNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19ESVJFQ1RJT05fSU5QVVQpOworICAgIH0KK30KKworVEVTVCh0ZXN0X2F0dHJpYnV0ZXMsIGFhdWRpb191c2FnZV9wZXJmbm9uZSkgeworICAgIGNoZWNrQXR0cmlidXRlc1VzYWdlKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUpOworfQorCitURVNUKHRlc3RfYXR0cmlidXRlcywgYWF1ZGlvX2NvbnRlbnRfdHlwZV9wZXJmbm9uZSkgeworICAgIGNoZWNrQXR0cmlidXRlc0NvbnRlbnRUeXBlKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUpOworfQorCitURVNUKHRlc3RfYXR0cmlidXRlcywgYWF1ZGlvX2lucHV0X3ByZXNldF9wZXJmbm9uZSkgeworICAgIGNoZWNrQXR0cmlidXRlc0lucHV0UHJlc2V0KEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUpOworfQorCitURVNUKHRlc3RfYXR0cmlidXRlcywgYWF1ZGlvX3VzYWdlX2xvd2xhdCkgeworICAgIGNoZWNrQXR0cmlidXRlc1VzYWdlKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZKTsKK30KKworVEVTVCh0ZXN0X2F0dHJpYnV0ZXMsIGFhdWRpb19jb250ZW50X3R5cGVfbG93bGF0KSB7CisgICAgY2hlY2tBdHRyaWJ1dGVzQ29udGVudFR5cGUoQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1kpOworfQorCitURVNUKHRlc3RfYXR0cmlidXRlcywgYWF1ZGlvX2lucHV0X3ByZXNldF9sb3dsYXQpIHsKKyAgICBjaGVja0F0dHJpYnV0ZXNJbnB1dFByZXNldChBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9iYWRfZGlzY29ubmVjdC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9iYWRfZGlzY29ubmVjdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM1OTkwZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2JhZF9kaXNjb25uZWN0LmNwcApAQCAtMCwwICsxLDE2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogSGFuZGxlIGEgRElTQ09OTkVDVCBieSBvbmx5IG9wZW5pbmcgYW5kIHN0YXJ0aW5nIGEgbmV3IHN0cmVhbQorICogd2l0aG91dCBzdG9wcGluZyBhbmQgY2xvc2luZyB0aGUgb2xkIG9uZS4KKyAqIFRoaXMgY2F1c2VkIHRoZSBuZXcgc3RyZWFtIHRvIHVzZSB0aGUgb2xkIGRpc2Nvbm5lY3RlZCBkZXZpY2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dGhyZWFkPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgorCisjZGVmaW5lIERFRkFVTFRfVElNRU9VVF9OQU5PUyAgKChpbnQ2NF90KTEwMDAwMDAwMDApCisKK3N0YXRpYyB2b2lkIHNfbXlFcnJvckNhbGxiYWNrUHJvYygKKyAgICAgICAgQUF1ZGlvU3RyZWFtICpzdHJlYW0sCisgICAgICAgIHZvaWQgKnVzZXJEYXRhLAorICAgICAgICBhYXVkaW9fcmVzdWx0X3QgZXJyb3IpOworCitzdHJ1Y3QgQXVkaW9FbmdpbmUgeworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXIgKmJ1aWxkZXIgPSBudWxscHRyOworICAgIEFBdWRpb1N0cmVhbSAqc3RyZWFtID0gbnVsbHB0cjsKKyAgICBzdGQ6OnRocmVhZCAqdGhyZWFkID0gbnVsbHB0cjsKKyAgICBpbnQ2NF90IGZyYW1lc1JlYWQgPSAwOworfTsKKworQXVkaW9FbmdpbmUgc19BdWRpb0VuZ2luZTsKKworLy8gQ2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBmaWxscyB0aGUgYXVkaW8gb3V0cHV0IGJ1ZmZlci4KK3N0YXRpYyBhYXVkaW9fZGF0YV9jYWxsYmFja19yZXN1bHRfdCBzX215RGF0YUNhbGxiYWNrUHJvYygKKyAgICAgICAgQUF1ZGlvU3RyZWFtICpzdHJlYW0sCisgICAgICAgIHZvaWQgKnVzZXJEYXRhLAorICAgICAgICB2b2lkICphdWRpb0RhdGEsCisgICAgICAgIGludDMyX3QgbnVtRnJhbWVzCispIHsKKyAgICAodm9pZCkgdXNlckRhdGE7CisgICAgKHZvaWQpIGF1ZGlvRGF0YTsKKyAgICAodm9pZCkgbnVtRnJhbWVzOworICAgIHNfQXVkaW9FbmdpbmUuZnJhbWVzUmVhZCA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKHN0cmVhbSk7CisgICAgcmV0dXJuIEFBVURJT19DQUxMQkFDS19SRVNVTFRfQ09OVElOVUU7Cit9CisKK3N0YXRpYyBhYXVkaW9fcmVzdWx0X3Qgc19TdGFydEF1ZGlvKCkgeworICAgIGludDMyX3QgZnJhbWVzUGVyQnVyc3QgPSAwOworICAgIGludDMyX3QgZGV2aWNlSWQgPSAwOworCisgICAgLy8gVXNlIGFuIEFBdWRpb1N0cmVhbUJ1aWxkZXIgdG8gY29udGFpbiByZXF1ZXN0ZWQgcGFyYW1ldGVycy4KKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIoJnNfQXVkaW9FbmdpbmUuYnVpbGRlcik7CisgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgcHJpbnRmKCJBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlciByZXR1cm5lZCAlcyIsCisgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvLyBSZXF1ZXN0IHN0cmVhbSBwcm9wZXJ0aWVzLgorICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0Rm9ybWF0KHNfQXVkaW9FbmdpbmUuYnVpbGRlciwgQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpOworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0UGVyZm9ybWFuY2VNb2RlKHNfQXVkaW9FbmdpbmUuYnVpbGRlciwgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1kpOworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RGF0YUNhbGxiYWNrKHNfQXVkaW9FbmdpbmUuYnVpbGRlciwgc19teURhdGFDYWxsYmFja1Byb2MsIG51bGxwdHIpOworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RXJyb3JDYWxsYmFjayhzX0F1ZGlvRW5naW5lLmJ1aWxkZXIsIHNfbXlFcnJvckNhbGxiYWNrUHJvYywgbnVsbHB0cik7CisKKyAgICAvLyBDcmVhdGUgYW4gQUF1ZGlvU3RyZWFtIHVzaW5nIHRoZSBCdWlsZGVyLgorICAgIHJlc3VsdCA9IEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbShzX0F1ZGlvRW5naW5lLmJ1aWxkZXIsICZzX0F1ZGlvRW5naW5lLnN0cmVhbSk7CisgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgcHJpbnRmKCJBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0gcmV0dXJuZWQgJXMiLAorICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydChzX0F1ZGlvRW5naW5lLnN0cmVhbSk7CisgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgcHJpbnRmKCJBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0IHJldHVybmVkICVzIiwKKyAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOworICAgIH0KKworICAgIC8vIENoZWNrIHRvIHNlZSB3aGF0IGtpbmQgb2Ygc3RyZWFtIHdlIGFjdHVhbGx5IGdvdC4KKyAgICBkZXZpY2VJZCA9IEFBdWRpb1N0cmVhbV9nZXREZXZpY2VJZChzX0F1ZGlvRW5naW5lLnN0cmVhbSk7CisgICAgZnJhbWVzUGVyQnVyc3QgPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUGVyQnVyc3Qoc19BdWRpb0VuZ2luZS5zdHJlYW0pOworCisgICAgcHJpbnRmKCItLS0tLS0tLSBzdGFydGVkOiBkZXZpY2VJZCA9ICUzZCwgZnJhbWVzUGVyQnVyc3QgPSAlM2RcbiIsIGRldmljZUlkLCBmcmFtZXNQZXJCdXJzdCk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgYWF1ZGlvX3Jlc3VsdF90IHNfU3RvcEF1ZGlvKCkgeworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CisgICAgaWYgKHNfQXVkaW9FbmdpbmUuc3RyZWFtICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdG9wKHNfQXVkaW9FbmdpbmUuc3RyZWFtKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgIHByaW50ZigiQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdG9wIHJldHVybmVkICVzXG4iLAorICAgICAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOworICAgICAgICB9CisgICAgICAgIHJlc3VsdCA9IEFBdWRpb1N0cmVhbV9jbG9zZShzX0F1ZGlvRW5naW5lLnN0cmVhbSk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICBwcmludGYoIkFBdWRpb1N0cmVhbV9jbG9zZSByZXR1cm5lZCAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKKyAgICAgICAgfQorICAgICAgICBzX0F1ZGlvRW5naW5lLnN0cmVhbSA9IG51bGxwdHI7CisgICAgICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfZGVsZXRlKHNfQXVkaW9FbmdpbmUuYnVpbGRlcik7CisgICAgICAgIHNfQXVkaW9FbmdpbmUuYnVpbGRlciA9IG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIHNfU3RhcnRUaHJlYWRQcm9jKCkgeworICAgIC8vIEEgZ29vZCBhcHAgd291bGQgY2FsbCBzX1N0b3BBdWRpbyBoZXJlISBUaGlzIHRlc3Qgc2ltdWxhdGVzIGEgYmFkIGFwcC4KKyAgICBzX1N0YXJ0QXVkaW8oKTsKKyAgICBzX0F1ZGlvRW5naW5lLnRocmVhZCA9IG51bGxwdHI7Cit9CisKK3N0YXRpYyB2b2lkIHNfbXlFcnJvckNhbGxiYWNrUHJvYygKKyAgICAgICAgQUF1ZGlvU3RyZWFtICpzdHJlYW0gX191bnVzZWQsCisgICAgICAgIHZvaWQgKnVzZXJEYXRhIF9fdW51c2VkLAorICAgICAgICBhYXVkaW9fcmVzdWx0X3QgZXJyb3IpIHsKKyAgICBpZiAoZXJyb3IgPT0gQUFVRElPX0VSUk9SX0RJU0NPTk5FQ1RFRCkgeworICAgICAgICAvLyBIYW5kbGUgc3RyZWFtIHJlc3RhcnQgb24gYSBzZXBhcmF0ZSB0aHJlYWQKKyAgICAgICAgaWYgKHNfQXVkaW9FbmdpbmUudGhyZWFkID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHNfQXVkaW9FbmdpbmUudGhyZWFkID0gbmV3IHN0ZDo6dGhyZWFkKHNfU3RhcnRUaHJlYWRQcm9jKTsKKyAgICAgICAgfQorICAgIH0KK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgKHZvaWQpIGFyZ2M7CisgICAgKHZvaWQpIGFyZ3Y7CisKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOworCisgICAgLy8gTWFrZSBwcmludGYgcHJpbnQgaW1tZWRpYXRlbHkgc28gdGhhdCBkZWJ1ZyBpbmZvIGlzIG5vdCBzdHVjaworICAgIC8vIGluIGEgYnVmZmVyIGlmIHdlIGhhbmcgb3IgY3Jhc2guCisgICAgc2V0dmJ1ZihzdGRvdXQsIG51bGxwdHIsIF9JT05CRiwgKHNpemVfdCkgMCk7CisKKyAgICBwcmludGYoIlRlc3QgQmFkIERpc2Nvbm5lY3QgVjEuMFxuIik7CisgICAgcHJpbnRmKCJcbj09PT09PT09PT09IFBsZWFzZSBQTFVHIGFuZCBVTlBMVUcgaGVhZHBob25lcyEgPT09PT09PT09PT09PT1cblxuIik7CisgICAgcHJpbnRmKCJZb3Ugc2hvdWxkIHNlZSB0aGUgZGV2aWNlSUQgY2hhbmdlIG9uIGVhY2ggcGx1ZyBldmVudC5cbiIpOworICAgIHByaW50ZigiSGVhZHBob25lcyB3aWxsIGdlbmVyYWxseSBnZXQgYSBuZXcgZGV2aWNlSWQgZWFjaCB0aW1lLlxuIik7CisgICAgcHJpbnRmKCJTcGVha2VycyB3aWxsIGhhdmUgdGhlIHNhbWUgZGV2aWNlSWQgZWFjaCB0aW1lLlxuIik7CisgICAgcHJpbnRmKCJUaGUgZnJhbWVzUmVhZCBzaG91bGQgcmVzZXQgb24gZWFjaCBwbHVnIGV2ZW50IHRoZW4gaW5jcmVhc2Ugb3ZlciB0aW1lLlxuIik7CisgICAgcHJpbnRmKCJcbiIpOworCisgICAgcmVzdWx0ID0gc19TdGFydEF1ZGlvKCk7CisKKyAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgeworICAgICAgICBmb3IgKGludCBpID0gMjA7IGkgPiAwOyBpLS0pIHsKKyAgICAgICAgICAgIHNsZWVwKDEpOworICAgICAgICAgICAgcHJpbnRmKCJwbGF5aW5nIHNpbGVuY2UgIyVkLCBmcmFtZXNSZWFkID0gJWRcbiIsIGksIChpbnQpIHNfQXVkaW9FbmdpbmUuZnJhbWVzUmVhZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzX1N0b3BBdWRpbygpOworCisgICAgcHJpbnRmKCJyZXN1bHQgPSAlZCA9ICVzXG4iLCByZXN1bHQsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfaW50ZXJmZXJlbmNlLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2ludGVyZmVyZW5jZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VhZjIyNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2ludGVyZmVyZW5jZS5jcHAKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFBsYXkgYSBzaGFyZWQgc3RyZWFtIHRoYXQgbWlnaHQgdXNlIE1NQVAuCisvLyBUaGVuIHBsYXkgYSBzZWNvbmQgc3RyZWFtIGF0IGEgZGlmZmVyZW50IHNhbXBsZSByYXRlLgorLy8gTWFrZSBzdXJlIHRoZSBmaXJzdCBzdHJlYW0gaXMgc3RpbGwgcnVubmluZy4KKy8vIFNlZTogYi83MzM2OTExMiB8IEFBdWRpbyBkaXNjb25uZWN0cyBzaGFyZWQgc3RyZWFtIGlmIHNlY29uZCBNTUFQIG9wZW4gZmFpbHMKKworI2luY2x1ZGUgPG1lbW9yeS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+CisjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworLy8gQ2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBmaWxscyB0aGUgYXVkaW8gb3V0cHV0IGJ1ZmZlci4KK2FhdWRpb19kYXRhX2NhbGxiYWNrX3Jlc3VsdF90IE15RGF0YUNhbGxiYWNrUHJvYygKKyAgICAgICAgQUF1ZGlvU3RyZWFtICpzdHJlYW0sCisgICAgICAgIHZvaWQgKnVzZXJEYXRhLAorICAgICAgICB2b2lkICphdWRpb0RhdGEsCisgICAgICAgIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgKHZvaWQpIHVzZXJEYXRhOworICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IEFBdWRpb1N0cmVhbV9nZXRDaGFubmVsQ291bnQoc3RyZWFtKSAqIG51bUZyYW1lczsKKyAgICBhYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gQUF1ZGlvU3RyZWFtX2dldEZvcm1hdChzdHJlYW0pOworICAgIGlmIChmb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2KSB7CisgICAgICAgIG1lbXNldChhdWRpb0RhdGEsIDAsIG51bVNhbXBsZXMgKiBzaXplb2YoaW50MTZfdCkpOworICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7CisgICAgICAgIG1lbXNldChhdWRpb0RhdGEsIDAsIG51bVNhbXBsZXMgKiBzaXplb2YoZmxvYXQpKTsKKyAgICB9CisgICAgcmV0dXJuIEFBVURJT19DQUxMQkFDS19SRVNVTFRfQ09OVElOVUU7Cit9CisKKy8vdm9pZCBmb28oKSB7IC8vIGZvciB0cmlja2luZyB0aGUgQW5kcm9pZCBTdHVkaW8gZm9ybWF0dGVyCitURVNUKHRlc3RfaW50ZXJmZXJlbmNlLCBhYXVkaW9fbW1hcF9pbnRlcmZlcmVuY2UpIHsKKworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXIgKmFhdWRpb0J1aWxkZXIgPSBudWxscHRyOworICAgIEFBdWRpb1N0cmVhbSAqYWF1ZGlvU3RyZWFtMSA9IG51bGxwdHI7CisgICAgQUF1ZGlvU3RyZWFtICphYXVkaW9TdHJlYW0yID0gbnVsbHB0cjsKKworICAgIC8vIFVzZSBhbiBBQXVkaW9TdHJlYW1CdWlsZGVyIHRvIGNvbnRhaW4gcmVxdWVzdGVkIHBhcmFtZXRlcnMuCisgICAgQVNTRVJUX0VRKEFBVURJT19PSywgQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIoJmFhdWRpb0J1aWxkZXIpKTsKKworICAgIC8vIFJlcXVlc3Qgc3RyZWFtIHByb3BlcnRpZXMuCisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTYW1wbGVSYXRlKGFhdWRpb0J1aWxkZXIsIDQ4MDAwKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldERhdGFDYWxsYmFjayhhYXVkaW9CdWlsZGVyLCBNeURhdGFDYWxsYmFja1Byb2MsIG51bGxwdHIpOworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0UGVyZm9ybWFuY2VNb2RlKGFhdWRpb0J1aWxkZXIsIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZKTsKKworICAgIC8vIENyZWF0ZSBhbiBBQXVkaW9TdHJlYW0gdXNpbmcgdGhlIEJ1aWxkZXIuCisgICAgQVNTRVJUX0VRKEFBVURJT19PSywgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKGFhdWRpb0J1aWxkZXIsICZhYXVkaW9TdHJlYW0xKSk7CisgICAgLy8gU3RhcnQgaXQgcnVubmluZy4KKyAgICBBU1NFUlRfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KGFhdWRpb1N0cmVhbTEpKTsKKworICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBzdHJlYW0gaXMgcnVubmluZy4KKyAgICBzbGVlcCgxKTsKKyAgICBFWFBFQ1RfTFQoMCwgQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQoYWF1ZGlvU3RyZWFtMSkpOworICAgIEFTU0VSVF9FUShBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJURUQsIEFBdWRpb1N0cmVhbV9nZXRTdGF0ZShhYXVkaW9TdHJlYW0xKSk7CisKKyAgICAvLyBOb3cgdHJ5IHRvIG9wZW4gYSBzZWNvbmQgc3RyZWFtIHdpdGggYSBkaWZmZXJlbnQgcmF0ZS4KKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNhbXBsZVJhdGUoYWF1ZGlvQnVpbGRlciwgNDQxMDApOworICAgIEFTU0VSVF9FUShBQVVESU9fT0ssIEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbShhYXVkaW9CdWlsZGVyLCAmYWF1ZGlvU3RyZWFtMikpOworICAgIEFTU0VSVF9FUShBQVVESU9fT0ssIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoYWF1ZGlvU3RyZWFtMikpOworCisgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIHNlY29uZCBzdHJlYW0gaXMgcnVubmluZy4KKyAgICBzbGVlcCgxKTsKKyAgICBFWFBFQ1RfTFQoMCwgQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQoYWF1ZGlvU3RyZWFtMikpOworCisgICAgRVhQRUNUX0VRKEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRFRCwgQUF1ZGlvU3RyZWFtX2dldFN0YXRlKGFhdWRpb1N0cmVhbTIpKTsKKworICAgIC8vIE5vdyB2ZXJpZnkgdGhhdCB0aGUgZmlyc3Qgc3RyZWFtIGlzIHN0aWxsIHJ1bm5pbmcuCisgICAgRVhQRUNUX0VRKEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRFRCwgQUF1ZGlvU3RyZWFtX2dldFN0YXRlKGFhdWRpb1N0cmVhbTEpKTsKKworICAgIGludDMyX3QgZnJhbWVzUmVhZDFfMSA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKGFhdWRpb1N0cmVhbTEpOworICAgIEVYUEVDVF9MVCgwLCBmcmFtZXNSZWFkMV8xKTsKKyAgICBzbGVlcCgxKTsKKyAgICBpbnQzMl90IGZyYW1lc1JlYWQxXzIgPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUmVhZChhYXVkaW9TdHJlYW0xKTsKKyAgICBFWFBFQ1RfTFQoMCwgZnJhbWVzUmVhZDFfMik7CisgICAgRVhQRUNUX0xUKGZyYW1lc1JlYWQxXzEsIGZyYW1lc1JlYWQxXzIpOyAvLyBhZHZhbmNpbmc/CisKKyAgICBBQXVkaW9TdHJlYW1fY2xvc2UoYWF1ZGlvU3RyZWFtMik7CisgICAgQUF1ZGlvU3RyZWFtX2Nsb3NlKGFhdWRpb1N0cmVhbTEpOworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfZGVsZXRlKGFhdWRpb0J1aWxkZXIpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfbGluZWFyX3JhbXAuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfbGluZWFyX3JhbXAuY3BwCmluZGV4IDVjNTM5ODIuLjkzMjI2YmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2xpbmVhcl9yYW1wLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9saW5lYXJfcmFtcC5jcHAKQEAgLTE1LDEzICsxNSwxMyBAQAogICovCiAKICNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxtYXRoLmg+CiAKICNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgogCiAjaW5jbHVkZSAidXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaCIKICNpbmNsdWRlICJ1dGlsaXR5L0xpbmVhclJhbXAuaCIKIAotCiBURVNUKHRlc3RfbGluZWFyX3JhbXAsIGxpbmVhcl9yYW1wX3NlZ21lbnRzKSB7CiAgICAgTGluZWFyUmFtcCByYW1wOwogICAgIGNvbnN0IGZsb2F0IHNvdXJjZVs0XSA9IHsxLjBmLCAxLjBmLCAxLjBmLCAxLjBmIH07CkBAIC0zMiw0MCArMzIsNDAgQEAKICAgICByYW1wLnNldExlbmd0aEluRnJhbWVzKDgpOwogICAgIHJhbXAuc2V0VGFyZ2V0KDguMGYpOwogCi0gICAgQVNTRVJUX0VRKDgsIHJhbXAuZ2V0TGVuZ3RoSW5GcmFtZXMoKSk7CisgICAgRVhQRUNUX0VRKDgsIHJhbXAuZ2V0TGVuZ3RoSW5GcmFtZXMoKSk7CiAKICAgICBib29sIHJhbXBpbmcgPSByYW1wLm5leHRTZWdtZW50KDQsICZsZXZlbEZyb20sICZsZXZlbFRvKTsKLSAgICBBU1NFUlRfRVEoMSwgcmFtcGluZyk7Ci0gICAgQVNTRVJUX0VRKDAuMGYsIGxldmVsRnJvbSk7Ci0gICAgQVNTRVJUX0VRKDQuMGYsIGxldmVsVG8pOworICAgIEVYUEVDVF9FUSgxLCByYW1waW5nKTsKKyAgICBFWFBFQ1RfRVEoMC4wZiwgbGV2ZWxGcm9tKTsKKyAgICBFWFBFQ1RfRVEoNC4wZiwgbGV2ZWxUbyk7CiAKICAgICBBQXVkaW9fbGluZWFyUmFtcChzb3VyY2UsIGRlc3RpbmF0aW9uLCA0LCAxLCBsZXZlbEZyb20sIGxldmVsVG8pOwotICAgIEFTU0VSVF9FUSgwLjBmLCBkZXN0aW5hdGlvblswXSk7Ci0gICAgQVNTRVJUX0VRKDEuMGYsIGRlc3RpbmF0aW9uWzFdKTsKLSAgICBBU1NFUlRfRVEoMi4wZiwgZGVzdGluYXRpb25bMl0pOwotICAgIEFTU0VSVF9FUSgzLjBmLCBkZXN0aW5hdGlvblszXSk7CisgICAgRVhQRUNUX0VRKDAuMGYsIGRlc3RpbmF0aW9uWzBdKTsKKyAgICBFWFBFQ1RfRVEoMS4wZiwgZGVzdGluYXRpb25bMV0pOworICAgIEVYUEVDVF9FUSgyLjBmLCBkZXN0aW5hdGlvblsyXSk7CisgICAgRVhQRUNUX0VRKDMuMGYsIGRlc3RpbmF0aW9uWzNdKTsKIAogICAgIHJhbXBpbmcgPSByYW1wLm5leHRTZWdtZW50KDQsICZsZXZlbEZyb20sICZsZXZlbFRvKTsKLSAgICBBU1NFUlRfRVEoMSwgcmFtcGluZyk7Ci0gICAgQVNTRVJUX0VRKDQuMGYsIGxldmVsRnJvbSk7Ci0gICAgQVNTRVJUX0VRKDguMGYsIGxldmVsVG8pOworICAgIEVYUEVDVF9FUSgxLCByYW1waW5nKTsKKyAgICBFWFBFQ1RfRVEoNC4wZiwgbGV2ZWxGcm9tKTsKKyAgICBFWFBFQ1RfRVEoOC4wZiwgbGV2ZWxUbyk7CiAKICAgICBBQXVkaW9fbGluZWFyUmFtcChzb3VyY2UsIGRlc3RpbmF0aW9uLCA0LCAxLCBsZXZlbEZyb20sIGxldmVsVG8pOwotICAgIEFTU0VSVF9FUSg0LjBmLCBkZXN0aW5hdGlvblswXSk7Ci0gICAgQVNTRVJUX0VRKDUuMGYsIGRlc3RpbmF0aW9uWzFdKTsKLSAgICBBU1NFUlRfRVEoNi4wZiwgZGVzdGluYXRpb25bMl0pOwotICAgIEFTU0VSVF9FUSg3LjBmLCBkZXN0aW5hdGlvblszXSk7CisgICAgRVhQRUNUX0VRKDQuMGYsIGRlc3RpbmF0aW9uWzBdKTsKKyAgICBFWFBFQ1RfRVEoNS4wZiwgZGVzdGluYXRpb25bMV0pOworICAgIEVYUEVDVF9FUSg2LjBmLCBkZXN0aW5hdGlvblsyXSk7CisgICAgRVhQRUNUX0VRKDcuMGYsIGRlc3RpbmF0aW9uWzNdKTsKIAogICAgIHJhbXBpbmcgPSByYW1wLm5leHRTZWdtZW50KDQsICZsZXZlbEZyb20sICZsZXZlbFRvKTsKLSAgICBBU1NFUlRfRVEoMCwgcmFtcGluZyk7Ci0gICAgQVNTRVJUX0VRKDguMGYsIGxldmVsRnJvbSk7Ci0gICAgQVNTRVJUX0VRKDguMGYsIGxldmVsVG8pOworICAgIEVYUEVDVF9FUSgwLCByYW1waW5nKTsKKyAgICBFWFBFQ1RfRVEoOC4wZiwgbGV2ZWxGcm9tKTsKKyAgICBFWFBFQ1RfRVEoOC4wZiwgbGV2ZWxUbyk7CiAKICAgICBBQXVkaW9fbGluZWFyUmFtcChzb3VyY2UsIGRlc3RpbmF0aW9uLCA0LCAxLCBsZXZlbEZyb20sIGxldmVsVG8pOwotICAgIEFTU0VSVF9FUSg4LjBmLCBkZXN0aW5hdGlvblswXSk7Ci0gICAgQVNTRVJUX0VRKDguMGYsIGRlc3RpbmF0aW9uWzFdKTsKLSAgICBBU1NFUlRfRVEoOC4wZiwgZGVzdGluYXRpb25bMl0pOwotICAgIEFTU0VSVF9FUSg4LjBmLCBkZXN0aW5hdGlvblszXSk7CisgICAgRVhQRUNUX0VRKDguMGYsIGRlc3RpbmF0aW9uWzBdKTsKKyAgICBFWFBFQ1RfRVEoOC4wZiwgZGVzdGluYXRpb25bMV0pOworICAgIEVYUEVDVF9FUSg4LjBmLCBkZXN0aW5hdGlvblsyXSk7CisgICAgRVhQRUNUX0VRKDguMGYsIGRlc3RpbmF0aW9uWzNdKTsKIAogfTsKIApAQCAtODAsMjkgKzgwLDEwMSBAQAogICAgIHJhbXAuc2V0TGVuZ3RoSW5GcmFtZXMoNCk7CiAgICAgcmFtcC5zZXRUYXJnZXQoOC4wZik7CiAgICAgcmFtcC5mb3JjZUN1cnJlbnQoNC4wZik7Ci0gICAgQVNTRVJUX0VRKDQuMGYsIHJhbXAuZ2V0Q3VycmVudCgpKTsKKyAgICBFWFBFQ1RfRVEoNC4wZiwgcmFtcC5nZXRDdXJyZW50KCkpOwogCiAgICAgYm9vbCByYW1waW5nID0gcmFtcC5uZXh0U2VnbWVudCg0LCAmbGV2ZWxGcm9tLCAmbGV2ZWxUbyk7Ci0gICAgQVNTRVJUX0VRKDEsIHJhbXBpbmcpOwotICAgIEFTU0VSVF9FUSg0LjBmLCBsZXZlbEZyb20pOwotICAgIEFTU0VSVF9FUSg4LjBmLCBsZXZlbFRvKTsKKyAgICBFWFBFQ1RfRVEoMSwgcmFtcGluZyk7CisgICAgRVhQRUNUX0VRKDQuMGYsIGxldmVsRnJvbSk7CisgICAgRVhQRUNUX0VRKDguMGYsIGxldmVsVG8pOwogCiAgICAgQUF1ZGlvX2xpbmVhclJhbXAoc291cmNlLCBkZXN0aW5hdGlvbiwgNCwgMSwgbGV2ZWxGcm9tLCBsZXZlbFRvKTsKLSAgICBBU1NFUlRfRVEoNC4wZiwgZGVzdGluYXRpb25bMF0pOwotICAgIEFTU0VSVF9FUSg1LjBmLCBkZXN0aW5hdGlvblsxXSk7Ci0gICAgQVNTRVJUX0VRKDYuMGYsIGRlc3RpbmF0aW9uWzJdKTsKLSAgICBBU1NFUlRfRVEoNy4wZiwgZGVzdGluYXRpb25bM10pOworICAgIEVYUEVDVF9FUSg0LjBmLCBkZXN0aW5hdGlvblswXSk7CisgICAgRVhQRUNUX0VRKDUuMGYsIGRlc3RpbmF0aW9uWzFdKTsKKyAgICBFWFBFQ1RfRVEoNi4wZiwgZGVzdGluYXRpb25bMl0pOworICAgIEVYUEVDVF9FUSg3LjBmLCBkZXN0aW5hdGlvblszXSk7CiAKICAgICByYW1waW5nID0gcmFtcC5uZXh0U2VnbWVudCg0LCAmbGV2ZWxGcm9tLCAmbGV2ZWxUbyk7Ci0gICAgQVNTRVJUX0VRKDAsIHJhbXBpbmcpOwotICAgIEFTU0VSVF9FUSg4LjBmLCBsZXZlbEZyb20pOwotICAgIEFTU0VSVF9FUSg4LjBmLCBsZXZlbFRvKTsKKyAgICBFWFBFQ1RfRVEoMCwgcmFtcGluZyk7CisgICAgRVhQRUNUX0VRKDguMGYsIGxldmVsRnJvbSk7CisgICAgRVhQRUNUX0VRKDguMGYsIGxldmVsVG8pOwogCiAgICAgQUF1ZGlvX2xpbmVhclJhbXAoc291cmNlLCBkZXN0aW5hdGlvbiwgNCwgMSwgbGV2ZWxGcm9tLCBsZXZlbFRvKTsKLSAgICBBU1NFUlRfRVEoOC4wZiwgZGVzdGluYXRpb25bMF0pOwotICAgIEFTU0VSVF9FUSg4LjBmLCBkZXN0aW5hdGlvblsxXSk7Ci0gICAgQVNTRVJUX0VRKDguMGYsIGRlc3RpbmF0aW9uWzJdKTsKLSAgICBBU1NFUlRfRVEoOC4wZiwgZGVzdGluYXRpb25bM10pOworICAgIEVYUEVDVF9FUSg4LjBmLCBkZXN0aW5hdGlvblswXSk7CisgICAgRVhQRUNUX0VRKDguMGYsIGRlc3RpbmF0aW9uWzFdKTsKKyAgICBFWFBFQ1RfRVEoOC4wZiwgZGVzdGluYXRpb25bMl0pOworICAgIEVYUEVDVF9FUSg4LjBmLCBkZXN0aW5hdGlvblszXSk7CiAKIH07CiAKK2NvbnN0ZXhwciBpbnQxNl90IGtNYXhJMTYgPSBJTlQxNl9NQVg7Citjb25zdGV4cHIgaW50MTZfdCBrTWluSTE2ID0gSU5UMTZfTUlOOworY29uc3RleHByIGludDE2X3Qga0hhbGZJMTYgPSAxNjM4NDsKK2NvbnN0ZXhwciBpbnQxNl90IGtUZW50aEkxNiA9IDMyNzc7CisKKy8vdm9pZCBBQXVkaW9Db252ZXJ0X2Zsb2F0VG9QY20xNihjb25zdCBmbG9hdCAqc291cmNlLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRlc3RpbmF0aW9uLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtU2FtcGxlcywKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUpOworVEVTVCh0ZXN0X2xpbmVhcl9yYW1wLCBmbG9hdF90b19pMTYpIHsKKyAgICBjb25zdCBmbG9hdCBzb3VyY2VbXSA9IHsxMjM0NS42ZiwgMS4wZiwgMC41ZiwgMC4xZiwgMC4wZiwgLTAuMWYsIC0wLjVmLCAtMS4wZiwgLTEyMzQ1LjZmfTsKKyAgICBjb25zdGV4cHIgc2l6ZV90IGNvdW50ID0gc2l6ZW9mKHNvdXJjZSkgLyBzaXplb2Yoc291cmNlWzBdKTsKKyAgICBpbnQxNl90IGRlc3RpbmF0aW9uW2NvdW50XTsKKyAgICBjb25zdCBpbnQxNl90IGV4cGVjdGVkW2NvdW50XSA9IHtrTWF4STE2LCBrTWF4STE2LCBrSGFsZkkxNiwga1RlbnRoSTE2LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1rVGVudGhJMTYsIC1rSGFsZkkxNiwga01pbkkxNiwga01pbkkxNn07CisKKyAgICBBQXVkaW9Db252ZXJ0X2Zsb2F0VG9QY20xNihzb3VyY2UsIGRlc3RpbmF0aW9uLCBjb3VudCwgMS4wZik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIEVYUEVDVF9FUShleHBlY3RlZFtpXSwgZGVzdGluYXRpb25baV0pOworICAgIH0KKworfQorCisvL3ZvaWQgQUF1ZGlvQ29udmVydF9wY20xNlRvRmxvYXQoY29uc3QgaW50MTZfdCAqc291cmNlLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpkZXN0aW5hdGlvbiwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlKTsKK1RFU1QodGVzdF9saW5lYXJfcmFtcCwgaTE2X3RvX2Zsb2F0KSB7CisgICAgY29uc3QgaW50MTZfdCBzb3VyY2VbXSA9IHtrTWF4STE2LCBrSGFsZkkxNiwga1RlbnRoSTE2LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLWtUZW50aEkxNiwgLWtIYWxmSTE2LCBrTWluSTE2fTsKKyAgICBjb25zdGV4cHIgc2l6ZV90IGNvdW50ID0gc2l6ZW9mKHNvdXJjZSkgLyBzaXplb2Yoc291cmNlWzBdKTsKKyAgICBmbG9hdCBkZXN0aW5hdGlvbltjb3VudF07CisgICAgY29uc3QgZmxvYXQgZXhwZWN0ZWRbY291bnRdID0geygzMjc2Ny4wZiAvIDMyNzY4LjBmKSwgMC41ZiwgMC4xZiwgMC4wZiwgLTAuMWYsIC0wLjVmLCAtMS4wZn07CisKKyAgICBBQXVkaW9Db252ZXJ0X3BjbTE2VG9GbG9hdChzb3VyY2UsIGRlc3RpbmF0aW9uLCBjb3VudCwgMS4wZik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIEVYUEVDVF9ORUFSKGV4cGVjdGVkW2ldLCBkZXN0aW5hdGlvbltpXSwgMC4wMDAxZik7CisgICAgfQorCit9CisKKy8vdm9pZCBBQXVkaW9fbGluZWFyUmFtcChjb25zdCBpbnQxNl90ICpzb3VyY2UsCisvLyAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZGVzdGluYXRpb24sCisvLyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCisvLyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUsCisvLyAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKKy8vICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKTsKK1RFU1QodGVzdF9saW5lYXJfcmFtcCwgcmFtcF9pMTZfdG9faTE2KSB7CisgICAgY29uc3QgaW50MTZfdCBzb3VyY2VbXSA9IHsxLCAxLCAxLCAxLCAxLCAxLCAxLCAxfTsKKyAgICBjb25zdGV4cHIgc2l6ZV90IGNvdW50ID0gc2l6ZW9mKHNvdXJjZSkgLyBzaXplb2Yoc291cmNlWzBdKTsKKyAgICBpbnQxNl90IGRlc3RpbmF0aW9uW2NvdW50XTsKKyAgICAvLyBSYW1wIHdpbGwgc3dlZXAgZnJvbSAtMSB0byBhbG1vc3QgKzEKKyAgICBjb25zdCBpbnQxNl90IGV4cGVjdGVkW2NvdW50XSA9IHsKKyAgICAgICAgICAgIC0xLCAvLyBmcm9tIC0xLjAwCisgICAgICAgICAgICAtMSwgLy8gZnJvbSAtMC43NQorICAgICAgICAgICAgLTEsIC8vIGZyb20gLTAuNTUsIHJvdW5kIGF3YXkgZnJvbSB6ZXJvCisgICAgICAgICAgICAwLCAgLy8gZnJvbSAtMC4yNSwgcm91bmQgdXAgdG8gemVybworICAgICAgICAgICAgMCwgIC8vIGZyb20gIDAuMDAKKyAgICAgICAgICAgIDAsICAvLyBmcm9tICAwLjI1LCByb3VuZCBkb3duIHRvIHplcm8KKyAgICAgICAgICAgIDEsICAvLyBmcm9tICAwLjUwLCByb3VuZCBhd2F5IGZyb20gemVybworICAgICAgICAgICAgMSAgIC8vIGZyb20gIDAuNzUKKyAgICB9OworCisgICAgLy8gc3dlZXAgYWNyb3NzIHplcm8gdG8gdGVzdCBzeW1tZXRyeQorICAgIGNvbnN0ZXhwciBmbG9hdCBhbXBsaXR1ZGUxID0gLTEuMDsKKyAgICBjb25zdGV4cHIgZmxvYXQgYW1wbGl0dWRlMiA9IDEuMDsKKyAgICBBQXVkaW9fbGluZWFyUmFtcChzb3VyY2UsIGRlc3RpbmF0aW9uLCBjb3VudCwgMSwgYW1wbGl0dWRlMSwgYW1wbGl0dWRlMik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIEVYUEVDVF9FUShleHBlY3RlZFtpXSwgZGVzdGluYXRpb25baV0pOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3Rfbl9zdHJlYW1zLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X25fc3RyZWFtcy5jcHAKaW5kZXggMjcxZDAyNC4uZTJkNGE4MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3Rfbl9zdHJlYW1zLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9uX3N0cmVhbXMuY3BwCkBAIC03MSw3ICs3MSw2IEBACiAKICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX2RlbGV0ZShhYXVkaW9CdWlsZGVyKTsKIAotZmluaXNoOgogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X29wZW5fcGFyYW1zLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X29wZW5fcGFyYW1zLmNwcAppbmRleCAwMWI4Nzk5Li4zNDUxMjQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9vcGVuX3BhcmFtcy5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3Rfb3Blbl9wYXJhbXMuY3BwCkBAIC0yNSwyMSArMjUsNiBAQAogCiAjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KIAotc3RhdGljIGNvbnN0IGNoYXIgKmdldFNoYXJpbmdNb2RlVGV4dChhYXVkaW9fc2hhcmluZ19tb2RlX3QgbW9kZSkgewotICAgIGNvbnN0IGNoYXIgKm1vZGVUZXh0ID0gInVua25vd24iOwotICAgIHN3aXRjaCAobW9kZSkgewotICAgIGNhc2UgQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkU6Ci0gICAgICAgIG1vZGVUZXh0ID0gIkVYQ0xVU0lWRSI7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQ6Ci0gICAgICAgIG1vZGVUZXh0ID0gIlNIQVJFRCI7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gbW9kZVRleHQ7Ci19Ci0KIC8vIENhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgZmlsbHMgdGhlIGF1ZGlvIG91dHB1dCBidWZmZXIuCiBhYXVkaW9fZGF0YV9jYWxsYmFja19yZXN1bHRfdCBNeURhdGFDYWxsYmFja1Byb2MoCiAgICAgICAgIEFBdWRpb1N0cmVhbSAqc3RyZWFtLApAQCAtNjcsNyArNTIsNiBAQAogICAgIGludDMyX3QgYWN0dWFsQ2hhbm5lbENvdW50ID0gMDsKICAgICBpbnQzMl90IGFjdHVhbFNhbXBsZVJhdGUgPSAwOwogICAgIGFhdWRpb19mb3JtYXRfdCBhY3R1YWxEYXRhRm9ybWF0ID0gQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRDsKLSAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3QgYWN0dWFsU2hhcmluZ01vZGUgPSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRDsKICAgICBhYXVkaW9fZGlyZWN0aW9uX3QgYWN0dWFsRGlyZWN0aW9uOwogCiAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlciAqYWF1ZGlvQnVpbGRlciA9IG51bGxwdHI7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9yZWNvdmVyeS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9yZWNvdmVyeS5jcHAKaW5kZXggNzI2OGEzMC4uNmU4OWY4MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfcmVjb3ZlcnkuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3JlY292ZXJ5LmNwcApAQCAtMjMsMjQgKzIzLDkgQEAKIAogI2RlZmluZSBERUZBVUxUX1RJTUVPVVRfTkFOT1MgICgoaW50NjRfdCkxMDAwMDAwMDAwKQogCi1zdGF0aWMgY29uc3QgY2hhciAqZ2V0U2hhcmluZ01vZGVUZXh0KGFhdWRpb19zaGFyaW5nX21vZGVfdCBtb2RlKSB7Ci0gICAgY29uc3QgY2hhciAqbW9kZVRleHQgPSAidW5rbm93biI7Ci0gICAgc3dpdGNoIChtb2RlKSB7Ci0gICAgICAgIGNhc2UgQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkU6Ci0gICAgICAgICAgICBtb2RlVGV4dCA9ICJFWENMVVNJVkUiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQ6Ci0gICAgICAgICAgICBtb2RlVGV4dCA9ICJTSEFSRUQiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIG1vZGVUZXh0OwotfQotCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKICAgICAodm9pZCkgYXJnYzsKLSAgICAodm9pZCAqKWFyZ3Y7CisgICAgKHZvaWQpIGFyZ3Y7CiAKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOwogCkBAIC01Miw3ICszNyw2IEBACiAgICAgaW50MzJfdCBhY3R1YWxDaGFubmVsQ291bnQgPSAwOwogICAgIGludDMyX3QgYWN0dWFsU2FtcGxlUmF0ZSA9IDA7CiAgICAgYWF1ZGlvX2Zvcm1hdF90IGFjdHVhbERhdGFGb3JtYXQgPSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVDsKLSAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3QgYWN0dWFsU2hhcmluZ01vZGUgPSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRDsKIAogICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXIgKmFhdWRpb0J1aWxkZXIgPSBudWxscHRyOwogICAgIEFBdWRpb1N0cmVhbSAqYWF1ZGlvU3RyZWFtID0gbnVsbHB0cjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3Nlc3Npb25faWQuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3Rfc2Vzc2lvbl9pZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y3ZDRmYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3Nlc3Npb25faWQuY3BwCkBAIC0wLDAgKzEsMTY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gVGVzdCBBQXVkaW8gU2Vzc2lvbklkLCB3aGljaCBpcyB1c2VkIHRvIGFzc29jaWF0ZSBFZmZlY3RzIHdpdGggYSBzdHJlYW0KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworY29uc3RleHByIGludDY0X3Qga05hbm9zUGVyU2Vjb25kID0gMTAwMDAwMDAwMDsKK2NvbnN0ZXhwciBpbnQga051bUZyYW1lcyA9IDI1NjsKK2NvbnN0ZXhwciBpbnQga0NoYW5uZWxDb3VudCA9IDI7CisKKy8vIFRlc3QgQUFVRElPX1NFU1NJT05fSURfTk9ORSBkZWZhdWx0CitzdGF0aWMgdm9pZCBjaGVja1Nlc3Npb25JZE5vbmUoYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBwZXJmTW9kZSkgeworCisgICAgZmxvYXQgKmJ1ZmZlciA9IG5ldyBmbG9hdFtrTnVtRnJhbWVzICoga0NoYW5uZWxDb3VudF07CisKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyICphYXVkaW9CdWlsZGVyID0gbnVsbHB0cjsKKworICAgIEFBdWRpb1N0cmVhbSAqYWF1ZGlvU3RyZWFtMSA9IG51bGxwdHI7CisgICAgaW50MzJfdCAgICAgICBzZXNzaW9uSWQxID0gMDsKKworICAgIC8vIFVzZSBhbiBBQXVkaW9TdHJlYW1CdWlsZGVyIHRvIGNvbnRhaW4gcmVxdWVzdGVkIHBhcmFtZXRlcnMuCisgICAgQVNTRVJUX0VRKEFBVURJT19PSywgQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIoJmFhdWRpb0J1aWxkZXIpKTsKKworICAgIC8vIFJlcXVlc3Qgc3RyZWFtIHByb3BlcnRpZXMuCisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRQZXJmb3JtYW5jZU1vZGUoYWF1ZGlvQnVpbGRlciwgcGVyZk1vZGUpOworCisgICAgLy8gQ3JlYXRlIGFuIEFBdWRpb1N0cmVhbSB1c2luZyB0aGUgQnVpbGRlci4KKyAgICBBU1NFUlRfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oYWF1ZGlvQnVpbGRlciwgJmFhdWRpb1N0cmVhbTEpKTsKKworICAgIC8vIFNpbmNlIHdlIGRpZCBub3QgcmVxdWVzdCBvciBzcGVjaWZ5IGEgU2Vzc2lvbklELCB3ZSBzaG91bGQgZ2V0IE5PTkUKKyAgICBzZXNzaW9uSWQxID0gQUF1ZGlvU3RyZWFtX2dldFNlc3Npb25JZChhYXVkaW9TdHJlYW0xKTsKKyAgICBBU1NFUlRfRVEoQUFVRElPX1NFU1NJT05fSURfTk9ORSwgc2Vzc2lvbklkMSk7CisKKyAgICBBU1NFUlRfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KGFhdWRpb1N0cmVhbTEpKTsKKworICAgIEFTU0VSVF9FUShrTnVtRnJhbWVzLCBBQXVkaW9TdHJlYW1fd3JpdGUoYWF1ZGlvU3RyZWFtMSwgYnVmZmVyLCBrTnVtRnJhbWVzLCBrTmFub3NQZXJTZWNvbmQpKTsKKworICAgIEVYUEVDVF9FUShBQVVESU9fT0ssIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcChhYXVkaW9TdHJlYW0xKSk7CisKKyAgICBFWFBFQ1RfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1fY2xvc2UoYWF1ZGlvU3RyZWFtMSkpOworICAgIGRlbGV0ZVtdIGJ1ZmZlcjsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX2RlbGV0ZShhYXVkaW9CdWlsZGVyKTsKK30KKworVEVTVCh0ZXN0X3Nlc3Npb25faWQsIGFhdWRpb19zZXNzaW9uX2lkX25vbmVfcGVyZm5vbmUpIHsKKyAgICBjaGVja1Nlc3Npb25JZE5vbmUoQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORSk7Cit9CisKK1RFU1QodGVzdF9zZXNzaW9uX2lkLCBhYXVkaW9fc2Vzc2lvbl9pZF9ub25lX2xvd2xhdCkgeworICAgIGNoZWNrU2Vzc2lvbklkTm9uZShBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSk7Cit9CisKKy8vIFRlc3QgQUFVRElPX1NFU1NJT05fSURfQUxMT0NBVEUKK3N0YXRpYyB2b2lkIGNoZWNrU2Vzc2lvbklkQWxsb2NhdGUoYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBwZXJmTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbikgeworCisgICAgZmxvYXQgKmJ1ZmZlciA9IG5ldyBmbG9hdFtrTnVtRnJhbWVzICoga0NoYW5uZWxDb3VudF07CisKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyICphYXVkaW9CdWlsZGVyID0gbnVsbHB0cjsKKworICAgIEFBdWRpb1N0cmVhbSAqYWF1ZGlvU3RyZWFtMSA9IG51bGxwdHI7CisgICAgaW50MzJfdCAgICAgICBzZXNzaW9uSWQxID0gMDsKKyAgICBBQXVkaW9TdHJlYW0gKmFhdWRpb1N0cmVhbTIgPSBudWxscHRyOworICAgIGludDMyX3QgICAgICAgc2Vzc2lvbklkMiA9IDA7CisKKyAgICAvLyBVc2UgYW4gQUF1ZGlvU3RyZWFtQnVpbGRlciB0byBjb250YWluIHJlcXVlc3RlZCBwYXJhbWV0ZXJzLgorICAgIEFTU0VSVF9FUShBQVVESU9fT0ssIEFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyKCZhYXVkaW9CdWlsZGVyKSk7CisKKyAgICAvLyBSZXF1ZXN0IHN0cmVhbSBwcm9wZXJ0aWVzLgorICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0UGVyZm9ybWFuY2VNb2RlKGFhdWRpb0J1aWxkZXIsIHBlcmZNb2RlKTsKKyAgICAvLyBUaGlzIHN0cmVhbSBjb3VsZCBiZSBpbnB1dCBvciBvdXRwdXQuCisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXREaXJlY3Rpb24oYWF1ZGlvQnVpbGRlciwgZGlyZWN0aW9uKTsKKworICAgIC8vIEFzayBBQXVkaW8gdG8gYWxsb2NhdGUgYSBTZXNzaW9uIElELgorICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2Vzc2lvbklkKGFhdWRpb0J1aWxkZXIsIEFBVURJT19TRVNTSU9OX0lEX0FMTE9DQVRFKTsKKworICAgIC8vIENyZWF0ZSBhbiBBQXVkaW9TdHJlYW0gdXNpbmcgdGhlIEJ1aWxkZXIuCisgICAgQVNTRVJUX0VRKEFBVURJT19PSywgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKGFhdWRpb0J1aWxkZXIsICZhYXVkaW9TdHJlYW0xKSk7CisKKyAgICAvLyBHZXQgdGhlIGFsbG9jYXRlZCBJRCBmcm9tIHRoZSBzdHJlYW0uCisgICAgc2Vzc2lvbklkMSA9IEFBdWRpb1N0cmVhbV9nZXRTZXNzaW9uSWQoYWF1ZGlvU3RyZWFtMSk7CisKKyAgICAvLyBDaGVjayBmb3IgaW52YWxpZCBzZXNzaW9uIElEcy4KKyAgICBBU1NFUlRfTkUoQUFVRElPX1NFU1NJT05fSURfTk9ORSwgc2Vzc2lvbklkMSk7CisgICAgQVNTRVJUX05FKEFBVURJT19TRVNTSU9OX0lEX0FMTE9DQVRFLCBzZXNzaW9uSWQxKTsKKworICAgIEFTU0VSVF9FUShBQVVESU9fT0ssIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoYWF1ZGlvU3RyZWFtMSkpOworCisgICAgaWYgKGRpcmVjdGlvbiA9PSBBQVVESU9fRElSRUNUSU9OX0lOUFVUKSB7CisgICAgICAgIEFTU0VSVF9FUShrTnVtRnJhbWVzLCBBQXVkaW9TdHJlYW1fcmVhZChhYXVkaW9TdHJlYW0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBrTnVtRnJhbWVzLCBrTmFub3NQZXJTZWNvbmQpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfRVEoa051bUZyYW1lcywgQUF1ZGlvU3RyZWFtX3dyaXRlKGFhdWRpb1N0cmVhbTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwga051bUZyYW1lcywga05hbm9zUGVyU2Vjb25kKSk7CisgICAgfQorCisgICAgRVhQRUNUX0VRKEFBVURJT19PSywgQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdG9wKGFhdWRpb1N0cmVhbTEpKTsKKworICAgIC8vIE5vdyBvcGVuIGEgc2Vjb25kIHN0cmVhbSB1c2luZyB0aGUgc2FtZSBzZXNzaW9uIElELiA9PT09PT09PT09PT09PT09PT0KKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNlc3Npb25JZChhYXVkaW9CdWlsZGVyLCBzZXNzaW9uSWQxKTsKKworICAgIC8vIFJldmVyc2UgZGlyZWN0aW9uIGZvciBzZWNvbmQgc3RyZWFtLgorICAgIGFhdWRpb19kaXJlY3Rpb25fdCBvdGhlckRpcmVjdGlvbiA9IChkaXJlY3Rpb24gPT0gQUFVRElPX0RJUkVDVElPTl9PVVRQVVQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBQVVESU9fRElSRUNUSU9OX0lOUFVUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBQVVESU9fRElSRUNUSU9OX09VVFBVVDsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldERpcmVjdGlvbihhYXVkaW9CdWlsZGVyLCBvdGhlckRpcmVjdGlvbik7CisKKyAgICAvLyBDcmVhdGUgYW4gQUF1ZGlvU3RyZWFtIHVzaW5nIHRoZSBCdWlsZGVyLgorICAgIEFTU0VSVF9FUShBQVVESU9fT0ssIEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbShhYXVkaW9CdWlsZGVyLCAmYWF1ZGlvU3RyZWFtMikpOworCisgICAgLy8gR2V0IHRoZSBhbGxvY2F0ZWQgSUQgZnJvbSB0aGUgc3RyZWFtLgorICAgIC8vIEl0IHNob3VsZCBtYXRjaCB0aGUgSUQgdGhhdCB3ZSBzZXQgaXQgdG8gaW4gdGhlIGJ1aWxkZXIuCisgICAgc2Vzc2lvbklkMiA9IEFBdWRpb1N0cmVhbV9nZXRTZXNzaW9uSWQoYWF1ZGlvU3RyZWFtMik7CisgICAgQVNTRVJUX0VRKHNlc3Npb25JZDEsIHNlc3Npb25JZDIpOworCisgICAgQVNTRVJUX0VRKEFBVURJT19PSywgQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydChhYXVkaW9TdHJlYW0yKSk7CisKKyAgICBpZiAob3RoZXJEaXJlY3Rpb24gPT0gQUFVRElPX0RJUkVDVElPTl9JTlBVVCkgeworICAgICAgICBBU1NFUlRfRVEoa051bUZyYW1lcywgQUF1ZGlvU3RyZWFtX3JlYWQoYWF1ZGlvU3RyZWFtMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIGtOdW1GcmFtZXMsIGtOYW5vc1BlclNlY29uZCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9FUShrTnVtRnJhbWVzLCBBQXVkaW9TdHJlYW1fd3JpdGUoYWF1ZGlvU3RyZWFtMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIGtOdW1GcmFtZXMsIGtOYW5vc1BlclNlY29uZCkpOworICAgIH0KKworICAgIEVYUEVDVF9FUShBQVVESU9fT0ssIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcChhYXVkaW9TdHJlYW0yKSk7CisKKyAgICBFWFBFQ1RfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1fY2xvc2UoYWF1ZGlvU3RyZWFtMikpOworCisKKyAgICBFWFBFQ1RfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1fY2xvc2UoYWF1ZGlvU3RyZWFtMSkpOworICAgIGRlbGV0ZVtdIGJ1ZmZlcjsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX2RlbGV0ZShhYXVkaW9CdWlsZGVyKTsKK30KKworVEVTVCh0ZXN0X3Nlc3Npb25faWQsIGFhdWRpb19zZXNzaW9uX2lkX2FsbG9jX3BlcmZub25lX2luKSB7CisgICAgY2hlY2tTZXNzaW9uSWRBbGxvY2F0ZShBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FLCBBQVVESU9fRElSRUNUSU9OX0lOUFVUKTsKK30KK1RFU1QodGVzdF9zZXNzaW9uX2lkLCBhYXVkaW9fc2Vzc2lvbl9pZF9hbGxvY19wZXJmbm9uZV9vdXQpIHsKKyAgICBjaGVja1Nlc3Npb25JZEFsbG9jYXRlKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUsIEFBVURJT19ESVJFQ1RJT05fT1VUUFVUKTsKK30KKworVEVTVCh0ZXN0X3Nlc3Npb25faWQsIGFhdWRpb19zZXNzaW9uX2lkX2FsbG9jX2xvd2xhdF9pbikgeworICAgIGNoZWNrU2Vzc2lvbklkQWxsb2NhdGUoQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1ksIEFBVURJT19ESVJFQ1RJT05fSU5QVVQpOworfQorVEVTVCh0ZXN0X3Nlc3Npb25faWQsIGFhdWRpb19zZXNzaW9uX2lkX2FsbG9jX2xvd2xhdF9vdXQpIHsKKyAgICBjaGVja1Nlc3Npb25JZEFsbG9jYXRlKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZLCBBQVVESU9fRElSRUNUSU9OX09VVFBVVCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF90aW1lc3RhbXBzLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3RpbWVzdGFtcHMuY3BwCmluZGV4IGZiMzYzZTcuLmRmYTc4MTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3RpbWVzdGFtcHMuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3RpbWVzdGFtcHMuY3BwCkBAIC0yMiw4ICsyMiw3IEBACiAKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpb1Rlc3RpbmcuaD4KLSNpbmNsdWRlICJ1dGlscy9BQXVkaW9FeGFtcGxlVXRpbHMuaCIKLSNpbmNsdWRlICIuLi9leGFtcGxlcy91dGlscy9BQXVkaW9FeGFtcGxlVXRpbHMuaCIKKyNpbmNsdWRlICJBQXVkaW9FeGFtcGxlVXRpbHMuaCIKIAogLy8gQXJiaXRyYXJ5IHBlcmlvZCBmb3IgZ2xpdGNoZXMsIG9uY2UgcGVyIHNlY29uZCBhdCA0ODAwMCBIei4KICNkZWZpbmUgRk9SQ0VEX1VOREVSUlVOX1BFUklPRF9GUkFNRVMgICAgNDgwMDAKQEAgLTExMSw4ICsxMTAsNiBAQAogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CiAKICAgICBpbnQzMl90IGZyYW1lc1BlckJ1cnN0ID0gMDsKLSAgICBmbG9hdCAqYnVmZmVyID0gbnVsbHB0cjsKLQogICAgIGludDMyX3QgYWN0dWFsQ2hhbm5lbENvdW50ID0gMDsKICAgICBpbnQzMl90IGFjdHVhbFNhbXBsZVJhdGUgPSAwOwogICAgIGludDMyX3Qgb3JpZ2luYWxCdWZmZXJTaXplID0gMDsKQEAgLTI4Nyw3ICsyODQsNyBAQAogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKICAgICAodm9pZCkgYXJnYzsKLSAgICAodm9pZCAqKSBhcmd2OworICAgICh2b2lkKSBhcmd2OwogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfdmFyaW91cy5jcHAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF92YXJpb3VzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjA2NWM5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfdmFyaW91cy5jcHAKQEAgLTAsMCArMSw2MjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBUZXN0IHZhcmlvdXMgQUF1ZGlvIGZlYXR1cmVzIGluY2x1ZGluZyBBQXVkaW9TdHJlYW1fc2V0QnVmZmVyU2l6ZUluRnJhbWVzKCkuCisKKyNpbmNsdWRlIDxjb25kaXRpb25fdmFyaWFibGU+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KKyNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisvLyBDYWxsYmFjayBmdW5jdGlvbiB0aGF0IGRvZXMgbm90aGluZy4KK2FhdWRpb19kYXRhX2NhbGxiYWNrX3Jlc3VsdF90IE5vb3BEYXRhQ2FsbGJhY2tQcm9jKAorICAgICAgICBBQXVkaW9TdHJlYW0gKnN0cmVhbSwKKyAgICAgICAgdm9pZCAqdXNlckRhdGEsCisgICAgICAgIHZvaWQgKmF1ZGlvRGF0YSwKKyAgICAgICAgaW50MzJfdCBudW1GcmFtZXMKKykgeworICAgICh2b2lkKSBzdHJlYW07CisgICAgKHZvaWQpIHVzZXJEYXRhOworICAgICh2b2lkKSBhdWRpb0RhdGE7CisgICAgKHZvaWQpIG51bUZyYW1lczsKKyAgICByZXR1cm4gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9DT05USU5VRTsKK30KKworLy8gVGVzdCBBQXVkaW9TdHJlYW1fc2V0QnVmZmVyU2l6ZUluRnJhbWVzKCkKKworY29uc3RleHByIGludDY0X3QgTkFOT1NfUEVSX01JTExJU0VDT05EID0gMTAwMCAqIDEwMDA7CisKK2VudW0gRnVuY3Rpb25Ub0NhbGwgeworICAgIENBTExfU1RBUlQsIENBTExfU1RPUCwgQ0FMTF9QQVVTRSwgQ0FMTF9GTFVTSAorfTsKKwordm9pZCBjaGVja1N0YXRlVHJhbnNpdGlvbihhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IHBlcmZNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fc3RyZWFtX3N0YXRlX3Qgb3JpZ2luYWxTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25Ub0NhbGwgZnVuY3Rpb25Ub0NhbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19yZXN1bHRfdCBleHBlY3RlZFJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IGV4cGVjdGVkU3RhdGUpIHsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyICphYXVkaW9CdWlsZGVyID0gbnVsbHB0cjsKKyAgICBBQXVkaW9TdHJlYW0gKmFhdWRpb1N0cmVhbSA9IG51bGxwdHI7CisKKyAgICAvLyBVc2UgYW4gQUF1ZGlvU3RyZWFtQnVpbGRlciB0byBjb250YWluIHJlcXVlc3RlZCBwYXJhbWV0ZXJzLgorICAgIEFTU0VSVF9FUShBQVVESU9fT0ssIEFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyKCZhYXVkaW9CdWlsZGVyKSk7CisKKyAgICAvLyBSZXF1ZXN0IHN0cmVhbSBwcm9wZXJ0aWVzLgorICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RGF0YUNhbGxiYWNrKGFhdWRpb0J1aWxkZXIsIE5vb3BEYXRhQ2FsbGJhY2tQcm9jLCBudWxscHRyKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFBlcmZvcm1hbmNlTW9kZShhYXVkaW9CdWlsZGVyLCBwZXJmTW9kZSk7CisKKyAgICAvLyBDcmVhdGUgYW4gQUF1ZGlvU3RyZWFtIHVzaW5nIHRoZSBCdWlsZGVyLgorICAgIEFTU0VSVF9FUShBQVVESU9fT0ssIEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbShhYXVkaW9CdWlsZGVyLCAmYWF1ZGlvU3RyZWFtKSk7CisKKyAgICAvLyBWZXJpZnkgT3BlbiBTdGF0ZQorICAgIGFhdWRpb19zdHJlYW1fc3RhdGVfdCBzdGF0ZSA9IEFBVURJT19TVFJFQU1fU1RBVEVfVU5LTk9XTjsKKyAgICBFWFBFQ1RfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1fd2FpdEZvclN0YXRlQ2hhbmdlKGFhdWRpb1N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfVU5LTk9XTiwgJnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMCAqIE5BTk9TX1BFUl9NSUxMSVNFQ09ORCkpOworICAgIEVYUEVDVF9FUShBQVVESU9fU1RSRUFNX1NUQVRFX09QRU4sIHN0YXRlKTsKKworICAgIC8vIFB1dCBzdHJlYW0gaW50byBkZXNpcmVkIHN0YXRlLgorICAgIGFhdWRpb19zdHJlYW1fc3RhdGVfdCBpbnB1dFN0YXRlID0gQUFVRElPX1NUUkVBTV9TVEFURV9VTklOSVRJQUxJWkVEOworICAgIGlmIChvcmlnaW5hbFN0YXRlICE9IEFBVURJT19TVFJFQU1fU1RBVEVfT1BFTikgeworCisgICAgICAgIEFTU0VSVF9FUShBQVVESU9fT0ssIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoYWF1ZGlvU3RyZWFtKSk7CisKKyAgICAgICAgaWYgKG9yaWdpbmFsU3RhdGUgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVElORykgeworCisgICAgICAgICAgICBBU1NFUlRfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1fd2FpdEZvclN0YXRlQ2hhbmdlKGFhdWRpb1N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVElORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwICogTkFOT1NfUEVSX01JTExJU0VDT05EKSk7CisgICAgICAgICAgICBBU1NFUlRfRVEoQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVEVELCBzdGF0ZSk7CisKKyAgICAgICAgICAgIGlmIChvcmlnaW5hbFN0YXRlID09IEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBJTkcpIHsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0b3AoYWF1ZGlvU3RyZWFtKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG9yaWdpbmFsU3RhdGUgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUEVEKSB7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKEFBVURJT19PSywgQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdG9wKGFhdWRpb1N0cmVhbSkpOworICAgICAgICAgICAgICAgIGlucHV0U3RhdGUgPSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQSU5HOworICAgICAgICAgICAgfSBlbHNlIGlmIChvcmlnaW5hbFN0YXRlID09IEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0lORykgeworICAgICAgICAgICAgICAgIEFTU0VSVF9FUShBQVVESU9fT0ssIEFBdWRpb1N0cmVhbV9yZXF1ZXN0UGF1c2UoYWF1ZGlvU3RyZWFtKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG9yaWdpbmFsU3RhdGUgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTRUQpIHsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1fcmVxdWVzdFBhdXNlKGFhdWRpb1N0cmVhbSkpOworICAgICAgICAgICAgICAgIGlucHV0U3RhdGUgPSBBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNJTkc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBXYWl0IHVudGlsIHBhc3QgdHJhbnNpdGlvbmFsIHN0YXRlLgorICAgIGlmIChpbnB1dFN0YXRlICE9IEFBVURJT19TVFJFQU1fU1RBVEVfVU5JTklUSUFMSVpFRCkgeworICAgICAgICBBU1NFUlRfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1fd2FpdEZvclN0YXRlQ2hhbmdlKGFhdWRpb1N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwICogTkFOT1NfUEVSX01JTExJU0VDT05EKSk7CisgICAgICAgIEFTU0VSVF9FUShvcmlnaW5hbFN0YXRlLCBzdGF0ZSk7CisgICAgfQorCisgICAgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IHRyYW5zaXRpb25hbFN0YXRlID0gb3JpZ2luYWxTdGF0ZTsKKyAgICBzd2l0Y2goZnVuY3Rpb25Ub0NhbGwpIHsKKyAgICAgICAgY2FzZSBGdW5jdGlvblRvQ2FsbDo6Q0FMTF9TVEFSVDoKKyAgICAgICAgICAgIEVYUEVDVF9FUShleHBlY3RlZFJlc3VsdCwgQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydChhYXVkaW9TdHJlYW0pKTsKKyAgICAgICAgICAgIHRyYW5zaXRpb25hbFN0YXRlID0gQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVElORzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZ1bmN0aW9uVG9DYWxsOjpDQUxMX1NUT1A6CisgICAgICAgICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRSZXN1bHQsIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcChhYXVkaW9TdHJlYW0pKTsKKyAgICAgICAgICAgIHRyYW5zaXRpb25hbFN0YXRlID0gQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUElORzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZ1bmN0aW9uVG9DYWxsOjpDQUxMX1BBVVNFOgorICAgICAgICAgICAgRVhQRUNUX0VRKGV4cGVjdGVkUmVzdWx0LCBBQXVkaW9TdHJlYW1fcmVxdWVzdFBhdXNlKGFhdWRpb1N0cmVhbSkpOworICAgICAgICAgICAgdHJhbnNpdGlvbmFsU3RhdGUgPSBBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNJTkc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGdW5jdGlvblRvQ2FsbDo6Q0FMTF9GTFVTSDoKKyAgICAgICAgICAgIEVYUEVDVF9FUShleHBlY3RlZFJlc3VsdCwgQUF1ZGlvU3RyZWFtX3JlcXVlc3RGbHVzaChhYXVkaW9TdHJlYW0pKTsKKyAgICAgICAgICAgIHRyYW5zaXRpb25hbFN0YXRlID0gQUFVRElPX1NUUkVBTV9TVEFURV9GTFVTSElORzsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIEVYUEVDVF9FUShBQVVESU9fT0ssIEFBdWRpb1N0cmVhbV93YWl0Rm9yU3RhdGVDaGFuZ2UoYWF1ZGlvU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbmFsU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwICogTkFOT1NfUEVSX01JTExJU0VDT05EKSk7CisgICAgLy8gV2Ugc2hvdWxkIG5vdCBjaGFuZ2Ugc3RhdGUgd2hlbiBhIGZ1bmN0aW9uIGZhaWxzLgorICAgIGlmIChleHBlY3RlZFJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgQVNTRVJUX0VRKG9yaWdpbmFsU3RhdGUsIGV4cGVjdGVkU3RhdGUpOworICAgIH0KKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRTdGF0ZSwgc3RhdGUpOworICAgIGlmIChzdGF0ZSAhPSBleHBlY3RlZFN0YXRlKSB7CisgICAgICAgIHByaW50ZigiRVJST1IgLSBleHBlY3RlZCAlcywgYWN0dWFsID0gJXNcbiIsCisgICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRTdHJlYW1TdGF0ZVRvVGV4dChleHBlY3RlZFN0YXRlKSwKKyAgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFN0cmVhbVN0YXRlVG9UZXh0KHN0YXRlKSk7CisgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgIH0KKworICAgIEFBdWRpb1N0cmVhbV9jbG9zZShhYXVkaW9TdHJlYW0pOworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfZGVsZXRlKGFhdWRpb0J1aWxkZXIpOworfQorCisvLyBUT0RPIFVzZSBwYXJhbWV0ZXJpemVkIHRlc3RzIGluc3RlYWQgb2YgdGhlc2UgaW5kaXZpZHVhbCBzcGVjaWZpYyB0ZXN0cy4KKworLy8gT1BFTiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorVEVTVCh0ZXN0X3ZhcmlvdXMsIGFhdWRpb19zdGF0ZV9sb3dsYXRfb3Blbl9zdGFydCkgeworICAgIGNoZWNrU3RhdGVUcmFuc2l0aW9uKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZLAorICAgICAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9PUEVOLAorICAgICAgICAgICAgRnVuY3Rpb25Ub0NhbGw6OkNBTExfU1RBUlQsCisgICAgICAgICAgICBBQVVESU9fT0ssCisgICAgICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJURUQpOworfQorCitURVNUKHRlc3RfdmFyaW91cywgYWF1ZGlvX3N0YXRlX25vbmVfb3Blbl9zdGFydCkgeworICAgIGNoZWNrU3RhdGVUcmFuc2l0aW9uKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUsCisgICAgICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX09QRU4sCisgICAgICAgICAgICBGdW5jdGlvblRvQ2FsbDo6Q0FMTF9TVEFSVCwKKyAgICAgICAgICAgIEFBVURJT19PSywKKyAgICAgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRFRCk7Cit9CisKK1RFU1QodGVzdF92YXJpb3VzLCBhYXVkaW9fc3RhdGVfbG93bGF0X29wZW5fc3RvcCkgeworICAgIGNoZWNrU3RhdGVUcmFuc2l0aW9uKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZLAorICAgICAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9PUEVOLAorICAgICAgICAgICAgRnVuY3Rpb25Ub0NhbGw6OkNBTExfU1RPUCwKKyAgICAgICAgICAgIEFBVURJT19PSywKKyAgICAgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBFRCk7Cit9CisKK1RFU1QodGVzdF92YXJpb3VzLCBhYXVkaW9fc3RhdGVfbm9uZV9vcGVuX3N0b3ApIHsKKyAgICBjaGVja1N0YXRlVHJhbnNpdGlvbihBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FLAorICAgICAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9PUEVOLAorICAgICAgICAgICAgRnVuY3Rpb25Ub0NhbGw6OkNBTExfU1RPUCwKKyAgICAgICAgICAgIEFBVURJT19PSywKKyAgICAgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBFRCk7Cit9CisKK1RFU1QodGVzdF92YXJpb3VzLCBhYXVkaW9fc3RhdGVfbG93bGF0X29wZW5fcGF1c2UpIHsKKyAgICBjaGVja1N0YXRlVHJhbnNpdGlvbihBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSwKKyAgICAgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfT1BFTiwKKyAgICAgICAgICAgIEZ1bmN0aW9uVG9DYWxsOjpDQUxMX1BBVVNFLAorICAgICAgICAgICAgQUFVRElPX09LLAorICAgICAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTRUQpOworfQorCitURVNUKHRlc3RfdmFyaW91cywgYWF1ZGlvX3N0YXRlX25vbmVfb3Blbl9wYXVzZSkgeworICAgIGNoZWNrU3RhdGVUcmFuc2l0aW9uKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUsCisgICAgICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX09QRU4sCisgICAgICAgICAgICBGdW5jdGlvblRvQ2FsbDo6Q0FMTF9QQVVTRSwKKyAgICAgICAgICAgIEFBVURJT19PSywKKyAgICAgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0VEKTsKK30KKworVEVTVCh0ZXN0X3ZhcmlvdXMsIGFhdWRpb19zdGF0ZV9sb3dsYXRfb3Blbl9mbHVzaCkgeworICAgIGNoZWNrU3RhdGVUcmFuc2l0aW9uKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZLAorICAgICAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9PUEVOLAorICAgICAgICAgICAgRnVuY3Rpb25Ub0NhbGw6OkNBTExfRkxVU0gsCisgICAgICAgICAgICBBQVVESU9fT0ssCisgICAgICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX0ZMVVNIRUQpOworfQorCitURVNUKHRlc3RfdmFyaW91cywgYWF1ZGlvX3N0YXRlX25vbmVfb3Blbl9mbHVzaCkgeworICAgIGNoZWNrU3RhdGVUcmFuc2l0aW9uKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUsCisgICAgICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX09QRU4sCisgICAgICAgICAgICBGdW5jdGlvblRvQ2FsbDo6Q0FMTF9GTFVTSCwKKyAgICAgICAgICAgIEFBVURJT19PSywKKyAgICAgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfRkxVU0hFRCk7Cit9CisKKworLy8gU1RBUlRFRCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorVEVTVCh0ZXN0X3ZhcmlvdXMsIGFhdWRpb19zdGF0ZV9sb3dsYXRfc3RhcnRlZF9zdGFydCkgeworICAgIGNoZWNrU3RhdGVUcmFuc2l0aW9uKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZLAorICAgICAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVEVELAorICAgICAgICAgICAgRnVuY3Rpb25Ub0NhbGw6OkNBTExfU1RBUlQsCisgICAgICAgICAgICBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURSwKKyAgICAgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRFRCk7Cit9CisKK1RFU1QodGVzdF92YXJpb3VzLCBhYXVkaW9fc3RhdGVfbm9uZV9zdGFydGVkX3N0YXJ0KSB7CisgICAgY2hlY2tTdGF0ZVRyYW5zaXRpb24oQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORSwKKyAgICAgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRFRCwKKyAgICAgICAgICAgIEZ1bmN0aW9uVG9DYWxsOjpDQUxMX1NUQVJULAorICAgICAgICAgICAgQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEUsCisgICAgICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJURUQpOworfQorCitURVNUKHRlc3RfdmFyaW91cywgYWF1ZGlvX3N0YXRlX2xvd2xhdF9zdGFydGVkX3N0b3ApIHsKKyAgICBjaGVja1N0YXRlVHJhbnNpdGlvbihBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSwKKyAgICAgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRFRCwKKyAgICAgICAgICAgIEZ1bmN0aW9uVG9DYWxsOjpDQUxMX1NUT1AsCisgICAgICAgICAgICBBQVVESU9fT0ssCisgICAgICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQRUQpOworfQorCitURVNUKHRlc3RfdmFyaW91cywgYWF1ZGlvX3N0YXRlX25vbmVfc3RhcnRlZF9zdG9wKSB7CisgICAgY2hlY2tTdGF0ZVRyYW5zaXRpb24oQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORSwKKyAgICAgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRFRCwKKyAgICAgICAgICAgIEZ1bmN0aW9uVG9DYWxsOjpDQUxMX1NUT1AsCisgICAgICAgICAgICBBQVVESU9fT0ssCisgICAgICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQRUQpOworfQorCitURVNUKHRlc3RfdmFyaW91cywgYWF1ZGlvX3N0YXRlX2xvd2xhdF9zdGFydGVkX3BhdXNlKSB7CisgICAgY2hlY2tTdGF0ZVRyYW5zaXRpb24oQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1ksCisgICAgICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJURUQsCisgICAgICAgICAgICBGdW5jdGlvblRvQ2FsbDo6Q0FMTF9QQVVTRSwKKyAgICAgICAgICAgIEFBVURJT19PSywKKyAgICAgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0VEKTsKK30KKworVEVTVCh0ZXN0X3ZhcmlvdXMsIGFhdWRpb19zdGF0ZV9ub25lX3N0YXJ0ZWRfcGF1c2UpIHsKKyAgICBjaGVja1N0YXRlVHJhbnNpdGlvbihBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FLAorICAgICAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVEVELAorICAgICAgICAgICAgRnVuY3Rpb25Ub0NhbGw6OkNBTExfUEFVU0UsCisgICAgICAgICAgICBBQVVESU9fT0ssCisgICAgICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNFRCk7Cit9CisKK1RFU1QodGVzdF92YXJpb3VzLCBhYXVkaW9fc3RhdGVfbG93bGF0X3N0YXJ0ZWRfZmx1c2gpIHsKKyAgICBjaGVja1N0YXRlVHJhbnNpdGlvbihBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSwKKyAgICAgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRFRCwKKyAgICAgICAgICAgIEZ1bmN0aW9uVG9DYWxsOjpDQUxMX0ZMVVNILAorICAgICAgICAgICAgQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEUsCisgICAgICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJURUQpOworfQorCitURVNUKHRlc3RfdmFyaW91cywgYWF1ZGlvX3N0YXRlX25vbmVfc3RhcnRlZF9mbHVzaCkgeworICAgIGNoZWNrU3RhdGVUcmFuc2l0aW9uKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUsCisgICAgICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJURUQsCisgICAgICAgICAgICBGdW5jdGlvblRvQ2FsbDo6Q0FMTF9GTFVTSCwKKyAgICAgICAgICAgIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFLAorICAgICAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVEVEKTsKK30KKworLy8gU1RPUFBFRCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorVEVTVCh0ZXN0X3ZhcmlvdXMsIGFhdWRpb19zdGF0ZV9sb3dsYXRfc3RvcHBlZF9zdGFydCkgeworICAgIGNoZWNrU3RhdGVUcmFuc2l0aW9uKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZLAorICAgICAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUEVELAorICAgICAgICAgICAgRnVuY3Rpb25Ub0NhbGw6OkNBTExfU1RBUlQsCisgICAgICAgICAgICBBQVVESU9fT0ssCisgICAgICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJURUQpOworfQorCitURVNUKHRlc3RfdmFyaW91cywgYWF1ZGlvX3N0YXRlX25vbmVfc3RvcHBlZF9zdGFydCkgeworICAgIGNoZWNrU3RhdGVUcmFuc2l0aW9uKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUsCisgICAgICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQRUQsCisgICAgICAgICAgICBGdW5jdGlvblRvQ2FsbDo6Q0FMTF9TVEFSVCwKKyAgICAgICAgICAgIEFBVURJT19PSywKKyAgICAgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRFRCk7Cit9CisKK1RFU1QodGVzdF92YXJpb3VzLCBhYXVkaW9fc3RhdGVfbG93bGF0X3N0b3BwZWRfc3RvcCkgeworICAgIGNoZWNrU3RhdGVUcmFuc2l0aW9uKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZLAorICAgICAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUEVELAorICAgICAgICAgICAgRnVuY3Rpb25Ub0NhbGw6OkNBTExfU1RPUCwKKyAgICAgICAgICAgIEFBVURJT19PSywKKyAgICAgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBFRCk7Cit9CisKK1RFU1QodGVzdF92YXJpb3VzLCBhYXVkaW9fc3RhdGVfbm9uZV9zdG9wcGVkX3N0b3ApIHsKKyAgICBjaGVja1N0YXRlVHJhbnNpdGlvbihBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FLAorICAgICAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUEVELAorICAgICAgICAgICAgRnVuY3Rpb25Ub0NhbGw6OkNBTExfU1RPUCwKKyAgICAgICAgICAgIEFBVURJT19PSywKKyAgICAgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBFRCk7Cit9CisKK1RFU1QodGVzdF92YXJpb3VzLCBhYXVkaW9fc3RhdGVfbG93bGF0X3N0b3BwZWRfcGF1c2UpIHsKKyAgICBjaGVja1N0YXRlVHJhbnNpdGlvbihBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSwKKyAgICAgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBFRCwKKyAgICAgICAgICAgIEZ1bmN0aW9uVG9DYWxsOjpDQUxMX1BBVVNFLAorICAgICAgICAgICAgQUFVRElPX09LLAorICAgICAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTRUQpOworfQorCitURVNUKHRlc3RfdmFyaW91cywgYWF1ZGlvX3N0YXRlX25vbmVfc3RvcHBlZF9wYXVzZSkgeworICAgIGNoZWNrU3RhdGVUcmFuc2l0aW9uKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUsCisgICAgICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQRUQsCisgICAgICAgICAgICBGdW5jdGlvblRvQ2FsbDo6Q0FMTF9QQVVTRSwKKyAgICAgICAgICAgIEFBVURJT19PSywKKyAgICAgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0VEKTsKK30KKworVEVTVCh0ZXN0X3ZhcmlvdXMsIGFhdWRpb19zdGF0ZV9sb3dsYXRfc3RvcHBlZF9mbHVzaCkgeworICAgIGNoZWNrU3RhdGVUcmFuc2l0aW9uKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZLAorICAgICAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUEVELAorICAgICAgICAgICAgRnVuY3Rpb25Ub0NhbGw6OkNBTExfRkxVU0gsCisgICAgICAgICAgICBBQVVESU9fT0ssCisgICAgICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX0ZMVVNIRUQpOworfQorCitURVNUKHRlc3RfdmFyaW91cywgYWF1ZGlvX3N0YXRlX25vbmVfc3RvcHBlZF9mbHVzaCkgeworICAgIGNoZWNrU3RhdGVUcmFuc2l0aW9uKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUsCisgICAgICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQRUQsCisgICAgICAgICAgICBGdW5jdGlvblRvQ2FsbDo6Q0FMTF9GTFVTSCwKKyAgICAgICAgICAgIEFBVURJT19PSywKKyAgICAgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfRkxVU0hFRCk7Cit9CisKKy8vIFBBVVNFRCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorVEVTVCh0ZXN0X3ZhcmlvdXMsIGFhdWRpb19zdGF0ZV9sb3dsYXRfcGF1c2VkX3N0YXJ0KSB7CitjaGVja1N0YXRlVHJhbnNpdGlvbihBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSwKKyAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTRUQsCisgICAgICAgIEZ1bmN0aW9uVG9DYWxsOjpDQUxMX1NUQVJULAorICAgICAgICBBQVVESU9fT0ssCisgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRFRCk7Cit9CisKK1RFU1QodGVzdF92YXJpb3VzLCBhYXVkaW9fc3RhdGVfbm9uZV9wYXVzZWRfc3RhcnQpIHsKK2NoZWNrU3RhdGVUcmFuc2l0aW9uKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUsCisgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0VELAorICAgICAgICBGdW5jdGlvblRvQ2FsbDo6Q0FMTF9TVEFSVCwKKyAgICAgICAgQUFVRElPX09LLAorICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJURUQpOworfQorCitURVNUKHRlc3RfdmFyaW91cywgYWF1ZGlvX3N0YXRlX2xvd2xhdF9wYXVzZWRfc3RvcCkgeworY2hlY2tTdGF0ZVRyYW5zaXRpb24oQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1ksCisgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0VELAorICAgICAgICBGdW5jdGlvblRvQ2FsbDo6Q0FMTF9TVE9QLAorICAgICAgICBBQVVESU9fT0ssCisgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBFRCk7Cit9CisKK1RFU1QodGVzdF92YXJpb3VzLCBhYXVkaW9fc3RhdGVfbm9uZV9wYXVzZWRfc3RvcCkgeworY2hlY2tTdGF0ZVRyYW5zaXRpb24oQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORSwKKyAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTRUQsCisgICAgICAgIEZ1bmN0aW9uVG9DYWxsOjpDQUxMX1NUT1AsCisgICAgICAgIEFBVURJT19PSywKKyAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUEVEKTsKK30KKworVEVTVCh0ZXN0X3ZhcmlvdXMsIGFhdWRpb19zdGF0ZV9sb3dsYXRfcGF1c2VkX3BhdXNlKSB7CitjaGVja1N0YXRlVHJhbnNpdGlvbihBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSwKKyAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTRUQsCisgICAgICAgIEZ1bmN0aW9uVG9DYWxsOjpDQUxMX1BBVVNFLAorICAgICAgICBBQVVESU9fT0ssCisgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0VEKTsKK30KKworVEVTVCh0ZXN0X3ZhcmlvdXMsIGFhdWRpb19zdGF0ZV9ub25lX3BhdXNlZF9wYXVzZSkgeworY2hlY2tTdGF0ZVRyYW5zaXRpb24oQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORSwKKyAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTRUQsCisgICAgICAgIEZ1bmN0aW9uVG9DYWxsOjpDQUxMX1BBVVNFLAorICAgICAgICBBQVVESU9fT0ssCisgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0VEKTsKK30KKworVEVTVCh0ZXN0X3ZhcmlvdXMsIGFhdWRpb19zdGF0ZV9sb3dsYXRfcGF1c2VkX2ZsdXNoKSB7CitjaGVja1N0YXRlVHJhbnNpdGlvbihBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSwKKyAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTRUQsCisgICAgICAgIEZ1bmN0aW9uVG9DYWxsOjpDQUxMX0ZMVVNILAorICAgICAgICBBQVVESU9fT0ssCisgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfRkxVU0hFRCk7Cit9CisKK1RFU1QodGVzdF92YXJpb3VzLCBhYXVkaW9fc3RhdGVfbm9uZV9wYXVzZWRfZmx1c2gpIHsKK2NoZWNrU3RhdGVUcmFuc2l0aW9uKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUsCisgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0VELAorICAgICAgICBGdW5jdGlvblRvQ2FsbDo6Q0FMTF9GTFVTSCwKKyAgICAgICAgQUFVRElPX09LLAorICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX0ZMVVNIRUQpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorVEVTVCh0ZXN0X3ZhcmlvdXMsIGFhdWRpb19zZXRfYnVmZmVyX3NpemUpIHsKKworICAgIGludDMyX3QgYnVmZmVyQ2FwYWNpdHk7CisgICAgaW50MzJfdCBmcmFtZXNQZXJCdXJzdCA9IDA7CisgICAgaW50MzJfdCBhY3R1YWxTaXplID0gMDsKKworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXIgKmFhdWRpb0J1aWxkZXIgPSBudWxscHRyOworICAgIEFBdWRpb1N0cmVhbSAqYWF1ZGlvU3RyZWFtID0gbnVsbHB0cjsKKworICAgIC8vIFVzZSBhbiBBQXVkaW9TdHJlYW1CdWlsZGVyIHRvIGNvbnRhaW4gcmVxdWVzdGVkIHBhcmFtZXRlcnMuCisgICAgQVNTRVJUX0VRKEFBVURJT19PSywgQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIoJmFhdWRpb0J1aWxkZXIpKTsKKworICAgIC8vIFJlcXVlc3Qgc3RyZWFtIHByb3BlcnRpZXMuCisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXREYXRhQ2FsbGJhY2soYWF1ZGlvQnVpbGRlciwgTm9vcERhdGFDYWxsYmFja1Byb2MsIG51bGxwdHIpOworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0UGVyZm9ybWFuY2VNb2RlKGFhdWRpb0J1aWxkZXIsIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZKTsKKworICAgIC8vIENyZWF0ZSBhbiBBQXVkaW9TdHJlYW0gdXNpbmcgdGhlIEJ1aWxkZXIuCisgICAgRVhQRUNUX0VRKEFBVURJT19PSywgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKGFhdWRpb0J1aWxkZXIsICZhYXVkaW9TdHJlYW0pKTsKKworICAgIC8vIFRoaXMgaXMgdGhlIG51bWJlciBvZiBmcmFtZXMgdGhhdCBhcmUgcmVhZCBpbiBvbmUgY2h1bmsgYnkgYSBETUEgY29udHJvbGxlcgorICAgIC8vIG9yIGEgRFNQIG9yIGEgbWl4ZXIuCisgICAgZnJhbWVzUGVyQnVyc3QgPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUGVyQnVyc3QoYWF1ZGlvU3RyZWFtKTsKKyAgICBidWZmZXJDYXBhY2l0eSA9IEFBdWRpb1N0cmVhbV9nZXRCdWZmZXJDYXBhY2l0eUluRnJhbWVzKGFhdWRpb1N0cmVhbSk7CisgICAgcHJpbnRmKCIgICAgICAgICAgYnVmZmVyQ2FwYWNpdHkgPSAlZCwgcmVtYWluZGVyID0gJWRcbiIsCisgICAgICAgICAgIGJ1ZmZlckNhcGFjaXR5LCBidWZmZXJDYXBhY2l0eSAlIGZyYW1lc1BlckJ1cnN0KTsKKworICAgIGFjdHVhbFNpemUgPSBBQXVkaW9TdHJlYW1fc2V0QnVmZmVyU2l6ZUluRnJhbWVzKGFhdWRpb1N0cmVhbSwgMCk7CisgICAgRVhQRUNUX0dUKGFjdHVhbFNpemUsIDApOworICAgIEVYUEVDVF9MRShhY3R1YWxTaXplLCBidWZmZXJDYXBhY2l0eSk7CisKKyAgICBhY3R1YWxTaXplID0gQUF1ZGlvU3RyZWFtX3NldEJ1ZmZlclNpemVJbkZyYW1lcyhhYXVkaW9TdHJlYW0sIDIgKiBmcmFtZXNQZXJCdXJzdCk7CisgICAgRVhQRUNUX0dUKGFjdHVhbFNpemUsIGZyYW1lc1BlckJ1cnN0KTsKKyAgICBFWFBFQ1RfTEUoYWN0dWFsU2l6ZSwgYnVmZmVyQ2FwYWNpdHkpOworCisgICAgYWN0dWFsU2l6ZSA9IEFBdWRpb1N0cmVhbV9zZXRCdWZmZXJTaXplSW5GcmFtZXMoYWF1ZGlvU3RyZWFtLCBidWZmZXJDYXBhY2l0eSAtIDEpOworICAgIEVYUEVDVF9HVChhY3R1YWxTaXplLCBmcmFtZXNQZXJCdXJzdCk7CisgICAgRVhQRUNUX0xFKGFjdHVhbFNpemUsIGJ1ZmZlckNhcGFjaXR5KTsKKworICAgIGFjdHVhbFNpemUgPSBBQXVkaW9TdHJlYW1fc2V0QnVmZmVyU2l6ZUluRnJhbWVzKGFhdWRpb1N0cmVhbSwgYnVmZmVyQ2FwYWNpdHkpOworICAgIEVYUEVDVF9HVChhY3R1YWxTaXplLCBmcmFtZXNQZXJCdXJzdCk7CisgICAgRVhQRUNUX0xFKGFjdHVhbFNpemUsIGJ1ZmZlckNhcGFjaXR5KTsKKworICAgIGFjdHVhbFNpemUgPSBBQXVkaW9TdHJlYW1fc2V0QnVmZmVyU2l6ZUluRnJhbWVzKGFhdWRpb1N0cmVhbSwgYnVmZmVyQ2FwYWNpdHkgKyAxKTsKKyAgICBFWFBFQ1RfR1QoYWN0dWFsU2l6ZSwgZnJhbWVzUGVyQnVyc3QpOworICAgIEVYUEVDVF9MRShhY3R1YWxTaXplLCBidWZmZXJDYXBhY2l0eSk7CisKKyAgICBhY3R1YWxTaXplID0gQUF1ZGlvU3RyZWFtX3NldEJ1ZmZlclNpemVJbkZyYW1lcyhhYXVkaW9TdHJlYW0sIDEyMzQ1NjcpOworICAgIEVYUEVDVF9HVChhY3R1YWxTaXplLCBmcmFtZXNQZXJCdXJzdCk7CisgICAgRVhQRUNUX0xFKGFjdHVhbFNpemUsIGJ1ZmZlckNhcGFjaXR5KTsKKworICAgIGFjdHVhbFNpemUgPSBBQXVkaW9TdHJlYW1fc2V0QnVmZmVyU2l6ZUluRnJhbWVzKGFhdWRpb1N0cmVhbSwgSU5UMzJfTUFYKTsKKyAgICBFWFBFQ1RfR1QoYWN0dWFsU2l6ZSwgZnJhbWVzUGVyQnVyc3QpOworICAgIEVYUEVDVF9MRShhY3R1YWxTaXplLCBidWZmZXJDYXBhY2l0eSk7CisKKyAgICBhY3R1YWxTaXplID0gQUF1ZGlvU3RyZWFtX3NldEJ1ZmZlclNpemVJbkZyYW1lcyhhYXVkaW9TdHJlYW0sIElOVDMyX01JTik7CisgICAgRVhQRUNUX0dUKGFjdHVhbFNpemUsIDApOworICAgIEVYUEVDVF9MRShhY3R1YWxTaXplLCBidWZmZXJDYXBhY2l0eSk7CisKKyAgICBBQXVkaW9TdHJlYW1fY2xvc2UoYWF1ZGlvU3RyZWFtKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX2RlbGV0ZShhYXVkaW9CdWlsZGVyKTsKK30KKworLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBUZXN0IHRvIG1ha2Ugc3VyZSB0aGF0IEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUCB3b3Jrcy4KKworLy8gQ2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBjb3VudHMgY2FsbHMuCithYXVkaW9fZGF0YV9jYWxsYmFja19yZXN1bHRfdCBDYWxsYmFja09uY2VQcm9jKAorICAgICAgICBBQXVkaW9TdHJlYW0gKnN0cmVhbSwKKyAgICAgICAgdm9pZCAqdXNlckRhdGEsCisgICAgICAgIHZvaWQgKmF1ZGlvRGF0YSwKKyAgICAgICAgaW50MzJfdCBudW1GcmFtZXMKKykgeworICAgICh2b2lkKSBzdHJlYW07CisgICAgKHZvaWQpIGF1ZGlvRGF0YTsKKyAgICAodm9pZCkgbnVtRnJhbWVzOworCisgICAgc3RkOjphdG9taWM8aW50MzJfdD4gKmNhbGxiYWNrQ291bnRQdHIgPSAoc3RkOjphdG9taWM8aW50MzJfdD4gKil1c2VyRGF0YTsKKyAgICAoKmNhbGxiYWNrQ291bnRQdHIpKys7CisKKyAgICByZXR1cm4gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QOworfQorCit2b2lkIGNoZWNrQ2FsbGJhY2tPbmNlKGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZk1vZGUpIHsKKworICAgIHN0ZDo6YXRvbWljPGludDMyX3Q+ICAgY2FsbGJhY2tDb3VudHswfTsKKworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXIgKmFhdWRpb0J1aWxkZXIgPSBudWxscHRyOworICAgIEFBdWRpb1N0cmVhbSAqYWF1ZGlvU3RyZWFtID0gbnVsbHB0cjsKKworICAgIC8vIFVzZSBhbiBBQXVkaW9TdHJlYW1CdWlsZGVyIHRvIGNvbnRhaW4gcmVxdWVzdGVkIHBhcmFtZXRlcnMuCisgICAgQVNTRVJUX0VRKEFBVURJT19PSywgQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIoJmFhdWRpb0J1aWxkZXIpKTsKKworICAgIC8vIFJlcXVlc3Qgc3RyZWFtIHByb3BlcnRpZXMuCisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXREYXRhQ2FsbGJhY2soYWF1ZGlvQnVpbGRlciwgQ2FsbGJhY2tPbmNlUHJvYywgJmNhbGxiYWNrQ291bnQpOworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0UGVyZm9ybWFuY2VNb2RlKGFhdWRpb0J1aWxkZXIsIHBlcmZNb2RlKTsKKworICAgIC8vIENyZWF0ZSBhbiBBQXVkaW9TdHJlYW0gdXNpbmcgdGhlIEJ1aWxkZXIuCisgICAgQVNTRVJUX0VRKEFBVURJT19PSywgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKGFhdWRpb0J1aWxkZXIsICZhYXVkaW9TdHJlYW0pKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX2RlbGV0ZShhYXVkaW9CdWlsZGVyKTsKKworICAgIEFTU0VSVF9FUShBQVVESU9fT0ssIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoYWF1ZGlvU3RyZWFtKSk7CisKKyAgICBzbGVlcCgxKTsgLy8gR2l2ZSBjYWxsYmFjayBhIGNoYW5jZSB0byBydW4gbWFueSB0aW1lcy4KKworICAgIEVYUEVDVF9FUShBQVVESU9fT0ssIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcChhYXVkaW9TdHJlYW0pKTsKKworICAgIEVYUEVDVF9FUSgxLCBjYWxsYmFja0NvdW50LmxvYWQoKSk7IC8vIHNob3VsZCBzdG9wIGFmdGVyIGZpcnN0IGNhbGwKKworICAgIEVYUEVDVF9FUShBQVVESU9fT0ssIEFBdWRpb1N0cmVhbV9jbG9zZShhYXVkaW9TdHJlYW0pKTsKK30KKworVEVTVCh0ZXN0X3ZhcmlvdXMsIGFhdWRpb19jYWxsYmFja19vbmNlX25vbmUpIHsKKyAgICBjaGVja0NhbGxiYWNrT25jZShBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FKTsKK30KKworVEVTVCh0ZXN0X3ZhcmlvdXMsIGFhdWRpb19jYWxsYmFja19vbmNlX2xvd2xhdCkgeworICAgIGNoZWNrQ2FsbGJhY2tPbmNlKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZKTsKK30KKworLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdHJ1Y3QgV2FrZVVwQ2FsbGJhY2tEYXRhIHsKKyAgICB2b2lkIHdha2VPdGhlcigpIHsKKyAgICAgICAgLy8gc2lnbmFsIHdhaXRpbmcgdGVzdCB0byB3YWtlIHVwCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZCA8c3RkOjptdXRleD4gbG9jayhtdXRleCk7CisgICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgY29uZGl0aW9uVmFyaWFibGUubm90aWZ5X29uZSgpOworICAgIH0KKworICAgIHZvaWQgd2FpdEZvckZpbmlzaGVkKCkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrIDxzdGQ6Om11dGV4PiBhTG9jayhtdXRleCk7CisgICAgICAgIGNvbmRpdGlvblZhcmlhYmxlLndhaXQoYUxvY2ssIFs9XSB7IHJldHVybiBmaW5pc2hlZDsgfSk7CisgICAgfQorCisgICAgLy8gRm9yIHNpZ25hbGxpbmcgZm9yZWdyb3VuZCB0ZXN0IHdoZW4gY2FsbGJhY2sgZmluaXNoZWQKKyAgICBzdGQ6Om11dGV4ICAgICAgICAgICAgICBtdXRleDsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBjb25kaXRpb25WYXJpYWJsZTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZCA9IGZhbHNlOworfTsKKworLy8gVGVzdCB0byBtYWtlIHN1cmUgd2UgY2Fubm90IGNhbGwgcmVjdXJzaXZlbHkgaW50byB0aGUgc3lzdGVtIGZyb20gYSBjYWxsYmFjay4KK3N0cnVjdCBEYW5nZXJvdXNEYXRhIDogcHVibGljIFdha2VVcENhbGxiYWNrRGF0YSB7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdFN0YXJ0ID0gQUFVRElPX09LOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHRTdG9wID0gQUFVRElPX09LOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHRQYXVzZSA9IEFBVURJT19PSzsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0Rmx1c2ggPSBBQVVESU9fT0s7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdENsb3NlID0gQUFVRElPX09LOworfTsKKworLy8gQ2FsbGJhY2sgZnVuY3Rpb24gdGhhdCB0cmllcyB0byBjYWxsIGJhY2sgaW50byB0aGUgc3RyZWFtLgorYWF1ZGlvX2RhdGFfY2FsbGJhY2tfcmVzdWx0X3QgRGFuZ2Vyb3VzRGF0YUNhbGxiYWNrUHJvYygKKyAgICAgICAgQUF1ZGlvU3RyZWFtICpzdHJlYW0sCisgICAgICAgIHZvaWQgKnVzZXJEYXRhLAorICAgICAgICB2b2lkICphdWRpb0RhdGEsCisgICAgICAgIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgKHZvaWQpIGF1ZGlvRGF0YTsKKyAgICAodm9pZCkgbnVtRnJhbWVzOworCisgICAgRGFuZ2Vyb3VzRGF0YSAqZGF0YSA9IChEYW5nZXJvdXNEYXRhICopdXNlckRhdGE7CisgICAgZGF0YS0+cmVzdWx0U3RhcnQgPSBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KHN0cmVhbSk7CisgICAgZGF0YS0+cmVzdWx0U3RvcCA9IEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcChzdHJlYW0pOworICAgIGRhdGEtPnJlc3VsdFBhdXNlID0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RQYXVzZShzdHJlYW0pOworICAgIGRhdGEtPnJlc3VsdEZsdXNoID0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RGbHVzaChzdHJlYW0pOworICAgIGRhdGEtPnJlc3VsdENsb3NlID0gQUF1ZGlvU3RyZWFtX2Nsb3NlKHN0cmVhbSk7CisKKyAgICBkYXRhLT53YWtlT3RoZXIoKTsKKworICAgIHJldHVybiBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1A7Cit9CisKKy8vaW50IG1haW4oKSB7IC8vIFRvIGZpeCBBbmRyb2lkIFN0dWRpbyBmb3JtYXR0aW5nIHdoZW4gZWRpdGluZy4KK3ZvaWQgY2hlY2tEYW5nZXJvdXNDYWxsYmFjayhhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IHBlcmZNb2RlKSB7CisgICAgRGFuZ2Vyb3VzRGF0YSAgICAgICAgZGFuZ2Vyb3VzRGF0YTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyICphYXVkaW9CdWlsZGVyID0gbnVsbHB0cjsKKyAgICBBQXVkaW9TdHJlYW0gICAgICAgICphYXVkaW9TdHJlYW0gPSBudWxscHRyOworCisgICAgLy8gVXNlIGFuIEFBdWRpb1N0cmVhbUJ1aWxkZXIgdG8gY29udGFpbiByZXF1ZXN0ZWQgcGFyYW1ldGVycy4KKyAgICBBU1NFUlRfRVEoQUFVRElPX09LLCBBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlcigmYWF1ZGlvQnVpbGRlcikpOworCisgICAgLy8gUmVxdWVzdCBzdHJlYW0gcHJvcGVydGllcy4KKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldERhdGFDYWxsYmFjayhhYXVkaW9CdWlsZGVyLCBEYW5nZXJvdXNEYXRhQ2FsbGJhY2tQcm9jLCAmZGFuZ2Vyb3VzRGF0YSk7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRQZXJmb3JtYW5jZU1vZGUoYWF1ZGlvQnVpbGRlciwgcGVyZk1vZGUpOworCisgICAgLy8gQ3JlYXRlIGFuIEFBdWRpb1N0cmVhbSB1c2luZyB0aGUgQnVpbGRlci4KKyAgICBBU1NFUlRfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oYWF1ZGlvQnVpbGRlciwgJmFhdWRpb1N0cmVhbSkpOworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfZGVsZXRlKGFhdWRpb0J1aWxkZXIpOworCisgICAgQVNTRVJUX0VRKEFBVURJT19PSywgQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydChhYXVkaW9TdHJlYW0pKTsKKworICAgIGRhbmdlcm91c0RhdGEud2FpdEZvckZpbmlzaGVkKCk7CisKKyAgICBFWFBFQ1RfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0b3AoYWF1ZGlvU3RyZWFtKSk7CisKKyAgICBFWFBFQ1RfRVEoQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEUsIGRhbmdlcm91c0RhdGEucmVzdWx0U3RhcnQpOworICAgIEVYUEVDVF9FUShBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURSwgZGFuZ2Vyb3VzRGF0YS5yZXN1bHRTdG9wKTsKKyAgICBFWFBFQ1RfRVEoQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEUsIGRhbmdlcm91c0RhdGEucmVzdWx0UGF1c2UpOworICAgIEVYUEVDVF9FUShBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURSwgZGFuZ2Vyb3VzRGF0YS5yZXN1bHRGbHVzaCk7CisgICAgRVhQRUNUX0VRKEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFLCBkYW5nZXJvdXNEYXRhLnJlc3VsdENsb3NlKTsKKworICAgIEVYUEVDVF9FUShBQVVESU9fT0ssIEFBdWRpb1N0cmVhbV9jbG9zZShhYXVkaW9TdHJlYW0pKTsKK30KKworLy9pbnQgbWFpbigpIHsgLy8gVG8gZml4IEFuZHJvaWQgU3R1ZGlvIGZvcm1hdHRpbmcgd2hlbiBlZGl0aW5nLgorCitURVNUKHRlc3RfdmFyaW91cywgYWF1ZGlvX2NhbGxiYWNrX2Jsb2NrZXJzX25vbmUpIHsKKyAgICBjaGVja0Rhbmdlcm91c0NhbGxiYWNrKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUpOworfQorCitURVNUKHRlc3RfdmFyaW91cywgYWF1ZGlvX2NhbGxiYWNrX2Jsb2NrZXJzX2xvd2xhdCkgeworICAgIGNoZWNrRGFuZ2Vyb3VzQ2FsbGJhY2soQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1kpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQW5kcm9pZC5icCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0FuZHJvaWQuYnAKaW5kZXggNjFjOTQ2Yy4uMmRmMzdhOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BbmRyb2lkLmJwCkBAIC02LDcgKzYsMjIgQEAKIAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJhdWRpb2NsaWVudCIsCisKKyAgICBhaWRsOiB7CisgICAgICAgIGV4cG9ydF9haWRsX2hlYWRlcnM6IHRydWUsCisgICAgICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJhaWRsIl0sCisgICAgICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbCIsCisgICAgICAgIF0sCisgICAgfSwKKwogICAgIHNyY3M6IFsKKyAgICAgICAgLy8gQUlETCBmaWxlcyBmb3IgYXVkaW9jbGllbnQgaW50ZXJmYWNlcworICAgICAgICAvLyBUaGUgaGVhZGVycyBmb3IgdGhlc2UgaW50ZXJmYWNlcyB3aWxsIGJlIGF2YWlsYWJsZSB0byBhbnkgbW9kdWxlcyB0aGF0CisgICAgICAgIC8vIGluY2x1ZGUgbGliYXVkaW9jbGllbnQsIGF0IHRoZSBwYXRoICJhaWRsL3BhY2thZ2UvcGF0aC9CbkZvby5oIgorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb1JlY29yZC5haWRsIiwKKyAgICAgICAgIjpsaWJhdWRpb2NsaWVudF9haWRsIiwKKwogICAgICAgICAiQXVkaW9FZmZlY3QuY3BwIiwKICAgICAgICAgIkF1ZGlvUG9saWN5LmNwcCIsCiAgICAgICAgICJBdWRpb1JlY29yZC5jcHAiLApAQCAtMTcsNyArMzIsNiBAQAogICAgICAgICAiSUF1ZGlvRmxpbmdlckNsaWVudC5jcHAiLAogICAgICAgICAiSUF1ZGlvUG9saWN5U2VydmljZS5jcHAiLAogICAgICAgICAiSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5jcHAiLAotICAgICAgICAiSUF1ZGlvUmVjb3JkLmNwcCIsCiAgICAgICAgICJJQXVkaW9UcmFjay5jcHAiLAogICAgICAgICAiSUVmZmVjdC5jcHAiLAogICAgICAgICAiSUVmZmVjdENsaWVudC5jcHAiLApAQCAtMzMsMTAgKzQ3LDEyIEBACiAgICAgICAgICJsaWJkbCIsCiAgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKICAgICAgICAgImxpYmF1ZGlvbWFuYWdlciIsCisgICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAorICAgICAgICAibGlibWVkaWFtZXRyaWNzIiwKICAgICBdLAogICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsibGliYmluZGVyIl0sCiAKLSAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZS9tZWRpYSJdLAorICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJpbmNsdWRlL21lZGlhIiwgImFpZGwiXSwKICAgICBoZWFkZXJfbGliczogWyJsaWJhdWRpb2NsaWVudF9oZWFkZXJzIl0sCiAgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWyJsaWJhdWRpb2NsaWVudF9oZWFkZXJzIl0sCiAKQEAgLTU2LDMgKzcyLDExIEBACiAgICAgICAgIF0sCiAgICAgfSwKIH0KKworLy8gQUlETCBpbnRlcmZhY2UgYmV0d2VlbiBsaWJhdWRpb2NsaWVudCBhbmQgZnJhbWV3b3JrLmphcgorZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAibGliYXVkaW9jbGllbnRfYWlkbCIsCisgICAgc3JjczogWworICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0lQbGF5ZXIuYWlkbCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUmVjb3JkLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUmVjb3JkLmNwcAppbmRleCBiYTRhY2M2Li5mOWRmNWIxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1JlY29yZC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9SZWNvcmQuY3BwCkBAIC0yNiw2ICsyNiw4IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvRmxpbmdlci5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgorI2luY2x1ZGUgPG1lZGlhL1R5cGVDb252ZXJ0ZXIuaD4KIAogI2RlZmluZSBXQUlUX1BFUklPRF9NUyAgICAgICAgICAxMAogCkBAIC02NSwxMiArNjcsOTAgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKK3N0YXRpYyBzdGQ6OnN0cmluZyBhdWRpb0Zvcm1hdFR5cGVTdHJpbmcoYXVkaW9fZm9ybWF0X3QgdmFsdWUpIHsKKyAgICBzdGQ6OnN0cmluZyBmb3JtYXRUeXBlOworICAgIGlmIChGb3JtYXRDb252ZXJ0ZXI6OnRvU3RyaW5nKHZhbHVlLCBmb3JtYXRUeXBlKSkgeworICAgICAgICByZXR1cm4gZm9ybWF0VHlwZTsKKyAgICB9CisgICAgY2hhciByYXdidWZmZXJbMTZdOyAgLy8gcm9vbSBmb3IgIiVkIgorICAgIHNucHJpbnRmKHJhd2J1ZmZlciwgc2l6ZW9mKHJhd2J1ZmZlciksICIlZCIsIHZhbHVlKTsKKyAgICByZXR1cm4gcmF3YnVmZmVyOworfQorCitzdGF0aWMgc3RkOjpzdHJpbmcgYXVkaW9Tb3VyY2VTdHJpbmcoYXVkaW9fc291cmNlX3QgdmFsdWUpIHsKKyAgICBzdGQ6OnN0cmluZyBzb3VyY2U7CisgICAgaWYgKFNvdXJjZVR5cGVDb252ZXJ0ZXI6OnRvU3RyaW5nKHZhbHVlLCBzb3VyY2UpKSB7CisgICAgICAgIHJldHVybiBzb3VyY2U7CisgICAgfQorICAgIGNoYXIgcmF3YnVmZmVyWzE2XTsgIC8vIHJvb20gZm9yICIlZCIKKyAgICBzbnByaW50ZihyYXdidWZmZXIsIHNpemVvZihyYXdidWZmZXIpLCAiJWQiLCB2YWx1ZSk7CisgICAgcmV0dXJuIHJhd2J1ZmZlcjsKK30KKwordm9pZCBBdWRpb1JlY29yZDo6TWVkaWFNZXRyaWNzOjpnYXRoZXIoY29uc3QgQXVkaW9SZWNvcmQgKnJlY29yZCkKK3sKKyAgICAvLyBrZXkgZm9yIG1lZGlhIHN0YXRpc3RpY3MgaXMgZGVmaW5lZCBpbiB0aGUgaGVhZGVyCisgICAgLy8gYXR0cnMgZm9yIG1lZGlhIHN0YXRpc3RpY3MKKyAgICAvLyBOQjogdGhlc2UgYXJlIG1hdGNoZWQgd2l0aCBwdWJsaWMgSmF2YSBBUEkgY29uc3RhbnRzIGRlZmluZWQKKyAgICAvLyBpbiBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvUmVjb3JkLmphdmEKKyAgICAvLyBUaGVzZSBtdXN0IGJlIGtlcHQgc3luY2hyb25pemVkIHdpdGggdGhlIGNvbnN0YW50cyB0aGVyZS4KKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvUmVjb3JkRW5jb2RpbmdbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvcmVjb3JkLmVuY29kaW5nIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvUmVjb3JkU291cmNlW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3JlY29yZC5zb3VyY2UiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9SZWNvcmRMYXRlbmN5W10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3JlY29yZC5sYXRlbmN5IjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvUmVjb3JkU2FtcGxlUmF0ZVtdID0gImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQuc2FtcGxlcmF0ZSI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1JlY29yZENoYW5uZWxDb3VudFtdID0gImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQuY2hhbm5lbHMiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9SZWNvcmRDcmVhdGVkW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3JlY29yZC5jcmVhdGVkTXMiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9SZWNvcmREdXJhdGlvbltdID0gImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQuZHVyYXRpb25NcyI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1JlY29yZENvdW50W10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3JlY29yZC5uIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvUmVjb3JkRXJyb3JbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvcmVjb3JkLmVycmNvZGUiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9SZWNvcmRFcnJvckZ1bmN0aW9uW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3JlY29yZC5lcnJmdW5jIjsKKworICAgIC8vIGNvbnN0cnVjdG9yIGd1YXJhbnRlZXMgbUFuYWx5dGljc0l0ZW0gaXMgdmFsaWQKKworICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQXVkaW9SZWNvcmRMYXRlbmN5LCByZWNvcmQtPm1MYXRlbmN5KTsKKyAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0F1ZGlvUmVjb3JkU2FtcGxlUmF0ZSwgcmVjb3JkLT5tU2FtcGxlUmF0ZSk7CisgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtBdWRpb1JlY29yZENoYW5uZWxDb3VudCwgcmVjb3JkLT5tQ2hhbm5lbENvdW50KTsKKyAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9SZWNvcmRFbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb0Zvcm1hdFR5cGVTdHJpbmcocmVjb3JkLT5tRm9ybWF0KS5jX3N0cigpKTsKKyAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9SZWNvcmRTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Tb3VyY2VTdHJpbmcocmVjb3JkLT5tQXR0cmlidXRlcy5zb3VyY2UpLmNfc3RyKCkpOworCisgICAgLy8gbG9nIHRvdGFsIGR1cmF0aW9uIHJlY29yZGluZywgaW5jbHVkaW5nIGFueXRoaW5nIGN1cnJlbnRseSBydW5uaW5nIFthbmQgY291bnRdLgorICAgIG5zZWNzX3QgYWN0aXZlID0gMDsKKyAgICBpZiAobVN0YXJ0ZWROcyAhPSAwKSB7CisgICAgICAgIGFjdGl2ZSA9IHN5c3RlbVRpbWUoKSAtIG1TdGFydGVkTnM7CisgICAgfQorICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChrQXVkaW9SZWNvcmREdXJhdGlvbiwgKG1EdXJhdGlvbk5zICsgYWN0aXZlKSAvICgxMDAwICogMTAwMCkpOworICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQXVkaW9SZWNvcmRDb3VudCwgbUNvdW50KTsKKworICAgIC8vIFhYWCBJIGRvbid0IGtub3cgdGhhdCB0aGlzIGFkZHMgYSBsb3Qgb2YgdmFsdWUsIGxvbmcgdGVybQorICAgIGlmIChtQ3JlYXRlZE5zICE9IDApIHsKKyAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDY0KGtBdWRpb1JlY29yZENyZWF0ZWQsIG1DcmVhdGVkTnMgLyAoMTAwMCAqIDEwMDApKTsKKyAgICB9CisKKyAgICBpZiAobUxhc3RFcnJvciAhPSBOT19FUlJPUikgeworICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0F1ZGlvUmVjb3JkRXJyb3IsIG1MYXN0RXJyb3IpOworICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9SZWNvcmRFcnJvckZ1bmN0aW9uLCBtTGFzdEVycm9yRnVuYy5jX3N0cigpKTsKKyAgICB9Cit9CisKKy8vIGhhbmQgdGhlIHVzZXIgYSBzbmFwc2hvdCBvZiB0aGUgbWV0cmljcy4KK3N0YXR1c190IEF1ZGlvUmVjb3JkOjpnZXRNZXRyaWNzKE1lZGlhQW5hbHl0aWNzSXRlbSAqICZpdGVtKQoreworICAgIG1NZWRpYU1ldHJpY3MuZ2F0aGVyKHRoaXMpOworICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAqdG1wID0gbU1lZGlhTWV0cmljcy5kdXAoKTsKKyAgICBpZiAodG1wID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaXRlbSA9IHRtcDsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKIEF1ZGlvUmVjb3JkOjpBdWRpb1JlY29yZChjb25zdCBTdHJpbmcxNiAmb3BQYWNrYWdlTmFtZSkKICAgICA6IG1BY3RpdmUoZmFsc2UpLCBtU3RhdHVzKE5PX0lOSVQpLCBtT3BQYWNrYWdlTmFtZShvcFBhY2thZ2VOYW1lKSwKICAgICAgIG1TZXNzaW9uSWQoQVVESU9fU0VTU0lPTl9BTExPQ0FURSksCiAgICAgICBtUHJldmlvdXNQcmlvcml0eShBTkRST0lEX1BSSU9SSVRZX05PUk1BTCksIG1QcmV2aW91c1NjaGVkdWxpbmdHcm91cChTUF9ERUZBVUxUKSwKLSAgICAgIG1TZWxlY3RlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpLCBtUm91dGVkRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSksCi0gICAgICBtUG9ydElkKEFVRElPX1BPUlRfSEFORExFX05PTkUpCisgICAgICBtU2VsZWN0ZWREZXZpY2VJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKSwgbVJvdXRlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpCiB7CiB9CiAKQEAgLTg5LDI0ICsxNjksMjUgQEAKICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICBwaWRfdCBwaWQsCi0gICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMpCisgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMsCisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCkKICAgICA6IG1BY3RpdmUoZmFsc2UpLAogICAgICAgbVN0YXR1cyhOT19JTklUKSwKICAgICAgIG1PcFBhY2thZ2VOYW1lKG9wUGFja2FnZU5hbWUpLAogICAgICAgbVNlc3Npb25JZChBVURJT19TRVNTSU9OX0FMTE9DQVRFKSwKICAgICAgIG1QcmV2aW91c1ByaW9yaXR5KEFORFJPSURfUFJJT1JJVFlfTk9STUFMKSwKICAgICAgIG1QcmV2aW91c1NjaGVkdWxpbmdHcm91cChTUF9ERUZBVUxUKSwKLSAgICAgIG1Qcm94eShOVUxMKSwKLSAgICAgIG1TZWxlY3RlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpLAotICAgICAgbVBvcnRJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKQorICAgICAgbVByb3h5KE5VTEwpCiB7Ci0gICAgbVN0YXR1cyA9IHNldChpbnB1dFNvdXJjZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgY2JmLCB1c2VyLAorICAgICh2b2lkKXNldChpbnB1dFNvdXJjZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgY2JmLCB1c2VyLAogICAgICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVzLCBmYWxzZSAvKnRocmVhZENhbkNhbGxKYXZhKi8sIHNlc3Npb25JZCwgdHJhbnNmZXJUeXBlLCBmbGFncywKLSAgICAgICAgICAgIHVpZCwgcGlkLCBwQXR0cmlidXRlcyk7CisgICAgICAgICAgICB1aWQsIHBpZCwgcEF0dHJpYnV0ZXMsIHNlbGVjdGVkRGV2aWNlSWQpOwogfQogCiBBdWRpb1JlY29yZDo6fkF1ZGlvUmVjb3JkKCkKIHsKKyAgICBtTWVkaWFNZXRyaWNzLmdhdGhlcih0aGlzKTsKKwogICAgIGlmIChtU3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGNhbGxiYWNrIGZ1bmN0aW9uIGV4aXRzIGluIHRoZSBjYXNlIHdoZXJlCiAgICAgICAgIC8vIGl0IGlzIGxvb3Bpbmcgb24gYnVmZmVyIGVtcHR5IGNvbmRpdGlvbiBpbiBvYnRhaW5CdWZmZXIoKS4KQEAgLTE0OCwxNCArMjI5LDIyIEBACiAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgcGlkX3QgcGlkLAotICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzKQorICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzLAorICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQpCiB7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgdWludDMyX3QgY2hhbm5lbENvdW50OworICAgIHBpZF90IGNhbGxpbmdQaWQ7CisgICAgcGlkX3QgbXlQaWQ7CisKICAgICBBTE9HVigic2V0KCk6IGlucHV0U291cmNlICVkLCBzYW1wbGVSYXRlICV1LCBmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAlI3gsIGZyYW1lQ291bnQgJXp1LCAiCiAgICAgICAgICAgIm5vdGlmaWNhdGlvbkZyYW1lcyAldSwgc2Vzc2lvbklkICVkLCB0cmFuc2ZlclR5cGUgJWQsIGZsYWdzICUjeCwgb3BQYWNrYWdlTmFtZSAlcyAiCiAgICAgICAgICAgInVpZCAlZCwgcGlkICVkIiwKICAgICAgICAgICBpbnB1dFNvdXJjZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgbm90aWZpY2F0aW9uRnJhbWVzLAogICAgICAgICAgIHNlc3Npb25JZCwgdHJhbnNmZXJUeXBlLCBmbGFncywgU3RyaW5nOChtT3BQYWNrYWdlTmFtZSkuc3RyaW5nKCksIHVpZCwgcGlkKTsKIAorICAgIG1TZWxlY3RlZERldmljZUlkID0gc2VsZWN0ZWREZXZpY2VJZDsKKwogICAgIHN3aXRjaCAodHJhbnNmZXJUeXBlKSB7CiAgICAgY2FzZSBUUkFOU0ZFUl9ERUZBVUxUOgogICAgICAgICBpZiAoY2JmID09IE5VTEwgfHwgdGhyZWFkQ2FuQ2FsbEphdmEpIHsKQEAgLTE2Nyw3ICsyNTYsOCBAQAogICAgIGNhc2UgVFJBTlNGRVJfQ0FMTEJBQ0s6CiAgICAgICAgIGlmIChjYmYgPT0gTlVMTCkgewogICAgICAgICAgICAgQUxPR0UoIlRyYW5zZmVyIHR5cGUgVFJBTlNGRVJfQ0FMTEJBQ0sgYnV0IGNiZiA9PSBOVUxMIik7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgVFJBTlNGRVJfT0JUQUlOOgpAQCAtMTc1LDE0ICsyNjUsMTYgQEAKICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgQUxPR0UoIkludmFsaWQgdHJhbnNmZXIgdHlwZSAlZCIsIHRyYW5zZmVyVHlwZSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgZ290byBleGl0OwogICAgIH0KICAgICBtVHJhbnNmZXIgPSB0cmFuc2ZlclR5cGU7CiAKICAgICAvLyBpbnZhcmlhbnQgdGhhdCBtQXVkaW9SZWNvcmQgIT0gMCBpcyB0cnVlIG9ubHkgYWZ0ZXIgc2V0KCkgcmV0dXJucyBzdWNjZXNzZnVsbHkKICAgICBpZiAobUF1ZGlvUmVjb3JkICE9IDApIHsKICAgICAgICAgQUxPR0UoIlRyYWNrIGFscmVhZHkgaW4gdXNlIik7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CiAKICAgICBpZiAocEF0dHJpYnV0ZXMgPT0gTlVMTCkgewpAQCAtMjA2LDE2ICsyOTgsMTggQEAKICAgICAvLyBBdWRpb0ZsaW5nZXIgY2FwdHVyZSBvbmx5IHN1cHBvcnRzIGxpbmVhciBQQ00KICAgICBpZiAoIWF1ZGlvX2lzX3ZhbGlkX2Zvcm1hdChmb3JtYXQpIHx8ICFhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkpIHsKICAgICAgICAgQUxPR0UoIkZvcm1hdCAlI3ggaXMgbm90IGxpbmVhciBwY20iLCBmb3JtYXQpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CiAgICAgbUZvcm1hdCA9IGZvcm1hdDsKIAogICAgIGlmICghYXVkaW9faXNfaW5wdXRfY2hhbm5lbChjaGFubmVsTWFzaykpIHsKICAgICAgICAgQUxPR0UoIkludmFsaWQgY2hhbm5lbCBtYXNrICUjeCIsIGNoYW5uZWxNYXNrKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQogICAgIG1DaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrOwotICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGNoYW5uZWxNYXNrKTsKKyAgICBjaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjaGFubmVsTWFzayk7CiAgICAgbUNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudDsKIAogICAgIGlmIChhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkpIHsKQEAgLTIyNCwyOCArMzE4LDI0IEBACiAgICAgICAgIG1GcmFtZVNpemUgPSBzaXplb2YodWludDhfdCk7CiAgICAgfQogCi0gICAgLy8gbUZyYW1lQ291bnQgaXMgaW5pdGlhbGl6ZWQgaW4gb3BlblJlY29yZF9sCisgICAgLy8gbUZyYW1lQ291bnQgaXMgaW5pdGlhbGl6ZWQgaW4gY3JlYXRlUmVjb3JkX2wKICAgICBtUmVxRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CiAKICAgICBtTm90aWZpY2F0aW9uRnJhbWVzUmVxID0gbm90aWZpY2F0aW9uRnJhbWVzOwotICAgIC8vIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgaXMgaW5pdGlhbGl6ZWQgaW4gb3BlblJlY29yZF9sCisgICAgLy8gbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCBpcyBpbml0aWFsaXplZCBpbiBjcmVhdGVSZWNvcmRfbAogCi0gICAgaWYgKHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX0FMTE9DQVRFKSB7Ci0gICAgICAgIG1TZXNzaW9uSWQgPSAoYXVkaW9fc2Vzc2lvbl90KSBBdWRpb1N5c3RlbTo6bmV3QXVkaW9VbmlxdWVJZChBVURJT19VTklRVUVfSURfVVNFX1NFU1NJT04pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7Ci0gICAgfQorICAgIG1TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CiAgICAgQUxPR1YoInNldCgpOiBtU2Vzc2lvbklkICVkIiwgbVNlc3Npb25JZCk7CiAKLSAgICBpbnQgY2FsbGluZ3BpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKLSAgICBpbnQgbXlwaWQgPSBnZXRwaWQoKTsKLSAgICBpZiAodWlkID09IEFVRElPX1VJRF9JTlZBTElEIHx8IChjYWxsaW5ncGlkICE9IG15cGlkKSkgeworICAgIGNhbGxpbmdQaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgbXlQaWQgPSBnZXRwaWQoKTsKKyAgICBpZiAodWlkID09IEFVRElPX1VJRF9JTlZBTElEIHx8IChjYWxsaW5nUGlkICE9IG15UGlkKSkgewogICAgICAgICBtQ2xpZW50VWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1DbGllbnRVaWQgPSB1aWQ7CiAgICAgfQotICAgIGlmIChwaWQgPT0gLTEgfHwgKGNhbGxpbmdwaWQgIT0gbXlwaWQpKSB7Ci0gICAgICAgIG1DbGllbnRQaWQgPSBjYWxsaW5ncGlkOworICAgIGlmIChwaWQgPT0gLTEgfHwgKGNhbGxpbmdQaWQgIT0gbXlQaWQpKSB7CisgICAgICAgIG1DbGllbnRQaWQgPSBjYWxsaW5nUGlkOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1DbGllbnRQaWQgPSBwaWQ7CiAgICAgfQpAQCAtMjYwLDcgKzM1MCw3IEBACiAgICAgfQogCiAgICAgLy8gY3JlYXRlIHRoZSBJQXVkaW9SZWNvcmQKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBvcGVuUmVjb3JkX2woMCAvKmVwb2NoKi8sIG1PcFBhY2thZ2VOYW1lKTsKKyAgICBzdGF0dXMgPSBjcmVhdGVSZWNvcmRfbCgwIC8qZXBvY2gqLywgbU9wUGFja2FnZU5hbWUpOwogCiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICBpZiAobUF1ZGlvUmVjb3JkVGhyZWFkICE9IDApIHsKQEAgLTI2OCwxMCArMzU4LDkgQEAKICAgICAgICAgICAgIG1BdWRpb1JlY29yZFRocmVhZC0+cmVxdWVzdEV4aXRBbmRXYWl0KCk7CiAgICAgICAgICAgICBtQXVkaW9SZWNvcmRUaHJlYWQuY2xlYXIoKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQogCi0gICAgbVN0YXR1cyA9IE5PX0VSUk9SOwogICAgIG1Vc2VyRGF0YSA9IHVzZXI7CiAgICAgLy8gVE9ETzogYWRkIGF1ZGlvIGhhcmR3YXJlIGlucHV0IGxhdGVuY3kgaGVyZQogICAgIG1MYXRlbmN5ID0gKDEwMDBMTCAqIG1GcmFtZUNvdW50KSAvIG1TYW1wbGVSYXRlOwpAQCAtMjg2LDcgKzM3NSwxMiBAQAogICAgIG1GcmFtZXNSZWFkID0gMDsKICAgICBtRnJhbWVzUmVhZFNlcnZlck9mZnNldCA9IDA7CiAKLSAgICByZXR1cm4gTk9fRVJST1I7CitleGl0OgorICAgIG1TdGF0dXMgPSBzdGF0dXM7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICBtTWVkaWFNZXRyaWNzLm1hcmtFcnJvcihzdGF0dXMsIF9fRlVOQ1RJT05fXyk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTMyMyw3ICs0MTcsNyBAQAogCiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CiAgICAgaWYgKCEoZmxhZ3MgJiBDQkxLX0lOVkFMSUQpKSB7Ci0gICAgICAgIHN0YXR1cyA9IG1BdWRpb1JlY29yZC0+c3RhcnQoZXZlbnQsIHRyaWdnZXJTZXNzaW9uKTsKKyAgICAgICAgc3RhdHVzID0gbUF1ZGlvUmVjb3JkLT5zdGFydChldmVudCwgdHJpZ2dlclNlc3Npb24pLnRyYW5zYWN0aW9uRXJyb3IoKTsKICAgICAgICAgaWYgKHN0YXR1cyA9PSBERUFEX09CSkVDVCkgewogICAgICAgICAgICAgZmxhZ3MgfD0gQ0JMS19JTlZBTElEOwogICAgICAgICB9CkBAIC0zNDQsOCArNDM4LDE0IEBACiAgICAgICAgICAgICBnZXRfc2NoZWRfcG9saWN5KDAsICZtUHJldmlvdXNTY2hlZHVsaW5nR3JvdXApOwogICAgICAgICAgICAgYW5kcm9pZFNldFRocmVhZFByaW9yaXR5KDAsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOwogICAgICAgICB9CisKKyAgICAgICAgLy8gd2UndmUgc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQsIGxvZyB0aGF0IHRpbWUKKyAgICAgICAgbU1lZGlhTWV0cmljcy5sb2dTdGFydChzeXN0ZW1UaW1lKCkpOwogICAgIH0KIAorICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgbU1lZGlhTWV0cmljcy5tYXJrRXJyb3Ioc3RhdHVzLCBfX0ZVTkNUSU9OX18pOworICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQogCkBAIC0zNzAsNiArNDcwLDkgQEAKICAgICAgICAgc2V0cHJpb3JpdHkoUFJJT19QUk9DRVNTLCAwLCBtUHJldmlvdXNQcmlvcml0eSk7CiAgICAgICAgIHNldF9zY2hlZF9wb2xpY3koMCwgbVByZXZpb3VzU2NoZWR1bGluZ0dyb3VwKTsKICAgICB9CisKKyAgICAvLyB3ZSd2ZSBzdWNjZXNzZnVsbHkgc3RhcnRlZCwgbG9nIHRoYXQgdGltZQorICAgIG1NZWRpYU1ldHJpY3MubG9nU3RvcChzeXN0ZW1UaW1lKCkpOwogfQogCiBib29sIEF1ZGlvUmVjb3JkOjpzdG9wcGVkKCkgY29uc3QKQEAgLTQ4OSw2ICs1OTIsNyBAQAogICAgICAgICAgICAgICAgIG1BdWRpb1JlY29yZC0+c3RvcCgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19JTlZBTElELCAmbUNibGstPm1GbGFncyk7CisgICAgICAgICAgICBtUHJveHktPmludGVycnVwdCgpOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKQEAgLTUyMSw2ICs2MjUsMjcgQEAKICAgICByZXR1cm4gbVJvdXRlZERldmljZUlkOwogfQogCitzdGF0dXNfdCBBdWRpb1JlY29yZDo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpIGNvbnN0Cit7CisgICAgU3RyaW5nOCByZXN1bHQ7CisKKyAgICByZXN1bHQuYXBwZW5kKCIgQXVkaW9SZWNvcmQ6OmR1bXBcbiIpOworICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgc3RhdHVzKCVkKSwgYWN0aXZlKCVkKSwgc2Vzc2lvbiBJZCglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHVzLCBtQWN0aXZlLCBtU2Vzc2lvbklkKTsKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIGZsYWdzKCUjeCksIHJlcS4gZmxhZ3MoJSN4KSwgYXVkaW8gc291cmNlKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncywgbU9yaWdGbGFncywgbUF0dHJpYnV0ZXMuc291cmNlKTsKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIGZvcm1hdCglI3gpLCBjaGFubmVsIG1hc2soJSN4KSwgY2hhbm5lbCBjb3VudCgldSksIHNhbXBsZSByYXRlKCV1KVxuIiwKKyAgICAgICAgICAgICAgICAgIG1Gb3JtYXQsIG1DaGFubmVsTWFzaywgbUNoYW5uZWxDb3VudCwgbVNhbXBsZVJhdGUpOworICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgZnJhbWUgY291bnQoJXp1KSwgcmVxLiBmcmFtZSBjb3VudCglenUpXG4iLAorICAgICAgICAgICAgICAgICAgbUZyYW1lQ291bnQsIG1SZXFGcmFtZUNvdW50KTsKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIG5vdGlmLiBmcmFtZSBjb3VudCgldSksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KCV1KVxuIiwKKyAgICAgICAgICAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0LCBtTm90aWZpY2F0aW9uRnJhbWVzUmVxKTsKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIGlucHV0KCVkKSwgbGF0ZW5jeSgldSksIHNlbGVjdGVkIGRldmljZSBJZCglZCksIHJvdXRlZCBkZXZpY2UgSWQoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0LCBtTGF0ZW5jeSwgbVNlbGVjdGVkRGV2aWNlSWQsIG1Sb3V0ZWREZXZpY2VJZCk7CisgICAgOjp3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIFRPRE8gTW92ZSB0aGlzIG1hY3JvIHRvIGEgY29tbW9uIGhlYWRlciBmaWxlIGZvciBlbnVtIHRvIHN0cmluZyBjb252ZXJzaW9uIGluIGF1ZGlvIGZyYW1ld29yay4KICNkZWZpbmUgTUVESUFfQ0FTRV9FTlVNKG5hbWUpIGNhc2UgbmFtZTogcmV0dXJuICNuYW1lCkBAIC01MzYsNzAgKzY2MSwyOSBAQAogfQogCiAvLyBtdXN0IGJlIGNhbGxlZCB3aXRoIG1Mb2NrIGhlbGQKLXN0YXR1c190IEF1ZGlvUmVjb3JkOjpvcGVuUmVjb3JkX2woY29uc3QgTW9kdWxvPHVpbnQzMl90PiAmZXBvY2gsIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lKQorc3RhdHVzX3QgQXVkaW9SZWNvcmQ6OmNyZWF0ZVJlY29yZF9sKGNvbnN0IE1vZHVsbzx1aW50MzJfdD4gJmVwb2NoLCBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSkKIHsKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgSUF1ZGlvRmxpbmdlcjo6Q3JlYXRlUmVjb3JkSW5wdXQgaW5wdXQ7CisgICAgSUF1ZGlvRmxpbmdlcjo6Q3JlYXRlUmVjb3JkT3V0cHV0IG91dHB1dDsKKyAgICBhdWRpb19zZXNzaW9uX3Qgb3JpZ2luYWxTZXNzaW9uSWQ7CisgICAgc3A8bWVkaWE6OklBdWRpb1JlY29yZD4gcmVjb3JkOworICAgIHZvaWQgKmlNZW1Qb2ludGVyOworICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogY2JsazsKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisKICAgICBpZiAoYXVkaW9GbGluZ2VyID09IDApIHsKICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgYXVkaW9mbGluZ2VyIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICBzdGF0dXMgPSBOT19JTklUOworICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQogCi0gICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQ7Ci0KICAgICAvLyBtRmxhZ3MgKG5vdCBtT3JpZ0ZsYWdzKSBpcyBtb2RpZmllZCBkZXBlbmRpbmcgb24gd2hldGhlciBmYXN0IHJlcXVlc3QgaXMgYWNjZXB0ZWQuCiAgICAgLy8gQWZ0ZXIgZmFzdCByZXF1ZXN0IGlzIGRlbmllZCwgd2Ugd2lsbCByZXF1ZXN0IGFnYWluIGlmIElBdWRpb1JlY29yZCBpcyByZS1jcmVhdGVkLgogCi0gICAgc3RhdHVzX3Qgc3RhdHVzOwotCi0gICAgLy8gTm90IGEgY29udmVudGlvbmFsIGxvb3AsIGJ1dCBhIHJldHJ5IGxvb3AgZm9yIGF0IG1vc3QgdHdvIGl0ZXJhdGlvbnMgdG90YWwuCi0gICAgLy8gVHJ5IGZpcnN0IG1heWJlIHdpdGggRkFTVCBmbGFnIHRoZW4gdHJ5IGFnYWluIHdpdGhvdXQgRkFTVCBmbGFnIGlmIHRoYXQgZmFpbHMuCi0gICAgLy8gRXhpdHMgbG9vcCBub3JtYWxseSB2aWEgYSByZXR1cm4gYXQgdGhlIGJvdHRvbSwgb3Igd2l0aCBlcnJvciB2aWEgYSBicmVhay4KLSAgICAvLyBUaGUgc3A8PiByZWZlcmVuY2VzIHdpbGwgYmUgZHJvcHBlZCB3aGVuIHJlLWVudGVyaW5nIHNjb3BlLgotICAgIC8vIFRoZSBsYWNrIG9mIGluZGVudGF0aW9uIGlzIGRlbGliZXJhdGUsIHRvIHJlZHVjZSBjb2RlIGNodXJuIGFuZCBlYXNlIG1lcmdlcy4KLSAgICBmb3IgKDs7KSB7Ci0gICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBjb25maWcgID0gewotICAgICAgICAgICAgLnNhbXBsZV9yYXRlID0gbVNhbXBsZVJhdGUsCi0gICAgICAgICAgICAuY2hhbm5lbF9tYXNrID0gbUNoYW5uZWxNYXNrLAotICAgICAgICAgICAgLmZvcm1hdCA9IG1Gb3JtYXQKLSAgICAgICAgfTsKLSAgICBtUm91dGVkRGV2aWNlSWQgPSBtU2VsZWN0ZWREZXZpY2VJZDsKLSAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0SW5wdXRGb3JBdHRyKCZtQXR0cmlidXRlcywgJmlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgY29tcGFyZSB0byBBdWRpb1RyYWNrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNsaWVudFBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2xpZW50VWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzLCAmbVJvdXRlZERldmljZUlkLCAmbVBvcnRJZCk7Ci0KLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SIHx8IGlucHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGF1ZGlvIGlucHV0IGZvciBzZXNzaW9uICVkLCByZWNvcmQgc291cmNlICVkLCBzYW1wbGUgcmF0ZSAldSwgIgotICAgICAgICAgICAgICAiZm9ybWF0ICUjeCwgY2hhbm5lbCBtYXNrICUjeCwgZmxhZ3MgJSN4IiwKLSAgICAgICAgICAgICAgbVNlc3Npb25JZCwgbUF0dHJpYnV0ZXMuc291cmNlLCBtU2FtcGxlUmF0ZSwgbUZvcm1hdCwgbUNoYW5uZWxNYXNrLCBtRmxhZ3MpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQogICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgYSByZWZlcmVuY2UgdG8gYW4gSS9PIGhhbmRsZSBhbmQgaGF2ZSBub3QgeWV0IGhhbmRlZCBpdCBvZmYgdG8gQXVkaW9GbGluZ2VyLAogICAgIC8vIHdlIG11c3QgcmVsZWFzZSBpdCBvdXJzZWx2ZXMgaWYgYW55dGhpbmcgZ29lcyB3cm9uZy4KIAotI2lmIDAKLSAgICBzaXplX3QgYWZGcmFtZUNvdW50OwotICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRGcmFtZUNvdW50KGlucHV0LCAmYWZGcmFtZUNvdW50KTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJnZXRGcmFtZUNvdW50KGlucHV0PSVkKSBzdGF0dXMgJWQiLCBpbnB1dCwgc3RhdHVzKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotI2VuZGlmCi0KLSAgICB1aW50MzJfdCBhZlNhbXBsZVJhdGU7Ci0gICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldFNhbXBsaW5nUmF0ZShpbnB1dCwgJmFmU2FtcGxlUmF0ZSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiZ2V0U2FtcGxpbmdSYXRlKGlucHV0PSVkKSBzdGF0dXMgJWQiLCBpbnB1dCwgc3RhdHVzKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlmIChtU2FtcGxlUmF0ZSA9PSAwKSB7Ci0gICAgICAgIG1TYW1wbGVSYXRlID0gYWZTYW1wbGVSYXRlOwotICAgIH0KLQogICAgIC8vIENsaWVudCBjYW4gb25seSBleHByZXNzIGEgcHJlZmVyZW5jZSBmb3IgRkFTVC4gIFNlcnZlciB3aWxsIHBlcmZvcm0gYWRkaXRpb25hbCB0ZXN0cy4KICAgICBpZiAobUZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19GQVNUKSB7CiAgICAgICAgIGJvb2wgdXNlQ2FzZUFsbG93ZWQgPQpAQCAtNjE4LDY2ICs3MDIsNDEgQEAKICAgICAgICAgaWYgKCF1c2VDYXNlQWxsb3dlZCkgewogICAgICAgICAgICAgQUxPR1coIkFVRElPX0lOUFVUX0ZMQUdfRkFTVCBkZW5pZWQsIGluY29tcGF0aWJsZSB0cmFuc2ZlciA9ICVzIiwKICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUcmFuc2ZlclRvVGV4dChtVHJhbnNmZXIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNhbXBsZSByYXRlcyBtdXN0IGFsc28gbWF0Y2gKLSAgICAgICAgYm9vbCBzYW1wbGVSYXRlQWxsb3dlZCA9IG1TYW1wbGVSYXRlID09IGFmU2FtcGxlUmF0ZTsKLSAgICAgICAgaWYgKCFzYW1wbGVSYXRlQWxsb3dlZCkgewotICAgICAgICAgICAgQUxPR1coIkFVRElPX0lOUFVUX0ZMQUdfRkFTVCBkZW5pZWQsIHJhdGVzIGRvIG5vdCBtYXRjaCAldSBIeiwgcmVxdWlyZSAldSBIeiIsCi0gICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwgYWZTYW1wbGVSYXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2wgZmFzdEFsbG93ZWQgPSB1c2VDYXNlQWxsb3dlZCAmJiBzYW1wbGVSYXRlQWxsb3dlZDsKLSAgICAgICAgaWYgKCFmYXN0QWxsb3dlZCkgewogICAgICAgICAgICAgbUZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpIChtRmxhZ3MgJiB+KEFVRElPX0lOUFVUX0ZMQUdfRkFTVCB8CiAgICAgICAgICAgICAgICAgICAgIEFVRElPX0lOUFVUX0ZMQUdfUkFXKSk7Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUlucHV0KGlucHV0LCBtU2Vzc2lvbklkKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOyAgIC8vIHJldHJ5CiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBUaGUgbm90aWZpY2F0aW9uIGZyYW1lIGNvdW50IGlzIHRoZSBwZXJpb2QgYmV0d2VlbiBjYWxsYmFja3MsIGFzIHN1Z2dlc3RlZCBieSB0aGUgY2xpZW50Ci0gICAgLy8gYnV0IG1vZGVyYXRlZCBieSB0aGUgc2VydmVyLiAgRm9yIHJlY29yZCwgdGhlIGNhbGN1bGF0aW9ucyBhcmUgZG9uZSBlbnRpcmVseSBvbiBzZXJ2ZXIgc2lkZS4KLSAgICBzaXplX3Qgbm90aWZpY2F0aW9uRnJhbWVzID0gbU5vdGlmaWNhdGlvbkZyYW1lc1JlcTsKLSAgICBzaXplX3QgZnJhbWVDb3VudCA9IG1SZXFGcmFtZUNvdW50OwotCi0gICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyA9IG1GbGFnczsKLQotICAgIHBpZF90IHRpZCA9IC0xOworICAgIGlucHV0LmF0dHIgPSBtQXR0cmlidXRlczsKKyAgICBpbnB1dC5jb25maWcuc2FtcGxlX3JhdGUgPSBtU2FtcGxlUmF0ZTsKKyAgICBpbnB1dC5jb25maWcuY2hhbm5lbF9tYXNrID0gbUNoYW5uZWxNYXNrOworICAgIGlucHV0LmNvbmZpZy5mb3JtYXQgPSBtRm9ybWF0OworICAgIGlucHV0LmNsaWVudEluZm8uY2xpZW50VWlkID0gbUNsaWVudFVpZDsKKyAgICBpbnB1dC5jbGllbnRJbmZvLmNsaWVudFBpZCA9IG1DbGllbnRQaWQ7CisgICAgaW5wdXQuY2xpZW50SW5mby5jbGllbnRUaWQgPSAtMTsKICAgICBpZiAobUZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19GQVNUKSB7CiAgICAgICAgIGlmIChtQXVkaW9SZWNvcmRUaHJlYWQgIT0gMCkgewotICAgICAgICAgICAgdGlkID0gbUF1ZGlvUmVjb3JkVGhyZWFkLT5nZXRUaWQoKTsKKyAgICAgICAgICAgIGlucHV0LmNsaWVudEluZm8uY2xpZW50VGlkID0gbUF1ZGlvUmVjb3JkVGhyZWFkLT5nZXRUaWQoKTsKICAgICAgICAgfQogICAgIH0KKyAgICBpbnB1dC5vcFBhY2thZ2VOYW1lID0gb3BQYWNrYWdlTmFtZTsKIAotICAgIHNpemVfdCB0ZW1wID0gZnJhbWVDb3VudDsgICAvLyB0ZW1wIG1heSBiZSByZXBsYWNlZCBieSBhIHJldmlzZWQgdmFsdWUgb2YgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnV0IHdlIHdpbGwgc3RpbGwgbmVlZCB0aGUgb3JpZ2luYWwgdmFsdWUgYWxzbwotICAgIGF1ZGlvX3Nlc3Npb25fdCBvcmlnaW5hbFNlc3Npb25JZCA9IG1TZXNzaW9uSWQ7CisgICAgaW5wdXQuZmxhZ3MgPSBtRmxhZ3M7CisgICAgLy8gVGhlIG5vdGlmaWNhdGlvbiBmcmFtZSBjb3VudCBpcyB0aGUgcGVyaW9kIGJldHdlZW4gY2FsbGJhY2tzLCBhcyBzdWdnZXN0ZWQgYnkgdGhlIGNsaWVudAorICAgIC8vIGJ1dCBtb2RlcmF0ZWQgYnkgdGhlIHNlcnZlci4gIEZvciByZWNvcmQsIHRoZSBjYWxjdWxhdGlvbnMgYXJlIGRvbmUgZW50aXJlbHkgb24gc2VydmVyIHNpZGUuCisgICAgaW5wdXQuZnJhbWVDb3VudCA9IG1SZXFGcmFtZUNvdW50OworICAgIGlucHV0Lm5vdGlmaWNhdGlvbkZyYW1lQ291bnQgPSBtTm90aWZpY2F0aW9uRnJhbWVzUmVxOworICAgIGlucHV0LnNlbGVjdGVkRGV2aWNlSWQgPSBtU2VsZWN0ZWREZXZpY2VJZDsKKyAgICBpbnB1dC5zZXNzaW9uSWQgPSBtU2Vzc2lvbklkOworICAgIG9yaWdpbmFsU2Vzc2lvbklkID0gbVNlc3Npb25JZDsKIAotICAgIHNwPElNZW1vcnk+IGlNZW07ICAgICAgICAgICAvLyBmb3IgY2JsawotICAgIHNwPElNZW1vcnk+IGJ1ZmZlck1lbTsKLSAgICBzcDxJQXVkaW9SZWNvcmQ+IHJlY29yZCA9IGF1ZGlvRmxpbmdlci0+b3BlblJlY29yZChpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2xpZW50UGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2xpZW50VWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtU2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub3RpZmljYXRpb25GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaU1lbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJNZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUG9ydElkKTsKLSAgICBBTE9HRV9JRihvcmlnaW5hbFNlc3Npb25JZCAhPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFICYmIG1TZXNzaW9uSWQgIT0gb3JpZ2luYWxTZXNzaW9uSWQsCi0gICAgICAgICAgICAic2Vzc2lvbiBJRCBjaGFuZ2VkIGZyb20gJWQgdG8gJWQiLCBvcmlnaW5hbFNlc3Npb25JZCwgbVNlc3Npb25JZCk7CisgICAgcmVjb3JkID0gYXVkaW9GbGluZ2VyLT5jcmVhdGVSZWNvcmQoaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cyk7CiAKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIEFMT0dFKCJBdWRpb0ZsaW5nZXIgY291bGQgbm90IGNyZWF0ZSByZWNvcmQgdHJhY2ssIHN0YXR1czogJWQiLCBzdGF0dXMpOwotICAgICAgICBicmVhazsKKyAgICAgICAgZ290byBleGl0OwogICAgIH0KICAgICBBTE9HX0FTU0VSVChyZWNvcmQgIT0gMCk7CiAKQEAgLTY4NSw0MSArNzQ0LDQxIEBACiAgICAgLy8gc28gd2UgYXJlIG5vIGxvbmdlciByZXNwb25zaWJsZSBmb3IgcmVsZWFzaW5nIGl0LgogCiAgICAgbUF3YWl0Qm9vc3QgPSBmYWxzZTsKLSAgICBpZiAobUZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19GQVNUKSB7Ci0gICAgICAgIGlmIChmbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfRkFTVCkgewotICAgICAgICAgICAgQUxPR0koIkFVRElPX0lOUFVUX0ZMQUdfRkFTVCBzdWNjZXNzZnVsOyBmcmFtZUNvdW50ICV6dSAtPiAlenUiLCBmcmFtZUNvdW50LCB0ZW1wKTsKLSAgICAgICAgICAgIG1Bd2FpdEJvb3N0ID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dXKCJBVURJT19JTlBVVF9GTEFHX0ZBU1QgZGVuaWVkIGJ5IHNlcnZlcjsgZnJhbWVDb3VudCAlenUgLT4gJXp1IiwgZnJhbWVDb3VudCwgdGVtcCk7Ci0gICAgICAgICAgICBtRmxhZ3MgPSAoYXVkaW9faW5wdXRfZmxhZ3NfdCkgKG1GbGFncyAmIH4oQVVESU9fSU5QVVRfRkxBR19GQVNUIHwKLSAgICAgICAgICAgICAgICAgICAgQVVESU9fSU5QVVRfRkxBR19SQVcpKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOyAgIC8vIHJldHJ5Ci0gICAgICAgIH0KKyAgICBpZiAob3V0cHV0LmZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19GQVNUKSB7CisgICAgICAgIEFMT0dJKCJBVURJT19JTlBVVF9GTEFHX0ZBU1Qgc3VjY2Vzc2Z1bDsgZnJhbWVDb3VudCAlenUgLT4gJXp1IiwKKyAgICAgICAgICAgICAgbVJlcUZyYW1lQ291bnQsIG91dHB1dC5mcmFtZUNvdW50KTsKKyAgICAgICAgbUF3YWl0Qm9vc3QgPSB0cnVlOwogICAgIH0KLSAgICBtRmxhZ3MgPSBmbGFnczsKKyAgICBtRmxhZ3MgPSBvdXRwdXQuZmxhZ3M7CisgICAgbVJvdXRlZERldmljZUlkID0gb3V0cHV0LnNlbGVjdGVkRGV2aWNlSWQ7CisgICAgbVNlc3Npb25JZCA9IG91dHB1dC5zZXNzaW9uSWQ7CisgICAgbVNhbXBsZVJhdGUgPSBvdXRwdXQuc2FtcGxlUmF0ZTsKIAotICAgIGlmIChpTWVtID09IDApIHsKKyAgICBpZiAob3V0cHV0LmNibGsgPT0gMCkgewogICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBjb250cm9sIGJsb2NrIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICBzdGF0dXMgPSBOT19JTklUOworICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQotICAgIHZvaWQgKmlNZW1Qb2ludGVyID0gaU1lbS0+cG9pbnRlcigpOworICAgIGlNZW1Qb2ludGVyID0gb3V0cHV0LmNibGsgLT5wb2ludGVyKCk7CiAgICAgaWYgKGlNZW1Qb2ludGVyID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgY29udHJvbCBibG9jayBwb2ludGVyIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICBzdGF0dXMgPSBOT19JTklUOworICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQotICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogY2JsayA9IHN0YXRpY19jYXN0PGF1ZGlvX3RyYWNrX2NibGtfdCo+KGlNZW1Qb2ludGVyKTsKKyAgICBjYmxrID0gc3RhdGljX2Nhc3Q8YXVkaW9fdHJhY2tfY2Jsa190Kj4oaU1lbVBvaW50ZXIpOwogCiAgICAgLy8gU3RhcnRpbmcgYWRkcmVzcyBvZiBidWZmZXJzIGluIHNoYXJlZCBtZW1vcnkuCiAgICAgLy8gVGhlIGJ1ZmZlcnMgYXJlIGVpdGhlciBpbW1lZGlhdGVseSBhZnRlciB0aGUgY29udHJvbCBibG9jaywKICAgICAvLyBvciBpbiBhIHNlcGFyYXRlIGFyZWEgYXQgZGlzY3JldGlvbiBvZiBzZXJ2ZXIuCiAgICAgdm9pZCAqYnVmZmVyczsKLSAgICBpZiAoYnVmZmVyTWVtID09IDApIHsKKyAgICBpZiAob3V0cHV0LmJ1ZmZlcnMgPT0gMCkgewogICAgICAgICBidWZmZXJzID0gY2JsayArIDE7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgYnVmZmVycyA9IGJ1ZmZlck1lbS0+cG9pbnRlcigpOworICAgICAgICBidWZmZXJzID0gb3V0cHV0LmJ1ZmZlcnMtPnBvaW50ZXIoKTsKICAgICAgICAgaWYgKGJ1ZmZlcnMgPT0gTlVMTCkgewogICAgICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgYnVmZmVyIHBvaW50ZXIiKTsKLSAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgfQogICAgIH0KIApAQCAtNzI5LDQzICs3ODgsNDIgQEAKICAgICAgICAgbURlYXRoTm90aWZpZXIuY2xlYXIoKTsKICAgICB9CiAgICAgbUF1ZGlvUmVjb3JkID0gcmVjb3JkOwotICAgIG1DYmxrTWVtb3J5ID0gaU1lbTsKLSAgICBtQnVmZmVyTWVtb3J5ID0gYnVmZmVyTWVtOworICAgIG1DYmxrTWVtb3J5ID0gb3V0cHV0LmNibGs7CisgICAgbUJ1ZmZlck1lbW9yeSA9IG91dHB1dC5idWZmZXJzOwogICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKIAogICAgIG1DYmxrID0gY2JsazsKLSAgICAvLyBub3RlIHRoYXQgdGVtcCBpcyB0aGUgKHBvc3NpYmx5IHJldmlzZWQpIHZhbHVlIG9mIGZyYW1lQ291bnQKLSAgICBpZiAodGVtcCA8IGZyYW1lQ291bnQgfHwgKGZyYW1lQ291bnQgPT0gMCAmJiB0ZW1wID09IDApKSB7Ci0gICAgICAgIEFMT0dXKCJSZXF1ZXN0ZWQgZnJhbWVDb3VudCAlenUgYnV0IHJlY2VpdmVkIGZyYW1lQ291bnQgJXp1IiwgZnJhbWVDb3VudCwgdGVtcCk7CisgICAgLy8gbm90ZSB0aGF0IG91dHB1dC5mcmFtZUNvdW50IGlzIHRoZSAocG9zc2libHkgcmV2aXNlZCkgdmFsdWUgb2YgbVJlcUZyYW1lQ291bnQKKyAgICBpZiAob3V0cHV0LmZyYW1lQ291bnQgPCBtUmVxRnJhbWVDb3VudCB8fCAobVJlcUZyYW1lQ291bnQgPT0gMCAmJiBvdXRwdXQuZnJhbWVDb3VudCA9PSAwKSkgeworICAgICAgICBBTE9HVygiUmVxdWVzdGVkIGZyYW1lQ291bnQgJXp1IGJ1dCByZWNlaXZlZCBmcmFtZUNvdW50ICV6dSIsCisgICAgICAgICAgICAgIG1SZXFGcmFtZUNvdW50LCAgb3V0cHV0LmZyYW1lQ291bnQpOwogICAgIH0KLSAgICBmcmFtZUNvdW50ID0gdGVtcDsKIAogICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGFwcGxpY2F0aW9uIGlzIG5vdGlmaWVkIHdpdGggc3VmZmljaWVudCBtYXJnaW4gYmVmb3JlIG92ZXJydW4uCiAgICAgLy8gVGhlIGNvbXB1dGF0aW9uIGlzIGRvbmUgb24gc2VydmVyIHNpZGUuCi0gICAgaWYgKG1Ob3RpZmljYXRpb25GcmFtZXNSZXEgPiAwICYmIG5vdGlmaWNhdGlvbkZyYW1lcyAhPSBtTm90aWZpY2F0aW9uRnJhbWVzUmVxKSB7CisgICAgaWYgKG1Ob3RpZmljYXRpb25GcmFtZXNSZXEgPiAwICYmIG91dHB1dC5ub3RpZmljYXRpb25GcmFtZUNvdW50ICE9IG1Ob3RpZmljYXRpb25GcmFtZXNSZXEpIHsKICAgICAgICAgQUxPR1coIlNlcnZlciBhZGp1c3RlZCBub3RpZmljYXRpb25GcmFtZXMgZnJvbSAldSB0byAlenUgZm9yIGZyYW1lQ291bnQgJXp1IiwKLSAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uRnJhbWVzUmVxLCBub3RpZmljYXRpb25GcmFtZXMsIGZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25GcmFtZXNSZXEsIG91dHB1dC5ub3RpZmljYXRpb25GcmFtZUNvdW50LCBvdXRwdXQuZnJhbWVDb3VudCk7CiAgICAgfQotICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSAodWludDMyX3QpIG5vdGlmaWNhdGlvbkZyYW1lczsKLQorICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSAodWludDMyX3Qpb3V0cHV0Lm5vdGlmaWNhdGlvbkZyYW1lQ291bnQ7CiAKICAgICAvL21JbnB1dCAhPSBpbnB1dCBpbmNsdWRlcyB0aGUgY2FzZSB3aGVyZSBtSW5wdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUgZm9yIGZpcnN0IGNyZWF0aW9uCi0gICAgaWYgKG1EZXZpY2VDYWxsYmFjayAhPSAwICYmIG1JbnB1dCAhPSBpbnB1dCkgeworICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sgIT0gMCAmJiBtSW5wdXQgIT0gb3V0cHV0LmlucHV0SWQpIHsKICAgICAgICAgaWYgKG1JbnB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbUlucHV0KTsKICAgICAgICAgfQotICAgICAgICBBdWRpb1N5c3RlbTo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBpbnB1dCk7CisgICAgICAgIEF1ZGlvU3lzdGVtOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG91dHB1dC5pbnB1dElkKTsKICAgICB9CiAKICAgICAvLyBXZSByZXRhaW4gYSBjb3B5IG9mIHRoZSBJL08gaGFuZGxlLCBidXQgZG9uJ3Qgb3duIHRoZSByZWZlcmVuY2UKLSAgICBtSW5wdXQgPSBpbnB1dDsKKyAgICBtSW5wdXQgPSBvdXRwdXQuaW5wdXRJZDsKICAgICBtUmVmcmVzaFJlbWFpbmluZyA9IHRydWU7CiAKLSAgICBtRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CisgICAgbUZyYW1lQ291bnQgPSBvdXRwdXQuZnJhbWVDb3VudDsKICAgICAvLyBJZiBJQXVkaW9SZWNvcmQgaXMgcmUtY3JlYXRlZCwgZG9uJ3QgbGV0IHRoZSByZXF1ZXN0ZWQgZnJhbWVDb3VudAogICAgIC8vIGRlY3JlYXNlLiAgVGhpcyBjYW4gY29uZnVzZSBjbGllbnRzIHRoYXQgY2FjaGUgZnJhbWVDb3VudCgpLgotICAgIGlmIChmcmFtZUNvdW50ID4gbVJlcUZyYW1lQ291bnQpIHsKLSAgICAgICAgbVJlcUZyYW1lQ291bnQgPSBmcmFtZUNvdW50OworICAgIGlmIChtRnJhbWVDb3VudCA+IG1SZXFGcmFtZUNvdW50KSB7CisgICAgICAgIG1SZXFGcmFtZUNvdW50ID0gbUZyYW1lQ291bnQ7CiAgICAgfQogCiAgICAgLy8gdXBkYXRlIHByb3h5CkBAIC03NzYsMTcgKzgzNCw5IEBACiAgICAgbURlYXRoTm90aWZpZXIgPSBuZXcgRGVhdGhOb3RpZmllcih0aGlzKTsKICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtQXVkaW9SZWNvcmQpLT5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllciwgdGhpcyk7CiAKLSAgICByZXR1cm4gTk9fRVJST1I7Ci0KLSAgICAvLyBFbmQgb2YgcmV0cnkgbG9vcC4KLSAgICAvLyBUaGUgbGFjayBvZiBpbmRlbnRhdGlvbiBpcyBkZWxpYmVyYXRlLCB0byByZWR1Y2UgY29kZSBjaHVybiBhbmQgZWFzZSBtZXJnZXMuCi0gICAgfQotCi0vLyBBcnJpdmUgaGVyZSBvbiBlcnJvciwgdmlhIGEgYnJlYWsKLSAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUlucHV0KGlucHV0LCBtU2Vzc2lvbklkKTsKLSAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7Ci0gICAgfQorZXhpdDoKKyAgICBtU3RhdHVzID0gc3RhdHVzOworICAgIC8vIHNwPElBdWRpb1RyYWNrPiB0cmFjayBkZXN0cnVjdG9yIHdpbGwgY2F1c2UgcmVsZWFzZU91dHB1dCgpIHRvIGJlIGNhbGxlZCBieSBBdWRpb0ZsaW5nZXIKICAgICByZXR1cm4gc3RhdHVzOwogfQogCkBAIC0xMjE2LDIyICsxMjY2LDQzIEBACiAgICAgQUxPR1coImRlYWQgSUF1ZGlvUmVjb3JkLCBjcmVhdGluZyBhIG5ldyBvbmUgZnJvbSAlcygpIiwgZnJvbSk7CiAgICAgKyttU2VxdWVuY2U7CiAKKyAgICBjb25zdCBpbnQgSU5JVElBTF9SRVRSSUVTID0gMzsKKyAgICBpbnQgcmV0cmllcyA9IElOSVRJQUxfUkVUUklFUzsKK3JldHJ5OgorICAgIGlmIChyZXRyaWVzIDwgSU5JVElBTF9SRVRSSUVTKSB7CisgICAgICAgIC8vIHJlZnJlc2ggdGhlIGF1ZGlvIGNvbmZpZ3VyYXRpb24gY2FjaGUgaW4gdGhpcyBwcm9jZXNzIHRvIG1ha2Ugc3VyZSB3ZSBnZXQgbmV3CisgICAgICAgIC8vIGlucHV0IHBhcmFtZXRlcnMgYW5kIG5ldyBJQXVkaW9SZWNvcmQgaW4gY3JlYXRlUmVjb3JkX2woKQorICAgICAgICBBdWRpb1N5c3RlbTo6Y2xlYXJBdWRpb0NvbmZpZ0NhY2hlKCk7CisgICAgfQogICAgIG1GbGFncyA9IG1PcmlnRmxhZ3M7CiAKLSAgICAvLyBpZiB0aGUgbmV3IElBdWRpb1JlY29yZCBpcyBjcmVhdGVkLCBvcGVuUmVjb3JkX2woKSB3aWxsIG1vZGlmeSB0aGUKKyAgICAvLyBpZiB0aGUgbmV3IElBdWRpb1JlY29yZCBpcyBjcmVhdGVkLCBjcmVhdGVSZWNvcmRfbCgpIHdpbGwgbW9kaWZ5IHRoZQogICAgIC8vIGZvbGxvd2luZyBtZW1iZXIgdmFyaWFibGVzOiBtQXVkaW9SZWNvcmQsIG1DYmxrTWVtb3J5LCBtQ2JsaywgbUJ1ZmZlck1lbW9yeS4KICAgICAvLyBJdCB3aWxsIGFsc28gZGVsZXRlIHRoZSBzdHJvbmcgcmVmZXJlbmNlcyBvbiBwcmV2aW91cyBJQXVkaW9SZWNvcmQgYW5kIElNZW1vcnkKICAgICBNb2R1bG88dWludDMyX3Q+IHBvc2l0aW9uKG1Qcm94eS0+Z2V0UG9zaXRpb24oKSk7CiAgICAgbU5ld1Bvc2l0aW9uID0gcG9zaXRpb24gKyBtVXBkYXRlUGVyaW9kOwotICAgIHN0YXR1c190IHJlc3VsdCA9IG9wZW5SZWNvcmRfbChwb3NpdGlvbiwgbU9wUGFja2FnZU5hbWUpOwotICAgIGlmIChyZXN1bHQgPT0gTk9fRVJST1IpIHsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBjcmVhdGVSZWNvcmRfbChwb3NpdGlvbiwgbU9wUGFja2FnZU5hbWUpOworCisgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HVygiJXMoKTogY3JlYXRlUmVjb3JkX2wgZmFpbGVkLCBkbyBub3QgcmV0cnkiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHJpZXMgPSAwOworICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChtQWN0aXZlKSB7CiAgICAgICAgICAgICAvLyBjYWxsYmFjayB0aHJlYWQgb3Igc3luYyBldmVudCBoYXNuJ3QgY2hhbmdlZAogICAgICAgICAgICAgLy8gRklYTUUgdGhpcyBmYWlscyBpZiB3ZSBoYXZlIGEgbmV3IEF1ZGlvRmxpbmdlciBpbnN0YW5jZQotICAgICAgICAgICAgcmVzdWx0ID0gbUF1ZGlvUmVjb3JkLT5zdGFydChBdWRpb1N5c3RlbTo6U1lOQ19FVkVOVF9TQU1FLCBBVURJT19TRVNTSU9OX05PTkUpOworICAgICAgICAgICAgcmVzdWx0ID0gbUF1ZGlvUmVjb3JkLT5zdGFydCgKKyAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6U1lOQ19FVkVOVF9TQU1FLCBBVURJT19TRVNTSU9OX05PTkUpLnRyYW5zYWN0aW9uRXJyb3IoKTsKICAgICAgICAgfQogICAgICAgICBtRnJhbWVzUmVhZFNlcnZlck9mZnNldCA9IG1GcmFtZXNSZWFkOyAvLyBzZXJ2ZXIgcmVzZXRzIHRvIHplcm8gc28gd2UgbmVlZCBhbiBvZmZzZXQuCiAgICAgfQorCisgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HVygiJXMoKSBmYWlsZWQgc3RhdHVzICVkLCByZXRyaWVzICVkIiwgX19mdW5jX18sIHJlc3VsdCwgcmV0cmllcyk7CisgICAgICAgIGlmICgtLXJldHJpZXMgPiAwKSB7CisgICAgICAgICAgICBnb3RvIHJldHJ5OworICAgICAgICB9CisgICAgfQorCiAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgewogICAgICAgICBBTE9HVygicmVzdG9yZVJlY29yZF9sKCkgZmFpbGVkIHN0YXR1cyAlZCIsIHJlc3VsdCk7CiAgICAgICAgIG1BY3RpdmUgPSBmYWxzZTsKQEAgLTEzMDMsNiArMTM3NCwxNCBAQAogICAgIH0KIH0KIAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0dXNfdCBBdWRpb1JlY29yZDo6Z2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogYWN0aXZlTWljcm9waG9uZXMpCit7CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIHJldHVybiBtQXVkaW9SZWNvcmQtPmdldEFjdGl2ZU1pY3JvcGhvbmVzKGFjdGl2ZU1pY3JvcGhvbmVzKS50cmFuc2FjdGlvbkVycm9yKCk7Cit9CisKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogdm9pZCBBdWRpb1JlY29yZDo6RGVhdGhOb3RpZmllcjo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9TeXN0ZW0uY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9TeXN0ZW0uY3BwCmluZGV4IGNkYzc1YWMuLmMwNzI5MDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvU3lzdGVtLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1N5c3RlbS5jcHAKQEAgLTIwLDYgKzIwLDggQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9JQXVkaW9GbGluZ2VyLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oPgpAQCAtMzgsOCArNDAsNyBAQAogc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRmxpbmdlckNsaWVudD4gQXVkaW9TeXN0ZW06OmdBdWRpb0ZsaW5nZXJDbGllbnQ7CiBhdWRpb19lcnJvcl9jYWxsYmFjayBBdWRpb1N5c3RlbTo6Z0F1ZGlvRXJyb3JDYWxsYmFjayA9IE5VTEw7CiBkeW5hbWljX3BvbGljeV9jYWxsYmFjayBBdWRpb1N5c3RlbTo6Z0R5blBvbGljeUNhbGxiYWNrID0gTlVMTDsKLXJlY29yZF9jb25maWdfY2FsbGJhY2sgIEF1ZGlvU3lzdGVtOjpnUmVjb3JkQ29uZmlnQ2FsbGJhY2sgPSBOVUxMOwotCityZWNvcmRfY29uZmlnX2NhbGxiYWNrIEF1ZGlvU3lzdGVtOjpnUmVjb3JkQ29uZmlnQ2FsbGJhY2sgPSBOVUxMOwogCiAvLyBlc3RhYmxpc2ggYmluZGVyIGludGVyZmFjZSB0byBBdWRpb0ZsaW5nZXIgc2VydmljZQogY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCkKQEAgLTc1LDcgKzc2LDkgQEAKICAgICAgICAgYWYgPSBnQXVkaW9GbGluZ2VyOwogICAgIH0KICAgICBpZiAoYWZjICE9IDApIHsKKyAgICAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgIGFmLT5yZWdpc3RlckNsaWVudChhZmMpOworICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKICAgICB9CiAgICAgcmV0dXJuIGFmOwogfQpAQCAtMjUzLDYgKzI1NiwzMSBAQAogICAgIHJldHVybiB2b2x1bWUgPyAxMDAgLSBpbnQoZEJDb252ZXJ0SW52ZXJzZSAqIGxvZyh2b2x1bWUpICsgMC41KSA6IDA7CiB9CiAKKy8qIHN0YXRpYyAqLyBzaXplX3QgQXVkaW9TeXN0ZW06OmNhbGN1bGF0ZU1pbkZyYW1lQ291bnQoCisgICAgICAgIHVpbnQzMl90IGFmTGF0ZW5jeU1zLCB1aW50MzJfdCBhZkZyYW1lQ291bnQsIHVpbnQzMl90IGFmU2FtcGxlUmF0ZSwKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgZmxvYXQgc3BlZWQgLyosIHVpbnQzMl90IG5vdGlmaWNhdGlvbnNQZXJCdWZmZXJSZXEqLykKK3sKKyAgICAvLyBFbnN1cmUgdGhhdCBidWZmZXIgZGVwdGggY292ZXJzIGF0IGxlYXN0IGF1ZGlvIGhhcmR3YXJlIGxhdGVuY3kKKyAgICB1aW50MzJfdCBtaW5CdWZDb3VudCA9IGFmTGF0ZW5jeU1zIC8gKCgxMDAwICogYWZGcmFtZUNvdW50KSAvIGFmU2FtcGxlUmF0ZSk7CisgICAgaWYgKG1pbkJ1ZkNvdW50IDwgMikgeworICAgICAgICBtaW5CdWZDb3VudCA9IDI7CisgICAgfQorI2lmIDAKKyAgICAvLyBUaGUgbm90aWZpY2F0aW9uc1BlckJ1ZmZlclJlcSBwYXJhbWV0ZXIgaXMgbm90IHlldCB1c2VkIGZvciBub24tZmFzdCB0cmFja3MsCisgICAgLy8gYnV0IGtlZXBpbmcgdGhlIGNvZGUgaGVyZSB0byBtYWtlIGl0IGVhc2llciB0byBhZGQgbGF0ZXIuCisgICAgaWYgKG1pbkJ1ZkNvdW50IDwgbm90aWZpY2F0aW9uc1BlckJ1ZmZlclJlcSkgeworICAgICAgICBtaW5CdWZDb3VudCA9IG5vdGlmaWNhdGlvbnNQZXJCdWZmZXJSZXE7CisgICAgfQorI2VuZGlmCisgICAgQUxPR1YoImNhbGN1bGF0ZU1pbkZyYW1lQ291bnQgYWZMYXRlbmN5ICV1ICBhZkZyYW1lQ291bnQgJXUgIGFmU2FtcGxlUmF0ZSAldSAgIgorICAgICAgICAgICAgInNhbXBsZVJhdGUgJXUgIHNwZWVkICVmICBtaW5CdWZDb3VudDogJXUiIC8qIiAgbm90aWZpY2F0aW9uc1BlckJ1ZmZlclJlcSAldSIqLywKKyAgICAgICAgICAgIGFmTGF0ZW5jeU1zLCBhZkZyYW1lQ291bnQsIGFmU2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSwgc3BlZWQsIG1pbkJ1ZkNvdW50CisgICAgICAgICAgICAvKiwgbm90aWZpY2F0aW9uc1BlckJ1ZmZlclJlcSovKTsKKyAgICByZXR1cm4gbWluQnVmQ291bnQgKiBzb3VyY2VGcmFtZXNOZWVkZWRXaXRoVGltZXN0cmV0Y2goCisgICAgICAgICAgICBzYW1wbGVSYXRlLCBhZkZyYW1lQ291bnQsIGFmU2FtcGxlUmF0ZSwgc3BlZWQpOworfQorCisKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRTYW1wbGluZ1JhdGUodWludDMyX3QqIHNhbXBsaW5nUmF0ZSwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKQogewogICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDsKQEAgLTYwNSw3ICs2MzMsNyBAQAogICAgICAgICB8fCAoY2hhbm5lbE1hc2sgIT0gbUluQ2hhbm5lbE1hc2spKSB7CiAgICAgICAgIHNpemVfdCBpbkJ1ZmZTaXplID0gYWYtPmdldElucHV0QnVmZmVyU2l6ZShzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrKTsKICAgICAgICAgaWYgKGluQnVmZlNpemUgPT0gMCkgewotICAgICAgICAgICAgQUxPR0UoIkF1ZGlvU3lzdGVtOjpnZXRJbnB1dEJ1ZmZlclNpemUgZmFpbGVkIHNhbXBsZVJhdGUgJWQgZm9ybWF0ICUjeCBjaGFubmVsTWFzayAleCIsCisgICAgICAgICAgICBBTE9HRSgiQXVkaW9TeXN0ZW06OmdldElucHV0QnVmZmVyU2l6ZSBmYWlsZWQgc2FtcGxlUmF0ZSAlZCBmb3JtYXQgJSN4IGNoYW5uZWxNYXNrICUjeCIsCiAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2spOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQpAQCAtNzQyLDcgKzc3MCwxMCBAQAogICAgICAgICBhcCA9IGdBdWRpb1BvbGljeVNlcnZpY2U7CiAgICAgfQogICAgIGlmIChhcGMgIT0gMCkgeworICAgICAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICAgICAgYXAtPnJlZ2lzdGVyQ2xpZW50KGFwYyk7CisgICAgICAgIGFwLT5zZXRBdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkKGFwYy0+aXNBdWRpb1BvcnRDYkVuYWJsZWQoKSk7CisgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwogICAgIH0KIAogICAgIHJldHVybiBhcDsKQEAgLTgyMiwyMiArODUzLDE4IEBACiB9CiAKIAotYXVkaW9faW9faGFuZGxlX3QgQXVkaW9TeXN0ZW06OmdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gMDsKLSAgICByZXR1cm4gYXBzLT5nZXRPdXRwdXQoc3RyZWFtLCBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZsYWdzLCBvZmZsb2FkSW5mbyk7CisgICAgcmV0dXJuIGFwcy0+Z2V0T3V0cHV0KHN0cmVhbSk7CiB9CiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCkBAIC04NDYsNyArODczLDcgQEAKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIGFwcy0+Z2V0T3V0cHV0Rm9yQXR0cihhdHRyLCBvdXRwdXQsIHNlc3Npb24sIHN0cmVhbSwgdWlkLAorICAgIHJldHVybiBhcHMtPmdldE91dHB1dEZvckF0dHIoYXR0ciwgb3V0cHV0LCBzZXNzaW9uLCBzdHJlYW0sIHBpZCwgdWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIHNlbGVjdGVkRGV2aWNlSWQsIHBvcnRJZCk7CiB9CkBAIC04ODMsNiArOTEwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLApAQCAtODkxLDMyICs5MTksMjkgQEAKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgcmV0dXJuIGFwcy0+Z2V0SW5wdXRGb3JBdHRyKAotICAgICAgICAgICAgYXR0ciwgaW5wdXQsIHNlc3Npb24sIHBpZCwgdWlkLAorICAgICAgICAgICAgYXR0ciwgaW5wdXQsIHNlc3Npb24sIHBpZCwgdWlkLCBvcFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgY29uZmlnLCBmbGFncywgc2VsZWN0ZWREZXZpY2VJZCwgcG9ydElkKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLCBib29sICpzaWxlbmNlZCkKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhcHMtPnN0YXJ0SW5wdXQoaW5wdXQsIHNlc3Npb24pOworICAgIHJldHVybiBhcHMtPnN0YXJ0SW5wdXQocG9ydElkLCBzaWxlbmNlZCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0b3BJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhcHMtPnN0b3BJbnB1dChpbnB1dCwgc2Vzc2lvbik7CisgICAgcmV0dXJuIGFwcy0+c3RvcElucHV0KHBvcnRJZCk7CiB9CiAKLXZvaWQgQXVkaW9TeXN0ZW06OnJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3ZvaWQgQXVkaW9TeXN0ZW06OnJlbGVhc2VJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuOwotICAgIGFwcy0+cmVsZWFzZUlucHV0KGlucHV0LCBzZXNzaW9uKTsKKyAgICBhcHMtPnJlbGVhc2VJbnB1dChwb3J0SWQpOwogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6aW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKQEAgLTEwMzUsMTEgKzEwNjAsMTEgQEAKICAgICByZXR1cm4gYWYtPmdldFByaW1hcnlPdXRwdXRGcmFtZUNvdW50KCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRMb3dSYW1EZXZpY2UoYm9vbCBpc0xvd1JhbURldmljZSkKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRMb3dSYW1EZXZpY2UoYm9vbCBpc0xvd1JhbURldmljZSwgaW50NjRfdCB0b3RhbE1lbW9yeSkKIHsKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKICAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhZi0+c2V0TG93UmFtRGV2aWNlKGlzTG93UmFtRGV2aWNlKTsKKyAgICByZXR1cm4gYWYtPnNldExvd1JhbURldmljZShpc0xvd1JhbURldmljZSwgdG90YWxNZW1vcnkpOwogfQogCiB2b2lkIEF1ZGlvU3lzdGVtOjpjbGVhckF1ZGlvQ29uZmlnQ2FjaGUoKQpAQCAtMTI1NCw2ICsxMjc5LDMxIEBACiAgICAgcmV0dXJuIGFwcy0+Z2V0U3RyZWFtVm9sdW1lREIoc3RyZWFtLCBpbmRleCwgZGV2aWNlKTsKIH0KIAorc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldE1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKQoreworICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgcmV0dXJuIGFmLT5nZXRNaWNyb3Bob25lcyhtaWNyb3Bob25lcyk7Cit9CisKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRTdXJyb3VuZEZvcm1hdHModW5zaWduZWQgaW50ICpudW1TdXJyb3VuZEZvcm1hdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpzdXJyb3VuZEZvcm1hdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKnN1cnJvdW5kRm9ybWF0c0VuYWJsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVwb3J0ZWQpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5nZXRTdXJyb3VuZEZvcm1hdHMoCisgICAgICAgICAgICBudW1TdXJyb3VuZEZvcm1hdHMsIHN1cnJvdW5kRm9ybWF0cywgc3Vycm91bmRGb3JtYXRzRW5hYmxlZCwgcmVwb3J0ZWQpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0LCBib29sIGVuYWJsZWQpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5zZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9Gb3JtYXQsIGVuYWJsZWQpOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogaW50IEF1ZGlvU3lzdGVtOjpBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6OmFkZEF1ZGlvUG9ydENhbGxiYWNrKApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFjay5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrLmNwcAppbmRleCAzNTI5ZDJjLi5hYjllZmU4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrLmNwcApAQCAtMjksOCArMjksMTEgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaD4KICNpbmNsdWRlIDxtZWRpYS9JQXVkaW9GbGluZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFBbmFseXRpY3NJdGVtLmg+CisjaW5jbHVkZSA8bWVkaWEvVHlwZUNvbnZlcnRlci5oPgogCiAjZGVmaW5lIFdBSVRfUEVSSU9EX01TICAgICAgICAgICAgICAgICAgMTAKICNkZWZpbmUgV0FJVF9TVFJFQU1fRU5EX1RJTUVPVVRfU0VDICAgICAxMjAKQEAgLTM5LDYgKzQyLDggQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCit1c2luZyBtZWRpYTo6Vm9sdW1lU2hhcGVyOworCiAvLyBUT0RPOiBNb3ZlIHRvIGEgc2VwYXJhdGUgLmgKIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CkBAIC01MSw4ICs1Niw2IEBACiAgICAgcmV0dXJuIHggPiB5ID8geCA6IHk7CiB9CiAKLXN0YXRpYyBjb25zdCBpbnQzMl90IE5BTk9TX1BFUl9TRUNPTkQgPSAxMDAwMDAwMDAwOwotCiBzdGF0aWMgaW5saW5lIG5zZWNzX3QgZnJhbWVzVG9OYW5vc2Vjb25kcyhzc2l6ZV90IGZyYW1lcywgdWludDMyX3Qgc2FtcGxlUmF0ZSwgZmxvYXQgc3BlZWQpCiB7CiAgICAgcmV0dXJuICgoZG91YmxlKWZyYW1lcyAqIDEwMDAwMDAwMDApIC8gKChkb3VibGUpc2FtcGxlUmF0ZSAqIHNwZWVkKTsKQEAgLTk3LDMyICsxMDAsNiBAQAogICAgIHJldHVybiBrRml4UGl0Y2ggPyBBVURJT19USU1FU1RSRVRDSF9QSVRDSF9OT1JNQUwgOiBwaXRjaDsKIH0KIAotLy8gTXVzdCBtYXRjaCBzaW1pbGFyIGNvbXB1dGF0aW9uIGluIGNyZWF0ZVRyYWNrX2wgaW4gVGhyZWFkcy5jcHAuCi0vLyBUT0RPOiBNb3ZlIHRvIGEgY29tbW9uIGxpYnJhcnkKLXN0YXRpYyBzaXplX3QgY2FsY3VsYXRlTWluRnJhbWVDb3VudCgKLSAgICAgICAgdWludDMyX3QgYWZMYXRlbmN5TXMsIHVpbnQzMl90IGFmRnJhbWVDb3VudCwgdWludDMyX3QgYWZTYW1wbGVSYXRlLAotICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLCBmbG9hdCBzcGVlZCAvKiwgdWludDMyX3Qgbm90aWZpY2F0aW9uc1BlckJ1ZmZlclJlcSovKQotewotICAgIC8vIEVuc3VyZSB0aGF0IGJ1ZmZlciBkZXB0aCBjb3ZlcnMgYXQgbGVhc3QgYXVkaW8gaGFyZHdhcmUgbGF0ZW5jeQotICAgIHVpbnQzMl90IG1pbkJ1ZkNvdW50ID0gYWZMYXRlbmN5TXMgLyAoKDEwMDAgKiBhZkZyYW1lQ291bnQpIC8gYWZTYW1wbGVSYXRlKTsKLSAgICBpZiAobWluQnVmQ291bnQgPCAyKSB7Ci0gICAgICAgIG1pbkJ1ZkNvdW50ID0gMjsKLSAgICB9Ci0jaWYgMAotICAgIC8vIFRoZSBub3RpZmljYXRpb25zUGVyQnVmZmVyUmVxIHBhcmFtZXRlciBpcyBub3QgeWV0IHVzZWQgZm9yIG5vbi1mYXN0IHRyYWNrcywKLSAgICAvLyBidXQga2VlcGluZyB0aGUgY29kZSBoZXJlIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGFkZCBsYXRlci4KLSAgICBpZiAobWluQnVmQ291bnQgPCBub3RpZmljYXRpb25zUGVyQnVmZmVyUmVxKSB7Ci0gICAgICAgIG1pbkJ1ZkNvdW50ID0gbm90aWZpY2F0aW9uc1BlckJ1ZmZlclJlcTsKLSAgICB9Ci0jZW5kaWYKLSAgICBBTE9HVigiY2FsY3VsYXRlTWluRnJhbWVDb3VudCBhZkxhdGVuY3kgJXUgIGFmRnJhbWVDb3VudCAldSAgYWZTYW1wbGVSYXRlICV1ICAiCi0gICAgICAgICAgICAic2FtcGxlUmF0ZSAldSAgc3BlZWQgJWYgIG1pbkJ1ZkNvdW50OiAldSIgLyoiICBub3RpZmljYXRpb25zUGVyQnVmZmVyUmVxICV1IiovLAotICAgICAgICAgICAgYWZMYXRlbmN5TXMsIGFmRnJhbWVDb3VudCwgYWZTYW1wbGVSYXRlLCBzYW1wbGVSYXRlLCBzcGVlZCwgbWluQnVmQ291bnQKLSAgICAgICAgICAgIC8qLCBub3RpZmljYXRpb25zUGVyQnVmZmVyUmVxKi8pOwotICAgIHJldHVybiBtaW5CdWZDb3VudCAqIHNvdXJjZUZyYW1lc05lZWRlZFdpdGhUaW1lc3RyZXRjaCgKLSAgICAgICAgICAgIHNhbXBsZVJhdGUsIGFmRnJhbWVDb3VudCwgYWZTYW1wbGVSYXRlLCBzcGVlZCk7Ci19Ci0KIC8vIHN0YXRpYwogc3RhdHVzX3QgQXVkaW9UcmFjazo6Z2V0TWluRnJhbWVDb3VudCgKICAgICAgICAgc2l6ZV90KiBmcmFtZUNvdW50LApAQCAtMTYzLDggKzE0MCw4IEBACiAKICAgICAvLyBXaGVuIGNhbGxlZCBmcm9tIGNyZWF0ZVRyYWNrLCBzcGVlZCBpcyAxLjBmIChub3JtYWwgc3BlZWQpLgogICAgIC8vIFRoaXMgaXMgcmVjaGVja2VkIGFnYWluIG9uIHNldHRpbmcgcGxheWJhY2sgcmF0ZSAoVE9ETzogb24gc2V0dGluZyBzYW1wbGUgcmF0ZSwgdG9vKS4KLSAgICAqZnJhbWVDb3VudCA9IGNhbGN1bGF0ZU1pbkZyYW1lQ291bnQoYWZMYXRlbmN5LCBhZkZyYW1lQ291bnQsIGFmU2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSwgMS4wZgotICAgICAgICAgICAgLyosIDAgbm90aWZpY2F0aW9uc1BlckJ1ZmZlclJlcSovKTsKKyAgICAqZnJhbWVDb3VudCA9IEF1ZGlvU3lzdGVtOjpjYWxjdWxhdGVNaW5GcmFtZUNvdW50KGFmTGF0ZW5jeSwgYWZGcmFtZUNvdW50LCBhZlNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgMS4wZiAvKiwgMCBub3RpZmljYXRpb25zUGVyQnVmZmVyUmVxKi8pOwogCiAgICAgLy8gVGhlIGZvcm11bGEgYWJvdmUgc2hvdWxkIGFsd2F5cyBwcm9kdWNlIGEgbm9uLXplcm8gdmFsdWUgdW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXM6CiAgICAgLy8gQXVkaW9UcmFjay5TQU1QTEVfUkFURV9IWl9NSU4gPD0gc2FtcGxlUmF0ZSA8PSBBdWRpb1RyYWNrLlNBTVBMRV9SQVRFX0haX01BWC4KQEAgLTE4MSw2ICsxNTgsODggQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKK3N0YXRpYyBzdGQ6OnN0cmluZyBhdWRpb0NvbnRlbnRUeXBlU3RyaW5nKGF1ZGlvX2NvbnRlbnRfdHlwZV90IHZhbHVlKSB7CisgICAgc3RkOjpzdHJpbmcgY29udGVudFR5cGU7CisgICAgaWYgKEF1ZGlvQ29udGVudFR5cGVDb252ZXJ0ZXI6OnRvU3RyaW5nKHZhbHVlLCBjb250ZW50VHlwZSkpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRlbnRUeXBlOworICAgIH0KKyAgICBjaGFyIHJhd2J1ZmZlclsxNl07ICAvLyByb29tIGZvciAiJWQiCisgICAgc25wcmludGYocmF3YnVmZmVyLCBzaXplb2YocmF3YnVmZmVyKSwgIiVkIiwgdmFsdWUpOworICAgIHJldHVybiByYXdidWZmZXI7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBhdWRpb1VzYWdlU3RyaW5nKGF1ZGlvX3VzYWdlX3QgdmFsdWUpIHsKKyAgICBzdGQ6OnN0cmluZyB1c2FnZTsKKyAgICBpZiAoVXNhZ2VUeXBlQ29udmVydGVyOjp0b1N0cmluZyh2YWx1ZSwgdXNhZ2UpKSB7CisgICAgICAgIHJldHVybiB1c2FnZTsKKyAgICB9CisgICAgY2hhciByYXdidWZmZXJbMTZdOyAgLy8gcm9vbSBmb3IgIiVkIgorICAgIHNucHJpbnRmKHJhd2J1ZmZlciwgc2l6ZW9mKHJhd2J1ZmZlciksICIlZCIsIHZhbHVlKTsKKyAgICByZXR1cm4gcmF3YnVmZmVyOworfQorCit2b2lkIEF1ZGlvVHJhY2s6Ok1lZGlhTWV0cmljczo6Z2F0aGVyKGNvbnN0IEF1ZGlvVHJhY2sgKnRyYWNrKQoreworCisgICAgLy8ga2V5IGZvciBtZWRpYSBzdGF0aXN0aWNzIGlzIGRlZmluZWQgaW4gdGhlIGhlYWRlcgorICAgIC8vIGF0dHJzIGZvciBtZWRpYSBzdGF0aXN0aWNzCisgICAgLy8gTkI6IHRoZXNlIGFyZSBtYXRjaGVkIHdpdGggcHVibGljIEphdmEgQVBJIGNvbnN0YW50cyBkZWZpbmVkCisgICAgLy8gaW4gZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb1RyYWNrLmphdmEKKyAgICAvLyBUaGVzZSBtdXN0IGJlIGtlcHQgc3luY2hyb25pemVkIHdpdGggdGhlIGNvbnN0YW50cyB0aGVyZS4KKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvVHJhY2tTdHJlYW1UeXBlW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLnN0cmVhbXR5cGUiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9UcmFja0NvbnRlbnRUeXBlW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLnR5cGUiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9UcmFja1VzYWdlW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLnVzYWdlIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvVHJhY2tTYW1wbGVSYXRlW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLnNhbXBsZXJhdGUiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9UcmFja0NoYW5uZWxNYXNrW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLmNoYW5uZWxtYXNrIjsKKworICAgIC8vIE5COiBUaGVzZSBhcmUgbm90IHlldCBleHBvc2VkIGFzIHB1YmxpYyBKYXZhIEFQSSBjb25zdGFudHMuCisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1RyYWNrVW5kZXJydW5GcmFtZXNbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2sudW5kZXJydW5mcmFtZXMiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9UcmFja1N0YXJ0dXBHbGl0Y2hbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2suZ2xpdGNoLnN0YXJ0dXAiOworCisgICAgLy8gb25seSBpZiB3ZSdyZSBpbiBhIGdvb2Qgc3RhdGUuLi4KKyAgICAvLyBYWFg6IHNoYWxsIHdlIGdhdGhlciBhbHRlcm5hdGl2ZSBpbmZvIGlmIGZhaWxpbmc/CisgICAgY29uc3Qgc3RhdHVzX3QgbHN0YXR1cyA9IHRyYWNrLT5pbml0Q2hlY2soKTsKKyAgICBpZiAobHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRCgibm8gbWV0cmljcyBnYXRoZXJlZCwgdHJhY2sgc3RhdHVzPSVkIiwgKGludCkgbHN0YXR1cyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBjb25zdHJ1Y3RvciBndWFyYW50ZWVzIG1BbmFseXRpY3NJdGVtIGlzIHZhbGlkCisKKyAgICBjb25zdCBpbnQzMl90IHVuZGVycnVuRnJhbWVzID0gdHJhY2stPmdldFVuZGVycnVuRnJhbWVzKCk7CisgICAgaWYgKHVuZGVycnVuRnJhbWVzICE9IDApIHsKKyAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtBdWRpb1RyYWNrVW5kZXJydW5GcmFtZXMsIHVuZGVycnVuRnJhbWVzKTsKKyAgICB9CisKKyAgICBpZiAodHJhY2stPm1UaW1lc3RhbXBTdGFydHVwR2xpdGNoUmVwb3J0ZWQpIHsKKyAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtBdWRpb1RyYWNrU3RhcnR1cEdsaXRjaCwgMSk7CisgICAgfQorCisgICAgaWYgKHRyYWNrLT5tU3RyZWFtVHlwZSAhPSAtMSkgeworICAgICAgICAvLyBkZXByZWNhdGVkLCBidXQgdGhpcyB3aWxsIHRlbGwgdXMgd2hvIHN0aWxsIHVzZXMgaXQuCisgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQXVkaW9UcmFja1N0cmVhbVR5cGUsIHRyYWNrLT5tU3RyZWFtVHlwZSk7CisgICAgfQorICAgIC8vIFhYWDogY29uc2lkZXIgaW5jbHVkaW5nIGZyb20gbUF0dHJpYnV0ZXM6IHNvdXJjZSB0eXBlCisgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoa0F1ZGlvVHJhY2tDb250ZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb0NvbnRlbnRUeXBlU3RyaW5nKHRyYWNrLT5tQXR0cmlidXRlcy5jb250ZW50X3R5cGUpLmNfc3RyKCkpOworICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1RyYWNrVXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Vc2FnZVN0cmluZyh0cmFjay0+bUF0dHJpYnV0ZXMudXNhZ2UpLmNfc3RyKCkpOworICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQXVkaW9UcmFja1NhbXBsZVJhdGUsIHRyYWNrLT5tU2FtcGxlUmF0ZSk7CisgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDY0KGtBdWRpb1RyYWNrQ2hhbm5lbE1hc2ssIHRyYWNrLT5tQ2hhbm5lbE1hc2spOworfQorCisvLyBoYW5kIHRoZSB1c2VyIGEgc25hcHNob3Qgb2YgdGhlIG1ldHJpY3MuCitzdGF0dXNfdCBBdWRpb1RyYWNrOjpnZXRNZXRyaWNzKE1lZGlhQW5hbHl0aWNzSXRlbSAqICZpdGVtKQoreworICAgIG1NZWRpYU1ldHJpY3MuZ2F0aGVyKHRoaXMpOworICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAqdG1wID0gbU1lZGlhTWV0cmljcy5kdXAoKTsKKyAgICBpZiAodG1wID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaXRlbSA9IHRtcDsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKIEF1ZGlvVHJhY2s6OkF1ZGlvVHJhY2soKQogICAgIDogbVN0YXR1cyhOT19JTklUKSwKICAgICAgIG1TdGF0ZShTVEFURV9TVE9QUEVEKSwKQEAgLTE4OCw4ICsyNDcsNyBAQAogICAgICAgbVByZXZpb3VzU2NoZWR1bGluZ0dyb3VwKFNQX0RFRkFVTFQpLAogICAgICAgbVBhdXNlZFBvc2l0aW9uKDApLAogICAgICAgbVNlbGVjdGVkRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSksCi0gICAgICBtUm91dGVkRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSksCi0gICAgICBtUG9ydElkKEFVRElPX1BPUlRfSEFORExFX05PTkUpCisgICAgICBtUm91dGVkRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkKIHsKICAgICBtQXR0cmlidXRlcy5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTjsKICAgICBtQXR0cmlidXRlcy51c2FnZSA9IEFVRElPX1VTQUdFX1VOS05PV047CkBAIC0yMTQsMTkgKzI3MiwxOCBAQAogICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMsCiAgICAgICAgIGJvb2wgZG9Ob3RSZWNvbm5lY3QsCi0gICAgICAgIGZsb2F0IG1heFJlcXVpcmVkU3BlZWQpCisgICAgICAgIGZsb2F0IG1heFJlcXVpcmVkU3BlZWQsCisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCkKICAgICA6IG1TdGF0dXMoTk9fSU5JVCksCiAgICAgICBtU3RhdGUoU1RBVEVfU1RPUFBFRCksCiAgICAgICBtUHJldmlvdXNQcmlvcml0eShBTkRST0lEX1BSSU9SSVRZX05PUk1BTCksCiAgICAgICBtUHJldmlvdXNTY2hlZHVsaW5nR3JvdXAoU1BfREVGQVVMVCksCi0gICAgICBtUGF1c2VkUG9zaXRpb24oMCksCi0gICAgICBtU2VsZWN0ZWREZXZpY2VJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKSwKLSAgICAgIG1Qb3J0SWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkKKyAgICAgIG1QYXVzZWRQb3NpdGlvbigwKQogewotICAgIG1TdGF0dXMgPSBzZXQoc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywKKyAgICAodm9pZClzZXQoc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywKICAgICAgICAgICAgIGZyYW1lQ291bnQsIGZsYWdzLCBjYmYsIHVzZXIsIG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgICAgIDAgLypzaGFyZWRCdWZmZXIqLywgZmFsc2UgLyp0aHJlYWRDYW5DYWxsSmF2YSovLCBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSwKLSAgICAgICAgICAgIG9mZmxvYWRJbmZvLCB1aWQsIHBpZCwgcEF0dHJpYnV0ZXMsIGRvTm90UmVjb25uZWN0LCBtYXhSZXF1aXJlZFNwZWVkKTsKKyAgICAgICAgICAgIG9mZmxvYWRJbmZvLCB1aWQsIHBpZCwgcEF0dHJpYnV0ZXMsIGRvTm90UmVjb25uZWN0LCBtYXhSZXF1aXJlZFNwZWVkLCBzZWxlY3RlZERldmljZUlkKTsKIH0KIAogQXVkaW9UcmFjazo6QXVkaW9UcmFjaygKQEAgLTI1MiwxMCArMzA5LDkgQEAKICAgICAgIG1QcmV2aW91c1ByaW9yaXR5KEFORFJPSURfUFJJT1JJVFlfTk9STUFMKSwKICAgICAgIG1QcmV2aW91c1NjaGVkdWxpbmdHcm91cChTUF9ERUZBVUxUKSwKICAgICAgIG1QYXVzZWRQb3NpdGlvbigwKSwKLSAgICAgIG1TZWxlY3RlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpLAotICAgICAgbVBvcnRJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKQorICAgICAgbVNlbGVjdGVkRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkKIHsKLSAgICBtU3RhdHVzID0gc2V0KHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssCisgICAgKHZvaWQpc2V0KHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAwIC8qZnJhbWVDb3VudCovLCBmbGFncywgY2JmLCB1c2VyLCBub3RpZmljYXRpb25GcmFtZXMsCiAgICAgICAgICAgICBzaGFyZWRCdWZmZXIsIGZhbHNlIC8qdGhyZWFkQ2FuQ2FsbEphdmEqLywgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUsIG9mZmxvYWRJbmZvLAogICAgICAgICAgICAgdWlkLCBwaWQsIHBBdHRyaWJ1dGVzLCBkb05vdFJlY29ubmVjdCwgbWF4UmVxdWlyZWRTcGVlZCk7CkBAIC0yNjMsNiArMzE5LDkgQEAKIAogQXVkaW9UcmFjazo6fkF1ZGlvVHJhY2soKQogeworICAgIC8vIHB1bGwgdG9nZXRoZXIgdGhlIG51bWJlcnMsIGJlZm9yZSB3ZSBjbGVhbiB1cCBvdXIgc3RydWN0dXJlcworICAgIG1NZWRpYU1ldHJpY3MuZ2F0aGVyKHRoaXMpOworCiAgICAgaWYgKG1TdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgY2FsbGJhY2sgZnVuY3Rpb24gZXhpdHMgaW4gdGhlIGNhc2Ugd2hlcmUKICAgICAgICAgLy8gaXQgaXMgbG9vcGluZyBvbiBidWZmZXIgZnVsbCBjb25kaXRpb24gaW4gb2J0YWluQnVmZmVyKCkuCkBAIC0zMDgsMTQgKzM2NywyMiBAQAogICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMsCiAgICAgICAgIGJvb2wgZG9Ob3RSZWNvbm5lY3QsCi0gICAgICAgIGZsb2F0IG1heFJlcXVpcmVkU3BlZWQpCisgICAgICAgIGZsb2F0IG1heFJlcXVpcmVkU3BlZWQsCisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCkKIHsKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgdWludDMyX3QgY2hhbm5lbENvdW50OworICAgIHBpZF90IGNhbGxpbmdQaWQ7CisgICAgcGlkX3QgbXlQaWQ7CisKICAgICBBTE9HVigic2V0KCk6IHN0cmVhbVR5cGUgJWQsIHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrICUjeCwgZnJhbWVDb3VudCAlenUsICIKICAgICAgICAgICAiZmxhZ3MgIyV4LCBub3RpZmljYXRpb25GcmFtZXMgJWQsIHNlc3Npb25JZCAlZCwgdHJhbnNmZXJUeXBlICVkLCB1aWQgJWQsIHBpZCAlZCIsCiAgICAgICAgICAgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgZmxhZ3MsIG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgICBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSwgdWlkLCBwaWQpOwogCiAgICAgbVRocmVhZENhbkNhbGxKYXZhID0gdGhyZWFkQ2FuQ2FsbEphdmE7CisgICAgbVNlbGVjdGVkRGV2aWNlSWQgPSBzZWxlY3RlZERldmljZUlkOworICAgIG1TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CiAKICAgICBzd2l0Y2ggKHRyYW5zZmVyVHlwZSkgewogICAgIGNhc2UgVFJBTlNGRVJfREVGQVVMVDoKQEAgLTMzMCwyNSArMzk3LDI5IEBACiAgICAgY2FzZSBUUkFOU0ZFUl9DQUxMQkFDSzoKICAgICAgICAgaWYgKGNiZiA9PSBOVUxMIHx8IHNoYXJlZEJ1ZmZlciAhPSAwKSB7CiAgICAgICAgICAgICBBTE9HRSgiVHJhbnNmZXIgdHlwZSBUUkFOU0ZFUl9DQUxMQkFDSyBidXQgY2JmID09IE5VTEwgfHwgc2hhcmVkQnVmZmVyICE9IDAiKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBUUkFOU0ZFUl9PQlRBSU46CiAgICAgY2FzZSBUUkFOU0ZFUl9TWU5DOgogICAgICAgICBpZiAoc2hhcmVkQnVmZmVyICE9IDApIHsKICAgICAgICAgICAgIEFMT0dFKCJUcmFuc2ZlciB0eXBlIFRSQU5TRkVSX09CVEFJTiBidXQgc2hhcmVkQnVmZmVyICE9IDAiKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBUUkFOU0ZFUl9TSEFSRUQ6CiAgICAgICAgIGlmIChzaGFyZWRCdWZmZXIgPT0gMCkgewogICAgICAgICAgICAgQUxPR0UoIlRyYW5zZmVyIHR5cGUgVFJBTlNGRVJfU0hBUkVEIGJ1dCBzaGFyZWRCdWZmZXIgPT0gMCIpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgICBBTE9HRSgiSW52YWxpZCB0cmFuc2ZlciB0eXBlICVkIiwgdHJhbnNmZXJUeXBlKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQogICAgIG1TaGFyZWRCdWZmZXIgPSBzaGFyZWRCdWZmZXI7CiAgICAgbVRyYW5zZmVyID0gdHJhbnNmZXJUeXBlOwpAQCAtMzYyLDcgKzQzMyw4IEBACiAgICAgLy8gaW52YXJpYW50IHRoYXQgbUF1ZGlvVHJhY2sgIT0gMCBpcyB0cnVlIG9ubHkgYWZ0ZXIgc2V0KCkgcmV0dXJucyBzdWNjZXNzZnVsbHkKICAgICBpZiAobUF1ZGlvVHJhY2sgIT0gMCkgewogICAgICAgICBBTE9HRSgiVHJhY2sgYWxyZWFkeSBpbiB1c2UiKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgZ290byBleGl0OwogICAgIH0KIAogICAgIC8vIGhhbmRsZSBkZWZhdWx0IHZhbHVlcyBmaXJzdC4KQEAgLTM3Miw3ICs0NDQsOCBAQAogICAgIGlmIChwQXR0cmlidXRlcyA9PSBOVUxMKSB7CiAgICAgICAgIGlmICh1aW50MzJfdChzdHJlYW1UeXBlKSA+PSBBVURJT19TVFJFQU1fUFVCTElDX0NOVCkgewogICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgc3RyZWFtIHR5cGUgJWQiLCBzdHJlYW1UeXBlKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgIH0KICAgICAgICAgbVN0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOwogCkBAIC00MDQsMTYgKzQ3NywxOCBAQAogICAgIC8vIHZhbGlkYXRlIHBhcmFtZXRlcnMKICAgICBpZiAoIWF1ZGlvX2lzX3ZhbGlkX2Zvcm1hdChmb3JtYXQpKSB7CiAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGZvcm1hdCAlI3giLCBmb3JtYXQpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CiAgICAgbUZvcm1hdCA9IGZvcm1hdDsKIAogICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2NoYW5uZWwoY2hhbm5lbE1hc2spKSB7CiAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGNoYW5uZWwgbWFzayAlI3giLCBjaGFubmVsTWFzayk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgZ290byBleGl0OwogICAgIH0KICAgICBtQ2hhbm5lbE1hc2sgPSBjaGFubmVsTWFzazsKLSAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spOworICAgIGNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaGFubmVsTWFzayk7CiAgICAgbUNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudDsKIAogICAgIC8vIGZvcmNlIGRpcmVjdCBmbGFnIGlmIGZvcm1hdCBpcyBub3QgbGluZWFyIFBDTQpAQCAtNDQ4LDcgKzUyMyw4IEBACiAKICAgICAvLyBzYW1wbGluZyByYXRlIG11c3QgYmUgc3BlY2lmaWVkIGZvciBkaXJlY3Qgb3V0cHV0cwogICAgIGlmIChzYW1wbGVSYXRlID09IDAgJiYgKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgZ290byBleGl0OwogICAgIH0KICAgICBtU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CiAgICAgbU9yaWdpbmFsU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CkBAIC00NzksMTIgKzU1NSwxNCBAQAogICAgICAgICBpZiAoIShmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpKSB7CiAgICAgICAgICAgICBBTE9HRSgibm90aWZpY2F0aW9uRnJhbWVzPSVkIG5vdCBwZXJtaXR0ZWQgZm9yIG5vbi1mYXN0IHRyYWNrIiwKICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVzKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGZyYW1lQ291bnQgPiAwKSB7CiAgICAgICAgICAgICBBTE9HRSgibm90aWZpY2F0aW9uRnJhbWVzPSVkIG5vdCBwZXJtaXR0ZWQgd2l0aCBub24temVybyBmcmFtZUNvdW50PSV6dSIsCiAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lcywgZnJhbWVDb3VudCk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICB9CiAgICAgICAgIG1Ob3RpZmljYXRpb25GcmFtZXNSZXEgPSAwOwogICAgICAgICBjb25zdCB1aW50MzJfdCBtaW5Ob3RpZmljYXRpb25zUGVyQnVmZmVyID0gMTsKQEAgLTQ5NiwyMCArNTc0LDE1IEBACiAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVzLCBtaW5Ob3RpZmljYXRpb25zUGVyQnVmZmVyLCBtYXhOb3RpZmljYXRpb25zUGVyQnVmZmVyKTsKICAgICB9CiAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9IDA7Ci0gICAgaWYgKHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX0FMTE9DQVRFKSB7Ci0gICAgICAgIG1TZXNzaW9uSWQgPSAoYXVkaW9fc2Vzc2lvbl90KSBBdWRpb1N5c3RlbTo6bmV3QXVkaW9VbmlxdWVJZChBVURJT19VTklRVUVfSURfVVNFX1NFU1NJT04pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7Ci0gICAgfQotICAgIGludCBjYWxsaW5ncGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwotICAgIGludCBteXBpZCA9IGdldHBpZCgpOwotICAgIGlmICh1aWQgPT0gQVVESU9fVUlEX0lOVkFMSUQgfHwgKGNhbGxpbmdwaWQgIT0gbXlwaWQpKSB7CisgICAgY2FsbGluZ1BpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKKyAgICBteVBpZCA9IGdldHBpZCgpOworICAgIGlmICh1aWQgPT0gQVVESU9fVUlEX0lOVkFMSUQgfHwgKGNhbGxpbmdQaWQgIT0gbXlQaWQpKSB7CiAgICAgICAgIG1DbGllbnRVaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbUNsaWVudFVpZCA9IHVpZDsKICAgICB9Ci0gICAgaWYgKHBpZCA9PSAtMSB8fCAoY2FsbGluZ3BpZCAhPSBteXBpZCkpIHsKLSAgICAgICAgbUNsaWVudFBpZCA9IGNhbGxpbmdwaWQ7CisgICAgaWYgKHBpZCA9PSAtMSB8fCAoY2FsbGluZ1BpZCAhPSBteVBpZCkpIHsKKyAgICAgICAgbUNsaWVudFBpZCA9IGNhbGxpbmdQaWQ7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbUNsaWVudFBpZCA9IHBpZDsKICAgICB9CkBAIC01MjQsNyArNTk3LDcgQEAKICAgICB9CiAKICAgICAvLyBjcmVhdGUgdGhlIElBdWRpb1RyYWNrCi0gICAgc3RhdHVzX3Qgc3RhdHVzID0gY3JlYXRlVHJhY2tfbCgpOworICAgIHN0YXR1cyA9IGNyZWF0ZVRyYWNrX2woKTsKIAogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgaWYgKG1BdWRpb1RyYWNrVGhyZWFkICE9IDApIHsKQEAgLTUzMiwxMCArNjA1LDkgQEAKICAgICAgICAgICAgIG1BdWRpb1RyYWNrVGhyZWFkLT5yZXF1ZXN0RXhpdEFuZFdhaXQoKTsKICAgICAgICAgICAgIG1BdWRpb1RyYWNrVGhyZWFkLmNsZWFyKCk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgZ290byBleGl0OwogICAgIH0KIAotICAgIG1TdGF0dXMgPSBOT19FUlJPUjsKICAgICBtVXNlckRhdGEgPSB1c2VyOwogICAgIG1Mb29wQ291bnQgPSAwOwogICAgIG1Mb29wU3RhcnQgPSAwOwpAQCAtNTYyLDggKzYzNCwxMSBAQAogICAgIG1GcmFtZXNXcml0dGVuID0gMDsKICAgICBtRnJhbWVzV3JpdHRlblNlcnZlck9mZnNldCA9IDA7CiAgICAgbUZyYW1lc1dyaXR0ZW5BdFJlc3RvcmUgPSAtMTsgLy8gLTEgaXMgYSB1bmlxdWUgaW5pdGlhbGl6ZXIuCi0gICAgbVZvbHVtZUhhbmRsZXIgPSBuZXcgVm9sdW1lSGFuZGxlcigpOwotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICBtVm9sdW1lSGFuZGxlciA9IG5ldyBtZWRpYTo6Vm9sdW1lSGFuZGxlcigpOworCitleGl0OgorICAgIG1TdGF0dXMgPSBzdGF0dXM7CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNjk1LDYgKzc3MCw3IEBACiAgICAgICAgIG1SZWxlYXNlZCA9IDA7CiAgICAgfQogCisgICAgbVByb3h5LT5zdG9wKCk7IC8vIG5vdGlmeSBzZXJ2ZXIgbm90IHRvIHJlYWQgYmV5b25kIGN1cnJlbnQgY2xpZW50IHBvc2l0aW9uIHVudGlsIHN0YXJ0KCkuCiAgICAgbVByb3h5LT5pbnRlcnJ1cHQoKTsKICAgICBtQXVkaW9UcmFjay0+c3RvcCgpOwogCkBAIC03MzAsNyArODA2LDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9BQ1RJVkUgfHwgbVN0YXRlID09IFNUQVRFX0ZMVVNIRUQpIHsKKyAgICBpZiAobVN0YXRlID09IFNUQVRFX0FDVElWRSkgewogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIGZsdXNoX2woKTsKQEAgLTEyMTksNiArMTI5NSw3IEBACiAgICAgICAgIG1TZWxlY3RlZERldmljZUlkID0gZGV2aWNlSWQ7CiAgICAgICAgIGlmIChtU3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBhbmRyb2lkX2F0b21pY19vcihDQkxLX0lOVkFMSUQsICZtQ2Jsay0+bUZsYWdzKTsKKyAgICAgICAgICAgIG1Qcm94eS0+aW50ZXJydXB0KCk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtMTMwNiw3NiArMTM4MywxOSBAQAogCiBzdGF0dXNfdCBBdWRpb1RyYWNrOjpjcmVhdGVUcmFja19sKCkKIHsKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgYm9vbCBjYWxsYmFja0FkZGVkID0gZmFsc2U7CisKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGF1ZGlvRmxpbmdlciA9PSAwKSB7CiAgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGF1ZGlvZmxpbmdlciIpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKKyAgICAgICAgZ290byBleGl0OwogICAgIH0KIAotICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDsKLSAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUgPSBtU3RyZWFtVHlwZTsKLSAgICBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIgPSAobVN0cmVhbVR5cGUgPT0gQVVESU9fU1RSRUFNX0RFRkFVTFQpID8gJm1BdHRyaWJ1dGVzIDogTlVMTDsKLSAgICBib29sIGNhbGxiYWNrQWRkZWQgPSBmYWxzZTsKLQorICAgIHsKICAgICAvLyBtRmxhZ3MgKG5vdCBtT3JpZ0ZsYWdzKSBpcyBtb2RpZmllZCBkZXBlbmRpbmcgb24gd2hldGhlciBmYXN0IHJlcXVlc3QgaXMgYWNjZXB0ZWQuCiAgICAgLy8gQWZ0ZXIgZmFzdCByZXF1ZXN0IGlzIGRlbmllZCwgd2Ugd2lsbCByZXF1ZXN0IGFnYWluIGlmIElBdWRpb1RyYWNrIGlzIHJlLWNyZWF0ZWQuCi0KLSAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOwotICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IG1TYW1wbGVSYXRlOwotICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBtQ2hhbm5lbE1hc2s7Ci0gICAgY29uZmlnLmZvcm1hdCA9IG1Gb3JtYXQ7Ci0gICAgY29uZmlnLm9mZmxvYWRfaW5mbyA9IG1PZmZsb2FkSW5mb0NvcHk7Ci0gICAgbVJvdXRlZERldmljZUlkID0gbVNlbGVjdGVkRGV2aWNlSWQ7Ci0gICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldE91dHB1dEZvckF0dHIoYXR0ciwgJm91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkLCAmc3RyZWFtVHlwZSwgbUNsaWVudFVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncywgJm1Sb3V0ZWREZXZpY2VJZCwgJm1Qb3J0SWQpOwotCi0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiB8fCBvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgYXVkaW8gb3V0cHV0IGZvciBzZXNzaW9uICVkLCBzdHJlYW0gdHlwZSAlZCwgdXNhZ2UgJWQsIHNhbXBsZSByYXRlICV1LCIKLSAgICAgICAgICAgICAgIiBmb3JtYXQgJSN4LCBjaGFubmVsIG1hc2sgJSN4LCBmbGFncyAlI3giLAotICAgICAgICAgICAgICBtU2Vzc2lvbklkLCBzdHJlYW1UeXBlLCBtQXR0cmlidXRlcy51c2FnZSwgbVNhbXBsZVJhdGUsIG1Gb3JtYXQsIG1DaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgbUZsYWdzKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgewotICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgYSByZWZlcmVuY2UgdG8gYW4gSS9PIGhhbmRsZSBhbmQgaGF2ZSBub3QgeWV0IGhhbmRlZCBpdCBvZmYgdG8gQXVkaW9GbGluZ2VyLAotICAgIC8vIHdlIG11c3QgcmVsZWFzZSBpdCBvdXJzZWx2ZXMgaWYgYW55dGhpbmcgZ29lcyB3cm9uZy4KLQotICAgIC8vIE5vdCBhbGwgb2YgdGhlc2UgdmFsdWVzIGFyZSBuZWVkZWQgdW5kZXIgYWxsIGNvbmRpdGlvbnMsIGJ1dCBpdCBpcyBlYXNpZXIgdG8gZ2V0IHRoZW0gYWxsCi0gICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldExhdGVuY3kob3V0cHV0LCAmbUFmTGF0ZW5jeSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiZ2V0TGF0ZW5jeSglZCkgZmFpbGVkIHN0YXR1cyAlZCIsIG91dHB1dCwgc3RhdHVzKTsKLSAgICAgICAgZ290byByZWxlYXNlOwotICAgIH0KLSAgICBBTE9HVigiY3JlYXRlVHJhY2tfbCgpIG91dHB1dCAlZCBhZkxhdGVuY3kgJXUiLCBvdXRwdXQsIG1BZkxhdGVuY3kpOwotCi0gICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldEZyYW1lQ291bnQob3V0cHV0LCAmbUFmRnJhbWVDb3VudCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiZ2V0RnJhbWVDb3VudChvdXRwdXQ9JWQpIHN0YXR1cyAlZCIsIG91dHB1dCwgc3RhdHVzKTsKLSAgICAgICAgZ290byByZWxlYXNlOwotICAgIH0KLQotICAgIC8vIFRPRE8gY29uc2lkZXIgbWFraW5nIHRoaXMgYSBtZW1iZXIgdmFyaWFibGUgaWYgdGhlcmUgYXJlIG90aGVyIHVzZXMgZm9yIGl0IGxhdGVyCi0gICAgc2l6ZV90IGFmRnJhbWVDb3VudEhBTDsKLSAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0RnJhbWVDb3VudEhBTChvdXRwdXQsICZhZkZyYW1lQ291bnRIQUwpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoImdldEZyYW1lQ291bnRIQUwob3V0cHV0PSVkKSBzdGF0dXMgJWQiLCBvdXRwdXQsIHN0YXR1cyk7Ci0gICAgICAgIGdvdG8gcmVsZWFzZTsKLSAgICB9Ci0gICAgQUxPR19BU1NFUlQoYWZGcmFtZUNvdW50SEFMID4gMCk7Ci0KLSAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0U2FtcGxpbmdSYXRlKG91dHB1dCwgJm1BZlNhbXBsZVJhdGUpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoImdldFNhbXBsaW5nUmF0ZShvdXRwdXQ9JWQpIHN0YXR1cyAlZCIsIG91dHB1dCwgc3RhdHVzKTsKLSAgICAgICAgZ290byByZWxlYXNlOwotICAgIH0KLSAgICBpZiAobVNhbXBsZVJhdGUgPT0gMCkgewotICAgICAgICBtU2FtcGxlUmF0ZSA9IG1BZlNhbXBsZVJhdGU7Ci0gICAgICAgIG1PcmlnaW5hbFNhbXBsZVJhdGUgPSBtQWZTYW1wbGVSYXRlOwotICAgIH0KLQogICAgIC8vIENsaWVudCBjYW4gb25seSBleHByZXNzIGEgcHJlZmVyZW5jZSBmb3IgRkFTVC4gIFNlcnZlciB3aWxsIHBlcmZvcm0gYWRkaXRpb25hbCB0ZXN0cy4KICAgICBpZiAobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkgewogICAgICAgICAvLyBlaXRoZXIgb2YgdGhlc2UgdXNlIGNhc2VzOgpAQCAtMTM4OSwxMzAgKzE0MDksODEgQEAKICAgICAgICAgICAgIC8vIHVzZSBjYXNlIDQ6IHN5bmNocm9ub3VzIHdyaXRlCiAgICAgICAgICAgICAoKG1UcmFuc2ZlciA9PSBUUkFOU0ZFUl9TWU5DKSAmJiBtVGhyZWFkQ2FuQ2FsbEphdmEpOwogCi0gICAgICAgIGJvb2wgdXNlQ2FzZUFsbG93ZWQgPSBzaGFyZWRCdWZmZXIgfHwgdHJhbnNmZXJBbGxvd2VkOwotICAgICAgICBpZiAoIXVzZUNhc2VBbGxvd2VkKSB7Ci0gICAgICAgICAgICBBTE9HVygiQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBkZW5pZWQsIG5vdCBzaGFyZWQgYnVmZmVyIGFuZCB0cmFuc2ZlciA9ICVzIiwKLSAgICAgICAgICAgICAgICAgIGNvbnZlcnRUcmFuc2ZlclRvVGV4dChtVHJhbnNmZXIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNhbXBsZSByYXRlcyBtdXN0IGFsc28gbWF0Y2gKLSAgICAgICAgYm9vbCBzYW1wbGVSYXRlQWxsb3dlZCA9IG1TYW1wbGVSYXRlID09IG1BZlNhbXBsZVJhdGU7Ci0gICAgICAgIGlmICghc2FtcGxlUmF0ZUFsbG93ZWQpIHsKLSAgICAgICAgICAgIEFMT0dXKCJBVURJT19PVVRQVVRfRkxBR19GQVNUIGRlbmllZCwgcmF0ZXMgZG8gbm90IG1hdGNoICV1IEh6LCByZXF1aXJlICV1IEh6IiwKLSAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBtQWZTYW1wbGVSYXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2wgZmFzdEFsbG93ZWQgPSB1c2VDYXNlQWxsb3dlZCAmJiBzYW1wbGVSYXRlQWxsb3dlZDsKKyAgICAgICAgYm9vbCBmYXN0QWxsb3dlZCA9IHNoYXJlZEJ1ZmZlciB8fCB0cmFuc2ZlckFsbG93ZWQ7CiAgICAgICAgIGlmICghZmFzdEFsbG93ZWQpIHsKKyAgICAgICAgICAgIEFMT0dXKCJBVURJT19PVVRQVVRfRkxBR19GQVNUIGRlbmllZCBieSBjbGllbnQsIG5vdCBzaGFyZWQgYnVmZmVyIGFuZCB0cmFuc2ZlciA9ICVzIiwKKyAgICAgICAgICAgICAgICAgIGNvbnZlcnRUcmFuc2ZlclRvVGV4dChtVHJhbnNmZXIpKTsKICAgICAgICAgICAgIG1GbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkgKG1GbGFncyAmIH5BVURJT19PVVRQVVRfRkxBR19GQVNUKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSBtTm90aWZpY2F0aW9uRnJhbWVzUmVxOwotCi0gICAgc2l6ZV90IGZyYW1lQ291bnQgPSBtUmVxRnJhbWVDb3VudDsKLSAgICBpZiAoIWF1ZGlvX2hhc19wcm9wb3J0aW9uYWxfZnJhbWVzKG1Gb3JtYXQpKSB7Ci0KLSAgICAgICAgaWYgKG1TaGFyZWRCdWZmZXIgIT0gMCkgewotICAgICAgICAgICAgLy8gU2FtZSBjb21tZW50IGFzIGJlbG93IGFib3V0IGlnbm9yaW5nIGZyYW1lQ291bnQgcGFyYW1ldGVyIGZvciBzZXQoKQotICAgICAgICAgICAgZnJhbWVDb3VudCA9IG1TaGFyZWRCdWZmZXItPnNpemUoKTsKLSAgICAgICAgfSBlbHNlIGlmIChmcmFtZUNvdW50ID09IDApIHsKLSAgICAgICAgICAgIGZyYW1lQ291bnQgPSBtQWZGcmFtZUNvdW50OwotICAgICAgICB9Ci0gICAgICAgIGlmIChtTm90aWZpY2F0aW9uRnJhbWVzQWN0ICE9IGZyYW1lQ291bnQpIHsKLSAgICAgICAgICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSBmcmFtZUNvdW50OwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChtU2hhcmVkQnVmZmVyICE9IDApIHsKLSAgICAgICAgLy8gRklYTUU6IEVuc3VyZSBjbGllbnQgc2lkZSBtZW1vcnkgYnVmZmVycyBuZWVkCi0gICAgICAgIC8vIG5vdCBoYXZlIGFkZGl0aW9uYWwgYWxpZ25tZW50IGJleW9uZCBzYW1wbGUKLSAgICAgICAgLy8gKGUuZy4gMTYgYml0IHN0ZXJlbyBhY2Nlc3NlZCBhcyAzMiBiaXQgZnJhbWUpLgotICAgICAgICBzaXplX3QgYWxpZ25tZW50ID0gYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShtRm9ybWF0KTsKLSAgICAgICAgaWYgKGFsaWdubWVudCAmIDEpIHsKLSAgICAgICAgICAgIC8vIGZvciBBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQgKG5vdCBleHBvc2VkIHRocm91Z2ggSmF2YSkuCi0gICAgICAgICAgICBhbGlnbm1lbnQgPSAxOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQ2hhbm5lbENvdW50ID4gMSkgewotICAgICAgICAgICAgLy8gTW9yZSB0aGFuIDIgY2hhbm5lbHMgZG9lcyBub3QgcmVxdWlyZSBzdHJvbmdlciBhbGlnbm1lbnQgdGhhbiBzdGVyZW8KLSAgICAgICAgICAgIGFsaWdubWVudCA8PD0gMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKCh1aW50cHRyX3QpbVNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpICYgKGFsaWdubWVudCAtIDEpKSAhPSAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBidWZmZXIgYWxpZ25tZW50OiBhZGRyZXNzICVwLCBjaGFubmVsIGNvdW50ICV1IiwKLSAgICAgICAgICAgICAgICAgICAgbVNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpLCBtQ2hhbm5lbENvdW50KTsKLSAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgICAgIGdvdG8gcmVsZWFzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdoZW4gaW5pdGlhbGl6aW5nIGEgc2hhcmVkIGJ1ZmZlciBBdWRpb1RyYWNrIHZpYSBjb25zdHJ1Y3RvcnMsCi0gICAgICAgIC8vIHRoZXJlJ3Mgbm8gZnJhbWVDb3VudCBwYXJhbWV0ZXIuCi0gICAgICAgIC8vIEJ1dCB3aGVuIGluaXRpYWxpemluZyBhIHNoYXJlZCBidWZmZXIgQXVkaW9UcmFjayB2aWEgc2V0KCksCi0gICAgICAgIC8vIHRoZXJlIF9pc18gYSBmcmFtZUNvdW50IHBhcmFtZXRlci4gIFdlIHNpbGVudGx5IGlnbm9yZSBpdC4KLSAgICAgICAgZnJhbWVDb3VudCA9IG1TaGFyZWRCdWZmZXItPnNpemUoKSAvIG1GcmFtZVNpemU7CisgICAgSUF1ZGlvRmxpbmdlcjo6Q3JlYXRlVHJhY2tJbnB1dCBpbnB1dDsKKyAgICBpZiAobVN0cmVhbVR5cGUgIT0gQVVESU9fU1RSRUFNX0RFRkFVTFQpIHsKKyAgICAgICAgc3RyZWFtX3R5cGVfdG9fYXVkaW9fYXR0cmlidXRlcyhtU3RyZWFtVHlwZSwgJmlucHV0LmF0dHIpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHNpemVfdCBtaW5GcmFtZUNvdW50ID0gMDsKLSAgICAgICAgLy8gRm9yIGZhc3QgdHJhY2tzIHRoZSBmcmFtZSBjb3VudCBjYWxjdWxhdGlvbnMgYW5kIGNoZWNrcyBhcmUgbW9zdGx5IGRvbmUgYnkgc2VydmVyLAotICAgICAgICAvLyBidXQgd2UgdHJ5IHRvIHJlc3BlY3QgdGhlIGFwcGxpY2F0aW9uJ3MgcmVxdWVzdCBmb3Igbm90aWZpY2F0aW9ucyBwZXIgYnVmZmVyLgotICAgICAgICBpZiAobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkgewotICAgICAgICAgICAgaWYgKG1Ob3RpZmljYXRpb25zUGVyQnVmZmVyUmVxID4gMCkgewotICAgICAgICAgICAgICAgIC8vIEF2b2lkIHBvc3NpYmxlIGFyaXRobWV0aWMgb3ZlcmZsb3cgZHVyaW5nIG11bHRpcGxpY2F0aW9uLgotICAgICAgICAgICAgICAgIC8vIG1Ob3RpZmljYXRpb25zUGVyQnVmZmVyIGlzIGNsYW1wZWQgdG8gYSBzbWFsbCBpbnRlZ2VyIGVhcmxpZXIsIHNvIGl0IGlzIHVubGlrZWx5LgotICAgICAgICAgICAgICAgIGlmIChtTm90aWZpY2F0aW9uc1BlckJ1ZmZlclJlcSA+IFNJWkVfTUFYIC8gYWZGcmFtZUNvdW50SEFMKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJSZXF1ZXN0ZWQgbm90aWZpY2F0aW9uUGVyQnVmZmVyPSV1IGlnbm9yZWQgZm9yIEhBTCBmcmFtZUNvdW50PSV6dSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbnNQZXJCdWZmZXJSZXEsIGFmRnJhbWVDb3VudEhBTCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbWluRnJhbWVDb3VudCA9IGFmRnJhbWVDb3VudEhBTCAqIG1Ob3RpZmljYXRpb25zUGVyQnVmZmVyUmVxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGZvciBub3JtYWwgdHJhY2tzIHByZWNvbXB1dGUgdGhlIGZyYW1lIGNvdW50IGJhc2VkIG9uIHNwZWVkLgotICAgICAgICAgICAgY29uc3QgZmxvYXQgc3BlZWQgPSAhaXNQdXJlUGNtRGF0YV9sKCkgfHwgaXNPZmZsb2FkZWRPckRpcmVjdF9sKCkgPyAxLjBmIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXgobU1heFJlcXVpcmVkU3BlZWQsIG1QbGF5YmFja1JhdGUubVNwZWVkKTsKLSAgICAgICAgICAgIG1pbkZyYW1lQ291bnQgPSBjYWxjdWxhdGVNaW5GcmFtZUNvdW50KAotICAgICAgICAgICAgICAgICAgICBtQWZMYXRlbmN5LCBtQWZGcmFtZUNvdW50LCBtQWZTYW1wbGVSYXRlLCBtU2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgc3BlZWQgLyosIDAgbU5vdGlmaWNhdGlvbnNQZXJCdWZmZXJSZXEqLyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZyYW1lQ291bnQgPCBtaW5GcmFtZUNvdW50KSB7Ci0gICAgICAgICAgICBmcmFtZUNvdW50ID0gbWluRnJhbWVDb3VudDsKLSAgICAgICAgfQorICAgICAgICBpbnB1dC5hdHRyID0gbUF0dHJpYnV0ZXM7CiAgICAgfQotCi0gICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBtRmxhZ3M7Ci0KLSAgICBwaWRfdCB0aWQgPSAtMTsKKyAgICBpbnB1dC5jb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgaW5wdXQuY29uZmlnLnNhbXBsZV9yYXRlID0gbVNhbXBsZVJhdGU7CisgICAgaW5wdXQuY29uZmlnLmNoYW5uZWxfbWFzayA9IG1DaGFubmVsTWFzazsKKyAgICBpbnB1dC5jb25maWcuZm9ybWF0ID0gbUZvcm1hdDsKKyAgICBpbnB1dC5jb25maWcub2ZmbG9hZF9pbmZvID0gbU9mZmxvYWRJbmZvQ29weTsKKyAgICBpbnB1dC5jbGllbnRJbmZvLmNsaWVudFVpZCA9IG1DbGllbnRVaWQ7CisgICAgaW5wdXQuY2xpZW50SW5mby5jbGllbnRQaWQgPSBtQ2xpZW50UGlkOworICAgIGlucHV0LmNsaWVudEluZm8uY2xpZW50VGlkID0gLTE7CiAgICAgaWYgKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpIHsKICAgICAgICAgLy8gSXQgaXMgY3VycmVudGx5IG1lYW5pbmdsZXNzIHRvIHJlcXVlc3QgU0NIRURfRklGTyBmb3IgYSBKYXZhIHRocmVhZC4gIEV2ZW4gaWYgdGhlCiAgICAgICAgIC8vIGFwcGxpY2F0aW9uLWxldmVsIGNvZGUgZm9sbG93cyBhbGwgbm9uLWJsb2NraW5nIGRlc2lnbiBydWxlcywgdGhlIGxhbmd1YWdlIHJ1bnRpbWUKICAgICAgICAgLy8gZG9lc24ndCBhbHNvIGZvbGxvdyB0aG9zZSBydWxlcywgc28gdGhlIHRocmVhZCB3aWxsIG5vdCBiZW5lZml0IG92ZXJhbGwuCiAgICAgICAgIGlmIChtQXVkaW9UcmFja1RocmVhZCAhPSAwICYmICFtVGhyZWFkQ2FuQ2FsbEphdmEpIHsKLSAgICAgICAgICAgIHRpZCA9IG1BdWRpb1RyYWNrVGhyZWFkLT5nZXRUaWQoKTsKKyAgICAgICAgICAgIGlucHV0LmNsaWVudEluZm8uY2xpZW50VGlkID0gbUF1ZGlvVHJhY2tUaHJlYWQtPmdldFRpZCgpOwogICAgICAgICB9CiAgICAgfQorICAgIGlucHV0LnNoYXJlZEJ1ZmZlciA9IG1TaGFyZWRCdWZmZXI7CisgICAgaW5wdXQubm90aWZpY2F0aW9uc1BlckJ1ZmZlciA9IG1Ob3RpZmljYXRpb25zUGVyQnVmZmVyUmVxOworICAgIGlucHV0LnNwZWVkID0gMS4wOworICAgIGlmIChhdWRpb19oYXNfcHJvcG9ydGlvbmFsX2ZyYW1lcyhtRm9ybWF0KSAmJiBtU2hhcmVkQnVmZmVyID09IDAgJiYKKyAgICAgICAgICAgIChtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSA9PSAwKSB7CisgICAgICAgIGlucHV0LnNwZWVkICA9ICFpc1B1cmVQY21EYXRhX2woKSB8fCBpc09mZmxvYWRlZE9yRGlyZWN0X2woKSA/IDEuMGYgOgorICAgICAgICAgICAgICAgICAgICAgICAgbWF4KG1NYXhSZXF1aXJlZFNwZWVkLCBtUGxheWJhY2tSYXRlLm1TcGVlZCk7CisgICAgfQorICAgIGlucHV0LmZsYWdzID0gbUZsYWdzOworICAgIGlucHV0LmZyYW1lQ291bnQgPSBtUmVxRnJhbWVDb3VudDsKKyAgICBpbnB1dC5ub3RpZmljYXRpb25GcmFtZUNvdW50ID0gbU5vdGlmaWNhdGlvbkZyYW1lc1JlcTsKKyAgICBpbnB1dC5zZWxlY3RlZERldmljZUlkID0gbVNlbGVjdGVkRGV2aWNlSWQ7CisgICAgaW5wdXQuc2Vzc2lvbklkID0gbVNlc3Npb25JZDsKIAotICAgIHNpemVfdCB0ZW1wID0gZnJhbWVDb3VudDsgICAvLyB0ZW1wIG1heSBiZSByZXBsYWNlZCBieSBhIHJldmlzZWQgdmFsdWUgb2YgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnV0IHdlIHdpbGwgc3RpbGwgbmVlZCB0aGUgb3JpZ2luYWwgdmFsdWUgYWxzbwotICAgIGF1ZGlvX3Nlc3Npb25fdCBvcmlnaW5hbFNlc3Npb25JZCA9IG1TZXNzaW9uSWQ7Ci0gICAgc3A8SUF1ZGlvVHJhY2s+IHRyYWNrID0gYXVkaW9GbGluZ2VyLT5jcmVhdGVUcmFjayhzdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2hhcmVkQnVmZmVyLAorICAgIElBdWRpb0ZsaW5nZXI6OkNyZWF0ZVRyYWNrT3V0cHV0IG91dHB1dDsKKworICAgIHNwPElBdWRpb1RyYWNrPiB0cmFjayA9IGF1ZGlvRmxpbmdlci0+Y3JlYXRlVHJhY2soaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2xpZW50UGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1TZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2xpZW50VWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qb3J0SWQpOwotICAgIEFMT0dFX0lGKG9yaWdpbmFsU2Vzc2lvbklkICE9IEFVRElPX1NFU1NJT05fQUxMT0NBVEUgJiYgbVNlc3Npb25JZCAhPSBvcmlnaW5hbFNlc3Npb25JZCwKLSAgICAgICAgICAgICJzZXNzaW9uIElEIGNoYW5nZWQgZnJvbSAlZCB0byAlZCIsIG9yaWdpbmFsU2Vzc2lvbklkLCBtU2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMpOwogCi0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiQXVkaW9GbGluZ2VyIGNvdWxkIG5vdCBjcmVhdGUgdHJhY2ssIHN0YXR1czogJWQiLCBzdGF0dXMpOwotICAgICAgICBnb3RvIHJlbGVhc2U7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiB8fCBvdXRwdXQub3V0cHV0SWQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgQUxPR0UoIkF1ZGlvRmxpbmdlciBjb3VsZCBub3QgY3JlYXRlIHRyYWNrLCBzdGF0dXM6ICVkIG91dHB1dCAlZCIsIHN0YXR1cywgb3V0cHV0Lm91dHB1dElkKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKKyAgICAgICAgfQorICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQogICAgIEFMT0dfQVNTRVJUKHRyYWNrICE9IDApOwogCisgICAgbUZyYW1lQ291bnQgPSBvdXRwdXQuZnJhbWVDb3VudDsKKyAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID0gKHVpbnQzMl90KW91dHB1dC5ub3RpZmljYXRpb25GcmFtZUNvdW50OworICAgIG1Sb3V0ZWREZXZpY2VJZCA9IG91dHB1dC5zZWxlY3RlZERldmljZUlkOworICAgIG1TZXNzaW9uSWQgPSBvdXRwdXQuc2Vzc2lvbklkOworCisgICAgbVNhbXBsZVJhdGUgPSBvdXRwdXQuc2FtcGxlUmF0ZTsKKyAgICBpZiAobU9yaWdpbmFsU2FtcGxlUmF0ZSA9PSAwKSB7CisgICAgICAgIG1PcmlnaW5hbFNhbXBsZVJhdGUgPSBtU2FtcGxlUmF0ZTsKKyAgICB9CisKKyAgICBtQWZGcmFtZUNvdW50ID0gb3V0cHV0LmFmRnJhbWVDb3VudDsKKyAgICBtQWZTYW1wbGVSYXRlID0gb3V0cHV0LmFmU2FtcGxlUmF0ZTsKKyAgICBtQWZMYXRlbmN5ID0gb3V0cHV0LmFmTGF0ZW5jeU1zOworCisgICAgbUxhdGVuY3kgPSBtQWZMYXRlbmN5ICsgKDEwMDBMTCAqIG1GcmFtZUNvdW50KSAvIG1TYW1wbGVSYXRlOworCiAgICAgLy8gQXVkaW9GbGluZ2VyIG5vdyBvd25zIHRoZSByZWZlcmVuY2UgdG8gdGhlIEkvTyBoYW5kbGUsCiAgICAgLy8gc28gd2UgYXJlIG5vIGxvbmdlciByZXNwb25zaWJsZSBmb3IgcmVsZWFzaW5nIGl0LgogCkBAIC0xNTIxLDEzICsxNDkyLDEzIEBACiAgICAgaWYgKGlNZW0gPT0gMCkgewogICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBjb250cm9sIGJsb2NrIik7CiAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7Ci0gICAgICAgIGdvdG8gcmVsZWFzZTsKKyAgICAgICAgZ290byBleGl0OwogICAgIH0KICAgICB2b2lkICppTWVtUG9pbnRlciA9IGlNZW0tPnBvaW50ZXIoKTsKICAgICBpZiAoaU1lbVBvaW50ZXIgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBjb250cm9sIGJsb2NrIHBvaW50ZXIiKTsKICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKLSAgICAgICAgZ290byByZWxlYXNlOworICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQogICAgIC8vIGludmFyaWFudCB0aGF0IG1BdWRpb1RyYWNrICE9IDAgaXMgdHJ1ZSBvbmx5IGFmdGVyIHNldCgpIHJldHVybnMgc3VjY2Vzc2Z1bGx5CiAgICAgaWYgKG1BdWRpb1RyYWNrICE9IDApIHsKQEAgLTE1NDAsNjYgKzE1MTEsMzMgQEAKIAogICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogY2JsayA9IHN0YXRpY19jYXN0PGF1ZGlvX3RyYWNrX2NibGtfdCo+KGlNZW1Qb2ludGVyKTsKICAgICBtQ2JsayA9IGNibGs7Ci0gICAgLy8gbm90ZSB0aGF0IHRlbXAgaXMgdGhlIChwb3NzaWJseSByZXZpc2VkKSB2YWx1ZSBvZiBmcmFtZUNvdW50Ci0gICAgaWYgKHRlbXAgPCBmcmFtZUNvdW50IHx8IChmcmFtZUNvdW50ID09IDAgJiYgdGVtcCA9PSAwKSkgewotICAgICAgICAvLyBJbiBjdXJyZW50IGRlc2lnbiwgQXVkaW9UcmFjayBjbGllbnQgY2hlY2tzIGFuZCBlbnN1cmVzIGZyYW1lIGNvdW50IHZhbGlkaXR5IGJlZm9yZQotICAgICAgICAvLyBwYXNzaW5nIGl0IHRvIEF1ZGlvRmxpbmdlciBzbyBBdWRpb0ZsaW5nZXIgc2hvdWxkIG5vdCByZXR1cm4gYSBkaWZmZXJlbnQgdmFsdWUgZXhjZXB0Ci0gICAgICAgIC8vIGZvciBmYXN0IHRyYWNrIGFzIGl0IHVzZXMgYSBzcGVjaWFsIG1ldGhvZCBvZiBhc3NpZ25pbmcgZnJhbWUgY291bnQuCi0gICAgICAgIEFMT0dXKCJSZXF1ZXN0ZWQgZnJhbWVDb3VudCAlenUgYnV0IHJlY2VpdmVkIGZyYW1lQ291bnQgJXp1IiwgZnJhbWVDb3VudCwgdGVtcCk7Ci0gICAgfQotICAgIGZyYW1lQ291bnQgPSB0ZW1wOwogCiAgICAgbUF3YWl0Qm9vc3QgPSBmYWxzZTsKICAgICBpZiAobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkgewotICAgICAgICBpZiAoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSB7Ci0gICAgICAgICAgICBBTE9HSSgiQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBzdWNjZXNzZnVsOyBmcmFtZUNvdW50ICV6dSAtPiAlenUiLCBmcmFtZUNvdW50LCB0ZW1wKTsKKyAgICAgICAgaWYgKG91dHB1dC5mbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpIHsKKyAgICAgICAgICAgIEFMT0dJKCJBVURJT19PVVRQVVRfRkxBR19GQVNUIHN1Y2Nlc3NmdWw7IGZyYW1lQ291bnQgJXp1IC0+ICV6dSIsCisgICAgICAgICAgICAgICAgICBtUmVxRnJhbWVDb3VudCwgbUZyYW1lQ291bnQpOwogICAgICAgICAgICAgaWYgKCFtVGhyZWFkQ2FuQ2FsbEphdmEpIHsKICAgICAgICAgICAgICAgICBtQXdhaXRCb29zdCA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVygiQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBkZW5pZWQgYnkgc2VydmVyOyBmcmFtZUNvdW50ICV6dSAtPiAlenUiLCBmcmFtZUNvdW50LAotICAgICAgICAgICAgICAgICAgICB0ZW1wKTsKKyAgICAgICAgICAgIEFMT0dXKCJBVURJT19PVVRQVVRfRkxBR19GQVNUIGRlbmllZCBieSBzZXJ2ZXI7IGZyYW1lQ291bnQgJXp1IC0+ICV6dSIsIG1SZXFGcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgbUZyYW1lQ291bnQpOwogICAgICAgICB9CiAgICAgfQotICAgIG1GbGFncyA9IGZsYWdzOwotCi0gICAgLy8gTWFrZSBzdXJlIHRoYXQgYXBwbGljYXRpb24gaXMgbm90aWZpZWQgd2l0aCBzdWZmaWNpZW50IG1hcmdpbiBiZWZvcmUgdW5kZXJydW4uCi0gICAgLy8gVGhlIGNsaWVudCBjYW4gZGl2aWRlIHRoZSBBdWRpb1RyYWNrIGJ1ZmZlciBpbnRvIHN1Yi1idWZmZXJzLAotICAgIC8vIGFuZCBleHByZXNzZXMgaXRzIGRlc2lyZSB0byBzZXJ2ZXIgYXMgdGhlIG5vdGlmaWNhdGlvbiBmcmFtZSBjb3VudC4KLSAgICBpZiAobVNoYXJlZEJ1ZmZlciA9PSAwICYmIGF1ZGlvX2lzX2xpbmVhcl9wY20obUZvcm1hdCkpIHsKLSAgICAgICAgc2l6ZV90IG1heE5vdGlmaWNhdGlvbkZyYW1lczsKLSAgICAgICAgaWYgKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpIHsKLSAgICAgICAgICAgIC8vIG5vdGlmeSBldmVyeSBIQUwgYnVmZmVyLCByZWdhcmRsZXNzIG9mIHRoZSBzaXplIG9mIHRoZSB0cmFjayBidWZmZXIKLSAgICAgICAgICAgIG1heE5vdGlmaWNhdGlvbkZyYW1lcyA9IGFmRnJhbWVDb3VudEhBTDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIEZvciBub3JtYWwgdHJhY2tzLCB1c2UgYXQgbGVhc3QgZG91YmxlLWJ1ZmZlcmluZyBpZiBubyBzYW1wbGUgcmF0ZSBjb252ZXJzaW9uLAotICAgICAgICAgICAgLy8gb3IgYXQgbGVhc3QgdHJpcGxlLWJ1ZmZlcmluZyBpZiB0aGVyZSBpcyBzYW1wbGUgcmF0ZSBjb252ZXJzaW9uCi0gICAgICAgICAgICBjb25zdCBpbnQgbkJ1ZmZlcmluZyA9IG1PcmlnaW5hbFNhbXBsZVJhdGUgPT0gbUFmU2FtcGxlUmF0ZSA/IDIgOiAzOwotICAgICAgICAgICAgbWF4Tm90aWZpY2F0aW9uRnJhbWVzID0gZnJhbWVDb3VudCAvIG5CdWZmZXJpbmc7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPT0gMCB8fCBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID4gbWF4Tm90aWZpY2F0aW9uRnJhbWVzKSB7Ci0gICAgICAgICAgICBpZiAobU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0QoIkNsaWVudCBkZWZhdWx0ZWQgbm90aWZpY2F0aW9uRnJhbWVzIHRvICV6dSBmb3IgZnJhbWVDb3VudCAlenUiLAotICAgICAgICAgICAgICAgICAgICBtYXhOb3RpZmljYXRpb25GcmFtZXMsIGZyYW1lQ291bnQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiQ2xpZW50IGFkanVzdGVkIG5vdGlmaWNhdGlvbkZyYW1lcyBmcm9tICV1IHRvICV6dSBmb3IgZnJhbWVDb3VudCAlenUiLAotICAgICAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0LCBtYXhOb3RpZmljYXRpb25GcmFtZXMsIGZyYW1lQ291bnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9ICh1aW50MzJfdCkgbWF4Tm90aWZpY2F0aW9uRnJhbWVzOwotICAgICAgICB9Ci0gICAgfQorICAgIG1GbGFncyA9IG91dHB1dC5mbGFnczsKIAogICAgIC8vbU91dHB1dCAhPSBvdXRwdXQgaW5jbHVkZXMgdGhlIGNhc2Ugd2hlcmUgbU91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSBmb3IgZmlyc3QgY3JlYXRpb24KLSAgICBpZiAobURldmljZUNhbGxiYWNrICE9IDAgJiYgbU91dHB1dCAhPSBvdXRwdXQpIHsKKyAgICBpZiAobURldmljZUNhbGxiYWNrICE9IDAgJiYgbU91dHB1dCAhPSBvdXRwdXQub3V0cHV0SWQpIHsKICAgICAgICAgaWYgKG1PdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG1PdXRwdXQpOwogICAgICAgICB9Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG91dHB1dCk7CisgICAgICAgIEF1ZGlvU3lzdGVtOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG91dHB1dC5vdXRwdXRJZCk7CiAgICAgICAgIGNhbGxiYWNrQWRkZWQgPSB0cnVlOwogICAgIH0KIAogICAgIC8vIFdlIHJldGFpbiBhIGNvcHkgb2YgdGhlIEkvTyBoYW5kbGUsIGJ1dCBkb24ndCBvd24gdGhlIHJlZmVyZW5jZQotICAgIG1PdXRwdXQgPSBvdXRwdXQ7CisgICAgbU91dHB1dCA9IG91dHB1dC5vdXRwdXRJZDsKICAgICBtUmVmcmVzaFJlbWFpbmluZyA9IHRydWU7CiAKICAgICAvLyBTdGFydGluZyBhZGRyZXNzIG9mIGJ1ZmZlcnMgaW4gc2hhcmVkIG1lbW9yeS4gIElmIHRoZXJlIGlzIGEgc2hhcmVkIGJ1ZmZlciwgYnVmZmVycwpAQCAtMTYxNCwxOCArMTU1MiwxNiBAQAogICAgICAgICBpZiAoYnVmZmVycyA9PSBOVUxMKSB7CiAgICAgICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBidWZmZXIgcG9pbnRlciIpOwogICAgICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKLSAgICAgICAgICAgIGdvdG8gcmVsZWFzZTsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgfQogICAgIH0KIAogICAgIG1BdWRpb1RyYWNrLT5hdHRhY2hBdXhFZmZlY3QobUF1eEVmZmVjdElkKTsKLSAgICBtRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7Ci0gICAgdXBkYXRlTGF0ZW5jeV9sKCk7ICAvLyB0aGlzIHJlZmV0Y2hlcyBtQWZMYXRlbmN5IGFuZCBzZXRzIG1MYXRlbmN5CiAKICAgICAvLyBJZiBJQXVkaW9UcmFjayBpcyByZS1jcmVhdGVkLCBkb24ndCBsZXQgdGhlIHJlcXVlc3RlZCBmcmFtZUNvdW50CiAgICAgLy8gZGVjcmVhc2UuICBUaGlzIGNhbiBjb25mdXNlIGNsaWVudHMgdGhhdCBjYWNoZSBmcmFtZUNvdW50KCkuCi0gICAgaWYgKGZyYW1lQ291bnQgPiBtUmVxRnJhbWVDb3VudCkgewotICAgICAgICBtUmVxRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CisgICAgaWYgKG1GcmFtZUNvdW50ID4gbVJlcUZyYW1lQ291bnQpIHsKKyAgICAgICAgbVJlcUZyYW1lQ291bnQgPSBtRnJhbWVDb3VudDsKICAgICB9CiAKICAgICAvLyByZXNldCBzZXJ2ZXIgcG9zaXRpb24gdG8gMCBhcyB3ZSBoYXZlIG5ldyBjYmxrLgpAQCAtMTYzNCw5ICsxNTcwLDkgQEAKICAgICAvLyB1cGRhdGUgcHJveHkKICAgICBpZiAobVNoYXJlZEJ1ZmZlciA9PSAwKSB7CiAgICAgICAgIG1TdGF0aWNQcm94eS5jbGVhcigpOwotICAgICAgICBtUHJveHkgPSBuZXcgQXVkaW9UcmFja0NsaWVudFByb3h5KGNibGssIGJ1ZmZlcnMsIGZyYW1lQ291bnQsIG1GcmFtZVNpemUpOworICAgICAgICBtUHJveHkgPSBuZXcgQXVkaW9UcmFja0NsaWVudFByb3h5KGNibGssIGJ1ZmZlcnMsIG1GcmFtZUNvdW50LCBtRnJhbWVTaXplKTsKICAgICB9IGVsc2UgewotICAgICAgICBtU3RhdGljUHJveHkgPSBuZXcgU3RhdGljQXVkaW9UcmFja0NsaWVudFByb3h5KGNibGssIGJ1ZmZlcnMsIGZyYW1lQ291bnQsIG1GcmFtZVNpemUpOworICAgICAgICBtU3RhdGljUHJveHkgPSBuZXcgU3RhdGljQXVkaW9UcmFja0NsaWVudFByb3h5KGNibGssIGJ1ZmZlcnMsIG1GcmFtZUNvdW50LCBtRnJhbWVTaXplKTsKICAgICAgICAgbVByb3h5ID0gbVN0YXRpY1Byb3h5OwogICAgIH0KIApAQCAtMTY1OSwxOCArMTU5NSwxNyBAQAogICAgIG1EZWF0aE5vdGlmaWVyID0gbmV3IERlYXRoTm90aWZpZXIodGhpcyk7CiAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIobUF1ZGlvVHJhY2spLT5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllciwgdGhpcyk7CiAKLSAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQogCi1yZWxlYXNlOgotICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KG91dHB1dCwgc3RyZWFtVHlwZSwgbVNlc3Npb25JZCk7Ci0gICAgaWYgKGNhbGxiYWNrQWRkZWQpIHsKK2V4aXQ6CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiAmJiBjYWxsYmFja0FkZGVkKSB7CiAgICAgICAgIC8vIG5vdGU6IG1PdXRwdXQgaXMgYWx3YXlzIHZhbGlkIGlzIGNhbGxiYWNrQWRkZWQgaXMgdHJ1ZQogICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBtT3V0cHV0KTsKICAgICB9Ci0gICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICBzdGF0dXMgPSBOT19JTklUOwotICAgIH0KKworICAgIG1TdGF0dXMgPSBzdGF0dXM7CisKKyAgICAvLyBzcDxJQXVkaW9UcmFjaz4gdHJhY2sgZGVzdHJ1Y3RvciB3aWxsIGNhdXNlIHJlbGVhc2VPdXRwdXQoKSB0byBiZSBjYWxsZWQgYnkgQXVkaW9GbGluZ2VyCiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMjMxNCw2ICsyMjQ5LDE2IEBACiAgICAgICAgIHN0YXRpY1Bvc2l0aW9uID0gbVN0YXRpY1Byb3h5LT5nZXRQb3NpdGlvbigpLnVuc2lnbmVkVmFsdWUoKTsKICAgICB9CiAKKyAgICAvLyBTZWUgYi83NDQwOTI2Ny4gQ29ubmVjdGluZyB0byBhIEJUIEEyRFAgZGV2aWNlIHN1cHBvcnRpbmcgbXVsdGlwbGUgY29kZWNzCisgICAgLy8gY2F1c2VzIGEgbG90IG9mIGNodXJuIG9uIHRoZSBzZXJ2aWNlIHNpZGUsIGFuZCBpdCBjYW4gcmVqZWN0IHN0YXJ0aW5nCisgICAgLy8gcGxheWJhY2sgb2YgYSBwcmV2aW91c2x5IGNyZWF0ZWQgdHJhY2suIE1heSBhbHNvIGFwcGx5IHRvIG90aGVyIGNhc2VzLgorICAgIGNvbnN0IGludCBJTklUSUFMX1JFVFJJRVMgPSAzOworICAgIGludCByZXRyaWVzID0gSU5JVElBTF9SRVRSSUVTOworcmV0cnk6CisgICAgaWYgKHJldHJpZXMgPCBJTklUSUFMX1JFVFJJRVMpIHsKKyAgICAgICAgLy8gU2VlIHRoZSBjb21tZW50IGZvciBjbGVhckF1ZGlvQ29uZmlnQ2FjaGUgYXQgdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbi4KKyAgICAgICAgQXVkaW9TeXN0ZW06OmNsZWFyQXVkaW9Db25maWdDYWNoZSgpOworICAgIH0KICAgICBtRmxhZ3MgPSBtT3JpZ0ZsYWdzOwogCiAgICAgLy8gSWYgYSBuZXcgSUF1ZGlvVHJhY2sgaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQsIGNyZWF0ZVRyYWNrX2woKSB3aWxsIG1vZGlmeSB0aGUKQEAgLTIzMjIsNyArMjI2NywxMCBAQAogICAgIC8vIElmIGEgbmV3IElBdWRpb1RyYWNrIGNhbm5vdCBiZSBjcmVhdGVkLCB0aGUgcHJldmlvdXMgKGRlYWQpIGluc3RhbmNlIHdpbGwgYmUgbGVmdCBpbnRhY3QuCiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gY3JlYXRlVHJhY2tfbCgpOwogCi0gICAgaWYgKHJlc3VsdCA9PSBOT19FUlJPUikgeworICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR1coIiVzKCk6IGNyZWF0ZVRyYWNrX2wgZmFpbGVkLCBkbyBub3QgcmV0cnkiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHJpZXMgPSAwOworICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIHRha2UgdGhlIGZyYW1lcyB0aGF0IHdpbGwgYmUgbG9zdCBieSB0cmFjayByZWNyZWF0aW9uIGludG8gYWNjb3VudCBpbiBzYXZlZCBwb3NpdGlvbgogICAgICAgICAvLyBGb3Igc3RyZWFtaW5nIHRyYWNrcywgdGhpcyBpcyB0aGUgYW1vdW50IHdlIG9idGFpbmVkIGZyb20gdGhlIHVzZXIvY2xpZW50CiAgICAgICAgIC8vIChub3QgdGhlIG51bWJlciBhY3R1YWxseSBjb25zdW1lZCBhdCB0aGUgc2VydmVyIC0gdGhvc2UgYXJlIGFscmVhZHkgbG9zdCkuCkBAIC0yMzY3LDcgKzIzMTUsMTAgQEAKICAgICAgICAgbUZyYW1lc1dyaXR0ZW5BdFJlc3RvcmUgPSBtRnJhbWVzV3JpdHRlblNlcnZlck9mZnNldDsKICAgICB9CiAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HVygicmVzdG9yZVRyYWNrX2woKSBmYWlsZWQgc3RhdHVzICVkIiwgcmVzdWx0KTsKKyAgICAgICAgQUxPR1coIiVzKCkgZmFpbGVkIHN0YXR1cyAlZCwgcmV0cmllcyAlZCIsIF9fZnVuY19fLCByZXN1bHQsIHJldHJpZXMpOworICAgICAgICBpZiAoLS1yZXRyaWVzID4gMCkgeworICAgICAgICAgICAgZ290byByZXRyeTsKKyAgICAgICAgfQogICAgICAgICBtU3RhdGUgPSBTVEFURV9TVE9QUEVEOwogICAgICAgICBtUmVsZWFzZWQgPSAwOwogICAgIH0KQEAgLTI0MDYsOCArMjM1Nyw4IEBACiAgICAgICAgIHJldHVybiB0cnVlOyAvLyBzdGF0aWMgdHJhY2tzIGRvIG5vdCBoYXZlIGlzc3VlcyB3aXRoIGJ1ZmZlciBzaXppbmcuCiAgICAgfQogICAgIGNvbnN0IHNpemVfdCBtaW5GcmFtZUNvdW50ID0KLSAgICAgICAgICAgIGNhbGN1bGF0ZU1pbkZyYW1lQ291bnQobUFmTGF0ZW5jeSwgbUFmRnJhbWVDb3VudCwgbUFmU2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSwgc3BlZWQKLSAgICAgICAgICAgICAgICAvKiwgMCBtTm90aWZpY2F0aW9uc1BlckJ1ZmZlclJlcSovKTsKKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpjYWxjdWxhdGVNaW5GcmFtZUNvdW50KG1BZkxhdGVuY3ksIG1BZkZyYW1lQ291bnQsIG1BZlNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIHNwZWVkIC8qLCAwIG1Ob3RpZmljYXRpb25zUGVyQnVmZmVyUmVxKi8pOwogICAgIGNvbnN0IGJvb2wgYWxsb3dlZCA9IG1GcmFtZUNvdW50ID49IG1pbkZyYW1lQ291bnQ7CiAgICAgQUxPR0RfSUYoIWFsbG93ZWQsCiAgICAgICAgICAgICAiaXNTYW1wbGVSYXRlU3BlZWRBbGxvd2VkX2wgZGVuaWVkICIKQEAgLTI0MjQsNiArMjM3NSwxNyBAQAogICAgIHJldHVybiBtQXVkaW9UcmFjay0+c2V0UGFyYW1ldGVycyhrZXlWYWx1ZVBhaXJzKTsKIH0KIAorc3RhdHVzX3QgQXVkaW9UcmFjazo6c2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCkKK3sKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcigpOworICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlQcmVzZW50YXRpb25JZCksIHByZXNlbnRhdGlvbklkKTsKKyAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5UHJvZ3JhbUlkKSwgcHJvZ3JhbUlkKTsKKyAgICBBTE9HVigiUHJlc2VudGF0aW9uSWQvUHJvZ3JhbUlkWyVzXSIscGFyYW0udG9TdHJpbmcoKS5zdHJpbmcoKSk7CisKKyAgICByZXR1cm4gbUF1ZGlvVHJhY2stPnNldFBhcmFtZXRlcnMocGFyYW0udG9TdHJpbmcoKSk7Cit9CisKIFZvbHVtZVNoYXBlcjo6U3RhdHVzIEF1ZGlvVHJhY2s6OmFwcGx5Vm9sdW1lU2hhcGVyKAogICAgICAgICBjb25zdCBzcDxWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24+JiBjb25maWd1cmF0aW9uLAogICAgICAgICBjb25zdCBzcDxWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4mIG9wZXJhdGlvbikKQEAgLTI4MjMsMjMgKzI3ODUsMjggQEAKIAogc3RhdHVzX3QgQXVkaW9UcmFjazo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpIGNvbnN0CiB7Ci0KLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKICAgICBTdHJpbmc4IHJlc3VsdDsKIAogICAgIHJlc3VsdC5hcHBlbmQoIiBBdWRpb1RyYWNrOjpkdW1wXG4iKTsKLSAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgc3RyZWFtIHR5cGUoJWQpLCBsZWZ0IC0gcmlnaHQgdm9sdW1lKCVmLCAlZilcbiIsIG1TdHJlYW1UeXBlLAotICAgICAgICAgICAgbVZvbHVtZVtBVURJT19JTlRFUkxFQVZFX0xFRlRdLCBtVm9sdW1lW0FVRElPX0lOVEVSTEVBVkVfUklHSFRdKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCAyNTUsICIgIGZvcm1hdCglZCksIGNoYW5uZWwgY291bnQoJWQpLCBmcmFtZSBjb3VudCglenUpXG4iLCBtRm9ybWF0LAotICAgICAgICAgICAgbUNoYW5uZWxDb3VudCwgbUZyYW1lQ291bnQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgc2FtcGxlIHJhdGUoJXUpLCBzcGVlZCglZiksIHN0YXR1cyglZClcbiIsCi0gICAgICAgICAgICBtU2FtcGxlUmF0ZSwgbVBsYXliYWNrUmF0ZS5tU3BlZWQsIG1TdGF0dXMpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgc3RhdGUoJWQpLCBsYXRlbmN5ICglZClcbiIsIG1TdGF0ZSwgbUxhdGVuY3kpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIHN0YXR1cyglZCksIHN0YXRlKCVkKSwgc2Vzc2lvbiBJZCglZCksIGZsYWdzKCUjeClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHVzLCBtU3RhdGUsIG1TZXNzaW9uSWQsIG1GbGFncyk7CisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBzdHJlYW0gdHlwZSglZCksIGxlZnQgLSByaWdodCB2b2x1bWUoJWYsICVmKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChtU3RyZWFtVHlwZSA9PSBBVURJT19TVFJFQU1fREVGQVVMVCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKCZtQXR0cmlidXRlcykgOiBtU3RyZWFtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVbQVVESU9fSU5URVJMRUFWRV9MRUZUXSwgbVZvbHVtZVtBVURJT19JTlRFUkxFQVZFX1JJR0hUXSk7CisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBmb3JtYXQoJSN4KSwgY2hhbm5lbCBtYXNrKCUjeCksIGNoYW5uZWwgY291bnQoJXUpXG4iLAorICAgICAgICAgICAgICAgICAgbUZvcm1hdCwgbUNoYW5uZWxNYXNrLCBtQ2hhbm5lbENvdW50KTsKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIHNhbXBsZSByYXRlKCV1KSwgb3JpZ2luYWwgc2FtcGxlIHJhdGUoJXUpLCBzcGVlZCglZilcbiIsCisgICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwgbU9yaWdpbmFsU2FtcGxlUmF0ZSwgbVBsYXliYWNrUmF0ZS5tU3BlZWQpOworICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgZnJhbWUgY291bnQoJXp1KSwgcmVxLiBmcmFtZSBjb3VudCglenUpXG4iLAorICAgICAgICAgICAgICAgICAgbUZyYW1lQ291bnQsIG1SZXFGcmFtZUNvdW50KTsKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIG5vdGlmLiBmcmFtZSBjb3VudCgldSksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KCV1KSwiCisgICAgICAgICAgICAiIHJlcS4gbm90aWYuIHBlciBidWZmKCV1KVxuIiwKKyAgICAgICAgICAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0LCBtTm90aWZpY2F0aW9uRnJhbWVzUmVxLCBtTm90aWZpY2F0aW9uc1BlckJ1ZmZlclJlcSk7CisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBsYXRlbmN5ICglZCksIHNlbGVjdGVkIGRldmljZSBJZCglZCksIHJvdXRlZCBkZXZpY2UgSWQoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgbUxhdGVuY3ksIG1TZWxlY3RlZERldmljZUlkLCBtUm91dGVkRGV2aWNlSWQpOworICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgb3V0cHV0KCVkKSBBRiBsYXRlbmN5ICgldSkgQUYgZnJhbWUgY291bnQoJXp1KSBBRiBTYW1wbGVSYXRlKCV1KVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXQsIG1BZkxhdGVuY3ksIG1BZkZyYW1lQ291bnQsIG1BZlNhbXBsZVJhdGUpOwogICAgIDo6d3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFja1NoYXJlZC5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrU2hhcmVkLmNwcAppbmRleCA3YmY0Zjk5Li5kY2VkM2M0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrU2hhcmVkLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrU2hhcmVkLmNwcApAQCAtMzkzLDE5ICszOTMsNTAgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLV9fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJpbnRlZ2VyIikpKQogdm9pZCBBdWRpb1RyYWNrQ2xpZW50UHJveHk6OmZsdXNoKCkKIHsKKyAgICBzZW5kU3RyZWFtaW5nRmx1c2hTdG9wKHRydWUgLyogZmx1c2ggKi8pOworfQorCit2b2lkIEF1ZGlvVHJhY2tDbGllbnRQcm94eTo6c3RvcCgpCit7CisgICAgc2VuZFN0cmVhbWluZ0ZsdXNoU3RvcChmYWxzZSAvKiBmbHVzaCAqLyk7Cit9CisKKy8vIFNldHMgdGhlIGNsaWVudC13cml0dGVuIG1GbHVzaCBhbmQgbVN0b3AgcG9zaXRpb25zLCB3aGljaCBjb250cm9sIHNlcnZlciBiZWhhdmlvci4KKy8vCisvLyBAcGFyYW0gZmx1c2ggaW5kaWNhdGVzIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBpcyBhIGZsdXNoIG9yIHN0b3AuCisvLyBBIGNsaWVudCBzdG9wIHNldHMgbVN0b3AgdG8gdGhlIGN1cnJlbnQgd3JpdGUgcG9zaXRpb247CisvLyB0aGUgc2VydmVyIHdpbGwgbm90IHJlYWQgcGFzdCB0aGlzIHBvaW50IHVudGlsIHN0YXJ0KCkgb3Igc3Vic2VxdWVudCBmbHVzaCgpLgorLy8gQSBjbGllbnQgZmx1c2ggc2V0cyBib3RoIG1TdG9wIGFuZCBtRmx1c2ggdG8gdGhlIGN1cnJlbnQgd3JpdGUgcG9zaXRpb24uCisvLyBUaGlzIGFkdmFuY2VzIHRoZSBzZXJ2ZXIgcmVhZCBsaW1pdCAoaWYgcHJldmlvdXNseSBzZXQpIGFuZCBvbiB0aGUgbmV4dAorLy8gc2VydmVyIHJlYWQgYWR2YW5jZXMgdGhlIHNlcnZlciByZWFkIHBvc2l0aW9uIHRvIHRoaXMgbGltaXQuCisvLwordm9pZCBBdWRpb1RyYWNrQ2xpZW50UHJveHk6OnNlbmRTdHJlYW1pbmdGbHVzaFN0b3AoYm9vbCBmbHVzaCkKK3sKKyAgICAvLyBUT0RPOiBSZXBsYWNlIHRoaXMgYnkgNjQgYml0IGNvdW50ZXJzIC0gYXZvaWRzIHdyYXAgY29tcGxpY2F0aW9uLgogICAgIC8vIFRoaXMgd29ya3MgZm9yIG1GcmFtZUNvdW50UDIgPD0gMl4zMAotICAgIHNpemVfdCBpbmNyZW1lbnQgPSBtRnJhbWVDb3VudFAyIDw8IDE7Ci0gICAgc2l6ZV90IG1hc2sgPSBpbmNyZW1lbnQgLSAxOwotICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogY2JsayA9IG1DYmxrOwogICAgIC8vIG1GbHVzaCBpcyAzMiBiaXRzIGNvbmNhdGVuYXRlZCBhcyBbIGZsdXNoX2NvdW50ZXIgXSBbIG5ld2Zyb250X29mZnNldCBdCiAgICAgLy8gU2hvdWxkIG5ld0ZsdXNoID0gY2Jsay0+dS5tU3RyZWFtaW5nLm1SZWFyPyAgT25seSBwcm9ibGVtIGlzCiAgICAgLy8gaWYgeW91IHdhbnQgdG8gZmx1c2ggdHdpY2UgdG8gdGhlIHNhbWUgcmVhciBsb2NhdGlvbiBhZnRlciBhIDMyIGJpdCB3cmFwLgotICAgIGludDMyX3QgbmV3Rmx1c2ggPSAoY2Jsay0+dS5tU3RyZWFtaW5nLm1SZWFyICYgbWFzaykgfAotICAgICAgICAgICAgICAgICAgICAgICAgKChjYmxrLT51Lm1TdHJlYW1pbmcubUZsdXNoICYgfm1hc2spICsgaW5jcmVtZW50KTsKLSAgICBhbmRyb2lkX2F0b21pY19yZWxlYXNlX3N0b3JlKG5ld0ZsdXNoLCAmY2Jsay0+dS5tU3RyZWFtaW5nLm1GbHVzaCk7CisKKyAgICBjb25zdCBzaXplX3QgaW5jcmVtZW50ID0gbUZyYW1lQ291bnRQMiA8PCAxOworICAgIGNvbnN0IHNpemVfdCBtYXNrID0gaW5jcmVtZW50IC0gMTsKKyAgICAvLyBObyBuZWVkIGZvciBjbGllbnQgYXRvbWljIHN5bmNocm9uaXphdGlvbiBvbiBtUmVhciwgbVN0b3AsIG1GbHVzaAorICAgIC8vIGFzIEF1ZGlvVHJhY2sgY2xpZW50IG9ubHkgcmVhZC93cml0ZXMgdG8gdGhlbSB1bmRlciBjbGllbnQgbG9jay4gU2VydmVyIG9ubHkgcmVhZHMuCisgICAgY29uc3QgaW50MzJfdCByZWFyTWFza2VkID0gbUNibGstPnUubVN0cmVhbWluZy5tUmVhciAmIG1hc2s7CisKKyAgICAvLyB1cGRhdGUgc3RvcCBiZWZvcmUgZmx1c2ggc28gdGhhdCB0aGUgc2VydmVyIGZyb250CisgICAgLy8gbmV2ZXIgYWR2YW5jZXMgYmV5b25kIGEgKHBvdGVudGlhbCkgcHJldmlvdXMgc3RvcCdzIHJlYXIgbGltaXQuCisgICAgaW50MzJfdCBzdG9wQml0czsgLy8gdGhlIGZvbGxvd2luZyBhZGQgY2FuIG92ZXJmbG93CisgICAgX19idWlsdGluX2FkZF9vdmVyZmxvdyhtQ2Jsay0+dS5tU3RyZWFtaW5nLm1TdG9wICYgfm1hc2ssIGluY3JlbWVudCwgJnN0b3BCaXRzKTsKKyAgICBhbmRyb2lkX2F0b21pY19yZWxlYXNlX3N0b3JlKHJlYXJNYXNrZWQgfCBzdG9wQml0cywgJm1DYmxrLT51Lm1TdHJlYW1pbmcubVN0b3ApOworCisgICAgaWYgKGZsdXNoKSB7CisgICAgICAgIGludDMyX3QgZmx1c2hCaXRzOyAvLyB0aGUgZm9sbG93aW5nIGFkZCBjYW4gb3ZlcmZsb3cKKyAgICAgICAgX19idWlsdGluX2FkZF9vdmVyZmxvdyhtQ2Jsay0+dS5tU3RyZWFtaW5nLm1GbHVzaCAmIH5tYXNrLCBpbmNyZW1lbnQsICZmbHVzaEJpdHMpOworICAgICAgICBhbmRyb2lkX2F0b21pY19yZWxlYXNlX3N0b3JlKHJlYXJNYXNrZWQgfCBmbHVzaEJpdHMsICZtQ2Jsay0+dS5tU3RyZWFtaW5nLm1GbHVzaCk7CisgICAgfQogfQogCiBib29sIEF1ZGlvVHJhY2tDbGllbnRQcm94eTo6Y2xlYXJTdHJlYW1FbmREb25lKCkgewpAQCAtNTQwLDYgKzU3MSwxMSBAQAogICAgIExPR19BTFdBWVNfRkFUQUwoInN0YXRpYyBmbHVzaCIpOwogfQogCit2b2lkIFN0YXRpY0F1ZGlvVHJhY2tDbGllbnRQcm94eTo6c3RvcCgpCit7CisgICAgOyAvLyBubyBzcGVjaWFsIGhhbmRsaW5nIHJlcXVpcmVkIGZvciBzdGF0aWMgdHJhY2tzLgorfQorCiB2b2lkIFN0YXRpY0F1ZGlvVHJhY2tDbGllbnRQcm94eTo6c2V0TG9vcChzaXplX3QgbG9vcFN0YXJ0LCBzaXplX3QgbG9vcEVuZCwgaW50IGxvb3BDb3VudCkKIHsKICAgICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbiBvbiBhIDY0LWJpdCBjbGllbnQKQEAgLTYzOCw2ICs2NzQsNyBAQAogICAgIGlmIChmbHVzaCAhPSBtRmx1c2gpIHsKICAgICAgICAgQUxPR1YoIlNlcnZlclByb3h5OjpmbHVzaEJ1ZmZlcklmTmVlZGVkKCkgbVN0cmVhbWluZy5tRmx1c2ggPSAweCV4LCBtRmx1c2ggPSAweCUweCIsCiAgICAgICAgICAgICAgICAgZmx1c2gsIG1GbHVzaCk7CisgICAgICAgIC8vIHNob3VsZG4ndCBtYXR0ZXIsIGJ1dCBmb3IgcmFuZ2Ugc2FmZXR5IHVzZSBtUmVhciBpbnN0ZWFkIG9mIGdldFJlYXIoKS4KICAgICAgICAgaW50MzJfdCByZWFyID0gYW5kcm9pZF9hdG9taWNfYWNxdWlyZV9sb2FkKCZjYmxrLT51Lm1TdHJlYW1pbmcubVJlYXIpOwogICAgICAgICBpbnQzMl90IGZyb250ID0gY2Jsay0+dS5tU3RyZWFtaW5nLm1Gcm9udDsKIApAQCAtNjc3LDYgKzcxNCw0NiBAQAogfQogCiBfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgiaW50ZWdlciIpKSkKK2ludDMyX3QgQXVkaW9UcmFja1NlcnZlclByb3h5OjpnZXRSZWFyKCkgY29uc3QKK3sKKyAgICBjb25zdCBpbnQzMl90IHN0b3AgPSBhbmRyb2lkX2F0b21pY19hY3F1aXJlX2xvYWQoJm1DYmxrLT51Lm1TdHJlYW1pbmcubVN0b3ApOworICAgIGNvbnN0IGludDMyX3QgcmVhciA9IGFuZHJvaWRfYXRvbWljX2FjcXVpcmVfbG9hZCgmbUNibGstPnUubVN0cmVhbWluZy5tUmVhcik7CisgICAgY29uc3QgaW50MzJfdCBzdG9wTGFzdCA9IG1TdG9wTGFzdC5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX2FjcXVpcmUpOworICAgIGlmIChzdG9wICE9IHN0b3BMYXN0KSB7CisgICAgICAgIGNvbnN0IGludDMyX3QgZnJvbnQgPSBtQ2Jsay0+dS5tU3RyZWFtaW5nLm1Gcm9udDsKKyAgICAgICAgY29uc3Qgc2l6ZV90IG92ZXJmbG93Qml0ID0gbUZyYW1lQ291bnRQMiA8PCAxOworICAgICAgICBjb25zdCBzaXplX3QgbWFzayA9IG92ZXJmbG93Qml0IC0gMTsKKyAgICAgICAgaW50MzJfdCBuZXdSZWFyID0gKHJlYXIgJiB+bWFzaykgfCAoc3RvcCAmIG1hc2spOworICAgICAgICBzc2l6ZV90IGZpbGxlZCA9IG5ld1JlYXIgLSBmcm9udDsKKyAgICAgICAgLy8gb3ZlcmZsb3dCaXQgaXMgdW5zaWduZWQsIHNvIGNhc3QgdG8gc2lnbmVkIGZvciBjb21wYXJpc29uLgorICAgICAgICBpZiAoZmlsbGVkID49IChzc2l6ZV90KW92ZXJmbG93Qml0KSB7CisgICAgICAgICAgICAvLyBmcm9udCBhbmQgcmVhciBvZmZzZXRzIHNwYW4gdGhlIG92ZXJmbG93IGJpdCBvZiB0aGUgcDIgbWFzaworICAgICAgICAgICAgLy8gc28gcmViYXNpbmcgbmV3UmVhciBvbiB0aGUgcmVhciBvZmZzZXQgaXMgb2ZmIGJ5IHRoZSBvdmVyZmxvdyBiaXQuCisgICAgICAgICAgICBBTE9HVigic3RvcCB3cmFwOiBmaWxsZWQgJXp4ID49IG92ZXJmbG93Qml0ICV6eCIsIGZpbGxlZCwgb3ZlcmZsb3dCaXQpOworICAgICAgICAgICAgbmV3UmVhciAtPSBvdmVyZmxvd0JpdDsKKyAgICAgICAgICAgIGZpbGxlZCAtPSBvdmVyZmxvd0JpdDsKKyAgICAgICAgfQorICAgICAgICBpZiAoMCA8PSBmaWxsZWQgJiYgKHNpemVfdCkgZmlsbGVkIDw9IG1GcmFtZUNvdW50KSB7CisgICAgICAgICAgICAvLyB3ZSdyZSBzdG9wcGVkLCByZXR1cm4gdGhlIHN0b3AgbGV2ZWwgYXMgbmV3UmVhcgorICAgICAgICAgICAgcmV0dXJuIG5ld1JlYXI7CisgICAgICAgIH0KKworICAgICAgICAvLyBBIGNvcnJ1cHQgc3RvcC4gTG9nIGVycm9yIGFuZCBpZ25vcmUuCisgICAgICAgIEFMT0dFKCJtU3RvcExhc3QgJSN4IC0+IHN0b3AgJSN4LCBmcm9udCAlI3gsIHJlYXIgJSN4LCBtYXNrICUjeCwgbmV3UmVhciAlI3gsICIKKyAgICAgICAgICAgICAgICAiZmlsbGVkICV6ZD0lI3giLAorICAgICAgICAgICAgICAgIHN0b3BMYXN0LCBzdG9wLCBmcm9udCwgcmVhciwKKyAgICAgICAgICAgICAgICAodW5zaWduZWQpbWFzaywgbmV3UmVhciwgZmlsbGVkLCAodW5zaWduZWQpZmlsbGVkKTsKKyAgICAgICAgLy8gRG9uJ3QgcmVzZXQgbVN0b3BMYXN0IGFzIHRoaXMgaXMgY29uc3QuCisgICAgfQorICAgIHJldHVybiByZWFyOworfQorCit2b2lkIEF1ZGlvVHJhY2tTZXJ2ZXJQcm94eTo6c3RhcnQoKQoreworICAgIG1TdG9wTGFzdCA9IGFuZHJvaWRfYXRvbWljX2FjcXVpcmVfbG9hZCgmbUNibGstPnUubVN0cmVhbWluZy5tU3RvcCk7Cit9CisKK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJpbnRlZ2VyIikpKQogc3RhdHVzX3QgU2VydmVyUHJveHk6Om9idGFpbkJ1ZmZlcihCdWZmZXIqIGJ1ZmZlciwgYm9vbCBhY2tGbHVzaCkKIHsKICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGJ1ZmZlciA9PSBOVUxMIHx8IGJ1ZmZlci0+bUZyYW1lQ291bnQgPT0gMCwKQEAgLTY5Myw3ICs3NzAsNyBAQAogICAgIC8vIFNlZSBub3RlcyBvbiBiYXJyaWVycyBhdCBDbGllbnRQcm94eTo6b2J0YWluQnVmZmVyKCkKICAgICBpZiAobUlzT3V0KSB7CiAgICAgICAgIGZsdXNoQnVmZmVySWZOZWVkZWQoKTsgLy8gbWlnaHQgbW9kaWZ5IG1Gcm9udAotICAgICAgICByZWFyID0gYW5kcm9pZF9hdG9taWNfYWNxdWlyZV9sb2FkKCZjYmxrLT51Lm1TdHJlYW1pbmcubVJlYXIpOworICAgICAgICByZWFyID0gZ2V0UmVhcigpOwogICAgICAgICBmcm9udCA9IGNibGstPnUubVN0cmVhbWluZy5tRnJvbnQ7CiAgICAgfSBlbHNlIHsKICAgICAgICAgZnJvbnQgPSBhbmRyb2lkX2F0b21pY19hY3F1aXJlX2xvYWQoJmNibGstPnUubVN0cmVhbWluZy5tRnJvbnQpOwpAQCAtODI1LDggKzkwMiw3IEBACiAgICAgICAgIC8vIEZJWE1FIHNob3VsZCByZXR1cm4gYW4gYWNjdXJhdGUgdmFsdWUsIGJ1dCBvdmVyLWVzdGltYXRlIGlzIGJldHRlciB0aGFuIHVuZGVyLWVzdGltYXRlCiAgICAgICAgIHJldHVybiBtRnJhbWVDb3VudDsKICAgICB9Ci0gICAgLy8gdGhlIGFjcXVpcmUgbWlnaHQgbm90IGJlIG5lY2Vzc2FyeSBzaW5jZSBub3QgZG9pbmcgYSBzdWJzZXF1ZW50IHJlYWQKLSAgICBpbnQzMl90IHJlYXIgPSBhbmRyb2lkX2F0b21pY19hY3F1aXJlX2xvYWQoJmNibGstPnUubVN0cmVhbWluZy5tUmVhcik7CisgICAgY29uc3QgaW50MzJfdCByZWFyID0gZ2V0UmVhcigpOwogICAgIHNzaXplX3QgZmlsbGVkID0gcmVhciAtIGNibGstPnUubVN0cmVhbWluZy5tRnJvbnQ7CiAgICAgLy8gcGlwZSBzaG91bGQgbm90IGFscmVhZHkgYmUgb3ZlcmZ1bGwKICAgICBpZiAoISgwIDw9IGZpbGxlZCAmJiAoc2l6ZV90KSBmaWxsZWQgPD0gbUZyYW1lQ291bnQpKSB7CkBAIC04NTIsNyArOTI4LDcgQEAKICAgICBpZiAoZmx1c2ggIT0gbUZsdXNoKSB7CiAgICAgICAgIHJldHVybiBtRnJhbWVDb3VudDsKICAgICB9Ci0gICAgY29uc3QgaW50MzJfdCByZWFyID0gYW5kcm9pZF9hdG9taWNfYWNxdWlyZV9sb2FkKCZjYmxrLT51Lm1TdHJlYW1pbmcubVJlYXIpOworICAgIGNvbnN0IGludDMyX3QgcmVhciA9IGdldFJlYXIoKTsKICAgICBjb25zdCBzc2l6ZV90IGZpbGxlZCA9IHJlYXIgLSBjYmxrLT51Lm1TdHJlYW1pbmcubUZyb250OwogICAgIGlmICghKDAgPD0gZmlsbGVkICYmIChzaXplX3QpIGZpbGxlZCA8PSBtRnJhbWVDb3VudCkpIHsKICAgICAgICAgcmV0dXJuIDA7IC8vIGVycm9yIGNvbmRpdGlvbiwgc2lsZW50bHkgcmV0dXJuIDAuCkBAIC0xMTQ5LDYgKzEyMjUsMTIgQEAKICAgICB9CiB9CiAKK2ludDMyX3QgU3RhdGljQXVkaW9UcmFja1NlcnZlclByb3h5OjpnZXRSZWFyKCkgY29uc3QKK3sKKyAgICBMT0dfQUxXQVlTX0ZBVEFMKCJnZXRSZWFyKCkgbm90IHBlcm1pdHRlZCBmb3Igc3RhdGljIHRyYWNrcyIpOworICAgIHJldHVybiAwOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9GbGluZ2VyLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb0ZsaW5nZXIuY3BwCmluZGV4IDE0ZmVhZGEuLjAwYWY3ZTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb0ZsaW5nZXIuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb0ZsaW5nZXIuY3BwCkBAIC0yMiw3ICsyMiwxMSBAQAogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGN1dGlscy9tdWx0aXVzZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9UaW1lQ2hlY2suaD4KKyNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KIAogI2luY2x1ZGUgIklBdWRpb0ZsaW5nZXIuaCIKIApAQCAtMzAsNyArMzQsNyBAQAogCiBlbnVtIHsKICAgICBDUkVBVEVfVFJBQ0sgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAotICAgIE9QRU5fUkVDT1JELAorICAgIENSRUFURV9SRUNPUkQsCiAgICAgU0FNUExFX1JBVEUsCiAgICAgUkVTRVJWRUQsICAgLy8gb2Jzb2xldGUsIHdhcyBDSEFOTkVMX0NPVU5UCiAgICAgRk9STUFULApAQCAtNDcsNiArNTEsNyBAQAogICAgIFNFVF9NT0RFLAogICAgIFNFVF9NSUNfTVVURSwKICAgICBHRVRfTUlDX01VVEUsCisgICAgU0VUX1JFQ09SRF9TSUxFTkNFRCwKICAgICBTRVRfUEFSQU1FVEVSUywKICAgICBHRVRfUEFSQU1FVEVSUywKICAgICBSRUdJU1RFUl9DTElFTlQsCkBAIC04Myw2ICs4OCw3IEBACiAgICAgR0VUX0FVRElPX0hXX1NZTkNfRk9SX1NFU1NJT04sCiAgICAgU1lTVEVNX1JFQURZLAogICAgIEZSQU1FX0NPVU5UX0hBTCwKKyAgICBHRVRfTUlDUk9QSE9ORVMsCiB9OwogCiAjZGVmaW5lIE1BWF9JVEVNU19QRVJfTElTVCAxMDI0CkBAIC05NSwxODIgKzEwMSw3NCBAQAogICAgIHsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHNwPElBdWRpb1RyYWNrPiBjcmVhdGVUcmFjaygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnBGcmFtZUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCAqZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCB0aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpZW50VWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKKyAgICB2aXJ0dWFsIHNwPElBdWRpb1RyYWNrPiBjcmVhdGVUcmFjayhjb25zdCBDcmVhdGVUcmFja0lucHV0JiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVUcmFja091dHB1dCYgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIHNwPElBdWRpb1RyYWNrPiB0cmFjazsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgc3RyZWFtVHlwZSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzYW1wbGVSYXRlKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGZvcm1hdCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihjaGFubmVsTWFzayk7Ci0gICAgICAgIHNpemVfdCBmcmFtZUNvdW50ID0gcEZyYW1lQ291bnQgIT0gTlVMTCA/ICpwRnJhbWVDb3VudCA6IDA7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQ2NChmcmFtZUNvdW50KTsKLSAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgbEZsYWdzID0gZmxhZ3MgIT0gTlVMTCA/ICpmbGFncyA6IEFVRElPX09VVFBVVF9GTEFHX05PTkU7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihsRmxhZ3MpOwotICAgICAgICAvLyBoYXZlU2hhcmVkQnVmZmVyCi0gICAgICAgIGlmIChzaGFyZWRCdWZmZXIgIT0gMCkgewotICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKHRydWUpOwotICAgICAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihzaGFyZWRCdWZmZXIpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihmYWxzZSk7CisKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gdHJhY2s7CiAgICAgICAgIH0KLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBvdXRwdXQpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHBpZCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgdGlkKTsKLSAgICAgICAgYXVkaW9fc2Vzc2lvbl90IGxTZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFOwotICAgICAgICBpZiAoc2Vzc2lvbklkICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGxTZXNzaW9uSWQgPSAqc2Vzc2lvbklkOwotICAgICAgICB9Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihsU2Vzc2lvbklkKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGNsaWVudFVpZCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihwb3J0SWQpOworCisgICAgICAgIGlucHV0LndyaXRlVG9QYXJjZWwoJmRhdGEpOworCiAgICAgICAgIHN0YXR1c190IGxTdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQ1JFQVRFX1RSQUNLLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrIGVycm9yOiAlcyIsIHN0cmVycm9yKC1sU3RhdHVzKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmcmFtZUNvdW50ID0gcmVwbHkucmVhZEludDY0KCk7Ci0gICAgICAgICAgICBpZiAocEZyYW1lQ291bnQgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICpwRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsRmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpZiAoZmxhZ3MgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICpmbGFncyA9IGxGbGFnczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxTZXNzaW9uSWQgPSAoYXVkaW9fc2Vzc2lvbl90KSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uSWQgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICpzZXNzaW9uSWQgPSBsU2Vzc2lvbklkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbFN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgdHJhY2sgPSBpbnRlcmZhY2VfY2FzdDxJQXVkaW9UcmFjaz4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICAgICAgICAgIGlmIChsU3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRyYWNrID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrIHNob3VsZCBoYXZlIHJldHVybmVkIGFuIElBdWRpb1RyYWNrIik7Ci0gICAgICAgICAgICAgICAgICAgIGxTdGF0dXMgPSBVTktOT1dOX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRyYWNrICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrIHJldHVybmVkIGFuIElBdWRpb1RyYWNrIGJ1dCB3aXRoIHN0YXR1cyAlZCIsIGxTdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICB0cmFjay5jbGVhcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVUcmFjayB0cmFuc2FjdGlvbiBlcnJvciAlZCIsIGxTdGF0dXMpOworICAgICAgICAgICAgKnN0YXR1cyA9IERFQURfT0JKRUNUOworICAgICAgICAgICAgcmV0dXJuIHRyYWNrOwogICAgICAgICB9Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTlVMTCkgewotICAgICAgICAgICAgKnN0YXR1cyA9IGxTdGF0dXM7CisgICAgICAgICpzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgaWYgKCpzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVUcmFjayByZXR1cm5lZCBlcnJvciAlZCIsICpzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIHRyYWNrOwogICAgICAgICB9CisgICAgICAgIHRyYWNrID0gaW50ZXJmYWNlX2Nhc3Q8SUF1ZGlvVHJhY2s+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgIGlmICh0cmFjayA9PSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2sgcmV0dXJuZWQgYW4gTlVMTCBJQXVkaW9UcmFjayB3aXRoIHN0YXR1cyBPSyIpOworICAgICAgICAgICAgKnN0YXR1cyA9IERFQURfT0JKRUNUOworICAgICAgICAgICAgcmV0dXJuIHRyYWNrOworICAgICAgICB9CisgICAgICAgIG91dHB1dC5yZWFkRnJvbVBhcmNlbCgmcmVwbHkpOwogICAgICAgICByZXR1cm4gdHJhY2s7CiAgICAgfQogCi0gICAgdmlydHVhbCBzcDxJQXVkaW9SZWNvcmQ+IG9wZW5SZWNvcmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpwRnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCAqZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgdGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpZW50VWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgKnNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpub3RpZmljYXRpb25GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElNZW1vcnk+JiBjYmxrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJTWVtb3J5PiYgYnVmZmVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCisgICAgdmlydHVhbCBzcDxtZWRpYTo6SUF1ZGlvUmVjb3JkPiBjcmVhdGVSZWNvcmQoY29uc3QgQ3JlYXRlUmVjb3JkSW5wdXQmIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZVJlY29yZE91dHB1dCYgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIHNwPElBdWRpb1JlY29yZD4gcmVjb3JkOworICAgICAgICBzcDxtZWRpYTo6SUF1ZGlvUmVjb3JkPiByZWNvcmQ7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIGlucHV0KTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHNhbXBsZVJhdGUpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoZm9ybWF0KTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGNoYW5uZWxNYXNrKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cmluZzE2KG9wUGFja2FnZU5hbWUpOwotICAgICAgICBzaXplX3QgZnJhbWVDb3VudCA9IHBGcmFtZUNvdW50ICE9IE5VTEwgPyAqcEZyYW1lQ291bnQgOiAwOwotICAgICAgICBkYXRhLndyaXRlSW50NjQoZnJhbWVDb3VudCk7Ci0gICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgbEZsYWdzID0gZmxhZ3MgIT0gTlVMTCA/ICpmbGFncyA6IEFVRElPX0lOUFVUX0ZMQUdfTk9ORTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGxGbGFncyk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgcGlkKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSB0aWQpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIGNsaWVudFVpZCk7Ci0gICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBsU2Vzc2lvbklkID0gQVVESU9fU0VTU0lPTl9BTExPQ0FURTsKLSAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBsU2Vzc2lvbklkID0gKnNlc3Npb25JZDsKKworICAgICAgICBpZiAoc3RhdHVzID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiByZWNvcmQ7CiAgICAgICAgIH0KLSAgICAgICAgZGF0YS53cml0ZUludDMyKGxTZXNzaW9uSWQpOwotICAgICAgICBkYXRhLndyaXRlSW50NjQobm90aWZpY2F0aW9uRnJhbWVzICE9IE5VTEwgPyAqbm90aWZpY2F0aW9uRnJhbWVzIDogMCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihwb3J0SWQpOwotICAgICAgICBjYmxrLmNsZWFyKCk7Ci0gICAgICAgIGJ1ZmZlcnMuY2xlYXIoKTsKLSAgICAgICAgc3RhdHVzX3QgbFN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChPUEVOX1JFQ09SRCwgZGF0YSwgJnJlcGx5KTsKKworICAgICAgICBpbnB1dC53cml0ZVRvUGFyY2VsKCZkYXRhKTsKKworICAgICAgICBzdGF0dXNfdCBsU3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KENSRUFURV9SRUNPUkQsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HRSgib3BlblJlY29yZCBlcnJvcjogJXMiLCBzdHJlcnJvcigtbFN0YXR1cykpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZnJhbWVDb3VudCA9IHJlcGx5LnJlYWRJbnQ2NCgpOwotICAgICAgICAgICAgaWYgKHBGcmFtZUNvdW50ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAqcEZyYW1lQ291bnQgPSBmcmFtZUNvdW50OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbEZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpZiAoZmxhZ3MgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICpmbGFncyA9IGxGbGFnczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxTZXNzaW9uSWQgPSAoYXVkaW9fc2Vzc2lvbl90KSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uSWQgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICpzZXNzaW9uSWQgPSBsU2Vzc2lvbklkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2l6ZV90IGxOb3RpZmljYXRpb25GcmFtZXMgPSAoc2l6ZV90KSByZXBseS5yZWFkSW50NjQoKTsKLSAgICAgICAgICAgIGlmIChub3RpZmljYXRpb25GcmFtZXMgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICpub3RpZmljYXRpb25GcmFtZXMgPSBsTm90aWZpY2F0aW9uRnJhbWVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbFN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmVjb3JkID0gaW50ZXJmYWNlX2Nhc3Q8SUF1ZGlvUmVjb3JkPihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOwotICAgICAgICAgICAgY2JsayA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgICAgICAgICBpZiAoY2JsayAhPSAwICYmIGNibGstPnBvaW50ZXIoKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgY2Jsay5jbGVhcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVmZmVycyA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgICAgICAgICBpZiAoYnVmZmVycyAhPSAwICYmIGJ1ZmZlcnMtPnBvaW50ZXIoKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVycy5jbGVhcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGxTdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBpZiAocmVjb3JkID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIm9wZW5SZWNvcmQgc2hvdWxkIGhhdmUgcmV0dXJuZWQgYW4gSUF1ZGlvUmVjb3JkIik7Ci0gICAgICAgICAgICAgICAgICAgIGxTdGF0dXMgPSBVTktOT1dOX0VSUk9SOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2JsayA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJvcGVuUmVjb3JkIHNob3VsZCBoYXZlIHJldHVybmVkIGEgY2JsayIpOwotICAgICAgICAgICAgICAgICAgICBsU3RhdHVzID0gTk9fTUVNT1JZOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBidWZmZXJzIGlzIHBlcm1pdHRlZCB0byBiZSAwCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChyZWNvcmQgIT0gMCB8fCBjYmxrICE9IDAgfHwgYnVmZmVycyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJvcGVuUmVjb3JkIHJldHVybmVkIGFuIElBdWRpb1JlY29yZCwgY2JsaywgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAib3IgYnVmZmVycyBidXQgd2l0aCBzdGF0dXMgJWQiLCBsU3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJlY29yZC5jbGVhcigpOwotICAgICAgICAgICAgICAgIGNibGsuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICBidWZmZXJzLmNsZWFyKCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HRSgiY3JlYXRlUmVjb3JkIHRyYW5zYWN0aW9uIGVycm9yICVkIiwgbFN0YXR1cyk7CisgICAgICAgICAgICAqc3RhdHVzID0gREVBRF9PQkpFQ1Q7CisgICAgICAgICAgICByZXR1cm4gcmVjb3JkOwogICAgICAgICB9Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTlVMTCkgewotICAgICAgICAgICAgKnN0YXR1cyA9IGxTdGF0dXM7CisgICAgICAgICpzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgaWYgKCpzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVSZWNvcmQgcmV0dXJuZWQgZXJyb3IgJWQiLCAqc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiByZWNvcmQ7CiAgICAgICAgIH0KKworICAgICAgICByZWNvcmQgPSBpbnRlcmZhY2VfY2FzdDxtZWRpYTo6SUF1ZGlvUmVjb3JkPihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICBpZiAocmVjb3JkID09IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVSZWNvcmQgcmV0dXJuZWQgYSBOVUxMIElBdWRpb1JlY29yZCB3aXRoIHN0YXR1cyBPSyIpOworICAgICAgICAgICAgKnN0YXR1cyA9IERFQURfT0JKRUNUOworICAgICAgICAgICAgcmV0dXJuIHJlY29yZDsKKyAgICAgICAgfQorICAgICAgICBvdXRwdXQucmVhZEZyb21QYXJjZWwoJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHJlY29yZDsKICAgICB9CiAKQEAgLTQxMyw2ICszMTEsMTUgQEAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAorICAgIHZpcnR1YWwgdm9pZCBzZXRSZWNvcmRTaWxlbmNlZCh1aWRfdCB1aWQsIGJvb2wgc2lsZW5jZWQpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIodWlkKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHNpbGVuY2VkID8gMSA6IDApOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1JFQ09SRF9TSUxFTkNFRCwgZGF0YSwgJnJlcGx5KTsKKyAgICB9CisKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CkBAIC04MDQsMTQgKzcxMSwxOCBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDY0KCk7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRMb3dSYW1EZXZpY2UoYm9vbCBpc0xvd1JhbURldmljZSkKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldExvd1JhbURldmljZShib29sIGlzTG93UmFtRGV2aWNlLCBpbnQ2NF90IHRvdGFsTWVtb3J5KSBvdmVycmlkZQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQpIGlzTG93UmFtRGV2aWNlKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9MT1dfUkFNX0RFVklDRSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworCisgICAgICAgIHN0YXRpY19hc3NlcnQoTk9fRVJST1IgPT0gMCwgIk5PX0VSUk9SIG11c3QgYmUgMCIpOworICAgICAgICByZXR1cm4gZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSkKKyAgICAgICAgICAgICAgICA/OiBkYXRhLndyaXRlSW50MzIoKGludCkgaXNMb3dSYW1EZXZpY2UpCisgICAgICAgICAgICAgICAgPzogZGF0YS53cml0ZUludDY0KHRvdGFsTWVtb3J5KQorICAgICAgICAgICAgICAgID86IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfTE9XX1JBTV9ERVZJQ0UsIGRhdGEsICZyZXBseSkKKyAgICAgICAgICAgICAgICA/OiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BvcnRzKHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnRzKQogICAgIHsKQEAgLTkzNSw2ICs4NDYsMTggQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDY0KCk7CiAgICAgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX01JQ1JPUEhPTkVTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SIHx8CisgICAgICAgICAgICAgICAgKHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZFBhcmNlbGFibGVWZWN0b3IobWljcm9waG9uZXMpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KIH07CiAKIElNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShBdWRpb0ZsaW5nZXIsICJhbmRyb2lkLm1lZGlhLklBdWRpb0ZsaW5nZXIiKTsKQEAgLTk0NCwyMSArODY3LDgxIEBACiBzdGF0dXNfdCBCbkF1ZGlvRmxpbmdlcjo6b25UcmFuc2FjdCgKICAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQogeworICAgIC8vIG1ha2Ugc3VyZSB0cmFuc2FjdGlvbnMgcmVzZXJ2ZWQgdG8gQXVkaW9Qb2xpY3lNYW5hZ2VyIGRvIG5vdCBjb21lIGZyb20gb3RoZXIgcHJvY2Vzc2VzCisgICAgc3dpdGNoIChjb2RlKSB7CisgICAgICAgIGNhc2UgU0VUX1NUUkVBTV9WT0xVTUU6CisgICAgICAgIGNhc2UgU0VUX1NUUkVBTV9NVVRFOgorICAgICAgICBjYXNlIE9QRU5fT1VUUFVUOgorICAgICAgICBjYXNlIE9QRU5fRFVQTElDQVRFX09VVFBVVDoKKyAgICAgICAgY2FzZSBDTE9TRV9PVVRQVVQ6CisgICAgICAgIGNhc2UgU1VTUEVORF9PVVRQVVQ6CisgICAgICAgIGNhc2UgUkVTVE9SRV9PVVRQVVQ6CisgICAgICAgIGNhc2UgT1BFTl9JTlBVVDoKKyAgICAgICAgY2FzZSBDTE9TRV9JTlBVVDoKKyAgICAgICAgY2FzZSBJTlZBTElEQVRFX1NUUkVBTToKKyAgICAgICAgY2FzZSBTRVRfVk9JQ0VfVk9MVU1FOgorICAgICAgICBjYXNlIE1PVkVfRUZGRUNUUzoKKyAgICAgICAgY2FzZSBMT0FEX0hXX01PRFVMRToKKyAgICAgICAgY2FzZSBMSVNUX0FVRElPX1BPUlRTOgorICAgICAgICBjYXNlIEdFVF9BVURJT19QT1JUOgorICAgICAgICBjYXNlIENSRUFURV9BVURJT19QQVRDSDoKKyAgICAgICAgY2FzZSBSRUxFQVNFX0FVRElPX1BBVENIOgorICAgICAgICBjYXNlIExJU1RfQVVESU9fUEFUQ0hFUzoKKyAgICAgICAgY2FzZSBTRVRfQVVESU9fUE9SVF9DT05GSUc6CisgICAgICAgIGNhc2UgU0VUX1JFQ09SRF9TSUxFTkNFRDoKKyAgICAgICAgICAgIEFMT0dXKCIlczogdHJhbnNhY3Rpb24gJWQgcmVjZWl2ZWQgZnJvbSBQSUQgJWQiLAorICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNvZGUsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSk7CisgICAgICAgICAgICAvLyByZXR1cm4gc3RhdHVzIG9ubHkgZm9yIG5vbiB2b2lkIG1ldGhvZHMKKyAgICAgICAgICAgIHN3aXRjaCAoY29kZSkgeworICAgICAgICAgICAgICAgIGNhc2UgU0VUX1JFQ09SRF9TSUxFTkNFRDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4gKElOVkFMSURfT1BFUkFUSU9OKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gbWFrZSBzdXJlIHRoZSBmb2xsb3dpbmcgdHJhbnNhY3Rpb25zIGNvbWUgZnJvbSBzeXN0ZW0gY29tcG9uZW50cworICAgIHN3aXRjaCAoY29kZSkgeworICAgICAgICBjYXNlIFNFVF9NQVNURVJfVk9MVU1FOgorICAgICAgICBjYXNlIFNFVF9NQVNURVJfTVVURToKKyAgICAgICAgY2FzZSBTRVRfTU9ERToKKyAgICAgICAgY2FzZSBTRVRfTUlDX01VVEU6CisgICAgICAgIGNhc2UgU0VUX0xPV19SQU1fREVWSUNFOgorICAgICAgICBjYXNlIFNZU1RFTV9SRUFEWTogeworICAgICAgICAgICAgaWYgKG11bHRpdXNlcl9nZXRfYXBwX2lkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkgPj0gQUlEX0FQUF9TVEFSVCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlczogdHJhbnNhY3Rpb24gJWQgcmVjZWl2ZWQgZnJvbSBQSUQgJWQgdW5hdXRob3JpemVkIFVJRCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNvZGUsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpOworICAgICAgICAgICAgICAgIC8vIHJldHVybiBzdGF0dXMgb25seSBmb3Igbm9uIHZvaWQgbWV0aG9kcworICAgICAgICAgICAgICAgIHN3aXRjaCAoY29kZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFNZU1RFTV9SRUFEWToKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4gKElOVkFMSURfT1BFUkFUSU9OKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCiAgICAgLy8gV2hpdGVsaXN0IG9mIHJlbGV2YW50IGV2ZW50cyB0byB0cmlnZ2VyIGxvZyBtZXJnaW5nLgogICAgIC8vIExvZyBtZXJnaW5nIHNob3VsZCBhY3RpdmF0ZSBkdXJpbmcgYXVkaW8gYWN0aXZpdHkgb2YgYW55IGtpbmQuIFRoaXMgYXJlIGNvbnNpZGVyZWQgdGhlCiAgICAgLy8gbW9zdCByZWxldmFudCBldmVudHMuCiAgICAgLy8gVE9ETyBzaG91bGQgc2VsZWN0IG1vcmUgd2lzZWx5IHRoZSBpdGVtcyBmcm9tIHRoZSBsaXN0CiAgICAgc3dpdGNoIChjb2RlKSB7CiAgICAgICAgIGNhc2UgQ1JFQVRFX1RSQUNLOgotICAgICAgICBjYXNlIE9QRU5fUkVDT1JEOgorICAgICAgICBjYXNlIENSRUFURV9SRUNPUkQ6CiAgICAgICAgIGNhc2UgU0VUX01BU1RFUl9WT0xVTUU6CiAgICAgICAgIGNhc2UgU0VUX01BU1RFUl9NVVRFOgotICAgICAgICBjYXNlIFNFVF9TVFJFQU1fVk9MVU1FOgotICAgICAgICBjYXNlIFNFVF9TVFJFQU1fTVVURToKICAgICAgICAgY2FzZSBTRVRfTUlDX01VVEU6CiAgICAgICAgIGNhc2UgU0VUX1BBUkFNRVRFUlM6Ci0gICAgICAgIGNhc2UgT1BFTl9JTlBVVDoKLSAgICAgICAgY2FzZSBTRVRfVk9JQ0VfVk9MVU1FOgogICAgICAgICBjYXNlIENSRUFURV9FRkZFQ1Q6CiAgICAgICAgIGNhc2UgU1lTVEVNX1JFQURZOiB7CiAgICAgICAgICAgICByZXF1ZXN0TG9nTWVyZ2UoKTsKQEAgLTk2Nyw3NyArOTUwLDU4IEBACiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBicmVhazsKICAgICB9CisKKyAgICBUaW1lQ2hlY2sgY2hlY2soIklBdWRpb0ZsaW5nZXIiKTsKKwogICAgIHN3aXRjaCAoY29kZSkgewogICAgICAgICBjYXNlIENSRUFURV9UUkFDSzogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGludCBzdHJlYW1UeXBlID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gKGF1ZGlvX2Zvcm1hdF90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSBkYXRhLnJlYWRJbnQ2NCgpOwotICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBib29sIGhhdmVTaGFyZWRCdWZmZXIgPSBkYXRhLnJlYWRJbnQzMigpICE9IDA7Ci0gICAgICAgICAgICBzcDxJTWVtb3J5PiBidWZmZXI7Ci0gICAgICAgICAgICBpZiAoaGF2ZVNoYXJlZEJ1ZmZlcikgewotICAgICAgICAgICAgICAgIGJ1ZmZlciA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKworICAgICAgICAgICAgQ3JlYXRlVHJhY2tJbnB1dCBpbnB1dDsKKyAgICAgICAgICAgIGlmIChpbnB1dC5yZWFkRnJvbVBhcmNlbCgoUGFyY2VsKikmZGF0YSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihERUFEX09CSkVDVCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gKGF1ZGlvX2lvX2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcGlkX3QgcGlkID0gKHBpZF90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcGlkX3QgdGlkID0gKHBpZF90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCA9IChhdWRpb19zZXNzaW9uX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpbnQgY2xpZW50VWlkID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gKGF1ZGlvX3BvcnRfaGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICAgICAgICAgIHNwPElBdWRpb1RyYWNrPiB0cmFjazsKLSAgICAgICAgICAgIGlmICgoaGF2ZVNoYXJlZEJ1ZmZlciAmJiAoYnVmZmVyID09IDApKSB8fAotICAgICAgICAgICAgICAgICAgICAoKGJ1ZmZlciAhPSAwKSAmJiAoYnVmZmVyLT5wb2ludGVyKCkgPT0gTlVMTCkpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIkNSRUFURV9UUkFDSzogY2Fubm90IHJldHJpZXZlIHNoYXJlZCBtZW1vcnkiKTsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBERUFEX09CSkVDVDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdHJhY2sgPSBjcmVhdGVUcmFjaygKLSAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19zdHJlYW1fdHlwZV90KSBzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgJmZyYW1lQ291bnQsICZmbGFncywgYnVmZmVyLCBvdXRwdXQsIHBpZCwgdGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgJnNlc3Npb25JZCwgY2xpZW50VWlkLCAmc3RhdHVzLCBwb3J0SWQpOwotICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKHRyYWNrICE9IDApICE9IChzdGF0dXMgPT0gTk9fRVJST1IpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDY0KGZyYW1lQ291bnQpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZmxhZ3MpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2Vzc2lvbklkKTsKKworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgICAgICAgICAgQ3JlYXRlVHJhY2tPdXRwdXQgb3V0cHV0OworCisgICAgICAgICAgICBzcDxJQXVkaW9UcmFjaz4gdHJhY2s9IGNyZWF0ZVRyYWNrKGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMpOworCisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCh0cmFjayAhPSAwKSAhPSAoc3RhdHVzID09IE5PX0VSUk9SKSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcih0cmFjaykpOworICAgICAgICAgICAgb3V0cHV0LndyaXRlVG9QYXJjZWwocmVwbHkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIE9QRU5fUkVDT1JEOiB7CisgICAgICAgIGNhc2UgQ1JFQVRFX1JFQ09SRDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gKGF1ZGlvX2lvX2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSAoYXVkaW9fZm9ybWF0X3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSA9IGRhdGEucmVhZFN0cmluZzE2KCk7Ci0gICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCA9IGRhdGEucmVhZEludDY0KCk7Ci0gICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBwaWRfdCBwaWQgPSAocGlkX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBwaWRfdCB0aWQgPSAocGlkX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpbnQgY2xpZW50VWlkID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgPSAoYXVkaW9fc2Vzc2lvbl90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgc2l6ZV90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IGRhdGEucmVhZEludDY0KCk7Ci0gICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IChhdWRpb19wb3J0X2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgc3A8SU1lbW9yeT4gY2JsazsKLSAgICAgICAgICAgIHNwPElNZW1vcnk+IGJ1ZmZlcnM7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICAgICAgICAgIHNwPElBdWRpb1JlY29yZD4gcmVjb3JkID0gb3BlblJlY29yZChpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgb3BQYWNrYWdlTmFtZSwgJmZyYW1lQ291bnQsICZmbGFncywKLSAgICAgICAgICAgICAgICAgICAgcGlkLCB0aWQsIGNsaWVudFVpZCwgJnNlc3Npb25JZCwgJm5vdGlmaWNhdGlvbkZyYW1lcywgY2JsaywgYnVmZmVycywKLSAgICAgICAgICAgICAgICAgICAgJnN0YXR1cywgcG9ydElkKTsKKworICAgICAgICAgICAgQ3JlYXRlUmVjb3JkSW5wdXQgaW5wdXQ7CisgICAgICAgICAgICBpZiAoaW5wdXQucmVhZEZyb21QYXJjZWwoKFBhcmNlbCopJmRhdGEpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoREVBRF9PQkpFQ1QpOworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgICAgICAgICAgQ3JlYXRlUmVjb3JkT3V0cHV0IG91dHB1dDsKKworICAgICAgICAgICAgc3A8bWVkaWE6OklBdWRpb1JlY29yZD4gcmVjb3JkID0gY3JlYXRlUmVjb3JkKGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzKTsKKwogICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigocmVjb3JkICE9IDApICE9IChzdGF0dXMgPT0gTk9fRVJST1IpKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDY0KGZyYW1lQ291bnQpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZmxhZ3MpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2Vzc2lvbklkKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDY0KG5vdGlmaWNhdGlvbkZyYW1lcyk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihyZWNvcmQpKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihjYmxrKSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoYnVmZmVycykpOworICAgICAgICAgICAgb3V0cHV0LndyaXRlVG9QYXJjZWwocmVwbHkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFNBTVBMRV9SQVRFOiB7CkBAIC0xMTI3LDYgKzEwOTEsMTUgQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKCBnZXRNaWNNdXRlKCkgKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBTRVRfUkVDT1JEX1NJTEVOQ0VEOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgdWlkX3QgdWlkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZTsKKyAgICAgICAgICAgIGRhdGEucmVhZCgmc291cmNlLCBzaXplb2YoYXVkaW9fc291cmNlX3QpKTsKKyAgICAgICAgICAgIGJvb2wgc2lsZW5jZWQgPSBkYXRhLnJlYWRJbnQzMigpID09IDE7CisgICAgICAgICAgICBzZXRSZWNvcmRTaWxlbmNlZCh1aWQsIHNpbGVuY2VkKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBTRVRfUEFSQU1FVEVSUzogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlID0gKGF1ZGlvX2lvX2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpOwpAQCAtMTM2NCw4ICsxMzM3LDEzIEBACiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgU0VUX0xPV19SQU1fREVWSUNFOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYm9vbCBpc0xvd1JhbURldmljZSA9IGRhdGEucmVhZEludDMyKCkgIT0gMDsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldExvd1JhbURldmljZShpc0xvd1JhbURldmljZSkpOworICAgICAgICAgICAgaW50MzJfdCBpc0xvd1JhbURldmljZTsKKyAgICAgICAgICAgIGludDY0X3QgdG90YWxNZW1vcnk7CisgICAgICAgICAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgICAgICAgICBkYXRhLnJlYWRJbnQzMigmaXNMb3dSYW1EZXZpY2UpID86CisgICAgICAgICAgICAgICAgICAgIGRhdGEucmVhZEludDY0KCZ0b3RhbE1lbW9yeSkgPzoKKyAgICAgICAgICAgICAgICAgICAgc2V0TG93UmFtRGV2aWNlKGlzTG93UmFtRGV2aWNlICE9IDAsIHRvdGFsTWVtb3J5KTsKKyAgICAgICAgICAgICh2b2lkKXJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgTElTVF9BVURJT19QT1JUUzogewpAQCAtMTQ4MSw2ICsxNDU5LDE2IEBACiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQ2NCggZnJhbWVDb3VudEhBTCgoYXVkaW9faW9faGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCkpICk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgR0VUX01JQ1JPUEhPTkVTOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiBtaWNyb3Bob25lczsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldE1pY3JvcGhvbmVzKCZtaWNyb3Bob25lcyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZVBhcmNlbGFibGVWZWN0b3IobWljcm9waG9uZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1BvbGljeVNlcnZpY2UuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvUG9saWN5U2VydmljZS5jcHAKaW5kZXggZjA3MWEwMi4uYTEyMzZlNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvUG9saWN5U2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvUG9saWN5U2VydmljZS5jcHAKQEAgLTIyLDExICsyMiwxMyBAQAogI2luY2x1ZGUgPG1hdGguaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAorI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLQorI2luY2x1ZGUgPGN1dGlscy9tdWx0aXVzZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb0VmZmVjdC5oPgogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaD4KLQorI2luY2x1ZGUgPG1lZGlhL1RpbWVDaGVjay5oPgorI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC03OCw3ICs4MCw5IEBACiAgICAgU0VUX0FVRElPX1BPUlRfQ0FMTEJBQ0tfRU5BQkxFRCwKICAgICBTRVRfTUFTVEVSX01PTk8sCiAgICAgR0VUX01BU1RFUl9NT05PLAotICAgIEdFVF9TVFJFQU1fVk9MVU1FX0RCCisgICAgR0VUX1NUUkVBTV9WT0xVTUVfREIsCisgICAgR0VUX1NVUlJPVU5EX0ZPUk1BVFMsCisgICAgU0VUX1NVUlJPVU5EX0ZPUk1BVF9FTkFCTEVECiB9OwogCiAjZGVmaW5lIE1BWF9JVEVNU19QRVJfTElTVCAxMDI0CkBAIC0xNjAsMjggKzE2NCwxMSBAQAogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CiAgICAgfQogCi0gICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pCisgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzdHJlYW0pKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHNhbXBsaW5nUmF0ZSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KGZvcm1hdCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoY2hhbm5lbE1hc2spOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihmbGFncykpOwotICAgICAgICAvLyBoYXNPZmZsb2FkSW5mbwotICAgICAgICBpZiAob2ZmbG9hZEluZm8gPT0gTlVMTCkgewotICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKDEpOwotICAgICAgICAgICAgZGF0YS53cml0ZShvZmZsb2FkSW5mbywgc2l6ZW9mKGF1ZGlvX29mZmxvYWRfaW5mb190KSk7Ci0gICAgICAgIH0KICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9PVVRQVVQsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8YXVkaW9faW9faGFuZGxlX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CiAgICAgfQpAQCAtMTkwLDYgKzE3Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLApAQCAtMjMzLDYgKzIyMSw3IEBACiAgICAgICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKDEpOwogICAgICAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigqc3RyZWFtKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihwaWQpOwogICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKHVpZCk7CiAgICAgICAgICAgICBkYXRhLndyaXRlKGNvbmZpZywgc2l6ZW9mKGF1ZGlvX2NvbmZpZ190KSk7CiAgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihmbGFncykpOwpAQCAtMjk5LDYgKzI4OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLApAQCAtMzI3LDYgKzMxNyw3IEBACiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzZXNzaW9uKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHBpZCk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMih1aWQpOworICAgICAgICBkYXRhLndyaXRlU3RyaW5nMTYob3BQYWNrYWdlTmFtZSk7CiAgICAgICAgIGRhdGEud3JpdGUoY29uZmlnLCBzaXplb2YoYXVkaW9fY29uZmlnX2Jhc2VfdCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoZmxhZ3MpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoKnNlbGVjdGVkRGV2aWNlSWQpOwpAQCAtMzQ1LDM1ICszMzYsMzMgQEAKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpzaWxlbmNlZCkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihpbnB1dCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzZXNzaW9uKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHBvcnRJZCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigqc2lsZW5jZWQgPyAxIDogMCk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTVEFSVF9JTlBVVCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOworICAgICAgICAqc2lsZW5jZWQgPSByZXBseS5yZWFkSW50MzIoKSA9PSAxOworICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGlucHV0KTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHNlc3Npb24pOworICAgICAgICBkYXRhLndyaXRlSW50MzIocG9ydElkKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNUT1BfSU5QVVQsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoaW5wdXQpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc2Vzc2lvbik7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihwb3J0SWQpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVMRUFTRV9JTlBVVCwgZGF0YSwgJnJlcGx5KTsKICAgICB9CiAKQEAgLTg0MiwxNiArODMxLDEyNSBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkRmxvYXQoKTsKICAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN1cnJvdW5kRm9ybWF0cyh1bnNpZ25lZCBpbnQgKm51bVN1cnJvdW5kRm9ybWF0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqc3Vycm91bmRGb3JtYXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKnN1cnJvdW5kRm9ybWF0c0VuYWJsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXBvcnRlZCkKKyAgICB7CisgICAgICAgIGlmIChudW1TdXJyb3VuZEZvcm1hdHMgPT0gTlVMTCB8fCAoKm51bVN1cnJvdW5kRm9ybWF0cyAhPSAwICYmCisgICAgICAgICAgICAgICAgKHN1cnJvdW5kRm9ybWF0cyA9PSBOVUxMIHx8IHN1cnJvdW5kRm9ybWF0c0VuYWJsZWQgPT0gTlVMTCkpKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHVuc2lnbmVkIGludCBudW1TdXJyb3VuZEZvcm1hdHNSZXEgPSAqbnVtU3Vycm91bmRGb3JtYXRzOworICAgICAgICBkYXRhLndyaXRlVWludDMyKG51bVN1cnJvdW5kRm9ybWF0c1JlcSk7CisgICAgICAgIGRhdGEud3JpdGVCb29sKHJlcG9ydGVkKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9TVVJST1VORF9GT1JNQVRTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIChzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCkpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAqbnVtU3Vycm91bmRGb3JtYXRzID0gcmVwbHkucmVhZFVpbnQzMigpOworICAgICAgICB9CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGlmIChudW1TdXJyb3VuZEZvcm1hdHNSZXEgPiAqbnVtU3Vycm91bmRGb3JtYXRzKSB7CisgICAgICAgICAgICAgICAgbnVtU3Vycm91bmRGb3JtYXRzUmVxID0gKm51bVN1cnJvdW5kRm9ybWF0czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChudW1TdXJyb3VuZEZvcm1hdHNSZXEgPiAwKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZChzdXJyb3VuZEZvcm1hdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1TdXJyb3VuZEZvcm1hdHNSZXEgKiBzaXplb2YoYXVkaW9fZm9ybWF0X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWQoc3Vycm91bmRGb3JtYXRzRW5hYmxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVN1cnJvdW5kRm9ybWF0c1JlcSAqIHNpemVvZihib29sKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCwgYm9vbCBlbmFibGVkKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGF1ZGlvRm9ybWF0KTsKKyAgICAgICAgZGF0YS53cml0ZUJvb2woZW5hYmxlZCk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfU1VSUk9VTkRfRk9STUFUX0VOQUJMRUQsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgIH0KIH07CiAKIElNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShBdWRpb1BvbGljeVNlcnZpY2UsICJhbmRyb2lkLm1lZGlhLklBdWRpb1BvbGljeVNlcnZpY2UiKTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0KIHN0YXR1c190IEJuQXVkaW9Qb2xpY3lTZXJ2aWNlOjpvblRyYW5zYWN0KAogICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCiB7CisgICAgLy8gbWFrZSBzdXJlIHRyYW5zYWN0aW9ucyByZXNlcnZlZCB0byBBdWRpb0ZsaW5nZXIgZG8gbm90IGNvbWUgZnJvbSBvdGhlciBwcm9jZXNzZXMKKyAgICBzd2l0Y2ggKGNvZGUpIHsKKyAgICAgICAgY2FzZSBTVEFSVF9PVVRQVVQ6CisgICAgICAgIGNhc2UgU1RPUF9PVVRQVVQ6CisgICAgICAgIGNhc2UgUkVMRUFTRV9PVVRQVVQ6CisgICAgICAgIGNhc2UgR0VUX0lOUFVUX0ZPUl9BVFRSOgorICAgICAgICBjYXNlIFNUQVJUX0lOUFVUOgorICAgICAgICBjYXNlIFNUT1BfSU5QVVQ6CisgICAgICAgIGNhc2UgUkVMRUFTRV9JTlBVVDoKKyAgICAgICAgY2FzZSBHRVRfU1RSQVRFR1lfRk9SX1NUUkVBTToKKyAgICAgICAgY2FzZSBHRVRfT1VUUFVUX0ZPUl9FRkZFQ1Q6CisgICAgICAgIGNhc2UgUkVHSVNURVJfRUZGRUNUOgorICAgICAgICBjYXNlIFVOUkVHSVNURVJfRUZGRUNUOgorICAgICAgICBjYXNlIFNFVF9FRkZFQ1RfRU5BQkxFRDoKKyAgICAgICAgY2FzZSBHRVRfT1VUUFVUX0ZPUl9BVFRSOgorICAgICAgICBjYXNlIEFDUVVJUkVfU09VTkRUUklHR0VSX1NFU1NJT046CisgICAgICAgIGNhc2UgUkVMRUFTRV9TT1VORFRSSUdHRVJfU0VTU0lPTjoKKyAgICAgICAgICAgIEFMT0dXKCIlczogdHJhbnNhY3Rpb24gJWQgcmVjZWl2ZWQgZnJvbSBQSUQgJWQiLAorICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNvZGUsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSk7CisgICAgICAgICAgICAvLyByZXR1cm4gc3RhdHVzIG9ubHkgZm9yIG5vbiB2b2lkIG1ldGhvZHMKKyAgICAgICAgICAgIHN3aXRjaCAoY29kZSkgeworICAgICAgICAgICAgICAgIGNhc2UgUkVMRUFTRV9PVVRQVVQ6CisgICAgICAgICAgICAgICAgY2FzZSBSRUxFQVNFX0lOUFVUOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PiAoSU5WQUxJRF9PUEVSQVRJT04pKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBtYWtlIHN1cmUgdGhlIGZvbGxvd2luZyB0cmFuc2FjdGlvbnMgY29tZSBmcm9tIHN5c3RlbSBjb21wb25lbnRzCisgICAgc3dpdGNoIChjb2RlKSB7CisgICAgICAgIGNhc2UgU0VUX0RFVklDRV9DT05ORUNUSU9OX1NUQVRFOgorICAgICAgICBjYXNlIEhBTkRMRV9ERVZJQ0VfQ09ORklHX0NIQU5HRToKKyAgICAgICAgY2FzZSBTRVRfUEhPTkVfU1RBVEU6CisvL0ZJWE1FOiBBbGxvdyBTRVRfRk9SQ0VfVVNFIGNhbGxzIGZyb20gc3lzdGVtIGFwcHMgdW50aWwgYSBiZXR0ZXIgdXNlIGNhc2Ugcm91dGluZyBBUEkgaXMgYXZhaWxhYmxlCisvLyAgICAgIGNhc2UgU0VUX0ZPUkNFX1VTRToKKyAgICAgICAgY2FzZSBJTklUX1NUUkVBTV9WT0xVTUU6CisgICAgICAgIGNhc2UgU0VUX1NUUkVBTV9WT0xVTUU6CisgICAgICAgIGNhc2UgUkVHSVNURVJfUE9MSUNZX01JWEVTOgorICAgICAgICBjYXNlIFNFVF9NQVNURVJfTU9OTzoKKyAgICAgICAgY2FzZSBTVEFSVF9BVURJT19TT1VSQ0U6CisgICAgICAgIGNhc2UgU1RPUF9BVURJT19TT1VSQ0U6CisgICAgICAgIGNhc2UgR0VUX1NVUlJPVU5EX0ZPUk1BVFM6CisgICAgICAgIGNhc2UgU0VUX1NVUlJPVU5EX0ZPUk1BVF9FTkFCTEVEOiB7CisgICAgICAgICAgICBpZiAobXVsdGl1c2VyX2dldF9hcHBfaWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSA+PSBBSURfQVBQX1NUQVJUKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzOiB0cmFuc2FjdGlvbiAlZCByZWNlaXZlZCBmcm9tIFBJRCAlZCB1bmF1dGhvcml6ZWQgVUlEICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY29kZSwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLAorICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4gKElOVkFMSURfT1BFUkFUSU9OKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgVGltZUNoZWNrIGNoZWNrKCJJQXVkaW9Qb2xpY3lTZXJ2aWNlIik7CisKICAgICBzd2l0Y2ggKGNvZGUpIHsKICAgICAgICAgY2FzZSBTRVRfREVWSUNFX0NPTk5FQ1RJT05fU1RBVEU6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CkBAIC05MzQsMjIgKzEwMzIsNyBAQAogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0KICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPGF1ZGlvX3N0cmVhbV90eXBlX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IChhdWRpb19mb3JtYXRfdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0KLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPGF1ZGlvX291dHB1dF9mbGFnc190PihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIGJvb2wgaGFzT2ZmbG9hZEluZm8gPSBkYXRhLnJlYWRJbnQzMigpICE9IDA7Ci0gICAgICAgICAgICBhdWRpb19vZmZsb2FkX2luZm9fdCBvZmZsb2FkSW5mbyA9IHt9OwotICAgICAgICAgICAgaWYgKGhhc09mZmxvYWRJbmZvKSB7Ci0gICAgICAgICAgICAgICAgZGF0YS5yZWFkKCZvZmZsb2FkSW5mbywgc2l6ZW9mKGF1ZGlvX29mZmxvYWRfaW5mb190KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBnZXRPdXRwdXQoc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzT2ZmbG9hZEluZm8gPyAmb2ZmbG9hZEluZm8gOiBOVUxMKTsKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IGdldE91dHB1dChzdHJlYW0pOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPGludD4ob3V0cHV0KSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CkBAIC05NjgsNiArMTA1MSw3IEBACiAgICAgICAgICAgICBpZiAoaGFzU3RyZWFtKSB7CiAgICAgICAgICAgICAgICAgc3RyZWFtID0gKGF1ZGlvX3N0cmVhbV90eXBlX3QpZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBpZF90IHBpZCA9IChwaWRfdClkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgdWlkX3QgdWlkID0gKHVpZF90KWRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWc7CiAgICAgICAgICAgICBtZW1zZXQoJmNvbmZpZywgMCwgc2l6ZW9mKGF1ZGlvX2NvbmZpZ190KSk7CkBAIC05NzgsNyArMTA2Miw3IEBACiAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IChhdWRpb19wb3J0X2hhbmRsZV90KWRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSAwOwogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0T3V0cHV0Rm9yQXR0cihoYXNBdHRyaWJ1dGVzID8gJmF0dHIgOiBOVUxMLAotICAgICAgICAgICAgICAgICAgICAmb3V0cHV0LCBzZXNzaW9uLCAmc3RyZWFtLCB1aWQsCisgICAgICAgICAgICAgICAgICAgICZvdXRwdXQsIHNlc3Npb24sICZzdHJlYW0sIHBpZCwgdWlkLAogICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAogICAgICAgICAgICAgICAgICAgICBmbGFncywgJnNlbGVjdGVkRGV2aWNlSWQsICZwb3J0SWQpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKQEAgLTEwMzEsNiArMTExNSw3IEBACiAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiA9IChhdWRpb19zZXNzaW9uX3QpZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHBpZF90IHBpZCA9IChwaWRfdClkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgdWlkX3QgdWlkID0gKHVpZF90KWRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiBvcFBhY2thZ2VOYW1lID0gZGF0YS5yZWFkU3RyaW5nMTYoKTsKICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgY29uZmlnOwogICAgICAgICAgICAgbWVtc2V0KCZjb25maWcsIDAsIHNpemVvZihhdWRpb19jb25maWdfYmFzZV90KSk7CiAgICAgICAgICAgICBkYXRhLnJlYWQoJmNvbmZpZywgc2l6ZW9mKGF1ZGlvX2NvbmZpZ19iYXNlX3QpKTsKQEAgLTEwMzgsNyArMTEyMyw3IEBACiAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSAoYXVkaW9fcG9ydF9oYW5kbGVfdCkgZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gKGF1ZGlvX3BvcnRfaGFuZGxlX3QpZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldElucHV0Rm9yQXR0cigmYXR0ciwgJmlucHV0LCBzZXNzaW9uLCBwaWQsIHVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wUGFja2FnZU5hbWUsICZjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsICZzZWxlY3RlZERldmljZUlkLCAmcG9ydElkKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CkBAIC0xMDUxLDI1ICsxMTM2LDI1IEBACiAKICAgICAgICAgY2FzZSBTVEFSVF9JTlBVVDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gc3RhdGljX2Nhc3QgPGF1ZGlvX2lvX2hhbmRsZV90PihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uID0gc3RhdGljX2Nhc3QgPGF1ZGlvX3Nlc3Npb25fdD4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0YXJ0SW5wdXQoaW5wdXQsIHNlc3Npb24pKSk7CisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IHN0YXRpY19jYXN0IDxhdWRpb19wb3J0X2hhbmRsZV90PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIGJvb2wgc2lsZW5jZWQgPSBkYXRhLnJlYWRJbnQzMigpID09IDE7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdGFydElucHV0KHBvcnRJZCwgJnNpbGVuY2VkKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RhdHVzKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzaWxlbmNlZCA/IDEgOiAwKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKIAogICAgICAgICBjYXNlIFNUT1BfSU5QVVQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IHN0YXRpY19jYXN0IDxhdWRpb19pb19oYW5kbGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiA9IHN0YXRpY19jYXN0IDxhdWRpb19zZXNzaW9uX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzdG9wSW5wdXQoaW5wdXQsIHNlc3Npb24pKSk7CisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IHN0YXRpY19jYXN0IDxhdWRpb19wb3J0X2hhbmRsZV90PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RvcElucHV0KHBvcnRJZCkpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKIAogICAgICAgICBjYXNlIFJFTEVBU0VfSU5QVVQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IHN0YXRpY19jYXN0IDxhdWRpb19pb19oYW5kbGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiA9IHN0YXRpY19jYXN0IDxhdWRpb19zZXNzaW9uX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgcmVsZWFzZUlucHV0KGlucHV0LCBzZXNzaW9uKTsKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gc3RhdGljX2Nhc3QgPGF1ZGlvX3BvcnRfaGFuZGxlX3Q+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgcmVsZWFzZUlucHV0KHBvcnRJZCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKQEAgLTE0NTYsNiArMTU0MSw1MCBAQAogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBHRVRfU1VSUk9VTkRfRk9STUFUUzogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1TdXJyb3VuZEZvcm1hdHNSZXEgPSBkYXRhLnJlYWRVaW50MzIoKTsKKyAgICAgICAgICAgIGlmIChudW1TdXJyb3VuZEZvcm1hdHNSZXEgPiBNQVhfSVRFTVNfUEVSX0xJU1QpIHsKKyAgICAgICAgICAgICAgICBudW1TdXJyb3VuZEZvcm1hdHNSZXEgPSBNQVhfSVRFTVNfUEVSX0xJU1Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBib29sIHJlcG9ydGVkID0gZGF0YS5yZWFkQm9vbCgpOworICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bVN1cnJvdW5kRm9ybWF0cyA9IG51bVN1cnJvdW5kRm9ybWF0c1JlcTsKKyAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpzdXJyb3VuZEZvcm1hdHMgPSAoYXVkaW9fZm9ybWF0X3QgKiljYWxsb2MoCisgICAgICAgICAgICAgICAgICAgIG51bVN1cnJvdW5kRm9ybWF0cywgc2l6ZW9mKGF1ZGlvX2Zvcm1hdF90KSk7CisgICAgICAgICAgICBib29sICpzdXJyb3VuZEZvcm1hdHNFbmFibGVkID0gKGJvb2wgKiljYWxsb2MobnVtU3Vycm91bmRGb3JtYXRzLCBzaXplb2YoYm9vbCkpOworICAgICAgICAgICAgaWYgKG51bVN1cnJvdW5kRm9ybWF0c1JlcSA+IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgKHN1cnJvdW5kRm9ybWF0cyA9PSBOVUxMIHx8IHN1cnJvdW5kRm9ybWF0c0VuYWJsZWQgPT0gTlVMTCkpIHsKKyAgICAgICAgICAgICAgICBmcmVlKHN1cnJvdW5kRm9ybWF0cyk7CisgICAgICAgICAgICAgICAgZnJlZShzdXJyb3VuZEZvcm1hdHNFbmFibGVkKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihOT19NRU1PUlkpOworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldFN1cnJvdW5kRm9ybWF0cygKKyAgICAgICAgICAgICAgICAgICAgJm51bVN1cnJvdW5kRm9ybWF0cywgc3Vycm91bmRGb3JtYXRzLCBzdXJyb3VuZEZvcm1hdHNFbmFibGVkLCByZXBvcnRlZCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworCisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlVWludDMyKG51bVN1cnJvdW5kRm9ybWF0cyk7CisgICAgICAgICAgICAgICAgaWYgKG51bVN1cnJvdW5kRm9ybWF0c1JlcSA+IG51bVN1cnJvdW5kRm9ybWF0cykgeworICAgICAgICAgICAgICAgICAgICBudW1TdXJyb3VuZEZvcm1hdHNSZXEgPSBudW1TdXJyb3VuZEZvcm1hdHM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZShzdXJyb3VuZEZvcm1hdHMsIG51bVN1cnJvdW5kRm9ybWF0c1JlcSAqIHNpemVvZihhdWRpb19mb3JtYXRfdCkpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZShzdXJyb3VuZEZvcm1hdHNFbmFibGVkLCBudW1TdXJyb3VuZEZvcm1hdHNSZXEgKiBzaXplb2YoYm9vbCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJlZShzdXJyb3VuZEZvcm1hdHMpOworICAgICAgICAgICAgZnJlZShzdXJyb3VuZEZvcm1hdHNFbmFibGVkKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU0VUX1NVUlJPVU5EX0ZPUk1BVF9FTkFCTEVEOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQgPSAoYXVkaW9fZm9ybWF0X3QpIGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBib29sIGVuYWJsZWQgPSBkYXRhLnJlYWRCb29sKCk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9Gb3JtYXQsIGVuYWJsZWQpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1JlY29yZC5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9SZWNvcmQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzMxYzBkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1JlY29yZC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKgotKioKLSoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jZGVmaW5lIExPR19UQUcgIklBdWRpb1JlY29yZCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotCi0jaW5jbHVkZSA8bWVkaWEvSUF1ZGlvUmVjb3JkLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotZW51bSB7Ci0gICAgVU5VU0VEX1dBU19HRVRfQ0JMSyA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCi0gICAgU1RBUlQsCi0gICAgU1RPUAotfTsKLQotY2xhc3MgQnBBdWRpb1JlY29yZCA6IHB1YmxpYyBCcEludGVyZmFjZTxJQXVkaW9SZWNvcmQ+Ci17Ci1wdWJsaWM6Ci0gICAgZXhwbGljaXQgQnBBdWRpb1JlY29yZChjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKLSAgICAgICAgOiBCcEludGVyZmFjZTxJQXVkaW9SZWNvcmQ+KGltcGwpCi0gICAgewotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoaW50IC8qQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCovIGV2ZW50LCBhdWRpb19zZXNzaW9uX3QgdHJpZ2dlclNlc3Npb24pCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9SZWNvcmQ6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihldmVudCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMih0cmlnZ2VyU2Vzc2lvbik7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTVEFSVCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVygic3RhcnQoKSBlcnJvcjogJXMiLCBzdHJlcnJvcigtc3RhdHVzKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgc3RvcCgpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9SZWNvcmQ6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTVE9QLCBkYXRhLCAmcmVwbHkpOwotICAgIH0KLQotfTsKLQotSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKEF1ZGlvUmVjb3JkLCAiYW5kcm9pZC5tZWRpYS5JQXVkaW9SZWNvcmQiKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0dXNfdCBCbkF1ZGlvUmVjb3JkOjpvblRyYW5zYWN0KAotICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCi17Ci0gICAgc3dpdGNoIChjb2RlKSB7Ci0gICAgICAgIGNhc2UgU1RBUlQ6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9SZWNvcmQsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGludCAvKkF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QqLyBldmVudCA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgdHJpZ2dlclNlc3Npb24gPSAoYXVkaW9fc2Vzc2lvbl90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhcnQoZXZlbnQsIHRyaWdnZXJTZXNzaW9uKSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RPUDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1JlY29yZCwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3RvcCgpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKLSAgICB9Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1RyYWNrLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1RyYWNrLmNwcAppbmRleCA3OWU4NjRkLi5hZGZmMDU3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9UcmFjay5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvVHJhY2suY3BwCkBAIC0yOCw2ICsyOCw4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAordXNpbmcgbWVkaWE6OlZvbHVtZVNoYXBlcjsKKwogZW51bSB7CiAgICAgR0VUX0NCTEsgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAogICAgIFNUQVJULApAQCAtMTg1LDcgKzE4Nyw3IEBACiAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICAgICAgfQogICAgICAgICBzcDxWb2x1bWVTaGFwZXI6OlN0YXRlPiBzdGF0ZSA9IG5ldyBWb2x1bWVTaGFwZXI6OlN0YXRlOwotICAgICAgICBzdGF0dXMgPSBzdGF0ZS0+cmVhZEZyb21QYXJjZWwocmVwbHkpOworICAgICAgICBzdGF0dXMgPSBzdGF0ZS0+cmVhZEZyb21QYXJjZWwoJnJlcGx5KTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgICAgIH0KQEAgLTI2MywxMiArMjY1LDEyIEBACiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWRJbnQzMigmcHJlc2VudCk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIHByZXNlbnQgIT0gMCkgewogICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gPSBuZXcgVm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gY29uZmlndXJhdGlvbi0+cmVhZEZyb21QYXJjZWwoZGF0YSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gY29uZmlndXJhdGlvbi0+cmVhZEZyb21QYXJjZWwoJmRhdGEpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3RhdHVzID0gc3RhdHVzID86IGRhdGEucmVhZEludDMyKCZwcmVzZW50KTsKICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgcHJlc2VudCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gbmV3IFZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gb3BlcmF0aW9uLT5yZWFkRnJvbVBhcmNlbChkYXRhKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBvcGVyYXRpb24tPnJlYWRGcm9tUGFyY2VsKCZkYXRhKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpYXBwbHlWb2x1bWVTaGFwZXIoY29uZmlndXJhdGlvbiwgb3BlcmF0aW9uKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L1BsYXllckJhc2UuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvUGxheWVyQmFzZS5jcHAKaW5kZXggNzg2ODMxOC4uYjBjNjhlNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvUGxheWVyQmFzZS5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvUGxheWVyQmFzZS5jcHAKQEAgLTIyLDYgKzIyLDggQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCit1c2luZyBtZWRpYTo6Vm9sdW1lU2hhcGVyOworCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBQbGF5ZXJCYXNlOjpQbGF5ZXJCYXNlKCkgOiBCblBsYXllcigpLAogICAgICAgICBtUGFuTXVsdGlwbGllckwoMS4wZiksIG1QYW5NdWx0aXBsaWVyUigxLjBmKSwKQEAgLTExNywyMyArMTE5LDI2IEBACiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBJbXBsZW1lbnRhdGlvbiBvZiBJUGxheWVyCi12b2lkIFBsYXllckJhc2U6OnN0YXJ0KCkgeworYmluZGVyOjpTdGF0dXMgUGxheWVyQmFzZTo6c3RhcnQoKSB7CiAgICAgQUxPR0QoIlBsYXllckJhc2U6OnN0YXJ0KCkgZnJvbSBJUGxheWVyIik7CiAgICAgKHZvaWQpc3RhcnRXaXRoU3RhdHVzKCk7CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOwogfQogCi12b2lkIFBsYXllckJhc2U6OnBhdXNlKCkgeworYmluZGVyOjpTdGF0dXMgUGxheWVyQmFzZTo6cGF1c2UoKSB7CiAgICAgQUxPR0QoIlBsYXllckJhc2U6OnBhdXNlKCkgZnJvbSBJUGxheWVyIik7CiAgICAgKHZvaWQpcGF1c2VXaXRoU3RhdHVzKCk7CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOwogfQogCiAKLXZvaWQgUGxheWVyQmFzZTo6c3RvcCgpIHsKK2JpbmRlcjo6U3RhdHVzIFBsYXllckJhc2U6OnN0b3AoKSB7CiAgICAgQUxPR0QoIlBsYXllckJhc2U6OnN0b3AoKSBmcm9tIElQbGF5ZXIiKTsKICAgICAodm9pZClzdG9wV2l0aFN0YXR1cygpOworICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKIH0KIAotdm9pZCBQbGF5ZXJCYXNlOjpzZXRWb2x1bWUoZmxvYXQgdm9sKSB7CitiaW5kZXI6OlN0YXR1cyBQbGF5ZXJCYXNlOjpzZXRWb2x1bWUoZmxvYXQgdm9sKSB7CiAgICAgQUxPR0QoIlBsYXllckJhc2U6OnNldFZvbHVtZSgpIGZyb20gSVBsYXllciIpOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TZXR0aW5nc0xvY2spOwpAQCAtMTQ0LDkgKzE0OSwxMCBAQAogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR1coIlBsYXllckJhc2U6OnNldFZvbHVtZSgpIGVycm9yICVkIiwgc3RhdHVzKTsKICAgICB9CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVChzdGF0dXMpOwogfQogCi12b2lkIFBsYXllckJhc2U6OnNldFBhbihmbG9hdCBwYW4pIHsKK2JpbmRlcjo6U3RhdHVzIFBsYXllckJhc2U6OnNldFBhbihmbG9hdCBwYW4pIHsKICAgICBBTE9HRCgiUGxheWVyQmFzZTo6c2V0UGFuKCkgZnJvbSBJUGxheWVyIik7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVNldHRpbmdzTG9jayk7CkBAIC0xNjMsMjIgKzE2OSwxOSBAQAogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR1coIlBsYXllckJhc2U6OnNldFBhbigpIGVycm9yICVkIiwgc3RhdHVzKTsKICAgICB9CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVChzdGF0dXMpOwogfQogCi12b2lkIFBsYXllckJhc2U6OnNldFN0YXJ0RGVsYXlNcyhpbnQzMl90IGRlbGF5TXMgX191bnVzZWQpIHsKK2JpbmRlcjo6U3RhdHVzIFBsYXllckJhc2U6OnNldFN0YXJ0RGVsYXlNcyhpbnQzMl90IGRlbGF5TXMgX191bnVzZWQpIHsKICAgICBBTE9HVygic2V0U3RhcnREZWxheSgpIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiB9CiAKLXZvaWQgUGxheWVyQmFzZTo6YXBwbHlWb2x1bWVTaGFwZXIoCi0gICAgICAgIGNvbnN0IHNwPFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4mIGNvbmZpZ3VyYXRpb24gIF9fdW51c2VkLAotICAgICAgICBjb25zdCBzcDxWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4mIG9wZXJhdGlvbiBfX3VudXNlZCkgeworYmluZGVyOjpTdGF0dXMgUGxheWVyQmFzZTo6YXBwbHlWb2x1bWVTaGFwZXIoCisgICAgICAgICAgICBjb25zdCBWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24mIGNvbmZpZ3VyYXRpb24gX191bnVzZWQsCisgICAgICAgICAgICBjb25zdCBWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbiYgb3BlcmF0aW9uIF9fdW51c2VkKSB7CiAgICAgQUxPR1coImFwcGx5Vm9sdW1lU2hhcGVyKCkgaXMgbm90IHN1cHBvcnRlZCIpOwotfQotCi1zdGF0dXNfdCBQbGF5ZXJCYXNlOjpvblRyYW5zYWN0KAotICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCi17Ci0gICAgcmV0dXJuIEJuUGxheWVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOwogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9Ub25lR2VuZXJhdG9yLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L1RvbmVHZW5lcmF0b3IuY3BwCmluZGV4IDliYzI1OTQuLjU3MTY3MjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L1RvbmVHZW5lcmF0b3IuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L1RvbmVHZW5lcmF0b3IuY3BwCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bWF0aC5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaD4KICNpbmNsdWRlICJtZWRpYS9Ub25lR2VuZXJhdG9yLmgiCiAKIApAQCAtNzQwLDYgKzc0MSwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKICAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCiAgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9KQVBBTl9SQURJT19BQ0sKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMzc1LCAud2F2ZUZyZXEgPSB7IDQwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDM3NSwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfR0JfQlVTWQorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSA0MDAsIC53YXZlRnJlcSA9IHsgNDAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMzUwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyMjUsIC53YXZlRnJlcSA9IHsgNDAwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNTI1LCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9HQl9DT05HRVNUSU9OCiAgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDQwMCwgLndhdmVGcmVxID0geyA0MDAsIDQ1MCwgMCB9LCAwLCAwIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDIwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNDAwLCAud2F2ZUZyZXEgPSB7IDQwMCwgNDUwLCAwIH0sIDAsIDAgfSwKQEAgLTc0Nyw2ICs3NjAsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKICAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCiAgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9HQl9SSU5HVE9ORQorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwgLndhdmVGcmVxID0geyA0MDAsIDQyNSwgNDUwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQVVTVFJBTElBX0RJQUwKICAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gNDAwLCAud2F2ZUZyZXEgPSB7IDQwMCwgNDUwLCAwIH0sIDAsIDAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAogICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA0MDAsIC53YXZlRnJlcSA9IHsgNDAwLCA0NTAsIDAgfSwgMCwgMCB9LApAQCAtNzcxLDYgKzc4OCw0NCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKICAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCiAgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9BVVNUUkFMSUFfQ09OR0VTVElPTgorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSA3NTAsIC53YXZlRnJlcSA9IHsgNDI1LCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNzUwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9TR19CVVNZCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDQwMCwgLndhdmVGcmVxID0geyA0MDEsIDQyNSwgNDQ5LCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA0MDAsIC53YXZlRnJlcSA9IHsgNDAxLCA0MjUsIDQ0OSwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDIwMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAgLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX1NHX1JJTkdUT05FCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDUwMCwgLndhdmVGcmVxID0geyA0ODAsIDYyMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDUwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfSEtfQlVTWQorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSA0MDAsIC53YXZlRnJlcSA9IHsgNDQwLCA0ODAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDQwMCwgLndhdmVGcmVxID0geyA0NDAsIDQ4MCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDMwMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAgLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0hLX1JJTkdUT05FCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDQwMCwgLndhdmVGcmVxID0geyA0MDAsIDQ1MCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDIwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNDAwLCAud2F2ZUZyZXEgPSB7IDQwMCwgNDUwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjAwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0lFX1JJTkdUT05FCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDE4MCwgLndhdmVGcmVxID0geyA0MjUsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDIwMCwgLndhdmVGcmVxID0geyA0MjUsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA0NTAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9JRV9DQUxMX1dBSVRJTkcKIH07CiAKIC8vIFVzZWQgYnkgVG9uZUdlbmVyYXRvcjo6Z2V0VG9uZUZvclJlZ2lvbigpIHRvIGNvbnZlcnQgdXNlciBzcGVjaWZpZWQgc3VwZXJ2aXNvcnkgdG9uZSB0eXBlCkBAIC03OTcsOSArODUyLDkgQEAKICAgICAgICAgICAgIFRPTkVfU1VQX1JJTkdUT05FICAgICAgICAgICAgLy8gVE9ORV9TVVBfUklOR1RPTkUKICAgICAgICAgfSwKICAgICAgICAgeyAgIC8vIEdCCi0gICAgICAgICAgICBUT05FX1NVUF9ESUFMLCAgICAgICAgICAgICAgIC8vIFRPTkVfU1VQX0RJQUwKLSAgICAgICAgICAgIFRPTkVfU1VQX0JVU1ksICAgICAgICAgICAgICAgLy8gVE9ORV9TVVBfQlVTWQotICAgICAgICAgICAgVE9ORV9TVVBfQ09OR0VTVElPTiwgICAgICAgICAvLyBUT05FX1NVUF9DT05HRVNUSU9OCisgICAgICAgICAgICBUT05FX0FOU0lfRElBTCwgICAgICAgICAgICAgIC8vIFRPTkVfU1VQX0RJQUwKKyAgICAgICAgICAgIFRPTkVfR0JfQlVTWSwgICAgICAgICAgICAgICAgLy8gVE9ORV9TVVBfQlVTWQorICAgICAgICAgICAgVE9ORV9HQl9DT05HRVNUSU9OLCAgICAgICAgICAvLyBUT05FX1NVUF9DT05HRVNUSU9OCiAgICAgICAgICAgICBUT05FX1NVUF9SQURJT19BQ0ssICAgICAgICAgIC8vIFRPTkVfU1VQX1JBRElPX0FDSwogICAgICAgICAgICAgVE9ORV9TVVBfUkFESU9fTk9UQVZBSUwsICAgICAvLyBUT05FX1NVUF9SQURJT19OT1RBVkFJTAogICAgICAgICAgICAgVE9ORV9TVVBfRVJST1IsICAgICAgICAgICAgICAvLyBUT05FX1NVUF9FUlJPUgpAQCAtODA3LDcgKzg2Miw3IEBACiAgICAgICAgICAgICBUT05FX0dCX1JJTkdUT05FICAgICAgICAgICAgIC8vIFRPTkVfU1VQX1JJTkdUT05FCiAgICAgICAgIH0sCiAgICAgICAgIHsgICAvLyBBVVNUUkFMSUEKLSAgICAgICAgICAgIFRPTkVfQU5TSV9ESUFMLCAgICAgICAgICAgICAvLyBUT05FX1NVUF9ESUFMCisgICAgICAgICAgICBUT05FX0FVU1RSQUxJQV9ESUFMLCAgICAgICAgLy8gVE9ORV9TVVBfRElBTAogICAgICAgICAgICAgVE9ORV9BVVNUUkFMSUFfQlVTWSwgICAgICAgIC8vIFRPTkVfU1VQX0JVU1kKICAgICAgICAgICAgIFRPTkVfQVVTVFJBTElBX0NPTkdFU1RJT04sICAvLyBUT05FX1NVUF9DT05HRVNUSU9OCiAgICAgICAgICAgICBUT05FX1NVUF9SQURJT19BQ0ssICAgICAgICAgLy8gVE9ORV9TVVBfUkFESU9fQUNLCkBAIC04MTUsNiArODcwLDM2IEBACiAgICAgICAgICAgICBUT05FX1NVUF9FUlJPUiwgICAgICAgICAgICAgLy8gVE9ORV9TVVBfRVJST1IKICAgICAgICAgICAgIFRPTkVfQVVTVFJBTElBX0NBTExfV0FJVElORywvLyBUT05FX1NVUF9DQUxMX1dBSVRJTkcKICAgICAgICAgICAgIFRPTkVfQVVTVFJBTElBX1JJTkdUT05FICAgICAvLyBUT05FX1NVUF9SSU5HVE9ORQorICAgICAgICB9LAorICAgICAgICB7ICAgLy8gU0lOR0FQT1JFCisgICAgICAgICAgICBUT05FX1NVUF9ESUFMLCAgICAgICAgICAgICAgIC8vIFRPTkVfU1VQX0RJQUwKKyAgICAgICAgICAgIFRPTkVfU0dfQlVTWSwgICAgICAgICAgICAgICAgLy8gVE9ORV9TVVBfQlVTWQorICAgICAgICAgICAgVE9ORV9TVVBfQ09OR0VTVElPTiwgICAgICAgICAvLyBUT05FX1NVUF9DT05HRVNUSU9OCisgICAgICAgICAgICBUT05FX1NVUF9SQURJT19BQ0ssICAgICAgICAgIC8vIFRPTkVfU1VQX1JBRElPX0FDSworICAgICAgICAgICAgVE9ORV9TVVBfUkFESU9fTk9UQVZBSUwsICAgICAvLyBUT05FX1NVUF9SQURJT19OT1RBVkFJTAorICAgICAgICAgICAgVE9ORV9TVVBfRVJST1IsICAgICAgICAgICAgICAvLyBUT05FX1NVUF9FUlJPUgorICAgICAgICAgICAgVE9ORV9TVVBfQ0FMTF9XQUlUSU5HLCAgICAgICAvLyBUT05FX1NVUF9DQUxMX1dBSVRJTkcKKyAgICAgICAgICAgIFRPTkVfU0dfUklOR1RPTkUgICAgICAgICAgICAgLy8gVE9ORV9TVVBfUklOR1RPTkUKKyAgICAgICAgfSwKKyAgICAgICAgeyAgIC8vIEhPTkdLT05HCisgICAgICAgICAgICBUT05FX1NVUF9ESUFMLCAgICAgICAgICAgICAgIC8vIFRPTkVfU1VQX0RJQUwKKyAgICAgICAgICAgIFRPTkVfSEtfQlVTWSwgICAgICAgICAgICAgICAgLy8gVE9ORV9TVVBfQlVTWQorICAgICAgICAgICAgVE9ORV9TVVBfQ09OR0VTVElPTiwgICAgICAgICAvLyBUT05FX1NVUF9DT05HRVNUSU9OCisgICAgICAgICAgICBUT05FX1NVUF9SQURJT19BQ0ssICAgICAgICAgIC8vIFRPTkVfU1VQX1JBRElPX0FDSworICAgICAgICAgICAgVE9ORV9TVVBfUkFESU9fTk9UQVZBSUwsICAgICAvLyBUT05FX1NVUF9SQURJT19OT1RBVkFJTAorICAgICAgICAgICAgVE9ORV9TVVBfRVJST1IsICAgICAgICAgICAgICAvLyBUT05FX1NVUF9FUlJPUgorICAgICAgICAgICAgVE9ORV9TVVBfQ0FMTF9XQUlUSU5HLCAgICAgICAvLyBUT05FX1NVUF9DQUxMX1dBSVRJTkcKKyAgICAgICAgICAgIFRPTkVfSEtfUklOR1RPTkUgICAgICAgICAgICAgLy8gVE9ORV9TVVBfUklOR1RPTkUKKyAgICAgICAgfSwKKyAgICAgICAgeyAgIC8vIElSRUxBTkQKKyAgICAgICAgICAgIFRPTkVfU1VQX0RJQUwsICAgICAgICAgICAgICAgLy8gVE9ORV9TVVBfRElBTAorICAgICAgICAgICAgVE9ORV9TVVBfQlVTWSwgICAgICAgICAgICAgICAvLyBUT05FX1NVUF9CVVNZCisgICAgICAgICAgICBUT05FX1NVUF9DT05HRVNUSU9OLCAgICAgICAgIC8vIFRPTkVfU1VQX0NPTkdFU1RJT04KKyAgICAgICAgICAgIFRPTkVfU1VQX1JBRElPX0FDSywgICAgICAgICAgLy8gVE9ORV9TVVBfUkFESU9fQUNLCisgICAgICAgICAgICBUT05FX1NVUF9SQURJT19OT1RBVkFJTCwgICAgIC8vIFRPTkVfU1VQX1JBRElPX05PVEFWQUlMCisgICAgICAgICAgICBUT05FX1NVUF9FUlJPUiwgICAgICAgICAgICAgIC8vIFRPTkVfU1VQX0VSUk9SCisgICAgICAgICAgICBUT05FX0lFX0NBTExfV0FJVElORywgICAgICAgIC8vIFRPTkVfU1VQX0NBTExfV0FJVElORworICAgICAgICAgICAgVE9ORV9JRV9SSU5HVE9ORSAgICAgICAgICAgICAvLyBUT05FX1NVUF9SSU5HVE9ORQogICAgICAgICB9CiB9OwogCkBAIC04NjQsNiArOTQ5LDEzIEBACiAgICAgaWYgKHByb3BlcnR5X2dldCgiZ3NtLm9wZXJhdG9yLmlzby1jb3VudHJ5IiwgdmFsdWUsICIiKSA9PSAwKSB7CiAgICAgICAgIHByb3BlcnR5X2dldCgiZ3NtLnNpbS5vcGVyYXRvci5pc28tY291bnRyeSIsIHZhbHVlLCAiIik7CiAgICAgfQorICAgIC8vIElmIGR1YWwgc2ltIGRldmljZSBoYXMgdHdvIFNJTSBjYXJkcyBpbnNlcnRlZCBhbmQgaXMgbm90IHJlZ2lzdGVyZCB0byBhbnkgbmV0d29yaywKKyAgICAvLyAiLCIgaXMgc2V0IHRvICJnc20ub3BlcmF0b3IuaXNvLWNvdW50cnkiIHByb3AuCisgICAgLy8gSW4gdGhpcyBjYXNlLCAiZ3NtLnNpbS5vcGVyYXRvci5pc28tY291bnRyeSIgcHJvcCBzaG91bGQgYmUgdXNlZC4KKyAgICBpZiAoc3RybGVuKHZhbHVlKSA9PSAxICYmIHN0cnN0cih2YWx1ZSwgIiwiKSAhPSBOVUxMKSB7CisgICAgICAgIHByb3BlcnR5X2dldCgiZ3NtLnNpbS5vcGVyYXRvci5pc28tY291bnRyeSIsIHZhbHVlLCAiIik7CisgICAgfQorCiAgICAgaWYgKHN0cnN0cih2YWx1ZSwgInVzIikgIT0gTlVMTCB8fAogICAgICAgICBzdHJzdHIodmFsdWUsICJjYSIpICE9IE5VTEwpIHsKICAgICAgICAgbVJlZ2lvbiA9IEFOU0k7CkBAIC04NzMsNiArOTY1LDEyIEBACiAgICAgICAgIG1SZWdpb24gPSBHQjsKICAgICB9IGVsc2UgaWYgKHN0cnN0cih2YWx1ZSwgImF1IikgIT0gTlVMTCkgewogICAgICAgICBtUmVnaW9uID0gQVVTVFJBTElBOworICAgIH0gZWxzZSBpZiAoc3Ryc3RyKHZhbHVlLCAic2ciKSAhPSBOVUxMKSB7CisgICAgICAgIG1SZWdpb24gPSBTSU5HQVBPUkU7CisgICAgfSBlbHNlIGlmIChzdHJzdHIodmFsdWUsICJoayIpICE9IE5VTEwpIHsKKyAgICAgICAgbVJlZ2lvbiA9IEhPTkdLT05HOworICAgIH0gZWxzZSBpZiAoc3Ryc3RyKHZhbHVlLCAiaWUiKSAhPSBOVUxMKSB7CisgICAgICAgIG1SZWdpb24gPSBJUkVMQU5EOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1SZWdpb24gPSBDRVBUOwogICAgIH0KQEAgLTkzMiw3ICsxMDMwLDcgQEAKICAgICBib29sIGxSZXN1bHQgPSBmYWxzZTsKICAgICBzdGF0dXNfdCBsU3RhdHVzOwogCi0gICAgaWYgKCh0b25lVHlwZSA8IDApIHx8ICh0b25lVHlwZSA+PSBOVU1fVE9ORVMpKQorICAgIGlmICh0b25lVHlwZSA+PSBOVU1fVE9ORVMpCiAgICAgICAgIHJldHVybiBsUmVzdWx0OwogCiAgICAgdG9uZVR5cGUgPSBnZXRUb25lRm9yUmVnaW9uKHRvbmVUeXBlKTsKQEAgLTk0Nyw3ICsxMDQ1LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIEFMT0dWKCJzdGFydFRvbmUiKTsKKyAgICBBTE9HVigic3RhcnRUb25lIHRvbmVUeXBlICVkIiwgdG9uZVR5cGUpOwogCiAgICAgbUxvY2subG9jaygpOwogCkBAIC0xMDk5LDkgKzExOTcsMTYgQEAKICAgICBtcEF1ZGlvVHJhY2sgPSBuZXcgQXVkaW9UcmFjaygpOwogICAgIEFMT0dWKCJBdWRpb1RyYWNrKCVwKSBjcmVhdGVkIiwgbXBBdWRpb1RyYWNrLmdldCgpKTsKIAorICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyOworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSA9IG1TdHJlYW1UeXBlOworICAgIGlmIChtU3RyZWFtVHlwZSA9PSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCkgeworICAgICAgICBzdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX0RUTUY7CisgICAgfQorICAgIHN0cmVhbV90eXBlX3RvX2F1ZGlvX2F0dHJpYnV0ZXMoc3RyZWFtVHlwZSwgJmF0dHIpOworCiAgICAgY29uc3Qgc2l6ZV90IGZyYW1lQ291bnQgPSBtUHJvY2Vzc1NpemU7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBBdWRpb1RyYWNrLT5zZXQoCi0gICAgICAgICAgICBtU3RyZWFtVHlwZSwKKyAgICAgICAgICAgIEFVRElPX1NUUkVBTV9ERUZBVUxULAogICAgICAgICAgICAgMCwgICAgLy8gc2FtcGxlUmF0ZQogICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsCiAgICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9NT05PLApAQCAtMTExMyw3ICsxMjE4LDExIEBACiAgICAgICAgICAgICAwLCAgICAvLyBzaGFyZWRCdWZmZXIKICAgICAgICAgICAgIG1UaHJlYWRDYW5DYWxsSmF2YSwKICAgICAgICAgICAgIEFVRElPX1NFU1NJT05fQUxMT0NBVEUsCi0gICAgICAgICAgICBBdWRpb1RyYWNrOjpUUkFOU0ZFUl9DQUxMQkFDSyk7CisgICAgICAgICAgICBBdWRpb1RyYWNrOjpUUkFOU0ZFUl9DQUxMQkFDSywKKyAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICBBVURJT19VSURfSU5WQUxJRCwKKyAgICAgICAgICAgIC0xLAorICAgICAgICAgICAgJmF0dHIpOwogCiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICBBTE9HRSgiQXVkaW9UcmFjayglcCkgc2V0IGZhaWxlZCB3aXRoIGVycm9yICVkIiwgbXBBdWRpb1RyYWNrLmdldCgpLCBzdGF0dXMpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvVHJhY2tQbGF5ZXJCYXNlLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L1RyYWNrUGxheWVyQmFzZS5jcHAKaW5kZXggNDhjZDgwMy4uMGE5MTRmYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvVHJhY2tQbGF5ZXJCYXNlLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9UcmFja1BsYXllckJhc2UuY3BwCkBAIC0xOCw2ICsxOCw4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAordXNpbmcgbWVkaWE6OlZvbHVtZVNoYXBlcjsKKwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogVHJhY2tQbGF5ZXJCYXNlOjpUcmFja1BsYXllckJhc2UoKSA6IFBsYXllckJhc2UoKSwKICAgICAgICAgbVBsYXllclZvbHVtZUwoMS4wZiksIG1QbGF5ZXJWb2x1bWVSKDEuMGYpCkBAIC0xMDMsMTggKzEwNSwyNCBAQAogfQogCiAKLXZvaWQgVHJhY2tQbGF5ZXJCYXNlOjphcHBseVZvbHVtZVNoYXBlcigKLSAgICAgICAgY29uc3Qgc3A8Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiYgY29uZmlndXJhdGlvbiwKLSAgICAgICAgY29uc3Qgc3A8Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+JiBvcGVyYXRpb24pIHsKK2JpbmRlcjo6U3RhdHVzIFRyYWNrUGxheWVyQmFzZTo6YXBwbHlWb2x1bWVTaGFwZXIoCisgICAgICAgIGNvbnN0IFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbiYgY29uZmlndXJhdGlvbiwKKyAgICAgICAgY29uc3QgVm9sdW1lU2hhcGVyOjpPcGVyYXRpb24mIG9wZXJhdGlvbikgeworCisgICAgc3A8Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiBzcENvbmZpZ3VyYXRpb24gPSBuZXcgVm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb24pOworICAgIHNwPFZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPiBzcE9wZXJhdGlvbiA9IG5ldyBWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbihvcGVyYXRpb24pOworCiAgICAgaWYgKG1BdWRpb1RyYWNrICE9IDApIHsKICAgICAgICAgQUxPR0QoIlRyYWNrUGxheWVyQmFzZTo6YXBwbHlWb2x1bWVTaGFwZXIoKSBmcm9tIElQbGF5ZXIiKTsKLSAgICAgICAgVm9sdW1lU2hhcGVyOjpTdGF0dXMgc3RhdHVzID0gbUF1ZGlvVHJhY2stPmFwcGx5Vm9sdW1lU2hhcGVyKGNvbmZpZ3VyYXRpb24sIG9wZXJhdGlvbik7CisgICAgICAgIFZvbHVtZVNoYXBlcjo6U3RhdHVzIHN0YXR1cyA9IG1BdWRpb1RyYWNrLT5hcHBseVZvbHVtZVNoYXBlcihzcENvbmZpZ3VyYXRpb24sIHNwT3BlcmF0aW9uKTsKICAgICAgICAgaWYgKHN0YXR1cyA8IDApIHsgLy8gYSBub24tbmVnYXRpdmUgdmFsdWUgaXMgdGhlIHZvbHVtZSBzaGFwZXIgaWQuCiAgICAgICAgICAgICBBTE9HRSgiVHJhY2tQbGF5ZXJCYXNlOjphcHBseVZvbHVtZVNoYXBlcigpIGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIHN0YXR1cyk7CiAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVChzdGF0dXMpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dEKCJUcmFja1BsYXllckJhc2U6OmFwcGx5Vm9sdW1lU2hhcGVyKCkiCi0gICAgICAgICAgICAgICAgIiBubyBBdWRpb1RyYWNrIGZvciB2b2x1bWUgY29udHJvbCBmcm9tIElQbGF5ZXIiKTsKKyAgICAgICAgICAgICAgIiBubyBBdWRpb1RyYWNrIGZvciB2b2x1bWUgY29udHJvbCBmcm9tIElQbGF5ZXIiKTsKKyAgICAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb1JlY29yZC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb1JlY29yZC5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZTBhNzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUF1ZGlvUmVjb3JkLmFpZGwKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NaWNyb3Bob25lSW5mbzsKKworLyogTmF0aXZlIGNvZGUgbXVzdCBzcGVjaWZ5IG5hbWVzcGFjZSBtZWRpYSAobWVkaWE6OklBdWRpb1JlY29yZCkgd2hlbiByZWZlcnJpbmcgdG8gdGhpcyBjbGFzcyAqLworaW50ZXJmYWNlIElBdWRpb1JlY29yZCB7CisKKyAgLyogQWZ0ZXIgaXQncyBjcmVhdGVkIHRoZSB0cmFjayBpcyBub3QgYWN0aXZlLiBDYWxsIHN0YXJ0KCkgdG8KKyAgICogbWFrZSBpdCBhY3RpdmUuCisgICAqLworICB2b2lkIHN0YXJ0KGludCAvKkF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QqLyBldmVudCwKKyAgICAgICAgICAgICBpbnQgLyphdWRpb19zZXNzaW9uX3QqLyB0cmlnZ2VyU2Vzc2lvbik7CisKKyAgLyogU3RvcCBhIHRyYWNrLiBJZiBzZXQsIHRoZSBjYWxsYmFjayB3aWxsIGNlYXNlIGJlaW5nIGNhbGxlZCBhbmQKKyAgICogb2J0YWluQnVmZmVyIHdpbGwgcmV0dXJuIGFuIGVycm9yLiBCdWZmZXJzIHRoYXQgYXJlIGFscmVhZHkgcmVsZWFzZWQKKyAgICogd2lsbCBiZSBwcm9jZXNzZWQsIHVubGVzcyBmbHVzaCgpIGlzIGNhbGxlZC4KKyAgICovCisgIHZvaWQgc3RvcCgpOworCisgIC8qIEdldCBhIGxpc3Qgb2YgY3VycmVudCBhY3RpdmUgbWljcm9waG9uZXMuCisgICAqLworICB2b2lkIGdldEFjdGl2ZU1pY3JvcGhvbmVzKG91dCBNaWNyb3Bob25lSW5mb1tdIGFjdGl2ZU1pY3JvcGhvbmVzKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JUGxheWVyLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSVBsYXllci5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MGZjZGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSVBsYXllci5haWRsCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlZvbHVtZVNoYXBlci5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQubWVkaWEuVm9sdW1lU2hhcGVyLk9wZXJhdGlvbjsKKworLyoqCisgKiBAaGlkZQorICovCitpbnRlcmZhY2UgSVBsYXllciB7CisgICAgb25ld2F5IHZvaWQgc3RhcnQoKTsKKyAgICBvbmV3YXkgdm9pZCBwYXVzZSgpOworICAgIG9uZXdheSB2b2lkIHN0b3AoKTsKKyAgICBvbmV3YXkgdm9pZCBzZXRWb2x1bWUoZmxvYXQgdm9sKTsKKyAgICBvbmV3YXkgdm9pZCBzZXRQYW4oZmxvYXQgcGFuKTsKKyAgICBvbmV3YXkgdm9pZCBzZXRTdGFydERlbGF5TXMoaW50IGRlbGF5TXMpOworICAgIG9uZXdheSB2b2lkIGFwcGx5Vm9sdW1lU2hhcGVyKGluIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBPcGVyYXRpb24gb3BlcmF0aW9uKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9NaWNyb3Bob25lSW5mby5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL01pY3JvcGhvbmVJbmZvLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZlNDZjYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9NaWNyb3Bob25lSW5mby5haWRsCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworcGFyY2VsYWJsZSBNaWNyb3Bob25lSW5mbyBjcHBfaGVhZGVyICJtZWRpYS9NaWNyb3Bob25lSW5mby5oIjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXIvQ29uZmlndXJhdGlvbi5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlci9Db25maWd1cmF0aW9uLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQwZTYwZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXIvQ29uZmlndXJhdGlvbi5haWRsCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEuVm9sdW1lU2hhcGVyOworCitwYXJjZWxhYmxlIENvbmZpZ3VyYXRpb24gY3BwX2hlYWRlciAibWVkaWEvVm9sdW1lU2hhcGVyLmgiOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlci9PcGVyYXRpb24uYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXIvT3BlcmF0aW9uLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI5MGQ5ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXIvT3BlcmF0aW9uLmFpZGwKQEAgLTAsMCArMSwxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS5Wb2x1bWVTaGFwZXI7CisKK3BhcmNlbGFibGUgT3BlcmF0aW9uIGNwcF9oZWFkZXIgIm1lZGlhL1ZvbHVtZVNoYXBlci5oIjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXIvU3RhdGUuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXIvU3RhdGUuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmEyMmI4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlci9TdGF0ZS5haWRsCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEuVm9sdW1lU2hhcGVyOworCitwYXJjZWxhYmxlIFN0YXRlIGNwcF9oZWFkZXIgIm1lZGlhL1ZvbHVtZVNoYXBlci5oIjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9DbGllbnQuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9DbGllbnQuaAppbmRleCA5ZWZkNzZkLi4yNDdhZjllIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvQ2xpZW50LmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0NsaWVudC5oCkBAIC0xOCwxOSArMTgsMzggQEAKICNpZm5kZWYgQU5EUk9JRF9BVURJT19DTElFTlRfSAogI2RlZmluZSBBTkRST0lEX0FVRElPX0NMSUVOVF9ICiAKKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIEF1ZGlvQ2xpZW50IHsKK2NsYXNzIEF1ZGlvQ2xpZW50IDogcHVibGljIFBhcmNlbGFibGUgewogIHB1YmxpYzoKICAgICBBdWRpb0NsaWVudCgpIDoKLSAgICAgICAgY2xpZW50VWlkKC0xKSwgY2xpZW50UGlkKC0xKSwgcGFja2FnZU5hbWUoIiIpIHt9CisgICAgICAgIGNsaWVudFVpZCgtMSksIGNsaWVudFBpZCgtMSksIGNsaWVudFRpZCgtMSksIHBhY2thZ2VOYW1lKCIiKSB7fQogCiAgICAgdWlkX3QgY2xpZW50VWlkOwogICAgIHBpZF90IGNsaWVudFBpZDsKKyAgICBwaWRfdCBjbGllbnRUaWQ7CiAgICAgU3RyaW5nMTYgcGFja2FnZU5hbWU7CisKKyAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgKnBhcmNlbCkgb3ZlcnJpZGUgeworICAgICAgICBjbGllbnRVaWQgPSBwYXJjZWwtPnJlYWRJbnQzMigpOworICAgICAgICBjbGllbnRQaWQgPSBwYXJjZWwtPnJlYWRJbnQzMigpOworICAgICAgICBjbGllbnRUaWQgPSBwYXJjZWwtPnJlYWRJbnQzMigpOworICAgICAgICBwYWNrYWdlTmFtZSA9IHBhcmNlbC0+cmVhZFN0cmluZzE2KCk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihjbGllbnRVaWQpOworICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIoY2xpZW50UGlkKTsKKyAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKGNsaWVudFRpZCk7CisgICAgICAgIHBhcmNlbC0+d3JpdGVTdHJpbmcxNihwYWNrYWdlTmFtZSk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb01peGVyLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvTWl4ZXIuaAppbmRleCAyYmQyZDAxLi5jZjdkOTBmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvTWl4ZXIuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvTWl4ZXIuaApAQCAtMTgsMTQgKzE4LDE3IEBACiAjaWZuZGVmIEFORFJPSURfQVVESU9fTUlYRVJfSAogI2RlZmluZSBBTkRST0lEX0FVRElPX01JWEVSX0gKIAorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CiAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb0J1ZmZlclByb3ZpZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgogI2luY2x1ZGUgPG1lZGlhL0J1ZmZlclByb3ZpZGVycy5oPgotI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CTG9nLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvTkJMb2cuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDx1dGlscy9Db21wYXQuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CkBAIC0zMyw2ICszNiw5IEBACiAvLyBGSVhNRSBUaGlzIGlzIGFjdHVhbGx5IHVuaXR5IGdhaW4sIHdoaWNoIG1pZ2h0IG5vdCBiZSBtYXggaW4gZnV0dXJlLCBleHByZXNzZWQgaW4gVS4xMgogI2RlZmluZSBNQVhfR0FJTl9JTlQgQXVkaW9NaXhlcjo6VU5JVFlfR0FJTl9JTlQKIAorLy8gVGhpcyBtdXN0IG1hdGNoIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9mbGluZ2VyL0NvbmZpZ3VyYXRpb24uaAorI2RlZmluZSBGTE9BVF9BVVgKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC00MCwyMCArNDYsMTAgQEAKIGNsYXNzIEF1ZGlvTWl4ZXIKIHsKIHB1YmxpYzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyKHNpemVfdCBmcmFtZUNvdW50LCB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4TnVtVHJhY2tzID0gTUFYX05VTV9UUkFDS1MpOwotCi0gICAgLyp2aXJ0dWFsKi8gICAgICAgICAgICAgfkF1ZGlvTWl4ZXIoKTsgIC8vIG5vbi12aXJ0dWFsIHNhdmVzIGEgdi10YWJsZSwgcmVzdG9yZSBpZiBzdWItY2xhc3NlZAotCi0KLSAgICAvLyBUaGlzIG1peGVyIGhhcyBhIGhhcmQtY29kZWQgdXBwZXIgbGltaXQgb2YgMzIgYWN0aXZlIHRyYWNrIGlucHV0cy4KLSAgICAvLyBBZGRpbmcgc3VwcG9ydCBmb3IgPiAzMiB0cmFja3Mgd291bGQgcmVxdWlyZSBtb3JlIHRoYW4gc2ltcGx5IGNoYW5naW5nIHRoaXMgdmFsdWUuCi0gICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IE1BWF9OVU1fVFJBQ0tTID0gMzI7Ci0gICAgLy8gbWF4aW11bSBudW1iZXIgb2YgY2hhbm5lbHMgc3VwcG9ydGVkIGJ5IHRoZSBtaXhlcgotCisgICAgLy8gRG8gbm90IGNoYW5nZSB0aGVzZSB1bmxlc3MgdW5kZXJseWluZyBjb2RlIGNoYW5nZXMuCiAgICAgLy8gVGhpcyBtaXhlciBoYXMgYSBoYXJkLWNvZGVkIHVwcGVyIGxpbWl0IG9mIDggY2hhbm5lbHMgZm9yIG91dHB1dC4KLSAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgTUFYX05VTV9DSEFOTkVMUyA9IDg7Ci0gICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IE1BWF9OVU1fVk9MVU1FUyA9IDI7IC8vIHN0ZXJlbyB2b2x1bWUgb25seQorICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgTUFYX05VTV9DSEFOTkVMUyA9IEZDQ184OworICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgTUFYX05VTV9WT0xVTUVTID0gRkNDXzI7IC8vIHN0ZXJlbyB2b2x1bWUgb25seQogICAgIC8vIG1heGltdW0gbnVtYmVyIG9mIGNoYW5uZWxzIHN1cHBvcnRlZCBmb3IgdGhlIGNvbnRlbnQKICAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgTUFYX05VTV9DSEFOTkVMU19UT19ET1dOTUlYID0gQVVESU9fQ0hBTk5FTF9DT1VOVF9NQVg7CiAKQEAgLTYxLDEyICs1Nyw2IEBACiAgICAgc3RhdGljIGNvbnN0IENPTlNURVhQUiBmbG9hdCBVTklUWV9HQUlOX0ZMT0FUID0gMS4wZjsKIAogICAgIGVudW0geyAvLyBuYW1lcwotCi0gICAgICAgIC8vIHRyYWNrIG5hbWVzIChNQVhfTlVNX1RSQUNLUyB1bml0cykKLSAgICAgICAgVFJBQ0swICAgICAgICAgID0gMHgxMDAwLAotCi0gICAgICAgIC8vIDB4MjAwMCBpcyB1bnVzZWQKLQogICAgICAgICAvLyBzZXRQYXJhbWV0ZXIgdGFyZ2V0cwogICAgICAgICBUUkFDSyAgICAgICAgICAgPSAweDMwMDAsCiAgICAgICAgIFJFU0FNUExFICAgICAgICA9IDB4MzAwMSwKQEAgLTEwNSwxNyArOTUsMzMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXJhbWV0ZXIgJ3ZhbHVlJyBpcyBhIHBvaW50ZXIgdG8gdGhlIG5ldyBwbGF5YmFjayByYXRlLgogICAgIH07CiAKKyAgICBBdWRpb01peGVyKHNpemVfdCBmcmFtZUNvdW50LCB1aW50MzJfdCBzYW1wbGVSYXRlKQorICAgICAgICA6IG1TYW1wbGVSYXRlKHNhbXBsZVJhdGUpCisgICAgICAgICwgbUZyYW1lQ291bnQoZnJhbWVDb3VudCkgeworICAgICAgICBwdGhyZWFkX29uY2UoJnNPbmNlQ29udHJvbCwgJnNJbml0Um91dGluZSk7CisgICAgfQogCi0gICAgLy8gRm9yIGFsbCBBUElzIHdpdGggIm5hbWUiOiBUUkFDSzAgPD0gbmFtZSA8IFRSQUNLMCArIE1BWF9OVU1fVFJBQ0tTCisgICAgLy8gQ3JlYXRlIGEgbmV3IHRyYWNrIGluIHRoZSBtaXhlci4KKyAgICAvLworICAgIC8vIFxwYXJhbSBuYW1lICAgICAgICBhIHVuaXF1ZSB1c2VyLXByb3ZpZGVkIGludGVnZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFjay4KKyAgICAvLyAgICAgICAgICAgICAgICAgICAgSWYgbmFtZSBhbHJlYWR5IGV4aXN0cywgdGhlIGZ1bmN0aW9uIHdpbGwgYWJvcnQuCisgICAgLy8gXHBhcmFtIGNoYW5uZWxNYXNrIG91dHB1dCBjaGFubmVsIG1hc2suCisgICAgLy8gXHBhcmFtIGZvcm1hdCAgICAgIFBDTSBmb3JtYXQKKyAgICAvLyBccGFyYW0gc2Vzc2lvbklkICAgU2Vzc2lvbiBpZCBmb3IgdGhlIHRyYWNrLiBUcmFja3Mgd2l0aCB0aGUgc2FtZQorICAgIC8vICAgICAgICAgICAgICAgICAgICBzZXNzaW9uIGlkIHdpbGwgYmUgc3VibWl4ZWQgdG9nZXRoZXIuCisgICAgLy8KKyAgICAvLyBccmV0dXJuIE9LICAgICAgICBvbiBzdWNjZXNzLgorICAgIC8vICAgICAgICAgQkFEX1ZBTFVFIGlmIHRoZSBmb3JtYXQgZG9lcyBub3Qgc2F0aXNmeSBpc1ZhbGlkRm9ybWF0KCkKKyAgICAvLyAgICAgICAgICAgICAgICAgICBvciB0aGUgY2hhbm5lbE1hc2sgZG9lcyBub3Qgc2F0aXNmeSBpc1ZhbGlkQ2hhbm5lbE1hc2soKS4KKyAgICBzdGF0dXNfdCAgICBjcmVhdGUoCisgICAgICAgICAgICBpbnQgbmFtZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgaW50IHNlc3Npb25JZCk7CiAKLSAgICAvLyBBbGxvY2F0ZSBhIHRyYWNrIG5hbWUuICBSZXR1cm5zIG5ldyB0cmFjayBuYW1lIGlmIHN1Y2Nlc3NmdWwsIC0xIG9uIGZhaWx1cmUuCi0gICAgLy8gVGhlIGZhaWx1cmUgY291bGQgYmUgYmVjYXVzZSBvZiBhbiBpbnZhbGlkIGNoYW5uZWxNYXNrIG9yIGZvcm1hdCwgb3IgdGhhdAotICAgIC8vIHRoZSB0cmFjayBjYXBhY2l0eSBvZiB0aGUgbWl4ZXIgaXMgZXhjZWVkZWQuCi0gICAgaW50ICAgICAgICAgZ2V0VHJhY2tOYW1lKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGludCBzZXNzaW9uSWQpOworICAgIGJvb2wgICAgICAgIGV4aXN0cyhpbnQgbmFtZSkgY29uc3QgeworICAgICAgICByZXR1cm4gbVRyYWNrcy5jb3VudChuYW1lKSA+IDA7CisgICAgfQogCi0gICAgLy8gRnJlZSBhbiBhbGxvY2F0ZWQgdHJhY2sgYnkgbmFtZQotICAgIHZvaWQgICAgICAgIGRlbGV0ZVRyYWNrTmFtZShpbnQgbmFtZSk7CisgICAgLy8gRnJlZSBhbiBhbGxvY2F0ZWQgdHJhY2sgYnkgbmFtZS4KKyAgICB2b2lkICAgICAgICBkZXN0cm95KGludCBuYW1lKTsKIAogICAgIC8vIEVuYWJsZSBvciBkaXNhYmxlIGFuIGFsbG9jYXRlZCB0cmFjayBieSBuYW1lCiAgICAgdm9pZCAgICAgICAgZW5hYmxlKGludCBuYW1lKTsKQEAgLTEyNCwxMyArMTMwLDI2IEBACiAgICAgdm9pZCAgICAgICAgc2V0UGFyYW1ldGVyKGludCBuYW1lLCBpbnQgdGFyZ2V0LCBpbnQgcGFyYW0sIHZvaWQgKnZhbHVlKTsKIAogICAgIHZvaWQgICAgICAgIHNldEJ1ZmZlclByb3ZpZGVyKGludCBuYW1lLCBBdWRpb0J1ZmZlclByb3ZpZGVyKiBidWZmZXJQcm92aWRlcik7Ci0gICAgdm9pZCAgICAgICAgcHJvY2VzcygpOwogCi0gICAgdWludDMyX3QgICAgdHJhY2tOYW1lcygpIGNvbnN0IHsgcmV0dXJuIG1UcmFja05hbWVzOyB9CisgICAgdm9pZCAgICAgICAgcHJvY2VzcygpIHsKKyAgICAgICAgKHRoaXMtPiptSG9vaykoKTsKKyAgICB9CiAKICAgICBzaXplX3QgICAgICBnZXRVbnJlbGVhc2VkRnJhbWVzKGludCBuYW1lKSBjb25zdDsKIAotICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc1ZhbGlkUGNtVHJhY2tGb3JtYXQoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7CisgICAgc3RkOjpzdHJpbmcgdHJhY2tOYW1lcygpIGNvbnN0IHsKKyAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcGFpciA6IG1UcmFja3MpIHsKKyAgICAgICAgICAgIHNzIDw8IHBhaXIuZmlyc3QgPDwgIiAiOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzcy5zdHIoKTsKKyAgICB9CisKKyAgICB2b2lkICAgICAgICBzZXROQkxvZ1dyaXRlcihOQkxvZzo6V3JpdGVyICpsb2dXcml0ZXIpIHsKKyAgICAgICAgbU5CTG9nV3JpdGVyID0gbG9nV3JpdGVyOworICAgIH0KKworICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc1ZhbGlkRm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgewogICAgICAgICBzd2l0Y2ggKGZvcm1hdCkgewogICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQ6CiAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CkBAIC0xNDMsOCArMTYyLDIzIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgaXNWYWxpZENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKSB7CisgICAgICAgIHJldHVybiBhdWRpb19jaGFubmVsX21hc2tfaXNfdmFsaWQoY2hhbm5lbE1hc2spOyAvLyB0aGUgUmVtaXhCdWZmZXJQcm92aWRlciBpcyBmbGV4aWJsZS4KKyAgICB9CisKIHByaXZhdGU6CiAKKyAgICAvKiBGb3IgbXVsdGktZm9ybWF0IGZ1bmN0aW9ucyAoY2FsbHMgdGVtcGxhdGUgZnVuY3Rpb25zCisgICAgICogaW4gQXVkaW9NaXhlck9wcy5oKS4gIFRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGFyZSBhcyBmb2xsb3dzOgorICAgICAqCisgICAgICogICBNSVhUWVBFICAgICAoc2VlIEF1ZGlvTWl4ZXJPcHMuaCBNSVhUWVBFXyogZW51bWVyYXRpb24pCisgICAgICogICBVU0VGTE9BVFZPTCAoc2V0IHRvIHRydWUgaWYgZmxvYXQgdm9sdW1lIGlzIHVzZWQpCisgICAgICogICBBREpVU1RWT0wgICAoc2V0IHRvIHRydWUgaWYgdm9sdW1lIHJhbXAgcGFyYW1ldGVycyBuZWVkcyBhZGp1c3RtZW50IGFmdGVyd2FyZHMpCisgICAgICogICBUTzogaW50MzJfdCAoUTQuMjcpIG9yIGZsb2F0CisgICAgICogICBUSTogaW50MzJfdCAoUTQuMjcpIG9yIGludDE2X3QgKFEwLjE1KSBvciBmbG9hdAorICAgICAqICAgVEE6IGludDMyX3QgKFE0LjI3KQorICAgICAqLworCiAgICAgZW51bSB7CiAgICAgICAgIC8vIEZJWE1FIHRoaXMgcmVwcmVzZW50YXRpb24gcGVybWl0cyB1cCB0byA4IGNoYW5uZWxzCiAgICAgICAgIE5FRURTX0NIQU5ORUxfQ09VTlRfX01BU0sgICA9IDB4MDAwMDAwMDcsCkBAIC0xNjEsMTQgKzE5NSw2NyBAQAogICAgICAgICBORUVEU19BVVggICAgICAgICAgICAgICAgICAgPSAweDAwMDEwMDAwLAogICAgIH07CiAKLSAgICBzdHJ1Y3Qgc3RhdGVfdDsKLSAgICBzdHJ1Y3QgdHJhY2tfdDsKKyAgICAvLyBob29rIHR5cGVzCisgICAgZW51bSB7CisgICAgICAgIFBST0NFU1NUWVBFX05PUkVTQU1QTEVPTkVUUkFDSywgLy8gb3RoZXJzIHNldCBlbHNld2hlcmUKKyAgICB9OwogCi0gICAgdHlwZWRlZiB2b2lkICgqaG9va190KSh0cmFja190KiB0LCBpbnQzMl90KiBvdXRwdXQsIHNpemVfdCBudW1PdXRGcmFtZXMsIGludDMyX3QqIHRlbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBhdXgpOwotICAgIHN0YXRpYyBjb25zdCBpbnQgQkxPQ0tTSVpFID0gMTY7IC8vIDQgY2FjaGUgbGluZXMKKyAgICBlbnVtIHsKKyAgICAgICAgVFJBQ0tUWVBFX05PUCwKKyAgICAgICAgVFJBQ0tUWVBFX1JFU0FNUExFLAorICAgICAgICBUUkFDS1RZUEVfTk9SRVNBTVBMRSwKKyAgICAgICAgVFJBQ0tUWVBFX05PUkVTQU1QTEVNT05PLAorICAgIH07CiAKLSAgICBzdHJ1Y3QgdHJhY2tfdCB7CisgICAgLy8gcHJvY2VzcyBob29rIGZ1bmN0aW9uYWxpdHkKKyAgICB1c2luZyBwcm9jZXNzX2hvb2tfdCA9IHZvaWQoQXVkaW9NaXhlcjo6KikoKTsKKworICAgIHN0cnVjdCBUcmFjazsKKyAgICB1c2luZyBob29rX3QgPSB2b2lkKFRyYWNrOjoqKShpbnQzMl90KiBvdXRwdXQsIHNpemVfdCBudW1PdXRGcmFtZXMsIGludDMyX3QqIHRlbXAsIGludDMyX3QqIGF1eCk7CisKKyAgICBzdHJ1Y3QgVHJhY2sgeworICAgICAgICBUcmFjaygpCisgICAgICAgICAgICA6IGJ1ZmZlclByb3ZpZGVyKG51bGxwdHIpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRPRE86IG1vdmUgYWRkaXRpb25hbCBpbml0aWFsaXphdGlvbiBoZXJlLgorICAgICAgICB9CisKKyAgICAgICAgflRyYWNrKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gYnVmZmVyUHJvdmlkZXIsIG1JbnB1dEJ1ZmZlclByb3ZpZGVyIG5lZWQgbm90IGJlIGRlbGV0ZWQuCisgICAgICAgICAgICBtUmVzYW1wbGVyLnJlc2V0KG51bGxwdHIpOworICAgICAgICAgICAgLy8gRW5zdXJlIHRoZSBvcmRlciBvZiBkZXN0cnVjdGlvbiBvZiBidWZmZXIgcHJvdmlkZXJzIGFzIHRoZXkKKyAgICAgICAgICAgIC8vIHJlbGVhc2UgdGhlIHVwc3RyZWFtIHByb3ZpZGVyIGluIHRoZSBkZXN0cnVjdG9yLgorICAgICAgICAgICAgbVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIucmVzZXQobnVsbHB0cik7CisgICAgICAgICAgICBtUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLnJlc2V0KG51bGxwdHIpOworICAgICAgICAgICAgbURvd25taXhlckJ1ZmZlclByb3ZpZGVyLnJlc2V0KG51bGxwdHIpOworICAgICAgICAgICAgbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIucmVzZXQobnVsbHB0cik7CisgICAgICAgIH0KKworICAgICAgICBib29sICAgICAgICBuZWVkc1JhbXAoKSB7IHJldHVybiAodm9sdW1lSW5jWzBdIHwgdm9sdW1lSW5jWzFdIHwgYXV4SW5jKSAhPSAwOyB9CisgICAgICAgIGJvb2wgICAgICAgIHNldFJlc2FtcGxlcih1aW50MzJfdCB0cmFja1NhbXBsZVJhdGUsIHVpbnQzMl90IGRldlNhbXBsZVJhdGUpOworICAgICAgICBib29sICAgICAgICBkb2VzUmVzYW1wbGUoKSBjb25zdCB7IHJldHVybiBtUmVzYW1wbGVyLmdldCgpICE9IG51bGxwdHI7IH0KKyAgICAgICAgdm9pZCAgICAgICAgcmVzZXRSZXNhbXBsZXIoKSB7IGlmIChtUmVzYW1wbGVyLmdldCgpICE9IG51bGxwdHIpIG1SZXNhbXBsZXItPnJlc2V0KCk7IH0KKyAgICAgICAgdm9pZCAgICAgICAgYWRqdXN0Vm9sdW1lUmFtcChib29sIGF1eCwgYm9vbCB1c2VGbG9hdCA9IGZhbHNlKTsKKyAgICAgICAgc2l6ZV90ICAgICAgZ2V0VW5yZWxlYXNlZEZyYW1lcygpIGNvbnN0IHsgcmV0dXJuIG1SZXNhbXBsZXIuZ2V0KCkgIT0gbnVsbHB0ciA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc2FtcGxlci0+Z2V0VW5yZWxlYXNlZEZyYW1lcygpIDogMDsgfTsKKworICAgICAgICBzdGF0dXNfdCAgICBwcmVwYXJlRm9yRG93bm1peCgpOworICAgICAgICB2b2lkICAgICAgICB1bnByZXBhcmVGb3JEb3dubWl4KCk7CisgICAgICAgIHN0YXR1c190ICAgIHByZXBhcmVGb3JSZWZvcm1hdCgpOworICAgICAgICB2b2lkICAgICAgICB1bnByZXBhcmVGb3JSZWZvcm1hdCgpOworICAgICAgICBib29sICAgICAgICBzZXRQbGF5YmFja1JhdGUoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnBsYXliYWNrUmF0ZSk7CisgICAgICAgIHZvaWQgICAgICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKCk7CisKKyAgICAgICAgc3RhdGljIGhvb2tfdCBnZXRUcmFja0hvb2soaW50IHRyYWNrVHlwZSwgdWludDMyX3QgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IG1peGVySW5Gb3JtYXQsIGF1ZGlvX2Zvcm1hdF90IG1peGVyT3V0Rm9ybWF0KTsKKworICAgICAgICB2b2lkIHRyYWNrX19ub3AoaW50MzJfdCogb3V0LCBzaXplX3QgbnVtRnJhbWVzLCBpbnQzMl90KiB0ZW1wLCBpbnQzMl90KiBhdXgpOworCisgICAgICAgIHRlbXBsYXRlIDxpbnQgTUlYVFlQRSwgYm9vbCBVU0VGTE9BVFZPTCwgYm9vbCBBREpVU1RWT0wsCisgICAgICAgICAgICB0eXBlbmFtZSBUTywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRBPgorICAgICAgICB2b2lkIHZvbHVtZU1peChUTyAqb3V0LCBzaXplX3Qgb3V0RnJhbWVzLCBjb25zdCBUSSAqaW4sIFRBICphdXgsIGJvb2wgcmFtcCk7CisKICAgICAgICAgdWludDMyX3QgICAgbmVlZHM7CiAKICAgICAgICAgLy8gVE9ETzogRXZlbnR1YWxseSByZW1vdmUgbGVnYWN5IGludGVnZXIgdm9sdW1lIHNldHRpbmdzCkBAIC0xNzgsMTYgKzI2NSwxMSBAQAogICAgICAgICB9OwogCiAgICAgICAgIGludDMyX3QgICAgIHByZXZWb2x1bWVbTUFYX05VTV9WT0xVTUVTXTsKLQotICAgICAgICAvLyAxNi1ieXRlIGJvdW5kYXJ5Ci0KICAgICAgICAgaW50MzJfdCAgICAgdm9sdW1lSW5jW01BWF9OVU1fVk9MVU1FU107CiAgICAgICAgIGludDMyX3QgICAgIGF1eEluYzsKICAgICAgICAgaW50MzJfdCAgICAgcHJldkF1eExldmVsOwotCi0gICAgICAgIC8vIDE2LWJ5dGUgYm91bmRhcnkKLQogICAgICAgICBpbnQxNl90ICAgICBhdXhMZXZlbDsgICAgICAgLy8gMCA8PSBhdXhMZXZlbCA8PSBNQVhfR0FJTl9JTlQsIGJ1dCBzaWduZWQgZm9yIG11bCBwZXJmb3JtYW5jZQorCiAgICAgICAgIHVpbnQxNl90ICAgIGZyYW1lQ291bnQ7CiAKICAgICAgICAgdWludDhfdCAgICAgY2hhbm5lbENvdW50OyAgIC8vIDEgb3IgMiwgcmVkdW5kYW50IHdpdGggKG5lZWRzICYgTkVFRFNfQ0hBTk5FTF9DT1VOVF9fTUFTSykKQEAgLTE5OSwyMiArMjgxLDE2IEBACiAgICAgICAgIC8vICBmb3IgaG93IHRoZSBUcmFjayBidWZmZXIgcHJvdmlkZXIgaXMgd3JhcHBlZCBieSBhbm90aGVyIG9uZSB3aGVuIGRvd21peGluZyBpcyByZXF1aXJlZAogICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiAgICAgICAgICAgICAgICBidWZmZXJQcm92aWRlcjsKIAotICAgICAgICAvLyAxNi1ieXRlIGJvdW5kYXJ5Ci0KICAgICAgICAgbXV0YWJsZSBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgYnVmZmVyOyAvLyA4IGJ5dGVzCiAKICAgICAgICAgaG9va190ICAgICAgaG9vazsKLSAgICAgICAgY29uc3Qgdm9pZCogaW47ICAgICAgICAgICAgIC8vIGN1cnJlbnQgbG9jYXRpb24gaW4gYnVmZmVyCisgICAgICAgIGNvbnN0IHZvaWQgICptSW47ICAgICAgICAgICAgIC8vIGN1cnJlbnQgbG9jYXRpb24gaW4gYnVmZmVyCiAKLSAgICAgICAgLy8gMTYtYnl0ZSBib3VuZGFyeQotCi0gICAgICAgIEF1ZGlvUmVzYW1wbGVyKiAgICAgcmVzYW1wbGVyOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QXVkaW9SZXNhbXBsZXI+IG1SZXNhbXBsZXI7CiAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgc2FtcGxlUmF0ZTsKICAgICAgICAgaW50MzJfdCogICAgICAgICAgIG1haW5CdWZmZXI7CiAgICAgICAgIGludDMyX3QqICAgICAgICAgICBhdXhCdWZmZXI7CiAKLSAgICAgICAgLy8gMTYtYnl0ZSBib3VuZGFyeQotCiAgICAgICAgIC8qIEJ1ZmZlciBwcm92aWRlcnMgYXJlIGNvbnN0cnVjdGVkIHRvIHRyYW5zbGF0ZSB0aGUgdHJhY2sgaW5wdXQgZGF0YSBhcyBuZWVkZWQuCiAgICAgICAgICAqCiAgICAgICAgICAqIFRPRE86IHBlcmhhcHMgbWFrZSBhIHNpbmdsZSBQbGF5YmFja0NvbnZlcnRlclByb3ZpZGVyIGNsYXNzIHRvIG1vdmUKQEAgLTIyNSwxNyArMzAxLDE3IEBACiAgICAgICAgICAqICAgIG1hdGNoIGVpdGhlciBtTWl4ZXJJbkZvcm1hdCBvciBtRG93bm1peFJlcXVpcmVzRm9ybWF0LCBpZiB0aGUgZG93bm1peGVyCiAgICAgICAgICAqICAgIHJlcXVpcmVzIHJlZm9ybWF0LiBGb3IgZXhhbXBsZSwgaXQgbWF5IGNvbnZlcnQgZmxvYXRpbmcgcG9pbnQgaW5wdXQgdG8KICAgICAgICAgICogICAgUENNXzE2X2JpdCBpZiB0aGF0J3MgcmVxdWlyZWQgYnkgdGhlIGRvd25taXhlci4KLSAgICAgICAgICogMykgZG93bm1peGVyQnVmZmVyUHJvdmlkZXI6IElmIG5vdCBOVUxMLCBwZXJmb3JtcyB0aGUgY2hhbm5lbCByZW1peGluZyB0byBtYXRjaAorICAgICAgICAgKiAzKSBtRG93bm1peGVyQnVmZmVyUHJvdmlkZXI6IElmIG5vdCBOVUxMLCBwZXJmb3JtcyB0aGUgY2hhbm5lbCByZW1peGluZyB0byBtYXRjaAogICAgICAgICAgKiAgICB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIHJlcXVpcmVkIGJ5IHRoZSBtaXhlciBzaW5rLgogICAgICAgICAgKiA0KSBtUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOiBJZiBub3QgTlVMTCwgcGVyZm9ybXMgcmVmb3JtYXR0aW5nIGZyb20KICAgICAgICAgICogICAgdGhlIGRvd25taXhlciByZXF1aXJlbWVudHMgdG8gdGhlIG1peGVyIGVuZ2luZSBpbnB1dCByZXF1aXJlbWVudHMuCiAgICAgICAgICAqIDUpIG1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyOiBBZGRzIHRpbWVzdHJldGNoaW5nIGZvciBwbGF5YmFjayByYXRlCiAgICAgICAgICAqLwogICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiAgICAgbUlucHV0QnVmZmVyUHJvdmlkZXI7ICAgIC8vIGV4dGVybmFsbHkgcHJvdmlkZWQgYnVmZmVyIHByb3ZpZGVyLgotICAgICAgICBQYXNzdGhydUJ1ZmZlclByb3ZpZGVyKiAgbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXI7IC8vIHByb3ZpZGVyIHdyYXBwZXIgZm9yIHJlZm9ybWF0dGluZy4KLSAgICAgICAgUGFzc3RocnVCdWZmZXJQcm92aWRlciogIGRvd25taXhlckJ1ZmZlclByb3ZpZGVyOyAvLyB3cmFwcGVyIGZvciBjaGFubmVsIGNvbnZlcnNpb24uCi0gICAgICAgIFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXIqICBtUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOwotICAgICAgICBQYXNzdGhydUJ1ZmZlclByb3ZpZGVyKiAgbVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXI7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxQYXNzdGhydUJ1ZmZlclByb3ZpZGVyPiBtUmVmb3JtYXRCdWZmZXJQcm92aWRlcjsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXI+IG1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlcjsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXI+IG1Qb3N0RG93bm1peFJlZm9ybWF0QnVmZmVyUHJvdmlkZXI7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxQYXNzdGhydUJ1ZmZlclByb3ZpZGVyPiBtVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlcjsKIAogICAgICAgICBpbnQzMl90ICAgICBzZXNzaW9uSWQ7CiAKQEAgLTI2MCwxMjkgKzMzNiw3NCBAQAogCiAgICAgICAgIEF1ZGlvUGxheWJhY2tSYXRlICAgIG1QbGF5YmFja1JhdGU7CiAKLSAgICAgICAgYm9vbCAgICAgICAgbmVlZHNSYW1wKCkgeyByZXR1cm4gKHZvbHVtZUluY1swXSB8IHZvbHVtZUluY1sxXSB8IGF1eEluYykgIT0gMDsgfQotICAgICAgICBib29sICAgICAgICBzZXRSZXNhbXBsZXIodWludDMyX3QgdHJhY2tTYW1wbGVSYXRlLCB1aW50MzJfdCBkZXZTYW1wbGVSYXRlKTsKLSAgICAgICAgYm9vbCAgICAgICAgZG9lc1Jlc2FtcGxlKCkgY29uc3QgeyByZXR1cm4gcmVzYW1wbGVyICE9IE5VTEw7IH0KLSAgICAgICAgdm9pZCAgICAgICAgcmVzZXRSZXNhbXBsZXIoKSB7IGlmIChyZXNhbXBsZXIgIT0gTlVMTCkgcmVzYW1wbGVyLT5yZXNldCgpOyB9Ci0gICAgICAgIHZvaWQgICAgICAgIGFkanVzdFZvbHVtZVJhbXAoYm9vbCBhdXgsIGJvb2wgdXNlRmxvYXQgPSBmYWxzZSk7Ci0gICAgICAgIHNpemVfdCAgICAgIGdldFVucmVsZWFzZWRGcmFtZXMoKSBjb25zdCB7IHJldHVybiByZXNhbXBsZXIgIT0gTlVMTCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzYW1wbGVyLT5nZXRVbnJlbGVhc2VkRnJhbWVzKCkgOiAwOyB9OworICAgIHByaXZhdGU6CisgICAgICAgIC8vIGhvb2tzCisgICAgICAgIHZvaWQgdHJhY2tfX2dlbmVyaWNSZXNhbXBsZShpbnQzMl90KiBvdXQsIHNpemVfdCBudW1GcmFtZXMsIGludDMyX3QqIHRlbXAsIGludDMyX3QqIGF1eCk7CisgICAgICAgIHZvaWQgdHJhY2tfXzE2Qml0c1N0ZXJlbyhpbnQzMl90KiBvdXQsIHNpemVfdCBudW1GcmFtZXMsIGludDMyX3QqIHRlbXAsIGludDMyX3QqIGF1eCk7CisgICAgICAgIHZvaWQgdHJhY2tfXzE2Qml0c01vbm8oaW50MzJfdCogb3V0LCBzaXplX3QgbnVtRnJhbWVzLCBpbnQzMl90KiB0ZW1wLCBpbnQzMl90KiBhdXgpOwogCi0gICAgICAgIHN0YXR1c190ICAgIHByZXBhcmVGb3JEb3dubWl4KCk7Ci0gICAgICAgIHZvaWQgICAgICAgIHVucHJlcGFyZUZvckRvd25taXgoKTsKLSAgICAgICAgc3RhdHVzX3QgICAgcHJlcGFyZUZvclJlZm9ybWF0KCk7Ci0gICAgICAgIHZvaWQgICAgICAgIHVucHJlcGFyZUZvclJlZm9ybWF0KCk7Ci0gICAgICAgIGJvb2wgICAgICAgIHNldFBsYXliYWNrUmF0ZShjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcGxheWJhY2tSYXRlKTsKLSAgICAgICAgdm9pZCAgICAgICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMoKTsKKyAgICAgICAgdm9pZCB2b2x1bWVSYW1wU3RlcmVvKGludDMyX3QqIG91dCwgc2l6ZV90IGZyYW1lQ291bnQsIGludDMyX3QqIHRlbXAsIGludDMyX3QqIGF1eCk7CisgICAgICAgIHZvaWQgdm9sdW1lU3RlcmVvKGludDMyX3QqIG91dCwgc2l6ZV90IGZyYW1lQ291bnQsIGludDMyX3QqIHRlbXAsIGludDMyX3QqIGF1eCk7CisKKyAgICAgICAgLy8gbXVsdGktZm9ybWF0IHRyYWNrIGhvb2tzCisgICAgICAgIHRlbXBsYXRlIDxpbnQgTUlYVFlQRSwgdHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUQT4KKyAgICAgICAgdm9pZCB0cmFja19fUmVzYW1wbGUoVE8qIG91dCwgc2l6ZV90IGZyYW1lQ291bnQsIFRPKiB0ZW1wIF9fdW51c2VkLCBUQSogYXV4KTsKKyAgICAgICAgdGVtcGxhdGUgPGludCBNSVhUWVBFLCB0eXBlbmFtZSBUTywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRBPgorICAgICAgICB2b2lkIHRyYWNrX19Ob1Jlc2FtcGxlKFRPKiBvdXQsIHNpemVfdCBmcmFtZUNvdW50LCBUTyogdGVtcCBfX3VudXNlZCwgVEEqIGF1eCk7CiAgICAgfTsKIAotICAgIHR5cGVkZWYgdm9pZCAoKnByb2Nlc3NfaG9va190KShzdGF0ZV90KiBzdGF0ZSk7Ci0KLSAgICAvLyBwYWQgdG8gMzItYnl0ZXMgdG8gZmlsbCBjYWNoZSBsaW5lCi0gICAgc3RydWN0IHN0YXRlX3QgewotICAgICAgICB1aW50MzJfdCAgICAgICAgZW5hYmxlZFRyYWNrczsKLSAgICAgICAgdWludDMyX3QgICAgICAgIG5lZWRzQ2hhbmdlZDsKLSAgICAgICAgc2l6ZV90ICAgICAgICAgIGZyYW1lQ291bnQ7Ci0gICAgICAgIHByb2Nlc3NfaG9va190ICBob29rOyAgIC8vIG9uZSBvZiBwcm9jZXNzX18qLCBuZXZlciBOVUxMCi0gICAgICAgIGludDMyX3QgICAgICAgICAqb3V0cHV0VGVtcDsKLSAgICAgICAgaW50MzJfdCAgICAgICAgICpyZXNhbXBsZVRlbXA7Ci0gICAgICAgIE5CTG9nOjpXcml0ZXIqICBtTkJMb2dXcml0ZXI7ICAgLy8gYXNzb2NpYXRlZCBOQkxvZzo6V3JpdGVyIG9yICZtRHVtbXlMb2cKLSAgICAgICAgaW50MzJfdCAgICAgICAgIHJlc2VydmVkWzFdOwotICAgICAgICAvLyBGSVhNRSBhbGxvY2F0ZSBkeW5hbWljYWxseSB0byBzYXZlIHNvbWUgbWVtb3J5IHdoZW4gbWF4TnVtVHJhY2tzIDwgTUFYX05VTV9UUkFDS1MKLSAgICAgICAgdHJhY2tfdCAgICAgICAgIHRyYWNrc1tNQVhfTlVNX1RSQUNLU10gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgzMikpKTsKLSAgICB9OwotCi0gICAgLy8gYml0bWFzayBvZiBhbGxvY2F0ZWQgdHJhY2sgbmFtZXMsIHdoZXJlIGJpdCAwIGNvcnJlc3BvbmRzIHRvIFRSQUNLMCBldGMuCi0gICAgdWludDMyX3QgICAgICAgIG1UcmFja05hbWVzOwotCi0gICAgLy8gYml0bWFzayBvZiBjb25maWd1cmVkIHRyYWNrIG5hbWVzOyB+MCBpZiBtYXhOdW1UcmFja3MgPT0gTUFYX05VTV9UUkFDS1MsCi0gICAgLy8gYnV0IHdpbGwgaGF2ZSBmZXdlciBiaXRzIHNldCBpZiBtYXhOdW1UcmFja3MgPCBNQVhfTlVNX1RSQUNLUwotICAgIGNvbnN0IHVpbnQzMl90ICBtQ29uZmlndXJlZE5hbWVzOwotCi0gICAgY29uc3QgdWludDMyX3QgIG1TYW1wbGVSYXRlOwotCi0gICAgTkJMb2c6OldyaXRlciAgIG1EdW1teUxvZ1dyaXRlcjsKLXB1YmxpYzoKLSAgICAvLyBDYWxsZWQgYnkgRmFzdE1peGVyIHRvIGluZm9ybSBBdWRpb01peGVyIG9mIGl0J3MgYXNzb2NpYXRlZCBOQkxvZzo6V3JpdGVyLgotICAgIC8vIEZJWE1FIEl0IHdvdWxkIGJlIHNhZmVyIHRvIHVzZSBUTFMgZm9yIHRoaXMsIHNvIHdlIGRvbid0IGFjY2lkZW50YWxseSB1c2Ugd3Jvbmcgb25lLgotICAgIHZvaWQgICAgICAgICAgICBzZXROQkxvZ1dyaXRlcihOQkxvZzo6V3JpdGVyKiBsb2cpOwotcHJpdmF0ZToKLSAgICBzdGF0ZV90ICAgICAgICAgbVN0YXRlIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMzIpKSk7Ci0KLSAgICAvLyBDYWxsIGFmdGVyIGNoYW5naW5nIGVpdGhlciB0aGUgZW5hYmxlZCBzdGF0dXMgb2YgYSB0cmFjaywgb3IgcGFyYW1ldGVycyBvZiBhbiBlbmFibGVkIHRyYWNrLgotICAgIC8vIE9LIHRvIGNhbGwgbW9yZSBvZnRlbiB0aGFuIHRoYXQsIGJ1dCB1bm5lY2Vzc2FyeS4KLSAgICB2b2lkIGludmFsaWRhdGVTdGF0ZSh1aW50MzJfdCBtYXNrKTsKKyAgICAvLyBUT0RPOiByZW1vdmUgQkxPQ0tTSVpFIHVuaXQgb2YgcHJvY2Vzc2luZyAtIGl0IGlzbid0IG5lZWRlZCBhbnltb3JlLgorICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IEJMT0NLU0laRSA9IDE2OwogCiAgICAgYm9vbCBzZXRDaGFubmVsTWFza3MoaW50IG5hbWUsCiAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCB0cmFja0NoYW5uZWxNYXNrLCBhdWRpb19jaGFubmVsX21hc2tfdCBtaXhlckNoYW5uZWxNYXNrKTsKIAotICAgIHN0YXRpYyB2b2lkIHRyYWNrX19nZW5lcmljUmVzYW1wbGUodHJhY2tfdCogdCwgaW50MzJfdCogb3V0LCBzaXplX3QgbnVtRnJhbWVzLCBpbnQzMl90KiB0ZW1wLAotICAgICAgICAgICAgaW50MzJfdCogYXV4KTsKLSAgICBzdGF0aWMgdm9pZCB0cmFja19fbm9wKHRyYWNrX3QqIHQsIGludDMyX3QqIG91dCwgc2l6ZV90IG51bUZyYW1lcywgaW50MzJfdCogdGVtcCwgaW50MzJfdCogYXV4KTsKLSAgICBzdGF0aWMgdm9pZCB0cmFja19fMTZCaXRzU3RlcmVvKHRyYWNrX3QqIHQsIGludDMyX3QqIG91dCwgc2l6ZV90IG51bUZyYW1lcywgaW50MzJfdCogdGVtcCwKLSAgICAgICAgICAgIGludDMyX3QqIGF1eCk7Ci0gICAgc3RhdGljIHZvaWQgdHJhY2tfXzE2Qml0c01vbm8odHJhY2tfdCogdCwgaW50MzJfdCogb3V0LCBzaXplX3QgbnVtRnJhbWVzLCBpbnQzMl90KiB0ZW1wLAotICAgICAgICAgICAgaW50MzJfdCogYXV4KTsKLSAgICBzdGF0aWMgdm9pZCB2b2x1bWVSYW1wU3RlcmVvKHRyYWNrX3QqIHQsIGludDMyX3QqIG91dCwgc2l6ZV90IGZyYW1lQ291bnQsIGludDMyX3QqIHRlbXAsCi0gICAgICAgICAgICBpbnQzMl90KiBhdXgpOwotICAgIHN0YXRpYyB2b2lkIHZvbHVtZVN0ZXJlbyh0cmFja190KiB0LCBpbnQzMl90KiBvdXQsIHNpemVfdCBmcmFtZUNvdW50LCBpbnQzMl90KiB0ZW1wLAotICAgICAgICAgICAgaW50MzJfdCogYXV4KTsKKyAgICAvLyBDYWxsZWQgd2hlbiB0cmFjayBpbmZvIGNoYW5nZXMgYW5kIGEgbmV3IHByb2Nlc3MgaG9vayBzaG91bGQgYmUgZGV0ZXJtaW5lZC4KKyAgICB2b2lkIGludmFsaWRhdGUoKSB7CisgICAgICAgIG1Ib29rID0gJkF1ZGlvTWl4ZXI6OnByb2Nlc3NfX3ZhbGlkYXRlOworICAgIH0KIAotICAgIHN0YXRpYyB2b2lkIHByb2Nlc3NfX3ZhbGlkYXRlKHN0YXRlX3QqIHN0YXRlKTsKLSAgICBzdGF0aWMgdm9pZCBwcm9jZXNzX19ub3Aoc3RhdGVfdCogc3RhdGUpOwotICAgIHN0YXRpYyB2b2lkIHByb2Nlc3NfX2dlbmVyaWNOb1Jlc2FtcGxpbmcoc3RhdGVfdCogc3RhdGUpOwotICAgIHN0YXRpYyB2b2lkIHByb2Nlc3NfX2dlbmVyaWNSZXNhbXBsaW5nKHN0YXRlX3QqIHN0YXRlKTsKLSAgICBzdGF0aWMgdm9pZCBwcm9jZXNzX19PbmVUcmFjazE2Qml0c1N0ZXJlb05vUmVzYW1wbGluZyhzdGF0ZV90KiBzdGF0ZSk7CisgICAgdm9pZCBwcm9jZXNzX192YWxpZGF0ZSgpOworICAgIHZvaWQgcHJvY2Vzc19fbm9wKCk7CisgICAgdm9pZCBwcm9jZXNzX19nZW5lcmljTm9SZXNhbXBsaW5nKCk7CisgICAgdm9pZCBwcm9jZXNzX19nZW5lcmljUmVzYW1wbGluZygpOworICAgIHZvaWQgcHJvY2Vzc19fb25lVHJhY2sxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxpbmcoKTsKIAotICAgIHN0YXRpYyBwdGhyZWFkX29uY2VfdCAgIHNPbmNlQ29udHJvbDsKLSAgICBzdGF0aWMgdm9pZCAgICAgICAgICAgICBzSW5pdFJvdXRpbmUoKTsKLQotICAgIC8qIG11bHRpLWZvcm1hdCB2b2x1bWUgbWl4aW5nIGZ1bmN0aW9uIChjYWxscyB0ZW1wbGF0ZSBmdW5jdGlvbnMKLSAgICAgKiBpbiBBdWRpb01peGVyT3BzLmgpLiAgVGhlIHRlbXBsYXRlIHBhcmFtZXRlcnMgYXJlIGFzIGZvbGxvd3M6Ci0gICAgICoKLSAgICAgKiAgIE1JWFRZUEUgICAgIChzZWUgQXVkaW9NaXhlck9wcy5oIE1JWFRZUEVfKiBlbnVtZXJhdGlvbikKLSAgICAgKiAgIFVTRUZMT0FUVk9MIChzZXQgdG8gdHJ1ZSBpZiBmbG9hdCB2b2x1bWUgaXMgdXNlZCkKLSAgICAgKiAgIEFESlVTVFZPTCAgIChzZXQgdG8gdHJ1ZSBpZiB2b2x1bWUgcmFtcCBwYXJhbWV0ZXJzIG5lZWRzIGFkanVzdG1lbnQgYWZ0ZXJ3YXJkcykKLSAgICAgKiAgIFRPOiBpbnQzMl90IChRNC4yNykgb3IgZmxvYXQKLSAgICAgKiAgIFRJOiBpbnQzMl90IChRNC4yNykgb3IgaW50MTZfdCAoUTAuMTUpIG9yIGZsb2F0Ci0gICAgICogICBUQTogaW50MzJfdCAoUTQuMjcpCi0gICAgICovCi0gICAgdGVtcGxhdGUgPGludCBNSVhUWVBFLCBib29sIFVTRUZMT0FUVk9MLCBib29sIEFESlVTVFZPTCwKLSAgICAgICAgdHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUQT4KLSAgICBzdGF0aWMgdm9pZCB2b2x1bWVNaXgoVE8gKm91dCwgc2l6ZV90IG91dEZyYW1lcywKLSAgICAgICAgICAgIGNvbnN0IFRJICppbiwgVEEgKmF1eCwgYm9vbCByYW1wLCBBdWRpb01peGVyOjp0cmFja190ICp0KTsKLQotICAgIC8vIG11bHRpLWZvcm1hdCBwcm9jZXNzIGhvb2tzCiAgICAgdGVtcGxhdGUgPGludCBNSVhUWVBFLCB0eXBlbmFtZSBUTywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRBPgotICAgIHN0YXRpYyB2b2lkIHByb2Nlc3NfTm9SZXNhbXBsZU9uZVRyYWNrKHN0YXRlX3QqIHN0YXRlKTsKKyAgICB2b2lkIHByb2Nlc3NfX25vUmVzYW1wbGVPbmVUcmFjaygpOwogCi0gICAgLy8gbXVsdGktZm9ybWF0IHRyYWNrIGhvb2tzCi0gICAgdGVtcGxhdGUgPGludCBNSVhUWVBFLCB0eXBlbmFtZSBUTywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRBPgotICAgIHN0YXRpYyB2b2lkIHRyYWNrX19SZXNhbXBsZSh0cmFja190KiB0LCBUTyogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwKLSAgICAgICAgICAgIFRPKiB0ZW1wIF9fdW51c2VkLCBUQSogYXV4KTsKLSAgICB0ZW1wbGF0ZSA8aW50IE1JWFRZUEUsIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVEE+Ci0gICAgc3RhdGljIHZvaWQgdHJhY2tfX05vUmVzYW1wbGUodHJhY2tfdCogdCwgVE8qIG91dCwgc2l6ZV90IGZyYW1lQ291bnQsCi0gICAgICAgICAgICBUTyogdGVtcCBfX3VudXNlZCwgVEEqIGF1eCk7CisgICAgc3RhdGljIHByb2Nlc3NfaG9va190IGdldFByb2Nlc3NIb29rKGludCBwcm9jZXNzVHlwZSwgdWludDMyX3QgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgbWl4ZXJJbkZvcm1hdCwgYXVkaW9fZm9ybWF0X3QgbWl4ZXJPdXRGb3JtYXQpOwogCiAgICAgc3RhdGljIHZvaWQgY29udmVydE1peGVyRm9ybWF0KHZvaWQgKm91dCwgYXVkaW9fZm9ybWF0X3QgbWl4ZXJPdXRGb3JtYXQsCiAgICAgICAgICAgICB2b2lkICppbiwgYXVkaW9fZm9ybWF0X3QgbWl4ZXJJbkZvcm1hdCwgc2l6ZV90IHNhbXBsZUNvdW50KTsKIAotICAgIC8vIGhvb2sgdHlwZXMKLSAgICBlbnVtIHsKLSAgICAgICAgUFJPQ0VTU1RZUEVfTk9SRVNBTVBMRU9ORVRSQUNLLAotICAgIH07Ci0gICAgZW51bSB7Ci0gICAgICAgIFRSQUNLVFlQRV9OT1AsCi0gICAgICAgIFRSQUNLVFlQRV9SRVNBTVBMRSwKLSAgICAgICAgVFJBQ0tUWVBFX05PUkVTQU1QTEUsCi0gICAgICAgIFRSQUNLVFlQRV9OT1JFU0FNUExFTU9OTywKLSAgICB9OworICAgIHN0YXRpYyB2b2lkIHNJbml0Um91dGluZSgpOwogCi0gICAgLy8gZnVuY3Rpb25zIGZvciBkZXRlcm1pbmluZyB0aGUgcHJvcGVyIHByb2Nlc3MgYW5kIHRyYWNrIGhvb2tzLgotICAgIHN0YXRpYyBwcm9jZXNzX2hvb2tfdCBnZXRQcm9jZXNzSG9vayhpbnQgcHJvY2Vzc1R5cGUsIHVpbnQzMl90IGNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IG1peGVySW5Gb3JtYXQsIGF1ZGlvX2Zvcm1hdF90IG1peGVyT3V0Rm9ybWF0KTsKLSAgICBzdGF0aWMgaG9va190IGdldFRyYWNrSG9vayhpbnQgdHJhY2tUeXBlLCB1aW50MzJfdCBjaGFubmVsQ291bnQsCi0gICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBtaXhlckluRm9ybWF0LCBhdWRpb19mb3JtYXRfdCBtaXhlck91dEZvcm1hdCk7CisgICAgLy8gaW5pdGlhbGl6YXRpb24gY29uc3RhbnRzCisgICAgY29uc3QgdWludDMyX3QgbVNhbXBsZVJhdGU7CisgICAgY29uc3Qgc2l6ZV90IG1GcmFtZUNvdW50OworCisgICAgTkJMb2c6OldyaXRlciAqbU5CTG9nV3JpdGVyID0gbnVsbHB0cjsgICAvLyBhc3NvY2lhdGVkIE5CTG9nOjpXcml0ZXIKKworICAgIHByb2Nlc3NfaG9va190IG1Ib29rID0gJkF1ZGlvTWl4ZXI6OnByb2Nlc3NfX25vcDsgICAvLyBvbmUgb2YgcHJvY2Vzc19fKiwgbmV2ZXIgbnVsbHB0cgorCisgICAgLy8gdGhlIHNpemUgb2YgdGhlIHR5cGUgKGludDMyX3QpIHNob3VsZCBiZSB0aGUgbGFyZ2VzdCBvZiBhbGwgdHlwZXMgc3VwcG9ydGVkCisgICAgLy8gYnkgdGhlIG1peGVyLgorICAgIHN0ZDo6dW5pcXVlX3B0cjxpbnQzMl90W10+IG1PdXRwdXRUZW1wOworICAgIHN0ZDo6dW5pcXVlX3B0cjxpbnQzMl90W10+IG1SZXNhbXBsZVRlbXA7CisKKyAgICAvLyB0cmFjayBuYW1lcyBncm91cGVkIGJ5IG1haW4gYnVmZmVyLCBpbiBubyBwYXJ0aWN1bGFyIG9yZGVyIG9mIG1haW4gYnVmZmVyLgorICAgIC8vIGhvd2V2ZXIgbmFtZXMgZm9yIGEgcGFydGljdWxhciBtYWluIGJ1ZmZlciBhcmUgaW4gb3JkZXIgKGJ5IGNvbnN0cnVjdGlvbikuCisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHZvaWQgKiAvKiBtYWluQnVmZmVyICovLCBzdGQ6OnZlY3RvcjxpbnQgLyogbmFtZSAqLz4+IG1Hcm91cHM7CisKKyAgICAvLyB0cmFjayBuYW1lcyB0aGF0IGFyZSBlbmFibGVkLCBpbiBpbmNyZWFzaW5nIG9yZGVyIChieSBjb25zdHJ1Y3Rpb24pLgorICAgIHN0ZDo6dmVjdG9yPGludCAvKiBuYW1lICovPiBtRW5hYmxlZDsKKworICAgIC8vIHRyYWNrIHNtYXJ0IHBvaW50ZXJzLCBieSBuYW1lLCBpbiBpbmNyZWFzaW5nIG9yZGVyIG9mIG5hbWUuCisgICAgc3RkOjptYXA8aW50IC8qIG5hbWUgKi8sIHN0ZDo6c2hhcmVkX3B0cjxUcmFjaz4+IG1UcmFja3M7CisKKyAgICBzdGF0aWMgcHRocmVhZF9vbmNlX3Qgc09uY2VDb250cm9sOyAvLyBpbml0aWFsaXplZCBpbiBjb25zdHJ1Y3RvciBieSBmaXJzdCBuZXcKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9QYXJhbWV0ZXIuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9QYXJhbWV0ZXIuaAppbmRleCAxYWNlNjA3Li45NjdkODk1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUGFyYW1ldGVyLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1BhcmFtZXRlci5oCkBAIC01OCw2ICs1OCwxMiBAQAogICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5TW9ub091dHB1dDsKICAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtleVN0cmVhbUh3QXZTeW5jOwogCisgICAgLy8gIGtleXMgZm9yIHByZXNlbnRhdGlvbiBzZWxlY3Rpb24KKyAgICAvLyAga2V5UHJlc2VudGF0aW9uSWQ6IEF1ZGlvIHByZXNlbnRhdGlvbiBpZGVudGlmaWVyCisgICAgLy8gIGtleVByb2dyYW1JZDogQXVkaW8gcHJlc2VudGF0aW9uIHByb2dyYW0gaWRlbnRpZmllcgorICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5UHJlc2VudGF0aW9uSWQ7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrZXlQcm9ncmFtSWQ7CisKICAgICAvLyAga2V5U3RyZWFtQ29ubmVjdCAvIERpc2Nvbm5lY3Q6IHZhbHVlIGlzIGFuIGludCBpbiBhdWRpb19kZXZpY2VzX3QKICAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtleVN0cmVhbUNvbm5lY3Q7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrZXlTdHJlYW1EaXNjb25uZWN0OwpAQCAtNzUsNiArODEsMTEgQEAKIAogICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmFsdWVMaXN0U2VwYXJhdG9yOwogCisgICAgLy8ga2V5UmVjb25maWdBMmRwOiBBc2sgSHdNb2R1bGUgdG8gcmVjb25maWd1cmUgQTJEUCBvZmZsb2FkZWQgY29kZWMKKyAgICAvLyBrZXlSZWNvbmZpZ0EyZHBTdXBwb3J0ZWQ6IFF1ZXJ5IGlmIEh3TW9kdWxlIHN1cHBvcnRzIEEyRFAgb2ZmbG9hZCBjb2RlYyBjb25maWcKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtleVJlY29uZmlnQTJkcDsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtleVJlY29uZmlnQTJkcFN1cHBvcnRlZDsKKwogICAgIFN0cmluZzggdG9TdHJpbmcoKSBjb25zdCB7IHJldHVybiB0b1N0cmluZ0ltcGwodHJ1ZSk7IH0KICAgICBTdHJpbmc4IGtleXNUb1N0cmluZygpIGNvbnN0IHsgcmV0dXJuIHRvU3RyaW5nSW1wbChmYWxzZSk7IH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oCmluZGV4IGRkNzIxNzAuLmNmNDQ2YTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9SZWNvcmQuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUmVjb3JkLmgKQEAgLTE3LDEyICsxNywxOCBAQAogI2lmbmRlZiBBTkRST0lEX0FVRElPUkVDT1JEX0gKICNkZWZpbmUgQU5EUk9JRF9BVURJT1JFQ09SRF9ICiAKKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgogI2luY2x1ZGUgPGN1dGlscy9zY2hlZF9wb2xpY3kuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVGltZXN0YW1wLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSUF1ZGlvUmVjb3JkLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFBbmFseXRpY3NJdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvTW9kdWxvLmg+CisjaW5jbHVkZSA8bWVkaWEvTWljcm9waG9uZUluZm8uaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImFuZHJvaWQvbWVkaWEvSUF1ZGlvUmVjb3JkLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMTgyLDcgKzE4OCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fSU5QVVRfRkxBR19OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkID0gQVVESU9fVUlEX0lOVkFMSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQgPSAtMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMgPSBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CiAKICAgICAvKiBUZXJtaW5hdGVzIHRoZSBBdWRpb1JlY29yZCBhbmQgdW5yZWdpc3RlcnMgaXQgZnJvbSBBdWRpb0ZsaW5nZXIuCiAgICAgICogQWxzbyBkZXN0cm95cyBhbGwgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgQXVkaW9SZWNvcmQuCkBAIC0yMjAsNyArMjI3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fSU5QVVRfRkxBR19OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCA9IEFVRElPX1VJRF9JTlZBTElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCA9IC0xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMgPSBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKIAogICAgIC8qIFJlc3VsdCBvZiBjb25zdHJ1Y3RpbmcgdGhlIEF1ZGlvUmVjb3JkLiBUaGlzIG11c3QgYmUgY2hlY2tlZCBmb3Igc3VjY2Vzc2Z1bCBpbml0aWFsaXphdGlvbgogICAgICAqIGJlZm9yZSB1c2luZyBhbnkgQXVkaW9SZWNvcmQgQVBJIChleGNlcHQgZm9yIHNldCgpKSwgYmVjYXVzZSB1c2luZwpAQCAtMjUwLDYgKzI1OCwxMSBAQAogICAgICAqLwogICAgICAgICAgICAgdWludDMyX3QgICAgZ2V0Tm90aWZpY2F0aW9uUGVyaW9kSW5GcmFtZXMoKSBjb25zdCB7IHJldHVybiBtTm90aWZpY2F0aW9uRnJhbWVzQWN0OyB9CiAKKyAgICAvKgorICAgICAqIHJldHVybiBtZXRyaWNzIGluZm9ybWF0aW9uIGZvciB0aGUgY3VycmVudCBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICAgICAgICAgIHN0YXR1c190IGdldE1ldHJpY3MoTWVkaWFBbmFseXRpY3NJdGVtICogJml0ZW0pOworCiAgICAgLyogQWZ0ZXIgaXQncyBjcmVhdGVkIHRoZSB0cmFjayBpcyBub3QgYWN0aXZlLiBDYWxsIHN0YXJ0KCkgdG8KICAgICAgKiBtYWtlIGl0IGFjdGl2ZS4gSWYgc2V0LCB0aGUgY2FsbGJhY2sgd2lsbCBzdGFydCBiZWluZyBjYWxsZWQuCiAgICAgICogSWYgZXZlbnQgaXMgbm90IEF1ZGlvU3lzdGVtOjpTWU5DX0VWRU5UX05PTkUsIHRoZSBjYXB0dXJlIHN0YXJ0IHdpbGwgYmUgZGVsYXllZCB1bnRpbApAQCAtNTE2LDYgKzUyOSwxNiBAQAogICAgIC8qIEdldCB0aGUgZmxhZ3MgKi8KICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZ2V0RmxhZ3MoKSBjb25zdCB7IEF1dG9NdXRleCBfbChtTG9jayk7IHJldHVybiBtRmxhZ3M7IH0KIAorICAgIC8qIEdldCBhY3RpdmUgbWljcm9waG9uZXMuIEEgZW1wdHkgdmVjdG9yIG9mIE1pY3JvcGhvbmVJbmZvIHdpbGwgYmUgcGFzc2VkIGFzIGEgcGFyYW1ldGVyLAorICAgICAqIHRoZSBkYXRhIHdpbGwgYmUgZmlsbGVkIHdoZW4gcXVlcnlpbmcgdGhlIGhhbC4KKyAgICAgKi8KKyAgICAgICAgICAgIHN0YXR1c190ICAgIGdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKTsKKworICAgIC8qCisgICAgICogRHVtcHMgdGhlIHN0YXRlIG9mIGFuIGF1ZGlvIHJlY29yZC4KKyAgICAgKi8KKyAgICAgICAgICAgIHN0YXR1c190ICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdDsKKwogcHJpdmF0ZToKICAgICAvKiBjb3B5aW5nIGF1ZGlvIHJlY29yZCBvYmplY3RzIGlzIG5vdCBhbGxvd2VkICovCiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1JlY29yZChjb25zdCBBdWRpb1JlY29yZCYgb3RoZXIpOwpAQCAtNTY1LDcgKzU4OCw3IEBACiAKICAgICAgICAgICAgIC8vIGNhbGxlciBtdXN0IGhvbGQgbG9jayBvbiBtTG9jayBmb3IgYWxsIF9sIG1ldGhvZHMKIAotICAgICAgICAgICAgc3RhdHVzX3Qgb3BlblJlY29yZF9sKGNvbnN0IE1vZHVsbzx1aW50MzJfdD4gJmVwb2NoLCBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSk7CisgICAgICAgICAgICBzdGF0dXNfdCBjcmVhdGVSZWNvcmRfbChjb25zdCBNb2R1bG88dWludDMyX3Q+ICZlcG9jaCwgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUpOwogCiAgICAgICAgICAgICAvLyBGSVhNRSBlbnVtIGlzIGZhc3RlciB0aGFuIHN0cmNtcCgpIGZvciBwYXJhbWV0ZXIgJ2Zyb20nCiAgICAgICAgICAgICBzdGF0dXNfdCByZXN0b3JlUmVjb3JkX2woY29uc3QgY2hhciAqZnJvbSk7CkBAIC02MzUsNyArNjU4LDcgQEAKIAogICAgIC8vIE5leHQgNSBmaWVsZHMgbWF5IGJlIGNoYW5nZWQgaWYgSUF1ZGlvUmVjb3JkIGlzIHJlLWNyZWF0ZWQsIGJ1dCBhbHdheXMgIT0gMAogICAgIC8vIHByb3ZpZGVkIHRoZSBpbml0aWFsIHNldCgpIHdhcyBzdWNjZXNzZnVsCi0gICAgc3A8SUF1ZGlvUmVjb3JkPiAgICAgICAgbUF1ZGlvUmVjb3JkOworICAgIHNwPG1lZGlhOjpJQXVkaW9SZWNvcmQ+IG1BdWRpb1JlY29yZDsKICAgICBzcDxJTWVtb3J5PiAgICAgICAgICAgICBtQ2Jsa01lbW9yeTsKICAgICBhdWRpb190cmFja19jYmxrX3QqICAgICBtQ2JsazsgICAgICAgICAgICAgIC8vIHJlLWxvYWQgYWZ0ZXIgbUxvY2sudW5sb2NrKCkKICAgICBzcDxJTWVtb3J5PiAgICAgICAgICAgICBtQnVmZmVyTWVtb3J5OwpAQCAtNjc3LDggKzcwMCw0MCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1heSBub3QgbWF0Y2ggdGhlIGFwcCBzZWxlY3Rpb24gZGVwZW5kaW5nIG9uIG90aGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWN0aXZpdHkgYW5kIGNvbm5lY3RlZCBkZXZpY2VzCiAgICAgd3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+IG1EZXZpY2VDYWxsYmFjazsKLSAgICBhdWRpb19wb3J0X2hhbmRsZV90ICAgIG1Qb3J0SWQ7ICAvLyB1bmlxdWUgSUQgYWxsb2NhdGVkIGJ5IGF1ZGlvIHBvbGljeQogCitwcml2YXRlOgorICAgIGNsYXNzIE1lZGlhTWV0cmljcyB7CisgICAgICBwdWJsaWM6CisgICAgICAgIE1lZGlhTWV0cmljcygpIDogbUFuYWx5dGljc0l0ZW0obmV3IE1lZGlhQW5hbHl0aWNzSXRlbSgiYXVkaW9yZWNvcmQiKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgbUNyZWF0ZWROcyhzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1JFQUxUSU1FKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0ZWROcygwKSwgbUR1cmF0aW9uTnMoMCksIG1Db3VudCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdEVycm9yKE5PX0VSUk9SKSB7CisgICAgICAgIH0KKyAgICAgICAgfk1lZGlhTWV0cmljcygpIHsKKyAgICAgICAgICAgIC8vIG1BbmFseXRpY3NJdGVtIGFsbG9jIGZhaWx1cmUgd2lsbCBiZSBmbGFnZ2VkIGluIHRoZSBjb25zdHJ1Y3RvcgorICAgICAgICAgICAgLy8gZG9uJ3QgbG9nIGVtcHR5IHJlY29yZHMKKyAgICAgICAgICAgIGlmIChtQW5hbHl0aWNzSXRlbS0+Y291bnQoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2VsZnJlY29yZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHZvaWQgZ2F0aGVyKGNvbnN0IEF1ZGlvUmVjb3JkICpyZWNvcmQpOworICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0gKmR1cCgpIHsgcmV0dXJuIG1BbmFseXRpY3NJdGVtLT5kdXAoKTsgfQorCisgICAgICAgIHZvaWQgbG9nU3RhcnQobnNlY3NfdCB3aGVuKSB7IG1TdGFydGVkTnMgPSB3aGVuOyBtQ291bnQrKzsgfQorICAgICAgICB2b2lkIGxvZ1N0b3AobnNlY3NfdCB3aGVuKSB7IG1EdXJhdGlvbk5zICs9ICh3aGVuLW1TdGFydGVkTnMpOyBtU3RhcnRlZE5zID0gMDt9CisgICAgICAgIHZvaWQgbWFya0Vycm9yKHN0YXR1c190IGVycmNvZGUsIGNvbnN0IGNoYXIgKmZ1bmMpCisgICAgICAgICAgICAgICAgIHsgbUxhc3RFcnJvciA9IGVycmNvZGU7IG1MYXN0RXJyb3JGdW5jID0gZnVuYzt9CisgICAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFBbmFseXRpY3NJdGVtPiBtQW5hbHl0aWNzSXRlbTsKKyAgICAgICAgbnNlY3NfdCBtQ3JlYXRlZE5zOyAgICAgLy8gWFhYOiBwZXJoYXBzIG5vdCB3b3J0aCBpdCBpbiBwcm9kdWN0aW9uCisgICAgICAgIG5zZWNzX3QgbVN0YXJ0ZWROczsKKyAgICAgICAgbnNlY3NfdCBtRHVyYXRpb25OczsKKyAgICAgICAgaW50MzJfdCBtQ291bnQ7CisKKyAgICAgICAgc3RhdHVzX3QgbUxhc3RFcnJvcjsKKyAgICAgICAgc3RkOjpzdHJpbmcgbUxhc3RFcnJvckZ1bmM7CisgICAgfTsKKyAgICBNZWRpYU1ldHJpY3MgbU1lZGlhTWV0cmljczsKIH07CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmgKaW5kZXggNWE4MWQ4My4uNGMwZjc5NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaApAQCAtMjMsMTEgKzIzLDEzIEBACiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Jb0Rlc2NyaXB0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9JQXVkaW9GbGluZ2VyQ2xpZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oPgorI2luY2x1ZGUgPG1lZGlhL01pY3JvcGhvbmVJbmZvLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdC5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0xMDYsNiArMTA4LDkgQEAKIAogICAgIHN0YXRpYyBmbG9hdCBsaW5lYXJUb0xvZyhpbnQgdm9sdW1lKTsKICAgICBzdGF0aWMgaW50IGxvZ1RvTGluZWFyKGZsb2F0IHZvbHVtZSk7CisgICAgc3RhdGljIHNpemVfdCBjYWxjdWxhdGVNaW5GcmFtZUNvdW50KAorICAgICAgICAgICAgdWludDMyX3QgYWZMYXRlbmN5TXMsIHVpbnQzMl90IGFmRnJhbWVDb3VudCwgdWludDMyX3QgYWZTYW1wbGVSYXRlLAorICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgZmxvYXQgc3BlZWQgLyosIHVpbnQzMl90IG5vdGlmaWNhdGlvbnNQZXJCdWZmZXJSZXEqLyk7CiAKICAgICAvLyBSZXR1cm5lZCBzYW1wbGluZ1JhdGUgYW5kIGZyYW1lQ291bnQgb3V0cHV0IHZhbHVlcyBhcmUgZ3VhcmFudGVlZAogICAgIC8vIHRvIGJlIG5vbi16ZXJvIGlmIHN0YXR1cyA9PSBOT19FUlJPUgpAQCAtMjA5LDE4ICsyMTQsMTEgQEAKICAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZyk7CiAgICAgc3RhdGljIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZ2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKTsKIAotICAgIC8vIENsaWVudCBtdXN0IHN1Y2Nlc3NmdWxseSBoYW5kIG9mZiB0aGUgaGFuZGxlIHJlZmVyZW5jZSB0byBBdWRpb0ZsaW5nZXIgdmlhIGNyZWF0ZVRyYWNrKCksCi0gICAgLy8gb3IgcmVsZWFzZSBpdCB3aXRoIHJlbGVhc2VPdXRwdXQoKS4KLSAgICBzdGF0aWMgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gQVVESU9fRk9STUFUX0RFRkFVTFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IE5VTEwpOwogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCkBAIC0yMzYsMjQgKzIzNCwyMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CiAKLSAgICAvLyBDbGllbnQgbXVzdCBzdWNjZXNzZnVsbHkgaGFuZCBvZmYgdGhlIGhhbmRsZSByZWZlcmVuY2UgdG8gQXVkaW9GbGluZ2VyIHZpYSBvcGVuUmVjb3JkKCksCisgICAgLy8gQ2xpZW50IG11c3Qgc3VjY2Vzc2Z1bGx5IGhhbmQgb2ZmIHRoZSBoYW5kbGUgcmVmZXJlbmNlIHRvIEF1ZGlvRmxpbmdlciB2aWEgY3JlYXRlUmVjb3JkKCksCiAgICAgLy8gb3IgcmVsZWFzZSBpdCB3aXRoIHJlbGVhc2VJbnB1dCgpLgogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRJbnB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKTsKIAotICAgIHN0YXRpYyBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLSAgICBzdGF0aWMgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotICAgIHN0YXRpYyB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgIHN0YXRpYyBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKnNpbGVuY2VkKTsKKyAgICBzdGF0aWMgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKKyAgICBzdGF0aWMgdm9pZCByZWxlYXNlSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogICAgIHN0YXRpYyBzdGF0dXNfdCBpbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1heCk7CkBAIC0yODYsNyArMjgzLDcgQEAKICAgICBzdGF0aWMgdWludDMyX3QgZ2V0UHJpbWFyeU91dHB1dFNhbXBsaW5nUmF0ZSgpOwogICAgIHN0YXRpYyBzaXplX3QgZ2V0UHJpbWFyeU91dHB1dEZyYW1lQ291bnQoKTsKIAotICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRMb3dSYW1EZXZpY2UoYm9vbCBpc0xvd1JhbURldmljZSk7CisgICAgc3RhdGljIHN0YXR1c190IHNldExvd1JhbURldmljZShib29sIGlzTG93UmFtRGV2aWNlLCBpbnQ2NF90IHRvdGFsTWVtb3J5KTsKIAogICAgIC8vIENoZWNrIGlmIGh3IG9mZmxvYWQgaXMgcG9zc2libGUgZm9yIGdpdmVuIGZvcm1hdCwgc3RyZWFtIHR5cGUsIHNhbXBsZSByYXRlLAogICAgIC8vIGJpdCByYXRlLCBkdXJhdGlvbiwgdmlkZW8gYW5kIHN0cmVhbWluZyBvciBvZmZsb2FkIHByb3BlcnR5IGlzIGVuYWJsZWQKQEAgLTM0MSw2ICszMzgsMTcgQEAKICAgICBzdGF0aWMgZmxvYXQgICAgZ2V0U3RyZWFtVm9sdW1lREIoCiAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4LCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKIAorICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7CisKKyAgICAvLyBudW1TdXJyb3VuZEZvcm1hdHMgaG9sZHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGZvcm1hdHMgYW5kIGJvb2wgdmFsdWUgYWxsb3dlZCBpbiB0aGUgYXJyYXkuCisgICAgLy8gV2hlbiBudW1TdXJyb3VuZEZvcm1hdHMgaXMgMCwgc3Vycm91bmRGb3JtYXRzIGFuZCBzdXJyb3VuZEZvcm1hdHNFbmFibGVkIHdpbGwgbm90IGJlCisgICAgLy8gcG9wdWxhdGVkLiBUaGUgYWN0dWFsIG51bWJlciBvZiBzdXJyb3VuZCBmb3JtYXRzIHNob3VsZCBiZSByZXR1cm5lZCBhdCBudW1TdXJyb3VuZEZvcm1hdHMuCisgICAgc3RhdGljIHN0YXR1c190IGdldFN1cnJvdW5kRm9ybWF0cyh1bnNpZ25lZCBpbnQgKm51bVN1cnJvdW5kRm9ybWF0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpzdXJyb3VuZEZvcm1hdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpzdXJyb3VuZEZvcm1hdHNFbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXBvcnRlZCk7CisgICAgc3RhdGljIHN0YXR1c190IHNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCwgYm9vbCBlbmFibGVkKTsKKwogICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogICAgIGNsYXNzIEF1ZGlvUG9ydENhbGxiYWNrIDogcHVibGljIFJlZkJhc2UKQEAgLTQzMiw2ICs0NDAsNyBAQAogCiAgICAgICAgIGludCBhZGRBdWRpb1BvcnRDYWxsYmFjayhjb25zdCBzcDxBdWRpb1BvcnRDYWxsYmFjaz4mIGNhbGxiYWNrKTsKICAgICAgICAgaW50IHJlbW92ZUF1ZGlvUG9ydENhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvUG9ydENhbGxiYWNrPiYgY2FsbGJhY2spOworICAgICAgICBib29sIGlzQXVkaW9Qb3J0Q2JFbmFibGVkKCkgY29uc3QgeyByZXR1cm4gKG1BdWRpb1BvcnRDYWxsYmFja3Muc2l6ZSgpICE9IDApOyB9CiAKICAgICAgICAgLy8gRGVhdGhSZWNpcGllbnQKICAgICAgICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyk7CkBAIC00NTAsNiArNDU5LDcgQEAKICAgICAgICAgVmVjdG9yIDxzcCA8QXVkaW9Qb3J0Q2FsbGJhY2s+ID4gICAgbUF1ZGlvUG9ydENhbGxiYWNrczsKICAgICB9OwogCisgICAgc3RhdGljIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CiAgICAgc3RhdGljIGNvbnN0IHNwPEF1ZGlvRmxpbmdlckNsaWVudD4gZ2V0QXVkaW9GbGluZ2VyQ2xpZW50KCk7CiAgICAgc3RhdGljIHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBnZXRJb0Rlc2NyaXB0b3IoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9UcmFjay5oCmluZGV4IDQ3ZDg3ZTkuLjNlYjYyN2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9UcmFjay5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9UcmFjay5oCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9UaW1lc3RhbXAuaD4KICNpbmNsdWRlIDxtZWRpYS9JQXVkaW9UcmFjay5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFBbmFseXRpY3NJdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvTW9kdWxvLmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogCkBAIC0yMTgsNiArMjE5LDggQEAKICAgICAgKiAgICAgICAgICAgICAgICAgICAgIG1heFJlcXVpcmVkU3BlZWQgcGxheWJhY2suIFZhbHVlcyBsZXNzIHRoYW4gMS4wZiBhbmQgZ3JlYXRlciB0aGFuCiAgICAgICogICAgICAgICAgICAgICAgICAgICBBVURJT19USU1FU1RSRVRDSF9TUEVFRF9NQVggd2lsbCBiZSBjbGFtcGVkLiAgRm9yIG5vbi1QQ00gdHJhY2tzCiAgICAgICogICAgICAgICAgICAgICAgICAgICBhbmQgZGlyZWN0IG9yIG9mZmxvYWRlZCB0cmFja3MsIHRoaXMgcGFyYW1ldGVyIGlzIGlnbm9yZWQuCisgICAgICogc2VsZWN0ZWREZXZpY2VJZDogICBTZWxlY3RlZCBkZXZpY2UgaWQgb2YgdGhlIGFwcCB3aGljaCBpbml0aWFsbHkgcmVxdWVzdGVkIHRoZSBBdWRpb1RyYWNrCisgICAgICogICAgICAgICAgICAgICAgICAgICB0byBvcGVuIHdpdGggYSBzcGVjaWZpYyBkZXZpY2UuCiAgICAgICogdGhyZWFkQ2FuQ2FsbEphdmE6ICBOb3QgcHJlc2VudCBpbiBwYXJhbWV0ZXIgbGlzdCwgYW5kIHNvIGlzIGZpeGVkIGF0IGZhbHNlLgogICAgICAqLwogCkBAIC0yMzcsNyArMjQwLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCA9IC0xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcyA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRvTm90UmVjb25uZWN0ID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtYXhSZXF1aXJlZFNwZWVkID0gMS4wZik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtYXhSZXF1aXJlZFNwZWVkID0gMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUpOwogCiAgICAgLyogQ3JlYXRlcyBhbiBhdWRpbyB0cmFjayBhbmQgcmVnaXN0ZXJzIGl0IHdpdGggQXVkaW9GbGluZ2VyLgogICAgICAqIFdpdGggdGhpcyBjb25zdHJ1Y3RvciwgdGhlIHRyYWNrIGlzIGNvbmZpZ3VyZWQgZm9yIHN0YXRpYyBidWZmZXIgbW9kZS4KQEAgLTMxMyw3ICszMTcsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCA9IC0xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZG9Ob3RSZWNvbm5lY3QgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtYXhSZXF1aXJlZFNwZWVkID0gMS4wZik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWF4UmVxdWlyZWRTcGVlZCA9IDEuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CiAKICAgICAvKiBSZXN1bHQgb2YgY29uc3RydWN0aW5nIHRoZSBBdWRpb1RyYWNrLiBUaGlzIG11c3QgYmUgY2hlY2tlZCBmb3Igc3VjY2Vzc2Z1bCBpbml0aWFsaXphdGlvbgogICAgICAqIGJlZm9yZSB1c2luZyBhbnkgQXVkaW9UcmFjayBBUEkgKGV4Y2VwdCBmb3Igc2V0KCkpLCBiZWNhdXNlIHVzaW5nCkBAIC0zODEsNiArMzg2LDExIEBACiAgICAgLyogUmV0dXJuIHRoZSBzdGF0aWMgYnVmZmVyIHNwZWNpZmllZCBpbiBjb25zdHJ1Y3RvciBvciBzZXQoKSwgb3IgMCBmb3Igc3RyZWFtaW5nIG1vZGUgKi8KICAgICAgICAgICAgIHNwPElNZW1vcnk+IHNoYXJlZEJ1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIG1TaGFyZWRCdWZmZXI7IH0KIAorICAgIC8qCisgICAgICogcmV0dXJuIG1ldHJpY3MgaW5mb3JtYXRpb24gZm9yIHRoZSBjdXJyZW50IHRyYWNrLgorICAgICAqLworICAgICAgICAgICAgc3RhdHVzX3QgZ2V0TWV0cmljcyhNZWRpYUFuYWx5dGljc0l0ZW0gKiAmaXRlbSk7CisKICAgICAvKiBBZnRlciBpdCdzIGNyZWF0ZWQgdGhlIHRyYWNrIGlzIG5vdCBhY3RpdmUuIENhbGwgc3RhcnQoKSB0bwogICAgICAqIG1ha2UgaXQgYWN0aXZlLiBJZiBzZXQsIHRoZSBjYWxsYmFjayB3aWxsIHN0YXJ0IGJlaW5nIGNhbGxlZC4KICAgICAgKiBJZiB0aGUgdHJhY2sgd2FzIHByZXZpb3VzbHkgcGF1c2VkLCB2b2x1bWUgaXMgcmFtcGVkIHVwIG92ZXIgdGhlIGZpcnN0IG1peCBidWZmZXIuCkBAIC03NDgsMTIgKzc1OCwxNSBAQAogICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKTsKIAogICAgIC8qIFNldHMgdGhlIHZvbHVtZSBzaGFwZXIgb2JqZWN0ICovCi0gICAgICAgICAgICBWb2x1bWVTaGFwZXI6OlN0YXR1cyBhcHBseVZvbHVtZVNoYXBlcigKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiYgY29uZmlndXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+JiBvcGVyYXRpb24pOworICAgICAgICAgICAgbWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdHVzIGFwcGx5Vm9sdW1lU2hhcGVyKAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiYgY29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPiYgb3BlcmF0aW9uKTsKIAogICAgIC8qIEdldHMgdGhlIHZvbHVtZSBzaGFwZXIgc3RhdGUgKi8KLSAgICAgICAgICAgIHNwPFZvbHVtZVNoYXBlcjo6U3RhdGU+IGdldFZvbHVtZVNoYXBlclN0YXRlKGludCBpZCk7CisgICAgICAgICAgICBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpTdGF0ZT4gZ2V0Vm9sdW1lU2hhcGVyU3RhdGUoaW50IGlkKTsKKworICAgIC8qIFNlbGVjdHMgdGhlIHByZXNlbnRhdGlvbiAoaWYgYXZhaWxhYmxlKSAqLworICAgICAgICAgICAgc3RhdHVzX3QgICAgc2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCk7CiAKICAgICAvKiBHZXQgcGFyYW1ldGVycyAqLwogICAgICAgICAgICAgU3RyaW5nOCAgICAgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKTsKQEAgLTk5MCw3ICsxMDAzLDcgQEAKICAgICBzcDxJQXVkaW9UcmFjaz4gICAgICAgICBtQXVkaW9UcmFjazsKICAgICBzcDxJTWVtb3J5PiAgICAgICAgICAgICBtQ2Jsa01lbW9yeTsKICAgICBhdWRpb190cmFja19jYmxrX3QqICAgICBtQ2JsazsgICAgICAgICAgICAgICAgICAvLyByZS1sb2FkIGFmdGVyIG1Mb2NrLnVubG9jaygpCi0gICAgYXVkaW9faW9faGFuZGxlX3QgICAgICAgbU91dHB1dDsgICAgICAgICAgICAgICAgLy8gcmV0dXJuZWQgYnkgQXVkaW9TeXN0ZW06OmdldE91dHB1dCgpCisgICAgYXVkaW9faW9faGFuZGxlX3QgICAgICAgbU91dHB1dDsgICAgICAgICAgICAgICAgLy8gcmV0dXJuZWQgYnkgQXVkaW9TeXN0ZW06OmdldE91dHB1dEZvckF0dHIoKQogCiAgICAgc3A8QXVkaW9UcmFja1RocmVhZD4gICAgbUF1ZGlvVHJhY2tUaHJlYWQ7CiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVRocmVhZENhbkNhbGxKYXZhOwpAQCAtMTE2MCw3ICsxMTczLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXkgbm90IG1hdGNoIHRoZSBhcHAgc2VsZWN0aW9uIGRlcGVuZGluZyBvbiBvdGhlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjdGl2aXR5IGFuZCBjb25uZWN0ZWQgZGV2aWNlcy4KIAotICAgIHNwPFZvbHVtZUhhbmRsZXI+ICAgICAgIG1Wb2x1bWVIYW5kbGVyOworICAgIHNwPG1lZGlhOjpWb2x1bWVIYW5kbGVyPiAgICAgICBtVm9sdW1lSGFuZGxlcjsKIAogcHJpdmF0ZToKICAgICBjbGFzcyBEZWF0aE5vdGlmaWVyIDogcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IHsKQEAgLTExNzgsNyArMTE5MSwyNSBAQAogICAgIHBpZF90ICAgICAgICAgICAgICAgICAgIG1DbGllbnRQaWQ7CiAKICAgICB3cDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4gbURldmljZUNhbGxiYWNrOwotICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgIG1Qb3J0SWQ7ICAvLyB1bmlxdWUgSUQgYWxsb2NhdGVkIGJ5IGF1ZGlvIHBvbGljeQorCitwcml2YXRlOgorICAgIGNsYXNzIE1lZGlhTWV0cmljcyB7CisgICAgICBwdWJsaWM6CisgICAgICAgIE1lZGlhTWV0cmljcygpIDogbUFuYWx5dGljc0l0ZW0obmV3IE1lZGlhQW5hbHl0aWNzSXRlbSgiYXVkaW90cmFjayIpKSB7CisgICAgICAgIH0KKyAgICAgICAgfk1lZGlhTWV0cmljcygpIHsKKyAgICAgICAgICAgIC8vIG1BbmFseXRpY3NJdGVtIGFsbG9jIGZhaWx1cmUgd2lsbCBiZSBmbGFnZ2VkIGluIHRoZSBjb25zdHJ1Y3RvcgorICAgICAgICAgICAgLy8gZG9uJ3QgbG9nIGVtcHR5IHJlY29yZHMKKyAgICAgICAgICAgIGlmIChtQW5hbHl0aWNzSXRlbS0+Y291bnQoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2VsZnJlY29yZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHZvaWQgZ2F0aGVyKGNvbnN0IEF1ZGlvVHJhY2sgKnRyYWNrKTsKKyAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtICpkdXAoKSB7IHJldHVybiBtQW5hbHl0aWNzSXRlbS0+ZHVwKCk7IH0KKyAgICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUFuYWx5dGljc0l0ZW0+IG1BbmFseXRpY3NJdGVtOworICAgIH07CisgICAgTWVkaWFNZXRyaWNzIG1NZWRpYU1ldHJpY3M7CiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb0ZsaW5nZXIuaAppbmRleCAwYWQ0MjMxLi5lNmJmNzJmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb0ZsaW5nZXIuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb0ZsaW5nZXIuaApAQCAtMjQsOCArMjQsMTAgQEAKICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0NsaWVudC5oPgogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1RyYWNrLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSUF1ZGlvUmVjb3JkLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvRmxpbmdlckNsaWVudC5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3QuaD4KQEAgLTMzLDYgKzM1LDEwIEBACiAjaW5jbHVkZSA8bWVkaWEvSUVmZmVjdC5oPgogI2luY2x1ZGUgPG1lZGlhL0lFZmZlY3RDbGllbnQuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8bWVkaWEvTWljcm9waG9uZUluZm8uaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJhbmRyb2lkL21lZGlhL0lBdWRpb1JlY29yZC5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTQzLDYgKzQ5LDI3MSBAQAogcHVibGljOgogICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoQXVkaW9GbGluZ2VyKTsKIAorICAgIC8qIENyZWF0ZVRyYWNrSW5wdXQgY29udGFpbnMgYWxsIGlucHV0IGFyZ3VtZW50cyBzZW50IGJ5IEF1ZGlvVHJhY2sgdG8gQXVkaW9GbGluZ2VyCisgICAgICogd2hlbiBjYWxsaW5nIGNyZWF0ZVRyYWNrKCkgaW5jbHVkaW5nIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgdXBkYXRlZCBieSBBdWRpb0ZsaW5nZXIKKyAgICAgKiBhbmQgcmV0dXJuZWQgaW4gQ3JlYXRlVHJhY2tPdXRwdXQgb2JqZWN0CisgICAgICovCisgICAgY2xhc3MgQ3JlYXRlVHJhY2tJbnB1dCA6IHB1YmxpYyBQYXJjZWxhYmxlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAqcGFyY2VsKSBvdmVycmlkZSB7CisgICAgICAgICAgICAvKiBpbnB1dCBhcmd1bWVudHMqLworICAgICAgICAgICAgbWVtc2V0KCZhdHRyLCAwLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CisgICAgICAgICAgICBpZiAocGFyY2VsLT5yZWFkKCZhdHRyLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdHRyLnRhZ3NbQVVESU9fQVRUUklCVVRFU19UQUdTX01BWF9TSVpFIC0xXSA9ICdcMCc7CisgICAgICAgICAgICBtZW1zZXQoJmNvbmZpZywgMCwgc2l6ZW9mKGF1ZGlvX2NvbmZpZ190KSk7CisgICAgICAgICAgICBpZiAocGFyY2VsLT5yZWFkKCZjb25maWcsIHNpemVvZihhdWRpb19jb25maWdfdCkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNsaWVudEluZm8ucmVhZEZyb21QYXJjZWwocGFyY2VsKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYXJjZWwtPnJlYWRJbnQzMigpICE9IDApIHsKKyAgICAgICAgICAgICAgICBzaGFyZWRCdWZmZXIgPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PihwYXJjZWwtPnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICAgICAgaWYgKHNoYXJlZEJ1ZmZlciA9PSAwIHx8IHNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub3RpZmljYXRpb25zUGVyQnVmZmVyID0gcGFyY2VsLT5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHNwZWVkID0gcGFyY2VsLT5yZWFkRmxvYXQoKTsKKworICAgICAgICAgICAgLyogaW5wdXQvb3V0cHV0IGFyZ3VtZW50cyovCisgICAgICAgICAgICAodm9pZClwYXJjZWwtPnJlYWQoJmZsYWdzLCBzaXplb2YoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKTsKKyAgICAgICAgICAgIGZyYW1lQ291bnQgPSBwYXJjZWwtPnJlYWRJbnQ2NCgpOworICAgICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVDb3VudCA9IHBhcmNlbC0+cmVhZEludDY0KCk7CisgICAgICAgICAgICAodm9pZClwYXJjZWwtPnJlYWQoJnNlbGVjdGVkRGV2aWNlSWQsIHNpemVvZihhdWRpb19wb3J0X2hhbmRsZV90KSk7CisgICAgICAgICAgICAodm9pZClwYXJjZWwtPnJlYWQoJnNlc3Npb25JZCwgc2l6ZW9mKGF1ZGlvX3Nlc3Npb25fdCkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgLyogaW5wdXQgYXJndW1lbnRzKi8KKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGUoJmF0dHIsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGUoJmNvbmZpZywgc2l6ZW9mKGF1ZGlvX2NvbmZpZ190KSk7CisgICAgICAgICAgICAodm9pZCljbGllbnRJbmZvLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKKyAgICAgICAgICAgIGlmIChzaGFyZWRCdWZmZXIgIT0gMCkgeworICAgICAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVJbnQzMigxKTsKKyAgICAgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKHNoYXJlZEJ1ZmZlcikpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlSW50MzIoMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlSW50MzIobm90aWZpY2F0aW9uc1BlckJ1ZmZlcik7CisgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlRmxvYXQoc3BlZWQpOworCisgICAgICAgICAgICAvKiBpbnB1dC9vdXRwdXQgYXJndW1lbnRzKi8KKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGUoJmZsYWdzLCBzaXplb2YoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKTsKKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVJbnQ2NChmcmFtZUNvdW50KTsKKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVJbnQ2NChub3RpZmljYXRpb25GcmFtZUNvdW50KTsKKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGUoJnNlbGVjdGVkRGV2aWNlSWQsIHNpemVvZihhdWRpb19wb3J0X2hhbmRsZV90KSk7CisgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlKCZzZXNzaW9uSWQsIHNpemVvZihhdWRpb19zZXNzaW9uX3QpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGlucHV0ICovCisgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyOworICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWc7CisgICAgICAgIEF1ZGlvQ2xpZW50IGNsaWVudEluZm87CisgICAgICAgIHNwPElNZW1vcnk+IHNoYXJlZEJ1ZmZlcjsKKyAgICAgICAgdWludDMyX3Qgbm90aWZpY2F0aW9uc1BlckJ1ZmZlcjsKKyAgICAgICAgZmxvYXQgc3BlZWQ7CisKKyAgICAgICAgLyogaW5wdXQvb3V0cHV0ICovCisgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzOworICAgICAgICBzaXplX3QgZnJhbWVDb3VudDsKKyAgICAgICAgc2l6ZV90IG5vdGlmaWNhdGlvbkZyYW1lQ291bnQ7CisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZDsKKyAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZDsKKyAgICB9OworCisgICAgLyogQ3JlYXRlVHJhY2tPdXRwdXQgY29udGFpbnMgYWxsIG91dHB1dCBhcmd1bWVudHMgcmV0dXJuZWQgYnkgQXVkaW9GbGluZ2VyIHRvIEF1ZGlvVHJhY2sKKyAgICAgKiB3aGVuIGNhbGxpbmcgY3JlYXRlVHJhY2soKSBpbmNsdWRpbmcgYXJndW1lbnRzIHRoYXQgd2VyZSBwYXNzZWQgYXMgSS9PIGZvciB1cGRhdGUgYnkKKyAgICAgKiBDcmVhdGVUcmFja0lucHV0LgorICAgICAqLworICAgIGNsYXNzIENyZWF0ZVRyYWNrT3V0cHV0IDogcHVibGljIFBhcmNlbGFibGUgeworICAgIHB1YmxpYzoKKyAgICAgICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICpwYXJjZWwpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgIC8qIGlucHV0L291dHB1dCBhcmd1bWVudHMqLworICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT5yZWFkKCZmbGFncywgc2l6ZW9mKGF1ZGlvX291dHB1dF9mbGFnc190KSk7CisgICAgICAgICAgICBmcmFtZUNvdW50ID0gcGFyY2VsLT5yZWFkSW50NjQoKTsKKyAgICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lQ291bnQgPSBwYXJjZWwtPnJlYWRJbnQ2NCgpOworICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT5yZWFkKCZzZWxlY3RlZERldmljZUlkLCBzaXplb2YoYXVkaW9fcG9ydF9oYW5kbGVfdCkpOworICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT5yZWFkKCZzZXNzaW9uSWQsIHNpemVvZihhdWRpb19zZXNzaW9uX3QpKTsKKworICAgICAgICAgICAgLyogb3V0cHV0IGFyZ3VtZW50cyovCisgICAgICAgICAgICBzYW1wbGVSYXRlID0gcGFyY2VsLT5yZWFkVWludDMyKCk7CisgICAgICAgICAgICBhZkZyYW1lQ291bnQgPSBwYXJjZWwtPnJlYWRJbnQ2NCgpOworICAgICAgICAgICAgYWZTYW1wbGVSYXRlID0gcGFyY2VsLT5yZWFkSW50NjQoKTsKKyAgICAgICAgICAgIGFmTGF0ZW5jeU1zID0gcGFyY2VsLT5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+cmVhZCgmb3V0cHV0SWQsIHNpemVvZihhdWRpb19pb19oYW5kbGVfdCkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgLyogaW5wdXQvb3V0cHV0IGFyZ3VtZW50cyovCisgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlKCZmbGFncywgc2l6ZW9mKGF1ZGlvX291dHB1dF9mbGFnc190KSk7CisgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlSW50NjQoZnJhbWVDb3VudCk7CisgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlSW50NjQobm90aWZpY2F0aW9uRnJhbWVDb3VudCk7CisgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlKCZzZWxlY3RlZERldmljZUlkLCBzaXplb2YoYXVkaW9fcG9ydF9oYW5kbGVfdCkpOworICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZSgmc2Vzc2lvbklkLCBzaXplb2YoYXVkaW9fc2Vzc2lvbl90KSk7CisKKyAgICAgICAgICAgIC8qIG91dHB1dCBhcmd1bWVudHMqLworICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZVVpbnQzMihzYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVJbnQ2NChhZkZyYW1lQ291bnQpOworICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZUludDY0KGFmU2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlSW50MzIoYWZMYXRlbmN5TXMpOworICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZSgmb3V0cHV0SWQsIHNpemVvZihhdWRpb19pb19oYW5kbGVfdCkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgLyogaW5wdXQvb3V0cHV0ICovCisgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzOworICAgICAgICBzaXplX3QgZnJhbWVDb3VudDsKKyAgICAgICAgc2l6ZV90IG5vdGlmaWNhdGlvbkZyYW1lQ291bnQ7CisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZDsKKyAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZDsKKworICAgICAgICAvKiBvdXRwdXQgKi8KKyAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZTsKKyAgICAgICAgc2l6ZV90ICAgYWZGcmFtZUNvdW50OworICAgICAgICB1aW50MzJfdCBhZlNhbXBsZVJhdGU7CisgICAgICAgIHVpbnQzMl90IGFmTGF0ZW5jeU1zOworICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXRJZDsKKyAgICB9OworCisgICAgLyogQ3JlYXRlUmVjb3JkSW5wdXQgY29udGFpbnMgYWxsIGlucHV0IGFyZ3VtZW50cyBzZW50IGJ5IEF1ZGlvUmVjb3JkIHRvIEF1ZGlvRmxpbmdlcgorICAgICAqIHdoZW4gY2FsbGluZyBjcmVhdGVSZWNvcmQoKSBpbmNsdWRpbmcgYXJndW1lbnRzIHRoYXQgd2lsbCBiZSB1cGRhdGVkIGJ5IEF1ZGlvRmxpbmdlcgorICAgICAqIGFuZCByZXR1cm5lZCBpbiBDcmVhdGVSZWNvcmRPdXRwdXQgb2JqZWN0CisgICAgICovCisgICAgY2xhc3MgQ3JlYXRlUmVjb3JkSW5wdXQgOiBwdWJsaWMgUGFyY2VsYWJsZSB7CisgICAgcHVibGljOgorICAgICAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgKnBhcmNlbCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgLyogaW5wdXQgYXJndW1lbnRzKi8KKyAgICAgICAgICAgIG1lbXNldCgmYXR0ciwgMCwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOworICAgICAgICAgICAgaWYgKHBhcmNlbC0+cmVhZCgmYXR0ciwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXR0ci50YWdzW0FVRElPX0FUVFJJQlVURVNfVEFHU19NQVhfU0laRSAtMV0gPSAnXDAnOworICAgICAgICAgICAgbWVtc2V0KCZjb25maWcsIDAsIHNpemVvZihhdWRpb19jb25maWdfYmFzZV90KSk7CisgICAgICAgICAgICBpZiAocGFyY2VsLT5yZWFkKCZjb25maWcsIHNpemVvZihhdWRpb19jb25maWdfYmFzZV90KSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2xpZW50SW5mby5yZWFkRnJvbVBhcmNlbChwYXJjZWwpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3BQYWNrYWdlTmFtZSA9IHBhcmNlbC0+cmVhZFN0cmluZzE2KCk7CisKKyAgICAgICAgICAgIC8qIGlucHV0L291dHB1dCBhcmd1bWVudHMqLworICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT5yZWFkKCZmbGFncywgc2l6ZW9mKGF1ZGlvX2lucHV0X2ZsYWdzX3QpKTsKKyAgICAgICAgICAgIGZyYW1lQ291bnQgPSBwYXJjZWwtPnJlYWRJbnQ2NCgpOworICAgICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVDb3VudCA9IHBhcmNlbC0+cmVhZEludDY0KCk7CisgICAgICAgICAgICAodm9pZClwYXJjZWwtPnJlYWQoJnNlbGVjdGVkRGV2aWNlSWQsIHNpemVvZihhdWRpb19wb3J0X2hhbmRsZV90KSk7CisgICAgICAgICAgICAodm9pZClwYXJjZWwtPnJlYWQoJnNlc3Npb25JZCwgc2l6ZW9mKGF1ZGlvX3Nlc3Npb25fdCkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgLyogaW5wdXQgYXJndW1lbnRzKi8KKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGUoJmF0dHIsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGUoJmNvbmZpZywgc2l6ZW9mKGF1ZGlvX2NvbmZpZ19iYXNlX3QpKTsKKyAgICAgICAgICAgICh2b2lkKWNsaWVudEluZm8ud3JpdGVUb1BhcmNlbChwYXJjZWwpOworICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZVN0cmluZzE2KG9wUGFja2FnZU5hbWUpOworCisgICAgICAgICAgICAvKiBpbnB1dC9vdXRwdXQgYXJndW1lbnRzKi8KKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGUoJmZsYWdzLCBzaXplb2YoYXVkaW9faW5wdXRfZmxhZ3NfdCkpOworICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZUludDY0KGZyYW1lQ291bnQpOworICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZUludDY0KG5vdGlmaWNhdGlvbkZyYW1lQ291bnQpOworICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZSgmc2VsZWN0ZWREZXZpY2VJZCwgc2l6ZW9mKGF1ZGlvX3BvcnRfaGFuZGxlX3QpKTsKKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGUoJnNlc3Npb25JZCwgc2l6ZW9mKGF1ZGlvX3Nlc3Npb25fdCkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgLyogaW5wdXQgKi8KKyAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHI7CisgICAgICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgY29uZmlnOworICAgICAgICBBdWRpb0NsaWVudCBjbGllbnRJbmZvOworICAgICAgICBTdHJpbmcxNiBvcFBhY2thZ2VOYW1lOworCisgICAgICAgIC8qIGlucHV0L291dHB1dCAqLworICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzOworICAgICAgICBzaXplX3QgZnJhbWVDb3VudDsKKyAgICAgICAgc2l6ZV90IG5vdGlmaWNhdGlvbkZyYW1lQ291bnQ7CisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZDsKKyAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZDsKKyAgICB9OworCisgICAgLyogQ3JlYXRlUmVjb3JkT3V0cHV0IGNvbnRhaW5zIGFsbCBvdXRwdXQgYXJndW1lbnRzIHJldHVybmVkIGJ5IEF1ZGlvRmxpbmdlciB0byBBdWRpb1JlY29yZAorICAgICAqIHdoZW4gY2FsbGluZyBjcmVhdGVSZWNvcmQoKSBpbmNsdWRpbmcgYXJndW1lbnRzIHRoYXQgd2VyZSBwYXNzZWQgYXMgSS9PIGZvciB1cGRhdGUgYnkKKyAgICAgKiBDcmVhdGVSZWNvcmRJbnB1dC4KKyAgICAgKi8KKyAgICBjbGFzcyBDcmVhdGVSZWNvcmRPdXRwdXQgOiBwdWJsaWMgUGFyY2VsYWJsZSB7CisgICAgcHVibGljOgorICAgICAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgKnBhcmNlbCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgLyogaW5wdXQvb3V0cHV0IGFyZ3VtZW50cyovCisgICAgICAgICAgICAodm9pZClwYXJjZWwtPnJlYWQoJmZsYWdzLCBzaXplb2YoYXVkaW9faW5wdXRfZmxhZ3NfdCkpOworICAgICAgICAgICAgZnJhbWVDb3VudCA9IHBhcmNlbC0+cmVhZEludDY0KCk7CisgICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZUNvdW50ID0gcGFyY2VsLT5yZWFkSW50NjQoKTsKKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+cmVhZCgmc2VsZWN0ZWREZXZpY2VJZCwgc2l6ZW9mKGF1ZGlvX3BvcnRfaGFuZGxlX3QpKTsKKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+cmVhZCgmc2Vzc2lvbklkLCBzaXplb2YoYXVkaW9fc2Vzc2lvbl90KSk7CisKKyAgICAgICAgICAgIC8qIG91dHB1dCBhcmd1bWVudHMqLworICAgICAgICAgICAgc2FtcGxlUmF0ZSA9IHBhcmNlbC0+cmVhZFVpbnQzMigpOworICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT5yZWFkKCZpbnB1dElkLCBzaXplb2YoYXVkaW9faW9faGFuZGxlX3QpKTsKKyAgICAgICAgICAgIGlmIChwYXJjZWwtPnJlYWRJbnQzMigpICE9IDApIHsKKyAgICAgICAgICAgICAgICBjYmxrID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4ocGFyY2VsLT5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgICAgIGlmIChjYmxrID09IDAgfHwgY2Jsay0+cG9pbnRlcigpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGFyY2VsLT5yZWFkSW50MzIoKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgYnVmZmVycyA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KHBhcmNlbC0+cmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVycyA9PSAwIHx8IGJ1ZmZlcnMtPnBvaW50ZXIoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgLyogaW5wdXQvb3V0cHV0IGFyZ3VtZW50cyovCisgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlKCZmbGFncywgc2l6ZW9mKGF1ZGlvX2lucHV0X2ZsYWdzX3QpKTsKKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVJbnQ2NChmcmFtZUNvdW50KTsKKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVJbnQ2NChub3RpZmljYXRpb25GcmFtZUNvdW50KTsKKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGUoJnNlbGVjdGVkRGV2aWNlSWQsIHNpemVvZihhdWRpb19wb3J0X2hhbmRsZV90KSk7CisgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlKCZzZXNzaW9uSWQsIHNpemVvZihhdWRpb19zZXNzaW9uX3QpKTsKKworICAgICAgICAgICAgLyogb3V0cHV0IGFyZ3VtZW50cyovCisgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlVWludDMyKHNhbXBsZVJhdGUpOworICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZSgmaW5wdXRJZCwgc2l6ZW9mKGF1ZGlvX2lvX2hhbmRsZV90KSk7CisgICAgICAgICAgICBpZiAoY2JsayAhPSAwKSB7CisgICAgICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZUludDMyKDEpOworICAgICAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoY2JsaykpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlSW50MzIoMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYnVmZmVycyAhPSAwKSB7CisgICAgICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZUludDMyKDEpOworICAgICAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoYnVmZmVycykpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlSW50MzIoMCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGlucHV0L291dHB1dCAqLworICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzOworICAgICAgICBzaXplX3QgZnJhbWVDb3VudDsKKyAgICAgICAgc2l6ZV90IG5vdGlmaWNhdGlvbkZyYW1lQ291bnQ7CisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZDsKKyAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZDsKKworICAgICAgICAvKiBvdXRwdXQgKi8KKyAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZTsKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXRJZDsKKyAgICAgICAgc3A8SU1lbW9yeT4gY2JsazsKKyAgICAgICAgc3A8SU1lbW9yeT4gYnVmZmVyczsKKyAgICB9OwogCiAgICAgLy8gaW52YXJpYW50IG9uIGV4aXQgZm9yIGFsbCBBUElzIHRoYXQgcmV0dXJuIGFuIHNwPD46CiAgICAgLy8gICAocmV0dXJuIHZhbHVlICE9IDApID09ICgqc3RhdHVzID09IE5PX0VSUk9SKQpAQCAtNTAsNDUgKzMyMSwxMyBAQAogICAgIC8qIGNyZWF0ZSBhbiBhdWRpbyB0cmFjayBhbmQgcmVnaXN0ZXJzIGl0IHdpdGggQXVkaW9GbGluZ2VyLgogICAgICAqIHJldHVybiBudWxsIGlmIHRoZSB0cmFjayBjYW5ub3QgYmUgY3JlYXRlZC4KICAgICAgKi8KLSAgICB2aXJ0dWFsIHNwPElBdWRpb1RyYWNrPiBjcmVhdGVUcmFjaygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnBGcmFtZUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCAqZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9uIHN1Y2Nlc3NmdWwgcmV0dXJuLCBBdWRpb0ZsaW5nZXIgdGFrZXMgb3ZlciB0aGUgaGFuZGxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZmVyZW5jZSBhbmQgd2lsbCByZWxlYXNlIGl0IHdoZW4gdGhlIHRyYWNrIGlzIGRlc3Ryb3llZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSG93ZXZlciBvbiBmYWlsdXJlLCB0aGUgY2xpZW50IGlzIHJlc3BvbnNpYmxlIGZvciByZWxlYXNlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgdGlkLCAgLy8gLTEgbWVhbnMgdW51c2VkLCBvdGhlcndpc2UgbXVzdCBiZSB2YWxpZCBub24tMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgKnNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaWVudFVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKKyAgICB2aXJ0dWFsIHNwPElBdWRpb1RyYWNrPiBjcmVhdGVUcmFjayhjb25zdCBDcmVhdGVUcmFja0lucHV0JiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVUcmFja091dHB1dCYgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpID0gMDsKIAotICAgIHZpcnR1YWwgc3A8SUF1ZGlvUmVjb3JkPiBvcGVuUmVjb3JkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbiBzdWNjZXNzZnVsIHJldHVybiwgQXVkaW9GbGluZ2VyIHRha2VzIG92ZXIgdGhlIGhhbmRsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWZlcmVuY2UgYW5kIHdpbGwgcmVsZWFzZSBpdCB3aGVuIHRoZSB0cmFjayBpcyBkZXN0cm95ZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhvd2V2ZXIgb24gZmFpbHVyZSwgdGhlIGNsaWVudCBpcyByZXNwb25zaWJsZSBmb3IgcmVsZWFzZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjYWxsaW5nUGFja2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpwRnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCAqZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgdGlkLCAgLy8gLTEgbWVhbnMgdW51c2VkLCBvdGhlcndpc2UgbXVzdCBiZSB2YWxpZCBub24tMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpZW50VWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgKnNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpub3RpZmljYXRpb25GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElNZW1vcnk+JiBjYmxrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJTWVtb3J5PiYgYnVmZmVycywgICAvLyByZXR1cm4gdmFsdWUgMCBtZWFucyBpdCBmb2xsb3dzIGNibGsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKKyAgICB2aXJ0dWFsIHNwPG1lZGlhOjpJQXVkaW9SZWNvcmQ+IGNyZWF0ZVJlY29yZChjb25zdCBDcmVhdGVSZWNvcmRJbnB1dCYgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlUmVjb3JkT3V0cHV0JiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cykgPSAwOwogCiAgICAgLy8gRklYTUUgU3VycHJpc2luZ2x5LCBmb3JtYXQvbGF0ZW5jeSBkb24ndCB3b3JrIGZvciBpbnB1dCBoYW5kbGVzCiAKQEAgLTEzMSw2ICszNzAsNyBAQAogICAgIC8vIG1pYyBtdXRlL3N0YXRlCiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgc2V0TWljTXV0ZShib29sIHN0YXRlKSA9IDA7CiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgZ2V0TWljTXV0ZSgpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBzZXRSZWNvcmRTaWxlbmNlZCh1aWRfdCB1aWQsIGJvb2wgc2lsZW5jZWQpID0gMDsKIAogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIHNldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKSA9IDA7CkBAIC0yMTYsOCArNDU2LDkgQEAKIAogICAgIC8vIEludGVuZGVkIGZvciBBdWRpb1NlcnZpY2UgdG8gaW5mb3JtIEF1ZGlvRmxpbmdlciBvZiBkZXZpY2UncyBsb3cgUkFNIGF0dHJpYnV0ZSwKICAgICAvLyBhbmQgc2hvdWxkIGJlIGNhbGxlZCBhdCBtb3N0IG9uY2UuICBGb3IgYSBkZWZpbml0aW9uIG9mIHdoYXQgImxvdyBSQU0iIG1lYW5zLCBzZWUKLSAgICAvLyBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXIuaXNMb3dSYW1EZXZpY2UoKS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldExvd1JhbURldmljZShib29sIGlzTG93UmFtRGV2aWNlKSA9IDA7CisgICAgLy8gYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyLmlzTG93UmFtRGV2aWNlKCkuICBUaGUgdG90YWxNZW1vcnkgcGFyYW1ldGVyCisgICAgLy8gaXMgb2J0YWluZWQgZnJvbSBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXIuTWVtb3J5SW5mby50b3RhbE1lbS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldExvd1JhbURldmljZShib29sIGlzTG93UmFtRGV2aWNlLCBpbnQ2NF90IHRvdGFsTWVtb3J5KSA9IDA7CiAKICAgICAvKiBMaXN0IGF2YWlsYWJsZSBhdWRpbyBwb3J0cyBhbmQgdGhlaXIgYXR0cmlidXRlcyAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUG9ydHModW5zaWduZWQgaW50ICpudW1fcG9ydHMsCkBAIC0yNDcsNiArNDg4LDkgQEAKIAogICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBmcmFtZXMgcGVyIGF1ZGlvIEhBTCBidWZmZXIuCiAgICAgdmlydHVhbCBzaXplX3QgZnJhbWVDb3VudEhBTChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSkgY29uc3QgPSAwOworCisgICAgLyogTGlzdCBhdmFpbGFibGUgbWljcm9waG9uZXMgYW5kIHRoZWlyIGNoYXJhY3RlcmlzdGljcyAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpID0gMDsKIH07CiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaAppbmRleCBlZWMzZTg4Li5jMzg3NmFmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaApAQCAtNTUsMTYgKzU1LDEyIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZykgPSAwOwogICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpID0gMDsKLSAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gTlVMTCkgPSAwOworICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLApAQCAtODQsMTYgKzgwLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKnNpbGVuY2VkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1heCkgPSAwOwpAQCAtMTcxLDYgKzE2NiwxMiBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyTW9ubyhib29sICptb25vKSA9IDA7CiAgICAgdmlydHVhbCBmbG9hdCAgICBnZXRTdHJlYW1Wb2x1bWVEQigKICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgaW5kZXgsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3Vycm91bmRGb3JtYXRzKHVuc2lnbmVkIGludCAqbnVtU3Vycm91bmRGb3JtYXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpzdXJyb3VuZEZvcm1hdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqc3Vycm91bmRGb3JtYXRzRW5hYmxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlcG9ydGVkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQsIGJvb2wgZW5hYmxlZCkgPSAwOwogfTsKIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1JlY29yZC5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9SZWNvcmQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc2ODE3Ni4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1JlY29yZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgSUFVRElPUkVDT1JEX0hfCi0jZGVmaW5lIElBVURJT1JFQ09SRF9IXwotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSUF1ZGlvUmVjb3JkIDogcHVibGljIElJbnRlcmZhY2UKLXsKLXB1YmxpYzoKLSAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKEF1ZGlvUmVjb3JkKTsKLQotICAgIC8qIEFmdGVyIGl0J3MgY3JlYXRlZCB0aGUgdHJhY2sgaXMgbm90IGFjdGl2ZS4gQ2FsbCBzdGFydCgpIHRvCi0gICAgICogbWFrZSBpdCBhY3RpdmUuCi0gICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydChpbnQgLypBdWRpb1N5c3RlbTo6c3luY19ldmVudF90Ki8gZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgdHJpZ2dlclNlc3Npb24pID0gMDsKLQotICAgIC8qIFN0b3AgYSB0cmFjay4gSWYgc2V0LCB0aGUgY2FsbGJhY2sgd2lsbCBjZWFzZSBiZWluZyBjYWxsZWQgYW5kCi0gICAgICogb2J0YWluQnVmZmVyIHdpbGwgcmV0dXJuIGFuIGVycm9yLiBCdWZmZXJzIHRoYXQgYXJlIGFscmVhZHkgcmVsZWFzZWQKLSAgICAgKiB3aWxsIGJlIHByb2Nlc3NlZCwgdW5sZXNzIGZsdXNoKCkgaXMgY2FsbGVkLgotICAgICAqLwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgc3RvcCgpID0gMDsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgQm5BdWRpb1JlY29yZCA6IHB1YmxpYyBCbkludGVyZmFjZTxJQXVkaW9SZWNvcmQ+Ci17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KCB1aW50MzJfdCBjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvKklBVURJT1JFQ09SRF9IXyovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1RyYWNrLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1RyYWNrLmgKaW5kZXggMjdhNjJkNi4uOTRhZmUzYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9UcmFjay5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvVHJhY2suaApAQCAtNzcsMTIgKzc3LDEyIEBACiAgICAgdmlydHVhbCB2b2lkICAgICAgICBzaWduYWwoKSA9IDA7CiAKICAgICAvKiBTZXRzIHRoZSB2b2x1bWUgc2hhcGVyICovCi0gICAgdmlydHVhbCBWb2x1bWVTaGFwZXI6OlN0YXR1cyBhcHBseVZvbHVtZVNoYXBlcigKLSAgICAgICAgICAgIGNvbnN0IHNwPFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4mIGNvbmZpZ3VyYXRpb24sCi0gICAgICAgICAgICBjb25zdCBzcDxWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4mIG9wZXJhdGlvbikgPSAwOworICAgIHZpcnR1YWwgbWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdHVzIGFwcGx5Vm9sdW1lU2hhcGVyKAorICAgICAgICAgICAgY29uc3Qgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4mIGNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+JiBvcGVyYXRpb24pID0gMDsKIAogICAgIC8qIGdldHMgdGhlIHZvbHVtZSBzaGFwZXIgc3RhdGUgKi8KLSAgICB2aXJ0dWFsIHNwPFZvbHVtZVNoYXBlcjo6U3RhdGU+IGdldFZvbHVtZVNoYXBlclN0YXRlKGludCBpZCkgPSAwOworICAgIHZpcnR1YWwgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdGU+IGdldFZvbHVtZVNoYXBlclN0YXRlKGludCBpZCkgPSAwOwogfTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9QbGF5ZXJCYXNlLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL1BsYXllckJhc2UuaAppbmRleCBlNjMwOTBiLi5lN2E4YWJjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL1BsYXllckJhc2UuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL1BsYXllckJhc2UuaApAQCAtMTcsMzUgKzE3LDMxIEBACiAjaWZuZGVmIF9fQU5EUk9JRF9QTEFZRVJfQkFTRV9IX18KICNkZWZpbmUgX19BTkRST0lEX1BMQVlFUl9CQVNFX0hfXwogCi0jaW5jbHVkZSA8YXVkaW9tYW5hZ2VyL0lQbGF5ZXIuaD4KICNpbmNsdWRlIDxhdWRpb21hbmFnZXIvQXVkaW9NYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YXVkaW9tYW5hZ2VyL0lBdWRpb01hbmFnZXIuaD4KIAorI2luY2x1ZGUgImFuZHJvaWQvbWVkaWEvQm5QbGF5ZXIuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBQbGF5ZXJCYXNlIDogcHVibGljIEJuUGxheWVyCitjbGFzcyBQbGF5ZXJCYXNlIDogcHVibGljIDo6YW5kcm9pZDo6bWVkaWE6OkJuUGxheWVyCiB7CiBwdWJsaWM6CiAgICAgZXhwbGljaXQgUGxheWVyQmFzZSgpOwotICAgIHZpcnR1YWwgflBsYXllckJhc2UoKTsKKyAgICB2aXJ0dWFsIH5QbGF5ZXJCYXNlKCkgb3ZlcnJpZGU7CiAKICAgICB2aXJ0dWFsIHZvaWQgZGVzdHJveSgpID0gMDsKIAogICAgIC8vSVBsYXllciBpbXBsZW1lbnRhdGlvbgotICAgIHZpcnR1YWwgdm9pZCBzdGFydCgpOwotICAgIHZpcnR1YWwgdm9pZCBwYXVzZSgpOwotICAgIHZpcnR1YWwgdm9pZCBzdG9wKCk7Ci0gICAgdmlydHVhbCB2b2lkIHNldFZvbHVtZShmbG9hdCB2b2wpOwotICAgIHZpcnR1YWwgdm9pZCBzZXRQYW4oZmxvYXQgcGFuKTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0U3RhcnREZWxheU1zKGludDMyX3QgZGVsYXlNcyk7Ci0gICAgdmlydHVhbCB2b2lkIGFwcGx5Vm9sdW1lU2hhcGVyKAotICAgICAgICAgICAgY29uc3Qgc3A8Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiYgY29uZmlndXJhdGlvbiwKLSAgICAgICAgICAgIGNvbnN0IHNwPFZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPiYgb3BlcmF0aW9uKSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25UcmFuc2FjdCgKLSAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKTsKLQorICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgc3RhcnQoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIHBhdXNlKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBzdG9wKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBzZXRWb2x1bWUoZmxvYXQgdm9sKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIHNldFBhbihmbG9hdCBwYW4pIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgc2V0U3RhcnREZWxheU1zKGludDMyX3QgZGVsYXlNcykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBhcHBseVZvbHVtZVNoYXBlcigKKyAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24mIGNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICBjb25zdCBtZWRpYTo6Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24mIG9wZXJhdGlvbikgb3ZlcnJpZGU7CiAKICAgICAgICAgICAgIHN0YXR1c190IHN0YXJ0V2l0aFN0YXR1cygpOwogICAgICAgICAgICAgc3RhdHVzX3QgcGF1c2VXaXRoU3RhdHVzKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL1RvbmVHZW5lcmF0b3IuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvVG9uZUdlbmVyYXRvci5oCmluZGV4IGZjM2QzZWUuLjI0NzcwM2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvVG9uZUdlbmVyYXRvci5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvVG9uZUdlbmVyYXRvci5oCkBAIC0xNzcsNyArMTc3LDcgQEAKIAogCiAgICAgLy8gUmVnaW9uIHNwZWNpZmljIHRvbmVzLgotICAgIC8vIFRoZXNlIHN1cGVydmlzb3J5IHRvbmVzIGFyZSBkaWZmZXJlbnQgZGVwZW5kaW5nIG9uIHRoZSByZWdpb24gKFVTQS9DQU5BREEsIEpBUEFOLCByZXN0IG9mIHRoZSB3b3JsZCkuCisgICAgLy8gVGhlc2Ugc3VwZXJ2aXNvcnkgdG9uZXMgYXJlIGRpZmZlcmVudCBkZXBlbmRpbmcgb24gdGhlIHJlZ2lvbiAoVVNBL0NBTkFEQSwgSkFQQU4sIFNpbmdhcG9yZSwgSG9uZyBLb25nLCByZXN0IG9mIHRoZSB3b3JsZCkuCiAgICAgLy8gV2hlbiBhIHRvbmUgaW4gdGhlIHJhbmdlIFtGSVJTVF9TVVBfVE9ORSwgTEFTVF9TVVBfVE9ORV0gaXMgcmVxdWVzdGVkLCB0aGUgcmVnaW9uIGlzIGRldGVybWluZWQKICAgICAvLyBmcm9tIHN5c3RlbSBwcm9wZXJ0eSBnc20ub3BlcmF0b3IuaXNvLWNvdW50cnkgYW5kIHRoZSBwcm9wZXIgdG9uZSBkZXNjcmlwdG9yIGlzIHNlbGVjdGVkIHdpdGggdGhlCiAgICAgLy8gaGVscCBvZiBzVG9uZU1hcHBpbmdUYWJsZVtdCkBAIC0xOTQsMTIgKzE5NCwyNCBAQAogICAgICAgICBUT05FX0pBUEFOX0JVU1ksICAgICAgICAgICAgLy8gQnVzeSB0b25lOiA0MDBIeiwgNTAwbXMgT04sIDUwMG1zIE9GRi4uLgogICAgICAgICBUT05FX0pBUEFOX1JBRElPX0FDSywgICAgICAgLy8gUmFkaW8gcGF0aCBhY2tub3dsZWdtZW50OiA0MDBIeiwgMXMgT04sIDJzIE9GRi4uLgogICAgICAgICAvLyBHQiBTdXBlcnZpc29yeSB0b25lcworICAgICAgICBUT05FX0dCX0JVU1ksICAgICAgICAgICAgICAgLy8gQnVzeSB0b25lOiA0MDAgSHosIDM3NW1zIE9OLCAzNzVtcyBPRkYuLi4KKyAgICAgICAgVE9ORV9HQl9DT05HRVNUSU9OLCAgICAgICAgIC8vIENvbmdlc3Rpb24gVG9uZTogNDAwIEh6LCA0MDBtcyBPTiwgMzUwbXMgT0ZGLCAyMjVtcyBPTiwgNTI1bXMgT0ZGLi4uCiAgICAgICAgIFRPTkVfR0JfUklOR1RPTkUsICAgICAgICAgICAvLyBSaW5nIFRvbmU6IEEgNDAwSHogKyA0NTBIeiB0b25lIHJlcGVhdGVkIGluIGEgMC40cyBvbiwgMC4ycyBvZmYsIDAuNHMgb24sIDIuMHMgb2ZmIHBhdHRlcm4uCiAgICAgICAgIC8vIEFVU1RSQUxJQSBTdXBlcnZpc29yeSB0b25lcworICAgICAgICBUT05FX0FVU1RSQUxJQV9ESUFMLCAgICAgICAgLy8gRGlhbCB0b25lOiA0MjUgSHogdG9uZSBtb2R1bGF0ZWQgd2l0aCAyNSBIeiwgY29udGludW91cwogICAgICAgICBUT05FX0FVU1RSQUxJQV9SSU5HVE9ORSwgICAgLy8gUmluZyB0b25lOiBBIDQwMEh6ICsgNDUwSHogdG9uZSByZXBlYXRlZCBpbiBhIDAuNHMgb24sIDAuMnMgb2ZmLCAwLjRzIG9uLCAyLjBzIG9mZiBwYXR0ZXJuLgogICAgICAgICBUT05FX0FVU1RSQUxJQV9CVVNZLCAgICAgICAgLy8gQnVzeSB0b25lOiA0MjUgSHogcmVwZWF0ZWQgaW4gYSAwLjM3NXMgb24sIDAuMzc1cyBvZmYgcGF0dGVybi4KICAgICAgICAgVE9ORV9BVVNUUkFMSUFfQ0FMTF9XQUlUSU5HLC8vIENhbGwgd2FpdGluZyB0b25lOiA0MjVIeiB0b25lIHJlcGVhdGVkIGluIGEgMC4ycyBvbiwgMC4ycyBvZmYsIDAuMnMgb24sIDQuNHMgb2ZmIHBhdHRlcm4uCiAgICAgICAgIFRPTkVfQVVTVFJBTElBX0NPTkdFU1RJT04sICAvLyBDb25nZXN0aW9uIHRvbmU6IDQyNUh6IHRvbmUgcmVwZWF0ZWQgaW4gYSAwLjM3NXMgb24sIDAuMzc1cyBvZmYgcGF0dGVybgorICAgICAgICAvLyBTSU5HQVBPUkUgU3VwZXJ2aXNvcnkgdG9uZXMKKyAgICAgICAgVE9ORV9TR19CVVNZLCAgICAgICAgICAgICAgIC8vIEJ1c3kgdG9uZTogNDI1IEh6LCA3NTBtcyBPTiwgNzUwbXMgT0ZGLi4uCisgICAgICAgIFRPTkVfU0dfUklOR1RPTkUsICAgICAgICAgICAvLyBSaW5nIFRvbmU6IDQyNSBIeiB0b25lIG1vZHVsYXRlZCB3aXRoIDI0IEh6LCA0MDBtcyBPTiwgMjAwbXMgT0ZGLCA0MDBtcyBPTiwgMnMgT0ZGLi4uCisgICAgICAgIC8vIEhPTkcgS09ORyBTdXBlcnZpc29yeSB0b25lcworICAgICAgICBUT05FX0hLX0JVU1ksICAgICAgICAgICAgICAgLy8gQnVzeSB0b25lOiA0ODAgSHogKyA2MjAgSHosIDUwMG1zIE9OLCA1MDBtcyBPRkYuLi4KKyAgICAgICAgVE9ORV9IS19SSU5HVE9ORSwgICAgICAgICAgIC8vIFJpbmcgVG9uZTogNDQwIEh6ICsgNDgwIEh6IHJlcGVhdGVkIHdpdGggcGF0dGVybiAwLDRzIG9uLCAwLDJzIG9mZiwgMCw0cyBvbiBhbmQgM3Mgb2ZmLgorICAgICAgICAvLyBJUkVMQU5EIFN1cGVydmlzb3J5IHRvbmVzCisgICAgICAgIFRPTkVfSUVfUklOR1RPTkUsICAgICAgICAgICAvLyBSaW5nIFRvbmU6IEEgNDAwSHogKyA0NTBIeiB0b25lIHJlcGVhdGVkIGluIGEgMC40cyBvbiwgMC4ycyBvZmYsIDAuNHMgb24sIDIuMHMgb2ZmIHBhdHRlcm4uCisgICAgICAgIFRPTkVfSUVfQ0FMTF9XQUlUSU5HLCAgICAgICAvLyBDYWxsIHdhaXRpbmcgdG9uZTogNDI1SHogdG9uZSByZXBlYXRlZCBpbiBhIDAuMThzIG9uLCAwLjJzIG9mZiwgMC4ycyBvbiwgNC41cyBvZmYgcGF0dGVybi4KICAgICAgICAgTlVNX0FMVEVSTkFURV9UT05FUwogICAgIH07CiAKQEAgLTIwOCw2ICsyMjAsOSBAQAogICAgICAgICBKQVBBTiwKICAgICAgICAgR0IsCiAgICAgICAgIEFVU1RSQUxJQSwKKyAgICAgICAgU0lOR0FQT1JFLAorICAgICAgICBIT05HS09ORywKKyAgICAgICAgSVJFTEFORCwKICAgICAgICAgQ0VQVCwKICAgICAgICAgTlVNX1JFR0lPTlMKICAgICB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9UcmFja1BsYXllckJhc2UuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvVHJhY2tQbGF5ZXJCYXNlLmgKaW5kZXggMmQxMTNjMC4uNjZlOWIzYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9UcmFja1BsYXllckJhc2UuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL1RyYWNrUGxheWVyQmFzZS5oCkBAIC0zMiw5ICszMiw5IEBACiAgICAgdmlydHVhbCB2b2lkIGRlc3Ryb3koKTsKIAogICAgIC8vSVBsYXllciBpbXBsZW1lbnRhdGlvbgotICAgIHZpcnR1YWwgdm9pZCBhcHBseVZvbHVtZVNoYXBlcigKLSAgICAgICAgICAgIGNvbnN0IHNwPFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4mIGNvbmZpZ3VyYXRpb24sCi0gICAgICAgICAgICBjb25zdCBzcDxWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4mIG9wZXJhdGlvbik7CisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBhcHBseVZvbHVtZVNoYXBlcigKKyAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24mIGNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICBjb25zdCBtZWRpYTo6Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24mIG9wZXJhdGlvbik7CiAKICAgICAvL0ZJWE1FIG1vdmUgdG8gcHJvdGVjdGVkIGZpZWxkLCBzbyBmYXIgbWFkZSBwdWJsaWMgdG8gbWluaW1pemUgY2hhbmdlcyB0byBBdWRpb1RyYWNrIGxvZ2ljCiAgICAgc3A8QXVkaW9UcmFjaz4gbUF1ZGlvVHJhY2s7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmJiMmZiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDM1IEBACitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYmF1ZGlvY2xpZW50X3Rlc3RzX2RlZmF1bHRzIiwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJ0ZXN0X2NyZWF0ZV9hdWRpb3RyYWNrIiwKKyAgICBkZWZhdWx0czogWyJsaWJhdWRpb2NsaWVudF90ZXN0c19kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsidGVzdF9jcmVhdGVfYXVkaW90cmFjay5jcHAiLAorICAgICAgICAgICAidGVzdF9jcmVhdGVfdXRpbHMuY3BwIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50IiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisgICAgZGF0YTogWyJ0cmFja190ZXN0X2lucHV0XyoudHh0Il0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJ0ZXN0X2NyZWF0ZV9hdWRpb3JlY29yZCIsCisgICAgZGVmYXVsdHM6IFsibGliYXVkaW9jbGllbnRfdGVzdHNfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbInRlc3RfY3JlYXRlX2F1ZGlvcmVjb3JkLmNwcCIsCisgICAgICAgICAgICJ0ZXN0X2NyZWF0ZV91dGlscy5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXVkaW9jbGllbnQiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKyAgICBkYXRhOiBbInJlY29yZF90ZXN0X2lucHV0XyoudHh0Il0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy9yZWNvcmRfdGVzdF9pbnB1dF92MS4wX3JlZi50eHQgYi9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy9yZWNvcmRfdGVzdF9pbnB1dF92MS4wX3JlZi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAxNTk4ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL3JlY29yZF90ZXN0X2lucHV0X3YxLjBfcmVmLnR4dApAQCAtMCwwICsxLDMzIEBACit2ZXJzaW9uIDEuMAorIyBJbnB1dCBmaWxlIGZvciB0ZXN0X2NyZWF0ZV9hdWRpb3JlY29yZAorIyBBZGQgb25lIGxpbmUgZm9yIGVhY2ggdGVzdGVkIEF1ZGlvUmVjb3JkIGNvbnN0cnVjdG9yIHdpdGggdGhlIGZvbGxvd2luZyBhcmd1bWVudHM6CisjIHNhbXBsZVJhdGUgZm9ybWF0ICAgY2hhbm5lbE1hc2sgZnJhbWVDb3VudCBub3RpZmljYXRpb25GcmFtZXMgZmxhZ3Mgc2Vzc2lvbklkIGlucHV0U291cmNlCisjIHNhbXBsZSByYXRlIHRlc3RzCisgIDQ4MDAwICAgICAgMHgxICAgICAgMHgxMCAgICAgICAgNDgwMCAgICAgICAyNDAwICAgICAgICAgICAgICAgMHgwICAgMCAgICAgICAgIDAKKyAgMjQwMDAgICAgICAweDEgICAgICAweDEwICAgICAgICA0ODAwICAgICAgIDI0MDAgICAgICAgICAgICAgICAweDAgICAwICAgICAgICAgMAorICAxNjAwMCAgICAgIDB4MSAgICAgIDB4MTAgICAgICAgIDQ4MDAgICAgICAgMjQwMCAgICAgICAgICAgICAgIDB4MCAgIDAgICAgICAgICAwCisgICA4MDAwICAgICAgMHgxICAgICAgMHgxMCAgICAgICAgNDgwMCAgICAgICAyNDAwICAgICAgICAgICAgICAgMHgwICAgMCAgICAgICAgIDAKKyAgNDQxMDAgICAgICAweDEgICAgICAweDEwICAgICAgICA0NDEwICAgICAgIDIyMDUgICAgICAgICAgICAgICAweDAgICAwICAgICAgICAgMAorICAyMjA1MCAgICAgIDB4MSAgICAgIDB4MTAgICAgICAgIDQ0MTAgICAgICAgMjIwNSAgICAgICAgICAgICAgIDB4MCAgIDAgICAgICAgICAwCisgIDExMDI1ICAgICAgMHgxICAgICAgMHgxMCAgICAgICAgNDQxMCAgICAgICAyMjA1ICAgICAgICAgICAgICAgMHgwICAgMCAgICAgICAgIDAKKyMgZm9ybWF0IHRlc3RzCisgIDQ4MDAwICAgICAgMHgyICAgICAgMHgxMCAgICAgICAgNDgwMCAgICAgICAyNDAwICAgICAgICAgICAgICAgMHgwICAgMCAgICAgICAgIDAKKyAgNDgwMDAgICAgICAweDMgICAgICAweDEwICAgICAgICA0ODAwICAgICAgIDI0MDAgICAgICAgICAgICAgICAweDAgICAwICAgICAgICAgMAorICA0ODAwMCAgICAgIDB4NSAgICAgIDB4MTAgICAgICAgIDQ4MDAgICAgICAgMjQwMCAgICAgICAgICAgICAgIDB4MCAgIDAgICAgICAgICAwCisjIGNoYW5uZWwgbWFzayB0ZXN0cworICA0ODAwMCAgICAgIDB4MSAgICAgIDB4MEMgICAgICAgIDQ4MDAgICAgICAgMjQwMCAgICAgICAgICAgICAgIDB4MCAgIDAgICAgICAgICAwCisjIGZyYW1lIGNvdW50IHRlc3RzCisgIDQ4MDAwICAgICAgMHgxICAgICAgMHgxMCAgICAgICAgMCAgICAgICAgICAwICAgICAgICAgICAgICAgICAgMHgwICAgMCAgICAgICAgIDAKKyAgNDgwMDAgICAgICAweDEgICAgICAweDEwICAgICAgICA0ODAwMCAgICAgIDAgICAgICAgICAgICAgICAgICAweDAgICAwICAgICAgICAgMAorICA0ODAwMCAgICAgIDB4MSAgICAgIDB4MTAgICAgICAgIDEyMDAwICAgICAgNjAwMCAgICAgICAgICAgICAgIDB4MCAgIDAgICAgICAgICAwCisjIGZsYWdzIHRlc3QKKyAgNDgwMDAgICAgICAweDEgICAgICAweDBDICAgICAgICAwICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAweDEgICAwICAgICAgICAgMAorICA0NDEwMCAgICAgIDB4MSAgICAgIDB4MEMgICAgICAgIDAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgIDB4NSAgIDAgICAgICAgICAwCisjIHNlc3Npb24gdGVzdHMKKyAgNDgwMDAgICAgICAweDEgICAgICAweDEwICAgICAgICAwICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAwICAgICAxMDAxICAgICAgMAorIyBpbnB1dCBzb3VyY2UgdGVzdHMKKyAgNDgwMDAgICAgICAweDEgICAgICAweDEwICAgICAgICAwICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAwICAgICAwICAgICAgICAgMQorICA0ODAwMCAgICAgIDB4MSAgICAgIDB4MTAgICAgICAgIDAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgIDAgICAgIDAgICAgICAgICA1CisgIDQ4MDAwICAgICAgMHgxICAgICAgMHgxMCAgICAgICAgMCAgICAgICAgICAwICAgICAgICAgICAgICAgICAgMCAgICAgMCAgICAgICAgIDYKKyAgNDgwMDAgICAgICAweDEgICAgICAweDEwICAgICAgICAwICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAwICAgICAwICAgICAgICAgNworICA0ODAwMCAgICAgIDB4MSAgICAgIDB4MTAgICAgICAgIDAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgIDAgICAgIDAgICAgICAgICA5CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy9yZWNvcmRfdGVzdF9vdXRwdXRfdjEuMF9yZWZfd2FsbGV5ZS50eHQgYi9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy9yZWNvcmRfdGVzdF9vdXRwdXRfdjEuMF9yZWZfd2FsbGV5ZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY2MDhlYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL3JlY29yZF90ZXN0X291dHB1dF92MS4wX3JlZl93YWxsZXllLnR4dApAQCAtMCwwICsxLDE5OCBAQAorCisjIyMjIFRlc3QgMSBzdGF0dXMgMAorIEF1ZGlvUmVjb3JkOjpkdW1wCisgIHN0YXR1cygwKSwgYWN0aXZlKDApLCBzZXNzaW9uIElkKDY1KQorICBmbGFncygwKSwgcmVxLiBmbGFncygwKSwgYXVkaW8gc291cmNlKDApCisgIGZvcm1hdCgweDEpLCBjaGFubmVsIG1hc2soMHgxMCksIGNoYW5uZWwgY291bnQoMSksIHNhbXBsZSByYXRlKDQ4MDAwKQorICBmcmFtZSBjb3VudCg0ODAwKSwgcmVxLiBmcmFtZSBjb3VudCg0ODAwKQorICBub3RpZi4gZnJhbWUgY291bnQoOTYwKSwgcmVxLiBub3RpZi4gZnJhbWUgY291bnQoMjQwMCkKKyAgaW5wdXQoMTUwKSwgbGF0ZW5jeSgxMDApLCBzZWxlY3RlZCBkZXZpY2UgSWQoMCksIHJvdXRlZCBkZXZpY2UgSWQoMTEpCisKKyMjIyMgVGVzdCAyIHN0YXR1cyAwCisgQXVkaW9SZWNvcmQ6OmR1bXAKKyAgc3RhdHVzKDApLCBhY3RpdmUoMCksIHNlc3Npb24gSWQoNzMpCisgIGZsYWdzKDApLCByZXEuIGZsYWdzKDApLCBhdWRpbyBzb3VyY2UoMCkKKyAgZm9ybWF0KDB4MSksIGNoYW5uZWwgbWFzaygweDEwKSwgY2hhbm5lbCBjb3VudCgxKSwgc2FtcGxlIHJhdGUoMjQwMDApCisgIGZyYW1lIGNvdW50KDQ4MDApLCByZXEuIGZyYW1lIGNvdW50KDQ4MDApCisgIG5vdGlmLiBmcmFtZSBjb3VudCg0ODApLCByZXEuIG5vdGlmLiBmcmFtZSBjb3VudCgyNDAwKQorICBpbnB1dCgxNTgpLCBsYXRlbmN5KDIwMCksIHNlbGVjdGVkIGRldmljZSBJZCgwKSwgcm91dGVkIGRldmljZSBJZCgxMSkKKworIyMjIyBUZXN0IDMgc3RhdHVzIDAKKyBBdWRpb1JlY29yZDo6ZHVtcAorICBzdGF0dXMoMCksIGFjdGl2ZSgwKSwgc2Vzc2lvbiBJZCg4MSkKKyAgZmxhZ3MoMCksIHJlcS4gZmxhZ3MoMCksIGF1ZGlvIHNvdXJjZSgwKQorICBmb3JtYXQoMHgxKSwgY2hhbm5lbCBtYXNrKDB4MTApLCBjaGFubmVsIGNvdW50KDEpLCBzYW1wbGUgcmF0ZSgxNjAwMCkKKyAgZnJhbWUgY291bnQoNDgwMCksIHJlcS4gZnJhbWUgY291bnQoNDgwMCkKKyAgbm90aWYuIGZyYW1lIGNvdW50KDMyMCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDI0MDApCisgIGlucHV0KDE2NiksIGxhdGVuY3koMzAwKSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDExKQorCisjIyMjIFRlc3QgNCBzdGF0dXMgMAorIEF1ZGlvUmVjb3JkOjpkdW1wCisgIHN0YXR1cygwKSwgYWN0aXZlKDApLCBzZXNzaW9uIElkKDg5KQorICBmbGFncygwKSwgcmVxLiBmbGFncygwKSwgYXVkaW8gc291cmNlKDApCisgIGZvcm1hdCgweDEpLCBjaGFubmVsIG1hc2soMHgxMCksIGNoYW5uZWwgY291bnQoMSksIHNhbXBsZSByYXRlKDgwMDApCisgIGZyYW1lIGNvdW50KDQ4MDApLCByZXEuIGZyYW1lIGNvdW50KDQ4MDApCisgIG5vdGlmLiBmcmFtZSBjb3VudCgxNjApLCByZXEuIG5vdGlmLiBmcmFtZSBjb3VudCgyNDAwKQorICBpbnB1dCgxNzQpLCBsYXRlbmN5KDYwMCksIHNlbGVjdGVkIGRldmljZSBJZCgwKSwgcm91dGVkIGRldmljZSBJZCgxMSkKKworIyMjIyBUZXN0IDUgc3RhdHVzIDAKKyBBdWRpb1JlY29yZDo6ZHVtcAorICBzdGF0dXMoMCksIGFjdGl2ZSgwKSwgc2Vzc2lvbiBJZCg5NykKKyAgZmxhZ3MoMCksIHJlcS4gZmxhZ3MoMCksIGF1ZGlvIHNvdXJjZSgwKQorICBmb3JtYXQoMHgxKSwgY2hhbm5lbCBtYXNrKDB4MTApLCBjaGFubmVsIGNvdW50KDEpLCBzYW1wbGUgcmF0ZSg0NDEwMCkKKyAgZnJhbWUgY291bnQoNDQxMCksIHJlcS4gZnJhbWUgY291bnQoNDQxMCkKKyAgbm90aWYuIGZyYW1lIGNvdW50KDg5NiksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDIyMDUpCisgIGlucHV0KDE4MiksIGxhdGVuY3koMTAwKSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDExKQorCisjIyMjIFRlc3QgNiBzdGF0dXMgMAorIEF1ZGlvUmVjb3JkOjpkdW1wCisgIHN0YXR1cygwKSwgYWN0aXZlKDApLCBzZXNzaW9uIElkKDEwNSkKKyAgZmxhZ3MoMCksIHJlcS4gZmxhZ3MoMCksIGF1ZGlvIHNvdXJjZSgwKQorICBmb3JtYXQoMHgxKSwgY2hhbm5lbCBtYXNrKDB4MTApLCBjaGFubmVsIGNvdW50KDEpLCBzYW1wbGUgcmF0ZSgyMjA1MCkKKyAgZnJhbWUgY291bnQoNDQxMCksIHJlcS4gZnJhbWUgY291bnQoNDQxMCkKKyAgbm90aWYuIGZyYW1lIGNvdW50KDQ0OCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDIyMDUpCisgIGlucHV0KDE5MCksIGxhdGVuY3koMjAwKSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDExKQorCisjIyMjIFRlc3QgNyBzdGF0dXMgMAorIEF1ZGlvUmVjb3JkOjpkdW1wCisgIHN0YXR1cygwKSwgYWN0aXZlKDApLCBzZXNzaW9uIElkKDExMykKKyAgZmxhZ3MoMCksIHJlcS4gZmxhZ3MoMCksIGF1ZGlvIHNvdXJjZSgwKQorICBmb3JtYXQoMHgxKSwgY2hhbm5lbCBtYXNrKDB4MTApLCBjaGFubmVsIGNvdW50KDEpLCBzYW1wbGUgcmF0ZSgxMTAyNSkKKyAgZnJhbWUgY291bnQoNDQxMCksIHJlcS4gZnJhbWUgY291bnQoNDQxMCkKKyAgbm90aWYuIGZyYW1lIGNvdW50KDIyNCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDIyMDUpCisgIGlucHV0KDE5OCksIGxhdGVuY3koNDAwKSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDExKQorCisjIyMjIFRlc3QgOCBzdGF0dXMgMAorIEF1ZGlvUmVjb3JkOjpkdW1wCisgIHN0YXR1cygwKSwgYWN0aXZlKDApLCBzZXNzaW9uIElkKDEyMSkKKyAgZmxhZ3MoMCksIHJlcS4gZmxhZ3MoMCksIGF1ZGlvIHNvdXJjZSgwKQorICBmb3JtYXQoMHgyKSwgY2hhbm5lbCBtYXNrKDB4MTApLCBjaGFubmVsIGNvdW50KDEpLCBzYW1wbGUgcmF0ZSg0ODAwMCkKKyAgZnJhbWUgY291bnQoNDgwMCksIHJlcS4gZnJhbWUgY291bnQoNDgwMCkKKyAgbm90aWYuIGZyYW1lIGNvdW50KDk2MCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDI0MDApCisgIGlucHV0KDIwNiksIGxhdGVuY3koMTAwKSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDExKQorCisjIyMjIFRlc3QgOSBzdGF0dXMgMAorIEF1ZGlvUmVjb3JkOjpkdW1wCisgIHN0YXR1cygwKSwgYWN0aXZlKDApLCBzZXNzaW9uIElkKDEyOSkKKyAgZmxhZ3MoMCksIHJlcS4gZmxhZ3MoMCksIGF1ZGlvIHNvdXJjZSgwKQorICBmb3JtYXQoMHgzKSwgY2hhbm5lbCBtYXNrKDB4MTApLCBjaGFubmVsIGNvdW50KDEpLCBzYW1wbGUgcmF0ZSg0ODAwMCkKKyAgZnJhbWUgY291bnQoNDgwMCksIHJlcS4gZnJhbWUgY291bnQoNDgwMCkKKyAgbm90aWYuIGZyYW1lIGNvdW50KDk2MCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDI0MDApCisgIGlucHV0KDIxNCksIGxhdGVuY3koMTAwKSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDExKQorCisjIyMjIFRlc3QgMTAgc3RhdHVzIDAKKyBBdWRpb1JlY29yZDo6ZHVtcAorICBzdGF0dXMoMCksIGFjdGl2ZSgwKSwgc2Vzc2lvbiBJZCgxMzcpCisgIGZsYWdzKDApLCByZXEuIGZsYWdzKDApLCBhdWRpbyBzb3VyY2UoMCkKKyAgZm9ybWF0KDB4NSksIGNoYW5uZWwgbWFzaygweDEwKSwgY2hhbm5lbCBjb3VudCgxKSwgc2FtcGxlIHJhdGUoNDgwMDApCisgIGZyYW1lIGNvdW50KDQ4MDApLCByZXEuIGZyYW1lIGNvdW50KDQ4MDApCisgIG5vdGlmLiBmcmFtZSBjb3VudCg5NjApLCByZXEuIG5vdGlmLiBmcmFtZSBjb3VudCgyNDAwKQorICBpbnB1dCgyMjIpLCBsYXRlbmN5KDEwMCksIHNlbGVjdGVkIGRldmljZSBJZCgwKSwgcm91dGVkIGRldmljZSBJZCgxMSkKKworIyMjIyBUZXN0IDExIHN0YXR1cyAwCisgQXVkaW9SZWNvcmQ6OmR1bXAKKyAgc3RhdHVzKDApLCBhY3RpdmUoMCksIHNlc3Npb24gSWQoMTQ1KQorICBmbGFncygwKSwgcmVxLiBmbGFncygwKSwgYXVkaW8gc291cmNlKDApCisgIGZvcm1hdCgweDEpLCBjaGFubmVsIG1hc2soMHhjKSwgY2hhbm5lbCBjb3VudCgyKSwgc2FtcGxlIHJhdGUoNDgwMDApCisgIGZyYW1lIGNvdW50KDQ4MDApLCByZXEuIGZyYW1lIGNvdW50KDQ4MDApCisgIG5vdGlmLiBmcmFtZSBjb3VudCg5NjApLCByZXEuIG5vdGlmLiBmcmFtZSBjb3VudCgyNDAwKQorICBpbnB1dCgyMzApLCBsYXRlbmN5KDEwMCksIHNlbGVjdGVkIGRldmljZSBJZCgwKSwgcm91dGVkIGRldmljZSBJZCgxMSkKKworIyMjIyBUZXN0IDEyIHN0YXR1cyAwCisgQXVkaW9SZWNvcmQ6OmR1bXAKKyAgc3RhdHVzKDApLCBhY3RpdmUoMCksIHNlc3Npb24gSWQoMTUzKQorICBmbGFncygwKSwgcmVxLiBmbGFncygwKSwgYXVkaW8gc291cmNlKDApCisgIGZvcm1hdCgweDEpLCBjaGFubmVsIG1hc2soMHgxMCksIGNoYW5uZWwgY291bnQoMSksIHNhbXBsZSByYXRlKDQ4MDAwKQorICBmcmFtZSBjb3VudCgyODgwKSwgcmVxLiBmcmFtZSBjb3VudCgyODgwKQorICBub3RpZi4gZnJhbWUgY291bnQoOTYwKSwgcmVxLiBub3RpZi4gZnJhbWUgY291bnQoMCkKKyAgaW5wdXQoMjM4KSwgbGF0ZW5jeSg2MCksIHNlbGVjdGVkIGRldmljZSBJZCgwKSwgcm91dGVkIGRldmljZSBJZCgxMSkKKworIyMjIyBUZXN0IDEzIHN0YXR1cyAwCisgQXVkaW9SZWNvcmQ6OmR1bXAKKyAgc3RhdHVzKDApLCBhY3RpdmUoMCksIHNlc3Npb24gSWQoMTYxKQorICBmbGFncygwKSwgcmVxLiBmbGFncygwKSwgYXVkaW8gc291cmNlKDApCisgIGZvcm1hdCgweDEpLCBjaGFubmVsIG1hc2soMHgxMCksIGNoYW5uZWwgY291bnQoMSksIHNhbXBsZSByYXRlKDQ4MDAwKQorICBmcmFtZSBjb3VudCg0ODAwMCksIHJlcS4gZnJhbWUgY291bnQoNDgwMDApCisgIG5vdGlmLiBmcmFtZSBjb3VudCg5NjApLCByZXEuIG5vdGlmLiBmcmFtZSBjb3VudCgwKQorICBpbnB1dCgyNDYpLCBsYXRlbmN5KDEwMDApLCBzZWxlY3RlZCBkZXZpY2UgSWQoMCksIHJvdXRlZCBkZXZpY2UgSWQoMTEpCisKKyMjIyMgVGVzdCAxNCBzdGF0dXMgMAorIEF1ZGlvUmVjb3JkOjpkdW1wCisgIHN0YXR1cygwKSwgYWN0aXZlKDApLCBzZXNzaW9uIElkKDE2OSkKKyAgZmxhZ3MoMCksIHJlcS4gZmxhZ3MoMCksIGF1ZGlvIHNvdXJjZSgwKQorICBmb3JtYXQoMHgxKSwgY2hhbm5lbCBtYXNrKDB4MTApLCBjaGFubmVsIGNvdW50KDEpLCBzYW1wbGUgcmF0ZSg0ODAwMCkKKyAgZnJhbWUgY291bnQoMTIwMDApLCByZXEuIGZyYW1lIGNvdW50KDEyMDAwKQorICBub3RpZi4gZnJhbWUgY291bnQoOTYwKSwgcmVxLiBub3RpZi4gZnJhbWUgY291bnQoNjAwMCkKKyAgaW5wdXQoMjU0KSwgbGF0ZW5jeSgyNTApLCBzZWxlY3RlZCBkZXZpY2UgSWQoMCksIHJvdXRlZCBkZXZpY2UgSWQoMTEpCisKKyMjIyMgVGVzdCAxNSBzdGF0dXMgMAorIEF1ZGlvUmVjb3JkOjpkdW1wCisgIHN0YXR1cygwKSwgYWN0aXZlKDApLCBzZXNzaW9uIElkKDE3NykKKyAgZmxhZ3MoMHgxKSwgcmVxLiBmbGFncygweDEpLCBhdWRpbyBzb3VyY2UoMCkKKyAgZm9ybWF0KDB4MSksIGNoYW5uZWwgbWFzaygweGMpLCBjaGFubmVsIGNvdW50KDIpLCBzYW1wbGUgcmF0ZSg0ODAwMCkKKyAgZnJhbWUgY291bnQoNDA5NiksIHJlcS4gZnJhbWUgY291bnQoNDA5NikKKyAgbm90aWYuIGZyYW1lIGNvdW50KDk2KSwgcmVxLiBub3RpZi4gZnJhbWUgY291bnQoMCkKKyAgaW5wdXQoMjYyKSwgbGF0ZW5jeSg4NSksIHNlbGVjdGVkIGRldmljZSBJZCgwKSwgcm91dGVkIGRldmljZSBJZCgxMSkKKworIyMjIyBUZXN0IDE2IHN0YXR1cyAwCisgQXVkaW9SZWNvcmQ6OmR1bXAKKyAgc3RhdHVzKDApLCBhY3RpdmUoMCksIHNlc3Npb24gSWQoMTg1KQorICBmbGFncygwKSwgcmVxLiBmbGFncygweDUpLCBhdWRpbyBzb3VyY2UoMCkKKyAgZm9ybWF0KDB4MSksIGNoYW5uZWwgbWFzaygweGMpLCBjaGFubmVsIGNvdW50KDIpLCBzYW1wbGUgcmF0ZSg0NDEwMCkKKyAgZnJhbWUgY291bnQoMjY2NCksIHJlcS4gZnJhbWUgY291bnQoMjY2NCkKKyAgbm90aWYuIGZyYW1lIGNvdW50KDg4OCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDApCisgIGlucHV0KDI3OCksIGxhdGVuY3koNjApLCBzZWxlY3RlZCBkZXZpY2UgSWQoMCksIHJvdXRlZCBkZXZpY2UgSWQoMTEpCisKKyMjIyMgVGVzdCAxNyBzdGF0dXMgMAorIEF1ZGlvUmVjb3JkOjpkdW1wCisgIHN0YXR1cygwKSwgYWN0aXZlKDApLCBzZXNzaW9uIElkKDEwMDEpCisgIGZsYWdzKDApLCByZXEuIGZsYWdzKDApLCBhdWRpbyBzb3VyY2UoMCkKKyAgZm9ybWF0KDB4MSksIGNoYW5uZWwgbWFzaygweDEwKSwgY2hhbm5lbCBjb3VudCgxKSwgc2FtcGxlIHJhdGUoNDgwMDApCisgIGZyYW1lIGNvdW50KDI4ODApLCByZXEuIGZyYW1lIGNvdW50KDI4ODApCisgIG5vdGlmLiBmcmFtZSBjb3VudCg5NjApLCByZXEuIG5vdGlmLiBmcmFtZSBjb3VudCgwKQorICBpbnB1dCgyODYpLCBsYXRlbmN5KDYwKSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDExKQorCisjIyMjIFRlc3QgMTggc3RhdHVzIDAKKyBBdWRpb1JlY29yZDo6ZHVtcAorICBzdGF0dXMoMCksIGFjdGl2ZSgwKSwgc2Vzc2lvbiBJZCgxOTMpCisgIGZsYWdzKDApLCByZXEuIGZsYWdzKDApLCBhdWRpbyBzb3VyY2UoMSkKKyAgZm9ybWF0KDB4MSksIGNoYW5uZWwgbWFzaygweDEwKSwgY2hhbm5lbCBjb3VudCgxKSwgc2FtcGxlIHJhdGUoNDgwMDApCisgIGZyYW1lIGNvdW50KDI4ODApLCByZXEuIGZyYW1lIGNvdW50KDI4ODApCisgIG5vdGlmLiBmcmFtZSBjb3VudCg5NjApLCByZXEuIG5vdGlmLiBmcmFtZSBjb3VudCgwKQorICBpbnB1dCgyOTQpLCBsYXRlbmN5KDYwKSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDExKQorCisjIyMjIFRlc3QgMTkgc3RhdHVzIDAKKyBBdWRpb1JlY29yZDo6ZHVtcAorICBzdGF0dXMoMCksIGFjdGl2ZSgwKSwgc2Vzc2lvbiBJZCgyMDEpCisgIGZsYWdzKDApLCByZXEuIGZsYWdzKDApLCBhdWRpbyBzb3VyY2UoNSkKKyAgZm9ybWF0KDB4MSksIGNoYW5uZWwgbWFzaygweDEwKSwgY2hhbm5lbCBjb3VudCgxKSwgc2FtcGxlIHJhdGUoNDgwMDApCisgIGZyYW1lIGNvdW50KDI4ODApLCByZXEuIGZyYW1lIGNvdW50KDI4ODApCisgIG5vdGlmLiBmcmFtZSBjb3VudCg5NjApLCByZXEuIG5vdGlmLiBmcmFtZSBjb3VudCgwKQorICBpbnB1dCgzMDIpLCBsYXRlbmN5KDYwKSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDEyKQorCisjIyMjIFRlc3QgMjAgc3RhdHVzIDAKKyBBdWRpb1JlY29yZDo6ZHVtcAorICBzdGF0dXMoMCksIGFjdGl2ZSgwKSwgc2Vzc2lvbiBJZCgyMDkpCisgIGZsYWdzKDApLCByZXEuIGZsYWdzKDApLCBhdWRpbyBzb3VyY2UoNikKKyAgZm9ybWF0KDB4MSksIGNoYW5uZWwgbWFzaygweDEwKSwgY2hhbm5lbCBjb3VudCgxKSwgc2FtcGxlIHJhdGUoNDgwMDApCisgIGZyYW1lIGNvdW50KDI4ODApLCByZXEuIGZyYW1lIGNvdW50KDI4ODApCisgIG5vdGlmLiBmcmFtZSBjb3VudCg5NjApLCByZXEuIG5vdGlmLiBmcmFtZSBjb3VudCgwKQorICBpbnB1dCgzMTApLCBsYXRlbmN5KDYwKSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDExKQorCisjIyMjIFRlc3QgMjEgc3RhdHVzIDAKKyBBdWRpb1JlY29yZDo6ZHVtcAorICBzdGF0dXMoMCksIGFjdGl2ZSgwKSwgc2Vzc2lvbiBJZCgyMTcpCisgIGZsYWdzKDApLCByZXEuIGZsYWdzKDApLCBhdWRpbyBzb3VyY2UoNykKKyAgZm9ybWF0KDB4MSksIGNoYW5uZWwgbWFzaygweDEwKSwgY2hhbm5lbCBjb3VudCgxKSwgc2FtcGxlIHJhdGUoNDgwMDApCisgIGZyYW1lIGNvdW50KDI4ODApLCByZXEuIGZyYW1lIGNvdW50KDI4ODApCisgIG5vdGlmLiBmcmFtZSBjb3VudCg5NjApLCByZXEuIG5vdGlmLiBmcmFtZSBjb3VudCgwKQorICBpbnB1dCgzMTgpLCBsYXRlbmN5KDYwKSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDExKQorCisjIyMjIFRlc3QgMjIgc3RhdHVzIDAKKyBBdWRpb1JlY29yZDo6ZHVtcAorICBzdGF0dXMoMCksIGFjdGl2ZSgwKSwgc2Vzc2lvbiBJZCgyMjUpCisgIGZsYWdzKDApLCByZXEuIGZsYWdzKDApLCBhdWRpbyBzb3VyY2UoOSkKKyAgZm9ybWF0KDB4MSksIGNoYW5uZWwgbWFzaygweDEwKSwgY2hhbm5lbCBjb3VudCgxKSwgc2FtcGxlIHJhdGUoNDgwMDApCisgIGZyYW1lIGNvdW50KDI4ODApLCByZXEuIGZyYW1lIGNvdW50KDI4ODApCisgIG5vdGlmLiBmcmFtZSBjb3VudCg5NjApLCByZXEuIG5vdGlmLiBmcmFtZSBjb3VudCgwKQorICBpbnB1dCgzMjYpLCBsYXRlbmN5KDYwKSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDExKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvdGVzdF9jcmVhdGVfYXVkaW9yZWNvcmQuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvdGVzdF9jcmVhdGVfYXVkaW9yZWNvcmQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNmE3MzQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy90ZXN0X2NyZWF0ZV9hdWRpb3JlY29yZC5jcHAKQEAgLTAsMCArMSwxMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8YmluZGVyL01lbW9yeUJhc2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+CisjaW5jbHVkZSA8YmluZGVyL01lbW9yeUhlYXBCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZWNvcmQuaD4KKworI2luY2x1ZGUgInRlc3RfY3JlYXRlX3V0aWxzLmgiCisKKyNkZWZpbmUgTlVNX0FSR1VNRU5UUyA4CisjZGVmaW5lIFZFUlNJT05fVkFMVUUgIjEuMCIKKyNkZWZpbmUgUEFDS0FHRV9OQU1FICAiQXVkaW9SZWNvcmQgdGVzdCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitpbnQgdGVzdFJlY29yZChGSUxFICppbnB1dEZpbGUsIGludCBvdXRwdXRGaWxlRmQpCit7CisgICAgY2hhciBsaW5lW01BWF9JTlBVVF9GSUxFX0xJTkVfTEVOR1RIXTsKKyAgICB1aW50MzJfdCB0ZXN0Q291bnQgPSAwOworICAgIFZlY3RvcjxTdHJpbmcxNj4gYXJnczsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIGlmIChpbnB1dEZpbGUgPT0gbnVsbHB0cikgeworICAgICAgICBzcDxBdWRpb1JlY29yZD4gcmVjb3JkID0gbmV3IEF1ZGlvUmVjb3JkKEFVRElPX1NPVVJDRV9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogc2FtcGxlUmF0ZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX0lOX01PTk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nMTYoUEFDS0FHRV9OQU1FKSk7CisgICAgICAgIGlmIChyZWNvcmQgPT0gMCB8fCByZWNvcmQtPmluaXRDaGVjaygpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICB3cml0ZShvdXRwdXRGaWxlRmQsICJFcnJvciBjcmVhdGluZyBBdWRpb1JlY29yZFxuIiwKKyAgICAgICAgICAgICAgICAgIHNpemVvZigiRXJyb3IgY3JlYXRpbmcgQXVkaW9SZWNvcmRcbiIpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlY29yZC0+ZHVtcChvdXRwdXRGaWxlRmQsIGFyZ3MpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vIGNoZWNrIHZlcnNpb24KKyAgICBpZiAoIWNoZWNrVmVyc2lvbihpbnB1dEZpbGUsIFZFUlNJT05fVkFMVUUpKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHdoaWxlIChyZWFkTGluZShpbnB1dEZpbGUsIGxpbmUsIE1BWF9JTlBVVF9GSUxFX0xJTkVfTEVOR1RIKSA9PSAwKSB7CisgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGU7CisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdDsKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2s7CisgICAgICAgIHNpemVfdCBmcmFtZUNvdW50OworICAgICAgICBpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lczsKKyAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFnczsKKyAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZDsKKyAgICAgICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2U7CisgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzOworICAgICAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgICAgIGNoYXIgc3RhdHVzU3RyW01BWF9PVVRQVVRfRklMRV9MSU5FX0xFTkdUSF07CisgICAgICAgIGJvb2wgZmFzdCA9IGZhbHNlOworCisgICAgICAgIGlmIChzc2NhbmYobGluZSwgIiAldSAleCAleCAlenUgJWQgJXggJXUgJXUiLAorICAgICAgICAgICAgICAgICAgICZzYW1wbGVSYXRlLCAmZm9ybWF0LCAmY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgJmZyYW1lQ291bnQsICZub3RpZmljYXRpb25GcmFtZXMsCisgICAgICAgICAgICAgICAgICAgJmZsYWdzLCAmc2Vzc2lvbklkLCAmaW5wdXRTb3VyY2UpICE9IE5VTV9BUkdVTUVOVFMpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTWFsZm9ybWVkIGxpbmUgZm9yIHRlc3QgIyV1IGluIGlucHV0IGZpbGVcbiIsIHRlc3RDb3VudCsxKTsKKyAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICB0ZXN0Q291bnQrKzsKKworICAgICAgICBpZiAoKGZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19GQVNUKSAhPSAwKSB7CisgICAgICAgICAgICBmYXN0ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIG1lbXNldCgmYXR0cmlidXRlcywgMCwgc2l6ZW9mKGF0dHJpYnV0ZXMpKTsKKyAgICAgICAgYXR0cmlidXRlcy5zb3VyY2UgPSBpbnB1dFNvdXJjZTsKKworICAgICAgICBzcDxBdWRpb1JlY29yZD4gcmVjb3JkID0gbmV3IEF1ZGlvUmVjb3JkKFN0cmluZzE2KFBBQ0tBR0VfTkFNRSkpOworCisgICAgICAgIHJlY29yZC0+c2V0KEFVRElPX1NPVVJDRV9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgZmFzdCA/IGNhbGxiYWNrIDogbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgZmFzdCA/IEF1ZGlvUmVjb3JkOjpUUkFOU0ZFUl9DQUxMQkFDSyA6IEF1ZGlvUmVjb3JkOjpUUkFOU0ZFUl9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgIGdldHVpZCgpLAorICAgICAgICAgICAgICAgICAgIGdldHBpZCgpLAorICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgIEFVRElPX1BPUlRfSEFORExFX05PTkUpOworICAgICAgICBzdGF0dXMgPSByZWNvcmQtPmluaXRDaGVjaygpOworICAgICAgICBzcHJpbnRmKHN0YXR1c1N0ciwgIlxuIyMjIyBUZXN0ICV1IHN0YXR1cyAlZFxuIiwgdGVzdENvdW50LCBzdGF0dXMpOworICAgICAgICB3cml0ZShvdXRwdXRGaWxlRmQsIHN0YXR1c1N0ciwgc3RybGVuKHN0YXR1c1N0cikpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICByZWNvcmQtPmR1bXAob3V0cHV0RmlsZUZkLCBhcmdzKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgcmV0dXJuIGFuZHJvaWQ6Om1haW4oYXJnYywgYXJndiwgYW5kcm9pZDo6dGVzdFJlY29yZCk7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL3Rlc3RfY3JlYXRlX2F1ZGlvdHJhY2suY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvdGVzdF9jcmVhdGVfYXVkaW90cmFjay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y5YjkyNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL3Rlc3RfY3JlYXRlX2F1ZGlvdHJhY2suY3BwCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlCYXNlLmg+CisjaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgorI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlIZWFwQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVHJhY2suaD4KKworI2luY2x1ZGUgInRlc3RfY3JlYXRlX3V0aWxzLmgiCisKKyNkZWZpbmUgTlVNX0FSR1VNRU5UUyAxMAorI2RlZmluZSBWRVJTSU9OX1ZBTFVFICIxLjAiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworaW50IHRlc3RUcmFjayhGSUxFICppbnB1dEZpbGUsIGludCBvdXRwdXRGaWxlRmQpCit7CisgICAgY2hhciBsaW5lW01BWF9JTlBVVF9GSUxFX0xJTkVfTEVOR1RIXTsKKyAgICB1aW50MzJfdCB0ZXN0Q291bnQgPSAwOworICAgIFZlY3RvcjxTdHJpbmcxNj4gYXJnczsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIGlmIChpbnB1dEZpbGUgPT0gbnVsbHB0cikgeworICAgICAgICBzcDxBdWRpb1RyYWNrPiB0cmFjayA9IG5ldyBBdWRpb1RyYWNrKEFVRElPX1NUUkVBTV9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogc2FtcGxlUmF0ZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pOworICAgICAgICBpZiAodHJhY2sgPT0gMCB8fCB0cmFjay0+aW5pdENoZWNrKCkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHdyaXRlKG91dHB1dEZpbGVGZCwgIkVycm9yIGNyZWF0aW5nIEF1ZGlvVHJhY2tcbiIsCisgICAgICAgICAgICAgICAgICBzaXplb2YoIkVycm9yIGNyZWF0aW5nIEF1ZGlvVHJhY2tcbiIpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyYWNrLT5kdW1wKG91dHB1dEZpbGVGZCwgYXJncyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gY2hlY2sgdmVyc2lvbgorICAgIGlmICghY2hlY2tWZXJzaW9uKGlucHV0RmlsZSwgVkVSU0lPTl9WQUxVRSkpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgd2hpbGUgKHJlYWRMaW5lKGlucHV0RmlsZSwgbGluZSwgTUFYX0lOUFVUX0ZJTEVfTElORV9MRU5HVEgpID09IDApIHsKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZTsKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0OworICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzazsKKyAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQ7CisgICAgICAgIGludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzOworICAgICAgICB1aW50MzJfdCB1c2VTaGFyZWRCdWZmZXI7CisgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzOworICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkOworICAgICAgICBhdWRpb191c2FnZV90IHVzYWdlOworICAgICAgICBhdWRpb19jb250ZW50X3R5cGVfdCBjb250ZW50VHlwZTsKKyAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXM7CisgICAgICAgIHNwPElNZW1vcnk+IHNoYXJlZEJ1ZmZlcjsKKyAgICAgICAgc3A8TWVtb3J5RGVhbGVyPiBoZWFwOworICAgICAgICBhdWRpb19vZmZsb2FkX2luZm9fdCBvZmZsb2FkSW5mbyA9IEFVRElPX0lORk9fSU5JVElBTElaRVI7CisgICAgICAgIHN0YXR1c190IHN0YXR1czsKKyAgICAgICAgY2hhciBzdGF0dXNTdHJbTUFYX09VVFBVVF9GSUxFX0xJTkVfTEVOR1RIXTsKKyAgICAgICAgYm9vbCBvZmZsb2FkID0gZmFsc2U7CisgICAgICAgIGJvb2wgZmFzdCA9IGZhbHNlOworCisgICAgICAgIGlmIChzc2NhbmYobGluZSwgIiAldSAleCAleCAlenUgJWQgJXUgJXggJXUgJXUgJXUiLAorICAgICAgICAgICAgICAgICAgICZzYW1wbGVSYXRlLCAmZm9ybWF0LCAmY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgJmZyYW1lQ291bnQsICZub3RpZmljYXRpb25GcmFtZXMsICZ1c2VTaGFyZWRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgJmZsYWdzLCAmc2Vzc2lvbklkLCAmdXNhZ2UsICZjb250ZW50VHlwZSkgIT0gTlVNX0FSR1VNRU5UUykgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJNYWxmb3JtZWQgbGluZSBmb3IgdGVzdCAjJXUgaW4gaW5wdXQgZmlsZVxuIiwgdGVzdENvdW50KzEpOworICAgICAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHRlc3RDb3VudCsrOworCisgICAgICAgIGlmICh1c2VTaGFyZWRCdWZmZXIgIT0gMCkgeworICAgICAgICAgICAgc2l6ZV90IGhlYXBTaXplID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoYW5uZWxNYXNrKSAqCisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KSAqIGZyYW1lQ291bnQ7CisgICAgICAgICAgICBoZWFwID0gbmV3IE1lbW9yeURlYWxlcihoZWFwU2l6ZSwgIkF1ZGlvVHJhY2sgSGVhcCBCYXNlIik7CisgICAgICAgICAgICBzaGFyZWRCdWZmZXIgPSBoZWFwLT5hbGxvY2F0ZShoZWFwU2l6ZSk7CisgICAgICAgICAgICBmcmFtZUNvdW50ID0gMDsKKyAgICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lcyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDApIHsKKyAgICAgICAgICAgIG9mZmxvYWRJbmZvLnNhbXBsZV9yYXRlID0gc2FtcGxlUmF0ZTsKKyAgICAgICAgICAgIG9mZmxvYWRJbmZvLmNoYW5uZWxfbWFzayA9IGNoYW5uZWxNYXNrOworICAgICAgICAgICAgb2ZmbG9hZEluZm8uZm9ybWF0ID0gZm9ybWF0OworICAgICAgICAgICAgb2ZmbG9hZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpICE9IDApIHsKKyAgICAgICAgICAgIGZhc3QgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgbWVtc2V0KCZhdHRyaWJ1dGVzLCAwLCBzaXplb2YoYXR0cmlidXRlcykpOworICAgICAgICBhdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSA9IGNvbnRlbnRUeXBlOworICAgICAgICBhdHRyaWJ1dGVzLnVzYWdlID0gdXNhZ2U7CisKKyAgICAgICAgc3A8QXVkaW9UcmFjaz4gdHJhY2sgPSBuZXcgQXVkaW9UcmFjaygpOworCisgICAgICAgIHRyYWNrLT5zZXQoQVVESU9fU1RSRUFNX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAoZmFzdCB8fCBvZmZsb2FkKSA/IGNhbGxiYWNrIDogbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICBzaGFyZWRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICgoZmFzdCAmJiBzaGFyZWRCdWZmZXIgPT0gMCkgfHwgb2ZmbG9hZCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9UcmFjazo6VFJBTlNGRVJfQ0FMTEJBQ0sgOiBBdWRpb1RyYWNrOjpUUkFOU0ZFUl9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgIG9mZmxvYWQgPyAmb2ZmbG9hZEluZm8gOiBudWxscHRyLAorICAgICAgICAgICAgICAgICAgIGdldHVpZCgpLAorICAgICAgICAgICAgICAgICAgIGdldHBpZCgpLAorICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgIGZhbHNlLAorICAgICAgICAgICAgICAgICAgIDEuMGYsCisgICAgICAgICAgICAgICAgICAgQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CisgICAgICAgIHN0YXR1cyA9IHRyYWNrLT5pbml0Q2hlY2soKTsKKyAgICAgICAgc3ByaW50ZihzdGF0dXNTdHIsICJcbiMjIyMgVGVzdCAldSBzdGF0dXMgJWRcbiIsIHRlc3RDb3VudCwgc3RhdHVzKTsKKyAgICAgICAgd3JpdGUob3V0cHV0RmlsZUZkLCBzdGF0dXNTdHIsIHN0cmxlbihzdGF0dXNTdHIpKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgdHJhY2stPmR1bXAob3V0cHV0RmlsZUZkLCBhcmdzKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgcmV0dXJuIGFuZHJvaWQ6Om1haW4oYXJnYywgYXJndiwgYW5kcm9pZDo6dGVzdFRyYWNrKTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvdGVzdF9jcmVhdGVfdXRpbHMuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvdGVzdF9jcmVhdGVfdXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYTFmMTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy90ZXN0X2NyZWF0ZV91dGlscy5jcHAKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAidGVzdF9jcmVhdGVfdXRpbHMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitpbnQgcmVhZExpbmUoRklMRSAqaW5wdXRGaWxlLCBjaGFyICpsaW5lLCBpbnQgc2l6ZSkgeworICAgIGludCByZXQgPSAwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGNoYXIgKnN0ciA9IGZnZXRzKGxpbmUsIHNpemUsIGlucHV0RmlsZSk7CisgICAgICAgIGlmIChzdHIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmVvZihpbnB1dEZpbGUpICE9IDAgfHwgZmVycm9yKGlucHV0RmlsZSkgIT0gMCkgeworICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RybGVuKHN0cikgIT0gMCAmJiBzdHJbMF0gIT0gQ09NTUVOVF9DSEFSKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitib29sIGNoZWNrVmVyc2lvbihGSUxFICppbnB1dEZpbGUsIGNvbnN0IGNoYXIgKnZlcnNpb24pCit7CisgICAgY2hhciBsaW5lW01BWF9JTlBVVF9GSUxFX0xJTkVfTEVOR1RIXTsKKyAgICBjaGFyIHZlcnNpb25LZXlbTUFYX0lOUFVUX0ZJTEVfTElORV9MRU5HVEhdOworICAgIGNoYXIgdmVyc2lvblZhbHVlW01BWF9JTlBVVF9GSUxFX0xJTkVfTEVOR1RIXTsKKworICAgIGlmIChyZWFkTGluZShpbnB1dEZpbGUsIGxpbmUsIE1BWF9JTlBVVF9GSUxFX0xJTkVfTEVOR1RIKSAhPSAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTWlzc2luZyB2ZXJzaW9uIGluIGlucHV0IGZpbGVcbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHNzY2FuZihsaW5lLCAiICVzICVzIiwgdmVyc2lvbktleSwgdmVyc2lvblZhbHVlKSAhPSAyKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTWFsZm9ybWVkIHZlcnNpb24gaW4gaW5wdXQgZmlsZVxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHN0cmNtcCh2ZXJzaW9uS2V5LCBWRVJTSU9OX0tFWSkgIT0gMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1hbGZvcm1lZCB2ZXJzaW9uIGluIGlucHV0IGZpbGVcbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChzdHJjbXAodmVyc2lvblZhbHVlLCB2ZXJzaW9uKSAhPSAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiV3JvbmcgaW5wdXQgZmlsZSB2ZXJzaW9uICVzIGV4cGVjdGluZyAlc1xuIiwgdmVyc2lvblZhbHVlLCB2ZXJzaW9uKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBjYWxsYmFjayhpbnQgZXZlbnQgX191bnVzZWQsIHZvaWQqIHVzZXIgX191bnVzZWQsIHZvaWQgKmluZm8gX191bnVzZWQpCit7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndiwgdGVzdF9mdW5jX3QgdGVzdEZ1bmMpCit7CisgICAgRklMRSAqaW5wdXRGaWxlID0gbnVsbHB0cjsKKyAgICBpbnQgb3V0cHV0RmlsZUZkID0gU1RET1VUX0ZJTEVOTzsKKyAgICBtb2RlX3QgbW9kZSA9IFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JUkdSUCB8IFNfSVJPVEg7CisgICAgaW50IHJldCA9IDA7CisKKyAgICBpZiAoYXJnYyA+IDUpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgWy1pIGlucHV0X3BhcmFtcy50eHRdIFstbyBvdXRwdXRfcGFyYW1zLnR4dF1cbiIsIGFyZ3ZbMF0pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBhcmd2Kys7CisgICAgd2hpbGUgKCphcmd2KSB7CisgICAgICAgIGlmIChzdHJjbXAoKmFyZ3YsICItaSIpID09IDApIHsKKyAgICAgICAgICAgIGFyZ3YrKzsKKyAgICAgICAgICAgIGlmICgqYXJndikgeworICAgICAgICAgICAgICAgIGlucHV0RmlsZSA9IGZvcGVuKCphcmd2LCAiciIpOworICAgICAgICAgICAgICAgIGlmIChpbnB1dEZpbGUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICByZXQgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc3RyY21wKCphcmd2LCAiLW8iKSA9PSAwKSB7CisgICAgICAgICAgICBhcmd2Kys7CisgICAgICAgICAgICBpZiAoKmFyZ3YpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXRGaWxlRmQgPSBvcGVuKCphcmd2LCBPX1dST05MWXxPX0NSRUFULCBtb2RlKTsKKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0RmlsZUZkIDwgMCkgeworICAgICAgICAgICAgICAgICAgICByZXQgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFyZ3YrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoKmFyZ3YpIHsKKyAgICAgICAgICAgIGFyZ3YrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldCA9IHRlc3RGdW5jKGlucHV0RmlsZSwgb3V0cHV0RmlsZUZkKTsKKworICAgIGlmIChpbnB1dEZpbGUpIHsKKyAgICAgICAgZmNsb3NlKGlucHV0RmlsZSk7CisgICAgfQorICAgIGlmIChvdXRwdXRGaWxlRmQgPj0gMCAmJiBvdXRwdXRGaWxlRmQgIT0gU1RET1VUX0ZJTEVOTykgeworICAgICAgICBjbG9zZShvdXRwdXRGaWxlRmQpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL3Rlc3RfY3JlYXRlX3V0aWxzLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy90ZXN0X2NyZWF0ZV91dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZDY0NmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy90ZXN0X2NyZWF0ZV91dGlscy5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjZGVmaW5lIE1BWF9JTlBVVF9GSUxFX0xJTkVfTEVOR1RIIDUxMgorI2RlZmluZSBNQVhfT1VUUFVUX0ZJTEVfTElORV9MRU5HVEggNTEyCisKKyNkZWZpbmUgQ09NTUVOVF9DSEFSICcjJworI2RlZmluZSBWRVJTSU9OX0tFWSAidmVyc2lvbiIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitpbnQgcmVhZExpbmUoRklMRSAqaW5wdXRGaWxlLCBjaGFyICpsaW5lLCBpbnQgc2l6ZSk7CisKK2Jvb2wgY2hlY2tWZXJzaW9uKEZJTEUgKmlucHV0RmlsZSwgY29uc3QgY2hhciAqdmVyc2lvbik7CisKK3ZvaWQgY2FsbGJhY2soaW50IGV2ZW50LCB2b2lkKiB1c2VyLCB2b2lkICppbmZvKTsKKwordHlwZWRlZiBpbnQgKCp0ZXN0X2Z1bmNfdCkoRklMRSAqaW5wdXRGaWxlLCBpbnQgb3V0cHV0RmlsZUZkKTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2LCB0ZXN0X2Z1bmNfdCB0ZXN0RnVuYyk7CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy90cmFja190ZXN0X2lucHV0X3YxLjBfcmVmLnR4dCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL3RyYWNrX3Rlc3RfaW5wdXRfdjEuMF9yZWYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MjNmZjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy90cmFja190ZXN0X2lucHV0X3YxLjBfcmVmLnR4dApAQCAtMCwwICsxLDQwIEBACit2ZXJzaW9uIDEuMAorIyBJbnB1dCBmaWxlIGZvciB0ZXN0X2NyZWF0ZV9hdWRpb3RyYWNrCisjIEFkZCBvbmUgbGluZSBmb3IgZWFjaCB0ZXN0ZWQgQXVkaW9UcmFjayBjb25zdHJ1Y3RvciB3aXRoIHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzOgorIyBzYW1wbGVSYXRlIGZvcm1hdCAJY2hhbm5lbE1hc2sgZnJhbWVDb3VudCBub3RpZmljYXRpb25GcmFtZXMgc2hhcmVkQnVmZmVyIGZsYWdzIHNlc3Npb25JZCB1c2FnZSBjb250ZW50VHlwZQorIyBzYW1wbGUgcmF0ZSB0ZXN0cworICA0ODAwMCAgICAgIDB4MSAgICAJMHgzICAgICAgICAgNDgwMCAgICAgICAyNDAwICAgICAgICAgICAgICAgMCAgICAgICAgICAgIDB4MCAgIDAgICAgICAgICAxICAgICAyCisgIDI0MDAwICAgICAgMHgxICAgIAkweDMgICAgICAgICA0ODAwICAgICAgIDI0MDAgICAgICAgICAgICAgICAwICAgICAgICAgICAgMHgwICAgMCAgICAgICAgIDEgICAgIDIKKyAgMTYwMDAgICAgICAweDEgICAgCTB4MyAgICAgICAgIDQ4MDAgICAgICAgMjQwMCAgICAgICAgICAgICAgIDAgICAgICAgICAgICAweDAgICAwICAgICAgICAgMSAgICAgMgorICAgODAwMCAgICAgIDB4MSAgICAJMHgzICAgICAgICAgNDgwMCAgICAgICAyNDAwICAgICAgICAgICAgICAgMCAgICAgICAgICAgIDB4MCAgIDAgICAgICAgICAxICAgICAyCisgIDQ0MTAwICAgICAgMHgxICAgIAkweDMgICAgICAgICA0NDEwICAgICAgIDIyMDUgICAgICAgICAgICAgICAwICAgICAgICAgICAgMHgwICAgMCAgICAgICAgIDEgICAgIDIKKyAgMjIwNTAgICAgICAweDEgICAgCTB4MyAgICAgICAgIDQ0MTAgICAgICAgMjIwNSAgICAgICAgICAgICAgIDAgICAgICAgICAgICAweDAgICAwICAgICAgICAgMSAgICAgMgorICAxMTAyNSAgICAgIDB4MSAgICAJMHgzICAgICAgICAgNDQxMCAgICAgICAyMjA1ICAgICAgICAgICAgICAgMCAgICAgICAgICAgIDB4MCAgIDAgICAgICAgICAxICAgICAyCisjIGZvcm1hdCB0ZXN0cworICA0ODAwMCAgICAgIDB4MiAgICAJMHgzICAgICAgICAgNDgwMCAgICAgICAyNDAwICAgICAgICAgICAgICAgMCAgICAgICAgICAgIDB4MCAgIDAgICAgICAgICAxICAgICAyCisgIDQ4MDAwICAgICAgMHgzICAgIAkweDMgICAgICAgICA0ODAwICAgICAgIDI0MDAgICAgICAgICAgICAgICAwICAgICAgICAgICAgMHgwICAgMCAgICAgICAgIDEgICAgIDIKKyAgNDgwMDAgICAgICAweDUgICAgCTB4MyAgICAgICAgIDQ4MDAgICAgICAgMjQwMCAgICAgICAgICAgICAgIDAgICAgICAgICAgICAweDAgICAwICAgICAgICAgMSAgICAgMgorIyBjaGFubmVsIG1hc2sgdGVzdHMKKyAgNDgwMDAgICAgICAweDEgICAgCTB4MSAgICAgICAgIDQ4MDAgICAgICAgMjQwMCAgICAgICAgICAgICAgIDAgICAgICAgICAgICAweDAgICAwICAgICAgICAgMSAgICAgMgorICA0ODAwMCAgICAgIDB4MSAgICAJMHgzRiAgICAgICAgNDgwMCAgICAgICAyNDAwICAgICAgICAgICAgICAgMCAgICAgICAgICAgIDB4MCAgIDAgICAgICAgICAxICAgICAyCisgIDQ4MDAwICAgICAgMHgxICAgIAkweDYzRiAgICAgICA0ODAwICAgICAgIDI0MDAgICAgICAgICAgICAgICAwICAgICAgICAgICAgMHgwICAgMCAgICAgICAgIDEgICAgIDIKKyMgZnJhbWVjb3VudCB0ZXN0cworICA0ODAwMCAgICAgIDB4MSAgICAJMHgzICAgICAgICAgMCAgICAgICAgICAwICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgIDB4MCAgIDAgICAgICAgICAxICAgICAyCisgIDQ4MDAwICAgICAgMHgxICAgIAkweDMgICAgICAgICA0ODAwMCAgICAgIDAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgMHgwICAgMCAgICAgICAgIDEgICAgIDIKKyAgNDgwMDAgICAgICAweDEgICAgCTB4MyAgICAgICAgIDAgICAgICAgICAgLTIgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAweDQgICAwICAgICAgICAgMSAgICAgMgorIyBzaGFyZWQgbWVtb3J5IHRlc3RzCisgIDQ4MDAwICAgICAgMHgxICAgIAkweDMgICAgICAgICA0ODAwICAgICAgIDI0MDAgICAgICAgICAgICAgICAxICAgICAgICAgICAgMHgwICAgMCAgICAgICAgIDEgICAgIDIKKyAgNDgwMDAgICAgICAweDEgICAgCTB4MyAgICAgICAgIDQ4MDAgICAgICAgMjQwMCAgICAgICAgICAgICAgIDEgICAgICAgICAgICAweDQgICAwICAgICAgICAgMSAgICAgMgorIyBmbGFncyB0ZXN0CisgIDQ4MDAwICAgICAgMHgxICAgIAkweDMgICAgICAgICA0ODAwICAgICAgIDI0MDAgICAgICAgICAgICAgICAwICAgICAgICAgICAgMHg0ICAgMCAgICAgICAgIDEgICAgIDIKKyAgNDgwMDAgICAgICAweDEgICAgCTB4MyAgICAgICAgIDQ4MDAgICAgICAgMjQwMCAgICAgICAgICAgICAgIDAgICAgICAgICAgICAweDggICAwICAgICAgICAgMSAgICAgMgorICA0NDEwMCAgICAgIDB4MTAwMDAwMCAgMHgzICAgICAgICAgNDgwMCAgICAgICAyNDAwICAgICAgICAgICAgICAgMCAgICAgICAgICAgIDB4MTEgIDAgICAgICAgICAxICAgICAyCisjIHNlc3Npb24gdGVzdHMKKyAgNDgwMDAgICAgICAweDEgICAgCTB4MyAgICAgICAgIDQ4MDAgICAgICAgMjQwMCAgICAgICAgICAgICAgIDAgICAgICAgICAgICAweDAgICAxMDAxICAgICAgMSAgICAgMgorIyBhdHRyaWJ1dGVzIHRlc3RzCisgIDQ4MDAwICAgICAgMHgxICAgIAkweDMgICAgICAgICA0ODAwICAgICAgIDI0MDAgICAgICAgICAgICAgICAwICAgICAgICAgICAgMHgwICAgMCAgICAgICAgIDAgICAgIDAKKyAgNDgwMDAgICAgICAweDEgICAgCTB4MyAgICAgICAgIDQ4MDAgICAgICAgMjQwMCAgICAgICAgICAgICAgIDAgICAgICAgICAgICAweDAgICAwICAgICAgICAgMiAgICAgMQorICA0ODAwMCAgICAgIDB4MSAgICAJMHgzICAgICAgICAgNDgwMCAgICAgICAyNDAwICAgICAgICAgICAgICAgMCAgICAgICAgICAgIDB4MCAgIDAgICAgICAgICA0ICAgICAyCisgIDQ4MDAwICAgICAgMHgxICAgIAkweDMgICAgICAgICA0ODAwICAgICAgIDI0MDAgICAgICAgICAgICAgICAwICAgICAgICAgICAgMHgwICAgMCAgICAgICAgIDUgICAgIDIKKyAgNDgwMDAgICAgICAweDEgICAgCTB4MyAgICAgICAgIDQ4MDAgICAgICAgMjQwMCAgICAgICAgICAgICAgIDAgICAgICAgICAgICAweDAgICAwICAgICAgICAgMTEgICAgMQorICA0ODAwMCAgICAgIDB4MSAgICAJMHgzICAgICAgICAgNDgwMCAgICAgICAyNDAwICAgICAgICAgICAgICAgMCAgICAgICAgICAgIDB4MCAgIDAgICAgICAgICAxMiAgICAxCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy90cmFja190ZXN0X291dHB1dF92MS4wX3JlZl93YWxsZXllLnR4dCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL3RyYWNrX3Rlc3Rfb3V0cHV0X3YxLjBfcmVmX3dhbGxleWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZTQzM2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy90cmFja190ZXN0X291dHB1dF92MS4wX3JlZl93YWxsZXllLnR4dApAQCAtMCwwICsxLDMwOCBAQAorCisjIyMjIFRlc3QgMSBzdGF0dXMgMAorIEF1ZGlvVHJhY2s6OmR1bXAKKyAgc3RhdHVzKDApLCBzdGF0ZSgxKSwgc2Vzc2lvbiBJZCg0OSksIGZsYWdzKDApCisgIHN0cmVhbSB0eXBlKDMpLCBsZWZ0IC0gcmlnaHQgdm9sdW1lKDEuMDAwMDAwLCAxLjAwMDAwMCkKKyAgZm9ybWF0KDEpLCBjaGFubmVsIG1hc2soMyksIGNoYW5uZWwgY291bnQoMikKKyAgc2FtcGxlIHJhdGUoNDgwMDApLCBvcmlnaW5hbCBzYW1wbGUgcmF0ZSg0ODAwMCksIHNwZWVkKDEuMDAwMDAwKQorICBmcmFtZSBjb3VudCg0ODAwKSwgcmVxLiBmcmFtZSBjb3VudCg0ODAwKQorICBub3RpZi4gZnJhbWUgY291bnQoMjQwMCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDI0MDApLCByZXEuIG5vdGlmLiBwZXIgYnVmZigwKQorICBsYXRlbmN5ICgxNTApLCBzZWxlY3RlZCBkZXZpY2UgSWQoMCksIHJvdXRlZCBkZXZpY2UgSWQoMikKKyAgb3V0cHV0KDEzKSBBRiBsYXRlbmN5ICg1MCkgQUYgZnJhbWUgY291bnQoOTYwKSBBRiBTYW1wbGVSYXRlKDQ4MDAwKQorCisjIyMjIFRlc3QgMiBzdGF0dXMgMAorIEF1ZGlvVHJhY2s6OmR1bXAKKyAgc3RhdHVzKDApLCBzdGF0ZSgxKSwgc2Vzc2lvbiBJZCg1NyksIGZsYWdzKDApCisgIHN0cmVhbSB0eXBlKDMpLCBsZWZ0IC0gcmlnaHQgdm9sdW1lKDEuMDAwMDAwLCAxLjAwMDAwMCkKKyAgZm9ybWF0KDEpLCBjaGFubmVsIG1hc2soMyksIGNoYW5uZWwgY291bnQoMikKKyAgc2FtcGxlIHJhdGUoMjQwMDApLCBvcmlnaW5hbCBzYW1wbGUgcmF0ZSgyNDAwMCksIHNwZWVkKDEuMDAwMDAwKQorICBmcmFtZSBjb3VudCg0ODAwKSwgcmVxLiBmcmFtZSBjb3VudCg0ODAwKQorICBub3RpZi4gZnJhbWUgY291bnQoMTYwMCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDI0MDApLCByZXEuIG5vdGlmLiBwZXIgYnVmZigwKQorICBsYXRlbmN5ICgyNTApLCBzZWxlY3RlZCBkZXZpY2UgSWQoMCksIHJvdXRlZCBkZXZpY2UgSWQoMikKKyAgb3V0cHV0KDEzKSBBRiBsYXRlbmN5ICg1MCkgQUYgZnJhbWUgY291bnQoOTYwKSBBRiBTYW1wbGVSYXRlKDQ4MDAwKQorCisjIyMjIFRlc3QgMyBzdGF0dXMgMAorIEF1ZGlvVHJhY2s6OmR1bXAKKyAgc3RhdHVzKDApLCBzdGF0ZSgxKSwgc2Vzc2lvbiBJZCg2NSksIGZsYWdzKDApCisgIHN0cmVhbSB0eXBlKDMpLCBsZWZ0IC0gcmlnaHQgdm9sdW1lKDEuMDAwMDAwLCAxLjAwMDAwMCkKKyAgZm9ybWF0KDEpLCBjaGFubmVsIG1hc2soMyksIGNoYW5uZWwgY291bnQoMikKKyAgc2FtcGxlIHJhdGUoMTYwMDApLCBvcmlnaW5hbCBzYW1wbGUgcmF0ZSgxNjAwMCksIHNwZWVkKDEuMDAwMDAwKQorICBmcmFtZSBjb3VudCg0ODAwKSwgcmVxLiBmcmFtZSBjb3VudCg0ODAwKQorICBub3RpZi4gZnJhbWUgY291bnQoMTYwMCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDI0MDApLCByZXEuIG5vdGlmLiBwZXIgYnVmZigwKQorICBsYXRlbmN5ICgzNTApLCBzZWxlY3RlZCBkZXZpY2UgSWQoMCksIHJvdXRlZCBkZXZpY2UgSWQoMikKKyAgb3V0cHV0KDEzKSBBRiBsYXRlbmN5ICg1MCkgQUYgZnJhbWUgY291bnQoOTYwKSBBRiBTYW1wbGVSYXRlKDQ4MDAwKQorCisjIyMjIFRlc3QgNCBzdGF0dXMgMAorIEF1ZGlvVHJhY2s6OmR1bXAKKyAgc3RhdHVzKDApLCBzdGF0ZSgxKSwgc2Vzc2lvbiBJZCg3MyksIGZsYWdzKDApCisgIHN0cmVhbSB0eXBlKDMpLCBsZWZ0IC0gcmlnaHQgdm9sdW1lKDEuMDAwMDAwLCAxLjAwMDAwMCkKKyAgZm9ybWF0KDEpLCBjaGFubmVsIG1hc2soMyksIGNoYW5uZWwgY291bnQoMikKKyAgc2FtcGxlIHJhdGUoODAwMCksIG9yaWdpbmFsIHNhbXBsZSByYXRlKDgwMDApLCBzcGVlZCgxLjAwMDAwMCkKKyAgZnJhbWUgY291bnQoNDgwMCksIHJlcS4gZnJhbWUgY291bnQoNDgwMCkKKyAgbm90aWYuIGZyYW1lIGNvdW50KDE2MDApLCByZXEuIG5vdGlmLiBmcmFtZSBjb3VudCgyNDAwKSwgcmVxLiBub3RpZi4gcGVyIGJ1ZmYoMCkKKyAgbGF0ZW5jeSAoNjUwKSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDIpCisgIG91dHB1dCgxMykgQUYgbGF0ZW5jeSAoNTApIEFGIGZyYW1lIGNvdW50KDk2MCkgQUYgU2FtcGxlUmF0ZSg0ODAwMCkKKworIyMjIyBUZXN0IDUgc3RhdHVzIDAKKyBBdWRpb1RyYWNrOjpkdW1wCisgIHN0YXR1cygwKSwgc3RhdGUoMSksIHNlc3Npb24gSWQoODEpLCBmbGFncygwKQorICBzdHJlYW0gdHlwZSgzKSwgbGVmdCAtIHJpZ2h0IHZvbHVtZSgxLjAwMDAwMCwgMS4wMDAwMDApCisgIGZvcm1hdCgxKSwgY2hhbm5lbCBtYXNrKDMpLCBjaGFubmVsIGNvdW50KDIpCisgIHNhbXBsZSByYXRlKDQ0MTAwKSwgb3JpZ2luYWwgc2FtcGxlIHJhdGUoNDQxMDApLCBzcGVlZCgxLjAwMDAwMCkKKyAgZnJhbWUgY291bnQoNDQxMCksIHJlcS4gZnJhbWUgY291bnQoNDQxMCkKKyAgbm90aWYuIGZyYW1lIGNvdW50KDE0NzApLCByZXEuIG5vdGlmLiBmcmFtZSBjb3VudCgyMjA1KSwgcmVxLiBub3RpZi4gcGVyIGJ1ZmYoMCkKKyAgbGF0ZW5jeSAoMTUwKSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDIpCisgIG91dHB1dCgxMykgQUYgbGF0ZW5jeSAoNTApIEFGIGZyYW1lIGNvdW50KDk2MCkgQUYgU2FtcGxlUmF0ZSg0ODAwMCkKKworIyMjIyBUZXN0IDYgc3RhdHVzIDAKKyBBdWRpb1RyYWNrOjpkdW1wCisgIHN0YXR1cygwKSwgc3RhdGUoMSksIHNlc3Npb24gSWQoODkpLCBmbGFncygwKQorICBzdHJlYW0gdHlwZSgzKSwgbGVmdCAtIHJpZ2h0IHZvbHVtZSgxLjAwMDAwMCwgMS4wMDAwMDApCisgIGZvcm1hdCgxKSwgY2hhbm5lbCBtYXNrKDMpLCBjaGFubmVsIGNvdW50KDIpCisgIHNhbXBsZSByYXRlKDIyMDUwKSwgb3JpZ2luYWwgc2FtcGxlIHJhdGUoMjIwNTApLCBzcGVlZCgxLjAwMDAwMCkKKyAgZnJhbWUgY291bnQoNDQxMCksIHJlcS4gZnJhbWUgY291bnQoNDQxMCkKKyAgbm90aWYuIGZyYW1lIGNvdW50KDE0NzApLCByZXEuIG5vdGlmLiBmcmFtZSBjb3VudCgyMjA1KSwgcmVxLiBub3RpZi4gcGVyIGJ1ZmYoMCkKKyAgbGF0ZW5jeSAoMjUwKSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDIpCisgIG91dHB1dCgxMykgQUYgbGF0ZW5jeSAoNTApIEFGIGZyYW1lIGNvdW50KDk2MCkgQUYgU2FtcGxlUmF0ZSg0ODAwMCkKKworIyMjIyBUZXN0IDcgc3RhdHVzIDAKKyBBdWRpb1RyYWNrOjpkdW1wCisgIHN0YXR1cygwKSwgc3RhdGUoMSksIHNlc3Npb24gSWQoOTcpLCBmbGFncygwKQorICBzdHJlYW0gdHlwZSgzKSwgbGVmdCAtIHJpZ2h0IHZvbHVtZSgxLjAwMDAwMCwgMS4wMDAwMDApCisgIGZvcm1hdCgxKSwgY2hhbm5lbCBtYXNrKDMpLCBjaGFubmVsIGNvdW50KDIpCisgIHNhbXBsZSByYXRlKDExMDI1KSwgb3JpZ2luYWwgc2FtcGxlIHJhdGUoMTEwMjUpLCBzcGVlZCgxLjAwMDAwMCkKKyAgZnJhbWUgY291bnQoNDQxMCksIHJlcS4gZnJhbWUgY291bnQoNDQxMCkKKyAgbm90aWYuIGZyYW1lIGNvdW50KDE0NzApLCByZXEuIG5vdGlmLiBmcmFtZSBjb3VudCgyMjA1KSwgcmVxLiBub3RpZi4gcGVyIGJ1ZmYoMCkKKyAgbGF0ZW5jeSAoNDUwKSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDIpCisgIG91dHB1dCgxMykgQUYgbGF0ZW5jeSAoNTApIEFGIGZyYW1lIGNvdW50KDk2MCkgQUYgU2FtcGxlUmF0ZSg0ODAwMCkKKworIyMjIyBUZXN0IDggc3RhdHVzIDAKKyBBdWRpb1RyYWNrOjpkdW1wCisgIHN0YXR1cygwKSwgc3RhdGUoMSksIHNlc3Npb24gSWQoMTA1KSwgZmxhZ3MoMCkKKyAgc3RyZWFtIHR5cGUoMyksIGxlZnQgLSByaWdodCB2b2x1bWUoMS4wMDAwMDAsIDEuMDAwMDAwKQorICBmb3JtYXQoMiksIGNoYW5uZWwgbWFzaygzKSwgY2hhbm5lbCBjb3VudCgyKQorICBzYW1wbGUgcmF0ZSg0ODAwMCksIG9yaWdpbmFsIHNhbXBsZSByYXRlKDQ4MDAwKSwgc3BlZWQoMS4wMDAwMDApCisgIGZyYW1lIGNvdW50KDQ4MDApLCByZXEuIGZyYW1lIGNvdW50KDQ4MDApCisgIG5vdGlmLiBmcmFtZSBjb3VudCgyNDAwKSwgcmVxLiBub3RpZi4gZnJhbWUgY291bnQoMjQwMCksIHJlcS4gbm90aWYuIHBlciBidWZmKDApCisgIGxhdGVuY3kgKDE1MCksIHNlbGVjdGVkIGRldmljZSBJZCgwKSwgcm91dGVkIGRldmljZSBJZCgyKQorICBvdXRwdXQoMTMpIEFGIGxhdGVuY3kgKDUwKSBBRiBmcmFtZSBjb3VudCg5NjApIEFGIFNhbXBsZVJhdGUoNDgwMDApCisKKyMjIyMgVGVzdCA5IHN0YXR1cyAwCisgQXVkaW9UcmFjazo6ZHVtcAorICBzdGF0dXMoMCksIHN0YXRlKDEpLCBzZXNzaW9uIElkKDExMyksIGZsYWdzKDApCisgIHN0cmVhbSB0eXBlKDMpLCBsZWZ0IC0gcmlnaHQgdm9sdW1lKDEuMDAwMDAwLCAxLjAwMDAwMCkKKyAgZm9ybWF0KDMpLCBjaGFubmVsIG1hc2soMyksIGNoYW5uZWwgY291bnQoMikKKyAgc2FtcGxlIHJhdGUoNDgwMDApLCBvcmlnaW5hbCBzYW1wbGUgcmF0ZSg0ODAwMCksIHNwZWVkKDEuMDAwMDAwKQorICBmcmFtZSBjb3VudCg0ODAwKSwgcmVxLiBmcmFtZSBjb3VudCg0ODAwKQorICBub3RpZi4gZnJhbWUgY291bnQoMjQwMCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDI0MDApLCByZXEuIG5vdGlmLiBwZXIgYnVmZigwKQorICBsYXRlbmN5ICgxODApLCBzZWxlY3RlZCBkZXZpY2UgSWQoMCksIHJvdXRlZCBkZXZpY2UgSWQoMikKKyAgb3V0cHV0KDI5KSBBRiBsYXRlbmN5ICg4MCkgQUYgZnJhbWUgY291bnQoMTkyMCkgQUYgU2FtcGxlUmF0ZSg0ODAwMCkKKworIyMjIyBUZXN0IDEwIHN0YXR1cyAwCisgQXVkaW9UcmFjazo6ZHVtcAorICBzdGF0dXMoMCksIHN0YXRlKDEpLCBzZXNzaW9uIElkKDEyMSksIGZsYWdzKDApCisgIHN0cmVhbSB0eXBlKDMpLCBsZWZ0IC0gcmlnaHQgdm9sdW1lKDEuMDAwMDAwLCAxLjAwMDAwMCkKKyAgZm9ybWF0KDUpLCBjaGFubmVsIG1hc2soMyksIGNoYW5uZWwgY291bnQoMikKKyAgc2FtcGxlIHJhdGUoNDgwMDApLCBvcmlnaW5hbCBzYW1wbGUgcmF0ZSg0ODAwMCksIHNwZWVkKDEuMDAwMDAwKQorICBmcmFtZSBjb3VudCg0ODAwKSwgcmVxLiBmcmFtZSBjb3VudCg0ODAwKQorICBub3RpZi4gZnJhbWUgY291bnQoMjQwMCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDI0MDApLCByZXEuIG5vdGlmLiBwZXIgYnVmZigwKQorICBsYXRlbmN5ICgxODApLCBzZWxlY3RlZCBkZXZpY2UgSWQoMCksIHJvdXRlZCBkZXZpY2UgSWQoMikKKyAgb3V0cHV0KDI5KSBBRiBsYXRlbmN5ICg4MCkgQUYgZnJhbWUgY291bnQoMTkyMCkgQUYgU2FtcGxlUmF0ZSg0ODAwMCkKKworIyMjIyBUZXN0IDExIHN0YXR1cyAwCisgQXVkaW9UcmFjazo6ZHVtcAorICBzdGF0dXMoMCksIHN0YXRlKDEpLCBzZXNzaW9uIElkKDEyOSksIGZsYWdzKDApCisgIHN0cmVhbSB0eXBlKDMpLCBsZWZ0IC0gcmlnaHQgdm9sdW1lKDEuMDAwMDAwLCAxLjAwMDAwMCkKKyAgZm9ybWF0KDEpLCBjaGFubmVsIG1hc2soMSksIGNoYW5uZWwgY291bnQoMSkKKyAgc2FtcGxlIHJhdGUoNDgwMDApLCBvcmlnaW5hbCBzYW1wbGUgcmF0ZSg0ODAwMCksIHNwZWVkKDEuMDAwMDAwKQorICBmcmFtZSBjb3VudCg0ODAwKSwgcmVxLiBmcmFtZSBjb3VudCg0ODAwKQorICBub3RpZi4gZnJhbWUgY291bnQoMjQwMCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDI0MDApLCByZXEuIG5vdGlmLiBwZXIgYnVmZigwKQorICBsYXRlbmN5ICgxNTApLCBzZWxlY3RlZCBkZXZpY2UgSWQoMCksIHJvdXRlZCBkZXZpY2UgSWQoMikKKyAgb3V0cHV0KDEzKSBBRiBsYXRlbmN5ICg1MCkgQUYgZnJhbWUgY291bnQoOTYwKSBBRiBTYW1wbGVSYXRlKDQ4MDAwKQorCisjIyMjIFRlc3QgMTIgc3RhdHVzIDAKKyBBdWRpb1RyYWNrOjpkdW1wCisgIHN0YXR1cygwKSwgc3RhdGUoMSksIHNlc3Npb24gSWQoMTM3KSwgZmxhZ3MoMCkKKyAgc3RyZWFtIHR5cGUoMyksIGxlZnQgLSByaWdodCB2b2x1bWUoMS4wMDAwMDAsIDEuMDAwMDAwKQorICBmb3JtYXQoMSksIGNoYW5uZWwgbWFzaygzZiksIGNoYW5uZWwgY291bnQoNikKKyAgc2FtcGxlIHJhdGUoNDgwMDApLCBvcmlnaW5hbCBzYW1wbGUgcmF0ZSg0ODAwMCksIHNwZWVkKDEuMDAwMDAwKQorICBmcmFtZSBjb3VudCg0ODAwKSwgcmVxLiBmcmFtZSBjb3VudCg0ODAwKQorICBub3RpZi4gZnJhbWUgY291bnQoMjQwMCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDI0MDApLCByZXEuIG5vdGlmLiBwZXIgYnVmZigwKQorICBsYXRlbmN5ICgxNTApLCBzZWxlY3RlZCBkZXZpY2UgSWQoMCksIHJvdXRlZCBkZXZpY2UgSWQoMikKKyAgb3V0cHV0KDEzKSBBRiBsYXRlbmN5ICg1MCkgQUYgZnJhbWUgY291bnQoOTYwKSBBRiBTYW1wbGVSYXRlKDQ4MDAwKQorCisjIyMjIFRlc3QgMTMgc3RhdHVzIDAKKyBBdWRpb1RyYWNrOjpkdW1wCisgIHN0YXR1cygwKSwgc3RhdGUoMSksIHNlc3Npb24gSWQoMTQ1KSwgZmxhZ3MoMCkKKyAgc3RyZWFtIHR5cGUoMyksIGxlZnQgLSByaWdodCB2b2x1bWUoMS4wMDAwMDAsIDEuMDAwMDAwKQorICBmb3JtYXQoMSksIGNoYW5uZWwgbWFzayg2M2YpLCBjaGFubmVsIGNvdW50KDgpCisgIHNhbXBsZSByYXRlKDQ4MDAwKSwgb3JpZ2luYWwgc2FtcGxlIHJhdGUoNDgwMDApLCBzcGVlZCgxLjAwMDAwMCkKKyAgZnJhbWUgY291bnQoNDgwMCksIHJlcS4gZnJhbWUgY291bnQoNDgwMCkKKyAgbm90aWYuIGZyYW1lIGNvdW50KDI0MDApLCByZXEuIG5vdGlmLiBmcmFtZSBjb3VudCgyNDAwKSwgcmVxLiBub3RpZi4gcGVyIGJ1ZmYoMCkKKyAgbGF0ZW5jeSAoMTUwKSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDIpCisgIG91dHB1dCgxMykgQUYgbGF0ZW5jeSAoNTApIEFGIGZyYW1lIGNvdW50KDk2MCkgQUYgU2FtcGxlUmF0ZSg0ODAwMCkKKworIyMjIyBUZXN0IDE0IHN0YXR1cyAwCisgQXVkaW9UcmFjazo6ZHVtcAorICBzdGF0dXMoMCksIHN0YXRlKDEpLCBzZXNzaW9uIElkKDE1MyksIGZsYWdzKDApCisgIHN0cmVhbSB0eXBlKDMpLCBsZWZ0IC0gcmlnaHQgdm9sdW1lKDEuMDAwMDAwLCAxLjAwMDAwMCkKKyAgZm9ybWF0KDEpLCBjaGFubmVsIG1hc2soMyksIGNoYW5uZWwgY291bnQoMikKKyAgc2FtcGxlIHJhdGUoNDgwMDApLCBvcmlnaW5hbCBzYW1wbGUgcmF0ZSg0ODAwMCksIHNwZWVkKDEuMDAwMDAwKQorICBmcmFtZSBjb3VudCgxOTI0KSwgcmVxLiBmcmFtZSBjb3VudCgxOTI0KQorICBub3RpZi4gZnJhbWUgY291bnQoOTYyKSwgcmVxLiBub3RpZi4gZnJhbWUgY291bnQoMCksIHJlcS4gbm90aWYuIHBlciBidWZmKDApCisgIGxhdGVuY3kgKDkwKSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDIpCisgIG91dHB1dCgxMykgQUYgbGF0ZW5jeSAoNTApIEFGIGZyYW1lIGNvdW50KDk2MCkgQUYgU2FtcGxlUmF0ZSg0ODAwMCkKKworIyMjIyBUZXN0IDE1IHN0YXR1cyAwCisgQXVkaW9UcmFjazo6ZHVtcAorICBzdGF0dXMoMCksIHN0YXRlKDEpLCBzZXNzaW9uIElkKDE2MSksIGZsYWdzKDApCisgIHN0cmVhbSB0eXBlKDMpLCBsZWZ0IC0gcmlnaHQgdm9sdW1lKDEuMDAwMDAwLCAxLjAwMDAwMCkKKyAgZm9ybWF0KDEpLCBjaGFubmVsIG1hc2soMyksIGNoYW5uZWwgY291bnQoMikKKyAgc2FtcGxlIHJhdGUoNDgwMDApLCBvcmlnaW5hbCBzYW1wbGUgcmF0ZSg0ODAwMCksIHNwZWVkKDEuMDAwMDAwKQorICBmcmFtZSBjb3VudCg0ODAwMCksIHJlcS4gZnJhbWUgY291bnQoNDgwMDApCisgIG5vdGlmLiBmcmFtZSBjb3VudCgyNDAwMCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDApLCByZXEuIG5vdGlmLiBwZXIgYnVmZigwKQorICBsYXRlbmN5ICgxMDUwKSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDIpCisgIG91dHB1dCgxMykgQUYgbGF0ZW5jeSAoNTApIEFGIGZyYW1lIGNvdW50KDk2MCkgQUYgU2FtcGxlUmF0ZSg0ODAwMCkKKworIyMjIyBUZXN0IDE2IHN0YXR1cyAwCisgQXVkaW9UcmFjazo6ZHVtcAorICBzdGF0dXMoMCksIHN0YXRlKDEpLCBzZXNzaW9uIElkKDE2OSksIGZsYWdzKDQpCisgIHN0cmVhbSB0eXBlKDMpLCBsZWZ0IC0gcmlnaHQgdm9sdW1lKDEuMDAwMDAwLCAxLjAwMDAwMCkKKyAgZm9ybWF0KDEpLCBjaGFubmVsIG1hc2soMyksIGNoYW5uZWwgY291bnQoMikKKyAgc2FtcGxlIHJhdGUoNDgwMDApLCBvcmlnaW5hbCBzYW1wbGUgcmF0ZSg0ODAwMCksIHNwZWVkKDEuMDAwMDAwKQorICBmcmFtZSBjb3VudCg0ODApLCByZXEuIGZyYW1lIGNvdW50KDQ4MCkKKyAgbm90aWYuIGZyYW1lIGNvdW50KDI0MCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDApLCByZXEuIG5vdGlmLiBwZXIgYnVmZigyKQorICBsYXRlbmN5ICg2MCksIHNlbGVjdGVkIGRldmljZSBJZCgwKSwgcm91dGVkIGRldmljZSBJZCgyKQorICBvdXRwdXQoMTMpIEFGIGxhdGVuY3kgKDUwKSBBRiBmcmFtZSBjb3VudCg5NjApIEFGIFNhbXBsZVJhdGUoNDgwMDApCisKKyMjIyMgVGVzdCAxNyBzdGF0dXMgMAorIEF1ZGlvVHJhY2s6OmR1bXAKKyAgc3RhdHVzKDApLCBzdGF0ZSgxKSwgc2Vzc2lvbiBJZCgxNzcpLCBmbGFncygwKQorICBzdHJlYW0gdHlwZSgzKSwgbGVmdCAtIHJpZ2h0IHZvbHVtZSgxLjAwMDAwMCwgMS4wMDAwMDApCisgIGZvcm1hdCgxKSwgY2hhbm5lbCBtYXNrKDMpLCBjaGFubmVsIGNvdW50KDIpCisgIHNhbXBsZSByYXRlKDQ4MDAwKSwgb3JpZ2luYWwgc2FtcGxlIHJhdGUoNDgwMDApLCBzcGVlZCgxLjAwMDAwMCkKKyAgZnJhbWUgY291bnQoNDgwMCksIHJlcS4gZnJhbWUgY291bnQoNDgwMCkKKyAgbm90aWYuIGZyYW1lIGNvdW50KDApLCByZXEuIG5vdGlmLiBmcmFtZSBjb3VudCgwKSwgcmVxLiBub3RpZi4gcGVyIGJ1ZmYoMCkKKyAgbGF0ZW5jeSAoMTUwKSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDIpCisgIG91dHB1dCgxMykgQUYgbGF0ZW5jeSAoNTApIEFGIGZyYW1lIGNvdW50KDk2MCkgQUYgU2FtcGxlUmF0ZSg0ODAwMCkKKworIyMjIyBUZXN0IDE4IHN0YXR1cyAwCisgQXVkaW9UcmFjazo6ZHVtcAorICBzdGF0dXMoMCksIHN0YXRlKDEpLCBzZXNzaW9uIElkKDE4NSksIGZsYWdzKDQpCisgIHN0cmVhbSB0eXBlKDMpLCBsZWZ0IC0gcmlnaHQgdm9sdW1lKDEuMDAwMDAwLCAxLjAwMDAwMCkKKyAgZm9ybWF0KDEpLCBjaGFubmVsIG1hc2soMyksIGNoYW5uZWwgY291bnQoMikKKyAgc2FtcGxlIHJhdGUoNDgwMDApLCBvcmlnaW5hbCBzYW1wbGUgcmF0ZSg0ODAwMCksIHNwZWVkKDEuMDAwMDAwKQorICBmcmFtZSBjb3VudCg0ODAwKSwgcmVxLiBmcmFtZSBjb3VudCg0ODAwKQorICBub3RpZi4gZnJhbWUgY291bnQoMCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDApLCByZXEuIG5vdGlmLiBwZXIgYnVmZigwKQorICBsYXRlbmN5ICgxNTApLCBzZWxlY3RlZCBkZXZpY2UgSWQoMCksIHJvdXRlZCBkZXZpY2UgSWQoMikKKyAgb3V0cHV0KDEzKSBBRiBsYXRlbmN5ICg1MCkgQUYgZnJhbWUgY291bnQoOTYwKSBBRiBTYW1wbGVSYXRlKDQ4MDAwKQorCisjIyMjIFRlc3QgMTkgc3RhdHVzIDAKKyBBdWRpb1RyYWNrOjpkdW1wCisgIHN0YXR1cygwKSwgc3RhdGUoMSksIHNlc3Npb24gSWQoMTkzKSwgZmxhZ3MoNCkKKyAgc3RyZWFtIHR5cGUoMyksIGxlZnQgLSByaWdodCB2b2x1bWUoMS4wMDAwMDAsIDEuMDAwMDAwKQorICBmb3JtYXQoMSksIGNoYW5uZWwgbWFzaygzKSwgY2hhbm5lbCBjb3VudCgyKQorICBzYW1wbGUgcmF0ZSg0ODAwMCksIG9yaWdpbmFsIHNhbXBsZSByYXRlKDQ4MDAwKSwgc3BlZWQoMS4wMDAwMDApCisgIGZyYW1lIGNvdW50KDQ4MDApLCByZXEuIGZyYW1lIGNvdW50KDQ4MDApCisgIG5vdGlmLiBmcmFtZSBjb3VudCgyNDApLCByZXEuIG5vdGlmLiBmcmFtZSBjb3VudCgyNDAwKSwgcmVxLiBub3RpZi4gcGVyIGJ1ZmYoMCkKKyAgbGF0ZW5jeSAoMTUwKSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDIpCisgIG91dHB1dCgxMykgQUYgbGF0ZW5jeSAoNTApIEFGIGZyYW1lIGNvdW50KDk2MCkgQUYgU2FtcGxlUmF0ZSg0ODAwMCkKKworIyMjIyBUZXN0IDIwIHN0YXR1cyAwCisgQXVkaW9UcmFjazo6ZHVtcAorICBzdGF0dXMoMCksIHN0YXRlKDEpLCBzZXNzaW9uIElkKDIwMSksIGZsYWdzKDgpCisgIHN0cmVhbSB0eXBlKDMpLCBsZWZ0IC0gcmlnaHQgdm9sdW1lKDEuMDAwMDAwLCAxLjAwMDAwMCkKKyAgZm9ybWF0KDEpLCBjaGFubmVsIG1hc2soMyksIGNoYW5uZWwgY291bnQoMikKKyAgc2FtcGxlIHJhdGUoNDgwMDApLCBvcmlnaW5hbCBzYW1wbGUgcmF0ZSg0ODAwMCksIHNwZWVkKDEuMDAwMDAwKQorICBmcmFtZSBjb3VudCg0ODAwKSwgcmVxLiBmcmFtZSBjb3VudCg0ODAwKQorICBub3RpZi4gZnJhbWUgY291bnQoMjQwMCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDI0MDApLCByZXEuIG5vdGlmLiBwZXIgYnVmZigwKQorICBsYXRlbmN5ICgxODApLCBzZWxlY3RlZCBkZXZpY2UgSWQoMCksIHJvdXRlZCBkZXZpY2UgSWQoMikKKyAgb3V0cHV0KDI5KSBBRiBsYXRlbmN5ICg4MCkgQUYgZnJhbWUgY291bnQoMTkyMCkgQUYgU2FtcGxlUmF0ZSg0ODAwMCkKKworIyMjIyBUZXN0IDIxIHN0YXR1cyAwCisgQXVkaW9UcmFjazo6ZHVtcAorICBzdGF0dXMoMCksIHN0YXRlKDEpLCBzZXNzaW9uIElkKDIwOSksIGZsYWdzKDExKQorICBzdHJlYW0gdHlwZSgzKSwgbGVmdCAtIHJpZ2h0IHZvbHVtZSgxLjAwMDAwMCwgMS4wMDAwMDApCisgIGZvcm1hdCgxMDAwMDAwKSwgY2hhbm5lbCBtYXNrKDMpLCBjaGFubmVsIGNvdW50KDIpCisgIHNhbXBsZSByYXRlKDQ0MTAwKSwgb3JpZ2luYWwgc2FtcGxlIHJhdGUoNDQxMDApLCBzcGVlZCgxLjAwMDAwMCkKKyAgZnJhbWUgY291bnQoNDgwMCksIHJlcS4gZnJhbWUgY291bnQoNDgwMCkKKyAgbm90aWYuIGZyYW1lIGNvdW50KDQ4MDApLCByZXEuIG5vdGlmLiBmcmFtZSBjb3VudCgyNDAwKSwgcmVxLiBub3RpZi4gcGVyIGJ1ZmYoMCkKKyAgbGF0ZW5jeSAoMjA0KSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDIpCisgIG91dHB1dCg1MykgQUYgbGF0ZW5jeSAoOTYpIEFGIGZyYW1lIGNvdW50KDI2MjE0NCkgQUYgU2FtcGxlUmF0ZSg0NDEwMCkKKworIyMjIyBUZXN0IDIyIHN0YXR1cyAwCisgQXVkaW9UcmFjazo6ZHVtcAorICBzdGF0dXMoMCksIHN0YXRlKDEpLCBzZXNzaW9uIElkKDEwMDEpLCBmbGFncygwKQorICBzdHJlYW0gdHlwZSgzKSwgbGVmdCAtIHJpZ2h0IHZvbHVtZSgxLjAwMDAwMCwgMS4wMDAwMDApCisgIGZvcm1hdCgxKSwgY2hhbm5lbCBtYXNrKDMpLCBjaGFubmVsIGNvdW50KDIpCisgIHNhbXBsZSByYXRlKDQ4MDAwKSwgb3JpZ2luYWwgc2FtcGxlIHJhdGUoNDgwMDApLCBzcGVlZCgxLjAwMDAwMCkKKyAgZnJhbWUgY291bnQoNDgwMCksIHJlcS4gZnJhbWUgY291bnQoNDgwMCkKKyAgbm90aWYuIGZyYW1lIGNvdW50KDI0MDApLCByZXEuIG5vdGlmLiBmcmFtZSBjb3VudCgyNDAwKSwgcmVxLiBub3RpZi4gcGVyIGJ1ZmYoMCkKKyAgbGF0ZW5jeSAoMTUwKSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDIpCisgIG91dHB1dCgxMykgQUYgbGF0ZW5jeSAoNTApIEFGIGZyYW1lIGNvdW50KDk2MCkgQUYgU2FtcGxlUmF0ZSg0ODAwMCkKKworIyMjIyBUZXN0IDIzIHN0YXR1cyAwCisgQXVkaW9UcmFjazo6ZHVtcAorICBzdGF0dXMoMCksIHN0YXRlKDEpLCBzZXNzaW9uIElkKDIxNyksIGZsYWdzKDApCisgIHN0cmVhbSB0eXBlKDMpLCBsZWZ0IC0gcmlnaHQgdm9sdW1lKDEuMDAwMDAwLCAxLjAwMDAwMCkKKyAgZm9ybWF0KDEpLCBjaGFubmVsIG1hc2soMyksIGNoYW5uZWwgY291bnQoMikKKyAgc2FtcGxlIHJhdGUoNDgwMDApLCBvcmlnaW5hbCBzYW1wbGUgcmF0ZSg0ODAwMCksIHNwZWVkKDEuMDAwMDAwKQorICBmcmFtZSBjb3VudCg0ODAwKSwgcmVxLiBmcmFtZSBjb3VudCg0ODAwKQorICBub3RpZi4gZnJhbWUgY291bnQoMjQwMCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDI0MDApLCByZXEuIG5vdGlmLiBwZXIgYnVmZigwKQorICBsYXRlbmN5ICgxNTApLCBzZWxlY3RlZCBkZXZpY2UgSWQoMCksIHJvdXRlZCBkZXZpY2UgSWQoMikKKyAgb3V0cHV0KDEzKSBBRiBsYXRlbmN5ICg1MCkgQUYgZnJhbWUgY291bnQoOTYwKSBBRiBTYW1wbGVSYXRlKDQ4MDAwKQorCisjIyMjIFRlc3QgMjQgc3RhdHVzIDAKKyBBdWRpb1RyYWNrOjpkdW1wCisgIHN0YXR1cygwKSwgc3RhdGUoMSksIHNlc3Npb24gSWQoMjI1KSwgZmxhZ3MoMCkKKyAgc3RyZWFtIHR5cGUoMCksIGxlZnQgLSByaWdodCB2b2x1bWUoMS4wMDAwMDAsIDEuMDAwMDAwKQorICBmb3JtYXQoMSksIGNoYW5uZWwgbWFzaygzKSwgY2hhbm5lbCBjb3VudCgyKQorICBzYW1wbGUgcmF0ZSg0ODAwMCksIG9yaWdpbmFsIHNhbXBsZSByYXRlKDQ4MDAwKSwgc3BlZWQoMS4wMDAwMDApCisgIGZyYW1lIGNvdW50KDQ4MDApLCByZXEuIGZyYW1lIGNvdW50KDQ4MDApCisgIG5vdGlmLiBmcmFtZSBjb3VudCgyNDAwKSwgcmVxLiBub3RpZi4gZnJhbWUgY291bnQoMjQwMCksIHJlcS4gbm90aWYuIHBlciBidWZmKDApCisgIGxhdGVuY3kgKDE0MCksIHNlbGVjdGVkIGRldmljZSBJZCgwKSwgcm91dGVkIGRldmljZSBJZCgxKQorICBvdXRwdXQoNDUpIEFGIGxhdGVuY3kgKDQwKSBBRiBmcmFtZSBjb3VudCg5NjApIEFGIFNhbXBsZVJhdGUoNDgwMDApCisKKyMjIyMgVGVzdCAyNSBzdGF0dXMgMAorIEF1ZGlvVHJhY2s6OmR1bXAKKyAgc3RhdHVzKDApLCBzdGF0ZSgxKSwgc2Vzc2lvbiBJZCgyMzMpLCBmbGFncygwKQorICBzdHJlYW0gdHlwZSg0KSwgbGVmdCAtIHJpZ2h0IHZvbHVtZSgxLjAwMDAwMCwgMS4wMDAwMDApCisgIGZvcm1hdCgxKSwgY2hhbm5lbCBtYXNrKDMpLCBjaGFubmVsIGNvdW50KDIpCisgIHNhbXBsZSByYXRlKDQ4MDAwKSwgb3JpZ2luYWwgc2FtcGxlIHJhdGUoNDgwMDApLCBzcGVlZCgxLjAwMDAwMCkKKyAgZnJhbWUgY291bnQoNDgwMCksIHJlcS4gZnJhbWUgY291bnQoNDgwMCkKKyAgbm90aWYuIGZyYW1lIGNvdW50KDI0MDApLCByZXEuIG5vdGlmLiBmcmFtZSBjb3VudCgyNDAwKSwgcmVxLiBub3RpZi4gcGVyIGJ1ZmYoMCkKKyAgbGF0ZW5jeSAoMTUwKSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDMpCisgIG91dHB1dCgxMykgQUYgbGF0ZW5jeSAoNTApIEFGIGZyYW1lIGNvdW50KDk2MCkgQUYgU2FtcGxlUmF0ZSg0ODAwMCkKKworIyMjIyBUZXN0IDI2IHN0YXR1cyAwCisgQXVkaW9UcmFjazo6ZHVtcAorICBzdGF0dXMoMCksIHN0YXRlKDEpLCBzZXNzaW9uIElkKDI0MSksIGZsYWdzKDApCisgIHN0cmVhbSB0eXBlKDUpLCBsZWZ0IC0gcmlnaHQgdm9sdW1lKDEuMDAwMDAwLCAxLjAwMDAwMCkKKyAgZm9ybWF0KDEpLCBjaGFubmVsIG1hc2soMyksIGNoYW5uZWwgY291bnQoMikKKyAgc2FtcGxlIHJhdGUoNDgwMDApLCBvcmlnaW5hbCBzYW1wbGUgcmF0ZSg0ODAwMCksIHNwZWVkKDEuMDAwMDAwKQorICBmcmFtZSBjb3VudCg0ODAwKSwgcmVxLiBmcmFtZSBjb3VudCg0ODAwKQorICBub3RpZi4gZnJhbWUgY291bnQoMjQwMCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDI0MDApLCByZXEuIG5vdGlmLiBwZXIgYnVmZigwKQorICBsYXRlbmN5ICgxNTApLCBzZWxlY3RlZCBkZXZpY2UgSWQoMCksIHJvdXRlZCBkZXZpY2UgSWQoMykKKyAgb3V0cHV0KDEzKSBBRiBsYXRlbmN5ICg1MCkgQUYgZnJhbWUgY291bnQoOTYwKSBBRiBTYW1wbGVSYXRlKDQ4MDAwKQorCisjIyMjIFRlc3QgMjcgc3RhdHVzIDAKKyBBdWRpb1RyYWNrOjpkdW1wCisgIHN0YXR1cygwKSwgc3RhdGUoMSksIHNlc3Npb24gSWQoMjQ5KSwgZmxhZ3MoMCkKKyAgc3RyZWFtIHR5cGUoMTApLCBsZWZ0IC0gcmlnaHQgdm9sdW1lKDEuMDAwMDAwLCAxLjAwMDAwMCkKKyAgZm9ybWF0KDEpLCBjaGFubmVsIG1hc2soMyksIGNoYW5uZWwgY291bnQoMikKKyAgc2FtcGxlIHJhdGUoNDgwMDApLCBvcmlnaW5hbCBzYW1wbGUgcmF0ZSg0ODAwMCksIHNwZWVkKDEuMDAwMDAwKQorICBmcmFtZSBjb3VudCg0ODAwKSwgcmVxLiBmcmFtZSBjb3VudCg0ODAwKQorICBub3RpZi4gZnJhbWUgY291bnQoMjQwMCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDI0MDApLCByZXEuIG5vdGlmLiBwZXIgYnVmZigwKQorICBsYXRlbmN5ICgxNTApLCBzZWxlY3RlZCBkZXZpY2UgSWQoMCksIHJvdXRlZCBkZXZpY2UgSWQoMikKKyAgb3V0cHV0KDEzKSBBRiBsYXRlbmN5ICg1MCkgQUYgZnJhbWUgY291bnQoOTYwKSBBRiBTYW1wbGVSYXRlKDQ4MDAwKQorCisjIyMjIFRlc3QgMjggc3RhdHVzIDAKKyBBdWRpb1RyYWNrOjpkdW1wCisgIHN0YXR1cygwKSwgc3RhdGUoMSksIHNlc3Npb24gSWQoMjU3KSwgZmxhZ3MoMCkKKyAgc3RyZWFtIHR5cGUoMyksIGxlZnQgLSByaWdodCB2b2x1bWUoMS4wMDAwMDAsIDEuMDAwMDAwKQorICBmb3JtYXQoMSksIGNoYW5uZWwgbWFzaygzKSwgY2hhbm5lbCBjb3VudCgyKQorICBzYW1wbGUgcmF0ZSg0ODAwMCksIG9yaWdpbmFsIHNhbXBsZSByYXRlKDQ4MDAwKSwgc3BlZWQoMS4wMDAwMDApCisgIGZyYW1lIGNvdW50KDQ4MDApLCByZXEuIGZyYW1lIGNvdW50KDQ4MDApCisgIG5vdGlmLiBmcmFtZSBjb3VudCgyNDAwKSwgcmVxLiBub3RpZi4gZnJhbWUgY291bnQoMjQwMCksIHJlcS4gbm90aWYuIHBlciBidWZmKDApCisgIGxhdGVuY3kgKDE1MCksIHNlbGVjdGVkIGRldmljZSBJZCgwKSwgcm91dGVkIGRldmljZSBJZCgyKQorICBvdXRwdXQoMTMpIEFGIGxhdGVuY3kgKDUwKSBBRiBmcmFtZSBjb3VudCg5NjApIEFGIFNhbXBsZVJhdGUoNDgwMDApCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvQW5kcm9pZC5icCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NGI0MzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvQW5kcm9pZC5icApAQCAtMCwwICsxLDU0IEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmF1ZGlvaGFsQDIuMCIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJEZXZpY2VIYWxMb2NhbC5jcHAiLAorICAgICAgICAiRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwIiwKKyAgICAgICAgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwIiwKKyAgICAgICAgIlN0cmVhbUhhbExvY2FsLmNwcCIsCisKKyAgICAgICAgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmNwcCIsCisgICAgICAgICJEZXZpY2VIYWxIaWRsLmNwcCIsCisgICAgICAgICJEZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwIiwKKyAgICAgICAgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwIiwKKyAgICAgICAgIkVmZmVjdEhhbEhpZGwuY3BwIiwKKyAgICAgICAgIkVmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAiLAorICAgICAgICAiU3RyZWFtSGFsSGlkbC5jcHAiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4iXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXVkaW9oYWxfZGVhdGhoYW5kbGVyIiwKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJoYXJkd2FyZSIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmZtcSIsCisgICAgICAgICJsaWJod2JpbmRlciIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJoaWRsbWVtb3J5IiwKKyAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0AyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25AMi4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDIuMC11dGlsIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uZWZmZWN0QDIuMCIsCisgICAgICAgICJhbmRyb2lkLmhpZGwuYWxsb2NhdG9yQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhpZGwubWVtb3J5QDEuMCIsCisgICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAorICAgICAgICAibGlibWVkaWF1dGlscyIsCisgICAgXSwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYXVkaW9oYWxfaGVhZGVycyIKKyAgICBdLAorCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGliZm1xIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGliYXVkaW9oYWwvQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwCnJlbmFtZSB0byBtZWRpYS9saWJhdWRpb2hhbC8yLjAvQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9Db252ZXJzaW9uSGVscGVySGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYmF1ZGlvaGFsL0NvbnZlcnNpb25IZWxwZXJIaWRsLmgKcmVuYW1lIHRvIG1lZGlhL2xpYmF1ZGlvaGFsLzIuMC9Db252ZXJzaW9uSGVscGVySGlkbC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlSGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlSGFsSGlkbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI5OWQ3MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VIYWxIaWRsLmNwcApAQCAtMCwwICsxLDM2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjZGVmaW5lIExPR19UQUcgIkRldmljZUhhbEhpZGwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JUHJpbWFyeURldmljZS5oPgorI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKKyNpbmNsdWRlICJIaWRsVXRpbHMuaCIKKyNpbmNsdWRlICJTdHJlYW1IYWxIaWRsLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvQ29uZmlnOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9EZXZpY2U7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb0lucHV0RmxhZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvT3V0cHV0RmxhZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvUGF0Y2hIYW5kbGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb1BvcnQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb1BvcnRDb25maWc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb01vZGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb1NvdXJjZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkhpZGxVdGlsczsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpEZXZpY2VBZGRyZXNzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklQcmltYXJ5RGV2aWNlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OlBhcmFtZXRlclZhbHVlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OlJlc3VsdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKworc3RhdHVzX3QgZGV2aWNlQWRkcmVzc0Zyb21IYWwoCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGNvbnN0IGNoYXIqIGhhbEFkZHJlc3MsIERldmljZUFkZHJlc3MqIGFkZHJlc3MpIHsKKyAgICBhZGRyZXNzLT5kZXZpY2UgPSBBdWRpb0RldmljZShkZXZpY2UpOworCisgICAgaWYgKGhhbEFkZHJlc3MgPT0gbnVsbHB0ciB8fCBzdHJubGVuKGhhbEFkZHJlc3MsIEFVRElPX0RFVklDRV9NQVhfQUREUkVTU19MRU4pID09IDApIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICBjb25zdCBib29sIGlzSW5wdXQgPSAoZGV2aWNlICYgQVVESU9fREVWSUNFX0JJVF9JTikgIT0gMDsKKyAgICBpZiAoaXNJbnB1dCkgZGV2aWNlICY9IH5BVURJT19ERVZJQ0VfQklUX0lOOworICAgIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApICE9IDApCisgICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQKSAhPSAwKSkgeworICAgICAgICBpbnQgc3RhdHVzID0gc3NjYW5mKGhhbEFkZHJlc3MsCisgICAgICAgICAgICAgICAgIiVoaFg6JWhoWDolaGhYOiVoaFg6JWhoWDolaGhYIiwKKyAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbMF0sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1sxXSwgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzJdLAorICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLm1hY1szXSwgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzRdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbNV0pOworICAgICAgICByZXR1cm4gc3RhdHVzID09IDYgPyBPSyA6IEJBRF9WQUxVRTsKKyAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9JUCkgIT0gMCkKKyAgICAgICAgICAgIHx8IChpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fSVApICE9IDApKSB7CisgICAgICAgIGludCBzdGF0dXMgPSBzc2NhbmYoaGFsQWRkcmVzcywKKyAgICAgICAgICAgICAgICAiJWhodS4laGh1LiVoaHUuJWhodSIsCisgICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFswXSwgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFsxXSwKKyAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5pcHY0WzJdLCAmYWRkcmVzcy0+YWRkcmVzcy5pcHY0WzNdKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1cyA9PSA0ID8gT0sgOiBCQURfVkFMVUU7CisgICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX1VTQikpICE9IDAKKyAgICAgICAgICAgIHx8IChpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQUxMX1VTQikpICE9IDApIHsKKyAgICAgICAgaW50IHN0YXR1cyA9IHNzY2FuZihoYWxBZGRyZXNzLAorICAgICAgICAgICAgICAgICJjYXJkPSVkO2RldmljZT0lZCIsCisgICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MuYWxzYS5jYXJkLCAmYWRkcmVzcy0+YWRkcmVzcy5hbHNhLmRldmljZSk7CisgICAgICAgIHJldHVybiBzdGF0dXMgPT0gMiA/IE9LIDogQkFEX1ZBTFVFOworICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0JVUykgIT0gMCkKKyAgICAgICAgICAgIHx8IChpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQlVTKSAhPSAwKSkgeworICAgICAgICBpZiAoaGFsQWRkcmVzcyAhPSBOVUxMKSB7CisgICAgICAgICAgICBhZGRyZXNzLT5idXNBZGRyZXNzID0gaGFsQWRkcmVzczsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgpKSAhPSAwCisgICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgpICE9IDApKSB7CisgICAgICAgIGlmIChoYWxBZGRyZXNzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGFkZHJlc3MtPnJTdWJtaXhBZGRyZXNzID0gaGFsQWRkcmVzczsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitEZXZpY2VIYWxIaWRsOjpEZXZpY2VIYWxIaWRsKGNvbnN0IHNwPElEZXZpY2U+JiBkZXZpY2UpCisgICAgICAgIDogQ29udmVyc2lvbkhlbHBlckhpZGwoIkRldmljZSIpLCBtRGV2aWNlKGRldmljZSksCisgICAgICAgICAgbVByaW1hcnlEZXZpY2UoSVByaW1hcnlEZXZpY2U6OmNhc3RGcm9tKGRldmljZSkpIHsKK30KKworRGV2aWNlSGFsSGlkbDo6fkRldmljZUhhbEhpZGwoKSB7CisgICAgaWYgKG1EZXZpY2UgIT0gMCkgeworICAgICAgICBtRGV2aWNlLmNsZWFyKCk7CisgICAgICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CisgICAgfQorfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRTdXBwb3J0ZWREZXZpY2VzKHVpbnQzMl90KikgeworICAgIC8vIE9ic29sZXRlLgorICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6aW5pdENoZWNrKCkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJpbml0Q2hlY2siLCBtRGV2aWNlLT5pbml0Q2hlY2soKSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OnNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFZvaWNlVm9sdW1lIiwgbVByaW1hcnlEZXZpY2UtPnNldFZvaWNlVm9sdW1lKHZvbHVtZSkpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TWFzdGVyVm9sdW1lIiwgbVByaW1hcnlEZXZpY2UtPnNldE1hc3RlclZvbHVtZSh2b2x1bWUpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWFzdGVyVm9sdW1lKGZsb2F0ICp2b2x1bWUpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1QcmltYXJ5RGV2aWNlLT5nZXRNYXN0ZXJWb2x1bWUoCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGZsb2F0IHYpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAqdm9sdW1lID0gdjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TWFzdGVyVm9sdW1lIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TW9kZSIsIG1QcmltYXJ5RGV2aWNlLT5zZXRNb2RlKEF1ZGlvTW9kZShtb2RlKSkpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNaWNNdXRlKGJvb2wgc3RhdGUpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TWljTXV0ZSIsIG1EZXZpY2UtPnNldE1pY011dGUoc3RhdGUpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWljTXV0ZShib29sICpzdGF0ZSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldE1pY011dGUoCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGJvb2wgbXV0ZSkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICpzdGF0ZSA9IG11dGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1pY011dGUiLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OnNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNYXN0ZXJNdXRlIiwgbURldmljZS0+c2V0TWFzdGVyTXV0ZShzdGF0ZSkpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0TWFzdGVyTXV0ZSgKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgYm9vbCBtdXRlKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKnN0YXRlID0gbXV0ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TWFzdGVyTXV0ZSIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGhpZGxQYXJhbXM7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyYW1ldGVyc0Zyb21IYWwoa3ZQYWlycywgJmhpZGxQYXJhbXMpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFBhcmFtZXRlcnMiLCBtRGV2aWNlLT5zZXRQYXJhbWV0ZXJzKGhpZGxQYXJhbXMpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKKyAgICB2YWx1ZXMtPmNsZWFyKCk7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgaGlkbF92ZWM8aGlkbF9zdHJpbmc+IGhpZGxLZXlzOworICAgIHN0YXR1c190IHN0YXR1cyA9IGtleXNGcm9tSGFsKGtleXMsICZoaWRsS2V5cyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRQYXJhbWV0ZXJzKAorICAgICAgICAgICAgaGlkbEtleXMsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiYgcGFyYW1ldGVycykgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNUb0hhbChwYXJhbWV0ZXJzLCB2YWx1ZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRQYXJhbWV0ZXJzIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRJbnB1dEJ1ZmZlclNpemUoCisgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywgc2l6ZV90ICpzaXplKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgQXVkaW9Db25maWcgaGlkbENvbmZpZzsKKyAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnRnJvbUhhbCgqY29uZmlnLCAmaGlkbENvbmZpZyk7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0SW5wdXRCdWZmZXJTaXplKAorICAgICAgICAgICAgaGlkbENvbmZpZywKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDY0X3QgYnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICpzaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihidWZmZXJTaXplKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0SW5wdXRCdWZmZXJTaXplIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpvcGVuT3V0cHV0U3RyZWFtKAorICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAorICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAorICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBEZXZpY2VBZGRyZXNzIGhpZGxEZXZpY2U7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGV2aWNlQWRkcmVzc0Zyb21IYWwoZGV2aWNlcywgYWRkcmVzcywgJmhpZGxEZXZpY2UpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CisgICAgQXVkaW9Db25maWcgaGlkbENvbmZpZzsKKyAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnRnJvbUhhbCgqY29uZmlnLCAmaGlkbENvbmZpZyk7CisgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5vcGVuT3V0cHV0U3RyZWFtKAorICAgICAgICAgICAgaGFuZGxlLAorICAgICAgICAgICAgaGlkbERldmljZSwKKyAgICAgICAgICAgIGhpZGxDb25maWcsCisgICAgICAgICAgICBBdWRpb091dHB1dEZsYWcoZmxhZ3MpLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBzcDxJU3RyZWFtT3V0PiYgcmVzdWx0LCBjb25zdCBBdWRpb0NvbmZpZyYgc3VnZ2VzdGVkQ29uZmlnKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKm91dFN0cmVhbSA9IG5ldyBTdHJlYW1PdXRIYWxIaWRsKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEhpZGxVdGlsczo6YXVkaW9Db25maWdUb0hhbChzdWdnZXN0ZWRDb25maWcsIGNvbmZpZyk7CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigib3Blbk91dHB1dFN0cmVhbSIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6b3BlbklucHV0U3RyZWFtKAorICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAorICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIERldmljZUFkZHJlc3MgaGlkbERldmljZTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXZpY2VBZGRyZXNzRnJvbUhhbChkZXZpY2VzLCBhZGRyZXNzLCAmaGlkbERldmljZSk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgICBBdWRpb0NvbmZpZyBoaWRsQ29uZmlnOworICAgIEhpZGxVdGlsczo6YXVkaW9Db25maWdGcm9tSGFsKCpjb25maWcsICZoaWRsQ29uZmlnKTsKKyAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPm9wZW5JbnB1dFN0cmVhbSgKKyAgICAgICAgICAgIGhhbmRsZSwKKyAgICAgICAgICAgIGhpZGxEZXZpY2UsCisgICAgICAgICAgICBoaWRsQ29uZmlnLAorICAgICAgICAgICAgQXVkaW9JbnB1dEZsYWcoZmxhZ3MpLAorICAgICAgICAgICAgQXVkaW9Tb3VyY2Uoc291cmNlKSwKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SVN0cmVhbUluPiYgcmVzdWx0LCBjb25zdCBBdWRpb0NvbmZpZyYgc3VnZ2VzdGVkQ29uZmlnKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKmluU3RyZWFtID0gbmV3IFN0cmVhbUluSGFsSGlkbChyZXN1bHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnVG9IYWwoc3VnZ2VzdGVkQ29uZmlnLCBjb25maWcpOworICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oIm9wZW5JbnB1dFN0cmVhbSIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c3VwcG9ydHNBdWRpb1BhdGNoZXMoYm9vbCAqc3VwcG9ydHNQYXRjaGVzKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN1cHBvcnRzQXVkaW9QYXRjaGVzIiwgbURldmljZS0+c3VwcG9ydHNBdWRpb1BhdGNoZXMoKSwgc3VwcG9ydHNQYXRjaGVzKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Y3JlYXRlQXVkaW9QYXRjaCgKKyAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAorICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZXMsCisgICAgICAgIHVuc2lnbmVkIGludCBudW1fc2lua3MsCisgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCisgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaCkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIGhpZGxfdmVjPEF1ZGlvUG9ydENvbmZpZz4gaGlkbFNvdXJjZXMsIGhpZGxTaW5rczsKKyAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydENvbmZpZ3NGcm9tSGFsKG51bV9zb3VyY2VzLCBzb3VyY2VzLCAmaGlkbFNvdXJjZXMpOworICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0Q29uZmlnc0Zyb21IYWwobnVtX3NpbmtzLCBzaW5rcywgJmhpZGxTaW5rcyk7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Y3JlYXRlQXVkaW9QYXRjaCgKKyAgICAgICAgICAgIGhpZGxTb3VyY2VzLCBoaWRsU2lua3MsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIEF1ZGlvUGF0Y2hIYW5kbGUgaGlkbFBhdGNoKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKnBhdGNoID0gc3RhdGljX2Nhc3Q8YXVkaW9fcGF0Y2hfaGFuZGxlX3Q+KGhpZGxQYXRjaCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImNyZWF0ZUF1ZGlvUGF0Y2giLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInJlbGVhc2VBdWRpb1BhdGNoIiwgbURldmljZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2gpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgQXVkaW9Qb3J0IGhpZGxQb3J0OworICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0RnJvbUhhbCgqcG9ydCwgJmhpZGxQb3J0KTsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRBdWRpb1BvcnQoCisgICAgICAgICAgICBoaWRsUG9ydCwKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgQXVkaW9Qb3J0JiBwKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgSGlkbFV0aWxzOjphdWRpb1BvcnRUb0hhbChwLCBwb3J0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0QXVkaW9Qb3J0IiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBBdWRpb1BvcnRDb25maWcgaGlkbENvbmZpZzsKKyAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydENvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRBdWRpb1BvcnRDb25maWciLCBtRGV2aWNlLT5zZXRBdWRpb1BvcnRDb25maWcoaGlkbENvbmZpZykpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNaWNyb3Bob25lcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXNJbmZvIF9fdW51c2VkKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpkdW1wKGludCBmZCkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIG5hdGl2ZV9oYW5kbGVfdCogaGlkbEhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOworICAgIGhpZGxIYW5kbGUtPmRhdGFbMF0gPSBmZDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+ZGVidWdEdW1wKGhpZGxIYW5kbGUpOworICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhpZGxIYW5kbGUpOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJkdW1wIiwgcmV0KTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VIYWxIaWRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MxY2I1OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VIYWxIaWRsLmgKQEAgLTAsMCArMSwxMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9ISURMX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0hJRExfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvSURldmljZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lQcmltYXJ5RGV2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SURldmljZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJUHJpbWFyeURldmljZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBEZXZpY2VIYWxIaWRsIDogcHVibGljIERldmljZUhhbEludGVyZmFjZSwgcHVibGljIENvbnZlcnNpb25IZWxwZXJIaWRsCit7CisgIHB1YmxpYzoKKyAgICAvLyBTZXRzIHRoZSB2YWx1ZSBvZiAnZGV2aWNlcycgdG8gYSBiaXRtYXNrIG9mIDEgb3IgbW9yZSB2YWx1ZXMgb2YgYXVkaW9fZGV2aWNlc190LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3VwcG9ydGVkRGV2aWNlcyh1aW50MzJfdCAqZGV2aWNlcyk7CisKKyAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIGF1ZGlvIGhhcmR3YXJlIGludGVyZmFjZSBoYXMgYmVlbiBpbml0aWFsaXplZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpOworCisgICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgb2YgYSB2b2ljZSBjYWxsLiBSYW5nZSBpcyBiZXR3ZWVuIDAuMCBhbmQgMS4wLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKTsKKworICAgIC8vIFNldCB0aGUgYXVkaW8gdm9sdW1lIGZvciBhbGwgYXVkaW8gYWN0aXZpdGllcyBvdGhlciB0aGFuIHZvaWNlIGNhbGwuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKTsKKworICAgIC8vIEdldCB0aGUgY3VycmVudCBtYXN0ZXIgdm9sdW1lIHZhbHVlIGZvciB0aGUgSEFMLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyVm9sdW1lKGZsb2F0ICp2b2x1bWUpOworCisgICAgLy8gQ2FsbGVkIHdoZW4gdGhlIGF1ZGlvIG1vZGUgY2hhbmdlcy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpOworCisgICAgLy8gTXV0aW5nIGNvbnRyb2wuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNaWNNdXRlKGJvb2wgc3RhdGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljTXV0ZShib29sICpzdGF0ZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyTXV0ZShib29sICpzdGF0ZSk7CisKKyAgICAvLyBTZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpOworCisgICAgLy8gR2V0IGdsb2JhbCBhdWRpbyBwYXJhbWV0ZXJzLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpOworCisgICAgLy8gUmV0dXJucyBhdWRpbyBpbnB1dCBidWZmZXIgc2l6ZSBhY2NvcmRpbmcgdG8gcGFyYW1ldGVycyBwYXNzZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEJ1ZmZlclNpemUoY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgc2l6ZV90ICpzaXplKTsKKworICAgIC8vIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBhdWRpbyBoYXJkd2FyZSBvdXRwdXQgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIGNsb3NlZAorICAgIC8vIGJ5IHJlbGVhc2luZyBhbGwgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3Blbk91dHB1dFN0cmVhbSgKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAorICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAorICAgICAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKTsKKworICAgIC8vIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBhdWRpbyBoYXJkd2FyZSBpbnB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCisgICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuSW5wdXRTdHJlYW0oCisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAorICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSk7CisKKyAgICAvLyBSZXR1cm5zIHdoZXRoZXIgY3JlYXRlQXVkaW9QYXRjaCBhbmQgcmVsZWFzZUF1ZGlvUGF0Y2ggb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNBdWRpb1BhdGNoZXMoYm9vbCAqc3VwcG9ydHNQYXRjaGVzKTsKKworICAgIC8vIENyZWF0ZXMgYW4gYXVkaW8gcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NvdXJjZXMsCisgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZXMsCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NpbmtzLAorICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaCk7CisKKyAgICAvLyBSZWxlYXNlcyBhbiBhdWRpbyBwYXRjaC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoKTsKKworICAgIC8vIEZpbGxzIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpOworCisgICAgLy8gU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbi4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CisKKyAgICAvLyBMaXN0IG1pY3JvcGhvbmVzCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKKworICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEhpZGw7CisgICAgc3A8SURldmljZT4gbURldmljZTsKKyAgICBzcDxJUHJpbWFyeURldmljZT4gbVByaW1hcnlEZXZpY2U7ICAvLyBOdWxsIGlmIGl0J3Mgbm90IGEgcHJpbWFyeSBkZXZpY2UuCisKKyAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgZXhwbGljaXQgRGV2aWNlSGFsSGlkbChjb25zdCBzcDxJRGV2aWNlPiYgZGV2aWNlKTsKKworICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBkZXZpY2UuCisgICAgdmlydHVhbCB+RGV2aWNlSGFsSGlkbCgpOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbExvY2FsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VIYWxMb2NhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMzYmY3OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VIYWxMb2NhbC5jcHAKQEAgLTAsMCArMSwyMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkRldmljZUhhbExvY2FsIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgorI2luY2x1ZGUgIlN0cmVhbUhhbExvY2FsLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworRGV2aWNlSGFsTG9jYWw6OkRldmljZUhhbExvY2FsKGF1ZGlvX2h3X2RldmljZV90ICpkZXYpCisgICAgICAgIDogbURldihkZXYpIHsKK30KKworRGV2aWNlSGFsTG9jYWw6On5EZXZpY2VIYWxMb2NhbCgpIHsKKyAgICBpbnQgc3RhdHVzID0gYXVkaW9faHdfZGV2aWNlX2Nsb3NlKG1EZXYpOworICAgIEFMT0dXX0lGKHN0YXR1cywgIkVycm9yIGNsb3NpbmcgYXVkaW8gaHcgZGV2aWNlICVwOiAlcyIsIG1EZXYsIHN0cmVycm9yKC1zdGF0dXMpKTsKKyAgICBtRGV2ID0gMDsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldFN1cHBvcnRlZERldmljZXModWludDMyX3QgKmRldmljZXMpIHsKKyAgICBpZiAobURldi0+Z2V0X3N1cHBvcnRlZF9kZXZpY2VzID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAqZGV2aWNlcyA9IG1EZXYtPmdldF9zdXBwb3J0ZWRfZGV2aWNlcyhtRGV2KTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjppbml0Q2hlY2soKSB7CisgICAgcmV0dXJuIG1EZXYtPmluaXRfY2hlY2sobURldik7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpIHsKKyAgICByZXR1cm4gbURldi0+c2V0X3ZvaWNlX3ZvbHVtZShtRGV2LCB2b2x1bWUpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSkgeworICAgIGlmIChtRGV2LT5zZXRfbWFzdGVyX3ZvbHVtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1EZXYtPnNldF9tYXN0ZXJfdm9sdW1lKG1EZXYsIHZvbHVtZSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSkgeworICAgIGlmIChtRGV2LT5nZXRfbWFzdGVyX3ZvbHVtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1EZXYtPmdldF9tYXN0ZXJfdm9sdW1lKG1EZXYsIHZvbHVtZSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKSB7CisgICAgcmV0dXJuIG1EZXYtPnNldF9tb2RlKG1EZXYsIG1vZGUpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TWljTXV0ZShib29sIHN0YXRlKSB7CisgICAgcmV0dXJuIG1EZXYtPnNldF9taWNfbXV0ZShtRGV2LCBzdGF0ZSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKSB7CisgICAgcmV0dXJuIG1EZXYtPmdldF9taWNfbXV0ZShtRGV2LCBzdGF0ZSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpIHsKKyAgICBpZiAobURldi0+c2V0X21hc3Rlcl9tdXRlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbURldi0+c2V0X21hc3Rlcl9tdXRlKG1EZXYsIHN0YXRlKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpIHsKKyAgICBpZiAobURldi0+Z2V0X21hc3Rlcl9tdXRlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbURldi0+Z2V0X21hc3Rlcl9tdXRlKG1EZXYsIHN0YXRlKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgeworICAgIHJldHVybiBtRGV2LT5zZXRfcGFyYW1ldGVycyhtRGV2LCBrdlBhaXJzLnN0cmluZygpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7CisgICAgY2hhciAqaGFsVmFsdWVzID0gbURldi0+Z2V0X3BhcmFtZXRlcnMobURldiwga2V5cy5zdHJpbmcoKSk7CisgICAgaWYgKGhhbFZhbHVlcyAhPSBOVUxMKSB7CisgICAgICAgIHZhbHVlcy0+c2V0VG8oaGFsVmFsdWVzKTsKKyAgICAgICAgZnJlZShoYWxWYWx1ZXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIHZhbHVlcy0+Y2xlYXIoKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0SW5wdXRCdWZmZXJTaXplKAorICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsIHNpemVfdCAqc2l6ZSkgeworICAgICpzaXplID0gbURldi0+Z2V0X2lucHV0X2J1ZmZlcl9zaXplKG1EZXYsIGNvbmZpZyk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6b3Blbk91dHB1dFN0cmVhbSgKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKKyAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKSB7CisgICAgYXVkaW9fc3RyZWFtX291dF90ICpoYWxTdHJlYW07CisgICAgQUxPR1YoIm9wZW5fb3V0cHV0X3N0cmVhbSBoYW5kbGU6ICVkIGRldmljZXM6ICV4IGZsYWdzOiAlI3giCisgICAgICAgICAgICAic3JhdGU6ICVkIGZvcm1hdCAlI3ggY2hhbm5lbHMgJXggYWRkcmVzcyAlcyIsCisgICAgICAgICAgICBoYW5kbGUsIGRldmljZXMsIGZsYWdzLAorICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAorICAgICAgICAgICAgYWRkcmVzcyk7CisgICAgaW50IG9wZW5SZXN1dCA9IG1EZXYtPm9wZW5fb3V0cHV0X3N0cmVhbSgKKyAgICAgICAgICAgIG1EZXYsIGhhbmRsZSwgZGV2aWNlcywgZmxhZ3MsIGNvbmZpZywgJmhhbFN0cmVhbSwgYWRkcmVzcyk7CisgICAgaWYgKG9wZW5SZXN1dCA9PSBPSykgeworICAgICAgICAqb3V0U3RyZWFtID0gbmV3IFN0cmVhbU91dEhhbExvY2FsKGhhbFN0cmVhbSwgdGhpcyk7CisgICAgfQorICAgIEFMT0dWKCJvcGVuX291dHB1dF9zdHJlYW0gc3RhdHVzICVkIHN0cmVhbSAlcCIsIG9wZW5SZXN1dCwgaGFsU3RyZWFtKTsKKyAgICByZXR1cm4gb3BlblJlc3V0OworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6b3BlbklucHV0U3RyZWFtKAorICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAorICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSkgeworICAgIGF1ZGlvX3N0cmVhbV9pbl90ICpoYWxTdHJlYW07CisgICAgQUxPR1YoIm9wZW5faW5wdXRfc3RyZWFtIGhhbmRsZTogJWQgZGV2aWNlczogJXggZmxhZ3M6ICUjeCAiCisgICAgICAgICAgICAic3JhdGU6ICVkIGZvcm1hdCAlI3ggY2hhbm5lbHMgJXggYWRkcmVzcyAlcyBzb3VyY2UgJWQiLAorICAgICAgICAgICAgaGFuZGxlLCBkZXZpY2VzLCBmbGFncywKKyAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywKKyAgICAgICAgICAgIGFkZHJlc3MsIHNvdXJjZSk7CisgICAgaW50IG9wZW5SZXN1bHQgPSBtRGV2LT5vcGVuX2lucHV0X3N0cmVhbSgKKyAgICAgICAgICAgIG1EZXYsIGhhbmRsZSwgZGV2aWNlcywgY29uZmlnLCAmaGFsU3RyZWFtLCBmbGFncywgYWRkcmVzcywgc291cmNlKTsKKyAgICBpZiAob3BlblJlc3VsdCA9PSBPSykgeworICAgICAgICAqaW5TdHJlYW0gPSBuZXcgU3RyZWFtSW5IYWxMb2NhbChoYWxTdHJlYW0sIHRoaXMpOworICAgIH0KKyAgICBBTE9HVigib3Blbl9pbnB1dF9zdHJlYW0gc3RhdHVzICVkIHN0cmVhbSAlcCIsIG9wZW5SZXN1bHQsIGluU3RyZWFtKTsKKyAgICByZXR1cm4gb3BlblJlc3VsdDsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcykgeworICAgICpzdXBwb3J0c1BhdGNoZXMgPSB2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMDsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpjcmVhdGVBdWRpb1BhdGNoKAorICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NvdXJjZXMsCisgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKKyAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKKyAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKKyAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKSB7CisgICAgaWYgKHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7CisgICAgICAgIHJldHVybiBtRGV2LT5jcmVhdGVfYXVkaW9fcGF0Y2goCisgICAgICAgICAgICAgICAgbURldiwgbnVtX3NvdXJjZXMsIHNvdXJjZXMsIG51bV9zaW5rcywgc2lua3MsIHBhdGNoKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpIHsKKyAgICBpZiAodmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKKyAgICAgICAgcmV0dXJuIG1EZXYtPnJlbGVhc2VfYXVkaW9fcGF0Y2gobURldiwgcGF0Y2gpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIHsKKyAgICByZXR1cm4gbURldi0+Z2V0X2F1ZGlvX3BvcnQobURldiwgcG9ydCk7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpIHsKKyAgICBpZiAodmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApCisgICAgICAgIHJldHVybiBtRGV2LT5zZXRfYXVkaW9fcG9ydF9jb25maWcobURldiwgY29uZmlnKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1pY3JvcGhvbmVzKAorICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyBfX3VudXNlZCkgeworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmR1bXAoaW50IGZkKSB7CisgICAgcmV0dXJuIG1EZXYtPmR1bXAobURldiwgZmQpOworfQorCit2b2lkIERldmljZUhhbExvY2FsOjpjbG9zZU91dHB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX291dCAqc3RyZWFtX291dCkgeworICAgIG1EZXYtPmNsb3NlX291dHB1dF9zdHJlYW0obURldiwgc3RyZWFtX291dCk7Cit9CisKK3ZvaWQgRGV2aWNlSGFsTG9jYWw6OmNsb3NlSW5wdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9pbiAqc3RyZWFtX2luKSB7CisgICAgbURldi0+Y2xvc2VfaW5wdXRfc3RyZWFtKG1EZXYsIHN0cmVhbV9pbik7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VIYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbExvY2FsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVjMjAxYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VIYWxMb2NhbC5oCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfTE9DQUxfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfTE9DQUxfSAorCisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW8uaD4KKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBEZXZpY2VIYWxMb2NhbCA6IHB1YmxpYyBEZXZpY2VIYWxJbnRlcmZhY2UKK3sKKyAgcHVibGljOgorICAgIC8vIFNldHMgdGhlIHZhbHVlIG9mICdkZXZpY2VzJyB0byBhIGJpdG1hc2sgb2YgMSBvciBtb3JlIHZhbHVlcyBvZiBhdWRpb19kZXZpY2VzX3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdXBwb3J0ZWREZXZpY2VzKHVpbnQzMl90ICpkZXZpY2VzKTsKKworICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlIGhhcyBiZWVuIGluaXRpYWxpemVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCk7CisKKyAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBvZiBhIHZvaWNlIGNhbGwuIFJhbmdlIGlzIGJldHdlZW4gMC4wIGFuZCAxLjAuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpOworCisgICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgZm9yIGFsbCBhdWRpbyBhY3Rpdml0aWVzIG90aGVyIHRoYW4gdm9pY2UgY2FsbC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpOworCisgICAgLy8gR2V0IHRoZSBjdXJyZW50IG1hc3RlciB2b2x1bWUgdmFsdWUgZm9yIHRoZSBIQUwuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSk7CisKKyAgICAvLyBDYWxsZWQgd2hlbiB0aGUgYXVkaW8gbW9kZSBjaGFuZ2VzLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSk7CisKKyAgICAvLyBNdXRpbmcgY29udHJvbC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pY011dGUoYm9vbCBzdGF0ZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKTsKKworICAgIC8vIFNldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7CisKKyAgICAvLyBHZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7CisKKyAgICAvLyBSZXR1cm5zIGF1ZGlvIGlucHV0IGJ1ZmZlciBzaXplIGFjY29yZGluZyB0byBwYXJhbWV0ZXJzIHBhc3NlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0QnVmZmVyU2l6ZShjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgICAgICBzaXplX3QgKnNpemUpOworCisgICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIG91dHB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCisgICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuT3V0cHV0U3RyZWFtKAorICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pOworCisgICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKKyAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5JbnB1dFN0cmVhbSgKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAorICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gKmluU3RyZWFtKTsKKworICAgIC8vIFJldHVybnMgd2hldGhlciBjcmVhdGVBdWRpb1BhdGNoIGFuZCByZWxlYXNlQXVkaW9QYXRjaCBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0F1ZGlvUGF0Y2hlcyhib29sICpzdXBwb3J0c1BhdGNoZXMpOworCisgICAgLy8gQ3JlYXRlcyBhbiBhdWRpbyBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaCgKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fc291cmNlcywKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fc2lua3MsCisgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtzLAorICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKTsKKworICAgIC8vIFJlbGVhc2VzIGFuIGF1ZGlvIHBhdGNoLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpOworCisgICAgLy8gRmlsbHMgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCk7CisKKyAgICAvLyBTZXQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKworICAgIC8vIExpc3QgbWljcm9waG9uZXMKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOworCisgICAgdm9pZCBjbG9zZU91dHB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX291dCAqc3RyZWFtX291dCk7CisgICAgdm9pZCBjbG9zZUlucHV0U3RyZWFtKHN0cnVjdCBhdWRpb19zdHJlYW1faW4gKnN0cmVhbV9pbik7CisKKyAgcHJpdmF0ZToKKyAgICBhdWRpb19od19kZXZpY2VfdCAqbURldjsKKworICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbExvY2FsOworCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIGV4cGxpY2l0IERldmljZUhhbExvY2FsKGF1ZGlvX2h3X2RldmljZV90ICpkZXYpOworCisgICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIGRldmljZS4KKyAgICB2aXJ0dWFsIH5EZXZpY2VIYWxMb2NhbCgpOworCisgICAgdWludDMyX3QgdmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1EZXYtPmNvbW1vbi52ZXJzaW9uOyB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfTE9DQUxfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjMzNTkyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBMT0dfVEFHICJEZXZpY2VzRmFjdG9yeUhhbEhpZGwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JRGV2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvaGlkbC9IYWxEZWF0aEhhbmRsZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCisjaW5jbHVkZSAiRGV2aWNlSGFsSGlkbC5oIgorI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsSGlkbC5oIgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SURldmljZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpSZXN1bHQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOjpEZXZpY2VzRmFjdG9yeUhhbEhpZGwoKSB7CisgICAgbURldmljZXNGYWN0b3J5ID0gSURldmljZXNGYWN0b3J5OjpnZXRTZXJ2aWNlKCk7CisgICAgaWYgKG1EZXZpY2VzRmFjdG9yeSAhPSAwKSB7CisgICAgICAgIC8vIEl0IGlzIGFzc3VtZWQgdGhhdCBEZXZpY2VzRmFjdG9yeSBpcyBvd25lZCBieSBBdWRpb0ZsaW5nZXIKKyAgICAgICAgLy8gYW5kIHRodXMgaGF2ZSB0aGUgc2FtZSBsaWZlc3Bhbi4KKyAgICAgICAgbURldmljZXNGYWN0b3J5LT5saW5rVG9EZWF0aChIYWxEZWF0aEhhbmRsZXI6OmdldEluc3RhbmNlKCksIDAgLypjb29raWUqLyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBvYnRhaW4gSURldmljZXNGYWN0b3J5IHNlcnZpY2UsIHRlcm1pbmF0aW5nIHByb2Nlc3MuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIC8vIFRoZSBNU0QgZmFjdG9yeSBpcyBvcHRpb25hbAorICAgIG1EZXZpY2VzRmFjdG9yeU1zZCA9IElEZXZpY2VzRmFjdG9yeTo6Z2V0U2VydmljZShBVURJT19IQUxfU0VSVklDRV9OQU1FX01TRCk7CisgICAgLy8gVE9ETzogUmVnaXN0ZXIgZGVhdGggaGFuZGxlciwgYW5kIGFkZCAncmVzdGFydCcgZGlyZWN0aXZlIHRvIGF1ZGlvc2VydmVyLnJjCit9CisKK0RldmljZXNGYWN0b3J5SGFsSGlkbDo6fkRldmljZXNGYWN0b3J5SGFsSGlkbCgpIHsKK30KKworLy8gc3RhdGljCitzdGF0dXNfdCBEZXZpY2VzRmFjdG9yeUhhbEhpZGw6Om5hbWVGcm9tSGFsKGNvbnN0IGNoYXIgKm5hbWUsIElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlICpkZXZpY2UpIHsKKyAgICBpZiAoc3RyY21wKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9QUklNQVJZKSA9PSAwKSB7CisgICAgICAgICpkZXZpY2UgPSBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZTo6UFJJTUFSWTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSBpZihzdHJjbXAobmFtZSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX0EyRFApID09IDApIHsKKyAgICAgICAgKmRldmljZSA9IElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlOjpBMkRQOworICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIGlmKHN0cmNtcChuYW1lLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfVVNCKSA9PSAwKSB7CisgICAgICAgICpkZXZpY2UgPSBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZTo6VVNCOworICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIGlmKHN0cmNtcChuYW1lLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUkVNT1RFX1NVQk1JWCkgPT0gMCkgeworICAgICAgICAqZGV2aWNlID0gSURldmljZXNGYWN0b3J5OjpEZXZpY2U6OlJfU1VCTUlYOworICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIGlmKHN0cmNtcChuYW1lLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfU1RVQikgPT0gMCkgeworICAgICAgICAqZGV2aWNlID0gSURldmljZXNGYWN0b3J5OjpEZXZpY2U6OlNUVUI7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgQUxPR0UoIkludmFsaWQgZGV2aWNlIG5hbWUgJXMiLCBuYW1lKTsKKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCitzdGF0dXNfdCBEZXZpY2VzRmFjdG9yeUhhbEhpZGw6Om9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKSB7CisgICAgaWYgKG1EZXZpY2VzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZSBoaWRsRGV2aWNlOworICAgIHN0YXR1c190IHN0YXR1cyA9IG5hbWVGcm9tSGFsKG5hbWUsICZoaWRsRGV2aWNlKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOworICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZXNGYWN0b3J5LT5vcGVuRGV2aWNlKAorICAgICAgICAgICAgaGlkbERldmljZSwKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SURldmljZT4mIHJlc3VsdCkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICpkZXZpY2UgPSBuZXcgRGV2aWNlSGFsSGlkbChyZXN1bHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmIChyZXQuaXNPaygpKSB7CisgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgcmV0dXJuIE9LOworICAgICAgICBlbHNlIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUykgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgZWxzZSByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIEZBSUxFRF9UUkFOU0FDVElPTjsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsSGlkbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NDg4NDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hJRExfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSElETF9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JRGV2aWNlc0ZhY3RvcnkuaD4KKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklEZXZpY2VzRmFjdG9yeTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEhpZGwgOiBwdWJsaWMgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UKK3sKKyAgcHVibGljOgorICAgIC8vIE9wZW5zIGEgZGV2aWNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUbyBjbG9zZSB0aGUgZGV2aWNlLCBpdCBpcworICAgIC8vIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKTsKKworICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDsKKworICAgIHNwPElEZXZpY2VzRmFjdG9yeT4gbURldmljZXNGYWN0b3J5OworICAgIHNwPElEZXZpY2VzRmFjdG9yeT4gbURldmljZXNGYWN0b3J5TXNkOworCisgICAgc3RhdGljIHN0YXR1c190IG5hbWVGcm9tSGFsKGNvbnN0IGNoYXIgKm5hbWUsIElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlICpkZXZpY2UpOworCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIERldmljZXNGYWN0b3J5SGFsSGlkbCgpOworCisgICAgdmlydHVhbCB+RGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzRiZTc0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmNwcApAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsSHlicmlkLmgiCisjaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oIgorI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsSGlkbC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0RldmljZXNGYWN0b3J5SGFsSHlicmlkOjpEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCgpCisgICAgICAgIDogbUxvY2FsRmFjdG9yeShuZXcgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbCgpKSwKKyAgICAgICAgICBtSGlkbEZhY3RvcnkobmV3IERldmljZXNGYWN0b3J5SGFsSGlkbCgpKSB7Cit9CisKK0RldmljZXNGYWN0b3J5SGFsSHlicmlkOjp+RGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoKSB7Cit9CisKK3N0YXR1c190IERldmljZXNGYWN0b3J5SGFsSHlicmlkOjpvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSkgeworICAgIGlmIChtSGlkbEZhY3RvcnkgIT0gMCAmJiBzdHJjbXAoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX0EyRFAsIG5hbWUpICE9IDAgJiYKKyAgICAgICAgc3RyY21wKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9IRUFSSU5HX0FJRCwgbmFtZSkgIT0gMCkgeworICAgICAgICByZXR1cm4gbUhpZGxGYWN0b3J5LT5vcGVuRGV2aWNlKG5hbWUsIGRldmljZSk7CisgICAgfQorICAgIHJldHVybiBtTG9jYWxGYWN0b3J5LT5vcGVuRGV2aWNlKG5hbWUsIGRldmljZSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmggYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaApyZW5hbWUgdG8gbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmNwcApyZW5hbWUgdG8gbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmggYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgKcmVuYW1lIHRvIG1lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RCdWZmZXJIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RCdWZmZXJIYWxIaWRsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjZhNTAwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGF0b21pYz4KKworI2RlZmluZSBMT0dfVEFHICJFZmZlY3RCdWZmZXJIYWxIaWRsIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8YW5kcm9pZC9oaWRsL2FsbG9jYXRvci8xLjAvSUFsbG9jYXRvci5oPgorI2luY2x1ZGUgPGhpZGxtZW1vcnkvbWFwcGluZy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKKyNpbmNsdWRlICJFZmZlY3RCdWZmZXJIYWxIaWRsLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGlkbDo6YWxsb2NhdG9yOjpWMV8wOjpJQWxsb2NhdG9yOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIHN0YXRpYwordWludDY0X3QgRWZmZWN0QnVmZmVySGFsSGlkbDo6bWFrZVVuaXF1ZUlkKCkgeworICAgIHN0YXRpYyBzdGQ6OmF0b21pYzx1aW50NjRfdD4gY291bnRlcnsxfTsKKyAgICByZXR1cm4gY291bnRlcisrOworfQorCitzdGF0dXNfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjphbGxvY2F0ZSgKKyAgICAgICAgc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgeworICAgIHJldHVybiBtaXJyb3IobnVsbHB0ciwgc2l6ZSwgYnVmZmVyKTsKK30KKworc3RhdHVzX3QgRWZmZWN0QnVmZmVySGFsSGlkbDo6bWlycm9yKAorICAgICAgICB2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgeworICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4gdGVtcEJ1ZmZlciA9IG5ldyBFZmZlY3RCdWZmZXJIYWxIaWRsKHNpemUpOworICAgIHN0YXR1c190IHJlc3VsdCA9IHN0YXRpY19jYXN0PEVmZmVjdEJ1ZmZlckhhbEhpZGwqPih0ZW1wQnVmZmVyLmdldCgpKS0+aW5pdCgpOworICAgIGlmIChyZXN1bHQgPT0gT0spIHsKKyAgICAgICAgdGVtcEJ1ZmZlci0+c2V0RXh0ZXJuYWxEYXRhKGV4dGVybmFsKTsKKyAgICAgICAgKmJ1ZmZlciA9IHRlbXBCdWZmZXI7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK0VmZmVjdEJ1ZmZlckhhbEhpZGw6OkVmZmVjdEJ1ZmZlckhhbEhpZGwoc2l6ZV90IHNpemUpCisgICAgICAgIDogbUJ1ZmZlclNpemUoc2l6ZSksIG1GcmFtZUNvdW50Q2hhbmdlZChmYWxzZSksCisgICAgICAgICAgbUV4dGVybmFsRGF0YShudWxscHRyKSwgbUF1ZGlvQnVmZmVyezAsIHtudWxscHRyfX0geworICAgIG1IaWRsQnVmZmVyLmlkID0gbWFrZVVuaXF1ZUlkKCk7CisgICAgbUhpZGxCdWZmZXIuZnJhbWVDb3VudCA9IDA7Cit9CisKK0VmZmVjdEJ1ZmZlckhhbEhpZGw6On5FZmZlY3RCdWZmZXJIYWxIaWRsKCkgeworfQorCitzdGF0dXNfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjppbml0KCkgeworICAgIHNwPElBbGxvY2F0b3I+IGFzaG1lbSA9IElBbGxvY2F0b3I6OmdldFNlcnZpY2UoImFzaG1lbSIpOworICAgIGlmIChhc2htZW0gPT0gMCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJldHJpZXZlIGFzaG1lbSBhbGxvY2F0b3Igc2VydmljZSIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgc3RhdHVzX3QgcmV0dmFsID0gTk9fTUVNT1JZOworICAgIFJldHVybjx2b2lkPiByZXN1bHQgPSBhc2htZW0tPmFsbG9jYXRlKAorICAgICAgICAgICAgbUJ1ZmZlclNpemUsCisgICAgICAgICAgICBbJl0oYm9vbCBzdWNjZXNzLCBjb25zdCBoaWRsX21lbW9yeSYgbWVtb3J5KSB7CisgICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgbUhpZGxCdWZmZXIuZGF0YSA9IG1lbW9yeTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gT0s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKHJlc3VsdC5pc09rKCkgJiYgcmV0dmFsID09IE9LKSB7CisgICAgICAgIG1NZW1vcnkgPSBoYXJkd2FyZTo6bWFwTWVtb3J5KG1IaWRsQnVmZmVyLmRhdGEpOworICAgICAgICBpZiAobU1lbW9yeSAhPSAwKSB7CisgICAgICAgICAgICBtTWVtb3J5LT51cGRhdGUoKTsKKyAgICAgICAgICAgIG1BdWRpb0J1ZmZlci5yYXcgPSBzdGF0aWNfY2FzdDx2b2lkKj4obU1lbW9yeS0+Z2V0UG9pbnRlcigpKTsKKyAgICAgICAgICAgIG1lbXNldChtQXVkaW9CdWZmZXIucmF3LCAwLCBtTWVtb3J5LT5nZXRTaXplKCkpOworICAgICAgICAgICAgbU1lbW9yeS0+Y29tbWl0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG1hcCBhbGxvY2F0ZWQgYXNobWVtIik7CisgICAgICAgICAgICByZXR2YWwgPSBOT19NRU1PUlk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGFsbG9jYXRlICVkIGJ5dGVzIGZyb20gYXNobWVtIiwgKGludCltQnVmZmVyU2l6ZSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQuaXNPaygpID8gcmV0dmFsIDogRkFJTEVEX1RSQU5TQUNUSU9OOworfQorCithdWRpb19idWZmZXJfdCogRWZmZWN0QnVmZmVySGFsSGlkbDo6YXVkaW9CdWZmZXIoKSB7CisgICAgcmV0dXJuICZtQXVkaW9CdWZmZXI7Cit9CisKK3ZvaWQqIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmV4dGVybmFsRGF0YSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUV4dGVybmFsRGF0YTsKK30KKwordm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpzZXRGcmFtZUNvdW50KHNpemVfdCBmcmFtZUNvdW50KSB7CisgICAgbUhpZGxCdWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CisgICAgbUF1ZGlvQnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZUNvdW50OworICAgIG1GcmFtZUNvdW50Q2hhbmdlZCA9IHRydWU7Cit9CisKK2Jvb2wgRWZmZWN0QnVmZmVySGFsSGlkbDo6Y2hlY2tGcmFtZUNvdW50Q2hhbmdlKCkgeworICAgIGJvb2wgcmVzdWx0ID0gbUZyYW1lQ291bnRDaGFuZ2VkOworICAgIG1GcmFtZUNvdW50Q2hhbmdlZCA9IGZhbHNlOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6c2V0RXh0ZXJuYWxEYXRhKHZvaWQqIGV4dGVybmFsKSB7CisgICAgbUV4dGVybmFsRGF0YSA9IGV4dGVybmFsOworfQorCit2b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OnVwZGF0ZSgpIHsKKyAgICB1cGRhdGUobUJ1ZmZlclNpemUpOworfQorCit2b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmNvbW1pdCgpIHsKKyAgICBjb21taXQobUJ1ZmZlclNpemUpOworfQorCit2b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OnVwZGF0ZShzaXplX3Qgc2l6ZSkgeworICAgIGlmIChtRXh0ZXJuYWxEYXRhID09IG51bGxwdHIpIHJldHVybjsKKyAgICBtTWVtb3J5LT51cGRhdGUoKTsKKyAgICBpZiAoc2l6ZSA+IG1CdWZmZXJTaXplKSBzaXplID0gbUJ1ZmZlclNpemU7CisgICAgbWVtY3B5KG1BdWRpb0J1ZmZlci5yYXcsIG1FeHRlcm5hbERhdGEsIHNpemUpOworICAgIG1NZW1vcnktPmNvbW1pdCgpOworfQorCit2b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmNvbW1pdChzaXplX3Qgc2l6ZSkgeworICAgIGlmIChtRXh0ZXJuYWxEYXRhID09IG51bGxwdHIpIHJldHVybjsKKyAgICBpZiAoc2l6ZSA+IG1CdWZmZXJTaXplKSBzaXplID0gbUJ1ZmZlclNpemU7CisgICAgbWVtY3B5KG1FeHRlcm5hbERhdGEsIG1BdWRpb0J1ZmZlci5yYXcsIHNpemUpOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0QnVmZmVySGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEJ1ZmZlckhhbEhpZGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWUwMDg3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEJ1ZmZlckhhbEhpZGwuaApAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9CVUZGRVJfSEFMX0hJRExfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9CVUZGRVJfSEFMX0hJRExfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oaWRsL21lbW9yeS8xLjAvSU1lbW9yeS5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0Lmg+CisKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpBdWRpb0J1ZmZlcjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKK3VzaW5nIGFuZHJvaWQ6OmhpZGw6Om1lbW9yeTo6VjFfMDo6SU1lbW9yeTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBFZmZlY3RCdWZmZXJIYWxIaWRsIDogcHVibGljIEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZQoreworICBwdWJsaWM6CisgICAgc3RhdGljIHN0YXR1c190IGFsbG9jYXRlKHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpOworICAgIHN0YXRpYyBzdGF0dXNfdCBtaXJyb3Iodm9pZCogZXh0ZXJuYWwsIHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpOworCisgICAgdmlydHVhbCBhdWRpb19idWZmZXJfdCogYXVkaW9CdWZmZXIoKTsKKyAgICB2aXJ0dWFsIHZvaWQqIGV4dGVybmFsRGF0YSgpIGNvbnN0OworCisgICAgdmlydHVhbCBzaXplX3QgZ2V0U2l6ZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1CdWZmZXJTaXplOyB9CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0RXh0ZXJuYWxEYXRhKHZvaWQqIGV4dGVybmFsKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0RnJhbWVDb3VudChzaXplX3QgZnJhbWVDb3VudCk7CisgICAgdmlydHVhbCBib29sIGNoZWNrRnJhbWVDb3VudENoYW5nZSgpOworCisgICAgdmlydHVhbCB2b2lkIHVwZGF0ZSgpOworICAgIHZpcnR1YWwgdm9pZCBjb21taXQoKTsKKyAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlKHNpemVfdCBzaXplKTsKKyAgICB2aXJ0dWFsIHZvaWQgY29tbWl0KHNpemVfdCBzaXplKTsKKworICAgIGNvbnN0IEF1ZGlvQnVmZmVyJiBoaWRsQnVmZmVyKCkgY29uc3QgeyByZXR1cm4gbUhpZGxCdWZmZXI7IH0KKworICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U7CisKKyAgICBzdGF0aWMgdWludDY0X3QgbWFrZVVuaXF1ZUlkKCk7CisKKyAgICBjb25zdCBzaXplX3QgbUJ1ZmZlclNpemU7CisgICAgYm9vbCBtRnJhbWVDb3VudENoYW5nZWQ7CisgICAgdm9pZCogbUV4dGVybmFsRGF0YTsKKyAgICBBdWRpb0J1ZmZlciBtSGlkbEJ1ZmZlcjsKKyAgICBzcDxJTWVtb3J5PiBtTWVtb3J5OworICAgIGF1ZGlvX2J1ZmZlcl90IG1BdWRpb0J1ZmZlcjsKKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBleHBsaWNpdCBFZmZlY3RCdWZmZXJIYWxIaWRsKHNpemVfdCBzaXplKTsKKworICAgIHZpcnR1YWwgfkVmZmVjdEJ1ZmZlckhhbEhpZGwoKTsKKworICAgIHN0YXR1c190IGluaXQoKTsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0JVRkZFUl9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0SGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0SGFsSGlkbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZiMDMyYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RIYWxIaWRsLmNwcApAQCAtMCwwICsxLDMzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0SGFsSGlkbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGh3YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8bWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCisjaW5jbHVkZSAiRWZmZWN0QnVmZmVySGFsSGlkbC5oIgorI2luY2x1ZGUgIkVmZmVjdEhhbEhpZGwuaCIKKyNpbmNsdWRlICJIaWRsVXRpbHMuaCIKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6QXVkaW9CdWZmZXI7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpFZmZlY3RCdWZmZXJBY2Nlc3M7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpFZmZlY3RDb25maWdQYXJhbWV0ZXJzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6TWVzc2FnZVF1ZXVlRmxhZ0JpdHM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpSZXN1bHQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpIaWRsVXRpbHM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb0NoYW5uZWxNYXNrOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9Gb3JtYXQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1RRGVzY3JpcHRvclN5bmM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworRWZmZWN0SGFsSGlkbDo6RWZmZWN0SGFsSGlkbChjb25zdCBzcDxJRWZmZWN0PiYgZWZmZWN0LCB1aW50NjRfdCBlZmZlY3RJZCkKKyAgICAgICAgOiBtRWZmZWN0KGVmZmVjdCksIG1FZmZlY3RJZChlZmZlY3RJZCksIG1CdWZmZXJzQ2hhbmdlZCh0cnVlKSwgbUVmR3JvdXAobnVsbHB0cikgeworfQorCitFZmZlY3RIYWxIaWRsOjp+RWZmZWN0SGFsSGlkbCgpIHsKKyAgICBpZiAobUVmZmVjdCAhPSAwKSB7CisgICAgICAgIGNsb3NlKCk7CisgICAgICAgIG1FZmZlY3QuY2xlYXIoKTsKKyAgICAgICAgaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKKyAgICB9CisgICAgaWYgKG1FZkdyb3VwKSB7CisgICAgICAgIEV2ZW50RmxhZzo6ZGVsZXRlRXZlbnRGbGFnKCZtRWZHcm91cCk7CisgICAgfQorfQorCisvLyBzdGF0aWMKK3ZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0RGVzY3JpcHRvclRvSGFsKAorICAgICAgICBjb25zdCBFZmZlY3REZXNjcmlwdG9yJiBkZXNjcmlwdG9yLCBlZmZlY3RfZGVzY3JpcHRvcl90KiBoYWxEZXNjcmlwdG9yKSB7CisgICAgSGlkbFV0aWxzOjp1dWlkVG9IYWwoZGVzY3JpcHRvci50eXBlLCAmaGFsRGVzY3JpcHRvci0+dHlwZSk7CisgICAgSGlkbFV0aWxzOjp1dWlkVG9IYWwoZGVzY3JpcHRvci51dWlkLCAmaGFsRGVzY3JpcHRvci0+dXVpZCk7CisgICAgaGFsRGVzY3JpcHRvci0+ZmxhZ3MgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZGVzY3JpcHRvci5mbGFncyk7CisgICAgaGFsRGVzY3JpcHRvci0+Y3B1TG9hZCA9IGRlc2NyaXB0b3IuY3B1TG9hZDsKKyAgICBoYWxEZXNjcmlwdG9yLT5tZW1vcnlVc2FnZSA9IGRlc2NyaXB0b3IubWVtb3J5VXNhZ2U7CisgICAgbWVtY3B5KGhhbERlc2NyaXB0b3ItPm5hbWUsIGRlc2NyaXB0b3IubmFtZS5kYXRhKCksIGRlc2NyaXB0b3IubmFtZS5zaXplKCkpOworICAgIG1lbWNweShoYWxEZXNjcmlwdG9yLT5pbXBsZW1lbnRvciwKKyAgICAgICAgICAgIGRlc2NyaXB0b3IuaW1wbGVtZW50b3IuZGF0YSgpLCBkZXNjcmlwdG9yLmltcGxlbWVudG9yLnNpemUoKSk7Cit9CisKKy8vIFRPRE8obW5hZ2Fub3YpOiBUaGVzZSBidWZmZXIgY29udmVyc2lvbiBmdW5jdGlvbnMgc2hvdWxkIGJlIHNoYXJlZCB3aXRoIEVmZmVjdCB3cmFwcGVyCisvLyB2aWEgSGlkbFV0aWxzLiBNb3ZlIHRoZW0gdGhlcmUgd2hlbiBoYXJkd2FyZS9pbnRlcmZhY2VzIHdpbGwgZ2V0IHVuLWZyb3plbiBhZ2Fpbi4KKworLy8gc3RhdGljCit2b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdEJ1ZmZlckNvbmZpZ0Zyb21IYWwoCisgICAgICAgIGNvbnN0IGJ1ZmZlcl9jb25maWdfdCYgaGFsQ29uZmlnLCBFZmZlY3RCdWZmZXJDb25maWcqIGNvbmZpZykgeworICAgIGNvbmZpZy0+c2FtcGxpbmdSYXRlSHogPSBoYWxDb25maWcuc2FtcGxpbmdSYXRlOworICAgIGNvbmZpZy0+Y2hhbm5lbHMgPSBBdWRpb0NoYW5uZWxNYXNrKGhhbENvbmZpZy5jaGFubmVscyk7CisgICAgY29uZmlnLT5mb3JtYXQgPSBBdWRpb0Zvcm1hdChoYWxDb25maWcuZm9ybWF0KTsKKyAgICBjb25maWctPmFjY2Vzc01vZGUgPSBFZmZlY3RCdWZmZXJBY2Nlc3MoaGFsQ29uZmlnLmFjY2Vzc01vZGUpOworICAgIGNvbmZpZy0+bWFzayA9IEVmZmVjdENvbmZpZ1BhcmFtZXRlcnMoaGFsQ29uZmlnLm1hc2spOworfQorCisvLyBzdGF0aWMKK3ZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0QnVmZmVyQ29uZmlnVG9IYWwoCisgICAgICAgIGNvbnN0IEVmZmVjdEJ1ZmZlckNvbmZpZyYgY29uZmlnLCBidWZmZXJfY29uZmlnX3QqIGhhbENvbmZpZykgeworICAgIGhhbENvbmZpZy0+YnVmZmVyLmZyYW1lQ291bnQgPSAwOworICAgIGhhbENvbmZpZy0+YnVmZmVyLnJhdyA9IE5VTEw7CisgICAgaGFsQ29uZmlnLT5zYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxpbmdSYXRlSHo7CisgICAgaGFsQ29uZmlnLT5jaGFubmVscyA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihjb25maWcuY2hhbm5lbHMpOworICAgIGhhbENvbmZpZy0+YnVmZmVyUHJvdmlkZXIuY29va2llID0gTlVMTDsKKyAgICBoYWxDb25maWctPmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7CisgICAgaGFsQ29uZmlnLT5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKKyAgICBoYWxDb25maWctPmZvcm1hdCA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbmZpZy5mb3JtYXQpOworICAgIGhhbENvbmZpZy0+YWNjZXNzTW9kZSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbmZpZy5hY2Nlc3NNb2RlKTsKKyAgICBoYWxDb25maWctPm1hc2sgPSBzdGF0aWNfY2FzdDx1aW50OF90Pihjb25maWcubWFzayk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RDb25maWdGcm9tSGFsKGNvbnN0IGVmZmVjdF9jb25maWdfdCYgaGFsQ29uZmlnLCBFZmZlY3RDb25maWcqIGNvbmZpZykgeworICAgIGVmZmVjdEJ1ZmZlckNvbmZpZ0Zyb21IYWwoaGFsQ29uZmlnLmlucHV0Q2ZnLCAmY29uZmlnLT5pbnB1dENmZyk7CisgICAgZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbChoYWxDb25maWcub3V0cHV0Q2ZnLCAmY29uZmlnLT5vdXRwdXRDZmcpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0Q29uZmlnVG9IYWwoY29uc3QgRWZmZWN0Q29uZmlnJiBjb25maWcsIGVmZmVjdF9jb25maWdfdCogaGFsQ29uZmlnKSB7CisgICAgZWZmZWN0QnVmZmVyQ29uZmlnVG9IYWwoY29uZmlnLmlucHV0Q2ZnLCAmaGFsQ29uZmlnLT5pbnB1dENmZyk7CisgICAgZWZmZWN0QnVmZmVyQ29uZmlnVG9IYWwoY29uZmlnLm91dHB1dENmZywgJmhhbENvbmZpZy0+b3V0cHV0Q2ZnKTsKK30KKworLy8gc3RhdGljCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjphbmFseXplUmVzdWx0KGNvbnN0IFJlc3VsdCYgcmVzdWx0KSB7CisgICAgc3dpdGNoIChyZXN1bHQpIHsKKyAgICAgICAgY2FzZSBSZXN1bHQ6Ok9LOiByZXR1cm4gT0s7CisgICAgICAgIGNhc2UgUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUzogcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfU1RBVEU6IHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CisgICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ6IHJldHVybiBOT19JTklUOworICAgICAgICBjYXNlIFJlc3VsdDo6Tk9UX1NVUFBPUlRFRDogcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICBjYXNlIFJlc3VsdDo6UkVTVUxUX1RPT19CSUc6IHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIGRlZmF1bHQ6IHJldHVybiBOT19JTklUOworICAgIH0KK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6c2V0SW5CdWZmZXIoY29uc3Qgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiYgYnVmZmVyKSB7CisgICAgaWYgKCFtQnVmZmVyc0NoYW5nZWQpIHsKKyAgICAgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBudWxscHRyIHx8IG1JbkJ1ZmZlci5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXIuZ2V0KCkgIT0gbUluQnVmZmVyLmdldCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUJ1ZmZlcnNDaGFuZ2VkID0gYnVmZmVyLT5hdWRpb0J1ZmZlcigpICE9IG1JbkJ1ZmZlci0+YXVkaW9CdWZmZXIoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtSW5CdWZmZXIgPSBidWZmZXI7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpzZXRPdXRCdWZmZXIoY29uc3Qgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiYgYnVmZmVyKSB7CisgICAgaWYgKCFtQnVmZmVyc0NoYW5nZWQpIHsKKyAgICAgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBudWxscHRyIHx8IG1PdXRCdWZmZXIuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgbUJ1ZmZlcnNDaGFuZ2VkID0gYnVmZmVyLmdldCgpICE9IG1PdXRCdWZmZXIuZ2V0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXItPmF1ZGlvQnVmZmVyKCkgIT0gbU91dEJ1ZmZlci0+YXVkaW9CdWZmZXIoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtT3V0QnVmZmVyID0gYnVmZmVyOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6cHJvY2VzcygpIHsKKyAgICByZXR1cm4gcHJvY2Vzc0ltcGwoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpSRVFVRVNUX1BST0NFU1MpKTsKK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6cHJvY2Vzc1JldmVyc2UoKSB7CisgICAgcmV0dXJuIHByb2Nlc3NJbXBsKHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6UkVRVUVTVF9QUk9DRVNTX1JFVkVSU0UpKTsKK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6cHJlcGFyZUZvclByb2Nlc3NpbmcoKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiB0ZW1wU3RhdHVzTVE7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdC0+cHJlcGFyZUZvclByb2Nlc3NpbmcoCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IE1RRGVzY3JpcHRvclN5bmM8UmVzdWx0PiYgc3RhdHVzTVEpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICB0ZW1wU3RhdHVzTVEucmVzZXQobmV3IFN0YXR1c01RKHN0YXR1c01RKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSAmJiB0ZW1wU3RhdHVzTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRGbGFnOjpjcmVhdGVFdmVudEZsYWcodGVtcFN0YXR1c01RLT5nZXRFdmVudEZsYWdXb3JkKCksICZtRWZHcm91cCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXJldC5pc09rKCkgfHwgcmV0dmFsICE9IFJlc3VsdDo6T0spIHsKKyAgICAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldHZhbCkgOiBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgfQorICAgIGlmICghdGVtcFN0YXR1c01RIHx8ICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSB8fCAhbUVmR3JvdXApIHsKKyAgICAgICAgQUxPR0VfSUYoIXRlbXBTdGF0dXNNUSwgIkZhaWxlZCB0byBvYnRhaW4gc3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIGVmZmVjdHMiKTsKKyAgICAgICAgQUxPR0VfSUYodGVtcFN0YXR1c01RICYmICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSwKKyAgICAgICAgICAgICAgICAiU3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIGVmZmVjdHMgaXMgaW52YWxpZCIpOworICAgICAgICBBTE9HRV9JRighbUVmR3JvdXAsICJFdmVudCBmbGFnIGNyZWF0aW9uIGZvciBlZmZlY3RzIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgbVN0YXR1c01RID0gc3RkOjptb3ZlKHRlbXBTdGF0dXNNUSk7CisgICAgcmV0dXJuIE9LOworfQorCitib29sIEVmZmVjdEhhbEhpZGw6Om5lZWRUb1Jlc2V0QnVmZmVycygpIHsKKyAgICBpZiAobUJ1ZmZlcnNDaGFuZ2VkKSByZXR1cm4gdHJ1ZTsKKyAgICBib29sIGluQnVmZmVyRnJhbWVDb3VudFVwZGF0ZWQgPSBtSW5CdWZmZXItPmNoZWNrRnJhbWVDb3VudENoYW5nZSgpOworICAgIGJvb2wgb3V0QnVmZmVyRnJhbWVDb3VudFVwZGF0ZWQgPSBtT3V0QnVmZmVyLT5jaGVja0ZyYW1lQ291bnRDaGFuZ2UoKTsKKyAgICByZXR1cm4gaW5CdWZmZXJGcmFtZUNvdW50VXBkYXRlZCB8fCBvdXRCdWZmZXJGcmFtZUNvdW50VXBkYXRlZDsKK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6cHJvY2Vzc0ltcGwodWludDMyX3QgbXFGbGFnKSB7CisgICAgaWYgKG1FZmZlY3QgPT0gMCB8fCBtSW5CdWZmZXIgPT0gMCB8fCBtT3V0QnVmZmVyID09IDApIHJldHVybiBOT19JTklUOworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBpZiAoIW1TdGF0dXNNUSAmJiAoc3RhdHVzID0gcHJlcGFyZUZvclByb2Nlc3NpbmcoKSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgaWYgKG5lZWRUb1Jlc2V0QnVmZmVycygpICYmIChzdGF0dXMgPSBzZXRQcm9jZXNzQnVmZmVycygpKSAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICAvLyBUaGUgZGF0YSBpcyBhbHJlYWR5IGluIHRoZSBidWZmZXJzLCBqdXN0IG5lZWQgdG8gZmx1c2ggaXQgYW5kIHdha2UgdXAgdGhlIHNlcnZlciBzaWRlLgorICAgIHN0ZDo6YXRvbWljX3RocmVhZF9mZW5jZShzdGQ6Om1lbW9yeV9vcmRlcl9yZWxlYXNlKTsKKyAgICBtRWZHcm91cC0+d2FrZShtcUZsYWcpOworICAgIHVpbnQzMl90IGVmU3RhdGUgPSAwOworcmV0cnk6CisgICAgc3RhdHVzX3QgcmV0ID0gbUVmR3JvdXAtPndhaXQoCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6OkRPTkVfUFJPQ0VTU0lORyksICZlZlN0YXRlKTsKKyAgICBpZiAoZWZTdGF0ZSAmIHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6RE9ORV9QUk9DRVNTSU5HKSkgeworICAgICAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgICAgIG1TdGF0dXNNUS0+cmVhZCgmcmV0dmFsKTsKKyAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LIHx8IHJldHZhbCA9PSBSZXN1bHQ6OklOVkFMSURfU1RBVEUpIHsKKyAgICAgICAgICAgIC8vIFN5bmMgYmFjayB0aGUgY2hhbmdlZCBjb250ZW50cyBvZiB0aGUgYnVmZmVyLgorICAgICAgICAgICAgc3RkOjphdG9taWNfdGhyZWFkX2ZlbmNlKHN0ZDo6bWVtb3J5X29yZGVyX2FjcXVpcmUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbmFseXplUmVzdWx0KHJldHZhbCk7CisgICAgfQorICAgIGlmIChyZXQgPT0gLUVBR0FJTiB8fCByZXQgPT0gLUVJTlRSKSB7CisgICAgICAgIC8vIFNwdXJpb3VzIHdha2V1cC4gVGhpcyBub3JtYWxseSByZXRyaWVzIG5vIG1vcmUgdGhhbiBvbmNlLgorICAgICAgICBnb3RvIHJldHJ5OworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpzZXRQcm9jZXNzQnVmZmVycygpIHsKKyAgICBSZXR1cm48UmVzdWx0PiByZXQgPSBtRWZmZWN0LT5zZXRQcm9jZXNzQnVmZmVycygKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEJ1ZmZlckhhbEhpZGwqPihtSW5CdWZmZXIuZ2V0KCkpLT5oaWRsQnVmZmVyKCksCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RCdWZmZXJIYWxIaWRsKj4obU91dEJ1ZmZlci5nZXQoKSktPmhpZGxCdWZmZXIoKSk7CisgICAgaWYgKHJldC5pc09rKCkgJiYgcmV0ID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgbUJ1ZmZlcnNDaGFuZ2VkID0gZmFsc2U7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldCkgOiBGQUlMRURfVFJBTlNBQ1RJT047Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OmNvbW1hbmQodWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwgdm9pZCAqcENtZERhdGEsCisgICAgICAgIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpIHsKKyAgICBpZiAobUVmZmVjdCA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKworICAgIC8vIFNwZWNpYWwgY2FzZXMuCisgICAgaWYgKGNtZENvZGUgPT0gRUZGRUNUX0NNRF9TRVRfQ09ORklHIHx8IGNtZENvZGUgPT0gRUZGRUNUX0NNRF9TRVRfQ09ORklHX1JFVkVSU0UpIHsKKyAgICAgICAgcmV0dXJuIHNldENvbmZpZ0ltcGwoY21kQ29kZSwgY21kU2l6ZSwgcENtZERhdGEsIHJlcGx5U2l6ZSwgcFJlcGx5RGF0YSk7CisgICAgfSBlbHNlIGlmIChjbWRDb2RlID09IEVGRkVDVF9DTURfR0VUX0NPTkZJRyB8fCBjbWRDb2RlID09IEVGRkVDVF9DTURfR0VUX0NPTkZJR19SRVZFUlNFKSB7CisgICAgICAgIHJldHVybiBnZXRDb25maWdJbXBsKGNtZENvZGUsIHJlcGx5U2l6ZSwgcFJlcGx5RGF0YSk7CisgICAgfQorCisgICAgLy8gQ29tbW9uIGNhc2UuCisgICAgaGlkbF92ZWM8dWludDhfdD4gaGlkbERhdGE7CisgICAgaWYgKHBDbWREYXRhICE9IG51bGxwdHIgJiYgY21kU2l6ZSA+IDApIHsKKyAgICAgICAgaGlkbERhdGEuc2V0VG9FeHRlcm5hbChyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihwQ21kRGF0YSksIGNtZFNpemUpOworICAgIH0KKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgdWludDMyX3QgcmVwbHlTaXplU3R1YiA9IDA7CisgICAgaWYgKHJlcGx5U2l6ZSA9PSBudWxscHRyIHx8IHBSZXBseURhdGEgPT0gbnVsbHB0cikgcmVwbHlTaXplID0gJnJlcGx5U2l6ZVN0dWI7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3QtPmNvbW1hbmQoY21kQ29kZSwgaGlkbERhdGEsICpyZXBseVNpemUsCisgICAgICAgICAgICBbJl0oaW50MzJfdCBzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCpyZXBseVNpemUgPiByZXN1bHQuc2l6ZSgpKSAqcmVwbHlTaXplID0gcmVzdWx0LnNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBSZXBseURhdGEgIT0gbnVsbHB0ciAmJiAqcmVwbHlTaXplID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHBSZXBseURhdGEsICZyZXN1bHRbMF0sICpyZXBseVNpemUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHJldC5pc09rKCkgPyBzdGF0dXMgOiBGQUlMRURfVFJBTlNBQ1RJT047Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OmdldERlc2NyaXB0b3IoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIHsKKyAgICBpZiAobUVmZmVjdCA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3QtPmdldERlc2NyaXB0b3IoCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IEVmZmVjdERlc2NyaXB0b3ImIHJlc3VsdCkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIGVmZmVjdERlc2NyaXB0b3JUb0hhbChyZXN1bHQsIHBEZXNjcmlwdG9yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0dmFsKSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Y2xvc2UoKSB7CisgICAgaWYgKG1FZmZlY3QgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmV0dXJuPFJlc3VsdD4gcmV0ID0gbUVmZmVjdC0+Y2xvc2UoKTsKKyAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0KSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Z2V0Q29uZmlnSW1wbCgKKyAgICAgICAgdWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSkgeworICAgIGlmIChyZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpIHx8IHBSZXBseURhdGEgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzdGF0dXNfdCByZXN1bHQgPSBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgUmV0dXJuPHZvaWQ+IHJldDsKKyAgICBpZiAoY21kQ29kZSA9PSBFRkZFQ1RfQ01EX0dFVF9DT05GSUcpIHsKKyAgICAgICAgcmV0ID0gbUVmZmVjdC0+Z2V0Q29uZmlnKFsmXSAoUmVzdWx0IHIsIGNvbnN0IEVmZmVjdENvbmZpZyAmaGlkbENvbmZpZykgeworICAgICAgICAgICAgcmVzdWx0ID0gYW5hbHl6ZVJlc3VsdChyKTsKKyAgICAgICAgICAgIGlmIChyID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICBlZmZlY3RDb25maWdUb0hhbChoaWRsQ29uZmlnLCBzdGF0aWNfY2FzdDxlZmZlY3RfY29uZmlnX3QqPihwUmVwbHlEYXRhKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IG1FZmZlY3QtPmdldENvbmZpZ1JldmVyc2UoWyZdIChSZXN1bHQgciwgY29uc3QgRWZmZWN0Q29uZmlnICZoaWRsQ29uZmlnKSB7CisgICAgICAgICAgICByZXN1bHQgPSBhbmFseXplUmVzdWx0KHIpOworICAgICAgICAgICAgaWYgKHIgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgIGVmZmVjdENvbmZpZ1RvSGFsKGhpZGxDb25maWcsIHN0YXRpY19jYXN0PGVmZmVjdF9jb25maWdfdCo+KHBSZXBseURhdGEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICByZXN1bHQgPSBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldENvbmZpZ0ltcGwoCisgICAgICAgIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsIHZvaWQgKnBDbWREYXRhLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7CisgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSAhPSBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSB8fAorICAgICAgICAgICAgcmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50MzJfdCkgfHwgcFJlcGx5RGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGNvbnN0IGVmZmVjdF9jb25maWdfdCAqaGFsQ29uZmlnID0gc3RhdGljX2Nhc3Q8ZWZmZWN0X2NvbmZpZ190Kj4ocENtZERhdGEpOworICAgIGlmIChoYWxDb25maWctPmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciAhPSBOVUxMIHx8CisgICAgICAgICAgICBoYWxDb25maWctPmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgIT0gTlVMTCB8fAorICAgICAgICAgICAgaGFsQ29uZmlnLT5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyICE9IE5VTEwgfHwKKyAgICAgICAgICAgIGhhbENvbmZpZy0+b3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgIT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiQnVmZmVyIHByb3ZpZGVyIGNhbGxiYWNrcyBhcmUgbm90IHN1cHBvcnRlZCIpOworICAgIH0KKyAgICBFZmZlY3RDb25maWcgaGlkbENvbmZpZzsKKyAgICBlZmZlY3RDb25maWdGcm9tSGFsKCpoYWxDb25maWcsICZoaWRsQ29uZmlnKTsKKyAgICBSZXR1cm48UmVzdWx0PiByZXQgPSBjbWRDb2RlID09IEVGRkVDVF9DTURfU0VUX0NPTkZJRyA/CisgICAgICAgICAgICBtRWZmZWN0LT5zZXRDb25maWcoaGlkbENvbmZpZywgbnVsbHB0ciwgbnVsbHB0cikgOgorICAgICAgICAgICAgbUVmZmVjdC0+c2V0Q29uZmlnUmV2ZXJzZShoaWRsQ29uZmlnLCBudWxscHRyLCBudWxscHRyKTsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgaWYgKHJldC5pc09rKCkpIHsKKyAgICAgICAgcmVzdWx0ID0gYW5hbHl6ZVJlc3VsdChyZXQpOworICAgICAgICAqc3RhdGljX2Nhc3Q8aW50MzJfdCo+KHBSZXBseURhdGEpID0gcmVzdWx0OworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9FZmZlY3RIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0SGFsSGlkbC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJhdWRpb2hhbC9FZmZlY3RIYWxIaWRsLmgKcmVuYW1lIHRvIG1lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RIYWxIaWRsLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ0MGU2ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJFZmZlY3RzRmFjdG9yeUhhbEhpZGwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorCisjaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKKyNpbmNsdWRlICJFZmZlY3RCdWZmZXJIYWxIaWRsLmgiCisjaW5jbHVkZSAiRWZmZWN0SGFsSGlkbC5oIgorI2luY2x1ZGUgIkVmZmVjdHNGYWN0b3J5SGFsSGlkbC5oIgorI2luY2x1ZGUgIkhpZGxVdGlscy5oIgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpIaWRsVXRpbHM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpVdWlkOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6SUVmZmVjdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OlJlc3VsdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OkVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpIDogQ29udmVyc2lvbkhlbHBlckhpZGwoIkVmZmVjdHNGYWN0b3J5IikgeworICAgIG1FZmZlY3RzRmFjdG9yeSA9IElFZmZlY3RzRmFjdG9yeTo6Z2V0U2VydmljZSgpOworICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9idGFpbiBJRWZmZWN0c0ZhY3Rvcnkgc2VydmljZSwgdGVybWluYXRpbmcgcHJvY2Vzcy4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9Cit9CisKK0VmZmVjdHNGYWN0b3J5SGFsSGlkbDo6fkVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpIHsKK30KKworc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpxdWVyeUFsbERlc2NyaXB0b3JzKCkgeworICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmdldEFsbERlc2NyaXB0b3JzKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxFZmZlY3REZXNjcmlwdG9yPiYgcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgbUxhc3REZXNjcmlwdG9ycyA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAocmV0LmlzT2soKSkgeworICAgICAgICByZXR1cm4gcmV0dmFsID09IFJlc3VsdDo6T0sgPyBPSyA6IE5PX0lOSVQ7CisgICAgfQorICAgIG1MYXN0RGVzY3JpcHRvcnMucmVzaXplKDApOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKF9fRlVOQ1RJT05fXywgcmV0KTsKK30KKworc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpxdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKnBOdW1FZmZlY3RzKSB7CisgICAgc3RhdHVzX3QgcXVlcnlSZXN1bHQgPSBxdWVyeUFsbERlc2NyaXB0b3JzKCk7CisgICAgaWYgKHF1ZXJ5UmVzdWx0ID09IE9LKSB7CisgICAgICAgICpwTnVtRWZmZWN0cyA9IG1MYXN0RGVzY3JpcHRvcnMuc2l6ZSgpOworICAgIH0KKyAgICByZXR1cm4gcXVlcnlSZXN1bHQ7Cit9CisKK3N0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6Z2V0RGVzY3JpcHRvcigKKyAgICAgICAgdWludDMyX3QgaW5kZXgsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7CisgICAgLy8gVE9ETzogV2UgbmVlZCBzb21laG93IHRvIHRyYWNrIHRoZSBjaGFuZ2VzIG9uIHRoZSBzZXJ2ZXIgc2lkZQorICAgIC8vIG9yIGZpZ3VyZSBvdXQgaG93IHRvIGNvbnZlcnQgZXZlcnlib2R5IHRvIHF1ZXJ5IGFsbCB0aGUgZGVzY3JpcHRvcnMgYXQgb25jZS4KKyAgICAvLyBUT0RPOiBjaGVjayBmb3IgbnVsbHB0cgorICAgIGlmIChtTGFzdERlc2NyaXB0b3JzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHN0YXR1c190IHF1ZXJ5UmVzdWx0ID0gcXVlcnlBbGxEZXNjcmlwdG9ycygpOworICAgICAgICBpZiAocXVlcnlSZXN1bHQgIT0gT0spIHJldHVybiBxdWVyeVJlc3VsdDsKKyAgICB9CisgICAgaWYgKGluZGV4ID49IG1MYXN0RGVzY3JpcHRvcnMuc2l6ZSgpKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0RGVzY3JpcHRvclRvSGFsKG1MYXN0RGVzY3JpcHRvcnNbaW5kZXhdLCBwRGVzY3JpcHRvcik7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmdldERlc2NyaXB0b3IoCisgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgeworICAgIC8vIFRPRE86IGNoZWNrIGZvciBudWxscHRyCisgICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBVdWlkIGhpZGxVdWlkOworICAgIEhpZGxVdGlsczo6dXVpZEZyb21IYWwoKnBFZmZlY3RVdWlkLCAmaGlkbFV1aWQpOworICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdHNGYWN0b3J5LT5nZXREZXNjcmlwdG9yKGhpZGxVdWlkLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBFZmZlY3REZXNjcmlwdG9yJiByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICBFZmZlY3RIYWxIaWRsOjplZmZlY3REZXNjcmlwdG9yVG9IYWwocmVzdWx0LCBwRGVzY3JpcHRvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKHJldC5pc09rKCkpIHsKKyAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSByZXR1cm4gT0s7CisgICAgICAgIGVsc2UgaWYgKHJldHZhbCA9PSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgICAgIGVsc2UgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKF9fRlVOQ1RJT05fXywgcmV0KTsKK30KKworc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpjcmVhdGVFZmZlY3QoCisgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLCBpbnQzMl90IHNlc3Npb25JZCwgaW50MzJfdCBpb0lkLAorICAgICAgICBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+ICplZmZlY3QpIHsKKyAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOworICAgIFV1aWQgaGlkbFV1aWQ7CisgICAgSGlkbFV0aWxzOjp1dWlkRnJvbUhhbCgqcEVmZmVjdFV1aWQsICZoaWRsVXVpZCk7CisgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmNyZWF0ZUVmZmVjdCgKKyAgICAgICAgICAgIGhpZGxVdWlkLCBzZXNzaW9uSWQsIGlvSWQsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElFZmZlY3Q+JiByZXN1bHQsIHVpbnQ2NF90IGVmZmVjdElkKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKmVmZmVjdCA9IG5ldyBFZmZlY3RIYWxIaWRsKHJlc3VsdCwgZWZmZWN0SWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmIChyZXQuaXNPaygpKSB7CisgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgcmV0dXJuIE9LOworICAgICAgICBlbHNlIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUykgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgICAgICBlbHNlIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybihfX0ZVTkNUSU9OX18sIHJldCk7Cit9CisKK3N0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6ZHVtcEVmZmVjdHMoaW50IGZkKSB7CisgICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBuYXRpdmVfaGFuZGxlX3QqIGhpZGxIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKKyAgICBoaWRsSGFuZGxlLT5kYXRhWzBdID0gZmQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+ZGVidWdEdW1wKGhpZGxIYW5kbGUpOworICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhpZGxIYW5kbGUpOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKF9fRlVOQ1RJT05fXywgcmV0KTsKK30KKworc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjphbGxvY2F0ZUJ1ZmZlcihzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSB7CisgICAgcmV0dXJuIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmFsbG9jYXRlKHNpemUsIGJ1ZmZlcik7Cit9CisKK3N0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6bWlycm9yQnVmZmVyKHZvaWQqIGV4dGVybmFsLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSB7CisgICAgcmV0dXJuIEVmZmVjdEJ1ZmZlckhhbEhpZGw6Om1pcnJvcihleHRlcm5hbCwgc2l6ZSwgYnVmZmVyKTsKK30KKworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJiNTQ4MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuaApAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVFNfRkFDVE9SWV9IQUxfSElETF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUU19GQUNUT1JZX0hBTF9ISURMX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0LzIuMC9JRWZmZWN0c0ZhY3RvcnkuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpFZmZlY3REZXNjcmlwdG9yOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6SUVmZmVjdHNGYWN0b3J5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7CisKK2NsYXNzIEVmZmVjdHNGYWN0b3J5SGFsSGlkbCA6IHB1YmxpYyBFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZSwgcHVibGljIENvbnZlcnNpb25IZWxwZXJIaWRsCit7CisgIHB1YmxpYzoKKyAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGlmZmVyZW50IGVmZmVjdHMgaW4gYWxsIGxvYWRlZCBsaWJyYXJpZXMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKnBOdW1FZmZlY3RzKTsKKworICAgIC8vIFJldHVybnMgYSBkZXNjcmlwdG9yIG9mIHRoZSBuZXh0IGF2YWlsYWJsZSBlZmZlY3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXNjcmlwdG9yKHVpbnQzMl90IGluZGV4LAorICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLAorICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOworCisgICAgLy8gQ3JlYXRlcyBhbiBlZmZlY3QgZW5naW5lIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KKyAgICAvLyBUbyByZWxlYXNlIHRoZSBlZmZlY3QgZW5naW5lLCBpdCBpcyBuZWNlc3NhcnkgdG8gcmVsZWFzZSByZWZlcmVuY2VzCisgICAgLy8gdG8gdGhlIHJldHVybmVkIGVmZmVjdCBvYmplY3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsCisgICAgICAgICAgICBpbnQzMl90IHNlc3Npb25JZCwgaW50MzJfdCBpb0lkLAorICAgICAgICAgICAgc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiAqZWZmZWN0KTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcEVmZmVjdHMoaW50IGZkKTsKKworICAgIHN0YXR1c190IGFsbG9jYXRlQnVmZmVyKHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIG92ZXJyaWRlOworICAgIHN0YXR1c190IG1pcnJvckJ1ZmZlcih2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgb3ZlcnJpZGU7CisKKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U7CisKKyAgICBzcDxJRWZmZWN0c0ZhY3Rvcnk+IG1FZmZlY3RzRmFjdG9yeTsKKyAgICBoaWRsX3ZlYzxFZmZlY3REZXNjcmlwdG9yPiBtTGFzdERlc2NyaXB0b3JzOworCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIEVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpOworICAgIHZpcnR1YWwgfkVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpOworCisgICAgc3RhdHVzX3QgcXVlcnlBbGxEZXNjcmlwdG9ycygpOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RTX0ZBQ1RPUllfSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbUhhbEhpZGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NjljZDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtSGFsSGlkbC5jcHAKQEAgLTAsMCArMSw3NjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlN0cmVhbUhhbEhpZGwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JU3RyZWFtT3V0Q2FsbGJhY2suaD4KKyNpbmNsdWRlIDxod2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKKyNpbmNsdWRlICJFZmZlY3RIYWxIaWRsLmgiCisjaW5jbHVkZSAiU3RyZWFtSGFsSGlkbC5oIgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb0NoYW5uZWxNYXNrOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9Gb3JtYXQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpUaHJlYWRJbmZvOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OkF1ZGlvRHJhaW47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVN0cmVhbU91dENhbGxiYWNrOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6Ok1lc3NhZ2VRdWV1ZUZsYWdCaXRzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6Ok1tYXBCdWZmZXJJbmZvOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6Ok1tYXBQb3NpdGlvbjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpQYXJhbWV0ZXJWYWx1ZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpSZXN1bHQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6VGltZVNwZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIFJlYWRDb21tYW5kID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklTdHJlYW1Jbjo6UmVhZENvbW1hbmQ7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworU3RyZWFtSGFsSGlkbDo6U3RyZWFtSGFsSGlkbChJU3RyZWFtICpzdHJlYW0pCisgICAgICAgIDogQ29udmVyc2lvbkhlbHBlckhpZGwoIlN0cmVhbSIpLAorICAgICAgICAgIG1TdHJlYW0oc3RyZWFtKSwKKyAgICAgICAgICBtSGFsVGhyZWFkUHJpb3JpdHkoSEFMX1RIUkVBRF9QUklPUklUWV9ERUZBVUxUKSwKKyAgICAgICAgICBtQ2FjaGVkQnVmZmVyU2l6ZSgwKXsKKworICAgIC8vIEluc3RydW1lbnQgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCisgICAgLy8gTm90ZTogVGhpcyBhc3N1bWVzIGNoYW5uZWwgbWFzaywgZm9ybWF0LCBhbmQgc2FtcGxlIHJhdGUgZG8gbm90IGNoYW5nZSBhZnRlciBjcmVhdGlvbi4KKyAgICBpZiAobVN0cmVhbSAhPSBudWxscHRyICYmIG1TdHJlYW1Qb3dlckxvZy5pc1VzZXJEZWJ1Z09yRW5nQnVpbGQoKSkgeworICAgICAgICAvLyBPYnRhaW4gYXVkaW8gcHJvcGVydGllcyAoc2VlIFN0cmVhbUhhbEhpZGw6OmdldEF1ZGlvUHJvcGVydGllcygpIGJlbG93KS4KKyAgICAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEF1ZGlvUHJvcGVydGllcygKKyAgICAgICAgICAgICAgICBbJl0odWludDMyX3Qgc3IsIEF1ZGlvQ2hhbm5lbE1hc2sgbSwgQXVkaW9Gb3JtYXQgZikgeworICAgICAgICAgICAgICAgIG1TdHJlYW1Qb3dlckxvZy5pbml0KHNyLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KG0pLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KGYpKTsKKyAgICAgICAgICAgIH0pOworICAgIH0KK30KKworU3RyZWFtSGFsSGlkbDo6flN0cmVhbUhhbEhpZGwoKSB7CisgICAgbVN0cmVhbSA9IG51bGxwdHI7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRTYW1wbGVSYXRlIiwgbVN0cmVhbS0+Z2V0U2FtcGxlUmF0ZSgpLCByYXRlKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHN0YXR1c190IHN0YXR1cyA9IHByb2Nlc3NSZXR1cm4oImdldEJ1ZmZlclNpemUiLCBtU3RyZWFtLT5nZXRCdWZmZXJTaXplKCksIHNpemUpOworICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgbUNhY2hlZEJ1ZmZlclNpemUgPSAqc2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRDaGFubmVsTWFzayIsIG1TdHJlYW0tPmdldENoYW5uZWxNYXNrKCksIG1hc2spOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZvcm1hdCIsIG1TdHJlYW0tPmdldEZvcm1hdCgpLCBmb3JtYXQpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRBdWRpb1Byb3BlcnRpZXMoCisgICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEF1ZGlvUHJvcGVydGllcygKKyAgICAgICAgICAgIFsmXSh1aW50MzJfdCBzciwgQXVkaW9DaGFubmVsTWFzayBtLCBBdWRpb0Zvcm1hdCBmKSB7CisgICAgICAgICAgICAgICAgKnNhbXBsZVJhdGUgPSBzcjsKKyAgICAgICAgICAgICAgICAqbWFzayA9IHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihtKTsKKyAgICAgICAgICAgICAgICAqZm9ybWF0ID0gc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KGYpOworICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEF1ZGlvUHJvcGVydGllcyIsIHJldCk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGhpZGxQYXJhbXM7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyYW1ldGVyc0Zyb21IYWwoa3ZQYWlycywgJmhpZGxQYXJhbXMpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFBhcmFtZXRlcnMiLCBtU3RyZWFtLT5zZXRQYXJhbWV0ZXJzKGhpZGxQYXJhbXMpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKKyAgICB2YWx1ZXMtPmNsZWFyKCk7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gaGlkbEtleXM7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0ga2V5c0Zyb21IYWwoa2V5cywgJmhpZGxLZXlzKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldFBhcmFtZXRlcnMoCisgICAgICAgICAgICBoaWRsS2V5cywKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+JiBwYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyc1RvSGFsKHBhcmFtZXRlcnMsIHZhbHVlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFBhcmFtZXRlcnMiLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmFkZEVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCkgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImFkZEVmZmVjdCIsIG1TdHJlYW0tPmFkZEVmZmVjdCgKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0SGFsSGlkbCo+KGVmZmVjdC5nZXQoKSktPmVmZmVjdElkKCkpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6cmVtb3ZlRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicmVtb3ZlRWZmZWN0IiwgbVN0cmVhbS0+cmVtb3ZlRWZmZWN0KAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RIYWxIaWRsKj4oZWZmZWN0LmdldCgpKS0+ZWZmZWN0SWQoKSkpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzdGFuZGJ5KCkgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN0YW5kYnkiLCBtU3RyZWFtLT5zdGFuZGJ5KCkpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpkdW1wKGludCBmZCkgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgbmF0aXZlX2hhbmRsZV90KiBoaWRsSGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7CisgICAgaGlkbEhhbmRsZS0+ZGF0YVswXSA9IGZkOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5kZWJ1Z0R1bXAoaGlkbEhhbmRsZSk7CisgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7CisgICAgbVN0cmVhbVBvd2VyTG9nLmR1bXAoZmQpOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJkdW1wIiwgcmV0KTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c3RhcnQoKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3RhcnQiLCBtU3RyZWFtLT5zdGFydCgpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c3RvcCgpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdG9wIiwgbVN0cmVhbS0+c3RvcCgpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Y3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pIHsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5jcmVhdGVNbWFwQnVmZmVyKAorICAgICAgICAgICAgbWluU2l6ZUZyYW1lcywKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgTW1hcEJ1ZmZlckluZm8mIGhpZGxJbmZvKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZSAqaGFuZGxlID0gaGlkbEluZm8uc2hhcmVkTWVtb3J5LmhhbmRsZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlLT5udW1GZHMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zaGFyZWRfbWVtb3J5X2ZkID0gaGFuZGxlLT5kYXRhWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+YnVmZmVyX3NpemVfZnJhbWVzID0gaGlkbEluZm8uYnVmZmVyU2l6ZUZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmJ1cnN0X3NpemVfZnJhbWVzID0gaGlkbEluZm8uYnVyc3RTaXplRnJhbWVzOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5mby0+c2hhcmVkX21lbW9yeV9hZGRyZXNzIGlzIG5vdCBuZWVkZWQgaW4gSElETCBjb250ZXh0CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zaGFyZWRfbWVtb3J5X2FkZHJlc3MgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiY3JlYXRlTW1hcEJ1ZmZlciIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgeworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldE1tYXBQb3NpdGlvbigKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgTW1hcFBvc2l0aW9uJiBoaWRsUG9zaXRpb24pIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbi0+dGltZV9uYW5vc2Vjb25kcyA9IGhpZGxQb3NpdGlvbi50aW1lTmFub3NlY29uZHM7CisgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLT5wb3NpdGlvbl9mcmFtZXMgPSBoaWRsUG9zaXRpb24ucG9zaXRpb25GcmFtZXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1tYXBQb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50IHByaW9yaXR5KSB7CisgICAgbUhhbFRocmVhZFByaW9yaXR5ID0gcHJpb3JpdHk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRDYWNoZWRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSkgeworICAgIGlmIChtQ2FjaGVkQnVmZmVyU2l6ZSAhPSAwKSB7CisgICAgICAgICpzaXplID0gbUNhY2hlZEJ1ZmZlclNpemU7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgcmV0dXJuIGdldEJ1ZmZlclNpemUoc2l6ZSk7Cit9CisKK2Jvb2wgU3RyZWFtSGFsSGlkbDo6cmVxdWVzdEhhbFRocmVhZFByaW9yaXR5KHBpZF90IHRocmVhZFBpZCwgcGlkX3QgdGhyZWFkSWQpIHsKKyAgICBpZiAobUhhbFRocmVhZFByaW9yaXR5ID09IEhBTF9USFJFQURfUFJJT1JJVFlfREVGQVVMVCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaW50IGVyciA9IHJlcXVlc3RQcmlvcml0eSgKKyAgICAgICAgICAgIHRocmVhZFBpZCwgdGhyZWFkSWQsCisgICAgICAgICAgICBtSGFsVGhyZWFkUHJpb3JpdHksIGZhbHNlIC8qaXNGb3JBcHAqLywgdHJ1ZSAvKmFzeW5jaHJvbm91cyovKTsKKyAgICBBTE9HRV9JRihlcnIsICJmYWlsZWQgdG8gc2V0IHByaW9yaXR5ICVkIGZvciBwaWQgJWQgdGlkICVkOyBlcnJvciAlZCIsCisgICAgICAgICAgICBtSGFsVGhyZWFkUHJpb3JpdHksIHRocmVhZFBpZCwgdGhyZWFkSWQsIGVycik7CisgICAgLy8gQXVkaW8gd2lsbCBzdGlsbCB3b3JrLCBidXQgbGF0ZW5jeSB3aWxsIGJlIGhpZ2hlciBhbmQgc29tZXRpbWVzIHVuYWNjZXB0YWJsZS4KKyAgICByZXR1cm4gZXJyID09IDA7Cit9CisKK25hbWVzcGFjZSB7CisKKy8qIE5vdGVzIG9uIGNhbGxiYWNrIG93bmVyc2hpcC4KKworVGhpcyBpcyBob3cgKEh3KUJpbmRlciBvd25lcnNoaXAgbW9kZWwgbG9va3MgbGlrZS4gVGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgoraXMgb3duZWQgYnkgQmluZGVyIGZyYW1ld29yayAodmlhIHNwPD4pLiBQcm94aWVzIGFyZSBvd25lZCBieSBjbGllbnRzLgorV2hlbiB0aGUgbGFzdCBwcm94eSBkaXNhcHBlYXJzLCBCaW5kZXIgZnJhbWV3b3JrIHJlbGVhc2VzIHRoZSBzZXJ2ZXIgaW1wbC4KKworVGh1cywgaXQgaXMgbm90IG5lZWRlZCB0byBrZWVwIGFueSByZWZlcmVuY2VzIHRvIFN0cmVhbU91dENhbGxiYWNrICh0aGlzIGlzCit0aGUgc2VydmVyIGltcGwpIC0tIGl0IHdpbGwgbGl2ZSBhcyBsb25nIGFzIEhBTCBzZXJ2ZXIgaG9sZHMgYSBzdHJvbmcgcmVmIHRvCitJU3RyZWFtT3V0Q2FsbGJhY2sgcHJveHkuIFdlIGNsZWFyIHRoYXQgcmVmZXJlbmNlIGJ5IGNhbGxpbmcgJ2NsZWFyQ2FsbGJhY2snCitmcm9tIHRoZSBkZXN0cnVjdG9yIG9mIFN0cmVhbU91dEhhbEhpZGwuCisKK1RoZSBjYWxsYmFjayBvbmx5IGtlZXBzIGEgd2VhayByZWZlcmVuY2UgdG8gdGhlIHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBvd25lZAorYnkgQXVkaW9GbGluZ2VyLgorCisqLworCitzdHJ1Y3QgU3RyZWFtT3V0Q2FsbGJhY2sgOiBwdWJsaWMgSVN0cmVhbU91dENhbGxiYWNrIHsKKyAgICBTdHJlYW1PdXRDYWxsYmFjayhjb25zdCB3cDxTdHJlYW1PdXRIYWxIaWRsPiYgc3RyZWFtKSA6IG1TdHJlYW0oc3RyZWFtKSB7fQorCisgICAgLy8gSVN0cmVhbU91dENhbGxiYWNrIGltcGxlbWVudGF0aW9uCisgICAgUmV0dXJuPHZvaWQ+IG9uV3JpdGVSZWFkeSgpICBvdmVycmlkZSB7CisgICAgICAgIHNwPFN0cmVhbU91dEhhbEhpZGw+IHN0cmVhbSA9IG1TdHJlYW0ucHJvbW90ZSgpOworICAgICAgICBpZiAoc3RyZWFtICE9IDApIHsKKyAgICAgICAgICAgIHN0cmVhbS0+b25Xcml0ZVJlYWR5KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICBSZXR1cm48dm9pZD4gb25EcmFpblJlYWR5KCkgIG92ZXJyaWRlIHsKKyAgICAgICAgc3A8U3RyZWFtT3V0SGFsSGlkbD4gc3RyZWFtID0gbVN0cmVhbS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChzdHJlYW0gIT0gMCkgeworICAgICAgICAgICAgc3RyZWFtLT5vbkRyYWluUmVhZHkoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIFJldHVybjx2b2lkPiBvbkVycm9yKCkgIG92ZXJyaWRlIHsKKyAgICAgICAgc3A8U3RyZWFtT3V0SGFsSGlkbD4gc3RyZWFtID0gbVN0cmVhbS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChzdHJlYW0gIT0gMCkgeworICAgICAgICAgICAgc3RyZWFtLT5vbkVycm9yKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICB3cDxTdHJlYW1PdXRIYWxIaWRsPiBtU3RyZWFtOworfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK1N0cmVhbU91dEhhbEhpZGw6OlN0cmVhbU91dEhhbEhpZGwoY29uc3Qgc3A8SVN0cmVhbU91dD4mIHN0cmVhbSkKKyAgICAgICAgOiBTdHJlYW1IYWxIaWRsKHN0cmVhbS5nZXQoKSksIG1TdHJlYW0oc3RyZWFtKSwgbVdyaXRlckNsaWVudCgwKSwgbUVmR3JvdXAobnVsbHB0cikgeworfQorCitTdHJlYW1PdXRIYWxIaWRsOjp+U3RyZWFtT3V0SGFsSGlkbCgpIHsKKyAgICBpZiAobVN0cmVhbSAhPSAwKSB7CisgICAgICAgIGlmIChtQ2FsbGJhY2sudW5zYWZlX2dldCgpKSB7CisgICAgICAgICAgICBwcm9jZXNzUmV0dXJuKCJjbGVhckNhbGxiYWNrIiwgbVN0cmVhbS0+Y2xlYXJDYWxsYmFjaygpKTsKKyAgICAgICAgfQorICAgICAgICBwcm9jZXNzUmV0dXJuKCJjbG9zZSIsIG1TdHJlYW0tPmNsb3NlKCkpOworICAgICAgICBtU3RyZWFtLmNsZWFyKCk7CisgICAgfQorICAgIG1DYWxsYmFjay5jbGVhcigpOworICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CisgICAgaWYgKG1FZkdyb3VwKSB7CisgICAgICAgIEV2ZW50RmxhZzo6ZGVsZXRlRXZlbnRGbGFnKCZtRWZHcm91cCk7CisgICAgfQorfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZyYW1lU2l6ZSIsIG1TdHJlYW0tPmdldEZyYW1lU2l6ZSgpLCBzaXplKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIGlmIChtV3JpdGVyQ2xpZW50ID09IGdldHRpZCgpICYmIG1Db21tYW5kTVEpIHsKKyAgICAgICAgcmV0dXJuIGNhbGxXcml0ZXJUaHJlYWQoCisgICAgICAgICAgICAgICAgV3JpdGVDb21tYW5kOjpHRVRfTEFURU5DWSwgImdldExhdGVuY3kiLCBudWxscHRyLCAwLAorICAgICAgICAgICAgICAgIFsmXShjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgKmxhdGVuY3kgPSB3cml0ZVN0YXR1cy5yZXBseS5sYXRlbmN5TXM7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldExhdGVuY3kiLCBtU3RyZWFtLT5nZXRMYXRlbmN5KCksIGxhdGVuY3kpOworICAgIH0KK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFZvbHVtZSIsIG1TdHJlYW0tPnNldFZvbHVtZShsZWZ0LCByaWdodCkpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjp3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgKndyaXR0ZW4gPSAwOworCisgICAgaWYgKGJ5dGVzID09IDAgJiYgIW1EYXRhTVEpIHsKKyAgICAgICAgLy8gQ2FuJ3QgZGV0ZXJtaW5lIHRoZSBzaXplIGZvciB0aGUgTVEgYnVmZmVyLiBXYWl0IGZvciBhIG5vbi1lbXB0eSB3cml0ZSByZXF1ZXN0LgorICAgICAgICBBTE9HV19JRihtQ2FsbGJhY2sudW5zYWZlX2dldCgpLCAiRmlyc3QgY2FsbCB0byBhc3luYyB3cml0ZSB3aXRoIDAgYnl0ZXMiKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBpZiAoIW1EYXRhTVEpIHsKKyAgICAgICAgLy8gSW4gY2FzZSBpZiBwbGF5YmFjayBzdGFydHMgY2xvc2UgdG8gdGhlIGVuZCBvZiBhIGNvbXByZXNzZWQgdHJhY2ssIHRoZSBieXRlcworICAgICAgICAvLyB0aGF0IG5lZWQgdG8gYmUgd3JpdHRlbiBpcyBsZXNzIHRoYW4gdGhlIGFjdHVhbCBidWZmZXIgc2l6ZS4gTmVlZCB0byB1c2UKKyAgICAgICAgLy8gZnVsbCBidWZmZXIgc2l6ZSBmb3IgdGhlIE1RIHNpbmNlIG90aGVyd2lzZSBhZnRlciBzZWVraW5nIGJhY2sgdG8gdGhlIG1pZGRsZQorICAgICAgICAvLyBkYXRhIHdpbGwgYmUgdHJ1bmNhdGVkLgorICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZTsKKyAgICAgICAgaWYgKChzdGF0dXMgPSBnZXRDYWNoZWRCdWZmZXJTaXplKCZidWZmZXJTaXplKSkgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ5dGVzID4gYnVmZmVyU2l6ZSkgYnVmZmVyU2l6ZSA9IGJ5dGVzOworICAgICAgICBpZiAoKHN0YXR1cyA9IHByZXBhcmVGb3JXcml0aW5nKGJ1ZmZlclNpemUpKSAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXR1cyA9IGNhbGxXcml0ZXJUaHJlYWQoCisgICAgICAgICAgICBXcml0ZUNvbW1hbmQ6OldSSVRFLCAid3JpdGUiLCBzdGF0aWNfY2FzdDxjb25zdCB1aW50OF90Kj4oYnVmZmVyKSwgYnl0ZXMsCisgICAgICAgICAgICBbJl0gKGNvbnN0IFdyaXRlU3RhdHVzJiB3cml0ZVN0YXR1cykgeworICAgICAgICAgICAgICAgICp3cml0dGVuID0gd3JpdGVTdGF0dXMucmVwbHkud3JpdHRlbjsKKyAgICAgICAgICAgICAgICAvLyBEaWFnbm9zdGljcyBvZiB0aGUgY2F1c2Ugb2YgYi8zNTgxMzExMy4KKyAgICAgICAgICAgICAgICBBTE9HRV9JRigqd3JpdHRlbiA+IGJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgImhhbCByZXBvcnRzIG1vcmUgYnl0ZXMgd3JpdHRlbiB0aGFuIGFza2VkIGZvcjogJWxsZCA+ICVsbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykqd3JpdHRlbiwgKGxvbmcgbG9uZylieXRlcyk7CisgICAgICAgICAgICB9KTsKKyAgICBtU3RyZWFtUG93ZXJMb2cubG9nKGJ1ZmZlciwgKndyaXR0ZW4pOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmNhbGxXcml0ZXJUaHJlYWQoCisgICAgICAgIFdyaXRlQ29tbWFuZCBjbWQsIGNvbnN0IGNoYXIqIGNtZE5hbWUsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhU2l6ZSwgU3RyZWFtT3V0SGFsSGlkbDo6V3JpdGVyQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICBpZiAoIW1Db21tYW5kTVEtPndyaXRlKCZjbWQpKSB7CisgICAgICAgIEFMT0dFKCJjb21tYW5kIG1lc3NhZ2UgcXVldWUgd3JpdGUgZmFpbGVkIGZvciBcIiVzXCIiLCBjbWROYW1lKTsKKyAgICAgICAgcmV0dXJuIC1FQUdBSU47CisgICAgfQorICAgIGlmIChkYXRhICE9IG51bGxwdHIpIHsKKyAgICAgICAgc2l6ZV90IGF2YWlsYWJsZVRvV3JpdGUgPSBtRGF0YU1RLT5hdmFpbGFibGVUb1dyaXRlKCk7CisgICAgICAgIGlmIChkYXRhU2l6ZSA+IGF2YWlsYWJsZVRvV3JpdGUpIHsKKyAgICAgICAgICAgIEFMT0dXKCJ0cnVuY2F0aW5nIHdyaXRlIGRhdGEgZnJvbSAlbGxkIHRvICVsbGQgZHVlIHRvIGluc3VmZmljaWVudCBkYXRhIHF1ZXVlIHNwYWNlIiwKKyAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylkYXRhU2l6ZSwgKGxvbmcgbG9uZylhdmFpbGFibGVUb1dyaXRlKTsKKyAgICAgICAgICAgIGRhdGFTaXplID0gYXZhaWxhYmxlVG9Xcml0ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1EYXRhTVEtPndyaXRlKGRhdGEsIGRhdGFTaXplKSkgeworICAgICAgICAgICAgQUxPR0UoImRhdGEgbWVzc2FnZSBxdWV1ZSB3cml0ZSBmYWlsZWQgZm9yIFwiJXNcIiIsIGNtZE5hbWUpOworICAgICAgICB9CisgICAgfQorICAgIG1FZkdyb3VwLT53YWtlKHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0VNUFRZKSk7CisKKyAgICAvLyBUT0RPOiBSZW1vdmUgbWFudWFsIGV2ZW50IGZsYWcgaGFuZGxpbmcgb25jZSBibG9ja2luZyBNUSBpcyBpbXBsZW1lbnRlZC4gYi8zMzgxNTQyMgorICAgIHVpbnQzMl90IGVmU3RhdGUgPSAwOworcmV0cnk6CisgICAgc3RhdHVzX3QgcmV0ID0gbUVmR3JvdXAtPndhaXQoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRlVMTCksICZlZlN0YXRlKTsKKyAgICBpZiAoZWZTdGF0ZSAmIHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0ZVTEwpKSB7CisgICAgICAgIFdyaXRlU3RhdHVzIHdyaXRlU3RhdHVzOworICAgICAgICB3cml0ZVN0YXR1cy5yZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyAgICAgICAgaWYgKCFtU3RhdHVzTVEtPnJlYWQoJndyaXRlU3RhdHVzKSkgeworICAgICAgICAgICAgQUxPR0UoInN0YXR1cyBtZXNzYWdlIHJlYWQgZmFpbGVkIGZvciBcIiVzXCIiLCBjbWROYW1lKTsKKyAgICAgICAgfQorICAgICAgICBpZiAod3JpdGVTdGF0dXMucmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgIHJldCA9IE9LOworICAgICAgICAgICAgY2FsbGJhY2sod3JpdGVTdGF0dXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gcHJvY2Vzc1JldHVybihjbWROYW1lLCB3cml0ZVN0YXR1cy5yZXR2YWwpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGlmIChyZXQgPT0gLUVBR0FJTiB8fCByZXQgPT0gLUVJTlRSKSB7CisgICAgICAgIC8vIFNwdXJpb3VzIHdha2V1cC4gVGhpcyBub3JtYWxseSByZXRyaWVzIG5vIG1vcmUgdGhhbiBvbmNlLgorICAgICAgICBnb3RvIHJldHJ5OworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpwcmVwYXJlRm9yV3JpdGluZyhzaXplX3QgYnVmZmVyU2l6ZSkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kTVE+IHRlbXBDb21tYW5kTVE7CisgICAgc3RkOjp1bmlxdWVfcHRyPERhdGFNUT4gdGVtcERhdGFNUTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IHRlbXBTdGF0dXNNUTsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIHBpZF90IGhhbFRocmVhZFBpZCwgaGFsVGhyZWFkVGlkOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5wcmVwYXJlRm9yV3JpdGluZygKKyAgICAgICAgICAgIDEsIGJ1ZmZlclNpemUsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbW1hbmRNUTo6RGVzY3JpcHRvciYgY29tbWFuZE1RLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTVE6OkRlc2NyaXB0b3ImIGRhdGFNUSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RhdHVzTVE6OkRlc2NyaXB0b3ImIHN0YXR1c01RLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJlYWRJbmZvJiBoYWxUaHJlYWRJbmZvKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcENvbW1hbmRNUS5yZXNldChuZXcgQ29tbWFuZE1RKGNvbW1hbmRNUSkpOworICAgICAgICAgICAgICAgICAgICB0ZW1wRGF0YU1RLnJlc2V0KG5ldyBEYXRhTVEoZGF0YU1RKSk7CisgICAgICAgICAgICAgICAgICAgIHRlbXBTdGF0dXNNUS5yZXNldChuZXcgU3RhdHVzTVEoc3RhdHVzTVEpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBEYXRhTVEtPmlzVmFsaWQoKSAmJiB0ZW1wRGF0YU1RLT5nZXRFdmVudEZsYWdXb3JkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50RmxhZzo6Y3JlYXRlRXZlbnRGbGFnKHRlbXBEYXRhTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSwgJm1FZkdyb3VwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBoYWxUaHJlYWRQaWQgPSBoYWxUaHJlYWRJbmZvLnBpZDsKKyAgICAgICAgICAgICAgICAgICAgaGFsVGhyZWFkVGlkID0gaGFsVGhyZWFkSW5mby50aWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKCFyZXQuaXNPaygpIHx8IHJldHZhbCAhPSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwcmVwYXJlRm9yV3JpdGluZyIsIHJldCwgcmV0dmFsKTsKKyAgICB9CisgICAgaWYgKCF0ZW1wQ29tbWFuZE1RIHx8ICF0ZW1wQ29tbWFuZE1RLT5pc1ZhbGlkKCkgfHwKKyAgICAgICAgICAgICF0ZW1wRGF0YU1RIHx8ICF0ZW1wRGF0YU1RLT5pc1ZhbGlkKCkgfHwKKyAgICAgICAgICAgICF0ZW1wU3RhdHVzTVEgfHwgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpIHx8CisgICAgICAgICAgICAhbUVmR3JvdXApIHsKKyAgICAgICAgQUxPR0VfSUYoIXRlbXBDb21tYW5kTVEsICJGYWlsZWQgdG8gb2J0YWluIGNvbW1hbmQgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyIpOworICAgICAgICBBTE9HRV9JRih0ZW1wQ29tbWFuZE1RICYmICF0ZW1wQ29tbWFuZE1RLT5pc1ZhbGlkKCksCisgICAgICAgICAgICAgICAgIkNvbW1hbmQgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyBpcyBpbnZhbGlkIik7CisgICAgICAgIEFMT0dFX0lGKCF0ZW1wRGF0YU1RLCAiRmFpbGVkIHRvIG9idGFpbiBkYXRhIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmciKTsKKyAgICAgICAgQUxPR0VfSUYodGVtcERhdGFNUSAmJiAhdGVtcERhdGFNUS0+aXNWYWxpZCgpLCAiRGF0YSBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIGlzIGludmFsaWQiKTsKKyAgICAgICAgQUxPR0VfSUYoIXRlbXBTdGF0dXNNUSwgIkZhaWxlZCB0byBvYnRhaW4gc3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmciKTsKKyAgICAgICAgQUxPR0VfSUYodGVtcFN0YXR1c01RICYmICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSwKKyAgICAgICAgICAgICAgICAiU3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOworICAgICAgICBBTE9HRV9JRighbUVmR3JvdXAsICJFdmVudCBmbGFnIGNyZWF0aW9uIGZvciB3cml0aW5nIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmVxdWVzdEhhbFRocmVhZFByaW9yaXR5KGhhbFRocmVhZFBpZCwgaGFsVGhyZWFkVGlkKTsKKworICAgIG1Db21tYW5kTVEgPSBzdGQ6Om1vdmUodGVtcENvbW1hbmRNUSk7CisgICAgbURhdGFNUSA9IHN0ZDo6bW92ZSh0ZW1wRGF0YU1RKTsKKyAgICBtU3RhdHVzTVEgPSBzdGQ6Om1vdmUodGVtcFN0YXR1c01RKTsKKyAgICBtV3JpdGVyQ2xpZW50ID0gZ2V0dGlkKCk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqZHNwRnJhbWVzKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0UmVuZGVyUG9zaXRpb24oCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIHVpbnQzMl90IGQpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAqZHNwRnJhbWVzID0gZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UmVuZGVyUG9zaXRpb24iLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldE5leHRXcml0ZVRpbWVzdGFtcChpbnQ2NF90ICp0aW1lc3RhbXApIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXROZXh0V3JpdGVUaW1lc3RhbXAoCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGludDY0X3QgdCkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICp0aW1lc3RhbXAgPSB0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRSZW5kZXJQb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c2V0Q2FsbGJhY2sod3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gcHJvY2Vzc1JldHVybigKKyAgICAgICAgICAgICJzZXRDYWxsYmFjayIsIG1TdHJlYW0tPnNldENhbGxiYWNrKG5ldyBTdHJlYW1PdXRDYWxsYmFjayh0aGlzKSkpOworICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoYm9vbCAqc3VwcG9ydHNQYXVzZSwgYm9vbCAqc3VwcG9ydHNSZXN1bWUpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+c3VwcG9ydHNQYXVzZUFuZFJlc3VtZSgKKyAgICAgICAgICAgIFsmXShib29sIHAsIGJvb2wgcikgeworICAgICAgICAgICAgICAgICpzdXBwb3J0c1BhdXNlID0gcDsKKyAgICAgICAgICAgICAgICAqc3VwcG9ydHNSZXN1bWUgPSByOworICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN1cHBvcnRzUGF1c2VBbmRSZXN1bWUiLCByZXQpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpwYXVzZSgpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicGF1c2UiLCBtU3RyZWFtLT5wYXVzZSgpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6cmVzdW1lKCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwYXVzZSIsIG1TdHJlYW0tPnJlc3VtZSgpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c3VwcG9ydHNEcmFpbihib29sICpzdXBwb3J0c0RyYWluKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN1cHBvcnRzRHJhaW4iLCBtU3RyZWFtLT5zdXBwb3J0c0RyYWluKCksIHN1cHBvcnRzRHJhaW4pOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpkcmFpbihib29sIGVhcmx5Tm90aWZ5KSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oCisgICAgICAgICAgICAiZHJhaW4iLCBtU3RyZWFtLT5kcmFpbihlYXJseU5vdGlmeSA/IEF1ZGlvRHJhaW46OkVBUkxZX05PVElGWSA6IEF1ZGlvRHJhaW46OkFMTCkpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpmbHVzaCgpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicGF1c2UiLCBtU3RyZWFtLT5mbHVzaCgpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBpZiAobVdyaXRlckNsaWVudCA9PSBnZXR0aWQoKSAmJiBtQ29tbWFuZE1RKSB7CisgICAgICAgIHJldHVybiBjYWxsV3JpdGVyVGhyZWFkKAorICAgICAgICAgICAgICAgIFdyaXRlQ29tbWFuZDo6R0VUX1BSRVNFTlRBVElPTl9QT1NJVElPTiwgImdldFByZXNlbnRhdGlvblBvc2l0aW9uIiwgbnVsbHB0ciwgMCwKKyAgICAgICAgICAgICAgICBbJl0oY29uc3QgV3JpdGVTdGF0dXMmIHdyaXRlU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICAgICpmcmFtZXMgPSB3cml0ZVN0YXR1cy5yZXBseS5wcmVzZW50YXRpb25Qb3NpdGlvbi5mcmFtZXM7CisgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dHZfc2VjID0gd3JpdGVTdGF0dXMucmVwbHkucHJlc2VudGF0aW9uUG9zaXRpb24udGltZVN0YW1wLnR2U2VjOworICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPnR2X25zZWMgPSB3cml0ZVN0YXR1cy5yZXBseS5wcmVzZW50YXRpb25Qb3NpdGlvbi50aW1lU3RhbXAudHZOU2VjOworICAgICAgICAgICAgICAgIH0pOworICAgIH0gZWxzZSB7CisgICAgICAgIFJlc3VsdCByZXR2YWw7CisgICAgICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRQcmVzZW50YXRpb25Qb3NpdGlvbigKKyAgICAgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIHVpbnQ2NF90IGhpZGxGcmFtZXMsIGNvbnN0IFRpbWVTcGVjJiBoaWRsVGltZVN0YW1wKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgKmZyYW1lcyA9IGhpZGxGcmFtZXM7CisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPnR2X3NlYyA9IGhpZGxUaW1lU3RhbXAudHZTZWM7CisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPnR2X25zZWMgPSBoaWRsVGltZVN0YW1wLnR2TlNlYzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24iLCByZXQsIHJldHZhbCk7CisgICAgfQorfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjp1cGRhdGVTb3VyY2VNZXRhZGF0YShjb25zdCBTb3VyY2VNZXRhZGF0YSYgLyogc291cmNlTWV0YWRhdGEgKi8pIHsKKyAgICAvLyBBdWRpbyBIQUwgVjIuMCBkb2VzIG5vdCBzdXBwb3J0IHByb3BhZ2F0aW5nIHNvdXJjZSBtZXRhZGF0YQorICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKwordm9pZCBTdHJlYW1PdXRIYWxIaWRsOjpvbldyaXRlUmVhZHkoKSB7CisgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKKyAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuOworICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrIG9uV3JpdGVSZWFkeSIpOworICAgIGNhbGxiYWNrLT5vbldyaXRlUmVhZHkoKTsKK30KKwordm9pZCBTdHJlYW1PdXRIYWxIaWRsOjpvbkRyYWluUmVhZHkoKSB7CisgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKKyAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuOworICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrIG9uRHJhaW5SZWFkeSIpOworICAgIGNhbGxiYWNrLT5vbkRyYWluUmVhZHkoKTsKK30KKwordm9pZCBTdHJlYW1PdXRIYWxIaWRsOjpvbkVycm9yKCkgeworICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayA9IG1DYWxsYmFjay5wcm9tb3RlKCk7CisgICAgaWYgKGNhbGxiYWNrID09IDApIHJldHVybjsKKyAgICBBTE9HVigiYXN5bmNDYWxsYmFjayBvbkVycm9yIik7CisgICAgY2FsbGJhY2stPm9uRXJyb3IoKTsKK30KKworCitTdHJlYW1JbkhhbEhpZGw6OlN0cmVhbUluSGFsSGlkbChjb25zdCBzcDxJU3RyZWFtSW4+JiBzdHJlYW0pCisgICAgICAgIDogU3RyZWFtSGFsSGlkbChzdHJlYW0uZ2V0KCkpLCBtU3RyZWFtKHN0cmVhbSksIG1SZWFkZXJDbGllbnQoMCksIG1FZkdyb3VwKG51bGxwdHIpIHsKK30KKworU3RyZWFtSW5IYWxIaWRsOjp+U3RyZWFtSW5IYWxIaWRsKCkgeworICAgIGlmIChtU3RyZWFtICE9IDApIHsKKyAgICAgICAgcHJvY2Vzc1JldHVybigiY2xvc2UiLCBtU3RyZWFtLT5jbG9zZSgpKTsKKyAgICAgICAgbVN0cmVhbS5jbGVhcigpOworICAgICAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOworICAgIH0KKyAgICBpZiAobUVmR3JvdXApIHsKKyAgICAgICAgRXZlbnRGbGFnOjpkZWxldGVFdmVudEZsYWcoJm1FZkdyb3VwKTsKKyAgICB9Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRGcmFtZVNpemUiLCBtU3RyZWFtLT5nZXRGcmFtZVNpemUoKSwgc2l6ZSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6c2V0R2FpbihmbG9hdCBnYWluKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldEdhaW4iLCBtU3RyZWFtLT5zZXRHYWluKGdhaW4pKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpyZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKnJlYWQpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICAqcmVhZCA9IDA7CisKKyAgICBpZiAoYnl0ZXMgPT0gMCAmJiAhbURhdGFNUSkgeworICAgICAgICAvLyBDYW4ndCBkZXRlcm1pbmUgdGhlIHNpemUgZm9yIHRoZSBNUSBidWZmZXIuIFdhaXQgZm9yIGEgbm9uLWVtcHR5IHJlYWQgcmVxdWVzdC4KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBpZiAoIW1EYXRhTVEgJiYgKHN0YXR1cyA9IHByZXBhcmVGb3JSZWFkaW5nKGJ5dGVzKSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBSZWFkUGFyYW1ldGVycyBwYXJhbXM7CisgICAgcGFyYW1zLmNvbW1hbmQgPSBSZWFkQ29tbWFuZDo6UkVBRDsKKyAgICBwYXJhbXMucGFyYW1zLnJlYWQgPSBieXRlczsKKyAgICBzdGF0dXMgPSBjYWxsUmVhZGVyVGhyZWFkKHBhcmFtcywgInJlYWQiLAorICAgICAgICAgICAgWyZdKGNvbnN0IFJlYWRTdGF0dXMmIHJlYWRTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgYXZhaWxUb1JlYWQgPSBtRGF0YU1RLT5hdmFpbGFibGVUb1JlYWQoKTsKKyAgICAgICAgICAgICAgICBpZiAoIW1EYXRhTVEtPnJlYWQoc3RhdGljX2Nhc3Q8dWludDhfdCo+KGJ1ZmZlciksIHN0ZDo6bWluKGJ5dGVzLCBhdmFpbFRvUmVhZCkpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJkYXRhIG1lc3NhZ2UgcXVldWUgcmVhZCBmYWlsZWQgZm9yIFwicmVhZFwiIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dXX0lGKGF2YWlsVG9SZWFkICE9IHJlYWRTdGF0dXMucmVwbHkucmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJIQUwgcmVhZCByZXBvcnQgaW5jb25zaXN0ZW50OiBtcSA9ICVkLCBzdGF0dXMgPSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdClhdmFpbFRvUmVhZCwgKGludDMyX3QpcmVhZFN0YXR1cy5yZXBseS5yZWFkKTsKKyAgICAgICAgICAgICAgICAqcmVhZCA9IHJlYWRTdGF0dXMucmVwbHkucmVhZDsKKyAgICAgICAgICAgIH0pOworICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coYnVmZmVyLCAqcmVhZCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpjYWxsUmVhZGVyVGhyZWFkKAorICAgICAgICBjb25zdCBSZWFkUGFyYW1ldGVycyYgcGFyYW1zLCBjb25zdCBjaGFyKiBjbWROYW1lLAorICAgICAgICBTdHJlYW1JbkhhbEhpZGw6OlJlYWRlckNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgaWYgKCFtQ29tbWFuZE1RLT53cml0ZSgmcGFyYW1zKSkgeworICAgICAgICBBTE9HVygiY29tbWFuZCBtZXNzYWdlIHF1ZXVlIHdyaXRlIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gLUVBR0FJTjsKKyAgICB9CisgICAgbUVmR3JvdXAtPndha2Uoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRlVMTCkpOworCisgICAgLy8gVE9ETzogUmVtb3ZlIG1hbnVhbCBldmVudCBmbGFnIGhhbmRsaW5nIG9uY2UgYmxvY2tpbmcgTVEgaXMgaW1wbGVtZW50ZWQuIGIvMzM4MTU0MjIKKyAgICB1aW50MzJfdCBlZlN0YXRlID0gMDsKK3JldHJ5OgorICAgIHN0YXR1c190IHJldCA9IG1FZkdyb3VwLT53YWl0KHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0VNUFRZKSwgJmVmU3RhdGUpOworICAgIGlmIChlZlN0YXRlICYgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRU1QVFkpKSB7CisgICAgICAgIFJlYWRTdGF0dXMgcmVhZFN0YXR1czsKKyAgICAgICAgcmVhZFN0YXR1cy5yZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyAgICAgICAgaWYgKCFtU3RhdHVzTVEtPnJlYWQoJnJlYWRTdGF0dXMpKSB7CisgICAgICAgICAgICBBTE9HRSgic3RhdHVzIG1lc3NhZ2UgcmVhZCBmYWlsZWQgZm9yIFwiJXNcIiIsIGNtZE5hbWUpOworICAgICAgICB9CisgICAgICAgICBpZiAocmVhZFN0YXR1cy5yZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgcmV0ID0gT0s7CisgICAgICAgICAgICBjYWxsYmFjayhyZWFkU3RhdHVzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IHByb2Nlc3NSZXR1cm4oY21kTmFtZSwgcmVhZFN0YXR1cy5yZXR2YWwpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGlmIChyZXQgPT0gLUVBR0FJTiB8fCByZXQgPT0gLUVJTlRSKSB7CisgICAgICAgIC8vIFNwdXJpb3VzIHdha2V1cC4gVGhpcyBub3JtYWxseSByZXRyaWVzIG5vIG1vcmUgdGhhbiBvbmNlLgorICAgICAgICBnb3RvIHJldHJ5OworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnByZXBhcmVGb3JSZWFkaW5nKHNpemVfdCBidWZmZXJTaXplKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRNUT4gdGVtcENvbW1hbmRNUTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RGF0YU1RPiB0ZW1wRGF0YU1ROworICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gdGVtcFN0YXR1c01ROworICAgIFJlc3VsdCByZXR2YWw7CisgICAgcGlkX3QgaGFsVGhyZWFkUGlkLCBoYWxUaHJlYWRUaWQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPnByZXBhcmVGb3JSZWFkaW5nKAorICAgICAgICAgICAgMSwgYnVmZmVyU2l6ZSwKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29tbWFuZE1ROjpEZXNjcmlwdG9yJiBjb21tYW5kTVEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFNUTo6RGVzY3JpcHRvciYgZGF0YU1RLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBTdGF0dXNNUTo6RGVzY3JpcHRvciYgc3RhdHVzTVEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmVhZEluZm8mIGhhbFRocmVhZEluZm8pIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICB0ZW1wQ29tbWFuZE1RLnJlc2V0KG5ldyBDb21tYW5kTVEoY29tbWFuZE1RKSk7CisgICAgICAgICAgICAgICAgICAgIHRlbXBEYXRhTVEucmVzZXQobmV3IERhdGFNUShkYXRhTVEpKTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcFN0YXR1c01RLnJlc2V0KG5ldyBTdGF0dXNNUShzdGF0dXNNUSkpOworICAgICAgICAgICAgICAgICAgICBpZiAodGVtcERhdGFNUS0+aXNWYWxpZCgpICYmIHRlbXBEYXRhTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRGbGFnOjpjcmVhdGVFdmVudEZsYWcodGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpLCAmbUVmR3JvdXApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFBpZCA9IGhhbFRocmVhZEluZm8ucGlkOworICAgICAgICAgICAgICAgICAgICBoYWxUaHJlYWRUaWQgPSBoYWxUaHJlYWRJbmZvLnRpZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXJldC5pc09rKCkgfHwgcmV0dmFsICE9IFJlc3VsdDo6T0spIHsKKyAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInByZXBhcmVGb3JSZWFkaW5nIiwgcmV0LCByZXR2YWwpOworICAgIH0KKyAgICBpZiAoIXRlbXBDb21tYW5kTVEgfHwgIXRlbXBDb21tYW5kTVEtPmlzVmFsaWQoKSB8fAorICAgICAgICAgICAgIXRlbXBEYXRhTVEgfHwgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSB8fAorICAgICAgICAgICAgIXRlbXBTdGF0dXNNUSB8fCAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCkgfHwKKyAgICAgICAgICAgICFtRWZHcm91cCkgeworICAgICAgICBBTE9HRV9JRighdGVtcENvbW1hbmRNUSwgIkZhaWxlZCB0byBvYnRhaW4gY29tbWFuZCBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIik7CisgICAgICAgIEFMT0dFX0lGKHRlbXBDb21tYW5kTVEgJiYgIXRlbXBDb21tYW5kTVEtPmlzVmFsaWQoKSwKKyAgICAgICAgICAgICAgICAiQ29tbWFuZCBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIGlzIGludmFsaWQiKTsKKyAgICAgICAgQUxPR0VfSUYoIXRlbXBEYXRhTVEsICJGYWlsZWQgdG8gb2J0YWluIGRhdGEgbWVzc2FnZSBxdWV1ZSBmb3IgcmVhZGluZyIpOworICAgICAgICBBTE9HRV9JRih0ZW1wRGF0YU1RICYmICF0ZW1wRGF0YU1RLT5pc1ZhbGlkKCksICJEYXRhIG1lc3NhZ2UgcXVldWUgZm9yIHJlYWRpbmcgaXMgaW52YWxpZCIpOworICAgICAgICBBTE9HRV9JRighdGVtcFN0YXR1c01RLCAiRmFpbGVkIHRvIG9idGFpbiBzdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgcmVhZGluZyIpOworICAgICAgICBBTE9HRV9JRih0ZW1wU3RhdHVzTVEgJiYgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpLAorICAgICAgICAgICAgICAgICJTdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgcmVhZGluZyBpcyBpbnZhbGlkIik7CisgICAgICAgIEFMT0dFX0lGKCFtRWZHcm91cCwgIkV2ZW50IGZsYWcgY3JlYXRpb24gZm9yIHJlYWRpbmcgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkoaGFsVGhyZWFkUGlkLCBoYWxUaHJlYWRUaWQpOworCisgICAgbUNvbW1hbmRNUSA9IHN0ZDo6bW92ZSh0ZW1wQ29tbWFuZE1RKTsKKyAgICBtRGF0YU1RID0gc3RkOjptb3ZlKHRlbXBEYXRhTVEpOworICAgIG1TdGF0dXNNUSA9IHN0ZDo6bW92ZSh0ZW1wU3RhdHVzTVEpOworICAgIG1SZWFkZXJDbGllbnQgPSBnZXR0aWQoKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Z2V0SW5wdXRGcmFtZXNMb3N0KHVpbnQzMl90ICpmcmFtZXNMb3N0KSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldElucHV0RnJhbWVzTG9zdCIsIG1TdHJlYW0tPmdldElucHV0RnJhbWVzTG9zdCgpLCBmcmFtZXNMb3N0KTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgaWYgKG1SZWFkZXJDbGllbnQgPT0gZ2V0dGlkKCkgJiYgbUNvbW1hbmRNUSkgeworICAgICAgICBSZWFkUGFyYW1ldGVycyBwYXJhbXM7CisgICAgICAgIHBhcmFtcy5jb21tYW5kID0gUmVhZENvbW1hbmQ6OkdFVF9DQVBUVVJFX1BPU0lUSU9OOworICAgICAgICByZXR1cm4gY2FsbFJlYWRlclRocmVhZChwYXJhbXMsICJnZXRDYXB0dXJlUG9zaXRpb24iLAorICAgICAgICAgICAgICAgIFsmXShjb25zdCBSZWFkU3RhdHVzJiByZWFkU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICAgICpmcmFtZXMgPSByZWFkU3RhdHVzLnJlcGx5LmNhcHR1cmVQb3NpdGlvbi5mcmFtZXM7CisgICAgICAgICAgICAgICAgICAgICp0aW1lID0gcmVhZFN0YXR1cy5yZXBseS5jYXB0dXJlUG9zaXRpb24udGltZTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9IGVsc2UgeworICAgICAgICBSZXN1bHQgcmV0dmFsOworICAgICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0Q2FwdHVyZVBvc2l0aW9uKAorICAgICAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDY0X3QgaGlkbEZyYW1lcywgdWludDY0X3QgaGlkbFRpbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqZnJhbWVzID0gaGlkbEZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgICAgICp0aW1lID0gaGlkbFRpbWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldENhcHR1cmVQb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKKyAgICB9Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Z2V0QWN0aXZlTWljcm9waG9uZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzIF9fdW51c2VkKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnVwZGF0ZVNpbmtNZXRhZGF0YShjb25zdCBTaW5rTWV0YWRhdGEmIC8qIHNpbmtNZXRhZGF0YSAqLykgeworICAgIC8vIEF1ZGlvIEhBTCBWMi4wIGRvZXMgbm90IHN1cHBvcnQgcHJvcGFnYXRpbmcgc2luayBtZXRhZGF0YQorICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1IYWxIaWRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJhZDhhZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1IYWxIaWRsLmgKQEAgLTAsMCArMSwyNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9ISURMX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0hJRExfSAorCisjaW5jbHVkZSA8YXRvbWljPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvSVN0cmVhbS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lTdHJlYW1Jbi5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lTdHJlYW1PdXQuaD4KKyNpbmNsdWRlIDxmbXEvRXZlbnRGbGFnLmg+CisjaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKKyNpbmNsdWRlICJTdHJlYW1Qb3dlckxvZy5oIgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVN0cmVhbTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJU3RyZWFtSW47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVN0cmVhbU91dDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OkV2ZW50RmxhZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIFJlYWRQYXJhbWV0ZXJzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklTdHJlYW1Jbjo6UmVhZFBhcmFtZXRlcnM7Cit1c2luZyBSZWFkU3RhdHVzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklTdHJlYW1Jbjo6UmVhZFN0YXR1czsKK3VzaW5nIFdyaXRlQ29tbWFuZCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJU3RyZWFtT3V0OjpXcml0ZUNvbW1hbmQ7Cit1c2luZyBXcml0ZVN0YXR1cyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJU3RyZWFtT3V0OjpXcml0ZVN0YXR1czsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBEZXZpY2VIYWxIaWRsOworCitjbGFzcyBTdHJlYW1IYWxIaWRsIDogcHVibGljIHZpcnR1YWwgU3RyZWFtSGFsSW50ZXJmYWNlLCBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckhpZGwKK3sKKyAgcHVibGljOgorICAgIC8vIFJldHVybiB0aGUgc2FtcGxpbmcgcmF0ZSBpbiBIeiAtIGVnLiA0NDEwMC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpOworCisgICAgLy8gUmV0dXJuIHNpemUgb2YgaW5wdXQvb3V0cHV0IGJ1ZmZlciBpbiBieXRlcyBmb3IgdGhpcyBzdHJlYW0gLSBlZy4gNDgwMC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKTsKKworICAgIC8vIFJldHVybiB0aGUgY2hhbm5lbCBtYXNrLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spOworCisgICAgLy8gUmV0dXJuIHRoZSBhdWRpbyBmb3JtYXQgLSBlLmcuIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOworCisgICAgLy8gQ29udmVuaWVuY2UgbWV0aG9kLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qcm9wZXJ0aWVzKAorICAgICAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrLCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0KTsKKworICAgIC8vIFNldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7CisKKyAgICAvLyBHZXQgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7CisKKyAgICAvLyBBZGQgb3IgcmVtb3ZlIHRoZSBlZmZlY3Qgb24gdGhlIHN0cmVhbS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZEVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOworCisgICAgLy8gUHV0IHRoZSBhdWRpbyBoYXJkd2FyZSBpbnB1dC9vdXRwdXQgaW50byBzdGFuZGJ5IG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFuZGJ5KCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKKworICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOworCisgICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworCisgICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbyk7CisKKyAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbik7CisKKyAgICAvLyBTZXQgdGhlIHByaW9yaXR5IG9mIHRoZSB0aHJlYWQgdGhhdCBpbnRlcmFjdHMgd2l0aCB0aGUgSEFMCisgICAgLy8gKG11c3QgbWF0Y2ggdGhlIHByaW9yaXR5IG9mIHRoZSBhdWRpb2ZsaW5nZXIncyB0aHJlYWQgdGhhdCBjYWxscyAncmVhZCcgLyAnd3JpdGUnKQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50IHByaW9yaXR5KTsKKworICBwcm90ZWN0ZWQ6CisgICAgLy8gU3ViY2xhc3NlcyBjYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgZXhwbGljaXQgU3RyZWFtSGFsSGlkbChJU3RyZWFtICpzdHJlYW0pOworCisgICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIHN0cmVhbS4KKyAgICB2aXJ0dWFsIH5TdHJlYW1IYWxIaWRsKCk7CisKKyAgICBzdGF0dXNfdCBnZXRDYWNoZWRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSk7CisKKyAgICBib29sIHJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShwaWRfdCB0aHJlYWRQaWQsIHBpZF90IHRocmVhZElkKTsKKworICAgIC8vIG1TdHJlYW1Qb3dlckxvZyBpcyB1c2VkIGZvciBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KKyAgICBTdHJlYW1Qb3dlckxvZyBtU3RyZWFtUG93ZXJMb2c7CisKKyAgcHJpdmF0ZToKKyAgICBjb25zdCBpbnQgSEFMX1RIUkVBRF9QUklPUklUWV9ERUZBVUxUID0gLTE7CisgICAgSVN0cmVhbSAqbVN0cmVhbTsKKyAgICBpbnQgbUhhbFRocmVhZFByaW9yaXR5OworICAgIHNpemVfdCBtQ2FjaGVkQnVmZmVyU2l6ZTsKK307CisKK2NsYXNzIFN0cmVhbU91dEhhbEhpZGwgOiBwdWJsaWMgU3RyZWFtT3V0SGFsSW50ZXJmYWNlLCBwdWJsaWMgU3RyZWFtSGFsSGlkbCB7CisgIHB1YmxpYzoKKyAgICAvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgKG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlKSBvZiBhIHN0cmVhbS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpOworCisgICAgLy8gUmV0dXJuIHRoZSBhdWRpbyBoYXJkd2FyZSBkcml2ZXIgZXN0aW1hdGVkIGxhdGVuY3kgaW4gbWlsbGlzZWNvbmRzLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSk7CisKKyAgICAvLyBVc2UgdGhpcyBtZXRob2QgaW4gc2l0dWF0aW9ucyB3aGVyZSBhdWRpbyBtaXhpbmcgaXMgZG9uZSBpbiB0aGUgaGFyZHdhcmUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOworCisgICAgLy8gV3JpdGUgYXVkaW8gYnVmZmVyIHRvIGRyaXZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pOworCisgICAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHdyaXR0ZW4gYnkgdGhlIGF1ZGlvIGRzcCB0byBEQUMgc2luY2UKKyAgICAvLyB0aGUgb3V0cHV0IGhhcyBleGl0ZWQgc3RhbmRieS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpOworCisgICAgLy8gR2V0IHRoZSBsb2NhbCB0aW1lIGF0IHdoaWNoIHRoZSBuZXh0IHdyaXRlIHRvIHRoZSBhdWRpbyBkcml2ZXIgd2lsbCBiZSBwcmVzZW50ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKTsKKworICAgIC8vIFNldCB0aGUgY2FsbGJhY2sgZm9yIG5vdGlmeWluZyBjb21wbGV0aW9uIG9mIG5vbi1ibG9ja2luZyB3cml0ZSBhbmQgZHJhaW4uCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spOworCisgICAgLy8gUmV0dXJucyB3aGV0aGVyIHBhdXNlIGFuZCByZXN1bWUgb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNQYXVzZUFuZFJlc3VtZShib29sICpzdXBwb3J0c1BhdXNlLCBib29sICpzdXBwb3J0c1Jlc3VtZSk7CisKKyAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7CisKKyAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3VtZSgpOworCisgICAgLy8gUmV0dXJucyB3aGV0aGVyIGRyYWluIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0RyYWluKGJvb2wgKnN1cHBvcnRzRHJhaW4pOworCisgICAgLy8gUmVxdWVzdHMgbm90aWZpY2F0aW9uIHdoZW4gZGF0YSBidWZmZXJlZCBieSB0aGUgZHJpdmVyL2hhcmR3YXJlIGhhcyBiZWVuIHBsYXllZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGRyYWluKGJvb2wgZWFybHlOb3RpZnkpOworCisgICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byBmbHVzaCB0aGUgcXVldWVkIGRhdGEuCisgICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaCgpOworCisgICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHByZXNlbnRlZCB0byBhbiBleHRlcm5hbCBvYnNlcnZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKTsKKworICAgIC8vIENhbGxlZCB3aGVuIHRoZSBtZXRhZGF0YSBvZiB0aGUgc3RyZWFtJ3Mgc291cmNlIGhhcyBiZWVuIGNoYW5nZWQuCisgICAgc3RhdHVzX3QgdXBkYXRlU291cmNlTWV0YWRhdGEoY29uc3QgU291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKSBvdmVycmlkZTsKKworICAgIC8vIE1ldGhvZHMgdXNlZCBieSBTdHJlYW1PdXRDYWxsYmFjayAoSElETCkuCisgICAgdm9pZCBvbldyaXRlUmVhZHkoKTsKKyAgICB2b2lkIG9uRHJhaW5SZWFkeSgpOworICAgIHZvaWQgb25FcnJvcigpOworCisgIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIERldmljZUhhbEhpZGw7CisgICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8V3JpdGVDb21tYW5kLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gQ29tbWFuZE1ROworICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBEYXRhTVE7CisgICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8V3JpdGVTdGF0dXMsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBTdGF0dXNNUTsKKworICAgIHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBtQ2FsbGJhY2s7CisgICAgc3A8SVN0cmVhbU91dD4gbVN0cmVhbTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiBtQ29tbWFuZE1ROworICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IG1EYXRhTVE7CisgICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiBtU3RhdHVzTVE7CisgICAgc3RkOjphdG9taWM8cGlkX3Q+IG1Xcml0ZXJDbGllbnQ7CisgICAgRXZlbnRGbGFnKiBtRWZHcm91cDsKKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBTdHJlYW1PdXRIYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1PdXQ+JiBzdHJlYW0pOworCisgICAgdmlydHVhbCB+U3RyZWFtT3V0SGFsSGlkbCgpOworCisgICAgdXNpbmcgV3JpdGVyQ2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgV3JpdGVTdGF0dXMmIHdyaXRlU3RhdHVzKT47CisgICAgc3RhdHVzX3QgY2FsbFdyaXRlclRocmVhZCgKKyAgICAgICAgICAgIFdyaXRlQ29tbWFuZCBjbWQsIGNvbnN0IGNoYXIqIGNtZE5hbWUsCisgICAgICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YVNpemUsIFdyaXRlckNhbGxiYWNrIGNhbGxiYWNrKTsKKyAgICBzdGF0dXNfdCBwcmVwYXJlRm9yV3JpdGluZyhzaXplX3QgYnVmZmVyU2l6ZSk7Cit9OworCitjbGFzcyBTdHJlYW1JbkhhbEhpZGwgOiBwdWJsaWMgU3RyZWFtSW5IYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxIaWRsIHsKKyAgcHVibGljOgorICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7CisKKyAgICAvLyBTZXQgdGhlIGlucHV0IGdhaW4gZm9yIHRoZSBhdWRpbyBkcml2ZXIuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRHYWluKGZsb2F0IGdhaW4pOworCisgICAgLy8gUmVhZCBhdWRpbyBidWZmZXIgaW4gZnJvbSBkcml2ZXIuCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKnJlYWQpOworCisgICAgLy8gUmV0dXJuIHRoZSBhbW91bnQgb2YgaW5wdXQgZnJhbWVzIGxvc3QgaW4gdGhlIGF1ZGlvIGRyaXZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0RnJhbWVzTG9zdCh1aW50MzJfdCAqZnJhbWVzTG9zdCk7CisKKyAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcmVjZWl2ZWQgYW5kCisgICAgLy8gdGhlIGNsb2NrIHRpbWUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZnJhbWUgY291bnQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKTsKKworICAgIC8vIEdldCBhY3RpdmUgbWljcm9waG9uZXMKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKTsKKworICAgIC8vIENhbGxlZCB3aGVuIHRoZSBtZXRhZGF0YSBvZiB0aGUgc3RyZWFtJ3Mgc2luayBoYXMgYmVlbiBjaGFuZ2VkLgorICAgIHN0YXR1c190IHVwZGF0ZVNpbmtNZXRhZGF0YShjb25zdCBTaW5rTWV0YWRhdGEmIHNpbmtNZXRhZGF0YSkgb3ZlcnJpZGU7CisKKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsSGlkbDsKKyAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxSZWFkUGFyYW1ldGVycywgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IENvbW1hbmRNUTsKKyAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTx1aW50OF90LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gRGF0YU1ROworICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPFJlYWRTdGF0dXMsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBTdGF0dXNNUTsKKworICAgIHNwPElTdHJlYW1Jbj4gbVN0cmVhbTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiBtQ29tbWFuZE1ROworICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IG1EYXRhTVE7CisgICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiBtU3RhdHVzTVE7CisgICAgc3RkOjphdG9taWM8cGlkX3Q+IG1SZWFkZXJDbGllbnQ7CisgICAgRXZlbnRGbGFnKiBtRWZHcm91cDsKKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBTdHJlYW1JbkhhbEhpZGwoY29uc3Qgc3A8SVN0cmVhbUluPiYgc3RyZWFtKTsKKworICAgIHZpcnR1YWwgflN0cmVhbUluSGFsSGlkbCgpOworCisgICAgdXNpbmcgUmVhZGVyQ2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUmVhZFN0YXR1cyYgcmVhZFN0YXR1cyk+OworICAgIHN0YXR1c190IGNhbGxSZWFkZXJUaHJlYWQoCisgICAgICAgICAgICBjb25zdCBSZWFkUGFyYW1ldGVycyYgcGFyYW1zLCBjb25zdCBjaGFyKiBjbWROYW1lLCBSZWFkZXJDYWxsYmFjayBjYWxsYmFjayk7CisgICAgc3RhdHVzX3QgcHJlcGFyZUZvclJlYWRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbUhhbExvY2FsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1IYWxMb2NhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgxMDdlNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1IYWxMb2NhbC5jcHAKQEAgLTAsMCArMSwzNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlN0cmVhbUhhbExvY2FsIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW8uaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkRldmljZUhhbExvY2FsLmgiCisjaW5jbHVkZSAiU3RyZWFtSGFsTG9jYWwuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitTdHJlYW1IYWxMb2NhbDo6U3RyZWFtSGFsTG9jYWwoYXVkaW9fc3RyZWFtX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSkKKyAgICAgICAgOiBtRGV2aWNlKGRldmljZSksCisgICAgICAgICAgbVN0cmVhbShzdHJlYW0pIHsKKyAgICAvLyBJbnN0cnVtZW50IGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgorICAgIC8vIE5vdGU6IFRoaXMgYXNzdW1lcyBjaGFubmVsIG1hc2ssIGZvcm1hdCwgYW5kIHNhbXBsZSByYXRlIGRvIG5vdCBjaGFuZ2UgYWZ0ZXIgY3JlYXRpb24uCisgICAgaWYgKG1TdHJlYW0gIT0gbnVsbHB0ciAmJiBtU3RyZWFtUG93ZXJMb2cuaXNVc2VyRGVidWdPckVuZ0J1aWxkKCkpIHsKKyAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmluaXQobVN0cmVhbS0+Z2V0X3NhbXBsZV9yYXRlKG1TdHJlYW0pLAorICAgICAgICAgICAgICAgIG1TdHJlYW0tPmdldF9jaGFubmVscyhtU3RyZWFtKSwKKyAgICAgICAgICAgICAgICBtU3RyZWFtLT5nZXRfZm9ybWF0KG1TdHJlYW0pKTsKKyAgICB9Cit9CisKK1N0cmVhbUhhbExvY2FsOjp+U3RyZWFtSGFsTG9jYWwoKSB7CisgICAgbVN0cmVhbSA9IDA7CisgICAgbURldmljZS5jbGVhcigpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSkgeworICAgICpyYXRlID0gbVN0cmVhbS0+Z2V0X3NhbXBsZV9yYXRlKG1TdHJlYW0pOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKSB7CisgICAgKnNpemUgPSBtU3RyZWFtLT5nZXRfYnVmZmVyX3NpemUobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spIHsKKyAgICAqbWFzayA9IG1TdHJlYW0tPmdldF9jaGFubmVscyhtU3RyZWFtKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgeworICAgICpmb3JtYXQgPSBtU3RyZWFtLT5nZXRfZm9ybWF0KG1TdHJlYW0pOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldEF1ZGlvUHJvcGVydGllcygKKyAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrLCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0KSB7CisgICAgKnNhbXBsZVJhdGUgPSBtU3RyZWFtLT5nZXRfc2FtcGxlX3JhdGUobVN0cmVhbSk7CisgICAgKm1hc2sgPSBtU3RyZWFtLT5nZXRfY2hhbm5lbHMobVN0cmVhbSk7CisgICAgKmZvcm1hdCA9IG1TdHJlYW0tPmdldF9mb3JtYXQobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7CisgICAgcmV0dXJuIG1TdHJlYW0tPnNldF9wYXJhbWV0ZXJzKG1TdHJlYW0sIGt2UGFpcnMuc3RyaW5nKCkpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKKyAgICBjaGFyICpoYWxWYWx1ZXMgPSBtU3RyZWFtLT5nZXRfcGFyYW1ldGVycyhtU3RyZWFtLCBrZXlzLnN0cmluZygpKTsKKyAgICBpZiAoaGFsVmFsdWVzICE9IE5VTEwpIHsKKyAgICAgICAgdmFsdWVzLT5zZXRUbyhoYWxWYWx1ZXMpOworICAgICAgICBmcmVlKGhhbFZhbHVlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdmFsdWVzLT5jbGVhcigpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjphZGRFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPikgeworICAgIExPR19BTFdBWVNfRkFUQUwoIkxvY2FsIHN0cmVhbXMgY2FuIG5vdCBoYXZlIGVmZmVjdHMiKTsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpyZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPikgeworICAgIExPR19BTFdBWVNfRkFUQUwoIkxvY2FsIHN0cmVhbXMgY2FuIG5vdCBoYXZlIGVmZmVjdHMiKTsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpzdGFuZGJ5KCkgeworICAgIHJldHVybiBtU3RyZWFtLT5zdGFuZGJ5KG1TdHJlYW0pOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6ZHVtcChpbnQgZmQpIHsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU3RyZWFtLT5kdW1wKG1TdHJlYW0sIGZkKTsKKyAgICBtU3RyZWFtUG93ZXJMb2cuZHVtcChmZCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OnNldEhhbFRocmVhZFByaW9yaXR5KGludCkgeworICAgIC8vIERvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgYXMgbG9jYWwgaGFsIGlzIGV4ZWN1dGVkIGJ5IGF1ZGlvZmxpbmdlciBkaXJlY3RseQorICAgIC8vIG9uIHRoZSBzYW1lIHRocmVhZC4KKyAgICByZXR1cm4gT0s7Cit9CisKK1N0cmVhbU91dEhhbExvY2FsOjpTdHJlYW1PdXRIYWxMb2NhbChhdWRpb19zdHJlYW1fb3V0X3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSkKKyAgICAgICAgOiBTdHJlYW1IYWxMb2NhbCgmc3RyZWFtLT5jb21tb24sIGRldmljZSksIG1TdHJlYW0oc3RyZWFtKSB7Cit9CisKK1N0cmVhbU91dEhhbExvY2FsOjp+U3RyZWFtT3V0SGFsTG9jYWwoKSB7CisgICAgbUNhbGxiYWNrLmNsZWFyKCk7CisgICAgbURldmljZS0+Y2xvc2VPdXRwdXRTdHJlYW0obVN0cmVhbSk7CisgICAgbVN0cmVhbSA9IDA7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7CisgICAgKnNpemUgPSBhdWRpb19zdHJlYW1fb3V0X2ZyYW1lX3NpemUobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSkgeworICAgICpsYXRlbmN5ID0gbVN0cmVhbS0+Z2V0X2xhdGVuY3kobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KSB7CisgICAgaWYgKG1TdHJlYW0tPnNldF92b2x1bWUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5zZXRfdm9sdW1lKG1TdHJlYW0sIGxlZnQsIHJpZ2h0KTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OndyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pIHsKKyAgICBzc2l6ZV90IHdyaXRlUmVzdWx0ID0gbVN0cmVhbS0+d3JpdGUobVN0cmVhbSwgYnVmZmVyLCBieXRlcyk7CisgICAgaWYgKHdyaXRlUmVzdWx0ID4gMCkgeworICAgICAgICAqd3JpdHRlbiA9IHdyaXRlUmVzdWx0OworICAgICAgICBtU3RyZWFtUG93ZXJMb2cubG9nKGJ1ZmZlciwgKndyaXR0ZW4pOworICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKndyaXR0ZW4gPSAwOworICAgICAgICByZXR1cm4gd3JpdGVSZXN1bHQ7CisgICAgfQorfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcykgeworICAgIHJldHVybiBtU3RyZWFtLT5nZXRfcmVuZGVyX3Bvc2l0aW9uKG1TdHJlYW0sIGRzcEZyYW1lcyk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKSB7CisgICAgaWYgKG1TdHJlYW0tPmdldF9uZXh0X3dyaXRlX3RpbWVzdGFtcCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPmdldF9uZXh0X3dyaXRlX3RpbWVzdGFtcChtU3RyZWFtLCB0aW1lc3RhbXApOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c2V0Q2FsbGJhY2sod3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrKSB7CisgICAgaWYgKG1TdHJlYW0tPnNldF9jYWxsYmFjayA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gbVN0cmVhbS0+c2V0X2NhbGxiYWNrKG1TdHJlYW0sIFN0cmVhbU91dEhhbExvY2FsOjphc3luY0NhbGxiYWNrLCB0aGlzKTsKKyAgICBpZiAocmVzdWx0ID09IE9LKSB7CisgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvLyBzdGF0aWMKK2ludCBTdHJlYW1PdXRIYWxMb2NhbDo6YXN5bmNDYWxsYmFjayhzdHJlYW1fY2FsbGJhY2tfZXZlbnRfdCBldmVudCwgdm9pZCosIHZvaWQgKmNvb2tpZSkgeworICAgIC8vIFdlIGFjdCBhcyBpZiB3ZSBnYXZlIGEgd3A8U3RyZWFtT3V0SGFsTG9jYWw+IHRvIEhBTC4gVGhpcyB3YXkgd2Ugc2hvdWxkIGhhbmRsZQorICAgIC8vIGNvcnJlY3RseSB0aGUgY2FzZSB3aGVuIHRoZSBjYWxsYmFjayBpcyBpbnZva2VkIHdoaWxlIFN0cmVhbU91dEhhbExvY2FsJ3MgZGVzdHJ1Y3RvciBpcworICAgIC8vIGFscmVhZHkgcnVubmluZywgYmVjYXVzZSB0aGUgZGVzdHJ1Y3RvciBpcyBpbnZva2VkIGFmdGVyIHRoZSByZWZjb3VudCBoYXMgYmVlbiBhdG9taWNhbGx5CisgICAgLy8gZGVjcmVtZW50ZWQuCisgICAgd3A8U3RyZWFtT3V0SGFsTG9jYWw+IHdlYWtTZWxmKHN0YXRpY19jYXN0PFN0cmVhbU91dEhhbExvY2FsKj4oY29va2llKSk7CisgICAgc3A8U3RyZWFtT3V0SGFsTG9jYWw+IHNlbGYgPSB3ZWFrU2VsZi5wcm9tb3RlKCk7CisgICAgaWYgKHNlbGYgPT0gMCkgcmV0dXJuIDA7CisgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gc2VsZi0+bUNhbGxiYWNrLnByb21vdGUoKTsKKyAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuIDA7CisgICAgQUxPR1YoImFzeW5jQ2FsbGJhY2soKSBldmVudCAlZCIsIGV2ZW50KTsKKyAgICBzd2l0Y2ggKGV2ZW50KSB7CisgICAgICAgIGNhc2UgU1RSRUFNX0NCS19FVkVOVF9XUklURV9SRUFEWToKKyAgICAgICAgICAgIGNhbGxiYWNrLT5vbldyaXRlUmVhZHkoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNUUkVBTV9DQktfRVZFTlRfRFJBSU5fUkVBRFk6CisgICAgICAgICAgICBjYWxsYmFjay0+b25EcmFpblJlYWR5KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTVFJFQU1fQ0JLX0VWRU5UX0VSUk9SOgorICAgICAgICAgICAgY2FsbGJhY2stPm9uRXJyb3IoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR1coImFzeW5jQ2FsbGJhY2soKSB1bmtub3duIGV2ZW50ICVkIiwgZXZlbnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c3VwcG9ydHNQYXVzZUFuZFJlc3VtZShib29sICpzdXBwb3J0c1BhdXNlLCBib29sICpzdXBwb3J0c1Jlc3VtZSkgeworICAgICpzdXBwb3J0c1BhdXNlID0gbVN0cmVhbS0+cGF1c2UgIT0gTlVMTDsKKyAgICAqc3VwcG9ydHNSZXN1bWUgPSBtU3RyZWFtLT5yZXN1bWUgIT0gTlVMTDsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpwYXVzZSgpIHsKKyAgICBpZiAobVN0cmVhbS0+cGF1c2UgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5wYXVzZShtU3RyZWFtKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnJlc3VtZSgpIHsKKyAgICBpZiAobVN0cmVhbS0+cmVzdW1lID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+cmVzdW1lKG1TdHJlYW0pOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c3VwcG9ydHNEcmFpbihib29sICpzdXBwb3J0c0RyYWluKSB7CisgICAgKnN1cHBvcnRzRHJhaW4gPSBtU3RyZWFtLT5kcmFpbiAhPSBOVUxMOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmRyYWluKGJvb2wgZWFybHlOb3RpZnkpIHsKKyAgICBpZiAobVN0cmVhbS0+ZHJhaW4gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5kcmFpbihtU3RyZWFtLCBlYXJseU5vdGlmeSA/IEFVRElPX0RSQUlOX0VBUkxZX05PVElGWSA6IEFVRElPX0RSQUlOX0FMTCk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpmbHVzaCgpIHsKKyAgICBpZiAobVN0cmVhbS0+Zmx1c2ggPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5mbHVzaChtU3RyZWFtKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKSB7CisgICAgaWYgKG1TdHJlYW0tPmdldF9wcmVzZW50YXRpb25fcG9zaXRpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5nZXRfcHJlc2VudGF0aW9uX3Bvc2l0aW9uKG1TdHJlYW0sIGZyYW1lcywgdGltZXN0YW1wKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnVwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgeworICAgIGlmIChtU3RyZWFtLT51cGRhdGVfc291cmNlX21ldGFkYXRhID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBjb25zdCBzb3VyY2VfbWV0YWRhdGFfdCBtZXRhZGF0YSB7CisgICAgICAgIC50cmFja19jb3VudCA9IHNvdXJjZU1ldGFkYXRhLnRyYWNrcy5zaXplKCksCisgICAgICAgIC8vIGNvbnN0IGNhc3QgaXMgZmluZSBhcyBpdCBpcyBpbiBhIGNvbnN0IHN0cnVjdHVyZQorICAgICAgICAudHJhY2tzID0gY29uc3RfY2FzdDxwbGF5YmFja190cmFja19tZXRhZGF0YSo+KHNvdXJjZU1ldGFkYXRhLnRyYWNrcy5kYXRhKCkpLAorICAgIH07CisgICAgbVN0cmVhbS0+dXBkYXRlX3NvdXJjZV9tZXRhZGF0YShtU3RyZWFtLCAmbWV0YWRhdGEpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN0YXJ0KCkgeworICAgIGlmIChtU3RyZWFtLT5zdGFydCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPnN0YXJ0KG1TdHJlYW0pOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c3RvcCgpIHsKKyAgICBpZiAobVN0cmVhbS0+c3RvcCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPnN0b3AobVN0cmVhbSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbykgeworICAgIGlmIChtU3RyZWFtLT5jcmVhdGVfbW1hcF9idWZmZXIgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5jcmVhdGVfbW1hcF9idWZmZXIobVN0cmVhbSwgbWluU2l6ZUZyYW1lcywgaW5mbyk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSB7CisgICAgaWYgKG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X21tYXBfcG9zaXRpb24obVN0cmVhbSwgcG9zaXRpb24pOworfQorCitTdHJlYW1JbkhhbExvY2FsOjpTdHJlYW1JbkhhbExvY2FsKGF1ZGlvX3N0cmVhbV9pbl90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpCisgICAgICAgIDogU3RyZWFtSGFsTG9jYWwoJnN0cmVhbS0+Y29tbW9uLCBkZXZpY2UpLCBtU3RyZWFtKHN0cmVhbSkgeworfQorCitTdHJlYW1JbkhhbExvY2FsOjp+U3RyZWFtSW5IYWxMb2NhbCgpIHsKKyAgICBtRGV2aWNlLT5jbG9zZUlucHV0U3RyZWFtKG1TdHJlYW0pOworICAgIG1TdHJlYW0gPSAwOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7CisgICAgKnNpemUgPSBhdWRpb19zdHJlYW1faW5fZnJhbWVfc2l6ZShtU3RyZWFtKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnNldEdhaW4oZmxvYXQgZ2FpbikgeworICAgIHJldHVybiBtU3RyZWFtLT5zZXRfZ2FpbihtU3RyZWFtLCBnYWluKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6cmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICpyZWFkKSB7CisgICAgc3NpemVfdCByZWFkUmVzdWx0ID0gbVN0cmVhbS0+cmVhZChtU3RyZWFtLCBidWZmZXIsIGJ5dGVzKTsKKyAgICBpZiAocmVhZFJlc3VsdCA+IDApIHsKKyAgICAgICAgKnJlYWQgPSByZWFkUmVzdWx0OworICAgICAgICBtU3RyZWFtUG93ZXJMb2cubG9nKCBidWZmZXIsICpyZWFkKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSB7CisgICAgICAgICpyZWFkID0gMDsKKyAgICAgICAgcmV0dXJuIHJlYWRSZXN1bHQ7CisgICAgfQorfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpIHsKKyAgICAqZnJhbWVzTG9zdCA9IG1TdHJlYW0tPmdldF9pbnB1dF9mcmFtZXNfbG9zdChtU3RyZWFtKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpIHsKKyAgICBpZiAobVN0cmVhbS0+Z2V0X2NhcHR1cmVfcG9zaXRpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5nZXRfY2FwdHVyZV9wb3NpdGlvbihtU3RyZWFtLCBmcmFtZXMsIHRpbWUpOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjp1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIHsKKyAgICBpZiAobVN0cmVhbS0+dXBkYXRlX3NpbmtfbWV0YWRhdGEgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIGNvbnN0IHNpbmtfbWV0YWRhdGFfdCBtZXRhZGF0YSB7CisgICAgICAgIC50cmFja19jb3VudCA9IHNpbmtNZXRhZGF0YS50cmFja3Muc2l6ZSgpLAorICAgICAgICAvLyBjb25zdCBjYXN0IGlzIGZpbmUgYXMgaXQgaXMgaW4gYSBjb25zdCBzdHJ1Y3R1cmUKKyAgICAgICAgLnRyYWNrcyA9IGNvbnN0X2Nhc3Q8cmVjb3JkX3RyYWNrX21ldGFkYXRhKj4oc2lua01ldGFkYXRhLnRyYWNrcy5kYXRhKCkpLAorICAgIH07CisgICAgbVN0cmVhbS0+dXBkYXRlX3NpbmtfbWV0YWRhdGEobVN0cmVhbSwgJm1ldGFkYXRhKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnN0YXJ0KCkgeworICAgIGlmIChtU3RyZWFtLT5zdGFydCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPnN0YXJ0KG1TdHJlYW0pOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzdG9wKCkgeworICAgIGlmIChtU3RyZWFtLT5zdG9wID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+c3RvcChtU3RyZWFtKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Y3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pIHsKKyAgICBpZiAobVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyKG1TdHJlYW0sIG1pblNpemVGcmFtZXMsIGluZm8pOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSB7CisgICAgaWYgKG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X21tYXBfcG9zaXRpb24obVN0cmVhbSwgcG9zaXRpb24pOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRBY3RpdmVNaWNyb3Bob25lcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMgX191bnVzZWQpIHsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1IYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbUhhbExvY2FsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RhOGQwYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1IYWxMb2NhbC5oCkBAIC0wLDAgKzEsMjE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfTE9DQUxfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfTE9DQUxfSAorCisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmg+CisjaW5jbHVkZSAiU3RyZWFtUG93ZXJMb2cuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBEZXZpY2VIYWxMb2NhbDsKKworY2xhc3MgU3RyZWFtSGFsTG9jYWwgOiBwdWJsaWMgdmlydHVhbCBTdHJlYW1IYWxJbnRlcmZhY2UKK3sKKyAgcHVibGljOgorICAgIC8vIFJldHVybiB0aGUgc2FtcGxpbmcgcmF0ZSBpbiBIeiAtIGVnLiA0NDEwMC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpOworCisgICAgLy8gUmV0dXJuIHNpemUgb2YgaW5wdXQvb3V0cHV0IGJ1ZmZlciBpbiBieXRlcyBmb3IgdGhpcyBzdHJlYW0gLSBlZy4gNDgwMC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKTsKKworICAgIC8vIFJldHVybiB0aGUgY2hhbm5lbCBtYXNrLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spOworCisgICAgLy8gUmV0dXJuIHRoZSBhdWRpbyBmb3JtYXQgLSBlLmcuIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOworCisgICAgLy8gQ29udmVuaWVuY2UgbWV0aG9kLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qcm9wZXJ0aWVzKAorICAgICAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrLCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0KTsKKworICAgIC8vIFNldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7CisKKyAgICAvLyBHZXQgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7CisKKyAgICAvLyBBZGQgb3IgcmVtb3ZlIHRoZSBlZmZlY3Qgb24gdGhlIHN0cmVhbS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZEVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOworCisgICAgLy8gUHV0IHRoZSBhdWRpbyBoYXJkd2FyZSBpbnB1dC9vdXRwdXQgaW50byBzdGFuZGJ5IG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFuZGJ5KCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKKworICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpID0gMDsKKworICAgIC8vIFN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKSA9IDA7CisKKyAgICAvLyBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBidWZmZXIgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSA9IDA7CisKKyAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgPSAwOworCisgICAgLy8gU2V0IHRoZSBwcmlvcml0eSBvZiB0aGUgdGhyZWFkIHRoYXQgaW50ZXJhY3RzIHdpdGggdGhlIEhBTAorICAgIC8vIChtdXN0IG1hdGNoIHRoZSBwcmlvcml0eSBvZiB0aGUgYXVkaW9mbGluZ2VyJ3MgdGhyZWFkIHRoYXQgY2FsbHMgJ3JlYWQnIC8gJ3dyaXRlJykKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEhhbFRocmVhZFByaW9yaXR5KGludCBwcmlvcml0eSk7CisKKyAgcHJvdGVjdGVkOgorICAgIC8vIFN1YmNsYXNzZXMgY2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIFN0cmVhbUhhbExvY2FsKGF1ZGlvX3N0cmVhbV90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpOworCisgICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIHN0cmVhbS4KKyAgICB2aXJ0dWFsIH5TdHJlYW1IYWxMb2NhbCgpOworCisgICAgc3A8RGV2aWNlSGFsTG9jYWw+IG1EZXZpY2U7CisKKyAgICAvLyBtU3RyZWFtUG93ZXJMb2cgaXMgdXNlZCBmb3IgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCisgICAgU3RyZWFtUG93ZXJMb2cgbVN0cmVhbVBvd2VyTG9nOworCisgIHByaXZhdGU6CisgICAgYXVkaW9fc3RyZWFtX3QgKm1TdHJlYW07Cit9OworCitjbGFzcyBTdHJlYW1PdXRIYWxMb2NhbCA6IHB1YmxpYyBTdHJlYW1PdXRIYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxMb2NhbCB7CisgIHB1YmxpYzoKKyAgICAvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgKG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlKSBvZiBhIHN0cmVhbS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpOworCisgICAgLy8gUmV0dXJuIHRoZSBhdWRpbyBoYXJkd2FyZSBkcml2ZXIgZXN0aW1hdGVkIGxhdGVuY3kgaW4gbWlsbGlzZWNvbmRzLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSk7CisKKyAgICAvLyBVc2UgdGhpcyBtZXRob2QgaW4gc2l0dWF0aW9ucyB3aGVyZSBhdWRpbyBtaXhpbmcgaXMgZG9uZSBpbiB0aGUgaGFyZHdhcmUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOworCisgICAgLy8gV3JpdGUgYXVkaW8gYnVmZmVyIHRvIGRyaXZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pOworCisgICAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHdyaXR0ZW4gYnkgdGhlIGF1ZGlvIGRzcCB0byBEQUMgc2luY2UKKyAgICAvLyB0aGUgb3V0cHV0IGhhcyBleGl0ZWQgc3RhbmRieS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpOworCisgICAgLy8gR2V0IHRoZSBsb2NhbCB0aW1lIGF0IHdoaWNoIHRoZSBuZXh0IHdyaXRlIHRvIHRoZSBhdWRpbyBkcml2ZXIgd2lsbCBiZSBwcmVzZW50ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKTsKKworICAgIC8vIFNldCB0aGUgY2FsbGJhY2sgZm9yIG5vdGlmeWluZyBjb21wbGV0aW9uIG9mIG5vbi1ibG9ja2luZyB3cml0ZSBhbmQgZHJhaW4uCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spOworCisgICAgLy8gUmV0dXJucyB3aGV0aGVyIHBhdXNlIGFuZCByZXN1bWUgb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNQYXVzZUFuZFJlc3VtZShib29sICpzdXBwb3J0c1BhdXNlLCBib29sICpzdXBwb3J0c1Jlc3VtZSk7CisKKyAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7CisKKyAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3VtZSgpOworCisgICAgLy8gUmV0dXJucyB3aGV0aGVyIGRyYWluIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0RyYWluKGJvb2wgKnN1cHBvcnRzRHJhaW4pOworCisgICAgLy8gUmVxdWVzdHMgbm90aWZpY2F0aW9uIHdoZW4gZGF0YSBidWZmZXJlZCBieSB0aGUgZHJpdmVyL2hhcmR3YXJlIGhhcyBiZWVuIHBsYXllZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGRyYWluKGJvb2wgZWFybHlOb3RpZnkpOworCisgICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byBmbHVzaCB0aGUgcXVldWVkIGRhdGEuCisgICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaCgpOworCisgICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHByZXNlbnRlZCB0byBhbiBleHRlcm5hbCBvYnNlcnZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKTsKKworICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOworCisgICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworCisgICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbyk7CisKKyAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbik7CisKKyAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNvdXJjZSBoYXMgYmVlbiBjaGFuZ2VkLgorICAgIHN0YXR1c190IHVwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgb3ZlcnJpZGU7CisKKyAgcHJpdmF0ZToKKyAgICBhdWRpb19zdHJlYW1fb3V0X3QgKm1TdHJlYW07CisgICAgd3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IG1DYWxsYmFjazsKKworICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VIYWxMb2NhbDsKKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBTdHJlYW1PdXRIYWxMb2NhbChhdWRpb19zdHJlYW1fb3V0X3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSk7CisKKyAgICB2aXJ0dWFsIH5TdHJlYW1PdXRIYWxMb2NhbCgpOworCisgICAgc3RhdGljIGludCBhc3luY0NhbGxiYWNrKHN0cmVhbV9jYWxsYmFja19ldmVudF90IGV2ZW50LCB2b2lkICpwYXJhbSwgdm9pZCAqY29va2llKTsKK307CisKK2NsYXNzIFN0cmVhbUluSGFsTG9jYWwgOiBwdWJsaWMgU3RyZWFtSW5IYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxMb2NhbCB7CisgIHB1YmxpYzoKKyAgICAvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgKG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlKSBvZiBhIHN0cmVhbS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpOworCisgICAgLy8gU2V0IHRoZSBpbnB1dCBnYWluIGZvciB0aGUgYXVkaW8gZHJpdmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0R2FpbihmbG9hdCBnYWluKTsKKworICAgIC8vIFJlYWQgYXVkaW8gYnVmZmVyIGluIGZyb20gZHJpdmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICpyZWFkKTsKKworICAgIC8vIFJldHVybiB0aGUgYW1vdW50IG9mIGlucHV0IGZyYW1lcyBsb3N0IGluIHRoZSBhdWRpbyBkcml2ZXIuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpOworCisgICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHJlY2VpdmVkIGFuZAorICAgIC8vIHRoZSBjbG9jayB0aW1lIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGZyYW1lIGNvdW50LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FwdHVyZVBvc2l0aW9uKGludDY0X3QgKmZyYW1lcywgaW50NjRfdCAqdGltZSk7CisKKyAgICAvLyBTdGFydCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKKworICAgIC8vIFN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKworICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pOworCisgICAgLy8gR2V0IGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pOworCisgICAgLy8gR2V0IGFjdGl2ZSBtaWNyb3Bob25lcworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOworCisgICAgLy8gQ2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncyBzaW5rIGhhcyBiZWVuIGNoYW5nZWQuCisgICAgc3RhdHVzX3QgdXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSBvdmVycmlkZTsKKworICBwcml2YXRlOgorICAgIGF1ZGlvX3N0cmVhbV9pbl90ICptU3RyZWFtOworCisgICAgZnJpZW5kIGNsYXNzIERldmljZUhhbExvY2FsOworCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIFN0cmVhbUluSGFsTG9jYWwoYXVkaW9fc3RyZWFtX2luX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSk7CisKKyAgICB2aXJ0dWFsIH5TdHJlYW1JbkhhbExvY2FsKCk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfTE9DQUxfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtUG93ZXJMb2cuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1Qb3dlckxvZy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1Qb3dlckxvZy5oCnJlbmFtZSB0byBtZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtUG93ZXJMb2cuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzNkZWZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1OCBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJhdWRpb2hhbEA0LjAiLAorCisgICAgc3JjczogWworICAgICAgICAiRGV2aWNlSGFsTG9jYWwuY3BwIiwKKyAgICAgICAgIkRldmljZXNGYWN0b3J5SGFsSHlicmlkLmNwcCIsCisgICAgICAgICJEZXZpY2VzRmFjdG9yeUhhbExvY2FsLmNwcCIsCisgICAgICAgICJTdHJlYW1IYWxMb2NhbC5jcHAiLAorCisgICAgICAgICJDb252ZXJzaW9uSGVscGVySGlkbC5jcHAiLAorICAgICAgICAiRGV2aWNlSGFsSGlkbC5jcHAiLAorICAgICAgICAiRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmNwcCIsCisgICAgICAgICJFZmZlY3RCdWZmZXJIYWxIaWRsLmNwcCIsCisgICAgICAgICJFZmZlY3RIYWxIaWRsLmNwcCIsCisgICAgICAgICJFZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwIiwKKyAgICAgICAgIlN0cmVhbUhhbEhpZGwuY3BwIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXVkaW9oYWxfZGVhdGhoYW5kbGVyIiwKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGliaGFyZHdhcmUiLAorICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJmbXEiLAorICAgICAgICAibGliaHdiaW5kZXIiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliaGlkbG1lbW9yeSIsCisgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW9ANC4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uLXV0aWwiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25ANC4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDQuMC11dGlsIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uZWZmZWN0QDQuMCIsCisgICAgICAgICJhbmRyb2lkLmhpZGwuYWxsb2NhdG9yQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhpZGwubWVtb3J5QDEuMCIsCisgICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAorICAgICAgICAibGlibWVkaWF1dGlscyIsCisgICAgXSwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb24udXRpbEBhbGwtdmVyc2lvbnMiLAorICAgICAgICAibGliYXVkaW9oYWxfaGVhZGVycyIKKyAgICBdLAorCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGliZm1xIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9Db252ZXJzaW9uSGVscGVySGlkbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUyNzUwNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9Db252ZXJzaW9uSGVscGVySGlkbC5jcHAKQEAgLTAsMCArMSwyMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgTE9HX1RBRyAiSGFsSGlkbCIKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OkF1ZGlvTWljcm9waG9uZUNoYW5uZWxNYXBwaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OkF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OkF1ZGlvTWljcm9waG9uZUxvY2F0aW9uOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OkRldmljZUFkZHJlc3M7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6TWljcm9waG9uZUluZm87Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6UmVzdWx0OworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgVjRfMCB7CisKKy8vIHN0YXRpYworc3RhdHVzX3QgQ29udmVyc2lvbkhlbHBlckhpZGw6OmtleXNGcm9tSGFsKGNvbnN0IFN0cmluZzgmIGtleXMsIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiAqaGlkbEtleXMpIHsKKyAgICBBdWRpb1BhcmFtZXRlciBoYWxLZXlzKGtleXMpOworICAgIGlmIChoYWxLZXlzLnNpemUoKSA9PSAwKSByZXR1cm4gQkFEX1ZBTFVFOworICAgIGhpZGxLZXlzLT5yZXNpemUoaGFsS2V5cy5zaXplKCkpOworICAgIC8vRklYTUU6ICBrZXlTdHJlYW1TdXBwb3J0ZWRDaGFubmVscyBhbmQga2V5U3RyZWFtU3VwcG9ydGVkU2FtcGxpbmdSYXRlcyBjb21lIHdpdGggYQorICAgIC8vICJrZXlGb3JtYXQ9PHZhbHVlPiIgcGFpci4gV2UgbmVlZCB0byB0cmFuc2Zvcm0gaXQgaW50byBhIHNpbmdsZSBrZXkgc3RyaW5nIHNvIHRoYXQgaXQgaXMKKyAgICAvLyBjYXJyaWVkIG92ZXIgdG8gdGhlIGxlZ2FjeSBIQUwgdmlhIEhJREwuCisgICAgU3RyaW5nOCB2YWx1ZTsKKyAgICBib29sIGtlZXBGb3JtYXRWYWx1ZSA9IGhhbEtleXMuc2l6ZSgpID09IDIgJiYKKyAgICAgICAgIChoYWxLZXlzLmdldChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRDaGFubmVscyksIHZhbHVlKSA9PSBOT19FUlJPUiB8fAorICAgICAgICAgaGFsS2V5cy5nZXQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkU2FtcGxpbmdSYXRlcyksIHZhbHVlKSA9PSBOT19FUlJPUik7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhhbEtleXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgU3RyaW5nOCBrZXk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGhhbEtleXMuZ2V0QXQoaSwga2V5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgaWYgKGtlZXBGb3JtYXRWYWx1ZSAmJiBrZXkgPT0gQXVkaW9QYXJhbWV0ZXI6OmtleUZvcm1hdCkgeworICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgZm9ybWF0UGFyYW07CisgICAgICAgICAgICBoYWxLZXlzLmdldEF0KGksIGtleSwgdmFsdWUpOworICAgICAgICAgICAgZm9ybWF0UGFyYW0uYWRkKGtleSwgdmFsdWUpOworICAgICAgICAgICAga2V5ID0gZm9ybWF0UGFyYW0udG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgICAgICAoKmhpZGxLZXlzKVtpXSA9IGtleS5zdHJpbmcoKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCisvLyBzdGF0aWMKK3N0YXR1c190IENvbnZlcnNpb25IZWxwZXJIaWRsOjpwYXJhbWV0ZXJzRnJvbUhhbCgKKyAgICAgICAgY29uc3QgU3RyaW5nOCYga3ZQYWlycywgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+ICpoaWRsUGFyYW1zKSB7CisgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW1zKGt2UGFpcnMpOworICAgIGlmIChwYXJhbXMuc2l6ZSgpID09IDApIHJldHVybiBCQURfVkFMVUU7CisgICAgaGlkbFBhcmFtcy0+cmVzaXplKHBhcmFtcy5zaXplKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGFyYW1zLnNpemUoKTsgKytpKSB7CisgICAgICAgIFN0cmluZzgga2V5LCB2YWx1ZTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyYW1zLmdldEF0KGksIGtleSwgdmFsdWUpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOworICAgICAgICAoKmhpZGxQYXJhbXMpW2ldLmtleSA9IGtleS5zdHJpbmcoKTsKKyAgICAgICAgKCpoaWRsUGFyYW1zKVtpXS52YWx1ZSA9IHZhbHVlLnN0cmluZygpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKKy8vIHN0YXRpYwordm9pZCBDb252ZXJzaW9uSGVscGVySGlkbDo6cGFyYW1ldGVyc1RvSGFsKAorICAgICAgICBjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMsIFN0cmluZzggKnZhbHVlcykgeworICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhcmFtZXRlcnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgcGFyYW1zLmFkZChTdHJpbmc4KHBhcmFtZXRlcnNbaV0ua2V5LmNfc3RyKCkpLCBTdHJpbmc4KHBhcmFtZXRlcnNbaV0udmFsdWUuY19zdHIoKSkpOworICAgIH0KKyAgICB2YWx1ZXMtPnNldFRvKHBhcmFtcy50b1N0cmluZygpKTsKK30KKworQ29udmVyc2lvbkhlbHBlckhpZGw6OkNvbnZlcnNpb25IZWxwZXJIaWRsKGNvbnN0IGNoYXIqIGNsYXNzTmFtZSkKKyAgICAgICAgOiBtQ2xhc3NOYW1lKGNsYXNzTmFtZSkgeworfQorCisvLyBzdGF0aWMKK3N0YXR1c190IENvbnZlcnNpb25IZWxwZXJIaWRsOjphbmFseXplUmVzdWx0KGNvbnN0IFJlc3VsdCYgcmVzdWx0KSB7CisgICAgc3dpdGNoIChyZXN1bHQpIHsKKyAgICAgICAgY2FzZSBSZXN1bHQ6Ok9LOiByZXR1cm4gT0s7CisgICAgICAgIGNhc2UgUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUzogcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfU1RBVEU6IHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CisgICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ6IHJldHVybiBOT19JTklUOworICAgICAgICBjYXNlIFJlc3VsdDo6Tk9UX1NVUFBPUlRFRDogcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICBkZWZhdWx0OiByZXR1cm4gTk9fSU5JVDsKKyAgICB9Cit9CisKK3ZvaWQgQ29udmVyc2lvbkhlbHBlckhpZGw6OmVtaXRFcnJvcihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgY2hhciogZGVzY3JpcHRpb24pIHsKKyAgICBBTE9HRSgiJXMgJXAgJXM6ICVzIChmcm9tIHJwYykiLCBtQ2xhc3NOYW1lLCB0aGlzLCBmdW5jTmFtZSwgZGVzY3JpcHRpb24pOworfQorCisvLyBUT0RPOiBVc2UgdGhlIHNhbWUgaW1wbGVtZW50YXRpb24gaW4gdGhlIGhhbCB3aGVuIGl0IG1vdmVzIHRvIGEgdXRpbCBsaWJyYXJ5Lgorc3RkOjpzdHJpbmcgZGV2aWNlQWRkcmVzc1RvSGFsKGNvbnN0IERldmljZUFkZHJlc3MmIGFkZHJlc3MpIHsKKyAgICAvLyBIQUwgYXNzdW1lcyB0aGF0IHRoZSBhZGRyZXNzIGlzIE5VTC10ZXJtaW5hdGVkLgorICAgIGNoYXIgaGFsQWRkcmVzc1tBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOXTsKKyAgICBtZW1zZXQoaGFsQWRkcmVzcywgMCwgc2l6ZW9mKGhhbEFkZHJlc3MpKTsKKyAgICBhdWRpb19kZXZpY2VzX3QgaGFsRGV2aWNlID0gc3RhdGljX2Nhc3Q8YXVkaW9fZGV2aWNlc190PihhZGRyZXNzLmRldmljZSk7CisgICAgY29uc3QgYm9vbCBpc0lucHV0ID0gKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9CSVRfSU4pICE9IDA7CisgICAgaWYgKGlzSW5wdXQpIGhhbERldmljZSAmPSB+QVVESU9fREVWSUNFX0JJVF9JTjsKKyAgICBpZiAoKCFpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSAhPSAwKSB8fAorICAgICAgICAoaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQKSAhPSAwKSkgeworICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCIsCisgICAgICAgICAgICAgICAgIGFkZHJlc3MuYWRkcmVzcy5tYWNbMF0sIGFkZHJlc3MuYWRkcmVzcy5tYWNbMV0sIGFkZHJlc3MuYWRkcmVzcy5tYWNbMl0sCisgICAgICAgICAgICAgICAgIGFkZHJlc3MuYWRkcmVzcy5tYWNbM10sIGFkZHJlc3MuYWRkcmVzcy5tYWNbNF0sIGFkZHJlc3MuYWRkcmVzcy5tYWNbNV0pOworICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0lQKSAhPSAwKSB8fAorICAgICAgICAgICAgICAgKGlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9JTl9JUCkgIT0gMCkpIHsKKyAgICAgICAgc25wcmludGYoaGFsQWRkcmVzcywgc2l6ZW9mKGhhbEFkZHJlc3MpLCAiJWQuJWQuJWQuJWQiLCBhZGRyZXNzLmFkZHJlc3MuaXB2NFswXSwKKyAgICAgICAgICAgICAgICAgYWRkcmVzcy5hZGRyZXNzLmlwdjRbMV0sIGFkZHJlc3MuYWRkcmVzcy5pcHY0WzJdLCBhZGRyZXNzLmFkZHJlc3MuaXB2NFszXSk7CisgICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX1VTQikgIT0gMCkgfHwKKyAgICAgICAgICAgICAgIChpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQUxMX1VTQikgIT0gMCkpIHsKKyAgICAgICAgc25wcmludGYoaGFsQWRkcmVzcywgc2l6ZW9mKGhhbEFkZHJlc3MpLCAiY2FyZD0lZDtkZXZpY2U9JWQiLCBhZGRyZXNzLmFkZHJlc3MuYWxzYS5jYXJkLAorICAgICAgICAgICAgICAgICBhZGRyZXNzLmFkZHJlc3MuYWxzYS5kZXZpY2UpOworICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0JVUykgIT0gMCkgfHwKKyAgICAgICAgICAgICAgIChpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQlVTKSAhPSAwKSkgeworICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlcyIsIGFkZHJlc3MuYnVzQWRkcmVzcy5jX3N0cigpKTsKKyAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYKSkgIT0gMCB8fAorICAgICAgICAgICAgICAgKGlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYKSAhPSAwKSkgeworICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlcyIsIGFkZHJlc3MuclN1Ym1peEFkZHJlc3MuY19zdHIoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc25wcmludGYoaGFsQWRkcmVzcywgc2l6ZW9mKGhhbEFkZHJlc3MpLCAiJXMiLCBhZGRyZXNzLmJ1c0FkZHJlc3MuY19zdHIoKSk7CisgICAgfQorICAgIHJldHVybiBoYWxBZGRyZXNzOworfQorCisvL2xvY2FsIGNvbnZlcnNpb24gaGVscGVycworCithdWRpb19taWNyb3Bob25lX2NoYW5uZWxfbWFwcGluZ190ICBjaGFubmVsTWFwcGluZ1RvSGFsKEF1ZGlvTWljcm9waG9uZUNoYW5uZWxNYXBwaW5nIG1hcHBpbmcpIHsKKyAgICBzd2l0Y2ggKG1hcHBpbmcpIHsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVDaGFubmVsTWFwcGluZzo6VU5VU0VEOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfQ0hBTk5FTF9NQVBQSU5HX1VOVVNFRDsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVDaGFubmVsTWFwcGluZzo6RElSRUNUOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfQ0hBTk5FTF9NQVBQSU5HX0RJUkVDVDsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVDaGFubmVsTWFwcGluZzo6UFJPQ0VTU0VEOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfQ0hBTk5FTF9NQVBQSU5HX1BST0NFU1NFRDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlVua25vd24gY2hhbm5lbE1hcHBpbmdUb0hhbCBjb252ZXJzaW9uICVkIiwgbWFwcGluZyk7CisgICAgfQorfQorCithdWRpb19taWNyb3Bob25lX2xvY2F0aW9uX3QgbG9jYXRpb25Ub0hhbChBdWRpb01pY3JvcGhvbmVMb2NhdGlvbiBsb2NhdGlvbikgeworICAgIHN3aXRjaCAobG9jYXRpb24pIHsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVMb2NhdGlvbjo6VU5LTk9XTjoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0xPQ0FUSU9OX1VOS05PV047CisgICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lTG9jYXRpb246Ok1BSU5CT0RZOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfTE9DQVRJT05fTUFJTkJPRFk7CisgICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lTG9jYXRpb246Ok1BSU5CT0RZX01PVkFCTEU6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9MT0NBVElPTl9NQUlOQk9EWV9NT1ZBQkxFOworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZUxvY2F0aW9uOjpQRVJJUEhFUkFMOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfTE9DQVRJT05fUEVSSVBIRVJBTDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlVua25vd24gbG9jYXRpb25Ub0hhbCBjb252ZXJzaW9uICVkIiwgbG9jYXRpb24pOworICAgIH0KK30KK2F1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uYWxpdHlfdCBkaXJlY3Rpb25hbGl0eVRvSGFsKEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5IGRpcikgeworICAgIHN3aXRjaCAoZGlyKSB7CisgICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lRGlyZWN0aW9uYWxpdHk6OlVOS05PV046CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9VTktOT1dOOworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpPTU5JOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfRElSRUNUSU9OQUxJVFlfT01OSTsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6QklfRElSRUNUSU9OQUw6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9CSV9ESVJFQ1RJT05BTDsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6Q0FSRElPSUQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9DQVJESU9JRDsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6SFlQRVJfQ0FSRElPSUQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9IWVBFUl9DQVJESU9JRDsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6U1VQRVJfQ0FSRElPSUQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9TVVBFUl9DQVJESU9JRDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlVua25vd24gZGlyZWN0aW9uYWxpdHlUb0hhbCBjb252ZXJzaW9uICVkIiwgZGlyKTsKKyAgICB9Cit9CisKKy8vIHN0YXRpYwordm9pZCBDb252ZXJzaW9uSGVscGVySGlkbDo6bWljcm9waG9uZUluZm9Ub0hhbChjb25zdCBNaWNyb3Bob25lSW5mbyYgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QgKnBEc3QpIHsKKyAgICBpZiAocERzdCAhPSBOVUxMKSB7CisgICAgICAgIHNucHJpbnRmKHBEc3QtPmRldmljZV9pZCwgc2l6ZW9mKHBEc3QtPmRldmljZV9pZCksCisgICAgICAgICAgICAgICAgICIlcyIsIHNyYy5kZXZpY2VJZC5jX3N0cigpKTsKKyAgICAgICAgcERzdC0+ZGV2aWNlID0gc3RhdGljX2Nhc3Q8YXVkaW9fZGV2aWNlc190PihzcmMuZGV2aWNlQWRkcmVzcy5kZXZpY2UpOworICAgICAgICBzbnByaW50ZihwRHN0LT5hZGRyZXNzLCBzaXplb2YocERzdC0+YWRkcmVzcyksCisgICAgICAgICAgICAgICAgICIlcyIsIGRldmljZUFkZHJlc3NUb0hhbChzcmMuZGV2aWNlQWRkcmVzcykuY19zdHIoKSk7CisgICAgICAgIGlmIChzcmMuY2hhbm5lbE1hcHBpbmcuc2l6ZSgpID4gQVVESU9fQ0hBTk5FTF9DT1VOVF9NQVgpIHsKKyAgICAgICAgICAgIEFMT0dXKCJtaWNyb3Bob25lSW5mb1RvU3RydWN0IGZvdW5kICV6dSBjaGFubmVsTWFwcGluZyBlbGVtZW50cy4gTWF4IGV4cGVjdGVkIGlzICVkIiwKKyAgICAgICAgICAgICAgICAgIHNyYy5jaGFubmVsTWFwcGluZy5zaXplKCksIEFVRElPX0NIQU5ORUxfQ09VTlRfTUFYKTsKKyAgICAgICAgfQorICAgICAgICBzaXplX3QgY2g7CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHNyYy5jaGFubmVsTWFwcGluZy5zaXplKCkgJiYgY2ggPCBBVURJT19DSEFOTkVMX0NPVU5UX01BWDsgY2grKykgeworICAgICAgICAgICAgcERzdC0+Y2hhbm5lbF9tYXBwaW5nW2NoXSA9IGNoYW5uZWxNYXBwaW5nVG9IYWwoc3JjLmNoYW5uZWxNYXBwaW5nW2NoXSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yICg7IGNoIDwgQVVESU9fQ0hBTk5FTF9DT1VOVF9NQVg7IGNoKyspIHsKKyAgICAgICAgICAgIHBEc3QtPmNoYW5uZWxfbWFwcGluZ1tjaF0gPSBBVURJT19NSUNST1BIT05FX0NIQU5ORUxfTUFQUElOR19VTlVTRUQ7CisgICAgICAgIH0KKyAgICAgICAgcERzdC0+bG9jYXRpb24gPSBsb2NhdGlvblRvSGFsKHNyYy5sb2NhdGlvbik7CisgICAgICAgIHBEc3QtPmdyb3VwID0gKGF1ZGlvX21pY3JvcGhvbmVfZ3JvdXBfdClzcmMuZ3JvdXA7CisgICAgICAgIHBEc3QtPmluZGV4X2luX3RoZV9ncm91cCA9ICh1bnNpZ25lZCBpbnQpc3JjLmluZGV4SW5UaGVHcm91cDsKKyAgICAgICAgcERzdC0+c2Vuc2l0aXZpdHkgPSBzcmMuc2Vuc2l0aXZpdHk7CisgICAgICAgIHBEc3QtPm1heF9zcGwgPSBzcmMubWF4U3BsOworICAgICAgICBwRHN0LT5taW5fc3BsID0gc3JjLm1pblNwbDsKKyAgICAgICAgcERzdC0+ZGlyZWN0aW9uYWxpdHkgPSBkaXJlY3Rpb25hbGl0eVRvSGFsKHNyYy5kaXJlY3Rpb25hbGl0eSk7CisgICAgICAgIHBEc3QtPm51bV9mcmVxdWVuY3lfcmVzcG9uc2VzID0gKHVuc2lnbmVkIGludClzcmMuZnJlcXVlbmN5UmVzcG9uc2Uuc2l6ZSgpOworICAgICAgICBpZiAocERzdC0+bnVtX2ZyZXF1ZW5jeV9yZXNwb25zZXMgPiBBVURJT19NSUNST1BIT05FX01BWF9GUkVRVUVOQ1lfUkVTUE9OU0VTKSB7CisgICAgICAgICAgICBBTE9HVygibWljcm9waG9uZUluZm9Ub1N0cnVjdCBmb3VuZCAlZCBmcmVxdWVuY3kgcmVzcG9uc2VzLiBNYXggZXhwZWN0ZWQgaXMgJWQiLAorICAgICAgICAgICAgICAgICAgcERzdC0+bnVtX2ZyZXF1ZW5jeV9yZXNwb25zZXMsIEFVRElPX01JQ1JPUEhPTkVfTUFYX0ZSRVFVRU5DWV9SRVNQT05TRVMpOworICAgICAgICAgICAgcERzdC0+bnVtX2ZyZXF1ZW5jeV9yZXNwb25zZXMgPSBBVURJT19NSUNST1BIT05FX01BWF9GUkVRVUVOQ1lfUkVTUE9OU0VTOworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgcERzdC0+bnVtX2ZyZXF1ZW5jeV9yZXNwb25zZXM7IGsrKykgeworICAgICAgICAgICAgcERzdC0+ZnJlcXVlbmN5X3Jlc3BvbnNlc1swXVtrXSA9IHNyYy5mcmVxdWVuY3lSZXNwb25zZVtrXS5mcmVxdWVuY3k7CisgICAgICAgICAgICBwRHN0LT5mcmVxdWVuY3lfcmVzcG9uc2VzWzFdW2tdID0gc3JjLmZyZXF1ZW5jeVJlc3BvbnNlW2tdLmxldmVsOworICAgICAgICB9CisgICAgICAgIHBEc3QtPmdlb21ldHJpY19sb2NhdGlvbi54ID0gc3JjLnBvc2l0aW9uLng7CisgICAgICAgIHBEc3QtPmdlb21ldHJpY19sb2NhdGlvbi55ID0gc3JjLnBvc2l0aW9uLnk7CisgICAgICAgIHBEc3QtPmdlb21ldHJpY19sb2NhdGlvbi56ID0gc3JjLnBvc2l0aW9uLno7CisgICAgICAgIHBEc3QtPm9yaWVudGF0aW9uLnggPSBzcmMub3JpZW50YXRpb24ueDsKKyAgICAgICAgcERzdC0+b3JpZW50YXRpb24ueSA9IHNyYy5vcmllbnRhdGlvbi55OworICAgICAgICBwRHN0LT5vcmllbnRhdGlvbi56ID0gc3JjLm9yaWVudGF0aW9uLno7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgVjRfMAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9Db252ZXJzaW9uSGVscGVySGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgyM2E4ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9Db252ZXJzaW9uSGVscGVySGlkbC5oCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfQ09OVkVSU0lPTl9IRUxQRVJfSElETF80XzBfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfNF8wX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vNC4wL3R5cGVzLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlBhcmFtZXRlclZhbHVlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6Ok1pY3JvcGhvbmVJbmZvOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIFY0XzAgeworCitjbGFzcyBDb252ZXJzaW9uSGVscGVySGlkbCB7CisgIHByb3RlY3RlZDoKKyAgICBzdGF0aWMgc3RhdHVzX3Qga2V5c0Zyb21IYWwoY29uc3QgU3RyaW5nOCYga2V5cywgaGlkbF92ZWM8aGlkbF9zdHJpbmc+ICpoaWRsS2V5cyk7CisgICAgc3RhdGljIHN0YXR1c190IHBhcmFtZXRlcnNGcm9tSGFsKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMsIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiAqaGlkbFBhcmFtcyk7CisgICAgc3RhdGljIHZvaWQgcGFyYW1ldGVyc1RvSGFsKGNvbnN0IGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiYgcGFyYW1ldGVycywgU3RyaW5nOCAqdmFsdWVzKTsKKyAgICBzdGF0aWMgdm9pZCBtaWNyb3Bob25lSW5mb1RvSGFsKGNvbnN0IE1pY3JvcGhvbmVJbmZvJiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QgKnBEc3QpOworCisgICAgQ29udmVyc2lvbkhlbHBlckhpZGwoY29uc3QgY2hhciogY2xhc3NOYW1lKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIFQ+CisgICAgc3RhdHVzX3QgcHJvY2Vzc1JldHVybihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgUmV0dXJuPFI+JiByZXQsIFQgKnJldHZhbCkgeworICAgICAgICBpZiAocmV0LmlzT2soKSkgeworICAgICAgICAgICAgLy8gVGhpcyB3YXkgaXQgYWxzbyB3b3JrcyBmb3IgZW51bSBjbGFzcyB0byB1bnNjb3BlZCBlbnVtIGNvbnZlcnNpb24uCisgICAgICAgICAgICAqcmV0dmFsID0gc3RhdGljX2Nhc3Q8VD4oc3RhdGljX2Nhc3Q8Uj4ocmV0KSk7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oZnVuY05hbWUsIHJldCk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48VD4mIHJldCkgeworICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgICAgIGVtaXRFcnJvcihmdW5jTmFtZSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBPSyA6IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpSZXN1bHQ+JiByZXQpIHsKKyAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgICAgICBlbWl0RXJyb3IoZnVuY05hbWUsIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXQpIDogRkFJTEVEX1RSQU5TQUNUSU9OOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RhdHVzX3QgcHJvY2Vzc1JldHVybigKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48VD4mIHJldCwgaGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpSZXN1bHQgcmV0dmFsKSB7CisgICAgICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICAgICAgZW1pdEVycm9yKGZ1bmNOYW1lLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0dmFsKSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBjb25zdCBjaGFyKiBtQ2xhc3NOYW1lOworCisgICAgc3RhdGljIHN0YXR1c190IGFuYWx5emVSZXN1bHQoY29uc3QgaGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpSZXN1bHQmIHJlc3VsdCk7CisKKyAgICB2b2lkIGVtaXRFcnJvcihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgY2hhciogZGVzY3JpcHRpb24pOworfTsKKworfSAgLy8gbmFtZXNwYWNlIFY0XzAKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfNF8wX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VIYWxIaWRsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmFjY2E5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZUhhbEhpZGwuY3BwCkBAIC0wLDAgKzEsMzg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlSGFsSGlkbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vNC4wL0lQcmltYXJ5RGV2aWNlLmg+CisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlIDxod2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8Y29tbW9uL2FsbC12ZXJzaW9ucy9WZXJzaW9uVXRpbHMuaD4KKworI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKKyNpbmNsdWRlICJIaWRsVXRpbHMuaCIKKyNpbmNsdWRlICJTdHJlYW1IYWxIaWRsLmgiCisjaW5jbHVkZSAiVmVyc2lvblV0aWxzLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvQ29uZmlnOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9EZXZpY2U7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb0lucHV0RmxhZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvT3V0cHV0RmxhZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvUGF0Y2hIYW5kbGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb1BvcnQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb1BvcnRDb25maWc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb01vZGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb1NvdXJjZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkhpZGxVdGlsczsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OnV0aWxzOjpta0VudW1Db252ZXJ0ZXI7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6RGV2aWNlQWRkcmVzczsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJUHJpbWFyeURldmljZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpQYXJhbWV0ZXJWYWx1ZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpSZXN1bHQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6U2lua01ldGFkYXRhOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIFY0XzAgeworCituYW1lc3BhY2UgeworCitzdGF0dXNfdCBkZXZpY2VBZGRyZXNzRnJvbUhhbCgKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwgY29uc3QgY2hhciogaGFsQWRkcmVzcywgRGV2aWNlQWRkcmVzcyogYWRkcmVzcykgeworICAgIGFkZHJlc3MtPmRldmljZSA9IEF1ZGlvRGV2aWNlKGRldmljZSk7CisKKyAgICBpZiAoaGFsQWRkcmVzcyA9PSBudWxscHRyIHx8IHN0cm5sZW4oaGFsQWRkcmVzcywgQVVESU9fREVWSUNFX01BWF9BRERSRVNTX0xFTikgPT0gMCkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIGNvbnN0IGJvb2wgaXNJbnB1dCA9IChkZXZpY2UgJiBBVURJT19ERVZJQ0VfQklUX0lOKSAhPSAwOworICAgIGlmIChpc0lucHV0KSBkZXZpY2UgJj0gfkFVRElPX0RFVklDRV9CSVRfSU47CisgICAgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9BTExfQTJEUCkgIT0gMCkKKyAgICAgICAgICAgIHx8IChpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0EyRFApICE9IDApKSB7CisgICAgICAgIGludCBzdGF0dXMgPSBzc2NhbmYoaGFsQWRkcmVzcywKKyAgICAgICAgICAgICAgICAiJWhoWDolaGhYOiVoaFg6JWhoWDolaGhYOiVoaFgiLAorICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLm1hY1swXSwgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzFdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbMl0sCisgICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzNdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbNF0sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1s1XSk7CisgICAgICAgIHJldHVybiBzdGF0dXMgPT0gNiA/IE9LIDogQkFEX1ZBTFVFOworICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0lQKSAhPSAwKQorICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9JUCkgIT0gMCkpIHsKKyAgICAgICAgaW50IHN0YXR1cyA9IHNzY2FuZihoYWxBZGRyZXNzLAorICAgICAgICAgICAgICAgICIlaGh1LiVoaHUuJWhodS4laGh1IiwKKyAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5pcHY0WzBdLCAmYWRkcmVzcy0+YWRkcmVzcy5pcHY0WzFdLAorICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbMl0sICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbM10pOworICAgICAgICByZXR1cm4gc3RhdHVzID09IDQgPyBPSyA6IEJBRF9WQUxVRTsKKyAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9BTExfVVNCKSkgIT0gMAorICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9BTExfVVNCKSkgIT0gMCkgeworICAgICAgICBpbnQgc3RhdHVzID0gc3NjYW5mKGhhbEFkZHJlc3MsCisgICAgICAgICAgICAgICAgImNhcmQ9JWQ7ZGV2aWNlPSVkIiwKKyAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5hbHNhLmNhcmQsICZhZGRyZXNzLT5hZGRyZXNzLmFsc2EuZGV2aWNlKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1cyA9PSAyID8gT0sgOiBCQURfVkFMVUU7CisgICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQlVTKSAhPSAwKQorICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9CVVMpICE9IDApKSB7CisgICAgICAgIGlmIChoYWxBZGRyZXNzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGFkZHJlc3MtPmJ1c0FkZHJlc3MgPSBoYWxBZGRyZXNzOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCkpICE9IDAKKyAgICAgICAgICAgIHx8IChpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCkgIT0gMCkpIHsKKyAgICAgICAgaWYgKGhhbEFkZHJlc3MgIT0gTlVMTCkgeworICAgICAgICAgICAgYWRkcmVzcy0+clN1Ym1peEFkZHJlc3MgPSBoYWxBZGRyZXNzOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0RldmljZUhhbEhpZGw6OkRldmljZUhhbEhpZGwoY29uc3Qgc3A8SURldmljZT4mIGRldmljZSkKKyAgICAgICAgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiRGV2aWNlIiksIG1EZXZpY2UoZGV2aWNlKSwKKyAgICAgICAgICBtUHJpbWFyeURldmljZShJUHJpbWFyeURldmljZTo6Y2FzdEZyb20oZGV2aWNlKSkgeworfQorCitEZXZpY2VIYWxIaWRsOjp+RGV2aWNlSGFsSGlkbCgpIHsKKyAgICBpZiAobURldmljZSAhPSAwKSB7CisgICAgICAgIG1EZXZpY2UuY2xlYXIoKTsKKyAgICAgICAgaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKKyAgICB9Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmdldFN1cHBvcnRlZERldmljZXModWludDMyX3QqKSB7CisgICAgLy8gT2Jzb2xldGUuCisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjppbml0Q2hlY2soKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImluaXRDaGVjayIsIG1EZXZpY2UtPmluaXRDaGVjaygpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0Vm9pY2VWb2x1bWUiLCBtUHJpbWFyeURldmljZS0+c2V0Vm9pY2VWb2x1bWUodm9sdW1lKSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OnNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNYXN0ZXJWb2x1bWUiLCBtUHJpbWFyeURldmljZS0+c2V0TWFzdGVyVm9sdW1lKHZvbHVtZSkpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVByaW1hcnlEZXZpY2UtPmdldE1hc3RlclZvbHVtZSgKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgZmxvYXQgdikgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICp2b2x1bWUgPSB2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNYXN0ZXJWb2x1bWUiLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OnNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNb2RlIiwgbVByaW1hcnlEZXZpY2UtPnNldE1vZGUoQXVkaW9Nb2RlKG1vZGUpKSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OnNldE1pY011dGUoYm9vbCBzdGF0ZSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNaWNNdXRlIiwgbURldmljZS0+c2V0TWljTXV0ZShzdGF0ZSkpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0TWljTXV0ZSgKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgYm9vbCBtdXRlKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKnN0YXRlID0gbXV0ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TWljTXV0ZSIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWFzdGVyTXV0ZShib29sIHN0YXRlKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1hc3Rlck11dGUiLCBtRGV2aWNlLT5zZXRNYXN0ZXJNdXRlKHN0YXRlKSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRNYXN0ZXJNdXRlKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBib29sIG11dGUpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAqc3RhdGUgPSBtdXRlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNYXN0ZXJNdXRlIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gaGlkbFBhcmFtczsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJhbWV0ZXJzRnJvbUhhbChrdlBhaXJzLCAmaGlkbFBhcmFtcyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgICAvLyBUT0RPOiBjaGFuZ2UgdGhlIEFQSSBzbyB0aGF0IGNvbnRleHQgYW5kIGt2UGFpcnMgYXJlIHNlcGFyYXRlZAorICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRQYXJhbWV0ZXJzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsczo6c2V0UGFyYW1ldGVycyhtRGV2aWNlLCB7fSAvKiBjb250ZXh0ICovLCBoaWRsUGFyYW1zKSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7CisgICAgdmFsdWVzLT5jbGVhcigpOworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiBoaWRsS2V5czsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBrZXlzRnJvbUhhbChrZXlzLCAmaGlkbEtleXMpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gdXRpbHM6OmdldFBhcmFtZXRlcnMobURldmljZSwKKyAgICAgICAgICAgIHt9IC8qIGNvbnRleHQgKi8sCisgICAgICAgICAgICBoaWRsS2V5cywKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+JiBwYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyc1RvSGFsKHBhcmFtZXRlcnMsIHZhbHVlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFBhcmFtZXRlcnMiLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmdldElucHV0QnVmZmVyU2l6ZSgKKyAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLCBzaXplX3QgKnNpemUpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBBdWRpb0NvbmZpZyBoaWRsQ29uZmlnOworICAgIEhpZGxVdGlsczo6YXVkaW9Db25maWdGcm9tSGFsKCpjb25maWcsICZoaWRsQ29uZmlnKTsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRJbnB1dEJ1ZmZlclNpemUoCisgICAgICAgICAgICBoaWRsQ29uZmlnLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50NjRfdCBidWZmZXJTaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRJbnB1dEJ1ZmZlclNpemUiLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6Om9wZW5PdXRwdXRTdHJlYW0oCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZT4gKm91dFN0cmVhbSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIERldmljZUFkZHJlc3MgaGlkbERldmljZTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXZpY2VBZGRyZXNzRnJvbUhhbChkZXZpY2VzLCBhZGRyZXNzLCAmaGlkbERldmljZSk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgICBBdWRpb0NvbmZpZyBoaWRsQ29uZmlnOworICAgIEhpZGxVdGlsczo6YXVkaW9Db25maWdGcm9tSGFsKCpjb25maWcsICZoaWRsQ29uZmlnKTsKKyAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPm9wZW5PdXRwdXRTdHJlYW0oCisgICAgICAgICAgICBoYW5kbGUsCisgICAgICAgICAgICBoaWRsRGV2aWNlLAorICAgICAgICAgICAgaGlkbENvbmZpZywKKyAgICAgICAgICAgIG1rRW51bUNvbnZlcnRlcjxBdWRpb091dHB1dEZsYWc+KGZsYWdzKSwKKyAgICAgICAgICAgIHt9IC8qIG1ldGFkYXRhICovLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBzcDxJU3RyZWFtT3V0PiYgcmVzdWx0LCBjb25zdCBBdWRpb0NvbmZpZyYgc3VnZ2VzdGVkQ29uZmlnKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKm91dFN0cmVhbSA9IG5ldyBTdHJlYW1PdXRIYWxIaWRsKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEhpZGxVdGlsczo6YXVkaW9Db25maWdUb0hhbChzdWdnZXN0ZWRDb25maWcsIGNvbmZpZyk7CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigib3Blbk91dHB1dFN0cmVhbSIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6b3BlbklucHV0U3RyZWFtKAorICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAorICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIERldmljZUFkZHJlc3MgaGlkbERldmljZTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXZpY2VBZGRyZXNzRnJvbUhhbChkZXZpY2VzLCBhZGRyZXNzLCAmaGlkbERldmljZSk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgICBBdWRpb0NvbmZpZyBoaWRsQ29uZmlnOworICAgIEhpZGxVdGlsczo6YXVkaW9Db25maWdGcm9tSGFsKCpjb25maWcsICZoaWRsQ29uZmlnKTsKKyAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgLy8gVE9ETzogY29ycmVjdGx5IHByb3BhZ2F0ZSB0aGUgdHJhY2tzIHNvdXJjZXMgYW5kIHZvbHVtZQorICAgIC8vICAgICAgIGZvciBub3csIG9ubHkgc2VuZCB0aGUgbWFpbiBzb3VyY2UgYXQgMWRiZnMKKyAgICBTaW5rTWV0YWRhdGEgbWV0YWRhdGEgPSB7e3tBdWRpb1NvdXJjZShzb3VyY2UpLCAxfX19OworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5vcGVuSW5wdXRTdHJlYW0oCisgICAgICAgICAgICBoYW5kbGUsCisgICAgICAgICAgICBoaWRsRGV2aWNlLAorICAgICAgICAgICAgaGlkbENvbmZpZywKKyAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgbWV0YWRhdGEsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElTdHJlYW1Jbj4mIHJlc3VsdCwgY29uc3QgQXVkaW9Db25maWcmIHN1Z2dlc3RlZENvbmZpZykgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICppblN0cmVhbSA9IG5ldyBTdHJlYW1JbkhhbEhpZGwocmVzdWx0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ1RvSGFsKHN1Z2dlc3RlZENvbmZpZywgY29uZmlnKTsKKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJvcGVuSW5wdXRTdHJlYW0iLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OnN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcykgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdXBwb3J0c0F1ZGlvUGF0Y2hlcyIsIG1EZXZpY2UtPnN1cHBvcnRzQXVkaW9QYXRjaGVzKCksIHN1cHBvcnRzUGF0Y2hlcyk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmNyZWF0ZUF1ZGlvUGF0Y2goCisgICAgICAgIHVuc2lnbmVkIGludCBudW1fc291cmNlcywKKyAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VzLAorICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NpbmtzLAorICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtzLAorICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBoaWRsX3ZlYzxBdWRpb1BvcnRDb25maWc+IGhpZGxTb3VyY2VzLCBoaWRsU2lua3M7CisgICAgSGlkbFV0aWxzOjphdWRpb1BvcnRDb25maWdzRnJvbUhhbChudW1fc291cmNlcywgc291cmNlcywgJmhpZGxTb3VyY2VzKTsKKyAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydENvbmZpZ3NGcm9tSGFsKG51bV9zaW5rcywgc2lua3MsICZoaWRsU2lua3MpOworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goCisgICAgICAgICAgICBoaWRsU291cmNlcywgaGlkbFNpbmtzLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBBdWRpb1BhdGNoSGFuZGxlIGhpZGxQYXRjaCkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICpwYXRjaCA9IHN0YXRpY19jYXN0PGF1ZGlvX3BhdGNoX2hhbmRsZV90PihoaWRsUGF0Y2gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJjcmVhdGVBdWRpb1BhdGNoIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJyZWxlYXNlQXVkaW9QYXRjaCIsIG1EZXZpY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoKSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIEF1ZGlvUG9ydCBoaWRsUG9ydDsKKyAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydEZyb21IYWwoKnBvcnQsICZoaWRsUG9ydCk7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0QXVkaW9Qb3J0KAorICAgICAgICAgICAgaGlkbFBvcnQsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IEF1ZGlvUG9ydCYgcCkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0VG9IYWwocCwgcG9ydCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEF1ZGlvUG9ydCIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgQXVkaW9Qb3J0Q29uZmlnIGhpZGxDb25maWc7CisgICAgSGlkbFV0aWxzOjphdWRpb1BvcnRDb25maWdGcm9tSGFsKCpjb25maWcsICZoaWRsQ29uZmlnKTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0QXVkaW9Qb3J0Q29uZmlnIiwgbURldmljZS0+c2V0QXVkaW9Qb3J0Q29uZmlnKGhpZGxDb25maWcpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXNJbmZvKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0TWljcm9waG9uZXMoCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGhpZGxfdmVjPE1pY3JvcGhvbmVJbmZvPiBtaWNBcnJheUhhbCkgeworICAgICAgICByZXR2YWwgPSByOworICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IG1pY0FycmF5SGFsLnNpemUoKTsgaysrKSB7CisgICAgICAgICAgICBhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QgZHN0OworICAgICAgICAgICAgLy9jb252ZXJ0CisgICAgICAgICAgICBtaWNyb3Bob25lSW5mb1RvSGFsKG1pY0FycmF5SGFsW2tdLCAmZHN0KTsKKyAgICAgICAgICAgIG1lZGlhOjpNaWNyb3Bob25lSW5mbyBtaWNyb3Bob25lID0gbWVkaWE6Ok1pY3JvcGhvbmVJbmZvKGRzdCk7CisgICAgICAgICAgICBtaWNyb3Bob25lc0luZm8tPnB1c2hfYmFjayhtaWNyb3Bob25lKTsKKyAgICAgICAgfQorICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNaWNyb3Bob25lcyIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6ZHVtcChpbnQgZmQpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBuYXRpdmVfaGFuZGxlX3QqIGhpZGxIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKKyAgICBoaWRsSGFuZGxlLT5kYXRhWzBdID0gZmQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmRlYnVnKGhpZGxIYW5kbGUsIHt9IC8qIG9wdGlvbnMgKi8pOworICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhpZGxIYW5kbGUpOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJkdW1wIiwgcmV0KTsKK30KKworfSAvLyBuYW1lc3BhY2UgVjRfMAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VIYWxIaWRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJkMjE3NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VIYWxIaWRsLmgKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9ISURMXzRfMF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9ISURMXzRfMF9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC9JRGV2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby80LjAvSVByaW1hcnlEZXZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJRGV2aWNlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklQcmltYXJ5RGV2aWNlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgVjRfMCB7CisKK2NsYXNzIERldmljZUhhbEhpZGwgOiBwdWJsaWMgRGV2aWNlSGFsSW50ZXJmYWNlLCBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckhpZGwKK3sKKyAgcHVibGljOgorICAgIC8vIFNldHMgdGhlIHZhbHVlIG9mICdkZXZpY2VzJyB0byBhIGJpdG1hc2sgb2YgMSBvciBtb3JlIHZhbHVlcyBvZiBhdWRpb19kZXZpY2VzX3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdXBwb3J0ZWREZXZpY2VzKHVpbnQzMl90ICpkZXZpY2VzKTsKKworICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlIGhhcyBiZWVuIGluaXRpYWxpemVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCk7CisKKyAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBvZiBhIHZvaWNlIGNhbGwuIFJhbmdlIGlzIGJldHdlZW4gMC4wIGFuZCAxLjAuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpOworCisgICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgZm9yIGFsbCBhdWRpbyBhY3Rpdml0aWVzIG90aGVyIHRoYW4gdm9pY2UgY2FsbC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpOworCisgICAgLy8gR2V0IHRoZSBjdXJyZW50IG1hc3RlciB2b2x1bWUgdmFsdWUgZm9yIHRoZSBIQUwuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSk7CisKKyAgICAvLyBDYWxsZWQgd2hlbiB0aGUgYXVkaW8gbW9kZSBjaGFuZ2VzLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSk7CisKKyAgICAvLyBNdXRpbmcgY29udHJvbC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pY011dGUoYm9vbCBzdGF0ZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKTsKKworICAgIC8vIFNldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7CisKKyAgICAvLyBHZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7CisKKyAgICAvLyBSZXR1cm5zIGF1ZGlvIGlucHV0IGJ1ZmZlciBzaXplIGFjY29yZGluZyB0byBwYXJhbWV0ZXJzIHBhc3NlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0QnVmZmVyU2l6ZShjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgICAgICBzaXplX3QgKnNpemUpOworCisgICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIG91dHB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCisgICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuT3V0cHV0U3RyZWFtKAorICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pOworCisgICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKKyAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5JbnB1dFN0cmVhbSgKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAorICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gKmluU3RyZWFtKTsKKworICAgIC8vIFJldHVybnMgd2hldGhlciBjcmVhdGVBdWRpb1BhdGNoIGFuZCByZWxlYXNlQXVkaW9QYXRjaCBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0F1ZGlvUGF0Y2hlcyhib29sICpzdXBwb3J0c1BhdGNoZXMpOworCisgICAgLy8gQ3JlYXRlcyBhbiBhdWRpbyBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaCgKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fc291cmNlcywKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fc2lua3MsCisgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtzLAorICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKTsKKworICAgIC8vIFJlbGVhc2VzIGFuIGF1ZGlvIHBhdGNoLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpOworCisgICAgLy8gRmlsbHMgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCk7CisKKyAgICAvLyBTZXQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKworICAgIC8vIExpc3QgbWljcm9waG9uZXMKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOworCisgIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsSGlkbDsKKyAgICBzcDxJRGV2aWNlPiBtRGV2aWNlOworICAgIHNwPElQcmltYXJ5RGV2aWNlPiBtUHJpbWFyeURldmljZTsgIC8vIE51bGwgaWYgaXQncyBub3QgYSBwcmltYXJ5IGRldmljZS4KKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBleHBsaWNpdCBEZXZpY2VIYWxIaWRsKGNvbnN0IHNwPElEZXZpY2U+JiBkZXZpY2UpOworCisgICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIGRldmljZS4KKyAgICB2aXJ0dWFsIH5EZXZpY2VIYWxIaWRsKCk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBWNF8wCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfSElETF80XzBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZUhhbExvY2FsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VIYWxMb2NhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI0NWRkOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VIYWxMb2NhbC5jcHAKQEAgLTAsMCArMSwyMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkRldmljZUhhbExvY2FsIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgorI2luY2x1ZGUgIlN0cmVhbUhhbExvY2FsLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBWNF8wIHsKKworRGV2aWNlSGFsTG9jYWw6OkRldmljZUhhbExvY2FsKGF1ZGlvX2h3X2RldmljZV90ICpkZXYpCisgICAgICAgIDogbURldihkZXYpIHsKK30KKworRGV2aWNlSGFsTG9jYWw6On5EZXZpY2VIYWxMb2NhbCgpIHsKKyAgICBpbnQgc3RhdHVzID0gYXVkaW9faHdfZGV2aWNlX2Nsb3NlKG1EZXYpOworICAgIEFMT0dXX0lGKHN0YXR1cywgIkVycm9yIGNsb3NpbmcgYXVkaW8gaHcgZGV2aWNlICVwOiAlcyIsIG1EZXYsIHN0cmVycm9yKC1zdGF0dXMpKTsKKyAgICBtRGV2ID0gMDsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldFN1cHBvcnRlZERldmljZXModWludDMyX3QgKmRldmljZXMpIHsKKyAgICBpZiAobURldi0+Z2V0X3N1cHBvcnRlZF9kZXZpY2VzID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAqZGV2aWNlcyA9IG1EZXYtPmdldF9zdXBwb3J0ZWRfZGV2aWNlcyhtRGV2KTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjppbml0Q2hlY2soKSB7CisgICAgcmV0dXJuIG1EZXYtPmluaXRfY2hlY2sobURldik7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpIHsKKyAgICByZXR1cm4gbURldi0+c2V0X3ZvaWNlX3ZvbHVtZShtRGV2LCB2b2x1bWUpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSkgeworICAgIGlmIChtRGV2LT5zZXRfbWFzdGVyX3ZvbHVtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1EZXYtPnNldF9tYXN0ZXJfdm9sdW1lKG1EZXYsIHZvbHVtZSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSkgeworICAgIGlmIChtRGV2LT5nZXRfbWFzdGVyX3ZvbHVtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1EZXYtPmdldF9tYXN0ZXJfdm9sdW1lKG1EZXYsIHZvbHVtZSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKSB7CisgICAgcmV0dXJuIG1EZXYtPnNldF9tb2RlKG1EZXYsIG1vZGUpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TWljTXV0ZShib29sIHN0YXRlKSB7CisgICAgcmV0dXJuIG1EZXYtPnNldF9taWNfbXV0ZShtRGV2LCBzdGF0ZSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKSB7CisgICAgcmV0dXJuIG1EZXYtPmdldF9taWNfbXV0ZShtRGV2LCBzdGF0ZSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpIHsKKyAgICBpZiAobURldi0+c2V0X21hc3Rlcl9tdXRlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbURldi0+c2V0X21hc3Rlcl9tdXRlKG1EZXYsIHN0YXRlKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpIHsKKyAgICBpZiAobURldi0+Z2V0X21hc3Rlcl9tdXRlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbURldi0+Z2V0X21hc3Rlcl9tdXRlKG1EZXYsIHN0YXRlKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgeworICAgIHJldHVybiBtRGV2LT5zZXRfcGFyYW1ldGVycyhtRGV2LCBrdlBhaXJzLnN0cmluZygpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7CisgICAgY2hhciAqaGFsVmFsdWVzID0gbURldi0+Z2V0X3BhcmFtZXRlcnMobURldiwga2V5cy5zdHJpbmcoKSk7CisgICAgaWYgKGhhbFZhbHVlcyAhPSBOVUxMKSB7CisgICAgICAgIHZhbHVlcy0+c2V0VG8oaGFsVmFsdWVzKTsKKyAgICAgICAgZnJlZShoYWxWYWx1ZXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIHZhbHVlcy0+Y2xlYXIoKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0SW5wdXRCdWZmZXJTaXplKAorICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsIHNpemVfdCAqc2l6ZSkgeworICAgICpzaXplID0gbURldi0+Z2V0X2lucHV0X2J1ZmZlcl9zaXplKG1EZXYsIGNvbmZpZyk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6b3Blbk91dHB1dFN0cmVhbSgKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKKyAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKSB7CisgICAgYXVkaW9fc3RyZWFtX291dF90ICpoYWxTdHJlYW07CisgICAgQUxPR1YoIm9wZW5fb3V0cHV0X3N0cmVhbSBoYW5kbGU6ICVkIGRldmljZXM6ICV4IGZsYWdzOiAlI3giCisgICAgICAgICAgICAic3JhdGU6ICVkIGZvcm1hdCAlI3ggY2hhbm5lbHMgJXggYWRkcmVzcyAlcyIsCisgICAgICAgICAgICBoYW5kbGUsIGRldmljZXMsIGZsYWdzLAorICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAorICAgICAgICAgICAgYWRkcmVzcyk7CisgICAgaW50IG9wZW5SZXN1dCA9IG1EZXYtPm9wZW5fb3V0cHV0X3N0cmVhbSgKKyAgICAgICAgICAgIG1EZXYsIGhhbmRsZSwgZGV2aWNlcywgZmxhZ3MsIGNvbmZpZywgJmhhbFN0cmVhbSwgYWRkcmVzcyk7CisgICAgaWYgKG9wZW5SZXN1dCA9PSBPSykgeworICAgICAgICAqb3V0U3RyZWFtID0gbmV3IFN0cmVhbU91dEhhbExvY2FsKGhhbFN0cmVhbSwgdGhpcyk7CisgICAgfQorICAgIEFMT0dWKCJvcGVuX291dHB1dF9zdHJlYW0gc3RhdHVzICVkIHN0cmVhbSAlcCIsIG9wZW5SZXN1dCwgaGFsU3RyZWFtKTsKKyAgICByZXR1cm4gb3BlblJlc3V0OworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6b3BlbklucHV0U3RyZWFtKAorICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAorICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSkgeworICAgIGF1ZGlvX3N0cmVhbV9pbl90ICpoYWxTdHJlYW07CisgICAgQUxPR1YoIm9wZW5faW5wdXRfc3RyZWFtIGhhbmRsZTogJWQgZGV2aWNlczogJXggZmxhZ3M6ICUjeCAiCisgICAgICAgICAgICAic3JhdGU6ICVkIGZvcm1hdCAlI3ggY2hhbm5lbHMgJXggYWRkcmVzcyAlcyBzb3VyY2UgJWQiLAorICAgICAgICAgICAgaGFuZGxlLCBkZXZpY2VzLCBmbGFncywKKyAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywKKyAgICAgICAgICAgIGFkZHJlc3MsIHNvdXJjZSk7CisgICAgaW50IG9wZW5SZXN1bHQgPSBtRGV2LT5vcGVuX2lucHV0X3N0cmVhbSgKKyAgICAgICAgICAgIG1EZXYsIGhhbmRsZSwgZGV2aWNlcywgY29uZmlnLCAmaGFsU3RyZWFtLCBmbGFncywgYWRkcmVzcywgc291cmNlKTsKKyAgICBpZiAob3BlblJlc3VsdCA9PSBPSykgeworICAgICAgICAqaW5TdHJlYW0gPSBuZXcgU3RyZWFtSW5IYWxMb2NhbChoYWxTdHJlYW0sIHRoaXMpOworICAgIH0KKyAgICBBTE9HVigib3Blbl9pbnB1dF9zdHJlYW0gc3RhdHVzICVkIHN0cmVhbSAlcCIsIG9wZW5SZXN1bHQsIGluU3RyZWFtKTsKKyAgICByZXR1cm4gb3BlblJlc3VsdDsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcykgeworICAgICpzdXBwb3J0c1BhdGNoZXMgPSB2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMDsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpjcmVhdGVBdWRpb1BhdGNoKAorICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NvdXJjZXMsCisgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKKyAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKKyAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKKyAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKSB7CisgICAgaWYgKHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7CisgICAgICAgIHJldHVybiBtRGV2LT5jcmVhdGVfYXVkaW9fcGF0Y2goCisgICAgICAgICAgICAgICAgbURldiwgbnVtX3NvdXJjZXMsIHNvdXJjZXMsIG51bV9zaW5rcywgc2lua3MsIHBhdGNoKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpIHsKKyAgICBpZiAodmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKKyAgICAgICAgcmV0dXJuIG1EZXYtPnJlbGVhc2VfYXVkaW9fcGF0Y2gobURldiwgcGF0Y2gpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIHsKKyAgICByZXR1cm4gbURldi0+Z2V0X2F1ZGlvX3BvcnQobURldiwgcG9ydCk7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpIHsKKyAgICBpZiAodmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApCisgICAgICAgIHJldHVybiBtRGV2LT5zZXRfYXVkaW9fcG9ydF9jb25maWcobURldiwgY29uZmlnKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKSB7CisgICAgaWYgKG1EZXYtPmdldF9taWNyb3Bob25lcyA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgc2l6ZV90IGFjdHVhbF9taWNzID0gQVVESU9fTUlDUk9QSE9ORV9NQVhfQ09VTlQ7CisgICAgYXVkaW9fbWljcm9waG9uZV9jaGFyYWN0ZXJpc3RpY190IG1pY19hcnJheVtBVURJT19NSUNST1BIT05FX01BWF9DT1VOVF07CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbURldi0+Z2V0X21pY3JvcGhvbmVzKG1EZXYsICZtaWNfYXJyYXlbMF0sICZhY3R1YWxfbWljcyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhY3R1YWxfbWljczsgaSsrKSB7CisgICAgICAgIG1lZGlhOjpNaWNyb3Bob25lSW5mbyBtaWNyb3Bob25lSW5mbyA9IG1lZGlhOjpNaWNyb3Bob25lSW5mbyhtaWNfYXJyYXlbaV0pOworICAgICAgICBtaWNyb3Bob25lcy0+cHVzaF9iYWNrKG1pY3JvcGhvbmVJbmZvKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmR1bXAoaW50IGZkKSB7CisgICAgcmV0dXJuIG1EZXYtPmR1bXAobURldiwgZmQpOworfQorCit2b2lkIERldmljZUhhbExvY2FsOjpjbG9zZU91dHB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX291dCAqc3RyZWFtX291dCkgeworICAgIG1EZXYtPmNsb3NlX291dHB1dF9zdHJlYW0obURldiwgc3RyZWFtX291dCk7Cit9CisKK3ZvaWQgRGV2aWNlSGFsTG9jYWw6OmNsb3NlSW5wdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9pbiAqc3RyZWFtX2luKSB7CisgICAgbURldi0+Y2xvc2VfaW5wdXRfc3RyZWFtKG1EZXYsIHN0cmVhbV9pbik7Cit9CisKK30gLy8gbmFtZXNwYWNlIFY0XzAKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VIYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZUhhbExvY2FsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgzNDFhNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VIYWxMb2NhbC5oCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfTE9DQUxfNF8wX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0xPQ0FMXzRfMF9ICisKKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgVjRfMCB7CisKK2NsYXNzIERldmljZUhhbExvY2FsIDogcHVibGljIERldmljZUhhbEludGVyZmFjZQoreworICBwdWJsaWM6CisgICAgLy8gU2V0cyB0aGUgdmFsdWUgb2YgJ2RldmljZXMnIHRvIGEgYml0bWFzayBvZiAxIG9yIG1vcmUgdmFsdWVzIG9mIGF1ZGlvX2RldmljZXNfdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN1cHBvcnRlZERldmljZXModWludDMyX3QgKmRldmljZXMpOworCisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBhdWRpbyBoYXJkd2FyZSBpbnRlcmZhY2UgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKTsKKworICAgIC8vIFNldCB0aGUgYXVkaW8gdm9sdW1lIG9mIGEgdm9pY2UgY2FsbC4gUmFuZ2UgaXMgYmV0d2VlbiAwLjAgYW5kIDEuMC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSk7CisKKyAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBmb3IgYWxsIGF1ZGlvIGFjdGl2aXRpZXMgb3RoZXIgdGhhbiB2b2ljZSBjYWxsLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSk7CisKKyAgICAvLyBHZXQgdGhlIGN1cnJlbnQgbWFzdGVyIHZvbHVtZSB2YWx1ZSBmb3IgdGhlIEhBTC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKTsKKworICAgIC8vIENhbGxlZCB3aGVuIHRoZSBhdWRpbyBtb2RlIGNoYW5nZXMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKTsKKworICAgIC8vIE11dGluZyBjb250cm9sLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWljTXV0ZShib29sIHN0YXRlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pY011dGUoYm9vbCAqc3RhdGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyTXV0ZShib29sIHN0YXRlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpOworCisgICAgLy8gU2V0IGdsb2JhbCBhdWRpbyBwYXJhbWV0ZXJzLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKTsKKworICAgIC8vIEdldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKTsKKworICAgIC8vIFJldHVybnMgYXVkaW8gaW5wdXQgYnVmZmVyIHNpemUgYWNjb3JkaW5nIHRvIHBhcmFtZXRlcnMgcGFzc2VkLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXJTaXplKGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgIHNpemVfdCAqc2l6ZSk7CisKKyAgICAvLyBDcmVhdGVzIGFuZCBvcGVucyB0aGUgYXVkaW8gaGFyZHdhcmUgb3V0cHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKKyAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5PdXRwdXRTdHJlYW0oCisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKKyAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZT4gKm91dFN0cmVhbSk7CisKKyAgICAvLyBDcmVhdGVzIGFuZCBvcGVucyB0aGUgYXVkaW8gaGFyZHdhcmUgaW5wdXQgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIGNsb3NlZAorICAgIC8vIGJ5IHJlbGVhc2luZyBhbGwgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbklucHV0U3RyZWFtKAorICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pOworCisgICAgLy8gUmV0dXJucyB3aGV0aGVyIGNyZWF0ZUF1ZGlvUGF0Y2ggYW5kIHJlbGVhc2VBdWRpb1BhdGNoIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcyk7CisKKyAgICAvLyBDcmVhdGVzIGFuIGF1ZGlvIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKAorICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAorICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VzLAorICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCisgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpOworCisgICAgLy8gUmVsZWFzZXMgYW4gYXVkaW8gcGF0Y2guCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCk7CisKKyAgICAvLyBGaWxscyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KTsKKworICAgIC8vIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24uCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOworCisgICAgLy8gTGlzdCBtaWNyb3Bob25lcworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7CisKKyAgICB2b2lkIGNsb3NlT3V0cHV0U3RyZWFtKHN0cnVjdCBhdWRpb19zdHJlYW1fb3V0ICpzdHJlYW1fb3V0KTsKKyAgICB2b2lkIGNsb3NlSW5wdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9pbiAqc3RyZWFtX2luKTsKKworICBwcml2YXRlOgorICAgIGF1ZGlvX2h3X2RldmljZV90ICptRGV2OworCisgICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsTG9jYWw7CisKKyAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgZXhwbGljaXQgRGV2aWNlSGFsTG9jYWwoYXVkaW9faHdfZGV2aWNlX3QgKmRldik7CisKKyAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgZGV2aWNlLgorICAgIHZpcnR1YWwgfkRldmljZUhhbExvY2FsKCk7CisKKyAgICB1aW50MzJfdCB2ZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gbURldi0+Y29tbW9uLnZlcnNpb247IH0KK307CisKK30gLy8gbmFtZXNwYWNlIFY0XzAKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9MT0NBTF80XzBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODMxOTRlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBMT0dfVEFHICJEZXZpY2VzRmFjdG9yeUhhbEhpZGwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC9JRGV2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvaGlkbC9IYWxEZWF0aEhhbmRsZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCisjaW5jbHVkZSAiRGV2aWNlSGFsSGlkbC5oIgorI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsSGlkbC5oIgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SURldmljZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpSZXN1bHQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBWNF8wIHsKKworRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOjpEZXZpY2VzRmFjdG9yeUhhbEhpZGwoKSB7CisgICAgbURldmljZXNGYWN0b3J5ID0gSURldmljZXNGYWN0b3J5OjpnZXRTZXJ2aWNlKCk7CisgICAgaWYgKG1EZXZpY2VzRmFjdG9yeSAhPSAwKSB7CisgICAgICAgIC8vIEl0IGlzIGFzc3VtZWQgdGhhdCBEZXZpY2VzRmFjdG9yeSBpcyBvd25lZCBieSBBdWRpb0ZsaW5nZXIKKyAgICAgICAgLy8gYW5kIHRodXMgaGF2ZSB0aGUgc2FtZSBsaWZlc3Bhbi4KKyAgICAgICAgbURldmljZXNGYWN0b3J5LT5saW5rVG9EZWF0aChIYWxEZWF0aEhhbmRsZXI6OmdldEluc3RhbmNlKCksIDAgLypjb29raWUqLyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBvYnRhaW4gSURldmljZXNGYWN0b3J5IHNlcnZpY2UsIHRlcm1pbmF0aW5nIHByb2Nlc3MuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIC8vIFRoZSBNU0QgZmFjdG9yeSBpcyBvcHRpb25hbAorICAgIG1EZXZpY2VzRmFjdG9yeU1zZCA9IElEZXZpY2VzRmFjdG9yeTo6Z2V0U2VydmljZShBVURJT19IQUxfU0VSVklDRV9OQU1FX01TRCk7CisgICAgLy8gVE9ETzogUmVnaXN0ZXIgZGVhdGggaGFuZGxlciwgYW5kIGFkZCAncmVzdGFydCcgZGlyZWN0aXZlIHRvIGF1ZGlvc2VydmVyLnJjCit9CisKK0RldmljZXNGYWN0b3J5SGFsSGlkbDo6fkRldmljZXNGYWN0b3J5SGFsSGlkbCgpIHsKK30KKworc3RhdHVzX3QgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOjpvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSkgeworICAgIGlmIChtRGV2aWNlc0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlc0ZhY3RvcnktPm9wZW5EZXZpY2UoCisgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBzcDxJRGV2aWNlPiYgcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKmRldmljZSA9IG5ldyBEZXZpY2VIYWxIaWRsKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKHJldC5pc09rKCkpIHsKKyAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSByZXR1cm4gT0s7CisgICAgICAgIGVsc2UgaWYgKHJldHZhbCA9PSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTKSByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBlbHNlIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gRkFJTEVEX1RSQU5TQUNUSU9OOworfQorCit9IC8vIG5hbWVzcGFjZSBWNF8wCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE0ODg5YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuaApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSElETF80XzBfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSElETF80XzBfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby80LjAvSURldmljZXNGYWN0b3J5Lmg+CisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKKyNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJRGV2aWNlc0ZhY3Rvcnk7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBWNF8wIHsKKworY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsIDogcHVibGljIERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlCit7CisgIHB1YmxpYzoKKyAgICAvLyBPcGVucyBhIGRldmljZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gVG8gY2xvc2UgdGhlIGRldmljZSwgaXQgaXMKKyAgICAvLyBuZWNlc3NhcnkgdG8gcmVsZWFzZSByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSk7CisKKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ7CisKKyAgICBzcDxJRGV2aWNlc0ZhY3Rvcnk+IG1EZXZpY2VzRmFjdG9yeTsKKyAgICBzcDxJRGV2aWNlc0ZhY3Rvcnk+IG1EZXZpY2VzRmFjdG9yeU1zZDsKKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBEZXZpY2VzRmFjdG9yeUhhbEhpZGwoKTsKKworICAgIHZpcnR1YWwgfkRldmljZXNGYWN0b3J5SGFsSGlkbCgpOworfTsKKworfSAvLyBuYW1lc3BhY2UgVjRfMAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hJRExfNF8wX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZjFlYzdkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmNwcApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGxpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oPgorI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwuaCIKKyNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbEhpZGwuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIFY0XzAgeworCitEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDo6RGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoKQorICAgICAgICA6IG1Mb2NhbEZhY3RvcnkobmV3IERldmljZXNGYWN0b3J5SGFsTG9jYWwoKSksCisgICAgICAgICAgbUhpZGxGYWN0b3J5KG5ldyBEZXZpY2VzRmFjdG9yeUhhbEhpZGwoKSkgeworfQorCitEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDo6fkRldmljZXNGYWN0b3J5SGFsSHlicmlkKCkgeworfQorCitzdGF0dXNfdCBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDo6b3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpIHsKKyAgICBpZiAobUhpZGxGYWN0b3J5ICE9IDAgJiYgc3RyY21wKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9BMkRQLCBuYW1lKSAhPSAwICYmCisgICAgICAgIHN0cmNtcChBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfSEVBUklOR19BSUQsIG5hbWUpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG1IaWRsRmFjdG9yeS0+b3BlbkRldmljZShuYW1lLCBkZXZpY2UpOworICAgIH0KKyAgICByZXR1cm4gbUxvY2FsRmFjdG9yeS0+b3BlbkRldmljZShuYW1lLCBkZXZpY2UpOworfQorCit9IC8vIG5hbWVzcGFjZSBWNF8wCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU0ZWRkNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmNwcApAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJEZXZpY2VzRmFjdG9yeUhhbExvY2FsIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiRGV2aWNlSGFsTG9jYWwuaCIKKyNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBWNF8wIHsKKworc3RhdGljIHN0YXR1c190IGxvYWRfYXVkaW9faW50ZXJmYWNlKGNvbnN0IGNoYXIgKmlmX25hbWUsIGF1ZGlvX2h3X2RldmljZV90ICoqZGV2KQoreworICAgIGNvbnN0IGh3X21vZHVsZV90ICptb2Q7CisgICAgaW50IHJjOworCisgICAgcmMgPSBod19nZXRfbW9kdWxlX2J5X2NsYXNzKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRCwgaWZfbmFtZSwgJm1vZCk7CisgICAgaWYgKHJjKSB7CisgICAgICAgIEFMT0dFKCIlcyBjb3VsZG4ndCBsb2FkIGF1ZGlvIGh3IG1vZHVsZSAlcy4lcyAoJXMpIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lELCBpZl9uYW1lLCBzdHJlcnJvcigtcmMpKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIHJjID0gYXVkaW9faHdfZGV2aWNlX29wZW4obW9kLCBkZXYpOworICAgIGlmIChyYykgeworICAgICAgICBBTE9HRSgiJXMgY291bGRuJ3Qgb3BlbiBhdWRpbyBodyBkZXZpY2UgaW4gJXMuJXMgKCVzKSIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRCwgaWZfbmFtZSwgc3RyZXJyb3IoLXJjKSk7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICBpZiAoKCpkZXYpLT5jb21tb24udmVyc2lvbiA8IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl9NSU4pIHsKKyAgICAgICAgQUxPR0UoIiVzIHdyb25nIGF1ZGlvIGh3IGRldmljZSB2ZXJzaW9uICUwNHgiLCBfX2Z1bmNfXywgKCpkZXYpLT5jb21tb24udmVyc2lvbik7CisgICAgICAgIHJjID0gQkFEX1ZBTFVFOworICAgICAgICBhdWRpb19od19kZXZpY2VfY2xvc2UoKmRldik7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICByZXR1cm4gT0s7CisKK291dDoKKyAgICAqZGV2ID0gTlVMTDsKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXR1c190IERldmljZXNGYWN0b3J5SGFsTG9jYWw6Om9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKSB7CisgICAgYXVkaW9faHdfZGV2aWNlX3QgKmRldjsKKyAgICBzdGF0dXNfdCByYyA9IGxvYWRfYXVkaW9faW50ZXJmYWNlKG5hbWUsICZkZXYpOworICAgIGlmIChyYyA9PSBPSykgeworICAgICAgICAqZGV2aWNlID0gbmV3IERldmljZUhhbExvY2FsKGRldik7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworfSAvLyBuYW1lc3BhY2UgVjRfMAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMxYzUyMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0xPQ0FMXzRfMF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9MT0NBTF80XzBfSAorCisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKKyNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgVjRfMCB7CisKK2NsYXNzIERldmljZXNGYWN0b3J5SGFsTG9jYWwgOiBwdWJsaWMgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UKK3sKKyAgcHVibGljOgorICAgIC8vIE9wZW5zIGEgZGV2aWNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUbyBjbG9zZSB0aGUgZGV2aWNlLCBpdCBpcworICAgIC8vIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKTsKKworICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDsKKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBEZXZpY2VzRmFjdG9yeUhhbExvY2FsKCkge30KKworICAgIHZpcnR1YWwgfkRldmljZXNGYWN0b3J5SGFsTG9jYWwoKSB7fQorfTsKKworfSAvLyBuYW1lc3BhY2UgVjRfMAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0xPQ0FMXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU3Yzg5ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RCdWZmZXJIYWxIaWRsLmNwcApAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhdG9taWM+CisKKyNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0QnVmZmVySGFsSGlkbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9hbGxvY2F0b3IvMS4wL0lBbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxoaWRsbWVtb3J5L21hcHBpbmcuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCisjaW5jbHVkZSAiRWZmZWN0QnVmZmVySGFsSGlkbC5oIgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhpZGw6OmFsbG9jYXRvcjo6VjFfMDo6SUFsbG9jYXRvcjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIFY0XzAgeworCisvLyBzdGF0aWMKK3VpbnQ2NF90IEVmZmVjdEJ1ZmZlckhhbEhpZGw6Om1ha2VVbmlxdWVJZCgpIHsKKyAgICBzdGF0aWMgc3RkOjphdG9taWM8dWludDY0X3Q+IGNvdW50ZXJ7MX07CisgICAgcmV0dXJuIGNvdW50ZXIrKzsKK30KKworc3RhdHVzX3QgRWZmZWN0QnVmZmVySGFsSGlkbDo6YWxsb2NhdGUoCisgICAgICAgIHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIHsKKyAgICByZXR1cm4gbWlycm9yKG51bGxwdHIsIHNpemUsIGJ1ZmZlcik7Cit9CisKK3N0YXR1c190IEVmZmVjdEJ1ZmZlckhhbEhpZGw6Om1pcnJvcigKKyAgICAgICAgdm9pZCogZXh0ZXJuYWwsIHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIHsKKyAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+IHRlbXBCdWZmZXIgPSBuZXcgRWZmZWN0QnVmZmVySGFsSGlkbChzaXplKTsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxFZmZlY3RCdWZmZXJIYWxIaWRsKj4odGVtcEJ1ZmZlci5nZXQoKSktPmluaXQoKTsKKyAgICBpZiAocmVzdWx0ID09IE9LKSB7CisgICAgICAgIHRlbXBCdWZmZXItPnNldEV4dGVybmFsRGF0YShleHRlcm5hbCk7CisgICAgICAgICpidWZmZXIgPSB0ZW1wQnVmZmVyOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitFZmZlY3RCdWZmZXJIYWxIaWRsOjpFZmZlY3RCdWZmZXJIYWxIaWRsKHNpemVfdCBzaXplKQorICAgICAgICA6IG1CdWZmZXJTaXplKHNpemUpLCBtRnJhbWVDb3VudENoYW5nZWQoZmFsc2UpLAorICAgICAgICAgIG1FeHRlcm5hbERhdGEobnVsbHB0ciksIG1BdWRpb0J1ZmZlcnswLCB7bnVsbHB0cn19IHsKKyAgICBtSGlkbEJ1ZmZlci5pZCA9IG1ha2VVbmlxdWVJZCgpOworICAgIG1IaWRsQnVmZmVyLmZyYW1lQ291bnQgPSAwOworfQorCitFZmZlY3RCdWZmZXJIYWxIaWRsOjp+RWZmZWN0QnVmZmVySGFsSGlkbCgpIHsKK30KKworc3RhdHVzX3QgRWZmZWN0QnVmZmVySGFsSGlkbDo6aW5pdCgpIHsKKyAgICBzcDxJQWxsb2NhdG9yPiBhc2htZW0gPSBJQWxsb2NhdG9yOjpnZXRTZXJ2aWNlKCJhc2htZW0iKTsKKyAgICBpZiAoYXNobWVtID09IDApIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZXRyaWV2ZSBhc2htZW0gYWxsb2NhdG9yIHNlcnZpY2UiKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHN0YXR1c190IHJldHZhbCA9IE5PX01FTU9SWTsKKyAgICBSZXR1cm48dm9pZD4gcmVzdWx0ID0gYXNobWVtLT5hbGxvY2F0ZSgKKyAgICAgICAgICAgIG1CdWZmZXJTaXplLAorICAgICAgICAgICAgWyZdKGJvb2wgc3VjY2VzcywgY29uc3QgaGlkbF9tZW1vcnkmIG1lbW9yeSkgeworICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgICAgIG1IaWRsQnVmZmVyLmRhdGEgPSBtZW1vcnk7CisgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IE9LOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmIChyZXN1bHQuaXNPaygpICYmIHJldHZhbCA9PSBPSykgeworICAgICAgICBtTWVtb3J5ID0gaGFyZHdhcmU6Om1hcE1lbW9yeShtSGlkbEJ1ZmZlci5kYXRhKTsKKyAgICAgICAgaWYgKG1NZW1vcnkgIT0gMCkgeworICAgICAgICAgICAgbU1lbW9yeS0+dXBkYXRlKCk7CisgICAgICAgICAgICBtQXVkaW9CdWZmZXIucmF3ID0gc3RhdGljX2Nhc3Q8dm9pZCo+KG1NZW1vcnktPmdldFBvaW50ZXIoKSk7CisgICAgICAgICAgICBtZW1zZXQobUF1ZGlvQnVmZmVyLnJhdywgMCwgbU1lbW9yeS0+Z2V0U2l6ZSgpKTsKKyAgICAgICAgICAgIG1NZW1vcnktPmNvbW1pdCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBtYXAgYWxsb2NhdGVkIGFzaG1lbSIpOworICAgICAgICAgICAgcmV0dmFsID0gTk9fTUVNT1JZOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBhbGxvY2F0ZSAlZCBieXRlcyBmcm9tIGFzaG1lbSIsIChpbnQpbUJ1ZmZlclNpemUpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0LmlzT2soKSA/IHJldHZhbCA6IEZBSUxFRF9UUkFOU0FDVElPTjsKK30KKworYXVkaW9fYnVmZmVyX3QqIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmF1ZGlvQnVmZmVyKCkgeworICAgIHJldHVybiAmbUF1ZGlvQnVmZmVyOworfQorCit2b2lkKiBFZmZlY3RCdWZmZXJIYWxIaWRsOjpleHRlcm5hbERhdGEoKSBjb25zdCB7CisgICAgcmV0dXJuIG1FeHRlcm5hbERhdGE7Cit9CisKK3ZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6c2V0RnJhbWVDb3VudChzaXplX3QgZnJhbWVDb3VudCkgeworICAgIG1IaWRsQnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZUNvdW50OworICAgIG1BdWRpb0J1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKKyAgICBtRnJhbWVDb3VudENoYW5nZWQgPSB0cnVlOworfQorCitib29sIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmNoZWNrRnJhbWVDb3VudENoYW5nZSgpIHsKKyAgICBib29sIHJlc3VsdCA9IG1GcmFtZUNvdW50Q2hhbmdlZDsKKyAgICBtRnJhbWVDb3VudENoYW5nZWQgPSBmYWxzZTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OnNldEV4dGVybmFsRGF0YSh2b2lkKiBleHRlcm5hbCkgeworICAgIG1FeHRlcm5hbERhdGEgPSBleHRlcm5hbDsKK30KKwordm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjp1cGRhdGUoKSB7CisgICAgdXBkYXRlKG1CdWZmZXJTaXplKTsKK30KKwordm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpjb21taXQoKSB7CisgICAgY29tbWl0KG1CdWZmZXJTaXplKTsKK30KKwordm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjp1cGRhdGUoc2l6ZV90IHNpemUpIHsKKyAgICBpZiAobUV4dGVybmFsRGF0YSA9PSBudWxscHRyKSByZXR1cm47CisgICAgbU1lbW9yeS0+dXBkYXRlKCk7CisgICAgaWYgKHNpemUgPiBtQnVmZmVyU2l6ZSkgc2l6ZSA9IG1CdWZmZXJTaXplOworICAgIG1lbWNweShtQXVkaW9CdWZmZXIucmF3LCBtRXh0ZXJuYWxEYXRhLCBzaXplKTsKKyAgICBtTWVtb3J5LT5jb21taXQoKTsKK30KKwordm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpjb21taXQoc2l6ZV90IHNpemUpIHsKKyAgICBpZiAobUV4dGVybmFsRGF0YSA9PSBudWxscHRyKSByZXR1cm47CisgICAgaWYgKHNpemUgPiBtQnVmZmVyU2l6ZSkgc2l6ZSA9IG1CdWZmZXJTaXplOworICAgIG1lbWNweShtRXh0ZXJuYWxEYXRhLCBtQXVkaW9CdWZmZXIucmF3LCBzaXplKTsKK30KKworfSAvLyBuYW1lc3BhY2UgVjRfMAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdEJ1ZmZlckhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RCdWZmZXJIYWxIaWRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ1NzhjNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RCdWZmZXJIYWxIaWRsLmgKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfQlVGRkVSX0hBTF9ISURMXzRfMF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0JVRkZFUl9IQUxfSElETF80XzBfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvNC4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oaWRsL21lbW9yeS8xLjAvSU1lbW9yeS5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0Lmg+CisKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpBdWRpb0J1ZmZlcjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKK3VzaW5nIGFuZHJvaWQ6OmhpZGw6Om1lbW9yeTo6VjFfMDo6SU1lbW9yeTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIFY0XzAgeworCitjbGFzcyBFZmZlY3RCdWZmZXJIYWxIaWRsIDogcHVibGljIEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZQoreworICBwdWJsaWM6CisgICAgc3RhdGljIHN0YXR1c190IGFsbG9jYXRlKHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpOworICAgIHN0YXRpYyBzdGF0dXNfdCBtaXJyb3Iodm9pZCogZXh0ZXJuYWwsIHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpOworCisgICAgdmlydHVhbCBhdWRpb19idWZmZXJfdCogYXVkaW9CdWZmZXIoKTsKKyAgICB2aXJ0dWFsIHZvaWQqIGV4dGVybmFsRGF0YSgpIGNvbnN0OworCisgICAgdmlydHVhbCBzaXplX3QgZ2V0U2l6ZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1CdWZmZXJTaXplOyB9CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0RXh0ZXJuYWxEYXRhKHZvaWQqIGV4dGVybmFsKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0RnJhbWVDb3VudChzaXplX3QgZnJhbWVDb3VudCk7CisgICAgdmlydHVhbCBib29sIGNoZWNrRnJhbWVDb3VudENoYW5nZSgpOworCisgICAgdmlydHVhbCB2b2lkIHVwZGF0ZSgpOworICAgIHZpcnR1YWwgdm9pZCBjb21taXQoKTsKKyAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlKHNpemVfdCBzaXplKTsKKyAgICB2aXJ0dWFsIHZvaWQgY29tbWl0KHNpemVfdCBzaXplKTsKKworICAgIGNvbnN0IEF1ZGlvQnVmZmVyJiBoaWRsQnVmZmVyKCkgY29uc3QgeyByZXR1cm4gbUhpZGxCdWZmZXI7IH0KKworICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U7CisKKyAgICBzdGF0aWMgdWludDY0X3QgbWFrZVVuaXF1ZUlkKCk7CisKKyAgICBjb25zdCBzaXplX3QgbUJ1ZmZlclNpemU7CisgICAgYm9vbCBtRnJhbWVDb3VudENoYW5nZWQ7CisgICAgdm9pZCogbUV4dGVybmFsRGF0YTsKKyAgICBBdWRpb0J1ZmZlciBtSGlkbEJ1ZmZlcjsKKyAgICBzcDxJTWVtb3J5PiBtTWVtb3J5OworICAgIGF1ZGlvX2J1ZmZlcl90IG1BdWRpb0J1ZmZlcjsKKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBleHBsaWNpdCBFZmZlY3RCdWZmZXJIYWxIaWRsKHNpemVfdCBzaXplKTsKKworICAgIHZpcnR1YWwgfkVmZmVjdEJ1ZmZlckhhbEhpZGwoKTsKKworICAgIHN0YXR1c190IGluaXQoKTsKK307CisKK30gLy8gbmFtZXNwYWNlIFY0XzAKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0JVRkZFUl9IQUxfSElETF80XzBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdEhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdEhhbEhpZGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5OWM0YzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0SGFsSGlkbC5jcHAKQEAgLTAsMCArMSwzNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkVmZmVjdEhhbEhpZGwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxjb21tb24vYWxsLXZlcnNpb25zL1ZlcnNpb25VdGlscy5oPgorI2luY2x1ZGUgPGh3YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8bWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCisjaW5jbHVkZSAiRWZmZWN0QnVmZmVySGFsSGlkbC5oIgorI2luY2x1ZGUgIkVmZmVjdEhhbEhpZGwuaCIKKyNpbmNsdWRlICJIaWRsVXRpbHMuaCIKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6QXVkaW9CdWZmZXI7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpFZmZlY3RCdWZmZXJBY2Nlc3M7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpFZmZlY3RDb25maWdQYXJhbWV0ZXJzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6TWVzc2FnZVF1ZXVlRmxhZ0JpdHM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpSZXN1bHQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpIaWRsVXRpbHM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb0NoYW5uZWxNYXNrOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9Gb3JtYXQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjp1dGlsczo6bWtFbnVtQ29udmVydGVyOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgVjRfMCB7CisKK0VmZmVjdEhhbEhpZGw6OkVmZmVjdEhhbEhpZGwoY29uc3Qgc3A8SUVmZmVjdD4mIGVmZmVjdCwgdWludDY0X3QgZWZmZWN0SWQpCisgICAgICAgIDogbUVmZmVjdChlZmZlY3QpLCBtRWZmZWN0SWQoZWZmZWN0SWQpLCBtQnVmZmVyc0NoYW5nZWQodHJ1ZSksIG1FZkdyb3VwKG51bGxwdHIpIHsKK30KKworRWZmZWN0SGFsSGlkbDo6fkVmZmVjdEhhbEhpZGwoKSB7CisgICAgaWYgKG1FZmZlY3QgIT0gMCkgeworICAgICAgICBjbG9zZSgpOworICAgICAgICBtRWZmZWN0LmNsZWFyKCk7CisgICAgICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CisgICAgfQorICAgIGlmIChtRWZHcm91cCkgeworICAgICAgICBFdmVudEZsYWc6OmRlbGV0ZUV2ZW50RmxhZygmbUVmR3JvdXApOworICAgIH0KK30KKworLy8gc3RhdGljCit2b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdERlc2NyaXB0b3JUb0hhbCgKKyAgICAgICAgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgZGVzY3JpcHRvciwgZWZmZWN0X2Rlc2NyaXB0b3JfdCogaGFsRGVzY3JpcHRvcikgeworICAgIEhpZGxVdGlsczo6dXVpZFRvSGFsKGRlc2NyaXB0b3IudHlwZSwgJmhhbERlc2NyaXB0b3ItPnR5cGUpOworICAgIEhpZGxVdGlsczo6dXVpZFRvSGFsKGRlc2NyaXB0b3IudXVpZCwgJmhhbERlc2NyaXB0b3ItPnV1aWQpOworICAgIGhhbERlc2NyaXB0b3ItPmZsYWdzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGRlc2NyaXB0b3IuZmxhZ3MpOworICAgIGhhbERlc2NyaXB0b3ItPmNwdUxvYWQgPSBkZXNjcmlwdG9yLmNwdUxvYWQ7CisgICAgaGFsRGVzY3JpcHRvci0+bWVtb3J5VXNhZ2UgPSBkZXNjcmlwdG9yLm1lbW9yeVVzYWdlOworICAgIG1lbWNweShoYWxEZXNjcmlwdG9yLT5uYW1lLCBkZXNjcmlwdG9yLm5hbWUuZGF0YSgpLCBkZXNjcmlwdG9yLm5hbWUuc2l6ZSgpKTsKKyAgICBtZW1jcHkoaGFsRGVzY3JpcHRvci0+aW1wbGVtZW50b3IsCisgICAgICAgICAgICBkZXNjcmlwdG9yLmltcGxlbWVudG9yLmRhdGEoKSwgZGVzY3JpcHRvci5pbXBsZW1lbnRvci5zaXplKCkpOworfQorCisvLyBUT0RPKG1uYWdhbm92KTogVGhlc2UgYnVmZmVyIGNvbnZlcnNpb24gZnVuY3Rpb25zIHNob3VsZCBiZSBzaGFyZWQgd2l0aCBFZmZlY3Qgd3JhcHBlcgorLy8gdmlhIEhpZGxVdGlscy4gTW92ZSB0aGVtIHRoZXJlIHdoZW4gaGFyZHdhcmUvaW50ZXJmYWNlcyB3aWxsIGdldCB1bi1mcm96ZW4gYWdhaW4uCisKKy8vIHN0YXRpYwordm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKAorICAgICAgICBjb25zdCBidWZmZXJfY29uZmlnX3QmIGhhbENvbmZpZywgRWZmZWN0QnVmZmVyQ29uZmlnKiBjb25maWcpIHsKKyAgICBjb25maWctPnNhbXBsaW5nUmF0ZUh6ID0gaGFsQ29uZmlnLnNhbXBsaW5nUmF0ZTsKKyAgICBjb25maWctPmNoYW5uZWxzID0gbWtFbnVtQ29udmVydGVyPEF1ZGlvQ2hhbm5lbE1hc2s+KGhhbENvbmZpZy5jaGFubmVscyk7CisgICAgY29uZmlnLT5mb3JtYXQgPSBBdWRpb0Zvcm1hdChoYWxDb25maWcuZm9ybWF0KTsKKyAgICBjb25maWctPmFjY2Vzc01vZGUgPSBFZmZlY3RCdWZmZXJBY2Nlc3MoaGFsQ29uZmlnLmFjY2Vzc01vZGUpOworICAgIGNvbmZpZy0+bWFzayA9IG1rRW51bUNvbnZlcnRlcjxFZmZlY3RDb25maWdQYXJhbWV0ZXJzPihoYWxDb25maWcubWFzayk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RCdWZmZXJDb25maWdUb0hhbCgKKyAgICAgICAgY29uc3QgRWZmZWN0QnVmZmVyQ29uZmlnJiBjb25maWcsIGJ1ZmZlcl9jb25maWdfdCogaGFsQ29uZmlnKSB7CisgICAgaGFsQ29uZmlnLT5idWZmZXIuZnJhbWVDb3VudCA9IDA7CisgICAgaGFsQ29uZmlnLT5idWZmZXIucmF3ID0gTlVMTDsKKyAgICBoYWxDb25maWctPnNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGluZ1JhdGVIejsKKyAgICBoYWxDb25maWctPmNoYW5uZWxzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGNvbmZpZy5jaGFubmVscyk7CisgICAgaGFsQ29uZmlnLT5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOworICAgIGhhbENvbmZpZy0+YnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKKyAgICBoYWxDb25maWctPmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOworICAgIGhhbENvbmZpZy0+Zm9ybWF0ID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29uZmlnLmZvcm1hdCk7CisgICAgaGFsQ29uZmlnLT5hY2Nlc3NNb2RlID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29uZmlnLmFjY2Vzc01vZGUpOworICAgIGhhbENvbmZpZy0+bWFzayA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbmZpZy5tYXNrKTsKK30KKworLy8gc3RhdGljCit2b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdENvbmZpZ0Zyb21IYWwoY29uc3QgZWZmZWN0X2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdENvbmZpZyogY29uZmlnKSB7CisgICAgZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbChoYWxDb25maWcuaW5wdXRDZmcsICZjb25maWctPmlucHV0Q2ZnKTsKKyAgICBlZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKGhhbENvbmZpZy5vdXRwdXRDZmcsICZjb25maWctPm91dHB1dENmZyk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RDb25maWdUb0hhbChjb25zdCBFZmZlY3RDb25maWcmIGNvbmZpZywgZWZmZWN0X2NvbmZpZ190KiBoYWxDb25maWcpIHsKKyAgICBlZmZlY3RCdWZmZXJDb25maWdUb0hhbChjb25maWcuaW5wdXRDZmcsICZoYWxDb25maWctPmlucHV0Q2ZnKTsKKyAgICBlZmZlY3RCdWZmZXJDb25maWdUb0hhbChjb25maWcub3V0cHV0Q2ZnLCAmaGFsQ29uZmlnLT5vdXRwdXRDZmcpOworfQorCisvLyBzdGF0aWMKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OmFuYWx5emVSZXN1bHQoY29uc3QgUmVzdWx0JiByZXN1bHQpIHsKKyAgICBzd2l0Y2ggKHJlc3VsdCkgeworICAgICAgICBjYXNlIFJlc3VsdDo6T0s6IHJldHVybiBPSzsKKyAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTOiByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9TVEFURTogcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKKyAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDogcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfU1VQUE9SVEVEOiByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIGNhc2UgUmVzdWx0OjpSRVNVTFRfVE9PX0JJRzogcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpzZXRJbkJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpIHsKKyAgICBpZiAoIW1CdWZmZXJzQ2hhbmdlZCkgeworICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IG51bGxwdHIgfHwgbUluQnVmZmVyLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGJ1ZmZlci5nZXQoKSAhPSBtSW5CdWZmZXIuZ2V0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXItPmF1ZGlvQnVmZmVyKCkgIT0gbUluQnVmZmVyLT5hdWRpb0J1ZmZlcigpOworICAgICAgICB9CisgICAgfQorICAgIG1JbkJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldE91dEJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpIHsKKyAgICBpZiAoIW1CdWZmZXJzQ2hhbmdlZCkgeworICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IG51bGxwdHIgfHwgbU91dEJ1ZmZlci5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXIuZ2V0KCkgIT0gbU91dEJ1ZmZlci5nZXQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGJ1ZmZlci0+YXVkaW9CdWZmZXIoKSAhPSBtT3V0QnVmZmVyLT5hdWRpb0J1ZmZlcigpOworICAgICAgICB9CisgICAgfQorICAgIG1PdXRCdWZmZXIgPSBidWZmZXI7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzKCkgeworICAgIHJldHVybiBwcm9jZXNzSW1wbChzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6OlJFUVVFU1RfUFJPQ0VTUykpOworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzUmV2ZXJzZSgpIHsKKyAgICByZXR1cm4gcHJvY2Vzc0ltcGwoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpSRVFVRVNUX1BST0NFU1NfUkVWRVJTRSkpOworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcmVwYXJlRm9yUHJvY2Vzc2luZygpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IHRlbXBTdGF0dXNNUTsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0LT5wcmVwYXJlRm9yUHJvY2Vzc2luZygKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgTVFEZXNjcmlwdG9yU3luYzxSZXN1bHQ+JiBzdGF0dXNNUSkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIHRlbXBTdGF0dXNNUS5yZXNldChuZXcgU3RhdHVzTVEoc3RhdHVzTVEpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpICYmIHRlbXBTdGF0dXNNUS0+Z2V0RXZlbnRGbGFnV29yZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBFdmVudEZsYWc6OmNyZWF0ZUV2ZW50RmxhZyh0ZW1wU3RhdHVzTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSwgJm1FZkdyb3VwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmICghcmV0LmlzT2soKSB8fCByZXR2YWwgIT0gUmVzdWx0OjpPSykgeworICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0dmFsKSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICB9CisgICAgaWYgKCF0ZW1wU3RhdHVzTVEgfHwgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpIHx8ICFtRWZHcm91cCkgeworICAgICAgICBBTE9HRV9JRighdGVtcFN0YXR1c01RLCAiRmFpbGVkIHRvIG9idGFpbiBzdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgZWZmZWN0cyIpOworICAgICAgICBBTE9HRV9JRih0ZW1wU3RhdHVzTVEgJiYgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpLAorICAgICAgICAgICAgICAgICJTdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgZWZmZWN0cyBpcyBpbnZhbGlkIik7CisgICAgICAgIEFMT0dFX0lGKCFtRWZHcm91cCwgIkV2ZW50IGZsYWcgY3JlYXRpb24gZm9yIGVmZmVjdHMgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBtU3RhdHVzTVEgPSBzdGQ6Om1vdmUodGVtcFN0YXR1c01RKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgRWZmZWN0SGFsSGlkbDo6bmVlZFRvUmVzZXRCdWZmZXJzKCkgeworICAgIGlmIChtQnVmZmVyc0NoYW5nZWQpIHJldHVybiB0cnVlOworICAgIGJvb2wgaW5CdWZmZXJGcmFtZUNvdW50VXBkYXRlZCA9IG1JbkJ1ZmZlci0+Y2hlY2tGcmFtZUNvdW50Q2hhbmdlKCk7CisgICAgYm9vbCBvdXRCdWZmZXJGcmFtZUNvdW50VXBkYXRlZCA9IG1PdXRCdWZmZXItPmNoZWNrRnJhbWVDb3VudENoYW5nZSgpOworICAgIHJldHVybiBpbkJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkIHx8IG91dEJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkOworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzSW1wbCh1aW50MzJfdCBtcUZsYWcpIHsKKyAgICBpZiAobUVmZmVjdCA9PSAwIHx8IG1JbkJ1ZmZlciA9PSAwIHx8IG1PdXRCdWZmZXIgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIGlmICghbVN0YXR1c01RICYmIChzdGF0dXMgPSBwcmVwYXJlRm9yUHJvY2Vzc2luZygpKSAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBpZiAobmVlZFRvUmVzZXRCdWZmZXJzKCkgJiYgKHN0YXR1cyA9IHNldFByb2Nlc3NCdWZmZXJzKCkpICE9IE9LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIC8vIFRoZSBkYXRhIGlzIGFscmVhZHkgaW4gdGhlIGJ1ZmZlcnMsIGp1c3QgbmVlZCB0byBmbHVzaCBpdCBhbmQgd2FrZSB1cCB0aGUgc2VydmVyIHNpZGUuCisgICAgc3RkOjphdG9taWNfdGhyZWFkX2ZlbmNlKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGVhc2UpOworICAgIG1FZkdyb3VwLT53YWtlKG1xRmxhZyk7CisgICAgdWludDMyX3QgZWZTdGF0ZSA9IDA7CityZXRyeToKKyAgICBzdGF0dXNfdCByZXQgPSBtRWZHcm91cC0+d2FpdCgKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6RE9ORV9QUk9DRVNTSU5HKSwgJmVmU3RhdGUpOworICAgIGlmIChlZlN0YXRlICYgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpET05FX1BST0NFU1NJTkcpKSB7CisgICAgICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyAgICAgICAgbVN0YXR1c01RLT5yZWFkKCZyZXR2YWwpOworICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0sgfHwgcmV0dmFsID09IFJlc3VsdDo6SU5WQUxJRF9TVEFURSkgeworICAgICAgICAgICAgLy8gU3luYyBiYWNrIHRoZSBjaGFuZ2VkIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIuCisgICAgICAgICAgICBzdGQ6OmF0b21pY190aHJlYWRfZmVuY2Uoc3RkOjptZW1vcnlfb3JkZXJfYWNxdWlyZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuYWx5emVSZXN1bHQocmV0dmFsKTsKKyAgICB9CisgICAgaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRUlOVFIpIHsKKyAgICAgICAgLy8gU3B1cmlvdXMgd2FrZXVwLiBUaGlzIG5vcm1hbGx5IHJldHJpZXMgbm8gbW9yZSB0aGFuIG9uY2UuCisgICAgICAgIGdvdG8gcmV0cnk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldFByb2Nlc3NCdWZmZXJzKCkgeworICAgIFJldHVybjxSZXN1bHQ+IHJldCA9IG1FZmZlY3QtPnNldFByb2Nlc3NCdWZmZXJzKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0QnVmZmVySGFsSGlkbCo+KG1JbkJ1ZmZlci5nZXQoKSktPmhpZGxCdWZmZXIoKSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEJ1ZmZlckhhbEhpZGwqPihtT3V0QnVmZmVyLmdldCgpKS0+aGlkbEJ1ZmZlcigpKTsKKyAgICBpZiAocmV0LmlzT2soKSAmJiByZXQgPT0gUmVzdWx0OjpPSykgeworICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0KSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Y29tbWFuZCh1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLCB2b2lkICpwQ21kRGF0YSwKKyAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSkgeworICAgIGlmIChtRWZmZWN0ID09IDApIHJldHVybiBOT19JTklUOworCisgICAgLy8gU3BlY2lhbCBjYXNlcy4KKyAgICBpZiAoY21kQ29kZSA9PSBFRkZFQ1RfQ01EX1NFVF9DT05GSUcgfHwgY21kQ29kZSA9PSBFRkZFQ1RfQ01EX1NFVF9DT05GSUdfUkVWRVJTRSkgeworICAgICAgICByZXR1cm4gc2V0Q29uZmlnSW1wbChjbWRDb2RlLCBjbWRTaXplLCBwQ21kRGF0YSwgcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKKyAgICB9IGVsc2UgaWYgKGNtZENvZGUgPT0gRUZGRUNUX0NNRF9HRVRfQ09ORklHIHx8IGNtZENvZGUgPT0gRUZGRUNUX0NNRF9HRVRfQ09ORklHX1JFVkVSU0UpIHsKKyAgICAgICAgcmV0dXJuIGdldENvbmZpZ0ltcGwoY21kQ29kZSwgcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKKyAgICB9CisKKyAgICAvLyBDb21tb24gY2FzZS4KKyAgICBoaWRsX3ZlYzx1aW50OF90PiBoaWRsRGF0YTsKKyAgICBpZiAocENtZERhdGEgIT0gbnVsbHB0ciAmJiBjbWRTaXplID4gMCkgeworICAgICAgICBoaWRsRGF0YS5zZXRUb0V4dGVybmFsKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHBDbWREYXRhKSwgY21kU2l6ZSk7CisgICAgfQorICAgIHN0YXR1c190IHN0YXR1czsKKyAgICB1aW50MzJfdCByZXBseVNpemVTdHViID0gMDsKKyAgICBpZiAocmVwbHlTaXplID09IG51bGxwdHIgfHwgcFJlcGx5RGF0YSA9PSBudWxscHRyKSByZXBseVNpemUgPSAmcmVwbHlTaXplU3R1YjsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdC0+Y29tbWFuZChjbWRDb2RlLCBoaWRsRGF0YSwgKnJlcGx5U2l6ZSwKKyAgICAgICAgICAgIFsmXShpbnQzMl90IHMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKnJlcGx5U2l6ZSA+IHJlc3VsdC5zaXplKCkpICpyZXBseVNpemUgPSByZXN1bHQuc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAocFJlcGx5RGF0YSAhPSBudWxscHRyICYmICpyZXBseVNpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkocFJlcGx5RGF0YSwgJnJlc3VsdFswXSwgKnJlcGx5U2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcmV0LmlzT2soKSA/IHN0YXR1cyA6IEZBSUxFRF9UUkFOU0FDVElPTjsKK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Z2V0RGVzY3JpcHRvcihlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgeworICAgIGlmIChtRWZmZWN0ID09IDApIHJldHVybiBOT19JTklUOworICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdC0+Z2V0RGVzY3JpcHRvcigKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgZWZmZWN0RGVzY3JpcHRvclRvSGFsKHJlc3VsdCwgcERlc2NyaXB0b3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXR2YWwpIDogRkFJTEVEX1RSQU5TQUNUSU9OOworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpjbG9zZSgpIHsKKyAgICBpZiAobUVmZmVjdCA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXR1cm48UmVzdWx0PiByZXQgPSBtRWZmZWN0LT5jbG9zZSgpOworICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXQpIDogRkFJTEVEX1RSQU5TQUNUSU9OOworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpnZXRDb25maWdJbXBsKAorICAgICAgICB1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7CisgICAgaWYgKHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkgfHwgcFJlcGx5RGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHN0YXR1c190IHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICBSZXR1cm48dm9pZD4gcmV0OworICAgIGlmIChjbWRDb2RlID09IEVGRkVDVF9DTURfR0VUX0NPTkZJRykgeworICAgICAgICByZXQgPSBtRWZmZWN0LT5nZXRDb25maWcoWyZdIChSZXN1bHQgciwgY29uc3QgRWZmZWN0Q29uZmlnICZoaWRsQ29uZmlnKSB7CisgICAgICAgICAgICByZXN1bHQgPSBhbmFseXplUmVzdWx0KHIpOworICAgICAgICAgICAgaWYgKHIgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgIGVmZmVjdENvbmZpZ1RvSGFsKGhpZGxDb25maWcsIHN0YXRpY19jYXN0PGVmZmVjdF9jb25maWdfdCo+KHBSZXBseURhdGEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gbUVmZmVjdC0+Z2V0Q29uZmlnUmV2ZXJzZShbJl0gKFJlc3VsdCByLCBjb25zdCBFZmZlY3RDb25maWcgJmhpZGxDb25maWcpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGFuYWx5emVSZXN1bHQocik7CisgICAgICAgICAgICBpZiAociA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgZWZmZWN0Q29uZmlnVG9IYWwoaGlkbENvbmZpZywgc3RhdGljX2Nhc3Q8ZWZmZWN0X2NvbmZpZ190Kj4ocFJlcGx5RGF0YSkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgIHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6c2V0Q29uZmlnSW1wbCgKKyAgICAgICAgdWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwgdm9pZCAqcENtZERhdGEsIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpIHsKKyAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpIHx8CisgICAgICAgICAgICByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQzMl90KSB8fCBwUmVwbHlEYXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgY29uc3QgZWZmZWN0X2NvbmZpZ190ICpoYWxDb25maWcgPSBzdGF0aWNfY2FzdDxlZmZlY3RfY29uZmlnX3QqPihwQ21kRGF0YSk7CisgICAgaWYgKGhhbENvbmZpZy0+aW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyICE9IE5VTEwgfHwKKyAgICAgICAgICAgIGhhbENvbmZpZy0+aW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciAhPSBOVUxMIHx8CisgICAgICAgICAgICBoYWxDb25maWctPm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgIT0gTlVMTCB8fAorICAgICAgICAgICAgaGFsQ29uZmlnLT5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJCdWZmZXIgcHJvdmlkZXIgY2FsbGJhY2tzIGFyZSBub3Qgc3VwcG9ydGVkIik7CisgICAgfQorICAgIEVmZmVjdENvbmZpZyBoaWRsQ29uZmlnOworICAgIGVmZmVjdENvbmZpZ0Zyb21IYWwoKmhhbENvbmZpZywgJmhpZGxDb25maWcpOworICAgIFJldHVybjxSZXN1bHQ+IHJldCA9IGNtZENvZGUgPT0gRUZGRUNUX0NNRF9TRVRfQ09ORklHID8KKyAgICAgICAgICAgIG1FZmZlY3QtPnNldENvbmZpZyhoaWRsQ29uZmlnLCBudWxscHRyLCBudWxscHRyKSA6CisgICAgICAgICAgICBtRWZmZWN0LT5zZXRDb25maWdSZXZlcnNlKGhpZGxDb25maWcsIG51bGxwdHIsIG51bGxwdHIpOworICAgIHN0YXR1c190IHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICBpZiAocmV0LmlzT2soKSkgeworICAgICAgICByZXN1bHQgPSBhbmFseXplUmVzdWx0KHJldCk7CisgICAgICAgICpzdGF0aWNfY2FzdDxpbnQzMl90Kj4ocFJlcGx5RGF0YSkgPSByZXN1bHQ7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK30gLy8gbmFtZXNwYWNlIFY0XzAKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0SGFsSGlkbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNGRhYjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0SGFsSGlkbC5oCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9IQUxfSElETF80XzBfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9IQUxfSElETF80XzBfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvNC4wL0lFZmZlY3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RIYWxJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxmbXEvRXZlbnRGbGFnLmg+CisjaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3QuaD4KKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6RWZmZWN0QnVmZmVyQ29uZmlnOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6RWZmZWN0Q29uZmlnOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6RWZmZWN0RGVzY3JpcHRvcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OklFZmZlY3Q7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpFdmVudEZsYWc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNZXNzYWdlUXVldWU7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBWNF8wIHsKKworY2xhc3MgRWZmZWN0SGFsSGlkbCA6IHB1YmxpYyBFZmZlY3RIYWxJbnRlcmZhY2UKK3sKKyAgcHVibGljOgorICAgIC8vIFNldCB0aGUgaW5wdXQgYnVmZmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SW5CdWZmZXIoY29uc3Qgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiYgYnVmZmVyKTsKKworICAgIC8vIFNldCB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE91dEJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpOworCisgICAgLy8gRWZmZWN0IHByb2Nlc3MgZnVuY3Rpb24uCisgICAgdmlydHVhbCBzdGF0dXNfdCBwcm9jZXNzKCk7CisKKyAgICAvLyBQcm9jZXNzIHJldmVyc2Ugc3RyZWFtIGZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcGFzcworICAgIC8vIGEgcmVmZXJlbmNlIHN0cmVhbSB0byB0aGUgZWZmZWN0IGVuZ2luZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHByb2Nlc3NSZXZlcnNlKCk7CisKKyAgICAvLyBTZW5kIGEgY29tbWFuZCBhbmQgcmVjZWl2ZSBhIHJlc3BvbnNlIHRvL2Zyb20gZWZmZWN0IGVuZ2luZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNvbW1hbmQodWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwgdm9pZCAqcENtZERhdGEsCisgICAgICAgICAgICB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKTsKKworICAgIC8vIFJldHVybnMgdGhlIGVmZmVjdCBkZXNjcmlwdG9yLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RGVzY3JpcHRvcihlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcik7CisKKyAgICAvLyBGcmVlIHJlc291cmNlcyBvbiB0aGUgcmVtb3RlIHNpZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZSgpOworCisgICAgLy8gV2hldGhlciBpdCdzIGEgbG9jYWwgaW1wbGVtZW50YXRpb24uCisgICAgdmlydHVhbCBib29sIGlzTG9jYWwoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgICAgdWludDY0X3QgZWZmZWN0SWQoKSBjb25zdCB7IHJldHVybiBtRWZmZWN0SWQ7IH0KKworICAgIHN0YXRpYyB2b2lkIGVmZmVjdERlc2NyaXB0b3JUb0hhbCgKKyAgICAgICAgICAgIGNvbnN0IEVmZmVjdERlc2NyaXB0b3ImIGRlc2NyaXB0b3IsIGVmZmVjdF9kZXNjcmlwdG9yX3QqIGhhbERlc2NyaXB0b3IpOworCisgIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIEVmZmVjdHNGYWN0b3J5SGFsSGlkbDsKKyAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTwKKyAgICAgICAgaGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OlJlc3VsdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IFN0YXR1c01ROworCisgICAgc3A8SUVmZmVjdD4gbUVmZmVjdDsKKyAgICBjb25zdCB1aW50NjRfdCBtRWZmZWN0SWQ7CisgICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiBtSW5CdWZmZXI7CisgICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiBtT3V0QnVmZmVyOworICAgIGJvb2wgbUJ1ZmZlcnNDaGFuZ2VkOworICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gbVN0YXR1c01ROworICAgIEV2ZW50RmxhZyogbUVmR3JvdXA7CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgYW5hbHl6ZVJlc3VsdChjb25zdCBoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6UmVzdWx0JiByZXN1bHQpOworICAgIHN0YXRpYyB2b2lkIGVmZmVjdEJ1ZmZlckNvbmZpZ0Zyb21IYWwoCisgICAgICAgICAgICBjb25zdCBidWZmZXJfY29uZmlnX3QmIGhhbENvbmZpZywgRWZmZWN0QnVmZmVyQ29uZmlnKiBjb25maWcpOworICAgIHN0YXRpYyB2b2lkIGVmZmVjdEJ1ZmZlckNvbmZpZ1RvSGFsKAorICAgICAgICAgICAgY29uc3QgRWZmZWN0QnVmZmVyQ29uZmlnJiBjb25maWcsIGJ1ZmZlcl9jb25maWdfdCogaGFsQ29uZmlnKTsKKyAgICBzdGF0aWMgdm9pZCBlZmZlY3RDb25maWdGcm9tSGFsKGNvbnN0IGVmZmVjdF9jb25maWdfdCYgaGFsQ29uZmlnLCBFZmZlY3RDb25maWcqIGNvbmZpZyk7CisgICAgc3RhdGljIHZvaWQgZWZmZWN0Q29uZmlnVG9IYWwoY29uc3QgRWZmZWN0Q29uZmlnJiBjb25maWcsIGVmZmVjdF9jb25maWdfdCogaGFsQ29uZmlnKTsKKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBFZmZlY3RIYWxIaWRsKGNvbnN0IHNwPElFZmZlY3Q+JiBlZmZlY3QsIHVpbnQ2NF90IGVmZmVjdElkKTsKKworICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgcmVsZWFzZXMgdGhlIGVmZmVjdC4KKyAgICB2aXJ0dWFsIH5FZmZlY3RIYWxIaWRsKCk7CisKKyAgICBzdGF0dXNfdCBnZXRDb25maWdJbXBsKHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpOworICAgIHN0YXR1c190IHByZXBhcmVGb3JQcm9jZXNzaW5nKCk7CisgICAgYm9vbCBuZWVkVG9SZXNldEJ1ZmZlcnMoKTsKKyAgICBzdGF0dXNfdCBwcm9jZXNzSW1wbCh1aW50MzJfdCBtcUZsYWcpOworICAgIHN0YXR1c190IHNldENvbmZpZ0ltcGwoCisgICAgICAgICAgICB1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLCB2b2lkICpwQ21kRGF0YSwKKyAgICAgICAgICAgIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpOworICAgIHN0YXR1c190IHNldFByb2Nlc3NCdWZmZXJzKCk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBWNF8wCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9IQUxfSElETF80XzBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmVkNzg0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkVmZmVjdHNGYWN0b3J5SGFsSGlkbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSA8bGliYXVkaW9oYWwvNC4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oPgorCisjaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKKyNpbmNsdWRlICJFZmZlY3RCdWZmZXJIYWxIaWRsLmgiCisjaW5jbHVkZSAiRWZmZWN0SGFsSGlkbC5oIgorI2luY2x1ZGUgIkhpZGxVdGlscy5oIgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpIaWRsVXRpbHM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpVdWlkOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6SUVmZmVjdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OlJlc3VsdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIFY0XzAgeworCitFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OkVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpIDogQ29udmVyc2lvbkhlbHBlckhpZGwoIkVmZmVjdHNGYWN0b3J5IikgeworICAgIG1FZmZlY3RzRmFjdG9yeSA9IElFZmZlY3RzRmFjdG9yeTo6Z2V0U2VydmljZSgpOworICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9idGFpbiBJRWZmZWN0c0ZhY3Rvcnkgc2VydmljZSwgdGVybWluYXRpbmcgcHJvY2Vzcy4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9Cit9CisKK0VmZmVjdHNGYWN0b3J5SGFsSGlkbDo6fkVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpIHsKK30KKworc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpxdWVyeUFsbERlc2NyaXB0b3JzKCkgeworICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmdldEFsbERlc2NyaXB0b3JzKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxFZmZlY3REZXNjcmlwdG9yPiYgcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgbUxhc3REZXNjcmlwdG9ycyA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAocmV0LmlzT2soKSkgeworICAgICAgICByZXR1cm4gcmV0dmFsID09IFJlc3VsdDo6T0sgPyBPSyA6IE5PX0lOSVQ7CisgICAgfQorICAgIG1MYXN0RGVzY3JpcHRvcnMucmVzaXplKDApOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKF9fRlVOQ1RJT05fXywgcmV0KTsKK30KKworc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpxdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKnBOdW1FZmZlY3RzKSB7CisgICAgc3RhdHVzX3QgcXVlcnlSZXN1bHQgPSBxdWVyeUFsbERlc2NyaXB0b3JzKCk7CisgICAgaWYgKHF1ZXJ5UmVzdWx0ID09IE9LKSB7CisgICAgICAgICpwTnVtRWZmZWN0cyA9IG1MYXN0RGVzY3JpcHRvcnMuc2l6ZSgpOworICAgIH0KKyAgICByZXR1cm4gcXVlcnlSZXN1bHQ7Cit9CisKK3N0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6Z2V0RGVzY3JpcHRvcigKKyAgICAgICAgdWludDMyX3QgaW5kZXgsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7CisgICAgLy8gVE9ETzogV2UgbmVlZCBzb21laG93IHRvIHRyYWNrIHRoZSBjaGFuZ2VzIG9uIHRoZSBzZXJ2ZXIgc2lkZQorICAgIC8vIG9yIGZpZ3VyZSBvdXQgaG93IHRvIGNvbnZlcnQgZXZlcnlib2R5IHRvIHF1ZXJ5IGFsbCB0aGUgZGVzY3JpcHRvcnMgYXQgb25jZS4KKyAgICAvLyBUT0RPOiBjaGVjayBmb3IgbnVsbHB0cgorICAgIGlmIChtTGFzdERlc2NyaXB0b3JzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHN0YXR1c190IHF1ZXJ5UmVzdWx0ID0gcXVlcnlBbGxEZXNjcmlwdG9ycygpOworICAgICAgICBpZiAocXVlcnlSZXN1bHQgIT0gT0spIHJldHVybiBxdWVyeVJlc3VsdDsKKyAgICB9CisgICAgaWYgKGluZGV4ID49IG1MYXN0RGVzY3JpcHRvcnMuc2l6ZSgpKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0RGVzY3JpcHRvclRvSGFsKG1MYXN0RGVzY3JpcHRvcnNbaW5kZXhdLCBwRGVzY3JpcHRvcik7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmdldERlc2NyaXB0b3IoCisgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgeworICAgIC8vIFRPRE86IGNoZWNrIGZvciBudWxscHRyCisgICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBVdWlkIGhpZGxVdWlkOworICAgIEhpZGxVdGlsczo6dXVpZEZyb21IYWwoKnBFZmZlY3RVdWlkLCAmaGlkbFV1aWQpOworICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdHNGYWN0b3J5LT5nZXREZXNjcmlwdG9yKGhpZGxVdWlkLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBFZmZlY3REZXNjcmlwdG9yJiByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICBFZmZlY3RIYWxIaWRsOjplZmZlY3REZXNjcmlwdG9yVG9IYWwocmVzdWx0LCBwRGVzY3JpcHRvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKHJldC5pc09rKCkpIHsKKyAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSByZXR1cm4gT0s7CisgICAgICAgIGVsc2UgaWYgKHJldHZhbCA9PSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgICAgIGVsc2UgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKF9fRlVOQ1RJT05fXywgcmV0KTsKK30KKworc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpjcmVhdGVFZmZlY3QoCisgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLCBpbnQzMl90IHNlc3Npb25JZCwgaW50MzJfdCBpb0lkLAorICAgICAgICBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+ICplZmZlY3QpIHsKKyAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOworICAgIFV1aWQgaGlkbFV1aWQ7CisgICAgSGlkbFV0aWxzOjp1dWlkRnJvbUhhbCgqcEVmZmVjdFV1aWQsICZoaWRsVXVpZCk7CisgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmNyZWF0ZUVmZmVjdCgKKyAgICAgICAgICAgIGhpZGxVdWlkLCBzZXNzaW9uSWQsIGlvSWQsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElFZmZlY3Q+JiByZXN1bHQsIHVpbnQ2NF90IGVmZmVjdElkKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKmVmZmVjdCA9IG5ldyBFZmZlY3RIYWxIaWRsKHJlc3VsdCwgZWZmZWN0SWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmIChyZXQuaXNPaygpKSB7CisgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgcmV0dXJuIE9LOworICAgICAgICBlbHNlIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUykgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgICAgICBlbHNlIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybihfX0ZVTkNUSU9OX18sIHJldCk7Cit9CisKK3N0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6ZHVtcEVmZmVjdHMoaW50IGZkKSB7CisgICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBuYXRpdmVfaGFuZGxlX3QqIGhpZGxIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKKyAgICBoaWRsSGFuZGxlLT5kYXRhWzBdID0gZmQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+ZGVidWcoaGlkbEhhbmRsZSwge30gLyogb3B0aW9ucyAqLyk7CisgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOworfQorCitzdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmFsbG9jYXRlQnVmZmVyKHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIHsKKyAgICByZXR1cm4gRWZmZWN0QnVmZmVySGFsSGlkbDo6YWxsb2NhdGUoc2l6ZSwgYnVmZmVyKTsKK30KKworc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjptaXJyb3JCdWZmZXIodm9pZCogZXh0ZXJuYWwsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIHsKKyAgICByZXR1cm4gRWZmZWN0QnVmZmVySGFsSGlkbDo6bWlycm9yKGV4dGVybmFsLCBzaXplLCBidWZmZXIpOworfQorCisKK30gLy8gbmFtZXNwYWNlIFY0XzAKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1IYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1IYWxIaWRsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzJmZGIwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbUhhbEhpZGwuY3BwCkBAIC0wLDAgKzEsODE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJTdHJlYW1IYWxIaWRsIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby80LjAvSVN0cmVhbU91dENhbGxiYWNrLmg+CisjaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCisjaW5jbHVkZSAiRWZmZWN0SGFsSGlkbC5oIgorI2luY2x1ZGUgIlN0cmVhbUhhbEhpZGwuaCIKKyNpbmNsdWRlICJWZXJzaW9uVXRpbHMuaCIKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9DaGFubmVsTWFzazsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvQ29udGVudFR5cGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb0Zvcm1hdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvU291cmNlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9Vc2FnZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OlRocmVhZEluZm87Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6QXVkaW9EcmFpbjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJU3RyZWFtT3V0Q2FsbGJhY2s7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6TWVzc2FnZVF1ZXVlRmxhZ0JpdHM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6TWljcm9waG9uZUluZm87Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6TW1hcEJ1ZmZlckluZm87Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6TW1hcFBvc2l0aW9uOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlBhcmFtZXRlclZhbHVlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlBsYXliYWNrVHJhY2tNZXRhZGF0YTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpSZWNvcmRUcmFja01ldGFkYXRhOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlJlc3VsdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpUaW1lU3BlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1RRGVzY3JpcHRvclN5bmM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgUmVhZENvbW1hbmQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SVN0cmVhbUluOjpSZWFkQ29tbWFuZDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIFY0XzAgeworCitTdHJlYW1IYWxIaWRsOjpTdHJlYW1IYWxIaWRsKElTdHJlYW0gKnN0cmVhbSkKKyAgICAgICAgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiU3RyZWFtIiksCisgICAgICAgICAgbVN0cmVhbShzdHJlYW0pLAorICAgICAgICAgIG1IYWxUaHJlYWRQcmlvcml0eShIQUxfVEhSRUFEX1BSSU9SSVRZX0RFRkFVTFQpLAorICAgICAgICAgIG1DYWNoZWRCdWZmZXJTaXplKDApeworCisgICAgLy8gSW5zdHJ1bWVudCBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KKyAgICAvLyBOb3RlOiBUaGlzIGFzc3VtZXMgY2hhbm5lbCBtYXNrLCBmb3JtYXQsIGFuZCBzYW1wbGUgcmF0ZSBkbyBub3QgY2hhbmdlIGFmdGVyIGNyZWF0aW9uLgorICAgIGlmIChtU3RyZWFtICE9IG51bGxwdHIgJiYgbVN0cmVhbVBvd2VyTG9nLmlzVXNlckRlYnVnT3JFbmdCdWlsZCgpKSB7CisgICAgICAgIC8vIE9idGFpbiBhdWRpbyBwcm9wZXJ0aWVzIChzZWUgU3RyZWFtSGFsSGlkbDo6Z2V0QXVkaW9Qcm9wZXJ0aWVzKCkgYmVsb3cpLgorICAgICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0QXVkaW9Qcm9wZXJ0aWVzKAorICAgICAgICAgICAgICAgIFsmXShhdXRvIHNyLCBhdXRvIG0sIGF1dG8gZikgeworICAgICAgICAgICAgICAgIG1TdHJlYW1Qb3dlckxvZy5pbml0KHNyLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KG0pLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KGYpKTsKKyAgICAgICAgICAgIH0pOworICAgIH0KK30KKworU3RyZWFtSGFsSGlkbDo6flN0cmVhbUhhbEhpZGwoKSB7CisgICAgbVN0cmVhbSA9IG51bGxwdHI7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRTYW1wbGVSYXRlIiwgbVN0cmVhbS0+Z2V0U2FtcGxlUmF0ZSgpLCByYXRlKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHN0YXR1c190IHN0YXR1cyA9IHByb2Nlc3NSZXR1cm4oImdldEJ1ZmZlclNpemUiLCBtU3RyZWFtLT5nZXRCdWZmZXJTaXplKCksIHNpemUpOworICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgbUNhY2hlZEJ1ZmZlclNpemUgPSAqc2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRDaGFubmVsTWFzayIsIG1TdHJlYW0tPmdldENoYW5uZWxNYXNrKCksIG1hc2spOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZvcm1hdCIsIG1TdHJlYW0tPmdldEZvcm1hdCgpLCBmb3JtYXQpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRBdWRpb1Byb3BlcnRpZXMoCisgICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEF1ZGlvUHJvcGVydGllcygKKyAgICAgICAgICAgIFsmXSh1aW50MzJfdCBzciwgYXV0byBtLCBhdXRvIGYpIHsKKyAgICAgICAgICAgICAgICAqc2FtcGxlUmF0ZSA9IHNyOworICAgICAgICAgICAgICAgICptYXNrID0gc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KG0pOworICAgICAgICAgICAgICAgICpmb3JtYXQgPSBzdGF0aWNfY2FzdDxhdWRpb19mb3JtYXRfdD4oZik7CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0QXVkaW9Qcm9wZXJ0aWVzIiwgcmV0KTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gaGlkbFBhcmFtczsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJhbWV0ZXJzRnJvbUhhbChrdlBhaXJzLCAmaGlkbFBhcmFtcyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0UGFyYW1ldGVycyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHM6OnNldFBhcmFtZXRlcnMobVN0cmVhbSwgaGlkbFBhcmFtcywge30gLyogb3B0aW9ucyAqLykpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcykgeworICAgIHZhbHVlcy0+Y2xlYXIoKTsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiBoaWRsS2V5czsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBrZXlzRnJvbUhhbChrZXlzLCAmaGlkbEtleXMpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gdXRpbHM6OmdldFBhcmFtZXRlcnMoCisgICAgICAgICAgICBtU3RyZWFtLAorICAgICAgICAgICAge30gLyogY29udGV4dCAqLywKKyAgICAgICAgICAgIGhpZGxLZXlzLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzVG9IYWwocGFyYW1ldGVycywgdmFsdWVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UGFyYW1ldGVycyIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6YWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiYWRkRWZmZWN0IiwgbVN0cmVhbS0+YWRkRWZmZWN0KAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RIYWxIaWRsKj4oZWZmZWN0LmdldCgpKS0+ZWZmZWN0SWQoKSkpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpyZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJyZW1vdmVFZmZlY3QiLCBtU3RyZWFtLT5yZW1vdmVFZmZlY3QoCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEhhbEhpZGwqPihlZmZlY3QuZ2V0KCkpLT5lZmZlY3RJZCgpKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0YW5kYnkoKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3RhbmRieSIsIG1TdHJlYW0tPnN0YW5kYnkoKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmR1bXAoaW50IGZkKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICBuYXRpdmVfaGFuZGxlX3QqIGhpZGxIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKKyAgICBoaWRsSGFuZGxlLT5kYXRhWzBdID0gZmQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmRlYnVnKGhpZGxIYW5kbGUsIHt9IC8qIG9wdGlvbnMgKi8pOworICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhpZGxIYW5kbGUpOworICAgIG1TdHJlYW1Qb3dlckxvZy5kdW1wKGZkKTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZHVtcCIsIHJldCk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0YXJ0KCkgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN0YXJ0IiwgbVN0cmVhbS0+c3RhcnQoKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0b3AoKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3RvcCIsIG1TdHJlYW0tPnN0b3AoKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSB7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Y3JlYXRlTW1hcEJ1ZmZlcigKKyAgICAgICAgICAgIG1pblNpemVGcmFtZXMsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IE1tYXBCdWZmZXJJbmZvJiBoaWRsSW5mbykgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGUgKmhhbmRsZSA9IGhpZGxJbmZvLnNoYXJlZE1lbW9yeS5oYW5kbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZS0+bnVtRmRzID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c2hhcmVkX21lbW9yeV9mZCA9IGhhbmRsZS0+ZGF0YVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmJ1ZmZlcl9zaXplX2ZyYW1lcyA9IGhpZGxJbmZvLmJ1ZmZlclNpemVGcmFtZXM7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5idXJzdF9zaXplX2ZyYW1lcyA9IGhpZGxJbmZvLmJ1cnN0U2l6ZUZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZm8tPnNoYXJlZF9tZW1vcnlfYWRkcmVzcyBpcyBub3QgbmVlZGVkIGluIEhJREwgY29udGV4dAorICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c2hhcmVkX21lbW9yeV9hZGRyZXNzID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImNyZWF0ZU1tYXBCdWZmZXIiLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pIHsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRNbWFwUG9zaXRpb24oCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IE1tYXBQb3NpdGlvbiYgaGlkbFBvc2l0aW9uKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24tPnRpbWVfbmFub3NlY29uZHMgPSBoaWRsUG9zaXRpb24udGltZU5hbm9zZWNvbmRzOworICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbi0+cG9zaXRpb25fZnJhbWVzID0gaGlkbFBvc2l0aW9uLnBvc2l0aW9uRnJhbWVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNbWFwUG9zaXRpb24iLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OnNldEhhbFRocmVhZFByaW9yaXR5KGludCBwcmlvcml0eSkgeworICAgIG1IYWxUaHJlYWRQcmlvcml0eSA9IHByaW9yaXR5OworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0Q2FjaGVkQnVmZmVyU2l6ZShzaXplX3QgKnNpemUpIHsKKyAgICBpZiAobUNhY2hlZEJ1ZmZlclNpemUgIT0gMCkgeworICAgICAgICAqc2l6ZSA9IG1DYWNoZWRCdWZmZXJTaXplOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIHJldHVybiBnZXRCdWZmZXJTaXplKHNpemUpOworfQorCitib29sIFN0cmVhbUhhbEhpZGw6OnJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShwaWRfdCB0aHJlYWRQaWQsIHBpZF90IHRocmVhZElkKSB7CisgICAgaWYgKG1IYWxUaHJlYWRQcmlvcml0eSA9PSBIQUxfVEhSRUFEX1BSSU9SSVRZX0RFRkFVTFQpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGludCBlcnIgPSByZXF1ZXN0UHJpb3JpdHkoCisgICAgICAgICAgICB0aHJlYWRQaWQsIHRocmVhZElkLAorICAgICAgICAgICAgbUhhbFRocmVhZFByaW9yaXR5LCBmYWxzZSAvKmlzRm9yQXBwKi8sIHRydWUgLyphc3luY2hyb25vdXMqLyk7CisgICAgQUxPR0VfSUYoZXJyLCAiZmFpbGVkIHRvIHNldCBwcmlvcml0eSAlZCBmb3IgcGlkICVkIHRpZCAlZDsgZXJyb3IgJWQiLAorICAgICAgICAgICAgbUhhbFRocmVhZFByaW9yaXR5LCB0aHJlYWRQaWQsIHRocmVhZElkLCBlcnIpOworICAgIC8vIEF1ZGlvIHdpbGwgc3RpbGwgd29yaywgYnV0IGxhdGVuY3kgd2lsbCBiZSBoaWdoZXIgYW5kIHNvbWV0aW1lcyB1bmFjY2VwdGFibGUuCisgICAgcmV0dXJuIGVyciA9PSAwOworfQorCituYW1lc3BhY2UgeworCisvKiBOb3RlcyBvbiBjYWxsYmFjayBvd25lcnNoaXAuCisKK1RoaXMgaXMgaG93IChIdylCaW5kZXIgb3duZXJzaGlwIG1vZGVsIGxvb2tzIGxpa2UuIFRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KK2lzIG93bmVkIGJ5IEJpbmRlciBmcmFtZXdvcmsgKHZpYSBzcDw+KS4gUHJveGllcyBhcmUgb3duZWQgYnkgY2xpZW50cy4KK1doZW4gdGhlIGxhc3QgcHJveHkgZGlzYXBwZWFycywgQmluZGVyIGZyYW1ld29yayByZWxlYXNlcyB0aGUgc2VydmVyIGltcGwuCisKK1RodXMsIGl0IGlzIG5vdCBuZWVkZWQgdG8ga2VlcCBhbnkgcmVmZXJlbmNlcyB0byBTdHJlYW1PdXRDYWxsYmFjayAodGhpcyBpcwordGhlIHNlcnZlciBpbXBsKSAtLSBpdCB3aWxsIGxpdmUgYXMgbG9uZyBhcyBIQUwgc2VydmVyIGhvbGRzIGEgc3Ryb25nIHJlZiB0bworSVN0cmVhbU91dENhbGxiYWNrIHByb3h5LiBXZSBjbGVhciB0aGF0IHJlZmVyZW5jZSBieSBjYWxsaW5nICdjbGVhckNhbGxiYWNrJworZnJvbSB0aGUgZGVzdHJ1Y3RvciBvZiBTdHJlYW1PdXRIYWxIaWRsLgorCitUaGUgY2FsbGJhY2sgb25seSBrZWVwcyBhIHdlYWsgcmVmZXJlbmNlIHRvIHRoZSBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgb3duZWQKK2J5IEF1ZGlvRmxpbmdlci4KKworKi8KKworc3RydWN0IFN0cmVhbU91dENhbGxiYWNrIDogcHVibGljIElTdHJlYW1PdXRDYWxsYmFjayB7CisgICAgU3RyZWFtT3V0Q2FsbGJhY2soY29uc3Qgd3A8U3RyZWFtT3V0SGFsSGlkbD4mIHN0cmVhbSkgOiBtU3RyZWFtKHN0cmVhbSkge30KKworICAgIC8vIElTdHJlYW1PdXRDYWxsYmFjayBpbXBsZW1lbnRhdGlvbgorICAgIFJldHVybjx2b2lkPiBvbldyaXRlUmVhZHkoKSAgb3ZlcnJpZGUgeworICAgICAgICBzcDxTdHJlYW1PdXRIYWxIaWRsPiBzdHJlYW0gPSBtU3RyZWFtLnByb21vdGUoKTsKKyAgICAgICAgaWYgKHN0cmVhbSAhPSAwKSB7CisgICAgICAgICAgICBzdHJlYW0tPm9uV3JpdGVSZWFkeSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgUmV0dXJuPHZvaWQ+IG9uRHJhaW5SZWFkeSgpICBvdmVycmlkZSB7CisgICAgICAgIHNwPFN0cmVhbU91dEhhbEhpZGw+IHN0cmVhbSA9IG1TdHJlYW0ucHJvbW90ZSgpOworICAgICAgICBpZiAoc3RyZWFtICE9IDApIHsKKyAgICAgICAgICAgIHN0cmVhbS0+b25EcmFpblJlYWR5KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICBSZXR1cm48dm9pZD4gb25FcnJvcigpICBvdmVycmlkZSB7CisgICAgICAgIHNwPFN0cmVhbU91dEhhbEhpZGw+IHN0cmVhbSA9IG1TdHJlYW0ucHJvbW90ZSgpOworICAgICAgICBpZiAoc3RyZWFtICE9IDApIHsKKyAgICAgICAgICAgIHN0cmVhbS0+b25FcnJvcigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgd3A8U3RyZWFtT3V0SGFsSGlkbD4gbVN0cmVhbTsKK307CisKK30gIC8vIG5hbWVzcGFjZQorCitTdHJlYW1PdXRIYWxIaWRsOjpTdHJlYW1PdXRIYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1PdXQ+JiBzdHJlYW0pCisgICAgICAgIDogU3RyZWFtSGFsSGlkbChzdHJlYW0uZ2V0KCkpLCBtU3RyZWFtKHN0cmVhbSksIG1Xcml0ZXJDbGllbnQoMCksIG1FZkdyb3VwKG51bGxwdHIpIHsKK30KKworU3RyZWFtT3V0SGFsSGlkbDo6flN0cmVhbU91dEhhbEhpZGwoKSB7CisgICAgaWYgKG1TdHJlYW0gIT0gMCkgeworICAgICAgICBpZiAobUNhbGxiYWNrLnVuc2FmZV9nZXQoKSkgeworICAgICAgICAgICAgcHJvY2Vzc1JldHVybigiY2xlYXJDYWxsYmFjayIsIG1TdHJlYW0tPmNsZWFyQ2FsbGJhY2soKSk7CisgICAgICAgIH0KKyAgICAgICAgcHJvY2Vzc1JldHVybigiY2xvc2UiLCBtU3RyZWFtLT5jbG9zZSgpKTsKKyAgICAgICAgbVN0cmVhbS5jbGVhcigpOworICAgIH0KKyAgICBtQ2FsbGJhY2suY2xlYXIoKTsKKyAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOworICAgIGlmIChtRWZHcm91cCkgeworICAgICAgICBFdmVudEZsYWc6OmRlbGV0ZUV2ZW50RmxhZygmbUVmR3JvdXApOworICAgIH0KK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRGcmFtZVNpemUiLCBtU3RyZWFtLT5nZXRGcmFtZVNpemUoKSwgc2l6ZSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldExhdGVuY3kodWludDMyX3QgKmxhdGVuY3kpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBpZiAobVdyaXRlckNsaWVudCA9PSBnZXR0aWQoKSAmJiBtQ29tbWFuZE1RKSB7CisgICAgICAgIHJldHVybiBjYWxsV3JpdGVyVGhyZWFkKAorICAgICAgICAgICAgICAgIFdyaXRlQ29tbWFuZDo6R0VUX0xBVEVOQ1ksICJnZXRMYXRlbmN5IiwgbnVsbHB0ciwgMCwKKyAgICAgICAgICAgICAgICBbJl0oY29uc3QgV3JpdGVTdGF0dXMmIHdyaXRlU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICAgICpsYXRlbmN5ID0gd3JpdGVTdGF0dXMucmVwbHkubGF0ZW5jeU1zOworICAgICAgICAgICAgICAgIH0pOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRMYXRlbmN5IiwgbVN0cmVhbS0+Z2V0TGF0ZW5jeSgpLCBsYXRlbmN5KTsKKyAgICB9Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRWb2x1bWUiLCBtU3RyZWFtLT5zZXRWb2x1bWUobGVmdCwgcmlnaHQpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6d3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbikgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgICp3cml0dGVuID0gMDsKKworICAgIGlmIChieXRlcyA9PSAwICYmICFtRGF0YU1RKSB7CisgICAgICAgIC8vIENhbid0IGRldGVybWluZSB0aGUgc2l6ZSBmb3IgdGhlIE1RIGJ1ZmZlci4gV2FpdCBmb3IgYSBub24tZW1wdHkgd3JpdGUgcmVxdWVzdC4KKyAgICAgICAgQUxPR1dfSUYobUNhbGxiYWNrLnVuc2FmZV9nZXQoKSwgIkZpcnN0IGNhbGwgdG8gYXN5bmMgd3JpdGUgd2l0aCAwIGJ5dGVzIik7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgaWYgKCFtRGF0YU1RKSB7CisgICAgICAgIC8vIEluIGNhc2UgaWYgcGxheWJhY2sgc3RhcnRzIGNsb3NlIHRvIHRoZSBlbmQgb2YgYSBjb21wcmVzc2VkIHRyYWNrLCB0aGUgYnl0ZXMKKyAgICAgICAgLy8gdGhhdCBuZWVkIHRvIGJlIHdyaXR0ZW4gaXMgbGVzcyB0aGFuIHRoZSBhY3R1YWwgYnVmZmVyIHNpemUuIE5lZWQgdG8gdXNlCisgICAgICAgIC8vIGZ1bGwgYnVmZmVyIHNpemUgZm9yIHRoZSBNUSBzaW5jZSBvdGhlcndpc2UgYWZ0ZXIgc2Vla2luZyBiYWNrIHRvIHRoZSBtaWRkbGUKKyAgICAgICAgLy8gZGF0YSB3aWxsIGJlIHRydW5jYXRlZC4KKyAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemU7CisgICAgICAgIGlmICgoc3RhdHVzID0gZ2V0Q2FjaGVkQnVmZmVyU2l6ZSgmYnVmZmVyU2l6ZSkpICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIGlmIChieXRlcyA+IGJ1ZmZlclNpemUpIGJ1ZmZlclNpemUgPSBieXRlczsKKyAgICAgICAgaWYgKChzdGF0dXMgPSBwcmVwYXJlRm9yV3JpdGluZyhidWZmZXJTaXplKSkgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0dXMgPSBjYWxsV3JpdGVyVGhyZWFkKAorICAgICAgICAgICAgV3JpdGVDb21tYW5kOjpXUklURSwgIndyaXRlIiwgc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCo+KGJ1ZmZlciksIGJ5dGVzLAorICAgICAgICAgICAgWyZdIChjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAqd3JpdHRlbiA9IHdyaXRlU3RhdHVzLnJlcGx5LndyaXR0ZW47CisgICAgICAgICAgICAgICAgLy8gRGlhZ25vc3RpY3Mgb2YgdGhlIGNhdXNlIG9mIGIvMzU4MTMxMTMuCisgICAgICAgICAgICAgICAgQUxPR0VfSUYoKndyaXR0ZW4gPiBieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICJoYWwgcmVwb3J0cyBtb3JlIGJ5dGVzIHdyaXR0ZW4gdGhhbiBhc2tlZCBmb3I6ICVsbGQgPiAlbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpKndyaXR0ZW4sIChsb25nIGxvbmcpYnl0ZXMpOworICAgICAgICAgICAgfSk7CisgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICp3cml0dGVuKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpjYWxsV3JpdGVyVGhyZWFkKAorICAgICAgICBXcml0ZUNvbW1hbmQgY21kLCBjb25zdCBjaGFyKiBjbWROYW1lLAorICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YVNpemUsIFN0cmVhbU91dEhhbEhpZGw6OldyaXRlckNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgaWYgKCFtQ29tbWFuZE1RLT53cml0ZSgmY21kKSkgeworICAgICAgICBBTE9HRSgiY29tbWFuZCBtZXNzYWdlIHF1ZXVlIHdyaXRlIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7CisgICAgICAgIHJldHVybiAtRUFHQUlOOworICAgIH0KKyAgICBpZiAoZGF0YSAhPSBudWxscHRyKSB7CisgICAgICAgIHNpemVfdCBhdmFpbGFibGVUb1dyaXRlID0gbURhdGFNUS0+YXZhaWxhYmxlVG9Xcml0ZSgpOworICAgICAgICBpZiAoZGF0YVNpemUgPiBhdmFpbGFibGVUb1dyaXRlKSB7CisgICAgICAgICAgICBBTE9HVygidHJ1bmNhdGluZyB3cml0ZSBkYXRhIGZyb20gJWxsZCB0byAlbGxkIGR1ZSB0byBpbnN1ZmZpY2llbnQgZGF0YSBxdWV1ZSBzcGFjZSIsCisgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpZGF0YVNpemUsIChsb25nIGxvbmcpYXZhaWxhYmxlVG9Xcml0ZSk7CisgICAgICAgICAgICBkYXRhU2l6ZSA9IGF2YWlsYWJsZVRvV3JpdGU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtRGF0YU1RLT53cml0ZShkYXRhLCBkYXRhU2l6ZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJkYXRhIG1lc3NhZ2UgcXVldWUgd3JpdGUgZmFpbGVkIGZvciBcIiVzXCIiLCBjbWROYW1lKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtRWZHcm91cC0+d2FrZShzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9FTVBUWSkpOworCisgICAgLy8gVE9ETzogUmVtb3ZlIG1hbnVhbCBldmVudCBmbGFnIGhhbmRsaW5nIG9uY2UgYmxvY2tpbmcgTVEgaXMgaW1wbGVtZW50ZWQuIGIvMzM4MTU0MjIKKyAgICB1aW50MzJfdCBlZlN0YXRlID0gMDsKK3JldHJ5OgorICAgIHN0YXR1c190IHJldCA9IG1FZkdyb3VwLT53YWl0KHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0ZVTEwpLCAmZWZTdGF0ZSk7CisgICAgaWYgKGVmU3RhdGUgJiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9GVUxMKSkgeworICAgICAgICBXcml0ZVN0YXR1cyB3cml0ZVN0YXR1czsKKyAgICAgICAgd3JpdGVTdGF0dXMucmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgICAgIGlmICghbVN0YXR1c01RLT5yZWFkKCZ3cml0ZVN0YXR1cykpIHsKKyAgICAgICAgICAgIEFMT0dFKCJzdGF0dXMgbWVzc2FnZSByZWFkIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHdyaXRlU3RhdHVzLnJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICByZXQgPSBPSzsKKyAgICAgICAgICAgIGNhbGxiYWNrKHdyaXRlU3RhdHVzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IHByb2Nlc3NSZXR1cm4oY21kTmFtZSwgd3JpdGVTdGF0dXMucmV0dmFsKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBpZiAocmV0ID09IC1FQUdBSU4gfHwgcmV0ID09IC1FSU5UUikgeworICAgICAgICAvLyBTcHVyaW91cyB3YWtldXAuIFRoaXMgbm9ybWFsbHkgcmV0cmllcyBubyBtb3JlIHRoYW4gb25jZS4KKyAgICAgICAgZ290byByZXRyeTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6cHJlcGFyZUZvcldyaXRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiB0ZW1wQ29tbWFuZE1ROworICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IHRlbXBEYXRhTVE7CisgICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiB0ZW1wU3RhdHVzTVE7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBwaWRfdCBoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+cHJlcGFyZUZvcldyaXRpbmcoCisgICAgICAgICAgICAxLCBidWZmZXJTaXplLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDb21tYW5kTVE6OkRlc2NyaXB0b3ImIGNvbW1hbmRNUSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YU1ROjpEZXNjcmlwdG9yJiBkYXRhTVEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0YXR1c01ROjpEZXNjcmlwdG9yJiBzdGF0dXNNUSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyZWFkSW5mbyYgaGFsVGhyZWFkSW5mbykgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIHRlbXBDb21tYW5kTVEucmVzZXQobmV3IENvbW1hbmRNUShjb21tYW5kTVEpKTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcERhdGFNUS5yZXNldChuZXcgRGF0YU1RKGRhdGFNUSkpOworICAgICAgICAgICAgICAgICAgICB0ZW1wU3RhdHVzTVEucmVzZXQobmV3IFN0YXR1c01RKHN0YXR1c01RKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wRGF0YU1RLT5pc1ZhbGlkKCkgJiYgdGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBFdmVudEZsYWc6OmNyZWF0ZUV2ZW50RmxhZyh0ZW1wRGF0YU1RLT5nZXRFdmVudEZsYWdXb3JkKCksICZtRWZHcm91cCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaGFsVGhyZWFkUGlkID0gaGFsVGhyZWFkSW5mby5waWQ7CisgICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFRpZCA9IGhhbFRocmVhZEluZm8udGlkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmICghcmV0LmlzT2soKSB8fCByZXR2YWwgIT0gUmVzdWx0OjpPSykgeworICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicHJlcGFyZUZvcldyaXRpbmciLCByZXQsIHJldHZhbCk7CisgICAgfQorICAgIGlmICghdGVtcENvbW1hbmRNUSB8fCAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpIHx8CisgICAgICAgICAgICAhdGVtcERhdGFNUSB8fCAhdGVtcERhdGFNUS0+aXNWYWxpZCgpIHx8CisgICAgICAgICAgICAhdGVtcFN0YXR1c01RIHx8ICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSB8fAorICAgICAgICAgICAgIW1FZkdyb3VwKSB7CisgICAgICAgIEFMT0dFX0lGKCF0ZW1wQ29tbWFuZE1RLCAiRmFpbGVkIHRvIG9idGFpbiBjb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmciKTsKKyAgICAgICAgQUxPR0VfSUYodGVtcENvbW1hbmRNUSAmJiAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpLAorICAgICAgICAgICAgICAgICJDb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOworICAgICAgICBBTE9HRV9JRighdGVtcERhdGFNUSwgIkZhaWxlZCB0byBvYnRhaW4gZGF0YSBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIik7CisgICAgICAgIEFMT0dFX0lGKHRlbXBEYXRhTVEgJiYgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSwgIkRhdGEgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyBpcyBpbnZhbGlkIik7CisgICAgICAgIEFMT0dFX0lGKCF0ZW1wU3RhdHVzTVEsICJGYWlsZWQgdG8gb2J0YWluIHN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIik7CisgICAgICAgIEFMT0dFX0lGKHRlbXBTdGF0dXNNUSAmJiAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCksCisgICAgICAgICAgICAgICAgIlN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIGlzIGludmFsaWQiKTsKKyAgICAgICAgQUxPR0VfSUYoIW1FZkdyb3VwLCAiRXZlbnQgZmxhZyBjcmVhdGlvbiBmb3Igd3JpdGluZyBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZCk7CisKKyAgICBtQ29tbWFuZE1RID0gc3RkOjptb3ZlKHRlbXBDb21tYW5kTVEpOworICAgIG1EYXRhTVEgPSBzdGQ6Om1vdmUodGVtcERhdGFNUSk7CisgICAgbVN0YXR1c01RID0gc3RkOjptb3ZlKHRlbXBTdGF0dXNNUSk7CisgICAgbVdyaXRlckNsaWVudCA9IGdldHRpZCgpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcykgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldFJlbmRlclBvc2l0aW9uKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50MzJfdCBkKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKmRzcEZyYW1lcyA9IGQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFJlbmRlclBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0TmV4dFdyaXRlVGltZXN0YW1wKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBpbnQ2NF90IHQpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAqdGltZXN0YW1wID0gdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UmVuZGVyUG9zaXRpb24iLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjaykgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHN0YXR1c190IHN0YXR1cyA9IHByb2Nlc3NSZXR1cm4oCisgICAgICAgICAgICAic2V0Q2FsbGJhY2siLCBtU3RyZWFtLT5zZXRDYWxsYmFjayhuZXcgU3RyZWFtT3V0Q2FsbGJhY2sodGhpcykpKTsKKyAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPnN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoCisgICAgICAgICAgICBbJl0oYm9vbCBwLCBib29sIHIpIHsKKyAgICAgICAgICAgICAgICAqc3VwcG9ydHNQYXVzZSA9IHA7CisgICAgICAgICAgICAgICAgKnN1cHBvcnRzUmVzdW1lID0gcjsKKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdXBwb3J0c1BhdXNlQW5kUmVzdW1lIiwgcmV0KTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6cGF1c2UoKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInBhdXNlIiwgbVN0cmVhbS0+cGF1c2UoKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnJlc3VtZSgpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicGF1c2UiLCBtU3RyZWFtLT5yZXN1bWUoKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbikgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdXBwb3J0c0RyYWluIiwgbVN0cmVhbS0+c3VwcG9ydHNEcmFpbigpLCBzdXBwb3J0c0RyYWluKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6ZHJhaW4oYm9vbCBlYXJseU5vdGlmeSkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKAorICAgICAgICAgICAgImRyYWluIiwgbVN0cmVhbS0+ZHJhaW4oZWFybHlOb3RpZnkgPyBBdWRpb0RyYWluOjpFQVJMWV9OT1RJRlkgOiBBdWRpb0RyYWluOjpBTEwpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Zmx1c2goKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInBhdXNlIiwgbVN0cmVhbS0+Zmx1c2goKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgaWYgKG1Xcml0ZXJDbGllbnQgPT0gZ2V0dGlkKCkgJiYgbUNvbW1hbmRNUSkgeworICAgICAgICByZXR1cm4gY2FsbFdyaXRlclRocmVhZCgKKyAgICAgICAgICAgICAgICBXcml0ZUNvbW1hbmQ6OkdFVF9QUkVTRU5UQVRJT05fUE9TSVRJT04sICJnZXRQcmVzZW50YXRpb25Qb3NpdGlvbiIsIG51bGxwdHIsIDAsCisgICAgICAgICAgICAgICAgWyZdKGNvbnN0IFdyaXRlU3RhdHVzJiB3cml0ZVN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICAqZnJhbWVzID0gd3JpdGVTdGF0dXMucmVwbHkucHJlc2VudGF0aW9uUG9zaXRpb24uZnJhbWVzOworICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPnR2X3NlYyA9IHdyaXRlU3RhdHVzLnJlcGx5LnByZXNlbnRhdGlvblBvc2l0aW9uLnRpbWVTdGFtcC50dlNlYzsKKyAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT50dl9uc2VjID0gd3JpdGVTdGF0dXMucmVwbHkucHJlc2VudGF0aW9uUG9zaXRpb24udGltZVN0YW1wLnR2TlNlYzsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9IGVsc2UgeworICAgICAgICBSZXN1bHQgcmV0dmFsOworICAgICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0UHJlc2VudGF0aW9uUG9zaXRpb24oCisgICAgICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50NjRfdCBoaWRsRnJhbWVzLCBjb25zdCBUaW1lU3BlYyYgaGlkbFRpbWVTdGFtcCkgeworICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpmcmFtZXMgPSBoaWRsRnJhbWVzOworICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT50dl9zZWMgPSBoaWRsVGltZVN0YW1wLnR2U2VjOworICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT50dl9uc2VjID0gaGlkbFRpbWVTdGFtcC50dk5TZWM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFByZXNlbnRhdGlvblBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOworICAgIH0KK30KKworLyoqIFRyYW5zZm9ybSBhIHN0YW5kYXJkIGNvbGxlY3Rpb24gdG8gYW4gSElETCB2ZWN0b3IuICovCit0ZW1wbGF0ZSA8Y2xhc3MgVmFsdWVzLCBjbGFzcyBFbGVtZW50Q29udmVydGVyPgorc3RhdGljIGF1dG8gdHJhbnNmb3JtVG9IaWRsVmVjKGNvbnN0IFZhbHVlcyYgdmFsdWVzLCBFbGVtZW50Q29udmVydGVyIGNvbnZlcnRlcikgeworICAgIGhpZGxfdmVjPGRlY2x0eXBlKGNvbnZlcnRlcigqdmFsdWVzLmJlZ2luKCkpKT4gcmVzdWx0e3ZhbHVlcy5zaXplKCl9OworICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CisgICAgdHJhbnNmb3JtKGJlZ2luKHZhbHVlcyksIGVuZCh2YWx1ZXMpLCBiZWdpbihyZXN1bHQpLCBjb252ZXJ0ZXIpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnVwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgeworICAgIGhhcmR3YXJlOjphdWRpbzo6VjRfMDo6U291cmNlTWV0YWRhdGEgaGFsTWV0YWRhdGEgPSB7CisgICAgICAgIC50cmFja3MgPSB0cmFuc2Zvcm1Ub0hpZGxWZWMoc291cmNlTWV0YWRhdGEudHJhY2tzLAorICAgICAgICAgICAgICBbXShjb25zdCBwbGF5YmFja190cmFja19tZXRhZGF0YSYgbWV0YWRhdGEpIC0+IFBsYXliYWNrVHJhY2tNZXRhZGF0YSB7CisgICAgICAgICAgICAgICAgICByZXR1cm4geworICAgICAgICAgICAgICAgICAgICAudXNhZ2U9c3RhdGljX2Nhc3Q8QXVkaW9Vc2FnZT4obWV0YWRhdGEudXNhZ2UpLAorICAgICAgICAgICAgICAgICAgICAuY29udGVudFR5cGU9c3RhdGljX2Nhc3Q8QXVkaW9Db250ZW50VHlwZT4obWV0YWRhdGEuY29udGVudF90eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgLmdhaW49bWV0YWRhdGEuZ2FpbiwKKyAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgIH0pfTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigidXBkYXRlU291cmNlTWV0YWRhdGEiLCBtU3RyZWFtLT51cGRhdGVTb3VyY2VNZXRhZGF0YShoYWxNZXRhZGF0YSkpOworfQorCit2b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uV3JpdGVSZWFkeSgpIHsKKyAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOworICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm47CisgICAgQUxPR1YoImFzeW5jQ2FsbGJhY2sgb25Xcml0ZVJlYWR5Iik7CisgICAgY2FsbGJhY2stPm9uV3JpdGVSZWFkeSgpOworfQorCit2b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uRHJhaW5SZWFkeSgpIHsKKyAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOworICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm47CisgICAgQUxPR1YoImFzeW5jQ2FsbGJhY2sgb25EcmFpblJlYWR5Iik7CisgICAgY2FsbGJhY2stPm9uRHJhaW5SZWFkeSgpOworfQorCit2b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uRXJyb3IoKSB7CisgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKKyAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuOworICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrIG9uRXJyb3IiKTsKKyAgICBjYWxsYmFjay0+b25FcnJvcigpOworfQorCisKK1N0cmVhbUluSGFsSGlkbDo6U3RyZWFtSW5IYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1Jbj4mIHN0cmVhbSkKKyAgICAgICAgOiBTdHJlYW1IYWxIaWRsKHN0cmVhbS5nZXQoKSksIG1TdHJlYW0oc3RyZWFtKSwgbVJlYWRlckNsaWVudCgwKSwgbUVmR3JvdXAobnVsbHB0cikgeworfQorCitTdHJlYW1JbkhhbEhpZGw6On5TdHJlYW1JbkhhbEhpZGwoKSB7CisgICAgaWYgKG1TdHJlYW0gIT0gMCkgeworICAgICAgICBwcm9jZXNzUmV0dXJuKCJjbG9zZSIsIG1TdHJlYW0tPmNsb3NlKCkpOworICAgICAgICBtU3RyZWFtLmNsZWFyKCk7CisgICAgICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CisgICAgfQorICAgIGlmIChtRWZHcm91cCkgeworICAgICAgICBFdmVudEZsYWc6OmRlbGV0ZUV2ZW50RmxhZygmbUVmR3JvdXApOworICAgIH0KK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZyYW1lU2l6ZSIsIG1TdHJlYW0tPmdldEZyYW1lU2l6ZSgpLCBzaXplKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpzZXRHYWluKGZsb2F0IGdhaW4pIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0R2FpbiIsIG1TdHJlYW0tPnNldEdhaW4oZ2FpbikpOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgICpyZWFkID0gMDsKKworICAgIGlmIChieXRlcyA9PSAwICYmICFtRGF0YU1RKSB7CisgICAgICAgIC8vIENhbid0IGRldGVybWluZSB0aGUgc2l6ZSBmb3IgdGhlIE1RIGJ1ZmZlci4gV2FpdCBmb3IgYSBub24tZW1wdHkgcmVhZCByZXF1ZXN0LgorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIGlmICghbURhdGFNUSAmJiAoc3RhdHVzID0gcHJlcGFyZUZvclJlYWRpbmcoYnl0ZXMpKSAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIFJlYWRQYXJhbWV0ZXJzIHBhcmFtczsKKyAgICBwYXJhbXMuY29tbWFuZCA9IFJlYWRDb21tYW5kOjpSRUFEOworICAgIHBhcmFtcy5wYXJhbXMucmVhZCA9IGJ5dGVzOworICAgIHN0YXR1cyA9IGNhbGxSZWFkZXJUaHJlYWQocGFyYW1zLCAicmVhZCIsCisgICAgICAgICAgICBbJl0oY29uc3QgUmVhZFN0YXR1cyYgcmVhZFN0YXR1cykgeworICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBhdmFpbFRvUmVhZCA9IG1EYXRhTVEtPmF2YWlsYWJsZVRvUmVhZCgpOworICAgICAgICAgICAgICAgIGlmICghbURhdGFNUS0+cmVhZChzdGF0aWNfY2FzdDx1aW50OF90Kj4oYnVmZmVyKSwgc3RkOjptaW4oYnl0ZXMsIGF2YWlsVG9SZWFkKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImRhdGEgbWVzc2FnZSBxdWV1ZSByZWFkIGZhaWxlZCBmb3IgXCJyZWFkXCIiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1dfSUYoYXZhaWxUb1JlYWQgIT0gcmVhZFN0YXR1cy5yZXBseS5yZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgIkhBTCByZWFkIHJlcG9ydCBpbmNvbnNpc3RlbnQ6IG1xID0gJWQsIHN0YXR1cyA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KWF2YWlsVG9SZWFkLCAoaW50MzJfdClyZWFkU3RhdHVzLnJlcGx5LnJlYWQpOworICAgICAgICAgICAgICAgICpyZWFkID0gcmVhZFN0YXR1cy5yZXBseS5yZWFkOworICAgICAgICAgICAgfSk7CisgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICpyZWFkKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmNhbGxSZWFkZXJUaHJlYWQoCisgICAgICAgIGNvbnN0IFJlYWRQYXJhbWV0ZXJzJiBwYXJhbXMsIGNvbnN0IGNoYXIqIGNtZE5hbWUsCisgICAgICAgIFN0cmVhbUluSGFsSGlkbDo6UmVhZGVyQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICBpZiAoIW1Db21tYW5kTVEtPndyaXRlKCZwYXJhbXMpKSB7CisgICAgICAgIEFMT0dXKCJjb21tYW5kIG1lc3NhZ2UgcXVldWUgd3JpdGUgZmFpbGVkIik7CisgICAgICAgIHJldHVybiAtRUFHQUlOOworICAgIH0KKyAgICBtRWZHcm91cC0+d2FrZShzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9GVUxMKSk7CisKKyAgICAvLyBUT0RPOiBSZW1vdmUgbWFudWFsIGV2ZW50IGZsYWcgaGFuZGxpbmcgb25jZSBibG9ja2luZyBNUSBpcyBpbXBsZW1lbnRlZC4gYi8zMzgxNTQyMgorICAgIHVpbnQzMl90IGVmU3RhdGUgPSAwOworcmV0cnk6CisgICAgc3RhdHVzX3QgcmV0ID0gbUVmR3JvdXAtPndhaXQoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRU1QVFkpLCAmZWZTdGF0ZSk7CisgICAgaWYgKGVmU3RhdGUgJiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9FTVBUWSkpIHsKKyAgICAgICAgUmVhZFN0YXR1cyByZWFkU3RhdHVzOworICAgICAgICByZWFkU3RhdHVzLnJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgICAgICBpZiAoIW1TdGF0dXNNUS0+cmVhZCgmcmVhZFN0YXR1cykpIHsKKyAgICAgICAgICAgIEFMT0dFKCJzdGF0dXMgbWVzc2FnZSByZWFkIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgIGlmIChyZWFkU3RhdHVzLnJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICByZXQgPSBPSzsKKyAgICAgICAgICAgIGNhbGxiYWNrKHJlYWRTdGF0dXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gcHJvY2Vzc1JldHVybihjbWROYW1lLCByZWFkU3RhdHVzLnJldHZhbCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRUlOVFIpIHsKKyAgICAgICAgLy8gU3B1cmlvdXMgd2FrZXVwLiBUaGlzIG5vcm1hbGx5IHJldHJpZXMgbm8gbW9yZSB0aGFuIG9uY2UuCisgICAgICAgIGdvdG8gcmV0cnk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6cHJlcGFyZUZvclJlYWRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiB0ZW1wQ29tbWFuZE1ROworICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IHRlbXBEYXRhTVE7CisgICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiB0ZW1wU3RhdHVzTVE7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBwaWRfdCBoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+cHJlcGFyZUZvclJlYWRpbmcoCisgICAgICAgICAgICAxLCBidWZmZXJTaXplLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDb21tYW5kTVE6OkRlc2NyaXB0b3ImIGNvbW1hbmRNUSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YU1ROjpEZXNjcmlwdG9yJiBkYXRhTVEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0YXR1c01ROjpEZXNjcmlwdG9yJiBzdGF0dXNNUSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyZWFkSW5mbyYgaGFsVGhyZWFkSW5mbykgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIHRlbXBDb21tYW5kTVEucmVzZXQobmV3IENvbW1hbmRNUShjb21tYW5kTVEpKTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcERhdGFNUS5yZXNldChuZXcgRGF0YU1RKGRhdGFNUSkpOworICAgICAgICAgICAgICAgICAgICB0ZW1wU3RhdHVzTVEucmVzZXQobmV3IFN0YXR1c01RKHN0YXR1c01RKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wRGF0YU1RLT5pc1ZhbGlkKCkgJiYgdGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBFdmVudEZsYWc6OmNyZWF0ZUV2ZW50RmxhZyh0ZW1wRGF0YU1RLT5nZXRFdmVudEZsYWdXb3JkKCksICZtRWZHcm91cCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaGFsVGhyZWFkUGlkID0gaGFsVGhyZWFkSW5mby5waWQ7CisgICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFRpZCA9IGhhbFRocmVhZEluZm8udGlkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmICghcmV0LmlzT2soKSB8fCByZXR2YWwgIT0gUmVzdWx0OjpPSykgeworICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicHJlcGFyZUZvclJlYWRpbmciLCByZXQsIHJldHZhbCk7CisgICAgfQorICAgIGlmICghdGVtcENvbW1hbmRNUSB8fCAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpIHx8CisgICAgICAgICAgICAhdGVtcERhdGFNUSB8fCAhdGVtcERhdGFNUS0+aXNWYWxpZCgpIHx8CisgICAgICAgICAgICAhdGVtcFN0YXR1c01RIHx8ICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSB8fAorICAgICAgICAgICAgIW1FZkdyb3VwKSB7CisgICAgICAgIEFMT0dFX0lGKCF0ZW1wQ29tbWFuZE1RLCAiRmFpbGVkIHRvIG9idGFpbiBjb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmciKTsKKyAgICAgICAgQUxPR0VfSUYodGVtcENvbW1hbmRNUSAmJiAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpLAorICAgICAgICAgICAgICAgICJDb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOworICAgICAgICBBTE9HRV9JRighdGVtcERhdGFNUSwgIkZhaWxlZCB0byBvYnRhaW4gZGF0YSBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIik7CisgICAgICAgIEFMT0dFX0lGKHRlbXBEYXRhTVEgJiYgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSwgIkRhdGEgbWVzc2FnZSBxdWV1ZSBmb3IgcmVhZGluZyBpcyBpbnZhbGlkIik7CisgICAgICAgIEFMT0dFX0lGKCF0ZW1wU3RhdHVzTVEsICJGYWlsZWQgdG8gb2J0YWluIHN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIik7CisgICAgICAgIEFMT0dFX0lGKHRlbXBTdGF0dXNNUSAmJiAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCksCisgICAgICAgICAgICAgICAgIlN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIGlzIGludmFsaWQiKTsKKyAgICAgICAgQUxPR0VfSUYoIW1FZkdyb3VwLCAiRXZlbnQgZmxhZyBjcmVhdGlvbiBmb3IgcmVhZGluZyBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZCk7CisKKyAgICBtQ29tbWFuZE1RID0gc3RkOjptb3ZlKHRlbXBDb21tYW5kTVEpOworICAgIG1EYXRhTVEgPSBzdGQ6Om1vdmUodGVtcERhdGFNUSk7CisgICAgbVN0YXR1c01RID0gc3RkOjptb3ZlKHRlbXBTdGF0dXNNUSk7CisgICAgbVJlYWRlckNsaWVudCA9IGdldHRpZCgpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0SW5wdXRGcmFtZXNMb3N0IiwgbVN0cmVhbS0+Z2V0SW5wdXRGcmFtZXNMb3N0KCksIGZyYW1lc0xvc3QpOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBpZiAobVJlYWRlckNsaWVudCA9PSBnZXR0aWQoKSAmJiBtQ29tbWFuZE1RKSB7CisgICAgICAgIFJlYWRQYXJhbWV0ZXJzIHBhcmFtczsKKyAgICAgICAgcGFyYW1zLmNvbW1hbmQgPSBSZWFkQ29tbWFuZDo6R0VUX0NBUFRVUkVfUE9TSVRJT047CisgICAgICAgIHJldHVybiBjYWxsUmVhZGVyVGhyZWFkKHBhcmFtcywgImdldENhcHR1cmVQb3NpdGlvbiIsCisgICAgICAgICAgICAgICAgWyZdKGNvbnN0IFJlYWRTdGF0dXMmIHJlYWRTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgKmZyYW1lcyA9IHJlYWRTdGF0dXMucmVwbHkuY2FwdHVyZVBvc2l0aW9uLmZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgKnRpbWUgPSByZWFkU3RhdHVzLnJlcGx5LmNhcHR1cmVQb3NpdGlvbi50aW1lOworICAgICAgICAgICAgICAgIH0pOworICAgIH0gZWxzZSB7CisgICAgICAgIFJlc3VsdCByZXR2YWw7CisgICAgICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRDYXB0dXJlUG9zaXRpb24oCisgICAgICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50NjRfdCBoaWRsRnJhbWVzLCB1aW50NjRfdCBoaWRsVGltZSkgeworICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpmcmFtZXMgPSBoaWRsRnJhbWVzOworICAgICAgICAgICAgICAgICAgICAgICAgKnRpbWUgPSBoaWRsVGltZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0Q2FwdHVyZVBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOworICAgIH0KK30KKworCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmdldEFjdGl2ZU1pY3JvcGhvbmVzKAorICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lc0luZm8pIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEFjdGl2ZU1pY3JvcGhvbmVzKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBoaWRsX3ZlYzxNaWNyb3Bob25lSW5mbz4gbWljQXJyYXlIYWwpIHsKKyAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBtaWNBcnJheUhhbC5zaXplKCk7IGsrKykgeworICAgICAgICAgICAgYXVkaW9fbWljcm9waG9uZV9jaGFyYWN0ZXJpc3RpY190IGRzdDsKKyAgICAgICAgICAgIC8vIGNvbnZlcnQKKyAgICAgICAgICAgIG1pY3JvcGhvbmVJbmZvVG9IYWwobWljQXJyYXlIYWxba10sICZkc3QpOworICAgICAgICAgICAgbWVkaWE6Ok1pY3JvcGhvbmVJbmZvIG1pY3JvcGhvbmUgPSBtZWRpYTo6TWljcm9waG9uZUluZm8oZHN0KTsKKyAgICAgICAgICAgIG1pY3JvcGhvbmVzSW5mby0+cHVzaF9iYWNrKG1pY3JvcGhvbmUpOworICAgICAgICB9CisgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEFjdGl2ZU1pY3JvcGhvbmVzIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnVwZGF0ZVNpbmtNZXRhZGF0YShjb25zdCBTaW5rTWV0YWRhdGEmIHNpbmtNZXRhZGF0YSkgeworICAgIGhhcmR3YXJlOjphdWRpbzo6VjRfMDo6U2lua01ldGFkYXRhIGhhbE1ldGFkYXRhID0geworICAgICAgICAudHJhY2tzID0gdHJhbnNmb3JtVG9IaWRsVmVjKHNpbmtNZXRhZGF0YS50cmFja3MsCisgICAgICAgICAgICAgIFtdKGNvbnN0IHJlY29yZF90cmFja19tZXRhZGF0YSYgbWV0YWRhdGEpIC0+IFJlY29yZFRyYWNrTWV0YWRhdGEgeworICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgICAgICAgICAgLnNvdXJjZT1zdGF0aWNfY2FzdDxBdWRpb1NvdXJjZT4obWV0YWRhdGEuc291cmNlKSwKKyAgICAgICAgICAgICAgICAgICAgLmdhaW49bWV0YWRhdGEuZ2FpbiwKKyAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgIH0pfTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigidXBkYXRlU2lua01ldGFkYXRhIiwgbVN0cmVhbS0+dXBkYXRlU2lua01ldGFkYXRhKGhhbE1ldGFkYXRhKSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFY0XzAKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1IYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtSGFsSGlkbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZGEwZjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtSGFsSGlkbC5oCkBAIC0wLDAgKzEsMjUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfSElETF80XzBfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfSElETF80XzBfSAorCisjaW5jbHVkZSA8YXRvbWljPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby80LjAvSVN0cmVhbS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vNC4wL0lTdHJlYW1Jbi5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vNC4wL0lTdHJlYW1PdXQuaD4KKyNpbmNsdWRlIDxmbXEvRXZlbnRGbGFnLmg+CisjaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKKyNpbmNsdWRlICJTdHJlYW1Qb3dlckxvZy5oIgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SVN0cmVhbTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJU3RyZWFtSW47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SVN0cmVhbU91dDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OkV2ZW50RmxhZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIFJlYWRQYXJhbWV0ZXJzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklTdHJlYW1Jbjo6UmVhZFBhcmFtZXRlcnM7Cit1c2luZyBSZWFkU3RhdHVzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklTdHJlYW1Jbjo6UmVhZFN0YXR1czsKK3VzaW5nIFdyaXRlQ29tbWFuZCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJU3RyZWFtT3V0OjpXcml0ZUNvbW1hbmQ7Cit1c2luZyBXcml0ZVN0YXR1cyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJU3RyZWFtT3V0OjpXcml0ZVN0YXR1czsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIFY0XzAgeworCitjbGFzcyBEZXZpY2VIYWxIaWRsOworCitjbGFzcyBTdHJlYW1IYWxIaWRsIDogcHVibGljIHZpcnR1YWwgU3RyZWFtSGFsSW50ZXJmYWNlLCBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckhpZGwKK3sKKyAgcHVibGljOgorICAgIC8vIFJldHVybiB0aGUgc2FtcGxpbmcgcmF0ZSBpbiBIeiAtIGVnLiA0NDEwMC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpOworCisgICAgLy8gUmV0dXJuIHNpemUgb2YgaW5wdXQvb3V0cHV0IGJ1ZmZlciBpbiBieXRlcyBmb3IgdGhpcyBzdHJlYW0gLSBlZy4gNDgwMC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKTsKKworICAgIC8vIFJldHVybiB0aGUgY2hhbm5lbCBtYXNrLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spOworCisgICAgLy8gUmV0dXJuIHRoZSBhdWRpbyBmb3JtYXQgLSBlLmcuIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOworCisgICAgLy8gQ29udmVuaWVuY2UgbWV0aG9kLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qcm9wZXJ0aWVzKAorICAgICAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrLCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0KTsKKworICAgIC8vIFNldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7CisKKyAgICAvLyBHZXQgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7CisKKyAgICAvLyBBZGQgb3IgcmVtb3ZlIHRoZSBlZmZlY3Qgb24gdGhlIHN0cmVhbS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZEVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOworCisgICAgLy8gUHV0IHRoZSBhdWRpbyBoYXJkd2FyZSBpbnB1dC9vdXRwdXQgaW50byBzdGFuZGJ5IG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFuZGJ5KCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKKworICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOworCisgICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworCisgICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbyk7CisKKyAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbik7CisKKyAgICAvLyBTZXQgdGhlIHByaW9yaXR5IG9mIHRoZSB0aHJlYWQgdGhhdCBpbnRlcmFjdHMgd2l0aCB0aGUgSEFMCisgICAgLy8gKG11c3QgbWF0Y2ggdGhlIHByaW9yaXR5IG9mIHRoZSBhdWRpb2ZsaW5nZXIncyB0aHJlYWQgdGhhdCBjYWxscyAncmVhZCcgLyAnd3JpdGUnKQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50IHByaW9yaXR5KTsKKworICBwcm90ZWN0ZWQ6CisgICAgLy8gU3ViY2xhc3NlcyBjYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgZXhwbGljaXQgU3RyZWFtSGFsSGlkbChJU3RyZWFtICpzdHJlYW0pOworCisgICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIHN0cmVhbS4KKyAgICB2aXJ0dWFsIH5TdHJlYW1IYWxIaWRsKCk7CisKKyAgICBzdGF0dXNfdCBnZXRDYWNoZWRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSk7CisKKyAgICBib29sIHJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShwaWRfdCB0aHJlYWRQaWQsIHBpZF90IHRocmVhZElkKTsKKworICAgIC8vIG1TdHJlYW1Qb3dlckxvZyBpcyB1c2VkIGZvciBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KKyAgICBTdHJlYW1Qb3dlckxvZyBtU3RyZWFtUG93ZXJMb2c7CisKKyAgcHJpdmF0ZToKKyAgICBjb25zdCBpbnQgSEFMX1RIUkVBRF9QUklPUklUWV9ERUZBVUxUID0gLTE7CisgICAgSVN0cmVhbSAqbVN0cmVhbTsKKyAgICBpbnQgbUhhbFRocmVhZFByaW9yaXR5OworICAgIHNpemVfdCBtQ2FjaGVkQnVmZmVyU2l6ZTsKK307CisKK2NsYXNzIFN0cmVhbU91dEhhbEhpZGwgOiBwdWJsaWMgU3RyZWFtT3V0SGFsSW50ZXJmYWNlLCBwdWJsaWMgU3RyZWFtSGFsSGlkbCB7CisgIHB1YmxpYzoKKyAgICAvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgKG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlKSBvZiBhIHN0cmVhbS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpOworCisgICAgLy8gUmV0dXJuIHRoZSBhdWRpbyBoYXJkd2FyZSBkcml2ZXIgZXN0aW1hdGVkIGxhdGVuY3kgaW4gbWlsbGlzZWNvbmRzLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSk7CisKKyAgICAvLyBVc2UgdGhpcyBtZXRob2QgaW4gc2l0dWF0aW9ucyB3aGVyZSBhdWRpbyBtaXhpbmcgaXMgZG9uZSBpbiB0aGUgaGFyZHdhcmUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOworCisgICAgLy8gV3JpdGUgYXVkaW8gYnVmZmVyIHRvIGRyaXZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pOworCisgICAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHdyaXR0ZW4gYnkgdGhlIGF1ZGlvIGRzcCB0byBEQUMgc2luY2UKKyAgICAvLyB0aGUgb3V0cHV0IGhhcyBleGl0ZWQgc3RhbmRieS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpOworCisgICAgLy8gR2V0IHRoZSBsb2NhbCB0aW1lIGF0IHdoaWNoIHRoZSBuZXh0IHdyaXRlIHRvIHRoZSBhdWRpbyBkcml2ZXIgd2lsbCBiZSBwcmVzZW50ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKTsKKworICAgIC8vIFNldCB0aGUgY2FsbGJhY2sgZm9yIG5vdGlmeWluZyBjb21wbGV0aW9uIG9mIG5vbi1ibG9ja2luZyB3cml0ZSBhbmQgZHJhaW4uCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spOworCisgICAgLy8gUmV0dXJucyB3aGV0aGVyIHBhdXNlIGFuZCByZXN1bWUgb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNQYXVzZUFuZFJlc3VtZShib29sICpzdXBwb3J0c1BhdXNlLCBib29sICpzdXBwb3J0c1Jlc3VtZSk7CisKKyAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7CisKKyAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3VtZSgpOworCisgICAgLy8gUmV0dXJucyB3aGV0aGVyIGRyYWluIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0RyYWluKGJvb2wgKnN1cHBvcnRzRHJhaW4pOworCisgICAgLy8gUmVxdWVzdHMgbm90aWZpY2F0aW9uIHdoZW4gZGF0YSBidWZmZXJlZCBieSB0aGUgZHJpdmVyL2hhcmR3YXJlIGhhcyBiZWVuIHBsYXllZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGRyYWluKGJvb2wgZWFybHlOb3RpZnkpOworCisgICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byBmbHVzaCB0aGUgcXVldWVkIGRhdGEuCisgICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaCgpOworCisgICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHByZXNlbnRlZCB0byBhbiBleHRlcm5hbCBvYnNlcnZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKTsKKworICAgIC8vIENhbGxlZCB3aGVuIHRoZSBtZXRhZGF0YSBvZiB0aGUgc3RyZWFtJ3Mgc291cmNlIGhhcyBiZWVuIGNoYW5nZWQuCisgICAgc3RhdHVzX3QgdXBkYXRlU291cmNlTWV0YWRhdGEoY29uc3QgU291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKSBvdmVycmlkZTsKKworICAgIC8vIE1ldGhvZHMgdXNlZCBieSBTdHJlYW1PdXRDYWxsYmFjayAoSElETCkuCisgICAgdm9pZCBvbldyaXRlUmVhZHkoKTsKKyAgICB2b2lkIG9uRHJhaW5SZWFkeSgpOworICAgIHZvaWQgb25FcnJvcigpOworCisgIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIERldmljZUhhbEhpZGw7CisgICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8V3JpdGVDb21tYW5kLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gQ29tbWFuZE1ROworICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBEYXRhTVE7CisgICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8V3JpdGVTdGF0dXMsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBTdGF0dXNNUTsKKworICAgIHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBtQ2FsbGJhY2s7CisgICAgc3A8SVN0cmVhbU91dD4gbVN0cmVhbTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiBtQ29tbWFuZE1ROworICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IG1EYXRhTVE7CisgICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiBtU3RhdHVzTVE7CisgICAgc3RkOjphdG9taWM8cGlkX3Q+IG1Xcml0ZXJDbGllbnQ7CisgICAgRXZlbnRGbGFnKiBtRWZHcm91cDsKKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBTdHJlYW1PdXRIYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1PdXQ+JiBzdHJlYW0pOworCisgICAgdmlydHVhbCB+U3RyZWFtT3V0SGFsSGlkbCgpOworCisgICAgdXNpbmcgV3JpdGVyQ2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgV3JpdGVTdGF0dXMmIHdyaXRlU3RhdHVzKT47CisgICAgc3RhdHVzX3QgY2FsbFdyaXRlclRocmVhZCgKKyAgICAgICAgICAgIFdyaXRlQ29tbWFuZCBjbWQsIGNvbnN0IGNoYXIqIGNtZE5hbWUsCisgICAgICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YVNpemUsIFdyaXRlckNhbGxiYWNrIGNhbGxiYWNrKTsKKyAgICBzdGF0dXNfdCBwcmVwYXJlRm9yV3JpdGluZyhzaXplX3QgYnVmZmVyU2l6ZSk7Cit9OworCitjbGFzcyBTdHJlYW1JbkhhbEhpZGwgOiBwdWJsaWMgU3RyZWFtSW5IYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxIaWRsIHsKKyAgcHVibGljOgorICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7CisKKyAgICAvLyBTZXQgdGhlIGlucHV0IGdhaW4gZm9yIHRoZSBhdWRpbyBkcml2ZXIuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRHYWluKGZsb2F0IGdhaW4pOworCisgICAgLy8gUmVhZCBhdWRpbyBidWZmZXIgaW4gZnJvbSBkcml2ZXIuCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKnJlYWQpOworCisgICAgLy8gUmV0dXJuIHRoZSBhbW91bnQgb2YgaW5wdXQgZnJhbWVzIGxvc3QgaW4gdGhlIGF1ZGlvIGRyaXZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0RnJhbWVzTG9zdCh1aW50MzJfdCAqZnJhbWVzTG9zdCk7CisKKyAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcmVjZWl2ZWQgYW5kCisgICAgLy8gdGhlIGNsb2NrIHRpbWUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZnJhbWUgY291bnQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKTsKKworICAgIC8vIEdldCBhY3RpdmUgbWljcm9waG9uZXMKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKTsKKworICAgIC8vIENhbGxlZCB3aGVuIHRoZSBtZXRhZGF0YSBvZiB0aGUgc3RyZWFtJ3Mgc2luayBoYXMgYmVlbiBjaGFuZ2VkLgorICAgIHN0YXR1c190IHVwZGF0ZVNpbmtNZXRhZGF0YShjb25zdCBTaW5rTWV0YWRhdGEmIHNpbmtNZXRhZGF0YSkgb3ZlcnJpZGU7CisKKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsSGlkbDsKKyAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxSZWFkUGFyYW1ldGVycywgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IENvbW1hbmRNUTsKKyAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTx1aW50OF90LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gRGF0YU1ROworICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPFJlYWRTdGF0dXMsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBTdGF0dXNNUTsKKworICAgIHNwPElTdHJlYW1Jbj4gbVN0cmVhbTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiBtQ29tbWFuZE1ROworICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IG1EYXRhTVE7CisgICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiBtU3RhdHVzTVE7CisgICAgc3RkOjphdG9taWM8cGlkX3Q+IG1SZWFkZXJDbGllbnQ7CisgICAgRXZlbnRGbGFnKiBtRWZHcm91cDsKKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBTdHJlYW1JbkhhbEhpZGwoY29uc3Qgc3A8SVN0cmVhbUluPiYgc3RyZWFtKTsKKworICAgIHZpcnR1YWwgflN0cmVhbUluSGFsSGlkbCgpOworCisgICAgdXNpbmcgUmVhZGVyQ2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUmVhZFN0YXR1cyYgcmVhZFN0YXR1cyk+OworICAgIHN0YXR1c190IGNhbGxSZWFkZXJUaHJlYWQoCisgICAgICAgICAgICBjb25zdCBSZWFkUGFyYW1ldGVycyYgcGFyYW1zLCBjb25zdCBjaGFyKiBjbWROYW1lLCBSZWFkZXJDYWxsYmFjayBjYWxsYmFjayk7CisgICAgc3RhdHVzX3QgcHJlcGFyZUZvclJlYWRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpOworfTsKKworfSAvLyBuYW1lc3BhY2UgVjRfMAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0hJRExfNF8wX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1IYWxMb2NhbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtSGFsTG9jYWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZDk2YmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtSGFsTG9jYWwuY3BwCkBAIC0wLDAgKzEsMzU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJTdHJlYW1IYWxMb2NhbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgorI2luY2x1ZGUgIlN0cmVhbUhhbExvY2FsLmgiCisjaW5jbHVkZSAiVmVyc2lvblV0aWxzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBWNF8wIHsKKworU3RyZWFtSGFsTG9jYWw6OlN0cmVhbUhhbExvY2FsKGF1ZGlvX3N0cmVhbV90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpCisgICAgICAgIDogbURldmljZShkZXZpY2UpLAorICAgICAgICAgIG1TdHJlYW0oc3RyZWFtKSB7CisgICAgLy8gSW5zdHJ1bWVudCBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KKyAgICAvLyBOb3RlOiBUaGlzIGFzc3VtZXMgY2hhbm5lbCBtYXNrLCBmb3JtYXQsIGFuZCBzYW1wbGUgcmF0ZSBkbyBub3QgY2hhbmdlIGFmdGVyIGNyZWF0aW9uLgorICAgIGlmIChtU3RyZWFtICE9IG51bGxwdHIgJiYgbVN0cmVhbVBvd2VyTG9nLmlzVXNlckRlYnVnT3JFbmdCdWlsZCgpKSB7CisgICAgICAgIG1TdHJlYW1Qb3dlckxvZy5pbml0KG1TdHJlYW0tPmdldF9zYW1wbGVfcmF0ZShtU3RyZWFtKSwKKyAgICAgICAgICAgICAgICBtU3RyZWFtLT5nZXRfY2hhbm5lbHMobVN0cmVhbSksCisgICAgICAgICAgICAgICAgbVN0cmVhbS0+Z2V0X2Zvcm1hdChtU3RyZWFtKSk7CisgICAgfQorfQorCitTdHJlYW1IYWxMb2NhbDo6flN0cmVhbUhhbExvY2FsKCkgeworICAgIG1TdHJlYW0gPSAwOworICAgIG1EZXZpY2UuY2xlYXIoKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpIHsKKyAgICAqcmF0ZSA9IG1TdHJlYW0tPmdldF9zYW1wbGVfcmF0ZShtU3RyZWFtKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSkgeworICAgICpzaXplID0gbVN0cmVhbS0+Z2V0X2J1ZmZlcl9zaXplKG1TdHJlYW0pOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrKSB7CisgICAgKm1hc2sgPSBtU3RyZWFtLT5nZXRfY2hhbm5lbHMobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpIHsKKyAgICAqZm9ybWF0ID0gbVN0cmVhbS0+Z2V0X2Zvcm1hdChtU3RyZWFtKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRBdWRpb1Byb3BlcnRpZXMoCisgICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgeworICAgICpzYW1wbGVSYXRlID0gbVN0cmVhbS0+Z2V0X3NhbXBsZV9yYXRlKG1TdHJlYW0pOworICAgICptYXNrID0gbVN0cmVhbS0+Z2V0X2NoYW5uZWxzKG1TdHJlYW0pOworICAgICpmb3JtYXQgPSBtU3RyZWFtLT5nZXRfZm9ybWF0KG1TdHJlYW0pOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgeworICAgIHJldHVybiBtU3RyZWFtLT5zZXRfcGFyYW1ldGVycyhtU3RyZWFtLCBrdlBhaXJzLnN0cmluZygpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7CisgICAgY2hhciAqaGFsVmFsdWVzID0gbVN0cmVhbS0+Z2V0X3BhcmFtZXRlcnMobVN0cmVhbSwga2V5cy5zdHJpbmcoKSk7CisgICAgaWYgKGhhbFZhbHVlcyAhPSBOVUxMKSB7CisgICAgICAgIHZhbHVlcy0+c2V0VG8oaGFsVmFsdWVzKTsKKyAgICAgICAgZnJlZShoYWxWYWx1ZXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIHZhbHVlcy0+Y2xlYXIoKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6YWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4pIHsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMKCJMb2NhbCBzdHJlYW1zIGNhbiBub3QgaGF2ZSBlZmZlY3RzIik7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6cmVtb3ZlRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4pIHsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMKCJMb2NhbCBzdHJlYW1zIGNhbiBub3QgaGF2ZSBlZmZlY3RzIik7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6c3RhbmRieSgpIHsKKyAgICByZXR1cm4gbVN0cmVhbS0+c3RhbmRieShtU3RyZWFtKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmR1bXAoaW50IGZkKSB7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVN0cmVhbS0+ZHVtcChtU3RyZWFtLCBmZCk7CisgICAgbVN0cmVhbVBvd2VyTG9nLmR1bXAoZmQpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpzZXRIYWxUaHJlYWRQcmlvcml0eShpbnQpIHsKKyAgICAvLyBEb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIGFzIGxvY2FsIGhhbCBpcyBleGVjdXRlZCBieSBhdWRpb2ZsaW5nZXIgZGlyZWN0bHkKKyAgICAvLyBvbiB0aGUgc2FtZSB0aHJlYWQuCisgICAgcmV0dXJuIE9LOworfQorCitTdHJlYW1PdXRIYWxMb2NhbDo6U3RyZWFtT3V0SGFsTG9jYWwoYXVkaW9fc3RyZWFtX291dF90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpCisgICAgICAgIDogU3RyZWFtSGFsTG9jYWwoJnN0cmVhbS0+Y29tbW9uLCBkZXZpY2UpLCBtU3RyZWFtKHN0cmVhbSkgeworfQorCitTdHJlYW1PdXRIYWxMb2NhbDo6flN0cmVhbU91dEhhbExvY2FsKCkgeworICAgIG1DYWxsYmFjay5jbGVhcigpOworICAgIG1EZXZpY2UtPmNsb3NlT3V0cHV0U3RyZWFtKG1TdHJlYW0pOworICAgIG1TdHJlYW0gPSAwOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgeworICAgICpzaXplID0gYXVkaW9fc3RyZWFtX291dF9mcmFtZV9zaXplKG1TdHJlYW0pOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldExhdGVuY3kodWludDMyX3QgKmxhdGVuY3kpIHsKKyAgICAqbGF0ZW5jeSA9IG1TdHJlYW0tPmdldF9sYXRlbmN5KG1TdHJlYW0pOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkgeworICAgIGlmIChtU3RyZWFtLT5zZXRfdm9sdW1lID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+c2V0X3ZvbHVtZShtU3RyZWFtLCBsZWZ0LCByaWdodCk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjp3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKSB7CisgICAgc3NpemVfdCB3cml0ZVJlc3VsdCA9IG1TdHJlYW0tPndyaXRlKG1TdHJlYW0sIGJ1ZmZlciwgYnl0ZXMpOworICAgIGlmICh3cml0ZVJlc3VsdCA+IDApIHsKKyAgICAgICAgKndyaXR0ZW4gPSB3cml0ZVJlc3VsdDsKKyAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICp3cml0dGVuKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSB7CisgICAgICAgICp3cml0dGVuID0gMDsKKyAgICAgICAgcmV0dXJuIHdyaXRlUmVzdWx0OworICAgIH0KK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpIHsKKyAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X3JlbmRlcl9wb3NpdGlvbihtU3RyZWFtLCBkc3BGcmFtZXMpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0TmV4dFdyaXRlVGltZXN0YW1wKGludDY0X3QgKnRpbWVzdGFtcCkgeworICAgIGlmIChtU3RyZWFtLT5nZXRfbmV4dF93cml0ZV90aW1lc3RhbXAgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5nZXRfbmV4dF93cml0ZV90aW1lc3RhbXAobVN0cmVhbSwgdGltZXN0YW1wKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjaykgeworICAgIGlmIChtU3RyZWFtLT5zZXRfY2FsbGJhY2sgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHN0YXR1c190IHJlc3VsdCA9IG1TdHJlYW0tPnNldF9jYWxsYmFjayhtU3RyZWFtLCBTdHJlYW1PdXRIYWxMb2NhbDo6YXN5bmNDYWxsYmFjaywgdGhpcyk7CisgICAgaWYgKHJlc3VsdCA9PSBPSykgeworICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gc3RhdGljCitpbnQgU3RyZWFtT3V0SGFsTG9jYWw6OmFzeW5jQ2FsbGJhY2soc3RyZWFtX2NhbGxiYWNrX2V2ZW50X3QgZXZlbnQsIHZvaWQqLCB2b2lkICpjb29raWUpIHsKKyAgICAvLyBXZSBhY3QgYXMgaWYgd2UgZ2F2ZSBhIHdwPFN0cmVhbU91dEhhbExvY2FsPiB0byBIQUwuIFRoaXMgd2F5IHdlIHNob3VsZCBoYW5kbGUKKyAgICAvLyBjb3JyZWN0bHkgdGhlIGNhc2Ugd2hlbiB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGlsZSBTdHJlYW1PdXRIYWxMb2NhbCdzIGRlc3RydWN0b3IgaXMKKyAgICAvLyBhbHJlYWR5IHJ1bm5pbmcsIGJlY2F1c2UgdGhlIGRlc3RydWN0b3IgaXMgaW52b2tlZCBhZnRlciB0aGUgcmVmY291bnQgaGFzIGJlZW4gYXRvbWljYWxseQorICAgIC8vIGRlY3JlbWVudGVkLgorICAgIHdwPFN0cmVhbU91dEhhbExvY2FsPiB3ZWFrU2VsZihzdGF0aWNfY2FzdDxTdHJlYW1PdXRIYWxMb2NhbCo+KGNvb2tpZSkpOworICAgIHNwPFN0cmVhbU91dEhhbExvY2FsPiBzZWxmID0gd2Vha1NlbGYucHJvbW90ZSgpOworICAgIGlmIChzZWxmID09IDApIHJldHVybiAwOworICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayA9IHNlbGYtPm1DYWxsYmFjay5wcm9tb3RlKCk7CisgICAgaWYgKGNhbGxiYWNrID09IDApIHJldHVybiAwOworICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrKCkgZXZlbnQgJWQiLCBldmVudCk7CisgICAgc3dpdGNoIChldmVudCkgeworICAgICAgICBjYXNlIFNUUkVBTV9DQktfRVZFTlRfV1JJVEVfUkVBRFk6CisgICAgICAgICAgICBjYWxsYmFjay0+b25Xcml0ZVJlYWR5KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTVFJFQU1fQ0JLX0VWRU5UX0RSQUlOX1JFQURZOgorICAgICAgICAgICAgY2FsbGJhY2stPm9uRHJhaW5SZWFkeSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1RSRUFNX0NCS19FVkVOVF9FUlJPUjoKKyAgICAgICAgICAgIGNhbGxiYWNrLT5vbkVycm9yKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dXKCJhc3luY0NhbGxiYWNrKCkgdW5rbm93biBldmVudCAlZCIsIGV2ZW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoYm9vbCAqc3VwcG9ydHNQYXVzZSwgYm9vbCAqc3VwcG9ydHNSZXN1bWUpIHsKKyAgICAqc3VwcG9ydHNQYXVzZSA9IG1TdHJlYW0tPnBhdXNlICE9IE5VTEw7CisgICAgKnN1cHBvcnRzUmVzdW1lID0gbVN0cmVhbS0+cmVzdW1lICE9IE5VTEw7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6cGF1c2UoKSB7CisgICAgaWYgKG1TdHJlYW0tPnBhdXNlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+cGF1c2UobVN0cmVhbSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpyZXN1bWUoKSB7CisgICAgaWYgKG1TdHJlYW0tPnJlc3VtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPnJlc3VtZShtU3RyZWFtKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbikgeworICAgICpzdXBwb3J0c0RyYWluID0gbVN0cmVhbS0+ZHJhaW4gIT0gTlVMTDsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpkcmFpbihib29sIGVhcmx5Tm90aWZ5KSB7CisgICAgaWYgKG1TdHJlYW0tPmRyYWluID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+ZHJhaW4obVN0cmVhbSwgZWFybHlOb3RpZnkgPyBBVURJT19EUkFJTl9FQVJMWV9OT1RJRlkgOiBBVURJT19EUkFJTl9BTEwpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Zmx1c2goKSB7CisgICAgaWYgKG1TdHJlYW0tPmZsdXNoID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+Zmx1c2gobVN0cmVhbSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCkgeworICAgIGlmIChtU3RyZWFtLT5nZXRfcHJlc2VudGF0aW9uX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbihtU3RyZWFtLCBmcmFtZXMsIHRpbWVzdGFtcCk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjp1cGRhdGVTb3VyY2VNZXRhZGF0YShjb25zdCBTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpIHsKKyAgICBpZiAobVN0cmVhbS0+dXBkYXRlX3NvdXJjZV9tZXRhZGF0YSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgY29uc3Qgc291cmNlX21ldGFkYXRhX3QgbWV0YWRhdGEgeworICAgICAgICAudHJhY2tfY291bnQgPSBzb3VyY2VNZXRhZGF0YS50cmFja3Muc2l6ZSgpLAorICAgICAgICAvLyBjb25zdCBjYXN0IGlzIGZpbmUgYXMgaXQgaXMgaW4gYSBjb25zdCBzdHJ1Y3R1cmUKKyAgICAgICAgLnRyYWNrcyA9IGNvbnN0X2Nhc3Q8cGxheWJhY2tfdHJhY2tfbWV0YWRhdGEqPihzb3VyY2VNZXRhZGF0YS50cmFja3MuZGF0YSgpKSwKKyAgICB9OworICAgIG1TdHJlYW0tPnVwZGF0ZV9zb3VyY2VfbWV0YWRhdGEobVN0cmVhbSwgJm1ldGFkYXRhKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzdGFydCgpIHsKKyAgICBpZiAobVN0cmVhbS0+c3RhcnQgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5zdGFydChtU3RyZWFtKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN0b3AoKSB7CisgICAgaWYgKG1TdHJlYW0tPnN0b3AgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5zdG9wKG1TdHJlYW0pOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Y3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pIHsKKyAgICBpZiAobVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyKG1TdHJlYW0sIG1pblNpemVGcmFtZXMsIGluZm8pOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgeworICAgIGlmIChtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uKG1TdHJlYW0sIHBvc2l0aW9uKTsKK30KKworU3RyZWFtSW5IYWxMb2NhbDo6U3RyZWFtSW5IYWxMb2NhbChhdWRpb19zdHJlYW1faW5fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKQorICAgICAgICA6IFN0cmVhbUhhbExvY2FsKCZzdHJlYW0tPmNvbW1vbiwgZGV2aWNlKSwgbVN0cmVhbShzdHJlYW0pIHsKK30KKworU3RyZWFtSW5IYWxMb2NhbDo6flN0cmVhbUluSGFsTG9jYWwoKSB7CisgICAgbURldmljZS0+Y2xvc2VJbnB1dFN0cmVhbShtU3RyZWFtKTsKKyAgICBtU3RyZWFtID0gMDsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgeworICAgICpzaXplID0gYXVkaW9fc3RyZWFtX2luX2ZyYW1lX3NpemUobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzZXRHYWluKGZsb2F0IGdhaW4pIHsKKyAgICByZXR1cm4gbVN0cmVhbS0+c2V0X2dhaW4obVN0cmVhbSwgZ2Fpbik7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCkgeworICAgIHNzaXplX3QgcmVhZFJlc3VsdCA9IG1TdHJlYW0tPnJlYWQobVN0cmVhbSwgYnVmZmVyLCBieXRlcyk7CisgICAgaWYgKHJlYWRSZXN1bHQgPiAwKSB7CisgICAgICAgICpyZWFkID0gcmVhZFJlc3VsdDsKKyAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyggYnVmZmVyLCAqcmVhZCk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgeworICAgICAgICAqcmVhZCA9IDA7CisgICAgICAgIHJldHVybiByZWFkUmVzdWx0OworICAgIH0KK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0SW5wdXRGcmFtZXNMb3N0KHVpbnQzMl90ICpmcmFtZXNMb3N0KSB7CisgICAgKmZyYW1lc0xvc3QgPSBtU3RyZWFtLT5nZXRfaW5wdXRfZnJhbWVzX2xvc3QobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKSB7CisgICAgaWYgKG1TdHJlYW0tPmdldF9jYXB0dXJlX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X2NhcHR1cmVfcG9zaXRpb24obVN0cmVhbSwgZnJhbWVzLCB0aW1lKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6dXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSB7CisgICAgaWYgKG1TdHJlYW0tPnVwZGF0ZV9zaW5rX21ldGFkYXRhID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBjb25zdCBzaW5rX21ldGFkYXRhX3QgbWV0YWRhdGEgeworICAgICAgICAudHJhY2tfY291bnQgPSBzaW5rTWV0YWRhdGEudHJhY2tzLnNpemUoKSwKKyAgICAgICAgLy8gY29uc3QgY2FzdCBpcyBmaW5lIGFzIGl0IGlzIGluIGEgY29uc3Qgc3RydWN0dXJlCisgICAgICAgIC50cmFja3MgPSBjb25zdF9jYXN0PHJlY29yZF90cmFja19tZXRhZGF0YSo+KHNpbmtNZXRhZGF0YS50cmFja3MuZGF0YSgpKSwKKyAgICB9OworICAgIG1TdHJlYW0tPnVwZGF0ZV9zaW5rX21ldGFkYXRhKG1TdHJlYW0sICZtZXRhZGF0YSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzdGFydCgpIHsKKyAgICBpZiAobVN0cmVhbS0+c3RhcnQgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5zdGFydChtU3RyZWFtKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c3RvcCgpIHsKKyAgICBpZiAobVN0cmVhbS0+c3RvcCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPnN0b3AobVN0cmVhbSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSB7CisgICAgaWYgKG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlciA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlcihtU3RyZWFtLCBtaW5TaXplRnJhbWVzLCBpbmZvKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgeworICAgIGlmIChtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uKG1TdHJlYW0sIHBvc2l0aW9uKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpIHsKKyAgICBpZiAobVN0cmVhbS0+Z2V0X2FjdGl2ZV9taWNyb3Bob25lcyA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgc2l6ZV90IGFjdHVhbF9taWNzID0gQVVESU9fTUlDUk9QSE9ORV9NQVhfQ09VTlQ7CisgICAgYXVkaW9fbWljcm9waG9uZV9jaGFyYWN0ZXJpc3RpY190IG1pY19hcnJheVtBVURJT19NSUNST1BIT05FX01BWF9DT1VOVF07CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVN0cmVhbS0+Z2V0X2FjdGl2ZV9taWNyb3Bob25lcyhtU3RyZWFtLCAmbWljX2FycmF5WzBdLCAmYWN0dWFsX21pY3MpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYWN0dWFsX21pY3M7IGkrKykgeworICAgICAgICBtZWRpYTo6TWljcm9waG9uZUluZm8gbWljcm9waG9uZUluZm8gPSBtZWRpYTo6TWljcm9waG9uZUluZm8obWljX2FycmF5W2ldKTsKKyAgICAgICAgbWljcm9waG9uZXMtPnB1c2hfYmFjayhtaWNyb3Bob25lSW5mbyk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK30gLy8gbmFtZXNwYWNlIFY0XzAKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1IYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbUhhbExvY2FsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIzNzUwOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1IYWxMb2NhbC5oCkBAIC0wLDAgKzEsMjIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfTE9DQUxfNF8wX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0xPQ0FMXzRfMF9ICisKKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaD4KKyNpbmNsdWRlICJTdHJlYW1Qb3dlckxvZy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgVjRfMCB7CisKK2NsYXNzIERldmljZUhhbExvY2FsOworCitjbGFzcyBTdHJlYW1IYWxMb2NhbCA6IHB1YmxpYyB2aXJ0dWFsIFN0cmVhbUhhbEludGVyZmFjZQoreworICBwdWJsaWM6CisgICAgLy8gUmV0dXJuIHRoZSBzYW1wbGluZyByYXRlIGluIEh6IC0gZWcuIDQ0MTAwLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSk7CisKKyAgICAvLyBSZXR1cm4gc2l6ZSBvZiBpbnB1dC9vdXRwdXQgYnVmZmVyIGluIGJ5dGVzIGZvciB0aGlzIHN0cmVhbSAtIGVnLiA0ODAwLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpOworCisgICAgLy8gUmV0dXJuIHRoZSBjaGFubmVsIG1hc2suCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzayk7CisKKyAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGZvcm1hdCAtIGUuZy4gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7CisKKyAgICAvLyBDb252ZW5pZW5jZSBtZXRob2QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1Byb3BlcnRpZXMoCisgICAgICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2ssIGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOworCisgICAgLy8gU2V0IGF1ZGlvIHN0cmVhbSBwYXJhbWV0ZXJzLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKTsKKworICAgIC8vIEdldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKTsKKworICAgIC8vIEFkZCBvciByZW1vdmUgdGhlIGVmZmVjdCBvbiB0aGUgc3RyZWFtLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7CisKKyAgICAvLyBQdXQgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0L291dHB1dCBpbnRvIHN0YW5kYnkgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YW5kYnkoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOworCisgICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCkgPSAwOworCisgICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpID0gMDsKKworICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pID0gMDsKKworICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSA9IDA7CisKKyAgICAvLyBTZXQgdGhlIHByaW9yaXR5IG9mIHRoZSB0aHJlYWQgdGhhdCBpbnRlcmFjdHMgd2l0aCB0aGUgSEFMCisgICAgLy8gKG11c3QgbWF0Y2ggdGhlIHByaW9yaXR5IG9mIHRoZSBhdWRpb2ZsaW5nZXIncyB0aHJlYWQgdGhhdCBjYWxscyAncmVhZCcgLyAnd3JpdGUnKQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50IHByaW9yaXR5KTsKKworICBwcm90ZWN0ZWQ6CisgICAgLy8gU3ViY2xhc3NlcyBjYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgU3RyZWFtSGFsTG9jYWwoYXVkaW9fc3RyZWFtX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSk7CisKKyAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgc3RyZWFtLgorICAgIHZpcnR1YWwgflN0cmVhbUhhbExvY2FsKCk7CisKKyAgICBzcDxEZXZpY2VIYWxMb2NhbD4gbURldmljZTsKKworICAgIC8vIG1TdHJlYW1Qb3dlckxvZyBpcyB1c2VkIGZvciBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KKyAgICBTdHJlYW1Qb3dlckxvZyBtU3RyZWFtUG93ZXJMb2c7CisKKyAgcHJpdmF0ZToKKyAgICBhdWRpb19zdHJlYW1fdCAqbVN0cmVhbTsKK307CisKK2NsYXNzIFN0cmVhbU91dEhhbExvY2FsIDogcHVibGljIFN0cmVhbU91dEhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbExvY2FsIHsKKyAgcHVibGljOgorICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7CisKKyAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGhhcmR3YXJlIGRyaXZlciBlc3RpbWF0ZWQgbGF0ZW5jeSBpbiBtaWxsaXNlY29uZHMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KTsKKworICAgIC8vIFVzZSB0aGlzIG1ldGhvZCBpbiBzaXR1YXRpb25zIHdoZXJlIGF1ZGlvIG1peGluZyBpcyBkb25lIGluIHRoZSBoYXJkd2FyZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCk7CisKKyAgICAvLyBXcml0ZSBhdWRpbyBidWZmZXIgdG8gZHJpdmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbik7CisKKyAgICAvLyBSZXR1cm4gdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgd3JpdHRlbiBieSB0aGUgYXVkaW8gZHNwIHRvIERBQyBzaW5jZQorICAgIC8vIHRoZSBvdXRwdXQgaGFzIGV4aXRlZCBzdGFuZGJ5LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcyk7CisKKyAgICAvLyBHZXQgdGhlIGxvY2FsIHRpbWUgYXQgd2hpY2ggdGhlIG5leHQgd3JpdGUgdG8gdGhlIGF1ZGlvIGRyaXZlciB3aWxsIGJlIHByZXNlbnRlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRXcml0ZVRpbWVzdGFtcChpbnQ2NF90ICp0aW1lc3RhbXApOworCisgICAgLy8gU2V0IHRoZSBjYWxsYmFjayBmb3Igbm90aWZ5aW5nIGNvbXBsZXRpb24gb2Ygbm9uLWJsb2NraW5nIHdyaXRlIGFuZCBkcmFpbi4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayk7CisKKyAgICAvLyBSZXR1cm5zIHdoZXRoZXIgcGF1c2UgYW5kIHJlc3VtZSBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKTsKKworICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKKworICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdW1lKCk7CisKKyAgICAvLyBSZXR1cm5zIHdoZXRoZXIgZHJhaW4gb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbik7CisKKyAgICAvLyBSZXF1ZXN0cyBub3RpZmljYXRpb24gd2hlbiBkYXRhIGJ1ZmZlcmVkIGJ5IHRoZSBkcml2ZXIvaGFyZHdhcmUgaGFzIGJlZW4gcGxheWVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZHJhaW4oYm9vbCBlYXJseU5vdGlmeSk7CisKKyAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIGZsdXNoIHRoZSBxdWV1ZWQgZGF0YS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKCk7CisKKyAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcHJlc2VudGVkIHRvIGFuIGV4dGVybmFsIG9ic2VydmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApOworCisgICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7CisKKyAgICAvLyBTdG9wIGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisKKyAgICAvLyBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBidWZmZXIgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKTsKKworICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKTsKKworICAgIC8vIENhbGxlZCB3aGVuIHRoZSBtZXRhZGF0YSBvZiB0aGUgc3RyZWFtJ3Mgc291cmNlIGhhcyBiZWVuIGNoYW5nZWQuCisgICAgc3RhdHVzX3QgdXBkYXRlU291cmNlTWV0YWRhdGEoY29uc3QgU291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKSBvdmVycmlkZTsKKworICBwcml2YXRlOgorICAgIGF1ZGlvX3N0cmVhbV9vdXRfdCAqbVN0cmVhbTsKKyAgICB3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gbUNhbGxiYWNrOworCisgICAgZnJpZW5kIGNsYXNzIERldmljZUhhbExvY2FsOworCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIFN0cmVhbU91dEhhbExvY2FsKGF1ZGlvX3N0cmVhbV9vdXRfdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKTsKKworICAgIHZpcnR1YWwgflN0cmVhbU91dEhhbExvY2FsKCk7CisKKyAgICBzdGF0aWMgaW50IGFzeW5jQ2FsbGJhY2soc3RyZWFtX2NhbGxiYWNrX2V2ZW50X3QgZXZlbnQsIHZvaWQgKnBhcmFtLCB2b2lkICpjb29raWUpOworfTsKKworY2xhc3MgU3RyZWFtSW5IYWxMb2NhbCA6IHB1YmxpYyBTdHJlYW1JbkhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbExvY2FsIHsKKyAgcHVibGljOgorICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7CisKKyAgICAvLyBTZXQgdGhlIGlucHV0IGdhaW4gZm9yIHRoZSBhdWRpbyBkcml2ZXIuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRHYWluKGZsb2F0IGdhaW4pOworCisgICAgLy8gUmVhZCBhdWRpbyBidWZmZXIgaW4gZnJvbSBkcml2ZXIuCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKnJlYWQpOworCisgICAgLy8gUmV0dXJuIHRoZSBhbW91bnQgb2YgaW5wdXQgZnJhbWVzIGxvc3QgaW4gdGhlIGF1ZGlvIGRyaXZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0RnJhbWVzTG9zdCh1aW50MzJfdCAqZnJhbWVzTG9zdCk7CisKKyAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcmVjZWl2ZWQgYW5kCisgICAgLy8gdGhlIGNsb2NrIHRpbWUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZnJhbWUgY291bnQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKTsKKworICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOworCisgICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworCisgICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbyk7CisKKyAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbik7CisKKyAgICAvLyBHZXQgYWN0aXZlIG1pY3JvcGhvbmVzCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7CisKKyAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNpbmsgaGFzIGJlZW4gY2hhbmdlZC4KKyAgICBzdGF0dXNfdCB1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIG92ZXJyaWRlOworCisgIHByaXZhdGU6CisgICAgYXVkaW9fc3RyZWFtX2luX3QgKm1TdHJlYW07CisKKyAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsTG9jYWw7CisKKyAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgU3RyZWFtSW5IYWxMb2NhbChhdWRpb19zdHJlYW1faW5fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKTsKKworICAgIHZpcnR1YWwgflN0cmVhbUluSGFsTG9jYWwoKTsKK307CisKK30gLy8gbmFtZXNwYWNlIFY0XzAKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9MT0NBTF80XzBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbVBvd2VyTG9nLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtUG93ZXJMb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2I3MjAxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbVBvd2VyTG9nLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX1BPV0VSX0xPR180XzBfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9QT1dFUl9MT0dfNF8wX0gKKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Nsb2NrLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvUG93ZXJMb2cuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgVjRfMCB7CisKK2NsYXNzIFN0cmVhbVBvd2VyTG9nIHsKK3B1YmxpYzoKKyAgICBTdHJlYW1Qb3dlckxvZygpIDoKKyAgICAgICAgbUlzVXNlckRlYnVnT3JFbmdCdWlsZChpc191c2VyZGVidWdfb3JfZW5nX2J1aWxkKCkpLAorICAgICAgICBtUG93ZXJMb2cobnVsbHB0ciksCisgICAgICAgIG1GcmFtZVNpemUoMCkgeworICAgICAgICAvLyB1c2UgaW5pdCgpIHRvIHNldCB1cCB0aGUgcG93ZXIgbG9nLgorICAgIH0KKworICAgIH5TdHJlYW1Qb3dlckxvZygpIHsKKyAgICAgICAgcG93ZXJfbG9nX2Rlc3Ryb3kobVBvd2VyTG9nKTsgLy8gT0sgZm9yIG51bGwgbVBvd2VyTG9nCisgICAgICAgIG1Qb3dlckxvZyA9IG51bGxwdHI7CisgICAgfQorCisgICAgLy8gQSBvbmUtdGltZSBpbml0aWFsaXphdGlvbiAoZG8gbm90IGNhbGwgdHdpY2UpIGJlZm9yZSB1c2luZyBTdHJlYW1Qb3dlckxvZy4KKyAgICB2b2lkIGluaXQodWludDMyX3Qgc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgeworICAgICAgICBpZiAobVBvd2VyTG9nID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIC8vIE5vdGU6IEEgd2F5IHRvIGdldCBjaGFubmVsIGNvdW50IGZvciBib3RoIGlucHV0IGFuZCBvdXRwdXQgY2hhbm5lbCBtYXNrcworICAgICAgICAgICAgLy8gYnV0IGRvZXMgbm90IGNoZWNrIHZhbGlkaXR5IG9mIHRoZSBjaGFubmVsIG1hc2suCisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBwb3Bjb3VudChhdWRpb19jaGFubmVsX21hc2tfZ2V0X2JpdHMoY2hhbm5lbE1hc2spKTsKKyAgICAgICAgICAgIG1GcmFtZVNpemUgPSBjaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCk7CisgICAgICAgICAgICBpZiAobUZyYW1lU2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBjb25zdCBzaXplX3Qga1Bvd2VyTG9nRnJhbWVzUGVyRW50cnkgPQorICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylzYW1wbGVSYXRlICoga1Bvd2VyTG9nU2FtcGxpbmdJbnRlcnZhbE1zIC8gMTAwMDsKKyAgICAgICAgICAgICAgICBtUG93ZXJMb2cgPSBwb3dlcl9sb2dfY3JlYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtQb3dlckxvZ0VudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBrUG93ZXJMb2dGcmFtZXNQZXJFbnRyeSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gbVBvd2VyTG9nIG1heSBiZSBOVUxMIChub3QgdGhlIHJpZ2h0IGJ1aWxkLCBmb3JtYXQgbm90IGFjY2VwdGVkLCBldGMuKS4KKyAgICB9CisKKyAgICAvLyBEdW1wIHRoZSBwb3dlciBsb2cgdG8gZmQuCisgICAgdm9pZCBkdW1wKGludCBmZCkgY29uc3QgeworICAgICAgICAvLyBPSyBmb3IgbnVsbCBtUG93ZXJMb2cKKyAgICAgICAgKHZvaWQpcG93ZXJfbG9nX2R1bXAoCisgICAgICAgICAgICAgICAgbVBvd2VyTG9nLCBmZCwgIiAgICAgICIgLyogcHJlZml4ICovLCBrUG93ZXJMb2dMaW5lcywgMCAvKiBsaW1pdF9ucyAqLyk7CisgICAgfQorCisgICAgLy8gTG9nIHRoZSBhdWRpbyBkYXRhIGNvbnRhaW5lZCBpbiBidWZmZXIuCisgICAgdm9pZCBsb2coY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZUluQnl0ZXMpIGNvbnN0IHsKKyAgICAgICAgaWYgKG1Qb3dlckxvZyAhPSBudWxscHRyKSB7IC8vIG1GcmFtZVNpemUgaXMgYWx3YXlzIG5vbnplcm8gaWYgbVBvd2VyTG9nIGV4aXN0cy4KKyAgICAgICAgICAgIHBvd2VyX2xvZ19sb2coCisgICAgICAgICAgICAgICAgICAgIG1Qb3dlckxvZywgYnVmZmVyLCBzaXplSW5CeXRlcyAvIG1GcmFtZVNpemUsIGF1ZGlvX3V0aWxzX2dldF9yZWFsX3RpbWVfbnMoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIGlzVXNlckRlYnVnT3JFbmdCdWlsZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Jc1VzZXJEZWJ1Z09yRW5nQnVpbGQ7CisgICAgfQorCitwcml2YXRlOgorCisgICAgc3RhdGljIGlubGluZSBib29sIGlzX3VzZXJkZWJ1Z19vcl9lbmdfYnVpbGQoKSB7CisgICAgICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICAgICAgKHZvaWQpcHJvcGVydHlfZ2V0KCJyby5idWlsZC50eXBlIiwgdmFsdWUsICJ1bmtub3duIik7IC8vIGlnbm9yZSBhY3R1YWwgbGVuZ3RoCisgICAgICAgIHJldHVybiBzdHJjbXAodmFsdWUsICJ1c2VyZGVidWciKSA9PSAwIHx8IHN0cmNtcCh2YWx1ZSwgImVuZyIpID09IDA7CisgICAgfQorCisgICAgLy8gQXVkaW8gc2lnbmFsIHBvd2VyIGxvZyBjb25maWd1cmF0aW9uLgorICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1Bvd2VyTG9nTGluZXMgPSA0MDsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ1NhbXBsaW5nSW50ZXJ2YWxNcyA9IDUwOworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1Bvd2VyTG9nRW50cmllcyA9ICgxIC8qIG1pbnV0ZXMgKi8gKiA2MCAvKiBzZWNvbmRzICovICogMTAwMCAvKiBtc2VjICovCisgICAgICAgICAgICAvIGtQb3dlckxvZ1NhbXBsaW5nSW50ZXJ2YWxNcyk7CisKKyAgICBjb25zdCBib29sIG1Jc1VzZXJEZWJ1Z09yRW5nQnVpbGQ7CisgICAgcG93ZXJfbG9nX3QgKm1Qb3dlckxvZzsKKyAgICBzaXplX3QgbUZyYW1lU2l6ZTsKK307CisKK30gLy8gbmFtZXNwYWNlIFY0XzAKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX1BPV0VSX0xPR180XzBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1ZlcnNpb25VdGlscy5oIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1ZlcnNpb25VdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNDZjMmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvVmVyc2lvblV0aWxzLmgKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9WRVJTSU9OX1VUSUxTXzRfMF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfVkVSU0lPTl9VVElMU180XzBfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby80LjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpQYXJhbWV0ZXJWYWx1ZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpSZXN1bHQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgVjRfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQ2FsbGJhY2s+CitSZXR1cm48dm9pZD4gZ2V0UGFyYW1ldGVycyhUJiBvYmplY3QsIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkbF92ZWM8aGlkbF9zdHJpbmc+IGtleXMsIENhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgcmV0dXJuIG9iamVjdC0+Z2V0UGFyYW1ldGVycyhjb250ZXh0LCBrZXlzLCBjYWxsYmFjayk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorUmV0dXJuPFJlc3VsdD4gc2V0UGFyYW1ldGVycyhUJiBvYmplY3QsIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4ga2V5cykgeworICAgIHJldHVybiBvYmplY3QtPnNldFBhcmFtZXRlcnMoY29udGV4dCwga2V5cyk7Cit9CisKK30gLy8gbmFtZXNwYWNlIHV0aWxzCit9IC8vIG5hbWVzcGFjZSBWNF8wCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1ZFUlNJT05fVVRJTFNfNF8wX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9pbmNsdWRlL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL2luY2x1ZGUvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJmNmRlMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9pbmNsdWRlL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9IWUJSSURfNF8wX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hZQlJJRF80XzBfSAorCisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBWNF8wIHsKKworY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQgOiBwdWJsaWMgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UKK3sKKyAgcHVibGljOgorICAgIC8vIE9wZW5zIGEgZGV2aWNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUbyBjbG9zZSB0aGUgZGV2aWNlLCBpdCBpcworICAgIC8vIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKTsKKworICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZTsKKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCgpOworCisgICAgdmlydHVhbCB+RGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoKTsKKworICAgIHNwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBtTG9jYWxGYWN0b3J5OworICAgIHNwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBtSGlkbEZhY3Rvcnk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBWNF8wCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSFlCUklEXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvaW5jbHVkZS9saWJhdWRpb2hhbC80LjAvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvaW5jbHVkZS9saWJhdWRpb2hhbC80LjAvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgwYjdhMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9pbmNsdWRlL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuaApAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVFNfRkFDVE9SWV9IQUxfSElETF80XzBfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVFNfRkFDVE9SWV9IQUxfSElETF80XzBfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvNC4wL0lFZmZlY3RzRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0LzQuMC90eXBlcy5oPgorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgVjRfMCB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OkVmZmVjdERlc2NyaXB0b3I7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpJRWZmZWN0c0ZhY3Rvcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKKworY2xhc3MgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsIDogcHVibGljIEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLCBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckhpZGwKK3sKKyAgcHVibGljOgorICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBkaWZmZXJlbnQgZWZmZWN0cyBpbiBhbGwgbG9hZGVkIGxpYnJhcmllcy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5TnVtYmVyRWZmZWN0cyh1aW50MzJfdCAqcE51bUVmZmVjdHMpOworCisgICAgLy8gUmV0dXJucyBhIGRlc2NyaXB0b3Igb2YgdGhlIG5leHQgYXZhaWxhYmxlIGVmZmVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldERlc2NyaXB0b3IodWludDMyX3QgaW5kZXgsCisgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcik7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsCisgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcik7CisKKyAgICAvLyBDcmVhdGVzIGFuIGVmZmVjdCBlbmdpbmUgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgorICAgIC8vIFRvIHJlbGVhc2UgdGhlIGVmZmVjdCBlbmdpbmUsIGl0IGlzIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMKKyAgICAvLyB0byB0aGUgcmV0dXJuZWQgZWZmZWN0IG9iamVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwKKyAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklkLCBpbnQzMl90IGlvSWQsCisgICAgICAgICAgICBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+ICplZmZlY3QpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wRWZmZWN0cyhpbnQgZmQpOworCisgICAgc3RhdHVzX3QgYWxsb2NhdGVCdWZmZXIoc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgbWlycm9yQnVmZmVyKHZvaWQqIGV4dGVybmFsLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSBvdmVycmlkZTsKKworICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZTsKKworICAgIHNwPElFZmZlY3RzRmFjdG9yeT4gbUVmZmVjdHNGYWN0b3J5OworICAgIGhpZGxfdmVjPEVmZmVjdERlc2NyaXB0b3I+IG1MYXN0RGVzY3JpcHRvcnM7CisKKyAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCk7CisgICAgdmlydHVhbCB+RWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCk7CisKKyAgICBzdGF0dXNfdCBxdWVyeUFsbERlc2NyaXB0b3JzKCk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBWNF8wCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVFNfRkFDVE9SWV9IQUxfSElETF80XzBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvQW5kcm9pZC5icCBiL21lZGlhL2xpYmF1ZGlvaGFsL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E1ZGYyNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1NiBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJhdWRpb2hhbCIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5jcHAiLAorICAgICAgICAiRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuY3BwIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uZWZmZWN0QDIuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdEA0LjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0AyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0A0LjAiLAorICAgICAgICAibGliYXVkaW9oYWxAMi4wIiwKKyAgICAgICAgImxpYmF1ZGlvaGFsQDQuMCIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb2hhbF9oZWFkZXJzIgorICAgIF0KK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJhdWRpb2hhbF9kZWF0aGhhbmRsZXIiLAorCisgICAgc3JjczogWworICAgICAgICAiSGFsRGVhdGhIYW5kbGVySGlkbC5jcHAiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvaGFsX2hlYWRlcnMiCisgICAgXQorfQorCitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJhdWRpb2hhbF9oZWFkZXJzIiwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvQW5kcm9pZC5tayBiL21lZGlhL2xpYmF1ZGlvaGFsL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNzkwOGUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgIGxpYmF1ZGlvdXRpbHMgXAotICAgIGxpYmN1dGlscyAgIFwKLSAgICBsaWJsb2cgICAgICBcCi0gICAgbGlidXRpbHMgICAgXAotICAgIGxpYmhhcmR3YXJlCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSBcCi0gICAgRGV2aWNlSGFsTG9jYWwuY3BwICAgICAgICAgIFwKLSAgICBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5jcHAgXAotICAgIERldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwICBcCi0gICAgU3RyZWFtSGFsTG9jYWwuY3BwCi0KLUxPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCi0KLWlmZXEgKCQoVVNFX0xFR0FDWV9MT0NBTF9BVURJT19IQUwpLCB0cnVlKQotCi0jIFVzZSBhdWRpb2hhbCBkaXJlY3RseSB3L28gaHdiaW5kZXIgbWlkZGxld2FyZS4KLSMgVGhpcyBpcyBmb3IgcGVyZm9ybWFuY2UgY29tcGFyaXNvbiBhbmQgZGVidWdnaW5nIG9ubHkuCi0KLUxPQ0FMX1NSQ19GSUxFUyArPSBcCi0gICAgRWZmZWN0QnVmZmVySGFsTG9jYWwuY3BwICAgIFwKLSAgICBFZmZlY3RzRmFjdG9yeUhhbExvY2FsLmNwcCAgXAotICAgIEVmZmVjdEhhbExvY2FsLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IFwKLSAgICBsaWJlZmZlY3RzCi0KLUxPQ0FMX0NGTEFHUyArPSAtRFVTRV9MRUdBQ1lfTE9DQUxfQVVESU9fSEFMCi0KLWVsc2UgICMgaWYgIVVTRV9MRUdBQ1lfTE9DQUxfQVVESU9fSEFMCi0KLUxPQ0FMX1NSQ19GSUxFUyArPSBcCi0gICAgQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwICAgXAotICAgIEhhbERlYXRoSGFuZGxlckhpZGwuY3BwICAgIFwKLSAgICBEZXZpY2VIYWxIaWRsLmNwcCAgICAgICAgICBcCi0gICAgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmNwcCAgXAotICAgIEVmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwICAgIFwKLSAgICBFZmZlY3RIYWxIaWRsLmNwcCAgICAgICAgICBcCi0gICAgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcCAgXAotICAgIFN0cmVhbUhhbEhpZGwuY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gXAotICAgIGxpYmJhc2UgICAgICAgICAgXAotICAgIGxpYmZtcSAgICAgICAgICAgXAotICAgIGxpYmh3YmluZGVyICAgICAgXAotICAgIGxpYmhpZGxiYXNlICAgICAgXAotICAgIGxpYmhpZGxtZW1vcnkgICAgXAotICAgIGxpYmhpZGx0cmFuc3BvcnQgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuYXVkaW9AMi4wICAgICAgICAgICAgIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkAyLjAgICAgICBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25AMi4wLXV0aWwgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uZWZmZWN0QDIuMCAgICAgIFwKLSAgICBhbmRyb2lkLmhpZGwuYWxsb2NhdG9yQDEuMCAgICAgICAgICAgICBcCi0gICAgYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAgICAgICAgICAgICAgICAgXAotICAgIGxpYm1lZGlhX2hlbHBlciAgXAotICAgIGxpYm1lZGlhdXRpbHMKLQotZW5kaWYgICMgVVNFX0xFR0FDWV9MT0NBTF9BVURJT19IQUwKLQotTE9DQUxfQ19JTkNMVURFUyA6PSAkKExPQ0FMX1BBVEgpL2luY2x1ZGUKLQotTE9DQUxfRVhQT1JUX0NfSU5DTFVERV9ESVJTIDo9ICQoTE9DQUxfUEFUSCkvaW5jbHVkZQotCi1MT0NBTF9NT0RVTEUgOj0gbGliYXVkaW9oYWwKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlSGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VIYWxIaWRsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDllZjk5MS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VIYWxIaWRsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlSGFsSGlkbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lQcmltYXJ5RGV2aWNlLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KLSNpbmNsdWRlIDxod2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiRGV2aWNlSGFsSGlkbC5oIgotI2luY2x1ZGUgIkhpZGxVdGlscy5oIgotI2luY2x1ZGUgIlN0cmVhbUhhbEhpZGwuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9Db25maWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb0RldmljZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvSW5wdXRGbGFnOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9PdXRwdXRGbGFnOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9QYXRjaEhhbmRsZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvUG9ydDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvUG9ydENvbmZpZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvTW9kZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvU291cmNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OkRldmljZUFkZHJlc3M7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVByaW1hcnlEZXZpY2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6UGFyYW1ldGVyVmFsdWU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6UmVzdWx0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1uYW1lc3BhY2UgewotCi1zdGF0dXNfdCBkZXZpY2VBZGRyZXNzRnJvbUhhbCgKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwgY29uc3QgY2hhciogaGFsQWRkcmVzcywgRGV2aWNlQWRkcmVzcyogYWRkcmVzcykgewotICAgIGFkZHJlc3MtPmRldmljZSA9IEF1ZGlvRGV2aWNlKGRldmljZSk7Ci0KLSAgICBpZiAoYWRkcmVzcyA9PSBudWxscHRyIHx8IHN0cm5sZW4oaGFsQWRkcmVzcywgQVVESU9fREVWSUNFX01BWF9BRERSRVNTX0xFTikgPT0gMCkgewotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotICAgIGNvbnN0IGJvb2wgaXNJbnB1dCA9IChkZXZpY2UgJiBBVURJT19ERVZJQ0VfQklUX0lOKSAhPSAwOwotICAgIGlmIChpc0lucHV0KSBkZXZpY2UgJj0gfkFVRElPX0RFVklDRV9CSVRfSU47Ci0gICAgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9BTExfQTJEUCkgIT0gMCkKLSAgICAgICAgICAgIHx8IChpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0EyRFApICE9IDApKSB7Ci0gICAgICAgIGludCBzdGF0dXMgPSBzc2NhbmYoaGFsQWRkcmVzcywKLSAgICAgICAgICAgICAgICAiJWhoWDolaGhYOiVoaFg6JWhoWDolaGhYOiVoaFgiLAotICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLm1hY1swXSwgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzFdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbMl0sCi0gICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzNdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbNF0sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1s1XSk7Ci0gICAgICAgIHJldHVybiBzdGF0dXMgPT0gNiA/IE9LIDogQkFEX1ZBTFVFOwotICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0lQKSAhPSAwKQotICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9JUCkgIT0gMCkpIHsKLSAgICAgICAgaW50IHN0YXR1cyA9IHNzY2FuZihoYWxBZGRyZXNzLAotICAgICAgICAgICAgICAgICIlaGh1LiVoaHUuJWhodS4laGh1IiwKLSAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5pcHY0WzBdLCAmYWRkcmVzcy0+YWRkcmVzcy5pcHY0WzFdLAotICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbMl0sICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbM10pOwotICAgICAgICByZXR1cm4gc3RhdHVzID09IDQgPyBPSyA6IEJBRF9WQUxVRTsKLSAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9BTExfVVNCKSkgIT0gMAotICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9BTExfVVNCKSkgIT0gMCkgewotICAgICAgICBpbnQgc3RhdHVzID0gc3NjYW5mKGhhbEFkZHJlc3MsCi0gICAgICAgICAgICAgICAgImNhcmQ9JWQ7ZGV2aWNlPSVkIiwKLSAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5hbHNhLmNhcmQsICZhZGRyZXNzLT5hZGRyZXNzLmFsc2EuZGV2aWNlKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1cyA9PSAyID8gT0sgOiBCQURfVkFMVUU7Ci0gICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQlVTKSAhPSAwKQotICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9CVVMpICE9IDApKSB7Ci0gICAgICAgIGlmIChoYWxBZGRyZXNzICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGFkZHJlc3MtPmJ1c0FkZHJlc3MgPSBoYWxBZGRyZXNzOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCkpICE9IDAKLSAgICAgICAgICAgIHx8IChpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCkgIT0gMCkpIHsKLSAgICAgICAgaWYgKGhhbEFkZHJlc3MgIT0gTlVMTCkgewotICAgICAgICAgICAgYWRkcmVzcy0+clN1Ym1peEFkZHJlc3MgPSBoYWxBZGRyZXNzOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLURldmljZUhhbEhpZGw6OkRldmljZUhhbEhpZGwoY29uc3Qgc3A8SURldmljZT4mIGRldmljZSkKLSAgICAgICAgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiRGV2aWNlIiksIG1EZXZpY2UoZGV2aWNlKSwKLSAgICAgICAgICBtUHJpbWFyeURldmljZShJUHJpbWFyeURldmljZTo6Y2FzdEZyb20oZGV2aWNlKSkgewotfQotCi1EZXZpY2VIYWxIaWRsOjp+RGV2aWNlSGFsSGlkbCgpIHsKLSAgICBpZiAobURldmljZSAhPSAwKSB7Ci0gICAgICAgIG1EZXZpY2UuY2xlYXIoKTsKLSAgICAgICAgaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldFN1cHBvcnRlZERldmljZXModWludDMyX3QqKSB7Ci0gICAgLy8gT2Jzb2xldGUuCi0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjppbml0Q2hlY2soKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImluaXRDaGVjayIsIG1EZXZpY2UtPmluaXRDaGVjaygpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0Vm9pY2VWb2x1bWUiLCBtUHJpbWFyeURldmljZS0+c2V0Vm9pY2VWb2x1bWUodm9sdW1lKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNYXN0ZXJWb2x1bWUiLCBtUHJpbWFyeURldmljZS0+c2V0TWFzdGVyVm9sdW1lKHZvbHVtZSkpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVByaW1hcnlEZXZpY2UtPmdldE1hc3RlclZvbHVtZSgKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgZmxvYXQgdikgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICp2b2x1bWUgPSB2OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNYXN0ZXJWb2x1bWUiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNb2RlIiwgbVByaW1hcnlEZXZpY2UtPnNldE1vZGUoQXVkaW9Nb2RlKG1vZGUpKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnNldE1pY011dGUoYm9vbCBzdGF0ZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNaWNNdXRlIiwgbURldmljZS0+c2V0TWljTXV0ZShzdGF0ZSkpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0TWljTXV0ZSgKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgYm9vbCBtdXRlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKnN0YXRlID0gbXV0ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TWljTXV0ZSIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWFzdGVyTXV0ZShib29sIHN0YXRlKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1hc3Rlck11dGUiLCBtRGV2aWNlLT5zZXRNYXN0ZXJNdXRlKHN0YXRlKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRNYXN0ZXJNdXRlKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBib29sIG11dGUpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqc3RhdGUgPSBtdXRlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNYXN0ZXJNdXRlIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gaGlkbFBhcmFtczsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJhbWV0ZXJzRnJvbUhhbChrdlBhaXJzLCAmaGlkbFBhcmFtcyk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0UGFyYW1ldGVycyIsIG1EZXZpY2UtPnNldFBhcmFtZXRlcnMoaGlkbFBhcmFtcykpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcykgewotICAgIHZhbHVlcy0+Y2xlYXIoKTsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gaGlkbEtleXM7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0ga2V5c0Zyb21IYWwoa2V5cywgJmhpZGxLZXlzKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldFBhcmFtZXRlcnMoCi0gICAgICAgICAgICBoaWRsS2V5cywKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+JiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyc1RvSGFsKHBhcmFtZXRlcnMsIHZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFBhcmFtZXRlcnMiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldElucHV0QnVmZmVyU2l6ZSgKLSAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLCBzaXplX3QgKnNpemUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBBdWRpb0NvbmZpZyBoaWRsQ29uZmlnOwotICAgIEhpZGxVdGlsczo6YXVkaW9Db25maWdGcm9tSGFsKCpjb25maWcsICZoaWRsQ29uZmlnKTsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRJbnB1dEJ1ZmZlclNpemUoCi0gICAgICAgICAgICBoaWRsQ29uZmlnLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50NjRfdCBidWZmZXJTaXplKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGJ1ZmZlclNpemUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRJbnB1dEJ1ZmZlclNpemUiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6Om9wZW5PdXRwdXRTdHJlYW0oCi0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZT4gKm91dFN0cmVhbSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIERldmljZUFkZHJlc3MgaGlkbERldmljZTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXZpY2VBZGRyZXNzRnJvbUhhbChkZXZpY2VzLCBhZGRyZXNzLCAmaGlkbERldmljZSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgICBBdWRpb0NvbmZpZyBoaWRsQ29uZmlnOwotICAgIEhpZGxVdGlsczo6YXVkaW9Db25maWdGcm9tSGFsKCpjb25maWcsICZoaWRsQ29uZmlnKTsKLSAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPm9wZW5PdXRwdXRTdHJlYW0oCi0gICAgICAgICAgICBoYW5kbGUsCi0gICAgICAgICAgICBoaWRsRGV2aWNlLAotICAgICAgICAgICAgaGlkbENvbmZpZywKLSAgICAgICAgICAgIEF1ZGlvT3V0cHV0RmxhZyhmbGFncyksCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElTdHJlYW1PdXQ+JiByZXN1bHQsIGNvbnN0IEF1ZGlvQ29uZmlnJiBzdWdnZXN0ZWRDb25maWcpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqb3V0U3RyZWFtID0gbmV3IFN0cmVhbU91dEhhbEhpZGwocmVzdWx0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ1RvSGFsKHN1Z2dlc3RlZENvbmZpZywgY29uZmlnKTsKLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJvcGVuT3V0cHV0U3RyZWFtIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpvcGVuSW5wdXRTdHJlYW0oCi0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAotICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gKmluU3RyZWFtKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgRGV2aWNlQWRkcmVzcyBoaWRsRGV2aWNlOwotICAgIHN0YXR1c190IHN0YXR1cyA9IGRldmljZUFkZHJlc3NGcm9tSGFsKGRldmljZXMsIGFkZHJlc3MsICZoaWRsRGV2aWNlKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7Ci0gICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+b3BlbklucHV0U3RyZWFtKAotICAgICAgICAgICAgaGFuZGxlLAotICAgICAgICAgICAgaGlkbERldmljZSwKLSAgICAgICAgICAgIGhpZGxDb25maWcsCi0gICAgICAgICAgICBBdWRpb0lucHV0RmxhZyhmbGFncyksCi0gICAgICAgICAgICBBdWRpb1NvdXJjZShzb3VyY2UpLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBzcDxJU3RyZWFtSW4+JiByZXN1bHQsIGNvbnN0IEF1ZGlvQ29uZmlnJiBzdWdnZXN0ZWRDb25maWcpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqaW5TdHJlYW0gPSBuZXcgU3RyZWFtSW5IYWxIaWRsKHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEhpZGxVdGlsczo6YXVkaW9Db25maWdUb0hhbChzdWdnZXN0ZWRDb25maWcsIGNvbmZpZyk7Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigib3BlbklucHV0U3RyZWFtIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzdXBwb3J0c0F1ZGlvUGF0Y2hlcyhib29sICpzdXBwb3J0c1BhdGNoZXMpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3VwcG9ydHNBdWRpb1BhdGNoZXMiLCBtRGV2aWNlLT5zdXBwb3J0c0F1ZGlvUGF0Y2hlcygpLCBzdXBwb3J0c1BhdGNoZXMpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpjcmVhdGVBdWRpb1BhdGNoKAotICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NvdXJjZXMsCi0gICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKLSAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKLSAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKLSAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaGlkbF92ZWM8QXVkaW9Qb3J0Q29uZmlnPiBoaWRsU291cmNlcywgaGlkbFNpbmtzOwotICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0Q29uZmlnc0Zyb21IYWwobnVtX3NvdXJjZXMsIHNvdXJjZXMsICZoaWRsU291cmNlcyk7Ci0gICAgSGlkbFV0aWxzOjphdWRpb1BvcnRDb25maWdzRnJvbUhhbChudW1fc2lua3MsIHNpbmtzLCAmaGlkbFNpbmtzKTsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5jcmVhdGVBdWRpb1BhdGNoKAotICAgICAgICAgICAgaGlkbFNvdXJjZXMsIGhpZGxTaW5rcywKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgQXVkaW9QYXRjaEhhbmRsZSBoaWRsUGF0Y2gpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqcGF0Y2ggPSBzdGF0aWNfY2FzdDxhdWRpb19wYXRjaF9oYW5kbGVfdD4oaGlkbFBhdGNoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiY3JlYXRlQXVkaW9QYXRjaCIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicmVsZWFzZUF1ZGlvUGF0Y2giLCBtRGV2aWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaCkpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBBdWRpb1BvcnQgaGlkbFBvcnQ7Ci0gICAgSGlkbFV0aWxzOjphdWRpb1BvcnRGcm9tSGFsKCpwb3J0LCAmaGlkbFBvcnQpOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldEF1ZGlvUG9ydCgKLSAgICAgICAgICAgIGhpZGxQb3J0LAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBBdWRpb1BvcnQmIHApIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydFRvSGFsKHAsIHBvcnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRBdWRpb1BvcnQiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIEF1ZGlvUG9ydENvbmZpZyBoaWRsQ29uZmlnOwotICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0Q29uZmlnRnJvbUhhbCgqY29uZmlnLCAmaGlkbENvbmZpZyk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldEF1ZGlvUG9ydENvbmZpZyIsIG1EZXZpY2UtPnNldEF1ZGlvUG9ydENvbmZpZyhoaWRsQ29uZmlnKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmR1bXAoaW50IGZkKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgbmF0aXZlX2hhbmRsZV90KiBoaWRsSGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7Ci0gICAgaGlkbEhhbmRsZS0+ZGF0YVswXSA9IGZkOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5kZWJ1Z0R1bXAoaGlkbEhhbmRsZSk7Ci0gICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImR1bXAiLCByZXQpOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VIYWxIaWRsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NTFiNTEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlSGFsSGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9ISURMX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0hJRExfSAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvSURldmljZS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lQcmltYXJ5RGV2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmg+Ci0KLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SURldmljZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJUHJpbWFyeURldmljZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBEZXZpY2VIYWxIaWRsIDogcHVibGljIERldmljZUhhbEludGVyZmFjZSwgcHVibGljIENvbnZlcnNpb25IZWxwZXJIaWRsCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBTZXRzIHRoZSB2YWx1ZSBvZiAnZGV2aWNlcycgdG8gYSBiaXRtYXNrIG9mIDEgb3IgbW9yZSB2YWx1ZXMgb2YgYXVkaW9fZGV2aWNlc190LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3VwcG9ydGVkRGV2aWNlcyh1aW50MzJfdCAqZGV2aWNlcyk7Ci0KLSAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIGF1ZGlvIGhhcmR3YXJlIGludGVyZmFjZSBoYXMgYmVlbiBpbml0aWFsaXplZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpOwotCi0gICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgb2YgYSB2b2ljZSBjYWxsLiBSYW5nZSBpcyBiZXR3ZWVuIDAuMCBhbmQgMS4wLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKTsKLQotICAgIC8vIFNldCB0aGUgYXVkaW8gdm9sdW1lIGZvciBhbGwgYXVkaW8gYWN0aXZpdGllcyBvdGhlciB0aGFuIHZvaWNlIGNhbGwuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKTsKLQotICAgIC8vIEdldCB0aGUgY3VycmVudCBtYXN0ZXIgdm9sdW1lIHZhbHVlIGZvciB0aGUgSEFMLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyVm9sdW1lKGZsb2F0ICp2b2x1bWUpOwotCi0gICAgLy8gQ2FsbGVkIHdoZW4gdGhlIGF1ZGlvIG1vZGUgY2hhbmdlcy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpOwotCi0gICAgLy8gTXV0aW5nIGNvbnRyb2wuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNaWNNdXRlKGJvb2wgc3RhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljTXV0ZShib29sICpzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyTXV0ZShib29sICpzdGF0ZSk7Ci0KLSAgICAvLyBTZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpOwotCi0gICAgLy8gR2V0IGdsb2JhbCBhdWRpbyBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpOwotCi0gICAgLy8gUmV0dXJucyBhdWRpbyBpbnB1dCBidWZmZXIgc2l6ZSBhY2NvcmRpbmcgdG8gcGFyYW1ldGVycyBwYXNzZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEJ1ZmZlclNpemUoY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBhdWRpbyBoYXJkd2FyZSBvdXRwdXQgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIGNsb3NlZAotICAgIC8vIGJ5IHJlbGVhc2luZyBhbGwgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKTsKLQotICAgIC8vIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBhdWRpbyBoYXJkd2FyZSBpbnB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCi0gICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuSW5wdXRTdHJlYW0oCi0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAotICAgICAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSk7Ci0KLSAgICAvLyBSZXR1cm5zIHdoZXRoZXIgY3JlYXRlQXVkaW9QYXRjaCBhbmQgcmVsZWFzZUF1ZGlvUGF0Y2ggb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNBdWRpb1BhdGNoZXMoYm9vbCAqc3VwcG9ydHNQYXRjaGVzKTsKLQotICAgIC8vIENyZWF0ZXMgYW4gYXVkaW8gcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goCi0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NvdXJjZXMsCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZXMsCi0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NpbmtzLAotICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaCk7Ci0KLSAgICAvLyBSZWxlYXNlcyBhbiBhdWRpbyBwYXRjaC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoKTsKLQotICAgIC8vIEZpbGxzIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpOwotCi0gICAgLy8gU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbi4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEhpZGw7Ci0gICAgc3A8SURldmljZT4gbURldmljZTsKLSAgICBzcDxJUHJpbWFyeURldmljZT4gbVByaW1hcnlEZXZpY2U7ICAvLyBOdWxsIGlmIGl0J3Mgbm90IGEgcHJpbWFyeSBkZXZpY2UuCi0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgZXhwbGljaXQgRGV2aWNlSGFsSGlkbChjb25zdCBzcDxJRGV2aWNlPiYgZGV2aWNlKTsKLQotICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBkZXZpY2UuCi0gICAgdmlydHVhbCB+RGV2aWNlSGFsSGlkbCgpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlSGFsTG9jYWwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlSGFsTG9jYWwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzA5OGY1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZUhhbExvY2FsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJEZXZpY2VIYWxMb2NhbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiRGV2aWNlSGFsTG9jYWwuaCIKLSNpbmNsdWRlICJTdHJlYW1IYWxMb2NhbC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLURldmljZUhhbExvY2FsOjpEZXZpY2VIYWxMb2NhbChhdWRpb19od19kZXZpY2VfdCAqZGV2KQotICAgICAgICA6IG1EZXYoZGV2KSB7Ci19Ci0KLURldmljZUhhbExvY2FsOjp+RGV2aWNlSGFsTG9jYWwoKSB7Ci0gICAgaW50IHN0YXR1cyA9IGF1ZGlvX2h3X2RldmljZV9jbG9zZShtRGV2KTsKLSAgICBBTE9HV19JRihzdGF0dXMsICJFcnJvciBjbG9zaW5nIGF1ZGlvIGh3IGRldmljZSAlcDogJXMiLCBtRGV2LCBzdHJlcnJvcigtc3RhdHVzKSk7Ci0gICAgbURldiA9IDA7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRTdXBwb3J0ZWREZXZpY2VzKHVpbnQzMl90ICpkZXZpY2VzKSB7Ci0gICAgaWYgKG1EZXYtPmdldF9zdXBwb3J0ZWRfZGV2aWNlcyA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgKmRldmljZXMgPSBtRGV2LT5nZXRfc3VwcG9ydGVkX2RldmljZXMobURldik7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6aW5pdENoZWNrKCkgewotICAgIHJldHVybiBtRGV2LT5pbml0X2NoZWNrKG1EZXYpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKSB7Ci0gICAgcmV0dXJuIG1EZXYtPnNldF92b2ljZV92b2x1bWUobURldiwgdm9sdW1lKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpIHsKLSAgICBpZiAobURldi0+c2V0X21hc3Rlcl92b2x1bWUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtRGV2LT5zZXRfbWFzdGVyX3ZvbHVtZShtRGV2LCB2b2x1bWUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0TWFzdGVyVm9sdW1lKGZsb2F0ICp2b2x1bWUpIHsKLSAgICBpZiAobURldi0+Z2V0X21hc3Rlcl92b2x1bWUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtRGV2LT5nZXRfbWFzdGVyX3ZvbHVtZShtRGV2LCB2b2x1bWUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSkgewotICAgIHJldHVybiBtRGV2LT5zZXRfbW9kZShtRGV2LCBtb2RlKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldE1pY011dGUoYm9vbCBzdGF0ZSkgewotICAgIHJldHVybiBtRGV2LT5zZXRfbWljX211dGUobURldiwgc3RhdGUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0TWljTXV0ZShib29sICpzdGF0ZSkgewotICAgIHJldHVybiBtRGV2LT5nZXRfbWljX211dGUobURldiwgc3RhdGUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TWFzdGVyTXV0ZShib29sIHN0YXRlKSB7Ci0gICAgaWYgKG1EZXYtPnNldF9tYXN0ZXJfbXV0ZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1EZXYtPnNldF9tYXN0ZXJfbXV0ZShtRGV2LCBzdGF0ZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKSB7Ci0gICAgaWYgKG1EZXYtPmdldF9tYXN0ZXJfbXV0ZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1EZXYtPmdldF9tYXN0ZXJfbXV0ZShtRGV2LCBzdGF0ZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpIHsKLSAgICByZXR1cm4gbURldi0+c2V0X3BhcmFtZXRlcnMobURldiwga3ZQYWlycy5zdHJpbmcoKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcykgewotICAgIGNoYXIgKmhhbFZhbHVlcyA9IG1EZXYtPmdldF9wYXJhbWV0ZXJzKG1EZXYsIGtleXMuc3RyaW5nKCkpOwotICAgIGlmIChoYWxWYWx1ZXMgIT0gTlVMTCkgewotICAgICAgICB2YWx1ZXMtPnNldFRvKGhhbFZhbHVlcyk7Ci0gICAgICAgIGZyZWUoaGFsVmFsdWVzKTsKLSAgICB9IGVsc2UgewotICAgICAgICB2YWx1ZXMtPmNsZWFyKCk7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldElucHV0QnVmZmVyU2l6ZSgKLSAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLCBzaXplX3QgKnNpemUpIHsKLSAgICAqc2l6ZSA9IG1EZXYtPmdldF9pbnB1dF9idWZmZXJfc2l6ZShtRGV2LCBjb25maWcpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6Om9wZW5PdXRwdXRTdHJlYW0oCi0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZT4gKm91dFN0cmVhbSkgewotICAgIGF1ZGlvX3N0cmVhbV9vdXRfdCAqaGFsU3RyZWFtOwotICAgIEFMT0dWKCJvcGVuX291dHB1dF9zdHJlYW0gaGFuZGxlOiAlZCBkZXZpY2VzOiAleCBmbGFnczogJSN4IgotICAgICAgICAgICAgInNyYXRlOiAlZCBmb3JtYXQgJSN4IGNoYW5uZWxzICV4IGFkZHJlc3MgJXMiLAotICAgICAgICAgICAgaGFuZGxlLCBkZXZpY2VzLCBmbGFncywKLSAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywKLSAgICAgICAgICAgIGFkZHJlc3MpOwotICAgIGludCBvcGVuUmVzdXQgPSBtRGV2LT5vcGVuX291dHB1dF9zdHJlYW0oCi0gICAgICAgICAgICBtRGV2LCBoYW5kbGUsIGRldmljZXMsIGZsYWdzLCBjb25maWcsICZoYWxTdHJlYW0sIGFkZHJlc3MpOwotICAgIGlmIChvcGVuUmVzdXQgPT0gT0spIHsKLSAgICAgICAgKm91dFN0cmVhbSA9IG5ldyBTdHJlYW1PdXRIYWxMb2NhbChoYWxTdHJlYW0sIHRoaXMpOwotICAgIH0KLSAgICBBTE9HVigib3Blbl9vdXRwdXRfc3RyZWFtIHN0YXR1cyAlZCBzdHJlYW0gJXAiLCBvcGVuUmVzdXQsIGhhbFN0cmVhbSk7Ci0gICAgcmV0dXJuIG9wZW5SZXN1dDsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6Om9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pIHsKLSAgICBhdWRpb19zdHJlYW1faW5fdCAqaGFsU3RyZWFtOwotICAgIEFMT0dWKCJvcGVuX2lucHV0X3N0cmVhbSBoYW5kbGU6ICVkIGRldmljZXM6ICV4IGZsYWdzOiAlI3ggIgotICAgICAgICAgICAgInNyYXRlOiAlZCBmb3JtYXQgJSN4IGNoYW5uZWxzICV4IGFkZHJlc3MgJXMgc291cmNlICVkIiwKLSAgICAgICAgICAgIGhhbmRsZSwgZGV2aWNlcywgZmxhZ3MsCi0gICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLCBjb25maWctPmZvcm1hdCwgY29uZmlnLT5jaGFubmVsX21hc2ssCi0gICAgICAgICAgICBhZGRyZXNzLCBzb3VyY2UpOwotICAgIGludCBvcGVuUmVzdWx0ID0gbURldi0+b3Blbl9pbnB1dF9zdHJlYW0oCi0gICAgICAgICAgICBtRGV2LCBoYW5kbGUsIGRldmljZXMsIGNvbmZpZywgJmhhbFN0cmVhbSwgZmxhZ3MsIGFkZHJlc3MsIHNvdXJjZSk7Ci0gICAgaWYgKG9wZW5SZXN1bHQgPT0gT0spIHsKLSAgICAgICAgKmluU3RyZWFtID0gbmV3IFN0cmVhbUluSGFsTG9jYWwoaGFsU3RyZWFtLCB0aGlzKTsKLSAgICB9Ci0gICAgQUxPR1YoIm9wZW5faW5wdXRfc3RyZWFtIHN0YXR1cyAlZCBzdHJlYW0gJXAiLCBvcGVuUmVzdWx0LCBpblN0cmVhbSk7Ci0gICAgcmV0dXJuIG9wZW5SZXN1bHQ7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzdXBwb3J0c0F1ZGlvUGF0Y2hlcyhib29sICpzdXBwb3J0c1BhdGNoZXMpIHsKLSAgICAqc3VwcG9ydHNQYXRjaGVzID0gdmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzA7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Y3JlYXRlQXVkaW9QYXRjaCgKLSAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAotICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZXMsCi0gICAgICAgIHVuc2lnbmVkIGludCBudW1fc2lua3MsCi0gICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCi0gICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaCkgewotICAgIGlmICh2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgewotICAgICAgICByZXR1cm4gbURldi0+Y3JlYXRlX2F1ZGlvX3BhdGNoKAotICAgICAgICAgICAgICAgIG1EZXYsIG51bV9zb3VyY2VzLCBzb3VyY2VzLCBudW1fc2lua3MsIHNpbmtzLCBwYXRjaCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoKSB7Ci0gICAgaWYgKHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7Ci0gICAgICAgIHJldHVybiBtRGV2LT5yZWxlYXNlX2F1ZGlvX3BhdGNoKG1EZXYsIHBhdGNoKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSB7Ci0gICAgcmV0dXJuIG1EZXYtPmdldF9hdWRpb19wb3J0KG1EZXYsIHBvcnQpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSB7Ci0gICAgaWYgKHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKQotICAgICAgICByZXR1cm4gbURldi0+c2V0X2F1ZGlvX3BvcnRfY29uZmlnKG1EZXYsIGNvbmZpZyk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpkdW1wKGludCBmZCkgewotICAgIHJldHVybiBtRGV2LT5kdW1wKG1EZXYsIGZkKTsKLX0KLQotdm9pZCBEZXZpY2VIYWxMb2NhbDo6Y2xvc2VPdXRwdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQgKnN0cmVhbV9vdXQpIHsKLSAgICBtRGV2LT5jbG9zZV9vdXRwdXRfc3RyZWFtKG1EZXYsIHN0cmVhbV9vdXQpOwotfQotCi12b2lkIERldmljZUhhbExvY2FsOjpjbG9zZUlucHV0U3RyZWFtKHN0cnVjdCBhdWRpb19zdHJlYW1faW4gKnN0cmVhbV9pbikgewotICAgIG1EZXYtPmNsb3NlX2lucHV0X3N0cmVhbShtRGV2LCBzdHJlYW1faW4pOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VIYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlSGFsTG9jYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY1ZjI5Ni4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VIYWxMb2NhbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9MT0NBTF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9MT0NBTF9ICi0KLSNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIERldmljZUhhbExvY2FsIDogcHVibGljIERldmljZUhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgLy8gU2V0cyB0aGUgdmFsdWUgb2YgJ2RldmljZXMnIHRvIGEgYml0bWFzayBvZiAxIG9yIG1vcmUgdmFsdWVzIG9mIGF1ZGlvX2RldmljZXNfdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN1cHBvcnRlZERldmljZXModWludDMyX3QgKmRldmljZXMpOwotCi0gICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBhdWRpbyBoYXJkd2FyZSBpbnRlcmZhY2UgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKTsKLQotICAgIC8vIFNldCB0aGUgYXVkaW8gdm9sdW1lIG9mIGEgdm9pY2UgY2FsbC4gUmFuZ2UgaXMgYmV0d2VlbiAwLjAgYW5kIDEuMC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSk7Ci0KLSAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBmb3IgYWxsIGF1ZGlvIGFjdGl2aXRpZXMgb3RoZXIgdGhhbiB2b2ljZSBjYWxsLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSk7Ci0KLSAgICAvLyBHZXQgdGhlIGN1cnJlbnQgbWFzdGVyIHZvbHVtZSB2YWx1ZSBmb3IgdGhlIEhBTC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKTsKLQotICAgIC8vIENhbGxlZCB3aGVuIHRoZSBhdWRpbyBtb2RlIGNoYW5nZXMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKTsKLQotICAgIC8vIE11dGluZyBjb250cm9sLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWljTXV0ZShib29sIHN0YXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pY011dGUoYm9vbCAqc3RhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyTXV0ZShib29sIHN0YXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpOwotCi0gICAgLy8gU2V0IGdsb2JhbCBhdWRpbyBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKTsKLQotICAgIC8vIEdldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKTsKLQotICAgIC8vIFJldHVybnMgYXVkaW8gaW5wdXQgYnVmZmVyIHNpemUgYWNjb3JkaW5nIHRvIHBhcmFtZXRlcnMgcGFzc2VkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXJTaXplKGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgIHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBDcmVhdGVzIGFuZCBvcGVucyB0aGUgYXVkaW8gaGFyZHdhcmUgb3V0cHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKLSAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5PdXRwdXRTdHJlYW0oCi0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZT4gKm91dFN0cmVhbSk7Ci0KLSAgICAvLyBDcmVhdGVzIGFuZCBvcGVucyB0aGUgYXVkaW8gaGFyZHdhcmUgaW5wdXQgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIGNsb3NlZAotICAgIC8vIGJ5IHJlbGVhc2luZyBhbGwgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbklucHV0U3RyZWFtKAotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKLSAgICAgICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pOwotCi0gICAgLy8gUmV0dXJucyB3aGV0aGVyIGNyZWF0ZUF1ZGlvUGF0Y2ggYW5kIHJlbGVhc2VBdWRpb1BhdGNoIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcyk7Ci0KLSAgICAvLyBDcmVhdGVzIGFuIGF1ZGlvIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKAotICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAotICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VzLAotICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCi0gICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpOwotCi0gICAgLy8gUmVsZWFzZXMgYW4gYXVkaW8gcGF0Y2guCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCk7Ci0KLSAgICAvLyBGaWxscyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KTsKLQotICAgIC8vIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7Ci0KLSAgICB2b2lkIGNsb3NlT3V0cHV0U3RyZWFtKHN0cnVjdCBhdWRpb19zdHJlYW1fb3V0ICpzdHJlYW1fb3V0KTsKLSAgICB2b2lkIGNsb3NlSW5wdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9pbiAqc3RyZWFtX2luKTsKLQotICBwcml2YXRlOgotICAgIGF1ZGlvX2h3X2RldmljZV90ICptRGV2OwotCi0gICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsTG9jYWw7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgZXhwbGljaXQgRGV2aWNlSGFsTG9jYWwoYXVkaW9faHdfZGV2aWNlX3QgKmRldik7Ci0KLSAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgZGV2aWNlLgotICAgIHZpcnR1YWwgfkRldmljZUhhbExvY2FsKCk7Ci0KLSAgICB1aW50MzJfdCB2ZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gbURldi0+Y29tbW9uLnZlcnNpb247IH0KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9MT0NBTF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFkYTI2My4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2RlZmluZSBMT0dfVEFHICJEZXZpY2VzRmFjdG9yeUhhbEhpZGwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JRGV2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvaGlkbC9IYWxEZWF0aEhhbmRsZXIuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0jaW5jbHVkZSAiRGV2aWNlSGFsSGlkbC5oIgotI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsSGlkbC5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SURldmljZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpSZXN1bHQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOjpEZXZpY2VzRmFjdG9yeUhhbEhpZGwoKSB7Ci0gICAgbURldmljZXNGYWN0b3J5ID0gSURldmljZXNGYWN0b3J5OjpnZXRTZXJ2aWNlKCk7Ci0gICAgaWYgKG1EZXZpY2VzRmFjdG9yeSAhPSAwKSB7Ci0gICAgICAgIC8vIEl0IGlzIGFzc3VtZWQgdGhhdCBEZXZpY2VzRmFjdG9yeSBpcyBvd25lZCBieSBBdWRpb0ZsaW5nZXIKLSAgICAgICAgLy8gYW5kIHRodXMgaGF2ZSB0aGUgc2FtZSBsaWZlc3Bhbi4KLSAgICAgICAgbURldmljZXNGYWN0b3J5LT5saW5rVG9EZWF0aChIYWxEZWF0aEhhbmRsZXI6OmdldEluc3RhbmNlKCksIDAgLypjb29raWUqLyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBvYnRhaW4gSURldmljZXNGYWN0b3J5IHNlcnZpY2UsIHRlcm1pbmF0aW5nIHByb2Nlc3MuIik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotfQotCi1EZXZpY2VzRmFjdG9yeUhhbEhpZGw6On5EZXZpY2VzRmFjdG9yeUhhbEhpZGwoKSB7Ci19Ci0KLS8vIHN0YXRpYwotc3RhdHVzX3QgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOjpuYW1lRnJvbUhhbChjb25zdCBjaGFyICpuYW1lLCBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZSAqZGV2aWNlKSB7Ci0gICAgaWYgKHN0cmNtcChuYW1lLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUFJJTUFSWSkgPT0gMCkgewotICAgICAgICAqZGV2aWNlID0gSURldmljZXNGYWN0b3J5OjpEZXZpY2U6OlBSSU1BUlk7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9IGVsc2UgaWYoc3RyY21wKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9BMkRQKSA9PSAwKSB7Ci0gICAgICAgICpkZXZpY2UgPSBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZTo6QTJEUDsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0gZWxzZSBpZihzdHJjbXAobmFtZSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1VTQikgPT0gMCkgewotICAgICAgICAqZGV2aWNlID0gSURldmljZXNGYWN0b3J5OjpEZXZpY2U6OlVTQjsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0gZWxzZSBpZihzdHJjbXAobmFtZSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1JFTU9URV9TVUJNSVgpID09IDApIHsKLSAgICAgICAgKmRldmljZSA9IElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlOjpSX1NVQk1JWDsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0gZWxzZSBpZihzdHJjbXAobmFtZSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1NUVUIpID09IDApIHsKLSAgICAgICAgKmRldmljZSA9IElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlOjpTVFVCOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotICAgIEFMT0dFKCJJbnZhbGlkIGRldmljZSBuYW1lICVzIiwgbmFtZSk7Ci0gICAgcmV0dXJuIEJBRF9WQUxVRTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOjpvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSkgewotICAgIGlmIChtRGV2aWNlc0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgSURldmljZXNGYWN0b3J5OjpEZXZpY2UgaGlkbERldmljZTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBuYW1lRnJvbUhhbChuYW1lLCAmaGlkbERldmljZSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2VzRmFjdG9yeS0+b3BlbkRldmljZSgKLSAgICAgICAgICAgIGhpZGxEZXZpY2UsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElEZXZpY2U+JiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqZGV2aWNlID0gbmV3IERldmljZUhhbEhpZGwocmVzdWx0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHJldHVybiBPSzsKLSAgICAgICAgZWxzZSBpZiAocmV0dmFsID09IFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFMpIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIGVsc2UgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBGQUlMRURfVFJBTlNBQ1RJT047Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyZjFhZDEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSElETF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9ISURMX0gKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lEZXZpY2VzRmFjdG9yeS5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotCi0jaW5jbHVkZSAiRGV2aWNlSGFsSGlkbC5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SURldmljZXNGYWN0b3J5OwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIERldmljZXNGYWN0b3J5SGFsSGlkbCA6IHB1YmxpYyBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgLy8gT3BlbnMgYSBkZXZpY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFRvIGNsb3NlIHRoZSBkZXZpY2UsIGl0IGlzCi0gICAgLy8gbmVjZXNzYXJ5IHRvIHJlbGVhc2UgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsSHlicmlkOwotCi0gICAgc3A8SURldmljZXNGYWN0b3J5PiBtRGV2aWNlc0ZhY3Rvcnk7Ci0KLSAgICBzdGF0aWMgc3RhdHVzX3QgbmFtZUZyb21IYWwoY29uc3QgY2hhciAqbmFtZSwgSURldmljZXNGYWN0b3J5OjpEZXZpY2UgKmRldmljZSk7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCk7Ci0KLSAgICB2aXJ0dWFsIH5EZXZpY2VzRmFjdG9yeUhhbEhpZGwoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU0YjAzYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsSHlicmlkLmgiCi0jaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oIgotI2lmbmRlZiBVU0VfTEVHQUNZX0xPQ0FMX0FVRElPX0hBTAotI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsSGlkbC5oIgotI2VuZGlmCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gc3RhdGljCi1zcDxEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZT4gRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U6OmNyZWF0ZSgpIHsKLSAgICByZXR1cm4gbmV3IERldmljZXNGYWN0b3J5SGFsSHlicmlkKCk7Ci19Ci0KLURldmljZXNGYWN0b3J5SGFsSHlicmlkOjpEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCgpCi0gICAgICAgIDogbUxvY2FsRmFjdG9yeShuZXcgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbCgpKSwKLSAgICAgICAgICBtSGlkbEZhY3RvcnkoCi0jaWZkZWYgVVNFX0xFR0FDWV9MT0NBTF9BVURJT19IQUwKLSAgICAgICAgICAgICAgICAgIG51bGxwdHIKLSNlbHNlCi0gICAgICAgICAgICAgICAgICBuZXcgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCkKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICApIHsKLX0KLQotRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ6On5EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCgpIHsKLX0KLQotc3RhdHVzX3QgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ6Om9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKSB7Ci0gICAgaWYgKG1IaWRsRmFjdG9yeSAhPSAwICYmIHN0cmNtcChBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfQTJEUCwgbmFtZSkgIT0gMCkgewotICAgICAgICByZXR1cm4gbUhpZGxGYWN0b3J5LT5vcGVuRGV2aWNlKG5hbWUsIGRldmljZSk7Ci0gICAgfQotICAgIHJldHVybiBtTG9jYWxGYWN0b3J5LT5vcGVuRGV2aWNlKG5hbWUsIGRldmljZSk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzhlYWY2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuY3BwCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvSURldmljZXNGYWN0b3J5Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby80LjAvSURldmljZXNGYWN0b3J5Lmg+CisKKyNpbmNsdWRlIDxEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oPgorI2luY2x1ZGUgPGxpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIHN0YXRpYworc3A8RGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U+IERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlOjpjcmVhdGUoKSB7CisgICAgaWYgKGhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SURldmljZXNGYWN0b3J5OjpnZXRTZXJ2aWNlKCkgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbmV3IFY0XzA6OkRldmljZXNGYWN0b3J5SGFsSHlicmlkKCk7CisgICAgfQorICAgIGlmIChoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklEZXZpY2VzRmFjdG9yeTo6Z2V0U2VydmljZSgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCgpOworICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9FZmZlY3RCdWZmZXJIYWxIaWRsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI1MjAxYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9FZmZlY3RCdWZmZXJIYWxIaWRsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGF0b21pYz4KLQotI2RlZmluZSBMT0dfVEFHICJFZmZlY3RCdWZmZXJIYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oaWRsL2FsbG9jYXRvci8xLjAvSUFsbG9jYXRvci5oPgotI2luY2x1ZGUgPGhpZGxtZW1vcnkvbWFwcGluZy5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RCdWZmZXJIYWxIaWRsLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLXVzaW5nIDo6YW5kcm9pZDo6aGlkbDo6YWxsb2NhdG9yOjpWMV8wOjpJQWxsb2NhdG9yOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIHN0YXRpYwotdWludDY0X3QgRWZmZWN0QnVmZmVySGFsSGlkbDo6bWFrZVVuaXF1ZUlkKCkgewotICAgIHN0YXRpYyBzdGQ6OmF0b21pYzx1aW50NjRfdD4gY291bnRlcnsxfTsKLSAgICByZXR1cm4gY291bnRlcisrOwotfQotCi0vLyBzdGF0aWMKLXN0YXR1c190IEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZTo6YWxsb2NhdGUoCi0gICAgICAgIHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIHsKLSAgICByZXR1cm4gbWlycm9yKG51bGxwdHIsIHNpemUsIGJ1ZmZlcik7Ci19Ci0KLS8vIHN0YXRpYwotc3RhdHVzX3QgRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlOjptaXJyb3IoCi0gICAgICAgIHZvaWQqIGV4dGVybmFsLCBzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSB7Ci0gICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiB0ZW1wQnVmZmVyID0gbmV3IEVmZmVjdEJ1ZmZlckhhbEhpZGwoc2l6ZSk7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8RWZmZWN0QnVmZmVySGFsSGlkbCo+KHRlbXBCdWZmZXIuZ2V0KCkpLT5pbml0KCk7Ci0gICAgaWYgKHJlc3VsdCA9PSBPSykgewotICAgICAgICB0ZW1wQnVmZmVyLT5zZXRFeHRlcm5hbERhdGEoZXh0ZXJuYWwpOwotICAgICAgICAqYnVmZmVyID0gdGVtcEJ1ZmZlcjsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotRWZmZWN0QnVmZmVySGFsSGlkbDo6RWZmZWN0QnVmZmVySGFsSGlkbChzaXplX3Qgc2l6ZSkKLSAgICAgICAgOiBtQnVmZmVyU2l6ZShzaXplKSwgbUZyYW1lQ291bnRDaGFuZ2VkKGZhbHNlKSwKLSAgICAgICAgICBtRXh0ZXJuYWxEYXRhKG51bGxwdHIpLCBtQXVkaW9CdWZmZXJ7MCwge251bGxwdHJ9fSB7Ci0gICAgbUhpZGxCdWZmZXIuaWQgPSBtYWtlVW5pcXVlSWQoKTsKLSAgICBtSGlkbEJ1ZmZlci5mcmFtZUNvdW50ID0gMDsKLX0KLQotRWZmZWN0QnVmZmVySGFsSGlkbDo6fkVmZmVjdEJ1ZmZlckhhbEhpZGwoKSB7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmluaXQoKSB7Ci0gICAgc3A8SUFsbG9jYXRvcj4gYXNobWVtID0gSUFsbG9jYXRvcjo6Z2V0U2VydmljZSgiYXNobWVtIik7Ci0gICAgaWYgKGFzaG1lbSA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmV0cmlldmUgYXNobWVtIGFsbG9jYXRvciBzZXJ2aWNlIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBzdGF0dXNfdCByZXR2YWwgPSBOT19NRU1PUlk7Ci0gICAgUmV0dXJuPHZvaWQ+IHJlc3VsdCA9IGFzaG1lbS0+YWxsb2NhdGUoCi0gICAgICAgICAgICBtQnVmZmVyU2l6ZSwKLSAgICAgICAgICAgIFsmXShib29sIHN1Y2Nlc3MsIGNvbnN0IGhpZGxfbWVtb3J5JiBtZW1vcnkpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3VjY2VzcykgewotICAgICAgICAgICAgICAgICAgICBtSGlkbEJ1ZmZlci5kYXRhID0gbWVtb3J5OwotICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBPSzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAocmVzdWx0LmlzT2soKSAmJiByZXR2YWwgPT0gT0spIHsKLSAgICAgICAgbU1lbW9yeSA9IGhhcmR3YXJlOjptYXBNZW1vcnkobUhpZGxCdWZmZXIuZGF0YSk7Ci0gICAgICAgIGlmIChtTWVtb3J5ICE9IDApIHsKLSAgICAgICAgICAgIG1NZW1vcnktPnVwZGF0ZSgpOwotICAgICAgICAgICAgbUF1ZGlvQnVmZmVyLnJhdyA9IHN0YXRpY19jYXN0PHZvaWQqPihtTWVtb3J5LT5nZXRQb2ludGVyKCkpOwotICAgICAgICAgICAgbWVtc2V0KG1BdWRpb0J1ZmZlci5yYXcsIDAsIG1NZW1vcnktPmdldFNpemUoKSk7Ci0gICAgICAgICAgICBtTWVtb3J5LT5jb21taXQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gbWFwIGFsbG9jYXRlZCBhc2htZW0iKTsKLSAgICAgICAgICAgIHJldHZhbCA9IE5PX01FTU9SWTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZnJvbSBhc2htZW0iLCAoaW50KW1CdWZmZXJTaXplKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdC5pc09rKCkgPyByZXR2YWwgOiBGQUlMRURfVFJBTlNBQ1RJT047Ci19Ci0KLWF1ZGlvX2J1ZmZlcl90KiBFZmZlY3RCdWZmZXJIYWxIaWRsOjphdWRpb0J1ZmZlcigpIHsKLSAgICByZXR1cm4gJm1BdWRpb0J1ZmZlcjsKLX0KLQotdm9pZCogRWZmZWN0QnVmZmVySGFsSGlkbDo6ZXh0ZXJuYWxEYXRhKCkgY29uc3QgewotICAgIHJldHVybiBtRXh0ZXJuYWxEYXRhOwotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OnNldEZyYW1lQ291bnQoc2l6ZV90IGZyYW1lQ291bnQpIHsKLSAgICBtSGlkbEJ1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKLSAgICBtQXVkaW9CdWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7Ci0gICAgbUZyYW1lQ291bnRDaGFuZ2VkID0gdHJ1ZTsKLX0KLQotYm9vbCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpjaGVja0ZyYW1lQ291bnRDaGFuZ2UoKSB7Ci0gICAgYm9vbCByZXN1bHQgPSBtRnJhbWVDb3VudENoYW5nZWQ7Ci0gICAgbUZyYW1lQ291bnRDaGFuZ2VkID0gZmFsc2U7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpzZXRFeHRlcm5hbERhdGEodm9pZCogZXh0ZXJuYWwpIHsKLSAgICBtRXh0ZXJuYWxEYXRhID0gZXh0ZXJuYWw7Ci19Ci0KLXZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6dXBkYXRlKCkgewotICAgIHVwZGF0ZShtQnVmZmVyU2l6ZSk7Ci19Ci0KLXZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6Y29tbWl0KCkgewotICAgIGNvbW1pdChtQnVmZmVyU2l6ZSk7Ci19Ci0KLXZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6dXBkYXRlKHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKG1FeHRlcm5hbERhdGEgPT0gbnVsbHB0cikgcmV0dXJuOwotICAgIG1NZW1vcnktPnVwZGF0ZSgpOwotICAgIGlmIChzaXplID4gbUJ1ZmZlclNpemUpIHNpemUgPSBtQnVmZmVyU2l6ZTsKLSAgICBtZW1jcHkobUF1ZGlvQnVmZmVyLnJhdywgbUV4dGVybmFsRGF0YSwgc2l6ZSk7Ci0gICAgbU1lbW9yeS0+Y29tbWl0KCk7Ci19Ci0KLXZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6Y29tbWl0KHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKG1FeHRlcm5hbERhdGEgPT0gbnVsbHB0cikgcmV0dXJuOwotICAgIGlmIChzaXplID4gbUJ1ZmZlclNpemUpIHNpemUgPSBtQnVmZmVyU2l6ZTsKLSAgICBtZW1jcHkobUV4dGVybmFsRGF0YSwgbUF1ZGlvQnVmZmVyLnJhdywgc2l6ZSk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdEJ1ZmZlckhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdEJ1ZmZlckhhbEhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZhODFjMi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9FZmZlY3RCdWZmZXJIYWxIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9CVUZGRVJfSEFMX0hJRExfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9CVUZGRVJfSEFMX0hJRExfSAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvMi4wL3R5cGVzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oaWRsL21lbW9yeS8xLjAvSU1lbW9yeS5oPgotI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0Lmg+Ci0KLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpBdWRpb0J1ZmZlcjsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKLXVzaW5nIGFuZHJvaWQ6OmhpZGw6Om1lbW9yeTo6VjFfMDo6SU1lbW9yeTsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBFZmZlY3RCdWZmZXJIYWxIaWRsIDogcHVibGljIEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgdmlydHVhbCBhdWRpb19idWZmZXJfdCogYXVkaW9CdWZmZXIoKTsKLSAgICB2aXJ0dWFsIHZvaWQqIGV4dGVybmFsRGF0YSgpIGNvbnN0OwotCi0gICAgdmlydHVhbCB2b2lkIHNldEV4dGVybmFsRGF0YSh2b2lkKiBleHRlcm5hbCk7Ci0gICAgdmlydHVhbCB2b2lkIHNldEZyYW1lQ291bnQoc2l6ZV90IGZyYW1lQ291bnQpOwotICAgIHZpcnR1YWwgYm9vbCBjaGVja0ZyYW1lQ291bnRDaGFuZ2UoKTsKLQotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGUoKTsKLSAgICB2aXJ0dWFsIHZvaWQgY29tbWl0KCk7Ci0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZShzaXplX3Qgc2l6ZSk7Ci0gICAgdmlydHVhbCB2b2lkIGNvbW1pdChzaXplX3Qgc2l6ZSk7Ci0KLSAgICBjb25zdCBBdWRpb0J1ZmZlciYgaGlkbEJ1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIG1IaWRsQnVmZmVyOyB9Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlOwotCi0gICAgc3RhdGljIHVpbnQ2NF90IG1ha2VVbmlxdWVJZCgpOwotCi0gICAgY29uc3Qgc2l6ZV90IG1CdWZmZXJTaXplOwotICAgIGJvb2wgbUZyYW1lQ291bnRDaGFuZ2VkOwotICAgIHZvaWQqIG1FeHRlcm5hbERhdGE7Ci0gICAgQXVkaW9CdWZmZXIgbUhpZGxCdWZmZXI7Ci0gICAgc3A8SU1lbW9yeT4gbU1lbW9yeTsKLSAgICBhdWRpb19idWZmZXJfdCBtQXVkaW9CdWZmZXI7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgZXhwbGljaXQgRWZmZWN0QnVmZmVySGFsSGlkbChzaXplX3Qgc2l6ZSk7Ci0KLSAgICB2aXJ0dWFsIH5FZmZlY3RCdWZmZXJIYWxIaWRsKCk7Ci0KLSAgICBzdGF0dXNfdCBpbml0KCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9CVUZGRVJfSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvRWZmZWN0QnVmZmVySGFsTG9jYWwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvRWZmZWN0QnVmZmVySGFsTG9jYWwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTUxYzhlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdEJ1ZmZlckhhbExvY2FsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkVmZmVjdEJ1ZmZlckhhbExvY2FsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJFZmZlY3RCdWZmZXJIYWxMb2NhbC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIHN0YXRpYwotc3RhdHVzX3QgRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlOjphbGxvY2F0ZSgKLSAgICAgICAgc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgewotICAgICpidWZmZXIgPSBuZXcgRWZmZWN0QnVmZmVySGFsTG9jYWwoc2l6ZSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi0vLyBzdGF0aWMKLXN0YXR1c190IEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZTo6bWlycm9yKAotICAgICAgICB2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgewotICAgICpidWZmZXIgPSBuZXcgRWZmZWN0QnVmZmVySGFsTG9jYWwoZXh0ZXJuYWwsIHNpemUpOwotICAgIHJldHVybiBPSzsKLX0KLQotRWZmZWN0QnVmZmVySGFsTG9jYWw6OkVmZmVjdEJ1ZmZlckhhbExvY2FsKHNpemVfdCBzaXplKQotICAgICAgICA6IG1Pd25CdWZmZXIobmV3IHVpbnQ4X3Rbc2l6ZV0pLAotICAgICAgICAgIG1CdWZmZXJTaXplKHNpemUpLCBtRnJhbWVDb3VudENoYW5nZWQoZmFsc2UpLAotICAgICAgICAgIG1BdWRpb0J1ZmZlcnswLCB7bU93bkJ1ZmZlci5nZXQoKX19IHsKLX0KLQotRWZmZWN0QnVmZmVySGFsTG9jYWw6OkVmZmVjdEJ1ZmZlckhhbExvY2FsKHZvaWQqIGV4dGVybmFsLCBzaXplX3Qgc2l6ZSkKLSAgICAgICAgOiBtT3duQnVmZmVyKG51bGxwdHIpLAotICAgICAgICAgIG1CdWZmZXJTaXplKHNpemUpLCBtRnJhbWVDb3VudENoYW5nZWQoZmFsc2UpLAotICAgICAgICAgIG1BdWRpb0J1ZmZlcnswLCB7ZXh0ZXJuYWx9fSB7Ci19Ci0KLUVmZmVjdEJ1ZmZlckhhbExvY2FsOjp+RWZmZWN0QnVmZmVySGFsTG9jYWwoKSB7Ci19Ci0KLWF1ZGlvX2J1ZmZlcl90KiBFZmZlY3RCdWZmZXJIYWxMb2NhbDo6YXVkaW9CdWZmZXIoKSB7Ci0gICAgcmV0dXJuICZtQXVkaW9CdWZmZXI7Ci19Ci0KLXZvaWQqIEVmZmVjdEJ1ZmZlckhhbExvY2FsOjpleHRlcm5hbERhdGEoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1BdWRpb0J1ZmZlci5yYXc7Ci19Ci0KLXZvaWQgRWZmZWN0QnVmZmVySGFsTG9jYWw6OnNldEZyYW1lQ291bnQoc2l6ZV90IGZyYW1lQ291bnQpIHsKLSAgICBtQXVkaW9CdWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7Ci0gICAgbUZyYW1lQ291bnRDaGFuZ2VkID0gdHJ1ZTsKLX0KLQotdm9pZCBFZmZlY3RCdWZmZXJIYWxMb2NhbDo6c2V0RXh0ZXJuYWxEYXRhKHZvaWQqIGV4dGVybmFsKSB7Ci0gICAgQUxPR0VfSUYobU93bkJ1ZmZlciAhPSBudWxscHRyLCAiQXR0ZW1wdCB0byBzZXQgZXh0ZXJuYWwgZGF0YSBmb3IgYWxsb2NhdGVkIGJ1ZmZlciIpOwotICAgIG1BdWRpb0J1ZmZlci5yYXcgPSBleHRlcm5hbDsKLX0KLQotYm9vbCBFZmZlY3RCdWZmZXJIYWxMb2NhbDo6Y2hlY2tGcmFtZUNvdW50Q2hhbmdlKCkgewotICAgIGJvb2wgcmVzdWx0ID0gbUZyYW1lQ291bnRDaGFuZ2VkOwotICAgIG1GcmFtZUNvdW50Q2hhbmdlZCA9IGZhbHNlOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXZvaWQgRWZmZWN0QnVmZmVySGFsTG9jYWw6OnVwZGF0ZSgpIHsKLX0KLQotdm9pZCBFZmZlY3RCdWZmZXJIYWxMb2NhbDo6Y29tbWl0KCkgewotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbExvY2FsOjp1cGRhdGUoc2l6ZV90KSB7Ci19Ci0KLXZvaWQgRWZmZWN0QnVmZmVySGFsTG9jYWw6OmNvbW1pdChzaXplX3QpIHsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvRWZmZWN0QnVmZmVySGFsTG9jYWwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdEJ1ZmZlckhhbExvY2FsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYjYyNGIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvRWZmZWN0QnVmZmVySGFsTG9jYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0JVRkZFUl9IQUxfTE9DQUxfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9CVUZGRVJfSEFMX0xPQ0FMX0gKLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEJ1ZmZlckhhbEludGVyZmFjZS5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3QuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBFZmZlY3RCdWZmZXJIYWxMb2NhbCA6IHB1YmxpYyBFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIHZpcnR1YWwgYXVkaW9fYnVmZmVyX3QqIGF1ZGlvQnVmZmVyKCk7Ci0gICAgdmlydHVhbCB2b2lkKiBleHRlcm5hbERhdGEoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgdm9pZCBzZXRFeHRlcm5hbERhdGEodm9pZCogZXh0ZXJuYWwpOwotICAgIHZpcnR1YWwgdm9pZCBzZXRGcmFtZUNvdW50KHNpemVfdCBmcmFtZUNvdW50KTsKLSAgICB2aXJ0dWFsIGJvb2wgY2hlY2tGcmFtZUNvdW50Q2hhbmdlKCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlKCk7Ci0gICAgdmlydHVhbCB2b2lkIGNvbW1pdCgpOwotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGUoc2l6ZV90IHNpemUpOwotICAgIHZpcnR1YWwgdm9pZCBjb21taXQoc2l6ZV90IHNpemUpOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZTsKLQotICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IG1Pd25CdWZmZXI7Ci0gICAgY29uc3Qgc2l6ZV90IG1CdWZmZXJTaXplOwotICAgIGJvb2wgbUZyYW1lQ291bnRDaGFuZ2VkOwotICAgIGF1ZGlvX2J1ZmZlcl90IG1BdWRpb0J1ZmZlcjsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBleHBsaWNpdCBFZmZlY3RCdWZmZXJIYWxMb2NhbChzaXplX3Qgc2l6ZSk7Ci0gICAgRWZmZWN0QnVmZmVySGFsTG9jYWwodm9pZCogZXh0ZXJuYWwsIHNpemVfdCBzaXplKTsKLQotICAgIHZpcnR1YWwgfkVmZmVjdEJ1ZmZlckhhbExvY2FsKCk7Ci0KLSAgICBzdGF0dXNfdCBpbml0KCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9CVUZGRVJfSEFMX0xPQ0FMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdEhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvRWZmZWN0SGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZmI2YmFiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdEhhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkVmZmVjdEhhbEhpZGwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxod2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPG1lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotI2luY2x1ZGUgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RIYWxIaWRsLmgiCi0jaW5jbHVkZSAiSGlkbFV0aWxzLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OkF1ZGlvQnVmZmVyOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6RWZmZWN0QnVmZmVyQWNjZXNzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6RWZmZWN0Q29uZmlnUGFyYW1ldGVyczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6Ok1lc3NhZ2VRdWV1ZUZsYWdCaXRzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6UmVzdWx0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9DaGFubmVsTWFzazsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvRm9ybWF0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLUVmZmVjdEhhbEhpZGw6OkVmZmVjdEhhbEhpZGwoY29uc3Qgc3A8SUVmZmVjdD4mIGVmZmVjdCwgdWludDY0X3QgZWZmZWN0SWQpCi0gICAgICAgIDogbUVmZmVjdChlZmZlY3QpLCBtRWZmZWN0SWQoZWZmZWN0SWQpLCBtQnVmZmVyc0NoYW5nZWQodHJ1ZSksIG1FZkdyb3VwKG51bGxwdHIpIHsKLX0KLQotRWZmZWN0SGFsSGlkbDo6fkVmZmVjdEhhbEhpZGwoKSB7Ci0gICAgaWYgKG1FZmZlY3QgIT0gMCkgewotICAgICAgICBjbG9zZSgpOwotICAgICAgICBtRWZmZWN0LmNsZWFyKCk7Ci0gICAgICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgfQotICAgIGlmIChtRWZHcm91cCkgewotICAgICAgICBFdmVudEZsYWc6OmRlbGV0ZUV2ZW50RmxhZygmbUVmR3JvdXApOwotICAgIH0KLX0KLQotLy8gc3RhdGljCi12b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdERlc2NyaXB0b3JUb0hhbCgKLSAgICAgICAgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgZGVzY3JpcHRvciwgZWZmZWN0X2Rlc2NyaXB0b3JfdCogaGFsRGVzY3JpcHRvcikgewotICAgIEhpZGxVdGlsczo6dXVpZFRvSGFsKGRlc2NyaXB0b3IudHlwZSwgJmhhbERlc2NyaXB0b3ItPnR5cGUpOwotICAgIEhpZGxVdGlsczo6dXVpZFRvSGFsKGRlc2NyaXB0b3IudXVpZCwgJmhhbERlc2NyaXB0b3ItPnV1aWQpOwotICAgIGhhbERlc2NyaXB0b3ItPmZsYWdzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGRlc2NyaXB0b3IuZmxhZ3MpOwotICAgIGhhbERlc2NyaXB0b3ItPmNwdUxvYWQgPSBkZXNjcmlwdG9yLmNwdUxvYWQ7Ci0gICAgaGFsRGVzY3JpcHRvci0+bWVtb3J5VXNhZ2UgPSBkZXNjcmlwdG9yLm1lbW9yeVVzYWdlOwotICAgIG1lbWNweShoYWxEZXNjcmlwdG9yLT5uYW1lLCBkZXNjcmlwdG9yLm5hbWUuZGF0YSgpLCBkZXNjcmlwdG9yLm5hbWUuc2l6ZSgpKTsKLSAgICBtZW1jcHkoaGFsRGVzY3JpcHRvci0+aW1wbGVtZW50b3IsCi0gICAgICAgICAgICBkZXNjcmlwdG9yLmltcGxlbWVudG9yLmRhdGEoKSwgZGVzY3JpcHRvci5pbXBsZW1lbnRvci5zaXplKCkpOwotfQotCi0vLyBUT0RPKG1uYWdhbm92KTogVGhlc2UgYnVmZmVyIGNvbnZlcnNpb24gZnVuY3Rpb25zIHNob3VsZCBiZSBzaGFyZWQgd2l0aCBFZmZlY3Qgd3JhcHBlcgotLy8gdmlhIEhpZGxVdGlscy4gTW92ZSB0aGVtIHRoZXJlIHdoZW4gaGFyZHdhcmUvaW50ZXJmYWNlcyB3aWxsIGdldCB1bi1mcm96ZW4gYWdhaW4uCi0KLS8vIHN0YXRpYwotdm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKAotICAgICAgICBjb25zdCBidWZmZXJfY29uZmlnX3QmIGhhbENvbmZpZywgRWZmZWN0QnVmZmVyQ29uZmlnKiBjb25maWcpIHsKLSAgICBjb25maWctPnNhbXBsaW5nUmF0ZUh6ID0gaGFsQ29uZmlnLnNhbXBsaW5nUmF0ZTsKLSAgICBjb25maWctPmNoYW5uZWxzID0gQXVkaW9DaGFubmVsTWFzayhoYWxDb25maWcuY2hhbm5lbHMpOwotICAgIGNvbmZpZy0+Zm9ybWF0ID0gQXVkaW9Gb3JtYXQoaGFsQ29uZmlnLmZvcm1hdCk7Ci0gICAgY29uZmlnLT5hY2Nlc3NNb2RlID0gRWZmZWN0QnVmZmVyQWNjZXNzKGhhbENvbmZpZy5hY2Nlc3NNb2RlKTsKLSAgICBjb25maWctPm1hc2sgPSBFZmZlY3RDb25maWdQYXJhbWV0ZXJzKGhhbENvbmZpZy5tYXNrKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdEJ1ZmZlckNvbmZpZ1RvSGFsKAotICAgICAgICBjb25zdCBFZmZlY3RCdWZmZXJDb25maWcmIGNvbmZpZywgYnVmZmVyX2NvbmZpZ190KiBoYWxDb25maWcpIHsKLSAgICBoYWxDb25maWctPmJ1ZmZlci5mcmFtZUNvdW50ID0gMDsKLSAgICBoYWxDb25maWctPmJ1ZmZlci5yYXcgPSBOVUxMOwotICAgIGhhbENvbmZpZy0+c2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsaW5nUmF0ZUh6OwotICAgIGhhbENvbmZpZy0+Y2hhbm5lbHMgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oY29uZmlnLmNoYW5uZWxzKTsKLSAgICBoYWxDb25maWctPmJ1ZmZlclByb3ZpZGVyLmNvb2tpZSA9IE5VTEw7Ci0gICAgaGFsQ29uZmlnLT5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOwotICAgIGhhbENvbmZpZy0+YnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7Ci0gICAgaGFsQ29uZmlnLT5mb3JtYXQgPSBzdGF0aWNfY2FzdDx1aW50OF90Pihjb25maWcuZm9ybWF0KTsKLSAgICBoYWxDb25maWctPmFjY2Vzc01vZGUgPSBzdGF0aWNfY2FzdDx1aW50OF90Pihjb25maWcuYWNjZXNzTW9kZSk7Ci0gICAgaGFsQ29uZmlnLT5tYXNrID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29uZmlnLm1hc2spOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0Q29uZmlnRnJvbUhhbChjb25zdCBlZmZlY3RfY29uZmlnX3QmIGhhbENvbmZpZywgRWZmZWN0Q29uZmlnKiBjb25maWcpIHsKLSAgICBlZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKGhhbENvbmZpZy5pbnB1dENmZywgJmNvbmZpZy0+aW5wdXRDZmcpOwotICAgIGVmZmVjdEJ1ZmZlckNvbmZpZ0Zyb21IYWwoaGFsQ29uZmlnLm91dHB1dENmZywgJmNvbmZpZy0+b3V0cHV0Q2ZnKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdENvbmZpZ1RvSGFsKGNvbnN0IEVmZmVjdENvbmZpZyYgY29uZmlnLCBlZmZlY3RfY29uZmlnX3QqIGhhbENvbmZpZykgewotICAgIGVmZmVjdEJ1ZmZlckNvbmZpZ1RvSGFsKGNvbmZpZy5pbnB1dENmZywgJmhhbENvbmZpZy0+aW5wdXRDZmcpOwotICAgIGVmZmVjdEJ1ZmZlckNvbmZpZ1RvSGFsKGNvbmZpZy5vdXRwdXRDZmcsICZoYWxDb25maWctPm91dHB1dENmZyk7Ci19Ci0KLS8vIHN0YXRpYwotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6YW5hbHl6ZVJlc3VsdChjb25zdCBSZXN1bHQmIHJlc3VsdCkgewotICAgIHN3aXRjaCAocmVzdWx0KSB7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpPSzogcmV0dXJuIE9LOwotICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFM6IHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpJTlZBTElEX1NUQVRFOiByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOwotICAgICAgICBjYXNlIFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOiByZXR1cm4gTk9fSU5JVDsKLSAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9TVVBQT1JURUQ6IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgY2FzZSBSZXN1bHQ6OlJFU1VMVF9UT09fQklHOiByZXR1cm4gTk9fTUVNT1JZOwotICAgICAgICBkZWZhdWx0OiByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldEluQnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcikgewotICAgIGlmIChtSW5CdWZmZXIgPT0gMCB8fCBidWZmZXItPmF1ZGlvQnVmZmVyKCkgIT0gbUluQnVmZmVyLT5hdWRpb0J1ZmZlcigpKSB7Ci0gICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IHRydWU7Ci0gICAgfQotICAgIG1JbkJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldE91dEJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpIHsKLSAgICBpZiAobU91dEJ1ZmZlciA9PSAwIHx8IGJ1ZmZlci0+YXVkaW9CdWZmZXIoKSAhPSBtT3V0QnVmZmVyLT5hdWRpb0J1ZmZlcigpKSB7Ci0gICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IHRydWU7Ci0gICAgfQotICAgIG1PdXRCdWZmZXIgPSBidWZmZXI7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzKCkgewotICAgIHJldHVybiBwcm9jZXNzSW1wbChzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6OlJFUVVFU1RfUFJPQ0VTUykpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzUmV2ZXJzZSgpIHsKLSAgICByZXR1cm4gcHJvY2Vzc0ltcGwoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpSRVFVRVNUX1BST0NFU1NfUkVWRVJTRSkpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcmVwYXJlRm9yUHJvY2Vzc2luZygpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IHRlbXBTdGF0dXNNUTsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0LT5wcmVwYXJlRm9yUHJvY2Vzc2luZygKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgTVFEZXNjcmlwdG9yU3luYzxSZXN1bHQ+JiBzdGF0dXNNUSkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBTdGF0dXNNUS5yZXNldChuZXcgU3RhdHVzTVEoc3RhdHVzTVEpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpICYmIHRlbXBTdGF0dXNNUS0+Z2V0RXZlbnRGbGFnV29yZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEZsYWc6OmNyZWF0ZUV2ZW50RmxhZyh0ZW1wU3RhdHVzTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSwgJm1FZkdyb3VwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmICghcmV0LmlzT2soKSB8fCByZXR2YWwgIT0gUmVzdWx0OjpPSykgewotICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0dmFsKSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICB9Ci0gICAgaWYgKCF0ZW1wU3RhdHVzTVEgfHwgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpIHx8ICFtRWZHcm91cCkgewotICAgICAgICBBTE9HRV9JRighdGVtcFN0YXR1c01RLCAiRmFpbGVkIHRvIG9idGFpbiBzdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgZWZmZWN0cyIpOwotICAgICAgICBBTE9HRV9JRih0ZW1wU3RhdHVzTVEgJiYgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpLAotICAgICAgICAgICAgICAgICJTdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgZWZmZWN0cyBpcyBpbnZhbGlkIik7Ci0gICAgICAgIEFMT0dFX0lGKCFtRWZHcm91cCwgIkV2ZW50IGZsYWcgY3JlYXRpb24gZm9yIGVmZmVjdHMgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBtU3RhdHVzTVEgPSBzdGQ6Om1vdmUodGVtcFN0YXR1c01RKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLWJvb2wgRWZmZWN0SGFsSGlkbDo6bmVlZFRvUmVzZXRCdWZmZXJzKCkgewotICAgIGlmIChtQnVmZmVyc0NoYW5nZWQpIHJldHVybiB0cnVlOwotICAgIGJvb2wgaW5CdWZmZXJGcmFtZUNvdW50VXBkYXRlZCA9IG1JbkJ1ZmZlci0+Y2hlY2tGcmFtZUNvdW50Q2hhbmdlKCk7Ci0gICAgYm9vbCBvdXRCdWZmZXJGcmFtZUNvdW50VXBkYXRlZCA9IG1PdXRCdWZmZXItPmNoZWNrRnJhbWVDb3VudENoYW5nZSgpOwotICAgIHJldHVybiBpbkJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkIHx8IG91dEJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzSW1wbCh1aW50MzJfdCBtcUZsYWcpIHsKLSAgICBpZiAobUVmZmVjdCA9PSAwIHx8IG1JbkJ1ZmZlciA9PSAwIHx8IG1PdXRCdWZmZXIgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIGlmICghbVN0YXR1c01RICYmIChzdGF0dXMgPSBwcmVwYXJlRm9yUHJvY2Vzc2luZygpKSAhPSBPSykgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICBpZiAobmVlZFRvUmVzZXRCdWZmZXJzKCkgJiYgKHN0YXR1cyA9IHNldFByb2Nlc3NCdWZmZXJzKCkpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIC8vIFRoZSBkYXRhIGlzIGFscmVhZHkgaW4gdGhlIGJ1ZmZlcnMsIGp1c3QgbmVlZCB0byBmbHVzaCBpdCBhbmQgd2FrZSB1cCB0aGUgc2VydmVyIHNpZGUuCi0gICAgc3RkOjphdG9taWNfdGhyZWFkX2ZlbmNlKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGVhc2UpOwotICAgIG1FZkdyb3VwLT53YWtlKG1xRmxhZyk7Ci0gICAgdWludDMyX3QgZWZTdGF0ZSA9IDA7Ci1yZXRyeToKLSAgICBzdGF0dXNfdCByZXQgPSBtRWZHcm91cC0+d2FpdCgKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6RE9ORV9QUk9DRVNTSU5HKSwgJmVmU3RhdGUpOwotICAgIGlmIChlZlN0YXRlICYgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpET05FX1BST0NFU1NJTkcpKSB7Ci0gICAgICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICAgICAgbVN0YXR1c01RLT5yZWFkKCZyZXR2YWwpOwotICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0sgfHwgcmV0dmFsID09IFJlc3VsdDo6SU5WQUxJRF9TVEFURSkgewotICAgICAgICAgICAgLy8gU3luYyBiYWNrIHRoZSBjaGFuZ2VkIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIuCi0gICAgICAgICAgICBzdGQ6OmF0b21pY190aHJlYWRfZmVuY2Uoc3RkOjptZW1vcnlfb3JkZXJfYWNxdWlyZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFuYWx5emVSZXN1bHQocmV0dmFsKTsKLSAgICB9Ci0gICAgaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRUlOVFIpIHsKLSAgICAgICAgLy8gU3B1cmlvdXMgd2FrZXVwLiBUaGlzIG5vcm1hbGx5IHJldHJpZXMgbm8gbW9yZSB0aGFuIG9uY2UuCi0gICAgICAgIGdvdG8gcmV0cnk7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldFByb2Nlc3NCdWZmZXJzKCkgewotICAgIFJldHVybjxSZXN1bHQ+IHJldCA9IG1FZmZlY3QtPnNldFByb2Nlc3NCdWZmZXJzKAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0QnVmZmVySGFsSGlkbCo+KG1JbkJ1ZmZlci5nZXQoKSktPmhpZGxCdWZmZXIoKSwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEJ1ZmZlckhhbEhpZGwqPihtT3V0QnVmZmVyLmdldCgpKS0+aGlkbEJ1ZmZlcigpKTsKLSAgICBpZiAocmV0LmlzT2soKSAmJiByZXQgPT0gUmVzdWx0OjpPSykgewotICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBmYWxzZTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0KSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Y29tbWFuZCh1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLCB2b2lkICpwQ21kRGF0YSwKLSAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSkgewotICAgIGlmIChtRWZmZWN0ID09IDApIHJldHVybiBOT19JTklUOwotCi0gICAgLy8gU3BlY2lhbCBjYXNlcy4KLSAgICBpZiAoY21kQ29kZSA9PSBFRkZFQ1RfQ01EX1NFVF9DT05GSUcgfHwgY21kQ29kZSA9PSBFRkZFQ1RfQ01EX1NFVF9DT05GSUdfUkVWRVJTRSkgewotICAgICAgICByZXR1cm4gc2V0Q29uZmlnSW1wbChjbWRDb2RlLCBjbWRTaXplLCBwQ21kRGF0YSwgcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKLSAgICB9IGVsc2UgaWYgKGNtZENvZGUgPT0gRUZGRUNUX0NNRF9HRVRfQ09ORklHIHx8IGNtZENvZGUgPT0gRUZGRUNUX0NNRF9HRVRfQ09ORklHX1JFVkVSU0UpIHsKLSAgICAgICAgcmV0dXJuIGdldENvbmZpZ0ltcGwoY21kQ29kZSwgcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKLSAgICB9Ci0KLSAgICAvLyBDb21tb24gY2FzZS4KLSAgICBoaWRsX3ZlYzx1aW50OF90PiBoaWRsRGF0YTsKLSAgICBpZiAocENtZERhdGEgIT0gbnVsbHB0ciAmJiBjbWRTaXplID4gMCkgewotICAgICAgICBoaWRsRGF0YS5zZXRUb0V4dGVybmFsKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHBDbWREYXRhKSwgY21kU2l6ZSk7Ci0gICAgfQotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICB1aW50MzJfdCByZXBseVNpemVTdHViID0gMDsKLSAgICBpZiAocmVwbHlTaXplID09IG51bGxwdHIgfHwgcFJlcGx5RGF0YSA9PSBudWxscHRyKSByZXBseVNpemUgPSAmcmVwbHlTaXplU3R1YjsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdC0+Y29tbWFuZChjbWRDb2RlLCBoaWRsRGF0YSwgKnJlcGx5U2l6ZSwKLSAgICAgICAgICAgIFsmXShpbnQzMl90IHMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoKnJlcGx5U2l6ZSA+IHJlc3VsdC5zaXplKCkpICpyZXBseVNpemUgPSByZXN1bHQuc2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocFJlcGx5RGF0YSAhPSBudWxscHRyICYmICpyZXBseVNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkocFJlcGx5RGF0YSwgJnJlc3VsdFswXSwgKnJlcGx5U2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcmV0LmlzT2soKSA/IHN0YXR1cyA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Z2V0RGVzY3JpcHRvcihlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgewotICAgIGlmIChtRWZmZWN0ID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdC0+Z2V0RGVzY3JpcHRvcigKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgZWZmZWN0RGVzY3JpcHRvclRvSGFsKHJlc3VsdCwgcERlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXR2YWwpIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpjbG9zZSgpIHsKLSAgICBpZiAobUVmZmVjdCA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXR1cm48UmVzdWx0PiByZXQgPSBtRWZmZWN0LT5jbG9zZSgpOwotICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXQpIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpnZXRDb25maWdJbXBsKAotICAgICAgICB1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7Ci0gICAgaWYgKHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkgfHwgcFJlcGx5RGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHN0YXR1c190IHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICBSZXR1cm48dm9pZD4gcmV0OwotICAgIGlmIChjbWRDb2RlID09IEVGRkVDVF9DTURfR0VUX0NPTkZJRykgewotICAgICAgICByZXQgPSBtRWZmZWN0LT5nZXRDb25maWcoWyZdIChSZXN1bHQgciwgY29uc3QgRWZmZWN0Q29uZmlnICZoaWRsQ29uZmlnKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBhbmFseXplUmVzdWx0KHIpOwotICAgICAgICAgICAgaWYgKHIgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgIGVmZmVjdENvbmZpZ1RvSGFsKGhpZGxDb25maWcsIHN0YXRpY19jYXN0PGVmZmVjdF9jb25maWdfdCo+KHBSZXBseURhdGEpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0ID0gbUVmZmVjdC0+Z2V0Q29uZmlnUmV2ZXJzZShbJl0gKFJlc3VsdCByLCBjb25zdCBFZmZlY3RDb25maWcgJmhpZGxDb25maWcpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGFuYWx5emVSZXN1bHQocik7Ci0gICAgICAgICAgICBpZiAociA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgZWZmZWN0Q29uZmlnVG9IYWwoaGlkbENvbmZpZywgc3RhdGljX2Nhc3Q8ZWZmZWN0X2NvbmZpZ190Kj4ocFJlcGx5RGF0YSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0gICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgIHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6c2V0Q29uZmlnSW1wbCgKLSAgICAgICAgdWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwgdm9pZCAqcENtZERhdGEsIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpIHsKLSAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpIHx8Ci0gICAgICAgICAgICByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQzMl90KSB8fCBwUmVwbHlEYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgY29uc3QgZWZmZWN0X2NvbmZpZ190ICpoYWxDb25maWcgPSBzdGF0aWNfY2FzdDxlZmZlY3RfY29uZmlnX3QqPihwQ21kRGF0YSk7Ci0gICAgaWYgKGhhbENvbmZpZy0+aW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyICE9IE5VTEwgfHwKLSAgICAgICAgICAgIGhhbENvbmZpZy0+aW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciAhPSBOVUxMIHx8Ci0gICAgICAgICAgICBoYWxDb25maWctPm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgIT0gTlVMTCB8fAotICAgICAgICAgICAgaGFsQ29uZmlnLT5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJCdWZmZXIgcHJvdmlkZXIgY2FsbGJhY2tzIGFyZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgfQotICAgIEVmZmVjdENvbmZpZyBoaWRsQ29uZmlnOwotICAgIGVmZmVjdENvbmZpZ0Zyb21IYWwoKmhhbENvbmZpZywgJmhpZGxDb25maWcpOwotICAgIFJldHVybjxSZXN1bHQ+IHJldCA9IGNtZENvZGUgPT0gRUZGRUNUX0NNRF9TRVRfQ09ORklHID8KLSAgICAgICAgICAgIG1FZmZlY3QtPnNldENvbmZpZyhoaWRsQ29uZmlnLCBudWxscHRyLCBudWxscHRyKSA6Ci0gICAgICAgICAgICBtRWZmZWN0LT5zZXRDb25maWdSZXZlcnNlKGhpZGxDb25maWcsIG51bGxwdHIsIG51bGxwdHIpOwotICAgIHN0YXR1c190IHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICByZXN1bHQgPSBhbmFseXplUmVzdWx0KHJldCk7Ci0gICAgICAgICpzdGF0aWNfY2FzdDxpbnQzMl90Kj4ocFJlcGx5RGF0YSkgPSByZXN1bHQ7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdEhhbExvY2FsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdEhhbExvY2FsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ0NjVjMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9FZmZlY3RIYWxMb2NhbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJFZmZlY3RIYWxMb2NhbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPG1lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJFZmZlY3RIYWxMb2NhbC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLUVmZmVjdEhhbExvY2FsOjpFZmZlY3RIYWxMb2NhbChlZmZlY3RfaGFuZGxlX3QgaGFuZGxlKQotICAgICAgICA6IG1IYW5kbGUoaGFuZGxlKSB7Ci19Ci0KLUVmZmVjdEhhbExvY2FsOjp+RWZmZWN0SGFsTG9jYWwoKSB7Ci0gICAgaW50IHN0YXR1cyA9IEVmZmVjdFJlbGVhc2UobUhhbmRsZSk7Ci0gICAgQUxPR1dfSUYoc3RhdHVzLCAiRXJyb3IgcmVsZWFzaW5nIGVmZmVjdCAlcDogJXMiLCBtSGFuZGxlLCBzdHJlcnJvcigtc3RhdHVzKSk7Ci0gICAgbUhhbmRsZSA9IDA7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbExvY2FsOjpzZXRJbkJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpIHsKLSAgICBtSW5CdWZmZXIgPSBidWZmZXI7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxMb2NhbDo6c2V0T3V0QnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcikgewotICAgIG1PdXRCdWZmZXIgPSBidWZmZXI7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxMb2NhbDo6cHJvY2VzcygpIHsKLSAgICBpZiAobUluQnVmZmVyID09IG51bGxwdHIgfHwgbU91dEJ1ZmZlciA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFX0lGKG1JbkJ1ZmZlciA9PSBudWxscHRyLCAiSW5wdXQgYnVmZmVyIG5vdCBzZXQiKTsKLSAgICAgICAgQUxPR0VfSUYobU91dEJ1ZmZlciA9PSBudWxscHRyLCAiT3V0cHV0IGJ1ZmZlciBub3Qgc2V0Iik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gKCptSGFuZGxlKS0+cHJvY2VzcyhtSGFuZGxlLCBtSW5CdWZmZXItPmF1ZGlvQnVmZmVyKCksIG1PdXRCdWZmZXItPmF1ZGlvQnVmZmVyKCkpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxMb2NhbDo6cHJvY2Vzc1JldmVyc2UoKSB7Ci0gICAgaWYgKCgqbUhhbmRsZSktPnByb2Nlc3NfcmV2ZXJzZSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChtSW5CdWZmZXIgPT0gbnVsbHB0ciB8fCBtT3V0QnVmZmVyID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIEFMT0dFX0lGKG1JbkJ1ZmZlciA9PSBudWxscHRyLCAiSW5wdXQgYnVmZmVyIG5vdCBzZXQiKTsKLSAgICAgICAgICAgIEFMT0dFX0lGKG1PdXRCdWZmZXIgPT0gbnVsbHB0ciwgIk91dHB1dCBidWZmZXIgbm90IHNldCIpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICgqbUhhbmRsZSktPnByb2Nlc3NfcmV2ZXJzZSgKLSAgICAgICAgICAgICAgICBtSGFuZGxlLCBtSW5CdWZmZXItPmF1ZGlvQnVmZmVyKCksIG1PdXRCdWZmZXItPmF1ZGlvQnVmZmVyKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbExvY2FsOjpjb21tYW5kKHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsIHZvaWQgKnBDbWREYXRhLAotICAgICAgICB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7Ci0gICAgcmV0dXJuICgqbUhhbmRsZSktPmNvbW1hbmQobUhhbmRsZSwgY21kQ29kZSwgY21kU2l6ZSwgcENtZERhdGEsIHJlcGx5U2l6ZSwgcFJlcGx5RGF0YSk7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbExvY2FsOjpnZXREZXNjcmlwdG9yKGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7Ci0gICAgcmV0dXJuICgqbUhhbmRsZSktPmdldF9kZXNjcmlwdG9yKG1IYW5kbGUsIHBEZXNjcmlwdG9yKTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsTG9jYWw6OmNsb3NlKCkgewotICAgIHJldHVybiBPSzsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvRWZmZWN0SGFsTG9jYWwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdEhhbExvY2FsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5M2ZiNTAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvRWZmZWN0SGFsTG9jYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0hBTF9MT0NBTF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0hBTF9MT0NBTF9ICi0KLSNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19lZmZlY3QuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RIYWxJbnRlcmZhY2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBFZmZlY3RIYWxMb2NhbCA6IHB1YmxpYyBFZmZlY3RIYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIC8vIFNldCB0aGUgaW5wdXQgYnVmZmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SW5CdWZmZXIoY29uc3Qgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiYgYnVmZmVyKTsKLQotICAgIC8vIFNldCB0aGUgb3V0cHV0IGJ1ZmZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE91dEJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpOwotCi0gICAgLy8gRWZmZWN0IHByb2Nlc3MgZnVuY3Rpb24uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBwcm9jZXNzKCk7Ci0KLSAgICAvLyBQcm9jZXNzIHJldmVyc2Ugc3RyZWFtIGZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcGFzcwotICAgIC8vIGEgcmVmZXJlbmNlIHN0cmVhbSB0byB0aGUgZWZmZWN0IGVuZ2luZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHByb2Nlc3NSZXZlcnNlKCk7Ci0KLSAgICAvLyBTZW5kIGEgY29tbWFuZCBhbmQgcmVjZWl2ZSBhIHJlc3BvbnNlIHRvL2Zyb20gZWZmZWN0IGVuZ2luZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNvbW1hbmQodWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwgdm9pZCAqcENtZERhdGEsCi0gICAgICAgICAgICB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKTsKLQotICAgIC8vIFJldHVybnMgdGhlIGVmZmVjdCBkZXNjcmlwdG9yLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RGVzY3JpcHRvcihlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcik7Ci0KLSAgICAvLyBGcmVlIHJlc291cmNlcyBvbiB0aGUgcmVtb3RlIHNpZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZSgpOwotCi0gICAgLy8gV2hldGhlciBpdCdzIGEgbG9jYWwgaW1wbGVtZW50YXRpb24uCi0gICAgdmlydHVhbCBib29sIGlzTG9jYWwoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLSAgICBlZmZlY3RfaGFuZGxlX3QgaGFuZGxlKCkgY29uc3QgeyByZXR1cm4gbUhhbmRsZTsgfQotCi0gIHByaXZhdGU6Ci0gICAgZWZmZWN0X2hhbmRsZV90IG1IYW5kbGU7Ci0gICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiBtSW5CdWZmZXI7Ci0gICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiBtT3V0QnVmZmVyOwotCi0gICAgZnJpZW5kIGNsYXNzIEVmZmVjdHNGYWN0b3J5SGFsTG9jYWw7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgZXhwbGljaXQgRWZmZWN0SGFsTG9jYWwoZWZmZWN0X2hhbmRsZV90IGhhbmRsZSk7Ci0KLSAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IHJlbGVhc2VzIHRoZSBlZmZlY3QuCi0gICAgdmlydHVhbCB+RWZmZWN0SGFsTG9jYWwoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0hBTF9MT0NBTF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgwODFiNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkVmZmVjdHNGYWN0b3J5SGFsSGlkbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+Ci0KLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotI2luY2x1ZGUgIkVmZmVjdEhhbEhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RzRmFjdG9yeUhhbEhpZGwuaCIKLSNpbmNsdWRlICJIaWRsVXRpbHMuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6VXVpZDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OklFZmZlY3Q7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpSZXN1bHQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gc3RhdGljCi1zcDxFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZT4gRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U6OmNyZWF0ZSgpIHsKLSAgICByZXR1cm4gbmV3IEVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpOwotfQotCi0vLyBzdGF0aWMKLWJvb2wgRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U6OmlzTnVsbFV1aWQoY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQpIHsKLSAgICByZXR1cm4gbWVtY21wKHBFZmZlY3RVdWlkLCBFRkZFQ1RfVVVJRF9OVUxMLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDA7Ci19Ci0KLUVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6RWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCkgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiRWZmZWN0c0ZhY3RvcnkiKSB7Ci0gICAgbUVmZmVjdHNGYWN0b3J5ID0gSUVmZmVjdHNGYWN0b3J5OjpnZXRTZXJ2aWNlKCk7Ci0gICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb2J0YWluIElFZmZlY3RzRmFjdG9yeSBzZXJ2aWNlLCB0ZXJtaW5hdGluZyBwcm9jZXNzLiIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLX0KLQotRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjp+RWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCkgewotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OnF1ZXJ5QWxsRGVzY3JpcHRvcnMoKSB7Ci0gICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+Z2V0QWxsRGVzY3JpcHRvcnMoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IGhpZGxfdmVjPEVmZmVjdERlc2NyaXB0b3I+JiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBtTGFzdERlc2NyaXB0b3JzID0gcmVzdWx0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmIChyZXQuaXNPaygpKSB7Ci0gICAgICAgIHJldHVybiByZXR2YWwgPT0gUmVzdWx0OjpPSyA/IE9LIDogTk9fSU5JVDsKLSAgICB9Ci0gICAgbUxhc3REZXNjcmlwdG9ycy5yZXNpemUoMCk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OnF1ZXJ5TnVtYmVyRWZmZWN0cyh1aW50MzJfdCAqcE51bUVmZmVjdHMpIHsKLSAgICBzdGF0dXNfdCBxdWVyeVJlc3VsdCA9IHF1ZXJ5QWxsRGVzY3JpcHRvcnMoKTsKLSAgICBpZiAocXVlcnlSZXN1bHQgPT0gT0spIHsKLSAgICAgICAgKnBOdW1FZmZlY3RzID0gbUxhc3REZXNjcmlwdG9ycy5zaXplKCk7Ci0gICAgfQotICAgIHJldHVybiBxdWVyeVJlc3VsdDsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpnZXREZXNjcmlwdG9yKAotICAgICAgICB1aW50MzJfdCBpbmRleCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIHsKLSAgICAvLyBUT0RPOiBXZSBuZWVkIHNvbWVob3cgdG8gdHJhY2sgdGhlIGNoYW5nZXMgb24gdGhlIHNlcnZlciBzaWRlCi0gICAgLy8gb3IgZmlndXJlIG91dCBob3cgdG8gY29udmVydCBldmVyeWJvZHkgdG8gcXVlcnkgYWxsIHRoZSBkZXNjcmlwdG9ycyBhdCBvbmNlLgotICAgIC8vIFRPRE86IGNoZWNrIGZvciBudWxscHRyCi0gICAgaWYgKG1MYXN0RGVzY3JpcHRvcnMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgc3RhdHVzX3QgcXVlcnlSZXN1bHQgPSBxdWVyeUFsbERlc2NyaXB0b3JzKCk7Ci0gICAgICAgIGlmIChxdWVyeVJlc3VsdCAhPSBPSykgcmV0dXJuIHF1ZXJ5UmVzdWx0OwotICAgIH0KLSAgICBpZiAoaW5kZXggPj0gbUxhc3REZXNjcmlwdG9ycy5zaXplKCkpIHJldHVybiBOQU1FX05PVF9GT1VORDsKLSAgICBFZmZlY3RIYWxIaWRsOjplZmZlY3REZXNjcmlwdG9yVG9IYWwobUxhc3REZXNjcmlwdG9yc1tpbmRleF0sIHBEZXNjcmlwdG9yKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6Z2V0RGVzY3JpcHRvcigKLSAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7Ci0gICAgLy8gVE9ETzogY2hlY2sgZm9yIG51bGxwdHIKLSAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOwotICAgIFV1aWQgaGlkbFV1aWQ7Ci0gICAgSGlkbFV0aWxzOjp1dWlkRnJvbUhhbCgqcEVmZmVjdFV1aWQsICZoaWRsVXVpZCk7Ci0gICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmdldERlc2NyaXB0b3IoaGlkbFV1aWQsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IEVmZmVjdERlc2NyaXB0b3ImIHJlc3VsdCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIEVmZmVjdEhhbEhpZGw6OmVmZmVjdERlc2NyaXB0b3JUb0hhbChyZXN1bHQsIHBEZXNjcmlwdG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHJldHVybiBPSzsKLSAgICAgICAgZWxzZSBpZiAocmV0dmFsID09IFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFMpIHJldHVybiBOQU1FX05PVF9GT1VORDsKLSAgICAgICAgZWxzZSByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmNyZWF0ZUVmZmVjdCgKLSAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsIGludDMyX3Qgc2Vzc2lvbklkLCBpbnQzMl90IGlvSWQsCi0gICAgICAgIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gKmVmZmVjdCkgewotICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgVXVpZCBoaWRsVXVpZDsKLSAgICBIaWRsVXRpbHM6OnV1aWRGcm9tSGFsKCpwRWZmZWN0VXVpZCwgJmhpZGxVdWlkKTsKLSAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+Y3JlYXRlRWZmZWN0KAotICAgICAgICAgICAgaGlkbFV1aWQsIHNlc3Npb25JZCwgaW9JZCwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SUVmZmVjdD4mIHJlc3VsdCwgdWludDY0X3QgZWZmZWN0SWQpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqZWZmZWN0ID0gbmV3IEVmZmVjdEhhbEhpZGwocmVzdWx0LCBlZmZlY3RJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKHJldC5pc09rKCkpIHsKLSAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSByZXR1cm4gT0s7Ci0gICAgICAgIGVsc2UgaWYgKHJldHZhbCA9PSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7Ci0gICAgICAgIGVsc2UgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKF9fRlVOQ1RJT05fXywgcmV0KTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpkdW1wRWZmZWN0cyhpbnQgZmQpIHsKLSAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOwotICAgIG5hdGl2ZV9oYW5kbGVfdCogaGlkbEhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOwotICAgIGhpZGxIYW5kbGUtPmRhdGFbMF0gPSBmZDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdHNGYWN0b3J5LT5kZWJ1Z0R1bXAoaGlkbEhhbmRsZSk7Ci0gICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODlmMDQyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RTX0ZBQ1RPUllfSEFMX0hJRExfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVFNfRkFDVE9SWV9IQUxfSElETF9ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC8yLjAvSUVmZmVjdHNGYWN0b3J5Lmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvMi4wL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpFZmZlY3REZXNjcmlwdG9yOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6SUVmZmVjdHNGYWN0b3J5OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci0KLWNsYXNzIEVmZmVjdHNGYWN0b3J5SGFsSGlkbCA6IHB1YmxpYyBFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZSwgcHVibGljIENvbnZlcnNpb25IZWxwZXJIaWRsCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGlmZmVyZW50IGVmZmVjdHMgaW4gYWxsIGxvYWRlZCBsaWJyYXJpZXMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKnBOdW1FZmZlY3RzKTsKLQotICAgIC8vIFJldHVybnMgYSBkZXNjcmlwdG9yIG9mIHRoZSBuZXh0IGF2YWlsYWJsZSBlZmZlY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXNjcmlwdG9yKHVpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLAotICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOwotCi0gICAgLy8gQ3JlYXRlcyBhbiBlZmZlY3QgZW5naW5lIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KLSAgICAvLyBUbyByZWxlYXNlIHRoZSBlZmZlY3QgZW5naW5lLCBpdCBpcyBuZWNlc3NhcnkgdG8gcmVsZWFzZSByZWZlcmVuY2VzCi0gICAgLy8gdG8gdGhlIHJldHVybmVkIGVmZmVjdCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsCi0gICAgICAgICAgICBpbnQzMl90IHNlc3Npb25JZCwgaW50MzJfdCBpb0lkLAotICAgICAgICAgICAgc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiAqZWZmZWN0KTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcEVmZmVjdHMoaW50IGZkKTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZTsKLQotICAgIHNwPElFZmZlY3RzRmFjdG9yeT4gbUVmZmVjdHNGYWN0b3J5OwotICAgIGhpZGxfdmVjPEVmZmVjdERlc2NyaXB0b3I+IG1MYXN0RGVzY3JpcHRvcnM7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCk7Ci0gICAgdmlydHVhbCB+RWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCk7Ci0KLSAgICBzdGF0dXNfdCBxdWVyeUFsbERlc2NyaXB0b3JzKCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVFNfRkFDVE9SWV9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFkMWZhMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmNwcApAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0LzIuMC9JRWZmZWN0c0ZhY3RvcnkuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC80LjAvSUVmZmVjdHNGYWN0b3J5Lmg+CisKKyNpbmNsdWRlIDxFZmZlY3RzRmFjdG9yeUhhbEhpZGwuaD4KKyNpbmNsdWRlIDxsaWJhdWRpb2hhbC80LjAvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmg+CisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBzdGF0aWMKK3NwPEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlPiBFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZTo6Y3JlYXRlKCkgeworICAgIGlmIChoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6SUVmZmVjdHNGYWN0b3J5OjpnZXRTZXJ2aWNlKCkgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbmV3IFY0XzA6OkVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpOworICAgIH0KKyAgICBpZiAoaGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OklFZmZlY3RzRmFjdG9yeTo6Z2V0U2VydmljZSgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFZmZlY3RzRmFjdG9yeUhhbEhpZGwoKTsKKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKKy8vIHN0YXRpYworYm9vbCBFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZTo6aXNOdWxsVXVpZChjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCkgeworICAgIHJldHVybiBtZW1jbXAocEVmZmVjdFV1aWQsIEVGRkVDVF9VVUlEX05VTEwsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMDsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxMb2NhbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbExvY2FsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJkZWY1ZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbExvY2FsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8bWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaD4KLQotI2luY2x1ZGUgIkVmZmVjdEhhbExvY2FsLmgiCi0jaW5jbHVkZSAiRWZmZWN0c0ZhY3RvcnlIYWxMb2NhbC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIHN0YXRpYwotc3A8RWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U+IEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlOjpjcmVhdGUoKSB7Ci0gICAgcmV0dXJuIG5ldyBFZmZlY3RzRmFjdG9yeUhhbExvY2FsKCk7Ci19Ci0KLS8vIHN0YXRpYwotYm9vbCBFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZTo6aXNOdWxsVXVpZChjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCkgewotICAgIHJldHVybiBFZmZlY3RJc051bGxVdWlkKHBFZmZlY3RVdWlkKTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxMb2NhbDo6cXVlcnlOdW1iZXJFZmZlY3RzKHVpbnQzMl90ICpwTnVtRWZmZWN0cykgewotICAgIHJldHVybiBFZmZlY3RRdWVyeU51bWJlckVmZmVjdHMocE51bUVmZmVjdHMpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbExvY2FsOjpnZXREZXNjcmlwdG9yKAotICAgICAgICB1aW50MzJfdCBpbmRleCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIHsKLSAgICByZXR1cm4gRWZmZWN0UXVlcnlFZmZlY3QoaW5kZXgsIHBEZXNjcmlwdG9yKTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxMb2NhbDo6Z2V0RGVzY3JpcHRvcigKLSAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7Ci0gICAgcmV0dXJuIEVmZmVjdEdldERlc2NyaXB0b3IocEVmZmVjdFV1aWQsIHBEZXNjcmlwdG9yKTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxMb2NhbDo6Y3JlYXRlRWZmZWN0KAotICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwgaW50MzJfdCBzZXNzaW9uSWQsIGludDMyX3QgaW9JZCwKLSAgICAgICAgc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiAqZWZmZWN0KSB7Ci0gICAgZWZmZWN0X2hhbmRsZV90IGhhbmRsZTsKLSAgICBpbnQgcmVzdWx0ID0gRWZmZWN0Q3JlYXRlKHBFZmZlY3RVdWlkLCBzZXNzaW9uSWQsIGlvSWQsICZoYW5kbGUpOwotICAgIGlmIChyZXN1bHQgPT0gMCkgewotICAgICAgICAqZWZmZWN0ID0gbmV3IEVmZmVjdEhhbExvY2FsKGhhbmRsZSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsTG9jYWw6OmR1bXBFZmZlY3RzKGludCBmZCkgewotICAgIHJldHVybiBFZmZlY3REdW1wRWZmZWN0cyhmZCk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsTG9jYWwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsTG9jYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDViODFiZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbExvY2FsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVFNfRkFDVE9SWV9IQUxfTE9DQUxfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVFNfRkFDVE9SWV9IQUxfTE9DQUxfSAotCi0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBFZmZlY3RzRmFjdG9yeUhhbExvY2FsIDogcHVibGljIEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGlmZmVyZW50IGVmZmVjdHMgaW4gYWxsIGxvYWRlZCBsaWJyYXJpZXMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKnBOdW1FZmZlY3RzKTsKLQotICAgIC8vIFJldHVybnMgYSBkZXNjcmlwdG9yIG9mIHRoZSBuZXh0IGF2YWlsYWJsZSBlZmZlY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXNjcmlwdG9yKHVpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLAotICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOwotCi0gICAgLy8gQ3JlYXRlcyBhbiBlZmZlY3QgZW5naW5lIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KLSAgICAvLyBUbyByZWxlYXNlIHRoZSBlZmZlY3QgZW5naW5lLCBpdCBpcyBuZWNlc3NhcnkgdG8gcmVsZWFzZSByZWZlcmVuY2VzCi0gICAgLy8gdG8gdGhlIHJldHVybmVkIGVmZmVjdCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsCi0gICAgICAgICAgICBpbnQzMl90IHNlc3Npb25JZCwgaW50MzJfdCBpb0lkLAotICAgICAgICAgICAgc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiAqZWZmZWN0KTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcEVmZmVjdHMoaW50IGZkKTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZTsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBFZmZlY3RzRmFjdG9yeUhhbExvY2FsKCkge30KLQotICAgIHZpcnR1YWwgfkVmZmVjdHNGYWN0b3J5SGFsTG9jYWwoKSB7fQotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RTX0ZBQ1RPUllfSEFMX0xPQ0FMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0hhbERlYXRoSGFuZGxlckhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvSGFsRGVhdGhIYW5kbGVySGlkbC5jcHAKaW5kZXggYTc0MjY3MS4uMWUzYWI1OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvSGFsRGVhdGhIYW5kbGVySGlkbC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvSGFsRGVhdGhIYW5kbGVySGlkbC5jcHAKQEAgLTQ4LDEyICs0OCwxMyBAQAogCiB2b2lkIEhhbERlYXRoSGFuZGxlcjo6c2VydmljZURpZWQodWludDY0X3QgLypjb29raWUqLywgY29uc3Qgd3A8SUJhc2U+JiAvKndobyovKSB7CiAgICAgLy8gTm8gbWF0dGVyIHdoaWNoIG9mIHRoZSBzZXJ2aWNlIG9iamVjdHMgaGFzIGRpZWQsCi0gICAgLy8gd2UgbmVlZCB0byBydW4gYWxsIHRoZSByZWdpc3RlcmVkIGhhbmRsZXJzIGFuZCBjcmFzaCBvdXIgcHJvY2Vzcy4KKyAgICAvLyB3ZSBuZWVkIHRvIHJ1biBhbGwgdGhlIHJlZ2lzdGVyZWQgaGFuZGxlcnMgYW5kIGV4aXQuCiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGd1YXJkKG1IYW5kbGVyc0xvY2spOwogICAgIGZvciAoY29uc3QgYXV0byYgaGFuZGxlciA6IG1IYW5kbGVycykgewogICAgICAgICBoYW5kbGVyLnNlY29uZCgpOwogICAgIH0KLSAgICBMT0dfQUxXQVlTX0ZBVEFMKCJIQUwgc2VydmVyIGNyYXNoZWQsIG5lZWQgdG8gcmVzdGFydCIpOworICAgIEFMT0dFKCJIQUwgc2VydmVyIGNyYXNoZWQsIGF1ZGlvIHNlcnZlciBpcyByZXN0YXJ0aW5nIik7CisgICAgZXhpdCgxKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxIaWRsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNhZmEzNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxIaWRsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDc1MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJTdHJlYW1IYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvSVN0cmVhbU91dENhbGxiYWNrLmg+Ci0jaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDxtZWRpYXV0aWxzL1NjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCi0jaW5jbHVkZSAiRWZmZWN0SGFsSGlkbC5oIgotI2luY2x1ZGUgIlN0cmVhbUhhbEhpZGwuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9DaGFubmVsTWFzazsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvRm9ybWF0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6VGhyZWFkSW5mbzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpBdWRpb0RyYWluOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklTdHJlYW1PdXRDYWxsYmFjazsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpNZXNzYWdlUXVldWVGbGFnQml0czsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpNbWFwQnVmZmVySW5mbzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpNbWFwUG9zaXRpb247Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6UGFyYW1ldGVyVmFsdWU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6UmVzdWx0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OlRpbWVTcGVjOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TVFEZXNjcmlwdG9yU3luYzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Ci11c2luZyBSZWFkQ29tbWFuZCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJU3RyZWFtSW46OlJlYWRDb21tYW5kOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLVN0cmVhbUhhbEhpZGw6OlN0cmVhbUhhbEhpZGwoSVN0cmVhbSAqc3RyZWFtKQotICAgICAgICA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJTdHJlYW0iKSwKLSAgICAgICAgICBtU3RyZWFtKHN0cmVhbSksCi0gICAgICAgICAgbUhhbFRocmVhZFByaW9yaXR5KEhBTF9USFJFQURfUFJJT1JJVFlfREVGQVVMVCksCi0gICAgICAgICAgbUNhY2hlZEJ1ZmZlclNpemUoMCl7Ci0KLSAgICAvLyBJbnN0cnVtZW50IGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgotICAgIC8vIE5vdGU6IFRoaXMgYXNzdW1lcyBjaGFubmVsIG1hc2ssIGZvcm1hdCwgYW5kIHNhbXBsZSByYXRlIGRvIG5vdCBjaGFuZ2UgYWZ0ZXIgY3JlYXRpb24uCi0gICAgaWYgKG1TdHJlYW0gIT0gbnVsbHB0ciAmJiBtU3RyZWFtUG93ZXJMb2cuaXNVc2VyRGVidWdPckVuZ0J1aWxkKCkpIHsKLSAgICAgICAgLy8gT2J0YWluIGF1ZGlvIHByb3BlcnRpZXMgKHNlZSBTdHJlYW1IYWxIaWRsOjpnZXRBdWRpb1Byb3BlcnRpZXMoKSBiZWxvdykuCi0gICAgICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgICAgICAgICAgWyZdKHVpbnQzMl90IHNyLCBBdWRpb0NoYW5uZWxNYXNrIG0sIEF1ZGlvRm9ybWF0IGYpIHsKLSAgICAgICAgICAgICAgICBtU3RyZWFtUG93ZXJMb2cuaW5pdChzciwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihtKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX2Zvcm1hdF90PihmKSk7Ci0gICAgICAgICAgICB9KTsKLSAgICB9Ci19Ci0KLVN0cmVhbUhhbEhpZGw6On5TdHJlYW1IYWxIaWRsKCkgewotICAgIG1TdHJlYW0gPSBudWxscHRyOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRTYW1wbGVSYXRlKHVpbnQzMl90ICpyYXRlKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0U2FtcGxlUmF0ZSIsIG1TdHJlYW0tPmdldFNhbXBsZVJhdGUoKSwgcmF0ZSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBwcm9jZXNzUmV0dXJuKCJnZXRCdWZmZXJTaXplIiwgbVN0cmVhbS0+Z2V0QnVmZmVyU2l6ZSgpLCBzaXplKTsKLSAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgIG1DYWNoZWRCdWZmZXJTaXplID0gKnNpemU7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0Q2hhbm5lbE1hc2siLCBtU3RyZWFtLT5nZXRDaGFubmVsTWFzaygpLCBtYXNrKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRGb3JtYXQiLCBtU3RyZWFtLT5nZXRGb3JtYXQoKSwgZm9ybWF0KTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0QXVkaW9Qcm9wZXJ0aWVzKAotICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2ssIGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgICAgICBbJl0odWludDMyX3Qgc3IsIEF1ZGlvQ2hhbm5lbE1hc2sgbSwgQXVkaW9Gb3JtYXQgZikgewotICAgICAgICAgICAgICAgICpzYW1wbGVSYXRlID0gc3I7Ci0gICAgICAgICAgICAgICAgKm1hc2sgPSBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4obSk7Ci0gICAgICAgICAgICAgICAgKmZvcm1hdCA9IHN0YXRpY19jYXN0PGF1ZGlvX2Zvcm1hdF90PihmKTsKLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRBdWRpb1Byb3BlcnRpZXMiLCByZXQpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBoaWRsUGFyYW1zOwotICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcmFtZXRlcnNGcm9tSGFsKGt2UGFpcnMsICZoaWRsUGFyYW1zKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRQYXJhbWV0ZXJzIiwgbVN0cmVhbS0+c2V0UGFyYW1ldGVycyhoaWRsUGFyYW1zKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7Ci0gICAgdmFsdWVzLT5jbGVhcigpOwotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaGlkbF92ZWM8aGlkbF9zdHJpbmc+IGhpZGxLZXlzOwotICAgIHN0YXR1c190IHN0YXR1cyA9IGtleXNGcm9tSGFsKGtleXMsICZoaWRsS2V5cyk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRQYXJhbWV0ZXJzKAotICAgICAgICAgICAgaGlkbEtleXMsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiYgcGFyYW1ldGVycykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNUb0hhbChwYXJhbWV0ZXJzLCB2YWx1ZXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRQYXJhbWV0ZXJzIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjphZGRFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJhZGRFZmZlY3QiLCBtU3RyZWFtLT5hZGRFZmZlY3QoCi0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEhhbEhpZGwqPihlZmZlY3QuZ2V0KCkpLT5lZmZlY3RJZCgpKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnJlbW92ZUVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInJlbW92ZUVmZmVjdCIsIG1TdHJlYW0tPnJlbW92ZUVmZmVjdCgKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0SGFsSGlkbCo+KGVmZmVjdC5nZXQoKSktPmVmZmVjdElkKCkpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c3RhbmRieSgpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdGFuZGJ5IiwgbVN0cmVhbS0+c3RhbmRieSgpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6ZHVtcChpbnQgZmQpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIG5hdGl2ZV9oYW5kbGVfdCogaGlkbEhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOwotICAgIGhpZGxIYW5kbGUtPmRhdGFbMF0gPSBmZDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+ZGVidWdEdW1wKGhpZGxIYW5kbGUpOwotICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhpZGxIYW5kbGUpOwotICAgIG1TdHJlYW1Qb3dlckxvZy5kdW1wKGZkKTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZHVtcCIsIHJldCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0YXJ0KCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN0YXJ0IiwgbVN0cmVhbS0+c3RhcnQoKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0b3AoKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3RvcCIsIG1TdHJlYW0tPnN0b3AoKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSB7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Y3JlYXRlTW1hcEJ1ZmZlcigKLSAgICAgICAgICAgIG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IE1tYXBCdWZmZXJJbmZvJiBoaWRsSW5mbykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGUgKmhhbmRsZSA9IGhpZGxJbmZvLnNoYXJlZE1lbW9yeS5oYW5kbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZS0+bnVtRmRzID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c2hhcmVkX21lbW9yeV9mZCA9IGhhbmRsZS0+ZGF0YVswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmJ1ZmZlcl9zaXplX2ZyYW1lcyA9IGhpZGxJbmZvLmJ1ZmZlclNpemVGcmFtZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5idXJzdF9zaXplX2ZyYW1lcyA9IGhpZGxJbmZvLmJ1cnN0U2l6ZUZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZm8tPnNoYXJlZF9tZW1vcnlfYWRkcmVzcyBpcyBub3QgbmVlZGVkIGluIEhJREwgY29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c2hhcmVkX21lbW9yeV9hZGRyZXNzID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImNyZWF0ZU1tYXBCdWZmZXIiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pIHsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRNbWFwUG9zaXRpb24oCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IE1tYXBQb3NpdGlvbiYgaGlkbFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24tPnRpbWVfbmFub3NlY29uZHMgPSBoaWRsUG9zaXRpb24udGltZU5hbm9zZWNvbmRzOwotICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbi0+cG9zaXRpb25fZnJhbWVzID0gaGlkbFBvc2l0aW9uLnBvc2l0aW9uRnJhbWVzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNbWFwUG9zaXRpb24iLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnNldEhhbFRocmVhZFByaW9yaXR5KGludCBwcmlvcml0eSkgewotICAgIG1IYWxUaHJlYWRQcmlvcml0eSA9IHByaW9yaXR5OwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0Q2FjaGVkQnVmZmVyU2l6ZShzaXplX3QgKnNpemUpIHsKLSAgICBpZiAobUNhY2hlZEJ1ZmZlclNpemUgIT0gMCkgewotICAgICAgICAqc2l6ZSA9IG1DYWNoZWRCdWZmZXJTaXplOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotICAgIHJldHVybiBnZXRCdWZmZXJTaXplKHNpemUpOwotfQotCi1ib29sIFN0cmVhbUhhbEhpZGw6OnJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShwaWRfdCB0aHJlYWRQaWQsIHBpZF90IHRocmVhZElkKSB7Ci0gICAgaWYgKG1IYWxUaHJlYWRQcmlvcml0eSA9PSBIQUxfVEhSRUFEX1BSSU9SSVRZX0RFRkFVTFQpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGludCBlcnIgPSByZXF1ZXN0UHJpb3JpdHkoCi0gICAgICAgICAgICB0aHJlYWRQaWQsIHRocmVhZElkLAotICAgICAgICAgICAgbUhhbFRocmVhZFByaW9yaXR5LCBmYWxzZSAvKmlzRm9yQXBwKi8sIHRydWUgLyphc3luY2hyb25vdXMqLyk7Ci0gICAgQUxPR0VfSUYoZXJyLCAiZmFpbGVkIHRvIHNldCBwcmlvcml0eSAlZCBmb3IgcGlkICVkIHRpZCAlZDsgZXJyb3IgJWQiLAotICAgICAgICAgICAgbUhhbFRocmVhZFByaW9yaXR5LCB0aHJlYWRQaWQsIHRocmVhZElkLCBlcnIpOwotICAgIC8vIEF1ZGlvIHdpbGwgc3RpbGwgd29yaywgYnV0IGxhdGVuY3kgd2lsbCBiZSBoaWdoZXIgYW5kIHNvbWV0aW1lcyB1bmFjY2VwdGFibGUuCi0gICAgcmV0dXJuIGVyciA9PSAwOwotfQotCi1uYW1lc3BhY2UgewotCi0vKiBOb3RlcyBvbiBjYWxsYmFjayBvd25lcnNoaXAuCi0KLVRoaXMgaXMgaG93IChIdylCaW5kZXIgb3duZXJzaGlwIG1vZGVsIGxvb2tzIGxpa2UuIFRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KLWlzIG93bmVkIGJ5IEJpbmRlciBmcmFtZXdvcmsgKHZpYSBzcDw+KS4gUHJveGllcyBhcmUgb3duZWQgYnkgY2xpZW50cy4KLVdoZW4gdGhlIGxhc3QgcHJveHkgZGlzYXBwZWFycywgQmluZGVyIGZyYW1ld29yayByZWxlYXNlcyB0aGUgc2VydmVyIGltcGwuCi0KLVRodXMsIGl0IGlzIG5vdCBuZWVkZWQgdG8ga2VlcCBhbnkgcmVmZXJlbmNlcyB0byBTdHJlYW1PdXRDYWxsYmFjayAodGhpcyBpcwotdGhlIHNlcnZlciBpbXBsKSAtLSBpdCB3aWxsIGxpdmUgYXMgbG9uZyBhcyBIQUwgc2VydmVyIGhvbGRzIGEgc3Ryb25nIHJlZiB0bwotSVN0cmVhbU91dENhbGxiYWNrIHByb3h5LiBXZSBjbGVhciB0aGF0IHJlZmVyZW5jZSBieSBjYWxsaW5nICdjbGVhckNhbGxiYWNrJwotZnJvbSB0aGUgZGVzdHJ1Y3RvciBvZiBTdHJlYW1PdXRIYWxIaWRsLgotCi1UaGUgY2FsbGJhY2sgb25seSBrZWVwcyBhIHdlYWsgcmVmZXJlbmNlIHRvIHRoZSBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgb3duZWQKLWJ5IEF1ZGlvRmxpbmdlci4KLQotKi8KLQotc3RydWN0IFN0cmVhbU91dENhbGxiYWNrIDogcHVibGljIElTdHJlYW1PdXRDYWxsYmFjayB7Ci0gICAgU3RyZWFtT3V0Q2FsbGJhY2soY29uc3Qgd3A8U3RyZWFtT3V0SGFsSGlkbD4mIHN0cmVhbSkgOiBtU3RyZWFtKHN0cmVhbSkge30KLQotICAgIC8vIElTdHJlYW1PdXRDYWxsYmFjayBpbXBsZW1lbnRhdGlvbgotICAgIFJldHVybjx2b2lkPiBvbldyaXRlUmVhZHkoKSAgb3ZlcnJpZGUgewotICAgICAgICBzcDxTdHJlYW1PdXRIYWxIaWRsPiBzdHJlYW0gPSBtU3RyZWFtLnByb21vdGUoKTsKLSAgICAgICAgaWYgKHN0cmVhbSAhPSAwKSB7Ci0gICAgICAgICAgICBzdHJlYW0tPm9uV3JpdGVSZWFkeSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgfQotCi0gICAgUmV0dXJuPHZvaWQ+IG9uRHJhaW5SZWFkeSgpICBvdmVycmlkZSB7Ci0gICAgICAgIHNwPFN0cmVhbU91dEhhbEhpZGw+IHN0cmVhbSA9IG1TdHJlYW0ucHJvbW90ZSgpOwotICAgICAgICBpZiAoc3RyZWFtICE9IDApIHsKLSAgICAgICAgICAgIHN0cmVhbS0+b25EcmFpblJlYWR5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICB9Ci0KLSAgICBSZXR1cm48dm9pZD4gb25FcnJvcigpICBvdmVycmlkZSB7Ci0gICAgICAgIHNwPFN0cmVhbU91dEhhbEhpZGw+IHN0cmVhbSA9IG1TdHJlYW0ucHJvbW90ZSgpOwotICAgICAgICBpZiAoc3RyZWFtICE9IDApIHsKLSAgICAgICAgICAgIHN0cmVhbS0+b25FcnJvcigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgd3A8U3RyZWFtT3V0SGFsSGlkbD4gbVN0cmVhbTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1TdHJlYW1PdXRIYWxIaWRsOjpTdHJlYW1PdXRIYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1PdXQ+JiBzdHJlYW0pCi0gICAgICAgIDogU3RyZWFtSGFsSGlkbChzdHJlYW0uZ2V0KCkpLCBtU3RyZWFtKHN0cmVhbSksIG1Xcml0ZXJDbGllbnQoMCksIG1FZkdyb3VwKG51bGxwdHIpIHsKLX0KLQotU3RyZWFtT3V0SGFsSGlkbDo6flN0cmVhbU91dEhhbEhpZGwoKSB7Ci0gICAgaWYgKG1TdHJlYW0gIT0gMCkgewotICAgICAgICBpZiAobUNhbGxiYWNrLnVuc2FmZV9nZXQoKSkgewotICAgICAgICAgICAgcHJvY2Vzc1JldHVybigiY2xlYXJDYWxsYmFjayIsIG1TdHJlYW0tPmNsZWFyQ2FsbGJhY2soKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJvY2Vzc1JldHVybigiY2xvc2UiLCBtU3RyZWFtLT5jbG9zZSgpKTsKLSAgICAgICAgbVN0cmVhbS5jbGVhcigpOwotICAgIH0KLSAgICBtQ2FsbGJhY2suY2xlYXIoKTsKLSAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICAgIGlmIChtRWZHcm91cCkgewotICAgICAgICBFdmVudEZsYWc6OmRlbGV0ZUV2ZW50RmxhZygmbUVmR3JvdXApOwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRGcmFtZVNpemUiLCBtU3RyZWFtLT5nZXRGcmFtZVNpemUoKSwgc2l6ZSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldExhdGVuY3kodWludDMyX3QgKmxhdGVuY3kpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBpZiAobVdyaXRlckNsaWVudCA9PSBnZXR0aWQoKSAmJiBtQ29tbWFuZE1RKSB7Ci0gICAgICAgIHJldHVybiBjYWxsV3JpdGVyVGhyZWFkKAotICAgICAgICAgICAgICAgIFdyaXRlQ29tbWFuZDo6R0VUX0xBVEVOQ1ksICJnZXRMYXRlbmN5IiwgbnVsbHB0ciwgMCwKLSAgICAgICAgICAgICAgICBbJl0oY29uc3QgV3JpdGVTdGF0dXMmIHdyaXRlU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICpsYXRlbmN5ID0gd3JpdGVTdGF0dXMucmVwbHkubGF0ZW5jeU1zOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRMYXRlbmN5IiwgbVN0cmVhbS0+Z2V0TGF0ZW5jeSgpLCBsYXRlbmN5KTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRWb2x1bWUiLCBtU3RyZWFtLT5zZXRWb2x1bWUobGVmdCwgcmlnaHQpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6d3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbikgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgICp3cml0dGVuID0gMDsKLQotICAgIGlmIChieXRlcyA9PSAwICYmICFtRGF0YU1RKSB7Ci0gICAgICAgIC8vIENhbid0IGRldGVybWluZSB0aGUgc2l6ZSBmb3IgdGhlIE1RIGJ1ZmZlci4gV2FpdCBmb3IgYSBub24tZW1wdHkgd3JpdGUgcmVxdWVzdC4KLSAgICAgICAgQUxPR1dfSUYobUNhbGxiYWNrLnVuc2FmZV9nZXQoKSwgIkZpcnN0IGNhbGwgdG8gYXN5bmMgd3JpdGUgd2l0aCAwIGJ5dGVzIik7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgaWYgKCFtRGF0YU1RKSB7Ci0gICAgICAgIC8vIEluIGNhc2UgaWYgcGxheWJhY2sgc3RhcnRzIGNsb3NlIHRvIHRoZSBlbmQgb2YgYSBjb21wcmVzc2VkIHRyYWNrLCB0aGUgYnl0ZXMKLSAgICAgICAgLy8gdGhhdCBuZWVkIHRvIGJlIHdyaXR0ZW4gaXMgbGVzcyB0aGFuIHRoZSBhY3R1YWwgYnVmZmVyIHNpemUuIE5lZWQgdG8gdXNlCi0gICAgICAgIC8vIGZ1bGwgYnVmZmVyIHNpemUgZm9yIHRoZSBNUSBzaW5jZSBvdGhlcndpc2UgYWZ0ZXIgc2Vla2luZyBiYWNrIHRvIHRoZSBtaWRkbGUKLSAgICAgICAgLy8gZGF0YSB3aWxsIGJlIHRydW5jYXRlZC4KLSAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemU7Ci0gICAgICAgIGlmICgoc3RhdHVzID0gZ2V0Q2FjaGVkQnVmZmVyU2l6ZSgmYnVmZmVyU2l6ZSkpICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIGlmIChieXRlcyA+IGJ1ZmZlclNpemUpIGJ1ZmZlclNpemUgPSBieXRlczsKLSAgICAgICAgaWYgKChzdGF0dXMgPSBwcmVwYXJlRm9yV3JpdGluZyhidWZmZXJTaXplKSkgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0dXMgPSBjYWxsV3JpdGVyVGhyZWFkKAotICAgICAgICAgICAgV3JpdGVDb21tYW5kOjpXUklURSwgIndyaXRlIiwgc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCo+KGJ1ZmZlciksIGJ5dGVzLAotICAgICAgICAgICAgWyZdIChjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpIHsKLSAgICAgICAgICAgICAgICAqd3JpdHRlbiA9IHdyaXRlU3RhdHVzLnJlcGx5LndyaXR0ZW47Ci0gICAgICAgICAgICAgICAgLy8gRGlhZ25vc3RpY3Mgb2YgdGhlIGNhdXNlIG9mIGIvMzU4MTMxMTMuCi0gICAgICAgICAgICAgICAgQUxPR0VfSUYoKndyaXR0ZW4gPiBieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICJoYWwgcmVwb3J0cyBtb3JlIGJ5dGVzIHdyaXR0ZW4gdGhhbiBhc2tlZCBmb3I6ICVsbGQgPiAlbGxkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpKndyaXR0ZW4sIChsb25nIGxvbmcpYnl0ZXMpOwotICAgICAgICAgICAgfSk7Ci0gICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICp3cml0dGVuKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpjYWxsV3JpdGVyVGhyZWFkKAotICAgICAgICBXcml0ZUNvbW1hbmQgY21kLCBjb25zdCBjaGFyKiBjbWROYW1lLAotICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YVNpemUsIFN0cmVhbU91dEhhbEhpZGw6OldyaXRlckNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgaWYgKCFtQ29tbWFuZE1RLT53cml0ZSgmY21kKSkgewotICAgICAgICBBTE9HRSgiY29tbWFuZCBtZXNzYWdlIHF1ZXVlIHdyaXRlIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7Ci0gICAgICAgIHJldHVybiAtRUFHQUlOOwotICAgIH0KLSAgICBpZiAoZGF0YSAhPSBudWxscHRyKSB7Ci0gICAgICAgIHNpemVfdCBhdmFpbGFibGVUb1dyaXRlID0gbURhdGFNUS0+YXZhaWxhYmxlVG9Xcml0ZSgpOwotICAgICAgICBpZiAoZGF0YVNpemUgPiBhdmFpbGFibGVUb1dyaXRlKSB7Ci0gICAgICAgICAgICBBTE9HVygidHJ1bmNhdGluZyB3cml0ZSBkYXRhIGZyb20gJWxsZCB0byAlbGxkIGR1ZSB0byBpbnN1ZmZpY2llbnQgZGF0YSBxdWV1ZSBzcGFjZSIsCi0gICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpZGF0YVNpemUsIChsb25nIGxvbmcpYXZhaWxhYmxlVG9Xcml0ZSk7Ci0gICAgICAgICAgICBkYXRhU2l6ZSA9IGF2YWlsYWJsZVRvV3JpdGU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtRGF0YU1RLT53cml0ZShkYXRhLCBkYXRhU2l6ZSkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJkYXRhIG1lc3NhZ2UgcXVldWUgd3JpdGUgZmFpbGVkIGZvciBcIiVzXCIiLCBjbWROYW1lKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtRWZHcm91cC0+d2FrZShzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9FTVBUWSkpOwotCi0gICAgLy8gVE9ETzogUmVtb3ZlIG1hbnVhbCBldmVudCBmbGFnIGhhbmRsaW5nIG9uY2UgYmxvY2tpbmcgTVEgaXMgaW1wbGVtZW50ZWQuIGIvMzM4MTU0MjIKLSAgICB1aW50MzJfdCBlZlN0YXRlID0gMDsKLXJldHJ5OgotICAgIHN0YXR1c190IHJldCA9IG1FZkdyb3VwLT53YWl0KHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0ZVTEwpLCAmZWZTdGF0ZSk7Ci0gICAgaWYgKGVmU3RhdGUgJiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9GVUxMKSkgewotICAgICAgICBXcml0ZVN0YXR1cyB3cml0ZVN0YXR1czsKLSAgICAgICAgd3JpdGVTdGF0dXMucmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgICAgIGlmICghbVN0YXR1c01RLT5yZWFkKCZ3cml0ZVN0YXR1cykpIHsKLSAgICAgICAgICAgIEFMT0dFKCJzdGF0dXMgbWVzc2FnZSByZWFkIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHdyaXRlU3RhdHVzLnJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICByZXQgPSBPSzsKLSAgICAgICAgICAgIGNhbGxiYWNrKHdyaXRlU3RhdHVzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldCA9IHByb2Nlc3NSZXR1cm4oY21kTmFtZSwgd3JpdGVTdGF0dXMucmV0dmFsKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgICBpZiAocmV0ID09IC1FQUdBSU4gfHwgcmV0ID09IC1FSU5UUikgewotICAgICAgICAvLyBTcHVyaW91cyB3YWtldXAuIFRoaXMgbm9ybWFsbHkgcmV0cmllcyBubyBtb3JlIHRoYW4gb25jZS4KLSAgICAgICAgZ290byByZXRyeTsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6cHJlcGFyZUZvcldyaXRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiB0ZW1wQ29tbWFuZE1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IHRlbXBEYXRhTVE7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiB0ZW1wU3RhdHVzTVE7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBwaWRfdCBoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+cHJlcGFyZUZvcldyaXRpbmcoCi0gICAgICAgICAgICAxLCBidWZmZXJTaXplLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDb21tYW5kTVE6OkRlc2NyaXB0b3ImIGNvbW1hbmRNUSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YU1ROjpEZXNjcmlwdG9yJiBkYXRhTVEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0YXR1c01ROjpEZXNjcmlwdG9yJiBzdGF0dXNNUSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyZWFkSW5mbyYgaGFsVGhyZWFkSW5mbykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBDb21tYW5kTVEucmVzZXQobmV3IENvbW1hbmRNUShjb21tYW5kTVEpKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcERhdGFNUS5yZXNldChuZXcgRGF0YU1RKGRhdGFNUSkpOwotICAgICAgICAgICAgICAgICAgICB0ZW1wU3RhdHVzTVEucmVzZXQobmV3IFN0YXR1c01RKHN0YXR1c01RKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wRGF0YU1RLT5pc1ZhbGlkKCkgJiYgdGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEZsYWc6OmNyZWF0ZUV2ZW50RmxhZyh0ZW1wRGF0YU1RLT5nZXRFdmVudEZsYWdXb3JkKCksICZtRWZHcm91cCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaGFsVGhyZWFkUGlkID0gaGFsVGhyZWFkSW5mby5waWQ7Ci0gICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFRpZCA9IGhhbFRocmVhZEluZm8udGlkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmICghcmV0LmlzT2soKSB8fCByZXR2YWwgIT0gUmVzdWx0OjpPSykgewotICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicHJlcGFyZUZvcldyaXRpbmciLCByZXQsIHJldHZhbCk7Ci0gICAgfQotICAgIGlmICghdGVtcENvbW1hbmRNUSB8fCAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpIHx8Ci0gICAgICAgICAgICAhdGVtcERhdGFNUSB8fCAhdGVtcERhdGFNUS0+aXNWYWxpZCgpIHx8Ci0gICAgICAgICAgICAhdGVtcFN0YXR1c01RIHx8ICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSB8fAotICAgICAgICAgICAgIW1FZkdyb3VwKSB7Ci0gICAgICAgIEFMT0dFX0lGKCF0ZW1wQ29tbWFuZE1RLCAiRmFpbGVkIHRvIG9idGFpbiBjb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmciKTsKLSAgICAgICAgQUxPR0VfSUYodGVtcENvbW1hbmRNUSAmJiAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpLAotICAgICAgICAgICAgICAgICJDb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOwotICAgICAgICBBTE9HRV9JRighdGVtcERhdGFNUSwgIkZhaWxlZCB0byBvYnRhaW4gZGF0YSBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBEYXRhTVEgJiYgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSwgIkRhdGEgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyBpcyBpbnZhbGlkIik7Ci0gICAgICAgIEFMT0dFX0lGKCF0ZW1wU3RhdHVzTVEsICJGYWlsZWQgdG8gb2J0YWluIHN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBTdGF0dXNNUSAmJiAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCksCi0gICAgICAgICAgICAgICAgIlN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIGlzIGludmFsaWQiKTsKLSAgICAgICAgQUxPR0VfSUYoIW1FZkdyb3VwLCAiRXZlbnQgZmxhZyBjcmVhdGlvbiBmb3Igd3JpdGluZyBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZCk7Ci0KLSAgICBtQ29tbWFuZE1RID0gc3RkOjptb3ZlKHRlbXBDb21tYW5kTVEpOwotICAgIG1EYXRhTVEgPSBzdGQ6Om1vdmUodGVtcERhdGFNUSk7Ci0gICAgbVN0YXR1c01RID0gc3RkOjptb3ZlKHRlbXBTdGF0dXNNUSk7Ci0gICAgbVdyaXRlckNsaWVudCA9IGdldHRpZCgpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcykgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldFJlbmRlclBvc2l0aW9uKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50MzJfdCBkKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKmRzcEZyYW1lcyA9IGQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFJlbmRlclBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0TmV4dFdyaXRlVGltZXN0YW1wKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBpbnQ2NF90IHQpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqdGltZXN0YW1wID0gdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UmVuZGVyUG9zaXRpb24iLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjaykgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHN0YXR1c190IHN0YXR1cyA9IHByb2Nlc3NSZXR1cm4oCi0gICAgICAgICAgICAic2V0Q2FsbGJhY2siLCBtU3RyZWFtLT5zZXRDYWxsYmFjayhuZXcgU3RyZWFtT3V0Q2FsbGJhY2sodGhpcykpKTsKLSAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPnN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoCi0gICAgICAgICAgICBbJl0oYm9vbCBwLCBib29sIHIpIHsKLSAgICAgICAgICAgICAgICAqc3VwcG9ydHNQYXVzZSA9IHA7Ci0gICAgICAgICAgICAgICAgKnN1cHBvcnRzUmVzdW1lID0gcjsKLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdXBwb3J0c1BhdXNlQW5kUmVzdW1lIiwgcmV0KTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6cGF1c2UoKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInBhdXNlIiwgbVN0cmVhbS0+cGF1c2UoKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnJlc3VtZSgpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicGF1c2UiLCBtU3RyZWFtLT5yZXN1bWUoKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbikgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdXBwb3J0c0RyYWluIiwgbVN0cmVhbS0+c3VwcG9ydHNEcmFpbigpLCBzdXBwb3J0c0RyYWluKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6ZHJhaW4oYm9vbCBlYXJseU5vdGlmeSkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKAotICAgICAgICAgICAgImRyYWluIiwgbVN0cmVhbS0+ZHJhaW4oZWFybHlOb3RpZnkgPyBBdWRpb0RyYWluOjpFQVJMWV9OT1RJRlkgOiBBdWRpb0RyYWluOjpBTEwpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Zmx1c2goKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInBhdXNlIiwgbVN0cmVhbS0+Zmx1c2goKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKG1Xcml0ZXJDbGllbnQgPT0gZ2V0dGlkKCkgJiYgbUNvbW1hbmRNUSkgewotICAgICAgICByZXR1cm4gY2FsbFdyaXRlclRocmVhZCgKLSAgICAgICAgICAgICAgICBXcml0ZUNvbW1hbmQ6OkdFVF9QUkVTRU5UQVRJT05fUE9TSVRJT04sICJnZXRQcmVzZW50YXRpb25Qb3NpdGlvbiIsIG51bGxwdHIsIDAsCi0gICAgICAgICAgICAgICAgWyZdKGNvbnN0IFdyaXRlU3RhdHVzJiB3cml0ZVN0YXR1cykgewotICAgICAgICAgICAgICAgICAgICAqZnJhbWVzID0gd3JpdGVTdGF0dXMucmVwbHkucHJlc2VudGF0aW9uUG9zaXRpb24uZnJhbWVzOwotICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPnR2X3NlYyA9IHdyaXRlU3RhdHVzLnJlcGx5LnByZXNlbnRhdGlvblBvc2l0aW9uLnRpbWVTdGFtcC50dlNlYzsKLSAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT50dl9uc2VjID0gd3JpdGVTdGF0dXMucmVwbHkucHJlc2VudGF0aW9uUG9zaXRpb24udGltZVN0YW1wLnR2TlNlYzsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9IGVsc2UgewotICAgICAgICBSZXN1bHQgcmV0dmFsOwotICAgICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0UHJlc2VudGF0aW9uUG9zaXRpb24oCi0gICAgICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50NjRfdCBoaWRsRnJhbWVzLCBjb25zdCBUaW1lU3BlYyYgaGlkbFRpbWVTdGFtcCkgewotICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpmcmFtZXMgPSBoaWRsRnJhbWVzOwotICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT50dl9zZWMgPSBoaWRsVGltZVN0YW1wLnR2U2VjOwotICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT50dl9uc2VjID0gaGlkbFRpbWVTdGFtcC50dk5TZWM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFByZXNlbnRhdGlvblBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOwotICAgIH0KLX0KLQotdm9pZCBTdHJlYW1PdXRIYWxIaWRsOjpvbldyaXRlUmVhZHkoKSB7Ci0gICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKLSAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuOwotICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrIG9uV3JpdGVSZWFkeSIpOwotICAgIGNhbGxiYWNrLT5vbldyaXRlUmVhZHkoKTsKLX0KLQotdm9pZCBTdHJlYW1PdXRIYWxIaWRsOjpvbkRyYWluUmVhZHkoKSB7Ci0gICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKLSAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuOwotICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrIG9uRHJhaW5SZWFkeSIpOwotICAgIGNhbGxiYWNrLT5vbkRyYWluUmVhZHkoKTsKLX0KLQotdm9pZCBTdHJlYW1PdXRIYWxIaWRsOjpvbkVycm9yKCkgewotICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayA9IG1DYWxsYmFjay5wcm9tb3RlKCk7Ci0gICAgaWYgKGNhbGxiYWNrID09IDApIHJldHVybjsKLSAgICBBTE9HVigiYXN5bmNDYWxsYmFjayBvbkVycm9yIik7Ci0gICAgY2FsbGJhY2stPm9uRXJyb3IoKTsKLX0KLQotCi1TdHJlYW1JbkhhbEhpZGw6OlN0cmVhbUluSGFsSGlkbChjb25zdCBzcDxJU3RyZWFtSW4+JiBzdHJlYW0pCi0gICAgICAgIDogU3RyZWFtSGFsSGlkbChzdHJlYW0uZ2V0KCkpLCBtU3RyZWFtKHN0cmVhbSksIG1SZWFkZXJDbGllbnQoMCksIG1FZkdyb3VwKG51bGxwdHIpIHsKLX0KLQotU3RyZWFtSW5IYWxIaWRsOjp+U3RyZWFtSW5IYWxIaWRsKCkgewotICAgIGlmIChtU3RyZWFtICE9IDApIHsKLSAgICAgICAgcHJvY2Vzc1JldHVybigiY2xvc2UiLCBtU3RyZWFtLT5jbG9zZSgpKTsKLSAgICAgICAgbVN0cmVhbS5jbGVhcigpOwotICAgICAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICAgIH0KLSAgICBpZiAobUVmR3JvdXApIHsKLSAgICAgICAgRXZlbnRGbGFnOjpkZWxldGVFdmVudEZsYWcoJm1FZkdyb3VwKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRGcmFtZVNpemUiLCBtU3RyZWFtLT5nZXRGcmFtZVNpemUoKSwgc2l6ZSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6c2V0R2FpbihmbG9hdCBnYWluKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldEdhaW4iLCBtU3RyZWFtLT5zZXRHYWluKGdhaW4pKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpyZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKnJlYWQpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICAqcmVhZCA9IDA7Ci0KLSAgICBpZiAoYnl0ZXMgPT0gMCAmJiAhbURhdGFNUSkgewotICAgICAgICAvLyBDYW4ndCBkZXRlcm1pbmUgdGhlIHNpemUgZm9yIHRoZSBNUSBidWZmZXIuIFdhaXQgZm9yIGEgbm9uLWVtcHR5IHJlYWQgcmVxdWVzdC4KLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICBpZiAoIW1EYXRhTVEgJiYgKHN0YXR1cyA9IHByZXBhcmVGb3JSZWFkaW5nKGJ5dGVzKSkgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICBSZWFkUGFyYW1ldGVycyBwYXJhbXM7Ci0gICAgcGFyYW1zLmNvbW1hbmQgPSBSZWFkQ29tbWFuZDo6UkVBRDsKLSAgICBwYXJhbXMucGFyYW1zLnJlYWQgPSBieXRlczsKLSAgICBzdGF0dXMgPSBjYWxsUmVhZGVyVGhyZWFkKHBhcmFtcywgInJlYWQiLAotICAgICAgICAgICAgWyZdKGNvbnN0IFJlYWRTdGF0dXMmIHJlYWRTdGF0dXMpIHsKLSAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgYXZhaWxUb1JlYWQgPSBtRGF0YU1RLT5hdmFpbGFibGVUb1JlYWQoKTsKLSAgICAgICAgICAgICAgICBpZiAoIW1EYXRhTVEtPnJlYWQoc3RhdGljX2Nhc3Q8dWludDhfdCo+KGJ1ZmZlciksIHN0ZDo6bWluKGJ5dGVzLCBhdmFpbFRvUmVhZCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJkYXRhIG1lc3NhZ2UgcXVldWUgcmVhZCBmYWlsZWQgZm9yIFwicmVhZFwiIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFMT0dXX0lGKGF2YWlsVG9SZWFkICE9IHJlYWRTdGF0dXMucmVwbHkucmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICJIQUwgcmVhZCByZXBvcnQgaW5jb25zaXN0ZW50OiBtcSA9ICVkLCBzdGF0dXMgPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdClhdmFpbFRvUmVhZCwgKGludDMyX3QpcmVhZFN0YXR1cy5yZXBseS5yZWFkKTsKLSAgICAgICAgICAgICAgICAqcmVhZCA9IHJlYWRTdGF0dXMucmVwbHkucmVhZDsKLSAgICAgICAgICAgIH0pOwotICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coYnVmZmVyLCAqcmVhZCk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpjYWxsUmVhZGVyVGhyZWFkKAotICAgICAgICBjb25zdCBSZWFkUGFyYW1ldGVycyYgcGFyYW1zLCBjb25zdCBjaGFyKiBjbWROYW1lLAotICAgICAgICBTdHJlYW1JbkhhbEhpZGw6OlJlYWRlckNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgaWYgKCFtQ29tbWFuZE1RLT53cml0ZSgmcGFyYW1zKSkgewotICAgICAgICBBTE9HVygiY29tbWFuZCBtZXNzYWdlIHF1ZXVlIHdyaXRlIGZhaWxlZCIpOwotICAgICAgICByZXR1cm4gLUVBR0FJTjsKLSAgICB9Ci0gICAgbUVmR3JvdXAtPndha2Uoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRlVMTCkpOwotCi0gICAgLy8gVE9ETzogUmVtb3ZlIG1hbnVhbCBldmVudCBmbGFnIGhhbmRsaW5nIG9uY2UgYmxvY2tpbmcgTVEgaXMgaW1wbGVtZW50ZWQuIGIvMzM4MTU0MjIKLSAgICB1aW50MzJfdCBlZlN0YXRlID0gMDsKLXJldHJ5OgotICAgIHN0YXR1c190IHJldCA9IG1FZkdyb3VwLT53YWl0KHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0VNUFRZKSwgJmVmU3RhdGUpOwotICAgIGlmIChlZlN0YXRlICYgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRU1QVFkpKSB7Ci0gICAgICAgIFJlYWRTdGF0dXMgcmVhZFN0YXR1czsKLSAgICAgICAgcmVhZFN0YXR1cy5yZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICAgICAgaWYgKCFtU3RhdHVzTVEtPnJlYWQoJnJlYWRTdGF0dXMpKSB7Ci0gICAgICAgICAgICBBTE9HRSgic3RhdHVzIG1lc3NhZ2UgcmVhZCBmYWlsZWQgZm9yIFwiJXNcIiIsIGNtZE5hbWUpOwotICAgICAgICB9Ci0gICAgICAgICBpZiAocmVhZFN0YXR1cy5yZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgcmV0ID0gT0s7Ci0gICAgICAgICAgICBjYWxsYmFjayhyZWFkU3RhdHVzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldCA9IHByb2Nlc3NSZXR1cm4oY21kTmFtZSwgcmVhZFN0YXR1cy5yZXR2YWwpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIGlmIChyZXQgPT0gLUVBR0FJTiB8fCByZXQgPT0gLUVJTlRSKSB7Ci0gICAgICAgIC8vIFNwdXJpb3VzIHdha2V1cC4gVGhpcyBub3JtYWxseSByZXRyaWVzIG5vIG1vcmUgdGhhbiBvbmNlLgotICAgICAgICBnb3RvIHJldHJ5OwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnByZXBhcmVGb3JSZWFkaW5nKHNpemVfdCBidWZmZXJTaXplKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRNUT4gdGVtcENvbW1hbmRNUTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8RGF0YU1RPiB0ZW1wRGF0YU1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gdGVtcFN0YXR1c01ROwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgcGlkX3QgaGFsVGhyZWFkUGlkLCBoYWxUaHJlYWRUaWQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPnByZXBhcmVGb3JSZWFkaW5nKAotICAgICAgICAgICAgMSwgYnVmZmVyU2l6ZSwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29tbWFuZE1ROjpEZXNjcmlwdG9yJiBjb21tYW5kTVEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFNUTo6RGVzY3JpcHRvciYgZGF0YU1RLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBTdGF0dXNNUTo6RGVzY3JpcHRvciYgc3RhdHVzTVEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmVhZEluZm8mIGhhbFRocmVhZEluZm8pIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICB0ZW1wQ29tbWFuZE1RLnJlc2V0KG5ldyBDb21tYW5kTVEoY29tbWFuZE1RKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBEYXRhTVEucmVzZXQobmV3IERhdGFNUShkYXRhTVEpKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcFN0YXR1c01RLnJlc2V0KG5ldyBTdGF0dXNNUShzdGF0dXNNUSkpOwotICAgICAgICAgICAgICAgICAgICBpZiAodGVtcERhdGFNUS0+aXNWYWxpZCgpICYmIHRlbXBEYXRhTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRGbGFnOjpjcmVhdGVFdmVudEZsYWcodGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpLCAmbUVmR3JvdXApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFBpZCA9IGhhbFRocmVhZEluZm8ucGlkOwotICAgICAgICAgICAgICAgICAgICBoYWxUaHJlYWRUaWQgPSBoYWxUaHJlYWRJbmZvLnRpZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAoIXJldC5pc09rKCkgfHwgcmV0dmFsICE9IFJlc3VsdDo6T0spIHsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInByZXBhcmVGb3JSZWFkaW5nIiwgcmV0LCByZXR2YWwpOwotICAgIH0KLSAgICBpZiAoIXRlbXBDb21tYW5kTVEgfHwgIXRlbXBDb21tYW5kTVEtPmlzVmFsaWQoKSB8fAotICAgICAgICAgICAgIXRlbXBEYXRhTVEgfHwgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSB8fAotICAgICAgICAgICAgIXRlbXBTdGF0dXNNUSB8fCAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCkgfHwKLSAgICAgICAgICAgICFtRWZHcm91cCkgewotICAgICAgICBBTE9HRV9JRighdGVtcENvbW1hbmRNUSwgIkZhaWxlZCB0byBvYnRhaW4gY29tbWFuZCBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBDb21tYW5kTVEgJiYgIXRlbXBDb21tYW5kTVEtPmlzVmFsaWQoKSwKLSAgICAgICAgICAgICAgICAiQ29tbWFuZCBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIGlzIGludmFsaWQiKTsKLSAgICAgICAgQUxPR0VfSUYoIXRlbXBEYXRhTVEsICJGYWlsZWQgdG8gb2J0YWluIGRhdGEgbWVzc2FnZSBxdWV1ZSBmb3IgcmVhZGluZyIpOwotICAgICAgICBBTE9HRV9JRih0ZW1wRGF0YU1RICYmICF0ZW1wRGF0YU1RLT5pc1ZhbGlkKCksICJEYXRhIG1lc3NhZ2UgcXVldWUgZm9yIHJlYWRpbmcgaXMgaW52YWxpZCIpOwotICAgICAgICBBTE9HRV9JRighdGVtcFN0YXR1c01RLCAiRmFpbGVkIHRvIG9idGFpbiBzdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgcmVhZGluZyIpOwotICAgICAgICBBTE9HRV9JRih0ZW1wU3RhdHVzTVEgJiYgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpLAotICAgICAgICAgICAgICAgICJTdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgcmVhZGluZyBpcyBpbnZhbGlkIik7Ci0gICAgICAgIEFMT0dFX0lGKCFtRWZHcm91cCwgIkV2ZW50IGZsYWcgY3JlYXRpb24gZm9yIHJlYWRpbmcgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkoaGFsVGhyZWFkUGlkLCBoYWxUaHJlYWRUaWQpOwotCi0gICAgbUNvbW1hbmRNUSA9IHN0ZDo6bW92ZSh0ZW1wQ29tbWFuZE1RKTsKLSAgICBtRGF0YU1RID0gc3RkOjptb3ZlKHRlbXBEYXRhTVEpOwotICAgIG1TdGF0dXNNUSA9IHN0ZDo6bW92ZSh0ZW1wU3RhdHVzTVEpOwotICAgIG1SZWFkZXJDbGllbnQgPSBnZXR0aWQoKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Z2V0SW5wdXRGcmFtZXNMb3N0KHVpbnQzMl90ICpmcmFtZXNMb3N0KSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldElucHV0RnJhbWVzTG9zdCIsIG1TdHJlYW0tPmdldElucHV0RnJhbWVzTG9zdCgpLCBmcmFtZXNMb3N0KTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKG1SZWFkZXJDbGllbnQgPT0gZ2V0dGlkKCkgJiYgbUNvbW1hbmRNUSkgewotICAgICAgICBSZWFkUGFyYW1ldGVycyBwYXJhbXM7Ci0gICAgICAgIHBhcmFtcy5jb21tYW5kID0gUmVhZENvbW1hbmQ6OkdFVF9DQVBUVVJFX1BPU0lUSU9OOwotICAgICAgICByZXR1cm4gY2FsbFJlYWRlclRocmVhZChwYXJhbXMsICJnZXRDYXB0dXJlUG9zaXRpb24iLAotICAgICAgICAgICAgICAgIFsmXShjb25zdCBSZWFkU3RhdHVzJiByZWFkU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICpmcmFtZXMgPSByZWFkU3RhdHVzLnJlcGx5LmNhcHR1cmVQb3NpdGlvbi5mcmFtZXM7Ci0gICAgICAgICAgICAgICAgICAgICp0aW1lID0gcmVhZFN0YXR1cy5yZXBseS5jYXB0dXJlUG9zaXRpb24udGltZTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9IGVsc2UgewotICAgICAgICBSZXN1bHQgcmV0dmFsOwotICAgICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0Q2FwdHVyZVBvc2l0aW9uKAotICAgICAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDY0X3QgaGlkbEZyYW1lcywgdWludDY0X3QgaGlkbFRpbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZnJhbWVzID0gaGlkbEZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgICAgICp0aW1lID0gaGlkbFRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldENhcHR1cmVQb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKLSAgICB9Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbUhhbEhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRhYjk0My4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0hJRExfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfSElETF9ICi0KLSNpbmNsdWRlIDxhdG9taWM+Ci0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JU3RyZWFtLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvSVN0cmVhbUluLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvSVN0cmVhbU91dC5oPgotI2luY2x1ZGUgPGZtcS9FdmVudEZsYWcuaD4KLSNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmg+Ci0KLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotI2luY2x1ZGUgIlN0cmVhbVBvd2VyTG9nLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJU3RyZWFtOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklTdHJlYW1JbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJU3RyZWFtT3V0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6RXZlbnRGbGFnOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgUmVhZFBhcmFtZXRlcnMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVN0cmVhbUluOjpSZWFkUGFyYW1ldGVyczsKLXVzaW5nIFJlYWRTdGF0dXMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVN0cmVhbUluOjpSZWFkU3RhdHVzOwotdXNpbmcgV3JpdGVDb21tYW5kID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklTdHJlYW1PdXQ6OldyaXRlQ29tbWFuZDsKLXVzaW5nIFdyaXRlU3RhdHVzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklTdHJlYW1PdXQ6OldyaXRlU3RhdHVzOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIERldmljZUhhbEhpZGw7Ci0KLWNsYXNzIFN0cmVhbUhhbEhpZGwgOiBwdWJsaWMgdmlydHVhbCBTdHJlYW1IYWxJbnRlcmZhY2UsIHB1YmxpYyBDb252ZXJzaW9uSGVscGVySGlkbAotewotICBwdWJsaWM6Ci0gICAgLy8gUmV0dXJuIHRoZSBzYW1wbGluZyByYXRlIGluIEh6IC0gZWcuIDQ0MTAwLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSk7Ci0KLSAgICAvLyBSZXR1cm4gc2l6ZSBvZiBpbnB1dC9vdXRwdXQgYnVmZmVyIGluIGJ5dGVzIGZvciB0aGlzIHN0cmVhbSAtIGVnLiA0ODAwLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgLy8gUmV0dXJuIHRoZSBjaGFubmVsIG1hc2suCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzayk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGZvcm1hdCAtIGUuZy4gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7Ci0KLSAgICAvLyBDb252ZW5pZW5jZSBtZXRob2QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2ssIGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOwotCi0gICAgLy8gU2V0IGF1ZGlvIHN0cmVhbSBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKTsKLQotICAgIC8vIEdldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKTsKLQotICAgIC8vIEFkZCBvciByZW1vdmUgdGhlIGVmZmVjdCBvbiB0aGUgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7Ci0KLSAgICAvLyBQdXQgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0L291dHB1dCBpbnRvIHN0YW5kYnkgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YW5kYnkoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOwotCi0gICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7Ci0KLSAgICAvLyBTdG9wIGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0KLSAgICAvLyBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBidWZmZXIgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKTsKLQotICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKTsKLQotICAgIC8vIFNldCB0aGUgcHJpb3JpdHkgb2YgdGhlIHRocmVhZCB0aGF0IGludGVyYWN0cyB3aXRoIHRoZSBIQUwKLSAgICAvLyAobXVzdCBtYXRjaCB0aGUgcHJpb3JpdHkgb2YgdGhlIGF1ZGlvZmxpbmdlcidzIHRocmVhZCB0aGF0IGNhbGxzICdyZWFkJyAvICd3cml0ZScpCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRIYWxUaHJlYWRQcmlvcml0eShpbnQgcHJpb3JpdHkpOwotCi0gIHByb3RlY3RlZDoKLSAgICAvLyBTdWJjbGFzc2VzIGNhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBleHBsaWNpdCBTdHJlYW1IYWxIaWRsKElTdHJlYW0gKnN0cmVhbSk7Ci0KLSAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgc3RyZWFtLgotICAgIHZpcnR1YWwgflN0cmVhbUhhbEhpZGwoKTsKLQotICAgIHN0YXR1c190IGdldENhY2hlZEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKTsKLQotICAgIGJvb2wgcmVxdWVzdEhhbFRocmVhZFByaW9yaXR5KHBpZF90IHRocmVhZFBpZCwgcGlkX3QgdGhyZWFkSWQpOwotCi0gICAgLy8gbVN0cmVhbVBvd2VyTG9nIGlzIHVzZWQgZm9yIGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgotICAgIFN0cmVhbVBvd2VyTG9nIG1TdHJlYW1Qb3dlckxvZzsKLQotICBwcml2YXRlOgotICAgIGNvbnN0IGludCBIQUxfVEhSRUFEX1BSSU9SSVRZX0RFRkFVTFQgPSAtMTsKLSAgICBJU3RyZWFtICptU3RyZWFtOwotICAgIGludCBtSGFsVGhyZWFkUHJpb3JpdHk7Ci0gICAgc2l6ZV90IG1DYWNoZWRCdWZmZXJTaXplOwotfTsKLQotY2xhc3MgU3RyZWFtT3V0SGFsSGlkbCA6IHB1YmxpYyBTdHJlYW1PdXRIYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxIaWRsIHsKLSAgcHVibGljOgotICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGhhcmR3YXJlIGRyaXZlciBlc3RpbWF0ZWQgbGF0ZW5jeSBpbiBtaWxsaXNlY29uZHMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KTsKLQotICAgIC8vIFVzZSB0aGlzIG1ldGhvZCBpbiBzaXR1YXRpb25zIHdoZXJlIGF1ZGlvIG1peGluZyBpcyBkb25lIGluIHRoZSBoYXJkd2FyZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCk7Ci0KLSAgICAvLyBXcml0ZSBhdWRpbyBidWZmZXIgdG8gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbik7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgd3JpdHRlbiBieSB0aGUgYXVkaW8gZHNwIHRvIERBQyBzaW5jZQotICAgIC8vIHRoZSBvdXRwdXQgaGFzIGV4aXRlZCBzdGFuZGJ5LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcyk7Ci0KLSAgICAvLyBHZXQgdGhlIGxvY2FsIHRpbWUgYXQgd2hpY2ggdGhlIG5leHQgd3JpdGUgdG8gdGhlIGF1ZGlvIGRyaXZlciB3aWxsIGJlIHByZXNlbnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRXcml0ZVRpbWVzdGFtcChpbnQ2NF90ICp0aW1lc3RhbXApOwotCi0gICAgLy8gU2V0IHRoZSBjYWxsYmFjayBmb3Igbm90aWZ5aW5nIGNvbXBsZXRpb24gb2Ygbm9uLWJsb2NraW5nIHdyaXRlIGFuZCBkcmFpbi4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayk7Ci0KLSAgICAvLyBSZXR1cm5zIHdoZXRoZXIgcGF1c2UgYW5kIHJlc3VtZSBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKTsKLQotICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKLQotICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdW1lKCk7Ci0KLSAgICAvLyBSZXR1cm5zIHdoZXRoZXIgZHJhaW4gb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbik7Ci0KLSAgICAvLyBSZXF1ZXN0cyBub3RpZmljYXRpb24gd2hlbiBkYXRhIGJ1ZmZlcmVkIGJ5IHRoZSBkcml2ZXIvaGFyZHdhcmUgaGFzIGJlZW4gcGxheWVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHJhaW4oYm9vbCBlYXJseU5vdGlmeSk7Ci0KLSAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIGZsdXNoIHRoZSBxdWV1ZWQgZGF0YS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKCk7Ci0KLSAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcHJlc2VudGVkIHRvIGFuIGV4dGVybmFsIG9ic2VydmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApOwotCi0gICAgLy8gTWV0aG9kcyB1c2VkIGJ5IFN0cmVhbU91dENhbGxiYWNrIChISURMKS4KLSAgICB2b2lkIG9uV3JpdGVSZWFkeSgpOwotICAgIHZvaWQgb25EcmFpblJlYWR5KCk7Ci0gICAgdm9pZCBvbkVycm9yKCk7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsSGlkbDsKLSAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxXcml0ZUNvbW1hbmQsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBDb21tYW5kTVE7Ci0gICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8dWludDhfdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IERhdGFNUTsKLSAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxXcml0ZVN0YXR1cywgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IFN0YXR1c01ROwotCi0gICAgd3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IG1DYWxsYmFjazsKLSAgICBzcDxJU3RyZWFtT3V0PiBtU3RyZWFtOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kTVE+IG1Db21tYW5kTVE7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPERhdGFNUT4gbURhdGFNUTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IG1TdGF0dXNNUTsKLSAgICBzdGQ6OmF0b21pYzxwaWRfdD4gbVdyaXRlckNsaWVudDsKLSAgICBFdmVudEZsYWcqIG1FZkdyb3VwOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIFN0cmVhbU91dEhhbEhpZGwoY29uc3Qgc3A8SVN0cmVhbU91dD4mIHN0cmVhbSk7Ci0KLSAgICB2aXJ0dWFsIH5TdHJlYW1PdXRIYWxIaWRsKCk7Ci0KLSAgICB1c2luZyBXcml0ZXJDYWxsYmFjayA9IHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpPjsKLSAgICBzdGF0dXNfdCBjYWxsV3JpdGVyVGhyZWFkKAotICAgICAgICAgICAgV3JpdGVDb21tYW5kIGNtZCwgY29uc3QgY2hhciogY21kTmFtZSwKLSAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhU2l6ZSwgV3JpdGVyQ2FsbGJhY2sgY2FsbGJhY2spOwotICAgIHN0YXR1c190IHByZXBhcmVGb3JXcml0aW5nKHNpemVfdCBidWZmZXJTaXplKTsKLX07Ci0KLWNsYXNzIFN0cmVhbUluSGFsSGlkbCA6IHB1YmxpYyBTdHJlYW1JbkhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbEhpZGwgewotICBwdWJsaWM6Ci0gICAgLy8gUmV0dXJuIHRoZSBmcmFtZSBzaXplIChudW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZSkgb2YgYSBzdHJlYW0uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIFNldCB0aGUgaW5wdXQgZ2FpbiBmb3IgdGhlIGF1ZGlvIGRyaXZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEdhaW4oZmxvYXQgZ2Fpbik7Ci0KLSAgICAvLyBSZWFkIGF1ZGlvIGJ1ZmZlciBpbiBmcm9tIGRyaXZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGFtb3VudCBvZiBpbnB1dCBmcmFtZXMgbG9zdCBpbiB0aGUgYXVkaW8gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRGcmFtZXNMb3N0KHVpbnQzMl90ICpmcmFtZXNMb3N0KTsKLQotICAgIC8vIFJldHVybiBhIHJlY2VudCBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyByZWNlaXZlZCBhbmQKLSAgICAvLyB0aGUgY2xvY2sgdGltZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBmcmFtZSBjb3VudC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIERldmljZUhhbEhpZGw7Ci0gICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8UmVhZFBhcmFtZXRlcnMsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBDb21tYW5kTVE7Ci0gICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8dWludDhfdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IERhdGFNUTsKLSAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxSZWFkU3RhdHVzLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gU3RhdHVzTVE7Ci0KLSAgICBzcDxJU3RyZWFtSW4+IG1TdHJlYW07Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRNUT4gbUNvbW1hbmRNUTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8RGF0YU1RPiBtRGF0YU1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gbVN0YXR1c01ROwotICAgIHN0ZDo6YXRvbWljPHBpZF90PiBtUmVhZGVyQ2xpZW50OwotICAgIEV2ZW50RmxhZyogbUVmR3JvdXA7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgU3RyZWFtSW5IYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1Jbj4mIHN0cmVhbSk7Ci0KLSAgICB2aXJ0dWFsIH5TdHJlYW1JbkhhbEhpZGwoKTsKLQotICAgIHVzaW5nIFJlYWRlckNhbGxiYWNrID0gc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJlYWRTdGF0dXMmIHJlYWRTdGF0dXMpPjsKLSAgICBzdGF0dXNfdCBjYWxsUmVhZGVyVGhyZWFkKAotICAgICAgICAgICAgY29uc3QgUmVhZFBhcmFtZXRlcnMmIHBhcmFtcywgY29uc3QgY2hhciogY21kTmFtZSwgUmVhZGVyQ2FsbGJhY2sgY2FsbGJhY2spOwotICAgIHN0YXR1c190IHByZXBhcmVGb3JSZWFkaW5nKHNpemVfdCBidWZmZXJTaXplKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbUhhbExvY2FsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbUhhbExvY2FsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMxN2Y1Yy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxMb2NhbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiU3RyZWFtSGFsTG9jYWwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiRGV2aWNlSGFsTG9jYWwuaCIKLSNpbmNsdWRlICJFZmZlY3RIYWxMb2NhbC5oIgotI2luY2x1ZGUgIlN0cmVhbUhhbExvY2FsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotU3RyZWFtSGFsTG9jYWw6OlN0cmVhbUhhbExvY2FsKGF1ZGlvX3N0cmVhbV90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpCi0gICAgICAgIDogbURldmljZShkZXZpY2UpLAotICAgICAgICAgIG1TdHJlYW0oc3RyZWFtKSB7Ci0gICAgLy8gSW5zdHJ1bWVudCBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KLSAgICAvLyBOb3RlOiBUaGlzIGFzc3VtZXMgY2hhbm5lbCBtYXNrLCBmb3JtYXQsIGFuZCBzYW1wbGUgcmF0ZSBkbyBub3QgY2hhbmdlIGFmdGVyIGNyZWF0aW9uLgotICAgIGlmIChtU3RyZWFtICE9IG51bGxwdHIgJiYgbVN0cmVhbVBvd2VyTG9nLmlzVXNlckRlYnVnT3JFbmdCdWlsZCgpKSB7Ci0gICAgICAgIG1TdHJlYW1Qb3dlckxvZy5pbml0KG1TdHJlYW0tPmdldF9zYW1wbGVfcmF0ZShtU3RyZWFtKSwKLSAgICAgICAgICAgICAgICBtU3RyZWFtLT5nZXRfY2hhbm5lbHMobVN0cmVhbSksCi0gICAgICAgICAgICAgICAgbVN0cmVhbS0+Z2V0X2Zvcm1hdChtU3RyZWFtKSk7Ci0gICAgfQotfQotCi1TdHJlYW1IYWxMb2NhbDo6flN0cmVhbUhhbExvY2FsKCkgewotICAgIG1TdHJlYW0gPSAwOwotICAgIG1EZXZpY2UuY2xlYXIoKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpIHsKLSAgICAqcmF0ZSA9IG1TdHJlYW0tPmdldF9zYW1wbGVfcmF0ZShtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSkgewotICAgICpzaXplID0gbVN0cmVhbS0+Z2V0X2J1ZmZlcl9zaXplKG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrKSB7Ci0gICAgKm1hc2sgPSBtU3RyZWFtLT5nZXRfY2hhbm5lbHMobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpIHsKLSAgICAqZm9ybWF0ID0gbVN0cmVhbS0+Z2V0X2Zvcm1hdChtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgewotICAgICpzYW1wbGVSYXRlID0gbVN0cmVhbS0+Z2V0X3NhbXBsZV9yYXRlKG1TdHJlYW0pOwotICAgICptYXNrID0gbVN0cmVhbS0+Z2V0X2NoYW5uZWxzKG1TdHJlYW0pOwotICAgICpmb3JtYXQgPSBtU3RyZWFtLT5nZXRfZm9ybWF0KG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgewotICAgIHJldHVybiBtU3RyZWFtLT5zZXRfcGFyYW1ldGVycyhtU3RyZWFtLCBrdlBhaXJzLnN0cmluZygpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7Ci0gICAgY2hhciAqaGFsVmFsdWVzID0gbVN0cmVhbS0+Z2V0X3BhcmFtZXRlcnMobVN0cmVhbSwga2V5cy5zdHJpbmcoKSk7Ci0gICAgaWYgKGhhbFZhbHVlcyAhPSBOVUxMKSB7Ci0gICAgICAgIHZhbHVlcy0+c2V0VG8oaGFsVmFsdWVzKTsKLSAgICAgICAgZnJlZShoYWxWYWx1ZXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHZhbHVlcy0+Y2xlYXIoKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6YWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSB7Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRighZWZmZWN0LT5pc0xvY2FsKCksICJPbmx5IGxvY2FsIGVmZmVjdHMgY2FuIGJlIGFkZGVkIGZvciBhIGxvY2FsIHN0cmVhbSIpOwotICAgIHJldHVybiBtU3RyZWFtLT5hZGRfYXVkaW9fZWZmZWN0KG1TdHJlYW0sCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RIYWxMb2NhbCo+KGVmZmVjdC5nZXQoKSktPmhhbmRsZSgpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OnJlbW92ZUVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCkgewotICAgIExPR19BTFdBWVNfRkFUQUxfSUYoIWVmZmVjdC0+aXNMb2NhbCgpLCAiT25seSBsb2NhbCBlZmZlY3RzIGNhbiBiZSByZW1vdmVkIGZvciBhIGxvY2FsIHN0cmVhbSIpOwotICAgIHJldHVybiBtU3RyZWFtLT5yZW1vdmVfYXVkaW9fZWZmZWN0KG1TdHJlYW0sCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RIYWxMb2NhbCo+KGVmZmVjdC5nZXQoKSktPmhhbmRsZSgpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OnN0YW5kYnkoKSB7Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnN0YW5kYnkobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpkdW1wKGludCBmZCkgewotICAgIHN0YXR1c190IHN0YXR1cyA9IG1TdHJlYW0tPmR1bXAobVN0cmVhbSwgZmQpOwotICAgIG1TdHJlYW1Qb3dlckxvZy5kdW1wKGZkKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6c2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50KSB7Ci0gICAgLy8gRG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBhcyBsb2NhbCBoYWwgaXMgZXhlY3V0ZWQgYnkgYXVkaW9mbGluZ2VyIGRpcmVjdGx5Ci0gICAgLy8gb24gdGhlIHNhbWUgdGhyZWFkLgotICAgIHJldHVybiBPSzsKLX0KLQotU3RyZWFtT3V0SGFsTG9jYWw6OlN0cmVhbU91dEhhbExvY2FsKGF1ZGlvX3N0cmVhbV9vdXRfdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKQotICAgICAgICA6IFN0cmVhbUhhbExvY2FsKCZzdHJlYW0tPmNvbW1vbiwgZGV2aWNlKSwgbVN0cmVhbShzdHJlYW0pIHsKLX0KLQotU3RyZWFtT3V0SGFsTG9jYWw6On5TdHJlYW1PdXRIYWxMb2NhbCgpIHsKLSAgICBtQ2FsbGJhY2suY2xlYXIoKTsKLSAgICBtRGV2aWNlLT5jbG9zZU91dHB1dFN0cmVhbShtU3RyZWFtKTsKLSAgICBtU3RyZWFtID0gMDsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpIHsKLSAgICAqc2l6ZSA9IGF1ZGlvX3N0cmVhbV9vdXRfZnJhbWVfc2l6ZShtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KSB7Ci0gICAgKmxhdGVuY3kgPSBtU3RyZWFtLT5nZXRfbGF0ZW5jeShtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIHsKLSAgICBpZiAobVN0cmVhbS0+c2V0X3ZvbHVtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnNldF92b2x1bWUobVN0cmVhbSwgbGVmdCwgcmlnaHQpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6d3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbikgewotICAgIHNzaXplX3Qgd3JpdGVSZXN1bHQgPSBtU3RyZWFtLT53cml0ZShtU3RyZWFtLCBidWZmZXIsIGJ5dGVzKTsKLSAgICBpZiAod3JpdGVSZXN1bHQgPiAwKSB7Ci0gICAgICAgICp3cml0dGVuID0gd3JpdGVSZXN1bHQ7Ci0gICAgICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coYnVmZmVyLCAqd3JpdHRlbik7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9IGVsc2UgewotICAgICAgICAqd3JpdHRlbiA9IDA7Ci0gICAgICAgIHJldHVybiB3cml0ZVJlc3VsdDsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqZHNwRnJhbWVzKSB7Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmdldF9yZW5kZXJfcG9zaXRpb24obVN0cmVhbSwgZHNwRnJhbWVzKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldE5leHRXcml0ZVRpbWVzdGFtcChpbnQ2NF90ICp0aW1lc3RhbXApIHsKLSAgICBpZiAobVN0cmVhbS0+Z2V0X25leHRfd3JpdGVfdGltZXN0YW1wID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X25leHRfd3JpdGVfdGltZXN0YW1wKG1TdHJlYW0sIHRpbWVzdGFtcCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spIHsKLSAgICBpZiAobVN0cmVhbS0+c2V0X2NhbGxiYWNrID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBtU3RyZWFtLT5zZXRfY2FsbGJhY2sobVN0cmVhbSwgU3RyZWFtT3V0SGFsTG9jYWw6OmFzeW5jQ2FsbGJhY2ssIHRoaXMpOwotICAgIGlmIChyZXN1bHQgPT0gT0spIHsKLSAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8vIHN0YXRpYwotaW50IFN0cmVhbU91dEhhbExvY2FsOjphc3luY0NhbGxiYWNrKHN0cmVhbV9jYWxsYmFja19ldmVudF90IGV2ZW50LCB2b2lkKiwgdm9pZCAqY29va2llKSB7Ci0gICAgLy8gV2UgYWN0IGFzIGlmIHdlIGdhdmUgYSB3cDxTdHJlYW1PdXRIYWxMb2NhbD4gdG8gSEFMLiBUaGlzIHdheSB3ZSBzaG91bGQgaGFuZGxlCi0gICAgLy8gY29ycmVjdGx5IHRoZSBjYXNlIHdoZW4gdGhlIGNhbGxiYWNrIGlzIGludm9rZWQgd2hpbGUgU3RyZWFtT3V0SGFsTG9jYWwncyBkZXN0cnVjdG9yIGlzCi0gICAgLy8gYWxyZWFkeSBydW5uaW5nLCBiZWNhdXNlIHRoZSBkZXN0cnVjdG9yIGlzIGludm9rZWQgYWZ0ZXIgdGhlIHJlZmNvdW50IGhhcyBiZWVuIGF0b21pY2FsbHkKLSAgICAvLyBkZWNyZW1lbnRlZC4KLSAgICB3cDxTdHJlYW1PdXRIYWxMb2NhbD4gd2Vha1NlbGYoc3RhdGljX2Nhc3Q8U3RyZWFtT3V0SGFsTG9jYWwqPihjb29raWUpKTsKLSAgICBzcDxTdHJlYW1PdXRIYWxMb2NhbD4gc2VsZiA9IHdlYWtTZWxmLnByb21vdGUoKTsKLSAgICBpZiAoc2VsZiA9PSAwKSByZXR1cm4gMDsKLSAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBzZWxmLT5tQ2FsbGJhY2sucHJvbW90ZSgpOwotICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm4gMDsKLSAgICBBTE9HVigiYXN5bmNDYWxsYmFjaygpIGV2ZW50ICVkIiwgZXZlbnQpOwotICAgIHN3aXRjaCAoZXZlbnQpIHsKLSAgICAgICAgY2FzZSBTVFJFQU1fQ0JLX0VWRU5UX1dSSVRFX1JFQURZOgotICAgICAgICAgICAgY2FsbGJhY2stPm9uV3JpdGVSZWFkeSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RSRUFNX0NCS19FVkVOVF9EUkFJTl9SRUFEWToKLSAgICAgICAgICAgIGNhbGxiYWNrLT5vbkRyYWluUmVhZHkoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNUUkVBTV9DQktfRVZFTlRfRVJST1I6Ci0gICAgICAgICAgICBjYWxsYmFjay0+b25FcnJvcigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HVygiYXN5bmNDYWxsYmFjaygpIHVua25vd24gZXZlbnQgJWQiLCBldmVudCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKSB7Ci0gICAgKnN1cHBvcnRzUGF1c2UgPSBtU3RyZWFtLT5wYXVzZSAhPSBOVUxMOwotICAgICpzdXBwb3J0c1Jlc3VtZSA9IG1TdHJlYW0tPnJlc3VtZSAhPSBOVUxMOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnBhdXNlKCkgewotICAgIGlmIChtU3RyZWFtLT5wYXVzZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnBhdXNlKG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6cmVzdW1lKCkgewotICAgIGlmIChtU3RyZWFtLT5yZXN1bWUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5yZXN1bWUobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzdXBwb3J0c0RyYWluKGJvb2wgKnN1cHBvcnRzRHJhaW4pIHsKLSAgICAqc3VwcG9ydHNEcmFpbiA9IG1TdHJlYW0tPmRyYWluICE9IE5VTEw7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6ZHJhaW4oYm9vbCBlYXJseU5vdGlmeSkgewotICAgIGlmIChtU3RyZWFtLT5kcmFpbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmRyYWluKG1TdHJlYW0sIGVhcmx5Tm90aWZ5ID8gQVVESU9fRFJBSU5fRUFSTFlfTk9USUZZIDogQVVESU9fRFJBSU5fQUxMKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmZsdXNoKCkgewotICAgIGlmIChtU3RyZWFtLT5mbHVzaCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmZsdXNoKG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApIHsKLSAgICBpZiAobVN0cmVhbS0+Z2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmdldF9wcmVzZW50YXRpb25fcG9zaXRpb24obVN0cmVhbSwgZnJhbWVzLCB0aW1lc3RhbXApOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c3RhcnQoKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnN0YXJ0ID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+c3RhcnQobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzdG9wKCkgewotICAgIGlmIChtU3RyZWFtLT5zdG9wID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+c3RvcChtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlciA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlcihtU3RyZWFtLCBtaW5TaXplRnJhbWVzLCBpbmZvKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pIHsKLSAgICBpZiAobVN0cmVhbS0+Z2V0X21tYXBfcG9zaXRpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbihtU3RyZWFtLCBwb3NpdGlvbik7Ci19Ci0KLVN0cmVhbUluSGFsTG9jYWw6OlN0cmVhbUluSGFsTG9jYWwoYXVkaW9fc3RyZWFtX2luX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSkKLSAgICAgICAgOiBTdHJlYW1IYWxMb2NhbCgmc3RyZWFtLT5jb21tb24sIGRldmljZSksIG1TdHJlYW0oc3RyZWFtKSB7Ci19Ci0KLVN0cmVhbUluSGFsTG9jYWw6On5TdHJlYW1JbkhhbExvY2FsKCkgewotICAgIG1EZXZpY2UtPmNsb3NlSW5wdXRTdHJlYW0obVN0cmVhbSk7Ci0gICAgbVN0cmVhbSA9IDA7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpIHsKLSAgICAqc2l6ZSA9IGF1ZGlvX3N0cmVhbV9pbl9mcmFtZV9zaXplKG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c2V0R2FpbihmbG9hdCBnYWluKSB7Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnNldF9nYWluKG1TdHJlYW0sIGdhaW4pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpyZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKnJlYWQpIHsKLSAgICBzc2l6ZV90IHJlYWRSZXN1bHQgPSBtU3RyZWFtLT5yZWFkKG1TdHJlYW0sIGJ1ZmZlciwgYnl0ZXMpOwotICAgIGlmIChyZWFkUmVzdWx0ID4gMCkgewotICAgICAgICAqcmVhZCA9IHJlYWRSZXN1bHQ7Ci0gICAgICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coIGJ1ZmZlciwgKnJlYWQpOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKnJlYWQgPSAwOwotICAgICAgICByZXR1cm4gcmVhZFJlc3VsdDsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldElucHV0RnJhbWVzTG9zdCh1aW50MzJfdCAqZnJhbWVzTG9zdCkgewotICAgICpmcmFtZXNMb3N0ID0gbVN0cmVhbS0+Z2V0X2lucHV0X2ZyYW1lc19sb3N0KG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0Q2FwdHVyZVBvc2l0aW9uKGludDY0X3QgKmZyYW1lcywgaW50NjRfdCAqdGltZSkgewotICAgIGlmIChtU3RyZWFtLT5nZXRfY2FwdHVyZV9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmdldF9jYXB0dXJlX3Bvc2l0aW9uKG1TdHJlYW0sIGZyYW1lcywgdGltZSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnN0YXJ0KCkgewotICAgIGlmIChtU3RyZWFtLT5zdGFydCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnN0YXJ0KG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzdG9wKCkgewotICAgIGlmIChtU3RyZWFtLT5zdG9wID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+c3RvcChtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Y3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pIHsKLSAgICBpZiAobVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyKG1TdHJlYW0sIG1pblNpemVGcmFtZXMsIGluZm8pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X21tYXBfcG9zaXRpb24obVN0cmVhbSwgcG9zaXRpb24pOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsTG9jYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzcxMzZkZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxMb2NhbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9MT0NBTF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9MT0NBTF9ICi0KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaD4KLSNpbmNsdWRlICJTdHJlYW1Qb3dlckxvZy5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIERldmljZUhhbExvY2FsOwotCi1jbGFzcyBTdHJlYW1IYWxMb2NhbCA6IHB1YmxpYyB2aXJ0dWFsIFN0cmVhbUhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgLy8gUmV0dXJuIHRoZSBzYW1wbGluZyByYXRlIGluIEh6IC0gZWcuIDQ0MTAwLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSk7Ci0KLSAgICAvLyBSZXR1cm4gc2l6ZSBvZiBpbnB1dC9vdXRwdXQgYnVmZmVyIGluIGJ5dGVzIGZvciB0aGlzIHN0cmVhbSAtIGVnLiA0ODAwLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgLy8gUmV0dXJuIHRoZSBjaGFubmVsIG1hc2suCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzayk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGZvcm1hdCAtIGUuZy4gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7Ci0KLSAgICAvLyBDb252ZW5pZW5jZSBtZXRob2QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2ssIGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOwotCi0gICAgLy8gU2V0IGF1ZGlvIHN0cmVhbSBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKTsKLQotICAgIC8vIEdldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKTsKLQotICAgIC8vIEFkZCBvciByZW1vdmUgdGhlIGVmZmVjdCBvbiB0aGUgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7Ci0KLSAgICAvLyBQdXQgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0L291dHB1dCBpbnRvIHN0YW5kYnkgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YW5kYnkoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOwotCi0gICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCkgPSAwOwotCi0gICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpID0gMDsKLQotICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pID0gMDsKLQotICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSA9IDA7Ci0KLSAgICAvLyBTZXQgdGhlIHByaW9yaXR5IG9mIHRoZSB0aHJlYWQgdGhhdCBpbnRlcmFjdHMgd2l0aCB0aGUgSEFMCi0gICAgLy8gKG11c3QgbWF0Y2ggdGhlIHByaW9yaXR5IG9mIHRoZSBhdWRpb2ZsaW5nZXIncyB0aHJlYWQgdGhhdCBjYWxscyAncmVhZCcgLyAnd3JpdGUnKQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50IHByaW9yaXR5KTsKLQotICBwcm90ZWN0ZWQ6Ci0gICAgLy8gU3ViY2xhc3NlcyBjYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgU3RyZWFtSGFsTG9jYWwoYXVkaW9fc3RyZWFtX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSk7Ci0KLSAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgc3RyZWFtLgotICAgIHZpcnR1YWwgflN0cmVhbUhhbExvY2FsKCk7Ci0KLSAgICBzcDxEZXZpY2VIYWxMb2NhbD4gbURldmljZTsKLQotICAgIC8vIG1TdHJlYW1Qb3dlckxvZyBpcyB1c2VkIGZvciBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KLSAgICBTdHJlYW1Qb3dlckxvZyBtU3RyZWFtUG93ZXJMb2c7Ci0KLSAgcHJpdmF0ZToKLSAgICBhdWRpb19zdHJlYW1fdCAqbVN0cmVhbTsKLX07Ci0KLWNsYXNzIFN0cmVhbU91dEhhbExvY2FsIDogcHVibGljIFN0cmVhbU91dEhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbExvY2FsIHsKLSAgcHVibGljOgotICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGhhcmR3YXJlIGRyaXZlciBlc3RpbWF0ZWQgbGF0ZW5jeSBpbiBtaWxsaXNlY29uZHMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KTsKLQotICAgIC8vIFVzZSB0aGlzIG1ldGhvZCBpbiBzaXR1YXRpb25zIHdoZXJlIGF1ZGlvIG1peGluZyBpcyBkb25lIGluIHRoZSBoYXJkd2FyZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCk7Ci0KLSAgICAvLyBXcml0ZSBhdWRpbyBidWZmZXIgdG8gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbik7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgd3JpdHRlbiBieSB0aGUgYXVkaW8gZHNwIHRvIERBQyBzaW5jZQotICAgIC8vIHRoZSBvdXRwdXQgaGFzIGV4aXRlZCBzdGFuZGJ5LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcyk7Ci0KLSAgICAvLyBHZXQgdGhlIGxvY2FsIHRpbWUgYXQgd2hpY2ggdGhlIG5leHQgd3JpdGUgdG8gdGhlIGF1ZGlvIGRyaXZlciB3aWxsIGJlIHByZXNlbnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRXcml0ZVRpbWVzdGFtcChpbnQ2NF90ICp0aW1lc3RhbXApOwotCi0gICAgLy8gU2V0IHRoZSBjYWxsYmFjayBmb3Igbm90aWZ5aW5nIGNvbXBsZXRpb24gb2Ygbm9uLWJsb2NraW5nIHdyaXRlIGFuZCBkcmFpbi4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayk7Ci0KLSAgICAvLyBSZXR1cm5zIHdoZXRoZXIgcGF1c2UgYW5kIHJlc3VtZSBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKTsKLQotICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKLQotICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdW1lKCk7Ci0KLSAgICAvLyBSZXR1cm5zIHdoZXRoZXIgZHJhaW4gb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbik7Ci0KLSAgICAvLyBSZXF1ZXN0cyBub3RpZmljYXRpb24gd2hlbiBkYXRhIGJ1ZmZlcmVkIGJ5IHRoZSBkcml2ZXIvaGFyZHdhcmUgaGFzIGJlZW4gcGxheWVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHJhaW4oYm9vbCBlYXJseU5vdGlmeSk7Ci0KLSAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIGZsdXNoIHRoZSBxdWV1ZWQgZGF0YS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKCk7Ci0KLSAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcHJlc2VudGVkIHRvIGFuIGV4dGVybmFsIG9ic2VydmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApOwotCi0gICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7Ci0KLSAgICAvLyBTdG9wIGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0KLSAgICAvLyBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBidWZmZXIgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKTsKLQotICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKTsKLQotICBwcml2YXRlOgotICAgIGF1ZGlvX3N0cmVhbV9vdXRfdCAqbVN0cmVhbTsKLSAgICB3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gbUNhbGxiYWNrOwotCi0gICAgZnJpZW5kIGNsYXNzIERldmljZUhhbExvY2FsOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIFN0cmVhbU91dEhhbExvY2FsKGF1ZGlvX3N0cmVhbV9vdXRfdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKTsKLQotICAgIHZpcnR1YWwgflN0cmVhbU91dEhhbExvY2FsKCk7Ci0KLSAgICBzdGF0aWMgaW50IGFzeW5jQ2FsbGJhY2soc3RyZWFtX2NhbGxiYWNrX2V2ZW50X3QgZXZlbnQsIHZvaWQgKnBhcmFtLCB2b2lkICpjb29raWUpOwotfTsKLQotY2xhc3MgU3RyZWFtSW5IYWxMb2NhbCA6IHB1YmxpYyBTdHJlYW1JbkhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbExvY2FsIHsKLSAgcHVibGljOgotICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBTZXQgdGhlIGlucHV0IGdhaW4gZm9yIHRoZSBhdWRpbyBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRHYWluKGZsb2F0IGdhaW4pOwotCi0gICAgLy8gUmVhZCBhdWRpbyBidWZmZXIgaW4gZnJvbSBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKnJlYWQpOwotCi0gICAgLy8gUmV0dXJuIHRoZSBhbW91bnQgb2YgaW5wdXQgZnJhbWVzIGxvc3QgaW4gdGhlIGF1ZGlvIGRyaXZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0RnJhbWVzTG9zdCh1aW50MzJfdCAqZnJhbWVzTG9zdCk7Ci0KLSAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcmVjZWl2ZWQgYW5kCi0gICAgLy8gdGhlIGNsb2NrIHRpbWUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZnJhbWUgY291bnQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKTsKLQotICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOwotCi0gICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotCi0gICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbyk7Ci0KLSAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbik7Ci0KLSAgcHJpdmF0ZToKLSAgICBhdWRpb19zdHJlYW1faW5fdCAqbVN0cmVhbTsKLQotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VIYWxMb2NhbDsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBTdHJlYW1JbkhhbExvY2FsKGF1ZGlvX3N0cmVhbV9pbl90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpOwotCi0gICAgdmlydHVhbCB+U3RyZWFtSW5IYWxMb2NhbCgpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0xPQ0FMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oCmluZGV4IGNhZjAxYmUuLjdkZThlYjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmgKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaApAQCAtMTcsNiArMTcsNyBAQAogI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfSU5URVJGQUNFX0gKICNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0lOVEVSRkFDRV9ICiAKKyNpbmNsdWRlIDxtZWRpYS9NaWNyb3Bob25lSW5mby5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KQEAgLTEwNSw2ICsxMDYsOSBAQAogICAgIC8vIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24uCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpID0gMDsKIAorICAgIC8vIExpc3QgbWljcm9waG9uZXMKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKSA9IDA7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKSA9IDA7CiAKICAgcHJvdGVjdGVkOgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9FZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2UuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlLmgKaW5kZXggZTg2MmY2ZS4uZDA2MDNjZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9FZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2UuaAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0VmZmVjdEJ1ZmZlckhhbEludGVyZmFjZS5oCkBAIC0yNiw2ICsyNiw3IEBACiAvLyBBYnN0cmFjdGlvbiBmb3IgYW4gYXVkaW8gYnVmZmVyLiBJdCBtYXkgYmUgYSAibWlycm9yIiBmb3IKIC8vIGEgYnVmZmVyIHRoYXQgdGhlIGVmZmVjdCBjaGFpbiBkb2Vzbid0IG93biwgb3IgYSBidWZmZXIgb3duZWQgYnkKIC8vIHRoZSBlZmZlY3QgY2hhaW4uCisvLyBCdWZmZXJzIGFyZSBjcmVhdGVkIGZyb20gRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UKIGNsYXNzIEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZSA6IHB1YmxpYyBSZWZCYXNlCiB7CiAgIHB1YmxpYzoKQEAgLTM3LDYgKzM4LDggQEAKICAgICAgICAgcmV0dXJuIGV4dGVybmFsRGF0YSgpICE9IG51bGxwdHIgPyBleHRlcm5hbERhdGEoKSA6IGF1ZGlvQnVmZmVyKCktPnJhdzsKICAgICB9CiAKKyAgICB2aXJ0dWFsIHNpemVfdCBnZXRTaXplKCkgY29uc3QgPSAwOworCiAgICAgdmlydHVhbCB2b2lkIHNldEV4dGVybmFsRGF0YSh2b2lkKiBleHRlcm5hbCkgPSAwOwogICAgIHZpcnR1YWwgdm9pZCBzZXRGcmFtZUNvdW50KHNpemVfdCBmcmFtZUNvdW50KSA9IDA7CiAgICAgdmlydHVhbCBib29sIGNoZWNrRnJhbWVDb3VudENoYW5nZSgpID0gMDsgIC8vIHJldHVybnMgd2hldGhlciBmcmFtZSBjb3VudCBoYXMgYmVlbiB1cGRhdGVkCkBAIC00Nyw5ICs1MCw2IEBACiAgICAgdmlydHVhbCB2b2lkIHVwZGF0ZShzaXplX3Qgc2l6ZSkgPSAwOyAgLy8gY29waWVzIHBhcnRpYWwgZGF0YSBmcm9tIGV4dGVybmFsIGJ1ZmZlcgogICAgIHZpcnR1YWwgdm9pZCBjb21taXQoc2l6ZV90IHNpemUpID0gMDsgIC8vIGNvcGllcyBwYXJ0aWFsIGRhdGEgdG8gZXh0ZXJuYWwgYnVmZmVyCiAKLSAgICBzdGF0aWMgc3RhdHVzX3QgYWxsb2NhdGUoc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcik7Ci0gICAgc3RhdGljIHN0YXR1c190IG1pcnJvcih2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcik7Ci0KICAgcHJvdGVjdGVkOgogICAgIC8vIFN1YmNsYXNzZXMgY2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgogICAgIEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZSgpIHt9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmgKaW5kZXggYTYxNmU4Ni4uMzE2YTQ2YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaApAQCAtNDgsNiArNDgsMTAgQEAKIAogICAgIHN0YXRpYyBzcDxFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZT4gY3JlYXRlKCk7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IGFsbG9jYXRlQnVmZmVyKHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IG1pcnJvckJ1ZmZlcih2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSA9IDA7CisKICAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gY29tcGFyZSBlZmZlY3QgdXVpZCB0byBFRkZFQ1RfVVVJRF9OVUxMLgogICAgIHN0YXRpYyBib29sIGlzTnVsbFV1aWQoY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaAppbmRleCA3NDE5YzM0Li5jOTY5ZTI4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmgKQEAgLTE3LDcgKzE3LDEwIEBACiAjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9JTlRFUkZBQ0VfSAogI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfSU5URVJGQUNFX0gKIAorI2luY2x1ZGUgPHZlY3Rvcj4KKwogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhL01pY3JvcGhvbmVJbmZvLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgpAQCAtMTQyLDYgKzE0NSwxNSBAQAogICAgIC8vIFJldHVybiBhIHJlY2VudCBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyBwcmVzZW50ZWQgdG8gYW4gZXh0ZXJuYWwgb2JzZXJ2ZXIuCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCkgPSAwOwogCisgICAgc3RydWN0IFNvdXJjZU1ldGFkYXRhIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8cGxheWJhY2tfdHJhY2tfbWV0YWRhdGFfdD4gdHJhY2tzOworICAgIH07CisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncyBzb3VyY2UgaGFzIGJlZW4gY2hhbmdlZC4KKyAgICAgKiBAcGFyYW0gc291cmNlTWV0YWRhdGEgRGVzY3JpcHRpb24gb2YgdGhlIGF1ZGlvIHRoYXQgaXMgcGxheWVkIGJ5IHRoZSBjbGllbnRzLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgdXBkYXRlU291cmNlTWV0YWRhdGEoY29uc3QgU291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKSA9IDA7CisKICAgcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgflN0cmVhbU91dEhhbEludGVyZmFjZSgpIHt9CiB9OwpAQCAtMTYxLDYgKzE3MywxOCBAQAogICAgIC8vIHRoZSBjbG9jayB0aW1lIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGZyYW1lIGNvdW50LgogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FwdHVyZVBvc2l0aW9uKGludDY0X3QgKmZyYW1lcywgaW50NjRfdCAqdGltZSkgPSAwOwogCisgICAgLy8gR2V0IGFjdGl2ZSBtaWNyb3Bob25lcworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpID0gMDsKKworICAgIHN0cnVjdCBTaW5rTWV0YWRhdGEgeworICAgICAgICBzdGQ6OnZlY3RvcjxyZWNvcmRfdHJhY2tfbWV0YWRhdGFfdD4gdHJhY2tzOworICAgIH07CisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncyBzaW5rIGhhcyBiZWVuIGNoYW5nZWQuCisgICAgICogQHBhcmFtIHNpbmtNZXRhZGF0YSBEZXNjcmlwdGlvbiBvZiB0aGUgYXVkaW8gdGhhdCBpcyBzdWdnZXN0ZWQgYnkgdGhlIGNsaWVudHMuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCB1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpID0gMDsKKwogICBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+U3RyZWFtSW5IYWxJbnRlcmZhY2UoKSB7fQogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BbmRyb2lkLm1rIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0FuZHJvaWQubWsKaW5kZXggYzg1MDk4NC4uZGExZWNjMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0FuZHJvaWQubWsKQEAgLTI0LDYgKzI0LDcgQEAKICAgICBsaWJjdXRpbHMgXAogICAgIGxpYmxvZyBcCiAgICAgbGlibmJhaW8gXAorICAgIGxpYm5ibG9nIFwKICAgICBsaWJzb25pYyBcCiAgICAgbGlidXRpbHMgXAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9NaXhlci5jcHAgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9NaXhlci5jcHAKaW5kZXggMjM4OTI1ZC4uZjZmODE3YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvTWl4ZXIuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb01peGVyLmNwcApAQCAtNjIsMjEgKzYyLDIyIEBACiAjZGVmaW5lIEFSUkFZX1NJWkUoeCkgKHNpemVvZih4KS9zaXplb2YoKHgpWzBdKSkKICNlbmRpZgogCi0vLyBUT0RPOiBNb3ZlIHRoZXNlIG1hY3JvL2lubGluZXMgdG8gYSBoZWFkZXIgZmlsZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RhdGljIGlubGluZQotVCBtYXgoY29uc3QgVCYgeCwgY29uc3QgVCYgeSkgewotICAgIHJldHVybiB4ID4geSA/IHggOiB5OwotfQotCiAvLyBTZXQga1VzZU5ld01peGVyIHRvIHRydWUgdG8gdXNlIHRoZSBuZXcgbWl4ZXIgZW5naW5lIGFsd2F5cy4gT3RoZXJ3aXNlIHRoZQogLy8gb3JpZ2luYWwgY29kZSB3aWxsIGJlIHVzZWQgZm9yIHN0ZXJlbyBzaW5rcywgdGhlIG5ldyBtaXhlciBmb3IgbXVsdGljaGFubmVsLgotc3RhdGljIGNvbnN0IGJvb2wga1VzZU5ld01peGVyID0gdHJ1ZTsKK3N0YXRpYyBjb25zdGV4cHIgYm9vbCBrVXNlTmV3TWl4ZXIgPSB0cnVlOwogCiAvLyBTZXQga1VzZUZsb2F0IHRvIHRydWUgdG8gYWxsb3cgZmxvYXRpbmcgaW5wdXQgaW50byB0aGUgbWl4ZXIgZW5naW5lLgogLy8gSWYga1VzZU5ld01peGVyIGlzIGZhbHNlLCB0aGlzIGlzIGlnbm9yZWQgb3IgbWF5IGJlIG92ZXJyaWRkZW4gaW50ZXJuYWxseQogLy8gYmVjYXVzZSBvZiBkb3dubWl4L3VwbWl4IHN1cHBvcnQuCi1zdGF0aWMgY29uc3QgYm9vbCBrVXNlRmxvYXQgPSB0cnVlOworc3RhdGljIGNvbnN0ZXhwciBib29sIGtVc2VGbG9hdCA9IHRydWU7CisKKyNpZmRlZiBGTE9BVF9BVVgKK3VzaW5nIFRZUEVfQVVYID0gZmxvYXQ7CitzdGF0aWNfYXNzZXJ0KGtVc2VOZXdNaXhlciAmJiBrVXNlRmxvYXQsCisgICAgICAgICJrVXNlTmV3TWl4ZXIgYW5kIGtVc2VGbG9hdCBtdXN0IGJlIHRydWUgZm9yIEZMT0FUX0FVWCBvcHRpb24iKTsKKyNlbHNlCit1c2luZyBUWVBFX0FVWCA9IGludDMyX3Q7IC8vIHE0LjI3CisjZW5kaWYKIAogLy8gU2V0IHRvIGRlZmF1bHQgY29weSBidWZmZXIgc2l6ZSBpbiBmcmFtZXMgZm9yIGlucHV0IHByb2Nlc3NpbmcuCiBzdGF0aWMgY29uc3Qgc2l6ZV90IGtDb3B5QnVmZmVyRnJhbWVDb3VudCA9IDI1NjsKQEAgLTg1LDg4ICs4NiwyOCBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotVCBtaW4oY29uc3QgVCYgYSwgY29uc3QgVCYgYikKLXsKLSAgICByZXR1cm4gYSA8IGIgPyBhIDogYjsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBFbnN1cmUgbUNvbmZpZ3VyZWROYW1lcyBiaXRtYXNrIGlzIGluaXRpYWxpemVkIHByb3Blcmx5IG9uIGFsbCBhcmNoaXRlY3R1cmVzLgotLy8gVGhlIHZhbHVlIG9mIDEgPDwgeCBpcyB1bmRlZmluZWQgaW4gQyB3aGVuIHggPj0gMzIuCi0KLUF1ZGlvTWl4ZXI6OkF1ZGlvTWl4ZXIoc2l6ZV90IGZyYW1lQ291bnQsIHVpbnQzMl90IHNhbXBsZVJhdGUsIHVpbnQzMl90IG1heE51bVRyYWNrcykKLSAgICA6ICAgbVRyYWNrTmFtZXMoMCksIG1Db25maWd1cmVkTmFtZXMoKG1heE51bVRyYWNrcyA+PSAzMiA/IDAgOiAxIDw8IG1heE51bVRyYWNrcykgLSAxKSwKLSAgICAgICAgbVNhbXBsZVJhdGUoc2FtcGxlUmF0ZSkKLXsKLSAgICBBTE9HX0FTU0VSVChtYXhOdW1UcmFja3MgPD0gTUFYX05VTV9UUkFDS1MsICJtYXhOdW1UcmFja3MgJXUgPiBNQVhfTlVNX1RSQUNLUyAldSIsCi0gICAgICAgICAgICBtYXhOdW1UcmFja3MsIE1BWF9OVU1fVFJBQ0tTKTsKLQotICAgIC8vIEF1ZGlvTWl4ZXIgaXMgbm90IHlldCBjYXBhYmxlIG9mIG1vcmUgdGhhbiAzMiBhY3RpdmUgdHJhY2sgaW5wdXRzCi0gICAgQUxPR19BU1NFUlQoMzIgPj0gTUFYX05VTV9UUkFDS1MsICJiYWQgTUFYX05VTV9UUkFDS1MgJWQiLCBNQVhfTlVNX1RSQUNLUyk7Ci0KLSAgICBwdGhyZWFkX29uY2UoJnNPbmNlQ29udHJvbCwgJnNJbml0Um91dGluZSk7Ci0KLSAgICBtU3RhdGUuZW5hYmxlZFRyYWNrcz0gMDsKLSAgICBtU3RhdGUubmVlZHNDaGFuZ2VkID0gMDsKLSAgICBtU3RhdGUuZnJhbWVDb3VudCAgID0gZnJhbWVDb3VudDsKLSAgICBtU3RhdGUuaG9vayAgICAgICAgID0gcHJvY2Vzc19fbm9wOwotICAgIG1TdGF0ZS5vdXRwdXRUZW1wICAgPSBOVUxMOwotICAgIG1TdGF0ZS5yZXNhbXBsZVRlbXAgPSBOVUxMOwotICAgIG1TdGF0ZS5tTkJMb2dXcml0ZXIgPSAmbUR1bW15TG9nV3JpdGVyOwotICAgIC8vIG1TdGF0ZS5yZXNlcnZlZAotCi0gICAgLy8gRklYTUUgTW9zdCBvZiB0aGUgZm9sbG93aW5nIGluaXRpYWxpemF0aW9uIGlzIHByb2JhYmx5IHJlZHVuZGFudCBzaW5jZQotICAgIC8vIHRyYWNrc1tpXSBzaG91bGQgb25seSBiZSByZWZlcmVuY2VkIGlmIChtVHJhY2tOYW1lcyAmICgxIDw8IGkpKSAhPSAwCi0gICAgLy8gYW5kIG1UcmFja05hbWVzIGlzIGluaXRpYWxseSAwLiAgSG93ZXZlciwgbGVhdmUgaXQgaGVyZSB1bnRpbCB0aGF0J3MgdmVyaWZpZWQuCi0gICAgdHJhY2tfdCogdCA9IG1TdGF0ZS50cmFja3M7Ci0gICAgZm9yICh1bnNpZ25lZCBpPTAgOyBpIDwgTUFYX05VTV9UUkFDS1MgOyBpKyspIHsKLSAgICAgICAgdC0+cmVzYW1wbGVyID0gTlVMTDsKLSAgICAgICAgdC0+ZG93bm1peGVyQnVmZmVyUHJvdmlkZXIgPSBOVUxMOwotICAgICAgICB0LT5tUmVmb3JtYXRCdWZmZXJQcm92aWRlciA9IE5VTEw7Ci0gICAgICAgIHQtPm1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyID0gTlVMTDsKLSAgICAgICAgdCsrOwotICAgIH0KLQotfQotCi1BdWRpb01peGVyOjp+QXVkaW9NaXhlcigpCi17Ci0gICAgdHJhY2tfdCogdCA9IG1TdGF0ZS50cmFja3M7Ci0gICAgZm9yICh1bnNpZ25lZCBpPTAgOyBpIDwgTUFYX05VTV9UUkFDS1MgOyBpKyspIHsKLSAgICAgICAgZGVsZXRlIHQtPnJlc2FtcGxlcjsKLSAgICAgICAgZGVsZXRlIHQtPmRvd25taXhlckJ1ZmZlclByb3ZpZGVyOwotICAgICAgICBkZWxldGUgdC0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXI7Ci0gICAgICAgIGRlbGV0ZSB0LT5tVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlcjsKLSAgICAgICAgdCsrOwotICAgIH0KLSAgICBkZWxldGUgW10gbVN0YXRlLm91dHB1dFRlbXA7Ci0gICAgZGVsZXRlIFtdIG1TdGF0ZS5yZXNhbXBsZVRlbXA7Ci19Ci0KLXZvaWQgQXVkaW9NaXhlcjo6c2V0TkJMb2dXcml0ZXIoTkJMb2c6OldyaXRlciAqbG9nV3JpdGVyKQotewotICAgIG1TdGF0ZS5tTkJMb2dXcml0ZXIgPSBsb2dXcml0ZXI7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgYXVkaW9fZm9ybWF0X3Qgc2VsZWN0TWl4ZXJJbkZvcm1hdChhdWRpb19mb3JtYXRfdCBpbnB1dEZvcm1hdCBfX3VudXNlZCkgewogICAgIHJldHVybiBrVXNlRmxvYXQgJiYga1VzZU5ld01peGVyID8gQVVESU9fRk9STUFUX1BDTV9GTE9BVCA6IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogfQogCi1pbnQgQXVkaW9NaXhlcjo6Z2V0VHJhY2tOYW1lKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGludCBzZXNzaW9uSWQpCitzdGF0dXNfdCBBdWRpb01peGVyOjpjcmVhdGUoCisgICAgICAgIGludCBuYW1lLCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBpbnQgc2Vzc2lvbklkKQogewotICAgIGlmICghaXNWYWxpZFBjbVRyYWNrRm9ybWF0KGZvcm1hdCkpIHsKLSAgICAgICAgQUxPR0UoIkF1ZGlvTWl4ZXI6OmdldFRyYWNrTmFtZSBpbnZhbGlkIGZvcm1hdCAoJSN4KSIsIGZvcm1hdCk7Ci0gICAgICAgIHJldHVybiAtMTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGV4aXN0cyhuYW1lKSwgIm5hbWUgJWQgYWxyZWFkeSBleGlzdHMiLCBuYW1lKTsKKworICAgIGlmICghaXNWYWxpZENoYW5uZWxNYXNrKGNoYW5uZWxNYXNrKSkgeworICAgICAgICBBTE9HRSgiJXMgaW52YWxpZCBjaGFubmVsTWFzazogJSN4IiwgX19mdW5jX18sIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgdWludDMyX3QgbmFtZXMgPSAofm1UcmFja05hbWVzKSAmIG1Db25maWd1cmVkTmFtZXM7Ci0gICAgaWYgKG5hbWVzICE9IDApIHsKLSAgICAgICAgaW50IG4gPSBfX2J1aWx0aW5fY3R6KG5hbWVzKTsKLSAgICAgICAgQUxPR1YoImFkZCB0cmFjayAoJWQpIiwgbik7CisgICAgaWYgKCFpc1ZhbGlkRm9ybWF0KGZvcm1hdCkpIHsKKyAgICAgICAgQUxPR0UoIiVzIGludmFsaWQgZm9ybWF0OiAlI3giLCBfX2Z1bmNfXywgZm9ybWF0KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBhdXRvIHQgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRyYWNrPigpOworICAgIHsKKyAgICAgICAgLy8gVE9ETzogbW92ZSBpbml0aWFsaXphdGlvbiB0byB0aGUgVHJhY2sgY29uc3RydWN0b3IuCiAgICAgICAgIC8vIGFzc3VtZSBkZWZhdWx0IHBhcmFtZXRlcnMgZm9yIHRoZSB0cmFjaywgZXhjZXB0IHdoZXJlIG5vdGVkIGJlbG93Ci0gICAgICAgIHRyYWNrX3QqIHQgPSAmbVN0YXRlLnRyYWNrc1tuXTsKICAgICAgICAgdC0+bmVlZHMgPSAwOwogCiAgICAgICAgIC8vIEludGVnZXIgdm9sdW1lLgpAQCAtMjA3LDE3ICsxNDgsMTIgQEAKICAgICAgICAgLy8gbm8gaW5pdGlhbGl6YXRpb24gbmVlZGVkCiAgICAgICAgIC8vIHQtPmJ1ZmZlci5mcmFtZUNvdW50CiAgICAgICAgIHQtPmhvb2sgPSBOVUxMOwotICAgICAgICB0LT5pbiA9IE5VTEw7Ci0gICAgICAgIHQtPnJlc2FtcGxlciA9IE5VTEw7CisgICAgICAgIHQtPm1JbiA9IE5VTEw7CiAgICAgICAgIHQtPnNhbXBsZVJhdGUgPSBtU2FtcGxlUmF0ZTsKICAgICAgICAgLy8gc2V0UGFyYW1ldGVyKG5hbWUsIFRSQUNLLCBNQUlOX0JVRkZFUiwgbWl4QnVmZmVyKSBpcyByZXF1aXJlZCBiZWZvcmUgZW5hYmxlKG5hbWUpCiAgICAgICAgIHQtPm1haW5CdWZmZXIgPSBOVUxMOwogICAgICAgICB0LT5hdXhCdWZmZXIgPSBOVUxMOwogICAgICAgICB0LT5tSW5wdXRCdWZmZXJQcm92aWRlciA9IE5VTEw7Ci0gICAgICAgIHQtPm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyID0gTlVMTDsKLSAgICAgICAgdC0+ZG93bm1peGVyQnVmZmVyUHJvdmlkZXIgPSBOVUxMOwotICAgICAgICB0LT5tUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyID0gTlVMTDsKLSAgICAgICAgdC0+bVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIgPSBOVUxMOwogICAgICAgICB0LT5tTWl4ZXJGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKICAgICAgICAgdC0+bUZvcm1hdCA9IGZvcm1hdDsKICAgICAgICAgdC0+bU1peGVySW5Gb3JtYXQgPSBzZWxlY3RNaXhlckluRm9ybWF0KGZvcm1hdCk7CkBAIC0yMzAsOTYgKzE2Niw4MyBAQAogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSB0LT5wcmVwYXJlRm9yRG93bm1peCgpOwogICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiQXVkaW9NaXhlcjo6Z2V0VHJhY2tOYW1lIGludmFsaWQgY2hhbm5lbE1hc2sgKCUjeCkiLCBjaGFubmVsTWFzayk7Ci0gICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CiAgICAgICAgIC8vIHByZXBhcmVGb3JEb3dubWl4KCkgbWF5IGNoYW5nZSBtRG93bm1peFJlcXVpcmVzRm9ybWF0CiAgICAgICAgIEFMT0dWVigibU1peGVyRm9ybWF0OiUjeCAgbU1peGVySW5Gb3JtYXQ6JSN4XG4iLCB0LT5tTWl4ZXJGb3JtYXQsIHQtPm1NaXhlckluRm9ybWF0KTsKICAgICAgICAgdC0+cHJlcGFyZUZvclJlZm9ybWF0KCk7Ci0gICAgICAgIG1UcmFja05hbWVzIHw9IDEgPDwgbjsKLSAgICAgICAgcmV0dXJuIFRSQUNLMCArIG47Ci0gICAgfQotICAgIEFMT0dFKCJBdWRpb01peGVyOjpnZXRUcmFja05hbWUgb3V0IG9mIGF2YWlsYWJsZSB0cmFja3MiKTsKLSAgICByZXR1cm4gLTE7Ci19CiAKLXZvaWQgQXVkaW9NaXhlcjo6aW52YWxpZGF0ZVN0YXRlKHVpbnQzMl90IG1hc2spCi17Ci0gICAgaWYgKG1hc2sgIT0gMCkgewotICAgICAgICBtU3RhdGUubmVlZHNDaGFuZ2VkIHw9IG1hc2s7Ci0gICAgICAgIG1TdGF0ZS5ob29rID0gcHJvY2Vzc19fdmFsaWRhdGU7CisgICAgICAgIG1UcmFja3NbbmFtZV0gPSB0OworICAgICAgICByZXR1cm4gT0s7CiAgICAgfQotIH0KK30KIAogLy8gQ2FsbGVkIHdoZW4gY2hhbm5lbCBtYXNrcyBoYXZlIGNoYW5nZWQgZm9yIGEgdHJhY2sgbmFtZQogLy8gVE9ETzogRml4IERvd25taXhlckJ1ZmZlclByb3ZpZGVyIG5vdCB0byAocG9zc2libHkpIGNoYW5nZSBtaXhlciBpbnB1dCBmb3JtYXQsCiAvLyB3aGljaCB3aWxsIHNpbXBsaWZ5IHRoaXMgbG9naWMuCiBib29sIEF1ZGlvTWl4ZXI6OnNldENoYW5uZWxNYXNrcyhpbnQgbmFtZSwKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgdHJhY2tDaGFubmVsTWFzaywgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbWl4ZXJDaGFubmVsTWFzaykgewotICAgIHRyYWNrX3QgJnRyYWNrID0gbVN0YXRlLnRyYWNrc1tuYW1lXTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCFleGlzdHMobmFtZSksICJpbnZhbGlkIG5hbWU6ICVkIiwgbmFtZSk7CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYWNrPiAmdHJhY2sgPSBtVHJhY2tzW25hbWVdOwogCi0gICAgaWYgKHRyYWNrQ2hhbm5lbE1hc2sgPT0gdHJhY2suY2hhbm5lbE1hc2sKLSAgICAgICAgICAgICYmIG1peGVyQ2hhbm5lbE1hc2sgPT0gdHJhY2subU1peGVyQ2hhbm5lbE1hc2spIHsKKyAgICBpZiAodHJhY2tDaGFubmVsTWFzayA9PSB0cmFjay0+Y2hhbm5lbE1hc2sKKyAgICAgICAgICAgICYmIG1peGVyQ2hhbm5lbE1hc2sgPT0gdHJhY2stPm1NaXhlckNoYW5uZWxNYXNrKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsgIC8vIG5vIG5lZWQgdG8gY2hhbmdlCiAgICAgfQogICAgIC8vIGFsd2F5cyByZWNvbXB1dGUgZm9yIGJvdGggY2hhbm5lbCBtYXNrcyBldmVuIGlmIG9ubHkgb25lIGhhcyBjaGFuZ2VkLgogICAgIGNvbnN0IHVpbnQzMl90IHRyYWNrQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHRyYWNrQ2hhbm5lbE1hc2spOwogICAgIGNvbnN0IHVpbnQzMl90IG1peGVyQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1peGVyQ2hhbm5lbE1hc2spOwotICAgIGNvbnN0IGJvb2wgbWl4ZXJDaGFubmVsQ291bnRDaGFuZ2VkID0gdHJhY2subU1peGVyQ2hhbm5lbENvdW50ICE9IG1peGVyQ2hhbm5lbENvdW50OwogCiAgICAgQUxPR19BU1NFUlQoKHRyYWNrQ2hhbm5lbENvdW50IDw9IE1BWF9OVU1fQ0hBTk5FTFNfVE9fRE9XTk1JWCkKICAgICAgICAgICAgICYmIHRyYWNrQ2hhbm5lbENvdW50CiAgICAgICAgICAgICAmJiBtaXhlckNoYW5uZWxDb3VudCk7Ci0gICAgdHJhY2suY2hhbm5lbE1hc2sgPSB0cmFja0NoYW5uZWxNYXNrOwotICAgIHRyYWNrLmNoYW5uZWxDb3VudCA9IHRyYWNrQ2hhbm5lbENvdW50OwotICAgIHRyYWNrLm1NaXhlckNoYW5uZWxNYXNrID0gbWl4ZXJDaGFubmVsTWFzazsKLSAgICB0cmFjay5tTWl4ZXJDaGFubmVsQ291bnQgPSBtaXhlckNoYW5uZWxDb3VudDsKKyAgICB0cmFjay0+Y2hhbm5lbE1hc2sgPSB0cmFja0NoYW5uZWxNYXNrOworICAgIHRyYWNrLT5jaGFubmVsQ291bnQgPSB0cmFja0NoYW5uZWxDb3VudDsKKyAgICB0cmFjay0+bU1peGVyQ2hhbm5lbE1hc2sgPSBtaXhlckNoYW5uZWxNYXNrOworICAgIHRyYWNrLT5tTWl4ZXJDaGFubmVsQ291bnQgPSBtaXhlckNoYW5uZWxDb3VudDsKIAogICAgIC8vIGNoYW5uZWwgbWFza3MgaGF2ZSBjaGFuZ2VkLCBkb2VzIHRoaXMgdHJhY2sgbmVlZCBhIGRvd25taXhlcj8KICAgICAvLyB1cGRhdGUgdG8gdHJ5IHVzaW5nIG91ciBkZXNpcmVkIGZvcm1hdCAoaWYgd2UgYXJlbid0IGFscmVhZHkgdXNpbmcgaXQpCi0gICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgcHJldkRvd25taXhlckZvcm1hdCA9IHRyYWNrLm1Eb3dubWl4UmVxdWlyZXNGb3JtYXQ7Ci0gICAgY29uc3Qgc3RhdHVzX3Qgc3RhdHVzID0gbVN0YXRlLnRyYWNrc1tuYW1lXS5wcmVwYXJlRm9yRG93bm1peCgpOworICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cyA9IHRyYWNrLT5wcmVwYXJlRm9yRG93bm1peCgpOwogICAgIEFMT0dFX0lGKHN0YXR1cyAhPSBPSywKICAgICAgICAgICAgICJwcmVwYXJlRm9yRG93bm1peCBlcnJvciAlZCwgdHJhY2sgY2hhbm5lbCBtYXNrICUjeCwgbWl4ZXIgY2hhbm5lbCBtYXNrICUjeCIsCi0gICAgICAgICAgICBzdGF0dXMsIHRyYWNrLmNoYW5uZWxNYXNrLCB0cmFjay5tTWl4ZXJDaGFubmVsTWFzayk7CisgICAgICAgICAgICBzdGF0dXMsIHRyYWNrLT5jaGFubmVsTWFzaywgdHJhY2stPm1NaXhlckNoYW5uZWxNYXNrKTsKIAotICAgIGlmIChwcmV2RG93bm1peGVyRm9ybWF0ICE9IHRyYWNrLm1Eb3dubWl4UmVxdWlyZXNGb3JtYXQpIHsKLSAgICAgICAgdHJhY2sucHJlcGFyZUZvclJlZm9ybWF0KCk7IC8vIGJlY2F1c2Ugb2YgZG93bm1peGVyLCB0cmFjayBmb3JtYXQgbWF5IGNoYW5nZSEKLSAgICB9CisgICAgLy8gYWx3YXlzIGRvIHJlZm9ybWF0IHNpbmNlIGNoYW5uZWwgbWFzayBjaGFuZ2VkLAorICAgIC8vIGRvIGl0IGFmdGVyIGRvd25taXggc2luY2UgdHJhY2sgZm9ybWF0IG1heSBjaGFuZ2UhCisgICAgdHJhY2stPnByZXBhcmVGb3JSZWZvcm1hdCgpOwogCi0gICAgaWYgKHRyYWNrLnJlc2FtcGxlciAmJiBtaXhlckNoYW5uZWxDb3VudENoYW5nZWQpIHsKKyAgICBpZiAodHJhY2stPm1SZXNhbXBsZXIuZ2V0KCkgIT0gbnVsbHB0cikgewogICAgICAgICAvLyByZXNhbXBsZXIgY2hhbm5lbHMgbWF5IGhhdmUgY2hhbmdlZC4KLSAgICAgICAgY29uc3QgdWludDMyX3QgcmVzZXRUb1NhbXBsZVJhdGUgPSB0cmFjay5zYW1wbGVSYXRlOwotICAgICAgICBkZWxldGUgdHJhY2sucmVzYW1wbGVyOwotICAgICAgICB0cmFjay5yZXNhbXBsZXIgPSBOVUxMOwotICAgICAgICB0cmFjay5zYW1wbGVSYXRlID0gbVNhbXBsZVJhdGU7IC8vIHdpdGhvdXQgcmVzYW1wbGVyLCB0cmFjayByYXRlIGlzIGRldmljZSBzYW1wbGUgcmF0ZS4KKyAgICAgICAgY29uc3QgdWludDMyX3QgcmVzZXRUb1NhbXBsZVJhdGUgPSB0cmFjay0+c2FtcGxlUmF0ZTsKKyAgICAgICAgdHJhY2stPm1SZXNhbXBsZXIucmVzZXQobnVsbHB0cik7CisgICAgICAgIHRyYWNrLT5zYW1wbGVSYXRlID0gbVNhbXBsZVJhdGU7IC8vIHdpdGhvdXQgcmVzYW1wbGVyLCB0cmFjayByYXRlIGlzIGRldmljZSBzYW1wbGUgcmF0ZS4KICAgICAgICAgLy8gcmVjcmVhdGUgdGhlIHJlc2FtcGxlciB3aXRoIHVwZGF0ZWQgZm9ybWF0LCBjaGFubmVscywgc2F2ZWQgc2FtcGxlUmF0ZS4KLSAgICAgICAgdHJhY2suc2V0UmVzYW1wbGVyKHJlc2V0VG9TYW1wbGVSYXRlIC8qdHJhY2tTYW1wbGVSYXRlKi8sIG1TYW1wbGVSYXRlIC8qZGV2U2FtcGxlUmF0ZSovKTsKKyAgICAgICAgdHJhY2stPnNldFJlc2FtcGxlcihyZXNldFRvU2FtcGxlUmF0ZSAvKnRyYWNrU2FtcGxlUmF0ZSovLCBtU2FtcGxlUmF0ZSAvKmRldlNhbXBsZVJhdGUqLyk7CiAgICAgfQogICAgIHJldHVybiB0cnVlOwogfQogCi12b2lkIEF1ZGlvTWl4ZXI6OnRyYWNrX3Q6OnVucHJlcGFyZUZvckRvd25taXgoKSB7Cit2b2lkIEF1ZGlvTWl4ZXI6OlRyYWNrOjp1bnByZXBhcmVGb3JEb3dubWl4KCkgewogICAgIEFMT0dWKCJBdWRpb01peGVyOjp1bnByZXBhcmVGb3JEb3dubWl4KCVwKSIsIHRoaXMpOwogCi0gICAgaWYgKG1Qb3N0RG93bm1peFJlZm9ybWF0QnVmZmVyUHJvdmlkZXIgIT0gbnVsbHB0cikgeworICAgIGlmIChtUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKICAgICAgICAgLy8gcmVsZWFzZSBhbnkgYnVmZmVycyBoZWxkIGJ5IHRoZSBtUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyCi0gICAgICAgIC8vIGJlZm9yZSBkZWFsbG9jYXRpbmcgdGhlIGRvd25taXhlckJ1ZmZlclByb3ZpZGVyLgorICAgICAgICAvLyBiZWZvcmUgZGVhbGxvY2F0aW5nIHRoZSBtRG93bm1peGVyQnVmZmVyUHJvdmlkZXIuCiAgICAgICAgIG1Qb3N0RG93bm1peFJlZm9ybWF0QnVmZmVyUHJvdmlkZXItPnJlc2V0KCk7CiAgICAgfQogCiAgICAgbURvd25taXhSZXF1aXJlc0Zvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOwotICAgIGlmIChkb3dubWl4ZXJCdWZmZXJQcm92aWRlciAhPSBOVUxMKSB7CisgICAgaWYgKG1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7CiAgICAgICAgIC8vIHRoaXMgdHJhY2sgaGFkIHByZXZpb3VzbHkgYmVlbiBjb25maWd1cmVkIHdpdGggYSBkb3dubWl4ZXIsIGRlbGV0ZSBpdAotICAgICAgICBBTE9HVigiIGRlbGV0aW5nIG9sZCBkb3dubWl4ZXIiKTsKLSAgICAgICAgZGVsZXRlIGRvd25taXhlckJ1ZmZlclByb3ZpZGVyOwotICAgICAgICBkb3dubWl4ZXJCdWZmZXJQcm92aWRlciA9IE5VTEw7CisgICAgICAgIG1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlci5yZXNldChudWxscHRyKTsKICAgICAgICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMoKTsKICAgICB9IGVsc2UgewogICAgICAgICBBTE9HVigiIG5vdGhpbmcgdG8gZG8sIG5vIGRvd25taXhlciB0byBkZWxldGUiKTsKICAgICB9CiB9CiAKLXN0YXR1c190IEF1ZGlvTWl4ZXI6OnRyYWNrX3Q6OnByZXBhcmVGb3JEb3dubWl4KCkKK3N0YXR1c190IEF1ZGlvTWl4ZXI6OlRyYWNrOjpwcmVwYXJlRm9yRG93bm1peCgpCiB7CiAgICAgQUxPR1YoIkF1ZGlvTWl4ZXI6OnByZXBhcmVGb3JEb3dubWl4KCVwKSB3aXRoIG1hc2sgMHgleCIsCiAgICAgICAgICAgICB0aGlzLCBjaGFubmVsTWFzayk7CkBAIC0zMzcsNDAgKzI2MCwzNSBAQAogICAgIGlmIChhdWRpb19jaGFubmVsX21hc2tfZ2V0X3JlcHJlc2VudGF0aW9uKGNoYW5uZWxNYXNrKQogICAgICAgICAgICAgICAgID09IEFVRElPX0NIQU5ORUxfUkVQUkVTRU5UQVRJT05fUE9TSVRJT04KICAgICAgICAgICAgICYmIERvd25taXhlckJ1ZmZlclByb3ZpZGVyOjppc011bHRpY2hhbm5lbENhcGFibGUoKSkgewotICAgICAgICBEb3dubWl4ZXJCdWZmZXJQcm92aWRlciogcERicCA9IG5ldyBEb3dubWl4ZXJCdWZmZXJQcm92aWRlcihjaGFubmVsTWFzaywKKyAgICAgICAgbURvd25taXhlckJ1ZmZlclByb3ZpZGVyLnJlc2V0KG5ldyBEb3dubWl4ZXJCdWZmZXJQcm92aWRlcihjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICBtTWl4ZXJDaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCAvKiBUT0RPOiB1c2UgbU1peGVySW5Gb3JtYXQsIG5vdyBvbmx5IFBDTSAxNiAqLywKLSAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBzZXNzaW9uSWQsIGtDb3B5QnVmZmVyRnJhbWVDb3VudCk7Ci0KLSAgICAgICAgaWYgKHBEYnAtPmlzVmFsaWQoKSkgeyAvLyBpZiBjb25zdHJ1Y3RvciBjb21wbGV0ZWQgcHJvcGVybHkKKyAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBzZXNzaW9uSWQsIGtDb3B5QnVmZmVyRnJhbWVDb3VudCkpOworICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8RG93bm1peGVyQnVmZmVyUHJvdmlkZXIgKj4obURvd25taXhlckJ1ZmZlclByb3ZpZGVyLmdldCgpKS0+aXNWYWxpZCgpKSB7CiAgICAgICAgICAgICBtRG93bm1peFJlcXVpcmVzRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7IC8vIFBDTSAxNiBiaXQgcmVxdWlyZWQgZm9yIGRvd25taXgKLSAgICAgICAgICAgIGRvd25taXhlckJ1ZmZlclByb3ZpZGVyID0gcERicDsKICAgICAgICAgICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KLSAgICAgICAgZGVsZXRlIHBEYnA7CisgICAgICAgIC8vIG1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlciByZXNldCBiZWxvdy4KICAgICB9CiAKICAgICAvLyBFZmZlY3QgZG93bm1peGVyIGRvZXMgbm90IGFjY2VwdCB0aGUgY2hhbm5lbCBjb252ZXJzaW9uLiAgTGV0J3MgdXNlIG91ciByZW1peGVyLgotICAgIFJlbWl4QnVmZmVyUHJvdmlkZXIqIHBSYnAgPSBuZXcgUmVtaXhCdWZmZXJQcm92aWRlcihjaGFubmVsTWFzaywKLSAgICAgICAgICAgIG1NaXhlckNoYW5uZWxNYXNrLCBtTWl4ZXJJbkZvcm1hdCwga0NvcHlCdWZmZXJGcmFtZUNvdW50KTsKKyAgICBtRG93bm1peGVyQnVmZmVyUHJvdmlkZXIucmVzZXQobmV3IFJlbWl4QnVmZmVyUHJvdmlkZXIoY2hhbm5lbE1hc2ssCisgICAgICAgICAgICBtTWl4ZXJDaGFubmVsTWFzaywgbU1peGVySW5Gb3JtYXQsIGtDb3B5QnVmZmVyRnJhbWVDb3VudCkpOwogICAgIC8vIFJlbWl4IGFsd2F5cyBmaW5kcyBhIGNvbnZlcnNpb24gd2hlcmVhcyBEb3dubWl4ZXIgZWZmZWN0IGFib3ZlIG1heSBmYWlsLgotICAgIGRvd25taXhlckJ1ZmZlclByb3ZpZGVyID0gcFJicDsKICAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycygpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotdm9pZCBBdWRpb01peGVyOjp0cmFja190Ojp1bnByZXBhcmVGb3JSZWZvcm1hdCgpIHsKK3ZvaWQgQXVkaW9NaXhlcjo6VHJhY2s6OnVucHJlcGFyZUZvclJlZm9ybWF0KCkgewogICAgIEFMT0dWKCJBdWRpb01peGVyOjp1bnByZXBhcmVGb3JSZWZvcm1hdCglcCkiLCB0aGlzKTsKICAgICBib29sIHJlcXVpcmVzUmVjb25maWd1cmUgPSBmYWxzZTsKLSAgICBpZiAobVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIgIT0gTlVMTCkgewotICAgICAgICBkZWxldGUgbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXI7Ci0gICAgICAgIG1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyID0gTlVMTDsKKyAgICBpZiAobVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICBtUmVmb3JtYXRCdWZmZXJQcm92aWRlci5yZXNldChudWxscHRyKTsKICAgICAgICAgcmVxdWlyZXNSZWNvbmZpZ3VyZSA9IHRydWU7CiAgICAgfQotICAgIGlmIChtUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyICE9IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlIG1Qb3N0RG93bm1peFJlZm9ybWF0QnVmZmVyUHJvdmlkZXI7Ci0gICAgICAgIG1Qb3N0RG93bm1peFJlZm9ybWF0QnVmZmVyUHJvdmlkZXIgPSBOVUxMOworICAgIGlmIChtUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgbVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlci5yZXNldChudWxscHRyKTsKICAgICAgICAgcmVxdWlyZXNSZWNvbmZpZ3VyZSA9IHRydWU7CiAgICAgfQogICAgIGlmIChyZXF1aXJlc1JlY29uZmlndXJlKSB7CkBAIC0zNzgsNyArMjk2LDcgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IEF1ZGlvTWl4ZXI6OnRyYWNrX3Q6OnByZXBhcmVGb3JSZWZvcm1hdCgpCitzdGF0dXNfdCBBdWRpb01peGVyOjpUcmFjazo6cHJlcGFyZUZvclJlZm9ybWF0KCkKIHsKICAgICBBTE9HVigiQXVkaW9NaXhlcjo6cHJlcGFyZUZvclJlZm9ybWF0KCVwKSB3aXRoIGZvcm1hdCAlI3giLCB0aGlzLCBtRm9ybWF0KTsKICAgICAvLyBkaXNjYXJkIHByZXZpb3VzIHJlZm9ybWF0dGVycwpAQCAtMzg4LDE5ICszMDYsMjcgQEAKICAgICAgICAgICAgID8gbURvd25taXhSZXF1aXJlc0Zvcm1hdCA6IG1NaXhlckluRm9ybWF0OwogICAgIGJvb2wgcmVxdWlyZXNSZWNvbmZpZ3VyZSA9IGZhbHNlOwogICAgIGlmIChtRm9ybWF0ICE9IHRhcmdldEZvcm1hdCkgewotICAgICAgICBtUmVmb3JtYXRCdWZmZXJQcm92aWRlciA9IG5ldyBSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyKAorICAgICAgICBtUmVmb3JtYXRCdWZmZXJQcm92aWRlci5yZXNldChuZXcgUmVmb3JtYXRCdWZmZXJQcm92aWRlcigKICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spLAogICAgICAgICAgICAgICAgIG1Gb3JtYXQsCiAgICAgICAgICAgICAgICAgdGFyZ2V0Rm9ybWF0LAotICAgICAgICAgICAgICAgIGtDb3B5QnVmZmVyRnJhbWVDb3VudCk7CisgICAgICAgICAgICAgICAga0NvcHlCdWZmZXJGcmFtZUNvdW50KSk7CisgICAgICAgIHJlcXVpcmVzUmVjb25maWd1cmUgPSB0cnVlOworICAgIH0gZWxzZSBpZiAobUZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7CisgICAgICAgIC8vIElucHV0IGFuZCBvdXRwdXQgYXJlIGZsb2F0cywgbWFrZSBzdXJlIGFwcGxpY2F0aW9uIGRpZCBub3QgcHJvdmlkZSA+IDNkYiBzYW1wbGVzCisgICAgICAgIC8vIHRoYXQgd291bGQgYnJlYWsgdm9sdW1lIGFwcGxpY2F0aW9uIChiLzY4MDk5MDcyKQorICAgICAgICAvLyBUT0RPOiBhZGQgYSB0cnVzdGVkIHNvdXJjZSBmbGFnIHRvIGF2b2lkIHRoZSBvdmVyaGVhZAorICAgICAgICBtUmVmb3JtYXRCdWZmZXJQcm92aWRlci5yZXNldChuZXcgQ2xhbXBGbG9hdEJ1ZmZlclByb3ZpZGVyKAorICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaGFubmVsTWFzayksCisgICAgICAgICAgICAgICAga0NvcHlCdWZmZXJGcmFtZUNvdW50KSk7CiAgICAgICAgIHJlcXVpcmVzUmVjb25maWd1cmUgPSB0cnVlOwogICAgIH0KICAgICBpZiAodGFyZ2V0Rm9ybWF0ICE9IG1NaXhlckluRm9ybWF0KSB7Ci0gICAgICAgIG1Qb3N0RG93bm1peFJlZm9ybWF0QnVmZmVyUHJvdmlkZXIgPSBuZXcgUmVmb3JtYXRCdWZmZXJQcm92aWRlcigKKyAgICAgICAgbVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlci5yZXNldChuZXcgUmVmb3JtYXRCdWZmZXJQcm92aWRlcigKICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobU1peGVyQ2hhbm5lbE1hc2spLAogICAgICAgICAgICAgICAgIHRhcmdldEZvcm1hdCwKICAgICAgICAgICAgICAgICBtTWl4ZXJJbkZvcm1hdCwKLSAgICAgICAgICAgICAgICBrQ29weUJ1ZmZlckZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgIGtDb3B5QnVmZmVyRnJhbWVDb3VudCkpOwogICAgICAgICByZXF1aXJlc1JlY29uZmlndXJlID0gdHJ1ZTsKICAgICB9CiAgICAgaWYgKHJlcXVpcmVzUmVjb25maWd1cmUpIHsKQEAgLTQwOSw3NCArMzM1LDU5IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi12b2lkIEF1ZGlvTWl4ZXI6OnRyYWNrX3Q6OnJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKCkKK3ZvaWQgQXVkaW9NaXhlcjo6VHJhY2s6OnJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKCkKIHsKICAgICBidWZmZXJQcm92aWRlciA9IG1JbnB1dEJ1ZmZlclByb3ZpZGVyOwotICAgIGlmIChtUmVmb3JtYXRCdWZmZXJQcm92aWRlcikgeworICAgIGlmIChtUmVmb3JtYXRCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7CiAgICAgICAgIG1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLT5zZXRCdWZmZXJQcm92aWRlcihidWZmZXJQcm92aWRlcik7Ci0gICAgICAgIGJ1ZmZlclByb3ZpZGVyID0gbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXI7CisgICAgICAgIGJ1ZmZlclByb3ZpZGVyID0gbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIuZ2V0KCk7CiAgICAgfQotICAgIGlmIChkb3dubWl4ZXJCdWZmZXJQcm92aWRlcikgewotICAgICAgICBkb3dubWl4ZXJCdWZmZXJQcm92aWRlci0+c2V0QnVmZmVyUHJvdmlkZXIoYnVmZmVyUHJvdmlkZXIpOwotICAgICAgICBidWZmZXJQcm92aWRlciA9IGRvd25taXhlckJ1ZmZlclByb3ZpZGVyOworICAgIGlmIChtRG93bm1peGVyQnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICBtRG93bm1peGVyQnVmZmVyUHJvdmlkZXItPnNldEJ1ZmZlclByb3ZpZGVyKGJ1ZmZlclByb3ZpZGVyKTsKKyAgICAgICAgYnVmZmVyUHJvdmlkZXIgPSBtRG93bm1peGVyQnVmZmVyUHJvdmlkZXIuZ2V0KCk7CiAgICAgfQotICAgIGlmIChtUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyKSB7CisgICAgaWYgKG1Qb3N0RG93bm1peFJlZm9ybWF0QnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgewogICAgICAgICBtUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLT5zZXRCdWZmZXJQcm92aWRlcihidWZmZXJQcm92aWRlcik7Ci0gICAgICAgIGJ1ZmZlclByb3ZpZGVyID0gbVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlcjsKKyAgICAgICAgYnVmZmVyUHJvdmlkZXIgPSBtUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLmdldCgpOwogICAgIH0KLSAgICBpZiAobVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIpIHsKKyAgICBpZiAobVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgewogICAgICAgICBtVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlci0+c2V0QnVmZmVyUHJvdmlkZXIoYnVmZmVyUHJvdmlkZXIpOwotICAgICAgICBidWZmZXJQcm92aWRlciA9IG1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyOworICAgICAgICBidWZmZXJQcm92aWRlciA9IG1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyLmdldCgpOwogICAgIH0KIH0KIAotdm9pZCBBdWRpb01peGVyOjpkZWxldGVUcmFja05hbWUoaW50IG5hbWUpCit2b2lkIEF1ZGlvTWl4ZXI6OmRlc3Ryb3koaW50IG5hbWUpCiB7Ci0gICAgQUxPR1YoIkF1ZGlvTWl4ZXI6OmRlbGV0ZVRyYWNrTmFtZSglZCkiLCBuYW1lKTsKLSAgICBuYW1lIC09IFRSQUNLMDsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG5hbWUgPCAwIHx8IG5hbWUgPj0gKGludClNQVhfTlVNX1RSQUNLUywgImJhZCB0cmFjayBuYW1lICVkIiwgbmFtZSk7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRighZXhpc3RzKG5hbWUpLCAiaW52YWxpZCBuYW1lOiAlZCIsIG5hbWUpOwogICAgIEFMT0dWKCJkZWxldGVUcmFja05hbWUoJWQpIiwgbmFtZSk7Ci0gICAgdHJhY2tfdCYgdHJhY2sobVN0YXRlLnRyYWNrc1sgbmFtZSBdKTsKLSAgICBpZiAodHJhY2suZW5hYmxlZCkgewotICAgICAgICB0cmFjay5lbmFibGVkID0gZmFsc2U7Ci0gICAgICAgIGludmFsaWRhdGVTdGF0ZSgxPDxuYW1lKTsKKworICAgIGlmIChtVHJhY2tzW25hbWVdLT5lbmFibGVkKSB7CisgICAgICAgIGludmFsaWRhdGUoKTsKICAgICB9Ci0gICAgLy8gZGVsZXRlIHRoZSByZXNhbXBsZXIKLSAgICBkZWxldGUgdHJhY2sucmVzYW1wbGVyOwotICAgIHRyYWNrLnJlc2FtcGxlciA9IE5VTEw7Ci0gICAgLy8gZGVsZXRlIHRoZSBkb3dubWl4ZXIKLSAgICBtU3RhdGUudHJhY2tzW25hbWVdLnVucHJlcGFyZUZvckRvd25taXgoKTsKLSAgICAvLyBkZWxldGUgdGhlIHJlZm9ybWF0dGVyCi0gICAgbVN0YXRlLnRyYWNrc1tuYW1lXS51bnByZXBhcmVGb3JSZWZvcm1hdCgpOwotICAgIC8vIGRlbGV0ZSB0aGUgdGltZXN0cmV0Y2ggcHJvdmlkZXIKLSAgICBkZWxldGUgdHJhY2subVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXI7Ci0gICAgdHJhY2subVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIgPSBOVUxMOwotICAgIG1UcmFja05hbWVzICY9IH4oMTw8bmFtZSk7CisgICAgbVRyYWNrcy5lcmFzZShuYW1lKTsgLy8gZGVhbGxvY2F0ZSB0cmFjawogfQogCiB2b2lkIEF1ZGlvTWl4ZXI6OmVuYWJsZShpbnQgbmFtZSkKIHsKLSAgICBuYW1lIC09IFRSQUNLMDsKLSAgICBBTE9HX0FTU0VSVCh1aW50MzJfdChuYW1lKSA8IE1BWF9OVU1fVFJBQ0tTLCAiYmFkIHRyYWNrIG5hbWUgJWQiLCBuYW1lKTsKLSAgICB0cmFja190JiB0cmFjayA9IG1TdGF0ZS50cmFja3NbbmFtZV07CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRighZXhpc3RzKG5hbWUpLCAiaW52YWxpZCBuYW1lOiAlZCIsIG5hbWUpOworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUcmFjaz4gJnRyYWNrID0gbVRyYWNrc1tuYW1lXTsKIAotICAgIGlmICghdHJhY2suZW5hYmxlZCkgewotICAgICAgICB0cmFjay5lbmFibGVkID0gdHJ1ZTsKKyAgICBpZiAoIXRyYWNrLT5lbmFibGVkKSB7CisgICAgICAgIHRyYWNrLT5lbmFibGVkID0gdHJ1ZTsKICAgICAgICAgQUxPR1YoImVuYWJsZSglZCkiLCBuYW1lKTsKLSAgICAgICAgaW52YWxpZGF0ZVN0YXRlKDEgPDwgbmFtZSk7CisgICAgICAgIGludmFsaWRhdGUoKTsKICAgICB9CiB9CiAKIHZvaWQgQXVkaW9NaXhlcjo6ZGlzYWJsZShpbnQgbmFtZSkKIHsKLSAgICBuYW1lIC09IFRSQUNLMDsKLSAgICBBTE9HX0FTU0VSVCh1aW50MzJfdChuYW1lKSA8IE1BWF9OVU1fVFJBQ0tTLCAiYmFkIHRyYWNrIG5hbWUgJWQiLCBuYW1lKTsKLSAgICB0cmFja190JiB0cmFjayA9IG1TdGF0ZS50cmFja3NbbmFtZV07CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRighZXhpc3RzKG5hbWUpLCAiaW52YWxpZCBuYW1lOiAlZCIsIG5hbWUpOworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUcmFjaz4gJnRyYWNrID0gbVRyYWNrc1tuYW1lXTsKIAotICAgIGlmICh0cmFjay5lbmFibGVkKSB7Ci0gICAgICAgIHRyYWNrLmVuYWJsZWQgPSBmYWxzZTsKKyAgICBpZiAodHJhY2stPmVuYWJsZWQpIHsKKyAgICAgICAgdHJhY2stPmVuYWJsZWQgPSBmYWxzZTsKICAgICAgICAgQUxPR1YoImRpc2FibGUoJWQpIiwgbmFtZSk7Ci0gICAgICAgIGludmFsaWRhdGVTdGF0ZSgxIDw8IG5hbWUpOworICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgfQogfQogCkBAIC01NTQsNyArNDY1LDggQEAKICAgICAgICAgQUxPR0RfSUYoKnBQcmV2Vm9sdW1lICE9ICpwU2V0Vm9sdW1lLCAicHJldmlvdXMgZmxvYXQgcmFtcCBoYXNuJ3QgZmluaXNoZWQsIgogICAgICAgICAgICAgICAgICIgcHJldjolZiAgc2V0X3RvOiVmIiwgKnBQcmV2Vm9sdW1lLCAqcFNldFZvbHVtZSk7CiAgICAgICAgIGNvbnN0IGZsb2F0IGluYyA9IChuZXdWb2x1bWUgLSAqcFByZXZWb2x1bWUpIC8gcmFtcDsgLy8gY291bGQgYmUgaW5mLCBuYW4sIHN1Ym5vcm1hbAotICAgICAgICBjb25zdCBmbG9hdCBtYXh2ID0gbWF4KG5ld1ZvbHVtZSwgKnBQcmV2Vm9sdW1lKTsgLy8gY291bGQgYmUgaW5mLCBjYW5ub3QgYmUgbmFuLCBzdWJub3JtYWwKKyAgICAgICAgLy8gY291bGQgYmUgaW5mLCBjYW5ub3QgYmUgbmFuLCBzdWJub3JtYWwKKyAgICAgICAgY29uc3QgZmxvYXQgbWF4diA9IHN0ZDo6bWF4KG5ld1ZvbHVtZSwgKnBQcmV2Vm9sdW1lKTsKIAogICAgICAgICBpZiAoaXNub3JtYWwoaW5jKSAvLyBpbmMgbXVzdCBiZSBhIG5vcm1hbCBudW1iZXIgKG5vIHN1Ym5vcm1hbHMsIGluZmluaXRlLCBuYW4pCiAgICAgICAgICAgICAgICAgJiYgbWF4diArIGluYyAhPSBtYXh2KSB7IC8vIGluYyBtdXN0IG1ha2UgZm9yd2FyZCBwcm9ncmVzcwpAQCAtNjA3LDkgKzUxOSw4IEBACiAKIHZvaWQgQXVkaW9NaXhlcjo6c2V0UGFyYW1ldGVyKGludCBuYW1lLCBpbnQgdGFyZ2V0LCBpbnQgcGFyYW0sIHZvaWQgKnZhbHVlKQogewotICAgIG5hbWUgLT0gVFJBQ0swOwotICAgIEFMT0dfQVNTRVJUKHVpbnQzMl90KG5hbWUpIDwgTUFYX05VTV9UUkFDS1MsICJiYWQgdHJhY2sgbmFtZSAlZCIsIG5hbWUpOwotICAgIHRyYWNrX3QmIHRyYWNrID0gbVN0YXRlLnRyYWNrc1tuYW1lXTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCFleGlzdHMobmFtZSksICJpbnZhbGlkIG5hbWU6ICVkIiwgbmFtZSk7CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYWNrPiAmdHJhY2sgPSBtVHJhY2tzW25hbWVdOwogCiAgICAgaW50IHZhbHVlSW50ID0gc3RhdGljX2Nhc3Q8aW50PihyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4odmFsdWUpKTsKICAgICBpbnQzMl90ICp2YWx1ZUJ1ZiA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50MzJfdCo+KHZhbHVlKTsKQEAgLTYyMSwzMyArNTMyLDMzIEBACiAgICAgICAgIGNhc2UgQ0hBTk5FTF9NQVNLOiB7CiAgICAgICAgICAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCB0cmFja0NoYW5uZWxNYXNrID0KICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4odmFsdWVJbnQpOwotICAgICAgICAgICAgaWYgKHNldENoYW5uZWxNYXNrcyhuYW1lLCB0cmFja0NoYW5uZWxNYXNrLCB0cmFjay5tTWl4ZXJDaGFubmVsTWFzaykpIHsKKyAgICAgICAgICAgIGlmIChzZXRDaGFubmVsTWFza3MobmFtZSwgdHJhY2tDaGFubmVsTWFzaywgdHJhY2stPm1NaXhlckNoYW5uZWxNYXNrKSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXIoVFJBQ0ssIENIQU5ORUxfTUFTSywgJXgpIiwgdHJhY2tDaGFubmVsTWFzayk7Ci0gICAgICAgICAgICAgICAgaW52YWxpZGF0ZVN0YXRlKDEgPDwgbmFtZSk7CisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBNQUlOX0JVRkZFUjoKLSAgICAgICAgICAgIGlmICh0cmFjay5tYWluQnVmZmVyICE9IHZhbHVlQnVmKSB7Ci0gICAgICAgICAgICAgICAgdHJhY2subWFpbkJ1ZmZlciA9IHZhbHVlQnVmOworICAgICAgICAgICAgaWYgKHRyYWNrLT5tYWluQnVmZmVyICE9IHZhbHVlQnVmKSB7CisgICAgICAgICAgICAgICAgdHJhY2stPm1haW5CdWZmZXIgPSB2YWx1ZUJ1ZjsKICAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKFRSQUNLLCBNQUlOX0JVRkZFUiwgJXApIiwgdmFsdWVCdWYpOwotICAgICAgICAgICAgICAgIGludmFsaWRhdGVTdGF0ZSgxIDw8IG5hbWUpOworICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFVWF9CVUZGRVI6Ci0gICAgICAgICAgICBpZiAodHJhY2suYXV4QnVmZmVyICE9IHZhbHVlQnVmKSB7Ci0gICAgICAgICAgICAgICAgdHJhY2suYXV4QnVmZmVyID0gdmFsdWVCdWY7CisgICAgICAgICAgICBpZiAodHJhY2stPmF1eEJ1ZmZlciAhPSB2YWx1ZUJ1ZikgeworICAgICAgICAgICAgICAgIHRyYWNrLT5hdXhCdWZmZXIgPSB2YWx1ZUJ1ZjsKICAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKFRSQUNLLCBBVVhfQlVGRkVSLCAlcCkiLCB2YWx1ZUJ1Zik7Ci0gICAgICAgICAgICAgICAgaW52YWxpZGF0ZVN0YXRlKDEgPDwgbmFtZSk7CisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgRk9STUFUOiB7CiAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBzdGF0aWNfY2FzdDxhdWRpb19mb3JtYXRfdD4odmFsdWVJbnQpOwotICAgICAgICAgICAgaWYgKHRyYWNrLm1Gb3JtYXQgIT0gZm9ybWF0KSB7CisgICAgICAgICAgICBpZiAodHJhY2stPm1Gb3JtYXQgIT0gZm9ybWF0KSB7CiAgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpLCAiSW52YWxpZCBmb3JtYXQgJSN4IiwgZm9ybWF0KTsKLSAgICAgICAgICAgICAgICB0cmFjay5tRm9ybWF0ID0gZm9ybWF0OworICAgICAgICAgICAgICAgIHRyYWNrLT5tRm9ybWF0ID0gZm9ybWF0OwogICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXIoVFJBQ0ssIEZPUk1BVCwgJSN4KSIsIGZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgdHJhY2sucHJlcGFyZUZvclJlZm9ybWF0KCk7Ci0gICAgICAgICAgICAgICAgaW52YWxpZGF0ZVN0YXRlKDEgPDwgbmFtZSk7CisgICAgICAgICAgICAgICAgdHJhY2stPnByZXBhcmVGb3JSZWZvcm1hdCgpOworICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIC8vIEZJWE1FIGRvIHdlIHdhbnQgdG8gc3VwcG9ydCBzZXR0aW5nIHRoZSBkb3dubWl4IHR5cGUgZnJvbSBBdWRpb0ZsaW5nZXI/CkBAIC02NTYsMTcgKzU2NywxNyBAQAogICAgICAgICAgICAgYnJlYWsgICAgICAgICAgKi8KICAgICAgICAgY2FzZSBNSVhFUl9GT1JNQVQ6IHsKICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IHN0YXRpY19jYXN0PGF1ZGlvX2Zvcm1hdF90Pih2YWx1ZUludCk7Ci0gICAgICAgICAgICBpZiAodHJhY2subU1peGVyRm9ybWF0ICE9IGZvcm1hdCkgewotICAgICAgICAgICAgICAgIHRyYWNrLm1NaXhlckZvcm1hdCA9IGZvcm1hdDsKKyAgICAgICAgICAgIGlmICh0cmFjay0+bU1peGVyRm9ybWF0ICE9IGZvcm1hdCkgeworICAgICAgICAgICAgICAgIHRyYWNrLT5tTWl4ZXJGb3JtYXQgPSBmb3JtYXQ7CiAgICAgICAgICAgICAgICAgQUxPR1YoInNldFBhcmFtZXRlcihUUkFDSywgTUlYRVJfRk9STUFULCAlI3gpIiwgZm9ybWF0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgTUlYRVJfQ0hBTk5FTF9NQVNLOiB7CiAgICAgICAgICAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBtaXhlckNoYW5uZWxNYXNrID0KICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KHZhbHVlSW50KTsKLSAgICAgICAgICAgIGlmIChzZXRDaGFubmVsTWFza3MobmFtZSwgdHJhY2suY2hhbm5lbE1hc2ssIG1peGVyQ2hhbm5lbE1hc2spKSB7CisgICAgICAgICAgICBpZiAoc2V0Q2hhbm5lbE1hc2tzKG5hbWUsIHRyYWNrLT5jaGFubmVsTWFzaywgbWl4ZXJDaGFubmVsTWFzaykpIHsKICAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKFRSQUNLLCBNSVhFUl9DSEFOTkVMX01BU0ssICUjeCkiLCBtaXhlckNoYW5uZWxNYXNrKTsKLSAgICAgICAgICAgICAgICBpbnZhbGlkYXRlU3RhdGUoMSA8PCBuYW1lKTsKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGJyZWFrOwogICAgICAgICBkZWZhdWx0OgpAQCAtNjc4LDIxICs1ODksMjAgQEAKICAgICAgICAgc3dpdGNoIChwYXJhbSkgewogICAgICAgICBjYXNlIFNBTVBMRV9SQVRFOgogICAgICAgICAgICAgQUxPR19BU1NFUlQodmFsdWVJbnQgPiAwLCAiYmFkIHNhbXBsZSByYXRlICVkIiwgdmFsdWVJbnQpOwotICAgICAgICAgICAgaWYgKHRyYWNrLnNldFJlc2FtcGxlcih1aW50MzJfdCh2YWx1ZUludCksIG1TYW1wbGVSYXRlKSkgeworICAgICAgICAgICAgaWYgKHRyYWNrLT5zZXRSZXNhbXBsZXIodWludDMyX3QodmFsdWVJbnQpLCBtU2FtcGxlUmF0ZSkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKFJFU0FNUExFLCBTQU1QTEVfUkFURSwgJXUpIiwKICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KHZhbHVlSW50KSk7Ci0gICAgICAgICAgICAgICAgaW52YWxpZGF0ZVN0YXRlKDEgPDwgbmFtZSk7CisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgUkVTRVQ6Ci0gICAgICAgICAgICB0cmFjay5yZXNldFJlc2FtcGxlcigpOwotICAgICAgICAgICAgaW52YWxpZGF0ZVN0YXRlKDEgPDwgbmFtZSk7CisgICAgICAgICAgICB0cmFjay0+cmVzZXRSZXNhbXBsZXIoKTsKKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFJFTU9WRToKLSAgICAgICAgICAgIGRlbGV0ZSB0cmFjay5yZXNhbXBsZXI7Ci0gICAgICAgICAgICB0cmFjay5yZXNhbXBsZXIgPSBOVUxMOwotICAgICAgICAgICAgdHJhY2suc2FtcGxlUmF0ZSA9IG1TYW1wbGVSYXRlOwotICAgICAgICAgICAgaW52YWxpZGF0ZVN0YXRlKDEgPDwgbmFtZSk7CisgICAgICAgICAgICB0cmFjay0+bVJlc2FtcGxlci5yZXNldChudWxscHRyKTsKKyAgICAgICAgICAgIHRyYWNrLT5zYW1wbGVSYXRlID0gbVNhbXBsZVJhdGU7CisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoInNldFBhcmFtZXRlciByZXNhbXBsZTogYmFkIHBhcmFtICVkIiwgcGFyYW0pOwpAQCAtNzA0LDI2ICs2MTQsMjggQEAKICAgICAgICAgc3dpdGNoIChwYXJhbSkgewogICAgICAgICBjYXNlIEFVWExFVkVMOgogICAgICAgICAgICAgaWYgKHNldFZvbHVtZVJhbXBWYXJpYWJsZXMoKnJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQqPih2YWx1ZSksCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldCA9PSBSQU1QX1ZPTFVNRSA/IG1TdGF0ZS5mcmFtZUNvdW50IDogMCwKLSAgICAgICAgICAgICAgICAgICAgJnRyYWNrLmF1eExldmVsLCAmdHJhY2sucHJldkF1eExldmVsLCAmdHJhY2suYXV4SW5jLAotICAgICAgICAgICAgICAgICAgICAmdHJhY2subUF1eExldmVsLCAmdHJhY2subVByZXZBdXhMZXZlbCwgJnRyYWNrLm1BdXhJbmMpKSB7CisgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9PSBSQU1QX1ZPTFVNRSA/IG1GcmFtZUNvdW50IDogMCwKKyAgICAgICAgICAgICAgICAgICAgJnRyYWNrLT5hdXhMZXZlbCwgJnRyYWNrLT5wcmV2QXV4TGV2ZWwsICZ0cmFjay0+YXV4SW5jLAorICAgICAgICAgICAgICAgICAgICAmdHJhY2stPm1BdXhMZXZlbCwgJnRyYWNrLT5tUHJldkF1eExldmVsLCAmdHJhY2stPm1BdXhJbmMpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoInNldFBhcmFtZXRlciglcywgQVVYTEVWRUw6ICUwNHgpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9PSBWT0xVTUUgPyAiVk9MVU1FIiA6ICJSQU1QX1ZPTFVNRSIsIHRyYWNrLmF1eExldmVsKTsKLSAgICAgICAgICAgICAgICBpbnZhbGlkYXRlU3RhdGUoMSA8PCBuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9PSBWT0xVTUUgPyAiVk9MVU1FIiA6ICJSQU1QX1ZPTFVNRSIsIHRyYWNrLT5hdXhMZXZlbCk7CisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKXBhcmFtID49IFZPTFVNRTAgJiYgKHVuc2lnbmVkKXBhcmFtIDwgVk9MVU1FMCArIE1BWF9OVU1fVk9MVU1FUykgewogICAgICAgICAgICAgICAgIGlmIChzZXRWb2x1bWVSYW1wVmFyaWFibGVzKCpyZWludGVycHJldF9jYXN0PGZsb2F0Kj4odmFsdWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID09IFJBTVBfVk9MVU1FID8gbVN0YXRlLmZyYW1lQ291bnQgOiAwLAotICAgICAgICAgICAgICAgICAgICAgICAgJnRyYWNrLnZvbHVtZVtwYXJhbSAtIFZPTFVNRTBdLCAmdHJhY2sucHJldlZvbHVtZVtwYXJhbSAtIFZPTFVNRTBdLAotICAgICAgICAgICAgICAgICAgICAgICAgJnRyYWNrLnZvbHVtZUluY1twYXJhbSAtIFZPTFVNRTBdLAotICAgICAgICAgICAgICAgICAgICAgICAgJnRyYWNrLm1Wb2x1bWVbcGFyYW0gLSBWT0xVTUUwXSwgJnRyYWNrLm1QcmV2Vm9sdW1lW3BhcmFtIC0gVk9MVU1FMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAmdHJhY2subVZvbHVtZUluY1twYXJhbSAtIFZPTFVNRTBdKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID09IFJBTVBfVk9MVU1FID8gbUZyYW1lQ291bnQgOiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRyYWNrLT52b2x1bWVbcGFyYW0gLSBWT0xVTUUwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFjay0+cHJldlZvbHVtZVtwYXJhbSAtIFZPTFVNRTBdLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRyYWNrLT52b2x1bWVJbmNbcGFyYW0gLSBWT0xVTUUwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFjay0+bVZvbHVtZVtwYXJhbSAtIFZPTFVNRTBdLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRyYWNrLT5tUHJldlZvbHVtZVtwYXJhbSAtIFZPTFVNRTBdLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRyYWNrLT5tVm9sdW1lSW5jW3BhcmFtIC0gVk9MVU1FMF0pKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXIoJXMsIFZPTFVNRSVkOiAlMDR4KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID09IFZPTFVNRSA/ICJWT0xVTUUiIDogIlJBTVBfVk9MVU1FIiwgcGFyYW0gLSBWT0xVTUUwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2sudm9sdW1lW3BhcmFtIC0gVk9MVU1FMF0pOwotICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlU3RhdGUoMSA8PCBuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT52b2x1bWVbcGFyYW0gLSBWT0xVTUUwXSk7CisgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoInNldFBhcmFtZXRlciB2b2x1bWU6IGJhZCBwYXJhbSAlZCIsIHBhcmFtKTsKQEAgLTczNiwxNiArNjQ4LDE2IEBACiAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgKnBsYXliYWNrUmF0ZSA9CiAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PEF1ZGlvUGxheWJhY2tSYXRlKj4odmFsdWUpOwogICAgICAgICAgICAgICAgIEFMT0dXX0lGKCFpc0F1ZGlvUGxheWJhY2tSYXRlVmFsaWQoKnBsYXliYWNrUmF0ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAiYmFkIHBhcmFtZXRlcnMgc3BlZWQgJWYsIHBpdGNoICVmIixwbGF5YmFja1JhdGUtPm1TcGVlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBsYXliYWNrUmF0ZS0+bVBpdGNoKTsKLSAgICAgICAgICAgICAgICBpZiAodHJhY2suc2V0UGxheWJhY2tSYXRlKCpwbGF5YmFja1JhdGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAiYmFkIHBhcmFtZXRlcnMgc3BlZWQgJWYsIHBpdGNoICVmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBsYXliYWNrUmF0ZS0+bVNwZWVkLCBwbGF5YmFja1JhdGUtPm1QaXRjaCk7CisgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5zZXRQbGF5YmFja1JhdGUoKnBsYXliYWNrUmF0ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoInNldFBhcmFtZXRlcihUSU1FU1RSRVRDSCwgUExBWUJBQ0tfUkFURSwgU1RSRVRDSF9NT0RFLCBGQUxMQkFDS19NT0RFICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJWYgJWYgJWQgJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXliYWNrUmF0ZS0+bVNwZWVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXliYWNrUmF0ZS0+bVBpdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXliYWNrUmF0ZS0+bVN0cmV0Y2hNb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXliYWNrUmF0ZS0+bUZhbGxiYWNrTW9kZSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGludmFsaWRhdGVTdGF0ZSgxIDw8IG5hbWUpOworICAgICAgICAgICAgICAgICAgICAvLyBpbnZhbGlkYXRlKCk7ICAoc2hvdWxkIG5vdCByZXF1aXJlIHJlY29uZmlndXJlKQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgpAQCAtNzU4LDEyICs2NzAsMTIgQEAKICAgICB9CiB9CiAKLWJvb2wgQXVkaW9NaXhlcjo6dHJhY2tfdDo6c2V0UmVzYW1wbGVyKHVpbnQzMl90IHRyYWNrU2FtcGxlUmF0ZSwgdWludDMyX3QgZGV2U2FtcGxlUmF0ZSkKK2Jvb2wgQXVkaW9NaXhlcjo6VHJhY2s6OnNldFJlc2FtcGxlcih1aW50MzJfdCB0cmFja1NhbXBsZVJhdGUsIHVpbnQzMl90IGRldlNhbXBsZVJhdGUpCiB7Ci0gICAgaWYgKHRyYWNrU2FtcGxlUmF0ZSAhPSBkZXZTYW1wbGVSYXRlIHx8IHJlc2FtcGxlciAhPSBOVUxMKSB7CisgICAgaWYgKHRyYWNrU2FtcGxlUmF0ZSAhPSBkZXZTYW1wbGVSYXRlIHx8IG1SZXNhbXBsZXIuZ2V0KCkgIT0gbnVsbHB0cikgewogICAgICAgICBpZiAoc2FtcGxlUmF0ZSAhPSB0cmFja1NhbXBsZVJhdGUpIHsKICAgICAgICAgICAgIHNhbXBsZVJhdGUgPSB0cmFja1NhbXBsZVJhdGU7Ci0gICAgICAgICAgICBpZiAocmVzYW1wbGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChtUmVzYW1wbGVyLmdldCgpID09IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiQ3JlYXRpbmcgcmVzYW1wbGVyIGZyb20gdHJhY2sgJWQgSHogdG8gZGV2aWNlICVkIEh6IiwKICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrU2FtcGxlUmF0ZSwgZGV2U2FtcGxlUmF0ZSk7CiAgICAgICAgICAgICAgICAgQXVkaW9SZXNhbXBsZXI6OnNyY19xdWFsaXR5IHF1YWxpdHk7CkBAIC03NzksMTUgKzY5MSwxNSBAQAogCiAgICAgICAgICAgICAgICAgLy8gVE9ETzogUmVtb3ZlIE1PTk9fSEFDSy4gUmVzYW1wbGVyIHNlZXMgI2NoYW5uZWxzIGFmdGVyIHRoZSBkb3dubWl4ZXIKICAgICAgICAgICAgICAgICAvLyBidXQgaWYgbm9uZSBleGlzdHMsIGl0IGlzIHRoZSBjaGFubmVsIGNvdW50ICgxIGZvciBtb25vKS4KLSAgICAgICAgICAgICAgICBjb25zdCBpbnQgcmVzYW1wbGVyQ2hhbm5lbENvdW50ID0gZG93bm1peGVyQnVmZmVyUHJvdmlkZXIgIT0gTlVMTAorICAgICAgICAgICAgICAgIGNvbnN0IGludCByZXNhbXBsZXJDaGFubmVsQ291bnQgPSBtRG93bm1peGVyQnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cgogICAgICAgICAgICAgICAgICAgICAgICAgPyBtTWl4ZXJDaGFubmVsQ291bnQgOiBjaGFubmVsQ291bnQ7CiAgICAgICAgICAgICAgICAgQUxPR1ZWKCJDcmVhdGluZyByZXNhbXBsZXI6IgogICAgICAgICAgICAgICAgICAgICAgICAgIiBmb3JtYXQoJSN4KSBjaGFubmVscyglZCkgZGV2U2FtcGxlUmF0ZSgldSkgcXVhbGl0eSglZClcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBtTWl4ZXJJbkZvcm1hdCwgcmVzYW1wbGVyQ2hhbm5lbENvdW50LCBkZXZTYW1wbGVSYXRlLCBxdWFsaXR5KTsKLSAgICAgICAgICAgICAgICByZXNhbXBsZXIgPSBBdWRpb1Jlc2FtcGxlcjo6Y3JlYXRlKAorICAgICAgICAgICAgICAgIG1SZXNhbXBsZXIucmVzZXQoQXVkaW9SZXNhbXBsZXI6OmNyZWF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgIG1NaXhlckluRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgcmVzYW1wbGVyQ2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgZGV2U2FtcGxlUmF0ZSwgcXVhbGl0eSk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXZTYW1wbGVSYXRlLCBxdWFsaXR5KSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQpAQCAtNzk1LDI1ICs3MDcsMjUgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLWJvb2wgQXVkaW9NaXhlcjo6dHJhY2tfdDo6c2V0UGxheWJhY2tSYXRlKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZwbGF5YmFja1JhdGUpCitib29sIEF1ZGlvTWl4ZXI6OlRyYWNrOjpzZXRQbGF5YmFja1JhdGUoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnBsYXliYWNrUmF0ZSkKIHsKLSAgICBpZiAoKG1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyID09IE5VTEwgJiYKKyAgICBpZiAoKG1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyLmdldCgpID09IG51bGxwdHIgJiYKICAgICAgICAgICAgIGZhYnMocGxheWJhY2tSYXRlLm1TcGVlZCAtIG1QbGF5YmFja1JhdGUubVNwZWVkKSA8IEFVRElPX1RJTUVTVFJFVENIX1NQRUVEX01JTl9ERUxUQSAmJgogICAgICAgICAgICAgZmFicyhwbGF5YmFja1JhdGUubVBpdGNoIC0gbVBsYXliYWNrUmF0ZS5tUGl0Y2gpIDwgQVVESU9fVElNRVNUUkVUQ0hfUElUQ0hfTUlOX0RFTFRBKSB8fAogICAgICAgICAgICAgaXNBdWRpb1BsYXliYWNrUmF0ZUVxdWFsKHBsYXliYWNrUmF0ZSwgbVBsYXliYWNrUmF0ZSkpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBtUGxheWJhY2tSYXRlID0gcGxheWJhY2tSYXRlOwotICAgIGlmIChtVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlciA9PSBOVUxMKSB7CisgICAgaWYgKG1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyLmdldCgpID09IG51bGxwdHIpIHsKICAgICAgICAgLy8gVE9ETzogUmVtb3ZlIE1PTk9fSEFDSy4gUmVzYW1wbGVyIHNlZXMgI2NoYW5uZWxzIGFmdGVyIHRoZSBkb3dubWl4ZXIKICAgICAgICAgLy8gYnV0IGlmIG5vbmUgZXhpc3RzLCBpdCBpcyB0aGUgY2hhbm5lbCBjb3VudCAoMSBmb3IgbW9ubykuCi0gICAgICAgIGNvbnN0IGludCB0aW1lc3RyZXRjaENoYW5uZWxDb3VudCA9IGRvd25taXhlckJ1ZmZlclByb3ZpZGVyICE9IE5VTEwKKyAgICAgICAgY29uc3QgaW50IHRpbWVzdHJldGNoQ2hhbm5lbENvdW50ID0gbURvd25taXhlckJ1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIKICAgICAgICAgICAgICAgICA/IG1NaXhlckNoYW5uZWxDb3VudCA6IGNoYW5uZWxDb3VudDsKLSAgICAgICAgbVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIgPSBuZXcgVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlcih0aW1lc3RyZXRjaENoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICBtTWl4ZXJJbkZvcm1hdCwgc2FtcGxlUmF0ZSwgcGxheWJhY2tSYXRlKTsKKyAgICAgICAgbVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIucmVzZXQobmV3IFRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIodGltZXN0cmV0Y2hDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgbU1peGVySW5Gb3JtYXQsIHNhbXBsZVJhdGUsIHBsYXliYWNrUmF0ZSkpOwogICAgICAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycygpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8VGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlcio+KG1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyKQorICAgICAgICBzdGF0aWNfY2FzdDxUaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyKj4obVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIuZ2V0KCkpCiAgICAgICAgICAgICAgICAgLT5zZXRQbGF5YmFja1JhdGUocGxheWJhY2tSYXRlKTsKICAgICB9CiAgICAgcmV0dXJuIHRydWU7CkBAIC04MzIsNyArNzQ0LDcgQEAKICAqCiAgKiBUaGVyZSBpcyBhIGJpdCBvZiBkdXBsaWNhdGVkIGNvZGUgaGVyZSwgYnV0IGl0IGtlZXBzIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCiAgKi8KLWlubGluZSB2b2lkIEF1ZGlvTWl4ZXI6OnRyYWNrX3Q6OmFkanVzdFZvbHVtZVJhbXAoYm9vbCBhdXgsIGJvb2wgdXNlRmxvYXQpCitpbmxpbmUgdm9pZCBBdWRpb01peGVyOjpUcmFjazo6YWRqdXN0Vm9sdW1lUmFtcChib29sIGF1eCwgYm9vbCB1c2VGbG9hdCkKIHsKICAgICBpZiAodXNlRmxvYXQpIHsKICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IE1BWF9OVU1fVk9MVU1FUzsgaSsrKSB7CkBAIC04NjEsMTEzICs3NzMsOTggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAvKiBUT0RPOiBhdXggaXMgYWx3YXlzIGludGVnZXIgcmVnYXJkbGVzcyBvZiBvdXRwdXQgYnVmZmVyIHR5cGUgKi8KKwogICAgIGlmIChhdXgpIHsKLSAgICAgICAgaWYgKCgoYXV4SW5jPjApICYmICgoKHByZXZBdXhMZXZlbCthdXhJbmMpPj4xNikgPj0gYXV4TGV2ZWwpKSB8fAotICAgICAgICAgICAgICAgICgoYXV4SW5jPDApICYmICgoKHByZXZBdXhMZXZlbCthdXhJbmMpPj4xNikgPD0gYXV4TGV2ZWwpKSkgeworI2lmZGVmIEZMT0FUX0FVWAorICAgICAgICBpZiAodXNlRmxvYXQpIHsKKyAgICAgICAgICAgIGlmICgobUF1eEluYyA+IDAuZiAmJiBtUHJldkF1eExldmVsICsgbUF1eEluYyA+PSBtQXV4TGV2ZWwpIHx8CisgICAgICAgICAgICAgICAgICAgIChtQXV4SW5jIDwgMC5mICYmIG1QcmV2QXV4TGV2ZWwgKyBtQXV4SW5jIDw9IG1BdXhMZXZlbCkpIHsKKyAgICAgICAgICAgICAgICBhdXhJbmMgPSAwOworICAgICAgICAgICAgICAgIHByZXZBdXhMZXZlbCA9IGF1eExldmVsIDw8IDE2OworICAgICAgICAgICAgICAgIG1BdXhJbmMgPSAwLmY7CisgICAgICAgICAgICAgICAgbVByZXZBdXhMZXZlbCA9IG1BdXhMZXZlbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisjZW5kaWYKKyAgICAgICAgaWYgKChhdXhJbmMgPiAwICYmICgocHJldkF1eExldmVsICsgYXV4SW5jKSA+PiAxNikgPj0gYXV4TGV2ZWwpIHx8CisgICAgICAgICAgICAgICAgKGF1eEluYyA8IDAgJiYgKChwcmV2QXV4TGV2ZWwgKyBhdXhJbmMpID4+IDE2KSA8PSBhdXhMZXZlbCkpIHsKICAgICAgICAgICAgIGF1eEluYyA9IDA7CiAgICAgICAgICAgICBwcmV2QXV4TGV2ZWwgPSBhdXhMZXZlbCA8PCAxNjsKLSAgICAgICAgICAgIG1BdXhJbmMgPSAwLjsKKyAgICAgICAgICAgIG1BdXhJbmMgPSAwLmY7CiAgICAgICAgICAgICBtUHJldkF1eExldmVsID0gbUF1eExldmVsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy9BTE9HVigiYXV4IHJhbXA6ICVkICVkICVkIiwgYXV4TGV2ZWwgPDwgMTYsIHByZXZBdXhMZXZlbCwgYXV4SW5jKTsKICAgICAgICAgfQogICAgIH0KIH0KIAogc2l6ZV90IEF1ZGlvTWl4ZXI6OmdldFVucmVsZWFzZWRGcmFtZXMoaW50IG5hbWUpIGNvbnN0CiB7Ci0gICAgbmFtZSAtPSBUUkFDSzA7Ci0gICAgaWYgKHVpbnQzMl90KG5hbWUpIDwgTUFYX05VTV9UUkFDS1MpIHsKLSAgICAgICAgcmV0dXJuIG1TdGF0ZS50cmFja3NbbmFtZV0uZ2V0VW5yZWxlYXNlZEZyYW1lcygpOworICAgIGNvbnN0IGF1dG8gaXQgPSBtVHJhY2tzLmZpbmQobmFtZSk7CisgICAgaWYgKGl0ICE9IG1UcmFja3MuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQtPmdldFVucmVsZWFzZWRGcmFtZXMoKTsKICAgICB9CiAgICAgcmV0dXJuIDA7CiB9CiAKIHZvaWQgQXVkaW9NaXhlcjo6c2V0QnVmZmVyUHJvdmlkZXIoaW50IG5hbWUsIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIGJ1ZmZlclByb3ZpZGVyKQogewotICAgIG5hbWUgLT0gVFJBQ0swOwotICAgIEFMT0dfQVNTRVJUKHVpbnQzMl90KG5hbWUpIDwgTUFYX05VTV9UUkFDS1MsICJiYWQgdHJhY2sgbmFtZSAlZCIsIG5hbWUpOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoIWV4aXN0cyhuYW1lKSwgImludmFsaWQgbmFtZTogJWQiLCBuYW1lKTsKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VHJhY2s+ICZ0cmFjayA9IG1UcmFja3NbbmFtZV07CiAKLSAgICBpZiAobVN0YXRlLnRyYWNrc1tuYW1lXS5tSW5wdXRCdWZmZXJQcm92aWRlciA9PSBidWZmZXJQcm92aWRlcikgeworICAgIGlmICh0cmFjay0+bUlucHV0QnVmZmVyUHJvdmlkZXIgPT0gYnVmZmVyUHJvdmlkZXIpIHsKICAgICAgICAgcmV0dXJuOyAvLyBkb24ndCByZXNldCBhbnkgYnVmZmVyIHByb3ZpZGVycyBpZiBpZGVudGljYWwuCiAgICAgfQotICAgIGlmIChtU3RhdGUudHJhY2tzW25hbWVdLm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyICE9IE5VTEwpIHsKLSAgICAgICAgbVN0YXRlLnRyYWNrc1tuYW1lXS5tUmVmb3JtYXRCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKLSAgICB9IGVsc2UgaWYgKG1TdGF0ZS50cmFja3NbbmFtZV0uZG93bm1peGVyQnVmZmVyUHJvdmlkZXIgIT0gTlVMTCkgewotICAgICAgICBtU3RhdGUudHJhY2tzW25hbWVdLmRvd25taXhlckJ1ZmZlclByb3ZpZGVyLT5yZXNldCgpOwotICAgIH0gZWxzZSBpZiAobVN0YXRlLnRyYWNrc1tuYW1lXS5tUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyICE9IE5VTEwpIHsKLSAgICAgICAgbVN0YXRlLnRyYWNrc1tuYW1lXS5tUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLT5yZXNldCgpOwotICAgIH0gZWxzZSBpZiAobVN0YXRlLnRyYWNrc1tuYW1lXS5tVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlciAhPSBOVUxMKSB7Ci0gICAgICAgIG1TdGF0ZS50cmFja3NbbmFtZV0ubVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXItPnJlc2V0KCk7CisgICAgaWYgKHRyYWNrLT5tUmVmb3JtYXRCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIHRyYWNrLT5tUmVmb3JtYXRCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKKyAgICB9IGVsc2UgaWYgKHRyYWNrLT5tRG93bm1peGVyQnVmZmVyUHJvdmlkZXIgIT0gbnVsbHB0cikgeworICAgICAgICB0cmFjay0+bURvd25taXhlckJ1ZmZlclByb3ZpZGVyLT5yZXNldCgpOworICAgIH0gZWxzZSBpZiAodHJhY2stPm1Qb3N0RG93bm1peFJlZm9ybWF0QnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICB0cmFjay0+bVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKKyAgICB9IGVsc2UgaWYgKHRyYWNrLT5tVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIHRyYWNrLT5tVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKICAgICB9CiAKLSAgICBtU3RhdGUudHJhY2tzW25hbWVdLm1JbnB1dEJ1ZmZlclByb3ZpZGVyID0gYnVmZmVyUHJvdmlkZXI7Ci0gICAgbVN0YXRlLnRyYWNrc1tuYW1lXS5yZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycygpOworICAgIHRyYWNrLT5tSW5wdXRCdWZmZXJQcm92aWRlciA9IGJ1ZmZlclByb3ZpZGVyOworICAgIHRyYWNrLT5yZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycygpOwogfQogCi0KLXZvaWQgQXVkaW9NaXhlcjo6cHJvY2VzcygpCit2b2lkIEF1ZGlvTWl4ZXI6OnByb2Nlc3NfX3ZhbGlkYXRlKCkKIHsKLSAgICBtU3RhdGUuaG9vaygmbVN0YXRlKTsKLX0KLQotCi12b2lkIEF1ZGlvTWl4ZXI6OnByb2Nlc3NfX3ZhbGlkYXRlKHN0YXRlX3QqIHN0YXRlKQotewotICAgIEFMT0dXX0lGKCFzdGF0ZS0+bmVlZHNDaGFuZ2VkLAotICAgICAgICAiaW4gcHJvY2Vzc19fdmFsaWRhdGUoKSBidXQgbm90aGluZydzIGludmFsaWQiKTsKLQotICAgIHVpbnQzMl90IGNoYW5nZWQgPSBzdGF0ZS0+bmVlZHNDaGFuZ2VkOwotICAgIHN0YXRlLT5uZWVkc0NoYW5nZWQgPSAwOyAvLyBjbGVhciB0aGUgdmFsaWRhdGlvbiBmbGFnCi0KLSAgICAvLyByZWNvbXB1dGUgd2hpY2ggdHJhY2tzIGFyZSBlbmFibGVkIC8gZGlzYWJsZWQKLSAgICB1aW50MzJfdCBlbmFibGVkID0gMDsKLSAgICB1aW50MzJfdCBkaXNhYmxlZCA9IDA7Ci0gICAgd2hpbGUgKGNoYW5nZWQpIHsKLSAgICAgICAgY29uc3QgaW50IGkgPSAzMSAtIF9fYnVpbHRpbl9jbHooY2hhbmdlZCk7Ci0gICAgICAgIGNvbnN0IHVpbnQzMl90IG1hc2sgPSAxPDxpOwotICAgICAgICBjaGFuZ2VkICY9IH5tYXNrOwotICAgICAgICB0cmFja190JiB0ID0gc3RhdGUtPnRyYWNrc1tpXTsKLSAgICAgICAgKHQuZW5hYmxlZCA/IGVuYWJsZWQgOiBkaXNhYmxlZCkgfD0gbWFzazsKLSAgICB9Ci0gICAgc3RhdGUtPmVuYWJsZWRUcmFja3MgJj0gfmRpc2FibGVkOwotICAgIHN0YXRlLT5lbmFibGVkVHJhY2tzIHw9ICBlbmFibGVkOwotCi0gICAgLy8gY29tcHV0ZSBldmVyeXRoaW5nIHdlIG5lZWQuLi4KLSAgICBpbnQgY291bnRBY3RpdmVUcmFja3MgPSAwOwogICAgIC8vIFRPRE86IGZpeCBhbGwxNkJpdHNTdGVyZU5vUmVzYW1wbGUgbG9naWMgdG8KICAgICAvLyBlaXRoZXIgcHJvcGVybHkgaGFuZGxlIG11dGVkIHRyYWNrcyAoaXQgc2hvdWxkIGlnbm9yZSB0aGVtKQogICAgIC8vIG9yIHJlbW92ZSBhbHRvZ2V0aGVyIGFzIGFuIG9ic29sZXRlIG9wdGltaXphdGlvbi4KICAgICBib29sIGFsbDE2Qml0c1N0ZXJlb05vUmVzYW1wbGUgPSB0cnVlOwogICAgIGJvb2wgcmVzYW1wbGluZyA9IGZhbHNlOwogICAgIGJvb2wgdm9sdW1lUmFtcCA9IGZhbHNlOwotICAgIHVpbnQzMl90IGVuID0gc3RhdGUtPmVuYWJsZWRUcmFja3M7Ci0gICAgd2hpbGUgKGVuKSB7Ci0gICAgICAgIGNvbnN0IGludCBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KGVuKTsKLSAgICAgICAgZW4gJj0gfigxPDxpKTsKIAotICAgICAgICBjb3VudEFjdGl2ZVRyYWNrcysrOwotICAgICAgICB0cmFja190JiB0ID0gc3RhdGUtPnRyYWNrc1tpXTsKKyAgICBtRW5hYmxlZC5jbGVhcigpOworICAgIG1Hcm91cHMuY2xlYXIoKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnBhaXIgOiBtVHJhY2tzKSB7CisgICAgICAgIGNvbnN0IGludCBuYW1lID0gcGFpci5maXJzdDsKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYWNrPiAmdCA9IHBhaXIuc2Vjb25kOworICAgICAgICBpZiAoIXQtPmVuYWJsZWQpIGNvbnRpbnVlOworCisgICAgICAgIG1FbmFibGVkLmVtcGxhY2VfYmFjayhuYW1lKTsgIC8vIHdlIGFkZCB0byBtRW5hYmxlZCBpbiBvcmRlciBvZiBuYW1lLgorICAgICAgICBtR3JvdXBzW3QtPm1haW5CdWZmZXJdLmVtcGxhY2VfYmFjayhuYW1lKTsgLy8gbUdyb3VwcyBhbHNvIGluIG9yZGVyIG9mIG5hbWUuCisKICAgICAgICAgdWludDMyX3QgbiA9IDA7CiAgICAgICAgIC8vIEZJWE1FIGNhbiBvdmVyZmxvdyAobWFzayBpcyBvbmx5IDMgYml0cykKLSAgICAgICAgbiB8PSBORUVEU19DSEFOTkVMXzEgKyB0LmNoYW5uZWxDb3VudCAtIDE7Ci0gICAgICAgIGlmICh0LmRvZXNSZXNhbXBsZSgpKSB7CisgICAgICAgIG4gfD0gTkVFRFNfQ0hBTk5FTF8xICsgdC0+Y2hhbm5lbENvdW50IC0gMTsKKyAgICAgICAgaWYgKHQtPmRvZXNSZXNhbXBsZSgpKSB7CiAgICAgICAgICAgICBuIHw9IE5FRURTX1JFU0FNUExFOwogICAgICAgICB9Ci0gICAgICAgIGlmICh0LmF1eExldmVsICE9IDAgJiYgdC5hdXhCdWZmZXIgIT0gTlVMTCkgeworICAgICAgICBpZiAodC0+YXV4TGV2ZWwgIT0gMCAmJiB0LT5hdXhCdWZmZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgbiB8PSBORUVEU19BVVg7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAodC52b2x1bWVJbmNbMF18dC52b2x1bWVJbmNbMV0pIHsKKyAgICAgICAgaWYgKHQtPnZvbHVtZUluY1swXXx0LT52b2x1bWVJbmNbMV0pIHsKICAgICAgICAgICAgIHZvbHVtZVJhbXAgPSB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKCF0LmRvZXNSZXNhbXBsZSgpICYmIHQudm9sdW1lUkwgPT0gMCkgeworICAgICAgICB9IGVsc2UgaWYgKCF0LT5kb2VzUmVzYW1wbGUoKSAmJiB0LT52b2x1bWVSTCA9PSAwKSB7CiAgICAgICAgICAgICBuIHw9IE5FRURTX01VVEU7CiAgICAgICAgIH0KLSAgICAgICAgdC5uZWVkcyA9IG47CisgICAgICAgIHQtPm5lZWRzID0gbjsKIAogICAgICAgICBpZiAobiAmIE5FRURTX01VVEUpIHsKLSAgICAgICAgICAgIHQuaG9vayA9IHRyYWNrX19ub3A7CisgICAgICAgICAgICB0LT5ob29rID0gJlRyYWNrOjp0cmFja19fbm9wOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKG4gJiBORUVEU19BVVgpIHsKICAgICAgICAgICAgICAgICBhbGwxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxlID0gZmFsc2U7CkBAIC05NzUsMjMgKzg3MiwyMyBAQAogICAgICAgICAgICAgaWYgKG4gJiBORUVEU19SRVNBTVBMRSkgewogICAgICAgICAgICAgICAgIGFsbDE2Qml0c1N0ZXJlb05vUmVzYW1wbGUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICByZXNhbXBsaW5nID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB0Lmhvb2sgPSBnZXRUcmFja0hvb2soVFJBQ0tUWVBFX1JFU0FNUExFLCB0Lm1NaXhlckNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHQubU1peGVySW5Gb3JtYXQsIHQubU1peGVyRm9ybWF0KTsKKyAgICAgICAgICAgICAgICB0LT5ob29rID0gVHJhY2s6OmdldFRyYWNrSG9vayhUUkFDS1RZUEVfUkVTQU1QTEUsIHQtPm1NaXhlckNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHQtPm1NaXhlckluRm9ybWF0LCB0LT5tTWl4ZXJGb3JtYXQpOwogICAgICAgICAgICAgICAgIEFMT0dWX0lGKChuICYgTkVFRFNfQ0hBTk5FTF9DT1VOVF9fTUFTSykgPiBORUVEU19DSEFOTkVMXzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiVHJhY2sgJWQgbmVlZHMgZG93bm1peCArIHJlc2FtcGxlIiwgaSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlmICgobiAmIE5FRURTX0NIQU5ORUxfQ09VTlRfX01BU0spID09IE5FRURTX0NIQU5ORUxfMSl7Ci0gICAgICAgICAgICAgICAgICAgIHQuaG9vayA9IGdldFRyYWNrSG9vaygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodC5tTWl4ZXJDaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8gIC8vIFRPRE86IE1PTk9fSEFDSwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdC5jaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX09VVF9NT05PKQorICAgICAgICAgICAgICAgICAgICB0LT5ob29rID0gVHJhY2s6OmdldFRyYWNrSG9vaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodC0+bU1peGVyQ2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPICAvLyBUT0RPOiBNT05PX0hBQ0sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHQtPmNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfT1VUX01PTk8pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gVFJBQ0tUWVBFX05PUkVTQU1QTEVNT05PIDogVFJBQ0tUWVBFX05PUkVTQU1QTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5tTWl4ZXJDaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5tTWl4ZXJJbkZvcm1hdCwgdC5tTWl4ZXJGb3JtYXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQtPm1NaXhlckNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LT5tTWl4ZXJJbkZvcm1hdCwgdC0+bU1peGVyRm9ybWF0KTsKICAgICAgICAgICAgICAgICAgICAgYWxsMTZCaXRzU3RlcmVvTm9SZXNhbXBsZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoKG4gJiBORUVEU19DSEFOTkVMX0NPVU5UX19NQVNLKSA+PSBORUVEU19DSEFOTkVMXzIpewotICAgICAgICAgICAgICAgICAgICB0Lmhvb2sgPSBnZXRUcmFja0hvb2soVFJBQ0tUWVBFX05PUkVTQU1QTEUsIHQubU1peGVyQ2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQubU1peGVySW5Gb3JtYXQsIHQubU1peGVyRm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgdC0+aG9vayA9IFRyYWNrOjpnZXRUcmFja0hvb2soVFJBQ0tUWVBFX05PUkVTQU1QTEUsIHQtPm1NaXhlckNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LT5tTWl4ZXJJbkZvcm1hdCwgdC0+bU1peGVyRm9ybWF0KTsKICAgICAgICAgICAgICAgICAgICAgQUxPR1ZfSUYoKG4gJiBORUVEU19DSEFOTkVMX0NPVU5UX19NQVNLKSA+IE5FRURTX0NIQU5ORUxfMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVHJhY2sgJWQgbmVlZHMgZG93bm1peCIsIGkpOwogICAgICAgICAgICAgICAgIH0KQEAgLTEwMDAsMTM3ICs4OTcsMTI1IEBACiAgICAgfQogCiAgICAgLy8gc2VsZWN0IHRoZSBwcm9jZXNzaW5nIGhvb2tzCi0gICAgc3RhdGUtPmhvb2sgPSBwcm9jZXNzX19ub3A7Ci0gICAgaWYgKGNvdW50QWN0aXZlVHJhY2tzID4gMCkgeworICAgIG1Ib29rID0gJkF1ZGlvTWl4ZXI6OnByb2Nlc3NfX25vcDsKKyAgICBpZiAobUVuYWJsZWQuc2l6ZSgpID4gMCkgewogICAgICAgICBpZiAocmVzYW1wbGluZykgewotICAgICAgICAgICAgaWYgKCFzdGF0ZS0+b3V0cHV0VGVtcCkgewotICAgICAgICAgICAgICAgIHN0YXRlLT5vdXRwdXRUZW1wID0gbmV3IGludDMyX3RbTUFYX05VTV9DSEFOTkVMUyAqIHN0YXRlLT5mcmFtZUNvdW50XTsKKyAgICAgICAgICAgIGlmIChtT3V0cHV0VGVtcC5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgbU91dHB1dFRlbXAucmVzZXQobmV3IGludDMyX3RbTUFYX05VTV9DSEFOTkVMUyAqIG1GcmFtZUNvdW50XSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIXN0YXRlLT5yZXNhbXBsZVRlbXApIHsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+cmVzYW1wbGVUZW1wID0gbmV3IGludDMyX3RbTUFYX05VTV9DSEFOTkVMUyAqIHN0YXRlLT5mcmFtZUNvdW50XTsKKyAgICAgICAgICAgIGlmIChtUmVzYW1wbGVUZW1wLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBtUmVzYW1wbGVUZW1wLnJlc2V0KG5ldyBpbnQzMl90W01BWF9OVU1fQ0hBTk5FTFMgKiBtRnJhbWVDb3VudF0pOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdGUtPmhvb2sgPSBwcm9jZXNzX19nZW5lcmljUmVzYW1wbGluZzsKKyAgICAgICAgICAgIG1Ib29rID0gJkF1ZGlvTWl4ZXI6OnByb2Nlc3NfX2dlbmVyaWNSZXNhbXBsaW5nOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHN0YXRlLT5vdXRwdXRUZW1wKSB7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIFtdIHN0YXRlLT5vdXRwdXRUZW1wOwotICAgICAgICAgICAgICAgIHN0YXRlLT5vdXRwdXRUZW1wID0gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzdGF0ZS0+cmVzYW1wbGVUZW1wKSB7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIFtdIHN0YXRlLT5yZXNhbXBsZVRlbXA7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPnJlc2FtcGxlVGVtcCA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0ZS0+aG9vayA9IHByb2Nlc3NfX2dlbmVyaWNOb1Jlc2FtcGxpbmc7CisgICAgICAgICAgICAvLyB3ZSBrZWVwIHRlbXAgYXJyYXlzIGFyb3VuZC4KKyAgICAgICAgICAgIG1Ib29rID0gJkF1ZGlvTWl4ZXI6OnByb2Nlc3NfX2dlbmVyaWNOb1Jlc2FtcGxpbmc7CiAgICAgICAgICAgICBpZiAoYWxsMTZCaXRzU3RlcmVvTm9SZXNhbXBsZSAmJiAhdm9sdW1lUmFtcCkgewotICAgICAgICAgICAgICAgIGlmIChjb3VudEFjdGl2ZVRyYWNrcyA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KHN0YXRlLT5lbmFibGVkVHJhY2tzKTsKLSAgICAgICAgICAgICAgICAgICAgdHJhY2tfdCYgdCA9IHN0YXRlLT50cmFja3NbaV07Ci0gICAgICAgICAgICAgICAgICAgIGlmICgodC5uZWVkcyAmIE5FRURTX01VVEUpID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAobUVuYWJsZWQuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYWNrPiAmdCA9IG1UcmFja3NbbUVuYWJsZWRbMF1dOworICAgICAgICAgICAgICAgICAgICBpZiAoKHQtPm5lZWRzICYgTkVFRFNfTVVURSkgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNoZWNrIHByZXZlbnRzIGEgbXV0ZWQgdHJhY2sgZnJvbSBhY3F1aXJpbmcgYSBwcm9jZXNzIGhvb2suCiAgICAgICAgICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBkYW5nZXJvdXMgaWYgdGhlIHRyYWNrIGlzIE1PTk8gYXMgdGhhdCByZXF1aXJlcwogICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGhhbmRsaW5nIGR1ZSB0byBpbXBsaWNpdCBjaGFubmVsIGR1cGxpY2F0aW9uLgogICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RlcmVvIG9yIE11bHRpY2hhbm5lbCBzaG91bGQgYWN0dWFsbHkgYmUgZmluZSBoZXJlLgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmhvb2sgPSBnZXRQcm9jZXNzSG9vayhQUk9DRVNTVFlQRV9OT1JFU0FNUExFT05FVFJBQ0ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQubU1peGVyQ2hhbm5lbENvdW50LCB0Lm1NaXhlckluRm9ybWF0LCB0Lm1NaXhlckZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtSG9vayA9IGdldFByb2Nlc3NIb29rKFBST0NFU1NUWVBFX05PUkVTQU1QTEVPTkVUUkFDSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+bU1peGVyQ2hhbm5lbENvdW50LCB0LT5tTWl4ZXJJbkZvcm1hdCwgdC0+bU1peGVyRm9ybWF0KTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIEFMT0dWKCJtaXhlciBjb25maWd1cmF0aW9uIGNoYW5nZTogJWQgYWN0aXZlVHJhY2tzICglMDh4KSAiCisgICAgQUxPR1YoIm1peGVyIGNvbmZpZ3VyYXRpb24gY2hhbmdlOiAlenUgIgogICAgICAgICAiYWxsMTZCaXRzU3RlcmVvTm9SZXNhbXBsZT0lZCwgcmVzYW1wbGluZz0lZCwgdm9sdW1lUmFtcD0lZCIsCi0gICAgICAgIGNvdW50QWN0aXZlVHJhY2tzLCBzdGF0ZS0+ZW5hYmxlZFRyYWNrcywKLSAgICAgICAgYWxsMTZCaXRzU3RlcmVvTm9SZXNhbXBsZSwgcmVzYW1wbGluZywgdm9sdW1lUmFtcCk7CisgICAgICAgIG1FbmFibGVkLnNpemUoKSwgYWxsMTZCaXRzU3RlcmVvTm9SZXNhbXBsZSwgcmVzYW1wbGluZywgdm9sdW1lUmFtcCk7CiAKLSAgIHN0YXRlLT5ob29rKHN0YXRlKTsKKyAgIHByb2Nlc3MoKTsKIAogICAgIC8vIE5vdyB0aGF0IHRoZSB2b2x1bWUgcmFtcCBoYXMgYmVlbiBkb25lLCBzZXQgb3B0aW1hbCBzdGF0ZSBhbmQKICAgICAvLyB0cmFjayBob29rcyBmb3Igc3Vic2VxdWVudCBtaXhlciBwcm9jZXNzCi0gICAgaWYgKGNvdW50QWN0aXZlVHJhY2tzID4gMCkgeworICAgIGlmIChtRW5hYmxlZC5zaXplKCkgPiAwKSB7CiAgICAgICAgIGJvb2wgYWxsTXV0ZWQgPSB0cnVlOwotICAgICAgICB1aW50MzJfdCBlbiA9IHN0YXRlLT5lbmFibGVkVHJhY2tzOwotICAgICAgICB3aGlsZSAoZW4pIHsKLSAgICAgICAgICAgIGNvbnN0IGludCBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KGVuKTsKLSAgICAgICAgICAgIGVuICY9IH4oMTw8aSk7Ci0gICAgICAgICAgICB0cmFja190JiB0ID0gc3RhdGUtPnRyYWNrc1tpXTsKLSAgICAgICAgICAgIGlmICghdC5kb2VzUmVzYW1wbGUoKSAmJiB0LnZvbHVtZVJMID09IDApIHsKLSAgICAgICAgICAgICAgICB0Lm5lZWRzIHw9IE5FRURTX01VVEU7Ci0gICAgICAgICAgICAgICAgdC5ob29rID0gdHJhY2tfX25vcDsKKworICAgICAgICBmb3IgKGNvbnN0IGludCBuYW1lIDogbUVuYWJsZWQpIHsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUcmFjaz4gJnQgPSBtVHJhY2tzW25hbWVdOworICAgICAgICAgICAgaWYgKCF0LT5kb2VzUmVzYW1wbGUoKSAmJiB0LT52b2x1bWVSTCA9PSAwKSB7CisgICAgICAgICAgICAgICAgdC0+bmVlZHMgfD0gTkVFRFNfTVVURTsKKyAgICAgICAgICAgICAgICB0LT5ob29rID0gJlRyYWNrOjp0cmFja19fbm9wOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBhbGxNdXRlZCA9IGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChhbGxNdXRlZCkgewotICAgICAgICAgICAgc3RhdGUtPmhvb2sgPSBwcm9jZXNzX19ub3A7CisgICAgICAgICAgICBtSG9vayA9ICZBdWRpb01peGVyOjpwcm9jZXNzX19ub3A7CiAgICAgICAgIH0gZWxzZSBpZiAoYWxsMTZCaXRzU3RlcmVvTm9SZXNhbXBsZSkgewotICAgICAgICAgICAgaWYgKGNvdW50QWN0aXZlVHJhY2tzID09IDEpIHsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQgaSA9IDMxIC0gX19idWlsdGluX2NseihzdGF0ZS0+ZW5hYmxlZFRyYWNrcyk7Ci0gICAgICAgICAgICAgICAgdHJhY2tfdCYgdCA9IHN0YXRlLT50cmFja3NbaV07CisgICAgICAgICAgICBpZiAobUVuYWJsZWQuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgICAgICAvL2NvbnN0IGludCBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KGVuYWJsZWRUcmFja3MpOworICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUcmFjaz4gJnQgPSBtVHJhY2tzW21FbmFibGVkWzBdXTsKICAgICAgICAgICAgICAgICAvLyBNdXRlZCBzaW5nbGUgdHJhY2tzIGhhbmRsZWQgYnkgYWxsTXV0ZWQgYWJvdmUuCi0gICAgICAgICAgICAgICAgc3RhdGUtPmhvb2sgPSBnZXRQcm9jZXNzSG9vayhQUk9DRVNTVFlQRV9OT1JFU0FNUExFT05FVFJBQ0ssCi0gICAgICAgICAgICAgICAgICAgICAgICB0Lm1NaXhlckNoYW5uZWxDb3VudCwgdC5tTWl4ZXJJbkZvcm1hdCwgdC5tTWl4ZXJGb3JtYXQpOworICAgICAgICAgICAgICAgIG1Ib29rID0gZ2V0UHJvY2Vzc0hvb2soUFJPQ0VTU1RZUEVfTk9SRVNBTVBMRU9ORVRSQUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgdC0+bU1peGVyQ2hhbm5lbENvdW50LCB0LT5tTWl4ZXJJbkZvcm1hdCwgdC0+bU1peGVyRm9ybWF0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIH0KIAotCi12b2lkIEF1ZGlvTWl4ZXI6OnRyYWNrX19nZW5lcmljUmVzYW1wbGUodHJhY2tfdCogdCwgaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKLSAgICAgICAgaW50MzJfdCogdGVtcCwgaW50MzJfdCogYXV4KQordm9pZCBBdWRpb01peGVyOjpUcmFjazo6dHJhY2tfX2dlbmVyaWNSZXNhbXBsZSgKKyAgICAgICAgaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwgaW50MzJfdCogdGVtcCwgaW50MzJfdCogYXV4KQogewogICAgIEFMT0dWVigidHJhY2tfX2dlbmVyaWNSZXNhbXBsZVxuIik7Ci0gICAgdC0+cmVzYW1wbGVyLT5zZXRTYW1wbGVSYXRlKHQtPnNhbXBsZVJhdGUpOworICAgIG1SZXNhbXBsZXItPnNldFNhbXBsZVJhdGUoc2FtcGxlUmF0ZSk7CiAKICAgICAvLyByYW1wIGdhaW4gLSByZXNhbXBsZSB0byB0ZW1wIGJ1ZmZlciBhbmQgc2NhbGUvbWl4IGluIDJuZCBzdGVwCiAgICAgaWYgKGF1eCAhPSBOVUxMKSB7CiAgICAgICAgIC8vIGFsd2F5cyByZXNhbXBsZSB3aXRoIHVuaXR5IGdhaW4gd2hlbiBzZW5kaW5nIHRvIGF1eGlsaWFyeSBidWZmZXIgdG8gYmUgYWJsZQogICAgICAgICAvLyB0byBhcHBseSBzZW5kIGxldmVsIGFmdGVyIHJlc2FtcGxpbmcKLSAgICAgICAgdC0+cmVzYW1wbGVyLT5zZXRWb2x1bWUoVU5JVFlfR0FJTl9GTE9BVCwgVU5JVFlfR0FJTl9GTE9BVCk7Ci0gICAgICAgIG1lbXNldCh0ZW1wLCAwLCBvdXRGcmFtZUNvdW50ICogdC0+bU1peGVyQ2hhbm5lbENvdW50ICogc2l6ZW9mKGludDMyX3QpKTsKLSAgICAgICAgdC0+cmVzYW1wbGVyLT5yZXNhbXBsZSh0ZW1wLCBvdXRGcmFtZUNvdW50LCB0LT5idWZmZXJQcm92aWRlcik7Ci0gICAgICAgIGlmIChDQ19VTkxJS0VMWSh0LT52b2x1bWVJbmNbMF18dC0+dm9sdW1lSW5jWzFdfHQtPmF1eEluYykpIHsKLSAgICAgICAgICAgIHZvbHVtZVJhbXBTdGVyZW8odCwgb3V0LCBvdXRGcmFtZUNvdW50LCB0ZW1wLCBhdXgpOworICAgICAgICBtUmVzYW1wbGVyLT5zZXRWb2x1bWUoVU5JVFlfR0FJTl9GTE9BVCwgVU5JVFlfR0FJTl9GTE9BVCk7CisgICAgICAgIG1lbXNldCh0ZW1wLCAwLCBvdXRGcmFtZUNvdW50ICogbU1peGVyQ2hhbm5lbENvdW50ICogc2l6ZW9mKGludDMyX3QpKTsKKyAgICAgICAgbVJlc2FtcGxlci0+cmVzYW1wbGUodGVtcCwgb3V0RnJhbWVDb3VudCwgYnVmZmVyUHJvdmlkZXIpOworICAgICAgICBpZiAoQ0NfVU5MSUtFTFkodm9sdW1lSW5jWzBdfHZvbHVtZUluY1sxXXxhdXhJbmMpKSB7CisgICAgICAgICAgICB2b2x1bWVSYW1wU3RlcmVvKG91dCwgb3V0RnJhbWVDb3VudCwgdGVtcCwgYXV4KTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHZvbHVtZVN0ZXJlbyh0LCBvdXQsIG91dEZyYW1lQ291bnQsIHRlbXAsIGF1eCk7CisgICAgICAgICAgICB2b2x1bWVTdGVyZW8ob3V0LCBvdXRGcmFtZUNvdW50LCB0ZW1wLCBhdXgpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKENDX1VOTElLRUxZKHQtPnZvbHVtZUluY1swXXx0LT52b2x1bWVJbmNbMV0pKSB7Ci0gICAgICAgICAgICB0LT5yZXNhbXBsZXItPnNldFZvbHVtZShVTklUWV9HQUlOX0ZMT0FULCBVTklUWV9HQUlOX0ZMT0FUKTsKKyAgICAgICAgaWYgKENDX1VOTElLRUxZKHZvbHVtZUluY1swXXx2b2x1bWVJbmNbMV0pKSB7CisgICAgICAgICAgICBtUmVzYW1wbGVyLT5zZXRWb2x1bWUoVU5JVFlfR0FJTl9GTE9BVCwgVU5JVFlfR0FJTl9GTE9BVCk7CiAgICAgICAgICAgICBtZW1zZXQodGVtcCwgMCwgb3V0RnJhbWVDb3VudCAqIE1BWF9OVU1fQ0hBTk5FTFMgKiBzaXplb2YoaW50MzJfdCkpOwotICAgICAgICAgICAgdC0+cmVzYW1wbGVyLT5yZXNhbXBsZSh0ZW1wLCBvdXRGcmFtZUNvdW50LCB0LT5idWZmZXJQcm92aWRlcik7Ci0gICAgICAgICAgICB2b2x1bWVSYW1wU3RlcmVvKHQsIG91dCwgb3V0RnJhbWVDb3VudCwgdGVtcCwgYXV4KTsKKyAgICAgICAgICAgIG1SZXNhbXBsZXItPnJlc2FtcGxlKHRlbXAsIG91dEZyYW1lQ291bnQsIGJ1ZmZlclByb3ZpZGVyKTsKKyAgICAgICAgICAgIHZvbHVtZVJhbXBTdGVyZW8ob3V0LCBvdXRGcmFtZUNvdW50LCB0ZW1wLCBhdXgpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gY29uc3RhbnQgZ2FpbgogICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHQtPnJlc2FtcGxlci0+c2V0Vm9sdW1lKHQtPm1Wb2x1bWVbMF0sIHQtPm1Wb2x1bWVbMV0pOwotICAgICAgICAgICAgdC0+cmVzYW1wbGVyLT5yZXNhbXBsZShvdXQsIG91dEZyYW1lQ291bnQsIHQtPmJ1ZmZlclByb3ZpZGVyKTsKKyAgICAgICAgICAgIG1SZXNhbXBsZXItPnNldFZvbHVtZShtVm9sdW1lWzBdLCBtVm9sdW1lWzFdKTsKKyAgICAgICAgICAgIG1SZXNhbXBsZXItPnJlc2FtcGxlKG91dCwgb3V0RnJhbWVDb3VudCwgYnVmZmVyUHJvdmlkZXIpOwogICAgICAgICB9CiAgICAgfQogfQogCi12b2lkIEF1ZGlvTWl4ZXI6OnRyYWNrX19ub3AodHJhY2tfdCogdCBfX3VudXNlZCwgaW50MzJfdCogb3V0IF9fdW51c2VkLAordm9pZCBBdWRpb01peGVyOjpUcmFjazo6dHJhY2tfX25vcChpbnQzMl90KiBvdXQgX191bnVzZWQsCiAgICAgICAgIHNpemVfdCBvdXRGcmFtZUNvdW50IF9fdW51c2VkLCBpbnQzMl90KiB0ZW1wIF9fdW51c2VkLCBpbnQzMl90KiBhdXggX191bnVzZWQpCiB7CiB9CiAKLXZvaWQgQXVkaW9NaXhlcjo6dm9sdW1lUmFtcFN0ZXJlbyh0cmFja190KiB0LCBpbnQzMl90KiBvdXQsIHNpemVfdCBmcmFtZUNvdW50LCBpbnQzMl90KiB0ZW1wLAotICAgICAgICBpbnQzMl90KiBhdXgpCit2b2lkIEF1ZGlvTWl4ZXI6OlRyYWNrOjp2b2x1bWVSYW1wU3RlcmVvKAorICAgICAgICBpbnQzMl90KiBvdXQsIHNpemVfdCBmcmFtZUNvdW50LCBpbnQzMl90KiB0ZW1wLCBpbnQzMl90KiBhdXgpCiB7Ci0gICAgaW50MzJfdCB2bCA9IHQtPnByZXZWb2x1bWVbMF07Ci0gICAgaW50MzJfdCB2ciA9IHQtPnByZXZWb2x1bWVbMV07Ci0gICAgY29uc3QgaW50MzJfdCB2bEluYyA9IHQtPnZvbHVtZUluY1swXTsKLSAgICBjb25zdCBpbnQzMl90IHZySW5jID0gdC0+dm9sdW1lSW5jWzFdOworICAgIGludDMyX3QgdmwgPSBwcmV2Vm9sdW1lWzBdOworICAgIGludDMyX3QgdnIgPSBwcmV2Vm9sdW1lWzFdOworICAgIGNvbnN0IGludDMyX3QgdmxJbmMgPSB2b2x1bWVJbmNbMF07CisgICAgY29uc3QgaW50MzJfdCB2ckluYyA9IHZvbHVtZUluY1sxXTsKIAogICAgIC8vQUxPR0QoIlswXSAlcDogaW5jPSVmLCB2MD0lZiwgdjE9JWQsIGZpbmFsPSVmLCBjb3VudD0lZCIsCi0gICAgLy8gICAgICAgIHQsIHZsSW5jLzY1NTM2LjBmLCB2bC82NTUzNi4wZiwgdC0+dm9sdW1lWzBdLAorICAgIC8vICAgICAgICB0LCB2bEluYy82NTUzNi4wZiwgdmwvNjU1MzYuMGYsIHZvbHVtZVswXSwKICAgICAvLyAgICAgICAodmwgKyB2bEluYypmcmFtZUNvdW50KS82NTUzNi4wZiwgZnJhbWVDb3VudCk7CiAKICAgICAvLyByYW1wIHZvbHVtZQogICAgIGlmIChDQ19VTkxJS0VMWShhdXggIT0gTlVMTCkpIHsKLSAgICAgICAgaW50MzJfdCB2YSA9IHQtPnByZXZBdXhMZXZlbDsKLSAgICAgICAgY29uc3QgaW50MzJfdCB2YUluYyA9IHQtPmF1eEluYzsKKyAgICAgICAgaW50MzJfdCB2YSA9IHByZXZBdXhMZXZlbDsKKyAgICAgICAgY29uc3QgaW50MzJfdCB2YUluYyA9IGF1eEluYzsKICAgICAgICAgaW50MzJfdCBsOwogICAgICAgICBpbnQzMl90IHI7CiAKQEAgLTExNDQsNyArMTAyOSw3IEBACiAgICAgICAgICAgICB2ciArPSB2ckluYzsKICAgICAgICAgICAgIHZhICs9IHZhSW5jOwogICAgICAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOwotICAgICAgICB0LT5wcmV2QXV4TGV2ZWwgPSB2YTsKKyAgICAgICAgcHJldkF1eExldmVsID0gdmE7CiAgICAgfSBlbHNlIHsKICAgICAgICAgZG8gewogICAgICAgICAgICAgKm91dCsrICs9ICh2bCA+PiAxNikgKiAoKnRlbXArKyA+PiAxMik7CkBAIC0xMTUzLDE5ICsxMDM4LDE5IEBACiAgICAgICAgICAgICB2ciArPSB2ckluYzsKICAgICAgICAgfSB3aGlsZSAoLS1mcmFtZUNvdW50KTsKICAgICB9Ci0gICAgdC0+cHJldlZvbHVtZVswXSA9IHZsOwotICAgIHQtPnByZXZWb2x1bWVbMV0gPSB2cjsKLSAgICB0LT5hZGp1c3RWb2x1bWVSYW1wKGF1eCAhPSBOVUxMKTsKKyAgICBwcmV2Vm9sdW1lWzBdID0gdmw7CisgICAgcHJldlZvbHVtZVsxXSA9IHZyOworICAgIGFkanVzdFZvbHVtZVJhbXAoYXV4ICE9IE5VTEwpOwogfQogCi12b2lkIEF1ZGlvTWl4ZXI6OnZvbHVtZVN0ZXJlbyh0cmFja190KiB0LCBpbnQzMl90KiBvdXQsIHNpemVfdCBmcmFtZUNvdW50LCBpbnQzMl90KiB0ZW1wLAotICAgICAgICBpbnQzMl90KiBhdXgpCit2b2lkIEF1ZGlvTWl4ZXI6OlRyYWNrOjp2b2x1bWVTdGVyZW8oCisgICAgICAgIGludDMyX3QqIG91dCwgc2l6ZV90IGZyYW1lQ291bnQsIGludDMyX3QqIHRlbXAsIGludDMyX3QqIGF1eCkKIHsKLSAgICBjb25zdCBpbnQxNl90IHZsID0gdC0+dm9sdW1lWzBdOwotICAgIGNvbnN0IGludDE2X3QgdnIgPSB0LT52b2x1bWVbMV07CisgICAgY29uc3QgaW50MTZfdCB2bCA9IHZvbHVtZVswXTsKKyAgICBjb25zdCBpbnQxNl90IHZyID0gdm9sdW1lWzFdOwogCiAgICAgaWYgKENDX1VOTElLRUxZKGF1eCAhPSBOVUxMKSkgewotICAgICAgICBjb25zdCBpbnQxNl90IHZhID0gdC0+YXV4TGV2ZWw7CisgICAgICAgIGNvbnN0IGludDE2X3QgdmEgPSBhdXhMZXZlbDsKICAgICAgICAgZG8gewogICAgICAgICAgICAgaW50MTZfdCBsID0gKGludDE2X3QpKCp0ZW1wKysgPj4gMTIpOwogICAgICAgICAgICAgaW50MTZfdCByID0gKGludDE2X3QpKCp0ZW1wKysgPj4gMTIpOwpAQCAtMTE4NywyNSArMTA3MiwyNSBAQAogICAgIH0KIH0KIAotdm9pZCBBdWRpb01peGVyOjp0cmFja19fMTZCaXRzU3RlcmVvKHRyYWNrX3QqIHQsIGludDMyX3QqIG91dCwgc2l6ZV90IGZyYW1lQ291bnQsCi0gICAgICAgIGludDMyX3QqIHRlbXAgX191bnVzZWQsIGludDMyX3QqIGF1eCkKK3ZvaWQgQXVkaW9NaXhlcjo6VHJhY2s6OnRyYWNrX18xNkJpdHNTdGVyZW8oCisgICAgICAgIGludDMyX3QqIG91dCwgc2l6ZV90IGZyYW1lQ291bnQsIGludDMyX3QqIHRlbXAgX191bnVzZWQsIGludDMyX3QqIGF1eCkKIHsKICAgICBBTE9HVlYoInRyYWNrX18xNkJpdHNTdGVyZW9cbiIpOwotICAgIGNvbnN0IGludDE2X3QgKmluID0gc3RhdGljX2Nhc3Q8Y29uc3QgaW50MTZfdCAqPih0LT5pbik7CisgICAgY29uc3QgaW50MTZfdCAqaW4gPSBzdGF0aWNfY2FzdDxjb25zdCBpbnQxNl90ICo+KG1Jbik7CiAKICAgICBpZiAoQ0NfVU5MSUtFTFkoYXV4ICE9IE5VTEwpKSB7CiAgICAgICAgIGludDMyX3QgbDsKICAgICAgICAgaW50MzJfdCByOwogICAgICAgICAvLyByYW1wIGdhaW4KLSAgICAgICAgaWYgKENDX1VOTElLRUxZKHQtPnZvbHVtZUluY1swXXx0LT52b2x1bWVJbmNbMV18dC0+YXV4SW5jKSkgewotICAgICAgICAgICAgaW50MzJfdCB2bCA9IHQtPnByZXZWb2x1bWVbMF07Ci0gICAgICAgICAgICBpbnQzMl90IHZyID0gdC0+cHJldlZvbHVtZVsxXTsKLSAgICAgICAgICAgIGludDMyX3QgdmEgPSB0LT5wcmV2QXV4TGV2ZWw7Ci0gICAgICAgICAgICBjb25zdCBpbnQzMl90IHZsSW5jID0gdC0+dm9sdW1lSW5jWzBdOwotICAgICAgICAgICAgY29uc3QgaW50MzJfdCB2ckluYyA9IHQtPnZvbHVtZUluY1sxXTsKLSAgICAgICAgICAgIGNvbnN0IGludDMyX3QgdmFJbmMgPSB0LT5hdXhJbmM7CisgICAgICAgIGlmIChDQ19VTkxJS0VMWSh2b2x1bWVJbmNbMF18dm9sdW1lSW5jWzFdfGF1eEluYykpIHsKKyAgICAgICAgICAgIGludDMyX3QgdmwgPSBwcmV2Vm9sdW1lWzBdOworICAgICAgICAgICAgaW50MzJfdCB2ciA9IHByZXZWb2x1bWVbMV07CisgICAgICAgICAgICBpbnQzMl90IHZhID0gcHJldkF1eExldmVsOworICAgICAgICAgICAgY29uc3QgaW50MzJfdCB2bEluYyA9IHZvbHVtZUluY1swXTsKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgdnJJbmMgPSB2b2x1bWVJbmNbMV07CisgICAgICAgICAgICBjb25zdCBpbnQzMl90IHZhSW5jID0gYXV4SW5jOwogICAgICAgICAgICAgLy8gQUxPR0QoIlsxXSAlcDogaW5jPSVmLCB2MD0lZiwgdjE9JWQsIGZpbmFsPSVmLCBjb3VudD0lZCIsCi0gICAgICAgICAgICAvLyAgICAgICAgdCwgdmxJbmMvNjU1MzYuMGYsIHZsLzY1NTM2LjBmLCB0LT52b2x1bWVbMF0sCisgICAgICAgICAgICAvLyAgICAgICAgdCwgdmxJbmMvNjU1MzYuMGYsIHZsLzY1NTM2LjBmLCB2b2x1bWVbMF0sCiAgICAgICAgICAgICAvLyAgICAgICAgKHZsICsgdmxJbmMqZnJhbWVDb3VudCkvNjU1MzYuMGYsIGZyYW1lQ291bnQpOwogCiAgICAgICAgICAgICBkbyB7CkBAIC0xMjE5LDE2ICsxMTA0LDE2IEBACiAgICAgICAgICAgICAgICAgdmEgKz0gdmFJbmM7CiAgICAgICAgICAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOwogCi0gICAgICAgICAgICB0LT5wcmV2Vm9sdW1lWzBdID0gdmw7Ci0gICAgICAgICAgICB0LT5wcmV2Vm9sdW1lWzFdID0gdnI7Ci0gICAgICAgICAgICB0LT5wcmV2QXV4TGV2ZWwgPSB2YTsKLSAgICAgICAgICAgIHQtPmFkanVzdFZvbHVtZVJhbXAodHJ1ZSk7CisgICAgICAgICAgICBwcmV2Vm9sdW1lWzBdID0gdmw7CisgICAgICAgICAgICBwcmV2Vm9sdW1lWzFdID0gdnI7CisgICAgICAgICAgICBwcmV2QXV4TGV2ZWwgPSB2YTsKKyAgICAgICAgICAgIGFkanVzdFZvbHVtZVJhbXAodHJ1ZSk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBjb25zdGFudCBnYWluCiAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgY29uc3QgdWludDMyX3QgdnJsID0gdC0+dm9sdW1lUkw7Ci0gICAgICAgICAgICBjb25zdCBpbnQxNl90IHZhID0gKGludDE2X3QpdC0+YXV4TGV2ZWw7CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCB2cmwgPSB2b2x1bWVSTDsKKyAgICAgICAgICAgIGNvbnN0IGludDE2X3QgdmEgPSAoaW50MTZfdClhdXhMZXZlbDsKICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICB1aW50MzJfdCBybCA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90ICo+KGluKTsKICAgICAgICAgICAgICAgICBpbnQxNl90IGEgPSAoaW50MTZfdCkoKChpbnQzMl90KWluWzBdICsgaW5bMV0pID4+IDEpOwpAQCAtMTI0MiwxNCArMTEyNywxNCBAQAogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gcmFtcCBnYWluCi0gICAgICAgIGlmIChDQ19VTkxJS0VMWSh0LT52b2x1bWVJbmNbMF18dC0+dm9sdW1lSW5jWzFdKSkgewotICAgICAgICAgICAgaW50MzJfdCB2bCA9IHQtPnByZXZWb2x1bWVbMF07Ci0gICAgICAgICAgICBpbnQzMl90IHZyID0gdC0+cHJldlZvbHVtZVsxXTsKLSAgICAgICAgICAgIGNvbnN0IGludDMyX3QgdmxJbmMgPSB0LT52b2x1bWVJbmNbMF07Ci0gICAgICAgICAgICBjb25zdCBpbnQzMl90IHZySW5jID0gdC0+dm9sdW1lSW5jWzFdOworICAgICAgICBpZiAoQ0NfVU5MSUtFTFkodm9sdW1lSW5jWzBdfHZvbHVtZUluY1sxXSkpIHsKKyAgICAgICAgICAgIGludDMyX3QgdmwgPSBwcmV2Vm9sdW1lWzBdOworICAgICAgICAgICAgaW50MzJfdCB2ciA9IHByZXZWb2x1bWVbMV07CisgICAgICAgICAgICBjb25zdCBpbnQzMl90IHZsSW5jID0gdm9sdW1lSW5jWzBdOworICAgICAgICAgICAgY29uc3QgaW50MzJfdCB2ckluYyA9IHZvbHVtZUluY1sxXTsKIAogICAgICAgICAgICAgLy8gQUxPR0QoIlsxXSAlcDogaW5jPSVmLCB2MD0lZiwgdjE9JWQsIGZpbmFsPSVmLCBjb3VudD0lZCIsCi0gICAgICAgICAgICAvLyAgICAgICAgdCwgdmxJbmMvNjU1MzYuMGYsIHZsLzY1NTM2LjBmLCB0LT52b2x1bWVbMF0sCisgICAgICAgICAgICAvLyAgICAgICAgdCwgdmxJbmMvNjU1MzYuMGYsIHZsLzY1NTM2LjBmLCB2b2x1bWVbMF0sCiAgICAgICAgICAgICAvLyAgICAgICAgKHZsICsgdmxJbmMqZnJhbWVDb3VudCkvNjU1MzYuMGYsIGZyYW1lQ291bnQpOwogCiAgICAgICAgICAgICBkbyB7CkBAIC0xMjU5LDE0ICsxMTQ0LDE0IEBACiAgICAgICAgICAgICAgICAgdnIgKz0gdnJJbmM7CiAgICAgICAgICAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOwogCi0gICAgICAgICAgICB0LT5wcmV2Vm9sdW1lWzBdID0gdmw7Ci0gICAgICAgICAgICB0LT5wcmV2Vm9sdW1lWzFdID0gdnI7Ci0gICAgICAgICAgICB0LT5hZGp1c3RWb2x1bWVSYW1wKGZhbHNlKTsKKyAgICAgICAgICAgIHByZXZWb2x1bWVbMF0gPSB2bDsKKyAgICAgICAgICAgIHByZXZWb2x1bWVbMV0gPSB2cjsKKyAgICAgICAgICAgIGFkanVzdFZvbHVtZVJhbXAoZmFsc2UpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gY29uc3RhbnQgZ2FpbgogICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHZybCA9IHQtPnZvbHVtZVJMOworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgdnJsID0gdm9sdW1lUkw7CiAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgdWludDMyX3QgcmwgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCAqPihpbik7CiAgICAgICAgICAgICAgICAgaW4gKz0gMjsKQEAgLTEyNzYsMjcgKzExNjEsMjcgQEAKICAgICAgICAgICAgIH0gd2hpbGUgKC0tZnJhbWVDb3VudCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgdC0+aW4gPSBpbjsKKyAgICBtSW4gPSBpbjsKIH0KIAotdm9pZCBBdWRpb01peGVyOjp0cmFja19fMTZCaXRzTW9ubyh0cmFja190KiB0LCBpbnQzMl90KiBvdXQsIHNpemVfdCBmcmFtZUNvdW50LAotICAgICAgICBpbnQzMl90KiB0ZW1wIF9fdW51c2VkLCBpbnQzMl90KiBhdXgpCit2b2lkIEF1ZGlvTWl4ZXI6OlRyYWNrOjp0cmFja19fMTZCaXRzTW9ubygKKyAgICAgICAgaW50MzJfdCogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwgaW50MzJfdCogdGVtcCBfX3VudXNlZCwgaW50MzJfdCogYXV4KQogewogICAgIEFMT0dWVigidHJhY2tfXzE2Qml0c01vbm9cbiIpOwotICAgIGNvbnN0IGludDE2X3QgKmluID0gc3RhdGljX2Nhc3Q8aW50MTZfdCBjb25zdCAqPih0LT5pbik7CisgICAgY29uc3QgaW50MTZfdCAqaW4gPSBzdGF0aWNfY2FzdDxpbnQxNl90IGNvbnN0ICo+KG1Jbik7CiAKICAgICBpZiAoQ0NfVU5MSUtFTFkoYXV4ICE9IE5VTEwpKSB7CiAgICAgICAgIC8vIHJhbXAgZ2FpbgotICAgICAgICBpZiAoQ0NfVU5MSUtFTFkodC0+dm9sdW1lSW5jWzBdfHQtPnZvbHVtZUluY1sxXXx0LT5hdXhJbmMpKSB7Ci0gICAgICAgICAgICBpbnQzMl90IHZsID0gdC0+cHJldlZvbHVtZVswXTsKLSAgICAgICAgICAgIGludDMyX3QgdnIgPSB0LT5wcmV2Vm9sdW1lWzFdOwotICAgICAgICAgICAgaW50MzJfdCB2YSA9IHQtPnByZXZBdXhMZXZlbDsKLSAgICAgICAgICAgIGNvbnN0IGludDMyX3QgdmxJbmMgPSB0LT52b2x1bWVJbmNbMF07Ci0gICAgICAgICAgICBjb25zdCBpbnQzMl90IHZySW5jID0gdC0+dm9sdW1lSW5jWzFdOwotICAgICAgICAgICAgY29uc3QgaW50MzJfdCB2YUluYyA9IHQtPmF1eEluYzsKKyAgICAgICAgaWYgKENDX1VOTElLRUxZKHZvbHVtZUluY1swXXx2b2x1bWVJbmNbMV18YXV4SW5jKSkgeworICAgICAgICAgICAgaW50MzJfdCB2bCA9IHByZXZWb2x1bWVbMF07CisgICAgICAgICAgICBpbnQzMl90IHZyID0gcHJldlZvbHVtZVsxXTsKKyAgICAgICAgICAgIGludDMyX3QgdmEgPSBwcmV2QXV4TGV2ZWw7CisgICAgICAgICAgICBjb25zdCBpbnQzMl90IHZsSW5jID0gdm9sdW1lSW5jWzBdOworICAgICAgICAgICAgY29uc3QgaW50MzJfdCB2ckluYyA9IHZvbHVtZUluY1sxXTsKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgdmFJbmMgPSBhdXhJbmM7CiAKICAgICAgICAgICAgIC8vIEFMT0dEKCJbMl0gJXA6IGluYz0lZiwgdjA9JWYsIHYxPSVkLCBmaW5hbD0lZiwgY291bnQ9JWQiLAotICAgICAgICAgICAgLy8gICAgICAgICB0LCB2bEluYy82NTUzNi4wZiwgdmwvNjU1MzYuMGYsIHQtPnZvbHVtZVswXSwKKyAgICAgICAgICAgIC8vICAgICAgICAgdCwgdmxJbmMvNjU1MzYuMGYsIHZsLzY1NTM2LjBmLCB2b2x1bWVbMF0sCiAgICAgICAgICAgICAvLyAgICAgICAgICh2bCArIHZsSW5jKmZyYW1lQ291bnQpLzY1NTM2LjBmLCBmcmFtZUNvdW50KTsKIAogICAgICAgICAgICAgZG8gewpAQCAtMTMwOSwxNiArMTE5NCwxNiBAQAogICAgICAgICAgICAgICAgIHZhICs9IHZhSW5jOwogICAgICAgICAgICAgfSB3aGlsZSAoLS1mcmFtZUNvdW50KTsKIAotICAgICAgICAgICAgdC0+cHJldlZvbHVtZVswXSA9IHZsOwotICAgICAgICAgICAgdC0+cHJldlZvbHVtZVsxXSA9IHZyOwotICAgICAgICAgICAgdC0+cHJldkF1eExldmVsID0gdmE7Ci0gICAgICAgICAgICB0LT5hZGp1c3RWb2x1bWVSYW1wKHRydWUpOworICAgICAgICAgICAgcHJldlZvbHVtZVswXSA9IHZsOworICAgICAgICAgICAgcHJldlZvbHVtZVsxXSA9IHZyOworICAgICAgICAgICAgcHJldkF1eExldmVsID0gdmE7CisgICAgICAgICAgICBhZGp1c3RWb2x1bWVSYW1wKHRydWUpOwogICAgICAgICB9CiAgICAgICAgIC8vIGNvbnN0YW50IGdhaW4KICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBjb25zdCBpbnQxNl90IHZsID0gdC0+dm9sdW1lWzBdOwotICAgICAgICAgICAgY29uc3QgaW50MTZfdCB2ciA9IHQtPnZvbHVtZVsxXTsKLSAgICAgICAgICAgIGNvbnN0IGludDE2X3QgdmEgPSAoaW50MTZfdCl0LT5hdXhMZXZlbDsKKyAgICAgICAgICAgIGNvbnN0IGludDE2X3QgdmwgPSB2b2x1bWVbMF07CisgICAgICAgICAgICBjb25zdCBpbnQxNl90IHZyID0gdm9sdW1lWzFdOworICAgICAgICAgICAgY29uc3QgaW50MTZfdCB2YSA9IChpbnQxNl90KWF1eExldmVsOwogICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgIGludDE2X3QgbCA9ICppbisrOwogICAgICAgICAgICAgICAgIG91dFswXSA9IG11bEFkZChsLCB2bCwgb3V0WzBdKTsKQEAgLTEzMzAsMTQgKzEyMTUsMTQgQEAKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIHJhbXAgZ2FpbgotICAgICAgICBpZiAoQ0NfVU5MSUtFTFkodC0+dm9sdW1lSW5jWzBdfHQtPnZvbHVtZUluY1sxXSkpIHsKLSAgICAgICAgICAgIGludDMyX3QgdmwgPSB0LT5wcmV2Vm9sdW1lWzBdOwotICAgICAgICAgICAgaW50MzJfdCB2ciA9IHQtPnByZXZWb2x1bWVbMV07Ci0gICAgICAgICAgICBjb25zdCBpbnQzMl90IHZsSW5jID0gdC0+dm9sdW1lSW5jWzBdOwotICAgICAgICAgICAgY29uc3QgaW50MzJfdCB2ckluYyA9IHQtPnZvbHVtZUluY1sxXTsKKyAgICAgICAgaWYgKENDX1VOTElLRUxZKHZvbHVtZUluY1swXXx2b2x1bWVJbmNbMV0pKSB7CisgICAgICAgICAgICBpbnQzMl90IHZsID0gcHJldlZvbHVtZVswXTsKKyAgICAgICAgICAgIGludDMyX3QgdnIgPSBwcmV2Vm9sdW1lWzFdOworICAgICAgICAgICAgY29uc3QgaW50MzJfdCB2bEluYyA9IHZvbHVtZUluY1swXTsKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgdnJJbmMgPSB2b2x1bWVJbmNbMV07CiAKICAgICAgICAgICAgIC8vIEFMT0dEKCJbMl0gJXA6IGluYz0lZiwgdjA9JWYsIHYxPSVkLCBmaW5hbD0lZiwgY291bnQ9JWQiLAotICAgICAgICAgICAgLy8gICAgICAgICB0LCB2bEluYy82NTUzNi4wZiwgdmwvNjU1MzYuMGYsIHQtPnZvbHVtZVswXSwKKyAgICAgICAgICAgIC8vICAgICAgICAgdCwgdmxJbmMvNjU1MzYuMGYsIHZsLzY1NTM2LjBmLCB2b2x1bWVbMF0sCiAgICAgICAgICAgICAvLyAgICAgICAgICh2bCArIHZsSW5jKmZyYW1lQ291bnQpLzY1NTM2LjBmLCBmcmFtZUNvdW50KTsKIAogICAgICAgICAgICAgZG8gewpAQCAtMTM0OCwxNCArMTIzMywxNCBAQAogICAgICAgICAgICAgICAgIHZyICs9IHZySW5jOwogICAgICAgICAgICAgfSB3aGlsZSAoLS1mcmFtZUNvdW50KTsKIAotICAgICAgICAgICAgdC0+cHJldlZvbHVtZVswXSA9IHZsOwotICAgICAgICAgICAgdC0+cHJldlZvbHVtZVsxXSA9IHZyOwotICAgICAgICAgICAgdC0+YWRqdXN0Vm9sdW1lUmFtcChmYWxzZSk7CisgICAgICAgICAgICBwcmV2Vm9sdW1lWzBdID0gdmw7CisgICAgICAgICAgICBwcmV2Vm9sdW1lWzFdID0gdnI7CisgICAgICAgICAgICBhZGp1c3RWb2x1bWVSYW1wKGZhbHNlKTsKICAgICAgICAgfQogICAgICAgICAvLyBjb25zdGFudCBnYWluCiAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgY29uc3QgaW50MTZfdCB2bCA9IHQtPnZvbHVtZVswXTsKLSAgICAgICAgICAgIGNvbnN0IGludDE2X3QgdnIgPSB0LT52b2x1bWVbMV07CisgICAgICAgICAgICBjb25zdCBpbnQxNl90IHZsID0gdm9sdW1lWzBdOworICAgICAgICAgICAgY29uc3QgaW50MTZfdCB2ciA9IHZvbHVtZVsxXTsKICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICBpbnQxNl90IGwgPSAqaW4rKzsKICAgICAgICAgICAgICAgICBvdXRbMF0gPSBtdWxBZGQobCwgdmwsIG91dFswXSk7CkBAIC0xMzY0LDI3MyArMTI0OSwyMTMgQEAKICAgICAgICAgICAgIH0gd2hpbGUgKC0tZnJhbWVDb3VudCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgdC0+aW4gPSBpbjsKKyAgICBtSW4gPSBpbjsKIH0KIAogLy8gbm8tb3AgY2FzZQotdm9pZCBBdWRpb01peGVyOjpwcm9jZXNzX19ub3Aoc3RhdGVfdCogc3RhdGUpCit2b2lkIEF1ZGlvTWl4ZXI6OnByb2Nlc3NfX25vcCgpCiB7CiAgICAgQUxPR1ZWKCJwcm9jZXNzX19ub3BcbiIpOwotICAgIHVpbnQzMl90IGUwID0gc3RhdGUtPmVuYWJsZWRUcmFja3M7Ci0gICAgd2hpbGUgKGUwKSB7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnBhaXIgOiBtR3JvdXBzKSB7CiAgICAgICAgIC8vIHByb2Nlc3MgYnkgZ3JvdXAgb2YgdHJhY2tzIHdpdGggc2FtZSBvdXRwdXQgYnVmZmVyIHRvCiAgICAgICAgIC8vIGF2b2lkIG11bHRpcGxlIG1lbXNldCgpIG9uIHNhbWUgYnVmZmVyCi0gICAgICAgIHVpbnQzMl90IGUxID0gZTAsIGUyID0gZTA7Ci0gICAgICAgIGludCBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KGUxKTsKLSAgICAgICAgewotICAgICAgICAgICAgdHJhY2tfdCYgdDEgPSBzdGF0ZS0+dHJhY2tzW2ldOwotICAgICAgICAgICAgZTIgJj0gfigxPDxpKTsKLSAgICAgICAgICAgIHdoaWxlIChlMikgewotICAgICAgICAgICAgICAgIGkgPSAzMSAtIF9fYnVpbHRpbl9jbHooZTIpOwotICAgICAgICAgICAgICAgIGUyICY9IH4oMTw8aSk7Ci0gICAgICAgICAgICAgICAgdHJhY2tfdCYgdDIgPSBzdGF0ZS0+dHJhY2tzW2ldOwotICAgICAgICAgICAgICAgIGlmIChDQ19VTkxJS0VMWSh0Mi5tYWluQnVmZmVyICE9IHQxLm1haW5CdWZmZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGUxICY9IH4oMTw8aSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZTAgJj0gfihlMSk7CisgICAgICAgIGNvbnN0IGF1dG8gJmdyb3VwID0gcGFpci5zZWNvbmQ7CiAKLSAgICAgICAgICAgIG1lbXNldCh0MS5tYWluQnVmZmVyLCAwLCBzdGF0ZS0+ZnJhbWVDb3VudCAqIHQxLm1NaXhlckNoYW5uZWxDb3VudAotICAgICAgICAgICAgICAgICAgICAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUodDEubU1peGVyRm9ybWF0KSk7Ci0gICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYWNrPiAmdCA9IG1UcmFja3NbZ3JvdXBbMF1dOworICAgICAgICBtZW1zZXQodC0+bWFpbkJ1ZmZlciwgMCwKKyAgICAgICAgICAgICAgICBtRnJhbWVDb3VudCAqIHQtPm1NaXhlckNoYW5uZWxDb3VudAorICAgICAgICAgICAgICAgICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZSh0LT5tTWl4ZXJGb3JtYXQpKTsKIAotICAgICAgICB3aGlsZSAoZTEpIHsKLSAgICAgICAgICAgIGkgPSAzMSAtIF9fYnVpbHRpbl9jbHooZTEpOwotICAgICAgICAgICAgZTEgJj0gfigxPDxpKTsKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cmFja190JiB0MyA9IHN0YXRlLT50cmFja3NbaV07Ci0gICAgICAgICAgICAgICAgc2l6ZV90IG91dEZyYW1lcyA9IHN0YXRlLT5mcmFtZUNvdW50OwotICAgICAgICAgICAgICAgIHdoaWxlIChvdXRGcmFtZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgdDMuYnVmZmVyLmZyYW1lQ291bnQgPSBvdXRGcmFtZXM7Ci0gICAgICAgICAgICAgICAgICAgIHQzLmJ1ZmZlclByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZ0My5idWZmZXIpOwotICAgICAgICAgICAgICAgICAgICBpZiAodDMuYnVmZmVyLnJhdyA9PSBOVUxMKSBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgb3V0RnJhbWVzIC09IHQzLmJ1ZmZlci5mcmFtZUNvdW50OwotICAgICAgICAgICAgICAgICAgICB0My5idWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmdDMuYnVmZmVyKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIC8vIG5vdyBjb25zdW1lIGRhdGEKKyAgICAgICAgZm9yIChjb25zdCBpbnQgbmFtZSA6IGdyb3VwKSB7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VHJhY2s+ICZ0ID0gbVRyYWNrc1tuYW1lXTsKKyAgICAgICAgICAgIHNpemVfdCBvdXRGcmFtZXMgPSBtRnJhbWVDb3VudDsKKyAgICAgICAgICAgIHdoaWxlIChvdXRGcmFtZXMpIHsKKyAgICAgICAgICAgICAgICB0LT5idWZmZXIuZnJhbWVDb3VudCA9IG91dEZyYW1lczsKKyAgICAgICAgICAgICAgICB0LT5idWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmdC0+YnVmZmVyKTsKKyAgICAgICAgICAgICAgICBpZiAodC0+YnVmZmVyLnJhdyA9PSBOVUxMKSBicmVhazsKKyAgICAgICAgICAgICAgICBvdXRGcmFtZXMgLT0gdC0+YnVmZmVyLmZyYW1lQ291bnQ7CisgICAgICAgICAgICAgICAgdC0+YnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJnQtPmJ1ZmZlcik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CiAKIC8vIGdlbmVyaWMgY29kZSB3aXRob3V0IHJlc2FtcGxpbmcKLXZvaWQgQXVkaW9NaXhlcjo6cHJvY2Vzc19fZ2VuZXJpY05vUmVzYW1wbGluZyhzdGF0ZV90KiBzdGF0ZSkKK3ZvaWQgQXVkaW9NaXhlcjo6cHJvY2Vzc19fZ2VuZXJpY05vUmVzYW1wbGluZygpCiB7CiAgICAgQUxPR1ZWKCJwcm9jZXNzX19nZW5lcmljTm9SZXNhbXBsaW5nXG4iKTsKICAgICBpbnQzMl90IG91dFRlbXBbQkxPQ0tTSVpFICogTUFYX05VTV9DSEFOTkVMU10gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgzMikpKTsKIAotICAgIC8vIGFjcXVpcmUgZWFjaCB0cmFjaydzIGJ1ZmZlcgotICAgIHVpbnQzMl90IGVuYWJsZWRUcmFja3MgPSBzdGF0ZS0+ZW5hYmxlZFRyYWNrczsKLSAgICB1aW50MzJfdCBlMCA9IGVuYWJsZWRUcmFja3M7Ci0gICAgd2hpbGUgKGUwKSB7Ci0gICAgICAgIGNvbnN0IGludCBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KGUwKTsKLSAgICAgICAgZTAgJj0gfigxPDxpKTsKLSAgICAgICAgdHJhY2tfdCYgdCA9IHN0YXRlLT50cmFja3NbaV07Ci0gICAgICAgIHQuYnVmZmVyLmZyYW1lQ291bnQgPSBzdGF0ZS0+ZnJhbWVDb3VudDsKLSAgICAgICAgdC5idWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmdC5idWZmZXIpOwotICAgICAgICB0LmZyYW1lQ291bnQgPSB0LmJ1ZmZlci5mcmFtZUNvdW50OwotICAgICAgICB0LmluID0gdC5idWZmZXIucmF3OwotICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8gJnBhaXIgOiBtR3JvdXBzKSB7CisgICAgICAgIC8vIHByb2Nlc3MgYnkgZ3JvdXAgb2YgdHJhY2tzIHdpdGggc2FtZSBvdXRwdXQgbWFpbiBidWZmZXIgdG8KKyAgICAgICAgLy8gYXZvaWQgbXVsdGlwbGUgbWVtc2V0KCkgb24gc2FtZSBidWZmZXIKKyAgICAgICAgY29uc3QgYXV0byAmZ3JvdXAgPSBwYWlyLnNlY29uZDsKIAotICAgIGUwID0gZW5hYmxlZFRyYWNrczsKLSAgICB3aGlsZSAoZTApIHsKLSAgICAgICAgLy8gcHJvY2VzcyBieSBncm91cCBvZiB0cmFja3Mgd2l0aCBzYW1lIG91dHB1dCBidWZmZXIgdG8KLSAgICAgICAgLy8gb3B0aW1pemUgY2FjaGUgdXNlCi0gICAgICAgIHVpbnQzMl90IGUxID0gZTAsIGUyID0gZTA7Ci0gICAgICAgIGludCBqID0gMzEgLSBfX2J1aWx0aW5fY2x6KGUxKTsKLSAgICAgICAgdHJhY2tfdCYgdDEgPSBzdGF0ZS0+dHJhY2tzW2pdOwotICAgICAgICBlMiAmPSB+KDE8PGopOwotICAgICAgICB3aGlsZSAoZTIpIHsKLSAgICAgICAgICAgIGogPSAzMSAtIF9fYnVpbHRpbl9jbHooZTIpOwotICAgICAgICAgICAgZTIgJj0gfigxPDxqKTsKLSAgICAgICAgICAgIHRyYWNrX3QmIHQyID0gc3RhdGUtPnRyYWNrc1tqXTsKLSAgICAgICAgICAgIGlmIChDQ19VTkxJS0VMWSh0Mi5tYWluQnVmZmVyICE9IHQxLm1haW5CdWZmZXIpKSB7Ci0gICAgICAgICAgICAgICAgZTEgJj0gfigxPDxqKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgLy8gYWNxdWlyZSBidWZmZXIKKyAgICAgICAgZm9yIChjb25zdCBpbnQgbmFtZSA6IGdyb3VwKSB7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VHJhY2s+ICZ0ID0gbVRyYWNrc1tuYW1lXTsKKyAgICAgICAgICAgIHQtPmJ1ZmZlci5mcmFtZUNvdW50ID0gbUZyYW1lQ291bnQ7CisgICAgICAgICAgICB0LT5idWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmdC0+YnVmZmVyKTsKKyAgICAgICAgICAgIHQtPmZyYW1lQ291bnQgPSB0LT5idWZmZXIuZnJhbWVDb3VudDsKKyAgICAgICAgICAgIHQtPm1JbiA9IHQtPmJ1ZmZlci5yYXc7CiAgICAgICAgIH0KLSAgICAgICAgZTAgJj0gfihlMSk7Ci0gICAgICAgIC8vIHRoaXMgYXNzdW1lcyBvdXRwdXQgMTYgYml0cyBzdGVyZW8sIG5vIHJlc2FtcGxpbmcKLSAgICAgICAgaW50MzJfdCAqb3V0ID0gdDEubWFpbkJ1ZmZlcjsKKworICAgICAgICBpbnQzMl90ICpvdXQgPSAoaW50ICopcGFpci5maXJzdDsKICAgICAgICAgc2l6ZV90IG51bUZyYW1lcyA9IDA7CiAgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBmcmFtZUNvdW50ID0gc3RkOjptaW4oKHNpemVfdClCTE9DS1NJWkUsIG1GcmFtZUNvdW50IC0gbnVtRnJhbWVzKTsKICAgICAgICAgICAgIG1lbXNldChvdXRUZW1wLCAwLCBzaXplb2Yob3V0VGVtcCkpOwotICAgICAgICAgICAgZTIgPSBlMTsKLSAgICAgICAgICAgIHdoaWxlIChlMikgewotICAgICAgICAgICAgICAgIGNvbnN0IGludCBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KGUyKTsKLSAgICAgICAgICAgICAgICBlMiAmPSB+KDE8PGkpOwotICAgICAgICAgICAgICAgIHRyYWNrX3QmIHQgPSBzdGF0ZS0+dHJhY2tzW2ldOwotICAgICAgICAgICAgICAgIHNpemVfdCBvdXRGcmFtZXMgPSBCTE9DS1NJWkU7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGludCBuYW1lIDogZ3JvdXApIHsKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VHJhY2s+ICZ0ID0gbVRyYWNrc1tuYW1lXTsKICAgICAgICAgICAgICAgICBpbnQzMl90ICphdXggPSBOVUxMOwotICAgICAgICAgICAgICAgIGlmIChDQ19VTkxJS0VMWSh0Lm5lZWRzICYgTkVFRFNfQVVYKSkgewotICAgICAgICAgICAgICAgICAgICBhdXggPSB0LmF1eEJ1ZmZlciArIG51bUZyYW1lczsKKyAgICAgICAgICAgICAgICBpZiAoQ0NfVU5MSUtFTFkodC0+bmVlZHMgJiBORUVEU19BVVgpKSB7CisgICAgICAgICAgICAgICAgICAgIGF1eCA9IHQtPmF1eEJ1ZmZlciArIG51bUZyYW1lczsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgd2hpbGUgKG91dEZyYW1lcykgewotICAgICAgICAgICAgICAgICAgICAvLyB0LmluID09IE5VTEwgY2FuIGhhcHBlbiBpZiB0aGUgdHJhY2sgd2FzIGZsdXNoZWQganVzdCBhZnRlciBoYXZpbmcKKyAgICAgICAgICAgICAgICBmb3IgKGludCBvdXRGcmFtZXMgPSBmcmFtZUNvdW50OyBvdXRGcmFtZXMgPiAwOyApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdC0+aW4gPT0gbnVsbHB0ciBjYW4gaGFwcGVuIGlmIHRoZSB0cmFjayB3YXMgZmx1c2hlZCBqdXN0IGFmdGVyIGhhdmluZwogICAgICAgICAgICAgICAgICAgICAvLyBiZWVuIGVuYWJsZWQgZm9yIG1peGluZy4KLSAgICAgICAgICAgICAgICAgICBpZiAodC5pbiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkVHJhY2tzICY9IH4oMTw8aSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlMSAmPSB+KDE8PGkpOworICAgICAgICAgICAgICAgICAgICBpZiAodC0+bUluID09IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbkZyYW1lcyA9ICh0LmZyYW1lQ291bnQgPiBvdXRGcmFtZXMpP291dEZyYW1lczp0LmZyYW1lQ291bnQ7CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbkZyYW1lcyA9ICh0LT5mcmFtZUNvdW50ID4gb3V0RnJhbWVzKT9vdXRGcmFtZXM6dC0+ZnJhbWVDb3VudDsKICAgICAgICAgICAgICAgICAgICAgaWYgKGluRnJhbWVzID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdC5ob29rKCZ0LCBvdXRUZW1wICsgKEJMT0NLU0laRSAtIG91dEZyYW1lcykgKiB0Lm1NaXhlckNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5GcmFtZXMsIHN0YXRlLT5yZXNhbXBsZVRlbXAsIGF1eCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0LmZyYW1lQ291bnQgLT0gaW5GcmFtZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAodC5nZXQoKS0+KnQtPmhvb2spKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRUZW1wICsgKGZyYW1lQ291bnQgLSBvdXRGcmFtZXMpICogdC0+bU1peGVyQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZyYW1lcywgbVJlc2FtcGxlVGVtcC5nZXQoKSAvKiBuYWtlZCBwdHIgKi8sIGF1eCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0LT5mcmFtZUNvdW50IC09IGluRnJhbWVzOwogICAgICAgICAgICAgICAgICAgICAgICAgb3V0RnJhbWVzIC09IGluRnJhbWVzOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENDX1VOTElLRUxZKGF1eCAhPSBOVUxMKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1eCArPSBpbkZyYW1lczsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAodC5mcmFtZUNvdW50ID09IDAgJiYgb3V0RnJhbWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0LmJ1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZ0LmJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0LmJ1ZmZlci5mcmFtZUNvdW50ID0gKHN0YXRlLT5mcmFtZUNvdW50IC0gbnVtRnJhbWVzKSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCTE9DS1NJWkUgLSBvdXRGcmFtZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgdC5idWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmdC5idWZmZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgdC5pbiA9IHQuYnVmZmVyLnJhdzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LmluID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkVHJhY2tzICY9IH4oMTw8aSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZTEgJj0gfigxPDxpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHQtPmZyYW1lQ291bnQgPT0gMCAmJiBvdXRGcmFtZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHQtPmJ1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZ0LT5idWZmZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgdC0+YnVmZmVyLmZyYW1lQ291bnQgPSAobUZyYW1lQ291bnQgLSBudW1GcmFtZXMpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZyYW1lQ291bnQgLSBvdXRGcmFtZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgdC0+YnVmZmVyUHJvdmlkZXItPmdldE5leHRCdWZmZXIoJnQtPmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgICAgICB0LT5tSW4gPSB0LT5idWZmZXIucmF3OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQtPm1JbiA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB0LmZyYW1lQ291bnQgPSB0LmJ1ZmZlci5mcmFtZUNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgdC0+ZnJhbWVDb3VudCA9IHQtPmJ1ZmZlci5mcmFtZUNvdW50OwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBjb252ZXJ0TWl4ZXJGb3JtYXQob3V0LCB0MS5tTWl4ZXJGb3JtYXQsIG91dFRlbXAsIHQxLm1NaXhlckluRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICBCTE9DS1NJWkUgKiB0MS5tTWl4ZXJDaGFubmVsQ291bnQpOworICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYWNrPiAmdDEgPSBtVHJhY2tzW2dyb3VwWzBdXTsKKyAgICAgICAgICAgIGNvbnZlcnRNaXhlckZvcm1hdChvdXQsIHQxLT5tTWl4ZXJGb3JtYXQsIG91dFRlbXAsIHQxLT5tTWl4ZXJJbkZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCAqIHQxLT5tTWl4ZXJDaGFubmVsQ291bnQpOwogICAgICAgICAgICAgLy8gVE9ETzogZml4IHVnbHkgY2FzdGluZyBkdWUgdG8gY2hvaWNlIG9mIG91dCBwb2ludGVyIHR5cGUKICAgICAgICAgICAgIG91dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50MzJfdCo+KCh1aW50OF90KilvdXQKLSAgICAgICAgICAgICAgICAgICAgKyBCTE9DS1NJWkUgKiB0MS5tTWl4ZXJDaGFubmVsQ291bnQKLSAgICAgICAgICAgICAgICAgICAgICAgICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZSh0MS5tTWl4ZXJGb3JtYXQpKTsKLSAgICAgICAgICAgIG51bUZyYW1lcyArPSBCTE9DS1NJWkU7Ci0gICAgICAgIH0gd2hpbGUgKG51bUZyYW1lcyA8IHN0YXRlLT5mcmFtZUNvdW50KTsKLSAgICB9CisgICAgICAgICAgICAgICAgICAgICsgZnJhbWVDb3VudCAqIHQxLT5tTWl4ZXJDaGFubmVsQ291bnQKKyAgICAgICAgICAgICAgICAgICAgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKHQxLT5tTWl4ZXJGb3JtYXQpKTsKKyAgICAgICAgICAgIG51bUZyYW1lcyArPSBmcmFtZUNvdW50OworICAgICAgICB9IHdoaWxlIChudW1GcmFtZXMgPCBtRnJhbWVDb3VudCk7CiAKLSAgICAvLyByZWxlYXNlIGVhY2ggdHJhY2sncyBidWZmZXIKLSAgICBlMCA9IGVuYWJsZWRUcmFja3M7Ci0gICAgd2hpbGUgKGUwKSB7Ci0gICAgICAgIGNvbnN0IGludCBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KGUwKTsKLSAgICAgICAgZTAgJj0gfigxPDxpKTsKLSAgICAgICAgdHJhY2tfdCYgdCA9IHN0YXRlLT50cmFja3NbaV07Ci0gICAgICAgIHQuYnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJnQuYnVmZmVyKTsKKyAgICAgICAgLy8gcmVsZWFzZSBlYWNoIHRyYWNrJ3MgYnVmZmVyCisgICAgICAgIGZvciAoY29uc3QgaW50IG5hbWUgOiBncm91cCkgeworICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYWNrPiAmdCA9IG1UcmFja3NbbmFtZV07CisgICAgICAgICAgICB0LT5idWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmdC0+YnVmZmVyKTsKKyAgICAgICAgfQogICAgIH0KIH0KIAotCiAvLyBnZW5lcmljIGNvZGUgd2l0aCByZXNhbXBsaW5nCi12b2lkIEF1ZGlvTWl4ZXI6OnByb2Nlc3NfX2dlbmVyaWNSZXNhbXBsaW5nKHN0YXRlX3QqIHN0YXRlKQordm9pZCBBdWRpb01peGVyOjpwcm9jZXNzX19nZW5lcmljUmVzYW1wbGluZygpCiB7CiAgICAgQUxPR1ZWKCJwcm9jZXNzX19nZW5lcmljUmVzYW1wbGluZ1xuIik7Ci0gICAgLy8gdGhpcyBjb25zdCBqdXN0IG1lYW5zIHRoYXQgbG9jYWwgdmFyaWFibGUgb3V0VGVtcCBkb2Vzbid0IGNoYW5nZQotICAgIGludDMyX3QqIGNvbnN0IG91dFRlbXAgPSBzdGF0ZS0+b3V0cHV0VGVtcDsKLSAgICBzaXplX3QgbnVtRnJhbWVzID0gc3RhdGUtPmZyYW1lQ291bnQ7CisgICAgaW50MzJfdCAqIGNvbnN0IG91dFRlbXAgPSBtT3V0cHV0VGVtcC5nZXQoKTsgLy8gbmFrZWQgcHRyCisgICAgc2l6ZV90IG51bUZyYW1lcyA9IG1GcmFtZUNvdW50OwogCi0gICAgdWludDMyX3QgZTAgPSBzdGF0ZS0+ZW5hYmxlZFRyYWNrczsKLSAgICB3aGlsZSAoZTApIHsKLSAgICAgICAgLy8gcHJvY2VzcyBieSBncm91cCBvZiB0cmFja3Mgd2l0aCBzYW1lIG91dHB1dCBidWZmZXIKLSAgICAgICAgLy8gdG8gb3B0aW1pemUgY2FjaGUgdXNlCi0gICAgICAgIHVpbnQzMl90IGUxID0gZTAsIGUyID0gZTA7Ci0gICAgICAgIGludCBqID0gMzEgLSBfX2J1aWx0aW5fY2x6KGUxKTsKLSAgICAgICAgdHJhY2tfdCYgdDEgPSBzdGF0ZS0+dHJhY2tzW2pdOwotICAgICAgICBlMiAmPSB+KDE8PGopOwotICAgICAgICB3aGlsZSAoZTIpIHsKLSAgICAgICAgICAgIGogPSAzMSAtIF9fYnVpbHRpbl9jbHooZTIpOwotICAgICAgICAgICAgZTIgJj0gfigxPDxqKTsKLSAgICAgICAgICAgIHRyYWNrX3QmIHQyID0gc3RhdGUtPnRyYWNrc1tqXTsKLSAgICAgICAgICAgIGlmIChDQ19VTkxJS0VMWSh0Mi5tYWluQnVmZmVyICE9IHQxLm1haW5CdWZmZXIpKSB7Ci0gICAgICAgICAgICAgICAgZTEgJj0gfigxPDxqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlMCAmPSB+KGUxKTsKLSAgICAgICAgaW50MzJfdCAqb3V0ID0gdDEubWFpbkJ1ZmZlcjsKLSAgICAgICAgbWVtc2V0KG91dFRlbXAsIDAsIHNpemVvZigqb3V0VGVtcCkgKiB0MS5tTWl4ZXJDaGFubmVsQ291bnQgKiBzdGF0ZS0+ZnJhbWVDb3VudCk7Ci0gICAgICAgIHdoaWxlIChlMSkgewotICAgICAgICAgICAgY29uc3QgaW50IGkgPSAzMSAtIF9fYnVpbHRpbl9jbHooZTEpOwotICAgICAgICAgICAgZTEgJj0gfigxPDxpKTsKLSAgICAgICAgICAgIHRyYWNrX3QmIHQgPSBzdGF0ZS0+dHJhY2tzW2ldOworICAgIGZvciAoY29uc3QgYXV0byAmcGFpciA6IG1Hcm91cHMpIHsKKyAgICAgICAgY29uc3QgYXV0byAmZ3JvdXAgPSBwYWlyLnNlY29uZDsKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYWNrPiAmdDEgPSBtVHJhY2tzW2dyb3VwWzBdXTsKKworICAgICAgICAvLyBjbGVhciB0ZW1wIGJ1ZmZlcgorICAgICAgICBtZW1zZXQob3V0VGVtcCwgMCwgc2l6ZW9mKCpvdXRUZW1wKSAqIHQxLT5tTWl4ZXJDaGFubmVsQ291bnQgKiBtRnJhbWVDb3VudCk7CisgICAgICAgIGZvciAoY29uc3QgaW50IG5hbWUgOiBncm91cCkgeworICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYWNrPiAmdCA9IG1UcmFja3NbbmFtZV07CiAgICAgICAgICAgICBpbnQzMl90ICphdXggPSBOVUxMOwotICAgICAgICAgICAgaWYgKENDX1VOTElLRUxZKHQubmVlZHMgJiBORUVEU19BVVgpKSB7Ci0gICAgICAgICAgICAgICAgYXV4ID0gdC5hdXhCdWZmZXI7CisgICAgICAgICAgICBpZiAoQ0NfVU5MSUtFTFkodC0+bmVlZHMgJiBORUVEU19BVVgpKSB7CisgICAgICAgICAgICAgICAgYXV4ID0gdC0+YXV4QnVmZmVyOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyB0aGlzIGlzIGEgbGl0dGxlIGdvb2Z5LCBvbiB0aGUgcmVzYW1wbGluZyBjYXNlIHdlIGRvbid0CiAgICAgICAgICAgICAvLyBhY3F1aXJlL3JlbGVhc2UgdGhlIGJ1ZmZlcnMgYmVjYXVzZSBpdCdzIGRvbmUgYnkKICAgICAgICAgICAgIC8vIHRoZSByZXNhbXBsZXIuCi0gICAgICAgICAgICBpZiAodC5uZWVkcyAmIE5FRURTX1JFU0FNUExFKSB7Ci0gICAgICAgICAgICAgICAgdC5ob29rKCZ0LCBvdXRUZW1wLCBudW1GcmFtZXMsIHN0YXRlLT5yZXNhbXBsZVRlbXAsIGF1eCk7CisgICAgICAgICAgICBpZiAodC0+bmVlZHMgJiBORUVEU19SRVNBTVBMRSkgeworICAgICAgICAgICAgICAgICh0LmdldCgpLT4qdC0+aG9vaykob3V0VGVtcCwgbnVtRnJhbWVzLCBtUmVzYW1wbGVUZW1wLmdldCgpIC8qIG5ha2VkIHB0ciAqLywgYXV4KTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAKICAgICAgICAgICAgICAgICBzaXplX3Qgb3V0RnJhbWVzID0gMDsKIAogICAgICAgICAgICAgICAgIHdoaWxlIChvdXRGcmFtZXMgPCBudW1GcmFtZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgdC5idWZmZXIuZnJhbWVDb3VudCA9IG51bUZyYW1lcyAtIG91dEZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgdC5idWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmdC5idWZmZXIpOwotICAgICAgICAgICAgICAgICAgICB0LmluID0gdC5idWZmZXIucmF3OwotICAgICAgICAgICAgICAgICAgICAvLyB0LmluID09IE5VTEwgY2FuIGhhcHBlbiBpZiB0aGUgdHJhY2sgd2FzIGZsdXNoZWQganVzdCBhZnRlciBoYXZpbmcKKyAgICAgICAgICAgICAgICAgICAgdC0+YnVmZmVyLmZyYW1lQ291bnQgPSBudW1GcmFtZXMgLSBvdXRGcmFtZXM7CisgICAgICAgICAgICAgICAgICAgIHQtPmJ1ZmZlclByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZ0LT5idWZmZXIpOworICAgICAgICAgICAgICAgICAgICB0LT5tSW4gPSB0LT5idWZmZXIucmF3OworICAgICAgICAgICAgICAgICAgICAvLyB0LT5tSW4gPT0gbnVsbHB0ciBjYW4gaGFwcGVuIGlmIHRoZSB0cmFjayB3YXMgZmx1c2hlZCBqdXN0IGFmdGVyIGhhdmluZwogICAgICAgICAgICAgICAgICAgICAvLyBiZWVuIGVuYWJsZWQgZm9yIG1peGluZy4KLSAgICAgICAgICAgICAgICAgICAgaWYgKHQuaW4gPT0gTlVMTCkgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGlmICh0LT5tSW4gPT0gbnVsbHB0cikgYnJlYWs7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKENDX1VOTElLRUxZKGF1eCAhPSBOVUxMKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXV4ICs9IG91dEZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0Lmhvb2soJnQsIG91dFRlbXAgKyBvdXRGcmFtZXMgKiB0Lm1NaXhlckNoYW5uZWxDb3VudCwgdC5idWZmZXIuZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+cmVzYW1wbGVUZW1wLCBhdXgpOwotICAgICAgICAgICAgICAgICAgICBvdXRGcmFtZXMgKz0gdC5idWZmZXIuZnJhbWVDb3VudDsKLSAgICAgICAgICAgICAgICAgICAgdC5idWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmdC5idWZmZXIpOworICAgICAgICAgICAgICAgICAgICAodC5nZXQoKS0+KnQtPmhvb2spKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dFRlbXAgKyBvdXRGcmFtZXMgKiB0LT5tTWl4ZXJDaGFubmVsQ291bnQsIHQtPmJ1ZmZlci5mcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNhbXBsZVRlbXAuZ2V0KCkgLyogbmFrZWQgcHRyICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1eCAhPSBudWxscHRyID8gYXV4ICsgb3V0RnJhbWVzIDogbnVsbHB0cik7CisgICAgICAgICAgICAgICAgICAgIG91dEZyYW1lcyArPSB0LT5idWZmZXIuZnJhbWVDb3VudDsKKworICAgICAgICAgICAgICAgICAgICB0LT5idWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmdC0+YnVmZmVyKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgY29udmVydE1peGVyRm9ybWF0KG91dCwgdDEubU1peGVyRm9ybWF0LAotICAgICAgICAgICAgICAgIG91dFRlbXAsIHQxLm1NaXhlckluRm9ybWF0LCBudW1GcmFtZXMgKiB0MS5tTWl4ZXJDaGFubmVsQ291bnQpOworICAgICAgICBjb252ZXJ0TWl4ZXJGb3JtYXQodDEtPm1haW5CdWZmZXIsIHQxLT5tTWl4ZXJGb3JtYXQsCisgICAgICAgICAgICAgICAgb3V0VGVtcCwgdDEtPm1NaXhlckluRm9ybWF0LCBudW1GcmFtZXMgKiB0MS0+bU1peGVyQ2hhbm5lbENvdW50KTsKICAgICB9CiB9CiAKIC8vIG9uZSB0cmFjaywgMTYgYml0cyBzdGVyZW8gd2l0aG91dCByZXNhbXBsaW5nIGlzIHRoZSBtb3N0IGNvbW1vbiBjYXNlCi12b2lkIEF1ZGlvTWl4ZXI6OnByb2Nlc3NfX09uZVRyYWNrMTZCaXRzU3RlcmVvTm9SZXNhbXBsaW5nKHN0YXRlX3QqIHN0YXRlKQordm9pZCBBdWRpb01peGVyOjpwcm9jZXNzX19vbmVUcmFjazE2Qml0c1N0ZXJlb05vUmVzYW1wbGluZygpCiB7Ci0gICAgQUxPR1ZWKCJwcm9jZXNzX19PbmVUcmFjazE2Qml0c1N0ZXJlb05vUmVzYW1wbGluZ1xuIik7Ci0gICAgLy8gVGhpcyBtZXRob2QgaXMgb25seSBjYWxsZWQgd2hlbiBzdGF0ZS0+ZW5hYmxlZFRyYWNrcyBoYXMgZXhhY3RseQotICAgIC8vIG9uZSBiaXQgc2V0LiAgVGhlIGFzc2VydHMgYmVsb3cgd291bGQgdmVyaWZ5IHRoaXMsIGJ1dCBhcmUgY29tbWVudGVkIG91dAotICAgIC8vIHNpbmNlIHRoZSB3aG9sZSBwb2ludCBvZiB0aGlzIG1ldGhvZCBpcyB0byBvcHRpbWl6ZSBwZXJmb3JtYW5jZS4KLSAgICAvL0FMT0dfQVNTRVJUKDAgIT0gc3RhdGUtPmVuYWJsZWRUcmFja3MsICJubyB0cmFja3MgZW5hYmxlZCIpOwotICAgIGNvbnN0IGludCBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KHN0YXRlLT5lbmFibGVkVHJhY2tzKTsKLSAgICAvL0FMT0dfQVNTRVJUKCgxIDw8IGkpID09IHN0YXRlLT5lbmFibGVkVHJhY2tzLCAibW9yZSB0aGFuIDEgdHJhY2sgZW5hYmxlZCIpOwotICAgIGNvbnN0IHRyYWNrX3QmIHQgPSBzdGF0ZS0+dHJhY2tzW2ldOworICAgIEFMT0dWVigicHJvY2Vzc19fb25lVHJhY2sxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxpbmdcbiIpOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYobUVuYWJsZWQuc2l6ZSgpICE9IDAsCisgICAgICAgICAgICAiJXp1ICE9IDEgdHJhY2tzIGVuYWJsZWQiLCBtRW5hYmxlZC5zaXplKCkpOworICAgIGNvbnN0IGludCBuYW1lID0gbUVuYWJsZWRbMF07CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYWNrPiAmdCA9IG1UcmFja3NbbmFtZV07CiAKLSAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXImIGIodC5idWZmZXIpOworICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciYgYih0LT5idWZmZXIpOwogCi0gICAgaW50MzJfdCogb3V0ID0gdC5tYWluQnVmZmVyOworICAgIGludDMyX3QqIG91dCA9IHQtPm1haW5CdWZmZXI7CiAgICAgZmxvYXQgKmZvdXQgPSByZWludGVycHJldF9jYXN0PGZsb2F0Kj4ob3V0KTsKLSAgICBzaXplX3QgbnVtRnJhbWVzID0gc3RhdGUtPmZyYW1lQ291bnQ7CisgICAgc2l6ZV90IG51bUZyYW1lcyA9IG1GcmFtZUNvdW50OwogCi0gICAgY29uc3QgaW50MTZfdCB2bCA9IHQudm9sdW1lWzBdOwotICAgIGNvbnN0IGludDE2X3QgdnIgPSB0LnZvbHVtZVsxXTsKLSAgICBjb25zdCB1aW50MzJfdCB2cmwgPSB0LnZvbHVtZVJMOworICAgIGNvbnN0IGludDE2X3QgdmwgPSB0LT52b2x1bWVbMF07CisgICAgY29uc3QgaW50MTZfdCB2ciA9IHQtPnZvbHVtZVsxXTsKKyAgICBjb25zdCB1aW50MzJfdCB2cmwgPSB0LT52b2x1bWVSTDsKICAgICB3aGlsZSAobnVtRnJhbWVzKSB7CiAgICAgICAgIGIuZnJhbWVDb3VudCA9IG51bUZyYW1lczsKLSAgICAgICAgdC5idWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmYik7CisgICAgICAgIHQtPmJ1ZmZlclByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZiKTsKICAgICAgICAgY29uc3QgaW50MTZfdCAqaW4gPSBiLmkxNjsKIAogICAgICAgICAvLyBpbiA9PSBOVUxMIGNhbiBoYXBwZW4gaWYgdGhlIHRyYWNrIHdhcyBmbHVzaGVkIGp1c3QgYWZ0ZXIgaGF2aW5nCiAgICAgICAgIC8vIGJlZW4gZW5hYmxlZCBmb3IgbWl4aW5nLgogICAgICAgICBpZiAoaW4gPT0gTlVMTCB8fCAoKCh1aW50cHRyX3QpaW4pICYgMykpIHsKLSAgICAgICAgICAgIGlmICggQVVESU9fRk9STUFUX1BDTV9GTE9BVCA9PSB0Lm1NaXhlckZvcm1hdCApIHsKKyAgICAgICAgICAgIGlmICggQVVESU9fRk9STUFUX1BDTV9GTE9BVCA9PSB0LT5tTWl4ZXJGb3JtYXQgKSB7CiAgICAgICAgICAgICAgICAgIG1lbXNldCgoY2hhciopZm91dCwgMCwgbnVtRnJhbWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiB0Lm1NaXhlckNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUodC5tTWl4ZXJGb3JtYXQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHQtPm1NaXhlckNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUodC0+bU1peGVyRm9ybWF0KSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBtZW1zZXQoKGNoYXIqKW91dCwgMCwgbnVtRnJhbWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiB0Lm1NaXhlckNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUodC5tTWl4ZXJGb3JtYXQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHQtPm1NaXhlckNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUodC0+bU1peGVyRm9ybWF0KSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBBTE9HRV9JRigoKCh1aW50cHRyX3QpaW4pICYgMyksCi0gICAgICAgICAgICAgICAgICAgICJwcm9jZXNzX19PbmVUcmFjazE2Qml0c1N0ZXJlb05vUmVzYW1wbGluZzogbWlzYWxpZ25lZCBidWZmZXIiCisgICAgICAgICAgICAgICAgICAgICJwcm9jZXNzX19vbmVUcmFjazE2Qml0c1N0ZXJlb05vUmVzYW1wbGluZzogbWlzYWxpZ25lZCBidWZmZXIiCiAgICAgICAgICAgICAgICAgICAgICIgJXAgdHJhY2sgJWQsIGNoYW5uZWxzICVkLCBuZWVkcyAlMDh4LCB2b2x1bWUgJTA4eCB2ZmwgJWYgdmZyICVmIiwKLSAgICAgICAgICAgICAgICAgICAgaW4sIGksIHQuY2hhbm5lbENvdW50LCB0Lm5lZWRzLCB2cmwsIHQubVZvbHVtZVswXSwgdC5tVm9sdW1lWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgaW4sIG5hbWUsIHQtPmNoYW5uZWxDb3VudCwgdC0+bmVlZHMsIHZybCwgdC0+bVZvbHVtZVswXSwgdC0+bVZvbHVtZVsxXSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgc2l6ZV90IG91dEZyYW1lcyA9IGIuZnJhbWVDb3VudDsKIAotICAgICAgICBzd2l0Y2ggKHQubU1peGVyRm9ybWF0KSB7CisgICAgICAgIHN3aXRjaCAodC0+bU1peGVyRm9ybWF0KSB7CiAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICB1aW50MzJfdCBybCA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90ICo+KGluKTsKQEAgLTE2NjgsMTAgKzE0OTMsMTAgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiYmFkIG1peGVyIGZvcm1hdDogJWQiLCB0Lm1NaXhlckZvcm1hdCk7CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJiYWQgbWl4ZXIgZm9ybWF0OiAlZCIsIHQtPm1NaXhlckZvcm1hdCk7CiAgICAgICAgIH0KICAgICAgICAgbnVtRnJhbWVzIC09IGIuZnJhbWVDb3VudDsKLSAgICAgICAgdC5idWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmYik7CisgICAgICAgIHQtPmJ1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZiKTsKICAgICB9CiB9CiAKQEAgLTE2OTQsNyArMTUxOSw3IEBACiAvKiBNSVhUWVBFICAgICAoc2VlIEF1ZGlvTWl4ZXJPcHMuaCBNSVhUWVBFXyogZW51bWVyYXRpb24pCiAgKiBUTzogaW50MzJfdCAoUTQuMjcpIG9yIGZsb2F0CiAgKiBUSTogaW50MzJfdCAoUTQuMjcpIG9yIGludDE2X3QgKFEwLjE1KSBvciBmbG9hdAotICogVEE6IGludDMyX3QgKFE0LjI3KQorICogVEE6IGludDMyX3QgKFE0LjI3KSBvciBmbG9hdAogICovCiB0ZW1wbGF0ZSA8aW50IE1JWFRZUEUsCiAgICAgICAgIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVFYsIHR5cGVuYW1lIFRBLCB0eXBlbmFtZSBUQVY+CkBAIC0xNzM4LDcgKzE1NjMsNyBAQAogLyogTUlYVFlQRSAgICAgKHNlZSBBdWRpb01peGVyT3BzLmggTUlYVFlQRV8qIGVudW1lcmF0aW9uKQogICogVE86IGludDMyX3QgKFE0LjI3KSBvciBmbG9hdAogICogVEk6IGludDMyX3QgKFE0LjI3KSBvciBpbnQxNl90IChRMC4xNSkgb3IgZmxvYXQKLSAqIFRBOiBpbnQzMl90IChRNC4yNykKKyAqIFRBOiBpbnQzMl90IChRNC4yNykgb3IgZmxvYXQKICAqLwogdGVtcGxhdGUgPGludCBNSVhUWVBFLAogICAgICAgICB0eXBlbmFtZSBUTywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRWLCB0eXBlbmFtZSBUQSwgdHlwZW5hbWUgVEFWPgpAQCAtMTc3OCwzNCArMTYwMyw0NiBAQAogICogQURKVVNUVk9MICAgKHNldCB0byB0cnVlIGlmIHZvbHVtZSByYW1wIHBhcmFtZXRlcnMgbmVlZHMgYWRqdXN0bWVudCBhZnRlcndhcmRzKQogICogVE86IGludDMyX3QgKFE0LjI3KSBvciBmbG9hdAogICogVEk6IGludDMyX3QgKFE0LjI3KSBvciBpbnQxNl90IChRMC4xNSkgb3IgZmxvYXQKLSAqIFRBOiBpbnQzMl90IChRNC4yNykKKyAqIFRBOiBpbnQzMl90IChRNC4yNykgb3IgZmxvYXQKICAqLwogdGVtcGxhdGUgPGludCBNSVhUWVBFLCBib29sIFVTRUZMT0FUVk9MLCBib29sIEFESlVTVFZPTCwKICAgICB0eXBlbmFtZSBUTywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRBPgotdm9pZCBBdWRpb01peGVyOjp2b2x1bWVNaXgoVE8gKm91dCwgc2l6ZV90IG91dEZyYW1lcywKLSAgICAgICAgY29uc3QgVEkgKmluLCBUQSAqYXV4LCBib29sIHJhbXAsIEF1ZGlvTWl4ZXI6OnRyYWNrX3QgKnQpCit2b2lkIEF1ZGlvTWl4ZXI6OlRyYWNrOjp2b2x1bWVNaXgoVE8gKm91dCwgc2l6ZV90IG91dEZyYW1lcywKKyAgICAgICAgY29uc3QgVEkgKmluLCBUQSAqYXV4LCBib29sIHJhbXApCiB7CiAgICAgaWYgKFVTRUZMT0FUVk9MKSB7CiAgICAgICAgIGlmIChyYW1wKSB7Ci0gICAgICAgICAgICB2b2x1bWVSYW1wTXVsdGk8TUlYVFlQRT4odC0+bU1peGVyQ2hhbm5lbENvdW50LCBvdXQsIG91dEZyYW1lcywgaW4sIGF1eCwKLSAgICAgICAgICAgICAgICAgICAgdC0+bVByZXZWb2x1bWUsIHQtPm1Wb2x1bWVJbmMsICZ0LT5wcmV2QXV4TGV2ZWwsIHQtPmF1eEluYyk7CisgICAgICAgICAgICB2b2x1bWVSYW1wTXVsdGk8TUlYVFlQRT4obU1peGVyQ2hhbm5lbENvdW50LCBvdXQsIG91dEZyYW1lcywgaW4sIGF1eCwKKyAgICAgICAgICAgICAgICAgICAgbVByZXZWb2x1bWUsIG1Wb2x1bWVJbmMsCisjaWZkZWYgRkxPQVRfQVVYCisgICAgICAgICAgICAgICAgICAgICZtUHJldkF1eExldmVsLCBtQXV4SW5jCisjZWxzZQorICAgICAgICAgICAgICAgICAgICAmcHJldkF1eExldmVsLCBhdXhJbmMKKyNlbmRpZgorICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICBpZiAoQURKVVNUVk9MKSB7Ci0gICAgICAgICAgICAgICAgdC0+YWRqdXN0Vm9sdW1lUmFtcChhdXggIT0gTlVMTCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgYWRqdXN0Vm9sdW1lUmFtcChhdXggIT0gTlVMTCwgdHJ1ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2b2x1bWVNdWx0aTxNSVhUWVBFPih0LT5tTWl4ZXJDaGFubmVsQ291bnQsIG91dCwgb3V0RnJhbWVzLCBpbiwgYXV4LAotICAgICAgICAgICAgICAgICAgICB0LT5tVm9sdW1lLCB0LT5hdXhMZXZlbCk7CisgICAgICAgICAgICB2b2x1bWVNdWx0aTxNSVhUWVBFPihtTWl4ZXJDaGFubmVsQ291bnQsIG91dCwgb3V0RnJhbWVzLCBpbiwgYXV4LAorICAgICAgICAgICAgICAgICAgICBtVm9sdW1lLAorI2lmZGVmIEZMT0FUX0FVWAorICAgICAgICAgICAgICAgICAgICBtQXV4TGV2ZWwKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIGF1eExldmVsCisjZW5kaWYKKyAgICAgICAgICAgICk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBpZiAocmFtcCkgewotICAgICAgICAgICAgdm9sdW1lUmFtcE11bHRpPE1JWFRZUEU+KHQtPm1NaXhlckNoYW5uZWxDb3VudCwgb3V0LCBvdXRGcmFtZXMsIGluLCBhdXgsCi0gICAgICAgICAgICAgICAgICAgIHQtPnByZXZWb2x1bWUsIHQtPnZvbHVtZUluYywgJnQtPnByZXZBdXhMZXZlbCwgdC0+YXV4SW5jKTsKKyAgICAgICAgICAgIHZvbHVtZVJhbXBNdWx0aTxNSVhUWVBFPihtTWl4ZXJDaGFubmVsQ291bnQsIG91dCwgb3V0RnJhbWVzLCBpbiwgYXV4LAorICAgICAgICAgICAgICAgICAgICBwcmV2Vm9sdW1lLCB2b2x1bWVJbmMsICZwcmV2QXV4TGV2ZWwsIGF1eEluYyk7CiAgICAgICAgICAgICBpZiAoQURKVVNUVk9MKSB7Ci0gICAgICAgICAgICAgICAgdC0+YWRqdXN0Vm9sdW1lUmFtcChhdXggIT0gTlVMTCk7CisgICAgICAgICAgICAgICAgYWRqdXN0Vm9sdW1lUmFtcChhdXggIT0gTlVMTCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2b2x1bWVNdWx0aTxNSVhUWVBFPih0LT5tTWl4ZXJDaGFubmVsQ291bnQsIG91dCwgb3V0RnJhbWVzLCBpbiwgYXV4LAotICAgICAgICAgICAgICAgICAgICB0LT52b2x1bWUsIHQtPmF1eExldmVsKTsKKyAgICAgICAgICAgIHZvbHVtZU11bHRpPE1JWFRZUEU+KG1NaXhlckNoYW5uZWxDb3VudCwgb3V0LCBvdXRGcmFtZXMsIGluLCBhdXgsCisgICAgICAgICAgICAgICAgICAgIHZvbHVtZSwgYXV4TGV2ZWwpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtMTgyMCwxOSArMTY1NywxOCBAQAogICogVEE6IGludDMyX3QgKFE0LjI3KQogICovCiB0ZW1wbGF0ZSA8aW50IE1JWFRZUEUsIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVEE+Ci12b2lkIEF1ZGlvTWl4ZXI6OnByb2Nlc3NfTm9SZXNhbXBsZU9uZVRyYWNrKHN0YXRlX3QqIHN0YXRlKQordm9pZCBBdWRpb01peGVyOjpwcm9jZXNzX19ub1Jlc2FtcGxlT25lVHJhY2soKQogewotICAgIEFMT0dWVigicHJvY2Vzc19Ob1Jlc2FtcGxlT25lVHJhY2tcbiIpOwotICAgIC8vIENMWiBpcyBmYXN0ZXIgdGhhbiBDVFogb24gQVJNLCB0aG91Z2ggcmVhbGx5IG5vdCBzdXJlIGlmIHRydWUgYWZ0ZXIgMzEgLSBjbHouCi0gICAgY29uc3QgaW50IGkgPSAzMSAtIF9fYnVpbHRpbl9jbHooc3RhdGUtPmVuYWJsZWRUcmFja3MpOwotICAgIEFMT0dfQVNTRVJUKCgxIDw8IGkpID09IHN0YXRlLT5lbmFibGVkVHJhY2tzLCAibW9yZSB0aGFuIDEgdHJhY2sgZW5hYmxlZCIpOwotICAgIHRyYWNrX3QgKnQgPSAmc3RhdGUtPnRyYWNrc1tpXTsKKyAgICBBTE9HVlYoInByb2Nlc3NfX25vUmVzYW1wbGVPbmVUcmFja1xuIik7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtRW5hYmxlZC5zaXplKCkgIT0gMSwKKyAgICAgICAgICAgICIlenUgIT0gMSB0cmFja3MgZW5hYmxlZCIsIG1FbmFibGVkLnNpemUoKSk7CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYWNrPiAmdCA9IG1UcmFja3NbbUVuYWJsZWRbMF1dOwogICAgIGNvbnN0IHVpbnQzMl90IGNoYW5uZWxzID0gdC0+bU1peGVyQ2hhbm5lbENvdW50OwogICAgIFRPKiBvdXQgPSByZWludGVycHJldF9jYXN0PFRPKj4odC0+bWFpbkJ1ZmZlcik7CiAgICAgVEEqIGF1eCA9IHJlaW50ZXJwcmV0X2Nhc3Q8VEEqPih0LT5hdXhCdWZmZXIpOwogICAgIGNvbnN0IGJvb2wgcmFtcCA9IHQtPm5lZWRzUmFtcCgpOwogCi0gICAgZm9yIChzaXplX3QgbnVtRnJhbWVzID0gc3RhdGUtPmZyYW1lQ291bnQ7IG51bUZyYW1lczsgKSB7CisgICAgZm9yIChzaXplX3QgbnVtRnJhbWVzID0gbUZyYW1lQ291bnQ7IG51bUZyYW1lcyA+IDA7ICkgewogICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXImIGIodC0+YnVmZmVyKTsKICAgICAgICAgLy8gZ2V0IGlucHV0IGJ1ZmZlcgogICAgICAgICBiLmZyYW1lQ291bnQgPSBudW1GcmFtZXM7CkBAIC0xODQ0LDE5ICsxNjgwLDE5IEBACiAgICAgICAgIGlmIChpbiA9PSBOVUxMIHx8ICgoKHVpbnRwdHJfdClpbikgJiAzKSkgewogICAgICAgICAgICAgbWVtc2V0KG91dCwgMCwgbnVtRnJhbWVzCiAgICAgICAgICAgICAgICAgICAgICogY2hhbm5lbHMgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKHQtPm1NaXhlckZvcm1hdCkpOwotICAgICAgICAgICAgQUxPR0VfSUYoKCgodWludHB0cl90KWluKSAmIDMpLCAicHJvY2Vzc19Ob1Jlc2FtcGxlT25lVHJhY2s6IGJ1cyBlcnJvcjogIgorICAgICAgICAgICAgQUxPR0VfSUYoKCgodWludHB0cl90KWluKSAmIDMpLCAicHJvY2Vzc19fbm9SZXNhbXBsZU9uZVRyYWNrOiBidXMgZXJyb3I6ICIKICAgICAgICAgICAgICAgICAgICAgImJ1ZmZlciAlcCB0cmFjayAlcCwgY2hhbm5lbHMgJWQsIG5lZWRzICUjeCIsCi0gICAgICAgICAgICAgICAgICAgIGluLCB0LCB0LT5jaGFubmVsQ291bnQsIHQtPm5lZWRzKTsKKyAgICAgICAgICAgICAgICAgICAgaW4sICZ0LCB0LT5jaGFubmVsQ291bnQsIHQtPm5lZWRzKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCiAgICAgICAgIGNvbnN0IHNpemVfdCBvdXRGcmFtZXMgPSBiLmZyYW1lQ291bnQ7Ci0gICAgICAgIHZvbHVtZU1peDxNSVhUWVBFLCBpc19zYW1lPFRJLCBmbG9hdD46OnZhbHVlLCBmYWxzZT4gKAotICAgICAgICAgICAgICAgIG91dCwgb3V0RnJhbWVzLCBpbiwgYXV4LCByYW1wLCB0KTsKKyAgICAgICAgdC0+dm9sdW1lTWl4PE1JWFRZUEUsIGlzX3NhbWU8VEksIGZsb2F0Pjo6dmFsdWUgLyogVVNFRkxPQVRWT0wgKi8sIGZhbHNlIC8qIEFESlVTVFZPTCAqLz4gKAorICAgICAgICAgICAgICAgIG91dCwgb3V0RnJhbWVzLCBpbiwgYXV4LCByYW1wKTsKIAogICAgICAgICBvdXQgKz0gb3V0RnJhbWVzICogY2hhbm5lbHM7CiAgICAgICAgIGlmIChhdXggIT0gTlVMTCkgewotICAgICAgICAgICAgYXV4ICs9IGNoYW5uZWxzOworICAgICAgICAgICAgYXV4ICs9IG91dEZyYW1lczsKICAgICAgICAgfQogICAgICAgICBudW1GcmFtZXMgLT0gYi5mcmFtZUNvdW50OwogCkBAIC0xODc0LDU5ICsxNzEwLDU5IEBACiAgKiBNSVhUWVBFICAgICAoc2VlIEF1ZGlvTWl4ZXJPcHMuaCBNSVhUWVBFXyogZW51bWVyYXRpb24pCiAgKiBUTzogaW50MzJfdCAoUTQuMjcpIG9yIGZsb2F0CiAgKiBUSTogaW50MzJfdCAoUTQuMjcpIG9yIGludDE2X3QgKFEwLjE1KSBvciBmbG9hdAotICogVEE6IGludDMyX3QgKFE0LjI3KQorICogVEE6IGludDMyX3QgKFE0LjI3KSBvciBmbG9hdAogICovCiB0ZW1wbGF0ZSA8aW50IE1JWFRZUEUsIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVEE+Ci12b2lkIEF1ZGlvTWl4ZXI6OnRyYWNrX19SZXNhbXBsZSh0cmFja190KiB0LCBUTyogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwgVE8qIHRlbXAsIFRBKiBhdXgpCit2b2lkIEF1ZGlvTWl4ZXI6OlRyYWNrOjp0cmFja19fUmVzYW1wbGUoVE8qIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsIFRPKiB0ZW1wLCBUQSogYXV4KQogewogICAgIEFMT0dWVigidHJhY2tfX1Jlc2FtcGxlXG4iKTsKLSAgICB0LT5yZXNhbXBsZXItPnNldFNhbXBsZVJhdGUodC0+c2FtcGxlUmF0ZSk7Ci0gICAgY29uc3QgYm9vbCByYW1wID0gdC0+bmVlZHNSYW1wKCk7CisgICAgbVJlc2FtcGxlci0+c2V0U2FtcGxlUmF0ZShzYW1wbGVSYXRlKTsKKyAgICBjb25zdCBib29sIHJhbXAgPSBuZWVkc1JhbXAoKTsKICAgICBpZiAocmFtcCB8fCBhdXggIT0gTlVMTCkgewogICAgICAgICAvLyBpZiByYW1wOiAgICAgICAgcmVzYW1wbGUgd2l0aCB1bml0eSBnYWluIHRvIHRlbXAgYnVmZmVyIGFuZCBzY2FsZS9taXggaW4gMm5kIHN0ZXAuCiAgICAgICAgIC8vIGlmIGF1eCAhPSBOVUxMOiByZXNhbXBsZSB3aXRoIHVuaXR5IGdhaW4gdG8gdGVtcCBidWZmZXIgdGhlbiBhcHBseSBzZW5kIGxldmVsLgogCi0gICAgICAgIHQtPnJlc2FtcGxlci0+c2V0Vm9sdW1lKFVOSVRZX0dBSU5fRkxPQVQsIFVOSVRZX0dBSU5fRkxPQVQpOwotICAgICAgICBtZW1zZXQodGVtcCwgMCwgb3V0RnJhbWVDb3VudCAqIHQtPm1NaXhlckNoYW5uZWxDb3VudCAqIHNpemVvZihUTykpOwotICAgICAgICB0LT5yZXNhbXBsZXItPnJlc2FtcGxlKChpbnQzMl90Kil0ZW1wLCBvdXRGcmFtZUNvdW50LCB0LT5idWZmZXJQcm92aWRlcik7CisgICAgICAgIG1SZXNhbXBsZXItPnNldFZvbHVtZShVTklUWV9HQUlOX0ZMT0FULCBVTklUWV9HQUlOX0ZMT0FUKTsKKyAgICAgICAgbWVtc2V0KHRlbXAsIDAsIG91dEZyYW1lQ291bnQgKiBtTWl4ZXJDaGFubmVsQ291bnQgKiBzaXplb2YoVE8pKTsKKyAgICAgICAgbVJlc2FtcGxlci0+cmVzYW1wbGUoKGludDMyX3QqKXRlbXAsIG91dEZyYW1lQ291bnQsIGJ1ZmZlclByb3ZpZGVyKTsKIAotICAgICAgICB2b2x1bWVNaXg8TUlYVFlQRSwgaXNfc2FtZTxUSSwgZmxvYXQ+Ojp2YWx1ZSwgdHJ1ZT4oCi0gICAgICAgICAgICAgICAgb3V0LCBvdXRGcmFtZUNvdW50LCB0ZW1wLCBhdXgsIHJhbXAsIHQpOworICAgICAgICB2b2x1bWVNaXg8TUlYVFlQRSwgaXNfc2FtZTxUSSwgZmxvYXQ+Ojp2YWx1ZSAvKiBVU0VGTE9BVFZPTCAqLywgdHJ1ZSAvKiBBREpVU1RWT0wgKi8+KAorICAgICAgICAgICAgICAgIG91dCwgb3V0RnJhbWVDb3VudCwgdGVtcCwgYXV4LCByYW1wKTsKIAogICAgIH0gZWxzZSB7IC8vIGNvbnN0YW50IHZvbHVtZSBnYWluCi0gICAgICAgIHQtPnJlc2FtcGxlci0+c2V0Vm9sdW1lKHQtPm1Wb2x1bWVbMF0sIHQtPm1Wb2x1bWVbMV0pOwotICAgICAgICB0LT5yZXNhbXBsZXItPnJlc2FtcGxlKChpbnQzMl90KilvdXQsIG91dEZyYW1lQ291bnQsIHQtPmJ1ZmZlclByb3ZpZGVyKTsKKyAgICAgICAgbVJlc2FtcGxlci0+c2V0Vm9sdW1lKG1Wb2x1bWVbMF0sIG1Wb2x1bWVbMV0pOworICAgICAgICBtUmVzYW1wbGVyLT5yZXNhbXBsZSgoaW50MzJfdCopb3V0LCBvdXRGcmFtZUNvdW50LCBidWZmZXJQcm92aWRlcik7CiAgICAgfQogfQogCiAvKiBUaGlzIHRyYWNrIGhvb2sgaXMgY2FsbGVkIHRvIG1peCBhIHRyYWNrLCB3aGVuIG5vIHJlc2FtcGxpbmcgaXMgcmVxdWlyZWQuCi0gKiBUaGUgaW5wdXQgYnVmZmVyIHNob3VsZCBiZSBwcmVzZW50IGluIHQtPmluLgorICogVGhlIGlucHV0IGJ1ZmZlciBzaG91bGQgYmUgcHJlc2VudCBpbiBpbi4KICAqCiAgKiBNSVhUWVBFICAgICAoc2VlIEF1ZGlvTWl4ZXJPcHMuaCBNSVhUWVBFXyogZW51bWVyYXRpb24pCiAgKiBUTzogaW50MzJfdCAoUTQuMjcpIG9yIGZsb2F0CiAgKiBUSTogaW50MzJfdCAoUTQuMjcpIG9yIGludDE2X3QgKFEwLjE1KSBvciBmbG9hdAotICogVEE6IGludDMyX3QgKFE0LjI3KQorICogVEE6IGludDMyX3QgKFE0LjI3KSBvciBmbG9hdAogICovCiB0ZW1wbGF0ZSA8aW50IE1JWFRZUEUsIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVEE+Ci12b2lkIEF1ZGlvTWl4ZXI6OnRyYWNrX19Ob1Jlc2FtcGxlKHRyYWNrX3QqIHQsIFRPKiBvdXQsIHNpemVfdCBmcmFtZUNvdW50LAotICAgICAgICBUTyogdGVtcCBfX3VudXNlZCwgVEEqIGF1eCkKK3ZvaWQgQXVkaW9NaXhlcjo6VHJhY2s6OnRyYWNrX19Ob1Jlc2FtcGxlKFRPKiBvdXQsIHNpemVfdCBmcmFtZUNvdW50LCBUTyogdGVtcCBfX3VudXNlZCwgVEEqIGF1eCkKIHsKICAgICBBTE9HVlYoInRyYWNrX19Ob1Jlc2FtcGxlXG4iKTsKLSAgICBjb25zdCBUSSAqaW4gPSBzdGF0aWNfY2FzdDxjb25zdCBUSSAqPih0LT5pbik7CisgICAgY29uc3QgVEkgKmluID0gc3RhdGljX2Nhc3Q8Y29uc3QgVEkgKj4obUluKTsKIAotICAgIHZvbHVtZU1peDxNSVhUWVBFLCBpc19zYW1lPFRJLCBmbG9hdD46OnZhbHVlLCB0cnVlPigKLSAgICAgICAgICAgIG91dCwgZnJhbWVDb3VudCwgaW4sIGF1eCwgdC0+bmVlZHNSYW1wKCksIHQpOworICAgIHZvbHVtZU1peDxNSVhUWVBFLCBpc19zYW1lPFRJLCBmbG9hdD46OnZhbHVlIC8qIFVTRUZMT0FUVk9MICovLCB0cnVlIC8qIEFESlVTVFZPTCAqLz4oCisgICAgICAgICAgICBvdXQsIGZyYW1lQ291bnQsIGluLCBhdXgsIG5lZWRzUmFtcCgpKTsKIAogICAgIC8vIE1JWFRZUEVfTU9OT0VYUEFORCByZWFkcyBhIHNpbmdsZSBpbnB1dCBjaGFubmVsIGFuZCBleHBhbmRzIHRvIE5DSEFOIG91dHB1dCBjaGFubmVscy4KICAgICAvLyBNSVhUWVBFX01VTFRJIHJlYWRzIE5DSEFOIGlucHV0IGNoYW5uZWxzIGFuZCBwbGFjZXMgdG8gTkNIQU4gb3V0cHV0IGNoYW5uZWxzLgotICAgIGluICs9IChNSVhUWVBFID09IE1JWFRZUEVfTU9OT0VYUEFORCkgPyBmcmFtZUNvdW50IDogZnJhbWVDb3VudCAqIHQtPm1NaXhlckNoYW5uZWxDb3VudDsKLSAgICB0LT5pbiA9IGluOworICAgIGluICs9IChNSVhUWVBFID09IE1JWFRZUEVfTU9OT0VYUEFORCkgPyBmcmFtZUNvdW50IDogZnJhbWVDb3VudCAqIG1NaXhlckNoYW5uZWxDb3VudDsKKyAgICBtSW4gPSBpbjsKIH0KIAogLyogVGhlIE1peGVyIGVuZ2luZSBnZW5lcmF0ZXMgZWl0aGVyIGludDMyX3QgKFE0XzI3KSBvciBmbG9hdCBkYXRhLgogICogV2UgdXNlIHRoaXMgZnVuY3Rpb24gdG8gY29udmVydCB0aGUgZW5naW5lIGJ1ZmZlcnMKICAqIHRvIHRoZSBkZXNpcmVkIG1peGVyIG91dHB1dCBmb3JtYXQsIGVpdGhlciBpbnQxNl90IChRLjE1KSBvciBmbG9hdC4KICAqLworLyogc3RhdGljICovCiB2b2lkIEF1ZGlvTWl4ZXI6OmNvbnZlcnRNaXhlckZvcm1hdCh2b2lkICpvdXQsIGF1ZGlvX2Zvcm1hdF90IG1peGVyT3V0Rm9ybWF0LAogICAgICAgICB2b2lkICppbiwgYXVkaW9fZm9ybWF0X3QgbWl4ZXJJbkZvcm1hdCwgc2l6ZV90IHNhbXBsZUNvdW50KQogewpAQCAtMTk0NywxMSArMTc4MywxMCBAQAogICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CiAgICAgICAgIHN3aXRjaCAobWl4ZXJPdXRGb3JtYXQpIHsKICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgotICAgICAgICAgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21fcTRfMjcoKGZsb2F0KilvdXQsIChpbnQzMl90Kilpbiwgc2FtcGxlQ291bnQpOworICAgICAgICAgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21fcTRfMjcoKGZsb2F0KilvdXQsIChjb25zdCBpbnQzMl90Kilpbiwgc2FtcGxlQ291bnQpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6Ci0gICAgICAgICAgICAvLyB0d28gaW50MTZfdCBhcmUgcHJvZHVjZWQgcGVyIGl0ZXJhdGlvbgotICAgICAgICAgICAgZGl0aGVyQW5kQ2xhbXAoKGludDMyX3QqKW91dCwgKGludDMyX3QqKWluLCBzYW1wbGVDb3VudCA+PiAxKTsKKyAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9xNF8yNygoaW50MTZfdCopb3V0LCAoY29uc3QgaW50MzJfdCopaW4sIHNhbXBsZUNvdW50KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiYmFkIG1peGVyT3V0Rm9ybWF0OiAlI3giLCBtaXhlck91dEZvcm1hdCk7CkBAIC0xOTY2LDE5ICsxODAxLDIwIEBACiAKIC8qIFJldHVybnMgdGhlIHByb3BlciB0cmFjayBob29rIHRvIHVzZSBmb3IgbWl4aW5nIHRoZSB0cmFjayBpbnRvIHRoZSBvdXRwdXQgYnVmZmVyLgogICovCi1BdWRpb01peGVyOjpob29rX3QgQXVkaW9NaXhlcjo6Z2V0VHJhY2tIb29rKGludCB0cmFja1R5cGUsIHVpbnQzMl90IGNoYW5uZWxDb3VudCwKKy8qIHN0YXRpYyAqLworQXVkaW9NaXhlcjo6aG9va190IEF1ZGlvTWl4ZXI6OlRyYWNrOjpnZXRUcmFja0hvb2soaW50IHRyYWNrVHlwZSwgdWludDMyX3QgY2hhbm5lbENvdW50LAogICAgICAgICBhdWRpb19mb3JtYXRfdCBtaXhlckluRm9ybWF0LCBhdWRpb19mb3JtYXRfdCBtaXhlck91dEZvcm1hdCBfX3VudXNlZCkKIHsKICAgICBpZiAoIWtVc2VOZXdNaXhlciAmJiBjaGFubmVsQ291bnQgPT0gRkNDXzIgJiYgbWl4ZXJJbkZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgewogICAgICAgICBzd2l0Y2ggKHRyYWNrVHlwZSkgewogICAgICAgICBjYXNlIFRSQUNLVFlQRV9OT1A6Ci0gICAgICAgICAgICByZXR1cm4gdHJhY2tfX25vcDsKKyAgICAgICAgICAgIHJldHVybiAmVHJhY2s6OnRyYWNrX19ub3A7CiAgICAgICAgIGNhc2UgVFJBQ0tUWVBFX1JFU0FNUExFOgotICAgICAgICAgICAgcmV0dXJuIHRyYWNrX19nZW5lcmljUmVzYW1wbGU7CisgICAgICAgICAgICByZXR1cm4gJlRyYWNrOjp0cmFja19fZ2VuZXJpY1Jlc2FtcGxlOwogICAgICAgICBjYXNlIFRSQUNLVFlQRV9OT1JFU0FNUExFTU9OTzoKLSAgICAgICAgICAgIHJldHVybiB0cmFja19fMTZCaXRzTW9ubzsKKyAgICAgICAgICAgIHJldHVybiAmVHJhY2s6OnRyYWNrX18xNkJpdHNNb25vOwogICAgICAgICBjYXNlIFRSQUNLVFlQRV9OT1JFU0FNUExFOgotICAgICAgICAgICAgcmV0dXJuIHRyYWNrX18xNkJpdHNTdGVyZW87CisgICAgICAgICAgICByZXR1cm4gJlRyYWNrOjp0cmFja19fMTZCaXRzU3RlcmVvOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiYmFkIHRyYWNrVHlwZTogJWQiLCB0cmFja1R5cGUpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC0xOTg3LDE1ICsxODIzLDE1IEBACiAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihjaGFubmVsQ291bnQgPiBNQVhfTlVNX0NIQU5ORUxTKTsKICAgICBzd2l0Y2ggKHRyYWNrVHlwZSkgewogICAgIGNhc2UgVFJBQ0tUWVBFX05PUDoKLSAgICAgICAgcmV0dXJuIHRyYWNrX19ub3A7CisgICAgICAgIHJldHVybiAmVHJhY2s6OnRyYWNrX19ub3A7CiAgICAgY2FzZSBUUkFDS1RZUEVfUkVTQU1QTEU6CiAgICAgICAgIHN3aXRjaCAobWl4ZXJJbkZvcm1hdCkgewogICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6Ci0gICAgICAgICAgICByZXR1cm4gKEF1ZGlvTWl4ZXI6Omhvb2tfdCkKLSAgICAgICAgICAgICAgICAgICAgdHJhY2tfX1Jlc2FtcGxlPE1JWFRZUEVfTVVMVEksIGZsb2F0IC8qVE8qLywgZmxvYXQgLypUSSovLCBpbnQzMl90IC8qVEEqLz47CisgICAgICAgICAgICByZXR1cm4gKEF1ZGlvTWl4ZXI6Omhvb2tfdCkgJlRyYWNrOjp0cmFja19fUmVzYW1wbGU8CisgICAgICAgICAgICAgICAgICAgIE1JWFRZUEVfTVVMVEksIGZsb2F0IC8qVE8qLywgZmxvYXQgLypUSSovLCBUWVBFX0FVWD47CiAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6Ci0gICAgICAgICAgICByZXR1cm4gKEF1ZGlvTWl4ZXI6Omhvb2tfdClcCi0gICAgICAgICAgICAgICAgICAgIHRyYWNrX19SZXNhbXBsZTxNSVhUWVBFX01VTFRJLCBpbnQzMl90LCBpbnQxNl90LCBpbnQzMl90PjsKKyAgICAgICAgICAgIHJldHVybiAoQXVkaW9NaXhlcjo6aG9va190KSAmVHJhY2s6OnRyYWNrX19SZXNhbXBsZTwKKyAgICAgICAgICAgICAgICAgICAgTUlYVFlQRV9NVUxUSSwgaW50MzJfdCAvKlRPKi8sIGludDE2X3QgLypUSSovLCBUWVBFX0FVWD47CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJiYWQgbWl4ZXJJbkZvcm1hdDogJSN4IiwgbWl4ZXJJbkZvcm1hdCk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTIwMDQsMTEgKzE4NDAsMTEgQEAKICAgICBjYXNlIFRSQUNLVFlQRV9OT1JFU0FNUExFTU9OTzoKICAgICAgICAgc3dpdGNoIChtaXhlckluRm9ybWF0KSB7CiAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKLSAgICAgICAgICAgIHJldHVybiAoQXVkaW9NaXhlcjo6aG9va190KQotICAgICAgICAgICAgICAgICAgICB0cmFja19fTm9SZXNhbXBsZTxNSVhUWVBFX01PTk9FWFBBTkQsIGZsb2F0LCBmbG9hdCwgaW50MzJfdD47CisgICAgICAgICAgICByZXR1cm4gKEF1ZGlvTWl4ZXI6Omhvb2tfdCkgJlRyYWNrOjp0cmFja19fTm9SZXNhbXBsZTwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSVhUWVBFX01PTk9FWFBBTkQsIGZsb2F0IC8qVE8qLywgZmxvYXQgLypUSSovLCBUWVBFX0FVWD47CiAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6Ci0gICAgICAgICAgICByZXR1cm4gKEF1ZGlvTWl4ZXI6Omhvb2tfdCkKLSAgICAgICAgICAgICAgICAgICAgdHJhY2tfX05vUmVzYW1wbGU8TUlYVFlQRV9NT05PRVhQQU5ELCBpbnQzMl90LCBpbnQxNl90LCBpbnQzMl90PjsKKyAgICAgICAgICAgIHJldHVybiAoQXVkaW9NaXhlcjo6aG9va190KSAmVHJhY2s6OnRyYWNrX19Ob1Jlc2FtcGxlPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JWFRZUEVfTU9OT0VYUEFORCwgaW50MzJfdCAvKlRPKi8sIGludDE2X3QgLypUSSovLCBUWVBFX0FVWD47CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJiYWQgbWl4ZXJJbkZvcm1hdDogJSN4IiwgbWl4ZXJJbkZvcm1hdCk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTIwMTcsMTEgKzE4NTMsMTEgQEAKICAgICBjYXNlIFRSQUNLVFlQRV9OT1JFU0FNUExFOgogICAgICAgICBzd2l0Y2ggKG1peGVySW5Gb3JtYXQpIHsKICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgotICAgICAgICAgICAgcmV0dXJuIChBdWRpb01peGVyOjpob29rX3QpCi0gICAgICAgICAgICAgICAgICAgIHRyYWNrX19Ob1Jlc2FtcGxlPE1JWFRZUEVfTVVMVEksIGZsb2F0LCBmbG9hdCwgaW50MzJfdD47CisgICAgICAgICAgICByZXR1cm4gKEF1ZGlvTWl4ZXI6Omhvb2tfdCkgJlRyYWNrOjp0cmFja19fTm9SZXNhbXBsZTwKKyAgICAgICAgICAgICAgICAgICAgTUlYVFlQRV9NVUxUSSwgZmxvYXQgLypUTyovLCBmbG9hdCAvKlRJKi8sIFRZUEVfQVVYPjsKICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKLSAgICAgICAgICAgIHJldHVybiAoQXVkaW9NaXhlcjo6aG9va190KQotICAgICAgICAgICAgICAgICAgICB0cmFja19fTm9SZXNhbXBsZTxNSVhUWVBFX01VTFRJLCBpbnQzMl90LCBpbnQxNl90LCBpbnQzMl90PjsKKyAgICAgICAgICAgIHJldHVybiAoQXVkaW9NaXhlcjo6aG9va190KSAmVHJhY2s6OnRyYWNrX19Ob1Jlc2FtcGxlPAorICAgICAgICAgICAgICAgICAgICBNSVhUWVBFX01VTFRJLCBpbnQzMl90IC8qVE8qLywgaW50MTZfdCAvKlRJKi8sIFRZUEVfQVVYPjsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImJhZCBtaXhlckluRm9ybWF0OiAlI3giLCBtaXhlckluRm9ybWF0KTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjA0MSw3ICsxODc3LDkgQEAKICAqIGEgc3RlcmVvIG91dHB1dCB0cmFjaywgdGhlIGlucHV0IHRyYWNrIGNhbm5vdCBiZSBNT05PLiAgVGhpcyBzaG91bGQgYmUKICAqIHByZXZlbnRlZCBieSB0aGUgY2FsbGVyLgogICovCi1BdWRpb01peGVyOjpwcm9jZXNzX2hvb2tfdCBBdWRpb01peGVyOjpnZXRQcm9jZXNzSG9vayhpbnQgcHJvY2Vzc1R5cGUsIHVpbnQzMl90IGNoYW5uZWxDb3VudCwKKy8qIHN0YXRpYyAqLworQXVkaW9NaXhlcjo6cHJvY2Vzc19ob29rX3QgQXVkaW9NaXhlcjo6Z2V0UHJvY2Vzc0hvb2soCisgICAgICAgIGludCBwcm9jZXNzVHlwZSwgdWludDMyX3QgY2hhbm5lbENvdW50LAogICAgICAgICBhdWRpb19mb3JtYXRfdCBtaXhlckluRm9ybWF0LCBhdWRpb19mb3JtYXRfdCBtaXhlck91dEZvcm1hdCkKIHsKICAgICBpZiAocHJvY2Vzc1R5cGUgIT0gUFJPQ0VTU1RZUEVfTk9SRVNBTVBMRU9ORVRSQUNLKSB7IC8vIE9ubHkgTk9SRVNBTVBMRU9ORVRSQUNLCkBAIC0yMDQ5LDE4ICsxODg3LDE4IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBpZiAoIWtVc2VOZXdNaXhlciAmJiBjaGFubmVsQ291bnQgPT0gRkNDXzIgJiYgbWl4ZXJJbkZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgewotICAgICAgICByZXR1cm4gcHJvY2Vzc19fT25lVHJhY2sxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxpbmc7CisgICAgICAgIHJldHVybiAmQXVkaW9NaXhlcjo6cHJvY2Vzc19fb25lVHJhY2sxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxpbmc7CiAgICAgfQogICAgIExPR19BTFdBWVNfRkFUQUxfSUYoY2hhbm5lbENvdW50ID4gTUFYX05VTV9DSEFOTkVMUyk7CiAgICAgc3dpdGNoIChtaXhlckluRm9ybWF0KSB7CiAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgogICAgICAgICBzd2l0Y2ggKG1peGVyT3V0Rm9ybWF0KSB7CiAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKLSAgICAgICAgICAgIHJldHVybiBwcm9jZXNzX05vUmVzYW1wbGVPbmVUcmFjazxNSVhUWVBFX01VTFRJX1NBVkVPTkxZLAotICAgICAgICAgICAgICAgICAgICBmbG9hdCAvKlRPKi8sIGZsb2F0IC8qVEkqLywgaW50MzJfdCAvKlRBKi8+OworICAgICAgICAgICAgcmV0dXJuICZBdWRpb01peGVyOjpwcm9jZXNzX19ub1Jlc2FtcGxlT25lVHJhY2s8CisgICAgICAgICAgICAgICAgICAgIE1JWFRZUEVfTVVMVElfU0FWRU9OTFksIGZsb2F0IC8qVE8qLywgZmxvYXQgLypUSSovLCBUWVBFX0FVWD47CiAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6Ci0gICAgICAgICAgICByZXR1cm4gcHJvY2Vzc19Ob1Jlc2FtcGxlT25lVHJhY2s8TUlYVFlQRV9NVUxUSV9TQVZFT05MWSwKLSAgICAgICAgICAgICAgICAgICAgaW50MTZfdCwgZmxvYXQsIGludDMyX3Q+OworICAgICAgICAgICAgcmV0dXJuICZBdWRpb01peGVyOjpwcm9jZXNzX19ub1Jlc2FtcGxlT25lVHJhY2s8CisgICAgICAgICAgICAgICAgICAgIE1JWFRZUEVfTVVMVElfU0FWRU9OTFksIGludDE2X3QgLypUTyovLCBmbG9hdCAvKlRJKi8sIFRZUEVfQVVYPjsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImJhZCBtaXhlck91dEZvcm1hdDogJSN4IiwgbWl4ZXJPdXRGb3JtYXQpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC0yMDY5LDExICsxOTA3LDExIEBACiAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKICAgICAgICAgc3dpdGNoIChtaXhlck91dEZvcm1hdCkgewogICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6Ci0gICAgICAgICAgICByZXR1cm4gcHJvY2Vzc19Ob1Jlc2FtcGxlT25lVHJhY2s8TUlYVFlQRV9NVUxUSV9TQVZFT05MWSwKLSAgICAgICAgICAgICAgICAgICAgZmxvYXQsIGludDE2X3QsIGludDMyX3Q+OworICAgICAgICAgICAgcmV0dXJuICZBdWRpb01peGVyOjpwcm9jZXNzX19ub1Jlc2FtcGxlT25lVHJhY2s8CisgICAgICAgICAgICAgICAgICAgIE1JWFRZUEVfTVVMVElfU0FWRU9OTFksIGZsb2F0IC8qVE8qLywgaW50MTZfdCAvKlRJKi8sIFRZUEVfQVVYPjsKICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKLSAgICAgICAgICAgIHJldHVybiBwcm9jZXNzX05vUmVzYW1wbGVPbmVUcmFjazxNSVhUWVBFX01VTFRJX1NBVkVPTkxZLAotICAgICAgICAgICAgICAgICAgICBpbnQxNl90LCBpbnQxNl90LCBpbnQzMl90PjsKKyAgICAgICAgICAgIHJldHVybiAmQXVkaW9NaXhlcjo6cHJvY2Vzc19fbm9SZXNhbXBsZU9uZVRyYWNrPAorICAgICAgICAgICAgICAgICAgICBNSVhUWVBFX01VTFRJX1NBVkVPTkxZLCBpbnQxNl90IC8qVE8qLywgaW50MTZfdCAvKlRJKi8sIFRZUEVfQVVYPjsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImJhZCBtaXhlck91dEZvcm1hdDogJSN4IiwgbWl4ZXJPdXRGb3JtYXQpOwogICAgICAgICAgICAgYnJlYWs7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9NaXhlck9wcy5oIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvTWl4ZXJPcHMuaAppbmRleCA4ZDc0MDI0Li5mMzNlMzYxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9NaXhlck9wcy5oCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb01peGVyT3BzLmgKQEAgLTE4OCwxMyArMTg4LDEzIEBACiAKIHRlbXBsYXRlPD4KIGlubGluZSB2b2lkIE1peEFjY3VtPGZsb2F0LCBpbnQxNl90PihmbG9hdCAqYXV4YWNjdW0sIGludDE2X3QgdmFsdWUpIHsKLSAgICBzdGF0aWMgY29uc3QgZmxvYXQgbm9ybSA9IDEuIC8gKDEgPDwgMTUpOworICAgIHN0YXRpYyBjb25zdGV4cHIgZmxvYXQgbm9ybSA9IDEuIC8gKDEgPDwgMTUpOwogICAgICphdXhhY2N1bSArPSBub3JtICogdmFsdWU7CiB9CiAKIHRlbXBsYXRlPD4KIGlubGluZSB2b2lkIE1peEFjY3VtPGZsb2F0LCBpbnQzMl90PihmbG9hdCAqYXV4YWNjdW0sIGludDMyX3QgdmFsdWUpIHsKLSAgICBzdGF0aWMgY29uc3QgZmxvYXQgbm9ybSA9IDEuIC8gKDEgPDwgMjcpOworICAgIHN0YXRpYyBjb25zdGV4cHIgZmxvYXQgbm9ybSA9IDEuIC8gKDEgPDwgMjcpOwogICAgICphdXhhY2N1bSArPSBub3JtICogdmFsdWU7CiB9CiAKQEAgLTIzOCw2ICsyMzgsNyBAQAogICogICBOQ0hBTiByZXByZXNlbnRzIG51bWJlciBvZiBpbnB1dCBhbmQgb3V0cHV0IGNoYW5uZWxzLgogICogICBUTzogaW50MzJfdCAoUTQuMjcpIG9yIGZsb2F0CiAgKiAgIFRJOiBpbnQzMl90IChRNC4yNykgb3IgaW50MTZfdCAoUTAuMTUpIG9yIGZsb2F0CisgKiAgIFRBOiBpbnQzMl90IChRNC4yNykgb3IgZmxvYXQKICAqICAgVFY6IGludDMyX3QgKFU0LjI4KSBvciBpbnQxNl90IChVNC4xMikgb3IgZmxvYXQKICAqICAgdm9sOiByZXByZXNlbnRzIGEgdm9sdW1lIGFycmF5LgogICoKQEAgLTI0Nyw3ICsyNDgsOCBAQAogICogICBTaW5nbGUgaW5wdXQgY2hhbm5lbC4gTkNIQU4gcmVwcmVzZW50cyBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzLgogICogICBUTzogaW50MzJfdCAoUTQuMjcpIG9yIGZsb2F0CiAgKiAgIFRJOiBpbnQzMl90IChRNC4yNykgb3IgaW50MTZfdCAoUTAuMTUpIG9yIGZsb2F0Ci0gKiAgIFRWOiBpbnQzMl90IChVNC4yOCkgb3IgaW50MTZfdCAoVTQuMTIpIG9yIGZsb2F0CisgKiAgIFRBOiBpbnQzMl90IChRNC4yNykgb3IgZmxvYXQKKyAqICAgVFYvVEFWOiBpbnQzMl90IChVNC4yOCkgb3IgaW50MTZfdCAoVTQuMTIpIG9yIGZsb2F0CiAgKiAgIElucHV0IGNoYW5uZWwgY291bnQgaXMgMS4KICAqICAgdm9sOiByZXByZXNlbnRzIHZvbHVtZSBhcnJheS4KICAqCkBAIC0yNTcsNyArMjU5LDggQEAKICAqICAgTkNIQU4gcmVwcmVzZW50cyBudW1iZXIgb2YgaW5wdXQgYW5kIG91dHB1dCBjaGFubmVscy4KICAqICAgVE86IGludDE2X3QgKFEuMTUpIG9yIGZsb2F0CiAgKiAgIFRJOiBpbnQzMl90IChRNC4yNykgb3IgaW50MTZfdCAoUTAuMTUpIG9yIGZsb2F0Ci0gKiAgIFRWOiBpbnQzMl90IChVNC4yOCkgb3IgaW50MTZfdCAoVTQuMTIpIG9yIGZsb2F0CisgKiAgIFRBOiBpbnQzMl90IChRNC4yNykgb3IgZmxvYXQKKyAqICAgVFYvVEFWOiBpbnQzMl90IChVNC4yOCkgb3IgaW50MTZfdCAoVTQuMTIpIG9yIGZsb2F0CiAgKiAgIHZvbDogcmVwcmVzZW50cyBhIHZvbHVtZSBhcnJheS4KICAqCiAgKiAgIE1JWFRZUEVfTVVMVElfU0FWRU9OTFkgZG9lcyBub3QgYWNjdW11bGF0ZSBpbnRvIHRoZSBvdXQgcG9pbnRlci4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckR5bi5jcHAgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJEeW4uY3BwCmluZGV4IDhmN2I5ODIuLmVlZWVjY2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckR5bi5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRHluLmNwcApAQCAtMzgsNiArMzgsOSBAQAogCiAvLyNkZWZpbmUgREVCVUdfUkVTQU1QTEVSCiAKKy8vIHVzZSB0aGlzIGZvciBvdXIgYnVmZmVyIGFsaWdubWVudC4gIFNob3VsZCBiZSBhdCBsZWFzdCAzMiBieXRlcy4KK2NvbnN0ZXhwciBzaXplX3QgQ0FDSEVfTElORV9TSVpFID0gNjQ7CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLyoKQEAgLTk0LDcgKzk3LDEwIEBACiAKICAgICAvLyBjcmVhdGUgbmV3IGJ1ZmZlcgogICAgIFRJKiBzdGF0ZSA9IE5VTEw7Ci0gICAgKHZvaWQpcG9zaXhfbWVtYWxpZ24ocmVpbnRlcnByZXRfY2FzdDx2b2lkKio+KCZzdGF0ZSksIDMyLCBzdGF0ZUNvdW50KnNpemVvZigqc3RhdGUpKTsKKyAgICAodm9pZClwb3NpeF9tZW1hbGlnbigKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqKj4oJnN0YXRlKSwKKyAgICAgICAgICAgIENBQ0hFX0xJTkVfU0laRSAvKiBhbGlnbm1lbnQgKi8sCisgICAgICAgICAgICBzdGF0ZUNvdW50ICogc2l6ZW9mKCpzdGF0ZSkpOwogICAgIG1lbXNldChzdGF0ZSwgMCwgc3RhdGVDb3VudCpzaXplb2YoKnN0YXRlKSk7CiAKICAgICAvLyBhdHRlbXB0IHRvIHByZXNlcnZlIHN0YXRlCkBAIC0xODUsNiArMTkxLDE2IEBACiAgICAgLy8gc2V0U2FtcGxlUmF0ZSgpIGZvciAxOjEuIChNYXkgYmUgcmVtb3ZlZCBpZiBwcmVjYWxjdWxhdGVkIGZpbHRlcnMgYXJlIHVzZWQuKQogICAgIG1JblNhbXBsZVJhdGUgPSAwOwogICAgIG1Db25zdGFudHMuc2V0KDEyOCwgOCwgbVNhbXBsZVJhdGUsIG1TYW1wbGVSYXRlKTsgLy8gVE9ETzogc2V0IGJldHRlcgorCisgICAgLy8gZmV0Y2ggcHJvcGVydHkgYmFzZWQgcmVzYW1wbGluZyBwYXJhbWV0ZXJzCisgICAgbVByb3BlcnR5RW5hYmxlQXRTYW1wbGVSYXRlID0gcHJvcGVydHlfZ2V0X2ludDMyKAorICAgICAgICAgICAgInJvLmF1ZGlvLnJlc2FtcGxlci5wc2QuZW5hYmxlX2F0X3NhbXBsZXJhdGUiLCBtUHJvcGVydHlFbmFibGVBdFNhbXBsZVJhdGUpOworICAgIG1Qcm9wZXJ0eUhhbGZGaWx0ZXJMZW5ndGggPSBwcm9wZXJ0eV9nZXRfaW50MzIoCisgICAgICAgICAgICAicm8uYXVkaW8ucmVzYW1wbGVyLnBzZC5oYWxmbGVuZ3RoIiwgbVByb3BlcnR5SGFsZkZpbHRlckxlbmd0aCk7CisgICAgbVByb3BlcnR5U3RvcGJhbmRBdHRlbnVhdGlvbiA9IHByb3BlcnR5X2dldF9pbnQzMigKKyAgICAgICAgICAgICJyby5hdWRpby5yZXNhbXBsZXIucHNkLnN0b3BiYW5kIiwgbVByb3BlcnR5U3RvcGJhbmRBdHRlbnVhdGlvbik7CisgICAgbVByb3BlcnR5Q3V0b2ZmUGVyY2VudCA9IHByb3BlcnR5X2dldF9pbnQzMigKKyAgICAgICAgICAgICJyby5hdWRpby5yZXNhbXBsZXIucHNkLmN1dG9mZl9wZXJjZW50IiwgbVByb3BlcnR5Q3V0b2ZmUGVyY2VudCk7CiB9CiAKIHRlbXBsYXRlPHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVE8+CkBAIC0yMTUsNiArMjMxLDggQEAKICAgICB9CiB9CiAKKy8vIFRPRE86IHVwZGF0ZSB0byBDKysxMQorCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBUIG1heChUIGEsIFQgYikge3JldHVybiBhID4gYiA/IGEgOiBiO30KIAogdGVtcGxhdGU8dHlwZW5hbWUgVD4gVCBhYnNkaWZmKFQgYSwgVCBiKSB7cmV0dXJuIGEgPiBiID8gYSAtIGIgOiBiIC0gYTt9CkBAIC0yMjMsMzcgKzI0MSw3NCBAQAogdm9pZCBBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6Y3JlYXRlS2Fpc2VyRmlyKENvbnN0YW50cyAmYywKICAgICAgICAgZG91YmxlIHN0b3BCYW5kQXR0ZW4sIGludCBpblNhbXBsZVJhdGUsIGludCBvdXRTYW1wbGVSYXRlLCBkb3VibGUgdGJ3Q2hlYXQpCiB7Ci0gICAgVEMqIGJ1ZiA9IE5VTEw7Ci0gICAgc3RhdGljIGNvbnN0IGRvdWJsZSBhdHRlbiA9IDAuOTk5ODsgICAvLyB0byBhdm9pZCByaXBwbGUgb3ZlcmZsb3cKLSAgICBkb3VibGUgZmNyOwotICAgIGRvdWJsZSB0YncgPSBmaXJLYWlzZXJUYncoYy5tSGFsZk51bUNvZWZzLCBzdG9wQmFuZEF0dGVuKTsKKyAgICAvLyBjb21wdXRlIHRoZSBub3JtYWxpemVkIHRyYW5zaXRpb24gYmFuZHdpZHRoCisgICAgY29uc3QgZG91YmxlIHRidyA9IGZpckthaXNlclRidyhjLm1IYWxmTnVtQ29lZnMsIHN0b3BCYW5kQXR0ZW4pOworICAgIGNvbnN0IGRvdWJsZSBoYWxmYncgPSB0YncgLyAyLjsKIAotICAgICh2b2lkKXBvc2l4X21lbWFsaWduKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCoqPigmYnVmKSwgMzIsIChjLm1MKzEpKmMubUhhbGZOdW1Db2VmcypzaXplb2YoVEMpKTsKKyAgICBkb3VibGUgZmNyOyAvLyBjb21wdXRlIGZjciwgdGhlIDMgZEIgYW1wbGl0dWRlIGN1dC1vZmYuCiAgICAgaWYgKGluU2FtcGxlUmF0ZSA8IG91dFNhbXBsZVJhdGUpIHsgLy8gdXBzYW1wbGUKLSAgICAgICAgZmNyID0gbWF4KDAuNSp0YndDaGVhdCAtIHRidy8yLCB0YncvMik7CisgICAgICAgIGZjciA9IG1heCgwLjUgKiB0YndDaGVhdCAtIGhhbGZidywgaGFsZmJ3KTsKICAgICB9IGVsc2UgeyAvLyBkb3duc2FtcGxlCi0gICAgICAgIGZjciA9IG1heCgwLjUqdGJ3Q2hlYXQqb3V0U2FtcGxlUmF0ZS9pblNhbXBsZVJhdGUgLSB0YncvMiwgdGJ3LzIpOworICAgICAgICBmY3IgPSBtYXgoMC41ICogdGJ3Q2hlYXQgKiBvdXRTYW1wbGVSYXRlIC8gaW5TYW1wbGVSYXRlIC0gaGFsZmJ3LCBoYWxmYncpOwogICAgIH0KLSAgICAvLyBjcmVhdGUgYW5kIHNldCBmaWx0ZXIKLSAgICBmaXJLYWlzZXJHZW4oYnVmLCBjLm1MLCBjLm1IYWxmTnVtQ29lZnMsIHN0b3BCYW5kQXR0ZW4sIGZjciwgYXR0ZW4pOwotICAgIGMubUZpckNvZWZzID0gYnVmOwotICAgIGlmIChtQ29lZkJ1ZmZlcikgewotICAgICAgICBmcmVlKG1Db2VmQnVmZmVyKTsKLSAgICB9Ci0gICAgbUNvZWZCdWZmZXIgPSBidWY7Ci0jaWZkZWYgREVCVUdfUkVTQU1QTEVSCisgICAgY3JlYXRlS2Fpc2VyRmlyKGMsIHN0b3BCYW5kQXR0ZW4sIGZjcik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVE8+Cit2b2lkIEF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpjcmVhdGVLYWlzZXJGaXIoQ29uc3RhbnRzICZjLAorICAgICAgICBkb3VibGUgc3RvcEJhbmRBdHRlbiwgZG91YmxlIGZjcikgeworICAgIC8vIGNvbXB1dGUgdGhlIG5vcm1hbGl6ZWQgdHJhbnNpdGlvbiBiYW5kd2lkdGgKKyAgICBjb25zdCBkb3VibGUgdGJ3ID0gZmlyS2Fpc2VyVGJ3KGMubUhhbGZOdW1Db2Vmcywgc3RvcEJhbmRBdHRlbik7CisgICAgY29uc3QgaW50IHBoYXNlcyA9IGMubUw7CisgICAgY29uc3QgaW50IGhhbGZMZW5ndGggPSBjLm1IYWxmTnVtQ29lZnM7CisKKyAgICAvLyBjcmVhdGUgYnVmZmVyCisgICAgVEMgKmNvZWZzID0gbnVsbHB0cjsKKyAgICBpbnQgcmV0ID0gcG9zaXhfbWVtYWxpZ24oCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZvaWQgKio+KCZjb2VmcyksCisgICAgICAgICAgICBDQUNIRV9MSU5FX1NJWkUgLyogYWxpZ25tZW50ICovLAorICAgICAgICAgICAgKHBoYXNlcyArIDEpICogaGFsZkxlbmd0aCAqIHNpemVvZihUQykpOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYocmV0ICE9IDAsICJDYW5ub3QgYWxsb2NhdGUgYnVmZmVyIG1lbW9yeSwgcmV0ICVkIiwgcmV0KTsKKyAgICBjLm1GaXJDb2VmcyA9IGNvZWZzOworICAgIGZyZWUobUNvZWZCdWZmZXIpOworICAgIG1Db2VmQnVmZmVyID0gY29lZnM7CisKKyAgICAvLyBzcXVhcmUgdGhlIGNvbXB1dGVkIG1pbmltdW0gcGFzc2JhbmQgdmFsdWUgKGV4dHJhIHNhZmV0eSkuCisgICAgZG91YmxlIGF0dGVudWF0aW9uID0KKyAgICAgICAgICAgIGNvbXB1dGVXaW5kb3dlZFNpbmNNaW5pbXVtUGFzc2JhbmRWYWx1ZShzdG9wQmFuZEF0dGVuKTsKKyAgICBhdHRlbnVhdGlvbiAqPSBhdHRlbnVhdGlvbjsKKworICAgIC8vIGRlc2lnbiBmaWx0ZXIKKyAgICBmaXJLYWlzZXJHZW4oY29lZnMsIHBoYXNlcywgaGFsZkxlbmd0aCwgc3RvcEJhbmRBdHRlbiwgZmNyLCBhdHRlbnVhdGlvbik7CisKKyAgICAvLyB1cGRhdGUgdGhlIGRlc2lnbiBjcml0ZXJpYQorICAgIG1Ob3JtYWxpemVkQ3V0b2ZmRnJlcXVlbmN5ID0gZmNyOworICAgIG1Ob3JtYWxpemVkVHJhbnNpdGlvbkJhbmR3aWR0aCA9IHRidzsKKyAgICBtRmlsdGVyQXR0ZW51YXRpb24gPSBhdHRlbnVhdGlvbjsKKyAgICBtU3RvcGJhbmRBdHRlbnVhdGlvbkRiID0gc3RvcEJhbmRBdHRlbjsKKyAgICBtUGFzc2JhbmRSaXBwbGVEYiA9IGNvbXB1dGVXaW5kb3dlZFNpbmNQYXNzYmFuZFJpcHBsZURiKHN0b3BCYW5kQXR0ZW4pOworCisjaWYgMAorICAgIC8vIEtlZXAgdGhpcyBkZWJ1ZyBjb2RlIGluIGNhc2UgYW4gYXBwIGNhdXNlcyByZXNhbXBsZXIgZGVzaWduIGlzc3Vlcy4KKyAgICBjb25zdCBkb3VibGUgaGFsZmJ3ID0gdGJ3IC8gMi47CiAgICAgLy8gcHJpbnQgYmFzaWMgZmlsdGVyIHN0YXRzCi0gICAgcHJpbnRmKCJMOiVkICBobmM6JWQgIHN0b3BCYW5kQXR0ZW46JWxmICBmY3I6JWxmICBhdHRlbjolbGYgIHRidzolbGZcbiIsCi0gICAgICAgICAgICBjLm1MLCBjLm1IYWxmTnVtQ29lZnMsIHN0b3BCYW5kQXR0ZW4sIGZjciwgYXR0ZW4sIHRidyk7Ci0gICAgLy8gdGVzdCB0aGUgZmlsdGVyIGFuZCByZXBvcnQgcmVzdWx0cwotICAgIGRvdWJsZSBmcCA9IChmY3IgLSB0YncvMikvYy5tTDsKLSAgICBkb3VibGUgZnMgPSAoZmNyICsgdGJ3LzIpL2MubUw7CisgICAgQUxPR0QoIkw6JWQgIGhuYzolZCAgc3RvcEJhbmRBdHRlbjolbGYgIGZjcjolbGYgIGF0dGVuOiVsZiAgdGJ3OiVsZlxuIiwKKyAgICAgICAgICAgIGMubUwsIGMubUhhbGZOdW1Db2Vmcywgc3RvcEJhbmRBdHRlbiwgZmNyLCBhdHRlbnVhdGlvbiwgdGJ3KTsKKworICAgIC8vIHRlc3QgdGhlIGZpbHRlciBhbmQgcmVwb3J0IHJlc3VsdHMuCisgICAgLy8gU2luY2UgdGhpcyBpcyBhIHBvbHlwaGFzZSBmaWx0ZXIsIG5vcm1hbGl6ZWQgZnAgYW5kIGZzIG11c3QgYmUgc2NhbGVkLgorICAgIGNvbnN0IGRvdWJsZSBmcCA9IChmY3IgLSBoYWxmYncpIC8gcGhhc2VzOworICAgIGNvbnN0IGRvdWJsZSBmcyA9IChmY3IgKyBoYWxmYncpIC8gcGhhc2VzOworCiAgICAgZG91YmxlIHBhc3NNaW4sIHBhc3NNYXgsIHBhc3NSaXBwbGU7CiAgICAgZG91YmxlIHN0b3BNYXgsIHN0b3BSaXBwbGU7Ci0gICAgdGVzdEZpcihidWYsIGMubUwsIGMubUhhbGZOdW1Db2VmcywgZnAsIGZzLCAvKnBhc3NTdGVwcyovIDEwMDAsIC8qc3RvcFN0ZXBzKi8gMTAwMDAwLAorCisgICAgY29uc3QgaW50MzJfdCBwYXNzU3RlcHMgPSAxMDAwOworCisgICAgdGVzdEZpcihjb2VmcywgYy5tTCwgYy5tSGFsZk51bUNvZWZzLCBmcCwgZnMsIHBhc3NTdGVwcywgcGFzc1N0ZXBzICogYy5NTCAvKnN0b3BTdGVwcyovLAogICAgICAgICAgICAgcGFzc01pbiwgcGFzc01heCwgcGFzc1JpcHBsZSwgc3RvcE1heCwgc3RvcFJpcHBsZSk7Ci0gICAgcHJpbnRmKCJwYXNzYmFuZCglbGYsICVsZik6ICUuOGxmICUuOGxmICUuOGxmXG4iLCAwLiwgZnAsIHBhc3NNaW4sIHBhc3NNYXgsIHBhc3NSaXBwbGUpOwotICAgIHByaW50Zigic3RvcGJhbmQoJWxmLCAlbGYpOiAlLjhsZiAlLjNsZlxuIiwgZnMsIDAuNSwgc3RvcE1heCwgc3RvcFJpcHBsZSk7CisgICAgQUxPR0QoInBhc3NiYW5kKCVsZiwgJWxmKTogJS44bGYgJS44bGYgJS44bGZcbiIsIDAuLCBmcCwgcGFzc01pbiwgcGFzc01heCwgcGFzc1JpcHBsZSk7CisgICAgQUxPR0QoInN0b3BiYW5kKCVsZiwgJWxmKTogJS44bGYgJS4zbGZcbiIsIGZzLCAwLjUsIHN0b3BNYXgsIHN0b3BSaXBwbGUpOwogI2VuZGlmCiB9CiAKQEAgLTMwNCw2ICszNTksMTEgQEAKICAgICAgICAgbUZpbHRlclNhbXBsZVJhdGUgPSBpblNhbXBsZVJhdGU7CiAgICAgICAgIG1GaWx0ZXJRdWFsaXR5ID0gZ2V0UXVhbGl0eSgpOwogCisgICAgICAgIGRvdWJsZSBzdG9wQmFuZEF0dGVuOworICAgICAgICBkb3VibGUgdGJ3Q2hlYXQgPSAxLjsgLy8gaG93IG11Y2ggd2UgImNoZWF0IiBpbnRvIGFsaWFzaW5nCisgICAgICAgIGludCBoYWxmTGVuZ3RoOworICAgICAgICBkb3VibGUgZmNyID0gMC47CisKICAgICAgICAgLy8gQmVnaW4gS2Fpc2VyIEZpbHRlciBjb21wdXRhdGlvbgogICAgICAgICAvLwogICAgICAgICAvLyBUaGUgcXVhbnRpemF0aW9uIGZsb29yIGZvciBTMTYgaXMgYWJvdXQgOTZkYiAtIDEwKmxvZ18xMCgjbGVuZ3RoKSArIDNkQi4KQEAgLTMxMyw1MiArMzczLDYwIEBACiAgICAgICAgIC8vIDk2LTk4ZEIKICAgICAgICAgLy8KIAotICAgICAgICBkb3VibGUgc3RvcEJhbmRBdHRlbjsKLSAgICAgICAgZG91YmxlIHRid0NoZWF0ID0gMS47IC8vIGhvdyBtdWNoIHdlICJjaGVhdCIgaW50byBhbGlhc2luZwotICAgICAgICBpbnQgaGFsZkxlbmd0aDsKLSAgICAgICAgaWYgKG1GaWx0ZXJRdWFsaXR5ID09IERZTl9ISUdIX1FVQUxJVFkpIHsKLSAgICAgICAgICAgIC8vIDMyYiBjb2VmZmljaWVudHMsIDY0IGxlbmd0aAorICAgICAgICBpZiAobVByb3BlcnR5RW5hYmxlQXRTYW1wbGVSYXRlID49IDAgJiYgbVNhbXBsZVJhdGUgPj0gbVByb3BlcnR5RW5hYmxlQXRTYW1wbGVSYXRlKSB7CisgICAgICAgICAgICAvLyBBbiBhbHRlcm5hdGl2ZSBtZXRob2Qgd2hpY2ggYWxsb3dzIGFsbG93cyBhIGdyZWF0ZXIgZmNyCisgICAgICAgICAgICAvLyBhdCB0aGUgZXhwZW5zZSBvZiBwb3RlbnRpYWwgYWxpYXNpbmcuCisgICAgICAgICAgICBoYWxmTGVuZ3RoID0gbVByb3BlcnR5SGFsZkZpbHRlckxlbmd0aDsKKyAgICAgICAgICAgIHN0b3BCYW5kQXR0ZW4gPSBtUHJvcGVydHlTdG9wYmFuZEF0dGVudWF0aW9uOwogICAgICAgICAgICAgdXNlUzMyID0gdHJ1ZTsKLSAgICAgICAgICAgIHN0b3BCYW5kQXR0ZW4gPSA5OC47Ci0gICAgICAgICAgICBpZiAoaW5TYW1wbGVSYXRlID49IG1TYW1wbGVSYXRlICogNCkgewotICAgICAgICAgICAgICAgIGhhbGZMZW5ndGggPSA0ODsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5TYW1wbGVSYXRlID49IG1TYW1wbGVSYXRlICogMikgewotICAgICAgICAgICAgICAgIGhhbGZMZW5ndGggPSA0MDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaGFsZkxlbmd0aCA9IDMyOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG1GaWx0ZXJRdWFsaXR5ID09IERZTl9MT1dfUVVBTElUWSkgewotICAgICAgICAgICAgLy8gMTZiIGNvZWZmaWNpZW50cywgMTYtMzIgbGVuZ3RoCi0gICAgICAgICAgICB1c2VTMzIgPSBmYWxzZTsKLSAgICAgICAgICAgIHN0b3BCYW5kQXR0ZW4gPSA4MC47Ci0gICAgICAgICAgICBpZiAoaW5TYW1wbGVSYXRlID49IG1TYW1wbGVSYXRlICogNCkgewotICAgICAgICAgICAgICAgIGhhbGZMZW5ndGggPSAyNDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5TYW1wbGVSYXRlID49IG1TYW1wbGVSYXRlICogMikgewotICAgICAgICAgICAgICAgIGhhbGZMZW5ndGggPSAxNjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaGFsZkxlbmd0aCA9IDg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaW5TYW1wbGVSYXRlIDw9IG1TYW1wbGVSYXRlKSB7Ci0gICAgICAgICAgICAgICAgdGJ3Q2hlYXQgPSAxLjA1OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0YndDaGVhdCA9IDEuMDM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7IC8vIERZTl9NRURfUVVBTElUWQotICAgICAgICAgICAgLy8gMTZiIGNvZWZmaWNpZW50cywgMzItNjQgbGVuZ3RoCi0gICAgICAgICAgICAvLyBub3RlOiA+IDY0IGxlbmd0aCBmaWx0ZXJzIHdpdGggMTZiIGNvZWZzIGNhbiBoYXZlIHF1YW50aXphdGlvbiBub2lzZSBwcm9ibGVtcwotICAgICAgICAgICAgdXNlUzMyID0gZmFsc2U7Ci0gICAgICAgICAgICBzdG9wQmFuZEF0dGVuID0gODQuOwotICAgICAgICAgICAgaWYgKGluU2FtcGxlUmF0ZSA+PSBtU2FtcGxlUmF0ZSAqIDQpIHsKLSAgICAgICAgICAgICAgICBoYWxmTGVuZ3RoID0gMzI7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGluU2FtcGxlUmF0ZSA+PSBtU2FtcGxlUmF0ZSAqIDIpIHsKLSAgICAgICAgICAgICAgICBoYWxmTGVuZ3RoID0gMjQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGhhbGZMZW5ndGggPSAxNjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpblNhbXBsZVJhdGUgPD0gbVNhbXBsZVJhdGUpIHsKLSAgICAgICAgICAgICAgICB0YndDaGVhdCA9IDEuMDM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRid0NoZWF0ID0gMS4wMTsKKyAgICAgICAgICAgIGZjciA9IG1JblNhbXBsZVJhdGUgPD0gbVNhbXBsZVJhdGUKKyAgICAgICAgICAgICAgICAgICAgPyAwLjUgOiAwLjUgKiBtU2FtcGxlUmF0ZSAvIG1JblNhbXBsZVJhdGU7CisgICAgICAgICAgICBmY3IgKj0gbVByb3BlcnR5Q3V0b2ZmUGVyY2VudCAvIDEwMC47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobUZpbHRlclF1YWxpdHkgPT0gRFlOX0hJR0hfUVVBTElUWSkgeworICAgICAgICAgICAgICAgIC8vIDMyYiBjb2VmZmljaWVudHMsIDY0IGxlbmd0aAorICAgICAgICAgICAgICAgIHVzZVMzMiA9IHRydWU7CisgICAgICAgICAgICAgICAgc3RvcEJhbmRBdHRlbiA9IDk4LjsKKyAgICAgICAgICAgICAgICBpZiAoaW5TYW1wbGVSYXRlID49IG1TYW1wbGVSYXRlICogNCkgeworICAgICAgICAgICAgICAgICAgICBoYWxmTGVuZ3RoID0gNDg7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpblNhbXBsZVJhdGUgPj0gbVNhbXBsZVJhdGUgKiAyKSB7CisgICAgICAgICAgICAgICAgICAgIGhhbGZMZW5ndGggPSA0MDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBoYWxmTGVuZ3RoID0gMzI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChtRmlsdGVyUXVhbGl0eSA9PSBEWU5fTE9XX1FVQUxJVFkpIHsKKyAgICAgICAgICAgICAgICAvLyAxNmIgY29lZmZpY2llbnRzLCAxNi0zMiBsZW5ndGgKKyAgICAgICAgICAgICAgICB1c2VTMzIgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBzdG9wQmFuZEF0dGVuID0gODAuOworICAgICAgICAgICAgICAgIGlmIChpblNhbXBsZVJhdGUgPj0gbVNhbXBsZVJhdGUgKiA0KSB7CisgICAgICAgICAgICAgICAgICAgIGhhbGZMZW5ndGggPSAyNDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluU2FtcGxlUmF0ZSA+PSBtU2FtcGxlUmF0ZSAqIDIpIHsKKyAgICAgICAgICAgICAgICAgICAgaGFsZkxlbmd0aCA9IDE2OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGhhbGZMZW5ndGggPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaW5TYW1wbGVSYXRlIDw9IG1TYW1wbGVSYXRlKSB7CisgICAgICAgICAgICAgICAgICAgIHRid0NoZWF0ID0gMS4wNTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0YndDaGVhdCA9IDEuMDM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsgLy8gRFlOX01FRF9RVUFMSVRZCisgICAgICAgICAgICAgICAgLy8gMTZiIGNvZWZmaWNpZW50cywgMzItNjQgbGVuZ3RoCisgICAgICAgICAgICAgICAgLy8gbm90ZTogPiA2NCBsZW5ndGggZmlsdGVycyB3aXRoIDE2YiBjb2VmcyBjYW4gaGF2ZSBxdWFudGl6YXRpb24gbm9pc2UgcHJvYmxlbXMKKyAgICAgICAgICAgICAgICB1c2VTMzIgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBzdG9wQmFuZEF0dGVuID0gODQuOworICAgICAgICAgICAgICAgIGlmIChpblNhbXBsZVJhdGUgPj0gbVNhbXBsZVJhdGUgKiA0KSB7CisgICAgICAgICAgICAgICAgICAgIGhhbGZMZW5ndGggPSAzMjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluU2FtcGxlUmF0ZSA+PSBtU2FtcGxlUmF0ZSAqIDIpIHsKKyAgICAgICAgICAgICAgICAgICAgaGFsZkxlbmd0aCA9IDI0OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGhhbGZMZW5ndGggPSAxNjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGluU2FtcGxlUmF0ZSA8PSBtU2FtcGxlUmF0ZSkgeworICAgICAgICAgICAgICAgICAgICB0YndDaGVhdCA9IDEuMDM7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGJ3Q2hlYXQgPSAxLjAxOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0zOTAsOCArNDU4LDEyIEBACiAKICAgICAgICAgLy8gY3JlYXRlIHRoZSBmaWx0ZXIKICAgICAgICAgbUNvbnN0YW50cy5zZXQocGhhc2VzLCBoYWxmTGVuZ3RoLCBpblNhbXBsZVJhdGUsIG1TYW1wbGVSYXRlKTsKLSAgICAgICAgY3JlYXRlS2Fpc2VyRmlyKG1Db25zdGFudHMsIHN0b3BCYW5kQXR0ZW4sCi0gICAgICAgICAgICAgICAgaW5TYW1wbGVSYXRlLCBtU2FtcGxlUmF0ZSwgdGJ3Q2hlYXQpOworICAgICAgICBpZiAoZmNyID4gMC4pIHsKKyAgICAgICAgICAgIGNyZWF0ZUthaXNlckZpcihtQ29uc3RhbnRzLCBzdG9wQmFuZEF0dGVuLCBmY3IpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY3JlYXRlS2Fpc2VyRmlyKG1Db25zdGFudHMsIHN0b3BCYW5kQXR0ZW4sCisgICAgICAgICAgICAgICAgICAgIGluU2FtcGxlUmF0ZSwgbVNhbXBsZVJhdGUsIHRid0NoZWF0KTsKKyAgICAgICAgfQogICAgIH0gLy8gRW5kIEthaXNlciBmaWx0ZXIKIAogICAgIC8vIHVwZGF0ZSBwaGFzZSBhbmQgc3RhdGUgYmFzZWQgb24gdGhlIG5ldyBmaWx0ZXIuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJEeW4uaCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckR5bi5oCmluZGV4IDE4NDBmYzcuLjkyMTQ0ZDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckR5bi5oCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckR5bi5oCkBAIC01NSw2ICs1NSwzOSBAQAogICAgIHZpcnR1YWwgc2l6ZV90IHJlc2FtcGxlKGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCiAgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiBwcm92aWRlcik7CiAKKyAgICAvLyBNYWtlIGF2YWlsYWJsZSBrZXkgZGVzaWduIGNyaXRlcmlhIGZvciB0ZXN0aW5nCisgICAgaW50IGdldEhhbGZMZW5ndGgoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQ29uc3RhbnRzLm1IYWxmTnVtQ29lZnM7CisgICAgfQorCisgICAgY29uc3QgVEMgKmdldEZpbHRlckNvZWZzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUNvbnN0YW50cy5tRmlyQ29lZnM7CisgICAgfQorCisgICAgaW50IGdldFBoYXNlcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Db25zdGFudHMubUw7CisgICAgfQorCisgICAgZG91YmxlIGdldFN0b3BiYW5kQXR0ZW51YXRpb25EYigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TdG9wYmFuZEF0dGVudWF0aW9uRGI7CisgICAgfQorCisgICAgZG91YmxlIGdldFBhc3NiYW5kUmlwcGxlRGIoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUGFzc2JhbmRSaXBwbGVEYjsKKyAgICB9CisKKyAgICBkb3VibGUgZ2V0Tm9ybWFsaXplZFRyYW5zaXRpb25CYW5kd2lkdGgoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtTm9ybWFsaXplZFRyYW5zaXRpb25CYW5kd2lkdGg7CisgICAgfQorCisgICAgZG91YmxlIGdldEZpbHRlckF0dGVudWF0aW9uKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUZpbHRlckF0dGVudWF0aW9uOworICAgIH0KKworICAgIGRvdWJsZSBnZXROb3JtYWxpemVkQ3V0b2ZmRnJlcXVlbmN5KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbU5vcm1hbGl6ZWRDdXRvZmZGcmVxdWVuY3k7CisgICAgfQorCiBwcml2YXRlOgogCiAgICAgY2xhc3MgQ29uc3RhbnRzIHsgLy8gc3RvcmVzIHRoZSBmaWx0ZXIgY29uc3RhbnRzLgpAQCAtMTEyLDYgKzE0NSw4IEBACiAgICAgdm9pZCBjcmVhdGVLYWlzZXJGaXIoQ29uc3RhbnRzICZjLCBkb3VibGUgc3RvcEJhbmRBdHRlbiwKICAgICAgICAgICAgIGludCBpblNhbXBsZVJhdGUsIGludCBvdXRTYW1wbGVSYXRlLCBkb3VibGUgdGJ3Q2hlYXQpOwogCisgICAgdm9pZCBjcmVhdGVLYWlzZXJGaXIoQ29uc3RhbnRzICZjLCBkb3VibGUgc3RvcEJhbmRBdHRlbiwgZG91YmxlIGZjcik7CisKICAgICB0ZW1wbGF0ZTxpbnQgQ0hBTk5FTFMsIGJvb2wgTE9DS0VELCBpbnQgU1RSSURFPgogICAgIHNpemVfdCByZXNhbXBsZShUTyogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwgQXVkaW9CdWZmZXJQcm92aWRlciogcHJvdmlkZXIpOwogCkBAIC0xMjcsNiArMTYyLDM4IEBACiAgICAgICAgICAgICBpbnQzMl90IG1GaWx0ZXJTYW1wbGVSYXRlOyAvLyBkZXNpZ25lZCBmaWx0ZXIgc2FtcGxlIHJhdGUuCiAgICAgICAgIHNyY19xdWFsaXR5IG1GaWx0ZXJRdWFsaXR5OyAgICAvLyBkZXNpZ25lZCBmaWx0ZXIgcXVhbGl0eS4KICAgICAgICAgICAgICAgdm9pZCogbUNvZWZCdWZmZXI7ICAgICAgIC8vIGlmIGEgZmlsdGVyIGlzIGNyZWF0ZWQsIHRoaXMgaXMgbm90IG51bGwKKworICAgIC8vIFByb3BlcnR5IHNlbGVjdGVkIGRlc2lnbiBwYXJhbWV0ZXJzLgorICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgZW5hYmxlIGZpeGVkIGhpZ2ggcXVhbGl0eSByZXNhbXBsaW5nLgorCisgICAgICAgICAgICAgIC8vIDMyIGNoYXIgUFJPUF9OQU1FX01BWCBsaW1pdCBlbmZvcmNlZCBiZWZvcmUgQW5kcm9pZCBPCisKKyAgICAgICAgICAgICAgLy8gVXNlIGZvciBzYW1wbGUgcmF0ZXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoaXMgdmFsdWUuCisgICAgICAgICAgICAgIC8vIFNldCB0byBub24tbmVnYXRpdmUgdG8gZW5hYmxlLCBuZWdhdGl2ZSB0byBkaXNhYmxlLgorICAgICAgICAgICAgICBpbnQzMl90IG1Qcm9wZXJ0eUVuYWJsZUF0U2FtcGxlUmF0ZSA9IDQ4MDAwOworICAgICAgICAgICAgICAgICAgICAgIC8vICJyby5hdWRpby5yZXNhbXBsZXIucHNkLmVuYWJsZV9hdF9zYW1wbGVyYXRlIgorCisgICAgICAgICAgICAgIC8vIFNwZWNpZnkgSEFMRiB0aGUgcmVzYW1wbGluZyBmaWx0ZXIgbGVuZ3RoLgorICAgICAgICAgICAgICAvLyBTZXQgdG8gYSB2YWx1ZSB3aGljaCBpcyBhIG11bHRpcGxlIG9mIDQuCisgICAgICAgICAgICAgIGludDMyX3QgbVByb3BlcnR5SGFsZkZpbHRlckxlbmd0aCA9IDMyOworICAgICAgICAgICAgICAgICAgICAgIC8vICJyby5hdWRpby5yZXNhbXBsZXIucHNkLmhhbGZsZW5ndGgiCisKKyAgICAgICAgICAgICAgLy8gU3BlY2lmeSB0aGUgc3RvcGJhbmQgYXR0ZW51YXRpb24gaW4gcG9zaXRpdmUgZEIuCisgICAgICAgICAgICAgIC8vIFNldCB0byBhIHZhbHVlIGdyZWF0ZXIgb3IgZXF1YWwgdG8gMjAuCisgICAgICAgICAgICAgIGludDMyX3QgbVByb3BlcnR5U3RvcGJhbmRBdHRlbnVhdGlvbiA9IDkwOworICAgICAgICAgICAgICAgICAgICAgIC8vICJyby5hdWRpby5yZXNhbXBsZXIucHNkLnN0b3BiYW5kIgorCisgICAgICAgICAgICAgIC8vIFNwZWNpZnkgdGhlIGN1dG9mZiBmcmVxdWVuY3kgYXMgYSBwZXJjZW50YWdlIG9mIE55cXVpc3QuCisgICAgICAgICAgICAgIC8vIFNldCB0byBhIHZhbHVlIGJldHdlZW4gNTAgYW5kIDEwMC4KKyAgICAgICAgICAgICAgaW50MzJfdCBtUHJvcGVydHlDdXRvZmZQZXJjZW50ID0gMTAwOworICAgICAgICAgICAgICAgICAgICAgIC8vICJyby5hdWRpby5yZXNhbXBsZXIucHNkLmN1dG9mZl9wZXJjZW50IgorCisgICAgLy8gRmlsdGVyIGNyZWF0aW9uIGRlc2lnbiBwYXJhbWV0ZXJzLCBzZWUgc2V0U2FtcGxlUmF0ZSgpCisgICAgICAgICAgICAgZG91YmxlIG1TdG9wYmFuZEF0dGVudWF0aW9uRGIgPSAwLjsKKyAgICAgICAgICAgICBkb3VibGUgbVBhc3NiYW5kUmlwcGxlRGIgPSAwLjsKKyAgICAgICAgICAgICBkb3VibGUgbU5vcm1hbGl6ZWRUcmFuc2l0aW9uQmFuZHdpZHRoID0gMC47CisgICAgICAgICAgICAgZG91YmxlIG1GaWx0ZXJBdHRlbnVhdGlvbiA9IDAuOworICAgICAgICAgICAgIGRvdWJsZSBtTm9ybWFsaXplZEN1dG9mZkZyZXF1ZW5jeSA9IDAuOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRmlyR2VuLmggYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJGaXJHZW4uaAppbmRleCBhZDE4OTY1Li4zOWNhZmViIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJGaXJHZW4uaAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJGaXJHZW4uaApAQCAtNTQ2LDggKzU0Niw5IEBACiAgICAgICAgIH0KICAgICAgICAgd3N0YXJ0ICs9IHdzdGVwOwogICAgIH0KLSAgICAvLyByZW5vcm1hbGl6ZSAtIHRoaXMgaXMgb25seSBuZWVkZWQgZm9yIGludGVnZXIgZmlsdGVyIHR5cGVzCi0gICAgZG91YmxlIG5vcm0gPSAxLi8oKDFVTEw8PChzaXplb2YoVCkqOC0xKSkqTCk7CisgICAgLy8gcmVub3JtYWxpemUgLSB0aGlzIGlzIG5lZWRlZCBmb3IgaW50ZWdlciBmaWx0ZXIgdHlwZXMsIHVzZSAxIGZvciBmbG9hdCBvciBkb3VibGUuCisgICAgY29uc3RleHByIGludDY0X3QgaW50ZWdyYWxTaGlmdCA9IHN0ZDo6aXNfaW50ZWdyYWw8VD46OnZhbHVlID8gKHNpemVvZihUKSAqIDggLSAxKSA6IDA7CisgICAgY29uc3QgZG91YmxlIG5vcm0gPSAxLiAvIChMIDw8IGludGVncmFsU2hpZnQpOwogCiAgICAgZmlyTWluID0gZm1pbiAqIG5vcm07CiAgICAgZmlyTWF4ID0gZm1heCAqIG5vcm07CkBAIC01NTcsOSArNTU4LDEyIEBACiAgKiBldmFsdWF0ZXMgdGhlIHxIKGYpfCBsb3dwYXNzIGJhbmQgY2hhcmFjdGVyaXN0aWNzLgogICoKICAqIFRoaXMgZnVuY3Rpb24gdGVzdHMgdGhlIGxvd3Bhc3MgY2hhcmFjdGVyaXN0aWNzIGZvciB0aGUgb3ZlcmFsbCBwb2x5cGhhc2UgZmlsdGVyLAotICogYW5kIGlzIHVzZWQgdG8gdmVyaWZ5IHRoZSBkZXNpZ24uICBGb3IgdGhpcyBjYXNlLCBmcCBzaG91bGQgYmUgc2V0IHRvIHRoZQorICogYW5kIGlzIHVzZWQgdG8gdmVyaWZ5IHRoZSBkZXNpZ24uCisgKgorICogRm9yIGEgcG9seXBoYXNlIGZpbHRlciAoTCA+IDEpLCB0eXBpY2FsbHkgZnAgc2hvdWxkIGJlIHNldCB0byB0aGUKICAqIHBhc3NiYW5kIG5vcm1hbGl6ZWQgZnJlcXVlbmN5IGZyb20gMCB0byAwLjUgZm9yIHRoZSBvdmVyYWxsIGZpbHRlciAodGh1cyBpdAogICogaXMgdGhlIGRlc2lnbmVkIHBvbHlwaGFzZSBiYW5rIHZhbHVlIC8gTCkuICBMaWtld2lzZSBmb3IgZnMuCisgKiBTaW1pbGFybHkgdGhlIHN0b3BTdGVwcyBzaG91bGQgYmUgTCAqIHBhc3NTdGVwcyBmb3IgZXF1aXZhbGVudCBhY2N1cmFjeS4KICAqCiAgKiBAcGFyYW0gY29lZiBpcyB0aGUgZGVzaWduZWQgcG9seXBoYXNlIGZpbHRlciBiYW5rcwogICoKQEAgLTYxMCw2ICs2MTQsNzQgQEAKIH0KIAogLyoKKyAqIEVzdGltYXRlIHRoZSB3aW5kb3dlZCBzaW5jIG1pbmltdW0gcGFzc2JhbmQgdmFsdWUuCisgKgorICogVGhpcyBpcyB0aGUgbWluaW11bSB2YWx1ZSBmb3IgYSB3aW5kb3dlZCBzaW5jIGZpbHRlciBpbiBpdHMgcGFzc2JhbmQsCisgKiB3aGljaCBpcyBpZGVudGljYWwgdG8gdGhlIHNjYWxpbmcgcmVxdWlyZWQgbm90IHRvIGNhdXNlIG92ZXJmbG93IG9mIGEgMGRCRlMgc2lnbmFsLgorICogVGhlIGFjdHVhbCB2YWx1ZSB1c2VkIHRvIGF0dGVudWF0ZSB0aGUgZmlsdGVyIGFtcGxpdHVkZSBzaG91bGQgYmUgc2xpZ2h0bHkKKyAqIHNtYWxsZXIgdGhhbiB0aGlzIChzdWdnZXN0IHNxdWFyaW5nKSBhcyB0aGlzIGlzIGp1c3QgYW4gZXN0aW1hdGUuCisgKgorICogQXMgYSB3aW5kb3dlZCBzaW5jIGhhcyBhIHBhc3NiYW5kIHJpcHBsZSBjb21tZW5zdXJhdGUgdG8gdGhlIHN0b3BiYW5kIGF0dGVudWF0aW9uCisgKiBkdWUgdG8gR2liYidzIHBoZW5vbWVub24gZnJvbSB0cnVuY2F0aW5nIHRoZSBzaW5jLCB3ZSBkZXJpdmUgdGhpcyB2YWx1ZSBmcm9tCisgKiB0aGUgZGVzaWduIHN0b3BiYW5kQXR0ZW51YXRpb25EYiAoYSBwb3NpdGl2ZSB2YWx1ZSkuCisgKi8KK3N0YXRpYyBpbmxpbmUgZG91YmxlIGNvbXB1dGVXaW5kb3dlZFNpbmNNaW5pbXVtUGFzc2JhbmRWYWx1ZSgKKyAgICAgICAgZG91YmxlIHN0b3BCYW5kQXR0ZW51YXRpb25EYikgeworICAgIHJldHVybiAxLiAtIHBvdygxMC4gLyogYmFzZSAqLywgc3RvcEJhbmRBdHRlbnVhdGlvbkRiICogKC0xLiAvIDIwLikpOworfQorCisvKgorICogQ29tcHV0ZSB0aGUgd2luZG93ZWQgc2luYyBwYXNzYmFuZCByaXBwbGUgZnJvbSBzdG9wYmFuZCBhdHRlbnVhdGlvbi4KKyAqCisgKiBBcyBhIHdpbmRvd2VkIHNpbmMgaGFzIGFuIHBhc3NiYW5kIHJpcHBsZSBjb21tZW5zdXJhdGUgdG8gdGhlIHN0b3BiYW5kIGF0dGVudWF0aW9uCisgKiBkdWUgdG8gR2liYidzIHBoZW5vbWVub24gZnJvbSB0cnVuY2F0aW5nIHRoZSBzaW5jLCB3ZSBkZXJpdmUgdGhpcyB2YWx1ZSBmcm9tCisgKiB0aGUgZGVzaWduIHN0b3BiYW5kQXR0ZW51YXRpb25EYiAoYSBwb3NpdGl2ZSB2YWx1ZSkuCisgKi8KK3N0YXRpYyBpbmxpbmUgZG91YmxlIGNvbXB1dGVXaW5kb3dlZFNpbmNQYXNzYmFuZFJpcHBsZURiKAorICAgICAgICBkb3VibGUgc3RvcEJhbmRBdHRlbnVhdGlvbkRiKSB7CisgICAgcmV0dXJuIC0yMC4gKiBsb2cxMChjb21wdXRlV2luZG93ZWRTaW5jTWluaW11bVBhc3NiYW5kVmFsdWUoc3RvcEJhbmRBdHRlbnVhdGlvbkRiKSk7Cit9CisKKy8qCisgKiBLYWlzZXIgd2luZG93IEJldGEgdmFsdWUKKyAqCisgKiBGb3JtdWxhIDMuMi41LCAzLjIuNywgVmFpZHlhbmF0aGFuLCBfTXVsdGlyYXRlIFN5c3RlbXMgYW5kIEZpbHRlciBCYW5rc18sIHAuIDQ4CisgKiBGb3JtdWxhIDcuNzUsIE9wcGVuaGVpbSBhbmQgU2NoYWZlciwgX0Rpc2NyZXRlLXRpbWUgU2lnbmFsIFByb2Nlc3NpbmcsIDNlXywgcC4gNTQyCisgKgorICogU2VlIGFsc286IGh0dHA6Ly9tZWxvZGkuZWUud2FzaGluZ3Rvbi5lZHUvY291cnNlcy9lZTUxOC9ub3Rlcy9sZWMxNy5wZGYKKyAqCisgKiBLYWlzZXIgd2luZG93IGFuZCBiZXRhIHBhcmFtZXRlcgorICoKKyAqICAgICAgICAgfCAwLjExMDIqKEEgLSA4LjcpICAgICAgICAgICAgICAgICAgICAgICAgIEEgPiA1MAorICogIEJldGEgPSB8IDAuNTg0MiooQSAtIDIxKV4wLjQgKyAwLjA3ODg2KihBIC0gMjEpICAgMjEgPCBBIDw9IDUwCisgKiAgICAgICAgIHwgMC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBIDw9IDIxCisgKgorICogd2l0aCBBIGlzIHRoZSBkZXNpcmVkIHN0b3AtYmFuZCBhdHRlbnVhdGlvbiBpbiBwb3NpdGl2ZSBkQkZTCisgKgorICogICAgMzAgZEIgICAgMi4yMTAKKyAqICAgIDQwIGRCICAgIDMuMzg0CisgKiAgICA1MCBkQiAgICA0LjUzOAorICogICAgNjAgZEIgICAgNS42NTgKKyAqICAgIDcwIGRCICAgIDYuNzY0CisgKiAgICA4MCBkQiAgICA3Ljg2NQorICogICAgOTAgZEIgICAgOC45NjAKKyAqICAgMTAwIGRCICAgMTAuMDU2CisgKgorICogRm9yIHNvbWUgdmFsdWVzIG9mIHN0b3BCYW5kQXR0ZW51YXRpb25EYiB0aGUgZnVuY3Rpb24gbWF5IGJlIGNvbXB1dGVkCisgKiBhdCBjb21waWxlIHRpbWUuCisgKi8KK3N0YXRpYyBpbmxpbmUgY29uc3RleHByIGRvdWJsZSBjb21wdXRlQmV0YShkb3VibGUgc3RvcEJhbmRBdHRlbnVhdGlvbkRiKSB7CisgICAgaWYgKHN0b3BCYW5kQXR0ZW51YXRpb25EYiA+IDUwLikgeworICAgICAgICByZXR1cm4gMC4xMTAyICogKHN0b3BCYW5kQXR0ZW51YXRpb25EYiAtIDguNyk7CisgICAgfQorICAgIGNvbnN0IGRvdWJsZSBvZmZzZXQgPSBzdG9wQmFuZEF0dGVudWF0aW9uRGIgLSAyMS47CisgICAgaWYgKG9mZnNldCA+IDAuKSB7CisgICAgICAgIHJldHVybiAwLjU4NDIgKiBwb3cob2Zmc2V0LCAwLjQpICsgMC4wNzg4NiAqIG9mZnNldDsKKyAgICB9CisgICAgcmV0dXJuIDAuOworfQorCisvKgogICogQ2FsY3VsYXRlcyB0aGUgb3ZlcmFsbCBwb2x5cGhhc2UgZmlsdGVyIGJhc2VkIG9uIGEgd2luZG93ZWQgc2luYyBmdW5jdGlvbi4KICAqCiAgKiBUaGUgd2luZG93ZWQgc2luYyBpcyBhbiBvZGQgbGVuZ3RoIHN5bW1ldHJpYyBmaWx0ZXIgb2YgZXhhY3RseSBMKmhhbGZOdW1Db2VmKjIrMQpAQCAtNjQyLDMxICs3MTQsOCBAQAogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiBzdGF0aWMgaW5saW5lIHZvaWQgZmlyS2Fpc2VyR2VuKFQqIGNvZWYsIGludCBMLCBpbnQgaGFsZk51bUNvZWYsCiAgICAgICAgIGRvdWJsZSBzdG9wQmFuZEF0dGVuLCBkb3VibGUgZmNyLCBkb3VibGUgYXR0ZW4pIHsKLSAgICAvLwotICAgIC8vIEZvcm11bGEgMy4yLjUsIDMuMi43LCBWYWlkeWFuYXRoYW4sIF9NdWx0aXJhdGUgU3lzdGVtcyBhbmQgRmlsdGVyIEJhbmtzXywgcC4gNDgKLSAgICAvLyBGb3JtdWxhIDcuNzUsIE9wcGVuaGVpbSBhbmQgU2NoYWZlciwgX0Rpc2NyZXRlLXRpbWUgU2lnbmFsIFByb2Nlc3NpbmcsIDNlXywgcC4gNTQyCi0gICAgLy8KLSAgICAvLyBTZWUgYWxzbzogaHR0cDovL21lbG9kaS5lZS53YXNoaW5ndG9uLmVkdS9jb3Vyc2VzL2VlNTE4L25vdGVzL2xlYzE3LnBkZgotICAgIC8vCi0gICAgLy8gS2Fpc2VyIHdpbmRvdyBhbmQgYmV0YSBwYXJhbWV0ZXIKLSAgICAvLwotICAgIC8vICAgICAgICAgfCAwLjExMDIqKEEgLSA4LjcpICAgICAgICAgICAgICAgICAgICAgICAgIEEgPiA1MAotICAgIC8vICBiZXRhID0gfCAwLjU4NDIqKEEgLSAyMSleMC40ICsgMC4wNzg4NiooQSAtIDIxKSAgIDIxIDw9IEEgPD0gNTAKLSAgICAvLyAgICAgICAgIHwgMC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBIDwgMjEKLSAgICAvLwotICAgIC8vIHdpdGggQSBpcyB0aGUgZGVzaXJlZCBzdG9wLWJhbmQgYXR0ZW51YXRpb24gaW4gZEJGUwotICAgIC8vCi0gICAgLy8gICAgMzAgZEIgICAgMi4yMTAKLSAgICAvLyAgICA0MCBkQiAgICAzLjM4NAotICAgIC8vICAgIDUwIGRCICAgIDQuNTM4Ci0gICAgLy8gICAgNjAgZEIgICAgNS42NTgKLSAgICAvLyAgICA3MCBkQiAgICA2Ljc2NAotICAgIC8vICAgIDgwIGRCICAgIDcuODY1Ci0gICAgLy8gICAgOTAgZEIgICAgOC45NjAKLSAgICAvLyAgIDEwMCBkQiAgIDEwLjA1NgotCiAgICAgY29uc3QgaW50IE4gPSBMICogaGFsZk51bUNvZWY7IC8vIG5vbi1uZWdhdGl2ZSBoYWxmCi0gICAgY29uc3QgZG91YmxlIGJldGEgPSAwLjExMDIgKiAoc3RvcEJhbmRBdHRlbiAtIDguNyk7IC8vID49IDUwZEIgYWx3YXlzCisgICAgY29uc3QgZG91YmxlIGJldGEgPSBjb21wdXRlQmV0YShzdG9wQmFuZEF0dGVuKTsKICAgICBjb25zdCBkb3VibGUgeHN0ZXAgPSAoMi4gKiBNX1BJKSAqIGZjciAvIEw7CiAgICAgY29uc3QgZG91YmxlIHhmcmFjID0gMS4gLyBOOwogICAgIGNvbnN0IGRvdWJsZSB5c2NhbGUgPSBhdHRlbiAqIEwgLyAoSTAoYmV0YSkgKiBNX1BJKTsKQEAgLTY5Niw5ICs3NDUsOSBAQAogICAgICAgICAgICAgICAgIHNnLmFkdmFuY2UoKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGlzX3NhbWU8VCwgaW50MTZfdD46OnZhbHVlKSB7IC8vIGludDE2X3QgbmVlZHMgbm9pc2Ugc2hhcGluZworICAgICAgICAgICAgaWYgKHN0ZDo6aXNfc2FtZTxULCBpbnQxNl90Pjo6dmFsdWUpIHsgLy8gaW50MTZfdCBuZWVkcyBub2lzZSBzaGFwaW5nCiAgICAgICAgICAgICAgICAgKmNvZWYrKyA9IHN0YXRpY19jYXN0PFQ+KHRvaW50KHksIDFVTEw8PChzaXplb2YoVCkqOC0xKSwgZXJyKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlzX3NhbWU8VCwgaW50MzJfdD46OnZhbHVlKSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0ZDo6aXNfc2FtZTxULCBpbnQzMl90Pjo6dmFsdWUpIHsKICAgICAgICAgICAgICAgICAqY29lZisrID0gc3RhdGljX2Nhc3Q8VD4odG9pbnQoeSwgMVVMTDw8KHNpemVvZihUKSo4LTEpKSk7CiAgICAgICAgICAgICB9IGVsc2UgeyAvLyBhc3N1bWVkIGZsb2F0IG9yIGRvdWJsZQogICAgICAgICAgICAgICAgICpjb2VmKysgPSBzdGF0aWNfY2FzdDxUPih5KTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9CdWZmZXJQcm92aWRlcnMuY3BwIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0J1ZmZlclByb3ZpZGVycy5jcHAKaW5kZXggODYyZmVmNi4uMmQ5ZTFjYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0J1ZmZlclByb3ZpZGVycy5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0J1ZmZlclByb3ZpZGVycy5jcHAKQEAgLTE4Myw3ICsxODMsNyBAQAogICAgICBtT3V0RnJhbWVTaXplID0KICAgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCkgKiBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sob3V0cHV0Q2hhbm5lbE1hc2spOwogICAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgIHN0YXR1cyA9IEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZTo6bWlycm9yKAorICAgICBzdGF0dXMgPSBtRWZmZWN0c0ZhY3RvcnktPm1pcnJvckJ1ZmZlcigKICAgICAgICAgICAgICBudWxscHRyLCBtSW5GcmFtZVNpemUgKiBidWZmZXJGcmFtZUNvdW50LCAmbUluQnVmZmVyKTsKICAgICAgaWYgKHN0YXR1cyAhPSAwKSB7CiAgICAgICAgICBBTE9HRSgiRG93bm1peGVyQnVmZmVyUHJvdmlkZXIoKSBlcnJvciAlZCB3aGlsZSBjcmVhdGluZyBpbnB1dCBidWZmZXIiLCBzdGF0dXMpOwpAQCAtMTkxLDcgKzE5MSw3IEBACiAgICAgICAgICBtRWZmZWN0c0ZhY3RvcnkuY2xlYXIoKTsKICAgICAgICAgIHJldHVybjsKICAgICAgfQotICAgICBzdGF0dXMgPSBFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U6Om1pcnJvcigKKyAgICAgc3RhdHVzID0gbUVmZmVjdHNGYWN0b3J5LT5taXJyb3JCdWZmZXIoCiAgICAgICAgICAgICAgbnVsbHB0ciwgbU91dEZyYW1lU2l6ZSAqIGJ1ZmZlckZyYW1lQ291bnQsICZtT3V0QnVmZmVyKTsKICAgICAgaWYgKHN0YXR1cyAhPSAwKSB7CiAgICAgICAgICBBTE9HRSgiRG93bm1peGVyQnVmZmVyUHJvdmlkZXIoKSBlcnJvciAlZCB3aGlsZSBjcmVhdGluZyBvdXRwdXQgYnVmZmVyIiwgc3RhdHVzKTsKQEAgLTM3Niw2ICszNzYsMjMgQEAKICAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KGRzdCwgbU91dHB1dEZvcm1hdCwgc3JjLCBtSW5wdXRGb3JtYXQsIGZyYW1lcyAqIG1DaGFubmVsQ291bnQpOwogfQogCitDbGFtcEZsb2F0QnVmZmVyUHJvdmlkZXI6OkNsYW1wRmxvYXRCdWZmZXJQcm92aWRlcihpbnQzMl90IGNoYW5uZWxDb3VudCwgc2l6ZV90IGJ1ZmZlckZyYW1lQ291bnQpIDoKKyAgICAgICAgQ29weUJ1ZmZlclByb3ZpZGVyKAorICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoQVVESU9fRk9STUFUX1BDTV9GTE9BVCksCisgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShBVURJT19GT1JNQVRfUENNX0ZMT0FUKSwKKyAgICAgICAgICAgICAgICBidWZmZXJGcmFtZUNvdW50KSwKKyAgICAgICAgbUNoYW5uZWxDb3VudChjaGFubmVsQ291bnQpCit7CisgICAgQUxPR1YoIkNsYW1wRmxvYXRCdWZmZXJQcm92aWRlciglcCkoJXUpIiwgdGhpcywgY2hhbm5lbENvdW50KTsKK30KKwordm9pZCBDbGFtcEZsb2F0QnVmZmVyUHJvdmlkZXI6OmNvcHlGcmFtZXModm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBmcmFtZXMpCit7CisgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21fZmxvYXRfd2l0aF9jbGFtcGluZygoZmxvYXQqKWRzdCwgKGNvbnN0IGZsb2F0KilzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXMgKiBtQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxPQVRfTk9NSU5BTF9SQU5HRV9IRUFEUk9PTSk7Cit9CisKIFRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXI6OlRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIoaW50MzJfdCBjaGFubmVsQ291bnQsCiAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgdWludDMyX3Qgc2FtcGxlUmF0ZSwgY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnBsYXliYWNrUmF0ZSkgOgogICAgICAgICBtQ2hhbm5lbENvdW50KGNoYW5uZWxDb3VudCksCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvT1dORVJTIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmQwZWEwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL09XTkVSUwpAQCAtMCwwICsxLDMgQEAKK2drYXN0ZW5AZ29vZ2xlLmNvbQoraHVuZ2FAZ29vZ2xlLmNvbQorcmFnb0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9idWlsZF9hbmRfcnVuX2FsbF91bml0X3Rlc3RzLnNoCmluZGV4IDcwNGQwOTUuLmVmZWY0MTcgMTAwNzU1Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9idWlsZF9hbmRfcnVuX2FsbF91bml0X3Rlc3RzLnNoCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9idWlsZF9hbmRfcnVuX2FsbF91bml0X3Rlc3RzLnNoCkBAIC0xNCw4ICsxNCw4IEBACiAKIGVjaG8gIndhaXRpbmcgZm9yIGRldmljZSIKIGFkYiByb290ICYmIGFkYiB3YWl0LWZvci1kZXZpY2UgcmVtb3VudAotYWRiIHB1c2ggJE9VVC9zeXN0ZW0vbGliL2xpYmF1ZGlvcmVzYW1wbGVyLnNvIC9zeXN0ZW0vbGliCi1hZGIgcHVzaCAkT1VUL3N5c3RlbS9saWI2NC9saWJhdWRpb3Jlc2FtcGxlci5zbyAvc3lzdGVtL2xpYjY0CithZGIgcHVzaCAkT1VUL3N5c3RlbS9saWIvbGliYXVkaW9wcm9jZXNzaW5nLnNvIC9zeXN0ZW0vbGliCithZGIgcHVzaCAkT1VUL3N5c3RlbS9saWI2NC9saWJhdWRpb3Byb2Nlc3Npbmcuc28gL3N5c3RlbS9saWI2NAogYWRiIHB1c2ggJE9VVC9kYXRhL25hdGl2ZXRlc3QvcmVzYW1wbGVyX3Rlc3RzL3Jlc2FtcGxlcl90ZXN0cyAvZGF0YS9uYXRpdmV0ZXN0L3Jlc2FtcGxlcl90ZXN0cy9yZXNhbXBsZXJfdGVzdHMKIGFkYiBwdXNoICRPVVQvZGF0YS9uYXRpdmV0ZXN0NjQvcmVzYW1wbGVyX3Rlc3RzL3Jlc2FtcGxlcl90ZXN0cyAvZGF0YS9uYXRpdmV0ZXN0NjQvcmVzYW1wbGVyX3Rlc3RzL3Jlc2FtcGxlcl90ZXN0cwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvcmVzYW1wbGVyX3Rlc3RzLmNwcCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9yZXNhbXBsZXJfdGVzdHMuY3BwCmluZGV4IGEyM2MwMDAuLmUxNjIzZjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9yZXNhbXBsZXJfdGVzdHMuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9yZXNhbXBsZXJfdGVzdHMuY3BwCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKICNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8dXRpbGl0eT4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKQEAgLTM3LDYgKzM4LDggQEAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb0J1ZmZlclByb3ZpZGVyLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlci5oPgorI2luY2x1ZGUgIi4uL0F1ZGlvUmVzYW1wbGVyRHluLmgiCisjaW5jbHVkZSAiLi4vQXVkaW9SZXNhbXBsZXJGaXJHZW4uaCIKICNpbmNsdWRlICJ0ZXN0X3V0aWxzLmgiCiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgpAQCAtMjQyLDYgKzI0NSw2MCBAQAogICAgIGRlbGV0ZSByZXNhbXBsZXI7CiB9CiAKK3ZvaWQgdGVzdEZpbHRlclJlc3BvbnNlKAorICAgICAgICBzaXplX3QgY2hhbm5lbHMsIHVuc2lnbmVkIGlucHV0RnJlcSwgdW5zaWduZWQgb3V0cHV0RnJlcSkKK3sKKyAgICAvLyBjcmVhdGUgcmVzYW1wbGVyCisgICAgdXNpbmcgUmVzYW1wbGVyVHlwZSA9IGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyRHluPGZsb2F0LCBmbG9hdCwgZmxvYXQ+OworICAgIHN0ZDo6dW5pcXVlX3B0cjxSZXNhbXBsZXJUeXBlPiByZHluKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVzYW1wbGVyVHlwZSAqPigKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OmNyZWF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNX0ZMT0FULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEZyZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkRZTl9ISUdIX1FVQUxJVFkpKSk7CisgICAgcmR5bi0+c2V0U2FtcGxlUmF0ZShpbnB1dEZyZXEpOworCisgICAgLy8gZ2V0IGRlc2lnbiBwYXJhbWV0ZXJzCisgICAgY29uc3QgaW50IHBoYXNlcyA9IHJkeW4tPmdldFBoYXNlcygpOworICAgIGNvbnN0IGludCBoYWxmTGVuZ3RoID0gcmR5bi0+Z2V0SGFsZkxlbmd0aCgpOworICAgIGNvbnN0IGZsb2F0ICpjb2VmcyA9IHJkeW4tPmdldEZpbHRlckNvZWZzKCk7CisgICAgY29uc3QgZG91YmxlIGZjciA9IHJkeW4tPmdldE5vcm1hbGl6ZWRDdXRvZmZGcmVxdWVuY3koKTsKKyAgICBjb25zdCBkb3VibGUgdGJ3ID0gcmR5bi0+Z2V0Tm9ybWFsaXplZFRyYW5zaXRpb25CYW5kd2lkdGgoKTsKKyAgICBjb25zdCBkb3VibGUgYXR0ZW51YXRpb24gPSByZHluLT5nZXRGaWx0ZXJBdHRlbnVhdGlvbigpOworICAgIGNvbnN0IGRvdWJsZSBzdG9wYmFuZERiID0gcmR5bi0+Z2V0U3RvcGJhbmRBdHRlbnVhdGlvbkRiKCk7CisgICAgY29uc3QgZG91YmxlIHBhc3NiYW5kRGIgPSByZHluLT5nZXRQYXNzYmFuZFJpcHBsZURiKCk7CisgICAgY29uc3QgZG91YmxlIGZwID0gZmNyIC0gdGJ3IC8gMjsKKyAgICBjb25zdCBkb3VibGUgZnMgPSBmY3IgKyB0YncgLyAyOworCisgICAgcHJpbnRmKCJpbnB1dEZyZXE6JWQgb3V0cHV0RnJlcTolZCBkZXNpZ24iCisgICAgICAgICAgICAiIHBoYXNlczolZCBoYWxmTGVuZ3RoOiVkIgorICAgICAgICAgICAgIiBmY3I6JWxmIGZwOiVsZiBmczolbGYgdGJ3OiVsZiIKKyAgICAgICAgICAgICIgYXR0ZW51YXRpb246JWxmIHN0b3BSaXBwbGU6JS5sZiBwYXNzUmlwcGxlOiVsZiIKKyAgICAgICAgICAgICJcbiIsCisgICAgICAgICAgICBpbnB1dEZyZXEsIG91dHB1dEZyZXEsCisgICAgICAgICAgICBwaGFzZXMsIGhhbGZMZW5ndGgsCisgICAgICAgICAgICBmY3IsIGZwLCBmcywgdGJ3LAorICAgICAgICAgICAgYXR0ZW51YXRpb24sIHN0b3BiYW5kRGIsIHBhc3NiYW5kRGIpOworCisgICAgLy8gdmVyaWZ5IGRlc2lnbiBwYXJhbWV0ZXJzCisgICAgY29uc3RleHByIGludDMyX3QgcGFzc1N0ZXBzID0gMTAwMDsKKyAgICBkb3VibGUgcGFzc01pbiwgcGFzc01heCwgcGFzc1JpcHBsZSwgc3RvcE1heCwgc3RvcFJpcHBsZTsKKyAgICBhbmRyb2lkOjp0ZXN0RmlyKGNvZWZzLCBwaGFzZXMsIGhhbGZMZW5ndGgsIGZwIC8gcGhhc2VzLCBmcyAvIHBoYXNlcywKKyAgICAgICAgICAgIHBhc3NTdGVwcywgcGhhc2VzICogcGFzc1N0ZXBzIC8qIHN0b3BTdGVwcyAqLywKKyAgICAgICAgICAgIHBhc3NNaW4sIHBhc3NNYXgsIHBhc3NSaXBwbGUsCisgICAgICAgICAgICBzdG9wTWF4LCBzdG9wUmlwcGxlKTsKKyAgICBwcmludGYoImlucHV0RnJlcTolZCBvdXRwdXRGcmVxOiVkIHZlcmlmeSIKKyAgICAgICAgICAgICIgcGFzc01pbjolbGYgcGFzc01heDolbGYgcGFzc1JpcHBsZTolbGYgc3RvcE1heDolbGYgc3RvcFJpcHBsZTolbGYiCisgICAgICAgICAgICAiXG4iLAorICAgICAgICAgICAgaW5wdXRGcmVxLCBvdXRwdXRGcmVxLAorICAgICAgICAgICAgcGFzc01pbiwgcGFzc01heCwgcGFzc1JpcHBsZSwgc3RvcE1heCwgc3RvcFJpcHBsZSk7CisKKyAgICBBU1NFUlRfR1Qoc3RvcFJpcHBsZSwgNjAuKTsgIC8vIGVub3VnaCBzdG9wYmFuZCBhdHRlbnVhdGlvbgorICAgIEFTU0VSVF9MVChwYXNzUmlwcGxlLCAwLjIpOyAgLy8gc21hbGwgcGFzc2JhbmQgcmlwcGxlCisgICAgQVNTRVJUX0dUKHBhc3NNaW4sIDAuOTkpOyAgICAvLyB3ZSBkbyBub3QgYXR0ZW51YXRlIHRoZSBzaWduYWwgKGlkZWFsbHkgMS4pCit9CisKIC8qIEJ1ZmZlciBpbmNyZW1lbnQgdGVzdAogICoKICAqIFdlIGNvbXBhcmUgYSByZWZlcmVuY2Ugb3V0cHV0LCB3aGVyZSB3ZSBjb25zdW1lIGFuZCBwcm9jZXNzIHRoZSBlbnRpcmUKQEAgLTQ4NCwzICs1NDEsMzAgQEAKICAgICB9CiB9CiAKK1RFU1QoYXVkaW9mbGluZ2VyX3Jlc2FtcGxlciwgZmlsdGVycmVzcG9uc2UpIHsKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IGluU2FtcGxlUmF0ZXN7CisgICAgICAgIDgwMDAsCisgICAgICAgIDExMDI1LAorICAgICAgICAxMjAwMCwKKyAgICAgICAgMTYwMDAsCisgICAgICAgIDIyMDUwLAorICAgICAgICAyNDAwMCwKKyAgICAgICAgMzIwMDAsCisgICAgICAgIDQ0MTAwLAorICAgICAgICA0ODAwMCwKKyAgICAgICAgODgyMDAsCisgICAgICAgIDk2MDAwLAorICAgICAgICAxNzY0MDAsCisgICAgICAgIDE5MjAwMCwKKyAgICB9OworICAgIHN0ZDo6dmVjdG9yPGludD4gb3V0U2FtcGxlUmF0ZXN7CisgICAgICAgIDQ4MDAwLAorICAgICAgICA5NjAwMCwKKyAgICB9OworCisgICAgZm9yIChpbnQgb3V0U2FtcGxlUmF0ZSA6IG91dFNhbXBsZVJhdGVzKSB7CisgICAgICAgIGZvciAoaW50IGluU2FtcGxlUmF0ZSA6IGluU2FtcGxlUmF0ZXMpIHsKKyAgICAgICAgICAgIHRlc3RGaWx0ZXJSZXNwb25zZSgyIC8qIGNoYW5uZWxzICovLCBpblNhbXBsZVJhdGUsIG91dFNhbXBsZVJhdGUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL3Rlc3QtbWl4ZXIuY3BwIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL3Rlc3QtbWl4ZXIuY3BwCmluZGV4IDc1ZGJmOTEuLmJjOWQyYTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy90ZXN0LW1peGVyLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvdGVzdC1taXhlci5jcHAKQEAgLTE0MywxMCArMTQzLDYgQEAKICAgICAgICAgdXNhZ2UocHJvZ25hbWUpOwogICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwogICAgIH0KLSAgICBpZiAoKHVuc2lnbmVkKWFyZ2MgPiBBdWRpb01peGVyOjpNQVhfTlVNX1RSQUNLUykgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInRvbyBtYW55IHRyYWNrczogJWQgPiAldSIsIGFyZ2MsIEF1ZGlvTWl4ZXI6Ok1BWF9OVU1fVFJBQ0tTKTsKLSAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKLSAgICB9CiAKICAgICBzaXplX3Qgb3V0cHV0RnJhbWVzID0gMDsKIApAQCAtMjQ2LDkgKzI0MiwxMCBAQAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcHJvdmlkZXJzLnNpemUoKTsgKytpKSB7CiAgICAgICAgIC8vcHJpbnRmKCJ0cmFjayAlZCBvdXQgb2YgJWRcbiIsIGksIHByb3ZpZGVycy5zaXplKCkpOwogICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChwcm92aWRlcnNbaV0uZ2V0TnVtQ2hhbm5lbHMoKSk7Ci0gICAgICAgIGludDMyX3QgbmFtZSA9IG1peGVyLT5nZXRUcmFja05hbWUoY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgZm9ybWF0c1tpXSwgQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKTsKLSAgICAgICAgQUxPR19BU1NFUlQobmFtZSA+PSAwKTsKKyAgICAgICAgY29uc3QgaW50IG5hbWUgPSBpOworICAgICAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMgPSBtaXhlci0+Y3JlYXRlKAorICAgICAgICAgICAgICAgIG5hbWUsIGNoYW5uZWxNYXNrLCBmb3JtYXRzW2ldLCBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHN0YXR1cyAhPSBPSyk7CiAgICAgICAgIG5hbWVzW2ldID0gbmFtZTsKICAgICAgICAgbWl4ZXItPnNldEJ1ZmZlclByb3ZpZGVyKG5hbWUsICZwcm92aWRlcnNbaV0pOwogICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpNQUlOX0JVRkZFUiwKQEAgLTMxNSw5ICszMTIsMTAgQEAKICAgICB3cml0ZUZpbGUob3V0cHV0RmlsZW5hbWUsIG91dHB1dEFkZHIsCiAgICAgICAgICAgICBvdXRwdXRTYW1wbGVSYXRlLCBvdXRwdXRDaGFubmVscywgb3V0cHV0RnJhbWVzLCB1c2VNaXhlckZsb2F0KTsKICAgICBpZiAoYXV4RmlsZW5hbWUpIHsKLSAgICAgICAgLy8gQXV4IGJ1ZmZlciBpcyBhbHdheXMgaW4gcTRfMjcgZm9ybWF0IGZvciBub3cuCi0gICAgICAgIC8vIG1lbWNweV90b19pMTZfZnJvbV9xNF8yNygpLCBidXQgd2l0aCBzdGVyZW8gZnJhbWUgY291bnQgKG5vdCBzYW1wbGUgY291bnQpCi0gICAgICAgIGRpdGhlckFuZENsYW1wKChpbnQzMl90KilhdXhBZGRyLCAoaW50MzJfdCopYXV4QWRkciwgb3V0cHV0RnJhbWVzID4+IDEpOworICAgICAgICAvLyBBdXggYnVmZmVyIGlzIGFsd2F5cyBpbiBxNF8yNyBmb3JtYXQgZm9yIE8gYW5kIGVhcmxpZXIuCisgICAgICAgIC8vIG1lbWNweV90b19pMTZfZnJvbV9xNF8yNygoaW50MTZfdCopYXV4QWRkciwgKGNvbnN0IGludDMyX3QqKWF1eEFkZHIsIG91dHB1dEZyYW1lcyk7CisgICAgICAgIC8vIEF1eCBidWZmZXIgaXMgYWx3YXlzIGluIGZsb2F0IGZvcm1hdCBmb3IgUC4KKyAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX2Zsb2F0KChpbnQxNl90KilhdXhBZGRyLCAoY29uc3QgZmxvYXQqKWF1eEFkZHIsIG91dHB1dEZyYW1lcyk7CiAgICAgICAgIHdyaXRlRmlsZShhdXhGaWxlbmFtZSwgYXV4QWRkciwgb3V0cHV0U2FtcGxlUmF0ZSwgMSwgb3V0cHV0RnJhbWVzLCBmYWxzZSk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJjcHVzdGF0cy9PV05FUlMgYi9tZWRpYS9saWJjcHVzdGF0cy9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjljYjU2NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmNwdXN0YXRzL09XTkVSUwpAQCAtMCwwICsxIEBACitna2FzdGVuQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvT1dORVJTIGIvbWVkaWEvbGliZWZmZWN0cy9PV05FUlMKaW5kZXggN2UzZGUxMy4uN2Y5YWU4MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9PV05FUlMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9PV05FUlMKQEAgLTEsMyArMSw0IEBACitodW5nYUBnb29nbGUuY29tCiBrcm9jYXJkQGdvb2dsZS5jb20KIG1uYWdhbm92QGdvb2dsZS5jb20KIHJhZ29AZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9jb25maWcvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL0FuZHJvaWQuYnAKaW5kZXggNDM5OGE5MS4uNWZhOWRhOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9jb25maWcvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9BbmRyb2lkLmJwCkBAIC0xLDEwICsxLDE1IEBACiAvLyBFZmZlY3QgY29uZmlndXJhdGlvbgotY2NfbGlicmFyeV9zaGFyZWQgeworY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmVmZmVjdHNjb25maWciLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAKICAgICBzcmNzOiBbInNyYy9FZmZlY3RzQ29uZmlnLmNwcCJdLAogCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJ0aW55eG1sMiIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9pbmNsdWRlL21lZGlhL0VmZmVjdHNDb25maWcuaCBiL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL2luY2x1ZGUvbWVkaWEvRWZmZWN0c0NvbmZpZy5oCmluZGV4IDgxMTczMGMuLjU1Yjk0NmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL2luY2x1ZGUvbWVkaWEvRWZmZWN0c0NvbmZpZy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL2luY2x1ZGUvbWVkaWEvRWZmZWN0c0NvbmZpZy5oCkBAIC0zMiw4ICszMiwxMyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGVmZmVjdHNDb25maWcgewogCi0vKiogRGVmYXVsdCBwYXRoIG9mIGVmZmVjdCBjb25maWd1cmF0aW9uIGZpbGUuICovCi1jb25zdGV4cHIgY2hhciBERUZBVUxUX1BBVEhbXSA9ICIvdmVuZG9yL2V0Yy9hdWRpb19lZmZlY3RzLnhtbCI7CisvKiogRGVmYXVsdCBwYXRoIG9mIGVmZmVjdCBjb25maWd1cmF0aW9uIGZpbGUuIFJlbGF0aXZlIHRvIERFRkFVTFRfTE9DQVRJT05TLiAqLworY29uc3RleHByIGNvbnN0IGNoYXIqIERFRkFVTFRfTkFNRSA9ICJhdWRpb19lZmZlY3RzLnhtbCI7CisKKy8qKiBEZWZhdWx0IHBhdGggb2YgZWZmZWN0IGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAqIFRoZSAvdmVuZG9yIHBhcnRpdGlvbiBpcyB0aGUgcmVjb21tZW5kZWQgb25lLCB0aGUgb3RoZXJzIGFyZSBkZXByZWNhdGVkLgorICovCitjb25zdGV4cHIgY29uc3QgY2hhciogREVGQVVMVF9MT0NBVElPTlNbXSA9IHsiL29kbS9ldGMiLCAiL3ZlbmRvci9ldGMiLCAiL3N5c3RlbS9ldGMifTsKIAogLyoqIERpcmVjdG9yaWVzIHdoZXJlIHRoZSBlZmZlY3QgbGlicmFyaWVzIHdpbGwgYmUgc2VhcmNoIGZvci4gKi8KIGNvbnN0ZXhwciBjb25zdCBjaGFyKiBMRF9FRkZFQ1RfTElCUkFSWV9QQVRIW10gPQpAQCAtOTEsMTMgKzk2LDE2IEBACiAgICAgLyoqIFBhcnNlZCBjb25maWcsIG51bGxwdHIgaWYgdGhlIHhtbCBsaWIgY291bGQgbm90IGxvYWQgdGhlIGZpbGUgKi8KICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29uZmlnPiBwYXJzZWRDb25maWc7CiAgICAgc2l6ZV90IG5iU2tpcHBlZEVsZW1lbnQ7IC8vPCBOdW1iZXIgb2Ygc2tpcHBlZCBpbnZhbGlkIGxpYnJhcnksIGVmZmVjdCBvciBwcm9jZXNzaW5nIGNoYWluCisgICAgY29uc3QgY2hhciogY29uZmlnUGF0aDsgLy88IFBhdGggdG8gdGhlIGxvYWRlZCBjb25maWd1cmF0aW9uCiB9OwogCiAvKiogUGFyc2VzIHRoZSBwcm92aWRlZCBlZmZlY3QgY29uZmlndXJhdGlvbi4KICAqIFBhcnNpbmcgZG8gbm90IHN0b3Agb2YgZmlyc3QgaW52YWxpZCBlbGVtZW50LCBidXQgY29udGludWVzIHRvIHRoZSBuZXh0LgorICogQHBhcmFtW2luXSBwYXRoIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgZG8gbG9hZAorICogICAgICAgICAgICAgICAgIGlmIG51bGxwdHIsIGxvb2sgZm9yIERFRkFVTFRfTkFNRSBpbiBERUZBVUxUX0xPQ0FUSU9OUy4KICAqIEBzZWUgUGFyc2luZ1Jlc3VsdDo6bmJTa2lwcGVkRWxlbWVudAogICovCi1QYXJzaW5nUmVzdWx0IHBhcnNlKGNvbnN0IGNoYXIqIHBhdGggPSBERUZBVUxUX1BBVEgpOworUGFyc2luZ1Jlc3VsdCBwYXJzZShjb25zdCBjaGFyKiBwYXRoID0gbnVsbHB0cik7CiAKIH0gLy8gbmFtZXNwYWNlIGVmZmVjdHNDb25maWcKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL3NyYy9FZmZlY3RzQ29uZmlnLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL3NyYy9FZmZlY3RzQ29uZmlnLmNwcAppbmRleCA5NzQ2MmY4Li5kNzk1MDFmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9zcmMvRWZmZWN0c0NvbmZpZy5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9jb25maWcvc3JjL0VmZmVjdHNDb25maWcuY3BwCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8Y3N0ZGludD4KICNpbmNsdWRlIDxmdW5jdGlvbmFsPgogI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgPHRpbnl4bWwyLmg+CiAjaW5jbHVkZSA8bG9nL2xvZy5oPgpAQCAtODUsNyArODYsNyBAQAogY29uc3RleHByIHN0ZDo6ZW5hYmxlX2lmPGZhbHNlLCBFbnVtPiBTVFJFQU1fTkFNRV9NQVA7CiAKIC8qKiBBbGwgb3V0cHV0IHN0cmVhbSB0eXBlcyB3aGljaCBzdXBwb3J0IGVmZmVjdHMuCi0gKiBUaGlzIG5lZWQgdG8gYmUga2VwdCBpbiBzaW5rIHdpdGggdGhlIHhzZCBzdHJlYW1PdXRwdXRUeXBlLgorICogVGhpcyBuZWVkIHRvIGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSB4c2Qgc3RyZWFtT3V0cHV0VHlwZS4KICAqLwogdGVtcGxhdGUgPD4KIGNvbnN0ZXhwciBzdGQ6OnBhaXI8YXVkaW9fc3RyZWFtX3R5cGVfdCwgY29uc3QgY2hhcio+IFNUUkVBTV9OQU1FX01BUDxhdWRpb19zdHJlYW1fdHlwZV90PltdID0gewpAQCAtMTAyLDcgKzEwMyw3IEBACiB9OwogCiAvKiogQWxsIGlucHV0IHN0cmVhbSB0eXBlcyB3aGljaCBzdXBwb3J0IGVmZmVjdHMuCi0gKiBUaGlzIG5lZWQgdG8gYmUga2VwdCBpbiBzaW5rIHdpdGggdGhlIHhzZCBzdHJlYW1PdXRwdXRUeXBlLgorICogVGhpcyBuZWVkIHRvIGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSB4c2Qgc3RyZWFtT3V0cHV0VHlwZS4KICAqLwogdGVtcGxhdGUgPD4KIGNvbnN0ZXhwciBzdGQ6OnBhaXI8YXVkaW9fc291cmNlX3QsIGNvbnN0IGNoYXIqPiBTVFJFQU1fTkFNRV9NQVA8YXVkaW9fc291cmNlX3Q+W10gPSB7CkBAIC0xNDIsNyArMTQzLDcgQEAKIH0KIAogLyoqIEZpbmQgYW4gZWxlbWVudCBpbiBhIGNvbGxlY3Rpb24gYnkgaXRzIG5hbWUuCi0gKiBAcmV0dXJuIG51bGxwdHIgaWYgbm90IGZvdW5kLCB0aGUgZWxsZW1lbnRzIGFkZHJlc3MgaWYgZm91bmQuCisgKiBAcmV0dXJuIG51bGxwdHIgaWYgbm90IGZvdW5kLCB0aGUgZWxlbWVudCBhZGRyZXNzIGlmIGZvdW5kLgogICovCiB0ZW1wbGF0ZSA8Y2xhc3MgVD4KIFQqIGZpbmRCeU5hbWUoY29uc3QgY2hhciogbmFtZSwgc3RkOjp2ZWN0b3I8VD4mIGNvbGxlY3Rpb24pIHsKQEAgLTIwMiw3ICsyMDMsNyBAQAogICAgICAgICBhdXRvIHBhcnNlUHJveHkgPSBbJnhtbEVmZmVjdCwgJnBhcnNlSW1wbF0oY29uc3QgY2hhciogdGFnLCBFZmZlY3RJbXBsJiBwcm94eUxpYikgewogICAgICAgICAgICAgYXV0byogeG1sUHJveHlMaWIgPSB4bWxFZmZlY3QuRmlyc3RDaGlsZEVsZW1lbnQodGFnKTsKICAgICAgICAgICAgIGlmICh4bWxQcm94eUxpYiA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImVmZmVjdFByb3h5IG11c3QgY29udGFpbiBhIDwlcz46ICVzIiwgdGFnLCBkdW1wKCp4bWxQcm94eUxpYikpOworICAgICAgICAgICAgICAgIEFMT0dFKCJlZmZlY3RQcm94eSBtdXN0IGNvbnRhaW4gYSA8JXM+OiAlcyIsIHRhZywgZHVtcCh4bWxFZmZlY3QpKTsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gcGFyc2VJbXBsKCp4bWxQcm94eUxpYiwgcHJveHlMaWIpOwpAQCAtMjQ5LDE1ICsyNTAsMTQgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotfTsgLy8gbmFtZXNwYWNlCi0KLVBhcnNpbmdSZXN1bHQgcGFyc2UoY29uc3QgY2hhciogcGF0aCkgeworLyoqIEludGVybmFsIHZlcnNpb24gb2YgdGhlIHB1YmxpYyBwYXJzZShjb25zdCBjaGFyKiBwYXRoKSB3aXRoIHByZWNvbmRpdGlvbiBgcGF0aCAhPSBudWxscHRyYC4gKi8KK1BhcnNpbmdSZXN1bHQgcGFyc2VXaXRoUGF0aChjb25zdCBjaGFyKiBwYXRoKSB7CiAgICAgWE1MRG9jdW1lbnQgZG9jOwogICAgIGRvYy5Mb2FkRmlsZShwYXRoKTsKICAgICBpZiAoZG9jLkVycm9yKCkpIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBwYXJzZSAlczogVGlueXhtbDIgZXJyb3IgKCVkKTogJXMgJXMiLCBwYXRoLAotICAgICAgICAgICAgICBkb2MuRXJyb3JJRCgpLCBkb2MuR2V0RXJyb3JTdHIxKCksIGRvYy5HZXRFcnJvclN0cjIoKSk7Ci0gICAgICAgIHJldHVybiB7bnVsbHB0ciwgMH07CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcGFyc2UgJXM6IFRpbnl4bWwyIGVycm9yICglZCk6ICVzIiwgcGF0aCwKKyAgICAgICAgICAgICAgZG9jLkVycm9ySUQoKSwgZG9jLkVycm9yU3RyKCkpOworICAgICAgICByZXR1cm4ge251bGxwdHIsIDAsIHBhdGh9OwogICAgIH0KIAogICAgIGF1dG8gY29uZmlnID0gc3RkOjptYWtlX3VuaXF1ZTxDb25maWc+KCk7CkBAIC0yOTUsNyArMjk1LDI5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIHtzdGQ6Om1vdmUoY29uZmlnKSwgbmJTa2lwcGVkRWxlbWVudHN9OworICAgIHJldHVybiB7c3RkOjptb3ZlKGNvbmZpZyksIG5iU2tpcHBlZEVsZW1lbnRzLCBwYXRofTsKK30KKworfTsgLy8gbmFtZXNwYWNlCisKK1BhcnNpbmdSZXN1bHQgcGFyc2UoY29uc3QgY2hhciogcGF0aCkgeworICAgIGlmIChwYXRoICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlV2l0aFBhdGgocGF0aCk7CisgICAgfQorCisgICAgZm9yIChzdGQ6OnN0cmluZyBsb2NhdGlvbiA6IERFRkFVTFRfTE9DQVRJT05TKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGRlZmF1bHRQYXRoID0gbG9jYXRpb24gKyAnLycgKyBERUZBVUxUX05BTUU7CisgICAgICAgIGlmIChhY2Nlc3MoZGVmYXVsdFBhdGguY19zdHIoKSwgUl9PSykgIT0gMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgYXV0byByZXN1bHQgPSBwYXJzZVdpdGhQYXRoKGRlZmF1bHRQYXRoLmNfc3RyKCkpOworICAgICAgICBpZiAocmVzdWx0LnBhcnNlZENvbmZpZyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR0UoIkNvdWxkIG5vdCBwYXJzZSBlZmZlY3QgY29uZmlndXJhdGlvbiBpbiBhbnkgb2YgdGhlIGRlZmF1bHQgbG9jYXRpb25zLiIpOworICAgIHJldHVybiB7bnVsbHB0ciwgMCwgbnVsbHB0cn07CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGVmZmVjdHNDb25maWcKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZGF0YS9hdWRpb19lZmZlY3RzLmNvbmYgYi9tZWRpYS9saWJlZmZlY3RzL2RhdGEvYXVkaW9fZWZmZWN0cy5jb25mCmluZGV4IDE0YTE3MWIuLmRkNzI5YzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZGF0YS9hdWRpb19lZmZlY3RzLmNvbmYKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9kYXRhL2F1ZGlvX2VmZmVjdHMuY29uZgpAQCAtMzgsNiArMzgsOSBAQAogICBsb3VkbmVzc19lbmhhbmNlciB7CiAgICAgcGF0aCAvdmVuZG9yL2xpYi9zb3VuZGZ4L2xpYmxkbmhuY3Iuc28KICAgfQorICBkeW5hbWljc19wcm9jZXNzaW5nIHsKKyAgICBwYXRoIC92ZW5kb3IvbGliL3NvdW5kZngvbGliZHlucHJvYy5zbworICB9CiB9CiAKICMgRGVmYXVsdCBwcmUtcHJvY2Vzc2luZyBsaWJyYXJ5LiBBZGQgdG8gYXVkaW9fZWZmZWN0LmNvbmYgImxpYnJhcmllcyIgc2VjdGlvbiBpZgpAQCAtMTI5LDYgKzEzMiwxMCBAQAogICAgIGxpYnJhcnkgbG91ZG5lc3NfZW5oYW5jZXIKICAgICB1dWlkIGZhNDE1MzI5LTIwMzQtNGJlYS1iNWRjLTViMzgxYzhkMWUyYwogICB9CisgIGR5bmFtaWNzX3Byb2Nlc3NpbmcgeworICAgIGxpYnJhcnkgZHluYW1pY3NfcHJvY2Vzc2luZworICAgIHV1aWQgZTBlNjUzOWItMTc4MS03MjYxLTY3NmYtNmQ3NTczNjk2MzQwCisgIH0KIH0KIAogIyBEZWZhdWx0IHByZS1wcm9jZXNzaW5nIGVmZmVjdHMuIEFkZCB0byBhdWRpb19lZmZlY3QuY29uZiAiZWZmZWN0cyIgc2VjdGlvbiBpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9kYXRhL2F1ZGlvX2VmZmVjdHMueG1sIGIvbWVkaWEvbGliZWZmZWN0cy9kYXRhL2F1ZGlvX2VmZmVjdHMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmODUwNTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2RhdGEvYXVkaW9fZWZmZWN0cy54bWwKQEAgLTAsMCArMSwxMDIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8YXVkaW9fZWZmZWN0c19jb25mIHZlcnNpb249IjIuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2F1ZGlvL2F1ZGlvX2VmZmVjdHNfY29uZi92Ml8wIj4KKyAgICA8IS0tIExpc3Qgb2YgZWZmZWN0IGxpYnJhcmllcyB0byBsb2FkLgorICAgICAgICAgRWFjaCBsaWJyYXJ5IGVsZW1lbnQgbXVzdCBjb250YWluIGEgIm5hbWUiIGF0dHJpYnV0ZSBhbmQgYSAicGF0aCIgYXR0cmlidXRlIGdpdmluZyB0aGUKKyAgICAgICAgIG5hbWUgb2YgYSBsaWJyYXJ5IC5zbyBmaWxlIGluIC92ZW5kb3IvbGliL3NvdW5kZnggb24gdGhlIHRhcmdldAorCisgICAgICAgICBJZiBvZmZsb2FkYWJsZSBlZmZlY3RzIGFyZSBwcmVzZW50LCB0aGUgQU9TUCBsaWJyYXJ5IGxpYmVmZmVjdHByb3h5LnNvIG11c3QgYmUgbGlzdGVkIGFzCisgICAgICAgICB3ZWxsIGFzIG9uZSBsaWJyYXJ5IGZvciB0aGUgU1cgaW1wbGVtZW50YXRpb24gYW5kIG9uZSBsaWJyYXJ5IGZvciB0aGUgRFNQIGltcGxlbWVudGF0aW9uOgorICAgICAgICAgPGxpYnJhcnkgbmFtZT0icHJveHkiIHBhdGg9ImxpYmVmZmVjdHByb3h5LnNvIi8+CisgICAgICAgICA8bGlicmFyeSBuYW1lPSJzb21lX2Z4X3N3IiBwYXRoPSJsaWJfc29tZV9meF9zdy5zbyIvPgorICAgICAgICAgPGxpYnJhcnkgbmFtZT0ic29tZV9meF9odyIgcGF0aD0ibGliX3NvbWVfZnhfaHcuc28iLz4KKworICAgICAgICAgSWYgdGhlIGF1ZGlvIEhBTCBpbXBsZW1lbnRzIHN1cHBvcnQgZm9yIEFPU1Agc29mdHdhcmUgYXVkaW8gcHJlLXByb2Nlc3NpbmcgZWZmZWN0cywKKyAgICAgICAgIHRoZSBmb2xsb3dpbmcgbGlicmFyeSBtdXN0IGJlIGFkZGVkOgorICAgICAgICAgPGxpYnJhcnkgbmFtZT0icHJlX3Byb2Nlc3NpbmciIHBhdGg9ImxpYmF1ZGlvcHJlcHJvY2Vzc2luZy5zbyIvPgorICAgIC0tPgorICAgIDxsaWJyYXJpZXM+CisgICAgICAgIDxsaWJyYXJ5IG5hbWU9ImJ1bmRsZSIgcGF0aD0ibGliYnVuZGxld3JhcHBlci5zbyIvPgorICAgICAgICA8bGlicmFyeSBuYW1lPSJyZXZlcmIiIHBhdGg9ImxpYnJldmVyYndyYXBwZXIuc28iLz4KKyAgICAgICAgPGxpYnJhcnkgbmFtZT0idmlzdWFsaXplciIgcGF0aD0ibGlidmlzdWFsaXplci5zbyIvPgorICAgICAgICA8bGlicmFyeSBuYW1lPSJkb3dubWl4IiBwYXRoPSJsaWJkb3dubWl4LnNvIi8+CisgICAgICAgIDxsaWJyYXJ5IG5hbWU9ImxvdWRuZXNzX2VuaGFuY2VyIiBwYXRoPSJsaWJsZG5obmNyLnNvIi8+CisgICAgICAgIDxsaWJyYXJ5IG5hbWU9ImR5bmFtaWNzX3Byb2Nlc3NpbmciIHBhdGg9ImxpYmR5bnByb2Muc28iLz4KKyAgICA8L2xpYnJhcmllcz4KKworICAgIDwhLS0gbGlzdCBvZiBlZmZlY3RzIHRvIGxvYWQuCisgICAgICAgICBFYWNoICJlZmZlY3QiIGVsZW1lbnQgbXVzdCBjb250YWluIGEgIm5hbWUiLCAibGlicmFyeSIgYW5kIGEgInV1aWQiIGF0dHJpYnV0ZS4KKyAgICAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgImxpYnJhcnkiIGVsZW1lbnQgbXVzdCBjb3JyZXNwb25kIHRvIHRoZSBuYW1lIG9mIG9uZSBsaWJyYXJ5IGVsZW1lbnQgaW4KKyAgICAgICAgIHRoZSAibGlicmFyaWVzIiBlbGVtZW50LgorICAgICAgICAgVGhlICJuYW1lIiBhdHRyaWJ1dGUgaXMgaW5kaWNhdGl2ZSwgb25seSB0aGUgdmFsdWUgb2YgdGhlICJ1dWlkIiBhdHRyaWJ1dGUgZGVzaWduYXRlcworICAgICAgICAgdGhlIGVmZmVjdC4KKyAgICAgICAgIFRoZSB1dWlkIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBVVUlEIGFzIHNwZWNpZmllZCBieSB0aGUgZWZmZWN0IHZlbmRvci4gVGhpcyBpcyBub3QKKyAgICAgICAgIHRoZSBnZW5lcmljIGVmZmVjdCB0eXBlIFVVSUQuCisKKyAgICAgICAgIE9mZmxvYWRhYmxlIGVmZmVjdHMgYXJlIGRlc2NyaWJlZCBieSBhbiAiZWZmZWN0UHJveHkiIGVsZW1lbnQgd2hpY2ggY29udGFpbnMgb25lICJsaWJzdyIKKyAgICAgICAgIGVsZW1lbnQgY29udGFpbmluZyB0aGUgInV1aWQiIGFuZCAibGlicmFyeSIgZm9yIHRoZSBTVyBpbXBsZW1lbnRhdGlvbiBhbmQgb25lICJsaWJodyIKKyAgICAgICAgIGVsZW1lbnQgY29udGFpbmluZyB0aGUgInV1aWQiIGFuZCAibGlicmFyeSIgZm9yIHRoZSBEU1AgaW1wbGVtZW50YXRpb24uCisgICAgICAgICBUaGUgInV1aWQiIHZhbHVlIGZvciB0aGUgImVmZmVjdFByb3h5IiBlbGVtZW50IG11c3QgYmUgdW5pcXVlIGFuZCB3aWxsIG92ZXJyaWRlIHRoZSBkZWZhdWx0CisgICAgICAgICB1dWlkIGluIHRoZSBBT1NQIHByb3h5IGVmZmVjdCBpbXBsZW1lbnRhdGlvbi4KKworICAgICAgICAgSWYgdGhlIGF1ZGlvIEhBTCBpbXBsZW1lbnRzIHN1cHBvcnQgZm9yIEFPU1Agc29mdHdhcmUgYXVkaW8gcHJlLXByb2Nlc3NpbmcgZWZmZWN0cywKKyAgICAgICAgIHRoZSBmb2xsb3dpbmcgZWZmZWN0cyBjYW4gYmUgYWRkZWQ6CisgICAgICAgICA8ZWZmZWN0IG5hbWU9ImFnYyIgbGlicmFyeT0icHJlX3Byb2Nlc3NpbmciIHV1aWQ9ImFhODEzMGUwLTY2ZmMtMTFlMC1iYWQwLTAwMDJhNWQ1YzUxYiIvPgorICAgICAgICAgPGVmZmVjdCBuYW1lPSJhZWMiIGxpYnJhcnk9InByZV9wcm9jZXNzaW5nIiB1dWlkPSJiYjM5MmVjMC04ZDRkLTExZTAtYTg5Ni0wMDAyYTVkNWM1MWIiLz4KKyAgICAgICAgIDxlZmZlY3QgbmFtZT0ibnMiIGxpYnJhcnk9InByZV9wcm9jZXNzaW5nIiB1dWlkPSJjMDZjODQwMC04ZTA2LTExZTAtOWNiNi0wMDAyYTVkNWM1MWIiLz4KKyAgICAtLT4KKworICAgIDxlZmZlY3RzPgorICAgICAgICA8ZWZmZWN0IG5hbWU9ImJhc3Nib29zdCIgbGlicmFyeT0iYnVuZGxlIiB1dWlkPSI4NjMxZjMwMC03MmUyLTExZGYtYjU3ZS0wMDAyYTVkNWM1MWIiLz4KKyAgICAgICAgPGVmZmVjdCBuYW1lPSJ2aXJ0dWFsaXplciIgbGlicmFyeT0iYnVuZGxlIiB1dWlkPSIxZDQwMzNjMC04NTU3LTExZGYtOWYyZC0wMDAyYTVkNWM1MWIiLz4KKyAgICAgICAgPGVmZmVjdCBuYW1lPSJlcXVhbGl6ZXIiIGxpYnJhcnk9ImJ1bmRsZSIgdXVpZD0iY2U3NzJmMjAtODQ3ZC0xMWRmLWJiMTctMDAwMmE1ZDVjNTFiIi8+CisgICAgICAgIDxlZmZlY3QgbmFtZT0idm9sdW1lIiBsaWJyYXJ5PSJidW5kbGUiIHV1aWQ9IjExOTM0MWEwLTg0NjktMTFkZi04MWY5LTAwMDJhNWQ1YzUxYiIvPgorICAgICAgICA8ZWZmZWN0IG5hbWU9InJldmVyYl9lbnZfYXV4IiBsaWJyYXJ5PSJyZXZlcmIiIHV1aWQ9IjRhMzg3ZmMwLThhYjMtMTFkZi04YmFkLTAwMDJhNWQ1YzUxYiIvPgorICAgICAgICA8ZWZmZWN0IG5hbWU9InJldmVyYl9lbnZfaW5zIiBsaWJyYXJ5PSJyZXZlcmIiIHV1aWQ9ImM3YTUxMWEwLWEzYmItMTFkZi04NjBlLTAwMDJhNWQ1YzUxYiIvPgorICAgICAgICA8ZWZmZWN0IG5hbWU9InJldmVyYl9wcmVfYXV4IiBsaWJyYXJ5PSJyZXZlcmIiIHV1aWQ9ImYyOWExNDAwLWEzYmItMTFkZi04ZGRjLTAwMDJhNWQ1YzUxYiIvPgorICAgICAgICA8ZWZmZWN0IG5hbWU9InJldmVyYl9wcmVfaW5zIiBsaWJyYXJ5PSJyZXZlcmIiIHV1aWQ9IjE3MmNkZjAwLWEzYmMtMTFkZi1hNzJmLTAwMDJhNWQ1YzUxYiIvPgorICAgICAgICA8ZWZmZWN0IG5hbWU9InZpc3VhbGl6ZXIiIGxpYnJhcnk9InZpc3VhbGl6ZXIiIHV1aWQ9ImQwNjlkOWUwLTgzMjktMTFkZi05MTY4LTAwMDJhNWQ1YzUxYiIvPgorICAgICAgICA8ZWZmZWN0IG5hbWU9ImRvd25taXgiIGxpYnJhcnk9ImRvd25taXgiIHV1aWQ9IjkzZjA0NDUyLWU0ZmUtNDFjYy05MWY5LWU0NzViNmQxZDY5ZiIvPgorICAgICAgICA8ZWZmZWN0IG5hbWU9ImxvdWRuZXNzX2VuaGFuY2VyIiBsaWJyYXJ5PSJsb3VkbmVzc19lbmhhbmNlciIgdXVpZD0iZmE0MTUzMjktMjAzNC00YmVhLWI1ZGMtNWIzODFjOGQxZTJjIi8+CisgICAgICAgIDxlZmZlY3QgbmFtZT0iZHluYW1pY3NfcHJvY2Vzc2luZyIgbGlicmFyeT0iZHluYW1pY3NfcHJvY2Vzc2luZyIgdXVpZD0iZTBlNjUzOWItMTc4MS03MjYxLTY3NmYtNmQ3NTczNjk2MzQwIi8+CisgICAgPC9lZmZlY3RzPgorCisgICAgPCEtLSBBdWRpbyBwcmUgcHJvY2Vzc29yIGNvbmZpZ3VyYXRpb25zLgorICAgICAgICAgVGhlIHByZSBwcm9jZXNzb3IgY29uZmlndXJhdGlvbiBpcyBkZXNjcmliZWQgaW4gYSAicHJlcHJvY2VzcyIgZWxlbWVudCBhbmQgY29uc2lzdHMgaW4gYQorICAgICAgICAgbGlzdCBvZiBlbGVtZW50cyBlYWNoIGRlc2NyaWJpbmcgcHJlIHByb2Nlc3NvciBzZXR0aW5ncyBmb3IgYSBnaXZlbiB1c2UgY2FzZSBvciAic3RyZWFtIi4KKyAgICAgICAgIEVhY2ggc3RyZWFtIGVsZW1lbnQgaGFzIGEgInR5cGUiIGF0dHJpYnV0ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnB1dCBzb3VyY2UgdXNlZC4KKyAgICAgICAgIFZhbGlkIHR5cGVzIGFyZToKKyAgICAgICAgICAgICAgIm1pYyIsICJjYW1jb3JkZXIiLCAidm9pY2VfcmVjb2duaXRpb24iLCAidm9pY2VfY29tbXVuaWNhdGlvbiIKKyAgICAgICAgIEVhY2ggInN0cmVhbSIgZWxlbWVudCBjb250YWlucyBhIGxpc3Qgb2YgImFwcGx5IiBlbGVtZW50cyBpbmRpY2F0aW5nIG9uZSBlZmZlY3QgdG8gYXBwbHkuCisgICAgICAgICBUaGUgZWZmZWN0IHRvIGFwcGx5IGlzIGRlc2lnbmF0ZWQgYnkgaXRzIG5hbWUgaW4gdGhlICJlZmZlY3RzIiBlbGVtZW50cy4KKworICAgICAgICA8cHJlcHJvY2Vzcz4KKyAgICAgICAgICAgIDxzdHJlYW0gdHlwZT0idm9pY2VfY29tbXVuaWNhdGlvbiI+CisgICAgICAgICAgICAgICAgPGFwcGx5IGVmZmVjdD0iYWVjIi8+CisgICAgICAgICAgICAgICAgPGFwcGx5IGVmZmVjdD0ibnMiLz4KKyAgICAgICAgICAgIDwvc3RyZWFtPgorICAgICAgICA8L3ByZXByb2Nlc3M+CisgICAgLS0+CisKKyAgICA8IS0tIEF1ZGlvIHBvc3QgcHJvY2Vzc29yIGNvbmZpZ3VyYXRpb25zLgorICAgICAgICAgVGhlIHBvc3QgcHJvY2Vzc29yIGNvbmZpZ3VyYXRpb24gaXMgZGVzY3JpYmVkIGluIGEgInBvc3Rwcm9jZXNzIiBlbGVtZW50IGFuZCBjb25zaXN0cyBpbiBhCisgICAgICAgICBsaXN0IG9mIGVsZW1lbnRzIGVhY2ggZGVzY3JpYmluZyBwb3N0IHByb2Nlc3NvciBzZXR0aW5ncyBmb3IgYSBnaXZlbiB1c2UgY2FzZSBvciAic3RyZWFtIi4KKyAgICAgICAgIEVhY2ggc3RyZWFtIGVsZW1lbnQgaGFzIGEgInR5cGUiIGF0dHJpYnV0ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzdHJlYW0gdHlwZSB1c2VkLgorICAgICAgICAgVmFsaWQgdHlwZXMgYXJlOgorICAgICAgICAgICAgICAibXVzaWMiLCAicmluZyIsICJhbGFybSIsICJub3RpZmljYXRpb24iLCAidm9pY2VfY2FsbCIKKyAgICAgICAgIEVhY2ggInN0cmVhbSIgZWxlbWVudCBjb250YWlucyBhIGxpc3Qgb2YgImFwcGx5IiBlbGVtZW50cyBpbmRpY2F0aW5nIG9uZSBlZmZlY3QgdG8gYXBwbHkuCisgICAgICAgICBUaGUgZWZmZWN0IHRvIGFwcGx5IGlzIGRlc2lnbmF0ZWQgYnkgaXRzIG5hbWUgaW4gdGhlICJlZmZlY3RzIiBlbGVtZW50cy4KKworICAgICAgICA8cG9zdHByb2Nlc3M+CisgICAgICAgICAgICA8c3RyZWFtIHR5cGU9Im11c2ljIj4KKyAgICAgICAgICAgICAgICA8YXBwbHkgZWZmZWN0PSJtdXNpY19wb3N0X3Byb2MiLz4KKyAgICAgICAgICAgIDwvc3RyZWFtPgorICAgICAgICAgICAgPHN0cmVhbSB0eXBlPSJ2b2ljZV9jYWxsIj4KKyAgICAgICAgICAgICAgICA8YXBwbHkgZWZmZWN0PSJ2b2ljZV9wb3N0X3Byb2MiLz4KKyAgICAgICAgICAgIDwvc3RyZWFtPgorICAgICAgICAgICAgPHN0cmVhbSB0eXBlPSJub3RpZmljYXRpb24iPgorICAgICAgICAgICAgICAgIDxhcHBseSBlZmZlY3Q9Im5vdGlmaWNhdGlvbl9wb3N0X3Byb2MiLz4KKyAgICAgICAgICAgIDwvc3RyZWFtPgorICAgICAgICA8L3Bvc3Rwcm9jZXNzPgorICAgIC0tPgorCis8L2F1ZGlvX2VmZmVjdHNfY29uZj4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZHluYW1pY3Nwcm9jL0FuZHJvaWQubWsgYi9tZWRpYS9saWJlZmZlY3RzL2R5bmFtaWNzcHJvYy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZTBjNDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2R5bmFtaWNzcHJvYy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNDMgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCisjIER5bmFtaWNzUHJvY2Vzc2luZyBsaWJyYXJ5CitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCisKK0VJR0VOX1BBVEggOj0gZXh0ZXJuYWwvZWlnZW4KK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChFSUdFTl9QQVRIKQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisgICAgRWZmZWN0RHluYW1pY3NQcm9jZXNzaW5nLmNwcCBcCisgICAgZHNwL0RQQmFzZS5jcHAgXAorICAgIGRzcC9EUEZyZXF1ZW5jeS5jcHAKKworTE9DQUxfQ0ZMQUdTKz0gLU8yIC1mdmlzaWJpbGl0eT1oaWRkZW4KK0xPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2Vycm9yCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgIGxpYmN1dGlscyBcCisgICAgbGlibG9nIFwKKworTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gc291bmRmeAorTE9DQUxfTU9EVUxFOj0gbGliZHlucHJvYworCitMT0NBTF9IRUFERVJfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJhdWRpb2VmZmVjdHMKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9keW5hbWljc3Byb2MvRWZmZWN0RHluYW1pY3NQcm9jZXNzaW5nLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvZHluYW1pY3Nwcm9jL0VmZmVjdER5bmFtaWNzUHJvY2Vzc2luZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI4ODNmMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZHluYW1pY3Nwcm9jL0VmZmVjdER5bmFtaWNzUHJvY2Vzc2luZy5jcHAKQEAgLTAsMCArMSwxMzAwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJFZmZlY3REUCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8bmV3PgorCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfZHluYW1pY3Nwcm9jZXNzaW5nLmg+CisjaW5jbHVkZSA8ZHNwL0RQQmFzZS5oPgorI2luY2x1ZGUgPGRzcC9EUEZyZXF1ZW5jeS5oPgorCisvLyNkZWZpbmUgVkVSWV9WRVJZX1ZFUkJPU0VfTE9HR0lORworI2lmZGVmIFZFUllfVkVSWV9WRVJCT1NFX0xPR0dJTkcKKyNkZWZpbmUgQUxPR1ZWIEFMT0dWCisjZWxzZQorI2RlZmluZSBBTE9HVlYoYS4uLikgZG8geyB9IHdoaWxlIChmYWxzZSkKKyNlbmRpZgorCisvLyB1bmlvbiB0byBob2xkIGNvbW1hbmQgdmFsdWVzCit1c2luZyB2YWx1ZV90ID0gdW5pb24geworICAgIGludDMyX3QgaTsKKyAgICBmbG9hdCBmOworfTsKKworLy8gZWZmZWN0X2hhbmRsZV90IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgRFAgZWZmZWN0CitleHRlcm4gY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyBnRFBJbnRlcmZhY2U7CisKKy8vIEFPU1AgRHluYW1pY3MgUHJvY2Vzc2luZyBVVUlEOiBlMGU2NTM5Yi0xNzgxLTcyNjEtNjc2Zi02ZDc1NzM2OTYzNDAKK2NvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgZ0RQRGVzY3JpcHRvciA9IHsKKyAgICAgICAgezB4NzI2MTY3NmYsIDB4NmQ3NSwgMHg3MzY5LCAweDYzNjQsIHsweDI4LCAweGUyLCAweGZkLCAweDNhLCAweGMzLCAweDllfX0sIC8vIHR5cGUKKyAgICAgICAgezB4ZTBlNjUzOWIsIDB4MTc4MSwgMHg3MjYxLCAweDY3NmYsIHsweDZkLCAweDc1LCAweDczLCAweDY5LCAweDYzLCAweDQwfX0sIC8vIHV1aWQKKyAgICAgICAgRUZGRUNUX0NPTlRST0xfQVBJX1ZFUlNJT04sCisgICAgICAgIChFRkZFQ1RfRkxBR19UWVBFX0lOU0VSVCB8IEVGRkVDVF9GTEFHX0lOU0VSVF9MQVNUIHwgRUZGRUNUX0ZMQUdfVk9MVU1FX0NUUkwpLAorICAgICAgICAwLCAvLyBUT0RPCisgICAgICAgIDEsCisgICAgICAgICJEeW5hbWljcyBQcm9jZXNzaW5nIiwKKyAgICAgICAgIlRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QiLAorfTsKKworZW51bSBkcF9zdGF0ZV9lIHsKKyAgICBEWU5BTUlDU19QUk9DRVNTSU5HX1NUQVRFX1VOSU5JVElBTElaRUQsCisgICAgRFlOQU1JQ1NfUFJPQ0VTU0lOR19TVEFURV9JTklUSUFMSVpFRCwKKyAgICBEWU5BTUlDU19QUk9DRVNTSU5HX1NUQVRFX0FDVElWRSwKK307CisKK3N0cnVjdCBEeW5hbWljc1Byb2Nlc3NpbmdDb250ZXh0IHsKKyAgICBjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zICptSXRmZTsKKyAgICBlZmZlY3RfY29uZmlnX3QgbUNvbmZpZzsKKyAgICB1aW50OF90IG1TdGF0ZTsKKworICAgIGRwX2Z4OjpEUEJhc2UgKiBtUER5bmFtaWNzOyAvL3RoZSBlZmZlY3QgKG9yIGN1cnJlbnQgZWZmZWN0KQorICAgIGludDMyX3QgbUN1cnJlbnRWYXJpYW50OworICAgIGZsb2F0IG1QcmVmZXJyZWRGcmFtZUR1cmF0aW9uOworfTsKKworLy8gVGhlIHZhbHVlIG9mZnNldCBvZiBhbiBlZmZlY3QgcGFyYW1ldGVyIGlzIGNvbXB1dGVkIGJ5IHJvdW5kaW5nIHVwCisvLyB0aGUgcGFyYW1ldGVyIHNpemUgdG8gdGhlIG5leHQgMzIgYml0IGFsaWdubWVudC4KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgY29tcHV0ZVBhcmFtVk9mZnNldChjb25zdCBlZmZlY3RfcGFyYW1fdCAqcCkgeworICAgIHJldHVybiAoKHAtPnBzaXplICsgc2l6ZW9mKGludDMyX3QpIC0gMSkgLyBzaXplb2YoaW50MzJfdCkpICoKKyAgICAgICAgICAgIHNpemVvZihpbnQzMl90KTsKK30KKworLy8tLS0gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworaW50IERQX3NldFBhcmFtZXRlcihEeW5hbWljc1Byb2Nlc3NpbmdDb250ZXh0ICpwQ29udGV4dCwKKyAgICAgICAgdWludDMyX3QgcGFyYW1TaXplLAorICAgICAgICB2b2lkICpwUGFyYW0sCisgICAgICAgIHVpbnQzMl90IHZhbHVlU2l6ZSwKKyAgICAgICAgdm9pZCAqcFZhbHVlKTsKK2ludCBEUF9nZXRQYXJhbWV0ZXIoRHluYW1pY3NQcm9jZXNzaW5nQ29udGV4dCAqcENvbnRleHQsCisgICAgICAgIHVpbnQzMl90IHBhcmFtU2l6ZSwKKyAgICAgICAgdm9pZCAqcFBhcmFtLAorICAgICAgICB1aW50MzJfdCAqcFZhbHVlU2l6ZSwKKyAgICAgICAgdm9pZCAqcFZhbHVlKTsKK2ludCBEUF9nZXRQYXJhbWV0ZXJDbWRTaXplKHVpbnQzMl90IHBhcmFtU2l6ZSwKKyAgICAgICAgdm9pZCAqcFBhcmFtKTsKK3ZvaWQgRFBfZXhwZWN0ZWRQYXJhbVZhbHVlU2l6ZXModWludDMyX3QgcGFyYW1TaXplLAorICAgICAgICB2b2lkICpwUGFyYW0sCisgICAgICAgIGJvb2wgaXNTZXQsCisgICAgICAgIHVpbnQzMl90ICpwQ21kU2l6ZSwKKyAgICAgICAgdWludDMyX3QgKnBWYWx1ZVNpemUpOworLy8KKy8vLS0tIExvY2FsIGZ1bmN0aW9ucyAobm90IGRpcmVjdGx5IHVzZWQgYnkgZWZmZWN0IGludGVyZmFjZSkKKy8vCisKK3ZvaWQgRFBfcmVzZXQoRHluYW1pY3NQcm9jZXNzaW5nQ29udGV4dCAqcENvbnRleHQpCit7CisgICAgQUxPR1YoIj4gRFBfcmVzZXQoJXApIiwgcENvbnRleHQpOworICAgIGlmIChwQ29udGV4dC0+bVBEeW5hbWljcyAhPSBOVUxMKSB7CisgICAgICAgIHBDb250ZXh0LT5tUER5bmFtaWNzLT5yZXNldCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJEUF9yZXNldCglcCk6IG51bGwgRHluYW1pY3NQcm9jZXNzaW5nIiwgcENvbnRleHQpOworICAgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEUF9zZXRDb25maWcoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOiBTZXQgaW5wdXQgYW5kIG91dHB1dCBhdWRpbyBjb25maWd1cmF0aW9uLgorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vICBwQ29uZmlnOiAgICBwb2ludGVyIHRvIGVmZmVjdF9jb25maWdfdCBzdHJ1Y3R1cmUgaG9sZGluZyBpbnB1dCBhbmQgb3V0cHV0CisvLyAgICAgIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycworLy8KKy8vIE91dHB1dHM6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBEUF9zZXRDb25maWcoRHluYW1pY3NQcm9jZXNzaW5nQ29udGV4dCAqcENvbnRleHQsIGVmZmVjdF9jb25maWdfdCAqcENvbmZpZykKK3sKKyAgICBBTE9HVigiRFBfc2V0Q29uZmlnKCVwKSIsIHBDb250ZXh0KTsKKworICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUgIT0gcENvbmZpZy0+b3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSkgcmV0dXJuIC1FSU5WQUw7CisgICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzICE9IHBDb25maWctPm91dHB1dENmZy5jaGFubmVscykgcmV0dXJuIC1FSU5WQUw7CisgICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBwQ29uZmlnLT5vdXRwdXRDZmcuZm9ybWF0KSByZXR1cm4gLUVJTlZBTDsKKyAgICBpZiAocENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgIT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEUgJiYKKyAgICAgICAgICAgIHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlICE9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpIHJldHVybiAtRUlOVkFMOworICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBwQ29udGV4dC0+bUNvbmZpZyA9ICpwQ29uZmlnOworCisgICAgRFBfcmVzZXQocENvbnRleHQpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRFBfZ2V0Q29uZmlnKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZTogR2V0IGlucHV0IGFuZCBvdXRwdXQgYXVkaW8gY29uZmlndXJhdGlvbi4KKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQ6ICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CisvLyAgcENvbmZpZzogICAgcG9pbnRlciB0byBlZmZlY3RfY29uZmlnX3Qgc3RydWN0dXJlIGhvbGRpbmcgaW5wdXQgYW5kIG91dHB1dAorLy8gICAgICBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKKy8vCisvLyBPdXRwdXRzOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIERQX2dldENvbmZpZyhEeW5hbWljc1Byb2Nlc3NpbmdDb250ZXh0ICpwQ29udGV4dCwgZWZmZWN0X2NvbmZpZ190ICpwQ29uZmlnKQoreworICAgICpwQ29uZmlnID0gcENvbnRleHQtPm1Db25maWc7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRFBfaW5pdCgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6IEluaXRpYWxpemUgZW5naW5lIHdpdGggZGVmYXVsdCBjb25maWd1cmF0aW9uLgorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vCisvLyBPdXRwdXRzOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgRFBfaW5pdChEeW5hbWljc1Byb2Nlc3NpbmdDb250ZXh0ICpwQ29udGV4dCkKK3sKKyAgICBBTE9HVigiRFBfaW5pdCglcCkiLCBwQ29udGV4dCk7CisKKyAgICBwQ29udGV4dC0+bUl0ZmUgPSAmZ0RQSW50ZXJmYWNlOworICAgIHBDb250ZXh0LT5tUER5bmFtaWNzID0gTlVMTDsKKyAgICBwQ29udGV4dC0+bVN0YXRlID0gRFlOQU1JQ1NfUFJPQ0VTU0lOR19TVEFURV9VTklOSVRJQUxJWkVEOworCisgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7CisgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV9GTE9BVDsKKyAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPSA0ODAwMDsKKyAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOworICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOworICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmNvb2tpZSA9IE5VTEw7CisgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcubWFzayA9IEVGRkVDVF9DT05GSUdfQUxMOworICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURTsKKyAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IDQ4MDAwOworICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOworICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKKyAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llID0gTlVMTDsKKyAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcubWFzayA9IEVGRkVDVF9DT05GSUdfQUxMOworCisgICAgcENvbnRleHQtPm1DdXJyZW50VmFyaWFudCA9IC0xOyAvL25vbmUKKyAgICBwQ29udGV4dC0+bVByZWZlcnJlZEZyYW1lRHVyYXRpb24gPSAwOyAvL25vbmUKKworICAgIERQX3NldENvbmZpZyhwQ29udGV4dCwgJnBDb250ZXh0LT5tQ29uZmlnKTsKKyAgICBwQ29udGV4dC0+bVN0YXRlID0gRFlOQU1JQ1NfUFJPQ0VTU0lOR19TVEFURV9JTklUSUFMSVpFRDsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBEUF9jaGFuZ2VWYXJpYW50KER5bmFtaWNzUHJvY2Vzc2luZ0NvbnRleHQgKnBDb250ZXh0LCBpbnQgbmV3VmFyaWFudCkgeworICAgIEFMT0dWKCJEUF9jaGFuZ2VWYXJpYW50IGZyb20gJWQgdG8gJWQiLCBwQ29udGV4dC0+bUN1cnJlbnRWYXJpYW50LCBuZXdWYXJpYW50KTsKKyAgICBzd2l0Y2gobmV3VmFyaWFudCkgeworICAgIGNhc2UgVkFSSUFOVF9GQVZPUl9GUkVRVUVOQ1lfUkVTT0xVVElPTjogeworICAgICAgICBwQ29udGV4dC0+bUN1cnJlbnRWYXJpYW50ID0gVkFSSUFOVF9GQVZPUl9GUkVRVUVOQ1lfUkVTT0xVVElPTjsKKyAgICAgICAgZGVsZXRlIHBDb250ZXh0LT5tUER5bmFtaWNzOworICAgICAgICBwQ29udGV4dC0+bVBEeW5hbWljcyA9IG5ldyBkcF9meDo6RFBGcmVxdWVuY3koKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgQUxPR1coIkR5bmFtaWNzUHJvY2Vzc2luZyB2YXJpYW50ICVkIG5vdCBhdmFpbGFibGUgZm9yIGNyZWF0aW9uIiwgbmV3VmFyaWFudCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICB9IC8vc3dpdGNoCit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc1Bvd2VyT2YyKHVuc2lnbmVkIGxvbmcgbikgeworICAgIHJldHVybiAobiAmIChuIC0gMSkpID09IDA7Cit9CisKK3ZvaWQgRFBfY29uZmlndXJlVmFyaWFudChEeW5hbWljc1Byb2Nlc3NpbmdDb250ZXh0ICpwQ29udGV4dCwgaW50IG5ld1ZhcmlhbnQpIHsKKyAgICBBTE9HVigiRFBfY29uZmlndXJlVmFyaWFudCAlZCIsIG5ld1ZhcmlhbnQpOworICAgIHN3aXRjaChuZXdWYXJpYW50KSB7CisgICAgY2FzZSBWQVJJQU5UX0ZBVk9SX0ZSRVFVRU5DWV9SRVNPTFVUSU9OOiB7CisgICAgICAgIGludDMyX3QgbWluQmxvY2tTaXplID0gKGludDMyX3QpZHBfZng6OkRQRnJlcXVlbmN5OjpnZXRNaW5Cb2NrU2l6ZSgpOworICAgICAgICBpbnQzMl90IGRlc2lyZWRCbG9jayA9IHBDb250ZXh0LT5tUHJlZmVycmVkRnJhbWVEdXJhdGlvbiAqCisgICAgICAgICAgICAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlIC8gMTAwMC4wZjsKKyAgICAgICAgaW50MzJfdCBjdXJyZW50QmxvY2sgPSBkZXNpcmVkQmxvY2s7CisgICAgICAgIEFMT0dWKCIgc2FtcGxpbmcgcmF0ZTogJWQsIGRlc2lyZWRCbG9jayBzaXplICUwLjJmICglZCkgc2FtcGxlcyIsCisgICAgICAgICAgICAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlLCBwQ29udGV4dC0+bVByZWZlcnJlZEZyYW1lRHVyYXRpb24sCisgICAgICAgICAgICAgICAgZGVzaXJlZEJsb2NrKTsKKyAgICAgICAgaWYgKGRlc2lyZWRCbG9jayA8IG1pbkJsb2NrU2l6ZSkgeworICAgICAgICAgICAgY3VycmVudEJsb2NrID0gbWluQmxvY2tTaXplOworICAgICAgICB9IGVsc2UgaWYgKCFpc1Bvd2VyT2YyKGRlc2lyZWRCbG9jaykpIHsKKyAgICAgICAgICAgIC8vZmluZCBuZXh0IGhpZ2hlc3QgcG93ZXIgb2YgMi4KKyAgICAgICAgICAgIGN1cnJlbnRCbG9jayA9IDEgPDwgKDMyIC0gX19idWlsdGluX2NseihkZXNpcmVkQmxvY2spKTsKKyAgICAgICAgfQorICAgICAgICAoKGRwX2Z4OjpEUEZyZXF1ZW5jeSopcENvbnRleHQtPm1QRHluYW1pY3MpLT5jb25maWd1cmUoY3VycmVudEJsb2NrLAorICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jay8yLAorICAgICAgICAgICAgICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OiB7CisgICAgICAgIEFMT0dFKCJEeW5hbWljc1Byb2Nlc3NpbmcgdmFyaWFudCAlZCBub3QgYXZhaWxhYmxlIHRvIGNvbmZpZ3VyZSIsIG5ld1ZhcmlhbnQpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgfQorfQorCisvLworLy8tLS0gRWZmZWN0IExpYnJhcnkgSW50ZXJmYWNlIEltcGxlbWVudGF0aW9uCisvLworCitpbnQgRFBMaWJfUmVsZWFzZShlZmZlY3RfaGFuZGxlX3QgaGFuZGxlKSB7CisgICAgRHluYW1pY3NQcm9jZXNzaW5nQ29udGV4dCAqIHBDb250ZXh0ID0gKER5bmFtaWNzUHJvY2Vzc2luZ0NvbnRleHQgKiloYW5kbGU7CisKKyAgICBBTE9HVigiRFBMaWJfUmVsZWFzZSAlcCIsIGhhbmRsZSk7CisgICAgaWYgKHBDb250ZXh0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIGRlbGV0ZSBwQ29udGV4dC0+bVBEeW5hbWljczsKKyAgICBkZWxldGUgcENvbnRleHQ7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IERQTGliX0NyZWF0ZShjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklkIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW9JZCBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfaGFuZGxlX3QgKnBIYW5kbGUpIHsKKyAgICBBTE9HVigiRFBMaWJfQ3JlYXRlKCkiKTsKKworICAgIGlmIChwSGFuZGxlID09IE5VTEwgfHwgdXVpZCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGlmIChtZW1jbXAodXVpZCwgJmdEUERlc2NyaXB0b3IudXVpZCwgc2l6ZW9mKCp1dWlkKSkgIT0gMCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBEeW5hbWljc1Byb2Nlc3NpbmdDb250ZXh0ICpwQ29udGV4dCA9IG5ldyBEeW5hbWljc1Byb2Nlc3NpbmdDb250ZXh0OworICAgICpwSGFuZGxlID0gKGVmZmVjdF9oYW5kbGVfdClwQ29udGV4dDsKKyAgICBpbnQgcmV0ID0gRFBfaW5pdChwQ29udGV4dCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgQUxPR1coIkRQTGliX0NyZWF0ZSgpIGluaXQgZmFpbGVkIik7CisgICAgICAgIERQTGliX1JlbGVhc2UoKnBIYW5kbGUpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIEFMT0dWKCJEUExpYl9DcmVhdGUgY29udGV4dCBpcyAlcCIsIHBDb250ZXh0KTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IERQTGliX0dldERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIHsKKworICAgIGlmIChwRGVzY3JpcHRvciA9PSBOVUxMIHx8IHV1aWQgPT0gTlVMTCl7CisgICAgICAgIEFMT0dFKCJEUExpYl9HZXREZXNjcmlwdG9yKCkgY2FsbGVkIHdpdGggTlVMTCBwb2ludGVyIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGlmIChtZW1jbXAodXVpZCwgJmdEUERlc2NyaXB0b3IudXVpZCwgc2l6ZW9mKCp1dWlkKSkgPT0gMCkgeworICAgICAgICAqcERlc2NyaXB0b3IgPSBnRFBEZXNjcmlwdG9yOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gLUVJTlZBTDsKK30gLyogZW5kIERQTGliX0dldERlc2NyaXB0b3IgKi8KKworLy8KKy8vLS0tIEVmZmVjdCBDb250cm9sIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbgorLy8KK2ludCBEUF9wcm9jZXNzKGVmZmVjdF9oYW5kbGVfdCBzZWxmLCBhdWRpb19idWZmZXJfdCAqaW5CdWZmZXIsCisgICAgICAgIGF1ZGlvX2J1ZmZlcl90ICpvdXRCdWZmZXIpIHsKKyAgICBEeW5hbWljc1Byb2Nlc3NpbmdDb250ZXh0ICogcENvbnRleHQgPSAoRHluYW1pY3NQcm9jZXNzaW5nQ29udGV4dCAqKXNlbGY7CisKKyAgICBpZiAocENvbnRleHQgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiRFBfcHJvY2VzcygpIGNhbGxlZCB3aXRoIE5VTEwgY29udGV4dCIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZiAoaW5CdWZmZXIgPT0gTlVMTCB8fCBpbkJ1ZmZlci0+cmF3ID09IE5VTEwgfHwKKyAgICAgICAgb3V0QnVmZmVyID09IE5VTEwgfHwgb3V0QnVmZmVyLT5yYXcgPT0gTlVMTCB8fAorICAgICAgICBpbkJ1ZmZlci0+ZnJhbWVDb3VudCAhPSBvdXRCdWZmZXItPmZyYW1lQ291bnQgfHwKKyAgICAgICAgaW5CdWZmZXItPmZyYW1lQ291bnQgPT0gMCkgeworICAgICAgICBBTE9HRSgiaW5CdWZmZXIgb3Igb3V0QnVmZmVyIGFyZSBOVUxMIG9yIGhhdmUgcHJvYmxlbXMgd2l0aCBmcmFtZSBjb3VudCIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgaWYgKHBDb250ZXh0LT5tU3RhdGUgIT0gRFlOQU1JQ1NfUFJPQ0VTU0lOR19TVEFURV9BQ1RJVkUpIHsKKyAgICAgICAgQUxPR0UoIm1TdGF0ZSBpcyBub3QgRFlOQU1JQ1NfUFJPQ0VTU0lOR19TVEFURV9BQ1RJVkUuIEN1cnJlbnQgbVN0YXRlICVkIiwKKyAgICAgICAgICAgICAgICBwQ29udGV4dC0+bVN0YXRlKTsKKyAgICAgICAgcmV0dXJuIC1FTk9EQVRBOworICAgIH0KKyAgICAvL2lmIGR5bmFtaWNzIGV4aXN0Li4uCisgICAgaWYgKHBDb250ZXh0LT5tUER5bmFtaWNzICE9IE5VTEwpIHsKKyAgICAgICAgaW50MzJfdCBjaGFubmVsQ291bnQgPSAoaW50MzJfdClhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soCisgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5jaGFubmVscyk7CisgICAgICAgIHBDb250ZXh0LT5tUER5bmFtaWNzLT5wcm9jZXNzU2FtcGxlcyhpbkJ1ZmZlci0+ZjMyLCBpbkJ1ZmZlci0+ZjMyLAorICAgICAgICAgICAgICAgIGluQnVmZmVyLT5mcmFtZUNvdW50ICogY2hhbm5lbENvdW50KTsKKworICAgICAgICBpZiAoaW5CdWZmZXItPnJhdyAhPSBvdXRCdWZmZXItPnJhdykgeworICAgICAgICAgICAgaWYgKHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCAqIGNoYW5uZWxDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+ZjMyW2ldICs9IGluQnVmZmVyLT5mMzJbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkob3V0QnVmZmVyLT5yYXcsIGluQnVmZmVyLT5yYXcsCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiBjaGFubmVsQ291bnQgKiBzaXplb2YoZmxvYXQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vZG8gbm90aGluZy4gbm8gZWZmZWN0IGNyZWF0ZWQgeWV0LiB3YXJuaW5nLgorICAgICAgICBBTE9HVygiV2FybmluZzogbm8gRHluYW1pY3NQcm9jZXNzaW5nIGVuZ2luZSBhdmFpbGFibGUiKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvL2hlbHBlciBmdW5jdGlvbgorYm9vbCBEUF9jaGVja1NpemVzSW50KHVpbnQzMl90IHBhcmFtU2l6ZSwgdWludDMyX3QgdmFsdWVTaXplLCB1aW50MzJfdCBleHBlY3RlZFBhcmFtcywKKyAgICAgICAgdWludDMyX3QgZXhwZWN0ZWRWYWx1ZXMpIHsKKyAgICBpZiAocGFyYW1TaXplIDwgZXhwZWN0ZWRQYXJhbXMgKiBzaXplb2YoaW50MzJfdCkpIHsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgcGFyYW1TaXplOiAldSBleHBlY3RlZCAldSIsIHBhcmFtU2l6ZSwKKyAgICAgICAgICAgICAgICAodWludDMyX3QpKGV4cGVjdGVkUGFyYW1zICogc2l6ZW9mKGludDMyX3QpKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHZhbHVlU2l6ZSA8IGV4cGVjdGVkVmFsdWVzICogc2l6ZW9mKGludDMyX3QpKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIHZhbHVlU2l6ZSAldSBleHBlY3RlZCAldSIsIHZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAodWludDMyX3QpKGV4cGVjdGVkVmFsdWVzICogc2l6ZW9mKGludDMyX3QpKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBkcF9meDo6RFBDaGFubmVsKiBEUF9nZXRDaGFubmVsKER5bmFtaWNzUHJvY2Vzc2luZ0NvbnRleHQgKnBDb250ZXh0LAorICAgICAgICBpbnQzMl90IGNoYW5uZWwpIHsKKyAgICBpZiAocENvbnRleHQtPm1QRHluYW1pY3MgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZHBfZng6OkRQQ2hhbm5lbCAqcENoYW5uZWwgPSBwQ29udGV4dC0+bVBEeW5hbWljcy0+Z2V0Q2hhbm5lbChjaGFubmVsKTsKKyAgICBBTE9HRV9JRihwQ2hhbm5lbCA9PSBOVUxMLCAiRFBDaGFubmVsIE5VTEwuIGludmFsaWQgY2hhbm5lbCAlZCIsIGNoYW5uZWwpOworICAgIHJldHVybiBwQ2hhbm5lbDsKK30KKworc3RhdGljIGRwX2Z4OjpEUEVxKiBEUF9nZXRFcShEeW5hbWljc1Byb2Nlc3NpbmdDb250ZXh0ICpwQ29udGV4dCwgaW50MzJfdCBjaGFubmVsLAorICAgICAgICBpbnQzMl90IGVxVHlwZSkgeworICAgIGRwX2Z4OjpEUENoYW5uZWwgKnBDaGFubmVsID0gRFBfZ2V0Q2hhbm5lbChwQ29udGV4dCwgY2hhbm5lbCk7CisgICAgaWYgKHBDaGFubmVsID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGRwX2Z4OjpEUEVxICpwRXEgPSAoZXFUeXBlID09IERQX1BBUkFNX1BSRV9FUSA/IHBDaGFubmVsLT5nZXRQcmVFcSgpIDoKKyAgICAgICAgICAgIChlcVR5cGUgPT0gRFBfUEFSQU1fUE9TVF9FUSA/IHBDaGFubmVsLT5nZXRQb3N0RXEoKSA6IE5VTEwpKTsKKyAgICBBTE9HRV9JRihwRXEgPT0gTlVMTCwiRFBFcSBOVUxMIGludmFsaWQgZXEiKTsKKyAgICByZXR1cm4gcEVxOworfQorCitzdGF0aWMgZHBfZng6OkRQRXFCYW5kKiBEUF9nZXRFcUJhbmQoRHluYW1pY3NQcm9jZXNzaW5nQ29udGV4dCAqcENvbnRleHQsIGludDMyX3QgY2hhbm5lbCwKKyAgICAgICAgaW50MzJfdCBlcVR5cGUsIGludDMyX3QgYmFuZCkgeworICAgIGRwX2Z4OjpEUEVxICpwRXEgPSBEUF9nZXRFcShwQ29udGV4dCwgY2hhbm5lbCwgZXFUeXBlKTsKKyAgICBpZiAocEVxID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGRwX2Z4OjpEUEVxQmFuZCAqcEVxQmFuZCA9IHBFcS0+Z2V0QmFuZChiYW5kKTsKKyAgICBBTE9HRV9JRihwRXFCYW5kID09IE5VTEwsICJEUEVxQmFuZCBOVUxMLiBpbnZhbGlkIGJhbmQgJWQiLCBiYW5kKTsKKyAgICByZXR1cm4gcEVxQmFuZDsKK30KKworc3RhdGljIGRwX2Z4OjpEUE1iYyogRFBfZ2V0TWJjKER5bmFtaWNzUHJvY2Vzc2luZ0NvbnRleHQgKnBDb250ZXh0LCBpbnQzMl90IGNoYW5uZWwpIHsKKyAgICBkcF9meDo6RFBDaGFubmVsICogcENoYW5uZWwgPSBEUF9nZXRDaGFubmVsKHBDb250ZXh0LCBjaGFubmVsKTsKKyAgICBpZiAocENoYW5uZWwgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZHBfZng6OkRQTWJjICpwTWJjID0gcENoYW5uZWwtPmdldE1iYygpOworICAgIEFMT0dFX0lGKHBNYmMgPT0gTlVMTCwgIkRQTWJjIE5VTEwgaW52YWxpZCBNQkMiKTsKKyAgICByZXR1cm4gcE1iYzsKK30KKworc3RhdGljIGRwX2Z4OjpEUE1iY0JhbmQqIERQX2dldE1iY0JhbmQoRHluYW1pY3NQcm9jZXNzaW5nQ29udGV4dCAqcENvbnRleHQsIGludDMyX3QgY2hhbm5lbCwKKyAgICAgICAgaW50MzJfdCBiYW5kKSB7CisgICAgZHBfZng6OkRQTWJjICpwTWJjID0gRFBfZ2V0TWJjKHBDb250ZXh0LCBjaGFubmVsKTsKKyAgICBpZiAocE1iYyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBkcF9meDo6RFBNYmNCYW5kICpwTWJjQmFuZCA9IHBNYmMtPmdldEJhbmQoYmFuZCk7CisgICAgQUxPR0VfSUYocE1iY0JhbmQgPT0gTlVMTCwgInBNYmNCYW5kIE5VTEwuIGludmFsaWQgYmFuZCAlZCIsIGJhbmQpOworICAgIHJldHVybiBwTWJjQmFuZDsKK30KKworaW50IERQX2NvbW1hbmQoZWZmZWN0X2hhbmRsZV90IHNlbGYsIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsCisgICAgICAgIHZvaWQgKnBDbWREYXRhLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7CisKKyAgICBEeW5hbWljc1Byb2Nlc3NpbmdDb250ZXh0ICogcENvbnRleHQgPSAoRHluYW1pY3NQcm9jZXNzaW5nQ29udGV4dCAqKXNlbGY7CisKKyAgICBpZiAocENvbnRleHQgPT0gTlVMTCB8fCBwQ29udGV4dC0+bVN0YXRlID09IERZTkFNSUNTX1BST0NFU1NJTkdfU1RBVEVfVU5JTklUSUFMSVpFRCkgeworICAgICAgICBBTE9HRSgiRFBfY29tbWFuZCgpIGNhbGxlZCB3aXRoIE5VTEwgY29udGV4dCBvciB1bmluaXRpYWxpemVkIHN0YXRlLiIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBBTE9HVigiRFBfY29tbWFuZCBjb21tYW5kICVkIGNtZFNpemUgJWQiLGNtZENvZGUsIGNtZFNpemUpOworICAgIHN3aXRjaCAoY21kQ29kZSkgeworICAgIGNhc2UgRUZGRUNUX0NNRF9JTklUOgorICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFRkZFQ1RfQ01EX0lOSVQgd3JvbmcgcmVwbHlEYXRhIG9yIHJlcHlTaXplIik7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICAqKGludCAqKSBwUmVwbHlEYXRhID0gRFBfaW5pdChwQ29udGV4dCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfQ09ORklHOgorICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpCisgICAgICAgICAgICAgICAgfHwgcFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFRkZFQ1RfQ01EX1NFVF9DT05GSUcgZXJyb3Igd2l0aCBwQ21kRGF0YSwgY21kU2l6ZSwgcFJlcGx5RGF0YSBvciByZXBseVNpemUiKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgICooaW50ICopIHBSZXBseURhdGEgPSBEUF9zZXRDb25maWcocENvbnRleHQsCisgICAgICAgICAgICAgICAgKGVmZmVjdF9jb25maWdfdCAqKSBwQ21kRGF0YSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0NNRF9HRVRfQ09ORklHOgorICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8CisgICAgICAgICAgICAqcmVwbHlTaXplICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpKSB7CisgICAgICAgICAgICBBTE9HRSgiRUZGRUNUX0NNRF9HRVRfQ09ORklHIHdyb25nIHJlcGx5RGF0YSBvciByZXB5U2l6ZSIpOworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgRFBfZ2V0Q29uZmlnKHBDb250ZXh0LCAoZWZmZWN0X2NvbmZpZ190ICopcFJlcGx5RGF0YSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0NNRF9SRVNFVDoKKyAgICAgICAgRFBfcmVzZXQocENvbnRleHQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9DTURfRU5BQkxFOgorICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFRkZFQ1RfQ01EX0VOQUJMRSB3cm9uZyByZXBseURhdGEgb3IgcmVweVNpemUiKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgIGlmIChwQ29udGV4dC0+bVN0YXRlICE9IERZTkFNSUNTX1BST0NFU1NJTkdfU1RBVEVfSU5JVElBTElaRUQpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFRkZFQ1RfQ01EX0VOQUJMRSBzdGF0ZSBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IC1FTk9TWVM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwQ29udGV4dC0+bVN0YXRlID0gRFlOQU1JQ1NfUFJPQ0VTU0lOR19TVEFURV9BQ1RJVkU7CisgICAgICAgICAgICBBTE9HVigiRUZGRUNUX0NNRF9FTkFCTEUoKSBPSyIpOworICAgICAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9DTURfRElTQUJMRToKKyAgICAgICAgaWYgKHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQpKSB7CisgICAgICAgICAgICBBTE9HRSgiRUZGRUNUX0NNRF9ESVNBQkxFIHdyb25nIHJlcGx5RGF0YSBvciByZXB5U2l6ZSIpOworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBDb250ZXh0LT5tU3RhdGUgIT0gRFlOQU1JQ1NfUFJPQ0VTU0lOR19TVEFURV9BQ1RJVkUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFRkZFQ1RfQ01EX0RJU0FCTEUgc3RhdGUgbm90IGFjdGl2ZSIpOworICAgICAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gLUVOT1NZUzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBDb250ZXh0LT5tU3RhdGUgPSBEWU5BTUlDU19QUk9DRVNTSU5HX1NUQVRFX0lOSVRJQUxJWkVEOworICAgICAgICAgICAgQUxPR1YoIkVGRkVDVF9DTURfRElTQUJMRSgpIE9LIik7CisgICAgICAgICAgICAqKGludCAqKXBSZXBseURhdGEgPSAwOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0NNRF9HRVRfUEFSQU06IHsKKyAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgcFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgibnVsbCBwQ21kRGF0YSBvciBwUmVwbHlEYXRhIG9yIHJlcGx5U2l6ZSIpOworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgZWZmZWN0X3BhcmFtX3QgKnBFZmZlY3RQYXJhbSA9IChlZmZlY3RfcGFyYW1fdCAqKSBwQ21kRGF0YTsKKyAgICAgICAgdWludDMyX3QgZXhwZWN0ZWRDbWRTaXplID0gRFBfZ2V0UGFyYW1ldGVyQ21kU2l6ZShwRWZmZWN0UGFyYW0tPnBzaXplLAorICAgICAgICAgICAgICAgIHBFZmZlY3RQYXJhbS0+ZGF0YSk7CisgICAgICAgIGlmIChjbWRTaXplICE9IGV4cGVjdGVkQ21kU2l6ZSB8fCAqcmVwbHlTaXplIDwgZXhwZWN0ZWRDbWRTaXplKSB7CisgICAgICAgICAgICBBTE9HRSgiZXJyb3IgY21kU2l6ZTogJWQsIGV4cGV0ZWRDbWRTaXplOiAlZCwgcmVwbHlTaXplOiAlZCIsCisgICAgICAgICAgICAgICAgICAgIGNtZFNpemUsIGV4cGVjdGVkQ21kU2l6ZSwgKnJlcGx5U2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWVigiRFBfY29tbWFuZCBleHBlY3RlZENtZFNpemU6ICVkIiwgZXhwZWN0ZWRDbWRTaXplKTsKKyAgICAgICAgbWVtY3B5KHBSZXBseURhdGEsIHBDbWREYXRhLCBleHBlY3RlZENtZFNpemUpOworICAgICAgICBlZmZlY3RfcGFyYW1fdCAqcCA9IChlZmZlY3RfcGFyYW1fdCAqKXBSZXBseURhdGE7CisKKyAgICAgICAgdWludDMyX3Qgdm9mZnNldCA9IGNvbXB1dGVQYXJhbVZPZmZzZXQocCk7CisKKyAgICAgICAgcC0+c3RhdHVzID0gRFBfZ2V0UGFyYW1ldGVyKHBDb250ZXh0LAorICAgICAgICAgICAgICAgIHAtPnBzaXplLAorICAgICAgICAgICAgICAgIHAtPmRhdGEsCisgICAgICAgICAgICAgICAgJnAtPnZzaXplLAorICAgICAgICAgICAgICAgIHAtPmRhdGEgKyB2b2Zmc2V0KTsKKyAgICAgICAgKnJlcGx5U2l6ZSA9IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyB2b2Zmc2V0ICsgcC0+dnNpemU7CisKKyAgICAgICAgQUxPR1ZWKCJEUF9jb21tYW5kIHJlcGx5c2l6ZSAldSwgc3RhdHVzICVkIiAsICpyZXBseVNpemUsIHAtPnN0YXR1cyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEVGRkVDVF9DTURfU0VUX1BBUkFNOiB7CisgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgY21kU2l6ZSA8IChzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpICsgc2l6ZW9mKGludDMyX3QpKSB8fAorICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQzMl90KSkgeworICAgICAgICAgICAgQUxPR0UoIlx0TFZNX0VSUk9SIDogRHluYW1pY3NQcm9jZXNzaW5nIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfUEFSQU06IEVSUk9SIik7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorCisgICAgICAgIGVmZmVjdF9wYXJhbV90ICogY29uc3QgcCA9IChlZmZlY3RfcGFyYW1fdCAqKSBwQ21kRGF0YTsKKyAgICAgICAgY29uc3QgdWludDMyX3Qgdm9mZnNldCA9IGNvbXB1dGVQYXJhbVZPZmZzZXQocCk7CisKKyAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gRFBfc2V0UGFyYW1ldGVyKHBDb250ZXh0LAorICAgICAgICAgICAgICAgIHAtPnBzaXplLAorICAgICAgICAgICAgICAgICh2b2lkICopcC0+ZGF0YSwKKyAgICAgICAgICAgICAgICBwLT52c2l6ZSwKKyAgICAgICAgICAgICAgICBwLT5kYXRhICsgdm9mZnNldCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEVGRkVDVF9DTURfU0VUX1ZPTFVNRTogeworICAgICAgICBBTE9HVigiRUZGRUNUX0NNRF9TRVRfVk9MVU1FIik7CisgICAgICAgIC8vIGlmIHBSZXBseURhdGEgaXMgTlVMTCwgVk9MX0NUUkwgaXMgZGVsZWdhdGVkIHRvIGFub3RoZXIgZWZmZWN0CisgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgcmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSA8ICgoaW50KXNpemVvZihpbnQzMl90KSAqIDIpKSB7CisgICAgICAgICAgICBBTE9HVigibm8gVk9MVU1FIGRhdGEgdG8gcmV0dXJuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplIDwgKChpbnQpc2l6ZW9mKHVpbnQzMl90KSAqIDIpKSB7CisgICAgICAgICAgICBBTE9HRSgiXHRMVk1fRVJST1IgOiBEeW5hbWljc1Byb2Nlc3NpbmcgRUZGRUNUX0NNRF9TRVRfVk9MVU1FIEVSUk9SIik7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IGludDMyX3QgdW5pdHlHYWluID0gMSA8PCAyNDsKKyAgICAgICAgLy9jaGFubmVsIGNvdW50CisgICAgICAgIGludDMyX3QgY2hhbm5lbENvdW50ID0gKGludDMyX3QpYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKAorICAgICAgICAgICAgICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzKTsKKyAgICAgICAgZm9yIChpbnQzMl90IGNoID0gMDsgY2ggPCBjaGFubmVsQ291bnQ7IGNoKyspIHsKKworICAgICAgICAgICAgZHBfZng6OkRQQ2hhbm5lbCAqIHBDaGFubmVsID0gRFBfZ2V0Q2hhbm5lbChwQ29udGV4dCwgY2gpOworICAgICAgICAgICAgaWYgKHBDaGFubmVsID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXMgRUZGRUNUX0NNRF9TRVRfVk9MVU1FIGludmFsaWQgY2hhbm5lbCAlZCIsIF9fZnVuY19fLCBjaCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludDMyX3Qgb2Zmc2V0ID0gY2g7CisgICAgICAgICAgICBpZiAoY2ggPiAxKSB7CisgICAgICAgICAgICAgICAgLy8gRklYTUU6IGxpbWl0ZWQgdG8gMiB1bmlxdWUgY2hhbm5lbHMuIElmIG1vcmUgY2hhbm5lbHMgcHJlc2VudCwgdXNlIHZhbHVlIGZvcgorICAgICAgICAgICAgICAgIC8vIGZpcnN0IGNoYW5uZWwKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3QgZmxvYXQgZ2FpbiA9IChmbG9hdCkqKCh1aW50MzJfdCAqKXBDbWREYXRhICsgb2Zmc2V0KSAvIHVuaXR5R2FpbjsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IGdhaW5EYiA9IGxpbmVhclRvRGIoZ2Fpbik7CisgICAgICAgICAgICBBTE9HVlYoIiVzIEVGRkVDVF9DTURfU0VUX1ZPTFVNRSBjaGFubmVsICVkLCBlbmdpbmUgb3V0cHV0bGV2ZWwgJWYgKCUwLjJmIGRCKSIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjaCwgZ2FpbiwgZ2FpbkRiKTsKKyAgICAgICAgICAgIHBDaGFubmVsLT5zZXRPdXRwdXRHYWluKGdhaW5EYik7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBpbnQzMl90ICB2b2xSZXRbMl0gPSB7dW5pdHlHYWluLCB1bml0eUdhaW59OyAvLyBBcHBseSBubyB2b2x1bWUgYmVmb3JlIGVmZmVjdC4KKyAgICAgICAgbWVtY3B5KHBSZXBseURhdGEsIHZvbFJldCwgc2l6ZW9mKHZvbFJldCkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9ERVZJQ0U6CisgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9BVURJT19NT0RFOgorICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dXKCJEUF9jb21tYW5kIGludmFsaWQgY29tbWFuZCAlZCIsY21kQ29kZSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvL3JlZ2lzdGVyIGV4cGVjdGVkIGNtZCBzaXplCitpbnQgRFBfZ2V0UGFyYW1ldGVyQ21kU2l6ZSh1aW50MzJfdCBwYXJhbVNpemUsCisgICAgICAgIHZvaWQgKnBQYXJhbSkgeworICAgIGlmIChwYXJhbVNpemUgPCBzaXplb2YoaW50MzJfdCkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGludDMyX3QgcGFyYW0gPSAqKGludDMyX3QqKXBQYXJhbTsKKyAgICBzd2l0Y2gocGFyYW0pIHsKKyAgICBjYXNlIERQX1BBUkFNX0dFVF9DSEFOTkVMX0NPVU5UOiAvL3BhcmFtY21kCisgICAgY2FzZSBEUF9QQVJBTV9FTkdJTkVfQVJDSElURUNUVVJFOgorICAgICAgICAvL2VmZmVjdCArIHBhcmFtCisgICAgICAgIHJldHVybiAoaW50KShzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgY2FzZSBEUF9QQVJBTV9JTlBVVF9HQUlOOiAvL3BhcmFtY21kICsgcGFyYW0KKyAgICBjYXNlIERQX1BBUkFNX0xJTUlURVI6CisgICAgY2FzZSBEUF9QQVJBTV9QUkVfRVE6CisgICAgY2FzZSBEUF9QQVJBTV9QT1NUX0VROgorICAgIGNhc2UgRFBfUEFSQU1fTUJDOgorICAgICAgICAvL2VmZmVjdCArIHBhcmFtCisgICAgICAgIHJldHVybiAoaW50KShzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgMiAqIHNpemVvZih1aW50MzJfdCkpOworICAgIGNhc2UgRFBfUEFSQU1fUFJFX0VRX0JBTkQ6CisgICAgY2FzZSBEUF9QQVJBTV9QT1NUX0VRX0JBTkQ6CisgICAgY2FzZSBEUF9QQVJBTV9NQkNfQkFORDoKKyAgICAgICAgcmV0dXJuIChpbnQpKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyAzICogc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgRFBfZ2V0UGFyYW1ldGVyKER5bmFtaWNzUHJvY2Vzc2luZ0NvbnRleHQgKnBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGFyYW1TaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBWYWx1ZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwVmFsdWUpIHsKKyAgICBpbnQgc3RhdHVzID0gMDsKKyAgICBpbnQzMl90ICpwYXJhbXMgPSAoaW50MzJfdCAqKXBQYXJhbTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihmbG9hdCkgPT0gc2l6ZW9mKGludDMyX3QpICYmIHNpemVvZihmbG9hdCkgPT0gc2l6ZW9mKHZhbHVlX3QpICYmCisgICAgICAgICAgICBhbGlnbm9mKGZsb2F0KSA9PSBhbGlnbm9mKGludDMyX3QpICYmIGFsaWdub2YoZmxvYXQpID09IGFsaWdub2YodmFsdWVfdCksCisgICAgICAgICAgICAiU2l6ZS9hbGlnbm1lbnQgbWlzbWF0Y2ggZm9yIGZsb2F0L2ludDMyX3QvdmFsdWVfdCIpOworICAgIHZhbHVlX3QgKnZhbHVlcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8dmFsdWVfdCo+KHBWYWx1ZSk7CisKKyAgICBBTE9HVlYoIiVzIHN0YXJ0IiwgX19mdW5jX18pOworI2lmZGVmIFZFUllfVkVSWV9WRVJCT1NFX0xPR0dJTkcKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhcmFtU2l6ZS9zaXplb2YoaW50MzJfdCk7IGkrKykgeworICAgICAgICBBTE9HVlYoIlBhcmFtWyV6dV0gJWQiLCBpLCBwYXJhbXNbaV0pOworICAgIH0KKyNlbmRpZgorICAgIGlmIChwYXJhbVNpemUgPCBzaXplb2YoaW50MzJfdCkpIHsKKyAgICAgICAgQUxPR0UoIiVzIGludmFsaWQgcGFyYW1TaXplOiAldSIsIF9fZnVuY19fLCBwYXJhbVNpemUpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgY29uc3QgaW50MzJfdCBjb21tYW5kID0gcGFyYW1zWzBdOworICAgIHN3aXRjaCAoY29tbWFuZCkgeworICAgIGNhc2UgRFBfUEFSQU1fR0VUX0NIQU5ORUxfQ09VTlQ6IHsKKyAgICAgICAgaWYgKCFEUF9jaGVja1NpemVzSW50KHBhcmFtU2l6ZSwqcFZhbHVlU2l6ZSwgMSAvKnBhcmFtcyovLCAxIC8qdmFsdWVzKi8pKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgRFBfUEFSQU1fR0VUX0NIQU5ORUxfQ09VTlQgKGNtZCAlZCkgaW52YWxpZCBzaXplcy4iLCBfX2Z1bmNfXywgY29tbWFuZCk7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YodWludDMyX3QpOworICAgICAgICAqKHVpbnQzMl90ICopcFZhbHVlID0gKHVpbnQzMl90KWF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzaygKKyAgICAgICAgICAgICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5jaGFubmVscyk7CisgICAgICAgIEFMT0dWVigiJXMgRFBfUEFSQU1fR0VUX0NIQU5ORUxfQ09VTlQgY2hhbm5lbHMgJWQiLCBfX2Z1bmNfXywgKihpbnQzMl90ICopcFZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRFBfUEFSQU1fRU5HSU5FX0FSQ0hJVEVDVFVSRTogeworICAgICAgICBBTE9HVlYoImVuZ2luZSBhcmNoaXRlY3R1cmUgcGFyYW1zaXplOiAlZCB2YWx1ZXNpemUgJWQiLHBhcmFtU2l6ZSwgKnBWYWx1ZVNpemUpOworICAgICAgICBpZiAoIURQX2NoZWNrU2l6ZXNJbnQocGFyYW1TaXplLCAqcFZhbHVlU2l6ZSwgMSAvKnBhcmFtcyovLCA5IC8qdmFsdWVzKi8pKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgRFBfUEFSQU1fRU5HSU5FX0FSQ0hJVEVDVFVSRSAoY21kICVkKSBpbnZhbGlkIHNpemVzLiIsIF9fZnVuY19fLCBjb21tYW5kKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorLy8gICAgICAgIE51bWJlcltdIHBhcmFtcyA9IHsgUEFSQU1fRU5HSU5FX0FSQ0hJVEVDVFVSRSB9OworLy8gICAgICAgIE51bWJlcltdIHZhbHVlcyA9IHsgMCAvKjAgdmFyaWFudCAqLywKKy8vICAgICAgICAgICAgICAgIDAuMGYgLyogMSBwcmVmZXJyZWRGcmFtZUR1cmF0aW9uICovLAorLy8gICAgICAgICAgICAgICAgMCAvKjIgcHJlRXFJblVzZSAqLywKKy8vICAgICAgICAgICAgICAgIDAgLyozIHByZUVxQmFuZENvdW50ICovLAorLy8gICAgICAgICAgICAgICAgMCAvKjQgbWJjSW5Vc2UgKi8sCisvLyAgICAgICAgICAgICAgICAwIC8qNSBtYmNCYW5kQ291bnQqLywKKy8vICAgICAgICAgICAgICAgIDAgLyo2IHBvc3RFcUluVXNlICovLAorLy8gICAgICAgICAgICAgICAgMCAvKjcgcG9zdEVxQmFuZENvdW50ICovLAorLy8gICAgICAgICAgICAgICAgMCAvKjggbGltaXRlckluVXNlICovfTsKKyAgICAgICAgaWYgKHBDb250ZXh0LT5tUER5bmFtaWNzID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyBEUF9QQVJBTV9FTkdJTkVfQVJDSElURUNUVVJFIGVycm9yIG1QRHluYW1pY3MgaXMgTlVMTCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB2YWx1ZXNbMF0uaSA9IHBDb250ZXh0LT5tQ3VycmVudFZhcmlhbnQ7CisgICAgICAgIHZhbHVlc1sxXS5mID0gcENvbnRleHQtPm1QcmVmZXJyZWRGcmFtZUR1cmF0aW9uOworICAgICAgICB2YWx1ZXNbMl0uaSA9IHBDb250ZXh0LT5tUER5bmFtaWNzLT5pc1ByZUVRSW5Vc2UoKTsKKyAgICAgICAgdmFsdWVzWzNdLmkgPSBwQ29udGV4dC0+bVBEeW5hbWljcy0+Z2V0UHJlRXFCYW5kQ291bnQoKTsKKyAgICAgICAgdmFsdWVzWzRdLmkgPSBwQ29udGV4dC0+bVBEeW5hbWljcy0+aXNNYmNJblVzZSgpOworICAgICAgICB2YWx1ZXNbNV0uaSA9IHBDb250ZXh0LT5tUER5bmFtaWNzLT5nZXRNYmNCYW5kQ291bnQoKTsKKyAgICAgICAgdmFsdWVzWzZdLmkgPSBwQ29udGV4dC0+bVBEeW5hbWljcy0+aXNQb3N0RXFJblVzZSgpOworICAgICAgICB2YWx1ZXNbN10uaSA9IHBDb250ZXh0LT5tUER5bmFtaWNzLT5nZXRQb3N0RXFCYW5kQ291bnQoKTsKKyAgICAgICAgdmFsdWVzWzhdLmkgPSBwQ29udGV4dC0+bVBEeW5hbWljcy0+aXNMaW1pdGVySW5Vc2UoKTsKKworICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZih2YWx1ZV90KSAqIDk7CisKKyAgICAgICAgQUxPR1ZWKCIgdmFyaWFudCAlZCwgcHJlZmVycmVkRnJhbWVEdXJhdGlvbjogJWYsIHByZUVxSW51c2UgJWQsIGJhbmRzICVkLCBtYmNpbnVzZSAlZCwiCisgICAgICAgICAgICAgICAgIm1iY2JhbmRzICVkLCBwb3N0ZXFJblVzZSAlZCwgYmFuZHMgJWQsIGxpbWl0ZXJpbnVzZSAlZCIsCisgICAgICAgICAgICAgICAgdmFsdWVzWzBdLmksIHZhbHVlc1sxXS5mLCB2YWx1ZXNbMl0uaSwgdmFsdWVzWzNdLmksIHZhbHVlc1s0XS5pLCB2YWx1ZXNbNV0uaSwKKyAgICAgICAgICAgICAgICB2YWx1ZXNbNl0uaSwgdmFsdWVzWzddLmksIHZhbHVlc1s4XS5pKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRFBfUEFSQU1fSU5QVVRfR0FJTjogeworICAgICAgICBBTE9HVlYoImVuZ2luZSBnZXQgUEFSQU1fSU5QVVRfR0FJTiBwYXJhbXNpemU6ICVkIHZhbHVlc2l6ZSAlZCIscGFyYW1TaXplLCAqcFZhbHVlU2l6ZSk7CisgICAgICAgIGlmICghRFBfY2hlY2tTaXplc0ludChwYXJhbVNpemUsICpwVmFsdWVTaXplLCAyIC8qcGFyYW1zKi8sIDEgLyp2YWx1ZXMqLykpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyBnZXQgUEFSQU1fSU5QVVRfR0FJTiBpbnZhbGlkIHNpemVzLiIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IGludDMyX3QgY2hhbm5lbCA9IHBhcmFtc1sxXTsKKyAgICAgICAgZHBfZng6OkRQQ2hhbm5lbCAqIHBDaGFubmVsID0gRFBfZ2V0Q2hhbm5lbChwQ29udGV4dCwgY2hhbm5lbCk7CisgICAgICAgIGlmIChwQ2hhbm5lbCA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgZ2V0IFBBUkFNX0lOUFVUX0dBSU4gaW52YWxpZCBjaGFubmVsICVkIiwgX19mdW5jX18sIGNoYW5uZWwpOworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHZhbHVlc1swXS5mID0gcENoYW5uZWwtPmdldElucHV0R2FpbigpOworICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZih2YWx1ZV90KSAqIDE7CisKKyAgICAgICAgQUxPR1ZWKCIgY2hhbm5lbDogJWQsIGlucHV0IGdhaW4gJWZcbiIsIGNoYW5uZWwsIHZhbHVlc1swXS5mKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRFBfUEFSQU1fUFJFX0VROgorICAgIGNhc2UgRFBfUEFSQU1fUE9TVF9FUTogeworICAgICAgICBBTE9HVlYoImVuZ2luZSBnZXQgUEFSQU1fKl9FUSBwYXJhbXNpemU6ICVkIHZhbHVlc2l6ZSAlZCIscGFyYW1TaXplLCAqcFZhbHVlU2l6ZSk7CisgICAgICAgIGlmICghRFBfY2hlY2tTaXplc0ludChwYXJhbVNpemUsICpwVmFsdWVTaXplLCAyIC8qcGFyYW1zKi8sIDMgLyp2YWx1ZXMqLykpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyBnZXQgUEFSQU1fKl9FUSAoY21kICVkKSBpbnZhbGlkIHNpemVzLiIsIF9fZnVuY19fLCBjb21tYW5kKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorLy8gICAgICAgIE51bWJlcltdIHBhcmFtcyA9IHtwYXJhbVNldCA9PSBQQVJBTV9QUkVfRVEgPyBQQVJBTV9QUkVfRVEgOiBQQVJBTV9QT1NUX0VRLAorLy8gICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxJbmRleH07CisvLyAgICAgICAgICAgICAgIE51bWJlcltdIHZhbHVlcyA9IHswIC8qMCBpbiB1c2UgKi8sCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKjEgZW5hYmxlZCovLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyoyIGJhbmQgY291bnQgKi99OworICAgICAgICBjb25zdCBpbnQzMl90IGNoYW5uZWwgPSBwYXJhbXNbMV07CisKKyAgICAgICAgZHBfZng6OkRQRXEgKnBFcSA9IERQX2dldEVxKHBDb250ZXh0LCBjaGFubmVsLCBjb21tYW5kKTsKKyAgICAgICAgaWYgKHBFcSA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgZ2V0IFBBUkFNXypfRVEgaW52YWxpZCBlcSIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB2YWx1ZXNbMF0uaSA9IHBFcS0+aXNJblVzZSgpOworICAgICAgICB2YWx1ZXNbMV0uaSA9IHBFcS0+aXNFbmFibGVkKCk7CisgICAgICAgIHZhbHVlc1syXS5pID0gcEVxLT5nZXRCYW5kQ291bnQoKTsKKyAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YodmFsdWVfdCkgKiAzOworCisgICAgICAgIEFMT0dWVigiICVzIGNoYW5uZWw6ICVkLCBpblVzZTo6JWQsIGVuYWJsZWQ6JWQsIGJhbmRDb3VudDolZFxuIiwKKyAgICAgICAgICAgICAgICAoY29tbWFuZCA9PSBEUF9QQVJBTV9QUkVfRVEgPyAicHJlRXEiIDogInBvc3RFcSIpLCBjaGFubmVsLAorICAgICAgICAgICAgICAgIHZhbHVlc1swXS5pLCB2YWx1ZXNbMV0uaSwgdmFsdWVzWzJdLmkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBEUF9QQVJBTV9QUkVfRVFfQkFORDoKKyAgICBjYXNlIERQX1BBUkFNX1BPU1RfRVFfQkFORDogeworICAgICAgICBBTE9HVlYoImVuZ2luZSBnZXQgUEFSQU1fKl9FUV9CQU5EIHBhcmFtc2l6ZTogJWQgdmFsdWVzaXplICVkIixwYXJhbVNpemUsICpwVmFsdWVTaXplKTsKKyAgICAgICAgaWYgKCFEUF9jaGVja1NpemVzSW50KHBhcmFtU2l6ZSwgKnBWYWx1ZVNpemUsIDMgLypwYXJhbXMqLywgMyAvKnZhbHVlcyovKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzIGdldCBQQVJBTV8qX0VRX0JBTkQgKGNtZCAlZCkgaW52YWxpZCBzaXplcy4iLCBfX2Z1bmNfXywgY29tbWFuZCk7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKy8vICAgICAgICBOdW1iZXJbXSBwYXJhbXMgPSB7cGFyYW1TZXQsCisvLyAgICAgICAgICAgICAgICBjaGFubmVsSW5kZXgsCisvLyAgICAgICAgICAgICAgICBiYW5kSW5kZXh9OworLy8gICAgICAgIE51bWJlcltdIHZhbHVlcyA9IHsoZXFCYW5kLmlzRW5hYmxlZCgpID8gMSA6IDApLAorLy8gICAgICAgICAgICAgIGVxQmFuZC5nZXRDdXRvZmZGcmVxdWVuY3koKSwKKy8vICAgICAgICAgICAgICBlcUJhbmQuZ2V0R2FpbigpfTsKKyAgICAgICAgY29uc3QgaW50MzJfdCBjaGFubmVsID0gcGFyYW1zWzFdOworICAgICAgICBjb25zdCBpbnQzMl90IGJhbmQgPSBwYXJhbXNbMl07CisgICAgICAgIGludCBlcUNvbW1hbmQgPSAoY29tbWFuZCA9PSBEUF9QQVJBTV9QUkVfRVFfQkFORCA/IERQX1BBUkFNX1BSRV9FUSA6CisgICAgICAgICAgICAgICAgKGNvbW1hbmQgPT0gRFBfUEFSQU1fUE9TVF9FUV9CQU5EID8gRFBfUEFSQU1fUE9TVF9FUSA6IC0xKSk7CisKKyAgICAgICAgZHBfZng6OkRQRXFCYW5kICpwRXFCYW5kID0gRFBfZ2V0RXFCYW5kKHBDb250ZXh0LCBjaGFubmVsLCBlcUNvbW1hbmQsIGJhbmQpOworICAgICAgICBpZiAocEVxQmFuZCA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgZ2V0IFBBUkFNXypfRVFfQkFORCBpbnZhbGlkIGNoYW5uZWwgJWQgb3IgYmFuZCAlZCIsIF9fZnVuY19fLCBjaGFubmVsLCBiYW5kKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlc1swXS5pID0gcEVxQmFuZC0+aXNFbmFibGVkKCk7CisgICAgICAgIHZhbHVlc1sxXS5mID0gcEVxQmFuZC0+Z2V0Q3V0b2ZmRnJlcXVlbmN5KCk7CisgICAgICAgIHZhbHVlc1syXS5mID0gcEVxQmFuZC0+Z2V0R2FpbigpOworICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZih2YWx1ZV90KSAqIDM7CisKKyAgICAgICAgQUxPR1ZWKCIlcyBjaGFubmVsOiAlZCwgYmFuZDo6JWQsIGVuYWJsZWQ6JWQsIGN1dG9mZkZyZXF1ZW5jeTolZiwgZ2FpbiVmXG4iLAorICAgICAgICAgICAgICAgIChjb21tYW5kID09IERQX1BBUkFNX1BSRV9FUV9CQU5EID8gInByZUVxQmFuZCIgOiAicG9zdEVxQmFuZCIpLCBjaGFubmVsLCBiYW5kLAorICAgICAgICAgICAgICAgIHZhbHVlc1swXS5pLCB2YWx1ZXNbMV0uZiwgdmFsdWVzWzJdLmYpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBEUF9QQVJBTV9NQkM6IHsKKyAgICAgICAgQUxPR1ZWKCJlbmdpbmUgZ2V0IFBEUF9QQVJBTV9NQkMgcGFyYW1zaXplOiAlZCB2YWx1ZXNpemUgJWQiLHBhcmFtU2l6ZSwgKnBWYWx1ZVNpemUpOworICAgICAgICBpZiAoIURQX2NoZWNrU2l6ZXNJbnQocGFyYW1TaXplLCAqcFZhbHVlU2l6ZSwgMiAvKnBhcmFtcyovLCAzIC8qdmFsdWVzKi8pKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgZ2V0IFBEUF9QQVJBTV9NQkMgKGNtZCAlZCkgaW52YWxpZCBzaXplcy4iLCBfX2Z1bmNfXywgY29tbWFuZCk7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworLy8gICAgICAgICAgIE51bWJlcltdIHBhcmFtcyA9IHtQQVJBTV9NQkMsCisvLyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEluZGV4fTsKKy8vICAgICAgICAgICAgTnVtYmVyW10gdmFsdWVzID0gezAgLyowIGluIHVzZSAqLywKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qMSBlbmFibGVkKi8sCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKjIgYmFuZCBjb3VudCAqL307CisKKyAgICAgICAgY29uc3QgaW50MzJfdCBjaGFubmVsID0gcGFyYW1zWzFdOworCisgICAgICAgIGRwX2Z4OjpEUE1iYyAqcE1iYyA9IERQX2dldE1iYyhwQ29udGV4dCwgY2hhbm5lbCk7CisgICAgICAgIGlmIChwTWJjID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyBnZXQgUERQX1BBUkFNX01CQyBpbnZhbGlkIE1CQyIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlc1swXS5pID0gcE1iYy0+aXNJblVzZSgpOworICAgICAgICB2YWx1ZXNbMV0uaSA9IHBNYmMtPmlzRW5hYmxlZCgpOworICAgICAgICB2YWx1ZXNbMl0uaSA9IHBNYmMtPmdldEJhbmRDb3VudCgpOworICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZih2YWx1ZV90KSAqIDM7CisKKyAgICAgICAgQUxPR1ZWKCJEUF9QQVJBTV9NQkMgY2hhbm5lbDogJWQsIGluVXNlOjolZCwgZW5hYmxlZDolZCwgYmFuZENvdW50OiVkXG4iLCBjaGFubmVsLAorICAgICAgICAgICAgICAgIHZhbHVlc1swXS5pLCB2YWx1ZXNbMV0uaSwgdmFsdWVzWzJdLmkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBEUF9QQVJBTV9NQkNfQkFORDogeworICAgICAgICBBTE9HVlYoImVuZ2luZSBnZXQgRFBfUEFSQU1fTUJDX0JBTkQgcGFyYW1zaXplOiAlZCB2YWx1ZXNpemUgJWQiLHBhcmFtU2l6ZSwgKnBWYWx1ZVNpemUpOworICAgICAgICBpZiAoIURQX2NoZWNrU2l6ZXNJbnQocGFyYW1TaXplLCAqcFZhbHVlU2l6ZSwgMyAvKnBhcmFtcyovLCAxMSAvKnZhbHVlcyovKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzIGdldCBEUF9QQVJBTV9NQkNfQkFORCAoY21kICVkKSBpbnZhbGlkIHNpemVzLiIsIF9fZnVuY19fLCBjb21tYW5kKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorLy8gICAgICAgIE51bWJlcltdIHBhcmFtcyA9IHtQQVJBTV9NQkNfQkFORCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEluZGV4LAorLy8gICAgICAgICAgICAgICAgICAgICAgICBiYW5kSW5kZXh9OworLy8gICAgICAgICAgICAgICAgTnVtYmVyW10gdmFsdWVzID0gezAgLyowIGVuYWJsZWQgKi8sCisvLyAgICAgICAgICAgICAgICAgICAgICAgIDAuMGYgLyoxIGN1dG9mZkZyZXF1ZW5jeSAqLywKKy8vICAgICAgICAgICAgICAgICAgICAgICAgMC4wZiAvKjIgQXR0YWNrVGltZSAqLywKKy8vICAgICAgICAgICAgICAgICAgICAgICAgMC4wZiAvKjMgUmVsZWFzZVRpbWUgKi8sCisvLyAgICAgICAgICAgICAgICAgICAgICAgIDAuMGYgLyo0IFJhdGlvICovLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAwLjBmIC8qNSBUaHJlc2hvbGQgKi8sCisvLyAgICAgICAgICAgICAgICAgICAgICAgIDAuMGYgLyo2IEtuZWVXaWR0aCAqLywKKy8vICAgICAgICAgICAgICAgICAgICAgICAgMC4wZiAvKjcgTm9pc2VHYXRlVGhyZXNob2xkICovLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAwLjBmIC8qOCBFeHBhbmRlclJhdGlvICovLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAwLjBmIC8qOSBQcmVHYWluICovLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAwLjBmIC8qMTAgUG9zdEdhaW4qL307CisKKyAgICAgICAgY29uc3QgaW50MzJfdCBjaGFubmVsID0gcGFyYW1zWzFdOworICAgICAgICBjb25zdCBpbnQzMl90IGJhbmQgPSBwYXJhbXNbMl07CisKKyAgICAgICAgZHBfZng6OkRQTWJjQmFuZCAqcE1iY0JhbmQgPSBEUF9nZXRNYmNCYW5kKHBDb250ZXh0LCBjaGFubmVsLCBiYW5kKTsKKyAgICAgICAgaWYgKHBNYmNCYW5kID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyBnZXQgUEFSQU1fTUJDX0JBTkQgaW52YWxpZCBjaGFubmVsICVkIG9yIGJhbmQgJWQiLCBfX2Z1bmNfXywgY2hhbm5lbCwgYmFuZCk7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZXNbMF0uaSA9IHBNYmNCYW5kLT5pc0VuYWJsZWQoKTsKKyAgICAgICAgdmFsdWVzWzFdLmYgPSBwTWJjQmFuZC0+Z2V0Q3V0b2ZmRnJlcXVlbmN5KCk7CisgICAgICAgIHZhbHVlc1syXS5mID0gcE1iY0JhbmQtPmdldEF0dGFja1RpbWUoKTsKKyAgICAgICAgdmFsdWVzWzNdLmYgPSBwTWJjQmFuZC0+Z2V0UmVsZWFzZVRpbWUoKTsKKyAgICAgICAgdmFsdWVzWzRdLmYgPSBwTWJjQmFuZC0+Z2V0UmF0aW8oKTsKKyAgICAgICAgdmFsdWVzWzVdLmYgPSBwTWJjQmFuZC0+Z2V0VGhyZXNob2xkKCk7CisgICAgICAgIHZhbHVlc1s2XS5mID0gcE1iY0JhbmQtPmdldEtuZWVXaWR0aCgpOworICAgICAgICB2YWx1ZXNbN10uZiA9IHBNYmNCYW5kLT5nZXROb2lzZUdhdGVUaHJlc2hvbGQoKTsKKyAgICAgICAgdmFsdWVzWzhdLmYgPSBwTWJjQmFuZC0+Z2V0RXhwYW5kZXJSYXRpbygpOworICAgICAgICB2YWx1ZXNbOV0uZiA9IHBNYmNCYW5kLT5nZXRQcmVHYWluKCk7CisgICAgICAgIHZhbHVlc1sxMF0uZiA9IHBNYmNCYW5kLT5nZXRQb3N0R2FpbigpOworCisgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKHZhbHVlX3QpICogMTE7CisgICAgICAgIEFMT0dWVigiIG1iY0JhbmQgY2hhbm5lbDogJWQsIGJhbmQ6OiVkLCBlbmFibGVkOiVkLCBjdXRvZmZGcmVxdWVuY3k6JWYsIGF0dGFja1RpbWU6JWYsIgorICAgICAgICAgICAgICAgICJyZWxlYXNlVGltZTolZiwgcmF0aW86JWYsIHRocmVzaG9sZDolZiwga25lZVdpZHRoOiVmLCBub2lzZUdhdGVUaHJlc2hvbGQ6JWYsIgorICAgICAgICAgICAgICAgICJleHBhbmRlclJhdGlvOiVmLCBwcmVHYWluOiVmLCBwb3N0R2FpbjolZlxuIiwgY2hhbm5lbCwgYmFuZCwgdmFsdWVzWzBdLmksCisgICAgICAgICAgICAgICAgdmFsdWVzWzFdLmYsIHZhbHVlc1syXS5mLCB2YWx1ZXNbM10uZiwgdmFsdWVzWzRdLmYsIHZhbHVlc1s1XS5mLCB2YWx1ZXNbNl0uZiwKKyAgICAgICAgICAgICAgICB2YWx1ZXNbN10uZiwgdmFsdWVzWzhdLmYsIHZhbHVlc1s5XS5mLCB2YWx1ZXNbMTBdLmYpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBEUF9QQVJBTV9MSU1JVEVSOiB7CisgICAgICAgIEFMT0dWVigiZW5naW5lIGdldCBEUF9QQVJBTV9MSU1JVEVSIHBhcmFtc2l6ZTogJWQgdmFsdWVzaXplICVkIixwYXJhbVNpemUsICpwVmFsdWVTaXplKTsKKyAgICAgICAgaWYgKCFEUF9jaGVja1NpemVzSW50KHBhcmFtU2l6ZSwgKnBWYWx1ZVNpemUsIDIgLypwYXJhbXMqLywgOCAvKnZhbHVlcyovKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzIERQX1BBUkFNX0xJTUlURVIgKGNtZCAlZCkgaW52YWxpZCBzaXplcy4iLCBfX2Z1bmNfXywgY29tbWFuZCk7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IGNoYW5uZWwgPSBwYXJhbXNbMV07CisvLyAgICAgIE51bWJlcltdIHZhbHVlcyA9IHswIC8qMCBpbiB1c2UgKGludCkqLywKKy8vICAgICAgICAgICAgICAwIC8qMSBlbmFibGVkIChpbnQpKi8sCisvLyAgICAgICAgICAgICAgMCAvKjIgbGluayBncm91cCAoaW50KSovLAorLy8gICAgICAgICAgICAgIDAuMGYgLyozIGF0dGFjayB0aW1lIChmbG9hdCkqLywKKy8vICAgICAgICAgICAgICAwLjBmIC8qNCByZWxlYXNlIHRpbWUgKGZsb2F0KSovLAorLy8gICAgICAgICAgICAgIDAuMGYgLyo1IHJhdGlvIChmbG9hdCkqLywKKy8vICAgICAgICAgICAgICAwLjBmIC8qNiB0aHJlc2hvbGQgKGZsb2F0KSovLAorLy8gICAgICAgICAgICAgIDAuMGYgLyo3IHBvc3QgZ2FpbihmbG9hdCkqL307CisgICAgICAgIGRwX2Z4OjpEUENoYW5uZWwgKiBwQ2hhbm5lbCA9IERQX2dldENoYW5uZWwocENvbnRleHQsIGNoYW5uZWwpOworICAgICAgICBpZiAocENoYW5uZWwgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoIiVzIERQX1BBUkFNX0xJTUlURVIgaW52YWxpZCBjaGFubmVsICVkIiwgX19mdW5jX18sIGNoYW5uZWwpOworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRwX2Z4OjpEUExpbWl0ZXIgKnBMaW1pdGVyID0gcENoYW5uZWwtPmdldExpbWl0ZXIoKTsKKyAgICAgICAgaWYgKHBMaW1pdGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyBEUF9QQVJBTV9MSU1JVEVSIG51bGwgTElNSVRFUiIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB2YWx1ZXNbMF0uaSA9IHBMaW1pdGVyLT5pc0luVXNlKCk7CisgICAgICAgIHZhbHVlc1sxXS5pID0gcExpbWl0ZXItPmlzRW5hYmxlZCgpOworICAgICAgICB2YWx1ZXNbMl0uaSA9IHBMaW1pdGVyLT5nZXRMaW5rR3JvdXAoKTsKKyAgICAgICAgdmFsdWVzWzNdLmYgPSBwTGltaXRlci0+Z2V0QXR0YWNrVGltZSgpOworICAgICAgICB2YWx1ZXNbNF0uZiA9IHBMaW1pdGVyLT5nZXRSZWxlYXNlVGltZSgpOworICAgICAgICB2YWx1ZXNbNV0uZiA9IHBMaW1pdGVyLT5nZXRSYXRpbygpOworICAgICAgICB2YWx1ZXNbNl0uZiA9IHBMaW1pdGVyLT5nZXRUaHJlc2hvbGQoKTsKKyAgICAgICAgdmFsdWVzWzddLmYgPSBwTGltaXRlci0+Z2V0UG9zdEdhaW4oKTsKKworICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZih2YWx1ZV90KSAqIDg7CisKKyAgICAgICAgQUxPR1ZWKCIgTGltaXRlciBjaGFubmVsOiAlZCwgaW5Vc2U6OiVkLCBlbmFibGVkOiVkLCBsaW5rZ3JvdXA6JWQgYXR0YWNrVGltZTolZiwiCisgICAgICAgICAgICAgICAgInJlbGVhc2VUaW1lOiVmLCByYXRpbzolZiwgdGhyZXNob2xkOiVmLCBwb3N0R2FpbjolZlxuIiwKKyAgICAgICAgICAgICAgICBjaGFubmVsLCB2YWx1ZXNbMF0uaS8qaW5Vc2UqLywgdmFsdWVzWzFdLmkvKmVuYWJsZWQqLywgdmFsdWVzWzJdLmkvKmxpbmtHcm91cCovLAorICAgICAgICAgICAgICAgIHZhbHVlc1szXS5mLyphdHRhY2tUaW1lKi8sIHZhbHVlc1s0XS5mLypyZWxlYXNlVGltZSovLAorICAgICAgICAgICAgICAgIHZhbHVlc1s1XS5mLypyYXRpbyovLCB2YWx1ZXNbNl0uZi8qdGhyZXNob2xkKi8sCisgICAgICAgICAgICAgICAgdmFsdWVzWzddLmYvKnBvc3RHYWluKi8pOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR0UoIiVzIGludmFsaWQgcGFyYW0gJWQiLCBfX2Z1bmNfXywgcGFyYW1zWzBdKTsKKyAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgQUxPR1ZWKCIlcyBlbmQgcGFyYW06ICVkLCBzdGF0dXM6ICVkIiwgX19mdW5jX18sIHBhcmFtc1swXSwgc3RhdHVzKTsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBlbmQgRFBfZ2V0UGFyYW1ldGVyICovCisKK2ludCBEUF9zZXRQYXJhbWV0ZXIoRHluYW1pY3NQcm9jZXNzaW5nQ29udGV4dCAqcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwYXJhbVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwVmFsdWUpIHsKKyAgICBpbnQgc3RhdHVzID0gMDsKKyAgICBpbnQzMl90ICpwYXJhbXMgPSAoaW50MzJfdCAqKXBQYXJhbTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihmbG9hdCkgPT0gc2l6ZW9mKGludDMyX3QpICYmIHNpemVvZihmbG9hdCkgPT0gc2l6ZW9mKHZhbHVlX3QpICYmCisgICAgICAgICAgICBhbGlnbm9mKGZsb2F0KSA9PSBhbGlnbm9mKGludDMyX3QpICYmIGFsaWdub2YoZmxvYXQpID09IGFsaWdub2YodmFsdWVfdCksCisgICAgICAgICAgICAiU2l6ZS9hbGlnbm1lbnQgbWlzbWF0Y2ggZm9yIGZsb2F0L2ludDMyX3QvdmFsdWVfdCIpOworICAgIHZhbHVlX3QgKnZhbHVlcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8dmFsdWVfdCo+KHBWYWx1ZSk7CisKKyAgICBBTE9HVlYoIiVzIHN0YXJ0IiwgX19mdW5jX18pOworICAgIGlmIChwYXJhbVNpemUgPCBzaXplb2YoaW50MzJfdCkpIHsKKyAgICAgICAgQUxPR0UoIiVzIGludmFsaWQgcGFyYW1TaXplOiAldSIsIF9fZnVuY19fLCBwYXJhbVNpemUpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgY29uc3QgaW50MzJfdCBjb21tYW5kID0gcGFyYW1zWzBdOworICAgIHN3aXRjaCAoY29tbWFuZCkgeworICAgIGNhc2UgRFBfUEFSQU1fRU5HSU5FX0FSQ0hJVEVDVFVSRTogeworICAgICAgICBBTE9HVlYoImVuZ2luZSBhcmNoaXRlY3R1cmUgcGFyYW1zaXplOiAlZCB2YWx1ZXNpemUgJWQiLHBhcmFtU2l6ZSwgdmFsdWVTaXplKTsKKyAgICAgICAgaWYgKCFEUF9jaGVja1NpemVzSW50KHBhcmFtU2l6ZSwgdmFsdWVTaXplLCAxIC8qcGFyYW1zKi8sIDkgLyp2YWx1ZXMqLykpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyBEUF9QQVJBTV9FTkdJTkVfQVJDSElURUNUVVJFIChjbWQgJWQpIGludmFsaWQgc2l6ZXMuIiwgX19mdW5jX18sIGNvbW1hbmQpOworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisvLyAgICAgICAgTnVtYmVyW10gcGFyYW1zID0geyBQQVJBTV9FTkdJTkVfQVJDSElURUNUVVJFIH07CisvLyAgICAgICAgTnVtYmVyW10gdmFsdWVzID0geyB2YXJpYW50IC8qIHZhcmlhbnQgKi8sCisvLyAgICAgICAgICAgICAgICBwcmVmZXJyZWRGcmFtZUR1cmF0aW9uLAorLy8gICAgICAgICAgICAgICAgKHByZUVxSW5Vc2UgPyAxIDogMCksCisvLyAgICAgICAgICAgICAgICBwcmVFcUJhbmRDb3VudCwKKy8vICAgICAgICAgICAgICAgIChtYmNJblVzZSA/IDEgOiAwKSwKKy8vICAgICAgICAgICAgICAgIG1iY0JhbmRDb3VudCwKKy8vICAgICAgICAgICAgICAgIChwb3N0RXFJblVzZSA/IDEgOiAwKSwKKy8vICAgICAgICAgICAgICAgIHBvc3RFcUJhbmRDb3VudCwKKy8vICAgICAgICAgICAgICAgIChsaW1pdGVySW5Vc2UgPyAxIDogMCl9OworICAgICAgICBjb25zdCBpbnQzMl90IHZhcmlhbnQgPSB2YWx1ZXNbMF0uaTsKKyAgICAgICAgY29uc3QgZmxvYXQgcHJlZmVycmVkRnJhbWVEdXJhdGlvbiA9IHZhbHVlc1sxXS5mOworICAgICAgICBjb25zdCBpbnQzMl90IHByZUVxSW5Vc2UgPSB2YWx1ZXNbMl0uaTsKKyAgICAgICAgY29uc3QgaW50MzJfdCBwcmVFcUJhbmRDb3VudCA9IHZhbHVlc1szXS5pOworICAgICAgICBjb25zdCBpbnQzMl90IG1iY0luVXNlID0gdmFsdWVzWzRdLmk7CisgICAgICAgIGNvbnN0IGludDMyX3QgbWJjQmFuZENvdW50ID0gdmFsdWVzWzVdLmk7CisgICAgICAgIGNvbnN0IGludDMyX3QgcG9zdEVxSW5Vc2UgPSB2YWx1ZXNbNl0uaTsKKyAgICAgICAgY29uc3QgaW50MzJfdCBwb3N0RXFCYW5kQ291bnQgPSB2YWx1ZXNbN10uaTsKKyAgICAgICAgY29uc3QgaW50MzJfdCBsaW1pdGVySW5Vc2UgPSB2YWx1ZXNbOF0uaTsKKyAgICAgICAgQUxPR1ZWKCJ2YXJpYW50ICVkLCBwcmVFcUludXNlICVkLCBiYW5kcyAlZCwgbWJjaW51c2UgJWQsIG1iY2JhbmRzICVkLCBwb3N0ZXFJblVzZSAlZCwiCisgICAgICAgICAgICAgICAgImJhbmRzICVkLCBsaW1pdGVyaW51c2UgJWQiLCB2YXJpYW50LCBwcmVFcUluVXNlLCBwcmVFcUJhbmRDb3VudCwgbWJjSW5Vc2UsCisgICAgICAgICAgICAgICAgbWJjQmFuZENvdW50LCBwb3N0RXFJblVzZSwgcG9zdEVxQmFuZENvdW50LCBsaW1pdGVySW5Vc2UpOworCisgICAgICAgIC8vc2V0IHZhcmlhbnQgKGluc3RhbnRpYXRlIGVmZmVjdCkKKyAgICAgICAgLy9pbml0QXJjaGl0ZWN0dXJlIGZvciBlZmZlY3QKKyAgICAgICAgRFBfY2hhbmdlVmFyaWFudChwQ29udGV4dCwgdmFyaWFudCk7CisgICAgICAgIGlmIChwQ29udGV4dC0+bVBEeW5hbWljcyA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgRFBfUEFSQU1fRU5HSU5FX0FSQ0hJVEVDVFVSRSBlcnJvciBzZXR0aW5nIHZhcmlhbnQgJWQiLCBfX2Z1bmNfXywgdmFyaWFudCk7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcENvbnRleHQtPm1QcmVmZXJyZWRGcmFtZUR1cmF0aW9uID0gcHJlZmVycmVkRnJhbWVEdXJhdGlvbjsKKyAgICAgICAgcENvbnRleHQtPm1QRHluYW1pY3MtPmluaXQoKHVpbnQzMl90KWF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzaygKKyAgICAgICAgICAgICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5jaGFubmVscyksCisgICAgICAgICAgICAgICAgcHJlRXFJblVzZSAhPSAwLCAodWludDMyX3QpcHJlRXFCYW5kQ291bnQsCisgICAgICAgICAgICAgICAgbWJjSW5Vc2UgIT0gMCwgKHVpbnQzMl90KW1iY0JhbmRDb3VudCwKKyAgICAgICAgICAgICAgICBwb3N0RXFJblVzZSAhPSAwLCAodWludDMyX3QpcG9zdEVxQmFuZENvdW50LAorICAgICAgICAgICAgICAgIGxpbWl0ZXJJblVzZSAhPSAwKTsKKworICAgICAgICBEUF9jb25maWd1cmVWYXJpYW50KHBDb250ZXh0LCB2YXJpYW50KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRFBfUEFSQU1fSU5QVVRfR0FJTjogeworICAgICAgICBBTE9HVlYoImVuZ2luZSBEUF9QQVJBTV9JTlBVVF9HQUlOIHBhcmFtc2l6ZTogJWQgdmFsdWVzaXplICVkIixwYXJhbVNpemUsIHZhbHVlU2l6ZSk7CisgICAgICAgIGlmICghRFBfY2hlY2tTaXplc0ludChwYXJhbVNpemUsIHZhbHVlU2l6ZSwgMiAvKnBhcmFtcyovLCAxIC8qdmFsdWVzKi8pKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgRFBfUEFSQU1fSU5QVVRfR0FJTiBpbnZhbGlkIHNpemVzLiIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IGludDMyX3QgY2hhbm5lbCA9IHBhcmFtc1sxXTsKKyAgICAgICAgZHBfZng6OkRQQ2hhbm5lbCAqIHBDaGFubmVsID0gRFBfZ2V0Q2hhbm5lbChwQ29udGV4dCwgY2hhbm5lbCk7CisgICAgICAgIGlmIChwQ2hhbm5lbCA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgRFBfUEFSQU1fSU5QVVRfR0FJTiBpbnZhbGlkIGNoYW5uZWwgJWQiLCBfX2Z1bmNfXywgY2hhbm5lbCk7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgZmxvYXQgZ2FpbiA9IHZhbHVlc1swXS5mOworICAgICAgICBBTE9HVlYoIiVzIERQX1BBUkFNX0lOUFVUX0dBSU4gY2hhbm5lbCAlZCwgbGV2ZWwgJWYiLCBfX2Z1bmNfXywgY2hhbm5lbCwgZ2Fpbik7CisgICAgICAgIHBDaGFubmVsLT5zZXRJbnB1dEdhaW4oZ2Fpbik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIERQX1BBUkFNX1BSRV9FUToKKyAgICBjYXNlIERQX1BBUkFNX1BPU1RfRVE6IHsKKyAgICAgICAgQUxPR1ZWKCJlbmdpbmUgRFBfUEFSQU1fKl9FUSBwYXJhbXNpemU6ICVkIHZhbHVlc2l6ZSAlZCIscGFyYW1TaXplLCB2YWx1ZVNpemUpOworICAgICAgICBpZiAoIURQX2NoZWNrU2l6ZXNJbnQocGFyYW1TaXplLCB2YWx1ZVNpemUsIDIgLypwYXJhbXMqLywgMyAvKnZhbHVlcyovKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzIERQX1BBUkFNXypfRVEgKGNtZCAlZCkgaW52YWxpZCBzaXplcy4iLCBfX2Z1bmNfXywgY29tbWFuZCk7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKy8vICAgICAgICBOdW1iZXJbXSBwYXJhbXMgPSB7cGFyYW1TZXQsCisvLyAgICAgICAgICAgICAgICBjaGFubmVsSW5kZXh9OworLy8gICAgICAgIE51bWJlcltdIHZhbHVlcyA9IHsgKGVxLmlzSW5Vc2UoKSA/IDEgOiAwKSwKKy8vICAgICAgICAgICAgICAgIChlcS5pc0VuYWJsZWQoKSA/IDEgOiAwKSwKKy8vICAgICAgICAgICAgICAgIGJhbmRDb3VudH07CisgICAgICAgIGNvbnN0IGludDMyX3QgY2hhbm5lbCA9IHBhcmFtc1sxXTsKKworICAgICAgICBjb25zdCBpbnQzMl90IGVuYWJsZWQgPSB2YWx1ZXNbMV0uaTsKKyAgICAgICAgY29uc3QgaW50MzJfdCBiYW5kQ291bnQgPSB2YWx1ZXNbMl0uaTsKKyAgICAgICAgQUxPR1ZWKCIgJXMgY2hhbm5lbDogJWQsIGluVXNlOjolZCwgZW5hYmxlZDolZCwgYmFuZENvdW50OiVkXG4iLAorICAgICAgICAgICAgICAgIChjb21tYW5kID09IERQX1BBUkFNX1BSRV9FUSA/ICJwcmVFcSIgOiAicG9zdEVxIiksIGNoYW5uZWwsIHZhbHVlc1swXS5pLAorICAgICAgICAgICAgICAgIHZhbHVlc1syXS5pLCBiYW5kQ291bnQpOworCisgICAgICAgIGRwX2Z4OjpEUEVxICpwRXEgPSBEUF9nZXRFcShwQ29udGV4dCwgY2hhbm5lbCwgY29tbWFuZCk7CisgICAgICAgIGlmIChwRXEgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoIiVzIHNldCBQQVJBTV8qX0VRIGludmFsaWQgY2hhbm5lbCAlZCBvciBjb21tYW5kICVkIiwgX19mdW5jX18sIGNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQpOworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcEVxLT5zZXRFbmFibGVkKGVuYWJsZWQgIT0gMCk7CisgICAgICAgIC8vZmFpbCBpZiBiYW5kY291bnRpcyBkaWZmZXJlbnQ/IG1heWJlLgorICAgICAgICBpZiAoKGludDMyX3QpcEVxLT5nZXRCYW5kQ291bnQoKSAhPSBiYW5kQ291bnQpIHsKKyAgICAgICAgICAgIEFMT0dXKCIlcyB3YXJuaW5nLCB0cnlpbmcgdG8gc2V0IGRpZmZlcmVudCBiYW5kY291bnQgZnJvbSAlZCB0byAlZCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgICBwRXEtPmdldEJhbmRDb3VudCgpLCBiYW5kQ291bnQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIERQX1BBUkFNX1BSRV9FUV9CQU5EOgorICAgIGNhc2UgRFBfUEFSQU1fUE9TVF9FUV9CQU5EOiB7CisgICAgICAgIEFMT0dWVigiZW5naW5lIHNldCBQQVJBTV8qX0VRX0JBTkQgcGFyYW1zaXplOiAlZCB2YWx1ZXNpemUgJWQiLHBhcmFtU2l6ZSwgdmFsdWVTaXplKTsKKyAgICAgICAgaWYgKCFEUF9jaGVja1NpemVzSW50KHBhcmFtU2l6ZSwgdmFsdWVTaXplLCAzIC8qcGFyYW1zKi8sIDMgLyp2YWx1ZXMqLykpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyBQQVJBTV8qX0VRX0JBTkQgKGNtZCAlZCkgaW52YWxpZCBzaXplcy4iLCBfX2Z1bmNfXywgY29tbWFuZCk7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKy8vICAgICAgICBOdW1iZXJbXSB2YWx1ZXMgPSB7IGNoYW5uZWxJbmRleCwKKy8vICAgICAgICAgICAgICAgIGJhbmRJbmRleCwKKy8vICAgICAgICAgICAgICAgIChlcUJhbmQuaXNFbmFibGVkKCkgPyAxIDogMCksCisvLyAgICAgICAgICAgICAgICBlcUJhbmQuZ2V0Q3V0b2ZmRnJlcXVlbmN5KCksCisvLyAgICAgICAgICAgICAgICBlcUJhbmQuZ2V0R2FpbigpfTsKKworLy8gICAgICAgIE51bWJlcltdIHBhcmFtcyA9IHtwYXJhbVNldCwKKy8vICAgICAgICAgICAgICAgIGNoYW5uZWxJbmRleCwKKy8vICAgICAgICAgICAgICAgIGJhbmRJbmRleH07CisvLyAgICAgICAgTnVtYmVyW10gdmFsdWVzID0geyhlcUJhbmQuaXNFbmFibGVkKCkgPyAxIDogMCksCisvLyAgICAgICAgICAgICAgZXFCYW5kLmdldEN1dG9mZkZyZXF1ZW5jeSgpLAorLy8gICAgICAgICAgICAgIGVxQmFuZC5nZXRHYWluKCl9OworCisgICAgICAgIGNvbnN0IGludDMyX3QgY2hhbm5lbCA9IHBhcmFtc1sxXTsKKyAgICAgICAgY29uc3QgaW50MzJfdCBiYW5kID0gcGFyYW1zWzJdOworCisgICAgICAgIGNvbnN0IGludDMyX3QgZW5hYmxlZCA9IHZhbHVlc1swXS5pOworICAgICAgICBjb25zdCBmbG9hdCBjdXRvZmZGcmVxdWVuY3kgPSB2YWx1ZXNbMV0uZjsKKyAgICAgICAgY29uc3QgZmxvYXQgZ2FpbiA9IHZhbHVlc1syXS5mOworCisKKyAgICAgICAgQUxPR1ZWKCIgJXMgY2hhbm5lbDogJWQsIGJhbmQ6OiVkLCBlbmFibGVkOiVkLCBjdXRvZmZGcmVxdWVuY3k6JWYsIGdhaW4lZlxuIiwKKyAgICAgICAgICAgICAgICAoY29tbWFuZCA9PSBEUF9QQVJBTV9QUkVfRVFfQkFORCA/ICJwcmVFcUJhbmQiIDogInBvc3RFcUJhbmQiKSwgY2hhbm5lbCwgYmFuZCwKKyAgICAgICAgICAgICAgICBlbmFibGVkLCBjdXRvZmZGcmVxdWVuY3ksIGdhaW4pOworCisgICAgICAgIGludCBlcUNvbW1hbmQgPSAoY29tbWFuZCA9PSBEUF9QQVJBTV9QUkVfRVFfQkFORCA/IERQX1BBUkFNX1BSRV9FUSA6CisgICAgICAgICAgICAgICAgKGNvbW1hbmQgPT0gRFBfUEFSQU1fUE9TVF9FUV9CQU5EID8gRFBfUEFSQU1fUE9TVF9FUSA6IC0xKSk7CisgICAgICAgIGRwX2Z4OjpEUEVxICpwRXEgPSBEUF9nZXRFcShwQ29udGV4dCwgY2hhbm5lbCwgZXFDb21tYW5kKTsKKyAgICAgICAgaWYgKHBFcSA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgc2V0IFBBUkFNXypfRVFfQkFORCBpbnZhbGlkIGNoYW5uZWwgJWQgb3IgY29tbWFuZCAlZCIsIF9fZnVuY19fLCBjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICBjb21tYW5kKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRwX2Z4OjpEUEVxQmFuZCBlcUJhbmQ7CisgICAgICAgIGVxQmFuZC5pbml0KGVuYWJsZWQgIT0gMCwgY3V0b2ZmRnJlcXVlbmN5LCBnYWluKTsKKyAgICAgICAgcEVxLT5zZXRCYW5kKGJhbmQsIGVxQmFuZCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIERQX1BBUkFNX01CQzogeworICAgICAgICBBTE9HVlYoImVuZ2luZSBEUF9QQVJBTV9NQkMgcGFyYW1zaXplOiAlZCB2YWx1ZXNpemUgJWQiLHBhcmFtU2l6ZSwgdmFsdWVTaXplKTsKKyAgICAgICAgaWYgKCFEUF9jaGVja1NpemVzSW50KHBhcmFtU2l6ZSwgdmFsdWVTaXplLCAyIC8qcGFyYW1zKi8sIDMgLyp2YWx1ZXMqLykpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyBEUF9QQVJBTV9NQkMgKGNtZCAlZCkgaW52YWxpZCBzaXplcy4iLCBfX2Z1bmNfXywgY29tbWFuZCk7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKy8vICAgICAgICAgICAgTnVtYmVyW10gcGFyYW1zID0geyBQQVJBTV9NQkMsCisvLyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEluZGV4fTsKKy8vICAgICAgICAgICAgTnVtYmVyW10gdmFsdWVzID0geyhtYmMuaXNJblVzZSgpID8gMSA6IDApLAorLy8gICAgICAgICAgICAgICAgICAgIChtYmMuaXNFbmFibGVkKCkgPyAxIDogMCksCisvLyAgICAgICAgICAgICAgICAgICAgYmFuZENvdW50fTsKKyAgICAgICAgY29uc3QgaW50MzJfdCBjaGFubmVsID0gcGFyYW1zWzFdOworCisgICAgICAgIGNvbnN0IGludDMyX3QgZW5hYmxlZCA9IHZhbHVlc1sxXS5pOworICAgICAgICBjb25zdCBpbnQzMl90IGJhbmRDb3VudCA9IHZhbHVlc1syXS5pOworICAgICAgICBBTE9HVlYoIk1CQyBjaGFubmVsOiAlZCwgaW5Vc2U6OiVkLCBlbmFibGVkOiVkLCBiYW5kQ291bnQ6JWRcbiIsIGNoYW5uZWwsIHZhbHVlc1swXS5pLAorICAgICAgICAgICAgICAgIGVuYWJsZWQsIGJhbmRDb3VudCk7CisKKyAgICAgICAgZHBfZng6OkRQTWJjICpwTWJjID0gRFBfZ2V0TWJjKHBDb250ZXh0LCBjaGFubmVsKTsKKyAgICAgICAgaWYgKHBNYmMgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoIiVzIHNldCBEUF9QQVJBTV9NQkMgaW52YWxpZCBjaGFubmVsICVkICIsIF9fZnVuY19fLCBjaGFubmVsKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHBNYmMtPnNldEVuYWJsZWQoZW5hYmxlZCAhPSAwKTsKKyAgICAgICAgLy9mYWlsIGlmIGJhbmRjb3VudGlzIGRpZmZlcmVudD8gbWF5YmUuCisgICAgICAgIGlmICgoaW50MzJfdClwTWJjLT5nZXRCYW5kQ291bnQoKSAhPSBiYW5kQ291bnQpIHsKKyAgICAgICAgICAgIEFMT0dXKCIlcyB3YXJuaW5nLCB0cnlpbmcgdG8gc2V0IGRpZmZlcmVudCBiYW5kY291bnQgZnJvbSAlZCB0byAlZCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgICBwTWJjLT5nZXRCYW5kQ291bnQoKSwgYmFuZENvdW50KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBEUF9QQVJBTV9NQkNfQkFORDogeworICAgICAgICBBTE9HVlYoImVuZ2luZSBzZXQgRFBfUEFSQU1fTUJDX0JBTkQgcGFyYW1zaXplOiAlZCB2YWx1ZXNpemUgJWQgIixwYXJhbVNpemUsIHZhbHVlU2l6ZSk7CisgICAgICAgIGlmICghRFBfY2hlY2tTaXplc0ludChwYXJhbVNpemUsIHZhbHVlU2l6ZSwgMyAvKnBhcmFtcyovLCAxMSAvKnZhbHVlcyovKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzIERQX1BBUkFNX01CQ19CQU5EOiAoY21kICVkKSBpbnZhbGlkIHNpemVzLiIsIF9fZnVuY19fLCBjb21tYW5kKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorLy8gICAgICAgIE51bWJlcltdIHBhcmFtcyA9IHsgUEFSQU1fTUJDX0JBTkQsCisvLyAgICAgICAgICAgICAgICBjaGFubmVsSW5kZXgsCisvLyAgICAgICAgICAgICAgICBiYW5kSW5kZXh9OworLy8gICAgICAgIE51bWJlcltdIHZhbHVlcyA9IHsobWJjQmFuZC5pc0VuYWJsZWQoKSA/IDEgOiAwKSwKKy8vICAgICAgICAgICAgICAgIG1iY0JhbmQuZ2V0Q3V0b2ZmRnJlcXVlbmN5KCksCisvLyAgICAgICAgICAgICAgICBtYmNCYW5kLmdldEF0dGFja1RpbWUoKSwKKy8vICAgICAgICAgICAgICAgIG1iY0JhbmQuZ2V0UmVsZWFzZVRpbWUoKSwKKy8vICAgICAgICAgICAgICAgIG1iY0JhbmQuZ2V0UmF0aW8oKSwKKy8vICAgICAgICAgICAgICAgIG1iY0JhbmQuZ2V0VGhyZXNob2xkKCksCisvLyAgICAgICAgICAgICAgICBtYmNCYW5kLmdldEtuZWVXaWR0aCgpLAorLy8gICAgICAgICAgICAgICAgbWJjQmFuZC5nZXROb2lzZUdhdGVUaHJlc2hvbGQoKSwKKy8vICAgICAgICAgICAgICAgIG1iY0JhbmQuZ2V0RXhwYW5kZXJSYXRpbygpLAorLy8gICAgICAgICAgICAgICAgbWJjQmFuZC5nZXRQcmVHYWluKCksCisvLyAgICAgICAgICAgICAgICBtYmNCYW5kLmdldFBvc3RHYWluKCl9OworCisgICAgICAgIGNvbnN0IGludDMyX3QgY2hhbm5lbCA9IHBhcmFtc1sxXTsKKyAgICAgICAgY29uc3QgaW50MzJfdCBiYW5kID0gcGFyYW1zWzJdOworCisgICAgICAgIGNvbnN0IGludDMyX3QgZW5hYmxlZCA9IHZhbHVlc1swXS5pOworICAgICAgICBjb25zdCBmbG9hdCBjdXRvZmZGcmVxdWVuY3kgPSB2YWx1ZXNbMV0uZjsKKyAgICAgICAgY29uc3QgZmxvYXQgYXR0YWNrVGltZSA9IHZhbHVlc1syXS5mOworICAgICAgICBjb25zdCBmbG9hdCByZWxlYXNlVGltZSA9IHZhbHVlc1szXS5mOworICAgICAgICBjb25zdCBmbG9hdCByYXRpbyA9IHZhbHVlc1s0XS5mOworICAgICAgICBjb25zdCBmbG9hdCB0aHJlc2hvbGQgPSB2YWx1ZXNbNV0uZjsKKyAgICAgICAgY29uc3QgZmxvYXQga25lZVdpZHRoID0gdmFsdWVzWzZdLmY7CisgICAgICAgIGNvbnN0IGZsb2F0IG5vaXNlR2F0ZVRocmVzaG9sZCA9IHZhbHVlc1s3XS5mOworICAgICAgICBjb25zdCBmbG9hdCBleHBhbmRlclJhdGlvID0gdmFsdWVzWzhdLmY7CisgICAgICAgIGNvbnN0IGZsb2F0IHByZUdhaW4gPSB2YWx1ZXNbOV0uZjsKKyAgICAgICAgY29uc3QgZmxvYXQgcG9zdEdhaW4gPSB2YWx1ZXNbMTBdLmY7CisKKyAgICAgICAgQUxPR1ZWKCIgbWJjQmFuZCBjaGFubmVsOiAlZCwgYmFuZDo6JWQsIGVuYWJsZWQ6JWQsIGN1dG9mZkZyZXF1ZW5jeTolZiwgYXR0YWNrVGltZTolZiwiCisgICAgICAgICAgICAgICAgInJlbGVhc2VUaW1lOiVmLCByYXRpbzolZiwgdGhyZXNob2xkOiVmLCBrbmVlV2lkdGg6JWYsIG5vaXNlR2F0ZVRocmVzaG9sZDolZiwiCisgICAgICAgICAgICAgICAgImV4cGFuZGVyUmF0aW86JWYsIHByZUdhaW46JWYsIHBvc3RHYWluOiVmXG4iLAorICAgICAgICAgICAgICAgIGNoYW5uZWwsIGJhbmQsIGVuYWJsZWQsIGN1dG9mZkZyZXF1ZW5jeSwgYXR0YWNrVGltZSwgcmVsZWFzZVRpbWUsIHJhdGlvLAorICAgICAgICAgICAgICAgIHRocmVzaG9sZCwga25lZVdpZHRoLCBub2lzZUdhdGVUaHJlc2hvbGQsIGV4cGFuZGVyUmF0aW8sIHByZUdhaW4sIHBvc3RHYWluKTsKKworICAgICAgICBkcF9meDo6RFBNYmMgKnBNYmMgPSBEUF9nZXRNYmMocENvbnRleHQsIGNoYW5uZWwpOworICAgICAgICBpZiAocE1iYyA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgc2V0IERQX1BBUkFNX01CQ19CQU5EIGludmFsaWQgY2hhbm5lbCAlZCIsIF9fZnVuY19fLCBjaGFubmVsKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRwX2Z4OjpEUE1iY0JhbmQgbWJjQmFuZDsKKyAgICAgICAgbWJjQmFuZC5pbml0KGVuYWJsZWQgIT0gMCwgY3V0b2ZmRnJlcXVlbmN5LCBhdHRhY2tUaW1lLCByZWxlYXNlVGltZSwgcmF0aW8sIHRocmVzaG9sZCwKKyAgICAgICAgICAgICAgICBrbmVlV2lkdGgsIG5vaXNlR2F0ZVRocmVzaG9sZCwgZXhwYW5kZXJSYXRpbywgcHJlR2FpbiwgcG9zdEdhaW4pOworICAgICAgICBwTWJjLT5zZXRCYW5kKGJhbmQsIG1iY0JhbmQpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBEUF9QQVJBTV9MSU1JVEVSOiB7CisgICAgICAgIEFMT0dWVigiZW5naW5lIERQX1BBUkFNX0xJTUlURVIgcGFyYW1zaXplOiAlZCB2YWx1ZXNpemUgJWQiLHBhcmFtU2l6ZSwgdmFsdWVTaXplKTsKKyAgICAgICAgaWYgKCFEUF9jaGVja1NpemVzSW50KHBhcmFtU2l6ZSwgdmFsdWVTaXplLCAyIC8qcGFyYW1zKi8sIDggLyp2YWx1ZXMqLykpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyBEUF9QQVJBTV9MSU1JVEVSIChjbWQgJWQpIGludmFsaWQgc2l6ZXMuIiwgX19mdW5jX18sIGNvbW1hbmQpOworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisvLyAgICAgICAgICAgIE51bWJlcltdIHBhcmFtcyA9IHsgUEFSQU1fTElNSVRFUiwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsSW5kZXh9OworLy8gICAgICAgICAgICAgICAgICAgICBOdW1iZXJbXSB2YWx1ZXMgPSB7KGxpbWl0ZXIuaXNJblVzZSgpID8gMSA6IDApLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaW1pdGVyLmlzRW5hYmxlZCgpID8gMSA6IDApLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ZXIuZ2V0TGlua0dyb3VwKCksCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXRlci5nZXRBdHRhY2tUaW1lKCksCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXRlci5nZXRSZWxlYXNlVGltZSgpLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ZXIuZ2V0UmF0aW8oKSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdGVyLmdldFRocmVzaG9sZCgpLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ZXIuZ2V0UG9zdEdhaW4oKX07CisKKyAgICAgICAgY29uc3QgaW50MzJfdCBjaGFubmVsID0gcGFyYW1zWzFdOworCisgICAgICAgIGNvbnN0IGludDMyX3QgaW5Vc2UgPSB2YWx1ZXNbMF0uaTsKKyAgICAgICAgY29uc3QgaW50MzJfdCBlbmFibGVkID0gdmFsdWVzWzFdLmk7CisgICAgICAgIGNvbnN0IGludDMyX3QgbGlua0dyb3VwID0gdmFsdWVzWzJdLmk7CisgICAgICAgIGNvbnN0IGZsb2F0IGF0dGFja1RpbWUgPSB2YWx1ZXNbM10uZjsKKyAgICAgICAgY29uc3QgZmxvYXQgcmVsZWFzZVRpbWUgPSB2YWx1ZXNbNF0uZjsKKyAgICAgICAgY29uc3QgZmxvYXQgcmF0aW8gPSB2YWx1ZXNbNV0uZjsKKyAgICAgICAgY29uc3QgZmxvYXQgdGhyZXNob2xkID0gdmFsdWVzWzZdLmY7CisgICAgICAgIGNvbnN0IGZsb2F0IHBvc3RHYWluID0gdmFsdWVzWzddLmY7CisKKyAgICAgICAgQUxPR1ZWKCIgTGltaXRlciBjaGFubmVsOiAlZCwgaW5Vc2U6OiVkLCBlbmFibGVkOiVkLCBsaW5rZ3JvdXA6JWQgYXR0YWNrVGltZTolZiwiCisgICAgICAgICAgICAgICAgInJlbGVhc2VUaW1lOiVmLCByYXRpbzolZiwgdGhyZXNob2xkOiVmLCBwb3N0R2FpbjolZlxuIiwgY2hhbm5lbCwgaW5Vc2UsCisgICAgICAgICAgICAgICAgZW5hYmxlZCwgbGlua0dyb3VwLCBhdHRhY2tUaW1lLCByZWxlYXNlVGltZSwgcmF0aW8sIHRocmVzaG9sZCwgcG9zdEdhaW4pOworCisgICAgICAgIGRwX2Z4OjpEUENoYW5uZWwgKiBwQ2hhbm5lbCA9IERQX2dldENoYW5uZWwocENvbnRleHQsIGNoYW5uZWwpOworICAgICAgICBpZiAocENoYW5uZWwgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoIiVzIERQX1BBUkFNX0xJTUlURVIgaW52YWxpZCBjaGFubmVsICVkIiwgX19mdW5jX18sIGNoYW5uZWwpOworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRwX2Z4OjpEUExpbWl0ZXIgbGltaXRlcjsKKyAgICAgICAgbGltaXRlci5pbml0KGluVXNlICE9IDAsIGVuYWJsZWQgIT0gMCwgbGlua0dyb3VwLCBhdHRhY2tUaW1lLCByZWxlYXNlVGltZSwgcmF0aW8sCisgICAgICAgICAgICAgICAgdGhyZXNob2xkLCBwb3N0R2Fpbik7CisgICAgICAgIHBDaGFubmVsLT5zZXRMaW1pdGVyKGxpbWl0ZXIpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR0UoIiVzIGludmFsaWQgcGFyYW0gJWQiLCBfX2Z1bmNfXywgcGFyYW1zWzBdKTsKKyAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgQUxPR1ZWKCIlcyBlbmQgcGFyYW06ICVkLCBzdGF0dXM6ICVkIiwgX19mdW5jX18sIHBhcmFtc1swXSwgc3RhdHVzKTsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBlbmQgRFBfc2V0UGFyYW1ldGVyICovCisKKy8qIEVmZmVjdCBDb250cm9sIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbjogZ2V0X2Rlc2NyaXB0b3IgKi8KK2ludCBEUF9nZXREZXNjcmlwdG9yKGVmZmVjdF9oYW5kbGVfdCBzZWxmLAorICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikKK3sKKyAgICBEeW5hbWljc1Byb2Nlc3NpbmdDb250ZXh0ICogcENvbnRleHQgPSAoRHluYW1pY3NQcm9jZXNzaW5nQ29udGV4dCAqKSBzZWxmOworCisgICAgaWYgKHBDb250ZXh0ID09IE5VTEwgfHwgcERlc2NyaXB0b3IgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiRFBfZ2V0RGVzY3JpcHRvcigpIGludmFsaWQgcGFyYW0iKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgKnBEZXNjcmlwdG9yID0gZ0RQRGVzY3JpcHRvcjsKKworICAgIHJldHVybiAwOworfSAvKiBlbmQgRFBfZ2V0RGVzY3JpcHRvciAqLworCisKKy8vIGVmZmVjdF9oYW5kbGVfdCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIER5bmFtaWNzIFByb2Nlc3NpbmcgZWZmZWN0Citjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zIGdEUEludGVyZmFjZSA9IHsKKyAgICAgICAgRFBfcHJvY2VzcywKKyAgICAgICAgRFBfY29tbWFuZCwKKyAgICAgICAgRFBfZ2V0RGVzY3JpcHRvciwKKyAgICAgICAgTlVMTCwKK307CisKK2V4dGVybiAiQyIgeworLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAorX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQorYXVkaW9fZWZmZWN0X2xpYnJhcnlfdCBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTSA9IHsKKyAgICAudGFnID0gQVVESU9fRUZGRUNUX0xJQlJBUllfVEFHLAorICAgIC52ZXJzaW9uID0gRUZGRUNUX0xJQlJBUllfQVBJX1ZFUlNJT04sCisgICAgLm5hbWUgPSAiRHluYW1pY3MgUHJvY2Vzc2luZyBMaWJyYXJ5IiwKKyAgICAuaW1wbGVtZW50b3IgPSAiVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCIsCisgICAgLmNyZWF0ZV9lZmZlY3QgPSBEUExpYl9DcmVhdGUsCisgICAgLnJlbGVhc2VfZWZmZWN0ID0gRFBMaWJfUmVsZWFzZSwKKyAgICAuZ2V0X2Rlc2NyaXB0b3IgPSBEUExpYl9HZXREZXNjcmlwdG9yLAorfTsKKworfTsgLy8gZXh0ZXJuICJDIgorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvbGliZWZmZWN0cy9keW5hbWljc3Byb2MvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpyZW5hbWUgdG8gbWVkaWEvbGliZWZmZWN0cy9keW5hbWljc3Byb2MvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9keW5hbWljc3Byb2MvTk9USUNFIGIvbWVkaWEvbGliZWZmZWN0cy9keW5hbWljc3Byb2MvTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxY2M2ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2R5bmFtaWNzcHJvYy9OT1RJQ0UKQEAgLTAsMCArMSwxOTAgQEAKKworICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2R5bmFtaWNzcHJvYy9kc3AvRFBCYXNlLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvZHluYW1pY3Nwcm9jL2RzcC9EUEJhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNzU4ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2R5bmFtaWNzcHJvYy9kc3AvRFBCYXNlLmNwcApAQCAtMCwwICsxLDI2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiRFBCYXNlIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorI2luY2x1ZGUgIkRQQmFzZS5oIgorI2luY2x1ZGUgIkRQRnJlcXVlbmN5LmgiCisKK25hbWVzcGFjZSBkcF9meCB7CisKK0RQU3RhZ2U6OkRQU3RhZ2UoKSA6IG1JblVzZShEUF9ERUZBVUxUX1NUQUdFX0lOVVNFKSwKKyAgICAgICAgbUVuYWJsZWQoRFBfREVGQVVMVF9TVEFHRV9FTkFCTEVEKSB7Cit9CisKK3ZvaWQgRFBTdGFnZTo6aW5pdChib29sIGluVXNlLCBib29sIGVuYWJsZWQpIHsKKyAgICBtSW5Vc2UgPSBpblVzZTsKKyAgICBtRW5hYmxlZCA9IGVuYWJsZWQ7Cit9CisKKy8vLS0tLQorRFBCYW5kU3RhZ2U6OkRQQmFuZFN0YWdlKCkgOiBtQmFuZENvdW50KDApIHsKK30KKwordm9pZCBEUEJhbmRTdGFnZTo6aW5pdChib29sIGluVXNlLCBib29sIGVuYWJsZWQsIGludCBiYW5kQ291bnQpIHsKKyAgICBEUFN0YWdlOjppbml0KGluVXNlLCBlbmFibGVkKTsKKyAgICBtQmFuZENvdW50ID0gaW5Vc2UgPyBiYW5kQ291bnQgOiAwOworfQorCisvLy0tLQorRFBCYW5kQmFzZTo6RFBCYW5kQmFzZSgpIHsKKyAgICBpbml0KERQX0RFRkFVTFRfQkFORF9FTkFCTEVELAorICAgICAgICAgICAgRFBfREVGQVVMVF9CQU5EX0NVVE9GRl9GUkVRVUVOQ1lfSFopOworfQorCit2b2lkIERQQmFuZEJhc2U6OmluaXQoYm9vbCBlbmFibGVkLCBmbG9hdCBjdXRvZmZGcmVxdWVuY3kpeworICAgIG1FbmFibGVkID0gZW5hYmxlZDsKKyAgICBtQ3V0b29mRnJlcXVlbmN5SHogPSBjdXRvZmZGcmVxdWVuY3k7Cit9CisKKy8vLS0tLS0KK0RQRXFCYW5kOjpEUEVxQmFuZCgpIHsKKyAgICBpbml0KERQX0RFRkFVTFRfQkFORF9FTkFCTEVELAorICAgICAgICAgICAgRFBfREVGQVVMVF9CQU5EX0NVVE9GRl9GUkVRVUVOQ1lfSFosCisgICAgICAgICAgICBEUF9ERUZBVUxUX0dBSU5fREIpOworfQorCit2b2lkIERQRXFCYW5kOjppbml0KGJvb2wgZW5hYmxlZCwgZmxvYXQgY3V0b2ZmRnJlcXVlbmN5LCBmbG9hdCBnYWluKSB7CisgICAgRFBCYW5kQmFzZTo6aW5pdChlbmFibGVkLCBjdXRvZmZGcmVxdWVuY3kpOworICAgIHNldEdhaW4oZ2Fpbik7Cit9CisKK2Zsb2F0IERQRXFCYW5kOjpnZXRHYWluKCkgY29uc3R7CisgICAgcmV0dXJuIG1HYWluRGI7Cit9CisKK3ZvaWQgRFBFcUJhbmQ6OnNldEdhaW4oZmxvYXQgZ2FpbikgeworICAgIG1HYWluRGIgPSBnYWluOworfQorCisvLy0tLS0tLQorRFBNYmNCYW5kOjpEUE1iY0JhbmQoKSB7CisgICAgaW5pdChEUF9ERUZBVUxUX0JBTkRfRU5BQkxFRCwKKyAgICAgICAgICAgIERQX0RFRkFVTFRfQkFORF9DVVRPRkZfRlJFUVVFTkNZX0haLAorICAgICAgICAgICAgRFBfREVGQVVMVF9BVFRBQ0tfVElNRV9NUywKKyAgICAgICAgICAgIERQX0RFRkFVTFRfUkVMRUFTRV9USU1FX01TLAorICAgICAgICAgICAgRFBfREVGQVVMVF9SQVRJTywKKyAgICAgICAgICAgIERQX0RFRkFVTFRfVEhSRVNIT0xEX0RCLAorICAgICAgICAgICAgRFBfREVGQVVMVF9LTkVFX1dJRFRIX0RCLAorICAgICAgICAgICAgRFBfREVGQVVMVF9OT0lTRV9HQVRFX1RIUkVTSE9MRF9EQiwKKyAgICAgICAgICAgIERQX0RFRkFVTFRfRVhQQU5ERVJfUkFUSU8sCisgICAgICAgICAgICBEUF9ERUZBVUxUX0dBSU5fREIsCisgICAgICAgICAgICBEUF9ERUZBVUxUX0dBSU5fREIpOworfQorCit2b2lkIERQTWJjQmFuZDo6aW5pdChib29sIGVuYWJsZWQsIGZsb2F0IGN1dG9mZkZyZXF1ZW5jeSwgZmxvYXQgYXR0YWNrVGltZSwgZmxvYXQgcmVsZWFzZVRpbWUsCisgICAgICAgIGZsb2F0IHJhdGlvLCBmbG9hdCB0aHJlc2hvbGQsIGZsb2F0IGtuZWVXaWR0aCwgZmxvYXQgbm9pc2VHYXRlVGhyZXNob2xkLAorICAgICAgICBmbG9hdCBleHBhbmRlclJhdGlvLCBmbG9hdCBwcmVHYWluLCBmbG9hdCBwb3N0R2FpbikgeworICAgIERQQmFuZEJhc2U6OmluaXQoZW5hYmxlZCwgY3V0b2ZmRnJlcXVlbmN5KTsKKyAgICBzZXRBdHRhY2tUaW1lKGF0dGFja1RpbWUpOworICAgIHNldFJlbGVhc2VUaW1lKHJlbGVhc2VUaW1lKTsKKyAgICBzZXRSYXRpbyhyYXRpbyk7CisgICAgc2V0VGhyZXNob2xkKHRocmVzaG9sZCk7CisgICAgc2V0S25lZVdpZHRoKGtuZWVXaWR0aCk7CisgICAgc2V0Tm9pc2VHYXRlVGhyZXNob2xkKG5vaXNlR2F0ZVRocmVzaG9sZCk7CisgICAgc2V0RXhwYW5kZXJSYXRpbyhleHBhbmRlclJhdGlvKTsKKyAgICBzZXRQcmVHYWluKHByZUdhaW4pOworICAgIHNldFBvc3RHYWluKHBvc3RHYWluKTsKK30KKworLy8tLS0tLS0KK0RQRXE6OkRQRXEoKSB7Cit9CisKK3ZvaWQgRFBFcTo6aW5pdChib29sIGluVXNlLCBib29sIGVuYWJsZWQsIHVpbnQzMl90IGJhbmRDb3VudCkgeworICAgIERQQmFuZFN0YWdlOjppbml0KGluVXNlLCBlbmFibGVkLCBiYW5kQ291bnQpOworICAgIG1CYW5kcy5yZXNpemUoZ2V0QmFuZENvdW50KCkpOworfQorCitEUEVxQmFuZCAqIERQRXE6OmdldEJhbmQodWludDMyX3QgYmFuZCkgeworICAgIGlmIChiYW5kIDwgZ2V0QmFuZENvdW50KCkpIHsKKyAgICAgICAgcmV0dXJuICZtQmFuZHNbYmFuZF07CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIERQRXE6OnNldEJhbmQodWludDMyX3QgYmFuZCwgRFBFcUJhbmQgJnNyYykgeworICAgIGlmIChiYW5kIDwgZ2V0QmFuZENvdW50KCkpIHsKKyAgICAgICAgbUJhbmRzW2JhbmRdID0gc3JjOworICAgIH0KK30KKworLy8tLS0tLS0KK0RQTWJjOjpEUE1iYygpIHsKK30KKwordm9pZCBEUE1iYzo6aW5pdChib29sIGluVXNlLCBib29sIGVuYWJsZWQsIHVpbnQzMl90IGJhbmRDb3VudCkgeworICAgIERQQmFuZFN0YWdlOjppbml0KGluVXNlLCBlbmFibGVkLCBiYW5kQ291bnQpOworICAgIGlmIChpc0luVXNlKCkpIHsKKyAgICAgICAgbUJhbmRzLnJlc2l6ZShiYW5kQ291bnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1CYW5kcy5yZXNpemUoMCk7CisgICAgfQorfQorCitEUE1iY0JhbmQgKiBEUE1iYzo6Z2V0QmFuZCh1aW50MzJfdCBiYW5kKSB7CisgICAgaWYgKGJhbmQgPCBnZXRCYW5kQ291bnQoKSkgeworICAgICAgICByZXR1cm4gJm1CYW5kc1tiYW5kXTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgRFBNYmM6OnNldEJhbmQodWludDMyX3QgYmFuZCwgRFBNYmNCYW5kICZzcmMpIHsKKyAgICBpZiAoYmFuZCA8IGdldEJhbmRDb3VudCgpKSB7CisgICAgICAgIG1CYW5kc1tiYW5kXSA9IHNyYzsKKyAgICB9Cit9CisKKy8vLS0tLS0tCitEUExpbWl0ZXI6OkRQTGltaXRlcigpIHsKKyAgICBpbml0KERQX0RFRkFVTFRfU1RBR0VfSU5VU0UsCisgICAgICAgICAgICBEUF9ERUZBVUxUX1NUQUdFX0VOQUJMRUQsCisgICAgICAgICAgICBEUF9ERUZBVUxUX0xJTktfR1JPVVAsCisgICAgICAgICAgICBEUF9ERUZBVUxUX0FUVEFDS19USU1FX01TLAorICAgICAgICAgICAgRFBfREVGQVVMVF9SRUxFQVNFX1RJTUVfTVMsCisgICAgICAgICAgICBEUF9ERUZBVUxUX1JBVElPLAorICAgICAgICAgICAgRFBfREVGQVVMVF9USFJFU0hPTERfREIsCisgICAgICAgICAgICBEUF9ERUZBVUxUX0dBSU5fREIpOworfQorCit2b2lkIERQTGltaXRlcjo6aW5pdChib29sIGluVXNlLCBib29sIGVuYWJsZWQsIHVpbnQzMl90IGxpbmtHcm91cCwgZmxvYXQgYXR0YWNrVGltZSwgZmxvYXQgcmVsZWFzZVRpbWUsCisgICAgICAgIGZsb2F0IHJhdGlvLCBmbG9hdCB0aHJlc2hvbGQsIGZsb2F0IHBvc3RHYWluKSB7CisgICAgRFBTdGFnZTo6aW5pdChpblVzZSwgZW5hYmxlZCk7CisgICAgc2V0TGlua0dyb3VwKGxpbmtHcm91cCk7CisgICAgc2V0QXR0YWNrVGltZShhdHRhY2tUaW1lKTsKKyAgICBzZXRSZWxlYXNlVGltZShyZWxlYXNlVGltZSk7CisgICAgc2V0UmF0aW8ocmF0aW8pOworICAgIHNldFRocmVzaG9sZCh0aHJlc2hvbGQpOworICAgIHNldFBvc3RHYWluKHBvc3RHYWluKTsKK30KKworLy8tLS0tCitEUENoYW5uZWw6OkRQQ2hhbm5lbCgpIDogbUluaXRpYWxpemVkKGZhbHNlKSwgbUlucHV0R2FpbkRiKDApLCBtT3V0cHV0R2FpbkRiKDApLAorICAgICAgICBtUHJlRXFJblVzZShmYWxzZSksIG1NYmNJblVzZShmYWxzZSksIG1Qb3N0RXFJblVzZShmYWxzZSksIG1MaW1pdGVySW5Vc2UoZmFsc2UpIHsKK30KKwordm9pZCBEUENoYW5uZWw6OmluaXQoZmxvYXQgaW5wdXRHYWluLCBib29sIHByZUVxSW5Vc2UsIHVpbnQzMl90IHByZUVxQmFuZENvdW50LAorICAgICAgICBib29sIG1iY0luVXNlLCB1aW50MzJfdCBtYmNCYW5kQ291bnQsIGJvb2wgcG9zdEVxSW5Vc2UsIHVpbnQzMl90IHBvc3RFcUJhbmRDb3VudCwKKyAgICAgICAgYm9vbCBsaW1pdGVySW5Vc2UpIHsKKyAgICBzZXRJbnB1dEdhaW4oaW5wdXRHYWluKTsKKyAgICBtUHJlRXFJblVzZSA9IHByZUVxSW5Vc2U7CisgICAgbU1iY0luVXNlID0gbWJjSW5Vc2U7CisgICAgbVBvc3RFcUluVXNlID0gcG9zdEVxSW5Vc2U7CisgICAgbUxpbWl0ZXJJblVzZSA9IGxpbWl0ZXJJblVzZTsKKworICAgIG1QcmVFcS5pbml0KG1QcmVFcUluVXNlLCBmYWxzZSwgcHJlRXFCYW5kQ291bnQpOworICAgIG1NYmMuaW5pdChtTWJjSW5Vc2UsIGZhbHNlLCBtYmNCYW5kQ291bnQpOworICAgIG1Qb3N0RXEuaW5pdChtUG9zdEVxSW5Vc2UsIGZhbHNlLCBwb3N0RXFCYW5kQ291bnQpOworICAgIG1MaW1pdGVyLmluaXQobUxpbWl0ZXJJblVzZSwgZmFsc2UsIDAsIDUwLCAxMjAsIDIsIC0zMCwgMCk7CisgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKK30KKworRFBFcSogRFBDaGFubmVsOjpnZXRQcmVFcSgpIHsKKyAgICBpZiAoIW1Jbml0aWFsaXplZCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuICZtUHJlRXE7Cit9CisKK0RQTWJjKiBEUENoYW5uZWw6OmdldE1iYygpIHsKKyAgICBpZiAoIW1Jbml0aWFsaXplZCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuICZtTWJjOworfQorCitEUEVxKiBEUENoYW5uZWw6OmdldFBvc3RFcSgpIHsKKyAgICBpZiAoIW1Jbml0aWFsaXplZCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuICZtUG9zdEVxOworfQorCitEUExpbWl0ZXIqIERQQ2hhbm5lbDo6Z2V0TGltaXRlcigpIHsKKyAgICBpZiAoIW1Jbml0aWFsaXplZCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuICZtTGltaXRlcjsKK30KKwordm9pZCBEUENoYW5uZWw6OnNldExpbWl0ZXIoRFBMaW1pdGVyICZsaW1pdGVyKSB7CisgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtTGltaXRlciA9IGxpbWl0ZXI7Cit9CisKKy8vLS0tLQorRFBCYXNlOjpEUEJhc2UoKSA6IG1Jbml0aWFsaXplZChmYWxzZSksIG1DaGFubmVsQ291bnQoMCksIG1QcmVFcUluVXNlKGZhbHNlKSwgbVByZUVxQmFuZENvdW50KDApLAorICAgICAgICBtTWJjSW5Vc2UoZmFsc2UpLCBtTWJjQmFuZENvdW50KDApLCBtUG9zdEVxSW5Vc2UoZmFsc2UpLCBtUG9zdEVxQmFuZENvdW50KDApLAorICAgICAgICBtTGltaXRlckluVXNlKGZhbHNlKSB7Cit9CisKK3ZvaWQgRFBCYXNlOjppbml0KHVpbnQzMl90IGNoYW5uZWxDb3VudCwgYm9vbCBwcmVFcUluVXNlLCB1aW50MzJfdCBwcmVFcUJhbmRDb3VudCwKKyAgICAgICAgYm9vbCBtYmNJblVzZSwgdWludDMyX3QgbWJjQmFuZENvdW50LCBib29sIHBvc3RFcUluVXNlLCB1aW50MzJfdCBwb3N0RXFCYW5kQ291bnQsCisgICAgICAgIGJvb2wgbGltaXRlckluVXNlKSB7CisgICAgQUxPR1YoIkRQQmFzZTo6aW5pdCIpOworICAgIG1DaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQ7CisgICAgbVByZUVxSW5Vc2UgPSBwcmVFcUluVXNlOworICAgIG1QcmVFcUJhbmRDb3VudCA9IHByZUVxQmFuZENvdW50OworICAgIG1NYmNJblVzZSA9IG1iY0luVXNlOworICAgIG1NYmNCYW5kQ291bnQgPSBtYmNCYW5kQ291bnQ7CisgICAgbVBvc3RFcUluVXNlID0gcG9zdEVxSW5Vc2U7CisgICAgbVBvc3RFcUJhbmRDb3VudCA9IHBvc3RFcUJhbmRDb3VudDsKKyAgICBtTGltaXRlckluVXNlID0gbGltaXRlckluVXNlOworICAgIG1DaGFubmVsLnJlc2l6ZShtQ2hhbm5lbENvdW50KTsKKyAgICBmb3IgKHNpemVfdCBjaCA9IDA7IGNoIDwgbUNoYW5uZWxDb3VudDsgY2grKykgeworICAgICAgICBtQ2hhbm5lbFtjaF0uaW5pdCgwLCBwcmVFcUluVXNlLCBwcmVFcUJhbmRDb3VudCwgbWJjSW5Vc2UsIG1iY0JhbmRDb3VudCwKKyAgICAgICAgICAgICAgICBwb3N0RXFJblVzZSwgcG9zdEVxQmFuZENvdW50LCBsaW1pdGVySW5Vc2UpOworICAgIH0KKyAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOworfQorCitEUENoYW5uZWwqIERQQmFzZTo6Z2V0Q2hhbm5lbCh1aW50MzJfdCBjaGFubmVsSW5kZXgpIHsKKyAgICBpZiAoIW1Jbml0aWFsaXplZCB8fCBjaGFubmVsSW5kZXggPCAwIHx8IGNoYW5uZWxJbmRleCA+PSBtQ2hhbm5lbC5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAmIG1DaGFubmVsW2NoYW5uZWxJbmRleF07Cit9CisKK30gLy9uYW1lc3BhY2UgZHBfZngKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZHluYW1pY3Nwcm9jL2RzcC9EUEJhc2UuaCBiL21lZGlhL2xpYmVmZmVjdHMvZHluYW1pY3Nwcm9jL2RzcC9EUEJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzRmOTFkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9keW5hbWljc3Byb2MvZHNwL0RQQmFzZS5oCkBAIC0wLDAgKzEsMzYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBEUEJBU0VfSF8KKyNkZWZpbmUgRFBCQVNFX0hfCisKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbmRyb2lkL2xvZy5oPgorCituYW1lc3BhY2UgZHBfZnggeworCisjZGVmaW5lIERQX0RFRkFVTFRfQkFORF9FTkFCTEVEIGZhbHNlCisjZGVmaW5lIERQX0RFRkFVTFRfQkFORF9DVVRPRkZfRlJFUVVFTkNZX0haIDEwMDAKKyNkZWZpbmUgRFBfREVGQVVMVF9BVFRBQ0tfVElNRV9NUyA1MAorI2RlZmluZSBEUF9ERUZBVUxUX1JFTEVBU0VfVElNRV9NUyAxMjAKKyNkZWZpbmUgRFBfREVGQVVMVF9SQVRJTyAyCisjZGVmaW5lIERQX0RFRkFVTFRfVEhSRVNIT0xEX0RCIC0zMAorI2RlZmluZSBEUF9ERUZBVUxUX0tORUVfV0lEVEhfREIgMAorI2RlZmluZSBEUF9ERUZBVUxUX05PSVNFX0dBVEVfVEhSRVNIT0xEX0RCIC05MAorI2RlZmluZSBEUF9ERUZBVUxUX0VYUEFOREVSX1JBVElPIDEKKyNkZWZpbmUgRFBfREVGQVVMVF9HQUlOX0RCIDAKKyNkZWZpbmUgRFBfREVGQVVMVF9TVEFHRV9JTlVTRSBmYWxzZQorI2RlZmluZSBEUF9ERUZBVUxUX1NUQUdFX0VOQUJMRUQgZmFsc2UKKyNkZWZpbmUgRFBfREVGQVVMVF9MSU5LX0dST1VQIDAKKworCisKK2NsYXNzIERQU3RhZ2UgeworcHVibGljOgorICAgIERQU3RhZ2UoKTsKKyAgICB+RFBTdGFnZSgpID0gZGVmYXVsdDsKKyAgICB2b2lkIGluaXQoYm9vbCBpblVzZSwgYm9vbCBlbmFibGVkKTsKKyAgICBib29sIGlzSW5Vc2UoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtSW5Vc2U7CisgICAgfQorICAgIGJvb2wgaXNFbmFibGVkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUVuYWJsZWQ7CisgICAgfQorICAgIHZvaWQgc2V0RW5hYmxlZChib29sIGVuYWJsZWQpIHsKKyAgICAgICAgbUVuYWJsZWQgPSBlbmFibGVkOworICAgIH0KK3ByaXZhdGU6CisgICAgYm9vbCBtSW5Vc2U7CisgICAgYm9vbCBtRW5hYmxlZDsKK307CisKK2NsYXNzIERQQmFuZFN0YWdlIDogcHVibGljIERQU3RhZ2UgeworcHVibGljOgorICAgIERQQmFuZFN0YWdlKCk7CisgICAgfkRQQmFuZFN0YWdlKCkgPSBkZWZhdWx0OworICAgIHZvaWQgaW5pdChib29sIGluVXNlLCBib29sIGVuYWJsZWQsIGludCBiYW5kQ291bnQpOworICAgIHVpbnQzMl90IGdldEJhbmRDb3VudCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1CYW5kQ291bnQ7CisgICAgfQorICAgIHZvaWQgc2V0QmFuZENvdW50KHVpbnQzMl90IGJhbmRDb3VudCkgeworICAgICAgICBtQmFuZENvdW50ID0gYmFuZENvdW50OworICAgIH0KK3ByaXZhdGU6CisgICAgdWludDMyX3QgbUJhbmRDb3VudDsKK307CisKK2NsYXNzIERQQmFuZEJhc2UgeworcHVibGljOgorICAgIERQQmFuZEJhc2UoKTsKKyAgICB+RFBCYW5kQmFzZSgpID0gZGVmYXVsdDsKKyAgICB2b2lkIGluaXQoYm9vbCBlbmFibGVkLCBmbG9hdCBjdXRvZmZGcmVxdWVuY3kpOworICAgIGJvb2wgaXNFbmFibGVkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUVuYWJsZWQ7CisgICAgfQorICAgIHZvaWQgc2V0RW5hYmxlZChib29sIGVuYWJsZWQpIHsKKyAgICAgICAgbUVuYWJsZWQgPSBlbmFibGVkOworICAgIH0KKyAgICBmbG9hdCBnZXRDdXRvZmZGcmVxdWVuY3koKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQ3V0b29mRnJlcXVlbmN5SHo7CisgICAgfQorICAgIHZvaWQgc2V0Q3V0b2ZmRnJlcXVlbmN5KGZsb2F0IGN1dG9mZkZyZXF1ZW5jeSkgeworICAgICAgICBtQ3V0b29mRnJlcXVlbmN5SHogPSBjdXRvZmZGcmVxdWVuY3k7CisgICAgfQorcHJpdmF0ZToKKyAgICBib29sIG1FbmFibGVkOworICAgIGZsb2F0IG1DdXRvb2ZGcmVxdWVuY3lIejsKK307CisKK2NsYXNzIERQRXFCYW5kIDogcHVibGljIERQQmFuZEJhc2UgeworcHVibGljOgorICAgIERQRXFCYW5kKCk7CisgICAgfkRQRXFCYW5kKCkgPSBkZWZhdWx0OworICAgIHZvaWQgaW5pdChib29sIGVuYWJsZWQsIGZsb2F0IGN1dG9mZkZyZXF1ZW5jeSwgZmxvYXQgZ2Fpbik7CisgICAgZmxvYXQgZ2V0R2FpbigpIGNvbnN0OworICAgIHZvaWQgc2V0R2FpbihmbG9hdCBnYWluKTsKK3ByaXZhdGU6CisgICAgZmxvYXQgbUdhaW5EYjsKK307CisKK2NsYXNzIERQTWJjQmFuZCA6IHB1YmxpYyBEUEJhbmRCYXNlIHsKK3B1YmxpYzoKKyAgICBEUE1iY0JhbmQoKTsKKyAgICB+RFBNYmNCYW5kKCkgPSBkZWZhdWx0OworICAgIHZvaWQgaW5pdChib29sIGVuYWJsZWQsIGZsb2F0IGN1dG9mZkZyZXF1ZW5jeSwgZmxvYXQgYXR0YWNrVGltZSwgZmxvYXQgcmVsZWFzZVRpbWUsCisgICAgICAgICAgICBmbG9hdCByYXRpbywgZmxvYXQgdGhyZXNob2xkLCBmbG9hdCBrbmVlV2lkdGgsIGZsb2F0IG5vaXNlR2F0ZVRocmVzaG9sZCwKKyAgICAgICAgICAgIGZsb2F0IGV4cGFuZGVyUmF0aW8sIGZsb2F0IHByZUdhaW4sIGZsb2F0IHBvc3RHYWluKTsKKyAgICBmbG9hdCBnZXRBdHRhY2tUaW1lKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUF0dGFja1RpbWVNczsKKyAgICB9CisgICAgdm9pZCBzZXRBdHRhY2tUaW1lKGZsb2F0IGF0dGFja1RpbWUpIHsKKyAgICAgICAgbUF0dGFja1RpbWVNcyA9IGF0dGFja1RpbWU7CisgICAgfQorICAgIGZsb2F0IGdldFJlbGVhc2VUaW1lKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVJlbGVhc2VUaW1lTXM7CisgICAgfQorICAgIHZvaWQgc2V0UmVsZWFzZVRpbWUoZmxvYXQgcmVsZWFzZVRpbWUpIHsKKyAgICAgICAgbVJlbGVhc2VUaW1lTXMgPSByZWxlYXNlVGltZTsKKyAgICB9CisgICAgZmxvYXQgZ2V0UmF0aW8oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUmF0aW87CisgICAgfQorICAgIHZvaWQgc2V0UmF0aW8oZmxvYXQgcmF0aW8pIHsKKyAgICAgICAgbVJhdGlvID0gcmF0aW87CisgICAgfQorICAgIGZsb2F0IGdldFRocmVzaG9sZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1UaHJlc2hvbGREYjsKKyAgICB9CisgICAgdm9pZCBzZXRUaHJlc2hvbGQoZmxvYXQgdGhyZXNob2xkKSB7CisgICAgICAgIG1UaHJlc2hvbGREYiA9IHRocmVzaG9sZDsKKyAgICB9CisgICAgZmxvYXQgZ2V0S25lZVdpZHRoKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUtuZWVXaWR0aERiOworICAgIH0KKyAgICB2b2lkIHNldEtuZWVXaWR0aChmbG9hdCBrbmVlV2lkdGgpIHsKKyAgICAgICAgbUtuZWVXaWR0aERiID0ga25lZVdpZHRoOworICAgIH0KKyAgICBmbG9hdCBnZXROb2lzZUdhdGVUaHJlc2hvbGQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtTm9pc2VHYXRlVGhyZXNob2xkRGI7CisgICAgfQorICAgIHZvaWQgc2V0Tm9pc2VHYXRlVGhyZXNob2xkKGZsb2F0IG5vaXNlR2F0ZVRocmVzaG9sZCkgeworICAgICAgICBtTm9pc2VHYXRlVGhyZXNob2xkRGIgPSBub2lzZUdhdGVUaHJlc2hvbGQ7CisgICAgfQorICAgIGZsb2F0IGdldEV4cGFuZGVyUmF0aW8oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRXhwYW5kZXJSYXRpbzsKKyAgICB9CisgICAgdm9pZCBzZXRFeHBhbmRlclJhdGlvKGZsb2F0IGV4cGFuZGVyUmF0aW8pIHsKKyAgICAgICAgbUV4cGFuZGVyUmF0aW8gPSBleHBhbmRlclJhdGlvOworICAgIH0KKyAgICBmbG9hdCBnZXRQcmVHYWluKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVByZUdhaW5EYjsKKyAgICB9CisgICAgdm9pZCBzZXRQcmVHYWluKGZsb2F0IHByZUdhaW4pIHsKKyAgICAgICAgbVByZUdhaW5EYiA9IHByZUdhaW47CisgICAgfQorICAgIGZsb2F0IGdldFBvc3RHYWluKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVBvc3RHYWluRGI7CisgICAgfQorICAgIHZvaWQgc2V0UG9zdEdhaW4oZmxvYXQgcG9zdEdhaW4pIHsKKyAgICAgICAgbVBvc3RHYWluRGIgPSBwb3N0R2FpbjsKKyAgICB9Citwcml2YXRlOgorICAgIGZsb2F0IG1BdHRhY2tUaW1lTXM7CisgICAgZmxvYXQgbVJlbGVhc2VUaW1lTXM7CisgICAgZmxvYXQgbVJhdGlvOworICAgIGZsb2F0IG1UaHJlc2hvbGREYjsKKyAgICBmbG9hdCBtS25lZVdpZHRoRGI7CisgICAgZmxvYXQgbU5vaXNlR2F0ZVRocmVzaG9sZERiOworICAgIGZsb2F0IG1FeHBhbmRlclJhdGlvOworICAgIGZsb2F0IG1QcmVHYWluRGI7CisgICAgZmxvYXQgbVBvc3RHYWluRGI7Cit9OworCitjbGFzcyBEUEVxIDogcHVibGljIERQQmFuZFN0YWdlIHsKK3B1YmxpYzoKKyAgICBEUEVxKCk7CisgICAgfkRQRXEoKSA9IGRlZmF1bHQ7CisgICAgdm9pZCBpbml0KGJvb2wgaW5Vc2UsIGJvb2wgZW5hYmxlZCwgdWludDMyX3QgYmFuZENvdW50KTsKKyAgICBEUEVxQmFuZCAqIGdldEJhbmQodWludDMyX3QgYmFuZCk7CisgICAgdm9pZCBzZXRCYW5kKHVpbnQzMl90IGJhbmQsIERQRXFCYW5kICZzcmMpOworcHJpdmF0ZToKKyAgICBzdGQ6OnZlY3RvcjxEUEVxQmFuZD4gbUJhbmRzOworfTsKKworY2xhc3MgRFBNYmMgOiBwdWJsaWMgRFBCYW5kU3RhZ2UgeworcHVibGljOgorICAgIERQTWJjKCk7CisgICAgfkRQTWJjKCkgPSBkZWZhdWx0OworICAgIHZvaWQgaW5pdChib29sIGluVXNlLCBib29sIGVuYWJsZWQsIHVpbnQzMl90IGJhbmRDb3VudCk7CisgICAgRFBNYmNCYW5kICogZ2V0QmFuZCh1aW50MzJfdCBiYW5kKTsKKyAgICB2b2lkIHNldEJhbmQodWludDMyX3QgYmFuZCwgRFBNYmNCYW5kICZzcmMpOworcHJpdmF0ZToKKyAgICBzdGQ6OnZlY3RvcjxEUE1iY0JhbmQ+IG1CYW5kczsKK307CisKK2NsYXNzIERQTGltaXRlciA6IHB1YmxpYyBEUFN0YWdlIHsKK3B1YmxpYzoKKyAgICBEUExpbWl0ZXIoKTsKKyAgICB+RFBMaW1pdGVyKCkgPSBkZWZhdWx0OworICAgIHZvaWQgaW5pdChib29sIGluVXNlLCBib29sIGVuYWJsZWQsIHVpbnQzMl90IGxpbmtHcm91cCwgZmxvYXQgYXR0YWNrVGltZSwgZmxvYXQgcmVsZWFzZVRpbWUsCisgICAgICAgICAgICBmbG9hdCByYXRpbywgZmxvYXQgdGhyZXNob2xkLCBmbG9hdCBwb3N0R2Fpbik7CisgICAgdWludDMyX3QgZ2V0TGlua0dyb3VwKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUxpbmtHcm91cDsKKyAgICB9CisgICAgdm9pZCBzZXRMaW5rR3JvdXAodWludDMyX3QgbGlua0dyb3VwKSB7CisgICAgICAgIG1MaW5rR3JvdXAgPSBsaW5rR3JvdXA7CisgICAgfQorICAgIGZsb2F0IGdldEF0dGFja1RpbWUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQXR0YWNrVGltZU1zOworICAgIH0KKyAgICB2b2lkIHNldEF0dGFja1RpbWUoZmxvYXQgYXR0YWNrVGltZSkgeworICAgICAgICBtQXR0YWNrVGltZU1zID0gYXR0YWNrVGltZTsKKyAgICB9CisgICAgZmxvYXQgZ2V0UmVsZWFzZVRpbWUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUmVsZWFzZVRpbWVNczsKKyAgICB9CisgICAgdm9pZCBzZXRSZWxlYXNlVGltZShmbG9hdCByZWxlYXNlVGltZSkgeworICAgICAgICBtUmVsZWFzZVRpbWVNcyA9IHJlbGVhc2VUaW1lOworICAgIH0KKyAgICBmbG9hdCBnZXRSYXRpbygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1SYXRpbzsKKyAgICB9CisgICAgdm9pZCBzZXRSYXRpbyhmbG9hdCByYXRpbykgeworICAgICAgICBtUmF0aW8gPSByYXRpbzsKKyAgICB9CisgICAgZmxvYXQgZ2V0VGhyZXNob2xkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVRocmVzaG9sZERiOworICAgIH0KKyAgICB2b2lkIHNldFRocmVzaG9sZChmbG9hdCB0aHJlc2hvbGQpIHsKKyAgICAgICAgbVRocmVzaG9sZERiID0gdGhyZXNob2xkOworICAgIH0KKyAgICBmbG9hdCBnZXRQb3N0R2FpbigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Qb3N0R2FpbkRiOworICAgIH0KKyAgICB2b2lkIHNldFBvc3RHYWluKGZsb2F0IHBvc3RHYWluKSB7CisgICAgICAgIG1Qb3N0R2FpbkRiID0gcG9zdEdhaW47CisgICAgfQorcHJpdmF0ZToKKyAgICB1aW50MzJfdCBtTGlua0dyb3VwOworICAgIGZsb2F0IG1BdHRhY2tUaW1lTXM7CisgICAgZmxvYXQgbVJlbGVhc2VUaW1lTXM7CisgICAgZmxvYXQgbVJhdGlvOworICAgIGZsb2F0IG1UaHJlc2hvbGREYjsKKyAgICBmbG9hdCBtUG9zdEdhaW5EYjsKK307CisKK2NsYXNzIERQQ2hhbm5lbCB7CitwdWJsaWM6CisgICAgRFBDaGFubmVsKCk7CisgICAgfkRQQ2hhbm5lbCgpID0gZGVmYXVsdDsKKyAgICB2b2lkIGluaXQoZmxvYXQgaW5wdXRHYWluLCBib29sIHByZUVxSW5Vc2UsIHVpbnQzMl90IHByZUVxQmFuZENvdW50LAorICAgICAgICAgICAgYm9vbCBtYmNJblVzZSwgdWludDMyX3QgbWJjQmFuZENvdW50LCBib29sIHBvc3RFcUluVXNlLCB1aW50MzJfdCBwb3N0RXFCYW5kQ291bnQsCisgICAgICAgICAgICBib29sIGxpbWl0ZXJJblVzZSk7CisKKyAgICBmbG9hdCBnZXRJbnB1dEdhaW4oKSBjb25zdCB7CisgICAgICAgIGlmICghbUluaXRpYWxpemVkKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUlucHV0R2FpbkRiOworICAgIH0KKyAgICB2b2lkIHNldElucHV0R2FpbihmbG9hdCBnYWluKSB7CisgICAgICAgIG1JbnB1dEdhaW5EYiA9IGdhaW47CisgICAgfQorCisgICAgZmxvYXQgZ2V0T3V0cHV0R2FpbigpIGNvbnN0IHsKKyAgICAgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtT3V0cHV0R2FpbkRiOworICAgIH0KKyAgICB2b2lkIHNldE91dHB1dEdhaW4oZmxvYXQgZ2FpbikgeworICAgICAgICBtT3V0cHV0R2FpbkRiID0gZ2FpbjsKKyAgICB9CisKKyAgICBEUEVxKiBnZXRQcmVFcSgpOworICAgIERQTWJjKiBnZXRNYmMoKTsKKyAgICBEUEVxKiBnZXRQb3N0RXEoKTsKKyAgICBEUExpbWl0ZXIgKmdldExpbWl0ZXIoKTsKKyAgICB2b2lkIHNldExpbWl0ZXIoRFBMaW1pdGVyICZsaW1pdGVyKTsKKworcHJpdmF0ZToKKyAgICBib29sIG1Jbml0aWFsaXplZDsKKyAgICBmbG9hdCBtSW5wdXRHYWluRGI7CisgICAgZmxvYXQgbU91dHB1dEdhaW5EYjsKKworICAgIERQRXEgbVByZUVxOworICAgIERQTWJjIG1NYmM7CisgICAgRFBFcSBtUG9zdEVxOworICAgIERQTGltaXRlciBtTGltaXRlcjsKKworICAgIGJvb2wgbVByZUVxSW5Vc2U7CisgICAgYm9vbCBtTWJjSW5Vc2U7CisgICAgYm9vbCBtUG9zdEVxSW5Vc2U7CisgICAgYm9vbCBtTGltaXRlckluVXNlOworfTsKKworY2xhc3MgRFBCYXNlIHsKK3B1YmxpYzoKKyAgICBEUEJhc2UoKTsKKyAgICB2aXJ0dWFsIH5EUEJhc2UoKSA9IGRlZmF1bHQ7CisKKyAgICB2b2lkIGluaXQodWludDMyX3QgY2hhbm5lbENvdW50LCBib29sIHByZUVxSW5Vc2UsIHVpbnQzMl90IHByZUVxQmFuZENvdW50LAorICAgICAgICAgICAgYm9vbCBtYmNJblVzZSwgdWludDMyX3QgbWJjQmFuZENvdW50LCBib29sIHBvc3RFcUluVXNlLCB1aW50MzJfdCBwb3N0RXFCYW5kQ291bnQsCisgICAgICAgICAgICBib29sIGxpbWl0ZXJJblVzZSk7CisgICAgdmlydHVhbCBzaXplX3QgcHJvY2Vzc1NhbXBsZXMoY29uc3QgZmxvYXQgKmluLCBmbG9hdCAqb3V0LCBzaXplX3Qgc2FtcGxlcykgPSAwOworICAgIHZpcnR1YWwgdm9pZCByZXNldCgpID0gMDsKKworICAgIERQQ2hhbm5lbCogZ2V0Q2hhbm5lbCh1aW50MzJfdCBjaGFubmVsSW5kZXgpOworICAgIHVpbnQzMl90IGdldENoYW5uZWxDb3VudCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1DaGFubmVsQ291bnQ7CisgICAgfQorICAgIHVpbnQzMl90IGdldFByZUVxQmFuZENvdW50KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVByZUVxQmFuZENvdW50OworICAgIH0KKyAgICB1aW50MzJfdCBnZXRNYmNCYW5kQ291bnQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtTWJjQmFuZENvdW50OworICAgIH0KKyAgICB1aW50MzJfdCBnZXRQb3N0RXFCYW5kQ291bnQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUG9zdEVxQmFuZENvdW50OworICAgIH0KKyAgICBib29sIGlzUHJlRVFJblVzZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1QcmVFcUluVXNlOworICAgIH0KKyAgICBib29sIGlzTWJjSW5Vc2UoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtTWJjSW5Vc2U7CisgICAgfQorICAgIGJvb2wgaXNQb3N0RXFJblVzZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Qb3N0RXFJblVzZTsKKyAgICB9CisgICAgYm9vbCBpc0xpbWl0ZXJJblVzZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1MaW1pdGVySW5Vc2U7CisgICAgfQorCitwcml2YXRlOgorICAgIGJvb2wgbUluaXRpYWxpemVkOworICAgIC8vZ2VuZXJhbAorICAgIHVpbnQzMl90IG1DaGFubmVsQ291bnQ7CisgICAgYm9vbCBtUHJlRXFJblVzZTsKKyAgICB1aW50MzJfdCBtUHJlRXFCYW5kQ291bnQ7CisgICAgYm9vbCBtTWJjSW5Vc2U7CisgICAgdWludDMyX3QgbU1iY0JhbmRDb3VudDsKKyAgICBib29sIG1Qb3N0RXFJblVzZTsKKyAgICB1aW50MzJfdCBtUG9zdEVxQmFuZENvdW50OworICAgIGJvb2wgbUxpbWl0ZXJJblVzZTsKKworICAgIHN0ZDo6dmVjdG9yPERQQ2hhbm5lbD4gbUNoYW5uZWw7Cit9OworCit9IC8vbmFtZXNwYWNlIGRwX2Z4CisKKworI2VuZGlmICAvLyBEUEJBU0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZHluYW1pY3Nwcm9jL2RzcC9EUEZyZXF1ZW5jeS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2R5bmFtaWNzcHJvYy9kc3AvRFBGcmVxdWVuY3kuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNmZkNzAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2R5bmFtaWNzcHJvYy9kc3AvRFBGcmVxdWVuY3kuY3BwCkBAIC0wLDAgKzEsNjc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJEUEZyZXF1ZW5jeSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGxvZy9sb2cuaD4KKyNpbmNsdWRlICJEUEZyZXF1ZW5jeS5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworbmFtZXNwYWNlIGRwX2Z4IHsKKwordXNpbmcgRWlnZW46Ok1hdHJpeFhkOworI2RlZmluZSBNQVhfQkxPQ0tTSVpFIDE2Mzg0IC8vRm9yIHRoaXMgaW1wbGVtZW50YXRpb24KKyNkZWZpbmUgTUlOX0JMT0NLU0laRSA4CisKKyNkZWZpbmUgQ0lSQ1VMQVJfQlVGRkVSX1VQU0FNUExFIDQgIC8vNCB0aW1lcyBidWZmZXIgc2l6ZQorCitzdGF0aWMgY29uc3RleHByIGZsb2F0IE1JTl9FTlZFTE9QRSA9IDFlLTZmOyAvLy0xMjAgZEIKKy8vaGVscGVyIGZ1bmN0aW9uUworc3RhdGljIGlubGluZSBib29sIGlzUG93ZXJPZjIodW5zaWduZWQgbG9uZyBuKSB7CisgICAgcmV0dXJuIChuICYgKG4gLSAxKSkgPT0gMDsKK30KK3N0YXRpYyBjb25zdGV4cHIgZmxvYXQgRVBTSUxPTiA9IDAuMDAwMDAwMWY7CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc1plcm8oZmxvYXQgZikgeworICAgIHJldHVybiBmYWJzKGYpIDw9IEVQU0lMT047Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorYm9vbCBjb21wYXJlRXF1YWxpdHkoVCBhLCBUIGIpIHsKKyAgICByZXR1cm4gKGEgPT0gYik7Cit9CisKK3RlbXBsYXRlIDw+IGJvb2wgY29tcGFyZUVxdWFsaXR5PGZsb2F0PihmbG9hdCBhLCBmbG9hdCBiKSB7CisgICAgcmV0dXJuIGlzWmVybyhhIC0gYik7Cit9CisKKy8vVE9ETzogYXZvaWQgdXNpbmcgbWFjcm8gZm9yIGVzdGltYXRpbmcgY2hhbmdlIGFuZCBhc3NpZ25tZW50LgorI2RlZmluZSBJU19DSEFOR0VEKGMsIGEsIGIpIHsgYyB8PSAhY29tcGFyZUVxdWFsaXR5KGEsYik7IFwKKyAgICAoYSkgPSAoYik7IH0KKworLy9DaGFubmVsQnVmZmVycyBoZWxwZXIKK3ZvaWQgQ2hhbm5lbEJ1ZmZlcjo6aW5pdEJ1ZmZlcnModW5zaWduZWQgaW50IGJsb2NrU2l6ZSwgdW5zaWduZWQgaW50IG92ZXJsYXBTaXplLAorICAgICAgICB1bnNpZ25lZCBpbnQgaGFsZkZmdFNpemUsIHVuc2lnbmVkIGludCBzYW1wbGluZ1JhdGUsIERQQmFzZSAmZHBCYXNlKSB7CisgICAgQUxPR1YoIkNoYW5uZWxCdWZmZXI6OmluaXRCdWZmZXJzIGJsb2NrU2l6ZSAlZCwgb3ZlcmxhcCAlZCwgaGFsZkZmdCAlZCIsCisgICAgICAgICAgICBibG9ja1NpemUsIG92ZXJsYXBTaXplLCBoYWxmRmZ0U2l6ZSk7CisKKyAgICBtU2FtcGxpbmdSYXRlID0gc2FtcGxpbmdSYXRlOworICAgIG1CbG9ja1NpemUgPSBibG9ja1NpemU7CisKKyAgICBjQklucHV0LnJlc2l6ZShtQmxvY2tTaXplICogQ0lSQ1VMQVJfQlVGRkVSX1VQU0FNUExFKTsKKyAgICBjQk91dHB1dC5yZXNpemUobUJsb2NrU2l6ZSAqIENJUkNVTEFSX0JVRkZFUl9VUFNBTVBMRSk7CisKKyAgICAvL2ZpbGwgaW5wdXQgd2l0aCBoYWxmIGJsb2NrIHNpemUuLi4KKyAgICBmb3IgKHVuc2lnbmVkIGludCBrID0gMDsgayA8IG1CbG9ja1NpemUvMjsgaysrKSB7CisgICAgICAgIGNCSW5wdXQud3JpdGUoMCk7CisgICAgfQorCisgICAgLy90ZW1wIHZlY3RvcnMKKyAgICBpbnB1dC5yZXNpemUobUJsb2NrU2l6ZSk7CisgICAgb3V0cHV0LnJlc2l6ZShtQmxvY2tTaXplKTsKKyAgICBvdXRUYWlsLnJlc2l6ZShvdmVybGFwU2l6ZSk7CisKKyAgICAvL21vZHVsZSB2ZWN0b3JzCisgICAgbVByZUVxRmFjdG9yVmVjdG9yLnJlc2l6ZShoYWxmRmZ0U2l6ZSwgMS4wKTsKKyAgICBtUG9zdEVxRmFjdG9yVmVjdG9yLnJlc2l6ZShoYWxmRmZ0U2l6ZSwgMS4wKTsKKworICAgIG1QcmVFcUJhbmRzLnJlc2l6ZShkcEJhc2UuZ2V0UHJlRXFCYW5kQ291bnQoKSk7CisgICAgbU1iY0JhbmRzLnJlc2l6ZShkcEJhc2UuZ2V0TWJjQmFuZENvdW50KCkpOworICAgIG1Qb3N0RXFCYW5kcy5yZXNpemUoZHBCYXNlLmdldFBvc3RFcUJhbmRDb3VudCgpKTsKKyAgICBBTE9HVigibVByZUVxQmFuZHMgJXp1LCBtTWJjQmFuZHMgJXp1LCBtUG9zdEVxQmFuZHMgJXp1IixtUHJlRXFCYW5kcy5zaXplKCksCisgICAgICAgICAgICBtTWJjQmFuZHMuc2l6ZSgpLCBtUG9zdEVxQmFuZHMuc2l6ZSgpKTsKKworICAgIERQQ2hhbm5lbCAqcENoYW5uZWwgPSBkcEJhc2UuZ2V0Q2hhbm5lbCgwKTsKKyAgICBpZiAocENoYW5uZWwgIT0gbnVsbHB0cikgeworICAgICAgICBtUHJlRXFJblVzZSA9IHBDaGFubmVsLT5nZXRQcmVFcSgpLT5pc0luVXNlKCk7CisgICAgICAgIG1NYmNJblVzZSA9IHBDaGFubmVsLT5nZXRNYmMoKS0+aXNJblVzZSgpOworICAgICAgICBtUG9zdEVxSW5Vc2UgPSBwQ2hhbm5lbC0+Z2V0UG9zdEVxKCktPmlzSW5Vc2UoKTsKKyAgICAgICAgbUxpbWl0ZXJJblVzZSA9IHBDaGFubmVsLT5nZXRMaW1pdGVyKCktPmlzSW5Vc2UoKTsKKyAgICB9CisKKyAgICBtTGltaXRlclBhcmFtcy5saW5rR3JvdXAgPSAtMTsgLy9ubyBncm91cC4KK30KKwordm9pZCBDaGFubmVsQnVmZmVyOjpjb21wdXRlQmluU3RhcnRTdG9wKEJhbmRQYXJhbXMgJmJwLCBzaXplX3QgYmluU3RhcnQpIHsKKworICAgIGJwLmJpblN0YXJ0ID0gYmluU3RhcnQ7CisgICAgYnAuYmluU3RvcCA9IChpbnQpKDAuNSArIGJwLmZyZXFDdXRvZmZIeiAqIG1CbG9ja1NpemUgLyBtU2FtcGxpbmdSYXRlKTsKK30KKworLy89PSBMaW5rZWRMaW1pdGVycyBIZWxwZXIKK3ZvaWQgTGlua2VkTGltaXRlcnM6OnJlc2V0KCkgeworICAgIG1Hcm91cHNNYXAuY2xlYXIoKTsKK30KKwordm9pZCBMaW5rZWRMaW1pdGVyczo6dXBkYXRlKGludDMyX3QgZ3JvdXAsIGludCBpbmRleCkgeworICAgIG1Hcm91cHNNYXBbZ3JvdXBdLnB1c2hfYmFjayhpbmRleCk7Cit9CisKK3ZvaWQgTGlua2VkTGltaXRlcnM6OnJlbW92ZShpbnQgaW5kZXgpIHsKKyAgICAvL2NoZWNrIGFsbCBncm91cHMgYW5kIGlmIGluZGV4IGlzIGZvdW5kLCByZW1vdmUgaXQuCisgICAgLy9pZiBncm91cCBpcyBlbXB0eSBhZnRlcndhcmRzLCByZW1vdmUgaXQuCisgICAgZm9yIChhdXRvIGl0ID0gbUdyb3Vwc01hcC5iZWdpbigpOyBpdCAhPSBtR3JvdXBzTWFwLmVuZCgpOyApIHsKKyAgICAgICAgZm9yIChhdXRvIGl0SW5kZXggPSBpdC0+c2Vjb25kLmJlZ2luKCk7IGl0SW5kZXggIT0gaXQtPnNlY29uZC5lbmQoKTsgKSB7CisgICAgICAgICAgICBpZiAoKml0SW5kZXggPT0gaW5kZXgpIHsKKyAgICAgICAgICAgICAgICBpdEluZGV4ID0gaXQtPnNlY29uZC5lcmFzZShpdEluZGV4KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKytpdEluZGV4OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpdC0+c2Vjb25kLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBpdCA9IG1Hcm91cHNNYXAuZXJhc2UoaXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKytpdDsKKyAgICAgICAgfQorICAgIH0KK30KKworLy89PSBEUEZyZXF1ZW5jeQordm9pZCBEUEZyZXF1ZW5jeTo6cmVzZXQoKSB7Cit9CisKK3NpemVfdCBEUEZyZXF1ZW5jeTo6Z2V0TWluQm9ja1NpemUoKSB7CisgICAgcmV0dXJuIE1JTl9CTE9DS1NJWkU7Cit9CisKK3NpemVfdCBEUEZyZXF1ZW5jeTo6Z2V0TWF4Qm9ja1NpemUoKSB7CisgICAgcmV0dXJuIE1BWF9CTE9DS1NJWkU7Cit9CisKK3ZvaWQgRFBGcmVxdWVuY3k6OmNvbmZpZ3VyZShzaXplX3QgYmxvY2tTaXplLCBzaXplX3Qgb3ZlcmxhcFNpemUsCisgICAgICAgIHNpemVfdCBzYW1wbGluZ1JhdGUpIHsKKyAgICBBTE9HVigiY29uZmlndXJlIik7CisgICAgbUJsb2NrU2l6ZSA9IGJsb2NrU2l6ZTsKKyAgICBpZiAobUJsb2NrU2l6ZSA+IE1BWF9CTE9DS1NJWkUpIHsKKyAgICAgICAgbUJsb2NrU2l6ZSA9IE1BWF9CTE9DS1NJWkU7CisgICAgfSBlbHNlIGlmIChtQmxvY2tTaXplIDwgTUlOX0JMT0NLU0laRSkgeworICAgICAgICBtQmxvY2tTaXplID0gTUlOX0JMT0NLU0laRTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIWlzUG93ZXJPZjIoYmxvY2tTaXplKSkgeworICAgICAgICAgICAgLy9maW5kIG5leHQgaGlnaGVzdCBwb3dlciBvZiAyLgorICAgICAgICAgICAgbUJsb2NrU2l6ZSA9IDEgPDwgKDMyIC0gX19idWlsdGluX2NseihibG9ja1NpemUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1IYWxmRkZUU2l6ZSA9IDEgKyBtQmxvY2tTaXplIC8gMjsgLy9pbmNsdWRpbmcgTnlxdWlzdCBiaW4KKyAgICBtT3ZlcmxhcFNpemUgPSBzdGQ6Om1pbihvdmVybGFwU2l6ZSwgbUJsb2NrU2l6ZS8yKTsKKworICAgIGludCBjaGFubmVsY291bnQgPSBnZXRDaGFubmVsQ291bnQoKTsKKyAgICBtU2FtcGxpbmdSYXRlID0gc2FtcGxpbmdSYXRlOworICAgIG1DaGFubmVsQnVmZmVycy5yZXNpemUoY2hhbm5lbGNvdW50KTsKKyAgICBmb3IgKGludCBjaCA9IDA7IGNoIDwgY2hhbm5lbGNvdW50OyBjaCsrKSB7CisgICAgICAgIG1DaGFubmVsQnVmZmVyc1tjaF0uaW5pdEJ1ZmZlcnMobUJsb2NrU2l6ZSwgbU92ZXJsYXBTaXplLCBtSGFsZkZGVFNpemUsCisgICAgICAgICAgICAgICAgbVNhbXBsaW5nUmF0ZSwgKnRoaXMpOworICAgIH0KKworICAgIC8vZWZmZWN0aXZlIG51bWJlciBvZiBmcmFtZXMgcHJvY2Vzc2VkIHBlciBzZWNvbmQKKyAgICBtQmxvY2tzUGVyU2Vjb25kID0gKGZsb2F0KW1TYW1wbGluZ1JhdGUgLyAobUJsb2NrU2l6ZSAtIG1PdmVybGFwU2l6ZSk7CisKKyAgICBmaWxsX3dpbmRvdyhtVldpbmRvdywgUkRTUF9XSU5ET1dfSEFOTklOR19GTEFUX1RPUCwgbUJsb2NrU2l6ZSwgbU92ZXJsYXBTaXplKTsKKworICAgIC8vY29tcHV0ZSB3aW5kb3cgcm1zIGZvciBlbmVyZ3kgY29tcGVuc2F0aW9uCisgICAgbVdpbmRvd1JtcyA9IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVldpbmRvdy5zaXplKCk7IGkrKykgeworICAgICAgICBtV2luZG93Um1zICs9IG1WV2luZG93W2ldICogbVZXaW5kb3dbaV07CisgICAgfQorCisgICAgLy9NYWtpbmcgc3VyZSB3aW5kb3cgcm1zIGlzIG5vdCB6ZXJvLgorICAgIG1XaW5kb3dSbXMgPSBzdGQ6Om1heChzcXJ0KG1XaW5kb3dSbXMgLyBtVldpbmRvdy5zaXplKCkpLCBNSU5fRU5WRUxPUEUpOworfQorCit2b2lkIERQRnJlcXVlbmN5Ojp1cGRhdGVQYXJhbWV0ZXJzKENoYW5uZWxCdWZmZXIgJmNiLCBpbnQgY2hhbm5lbEluZGV4KSB7CisgICAgRFBDaGFubmVsICpwQ2hhbm5lbCA9IGdldENoYW5uZWwoY2hhbm5lbEluZGV4KTsKKworICAgIGlmIChwQ2hhbm5lbCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJFcnJvcjogdXBkYXRlUGFyYW1ldGVycyBudWxsIERQQ2hhbm5lbCAlZCIsIGNoYW5uZWxJbmRleCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLz09PUlucHV0IEdhaW4gYW5kIHByZUVxCisgICAgeworICAgICAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgSVNfQ0hBTkdFRChjaGFuZ2VkLCBjYi5pbnB1dEdhaW5EYiwgcENoYW5uZWwtPmdldElucHV0R2FpbigpKTsKKyAgICAgICAgLy89PT1FcVByZQorICAgICAgICBpZiAoY2IubVByZUVxSW5Vc2UpIHsKKyAgICAgICAgICAgIERQRXEgKnBQcmVFcSA9IHBDaGFubmVsLT5nZXRQcmVFcSgpOworICAgICAgICAgICAgaWYgKHBQcmVFcSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkVycm9yOiB1cGRhdGVQYXJhbWV0ZXJzIG51bGwgUHJlRXEgZm9yIGNoYW5uZWw6ICVkIiwgY2hhbm5lbEluZGV4KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBJU19DSEFOR0VEKGNoYW5nZWQsIGNiLm1QcmVFcUVuYWJsZWQsIHBQcmVFcS0+aXNFbmFibGVkKCkpOworICAgICAgICAgICAgaWYgKGNiLm1QcmVFcUVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBiID0gMDsgYiA8IGdldFByZUVxQmFuZENvdW50KCk7IGIrKykgeworICAgICAgICAgICAgICAgICAgICBEUEVxQmFuZCAqcEVxQmFuZCA9IHBQcmVFcS0+Z2V0QmFuZChiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBFcUJhbmQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkVycm9yOiB1cGRhdGVQYXJhbWV0ZXJzIG51bGwgUHJlRXFCYW5kIGZvciBiYW5kICVkIiwgYik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vZmFpbGVkLgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIENoYW5uZWxCdWZmZXI6OkVxQmFuZFBhcmFtcyAqcEVxQmFuZFBhcmFtcyA9ICZjYi5tUHJlRXFCYW5kc1tiXTsKKyAgICAgICAgICAgICAgICAgICAgSVNfQ0hBTkdFRChjaGFuZ2VkLCBwRXFCYW5kUGFyYW1zLT5lbmFibGVkLCBwRXFCYW5kLT5pc0VuYWJsZWQoKSk7CisgICAgICAgICAgICAgICAgICAgIElTX0NIQU5HRUQoY2hhbmdlZCwgcEVxQmFuZFBhcmFtcy0+ZnJlcUN1dG9mZkh6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFcUJhbmQtPmdldEN1dG9mZkZyZXF1ZW5jeSgpKTsKKyAgICAgICAgICAgICAgICAgICAgSVNfQ0hBTkdFRChjaGFuZ2VkLCBwRXFCYW5kUGFyYW1zLT5nYWluRGIsIHBFcUJhbmQtPmdldEdhaW4oKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGNoYW5nZWQpIHsKKyAgICAgICAgICAgIGZsb2F0IGlucHV0R2FpbkZhY3RvciA9IGRCdG9MaW5lYXIoY2IuaW5wdXRHYWluRGIpOworICAgICAgICAgICAgaWYgKGNiLm1QcmVFcUluVXNlICYmIGNiLm1QcmVFcUVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigicHJlRXEgY2hhbmdlZCwgcmVjb21wdXRpbmchIGNoYW5uZWwgJWQiLCBjaGFubmVsSW5kZXgpOworICAgICAgICAgICAgICAgIHNpemVfdCBiaW5OZXh0ID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBiID0gMDsgYiA8IGdldFByZUVxQmFuZENvdW50KCk7IGIrKykgeworICAgICAgICAgICAgICAgICAgICBDaGFubmVsQnVmZmVyOjpFcUJhbmRQYXJhbXMgKnBFcUJhbmRQYXJhbXMgPSAmY2IubVByZUVxQmFuZHNbYl07CisKKyAgICAgICAgICAgICAgICAgICAgLy9mcmVxdWVuY3kgdHJhbnNsYXRpb24KKyAgICAgICAgICAgICAgICAgICAgY2IuY29tcHV0ZUJpblN0YXJ0U3RvcCgqcEVxQmFuZFBhcmFtcywgYmluTmV4dCk7CisgICAgICAgICAgICAgICAgICAgIGJpbk5leHQgPSBwRXFCYW5kUGFyYW1zLT5iaW5TdG9wICsgMTsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgZmFjdG9yID0gZEJ0b0xpbmVhcihwRXFCYW5kUGFyYW1zLT5nYWluRGIpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXBFcUJhbmRQYXJhbXMtPmVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvciA9IGlucHV0R2FpbkZhY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBrID0gcEVxQmFuZFBhcmFtcy0+YmluU3RhcnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgayA8PSBwRXFCYW5kUGFyYW1zLT5iaW5TdG9wICYmIGsgPCBtSGFsZkZGVFNpemU7IGsrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgY2IubVByZUVxRmFjdG9yVmVjdG9yW2tdID0gZmFjdG9yICogaW5wdXRHYWluRmFjdG9yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVigib25seSBpbnB1dCBnYWluIGNoYW5nZWQsIHJlY29tcHV0aW5nISIpOworICAgICAgICAgICAgICAgIC8vcG9wdWxhdGUgUHJlRXEgZmFjdG9yIHdpdGggaW5wdXQgZ2FpbiBmYWN0b3IuCisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBtSGFsZkZGVFNpemU7IGsrKykgeworICAgICAgICAgICAgICAgICAgICBjYi5tUHJlRXFGYWN0b3JWZWN0b3Jba10gPSBpbnB1dEdhaW5GYWN0b3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSAvL2lucHV0R2FpbiBhbmQgcHJlRXEKKworICAgIC8vPT09RXFQb3N0CisgICAgaWYgKGNiLm1Qb3N0RXFJblVzZSkgeworICAgICAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKKworICAgICAgICBEUEVxICpwUG9zdEVxID0gcENoYW5uZWwtPmdldFBvc3RFcSgpOworICAgICAgICBpZiAocFBvc3RFcSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiRXJyb3I6IHVwZGF0ZVBhcmFtZXRlcnMgbnVsbCBwb3N0RXEgZm9yIGNoYW5uZWw6ICVkIiwgY2hhbm5lbEluZGV4KTsKKyAgICAgICAgICAgIHJldHVybjsgLy9mYWlsZWQuCisgICAgICAgIH0KKyAgICAgICAgSVNfQ0hBTkdFRChjaGFuZ2VkLCBjYi5tUG9zdEVxRW5hYmxlZCwgcFBvc3RFcS0+aXNFbmFibGVkKCkpOworICAgICAgICBpZiAoY2IubVBvc3RFcUVuYWJsZWQpIHsKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IGIgPSAwOyBiIDwgZ2V0UG9zdEVxQmFuZENvdW50KCk7IGIrKykgeworICAgICAgICAgICAgICAgIERQRXFCYW5kICpwRXFCYW5kID0gcFBvc3RFcS0+Z2V0QmFuZChiKTsKKyAgICAgICAgICAgICAgICBpZiAocEVxQmFuZCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJFcnJvcjogdXBkYXRlUGFyYW1ldGVycyBQb3N0RXFCYW5kIE5VTEwgZm9yIGJhbmQgJWQiLCBiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvL2ZhaWxlZC4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ2hhbm5lbEJ1ZmZlcjo6RXFCYW5kUGFyYW1zICpwRXFCYW5kUGFyYW1zID0gJmNiLm1Qb3N0RXFCYW5kc1tiXTsKKyAgICAgICAgICAgICAgICBJU19DSEFOR0VEKGNoYW5nZWQsIHBFcUJhbmRQYXJhbXMtPmVuYWJsZWQsIHBFcUJhbmQtPmlzRW5hYmxlZCgpKTsKKyAgICAgICAgICAgICAgICBJU19DSEFOR0VEKGNoYW5nZWQsIHBFcUJhbmRQYXJhbXMtPmZyZXFDdXRvZmZIeiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBFcUJhbmQtPmdldEN1dG9mZkZyZXF1ZW5jeSgpKTsKKyAgICAgICAgICAgICAgICBJU19DSEFOR0VEKGNoYW5nZWQsIHBFcUJhbmRQYXJhbXMtPmdhaW5EYiwgcEVxQmFuZC0+Z2V0R2FpbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoInBvc3RFcSBjaGFuZ2VkLCByZWNvbXB1dGluZyEgY2hhbm5lbCAlZCIsIGNoYW5uZWxJbmRleCk7CisgICAgICAgICAgICAgICAgc2l6ZV90IGJpbk5leHQgPSAwOworICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IGIgPSAwOyBiIDwgZ2V0UG9zdEVxQmFuZENvdW50KCk7IGIrKykgeworICAgICAgICAgICAgICAgICAgICBDaGFubmVsQnVmZmVyOjpFcUJhbmRQYXJhbXMgKnBFcUJhbmRQYXJhbXMgPSAmY2IubVBvc3RFcUJhbmRzW2JdOworCisgICAgICAgICAgICAgICAgICAgIC8vZnJlcXVlbmN5IHRyYW5zbGF0aW9uCisgICAgICAgICAgICAgICAgICAgIGNiLmNvbXB1dGVCaW5TdGFydFN0b3AoKnBFcUJhbmRQYXJhbXMsIGJpbk5leHQpOworICAgICAgICAgICAgICAgICAgICBiaW5OZXh0ID0gcEVxQmFuZFBhcmFtcy0+YmluU3RvcCArIDE7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZhY3RvciA9IGRCdG9MaW5lYXIocEVxQmFuZFBhcmFtcy0+Z2FpbkRiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFwRXFCYW5kUGFyYW1zLT5lbmFibGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3IgPSAxLjA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgayA9IHBFcUJhbmRQYXJhbXMtPmJpblN0YXJ0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsgPD0gcEVxQmFuZFBhcmFtcy0+YmluU3RvcCAmJiBrIDwgbUhhbGZGRlRTaXplOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNiLm1Qb3N0RXFGYWN0b3JWZWN0b3Jba10gPSBmYWN0b3I7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gLy9lbmFibGVkCisgICAgfQorCisgICAgLy89PT1NQkMKKyAgICBpZiAoY2IubU1iY0luVXNlKSB7CisgICAgICAgIERQTWJjICpwTWJjID0gcENoYW5uZWwtPmdldE1iYygpOworICAgICAgICBpZiAocE1iYyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiRXJyb3I6IHVwZGF0ZVBhcmFtZXRlcnMgTWJjIE5VTEwgZm9yIGNoYW5uZWw6ICVkIiwgY2hhbm5lbEluZGV4KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBjYi5tTWJjRW5hYmxlZCA9IHBNYmMtPmlzRW5hYmxlZCgpOworICAgICAgICBpZiAoY2IubU1iY0VuYWJsZWQpIHsKKyAgICAgICAgICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgYiA9IDA7IGIgPCBnZXRNYmNCYW5kQ291bnQoKTsgYisrKSB7CisgICAgICAgICAgICAgICAgRFBNYmNCYW5kICpwTWJjQmFuZCA9IHBNYmMtPmdldEJhbmQoYik7CisgICAgICAgICAgICAgICAgaWYgKHBNYmNCYW5kID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkVycm9yOiB1cGRhdGVQYXJhbWV0ZXJzIE1iY0JhbmQgTlVMTCBmb3IgYmFuZCAlZCIsIGIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vZmFpbGVkLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDaGFubmVsQnVmZmVyOjpNYmNCYW5kUGFyYW1zICpwTWJjQmFuZFBhcmFtcyA9ICZjYi5tTWJjQmFuZHNbYl07CisgICAgICAgICAgICAgICAgcE1iY0JhbmRQYXJhbXMtPmVuYWJsZWQgPSBwTWJjQmFuZC0+aXNFbmFibGVkKCk7CisgICAgICAgICAgICAgICAgSVNfQ0hBTkdFRChjaGFuZ2VkLCBwTWJjQmFuZFBhcmFtcy0+ZnJlcUN1dG9mZkh6LAorICAgICAgICAgICAgICAgICAgICAgICAgcE1iY0JhbmQtPmdldEN1dG9mZkZyZXF1ZW5jeSgpKTsKKworICAgICAgICAgICAgICAgIHBNYmNCYW5kUGFyYW1zLT5nYWluUHJlRGIgPSBwTWJjQmFuZC0+Z2V0UHJlR2FpbigpOworICAgICAgICAgICAgICAgIHBNYmNCYW5kUGFyYW1zLT5nYWluUG9zdERiID0gcE1iY0JhbmQtPmdldFBvc3RHYWluKCk7CisgICAgICAgICAgICAgICAgcE1iY0JhbmRQYXJhbXMtPmF0dGFja1RpbWVNcyA9IHBNYmNCYW5kLT5nZXRBdHRhY2tUaW1lKCk7CisgICAgICAgICAgICAgICAgcE1iY0JhbmRQYXJhbXMtPnJlbGVhc2VUaW1lTXMgPSBwTWJjQmFuZC0+Z2V0UmVsZWFzZVRpbWUoKTsKKyAgICAgICAgICAgICAgICBwTWJjQmFuZFBhcmFtcy0+cmF0aW8gPSBwTWJjQmFuZC0+Z2V0UmF0aW8oKTsKKyAgICAgICAgICAgICAgICBwTWJjQmFuZFBhcmFtcy0+dGhyZXNob2xkRGIgPSBwTWJjQmFuZC0+Z2V0VGhyZXNob2xkKCk7CisgICAgICAgICAgICAgICAgcE1iY0JhbmRQYXJhbXMtPmtuZWVXaWR0aERiID0gcE1iY0JhbmQtPmdldEtuZWVXaWR0aCgpOworICAgICAgICAgICAgICAgIHBNYmNCYW5kUGFyYW1zLT5ub2lzZUdhdGVUaHJlc2hvbGREYiA9IHBNYmNCYW5kLT5nZXROb2lzZUdhdGVUaHJlc2hvbGQoKTsKKyAgICAgICAgICAgICAgICBwTWJjQmFuZFBhcmFtcy0+ZXhwYW5kZXJSYXRpbyA9IHBNYmNCYW5kLT5nZXRFeHBhbmRlclJhdGlvKCk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigibWJjIGNoYW5nZWQsIHJlY29tcHV0aW5nISBjaGFubmVsICVkIiwgY2hhbm5lbEluZGV4KTsKKyAgICAgICAgICAgICAgICBzaXplX3QgYmluTmV4dD0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBiID0gMDsgYiA8IGdldE1iY0JhbmRDb3VudCgpOyBiKyspIHsKKyAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbEJ1ZmZlcjo6TWJjQmFuZFBhcmFtcyAqcE1iY0JhbmRQYXJhbXMgPSAmY2IubU1iY0JhbmRzW2JdOworCisgICAgICAgICAgICAgICAgICAgIHBNYmNCYW5kUGFyYW1zLT5wcmV2aW91c0VudmVsb3BlID0gMDsKKworICAgICAgICAgICAgICAgICAgICAvL2ZyZXF1ZW5jeSB0cmFuc2xhdGlvbgorICAgICAgICAgICAgICAgICAgICBjYi5jb21wdXRlQmluU3RhcnRTdG9wKCpwTWJjQmFuZFBhcmFtcywgYmluTmV4dCk7CisgICAgICAgICAgICAgICAgICAgIGJpbk5leHQgPSBwTWJjQmFuZFBhcmFtcy0+YmluU3RvcCArIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy89PT1MaW1pdGVyCisgICAgaWYgKGNiLm1MaW1pdGVySW5Vc2UpIHsKKyAgICAgICAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7CisgICAgICAgIERQTGltaXRlciAqcExpbWl0ZXIgPSBwQ2hhbm5lbC0+Z2V0TGltaXRlcigpOworICAgICAgICBpZiAocExpbWl0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkVycm9yOiB1cGRhdGVQYXJhbWV0ZXJzIExpbWl0ZXIgTlVMTCBmb3IgY2hhbm5lbDogJWQiLCBjaGFubmVsSW5kZXgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNiLm1MaW1pdGVyRW5hYmxlZCA9IHBMaW1pdGVyLT5pc0VuYWJsZWQoKTsKKyAgICAgICAgaWYgKGNiLm1MaW1pdGVyRW5hYmxlZCkgeworICAgICAgICAgICAgSVNfQ0hBTkdFRChjaGFuZ2VkLCBjYi5tTGltaXRlclBhcmFtcy5saW5rR3JvdXAgLAorICAgICAgICAgICAgICAgICAgICAoaW50MzJfdClwTGltaXRlci0+Z2V0TGlua0dyb3VwKCkpOworICAgICAgICAgICAgY2IubUxpbWl0ZXJQYXJhbXMuYXR0YWNrVGltZU1zID0gcExpbWl0ZXItPmdldEF0dGFja1RpbWUoKTsKKyAgICAgICAgICAgIGNiLm1MaW1pdGVyUGFyYW1zLnJlbGVhc2VUaW1lTXMgPSBwTGltaXRlci0+Z2V0UmVsZWFzZVRpbWUoKTsKKyAgICAgICAgICAgIGNiLm1MaW1pdGVyUGFyYW1zLnJhdGlvID0gcExpbWl0ZXItPmdldFJhdGlvKCk7CisgICAgICAgICAgICBjYi5tTGltaXRlclBhcmFtcy50aHJlc2hvbGREYiA9IHBMaW1pdGVyLT5nZXRUaHJlc2hvbGQoKTsKKyAgICAgICAgICAgIGNiLm1MaW1pdGVyUGFyYW1zLnBvc3RHYWluRGIgPSBwTGltaXRlci0+Z2V0UG9zdEdhaW4oKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjaGFuZ2VkKSB7CisgICAgICAgICAgICBBTE9HVigibGltaXRlciBjaGFuZ2VkLCByZWNvbXB1dGluZyBsaW5rR3JvdXBzIGZvciAlZCIsIGNoYW5uZWxJbmRleCk7CisgICAgICAgICAgICBtTGlua2VkTGltaXRlcnMucmVtb3ZlKGNoYW5uZWxJbmRleCk7IC8vaW4gY2FzZSBpdCB3YXMgYWxyZWFkeSB0aGVyZS4KKyAgICAgICAgICAgIG1MaW5rZWRMaW1pdGVycy51cGRhdGUoY2IubUxpbWl0ZXJQYXJhbXMubGlua0dyb3VwLCBjaGFubmVsSW5kZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgLy89PT0gT3V0cHV0IEdhaW4KKyAgICBjYi5vdXRwdXRHYWluRGIgPSBwQ2hhbm5lbC0+Z2V0T3V0cHV0R2FpbigpOworfQorCitzaXplX3QgRFBGcmVxdWVuY3k6OnByb2Nlc3NTYW1wbGVzKGNvbnN0IGZsb2F0ICppbiwgZmxvYXQgKm91dCwgc2l6ZV90IHNhbXBsZXMpIHsKKyAgICAgICBjb25zdCBmbG9hdCAqcEluID0gaW47CisgICAgICAgZmxvYXQgKnBPdXQgPSBvdXQ7CisKKyAgICAgICBpbnQgY2hhbm5lbENvdW50ID0gbUNoYW5uZWxCdWZmZXJzLnNpemUoKTsKKyAgICAgICBpZiAoY2hhbm5lbENvdW50IDwgMSkgeworICAgICAgICAgICBBTE9HVygid2FybmluZzogbm8gQ2hhbm5lbHMgcmVhZHkgZm9yIHByb2Nlc3NpbmciKTsKKyAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgfQorCisgICAgICAgLy8qKkNoZWNrIGlmIHBhcmFtZXRlcnMgaGF2ZSBjaGFuZ2VkIGFuZCB1cGRhdGUKKyAgICAgICBmb3IgKGludCBjaCA9IDA7IGNoIDwgY2hhbm5lbENvdW50OyBjaCsrKSB7CisgICAgICAgICAgIHVwZGF0ZVBhcmFtZXRlcnMobUNoYW5uZWxCdWZmZXJzW2NoXSwgY2gpOworICAgICAgIH0KKworICAgICAgIC8vKipzZXBhcmF0ZSBpbnRvIGNoYW5uZWxzCisgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBzYW1wbGVzOyBrICs9IGNoYW5uZWxDb3VudCkgeworICAgICAgICAgICBmb3IgKGludCBjaCA9IDA7IGNoIDwgY2hhbm5lbENvdW50OyBjaCsrKSB7CisgICAgICAgICAgICAgICBtQ2hhbm5lbEJ1ZmZlcnNbY2hdLmNCSW5wdXQud3JpdGUoKnBJbisrKTsKKyAgICAgICAgICAgfQorICAgICAgIH0KKworICAgICAgIC8vKipwcm9jZXNzIGFsbCBjaGFubmVsQnVmZmVycworICAgICAgIHByb2Nlc3NDaGFubmVsQnVmZmVycyhtQ2hhbm5lbEJ1ZmZlcnMpOworCisgICAgICAgLy8qKiBlc3RpbWF0ZSBob3cgbXVjaCBkYXRhIGlzIGF2YWlsYWJsZSBpbiBBTEwgY2hhbm5lbHMKKyAgICAgICBzaXplX3QgYXZhaWxhYmxlID0gbUNoYW5uZWxCdWZmZXJzWzBdLmNCT3V0cHV0LmF2YWlsYWJsZVRvUmVhZCgpOworICAgICAgIGZvciAoaW50IGNoID0gMTsgY2ggPCBjaGFubmVsQ291bnQ7IGNoKyspIHsKKyAgICAgICAgICAgYXZhaWxhYmxlID0gc3RkOjptaW4oYXZhaWxhYmxlLCBtQ2hhbm5lbEJ1ZmZlcnNbY2hdLmNCT3V0cHV0LmF2YWlsYWJsZVRvUmVhZCgpKTsKKyAgICAgICB9CisKKyAgICAgICAvLyoqIG1ha2Ugc3VyZSB0byBvdXRwdXQganVzdCB3aGF0IHRoZSBidWZmZXIgY2FuIGhhbmRsZQorICAgICAgIGlmIChhdmFpbGFibGUgPiBzYW1wbGVzL2NoYW5uZWxDb3VudCkgeworICAgICAgICAgICBhdmFpbGFibGUgPSBzYW1wbGVzL2NoYW5uZWxDb3VudDsKKyAgICAgICB9CisKKyAgICAgICAvLyoqUHJlcGVuZCB6ZXJvZXMgaWYgbmVjZXNzYXJ5CisgICAgICAgc2l6ZV90IGZpbGwgPSBzYW1wbGVzIC0gKGNoYW5uZWxDb3VudCAqIGF2YWlsYWJsZSk7CisgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBmaWxsOyBrKyspIHsKKyAgICAgICAgICAgKnBPdXQrKyA9IDA7CisgICAgICAgfQorCisgICAgICAgLy8qKmludGVybGVhdmUgY2hhbm5lbHMKKyAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IGF2YWlsYWJsZTsgaysrKSB7CisgICAgICAgICAgIGZvciAoaW50IGNoID0gMDsgY2ggPCBjaGFubmVsQ291bnQ7IGNoKyspIHsKKyAgICAgICAgICAgICAgICpwT3V0KysgPSBtQ2hhbm5lbEJ1ZmZlcnNbY2hdLmNCT3V0cHV0LnJlYWQoKTsKKyAgICAgICAgICAgfQorICAgICAgIH0KKworICAgICAgIHJldHVybiBzYW1wbGVzOworfQorCitzaXplX3QgRFBGcmVxdWVuY3k6OnByb2Nlc3NDaGFubmVsQnVmZmVycyhDQnVmZmVyVmVjdG9yICZjaGFubmVsQnVmZmVycykgeworICAgIGNvbnN0IGludCBjaGFubmVsQ291bnQgPSBjaGFubmVsQnVmZmVycy5zaXplKCk7CisgICAgc2l6ZV90IHByb2Nlc3NlZFNhbXBsZXMgPSAwOworICAgIHNpemVfdCBwcm9jZXNzRnJhbWVzID0gbUJsb2NrU2l6ZSAtIG1PdmVybGFwU2l6ZTsKKworICAgIHNpemVfdCBhdmFpbGFibGUgPSBjaGFubmVsQnVmZmVyc1swXS5jQklucHV0LmF2YWlsYWJsZVRvUmVhZCgpOworICAgIGZvciAoaW50IGNoID0gMTsgY2ggPCBjaGFubmVsQ291bnQ7IGNoKyspIHsKKyAgICAgICAgYXZhaWxhYmxlID0gc3RkOjptaW4oYXZhaWxhYmxlLCBjaGFubmVsQnVmZmVyc1tjaF0uY0JJbnB1dC5hdmFpbGFibGVUb1JlYWQoKSk7CisgICAgfQorCisgICAgd2hpbGUgKGF2YWlsYWJsZSA+PSBwcm9jZXNzRnJhbWVzKSB7CisgICAgICAgIC8vRmlyc3QgcGFzcworICAgICAgICBmb3IgKGludCBjaCA9IDA7IGNoIDwgY2hhbm5lbENvdW50OyBjaCsrKSB7CisgICAgICAgICAgICBDaGFubmVsQnVmZmVyICogcENiID0gJmNoYW5uZWxCdWZmZXJzW2NoXTsKKyAgICAgICAgICAgIC8vbW92ZSB0YWlsIG9mIHByZXZpb3VzCisgICAgICAgICAgICBzdGQ6OmNvcHkocENiLT5pbnB1dC5iZWdpbigpICsgcHJvY2Vzc0ZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgcENiLT5pbnB1dC5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgcENiLT5pbnB1dC5iZWdpbigpKTsKKworICAgICAgICAgICAgLy9yZWFkIG5ldyBhdmFpbGFibGUgZGF0YQorICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgayA9IDA7IGsgPCBwcm9jZXNzRnJhbWVzOyBrKyspIHsKKyAgICAgICAgICAgICAgICBwQ2ItPmlucHV0W21PdmVybGFwU2l6ZSArIGtdID0gcENiLT5jQklucHV0LnJlYWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vZmlyc3Qgc3RhZ2VzOiBmZnQsIHByZUVxLCBtYmMsIHBvc3RFcSBhbmQgc3RhcnQgb2YgTGltaXRlcgorICAgICAgICAgICAgcHJvY2Vzc2VkU2FtcGxlcyArPSBwcm9jZXNzRmlyc3RTdGFnZXMoKnBDYik7CisgICAgICAgIH0KKworICAgICAgICAvLyoqY29tcHV0ZSBsaW5rZWQgbGltaXRlcnMgYW5kIHVwZGF0ZSBsZXZlbHMgaWYgbmVlZGVkCisgICAgICAgIHByb2Nlc3NMaW5rZWRMaW1pdGVycyhjaGFubmVsQnVmZmVycyk7CisKKyAgICAgICAgLy9maW5hbCBwYXNzLgorICAgICAgICBmb3IgKGludCBjaCA9IDA7IGNoIDwgY2hhbm5lbENvdW50OyBjaCsrKSB7CisgICAgICAgICAgICBDaGFubmVsQnVmZmVyICogcENiID0gJmNoYW5uZWxCdWZmZXJzW2NoXTsKKworICAgICAgICAgICAgLy9saW5rZWQgbGltaXRlciBhbmQgaWZmdAorICAgICAgICAgICAgcHJvY2Vzc0xhc3RTdGFnZXMoKnBDYik7CisKKyAgICAgICAgICAgIC8vbWl4IHRhaWwgKGFuZCBjYXB0dXJlIG5ldyB0YWlsCisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBrID0gMDsgayA8IG1PdmVybGFwU2l6ZTsgaysrKSB7CisgICAgICAgICAgICAgICAgcENiLT5vdXRwdXRba10gKz0gcENiLT5vdXRUYWlsW2tdOworICAgICAgICAgICAgICAgIHBDYi0+b3V0VGFpbFtrXSA9IHBDYi0+b3V0cHV0W3Byb2Nlc3NGcmFtZXMgKyBrXTsgLy9uZXcgdGFpbAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL291dHB1dCBkYXRhCisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBrID0gMDsgayA8IHByb2Nlc3NGcmFtZXM7IGsrKykgeworICAgICAgICAgICAgICAgIHBDYi0+Y0JPdXRwdXQud3JpdGUocENiLT5vdXRwdXRba10pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGF2YWlsYWJsZSAtPSBwcm9jZXNzRnJhbWVzOworICAgIH0KKyAgICByZXR1cm4gcHJvY2Vzc2VkU2FtcGxlczsKK30KK3NpemVfdCBEUEZyZXF1ZW5jeTo6cHJvY2Vzc0ZpcnN0U3RhZ2VzKENoYW5uZWxCdWZmZXIgJmNiKSB7CisKKyAgICAvLyMjYXBwbHkgd2luZG93CisgICAgRWlnZW46Ok1hcDxFaWdlbjo6VmVjdG9yWGY+IGVXaW5kb3coJm1WV2luZG93WzBdLCBtVldpbmRvdy5zaXplKCkpOworICAgIEVpZ2VuOjpNYXA8RWlnZW46OlZlY3RvclhmPiBlSW5wdXQoJmNiLmlucHV0WzBdLCBjYi5pbnB1dC5zaXplKCkpOworCisgICAgRWlnZW46OlZlY3RvclhmIGVXaW4gPSBlSW5wdXQuY3dpc2VQcm9kdWN0KGVXaW5kb3cpOyAvL2FwcGx5IHdpbmRvdworCisgICAgLy8jI2ZmdAorICAgIC8vTm90ZTogd2UgYXJlIHVzaW5nIGVpZ2VuIHdpdGggdGhlIGRlZmF1bHQgc2NhbGluZywgd2hpY2ggZW5zdXJlcyB0aGF0CisgICAgLy8gIElGRlQoIEZGVCh4KSApID0geC4KKyAgICAvLyBUT0RPOiBvcHRpbWl6ZSBieSB1c2luZyB0aGUgbm9zY2FsZSBvcHRpb24sIGFuZCBjb21wZW5zYXRlIHdpdGggZEIgc2NhbGUgb2Zmc2V0cworICAgIG1GZnRTZXJ2ZXIuZndkKGNiLmNvbXBsZXhUZW1wLCBlV2luKTsKKworICAgIHNpemVfdCBjU2l6ZSA9IGNiLmNvbXBsZXhUZW1wLnNpemUoKTsKKyAgICBzaXplX3QgbWF4QmluID0gc3RkOjptaW4oY1NpemUvMiwgbUhhbGZGRlRTaXplKTsKKworICAgIC8vPT0gRXFQcmUgKGFsd2F5cyBydW5zKQorICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgbWF4QmluOyBrKyspIHsKKyAgICAgICAgY2IuY29tcGxleFRlbXBba10gKj0gY2IubVByZUVxRmFjdG9yVmVjdG9yW2tdOworICAgIH0KKworICAgIC8vPT0gTUJDCisgICAgaWYgKGNiLm1NYmNJblVzZSAmJiBjYi5tTWJjRW5hYmxlZCkgeworICAgICAgICBmb3IgKHNpemVfdCBiYW5kID0gMDsgYmFuZCA8IGNiLm1NYmNCYW5kcy5zaXplKCk7IGJhbmQrKykgeworICAgICAgICAgICAgQ2hhbm5lbEJ1ZmZlcjo6TWJjQmFuZFBhcmFtcyAqcE1iY0JhbmRQYXJhbXMgPSAmY2IubU1iY0JhbmRzW2JhbmRdOworICAgICAgICAgICAgZmxvYXQgZkVuZXJneVN1bSA9IDA7CisKKyAgICAgICAgICAgIC8vYXBwbHkgcHJlIGdhaW4uCisgICAgICAgICAgICBmbG9hdCBwcmVHYWluRmFjdG9yID0gZEJ0b0xpbmVhcihwTWJjQmFuZFBhcmFtcy0+Z2FpblByZURiKTsKKyAgICAgICAgICAgIGZsb2F0IHByZUdhaW5TcXVhcmVkID0gcHJlR2FpbkZhY3RvciAqIHByZUdhaW5GYWN0b3I7CisKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGsgPSBwTWJjQmFuZFBhcmFtcy0+YmluU3RhcnQ7IGsgPD0gcE1iY0JhbmRQYXJhbXMtPmJpblN0b3A7IGsrKykgeworICAgICAgICAgICAgICAgIGZFbmVyZ3lTdW0gKz0gc3RkOjpub3JtKGNiLmNvbXBsZXhUZW1wW2tdKSAqIHByZUdhaW5TcXVhcmVkOyAvL21hZyBzcXVhcmVkCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vRWlnZW4gRkZUIGlzIGZ1bGwgc3BlY3RydW0sIGV2ZW4gaWYgdGhlIHNvdXJjZSB3YXMgcmVhbCBkYXRhLgorICAgICAgICAgICAgLy8gRWFjaCBoYWxmIHNwZWN0cnVtIGhhcyBoYWxmIHRoZSBlbmVyZ3kuIFRoaXMgaXMgdGFrZW4gaW50byBhY2NvdW50IHdpdGggdGhlICogMgorICAgICAgICAgICAgLy8gZmFjdG9yIGluIHRoZSBlbmVyZ3kgY29tcHV0YXRpb25zLgorICAgICAgICAgICAgLy8gZW5lcmd5ID0gc3FydChzdW1fY29tcG9uZW50c19zcXVhcmVkKSBudW1iZXJfcG9pbnRzCisgICAgICAgICAgICAvLyBpbiBoZXJlLCB0aGUgZkVuZXJneVN1bSBpcyBkdXBsaWNhdGVkIHRvIGFjY291bnQgZm9yIHRoZSBzZWNvbmQgaGFsZiBzcGVjdHJ1bSwKKyAgICAgICAgICAgIC8vIGFuZCB0aGUgd2luZG93Um1zIGlzIHVzZWQgdG8gbm9ybWFsaXplIGJ5IHRoZSBleHBlY3RlZCBlbmVyZ3kgcmVkdWN0aW9uCisgICAgICAgICAgICAvLyBjYXVzZWQgYnkgdGhlIHdpbmRvdyB1c2VkIChleHBlY3RlZCBmb3Igc3RlYWR5IHN0YXRlIHNpZ25hbHMpCisgICAgICAgICAgICBmRW5lcmd5U3VtID0gc3FydChmRW5lcmd5U3VtICogMikgLyAobUJsb2NrU2l6ZSAqIG1XaW5kb3dSbXMpOworCisgICAgICAgICAgICAvLyB1cGRhdGVzIGNvbXB1dGVkIHBlciBmcmFtZSBhZHZhbmNlLgorICAgICAgICAgICAgZmxvYXQgZlRoZXRhID0gMC4wOworICAgICAgICAgICAgZmxvYXQgZkZBdHRTZWMgPSBwTWJjQmFuZFBhcmFtcy0+YXR0YWNrVGltZU1zIC8gMTAwMDsgLy9pbiBzZWNvbmRzCisgICAgICAgICAgICBmbG9hdCBmRlJlbFNlYyA9IHBNYmNCYW5kUGFyYW1zLT5yZWxlYXNlVGltZU1zIC8gMTAwMDsgLy9pbiBzZWNvbmRzCisKKyAgICAgICAgICAgIGlmIChmRW5lcmd5U3VtID4gcE1iY0JhbmRQYXJhbXMtPnByZXZpb3VzRW52ZWxvcGUpIHsKKyAgICAgICAgICAgICAgICBmVGhldGEgPSBleHAoLTEuMCAvIChmRkF0dFNlYyAqIG1CbG9ja3NQZXJTZWNvbmQpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZlRoZXRhID0gZXhwKC0xLjAgLyAoZkZSZWxTZWMgKiBtQmxvY2tzUGVyU2Vjb25kKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZsb2F0IGZFbnYgPSAoMS4wIC0gZlRoZXRhKSAqIGZFbmVyZ3lTdW0gKyBmVGhldGEgKiBwTWJjQmFuZFBhcmFtcy0+cHJldmlvdXNFbnZlbG9wZTsKKyAgICAgICAgICAgIC8vcHJlc2VydmUgZm9yIG5leHQgaXRlcmF0aW9uCisgICAgICAgICAgICBwTWJjQmFuZFBhcmFtcy0+cHJldmlvdXNFbnZlbG9wZSA9IGZFbnY7CisKKyAgICAgICAgICAgIGlmIChmRW52IDwgTUlOX0VOVkVMT1BFKSB7CisgICAgICAgICAgICAgICAgZkVudiA9IE1JTl9FTlZFTE9QRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IGVudkRiID0gbGluZWFyVG9EYihmRW52KTsKKyAgICAgICAgICAgIGZsb2F0IG5ld0xldmVsRGIgPSBlbnZEYjsKKyAgICAgICAgICAgIC8vdXNpbmcgc2hvcnRlciB2YXJpYWJsZXMgZm9yIGNvZGUgY2xhcml0eQorICAgICAgICAgICAgY29uc3QgZmxvYXQgdGhyZXNob2xkRGIgPSBwTWJjQmFuZFBhcmFtcy0+dGhyZXNob2xkRGI7CisgICAgICAgICAgICBjb25zdCBmbG9hdCByYXRpbyA9IHBNYmNCYW5kUGFyYW1zLT5yYXRpbzsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IGtuZWVXaWR0aERiSGFsZiA9IHBNYmNCYW5kUGFyYW1zLT5rbmVlV2lkdGhEYiAvIDI7CisgICAgICAgICAgICBjb25zdCBmbG9hdCBub2lzZUdhdGVUaHJlc2hvbGREYiA9IHBNYmNCYW5kUGFyYW1zLT5ub2lzZUdhdGVUaHJlc2hvbGREYjsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IGV4cGFuZGVyUmF0aW8gPSBwTWJjQmFuZFBhcmFtcy0+ZXhwYW5kZXJSYXRpbzsKKworICAgICAgICAgICAgLy9maW5kIHNlZ21lbnQKKyAgICAgICAgICAgIGlmIChlbnZEYiA+IHRocmVzaG9sZERiICsga25lZVdpZHRoRGJIYWxmKSB7CisgICAgICAgICAgICAgICAgLy9jb21wcmVzc2lvbiBzZWdtZW50CisgICAgICAgICAgICAgICAgbmV3TGV2ZWxEYiA9IGVudkRiICsgKCgxIC8gcmF0aW8pIC0gMSkgKiAoZW52RGIgLSB0aHJlc2hvbGREYik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGVudkRiID4gdGhyZXNob2xkRGIgLSBrbmVlV2lkdGhEYkhhbGYpIHsKKyAgICAgICAgICAgICAgICAvL2tuZWUtY29tcHJlc3Npb24gc2VnbWVudAorICAgICAgICAgICAgICAgIGZsb2F0IHRlbXAgPSAoZW52RGIgLSB0aHJlc2hvbGREYiArIGtuZWVXaWR0aERiSGFsZik7CisgICAgICAgICAgICAgICAgbmV3TGV2ZWxEYiA9IGVudkRiICsgKCgxIC8gcmF0aW8pIC0gMSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCAqIHRlbXAgLyAoa25lZVdpZHRoRGJIYWxmICogNCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGVudkRiIDwgbm9pc2VHYXRlVGhyZXNob2xkRGIpIHsKKyAgICAgICAgICAgICAgICAvL2V4cGFuZGVyIHNlZ21lbnQKKyAgICAgICAgICAgICAgICBuZXdMZXZlbERiID0gbm9pc2VHYXRlVGhyZXNob2xkRGIgLQorICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kZXJSYXRpbyAqIChub2lzZUdhdGVUaHJlc2hvbGREYiAtIGVudkRiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmxvYXQgbmV3RmFjdG9yID0gZEJ0b0xpbmVhcihuZXdMZXZlbERiIC0gZW52RGIpOworCisgICAgICAgICAgICAvL2FwcGx5IHBvc3QgZ2Fpbi4KKyAgICAgICAgICAgIG5ld0ZhY3RvciAqPSBkQnRvTGluZWFyKHBNYmNCYW5kUGFyYW1zLT5nYWluUG9zdERiKTsKKworICAgICAgICAgICAgLy9hcHBseSB0byB0aGlzIGJhbmQKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGsgPSBwTWJjQmFuZFBhcmFtcy0+YmluU3RhcnQ7IGsgPD0gcE1iY0JhbmRQYXJhbXMtPmJpblN0b3A7IGsrKykgeworICAgICAgICAgICAgICAgIGNiLmNvbXBsZXhUZW1wW2tdICo9IG5ld0ZhY3RvcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IC8vZW5kIHBlciBiYW5kIHByb2Nlc3MKKworICAgIH0gLy9lbmQgTUJDCisKKyAgICAvLz09IEVxUG9zdAorICAgIGlmIChjYi5tUG9zdEVxSW5Vc2UgJiYgY2IubVBvc3RFcUVuYWJsZWQpIHsKKyAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBtYXhCaW47IGsrKykgeworICAgICAgICAgICAgY2IuY29tcGxleFRlbXBba10gKj0gY2IubVBvc3RFcUZhY3RvclZlY3RvcltrXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vPT0gTGltaXRlci4gRmlyc3QgUGFzcworICAgIGlmIChjYi5tTGltaXRlckluVXNlICYmIGNiLm1MaW1pdGVyRW5hYmxlZCkgeworICAgICAgICBmbG9hdCBmRW5lcmd5U3VtID0gMDsKKyAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBtYXhCaW47IGsrKykgeworICAgICAgICAgICAgZkVuZXJneVN1bSArPSBzdGQ6Om5vcm0oY2IuY29tcGxleFRlbXBba10pOworICAgICAgICB9CisKKyAgICAgICAgLy9zZWUgZXhwbGFuYXRpb24gYWJvdmUgZm9yIGVuZXJneSBjb21wdXRhdGlvbiBsb2dpYworICAgICAgICBmRW5lcmd5U3VtID0gc3FydChmRW5lcmd5U3VtICogMikgLyAobUJsb2NrU2l6ZSAqIG1XaW5kb3dSbXMpOworICAgICAgICBmbG9hdCBmVGhldGEgPSAwLjA7CisgICAgICAgIGZsb2F0IGZGQXR0U2VjID0gY2IubUxpbWl0ZXJQYXJhbXMuYXR0YWNrVGltZU1zIC8gMTAwMDsgLy9pbiBzZWNvbmRzCisgICAgICAgIGZsb2F0IGZGUmVsU2VjID0gY2IubUxpbWl0ZXJQYXJhbXMucmVsZWFzZVRpbWVNcyAvIDEwMDA7IC8vaW4gc2Vjb25kcworCisgICAgICAgIGlmIChmRW5lcmd5U3VtID4gY2IubUxpbWl0ZXJQYXJhbXMucHJldmlvdXNFbnZlbG9wZSkgeworICAgICAgICAgICAgZlRoZXRhID0gZXhwKC0xLjAgLyAoZkZBdHRTZWMgKiBtQmxvY2tzUGVyU2Vjb25kKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmVGhldGEgPSBleHAoLTEuMCAvIChmRlJlbFNlYyAqIG1CbG9ja3NQZXJTZWNvbmQpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IGZFbnYgPSAoMS4wIC0gZlRoZXRhKSAqIGZFbmVyZ3lTdW0gKyBmVGhldGEgKiBjYi5tTGltaXRlclBhcmFtcy5wcmV2aW91c0VudmVsb3BlOworICAgICAgICAvL3ByZXNlcnZlIGZvciBuZXh0IGl0ZXJhdGlvbgorICAgICAgICBjYi5tTGltaXRlclBhcmFtcy5wcmV2aW91c0VudmVsb3BlID0gZkVudjsKKworICAgICAgICBjb25zdCBmbG9hdCBlbnZEYiA9IGxpbmVhclRvRGIoZkVudik7CisgICAgICAgIGZsb2F0IG5ld0ZhY3RvckRiID0gMDsKKyAgICAgICAgLy91c2luZyBzaG9ydGVyIHZhcmlhYmxlcyBmb3IgY29kZSBjbGFyaXR5CisgICAgICAgIGNvbnN0IGZsb2F0IHRocmVzaG9sZERiID0gY2IubUxpbWl0ZXJQYXJhbXMudGhyZXNob2xkRGI7CisgICAgICAgIGNvbnN0IGZsb2F0IHJhdGlvID0gY2IubUxpbWl0ZXJQYXJhbXMucmF0aW87CisKKyAgICAgICAgaWYgKGVudkRiID4gdGhyZXNob2xkRGIpIHsKKyAgICAgICAgICAgIC8vbGltaXRlciBzZWdtZW50CisgICAgICAgICAgICBuZXdGYWN0b3JEYiA9ICgoMSAvIHJhdGlvKSAtIDEpICogKGVudkRiIC0gdGhyZXNob2xkRGIpOworICAgICAgICB9CisKKyAgICAgICAgZmxvYXQgbmV3RmFjdG9yID0gZEJ0b0xpbmVhcihuZXdGYWN0b3JEYik7CisKKyAgICAgICAgY2IubUxpbWl0ZXJQYXJhbXMubmV3RmFjdG9yID0gbmV3RmFjdG9yOworCisgICAgfSAvL2VuZCBMaW1pdGVyCisgICAgcmV0dXJuIG1CbG9ja1NpemU7Cit9CisKK3ZvaWQgRFBGcmVxdWVuY3k6OnByb2Nlc3NMaW5rZWRMaW1pdGVycyhDQnVmZmVyVmVjdG9yICZjaGFubmVsQnVmZmVycykgeworCisgICAgY29uc3QgaW50IGNoYW5uZWxDb3VudCA9IGNoYW5uZWxCdWZmZXJzLnNpemUoKTsKKyAgICBmb3IgKGF1dG8gJmdyb3VwUGFpciA6IG1MaW5rZWRMaW1pdGVycy5tR3JvdXBzTWFwKSB7CisgICAgICAgIGZsb2F0IG1pbkZhY3RvciA9IDEuMDsKKyAgICAgICAgLy9lc3RpbWF0ZSBtaW5mYWN0b3IgZm9yIGFsbCBsaW5rZWQKKyAgICAgICAgZm9yKGludCBpbmRleCA6IGdyb3VwUGFpci5zZWNvbmQpIHsKKyAgICAgICAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgY2hhbm5lbENvdW50KSB7CisgICAgICAgICAgICAgICAgbWluRmFjdG9yID0gc3RkOjptaW4oY2hhbm5lbEJ1ZmZlcnNbaW5kZXhdLm1MaW1pdGVyUGFyYW1zLm5ld0ZhY3RvciwgbWluRmFjdG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvL2FwcGx5IG1pbkZhY3RvcgorICAgICAgICBmb3IoaW50IGluZGV4IDogZ3JvdXBQYWlyLnNlY29uZCkgeworICAgICAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBjaGFubmVsQ291bnQpIHsKKyAgICAgICAgICAgICAgICBjaGFubmVsQnVmZmVyc1tpbmRleF0ubUxpbWl0ZXJQYXJhbXMubGlua0ZhY3RvciA9IG1pbkZhY3RvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc2l6ZV90IERQRnJlcXVlbmN5Ojpwcm9jZXNzTGFzdFN0YWdlcyhDaGFubmVsQnVmZmVyICZjYikgeworCisgICAgZmxvYXQgb3V0cHV0R2FpbkZhY3RvciA9IGRCdG9MaW5lYXIoY2Iub3V0cHV0R2FpbkRiKTsKKyAgICAvLz09IExpbWl0ZXIuIGxhc3QgUGFzcworICAgIGlmIChjYi5tTGltaXRlckluVXNlICYmIGNiLm1MaW1pdGVyRW5hYmxlZCkgeworICAgICAgICAvL2NvbXB1dGUgZmFjdG9yLCB3aXRoIHBvc3QtZ2FpbgorICAgICAgICBmbG9hdCBmYWN0b3IgPSBjYi5tTGltaXRlclBhcmFtcy5saW5rRmFjdG9yICogZEJ0b0xpbmVhcihjYi5tTGltaXRlclBhcmFtcy5wb3N0R2FpbkRiKTsKKyAgICAgICAgb3V0cHV0R2FpbkZhY3RvciAqPSBmYWN0b3I7CisgICAgfQorCisgICAgLy9hcHBseSB0byBhbGwgaWYgIT0gMS4wCisgICAgaWYgKCFjb21wYXJlRXF1YWxpdHkob3V0cHV0R2FpbkZhY3RvciwgMS4wZikpIHsKKyAgICAgICAgc2l6ZV90IGNTaXplID0gY2IuY29tcGxleFRlbXAuc2l6ZSgpOworICAgICAgICBzaXplX3QgbWF4QmluID0gc3RkOjptaW4oY1NpemUvMiwgbUhhbGZGRlRTaXplKTsKKyAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBtYXhCaW47IGsrKykgeworICAgICAgICAgICAgY2IuY29tcGxleFRlbXBba10gKj0gb3V0cHV0R2FpbkZhY3RvcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIyNpZmZ0IGRpcmVjdGx5IHRvIG91dHB1dC4KKyAgICBFaWdlbjo6TWFwPEVpZ2VuOjpWZWN0b3JYZj4gZU91dHB1dCgmY2Iub3V0cHV0WzBdLCBjYi5vdXRwdXQuc2l6ZSgpKTsKKyAgICBtRmZ0U2VydmVyLmludihlT3V0cHV0LCBjYi5jb21wbGV4VGVtcCk7CisgICAgcmV0dXJuIG1CbG9ja1NpemU7Cit9CisKK30gLy9uYW1lc3BhY2UgZHBfZngKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZHluYW1pY3Nwcm9jL2RzcC9EUEZyZXF1ZW5jeS5oIGIvbWVkaWEvbGliZWZmZWN0cy9keW5hbWljc3Byb2MvZHNwL0RQRnJlcXVlbmN5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU4NzcxZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZHluYW1pY3Nwcm9jL2RzcC9EUEZyZXF1ZW5jeS5oCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjaWZuZGVmIERQRlJFUVVFTkNZX0hfCisjZGVmaW5lIERQRlJFUVVFTkNZX0hfCisKKyNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KKyNpbmNsdWRlIDx1bnN1cHBvcnRlZC9FaWdlbi9GRlQ+CisKKyNpbmNsdWRlICJSRHNwLmgiCisjaW5jbHVkZSAiU0hDaXJjdWxhckJ1ZmZlci5oIgorCisjaW5jbHVkZSAiRFBCYXNlLmgiCisKKworbmFtZXNwYWNlIGRwX2Z4IHsKKwordXNpbmcgRlhCdWZmZXIgPSBTSENpcmN1bGFyQnVmZmVyPGZsb2F0PjsKKworY2xhc3MgQ2hhbm5lbEJ1ZmZlciB7CitwdWJsaWM6CisgICAgRlhCdWZmZXIgY0JJbnB1dDsgICAvLyBDaXJjdWxhciBCdWZmZXIgaW5wdXQKKyAgICBGWEJ1ZmZlciBjQk91dHB1dDsgIC8vIENpcmN1bGFyIEJ1ZmZlciBvdXRwdXQKKyAgICBGbG9hdFZlYyBpbnB1dDsgICAgIC8vIHRpbWUgZG9tYWluIHRlbXAgdmVjdG9yIGZvciBpbnB1dAorICAgIEZsb2F0VmVjIG91dHB1dDsgICAgLy8gdGltZSBkb21haW4gdGVtcCB2ZWN0b3IgZm9yIG91dHB1dAorICAgIEZsb2F0VmVjIG91dFRhaWw7ICAgLy8gdGltZSBkb21haW4gdGVtcCB2ZWN0b3IgZm9yIG91dHB1dCB0YWlsIChmb3Igb3ZlcmxhcC1hZGQgbWV0aG9kKQorCisgICAgRWlnZW46OlZlY3RvclhjZiBjb21wbGV4VGVtcDsgLy8gY29tcGxleCB0ZW1wIHZlY3RvciBmb3IgZnJlcXVlbmN5IGRvbWFpbiBvcGVyYXRpb25zCisKKyAgICAvL0N1cnJlbnQgcGFyYW1ldGVycworICAgIGZsb2F0IGlucHV0R2FpbkRiOworICAgIGZsb2F0IG91dHB1dEdhaW5EYjsKKyAgICBzdHJ1Y3QgQmFuZFBhcmFtcyB7CisgICAgICAgIGJvb2wgZW5hYmxlZDsKKyAgICAgICAgZmxvYXQgZnJlcUN1dG9mZkh6OworICAgICAgICBzaXplX3QgYmluU3RhcnQ7CisgICAgICAgIHNpemVfdCBiaW5TdG9wOworICAgIH07CisgICAgc3RydWN0IEVxQmFuZFBhcmFtcyA6IHB1YmxpYyBCYW5kUGFyYW1zIHsKKyAgICAgICAgZmxvYXQgZ2FpbkRiOworICAgIH07CisgICAgc3RydWN0IE1iY0JhbmRQYXJhbXMgOiBwdWJsaWMgQmFuZFBhcmFtcyB7CisgICAgICAgIGZsb2F0IGdhaW5QcmVEYjsKKyAgICAgICAgZmxvYXQgZ2FpblBvc3REYjsKKyAgICAgICAgZmxvYXQgYXR0YWNrVGltZU1zOworICAgICAgICBmbG9hdCByZWxlYXNlVGltZU1zOworICAgICAgICBmbG9hdCByYXRpbzsKKyAgICAgICAgZmxvYXQgdGhyZXNob2xkRGI7CisgICAgICAgIGZsb2F0IGtuZWVXaWR0aERiOworICAgICAgICBmbG9hdCBub2lzZUdhdGVUaHJlc2hvbGREYjsKKyAgICAgICAgZmxvYXQgZXhwYW5kZXJSYXRpbzsKKworICAgICAgICAvL0hpc3RvcmljIHZhbHVlcworICAgICAgICBmbG9hdCBwcmV2aW91c0VudmVsb3BlOworICAgIH07CisgICAgc3RydWN0IExpbWl0ZXJQYXJhbXMgeworICAgICAgICBpbnQzMl90IGxpbmtHcm91cDsKKyAgICAgICAgZmxvYXQgYXR0YWNrVGltZU1zOworICAgICAgICBmbG9hdCByZWxlYXNlVGltZU1zOworICAgICAgICBmbG9hdCByYXRpbzsKKyAgICAgICAgZmxvYXQgdGhyZXNob2xkRGI7CisgICAgICAgIGZsb2F0IHBvc3RHYWluRGI7CisKKyAgICAgICAgLy9IaXN0b3JpYyB2YWx1ZXMKKyAgICAgICAgZmxvYXQgcHJldmlvdXNFbnZlbG9wZTsKKyAgICAgICAgZmxvYXQgbmV3RmFjdG9yOworICAgICAgICBmbG9hdCBsaW5rRmFjdG9yOworICAgIH07CisKKyAgICBib29sIG1QcmVFcUluVXNlOworICAgIGJvb2wgbVByZUVxRW5hYmxlZDsKKyAgICBzdGQ6OnZlY3RvcjxFcUJhbmRQYXJhbXM+IG1QcmVFcUJhbmRzOworCisgICAgYm9vbCBtTWJjSW5Vc2U7CisgICAgYm9vbCBtTWJjRW5hYmxlZDsKKyAgICBzdGQ6OnZlY3RvcjxNYmNCYW5kUGFyYW1zPiBtTWJjQmFuZHM7CisKKyAgICBib29sIG1Qb3N0RXFJblVzZTsKKyAgICBib29sIG1Qb3N0RXFFbmFibGVkOworICAgIHN0ZDo6dmVjdG9yPEVxQmFuZFBhcmFtcz4gbVBvc3RFcUJhbmRzOworCisgICAgYm9vbCBtTGltaXRlckluVXNlOworICAgIGJvb2wgbUxpbWl0ZXJFbmFibGVkOworICAgIExpbWl0ZXJQYXJhbXMgbUxpbWl0ZXJQYXJhbXM7CisgICAgRmxvYXRWZWMgbVByZUVxRmFjdG9yVmVjdG9yOyAvLyB0ZW1wIHByZS1jb21wdXRlZCB2ZWN0b3IgdG8gc2hhcGUgc3BlY3RydW0gYXQgcHJlRVEgc3RhZ2UKKyAgICBGbG9hdFZlYyBtUG9zdEVxRmFjdG9yVmVjdG9yOyAvLyB0ZW1wIHByZS1jb21wdXRlZCB2ZWN0b3IgdG8gc2hhcGUgc3BlY3RydW0gYXQgcG9zdEVRIHN0YWdlCisKKyAgICB2b2lkIGluaXRCdWZmZXJzKHVuc2lnbmVkIGludCBibG9ja1NpemUsIHVuc2lnbmVkIGludCBvdmVybGFwU2l6ZSwgdW5zaWduZWQgaW50IGhhbGZGZnRTaXplLAorICAgICAgICAgICAgdW5zaWduZWQgaW50IHNhbXBsaW5nUmF0ZSwgRFBCYXNlICZkcEJhc2UpOworICAgIHZvaWQgY29tcHV0ZUJpblN0YXJ0U3RvcChCYW5kUGFyYW1zICZicCwgc2l6ZV90IGJpblN0YXJ0KTsKK3ByaXZhdGU6CisgICAgdW5zaWduZWQgaW50IG1TYW1wbGluZ1JhdGU7CisgICAgdW5zaWduZWQgaW50IG1CbG9ja1NpemU7CisKK307CisKK3VzaW5nIENCdWZmZXJWZWN0b3IgPSBzdGQ6OnZlY3RvcjxDaGFubmVsQnVmZmVyPjsKKwordXNpbmcgR3JvdXBzTWFwID0gc3RkOjptYXA8aW50MzJfdCwgSW50VmVjPjsKKworY2xhc3MgTGlua2VkTGltaXRlcnMgeworcHVibGljOgorICAgIHZvaWQgcmVzZXQoKTsKKyAgICB2b2lkIHVwZGF0ZShpbnQzMl90IGdyb3VwLCBpbnQgaW5kZXgpOworICAgIHZvaWQgcmVtb3ZlKGludCBpbmRleCk7CisgICAgR3JvdXBzTWFwIG1Hcm91cHNNYXA7Cit9OworCitjbGFzcyBEUEZyZXF1ZW5jeSA6IHB1YmxpYyBEUEJhc2UgeworcHVibGljOgorICAgIHZpcnR1YWwgc2l6ZV90IHByb2Nlc3NTYW1wbGVzKGNvbnN0IGZsb2F0ICppbiwgZmxvYXQgKm91dCwgc2l6ZV90IHNhbXBsZXMpOworICAgIHZpcnR1YWwgdm9pZCByZXNldCgpOworICAgIHZvaWQgY29uZmlndXJlKHNpemVfdCBibG9ja1NpemUsIHNpemVfdCBvdmVybGFwU2l6ZSwgc2l6ZV90IHNhbXBsaW5nUmF0ZSk7CisgICAgc3RhdGljIHNpemVfdCBnZXRNaW5Cb2NrU2l6ZSgpOworICAgIHN0YXRpYyBzaXplX3QgZ2V0TWF4Qm9ja1NpemUoKTsKKworcHJpdmF0ZToKKyAgICB2b2lkIHVwZGF0ZVBhcmFtZXRlcnMoQ2hhbm5lbEJ1ZmZlciAmY2IsIGludCBjaGFubmVsSW5kZXgpOworICAgIHNpemVfdCBwcm9jZXNzTW9ubyhDaGFubmVsQnVmZmVyICZjYik7CisgICAgc2l6ZV90IHByb2Nlc3NPbmVWZWN0b3IoRmxvYXRWZWMgJm91dHB1dCwgRmxvYXRWZWMgJmlucHV0LCBDaGFubmVsQnVmZmVyICZjYik7CisKKyAgICBzaXplX3QgcHJvY2Vzc0NoYW5uZWxCdWZmZXJzKENCdWZmZXJWZWN0b3IgJmNoYW5uZWxCdWZmZXJzKTsKKyAgICBzaXplX3QgcHJvY2Vzc0ZpcnN0U3RhZ2VzKENoYW5uZWxCdWZmZXIgJmNiKTsKKyAgICBzaXplX3QgcHJvY2Vzc0xhc3RTdGFnZXMoQ2hhbm5lbEJ1ZmZlciAmY2IpOworICAgIHZvaWQgcHJvY2Vzc0xpbmtlZExpbWl0ZXJzKENCdWZmZXJWZWN0b3IgJmNoYW5uZWxCdWZmZXJzKTsKKworICAgIHNpemVfdCBtQmxvY2tTaXplOworICAgIHNpemVfdCBtSGFsZkZGVFNpemU7CisgICAgc2l6ZV90IG1PdmVybGFwU2l6ZTsKKyAgICBzaXplX3QgbVNhbXBsaW5nUmF0ZTsKKworICAgIGZsb2F0IG1CbG9ja3NQZXJTZWNvbmQ7CisKKyAgICBDQnVmZmVyVmVjdG9yIG1DaGFubmVsQnVmZmVyczsKKworICAgIExpbmtlZExpbWl0ZXJzIG1MaW5rZWRMaW1pdGVyczsKKworICAgIC8vZHNwCisgICAgRmxvYXRWZWMgbVZXaW5kb3c7ICAvL3dpbmRvdyBjbGFzcy4KKyAgICBmbG9hdCBtV2luZG93Um1zOworICAgIEVpZ2VuOjpGRlQ8ZmxvYXQ+IG1GZnRTZXJ2ZXI7Cit9OworCit9IC8vbmFtZXNwYWNlIGRwX2Z4CisKKyNlbmRpZiAgLy8gRFBGUkVRVUVOQ1lfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZHluYW1pY3Nwcm9jL2RzcC9SRHNwLmggYi9tZWRpYS9saWJlZmZlY3RzL2R5bmFtaWNzcHJvYy9kc3AvUkRzcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYTEzMDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2R5bmFtaWNzcHJvYy9kc3AvUkRzcC5oCkBAIC0wLDAgKzEsMTc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBSRFNQX0gKKyNkZWZpbmUgUkRTUF9ICisKKyNpbmNsdWRlIDxjb21wbGV4PgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bWFwPgordXNpbmcgRmxvYXRWZWMgPSBzdGQ6OnZlY3RvcjxmbG9hdD47Cit1c2luZyBJbnRWZWMgPSBzdGQ6OnZlY3RvcjxpbnQ+OwordXNpbmcgQ29tcGxleFZlYyAgPSBzdGQ6OnZlY3RvcjxzdGQ6OmNvbXBsZXg8ZmxvYXQ+PjsKKworLy8gPT09PT09PQorLy8gSGVscGVyIEZ1bmN0aW9ucworLy8gPT09PT09PQordGVtcGxhdGUgPGNsYXNzIFQ+CitzdGF0aWMgVCBkQnRvTGluZWFyKFQgdmFsdWVEYikgeworICAgIHJldHVybiBwb3cgKDEwLCB2YWx1ZURiIC8gMjAuMCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorc3RhdGljIFQgbGluZWFyVG9EYihUIHZhbHVlKSB7CisgICAgcmV0dXJuIDIwICogbG9nMTAodmFsdWUpOworfQorCisvLyA9PT09PT09CisvLyBEU1Agd2luZG93IGNyZWF0aW9uCisvLyA9PT09PT09CisKKyNkZWZpbmUgVFdPUEkgKE1fUEkgKiAyKQorCitlbnVtIHJkc3Bfd2luZG93X3R5cGUgeworICAgIFJEU1BfV0lORE9XX1JFQ1RBTkdVTEFSLAorICAgIFJEU1BfV0lORE9XX1RSSUFOR1VMQVIsCisgICAgUkRTUF9XSU5ET1dfVFJJQU5HVUxBUl9GTEFUX1RPUCwKKyAgICBSRFNQX1dJTkRPV19IQU1NSU5HLAorICAgIFJEU1BfV0lORE9XX0hBTU1JTkdfRkxBVF9UT1AsCisgICAgUkRTUF9XSU5ET1dfSEFOTklORywKKyAgICBSRFNQX1dJTkRPV19IQU5OSU5HX0ZMQVRfVE9QLAorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0aWMgdm9pZCBmaWxsUmVjdGFuZ3VsYXIoVCAmdikgeworICAgIGNvbnN0IHNpemVfdCBzaXplID0gdi5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgdltpXSA9IDEuMDsKKyAgICB9Cit9IC8vcmVjdGFuZ3VsYXIKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0aWMgdm9pZCBmaWxsVHJpYW5ndWxhcihUICZ2LCBzaXplX3Qgb3ZlcmxhcCkgeworICAgIGNvbnN0IHNpemVfdCBzaXplID0gdi5zaXplKCk7CisgICAgLy9yYW1wIHVwCisgICAgc2l6ZV90IGkgPSAwOworICAgIGlmIChvdmVybGFwID4gMCkgeworICAgICAgICBmb3IgKDsgaSA8IG92ZXJsYXA7IGkrKykgeworICAgICAgICAgICAgdltpXSA9ICgyLjAgKiBpICsgMSkgLyAoMiAqIG92ZXJsYXApOworICAgICAgICB9CisgICAgfQorCisgICAgLy9mbGF0IHRvcAorICAgIGZvciAoOyBpIDwgc2l6ZSAtIG92ZXJsYXA7IGkrKykgeworICAgICAgICB2W2ldID0gMS4wOworICAgIH0KKworICAgIC8vcmFtcCBkb3duCisgICAgaWYgKG92ZXJsYXAgPiAwKSB7CisgICAgICAgIGZvciAoOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICB2W2ldID0gKDIuMCAqIChzaXplIC0gaSkgLSAxKSAvICgyICogb3ZlcmxhcCk7CisgICAgICAgIH0KKyAgICB9Cit9IC8vdHJpYW5ndWxhcgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXRpYyB2b2lkIGZpbGxIYW1taW5nKFQgJnYsIHNpemVfdCBvdmVybGFwKSB7CisgICAgY29uc3Qgc2l6ZV90IHNpemUgPSB2LnNpemUoKTsKKyAgICBjb25zdCBzaXplX3QgdHdvT3ZlcmxhcCA9IDIgKiBvdmVybGFwOworICAgIHNpemVfdCBpID0gMDsKKyAgICBpZiAob3ZlcmxhcCA+IDApIHsKKyAgICAgICAgZm9yICg7IGkgPCBvdmVybGFwOyBpKyspIHsKKyAgICAgICAgICAgIHZbaV0gPSAwLjU0IC0gMC40NiAqIGNvcyhUV09QSSAqIGkgLyh0d29PdmVybGFwIC0gMSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLy9mbGF0IHRvcAorICAgIGZvciAoOyBpIDwgc2l6ZSAtIG92ZXJsYXA7IGkrKykgeworICAgICAgICB2W2ldID0gMS4wOworICAgIH0KKworICAgIC8vcmFtcCBkb3duCisgICAgaWYgKG92ZXJsYXAgPiAwKSB7CisgICAgICAgIGZvciAoOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBpbnQgayA9IGkgLSAoKGludClzaXplIC0gMiAqIG92ZXJsYXApOworICAgICAgICAgICAgdltpXSA9IDAuNTQgLSAwLjQ2ICogY29zKFRXT1BJICogayAvICh0d29PdmVybGFwIC0gMSkpOworICAgICAgICB9CisgICAgfQorfSAvL2hhbW1pbmcKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0aWMgdm9pZCBmaWxsSGFubmluZyhUICZ2LCBzaXplX3Qgb3ZlcmxhcCkgeworICAgIGNvbnN0IHNpemVfdCBzaXplID0gdi5zaXplKCk7CisgICAgY29uc3Qgc2l6ZV90IHR3b092ZXJsYXAgPSAyICogb3ZlcmxhcDsKKyAgICAvL3JhbXAgdXAKKyAgICBzaXplX3QgaSA9IDA7CisgICAgaWYgKG92ZXJsYXAgPiAwKSB7CisgICAgICAgIGZvciAoOyBpIDwgb3ZlcmxhcDsgaSsrKSB7CisgICAgICAgICAgICB2W2ldID0gMC41ICogKDEuMCAtIGNvcyhUV09QSSAqIGkgLyAodHdvT3ZlcmxhcCAtIDEpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvL2ZsYXQgdG9wCisgICAgZm9yICg7IGkgPCBzaXplIC0gb3ZlcmxhcDsgaSsrKSB7CisgICAgICAgIHZbaV0gPSAxLjA7CisgICAgfQorCisgICAgLy9yYW1wIGRvd24KKyAgICBpZiAob3ZlcmxhcCA+IDApIHsKKyAgICAgICAgZm9yICg7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIGludCBrID0gaSAtICgoaW50KXNpemUgLSAyICogb3ZlcmxhcCk7CisgICAgICAgICAgICB2W2ldID0gMC41ICogKDEuMCAtIGNvcyhUV09QSSAqIGsgLyAodHdvT3ZlcmxhcCAtIDEpKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIHZvaWQgZmlsbF93aW5kb3coVCAmdiwgaW50IHR5cGUsIHNpemVfdCBzaXplLCBzaXplX3Qgb3ZlcmxhcCkgeworICAgIGlmIChvdmVybGFwID4gc2l6ZSAvIDIpIHsKKyAgICAgICAgb3ZlcmxhcCA9IHNpemUgLyAyOworICAgIH0KKyAgICB2LnJlc2l6ZShzaXplKTsKKworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgUkRTUF9XSU5ET1dfUkVDVEFOR1VMQVI6CisgICAgICAgIGZpbGxSZWN0YW5ndWxhcih2KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSRFNQX1dJTkRPV19UUklBTkdVTEFSOgorICAgICAgICBmaWxsVHJpYW5ndWxhcih2LCBzaXplIC8gMik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUkRTUF9XSU5ET1dfVFJJQU5HVUxBUl9GTEFUX1RPUDoKKyAgICAgICAgZmlsbFRyaWFuZ3VsYXIodiwgb3ZlcmxhcCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUkRTUF9XSU5ET1dfSEFNTUlORzoKKyAgICAgICAgZmlsbEhhbW1pbmcodiwgc2l6ZSAvIDIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJEU1BfV0lORE9XX0hBTU1JTkdfRkxBVF9UT1A6CisgICAgICAgIGZpbGxIYW1taW5nKHYsIG92ZXJsYXApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJEU1BfV0lORE9XX0hBTk5JTkc6CisgICAgICAgIGZpbGxIYW5uaW5nKHYsIHNpemUgLyAyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSRFNQX1dJTkRPV19IQU5OSU5HX0ZMQVRfVE9QOgorICAgICAgICBmaWxsSGFubmluZyh2LCBvdmVybGFwKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR0UoIkVycm9yOiB1bmtub3duIHdpbmRvdyB0eXBlICVkIiwgdHlwZSk7CisgICAgfQorfQorCisvL307CisjZW5kaWYgLy9SRFNQX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZHluYW1pY3Nwcm9jL2RzcC9TSENpcmN1bGFyQnVmZmVyLmggYi9tZWRpYS9saWJlZmZlY3RzL2R5bmFtaWNzcHJvYy9kc3AvU0hDaXJjdWxhckJ1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMzljZDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2R5bmFtaWNzcHJvYy9kc3AvU0hDaXJjdWxhckJ1ZmZlci5oCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNIQ0lSQ1VMQVJCVUZGRVJfSAorI2RlZmluZSBTSENJUkNVTEFSQlVGRkVSX0gKKworI2luY2x1ZGUgPGxvZy9sb2cuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorY2xhc3MgU0hDaXJjdWxhckJ1ZmZlciB7CisKK3B1YmxpYzoKKyAgICBTSENpcmN1bGFyQnVmZmVyKCkgOiBtUmVhZEluZGV4KDApLCBtV3JpdGVJbmRleCgwKSwgbVJlYWRBdmFpbGFibGUoMCkgeworICAgIH0KKworICAgIGV4cGxpY2l0IFNIQ2lyY3VsYXJCdWZmZXIoc2l6ZV90IG1heFNpemUpIHsKKyAgICAgICAgcmVzaXplKG1heFNpemUpOworICAgIH0KKyAgICB2b2lkIHJlc2l6ZShzaXplX3QgbWF4U2l6ZSkgeworICAgICAgICBtQnVmZmVyLnJlc2l6ZShtYXhTaXplKTsKKyAgICAgICAgbVJlYWRJbmRleCA9IDA7CisgICAgICAgIG1Xcml0ZUluZGV4ID0gMDsKKyAgICAgICAgbVJlYWRBdmFpbGFibGUgPSAwOworICAgIH0KKyAgICBpbmxpbmUgdm9pZCB3cml0ZShUIHZhbHVlKSB7CisgICAgICAgIGlmIChhdmFpbGFibGVUb1dyaXRlKCkpIHsKKyAgICAgICAgICAgIG1CdWZmZXJbbVdyaXRlSW5kZXgrK10gPSB2YWx1ZTsKKyAgICAgICAgICAgIGlmIChtV3JpdGVJbmRleCA+PSBnZXRTaXplKCkpIHsKKyAgICAgICAgICAgICAgICBtV3JpdGVJbmRleCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUmVhZEF2YWlsYWJsZSsrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIkVycm9yOiBTSENpcmN1bGFyQnVmZmVyIG5vIHNwYWNlIHRvIHdyaXRlLiBhbGxvY2F0ZWQgc2l6ZSAlenUgIiwgZ2V0U2l6ZSgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpbmxpbmUgVCByZWFkKCkgeworICAgICAgICBUIHZhbHVlID0gVCgpOworICAgICAgICBpZiAoYXZhaWxhYmxlVG9SZWFkKCkpIHsKKyAgICAgICAgICAgIHZhbHVlID0gbUJ1ZmZlclttUmVhZEluZGV4KytdOworICAgICAgICAgICAgaWYgKG1SZWFkSW5kZXggPj0gZ2V0U2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgbVJlYWRJbmRleCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUmVhZEF2YWlsYWJsZS0tOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coIldhcm5pbmc6IFNIQ2lyY3VsYXJCdWZmZXIgbm8gZGF0YSBhdmFpbGFibGUgdG8gcmVhZC4gRGVmYXVsdCB2YWx1ZSByZXR1cm5lZCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisgICAgaW5saW5lIHNpemVfdCBhdmFpbGFibGVUb1JlYWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUmVhZEF2YWlsYWJsZTsKKyAgICB9CisgICAgaW5saW5lIHNpemVfdCBhdmFpbGFibGVUb1dyaXRlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gZ2V0U2l6ZSgpIC0gbVJlYWRBdmFpbGFibGU7CisgICAgfQorICAgIGlubGluZSBzaXplX3QgZ2V0U2l6ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1CdWZmZXIuc2l6ZSgpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnZlY3RvcjxUPiBtQnVmZmVyOworICAgIHNpemVfdCBtUmVhZEluZGV4OworICAgIHNpemVfdCBtV3JpdGVJbmRleDsKKyAgICBzaXplX3QgbVJlYWRBdmFpbGFibGU7Cit9OworCisKKyNlbmRpZiAvL1NIQ0lSQ1VMQVJCVUZGRVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmMgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuYwppbmRleCBjZDBlNzY1Li5jMWNlNTEzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuYwpAQCAtMjYxLDcgKzI2MSw2IEBACiAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZCA9IE5VTEw7CiAgICAgZWZmZWN0X2hhbmRsZV90IGl0ZmU7CiAgICAgZWZmZWN0X2VudHJ5X3QgKmZ4OwotICAgIGludCBmb3VuZCA9IDA7CiAgICAgaW50IHJldDsKIAogICAgIGlmICh1dWlkID09IE5VTEwgfHwgcEhhbmRsZSA9PSBOVUxMKSB7CkBAIC00MjgsOCArNDI3LDYgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogaW50IGluaXQoKSB7Ci0gICAgaW50IGhkbDsKLQogICAgIGlmIChnSW5pdERvbmUpIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQpAQCAtNTUyLDcgKzU0OSw2IEBACiAgICAgbGlzdF9lbGVtX3QgKmUgPSBnTGlicmFyeUxpc3Q7CiAgICAgbGliX2VudHJ5X3QgKmwgPSBOVUxMOwogICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmQgPSBOVUxMOwotICAgIGludCBmb3VuZCA9IDA7CiAgICAgaW50IHJldCA9IDA7CiAKICAgICBkcHJpbnRmKGZkLCAiTGlicmFyaWVzIGxvYWRlZDpcbiIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNYbWxDb25maWdMb2FkZXIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNYbWxDb25maWdMb2FkZXIuY3BwCmluZGV4IDQzOGI3ODcuLjdhN2Q0MzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzWG1sQ29uZmlnTG9hZGVyLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c1htbENvbmZpZ0xvYWRlci5jcHAKQEAgLTMyNyw3ICszMjcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnU2tpcHBlZEVmZmVjdHMsICZnU3ViRWZmZWN0TGlzdCk7CiAKICAgICBBTE9HRV9JRihyZXN1bHQubmJTa2lwcGVkRWxlbWVudCAhPSAwLCAiJXp1IGVycm9ycyBkdXJpbmcgbG9hZGluZyBvZiBjb25maWd1cmF0aW9uOiAlcyIsCi0gICAgICAgICAgICAgcmVzdWx0Lm5iU2tpcHBlZEVsZW1lbnQsIHBhdGggPzogZWZmZWN0c0NvbmZpZzo6REVGQVVMVF9QQVRIKTsKKyAgICAgICAgICAgICByZXN1bHQubmJTa2lwcGVkRWxlbWVudCwgcmVzdWx0LmNvbmZpZ1BhdGggPzogIk5vIGNvbmZpZyBmaWxlIGZvdW5kIik7CiAKICAgICByZXR1cm4gcmVzdWx0Lm5iU2tpcHBlZEVsZW1lbnQ7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29lZmZzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29lZmZzLmgKaW5kZXggZjMyZWQzMC4uNGVjYWYxNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvZWZmcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db2VmZnMuaApAQCAtNTM0LDI0NiArNTM0LDI0NiBAQAogCiAgLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDU1SHogKi8KICNkZWZpbmUgSFBGX0ZzODAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAgMC45NTg4NDlmCi0jZGVmaW5lIEhQRl9GczgwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgIC0xLjkxNzY5OGYKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjkxNzY5OGYpCiAjZGVmaW5lIEhQRl9GczgwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgIDAuOTU4ODQ5ZgotI2RlZmluZSBIUEZfRnM4MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAtMS45MzkwMDFmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgICgtMS45MzkwMDFmKQogI2RlZmluZSBIUEZfRnM4MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAwLjk0MDgwN2YKICNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NjY5MDlmCi0jZGVmaW5lIEhQRl9GczExMDI1X0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjkzMzgxOGYKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjkzMzgxOGYpCiAjZGVmaW5lIEhQRl9GczExMDI1X0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTY2OTA5ZgotI2RlZmluZSBIUEZfRnMxMTAyNV9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45NTU3MzJmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NTU3MzJmKQogI2RlZmluZSBIUEZfRnMxMTAyNV9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk1NjY5MGYKICNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45Njg2NTBmCi0jZGVmaW5lIEhQRl9GczEyMDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjkzNzMwMGYKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjkzNzMwMGYpCiAjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTY4NjUwZgotI2RlZmluZSBIUEZfRnMxMjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45NTkzMjdmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NTkzMjdmKQogI2RlZmluZSBIUEZfRnMxMjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk2MDEzOGYKICNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NzM1ODhmCi0jZGVmaW5lIEhQRl9GczE2MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk0NzE3NmYKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk0NzE3NmYpCiAjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTczNTg4ZgotI2RlZmluZSBIUEZfRnMxNjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45Njk0OTRmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45Njk0OTRmKQogI2RlZmluZSBIUEZfRnMxNjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk2OTk1MmYKICNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45Nzc2NzFmCi0jZGVmaW5lIEhQRl9GczIyMDUwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk1NTM0M2YKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk1NTM0M2YpCiAjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc3NjcxZgotI2RlZmluZSBIUEZfRnMyMjA1MF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45Nzc4NjNmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45Nzc4NjNmKQogI2RlZmluZSBIUEZfRnMyMjA1MF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk3ODEwNWYKICNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45Nzg1NTFmCi0jZGVmaW5lIEhQRl9GczI0MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk1NzEwMmYKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk1NzEwMmYpCiAjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc4NTUxZgotI2RlZmluZSBIUEZfRnMyNDAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45Nzk2NjJmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45Nzk2NjJmKQogI2RlZmluZSBIUEZfRnMyNDAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk3OTg2NmYKICNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODEwNDJmCi0jZGVmaW5lIEhQRl9GczMyMDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk2MjA4NGYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2MjA4NGYpCiAjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTgxMDQyZgotI2RlZmluZSBIUEZfRnMzMjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45ODQ3NDZmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45ODQ3NDZmKQogI2RlZmluZSBIUEZfRnMzMjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDg2MWYKICNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODMwOTdmCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk2NjE5NGYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2NjE5NGYpCiAjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTgzMDk3ZgotI2RlZmluZSBIUEZfRnM0NDEwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45ODg5MzFmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45ODg5MzFmKQogI2RlZmluZSBIUEZfRnM0NDEwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk4ODk5MmYKICNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODM1MzlmCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk2NzA3OWYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2NzA3OWYpCiAjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTgzNTM5ZgotI2RlZmluZSBIUEZfRnM0ODAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45ODk4MzFmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45ODk4MzFmKQogI2RlZmluZSBIUEZfRnM0ODAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk4OTg4MmYKIAogI2lmZGVmIEhJR0hFUl9GUwogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4NjA0MGYKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTcyMDgwZgorI2RlZmluZSBIUEZfRnM5NjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTcyMDgwZikKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODYwNDBmCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk5NDkxNWYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NDkxNWYpCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTk0OTI4ZgogCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTg3Mjk0ZgotI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAtMS45NzQ1ODhmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICgtMS45NzQ1ODhmKQogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NzI5NGYKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTk3NDU4ZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk3NDU4ZikKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTc0NjFmCiAjZW5kaWYKIAogCiAgLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDY2SHogKi8KICNkZWZpbmUgSFBGX0ZzODAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAgMC45NTMwMTZmCi0jZGVmaW5lIEhQRl9GczgwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgIC0xLjkwNjAzMmYKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjkwNjAzMmYpCiAjZGVmaW5lIEhQRl9GczgwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgIDAuOTUzMDE2ZgotI2RlZmluZSBIUEZfRnM4MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAtMS45MjY4MTBmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgICgtMS45MjY4MTBmKQogI2RlZmluZSBIUEZfRnM4MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAwLjkyOTM5NmYKICNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NjI2MzhmCi0jZGVmaW5lIEhQRl9GczExMDI1X0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjkyNTI3NWYKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjkyNTI3NWYpCiAjZGVmaW5lIEhQRl9GczExMDI1X0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTYyNjM4ZgotI2RlZmluZSBIUEZfRnMxMTAyNV9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45NDY4ODFmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NDY4ODFmKQogI2RlZmluZSBIUEZfRnMxMTAyNV9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk0ODI1NmYKICNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NjQ3MThmCi0jZGVmaW5lIEhQRl9GczEyMDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjkyOTQzNWYKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjkyOTQzNWYpCiAjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTY0NzE4ZgotI2RlZmluZSBIUEZfRnMxMjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45NTExOTZmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NTExOTZmKQogI2RlZmluZSBIUEZfRnMxMjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk1MjM1OWYKICNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NzA2MjJmCi0jZGVmaW5lIEhQRl9GczE2MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk0MTI0NGYKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk0MTI0NGYpCiAjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTcwNjIyZgotI2RlZmluZSBIUEZfRnMxNjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45NjMzOTRmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NjMzOTRmKQogI2RlZmluZSBIUEZfRnMxNjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk2NDA1MmYKICNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NzU1MDlmCi0jZGVmaW5lIEhQRl9GczIyMDUwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk1MTAxOWYKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk1MTAxOWYpCiAjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc1NTA5ZgotI2RlZmluZSBIUEZfRnMyMjA1MF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45NzM0MzZmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NzM0MzZmKQogI2RlZmluZSBIUEZfRnMyMjA1MF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk3Mzc4NGYKICNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NzY1NjNmCi0jZGVmaW5lIEhQRl9GczI0MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk1MzEyNWYKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk1MzEyNWYpCiAjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc2NTYzZgotI2RlZmluZSBIUEZfRnMyNDAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45NzU1OTRmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NzU1OTRmKQogI2RlZmluZSBIUEZfRnMyNDAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk3NTg4OWYKICNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45Nzk1NDdmCi0jZGVmaW5lIEhQRl9GczMyMDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk1OTA5M2YKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk1OTA5M2YpCiAjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc5NTQ3ZgotI2RlZmluZSBIUEZfRnMzMjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45ODE2OTVmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45ODE2OTVmKQogI2RlZmluZSBIUEZfRnMzMjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk4MTg2MWYKICNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODIwMTBmCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk2NDAxOWYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2NDAxOWYpCiAjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTgyMDEwZgotI2RlZmluZSBIUEZfRnM0NDEwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45ODY3MThmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45ODY3MThmKQogI2RlZmluZSBIUEZfRnM0NDEwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NjgwNWYKICNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODI1NDBmCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk2NTA3OWYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2NTA3OWYpCiAjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTgyNTQwZgotI2RlZmluZSBIUEZfRnM0ODAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45ODc3OTdmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45ODc3OTdmKQogI2RlZmluZSBIUEZfRnM0ODAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk4Nzg3MWYKIAogI2lmZGVmIEhJR0hFUl9GUwogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4NTUzOWYKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTcxMDc3ZgorI2RlZmluZSBIUEZfRnM5NjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTcxMDc3ZikKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODU1MzlmCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk5Mzg5OGYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5Mzg5OGYpCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTkzOTE3ZgogCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTg3MDQzZgotI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAtMS45NzQwODZmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICgtMS45NzQwODZmKQogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NzA0M2YKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTk2OTQ5ZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk2OTQ5ZikKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTY5NTRmCiAjZW5kaWYKIAogLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDc4SHogKi8KICNkZWZpbmUgSFBGX0ZzODAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAgMC45NDY2OTNmCi0jZGVmaW5lIEhQRl9GczgwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgIC0xLjg5MzM4N2YKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjg5MzM4N2YpCiAjZGVmaW5lIEhQRl9GczgwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgIDAuOTQ2NjkzZgotI2RlZmluZSBIUEZfRnM4MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgICAtMS45MTM1MTdmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgICgtMS45MTM1MTdmKQogI2RlZmluZSBIUEZfRnM4MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgICAwLjkxNzEwNWYKICNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NTc5OTlmCi0jZGVmaW5lIEhQRl9GczExMDI1X0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjkxNTk5OGYKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjkxNTk5OGYpCiAjZGVmaW5lIEhQRl9GczExMDI1X0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTU3OTk5ZgotI2RlZmluZSBIUEZfRnMxMTAyNV9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45MzcyMjlmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45MzcyMjlmKQogI2RlZmluZSBIUEZfRnMxMTAyNV9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjkzOTE0MGYKICNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NjA0NDZmCi0jZGVmaW5lIEhQRl9GczEyMDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjkyMDg5MmYKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjkyMDg5MmYpCiAjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTYwNDQ2ZgotI2RlZmluZSBIUEZfRnMxMjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45NDIzMjZmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NDIzMjZmKQogI2RlZmluZSBIUEZfRnMxMjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk0Mzk0NGYKICNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NjczOTdmCi0jZGVmaW5lIEhQRl9GczE2MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjkzNDc5NGYKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjkzNDc5NGYpCiAjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTY3Mzk3ZgotI2RlZmluZSBIUEZfRnMxNjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45NTY3NDBmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NTY3NDBmKQogI2RlZmluZSBIUEZfRnMxNjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk1NzY1NmYKICNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NzMxNTZmCi0jZGVmaW5lIEhQRl9GczIyMDUwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk0NjMxM2YKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk0NjMxM2YpCiAjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTczMTU2ZgotI2RlZmluZSBIUEZfRnMyMjA1MF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45Njg2MDdmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45Njg2MDdmKQogI2RlZmluZSBIUEZfRnMyMjA1MF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk2OTA5MmYKICNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NzQzOThmCi0jZGVmaW5lIEhQRl9GczI0MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk0ODc5N2YKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk0ODc5N2YpCiAjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc0Mzk4ZgotI2RlZmluZSBIUEZfRnMyNDAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45NzExNTdmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NzExNTdmKQogI2RlZmluZSBIUEZfRnMyNDAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk3MTU2OGYKICNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45Nzc5MThmCi0jZGVmaW5lIEhQRl9GczMyMDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk1NTgzNmYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk1NTgzNmYpCiAjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc3OTE4ZgotI2RlZmluZSBIUEZfRnMzMjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45NzgzNjdmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NzgzNjdmKQogI2RlZmluZSBIUEZfRnMzMjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk3ODU5OWYKICNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODA4MjRmCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk2MTY0OWYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2MTY0OWYpCiAjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTgwODI0ZgotI2RlZmluZSBIUEZfRnM0NDEwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45ODQzMDNmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45ODQzMDNmKQogI2RlZmluZSBIUEZfRnM0NDEwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDQyNWYKICNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODE0NTBmCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk2MjkwMGYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2MjkwMGYpCiAjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTgxNDUwZgotI2RlZmluZSBIUEZfRnM0ODAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45ODU1NzhmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45ODU1NzhmKQogI2RlZmluZSBIUEZfRnM0ODAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NTY4MWYKIAogI2lmZGVmIEhJR0hFUl9GUwogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDk5MmYKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTY5OTg0ZgorI2RlZmluZSBIUEZfRnM5NjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTY5OTg0ZikKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ5OTJmCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk5Mjc4OWYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5Mjc4OWYpCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTkyODE1ZgogCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTg2NzY5ZgotI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAtMS45NzM1MzlmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICgtMS45NzM1MzlmKQogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4Njc2OWYKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTk2Mzk0ZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk2Mzk0ZikKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTY0MDFmCiAjZW5kaWYKIAogLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDkwSHogKi8KICNkZWZpbmUgSFBGX0ZzODAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk0MDQxMmYKLSNkZWZpbmUgSFBGX0ZzODAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICAtMS44ODA4MjVmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjg4MDgyNWYpCiAjZGVmaW5lIEhQRl9GczgwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NDA0MTJmCi0jZGVmaW5lIEhQRl9GczgwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTAwMjMxZgorI2RlZmluZSBIUEZfRnM4MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45MDAyMzFmKQogI2RlZmluZSBIUEZfRnM4MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTA0OTc3ZgogI2RlZmluZSBIUEZfRnMxMTAyNV9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTUzMzgzZgotI2RlZmluZSBIUEZfRnMxMTAyNV9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIC0xLjkwNjc2NmYKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTA2NzY2ZikKICNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk1MzM4M2YKLSNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45Mjc1NzlmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjkyNzU3OWYpCiAjZGVmaW5lIEhQRl9GczExMDI1X0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45MzAxMTFmCiAjZGVmaW5lIEhQRl9GczEyMDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC45NTYxOTNmCi0jZGVmaW5lIEhQRl9GczEyMDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgLTEuOTEyMzg3ZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICgtMS45MTIzODdmKQogI2RlZmluZSBIUEZfRnMxMjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTU2MTkzZgotI2RlZmluZSBIUEZfRnMxMjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjkzMzQ1OWYKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTMzNDU5ZikKICNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjkzNTYwM2YKICNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk2NDE4M2YKLSNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAtMS45MjgzNjVmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjkyODM2NWYpCiAjZGVmaW5lIEhQRl9GczE2MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgMC45NjQxODNmCi0jZGVmaW5lIEhQRl9GczE2MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTUwMDg3ZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45NTAwODdmKQogI2RlZmluZSBIUEZfRnMxNjAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTUxMzAzZgogI2RlZmluZSBIUEZfRnMyMjA1MF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTcwODA5ZgotI2RlZmluZSBIUEZfRnMyMjA1MF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIC0xLjk0MTYxOGYKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTQxNjE4ZikKICNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk3MDgwOWYKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45NjM3NzhmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2Mzc3OGYpCiAjZGVmaW5lIEhQRl9GczIyMDUwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45NjQ0MjNmCiAjZGVmaW5lIEhQRl9GczI0MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC45NzIyMzlmCi0jZGVmaW5lIEhQRl9GczI0MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgLTEuOTQ0NDc3ZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICgtMS45NDQ0NzdmKQogI2RlZmluZSBIUEZfRnMyNDAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTcyMjM5ZgotI2RlZmluZSBIUEZfRnMyNDAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk2NjcyMWYKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTY2NzIxZikKICNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk2NzI2NmYKICNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk3NjI5MmYKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAtMS45NTI1ODRmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk1MjU4NGYpCiAjZGVmaW5lIEhQRl9GczMyMDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgMC45NzYyOTJmCi0jZGVmaW5lIEhQRl9GczMyMDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTc1MDQwZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45NzUwNDBmKQogI2RlZmluZSBIUEZfRnMzMjAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTc1MzQ3ZgogI2RlZmluZSBIUEZfRnM0NDEwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTc5NjQxZgotI2RlZmluZSBIUEZfRnM0NDEwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIC0xLjk1OTI4MmYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTU5MjgyZikKICNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk3OTY0MWYKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45ODE4ODhmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk4MTg4OGYpCiAjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45ODIwNTBmCiAjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODAzNjJmCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgLTEuOTYwNzI0ZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICgtMS45NjA3MjRmKQogI2RlZmluZSBIUEZfRnM0ODAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTgwMzYyZgotI2RlZmluZSBIUEZfRnM0ODAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk4MzM1OWYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTgzMzU5ZikKICNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk4MzQ5N2YKIAogI2lmZGVmIEhJR0hFUl9GUwogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDQ0NmYKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTY4ODkyZgorI2RlZmluZSBIUEZfRnM5NjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTY4ODkyZikKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ0NDZmCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk5MTY4MGYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5MTY4MGYpCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTkxNzE0ZgogCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTg2NDk2ZgotI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAtMS45NzI5OTJmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICgtMS45NzI5OTJmKQogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NjQ5NmYKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTk1ODQwZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk1ODQwZikKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTU4NDhmCiAjZW5kaWYKIApAQCAtNzg2LDI0NCArNzg2LDI0NCBAQAogLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDU1SHogKi8KICNkZWZpbmUgQlBGX0ZzODAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjAwOTE5N2YKICNkZWZpbmUgQlBGX0ZzODAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzODAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDkxOTdmCi0jZGVmaW5lIEJQRl9GczgwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTc5NTQ1ZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDkxOTdmKQorI2RlZmluZSBCUEZfRnM4MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45Nzk1NDVmKQogI2RlZmluZSBCUEZfRnM4MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTgxMzkzZgogI2RlZmluZSBCUEZfRnMxMTAyNV9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDA2NjkxZgogI2RlZmluZSBCUEZfRnMxMTAyNV9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMxMTAyNV9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAwNjY5MWYKLSNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45ODU0ODhmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwNjY5MWYpCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk4NTQ4OGYpCiAjZGVmaW5lIEJQRl9GczExMDI1X0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgMC45ODY0NjRmCiAjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDYxNTBmCiAjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczEyMDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDA2MTUwZgotI2RlZmluZSBCUEZfRnMxMjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk4NjczM2YKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMDA2MTUwZikKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTg2NzMzZikKICNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NzU1N2YKICNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwNDYyMGYKICNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMDQ2MjBmCi0jZGVmaW5lIEJQRl9GczE2MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTkwMTg5ZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDQ2MjBmKQorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTAxODlmKQogI2RlZmluZSBCUEZfRnMxNjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTkwNjUzZgogI2RlZmluZSBCUEZfRnMyMjA1MF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAzMzU3ZgogI2RlZmluZSBCUEZfRnMyMjA1MF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMyMjA1MF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMzM1N2YKLSNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45OTI5NjRmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMzM1N2YpCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5Mjk2NGYpCiAjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTMyMDlmCiAjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDMwODVmCiAjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczI0MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDAzMDg1ZgotI2RlZmluZSBCUEZfRnMyNDAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk5MzU1MmYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAzMDg1ZikKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTkzNTUyZikKICNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5Mzc1OWYKICNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwMjMxNWYKICNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMDIzMTVmCi0jZGVmaW5lIEJQRl9GczMyMDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTk1MTk5ZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDIzMTVmKQorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTUxOTlmKQogI2RlZmluZSBCUEZfRnMzMjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk1MzE2ZgogI2RlZmluZSBCUEZfRnM0NDEwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAxNjgxZgogI2RlZmluZSBCUEZfRnM0NDEwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnM0NDEwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMTY4MWYKLSNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45OTY1MzdmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMTY4MWYpCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NjUzN2YpCiAjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTY1OTlmCiAjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDE1NDVmCiAjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDAxNTQ1ZgotI2RlZmluZSBCUEZfRnM0ODAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk5NjgyM2YKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAxNTQ1ZikKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk2ODIzZikKICNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5Njg3NWYKIAogI2lmZGVmIEhJR0hFUl9GUwogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAwNzYyZgogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnM5NjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDc2MmYKLSNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45OTg0NjFmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDc2MmYpCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5ODQ2MWYpCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTg0NzdmCiAKICNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMDM4MWYKICNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMDAzODFmCi0jZGVmaW5lIEJQRl9GczE5MjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTk5MjM0ZgorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDAzODFmKQorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45OTkyMzRmKQogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTk5MjM4ZgogI2VuZGlmCiAKIC8qIENvZWZmaWNpZW50cyBmb3IgY2VudHJlIGZyZXF1ZW5jeSA2Nkh6ICovCiAjZGVmaW5lIEJQRl9GczgwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAxMjY0OGYKICNkZWZpbmUgQlBGX0ZzODAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnM4MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDEyNjQ4ZgotI2RlZmluZSBCUEZfRnM4MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTcxNzYwZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAxMjY0OGYpCisjZGVmaW5lIEJQRl9GczgwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTcxNzYwZikKICNkZWZpbmUgQlBGX0ZzODAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTc0NDEyZgogI2RlZmluZSBCUEZfRnMxMTAyNV9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDkyMDlmCiAjZGVmaW5lIEJQRl9GczExMDI1X0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwOTIwOWYKLSNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk3OTk2NmYKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDkyMDlmKQorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk3OTk2NmYpCiAjZGVmaW5lIEJQRl9GczExMDI1X0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAwLjk4MTM2OGYKICNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDA4NDY4ZgogI2RlZmluZSBCUEZfRnMxMjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczEyMDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMDg0NjhmCi0jZGVmaW5lIEJQRl9GczEyMDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAtMS45ODE2ODVmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDA4NDY4ZikKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45ODE2ODVmKQogI2RlZmluZSBCUEZfRnMxMjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45ODI4NjlmCiAjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwNjM2NGYKICNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMxNjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDA2MzY0ZgotI2RlZmluZSBCUEZfRnMxNjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTg2NDU3ZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwNjM2NGYpCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTg2NDU3ZikKICNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTg3MTI0ZgogI2RlZmluZSBCUEZfRnMyMjA1MF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDQ2MjZmCiAjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwNDYyNmYKLSNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk5MDI4OGYKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDQ2MjZmKQorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk5MDI4OGYpCiAjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5MDY0MWYKICNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDA0MjUyZgogI2RlZmluZSBCUEZfRnMyNDAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczI0MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMDQyNTJmCi0jZGVmaW5lIEJQRl9GczI0MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAtMS45OTExMDBmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDA0MjUyZikKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45OTExMDBmKQogI2RlZmluZSBCUEZfRnMyNDAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTEzOThmCiAjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMzE5MmYKICNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMzMjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDAzMTkyZgotI2RlZmluZSBCUEZfRnMzMjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTkzMzc0ZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMzE5MmYpCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTkzMzc0ZikKICNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTkzNTQxZgogI2RlZmluZSBCUEZfRnM0NDEwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDIzMThmCiAjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwMjMxOGYKLSNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk5NTIyMWYKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDIzMThmKQorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NTIyMWYpCiAjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5NTMwOWYKICNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAyMTMxZgogI2RlZmluZSBCUEZfRnM0ODAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMDIxMzFmCi0jZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAtMS45OTU2MTVmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDAyMTMxZikKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45OTU2MTVmKQogI2RlZmluZSBCUEZfRnM0ODAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTU2OTBmCiAKICNpZmRlZiBISUdIRVJfRlMKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAxMDU1ZgogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMDEwNTVmCi0jZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAtMS45OTc4NjhmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDAxMDU1ZikKKyNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45OTc4NjhmKQogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTc4OTFmCiAKICNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgIDAuMDAwNTI4ZgogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczE5MjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgIC0wLjAwMDUyOGYKLSNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgLTEuOTk4OTM5ZgorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAoLTAuMDAwNTI4ZikKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgKC0xLjk5ODkzOWYpCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAwLjk5ODk0NWYKICNlbmRpZgogCiAvKiBDb2VmZmljaWVudHMgZm9yIGNlbnRyZSBmcmVxdWVuY3kgNzhIeiAqLwogI2RlZmluZSBCUEZfRnM4MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMTg1NzJmCiAjZGVmaW5lIEJQRl9GczgwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzODAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAxODU3MmYKLSNkZWZpbmUgQlBGX0ZzODAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk1ODc0NWYKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMTg1NzJmKQorI2RlZmluZSBCUEZfRnM4MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk1ODc0NWYpCiAjZGVmaW5lIEJQRl9GczgwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk2MjQyN2YKICNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDEzNTQ1ZgogI2RlZmluZSBCUEZfRnMxMTAyNV9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczExMDI1X0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMTM1NDVmCi0jZGVmaW5lIEJQRl9GczExMDI1X0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAtMS45NzA2NDdmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDEzNTQ1ZikKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45NzA2NDdmKQogI2RlZmluZSBCUEZfRnMxMTAyNV9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgMC45NzI1OTZmCiAjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAwLjAxMjQ1OGYKICNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMxMjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDEyNDU4ZgotI2RlZmluZSBCUEZfRnMxMjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTczMTQ4ZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAxMjQ1OGYpCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTczMTQ4ZikKICNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTc0Nzk1ZgogI2RlZmluZSBCUEZfRnMxNjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDkzNzNmCiAjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwOTM3M2YKLSNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk4MDEwOGYKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDkzNzNmKQorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk4MDEwOGYpCiAjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAwLjk4MTAzN2YKICNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDA2ODE5ZgogI2RlZmluZSBCUEZfRnMyMjA1MF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczIyMDUwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMDY4MTlmCi0jZGVmaW5lIEJQRl9GczIyMDUwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAtMS45ODU3MTRmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDA2ODE5ZikKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45ODU3MTRmKQogI2RlZmluZSBCUEZfRnMyMjA1MF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgMC45ODYyMDRmCiAjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwNjI2OGYKICNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMyNDAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDA2MjY4ZgotI2RlZmluZSBCUEZfRnMyNDAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTg2OTA0ZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwNjI2OGYpCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTg2OTA0ZikKICNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTg3MzE4ZgogI2RlZmluZSBCUEZfRnMzMjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDQ3MDlmCiAjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwNDcwOWYKLSNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk5MDI0MGYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDQ3MDlmKQorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk5MDI0MGYpCiAjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5MDQ3M2YKICNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAzNDIxZgogI2RlZmluZSBCUEZfRnM0NDEwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMDM0MjFmCi0jZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAtMS45OTI5NTVmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDAzNDIxZikKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45OTI5NTVmKQogI2RlZmluZSBCUEZfRnM0NDEwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTMwNzhmCiAjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMzE0NGYKICNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnM0ODAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDAzMTQ0ZgotI2RlZmluZSBCUEZfRnM0ODAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTkzNTM1ZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMzE0NGYpCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTkzNTM1ZikKICNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTkzNjM5ZgogCiAjaWZkZWYgSElHSEVSX0ZTCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMTU1NWYKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnM5NjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAtMC4wMDE1NTU1ZgotI2RlZmluZSBCUEZfRnM5NjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAtMS45OTY4NjBmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICgtMC4wMDE1NTU1ZikKKyNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgKC0xLjk5Njg2MGYpCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5Njg5MWYKIAogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgMC4wMDA3NzhmCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgLTAuMDAwNzc4ZgotI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAtMS45OTg0MzdmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICgtMC4wMDA3NzhmKQorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAoLTEuOTk4NDM3ZikKICNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgIDAuOTk4NDQ0ZgogI2VuZGlmCiAKIC8qIENvZWZmaWNpZW50cyBmb3IgY2VudHJlIGZyZXF1ZW5jeSA5MEh6ICovCiAjZGVmaW5lIEJQRl9GczgwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4wMjI3NjBmCiAjZGVmaW5lIEJQRl9GczgwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczgwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAgLTAuMDIyNzYwZgotI2RlZmluZSBCUEZfRnM4MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk0OTA3M2YKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICAoLTAuMDIyNzYwZikKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTQ5MDczZikKICNkZWZpbmUgQlBGX0ZzODAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk1Mzk1M2YKICNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAxNjYxOWYKICNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMTY2MTlmCi0jZGVmaW5lIEJQRl9GczExMDI1X0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTYzNzkxZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMTY2MTlmKQorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45NjM3OTFmKQogI2RlZmluZSBCUEZfRnMxMTAyNV9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTY2Mzc3ZgogI2RlZmluZSBCUEZfRnMxMjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDE1Mjg5ZgogI2RlZmluZSBCUEZfRnMxMjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMxMjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAxNTI4OWYKLSNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45NjY4ODJmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAxNTI4OWYpCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2Njg4MmYpCiAjZGVmaW5lIEJQRl9GczEyMDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45NjkwNjdmCiAjZGVmaW5lIEJQRl9GczE2MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMTE1MTFmCiAjZGVmaW5lIEJQRl9GczE2MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczE2MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDExNTExZgotI2RlZmluZSBCUEZfRnMxNjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk3NTQ3N2YKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMDExNTExZikKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTc1NDc3ZikKICNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk3NjcxMWYKICNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwODM3OWYKICNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMDgzNzlmCi0jZGVmaW5lIEJQRl9GczIyMDUwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTgyMzk1ZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDgzNzlmKQorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45ODIzOTVmKQogI2RlZmluZSBCUEZfRnMyMjA1MF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTgzMDQ3ZgogI2RlZmluZSBCUEZfRnMyNDAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDA3NzA0ZgogI2RlZmluZSBCUEZfRnMyNDAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMyNDAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAwNzcwNGYKLSNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45ODM4NjNmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwNzcwNGYpCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk4Mzg2M2YpCiAjZGVmaW5lIEJQRl9GczI0MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45ODQ0MTRmCiAjZGVmaW5lIEJQRl9GczMyMDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDU3ODlmCiAjZGVmaW5lIEJQRl9GczMyMDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczMyMDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDA1Nzg5ZgotI2RlZmluZSBCUEZfRnMzMjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk4Nzk3N2YKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMDA1Nzg5ZikKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTg3OTc3ZikKICNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk4ODI4OGYKICNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwNDIwN2YKICNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMDQyMDdmCi0jZGVmaW5lIEJQRl9GczQ0MTAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTkxMzI0ZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDQyMDdmKQorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTEzMjRmKQogI2RlZmluZSBCUEZfRnM0NDEwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTkxNDg4ZgogI2RlZmluZSBCUEZfRnM0ODAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAzODY3ZgogI2RlZmluZSBCUEZfRnM0ODAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnM0ODAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMzg2N2YKLSNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45OTIwMzhmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMzg2N2YpCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5MjAzOGYpCiAjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTIxNzdmCiAKICNpZmRlZiBISUdIRVJfRlMKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwMTkxM2YKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwMTkxM2YKLSNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk5NjEzNGYKKyNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDE5MTNmKQorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NjEzNGYpCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTYxNzRmCiAKICNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMDk1OGYKICNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgIC0wLjAwMDk1OGYKLSNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgIC0xLjk5ODA3NWYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICgtMC4wMDA5NThmKQorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgKC0xLjk5ODA3NWYpCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgMC45OTgwODVmCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvZWZmcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvZWZmcy5oCmluZGV4IDM1MzU2MGMuLjhjMDQ4NDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db2VmZnMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29lZmZzLmgKQEAgLTY5LDU1ICs2OSw1NSBAQAogI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDcuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW43X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMzkwMTc3Ci0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAyMDE0NAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluN19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMDIwMTQ0KQogI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMwogI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluN19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDguMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNDc2MjE5Ci0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjEwNjE4NworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMTA2MTg3KQogI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMwogI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDkuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNTcyNzYxCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIwMjcyOAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjAyNzI4KQogI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMwogI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEwLjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjY4MTA4MgotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4zMTEwNDkKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjMxMTA0OSkKICNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNzAwMzMKICNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS44MDI2MjAKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjExX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNDMyNTg4CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC40MzI1ODgpCiAjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCiAjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTIuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuOTM4OTg5Ci0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjU2ODk1NgorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTY4OTU2KQogI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMwogI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEzLjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjA5MTk5NwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43MjE5NjQKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjcyMTk2NCkKICNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEzX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNzAwMzMKICNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEzX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4yNjM2NzQKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE0X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuODkzNjQxCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC44OTM2NDEpCiAjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCiAjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTUuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNDU2MzAwCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjA4NjI2NworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMDg2MjY3KQogI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMwogI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMApAQCAtMTQ4LDM0MiArMTQ4LDM0MiBAQAogI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDUuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW41X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjg0ODcwCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW41X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAxNjkyMQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMDE2OTIxKQogI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQogI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDYuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW42X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4zNjQyOTEKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wOTYzNDIKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMDk2MzQyKQogI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW42X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNjc5NDkKICNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDcuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW43X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNDUzNDAzCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjE4NTQ1NAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluN19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMTg1NDU0KQogI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQogI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluN19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDguMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNTUzMzg5Ci0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI4NTQ0MAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjg1NDQwKQogI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQogI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDkuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW45X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNjY1NTc0Ci0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjM5NzYyNQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMzk3NjI1KQogI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQogI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEwLjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjc5MTQ0OQotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41MjM0OTkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjUyMzQ5OSkKICNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNjc5NDkKICNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS45MzI2ODIKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjExX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNjY0NzMzCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC42NjQ3MzMpCiAjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5CiAjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTIuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMDkxMTQ4Ci0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjgyMzE5OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuODIzMTk5KQogI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQogI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEzLjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjI2ODk1MAotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4wMDEwMDEKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjAwMTAwMSkKICNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEzX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNjc5NDkKICNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEzX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMi40Njg0NDcKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE0X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMjAwNDk4CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS4yMDA0OTgpCiAjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5CiAjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTUuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNjkyMjg3Ci0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjQyNDMzOAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuNDI0MzM4KQogI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQogI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSAzMjAwMEh6ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wNjEwMDkKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDYxMDA5CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4wNjEwMDkpCiAjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAwMDAwKQogI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjEyOTQ2MwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMTI5NDYzCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4yX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMTI5NDYzKQogI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDAwMCkKICNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMy4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjA2MjY3Ci0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMDYyNjcKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yMDYyNjcpCiAjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4zX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4zX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAwMDAwKQogI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA0LjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjI5MjQ0NwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yOTI0NDcKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjI5MjQ0NykKICNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDAwMDApCiAjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW40X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNS4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4zODkxNDAKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMzg5MTQwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW41X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4zODkxNDApCiAjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW41X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW41X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAwMDAwKQogI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDYuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW42X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjQ5NzYzMQotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNDk3NjMxCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNDk3NjMxKQogI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDAwMCkKICNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNy4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjdfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNjE5MzYxCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC42MTkzNjEKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC42MTkzNjEpCiAjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW43X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAwMDAwKQogI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluN19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA4LjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS43NTU5NDMKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc1NTk0MworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc1NTk0MykKICNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW44X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjhfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDAwMDApCiAjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW44X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDkuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW45X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjkwOTE5MQotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuOTA5MTkxCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuOTA5MTkxKQogI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDAwMCkKICNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjA4MTEzOQotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMDgxMTM5CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMDgxMTM5KQogI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDAwMCkKICNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTEuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMjc0MDY3Ci0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjI3NDA2NworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMjc0MDY3KQogI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjExX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDAwMCkKICNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjExX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMi4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEyX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjQ5MDUzNgotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjQ5MDUzNgorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS40OTA1MzYpCiAjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEyX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEyX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAwMDAwKQogI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNzMzNDE4Ci0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjczMzQxOAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuNzMzNDE4KQogI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEzX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDAwMCkKICNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEzX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMy4wMDU5MzYKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE0X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTIuMDA1OTM2CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi4wMDU5MzYpCiAjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAwMDAwKQogI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMzExNzA3Ci0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTIuMzExNzA3CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjMxMTcwNykKICNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE1X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDAwMDApCiAjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKIC8qIENvZWZmaWNpZW50cyBmb3Igc2FtcGxlIHJhdGUgNDQxMDBIeiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMDc0MzY0Ci0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI5MzI1NworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjkzMjU3KQogI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMTg4OTQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjIxODg5NCkKICNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAyLjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjE1NzgwMQotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4zNzY2OTUKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjM3NjY5NSkKICNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjE4ODk0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4yX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yMTg4OTQpCiAjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4yX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMy4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjI1MTQyMAotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjQ3MDMxMworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC40NzAzMTMpCiAjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4zX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMTg4OTQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjE4ODk0KQogI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4zNTY0NjEKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTc1MzU1CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW40X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NzUzNTUpCiAjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW40X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIxODg5NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjE4ODk0KQogI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDUuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW41X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNDc0MzIwCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW41X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjY5MzIxMworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNjkzMjEzKQogI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMTg4OTQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjIxODg5NCkKICNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNjA2NTU5Ci0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuODI1NDUzCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjgyNTQ1MykKICNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIxODg5NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yMTg4OTQpCiAjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW42X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA3LjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluN19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNzU0OTM1Ci0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuOTczODI4CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjk3MzgyOCkKICNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjdfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIxODg5NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yMTg4OTQpCiAjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA4LjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjkyMTQxNAotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4xNDAzMDgKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjE0MDMwOCkKICNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjhfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjE4ODk0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW44X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yMTg4OTQpCiAjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW44X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOS4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjlfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4xMDgyMDgKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMzI3MTAxCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS4zMjcxMDEpCiAjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW45X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW45X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIxODg5NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjE4ODk0KQogI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEwLjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMzE3NzkzCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuNTM2Njg3CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjUzNjY4NykKICNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIxODg5NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yMTg4OTQpCiAjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjU1Mjk1MgotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjc3MTg0NgorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS43NzE4NDYpCiAjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjExX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMTg4OTQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjExX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjE4ODk0KQogI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTIuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi44MTY4MDUKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEyX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMi4wMzU2OTgKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEyX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuMDM1Njk4KQogI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjE4ODk0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjIxODg5NCkKICNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEyX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEzLjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLjExMjg1MgotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMi4zMzE3NDYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjMzMTc0NikKICNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEzX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjE4ODk0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yMTg4OTQpCiAjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTQuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMy40NDUwMjMKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE0X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMi42NjM5MTYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE0X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuNjYzOTE2KQogI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjE4ODk0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjIxODg5NCkKICNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE0X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuODE3NzI0Ci0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTMuMDM2NjE4CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0zLjAzNjYxOCkKICNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE1X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIxODg5NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yMTg4OTQpCiAjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKIC8qIENvZWZmaWNpZW50cyBmb3Igc2FtcGxlIHJhdGUgNDgwMDBIeiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjA3NzM1NwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMzQ1MzA2CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMzQ1MzA2KQogI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI2Nzk0OQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjI2Nzk0OSkKICNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMi4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTY0MTUyCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4yX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMC40MzIxMDEKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC40MzIxMDEpCiAjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4yX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4yX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjY3OTQ5KQogI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yNjE1MzgKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjUyOTQ4OAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjUyOTQ4OCkKICNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4zX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yNjc5NDkpCiAjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4zX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDQuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW40X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4zNzA4MDcKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC42Mzg3NTcKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNjM4NzU3KQogI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjI2Nzk0OSkKICNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDUuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW41X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS40OTM0MDkKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43NjEzNTkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzYxMzU5KQogI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW41X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW41X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjI2Nzk0OSkKICNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDYuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW42X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNjMwOTcxCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjg5ODkyMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuODk4OTIwKQogI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjI2Nzk0OSkKICNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA3LjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluN19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjc4NTMxOAotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluN19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4wNTMyNjcKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjA1MzI2NykKICNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjdfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjdfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yNjc5NDkpCiAjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOC4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjk1ODQ5OAotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjIyNjQ0NworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS4yMjY0NDcpCiAjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW44X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjhfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjhfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjY3OTQ5KQogI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOS4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjlfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMTUyODA5Ci0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMS40MjA3NTgKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS40MjA3NTgpCiAjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW45X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW45X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjY3OTQ5KQogI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMC4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEwX0EwICAgICAgICAgICAgICAgICAgICAgICAgIDIuMzcwODI5Ci0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAtMS42Mzg3NzgKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICgtMS42Mzg3NzgpCiAjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjY3OTQ5KQogI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjYxNTQ1MgotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjg4MzQwMQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS44ODM0MDEpCiAjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjExX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjExX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjY3OTQ5KQogI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTIuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi44ODk5MjQKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEyX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMi4xNTc4NzMKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEyX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuMTU3ODczKQogI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjI2Nzk0OSkKICNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEyX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEzLjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLjE5Nzg4NgotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMi40NjU4MzUKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjQ2NTgzNSkKICNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEzX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yNjc5NDkpCiAjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTQuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMy41NDM0MjUKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE0X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMi44MTEzNzQKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE0X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuODExMzc0KQogI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjI2Nzk0OSkKICNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE0X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgMy45MzExMjcKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE1X0ExICAgICAgICAgICAgICAgICAgICAgICAgIC0zLjE5OTA3NgorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgKC0zLjE5OTA3NikKICNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE1X0EyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yNjc5NDkpCiAjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogCiAjaWZkZWYgSElHSEVSX0ZTCkBAIC00OTEsMTg1ICs0OTEsMTg1IEBACiAvKiBDb2VmZmljaWVudHMgZm9yIHNhbXBsZSByYXRlIDk2MDAwSHogKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxLjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wOTYyMzMKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjY3MzU4MworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjY3MzU4MykKICNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NzczNTApCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjIwNDIwOAotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzgxNTU4CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4yX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzgxNTU4KQogI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjU3NzM1MAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU3NzM1MCkKICNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMy4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMzI1MzU4Ci0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMC45MDI3MDgKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC45MDI3MDgpCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4zX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTc3MzUwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4zX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTc3MzUwKQogI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA0LjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNDYxMjkxCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW40X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMDM4NjQxCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW40X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjAzODY0MSkKICNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjU3NzM1MAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NzczNTApCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW40X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA1LjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNjEzODEwCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW41X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMTkxMTYwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW41X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjE5MTE2MCkKICNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjU3NzM1MAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NzczNTApCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW41X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjc4NDkzOQotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4zNjIyODkKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjM2MjI4OSkKICNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTc3MzUwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW42X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NzczNTApCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW42X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA3LjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluN19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjk3Njk0OQotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluN19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS41NTQyOTkKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjU1NDI5OSkKICNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjdfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjdfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTc3MzUwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NzczNTApCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOC4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjE5MjM4NwotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjc2OTczOAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS43Njk3MzgpCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW44X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjhfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjhfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTc3MzUwKQogI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi40MzQxMTMKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0yLjAxMTQ2NAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjAxMTQ2NCkKICNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjlfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW45X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NzczNTApCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW45X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMC4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEwX0EwICAgICAgICAgICAgICAgICAgICAgICAgMi43MDUzMzUKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgLTIuMjgyNjg1CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICgtMi4yODI2ODUpCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTc3MzUwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTc3MzUwKQogI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAzLjAwOTY1MAotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0yLjU4NzAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi41ODcwMDApCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjExX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjExX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTc3MzUwKQogI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMzUxMDk3Ci0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTIuOTI4NDQ3CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjkyODQ0NykKICNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEyX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjU3NzM1MAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NzczNTApCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEzLjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLjczNDIwNwotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMy4zMTE1NTgKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0zLjMxMTU1OCkKICNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEzX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTc3MzUwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NzczNTApCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTQuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICA0LjE2NDA2NAotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgLTMuNzQxNDE0CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAoLTMuNzQxNDE0KQogI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTc3MzUwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU3NzM1MCkKICNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE0X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgNC42NDYzNzEKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE1X0ExICAgICAgICAgICAgICAgICAgICAgICAgIC00LjIyMzcyMQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgKC00LjIyMzcyMSkKICNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE1X0EyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NzczNTApCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogCiAvKiBDb2VmZmljaWVudHMgZm9yIHNhbXBsZSByYXRlIDE5MjAwMEh6ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xMDc4MjMKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMC44NzUxNTAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuODc1MTUwKQogI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc2NzMyNykKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAyLjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjI4ODAzCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuOTk2MTMwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjk5NjEzMCkKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4yX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc2NzMyNworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NjczMjcpCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDMuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4zNjQ1NDQKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4xMzE4NzEKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMTMxODcxKQogI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc2NzMyNykKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4zX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW40X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjUxNjg0OQotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjI4NDE3NgorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS4yODQxNzYpCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc2NzMyNworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzY3MzI3KQogI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNS4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW41X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS42ODc3MzcKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW41X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuNDU1MDY0CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS40NTUwNjQpCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc2NzMyNworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzY3MzI3KQogI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNi4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW42X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuODc5NDc3Ci0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS42NDY4MDQKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS42NDY4MDQpCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzY3MzI3KQogI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA3LjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjdfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4wOTQ2MTMKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjg2MTk0MAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjg2MTk0MCkKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW43X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43NjczMjcKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NjczMjcpCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluN19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOC4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4zMzU5OTkKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTIuMTAzMzI2CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi4xMDMzMjYpCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc2NzMyNworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjhfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzY3MzI3KQogI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjhfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOS4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW45X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjYwNjgzOQotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0yLjM3NDE2NgorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi4zNzQxNjYpCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW45X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43NjczMjcKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW45X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzY3MzI3KQogI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAyLjkxMDcyNgotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgLTIuNjc4MDUzCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAoLTIuNjc4MDUzKQogI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc2NzMyNykKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMy4yNTE2OTMKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTMuMDE5MDIwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMy4wMTkwMjApCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc2NzMyNworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjExX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzY3MzI3KQogI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjExX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMi4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMy42MzQyNjQKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTMuNDAxNTkxCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMy40MDE1OTEpCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc2NzMyNworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEyX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzY3MzI3KQogI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEyX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LjA2MzUxNgotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTMuODMwODQzCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTMuODMwODQzKQogI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc2NzMyNworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEzX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc2NzMyNykKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgNC41NDUxNDUKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTQuMzEyNDcyCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtNC4zMTI0NzIpCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc2NzMyNworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE0X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzY3MzI3KQogI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE0X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNS4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICA1LjA4NTU0MgotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE1X0ExICAgICAgICAgICAgICAgICAgICAgICAgIC00Ljg1Mjg2OAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICgtNC44NTI4NjgpCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAtMC43NjczMjcKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzY3MzI3KQogI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1R5cGVzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaAppbmRleCBjYjE1YjYwLi5lYTE2MDcyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaApAQCAtNDQsOSArNDQsNiBAQAogCiAjZGVmaW5lIExWTV9NQVhJTlRfOCAgICAgICAgICAgIDEyNyAgICAgICAgICAgICAgICAgLyogTWF4aW11bSBwb3NpdGl2ZSBpbnRlZ2VyIHNpemUgKi8KICNkZWZpbmUgTFZNX01BWElOVF8xNiAgICAgICAgICAgMzI3NjcKLSNpZmRlZiBCVUlMRF9GTE9BVAotI2RlZmluZSBMVk1fTUFYRkxPQVQgICAgICAgICAgICAxLjBmCi0jZW5kaWYKICNkZWZpbmUgTFZNX01BWElOVF8zMiAgICAgICAgICAgMjE0NzQ4MzY0NwogI2RlZmluZSBMVk1fTUFYRU5VTSAgICAgICAgICAgICAyMTQ3NDgzNjQ3CiAKQEAgLTk5LDggKzk2LDMyIEBACiB0eXBlZGVmICAgICB1aW50MzJfdCAgICAgICAgICAgIExWTV9VSU5UMzI7ICAgICAgICAgLyogVW5zaWduZWQgMzItYml0IHdvcmQgKi8KIAogI2lmZGVmIEJVSUxEX0ZMT0FUCi10eXBlZGVmICAgICBmbG9hdCAgICAgICAgICAgICAgIExWTV9GTE9BVDsgICAgICAgICAgLyogc2luZ2xlIHByZWNpc3Npb24gZmxvYXRpbmcgcG9pbnQqLwotI2VuZGlmCisKKyNkZWZpbmUgTFZNX01BWEZMT0FUICAgICAgICAgICAgMS5mCisKK3R5cGVkZWYgICAgIGZsb2F0ICAgICAgICAgICAgICAgTFZNX0ZMT0FUOyAgICAgICAgICAvKiBzaW5nbGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50ICovCisKKy8vIElmIE5BVElWRV9GTE9BVF9CVUZGRVIgaXMgZGVmaW5lZCwgd2UgZXhwb3NlIGVmZmVjdHMgYXMgZmxvYXRpbmcgcG9pbnQgZm9ybWF0OworLy8gb3RoZXJ3aXNlIHdlIGV4cG9zZSBhcyBpbnRlZ2VyIDE2IGJpdCBhbmQgdHJhbnNsYXRlIHRvIGZsb2F0IGZvciB0aGUgZWZmZWN0IGxpYnJhcmllcy4KKy8vIEhlbmNlLCBOQVRJVkVfRkxPQVRfQlVGRkVSIHNob3VsZCBvbmx5IGJlIGVuYWJsZWQgdW5kZXIgQlVJTERfRkxPQVQgY29tcGlsYXRpb24uCisKKyNkZWZpbmUgTkFUSVZFX0ZMT0FUX0JVRkZFUgorCisjZW5kaWYgLy8gQlVJTERfRkxPQVQKKworLy8gU2VsZWN0IHdoZXRoZXIgd2UgZXhwb3NlIGludDE2X3Qgb3IgZmxvYXQgYnVmZmVycy4KKyNpZmRlZiBOQVRJVkVfRkxPQVRfQlVGRkVSCisKKyNkZWZpbmUgICAgRUZGRUNUX0JVRkZFUl9GT1JNQVQgQVVESU9fRk9STUFUX1BDTV9GTE9BVAordHlwZWRlZiAgICAgZmxvYXQgICAgICAgICAgICAgICBlZmZlY3RfYnVmZmVyX3Q7CisKKyNlbHNlIC8vIE5BVElWRV9GTE9BVF9CVUZGRVIKKworI2RlZmluZSAgICBFRkZFQ1RfQlVGRkVSX0ZPUk1BVCBBVURJT19GT1JNQVRfUENNXzE2X0JJVAordHlwZWRlZiAgICAgaW50MTZfdCAgICAgICAgICAgICBlZmZlY3RfYnVmZmVyX3Q7CisKKyNlbmRpZiAvLyBOQVRJVkVfRkxPQVRfQlVGRkVSCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgU3RhbmRhcmQgRW51bWVyYXRlZCB0eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvZWZmcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29lZmZzLmgKaW5kZXggZjBkZWI2Yy4uNDJlYTQ2ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29lZmZzLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29lZmZzLmgKQEAgLTI2LDIxICsyNiwyMSBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZkZWYgQlVJTERfRkxPQVQKLSNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMTVfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjgyMjE3MmYKLSNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMTRfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjgwMDQ3NGYKLSNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMTNfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc3NjEyOGYKLSNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMTJfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc0ODgxMWYKLSNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMTFfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjcxODE2MmYKLSNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMTBfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjY4Mzc3MmYKLSNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnOV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjY0NTE4N2YKLSNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnOF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjYwMTg5M2YKLSNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnN19kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjU1MzMxNmYKLSNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnNl9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjQ5ODgxM2YKLSNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnNV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjQzNzY1OWYKLSNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnNF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjM2OTA0M2YKLSNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnM19kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI5MjA1NGYKLSNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMl9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIwNTY3MmYKLSNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjEwODc0OWYKKyNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMTVfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC44MjIxNzJmKQorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxNF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjgwMDQ3NGYpCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzEzX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzc2MTI4ZikKKyNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMTJfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDg4MTFmKQorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxMV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjcxODE2MmYpCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzEwX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNjgzNzcyZikKKyNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnOV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC42NDUxODdmKQorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWc4X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjYwMTg5M2YpCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzdfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTUzMzE2ZikKKyNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnNl9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC40OTg4MTNmKQorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWc1X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjQzNzY1OWYpCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzRfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMzY5MDQzZikKKyNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnM19kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yOTIwNTRmKQorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcyX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjIwNTY3MmYpCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzFfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMTA4NzQ5ZikKICNkZWZpbmUgTFZFUU5CX0dhaW5fMF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKICNkZWZpbmUgTFZFUU5CX0dhaW5fMV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjEyMjAxOGYKICNkZWZpbmUgTFZFUU5CX0dhaW5fMl9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI1ODkyNWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvbnRyb2wuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvbnRyb2wuYwppbmRleCBjMjkwYWVjLi43YjBmMzQxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db250cm9sLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29udHJvbC5jCkBAIC00MzAsNyArNDMwLDE1IEBACiAgICAgfQogCiAKLSAgICBpZihiQ2hhbmdlKXsKKyAgICAvLyBEdXJpbmcgb3BlcmF0aW5nIG1vZGUgdHJhbnNpdGlvbiwgdGhlcmUgaXMgYSByYWNlIGNvbmRpdGlvbiB3aGVyZSB0aGUgbW9kZQorICAgIC8vIGlzIHN0aWxsIExWRVFOQl9PTiwgYnV0IHRoZSBlZmZlY3QgaXMgY29uc2lkZXJlZCBkaXNhYmxlZCBpbiB0aGUgdXBwZXIgbGF5ZXJzLgorICAgIC8vIG1vZGVDaGFuZ2UgaGFuZGxlcyB0aGlzIHNwZWNpYWwgcmFjZSBjb25kaXRpb24uCisgICAgY29uc3QgaW50IC8qIGJvb2wgKi8gbW9kZUNoYW5nZSA9IHBQYXJhbXMtPk9wZXJhdGluZ01vZGUgIT0gT3BlcmF0aW5nTW9kZVNhdmUKKyAgICAgICAgICAgIHx8IChPcGVyYXRpbmdNb2RlU2F2ZSA9PSBMVkVRTkJfT04KKyAgICAgICAgICAgICAgICAgICAgJiYgcEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbgorICAgICAgICAgICAgICAgICAgICAmJiBMVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdKSA9PSAwKTsKKworICAgIGlmIChiQ2hhbmdlIHx8IG1vZGVDaGFuZ2UpIHsKIAogICAgICAgICAvKgogICAgICAgICAgKiBJZiB0aGUgc2FtcGxlIHJhdGUgaGFzIGNoYW5nZWQgY2xlYXIgdGhlIGhpc3RvcnkKQEAgLTQ2Miw4ICs0NzAsNyBAQAogICAgICAgICAgICAgTFZFUU5CX1NldENvZWZmaWNpZW50cyhwSW5zdGFuY2UpOyAgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KICAgICAgICAgfQogCi0gICAgICAgIGlmKHBQYXJhbXMtPk9wZXJhdGluZ01vZGUgIT0gT3BlcmF0aW5nTW9kZVNhdmUpCi0gICAgICAgIHsKKyAgICAgICAgaWYgKG1vZGVDaGFuZ2UpIHsKICAgICAgICAgICAgIGlmKHBQYXJhbXMtPk9wZXJhdGluZ01vZGUgPT0gTFZFUU5CX09OKQogICAgICAgICAgICAgewogI2lmZGVmIEJVSUxEX0ZMT0FUCkBAIC00NzksNiArNDg2LDggQEAKICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvKiBTdGF5IG9uIHRoZSBPTiBvcGVyYXRpbmcgbW9kZSB1bnRpbCB0aGUgdHJhbnNpdGlvbiBpcyBkb25lICovCisgICAgICAgICAgICAgICAgLy8gVGhpcyBtYXkgaW50cm9kdWNlIGEgc3RhdGUgcmFjZSBjb25kaXRpb24gaWYgdGhlIGVmZmVjdCBpcyBlbmFibGVkIGFnYWluCisgICAgICAgICAgICAgICAgLy8gd2hpbGUgaW4gdHJhbnNpdGlvbi4gIFRoaXMgaXMgZml4ZWQgaW4gdGhlIG1vZGVDaGFuZ2UgbG9naWMuCiAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSA9IExWRVFOQl9PTjsKICNpZmRlZiBCVUlMRF9GTE9BVAogICAgICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sIDAuMGYpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0hlYWRwaG9uZV9Db2VmZnMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19IZWFkcGhvbmVfQ29lZmZzLmgKaW5kZXggNGY1MjIxYS4uMGMyZmU1MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0hlYWRwaG9uZV9Db2VmZnMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSGVhZHBob25lX0NvZWZmcy5oCkBAIC0yNywxMjcgKzI3LDEyNyBAQAogI2lmZGVmIEJVSUxEX0ZMT0FUCiAvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciA4MDAwIEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2MTI1OCAqLwogI2RlZmluZSBDU19NSURETEVfODAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjI3NzIwCi0jZGVmaW5lIENTX01JRERMRV84MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMTUxMjUKKyNkZWZpbmUgQ1NfTUlERExFXzgwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yMTUxMjUpCiAjZGVmaW5lIENTX01JRERMRV84MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfTUlERExFXzgwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjkyMTg5OQorI2RlZmluZSBDU19NSURETEVfODAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjkyMTg5OSkKICNkZWZpbmUgQ1NfTUlERExFXzgwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogI2RlZmluZSBDU19NSURETEVfODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CiAjZGVmaW5lIENTX1NJREVfODAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC42MTE0NDEKLSNkZWZpbmUgQ1NfU0lERV84MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjM4MDM0NAotI2RlZmluZSBDU19TSURFXzgwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjMxMDk3Ci0jZGVmaW5lIENTX1NJREVfODAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC42MjI0NzAKLSNkZWZpbmUgQ1NfU0lERV84MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjEzMDc1OQorI2RlZmluZSBDU19TSURFXzgwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjM4MDM0NCkKKyNkZWZpbmUgQ1NfU0lERV84MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yMzEwOTcpCisjZGVmaW5lIENTX1NJREVfODAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNjIyNDcwKQorI2RlZmluZSBDU19TSURFXzgwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjEzMDc1OSkKICNkZWZpbmUgQ1NfU0lERV84MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgIDE1CiAKIC8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDExMDI1SHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTYyOTQzICovCiAjZGVmaW5lIENTX01JRERMRV8xMTAyNV9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4yMzA4MzgKLSNkZWZpbmUgQ1NfTUlERExFXzExMDI1X0ExICAgICAgICAgICAgICAgICAgICAgIC0wLjIyMTU1OQorI2RlZmluZSBDU19NSURETEVfMTEwMjVfQTEgICAgICAgICAgICAgICAgICAgICAgKC0wLjIyMTU1OSkKICNkZWZpbmUgQ1NfTUlERExFXzExMDI1X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19NSURETEVfMTEwMjVfQjEgICAgICAgICAgICAgICAgICAgICAgLTAuOTQzMDU2CisjZGVmaW5lIENTX01JRERMRV8xMTAyNV9CMSAgICAgICAgICAgICAgICAgICAgICAoLTAuOTQzMDU2KQogI2RlZmluZSBDU19NSURETEVfMTEwMjVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAjZGVmaW5lIENTX01JRERMRV8xMTAyNV9TQ0FMRSAgICAgICAgICAgICAgICAgICAgMTUKICNkZWZpbmUgQ1NfU0lERV8xMTAyNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAwLjU1NzM3MgotI2RlZmluZSBDU19TSURFXzExMDI1X0ExICAgICAgICAgICAgICAgICAgICAgICAgLTAuMzkxNDkwCi0jZGVmaW5lIENTX1NJREVfMTEwMjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAtMC4xNjU4ODEKLSNkZWZpbmUgQ1NfU0lERV8xMTAyNV9CMSAgICAgICAgICAgICAgICAgICAgICAgIC0wLjg4MDYwOAorI2RlZmluZSBDU19TSURFXzExMDI1X0ExICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjM5MTQ5MCkKKyNkZWZpbmUgQ1NfU0lERV8xMTAyNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICgtMC4xNjU4ODEpCisjZGVmaW5lIENTX1NJREVfMTEwMjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAoLTAuODgwNjA4KQogI2RlZmluZSBDU19TSURFXzExMDI1X0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDMyMzk3CiAjZGVmaW5lIENTX1NJREVfMTEwMjVfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgMTUKIAogLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgMTIwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjIxOTEgKi8KICNkZWZpbmUgQ1NfTUlERExFXzEyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgMC4yMjk5MzIKLSNkZWZpbmUgQ1NfTUlERExFXzEyMDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAtMC4yMjE0MzYKKyNkZWZpbmUgQ1NfTUlERExFXzEyMDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjIxNDM2KQogI2RlZmluZSBDU19NSURETEVfMTIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19NSURETEVfMTIwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgIC0wLjk0NzYxNgorI2RlZmluZSBDU19NSURETEVfMTIwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMC45NDc2MTYpCiAjZGVmaW5lIENTX01JRERMRV8xMjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAjZGVmaW5lIENTX01JRERMRV8xMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CiAjZGVmaW5lIENTX1NJREVfMTIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgMC41NTgzOTgKLSNkZWZpbmUgQ1NfU0lERV8xMjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgIC0wLjM5MjIxMQotI2RlZmluZSBDU19TSURFXzEyMDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgLTAuMTY2MTg3Ci0jZGVmaW5lIENTX1NJREVfMTIwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAtMC44OTI1NTAKKyNkZWZpbmUgQ1NfU0lERV8xMjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICgtMC4zOTIyMTEpCisjZGVmaW5lIENTX1NJREVfMTIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMTY2MTg3KQorI2RlZmluZSBDU19TSURFXzEyMDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjg5MjU1MCkKICNkZWZpbmUgQ1NfU0lERV8xMjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAzMjg1NgogI2RlZmluZSBDU19TSURFXzEyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAxNQogCiAvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciAxNjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2MjM3MSAqLwogI2RlZmluZSBDU19NSURETEVfMTYwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMjMwNjM4Ci0jZGVmaW5lIENTX01JRERMRV8xNjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAtMC4yMjQyMzIKKyNkZWZpbmUgQ1NfTUlERExFXzE2MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICgtMC4yMjQyMzIpCiAjZGVmaW5lIENTX01JRERMRV8xNjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfTUlERExFXzE2MDAwX0IxICAgICAgICAgICAgICAgICAgICAgIC0wLjk2MDU1MAorI2RlZmluZSBDU19NSURETEVfMTYwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0wLjk2MDU1MCkKICNkZWZpbmUgQ1NfTUlERExFXzE2MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogI2RlZmluZSBDU19NSURETEVfMTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQogI2RlZmluZSBDU19TSURFXzE2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgIDAuNDk5Njk1Ci0jZGVmaW5lIENTX1NJREVfMTYwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAtMC4zNTU1NDMKLSNkZWZpbmUgQ1NfU0lERV8xNjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgIC0wLjE0NDE1MgotI2RlZmluZSBDU19TSURFXzE2MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgLTEuMDUwNzg4CisjZGVmaW5lIENTX1NJREVfMTYwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMzU1NTQzKQorI2RlZmluZSBDU19TSURFXzE2MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjE0NDE1MikKKyNkZWZpbmUgQ1NfU0lERV8xNjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICgtMS4wNTA3ODgpCiAjZGVmaW5lIENTX1NJREVfMTYwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMC4xNDQxMDQKICNkZWZpbmUgQ1NfU0lERV8xNjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMTQKIAogLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgMjIwNTBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjA3ODEgKi8KICNkZWZpbmUgQ1NfTUlERExFXzIyMDUwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjIyODc0OQotI2RlZmluZSBDU19NSURETEVfMjIwNTBfQTEgICAgICAgICAgICAgICAgICAgICAgLTAuMjI0MTI4CisjZGVmaW5lIENTX01JRERMRV8yMjA1MF9BMSAgICAgICAgICAgICAgICAgICAgICAoLTAuMjI0MTI4KQogI2RlZmluZSBDU19NSURETEVfMjIwNTBfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX01JRERMRV8yMjA1MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMC45NzEyNjIKKyNkZWZpbmUgQ1NfTUlERExFXzIyMDUwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMC45NzEyNjIpCiAjZGVmaW5lIENTX01JRERMRV8yMjA1MF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICNkZWZpbmUgQ1NfTUlERExFXzIyMDUwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKICNkZWZpbmUgQ1NfU0lERV8yMjA1MF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMC40NDAxMTIKLSNkZWZpbmUgQ1NfU0lERV8yMjA1MF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjEwOTYKLSNkZWZpbmUgQ1NfU0lERV8yMjA1MF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAtMC4xNzkwMTYKLSNkZWZpbmUgQ1NfU0lERV8yMjA1MF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAtMS4xMTY3ODYKKyNkZWZpbmUgQ1NfU0lERV8yMjA1MF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjYxMDk2KQorI2RlZmluZSBDU19TSURFXzIyMDUwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4xNzkwMTYpCisjZGVmaW5lIENTX1NJREVfMjIwNTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjExNjc4NikKICNkZWZpbmUgQ1NfU0lERV8yMjA1MF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xODI1MDcKICNkZWZpbmUgQ1NfU0lERV8yMjA1MF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMTQKIAogLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgMjQwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjE4ODIgKi8KICNkZWZpbmUgQ1NfTUlERExFXzI0MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjMwMzk1Ci0jZGVmaW5lIENTX01JRERMRV8yNDAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIyNjExNworI2RlZmluZSBDU19NSURETEVfMjQwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjI2MTE3KQogI2RlZmluZSBDU19NSURETEVfMjQwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfTUlERExFXzI0MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgLTAuOTczNTczCisjZGVmaW5lIENTX01JRERMRV8yNDAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICgtMC45NzM1NzMpCiAjZGVmaW5lIENTX01JRERMRV8yNDAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogI2RlZmluZSBDU19NSURETEVfMjQwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQogI2RlZmluZSBDU19TSURFXzI0MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMC40MTQ3NzAKLSNkZWZpbmUgQ1NfU0lERV8yNDAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjg3MTgyCi0jZGVmaW5lIENTX1NJREVfMjQwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjEyNzU4OAotI2RlZmluZSBDU19TSURFXzI0MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4yMjk2NDgKKyNkZWZpbmUgQ1NfU0lERV8yNDAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjI4NzE4MikKKyNkZWZpbmUgQ1NfU0lERV8yNDAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjEyNzU4OCkKKyNkZWZpbmUgQ1NfU0lERV8yNDAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjIyOTY0OCkKICNkZWZpbmUgQ1NfU0lERV8yNDAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjgyMTc3CiAjZGVmaW5lIENTX1NJREVfMjQwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDE0CiAKIC8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDMyMDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTYwMzIyICovCiAjZGVmaW5lIENTX01JRERMRV8zMjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yMjg0MDAKLSNkZWZpbmUgQ1NfTUlERExFXzMyMDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIyNTIxNAorI2RlZmluZSBDU19NSURETEVfMzIwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjIyNTIxNCkKICNkZWZpbmUgQ1NfTUlERExFXzMyMDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19NSURETEVfMzIwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgLTAuOTgwMTI2CisjZGVmaW5lIENTX01JRERMRV8zMjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuOTgwMTI2KQogI2RlZmluZSBDU19NSURETEVfMzIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAjZGVmaW5lIENTX01JRERMRV8zMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CiAjZGVmaW5lIENTX1NJREVfMzIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNjQ1NzkKLSNkZWZpbmUgQ1NfU0lERV8zMjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIwNzM1NQotI2RlZmluZSBDU19TSURFXzMyMDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMTU3MjI0Ci0jZGVmaW5lIENTX1NJREVfMzIwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4yNzQyMzEKKyNkZWZpbmUgQ1NfU0lERV8zMjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yMDczNTUpCisjZGVmaW5lIENTX1NJREVfMzIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMTU3MjI0KQorI2RlZmluZSBDU19TSURFXzMyMDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjI3NDIzMSkKICNkZWZpbmUgQ1NfU0lERV8zMjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjMxMjQ5NQogI2RlZmluZSBDU19TSURFXzMyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAxNAogCiAvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciA0NDEwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2MzgzNCAqLwogI2RlZmluZSBDU19NSURETEVfNDQxMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjIzMzU5MwotI2RlZmluZSBDU19NSURETEVfNDQxMDBfQTEgICAgICAgICAgICAgICAgICAgIC0wLjIzMTIyNQorI2RlZmluZSBDU19NSURETEVfNDQxMDBfQTEgICAgICAgICAgICAgICAgICAgICgtMC4yMzEyMjUpCiAjZGVmaW5lIENTX01JRERMRV80NDEwMF9BMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX01JRERMRV80NDEwMF9CMSAgICAgICAgICAgICAgICAgICAgLTAuOTg1NTQ1CisjZGVmaW5lIENTX01JRERMRV80NDEwMF9CMSAgICAgICAgICAgICAgICAgICAgKC0wLjk4NTU0NSkKICNkZWZpbmUgQ1NfTUlERExFXzQ0MTAwX0IyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICNkZWZpbmUgQ1NfTUlERExFXzQ0MTAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKICNkZWZpbmUgQ1NfU0lERV80NDEwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4yODQ1NzMKLSNkZWZpbmUgQ1NfU0lERV80NDEwMF9BMSAgICAgICAgICAgICAgICAgICAgICAtMC4yNTg5MTAKLSNkZWZpbmUgQ1NfU0lERV80NDEwMF9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMjU2NjIKLSNkZWZpbmUgQ1NfU0lERV80NDEwMF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS41NzIyNDgKKyNkZWZpbmUgQ1NfU0lERV80NDEwMF9BMSAgICAgICAgICAgICAgICAgICAgICAoLTAuMjU4OTEwKQorI2RlZmluZSBDU19TSURFXzQ0MTAwX0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMjU2NjIpCisjZGVmaW5lIENTX1NJREVfNDQxMDBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjU3MjI0OCkKICNkZWZpbmUgQ1NfU0lERV80NDEwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC41ODgzOTkKICNkZWZpbmUgQ1NfU0lERV80NDEwMF9TQ0FMRSAgICAgICAgICAgICAgICAgIDE0CiAKIC8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDQ4MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTY0NDAyICovCiAjZGVmaW5lIENTX01JRERMRV80ODAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMjM0NDQ1Ci0jZGVmaW5lIENTX01JRERMRV80ODAwMF9BMSAgICAgICAgICAgICAgICAgICAgLTAuMjMyMjYxCisjZGVmaW5lIENTX01JRERMRV80ODAwMF9BMSAgICAgICAgICAgICAgICAgICAgKC0wLjIzMjI2MSkKICNkZWZpbmUgQ1NfTUlERExFXzQ4MDAwX0EyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfTUlERExFXzQ4MDAwX0IxICAgICAgICAgICAgICAgICAgICAtMC45ODY3MTMKKyNkZWZpbmUgQ1NfTUlERExFXzQ4MDAwX0IxICAgICAgICAgICAgICAgICAgICAoLTAuOTg2NzEzKQogI2RlZmluZSBDU19NSURETEVfNDgwMDBfQjIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogI2RlZmluZSBDU19NSURETEVfNDgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQogI2RlZmluZSBDU19TSURFXzQ4MDAwX0EwICAgICAgICAgICAgICAgICAgICAgMC4yNzI2MDYKLSNkZWZpbmUgQ1NfU0lERV80ODAwMF9BMSAgICAgICAgICAgICAgICAgICAgLTAuMjY2OTUyCi0jZGVmaW5lIENTX1NJREVfNDgwMDBfQTIgICAgICAgICAgICAgICAgICAgIC0wLjAwNTY1NAotI2RlZmluZSBDU19TSURFXzQ4MDAwX0IxICAgICAgICAgICAgICAgICAgICAtMS42MTcxNDEKKyNkZWZpbmUgQ1NfU0lERV80ODAwMF9BMSAgICAgICAgICAgICAgICAgICAgKC0wLjI2Njk1MikKKyNkZWZpbmUgQ1NfU0lERV80ODAwMF9BMiAgICAgICAgICAgICAgICAgICAgKC0wLjAwNTY1NCkKKyNkZWZpbmUgQ1NfU0lERV80ODAwMF9CMSAgICAgICAgICAgICAgICAgICAgKC0xLjYxNzE0MSkKICNkZWZpbmUgQ1NfU0lERV80ODAwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuNjMwNDA1CiAjZGVmaW5lIENTX1NJREVfNDgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDE0CiAKQEAgLTE1NSwzMSArMTU1LDMxIEBACiAvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciA5NjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAgMC4xNjUqLwogLyogaGlnaCBwYXNzIGZpbHRlciB3aXRoIGN1dG9mZiBmcmVxdWVuY3kgMTAyLjE4IEh6Ki8KICNkZWZpbmUgQ1NfTUlERExFXzk2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgMC4yMzU1MzIKLSNkZWZpbmUgQ1NfTUlERExFXzk2MDAwX0ExICAgICAgICAgICAgICAgICAgICAtMC4yMzQ0MzIKKyNkZWZpbmUgQ1NfTUlERExFXzk2MDAwX0ExICAgICAgICAgICAgICAgICAgICAoLTAuMjM0NDMyKQogI2RlZmluZSBDU19NSURETEVfOTYwMDBfQTIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19NSURETEVfOTYwMDBfQjEgICAgICAgICAgICAgICAgICAgIC0wLjk5MzMzNAorI2RlZmluZSBDU19NSURETEVfOTYwMDBfQjEgICAgICAgICAgICAgICAgICAgICgtMC45OTMzMzQpCiAjZGVmaW5lIENTX01JRERMRV85NjAwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAjZGVmaW5lIENTX01JRERMRV85NjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CiAvKiBiYW5kcGFzcyBmaWx0ZXIgd2l0aCBmYzEgMjcwIGFuZCBmYzIgMzcwMywgZGVzaWduZWQgdXNpbmcgMm5kIG9yZGVyIGJ1dHRlcndvcnRoICovCiAjZGVmaW5lIENTX1NJREVfOTYwMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjAxNjcyNwogI2RlZmluZSBDU19TSURFXzk2MDAwX0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfU0lERV85NjAwMF9BMiAgICAgICAgICAgICAgICAgICAgLTAuMDE2NzI3Ci0jZGVmaW5lIENTX1NJREVfOTYwMDBfQjEgICAgICAgICAgICAgICAgICAgIC0xLjc5MzM3MgorI2RlZmluZSBDU19TSURFXzk2MDAwX0EyICAgICAgICAgICAgICAgICAgICAoLTAuMDE2NzI3KQorI2RlZmluZSBDU19TSURFXzk2MDAwX0IxICAgICAgICAgICAgICAgICAgICAoLTEuNzkzMzcyKQogI2RlZmluZSBDU19TSURFXzk2MDAwX0IyICAgICAgICAgICAgICAgICAgICAgMC43OTcyMzYKICNkZWZpbmUgQ1NfU0lERV85NjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE0CiAKIC8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDE5MjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAgMC4xNjg5Ki8KICNkZWZpbmUgQ1NfTUlERExFXzE5MjAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMjQxMjE5Ci0jZGVmaW5lIENTX01JRERMRV8xOTIwMDBfQTEgICAgICAgICAgICAgICAgICAgIC0wLjI0MDY1NgorI2RlZmluZSBDU19NSURETEVfMTkyMDAwX0ExICAgICAgICAgICAgICAgICAgICAoLTAuMjQwNjU2KQogI2RlZmluZSBDU19NSURETEVfMTkyMDAwX0EyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfTUlERExFXzE5MjAwMF9CMSAgICAgICAgICAgICAgICAgICAgLTAuOTk2NjYxCisjZGVmaW5lIENTX01JRERMRV8xOTIwMDBfQjEgICAgICAgICAgICAgICAgICAgICgtMC45OTY2NjEpCiAjZGVmaW5lIENTX01JRERMRV8xOTIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogI2RlZmluZSBDU19NSURETEVfMTkyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKIC8qIGJhbmRwYXNzIGZpbHRlciB3aXRoIGZjMSAyNzAgYW5kIGZjMiAzNzAzLCBkZXNpZ25lZCB1c2luZyAybmQgb3JkZXIgYnV0dGVyd29ydGggKi8KICNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwODk5MQotI2RlZmluZSBDU19TSURFXzE5MjAwMF9BMSAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDAwCi0jZGVmaW5lIENTX1NJREVfMTkyMDAwX0EyICAgICAgICAgICAgICAgICAgICAtMC4wMDg5OTEKLSNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQjEgICAgICAgICAgICAgICAgICAgIC0xLjg5MjUwOQorI2RlZmluZSBDU19TSURFXzE5MjAwMF9BMSAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDAwMCkKKyNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQTIgICAgICAgICAgICAgICAgICAgICgtMC4wMDg5OTEpCisjZGVmaW5lIENTX1NJREVfMTkyMDAwX0IxICAgICAgICAgICAgICAgICAgICAoLTEuODkyNTA5KQogI2RlZmluZSBDU19TSURFXzE5MjAwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuODkzNTI0CiAjZGVmaW5lIENTX1NJREVfMTkyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAxNAogI2VuZGlmCkBAIC0yMDMsNzQgKzIwMyw3NCBAQAogCiAvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciA4MDAwIEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLwogI2RlZmluZSBDU19SRVZFUkJfODAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMC42NjcyNzEKLSNkZWZpbmUgQ1NfUkVWRVJCXzgwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNjY3MjcxCisjZGVmaW5lIENTX1JFVkVSQl84MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICgtMC42NjcyNzEpCiAjZGVmaW5lIENTX1JFVkVSQl84MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19SRVZFUkJfODAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAtMC42NjgxNzkKKyNkZWZpbmUgQ1NfUkVWRVJCXzgwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjY2ODE3OSkKICNkZWZpbmUgQ1NfUkVWRVJCXzgwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAjZGVmaW5lIENTX1JFVkVSQl84MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgIDE1CiAKIC8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDExMDI1SHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCiAjZGVmaW5lIENTX1JFVkVSQl8xMTAyNV9BMCAgICAgICAgICAgICAgICAgICAgIDAuNjk5NjM4Ci0jZGVmaW5lIENTX1JFVkVSQl8xMTAyNV9BMSAgICAgICAgICAgICAgICAgICAgLTAuNjk5NjM4CisjZGVmaW5lIENTX1JFVkVSQl8xMTAyNV9BMSAgICAgICAgICAgICAgICAgICAgKC0wLjY5OTYzOCkKICNkZWZpbmUgQ1NfUkVWRVJCXzExMDI1X0EyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfUkVWRVJCXzExMDI1X0IxICAgICAgICAgICAgICAgICAgICAtMC43NDkwOTYKKyNkZWZpbmUgQ1NfUkVWRVJCXzExMDI1X0IxICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2KQogI2RlZmluZSBDU19SRVZFUkJfMTEwMjVfQjIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogI2RlZmluZSBDU19SRVZFUkJfMTEwMjVfU0NBTEUgICAgICAgICAgICAgICAgICAxNQogCiAvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciAxMjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLwogI2RlZmluZSBDU19SRVZFUkJfMTIwMDBfQTAgICAgICAgICAgICAgICAgICAgMC43MDY5MzEKLSNkZWZpbmUgQ1NfUkVWRVJCXzEyMDAwX0ExICAgICAgICAgICAgICAgICAgLTAuNzA2OTMxCisjZGVmaW5lIENTX1JFVkVSQl8xMjAwMF9BMSAgICAgICAgICAgICAgICAgICgtMC43MDY5MzEpCiAjZGVmaW5lIENTX1JFVkVSQl8xMjAwMF9BMiAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19SRVZFUkJfMTIwMDBfQjEgICAgICAgICAgICAgICAgICAtMC43NjczMjcKKyNkZWZpbmUgQ1NfUkVWRVJCXzEyMDAwX0IxICAgICAgICAgICAgICAgICAgKC0wLjc2NzMyNykKICNkZWZpbmUgQ1NfUkVWRVJCXzEyMDAwX0IyICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAjZGVmaW5lIENTX1JFVkVSQl8xMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAxNQogCiAvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciAxNjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLwogI2RlZmluZSBDU19SRVZFUkJfMTYwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgMC43MjgyNzIKLSNkZWZpbmUgQ1NfUkVWRVJCXzE2MDAwX0ExICAgICAgICAgICAgICAgICAgICAgLTAuNzI4MjcyCisjZGVmaW5lIENTX1JFVkVSQl8xNjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICgtMC43MjgyNzIpCiAjZGVmaW5lIENTX1JFVkVSQl8xNjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19SRVZFUkJfMTYwMDBfQjEgICAgICAgICAgICAgICAgICAgICAtMC44MjA2NzkKKyNkZWZpbmUgQ1NfUkVWRVJCXzE2MDAwX0IxICAgICAgICAgICAgICAgICAgICAgKC0wLjgyMDY3OSkKICNkZWZpbmUgQ1NfUkVWRVJCXzE2MDAwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAjZGVmaW5lIENTX1JFVkVSQl8xNjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CiAKIC8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDIyMDUwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCiAjZGVmaW5lIENTX1JFVkVSQl8yMjA1MF9BMCAgICAgICAgICAgICAgICAgICAgIDAuNTE2Mzk2CiAjZGVmaW5lIENTX1JFVkVSQl8yMjA1MF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX1JFVkVSQl8yMjA1MF9BMiAgICAgICAgICAgICAgICAgICAgLTAuNTE2Mzk2Ci0jZGVmaW5lIENTX1JFVkVSQl8yMjA1MF9CMSAgICAgICAgICAgICAgICAgICAgLTAuNTE4NTEyCi0jZGVmaW5lIENTX1JFVkVSQl8yMjA1MF9CMiAgICAgICAgICAgICAgICAgICAgLTAuMjkwOTkwCisjZGVmaW5lIENTX1JFVkVSQl8yMjA1MF9BMiAgICAgICAgICAgICAgICAgICAgKC0wLjUxNjM5NikKKyNkZWZpbmUgQ1NfUkVWRVJCXzIyMDUwX0IxICAgICAgICAgICAgICAgICAgICAoLTAuNTE4NTEyKQorI2RlZmluZSBDU19SRVZFUkJfMjIwNTBfQjIgICAgICAgICAgICAgICAgICAgICgtMC4yOTA5OTApCiAjZGVmaW5lIENTX1JFVkVSQl8yMjA1MF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CiAKIAogLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgMjQwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMS4wMzgwMzAgKi8KICNkZWZpbmUgQ1NfUkVWRVJCXzI0MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjQ3OTU2NQogI2RlZmluZSBDU19SRVZFUkJfMjQwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX1JFVkVSQl8yNDAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAtMC40Nzk1NjUKLSNkZWZpbmUgQ1NfUkVWRVJCXzI0MDAwX0IxICAgICAgICAgICAgICAgICAgICAgIC0wLjYzNzc0NQotI2RlZmluZSBDU19SRVZFUkJfMjQwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgLTAuMTk4OTEyCisjZGVmaW5lIENTX1JFVkVSQl8yNDAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuNDc5NTY1KQorI2RlZmluZSBDU19SRVZFUkJfMjQwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0wLjYzNzc0NSkKKyNkZWZpbmUgQ1NfUkVWRVJCXzI0MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICgtMC4xOTg5MTIpCiAjZGVmaW5lIENTX1JFVkVSQl8yNDAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CiAKIC8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDMyMDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCiAjZGVmaW5lIENTX1JFVkVSQl8zMjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjM4MDM0OQogI2RlZmluZSBDU19SRVZFUkJfMzIwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfUkVWRVJCXzMyMDAwX0EyICAgICAgICAgICAgICAgICAgICAgLTAuMzgwMzQ5Ci0jZGVmaW5lIENTX1JFVkVSQl8zMjAwMF9CMSAgICAgICAgICAgICAgICAgICAgIC0wLjk1MDg3MworI2RlZmluZSBDU19SRVZFUkJfMzIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMzgwMzQ5KQorI2RlZmluZSBDU19SRVZFUkJfMzIwMDBfQjEgICAgICAgICAgICAgICAgICAgICAoLTAuOTUwODczKQogI2RlZmluZSBDU19SRVZFUkJfMzIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgMC4wNDkxMjcKICNkZWZpbmUgQ1NfUkVWRVJCXzMyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKIAogLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgNDQxMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMS4wMzgwMzAgKi8KICNkZWZpbmUgQ1NfUkVWRVJCXzQ0MTAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjk3Mzg5CiAjZGVmaW5lIENTX1JFVkVSQl80NDEwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19SRVZFUkJfNDQxMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAtMC4yOTczODkKLSNkZWZpbmUgQ1NfUkVWRVJCXzQ0MTAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgLTEuMjAwNDIzCisjZGVmaW5lIENTX1JFVkVSQl80NDEwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yOTczODkpCisjZGVmaW5lIENTX1JFVkVSQl80NDEwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICgtMS4yMDA0MjMpCiAjZGVmaW5lIENTX1JFVkVSQl80NDEwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjI1NjUyOQogI2RlZmluZSBDU19SRVZFUkJfNDQxMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNAogCiAvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciA0ODAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLwogI2RlZmluZSBDU19SRVZFUkJfNDgwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMjc4NjYxCiAjZGVmaW5lIENTX1JFVkVSQl80ODAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfUkVWRVJCXzQ4MDAwX0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjI3ODY2MQotI2RlZmluZSBDU19SRVZFUkJfNDgwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuMjU0OTkzCisjZGVmaW5lIENTX1JFVkVSQl80ODAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMjc4NjYxKQorI2RlZmluZSBDU19SRVZFUkJfNDgwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjI1NDk5MykKICNkZWZpbmUgQ1NfUkVWRVJCXzQ4MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjMwMzM0NwogI2RlZmluZSBDU19SRVZFUkJfNDgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNAogCkBAIC0yNzksOCArMjc5LDggQEAKIC8qIEJhbmQgcGFzcyBmaWx0ZXIgd2l0aCBmYzE9NTAwIGFuZCBmYzI9ODAwMCovCiAjZGVmaW5lIENTX1JFVkVSQl85NjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4xNjAyNDg4CiAjZGVmaW5lIENTX1JFVkVSQl85NjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjE2MDI0ODgKLSNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjU4NTQxMworI2RlZmluZSBDU19SRVZFUkJfOTYwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjE2MDI0ODgpCisjZGVmaW5lIENTX1JFVkVSQl85NjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuNTg1NDEzKQogI2RlZmluZSBDU19SRVZFUkJfOTYwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuNTk5Mzc3CiAjZGVmaW5lIENTX1JFVkVSQl85NjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE0CiAKQEAgLTI4OCw4ICsyODgsOCBAQAogLyogQmFuZCBwYXNzIGZpbHRlciB3aXRoIGZjMT01MDAgYW5kIGZjMj04MDAwKi8KICNkZWZpbmUgQ1NfUkVWRVJCXzE5MjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4wODc4MzY5CiAjZGVmaW5lIENTX1JFVkVSQl8xOTIwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX1JFVkVSQl8xOTIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDg3ODM2OQotI2RlZmluZSBDU19SRVZFUkJfMTkyMDAwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjc3NjU3NjQKKyNkZWZpbmUgQ1NfUkVWRVJCXzE5MjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMDg3ODM2OSkKKyNkZWZpbmUgQ1NfUkVWRVJCXzE5MjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuNzc2NTc2NCkKICNkZWZpbmUgQ1NfUkVWRVJCXzE5MjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC43ODA0MDc2CiAjZGVmaW5lIENTX1JFVkVSQl8xOTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNAogCkBAIC0zMTIsMTYzICszMTIsMTYzIEBACiAvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciA4MDAwIEh6IHNhbXBsZSByYXRlLCBcCiAgICBDUyBzY2FsZWQgd2l0aCAxLjAzODQ5NyBhbmQgQ1NFWCBzY2FsZWQgd2l0aCAwLjc3NTQ4MCAqLwogI2RlZmluZSBDU19FUVVBTElTRVJfODAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDEuMjYzMzEyCi0jZGVmaW5lIENTX0VRVUFMSVNFUl84MDAwX0ExICAgICAgICAgICAgICAgICAgICAtMC42MDE3NDgKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzgwMDBfQTIgICAgICAgICAgICAgICAgICAgIC0wLjI4MDY4MQotI2RlZmluZSBDU19FUVVBTElTRVJfODAwMF9CMSAgICAgICAgICAgICAgICAgICAgLTAuNDc1ODY1Ci0jZGVmaW5lIENTX0VRVUFMSVNFUl84MDAwX0IyICAgICAgICAgICAgICAgICAgICAtMC40MDgxNTQKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzgwMDBfQTEgICAgICAgICAgICAgICAgICAgICgtMC42MDE3NDgpCisjZGVmaW5lIENTX0VRVUFMSVNFUl84MDAwX0EyICAgICAgICAgICAgICAgICAgICAoLTAuMjgwNjgxKQorI2RlZmluZSBDU19FUVVBTElTRVJfODAwMF9CMSAgICAgICAgICAgICAgICAgICAgKC0wLjQ3NTg2NSkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzgwMDBfQjIgICAgICAgICAgICAgICAgICAgICgtMC40MDgxNTQpCiAjZGVmaW5lIENTX0VRVUFMSVNFUl84MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgIDE0CiAjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzgwMDBfQTAgICAgICAgICAgICAgICAgICAgIDAuOTQzMzU3Ci0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzgwMDBfQTEgICAgICAgICAgICAgICAgICAgLTAuNDQ5MzQ1Ci0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzgwMDBfQTIgICAgICAgICAgICAgICAgICAgLTAuMjA5NTk0Ci0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzgwMDBfQjEgICAgICAgICAgICAgICAgICAgLTAuNDc1ODY1Ci0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzgwMDBfQjIgICAgICAgICAgICAgICAgICAgLTAuNDA4MTU0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzgwMDBfQTEgICAgICAgICAgICAgICAgICAgKC0wLjQ0OTM0NSkKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9BMiAgICAgICAgICAgICAgICAgICAoLTAuMjA5NTk0KQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84MDAwX0IxICAgICAgICAgICAgICAgICAgICgtMC40NzU4NjUpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzgwMDBfQjIgICAgICAgICAgICAgICAgICAgKC0wLjQwODE1NCkKICNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgMTUKIAogLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgMTEwMjVIeiBzYW1wbGUgcmF0ZSwgXAogICAgQ1Mgc2NhbGVkIHdpdGggMS4wMjc3NjEgYW5kIENTRVggc2NhbGVkIHdpdGggMC43Njc0NjMgKi8KICNkZWZpbmUgQ1NfRVFVQUxJU0VSXzExMDI1X0EwICAgICAgICAgICAgICAgICAgICAxLjEwMTE0NQogI2RlZmluZSBDU19FUVVBTElTRVJfMTEwMjVfQTEgICAgICAgICAgICAgICAgICAgIDAuMTM5MDIwCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8xMTAyNV9BMiAgICAgICAgICAgICAgICAgICAtMC44NjQ0MjMKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzExMDI1X0EyICAgICAgICAgICAgICAgICAgICgtMC44NjQ0MjMpCiAjZGVmaW5lIENTX0VRVUFMSVNFUl8xMTAyNV9CMSAgICAgICAgICAgICAgICAgICAgMC4wMjQ1NDEKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzExMDI1X0IyICAgICAgICAgICAgICAgICAgIC0wLjkwODkzMAorI2RlZmluZSBDU19FUVVBTElTRVJfMTEwMjVfQjIgICAgICAgICAgICAgICAgICAgKC0wLjkwODkzMCkKICNkZWZpbmUgQ1NfRVFVQUxJU0VSXzExMDI1X1NDQUxFICAgICAgICAgICAgICAgICAgICAgMTQKICNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQTAgICAgICAgICAgICAgICAgICAgIDAuOTc2MDU4Ci0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzExMDI1X0ExICAgICAgICAgICAgICAgICAgIC0wLjY5NTMyNgotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMTAyNV9BMiAgICAgICAgICAgICAgICAgICAtMC4wOTA4MDkKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQjEgICAgICAgICAgICAgICAgICAgLTAuNjEwNTk0Ci0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzExMDI1X0IyICAgICAgICAgICAgICAgICAgIC0wLjMxMTE0OQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMTAyNV9BMSAgICAgICAgICAgICAgICAgICAoLTAuNjk1MzI2KQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMTAyNV9BMiAgICAgICAgICAgICAgICAgICAoLTAuMDkwODA5KQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMTAyNV9CMSAgICAgICAgICAgICAgICAgICAoLTAuNjEwNTk0KQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMTAyNV9CMiAgICAgICAgICAgICAgICAgICAoLTAuMzExMTQ5KQogI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMTAyNV9TQ0FMRSAgICAgICAgICAgICAgICAgICAxNQogCiAvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciAxMjAwMEh6IHNhbXBsZSByYXRlLCBcCiAgICBDUyBzY2FsZWQgd2l0aCAxLjAzMjUyMSBhbmQgQ1NFWCBzY2FsZWQgd2l0aCAwLjc3MTAxNyAqLwogI2RlZmluZSBDU19FUVVBTElTRVJfMTIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgMS4yNzY2NjEKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzEyMDAwX0ExICAgICAgICAgICAgICAgICAgICAgLTEuMDE3NTE5Ci0jZGVmaW5lIENTX0VRVUFMSVNFUl8xMjAwMF9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjA0NDEyOAotI2RlZmluZSBDU19FUVVBTElTRVJfMTIwMDBfQjEgICAgICAgICAgICAgICAgICAgICAtMC43Mjk2MTYKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzEyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgLTAuMjA0NTMyCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICgtMS4wMTc1MTkpCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wNDQxMjgpCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICgtMC43Mjk2MTYpCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICgtMC4yMDQ1MzIpCiAjZGVmaW5lIENTX0VRVUFMSVNFUl8xMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDE0CiAjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzEyMDAwX0EwICAgICAgICAgICAgICAgICAxLjAwNzA5NQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMjAwMF9BMSAgICAgICAgICAgICAgICAtMC44NzE5MTIKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQTEgICAgICAgICAgICAgICAgKC0wLjg3MTkxMikKICNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQTIgICAgICAgICAgICAgICAgIDAuMDIzMjMyCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzEyMDAwX0IxICAgICAgICAgICAgICAgIC0wLjc0NTg1NwotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMjAwMF9CMiAgICAgICAgICAgICAgICAtMC4xODkxNzEKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQjEgICAgICAgICAgICAgICAgKC0wLjc0NTg1NykKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQjIgICAgICAgICAgICAgICAgKC0wLjE4OTE3MSkKICNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgMTQKIAogLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgMTYwMDBIeiBzYW1wbGUgcmF0ZSwgXAogICAgQ1Mgc2NhbGVkIHdpdGggMS4wMzEzNzggYW5kIENTRVggc2NhbGVkIHdpdGggMC43NzAxNjQgKi8KICNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgMS4yODE2MjkKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE2MDAwX0ExICAgICAgICAgICAgICAgICAgICAtMS4wNzU4NzIKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE2MDAwX0EyICAgICAgICAgICAgICAgICAgICAtMC4wNDEzNjUKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE2MDAwX0IxICAgICAgICAgICAgICAgICAgICAtMC43MjUyMzkKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE2MDAwX0IyICAgICAgICAgICAgICAgICAgICAtMC4yMjQzNTgKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE2MDAwX0ExICAgICAgICAgICAgICAgICAgICAoLTEuMDc1ODcyKQorI2RlZmluZSBDU19FUVVBTElTRVJfMTYwMDBfQTIgICAgICAgICAgICAgICAgICAgICgtMC4wNDEzNjUpCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNjAwMF9CMSAgICAgICAgICAgICAgICAgICAgKC0wLjcyNTIzOSkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE2MDAwX0IyICAgICAgICAgICAgICAgICAgICAoLTAuMjI0MzU4KQogI2RlZmluZSBDU19FUVVBTElTRVJfMTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxNAogI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNjAwMF9BMCAgICAgICAgICAgICAgICAgIDEuMDgxMDkxCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE2MDAwX0ExICAgICAgICAgICAgICAgICAtMC44NjcxODMKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQTIgICAgICAgICAgICAgICAgIC0wLjA3MDI0NwotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNjAwMF9CMSAgICAgICAgICAgICAgICAgLTAuNTE1MTIxCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE2MDAwX0IyICAgICAgICAgICAgICAgICAtMC40MjU4OTMKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQTEgICAgICAgICAgICAgICAgICgtMC44NjcxODMpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE2MDAwX0EyICAgICAgICAgICAgICAgICAoLTAuMDcwMjQ3KQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNjAwMF9CMSAgICAgICAgICAgICAgICAgKC0wLjUxNTEyMSkKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQjIgICAgICAgICAgICAgICAgICgtMC40MjU4OTMpCiAjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDE0CiAKIC8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDIyMDUwSHogc2FtcGxlIHJhdGUsIFwKICAgIENTIHNjYWxlZCB3aXRoIDEuMDQxNTc2IGFuZCBDU0VYIHNjYWxlZCB3aXRoIDAuNzc3Nzc5ICovCiAjZGVmaW5lIENTX0VRVUFMSVNFUl8yMjA1MF9BMCAgICAgICAgICAgICAgICAgICAxLjM4ODYwNQotI2RlZmluZSBDU19FUVVBTElTRVJfMjIwNTBfQTEgICAgICAgICAgICAgICAgICAtMS4zMDU3OTkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzIyMDUwX0ExICAgICAgICAgICAgICAgICAgKC0xLjMwNTc5OSkKICNkZWZpbmUgQ1NfRVFVQUxJU0VSXzIyMDUwX0EyICAgICAgICAgICAgICAgICAgIDAuMDM5OTIyCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8yMjA1MF9CMSAgICAgICAgICAgICAgICAgIC0wLjcxOTQ5NAotI2RlZmluZSBDU19FUVVBTElTRVJfMjIwNTBfQjIgICAgICAgICAgICAgICAgICAtMC4yNDMyNDUKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzIyMDUwX0IxICAgICAgICAgICAgICAgICAgKC0wLjcxOTQ5NCkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzIyMDUwX0IyICAgICAgICAgICAgICAgICAgKC0wLjI0MzI0NSkKICNkZWZpbmUgQ1NfRVFVQUxJU0VSXzIyMDUwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgMTQKICNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjIwNTBfQTAgICAgICAgICAgICAgICAgICAgMS4yNzI5MTAKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjIwNTBfQTEgICAgICAgICAgICAgICAgICAtMS4zNDEwMTQKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjIwNTBfQTEgICAgICAgICAgICAgICAgICAoLTEuMzQxMDE0KQogI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yMjA1MF9BMiAgICAgICAgICAgICAgICAgICAwLjE2NzQ2MgotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yMjA1MF9CMSAgICAgICAgICAgICAgICAgIC0wLjYxNDIxOQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yMjA1MF9CMiAgICAgICAgICAgICAgICAgIC0wLjM0NTM4NAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yMjA1MF9CMSAgICAgICAgICAgICAgICAgICgtMC42MTQyMTkpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzIyMDUwX0IyICAgICAgICAgICAgICAgICAgKC0wLjM0NTM4NCkKICNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjIwNTBfU0NBTEUgICAgICAgICAgICAgICAgICAgMTQKIAogLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgMjQwMDBIeiBzYW1wbGUgcmF0ZSwgXAogICAgQ1Mgc2NhbGVkIHdpdGggMS4wMzQ0OTUgYW5kIENTRVggc2NhbGVkIHdpdGggMC43NzI0OTEgKi8KICNkZWZpbmUgQ1NfRVFVQUxJU0VSXzI0MDAwX0EwICAgICAgICAgICAgICAgICAgICAxLjQwOTgzMgotI2RlZmluZSBDU19FUVVBTElTRVJfMjQwMDBfQTEgICAgICAgICAgICAgICAgICAgLTEuNDU2NTA2CisjZGVmaW5lIENTX0VRVUFMSVNFUl8yNDAwMF9BMSAgICAgICAgICAgICAgICAgICAoLTEuNDU2NTA2KQogI2RlZmluZSBDU19FUVVBTElTRVJfMjQwMDBfQTIgICAgICAgICAgICAgICAgICAgIDAuMTUxNDEwCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8yNDAwMF9CMSAgICAgICAgICAgICAgICAgICAtMC44MDQyMDEKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzI0MDAwX0IyICAgICAgICAgICAgICAgICAgIC0wLjE2Mzc4MworI2RlZmluZSBDU19FUVVBTElTRVJfMjQwMDBfQjEgICAgICAgICAgICAgICAgICAgKC0wLjgwNDIwMSkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzI0MDAwX0IyICAgICAgICAgICAgICAgICAgICgtMC4xNjM3ODMpCiAjZGVmaW5lIENTX0VRVUFMSVNFUl8yNDAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDE0CiAjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzI0MDAwX0EwICAgICAgICAgICAgICAgICAgMS4yOTkxOTgKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQTEgICAgICAgICAgICAgICAgIC0xLjQ1MjQ0NworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yNDAwMF9BMSAgICAgICAgICAgICAgICAgKC0xLjQ1MjQ0NykKICNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQTIgICAgICAgICAgICAgICAgICAwLjI0MDQ4OQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yNDAwMF9CMSAgICAgICAgICAgICAgICAgLTAuNjY5MzAzCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzI0MDAwX0IyICAgICAgICAgICAgICAgICAtMC4yOTQ5ODQKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQjEgICAgICAgICAgICAgICAgICgtMC42NjkzMDMpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzI0MDAwX0IyICAgICAgICAgICAgICAgICAoLTAuMjk0OTg0KQogI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yNDAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAxNAogCiAvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciAzMjAwMEh6IHNhbXBsZSByYXRlLCBcCiAgICBDUyBzY2FsZWQgd2l0aCAxLjA0NDU1OSBhbmQgQ1NFWCBzY2FsZWQgd2l0aCAwLjc4MDAwNiAqLwogI2RlZmluZSBDU19FUVVBTElTRVJfMzIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAxLjU2MDk4OAotI2RlZmluZSBDU19FUVVBTElTRVJfMzIwMDBfQTEgICAgICAgICAgICAgICAgICAgIC0xLjg3NzcyNAorI2RlZmluZSBDU19FUVVBTElTRVJfMzIwMDBfQTEgICAgICAgICAgICAgICAgICAgICgtMS44Nzc3MjQpCiAjZGVmaW5lIENTX0VRVUFMSVNFUl8zMjAwMF9BMiAgICAgICAgICAgICAgICAgICAgIDAuMzg5NzQxCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8zMjAwMF9CMSAgICAgICAgICAgICAgICAgICAgLTAuOTA3NDEwCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8zMjAwMF9CMiAgICAgICAgICAgICAgICAgICAgLTAuMDcwNDg5CisjZGVmaW5lIENTX0VRVUFMSVNFUl8zMjAwMF9CMSAgICAgICAgICAgICAgICAgICAgKC0wLjkwNzQxMCkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzMyMDAwX0IyICAgICAgICAgICAgICAgICAgICAoLTAuMDcwNDg5KQogI2RlZmluZSBDU19FUVVBTElTRVJfMzIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxNAogI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8zMjAwMF9BMCAgICAgICAgICAgICAgICAgIDEuNzg1MDQ5Ci0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzMyMDAwX0ExICAgICAgICAgICAgICAgICAtMi4yMzM0OTcKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQTEgICAgICAgICAgICAgICAgICgtMi4yMzM0OTcpCiAjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzMyMDAwX0EyICAgICAgICAgICAgICAgICAgMC41MjY0MzEKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQjEgICAgICAgICAgICAgICAgIC0wLjQ0NTkzOQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8zMjAwMF9CMiAgICAgICAgICAgICAgICAgLTAuNTIyNDQ2CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzMyMDAwX0IxICAgICAgICAgICAgICAgICAoLTAuNDQ1OTM5KQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8zMjAwMF9CMiAgICAgICAgICAgICAgICAgKC0wLjUyMjQ0NikKICNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMzIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgMTMKIAogLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgNDQxMDBIeiBzYW1wbGUgcmF0ZSwgXAogICAgQ1Mgc2NhbGVkIHdpdGggMS4wMjIxNzAgYW5kIENTRVggc2NhbGVkIHdpdGggMC43NjMyODggKi8KICNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ0MTAwX0EwICAgICAgICAgICAgICAgICAgMS42MjM5OTMKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ0MTAwX0ExICAgICAgICAgICAgICAgICAtMi4yNzA3NDMKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ0MTAwX0ExICAgICAgICAgICAgICAgICAoLTIuMjcwNzQzKQogI2RlZmluZSBDU19FUVVBTElTRVJfNDQxMDBfQTIgICAgICAgICAgICAgICAgICAwLjY4ODgyOQotI2RlZmluZSBDU19FUVVBTElTRVJfNDQxMDBfQjEgICAgICAgICAgICAgICAgIC0xLjExNzE5MAorI2RlZmluZSBDU19FUVVBTElTRVJfNDQxMDBfQjEgICAgICAgICAgICAgICAgICgtMS4xMTcxOTApCiAjZGVmaW5lIENTX0VRVUFMSVNFUl80NDEwMF9CMiAgICAgICAgICAgICAgICAgIDAuMTMwMjA4CiAjZGVmaW5lIENTX0VRVUFMSVNFUl80NDEwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDEzCiAjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0EwICAgICAgICAgICAgICAgICAgIDIuMDI4MzE1Ci0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0ExICAgICAgICAgICAgICAgICAgLTIuODgyNDU5CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0ExICAgICAgICAgICAgICAgICAgKC0yLjg4MjQ1OSkKICNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDQxMDBfQTIgICAgICAgICAgICAgICAgICAgMC45MDQ1MzUKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDQxMDBfQjEgICAgICAgICAgICAgICAgICAtMC41OTMzMDgKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDQxMDBfQjIgICAgICAgICAgICAgICAgICAtMC4zODU4MTYKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDQxMDBfQjEgICAgICAgICAgICAgICAgICAoLTAuNTkzMzA4KQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80NDEwMF9CMiAgICAgICAgICAgICAgICAgICgtMC4zODU4MTYpCiAjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ0MTAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDEzCiAKIC8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDQ4MDAwSHogc2FtcGxlIHJhdGUsIFwKICAgIENTIHNjYWxlZCB3aXRoIDEuMDE4NjM1IGFuZCBDU0VYIHNjYWxlZCB3aXRoIDAuNzYwNjQ4ICovCiAjZGVmaW5lIENTX0VRVUFMSVNFUl80ODAwMF9BMCAgICAgICAgICAgICAgICAgICAgMS42NDExNzcKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ4MDAwX0ExICAgICAgICAgICAgICAgICAgIC0yLjM2NDY4NworI2RlZmluZSBDU19FUVVBTElTRVJfNDgwMDBfQTEgICAgICAgICAgICAgICAgICAgKC0yLjM2NDY4NykKICNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ4MDAwX0EyICAgICAgICAgICAgICAgICAgICAwLjc1OTkxMAotI2RlZmluZSBDU19FUVVBTElTRVJfNDgwMDBfQjEgICAgICAgICAgICAgICAgICAgLTEuMTY2Nzc0CisjZGVmaW5lIENTX0VRVUFMSVNFUl80ODAwMF9CMSAgICAgICAgICAgICAgICAgICAoLTEuMTY2Nzc0KQogI2RlZmluZSBDU19FUVVBTElTRVJfNDgwMDBfQjIgICAgICAgICAgICAgICAgICAgIDAuMTc4MDc0CiAjZGVmaW5lIENTX0VRVUFMSVNFUl80ODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDEzCiAjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0EwICAgICAgICAgICAgICAgICAgMi4wOTk2NTUKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQTEgICAgICAgICAgICAgICAgIC0zLjA2NTIyMAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80ODAwMF9BMSAgICAgICAgICAgICAgICAgKC0zLjA2NTIyMCkKICNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQTIgICAgICAgICAgICAgICAgICAxLjAxMDQxNwotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80ODAwMF9CMSAgICAgICAgICAgICAgICAgLTAuNjM0MDIxCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0IyICAgICAgICAgICAgICAgICAtMC4zNDczMzIKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQjEgICAgICAgICAgICAgICAgICgtMC42MzQwMjEpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0IyICAgICAgICAgICAgICAgICAoLTAuMzQ3MzMyKQogI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80ODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAxMwogCiAKICNpZmRlZiBISUdIRVJfRlMKICNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX0EwICAgICAgICAgICAgICAgICAgICAxLjc4NDQ5NwotI2RlZmluZSBDU19FUVVBTElTRVJfOTYwMDBfQTEgICAgICAgICAgICAgICAgICAgLTMuMDAxNDM1CisjZGVmaW5lIENTX0VRVUFMSVNFUl85NjAwMF9BMSAgICAgICAgICAgICAgICAgICAoLTMuMDAxNDM1KQogI2RlZmluZSBDU19FUVVBTElTRVJfOTYwMDBfQTIgICAgICAgICAgICAgICAgICAgIDEuMjI4NDIyCi0jZGVmaW5lIENTX0VRVUFMSVNFUl85NjAwMF9CMSAgICAgICAgICAgICAgICAgICAtMS40Nzc4MDQKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX0IxICAgICAgICAgICAgICAgICAgICgtMS40Nzc4MDQpCiAjZGVmaW5lIENTX0VRVUFMSVNFUl85NjAwMF9CMiAgICAgICAgICAgICAgICAgICAgMC40ODEzNjkKICNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgMTMKICNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQTAgICAgICAgICAgICAgICAgICAyLjc1NzMKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQTEgICAgICAgICAgICAgICAgIC00LjY3MjEKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQTEgICAgICAgICAgICAgICAgICgtNC42NzIxKQogI2RlZmluZSBDU0VYX0VRVUFMSVNFUl85NjAwMF9BMiAgICAgICAgICAgICAgICAgIDEuOTMxNwotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl85NjAwMF9CMSAgICAgICAgICAgICAgICAgLTAuOTcxNzE4Ci0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzk2MDAwX0IyICAgICAgICAgICAgICAgICAtMC4wMjEyMTYKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQjEgICAgICAgICAgICAgICAgICgtMC45NzE3MTgpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzk2MDAwX0IyICAgICAgICAgICAgICAgICAoLTAuMDIxMjE2KQogI2RlZmluZSBDU0VYX0VRVUFMSVNFUl85NjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAxMwogCiAjZGVmaW5lIENTX0VRVUFMSVNFUl8xOTIwMDBfQTAgICAgICAgICAgICAgICAgICAgIDEuODg5NTgyCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8xOTIwMDBfQTEgICAgICAgICAgICAgICAgICAgLTMuNDU2MTQwCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xOTIwMDBfQTEgICAgICAgICAgICAgICAgICAgKC0zLjQ1NjE0MCkKICNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE5MjAwMF9BMiAgICAgICAgICAgICAgICAgICAgMS41Njk4NjQKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE5MjAwMF9CMSAgICAgICAgICAgICAgICAgICAtMS43MDA3OTgKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE5MjAwMF9CMSAgICAgICAgICAgICAgICAgICAoLTEuNzAwNzk4KQogI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX0IyICAgICAgICAgICAgICAgICAgICAwLjcwMTgyNAogI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgMTMKICNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0EwICAgICAgICAgICAgICAgICAgMy40MjczCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9BMSAgICAgICAgICAgICAgICAgLTYuMjkzNgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQTEgICAgICAgICAgICAgICAgICgtNi4yOTM2KQogI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQTIgICAgICAgICAgICAgICAgICAyLjg3MjAKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0IxICAgICAgICAgICAgICAgICAtMS4zMTA3NAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQjEgICAgICAgICAgICAgICAgICgtMS4zMTA3NCkKICNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0IyICAgICAgICAgICAgICAgICAwLjMxMzEyCiAjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAxMwogI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0FuZHJvaWQubWsgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0FuZHJvaWQubWsKaW5kZXggZjEwNmFhZS4uMzQxZGJjMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQW5kcm9pZC5tawpAQCAtMSw1ICsxLDggQEAKIExPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQogCisjIFRoZSB3cmFwcGVyIC1EQlVJTERfRkxPQVQgbmVlZHMgdG8gbWF0Y2gKKyMgdGhlIGx2bSBsaWJyYXJ5IC1EQlVJTERfRkxPQVQuCisKICMgbXVzaWMgYnVuZGxlIHdyYXBwZXIKIExPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCkBAIC0yMCwxNSArMjMsMTcgQEAKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgKz0gbGlibXVzaWNidW5kbGUKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgIGxpYmxvZyBcCisgICAgIGxpYmF1ZGlvdXRpbHMgXAogICAgICBsaWJjdXRpbHMgXAotICAgICBsaWJkbAorICAgICBsaWJkbCBcCisgICAgIGxpYmxvZyBcCiAKIExPQ0FMX0NfSU5DTFVERVMgKz0gXAogCSQoTE9DQUxfUEFUSCkvQnVuZGxlIFwKIAkkKExPQ0FMX1BBVEgpLy4uL2xpYi9Db21tb24vbGliLyBcCiAJJChMT0NBTF9QQVRIKS8uLi9saWIvQnVuZGxlL2xpYi8gXAotCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby1lZmZlY3RzKQorCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby1lZmZlY3RzKSBcCisJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCiAKIExPQ0FMX0hFQURFUl9MSUJSQVJJRVMgKz0gbGliaGFyZHdhcmVfaGVhZGVycwogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpAQCAtNTMsMTUgKzU4LDIwIEBACiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IGxpYnJldmVyYgogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICAgbGlibG9nIFwKKyAgICAgbGliYXVkaW91dGlscyBcCiAgICAgIGxpYmN1dGlscyBcCi0gICAgIGxpYmRsCisgICAgIGxpYmRsIFwKKyAgICAgbGlibG9nIFwKIAogTE9DQUxfQ19JTkNMVURFUyArPSBcCiAgICAgJChMT0NBTF9QQVRIKS9SZXZlcmIgXAogICAgICQoTE9DQUxfUEFUSCkvLi4vbGliL0NvbW1vbi9saWIvIFwKICAgICAkKExPQ0FMX1BBVEgpLy4uL2xpYi9SZXZlcmIvbGliLyBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpCisgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpIFwKKyAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKIAogTE9DQUxfSEVBREVSX0xJQlJBUklFUyArPSBsaWJoYXJkd2FyZV9oZWFkZXJzCisKK0xPQ0FMX1NBTklUSVpFIDo9IGludGVnZXJfb3ZlcmZsb3cKKwogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAKaW5kZXggYWFlODBiNi4uMDRjMjY5MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CiAjaW5jbHVkZSA8bG9nL2xvZy5oPgogCiAjaW5jbHVkZSAiRWZmZWN0QnVuZGxlLmgiCkBAIC02MywxNiArNjQsNiBAQAogICAgICAgICB9XAogICAgIH0KIAotCi1zdGF0aWMgaW5saW5lIGludDE2X3QgY2xhbXAxNihpbnQzMl90IHNhbXBsZSkKLXsKLSAgICAvLyBjaGVjayBvdmVyZmxvdyBmb3IgYm90aCBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgdmFsdWVzOgotICAgIC8vIGFsbCBiaXRzIGFib3ZlIHNob3J0IHJhbmdlIG11c3QgbWUgZXF1YWwgdG8gc2lnbiBiaXQKLSAgICBpZiAoKHNhbXBsZT4+MTUpIF4gKHNhbXBsZT4+MzEpKQotICAgICAgICBzYW1wbGUgPSAweDdGRkYgXiAoc2FtcGxlPj4zMSk7Ci0gICAgcmV0dXJuIHNhbXBsZTsKLX0KLQogLy8gTmFtZXNwYWNlcwogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHsKQEAgLTE5OCw3ICsxODksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgaW9JZCBfX3VudXNlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfaGFuZGxlX3QgICpwSGFuZGxlKXsKICAgICBpbnQgcmV0ID0gMDsKLSAgICBpbnQgc2Vzc2lvbk5vOworICAgIGludCBzZXNzaW9uTm8gPSAtMTsKICAgICBpbnQgaTsKICAgICBFZmZlY3RDb250ZXh0ICpwQ29udGV4dCA9IE5VTEw7CiAgICAgYm9vbCBuZXdCdW5kbGUgPSBmYWxzZTsKQEAgLTIxOCwyMiArMjA5LDI3IEBACiAgICAgICAgIEx2bUdsb2JhbEJ1bmRsZV9pbml0KCk7CiAgICAgfQogCi0gICAgLy8gRmluZCBuZXh0IGF2YWlsYWJsZSBzZXNzaW9uTm8KKyAgICAvLyBGaW5kIHNlc3Npb25ObzogaWYgb25lIGFscmVhZHkgZXhpc3RzIGZvciB0aGUgc2Vzc2lvbklkIHVzZSBpdCwKKyAgICAvLyBvdGhlcndpc2UgY2hvb3NlIHRoZSBmaXJzdCBhdmFpbGFibGUgZW1wdHkgc2xvdC4KICAgICBmb3IoaT0wOyBpPExWTV9NQVhfU0VTU0lPTlM7IGkrKyl7Ci0gICAgICAgIGlmKChTZXNzaW9uSW5kZXhbaV0gPT0gTFZNX1VOVVNFRF9TRVNTSU9OKXx8KFNlc3Npb25JbmRleFtpXSA9PSBzZXNzaW9uSWQpKXsKLSAgICAgICAgICAgIHNlc3Npb25ObyAgICAgICA9IGk7Ci0gICAgICAgICAgICBTZXNzaW9uSW5kZXhbaV0gPSBzZXNzaW9uSWQ7Ci0gICAgICAgICAgICBBTE9HVigiXHRFZmZlY3RDcmVhdGU6IEFsbG9jYXRpbmcgU2Vzc2lvbk5vICVkIGZvciBTZXNzaW9uSWQgJWRcbiIsIHNlc3Npb25ObyxzZXNzaW9uSWQpOworICAgICAgICBpZiAoU2Vzc2lvbkluZGV4W2ldID09IHNlc3Npb25JZCkgeworICAgICAgICAgICAgc2Vzc2lvbk5vID0gaTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CisgICAgICAgIGlmIChzZXNzaW9uTm8gPCAwICYmIFNlc3Npb25JbmRleFtpXSA9PSBMVk1fVU5VU0VEX1NFU1NJT04pIHsKKyAgICAgICAgICAgIHNlc3Npb25ObyA9IGk7CisgICAgICAgICAgICAvLyBkbyBub3QgYnJlYWs7IGFsbG93IGxvb3AgdG8gY29udGludWUgdG8gc2VhcmNoIGZvciBhIHNlc3Npb25JZCBtYXRjaC4KKyAgICAgICAgfQogICAgIH0KLQotICAgIGlmKGk9PUxWTV9NQVhfU0VTU0lPTlMpeworICAgIGlmIChzZXNzaW9uTm8gPCAwKSB7CiAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IENhbm5vdCBmaW5kIG1lbW9yeSB0byBhbGxvY2F0ZSBmb3IgY3VycmVudCBzZXNzaW9uIik7CiAgICAgICAgIHJldCA9IC1FSU5WQUw7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CiAKKyAgICBTZXNzaW9uSW5kZXhbc2Vzc2lvbk5vXSA9IHNlc3Npb25JZDsKKyAgICBBTE9HVigiXHRFZmZlY3RDcmVhdGU6IEFsbG9jYXRpbmcgc2Vzc2lvbk5vICVkIGZvciBzZXNzaW9uSWQgJWRcbiIsIHNlc3Npb25Obywgc2Vzc2lvbklkKTsKKwogICAgIHBDb250ZXh0ID0gbmV3IEVmZmVjdENvbnRleHQ7CiAKICAgICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCBjcmVhdGUgaW4gdGhpcyBzZXNzaW9uCkBAIC0yOTksNyArMjk1LDcgQEAKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50VmlydCAgID0gMDsKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50QmIgICAgID0gMDsKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEgICAgID0gMDsKLSNpZmRlZiBCVUlMRF9GTE9BVAorI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmICFkZWZpbmVkKE5BVElWRV9GTE9BVF9CVUZGRVIpCiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBJbnB1dEJ1ZmZlciAgICAgICAgICAgICA9IE5VTEw7CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBPdXRwdXRCdWZmZXIgICAgICAgICAgICA9IE5VTEw7CiAjZW5kaWYKQEAgLTQ3MCwxMyArNDY2LDkgQEAKICAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgZnJlZShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyKTsKICAgICAgICAgfQotI2lmZGVmIEJVSUxEX0ZMT0FUCi0gICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgZnJlZShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGZyZWUocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cE91dHB1dEJ1ZmZlcik7Ci0gICAgICAgIH0KKyNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiAhZGVmaW5lZChOQVRJVkVfRkxPQVRfQlVGRkVSKQorICAgICAgICBmcmVlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBJbnB1dEJ1ZmZlcik7CisgICAgICAgIGZyZWUocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cE91dHB1dEJ1ZmZlcik7CiAjZW5kaWYKICAgICAgICAgZGVsZXRlIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQ7CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQgPSBMVk1fTlVMTDsKQEAgLTU0OSw3ICs1NDEsNyBAQAogCiAgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5hY2Nlc3NNb2RlICAgICAgICAgICAgICAgICAgICA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7CiAgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyAgICAgICAgICAgICAgICAgICAgICA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKLSAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5mb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICA9IEVGRkVDVF9CVUZGRVJfRk9STUFUOwogICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlICAgICAgICAgICAgICAgICAgPSA0NDEwMDsKICAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciAgICAgID0gTlVMTDsKICAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgID0gTlVMTDsKQEAgLTU1Nyw3ICs1NDksNyBAQAogICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcubWFzayAgICAgICAgICAgICAgICAgICAgICAgICAgPSBFRkZFQ1RfQ09ORklHX0FMTDsKICAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlICAgICAgICAgICAgICAgICAgID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURTsKICAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5jaGFubmVscyAgICAgICAgICAgICAgICAgICAgID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5mb3JtYXQgICAgICAgICAgICAgICAgICAgICAgID0gRUZGRUNUX0JVRkZFUl9GT1JNQVQ7CiAgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlICAgICAgICAgICAgICAgICA9IDQ0MTAwOwogICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciAgICAgPSBOVUxMOwogICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOwpAQCAtNzM0LDQ3ICs3MjYsNiBAQAogICAgIHJldHVybiAwOwogfSAgIC8qIGVuZCBMdm1CdW5kbGVfaW5pdCAqLwogCi0jaWZkZWYgQlVJTERfRkxPQVQKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBGVU5DVElPTiBJTlQxNkxUT0ZMT0FUCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8vIFRvZG86IG5lZWQgdG8gd3JpdGUgZnVuY3Rpb24gZGVzY3JpcHRvcgotc3RhdGljIHZvaWQgSW50MTZUb0Zsb2F0KGNvbnN0IExWTV9JTlQxNiAqc3JjLCBMVk1fRkxPQVQgKmRzdCwgc2l6ZV90IG4pIHsKLSAgICBzaXplX3QgaWk7Ci0gICAgc3JjICs9IG4tMTsKLSAgICBkc3QgKz0gbi0xOwotICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKSB7Ci0gICAgICAgICpkc3QgPSAoKExWTV9GTE9BVCkoKExWTV9JTlQxNikqc3JjKSkgLyAzMjc2OC4wZjsKLSAgICAgICAgc3JjLS07Ci0gICAgICAgIGRzdC0tOwotICAgIH0KLSAgICByZXR1cm47Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgRlVOQ1RJT04gRkxPQVRUT0lOVDE2X1NBVAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vLyBUb2RvIDogTmVlZCB0byB3cml0ZSBmdW5jdGlvbiBkZXNjcmlwdG9yCi1zdGF0aWMgdm9pZCBGbG9hdFRvSW50MTZfU0FUKGNvbnN0IExWTV9GTE9BVCAqc3JjLCBMVk1fSU5UMTYgKmRzdCwgc2l6ZV90IG4pIHsKLSAgICBzaXplX3QgaWk7Ci0gICAgTFZNX0lOVDMyIHRlbXA7Ci0KLSAgICBzcmMgKz0gbi0xOwotICAgIGRzdCArPSBuLTE7Ci0gICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pIHsKLSAgICAgICAgdGVtcCA9IChMVk1fSU5UMzIpKCgqc3JjKSAqIDMyNzY4LjBmKTsKLSAgICAgICAgaWYgKHRlbXAgPj0gMzI3NjcpIHsKLSAgICAgICAgICAgICpkc3QgPSAzMjc2NzsKLSAgICAgICAgfSBlbHNlIGlmICh0ZW1wIDw9IC0zMjc2OCkgewotICAgICAgICAgICAgKmRzdCA9IC0zMjc2ODsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICpkc3QgPSAoTFZNX0lOVDE2KXRlbXA7Ci0gICAgICAgIH0KLSAgICAgICAgc3JjLS07Ci0gICAgICAgIGRzdC0tOwotICAgIH0KLSAgICByZXR1cm47Ci19Ci0jZW5kaWYKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gTHZtQnVuZGxlX3Byb2Nlc3MoKQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC03ODIsOCArNzMzLDggQEAKIC8vIEFwcGx5IExWTSBCdW5kbGUgZWZmZWN0cwogLy8KIC8vIElucHV0czoKLS8vICBwSW46ICAgICAgICBwb2ludGVyIHRvIHN0ZXJlbyAxNiBiaXQgaW5wdXQgZGF0YQotLy8gIHBPdXQ6ICAgICAgIHBvaW50ZXIgdG8gc3RlcmVvIDE2IGJpdCBvdXRwdXQgZGF0YQorLy8gIHBJbjogICAgICAgIHBvaW50ZXIgdG8gc3RlcmVvIGZsb2F0IG9yIDE2IGJpdCBpbnB1dCBkYXRhCisvLyAgcE91dDogICAgICAgcG9pbnRlciB0byBzdGVyZW8gZmxvYXQgb3IgMTYgYml0IG91dHB1dCBkYXRhCiAvLyAgZnJhbWVDb3VudDogRnJhbWVzIHRvIHByb2Nlc3MKIC8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKIC8vICBzdHJlbmd0aCAgICBzdHJlbmd0aCB0byBiZSBhcHBsaWVkCkBAIC03OTMsNDQgKzc0NCwzNyBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogI2lmZGVmIEJVSUxEX0ZMT0FUCi1pbnQgTHZtQnVuZGxlX3Byb2Nlc3MoTFZNX0lOVDE2ICAgICAgICAqcEluLAotICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgKnBPdXQsCitpbnQgTHZtQnVuZGxlX3Byb2Nlc3MoZWZmZWN0X2J1ZmZlcl90ICAqcEluLAorICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9idWZmZXJfdCAgKnBPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdENvbnRleHQgICAgKnBDb250ZXh0KXsKIAotCi0gICAgLy9MVk1fQ29udHJvbFBhcmFtc190ICAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KICAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgICAgICAgICAgICAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcE91dFRtcDsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcElucHV0QnVmZjsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcE91dHB1dEJ1ZmY7Ci0KLSAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cElucHV0QnVmZmVyID09IE5VTEwgfHwKKyAgICBlZmZlY3RfYnVmZmVyX3QgICAgICAgICAqcE91dFRtcDsKKyNpZm5kZWYgTkFUSVZFX0ZMT0FUX0JVRkZFUgorICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXIgPT0gbnVsbHB0ciB8fAogICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+ZnJhbWVDb3VudCA8IGZyYW1lQ291bnQpIHsKLSAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBJbnB1dEJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBmcmVlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBJbnB1dEJ1ZmZlcik7Ci0gICAgICAgIH0KLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cElucHV0QnVmZmVyID0gKExWTV9GTE9BVCAqKW1hbGxvYyhmcmFtZUNvdW50ICogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpICogRkNDXzIpOworICAgICAgICBmcmVlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBJbnB1dEJ1ZmZlcik7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBJbnB1dEJ1ZmZlciA9CisgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKWNhbGxvYyhmcmFtZUNvdW50LCBzaXplb2YoTFZNX0ZMT0FUKSAqIEZDQ18yKTsKICAgICB9CiAKLSAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cE91dHB1dEJ1ZmZlciA9PSBOVUxMIHx8CisgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBPdXRwdXRCdWZmZXIgPT0gbnVsbHB0ciB8fAogICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+ZnJhbWVDb3VudCA8IGZyYW1lQ291bnQpIHsKLSAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBPdXRwdXRCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgZnJlZShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyKTsKLSAgICAgICAgfQotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyID0gKExWTV9GTE9BVCAqKW1hbGxvYyhmcmFtZUNvdW50ICogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSAqIEZDQ18yKTsKKyAgICAgICAgZnJlZShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyKTsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cE91dHB1dEJ1ZmZlciA9CisgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKWNhbGxvYyhmcmFtZUNvdW50LCBzaXplb2YoTFZNX0ZMT0FUKSAqIEZDQ18yKTsKICAgICB9CiAKLSAgICBpZiAoKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBJbnB1dEJ1ZmZlciA9PSBOVUxMKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBPdXRwdXRCdWZmZXIgPT0gTlVMTCkpIHsKLSAgICAgICAgQUxPR1YoIkxWTV9FUlJPUiA6IEx2bUJ1bmRsZV9wcm9jZXNzIG1lbW9yeSBhbGxvY2F0aW9uIGZvciBmbG9hdCBidWZmZXIncyBmYWlsZWQiKTsKKyAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cElucHV0QnVmZmVyID09IG51bGxwdHIgfHwKKyAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBPdXRwdXRCdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiTFZNX0VSUk9SIDogTHZtQnVuZGxlX3Byb2Nlc3MgbWVtb3J5IGFsbG9jYXRpb24gZm9yIGZsb2F0IGJ1ZmZlcidzIGZhaWxlZCIpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKLSAgICBwSW5wdXRCdWZmID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cElucHV0QnVmZmVyOwotICAgIHBPdXRwdXRCdWZmID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cE91dHB1dEJ1ZmZlcjsKKyAgICBMVk1fRkxPQVQgKiBjb25zdCBwSW5wdXRCdWZmID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cElucHV0QnVmZmVyOworICAgIExWTV9GTE9BVCAqIGNvbnN0IHBPdXRwdXRCdWZmID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cE91dHB1dEJ1ZmZlcjsKKyNlbmRpZgogCiAgICAgaWYgKHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEUpewogICAgICAgICBwT3V0VG1wID0gcE91dDsKQEAgLTg0MCw3ICs3ODQsNyBAQAogICAgICAgICAgICAgICAgIGZyZWUocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+d29ya0J1ZmZlcik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyID0KLSAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKWNhbGxvYyhmcmFtZUNvdW50LCBzaXplb2YoTFZNX0lOVDE2KSAqIEZDQ18yKTsKKyAgICAgICAgICAgICAgICAgICAgKGVmZmVjdF9idWZmZXJfdCAqKWNhbGxvYyhmcmFtZUNvdW50LCBzaXplb2YoZWZmZWN0X2J1ZmZlcl90KSAqIEZDQ18yKTsKICAgICAgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKICAgICAgICAgICAgIH0KQEAgLTg1Miw0MyArNzk2LDYxIEBACiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAotICAgICNpZmRlZiBMVk1fUENNCi0gICAgZndyaXRlKHBJbiwgZnJhbWVDb3VudCpzaXplb2YoTFZNX0lOVDE2KSAqIEZDQ18yLCAxLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21JblB0cik7CisjaWZkZWYgTFZNX1BDTQorICAgIGZ3cml0ZShwSW4sCisgICAgICAgICAgICBmcmFtZUNvdW50KnNpemVvZihlZmZlY3RfYnVmZmVyX3QpICogRkNDXzIsIDEsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbUluUHRyKTsKICAgICBmZmx1c2gocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtSW5QdHIpOwotICAgICNlbmRpZgorI2VuZGlmCiAKKyNpZm5kZWYgTkFUSVZFX0ZMT0FUX0JVRkZFUgogICAgIC8qIENvbnZlcnRpbmcgaW5wdXQgZGF0YSBmcm9tIGZpeGVkIHBvaW50IHRvIGZsb2F0IHBvaW50ICovCi0gICAgSW50MTZUb0Zsb2F0KHBJbiwgcElucHV0QnVmZiwgZnJhbWVDb3VudCAqIDIpOworICAgIG1lbWNweV90b19mbG9hdF9mcm9tX2kxNihwSW5wdXRCdWZmLCBwSW4sIGZyYW1lQ291bnQgKiBGQ0NfMik7CiAKICAgICAvKiBQcm9jZXNzIHRoZSBzYW1wbGVzICovCiAgICAgTHZtU3RhdHVzID0gTFZNX1Byb2Nlc3MocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5wdXRCdWZmLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElucHV0IGJ1ZmZlciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRwdXRCdWZmLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3V0cHV0IGJ1ZmZlciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KWZyYW1lQ291bnQsICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gcmVhZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQXVkbyBUaW1lICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBdWRpbyBUaW1lICovCiAKKyAgICAvKiBDb252ZXJ0aW5nIG91dHB1dCBkYXRhIGZyb20gZmxvYXQgcG9pbnQgdG8gZml4ZWQgcG9pbnQgKi8KKyAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQocE91dFRtcCwgcE91dHB1dEJ1ZmYsIGZyYW1lQ291bnQgKiBGQ0NfMik7CisKKyNlbHNlCisgICAgLyogUHJvY2VzcyB0aGUgc2FtcGxlcyAqLworICAgIEx2bVN0YXR1cyA9IExWTV9Qcm9jZXNzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgLyogSW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbnB1dCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0VG1wLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNilmcmFtZUNvdW50LCAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHJlYWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEF1ZGlvIFRpbWUgKi8KKyNlbmRpZgogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fUHJvY2VzcyIsICJMdm1CdW5kbGVfcHJvY2VzcyIpCiAgICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKIAotICAgIC8qIENvbnZlcnRpbmcgb3V0cHV0IGRhdGEgZnJvbSBmbG9hdCBwb2ludCB0byBmaXhlZCBwb2ludCAqLwotICAgIEZsb2F0VG9JbnQxNl9TQVQocE91dHB1dEJ1ZmYsIHBPdXRUbXAsIChMVk1fVUlOVDE2KWZyYW1lQ291bnQgKiAyKTsKLSAgICAjaWZkZWYgTFZNX1BDTQotICAgIGZ3cml0ZShwT3V0VG1wLCBmcmFtZUNvdW50KnNpemVvZihMVk1fSU5UMTYpICogRkNDXzIsIDEsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbU91dFB0cik7CisjaWZkZWYgTFZNX1BDTQorICAgIGZ3cml0ZShwT3V0VG1wLAorICAgICAgICAgICAgZnJhbWVDb3VudCpzaXplb2YoZWZmZWN0X2J1ZmZlcl90KSAqIEZDQ18yLCAxLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21PdXRQdHIpOwogICAgIGZmbHVzaChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21PdXRQdHIpOwotICAgICNlbmRpZgorI2VuZGlmCiAKICAgICBpZiAocENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKXsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUNvdW50ICogMjsgaSsrKXsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUNvdW50ICogRkNDXzI7IGkrKykgeworI2lmbmRlZiBOQVRJVkVfRkxPQVRfQlVGRkVSCiAgICAgICAgICAgICBwT3V0W2ldID0gY2xhbXAxNigoTFZNX0lOVDMyKXBPdXRbaV0gKyAoTFZNX0lOVDMyKXBPdXRUbXBbaV0pOworI2Vsc2UKKyAgICAgICAgICAgIHBPdXRbaV0gPSBwT3V0W2ldICsgcE91dFRtcFtpXTsKKyNlbmRpZgogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiAwOwogfSAgICAvKiBlbmQgTHZtQnVuZGxlX3Byb2Nlc3MgKi8KLSNlbHNlCisKKyNlbHNlIC8vIEJVSUxEX0ZMT0FUCisKIGludCBMdm1CdW5kbGVfcHJvY2VzcyhMVk1fSU5UMTYgICAgICAgICpwSW4sCiAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAqcE91dCwKICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIGZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgRWZmZWN0Q29udGV4dCAgICAqcENvbnRleHQpeworICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdENvbnRleHQgICAgKnBDb250ZXh0KSB7CiAKICAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgICAgICAgICAgICAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcE91dFRtcDsKQEAgLTkwMSw3ICs4NjMsNyBAQAogICAgICAgICAgICAgICAgIGZyZWUocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+d29ya0J1ZmZlcik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyID0KLSAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKWNhbGxvYyhmcmFtZUNvdW50LCBzaXplb2YoTFZNX0lOVDE2KSAqIDIpOworICAgICAgICAgICAgICAgICAgICAoZWZmZWN0X2J1ZmZlcl90ICopY2FsbG9jKGZyYW1lQ291bnQsIHNpemVvZihlZmZlY3RfYnVmZmVyX3QpICogRkNDXzIpOwogICAgICAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwogICAgICAgICAgICAgfQpAQCAtOTEzLDEwICs4NzUsMTEgQEAKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCi0gICAgI2lmZGVmIExWTV9QQ00KLSAgICBmd3JpdGUocEluLCBmcmFtZUNvdW50KnNpemVvZihMVk1fSU5UMTYpKjIsIDEsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbUluUHRyKTsKKyNpZmRlZiBMVk1fUENNCisgICAgZndyaXRlKHBJbiwgZnJhbWVDb3VudCAqIHNpemVvZigqcEluKSAqIEZDQ18yLAorICAgICAgICAgICAgMSAvKiBubWVtYiAqLywgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtSW5QdHIpOwogICAgIGZmbHVzaChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21JblB0cik7Ci0gICAgI2VuZGlmCisjZW5kaWYKIAogICAgIC8vQUxPR1YoIkNhbGxpbmcgTFZNX1Byb2Nlc3MiKTsKIApAQCAtOTI1LDE1ICs4ODgsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElucHV0IGJ1ZmZlciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRUbXAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3V0cHV0IGJ1ZmZlciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KWZyYW1lQ291bnQsICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gcmVhZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQXVkbyBUaW1lICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBdWRpbyBUaW1lICovCiAKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1Byb2Nlc3MiLCAiTHZtQnVuZGxlX3Byb2Nlc3MiKQogICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CiAKLSAgICAjaWZkZWYgTFZNX1BDTQotICAgIGZ3cml0ZShwT3V0VG1wLCBmcmFtZUNvdW50KnNpemVvZihMVk1fSU5UMTYpKjIsIDEsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbU91dFB0cik7CisjaWZkZWYgTFZNX1BDTQorICAgIGZ3cml0ZShwT3V0VG1wLCBmcmFtZUNvdW50ICogc2l6ZW9mKCpwT3V0VG1wKSAqIEZDQ18yLAorICAgICAgICAgICAgMSAvKiBubWVtYiAqLywgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtT3V0UHRyKTsKICAgICBmZmx1c2gocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtT3V0UHRyKTsKLSAgICAjZW5kaWYKKyNlbmRpZgogCiAgICAgaWYgKHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSl7CiAgICAgICAgIGZvciAoaW50IGk9MDsgaTxmcmFtZUNvdW50KjI7IGkrKyl7CkBAIC05NDIsNyArOTA2LDggQEAKICAgICB9CiAgICAgcmV0dXJuIDA7CiB9ICAgIC8qIGVuZCBMdm1CdW5kbGVfcHJvY2VzcyAqLwotI2VuZGlmCisKKyNlbmRpZiAvLyBCVUlMRF9GTE9BVAogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEVxdWFsaXplclVwZGF0ZUFjdGl2ZVBhcmFtcygpCkBAIC0xMjc2LDggKzEyNDEsNyBAQAogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyA9PSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pOwogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURQogICAgICAgICAgICAgICB8fCBwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKTsKLSAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKTsKLQorICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgPT0gRUZGRUNUX0JVRkZFUl9GT1JNQVQpOwogICAgIHBDb250ZXh0LT5jb25maWcgPSAqcENvbmZpZzsKIAogICAgIHN3aXRjaCAocENvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlKSB7CkBAIC0zMzQ5LDEwICszMzEzLDE3IEBACiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNDYWxsZWQgPSAwOwogICAgICAgICAvKiBQcm9jZXNzIGFsbCB0aGUgYXZhaWxhYmxlIGZyYW1lcywgYmxvY2sgcHJvY2Vzc2luZyBpcwogICAgICAgICAgICBoYW5kbGVkIGludGVybmFsTFkgYnkgdGhlIExWTSBidW5kbGUgKi8KLSAgICAgICAgcHJvY2Vzc1N0YXR1cyA9IGFuZHJvaWQ6Okx2bUJ1bmRsZV9wcm9jZXNzKCAgICAoTFZNX0lOVDE2ICopaW5CdWZmZXItPnJhdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKilvdXRCdWZmZXItPnJhdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+ZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0KTsKKyNpZmRlZiBOQVRJVkVfRkxPQVRfQlVGRkVSCisgICAgICAgIHByb2Nlc3NTdGF0dXMgPSBhbmRyb2lkOjpMdm1CdW5kbGVfcHJvY2VzcyhpbkJ1ZmZlci0+ZjMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT5mMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXItPmZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dCk7CisjZWxzZQorICAgICAgICBwcm9jZXNzU3RhdHVzID0gYW5kcm9pZDo6THZtQnVuZGxlX3Byb2Nlc3MoaW5CdWZmZXItPnMxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+czE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT5mcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQpOworI2VuZGlmCiAgICAgICAgIGlmIChwcm9jZXNzU3RhdHVzICE9IDApewogICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogTHZtQnVuZGxlX3Byb2Nlc3MgcmV0dXJuZWQgZXJyb3IgJWQiLCBwcm9jZXNzU3RhdHVzKTsKICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gMCkgewpAQCAtMzM2NCwxNCArMzMzNSwxOSBAQAogICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9wcm9jZXNzIE5vdCBDYWxsaW5nIHByb2Nlc3Mgd2l0aCAlZCBlZmZlY3RzIGVuYWJsZWQsICVkIGNhbGxlZDogRWZmZWN0ICVkIiwKICAgICAgICAgLy9wQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZCwKICAgICAgICAgLy9wQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzQ2FsbGVkLCBwQ29udGV4dC0+RWZmZWN0VHlwZSk7Ci0gICAgICAgIC8vIDIgaXMgZm9yIHN0ZXJlbyBpbnB1dAorCiAgICAgICAgIGlmIChwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpIHsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCoyOyBpKyspewotICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+czE2W2ldID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYW1wMTYoKExWTV9JTlQzMilvdXRCdWZmZXItPnMxNltpXSArIChMVk1fSU5UMzIpaW5CdWZmZXItPnMxNltpXSk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCAqIEZDQ18yOyArK2kpeworI2lmZGVmIE5BVElWRV9GTE9BVF9CVUZGRVIKKyAgICAgICAgICAgICAgICBvdXRCdWZmZXItPmYzMltpXSArPSBpbkJ1ZmZlci0+ZjMyW2ldOworI2Vsc2UKKyAgICAgICAgICAgICAgICBvdXRCdWZmZXItPnMxNltpXSA9IGNsYW1wMTYoKExWTV9JTlQzMilvdXRCdWZmZXItPnMxNltpXSArIGluQnVmZmVyLT5zMTZbaV0pOworI2VuZGlmCiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAob3V0QnVmZmVyLT5yYXcgIT0gaW5CdWZmZXItPnJhdykgewotICAgICAgICAgICAgbWVtY3B5KG91dEJ1ZmZlci0+cmF3LCBpbkJ1ZmZlci0+cmF3LCBvdXRCdWZmZXItPmZyYW1lQ291bnQqc2l6ZW9mKExWTV9JTlQxNikqMik7CisgICAgICAgICAgICBtZW1jcHkob3V0QnVmZmVyLT5yYXcsCisgICAgICAgICAgICAgICAgICAgIGluQnVmZmVyLT5yYXcsCisgICAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+ZnJhbWVDb3VudCAqIHNpemVvZihlZmZlY3RfYnVmZmVyX3QpICogRkNDXzIpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5oCmluZGV4IDI5MTM4M2EuLjZiZjA0NWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5oCkBAIC05NSw3ICs5NSw3IEBACiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVzVG9FeGl0Q291bnRFcTsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZXNUb0V4aXRDb3VudEJiOwogICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlc1RvRXhpdENvdW50VmlydDsKLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICp3b3JrQnVmZmVyOworICAgIGVmZmVjdF9idWZmZXJfdCAgICAgICAgICAgICAgICAgKndvcmtCdWZmZXI7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50OwogICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgYmFuZEdhaW5kQltGSVZFQkFORF9OVU1CQU5EU107CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWU7CkBAIC0xMDMsMTAgKzEwMywxMCBAQAogICAgIEZJTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlBjbUluUHRyOwogICAgIEZJTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlBjbU91dFB0cjsKICAgICAjZW5kaWYKLSAgICAjaWZkZWYgQlVJTERfRkxPQVQKKyNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiAhZGVmaW5lZChOQVRJVkVfRkxPQVRfQlVGRkVSKQogICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgKnBJbnB1dEJ1ZmZlcjsKICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICpwT3V0cHV0QnVmZmVyOwotICAgICNlbmRpZgorI2VuZGlmCiB9OwogCiAvKiBTZXNzaW9uQ29udGV4dCA6IE9uZSBzZXNzaW9uICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcAppbmRleCAzZDhlOTgyLi5lMWMwM2Y5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KIAorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KICNpbmNsdWRlIDxsb2cvbG9nLmg+CiAKICNpbmNsdWRlICJFZmZlY3RSZXZlcmIuaCIKQEAgLTEzNSw2ICsxMzYsMTIgQEAKICAgICAgICAgJmdJbnNlcnRQcmVzZXRSZXZlcmJEZXNjcmlwdG9yCiB9OwogCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgICAgIGZsb2F0ICAgICAgICAgICAgICAgcHJvY2Vzc19idWZmZXJfdDsgLy8gcHJvY2VzcyBpbiBmbG9hdAorI2Vsc2UKK3R5cGVkZWYgICAgIGludDMyX3QgICAgICAgICAgICAgcHJvY2Vzc19idWZmZXJfdDsgLy8gcHJvY2VzcyBpbiBRNF8yNworI2VuZGlmIC8vIEJVSUxEX0ZMT0FUCisKIHN0cnVjdCBSZXZlcmJDb250ZXh0ewogICAgIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgKml0ZmU7CiAgICAgZWZmZWN0X2NvbmZpZ190ICAgICAgICAgICAgICAgICBjb25maWc7CkBAIC0xNTIsOCArMTU5LDggQEAKICAgICBGSUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICpQY21PdXRQdHI7CiAgICAgI2VuZGlmCiAgICAgTFZNX0ZzX2VuICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVSYXRlOwotICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgICAgKkluRnJhbWVzMzI7Ci0gICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAgICAqT3V0RnJhbWVzMzI7CisgICAgcHJvY2Vzc19idWZmZXJfdCAgICAgICAgICAgICAgICAqSW5GcmFtZXM7CisgICAgcHJvY2Vzc19idWZmZXJfdCAgICAgICAgICAgICAgICAqT3V0RnJhbWVzOwogICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZUluOwogICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZU91dDsKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1eGlsaWFyeTsKQEAgLTI2Miw3ICsyNjksNyBAQAogCiAgICAgKnBIYW5kbGUgPSAoZWZmZWN0X2hhbmRsZV90KXBDb250ZXh0OwogCi0gICAgI2lmZGVmIExWTV9QQ00KKyNpZmRlZiBMVk1fUENNCiAgICAgcENvbnRleHQtPlBjbUluUHRyID0gTlVMTDsKICAgICBwQ29udGV4dC0+UGNtT3V0UHRyID0gTlVMTDsKIApAQCAtMjczLDE5ICsyODAsMTUgQEAKICAgICAgICAocENvbnRleHQtPlBjbU91dFB0ciA9PSBOVUxMKSl7CiAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQotICAgICNlbmRpZgorI2VuZGlmCiAKKyAgICBpbnQgY2hhbm5lbHMgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2socENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyk7CiAKICAgICAvLyBBbGxvY2F0ZSBtZW1vcnkgZm9yIHJldmVyYiBwcm9jZXNzICgqMiBpcyBmb3IgU1RFUkVPKQotI2lmZGVmIEJVSUxEX0ZMT0FUCi0gICAgcENvbnRleHQtPmJ1ZmZlclNpemVJbiA9IExWUkVWX01BWF9GUkFNRV9TSVpFICogc2l6ZW9mKGZsb2F0KSAqIDI7Ci0gICAgcENvbnRleHQtPmJ1ZmZlclNpemVPdXQgPSBwQ29udGV4dC0+YnVmZmVyU2l6ZUluOwotI2Vsc2UKLSAgICBwQ29udGV4dC0+YnVmZmVyU2l6ZUluID0gTFZSRVZfTUFYX0ZSQU1FX1NJWkUgKiBzaXplb2YoTFZNX0lOVDMyKSAqIDI7Ci0gICAgcENvbnRleHQtPmJ1ZmZlclNpemVPdXQgPSBwQ29udGV4dC0+YnVmZmVyU2l6ZUluOwotI2VuZGlmCi0gICAgcENvbnRleHQtPkluRnJhbWVzMzIgID0gKExWTV9JTlQzMiAqKW1hbGxvYyhwQ29udGV4dC0+YnVmZmVyU2l6ZUluKTsKLSAgICBwQ29udGV4dC0+T3V0RnJhbWVzMzIgPSAoTFZNX0lOVDMyICopbWFsbG9jKHBDb250ZXh0LT5idWZmZXJTaXplT3V0KTsKKyAgICBwQ29udGV4dC0+YnVmZmVyU2l6ZUluID0gTFZSRVZfTUFYX0ZSQU1FX1NJWkUgKiBzaXplb2YocHJvY2Vzc19idWZmZXJfdCkgKiBjaGFubmVsczsKKyAgICBwQ29udGV4dC0+YnVmZmVyU2l6ZU91dCA9IExWUkVWX01BWF9GUkFNRV9TSVpFICogc2l6ZW9mKHByb2Nlc3NfYnVmZmVyX3QpICogRkNDXzI7CisgICAgcENvbnRleHQtPkluRnJhbWVzICA9IChwcm9jZXNzX2J1ZmZlcl90ICopY2FsbG9jKHBDb250ZXh0LT5idWZmZXJTaXplSW4sIDEgLyogc2l6ZSAqLyk7CisgICAgcENvbnRleHQtPk91dEZyYW1lcyA9IChwcm9jZXNzX2J1ZmZlcl90ICopY2FsbG9jKHBDb250ZXh0LT5idWZmZXJTaXplT3V0LCAxIC8qIHNpemUgKi8pOwogCiAgICAgQUxPR1YoIlx0RWZmZWN0Q3JlYXRlICVwLCBzaXplICV6dSIsIHBDb250ZXh0LCBzaXplb2YoUmV2ZXJiQ29udGV4dCkpOwogICAgIEFMT0dWKCJcdEVmZmVjdENyZWF0ZSBlbmRcbiIpOwpAQCAtMzA1LDggKzMwOCw4IEBACiAgICAgZmNsb3NlKHBDb250ZXh0LT5QY21JblB0cik7CiAgICAgZmNsb3NlKHBDb250ZXh0LT5QY21PdXRQdHIpOwogICAgICNlbmRpZgotICAgIGZyZWUocENvbnRleHQtPkluRnJhbWVzMzIpOwotICAgIGZyZWUocENvbnRleHQtPk91dEZyYW1lczMyKTsKKyAgICBmcmVlKHBDb250ZXh0LT5JbkZyYW1lcyk7CisgICAgZnJlZShwQ29udGV4dC0+T3V0RnJhbWVzKTsKICAgICBwQ29udGV4dC0+YnVmZmVyU2l6ZUluID0gMDsKICAgICBwQ29udGV4dC0+YnVmZmVyU2l6ZU91dCA9IDA7CiAgICAgUmV2ZXJiX2ZyZWUocENvbnRleHQpOwpAQCAtMzQ0LDExNCArMzQ3LDYgQEAKICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiB9CiAKLSNpZiAwCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE1vbm9UbzJJXzMyKCkKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gUHVycG9zZToKLS8vICBDb252ZXJ0IE1PTk8gdG8gU1RFUkVPCi0vLwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgTW9ub1RvMklfMzIoIGNvbnN0IExWTV9JTlQzMiAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKQotewotICAgTFZNX0lOVDE2IGlpOwotICAgc3JjICs9IChuLTEpOwotICAgZHN0ICs9ICgobioyKS0xKTsKLQotICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCi0gICB7Ci0gICAgICAgKmRzdCA9ICpzcmM7Ci0gICAgICAgZHN0LS07Ci0KLSAgICAgICAqZHN0ID0gKnNyYzsKLSAgICAgICBkc3QtLTsKLSAgICAgICBzcmMtLTsKLSAgIH0KLQotICAgcmV0dXJuOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEZyb20yaVRvTW9ub18zMigpCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFB1cnBvc2U6Ci0vLyAgQ29udmVydCBTVEVSRU8gdG8gTU9OTwotLy8KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIEZyb20yaVRvTW9ub18zMiggY29uc3QgTFZNX0lOVDMyICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pCi17Ci0gICBMVk1fSU5UMTYgaWk7Ci0gICBMVk1fSU5UMzIgVGVtcDsKLQotICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCi0gICB7Ci0gICAgICAgVGVtcCA9ICgqc3JjPj4xKTsKLSAgICAgICBzcmMrKzsKLQotICAgICAgIFRlbXAgKz0oKnNyYz4+MSk7Ci0gICAgICAgc3JjKys7Ci0KLSAgICAgICAqZHN0ID0gVGVtcDsKLSAgICAgICBkc3QrKzsKLSAgIH0KLQotICAgcmV0dXJuOwotfQotI2VuZGlmCi0KLSNpZmRlZiBCVUlMRF9GTE9BVAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIEZVTkNUSU9OIElOVDE2TFRPRkxPQVQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLy8gVG9kbzogbmVlZCB0byB3cml0ZSBmdW5jdGlvbiBkZXNjcmlwdG9yCi1zdGF0aWMgdm9pZCBJbnQxNlRvRmxvYXQoY29uc3QgTFZNX0lOVDE2ICpzcmMsIExWTV9GTE9BVCAqZHN0LCBzaXplX3QgbikgewotICAgIHNpemVfdCBpaTsKLSAgICBzcmMgKz0gbi0xOwotICAgIGRzdCArPSBuLTE7Ci0gICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pIHsKLSAgICAgICAgKmRzdCA9ICgoTFZNX0ZMT0FUKSgoTFZNX0lOVDE2KSpzcmMpKSAvIDMyNzY4LjBmOwotICAgICAgICBzcmMtLTsKLSAgICAgICAgZHN0LS07Ci0gICAgfQotICAgIHJldHVybjsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBGVU5DVElPTiBGTE9BVFRPSU5UMTZfU0FUCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8vIFRvZG8gOiBOZWVkIHRvIHdyaXRlIGZ1bmN0aW9uIGRlc2NyaXB0b3IKLXN0YXRpYyB2b2lkIEZsb2F0VG9JbnQxNl9TQVQoY29uc3QgTFZNX0ZMT0FUICpzcmMsIExWTV9JTlQxNiAqZHN0LCBzaXplX3QgbikgewotICAgIHNpemVfdCBpaTsKLSAgICBMVk1fSU5UMzIgdGVtcDsKLQotICAgIGZvciAoaWkgPSAwOyBpaSA8IG47IGlpKyspIHsKLSAgICAgICAgdGVtcCA9IChMVk1fSU5UMzIpKCgqc3JjKSAqIDMyNzY4LjBmKTsKLSAgICAgICAgaWYgKHRlbXAgPj0gMzI3NjcpIHsKLSAgICAgICAgICAgICpkc3QgPSAzMjc2NzsKLSAgICAgICAgfSBlbHNlIGlmICh0ZW1wIDw9IC0zMjc2OCkgewotICAgICAgICAgICAgKmRzdCA9IC0zMjc2ODsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICpkc3QgPSAoTFZNX0lOVDE2KXRlbXA7Ci0gICAgICAgIH0KLSAgICAgICAgc3JjKys7Ci0gICAgICAgIGRzdCsrOwotICAgIH0KLSAgICByZXR1cm47Ci19Ci0jZW5kaWYKLQotc3RhdGljIGlubGluZSBpbnQxNl90IGNsYW1wMTYoaW50MzJfdCBzYW1wbGUpCi17Ci0gICAgaWYgKChzYW1wbGU+PjE1KSBeIChzYW1wbGU+PjMxKSkKLSAgICAgICAgc2FtcGxlID0gMHg3RkZGIF4gKHNhbXBsZT4+MzEpOwotICAgIHJldHVybiBzYW1wbGU7Ci19Ci0KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gcHJvY2VzcygpCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTQ1OSw4ICszNTQsOCBAQAogLy8gQXBwbHkgdGhlIFJldmVyYgogLy8KIC8vIElucHV0czoKLS8vICBwSW46ICAgICAgICBwb2ludGVyIHRvIHN0ZXJlby9tb25vIDE2IGJpdCBpbnB1dCBkYXRhCi0vLyAgcE91dDogICAgICAgcG9pbnRlciB0byBzdGVyZW8gMTYgYml0IG91dHB1dCBkYXRhCisvLyAgcEluOiAgICAgICAgcG9pbnRlciB0byBzdGVyZW8vbW9ubyBmbG9hdCBvciAxNiBiaXQgaW5wdXQgZGF0YQorLy8gIHBPdXQ6ICAgICAgIHBvaW50ZXIgdG8gc3RlcmVvIGZsb2F0IG9yIDE2IGJpdCBvdXRwdXQgZGF0YQogLy8gIGZyYW1lQ291bnQ6IEZyYW1lcyB0byBwcm9jZXNzCiAvLyAgcENvbnRleHQ6ICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CiAvLyAgc3RyZW5ndGggICAgc3RyZW5ndGggdG8gYmUgYXBwbGllZApAQCAtNDY5LDExNiArMzY0LDEwNyBAQAogLy8gIHBPdXQ6ICAgICAgIHBvaW50ZXIgdG8gdXBkYXRlZCBzdGVyZW8gMTYgYml0IG91dHB1dCBkYXRhCiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWludCBwcm9jZXNzKCBMVk1fSU5UMTYgICAgICpwSW4sCi0gICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAqcE91dCwKK2ludCBwcm9jZXNzKCBlZmZlY3RfYnVmZmVyX3QgICAqcEluLAorICAgICAgICAgICAgIGVmZmVjdF9idWZmZXJfdCAgICpwT3V0LAogICAgICAgICAgICAgIGludCAgICAgICAgICAgZnJhbWVDb3VudCwKICAgICAgICAgICAgICBSZXZlcmJDb250ZXh0ICpwQ29udGV4dCl7CiAKLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUgPSAxOworICAgIGludCBjaGFubmVscyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzKTsKICAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gICBMdm1TdGF0dXMgPSBMVlJFVl9TVUNDRVNTOyAgICAgICAgICAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KLSAgICBMVk1fSU5UMTYgKk91dEZyYW1lczE2OwotI2lmZGVmIEJVSUxEX0ZMT0FUCi0gICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBJbnB1dEJ1ZmY7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBPdXRwdXRCdWZmOwotI2VuZGlmCiAKLSNpZmRlZiBCVUlMRF9GTE9BVAotICAgIGlmIChwQ29udGV4dC0+SW5GcmFtZXMzMiA9PSBOVUxMIHx8Ci0gICAgICAgICAgICBwQ29udGV4dC0+YnVmZmVyU2l6ZUluIDwgZnJhbWVDb3VudCAqIHNpemVvZihmbG9hdCkgKiAyKSB7Ci0gICAgICAgIGlmIChwQ29udGV4dC0+SW5GcmFtZXMzMiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBmcmVlKHBDb250ZXh0LT5JbkZyYW1lczMyKTsKLSAgICAgICAgfQotICAgICAgICBwQ29udGV4dC0+YnVmZmVyU2l6ZUluID0gZnJhbWVDb3VudCAqIHNpemVvZihmbG9hdCkgKiAyOwotICAgICAgICBwQ29udGV4dC0+SW5GcmFtZXMzMiA9IChMVk1fSU5UMzIgKiltYWxsb2MocENvbnRleHQtPmJ1ZmZlclNpemVJbik7Ci0gICAgfQotICAgIGlmIChwQ29udGV4dC0+T3V0RnJhbWVzMzIgPT0gTlVMTCB8fAotICAgICAgICAgICAgcENvbnRleHQtPmJ1ZmZlclNpemVPdXQgPCBmcmFtZUNvdW50ICogc2l6ZW9mKGZsb2F0KSAqIDIpIHsKLSAgICAgICAgaWYgKHBDb250ZXh0LT5PdXRGcmFtZXMzMiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBmcmVlKHBDb250ZXh0LT5PdXRGcmFtZXMzMik7Ci0gICAgICAgIH0KLSAgICAgICAgcENvbnRleHQtPmJ1ZmZlclNpemVPdXQgPSBmcmFtZUNvdW50ICogc2l6ZW9mKGZsb2F0KSAqIDI7Ci0gICAgICAgIHBDb250ZXh0LT5PdXRGcmFtZXMzMiA9IChMVk1fSU5UMzIgKiltYWxsb2MocENvbnRleHQtPmJ1ZmZlclNpemVPdXQpOwotICAgIH0KLSAgICBwSW5wdXRCdWZmID0gKGZsb2F0ICopcENvbnRleHQtPkluRnJhbWVzMzI7Ci0gICAgcE91dHB1dEJ1ZmYgPSAoZmxvYXQgKilwQ29udGV4dC0+T3V0RnJhbWVzMzI7Ci0jZW5kaWYKICAgICAvLyBDaGVjayB0aGF0IHRoZSBpbnB1dCBpcyBlaXRoZXIgbW9ubyBvciBzdGVyZW8KLSAgICBpZiAocENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9PSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pIHsKLSAgICAgICAgc2FtcGxlc1BlckZyYW1lID0gMjsKLSAgICB9IGVsc2UgaWYgKHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgIT0gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTykgewotICAgICAgICBBTE9HVigiXHRMVlJFVl9FUlJPUiA6IHByb2Nlc3MgaW52YWxpZCBQQ00gZm9ybWF0Iik7CisgICAgaWYgKCEoY2hhbm5lbHMgPT0gMSB8fCBjaGFubmVscyA9PSBGQ0NfMikgKSB7CisgICAgICAgIEFMT0dFKCJcdExWUkVWX0VSUk9SIDogcHJvY2VzcyBpbnZhbGlkIFBDTSBmb3JtYXQiKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCi0gICAgT3V0RnJhbWVzMTYgPSAoTFZNX0lOVDE2ICopcENvbnRleHQtPk91dEZyYW1lczMyOworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgc2l6ZV90IGluU2l6ZSA9IGZyYW1lQ291bnQgKiBzaXplb2YocHJvY2Vzc19idWZmZXJfdCkgKiBjaGFubmVsczsKKyAgICBzaXplX3Qgb3V0U2l6ZSA9IGZyYW1lQ291bnQgKiBzaXplb2YocHJvY2Vzc19idWZmZXJfdCkgKiBGQ0NfMjsKKyAgICBpZiAocENvbnRleHQtPkluRnJhbWVzID09IE5VTEwgfHwKKyAgICAgICAgICAgIHBDb250ZXh0LT5idWZmZXJTaXplSW4gPCBpblNpemUpIHsKKyAgICAgICAgZnJlZShwQ29udGV4dC0+SW5GcmFtZXMpOworICAgICAgICBwQ29udGV4dC0+YnVmZmVyU2l6ZUluID0gaW5TaXplOworICAgICAgICBwQ29udGV4dC0+SW5GcmFtZXMgPSAocHJvY2Vzc19idWZmZXJfdCAqKWNhbGxvYygxLCBwQ29udGV4dC0+YnVmZmVyU2l6ZUluKTsKKyAgICB9CisgICAgaWYgKHBDb250ZXh0LT5PdXRGcmFtZXMgPT0gTlVMTCB8fAorICAgICAgICAgICAgcENvbnRleHQtPmJ1ZmZlclNpemVPdXQgPCBvdXRTaXplKSB7CisgICAgICAgIGZyZWUocENvbnRleHQtPk91dEZyYW1lcyk7CisgICAgICAgIHBDb250ZXh0LT5idWZmZXJTaXplT3V0ID0gb3V0U2l6ZTsKKyAgICAgICAgcENvbnRleHQtPk91dEZyYW1lcyA9IChwcm9jZXNzX2J1ZmZlcl90ICopY2FsbG9jKDEsIHBDb250ZXh0LT5idWZmZXJTaXplT3V0KTsKKyAgICB9CisKKyNpZm5kZWYgTkFUSVZFX0ZMT0FUX0JVRkZFUgorICAgIGVmZmVjdF9idWZmZXJfdCAqIGNvbnN0IE91dEZyYW1lczE2ID0gKGVmZmVjdF9idWZmZXJfdCAqKXBDb250ZXh0LT5PdXRGcmFtZXM7CisjZW5kaWYKKyNlbmRpZgogCiAgICAgLy8gQ2hlY2sgZm9yIE5VTEwgcG9pbnRlcnMKLSAgICBpZigocENvbnRleHQtPkluRnJhbWVzMzIgPT0gTlVMTCl8fChwQ29udGV4dC0+T3V0RnJhbWVzMzIgPT0gTlVMTCkpewotICAgICAgICBBTE9HVigiXHRMVlJFVl9FUlJPUiA6IHByb2Nlc3MgZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGVtcG9yYXJ5IGJ1ZmZlcnMgIik7CisgICAgaWYgKChwQ29udGV4dC0+SW5GcmFtZXMgPT0gTlVMTCkgfHwgKHBDb250ZXh0LT5PdXRGcmFtZXMgPT0gTlVMTCkpIHsKKyAgICAgICAgQUxPR0UoIlx0TFZSRVZfRVJST1IgOiBwcm9jZXNzIGZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRlbXBvcmFyeSBidWZmZXJzICIpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKLSAgICAjaWZkZWYgTFZNX1BDTQotICAgIGZ3cml0ZShwSW4sIGZyYW1lQ291bnQqc2l6ZW9mKExWTV9JTlQxNikqc2FtcGxlc1BlckZyYW1lLCAxLCBwQ29udGV4dC0+UGNtSW5QdHIpOworI2lmZGVmIExWTV9QQ00KKyAgICBmd3JpdGUocEluLCBmcmFtZUNvdW50ICogc2l6ZW9mKCpwSW4pICogY2hhbm5lbHMsIDEgLyogbm1lbWIgKi8sIHBDb250ZXh0LT5QY21JblB0cik7CiAgICAgZmZsdXNoKHBDb250ZXh0LT5QY21JblB0cik7Ci0gICAgI2VuZGlmCisjZW5kaWYKIAogICAgIGlmIChwQ29udGV4dC0+cHJlc2V0ICYmIHBDb250ZXh0LT5uZXh0UHJlc2V0ICE9IHBDb250ZXh0LT5jdXJQcmVzZXQpIHsKICAgICAgICAgUmV2ZXJiX0xvYWRQcmVzZXQocENvbnRleHQpOwogICAgIH0KIAotICAgIC8vIENvbnZlcnQgdG8gSW5wdXQgMzIgYml0cwogICAgIGlmIChwQ29udGV4dC0+YXV4aWxpYXJ5KSB7CiAjaWZkZWYgQlVJTERfRkxPQVQKLSAgICAgICAgSW50MTZUb0Zsb2F0KHBJbiwgcElucHV0QnVmZiwgZnJhbWVDb3VudCAqIHNhbXBsZXNQZXJGcmFtZSk7CisjaWZkZWYgTkFUSVZFX0ZMT0FUX0JVRkZFUgorICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZSgqcEluKSwgZGVjbHR5cGUoKnBDb250ZXh0LT5JbkZyYW1lcyk+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAicEluIGFuZCBJbkZyYW1lcyBtdXN0IGJlIHNhbWUgdHlwZSIpOworICAgICAgICBtZW1jcHkocENvbnRleHQtPkluRnJhbWVzLCBwSW4sIGZyYW1lQ291bnQgKiBjaGFubmVscyAqIHNpemVvZigqcEluKSk7CiAjZWxzZQotICAgICAgICBmb3IoaW50IGk9MDsgaTxmcmFtZUNvdW50KnNhbXBsZXNQZXJGcmFtZTsgaSsrKXsKLSAgICAgICAgICAgIHBDb250ZXh0LT5JbkZyYW1lczMyW2ldID0gKExWTV9JTlQzMilwSW5baV08PDg7CisgICAgICAgIG1lbWNweV90b19mbG9hdF9mcm9tX2kxNigKKyAgICAgICAgICAgICAgICBwQ29udGV4dC0+SW5GcmFtZXMsIHBJbiwgZnJhbWVDb3VudCAqIGNoYW5uZWxzKTsKKyNlbmRpZgorI2Vsc2UgLy9ubyBCVUlMRF9GTE9BVAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lQ291bnQgKiBjaGFubmVsczsgaSsrKSB7CisgICAgICAgICAgICBwQ29udGV4dC0+SW5GcmFtZXNbaV0gPSAocHJvY2Vzc19idWZmZXJfdClwSW5baV08PDg7CiAgICAgICAgIH0KICNlbmRpZgogICAgICAgICB9IGVsc2UgewogICAgICAgICAvLyBpbnNlcnQgcmV2ZXJiIGlucHV0IGlzIGFsd2F5cyBzdGVyZW8KICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUNvdW50OyBpKyspIHsKLSNpZm5kZWYgQlVJTERfRkxPQVQKLSAgICAgICAgICAgIHBDb250ZXh0LT5JbkZyYW1lczMyWzIqaV0gPSAocEluWzIqaV0gKiBSRVZFUkJfU0VORF9MRVZFTCkgPj4gNDsgLy8gPDw4ICsgPj4xMgotICAgICAgICAgICAgcENvbnRleHQtPkluRnJhbWVzMzJbMippKzFdID0gKHBJblsyKmkrMV0gKiBSRVZFUkJfU0VORF9MRVZFTCkgPj4gNDsgLy8gPDw4ICsgPj4xMgorI2lmZGVmIEJVSUxEX0ZMT0FUCisjaWZkZWYgTkFUSVZFX0ZMT0FUX0JVRkZFUgorICAgICAgICAgICAgcENvbnRleHQtPkluRnJhbWVzWzIgKiBpXSA9IChwcm9jZXNzX2J1ZmZlcl90KXBJblsyICogaV0gKiBSRVZFUkJfU0VORF9MRVZFTDsKKyAgICAgICAgICAgIHBDb250ZXh0LT5JbkZyYW1lc1syICogaSArIDFdID0gKHByb2Nlc3NfYnVmZmVyX3QpcEluWzIgKiBpICsgMV0gKiBSRVZFUkJfU0VORF9MRVZFTDsKICNlbHNlCi0gICAgICAgICAgICBwSW5wdXRCdWZmWzIgKiBpXSA9IChMVk1fRkxPQVQpcEluWzIgKiBpXSAqIFJFVkVSQl9TRU5EX0xFVkVMIC8gMzI3NjguMGY7Ci0gICAgICAgICAgICBwSW5wdXRCdWZmWzIgKiBpICsgMV0gPSAoTFZNX0ZMT0FUKXBJblsyICogaSArIDFdICogUkVWRVJCX1NFTkRfTEVWRUwgLyAzMjc2OC4wZjsKKyAgICAgICAgICAgIHBDb250ZXh0LT5JbkZyYW1lc1syICogaV0gPQorICAgICAgICAgICAgICAgICAgICAocHJvY2Vzc19idWZmZXJfdClwSW5bMiAqIGldICogUkVWRVJCX1NFTkRfTEVWRUwgLyAzMjc2OC4wZjsKKyAgICAgICAgICAgIHBDb250ZXh0LT5JbkZyYW1lc1syICogaSArIDFdID0KKyAgICAgICAgICAgICAgICAgICAgKHByb2Nlc3NfYnVmZmVyX3QpcEluWzIgKiBpICsgMV0gKiBSRVZFUkJfU0VORF9MRVZFTCAvIDMyNzY4LjBmOworI2VuZGlmCisjZWxzZQorICAgICAgICAgICAgcENvbnRleHQtPkluRnJhbWVzWzIqaV0gPSAocEluWzIqaV0gKiBSRVZFUkJfU0VORF9MRVZFTCkgPj4gNDsgLy8gPDw4ICsgPj4xMgorICAgICAgICAgICAgcENvbnRleHQtPkluRnJhbWVzWzIqaSsxXSA9IChwSW5bMippKzFdICogUkVWRVJCX1NFTkRfTEVWRUwpID4+IDQ7IC8vIDw8OCArID4+MTIKICNlbmRpZgogICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKHBDb250ZXh0LT5wcmVzZXQgJiYgcENvbnRleHQtPmN1clByZXNldCA9PSBSRVZFUkJfUFJFU0VUX05PTkUpIHsKLSNpZmRlZiBCVUlMRF9GTE9BVAotICAgICAgICBtZW1zZXQocE91dHB1dEJ1ZmYsIDAsIGZyYW1lQ291bnQgKiBzaXplb2YoTFZNX0ZMT0FUKSAqIDIpOyAvL2Fsd2F5cyBzdGVyZW8gaGVyZQotI2Vsc2UKLSAgICAgICAgbWVtc2V0KHBDb250ZXh0LT5PdXRGcmFtZXMzMiwgMCwgZnJhbWVDb3VudCAqIHNpemVvZihMVk1fSU5UMzIpICogMik7IC8vYWx3YXlzIHN0ZXJlbyBoZXJlCi0jZW5kaWYKKyAgICAgICAgbWVtc2V0KHBDb250ZXh0LT5PdXRGcmFtZXMsIDAsCisgICAgICAgICAgICAgICAgZnJhbWVDb3VudCAqIHNpemVvZigqcENvbnRleHQtPk91dEZyYW1lcykgKiBGQ0NfMik7IC8vYWx3YXlzIHN0ZXJlbyBoZXJlCiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYocENvbnRleHQtPmJFbmFibGVkID09IExWTV9GQUxTRSAmJiBwQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50ID4gMCkgewotI2lmZGVmIEJVSUxEX0ZMT0FUCi0gICAgICAgICAgICBtZW1zZXQocElucHV0QnVmZiwgMCwgZnJhbWVDb3VudCAqIHNpemVvZihMVk1fRkxPQVQpICogc2FtcGxlc1BlckZyYW1lKTsKLSNlbHNlCi0gICAgICAgICAgICBtZW1zZXQocENvbnRleHQtPkluRnJhbWVzMzIsMCxmcmFtZUNvdW50ICogc2l6ZW9mKExWTV9JTlQzMikgKiBzYW1wbGVzUGVyRnJhbWUpOwotI2VuZGlmCi0gICAgICAgICAgICBBTE9HVigiXHRaZXJvaW5nICVkIHNhbXBsZXMgcGVyIGZyYW1lIGF0IHRoZSBlbmQgb2YgY2FsbCIsIHNhbXBsZXNQZXJGcmFtZSk7CisgICAgICAgICAgICBtZW1zZXQocENvbnRleHQtPkluRnJhbWVzLCAwLAorICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50ICogc2l6ZW9mKCpwQ29udGV4dC0+T3V0RnJhbWVzKSAqIGNoYW5uZWxzKTsKKyAgICAgICAgICAgIEFMT0dWKCJcdFplcm9pbmcgJWQgc2FtcGxlcyBwZXIgZnJhbWUgYXQgdGhlIGVuZCBvZiBjYWxsIiwgY2hhbm5lbHMpOwogICAgICAgICB9CiAKICAgICAgICAgLyogUHJvY2VzcyB0aGUgc2FtcGxlcywgcHJvZHVjaW5nIGEgc3RlcmVvIG91dHB1dCAqLwotI2lmZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIEx2bVN0YXR1cyA9IExWUkVWX1Byb2Nlc3MocENvbnRleHQtPmhJbnN0YW5jZSwgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5wdXRCdWZmLCAgICAgLyogSW5wdXQgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dHB1dEJ1ZmYsICAgIC8qIE91dHB1dCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+SW5GcmFtZXMsICAgICAvKiBJbnB1dCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+T3V0RnJhbWVzLCAgICAvKiBPdXRwdXQgYnVmZmVyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCk7ICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byByZWFkICovCi0jZWxzZQotICAgICAgICBMdm1TdGF0dXMgPSBMVlJFVl9Qcm9jZXNzKHBDb250ZXh0LT5oSW5zdGFuY2UsICAgICAgLyogSW5zdGFuY2UgaGFuZGxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPkluRnJhbWVzMzIsICAgICAvKiBJbnB1dCBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+T3V0RnJhbWVzMzIsICAgIC8qIE91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50KTsgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHJlYWQgKi8KLSNlbmRpZgotICAgICAgICB9CisgICAgfQogCiAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX1Byb2Nlc3MiLCAicHJvY2VzcyIpCiAgICAgaWYoTHZtU3RhdHVzICE9IExWUkVWX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOwpAQCAtNTg2LDU1ICs0NzIsODcgQEAKICAgICAvLyBDb252ZXJ0IHRvIDE2IGJpdHMKICAgICBpZiAocENvbnRleHQtPmF1eGlsaWFyeSkgewogI2lmZGVmIEJVSUxEX0ZMT0FUCi0gICAgICAgIEZsb2F0VG9JbnQxNl9TQVQocE91dHB1dEJ1ZmYsIE91dEZyYW1lczE2LCAoc2l6ZV90KWZyYW1lQ291bnQgKiAyKTsKLSNlbHNlCi0gICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGZyYW1lQ291bnQqMjsgaSsrKSB7IC8vYWx3YXlzIHN0ZXJlbyBoZXJlCi0gICAgICAgICAgICBPdXRGcmFtZXMxNltpXSA9IGNsYW1wMTYocENvbnRleHQtPk91dEZyYW1lczMyW2ldPj44KTsKLSAgICAgICAgfQorICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmUKKyNpZm5kZWYgTkFUSVZFX0ZMT0FUX0JVRkZFUgorICAgICAgICAvLyBwQ29udGV4dC0+T3V0RnJhbWVzIGFuZCBPdXRGcmFtZXMxNiBwb2ludCB0byB0aGUgc2FtZSBidWZmZXIKKyAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBmbG9hdCB0byBpbnQgY29udmVyc2lvbiBoYXBwZW5zIGluIHRoZSByaWdodCBvcmRlci4KKyAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX2Zsb2F0KE91dEZyYW1lczE2LCBwQ29udGV4dC0+T3V0RnJhbWVzLAorICAgICAgICAgICAgICAgIChzaXplX3QpZnJhbWVDb3VudCAqIEZDQ18yKTsKICNlbmRpZgotICAgICAgICB9IGVsc2UgewotI2lmZGVmIEJVSUxEX0ZMT0FUCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lQ291bnQgKiAyOyBpKyspIHsvL2Fsd2F5cyBzdGVyZW8gaGVyZQotICAgICAgICAgICAgICAgIC8vcE91dHB1dEJ1ZmYgYW5kIE91dEZyYW1lczE2IHBvaW50IHRvIHRoZSBzYW1lIGJ1ZmZlciwgc28gYmV0dGVyIHRvCi0gICAgICAgICAgICAgICAgLy9hY2N1bXVsYXRlIGluIHBJbnB1dEJ1ZmYsIHdoaWNoIGlzIGF2YWlsYWJsZQotICAgICAgICAgICAgICAgIHBJbnB1dEJ1ZmZbaV0gPSBwT3V0cHV0QnVmZltpXSArIChMVk1fRkxPQVQpcEluW2ldIC8gMzI3NjguMGY7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEZsb2F0VG9JbnQxNl9TQVQocElucHV0QnVmZiwgT3V0RnJhbWVzMTYsIChzaXplX3QpZnJhbWVDb3VudCAqIDIpOwogI2Vsc2UKLSAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGZyYW1lQ291bnQqMjsgaSsrKSB7IC8vYWx3YXlzIHN0ZXJlbyBoZXJlCi0gICAgICAgICAgICAgICAgT3V0RnJhbWVzMTZbaV0gPSBjbGFtcDE2KChwQ29udGV4dC0+T3V0RnJhbWVzMzJbaV0+PjgpICsgKExWTV9JTlQzMilwSW5baV0pOwotICAgICAgICAgICAgfQorICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fcTRfMjcoT3V0RnJhbWVzMTYsIHBDb250ZXh0LT5PdXRGcmFtZXMsIChzaXplX3QpZnJhbWVDb3VudCAqIEZDQ18yKTsKKyNlbmRpZgorICAgIH0gZWxzZSB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyNpZmRlZiBOQVRJVkVfRkxPQVRfQlVGRkVSCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVDb3VudCAqIEZDQ18yOyBpKyspIHsgLy8gYWx3YXlzIHN0ZXJlbyBoZXJlCisgICAgICAgICAgICAvLyBNaXggd2l0aCBkcnkgaW5wdXQKKyAgICAgICAgICAgIHBDb250ZXh0LT5PdXRGcmFtZXNbaV0gKz0gcEluW2ldOworICAgICAgICB9CisjZWxzZQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lQ291bnQgKiBGQ0NfMjsgaSsrKSB7IC8vIGFsd2F5cyBzdGVyZW8gaGVyZQorICAgICAgICAgICAgLy8gcE91dHB1dEJ1ZmYgYW5kIE91dEZyYW1lczE2IHBvaW50IHRvIHRoZSBzYW1lIGJ1ZmZlcgorICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBmbG9hdCB0byBpbnQgY29udmVyc2lvbiBoYXBwZW5zIGluIHRoZSByaWdodCBvcmRlci4KKyAgICAgICAgICAgIHBDb250ZXh0LT5PdXRGcmFtZXNbaV0gKz0gKHByb2Nlc3NfYnVmZmVyX3QpcEluW2ldIC8gMzI3NjguMGY7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX2Zsb2F0KE91dEZyYW1lczE2LCBwQ29udGV4dC0+T3V0RnJhbWVzLAorICAgICAgICAgICAgICAgIChzaXplX3QpZnJhbWVDb3VudCAqIEZDQ18yKTsKKyNlbmRpZgorI2Vsc2UKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgZnJhbWVDb3VudCAqIEZDQ18yOyBpKyspIHsgLy8gYWx3YXlzIHN0ZXJlbyBoZXJlCisgICAgICAgICAgICBPdXRGcmFtZXMxNltpXSA9IGNsYW1wMTYoKHBDb250ZXh0LT5PdXRGcmFtZXNbaV0+PjgpICsgKHByb2Nlc3NfYnVmZmVyX3QpcEluW2ldKTsKKyAgICAgICAgfQogI2VuZGlmCiAgICAgICAgIC8vIGFwcGx5IHZvbHVtZSB3aXRoIHJhbXAgaWYgbmVlZGVkCiAgICAgICAgIGlmICgocENvbnRleHQtPmxlZnRWb2x1bWUgIT0gcENvbnRleHQtPnByZXZMZWZ0Vm9sdW1lIHx8CiAgICAgICAgICAgICAgICAgcENvbnRleHQtPnJpZ2h0Vm9sdW1lICE9IHBDb250ZXh0LT5wcmV2UmlnaHRWb2x1bWUpICYmCiAgICAgICAgICAgICAgICAgcENvbnRleHQtPnZvbHVtZU1vZGUgPT0gUkVWRVJCX1ZPTFVNRV9SQU1QKSB7CisjaWYgZGVmaW5lZCAoQlVJTERfRkxPQVQpICYmIGRlZmluZWQgKE5BVElWRV9GTE9BVF9CVUZGRVIpCisgICAgICAgICAgICAvLyBGSVhNRTogc3RpbGwgdXNpbmcgaW50MTYgdm9sdW1lcy4KKyAgICAgICAgICAgIC8vIEZvciByZWZlcmVuY2U6IFJFVkVSQl9VTklUX1ZPTFVNRSAgKDB4MTAwMCkgLy8gMS4wIGluIDQuMTIgZm9ybWF0CisgICAgICAgICAgICBmbG9hdCB2bCA9IChmbG9hdClwQ29udGV4dC0+cHJldkxlZnRWb2x1bWUgLyA0MDk2OworICAgICAgICAgICAgZmxvYXQgaW5jbCA9ICgoKGZsb2F0KXBDb250ZXh0LT5sZWZ0Vm9sdW1lIC8gNDA5NikgLSB2bCkgLyBmcmFtZUNvdW50OworICAgICAgICAgICAgZmxvYXQgdnIgPSAoZmxvYXQpcENvbnRleHQtPnByZXZSaWdodFZvbHVtZSAvIDQwOTY7CisgICAgICAgICAgICBmbG9hdCBpbmNyID0gKCgoZmxvYXQpcENvbnRleHQtPnJpZ2h0Vm9sdW1lIC8gNDA5NikgLSB2cikgLyBmcmFtZUNvdW50OworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIHBDb250ZXh0LT5PdXRGcmFtZXNbRkNDXzIgKiBpXSAqPSB2bDsKKyAgICAgICAgICAgICAgICBwQ29udGV4dC0+T3V0RnJhbWVzW0ZDQ18yICogaSArIDFdICo9IHZyOworCisgICAgICAgICAgICAgICAgdmwgKz0gaW5jbDsKKyAgICAgICAgICAgICAgICB2ciArPSBpbmNyOworICAgICAgICAgICAgfQorI2Vsc2UKICAgICAgICAgICAgIExWTV9JTlQzMiB2bCA9IChMVk1fSU5UMzIpcENvbnRleHQtPnByZXZMZWZ0Vm9sdW1lIDw8IDE2OwogICAgICAgICAgICAgTFZNX0lOVDMyIGluY2wgPSAoKChMVk1fSU5UMzIpcENvbnRleHQtPmxlZnRWb2x1bWUgPDwgMTYpIC0gdmwpIC8gZnJhbWVDb3VudDsKICAgICAgICAgICAgIExWTV9JTlQzMiB2ciA9IChMVk1fSU5UMzIpcENvbnRleHQtPnByZXZSaWdodFZvbHVtZSA8PCAxNjsKICAgICAgICAgICAgIExWTV9JTlQzMiBpbmNyID0gKCgoTFZNX0lOVDMyKXBDb250ZXh0LT5yaWdodFZvbHVtZSA8PCAxNikgLSB2cikgLyBmcmFtZUNvdW50OwogCiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lQ291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIE91dEZyYW1lczE2WzIqaV0gPQorICAgICAgICAgICAgICAgIE91dEZyYW1lczE2W0ZDQ18yICogaV0gPQogICAgICAgICAgICAgICAgICAgICAgICAgY2xhbXAxNigoTFZNX0lOVDMyKSgodmwgPj4gMTYpICogT3V0RnJhbWVzMTZbMippXSkgPj4gMTIpOwotICAgICAgICAgICAgICAgIE91dEZyYW1lczE2WzIqaSsxXSA9CisgICAgICAgICAgICAgICAgT3V0RnJhbWVzMTZbRkNDXzIgKiBpICsgMV0gPQogICAgICAgICAgICAgICAgICAgICAgICAgY2xhbXAxNigoTFZNX0lOVDMyKSgodnIgPj4gMTYpICogT3V0RnJhbWVzMTZbMippKzFdKSA+PiAxMik7CiAKICAgICAgICAgICAgICAgICB2bCArPSBpbmNsOwogICAgICAgICAgICAgICAgIHZyICs9IGluY3I7CiAgICAgICAgICAgICB9Ci0KKyNlbmRpZgogICAgICAgICAgICAgcENvbnRleHQtPnByZXZMZWZ0Vm9sdW1lID0gcENvbnRleHQtPmxlZnRWb2x1bWU7CiAgICAgICAgICAgICBwQ29udGV4dC0+cHJldlJpZ2h0Vm9sdW1lID0gcENvbnRleHQtPnJpZ2h0Vm9sdW1lOwogICAgICAgICB9IGVsc2UgaWYgKHBDb250ZXh0LT52b2x1bWVNb2RlICE9IFJFVkVSQl9WT0xVTUVfT0ZGKSB7CiAgICAgICAgICAgICBpZiAocENvbnRleHQtPmxlZnRWb2x1bWUgIT0gUkVWRVJCX1VOSVRfVk9MVU1FIHx8CiAgICAgICAgICAgICAgICAgcENvbnRleHQtPnJpZ2h0Vm9sdW1lICE9IFJFVkVSQl9VTklUX1ZPTFVNRSkgewogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIE91dEZyYW1lczE2WzIqaV0gPQorI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoTkFUSVZFX0ZMT0FUX0JVRkZFUikKKyAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPk91dEZyYW1lc1tGQ0NfMiAqIGldICo9ICgoZmxvYXQpcENvbnRleHQtPmxlZnRWb2x1bWUgLyA0MDk2KTsKKyAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPk91dEZyYW1lc1tGQ0NfMiAqIGkgKyAxXSAqPSAoKGZsb2F0KXBDb250ZXh0LT5yaWdodFZvbHVtZSAvIDQwOTYpOworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgT3V0RnJhbWVzMTZbRkNDXzIgKiBpXSA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhbXAxNigoTFZNX0lOVDMyKShwQ29udGV4dC0+bGVmdFZvbHVtZSAqIE91dEZyYW1lczE2WzIqaV0pID4+IDEyKTsKLSAgICAgICAgICAgICAgICAgICAgT3V0RnJhbWVzMTZbMippKzFdID0KKyAgICAgICAgICAgICAgICAgICAgT3V0RnJhbWVzMTZbRkNDXzIgKiBpICsgMV0gPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYW1wMTYoKExWTV9JTlQzMikocENvbnRleHQtPnJpZ2h0Vm9sdW1lICogT3V0RnJhbWVzMTZbMippKzFdKSA+PiAxMik7CisjZW5kaWYKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwQ29udGV4dC0+cHJldkxlZnRWb2x1bWUgPSBwQ29udGV4dC0+bGVmdFZvbHVtZTsKQEAgLTY0MywyMCArNTYxLDI1IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAjaWZkZWYgTFZNX1BDTQotICAgIGZ3cml0ZShPdXRGcmFtZXMxNiwgZnJhbWVDb3VudCpzaXplb2YoTFZNX0lOVDE2KSoyLCAxLCBwQ29udGV4dC0+UGNtT3V0UHRyKTsKKyNpZmRlZiBMVk1fUENNCisgICAgZndyaXRlKHBDb250ZXh0LT5PdXRGcmFtZXMsIGZyYW1lQ291bnQgKiBzaXplb2YoKnBDb250ZXh0LT5PdXRGcmFtZXMpICogRkNDXzIsCisgICAgICAgICAgICAxIC8qIG5tZW1iICovLCBwQ29udGV4dC0+UGNtT3V0UHRyKTsKICAgICBmZmx1c2gocENvbnRleHQtPlBjbU91dFB0cik7Ci0gICAgI2VuZGlmCisjZW5kaWYKIAogICAgIC8vIEFjY3VtdWxhdGUgaWYgcmVxdWlyZWQKICAgICBpZiAocENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKXsKICAgICAgICAgLy9BTE9HVigiXHRCdWZmZXIgYWNjZXNzIGlzIEFDQ1VNVUxBVEUiKTsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPGZyYW1lQ291bnQqMjsgaSsrKXsgLy9hbHdheXMgc3RlcmVvIGhlcmUKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUNvdW50ICogRkNDXzI7IGkrKykgeyAvLyBhbHdheXMgc3RlcmVvIGhlcmUKKyNpZm5kZWYgTkFUSVZFX0ZMT0FUX0JVRkZFUgogICAgICAgICAgICAgcE91dFtpXSA9IGNsYW1wMTYoKGludDMyX3QpcE91dFtpXSArIChpbnQzMl90KU91dEZyYW1lczE2W2ldKTsKKyNlbHNlCisgICAgICAgICAgICBwT3V0W2ldICs9IHBDb250ZXh0LT5PdXRGcmFtZXNbaV07CisjZW5kaWYKICAgICAgICAgfQogICAgIH1lbHNlewogICAgICAgICAvL0FMT0dWKCJcdEJ1ZmZlciBhY2Nlc3MgaXMgV1JJVEUiKTsKLSAgICAgICAgbWVtY3B5KHBPdXQsIE91dEZyYW1lczE2LCBmcmFtZUNvdW50KnNpemVvZihMVk1fSU5UMTYpKjIpOworICAgICAgICBtZW1jcHkocE91dCwgcENvbnRleHQtPk91dEZyYW1lcywgZnJhbWVDb3VudCAqIHNpemVvZigqcE91dCkgKiBGQ0NfMik7CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CkBAIC03MzMsOCArNjU2LDcgQEAKICAgICBDSEVDS19BUkcocENvbmZpZy0+b3V0cHV0Q2ZnLmNoYW5uZWxzID09IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyk7CiAgICAgQ0hFQ0tfQVJHKHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1dSSVRFCiAgICAgICAgICAgICAgIHx8IHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpOwotICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpOwotCisgICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCA9PSBFRkZFQ1RfQlVGRkVSX0ZPUk1BVCk7CiAgICAgLy9BTE9HVigiXHRSZXZlcmJfc2V0Q29uZmlnIGNhbGxpbmcgbWVtY3B5Iik7CiAgICAgcENvbnRleHQtPmNvbmZpZyA9ICpwQ29uZmlnOwogCkBAIC04NDcsOCArNzY5LDcgQEAKICAgICB9IGVsc2UgewogICAgICAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzICAgICAgICAgICAgICAgICAgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CiAgICAgfQotCi0gICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5mb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgPSBFRkZFQ1RfQlVGRkVSX0ZPUk1BVDsKICAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSAgICAgICAgICAgICAgICAgID0gNDQxMDA7CiAgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgICAgICA9IE5VTEw7CiAgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyICA9IE5VTEw7CkBAIC04NTYsNyArNzc3LDcgQEAKICAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLm1hc2sgICAgICAgICAgICAgICAgICAgICAgICAgID0gRUZGRUNUX0NPTkZJR19BTEw7CiAgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSAgICAgICAgICAgICAgICAgICA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEU7CiAgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgICAgICAgICAgICAgICAgICAgICA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKLSAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5mb3JtYXQgICAgICAgICAgICAgICAgICAgICAgID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICA9IEVGRkVDVF9CVUZGRVJfRk9STUFUOwogICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSAgICAgICAgICAgICAgICAgPSA0NDEwMDsKICAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgICAgID0gTlVMTDsKICAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKQEAgLTIwMzEsMTQgKzE5NTIsMjIgQEAKICAgICB9CiAgICAgLy9BTE9HVigiXHRSZXZlcmJfcHJvY2VzcygpIENhbGxpbmcgcHJvY2VzcyB3aXRoICVkIGZyYW1lcyIsIG91dEJ1ZmZlci0+ZnJhbWVDb3VudCk7CiAgICAgLyogUHJvY2VzcyBhbGwgdGhlIGF2YWlsYWJsZSBmcmFtZXMsIGJsb2NrIHByb2Nlc3NpbmcgaXMgaGFuZGxlZCBpbnRlcm5hbExZIGJ5IHRoZSBMVk0gYnVuZGxlICovCi0gICAgc3RhdHVzID0gcHJvY2VzcyggICAgKExWTV9JTlQxNiAqKWluQnVmZmVyLT5yYXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKW91dEJ1ZmZlci0+cmF3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXItPmZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0KTsKKyNpZiBkZWZpbmVkIChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZCAoTkFUSVZFX0ZMT0FUX0JVRkZFUikKKyAgICBzdGF0dXMgPSBwcm9jZXNzKCAgICBpbkJ1ZmZlci0+ZjMyLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+ZjMyLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+ZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dCk7CisjZWxzZQorICAgIHN0YXR1cyA9IHByb2Nlc3MoICAgIGluQnVmZmVyLT5zMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT5zMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT5mcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0KTsKKyNlbmRpZgogCiAgICAgaWYgKHBDb250ZXh0LT5iRW5hYmxlZCA9PSBMVk1fRkFMU0UpIHsKICAgICAgICAgaWYgKHBDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnQgPiAwKSB7Ci0gICAgICAgICAgICBwQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50IC09IG91dEJ1ZmZlci0+ZnJhbWVDb3VudDsKKyAgICAgICAgICAgIC8vIHNpZ25lZCAtIHVuc2lnbmVkIHdpbGwgdHJpZ2dlciBpbnRlZ2VyIG92ZXJmbG93IGlmIHJlc3VsdCBiZWNvbWVzIG5lZ2F0aXZlLgorICAgICAgICAgICAgcENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudCAtPSAoc3NpemVfdClvdXRCdWZmZXItPmZyYW1lQ291bnQ7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBzdGF0dXMgPSAtRU5PREFUQTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0VmZmVjdFZpc3VhbGl6ZXIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0VmZmVjdFZpc3VhbGl6ZXIuY3BwCmluZGV4IDBlODIzMzkuLjgwN2YyNGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9FZmZlY3RWaXN1YWxpemVyLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvRWZmZWN0VmlzdWFsaXplci5jcHAKQEAgLTU5NCw3ICs1OTQsOSBAQAogICAgICAgICAgICAgICAgICAgICBkZWx0YVNtcGwgPSBDQVBUVVJFX0JVRl9TSVpFOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGludDMyX3QgY2FwdHVyZVBvaW50ID0gcENvbnRleHQtPm1DYXB0dXJlSWR4IC0gZGVsdGFTbXBsOworICAgICAgICAgICAgICAgIGludDMyX3QgY2FwdHVyZVBvaW50OworICAgICAgICAgICAgICAgIC8vY2FwdHVyZVBvaW50ID0gKGludDMyX3QpcENvbnRleHQtPm1DYXB0dXJlSWR4IC0gZGVsdGFTbXBsOworICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9zdWJfb3ZlcmZsb3coKGludDMyX3QpcENvbnRleHQtPm1DYXB0dXJlSWR4LCBkZWx0YVNtcGwsICZjYXB0dXJlUG9pbnQpOwogICAgICAgICAgICAgICAgIC8vIGEgbmVnYXRpdmUgY2FwdHVyZVBvaW50IG1lYW5zIHdlIHdyYXAgdGhlIGJ1ZmZlci4KICAgICAgICAgICAgICAgICBpZiAoY2FwdHVyZVBvaW50IDwgMCkgewogICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplID0gLWNhcHR1cmVQb2ludDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlaWYvSGVpZkRlY29kZXJJbXBsLmNwcCBiL21lZGlhL2xpYmhlaWYvSGVpZkRlY29kZXJJbXBsLmNwcAppbmRleCA1NzIwOWUyLi4wMWYwMTRmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJoZWlmL0hlaWZEZWNvZGVySW1wbC5jcHAKKysrIGIvbWVkaWEvbGliaGVpZi9IZWlmRGVjb2RlckltcGwuY3BwCkBAIC0yMiwxMSArMjIsMTIgQEAKICNpbmNsdWRlIDxzdGRpby5oPgogCiAjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+CiAjaW5jbHVkZSA8ZHJtL2RybV9mcmFtZXdvcmtfY29tbW9uLmg+CiAjaW5jbHVkZSA8bWVkaWEvSURhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9WaWRlb0ZyYW1lLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgpAQCAtMjcwLDE5ICsyNzEsNDkgQEAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCitzdHJ1Y3QgSGVpZkRlY29kZXJJbXBsOjpEZWNvZGVUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKKyAgICBleHBsaWNpdCBEZWNvZGVUaHJlYWQoSGVpZkRlY29kZXJJbXBsICpkZWNvZGVyKSA6IG1EZWNvZGVyKGRlY29kZXIpIHt9CisKK3ByaXZhdGU6CisgICAgSGVpZkRlY29kZXJJbXBsKiBtRGVjb2RlcjsKKworICAgIGJvb2wgdGhyZWFkTG9vcCgpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRGVjb2RlVGhyZWFkKTsKK307CisKK2Jvb2wgSGVpZkRlY29kZXJJbXBsOjpEZWNvZGVUaHJlYWQ6OnRocmVhZExvb3AoKSB7CisgICAgcmV0dXJuIG1EZWNvZGVyLT5kZWNvZGVBc3luYygpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKIEhlaWZEZWNvZGVySW1wbDo6SGVpZkRlY29kZXJJbXBsKCkgOgogICAgIC8vIG91dHB1dCBjb2xvciBmb3JtYXQgc2hvdWxkIGFsd2F5cyBiZSBzZXQgdmlhIHNldE91dHB1dENvbG9yKCksIGluIGNhc2UKICAgICAvLyBpdCdzIG5vdCwgZGVmYXVsdCB0byBIQUxfUElYRUxfRk9STUFUX1JHQl81NjUuCiAgICAgbU91dHB1dENvbG9yKEhBTF9QSVhFTF9GT1JNQVRfUkdCXzU2NSksCiAgICAgbUN1clNjYW5saW5lKDApLAotICAgIG1GcmFtZURlY29kZWQoZmFsc2UpIHsKKyAgICBtV2lkdGgoMCksCisgICAgbUhlaWdodCgwKSwKKyAgICBtRnJhbWVEZWNvZGVkKGZhbHNlKSwKKyAgICBtSGFzSW1hZ2UoZmFsc2UpLAorICAgIG1IYXNWaWRlbyhmYWxzZSksCisgICAgbUF2YWlsYWJsZUxpbmVzKDApLAorICAgIG1OdW1TbGljZXMoMSksCisgICAgbVNsaWNlSGVpZ2h0KDApLAorICAgIG1Bc3luY0RlY29kZURvbmUoZmFsc2UpIHsKIH0KIAogSGVpZkRlY29kZXJJbXBsOjp+SGVpZkRlY29kZXJJbXBsKCkgeworICAgIGlmIChtVGhyZWFkICE9IG51bGxwdHIpIHsKKyAgICAgICAgbVRocmVhZC0+am9pbigpOworICAgIH0KIH0KIAogYm9vbCBIZWlmRGVjb2RlckltcGw6OmluaXQoSGVpZlN0cmVhbSogc3RyZWFtLCBIZWlmRnJhbWVJbmZvKiBmcmFtZUluZm8pIHsKICAgICBtRnJhbWVEZWNvZGVkID0gZmFsc2U7CisgICAgbUZyYW1lTWVtb3J5LmNsZWFyKCk7CisKICAgICBzcDxIZWlmRGF0YVNvdXJjZT4gZGF0YVNvdXJjZSA9IG5ldyBIZWlmRGF0YVNvdXJjZShzdHJlYW0pOwogICAgIGlmICghZGF0YVNvdXJjZS0+aW5pdCgpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTI5MCw3ICszMjEsNyBAQAogICAgIG1EYXRhU291cmNlID0gZGF0YVNvdXJjZTsKIAogICAgIG1SZXRyaWV2ZXIgPSBuZXcgTWVkaWFNZXRhZGF0YVJldHJpZXZlcigpOwotICAgIHN0YXR1c190IGVyciA9IG1SZXRyaWV2ZXItPnNldERhdGFTb3VyY2UobURhdGFTb3VyY2UsICJ2aWRlby9tcDQiKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtUmV0cmlldmVyLT5zZXREYXRhU291cmNlKG1EYXRhU291cmNlLCAiaW1hZ2UvaGVpZiIpOwogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgQUxPR0UoImZhaWxlZCB0byBzZXQgZGF0YSBzb3VyY2UhIik7CiAKQEAgLTMwMCwyMSArMzMxLDI4IEBACiAgICAgfQogICAgIEFMT0dWKCJzdWNjZXNzZnVsbHkgc2V0IGRhdGEgc291cmNlLiIpOwogCisgICAgY29uc3QgY2hhciogaGFzSW1hZ2UgPSBtUmV0cmlldmVyLT5leHRyYWN0TWV0YWRhdGEoTUVUQURBVEFfS0VZX0hBU19JTUFHRSk7CiAgICAgY29uc3QgY2hhciogaGFzVmlkZW8gPSBtUmV0cmlldmVyLT5leHRyYWN0TWV0YWRhdGEoTUVUQURBVEFfS0VZX0hBU19WSURFTyk7Ci0gICAgaWYgKCFoYXNWaWRlbyB8fCBzdHJjYXNlY21wKGhhc1ZpZGVvLCAieWVzIikpIHsKLSAgICAgICAgQUxPR0UoIm5vIHZpZGVvOiAlcyIsIGhhc1ZpZGVvID8gaGFzVmlkZW8gOiAibnVsbCIpOwotICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBtSGFzSW1hZ2UgPSBoYXNJbWFnZSAmJiAhc3RyY2FzZWNtcChoYXNJbWFnZSwgInllcyIpOworICAgIG1IYXNWaWRlbyA9IGhhc1ZpZGVvICYmICFzdHJjYXNlY21wKGhhc1ZpZGVvLCAieWVzIik7CisgICAgc3A8SU1lbW9yeT4gc2hhcmVkTWVtOworICAgIGlmIChtSGFzSW1hZ2UpIHsKKyAgICAgICAgLy8gaW1hZ2UgaW5kZXggPCAwIHRvIHJldHJpZXZlIHByaW1hcnkgaW1hZ2UKKyAgICAgICAgc2hhcmVkTWVtID0gbVJldHJpZXZlci0+Z2V0SW1hZ2VBdEluZGV4KAorICAgICAgICAgICAgICAgIC0xLCBtT3V0cHV0Q29sb3IsIHRydWUgLyptZXRhT25seSovKTsKKyAgICB9IGVsc2UgaWYgKG1IYXNWaWRlbykgeworICAgICAgICBzaGFyZWRNZW0gPSBtUmV0cmlldmVyLT5nZXRGcmFtZUF0VGltZSgwLAorICAgICAgICAgICAgICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DLAorICAgICAgICAgICAgICAgIG1PdXRwdXRDb2xvciwgdHJ1ZSAvKm1ldGFPbmx5Ki8pOwogICAgIH0KIAotICAgIG1GcmFtZU1lbW9yeSA9IG1SZXRyaWV2ZXItPmdldEZyYW1lQXRUaW1lKDAsCi0gICAgICAgICAgICBJTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkMsCi0gICAgICAgICAgICBtT3V0cHV0Q29sb3IsIHRydWUgLyptZXRhT25seSovKTsKLSAgICBpZiAobUZyYW1lTWVtb3J5ID09IG51bGxwdHIgfHwgbUZyYW1lTWVtb3J5LT5wb2ludGVyKCkgPT0gbnVsbHB0cikgeworICAgIGlmIChzaGFyZWRNZW0gPT0gbnVsbHB0ciB8fCBzaGFyZWRNZW0tPnBvaW50ZXIoKSA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJnZXRGcmFtZUF0VGltZTogdmlkZW9GcmFtZSBpcyBhIG51bGxwdHIiKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIFZpZGVvRnJhbWUqIHZpZGVvRnJhbWUgPSBzdGF0aWNfY2FzdDxWaWRlb0ZyYW1lKj4obUZyYW1lTWVtb3J5LT5wb2ludGVyKCkpOworICAgIFZpZGVvRnJhbWUqIHZpZGVvRnJhbWUgPSBzdGF0aWNfY2FzdDxWaWRlb0ZyYW1lKj4oc2hhcmVkTWVtLT5wb2ludGVyKCkpOwogCiAgICAgQUxPR1YoIk1ldGEgZGltZW5zaW9uICVkeCVkLCBkaXNwbGF5ICVkeCVkLCBhbmdsZSAlZCwgaWNjU2l6ZSAlZCIsCiAgICAgICAgICAgICB2aWRlb0ZyYW1lLT5tV2lkdGgsCkBAIC0zMzMsNiArMzcxLDE0IEBACiAgICAgICAgICAgICAgICAgdmlkZW9GcmFtZS0+bUljY1NpemUsCiAgICAgICAgICAgICAgICAgdmlkZW9GcmFtZS0+Z2V0RmxhdHRlbmVkSWNjRGF0YSgpKTsKICAgICB9CisgICAgbVdpZHRoID0gdmlkZW9GcmFtZS0+bVdpZHRoOworICAgIG1IZWlnaHQgPSB2aWRlb0ZyYW1lLT5tSGVpZ2h0OworICAgIGlmIChtSGFzSW1hZ2UgJiYgdmlkZW9GcmFtZS0+bVRpbGVIZWlnaHQgPj0gNTEyICYmIG1XaWR0aCA+PSAzMDAwICYmIG1IZWlnaHQgPj0gMjAwMCApIHsKKyAgICAgICAgLy8gVHJ5IGRlY29kaW5nIGluIHNsaWNlcyBvbmx5IGlmIHRoZSBpbWFnZSBoYXMgdGlsZXMgYW5kIGlzIGJpZyBlbm91Z2guCisgICAgICAgIG1TbGljZUhlaWdodCA9IHZpZGVvRnJhbWUtPm1UaWxlSGVpZ2h0OworICAgICAgICBtTnVtU2xpY2VzID0gKHZpZGVvRnJhbWUtPm1IZWlnaHQgKyBtU2xpY2VIZWlnaHQgLSAxKSAvIG1TbGljZUhlaWdodDsKKyAgICAgICAgQUxPR1YoIm1TbGljZUhlaWdodCAldSwgbU51bVNsaWNlcyAlenUiLCBtU2xpY2VIZWlnaHQsIG1OdW1TbGljZXMpOworICAgIH0KICAgICByZXR1cm4gdHJ1ZTsKIH0KIApAQCAtMzY1LDYgKzQxMSwzNiBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAorYm9vbCBIZWlmRGVjb2RlckltcGw6OmRlY29kZUFzeW5jKCkgeworICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgbU51bVNsaWNlczsgaSsrKSB7CisgICAgICAgIEFMT0dWKCJkZWNvZGVBc3luYygpOiBkZWNvZGluZyBzbGljZSAlenUiLCBpKTsKKyAgICAgICAgc2l6ZV90IHRvcCA9IGkgKiBtU2xpY2VIZWlnaHQ7CisgICAgICAgIHNpemVfdCBib3R0b20gPSAoaSArIDEpICogbVNsaWNlSGVpZ2h0OworICAgICAgICBpZiAoYm90dG9tID4gbUhlaWdodCkgeworICAgICAgICAgICAgYm90dG9tID0gbUhlaWdodDsKKyAgICAgICAgfQorICAgICAgICBzcDxJTWVtb3J5PiBmcmFtZU1lbW9yeSA9IG1SZXRyaWV2ZXItPmdldEltYWdlUmVjdEF0SW5kZXgoCisgICAgICAgICAgICAgICAgLTEsIG1PdXRwdXRDb2xvciwgMCwgdG9wLCBtV2lkdGgsIGJvdHRvbSk7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7CisKKyAgICAgICAgICAgIGlmIChmcmFtZU1lbW9yeSA9PSBudWxscHRyIHx8IGZyYW1lTWVtb3J5LT5wb2ludGVyKCkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIG1Bc3luY0RlY29kZURvbmUgPSB0cnVlOworICAgICAgICAgICAgICAgIG1TY2FubGluZVJlYWR5LnNpZ25hbCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUZyYW1lTWVtb3J5ID0gZnJhbWVNZW1vcnk7CisgICAgICAgICAgICBtQXZhaWxhYmxlTGluZXMgPSBib3R0b207CisgICAgICAgICAgICBBTE9HVigiZGVjb2RlQXN5bmMoKTogYXZhaWxhYmxlIGxpbmVzICV6dSIsIG1BdmFpbGFibGVMaW5lcyk7CisgICAgICAgICAgICBtU2NhbmxpbmVSZWFkeS5zaWduYWwoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBBZ2dyZXNzaXZlIGNsZWFyIHRvIGF2b2lkIGhvbGRpbmcgb24gdG8gcmVzb3VyY2VzCisgICAgbVJldHJpZXZlci5jbGVhcigpOworICAgIG1EYXRhU291cmNlLmNsZWFyKCk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCiBib29sIEhlaWZEZWNvZGVySW1wbDo6ZGVjb2RlKEhlaWZGcmFtZUluZm8qIGZyYW1lSW5mbykgewogICAgIC8vIHJlc2V0IHNjYW5saW5lIHBvaW50ZXIKICAgICBtQ3VyU2NhbmxpbmUgPSAwOwpAQCAtMzczLDE3ICs0NDksNjQgQEAKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgbUZyYW1lTWVtb3J5ID0gbVJldHJpZXZlci0+Z2V0RnJhbWVBdFRpbWUoMCwKLSAgICAgICAgICAgIElNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQywgbU91dHB1dENvbG9yKTsKKyAgICAvLyBTZWUgaWYgd2Ugd2FudCB0byBkZWNvZGUgaW4gc2xpY2VzIHRvIGFsbG93IGNsaWVudCB0byBzdGFydAorICAgIC8vIHNjYW5saW5lIHByb2Nlc3NpbmcgaW4gcGFyYWxsZWwgd2l0aCBkZWNvZGUuIElmIHRoaXMgZmFpbHMKKyAgICAvLyB3ZSBmYWxsYmFjayB0byBkZWNvZGluZyB0aGUgZnVsbCBmcmFtZS4KKyAgICBpZiAobUhhc0ltYWdlICYmIG1OdW1TbGljZXMgPiAxKSB7CisgICAgICAgIC8vIGdldCBmaXJzdCBzbGljZSBhbmQgbWV0YWRhdGEKKyAgICAgICAgc3A8SU1lbW9yeT4gZnJhbWVNZW1vcnkgPSBtUmV0cmlldmVyLT5nZXRJbWFnZVJlY3RBdEluZGV4KAorICAgICAgICAgICAgICAgIC0xLCBtT3V0cHV0Q29sb3IsIDAsIDAsIG1XaWR0aCwgbVNsaWNlSGVpZ2h0KTsKKworICAgICAgICBpZiAoZnJhbWVNZW1vcnkgPT0gbnVsbHB0ciB8fCBmcmFtZU1lbW9yeS0+cG9pbnRlcigpID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJkZWNvZGU6IG1ldGFkYXRhIGlzIGEgbnVsbHB0ciIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgVmlkZW9GcmFtZSogdmlkZW9GcmFtZSA9IHN0YXRpY19jYXN0PFZpZGVvRnJhbWUqPihmcmFtZU1lbW9yeS0+cG9pbnRlcigpKTsKKworICAgICAgICBpZiAoZnJhbWVJbmZvICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGZyYW1lSW5mby0+c2V0KAorICAgICAgICAgICAgICAgICAgICB2aWRlb0ZyYW1lLT5tV2lkdGgsCisgICAgICAgICAgICAgICAgICAgIHZpZGVvRnJhbWUtPm1IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgIHZpZGVvRnJhbWUtPm1Sb3RhdGlvbkFuZ2xlLAorICAgICAgICAgICAgICAgICAgICB2aWRlb0ZyYW1lLT5tQnl0ZXNQZXJQaXhlbCwKKyAgICAgICAgICAgICAgICAgICAgdmlkZW9GcmFtZS0+bUljY1NpemUsCisgICAgICAgICAgICAgICAgICAgIHZpZGVvRnJhbWUtPmdldEZsYXR0ZW5lZEljY0RhdGEoKSk7CisgICAgICAgIH0KKworICAgICAgICBtRnJhbWVNZW1vcnkgPSBmcmFtZU1lbW9yeTsKKyAgICAgICAgbUF2YWlsYWJsZUxpbmVzID0gbVNsaWNlSGVpZ2h0OworICAgICAgICBtVGhyZWFkID0gbmV3IERlY29kZVRocmVhZCh0aGlzKTsKKyAgICAgICAgaWYgKG1UaHJlYWQtPnJ1bigiSGVpZkRlY29kZSIsIEFORFJPSURfUFJJT1JJVFlfRk9SRUdST1VORCkgPT0gT0spIHsKKyAgICAgICAgICAgIG1GcmFtZURlY29kZWQgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBGYWxsYmFjayB0byBkZWNvZGUgd2l0aG91dCBzbGljaW5nCisgICAgICAgIG1UaHJlYWQuY2xlYXIoKTsKKyAgICAgICAgbU51bVNsaWNlcyA9IDE7CisgICAgICAgIG1TbGljZUhlaWdodCA9IDA7CisgICAgICAgIG1BdmFpbGFibGVMaW5lcyA9IDA7CisgICAgICAgIG1GcmFtZU1lbW9yeS5jbGVhcigpOworICAgIH0KKworICAgIGlmIChtSGFzSW1hZ2UpIHsKKyAgICAgICAgLy8gaW1hZ2UgaW5kZXggPCAwIHRvIHJldHJpZXZlIHByaW1hcnkgaW1hZ2UKKyAgICAgICAgbUZyYW1lTWVtb3J5ID0gbVJldHJpZXZlci0+Z2V0SW1hZ2VBdEluZGV4KC0xLCBtT3V0cHV0Q29sb3IpOworICAgIH0gZWxzZSBpZiAobUhhc1ZpZGVvKSB7CisgICAgICAgIG1GcmFtZU1lbW9yeSA9IG1SZXRyaWV2ZXItPmdldEZyYW1lQXRUaW1lKDAsCisgICAgICAgICAgICAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkMsIG1PdXRwdXRDb2xvcik7CisgICAgfQorCiAgICAgaWYgKG1GcmFtZU1lbW9yeSA9PSBudWxscHRyIHx8IG1GcmFtZU1lbW9yeS0+cG9pbnRlcigpID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoImdldEZyYW1lQXRUaW1lOiB2aWRlb0ZyYW1lIGlzIGEgbnVsbHB0ciIpOworICAgICAgICBBTE9HRSgiZGVjb2RlOiB2aWRlb0ZyYW1lIGlzIGEgbnVsbHB0ciIpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgVmlkZW9GcmFtZSogdmlkZW9GcmFtZSA9IHN0YXRpY19jYXN0PFZpZGVvRnJhbWUqPihtRnJhbWVNZW1vcnktPnBvaW50ZXIoKSk7CiAgICAgaWYgKHZpZGVvRnJhbWUtPm1TaXplID09IDAgfHwKICAgICAgICAgICAgIG1GcmFtZU1lbW9yeS0+c2l6ZSgpIDwgdmlkZW9GcmFtZS0+Z2V0RmxhdHRlbmVkU2l6ZSgpKSB7Ci0gICAgICAgIEFMT0dFKCJnZXRGcmFtZUF0VGltZTogdmlkZW9GcmFtZSBzaXplIGlzIGludmFsaWQiKTsKKyAgICAgICAgQUxPR0UoImRlY29kZTogdmlkZW9GcmFtZSBzaXplIGlzIGludmFsaWQiKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApAQCAtNDA3LDM2ICs1MzAsNDUgQEAKICAgICB9CiAgICAgbUZyYW1lRGVjb2RlZCA9IHRydWU7CiAKLSAgICAvLyBBZ2dyZXNzaXZlIGNsZWFyIHRvIGF2b2lkIGhvbGRpbmcgb24gdG8gcmVzb3VyY2VzCisgICAgLy8gQWdncmVzc2l2ZWx5IGNsZWFyIHRvIGF2b2lkIGhvbGRpbmcgb24gdG8gcmVzb3VyY2VzCiAgICAgbVJldHJpZXZlci5jbGVhcigpOwogICAgIG1EYXRhU291cmNlLmNsZWFyKCk7CiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgSGVpZkRlY29kZXJJbXBsOjpnZXRTY2FubGluZSh1aW50OF90KiBkc3QpIHsKK2Jvb2wgSGVpZkRlY29kZXJJbXBsOjpnZXRTY2FubGluZUlubmVyKHVpbnQ4X3QqIGRzdCkgewogICAgIGlmIChtRnJhbWVNZW1vcnkgPT0gbnVsbHB0ciB8fCBtRnJhbWVNZW1vcnktPnBvaW50ZXIoKSA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgVmlkZW9GcmFtZSogdmlkZW9GcmFtZSA9IHN0YXRpY19jYXN0PFZpZGVvRnJhbWUqPihtRnJhbWVNZW1vcnktPnBvaW50ZXIoKSk7Ci0gICAgaWYgKG1DdXJTY2FubGluZSA+PSB2aWRlb0ZyYW1lLT5tSGVpZ2h0KSB7Ci0gICAgICAgIEFMT0dFKCJubyBtb3JlIHNjYW5saW5lIGF2YWlsYWJsZSIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQogICAgIHVpbnQ4X3QqIHNyYyA9IHZpZGVvRnJhbWUtPmdldEZsYXR0ZW5lZERhdGEoKSArIHZpZGVvRnJhbWUtPm1Sb3dCeXRlcyAqIG1DdXJTY2FubGluZSsrOwogICAgIG1lbWNweShkc3QsIHNyYywgdmlkZW9GcmFtZS0+bUJ5dGVzUGVyUGl4ZWwgKiB2aWRlb0ZyYW1lLT5tV2lkdGgpOwogICAgIHJldHVybiB0cnVlOwogfQogCi1zaXplX3QgSGVpZkRlY29kZXJJbXBsOjpza2lwU2NhbmxpbmVzKHNpemVfdCBjb3VudCkgewotICAgIGlmIChtRnJhbWVNZW1vcnkgPT0gbnVsbHB0ciB8fCBtRnJhbWVNZW1vcnktPnBvaW50ZXIoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiAwOworYm9vbCBIZWlmRGVjb2RlckltcGw6OmdldFNjYW5saW5lKHVpbnQ4X3QqIGRzdCkgeworICAgIGlmIChtQ3VyU2NhbmxpbmUgPj0gbUhlaWdodCkgeworICAgICAgICBBTE9HRSgibm8gbW9yZSBzY2FubGluZSBhdmFpbGFibGUiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBWaWRlb0ZyYW1lKiB2aWRlb0ZyYW1lID0gc3RhdGljX2Nhc3Q8VmlkZW9GcmFtZSo+KG1GcmFtZU1lbW9yeS0+cG9pbnRlcigpKTsKIAorICAgIGlmIChtTnVtU2xpY2VzID4gMSkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOworCisgICAgICAgIHdoaWxlICghbUFzeW5jRGVjb2RlRG9uZSAmJiBtQ3VyU2NhbmxpbmUgPj0gbUF2YWlsYWJsZUxpbmVzKSB7CisgICAgICAgICAgICBtU2NhbmxpbmVSZWFkeS53YWl0KG1Mb2NrKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKG1DdXJTY2FubGluZSA8IG1BdmFpbGFibGVMaW5lcykgPyBnZXRTY2FubGluZUlubmVyKGRzdCkgOiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gZ2V0U2NhbmxpbmVJbm5lcihkc3QpOworfQorCitzaXplX3QgSGVpZkRlY29kZXJJbXBsOjpza2lwU2NhbmxpbmVzKHNpemVfdCBjb3VudCkgewogICAgIHVpbnQzMl90IG9sZFNjYW5saW5lID0gbUN1clNjYW5saW5lOwogICAgIG1DdXJTY2FubGluZSArPSBjb3VudDsKLSAgICBpZiAobUN1clNjYW5saW5lID4gdmlkZW9GcmFtZS0+bUhlaWdodCkgewotICAgICAgICBtQ3VyU2NhbmxpbmUgPSB2aWRlb0ZyYW1lLT5tSGVpZ2h0OworICAgIGlmIChtQ3VyU2NhbmxpbmUgPiBtSGVpZ2h0KSB7CisgICAgICAgIG1DdXJTY2FubGluZSA9IG1IZWlnaHQ7CiAgICAgfQogICAgIHJldHVybiAobUN1clNjYW5saW5lID4gb2xkU2NhbmxpbmUpID8gKG1DdXJTY2FubGluZSAtIG9sZFNjYW5saW5lKSA6IDA7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWlmL0hlaWZEZWNvZGVySW1wbC5oIGIvbWVkaWEvbGliaGVpZi9IZWlmRGVjb2RlckltcGwuaAppbmRleCBjMmU0ZmYzLi41MjhlZTNiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJoZWlmL0hlaWZEZWNvZGVySW1wbC5oCisrKyBiL21lZGlhL2xpYmhlaWYvSGVpZkRlY29kZXJJbXBsLmgKQEAgLTE5LDYgKzE5LDggQEAKIAogI2luY2x1ZGUgImluY2x1ZGUvSGVpZkRlY29kZXJBUEkuaCIKICNpbmNsdWRlIDxzeXN0ZW0vZ3JhcGhpY3MuaD4KKyNpbmNsdWRlIDx1dGlscy9Db25kaXRpb24uaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNDksMTIgKzUxLDMwIEBACiAgICAgc2l6ZV90IHNraXBTY2FubGluZXMoc2l6ZV90IGNvdW50KSBvdmVycmlkZTsKIAogcHJpdmF0ZToKKyAgICBzdHJ1Y3QgRGVjb2RlVGhyZWFkOworCiAgICAgc3A8SURhdGFTb3VyY2U+IG1EYXRhU291cmNlOwogICAgIHNwPE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI+IG1SZXRyaWV2ZXI7CiAgICAgc3A8SU1lbW9yeT4gbUZyYW1lTWVtb3J5OwogICAgIGFuZHJvaWRfcGl4ZWxfZm9ybWF0X3QgbU91dHB1dENvbG9yOwogICAgIHNpemVfdCBtQ3VyU2NhbmxpbmU7CisgICAgdWludDMyX3QgbVdpZHRoOworICAgIHVpbnQzMl90IG1IZWlnaHQ7CiAgICAgYm9vbCBtRnJhbWVEZWNvZGVkOworICAgIGJvb2wgbUhhc0ltYWdlOworICAgIGJvb2wgbUhhc1ZpZGVvOworCisgICAgLy8gU2xpY2UgZGVjb2Rpbmcgb25seQorICAgIE11dGV4IG1Mb2NrOworICAgIENvbmRpdGlvbiBtU2NhbmxpbmVSZWFkeTsKKyAgICBzcDxEZWNvZGVUaHJlYWQ+IG1UaHJlYWQ7CisgICAgc2l6ZV90IG1BdmFpbGFibGVMaW5lczsKKyAgICBzaXplX3QgbU51bVNsaWNlczsKKyAgICB1aW50MzJfdCBtU2xpY2VIZWlnaHQ7CisgICAgYm9vbCBtQXN5bmNEZWNvZGVEb25lOworCisgICAgYm9vbCBkZWNvZGVBc3luYygpOworICAgIGJvb2wgZ2V0U2NhbmxpbmVJbm5lcih1aW50OF90KiBkc3QpOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQuYnAKaW5kZXggYTQ2MmYzYS4uMWExZDZiMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLmJwCkBAIC0zLDEwICszLDEyIEBACiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKICAgICBoZWFkZXJfbGliczpbCisgICAgICAgICJsaWJndWlfaGVhZGVycyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKICAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKICAgICBdLAogICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmd1aV9oZWFkZXJzIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAogICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAogICAgIF0sCkBAIC0xOCwxMyArMjAsMTMgQEAKICAgICB2bmRrOiB7CiAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgfSwKLSAgICBzcmNzOiBbIkF1ZGlvUGFyYW1ldGVyLmNwcCIsICJUeXBlQ29udmVydGVyLmNwcCJdLAorICAgIHNyY3M6IFsiQXVkaW9QYXJhbWV0ZXIuY3BwIiwgIlR5cGVDb252ZXJ0ZXIuY3BwIiwgIlRpbWVDaGVjay5jcHAiXSwKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIsCiAgICAgICAgICItV2FsbCIsCiAgICAgXSwKLSAgICBzaGFyZWRfbGliczogWyJsaWJ1dGlscyIsICJsaWJsb2ciLCAibGliZ3VpIl0sCisgICAgc2hhcmVkX2xpYnM6IFsibGlidXRpbHMiLCAibGlibG9nIl0sCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAogICAgICAgICAibGliYXVkaW9jbGllbnRfaGVhZGVycyIsCkBAIC0zMywyMiArMzUsMjEgQEAKICAgICBjbGFuZzogdHJ1ZSwKIH0KIAotLy8gVE9ETyhiLzM1NDQ5MDg3KTogbWVyZ2UgYmFjayB3aXRoIGxpYm1lZGlhIHdoZW4gT01YIGltcGxlbWVudGF0b2lucwotLy8gbm8gbG9uZ2VyIHVzZSBhaWRsIHdyYXBwZXJzIChvciByZW1vdmUgT01YIGNvbXBvbmVudCBmb3JtIGxpYm1lZGlhKQotY2NfZGVmYXVsdHMgewotICAgIG5hbWU6ICJsaWJtZWRpYV9vbXhfZGVmYXVsdHMiLAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJtZWRpYV9vbXgiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgdm5kazogeworICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgIH0sCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJhaWRsL2FuZHJvaWQvSUdyYXBoaWNCdWZmZXJTb3VyY2UuYWlkbCIsCiAgICAgICAgICJhaWRsL2FuZHJvaWQvSU9NWEJ1ZmZlclNvdXJjZS5haWRsIiwKIAogICAgICAgICAiSU1lZGlhQ29kZWNMaXN0LmNwcCIsCi0gICAgICAgICJJTWVkaWFDb2RlY1NlcnZpY2UuY3BwIiwKICAgICAgICAgIklPTVguY3BwIiwKLSAgICAgICAgIklPTVhTdG9yZS5jcHAiLAogICAgICAgICAiTWVkaWFDb2RlY0J1ZmZlci5jcHAiLAogICAgICAgICAiTWVkaWFDb2RlY0luZm8uY3BwIiwKLSAgICAgICAgIk1lZGlhRGVmcy5jcHAiLAogICAgICAgICAiT01YQnVmZmVyLmNwcCIsCiAgICAgICAgICJvbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmNwcCIsCiAgICAgICAgICJvbXgvMS4wL1dPbXguY3BwIiwKQEAgLTYzLDE4ICs2NCwxMyBAQAogICAgIH0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAiYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oaWRsLnRva2VuQDEuMC11dGlscyIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYUAxLjAiLAotICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYmd1aSIsCiAgICAgICAgICJsaWJoaWRsYmFzZSIsCi0gICAgICAgICJsaWJoaWRsbWVtb3J5IiwKICAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAotICAgICAgICAibGliaHdiaW5kZXIiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidWkiLApAQCAtODIsMTEgKzc4LDggQEAKICAgICBdLAogCiAgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWwotICAgICAgICAiYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oaWRsLnRva2VuQDEuMC11dGlscyIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYUAxLjAiLAotICAgICAgICAibGliaGlkbG1lbW9yeSIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnVpIiwKICAgICBdLApAQCAtMTIxLDIzICsxMTQsNDYgQEAKICAgICB9LAogfQogCi1jY19saWJyYXJ5X3NoYXJlZCB7Ci0gICAgbmFtZTogImxpYm1lZGlhX29teCIsCi0gICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKLSAgICB2bmRrOiB7Ci0gICAgICAgIGVuYWJsZWQ6IHRydWUsCi0gICAgfSwKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGlibWVkaWFfbWlkaWlvd3JhcHBlciIsCiAKLSAgICBkZWZhdWx0czogWyJsaWJtZWRpYV9vbXhfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbIk1pZGlJb1dyYXBwZXIuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic29uaXZveCIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV25vLWVycm9yPWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgZGlhZzogeworICAgICAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICB9LAorICAgIH0sCiB9CiAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKK2ZpbGVncm91cCB7CisgICAgbmFtZTogIm1lZGlhdXBkYXRlc2VydmljZV9haWRsIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvSU1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5haWRsIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlibWVkaWEiLAotICAgIGRlZmF1bHRzOiBbImxpYm1lZGlhX29teF9kZWZhdWx0cyJdLAogCiAgICAgc3JjczogWworICAgICAgICAiOm1lZGlhdXBkYXRlc2VydmljZV9haWRsIiwKICAgICAgICAgIklEYXRhU291cmNlLmNwcCIsCi0gICAgICAgICJJSERDUC5jcHAiLAogICAgICAgICAiQnVmZmVyaW5nU2V0dGluZ3MuY3BwIiwKICAgICAgICAgIm1lZGlhcGxheWVyLmNwcCIsCiAgICAgICAgICJJTWVkaWFIVFRQQ29ubmVjdGlvbi5jcHAiLApAQCAtMTYxLDcgKzE3Nyw2IEBACiAgICAgICAgICJJTWVkaWFNZXRhZGF0YVJldHJpZXZlci5jcHAiLAogICAgICAgICAibWVkaWFtZXRhZGF0YXJldHJpZXZlci5jcHAiLAogICAgICAgICAiTWlkaURldmljZUluZm8uY3BwIiwKLSAgICAgICAgIk1pZGlJb1dyYXBwZXIuY3BwIiwKICAgICAgICAgIkpldFBsYXllci5jcHAiLAogICAgICAgICAiTWVkaWFTY2FubmVyLmNwcCIsCiAgICAgICAgICJNZWRpYVNjYW5uZXJDbGllbnQuY3BwIiwKQEAgLTE3NCw4ICsxODksMjEgQEAKICAgICAgICAgIlN0cmluZ0FycmF5LmNwcCIsCiAgICAgXSwKIAorICAgIGFpZGw6IHsKKyAgICAgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbImFpZGwiXSwKKyAgICAgICAgZXhwb3J0X2FpZGxfaGVhZGVyczogdHJ1ZSwKKyAgICB9LAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKKyAgICBdLAorCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC50b2tlbkAxLjAtdXRpbHMiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJ1dGlscyIsCkBAIC0xODYsMzYgKzIxNCw5MiBAQAogICAgICAgICAibGliZXhwYXQiLAogICAgICAgICAibGliY2FtZXJhX2NsaWVudCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKICAgICAgICAgImxpYmd1aSIsCiAgICAgICAgICJsaWJkbCIsCiAgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKICAgICAgICAgImxpYmF1ZGlvY2xpZW50IiwKLSAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCi0gICAgICAgICJsaWJtZWRpYWRybSIsCi0gICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAotICAgICAgICAibGliYmFzZSIsCi0gICAgICAgICJsaWJoaWRsYmFzZSIsCi0gICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKLSAgICAgICAgImxpYmh3YmluZGVyIiwKLSAgICAgICAgImxpYmhpZGxtZW1vcnkiLAotICAgICAgICAiYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5jb21tb25AMS4wIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYnVmZmVycXVldWVAMS4wIiwKKyAgICAgICAgImxpYm1lZGlhX29teCIsCiAgICAgXSwKIAogICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50IiwKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJpY3V1YyIsCiAgICAgICAgICJsaWJpY3VpMThuIiwKICAgICAgICAgImxpYnNvbml2b3giLAotICAgICAgICAibGlibWVkaWFkcm0iLAotICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKLSAgICAgICAgImFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wIiwKKyAgICAgICAgImxpYm1lZGlhX29teCIsCiAgICAgXSwKIAotICAgIC8vIGZvciBtZW1vcnkgaGVhcCBhbmFseXNpcwogICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJjX21hbGxvY19kZWJ1Z19iYWNrdHJhY2UiLAorICAgICAgICAibGliY19tYWxsb2NfZGVidWdfYmFja3RyYWNlIiwgIC8vIGZvciBtZW1vcnkgaGVhcCBhbmFseXNpcworICAgICAgICAibGlibWVkaWFfbWlkaWlvd3JhcHBlciIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgZGlhZzogeworICAgICAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICB9LAorICAgIH0sCit9CisKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJtZWRpYV9wbGF5ZXIyX3V0aWwiLAorCisgICAgc3JjczogWworICAgICAgICAiQnVmZmVyaW5nU2V0dGluZ3MuY3BwIiwKKyAgICAgICAgIkRhdGFTb3VyY2VEZXNjLmNwcCIsCisgICAgICAgICJJRGF0YVNvdXJjZS5jcHAiLAorICAgICAgICAiSU1lZGlhRXh0cmFjdG9yLmNwcCIsCisgICAgICAgICJJTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcCIsCisgICAgICAgICJJTWVkaWFTb3VyY2UuY3BwIiwKKyAgICAgICAgIk1lZGlhQ29kZWNCdWZmZXIuY3BwIiwKKyAgICAgICAgIk1lZGlhVXRpbHMuY3BwIiwKKyAgICAgICAgIk1ldGFkYXRhLmNwcCIsCisgICAgICAgICJOZGtXcmFwcGVyLmNwcCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCisgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9ydHNwIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3RpbWVkdGV4dCIsCiAgICAgXSwKIAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvUGFyYW1ldGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvUGFyYW1ldGVyLmNwcAppbmRleCA2NWZjNzBiLi4wMzRmN2MyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BdWRpb1BhcmFtZXRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9QYXJhbWV0ZXIuY3BwCkBAIC0zNCw2ICszNCw4IEBACiBjb25zdCBjaGFyICogY29uc3QgQXVkaW9QYXJhbWV0ZXI6OmtleVNjcmVlblN0YXRlID0gQVVESU9fUEFSQU1FVEVSX0tFWV9TQ1JFRU5fU1RBVEU7CiBjb25zdCBjaGFyICogY29uc3QgQXVkaW9QYXJhbWV0ZXI6OmtleUJ0TnJlYyA9IEFVRElPX1BBUkFNRVRFUl9LRVlfQlRfTlJFQzsKIGNvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5SHdBdlN5bmMgPSBBVURJT19QQVJBTUVURVJfSFdfQVZfU1lOQzsKK2NvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5UHJlc2VudGF0aW9uSWQgPSBBVURJT19QQVJBTUVURVJfU1RSRUFNX1BSRVNFTlRBVElPTl9JRDsKK2NvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5UHJvZ3JhbUlkID0gQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9QUk9HUkFNX0lEOwogY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvUGFyYW1ldGVyOjprZXlNb25vT3V0cHV0ID0gQVVESU9fUEFSQU1FVEVSX01PTk9fT1VUUFVUOwogY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1Id0F2U3luYyA9IEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fSFdfQVZfU1lOQzsKIGNvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtQ29ubmVjdCA9IEFVRElPX1BBUkFNRVRFUl9ERVZJQ0VfQ09OTkVDVDsKQEAgLTQ1LDYgKzQ3LDggQEAKIGNvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6dmFsdWVPbiA9IEFVRElPX1BBUkFNRVRFUl9WQUxVRV9PTjsKIGNvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6dmFsdWVPZmYgPSBBVURJT19QQVJBTUVURVJfVkFMVUVfT0ZGOwogY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvUGFyYW1ldGVyOjp2YWx1ZUxpc3RTZXBhcmF0b3IgPSBBVURJT19QQVJBTUVURVJfVkFMVUVfTElTVF9TRVBBUkFUT1I7Citjb25zdCBjaGFyICogY29uc3QgQXVkaW9QYXJhbWV0ZXI6OmtleVJlY29uZmlnQTJkcCA9IEFVRElPX1BBUkFNRVRFUl9SRUNPTkZJR19BMkRQOworY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvUGFyYW1ldGVyOjprZXlSZWNvbmZpZ0EyZHBTdXBwb3J0ZWQgPSBBVURJT19QQVJBTUVURVJfQTJEUF9SRUNPTkZJR19TVVBQT1JURUQ7CiAKIEF1ZGlvUGFyYW1ldGVyOjpBdWRpb1BhcmFtZXRlcihjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKQogewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQnVmZmVyaW5nU2V0dGluZ3MuY3BwIGIvbWVkaWEvbGlibWVkaWEvQnVmZmVyaW5nU2V0dGluZ3MuY3BwCmluZGV4IGE2OTQ5N2UuLjI3MWEyMzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0J1ZmZlcmluZ1NldHRpbmdzLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9CdWZmZXJpbmdTZXR0aW5ncy5jcHAKQEAgLTIzLDQzICsyMywxNiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLS8vIHN0YXRpYwotYm9vbCBCdWZmZXJpbmdTZXR0aW5nczo6SXNWYWxpZEJ1ZmZlcmluZ01vZGUoaW50IG1vZGUpIHsKLSAgICByZXR1cm4gKG1vZGUgPj0gQlVGRkVSSU5HX01PREVfTk9ORSAmJiBtb2RlIDwgQlVGRkVSSU5HX01PREVfQ09VTlQpOwotfQotCi0vLyBzdGF0aWMKLWJvb2wgQnVmZmVyaW5nU2V0dGluZ3M6OklzVGltZUJhc2VkQnVmZmVyaW5nTW9kZShpbnQgbW9kZSkgewotICAgIHJldHVybiAobW9kZSA9PSBCVUZGRVJJTkdfTU9ERV9USU1FX09OTFkgfHwgbW9kZSA9PSBCVUZGRVJJTkdfTU9ERV9USU1FX1RIRU5fU0laRSk7Ci19Ci0KLS8vIHN0YXRpYwotYm9vbCBCdWZmZXJpbmdTZXR0aW5nczo6SXNTaXplQmFzZWRCdWZmZXJpbmdNb2RlKGludCBtb2RlKSB7Ci0gICAgcmV0dXJuIChtb2RlID09IEJVRkZFUklOR19NT0RFX1NJWkVfT05MWSB8fCBtb2RlID09IEJVRkZFUklOR19NT0RFX1RJTUVfVEhFTl9TSVpFKTsKLX0KLQogQnVmZmVyaW5nU2V0dGluZ3M6OkJ1ZmZlcmluZ1NldHRpbmdzKCkKLSAgICAgICAgOiBtSW5pdGlhbEJ1ZmZlcmluZ01vZGUoQlVGRkVSSU5HX01PREVfTk9ORSksCi0gICAgICAgICAgbVJlYnVmZmVyaW5nTW9kZShCVUZGRVJJTkdfTU9ERV9OT05FKSwKLSAgICAgICAgICBtSW5pdGlhbFdhdGVybWFya01zKGtOb1dhdGVybWFyayksCi0gICAgICAgICAgbUluaXRpYWxXYXRlcm1hcmtLQihrTm9XYXRlcm1hcmspLAotICAgICAgICAgIG1SZWJ1ZmZlcmluZ1dhdGVybWFya0xvd01zKGtOb1dhdGVybWFyayksCi0gICAgICAgICAgbVJlYnVmZmVyaW5nV2F0ZXJtYXJrSGlnaE1zKGtOb1dhdGVybWFyayksCi0gICAgICAgICAgbVJlYnVmZmVyaW5nV2F0ZXJtYXJrTG93S0Ioa05vV2F0ZXJtYXJrKSwKLSAgICAgICAgICBtUmVidWZmZXJpbmdXYXRlcm1hcmtIaWdoS0Ioa05vV2F0ZXJtYXJrKSB7IH0KKyAgICAgICAgOiBtSW5pdGlhbE1hcmtNcyhrTm9NYXJrKSwKKyAgICAgICAgICBtUmVzdW1lUGxheWJhY2tNYXJrTXMoa05vTWFyaykgeyB9CiAKIHN0YXR1c190IEJ1ZmZlcmluZ1NldHRpbmdzOjpyZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgewogICAgIGlmIChwYXJjZWwgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBtSW5pdGlhbEJ1ZmZlcmluZ01vZGUgPSAoQnVmZmVyaW5nTW9kZSlwYXJjZWwtPnJlYWRJbnQzMigpOwotICAgIG1SZWJ1ZmZlcmluZ01vZGUgPSAoQnVmZmVyaW5nTW9kZSlwYXJjZWwtPnJlYWRJbnQzMigpOwotICAgIG1Jbml0aWFsV2F0ZXJtYXJrTXMgPSBwYXJjZWwtPnJlYWRJbnQzMigpOwotICAgIG1Jbml0aWFsV2F0ZXJtYXJrS0IgPSBwYXJjZWwtPnJlYWRJbnQzMigpOwotICAgIG1SZWJ1ZmZlcmluZ1dhdGVybWFya0xvd01zID0gcGFyY2VsLT5yZWFkSW50MzIoKTsKLSAgICBtUmVidWZmZXJpbmdXYXRlcm1hcmtIaWdoTXMgPSBwYXJjZWwtPnJlYWRJbnQzMigpOwotICAgIG1SZWJ1ZmZlcmluZ1dhdGVybWFya0xvd0tCID0gcGFyY2VsLT5yZWFkSW50MzIoKTsKLSAgICBtUmVidWZmZXJpbmdXYXRlcm1hcmtIaWdoS0IgPSBwYXJjZWwtPnJlYWRJbnQzMigpOworICAgIG1Jbml0aWFsTWFya01zID0gcGFyY2VsLT5yZWFkSW50MzIoKTsKKyAgICBtUmVzdW1lUGxheWJhY2tNYXJrTXMgPSBwYXJjZWwtPnJlYWRJbnQzMigpOwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtNjgsMjYgKzQxLDE3IEBACiAgICAgaWYgKHBhcmNlbCA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtSW5pdGlhbEJ1ZmZlcmluZ01vZGUpOwotICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtUmVidWZmZXJpbmdNb2RlKTsKLSAgICBwYXJjZWwtPndyaXRlSW50MzIobUluaXRpYWxXYXRlcm1hcmtNcyk7Ci0gICAgcGFyY2VsLT53cml0ZUludDMyKG1Jbml0aWFsV2F0ZXJtYXJrS0IpOwotICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtUmVidWZmZXJpbmdXYXRlcm1hcmtMb3dNcyk7Ci0gICAgcGFyY2VsLT53cml0ZUludDMyKG1SZWJ1ZmZlcmluZ1dhdGVybWFya0hpZ2hNcyk7Ci0gICAgcGFyY2VsLT53cml0ZUludDMyKG1SZWJ1ZmZlcmluZ1dhdGVybWFya0xvd0tCKTsKLSAgICBwYXJjZWwtPndyaXRlSW50MzIobVJlYnVmZmVyaW5nV2F0ZXJtYXJrSGlnaEtCKTsKKyAgICBwYXJjZWwtPndyaXRlSW50MzIobUluaXRpYWxNYXJrTXMpOworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtUmVzdW1lUGxheWJhY2tNYXJrTXMpOwogCiAgICAgcmV0dXJuIE9LOwogfQogCiBTdHJpbmc4IEJ1ZmZlcmluZ1NldHRpbmdzOjp0b1N0cmluZygpIGNvbnN0IHsKICAgICBTdHJpbmc4IHM7Ci0gICAgcy5hcHBlbmRGb3JtYXQoImluaXRpYWxNb2RlKCVkKSwgcmVidWZmZXJpbmdNb2RlKCVkKSwgIgotICAgICAgICAgICAgImluaXRpYWxNYXJrcyglZCBtcywgJWQgS0IpLCByZWJ1ZmZlcmluZ01hcmtzKCVkLCAlZCltcywgKCVkLCAlZClLQiIsCi0gICAgICAgICAgICBtSW5pdGlhbEJ1ZmZlcmluZ01vZGUsIG1SZWJ1ZmZlcmluZ01vZGUsCi0gICAgICAgICAgICBtSW5pdGlhbFdhdGVybWFya01zLCBtSW5pdGlhbFdhdGVybWFya0tCLAotICAgICAgICAgICAgbVJlYnVmZmVyaW5nV2F0ZXJtYXJrTG93TXMsIG1SZWJ1ZmZlcmluZ1dhdGVybWFya0hpZ2hNcywKLSAgICAgICAgICAgIG1SZWJ1ZmZlcmluZ1dhdGVybWFya0xvd0tCLCBtUmVidWZmZXJpbmdXYXRlcm1hcmtIaWdoS0IpOworICAgIHMuYXBwZW5kRm9ybWF0KAorICAgICAgICAgICAgImluaXRpYWxNYXJrcyglZCBtcyksIHJlc3VtZVBsYXliYWNrTWFya3MoJWQgbXMpIiwKKyAgICAgICAgICAgIG1Jbml0aWFsTWFya01zLCBtUmVzdW1lUGxheWJhY2tNYXJrTXMpOwogICAgIHJldHVybiBzOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9EYXRhU291cmNlRGVzYy5jcHAgYi9tZWRpYS9saWJtZWRpYS9EYXRhU291cmNlRGVzYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdjY2JjZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL0RhdGFTb3VyY2VEZXNjLmNwcApAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkRhdGFTb3VyY2VEZXNjIgorCisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VEZXNjLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQU2VydmljZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBjb25zdCBpbnQ2NF90IGtMb25nTWF4ID0gMHg3ZmZmZmZmZmZmZmZmZmZMOworCitEYXRhU291cmNlRGVzYzo6RGF0YVNvdXJjZURlc2MoKQorICAgIDogbVR5cGUoVFlQRV9OT05FKSwKKyAgICAgIG1GRE9mZnNldCgwKSwKKyAgICAgIG1GRExlbmd0aChrTG9uZ01heCksCisgICAgICBtSWQoMCksCisgICAgICBtU3RhcnRQb3NpdGlvbk1zKDApLAorICAgICAgbUVuZFBvc2l0aW9uTXMoMCkgeworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSUhEQ1AuY3BwIGIvbWVkaWEvbGlibWVkaWEvSUhEQ1AuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDYwMTdmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhL0lIRENQLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJJSERDUCIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxtZWRpYS9JSERDUC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1lbnVtIHsKLSAgICBPQlNFUlZFUl9OT1RJRlkgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAotICAgIEhEQ1BfU0VUX09CU0VSVkVSLAotICAgIEhEQ1BfSU5JVF9BU1lOQywKLSAgICBIRENQX1NIVVRET1dOX0FTWU5DLAotICAgIEhEQ1BfR0VUX0NBUFMsCi0gICAgSERDUF9FTkNSWVBULAotICAgIEhEQ1BfRU5DUllQVF9OQVRJVkUsCi0gICAgSERDUF9ERUNSWVBULAotfTsKLQotc3RydWN0IEJwSERDUE9ic2VydmVyIDogcHVibGljIEJwSW50ZXJmYWNlPElIRENQT2JzZXJ2ZXI+IHsKLSAgICBleHBsaWNpdCBCcEhEQ1BPYnNlcnZlcihjb25zdCBzcDxJQmluZGVyPiAmaW1wbCkKLSAgICAgICAgOiBCcEludGVyZmFjZTxJSERDUE9ic2VydmVyPihpbXBsKSB7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIG5vdGlmeSgKLSAgICAgICAgICAgIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICpvYmopIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUhEQ1BPYnNlcnZlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKG1zZyk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihleHQxKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGV4dDIpOwotICAgICAgICBpZiAob2JqICYmIG9iai0+ZGF0YVNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIGRhdGEuYXBwZW5kRnJvbShjb25zdF9jYXN0PFBhcmNlbCAqPihvYmopLCAwLCBvYmotPmRhdGFTaXplKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChPQlNFUlZFUl9OT1RJRlksIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOwotICAgIH0KLX07Ci0KLUlNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShIRENQT2JzZXJ2ZXIsICJhbmRyb2lkLmhhcmR3YXJlLklIRENQT2JzZXJ2ZXIiKTsKLQotc3RydWN0IEJwSERDUCA6IHB1YmxpYyBCcEludGVyZmFjZTxJSERDUD4gewotICAgIGV4cGxpY2l0IEJwSERDUChjb25zdCBzcDxJQmluZGVyPiAmaW1wbCkKLSAgICAgICAgOiBCcEludGVyZmFjZTxJSERDUD4oaW1wbCkgewotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T2JzZXJ2ZXIoY29uc3Qgc3A8SUhEQ1BPYnNlcnZlcj4gJm9ic2VydmVyKSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElIRENQOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKG9ic2VydmVyKSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChIRENQX1NFVF9PQlNFUlZFUiwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdEFzeW5jKGNvbnN0IGNoYXIgKmhvc3QsIHVuc2lnbmVkIHBvcnQpIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUhEQ1A6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVDU3RyaW5nKGhvc3QpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIocG9ydCk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChIRENQX0lOSVRfQVNZTkMsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNodXRkb3duQXN5bmMoKSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElIRENQOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoSERDUF9TSFVURE9XTl9BU1lOQywgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwotICAgIH0KLQotICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0Q2FwcygpIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUhEQ1A6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChIRENQX0dFVF9DQVBTLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBlbmNyeXB0KAotICAgICAgICAgICAgY29uc3Qgdm9pZCAqaW5EYXRhLCBzaXplX3Qgc2l6ZSwgdWludDMyX3Qgc3RyZWFtQ1RSLAotICAgICAgICAgICAgdWludDY0X3QgKm91dElucHV0Q1RSLCB2b2lkICpvdXREYXRhKSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElIRENQOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc2l6ZSk7Ci0gICAgICAgIGRhdGEud3JpdGUoaW5EYXRhLCBzaXplKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHN0cmVhbUNUUik7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChIRENQX0VOQ1JZUFQsIGRhdGEsICZyZXBseSk7Ci0KLSAgICAgICAgc3RhdHVzX3QgZXJyID0gcmVwbHkucmVhZEludDMyKCk7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgKm91dElucHV0Q1RSID0gMDsKLQotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgICpvdXRJbnB1dENUUiA9IHJlcGx5LnJlYWRJbnQ2NCgpOwotICAgICAgICByZXBseS5yZWFkKG91dERhdGEsIHNpemUpOwotCi0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBlbmNyeXB0TmF0aXZlKAotICAgICAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4gJmdyYXBoaWNCdWZmZXIsCi0gICAgICAgICAgICBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgdWludDMyX3Qgc3RyZWFtQ1RSLAotICAgICAgICAgICAgdWludDY0X3QgKm91dElucHV0Q1RSLCB2b2lkICpvdXREYXRhKSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElIRENQOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlKCpncmFwaGljQnVmZmVyKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKG9mZnNldCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzaXplKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHN0cmVhbUNUUik7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChIRENQX0VOQ1JZUFRfTkFUSVZFLCBkYXRhLCAmcmVwbHkpOwotCi0gICAgICAgIHN0YXR1c190IGVyciA9IHJlcGx5LnJlYWRJbnQzMigpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICpvdXRJbnB1dENUUiA9IDA7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgKm91dElucHV0Q1RSID0gcmVwbHkucmVhZEludDY0KCk7Ci0gICAgICAgIHJlcGx5LnJlYWQob3V0RGF0YSwgc2l6ZSk7Ci0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGRlY3J5cHQoCi0gICAgICAgICAgICBjb25zdCB2b2lkICppbkRhdGEsIHNpemVfdCBzaXplLAotICAgICAgICAgICAgdWludDMyX3Qgc3RyZWFtQ1RSLCB1aW50NjRfdCBpbnB1dENUUiwKLSAgICAgICAgICAgIHZvaWQgKm91dERhdGEpIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUhEQ1A6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzaXplKTsKLSAgICAgICAgZGF0YS53cml0ZShpbkRhdGEsIHNpemUpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RyZWFtQ1RSKTsKLSAgICAgICAgZGF0YS53cml0ZUludDY0KGlucHV0Q1RSKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEhEQ1BfREVDUllQVCwgZGF0YSwgJnJlcGx5KTsKLQotICAgICAgICBzdGF0dXNfdCBlcnIgPSByZXBseS5yZWFkSW50MzIoKTsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVwbHkucmVhZChvdXREYXRhLCBzaXplKTsKLQotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLX07Ci0KLUlNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShIRENQLCAiYW5kcm9pZC5oYXJkd2FyZS5JSERDUCIpOwotCi1zdGF0dXNfdCBCbkhEQ1BPYnNlcnZlcjo6b25UcmFuc2FjdCgKLSAgICAgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsICZkYXRhLCBQYXJjZWwgKnJlcGx5LCB1aW50MzJfdCBmbGFncykgewotICAgIHN3aXRjaCAoY29kZSkgewotICAgICAgICBjYXNlIE9CU0VSVkVSX05PVElGWToKLSAgICAgICAgewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElIRENQT2JzZXJ2ZXIsIGRhdGEsIHJlcGx5KTsKLQotICAgICAgICAgICAgaW50IG1zZyA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpbnQgZXh0MSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpbnQgZXh0MiA9IGRhdGEucmVhZEludDMyKCk7Ci0KLSAgICAgICAgICAgIFBhcmNlbCBvYmo7Ci0gICAgICAgICAgICBpZiAoZGF0YS5kYXRhQXZhaWwoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBvYmouYXBwZW5kRnJvbSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8UGFyY2VsICo+KCZkYXRhKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZGF0YVBvc2l0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmRhdGFBdmFpbCgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbm90aWZ5KG1zZywgZXh0MSwgZXh0MiwgJm9iaik7Ci0KLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgQm5IRENQOjpvblRyYW5zYWN0KAotICAgICAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwgJmRhdGEsIFBhcmNlbCAqcmVwbHksIHVpbnQzMl90IGZsYWdzKSB7Ci0gICAgc3dpdGNoIChjb2RlKSB7Ci0gICAgICAgIGNhc2UgSERDUF9TRVRfT0JTRVJWRVI6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJSERDUCwgZGF0YSwgcmVwbHkpOwotCi0gICAgICAgICAgICBzcDxJSERDUE9ic2VydmVyPiBvYnNlcnZlciA9Ci0gICAgICAgICAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8SUhEQ1BPYnNlcnZlcj4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOwotCi0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXRPYnNlcnZlcihvYnNlcnZlcikpOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBIRENQX0lOSVRfQVNZTkM6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJSERDUCwgZGF0YSwgcmVwbHkpOwotCi0gICAgICAgICAgICBjb25zdCBjaGFyICpob3N0ID0gZGF0YS5yZWFkQ1N0cmluZygpOwotICAgICAgICAgICAgdW5zaWduZWQgcG9ydCA9IGRhdGEucmVhZEludDMyKCk7Ci0KLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGluaXRBc3luYyhob3N0LCBwb3J0KSk7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIEhEQ1BfU0hVVERPV05fQVNZTkM6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJSERDUCwgZGF0YSwgcmVwbHkpOwotCi0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzaHV0ZG93bkFzeW5jKCkpOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBIRENQX0dFVF9DQVBTOgotICAgICAgICB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUhEQ1AsIGRhdGEsIHJlcGx5KTsKLQotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZ2V0Q2FwcygpKTsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgSERDUF9FTkNSWVBUOgotICAgICAgICB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUhEQ1AsIGRhdGEsIHJlcGx5KTsKLQotICAgICAgICAgICAgc2l6ZV90IHNpemUgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgdm9pZCAqaW5EYXRhID0gTlVMTDsKLSAgICAgICAgICAgIC8vIHdhdGNoIG91dCBmb3Igb3ZlcmZsb3cKLSAgICAgICAgICAgIGlmIChzaXplIDw9IFNJWkVfTUFYIC8gMikgewotICAgICAgICAgICAgICAgIGluRGF0YSA9IG1hbGxvYygyICogc2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaW5EYXRhID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihFUlJPUl9PVVRfT0ZfUkFOR0UpOwotICAgICAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdm9pZCAqb3V0RGF0YSA9ICh1aW50OF90ICopaW5EYXRhICsgc2l6ZTsKLQotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gZGF0YS5yZWFkKGluRGF0YSwgc2l6ZSk7Ci0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShpbkRhdGEpOwotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1aW50MzJfdCBzdHJlYW1DVFIgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgdWludDY0X3QgaW5wdXRDVFI7Ci0gICAgICAgICAgICBlcnIgPSBlbmNyeXB0KGluRGF0YSwgc2l6ZSwgc3RyZWFtQ1RSLCAmaW5wdXRDVFIsIG91dERhdGEpOwotCi0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihlcnIpOwotCi0gICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50NjQoaW5wdXRDVFIpOwotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZShvdXREYXRhLCBzaXplKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZnJlZShpbkRhdGEpOwotICAgICAgICAgICAgaW5EYXRhID0gb3V0RGF0YSA9IE5VTEw7Ci0KLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgSERDUF9FTkNSWVBUX05BVElWRToKLSAgICAgICAgewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElIRENQLCBkYXRhLCByZXBseSk7Ci0KLSAgICAgICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IGdyYXBoaWNCdWZmZXIgPSBuZXcgR3JhcGhpY0J1ZmZlcigpOwotICAgICAgICAgICAgZGF0YS5yZWFkKCpncmFwaGljQnVmZmVyKTsKLSAgICAgICAgICAgIHNpemVfdCBvZmZzZXQgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgc2l6ZV90IHNpemUgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgdWludDMyX3Qgc3RyZWFtQ1RSID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHZvaWQgKm91dERhdGEgPSBOVUxMOwotICAgICAgICAgICAgdWludDY0X3QgaW5wdXRDVFI7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IEVSUk9SX09VVF9PRl9SQU5HRTsKLQotICAgICAgICAgICAgb3V0RGF0YSA9IG1hbGxvYyhzaXplKTsKLQotICAgICAgICAgICAgaWYgKG91dERhdGEgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGVyciA9IGVuY3J5cHROYXRpdmUoZ3JhcGhpY0J1ZmZlciwgb2Zmc2V0LCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtQ1RSLCAmaW5wdXRDVFIsIG91dERhdGEpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihlcnIpOwotCi0gICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50NjQoaW5wdXRDVFIpOwotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZShvdXREYXRhLCBzaXplKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZnJlZShvdXREYXRhKTsKLSAgICAgICAgICAgIG91dERhdGEgPSBOVUxMOwotCi0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIEhEQ1BfREVDUllQVDoKLSAgICAgICAgewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElIRENQLCBkYXRhLCByZXBseSk7Ci0KLSAgICAgICAgICAgIHNpemVfdCBzaXplID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHNpemVfdCBidWZTaXplID0gMiAqIHNpemU7Ci0KLSAgICAgICAgICAgIC8vIHdhdGNoIG91dCBmb3Igb3ZlcmZsb3cKLSAgICAgICAgICAgIHZvaWQgKmluRGF0YSA9IE5VTEw7Ci0gICAgICAgICAgICBpZiAoYnVmU2l6ZSA+IHNpemUpIHsKLSAgICAgICAgICAgICAgICBpbkRhdGEgPSBtYWxsb2MoYnVmU2l6ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpbkRhdGEgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKEVSUk9SX09VVF9PRl9SQU5HRSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB2b2lkICpvdXREYXRhID0gKHVpbnQ4X3QgKilpbkRhdGEgKyBzaXplOwotCi0gICAgICAgICAgICBkYXRhLnJlYWQoaW5EYXRhLCBzaXplKTsKLQotICAgICAgICAgICAgdWludDMyX3Qgc3RyZWFtQ1RSID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHVpbnQ2NF90IGlucHV0Q1RSID0gZGF0YS5yZWFkSW50NjQoKTsKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGRlY3J5cHQoaW5EYXRhLCBzaXplLCBzdHJlYW1DVFIsIGlucHV0Q1RSLCBvdXREYXRhKTsKLQotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZXJyKTsKLQotICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZShvdXREYXRhLCBzaXplKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZnJlZShpbkRhdGEpOwotICAgICAgICAgICAgaW5EYXRhID0gb3V0RGF0YSA9IE5VTEw7Ci0KLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwotICAgIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYUNvZGVjU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFDb2RlY1NlcnZpY2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGZhOTNkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYUNvZGVjU2VydmljZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKgotKioKLSoqIENvcHlyaWdodCAyMDE1LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jZGVmaW5lIExPR19UQUcgIklNZWRpYUNvZGVjU2VydmljZSIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFDb2RlY1NlcnZpY2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1lbnVtIHsKLSAgICBHRVRfT01YID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKLSAgICBHRVRfT01YX1NUT1JFCi19OwotCi1jbGFzcyBCcE1lZGlhQ29kZWNTZXJ2aWNlIDogcHVibGljIEJwSW50ZXJmYWNlPElNZWRpYUNvZGVjU2VydmljZT4KLXsKLXB1YmxpYzoKLSAgICBleHBsaWNpdCBCcE1lZGlhQ29kZWNTZXJ2aWNlKGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKQotICAgICAgICA6IEJwSW50ZXJmYWNlPElNZWRpYUNvZGVjU2VydmljZT4oaW1wbCkKLSAgICB7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzcDxJT01YPiBnZXRPTVgoKSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYUNvZGVjU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9PTVgsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiBpbnRlcmZhY2VfY2FzdDxJT01YPihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3A8SU9NWFN0b3JlPiBnZXRPTVhTdG9yZSgpIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhQ29kZWNTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX09NWF9TVE9SRSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIGludGVyZmFjZV9jYXN0PElPTVhTdG9yZT4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICB9Ci0KLX07Ci0KLUlNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShNZWRpYUNvZGVjU2VydmljZSwgImFuZHJvaWQubWVkaWEuSU1lZGlhQ29kZWNTZXJ2aWNlIik7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdHVzX3QgQm5NZWRpYUNvZGVjU2VydmljZTo6b25UcmFuc2FjdCgKLSAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQotewotICAgIHN3aXRjaCAoY29kZSkgewotCi0gICAgICAgIGNhc2UgR0VUX09NWDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYUNvZGVjU2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3A8SU9NWD4gb214ID0gZ2V0T01YKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIob214KSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBHRVRfT01YX1NUT1JFOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhQ29kZWNTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBzcDxJT01YU3RvcmU+IG9teFN0b3JlID0gZ2V0T01YU3RvcmUoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihvbXhTdG9yZSkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwotICAgIH0KLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhRXh0cmFjdG9yLmNwcAppbmRleCAzYzQzYTcyLi5lOWE2MjMwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYUV4dHJhY3Rvci5jcHAKQEAgLTIzLDYgKzIzLDcgQEAKIAogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGVybWlzc2lvbkNhY2hlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KIApAQCAtMzQsMTIgKzM1LDkgQEAKICAgICBHRVRUUkFDS01FVEFEQVRBLAogICAgIEdFVE1FVEFEQVRBLAogICAgIEZMQUdTLAotICAgIEdFVERSTVRSQUNLSU5GTywKICAgICBTRVRNRURJQUNBUywKLSAgICBTRVRVSUQsCiAgICAgTkFNRSwKLSAgICBHRVRNRVRSSUNTLAotICAgIFJFTEVBU0UsCisgICAgR0VUTUVUUklDUwogfTsKIAogY2xhc3MgQnBNZWRpYUV4dHJhY3RvciA6IHB1YmxpYyBCcEludGVyZmFjZTxJTWVkaWFFeHRyYWN0b3I+IHsKQEAgLTExMiwxMSArMTEwLDYgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgdmlydHVhbCBjaGFyKiBnZXREcm1UcmFja0luZm8oc2l6ZV90IHRyYWNrSUQgX191bnVzZWQsIGludCAqbGVuIF9fdW51c2VkKSB7Ci0gICAgICAgIEFMT0dWKCJnZXREcm1UcmFja0luZm8gTk9UIElNUExFTUVOVEVEIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWVkaWFDYXMoY29uc3QgSEludGVyZmFjZVRva2VuICZjYXNUb2tlbikgewogICAgICAgICBBTE9HVigic2V0TWVkaWFDYXMiKTsKIApAQCAtMTMxLDIxICsxMjQsMTAgQEAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAotICAgIHZpcnR1YWwgdm9pZCBzZXRVSUQodWlkX3QgdWlkIF9fdW51c2VkKSB7Ci0gICAgICAgIEFMT0dWKCJzZXRVSUQgTk9UIElNUExFTUVOVEVEIik7Ci0gICAgfQotCiAgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsKICAgICAgICAgQUxPR1YoIm5hbWUgTk9UIElNUExFTUVOVEVEIik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlKCkgewotICAgICAgICBBTE9HVigicmVsZWFzZSIpOwotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihCcE1lZGlhRXh0cmFjdG9yOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVMRUFTRSwgZGF0YSwgJnJlcGx5KTsKLSAgICB9CiB9OwogCiBJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoTWVkaWFFeHRyYWN0b3IsICJhbmRyb2lkLm1lZGlhLklNZWRpYUV4dHJhY3RvciIpOwpAQCAtMjIzLDEyICsyMDUsNiBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0TWVkaWFDYXMoY2FzVG9rZW4pKTsKICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQotICAgICAgICBjYXNlIFJFTEVBU0U6IHsKLSAgICAgICAgICAgIEFMT0dWKCJyZWxlYXNlIik7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhRXh0cmFjdG9yLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICByZWxlYXNlKCk7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CiAgICAgfQpAQCAtMzIzLDEzICsyOTksMjEgQEAKIAogc3RhdHVzX3QgZHVtcEV4dHJhY3RvcnMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JikgewogICAgIFN0cmluZzggb3V0OwotICAgIG91dC5hcHBlbmQoIlJlY2VudCBleHRyYWN0b3JzLCBtb3N0IHJlY2VudCBmaXJzdDpcbiIpOwotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soc0V4dHJhY3RvcnNMb2NrKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzRXh0cmFjdG9ycy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgY29uc3QgRXh0cmFjdG9ySW5zdGFuY2UgJmluc3RhbmNlID0gc0V4dHJhY3RvcnMuaXRlbUF0KGkpOwotICAgICAgICAgICAgb3V0LmFwcGVuZCgiICAiKTsKLSAgICAgICAgICAgIG91dC5hcHBlbmQoaW5zdGFuY2UudG9TdHJpbmcoKSk7CisgICAgY29uc3QgSVBDVGhyZWFkU3RhdGUqIGlwYyA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCk7CisgICAgY29uc3QgaW50IHBpZCA9IGlwYy0+Z2V0Q2FsbGluZ1BpZCgpOworICAgIGNvbnN0IGludCB1aWQgPSBpcGMtPmdldENhbGxpbmdVaWQoKTsKKyAgICBpZiAoIVBlcm1pc3Npb25DYWNoZTo6Y2hlY2tQZXJtaXNzaW9uKFN0cmluZzE2KCJhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpLCBwaWQsIHVpZCkpIHsKKyAgICAgICAgb3V0LmFwcGVuZEZvcm1hdCgiUGVybWlzc2lvbiBEZW5pYWw6ICIKKyAgICAgICAgICAgICAgICAiY2FuJ3QgZHVtcCBNZWRpYUV4dHJhY3RvciBmcm9tIHBpZD0lZCwgdWlkPSVkXG4iLCBwaWQsIHVpZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0LmFwcGVuZCgiUmVjZW50IGV4dHJhY3RvcnMsIG1vc3QgcmVjZW50IGZpcnN0OlxuIik7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKHNFeHRyYWN0b3JzTG9jayk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNFeHRyYWN0b3JzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgY29uc3QgRXh0cmFjdG9ySW5zdGFuY2UgJmluc3RhbmNlID0gc0V4dHJhY3RvcnMuaXRlbUF0KGkpOworICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIiAgIik7CisgICAgICAgICAgICAgICAgb3V0LmFwcGVuZChpbnN0YW5jZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KICAgICB3cml0ZShmZCwgb3V0LnN0cmluZygpLCBvdXQuc2l6ZSgpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAKaW5kZXggN2MwZDA4ZC4uZDc1MzNjYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhRXh0cmFjdG9yU2VydmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5jcHAKaW5kZXggMDYyYTA3YS4uNzRkOGVlOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmNwcApAQCAtMzQsNyArMzQsNyBAQAogICAgICAgICA6IEJwSW50ZXJmYWNlPElNZWRpYUhUVFBTZXJ2aWNlPihpbXBsKSB7CiAgICAgfQogCi0gICAgdmlydHVhbCBzcDxJTWVkaWFIVFRQQ29ubmVjdGlvbj4gbWFrZUhUVFBDb25uZWN0aW9uKCkgeworICAgIHZpcnR1YWwgc3A8TWVkaWFIVFRQQ29ubmVjdGlvbj4gbWFrZUhUVFBDb25uZWN0aW9uKCkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbigKICAgICAgICAgICAgICAgICBJTWVkaWFIVFRQU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmNwcAppbmRleCA1ZWEyZThiLi41OTBiYTFhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuY3BwCkBAIC02OCw2ICs2OCw5IEBACiAgICAgU0VUX0RBVEFfU09VUkNFX0ZELAogICAgIFNFVF9EQVRBX1NPVVJDRV9DQUxMQkFDSywKICAgICBHRVRfRlJBTUVfQVRfVElNRSwKKyAgICBHRVRfSU1BR0VfQVRfSU5ERVgsCisgICAgR0VUX0lNQUdFX1JFQ1RfQVRfSU5ERVgsCisgICAgR0VUX0ZSQU1FX0FUX0lOREVYLAogICAgIEVYVFJBQ1RfQUxCVU1fQVJULAogICAgIEVYVFJBQ1RfTUVUQURBVEEsCiB9OwpAQCAtMTY0LDYgKzE2Nyw4MCBAQAogICAgICAgICByZXR1cm4gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKICAgICB9CiAKKyAgICBzcDxJTWVtb3J5PiBnZXRJbWFnZUF0SW5kZXgoaW50IGluZGV4LCBpbnQgY29sb3JGb3JtYXQsIGJvb2wgbWV0YU9ubHksIGJvb2wgdGh1bWJuYWlsKQorICAgIHsKKyAgICAgICAgQUxPR1YoImdldEltYWdlQXRJbmRleDogaW5kZXggJWQsIGNvbG9yRm9ybWF0KCVkKSBtZXRhT25seSglZCkgdGh1bWJuYWlsKCVkKSIsCisgICAgICAgICAgICAgICAgaW5kZXgsIGNvbG9yRm9ybWF0LCBtZXRhT25seSwgdGh1bWJuYWlsKTsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihpbmRleCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihjb2xvckZvcm1hdCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihtZXRhT25seSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMih0aHVtYm5haWwpOworI2lmbmRlZiBESVNBQkxFX0dST1VQX1NDSEVEVUxFX0hBQ0sKKyAgICAgICAgc2VuZFNjaGVkUG9saWN5KGRhdGEpOworI2VuZGlmCisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfSU1BR0VfQVRfSU5ERVgsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHN0YXR1c190IHJldCA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICB9CisKKyAgICBzcDxJTWVtb3J5PiBnZXRJbWFnZVJlY3RBdEluZGV4KAorICAgICAgICAgICAgaW50IGluZGV4LCBpbnQgY29sb3JGb3JtYXQsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20pCisgICAgeworICAgICAgICBBTE9HVigiZ2V0SW1hZ2VSZWN0QXRJbmRleDogaW5kZXggJWQsIGNvbG9yRm9ybWF0KCVkKSByZWN0IHslZCwgJWQsICVkLCAlZH0iLAorICAgICAgICAgICAgICAgIGluZGV4LCBjb2xvckZvcm1hdCwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihpbmRleCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihjb2xvckZvcm1hdCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihsZWZ0KTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHRvcCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihyaWdodCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihib3R0b20pOworI2lmbmRlZiBESVNBQkxFX0dST1VQX1NDSEVEVUxFX0hBQ0sKKyAgICAgICAgc2VuZFNjaGVkUG9saWN5KGRhdGEpOworI2VuZGlmCisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfSU1BR0VfUkVDVF9BVF9JTkRFWCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgc3RhdHVzX3QgcmV0ID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgIH0KKworICAgIHN0YXR1c190IGdldEZyYW1lQXRJbmRleChzdGQ6OnZlY3RvcjxzcDxJTWVtb3J5PiA+ICpmcmFtZXMsCisgICAgICAgICAgICBpbnQgZnJhbWVJbmRleCwgaW50IG51bUZyYW1lcywgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5KQorICAgIHsKKyAgICAgICAgQUxPR1YoImdldEZyYW1lQXRJbmRleDogZnJhbWVJbmRleCglZCksIG51bUZyYW1lcyglZCksIGNvbG9yRm9ybWF0KCVkKSBtZXRhT25seSglZCkiLAorICAgICAgICAgICAgICAgIGZyYW1lSW5kZXgsIG51bUZyYW1lcywgY29sb3JGb3JtYXQsIG1ldGFPbmx5KTsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihmcmFtZUluZGV4KTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKG51bUZyYW1lcyk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihjb2xvckZvcm1hdCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihtZXRhT25seSk7CisjaWZuZGVmIERJU0FCTEVfR1JPVVBfU0NIRURVTEVfSEFDSworICAgICAgICBzZW5kU2NoZWRQb2xpY3koZGF0YSk7CisjZW5kaWYKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9GUkFNRV9BVF9JTkRFWCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgc3RhdHVzX3QgcmV0ID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgaW50IHJldE51bUZyYW1lcyA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBpZiAocmV0TnVtRnJhbWVzIDwgbnVtRnJhbWVzKSB7CisgICAgICAgICAgICBudW1GcmFtZXMgPSByZXROdW1GcmFtZXM7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1GcmFtZXM7IGkrKykgeworICAgICAgICAgICAgZnJhbWVzLT5wdXNoX2JhY2soaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKwogICAgIHNwPElNZW1vcnk+IGV4dHJhY3RBbGJ1bUFydCgpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CkBAIC0zMDAsNiArMzc3LDgzIEBACiAjZW5kaWYKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBHRVRfSU1BR0VfQVRfSU5ERVg6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFNZXRhZGF0YVJldHJpZXZlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgaW50IGluZGV4ID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGludCBjb2xvckZvcm1hdCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBib29sIG1ldGFPbmx5ID0gKGRhdGEucmVhZEludDMyKCkgIT0gMCk7CisgICAgICAgICAgICBib29sIHRodW1ibmFpbCA9IChkYXRhLnJlYWRJbnQzMigpICE9IDApOworICAgICAgICAgICAgQUxPR1YoImdldEltYWdlQXRJbmRleDogaW5kZXgoJWQpLCBjb2xvckZvcm1hdCglZCksIG1ldGFPbmx5KCVkKSwgdGh1bWJuYWlsKCVkKSIsCisgICAgICAgICAgICAgICAgICAgIGluZGV4LCBjb2xvckZvcm1hdCwgbWV0YU9ubHksIHRodW1ibmFpbCk7CisjaWZuZGVmIERJU0FCTEVfR1JPVVBfU0NIRURVTEVfSEFDSworICAgICAgICAgICAgc2V0U2NoZWRQb2xpY3koZGF0YSk7CisjZW5kaWYKKyAgICAgICAgICAgIHNwPElNZW1vcnk+IGJpdG1hcCA9IGdldEltYWdlQXRJbmRleChpbmRleCwgY29sb3JGb3JtYXQsIG1ldGFPbmx5LCB0aHVtYm5haWwpOworICAgICAgICAgICAgaWYgKGJpdG1hcCAhPSAwKSB7ICAvLyBEb24ndCBzZW5kIE5VTEwgYWNyb3NzIHRoZSBiaW5kZXIgaW50ZXJmYWNlCisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoTk9fRVJST1IpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihiaXRtYXApKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoVU5LTk9XTl9FUlJPUik7CisgICAgICAgICAgICB9CisjaWZuZGVmIERJU0FCTEVfR1JPVVBfU0NIRURVTEVfSEFDSworICAgICAgICAgICAgcmVzdG9yZVNjaGVkUG9saWN5KCk7CisjZW5kaWYKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIEdFVF9JTUFHRV9SRUNUX0FUX0lOREVYOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGludCBpbmRleCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBpbnQgY29sb3JGb3JtYXQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgaW50IGxlZnQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgaW50IHRvcCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBpbnQgcmlnaHQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgaW50IGJvdHRvbSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBBTE9HVigiZ2V0SW1hZ2VSZWN0QXRJbmRleDogaW5kZXgoJWQpLCBjb2xvckZvcm1hdCglZCksIHJlY3QgeyVkLCAlZCwgJWQsICVkfSIsCisgICAgICAgICAgICAgICAgICAgIGluZGV4LCBjb2xvckZvcm1hdCwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKyNpZm5kZWYgRElTQUJMRV9HUk9VUF9TQ0hFRFVMRV9IQUNLCisgICAgICAgICAgICBzZXRTY2hlZFBvbGljeShkYXRhKTsKKyNlbmRpZgorICAgICAgICAgICAgc3A8SU1lbW9yeT4gYml0bWFwID0gZ2V0SW1hZ2VSZWN0QXRJbmRleCgKKyAgICAgICAgICAgICAgICAgICAgaW5kZXgsIGNvbG9yRm9ybWF0LCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOworICAgICAgICAgICAgaWYgKGJpdG1hcCAhPSAwKSB7ICAvLyBEb24ndCBzZW5kIE5VTEwgYWNyb3NzIHRoZSBiaW5kZXIgaW50ZXJmYWNlCisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoTk9fRVJST1IpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihiaXRtYXApKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoVU5LTk9XTl9FUlJPUik7CisgICAgICAgICAgICB9CisjaWZuZGVmIERJU0FCTEVfR1JPVVBfU0NIRURVTEVfSEFDSworICAgICAgICAgICAgcmVzdG9yZVNjaGVkUG9saWN5KCk7CisjZW5kaWYKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIEdFVF9GUkFNRV9BVF9JTkRFWDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYU1ldGFkYXRhUmV0cmlldmVyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBpbnQgZnJhbWVJbmRleCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBpbnQgbnVtRnJhbWVzID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGludCBjb2xvckZvcm1hdCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBib29sIG1ldGFPbmx5ID0gKGRhdGEucmVhZEludDMyKCkgIT0gMCk7CisgICAgICAgICAgICBBTE9HVigiZ2V0RnJhbWVBdEluZGV4OiBmcmFtZUluZGV4KCVkKSwgbnVtRnJhbWVzKCVkKSwgY29sb3JGb3JtYXQoJWQpLCBtZXRhT25seSglZCkiLAorICAgICAgICAgICAgICAgICAgICBmcmFtZUluZGV4LCBudW1GcmFtZXMsIGNvbG9yRm9ybWF0LCBtZXRhT25seSk7CisjaWZuZGVmIERJU0FCTEVfR1JPVVBfU0NIRURVTEVfSEFDSworICAgICAgICAgICAgc2V0U2NoZWRQb2xpY3koZGF0YSk7CisjZW5kaWYKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHNwPElNZW1vcnk+ID4gZnJhbWVzOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gZ2V0RnJhbWVBdEluZGV4KAorICAgICAgICAgICAgICAgICAgICAmZnJhbWVzLCBmcmFtZUluZGV4LCBudW1GcmFtZXMsIGNvbG9yRm9ybWF0LCBtZXRhT25seSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihlcnIpOworICAgICAgICAgICAgaWYgKE9LID09IGVycikgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGZyYW1lcy5zaXplKCkpOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZnJhbWVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihmcmFtZXNbaV0pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjaWZuZGVmIERJU0FCTEVfR1JPVVBfU0NIRURVTEVfSEFDSworICAgICAgICAgICAgcmVzdG9yZVNjaGVkUG9saWN5KCk7CisjZW5kaWYKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBFWFRSQUNUX0FMQlVNX0FSVDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYU1ldGFkYXRhUmV0cmlldmVyLCBkYXRhLCByZXBseSk7CiAjaWZuZGVmIERJU0FCTEVfR1JPVVBfU0NIRURVTEVfSEFDSwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAKaW5kZXggMzk5NjIyNy4uZTJlY2NkZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwCkBAIC0zNSw2ICszNSw4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAordXNpbmcgbWVkaWE6OlZvbHVtZVNoYXBlcjsKKwogZW51bSB7CiAgICAgRElTQ09OTkVDVCA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCiAgICAgU0VUX0RBVEFfU09VUkNFX1VSTCwKQEAgLTQyLDcgKzQ0LDcgQEAKICAgICBTRVRfREFUQV9TT1VSQ0VfU1RSRUFNLAogICAgIFNFVF9EQVRBX1NPVVJDRV9DQUxMQkFDSywKICAgICBTRVRfQlVGRkVSSU5HX1NFVFRJTkdTLAotICAgIEdFVF9ERUZBVUxUX0JVRkZFUklOR19TRVRUSU5HUywKKyAgICBHRVRfQlVGRkVSSU5HX1NFVFRJTkdTLAogICAgIFBSRVBBUkVfQVNZTkMsCiAgICAgU1RBUlQsCiAgICAgU1RPUCwKQEAgLTU2LDYgKzU4LDcgQEAKICAgICBHRVRfQ1VSUkVOVF9QT1NJVElPTiwKICAgICBHRVRfRFVSQVRJT04sCiAgICAgUkVTRVQsCisgICAgTk9USUZZX0FULAogICAgIFNFVF9BVURJT19TVFJFQU1fVFlQRSwKICAgICBTRVRfTE9PUElORywKICAgICBTRVRfVk9MVU1FLApAQCAtNzUsNiArNzgsMTAgQEAKICAgICAvLyBNb2R1bGFyIERSTQogICAgIFBSRVBBUkVfRFJNLAogICAgIFJFTEVBU0VfRFJNLAorICAgIC8vIEF1ZGlvUm91dGluZworICAgIFNFVF9PVVRQVVRfREVWSUNFLAorICAgIEdFVF9ST1VURURfREVWSUNFX0lELAorICAgIEVOQUJMRV9BVURJT19ERVZJQ0VfQ0FMTEJBQ0ssCiB9OwogCiAvLyBNb2REcm0gaGVscGVycwpAQCAtMTc3LDE0ICsxODQsMTQgQEAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAotICAgIHN0YXR1c190IGdldERlZmF1bHRCdWZmZXJpbmdTZXR0aW5ncyhCdWZmZXJpbmdTZXR0aW5ncyogYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pCisgICAgc3RhdHVzX3QgZ2V0QnVmZmVyaW5nU2V0dGluZ3MoQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKQogICAgIHsKICAgICAgICAgaWYgKGJ1ZmZlcmluZyA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVBsYXllcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9ERUZBVUxUX0JVRkZFUklOR19TRVRUSU5HUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9CVUZGRVJJTkdfU0VUVElOR1MsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHN0YXR1c190IGVyciA9IHJlcGx5LnJlYWRJbnQzMigpOwogICAgICAgICBpZiAoZXJyID09IE9LKSB7CiAgICAgICAgICAgICBlcnIgPSBidWZmZXJpbmctPnJlYWRGcm9tUGFyY2VsKCZyZXBseSk7CkBAIC0zMjYsNiArMzMzLDE1IEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKKyAgICBzdGF0dXNfdCBub3RpZnlBdChpbnQ2NF90IG1lZGlhVGltZVVzKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUGxheWVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50NjQobWVkaWFUaW1lVXMpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoTk9USUZZX0FULCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCiAgICAgc3RhdHVzX3Qgc2V0QXVkaW9TdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwpAQCAtNTA5LDcgKzUyNSw3IEBACiAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICAgICAgfQogICAgICAgICBzcDxWb2x1bWVTaGFwZXI6OlN0YXRlPiBzdGF0ZSA9IG5ldyBWb2x1bWVTaGFwZXI6OlN0YXRlKCk7Ci0gICAgICAgIHN0YXR1cyA9IHN0YXRlLT5yZWFkRnJvbVBhcmNlbChyZXBseSk7CisgICAgICAgIHN0YXR1cyA9IHN0YXRlLT5yZWFkRnJvbVBhcmNlbCgmcmVwbHkpOwogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICAgICAgfQpAQCAtNTQ3LDYgKzU2Myw1OSBAQAogCiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CisKKyAgICBzdGF0dXNfdCBzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVBsYXllcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICBkYXRhLndyaXRlSW50MzIoZGV2aWNlSWQpOworCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfT1VUUFVUX0RFVklDRSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoInNldE91dHB1dERldmljZTogYmluZGVyIGNhbGwgZmFpbGVkOiAlZCIsIHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgIH0KKworICAgIHN0YXR1c190IGdldFJvdXRlZERldmljZUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QqIGRldmljZUlkKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUGxheWVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfUk9VVEVEX0RFVklDRV9JRCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoImdldFJvdXRlZERldmljZWlkOiBiaW5kZXIgY2FsbCBmYWlsZWQ6ICVkIiwgc3RhdHVzKTsKKyAgICAgICAgICAgICpkZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICpkZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqZGV2aWNlSWQgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHN0YXR1c190IGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUGxheWVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworCisgICAgICAgIGRhdGEud3JpdGVCb29sKGVuYWJsZWQpOworCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChFTkFCTEVfQVVESU9fREVWSUNFX0NBTExCQUNLLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjazogYmluZGVyIGNhbGwgZmFpbGVkOiAlZCwgJWQiLCBlbmFibGVkLCBzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CiB9OwogCiBJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoTWVkaWFQbGF5ZXIsICJhbmRyb2lkLm1lZGlhLklNZWRpYVBsYXllciIpOwpAQCAtNjMxLDEwICs3MDAsMTAgQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldEJ1ZmZlcmluZ1NldHRpbmdzKGJ1ZmZlcmluZykpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIEdFVF9ERUZBVUxUX0JVRkZFUklOR19TRVRUSU5HUzogeworICAgICAgICBjYXNlIEdFVF9CVUZGRVJJTkdfU0VUVElOR1M6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXIsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzIGJ1ZmZlcmluZzsKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGdldERlZmF1bHRCdWZmZXJpbmdTZXR0aW5ncygmYnVmZmVyaW5nKTsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGdldEJ1ZmZlcmluZ1NldHRpbmdzKCZidWZmZXJpbmcpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZXJyKTsKICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKICAgICAgICAgICAgICAgICBidWZmZXJpbmcud3JpdGVUb1BhcmNlbChyZXBseSk7CkBAIC03NDQsNiArODEzLDExIEBACiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXNldCgpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBOT1RJRllfQVQ6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKG5vdGlmeUF0KGRhdGEucmVhZEludDY0KCkpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBTRVRfQVVESU9fU1RSRUFNX1RZUEU6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXIsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldEF1ZGlvU3RyZWFtVHlwZSgoYXVkaW9fc3RyZWFtX3R5cGVfdCkgZGF0YS5yZWFkSW50MzIoKSkpOwpAQCAtODUxLDE0ICs5MjUsMTQgQEAKICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZEludDMyKCZwcmVzZW50KTsKICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgcHJlc2VudCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiA9IG5ldyBWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBjb25maWd1cmF0aW9uLT5yZWFkRnJvbVBhcmNlbChkYXRhKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBjb25maWd1cmF0aW9uLT5yZWFkRnJvbVBhcmNlbCgmZGF0YSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gZGF0YS5yZWFkSW50MzIoJnByZXNlbnQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiBwcmVzZW50ICE9IDApIHsKICAgICAgICAgICAgICAgICBvcGVyYXRpb24gPSBuZXcgVm9sdW1lU2hhcGVyOjpPcGVyYXRpb24oKTsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBvcGVyYXRpb24tPnJlYWRGcm9tUGFyY2VsKGRhdGEpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IG9wZXJhdGlvbi0+cmVhZEZyb21QYXJjZWwoJmRhdGEpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClhcHBseVZvbHVtZVNoYXBlcihjb25maWd1cmF0aW9uLCBvcGVyYXRpb24pOwpAQCAtODk5LDYgKzk3Myw0MSBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzdWx0KTsKICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQorCisgICAgICAgIC8vIEF1ZGlvUm91dGluZworICAgICAgICBjYXNlIFNFVF9PVVRQVVRfREVWSUNFOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBpbnQgZGV2aWNlSWQ7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWRJbnQzMigmZGV2aWNlSWQpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldE91dHB1dERldmljZShkZXZpY2VJZCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihCQURfVkFMVUUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGNhc2UgR0VUX1JPVVRFRF9ERVZJQ0VfSUQ6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQ7CisgICAgICAgICAgICBzdGF0dXNfdCByZXQgPSBnZXRSb3V0ZWREZXZpY2VJZCgmZGV2aWNlSWQpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmV0KTsKKyAgICAgICAgICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihkZXZpY2VJZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRU5BQkxFX0FVRElPX0RFVklDRV9DQUxMQkFDSzogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVBsYXllciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYm9vbCBlbmFibGVkOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkQm9vbCgmZW5hYmxlZCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhlbmFibGVkKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKEJBRF9WQUxVRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAppbmRleCBhMDE4NTJjLi5hY2E3YWQ5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcApAQCAtMjAsNyArMjAsNiBAQAogCiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvSUhEQ1AuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFDb2RlY0xpc3QuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaD4KQEAgLTM5LDggKzM4LDYgQEAKICAgICBDUkVBVEUgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAogICAgIENSRUFURV9NRURJQV9SRUNPUkRFUiwKICAgICBDUkVBVEVfTUVUQURBVEFfUkVUUklFVkVSLAotICAgIEdFVF9PTVgsCi0gICAgTUFLRV9IRENQLAogICAgIEFERF9CQVRURVJZX0RBVEEsCiAgICAgUFVMTF9CQVRURVJZX0RBVEEsCiAgICAgTElTVEVOX0ZPUl9SRU1PVEVfRElTUExBWSwKQEAgLTgzLDIxICs4MCw2IEBACiAgICAgICAgIHJldHVybiBpbnRlcmZhY2VfY2FzdDxJTWVkaWFSZWNvcmRlcj4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHNwPElPTVg+IGdldE9NWCgpIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUGxheWVyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9PTVgsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiBpbnRlcmZhY2VfY2FzdDxJT01YPihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3A8SUhEQ1A+IG1ha2VIRENQKGJvb2wgY3JlYXRlRW5jcnlwdGlvbk1vZHVsZSkgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFQbGF5ZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoY3JlYXRlRW5jcnlwdGlvbk1vZHVsZSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChNQUtFX0hEQ1AsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiBpbnRlcmZhY2VfY2FzdDxJSERDUD4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICB9Ci0KICAgICB2aXJ0dWFsIHZvaWQgYWRkQmF0dGVyeURhdGEodWludDMyX3QgcGFyYW1zKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVBsYXllclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CkBAIC0xNjEsMTkgKzE0Myw2IEBACiAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIocmV0cmlldmVyKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgR0VUX09NWDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVBsYXllclNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHNwPElPTVg+IG9teCA9IGdldE9NWCgpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKG9teCkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIE1BS0VfSERDUDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVBsYXllclNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGJvb2wgY3JlYXRlRW5jcnlwdGlvbk1vZHVsZSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBzcDxJSERDUD4gaGRjcCA9IG1ha2VIRENQKGNyZWF0ZUVuY3J5cHRpb25Nb2R1bGUpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGhkY3ApKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBBRERfQkFUVEVSWV9EQVRBOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyU2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgdWludDMyX3QgcGFyYW1zID0gZGF0YS5yZWFkSW50MzIoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyLmNwcAppbmRleCA1MjgyMzUyLi5iMmM5MWM0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXIuY3BwCkBAIC02MSw2ICs2MSwxMCBAQAogICAgIFBBVVNFLAogICAgIFJFU1VNRSwKICAgICBHRVRfTUVUUklDUywKKyAgICBTRVRfSU5QVVRfREVWSUNFLAorICAgIEdFVF9ST1VURURfREVWSUNFX0lELAorICAgIEVOQUJMRV9BVURJT19ERVZJQ0VfQ0FMTEJBQ0ssCisgICAgR0VUX0FDVElWRV9NSUNST1BIT05FUywKIAogfTsKIApAQCAtMzM3LDYgKzM0MSw3MiBAQAogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVMRUFTRSwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KKworICAgIHN0YXR1c190IHNldElucHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpCisgICAgeworICAgICAgICBBTE9HVigic2V0SW5wdXREZXZpY2UiKTsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUmVjb3JkZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihkZXZpY2VJZCk7CisKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9JTlBVVF9ERVZJQ0UsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJzZXRJbnB1dERldmljZSBiaW5kZXIgY2FsbCBmYWlsZWQ6ICVkIiwgc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOzsKKyAgICB9CisKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldFJvdXRlZERldmljZUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmRldmljZUlkKQorICAgIHsKKyAgICAgICAgQUxPR1YoImdldFJvdXRlZERldmljZUlkIik7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVJlY29yZGVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfUk9VVEVEX0RFVklDRV9JRCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoImdldFJvdXRlZERldmljZWlkIGJpbmRlciBjYWxsIGZhaWxlZDogJWQiLCBzdGF0dXMpOworICAgICAgICAgICAgKmRldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgKmRldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpkZXZpY2VJZCA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgc3RhdHVzX3QgZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpCisgICAgeworICAgICAgICBBTE9HVigiZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayIpOworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFSZWNvcmRlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUJvb2woZW5hYmxlZCk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChFTkFCTEVfQVVESU9fREVWSUNFX0NBTExCQUNLLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayBiaW5kZXIgY2FsbCBmYWlsZWQ6ICVkLCAlZCIsIGVuYWJsZWQsIHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBhY3RpdmVNaWNyb3Bob25lcykKKyAgICB7CisgICAgICAgIEFMT0dWKCJnZXRBY3RpdmVNaWNyb3Bob25lcyIpOworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFSZWNvcmRlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9BQ1RJVkVfTUlDUk9QSE9ORVMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0sKKyAgICAgICAgICAgICAgICB8fCAoc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkUGFyY2VsYWJsZVZlY3RvcihhY3RpdmVNaWNyb3Bob25lcyk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCiB9OwogCiBJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoTWVkaWFSZWNvcmRlciwgImFuZHJvaWQubWVkaWEuSU1lZGlhUmVjb3JkZXIiKTsKQEAgLTU0Myw2ICs2MTMsNTQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBTRVRfSU5QVVRfREVWSUNFOiB7CisgICAgICAgICAgICBBTE9HVigiU0VUX0lOUFVUX0RFVklDRSIpOworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVJlY29yZGVyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkSW50MzIoJmRldmljZUlkKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXRJbnB1dERldmljZShkZXZpY2VJZCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihCQURfVkFMVUUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEdFVF9ST1VURURfREVWSUNFX0lEOiB7CisgICAgICAgICAgICBBTE9HVigiR0VUX1JPVVRFRF9ERVZJQ0VfSUQiKTsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFSZWNvcmRlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZDsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldFJvdXRlZERldmljZUlkKCZkZXZpY2VJZCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGRldmljZUlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFTkFCTEVfQVVESU9fREVWSUNFX0NBTExCQUNLOiB7CisgICAgICAgICAgICBBTE9HVigiRU5BQkxFX0FVRElPX0RFVklDRV9DQUxMQkFDSyIpOworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVJlY29yZGVyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBib29sIGVuYWJsZWQ7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWRCb29sKCZlbmFibGVkKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihlbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGVuYWJsZWQpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoQkFEX1ZBTFVFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBHRVRfQUNUSVZFX01JQ1JPUEhPTkVTOiB7CisgICAgICAgICAgICBBTE9HVigiR0VUX0FDVElWRV9NSUNST1BIT05FUyIpOworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVJlY29yZGVyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+IGFjdGl2ZU1pY3JvcGhvbmVzOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0QWN0aXZlTWljcm9waG9uZXMoJmFjdGl2ZU1pY3JvcGhvbmVzKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVwbHktPndyaXRlUGFyY2VsYWJsZVZlY3RvcihhY3RpdmVNaWNyb3Bob25lcyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisKKyAgICAgICAgfQogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFTb3VyY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhU291cmNlLmNwcAppbmRleCA3MjRiM2EwLi5mMTg1ZmQ0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVNvdXJjZS5jcHAKQEAgLTI2LDcgKzI2LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMTEzLDggKzExMyw5IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZChNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKLSAgICAgICAgVmVjdG9yPE1lZGlhQnVmZmVyICo+IGJ1ZmZlcnM7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwKKyAgICAgICAgICAgIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworICAgICAgICBWZWN0b3I8TWVkaWFCdWZmZXJCYXNlICo+IGJ1ZmZlcnM7CiAgICAgICAgIHN0YXR1c190IHJldCA9IHJlYWRNdWx0aXBsZSgmYnVmZmVycywgMSAvKiBtYXhOdW1CdWZmZXJzICovLCBvcHRpb25zKTsKICAgICAgICAgKmJ1ZmZlciA9IGJ1ZmZlcnMuc2l6ZSgpID09IDAgPyBudWxscHRyIDogYnVmZmVyc1swXTsKICAgICAgICAgQUxPR1YoInJlYWQgc3RhdHVzICVkLCBidWZmZXJDb3VudCAldSwgc2luY2VTdG9wICV1IiwKQEAgLTEyMyw3ICsxMjQsOCBAQAogICAgIH0KIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZE11bHRpcGxlKAotICAgICAgICAgICAgVmVjdG9yPE1lZGlhQnVmZmVyICo+ICpidWZmZXJzLCB1aW50MzJfdCBtYXhOdW1CdWZmZXJzLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworICAgICAgICAgICAgVmVjdG9yPE1lZGlhQnVmZmVyQmFzZSAqPiAqYnVmZmVycywgdWludDMyX3QgbWF4TnVtQnVmZmVycywKKyAgICAgICAgICAgIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogICAgICAgICBBTE9HVigicmVhZE11bHRpcGxlIik7CiAgICAgICAgIGlmIChidWZmZXJzID09IE5VTEwgfHwgIWJ1ZmZlcnMtPmlzRW1wdHkoKSkgewogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKQEAgLTE2OSwxMyArMTcxLDEzIEBACiAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCA9IHJlcGx5LnJlYWRJbnQzMigpOwogICAgICAgICAgICAgICAgIGJ1ZiA9IG5ldyBSZW1vdGVNZWRpYUJ1ZmZlcldyYXBwZXIobWVtKTsKICAgICAgICAgICAgICAgICBidWYtPnNldF9yYW5nZShvZmZzZXQsIGxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgYnVmLT5tZXRhX2RhdGEoKS0+dXBkYXRlRnJvbVBhcmNlbChyZXBseSk7CisgICAgICAgICAgICAgICAgYnVmLT5tZXRhX2RhdGEoKS51cGRhdGVGcm9tUGFyY2VsKHJlcGx5KTsKICAgICAgICAgICAgIH0gZWxzZSB7IC8vIElOTElORV9CVUZGRVIKICAgICAgICAgICAgICAgICBpbnQzMl90IGxlbiA9IHJlcGx5LnJlYWRJbnQzMigpOwogICAgICAgICAgICAgICAgIEFMT0dWKCJJTkxJTkVfQlVGRkVSIHN0YXR1cyAlZCBhbmQgbGVuICVkIiwgcmV0LCBsZW4pOwogICAgICAgICAgICAgICAgIGJ1ZiA9IG5ldyBNZWRpYUJ1ZmZlcihsZW4pOwogICAgICAgICAgICAgICAgIHJlcGx5LnJlYWQoYnVmLT5kYXRhKCksIGxlbik7Ci0gICAgICAgICAgICAgICAgYnVmLT5tZXRhX2RhdGEoKS0+dXBkYXRlRnJvbVBhcmNlbChyZXBseSk7CisgICAgICAgICAgICAgICAgYnVmLT5tZXRhX2RhdGEoKS51cGRhdGVGcm9tUGFyY2VsKHJlcGx5KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJ1ZmZlcnMtPnB1c2hfYmFjayhidWYpOwogICAgICAgICAgICAgKytidWZmZXJDb3VudDsKQEAgLTIxMCwxMSArMjEyLDYgQEAKICAgICAgICAgcmV0dXJuIHJlbW90ZSgpLT50cmFuc2FjdChQQVVTRSwgZGF0YSwgJnJlcGx5KTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlcnMoY29uc3QgVmVjdG9yPE1lZGlhQnVmZmVyICo+ICYgYnVmZmVycyBfX3VudXNlZCkgewotICAgICAgICBBTE9HVigic2V0QnVmZmVycyBOT1QgSU1QTEVNRU5URUQiKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOyAvLyBkZWZhdWx0Ci0gICAgfQotCiBwcml2YXRlOgogCiAgICAgdWludDMyX3QgbUJ1ZmZlcnNTaW5jZVN0b3A7IC8vIEJ1ZmZlciB0cmFja2luZyB2YXJpYWJsZQpAQCAtMzMwLDcgKzMyNyw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIEdldCByZWFkIG9wdGlvbnMsIGlmIGFueS4KLSAgICAgICAgICAgIFJlYWRPcHRpb25zIG9wdHM7CisgICAgICAgICAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgb3B0czsKICAgICAgICAgICAgIHVpbnQzMl90IGxlbjsKICAgICAgICAgICAgIGNvbnN0IGJvb2wgdXNlT3B0aW9ucyA9CiAgICAgICAgICAgICAgICAgICAgIGRhdGEucmVhZFVpbnQzMigmbGVuKSA9PSBOT19FUlJPUgpAQCAtMzQ0LDcgKzM0MSw3IEBACiAgICAgICAgICAgICB1aW50MzJfdCBidWZmZXJDb3VudCA9IDA7CiAgICAgICAgICAgICBmb3IgKDsgYnVmZmVyQ291bnQgPCBtYXhOdW1CdWZmZXJzOyArK2J1ZmZlckNvdW50LCArK21CdWZmZXJzU2luY2VTdG9wKSB7CiAgICAgICAgICAgICAgICAgTWVkaWFCdWZmZXIgKmJ1ZiA9IG51bGxwdHI7Ci0gICAgICAgICAgICAgICAgcmV0ID0gcmVhZCgmYnVmLCB1c2VPcHRpb25zID8gJm9wdHMgOiBudWxscHRyKTsKKyAgICAgICAgICAgICAgICByZXQgPSByZWFkKChNZWRpYUJ1ZmZlckJhc2UgKiopJmJ1ZiwgdXNlT3B0aW9ucyA/ICZvcHRzIDogbnVsbHB0cik7CiAgICAgICAgICAgICAgICAgb3B0cy5jbGVhck5vblBlcnNpc3RlbnQoKTsgLy8gUmVtb3ZlIG9wdGlvbnMgdGhhdCBvbmx5IGFwcGx5IHRvIGZpcnN0IGJ1ZmZlci4KICAgICAgICAgICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SIHx8IGJ1ZiA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMzY3LDcgKzM2NCw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiTGFyZ2UgYnVmZmVyICV6dSB3aXRob3V0IElNZW1vcnkhIiwgbGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc2ZlckJ1ZiwgZmFsc2UgLyogbm9uQmxvY2tpbmcgKi8sIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNZWRpYUJ1ZmZlckJhc2UgKiopJnRyYW5zZmVyQnVmLCBmYWxzZSAvKiBub25CbG9ja2luZyAqLywgbGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gT0sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHJhbnNmZXJCdWYgPT0gbnVsbHB0cgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB0cmFuc2ZlckJ1Zi0+bU1lbW9yeSA9PSBudWxscHRyKSB7CkBAIC00MTEsNyArNDA4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihvZmZzZXQpOwogICAgICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihsZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICBidWYtPm1ldGFfZGF0YSgpLT53cml0ZVRvUGFyY2VsKCpyZXBseSk7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi0+bWV0YV9kYXRhKCkud3JpdGVUb1BhcmNlbCgqcmVwbHkpOwogICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlckJ1Zi0+YWRkUmVtb3RlUmVmY291bnQoMSk7CiAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2ZlckJ1ZiAhPSBidWYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyQnVmLT5yZWxlYXNlKCk7IC8vIHJlbGVhc2UgbG9jYWwgcmVmCkBAIC00MjQsNyArNDIxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYsIGJ1Zi0+bU1lbW9yeS0+c2l6ZSgpLCBsZW5ndGgpOwogICAgICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihJTkxJTkVfQlVGRkVSKTsKICAgICAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlQnl0ZUFycmF5KGxlbmd0aCwgKHVpbnQ4X3QqKWJ1Zi0+ZGF0YSgpICsgb2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgYnVmLT5tZXRhX2RhdGEoKS0+d3JpdGVUb1BhcmNlbCgqcmVwbHkpOworICAgICAgICAgICAgICAgICAgICBidWYtPm1ldGFfZGF0YSgpLndyaXRlVG9QYXJjZWwoKnJlcGx5KTsKICAgICAgICAgICAgICAgICAgICAgaW5saW5lVHJhbnNmZXJTaXplICs9IGxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgaWYgKGlubGluZVRyYW5zZmVyU2l6ZSA+IGtJbmxpbmVNYXhUcmFuc2ZlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgbWF4TnVtQnVmZmVycyA9IDA7IC8vIHN0b3AgcmVhZE11bHRpcGxlIGlmIGlubGluZSB0cmFuc2ZlciBpcyB0b28gbGFyZ2UuCkBAIC00NDksNTggKzQ0Niw1IEBACiAgICAgfQogfQogCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1JTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpSZWFkT3B0aW9ucygpIHsKLSAgICByZXNldCgpOwotfQotCi12b2lkIElNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OnJlc2V0KCkgewotICAgIG1PcHRpb25zID0gMDsKLSAgICBtU2Vla1RpbWVVcyA9IDA7Ci0gICAgbUxhdGVuZXNzVXMgPSAwOwotICAgIG1Ob25CbG9ja2luZyA9IGZhbHNlOwotfQotCi12b2lkIElNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OnNldE5vbkJsb2NraW5nKCkgewotICAgIG1Ob25CbG9ja2luZyA9IHRydWU7Ci19Ci0KLXZvaWQgSU1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6Y2xlYXJOb25CbG9ja2luZygpIHsKLSAgICBtTm9uQmxvY2tpbmcgPSBmYWxzZTsKLX0KLQotYm9vbCBJTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpnZXROb25CbG9ja2luZygpIGNvbnN0IHsKLSAgICByZXR1cm4gbU5vbkJsb2NraW5nOwotfQotCi12b2lkIElNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OnNldFNlZWtUbyhpbnQ2NF90IHRpbWVfdXMsIFNlZWtNb2RlIG1vZGUpIHsKLSAgICBtT3B0aW9ucyB8PSBrU2Vla1RvX09wdGlvbjsKLSAgICBtU2Vla1RpbWVVcyA9IHRpbWVfdXM7Ci0gICAgbVNlZWtNb2RlID0gbW9kZTsKLX0KLQotdm9pZCBJTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpjbGVhclNlZWtUbygpIHsKLSAgICBtT3B0aW9ucyAmPSB+a1NlZWtUb19PcHRpb247Ci0gICAgbVNlZWtUaW1lVXMgPSAwOwotICAgIG1TZWVrTW9kZSA9IFNFRUtfQ0xPU0VTVF9TWU5DOwotfQotCi1ib29sIElNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OmdldFNlZWtUbygKLSAgICAgICAgaW50NjRfdCAqdGltZV91cywgU2Vla01vZGUgKm1vZGUpIGNvbnN0IHsKLSAgICAqdGltZV91cyA9IG1TZWVrVGltZVVzOwotICAgICptb2RlID0gbVNlZWtNb2RlOwotICAgIHJldHVybiAobU9wdGlvbnMgJiBrU2Vla1RvX09wdGlvbikgIT0gMDsKLX0KLQotdm9pZCBJTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpzZXRMYXRlQnkoaW50NjRfdCBsYXRlbmVzc191cykgewotICAgIG1MYXRlbmVzc1VzID0gbGF0ZW5lc3NfdXM7Ci19Ci0KLWludDY0X3QgSU1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6Z2V0TGF0ZUJ5KCkgY29uc3QgewotICAgIHJldHVybiBtTGF0ZW5lc3NVczsKLX0KLQotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JT01YU3RvcmUuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU9NWFN0b3JlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk0OGYxYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYS9JT01YU3RvcmUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzY3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiSU9NWFN0b3JlIgotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9JT01YLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSU9NWFN0b3JlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXhTdG9yZS5oPgotCi0jaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSUJpbmRlci5oPgotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLQotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotbmFtZXNwYWNlIHsKLQotZW51bSB7Ci0gICAgQ09OTkVDVCA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCi0gICAgTElTVF9TRVJWSUNFX0FUVFJJQlVURVMsCi0gICAgR0VUX05PREVfUFJFRklYLAotICAgIExJU1RfUk9MRVMsCi0gICAgR0VUX09NWCwKLX07Ci0KLS8vIEZvcndhcmQgZGVjbGFyYXRpb25zIG9mIHN0ZDo6dmVjdG9yPFQ+IDwtPiBQYXJjZWwgY29udmVyc2lvbiBmdW5jaXRvbnMgdGhhdAotLy8gZGVwZW5kIG9uIHdyaXRlVG9QYXJjZWwoKSBhbmQgcmVhZFRvUGFyY2VsKCkgZm9yIFQgPC0+IFBhcmNlbC4KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdGF0dXNfdCB3cml0ZVRvUGFyY2VsKGNvbnN0IHN0ZDo6dmVjdG9yPFQ+JiB2LCBQYXJjZWwqIHApOwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0YXR1c190IHJlYWRGcm9tUGFyY2VsKHN0ZDo6dmVjdG9yPFQ+KiB2LCBjb25zdCBQYXJjZWwmIHApOwotCi0vLyBzdGQ6OnN0cmluZyA8LT4gUGFyY2VsCi0KLXN0YXR1c190IHdyaXRlVG9QYXJjZWwoY29uc3Qgc3RkOjpzdHJpbmcmIHMsIFBhcmNlbCogcCkgewotICAgIGlmIChzLnNpemUoKSA+IElOVDMyX01BWCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICByZXR1cm4gcC0+d3JpdGVCeXRlQXJyYXkoCi0gICAgICAgICAgICBzLnNpemUoKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocy5jX3N0cigpKSk7Ci19Ci0KLXN0YXR1c190IHJlYWRGcm9tUGFyY2VsKHN0ZDo6c3RyaW5nKiBzLCBjb25zdCBQYXJjZWwmIHApIHsKLSAgICBpbnQzMl90IGxlbjsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBwLnJlYWRJbnQzMigmbGVuKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfSBlbHNlIGlmICgobGVuIDwgMCkgfHwgKHN0YXRpY19jYXN0PHVpbnQ2NF90PihsZW4pID4gU0laRV9NQVgpKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHMtPnJlc2l6ZShsZW4pOwotICAgIGlmIChsZW4gPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotICAgIHJldHVybiBwLnJlYWQoc3RhdGljX2Nhc3Q8dm9pZCo+KCZzLT5mcm9udCgpKSwgc3RhdGljX2Nhc3Q8c2l6ZV90PihsZW4pKTsKLX0KLQotLy8gSU9NWFN0b3JlOjpBdHRyaWJ1dGUgPC0+IFBhcmNlbAotCi1zdGF0dXNfdCB3cml0ZVRvUGFyY2VsKGNvbnN0IElPTVhTdG9yZTo6QXR0cmlidXRlJiBhLCBQYXJjZWwqIHApIHsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSB3cml0ZVRvUGFyY2VsKGEua2V5LCBwKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIHJldHVybiB3cml0ZVRvUGFyY2VsKGEudmFsdWUsIHApOwotfQotCi1zdGF0dXNfdCByZWFkRnJvbVBhcmNlbChJT01YU3RvcmU6OkF0dHJpYnV0ZSogYSwgY29uc3QgUGFyY2VsJiBwKSB7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVhZEZyb21QYXJjZWwoJihhLT5rZXkpLCBwKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIHJldHVybiByZWFkRnJvbVBhcmNlbCgmKGEtPnZhbHVlKSwgcCk7Ci19Ci0KLS8vIElPTVhTdG9yZTo6Tm9kZUluZm8gPC0+IFBhcmNlbAotCi1zdGF0dXNfdCB3cml0ZVRvUGFyY2VsKGNvbnN0IElPTVhTdG9yZTo6Tm9kZUluZm8mIG4sIFBhcmNlbCogcCkgewotICAgIHN0YXR1c190IHN0YXR1cyA9IHdyaXRlVG9QYXJjZWwobi5uYW1lLCBwKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIHN0YXR1cyA9IHdyaXRlVG9QYXJjZWwobi5vd25lciwgcCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICByZXR1cm4gd3JpdGVUb1BhcmNlbChuLmF0dHJpYnV0ZXMsIHApOwotfQotCi1zdGF0dXNfdCByZWFkRnJvbVBhcmNlbChJT01YU3RvcmU6Ok5vZGVJbmZvKiBuLCBjb25zdCBQYXJjZWwmIHApIHsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSByZWFkRnJvbVBhcmNlbCgmKG4tPm5hbWUpLCBwKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIHN0YXR1cyA9IHJlYWRGcm9tUGFyY2VsKCYobi0+b3duZXIpLCBwKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIHJldHVybiByZWFkRnJvbVBhcmNlbCgmKG4tPmF0dHJpYnV0ZXMpLCBwKTsKLX0KLQotLy8gSU9NWFN0b3JlOjpSb2xlSW5mbyA8LT4gUGFyY2VsCi0KLXN0YXR1c190IHdyaXRlVG9QYXJjZWwoY29uc3QgSU9NWFN0b3JlOjpSb2xlSW5mbyYgciwgUGFyY2VsKiBwKSB7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gd3JpdGVUb1BhcmNlbChyLnJvbGUsIHApOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgc3RhdHVzID0gd3JpdGVUb1BhcmNlbChyLnR5cGUsIHApOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgc3RhdHVzID0gcC0+d3JpdGVCb29sKHIuaXNFbmNvZGVyKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIHN0YXR1cyA9IHAtPndyaXRlQm9vbChyLnByZWZlclBsYXRmb3JtTm9kZXMpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgcmV0dXJuIHdyaXRlVG9QYXJjZWwoci5ub2RlcywgcCk7Ci19Ci0KLXN0YXR1c190IHJlYWRGcm9tUGFyY2VsKElPTVhTdG9yZTo6Um9sZUluZm8qIHIsIGNvbnN0IFBhcmNlbCYgcCkgewotICAgIHN0YXR1c190IHN0YXR1cyA9IHJlYWRGcm9tUGFyY2VsKCYoci0+cm9sZSksIHApOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgc3RhdHVzID0gcmVhZEZyb21QYXJjZWwoJihyLT50eXBlKSwgcCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICBzdGF0dXMgPSBwLnJlYWRCb29sKCYoci0+aXNFbmNvZGVyKSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICBzdGF0dXMgPSBwLnJlYWRCb29sKCYoci0+cHJlZmVyUGxhdGZvcm1Ob2RlcykpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgcmV0dXJuIHJlYWRGcm9tUGFyY2VsKCYoci0+bm9kZXMpLCBwKTsKLX0KLQotLy8gc3RkOjp2ZWN0b3I8Tm9kZUluZm8+IDwtPiBQYXJjZWwKLS8vIHN0ZDo6dmVjdG9yPFJvbGVJbmZvPiA8LT4gUGFyY2VsCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChjb25zdCBzdGQ6OnZlY3RvcjxUPiYgdiwgUGFyY2VsKiBwKSB7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gcC0+d3JpdGVWZWN0b3JTaXplKHYpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgZm9yIChjb25zdCBUJiB4IDogdikgewotICAgICAgICBzdGF0dXMgPSB3cml0ZVRvUGFyY2VsKHgsIHApOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdGF0dXNfdCByZWFkRnJvbVBhcmNlbChzdGQ6OnZlY3RvcjxUPiogdiwgY29uc3QgUGFyY2VsJiBwKSB7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gcC5yZXNpemVPdXRWZWN0b3Iodik7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICBmb3IgKFQmIHggOiAqdikgewotICAgICAgICBzdGF0dXMgPSByZWFkRnJvbVBhcmNlbCgmeCwgcCk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi19IC8vIHVubmFtZWQgbmFtZXNwYWNlCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLWNsYXNzIEJwT01YU3RvcmUgOiBwdWJsaWMgQnBJbnRlcmZhY2U8SU9NWFN0b3JlPiB7Ci1wdWJsaWM6Ci0gICAgZXhwbGljaXQgQnBPTVhTdG9yZShjb25zdCBzcDxJQmluZGVyPiAmaW1wbCkKLSAgICAgICAgOiBCcEludGVyZmFjZTxJT01YU3RvcmU+KGltcGwpIHsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBsaXN0U2VydmljZUF0dHJpYnV0ZXMoCi0gICAgICAgICAgICBzdGQ6OnZlY3RvcjxBdHRyaWJ1dGU+KiBhdHRyaWJ1dGVzKSBvdmVycmlkZSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgICAgICBzdGF0dXMgPSBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWFN0b3JlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChMSVNUX1NFUlZJQ0VfQVRUUklCVVRFUywgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVhZEZyb21QYXJjZWwoYXR0cmlidXRlcywgcmVwbHkpOwotICAgIH0KLQotICAgIHN0YXR1c190IGdldE5vZGVQcmVmaXgoc3RkOjpzdHJpbmcqIHByZWZpeCkgb3ZlcnJpZGUgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1czsKLSAgICAgICAgc3RhdHVzID0gZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVhTdG9yZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX05PREVfUFJFRklYLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZWFkRnJvbVBhcmNlbChwcmVmaXgsIHJlcGx5KTsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBsaXN0Um9sZXMoc3RkOjp2ZWN0b3I8Um9sZUluZm8+KiByb2xlTGlzdCkgb3ZlcnJpZGUgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1czsKLSAgICAgICAgc3RhdHVzID0gZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVhTdG9yZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoTElTVF9ST0xFUywgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVhZEZyb21QYXJjZWwocm9sZUxpc3QsIHJlcGx5KTsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBnZXRPbXgoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIHNwPElPTVg+KiBvbXgpIG92ZXJyaWRlIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgICAgIHN0YXR1cyA9IGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YU3RvcmU6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdHVzID0gd3JpdGVUb1BhcmNlbChuYW1lLCAmZGF0YSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9PTVgsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIob214KTsKLSAgICB9Ci0KLX07Ci0KLUlNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShPTVhTdG9yZSwgImFuZHJvaWQuaGFyZHdhcmUuSU9NWFN0b3JlIik7Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSNkZWZpbmUgQ0hFQ0tfT01YX0lOVEVSRkFDRShpbnRlcmZhY2UsIGRhdGEsIHJlcGx5KSBcCi0gICAgICAgIGRvIHsgaWYgKCEoZGF0YSkuZW5mb3JjZUludGVyZmFjZShpbnRlcmZhY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSkpIHsgXAotICAgICAgICAgICAgQUxPR1coIkNhbGwgaW5jb3JyZWN0bHkgcm91dGVkIHRvICIgI2ludGVyZmFjZSk7IFwKLSAgICAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsgXAotICAgICAgICB9IH0gd2hpbGUgKDApCi0KLXN0YXR1c190IEJuT01YU3RvcmU6Om9uVHJhbnNhY3QoCi0gICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsICZkYXRhLCBQYXJjZWwgKnJlcGx5LCB1aW50MzJfdCBmbGFncykgewotICAgIHN3aXRjaCAoY29kZSkgewotICAgICAgICBjYXNlIExJU1RfU0VSVklDRV9BVFRSSUJVVEVTOiB7Ci0gICAgICAgICAgICBDSEVDS19PTVhfSU5URVJGQUNFKElPTVhTdG9yZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QXR0cmlidXRlPiBhdHRyaWJ1dGVzOwotCi0gICAgICAgICAgICBzdGF0dXMgPSBsaXN0U2VydmljZUF0dHJpYnV0ZXMoJmF0dHJpYnV0ZXMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJsaXN0U2VydmljZUF0dHJpYnV0ZXMoKSBmYWlscyB3aXRoIHN0YXR1cyAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHN0YXR1cykpOwotICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXR1cyA9IHdyaXRlVG9QYXJjZWwoYXR0cmlidXRlcywgcmVwbHkpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJsaXN0U2VydmljZUF0dHJpYnV0ZXMoKSBmYWlscyB0byBzZW5kIHJlcGx5Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgR0VUX05PREVfUFJFRklYOiB7Ci0gICAgICAgICAgICBDSEVDS19PTVhfSU5URVJGQUNFKElPTVhTdG9yZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4OwotCi0gICAgICAgICAgICBzdGF0dXMgPSBnZXROb2RlUHJlZml4KCZwcmVmaXgpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJnZXROb2RlUHJlZml4KCkgZmFpbHMgd2l0aCBzdGF0dXMgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0dXMgPSB3cml0ZVRvUGFyY2VsKHByZWZpeCwgcmVwbHkpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJnZXROb2RlUHJlZml4KCkgZmFpbHMgdG8gc2VuZCByZXBseSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBjYXNlIExJU1RfUk9MRVM6IHsKLSAgICAgICAgICAgIENIRUNLX09NWF9JTlRFUkZBQ0UoSU9NWFN0b3JlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgICAgICAgICBzdGQ6OnZlY3RvcjxSb2xlSW5mbz4gcm9sZUxpc3Q7Ci0KLSAgICAgICAgICAgIHN0YXR1cyA9IGxpc3RSb2xlcygmcm9sZUxpc3QpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJsaXN0Um9sZXMoKSBmYWlscyB3aXRoIHN0YXR1cyAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHN0YXR1cykpOwotICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXR1cyA9IHdyaXRlVG9QYXJjZWwocm9sZUxpc3QsIHJlcGx5KTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgibGlzdFJvbGVzKCkgZmFpbHMgdG8gc2VuZCByZXBseSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEdFVF9PTVg6IHsKLSAgICAgICAgICAgIENIRUNLX09NWF9JTlRFUkZBQ0UoSU9NWFN0b3JlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lOwotICAgICAgICAgICAgc3A8SU9NWD4gb214OwotCi0gICAgICAgICAgICBzdGF0dXMgPSByZWFkRnJvbVBhcmNlbCgmbmFtZSwgZGF0YSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImdldE9teCgpIGZhaWxzIHRvIHJldHJpZXZlIG5hbWUiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0dXMgPSBnZXRPbXgobmFtZSwgJm9teCk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImdldE9teCgpIGZhaWxzIHdpdGggc3RhdHVzICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdHVzID0gcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKG9teCkpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJnZXRPbXgoKSBmYWlscyB0byBzZW5kIHJlcGx5Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwotICAgIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lTdHJlYW1Tb3VyY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvSVN0cmVhbVNvdXJjZS5jcHAKaW5kZXggYmEwYTI3Mi4uZTExYmM3NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSVN0cmVhbVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSVN0cmVhbVNvdXJjZS5jcHAKQEAgLTIwLDI0ICsyMCwxMyBAQAogCiAjaW5jbHVkZSA8bWVkaWEvSVN0cmVhbVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhS2V5cy5oPgogCiAjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotLy8gc3RhdGljCi1jb25zdCBjaGFyICpjb25zdCBJU3RyZWFtTGlzdGVuZXI6OmtLZXlSZXN1bWVBdFBUUyA9ICJyZXN1bWUtYXQtUFRTIjsKLQotLy8gc3RhdGljCi1jb25zdCBjaGFyICpjb25zdCBJU3RyZWFtTGlzdGVuZXI6OmtLZXlEaXNjb250aW51aXR5TWFzayA9ICJkaXNjb250aW51aXR5LW1hc2siOwotCi0vLyBzdGF0aWMKLWNvbnN0IGNoYXIgKmNvbnN0IElTdHJlYW1MaXN0ZW5lcjo6a0tleU1lZGlhVGltZVVzID0gIm1lZGlhLXRpbWUtdXMiOwotCi0vLyBzdGF0aWMKLWNvbnN0IGNoYXIgKmNvbnN0IElTdHJlYW1MaXN0ZW5lcjo6a0tleVJlY2VudE1lZGlhVGltZVVzID0gInJlY2VudC1tZWRpYS10aW1lLXVzIjsKLQogZW51bSB7CiAgICAgLy8gSVN0cmVhbVNvdXJjZQogICAgIFNFVF9MSVNURU5FUiA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9KZXRQbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvSmV0UGxheWVyLmNwcAppbmRleCAzNGRlYjU5Li4wZDNjMWJhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9KZXRQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0pldFBsYXllci5jcHAKQEAgLTM2LDYgKzM2LDcgQEAKICAgICAgICAgbVBhdXNlZChmYWxzZSksCiAgICAgICAgIG1NYXhUcmFja3MobWF4VHJhY2tzKSwKICAgICAgICAgbUVhc0RhdGEoTlVMTCksCisgICAgICAgIG1Jb1dyYXBwZXIoTlVMTCksCiAgICAgICAgIG1UcmFja0J1ZmZlclNpemUodHJhY2tCdWZmZXJTaXplKQogewogICAgIEFMT0dWKCJKZXRQbGF5ZXIgY29uc3RydWN0b3IiKTsKQEAgLTUwLDcgKzUxLDYgQEAKIHsKICAgICBBTE9HVigifkpldFBsYXllciIpOwogICAgIHJlbGVhc2UoKTsKLQogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTEzOCw3ICsxMzgsOCBAQAogICAgICAgICBKRVRfU2h1dGRvd24obUVhc0RhdGEpOwogICAgICAgICBFQVNfU2h1dGRvd24obUVhc0RhdGEpOwogICAgIH0KLSAgICBtSW9XcmFwcGVyLmNsZWFyKCk7CisgICAgZGVsZXRlIG1Jb1dyYXBwZXI7CisgICAgbUlvV3JhcHBlciA9IE5VTEw7CiAgICAgaWYgKG1BdWRpb1RyYWNrICE9IDApIHsKICAgICAgICAgbUF1ZGlvVHJhY2stPnN0b3AoKTsKICAgICAgICAgbUF1ZGlvVHJhY2stPmZsdXNoKCk7CkBAIC0zMjksNiArMzMwLDcgQEAKIAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7CiAKKyAgICBkZWxldGUgbUlvV3JhcHBlcjsKICAgICBtSW9XcmFwcGVyID0gbmV3IE1pZGlJb1dyYXBwZXIocGF0aCk7CiAKICAgICBFQVNfUkVTVUxUIHJlc3VsdCA9IEpFVF9PcGVuRmlsZShtRWFzRGF0YSwgbUlvV3JhcHBlci0+Z2V0TG9jYXRvcigpKTsKQEAgLTM0Nyw2ICszNDksNyBAQAogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKIAorICAgIGRlbGV0ZSBtSW9XcmFwcGVyOwogICAgIG1Jb1dyYXBwZXIgPSBuZXcgTWlkaUlvV3JhcHBlcihmZCwgb2Zmc2V0LCBsZW5ndGgpOwogCiAgICAgRUFTX1JFU1VMVCByZXN1bHQgPSBKRVRfT3BlbkZpbGUobUVhc0RhdGEsIG1Jb1dyYXBwZXItPmdldExvY2F0b3IoKSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL01lZGlhQ29kZWNCdWZmZXIuY3BwCmluZGV4IDU5ZDYxNjQuLjY4YWUzZWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL01lZGlhQ29kZWNCdWZmZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL01lZGlhQ29kZWNCdWZmZXIuY3BwCkBAIC0yMSwxNSArMjEsMTMgQEAKICNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFCdWZmZXJCYXNlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogTWVkaWFDb2RlY0J1ZmZlcjo6TWVkaWFDb2RlY0J1ZmZlcihjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikKICAgICA6IG1NZXRhKG5ldyBBTWVzc2FnZSksCiAgICAgICBtRm9ybWF0KGZvcm1hdCksCi0gICAgICBtQnVmZmVyKGJ1ZmZlciksCi0gICAgICBtTWVkaWFCdWZmZXJCYXNlKG51bGxwdHIpIHsKKyAgICAgIG1CdWZmZXIoYnVmZmVyKSB7CiB9CiAKIC8vIEFCdWZmZXItbGlrZSBpbnRlcmZhY2UKQEAgLTU4LDIwICs1Niw2IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1NZWRpYUJ1ZmZlckJhc2UgKk1lZGlhQ29kZWNCdWZmZXI6OmdldE1lZGlhQnVmZmVyQmFzZSgpIHsKLSAgICBpZiAobU1lZGlhQnVmZmVyQmFzZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1NZWRpYUJ1ZmZlckJhc2UtPmFkZF9yZWYoKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1NZWRpYUJ1ZmZlckJhc2U7Ci19Ci0KLXZvaWQgTWVkaWFDb2RlY0J1ZmZlcjo6c2V0TWVkaWFCdWZmZXJCYXNlKE1lZGlhQnVmZmVyQmFzZSAqbWVkaWFCdWZmZXIpIHsKLSAgICBpZiAobU1lZGlhQnVmZmVyQmFzZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1NZWRpYUJ1ZmZlckJhc2UtPnJlbGVhc2UoKTsKLSAgICB9Ci0gICAgbU1lZGlhQnVmZmVyQmFzZSA9IG1lZGlhQnVmZmVyOwotfQotCiBzcDxBTWVzc2FnZT4gTWVkaWFDb2RlY0J1ZmZlcjo6bWV0YSgpIHsKICAgICByZXR1cm4gbU1ldGE7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NZWRpYUNvZGVjSW5mby5jcHAgYi9tZWRpYS9saWJtZWRpYS9NZWRpYUNvZGVjSW5mby5jcHAKaW5kZXggYTU3MGZmZS4uNTMwOGUxYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVkaWFDb2RlY0luZm8uY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL01lZGlhQ29kZWNJbmZvLmNwcApAQCAtMTQxLDYgKzE0MSwxMCBAQAogICAgIHJldHVybiBtSXNFbmNvZGVyOwogfQogCit1aW50MzJfdCBNZWRpYUNvZGVjSW5mbzo6cmFuaygpIGNvbnN0IHsKKyAgICByZXR1cm4gbVJhbms7Cit9CisKIHZvaWQgTWVkaWFDb2RlY0luZm86OmdldFN1cHBvcnRlZE1pbWVzKFZlY3RvcjxBU3RyaW5nPiAqbWltZXMpIGNvbnN0IHsKICAgICBtaW1lcy0+Y2xlYXIoKTsKICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgbUNhcHMuc2l6ZSgpOyBpeCsrKSB7CkBAIC0xNzAsMTAgKzE3NCwxMiBAQAogICAgIEFTdHJpbmcgbmFtZSA9IEFTdHJpbmc6OkZyb21QYXJjZWwocGFyY2VsKTsKICAgICBBU3RyaW5nIG93bmVyID0gQVN0cmluZzo6RnJvbVBhcmNlbChwYXJjZWwpOwogICAgIGJvb2wgaXNFbmNvZGVyID0gc3RhdGljX2Nhc3Q8Ym9vbD4ocGFyY2VsLnJlYWRJbnQzMigpKTsKKyAgICB1aW50MzJfdCByYW5rID0gcGFyY2VsLnJlYWRVaW50MzIoKTsKICAgICBzcDxNZWRpYUNvZGVjSW5mbz4gaW5mbyA9IG5ldyBNZWRpYUNvZGVjSW5mbzsKICAgICBpbmZvLT5tTmFtZSA9IG5hbWU7CiAgICAgaW5mby0+bU93bmVyID0gb3duZXI7CiAgICAgaW5mby0+bUlzRW5jb2RlciA9IGlzRW5jb2RlcjsKKyAgICBpbmZvLT5tUmFuayA9IHJhbms7CiAgICAgc2l6ZV90IHNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHBhcmNlbC5yZWFkSW50MzIoKSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKICAgICAgICAgQVN0cmluZyBtaW1lID0gQVN0cmluZzo6RnJvbVBhcmNlbChwYXJjZWwpOwpAQCAtMTkxLDYgKzE5Nyw3IEBACiAgICAgbU5hbWUud3JpdGVUb1BhcmNlbChwYXJjZWwpOwogICAgIG1Pd25lci53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CiAgICAgcGFyY2VsLT53cml0ZUludDMyKG1Jc0VuY29kZXIpOworICAgIHBhcmNlbC0+d3JpdGVVaW50MzIobVJhbmspOwogICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtQ2Fwcy5zaXplKCkpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNhcHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgbUNhcHMua2V5QXQoaSkud3JpdGVUb1BhcmNlbChwYXJjZWwpOwpAQCAtMjEwLDcgKzIxNyw3IEBACiAgICAgcmV0dXJuIC0xOwogfQogCi1NZWRpYUNvZGVjSW5mbzo6TWVkaWFDb2RlY0luZm8oKSB7CitNZWRpYUNvZGVjSW5mbzo6TWVkaWFDb2RlY0luZm8oKSA6IG1SYW5rKDB4MTAwKSB7CiB9CiAKIHZvaWQgTWVkaWFDb2RlY0luZm9Xcml0ZXI6OnNldE5hbWUoY29uc3QgY2hhciogbmFtZSkgewpAQCAtMjI1LDYgKzIzMiwxMCBAQAogICAgIG1JbmZvLT5tSXNFbmNvZGVyID0gaXNFbmNvZGVyOwogfQogCit2b2lkIE1lZGlhQ29kZWNJbmZvV3JpdGVyOjpzZXRSYW5rKHVpbnQzMl90IHJhbmspIHsKKyAgICBtSW5mby0+bVJhbmsgPSByYW5rOworfQorCiBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlcj4KICAgICAgICAgTWVkaWFDb2RlY0luZm9Xcml0ZXI6OmFkZE1pbWUoY29uc3QgY2hhciAqbWltZSkgewogICAgIHNzaXplX3QgaXggPSBtSW5mby0+Z2V0Q2FwYWJpbGl0eUluZGV4KG1pbWUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVkaWFEZWZzLmNwcCBiL21lZGlhL2xpYm1lZGlhL01lZGlhRGVmcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NGE2YWUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVkaWFEZWZzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8bWVkaWEvTWVkaWFEZWZzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfSU1BR0VfSlBFRyA9ICJpbWFnZS9qcGVnIjsKLQotY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fVlA4ID0gInZpZGVvL3gtdm5kLm9uMi52cDgiOwotY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fVlA5ID0gInZpZGVvL3gtdm5kLm9uMi52cDkiOwotY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fQVZDID0gInZpZGVvL2F2YyI7Ci1jb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDID0gInZpZGVvL2hldmMiOwotY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQgPSAidmlkZW8vbXA0di1lcyI7Ci1jb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzID0gInZpZGVvLzNncHAiOwotY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzIgPSAidmlkZW8vbXBlZzIiOwotY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fUkFXID0gInZpZGVvL3JhdyI7Ci1jb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19ET0xCWV9WSVNJT04gPSAidmlkZW8vZG9sYnktdmlzaW9uIjsKLWNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1NDUkFNQkxFRCA9ICJ2aWRlby9zY3JhbWJsZWQiOwotCi1jb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIgPSAiYXVkaW8vM2dwcCI7Ci1jb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IgPSAiYXVkaW8vYW1yLXdiIjsKLWNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX01QRUcgPSAiYXVkaW8vbXBlZyI7Ci1jb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHX0xBWUVSX0kgPSAiYXVkaW8vbXBlZy1MMSI7Ci1jb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHX0xBWUVSX0lJID0gImF1ZGlvL21wZWctTDIiOwotY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fTUlESSA9ICJhdWRpby9taWRpIjsKLWNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQyA9ICJhdWRpby9tcDRhLWxhdG0iOwotY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fUUNFTFAgPSAiYXVkaW8vcWNlbHAiOwotY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTID0gImF1ZGlvL3ZvcmJpcyI7Ci1jb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTID0gImF1ZGlvL29wdXMiOwotY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9BTEFXID0gImF1ZGlvL2c3MTEtYWxhdyI7Ci1jb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX01MQVcgPSAiYXVkaW8vZzcxMS1tbGF3IjsKLWNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX1JBVyA9ICJhdWRpby9yYXciOwotY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRkxBQyA9ICJhdWRpby9mbGFjIjsKLWNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTID0gImF1ZGlvL2FhYy1hZHRzIjsKLWNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX01TR1NNID0gImF1ZGlvL2dzbSI7Ci1jb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQzMgPSAiYXVkaW8vYWMzIjsKLWNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0VBQzMgPSAiYXVkaW8vZWFjMyI7Ci1jb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19TQ1JBTUJMRUQgPSAiYXVkaW8vc2NyYW1ibGVkIjsKLQotY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUc0ID0gInZpZGVvL21wNCI7Ci1jb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfV0FWID0gImF1ZGlvL3gtd2F2IjsKLWNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9PR0cgPSAiYXBwbGljYXRpb24vb2dnIjsKLWNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NQVRST1NLQSA9ICJ2aWRlby94LW1hdHJvc2thIjsKLWNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHMlRTID0gInZpZGVvL21wMnRzIjsKLWNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9BVkkgPSAidmlkZW8vYXZpIjsKLWNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHMlBTID0gInZpZGVvL21wMnAiOwotCi1jb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9URVhUXzNHUFAgPSAidGV4dC8zZ3BwLXR0IjsKLWNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1RFWFRfU1VCUklQID0gImFwcGxpY2F0aW9uL3gtc3VicmlwIjsKLWNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1RFWFRfVlRUID0gInRleHQvdnR0IjsKLWNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1RFWFRfQ0VBXzYwOCA9ICJ0ZXh0L2NlYS02MDgiOwotY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVEVYVF9DRUFfNzA4ID0gInRleHQvY2VhLTcwOCI7Ci1jb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9EQVRBX1RJTUVEX0lEMyA9ICJhcHBsaWNhdGlvbi94LWlkM3Y0IjsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01pZGlJb1dyYXBwZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvTWlkaUlvV3JhcHBlci5jcHAKaW5kZXggNGU1ZDY3Zi4uNWNhM2I0OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWlkaUlvV3JhcHBlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTWlkaUlvV3JhcHBlci5jcHAKQEAgLTM4LDYgKzM4LDcgQEAKICAgICBtRmQgPSBvcGVuKHBhdGgsIE9fUkRPTkxZIHwgT19MQVJHRUZJTEUpOwogICAgIG1CYXNlID0gMDsKICAgICBtTGVuZ3RoID0gbHNlZWsobUZkLCAwLCBTRUVLX0VORCk7CisgICAgbURhdGFTb3VyY2UgPSBudWxscHRyOwogfQogCiBNaWRpSW9XcmFwcGVyOjpNaWRpSW9XcmFwcGVyKGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIGludDY0X3Qgc2l6ZSkgewpAQCAtNDUsOSArNDYsMTAgQEAKICAgICBtRmQgPSBmZCA8IDAgPyAtMSA6IGR1cChmZCk7CiAgICAgbUJhc2UgPSBvZmZzZXQ7CiAgICAgbUxlbmd0aCA9IHNpemU7CisgICAgbURhdGFTb3VyY2UgPSBudWxscHRyOwogfQogCi1NaWRpSW9XcmFwcGVyOjpNaWRpSW9XcmFwcGVyKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UpIHsKK01pZGlJb1dyYXBwZXI6Ok1pZGlJb1dyYXBwZXIoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkgewogICAgIEFMT0dWKCJNaWRpSW9XcmFwcGVyKERhdGFTb3VyY2UpIik7CiAgICAgbUZkID0gLTE7CiAgICAgbURhdGFTb3VyY2UgPSBzb3VyY2U7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9OZGtXcmFwcGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL05ka1dyYXBwZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MmJjMzAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9OZGtXcmFwcGVyLmNwcApAQCAtMCwwICsxLDEzMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTmRrV3JhcHBlciIKKworI2luY2x1ZGUgPG1lZGlhL05ka1dyYXBwZXIuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvbmF0aXZlX3dpbmRvdy5oPgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUNvZGVjLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFDcnlwdG8uaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYURybS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworLy8gVE9ETzogcmVtb3ZlIGZvcndhcmQgZGVjbGFyYXRpb24gd2hlbiBBTWVkaWFFeHRyYWN0b3JfZGlzY29ubmVjdCBpcyBvZmZjaWFsbHkgYWRkZWQgdG8gTkRLCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX2Rpc2Nvbm5lY3QoQU1lZGlhRXh0cmFjdG9yICopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIGNvbnN0IHNpemVfdCBrQUVTQmxvY2tTaXplID0gMTY7ICAvLyBBRVNfQkxPQ0tfU0laRQorCitzdGF0aWMgY29uc3QgY2hhciAqQU1lZGlhRm9ybWF0S2V5R3JvdXBJbnQzMltdID0geworICAgIEFNRURJQUZPUk1BVF9LRVlfQUFDX0RSQ19BVFRFTlVBVElPTl9GQUNUT1IsCisgICAgQU1FRElBRk9STUFUX0tFWV9BQUNfRFJDX0JPT1NUX0ZBQ1RPUiwKKyAgICBBTUVESUFGT1JNQVRfS0VZX0FBQ19EUkNfSEVBVllfQ09NUFJFU1NJT04sCisgICAgQU1FRElBRk9STUFUX0tFWV9BQUNfRFJDX1RBUkdFVF9SRUZFUkVOQ0VfTEVWRUwsCisgICAgQU1FRElBRk9STUFUX0tFWV9BQUNfRU5DT0RFRF9UQVJHRVRfTEVWRUwsCisgICAgQU1FRElBRk9STUFUX0tFWV9BQUNfTUFYX09VVFBVVF9DSEFOTkVMX0NPVU5ULAorICAgIEFNRURJQUZPUk1BVF9LRVlfQUFDX1BST0ZJTEUsCisgICAgQU1FRElBRk9STUFUX0tFWV9BQUNfU0JSX01PREUsCisgICAgQU1FRElBRk9STUFUX0tFWV9BVURJT19TRVNTSU9OX0lELAorICAgIEFNRURJQUZPUk1BVF9LRVlfQklUUkFURV9NT0RFLAorICAgIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEUsCisgICAgQU1FRElBRk9STUFUX0tFWV9DQVBUVVJFX1JBVEUsCisgICAgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULAorICAgIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9NQVNLLAorICAgIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfRk9STUFULAorICAgIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfUkFOR0UsCisgICAgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9TVEFOREFSRCwKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1RSQU5TRkVSLAorICAgIEFNRURJQUZPUk1BVF9LRVlfQ09NUExFWElUWSwKKyAgICBBTUVESUFGT1JNQVRfS0VZX0ZMQUNfQ09NUFJFU1NJT05fTEVWRUwsCisgICAgQU1FRElBRk9STUFUX0tFWV9HUklEX0NPTFVNTlMsCisgICAgQU1FRElBRk9STUFUX0tFWV9HUklEX1JPV1MsCisgICAgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQsCisgICAgQU1FRElBRk9STUFUX0tFWV9JTlRSQV9SRUZSRVNIX1BFUklPRCwKKyAgICBBTUVESUFGT1JNQVRfS0VZX0lTX0FEVFMsCisgICAgQU1FRElBRk9STUFUX0tFWV9JU19BVVRPU0VMRUNULAorICAgIEFNRURJQUZPUk1BVF9LRVlfSVNfREVGQVVMVCwKKyAgICBBTUVESUFGT1JNQVRfS0VZX0lTX0ZPUkNFRF9TVUJUSVRMRSwKKyAgICBBTUVESUFGT1JNQVRfS0VZX0xBVEVOQ1ksCisgICAgQU1FRElBRk9STUFUX0tFWV9MRVZFTCwKKyAgICBBTUVESUFGT1JNQVRfS0VZX01BWF9IRUlHSFQsCisgICAgQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRSwKKyAgICBBTUVESUFGT1JNQVRfS0VZX01BWF9XSURUSCwKKyAgICBBTUVESUFGT1JNQVRfS0VZX1BDTV9FTkNPRElORywKKyAgICBBTUVESUFGT1JNQVRfS0VZX1BSSU9SSVRZLAorICAgIEFNRURJQUZPUk1BVF9LRVlfUFJPRklMRSwKKyAgICBBTUVESUFGT1JNQVRfS0VZX1BVU0hfQkxBTktfQlVGRkVSU19PTl9TVE9QLAorICAgIEFNRURJQUZPUk1BVF9LRVlfUk9UQVRJT04sCisgICAgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwKKyAgICBBTUVESUFGT1JNQVRfS0VZX1NMSUNFX0hFSUdIVCwKKyAgICBBTUVESUFGT1JNQVRfS0VZX1NUUklERSwKKyAgICBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lELAorICAgIEFNRURJQUZPUk1BVF9LRVlfV0lEVEgsCisgICAgQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX0hFSUdIVCwKKyAgICBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfV0lEVEgsCisgICAgQU1FRElBRk9STUFUX0tFWV9URU1QT1JBTF9MQVlFUl9JRCwKKyAgICBBTUVESUFGT1JNQVRfS0VZX1RJTEVfSEVJR0hULAorICAgIEFNRURJQUZPUk1BVF9LRVlfVElMRV9XSURUSCwKKyAgICBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lOREVYLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKkFNZWRpYUZvcm1hdEtleUdyb3VwSW50NjRbXSA9IHsKKyAgICBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLAorICAgIEFNRURJQUZPUk1BVF9LRVlfUkVQRUFUX1BSRVZJT1VTX0ZSQU1FX0FGVEVSLAorICAgIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpBTWVkaWFGb3JtYXRLZXlHcm91cFN0cmluZ1tdID0geworICAgIEFNRURJQUZPUk1BVF9LRVlfTEFOR1VBR0UsCisgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLAorICAgIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJJTkcsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqQU1lZGlhRm9ybWF0S2V5R3JvdXBCdWZmZXJbXSA9IHsKKyAgICBBTUVESUFGT1JNQVRfS0VZX0hEUl9TVEFUSUNfSU5GTywKKyAgICBBTUVESUFGT1JNQVRfS0VZX1NFSSwKKyAgICBBTUVESUFGT1JNQVRfS0VZX01QRUdfVVNFUl9EQVRBLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKkFNZWRpYUZvcm1hdEtleUdyb3VwQ3NkW10gPSB7CisgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF8xLAorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqQU1lZGlhRm9ybWF0S2V5R3JvdXBSZWN0W10gPSB7CisgICAgQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX0NST1AsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqQU1lZGlhRm9ybWF0S2V5R3JvdXBGbG9hdEludDMyW10gPSB7CisgICAgQU1FRElBRk9STUFUX0tFWV9GUkFNRV9SQVRFLAorICAgIEFNRURJQUZPUk1BVF9LRVlfSV9GUkFNRV9JTlRFUlZBTCwKKyAgICBBTUVESUFGT1JNQVRfS0VZX09QRVJBVElOR19SQVRFLAorfTsKKworc3RhdGljIHN0YXR1c190IHRyYW5zbGF0ZUVycm9yQ29kZShtZWRpYV9zdGF0dXNfdCBlcnIpIHsKKyAgICBpZiAoZXJyID09IEFNRURJQV9PSykgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIGlmIChlcnIgPT0gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgfSBlbHNlIGlmIChlcnIgPT0gQU1FRElBX0VSUk9SX0lPKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9IGVsc2UgaWYgKGVyciA9PSBBTUVESUFDT0RFQ19JTkZPX1RSWV9BR0FJTl9MQVRFUikgeworICAgICAgICByZXR1cm4gLUVBR0FJTjsKKyAgICB9CisKKyAgICBBTE9HRSgibmRrIGVycm9yIGNvZGU6ICVkIiwgZXJyKTsKKyAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKK30KKworc3RhdGljIGludDMyX3QgdHJhbnNsYXRlQWN0aW9uQ29kZShpbnQzMl90IGFjdGlvbkNvZGUpIHsKKyAgICBpZiAoQU1lZGlhQ29kZWNBY3Rpb25Db2RlX2lzVHJhbnNpZW50KGFjdGlvbkNvZGUpKSB7CisgICAgICAgIHJldHVybiBBQ1RJT05fQ09ERV9UUkFOU0lFTlQ7CisgICAgfSBlbHNlIGlmIChBTWVkaWFDb2RlY0FjdGlvbkNvZGVfaXNSZWNvdmVyYWJsZShhY3Rpb25Db2RlKSkgeworICAgICAgICByZXR1cm4gQUNUSU9OX0NPREVfUkVDT1ZFUkFCTEU7CisgICAgfQorICAgIHJldHVybiBBQ1RJT05fQ09ERV9GQVRBTDsKK30KKworc3RhdGljIENyeXB0b1BsdWdpbjo6TW9kZSB0cmFuc2xhdGVUb0NyeXB0b1BsdWdpbk1vZGUoY3J5cHRvaW5mb19tb2RlX3QgbW9kZSkgeworICAgIENyeXB0b1BsdWdpbjo6TW9kZSByZXQgPSBDcnlwdG9QbHVnaW46OmtNb2RlX1VuZW5jcnlwdGVkOworICAgIHN3aXRjaCAobW9kZSkgeworICAgICAgICBjYXNlIEFNRURJQUNPREVDUllQVE9JTkZPX01PREVfQUVTX0NUUjogeworICAgICAgICAgICAgcmV0ID0gQ3J5cHRvUGx1Z2luOjprTW9kZV9BRVNfQ1RSOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEFNRURJQUNPREVDUllQVE9JTkZPX01PREVfQUVTX1dWOiB7CisgICAgICAgICAgICByZXQgPSBDcnlwdG9QbHVnaW46OmtNb2RlX0FFU19XVjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBBTUVESUFDT0RFQ1JZUFRPSU5GT19NT0RFX0FFU19DQkM6IHsKKyAgICAgICAgICAgIHJldCA9IENyeXB0b1BsdWdpbjo6a01vZGVfQUVTX0NCQzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjcnlwdG9pbmZvX21vZGVfdCB0cmFuc2xhdGVUb0NyeXB0b0luZm9Nb2RlKENyeXB0b1BsdWdpbjo6TW9kZSBtb2RlKSB7CisgICAgY3J5cHRvaW5mb19tb2RlX3QgcmV0ID0gQU1FRElBQ09ERUNSWVBUT0lORk9fTU9ERV9DTEVBUjsKKyAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICAgICAgY2FzZSBDcnlwdG9QbHVnaW46OmtNb2RlX0FFU19DVFI6IHsKKyAgICAgICAgICAgIHJldCA9IEFNRURJQUNPREVDUllQVE9JTkZPX01PREVfQUVTX0NUUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBDcnlwdG9QbHVnaW46OmtNb2RlX0FFU19XVjogeworICAgICAgICAgICAgcmV0ID0gQU1FRElBQ09ERUNSWVBUT0lORk9fTU9ERV9BRVNfV1Y7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgQ3J5cHRvUGx1Z2luOjprTW9kZV9BRVNfQ0JDOiB7CisgICAgICAgICAgICByZXQgPSBBTUVESUFDT0RFQ1JZUFRPSU5GT19NT0RFX0FFU19DQkM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCisvLy8vLy8vLy8vLy8gQU1lZGlhRm9ybWF0V3JhcHBlcgorLy8gc3RhdGljCitzcDxBTWVkaWFGb3JtYXRXcmFwcGVyPiBBTWVkaWFGb3JtYXRXcmFwcGVyOjpDcmVhdGUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtZXNzYWdlKSB7CisgICAgc3A8QU1lZGlhRm9ybWF0V3JhcHBlcj4gYU1lZGlhRm9ybWF0ID0gbmV3IEFNZWRpYUZvcm1hdFdyYXBwZXIoKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWVzc2FnZS0+Y291bnRFbnRyaWVzKCk7ICsraSkgeworICAgICAgICBBTWVzc2FnZTo6VHlwZSB2YWx1ZVR5cGU7CisgICAgICAgIGNvbnN0IGNoYXIgKmtleSA9IG1lc3NhZ2UtPmdldEVudHJ5TmFtZUF0KGksICZ2YWx1ZVR5cGUpOworCisgICAgICAgIHN3aXRjaCAodmFsdWVUeXBlKSB7CisgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZUludDMyOiB7CisgICAgICAgICAgICAgICAgaW50MzJfdCB2YWw7CisgICAgICAgICAgICAgICAgaWYgKCFtZXNzYWdlLT5maW5kSW50MzIoa2V5LCAmdmFsKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQU1lZGlhRm9ybWF0V3JhcHBlcjo6Q3JlYXRlOiBlcnJvciBhdCBpdGVtICV6dSIsIGkpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYU1lZGlhRm9ybWF0LT5zZXRJbnQzMihrZXksIHZhbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlSW50NjQ6IHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHZhbDsKKyAgICAgICAgICAgICAgICBpZiAoIW1lc3NhZ2UtPmZpbmRJbnQ2NChrZXksICZ2YWwpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJBTWVkaWFGb3JtYXRXcmFwcGVyOjpDcmVhdGU6IGVycm9yIGF0IGl0ZW0gJXp1IiwgaSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhTWVkaWFGb3JtYXQtPnNldEludDY0KGtleSwgdmFsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVGbG9hdDogeworICAgICAgICAgICAgICAgIGZsb2F0IHZhbDsKKyAgICAgICAgICAgICAgICBpZiAoIW1lc3NhZ2UtPmZpbmRGbG9hdChrZXksICZ2YWwpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJBTWVkaWFGb3JtYXRXcmFwcGVyOjpDcmVhdGU6IGVycm9yIGF0IGl0ZW0gJXp1IiwgaSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhTWVkaWFGb3JtYXQtPnNldEZsb2F0KGtleSwgdmFsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVEb3VibGU6IHsKKyAgICAgICAgICAgICAgICBkb3VibGUgdmFsOworICAgICAgICAgICAgICAgIGlmICghbWVzc2FnZS0+ZmluZERvdWJsZShrZXksICZ2YWwpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJBTWVkaWFGb3JtYXRXcmFwcGVyOjpDcmVhdGU6IGVycm9yIGF0IGl0ZW0gJXp1IiwgaSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhTWVkaWFGb3JtYXQtPnNldERvdWJsZShrZXksIHZhbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlU2l6ZTogeworICAgICAgICAgICAgICAgIHNpemVfdCB2YWw7CisgICAgICAgICAgICAgICAgaWYgKCFtZXNzYWdlLT5maW5kU2l6ZShrZXksICZ2YWwpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJBTWVkaWFGb3JtYXRXcmFwcGVyOjpDcmVhdGU6IGVycm9yIGF0IGl0ZW0gJXp1IiwgaSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhTWVkaWFGb3JtYXQtPnNldFNpemUoa2V5LCB2YWwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZVJlY3Q6IHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbTsKKyAgICAgICAgICAgICAgICBpZiAoIW1lc3NhZ2UtPmZpbmRSZWN0KGtleSwgJmxlZnQsICZ0b3AsICZyaWdodCwgJmJvdHRvbSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkFNZWRpYUZvcm1hdFdyYXBwZXI6OkNyZWF0ZTogZXJyb3IgYXQgaXRlbSAlenUiLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFNZWRpYUZvcm1hdC0+c2V0UmVjdChrZXksIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlU3RyaW5nOiB7CisgICAgICAgICAgICAgICAgQVN0cmluZyB2YWw7CisgICAgICAgICAgICAgICAgaWYgKCFtZXNzYWdlLT5maW5kU3RyaW5nKGtleSwgJnZhbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkFNZWRpYUZvcm1hdFdyYXBwZXI6OkNyZWF0ZTogZXJyb3IgYXQgaXRlbSAlenUiLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFNZWRpYUZvcm1hdC0+c2V0U3RyaW5nKGtleSwgdmFsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVCdWZmZXI6IHsKKyAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiB2YWw7CisgICAgICAgICAgICAgICAgaWYgKCFtZXNzYWdlLT5maW5kQnVmZmVyKGtleSwgJnZhbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkFNZWRpYUZvcm1hdFdyYXBwZXI6OkNyZWF0ZTogZXJyb3IgYXQgaXRlbSAlenUiLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFNZWRpYUZvcm1hdC0+c2V0QnVmZmVyKGtleSwgdmFsLT5kYXRhKCksIHZhbC0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGFNZWRpYUZvcm1hdDsKK30KKworQU1lZGlhRm9ybWF0V3JhcHBlcjo6QU1lZGlhRm9ybWF0V3JhcHBlcigpIHsKKyAgICBtQU1lZGlhRm9ybWF0ID0gQU1lZGlhRm9ybWF0X25ldygpOworfQorCitBTWVkaWFGb3JtYXRXcmFwcGVyOjpBTWVkaWFGb3JtYXRXcmFwcGVyKEFNZWRpYUZvcm1hdCAqYU1lZGlhRm9ybWF0KQorICAgIDogbUFNZWRpYUZvcm1hdChhTWVkaWFGb3JtYXQpIHsKK30KKworQU1lZGlhRm9ybWF0V3JhcHBlcjo6fkFNZWRpYUZvcm1hdFdyYXBwZXIoKSB7CisgICAgcmVsZWFzZSgpOworfQorCitzdGF0dXNfdCBBTWVkaWFGb3JtYXRXcmFwcGVyOjpyZWxlYXNlKCkgeworICAgIGlmIChtQU1lZGlhRm9ybWF0ICE9IE5VTEwpIHsKKyAgICAgICAgbWVkaWFfc3RhdHVzX3QgZXJyID0gQU1lZGlhRm9ybWF0X2RlbGV0ZShtQU1lZGlhRm9ybWF0KTsKKyAgICAgICAgbUFNZWRpYUZvcm1hdCA9IE5VTEw7CisgICAgICAgIHJldHVybiB0cmFuc2xhdGVFcnJvckNvZGUoZXJyKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitBTWVkaWFGb3JtYXQgKkFNZWRpYUZvcm1hdFdyYXBwZXI6OmdldEFNZWRpYUZvcm1hdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUFNZWRpYUZvcm1hdDsKK30KKworc3A8QU1lc3NhZ2U+IEFNZWRpYUZvcm1hdFdyYXBwZXI6OnRvQU1lc3NhZ2UoKSBjb25zdCB7CisgIHNwPEFNZXNzYWdlPiBtc2c7CisgIHdyaXRlVG9BTWVzc2FnZShtc2cpOworICByZXR1cm4gbXNnOworfQorCit2b2lkIEFNZWRpYUZvcm1hdFdyYXBwZXI6OndyaXRlVG9BTWVzc2FnZShzcDxBTWVzc2FnZT4gJm1zZykgY29uc3QgeworICAgIGlmIChtQU1lZGlhRm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgbXNnID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAobXNnID09IE5VTEwpIHsKKyAgICAgICAgbXNnID0gbmV3IEFNZXNzYWdlOworICAgIH0KKyAgICBmb3IgKGF1dG8mIGtleSA6IEFNZWRpYUZvcm1hdEtleUdyb3VwSW50MzIpIHsKKyAgICAgICAgaW50MzJfdCB2YWw7CisgICAgICAgIGlmIChnZXRJbnQzMihrZXksICZ2YWwpKSB7CisgICAgICAgICAgICBtc2ctPnNldEludDMyKGtleSwgdmFsKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGF1dG8mIGtleSA6IEFNZWRpYUZvcm1hdEtleUdyb3VwSW50NjQpIHsKKyAgICAgICAgaW50NjRfdCB2YWw7CisgICAgICAgIGlmIChnZXRJbnQ2NChrZXksICZ2YWwpKSB7CisgICAgICAgICAgICBtc2ctPnNldEludDY0KGtleSwgdmFsKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGF1dG8mIGtleSA6IEFNZWRpYUZvcm1hdEtleUdyb3VwU3RyaW5nKSB7CisgICAgICAgIEFTdHJpbmcgdmFsOworICAgICAgICBpZiAoZ2V0U3RyaW5nKGtleSwgJnZhbCkpIHsKKyAgICAgICAgICAgIG1zZy0+c2V0U3RyaW5nKGtleSwgdmFsKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGF1dG8mIGtleSA6IEFNZWRpYUZvcm1hdEtleUdyb3VwQnVmZmVyKSB7CisgICAgICAgIHZvaWQgKmRhdGE7CisgICAgICAgIHNpemVfdCBzaXplOworICAgICAgICBpZiAoZ2V0QnVmZmVyKGtleSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KGRhdGEsIHNpemUpOworICAgICAgICAgICAgbXNnLT5zZXRCdWZmZXIoa2V5LCBidWZmZXIpOworICAgICAgICB9CisgICAgfQorICAgIGZvciAoYXV0byYga2V5IDogQU1lZGlhRm9ybWF0S2V5R3JvdXBDc2QpIHsKKyAgICAgICAgdm9pZCAqZGF0YTsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgIGlmIChnZXRCdWZmZXIoa2V5LCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoZGF0YSwgc2l6ZSk7CisgICAgICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50MzIoQU1FRElBRk9STUFUX0tFWV9DU0QsIDEpOworICAgICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgMCk7CisgICAgICAgICAgICBtc2ctPnNldEJ1ZmZlcihrZXksIGJ1ZmZlcik7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChhdXRvJiBrZXkgOiBBTWVkaWFGb3JtYXRLZXlHcm91cFJlY3QpIHsKKyAgICAgICAgaW50MzJfdCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b207CisgICAgICAgIGlmIChnZXRSZWN0KGtleSwgJmxlZnQsICZ0b3AsICZyaWdodCwgJmJvdHRvbSkpIHsKKyAgICAgICAgICAgIG1zZy0+c2V0UmVjdChrZXksIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChhdXRvJiBrZXkgOiBBTWVkaWFGb3JtYXRLZXlHcm91cEZsb2F0SW50MzIpIHsKKyAgICAgICAgZmxvYXQgdmFsRmxvYXQ7CisgICAgICAgIGlmIChnZXRGbG9hdChrZXksICZ2YWxGbG9hdCkpIHsKKyAgICAgICAgICAgIG1zZy0+c2V0RmxvYXQoa2V5LCB2YWxGbG9hdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbEludDMyOworICAgICAgICAgICAgaWYgKGdldEludDMyKGtleSwgJnZhbEludDMyKSkgeworICAgICAgICAgICAgICAgIG1zZy0+c2V0RmxvYXQoa2V5LCAoZmxvYXQpdmFsSW50MzIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitjb25zdCBjaGFyKiBBTWVkaWFGb3JtYXRXcmFwcGVyOjp0b1N0cmluZygpIGNvbnN0IHsKKyAgICBpZiAobUFNZWRpYUZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X3RvU3RyaW5nKG1BTWVkaWFGb3JtYXQpOworfQorCitib29sIEFNZWRpYUZvcm1hdFdyYXBwZXI6OmdldEludDMyKGNvbnN0IGNoYXIgKm5hbWUsIGludDMyX3QgKm91dCkgY29uc3QgeworICAgIGlmIChtQU1lZGlhRm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2dldEludDMyKG1BTWVkaWFGb3JtYXQsIG5hbWUsIG91dCk7Cit9CisKK2Jvb2wgQU1lZGlhRm9ybWF0V3JhcHBlcjo6Z2V0SW50NjQoY29uc3QgY2hhciAqbmFtZSwgaW50NjRfdCAqb3V0KSBjb25zdCB7CisgICAgaWYgKG1BTWVkaWFGb3JtYXQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBBTWVkaWFGb3JtYXRfZ2V0SW50NjQobUFNZWRpYUZvcm1hdCwgbmFtZSwgb3V0KTsKK30KKworYm9vbCBBTWVkaWFGb3JtYXRXcmFwcGVyOjpnZXRGbG9hdChjb25zdCBjaGFyICpuYW1lLCBmbG9hdCAqb3V0KSBjb25zdCB7CisgICAgaWYgKG1BTWVkaWFGb3JtYXQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBBTWVkaWFGb3JtYXRfZ2V0RmxvYXQobUFNZWRpYUZvcm1hdCwgbmFtZSwgb3V0KTsKK30KKworYm9vbCBBTWVkaWFGb3JtYXRXcmFwcGVyOjpnZXREb3VibGUoY29uc3QgY2hhciAqbmFtZSwgZG91YmxlICpvdXQpIGNvbnN0IHsKKyAgICBpZiAobUFNZWRpYUZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9nZXREb3VibGUobUFNZWRpYUZvcm1hdCwgbmFtZSwgb3V0KTsKK30KKworYm9vbCBBTWVkaWFGb3JtYXRXcmFwcGVyOjpnZXRTaXplKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCAqb3V0KSBjb25zdCB7CisgICAgaWYgKG1BTWVkaWFGb3JtYXQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBBTWVkaWFGb3JtYXRfZ2V0U2l6ZShtQU1lZGlhRm9ybWF0LCBuYW1lLCBvdXQpOworfQorCitib29sIEFNZWRpYUZvcm1hdFdyYXBwZXI6OmdldFJlY3QoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludDMyX3QgKmxlZnQsIGludDMyX3QgKnRvcCwgaW50MzJfdCAqcmlnaHQsIGludDMyX3QgKmJvdHRvbSkgY29uc3QgeworICAgIGlmIChtQU1lZGlhRm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2dldFJlY3QobUFNZWRpYUZvcm1hdCwgbmFtZSwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKK30KKworYm9vbCBBTWVkaWFGb3JtYXRXcmFwcGVyOjpnZXRCdWZmZXIoY29uc3QgY2hhciAqbmFtZSwgdm9pZCoqIGRhdGEsIHNpemVfdCAqb3V0U2l6ZSkgY29uc3QgeworICAgIGlmIChtQU1lZGlhRm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcihtQU1lZGlhRm9ybWF0LCBuYW1lLCBkYXRhLCBvdXRTaXplKTsKK30KKworYm9vbCBBTWVkaWFGb3JtYXRXcmFwcGVyOjpnZXRTdHJpbmcoY29uc3QgY2hhciAqbmFtZSwgQVN0cmluZyAqb3V0KSBjb25zdCB7CisgICAgaWYgKG1BTWVkaWFGb3JtYXQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGNvbnN0IGNoYXIgKm91dENoYXIgPSBOVUxMOworICAgIGJvb2wgcmV0ID0gQU1lZGlhRm9ybWF0X2dldFN0cmluZyhtQU1lZGlhRm9ybWF0LCBuYW1lLCAmb3V0Q2hhcik7CisgICAgaWYgKHJldCkgeworICAgICAgICAqb3V0ID0gQVN0cmluZyhvdXRDaGFyKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBBTWVkaWFGb3JtYXRXcmFwcGVyOjpzZXRJbnQzMihjb25zdCBjaGFyKiBuYW1lLCBpbnQzMl90IHZhbHVlKSB7CisgICAgaWYgKG1BTWVkaWFGb3JtYXQgIT0gTlVMTCkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUFNZWRpYUZvcm1hdCwgbmFtZSwgdmFsdWUpOworICAgIH0KK30KKwordm9pZCBBTWVkaWFGb3JtYXRXcmFwcGVyOjpzZXRJbnQ2NChjb25zdCBjaGFyKiBuYW1lLCBpbnQ2NF90IHZhbHVlKSB7CisgICAgaWYgKG1BTWVkaWFGb3JtYXQgIT0gTlVMTCkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobUFNZWRpYUZvcm1hdCwgbmFtZSwgdmFsdWUpOworICAgIH0KK30KKwordm9pZCBBTWVkaWFGb3JtYXRXcmFwcGVyOjpzZXRGbG9hdChjb25zdCBjaGFyKiBuYW1lLCBmbG9hdCB2YWx1ZSkgeworICAgIGlmIChtQU1lZGlhRm9ybWF0ICE9IE5VTEwpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEZsb2F0KG1BTWVkaWFGb3JtYXQsIG5hbWUsIHZhbHVlKTsKKyAgICB9Cit9CisKK3ZvaWQgQU1lZGlhRm9ybWF0V3JhcHBlcjo6c2V0RG91YmxlKGNvbnN0IGNoYXIqIG5hbWUsIGRvdWJsZSB2YWx1ZSkgeworICAgIGlmIChtQU1lZGlhRm9ybWF0ICE9IE5VTEwpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldERvdWJsZShtQU1lZGlhRm9ybWF0LCBuYW1lLCB2YWx1ZSk7CisgICAgfQorfQorCit2b2lkIEFNZWRpYUZvcm1hdFdyYXBwZXI6OnNldFNpemUoY29uc3QgY2hhciogbmFtZSwgc2l6ZV90IHZhbHVlKSB7CisgICAgaWYgKG1BTWVkaWFGb3JtYXQgIT0gTlVMTCkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U2l6ZShtQU1lZGlhRm9ybWF0LCBuYW1lLCB2YWx1ZSk7CisgICAgfQorfQorCit2b2lkIEFNZWRpYUZvcm1hdFdyYXBwZXI6OnNldFJlY3QoCisgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUsIGludDMyX3QgbGVmdCwgaW50MzJfdCB0b3AsIGludDMyX3QgcmlnaHQsIGludDMyX3QgYm90dG9tKSB7CisgICAgaWYgKG1BTWVkaWFGb3JtYXQgIT0gTlVMTCkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0UmVjdChtQU1lZGlhRm9ybWF0LCBuYW1lLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOworICAgIH0KK30KKwordm9pZCBBTWVkaWFGb3JtYXRXcmFwcGVyOjpzZXRTdHJpbmcoY29uc3QgY2hhciogbmFtZSwgY29uc3QgQVN0cmluZyAmdmFsdWUpIHsKKyAgICBpZiAobUFNZWRpYUZvcm1hdCAhPSBOVUxMKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUFNZWRpYUZvcm1hdCwgbmFtZSwgdmFsdWUuY19zdHIoKSk7CisgICAgfQorfQorCit2b2lkIEFNZWRpYUZvcm1hdFdyYXBwZXI6OnNldEJ1ZmZlcihjb25zdCBjaGFyKiBuYW1lLCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChtQU1lZGlhRm9ybWF0ICE9IE5VTEwpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtQU1lZGlhRm9ybWF0LCBuYW1lLCBkYXRhLCBzaXplKTsKKyAgICB9Cit9CisKKworLy8vLy8vLy8vLy8vIEFOYXRpdmVXaW5kb3dXcmFwcGVyCitBTmF0aXZlV2luZG93V3JhcHBlcjo6QU5hdGl2ZVdpbmRvd1dyYXBwZXIoQU5hdGl2ZVdpbmRvdyAqYU5hdGl2ZVdpbmRvdykKKyAgICA6IG1BTmF0aXZlV2luZG93KGFOYXRpdmVXaW5kb3cpIHsKKyAgICBpZiAoYU5hdGl2ZVdpbmRvdyAhPSBOVUxMKSB7CisgICAgICAgIEFOYXRpdmVXaW5kb3dfYWNxdWlyZShhTmF0aXZlV2luZG93KTsKKyAgICB9Cit9CisKK0FOYXRpdmVXaW5kb3dXcmFwcGVyOjp+QU5hdGl2ZVdpbmRvd1dyYXBwZXIoKSB7CisgICAgcmVsZWFzZSgpOworfQorCitzdGF0dXNfdCBBTmF0aXZlV2luZG93V3JhcHBlcjo6cmVsZWFzZSgpIHsKKyAgICBpZiAobUFOYXRpdmVXaW5kb3cgIT0gTlVMTCkgeworICAgICAgICBBTmF0aXZlV2luZG93X3JlbGVhc2UobUFOYXRpdmVXaW5kb3cpOworICAgICAgICBtQU5hdGl2ZVdpbmRvdyA9IE5VTEw7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworQU5hdGl2ZVdpbmRvdyAqQU5hdGl2ZVdpbmRvd1dyYXBwZXI6OmdldEFOYXRpdmVXaW5kb3coKSBjb25zdCB7CisgICAgcmV0dXJuIG1BTmF0aXZlV2luZG93OworfQorCisKKy8vLy8vLy8vLy8vLyBBTWVkaWFEcm1XcmFwcGVyCitBTWVkaWFEcm1XcmFwcGVyOjpBTWVkaWFEcm1XcmFwcGVyKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0pIHsKKyAgICBtQU1lZGlhRHJtID0gQU1lZGlhRHJtX2NyZWF0ZUJ5VVVJRCh1dWlkKTsKK30KKworQU1lZGlhRHJtV3JhcHBlcjo6QU1lZGlhRHJtV3JhcHBlcihBTWVkaWFEcm0gKmFNZWRpYURybSkKKyAgICA6IG1BTWVkaWFEcm0oYU1lZGlhRHJtKSB7Cit9CisKK0FNZWRpYURybVdyYXBwZXI6On5BTWVkaWFEcm1XcmFwcGVyKCkgeworICAgIHJlbGVhc2UoKTsKK30KKworc3RhdHVzX3QgQU1lZGlhRHJtV3JhcHBlcjo6cmVsZWFzZSgpIHsKKyAgICBpZiAobUFNZWRpYURybSAhPSBOVUxMKSB7CisgICAgICAgIEFNZWRpYURybV9yZWxlYXNlKG1BTWVkaWFEcm0pOworICAgICAgICBtQU1lZGlhRHJtID0gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitBTWVkaWFEcm0gKkFNZWRpYURybVdyYXBwZXI6OmdldEFNZWRpYURybSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUFNZWRpYURybTsKK30KKworLy8gc3RhdGljCitib29sIEFNZWRpYURybVdyYXBwZXI6OmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKAorICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLAorICAgICAgICBjb25zdCBjaGFyICptaW1lVHlwZSkgeworICAgIHJldHVybiBBTWVkaWFEcm1faXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCwgbWltZVR5cGUpOworfQorCisKKy8vLy8vLy8vLy8vLyBBTWVkaWFDcnlwdG9XcmFwcGVyCitBTWVkaWFDcnlwdG9XcmFwcGVyOjpBTWVkaWFDcnlwdG9XcmFwcGVyKAorICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCB2b2lkICppbml0RGF0YSwgc2l6ZV90IGluaXREYXRhU2l6ZSkgeworICAgIG1BTWVkaWFDcnlwdG8gPSBBTWVkaWFDcnlwdG9fbmV3KHV1aWQsIGluaXREYXRhLCBpbml0RGF0YVNpemUpOworfQorCitBTWVkaWFDcnlwdG9XcmFwcGVyOjpBTWVkaWFDcnlwdG9XcmFwcGVyKEFNZWRpYUNyeXB0byAqYU1lZGlhQ3J5cHRvKQorICAgIDogbUFNZWRpYUNyeXB0byhhTWVkaWFDcnlwdG8pIHsKK30KKworQU1lZGlhQ3J5cHRvV3JhcHBlcjo6fkFNZWRpYUNyeXB0b1dyYXBwZXIoKSB7CisgICAgcmVsZWFzZSgpOworfQorCitzdGF0dXNfdCBBTWVkaWFDcnlwdG9XcmFwcGVyOjpyZWxlYXNlKCkgeworICAgIGlmIChtQU1lZGlhQ3J5cHRvICE9IE5VTEwpIHsKKyAgICAgICAgQU1lZGlhQ3J5cHRvX2RlbGV0ZShtQU1lZGlhQ3J5cHRvKTsKKyAgICAgICAgbUFNZWRpYUNyeXB0byA9IE5VTEw7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworQU1lZGlhQ3J5cHRvICpBTWVkaWFDcnlwdG9XcmFwcGVyOjpnZXRBTWVkaWFDcnlwdG8oKSBjb25zdCB7CisgICAgcmV0dXJuIG1BTWVkaWFDcnlwdG87Cit9CisKK2Jvb2wgQU1lZGlhQ3J5cHRvV3JhcHBlcjo6aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSkgeworICAgIGlmIChtQU1lZGlhQ3J5cHRvID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gQU1lZGlhQ3J5cHRvX2lzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQpOworfQorCitib29sIEFNZWRpYUNyeXB0b1dyYXBwZXI6OnJlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudChjb25zdCBjaGFyICptaW1lKSB7CisgICAgaWYgKG1BTWVkaWFDcnlwdG8gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBBTWVkaWFDcnlwdG9fcmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50KG1pbWUpOworfQorCisKKy8vLy8vLy8vLy8vLyBBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyCisvLyBzdGF0aWMKK3NwPEFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXI+IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXI6OkNyZWF0ZShNZXRhRGF0YUJhc2UgJm1ldGEpIHsKKworICAgIHVpbnQzMl90IHR5cGU7CisgICAgY29uc3Qgdm9pZCAqY3J5cHRlZGRhdGE7CisgICAgc2l6ZV90IGNyeXB0ZWRzaXplOworCisgICAgaWYgKCFtZXRhLmZpbmREYXRhKGtLZXlFbmNyeXB0ZWRTaXplcywgJnR5cGUsICZjcnlwdGVkZGF0YSwgJmNyeXB0ZWRzaXplKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpbnQgbnVtU3ViU2FtcGxlcyA9IGNyeXB0ZWRzaXplIC8gc2l6ZW9mKHNpemVfdCk7CisKKyAgICBpZiAobnVtU3ViU2FtcGxlcyA8PSAwKSB7CisgICAgICAgIEFMT0dFKCJDcmVhdGU6IElOVkFMSUQgbnVtU3ViU2FtcGxlczogJWQiLCBudW1TdWJTYW1wbGVzKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgY29uc3Qgdm9pZCAqY2xlYXJkYXRhOworICAgIHNpemVfdCBjbGVhcnNpemU7CisgICAgaWYgKG1ldGEuZmluZERhdGEoa0tleVBsYWluU2l6ZXMsICZ0eXBlLCAmY2xlYXJkYXRhLCAmY2xlYXJzaXplKSkgeworICAgICAgICBpZiAoY2xlYXJzaXplICE9IGNyeXB0ZWRzaXplKSB7CisgICAgICAgICAgICAvLyBUaGUgdHdvIG11c3QgYmUgb2YgdGhlIHNhbWUgbGVuZ3RoLgorICAgICAgICAgICAgQUxPR0UoIkNyZWF0ZTogbWlzbWF0Y2ggY3J5cHRlZHNpemU6ICV6dSAhPSBjbGVhcnNpemU6ICV6dSIsIGNyeXB0ZWRzaXplLCBjbGVhcnNpemUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCB2b2lkICprZXk7CisgICAgc2l6ZV90IGtleXNpemU7CisgICAgaWYgKG1ldGEuZmluZERhdGEoa0tleUNyeXB0b0tleSwgJnR5cGUsICZrZXksICZrZXlzaXplKSkgeworICAgICAgICBpZiAoa2V5c2l6ZSAhPSBrQUVTQmxvY2tTaXplKSB7CisgICAgICAgICAgICAvLyBLZXlzIG11c3QgYmUgMTYgYnl0ZXMgaW4gbGVuZ3RoLgorICAgICAgICAgICAgQUxPR0UoIkNyZWF0ZTogS2V5cyBtdXN0IGJlICV6dSBieXRlcyBpbiBsZW5ndGg6ICV6dSIsIGtBRVNCbG9ja1NpemUsIGtleXNpemUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCB2b2lkICppdjsKKyAgICBzaXplX3QgaXZzaXplOworICAgIGlmIChtZXRhLmZpbmREYXRhKGtLZXlDcnlwdG9JViwgJnR5cGUsICZpdiwgJml2c2l6ZSkpIHsKKyAgICAgICAgaWYgKGl2c2l6ZSAhPSBrQUVTQmxvY2tTaXplKSB7CisgICAgICAgICAgICAvLyBJVnMgbXVzdCBiZSAxNiBieXRlcyBpbiBsZW5ndGguCisgICAgICAgICAgICBBTE9HRSgiQ3JlYXRlOiBJViBtdXN0IGJlICV6dSBieXRlcyBpbiBsZW5ndGg6ICV6dSIsIGtBRVNCbG9ja1NpemUsIGl2c2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGludDMyX3QgbW9kZTsKKyAgICBpZiAoIW1ldGEuZmluZEludDMyKGtLZXlDcnlwdG9Nb2RlLCAmbW9kZSkpIHsKKyAgICAgICAgbW9kZSA9IENyeXB0b1BsdWdpbjo6a01vZGVfQUVTX0NUUjsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXIoCisgICAgICAgICAgICBudW1TdWJTYW1wbGVzLAorICAgICAgICAgICAgKHVpbnQ4X3QqKSBrZXksCisgICAgICAgICAgICAodWludDhfdCopIGl2LAorICAgICAgICAgICAgKENyeXB0b1BsdWdpbjo6TW9kZSltb2RlLAorICAgICAgICAgICAgKHNpemVfdCopIGNsZWFyZGF0YSwKKyAgICAgICAgICAgIChzaXplX3QqKSBjcnlwdGVkZGF0YSk7Cit9CisKK0FNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXI6OkFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXIoCisgICAgICAgIGludCBudW1zdWJzYW1wbGVzLAorICAgICAgICB1aW50OF90IGtleVsxNl0sCisgICAgICAgIHVpbnQ4X3QgaXZbMTZdLAorICAgICAgICBDcnlwdG9QbHVnaW46Ok1vZGUgbW9kZSwKKyAgICAgICAgc2l6ZV90ICpjbGVhcmJ5dGVzLAorICAgICAgICBzaXplX3QgKmVuY3J5cHRlZGJ5dGVzKSB7CisgICAgbUFNZWRpYUNvZGVjQ3J5cHRvSW5mbyA9CisgICAgICAgIEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19uZXcobnVtc3Vic2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlVG9DcnlwdG9JbmZvTW9kZShtb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhcmJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRlZGJ5dGVzKTsKK30KKworQU1lZGlhQ29kZWNDcnlwdG9JbmZvV3JhcHBlcjo6QU1lZGlhQ29kZWNDcnlwdG9JbmZvV3JhcHBlcigKKyAgICAgICAgQU1lZGlhQ29kZWNDcnlwdG9JbmZvICphTWVkaWFDb2RlY0NyeXB0b0luZm8pCisgICAgOiBtQU1lZGlhQ29kZWNDcnlwdG9JbmZvKGFNZWRpYUNvZGVjQ3J5cHRvSW5mbykgeworfQorCitBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyOjp+QU1lZGlhQ29kZWNDcnlwdG9JbmZvV3JhcHBlcigpIHsKKyAgICByZWxlYXNlKCk7Cit9CisKK3N0YXR1c190IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXI6OnJlbGVhc2UoKSB7CisgICAgaWYgKG1BTWVkaWFDb2RlY0NyeXB0b0luZm8gIT0gTlVMTCkgeworICAgICAgICBtZWRpYV9zdGF0dXNfdCBlcnIgPSBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZGVsZXRlKG1BTWVkaWFDb2RlY0NyeXB0b0luZm8pOworICAgICAgICBtQU1lZGlhQ29kZWNDcnlwdG9JbmZvID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZUVycm9yQ29kZShlcnIpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK0FNZWRpYUNvZGVjQ3J5cHRvSW5mbyAqQU1lZGlhQ29kZWNDcnlwdG9JbmZvV3JhcHBlcjo6Z2V0QU1lZGlhQ29kZWNDcnlwdG9JbmZvKCkgY29uc3QgeworICAgIHJldHVybiBtQU1lZGlhQ29kZWNDcnlwdG9JbmZvOworfQorCit2b2lkIEFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXI6OnNldFBhdHRlcm4oQ3J5cHRvUGx1Z2luOjpQYXR0ZXJuICpwYXR0ZXJuKSB7CisgICAgaWYgKG1BTWVkaWFDb2RlY0NyeXB0b0luZm8gPT0gTlVMTCB8fCBwYXR0ZXJuID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjcnlwdG9pbmZvX3BhdHRlcm5fdCBuZGtQYXR0ZXJuID0geyhpbnQzMl90KXBhdHRlcm4tPm1FbmNyeXB0QmxvY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpcGF0dGVybi0+bVNraXBCbG9ja3MgfTsKKyAgICByZXR1cm4gQU1lZGlhQ29kZWNDcnlwdG9JbmZvX3NldFBhdHRlcm4obUFNZWRpYUNvZGVjQ3J5cHRvSW5mbywgJm5ka1BhdHRlcm4pOworfQorCitzaXplX3QgQU1lZGlhQ29kZWNDcnlwdG9JbmZvV3JhcHBlcjo6Z2V0TnVtU3ViU2FtcGxlcygpIHsKKyAgICBpZiAobUFNZWRpYUNvZGVjQ3J5cHRvSW5mbyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2dldE51bVN1YlNhbXBsZXMobUFNZWRpYUNvZGVjQ3J5cHRvSW5mbyk7Cit9CisKK3N0YXR1c190IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXI6OmdldEtleSh1aW50OF90ICpkc3QpIHsKKyAgICBpZiAobUFNZWRpYUNvZGVjQ3J5cHRvSW5mbyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgaWYgKGRzdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiB0cmFuc2xhdGVFcnJvckNvZGUoCisgICAgICAgIEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19nZXRLZXkobUFNZWRpYUNvZGVjQ3J5cHRvSW5mbywgZHN0KSk7Cit9CisKK3N0YXR1c190IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXI6OmdldElWKHVpbnQ4X3QgKmRzdCkgeworICAgIGlmIChtQU1lZGlhQ29kZWNDcnlwdG9JbmZvID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBpZiAoZHN0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIHRyYW5zbGF0ZUVycm9yQ29kZSgKKyAgICAgICAgQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2dldElWKG1BTWVkaWFDb2RlY0NyeXB0b0luZm8sIGRzdCkpOworfQorCitDcnlwdG9QbHVnaW46Ok1vZGUgQU1lZGlhQ29kZWNDcnlwdG9JbmZvV3JhcHBlcjo6Z2V0TW9kZSgpIHsKKyAgICBpZiAobUFNZWRpYUNvZGVjQ3J5cHRvSW5mbyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBDcnlwdG9QbHVnaW46OmtNb2RlX1VuZW5jcnlwdGVkOworICAgIH0KKyAgICByZXR1cm4gdHJhbnNsYXRlVG9DcnlwdG9QbHVnaW5Nb2RlKAorICAgICAgICBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZ2V0TW9kZShtQU1lZGlhQ29kZWNDcnlwdG9JbmZvKSk7Cit9CisKK3N0YXR1c190IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXI6OmdldENsZWFyQnl0ZXMoc2l6ZV90ICpkc3QpIHsKKyAgICBpZiAobUFNZWRpYUNvZGVjQ3J5cHRvSW5mbyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgaWYgKGRzdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiB0cmFuc2xhdGVFcnJvckNvZGUoCisgICAgICAgIEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19nZXRDbGVhckJ5dGVzKG1BTWVkaWFDb2RlY0NyeXB0b0luZm8sIGRzdCkpOworfQorCitzdGF0dXNfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyOjpnZXRFbmNyeXB0ZWRCeXRlcyhzaXplX3QgKmRzdCkgeworICAgIGlmIChtQU1lZGlhQ29kZWNDcnlwdG9JbmZvID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBpZiAoZHN0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIHRyYW5zbGF0ZUVycm9yQ29kZSgKKyAgICAgICAgQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2dldEVuY3J5cHRlZEJ5dGVzKG1BTWVkaWFDb2RlY0NyeXB0b0luZm8sIGRzdCkpOworfQorCisKKy8vLy8vLy8vLy8vLyBBTWVkaWFDb2RlY1dyYXBwZXIKKy8vIHN0YXRpYworc3A8QU1lZGlhQ29kZWNXcmFwcGVyPiBBTWVkaWFDb2RlY1dyYXBwZXI6OkNyZWF0ZUNvZGVjQnlOYW1lKGNvbnN0IEFTdHJpbmcgJm5hbWUpIHsKKyAgICBBTWVkaWFDb2RlYyAqYU1lZGlhQ29kZWMgPSBBTWVkaWFDb2RlY19jcmVhdGVDb2RlY0J5TmFtZShuYW1lLmNfc3RyKCkpOworICAgIHJldHVybiBuZXcgQU1lZGlhQ29kZWNXcmFwcGVyKGFNZWRpYUNvZGVjKTsKK30KKworLy8gc3RhdGljCitzcDxBTWVkaWFDb2RlY1dyYXBwZXI+IEFNZWRpYUNvZGVjV3JhcHBlcjo6Q3JlYXRlRGVjb2RlckJ5VHlwZShjb25zdCBBU3RyaW5nICZtaW1lVHlwZSkgeworICAgIEFNZWRpYUNvZGVjICphTWVkaWFDb2RlYyA9IEFNZWRpYUNvZGVjX2NyZWF0ZURlY29kZXJCeVR5cGUobWltZVR5cGUuY19zdHIoKSk7CisgICAgcmV0dXJuIG5ldyBBTWVkaWFDb2RlY1dyYXBwZXIoYU1lZGlhQ29kZWMpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgQU1lZGlhQ29kZWNXcmFwcGVyOjpPbklucHV0QXZhaWxhYmxlQ0IoCisgICAgICAgIEFNZWRpYUNvZGVjICogLyogYU1lZGlhQ29kZWMgKi8sCisgICAgICAgIHZvaWQgKnVzZXJkYXRhLAorICAgICAgICBpbnQzMl90IGluZGV4KSB7CisgICAgQUxPR1YoIk9uSW5wdXRBdmFpbGFibGVDQjogaW5kZXgoJWQpIiwgaW5kZXgpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBzcDxBTWVzc2FnZT4oKEFNZXNzYWdlICopdXNlcmRhdGEpLT5kdXAoKTsKKyAgICBtc2ctPnNldEludDMyKCJjYWxsYmFja0lEIiwgQ0JfSU5QVVRfQVZBSUxBQkxFKTsKKyAgICBtc2ctPnNldEludDMyKCJpbmRleCIsIGluZGV4KTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKworLy8gc3RhdGljCit2b2lkIEFNZWRpYUNvZGVjV3JhcHBlcjo6T25PdXRwdXRBdmFpbGFibGVDQigKKyAgICAgICAgQU1lZGlhQ29kZWMgKiAvKiBhTWVkaWFDb2RlYyAqLywKKyAgICAgICAgdm9pZCAqdXNlcmRhdGEsCisgICAgICAgIGludDMyX3QgaW5kZXgsCisgICAgICAgIEFNZWRpYUNvZGVjQnVmZmVySW5mbyAqYnVmZmVySW5mbykgeworICAgIEFMT0dWKCJPbk91dHB1dEF2YWlsYWJsZUNCOiBpbmRleCglZCksICglZCwgJWQsICVsbGQsIDB4JXgpIiwKKyAgICAgICAgICBpbmRleCwgYnVmZmVySW5mby0+b2Zmc2V0LCBidWZmZXJJbmZvLT5zaXplLAorICAgICAgICAgIChsb25nIGxvbmcpYnVmZmVySW5mby0+cHJlc2VudGF0aW9uVGltZVVzLCBidWZmZXJJbmZvLT5mbGFncyk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IHNwPEFNZXNzYWdlPigoQU1lc3NhZ2UgKil1c2VyZGF0YSktPmR1cCgpOworICAgIG1zZy0+c2V0SW50MzIoImNhbGxiYWNrSUQiLCBDQl9PVVRQVVRfQVZBSUxBQkxFKTsKKyAgICBtc2ctPnNldEludDMyKCJpbmRleCIsIGluZGV4KTsKKyAgICBtc2ctPnNldFNpemUoIm9mZnNldCIsIChzaXplX3QpKGJ1ZmZlckluZm8tPm9mZnNldCkpOworICAgIG1zZy0+c2V0U2l6ZSgic2l6ZSIsIChzaXplX3QpKGJ1ZmZlckluZm8tPnNpemUpKTsKKyAgICBtc2ctPnNldEludDY0KCJ0aW1lVXMiLCBidWZmZXJJbmZvLT5wcmVzZW50YXRpb25UaW1lVXMpOworICAgIG1zZy0+c2V0SW50MzIoImZsYWdzIiwgKGludDMyX3QpKGJ1ZmZlckluZm8tPmZsYWdzKSk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBBTWVkaWFDb2RlY1dyYXBwZXI6Ok9uRm9ybWF0Q2hhbmdlZENCKAorICAgICAgICBBTWVkaWFDb2RlYyAqIC8qIGFNZWRpYUNvZGVjICovLAorICAgICAgICB2b2lkICp1c2VyZGF0YSwKKyAgICAgICAgQU1lZGlhRm9ybWF0ICpmb3JtYXQpIHsKKyAgICBzcDxBTWVkaWFGb3JtYXRXcmFwcGVyPiBmb3JtYXRXcmFwcGVyID0gbmV3IEFNZWRpYUZvcm1hdFdyYXBwZXIoZm9ybWF0KTsKKyAgICBzcDxBTWVzc2FnZT4gb3V0cHV0Rm9ybWF0ID0gZm9ybWF0V3JhcHBlci0+dG9BTWVzc2FnZSgpOworICAgIEFMT0dWKCJPbkZvcm1hdENoYW5nZWRDQjogZm9ybWF0KCVzKSIsIG91dHB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBzcDxBTWVzc2FnZT4oKEFNZXNzYWdlICopdXNlcmRhdGEpLT5kdXAoKTsKKyAgICBtc2ctPnNldEludDMyKCJjYWxsYmFja0lEIiwgQ0JfT1VUUFVUX0ZPUk1BVF9DSEFOR0VEKTsKKyAgICBtc2ctPnNldE1lc3NhZ2UoImZvcm1hdCIsIG91dHB1dEZvcm1hdCk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBBTWVkaWFDb2RlY1dyYXBwZXI6Ok9uRXJyb3JDQigKKyAgICAgICAgQU1lZGlhQ29kZWMgKiAvKiBhTWVkaWFDb2RlYyAqLywKKyAgICAgICAgdm9pZCAqdXNlcmRhdGEsCisgICAgICAgIG1lZGlhX3N0YXR1c190IGVyciwKKyAgICAgICAgaW50MzJfdCBhY3Rpb25Db2RlLAorICAgICAgICBjb25zdCBjaGFyICpkZXRhaWwpIHsKKyAgICBBTE9HVigiT25FcnJvckNCOiBlcnIoJWQpLCBhY3Rpb25Db2RlKCVkKSwgZGV0YWlsKCVzKSIsIGVyciwgYWN0aW9uQ29kZSwgZGV0YWlsKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gc3A8QU1lc3NhZ2U+KChBTWVzc2FnZSAqKXVzZXJkYXRhKS0+ZHVwKCk7CisgICAgbXNnLT5zZXRJbnQzMigiY2FsbGJhY2tJRCIsIENCX0VSUk9SKTsKKyAgICBtc2ctPnNldEludDMyKCJlcnIiLCB0cmFuc2xhdGVFcnJvckNvZGUoZXJyKSk7CisgICAgbXNnLT5zZXRJbnQzMigiYWN0aW9uQ29kZSIsIHRyYW5zbGF0ZUFjdGlvbkNvZGUoYWN0aW9uQ29kZSkpOworICAgIG1zZy0+c2V0U3RyaW5nKCJkZXRhaWwiLCBkZXRhaWwpOworICAgIG1zZy0+cG9zdCgpOworfQorCitBTWVkaWFDb2RlY1dyYXBwZXI6OkFNZWRpYUNvZGVjV3JhcHBlcihBTWVkaWFDb2RlYyAqYU1lZGlhQ29kZWMpCisgICAgOiBtQU1lZGlhQ29kZWMoYU1lZGlhQ29kZWMpIHsKK30KKworQU1lZGlhQ29kZWNXcmFwcGVyOjp+QU1lZGlhQ29kZWNXcmFwcGVyKCkgeworICAgIHJlbGVhc2UoKTsKK30KKworc3RhdHVzX3QgQU1lZGlhQ29kZWNXcmFwcGVyOjpyZWxlYXNlKCkgeworICAgIGlmIChtQU1lZGlhQ29kZWMgIT0gTlVMTCkgeworICAgICAgICBBTWVkaWFDb2RlY09uQXN5bmNOb3RpZnlDYWxsYmFjayBhQ0IgPSB7fTsKKyAgICAgICAgQU1lZGlhQ29kZWNfc2V0QXN5bmNOb3RpZnlDYWxsYmFjayhtQU1lZGlhQ29kZWMsIGFDQiwgTlVMTCk7CisgICAgICAgIG1DYWxsYmFjayA9IE5VTEw7CisKKyAgICAgICAgbWVkaWFfc3RhdHVzX3QgZXJyID0gQU1lZGlhQ29kZWNfZGVsZXRlKG1BTWVkaWFDb2RlYyk7CisgICAgICAgIG1BTWVkaWFDb2RlYyA9IE5VTEw7CisgICAgICAgIHJldHVybiB0cmFuc2xhdGVFcnJvckNvZGUoZXJyKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitBTWVkaWFDb2RlYyAqQU1lZGlhQ29kZWNXcmFwcGVyOjpnZXRBTWVkaWFDb2RlYygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUFNZWRpYUNvZGVjOworfQorCitzdGF0dXNfdCBBTWVkaWFDb2RlY1dyYXBwZXI6OmdldE5hbWUoQVN0cmluZyAqb3V0Q29tcG9uZW50TmFtZSkgY29uc3QgeworICAgIGlmIChtQU1lZGlhQ29kZWMgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIGNoYXIgKm5hbWUgPSBOVUxMOworICAgIG1lZGlhX3N0YXR1c190IGVyciA9IEFNZWRpYUNvZGVjX2dldE5hbWUobUFNZWRpYUNvZGVjLCAmbmFtZSk7CisgICAgaWYgKGVyciAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZUVycm9yQ29kZShlcnIpOworICAgIH0KKworICAgICpvdXRDb21wb25lbnROYW1lID0gQVN0cmluZyhuYW1lKTsKKyAgICBBTWVkaWFDb2RlY19yZWxlYXNlTmFtZShtQU1lZGlhQ29kZWMsIG5hbWUpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQU1lZGlhQ29kZWNXcmFwcGVyOjpjb25maWd1cmUoCisgICAgY29uc3Qgc3A8QU1lZGlhRm9ybWF0V3JhcHBlcj4gJmZvcm1hdCwKKyAgICBjb25zdCBzcDxBTmF0aXZlV2luZG93V3JhcHBlcj4gJm53dywKKyAgICBjb25zdCBzcDxBTWVkaWFDcnlwdG9XcmFwcGVyPiAmY3J5cHRvLAorICAgIHVpbnQzMl90IGZsYWdzKSB7CisgICAgaWYgKG1BTWVkaWFDb2RlYyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisKKyAgICBtZWRpYV9zdGF0dXNfdCBlcnIgPSBBTWVkaWFDb2RlY19jb25maWd1cmUoCisgICAgICAgICAgICBtQU1lZGlhQ29kZWMsCisgICAgICAgICAgICBmb3JtYXQtPmdldEFNZWRpYUZvcm1hdCgpLAorICAgICAgICAgICAgKG53dyA9PSBOVUxMID8gTlVMTCA6IG53dy0+Z2V0QU5hdGl2ZVdpbmRvdygpKSwKKyAgICAgICAgICAgIGNyeXB0byA9PSBOVUxMID8gTlVMTCA6IGNyeXB0by0+Z2V0QU1lZGlhQ3J5cHRvKCksCisgICAgICAgICAgICBmbGFncyk7CisKKyAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3JDb2RlKGVycik7Cit9CisKK3N0YXR1c190IEFNZWRpYUNvZGVjV3JhcHBlcjo6c2V0Q2FsbGJhY2soY29uc3Qgc3A8QU1lc3NhZ2U+ICZjYWxsYmFjaykgeworICAgIGlmIChtQU1lZGlhQ29kZWMgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7CisKKyAgICBBTWVkaWFDb2RlY09uQXN5bmNOb3RpZnlDYWxsYmFjayBhQ0IgPSB7CisgICAgICAgIE9uSW5wdXRBdmFpbGFibGVDQiwKKyAgICAgICAgT25PdXRwdXRBdmFpbGFibGVDQiwKKyAgICAgICAgT25Gb3JtYXRDaGFuZ2VkQ0IsCisgICAgICAgIE9uRXJyb3JDQgorICAgIH07CisKKyAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3JDb2RlKAorICAgICAgICAgICAgQU1lZGlhQ29kZWNfc2V0QXN5bmNOb3RpZnlDYWxsYmFjayhtQU1lZGlhQ29kZWMsIGFDQiwgY2FsbGJhY2suZ2V0KCkpKTsKK30KKworc3RhdHVzX3QgQU1lZGlhQ29kZWNXcmFwcGVyOjpyZWxlYXNlQ3J5cHRvKCkgeworICAgIGlmIChtQU1lZGlhQ29kZWMgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIHJldHVybiB0cmFuc2xhdGVFcnJvckNvZGUoQU1lZGlhQ29kZWNfcmVsZWFzZUNyeXB0byhtQU1lZGlhQ29kZWMpKTsKK30KKworc3RhdHVzX3QgQU1lZGlhQ29kZWNXcmFwcGVyOjpzdGFydCgpIHsKKyAgICBpZiAobUFNZWRpYUNvZGVjID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3JDb2RlKEFNZWRpYUNvZGVjX3N0YXJ0KG1BTWVkaWFDb2RlYykpOworfQorCitzdGF0dXNfdCBBTWVkaWFDb2RlY1dyYXBwZXI6OnN0b3AoKSB7CisgICAgaWYgKG1BTWVkaWFDb2RlYyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgcmV0dXJuIHRyYW5zbGF0ZUVycm9yQ29kZShBTWVkaWFDb2RlY19zdG9wKG1BTWVkaWFDb2RlYykpOworfQorCitzdGF0dXNfdCBBTWVkaWFDb2RlY1dyYXBwZXI6OmZsdXNoKCkgeworICAgIGlmIChtQU1lZGlhQ29kZWMgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIHJldHVybiB0cmFuc2xhdGVFcnJvckNvZGUoQU1lZGlhQ29kZWNfZmx1c2gobUFNZWRpYUNvZGVjKSk7Cit9CisKK3VpbnQ4X3QqIEFNZWRpYUNvZGVjV3JhcHBlcjo6Z2V0SW5wdXRCdWZmZXIoc2l6ZV90IGlkeCwgc2l6ZV90ICpvdXRfc2l6ZSkgeworICAgIGlmIChtQU1lZGlhQ29kZWMgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIEFNZWRpYUNvZGVjX2dldElucHV0QnVmZmVyKG1BTWVkaWFDb2RlYywgaWR4LCBvdXRfc2l6ZSk7Cit9CisKK3VpbnQ4X3QqIEFNZWRpYUNvZGVjV3JhcHBlcjo6Z2V0T3V0cHV0QnVmZmVyKHNpemVfdCBpZHgsIHNpemVfdCAqb3V0X3NpemUpIHsKKyAgICBpZiAobUFNZWRpYUNvZGVjID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBBTWVkaWFDb2RlY19nZXRPdXRwdXRCdWZmZXIobUFNZWRpYUNvZGVjLCBpZHgsIG91dF9zaXplKTsKK30KKworc3RhdHVzX3QgQU1lZGlhQ29kZWNXcmFwcGVyOjpxdWV1ZUlucHV0QnVmZmVyKAorICAgICAgICBzaXplX3QgaWR4LAorICAgICAgICBzaXplX3Qgb2Zmc2V0LAorICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgdWludDY0X3QgdGltZSwKKyAgICAgICAgdWludDMyX3QgZmxhZ3MpIHsKKyAgICBpZiAobUFNZWRpYUNvZGVjID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3JDb2RlKAorICAgICAgICBBTWVkaWFDb2RlY19xdWV1ZUlucHV0QnVmZmVyKG1BTWVkaWFDb2RlYywgaWR4LCBvZmZzZXQsIHNpemUsIHRpbWUsIGZsYWdzKSk7Cit9CisKK3N0YXR1c190IEFNZWRpYUNvZGVjV3JhcHBlcjo6cXVldWVTZWN1cmVJbnB1dEJ1ZmZlcigKKyAgICAgICAgc2l6ZV90IGlkeCwKKyAgICAgICAgc2l6ZV90IG9mZnNldCwKKyAgICAgICAgc3A8QU1lZGlhQ29kZWNDcnlwdG9JbmZvV3JhcHBlcj4gJmNvZGVjQ3J5cHRvSW5mbywKKyAgICAgICAgdWludDY0X3QgdGltZSwKKyAgICAgICAgdWludDMyX3QgZmxhZ3MpIHsKKyAgICBpZiAobUFNZWRpYUNvZGVjID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3JDb2RlKAorICAgICAgICBBTWVkaWFDb2RlY19xdWV1ZVNlY3VyZUlucHV0QnVmZmVyKAorICAgICAgICAgICAgbUFNZWRpYUNvZGVjLAorICAgICAgICAgICAgaWR4LAorICAgICAgICAgICAgb2Zmc2V0LAorICAgICAgICAgICAgY29kZWNDcnlwdG9JbmZvLT5nZXRBTWVkaWFDb2RlY0NyeXB0b0luZm8oKSwKKyAgICAgICAgICAgIHRpbWUsCisgICAgICAgICAgICBmbGFncykpOworfQorCitzcDxBTWVkaWFGb3JtYXRXcmFwcGVyPiBBTWVkaWFDb2RlY1dyYXBwZXI6OmdldE91dHB1dEZvcm1hdCgpIHsKKyAgICBpZiAobUFNZWRpYUNvZGVjID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBuZXcgQU1lZGlhRm9ybWF0V3JhcHBlcihBTWVkaWFDb2RlY19nZXRPdXRwdXRGb3JtYXQobUFNZWRpYUNvZGVjKSk7Cit9CisKK3NwPEFNZWRpYUZvcm1hdFdyYXBwZXI+IEFNZWRpYUNvZGVjV3JhcHBlcjo6Z2V0SW5wdXRGb3JtYXQoKSB7CisgICAgaWYgKG1BTWVkaWFDb2RlYyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gbmV3IEFNZWRpYUZvcm1hdFdyYXBwZXIoQU1lZGlhQ29kZWNfZ2V0SW5wdXRGb3JtYXQobUFNZWRpYUNvZGVjKSk7Cit9CisKK3N0YXR1c190IEFNZWRpYUNvZGVjV3JhcHBlcjo6cmVsZWFzZU91dHB1dEJ1ZmZlcihzaXplX3QgaWR4LCBib29sIHJlbmRlcikgeworICAgIGlmIChtQU1lZGlhQ29kZWMgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIHJldHVybiB0cmFuc2xhdGVFcnJvckNvZGUoCisgICAgICAgIEFNZWRpYUNvZGVjX3JlbGVhc2VPdXRwdXRCdWZmZXIobUFNZWRpYUNvZGVjLCBpZHgsIHJlbmRlcikpOworfQorCitzdGF0dXNfdCBBTWVkaWFDb2RlY1dyYXBwZXI6OnNldE91dHB1dFN1cmZhY2UoY29uc3Qgc3A8QU5hdGl2ZVdpbmRvd1dyYXBwZXI+ICZud3cpIHsKKyAgICBpZiAobUFNZWRpYUNvZGVjID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3JDb2RlKAorICAgICAgICBBTWVkaWFDb2RlY19zZXRPdXRwdXRTdXJmYWNlKG1BTWVkaWFDb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnd3ID09IE5VTEwgPyBOVUxMIDogbnd3LT5nZXRBTmF0aXZlV2luZG93KCkpKSk7Cit9CisKK3N0YXR1c190IEFNZWRpYUNvZGVjV3JhcHBlcjo6cmVsZWFzZU91dHB1dEJ1ZmZlckF0VGltZShzaXplX3QgaWR4LCBpbnQ2NF90IHRpbWVzdGFtcE5zKSB7CisgICAgaWYgKG1BTWVkaWFDb2RlYyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgcmV0dXJuIHRyYW5zbGF0ZUVycm9yQ29kZSgKKyAgICAgICAgQU1lZGlhQ29kZWNfcmVsZWFzZU91dHB1dEJ1ZmZlckF0VGltZShtQU1lZGlhQ29kZWMsIGlkeCwgdGltZXN0YW1wTnMpKTsKK30KKworc3RhdHVzX3QgQU1lZGlhQ29kZWNXcmFwcGVyOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZWRpYUZvcm1hdFdyYXBwZXI+ICZwYXJhbXMpIHsKKyAgICBpZiAobUFNZWRpYUNvZGVjID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3JDb2RlKAorICAgICAgICBBTWVkaWFDb2RlY19zZXRQYXJhbWV0ZXJzKG1BTWVkaWFDb2RlYywgcGFyYW1zLT5nZXRBTWVkaWFGb3JtYXQoKSkpOworfQorCisvLy8vLy8vLy8vLy8gQU1lZGlhRXh0cmFjdG9yV3JhcHBlcgorCitBTWVkaWFFeHRyYWN0b3JXcmFwcGVyOjpBTWVkaWFFeHRyYWN0b3JXcmFwcGVyKEFNZWRpYUV4dHJhY3RvciAqYU1lZGlhRXh0cmFjdG9yKQorICAgIDogbUFNZWRpYUV4dHJhY3RvcihhTWVkaWFFeHRyYWN0b3IpIHsKK30KKworQU1lZGlhRXh0cmFjdG9yV3JhcHBlcjo6fkFNZWRpYUV4dHJhY3RvcldyYXBwZXIoKSB7CisgICAgcmVsZWFzZSgpOworfQorCitzdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyOjpyZWxlYXNlKCkgeworICAgIGlmIChtQU1lZGlhRXh0cmFjdG9yICE9IE5VTEwpIHsKKyAgICAgICAgbWVkaWFfc3RhdHVzX3QgZXJyID0gQU1lZGlhRXh0cmFjdG9yX2RlbGV0ZShtQU1lZGlhRXh0cmFjdG9yKTsKKyAgICAgICAgbUFNZWRpYUV4dHJhY3RvciA9IE5VTEw7CisgICAgICAgIHJldHVybiB0cmFuc2xhdGVFcnJvckNvZGUoZXJyKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyOjpkaXNjb25uZWN0KCkgeworICAgIGlmIChtQU1lZGlhRXh0cmFjdG9yICE9IE5VTEwpIHsKKyAgICAgICAgbWVkaWFfc3RhdHVzX3QgZXJyID0gQU1lZGlhRXh0cmFjdG9yX2Rpc2Nvbm5lY3QobUFNZWRpYUV4dHJhY3Rvcik7CisgICAgICAgIHJldHVybiB0cmFuc2xhdGVFcnJvckNvZGUoZXJyKTsKKyAgICB9CisgICAgcmV0dXJuIERFQURfT0JKRUNUOworfQorCitBTWVkaWFFeHRyYWN0b3IgKkFNZWRpYUV4dHJhY3RvcldyYXBwZXI6OmdldEFNZWRpYUV4dHJhY3RvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gbUFNZWRpYUV4dHJhY3RvcjsKK30KKworc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yV3JhcHBlcjo6c2V0RGF0YVNvdXJjZShpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCkgeworICAgIGlmIChtQU1lZGlhRXh0cmFjdG9yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3JDb2RlKEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlRmQoCisgICAgICAgICAgICBtQU1lZGlhRXh0cmFjdG9yLCBmZCwgb2Zmc2V0LCBsZW5ndGgpKTsKK30KKworc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yV3JhcHBlcjo6c2V0RGF0YVNvdXJjZShjb25zdCBjaGFyICpsb2NhdGlvbikgeworICAgIGlmIChtQU1lZGlhRXh0cmFjdG9yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3JDb2RlKEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlKG1BTWVkaWFFeHRyYWN0b3IsIGxvY2F0aW9uKSk7Cit9CisKK3N0YXR1c190IEFNZWRpYUV4dHJhY3RvcldyYXBwZXI6OnNldERhdGFTb3VyY2UoQU1lZGlhRGF0YVNvdXJjZSAqc291cmNlKSB7CisgICAgaWYgKG1BTWVkaWFFeHRyYWN0b3IgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIHJldHVybiB0cmFuc2xhdGVFcnJvckNvZGUoQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2VDdXN0b20obUFNZWRpYUV4dHJhY3Rvciwgc291cmNlKSk7Cit9CisKK3NpemVfdCBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyOjpnZXRUcmFja0NvdW50KCkgeworICAgIGlmIChtQU1lZGlhRXh0cmFjdG9yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBBTWVkaWFFeHRyYWN0b3JfZ2V0VHJhY2tDb3VudChtQU1lZGlhRXh0cmFjdG9yKTsKK30KKworc3A8QU1lZGlhRm9ybWF0V3JhcHBlcj4gQU1lZGlhRXh0cmFjdG9yV3JhcHBlcjo6Z2V0Rm9ybWF0KCkgeworICAgIGlmIChtQU1lZGlhRXh0cmFjdG9yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBuZXcgQU1lZGlhRm9ybWF0V3JhcHBlcihBTWVkaWFFeHRyYWN0b3JfZ2V0RmlsZUZvcm1hdChtQU1lZGlhRXh0cmFjdG9yKSk7Cit9CisKK3NwPEFNZWRpYUZvcm1hdFdyYXBwZXI+IEFNZWRpYUV4dHJhY3RvcldyYXBwZXI6OmdldFRyYWNrRm9ybWF0KHNpemVfdCBpZHgpIHsKKyAgICBpZiAobUFNZWRpYUV4dHJhY3RvciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gbmV3IEFNZWRpYUZvcm1hdFdyYXBwZXIoQU1lZGlhRXh0cmFjdG9yX2dldFRyYWNrRm9ybWF0KG1BTWVkaWFFeHRyYWN0b3IsIGlkeCkpOworfQorCitzdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyOjpzZWxlY3RUcmFjayhzaXplX3QgaWR4KSB7CisgICAgaWYgKG1BTWVkaWFFeHRyYWN0b3IgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIHJldHVybiB0cmFuc2xhdGVFcnJvckNvZGUoQU1lZGlhRXh0cmFjdG9yX3NlbGVjdFRyYWNrKG1BTWVkaWFFeHRyYWN0b3IsIGlkeCkpOworfQorCitzdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyOjp1bnNlbGVjdFRyYWNrKHNpemVfdCBpZHgpIHsKKyAgICBpZiAobUFNZWRpYUV4dHJhY3RvciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgcmV0dXJuIHRyYW5zbGF0ZUVycm9yQ29kZShBTWVkaWFFeHRyYWN0b3JfdW5zZWxlY3RUcmFjayhtQU1lZGlhRXh0cmFjdG9yLCBpZHgpKTsKK30KKworc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yV3JhcHBlcjo6c2VsZWN0U2luZ2xlVHJhY2soc2l6ZV90IGlkeCkgeworICAgIGlmIChtQU1lZGlhRXh0cmFjdG9yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFNZWRpYUV4dHJhY3Rvcl9nZXRUcmFja0NvdW50KG1BTWVkaWFFeHRyYWN0b3IpOyArK2kpIHsKKyAgICAgICAgaWYgKGkgPT0gaWR4KSB7CisgICAgICAgICAgICBtZWRpYV9zdGF0dXNfdCBlcnIgPSBBTWVkaWFFeHRyYWN0b3Jfc2VsZWN0VHJhY2sobUFNZWRpYUV4dHJhY3RvciwgaSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc2xhdGVFcnJvckNvZGUoZXJyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lZGlhX3N0YXR1c190IGVyciA9IEFNZWRpYUV4dHJhY3Rvcl91bnNlbGVjdFRyYWNrKG1BTWVkaWFFeHRyYWN0b3IsIGkpOworICAgICAgICAgICAgaWYgKGVyciAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3JDb2RlKGVycik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzc2l6ZV90IEFNZWRpYUV4dHJhY3RvcldyYXBwZXI6OnJlYWRTYW1wbGVEYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKKyAgICBpZiAobUFNZWRpYUV4dHJhY3RvciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIEFNZWRpYUV4dHJhY3Rvcl9yZWFkU2FtcGxlRGF0YShtQU1lZGlhRXh0cmFjdG9yLCBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5jYXBhY2l0eSgpKTsKK30KKworc3NpemVfdCBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyOjpnZXRTYW1wbGVTaXplKCkgeworICAgIGlmIChtQU1lZGlhRXh0cmFjdG9yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlU2l6ZShtQU1lZGlhRXh0cmFjdG9yKTsKK30KKwordWludDMyX3QgQU1lZGlhRXh0cmFjdG9yV3JhcHBlcjo6Z2V0U2FtcGxlRmxhZ3MoKSB7CisgICAgaWYgKG1BTWVkaWFFeHRyYWN0b3IgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVGbGFncyhtQU1lZGlhRXh0cmFjdG9yKTsKK30KKworaW50IEFNZWRpYUV4dHJhY3RvcldyYXBwZXI6OmdldFNhbXBsZVRyYWNrSW5kZXgoKSB7CisgICAgaWYgKG1BTWVkaWFFeHRyYWN0b3IgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlVHJhY2tJbmRleChtQU1lZGlhRXh0cmFjdG9yKTsKK30KKworaW50NjRfdCBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyOjpnZXRTYW1wbGVUaW1lKCkgeworICAgIGlmIChtQU1lZGlhRXh0cmFjdG9yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVRpbWUobUFNZWRpYUV4dHJhY3Rvcik7Cit9CisKK3N0YXR1c190IEFNZWRpYUV4dHJhY3RvcldyYXBwZXI6OmdldFNhbXBsZUZvcm1hdChzcDxBTWVkaWFGb3JtYXRXcmFwcGVyPiAmZm9ybWF0V3JhcHBlcikgeworICAgIGlmIChtQU1lZGlhRXh0cmFjdG9yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBBTWVkaWFGb3JtYXQgKmZvcm1hdCA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBmb3JtYXRXcmFwcGVyID0gbmV3IEFNZWRpYUZvcm1hdFdyYXBwZXIoZm9ybWF0KTsKKyAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3JDb2RlKEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVGb3JtYXQobUFNZWRpYUV4dHJhY3RvciwgZm9ybWF0KSk7Cit9CisKK2ludDY0X3QgQU1lZGlhRXh0cmFjdG9yV3JhcHBlcjo6Z2V0Q2FjaGVkRHVyYXRpb24oKSB7CisgICAgaWYgKG1BTWVkaWFFeHRyYWN0b3IgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBBTWVkaWFFeHRyYWN0b3JfZ2V0Q2FjaGVkRHVyYXRpb24obUFNZWRpYUV4dHJhY3Rvcik7Cit9CisKK2Jvb2wgQU1lZGlhRXh0cmFjdG9yV3JhcHBlcjo6YWR2YW5jZSgpIHsKKyAgICBpZiAobUFNZWRpYUV4dHJhY3RvciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIEFNZWRpYUV4dHJhY3Rvcl9hZHZhbmNlKG1BTWVkaWFFeHRyYWN0b3IpOworfQorCitzdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyOjpzZWVrVG8oaW50NjRfdCBzZWVrUG9zVXMsIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZSkgeworICAgIGlmIChtQU1lZGlhRXh0cmFjdG9yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKworICAgIFNlZWtNb2RlIGFNb2RlOworICAgIHN3aXRjaCAobW9kZSkgeworICAgICAgICBjYXNlIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DOiB7CisgICAgICAgICAgICBhTW9kZSA9IEFNRURJQUVYVFJBQ1RPUl9TRUVLX1BSRVZJT1VTX1NZTkM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19ORVhUX1NZTkM6IHsKKyAgICAgICAgICAgIGFNb2RlID0gQU1FRElBRVhUUkFDVE9SX1NFRUtfTkVYVF9TWU5DOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgYU1vZGUgPSBBTUVESUFFWFRSQUNUT1JfU0VFS19DTE9TRVNUX1NZTkM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQU1lZGlhRXh0cmFjdG9yX3NlZWtUbyhtQU1lZGlhRXh0cmFjdG9yLCBzZWVrUG9zVXMsIGFNb2RlKTsKK30KKworUHNzaEluZm8qIEFNZWRpYUV4dHJhY3RvcldyYXBwZXI6OmdldFBzc2hJbmZvKCkgeworICAgIGlmIChtQU1lZGlhRXh0cmFjdG9yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBBTWVkaWFFeHRyYWN0b3JfZ2V0UHNzaEluZm8obUFNZWRpYUV4dHJhY3Rvcik7Cit9CisKK3NwPEFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXI+IEFNZWRpYUV4dHJhY3RvcldyYXBwZXI6OmdldFNhbXBsZUNyeXB0b0luZm8oKSB7CisgICAgaWYgKG1BTWVkaWFFeHRyYWN0b3IgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyKEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVDcnlwdG9JbmZvKG1BTWVkaWFFeHRyYWN0b3IpKTsKK30KKworc3NpemVfdCBBTWVkaWFEYXRhU291cmNlV3JhcHBlcjo6QU1lZGlhRGF0YVNvdXJjZVdyYXBwZXJfZ2V0U2l6ZSh2b2lkICp1c2VyZGF0YSkgeworICAgIERhdGFTb3VyY2UgKnNvdXJjZSA9IHN0YXRpY19jYXN0PERhdGFTb3VyY2UgKj4odXNlcmRhdGEpOworICAgIG9mZjY0X3Qgc2l6ZSA9IC0xOworICAgIHNvdXJjZS0+Z2V0U2l6ZSgmc2l6ZSk7CisgICAgcmV0dXJuIHNpemU7Cit9CisKK3NzaXplX3QgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXI6OkFNZWRpYURhdGFTb3VyY2VXcmFwcGVyX3JlYWRBdCh2b2lkICp1c2VyZGF0YSwgb2ZmNjRfdCBvZmZzZXQsIHZvaWQgKiBidWYsIHNpemVfdCBzaXplKSB7CisgICAgRGF0YVNvdXJjZSAqc291cmNlID0gc3RhdGljX2Nhc3Q8RGF0YVNvdXJjZSAqPih1c2VyZGF0YSk7CisgICAgcmV0dXJuIHNvdXJjZS0+cmVhZEF0KG9mZnNldCwgYnVmLCBzaXplKTsKK30KKwordm9pZCBBTWVkaWFEYXRhU291cmNlV3JhcHBlcjo6QU1lZGlhRGF0YVNvdXJjZVdyYXBwZXJfY2xvc2Uodm9pZCAqdXNlcmRhdGEpIHsKKyAgICBEYXRhU291cmNlICpzb3VyY2UgPSBzdGF0aWNfY2FzdDxEYXRhU291cmNlICo+KHVzZXJkYXRhKTsKKyAgICBzb3VyY2UtPmNsb3NlKCk7Cit9CisKK0FNZWRpYURhdGFTb3VyY2VXcmFwcGVyOjpBTWVkaWFEYXRhU291cmNlV3JhcHBlcihjb25zdCBzcDxEYXRhU291cmNlPiAmZGF0YVNvdXJjZSkKKyAgICA6IG1EYXRhU291cmNlKGRhdGFTb3VyY2UpLAorICAgICAgbUFNZWRpYURhdGFTb3VyY2UoQU1lZGlhRGF0YVNvdXJjZV9uZXcoKSkgeworICAgIEFMT0dWKCJzZXREYXRhU291cmNlIChzb3VyY2U6ICVwKSIsIGRhdGFTb3VyY2UuZ2V0KCkpOworICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0VXNlcmRhdGEobUFNZWRpYURhdGFTb3VyY2UsIGRhdGFTb3VyY2UuZ2V0KCkpOworICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0UmVhZEF0KG1BTWVkaWFEYXRhU291cmNlLCBBTWVkaWFEYXRhU291cmNlV3JhcHBlcl9yZWFkQXQpOworICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0R2V0U2l6ZShtQU1lZGlhRGF0YVNvdXJjZSwgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXJfZ2V0U2l6ZSk7CisgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRDbG9zZShtQU1lZGlhRGF0YVNvdXJjZSwgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXJfY2xvc2UpOworfQorCitBTWVkaWFEYXRhU291cmNlV3JhcHBlcjo6fkFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKCkgeworICAgIGlmIChtQU1lZGlhRGF0YVNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQU1lZGlhRGF0YVNvdXJjZV9kZWxldGUobUFNZWRpYURhdGFTb3VyY2UpOworICAgIG1BTWVkaWFEYXRhU291cmNlID0gTlVMTDsKK30KKworQU1lZGlhRGF0YVNvdXJjZSogQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXI6OmdldEFNZWRpYURhdGFTb3VyY2UoKSB7CisgICAgcmV0dXJuIG1BTWVkaWFEYXRhU291cmNlOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvVGltZUNoZWNrLmNwcCBiL21lZGlhL2xpYm1lZGlhL1RpbWVDaGVjay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFiNWQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL1RpbWVDaGVjay5jcHAKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI2luY2x1ZGUgPG1lZGlhL1RpbWVDaGVjay5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qIHN0YXRpYyAqLworc3A8VGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ+IFRpbWVDaGVjazo6Z2V0VGltZUNoZWNrVGhyZWFkKCkKK3sKKyAgICBzdGF0aWMgc3A8VGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ+IHNUaW1lQ2hlY2tUaHJlYWQgPSBuZXcgVGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQoKTsKKyAgICByZXR1cm4gc1RpbWVDaGVja1RocmVhZDsKK30KKworVGltZUNoZWNrOjpUaW1lQ2hlY2soY29uc3QgY2hhciAqdGFnLCB1aW50MzJfdCB0aW1lb3V0TXMpCisgICAgOiBtRW5kVGltZU5zKGdldFRpbWVDaGVja1RocmVhZCgpLT5zdGFydE1vbml0b3JpbmcodGFnLCB0aW1lb3V0TXMpKQoreworfQorCitUaW1lQ2hlY2s6On5UaW1lQ2hlY2soKSB7CisgICAgZ2V0VGltZUNoZWNrVGhyZWFkKCktPnN0b3BNb25pdG9yaW5nKG1FbmRUaW1lTnMpOworfQorCitUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZDo6flRpbWVDaGVja1RocmVhZCgpCit7CisgICAgQXV0b011dGV4IF9sKG1NdXRleCk7CisgICAgcmVxdWVzdEV4aXQoKTsKKyAgICBtTW9uaXRvclJlcXVlc3RzLmNsZWFyKCk7CisgICAgbUNvbmQuc2lnbmFsKCk7Cit9CisKK25zZWNzX3QgVGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ6OnN0YXJ0TW9uaXRvcmluZyhjb25zdCBjaGFyICp0YWcsIHVpbnQzMl90IHRpbWVvdXRNcykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTXV0ZXgpOworICAgIG5zZWNzX3QgZW5kVGltZU5zID0gc3lzdGVtVGltZSgpICsgbWlsbGlzZWNvbmRzKHRpbWVvdXRNcyk7CisgICAgZm9yICg7IG1Nb25pdG9yUmVxdWVzdHMuaW5kZXhPZktleShlbmRUaW1lTnMpID49IDA7ICsrZW5kVGltZU5zKTsKKyAgICBtTW9uaXRvclJlcXVlc3RzLmFkZChlbmRUaW1lTnMsIHRhZyk7CisgICAgbUNvbmQuc2lnbmFsKCk7CisgICAgcmV0dXJuIGVuZFRpbWVOczsKK30KKwordm9pZCBUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZDo6c3RvcE1vbml0b3JpbmcobnNlY3NfdCBlbmRUaW1lTnMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobU11dGV4KTsKKyAgICBtTW9uaXRvclJlcXVlc3RzLnJlbW92ZUl0ZW0oZW5kVGltZU5zKTsKKyAgICBtQ29uZC5zaWduYWwoKTsKK30KKworYm9vbCBUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZDo6dGhyZWFkTG9vcCgpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gVElNRURfT1VUOworICAgIGNvbnN0IGNoYXIgKnRhZzsKKyAgICB7CisgICAgICAgIEF1dG9NdXRleCBfbChtTXV0ZXgpOworCisgICAgICAgIGlmIChleGl0UGVuZGluZygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBuc2Vjc190IGVuZFRpbWVOcyA9IElOVDY0X01BWDsKKyAgICAgICAgLy8gS2V5ZWRWZWN0b3IgbU1vbml0b3JSZXF1ZXN0cyBpcyBvcmRlcmVkIHNvIHRha2UgZmlyc3QgZW50cnkgYXMgbmV4dCB0aW1lb3V0CisgICAgICAgIGlmIChtTW9uaXRvclJlcXVlc3RzLnNpemUoKSAhPSAwKSB7CisgICAgICAgICAgICBlbmRUaW1lTnMgPSBtTW9uaXRvclJlcXVlc3RzLmtleUF0KDApOworICAgICAgICAgICAgdGFnID0gbU1vbml0b3JSZXF1ZXN0cy52YWx1ZUF0KDApOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgbnNlY3NfdCB3YWl0VGltZU5zID0gZW5kVGltZU5zIC0gc3lzdGVtVGltZSgpOworICAgICAgICBpZiAod2FpdFRpbWVOcyA+IDApIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1Db25kLndhaXRSZWxhdGl2ZShtTXV0ZXgsIHdhaXRUaW1lTnMpOworICAgICAgICB9CisgICAgfQorICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RhdHVzICE9IE5PX0VSUk9SLCAiVGltZUNoZWNrIHRpbWVvdXQgZm9yICVzIiwgdGFnKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL1R5cGVDb252ZXJ0ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvVHlwZUNvbnZlcnRlci5jcHAKaW5kZXggZTZjOGY5Yy4uYTNkYjc1NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvVHlwZUNvbnZlcnRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvVHlwZUNvbnZlcnRlci5jcHAKQEAgLTU1LDYgKzU1LDggQEAKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9CVVMpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX1BST1hZKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9VU0JfSEVBRFNFVCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX0VDSE9fQ0FOQ0VMTEVSKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9ERUZBVUxUKSwKICAgICAvLyBTVFVCIG11c3QgYmUgYWZ0ZXIgREVGQVVMVCwgc28gdGhlIGxhdHRlciBpcyBwaWNrZWQgdXAgYnkgdG9TdHJpbmcgZmlyc3QuCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfU1RVQiksCkBAIC0xMTUsNiArMTE3LDcgQEAKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUX1BDTSksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX09VVFBVVF9GTEFHX01NQVBfTk9JUlEpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19PVVRQVVRfRkxBR19WT0lQX1JYKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfSU5DQUxMX01VU0lDKSwKICAgICBURVJNSU5BVE9SCiB9OwogCkBAIC0xMjgsNiArMTMxLDcgQEAKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fSU5QVVRfRkxBR19TWU5DKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fSU5QVVRfRkxBR19NTUFQX05PSVJRKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fSU5QVVRfRkxBR19WT0lQX1RYKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fSU5QVVRfRkxBR19IV19BVl9TWU5DKSwKICAgICBURVJNSU5BVE9SCiB9OwogCkBAIC0xNTQsNiArMTU4LDcgQEAKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19MRCksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfSEVfVjIpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0VMRCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfWEhFKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19BRFRTX01BSU4pLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0FEVFNfTEMpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0FEVFNfU1NSKSwKQEAgLTE2NCw2ICsxNjksNyBAQAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0FEVFNfTEQpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0FEVFNfSEVfVjIpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0FEVFNfRUxEKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19BRFRTX1hIRSksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9WT1JCSVMpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfSEVfQUFDX1YxKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0hFX0FBQ19WMiksCkBAIC0xOTQsNiArMjAwLDExIEBACiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BUFRYX0hEKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FDNCksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9MREFDKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX01BVCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9FX0FDM19KT0MpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfTUFUXzFfMCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9NQVRfMl8wKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX01BVF8yXzEpLAogICAgIFRFUk1JTkFUT1IKIH07CiAKQEAgLTIwMywxMiArMjE0LDI0IEBACiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUX01PTk8pLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMFBPSU5UMiksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDFQT0lOVDIpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF8zUE9JTlQwUE9JTlQyKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfM1BPSU5UMVBPSU5UMiksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUX1FVQUQpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF9RVUFEX0JBQ0spLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF9RVUFEX1NJREUpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF9TVVJST1VORCksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUX1BFTlRBKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfQkFDSyksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfU0lERSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFQT0lOVDIpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF81UE9JTlQxUE9JTlQ0KSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfNlBPSU5UMSksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF83UE9JTlQxUE9JTlQyKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMVBPSU5UNCksCiAgICAgVEVSTUlOQVRPUgogfTsKIApAQCAtMjE5LDYgKzI0MiwxMSBAQAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX0lOX1NURVJFTyksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfSU5fRlJPTlRfQkFDSyksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfSU5fNiksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfSU5fMlBPSU5UMFBPSU5UMiksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfSU5fMlBPSU5UMVBPSU5UMiksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfSU5fM1BPSU5UMFBPSU5UMiksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfSU5fM1BPSU5UMVBPSU5UMiksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfSU5fNVBPSU5UMSksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfVVBMSU5LX01PTk8pLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX0lOX1ZPSUNFX0ROTElOS19NT05PKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9DQUxMX01PTk8pLApAQCAtMjc3LDYgKzMwNSwxNiBAQAogICAgIFRFUk1JTkFUT1IKIH07CiAKK3RlbXBsYXRlPD4KK2NvbnN0IEF1ZGlvQ29udGVudFR5cGVDb252ZXJ0ZXI6OlRhYmxlIEF1ZGlvQ29udGVudFR5cGVDb252ZXJ0ZXI6Om1UYWJsZVtdID0geworICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0gpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DT05URU5UX1RZUEVfTVVTSUMpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DT05URU5UX1RZUEVfTU9WSUUpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OKSwKKyAgICBURVJNSU5BVE9SCit9OworCiB0ZW1wbGF0ZSA8PgogY29uc3QgVXNhZ2VUeXBlQ29udmVydGVyOjpUYWJsZSBVc2FnZVR5cGVDb252ZXJ0ZXI6Om1UYWJsZVtdID0gewogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19VU0FHRV9VTktOT1dOKSwKQEAgLTI5NSw4ICszMzMsNyBAQAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTiksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1VTQUdFX0dBTUUpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19VU0FHRV9WSVJUVUFMX1NPVVJDRSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1VTQUdFX0NOVCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1VTQUdFX01BWCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1VTQUdFX0FTU0lTVEFOVCksCiAgICAgVEVSTUlOQVRPUgogfTsKIApAQCAtMzEyLDggKzM0OSw2IEBACiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU09VUkNFX1JFTU9URV9TVUJNSVgpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TT1VSQ0VfVU5QUk9DRVNTRUQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TT1VSQ0VfQ05UKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU09VUkNFX01BWCksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NPVVJDRV9GTV9UVU5FUiksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NPVVJDRV9IT1RXT1JEKSwKICAgICBURVJNSU5BVE9SCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9haWRsL2FuZHJvaWQvbWVkaWEvSU1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5haWRsIGIvbWVkaWEvbGlibWVkaWEvYWlkbC9hbmRyb2lkL21lZGlhL0lNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2IxYmM5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvYWlkbC9hbmRyb2lkL21lZGlhL0lNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuYWlkbApAQCAtMCwwICsxLDI1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKKy8qKgorICogU2VydmljZSB0byByZWxvYWQgZXh0cmFjdG9yIHBsdWdpbnMgd2hlbiB1cGRhdGUgcGFja2FnZSBpcyBpbnN0YWxsZWQvdW5pbnN0YWxsZWQuCisgKiBAaGlkZQorICovCitpbnRlcmZhY2UgSU1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZSB7CisgICAgdm9pZCBsb2FkUGx1Z2lucyhAdXRmOEluQ3BwIFN0cmluZyBhcGtQYXRoKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2V4cG9ydHMubGRzIGIvbWVkaWEvbGlibWVkaWEvZXhwb3J0cy5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA5ZmJjZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL2V4cG9ydHMubGRzCkBAIC0wLDAgKzEsNyBAQAoreworICAgIGdsb2JhbDoKKyAgICAgICAgKjsKKyAgICBsb2NhbDoKKyAgICAgICAgX1pON2FuZHJvaWQxM01pZGlJb1dyYXBwZXIqOworICAgICAgICBfWlRWTjdhbmRyb2lkMTNNaWRpSW9XcmFwcGVyRTsKK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0J1ZmZlclByb3ZpZGVycy5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9CdWZmZXJQcm92aWRlcnMuaAppbmRleCA5ZDAyNmY2Li5kNmE5Y2ZiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0J1ZmZlclByb3ZpZGVycy5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQnVmZmVyUHJvdmlkZXJzLmgKQEAgLTE2MSw2ICsxNjEsMTcgQEAKICAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBtT3V0cHV0Rm9ybWF0OwogfTsKIAorLy8gQ2xhbXBGbG9hdEJ1ZmZlclByb3ZpZGVyIGRlcml2ZXMgZnJvbSBDb3B5QnVmZmVyUHJvdmlkZXIgdG8gY2xhbXAgZmxvYXRzIGluc2lkZSAtM2RiCitjbGFzcyBDbGFtcEZsb2F0QnVmZmVyUHJvdmlkZXIgOiBwdWJsaWMgQ29weUJ1ZmZlclByb3ZpZGVyIHsKK3B1YmxpYzoKKyAgICBDbGFtcEZsb2F0QnVmZmVyUHJvdmlkZXIoaW50MzJfdCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICBzaXplX3QgYnVmZmVyRnJhbWVDb3VudCk7CisgICAgdmlydHVhbCB2b2lkIGNvcHlGcmFtZXModm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBmcmFtZXMpOworCitwcm90ZWN0ZWQ6CisgICAgY29uc3QgdWludDMyX3QgICAgICAgbUNoYW5uZWxDb3VudDsKK307CisKIC8vIFRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIgZGVyaXZlcyBmcm9tIFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXIgZm9yIHRpbWUgc3RyZXRjaGluZwogY2xhc3MgVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlciA6IHB1YmxpYyBQYXNzdGhydUJ1ZmZlclByb3ZpZGVyIHsKIHB1YmxpYzoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQnVmZmVyaW5nU2V0dGluZ3MuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQnVmZmVyaW5nU2V0dGluZ3MuaAppbmRleCBlODEyZDJhLi5kMmEzZTQwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0J1ZmZlcmluZ1NldHRpbmdzLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9CdWZmZXJpbmdTZXR0aW5ncy5oCkBAIC0yMSw0NSArMjEsMTQgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1lbnVtIEJ1ZmZlcmluZ01vZGUgOiBpbnQgewotICAgIC8vIERvIG5vdCBzdXBwb3J0IGJ1ZmZlcmluZy4KLSAgICBCVUZGRVJJTkdfTU9ERV9OT05FICAgICAgICAgICAgID0gMCwKLSAgICAvLyBTdXBwb3J0IG9ubHkgdGltZSBiYXNlZCBidWZmZXJpbmcuCi0gICAgQlVGRkVSSU5HX01PREVfVElNRV9PTkxZICAgICAgICA9IDEsCi0gICAgLy8gU3VwcG9ydCBvbmx5IHNpemUgYmFzZWQgYnVmZmVyaW5nLgotICAgIEJVRkZFUklOR19NT0RFX1NJWkVfT05MWSAgICAgICAgPSAyLAotICAgIC8vIFN1cHBvcnQgYm90aCB0aW1lIGFuZCBzaXplIGJhc2VkIGJ1ZmZlcmluZywgdGltZSBiYXNlZCBjYWxjdWxhdGlvbiBwcmVjZWRlcyBzaXplIGJhc2VkLgotICAgIC8vIFNpemUgYmFzZWQgY2FsY3VsYXRpb24gd2lsbCBiZSB1c2VkIG9ubHkgd2hlbiB0aW1lIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUgZm9yCi0gICAgLy8gdGhlIHN0cmVhbS4KLSAgICBCVUZGRVJJTkdfTU9ERV9USU1FX1RIRU5fU0laRSAgID0gMywKLSAgICAvLyBOdW1iZXIgb2YgbW9kZXMuCi0gICAgQlVGRkVSSU5HX01PREVfQ09VTlQgICAgICAgICAgICA9IDQsCi19OwotCiBzdHJ1Y3QgQnVmZmVyaW5nU2V0dGluZ3MgOiBwdWJsaWMgUGFyY2VsYWJsZSB7Ci0gICAgc3RhdGljIGNvbnN0IGludCBrTm9XYXRlcm1hcmsgPSAtMTsKKyAgICBzdGF0aWMgY29uc3QgaW50IGtOb01hcmsgPSAtMTsKIAotICAgIHN0YXRpYyBib29sIElzVmFsaWRCdWZmZXJpbmdNb2RlKGludCBtb2RlKTsKLSAgICBzdGF0aWMgYm9vbCBJc1RpbWVCYXNlZEJ1ZmZlcmluZ01vZGUoaW50IG1vZGUpOwotICAgIHN0YXRpYyBib29sIElzU2l6ZUJhc2VkQnVmZmVyaW5nTW9kZShpbnQgbW9kZSk7CisgICAgaW50IG1Jbml0aWFsTWFya01zOwogCi0gICAgQnVmZmVyaW5nTW9kZSBtSW5pdGlhbEJ1ZmZlcmluZ01vZGU7ICAvLyBmb3IgcHJlcGFyZQotICAgIEJ1ZmZlcmluZ01vZGUgbVJlYnVmZmVyaW5nTW9kZTsgIC8vIGZvciBwbGF5YmFjawotCi0gICAgaW50IG1Jbml0aWFsV2F0ZXJtYXJrTXM7ICAvLyB0aW1lIGJhc2VkCi0gICAgaW50IG1Jbml0aWFsV2F0ZXJtYXJrS0I7ICAvLyBzaXplIGJhc2VkCi0KLSAgICAvLyBXaGVuIGNhY2hlZCBkYXRhIGlzIGJlbG93IHRoaXMgbWFyaywgcGxheWJhY2sgd2lsbCBiZSBwYXVzZWQgZm9yIGJ1ZmZlcmluZwotICAgIC8vIHRpbGwgZGF0YSByZWFjaCB8bVJlYnVmZmVyaW5nV2F0ZXJtYXJrSGlnaE1zfCBvciBlbmQgb2Ygc3RyZWFtLgotICAgIGludCBtUmVidWZmZXJpbmdXYXRlcm1hcmtMb3dNczsKLSAgICAvLyBXaGVuIGNhY2hlZCBkYXRhIGlzIGFib3ZlIHRoaXMgbWFyaywgYnVmZmVyaW5nIHdpbGwgYmUgcGF1c2VkLgotICAgIGludCBtUmVidWZmZXJpbmdXYXRlcm1hcmtIaWdoTXM7Ci0KLSAgICAvLyBXaGVuIGNhY2hlZCBkYXRhIGlzIGJlbG93IHRoaXMgbWFyaywgcGxheWJhY2sgd2lsbCBiZSBwYXVzZWQgZm9yIGJ1ZmZlcmluZwotICAgIC8vIHRpbGwgZGF0YSByZWFjaCB8bVJlYnVmZmVyaW5nV2F0ZXJtYXJrSGlnaEtCfCBvciBlbmQgb2Ygc3RyZWFtLgotICAgIGludCBtUmVidWZmZXJpbmdXYXRlcm1hcmtMb3dLQjsKLSAgICAvLyBXaGVuIGNhY2hlZCBkYXRhIGlzIGFib3ZlIHRoaXMgbWFyaywgYnVmZmVyaW5nIHdpbGwgYmUgcGF1c2VkLgotICAgIGludCBtUmVidWZmZXJpbmdXYXRlcm1hcmtIaWdoS0I7CisgICAgLy8gV2hlbiBjYWNoZWQgZGF0YSBpcyBhYm92ZSB0aGlzIG1hcmssIHBsYXliYWNrIHdpbGwgYmUgcmVzdW1lZCBpZiBpdCBoYXMgYmVlbiBwYXVzZWQKKyAgICAvLyBkdWUgdG8gbG93IGNhY2hlZCBkYXRhLgorICAgIGludCBtUmVzdW1lUGxheWJhY2tNYXJrTXM7CiAKICAgICBCdWZmZXJpbmdTZXR0aW5ncygpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0NvZGVjU2VydmljZVJlZ2lzdHJhbnQuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQ29kZWNTZXJ2aWNlUmVnaXN0cmFudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYWY3ODEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0NvZGVjU2VydmljZVJlZ2lzdHJhbnQuaApAQCAtMCwwICsxLDIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQ19TRVJWSUNFX1JFR0lTVFJBTlRfSF8KKworI2RlZmluZSBDT0RFQ19TRVJWSUNFX1JFR0lTVFJBTlRfSF8KKwordHlwZWRlZiB2b2lkICgqUmVnaXN0ZXJDb2RlY1NlcnZpY2VzRnVuYykoKTsKKworI2VuZGlmICAvLyBDT0RFQ19TRVJWSUNFX1JFR0lTVFJBTlRfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQ291bnRlck1ldHJpYy5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9Db3VudGVyTWV0cmljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUzNDcwZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQ291bnRlck1ldHJpYy5oCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBBTkRST0lEX0NPVU5URVJfTUVUUklDX0hfCisjZGVmaW5lIEFORFJPSURfQ09VTlRFUl9NRVRSSUNfSF8KKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKworLy8gVGhlIENvdW50ZXJNZXRyaWMgY2xhc3MgaXMgdXNlZCB0byBob2xkIGNvdW50cyBvZiBvcGVyYXRpb25zIG9yIGV2ZW50cy4KKy8vIEEgQ291bnRlck1ldHJpYyBjYW4gYnJlYWsgZG93biBjb3VudHMgYnkgYSBkaW1lbnNpb24gc3BlY2lmaWVkIGJ5IHRoZQorLy8gYXBwbGljYXRpb24uIEUuZy4gYW4gYXBwbGljYXRpb24gbWF5IHdhbnQgdG8gdHJhY2sgY291bnRzIGJyb2tlbiBvdXQgYnkKKy8vIGVycm9yIGNvZGUgb3IgdGhlIHNpemUgb2Ygc29tZSBwYXJhbWV0ZXIuCisvLworLy8gRXhhbXBsZToKKy8vCisvLyAgIENvdW50ZXJNZXRyaWM8c3RhdHVzX3Q+IHdvcmtDb3VudGVyOworLy8gICB3b3JrQ291bnRlcigid29ya0NvdW50ZXJOYW1lIiwgInJlc3VsdF9zdGF0dXMiKTsKKy8vCisvLyAgIHN0YXR1c190IGVyciA9IERvV29yaygpOworLy8KKy8vICAgLy8gSW5jcmVtZW50cyB0aGUgbnVtYmVyIG9mIHRpbWVzIGNhbGxlZCB3aXRoIHRoZSBnaXZlbiBlcnJvciBjb2RlLgorLy8gICB3b3JrQ291bnRlci5JbmNyZW1lbnQoZXJyKTsKKy8vCisvLyAgIHN0ZDo6bWFwPGludCwgaW50NjRfdD4gdmFsdWVzOworLy8gICAgbWV0cmljLkV4cG9ydFZhbHVlcygKKy8vICAgICAgICBbJl0gKGludCBhdHRyaWJ1dGVfdmFsdWUsIGludDY0X3QgdmFsdWUpIHsKKy8vICAgICAgICAgICAgIHZhbHVlc1thdHRyaWJ1dGVfdmFsdWVdID0gdmFsdWU7CisvLyAgICAgICAgfSk7CisvLworLy8gICAvLyBEbyBzb21ldGhpbmcgd2l0aCB0aGUgZXhwb3J0ZWQgc3RhdC4KKy8vCit0ZW1wbGF0ZTx0eXBlbmFtZSBBdHRyaWJ1dGVUeXBlPgorY2xhc3MgQ291bnRlck1ldHJpYyB7CisgcHVibGljOgorICAvLyBJbnN0YW50aWF0ZSB0aGUgY291bnRlciB3aXRoIHRoZSBnaXZlbiBtZXRyaWMgbmFtZSBhbmQKKyAgLy8gYXR0cmlidXRlIG5hbWVzLiB8YXR0cmlidXRlX25hbWVzfCBtdXN0IG5vdCBiZSBudWxsLgorICBDb3VudGVyTWV0cmljKAorICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1ldHJpY19uYW1lLAorICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGF0dHJpYnV0ZV9uYW1lKQorICAgICAgICAgIDogbWV0cmljX25hbWVfKG1ldHJpY19uYW1lKSwKKyAgICAgICAgICAgIGF0dHJpYnV0ZV9uYW1lXyhhdHRyaWJ1dGVfbmFtZSkge30KKworICAvLyBJbmNyZW1lbnQgdGhlIGNvdW50IG9mIHRpbWVzIHRoZSBvcGVyYXRpb24gb2NjdXJyZWQgd2l0aCB0aGlzCisgIC8vIGNvbWJpbmF0aW9uIG9mIGF0dHJpYnV0ZXMuCisgIHZvaWQgSW5jcmVtZW50KEF0dHJpYnV0ZVR5cGUgYXR0cmlidXRlKSB7CisgICAgaWYgKHZhbHVlc18uZmluZChhdHRyaWJ1dGUpID09IHZhbHVlc18uZW5kKCkpIHsKKyAgICAgIHZhbHVlc19bYXR0cmlidXRlXSA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgIHZhbHVlc19bYXR0cmlidXRlXSA9IHZhbHVlc19bYXR0cmlidXRlXSArIDE7CisgICAgfQorICB9OworCisgIC8vIEV4cG9ydCB0aGUgbWV0cmljcyB0byB0aGUgcHJvdmlkZWQgfGZ1bmN0aW9ufC4gRWFjaCB2YWx1ZSBmb3IgQXR0cmlidXRlCisgIC8vIGhhcyBhIHNlcGFyYXRlIGNvdW50LiBBcyBzdWNoLCB8ZnVuY3Rpb258IHdpbGwgYmUgY2FsbGVkIG9uY2UgcGVyIHZhbHVlCisgIC8vIG9mIEF0dHJpYnV0ZS4KKyAgdm9pZCBFeHBvcnRWYWx1ZXMoCisgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQgKGNvbnN0IEF0dHJpYnV0ZVR5cGUmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGNvdW50KT4gZnVuY3Rpb24pIGNvbnN0IHsKKyAgICBmb3IgKGF1dG8gaXQgPSB2YWx1ZXNfLmJlZ2luKCk7IGl0ICE9IHZhbHVlc18uZW5kKCk7IGl0KyspIHsKKyAgICAgIGZ1bmN0aW9uKGl0LT5maXJzdCwgaXQtPnNlY29uZCk7CisgICAgfQorICB9CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIG1ldHJpY19uYW1lKCkgY29uc3QgeyByZXR1cm4gbWV0cmljX25hbWVfOyB9OworCisgcHJpdmF0ZToKKyAgY29uc3Qgc3RkOjpzdHJpbmcgbWV0cmljX25hbWVfOworICBjb25zdCBzdGQ6OnN0cmluZyBhdHRyaWJ1dGVfbmFtZV87CisgIHN0ZDo6bWFwPEF0dHJpYnV0ZVR5cGUsIGludDY0X3Q+IHZhbHVlc187Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQ09VTlRFUl9NRVRSSUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQ3J5cHRvSGFsLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0NyeXB0b0hhbC5oCmluZGV4IDgwZTE4MWUuLmZmODc4OWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQ3J5cHRvSGFsLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9DcnlwdG9IYWwuaApAQCAtMjAsMTQgKzIwLDE2IEBACiAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvSUNyeXB0b0ZhY3RvcnkuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvSUNyeXB0b1BsdWdpbi5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMS9JQ3J5cHRvRmFjdG9yeS5oPgogCi0jaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0lDcnlwdG8uaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KIAotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpJQ3J5cHRvRmFjdG9yeTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6SUNyeXB0b1BsdWdpbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U2hhcmVkQnVmZmVyOworbmFtZXNwYWNlIGRybSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTsKK3VzaW5nIGRybTo6VjFfMDo6SUNyeXB0b0ZhY3Rvcnk7Cit1c2luZyBkcm06OlYxXzA6OklDcnlwdG9QbHVnaW47Cit1c2luZyBkcm06OlYxXzA6OlNoYXJlZEJ1ZmZlcjsKIAogY2xhc3MgSU1lbW9yeUhlYXA7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZURlc2MuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZURlc2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTkwMjYxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlRGVzYy5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9EQVRBU09VUkNFREVTQ19ICisjZGVmaW5lIEFORFJPSURfREFUQVNPVVJDRURFU0NfSAorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBEYXRhU291cmNlOworc3RydWN0IE1lZGlhSFRUUFNlcnZpY2U7CisKKy8vIEEgYmluZGVyIGludGVyZmFjZSBmb3IgaW1wbGVtZW50aW5nIGEgc3RhZ2VmcmlnaHQgRGF0YVNvdXJjZSByZW1vdGVseS4KK3N0cnVjdCBEYXRhU291cmNlRGVzYyA6IHB1YmxpYyBSZWZCYXNlIHsKK3B1YmxpYzoKKyAgICBlbnVtIHsKKyAgICAgICAgLyogTm8gZGF0YSBzb3VyY2UgaGFzIGJlZW4gc2V0IHlldCAqLworICAgICAgICBUWVBFX05PTkUgICAgID0gMCwKKyAgICAgICAgLyogZGF0YSBzb3VyY2UgaXMgdHlwZSBvZiBNZWRpYURhdGFTb3VyY2UgKi8KKyAgICAgICAgVFlQRV9DQUxMQkFDSyA9IDEsCisgICAgICAgIC8qIGRhdGEgc291cmNlIGlzIHR5cGUgb2YgRmlsZURlc2NyaXB0b3IgKi8KKyAgICAgICAgVFlQRV9GRCAgICAgICA9IDIsCisgICAgICAgIC8qIGRhdGEgc291cmNlIGlzIHR5cGUgb2YgVXJsICovCisgICAgICAgIFRZUEVfVVJMICAgICAgPSAzLAorICAgIH07CisKKyAgICBEYXRhU291cmNlRGVzYygpOworCisgICAgaW50IG1UeXBlOworCisgICAgc3A8TWVkaWFIVFRQU2VydmljZT4gbUh0dHBTZXJ2aWNlOworICAgIFN0cmluZzggbVVybDsKKyAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtSGVhZGVyczsKKworICAgIGludCBtRkQ7CisgICAgaW50NjRfdCBtRkRPZmZzZXQ7CisgICAgaW50NjRfdCBtRkRMZW5ndGg7CisKKyAgICBzcDxEYXRhU291cmNlPiBtQ2FsbGJhY2tTb3VyY2U7CisKKyAgICBpbnQ2NF90IG1JZDsKKyAgICBpbnQ2NF90IG1TdGFydFBvc2l0aW9uTXM7CisgICAgaW50NjRfdCBtRW5kUG9zaXRpb25NczsKKworcHJpdmF0ZToKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEYXRhU291cmNlRGVzYyk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9EQVRBU09VUkNFREVTQ19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RybUhhbC5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9Ecm1IYWwuaAppbmRleCA1ZDI1ZTRkLi5mMjY3Zjc2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RybUhhbC5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRHJtSGFsLmgKQEAgLTE4LDE5ICsxOCwyNCBAQAogCiAjZGVmaW5lIERSTV9IQUxfSF8KIAorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC9JRHJtRmFjdG9yeS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC9JRHJtUGx1Z2luLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL0lEcm1QbHVnaW5MaXN0ZW5lci5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC9JRHJtRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMS9JRHJtRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMS9JRHJtUGx1Z2luLmg+CiAKLSNpbmNsdWRlIDxtZWRpYS9JRHJtLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSURybUNsaWVudC5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0RybU1ldHJpY3MuaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9JRHJtLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vSURybUNsaWVudC5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KIAotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpFdmVudFR5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OklEcm1GYWN0b3J5OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpJRHJtUGx1Z2luOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpJRHJtUGx1Z2luTGlzdGVuZXI7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OktleVN0YXR1czsKK25hbWVzcGFjZSBkcm0gPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm07Cit1c2luZyBkcm06OlYxXzA6OkV2ZW50VHlwZTsKK3VzaW5nIGRybTo6VjFfMDo6SURybUZhY3Rvcnk7Cit1c2luZyBkcm06OlYxXzA6OklEcm1QbHVnaW47Cit1c2luZyBkcm06OlYxXzA6OklEcm1QbHVnaW5MaXN0ZW5lcjsKK3VzaW5nIGRybTo6VjFfMDo6S2V5U3RhdHVzOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwpAQCAtNTksNyArNjQsOCBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBkZXN0cm95UGx1Z2luKCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5TZXNzaW9uKFZlY3Rvcjx1aW50OF90PiAmc2Vzc2lvbklkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5TZXNzaW9uKERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCwKKyAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmc2Vzc2lvbklkKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VTZXNzaW9uKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkKTsKIApAQCAtOTMsMTAgKzk5LDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZ3cmFwcGVkS2V5KTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcHMoTGlzdDxWZWN0b3I8dWludDhfdD4+ICZzZWN1cmVTdG9wcyk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cmVTdG9wSWRzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiAmc2VjdXJlU3RvcElkcyk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cmVTdG9wKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc3NpZCwgVmVjdG9yPHVpbnQ4X3Q+ICZzZWN1cmVTdG9wKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZVNlY3VyZVN0b3BzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc3NSZWxlYXNlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VBbGxTZWN1cmVTdG9wcygpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlU2VjdXJlU3RvcChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNzaWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlQWxsU2VjdXJlU3RvcHMoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SGRjcExldmVscyhEcm1QbHVnaW46OkhkY3BMZXZlbCAqY29ubmVjdGVkTGV2ZWwsCisgICAgICAgICAgICBEcm1QbHVnaW46OkhkY3BMZXZlbCAqbWF4TGV2ZWwpIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TnVtYmVyT2ZTZXNzaW9ucyh1aW50MzJfdCAqY3VycmVudFNlc3Npb25zLAorICAgICAgICAgICAgdWludDMyX3QgKm1heFNlc3Npb25zKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyaXR5TGV2ZWwoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCisgICAgICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgKmxldmVsKSBjb25zdDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvcGVydHlTdHJpbmcoU3RyaW5nOCBjb25zdCAmbmFtZSwgU3RyaW5nOCAmdmFsdWUgKSBjb25zdDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb3BlcnR5Qnl0ZUFycmF5KFN0cmluZzggY29uc3QgJm5hbWUsCkBAIC0xMDQsNiArMTE5LDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByb3BlcnR5U3RyaW5nKFN0cmluZzggY29uc3QgJm5hbWUsIFN0cmluZzggY29uc3QgJnZhbHVlICkgY29uc3Q7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcm9wZXJ0eUJ5dGVBcnJheShTdHJpbmc4IGNvbnN0ICZuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZ2YWx1ZSApIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0cmljcyhvczo6UGVyc2lzdGFibGVCdW5kbGUgKm1ldHJpY3MpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDaXBoZXJBbGdvcml0aG0oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBjb25zdCAmYWxnb3JpdGhtKTsKQEAgLTE2NSw5ICsxODEsMTUgQEAKIAogICAgIGNvbnN0IFZlY3RvcjxzcDxJRHJtRmFjdG9yeT4+IG1GYWN0b3JpZXM7CiAgICAgc3A8SURybVBsdWdpbj4gbVBsdWdpbjsKKyAgICBzcDxkcm06OlYxXzE6OklEcm1QbHVnaW4+IG1QbHVnaW5WMV8xOworICAgIFN0cmluZzggbUFwcFBhY2thZ2VOYW1lOworCisgICAgLy8gTXV0YWJsZSB0byBhbGxvdyBtb2RpZmljYXRpb24gd2l0aGluIEdldFByb3BlcnR5Qnl0ZUFycmF5LgorICAgIG11dGFibGUgTWVkaWFEcm1NZXRyaWNzIG1NZXRyaWNzOwogCiAgICAgVmVjdG9yPFZlY3Rvcjx1aW50OF90Pj4gbU9wZW5TZXNzaW9uczsKICAgICB2b2lkIGNsb3NlT3BlblNlc3Npb25zKCk7CisgICAgdm9pZCBjbGVhbnVwKCk7CiAKICAgICAvKioKICAgICAgKiBtSW5pdENoZWNrIGlzOgpAQCAtMTgzLDcgKzIwNSw4IEBACiAKICAgICB2b2lkIHdyaXRlQnl0ZUFycmF5KFBhcmNlbCAmb2JqLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgYXJyYXkpOwogCi0gICAgdm9pZCByZXBvcnRNZXRyaWNzKCkgY29uc3Q7CisgICAgdm9pZCByZXBvcnRQbHVnaW5NZXRyaWNzKCkgY29uc3Q7CisgICAgdm9pZCByZXBvcnRGcmFtZXdvcmtNZXRyaWNzKCkgY29uc3Q7CiAgICAgc3RhdHVzX3QgZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4IGNvbnN0ICZuYW1lLCBTdHJpbmc4ICZ2YWx1ZSkgY29uc3Q7CiAgICAgc3RhdHVzX3QgZ2V0UHJvcGVydHlCeXRlQXJyYXlJbnRlcm5hbChTdHJpbmc4IGNvbnN0ICZuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZ2YWx1ZSkgY29uc3Q7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RybU1ldHJpY3MuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRHJtTWV0cmljcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MTk5OGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RybU1ldHJpY3MuaApAQCAtMCwwICsxLDEzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgRFJNX01FVFJJQ1NfSF8KKyNkZWZpbmUgRFJNX01FVFJJQ1NfSF8KKworI2luY2x1ZGUgPG1hcD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMS90eXBlcy5oPgorI2luY2x1ZGUgPGJpbmRlci9QZXJzaXN0YWJsZUJ1bmRsZS5oPgorI2luY2x1ZGUgPG1lZGlhL0NvdW50ZXJNZXRyaWMuaD4KKyNpbmNsdWRlIDxtZWRpYS9FdmVudE1ldHJpYy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogVGhpcyBjbGFzcyBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiBtZXRyaWNzIGNhcHR1cmVkIHdpdGhpbiBNZWRpYURybS4KKyAqIEl0IGFsc28gY29udGFpbnMgYSBtZXRob2QgZm9yIGV4cG9ydGluZyBhbGwgb2YgdGhlIG1ldHJpY3MgdG8gYQorICogUGVyc2lzdGFibGVCdW5kbGUuCisgKi8KK2NsYXNzIE1lZGlhRHJtTWV0cmljcyB7CisgcHVibGljOgorICBleHBsaWNpdCBNZWRpYURybU1ldHJpY3MoKTsKKyAgdmlydHVhbCB+TWVkaWFEcm1NZXRyaWNzKCkge307CisgIC8vIENvdW50IG9mIG9wZW5TZXNzaW9uIGNhbGxzLgorICBDb3VudGVyTWV0cmljPHN0YXR1c190PiBtT3BlblNlc3Npb25Db3VudGVyOworICAvLyBDb3VudCBvZiBjbG9zZVNlc3Npb24gY2FsbHMuCisgIENvdW50ZXJNZXRyaWM8c3RhdHVzX3Q+IG1DbG9zZVNlc3Npb25Db3VudGVyOworICAvLyBDb3VudCBhbmQgdGltaW5nIG9mIGdldEtleVJlcXVlc3QgY2FsbHMuCisgIEV2ZW50TWV0cmljPHN0YXR1c190PiBtR2V0S2V5UmVxdWVzdFRpbWVVczsKKyAgLy8gQ291bnQgYW5kIHRpbWluZyBvZiBwcm92aWRlS2V5UmVzcG9uc2UgY2FsbHMuCisgIEV2ZW50TWV0cmljPHN0YXR1c190PiBtUHJvdmlkZUtleVJlc3BvbnNlVGltZVVzOworICAvLyBDb3VudCBvZiBnZXRQcm92aXNpb25SZXF1ZXN0IGNhbGxzLgorICBDb3VudGVyTWV0cmljPHN0YXR1c190PiBtR2V0UHJvdmlzaW9uUmVxdWVzdENvdW50ZXI7CisgIC8vIENvdW50IG9mIHByb3ZpZGVQcm92aXNpb25SZXNwb25zZSBjYWxscy4KKyAgQ291bnRlck1ldHJpYzxzdGF0dXNfdD4gbVByb3ZpZGVQcm92aXNpb25SZXNwb25zZUNvdW50ZXI7CisKKyAgLy8gQ291bnQgb2Yga2V5IHN0YXR1cyBldmVudHMgYnJva2VuIG91dCBieSBzdGF0dXMgdHlwZS4KKyAgQ291bnRlck1ldHJpYzw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OktleVN0YXR1c1R5cGU+CisgICAgICBtS2V5U3RhdHVzQ2hhbmdlQ291bnRlcjsKKyAgLy8gQ291bnQgb2YgZXZlbnRzIGJyb2tlbiBvdXQgYnkgZXZlbnQgdHlwZQorICBDb3VudGVyTWV0cmljPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6RXZlbnRUeXBlPiBtRXZlbnRDb3VudGVyOworCisgIC8vIENvdW50IGdldFByb3BlcnR5Qnl0ZUFycmF5IGNhbGxzIHRvIHJldHJpZXZlIHRoZSBkZXZpY2UgdW5pcXVlIGlkLgorICBDb3VudGVyTWV0cmljPHN0YXR1c190PiBtR2V0RGV2aWNlVW5pcXVlSWRDb3VudGVyOworCisgIC8vIEFkZHMgYSBzZXNzaW9uIHN0YXJ0IHRpbWUgcmVjb3JkLgorICB2b2lkIFNldFNlc3Npb25TdGFydChjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCk7CisKKyAgLy8gQWRkcyBhIHNlc3Npb24gZW5kIHRpbWUgcmVjb3JkLgorICB2b2lkIFNldFNlc3Npb25FbmQoY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpOworCisgIC8vIFRoZSBhcHAgcGFja2FnZSBuYW1lIGlzIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlIG5hbWUgdGhhdCBpcyB1c2luZyB0aGUKKyAgLy8gaW5zdGFuY2UuIFRoZSBhcHAgcGFja2FnZSBuYW1lIGlzIGhlbGQgaGVyZSBmb3IgY29udmVuaWVuY2UuIEl0IGlzIG5vdAorICAvLyBzZXJpYWxpemVkIG9yIGV4cG9ydGVkIHdpdGggdGhlIG1ldHJpY3MuCisgIHZvaWQgU2V0QXBwUGFja2FnZU5hbWUoY29uc3QgU3RyaW5nOCYgYXBwUGFja2FnZU5hbWUpIHsgbUFwcFBhY2thZ2VOYW1lID0gYXBwUGFja2FnZU5hbWU7IH0KKyAgY29uc3QgU3RyaW5nOCYgR2V0QXBwUGFja2FnZU5hbWUoKSB7IHJldHVybiBtQXBwUGFja2FnZU5hbWU7IH0KKworICAvLyBFeHBvcnQgdGhlIG1ldHJpY3MgdG8gYSBQZXJzaXN0YWJsZUJ1bmRsZS4KKyAgdm9pZCBFeHBvcnQob3M6OlBlcnNpc3RhYmxlQnVuZGxlKiBtZXRyaWNzQnVuZGxlKTsKKworICAvLyBHZXQgdGhlIHNlcmlhbGl6ZWQgbWV0cmljcy4gTWV0cmljcyBhcmUgZm9ybWF0dGVkIGFzIGEgc2VyaWFsaXplZAorICAvLyBEcm1GcmFtZXdvcmtNZXRyaWNzIHByb3RvLiBJZiB0aGVyZSBpcyBhIGZhaWx1cmUgc2VyaWFsaXppbmcgdGhlIG1ldHJpY3MsCisgIC8vIHRoaXMgcmV0dXJucyBhbiBlcnJvci4gVGhlIHBhcmFtZXRlciB8c2VybGlhbGl6ZWRNZXRyaWNzfCBpcyBvd25lZCBieSB0aGUKKyAgLy8gY2FsbGVyIGFuZCBtdXN0IG5vdCBiZSBudWxsLgorICBzdGF0dXNfdCBHZXRTZXJpYWxpemVkTWV0cmljcyhzdGQ6OnN0cmluZyogc2VyaWFsaXplZE1ldHJpY3MpOworCisgIC8vIENvbnZlcnRzIHRoZSBEUk0gcGx1Z2luIG1ldHJpY3MgdG8gYSBQZXJzaXN0YWJsZUJ1bmRsZS4gQWxsIG9mIHRoZSBtZXRyaWNzCisgIC8vIGZvdW5kIGluIHxwbHVnaW5NZXRyaWNzfCBhcmUgYWRkZWQgdG8gdGhlIHxtZXRyaWNzQnVuZGxlfCBwYXJhbWV0ZXIuCisgIC8vIHxwbHVnaW5CdW5kbGV8IGlzIG93bmVkIGJ5IHRoZSBjYWxsZXIgYW5kIG11c3Qgbm90IGJlIG51bGwuCisgIC8vCisgIC8vIEVhY2ggaXRlbSBpbiB0aGUgcGx1Z2luTWV0cmljcyB2ZWN0b3IgaXMgYWRkZWQgYXMgYSBuZXcgUGVyc2lzdGFibGVCdW5kbGUuIEUuZy4KKyAgLy8gRHJtTWV0cmljR3JvdXAgeworICAvLyAgIG1ldHJpY3NbMF0geworICAvLyAgICAgbmFtZTogImJ1Zl9jb3B5IgorICAvLyAgICAgYXR0cmlidXRlc1swXSB7CisgIC8vICAgICAgIG5hbWU6ICJzaXplIgorICAvLyAgICAgICB0eXBlOiBJTlQ2NF9UWVBFCisgIC8vICAgICAgIGludDY0VmFsdWU6IDEwMjQKKyAgLy8gICAgIH0KKyAgLy8gICAgIHZhbHVlc1swXSB7CisgIC8vICAgICAgIGNvbXBvbmVudE5hbWU6ICJvcGVyYXRpb25fY291bnQiCisgIC8vICAgICAgIHR5cGU6IElOVDY0X1RZUEUKKyAgLy8gICAgICAgaW50NjRWYWx1ZTogNzUKKyAgLy8gICAgIH0KKyAgLy8gICAgIHZhbHVlc1sxXSB7CisgIC8vICAgICAgIGNvbXBvbmVudF9uYW1lOiAiYXZlcmFnZV90aW1lX3NlY29uZHMiCisgIC8vICAgICAgIHR5cGU6IERPVUJMRV9UWVBFCisgIC8vICAgICAgIGRvdWJsZVZhbHVlOiAwLjAwMDAwMDQyCisgIC8vICAgICB9CisgIC8vICAgfQorICAvLyB9CisgIC8vCisgIC8vIGJlY29tZXMKKyAgLy8KKyAgLy8gbWV0cmljc0J1bmRsZSB7CisgIC8vICAgIjAiOiAoUGVyc2lzdGFibGVCdW5kbGUpIHsKKyAgLy8gICAgICJhdHRyaWJ1dGVzIiA6IChQZXJzaXN0YWJsZUJ1bmRsZSkgeworICAvLyAgICAgICAic2l6ZSIgOiAoaW50NjQpIDEwMjQKKyAgLy8gICAgIH0KKyAgLy8gICAgICJvcGVyYXRpb25fY291bnQiIDogKGludDY0KSA3NQorICAvLyAgICAgImF2ZXJhZ2VfdGltZV9zZWNvbmRzIiA6IChkb3VibGUpIDAuMDAwMDAwNDIKKyAgLy8gICB9CisgIC8vCisgIHN0YXRpYyBzdGF0dXNfdCBIaWRsTWV0cmljc1RvQnVuZGxlKAorICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6ZHJtOjpWMV8xOjpEcm1NZXRyaWNHcm91cD4mIHBsdWdpbk1ldHJpY3MsCisgICAgICAgICAgb3M6OlBlcnNpc3RhYmxlQnVuZGxlKiBtZXRyaWNzQnVuZGxlKTsKKworIHByb3RlY3RlZDoKKyAgLy8gVGhpcyBpcyB2aXNpYmxlIGZvciB0ZXN0aW5nIG9ubHkuCisgIHZpcnR1YWwgaW50NjRfdCBHZXRDdXJyZW50VGltZU1zKCk7CisKKyBwcml2YXRlOgorICAvLyBTZXNzaW9uIGxpZmV0aW1lcy4gQSBwYWlyIG9mIHZhbHVlcyByZXByZXNlbnRpbmcgdGhlIG1pbGxpc2Vjb25kcyBzaW5jZQorICAvLyBlcG9jaCwgVVRDLiBUaGUgZmlyc3QgdmFsdWUgaXMgdGhlIHN0YXJ0IHRpbWUsIHRoZSBzZWNvbmQgaXMgdGhlIGVuZCB0aW1lLgorICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpwYWlyPGludDY0X3QsIGludDY0X3Q+PiBtU2Vzc2lvbkxpZmVzcGFuczsKKworICBTdHJpbmc4IG1BcHBQYWNrYWdlTmFtZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gRFJNX01FVFJJQ1NfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRXZlbnRNZXRyaWMuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRXZlbnRNZXRyaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmI3MzZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9FdmVudE1ldHJpYy5oCkBAIC0wLDAgKzEsMTc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgQU5EUk9JRF9FVkVOVF9NRVRSSUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9FVkVOVF9NRVRSSUNfSF8KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIFRoaXMgaXMgYSBzaW1wbGUgaG9sZGVyIGZvciB0aGUgc3RhdGlzdGljcyByZWNvcmRlZCBpbiBFdmVudE1ldHJpYy4KK3N0cnVjdCBFdmVudFN0YXRpc3RpY3MgeworICAvLyBUaGUgY291bnQgb2YgdGltZXMgdGhlIGV2ZW50IG9jY3VycmVkLgorICBpbnQ2NF90IGNvdW50OworCisgIC8vIFRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyByZWNvcmRlZCBpbiB0aGUgUmVjb3JkIG1ldGhvZC4KKyAgZG91YmxlIG1pbjsKKyAgZG91YmxlIG1heDsKKworICAvLyBUaGUgYXZlcmFnZSAobWVhbikgb2YgYWxsIHZhbHVlcyByZWNvcmRlZC4KKyAgZG91YmxlIG1lYW47CisgIC8vIFRoZSBzdW0gb2Ygc3F1YXJlZCBkZXZhdGlvbi4gVmFyaWFuY2UgY2FuIGJlIGNhbGN1bGF0ZWQgZnJvbQorICAvLyB0aGlzIHZhbHVlLgorICAvLyAgICB2YXIgPSBzdW1fc3F1YXJlZF9kZXZpYXRpb24gLyBjb3VudDsKKyAgZG91YmxlIHN1bV9zcXVhcmVkX2RldmlhdGlvbjsKK307CisKKy8vIFRoZSBFdmVudE1ldHJpYyBjbGFzcyBpcyB1c2VkIHRvIGFjY3VtdWxhdGUgc3RhdHMgYWJvdXQgYW4gZXZlbnQgb3ZlciB0aW1lLgorLy8gQSBjb21tb24gdXNlIGNhc2UgaXMgdG8gdHJhY2sgY2xvY2sgdGltaW5ncyBmb3IgYSBtZXRob2QgY2FsbCBvciBvcGVyYXRpb24uCisvLyBBbiBFdmVudE1ldHJpYyBjYW4gYnJlYWsgZG93biBzdGF0cyBieSBhIGRpbWVuc2lvbiBzcGVjaWZpZWQgYnkgdGhlCisvLyBhcHBsaWNhdGlvbi4gRS5nLiBhbiBhcHBsaWNhdGlvbiBtYXkgd2FudCB0byB0cmFjayBjb3VudHMgYnJva2VuIG91dCBieQorLy8gZXJyb3IgY29kZSBvciB0aGUgc2l6ZSBvZiBzb21lIHBhcmFtZXRlci4KKy8vCisvLyBFeGFtcGxlOgorLy8KKy8vICAgc3RydWN0IEMgeworLy8gICAgIHN0YXR1c190IERvV29yaygpIHsKKy8vICAgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnRfdGltZSA9IG5vdygpOworLy8gICAgICAgc3RhdHVzX3QgcmVzdWx0OworLy8KKy8vICAgICAgIC8vIERPIFdPUksgYW5kIGRldGVybWluZSByZXN1bHQ7CisvLworLy8gICAgICAgd29ya19ldmVudF8uUmVjb3JkKG5vdygpIC0gc3RhcnRfdGltZSwgcmVzdWx0KTsKKy8vCisvLyAgICAgICByZXR1cm4gcmVzdWx0OworLy8gICAgIH0KKy8vICAgICBFdmVudE1ldHJpYzxzdGF0dXNfdD4gd29ya19ldmVudF87CisvLyAgIH07CisvLworLy8gICBDIGM7CisvLyAgIGMuRG9Xb3JrKCk7CisvLworLy8gICBzdGQ6Om1hcDxpbnQsIGludDY0X3Q+IHZhbHVlczsKKy8vICAgbWV0cmljLkV4cG9ydFZhbHVlcygKKy8vICAgICAgIFsmXSAoaW50IGF0dHJpYnV0ZV92YWx1ZSwgaW50NjRfdCB2YWx1ZSkgeworLy8gICAgICAgICAgICB2YWx1ZXNbYXR0cmlidXRlX3ZhbHVlXSA9IHZhbHVlOworLy8gICAgICAgfSk7CisvLyAgIC8vIERvIHNvbWV0aGluZyB3aXRoIHRoZSBleHBvcnRlZCBzdGF0LgorLy8KK3RlbXBsYXRlPHR5cGVuYW1lIEF0dHJpYnV0ZVR5cGU+CitjbGFzcyBFdmVudE1ldHJpYyB7CisgcHVibGljOgorICAvLyBJbnN0YW50aWF0ZSB0aGUgY291bnRlciB3aXRoIHRoZSBnaXZlbiBtZXRyaWMgbmFtZSBhbmQKKyAgLy8gYXR0cmlidXRlIG5hbWVzLiB8YXR0cmlidXRlX25hbWVzfCBtdXN0IG5vdCBiZSBudWxsLgorICBFdmVudE1ldHJpYygKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXRyaWNfbmFtZSwKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhdHRyaWJ1dGVfbmFtZSkKKyAgICAgICAgICA6IG1ldHJpY19uYW1lXyhtZXRyaWNfbmFtZSksCisgICAgICAgICAgICBhdHRyaWJ1dGVfbmFtZV8oYXR0cmlidXRlX25hbWUpIHt9CisKKyAgLy8gSW5jcmVtZW50IHRoZSBjb3VudCBvZiB0aW1lcyB0aGUgb3BlcmF0aW9uIG9jY3VycmVkIHdpdGggdGhpcworICAvLyBjb21iaW5hdGlvbiBvZiBhdHRyaWJ1dGVzLgorICB2b2lkIFJlY29yZChkb3VibGUgdmFsdWUsIEF0dHJpYnV0ZVR5cGUgYXR0cmlidXRlKSB7CisgICAgaWYgKHZhbHVlc18uZmluZChhdHRyaWJ1dGUpICE9IHZhbHVlc18uZW5kKCkpIHsKKyAgICAgIEV2ZW50U3RhdGlzdGljcyogc3RhdHMgPSB2YWx1ZXNfW2F0dHJpYnV0ZV0uZ2V0KCk7CisgICAgICAvLyBVc2luZyBtZXRob2Qgb2YgcHJvdmlzaW9uYWwgbWVhbnMuCisgICAgICBkb3VibGUgZGV2aWF0aW9uID0gdmFsdWUgLSBzdGF0cy0+bWVhbjsKKyAgICAgIHN0YXRzLT5tZWFuID0gc3RhdHMtPm1lYW4gKyAoZGV2aWF0aW9uIC8gc3RhdHMtPmNvdW50KTsKKyAgICAgIHN0YXRzLT5zdW1fc3F1YXJlZF9kZXZpYXRpb24gPQorICAgICAgICAgIHN0YXRzLT5zdW1fc3F1YXJlZF9kZXZpYXRpb24gKyAoZGV2aWF0aW9uICogKHZhbHVlIC0gc3RhdHMtPm1lYW4pKTsKKyAgICAgIHN0YXRzLT5jb3VudCsrOworCisgICAgICBzdGF0cy0+bWluID0gc3RhdHMtPm1pbiA8IHZhbHVlID8gc3RhdHMtPm1pbiA6IHZhbHVlOworICAgICAgc3RhdHMtPm1heCA9IHN0YXRzLT5tYXggPiB2YWx1ZSA/IHN0YXRzLT5tYXggOiB2YWx1ZTsKKyAgICB9IGVsc2UgeworICAgICAgc3RkOjp1bmlxdWVfcHRyPEV2ZW50U3RhdGlzdGljcz4gc3RhdHMgPQorICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8RXZlbnRTdGF0aXN0aWNzPigpOworICAgICAgc3RhdHMtPmNvdW50ID0gMTsKKyAgICAgIHN0YXRzLT5taW4gPSB2YWx1ZTsKKyAgICAgIHN0YXRzLT5tYXggPSB2YWx1ZTsKKyAgICAgIHN0YXRzLT5tZWFuID0gdmFsdWU7CisgICAgICBzdGF0cy0+c3VtX3NxdWFyZWRfZGV2aWF0aW9uID0gMDsKKyAgICAgIHZhbHVlc19bYXR0cmlidXRlXSA9IHN0ZDo6bW92ZShzdGF0cyk7CisgICAgfQorICB9OworCisgIC8vIEV4cG9ydCB0aGUgbWV0cmljcyB0byB0aGUgcHJvdmlkZWQgfGZ1bmN0aW9ufC4gRWFjaCB2YWx1ZSBmb3IgQXR0cmlidXRlCisgIC8vIGhhcyBhIHNlcGFyYXRlIHNldCBvZiBzdGF0cy4gQXMgc3VjaCwgfGZ1bmN0aW9ufCB3aWxsIGJlIGNhbGxlZCBvbmNlIHBlcgorICAvLyB2YWx1ZSBvZiBBdHRyaWJ1dGUuCisgIHZvaWQgRXhwb3J0VmFsdWVzKAorICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkIChjb25zdCBBdHRyaWJ1dGVUeXBlJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXZlbnRTdGF0aXN0aWNzJik+IGZ1bmN0aW9uKSBjb25zdCB7CisgICAgZm9yIChhdXRvIGl0ID0gdmFsdWVzXy5iZWdpbigpOyBpdCAhPSB2YWx1ZXNfLmVuZCgpOyBpdCsrKSB7CisgICAgICBmdW5jdGlvbihpdC0+Zmlyc3QsICooaXQtPnNlY29uZCkpOworICAgIH0KKyAgfQorCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXRyaWNfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1ldHJpY19uYW1lXzsgfTsKKworIHByaXZhdGU6CisgIGNvbnN0IHN0ZDo6c3RyaW5nIG1ldHJpY19uYW1lXzsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgYXR0cmlidXRlX25hbWVfOworICBzdGQ6Om1hcDxBdHRyaWJ1dGVUeXBlLCBzdGQ6OnVuaXF1ZV9wdHI8c3RydWN0IEV2ZW50U3RhdGlzdGljcz4+IHZhbHVlc187Cit9OworCisvLyBUaGUgRXZlbnRUaW1lciBpcyBhIHN1cHBvcnRpbmcgY2xhc3MgZm9yIEV2ZW50TWV0cmljIGluc3RhbmNlcyB0aGF0IGFyZSB1c2VkCisvLyB0byB0aW1lIG1ldGhvZHMuIFRoZSBFdmVudFRpbWVyIHN0YXJ0cyBhIHRpbWVyIHdoZW4gZmlyc3QgaW4gc2NvcGUsIGFuZAorLy8gcmVjb3JkcyB0aGUgdGltaW5nIHdoZW4gZXhpdGluZyBzY29wZS4KKy8vCisvLyBFeGFtcGxlOgorLy8KKy8vIEV2ZW50TWV0cmljPGludD4gbXlfbWV0cmljOworLy8KKy8vIHsKKy8vICAgRXZlbnRUaW1lcjxpbnQ+IG15X3RpbWVyKCZteV9tZXRyaWMpOworLy8gICAvLyBTZXQgdGhlIGF0dHJpYnV0ZSB0byBhc3NvY2lhdGUgd2l0aCB0aGlzIHRpbWluZy4KKy8vICAgbXlfdGltZXIuU2V0QXR0cmlidHVlKDQyKTsKKy8vCisvLyAgIC8vIERvIHNvbWUgd29yayB0aGF0IHlvdSB3YW50IHRvIHRpbWUuCisvLworLy8gfSAgLy8gVGhlIEV2ZW50VGltZXIgZGVzdHJ1Y3RvciB3aWxsIHJlY29yZCB0aGUgdGhlIHRpbWluZyBpbiBteV9tZXRyaWM7CisvLwordGVtcGxhdGU8dHlwZW5hbWUgQXR0cmlidXRlVHlwZT4KK2NsYXNzIEV2ZW50VGltZXIgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgRXZlbnRUaW1lcihFdmVudE1ldHJpYzxBdHRyaWJ1dGVUeXBlPiogbWV0cmljKQorICAgICAgOnN0YXJ0X3RpbWVfKHN5c3RlbVRpbWUoKSksIG1ldHJpY18obWV0cmljKSB7CisgIH0KKworICB2aXJ0dWFsIH5FdmVudFRpbWVyKCkgeworICAgIGlmIChtZXRyaWNfKSB7CisgICAgICBtZXRyaWNfLT5SZWNvcmQobnMydXMoc3lzdGVtVGltZSgpIC0gc3RhcnRfdGltZV8pLCBhdHRyaWJ1dGVfKTsKKyAgICB9CisgIH0KKworICAvLyBTZXQgdGhlIGF0dHJpYnV0ZSB0byBhc3NvY2lhdGUgd2l0aCB0aGlzIHRpbWluZy4gRS5nLiB0aGlzIGNhbiBiZSB1c2VkIHRvCisgIC8vIHJlY29yZCB0aGUgcmV0dXJuIGNvZGUgZnJvbSB0aGUgd29yayB0aGF0IHdhcyB0aW1lZC4KKyAgdm9pZCBTZXRBdHRyaWJ1dGUoY29uc3QgQXR0cmlidXRlVHlwZSYgYXR0cmlidXRlKSB7CisgICAgYXR0cmlidXRlXyA9IGF0dHJpYnV0ZTsKKyAgfQorCisgcHJvdGVjdGVkOgorICAvLyBWaXNpYmxlIGZvciB0ZXN0aW5nIG9ubHkuCisgIG5zZWNzX3Qgc3RhcnRfdGltZV87CisKKyBwcml2YXRlOgorICBFdmVudE1ldHJpYzxBdHRyaWJ1dGVUeXBlPiogbWV0cmljXzsKKyAgQXR0cmlidXRlVHlwZSBhdHRyaWJ1dGVfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0VWRU5UX01FVFJJQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JRHJtLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lEcm0uaAppbmRleCBhNTdlMzcyLi44ZTllYjNhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lEcm0uaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lEcm0uaApAQCAtMTUsOSArMTUsMTEgQEAKICAqLwogCiAjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGVyc2lzdGFibGVCdW5kbGUuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvZHJtL0RybUFQSS5oPgotI2luY2x1ZGUgPG1lZGlhL0lEcm1DbGllbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9JRHJtQ2xpZW50Lmg+CiAKICNpZm5kZWYgQU5EUk9JRF9JRFJNX0hfCiAKQEAgLTM5LDcgKzQxLDggQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVzdHJveVBsdWdpbigpID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlblNlc3Npb24oVmVjdG9yPHVpbnQ4X3Q+ICZzZXNzaW9uSWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5TZXNzaW9uKERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBzZWN1cml0eUxldmVsLAorICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZzZXNzaW9uSWQpID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VTZXNzaW9uKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkKSA9IDA7CiAKQEAgLTczLDEwICs3NiwyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmd3JhcHBlZEtleSkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cmVTdG9wcyhMaXN0PFZlY3Rvcjx1aW50OF90PiA+ICZzZWN1cmVTdG9wcykgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcElkcyhMaXN0PFZlY3Rvcjx1aW50OF90PiA+ICZzZWN1cmVTdG9wSWRzKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cmVTdG9wKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc3NpZCwgVmVjdG9yPHVpbnQ4X3Q+ICZzZWN1cmVTdG9wKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VTZWN1cmVTdG9wcyhWZWN0b3I8dWludDhfdD4gY29uc3QgJnNzUmVsZWFzZSkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUFsbFNlY3VyZVN0b3BzKCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlU2VjdXJlU3RvcChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNzaWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUFsbFNlY3VyZVN0b3BzKCkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRIZGNwTGV2ZWxzKERybVBsdWdpbjo6SGRjcExldmVsICpjb25uZWN0ZWRMZXZlbCwKKyAgICAgICAgICAgIERybVBsdWdpbjo6SGRjcExldmVsICptYXhMZXZlbCkKKyAgICAgICAgICAgIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE51bWJlck9mU2Vzc2lvbnModWludDMyX3QgKmN1cnJlbnRTZXNzaW9ucywKKyAgICAgICAgICAgIHVpbnQzMl90ICptYXhTZXNzaW9ucykgY29uc3QgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJpdHlMZXZlbChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKKyAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCAqbGV2ZWwpIGNvbnN0ID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvcGVydHlTdHJpbmcoU3RyaW5nOCBjb25zdCAmbmFtZSwgU3RyaW5nOCAmdmFsdWUpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb3BlcnR5Qnl0ZUFycmF5KFN0cmluZzggY29uc3QgJm5hbWUsCkBAIC04Niw2ICs5OSw4IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcm9wZXJ0eUJ5dGVBcnJheShTdHJpbmc4IGNvbnN0ICZuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZ2YWx1ZSkgY29uc3QgPSAwOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRyaWNzKG9zOjpQZXJzaXN0YWJsZUJ1bmRsZSAqbWV0cmljcykgPSAwOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDaXBoZXJBbGdvcml0aG0oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBjb25zdCAmYWxnb3JpdGhtKSA9IDA7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSUhEQ1AuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSUhEQ1AuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUyNTYxZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lIRENQLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgotI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hEQ1BBUEkuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0jaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBJSERDUE9ic2VydmVyIDogcHVibGljIElJbnRlcmZhY2UgewotICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoSERDUE9ic2VydmVyKTsKLQotICAgIHZpcnR1YWwgdm9pZCBub3RpZnkoCi0gICAgICAgICAgICBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqb2JqKSA9IDA7Ci0KLXByaXZhdGU6Ci0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSUhEQ1BPYnNlcnZlcik7Ci19OwotCi1zdHJ1Y3QgSUhEQ1AgOiBwdWJsaWMgSUludGVyZmFjZSB7Ci0gICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShIRENQKTsKLQotICAgIC8vIENhbGxlZCB0byBzcGVjaWZ5IHRoZSBvYnNlcnZlciB0aGF0IHJlY2VpdmVzIGFzeW5jaHJvbm91cyBub3RpZmljYXRpb25zCi0gICAgLy8gZnJvbSB0aGUgSERDUCBpbXBsZW1lbnRhdGlvbiB0byBzaWduYWwgY29tcGxldGlvbi9mYWlsdXJlIG9mIGFzeW5jaHJvbm91cwotICAgIC8vIG9wZXJhdGlvbnMgKHN1Y2ggYXMgaW5pdGlhbGl6YXRpb24pIG9yIG91dCBvZiBiYW5kIGV2ZW50cy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE9ic2VydmVyKGNvbnN0IHNwPElIRENQT2JzZXJ2ZXI+ICZvYnNlcnZlcikgPSAwOwotCi0gICAgLy8gUmVxdWVzdCB0byBzZXR1cCBhbiBIRENQIHNlc3Npb24gd2l0aCB0aGUgc3BlY2lmaWVkIGhvc3QgbGlzdGVuaW5nCi0gICAgLy8gb24gdGhlIHNwZWNpZmllZCBwb3J0LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdEFzeW5jKGNvbnN0IGNoYXIgKmhvc3QsIHVuc2lnbmVkIHBvcnQpID0gMDsKLQotICAgIC8vIFJlcXVlc3QgdG8gc2h1dGRvd24gdGhlIGFjdGl2ZSBIRENQIHNlc3Npb24uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzaHV0ZG93bkFzeW5jKCkgPSAwOwotCi0gICAgLy8gUmV0dXJucyB0aGUgY2FwYWJpbGl0eSBiaXRtYXNrIG9mIHRoaXMgSERDUCBzZXNzaW9uLgotICAgIC8vIFBvc3NpYmxlIHJldHVybiB2YWx1ZXMgKHBsZWFzZSByZWZlciB0byBIRENBUEFQSS5oKToKLSAgICAvLyAgIEhEQ1BfQ0FQU19FTkNSWVBUOiBtYW5kYXRvcnksIG1lYW5pbmcgdGhlIEhEQ1AgbW9kdWxlIGNhbiBlbmNyeXB0Ci0gICAgLy8gICBmcm9tIGFuIGlucHV0IGJ5dGUtYXJyYXkgYnVmZmVyIHRvIGFuIG91dHB1dCBieXRlLWFycmF5IGJ1ZmZlcgotICAgIC8vICAgSERDUF9DQVBTX0VOQ1JZUFRfTkFUSVZFOiB0aGUgSERDUCBtb2R1bGUgc3VwcG9ydHMgZW5jcnlwdGlvbiBmcm9tCi0gICAgLy8gICBhIG5hdGl2ZSBidWZmZXIgdG8gYW4gb3V0cHV0IGJ5dGUtYXJyYXkgYnVmZmVyLiBUaGUgZm9ybWF0IG9mIHRoZQotICAgIC8vICAgaW5wdXQgbmF0aXZlIGJ1ZmZlciBpcyBzcGVjaWZpYyB0byB2ZW5kb3IncyBlbmNvZGVyIGltcGxlbWVudGF0aW9uLgotICAgIC8vICAgSXQgaXMgdGhlIHNhbWUgZm9ybWF0IGFzIHRoYXQgdXNlZCBieSB0aGUgZW5jb2RlciB3aGVuCi0gICAgLy8gICAic3RvcmVNZXRhRGF0YUluQnVmZmVycyIgZXh0ZW5zaW9uIGlzIGVuYWJsZWQgb24gaXRzIG91dHB1dCBwb3J0LgotICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0Q2FwcygpID0gMDsKLQotICAgIC8vIEVOQ1JZUFRJT04gb25seToKLSAgICAvLyBFbmNyeXB0IGRhdGEgYWNjb3JkaW5nIHRvIHRoZSBIRENQIHNwZWMuICJzaXplIiBieXRlcyBvZiBkYXRhIGFyZQotICAgIC8vIGF2YWlsYWJsZSBhdCAiaW5EYXRhIiAodmlydHVhbCBhZGRyZXNzKSwgInNpemUiIG1heSBub3QgYmUgYSBtdWx0aXBsZQotICAgIC8vIG9mIDEyOCBiaXRzICgxNiBieXRlcykuIEFuIGVxdWFsIG51bWJlciBvZiBlbmNyeXB0ZWQgYnl0ZXMgc2hvdWxkIGJlCi0gICAgLy8gd3JpdHRlbiB0byB0aGUgYnVmZmVyIGF0ICJvdXREYXRhIiAodmlydHVhbCBhZGRyZXNzKS4KLSAgICAvLyBUaGlzIG9wZXJhdGlvbiBpcyB0byBiZSBzeW5jaHJvbm91cywgaS5lLiB0aGlzIGNhbGwgZG9lcyBub3QgcmV0dXJuCi0gICAgLy8gdW50aWwgb3V0RGF0YSBjb250YWlucyBzaXplIGJ5dGVzIG9mIGVuY3J5cHRlZCBkYXRhLgotICAgIC8vIHN0cmVhbUNUUiB3aWxsIGJlIGFzc2lnbmVkIGJ5IHRoZSBjYWxsZXIgKHRvIDAgZm9yIHRoZSBmaXJzdCBQRVMgc3RyZWFtLAotICAgIC8vIDEgZm9yIHRoZSBzZWNvbmQgYW5kIHNvIG9uKQotICAgIC8vIGlucHV0Q1RSIF93aWxsX2JlX21haW50YWluZWRfYnlfdGhlX2NhbGxlZV8gZm9yIGVhY2ggUEVTIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGVuY3J5cHQoCi0gICAgICAgICAgICBjb25zdCB2b2lkICppbkRhdGEsIHNpemVfdCBzaXplLCB1aW50MzJfdCBzdHJlYW1DVFIsCi0gICAgICAgICAgICB1aW50NjRfdCAqb3V0SW5wdXRDVFIsIHZvaWQgKm91dERhdGEpID0gMDsKLQotICAgIC8vIEVuY3J5cHQgZGF0YSBhY2NvcmRpbmcgdG8gdGhlIEhEQ1Agc3BlYy4gInNpemUiIGJ5dGVzIG9mIGRhdGEgc3RhcnRpbmcKLSAgICAvLyBhdCBsb2NhdGlvbiAib2Zmc2V0IiBhcmUgYXZhaWxhYmxlIGluICJidWZmZXIiIChidWZmZXIgaGFuZGxlKS4gInNpemUiCi0gICAgLy8gbWF5IG5vdCBiZSBhIG11bHRpcGxlIG9mIDEyOCBiaXRzICgxNiBieXRlcykuIEFuIGVxdWFsIG51bWJlciBvZgotICAgIC8vIGVuY3J5cHRlZCBieXRlcyBzaG91bGQgYmUgd3JpdHRlbiB0byB0aGUgYnVmZmVyIGF0ICJvdXREYXRhIiAodmlydHVhbAotICAgIC8vIGFkZHJlc3MpLiBUaGlzIG9wZXJhdGlvbiBpcyB0byBiZSBzeW5jaHJvbm91cywgaS5lLiB0aGlzIGNhbGwgZG9lcyBub3QKLSAgICAvLyByZXR1cm4gdW50aWwgb3V0RGF0YSBjb250YWlucyBzaXplIGJ5dGVzIG9mIGVuY3J5cHRlZCBkYXRhLgotICAgIC8vIHN0cmVhbUNUUiB3aWxsIGJlIGFzc2lnbmVkIGJ5IHRoZSBjYWxsZXIgKHRvIDAgZm9yIHRoZSBmaXJzdCBQRVMgc3RyZWFtLAotICAgIC8vIDEgZm9yIHRoZSBzZWNvbmQgYW5kIHNvIG9uKQotICAgIC8vIGlucHV0Q1RSIF93aWxsX2JlX21haW50YWluZWRfYnlfdGhlX2NhbGxlZV8gZm9yIGVhY2ggUEVTIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGVuY3J5cHROYXRpdmUoCi0gICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiAmZ3JhcGhpY0J1ZmZlciwKLSAgICAgICAgICAgIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplLCB1aW50MzJfdCBzdHJlYW1DVFIsCi0gICAgICAgICAgICB1aW50NjRfdCAqb3V0SW5wdXRDVFIsIHZvaWQgKm91dERhdGEpID0gMDsKLQotICAgIC8vIERFQ1JZUFRJT04gb25seToKLSAgICAvLyBEZWNyeXB0IGRhdGEgYWNjb3JkaW5nIHRvIHRoZSBIRENQIHNwZWMuCi0gICAgLy8gInNpemUiIGJ5dGVzIG9mIGVuY3J5cHRlZCBkYXRhIGFyZSBhdmFpbGFibGUgYXQgImluRGF0YSIKLSAgICAvLyAodmlydHVhbCBhZGRyZXNzKSwgInNpemUiIG1heSBub3QgYmUgYSBtdWx0aXBsZSBvZiAxMjggYml0cyAoMTYgYnl0ZXMpLgotICAgIC8vIEFuIGVxdWFsIG51bWJlciBvZiBkZWNyeXB0ZWQgYnl0ZXMgc2hvdWxkIGJlIHdyaXR0ZW4gdG8gdGhlIGJ1ZmZlcgotICAgIC8vIGF0ICJvdXREYXRhIiAodmlydHVhbCBhZGRyZXNzKS4KLSAgICAvLyBUaGlzIG9wZXJhdGlvbiBpcyB0byBiZSBzeW5jaHJvbm91cywgaS5lLiB0aGlzIGNhbGwgZG9lcyBub3QgcmV0dXJuCi0gICAgLy8gdW50aWwgb3V0RGF0YSBjb250YWlucyBzaXplIGJ5dGVzIG9mIGRlY3J5cHRlZCBkYXRhLgotICAgIC8vIEJvdGggc3RyZWFtQ1RSIGFuZCBpbnB1dENUUiB3aWxsIGJlIHByb3ZpZGVkIGJ5IHRoZSBjYWxsZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkZWNyeXB0KAotICAgICAgICAgICAgY29uc3Qgdm9pZCAqaW5EYXRhLCBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbUNUUiwgdWludDY0X3QgaW5wdXRDVFIsCi0gICAgICAgICAgICB2b2lkICpvdXREYXRhKSA9IDA7Ci0KLXByaXZhdGU6Ci0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSUhEQ1ApOwotfTsKLQotc3RydWN0IEJuSERDUE9ic2VydmVyIDogcHVibGljIEJuSW50ZXJmYWNlPElIRENQT2JzZXJ2ZXI+IHsKLSAgICB2aXJ0dWFsIHN0YXR1c190IG9uVHJhbnNhY3QoCi0gICAgICAgICAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwgJmRhdGEsIFBhcmNlbCAqcmVwbHksCi0gICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOwotfTsKLQotc3RydWN0IEJuSERDUCA6IHB1YmxpYyBCbkludGVyZmFjZTxJSERDUD4gewotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25UcmFuc2FjdCgKLSAgICAgICAgICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCAmZGF0YSwgUGFyY2VsICpyZXBseSwKLSAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhQ29kZWNTZXJ2aWNlLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYUNvZGVjU2VydmljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWZiMWMwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhQ29kZWNTZXJ2aWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0lNRURJQUNPREVDU0VSVklDRV9ICi0jZGVmaW5lIEFORFJPSURfSU1FRElBQ09ERUNTRVJWSUNFX0gKLQotI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSURhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9JT01YLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSU9NWFN0b3JlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgSU1lZGlhQ29kZWNTZXJ2aWNlOiBwdWJsaWMgSUludGVyZmFjZQotewotcHVibGljOgotICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoTWVkaWFDb2RlY1NlcnZpY2UpOwotCi0gICAgdmlydHVhbCBzcDxJT01YPiBnZXRPTVgoKSA9IDA7Ci0gICAgdmlydHVhbCBzcDxJT01YU3RvcmU+IGdldE9NWFN0b3JlKCkgPSAwOwotfTsKLQotY2xhc3MgQm5NZWRpYUNvZGVjU2VydmljZTogcHVibGljIEJuSW50ZXJmYWNlPElNZWRpYUNvZGVjU2VydmljZT4KLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QodWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOwotfTsKLQotfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gQU5EUk9JRF9JTUVESUFDT0RFQ1NFUlZJQ0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFFeHRyYWN0b3IuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhRXh0cmFjdG9yLmgKaW5kZXggMGFjNzY3My4uNzVlNGVlMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYUV4dHJhY3Rvci5oCkBAIC0xOCw4ICsxOCw4IEBACiAKICNkZWZpbmUgSU1FRElBX0VYVFJBQ1RPUl9CQVNFX0hfCiAKKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPHZlY3Rvcj4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNjAsMTYgKzYwLDkgQEAKICAgICAvLyBDQU5fU0VFS19CQUNLV0FSRCB8IENBTl9TRUVLX0ZPUldBUkQgfCBDQU5fU0VFSyB8IENBTl9QQVVTRQogICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSBjb25zdCA9IDA7CiAKLSAgICAvLyBmb3IgRFJNCi0gICAgdmlydHVhbCBjaGFyKiBnZXREcm1UcmFja0luZm8oc2l6ZV90IHRyYWNrSUQsIGludCAqbGVuKSAgPSAwOwotCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCBISW50ZXJmYWNlVG9rZW4gJmNhc1Rva2VuKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQgc2V0VUlEKHVpZF90IHVpZCkgID0gMDsKLQogICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZSgpID0gMDsKIH07CiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFIVFRQQ29ubmVjdGlvbi5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFIVFRQQ29ubmVjdGlvbi5oCmluZGV4IDJhNjNlYjcuLjBmYjZiYjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYUhUVFBDb25uZWN0aW9uLmgKQEAgLTE5LDE2ICsxOSwxNSBAQAogI2RlZmluZSBJX01FRElBX0hUVFBfQ09OTkVDVElPTl9IXwogCiAjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUhUVFBDb25uZWN0aW9uLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IElNZWRpYUhUVFBDb25uZWN0aW9uOwotCiAvKiogTVVTVCBzdGF5IGluIHN5bmMgd2l0aCBJTWVkaWFIVFRQQ29ubmVjdGlvbi5haWRsICovCiAKLXN0cnVjdCBJTWVkaWFIVFRQQ29ubmVjdGlvbiA6IHB1YmxpYyBJSW50ZXJmYWNlIHsKK3N0cnVjdCBJTWVkaWFIVFRQQ29ubmVjdGlvbiA6IHB1YmxpYyBNZWRpYUhUVFBDb25uZWN0aW9uLCBwdWJsaWMgSUludGVyZmFjZSB7CiAgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShNZWRpYUhUVFBDb25uZWN0aW9uKTsKIAogICAgIHZpcnR1YWwgYm9vbCBjb25uZWN0KApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oCmluZGV4IGY2NmQ2YzguLmU5NDhiNzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmgKQEAgLTE5LDE4ICsxOSwxOSBAQAogI2RlZmluZSBJX01FRElBX0hUVFBfU0VSVklDRV9IXwogCiAjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBJTWVkaWFIVFRQQ29ubmVjdGlvbjsKK3N0cnVjdCBNZWRpYUhUVFBDb25uZWN0aW9uOwogCiAvKiogTVVTVCBzdGF5IGluIHN5bmMgd2l0aCBJTWVkaWFIVFRQU2VydmljZS5haWRsICovCiAKLXN0cnVjdCBJTWVkaWFIVFRQU2VydmljZSA6IHB1YmxpYyBJSW50ZXJmYWNlIHsKK3N0cnVjdCBJTWVkaWFIVFRQU2VydmljZSA6IHB1YmxpYyBNZWRpYUhUVFBTZXJ2aWNlLCBwdWJsaWMgSUludGVyZmFjZSB7CiAgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShNZWRpYUhUVFBTZXJ2aWNlKTsKIAotICAgIHZpcnR1YWwgc3A8SU1lZGlhSFRUUENvbm5lY3Rpb24+IG1ha2VIVFRQQ29ubmVjdGlvbigpID0gMDsKKyAgICB2aXJ0dWFsIHNwPE1lZGlhSFRUUENvbm5lY3Rpb24+IG1ha2VIVFRQQ29ubmVjdGlvbigpID0gMDsKIAogcHJpdmF0ZToKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhJTWVkaWFIVFRQU2VydmljZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmgKaW5kZXggZWE5NTE2MS4uYzZmNDIyZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuaApAQCAtNDQsNiArNDQsMTMgQEAKICAgICAgICAgICAgIGNvbnN0IHNwPElEYXRhU291cmNlPiYgZGF0YVNvdXJjZSwgY29uc3QgY2hhciAqbWltZSkgPSAwOwogICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gICAgIGdldEZyYW1lQXRUaW1lKAogICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMsIGludCBvcHRpb24sIGludCBjb2xvckZvcm1hdCwgYm9vbCBtZXRhT25seSkgPSAwOworICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gICAgIGdldEltYWdlQXRJbmRleCgKKyAgICAgICAgICAgIGludCBpbmRleCwgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5LCBib29sIHRodW1ibmFpbCkgPSAwOworICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gICAgIGdldEltYWdlUmVjdEF0SW5kZXgoCisgICAgICAgICAgICBpbnQgaW5kZXgsIGludCBjb2xvckZvcm1hdCwgaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldEZyYW1lQXRJbmRleCgKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHNwPElNZW1vcnk+ID4gKmZyYW1lcywKKyAgICAgICAgICAgIGludCBmcmFtZUluZGV4LCBpbnQgbnVtRnJhbWVzLCBpbnQgY29sb3JGb3JtYXQsIGJvb2wgbWV0YU9ubHkpID0gMDsKICAgICB2aXJ0dWFsIHNwPElNZW1vcnk+ICAgICBleHRyYWN0QWxidW1BcnQoKSA9IDA7CiAgICAgdmlydHVhbCBjb25zdCBjaGFyKiAgICAgZXh0cmFjdE1ldGFkYXRhKGludCBrZXlDb2RlKSA9IDA7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXIuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyLmgKaW5kZXggZTVhOThkZC4uOTdhOTk4ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllci5oCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KIAotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvVm9sdW1lU2hhcGVyLmg+CiAKIC8vIEZ3ZCBkZWNsIHRvIG1ha2Ugc3VyZSBldmVyeW9uZSBhZ3JlZXMgdGhhdCB0aGUgc2NvcGUgb2Ygc3RydWN0IHNvY2thZGRyX2luIGlzCkBAIC00Miw3ICs0Miw3IEBACiBzdHJ1Y3QgQVZTeW5jU2V0dGluZ3M7CiBzdHJ1Y3QgQnVmZmVyaW5nU2V0dGluZ3M7CiAKLXR5cGVkZWYgSU1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGUgTWVkaWFQbGF5ZXJTZWVrTW9kZTsKK3R5cGVkZWYgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSBNZWRpYVBsYXllclNlZWtNb2RlOwogCiBjbGFzcyBJTWVkaWFQbGF5ZXI6IHB1YmxpYyBJSW50ZXJmYWNlCiB7CkBAIC02MSw3ICs2MSw3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxJRGF0YVNvdXJjZT4mIHNvdXJjZSkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFZpZGVvU3VyZmFjZVRleHR1cmUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgYnVmZmVyUHJvZHVjZXIpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBnZXREZWZhdWx0QnVmZmVyaW5nU2V0dGluZ3MoCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0QnVmZmVyaW5nU2V0dGluZ3MoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJpbmdTZXR0aW5ncyogYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgcHJlcGFyZUFzeW5jKCkgPSAwOwpAQCAtNzksNiArNzksNyBAQAogICAgICAgICAgICAgTWVkaWFQbGF5ZXJTZWVrTW9kZSBtb2RlID0gTWVkaWFQbGF5ZXJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0Q3VycmVudFBvc2l0aW9uKGludCogbXNlYykgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldER1cmF0aW9uKGludCogbXNlYykgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIG5vdGlmeUF0KGludDY0X3QgbWVkaWFUaW1lVXMpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICByZXNldCgpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRBdWRpb1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCB0eXBlKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0TG9vcGluZyhpbnQgbG9vcCkgPSAwOwpAQCAtOTEsMTAgKzkyLDEwIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0UmV0cmFuc21pdEVuZHBvaW50KHN0cnVjdCBzb2NrYWRkcl9pbiogZW5kcG9pbnQpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXROZXh0UGxheWVyKGNvbnN0IHNwPElNZWRpYVBsYXllcj4mIG5leHQpID0gMDsKIAotICAgIHZpcnR1YWwgVm9sdW1lU2hhcGVyOjpTdGF0dXMgYXBwbHlWb2x1bWVTaGFwZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24+JiBjb25maWd1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+JiBvcGVyYXRpb24pID0gMDsKLSAgICB2aXJ0dWFsIHNwPFZvbHVtZVNoYXBlcjo6U3RhdGU+IGdldFZvbHVtZVNoYXBlclN0YXRlKGludCBpZCkgPSAwOworICAgIHZpcnR1YWwgbWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdHVzIGFwcGx5Vm9sdW1lU2hhcGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4mIGNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+JiBvcGVyYXRpb24pID0gMDsKKyAgICB2aXJ0dWFsIHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6OlN0YXRlPiBnZXRWb2x1bWVTaGFwZXJTdGF0ZShpbnQgaWQpID0gMDsKIAogICAgIC8vIE1vZHVsYXIgRFJNCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgcHJlcGFyZURybShjb25zdCB1aW50OF90IHV1aWRbMTZdLApAQCAtMTMwLDYgKzEzMSwxMSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldE1ldGFkYXRhKGJvb2wgdXBkYXRlX29ubHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhcHBseV9maWx0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsICptZXRhZGF0YSkgPSAwOworCisgICAgLy8gQXVkaW9Sb3V0aW5nCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBnZXRSb3V0ZWREZXZpY2VJZChhdWRpb19wb3J0X2hhbmRsZV90ICpkZXZpY2VJZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKSA9IDA7CiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oCmluZGV4IGYyMWJiM2EuLjIxN2RlMTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oCkBAIC0zMSw3ICszMSw2IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IElIRENQOwogY2xhc3MgSU1lZGlhQ29kZWNMaXN0Owogc3RydWN0IElNZWRpYUhUVFBTZXJ2aWNlOwogY2xhc3MgSU1lZGlhUmVjb3JkZXI7CkBAIC00OSw4ICs0OCw2IEBACiAgICAgdmlydHVhbCBzcDxJTWVkaWFNZXRhZGF0YVJldHJpZXZlcj4gY3JlYXRlTWV0YWRhdGFSZXRyaWV2ZXIoKSA9IDA7CiAgICAgdmlydHVhbCBzcDxJTWVkaWFQbGF5ZXI+IGNyZWF0ZShjb25zdCBzcDxJTWVkaWFQbGF5ZXJDbGllbnQ+JiBjbGllbnQsCiAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFKSA9IDA7Ci0gICAgdmlydHVhbCBzcDxJT01YPiAgICAgICAgICAgIGdldE9NWCgpID0gMDsKLSAgICB2aXJ0dWFsIHNwPElIRENQPiAgICAgICAgICAgbWFrZUhEQ1AoYm9vbCBjcmVhdGVFbmNyeXB0aW9uTW9kdWxlKSA9IDA7CiAgICAgdmlydHVhbCBzcDxJTWVkaWFDb2RlY0xpc3Q+IGdldENvZGVjTGlzdCgpIGNvbnN0ID0gMDsKIAogICAgIC8vIENvbm5lY3RzIHRvIGEgcmVtb3RlIGRpc3BsYXkuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVJlY29yZGVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVJlY29yZGVyLmgKaW5kZXggOWQwMzQxYS4uMzc5MDAwZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFSZWNvcmRlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUmVjb3JkZXIuaApAQCAtMTksNiArMTksOSBAQAogI2RlZmluZSBBTkRST0lEX0lNRURJQVJFQ09SREVSX0gKIAogI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWljcm9waG9uZUluZm8uaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNjQsNiArNjcsMTMgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2UoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRJbnB1dFN1cmZhY2UoY29uc3Qgc3A8UGVyc2lzdGVudFN1cmZhY2U+JiBzdXJmYWNlKSA9IDA7CiAgICAgdmlydHVhbCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBxdWVyeVN1cmZhY2VNZWRpYVNvdXJjZSgpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SW5wdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Um91dGVkRGV2aWNlSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCAqZGV2aWNlSWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBY3RpdmVNaWNyb3Bob25lcygKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKSA9IDA7CisKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhU291cmNlLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVNvdXJjZS5oCmluZGV4IDJiZGU3ODIuLjdhNGIxYjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhU291cmNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFTb3VyY2UuaApAQCAtMjIsMTMgKzIyLDEyIEBACiAKICNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IE1lZGlhU291cmNlOwotY2xhc3MgTWV0YURhdGE7CiBjbGFzcyBNZWRpYUJ1ZmZlckdyb3VwOwogCiBjbGFzcyBJTWVkaWFTb3VyY2UgOiBwdWJsaWMgSUludGVyZmFjZSB7CkBAIC01NSw1MSArNTQsNiBAQAogICAgIC8vIFJldHVybnMgdGhlIGZvcm1hdCBvZiB0aGUgZGF0YSBvdXRwdXQgYnkgdGhpcyBtZWRpYSBzb3VyY2UuCiAgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCkgPSAwOwogCi0gICAgLy8gT3B0aW9ucyB0aGF0IG1vZGlmeSByZWFkKCkgYmVoYXZpb3VyLiBUaGUgZGVmYXVsdCBpcyB0bwotICAgIC8vIGEpIG5vdCByZXF1ZXN0IGEgc2VlawotICAgIC8vIGIpIG5vdCBiZSBsYXRlLCBpLmUuIGxhdGVuZXNzX3VzID0gMAotICAgIHN0cnVjdCBSZWFkT3B0aW9ucyB7Ci0gICAgICAgIGVudW0gU2Vla01vZGUgOiBpbnQzMl90IHsKLSAgICAgICAgICAgIFNFRUtfUFJFVklPVVNfU1lOQywKLSAgICAgICAgICAgIFNFRUtfTkVYVF9TWU5DLAotICAgICAgICAgICAgU0VFS19DTE9TRVNUX1NZTkMsCi0gICAgICAgICAgICBTRUVLX0NMT1NFU1QsCi0gICAgICAgIH07Ci0KLSAgICAgICAgUmVhZE9wdGlvbnMoKTsKLQotICAgICAgICAvLyBSZXNldCBldmVyeXRoaW5nIGJhY2sgdG8gZGVmYXVsdHMuCi0gICAgICAgIHZvaWQgcmVzZXQoKTsKLQotICAgICAgICB2b2lkIHNldFNlZWtUbyhpbnQ2NF90IHRpbWVfdXMsIFNlZWtNb2RlIG1vZGUgPSBTRUVLX0NMT1NFU1RfU1lOQyk7Ci0gICAgICAgIHZvaWQgY2xlYXJTZWVrVG8oKTsKLSAgICAgICAgYm9vbCBnZXRTZWVrVG8oaW50NjRfdCAqdGltZV91cywgU2Vla01vZGUgKm1vZGUpIGNvbnN0OwotCi0gICAgICAgIC8vIFRPRE86IHJlbW92ZSB0aGlzIGlmIHVudXNlZC4KLSAgICAgICAgdm9pZCBzZXRMYXRlQnkoaW50NjRfdCBsYXRlbmVzc191cyk7Ci0gICAgICAgIGludDY0X3QgZ2V0TGF0ZUJ5KCkgY29uc3Q7Ci0KLSAgICAgICAgdm9pZCBzZXROb25CbG9ja2luZygpOwotICAgICAgICB2b2lkIGNsZWFyTm9uQmxvY2tpbmcoKTsKLSAgICAgICAgYm9vbCBnZXROb25CbG9ja2luZygpIGNvbnN0OwotCi0gICAgICAgIC8vIFVzZWQgdG8gY2xlYXIgYWxsIG5vbi1wZXJzaXN0ZW50IG9wdGlvbnMgZm9yIG11bHRpcGxlIGJ1ZmZlciByZWFkcy4KLSAgICAgICAgdm9pZCBjbGVhck5vblBlcnNpc3RlbnQoKSB7Ci0gICAgICAgICAgICBjbGVhclNlZWtUbygpOwotICAgICAgICB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBlbnVtIE9wdGlvbnMgewotICAgICAgICAgICAga1NlZWtUb19PcHRpb24gICAgICA9IDEsCi0gICAgICAgIH07Ci0KLSAgICAgICAgdWludDMyX3QgbU9wdGlvbnM7Ci0gICAgICAgIGludDY0X3QgbVNlZWtUaW1lVXM7Ci0gICAgICAgIFNlZWtNb2RlIG1TZWVrTW9kZTsKLSAgICAgICAgaW50NjRfdCBtTGF0ZW5lc3NVczsKLSAgICAgICAgYm9vbCBtTm9uQmxvY2tpbmc7Ci0gICAgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsgLy8gc2VudCB0aHJvdWdoIEJpbmRlcgotCiAgICAgLy8gUmV0dXJucyBhIG5ldyBidWZmZXIgb2YgZGF0YS4gQ2FsbCBibG9ja3MgdW50aWwgYQogICAgIC8vIGJ1ZmZlciBpcyBhdmFpbGFibGUsIGFuIGVycm9yIGlzIGVuY291bnRlcmVkIG9yIHRoZSBlbmQgb2YgdGhlIHN0cmVhbQogICAgIC8vIGlzIHJlYWNoZWQuCkBAIC0xMTAsNyArNjQsOCBAQAogICAgIC8vCiAgICAgLy8gVE9ETzogY29uc2lkZXIgcmVtb3ZpbmcgcmVhZCgpIGluIGZhdm9yIG9mIHJlYWRNdWx0aXBsZSgpLgogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpID0gMDsKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwKKyAgICAgICAgICAgIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpID0gMDsKIAogICAgIC8vIFJldHVybnMgYSB2ZWN0b3Igb2YgbmV3IGJ1ZmZlcnMgb2YgZGF0YSwgd2hlcmUgdGhlIG5ldyBidWZmZXJzIGFyZSBhZGRlZAogICAgIC8vIHRvIHRoZSBlbmQgb2YgdGhlIHZlY3Rvci4KQEAgLTEyNSw4ICs4MCw4IEBACiAgICAgLy8gUmVhZE9wdGlvbnMgbWF5IGJlIHNwZWNpZmllZC4gUGVyc2lzdGVudCBvcHRpb25zIGFwcGx5IHRvIGFsbCByZWFkczsKICAgICAvLyBub24tcGVyc2lzdGVudCBvcHRpb25zIChlLmcuIHNlZWspIGFwcGx5IG9ubHkgdG8gdGhlIGZpcnN0IHJlYWQuCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkTXVsdGlwbGUoCi0gICAgICAgICAgICBWZWN0b3I8TWVkaWFCdWZmZXIgKj4gKmJ1ZmZlcnMsIHVpbnQzMl90IG1heE51bUJ1ZmZlcnMgPSAxLAotICAgICAgICAgICAgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBudWxscHRyKSA9IDA7CisgICAgICAgICAgICBWZWN0b3I8TWVkaWFCdWZmZXJCYXNlICo+ICpidWZmZXJzLCB1aW50MzJfdCBtYXhOdW1CdWZmZXJzID0gMSwKKyAgICAgICAgICAgIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IG51bGxwdHIpID0gMDsKIAogICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB8cmVhZE11bHRpcGxlfCBpcyBzdXBwb3J0ZWQsIG90aGVyd2lzZSBmYWxzZS4KICAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydFJlYWRNdWx0aXBsZSgpID0gMDsKQEAgLTEzOSwxNCArOTQsNiBAQAogICAgIC8vIHVudGlsIGEgc3Vic2VxdWVudCByZWFkLXdpdGgtc2Vlay4gQ3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIGJ5CiAgICAgLy8gT01YQ29kZWMuCiAgICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpICA9IDA7Ci0KLSAgICAvLyBUaGUgY29uc3VtZXIgb2YgdGhpcyBtZWRpYSBzb3VyY2UgcmVxdWVzdHMgdGhhdCB0aGUgZ2l2ZW4gYnVmZmVycwotICAgIC8vIGFyZSB0byBiZSByZXR1cm5lZCBleGNsdXNpdmVseSBpbiByZXNwb25zZSB0byByZWFkIGNhbGxzLgotICAgIC8vIFRoaXMgd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgYSBzdWNjZXNzZnVsIHN0YXJ0KCkgYW5kIGJlZm9yZSB0aGUKLSAgICAvLyBmaXJzdCByZWFkKCkgY2FsbC4KLSAgICAvLyBDYWxsZWUgYXNzdW1lcyBvd25lcnNoaXAgb2YgdGhlIGJ1ZmZlcnMgaWYgbm8gZXJyb3IgaXMgcmV0dXJuZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJzKGNvbnN0IFZlY3RvcjxNZWRpYUJ1ZmZlciAqPiAmIC8qIGJ1ZmZlcnMgKi8pID0gMDsKLQogfTsKIAogY2xhc3MgQm5NZWRpYVNvdXJjZTogcHVibGljIEJuSW50ZXJmYWNlPElNZWRpYVNvdXJjZT4KQEAgLTE2MSwxNCArMTA4LDEwIEBACiAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlcnMoY29uc3QgVmVjdG9yPE1lZGlhQnVmZmVyICo+ICYgLyogYnVmZmVycyAqLykgewotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQotCiAgICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXMgZm9yIGxvY2FsIG1lZGlhIHNvdXJjZXMuCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkTXVsdGlwbGUoCi0gICAgICAgICAgICBWZWN0b3I8TWVkaWFCdWZmZXIgKj4gKiAvKiBidWZmZXJzICovLCB1aW50MzJfdCAvKiBtYXhOdW1CdWZmZXJzID0gMSAqLywKLSAgICAgICAgICAgIGNvbnN0IFJlYWRPcHRpb25zICogLyogb3B0aW9ucyA9IG51bGxwdHIgKi8pIHsKKyAgICAgICAgICAgIFZlY3RvcjxNZWRpYUJ1ZmZlckJhc2UgKj4gKiAvKiBidWZmZXJzICovLCB1aW50MzJfdCAvKiBtYXhOdW1CdWZmZXJzID0gMSAqLywKKyAgICAgICAgICAgIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqIC8qIG9wdGlvbnMgPSBudWxscHRyICovKSB7CiAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU9NWFN0b3JlLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lPTVhTdG9yZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjhkYjcwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU9NWFN0b3JlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0lPTVhTVE9SRV9IXwotCi0jZGVmaW5lIEFORFJPSURfSU9NWFNUT1JFX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9JT01YLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXhTdG9yZS5oPgotCi0jaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSUJpbmRlci5oPgotCi0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPHN0cmluZz4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi11c2luZyBoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDo6SU9teFN0b3JlOwotCi1jbGFzcyBJT01YU3RvcmUgOiBwdWJsaWMgSUludGVyZmFjZSB7Ci1wdWJsaWM6Ci0gICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShPTVhTdG9yZSk7Ci0KLSAgICBzdHJ1Y3QgQXR0cmlidXRlIHsKLSAgICAgICAgc3RkOjpzdHJpbmcga2V5OwotICAgICAgICBzdGQ6OnN0cmluZyB2YWx1ZTsKLSAgICB9OwotCi0gICAgc3RydWN0IE5vZGVJbmZvIHsKLSAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKLSAgICAgICAgc3RkOjpzdHJpbmcgb3duZXI7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPEF0dHJpYnV0ZT4gYXR0cmlidXRlczsKLSAgICB9OwotCi0gICAgc3RydWN0IFJvbGVJbmZvIHsKLSAgICAgICAgc3RkOjpzdHJpbmcgcm9sZTsKLSAgICAgICAgc3RkOjpzdHJpbmcgdHlwZTsKLSAgICAgICAgYm9vbCBpc0VuY29kZXI7Ci0gICAgICAgIGJvb2wgcHJlZmVyUGxhdGZvcm1Ob2RlczsKLSAgICAgICAgc3RkOjp2ZWN0b3I8Tm9kZUluZm8+IG5vZGVzOwotICAgIH07Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RTZXJ2aWNlQXR0cmlidXRlcygKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEF0dHJpYnV0ZT4qIGF0dHJpYnV0ZXMpID0gMDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Tm9kZVByZWZpeChzdGQ6OnN0cmluZyogcHJlZml4KSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RSb2xlcyhzdGQ6OnZlY3RvcjxSb2xlSW5mbz4qIHJvbGVMaXN0KSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE9teChjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgc3A8SU9NWD4qIG9teCkgPSAwOwotfTsKLQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1jbGFzcyBCbk9NWFN0b3JlIDogcHVibGljIEJuSW50ZXJmYWNlPElPTVhTdG9yZT4gewotcHVibGljOgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25UcmFuc2FjdCgKLSAgICAgICAgICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCAmZGF0YSwgUGFyY2VsICpyZXBseSwKLSAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIEFORFJPSURfSU9NWF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JU3RyZWFtU291cmNlLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lTdHJlYW1Tb3VyY2UuaAppbmRleCA0YTZhYWZkLi5jMDhjM2U4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lTdHJlYW1Tb3VyY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lTdHJlYW1Tb3VyY2UuaApAQCAtNTQsNDAgKzU0LDYgQEAKIAogICAgIHZpcnR1YWwgdm9pZCBxdWV1ZUJ1ZmZlcihzaXplX3QgaW5kZXgsIHNpemVfdCBzaXplKSA9IDA7CiAKLSAgICAvLyBXaGVuIHNpZ25hbGxpbmcgYSBkaXNjb250aW51aXR5IHlvdSBjYW4gb3B0aW9uYWxseQotICAgIC8vIHNwZWNpZnkgYW4gaW50NjRfdCBQVFMgdGltZXN0YW1wIGluICJtc2ciLgotICAgIC8vIElmIHByZXNlbnQsIHJlbmRlcmluZyBvZiBkYXRhIGZvbGxvd2luZyB0aGUgZGlzY29udGludWl0eQotICAgIC8vIHdpbGwgYmUgc3VwcHJlc3NlZCB1bnRpbCBtZWRpYSB0aW1lIHJlYWNoZXMgdGhpcyB0aW1lc3RhbXAuCi0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGtLZXlSZXN1bWVBdFBUUzsKLQotICAgIC8vIFdoZW4gc2lnbmFsbGluZyBhIGRpc2NvbnRpbnVpdHkgeW91IGNhbiBvcHRpb25hbGx5Ci0gICAgLy8gc3BlY2lmeSB0aGUgdHlwZShzKSBvZiBkaXNjb250aW51aXR5LCBpLmUuIGlmIHRoZQotICAgIC8vIGF1ZGlvIGZvcm1hdCBoYXMgY2hhbmdlZCwgdGhlIHZpZGVvIGZvcm1hdCBoYXMgY2hhbmdlZCwKLSAgICAvLyB0aW1lIGhhcyBqdW1wZWQgb3IgYW55IGNvbWJpbmF0aW9uIHRoZXJlb2YuCi0gICAgLy8gVG8gZG8gc28sIGluY2x1ZGUgYSBub24temVybyBpbnQzMl90IHZhbHVlCi0gICAgLy8gdW5kZXIgdGhlIGtleSAia0tleURpc2NvbnRpbnVpdHlNYXNrIiB3aGVuIGlzc3VpbmcgdGhlIERJU0NPTlRJTlVJVFkKLSAgICAvLyBjb21tYW5kLgotICAgIC8vIElmIHRoZXJlIGlzIGEgY2hhbmdlIGluIGF1ZGlvL3ZpZGVvIGZvcm1hdCwgVGhlIG5ldyBsb2dpY2FsIHN0cmVhbQotICAgIC8vIG11c3Qgc3RhcnQgd2l0aCBwcm9wZXIgY29kZWMgaW5pdGlhbGl6YXRpb24KLSAgICAvLyBpbmZvcm1hdGlvbiBmb3IgcGxheWJhY2sgdG8gY29udGludWUsIGkuZS4gU1BTIGFuZCBQUFMgaW4gdGhlIGNhc2UKLSAgICAvLyBvZiBBVkMgdmlkZW8gZXRjLgotICAgIC8vIElmIHRoaXMga2V5IGlzIG5vdCBwcmVzZW50LCBvbmx5IGEgdGltZSBkaXNjb250aW51aXR5IGlzIGFzc3VtZWQuCi0gICAgLy8gVGhlIHZhbHVlIHNob3VsZCBiZSBhIGJpdG1hc2sgb2YgdmFsdWVzIGZyb20KLSAgICAvLyBBVFNQYXJzZXI6OkRpc2NvbnRpbnVpdHlUeXBlLgotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBrS2V5RGlzY29udGludWl0eU1hc2s7Ci0KLSAgICAvLyBPcHRpb25hbGx5IHNpZ25hbGxlZCBhcyBwYXJ0IG9mIGEgZGlzY29udGludWl0eSB0aGF0IGluY2x1ZGVzCi0gICAgLy8gRElTQ09OVElOVUlUWV9USU1FLiBJdCBpbmRpY2F0ZXMgdGhlIG1lZGlhIHRpbWUgKGluIHVzKSB0byBiZSBhc3NvY2lhdGVkCi0gICAgLy8gd2l0aCB0aGUgbmV4dCBQVFMgb2NjdXJpbmcgaW4gdGhlIHN0cmVhbS4gVGhlIHZhbHVlIGlzIG9mIHR5cGUgaW50NjRfdC4KLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qga0tleU1lZGlhVGltZVVzOwotCi0gICAgLy8gT3B0aW9uYWxseSBzaWduYWxsZWQgYXMgcGFydCBvZiBhIGRpc2NvbnRpbnVpdHkgdGhhdCBpbmNsdWRlcwotICAgIC8vIERJU0NPTlRJTlVJVFlfVElNRS4gSXQgaW5kaWNhdGVzIHRoZSBtZWRpYSB0aW1lIChpbiB1cykgb2YgYSByZWNlbnQKLSAgICAvLyBzYW1wbGUgZnJvbSB0aGUgc2FtZSBjb250ZW50LCBhbmQgaXMgdXNlZCBhcyBhIGhpbnQgZm9yIHRoZSBwYXJzZXIgdG8KLSAgICAvLyBoYW5kbGUgUFRTIHdyYXBhcm91bmQuIFRoaXMgaXMgcmVxdWlyZWQgd2hlbiBhIG5ldyBwYXJzZXIgaXMgY3JlYXRlZAotICAgIC8vIHRvIGNvbnRpbnVlIHBhcnNpbmcgY29udGVudCBmcm9tIHRoZSBzYW1lIHRpbWVsaW5lLgotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBrS2V5UmVjZW50TWVkaWFUaW1lVXM7Ci0KICAgICB2aXJ0dWFsIHZvaWQgaXNzdWVDb21tYW5kKAogICAgICAgICAgICAgQ29tbWFuZCBjbWQsIGJvb2wgc3luY2hyb25vdXMsIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnID0gTlVMTCkgPSAwOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSkF1ZGlvQXR0cmlidXRlcy5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9KQXVkaW9BdHRyaWJ1dGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIxMTQzNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSkF1ZGlvQXR0cmlidXRlcy5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9KQVVESU9BVFRSSUJVVEVTX0gKKyNkZWZpbmUgQU5EUk9JRF9KQVVESU9BVFRSSUJVVEVTX0gKKworI2luY2x1ZGUgPGpuaS5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEpBdWRpb0F0dHJpYnV0ZXMgeworcHVibGljOgorICAgIC8qIENyZWF0ZXMgYSBKYXZhIEF1ZGlvQXR0cmlidXRlcyBvYmplY3QuICovCisgICAgc3RhdGljIGpvYmplY3QgY3JlYXRlQXVkaW9BdHRyaWJ1dGVzT2JqKEpOSUVudiAqZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpIHsKKworICAgICAgICBqY2xhc3MgakJ1aWxkZXJDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXMkQnVpbGRlciIpOworICAgICAgICBqbWV0aG9kSUQgakJ1aWxkZXJDdG9yID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgIjxpbml0PiIsICIoKVYiKTsKKyAgICAgICAgam9iamVjdCBqQnVpbGRlck9iaiA9IGVudi0+TmV3T2JqZWN0KGpCdWlsZGVyQ2xzLCBqQnVpbGRlckN0b3IpOworCisgICAgICAgIGlmIChwQXR0cmlidXRlcyAhPSBOVUxMKSB7CisgICAgICAgICAgICAvLyBJZiBwQXR0cmlidXRlcyBpcyBub3QgbnVsbCwgc3RyZWFtVHlwZSBpcyBpZ25vcmVkLgorICAgICAgICAgICAgam1ldGhvZElEIGpTZXRVc2FnZSA9IGVudi0+R2V0TWV0aG9kSUQoCisgICAgICAgICAgICAgICAgICAgIGpCdWlsZGVyQ2xzLCAic2V0VXNhZ2UiLCAiKEkpTGFuZHJvaWQvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzJEJ1aWxkZXI7Iik7CisgICAgICAgICAgICBqQnVpbGRlck9iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChqQnVpbGRlck9iaiwgalNldFVzYWdlLCBwQXR0cmlidXRlcy0+dXNhZ2UpOworCisgICAgICAgICAgICBqbWV0aG9kSUQgalNldENvbnRlbnRUeXBlID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgInNldENvbnRlbnRUeXBlIiwKKyAgICAgICAgICAgICAgICAgICAgIihJKUxhbmRyb2lkL21lZGlhL0F1ZGlvQXR0cmlidXRlcyRCdWlsZGVyOyIpOworICAgICAgICAgICAgakJ1aWxkZXJPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoakJ1aWxkZXJPYmosIGpTZXRDb250ZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgcEF0dHJpYnV0ZXMtPmNvbnRlbnRfdHlwZSk7CisKKyAgICAgICAgICAgIC8vIFRPRE86IEphdmEgQXVkaW9BdHRyaWJ1dGVzLkJ1aWxkZXIuc2V0Q2FwdHVyZVByZXNldCgpIGlzIHN5c3RlbUFwaSBhbmQgaGlkZGVuLgorICAgICAgICAgICAgLy8gQ2FuIHdlIHVzZSB0aGlzIG1ldGhvZD8KKy8vICAgICAgICAgICAgam1ldGhvZElEIGpTZXRDYXB0dXJlUHJlc2V0ID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgInNldENhcHR1cmVQcmVzZXQiLAorLy8gICAgICAgICAgICAgICAgICAgICIoSSlMYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXMkQnVpbGRlcjsiKTsKKy8vICAgICAgICAgICAgakJ1aWxkZXJPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoakJ1aWxkZXJPYmosIGpTZXRDYXB0dXJlUHJlc2V0LAorLy8gICAgICAgICAgICAgICAgICAgIHBBdHRyaWJ1dGVzLT5zb3VyY2UpOworCisgICAgICAgICAgICBqbWV0aG9kSUQgalNldEZsYWdzID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgInNldEZsYWdzIiwKKyAgICAgICAgICAgICAgICAgICAgIihJKUxhbmRyb2lkL21lZGlhL0F1ZGlvQXR0cmlidXRlcyRCdWlsZGVyOyIpOworICAgICAgICAgICAgakJ1aWxkZXJPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoakJ1aWxkZXJPYmosIGpTZXRGbGFncywgcEF0dHJpYnV0ZXMtPmZsYWdzKTsKKworICAgICAgICAgICAgLy8gVE9ETzogSGFuZGxlIHRoZSAndGFncycgKGNoYXJbXSB0byBIYXNoU2V0PFN0cmluZz4pLgorICAgICAgICAgICAgLy8gSG93IHRvIHBhcnNlIHRoZSBjaGFyW10/IElzIHRoZXJlIGFueSBleGFtcGxlIG9mIGl0PworICAgICAgICAgICAgLy8gQWxzbywgdGhlIGFkZFRhZ3MoKSBtZXRob2QgaXMgaGlkZGVuLgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gQ2FsbCBBdWRpb0F0dHJpYnV0ZXMuQnVpbGRlci5zZXRMZWdhY3lTdHJlYW1UeXBlKCkuYnVpbGQoKQorICAgICAgICAgICAgam1ldGhvZElEIGpTZXRMZWdhY3lTdHJlYW1UeXBlID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgInNldExlZ2FjeVN0cmVhbVR5cGUiLAorICAgICAgICAgICAgICAgICAgICAiKEkpTGFuZHJvaWQvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzJEJ1aWxkZXI7Iik7CisgICAgICAgICAgICBqQnVpbGRlck9iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChqQnVpbGRlck9iaiwgalNldExlZ2FjeVN0cmVhbVR5cGUsIHN0cmVhbVR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgam1ldGhvZElEIGpCdWlsZCA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICJidWlsZCIsCisgICAgICAgICAgICAgICAgIigpTGFuZHJvaWQvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzOyIpOworICAgICAgICByZXR1cm4gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGpCdWlsZGVyT2JqLCBqQnVpbGQpOworICAgIH0KKworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9KQVVESU9BVFRSSUJVVEVTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSkF1ZGlvRm9ybWF0LmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0pBdWRpb0Zvcm1hdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYWJkZmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0pBdWRpb0Zvcm1hdC5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9KQVVESU9GT1JNQVRfSAorI2RlZmluZSBBTkRST0lEX0pBVURJT0ZPUk1BVF9ICisKKyNpbmNsdWRlIDxhbmRyb2lkX21lZGlhX0F1ZGlvRm9ybWF0Lmg+CisjaW5jbHVkZSA8am5pLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgSkF1ZGlvRm9ybWF0IHsKK3B1YmxpYzoKKyAgICAvKiBDcmVhdGVzIGEgSmF2YSBBdWRpb0Zvcm1hdCBvYmplY3QuICovCisgICAgc3RhdGljIGpvYmplY3QgY3JlYXRlQXVkaW9Gb3JtYXRPYmooSk5JRW52ICplbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2spIHsKKworICAgICAgICBqY2xhc3MgakJ1aWxkZXJDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9BdWRpb0Zvcm1hdCRCdWlsZGVyIik7CisgICAgICAgIGptZXRob2RJRCBqQnVpbGRlckN0b3IgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAiPGluaXQ+IiwgIigpViIpOworICAgICAgICBqb2JqZWN0IGpCdWlsZGVyT2JqID0gZW52LT5OZXdPYmplY3QoakJ1aWxkZXJDbHMsIGpCdWlsZGVyQ3Rvcik7CisKKyAgICAgICAgaWYgKHNhbXBsZVJhdGUgPT0gMCkgeworICAgICAgICAgICAgamNsYXNzIGpBdWRpb0Zvcm1hdENscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL0F1ZGlvRm9ybWF0Iik7CisgICAgICAgICAgICBqZmllbGRJRCBqU2FtcGxlUmF0ZVVuc3BlY2lmaWVkID0KKyAgICAgICAgICAgICAgICAgICAgZW52LT5HZXRTdGF0aWNGaWVsZElEKGpBdWRpb0Zvcm1hdENscywgIlNBTVBMRV9SQVRFX1VOU1BFQ0lGSUVEIiwgIkkiKTsKKyAgICAgICAgICAgIHNhbXBsZVJhdGUgPSBlbnYtPkdldFN0YXRpY0ludEZpZWxkKGpBdWRpb0Zvcm1hdENscywgalNhbXBsZVJhdGVVbnNwZWNpZmllZCk7CisgICAgICAgIH0KKworICAgICAgICBqbWV0aG9kSUQgalNldEVuY29kaW5nID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgInNldEVuY29kaW5nIiwKKyAgICAgICAgICAgICAgICAiKEkpTGFuZHJvaWQvbWVkaWEvQXVkaW9Gb3JtYXQkQnVpbGRlcjsiKTsKKyAgICAgICAgakJ1aWxkZXJPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoakJ1aWxkZXJPYmosIGpTZXRFbmNvZGluZywKKyAgICAgICAgICAgICAgICBhdWRpb0Zvcm1hdEZyb21OYXRpdmUoZm9ybWF0KSk7CisKKyAgICAgICAgam1ldGhvZElEIGpTZXRTYW1wbGVSYXRlID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgInNldFNhbXBsZVJhdGUiLAorICAgICAgICAgICAgICAgICIoSSlMYW5kcm9pZC9tZWRpYS9BdWRpb0Zvcm1hdCRCdWlsZGVyOyIpOworICAgICAgICBqQnVpbGRlck9iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChqQnVpbGRlck9iaiwgalNldFNhbXBsZVJhdGUsIHNhbXBsZVJhdGUpOworCisgICAgICAgIGptZXRob2RJRCBqU2V0Q2hhbm5lbE1hc2sgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAic2V0Q2hhbm5lbE1hc2siLAorICAgICAgICAgICAgICAgICIoSSlMYW5kcm9pZC9tZWRpYS9BdWRpb0Zvcm1hdCRCdWlsZGVyOyIpOworICAgICAgICBqQnVpbGRlck9iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChqQnVpbGRlck9iaiwgalNldENoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgIG91dENoYW5uZWxNYXNrRnJvbU5hdGl2ZShjaGFubmVsTWFzaykpOworCisgICAgICAgIGptZXRob2RJRCBqQnVpbGQgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAiYnVpbGQiLCAiKClMYW5kcm9pZC9tZWRpYS9BdWRpb0Zvcm1hdDsiKTsKKyAgICAgICAgcmV0dXJuIGVudi0+Q2FsbE9iamVjdE1ldGhvZChqQnVpbGRlck9iaiwgakJ1aWxkKTsKKyAgICB9CisKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSkFVRElPRk9STUFUX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSmV0UGxheWVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0pldFBsYXllci5oCmluZGV4IDYzZDE5ODAuLmJiNTY5YmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSmV0UGxheWVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9KZXRQbGF5ZXIuaApAQCAtODcsNyArODcsNyBAQAogCiAgICAgaW50ICAgICAgICAgICAgICAgICBtTWF4VHJhY2tzOyAvLyBtYXggbnVtYmVyIG9mIE1JREkgdHJhY2tzLCB1c3VhbGx5IDMyCiAgICAgRUFTX0RBVEFfSEFORExFICAgICBtRWFzRGF0YTsKLSAgICBzcDxNaWRpSW9XcmFwcGVyPiAgIG1Jb1dyYXBwZXI7CisgICAgTWlkaUlvV3JhcHBlciogICAgICBtSW9XcmFwcGVyOwogICAgIEVBU19QQ00qICAgICAgICAgICAgbUF1ZGlvQnVmZmVyOy8vIEVBUyByZW5kZXJzIHRoZSBNSURJIGRhdGEgaW50byB0aGlzIGJ1ZmZlciwKICAgICBzcDxBdWRpb1RyYWNrPiAgICAgIG1BdWRpb1RyYWNrOyAvLyBhbmQgd2UgcGxheSBpdCBpbiB0aGlzIGF1ZGlvIHRyYWNrCiAgICAgaW50ICAgICAgICAgICAgICAgICBtVHJhY2tCdWZmZXJTaXplOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYUJ1ZmZlckhvbGRlci5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYUJ1ZmZlckhvbGRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ZGZkZjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhQnVmZmVySG9sZGVyLmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9CVUZGRVJfSE9MREVSX0hfCisKKyNkZWZpbmUgTUVESUFfQlVGRkVSX0hPTERFUl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IE1lZGlhQnVmZmVySG9sZGVyIDogcHVibGljIFJlZkJhc2UgeworICAgIE1lZGlhQnVmZmVySG9sZGVyKE1lZGlhQnVmZmVyQmFzZSogYnVmZmVyKQorICAgICAgICA6IG1NZWRpYUJ1ZmZlcihidWZmZXIpIHsKKyAgICAgICAgaWYgKG1NZWRpYUJ1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBtTWVkaWFCdWZmZXItPmFkZF9yZWYoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZpcnR1YWwgfk1lZGlhQnVmZmVySG9sZGVyKCkgeworICAgICAgICBpZiAobU1lZGlhQnVmZmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1NZWRpYUJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgTWVkaWFCdWZmZXJCYXNlKiBtZWRpYUJ1ZmZlcigpIHsgcmV0dXJuIG1NZWRpYUJ1ZmZlcjsgfQorCitwcml2YXRlOgorICAgIE1lZGlhQnVmZmVyQmFzZSogY29uc3QgbU1lZGlhQnVmZmVyOworfTsKKworfSAgLy8gYW5kcm9pZAorCisjZW5kaWYgIC8vIE1FRElBX0JVRkZFUl9IT0xERVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmgKaW5kZXggNTAxYzAwYi4uMmMxNmZiYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmgKQEAgLTUwLDkgKzUwLDYgQEAKICAgICBzaXplX3Qgb2Zmc2V0KCkgY29uc3Q7CiAgICAgLy8gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjYWxscyBBQnVmZmVyOjpzZXRSYW5nZSgpIGFuZCByZXR1cm5zIE9LLgogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UmFuZ2Uoc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpOwotICAgIC8vIFRPRE86IFRoZXNlIGNhbiBiZSByZW1vdmVkIGlmIHdlIGZpbmlzaCByZXBsYWNpbmcgYWxsIE1lZGlhQnVmZmVyJ3MuCi0gICAgTWVkaWFCdWZmZXJCYXNlICpnZXRNZWRpYUJ1ZmZlckJhc2UoKTsKLSAgICB2b2lkIHNldE1lZGlhQnVmZmVyQmFzZShNZWRpYUJ1ZmZlckJhc2UgKm1lZGlhQnVmZmVyKTsKIAogICAgIC8vIFRPRE86IFNwZWNpZnkgZWFjaCBmaWVsZCBmb3IgbWV0YS9mb3JtYXQuCiAgICAgc3A8QU1lc3NhZ2U+IG1ldGEoKTsKQEAgLTY2LDcgKzYzLDYgQEAKICAgICBjb25zdCBzcDxBTWVzc2FnZT4gbU1ldGE7CiAgICAgc3A8QU1lc3NhZ2U+IG1Gb3JtYXQ7CiAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gbUJ1ZmZlcjsKLSAgICBNZWRpYUJ1ZmZlckJhc2UgKm1NZWRpYUJ1ZmZlckJhc2U7CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYUNvZGVjSW5mby5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYUNvZGVjSW5mby5oCmluZGV4IGFiMmNkMjQuLmIzNzc3ZDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFDb2RlY0luZm8uaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhQ29kZWNJbmZvLmgKQEAgLTE3MCw2ICsxNzAsNyBAQAogICAgICAqIEN1cnJlbnRseSwgdGhpcyBpcyB0aGUgImluc3RhbmNlIG5hbWUiIG9mIHRoZSBJT214IHNlcnZpY2UuCiAgICAgICovCiAgICAgY29uc3QgY2hhciAqZ2V0T3duZXJOYW1lKCkgY29uc3Q7CisgICAgdWludDMyX3QgcmFuaygpIGNvbnN0OwogCiAgICAgLyoqCiAgICAgICogU2VyaWFsaXphdGlvbiBvdmVyIEJpbmRlcgpAQCAtMTgyLDYgKzE4Myw3IEBACiAgICAgQVN0cmluZyBtT3duZXI7CiAgICAgYm9vbCBtSXNFbmNvZGVyOwogICAgIEtleWVkVmVjdG9yPEFTdHJpbmcsIHNwPENhcGFiaWxpdGllcz4gPiBtQ2FwczsKKyAgICB1aW50MzJfdCBtUmFuazsKIAogICAgIHNzaXplX3QgZ2V0Q2FwYWJpbGl0eUluZGV4KGNvbnN0IGNoYXIgKm1pbWUpIGNvbnN0OwogCkBAIC0yNTIsNiArMjU0LDEzIEBACiAgICAgICogQHJldHVybiBgdHJ1ZWAgaWYgYG1pbWVgIGlzIHJlbW92ZWQ7IGBmYWxzZWAgaWYgYG1pbWVgIGlzIG5vdCBmb3VuZC4KICAgICAgKi8KICAgICBib29sIHJlbW92ZU1pbWUoY29uc3QgY2hhciogbWltZSk7CisgICAgLyoqCisgICAgICogU2V0IHJhbmsgb2YgdGhlIGNvZGVjLiBNZWRpYUNvZGVjTGlzdCB3aWxsIHN0YWJsZS1zb3J0IHRoZSBsaXN0IGFjY29yZGluZworICAgICAqIHRvIHJhbmsgaW4gbm9uLWRlc2NlbmRpbmcgb3JkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmFuayBUaGUgcmFuayBvZiB0aGUgY29tcG9uZW50LgorICAgICAqLworICAgIHZvaWQgc2V0UmFuayh1aW50MzJfdCByYW5rKTsKIHByaXZhdGU6CiAgICAgLyoqCiAgICAgICogVGhlIGFzc29jaWF0ZWQgYE1lZGlhQ29kZWNJbmZvYC4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFEZWZzLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhRGVmcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjE3MDEzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFEZWZzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRURJQV9ERUZTX0hfCi0KLSNkZWZpbmUgTUVESUFfREVGU19IXwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9JTUFHRV9KUEVHOwotCi1leHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fVlA4OwotZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOTsKLWV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19BVkM7Ci1leHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQzsKLWV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNDsKLWV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzOwotZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyOwotZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1JBVzsKLWV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19ET0xCWV9WSVNJT047Ci1leHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fU0NSQU1CTEVEOwotCi1leHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05COwotZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQjsKLWV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHOyAgICAgICAgICAgLy8gbGF5ZXIgSUlJCi1leHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR19MQVlFUl9JOwotZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX01QRUdfTEFZRVJfSUk7Ci1leHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fTUlESTsKLWV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUM7Ci1leHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fUUNFTFA7Ci1leHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTOwotZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX09QVVM7Ci1leHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9BTEFXOwotZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfTUxBVzsKLWV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19SQVc7Ci1leHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRkxBQzsKLWV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUUzsKLWV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19NU0dTTTsKLWV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQzM7Ci1leHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDMzsKLWV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19TQ1JBTUJMRUQ7Ci0KLWV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzQ7Ci1leHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX1dBVjsKLWV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfT0dHOwotZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NQVRST1NLQTsKLWV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzJUUzsKLWV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfQVZJOwotZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHMlBTOwotCi1leHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVEVYVF8zR1BQOwotZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1RFWFRfU1VCUklQOwotZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1RFWFRfVlRUOwotZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1RFWFRfQ0VBXzYwODsKLWV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9URVhUX0NFQV83MDg7Ci1leHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfREFUQV9USU1FRF9JRDM7Ci0KLS8vIFRoZXNlIGFyZSB2YWx1ZXMgZXhwb3J0ZWQgdG8gSkFWQSBBUEkgdGhhdCBuZWVkIHRvIGJlIGluIHN5bmMgd2l0aAotLy8gZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb0Zvcm1hdC5qYXZhLiBVbmZvcnR1bmF0ZWx5LAotLy8gdGhleSBhcmUgbm90IGRlZmluZWQgaW4gZnJhbWV3b3Jrcy9hdiwgc28gZGVmaW5pbmcgdGhlbSBoZXJlLgotZW51bSBBdWRpb0VuY29kaW5nIHsKLSAgICBrQXVkaW9FbmNvZGluZ1BjbTE2Yml0ID0gMiwKLSAgICBrQXVkaW9FbmNvZGluZ1BjbThiaXQgPSAzLAotICAgIGtBdWRpb0VuY29kaW5nUGNtRmxvYXQgPSA0LAotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBNRURJQV9ERUZTX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhSFRUUENvbm5lY3Rpb24uaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFIVFRQQ29ubmVjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ODEzYTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhSFRUUENvbm5lY3Rpb24uaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX0hUVFBfQ09OTkVDVElPTl9IXworCisjZGVmaW5lIE1FRElBX0hUVFBfQ09OTkVDVElPTl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgTWVkaWFIVFRQQ29ubmVjdGlvbiA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UgeworICAgIE1lZGlhSFRUUENvbm5lY3Rpb24oKSB7fQorCisgICAgdmlydHVhbCBib29sIGNvbm5lY3QoCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmksIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgZGlzY29ubmVjdCgpID0gMDsKKyAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgPSAwOworICAgIHZpcnR1YWwgb2ZmNjRfdCBnZXRTaXplKCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TUlNRVR5cGUoU3RyaW5nOCAqbWltZVR5cGUpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFVyaShTdHJpbmc4ICp1cmkpID0gMDsKKworcHJpdmF0ZToKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNZWRpYUhUVFBDb25uZWN0aW9uKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfSFRUUF9DT05ORUNUSU9OX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhSFRUUFNlcnZpY2UuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFIVFRQU2VydmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlOWYxMjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhSFRUUFNlcnZpY2UuaApAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX0hUVFBfU0VSVklDRV9IXworCisjZGVmaW5lIE1FRElBX0hUVFBfU0VSVklDRV9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBNZWRpYUhUVFBDb25uZWN0aW9uOworCitzdHJ1Y3QgTWVkaWFIVFRQU2VydmljZSA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UgeworICAgIE1lZGlhSFRUUFNlcnZpY2UoKSB7fQorCisgICAgdmlydHVhbCBzcDxNZWRpYUhUVFBDb25uZWN0aW9uPiBtYWtlSFRUUENvbm5lY3Rpb24oKSA9IDA7CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTWVkaWFIVFRQU2VydmljZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1FRElBX0hUVFBfU0VSVklDRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhTWV0YWRhdGFSZXRyaWV2ZXJJbnRlcmZhY2UuaAppbmRleCAyNTcwMDJkLi45OGQzMDBmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhTWV0YWRhdGFSZXRyaWV2ZXJJbnRlcmZhY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhTWV0YWRhdGFSZXRyaWV2ZXJJbnRlcmZhY2UuaApAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPG1lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXNjYW5uZXIuaD4KICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL1ZpZGVvRnJhbWUuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTQxLDI3ICs0MiwyMCBAQAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldERhdGFTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZT4mIHNvdXJjZSwgY29uc3QgY2hhciAqbWltZSkgPSAwOwotICAgIHZpcnR1YWwgVmlkZW9GcmFtZSogZ2V0RnJhbWVBdFRpbWUoCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXREYXRhU291cmNlKGNvbnN0IHNwPERhdGFTb3VyY2U+JiBzb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUpID0gMDsKKyAgICB2aXJ0dWFsIHNwPElNZW1vcnk+IGdldEZyYW1lQXRUaW1lKAogICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMsIGludCBvcHRpb24sIGludCBjb2xvckZvcm1hdCwgYm9vbCBtZXRhT25seSkgPSAwOworICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gZ2V0SW1hZ2VBdEluZGV4KAorICAgICAgICAgICAgaW50IGluZGV4LCBpbnQgY29sb3JGb3JtYXQsIGJvb2wgbWV0YU9ubHksIGJvb2wgdGh1bWJuYWlsKSA9IDA7CisgICAgdmlydHVhbCBzcDxJTWVtb3J5PiBnZXRJbWFnZVJlY3RBdEluZGV4KAorICAgICAgICAgICAgaW50IGluZGV4LCBpbnQgY29sb3JGb3JtYXQsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20pID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lQXRJbmRleCgKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHNwPElNZW1vcnk+ID4qIGZyYW1lcywKKyAgICAgICAgICAgIGludCBmcmFtZUluZGV4LCBpbnQgbnVtRnJhbWVzLCBpbnQgY29sb3JGb3JtYXQsIGJvb2wgbWV0YU9ubHkpID0gMDsKICAgICB2aXJ0dWFsIE1lZGlhQWxidW1BcnQqIGV4dHJhY3RBbGJ1bUFydCgpID0gMDsKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIGV4dHJhY3RNZXRhZGF0YShpbnQga2V5Q29kZSkgPSAwOwogfTsKIAotLy8gTWVkaWFNZXRhZGF0YVJldHJpZXZlckludGVyZmFjZQotY2xhc3MgTWVkaWFNZXRhZGF0YVJldHJpZXZlckludGVyZmFjZSA6IHB1YmxpYyBNZWRpYU1ldGFkYXRhUmV0cmlldmVyQmFzZQotewotcHVibGljOgotICAgIE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXJJbnRlcmZhY2UoKSB7fQotCi0gICAgdmlydHVhbCAgICAgICAgICAgICB+TWVkaWFNZXRhZGF0YVJldHJpZXZlckludGVyZmFjZSgpIHt9Ci0gICAgdmlydHVhbCBWaWRlb0ZyYW1lKiBnZXRGcmFtZUF0VGltZSgKLSAgICAgICAgICAgIGludDY0X3QgLyp0aW1lVXMqLywgaW50IC8qb3B0aW9uKi8sIGludCAvKmNvbG9yRm9ybWF0Ki8sIGJvb2wgLyptZXRhT25seSovKQotICAgIHsgcmV0dXJuIE5VTEw7IH0KLSAgICB2aXJ0dWFsIE1lZGlhQWxidW1BcnQqIGV4dHJhY3RBbGJ1bUFydCgpIHsgcmV0dXJuIE5VTEw7IH0KLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIGV4dHJhY3RNZXRhZGF0YShpbnQgLyprZXlDb2RlKi8pIHsgcmV0dXJuIE5VTEw7IH0KLX07Ci0KIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAvLyBBTkRST0lEX01FRElBTUVUQURBVEFSRVRSSUVWRVJJTlRFUkZBQ0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVJlY29yZGVyQmFzZS5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVJlY29yZGVyQmFzZS5oCmluZGV4IDQwZGQ5ZjkuLjUzNDBkZGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZWNvcmRlckJhc2UuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhUmVjb3JkZXJCYXNlLmgKQEAgLTE4LDEwICsxOCwxNCBAQAogCiAjZGVmaW5lIE1FRElBX1JFQ09SREVSX0JBU0VfSF8KIAorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CisjaW5jbHVkZSA8bWVkaWEvTWljcm9waG9uZUluZm8uaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXJlY29yZGVyLmg+CiAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KIAorI2luY2x1ZGUgPHZlY3Rvcj4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjbGFzcyBJQ2FtZXJhUmVjb3JkaW5nUHJveHk7CkBAIC02Miw2ICs2NiwxMyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldElucHV0U3VyZmFjZShjb25zdCBzcDxQZXJzaXN0ZW50U3VyZmFjZT4mIHN1cmZhY2UpID0gMDsKICAgICB2aXJ0dWFsIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IHF1ZXJ5U3VyZmFjZU1lZGlhU291cmNlKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SW5wdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Um91dGVkRGV2aWNlSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCogZGV2aWNlSWQpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0QXVkaW9EZXZpY2VDYWxsYmFjayhjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBlbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QWN0aXZlTWljcm9waG9uZXMoCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBhY3RpdmVNaWNyb3Bob25lcykgPSAwOworCiAKIAogcHJvdGVjdGVkOgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVJlc291cmNlLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhUmVzb3VyY2UuaAppbmRleCAxOTU3YTQ1Li5lMWZkYjliIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhUmVzb3VyY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhUmVzb3VyY2UuaApAQCAtMjksNyArMjksOCBAQAogICAgICAgICBrVW5zcGVjaWZpZWQgPSAwLAogICAgICAgICBrU2VjdXJlQ29kZWMsCiAgICAgICAgIGtOb25TZWN1cmVDb2RlYywKLSAgICAgICAga0dyYXBoaWNNZW1vcnkKKyAgICAgICAga0dyYXBoaWNNZW1vcnksCisgICAgICAgIGtDcHVCb29zdCwKICAgICB9OwogCiAgICAgZW51bSBTdWJUeXBlIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWlkaUlvV3JhcHBlci5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NaWRpSW9XcmFwcGVyLmgKaW5kZXggZTZmOGNmNy4uYjVlNTY1ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NaWRpSW9XcmFwcGVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NaWRpSW9XcmFwcGVyLmgKQEAgLTE5LDE1ICsxOSwxNSBAQAogCiAjaW5jbHVkZSA8bGlic29uaXZveC9lYXNfdHlwZXMuaD4KIAotI2luY2x1ZGUgIm1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaCIKKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIE1pZGlJb1dyYXBwZXIgOiBwdWJsaWMgUmVmQmFzZSB7CitjbGFzcyBNaWRpSW9XcmFwcGVyIHsKIHB1YmxpYzoKLSAgICBNaWRpSW9XcmFwcGVyKGNvbnN0IGNoYXIgKnBhdGgpOwotICAgIE1pZGlJb1dyYXBwZXIoaW50IGZkLCBvZmY2NF90IG9mZnNldCwgaW50NjRfdCBzaXplKTsKLSAgICBNaWRpSW9XcmFwcGVyKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UpOworICAgIGV4cGxpY2l0IE1pZGlJb1dyYXBwZXIoY29uc3QgY2hhciAqcGF0aCk7CisgICAgZXhwbGljaXQgTWlkaUlvV3JhcHBlcihpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBpbnQ2NF90IHNpemUpOworICAgIGV4cGxpY2l0IE1pZGlJb1dyYXBwZXIoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CiAKICAgICB+TWlkaUlvV3JhcHBlcigpOwogCkBAIC00MCw3ICs0MCw3IEBACiAgICAgaW50IG1GZDsKICAgICBvZmY2NF90IG1CYXNlOwogICAgIGludDY0X3QgIG1MZW5ndGg7Ci0gICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7CisgICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOwogICAgIEVBU19GSUxFIG1FYXNGaWxlOwogfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9OZGtXcmFwcGVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL05ka1dyYXBwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTdkMTcxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9OZGtXcmFwcGVyLmgKQEAgLTAsMCArMSwzNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTkRLX1dSQVBQRVJfSF8KKworI2RlZmluZSBOREtfV1JBUFBFUl9IXworCisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFEYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvQ3J5cHRvQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworc3RydWN0IEFNZWRpYUNvZGVjOworc3RydWN0IEFNZWRpYUNvZGVjQnVmZmVySW5mbzsKK3N0cnVjdCBBTWVkaWFDb2RlY0NyeXB0b0luZm87CitzdHJ1Y3QgQU1lZGlhQ3J5cHRvOworc3RydWN0IEFNZWRpYURybTsKK3N0cnVjdCBBTWVkaWFGb3JtYXQ7CitzdHJ1Y3QgQU1lZGlhRXh0cmFjdG9yOworc3RydWN0IEFOYXRpdmVXaW5kb3c7CitzdHJ1Y3QgUHNzaEluZm87CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFNZXNzYWdlOworY2xhc3MgTWV0YURhdGE7CisKK3N0cnVjdCBBTWVkaWFGb3JtYXRXcmFwcGVyIDogcHVibGljIFJlZkJhc2UgeworCisgICAgc3RhdGljIHNwPEFNZWRpYUZvcm1hdFdyYXBwZXI+IENyZWF0ZShjb25zdCBzcDxBTWVzc2FnZT4gJm1lc3NhZ2UpOworCisgICAgQU1lZGlhRm9ybWF0V3JhcHBlcigpOworICAgIEFNZWRpYUZvcm1hdFdyYXBwZXIoQU1lZGlhRm9ybWF0ICphTWVkaWFGb3JtYXQpOworCisgICAgLy8gdGhlIHJldHVybmVkIEFNZWRpYUZvcm1hdCBpcyBzdGlsbCBvd25lZCBieSB0aGlzIHdyYXBwZXIuCisgICAgQU1lZGlhRm9ybWF0ICpnZXRBTWVkaWFGb3JtYXQoKSBjb25zdDsKKworICAgIHNwPEFNZXNzYWdlPiB0b0FNZXNzYWdlKCkgY29uc3QgOworICAgIHZvaWQgd3JpdGVUb0FNZXNzYWdlKHNwPEFNZXNzYWdlPiYpIGNvbnN0IDsKKyAgICBjb25zdCBjaGFyKiB0b1N0cmluZygpIGNvbnN0IDsKKworICAgIHN0YXR1c190IHJlbGVhc2UoKTsKKworICAgIGJvb2wgZ2V0SW50MzIoY29uc3QgY2hhciAqbmFtZSwgaW50MzJfdCAqb3V0KSBjb25zdDsKKyAgICBib29sIGdldEludDY0KGNvbnN0IGNoYXIgKm5hbWUsIGludDY0X3QgKm91dCkgY29uc3Q7CisgICAgYm9vbCBnZXRGbG9hdChjb25zdCBjaGFyICpuYW1lLCBmbG9hdCAqb3V0KSBjb25zdDsKKyAgICBib29sIGdldERvdWJsZShjb25zdCBjaGFyICpuYW1lLCBkb3VibGUgKm91dCkgY29uc3Q7CisgICAgYm9vbCBnZXRTaXplKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCAqb3V0KSBjb25zdDsKKyAgICBib29sIGdldFJlY3QoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgaW50MzJfdCAqbGVmdCwgaW50MzJfdCAqdG9wLCBpbnQzMl90ICpyaWdodCwgaW50MzJfdCAqYm90dG9tKSBjb25zdDsKKyAgICBib29sIGdldEJ1ZmZlcihjb25zdCBjaGFyICpuYW1lLCB2b2lkKiogZGF0YSwgc2l6ZV90ICpvdXRzaXplKSBjb25zdDsKKyAgICBib29sIGdldFN0cmluZyhjb25zdCBjaGFyICpuYW1lLCBBU3RyaW5nICpvdXQpIGNvbnN0OworCisgICAgdm9pZCBzZXRJbnQzMihjb25zdCBjaGFyKiBuYW1lLCBpbnQzMl90IHZhbHVlKTsKKyAgICB2b2lkIHNldEludDY0KGNvbnN0IGNoYXIqIG5hbWUsIGludDY0X3QgdmFsdWUpOworICAgIHZvaWQgc2V0RmxvYXQoY29uc3QgY2hhciogbmFtZSwgZmxvYXQgdmFsdWUpOworICAgIHZvaWQgc2V0RG91YmxlKGNvbnN0IGNoYXIgKm5hbWUsIGRvdWJsZSB2YWx1ZSk7CisgICAgdm9pZCBzZXRTaXplKGNvbnN0IGNoYXIqIG5hbWUsIHNpemVfdCB2YWx1ZSk7CisgICAgdm9pZCBzZXRSZWN0KGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgICAgICAgICAgIGludDMyX3QgbGVmdCwgaW50MzJfdCB0b3AsIGludDMyX3QgcmlnaHQsIGludDMyX3QgYm90dG9tKTsKKyAgICB2b2lkIHNldFN0cmluZyhjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBBU3RyaW5nICZ2YWx1ZSk7CisgICAgdm9pZCBzZXRCdWZmZXIoY29uc3QgY2hhciogbmFtZSwgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+QU1lZGlhRm9ybWF0V3JhcHBlcigpOworCitwcml2YXRlOgorICAgIEFNZWRpYUZvcm1hdCAqbUFNZWRpYUZvcm1hdDsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFNZWRpYUZvcm1hdFdyYXBwZXIpOworfTsKKworc3RydWN0IEFOYXRpdmVXaW5kb3dXcmFwcGVyIDogcHVibGljIFJlZkJhc2UgeworICAgIEFOYXRpdmVXaW5kb3dXcmFwcGVyKEFOYXRpdmVXaW5kb3cgKmFOYXRpdmVXaW5kb3cpOworCisgICAgLy8gdGhlIHJldHVybmVkIEFOYXRpdmVXaW5kb3cgaXMgc3RpbGwgb3duZWQgYnkgdGhpcyB3cmFwcGVyLgorICAgIEFOYXRpdmVXaW5kb3cgKmdldEFOYXRpdmVXaW5kb3coKSBjb25zdDsKKworICAgIHN0YXR1c190IHJlbGVhc2UoKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkFOYXRpdmVXaW5kb3dXcmFwcGVyKCk7CisKK3ByaXZhdGU6CisgICAgQU5hdGl2ZVdpbmRvdyAqbUFOYXRpdmVXaW5kb3c7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBTmF0aXZlV2luZG93V3JhcHBlcik7Cit9OworCitzdHJ1Y3QgQU1lZGlhRHJtV3JhcHBlciA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBBTWVkaWFEcm1XcmFwcGVyKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0pOworICAgIEFNZWRpYURybVdyYXBwZXIoQU1lZGlhRHJtICphTWVkaWFEcm0pOworCisgICAgLy8gdGhlIHJldHVybmVkIEFNZWRpYURybSBpcyBzdGlsbCBvd25lZCBieSB0aGlzIHdyYXBwZXIuCisgICAgQU1lZGlhRHJtICpnZXRBTWVkaWFEcm0oKSBjb25zdDsKKworICAgIHN0YXR1c190IHJlbGVhc2UoKTsKKworICAgIHN0YXRpYyBib29sIGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IGNoYXIgKm1pbWVUeXBlKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkFNZWRpYURybVdyYXBwZXIoKTsKKworcHJpdmF0ZToKKyAgICBBTWVkaWFEcm0gKm1BTWVkaWFEcm07CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBTWVkaWFEcm1XcmFwcGVyKTsKK307CisKK3N0cnVjdCBBTWVkaWFDcnlwdG9XcmFwcGVyIDogcHVibGljIFJlZkJhc2UgeworICAgIEFNZWRpYUNyeXB0b1dyYXBwZXIoY29uc3QgdWludDhfdCB1dWlkWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmluaXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluaXREYXRhU2l6ZSk7CisgICAgQU1lZGlhQ3J5cHRvV3JhcHBlcihBTWVkaWFDcnlwdG8gKmFNZWRpYUNyeXB0byk7CisKKyAgICAvLyB0aGUgcmV0dXJuZWQgQU1lZGlhQ3J5cHRvIGlzIHN0aWxsIG93bmVkIGJ5IHRoaXMgd3JhcHBlci4KKyAgICBBTWVkaWFDcnlwdG8gKmdldEFNZWRpYUNyeXB0bygpIGNvbnN0OworCisgICAgc3RhdHVzX3QgcmVsZWFzZSgpOworCisgICAgYm9vbCBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90IHV1aWRbMTZdKTsKKworICAgIGJvb2wgcmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50KGNvbnN0IGNoYXIgKm1pbWUpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+QU1lZGlhQ3J5cHRvV3JhcHBlcigpOworCitwcml2YXRlOgorICAgIEFNZWRpYUNyeXB0byAqbUFNZWRpYUNyeXB0bzsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFNZWRpYUNyeXB0b1dyYXBwZXIpOworfTsKKworc3RydWN0IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXIgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgc3RhdGljIHNwPEFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXI+IENyZWF0ZShNZXRhRGF0YUJhc2UgJm1ldGEpOworCisgICAgQU1lZGlhQ29kZWNDcnlwdG9JbmZvV3JhcHBlcihpbnQgbnVtc3Vic2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qga2V5WzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgaXZbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3J5cHRvUGx1Z2luOjpNb2RlIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmNsZWFyYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmVuY3J5cHRlZGJ5dGVzKTsKKyAgICBBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyKEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyAqYU1lZGlhQ29kZWNDcnlwdG9JbmZvKTsKKworICAgIC8vIHRoZSByZXR1cm5lZCBBTWVkaWFDcnlwdG9JbmZvIGlzIHN0aWxsIG93bmVkIGJ5IHRoaXMgd3JhcHBlci4KKyAgICBBTWVkaWFDb2RlY0NyeXB0b0luZm8gKmdldEFNZWRpYUNvZGVjQ3J5cHRvSW5mbygpIGNvbnN0OworCisgICAgc3RhdHVzX3QgcmVsZWFzZSgpOworCisgICAgdm9pZCBzZXRQYXR0ZXJuKENyeXB0b1BsdWdpbjo6UGF0dGVybiAqcGF0dGVybik7CisKKyAgICBzaXplX3QgZ2V0TnVtU3ViU2FtcGxlcygpOworCisgICAgc3RhdHVzX3QgZ2V0S2V5KHVpbnQ4X3QgKmRzdCk7CisKKyAgICBzdGF0dXNfdCBnZXRJVih1aW50OF90ICpkc3QpOworCisgICAgQ3J5cHRvUGx1Z2luOjpNb2RlIGdldE1vZGUoKTsKKworICAgIHN0YXR1c190IGdldENsZWFyQnl0ZXMoc2l6ZV90ICpkc3QpOworCisgICAgc3RhdHVzX3QgZ2V0RW5jcnlwdGVkQnl0ZXMoc2l6ZV90ICpkc3QpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+QU1lZGlhQ29kZWNDcnlwdG9JbmZvV3JhcHBlcigpOworCitwcml2YXRlOgorICAgIEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyAqbUFNZWRpYUNvZGVjQ3J5cHRvSW5mbzsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXIpOworfTsKKworc3RydWN0IEFNZWRpYUNvZGVjV3JhcHBlciA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBlbnVtIHsKKyAgICAgICAgQ0JfSU5QVVRfQVZBSUxBQkxFID0gMSwKKyAgICAgICAgQ0JfT1VUUFVUX0FWQUlMQUJMRSA9IDIsCisgICAgICAgIENCX0VSUk9SID0gMywKKyAgICAgICAgQ0JfT1VUUFVUX0ZPUk1BVF9DSEFOR0VEID0gNCwKKyAgICB9OworCisgICAgc3RhdGljIHNwPEFNZWRpYUNvZGVjV3JhcHBlcj4gQ3JlYXRlQ29kZWNCeU5hbWUoY29uc3QgQVN0cmluZyAmbmFtZSk7CisgICAgc3RhdGljIHNwPEFNZWRpYUNvZGVjV3JhcHBlcj4gQ3JlYXRlRGVjb2RlckJ5VHlwZShjb25zdCBBU3RyaW5nICZtaW1lVHlwZSk7CisKKyAgICBzdGF0aWMgdm9pZCBPbklucHV0QXZhaWxhYmxlQ0IoQU1lZGlhQ29kZWMgKmNvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbmRleCk7CisgICAgc3RhdGljIHZvaWQgT25PdXRwdXRBdmFpbGFibGVDQihBTWVkaWFDb2RlYyAqY29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFDb2RlY0J1ZmZlckluZm8gKmJ1ZmZlckluZm8pOworICAgIHN0YXRpYyB2b2lkIE9uRm9ybWF0Q2hhbmdlZENCKEFNZWRpYUNvZGVjICpjb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKmZvcm1hdCk7CisgICAgc3RhdGljIHZvaWQgT25FcnJvckNCKEFNZWRpYUNvZGVjICpjb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhX3N0YXR1c190IGVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBhY3Rpb25Db2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXRhaWwpOworCisgICAgQU1lZGlhQ29kZWNXcmFwcGVyKEFNZWRpYUNvZGVjICphTWVkaWFDb2RlYyk7CisKKyAgICAvLyB0aGUgcmV0dXJuZWQgQU1lZGlhQ29kZWMgaXMgc3RpbGwgb3duZWQgYnkgdGhpcyB3cmFwcGVyLgorICAgIEFNZWRpYUNvZGVjICpnZXRBTWVkaWFDb2RlYygpIGNvbnN0OworCisgICAgc3RhdHVzX3QgcmVsZWFzZSgpOworCisgICAgc3RhdHVzX3QgZ2V0TmFtZShBU3RyaW5nKiBvdXRDb21wb25lbnROYW1lKSBjb25zdDsKKworICAgIHN0YXR1c190IGNvbmZpZ3VyZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZWRpYUZvcm1hdFdyYXBwZXI+ICZmb3JtYXQsCisgICAgICAgICAgICBjb25zdCBzcDxBTmF0aXZlV2luZG93V3JhcHBlcj4gJm53dywKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZWRpYUNyeXB0b1dyYXBwZXI+ICZjcnlwdG8sCisgICAgICAgICAgICB1aW50MzJfdCBmbGFncyk7CisKKyAgICBzdGF0dXNfdCBzZXRDYWxsYmFjayhjb25zdCBzcDxBTWVzc2FnZT4gJmNhbGxiYWNrKTsKKworICAgIHN0YXR1c190IHJlbGVhc2VDcnlwdG8oKTsKKworICAgIHN0YXR1c190IHN0YXJ0KCk7CisgICAgc3RhdHVzX3Qgc3RvcCgpOworICAgIHN0YXR1c190IGZsdXNoKCk7CisKKyAgICB1aW50OF90KiBnZXRJbnB1dEJ1ZmZlcihzaXplX3QgaWR4LCBzaXplX3QgKm91dF9zaXplKTsKKyAgICB1aW50OF90KiBnZXRPdXRwdXRCdWZmZXIoc2l6ZV90IGlkeCwgc2l6ZV90ICpvdXRfc2l6ZSk7CisKKyAgICBzdGF0dXNfdCBxdWV1ZUlucHV0QnVmZmVyKAorICAgICAgICAgICAgc2l6ZV90IGlkeCwKKyAgICAgICAgICAgIHNpemVfdCBvZmZzZXQsCisgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgIHVpbnQ2NF90IHRpbWUsCisgICAgICAgICAgICB1aW50MzJfdCBmbGFncyk7CisKKyAgICBzdGF0dXNfdCBxdWV1ZVNlY3VyZUlucHV0QnVmZmVyKAorICAgICAgICAgICAgc2l6ZV90IGlkeCwKKyAgICAgICAgICAgIHNpemVfdCBvZmZzZXQsCisgICAgICAgICAgICBzcDxBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyPiAmY29kZWNDcnlwdG9JbmZvLAorICAgICAgICAgICAgdWludDY0X3QgdGltZSwKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKTsKKworICAgIHNwPEFNZWRpYUZvcm1hdFdyYXBwZXI+IGdldE91dHB1dEZvcm1hdCgpOworICAgIHNwPEFNZWRpYUZvcm1hdFdyYXBwZXI+IGdldElucHV0Rm9ybWF0KCk7CisKKyAgICBzdGF0dXNfdCByZWxlYXNlT3V0cHV0QnVmZmVyKHNpemVfdCBpZHgsIGJvb2wgcmVuZGVyKTsKKworICAgIHN0YXR1c190IHNldE91dHB1dFN1cmZhY2UoY29uc3Qgc3A8QU5hdGl2ZVdpbmRvd1dyYXBwZXI+ICZud3cpOworCisgICAgc3RhdHVzX3QgcmVsZWFzZU91dHB1dEJ1ZmZlckF0VGltZShzaXplX3QgaWR4LCBpbnQ2NF90IHRpbWVzdGFtcE5zKTsKKworICAgIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lZGlhRm9ybWF0V3JhcHBlcj4gJnBhcmFtcyk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5BTWVkaWFDb2RlY1dyYXBwZXIoKTsKKworcHJpdmF0ZToKKyAgICBBTWVkaWFDb2RlYyAqbUFNZWRpYUNvZGVjOworCisgICAgc3A8QU1lc3NhZ2U+IG1DYWxsYmFjazsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFNZWRpYUNvZGVjV3JhcHBlcik7Cit9OworCitzdHJ1Y3QgQU1lZGlhRXh0cmFjdG9yV3JhcHBlciA6IHB1YmxpYyBSZWZCYXNlIHsKKworICAgIEFNZWRpYUV4dHJhY3RvcldyYXBwZXIoQU1lZGlhRXh0cmFjdG9yICphTWVkaWFFeHRyYWN0b3IpOworCisgICAgLy8gdGhlIHJldHVybmVkIEFNZWRpYUV4dHJhY3RvciBpcyBzdGlsbCBvd25lZCBieSB0aGlzIHdyYXBwZXIuCisgICAgQU1lZGlhRXh0cmFjdG9yICpnZXRBTWVkaWFFeHRyYWN0b3IoKSBjb25zdDsKKworICAgIHN0YXR1c190IHJlbGVhc2UoKTsKKworICAgIHN0YXR1c190IGRpc2Nvbm5lY3QoKTsKKworICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgpOworCisgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShjb25zdCBjaGFyICpsb2NhdGlvbik7CisKKyAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKEFNZWRpYURhdGFTb3VyY2UgKik7CisKKyAgICBzaXplX3QgZ2V0VHJhY2tDb3VudCgpOworCisgICAgc3A8QU1lZGlhRm9ybWF0V3JhcHBlcj4gZ2V0Rm9ybWF0KCk7CisKKyAgICBzcDxBTWVkaWFGb3JtYXRXcmFwcGVyPiBnZXRUcmFja0Zvcm1hdChzaXplX3QgaWR4KTsKKworICAgIHN0YXR1c190IHNlbGVjdFRyYWNrKHNpemVfdCBpZHgpOworCisgICAgc3RhdHVzX3QgdW5zZWxlY3RUcmFjayhzaXplX3QgaWR4KTsKKworICAgIHN0YXR1c190IHNlbGVjdFNpbmdsZVRyYWNrKHNpemVfdCBpZHgpOworCisgICAgc3NpemVfdCByZWFkU2FtcGxlRGF0YShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKKworICAgIHNzaXplX3QgZ2V0U2FtcGxlU2l6ZSgpOworCisgICAgdWludDMyX3QgZ2V0U2FtcGxlRmxhZ3MoKTsKKworICAgIGludCBnZXRTYW1wbGVUcmFja0luZGV4KCk7CisKKyAgICBpbnQ2NF90IGdldFNhbXBsZVRpbWUoKTsKKworICAgIHN0YXR1c190IGdldFNhbXBsZUZvcm1hdChzcDxBTWVkaWFGb3JtYXRXcmFwcGVyPiAmZm9ybWF0V3JhcHBlcik7CisKKyAgICBpbnQ2NF90IGdldENhY2hlZER1cmF0aW9uKCk7CisKKyAgICBib29sIGFkdmFuY2UoKTsKKworICAgIHN0YXR1c190IHNlZWtUbyhpbnQ2NF90IHNlZWtQb3NVcywgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlKTsKKworICAgIC8vIHRoZSByZXR1cm5lZCBQc3NoSW5mbyBpcyBzdGlsbCBvd25lZCBieSB0aGlzIHdyYXBwZXIuCisgICAgUHNzaEluZm8qIGdldFBzc2hJbmZvKCk7CisKKyAgICBzcDxBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyPiBnZXRTYW1wbGVDcnlwdG9JbmZvKCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5BTWVkaWFFeHRyYWN0b3JXcmFwcGVyKCk7CisKK3ByaXZhdGU6CisgICAgQU1lZGlhRXh0cmFjdG9yICptQU1lZGlhRXh0cmFjdG9yOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQU1lZGlhRXh0cmFjdG9yV3JhcHBlcik7Cit9OworCitzdHJ1Y3QgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIgOiBwdWJsaWMgUmVmQmFzZSB7CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgdHJhbnNsYXRlX2Vycm9yKG1lZGlhX3N0YXR1c190IGVycik7CisKKyAgICBzdGF0aWMgc3NpemVfdCBBTWVkaWFEYXRhU291cmNlV3JhcHBlcl9nZXRTaXplKHZvaWQgKnVzZXJkYXRhKTsKKworICAgIHN0YXRpYyBzc2l6ZV90IEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyX3JlYWRBdCh2b2lkICp1c2VyZGF0YSwgb2ZmNjRfdCBvZmZzZXQsIHZvaWQgKiBidWYsIHNpemVfdCBzaXplKTsKKworICAgIHN0YXRpYyB2b2lkIEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyX2Nsb3NlKHZvaWQgKnVzZXJkYXRhKTsKKworICAgIEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZkYXRhU291cmNlKTsKKworICAgIEFNZWRpYURhdGFTb3VyY2UgKmdldEFNZWRpYURhdGFTb3VyY2UoKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKCk7CisKK3ByaXZhdGU6CisgICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7CisKKyAgICBBTWVkaWFEYXRhU291cmNlICptQU1lZGlhRGF0YVNvdXJjZTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTkRLX1dSQVBQRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvT01YQnVmZmVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL09NWEJ1ZmZlci5oCmluZGV4IDNlODQ4NTguLjljOWY1ZTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvT01YQnVmZmVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9PTVhCdWZmZXIuaApAQCAtOTEsNiArOTEsNyBAQAogCiBwcml2YXRlOgogICAgIGZyaWVuZCBzdHJ1Y3QgT01YTm9kZUluc3RhbmNlOworICAgIGZyaWVuZCBzdHJ1Y3QgQzJPTVhOb2RlOwogCiAgICAgLy8gVGhpcyBpcyBuZWVkZWQgdGVtcG9yYXJpbHkgZm9yIE9NWCBISURMIHRyYW5zaXRpb24uCiAgICAgZnJpZW5kIGlubGluZSBib29sICg6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOjppbXBsZW1lbnRhdGlvbjo6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvUGx1Z2luTWV0cmljc1JlcG9ydGluZy5oCmluZGV4IDRhNWEzNjMuLmUwMGJkNDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvUGx1Z2luTWV0cmljc1JlcG9ydGluZy5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvUGx1Z2luTWV0cmljc1JlcG9ydGluZy5oCkBAIC0yMCwxMyArMjAsMTMgQEAKIAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdGF0dXNfdCByZXBvcnREcm1QbHVnaW5NZXRyaWNzKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2VyaWFsaXplZE1ldHJpY3MsCitzdGF0dXNfdCByZXBvcnREcm1QbHVnaW5NZXRyaWNzKGNvbnN0IHN0ZDo6c3RyaW5nJiBiNjRFbmNvZGVkTWV0cmljcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgdmVuZG9yTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgZGVzY3JpcHRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBkZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYXBwUGFja2FnZU5hbWUpOwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1RpbWVDaGVjay5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9UaW1lQ2hlY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzVmNjU2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9UaW1lQ2hlY2suaApAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjaWZuZGVmIEFORFJPSURfVElNRV9DSEVDS19ICisjZGVmaW5lIEFORFJPSURfVElNRV9DSEVDS19ICisKKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1RocmVhZC5oPgorCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gQSBjbGFzcyBtb25pdG9yaW5nIGV4ZWN1dGlvbiB0aW1lIGZvciBhIGNvZGUgYmxvY2sgKHNjb3BlZCB2YXJpYWJsZSkgYW5kIGNhdXNpbmcgYW4gYXNzZXJ0CisvLyBpZiBpdCBleGNlZWRzIGEgY2VydGFpbiB0aW1lCisKK2NsYXNzIFRpbWVDaGVjayB7CitwdWJsaWM6CisKKyAgICAvLyBUaGUgZGVmYXVsdCB0aW1lb3V0IGlzIGNob3NlbiB0byBiZSBsZXNzIHRoYW4gc3lzdGVtIHNlcnZlciB3YXRjaGRvZyB0aW1lb3V0CisgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrRGVmYXVsdFRpbWVPdXRNcyA9IDUwMDA7CisKKyAgICAgICAgICAgIFRpbWVDaGVjayhjb25zdCBjaGFyICp0YWcsIHVpbnQzMl90IHRpbWVvdXRNcyA9IGtEZWZhdWx0VGltZU91dE1zKTsKKyAgICAgICAgICAgIH5UaW1lQ2hlY2soKTsKKworcHJpdmF0ZToKKworICAgIGNsYXNzIFRpbWVDaGVja1RocmVhZCA6IHB1YmxpYyBUaHJlYWQgeworICAgIHB1YmxpYzoKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVDaGVja1RocmVhZCgpIHt9CisgICAgICAgIHZpcnR1YWwgICAgICAgICAgICAgflRpbWVDaGVja1RocmVhZCgpIG92ZXJyaWRlOworCisgICAgICAgICAgICAgICAgbnNlY3NfdCAgICAgc3RhcnRNb25pdG9yaW5nKGNvbnN0IGNoYXIgKnRhZywgdWludDMyX3QgdGltZW91dE1zKTsKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzdG9wTW9uaXRvcmluZyhuc2Vjc190IGVuZFRpbWVOcyk7CisKKyAgICBwcml2YXRlOgorCisgICAgICAgICAgICAgICAgLy8gUmVmQmFzZQorICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIG9uRmlyc3RSZWYoKSBvdmVycmlkZSB7IHJ1bigiVGltZUNoZWNrVGhyZWFkIiwgUFJJT1JJVFlfVVJHRU5UX0FVRElPKTsgfQorCisgICAgICAgICAgICAgICAgLy8gVGhyZWFkCisgICAgICAgIHZpcnR1YWwgYm9vbCAgICAgICAgdGhyZWFkTG9vcCgpIG92ZXJyaWRlOworCisgICAgICAgICAgICAgICAgQ29uZGl0aW9uICAgICAgICAgICBtQ29uZDsKKyAgICAgICAgICAgICAgICBNdXRleCAgICAgICAgICAgICAgIG1NdXRleDsKKyAgICAgICAgICAgICAgICAvLyB1c2luZyB0aGUgZW5kIHRpbWUgaW4gbnMgYXMga2V5IGlzIE9LIGdpdmVuIHRoZSByaXNrIGlzIGxvdyB0aGF0IHR3byBlbnRyaWVzCisgICAgICAgICAgICAgICAgLy8gYXJlIGFkZGVkIGluIHN1Y2ggYSB3YXkgdGhhdCA8YWRkIHRpbWU+ICsgPHRpbWVvdXQ+IGFyZSB0aGUgc2FtZSBmb3IgYm90aC4KKyAgICAgICAgICAgICAgICBLZXllZFZlY3RvcjwgbnNlY3NfdCwgY29uc3QgY2hhcio+ICBtTW9uaXRvclJlcXVlc3RzOworICAgIH07CisKKyAgICBzdGF0aWMgc3A8VGltZUNoZWNrVGhyZWFkPiBnZXRUaW1lQ2hlY2tUaHJlYWQoKTsKKworICAgIGNvbnN0ICAgICAgICAgICBuc2Vjc190IG1FbmRUaW1lTnM7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfVElNRV9DSEVDS19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1R5cGVDb252ZXJ0ZXIuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvVHlwZUNvbnZlcnRlci5oCmluZGV4IDg0ZTIyYjEuLjg2ZjBkNGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvVHlwZUNvbnZlcnRlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvVHlwZUNvbnZlcnRlci5oCkBAIC04MCw2ICs4MCwxMSBAQAogICAgIHR5cGVkZWYgYXVkaW9fbW9kZV90IFR5cGU7CiAgICAgdHlwZWRlZiBWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKIH07CitzdHJ1Y3QgQXVkaW9Db250ZW50VHJhaXRzCit7CisgICAgdHlwZWRlZiBhdWRpb19jb250ZW50X3R5cGVfdCBUeXBlOworICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Cit9Owogc3RydWN0IFVzYWdlVHJhaXRzCiB7CiAgICAgdHlwZWRlZiBhdWRpb191c2FnZV90IFR5cGU7CkBAIC0yMjYsNiArMjMxLDcgQEAKIHR5cGVkZWYgVHlwZUNvbnZlcnRlcjxHYWluTW9kZVRyYWl0cz4gR2Fpbk1vZGVDb252ZXJ0ZXI7CiB0eXBlZGVmIFR5cGVDb252ZXJ0ZXI8U3RyZWFtVHJhaXRzPiBTdHJlYW1UeXBlQ29udmVydGVyOwogdHlwZWRlZiBUeXBlQ29udmVydGVyPEF1ZGlvTW9kZVRyYWl0cz4gQXVkaW9Nb2RlQ29udmVydGVyOwordHlwZWRlZiBUeXBlQ29udmVydGVyPEF1ZGlvQ29udGVudFRyYWl0cz4gQXVkaW9Db250ZW50VHlwZUNvbnZlcnRlcjsKIHR5cGVkZWYgVHlwZUNvbnZlcnRlcjxVc2FnZVRyYWl0cz4gVXNhZ2VUeXBlQ29udmVydGVyOwogdHlwZWRlZiBUeXBlQ29udmVydGVyPFNvdXJjZVRyYWl0cz4gU291cmNlVHlwZUNvbnZlcnRlcjsKIApAQCAtMjQwLDYgKzI0Niw3IEBACiB0ZW1wbGF0ZTw+IGNvbnN0IEdhaW5Nb2RlQ29udmVydGVyOjpUYWJsZSBHYWluTW9kZUNvbnZlcnRlcjo6bVRhYmxlW107CiB0ZW1wbGF0ZTw+IGNvbnN0IFN0cmVhbVR5cGVDb252ZXJ0ZXI6OlRhYmxlIFN0cmVhbVR5cGVDb252ZXJ0ZXI6Om1UYWJsZVtdOwogdGVtcGxhdGU8PiBjb25zdCBBdWRpb01vZGVDb252ZXJ0ZXI6OlRhYmxlIEF1ZGlvTW9kZUNvbnZlcnRlcjo6bVRhYmxlW107Cit0ZW1wbGF0ZTw+IGNvbnN0IEF1ZGlvQ29udGVudFR5cGVDb252ZXJ0ZXI6OlRhYmxlIEF1ZGlvQ29udGVudFR5cGVDb252ZXJ0ZXI6Om1UYWJsZVtdOwogdGVtcGxhdGU8PiBjb25zdCBVc2FnZVR5cGVDb252ZXJ0ZXI6OlRhYmxlIFVzYWdlVHlwZUNvbnZlcnRlcjo6bVRhYmxlW107CiB0ZW1wbGF0ZTw+IGNvbnN0IFNvdXJjZVR5cGVDb252ZXJ0ZXI6OlRhYmxlIFNvdXJjZVR5cGVDb252ZXJ0ZXI6Om1UYWJsZVtdOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5oCmluZGV4IDY1YzI2NmIuLmNkZWY2MzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5oCkBAIC01OSw2ICs1OSwxNSBAQAogICAgIE1FVEFEQVRBX0tFWV9MT0NBVElPTiAgICAgICAgPSAyMywKICAgICBNRVRBREFUQV9LRVlfVklERU9fUk9UQVRJT04gID0gMjQsCiAgICAgTUVUQURBVEFfS0VZX0NBUFRVUkVfRlJBTUVSQVRFID0gMjUsCisgICAgTUVUQURBVEFfS0VZX0hBU19JTUFHRSAgICAgICA9IDI2LAorICAgIE1FVEFEQVRBX0tFWV9JTUFHRV9DT1VOVCAgICAgPSAyNywKKyAgICBNRVRBREFUQV9LRVlfSU1BR0VfUFJJTUFSWSAgID0gMjgsCisgICAgTUVUQURBVEFfS0VZX0lNQUdFX1dJRFRIICAgICA9IDI5LAorICAgIE1FVEFEQVRBX0tFWV9JTUFHRV9IRUlHSFQgICAgPSAzMCwKKyAgICBNRVRBREFUQV9LRVlfSU1BR0VfUk9UQVRJT04gID0gMzEsCisgICAgTUVUQURBVEFfS0VZX1ZJREVPX0ZSQU1FX0NPVU5UICA9IDMyLAorICAgIE1FVEFEQVRBX0tFWV9FWElGX09GRlNFVCAgICAgPSAzMywKKyAgICBNRVRBREFUQV9LRVlfRVhJRl9MRU5HVEggICAgID0gMzQsCiAKICAgICAvLyBBZGQgbW9yZSBoZXJlLi4uCiB9OwpAQCAtODAsNiArODksMTMgQEAKICAgICAgICAgICAgIGNvbnN0IHNwPElEYXRhU291cmNlPiYgZGF0YVNvdXJjZSwgY29uc3QgY2hhciAqbWltZSA9IE5VTEwpOwogICAgIHNwPElNZW1vcnk+IGdldEZyYW1lQXRUaW1lKGludDY0X3QgdGltZVVzLCBpbnQgb3B0aW9uLAogICAgICAgICAgICAgaW50IGNvbG9yRm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1LCBib29sIG1ldGFPbmx5ID0gZmFsc2UpOworICAgIHNwPElNZW1vcnk+IGdldEltYWdlQXRJbmRleChpbnQgaW5kZXgsCisgICAgICAgICAgICBpbnQgY29sb3JGb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1JHQl81NjUsIGJvb2wgbWV0YU9ubHkgPSBmYWxzZSwgYm9vbCB0aHVtYm5haWwgPSBmYWxzZSk7CisgICAgc3A8SU1lbW9yeT4gZ2V0SW1hZ2VSZWN0QXRJbmRleCgKKyAgICAgICAgICAgIGludCBpbmRleCwgaW50IGNvbG9yRm9ybWF0LCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tKTsKKyAgICBzdGF0dXNfdCBnZXRGcmFtZUF0SW5kZXgoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzcDxJTWVtb3J5PiA+ICpmcmFtZXMsIGludCBmcmFtZUluZGV4LCBpbnQgbnVtRnJhbWVzID0gMSwKKyAgICAgICAgICAgIGludCBjb2xvckZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfUkdCXzU2NSwgYm9vbCBtZXRhT25seSA9IGZhbHNlKTsKICAgICBzcDxJTWVtb3J5PiBleHRyYWN0QWxidW1BcnQoKTsKICAgICBjb25zdCBjaGFyKiBleHRyYWN0TWV0YWRhdGEoaW50IGtleUNvZGUpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhcGxheWVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhcGxheWVyLmgKaW5kZXggNjIzYzM3NC4uMjMzNWM1YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYXBsYXllci5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvbWVkaWFwbGF5ZXIuaApAQCAtMTcsNiArMTcsOCBAQAogI2lmbmRlZiBBTkRST0lEX01FRElBUExBWUVSX0gKICNkZWZpbmUgQU5EUk9JRF9NRURJQVBMQVlFUl9ICiAKKyNpbmNsdWRlIDxtZWRpYS9tZWRpYXBsYXllcl9jb21tb24uaD4KKwogI2luY2x1ZGUgPGFycGEvaW5ldC5oPgogCiAjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KQEAgLTUwLDEyICs1MiwxNSBAQAogICAgIE1FRElBX1BBVVNFRCAgICAgICAgICAgID0gNywKICAgICBNRURJQV9TVE9QUEVEICAgICAgICAgICA9IDgsCiAgICAgTUVESUFfU0tJUFBFRCAgICAgICAgICAgPSA5LAorICAgIE1FRElBX05PVElGWV9USU1FICAgICAgID0gOTgsCiAgICAgTUVESUFfVElNRURfVEVYVCAgICAgICAgPSA5OSwKICAgICBNRURJQV9FUlJPUiAgICAgICAgICAgICA9IDEwMCwKICAgICBNRURJQV9JTkZPICAgICAgICAgICAgICA9IDIwMCwKICAgICBNRURJQV9TVUJUSVRMRV9EQVRBICAgICA9IDIwMSwKICAgICBNRURJQV9NRVRBX0RBVEEgICAgICAgICA9IDIwMiwKICAgICBNRURJQV9EUk1fSU5GTyAgICAgICAgICA9IDIxMCwKKyAgICBNRURJQV9USU1FX0RJU0NPTlRJTlVJVFkgPSAyMTEsCisgICAgTUVESUFfQVVESU9fUk9VVElOR19DSEFOR0VEID0gMTAwMDAsCiB9OwogCiAvLyBHZW5lcmljIGVycm9yIGNvZGVzIGZvciB0aGUgbWVkaWEgcGxheWVyIGZyYW1ld29yay4gIEVycm9ycyBhcmUgZmF0YWwsIHRoZQpAQCAtMTg2LDE2ICsxOTEsNiBAQAogICAgIElOVk9LRV9JRF9HRVRfU0VMRUNURURfVFJBQ0sgPSA3CiB9OwogCi0vLyBLZWVwIE1FRElBX1RSQUNLX1RZUEVfKiBpbiBzeW5jIHdpdGggTWVkaWFQbGF5ZXIuamF2YS4KLWVudW0gbWVkaWFfdHJhY2tfdHlwZSB7Ci0gICAgTUVESUFfVFJBQ0tfVFlQRV9VTktOT1dOID0gMCwKLSAgICBNRURJQV9UUkFDS19UWVBFX1ZJREVPID0gMSwKLSAgICBNRURJQV9UUkFDS19UWVBFX0FVRElPID0gMiwKLSAgICBNRURJQV9UUkFDS19UWVBFX1RJTUVEVEVYVCA9IDMsCi0gICAgTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRSA9IDQsCi0gICAgTUVESUFfVFJBQ0tfVFlQRV9NRVRBREFUQSA9IDUsCi19OwotCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyByZWYtY291bnRlZCBvYmplY3QgZm9yIGNhbGxiYWNrcwogY2xhc3MgTWVkaWFQbGF5ZXJMaXN0ZW5lcjogdmlydHVhbCBwdWJsaWMgUmVmQmFzZQpAQCAtMjI1LDcgKzIyMCw2IEBACiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0VmlkZW9TdXJmYWNlVGV4dHVyZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBidWZmZXJQcm9kdWNlcik7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0TGlzdGVuZXIoY29uc3Qgc3A8TWVkaWFQbGF5ZXJMaXN0ZW5lcj4mIGxpc3RlbmVyKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBnZXREZWZhdWx0QnVmZmVyaW5nU2V0dGluZ3MoQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBnZXRCdWZmZXJpbmdTZXR0aW5ncyhCdWZmZXJpbmdTZXR0aW5ncyogYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiBidWZmZXJpbmcpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHByZXBhcmUoKTsKQEAgLTI0NSw2ICsyMzksNyBAQAogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNlZWtUbygKICAgICAgICAgICAgICAgICAgICAgaW50IG1zZWMsCiAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyU2Vla01vZGUgbW9kZSA9IE1lZGlhUGxheWVyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQyk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgbm90aWZ5QXQoaW50NjRfdCBtZWRpYVRpbWVVcyk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0Q3VycmVudFBvc2l0aW9uKGludCAqbXNlYyk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0RHVyYXRpb24oaW50ICptc2VjKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICByZXNldCgpOwpAQCAtMjY2LDEzICsyNjEsMTcgQEAKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRSZXRyYW5zbWl0RW5kcG9pbnQoY29uc3QgY2hhciogYWRkclN0cmluZywgdWludDE2X3QgcG9ydCk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0TmV4dE1lZGlhUGxheWVyKGNvbnN0IHNwPE1lZGlhUGxheWVyPiYgcGxheWVyKTsKIAotICAgICAgICAgICAgVm9sdW1lU2hhcGVyOjpTdGF0dXMgYXBwbHlWb2x1bWVTaGFwZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24+JiBjb25maWd1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+JiBvcGVyYXRpb24pOwotICAgICAgICAgICAgc3A8Vm9sdW1lU2hhcGVyOjpTdGF0ZT4gZ2V0Vm9sdW1lU2hhcGVyU3RhdGUoaW50IGlkKTsKKyAgICAgICAgICAgIG1lZGlhOjpWb2x1bWVTaGFwZXI6OlN0YXR1cyBhcHBseVZvbHVtZVNoYXBlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24+JiBjb25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPiYgb3BlcmF0aW9uKTsKKyAgICAgICAgICAgIHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6OlN0YXRlPiBnZXRWb2x1bWVTaGFwZXJTdGF0ZShpbnQgaWQpOwogICAgICAgICAgICAgLy8gTW9kdWxhciBEUk0KICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBwcmVwYXJlRHJtKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgZHJtU2Vzc2lvbklkKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICByZWxlYXNlRHJtKCk7CisgICAgICAgICAgICAvLyBBdWRpb1JvdXRpbmcKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCk7CisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldFJvdXRlZERldmljZUlkKCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpOwogCiBwcml2YXRlOgogICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIGNsZWFyX2woKTsKQEAgLTMwOSw3ICszMDgsNiBAQAogICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICBtU2VuZExldmVsOwogICAgIHN0cnVjdCBzb2NrYWRkcl9pbiAgICAgICAgICBtUmV0cmFuc21pdEVuZHBvaW50OwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtUmV0cmFuc21pdEVuZHBvaW50VmFsaWQ7Ci0gICAgQnVmZmVyaW5nU2V0dGluZ3MgICAgICAgICAgIG1DdXJyZW50QnVmZmVyaW5nU2V0dGluZ3M7CiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYXBsYXllcl9jb21tb24uaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvbWVkaWFwbGF5ZXJfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVhMDEzNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvbWVkaWFwbGF5ZXJfY29tbW9uLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBUExBWUVSX0NPTU1PTl9ICisjZGVmaW5lIEFORFJPSURfTUVESUFQTEFZRVJfQ09NTU9OX0gKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBLZWVwIE1FRElBX1RSQUNLX1RZUEVfKiBpbiBzeW5jIHdpdGggTWVkaWFQbGF5ZXIuamF2YS4KK2VudW0gbWVkaWFfdHJhY2tfdHlwZSB7CisgICAgTUVESUFfVFJBQ0tfVFlQRV9VTktOT1dOID0gMCwKKyAgICBNRURJQV9UUkFDS19UWVBFX1ZJREVPID0gMSwKKyAgICBNRURJQV9UUkFDS19UWVBFX0FVRElPID0gMiwKKyAgICBNRURJQV9UUkFDS19UWVBFX1RJTUVEVEVYVCA9IDMsCisgICAgTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRSA9IDQsCisgICAgTUVESUFfVFJBQ0tfVFlQRV9NRVRBREFUQSA9IDUsCit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9NRURJQVBMQVlFUl9DT01NT05fSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYXJlY29yZGVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaAppbmRleCAwNzFlN2ExLi5kOGIwZmU3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaApAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVJlY29yZGVyQ2xpZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhRGVhdGhOb3RpZmllci5oPgorI2luY2x1ZGUgPG1lZGlhL01pY3JvcGhvbmVJbmZvLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNzcsNiArNzgsOSBAQAogICAgIC8qIFZQOC9WT1JCSVMgZGF0YSBpbiBhIFdFQk0gY29udGFpbmVyICovCiAgICAgT1VUUFVUX0ZPUk1BVF9XRUJNID0gOSwKIAorICAgIC8qIEhFSUMgZGF0YSBpbiBhIEhFSUYgY29udGFpbmVyICovCisgICAgT1VUUFVUX0ZPUk1BVF9IRUlGID0gMTAsCisKICAgICBPVVRQVVRfRk9STUFUX0xJU1RfRU5EIC8vIG11c3QgYmUgbGFzdCAtIHVzZWQgdG8gdmFsaWRhdGUgZm9ybWF0IHR5cGUKIH07CiAKQEAgLTEzOCw2ICsxNDIsOCBAQAogICAgIE1FRElBX1JFQ09SREVSX1RSQUNLX0VWRU5UX0VSUk9SICAgICAgICAgICAgICA9IDEwMCwKICAgICBNRURJQV9SRUNPUkRFUl9UUkFDS19FVkVOVF9JTkZPICAgICAgICAgICAgICAgPSAxMDEsCiAgICAgTUVESUFfUkVDT1JERVJfVFJBQ0tfRVZFTlRfTElTVF9FTkQgICAgICAgICAgID0gMTAwMCwKKworICAgIE1FRElBX1JFQ09SREVSX0FVRElPX1JPVVRJTkdfQ0hBTkdFRCAgICAgICAgICA9IDEwMDAwLAogfTsKIAogLyoKQEAgLTI1MCw2ICsyNTYsMTAgQEAKICAgICBzdGF0dXNfdCAgICBzZXRJbnB1dFN1cmZhY2UoY29uc3Qgc3A8UGVyc2lzdGVudFN1cmZhY2U+JiBzdXJmYWNlKTsKICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAgICAgcXVlcnlTdXJmYWNlTWVkaWFTb3VyY2VGcm9tTWVkaWFTZXJ2ZXIoKTsKICAgICBzdGF0dXNfdCAgICBnZXRNZXRyaWNzKFBhcmNlbCAqcmVwbHkpOworICAgIHN0YXR1c190ICAgIHNldElucHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpOworICAgIHN0YXR1c190ICAgIGdldFJvdXRlZERldmljZUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmRldmljZUlkKTsKKyAgICBzdGF0dXNfdCAgICBlbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCk7CisgICAgc3RhdHVzX3QgICAgZ2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogYWN0aXZlTWljcm9waG9uZXMpOwogCiBwcml2YXRlOgogICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIGRvQ2xlYW5VcCgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL0NvbnZlcnNpb24uaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9Db252ZXJzaW9uLmgKaW5kZXggOTgxNmZlMS4uMzcwMGEyMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL0NvbnZlcnNpb24uaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL29teC8xLjAvQ29udmVyc2lvbi5oCkBAIC0yMCwxMSArMjAsMTEgQEAKICNpbmNsdWRlIDx2ZWN0b3I+CiAjaW5jbHVkZSA8bGlzdD4KIAorI2luY2x1ZGUgPGNpbnR0eXBlcz4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CiAjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KLSNpbmNsdWRlIDxoaWRsbWVtb3J5L21hcHBpbmcuaD4KIAogI2luY2x1ZGUgPGJpbmRlci9CaW5kZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvU3RhdHVzLmg+CkBAIC0zNSw4ICszNSw5IEBACiAjaW5jbHVkZSA8bWVkaWEvT01YRmVuY2VQYXJjZWxhYmxlLmg+CiAjaW5jbHVkZSA8bWVkaWEvT01YQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvVmlkZW9BUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CiAKLSNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWVtb3J5LzEuMC9JTWVtb3J5Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL3R5cGVzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXguaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvSU9teE5vZGUuaD4KQEAgLTE5OSwyNiArMjAwLDYgQEAKIH0KIAogLyoqCi0gKiBcYnJpZWYgQ29udmVydCBgUmV0dXJuPFN0YXR1cz5gIHRvIGBzdGF0dXNfdGAuIFRoaXMgaXMgZm9yIGxlZ2FjeSBiaW5kZXIKLSAqIGNhbGxzLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBSZXR1cm48U3RhdHVzPmAuCi0gKiBccmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIGBzdGF0dXNfdGAuCi0gKgotICogVGhpcyBmdW5jdGlvbiBmaXJzdCBjaGVjayBpZiBccCB0IGhhcyBhIHRyYW5zcG9ydCBlcnJvci4gSWYgaXQgZG9lcywgdGhlbiB0aGUKLSAqIHJldHVybiB2YWx1ZSBpcyB0aGUgdHJhbnNwb3J0IGVycm9yIGNvZGUuIE90aGVyd2lzZSwgdGhlIHJldHVybiB2YWx1ZSBpcwotICogY29udmVydGVkIGZyb20gYFN0YXR1c2AgY29udGFpbmVkIGluc2lkZSBccCB0LgotICoKLSAqIE5vdGU6Ci0gKiAtIFRoaXMgYFN0YXR1c2AgaXMgb214LXNwZWNpZmljLiBJdCBpcyBkZWZpbmVkIGluIGB0eXBlcy5oYWxgLgotICogLSBUaGUgbmFtZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBgY29udmVydGAuCi0gKi8KLS8vIGNvbnZlcnQ6IFN0YXR1cyAtPiBzdGF0dXNfdAotaW5saW5lIHN0YXR1c190IHRvU3RhdHVzVChSZXR1cm48U3RhdHVzPiBjb25zdCYgdCkgewotICAgIHJldHVybiB0LmlzT2soKSA/IHN0YXRpY19jYXN0PHN0YXR1c190PihzdGF0aWNfY2FzdDxTdGF0dXM+KHQpKSA6IFVOS05PV05fRVJST1I7Ci19Ci0KLS8qKgogICogXGJyaWVmIENvbnZlcnQgYFJldHVybjx2b2lkPmAgdG8gYHN0YXR1c190YC4gVGhpcyBpcyBmb3IgbGVnYWN5IGJpbmRlciBjYWxscy4KICAqCiAgKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgUmV0dXJuPHZvaWQ+YC4KQEAgLTIzNyw3ICsyMTgsNDcgQEAKICAqLwogLy8gY29udmVydDogU3RhdHVzIC0+IHN0YXR1c190CiBpbmxpbmUgc3RhdHVzX3QgdG9TdGF0dXNUKFN0YXR1cyBjb25zdCYgdCkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxzdGF0dXNfdD4odCk7CisgICAgc3dpdGNoICh0KSB7CisgICAgY2FzZSBTdGF0dXM6Ok5PX0VSUk9SOgorICAgIGNhc2UgU3RhdHVzOjpOQU1FX05PVF9GT1VORDoKKyAgICBjYXNlIFN0YXR1czo6V09VTERfQkxPQ0s6CisgICAgY2FzZSBTdGF0dXM6Ok5PX01FTU9SWToKKyAgICBjYXNlIFN0YXR1czo6QUxSRUFEWV9FWElTVFM6CisgICAgY2FzZSBTdGF0dXM6Ok5PX0lOSVQ6CisgICAgY2FzZSBTdGF0dXM6OkJBRF9WQUxVRToKKyAgICBjYXNlIFN0YXR1czo6REVBRF9PQkpFQ1Q6CisgICAgY2FzZSBTdGF0dXM6OklOVkFMSURfT1BFUkFUSU9OOgorICAgIGNhc2UgU3RhdHVzOjpUSU1FRF9PVVQ6CisgICAgY2FzZSBTdGF0dXM6OkVSUk9SX1VOU1VQUE9SVEVEOgorICAgIGNhc2UgU3RhdHVzOjpVTktOT1dOX0VSUk9SOgorICAgIGNhc2UgU3RhdHVzOjpSRUxFQVNFX0FMTF9CVUZGRVJTOgorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KHQpOworICAgIGNhc2UgU3RhdHVzOjpCVUZGRVJfTkVFRFNfUkVBTExPQ0FUSU9OOgorICAgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dXKCJVbnJlY29nbml6ZWQgc3RhdHVzIHZhbHVlOiAlIiBQUklkMzIsIHN0YXRpY19jYXN0PGludDMyX3Q+KHQpKTsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHN0YXR1c190Pih0KTsKKyAgICB9Cit9CisKKy8qKgorICogXGJyaWVmIENvbnZlcnQgYFJldHVybjxTdGF0dXM+YCB0byBgc3RhdHVzX3RgLiBUaGlzIGlzIGZvciBsZWdhY3kgYmluZGVyCisgKiBjYWxscy4KKyAqCisgKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgUmV0dXJuPFN0YXR1cz5gLgorICogXHJldHVybiBUaGUgY29ycmVzcG9uZGluZyBgc3RhdHVzX3RgLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gZmlyc3QgY2hlY2sgaWYgXHAgdCBoYXMgYSB0cmFuc3BvcnQgZXJyb3IuIElmIGl0IGRvZXMsIHRoZW4gdGhlCisgKiByZXR1cm4gdmFsdWUgaXMgdGhlIHRyYW5zcG9ydCBlcnJvciBjb2RlLiBPdGhlcndpc2UsIHRoZSByZXR1cm4gdmFsdWUgaXMKKyAqIGNvbnZlcnRlZCBmcm9tIGBTdGF0dXNgIGNvbnRhaW5lZCBpbnNpZGUgXHAgdC4KKyAqCisgKiBOb3RlOgorICogLSBUaGlzIGBTdGF0dXNgIGlzIG9teC1zcGVjaWZpYy4gSXQgaXMgZGVmaW5lZCBpbiBgdHlwZXMuaGFsYC4KKyAqIC0gVGhlIG5hbWUgb2YgdGhpcyBmdW5jdGlvbiBpcyBub3QgYGNvbnZlcnRgLgorICovCisvLyBjb252ZXJ0OiBTdGF0dXMgLT4gc3RhdHVzX3QKK2lubGluZSBzdGF0dXNfdCB0b1N0YXR1c1QoUmV0dXJuPFN0YXR1cz4gY29uc3QmIHQpIHsKKyAgICByZXR1cm4gdC5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdGljX2Nhc3Q8U3RhdHVzPih0KSkgOiBVTktOT1dOX0VSUk9SOwogfQogCiAvKioKQEAgLTI0OCw3ICsyNjksMjggQEAKICAqLwogLy8gY29udmVydDogc3RhdHVzX3QgLT4gU3RhdHVzCiBpbmxpbmUgU3RhdHVzIHRvU3RhdHVzKHN0YXR1c190IGwpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8U3RhdHVzPihsKTsKKyAgICBzd2l0Y2ggKGwpIHsKKyAgICBjYXNlIE5PX0VSUk9SOgorICAgIGNhc2UgTkFNRV9OT1RfRk9VTkQ6CisgICAgY2FzZSBXT1VMRF9CTE9DSzoKKyAgICBjYXNlIE5PX01FTU9SWToKKyAgICBjYXNlIEFMUkVBRFlfRVhJU1RTOgorICAgIGNhc2UgTk9fSU5JVDoKKyAgICBjYXNlIEJBRF9WQUxVRToKKyAgICBjYXNlIERFQURfT0JKRUNUOgorICAgIGNhc2UgSU5WQUxJRF9PUEVSQVRJT046CisgICAgY2FzZSBUSU1FRF9PVVQ6CisgICAgY2FzZSBFUlJPUl9VTlNVUFBPUlRFRDoKKyAgICBjYXNlIFVOS05PV05fRVJST1I6CisgICAgY2FzZSBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpSRUxFQVNFX0FMTF9CVUZGRVJTOgorICAgIGNhc2UgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6QlVGRkVSX05FRURTX1JFQUxMT0NBVElPTjoKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFN0YXR1cz4obCk7CisgICAgY2FzZSBOT1RfRU5PVUdIX0RBVEE6CisgICAgICAgIHJldHVybiBTdGF0dXM6OkJVRkZFUl9ORUVEU19SRUFMTE9DQVRJT047CisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR1coIlVucmVjb2duaXplZCBzdGF0dXMgdmFsdWU6ICUiIFBSSWQzMiwgc3RhdGljX2Nhc3Q8aW50MzJfdD4obCkpOworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8U3RhdHVzPihsKTsKKyAgICB9CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmNwcAppbmRleCA3ZDI3ZDU3Li5lNjFiMDRkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmNwcApAQCAtMTU0LDYgKzE1NCw0NSBAQAogICAgIHJldHVybiBtUmV0cmlldmVyLT5nZXRGcmFtZUF0VGltZSh0aW1lVXMsIG9wdGlvbiwgY29sb3JGb3JtYXQsIG1ldGFPbmx5KTsKIH0KIAorc3A8SU1lbW9yeT4gTWVkaWFNZXRhZGF0YVJldHJpZXZlcjo6Z2V0SW1hZ2VBdEluZGV4KAorICAgICAgICBpbnQgaW5kZXgsIGludCBjb2xvckZvcm1hdCwgYm9vbCBtZXRhT25seSwgYm9vbCB0aHVtYm5haWwpIHsKKyAgICBBTE9HVigiZ2V0SW1hZ2VBdEluZGV4OiBpbmRleCglZCkgY29sb3JGb3JtYXQoJWQpIG1ldGFPbmx5KCVkKSB0aHVtYm5haWwoJWQpIiwKKyAgICAgICAgICAgIGluZGV4LCBjb2xvckZvcm1hdCwgbWV0YU9ubHksIHRodW1ibmFpbCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobVJldHJpZXZlciA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJyZXRyaWV2ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gbVJldHJpZXZlci0+Z2V0SW1hZ2VBdEluZGV4KGluZGV4LCBjb2xvckZvcm1hdCwgbWV0YU9ubHksIHRodW1ibmFpbCk7Cit9CisKK3NwPElNZW1vcnk+IE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI6OmdldEltYWdlUmVjdEF0SW5kZXgoCisgICAgICAgIGludCBpbmRleCwgaW50IGNvbG9yRm9ybWF0LCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tKSB7CisgICAgQUxPR1YoImdldEltYWdlUmVjdEF0SW5kZXg6IGluZGV4KCVkKSBjb2xvckZvcm1hdCglZCkgcmVjdCB7JWQsICVkLCAlZCwgJWR9IiwKKyAgICAgICAgICAgIGluZGV4LCBjb2xvckZvcm1hdCwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtUmV0cmlldmVyID09IDApIHsKKyAgICAgICAgQUxPR0UoInJldHJpZXZlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBtUmV0cmlldmVyLT5nZXRJbWFnZVJlY3RBdEluZGV4KAorICAgICAgICAgICAgaW5kZXgsIGNvbG9yRm9ybWF0LCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOworfQorCitzdGF0dXNfdCBNZWRpYU1ldGFkYXRhUmV0cmlldmVyOjpnZXRGcmFtZUF0SW5kZXgoCisgICAgICAgIHN0ZDo6dmVjdG9yPHNwPElNZW1vcnk+ID4gKmZyYW1lcywKKyAgICAgICAgaW50IGZyYW1lSW5kZXgsIGludCBudW1GcmFtZXMsIGludCBjb2xvckZvcm1hdCwgYm9vbCBtZXRhT25seSkgeworICAgIEFMT0dWKCJnZXRGcmFtZUF0SW5kZXg6IGZyYW1lSW5kZXgoJWQpLCBudW1GcmFtZXMoJWQpLCBjb2xvckZvcm1hdCglZCkgbWV0YU9ubHkoJWQpIiwKKyAgICAgICAgICAgIGZyYW1lSW5kZXgsIG51bUZyYW1lcywgY29sb3JGb3JtYXQsIG1ldGFPbmx5KTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtUmV0cmlldmVyID09IDApIHsKKyAgICAgICAgQUxPR0UoInJldHJpZXZlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICByZXR1cm4gbVJldHJpZXZlci0+Z2V0RnJhbWVBdEluZGV4KAorICAgICAgICAgICAgZnJhbWVzLCBmcmFtZUluZGV4LCBudW1GcmFtZXMsIGNvbG9yRm9ybWF0LCBtZXRhT25seSk7Cit9CisKIGNvbnN0IGNoYXIqIE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI6OmV4dHJhY3RNZXRhZGF0YShpbnQga2V5Q29kZSkKIHsKICAgICBBTE9HVigiZXh0cmFjdE1ldGFkYXRhKCVkKSIsIGtleUNvZGUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvbWVkaWFwbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFwbGF5ZXIuY3BwCmluZGV4IGI5NzY3MjEuLjI2OTA4ZTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL21lZGlhcGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAKQEAgLTQ4LDYgKzQ4LDggQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCit1c2luZyBtZWRpYTo6Vm9sdW1lU2hhcGVyOworCiBNZWRpYVBsYXllcjo6TWVkaWFQbGF5ZXIoKQogewogICAgIEFMT0dWKCJjb25zdHJ1Y3RvciIpOwpAQCAtMTM3LDEwICsxMzksOCBAQAogICAgICAgICBtUGxheWVyID0gcGxheWVyOwogICAgICAgICBpZiAocGxheWVyICE9IDApIHsKICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVJfSU5JVElBTElaRUQ7Ci0gICAgICAgICAgICBwbGF5ZXItPmdldERlZmF1bHRCdWZmZXJpbmdTZXR0aW5ncygmbUN1cnJlbnRCdWZmZXJpbmdTZXR0aW5ncyk7CiAgICAgICAgICAgICBlcnIgPSBOT19FUlJPUjsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1DdXJyZW50QnVmZmVyaW5nU2V0dGluZ3MgPSBCdWZmZXJpbmdTZXR0aW5ncygpOwogICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBjcmVhdGUgbWVkaWEgcGxheWVyIik7CiAgICAgICAgIH0KICAgICB9CkBAIC0yNDcsMTcgKzI0Nyw2IEBACiAgICAgcmV0dXJuIG1QbGF5ZXItPnNldFZpZGVvU3VyZmFjZVRleHR1cmUoYnVmZmVyUHJvZHVjZXIpOwogfQogCi1zdGF0dXNfdCBNZWRpYVBsYXllcjo6Z2V0RGVmYXVsdEJ1ZmZlcmluZ1NldHRpbmdzKEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykKLXsKLSAgICBBTE9HVigiZ2V0RGVmYXVsdEJ1ZmZlcmluZ1NldHRpbmdzIik7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtUGxheWVyID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBtUGxheWVyLT5nZXREZWZhdWx0QnVmZmVyaW5nU2V0dGluZ3MoYnVmZmVyaW5nKTsKLX0KLQogc3RhdHVzX3QgTWVkaWFQbGF5ZXI6OmdldEJ1ZmZlcmluZ1NldHRpbmdzKEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykKIHsKICAgICBBTE9HVigiZ2V0QnVmZmVyaW5nU2V0dGluZ3MiKTsKQEAgLTI2Niw4ICsyNTUsNyBAQAogICAgIGlmIChtUGxheWVyID09IDApIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgICpidWZmZXJpbmcgPSBtQ3VycmVudEJ1ZmZlcmluZ1NldHRpbmdzOwotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICByZXR1cm4gbVBsYXllci0+Z2V0QnVmZmVyaW5nU2V0dGluZ3MoYnVmZmVyaW5nKTsKIH0KIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXI6OnNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiBidWZmZXJpbmcpCkBAIC0yNzgsMTEgKzI2Niw3IEBACiAgICAgaWYgKG1QbGF5ZXIgPT0gMCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgc3RhdHVzX3QgZXJyID0gIG1QbGF5ZXItPnNldEJ1ZmZlcmluZ1NldHRpbmdzKGJ1ZmZlcmluZyk7Ci0gICAgaWYgKGVyciA9PSBOT19FUlJPUikgewotICAgICAgICBtQ3VycmVudEJ1ZmZlcmluZ1NldHRpbmdzID0gYnVmZmVyaW5nOwotICAgIH0KLSAgICByZXR1cm4gZXJyOworICAgIHJldHVybiBtUGxheWVyLT5zZXRCdWZmZXJpbmdTZXR0aW5ncyhidWZmZXJpbmcpOwogfQogCiAvLyBtdXN0IGNhbGwgd2l0aCBsb2NrIGhlbGQKQEAgLTYwOCw2ICs1OTIsMTUgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCitzdGF0dXNfdCBNZWRpYVBsYXllcjo6bm90aWZ5QXQoaW50NjRfdCBtZWRpYVRpbWVVcykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtUGxheWVyICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG1QbGF5ZXItPm5vdGlmeUF0KG1lZGlhVGltZVVzKTsKKyAgICB9CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCiBzdGF0dXNfdCBNZWRpYVBsYXllcjo6cmVzZXRfbCgpCiB7CiAgICAgbUxvb3AgPSBmYWxzZTsKQEAgLTYyNSw3ICs2MTgsNiBAQAogICAgICAgICAvLyBzZXREYXRhU291cmNlIGhhcyB0byBiZSBjYWxsZWQgYWdhaW4gdG8gY3JlYXRlIGEKICAgICAgICAgLy8gbmV3IG1lZGlhcGxheWVyLgogICAgICAgICBtUGxheWVyID0gMDsKLSAgICAgICAgbUN1cnJlbnRCdWZmZXJpbmdTZXR0aW5ncyA9IEJ1ZmZlcmluZ1NldHRpbmdzKCk7CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogICAgIGNsZWFyX2woKTsKQEAgLTY0OSw4ICs2NDEsMTIgQEAKIHN0YXR1c190IE1lZGlhUGxheWVyOjpyZXNldCgpCiB7CiAgICAgQUxPR1YoInJlc2V0Iik7CisgICAgbUxvY2tUaHJlYWRJZCA9IGdldFRocmVhZElkKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gcmVzZXRfbCgpOworICAgIHN0YXR1c190IHJlc3VsdCA9IHJlc2V0X2woKTsKKyAgICBtTG9ja1RocmVhZElkID0gMDsKKworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXR1c190IE1lZGlhUGxheWVyOjpzZXRBdWRpb1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCB0eXBlKQpAQCAtODYwLDcgKzg1Niw3IEBACiAgICAgLy8gdGhpcyB3aWxsIGRlYWRsb2NrLgogICAgIC8vCiAgICAgLy8gVGhlIHRocmVhZElkIGhhY2sgYmVsb3cgd29ya3MgYXJvdW5kIHRoaXMgZm9yIHRoZSBjYXJlIG9mIHByZXBhcmUsCi0gICAgLy8gc2Vla1RvIGFuZCBzdGFydCB3aXRoaW4gdGhlIHNhbWUgcHJvY2Vzcy4KKyAgICAvLyBzZWVrVG8sIHN0YXJ0LCBhbmQgcmVzZXQgd2l0aGluIHRoZSBzYW1lIHByb2Nlc3MuCiAgICAgLy8gRklYTUU6IFJlbWVtYmVyLCB0aGlzIGlzIGEgaGFjaywgaXQncyBub3QgZXZlbiBhIGhhY2sgdGhhdCBpcyBhcHBsaWVkCiAgICAgLy8gY29uc2lzdGVudGx5IGZvciBhbGwgdXNlLWNhc2VzLCB0aGlzIG5lZWRzIHRvIGJlIHJldmlzaXRlZC4KICAgICBpZiAobUxvY2tUaHJlYWRJZCAhPSBnZXRUaHJlYWRJZCgpKSB7CkBAIC05NDQsNiArOTQwLDkgQEAKICAgICAgICAgbVZpZGVvV2lkdGggPSBleHQxOwogICAgICAgICBtVmlkZW9IZWlnaHQgPSBleHQyOwogICAgICAgICBicmVhazsKKyAgICBjYXNlIE1FRElBX05PVElGWV9USU1FOgorICAgICAgICBBTE9HVigiUmVjZWl2ZWQgbm90aWZ5IHRpbWUgbWVzc2FnZSIpOworICAgICAgICBicmVhazsKICAgICBjYXNlIE1FRElBX1RJTUVEX1RFWFQ6CiAgICAgICAgIEFMT0dWKCJSZWNlaXZlZCB0aW1lZCB0ZXh0IG1lc3NhZ2UiKTsKICAgICAgICAgYnJlYWs7CkBAIC0xMDc2LDQgKzEwNzUsMzkgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCitzdGF0dXNfdCBNZWRpYVBsYXllcjo6c2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobVBsYXllciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2U6IHBsYXllciBub3QgaW5pdCIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1QbGF5ZXItPnNldE91dHB1dERldmljZShkZXZpY2VJZCk7Cit9CisKK2F1ZGlvX3BvcnRfaGFuZGxlX3QgTWVkaWFQbGF5ZXI6OmdldFJvdXRlZERldmljZUlkKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtUGxheWVyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1YoImdldFJvdXRlZERldmljZUlkOiBwbGF5ZXIgbm90IGluaXQiKTsKKyAgICAgICAgcmV0dXJuIEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgfQorICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQ7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVBsYXllci0+Z2V0Um91dGVkRGV2aWNlSWQoJmRldmljZUlkKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgIH0KKyAgICByZXR1cm4gZGV2aWNlSWQ7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyOjplbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtUGxheWVyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1YoImFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2s6IHBsYXllciBub3QgaW5pdCIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1QbGF5ZXItPmVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soZW5hYmxlZCk7Cit9CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL21lZGlhcmVjb3JkZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAKaW5kZXggNDQwNTkzMC4uNzIxYTA0MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAKQEAgLTc5Miw0ICs3OTIsNTIgQEAKICAgICBub3RpZnkoTUVESUFfUkVDT1JERVJfRVZFTlRfRVJST1IsIE1FRElBX0VSUk9SX1NFUlZFUl9ESUVELCAwKTsKIH0KIAorc3RhdHVzX3QgTWVkaWFSZWNvcmRlcjo6c2V0SW5wdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkKK3sKKyAgICBBTE9HVigic2V0SW5wdXREZXZpY2UiKTsKKworICAgIGlmIChtTWVkaWFSZWNvcmRlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJtZWRpYSByZWNvcmRlciBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0Iik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgcmV0dXJuIG1NZWRpYVJlY29yZGVyLT5zZXRJbnB1dERldmljZShkZXZpY2VJZCk7Cit9CisKK3N0YXR1c190IE1lZGlhUmVjb3JkZXI6OmdldFJvdXRlZERldmljZUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QqIGRldmljZUlkKQoreworICAgIEFMT0dWKCJnZXRSb3V0ZWREZXZpY2VJZCIpOworCisgICAgaWYgKG1NZWRpYVJlY29yZGVyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIm1lZGlhIHJlY29yZGVyIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQiKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtTWVkaWFSZWNvcmRlci0+Z2V0Um91dGVkRGV2aWNlSWQoZGV2aWNlSWQpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgKmRldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgTWVkaWFSZWNvcmRlcjo6ZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpCit7CisgICAgQUxPR1YoImVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2siKTsKKworICAgIGlmIChtTWVkaWFSZWNvcmRlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJtZWRpYSByZWNvcmRlciBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0Iik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgcmV0dXJuIG1NZWRpYVJlY29yZGVyLT5lbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGVuYWJsZWQpOworfQorCitzdGF0dXNfdCBNZWRpYVJlY29yZGVyOjpnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBhY3RpdmVNaWNyb3Bob25lcykKK3sKKyAgICBBTE9HVigiZ2V0QWN0aXZlTWljcm9waG9uZXMiKTsKKworICAgIGlmIChtTWVkaWFSZWNvcmRlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJtZWRpYSByZWNvcmRlciBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0Iik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgcmV0dXJuIG1NZWRpYVJlY29yZGVyLT5nZXRBY3RpdmVNaWNyb3Bob25lcyhhY3RpdmVNaWNyb3Bob25lcyk7Cit9CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5YjQ3Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTAgQEAKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJtZWRpYWV4dHJhY3RvciIsCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvaW5jbHVkZSIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVduby1tdWx0aWNoYXIiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICBdLAorCisgICAgc3JjczogWworICAgICAgICAiRGF0YVNvdXJjZUJhc2UuY3BwIiwKKyAgICAgICAgIk1lZGlhQnVmZmVyLmNwcCIsCisgICAgICAgICJNZWRpYUJ1ZmZlckJhc2UuY3BwIiwKKyAgICAgICAgIk1lZGlhQnVmZmVyR3JvdXAuY3BwIiwKKyAgICAgICAgIk1lZGlhU291cmNlLmNwcCIsCisgICAgICAgICJNZWRpYVRyYWNrLmNwcCIsCisgICAgICAgICJNZWRpYUV4dHJhY3Rvci5jcHAiLAorICAgICAgICAiTWV0YURhdGEuY3BwIiwKKyAgICAgICAgIk1ldGFEYXRhQmFzZS5jcHAiLAorICAgICAgICAiVm9yYmlzQ29tbWVudC5jcHAiLAorICAgIF0sCisKKyAgICBjbGFuZzogdHJ1ZSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIGRpYWc6IHsKKyAgICAgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvRGF0YVNvdXJjZUJhc2UuY3BwIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvRGF0YVNvdXJjZUJhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNDdlZTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9EYXRhU291cmNlQmFzZS5jcHAKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJEYXRhU291cmNlQmFzZSIKKworI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitib29sIERhdGFTb3VyY2VCYXNlOjpnZXRVSW50MTYob2ZmNjRfdCBvZmZzZXQsIHVpbnQxNl90ICp4KSB7CisgICAgKnggPSAwOworCisgICAgdWludDhfdCBieXRlWzJdOworICAgIGlmIChyZWFkQXQob2Zmc2V0LCBieXRlLCAyKSAhPSAyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAqeCA9IChieXRlWzBdIDw8IDgpIHwgYnl0ZVsxXTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIERhdGFTb3VyY2VCYXNlOjpnZXRVSW50MjQob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4KSB7CisgICAgKnggPSAwOworCisgICAgdWludDhfdCBieXRlWzNdOworICAgIGlmIChyZWFkQXQob2Zmc2V0LCBieXRlLCAzKSAhPSAzKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAqeCA9IChieXRlWzBdIDw8IDE2KSB8IChieXRlWzFdIDw8IDgpIHwgYnl0ZVsyXTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIERhdGFTb3VyY2VCYXNlOjpnZXRVSW50MzIob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4KSB7CisgICAgKnggPSAwOworCisgICAgdWludDMyX3QgdG1wOworICAgIGlmIChyZWFkQXQob2Zmc2V0LCAmdG1wLCA0KSAhPSA0KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAqeCA9IG50b2hsKHRtcCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBEYXRhU291cmNlQmFzZTo6Z2V0VUludDY0KG9mZjY0X3Qgb2Zmc2V0LCB1aW50NjRfdCAqeCkgeworICAgICp4ID0gMDsKKworICAgIHVpbnQ2NF90IHRtcDsKKyAgICBpZiAocmVhZEF0KG9mZnNldCwgJnRtcCwgOCkgIT0gOCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgKnggPSBudG9oNjQodG1wKTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIERhdGFTb3VyY2VCYXNlOjpnZXRVSW50MTZWYXIob2ZmNjRfdCBvZmZzZXQsIHVpbnQxNl90ICp4LCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChzaXplID09IDIpIHsKKyAgICAgICAgcmV0dXJuIGdldFVJbnQxNihvZmZzZXQsIHgpOworICAgIH0KKyAgICBpZiAoc2l6ZSA9PSAxKSB7CisgICAgICAgIHVpbnQ4X3QgdG1wOworICAgICAgICBpZiAocmVhZEF0KG9mZnNldCwgJnRtcCwgMSkgPT0gMSkgeworICAgICAgICAgICAgKnggPSB0bXA7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgRGF0YVNvdXJjZUJhc2U6OmdldFVJbnQzMlZhcihvZmY2NF90IG9mZnNldCwgdWludDMyX3QgKngsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKHNpemUgPT0gNCkgeworICAgICAgICByZXR1cm4gZ2V0VUludDMyKG9mZnNldCwgeCk7CisgICAgfQorICAgIGlmIChzaXplID09IDIpIHsKKyAgICAgICAgdWludDE2X3QgdG1wOworICAgICAgICBpZiAoZ2V0VUludDE2KG9mZnNldCwgJnRtcCkpIHsKKyAgICAgICAgICAgICp4ID0gdG1wOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIERhdGFTb3VyY2VCYXNlOjpnZXRVSW50NjRWYXIob2ZmNjRfdCBvZmZzZXQsIHVpbnQ2NF90ICp4LCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChzaXplID09IDgpIHsKKyAgICAgICAgcmV0dXJuIGdldFVJbnQ2NChvZmZzZXQsIHgpOworICAgIH0KKyAgICBpZiAoc2l6ZSA9PSA0KSB7CisgICAgICAgIHVpbnQzMl90IHRtcDsKKyAgICAgICAgaWYgKGdldFVJbnQzMihvZmZzZXQsICZ0bXApKSB7CisgICAgICAgICAgICAqeCA9IHRtcDsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdHVzX3QgRGF0YVNvdXJjZUJhc2U6OmdldFNpemUob2ZmNjRfdCAqc2l6ZSkgeworICAgICpzaXplID0gMDsKKworICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworYm9vbCBEYXRhU291cmNlQmFzZTo6Z2V0VXJpKGNoYXIgKnVyaVN0cmluZyBfX3VudXNlZCwgc2l6ZV90IGJ1ZmZlclNpemUgX191bnVzZWQpIHsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYUJ1ZmZlci5jcHAgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYUJ1ZmZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlmOGQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhQnVmZmVyLmNwcApAQCAtMCwwICsxLDE5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFCdWZmZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qIHN0YXRpYyAqLworc3RkOjphdG9taWNfaW50X2xlYXN0MzJfdCBNZWRpYUJ1ZmZlcjo6bVVzZVNoYXJlZE1lbW9yeSgwKTsKKworTWVkaWFCdWZmZXI6Ok1lZGlhQnVmZmVyKHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKQorICAgIDogbU9ic2VydmVyKE5VTEwpLAorICAgICAgbVJlZkNvdW50KDApLAorICAgICAgbURhdGEoZGF0YSksCisgICAgICBtU2l6ZShzaXplKSwKKyAgICAgIG1SYW5nZU9mZnNldCgwKSwKKyAgICAgIG1SYW5nZUxlbmd0aChzaXplKSwKKyAgICAgIG1Pd25zRGF0YShmYWxzZSksCisgICAgICBtTWV0YURhdGEobmV3IE1ldGFEYXRhKSwKKyAgICAgIG1PcmlnaW5hbChOVUxMKSB7Cit9CisKK01lZGlhQnVmZmVyOjpNZWRpYUJ1ZmZlcihzaXplX3Qgc2l6ZSkKKyAgICA6IG1PYnNlcnZlcihOVUxMKSwKKyAgICAgIG1SZWZDb3VudCgwKSwKKyAgICAgIG1EYXRhKE5VTEwpLAorICAgICAgbVNpemUoc2l6ZSksCisgICAgICBtUmFuZ2VPZmZzZXQoMCksCisgICAgICBtUmFuZ2VMZW5ndGgoc2l6ZSksCisgICAgICBtT3duc0RhdGEodHJ1ZSksCisgICAgICBtTWV0YURhdGEobmV3IE1ldGFEYXRhKSwKKyAgICAgIG1PcmlnaW5hbChOVUxMKSB7CisgICAgaWYgKHNpemUgPCBrU2hhcmVkTWVtVGhyZXNob2xkCisgICAgICAgICAgICB8fCBzdGQ6OmF0b21pY19sb2FkX2V4cGxpY2l0KCZtVXNlU2hhcmVkTWVtb3J5LCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KSA9PSAwKSB7CisgICAgICAgIG1EYXRhID0gbWFsbG9jKHNpemUpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJjcmVhdGluZyBtZW1vcnlEZWFsZXIiKTsKKyAgICAgICAgc3A8TWVtb3J5RGVhbGVyPiBtZW1vcnlEZWFsZXIgPQorICAgICAgICAgICAgICAgIG5ldyBNZW1vcnlEZWFsZXIoc2l6ZSArIHNpemVvZihTaGFyZWRDb250cm9sKSwgIk1lZGlhQnVmZmVyIik7CisgICAgICAgIG1NZW1vcnkgPSBtZW1vcnlEZWFsZXItPmFsbG9jYXRlKHNpemUgKyBzaXplb2YoU2hhcmVkQ29udHJvbCkpOworICAgICAgICBpZiAobU1lbW9yeSA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIGFsbG9jYXRlIHNoYXJlZCBtZW1vcnksIHRyeWluZyByZWd1bGFyIGFsbG9jYXRpb24hIik7CisgICAgICAgICAgICBtRGF0YSA9IG1hbGxvYyhzaXplKTsKKyAgICAgICAgICAgIGlmIChtRGF0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIk91dCBvZiBtZW1vcnkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdldFNoYXJlZENvbnRyb2woKS0+Y2xlYXIoKTsKKyAgICAgICAgICAgIG1EYXRhID0gKHVpbnQ4X3QgKiltTWVtb3J5LT5wb2ludGVyKCkgKyBzaXplb2YoU2hhcmVkQ29udHJvbCk7CisgICAgICAgICAgICBBTE9HVigiQWxsb2NhdGVkIHNoYXJlZCBtZW0gYnVmZmVyIG9mIHNpemUgJXp1IEAgJXAiLCBzaXplLCBtRGF0YSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK01lZGlhQnVmZmVyOjpNZWRpYUJ1ZmZlcihjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKQorICAgIDogbU9ic2VydmVyKE5VTEwpLAorICAgICAgbVJlZkNvdW50KDApLAorICAgICAgbURhdGEoYnVmZmVyLT5kYXRhKCkpLAorICAgICAgbVNpemUoYnVmZmVyLT5zaXplKCkpLAorICAgICAgbVJhbmdlT2Zmc2V0KDApLAorICAgICAgbVJhbmdlTGVuZ3RoKG1TaXplKSwKKyAgICAgIG1CdWZmZXIoYnVmZmVyKSwKKyAgICAgIG1Pd25zRGF0YShmYWxzZSksCisgICAgICBtTWV0YURhdGEobmV3IE1ldGFEYXRhKSwKKyAgICAgIG1PcmlnaW5hbChOVUxMKSB7Cit9CisKK3ZvaWQgTWVkaWFCdWZmZXI6OnJlbGVhc2UoKSB7CisgICAgaWYgKG1PYnNlcnZlciA9PSBOVUxMKSB7CisgICAgICAgIC8vIExlZ2FjeSBjb250cmFjdCBmb3IgTWVkaWFCdWZmZXIgd2l0aG91dCBhIE1lZGlhQnVmZmVyR3JvdXAuCisgICAgICAgIENIRUNLX0VRKG1SZWZDb3VudCwgMCk7CisgICAgICAgIGRlbGV0ZSB0aGlzOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50IHByZXZDb3VudCA9IF9fc3luY19mZXRjaF9hbmRfc3ViKCZtUmVmQ291bnQsIDEpOworICAgIGlmIChwcmV2Q291bnQgPT0gMSkgeworICAgICAgICBpZiAobU9ic2VydmVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIGRlbGV0ZSB0aGlzOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbU9ic2VydmVyLT5zaWduYWxCdWZmZXJSZXR1cm5lZCh0aGlzKTsKKyAgICB9CisgICAgQ0hFQ0socHJldkNvdW50ID4gMCk7Cit9CisKK3ZvaWQgTWVkaWFCdWZmZXI6OmNsYWltKCkgeworICAgIENIRUNLKG1PYnNlcnZlciAhPSBOVUxMKTsKKyAgICBDSEVDS19FUShtUmVmQ291bnQsIDEpOworCisgICAgbVJlZkNvdW50ID0gMDsKK30KKwordm9pZCBNZWRpYUJ1ZmZlcjo6YWRkX3JlZigpIHsKKyAgICAodm9pZCkgX19zeW5jX2ZldGNoX2FuZF9hZGQoJm1SZWZDb3VudCwgMSk7Cit9CisKK3ZvaWQgKk1lZGlhQnVmZmVyOjpkYXRhKCkgY29uc3QgeworICAgIHJldHVybiBtRGF0YTsKK30KKworc2l6ZV90IE1lZGlhQnVmZmVyOjpzaXplKCkgY29uc3QgeworICAgIHJldHVybiBtU2l6ZTsKK30KKworc2l6ZV90IE1lZGlhQnVmZmVyOjpyYW5nZV9vZmZzZXQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1SYW5nZU9mZnNldDsKK30KKworc2l6ZV90IE1lZGlhQnVmZmVyOjpyYW5nZV9sZW5ndGgoKSBjb25zdCB7CisgICAgcmV0dXJuIG1SYW5nZUxlbmd0aDsKK30KKwordm9pZCBNZWRpYUJ1ZmZlcjo6c2V0X3JhbmdlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBsZW5ndGgpIHsKKyAgICBpZiAob2Zmc2V0ICsgbGVuZ3RoID4gbVNpemUpIHsKKyAgICAgICAgQUxPR0UoIm9mZnNldCA9ICV6dSwgbGVuZ3RoID0gJXp1LCBtU2l6ZSA9ICV6dSIsIG9mZnNldCwgbGVuZ3RoLCBtU2l6ZSk7CisgICAgfQorICAgIENIRUNLKG9mZnNldCArIGxlbmd0aCA8PSBtU2l6ZSk7CisKKyAgICBtUmFuZ2VPZmZzZXQgPSBvZmZzZXQ7CisgICAgbVJhbmdlTGVuZ3RoID0gbGVuZ3RoOworfQorCitNZXRhRGF0YUJhc2UmIE1lZGlhQnVmZmVyOjptZXRhX2RhdGEoKSB7CisgICAgcmV0dXJuICptTWV0YURhdGE7Cit9CisKK3ZvaWQgTWVkaWFCdWZmZXI6OnJlc2V0KCkgeworICAgIG1NZXRhRGF0YS0+Y2xlYXIoKTsKKyAgICBzZXRfcmFuZ2UoMCwgbVNpemUpOworfQorCitNZWRpYUJ1ZmZlcjo6fk1lZGlhQnVmZmVyKCkgeworICAgIENIRUNLKG1PYnNlcnZlciA9PSBOVUxMKTsKKworICAgIGlmIChtT3duc0RhdGEgJiYgbURhdGEgIT0gTlVMTCAmJiBtTWVtb3J5ID09IE5VTEwpIHsKKyAgICAgICAgZnJlZShtRGF0YSk7CisgICAgICAgIG1EYXRhID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAobU9yaWdpbmFsICE9IE5VTEwpIHsKKyAgICAgICAgbU9yaWdpbmFsLT5yZWxlYXNlKCk7CisgICAgICAgIG1PcmlnaW5hbCA9IE5VTEw7CisgICAgfQorCisgICBpZiAobU1lbW9yeS5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgZ2V0U2hhcmVkQ29udHJvbCgpLT5zZXREZWFkT2JqZWN0KCk7CisgICB9CisgICBkZWxldGUgbU1ldGFEYXRhOworfQorCit2b2lkIE1lZGlhQnVmZmVyOjpzZXRPYnNlcnZlcihNZWRpYUJ1ZmZlck9ic2VydmVyICpvYnNlcnZlcikgeworICAgIENIRUNLKG9ic2VydmVyID09IE5VTEwgfHwgbU9ic2VydmVyID09IE5VTEwpOworICAgIG1PYnNlcnZlciA9IG9ic2VydmVyOworfQorCitNZWRpYUJ1ZmZlckJhc2UgKk1lZGlhQnVmZmVyOjpjbG9uZSgpIHsKKyAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKG1EYXRhLCBtU2l6ZSk7CisgICAgYnVmZmVyLT5zZXRfcmFuZ2UobVJhbmdlT2Zmc2V0LCBtUmFuZ2VMZW5ndGgpOworICAgIGJ1ZmZlci0+bU1ldGFEYXRhID0gbmV3IE1ldGFEYXRhQmFzZSgqbU1ldGFEYXRhKTsKKworICAgIGFkZF9yZWYoKTsKKyAgICBidWZmZXItPm1PcmlnaW5hbCA9IHRoaXM7CisKKyAgICByZXR1cm4gYnVmZmVyOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFCdWZmZXJCYXNlLmNwcCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhQnVmZmVyQmFzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU1MzI4OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhQnVmZmVyQmFzZS5jcHAKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNZWRpYUJ1ZmZlckJhc2UiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vc3RhdGljCitNZWRpYUJ1ZmZlckJhc2UgKk1lZGlhQnVmZmVyQmFzZTo6Q3JlYXRlKHNpemVfdCBzaXplKSB7CisgICAgcmV0dXJuIG5ldyAoc3RkOjpub3Rocm93KSBNZWRpYUJ1ZmZlcihzaXplKTsKK30KKworfSAgLy8gYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFCdWZmZXJHcm91cC5jcHAgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYUJ1ZmZlckdyb3VwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYThkZDQxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFCdWZmZXJHcm91cC5jcHAKQEAgLTAsMCArMSwyMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk1lZGlhQnVmZmVyR3JvdXAiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxsaXN0PgorCisjaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIHN0ZDo6bWluIGlzIG5vdCBjb25zdGV4cHIgaW4gQysrMTEKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citjb25zdGV4cHIgVCBNSU4oY29uc3QgVCAmYSwgY29uc3QgVCAmYikgeyByZXR1cm4gYSA8PSBiID8gYSA6IGI7IH0KKworLy8gTWVkaWFCdWZmZXJHcm91cCBtYXkgY3JlYXRlIHNoYXJlZCBtZW1vcnkgYnVmZmVycyBhdCBhCisvLyBzbWFsbGVyIHRocmVzaG9sZCB0aGFuIGFuIGlzb2xhdGVkIG5ldyBNZWRpYUJ1ZmZlci4KK3N0YXRpYyBjb25zdCBzaXplX3Qga1NoYXJlZE1lbW9yeVRocmVzaG9sZCA9IE1JTigKKyAgICAgICAgKHNpemVfdClNZWRpYUJ1ZmZlcjo6a1NoYXJlZE1lbVRocmVzaG9sZCwgKHNpemVfdCkoNCAqIDEwMjQpKTsKKworc3RydWN0IE1lZGlhQnVmZmVyR3JvdXA6OkludGVybmFsRGF0YSB7CisgICAgTXV0ZXggbUxvY2s7CisgICAgQ29uZGl0aW9uIG1Db25kaXRpb247CisgICAgc2l6ZV90IG1Hcm93dGhMaW1pdDsgIC8vIERvIG5vdCBhdXRvbWF0aWNhbGx5IGdyb3cgZ3JvdXAgbGFyZ2VyIHRoYW4gdGhpcy4KKyAgICBzdGQ6Omxpc3Q8TWVkaWFCdWZmZXJCYXNlICo+IG1CdWZmZXJzOworfTsKKworTWVkaWFCdWZmZXJHcm91cDo6TWVkaWFCdWZmZXJHcm91cChzaXplX3QgZ3Jvd3RoTGltaXQpCisgICAgOiBtSW50ZXJuYWwobmV3IEludGVybmFsRGF0YSgpKSB7CisgICAgbUludGVybmFsLT5tR3Jvd3RoTGltaXQgPSBncm93dGhMaW1pdDsKK30KKworTWVkaWFCdWZmZXJHcm91cDo6TWVkaWFCdWZmZXJHcm91cChzaXplX3QgYnVmZmVycywgc2l6ZV90IGJ1ZmZlcl9zaXplLCBzaXplX3QgZ3Jvd3RoTGltaXQpCisgICAgOiBtSW50ZXJuYWwobmV3IEludGVybmFsRGF0YSgpKSB7CisgICAgbUludGVybmFsLT5tR3Jvd3RoTGltaXQgPSBncm93dGhMaW1pdDsKKworICAgIGlmIChtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCA+IDAgJiYgYnVmZmVycyA+IG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0KSB7CisgICAgICAgIEFMT0dXKCJQcmVhbGxvY2F0ZWQgYnVmZmVycyAlenUgPiBncm93dGhMaW1pdCAlenUsIGluY3JlYXNpbmcgZ3Jvd3RoTGltaXQiLAorICAgICAgICAgICAgICAgIGJ1ZmZlcnMsIG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0KTsKKyAgICAgICAgbUludGVybmFsLT5tR3Jvd3RoTGltaXQgPSBidWZmZXJzOworICAgIH0KKworICAgIGlmIChidWZmZXJfc2l6ZSA+PSBrU2hhcmVkTWVtb3J5VGhyZXNob2xkKSB7CisgICAgICAgIEFMT0dEKCJjcmVhdGluZyBNZW1vcnlEZWFsZXIiKTsKKyAgICAgICAgLy8gVXNpbmcgYSBzaW5nbGUgTWVtb3J5RGVhbGVyIGlzIGVmZmljaWVudCBmb3IgYSBncm91cCBvZiBzaGFyZWQgbWVtb3J5IG9iamVjdHMuCisgICAgICAgIC8vIFRoaXMgbG9vcCBndWFyYW50ZWVzIHRoYXQgd2UgdXNlIHNoYXJlZCBtZW1vcnkgKG5vIGZhbGxiYWNrIHRvIG1hbGxvYykuCisKKyAgICAgICAgc2l6ZV90IGFsaWdubWVudCA9IE1lbW9yeURlYWxlcjo6Z2V0QWxsb2NhdGlvbkFsaWdubWVudCgpOworICAgICAgICBzaXplX3QgYXVnbWVudGVkX3NpemUgPSBidWZmZXJfc2l6ZSArIHNpemVvZihNZWRpYUJ1ZmZlcjo6U2hhcmVkQ29udHJvbCk7CisgICAgICAgIHNpemVfdCB0b3RhbCA9IChhdWdtZW50ZWRfc2l6ZSArIGFsaWdubWVudCAtIDEpIC8gYWxpZ25tZW50ICogYWxpZ25tZW50ICogYnVmZmVyczsKKyAgICAgICAgc3A8TWVtb3J5RGVhbGVyPiBtZW1vcnlEZWFsZXIgPSBuZXcgTWVtb3J5RGVhbGVyKHRvdGFsLCAiTWVkaWFCdWZmZXJHcm91cCIpOworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYnVmZmVyczsgKytpKSB7CisgICAgICAgICAgICBzcDxJTWVtb3J5PiBtZW0gPSBtZW1vcnlEZWFsZXItPmFsbG9jYXRlKGF1Z21lbnRlZF9zaXplKTsKKyAgICAgICAgICAgIGlmIChtZW0uZ2V0KCkgPT0gbnVsbHB0ciB8fCBtZW0tPnBvaW50ZXIoKSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIk9ubHkgYWxsb2NhdGVkICV6dSBzaGFyZWQgYnVmZmVycyBvZiBzaXplICV6dSIsIGksIGJ1ZmZlcl9zaXplKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIobWVtKTsKKyAgICAgICAgICAgIGJ1ZmZlci0+Z2V0U2hhcmVkQ29udHJvbCgpLT5jbGVhcigpOworICAgICAgICAgICAgYWRkX2J1ZmZlcihidWZmZXIpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBOb24tc2hhcmVkIG1lbW9yeSBhbGxvY2F0aW9uLgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYnVmZmVyczsgKytpKSB7CisgICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoYnVmZmVyX3NpemUpOworICAgICAgICBpZiAoYnVmZmVyLT5kYXRhKCkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgZGVsZXRlIGJ1ZmZlcjsgLy8gZG9uJ3QgY2FsbCByZWxlYXNlLCBpdCdzIG5vdCBwcm9wZXJseSBmb3JtZWQKKyAgICAgICAgICAgIEFMT0dXKCJPbmx5IGFsbG9jYXRlZCAlenUgbWFsbG9jIGJ1ZmZlcnMgb2Ygc2l6ZSAlenUiLCBpLCBidWZmZXJfc2l6ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBhZGRfYnVmZmVyKGJ1ZmZlcik7CisgICAgfQorfQorCitNZWRpYUJ1ZmZlckdyb3VwOjp+TWVkaWFCdWZmZXJHcm91cCgpIHsKKyAgICBmb3IgKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyIDogbUludGVybmFsLT5tQnVmZmVycykgeworICAgICAgICBpZiAoYnVmZmVyLT5yZWZjb3VudCgpICE9IDApIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBsb2NhbFJlZmNvdW50ID0gYnVmZmVyLT5sb2NhbFJlZmNvdW50KCk7CisgICAgICAgICAgICBjb25zdCBpbnQgcmVtb3RlUmVmY291bnQgPSBidWZmZXItPnJlbW90ZVJlZmNvdW50KCk7CisKKyAgICAgICAgICAgIC8vIEZhdGFsIGlmIHdlIGhhdmUgYSBsb2NhbCByZWZjb3VudC4KKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobG9jYWxSZWZjb3VudCAhPSAwLAorICAgICAgICAgICAgICAgICAgICAiYnVmZmVyKCVwKSBsb2NhbFJlZmNvdW50ICVkICE9IDAsIHJlbW90ZVJlZmNvdW50ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBsb2NhbFJlZmNvdW50LCByZW1vdGVSZWZjb3VudCk7CisKKyAgICAgICAgICAgIC8vIExvZyBhbiBlcnJvciBpZiB3ZSBoYXZlIGEgcmVtYWluaW5nIHJlbW90ZSByZWZjb3VudCwKKyAgICAgICAgICAgIC8vIGFzIHRoZSByZW1vdGUgcHJvY2VzcyBtYXkgaGF2ZSBkaWVkIG9yIG1heSBoYXZlIGluYXBwcm9wcmlhdGUgYmVoYXZpb3IuCisgICAgICAgICAgICAvLyBUaGUgc2hhcmVkIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIE1lZGlhQnVmZmVyIHdpbGwKKyAgICAgICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgYmUgcmVjbGFpbWVkIHdoZW4gdGhlcmUgYXJlIG5vIHJlbWFpbmluZyBmZHMKKyAgICAgICAgICAgIC8vIGFzc29jaWF0ZWQgd2l0aCBpdC4KKyAgICAgICAgICAgIEFMT0dFKCJidWZmZXIoJXApIGhhcyByZXNpZHVhbCByZW1vdGVSZWZjb3VudCAlZCIsCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgcmVtb3RlUmVmY291bnQpOworICAgICAgICB9CisgICAgICAgIC8vIGdyYWNlZnVsbHkgZGVsZXRlLgorICAgICAgICBidWZmZXItPnNldE9ic2VydmVyKG51bGxwdHIpOworICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICB9CisgICAgZGVsZXRlIG1JbnRlcm5hbDsKK30KKwordm9pZCBNZWRpYUJ1ZmZlckdyb3VwOjphZGRfYnVmZmVyKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1JbnRlcm5hbC0+bUxvY2spOworCisgICAgLy8gaWYgd2UncmUgYWJvdmUgb3VyIGdyb3d0aCBsaW1pdCwgcmVsZWFzZSBidWZmZXJzIGlmIHdlIGNhbgorICAgIGZvciAoYXV0byBpdCA9IG1JbnRlcm5hbC0+bUJ1ZmZlcnMuYmVnaW4oKTsKKyAgICAgICAgICAgIG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0ID4gMAorICAgICAgICAgICAgJiYgbUludGVybmFsLT5tQnVmZmVycy5zaXplKCkgPj0gbUludGVybmFsLT5tR3Jvd3RoTGltaXQKKyAgICAgICAgICAgICYmIGl0ICE9IG1JbnRlcm5hbC0+bUJ1ZmZlcnMuZW5kKCk7KSB7CisgICAgICAgIGlmICgoKml0KS0+cmVmY291bnQoKSA9PSAwKSB7CisgICAgICAgICAgICAoKml0KS0+c2V0T2JzZXJ2ZXIobnVsbHB0cik7CisgICAgICAgICAgICAoKml0KS0+cmVsZWFzZSgpOworICAgICAgICAgICAgaXQgPSBtSW50ZXJuYWwtPm1CdWZmZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICsraXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBidWZmZXItPnNldE9ic2VydmVyKHRoaXMpOworICAgIG1JbnRlcm5hbC0+bUJ1ZmZlcnMuZW1wbGFjZV9iYWNrKGJ1ZmZlcik7Cit9CisKK2Jvb2wgTWVkaWFCdWZmZXJHcm91cDo6aGFzX2J1ZmZlcnMoKSB7CisgICAgaWYgKG1JbnRlcm5hbC0+bUJ1ZmZlcnMuc2l6ZSgpIDwgbUludGVybmFsLT5tR3Jvd3RoTGltaXQpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7IC8vIFdlIGNhbiBhZGQgbW9yZSBidWZmZXJzIGludGVybmFsbHkuCisgICAgfQorICAgIGZvciAoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIgOiBtSW50ZXJuYWwtPm1CdWZmZXJzKSB7CisgICAgICAgIGlmIChidWZmZXItPnJlZmNvdW50KCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0dXNfdCBNZWRpYUJ1ZmZlckdyb3VwOjphY3F1aXJlX2J1ZmZlcigKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0LCBib29sIG5vbkJsb2NraW5nLCBzaXplX3QgcmVxdWVzdGVkU2l6ZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtSW50ZXJuYWwtPm1Mb2NrKTsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIHNpemVfdCBzbWFsbGVzdCA9IHJlcXVlc3RlZFNpemU7CisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgYXV0byBmcmVlID0gbUludGVybmFsLT5tQnVmZmVycy5lbmQoKTsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gbUludGVybmFsLT5tQnVmZmVycy5iZWdpbigpOyBpdCAhPSBtSW50ZXJuYWwtPm1CdWZmZXJzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBpZiAoKCppdCktPnJlZmNvdW50KCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBzaXplID0gKCppdCktPnNpemUoKTsKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA+PSByZXF1ZXN0ZWRTaXplKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9ICppdDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzaXplIDwgc21hbGxlc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgc21hbGxlc3QgPSBzaXplOyAvLyBhbHdheXMgZnJlZSB0aGUgc21hbGxlc3QgYnVmCisgICAgICAgICAgICAgICAgICAgIGZyZWUgPSBpdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxscHRyCisgICAgICAgICAgICAgICAgJiYgKGZyZWUgIT0gbUludGVybmFsLT5tQnVmZmVycy5lbmQoKQorICAgICAgICAgICAgICAgICAgICB8fCBtSW50ZXJuYWwtPm1CdWZmZXJzLnNpemUoKSA8IG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0KSkgeworICAgICAgICAgICAgLy8gV2UgYWxsb2MgYmVmb3JlIHdlIGZyZWUgc28gZmFpbHVyZSBsZWF2ZXMgZ3JvdXAgdW5jaGFuZ2VkLgorICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGFsbG9jYXRlU2l6ZSA9IHJlcXVlc3RlZFNpemUgPCBTSVpFX01BWCAvIDMgKiAyIC8qIE5COiBvcmRlcmluZyAqLyA/CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZFNpemUgKiAzIC8gMiA6IHJlcXVlc3RlZFNpemU7CisgICAgICAgICAgICBidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoYWxsb2NhdGVTaXplKTsKKyAgICAgICAgICAgIGlmIChidWZmZXItPmRhdGEoKSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkFsbG9jYXRpb24gZmFpbHVyZSBmb3Igc2l6ZSAlenUiLCBhbGxvY2F0ZVNpemUpOworICAgICAgICAgICAgICAgIGRlbGV0ZSBidWZmZXI7IC8vIEludmFsaWQgYWxsb2MsIHByZWZlciBub3QgdG8gY2FsbCByZWxlYXNlLgorICAgICAgICAgICAgICAgIGJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0T2JzZXJ2ZXIodGhpcyk7CisgICAgICAgICAgICAgICAgaWYgKGZyZWUgIT0gbUludGVybmFsLT5tQnVmZmVycy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigicmVhbGxvY2F0ZSBidWZmZXIsIHJlcXVlc3RlZCBzaXplICV6dSB2cyBhdmFpbGFibGUgJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRTaXplLCAoKmZyZWUpLT5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICAoKmZyZWUpLT5zZXRPYnNlcnZlcihudWxscHRyKTsKKyAgICAgICAgICAgICAgICAgICAgKCpmcmVlKS0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgICAgICAqZnJlZSA9IGJ1ZmZlcjsgLy8gaW4tcGxhY2UgcmVwbGFjZQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJhbGxvY2F0ZSBidWZmZXIsIHJlcXVlc3RlZCBzaXplICV6dSIsIHJlcXVlc3RlZFNpemUpOworICAgICAgICAgICAgICAgICAgICBtSW50ZXJuYWwtPm1CdWZmZXJzLmVtcGxhY2VfYmFjayhidWZmZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoYnVmZmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+YWRkX3JlZigpOworICAgICAgICAgICAgYnVmZmVyLT5yZXNldCgpOworICAgICAgICAgICAgKm91dCA9IGJ1ZmZlcjsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgICAgICBpZiAobm9uQmxvY2tpbmcpIHsKKyAgICAgICAgICAgICpvdXQgPSBudWxscHRyOworICAgICAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOworICAgICAgICB9CisgICAgICAgIC8vIEFsbCBidWZmZXJzIGFyZSBpbiB1c2UsIGJsb2NrIHVudGlsIG9uZSBvZiB0aGVtIGlzIHJldHVybmVkLgorICAgICAgICBtSW50ZXJuYWwtPm1Db25kaXRpb24ud2FpdChtSW50ZXJuYWwtPm1Mb2NrKTsKKyAgICB9CisgICAgLy8gTmV2ZXIgZ2V0cyBoZXJlLgorfQorCitzaXplX3QgTWVkaWFCdWZmZXJHcm91cDo6YnVmZmVycygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUludGVybmFsLT5tQnVmZmVycy5zaXplKCk7Cit9CisKK3ZvaWQgTWVkaWFCdWZmZXJHcm91cDo6c2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXJCYXNlICopIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUludGVybmFsLT5tTG9jayk7CisgICAgbUludGVybmFsLT5tQ29uZGl0aW9uLnNpZ25hbCgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YjNkYzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3Rvci5jcHAKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFFeHRyYWN0b3IiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8cHdkLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNZWRpYUV4dHJhY3Rvcjo6TWVkaWFFeHRyYWN0b3IoKSB7CisgICAgaWYgKCFMT0dfTkRFQlVHKSB7CisgICAgICAgIHVpZF90IHVpZCA9IGdldHVpZCgpOworICAgICAgICBzdHJ1Y3QgcGFzc3dkICpwdyA9IGdldHB3dWlkKHVpZCk7CisgICAgICAgIEFMT0dWKCJleHRyYWN0b3IgY3JlYXRlZCBpbiB1aWQ6ICVkICglcykiLCBnZXR1aWQoKSwgcHctPnB3X25hbWUpOworICAgIH0KK30KKworTWVkaWFFeHRyYWN0b3I6On5NZWRpYUV4dHJhY3RvcigpIHt9CisKK3VpbnQzMl90IE1lZGlhRXh0cmFjdG9yOjpmbGFncygpIGNvbnN0IHsKKyAgICByZXR1cm4gQ0FOX1NFRUtfQkFDS1dBUkQgfCBDQU5fU0VFS19GT1JXQVJEIHwgQ0FOX1BBVVNFIHwgQ0FOX1NFRUs7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYVNvdXJjZS5jcHAgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYVNvdXJjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJiZDNkOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhU291cmNlLmNwcApAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhU291cmNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTWVkaWFTb3VyY2U6Ok1lZGlhU291cmNlKCkge30KKworTWVkaWFTb3VyY2U6On5NZWRpYVNvdXJjZSgpIHt9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYVRyYWNrLmNwcCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhVHJhY2suY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NjNmNTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYVRyYWNrLmNwcApAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNZWRpYVRyYWNrOjpNZWRpYVRyYWNrKCkge30KKworTWVkaWFUcmFjazo6fk1lZGlhVHJhY2soKSB7fQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6UmVhZE9wdGlvbnMoKSB7CisgICAgcmVzZXQoKTsKK30KKwordm9pZCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6cmVzZXQoKSB7CisgICAgbU9wdGlvbnMgPSAwOworICAgIG1TZWVrVGltZVVzID0gMDsKKyAgICBtTm9uQmxvY2tpbmcgPSBmYWxzZTsKK30KKwordm9pZCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6c2V0Tm9uQmxvY2tpbmcoKSB7CisgICAgbU5vbkJsb2NraW5nID0gdHJ1ZTsKK30KKwordm9pZCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6Y2xlYXJOb25CbG9ja2luZygpIHsKKyAgICBtTm9uQmxvY2tpbmcgPSBmYWxzZTsKK30KKworYm9vbCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6Z2V0Tm9uQmxvY2tpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Ob25CbG9ja2luZzsKK30KKwordm9pZCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6c2V0U2Vla1RvKGludDY0X3QgdGltZV91cywgU2Vla01vZGUgbW9kZSkgeworICAgIG1PcHRpb25zIHw9IGtTZWVrVG9fT3B0aW9uOworICAgIG1TZWVrVGltZVVzID0gdGltZV91czsKKyAgICBtU2Vla01vZGUgPSBtb2RlOworfQorCit2b2lkIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpjbGVhclNlZWtUbygpIHsKKyAgICBtT3B0aW9ucyAmPSB+a1NlZWtUb19PcHRpb247CisgICAgbVNlZWtUaW1lVXMgPSAwOworICAgIG1TZWVrTW9kZSA9IFNFRUtfQ0xPU0VTVF9TWU5DOworfQorCitib29sIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpnZXRTZWVrVG8oCisgICAgICAgIGludDY0X3QgKnRpbWVfdXMsIFNlZWtNb2RlICptb2RlKSBjb25zdCB7CisgICAgKnRpbWVfdXMgPSBtU2Vla1RpbWVVczsKKyAgICAqbW9kZSA9IG1TZWVrTW9kZTsKKyAgICByZXR1cm4gKG1PcHRpb25zICYga1NlZWtUb19PcHRpb24pICE9IDA7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZXRhRGF0YS5jcHAgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZXRhRGF0YS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQwYTYwNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01ldGFEYXRhLmNwcApAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNZXRhRGF0YSIKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworCitNZXRhRGF0YTo6TWV0YURhdGEoKSB7Cit9CisKK01ldGFEYXRhOjpNZXRhRGF0YShjb25zdCBNZXRhRGF0YSAmZnJvbSkKKyAgICA6IE1ldGFEYXRhQmFzZShmcm9tKSB7Cit9CitNZXRhRGF0YTo6TWV0YURhdGEoY29uc3QgTWV0YURhdGFCYXNlICZmcm9tKQorICAgIDogTWV0YURhdGFCYXNlKGZyb20pIHsKK30KKworTWV0YURhdGE6On5NZXRhRGF0YSgpIHsKK30KKworLyogc3RhdGljICovCitzcDxNZXRhRGF0YT4gTWV0YURhdGE6OmNyZWF0ZUZyb21QYXJjZWwoY29uc3QgUGFyY2VsICZwYXJjZWwpIHsKKworICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhKCk7CisgICAgbWV0YS0+dXBkYXRlRnJvbVBhcmNlbChwYXJjZWwpOworICAgIHJldHVybiBtZXRhOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZXRhRGF0YUJhc2UuY3BwIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWV0YURhdGFCYXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmVhNmYxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWV0YURhdGFCYXNlLmNwcApAQCAtMCwwICsxLDUzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWV0YURhdGFCYXNlIgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IE1ldGFEYXRhQmFzZTo6dHlwZWRfZGF0YSB7CisgICAgdHlwZWRfZGF0YSgpOworICAgIH50eXBlZF9kYXRhKCk7CisKKyAgICB0eXBlZF9kYXRhKGNvbnN0IE1ldGFEYXRhQmFzZTo6dHlwZWRfZGF0YSAmKTsKKyAgICB0eXBlZF9kYXRhICZvcGVyYXRvcj0oY29uc3QgTWV0YURhdGFCYXNlOjp0eXBlZF9kYXRhICYpOworCisgICAgdm9pZCBjbGVhcigpOworICAgIHZvaWQgc2V0RGF0YSh1aW50MzJfdCB0eXBlLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgdm9pZCBnZXREYXRhKHVpbnQzMl90ICp0eXBlLCBjb25zdCB2b2lkICoqZGF0YSwgc2l6ZV90ICpzaXplKSBjb25zdDsKKyAgICAvLyBtYXkgaW5jbHVkZSBoZXhkdW1wIG9mIGJpbmFyeSBkYXRhIGlmIHZlcmJvc2U9dHJ1ZQorICAgIFN0cmluZzggYXNTdHJpbmcoYm9vbCB2ZXJib3NlKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICB1aW50MzJfdCBtVHlwZTsKKyAgICBzaXplX3QgbVNpemU7CisKKyAgICB1bmlvbiB7CisgICAgICAgIHZvaWQgKmV4dF9kYXRhOworICAgICAgICBmbG9hdCByZXNlcnZvaXI7CisgICAgfSB1OworCisgICAgYm9vbCB1c2VzUmVzZXJ2b2lyKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVNpemUgPD0gc2l6ZW9mKHUucmVzZXJ2b2lyKTsKKyAgICB9CisKKyAgICB2b2lkICphbGxvY2F0ZVN0b3JhZ2Uoc2l6ZV90IHNpemUpOworICAgIHZvaWQgZnJlZVN0b3JhZ2UoKTsKKworICAgIHZvaWQgKnN0b3JhZ2UoKSB7CisgICAgICAgIHJldHVybiB1c2VzUmVzZXJ2b2lyKCkgPyAmdS5yZXNlcnZvaXIgOiB1LmV4dF9kYXRhOworICAgIH0KKworICAgIGNvbnN0IHZvaWQgKnN0b3JhZ2UoKSBjb25zdCB7CisgICAgICAgIHJldHVybiB1c2VzUmVzZXJ2b2lyKCkgPyAmdS5yZXNlcnZvaXIgOiB1LmV4dF9kYXRhOworICAgIH0KK307CisKK3N0cnVjdCBNZXRhRGF0YUJhc2U6OlJlY3QgeworICAgIGludDMyX3QgbUxlZnQsIG1Ub3AsIG1SaWdodCwgbUJvdHRvbTsKK307CisKKworc3RydWN0IE1ldGFEYXRhQmFzZTo6TWV0YURhdGFJbnRlcm5hbCB7CisgICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIE1ldGFEYXRhQmFzZTo6dHlwZWRfZGF0YT4gbUl0ZW1zOworfTsKKworCitNZXRhRGF0YUJhc2U6Ok1ldGFEYXRhQmFzZSgpCisgICAgOiBtSW50ZXJuYWxEYXRhKG5ldyBNZXRhRGF0YUludGVybmFsKCkpIHsKK30KKworTWV0YURhdGFCYXNlOjpNZXRhRGF0YUJhc2UoY29uc3QgTWV0YURhdGFCYXNlICZmcm9tKQorICAgIDogbUludGVybmFsRGF0YShuZXcgTWV0YURhdGFJbnRlcm5hbCgpKSB7CisgICAgbUludGVybmFsRGF0YS0+bUl0ZW1zID0gZnJvbS5tSW50ZXJuYWxEYXRhLT5tSXRlbXM7Cit9CisKK01ldGFEYXRhQmFzZSYgTWV0YURhdGFCYXNlOjpvcGVyYXRvciA9IChjb25zdCBNZXRhRGF0YUJhc2UgJnJocykgeworICAgIHRoaXMtPm1JbnRlcm5hbERhdGEtPm1JdGVtcyA9IHJocy5tSW50ZXJuYWxEYXRhLT5tSXRlbXM7CisgICAgcmV0dXJuICp0aGlzOworfQorCitNZXRhRGF0YUJhc2U6On5NZXRhRGF0YUJhc2UoKSB7CisgICAgY2xlYXIoKTsKKyAgICBkZWxldGUgbUludGVybmFsRGF0YTsKK30KKwordm9pZCBNZXRhRGF0YUJhc2U6OmNsZWFyKCkgeworICAgIG1JbnRlcm5hbERhdGEtPm1JdGVtcy5jbGVhcigpOworfQorCitib29sIE1ldGFEYXRhQmFzZTo6cmVtb3ZlKHVpbnQzMl90IGtleSkgeworICAgIHNzaXplX3QgaSA9IG1JbnRlcm5hbERhdGEtPm1JdGVtcy5pbmRleE9mS2V5KGtleSk7CisKKyAgICBpZiAoaSA8IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1JbnRlcm5hbERhdGEtPm1JdGVtcy5yZW1vdmVJdGVtc0F0KGkpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTWV0YURhdGFCYXNlOjpzZXRDU3RyaW5nKHVpbnQzMl90IGtleSwgY29uc3QgY2hhciAqdmFsdWUpIHsKKyAgICByZXR1cm4gc2V0RGF0YShrZXksIFRZUEVfQ19TVFJJTkcsIHZhbHVlLCBzdHJsZW4odmFsdWUpICsgMSk7Cit9CisKK2Jvb2wgTWV0YURhdGFCYXNlOjpzZXRJbnQzMih1aW50MzJfdCBrZXksIGludDMyX3QgdmFsdWUpIHsKKyAgICByZXR1cm4gc2V0RGF0YShrZXksIFRZUEVfSU5UMzIsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7Cit9CisKK2Jvb2wgTWV0YURhdGFCYXNlOjpzZXRJbnQ2NCh1aW50MzJfdCBrZXksIGludDY0X3QgdmFsdWUpIHsKKyAgICByZXR1cm4gc2V0RGF0YShrZXksIFRZUEVfSU5UNjQsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7Cit9CisKK2Jvb2wgTWV0YURhdGFCYXNlOjpzZXRGbG9hdCh1aW50MzJfdCBrZXksIGZsb2F0IHZhbHVlKSB7CisgICAgcmV0dXJuIHNldERhdGEoa2V5LCBUWVBFX0ZMT0FULCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpOworfQorCitib29sIE1ldGFEYXRhQmFzZTo6c2V0UG9pbnRlcih1aW50MzJfdCBrZXksIHZvaWQgKnZhbHVlKSB7CisgICAgcmV0dXJuIHNldERhdGEoa2V5LCBUWVBFX1BPSU5URVIsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7Cit9CisKK2Jvb2wgTWV0YURhdGFCYXNlOjpzZXRSZWN0KAorICAgICAgICB1aW50MzJfdCBrZXksCisgICAgICAgIGludDMyX3QgbGVmdCwgaW50MzJfdCB0b3AsCisgICAgICAgIGludDMyX3QgcmlnaHQsIGludDMyX3QgYm90dG9tKSB7CisgICAgUmVjdCByOworICAgIHIubUxlZnQgPSBsZWZ0OworICAgIHIubVRvcCA9IHRvcDsKKyAgICByLm1SaWdodCA9IHJpZ2h0OworICAgIHIubUJvdHRvbSA9IGJvdHRvbTsKKworICAgIHJldHVybiBzZXREYXRhKGtleSwgVFlQRV9SRUNULCAmciwgc2l6ZW9mKHIpKTsKK30KKworLyoqCisgKiBOb3RlIHRoYXQgdGhlIHJldHVybmVkIHBvaW50ZXIgYmVjb21lcyBpbnZhbGlkIHdoZW4gYWRkaXRpb25hbCBtZXRhZGF0YSBpcyBzZXQuCisgKi8KK2Jvb2wgTWV0YURhdGFCYXNlOjpmaW5kQ1N0cmluZyh1aW50MzJfdCBrZXksIGNvbnN0IGNoYXIgKip2YWx1ZSkgY29uc3QgeworICAgIHVpbnQzMl90IHR5cGU7CisgICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICBzaXplX3Qgc2l6ZTsKKyAgICBpZiAoIWZpbmREYXRhKGtleSwgJnR5cGUsICZkYXRhLCAmc2l6ZSkgfHwgdHlwZSAhPSBUWVBFX0NfU1RSSU5HKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAqdmFsdWUgPSAoY29uc3QgY2hhciAqKWRhdGE7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNZXRhRGF0YUJhc2U6OmZpbmRJbnQzMih1aW50MzJfdCBrZXksIGludDMyX3QgKnZhbHVlKSBjb25zdCB7CisgICAgdWludDMyX3QgdHlwZSA9IDA7CisgICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICBzaXplX3Qgc2l6ZTsKKyAgICBpZiAoIWZpbmREYXRhKGtleSwgJnR5cGUsICZkYXRhLCAmc2l6ZSkgfHwgdHlwZSAhPSBUWVBFX0lOVDMyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBDSEVDS19FUShzaXplLCBzaXplb2YoKnZhbHVlKSk7CisKKyAgICAqdmFsdWUgPSAqKGludDMyX3QgKilkYXRhOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTWV0YURhdGFCYXNlOjpmaW5kSW50NjQodWludDMyX3Qga2V5LCBpbnQ2NF90ICp2YWx1ZSkgY29uc3QgeworICAgIHVpbnQzMl90IHR5cGUgPSAwOworICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgc2l6ZV90IHNpemU7CisgICAgaWYgKCFmaW5kRGF0YShrZXksICZ0eXBlLCAmZGF0YSwgJnNpemUpIHx8IHR5cGUgIT0gVFlQRV9JTlQ2NCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQ0hFQ0tfRVEoc2l6ZSwgc2l6ZW9mKCp2YWx1ZSkpOworCisgICAgKnZhbHVlID0gKihpbnQ2NF90ICopZGF0YTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE1ldGFEYXRhQmFzZTo6ZmluZEZsb2F0KHVpbnQzMl90IGtleSwgZmxvYXQgKnZhbHVlKSBjb25zdCB7CisgICAgdWludDMyX3QgdHlwZSA9IDA7CisgICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICBzaXplX3Qgc2l6ZTsKKyAgICBpZiAoIWZpbmREYXRhKGtleSwgJnR5cGUsICZkYXRhLCAmc2l6ZSkgfHwgdHlwZSAhPSBUWVBFX0ZMT0FUKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBDSEVDS19FUShzaXplLCBzaXplb2YoKnZhbHVlKSk7CisKKyAgICAqdmFsdWUgPSAqKGZsb2F0ICopZGF0YTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE1ldGFEYXRhQmFzZTo6ZmluZFBvaW50ZXIodWludDMyX3Qga2V5LCB2b2lkICoqdmFsdWUpIGNvbnN0IHsKKyAgICB1aW50MzJfdCB0eXBlID0gMDsKKyAgICBjb25zdCB2b2lkICpkYXRhOworICAgIHNpemVfdCBzaXplOworICAgIGlmICghZmluZERhdGEoa2V5LCAmdHlwZSwgJmRhdGEsICZzaXplKSB8fCB0eXBlICE9IFRZUEVfUE9JTlRFUikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQ0hFQ0tfRVEoc2l6ZSwgc2l6ZW9mKCp2YWx1ZSkpOworCisgICAgKnZhbHVlID0gKih2b2lkICoqKWRhdGE7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNZXRhRGF0YUJhc2U6OmZpbmRSZWN0KAorICAgICAgICB1aW50MzJfdCBrZXksCisgICAgICAgIGludDMyX3QgKmxlZnQsIGludDMyX3QgKnRvcCwKKyAgICAgICAgaW50MzJfdCAqcmlnaHQsIGludDMyX3QgKmJvdHRvbSkgY29uc3QgeworICAgIHVpbnQzMl90IHR5cGUgPSAwOworICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgc2l6ZV90IHNpemU7CisgICAgaWYgKCFmaW5kRGF0YShrZXksICZ0eXBlLCAmZGF0YSwgJnNpemUpIHx8IHR5cGUgIT0gVFlQRV9SRUNUKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBDSEVDS19FUShzaXplLCBzaXplb2YoUmVjdCkpOworCisgICAgY29uc3QgUmVjdCAqciA9IChjb25zdCBSZWN0ICopZGF0YTsKKyAgICAqbGVmdCA9IHItPm1MZWZ0OworICAgICp0b3AgPSByLT5tVG9wOworICAgICpyaWdodCA9IHItPm1SaWdodDsKKyAgICAqYm90dG9tID0gci0+bUJvdHRvbTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE1ldGFEYXRhQmFzZTo6c2V0RGF0YSgKKyAgICAgICAgdWludDMyX3Qga2V5LCB1aW50MzJfdCB0eXBlLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGJvb2wgb3Zlcndyb3RlX2V4aXN0aW5nID0gdHJ1ZTsKKworICAgIHNzaXplX3QgaSA9IG1JbnRlcm5hbERhdGEtPm1JdGVtcy5pbmRleE9mS2V5KGtleSk7CisgICAgaWYgKGkgPCAwKSB7CisgICAgICAgIHR5cGVkX2RhdGEgaXRlbTsKKyAgICAgICAgaSA9IG1JbnRlcm5hbERhdGEtPm1JdGVtcy5hZGQoa2V5LCBpdGVtKTsKKworICAgICAgICBvdmVyd3JvdGVfZXhpc3RpbmcgPSBmYWxzZTsKKyAgICB9CisKKyAgICB0eXBlZF9kYXRhICZpdGVtID0gbUludGVybmFsRGF0YS0+bUl0ZW1zLmVkaXRWYWx1ZUF0KGkpOworCisgICAgaXRlbS5zZXREYXRhKHR5cGUsIGRhdGEsIHNpemUpOworCisgICAgcmV0dXJuIG92ZXJ3cm90ZV9leGlzdGluZzsKK30KKworYm9vbCBNZXRhRGF0YUJhc2U6OmZpbmREYXRhKHVpbnQzMl90IGtleSwgdWludDMyX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICoqZGF0YSwgc2l6ZV90ICpzaXplKSBjb25zdCB7CisgICAgc3NpemVfdCBpID0gbUludGVybmFsRGF0YS0+bUl0ZW1zLmluZGV4T2ZLZXkoa2V5KTsKKworICAgIGlmIChpIDwgMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29uc3QgdHlwZWRfZGF0YSAmaXRlbSA9IG1JbnRlcm5hbERhdGEtPm1JdGVtcy52YWx1ZUF0KGkpOworCisgICAgaXRlbS5nZXREYXRhKHR5cGUsIGRhdGEsIHNpemUpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTWV0YURhdGFCYXNlOjpoYXNEYXRhKHVpbnQzMl90IGtleSkgY29uc3QgeworICAgIHNzaXplX3QgaSA9IG1JbnRlcm5hbERhdGEtPm1JdGVtcy5pbmRleE9mS2V5KGtleSk7CisKKyAgICBpZiAoaSA8IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitNZXRhRGF0YUJhc2U6OnR5cGVkX2RhdGE6OnR5cGVkX2RhdGEoKQorICAgIDogbVR5cGUoMCksCisgICAgICBtU2l6ZSgwKSB7Cit9CisKK01ldGFEYXRhQmFzZTo6dHlwZWRfZGF0YTo6fnR5cGVkX2RhdGEoKSB7CisgICAgY2xlYXIoKTsKK30KKworTWV0YURhdGFCYXNlOjp0eXBlZF9kYXRhOjp0eXBlZF9kYXRhKGNvbnN0IHR5cGVkX2RhdGEgJmZyb20pCisgICAgOiBtVHlwZShmcm9tLm1UeXBlKSwKKyAgICAgIG1TaXplKDApIHsKKworICAgIHZvaWQgKmRzdCA9IGFsbG9jYXRlU3RvcmFnZShmcm9tLm1TaXplKTsKKyAgICBpZiAoZHN0KSB7CisgICAgICAgIG1lbWNweShkc3QsIGZyb20uc3RvcmFnZSgpLCBtU2l6ZSk7CisgICAgfQorfQorCitNZXRhRGF0YUJhc2U6OnR5cGVkX2RhdGEgJk1ldGFEYXRhQmFzZTo6dHlwZWRfZGF0YTo6b3BlcmF0b3I9KAorICAgICAgICBjb25zdCBNZXRhRGF0YUJhc2U6OnR5cGVkX2RhdGEgJmZyb20pIHsKKyAgICBpZiAodGhpcyAhPSAmZnJvbSkgeworICAgICAgICBjbGVhcigpOworICAgICAgICBtVHlwZSA9IGZyb20ubVR5cGU7CisgICAgICAgIHZvaWQgKmRzdCA9IGFsbG9jYXRlU3RvcmFnZShmcm9tLm1TaXplKTsKKyAgICAgICAgaWYgKGRzdCkgeworICAgICAgICAgICAgbWVtY3B5KGRzdCwgZnJvbS5zdG9yYWdlKCksIG1TaXplKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAqdGhpczsKK30KKwordm9pZCBNZXRhRGF0YUJhc2U6OnR5cGVkX2RhdGE6OmNsZWFyKCkgeworICAgIGZyZWVTdG9yYWdlKCk7CisKKyAgICBtVHlwZSA9IDA7Cit9CisKK3ZvaWQgTWV0YURhdGFCYXNlOjp0eXBlZF9kYXRhOjpzZXREYXRhKAorICAgICAgICB1aW50MzJfdCB0eXBlLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGNsZWFyKCk7CisKKyAgICBtVHlwZSA9IHR5cGU7CisKKyAgICB2b2lkICpkc3QgPSBhbGxvY2F0ZVN0b3JhZ2Uoc2l6ZSk7CisgICAgaWYgKGRzdCkgeworICAgICAgICBtZW1jcHkoZHN0LCBkYXRhLCBzaXplKTsKKyAgICB9Cit9CisKK3ZvaWQgTWV0YURhdGFCYXNlOjp0eXBlZF9kYXRhOjpnZXREYXRhKAorICAgICAgICB1aW50MzJfdCAqdHlwZSwgY29uc3Qgdm9pZCAqKmRhdGEsIHNpemVfdCAqc2l6ZSkgY29uc3QgeworICAgICp0eXBlID0gbVR5cGU7CisgICAgKnNpemUgPSBtU2l6ZTsKKyAgICAqZGF0YSA9IHN0b3JhZ2UoKTsKK30KKwordm9pZCAqTWV0YURhdGFCYXNlOjp0eXBlZF9kYXRhOjphbGxvY2F0ZVN0b3JhZ2Uoc2l6ZV90IHNpemUpIHsKKyAgICBtU2l6ZSA9IHNpemU7CisKKyAgICBpZiAodXNlc1Jlc2Vydm9pcigpKSB7CisgICAgICAgIHJldHVybiAmdS5yZXNlcnZvaXI7CisgICAgfQorCisgICAgdS5leHRfZGF0YSA9IG1hbGxvYyhtU2l6ZSk7CisgICAgaWYgKHUuZXh0X2RhdGEgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiQ291bGRuJ3QgYWxsb2NhdGUgJXp1IGJ5dGVzIGZvciBpdGVtIiwgc2l6ZSk7CisgICAgICAgIG1TaXplID0gMDsKKyAgICB9CisgICAgcmV0dXJuIHUuZXh0X2RhdGE7Cit9CisKK3ZvaWQgTWV0YURhdGFCYXNlOjp0eXBlZF9kYXRhOjpmcmVlU3RvcmFnZSgpIHsKKyAgICBpZiAoIXVzZXNSZXNlcnZvaXIoKSkgeworICAgICAgICBpZiAodS5leHRfZGF0YSkgeworICAgICAgICAgICAgZnJlZSh1LmV4dF9kYXRhKTsKKyAgICAgICAgICAgIHUuZXh0X2RhdGEgPSBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgbVNpemUgPSAwOworfQorCitTdHJpbmc4IE1ldGFEYXRhQmFzZTo6dHlwZWRfZGF0YTo6YXNTdHJpbmcoYm9vbCB2ZXJib3NlKSBjb25zdCB7CisgICAgU3RyaW5nOCBvdXQ7CisgICAgY29uc3Qgdm9pZCAqZGF0YSA9IHN0b3JhZ2UoKTsKKyAgICBzd2l0Y2gobVR5cGUpIHsKKyAgICAgICAgY2FzZSBUWVBFX05PTkU6CisgICAgICAgICAgICBvdXQgPSBTdHJpbmc4Ojpmb3JtYXQoIm5vIHR5cGUsIHNpemUgJXp1KSIsIG1TaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRZUEVfQ19TVFJJTkc6CisgICAgICAgICAgICBvdXQgPSBTdHJpbmc4Ojpmb3JtYXQoIihjaGFyKikgJXMiLCAoY29uc3QgY2hhciAqKWRhdGEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVFlQRV9JTlQzMjoKKyAgICAgICAgICAgIG91dCA9IFN0cmluZzg6OmZvcm1hdCgiKGludDMyX3QpICVkIiwgKihpbnQzMl90ICopZGF0YSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUWVBFX0lOVDY0OgorICAgICAgICAgICAgb3V0ID0gU3RyaW5nODo6Zm9ybWF0KCIoaW50NjRfdCkgJSIgUFJJZDY0LCAqKGludDY0X3QgKilkYXRhKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRZUEVfRkxPQVQ6CisgICAgICAgICAgICBvdXQgPSBTdHJpbmc4Ojpmb3JtYXQoIihmbG9hdCkgJWYiLCAqKGZsb2F0ICopZGF0YSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUWVBFX1BPSU5URVI6CisgICAgICAgICAgICBvdXQgPSBTdHJpbmc4Ojpmb3JtYXQoIih2b2lkKikgJXAiLCAqKHZvaWQgKiopZGF0YSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUWVBFX1JFQ1Q6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IFJlY3QgKnIgPSAoY29uc3QgUmVjdCAqKWRhdGE7CisgICAgICAgICAgICBvdXQgPSBTdHJpbmc4Ojpmb3JtYXQoIlJlY3QoJWQsICVkLCAlZCwgJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5tTGVmdCwgci0+bVRvcCwgci0+bVJpZ2h0LCByLT5tQm90dG9tKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIG91dCA9IFN0cmluZzg6OmZvcm1hdCgiKHVua25vd24gdHlwZSAlZCwgc2l6ZSAlenUpIiwgbVR5cGUsIG1TaXplKTsKKyAgICAgICAgICAgIGlmICh2ZXJib3NlICYmIG1TaXplIDw9IDQ4KSB7IC8vIGlmIGl0J3MgbGVzcyB0aGFuIHRocmVlIGxpbmVzIG9mIGhleCBkYXRhLCBkdW1wIGl0CisgICAgICAgICAgICAgICAgQVN0cmluZyBmb287CisgICAgICAgICAgICAgICAgaGV4ZHVtcChkYXRhLCBtU2l6ZSwgMCwgJmZvbyk7CisgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgiXG4iKTsKKyAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKGZvby5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gb3V0OworfQorCitzdGF0aWMgdm9pZCBNYWtlRm91ckNDU3RyaW5nKHVpbnQzMl90IHgsIGNoYXIgKnMpIHsKKyAgICBzWzBdID0geCA+PiAyNDsKKyAgICBzWzFdID0gKHggPj4gMTYpICYgMHhmZjsKKyAgICBzWzJdID0gKHggPj4gOCkgJiAweGZmOworICAgIHNbM10gPSB4ICYgMHhmZjsKKyAgICBzWzRdID0gJ1wwJzsKK30KKworU3RyaW5nOCBNZXRhRGF0YUJhc2U6OnRvU3RyaW5nKCkgY29uc3QgeworICAgIFN0cmluZzggczsKKyAgICBmb3IgKGludCBpID0gbUludGVybmFsRGF0YS0+bUl0ZW1zLnNpemUoKTsgLS1pID49IDA7KSB7CisgICAgICAgIGludDMyX3Qga2V5ID0gbUludGVybmFsRGF0YS0+bUl0ZW1zLmtleUF0KGkpOworICAgICAgICBjaGFyIGNjWzVdOworICAgICAgICBNYWtlRm91ckNDU3RyaW5nKGtleSwgY2MpOworICAgICAgICBjb25zdCB0eXBlZF9kYXRhICZpdGVtID0gbUludGVybmFsRGF0YS0+bUl0ZW1zLnZhbHVlQXQoaSk7CisgICAgICAgIHMuYXBwZW5kRm9ybWF0KCIlczogJXMiLCBjYywgaXRlbS5hc1N0cmluZyhmYWxzZSkuc3RyaW5nKCkpOworICAgICAgICBpZiAoaSAhPSAwKSB7CisgICAgICAgICAgICBzLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gczsKK30KKwordm9pZCBNZXRhRGF0YUJhc2U6OmR1bXBUb0xvZygpIGNvbnN0IHsKKyAgICBmb3IgKGludCBpID0gbUludGVybmFsRGF0YS0+bUl0ZW1zLnNpemUoKTsgLS1pID49IDA7KSB7CisgICAgICAgIGludDMyX3Qga2V5ID0gbUludGVybmFsRGF0YS0+bUl0ZW1zLmtleUF0KGkpOworICAgICAgICBjaGFyIGNjWzVdOworICAgICAgICBNYWtlRm91ckNDU3RyaW5nKGtleSwgY2MpOworICAgICAgICBjb25zdCB0eXBlZF9kYXRhICZpdGVtID0gbUludGVybmFsRGF0YS0+bUl0ZW1zLnZhbHVlQXQoaSk7CisgICAgICAgIEFMT0dJKCIlczogJXMiLCBjYywgaXRlbS5hc1N0cmluZyh0cnVlIC8qIHZlcmJvc2UgKi8pLnN0cmluZygpKTsKKyAgICB9Cit9CisKK3N0YXR1c190IE1ldGFEYXRhQmFzZTo6d3JpdGVUb1BhcmNlbChQYXJjZWwgJnBhcmNlbCkgeworICAgIHN0YXR1c190IHJldDsKKyAgICBzaXplX3QgbnVtSXRlbXMgPSBtSW50ZXJuYWxEYXRhLT5tSXRlbXMuc2l6ZSgpOworICAgIHJldCA9IHBhcmNlbC53cml0ZVVpbnQzMih1aW50MzJfdChudW1JdGVtcykpOworICAgIGlmIChyZXQpIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1JdGVtczsgaSsrKSB7CisgICAgICAgIGludDMyX3Qga2V5ID0gbUludGVybmFsRGF0YS0+bUl0ZW1zLmtleUF0KGkpOworICAgICAgICBjb25zdCB0eXBlZF9kYXRhICZpdGVtID0gbUludGVybmFsRGF0YS0+bUl0ZW1zLnZhbHVlQXQoaSk7CisgICAgICAgIHVpbnQzMl90IHR5cGU7CisgICAgICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgICAgIHNpemVfdCBzaXplOworICAgICAgICBpdGVtLmdldERhdGEoJnR5cGUsICZkYXRhLCAmc2l6ZSk7CisgICAgICAgIHJldCA9IHBhcmNlbC53cml0ZUludDMyKGtleSk7CisgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gcGFyY2VsLndyaXRlVWludDMyKHR5cGUpOworICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlID09IFRZUEVfTk9ORSkgeworICAgICAgICAgICAgYW5kcm9pZDo6UGFyY2VsOjpXcml0YWJsZUJsb2IgYmxvYjsKKyAgICAgICAgICAgIHJldCA9IHBhcmNlbC53cml0ZVVpbnQzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2l6ZSkpOworICAgICAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXQgPSBwYXJjZWwud3JpdGVCbG9iKHNpemUsIGZhbHNlLCAmYmxvYik7CisgICAgICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbWNweShibG9iLmRhdGEoKSwgZGF0YSwgc2l6ZSk7CisgICAgICAgICAgICBibG9iLnJlbGVhc2UoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IHBhcmNlbC53cml0ZUJ5dGVBcnJheShzaXplLCAodWludDhfdCopZGF0YSk7CisgICAgICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1ldGFEYXRhQmFzZTo6dXBkYXRlRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgJnBhcmNlbCkgeworICAgIHVpbnQzMl90IG51bUl0ZW1zOworICAgIGlmIChwYXJjZWwucmVhZFVpbnQzMigmbnVtSXRlbXMpID09IE9LKSB7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1JdGVtczsgaSsrKSB7CisgICAgICAgICAgICBpbnQzMl90IGtleTsKKyAgICAgICAgICAgIHVpbnQzMl90IHR5cGU7CisgICAgICAgICAgICB1aW50MzJfdCBzaXplOworICAgICAgICAgICAgc3RhdHVzX3QgcmV0ID0gcGFyY2VsLnJlYWRJbnQzMigma2V5KTsKKyAgICAgICAgICAgIHJldCB8PSBwYXJjZWwucmVhZFVpbnQzMigmdHlwZSk7CisgICAgICAgICAgICByZXQgfD0gcGFyY2VsLnJlYWRVaW50MzIoJnNpemUpOworICAgICAgICAgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gY29weSBkYXRhIGZyb20gQmxvYiwgd2hpY2ggbWF5IGJlIGlubGluZSBpbiBQYXJjZWwgc3RvcmFnZSwKKyAgICAgICAgICAgIC8vIHRoZW4gYWR2YW5jZSBwb3NpdGlvbgorICAgICAgICAgICAgaWYgKHR5cGUgPT0gVFlQRV9OT05FKSB7CisgICAgICAgICAgICAgICAgYW5kcm9pZDo6UGFyY2VsOjpSZWFkYWJsZUJsb2IgYmxvYjsKKyAgICAgICAgICAgICAgICByZXQgPSBwYXJjZWwucmVhZEJsb2Ioc2l6ZSwgJmJsb2IpOworICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNldERhdGEoa2V5LCB0eXBlLCBibG9iLmRhdGEoKSwgc2l6ZSk7CisgICAgICAgICAgICAgICAgYmxvYi5yZWxlYXNlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGNvcHkgZGF0YSBkaXJlY3RseSBmcm9tIFBhcmNlbCBzdG9yYWdlLCB0aGVuIGFkdmFuY2UgcG9zaXRpb24KKyAgICAgICAgICAgICAgICBzZXREYXRhKGtleSwgdHlwZSwgcGFyY2VsLnJlYWRJbnBsYWNlKHNpemUpLCBzaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIEFMT0dXKCJubyBtZXRhZGF0YSBpbiBwYXJjZWwiKTsKKyAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvVm9yYmlzQ29tbWVudC5jcHAgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9Wb3JiaXNDb21tZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWJhZjUxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvVm9yYmlzQ29tbWVudC5jcHAKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlZvcmJpc0NvbW1lbnQiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJtZWRpYS9Wb3JiaXNDb21tZW50LmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIHZvaWQgZXh0cmFjdEFsYnVtQXJ0KAorICAgICAgICBNZXRhRGF0YUJhc2UgKmZpbGVNZXRhLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFMT0dWKCJleHRyYWN0QWxidW1BcnQgZnJvbSAnJXMnIiwgKGNvbnN0IGNoYXIgKilkYXRhKTsKKworICAgIHNwPEFCdWZmZXI+IGZsYWNCdWZmZXIgPSBkZWNvZGVCYXNlNjQoQVN0cmluZygoY29uc3QgY2hhciAqKWRhdGEsIHNpemUpKTsKKyAgICBpZiAoZmxhY0J1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJtYWxmb3JtZWQgYmFzZTY0IGVuY29kZWQgZGF0YS4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNpemVfdCBmbGFjU2l6ZSA9IGZsYWNCdWZmZXItPnNpemUoKTsKKyAgICB1aW50OF90ICpmbGFjID0gZmxhY0J1ZmZlci0+ZGF0YSgpOworICAgIEFMT0dWKCJnb3QgZmxhYyBvZiBzaXplICV6dSIsIGZsYWNTaXplKTsKKworICAgIHVpbnQzMl90IHBpY1R5cGU7CisgICAgdWludDMyX3QgdHlwZUxlbjsKKyAgICB1aW50MzJfdCBkZXNjTGVuOworICAgIHVpbnQzMl90IGRhdGFMZW47CisgICAgY2hhciB0eXBlWzEyOF07CisKKyAgICBpZiAoZmxhY1NpemUgPCA4KSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwaWNUeXBlID0gVTMyX0FUKGZsYWMpOworCisgICAgaWYgKHBpY1R5cGUgIT0gMykgeworICAgICAgICAvLyBUaGlzIGlzIG5vdCBhIGZyb250IGNvdmVyLgorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdHlwZUxlbiA9IFUzMl9BVCgmZmxhY1s0XSk7CisgICAgaWYgKHR5cGVMZW4gPiBzaXplb2YodHlwZSkgLSAxKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyB3ZSd2ZSBhbHJlYWR5IGNoZWNrZWQgYWJvdmUgdGhhdCBmbGFjU2l6ZSA+PSA4CisgICAgaWYgKGZsYWNTaXplIC0gOCA8IHR5cGVMZW4pIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1lbWNweSh0eXBlLCAmZmxhY1s4XSwgdHlwZUxlbik7CisgICAgdHlwZVt0eXBlTGVuXSA9ICdcMCc7CisKKyAgICBBTE9HVigicGljVHlwZSA9ICVkLCB0eXBlID0gJyVzJyIsIHBpY1R5cGUsIHR5cGUpOworCisgICAgaWYgKCFzdHJjbXAodHlwZSwgIi0tPiIpKSB7CisgICAgICAgIC8vIFRoaXMgaXMgbm90IGlubGluZSBjb3ZlciBhcnQsIGJ1dCBhbiBleHRlcm5hbCB1cmwgaW5zdGVhZC4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChmbGFjU2l6ZSA8IDMyIHx8IGZsYWNTaXplIC0gMzIgPCB0eXBlTGVuKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBkZXNjTGVuID0gVTMyX0FUKCZmbGFjWzggKyB0eXBlTGVuXSk7CisgICAgaWYgKGZsYWNTaXplIC0gMzIgLSB0eXBlTGVuIDwgZGVzY0xlbikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZGF0YUxlbiA9IFUzMl9BVCgmZmxhY1s4ICsgdHlwZUxlbiArIDQgKyBkZXNjTGVuICsgMTZdKTsKKworICAgIC8vIHdlJ3ZlIGFscmVhZHkgY2hlY2tlZCBhYm92ZSB0aGF0IChmbGFjU2l6ZSAtIDMyIC0gdHlwZUxlbiAtIGRlc2NMZW4pID49IDAKKyAgICBpZiAoZmxhY1NpemUgLSAzMiAtIHR5cGVMZW4gLSBkZXNjTGVuIDwgZGF0YUxlbikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQUxPR1YoImdvdCBpbWFnZSBkYXRhLCAlenUgdHJhaWxpbmcgYnl0ZXMiLAorICAgICAgICAgZmxhY1NpemUgLSAzMiAtIHR5cGVMZW4gLSBkZXNjTGVuIC0gZGF0YUxlbik7CisKKyAgICBmaWxlTWV0YS0+c2V0RGF0YSgKKyAgICAgICAgICAgIGtLZXlBbGJ1bUFydCwgMCwgJmZsYWNbOCArIHR5cGVMZW4gKyA0ICsgZGVzY0xlbiArIDIwXSwgZGF0YUxlbik7CisKKyAgICBmaWxlTWV0YS0+c2V0Q1N0cmluZyhrS2V5QWxidW1BcnRNSU1FLCB0eXBlKTsKK30KKwordm9pZCBwYXJzZVZvcmJpc0NvbW1lbnQoCisgICAgICAgIE1ldGFEYXRhQmFzZSAqZmlsZU1ldGEsIGNvbnN0IGNoYXIgKmNvbW1lbnQsIHNpemVfdCBjb21tZW50TGVuZ3RoKQoreworICAgIHN0cnVjdCB7CisgICAgICAgIGNvbnN0IGNoYXIgKmNvbnN0IG1UYWc7CisgICAgICAgIHVpbnQzMl90IG1LZXk7CisgICAgfSBrTWFwW10gPSB7CisgICAgICAgIHsgIlRJVExFIiwga0tleVRpdGxlIH0sCisgICAgICAgIHsgIkFSVElTVCIsIGtLZXlBcnRpc3QgfSwKKyAgICAgICAgeyAiQUxCVU1BUlRJU1QiLCBrS2V5QWxidW1BcnRpc3QgfSwKKyAgICAgICAgeyAiQUxCVU0gQVJUSVNUIiwga0tleUFsYnVtQXJ0aXN0IH0sCisgICAgICAgIHsgIkNPTVBJTEFUSU9OIiwga0tleUNvbXBpbGF0aW9uIH0sCisgICAgICAgIHsgIkFMQlVNIiwga0tleUFsYnVtIH0sCisgICAgICAgIHsgIkNPTVBPU0VSIiwga0tleUNvbXBvc2VyIH0sCisgICAgICAgIHsgIkdFTlJFIiwga0tleUdlbnJlIH0sCisgICAgICAgIHsgIkFVVEhPUiIsIGtLZXlBdXRob3IgfSwKKyAgICAgICAgeyAiVFJBQ0tOVU1CRVIiLCBrS2V5Q0RUcmFja051bWJlciB9LAorICAgICAgICB7ICJESVNDTlVNQkVSIiwga0tleURpc2NOdW1iZXIgfSwKKyAgICAgICAgeyAiREFURSIsIGtLZXlEYXRlIH0sCisgICAgICAgIHsgIllFQVIiLCBrS2V5WWVhciB9LAorICAgICAgICB7ICJMWVJJQ0lTVCIsIGtLZXlXcml0ZXIgfSwKKyAgICAgICAgeyAiTUVUQURBVEFfQkxPQ0tfUElDVFVSRSIsIGtLZXlBbGJ1bUFydCB9LAorICAgICAgICB7ICJBTkRST0lEX0xPT1AiLCBrS2V5QXV0b0xvb3AgfSwKKyAgICB9OworCisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgc2l6ZW9mKGtNYXApIC8gc2l6ZW9mKGtNYXBbMF0pOyArK2opIHsKKyAgICAgICAgICAgIHNpemVfdCB0YWdMZW4gPSBzdHJsZW4oa01hcFtqXS5tVGFnKTsKKyAgICAgICAgICAgIGlmICghc3RybmNhc2VjbXAoa01hcFtqXS5tVGFnLCBjb21tZW50LCB0YWdMZW4pCisgICAgICAgICAgICAgICAgICAgICYmIGNvbW1lbnRbdGFnTGVuXSA9PSAnPScpIHsKKyAgICAgICAgICAgICAgICBpZiAoa01hcFtqXS5tS2V5ID09IGtLZXlBbGJ1bUFydCkgeworICAgICAgICAgICAgICAgICAgICBleHRyYWN0QWxidW1BcnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbW1lbnRbdGFnTGVuICsgMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudExlbmd0aCAtIHRhZ0xlbiAtIDEpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa01hcFtqXS5tS2V5ID09IGtLZXlBdXRvTG9vcCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmNhc2VjbXAoJmNvbW1lbnRbdGFnTGVuICsgMV0sICJ0cnVlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVNZXRhLT5zZXRJbnQzMihrS2V5QXV0b0xvb3AsIHRydWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZmlsZU1ldGEtPnNldENTdHJpbmcoa01hcFtqXS5tS2V5LCAmY29tbWVudFt0YWdMZW4gKyAxXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU1OWYzOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZS5oCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIERBVEFfU09VUkNFX0hfCisKKyNkZWZpbmUgREFUQV9TT1VSQ0VfSF8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9JRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisjaW5jbHVkZSA8ZHJtL0RybU1hbmFnZXJDbGllbnQuaD4KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFN0cmluZzg7CisKK2NsYXNzIERhdGFTb3VyY2UgOiBwdWJsaWMgRGF0YVNvdXJjZUJhc2UsIHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UgeworcHVibGljOgorICAgIERhdGFTb3VyY2UoKSB7fQorCisgICAgLy8gcmV0dXJucyBhIHBvaW50ZXIgdG8gSURhdGFTb3VyY2UgaWYgaXQgaXMgd3JhcHBlZC4KKyAgICB2aXJ0dWFsIHNwPElEYXRhU291cmNlPiBnZXRJRGF0YVNvdXJjZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgdmlydHVhbCBTdHJpbmc4IHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nOCgiPHVuc3BlY2lmaWVkPiIpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVjb25uZWN0QXRPZmZzZXQob2ZmNjRfdCAvKm9mZnNldCovKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAvLyBmb3IgRFJNCisgICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBEcm1Jbml0aWFsaXphdGlvbihjb25zdCBjaGFyICogLyptaW1lKi8gPSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRVcmkoKSB7CisgICAgICAgIHJldHVybiBTdHJpbmc4KCk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIGdldFVyaShjaGFyICp1cmlTdHJpbmcsIHNpemVfdCBidWZmZXJTaXplKSBmaW5hbCB7CisgICAgICAgIGludCByZXQgPSBzbnByaW50Zih1cmlTdHJpbmcsIGJ1ZmZlclNpemUsICIlcyIsIGdldFVyaSgpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gcmV0ID49IDAgJiYgc3RhdGljX2Nhc3Q8c2l6ZV90PihyZXQpIDwgYnVmZmVyU2l6ZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIFN0cmluZzggZ2V0TUlNRVR5cGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBTdHJpbmc4KCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5EYXRhU291cmNlKCkge30KKworcHJpdmF0ZToKKyAgICBEYXRhU291cmNlKGNvbnN0IERhdGFTb3VyY2UgJik7CisgICAgRGF0YVNvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IERhdGFTb3VyY2UgJik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIERBVEFfU09VUkNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2VCYXNlLmggYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2VCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE5OTNkYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZUJhc2UuaApAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBEQVRBX1NPVVJDRV9CQVNFX0hfCisKKyNkZWZpbmUgREFUQV9TT1VSQ0VfQkFTRV9IXworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgU3RyaW5nODsKKworY2xhc3MgRGF0YVNvdXJjZUJhc2UgeworcHVibGljOgorICAgIGVudW0gRmxhZ3MgeworICAgICAgICBrV2FudHNQcmVmZXRjaGluZyAgICAgID0gMSwKKyAgICAgICAga1N0cmVhbWVkRnJvbUxvY2FsSG9zdCA9IDIsCisgICAgICAgIGtJc0NhY2hpbmdEYXRhU291cmNlICAgPSA0LAorICAgICAgICBrSXNIVFRQQmFzZWRTb3VyY2UgICAgID0gOCwKKyAgICAgICAga0lzTG9jYWxGaWxlU291cmNlICAgICA9IDE2LAorICAgIH07CisKKyAgICBEYXRhU291cmNlQmFzZSgpIHt9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0ID0gMDsKKworICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkLCBvciAtMSBvbiBmYWlsdXJlLiBJdCdzIG5vdCBhbiBlcnJvciBpZgorICAgIC8vIHRoaXMgcmV0dXJucyB6ZXJvOyBpdCBqdXN0IG1lYW5zIHRoZSBnaXZlbiBvZmZzZXQgaXMgZXF1YWwgdG8sIG9yCisgICAgLy8gYmV5b25kLCB0aGUgZW5kIG9mIHRoZSBzb3VyY2UuCisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpID0gMDsKKworICAgIC8vIENvbnZlbmllbmNlIG1ldGhvZHM6CisgICAgYm9vbCBnZXRVSW50MTYob2ZmNjRfdCBvZmZzZXQsIHVpbnQxNl90ICp4KTsKKyAgICBib29sIGdldFVJbnQyNChvZmY2NF90IG9mZnNldCwgdWludDMyX3QgKngpOyAvLyAzIGJ5dGUgaW50LCByZXR1cm5lZCBhcyBhIDMyLWJpdCBpbnQKKyAgICBib29sIGdldFVJbnQzMihvZmY2NF90IG9mZnNldCwgdWludDMyX3QgKngpOworICAgIGJvb2wgZ2V0VUludDY0KG9mZjY0X3Qgb2Zmc2V0LCB1aW50NjRfdCAqeCk7CisKKyAgICAvLyByZWFkIGVpdGhlciBpbnQ8Tj4gb3IgaW50PDJOPiBpbnRvIGEgdWludDwyTj5fdCwgc2l6ZSBpcyB0aGUgaW50IHNpemUgaW4gYnl0ZXMuCisgICAgYm9vbCBnZXRVSW50MTZWYXIob2ZmNjRfdCBvZmZzZXQsIHVpbnQxNl90ICp4LCBzaXplX3Qgc2l6ZSk7CisgICAgYm9vbCBnZXRVSW50MzJWYXIob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4LCBzaXplX3Qgc2l6ZSk7CisgICAgYm9vbCBnZXRVSW50NjRWYXIob2ZmNjRfdCBvZmZzZXQsIHVpbnQ2NF90ICp4LCBzaXplX3Qgc2l6ZSk7CisKKyAgICAvLyBNYXkgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVELgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKTsKKworICAgIHZpcnR1YWwgYm9vbCBnZXRVcmkoY2hhciAqdXJpU3RyaW5nLCBzaXplX3QgYnVmZmVyU2l6ZSk7CisKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKSB7fTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkRhdGFTb3VyY2VCYXNlKCkge30KKworcHJpdmF0ZToKKyAgICBEYXRhU291cmNlQmFzZShjb25zdCBEYXRhU291cmNlQmFzZSAmKTsKKyAgICBEYXRhU291cmNlQmFzZSAmb3BlcmF0b3I9KGNvbnN0IERhdGFTb3VyY2VCYXNlICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBEQVRBX1NPVVJDRV9CQVNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL0V4dHJhY3RvclV0aWxzLmggYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL0V4dHJhY3RvclV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJmOTM0OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvRXh0cmFjdG9yVXRpbHMuaApAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBFWFRSQUNUT1JfVVRJTFNfSF8KKworI2RlZmluZSBFWFRSQUNUT1JfVVRJTFNfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3N0ZDo6dW5pcXVlX3B0cjxUW10+IGhlYXBidWZmZXIoc2l6ZV90IHNpemUpIHsKKyAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPFRbXT4obmV3IChzdGQ6Om5vdGhyb3cpIFRbc2l6ZV0pOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFVUSUxTX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL01lZGlhRXh0cmFjdG9yLmggYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL01lZGlhRXh0cmFjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJhOThkYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3IuaApAQCAtMCwwICsxLDE5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfRVhUUkFDVE9SX0hfCisKKyNkZWZpbmUgTUVESUFfRVhUUkFDVE9SX0hfCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBEYXRhU291cmNlQmFzZTsKK2NsYXNzIE1ldGFEYXRhQmFzZTsKK3N0cnVjdCBNZWRpYVRyYWNrOworCisKK2NsYXNzIEV4dHJhY3RvckFsbG9jVHJhY2tlciB7CitwdWJsaWM6CisgICAgRXh0cmFjdG9yQWxsb2NUcmFja2VyKCkgeworICAgICAgICBBTE9HRCgiZXh0cmFjdG9yIGFsbG9jYXRlZDogJXAiLCB0aGlzKTsKKyAgICB9CisgICAgdmlydHVhbCB+RXh0cmFjdG9yQWxsb2NUcmFja2VyKCkgeworICAgICAgICBBTE9HRCgiZXh0cmFjdG9yIGZyZWVkOiAlcCIsIHRoaXMpOworICAgIH0KK307CisKKworY2xhc3MgTWVkaWFFeHRyYWN0b3IKKy8vIDogcHVibGljIEV4dHJhY3RvckFsbG9jVHJhY2tlcgoreworcHVibGljOgorICAgIHZpcnR1YWwgfk1lZGlhRXh0cmFjdG9yKCk7CisgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKSA9IDA7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpID0gMDsKKworICAgIGVudW0gR2V0VHJhY2tNZXRhRGF0YUZsYWdzIHsKKyAgICAgICAga0luY2x1ZGVFeHRlbnNpdmVNZXRhRGF0YSA9IDEKKyAgICB9OworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgICAgIE1ldGFEYXRhQmFzZSYgbWV0YSwKKyAgICAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MgPSAwKSA9IDA7CisKKyAgICAvLyBSZXR1cm4gY29udGFpbmVyIHNwZWNpZmljIG1ldGEtZGF0YS4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KKyAgICAvLyByZXR1cm5zIGFuIGVtcHR5IG1ldGFkYXRhIG9iamVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSkgPSAwOworCisgICAgZW51bSBGbGFncyB7CisgICAgICAgIENBTl9TRUVLX0JBQ0tXQVJEICA9IDEsICAvLyB0aGUgInNlZWsgMTBzZWNzIGJhY2sgYnV0dG9uIgorICAgICAgICBDQU5fU0VFS19GT1JXQVJEICAgPSAyLCAgLy8gdGhlICJzZWVrIDEwc2VjcyBmb3J3YXJkIGJ1dHRvbiIKKyAgICAgICAgQ0FOX1BBVVNFICAgICAgICAgID0gNCwKKyAgICAgICAgQ0FOX1NFRUsgICAgICAgICAgID0gOCwgIC8vIHRoZSAic2VlayBiYXIiCisgICAgfTsKKworICAgIC8vIElmIHN1YmNsYXNzZXMgZG8gX25vdF8gb3ZlcnJpZGUgdGhpcywgdGhlIGRlZmF1bHQgaXMKKyAgICAvLyBDQU5fU0VFS19CQUNLV0FSRCB8IENBTl9TRUVLX0ZPUldBUkQgfCBDQU5fU0VFSyB8IENBTl9QQVVTRQorICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSBjb25zdDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWVkaWFDYXMoY29uc3QgdWludDhfdCogLypjYXNUb2tlbiovLCBzaXplX3QgLypzaXplKi8pIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiPHVuc3BlY2lmaWVkPiI7IH0KKworICAgIHR5cGVkZWYgTWVkaWFFeHRyYWN0b3IqICgqQ3JlYXRvckZ1bmMpKAorICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgdm9pZCAqbWV0YSk7CisgICAgdHlwZWRlZiB2b2lkICgqRnJlZU1ldGFGdW5jKSh2b2lkICptZXRhKTsKKworICAgIC8vIFRoZSBzbmlmZmVyIGNhbiBvcHRpb25hbGx5IGZpbGwgaW4gYW4gb3BhcXVlIG9iamVjdCwgIm1ldGEiLCB0aGF0IGhlbHBzCisgICAgLy8gdGhlIGNvcnJlc3BvbmRpbmcgZXh0cmFjdG9yIGluaXRpYWxpemUgaXRzIHN0YXRlIHdpdGhvdXQgZHVwbGljYXRpbmcKKyAgICAvLyBlZmZvcnQgYWxyZWFkeSBleGVydGVkIGJ5IHRoZSBzbmlmZmVyLiBJZiAiZnJlZU1ldGEiIGlzIGdpdmVuLCBpdCB3aWxsIGJlCisgICAgLy8gY2FsbGVkIGFnYWluc3QgdGhlIG9wYXF1ZSBvYmplY3Qgd2hlbiBpdCBpcyBubyBsb25nZXIgdXNlZC4KKyAgICB0eXBlZGVmIENyZWF0b3JGdW5jICgqU25pZmZlckZ1bmMpKAorICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UsCisgICAgICAgICAgICB2b2lkICoqbWV0YSwgRnJlZU1ldGFGdW5jICpmcmVlTWV0YSk7CisKKyAgICB0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgYlsxNl07CisgICAgfSB1dWlkX3Q7CisKKyAgICB0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIC8vIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgc3RydWN0dXJlCisgICAgICAgIGNvbnN0IHVpbnQzMl90IGRlZl92ZXJzaW9uOworCisgICAgICAgIC8vIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXh0cmFjdG9yLgorICAgICAgICAvLyBTZWUgYmVsb3cgZm9yIGEgY29udmVuaWVuY2UgbWFjcm8gdG8gY3JlYXRlIHRoaXMgZnJvbSBhIHN0cmluZy4KKyAgICAgICAgdXVpZF90IGV4dHJhY3Rvcl91dWlkOworCisgICAgICAgIC8vIFZlcnNpb24gbnVtYmVyIG9mIHRoaXMgZXh0cmFjdG9yLiBXaGVuIHR3byBleHRyYWN0b3JzIHdpdGggdGhlIHNhbWUKKyAgICAgICAgLy8gdXVpZCBhcmUgZW5jb3VudGVyZWQsIHRoZSBvbmUgd2l0aCB0aGUgbGFyZ2VzdCB2ZXJzaW9uIG51bWJlciB3aWxsCisgICAgICAgIC8vIGJlIHVzZWQuCisgICAgICAgIGNvbnN0IHVpbnQzMl90IGV4dHJhY3Rvcl92ZXJzaW9uOworCisgICAgICAgIC8vIGEgaHVtYW4gcmVhZGFibGUgbmFtZQorICAgICAgICBjb25zdCBjaGFyICpleHRyYWN0b3JfbmFtZTsKKworICAgICAgICAvLyB0aGUgc25pZmZlciBmdW5jdGlvbgorICAgICAgICBjb25zdCBTbmlmZmVyRnVuYyBzbmlmZjsKKyAgICB9IEV4dHJhY3RvckRlZjsKKworICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBFWFRSQUNUT1JERUZfVkVSU0lPTiA9IDE7CisKKyAgICB0eXBlZGVmIEV4dHJhY3RvckRlZiAoKkdldEV4dHJhY3RvckRlZikoKTsKKworcHJvdGVjdGVkOgorICAgIE1lZGlhRXh0cmFjdG9yKCk7CisKK3ByaXZhdGU6CisgICAgTWVkaWFFeHRyYWN0b3IoY29uc3QgTWVkaWFFeHRyYWN0b3IgJik7CisgICAgTWVkaWFFeHRyYWN0b3IgJm9wZXJhdG9yPShjb25zdCBNZWRpYUV4dHJhY3RvciAmKTsKK307CisKKy8vIHB1cnBvc2VseSBub3QgZGVmaW5lZCBhbnl3aGVyZSBzbyB0aGF0IHRoaXMgd2lsbCBmYWlsIHRvIGxpbmsgaWYKKy8vIGV4cHJlc3Npb25zIGJlbG93IGFyZSBub3QgZXZhbHVhdGVkIGF0IGNvbXBpbGUgdGltZQoraW50IGludmFsaWRfdXVpZF9zdHJpbmcoY29uc3QgY2hhciAqKTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgorY29uc3RleHByIHVpbnQ4X3QgX2RpZ2l0QXRfKGNvbnN0IFQgKCZzKVtOXSwgY29uc3Qgc2l6ZV90IG4pIHsKKyAgICByZXR1cm4gc1tuXSA+PSAnMCcgJiYgc1tuXSA8PSAnOScgPyBzW25dIC0gJzAnCisgICAgICAgICAgICA6IHNbbl0gPj0gJ2EnICYmIHNbbl0gPD0gJ2YnID8gc1tuXSAtICdhJyArIDEwCisgICAgICAgICAgICAgICAgICAgIDogc1tuXSA+PSAnQScgJiYgc1tuXSA8PSAnRicgPyBzW25dIC0gJ0EnICsgMTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGludmFsaWRfdXVpZF9zdHJpbmcoInV1aWQ6IGJhZCBkaWdpdHMiKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgorY29uc3RleHByIHVpbnQ4X3QgX2hleEJ5dGVBdF8oY29uc3QgVCAoJnMpW05dLCBzaXplX3QgbikgeworICAgIHJldHVybiAoX2RpZ2l0QXRfKHMsIG4pIDw8IDQpICsgX2RpZ2l0QXRfKHMsIG4gKyAxKTsKK30KKworY29uc3RleHByIGJvb2wgX2Fzc2VydElzRGFzaF8oY2hhciBjKSB7CisgICAgcmV0dXJuIGMgPT0gJy0nID8gdHJ1ZSA6IGludmFsaWRfdXVpZF9zdHJpbmcoIldyb25nIGZvcm1hdCIpOworfQorCit0ZW1wbGF0ZSA8c2l6ZV90IE4+Citjb25zdGV4cHIgTWVkaWFFeHRyYWN0b3I6OnV1aWRfdCBjb25zdFVVSUQoY29uc3QgY2hhciAoJnMpIFtOXSkgeworICAgIHN0YXRpY19hc3NlcnQoTiA9PSAzNywgInV1aWQ6IHdyb25nIGxlbmd0aCIpOworICAgIHJldHVybgorICAgICAgICAgICAgX2Fzc2VydElzRGFzaF8oc1s4XSksCisgICAgICAgICAgICBfYXNzZXJ0SXNEYXNoXyhzWzEzXSksCisgICAgICAgICAgICBfYXNzZXJ0SXNEYXNoXyhzWzE4XSksCisgICAgICAgICAgICBfYXNzZXJ0SXNEYXNoXyhzWzIzXSksCisgICAgICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6dXVpZF90IHt7CisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMCksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMiksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgNCksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgNiksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgOSksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMTEpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDE0KSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAxNiksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMTkpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDIxKSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAyNCksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMjYpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDI4KSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAzMCksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMzIpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDM0KSwKKyAgICAgICAgICAgIH19OworfQorLy8gQ29udmVuaWVuY2UgbWFjcm8gdG8gY3JlYXRlIGEgdXVpZF90IGZyb20gYSBzdHJpbmcgbGl0ZXJhbCwgd2hpY2ggc2hvdWxkCisvLyBiZSBmb3JtYXR0ZWQgYXMgIjEyMzQ1Njc4LTEyMzQtMTIzNC0xMjM0LTEyMzQ1Njc4OWFiYyIsIGFzIGdlbmVyYXRlZCBieQorLy8gZS5nLiBodHRwczovL3d3dy51dWlkZ2VuZXJhdG9yLm5ldC8gb3IgdGhlICd1dWlkZ2VuJyBsaW51eCBjb21tYW5kLgorLy8gSGV4IGRpZ2l0cyBtYXkgYmUgdXBwZXIgb3IgbG93ZXIgY2FzZS4KKy8vCisvLyBUaGUgbWFjcm8gY2FsbCBpcyBvdGhlcndpc2UgZXF1aXZhbGVudCB0byBzcGVjaWZ5aW5nIHRoZSBzdHJ1Y3R1cmUgZGlyZWN0bHkKKy8vIChlLmcuIFVVSUQoIjdkNjEzODU4LTU4MzctNGEzOC04NGM1LTMzMmQxY2RkZWUyNyIpIGlzIHRoZSBzYW1lIGFzCisvLyAgICAgICB7ezB4N2QsIDB4NjEsIDB4MzgsIDB4NTgsIDB4NTgsIDB4MzcsIDB4NGEsIDB4MzgsCisvLyAgICAgICAgIDB4ODQsIDB4YzUsIDB4MzMsIDB4MmQsIDB4MWMsIDB4ZGQsIDB4ZWUsIDB4Mjd9fSkKKworI2RlZmluZSBVVUlEKHN0cikgW117IGNvbnN0ZXhwciBNZWRpYUV4dHJhY3Rvcjo6dXVpZF90IHV1aWQgPSBjb25zdFVVSUQoc3RyKTsgcmV0dXJuIHV1aWQ7IH0oKQorCisKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNRURJQV9FWFRSQUNUT1JfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvTWVkaWFTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvTWVkaWFTb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2M0NzAzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9NZWRpYVNvdXJjZS5oCkBAIC0wLDAgKzEsMTAyIEBACisvKgorCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX1NPVVJDRV9IXworCisjZGVmaW5lIE1FRElBX1NPVVJDRV9IXworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE1lZGlhQnVmZmVyOworCitzdHJ1Y3QgTWVkaWFTb3VyY2UgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlIHsKKyAgICBNZWRpYVNvdXJjZSgpOworCisgICAgLy8gVG8gYmUgY2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIgbWV0aG9kcyBvbiB0aGlzIG9iamVjdCwgZXhjZXB0CisgICAgLy8gZ2V0Rm9ybWF0KCkuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zID0gTlVMTCkgPSAwOworCisgICAgLy8gQW55IGJsb2NraW5nIHJlYWQgY2FsbCByZXR1cm5zIGltbWVkaWF0ZWx5IHdpdGggYSByZXN1bHQgb2YgTk9fSU5JVC4KKyAgICAvLyBJdCBpcyBhbiBlcnJvciB0byBjYWxsIGFueSBtZXRob2RzIG90aGVyIHRoYW4gc3RhcnQgYWZ0ZXIgdGhpcyBjYWxsCisgICAgLy8gcmV0dXJucy4gQW55IGJ1ZmZlcnMgdGhlIG9iamVjdCBtYXkgYmUgaG9sZGluZyBvbnRvIGF0IHRoZSB0aW1lIG9mCisgICAgLy8gdGhlIHN0b3AoKSBjYWxsIGFyZSByZWxlYXNlZC4KKyAgICAvLyBBbHNvLCBpdCBpcyBpbXBlcmF0aXZlIHRoYXQgYW55IGJ1ZmZlcnMgb3V0cHV0IGJ5IHRoaXMgb2JqZWN0IGFuZAorICAgIC8vIGhlbGQgb250byBieSBjYWxsZXJzIGJlIHJlbGVhc2VkIGJlZm9yZSBhIGNhbGwgdG8gc3RvcCgpICEhIQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpID0gMDsKKworICAgIC8vIFJldHVybnMgdGhlIGZvcm1hdCBvZiB0aGUgZGF0YSBvdXRwdXQgYnkgdGhpcyBtZWRpYSBzb3VyY2UuCisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCkgPSAwOworCisgICAgLy8gT3B0aW9ucyB0aGF0IG1vZGlmeSByZWFkKCkgYmVoYXZpb3VyLiBUaGUgZGVmYXVsdCBpcyB0bworICAgIC8vIGEpIG5vdCByZXF1ZXN0IGEgc2VlaworICAgIC8vIGIpIG5vdCBiZSBsYXRlLCBpLmUuIGxhdGVuZXNzX3VzID0gMAorICAgIHR5cGVkZWYgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnMgUmVhZE9wdGlvbnM7CisKKyAgICAvLyBSZXR1cm5zIGEgbmV3IGJ1ZmZlciBvZiBkYXRhLiBDYWxsIGJsb2NrcyB1bnRpbCBhCisgICAgLy8gYnVmZmVyIGlzIGF2YWlsYWJsZSwgYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQgb2YgdGhlIGVuZCBvZiB0aGUgc3RyZWFtCisgICAgLy8gaXMgcmVhY2hlZC4KKyAgICAvLyBFbmQgb2Ygc3RyZWFtIGlzIHNpZ25hbGxlZCBieSBhIHJlc3VsdCBvZiBFUlJPUl9FTkRfT0ZfU1RSRUFNLgorICAgIC8vIEEgcmVzdWx0IG9mIElORk9fRk9STUFUX0NIQU5HRUQgaW5kaWNhdGVzIHRoYXQgdGhlIGZvcm1hdCBvZiB0aGlzCisgICAgLy8gTWVkaWFTb3VyY2UgaGFzIGNoYW5nZWQgbWlkLXN0cmVhbSwgdGhlIGNsaWVudCBjYW4gY29udGludWUgcmVhZGluZworICAgIC8vIGJ1dCBzaG91bGQgYmUgcHJlcGFyZWQgZm9yIGJ1ZmZlcnMgb2YgdGhlIG5ldyBjb25maWd1cmF0aW9uLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKSA9IDA7CisKKyAgICAvLyBDYXVzZXMgdGhpcyBzb3VyY2UgdG8gc3VzcGVuZCBwdWxsaW5nIGRhdGEgZnJvbSBpdHMgdXBzdHJlYW0gc291cmNlCisgICAgLy8gdW50aWwgYSBzdWJzZXF1ZW50IHJlYWQtd2l0aC1zZWVrLiBUaGlzIGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkCisgICAgLy8gYXMgc3VjaCBieSBhbnkgc291cmNlLiBFLmcuIE1lZGlhQ29kZWNTb3VyY2UgZG9lcyBub3Qgc3VzcGVuZCBpdHMKKyAgICAvLyB1cHN0cmVhbSBzb3VyY2UsIGFuZCBpbnN0ZWFkIGRpc2NhcmQgdXBzdHJlYW0gZGF0YSB3aGlsZSBwYXVzZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIC8vIFRoZSBjb25zdW1lciBvZiB0aGlzIG1lZGlhIHNvdXJjZSByZXF1ZXN0cyB0aGUgc291cmNlIHN0b3BzIHNlbmRpbmcKKyAgICAvLyBidWZmZXJzIHdpdGggdGltZXN0YW1wIGxhcmdlciB0aGFuIG9yIGVxdWFsIHRvIHN0b3BUaW1lVXMuIHN0b3BUaW1lVXMKKyAgICAvLyBtdXN0IGJlIGluIHRoZSBzYW1lIHRpbWUgYmFzZSBhcyB0aGUgc3RhcnRUaW1lIHBhc3NlZCBpbiBzdGFydCgpLiBJZgorICAgIC8vIHNvdXJjZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgcmVxdWVzdCwgRVJST1JfVU5TVVBQT1JURUQgd2lsbCBiZSByZXR1cm5lZC4KKyAgICAvLyBJZiBzdG9wVGltZVVzIGlzIGludmFsaWQsIEJBRF9WQUxVRSB3aWxsIGJlIHJldHVybmVkLiBUaGlzIGNvdWxkIGJlCisgICAgLy8gY2FsbGVkIGF0IGFueSB0aW1lIGV2ZW4gYmVmb3JlIHNvdXJjZSBzdGFydHMgYW5kIGl0IGNvdWxkIGJlIGNhbGxlZAorICAgIC8vIG11bHRpcGxlIHRpbWVzLiBTZXR0aW5nIHN0b3BUaW1lVXMgdG8gYmUgLTEgd2lsbCBlZmZlY3RpdmVseSBjYW5jZWwgdGhlIHN0b3BUaW1lVXMKKyAgICAvLyBzZXQgcHJldmlvdXNseS4gSWYgc3RvcFRpbWVVcyBpcyBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byBsYXN0IGJ1ZmZlcidzIHRpbWVzdGFtcCwKKyAgICAvLyBzb3VyY2Ugd2lsbCBzdGFydCB0byBkcm9wIGJ1ZmZlciB3aGVuIGl0IGdldHMgYSBidWZmZXIgd2l0aCB0aW1lc3RhbXAgbGFyZ2VyCisgICAgLy8gdGhhbiBvciBlcXVhbCB0byBzdG9wVGltZVVzLiBJZiBzdG9wVGltZVVzIGlzIHNtYWxsZXIgdGhhbiBvciBlcXVhbCB0byBsYXN0CisgICAgLy8gYnVmZmVyJ3MgdGltZXN0YW1wLCBzb3VyY2Ugd2lsbCBkcm9wIGFsbCB0aGUgaW5jb21pbmcgYnVmZmVycyBpbW1lZGlhdGVseS4KKyAgICAvLyBBZnRlciBzZXR0aW5nIHN0b3BUaW1lVXMsIHNvdXJjZSBtYXkgc3RpbGwgc3RvcCBzZW5kaW5nIGJ1ZmZlcnMgd2l0aCB0aW1lc3RhbXAKKyAgICAvLyBsZXNzIHRoYW4gc3RvcFRpbWVVcyBpZiBpdCBpcyBzdG9wcGVkIGJ5IHRoZSBjb25zdW1lci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0b3BUaW1lVXMoaW50NjRfdCAvKiBzdG9wVGltZVVzICovKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5NZWRpYVNvdXJjZSgpOworCitwcml2YXRlOgorICAgIE1lZGlhU291cmNlKGNvbnN0IE1lZGlhU291cmNlICYpOworICAgIE1lZGlhU291cmNlICZvcGVyYXRvcj0oY29uc3QgTWVkaWFTb3VyY2UgJik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1FRElBX1NPVVJDRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9NZWRpYVRyYWNrLmggYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL01lZGlhVHJhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGVhNjFhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9NZWRpYVRyYWNrLmgKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX1NPVVJDRV9CQVNFX0hfCisKKyNkZWZpbmUgTUVESUFfU09VUkNFX0JBU0VfSF8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNZWRpYUJ1ZmZlckJhc2U7CisKK2NsYXNzIFNvdXJjZUJhc2VBbGxvY1RyYWNrZXIgeworcHVibGljOgorICAgIFNvdXJjZUJhc2VBbGxvY1RyYWNrZXIoKSB7CisgICAgICAgIEFMT0dEKCJzb3VyY2ViYXNlIGFsbG9jYXRlZDogJXAiLCB0aGlzKTsKKyAgICB9CisgICAgdmlydHVhbCB+U291cmNlQmFzZUFsbG9jVHJhY2tlcigpIHsKKyAgICAgICAgQUxPR0QoInNvdXJjZWJhc2UgZnJlZWQ6ICVwIiwgdGhpcyk7CisgICAgfQorfTsKKworc3RydWN0IE1lZGlhVHJhY2sKKy8vICAgIDogcHVibGljIFNvdXJjZUJhc2VBbGxvY1RyYWNrZXIKK3sKKyAgICBNZWRpYVRyYWNrKCk7CisKKyAgICAvLyBUbyBiZSBjYWxsZWQgYmVmb3JlIGFueSBvdGhlciBtZXRob2RzIG9uIHRoaXMgb2JqZWN0LCBleGNlcHQKKyAgICAvLyBnZXRGb3JtYXQoKS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zID0gTlVMTCkgPSAwOworCisgICAgLy8gQW55IGJsb2NraW5nIHJlYWQgY2FsbCByZXR1cm5zIGltbWVkaWF0ZWx5IHdpdGggYSByZXN1bHQgb2YgTk9fSU5JVC4KKyAgICAvLyBJdCBpcyBhbiBlcnJvciB0byBjYWxsIGFueSBtZXRob2RzIG90aGVyIHRoYW4gc3RhcnQgYWZ0ZXIgdGhpcyBjYWxsCisgICAgLy8gcmV0dXJucy4gQW55IGJ1ZmZlcnMgdGhlIG9iamVjdCBtYXkgYmUgaG9sZGluZyBvbnRvIGF0IHRoZSB0aW1lIG9mCisgICAgLy8gdGhlIHN0b3AoKSBjYWxsIGFyZSByZWxlYXNlZC4KKyAgICAvLyBBbHNvLCBpdCBpcyBpbXBlcmF0aXZlIHRoYXQgYW55IGJ1ZmZlcnMgb3V0cHV0IGJ5IHRoaXMgb2JqZWN0IGFuZAorICAgIC8vIGhlbGQgb250byBieSBjYWxsZXJzIGJlIHJlbGVhc2VkIGJlZm9yZSBhIGNhbGwgdG8gc3RvcCgpICEhIQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpID0gMDsKKworICAgIC8vIFJldHVybnMgdGhlIGZvcm1hdCBvZiB0aGUgZGF0YSBvdXRwdXQgYnkgdGhpcyBtZWRpYSB0cmFjay4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UmIGZvcm1hdCkgPSAwOworCisgICAgLy8gT3B0aW9ucyB0aGF0IG1vZGlmeSByZWFkKCkgYmVoYXZpb3VyLiBUaGUgZGVmYXVsdCBpcyB0bworICAgIC8vIGEpIG5vdCByZXF1ZXN0IGEgc2VlaworICAgIC8vIGIpIG5vdCBiZSBsYXRlLCBpLmUuIGxhdGVuZXNzX3VzID0gMAorICAgIHN0cnVjdCBSZWFkT3B0aW9ucyB7CisgICAgICAgIGVudW0gU2Vla01vZGUgOiBpbnQzMl90IHsKKyAgICAgICAgICAgIFNFRUtfUFJFVklPVVNfU1lOQywKKyAgICAgICAgICAgIFNFRUtfTkVYVF9TWU5DLAorICAgICAgICAgICAgU0VFS19DTE9TRVNUX1NZTkMsCisgICAgICAgICAgICBTRUVLX0NMT1NFU1QsCisgICAgICAgICAgICBTRUVLX0ZSQU1FX0lOREVYLAorICAgICAgICB9OworCisgICAgICAgIFJlYWRPcHRpb25zKCk7CisKKyAgICAgICAgLy8gUmVzZXQgZXZlcnl0aGluZyBiYWNrIHRvIGRlZmF1bHRzLgorICAgICAgICB2b2lkIHJlc2V0KCk7CisKKyAgICAgICAgdm9pZCBzZXRTZWVrVG8oaW50NjRfdCB0aW1lX3VzLCBTZWVrTW9kZSBtb2RlID0gU0VFS19DTE9TRVNUX1NZTkMpOworICAgICAgICB2b2lkIGNsZWFyU2Vla1RvKCk7CisgICAgICAgIGJvb2wgZ2V0U2Vla1RvKGludDY0X3QgKnRpbWVfdXMsIFNlZWtNb2RlICptb2RlKSBjb25zdDsKKworICAgICAgICB2b2lkIHNldE5vbkJsb2NraW5nKCk7CisgICAgICAgIHZvaWQgY2xlYXJOb25CbG9ja2luZygpOworICAgICAgICBib29sIGdldE5vbkJsb2NraW5nKCkgY29uc3Q7CisKKyAgICAgICAgLy8gVXNlZCB0byBjbGVhciBhbGwgbm9uLXBlcnNpc3RlbnQgb3B0aW9ucyBmb3IgbXVsdGlwbGUgYnVmZmVyIHJlYWRzLgorICAgICAgICB2b2lkIGNsZWFyTm9uUGVyc2lzdGVudCgpIHsKKyAgICAgICAgICAgIGNsZWFyU2Vla1RvKCk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGVudW0gT3B0aW9ucyB7CisgICAgICAgICAgICBrU2Vla1RvX09wdGlvbiAgICAgID0gMSwKKyAgICAgICAgfTsKKworICAgICAgICB1aW50MzJfdCBtT3B0aW9uczsKKyAgICAgICAgaW50NjRfdCBtU2Vla1RpbWVVczsKKyAgICAgICAgU2Vla01vZGUgbVNlZWtNb2RlOworICAgICAgICBib29sIG1Ob25CbG9ja2luZzsKKyAgICB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOyAvLyBzZW50IHRocm91Z2ggQmluZGVyCisKKyAgICAvLyBSZXR1cm5zIGEgbmV3IGJ1ZmZlciBvZiBkYXRhLiBDYWxsIGJsb2NrcyB1bnRpbCBhCisgICAgLy8gYnVmZmVyIGlzIGF2YWlsYWJsZSwgYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQgb2YgdGhlIGVuZCBvZiB0aGUgc3RyZWFtCisgICAgLy8gaXMgcmVhY2hlZC4KKyAgICAvLyBFbmQgb2Ygc3RyZWFtIGlzIHNpZ25hbGxlZCBieSBhIHJlc3VsdCBvZiBFUlJPUl9FTkRfT0ZfU1RSRUFNLgorICAgIC8vIEEgcmVzdWx0IG9mIElORk9fRk9STUFUX0NIQU5HRUQgaW5kaWNhdGVzIHRoYXQgdGhlIGZvcm1hdCBvZiB0aGlzCisgICAgLy8gTWVkaWFTb3VyY2UgaGFzIGNoYW5nZWQgbWlkLXN0cmVhbSwgdGhlIGNsaWVudCBjYW4gY29udGludWUgcmVhZGluZworICAgIC8vIGJ1dCBzaG91bGQgYmUgcHJlcGFyZWQgZm9yIGJ1ZmZlcnMgb2YgdGhlIG5ldyBjb25maWd1cmF0aW9uLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKSA9IDA7CisKKyAgICB2aXJ0dWFsIH5NZWRpYVRyYWNrKCk7CisKK3ByaXZhdGU6CisgICAgTWVkaWFUcmFjayhjb25zdCBNZWRpYVRyYWNrICYpOworICAgIE1lZGlhVHJhY2sgJm9wZXJhdG9yPShjb25zdCBNZWRpYVRyYWNrICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNRURJQV9TT1VSQ0VfQkFTRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9Wb3JiaXNDb21tZW50LmggYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL1ZvcmJpc0NvbW1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmEzMjk1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9Wb3JiaXNDb21tZW50LmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI2lmbmRlZiBWT1JCSVNfQ09NTUVOVF9IXworI2RlZmluZSBWT1JCSVNfQ09NTUVOVF9IXworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE1ldGFEYXRhQmFzZTsKKwordm9pZCBwYXJzZVZvcmJpc0NvbW1lbnQoCisgICAgICAgIE1ldGFEYXRhQmFzZSAqZmlsZU1ldGEsIGNvbnN0IGNoYXIgKmNvbW1lbnQsIHNpemVfdCBjb21tZW50TGVuZ3RoKTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIFZPUkJJU19DT01NRU5UX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmggYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk0NGQ1MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaApAQCAtMCwwICsxLDIxOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfQlVGRkVSX0hfCisKKyNkZWZpbmUgTUVESUFfQlVGRkVSX0hfCisKKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8bGlzdD4KKworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFCdWZmZXI7CitjbGFzcyBNZWRpYUJ1ZmZlcjsKK2NsYXNzIE1lZGlhQnVmZmVyT2JzZXJ2ZXI7CitjbGFzcyBNZXRhRGF0YUJhc2U7CisKK2NsYXNzIE1lZGlhQnVmZmVyIDogcHVibGljIE1lZGlhQnVmZmVyQmFzZSB7CitwdWJsaWM6CisgICAgLy8gYWxsb2NhdGlvbnMgbGFyZ2VyIHRoYW4gb3IgZXF1YWwgdG8gdGhpcyB3aWxsIHVzZSBzaGFyZWQgbWVtb3J5LgorICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1NoYXJlZE1lbVRocmVzaG9sZCA9IDY0ICogMTAyNDsKKworICAgIC8vIFRoZSB1bmRlcmx5aW5nIGRhdGEgcmVtYWlucyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlciEKKyAgICBNZWRpYUJ1ZmZlcih2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgICBleHBsaWNpdCBNZWRpYUJ1ZmZlcihzaXplX3Qgc2l6ZSk7CisKKyAgICBleHBsaWNpdCBNZWRpYUJ1ZmZlcihjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKKworICAgIE1lZGlhQnVmZmVyKGNvbnN0IHNwPElNZW1vcnk+ICZtZW0pIDoKKyAgICAgICAgTWVkaWFCdWZmZXIoKHVpbnQ4X3QgKiltZW0tPnBvaW50ZXIoKSArIHNpemVvZihTaGFyZWRDb250cm9sKSwgbWVtLT5zaXplKCkpIHsKKyAgICAgICAgLy8gZGVsZWdhdGUgYW5kIG92ZXJyaWRlIG1NZW1vcnkKKyAgICAgICAgbU1lbW9yeSA9IG1lbTsKKyAgICB9CisKKyAgICAvLyBJZiBNZWRpYUJ1ZmZlckdyb3VwIGlzIHNldCwgZGVjcmVtZW50IHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQ7CisgICAgLy8gaWYgdGhlIGxvY2FsIHJlZmVyZW5jZSBjb3VudCBkcm9wcyB0byAwLCByZXR1cm4gdGhlIGJ1ZmZlciB0byB0aGUKKyAgICAvLyBhc3NvY2lhdGVkIE1lZGlhQnVmZmVyR3JvdXAuCisgICAgLy8KKyAgICAvLyBJZiBubyBNZWRpYUJ1ZmZlckdyb3VwIGlzIHNldCwgdGhlIGxvY2FsIHJlZmVyZW5jZSBjb3VudCBtdXN0IGJlIHplcm8KKyAgICAvLyB3aGVuIGNhbGxlZCwgd2hlcmV1cG9uIHRoZSBNZWRpYUJ1ZmZlciBpcyBkZWxldGVkLgorICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlKCk7CisKKyAgICAvLyBJbmNyZW1lbnRzIHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQuCisgICAgLy8gVXNlIG9ubHkgd2hlbiBNZWRpYUJ1ZmZlckdyb3VwIGlzIHNldC4KKyAgICB2aXJ0dWFsIHZvaWQgYWRkX3JlZigpOworCisgICAgdmlydHVhbCB2b2lkICpkYXRhKCkgY29uc3Q7CisgICAgdmlydHVhbCBzaXplX3Qgc2l6ZSgpIGNvbnN0OworCisgICAgdmlydHVhbCBzaXplX3QgcmFuZ2Vfb2Zmc2V0KCkgY29uc3Q7CisgICAgdmlydHVhbCBzaXplX3QgcmFuZ2VfbGVuZ3RoKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0X3JhbmdlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBsZW5ndGgpOworCisgICAgTWV0YURhdGFCYXNlJiBtZXRhX2RhdGEoKTsKKworICAgIC8vIENsZWFycyBtZXRhIGRhdGEgYW5kIHJlc2V0cyB0aGUgcmFuZ2UgdG8gdGhlIGZ1bGwgZXh0ZW50LgorICAgIHZpcnR1YWwgdm9pZCByZXNldCgpOworCisgICAgdmlydHVhbCB2b2lkIHNldE9ic2VydmVyKE1lZGlhQnVmZmVyT2JzZXJ2ZXIgKmdyb3VwKTsKKworICAgIC8vIFJldHVybnMgYSBjbG9uZSBvZiB0aGlzIE1lZGlhQnVmZmVyIGluY3JlYXNpbmcgaXRzIHJlZmVyZW5jZSBjb3VudC4KKyAgICAvLyBUaGUgY2xvbmUgcmVmZXJlbmNlcyB0aGUgc2FtZSBkYXRhIGJ1dCBoYXMgaXRzIG93biByYW5nZSBhbmQKKyAgICAvLyBNZXRhRGF0YS4KKyAgICB2aXJ0dWFsIE1lZGlhQnVmZmVyQmFzZSAqY2xvbmUoKTsKKworICAgIC8vIHN1bSBvZiBsb2NhbFJlZmNvdW50KCkgYW5kIHJlbW90ZVJlZmNvdW50KCkKKyAgICB2aXJ0dWFsIGludCByZWZjb3VudCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGxvY2FsUmVmY291bnQoKSArIHJlbW90ZVJlZmNvdW50KCk7CisgICAgfQorCisgICAgdmlydHVhbCBpbnQgbG9jYWxSZWZjb3VudCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1SZWZDb3VudDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGludCByZW1vdGVSZWZjb3VudCgpIGNvbnN0IHsKKyAgICAgICAgaWYgKG1NZW1vcnkuZ2V0KCkgPT0gbnVsbHB0ciB8fCBtTWVtb3J5LT5wb2ludGVyKCkgPT0gbnVsbHB0cikgcmV0dXJuIDA7CisgICAgICAgIGludDMyX3QgcmVtb3RlUmVmY291bnQgPQorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8U2hhcmVkQ29udHJvbCAqPihtTWVtb3J5LT5wb2ludGVyKCkpLT5nZXRSZW1vdGVSZWZjb3VudCgpOworICAgICAgICAvLyBTYW5pdHkgY2hlY2sgc28gdGhhdCByZW1vdGVSZWZDb3VudCgpIGlzIG5vbi1uZWdhdGl2ZS4KKyAgICAgICAgcmV0dXJuIHJlbW90ZVJlZmNvdW50ID49IDAgPyByZW1vdGVSZWZjb3VudCA6IDA7IC8vIGRvIG5vdCBhbGxvdyBjb3JydXB0ZWQgZGF0YS4KKyAgICB9CisKKyAgICAvLyByZXR1cm5zIG9sZCB2YWx1ZQorICAgIGludCBhZGRSZW1vdGVSZWZjb3VudChpbnQzMl90IHZhbHVlKSB7CisgICAgICAgIGlmIChtTWVtb3J5LmdldCgpID09IG51bGxwdHIgfHwgbU1lbW9yeS0+cG9pbnRlcigpID09IG51bGxwdHIpIHJldHVybiAwOworICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxTaGFyZWRDb250cm9sICo+KG1NZW1vcnktPnBvaW50ZXIoKSktPmFkZFJlbW90ZVJlZmNvdW50KHZhbHVlKTsKKyAgICB9CisKKyAgICBib29sIGlzRGVhZE9iamVjdCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGlzRGVhZE9iamVjdChtTWVtb3J5KTsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBpc0RlYWRPYmplY3QoY29uc3Qgc3A8SU1lbW9yeT4gJm1lbW9yeSkgeworICAgICAgICBpZiAobWVtb3J5LmdldCgpID09IG51bGxwdHIgfHwgbWVtb3J5LT5wb2ludGVyKCkgPT0gbnVsbHB0cikgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxTaGFyZWRDb250cm9sICo+KG1lbW9yeS0+cG9pbnRlcigpKS0+aXNEZWFkT2JqZWN0KCk7CisgICAgfQorCisgICAgLy8gU3RpY2t5IG9uIGVuYWJsaW5nIG9mIHNoYXJlZCBtZW1vcnkgTWVkaWFCdWZmZXJzLiBCeSBkZWZhdWx0IHdlIGRvbid0IHVzZQorICAgIC8vIHNoYXJlZCBtZW1vcnkgZm9yIE1lZGlhQnVmZmVycywgYnV0IHdlIGVuYWJsZSB0aGlzIGZvciB0aG9zZSBwcm9jZXNzZXMKKyAgICAvLyB0aGF0IGV4cG9ydCBNZWRpYUJ1ZmZlcnMuCisgICAgc3RhdGljIHZvaWQgdXNlU2hhcmVkTWVtb3J5KCkgeworICAgICAgICBzdGQ6OmF0b21pY19zdG9yZV9leHBsaWNpdCgKKyAgICAgICAgICAgICAgICAmbVVzZVNoYXJlZE1lbW9yeSwgKGludF9sZWFzdDMyX3QpMSwgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgLy8gdHJ1ZSBpZiBNZWRpYUJ1ZmZlciBpcyBvYnNlcnZlZCAocGFydCBvZiBhIE1lZGlhQnVmZmVyR3JvdXApLgorICAgIGlubGluZSBib29sIGlzT2JzZXJ2ZWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtT2JzZXJ2ZXIgIT0gbnVsbHB0cjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5NZWRpYUJ1ZmZlcigpOworCisgICAgc3A8SU1lbW9yeT4gbU1lbW9yeTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgTWVkaWFCdWZmZXJHcm91cDsKKyAgICBmcmllbmQgY2xhc3MgT01YRGVjb2RlcjsKKyAgICBmcmllbmQgY2xhc3MgQm5NZWRpYVNvdXJjZTsKKyAgICBmcmllbmQgY2xhc3MgQnBNZWRpYVNvdXJjZTsKKworICAgIC8vIEZvciB1c2UgYnkgT01YRGVjb2RlciwgcmVmZXJlbmNlIGNvdW50IG11c3QgYmUgMSwgZHJvcCByZWZlcmVuY2UKKyAgICAvLyBjb3VudCB0byAwIHdpdGhvdXQgc2lnbmFsbGluZyB0aGUgb2JzZXJ2ZXIuCisgICAgdm9pZCBjbGFpbSgpOworCisgICAgTWVkaWFCdWZmZXJPYnNlcnZlciAqbU9ic2VydmVyOworICAgIGludCBtUmVmQ291bnQ7CisKKyAgICB2b2lkICptRGF0YTsKKyAgICBzaXplX3QgbVNpemUsIG1SYW5nZU9mZnNldCwgbVJhbmdlTGVuZ3RoOworICAgIHNwPEFCdWZmZXI+IG1CdWZmZXI7CisKKyAgICBib29sIG1Pd25zRGF0YTsKKworICAgIE1ldGFEYXRhQmFzZSogbU1ldGFEYXRhOworCisgICAgTWVkaWFCdWZmZXIgKm1PcmlnaW5hbDsKKworICAgIHN0YXRpYyBzdGQ6OmF0b21pY19pbnRfbGVhc3QzMl90IG1Vc2VTaGFyZWRNZW1vcnk7CisKKyAgICBNZWRpYUJ1ZmZlcihjb25zdCBNZWRpYUJ1ZmZlciAmKTsKKyAgICBNZWRpYUJ1ZmZlciAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhQnVmZmVyICYpOworCisgICAgLy8gU2hhcmVkQ29udHJvbCBibG9jayBhdCB0aGUgc3RhcnQgb2YgSU1lbW9yeS4KKyAgICBzdHJ1Y3QgU2hhcmVkQ29udHJvbCB7CisgICAgICAgIGVudW0geworICAgICAgICAgICAgRkxBR19ERUFEX09CSkVDVCA9ICgxIDw8IDApLAorICAgICAgICB9OworCisgICAgICAgIC8vIHJldHVybnMgb2xkIHZhbHVlCisgICAgICAgIGlubGluZSBpbnQzMl90IGFkZFJlbW90ZVJlZmNvdW50KGludDMyX3QgdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGQ6OmF0b21pY19mZXRjaF9hZGRfZXhwbGljaXQoCisgICAgICAgICAgICAgICAgICAgICZtUmVtb3RlUmVmY291bnQsIChpbnRfbGVhc3QzMl90KXZhbHVlLCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSBpbnQzMl90IGdldFJlbW90ZVJlZmNvdW50KCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6YXRvbWljX2xvYWRfZXhwbGljaXQoJm1SZW1vdGVSZWZjb3VudCwgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCk7CisgICAgICAgIH0KKworICAgICAgICBpbmxpbmUgdm9pZCBzZXRSZW1vdGVSZWZjb3VudChpbnQzMl90IHZhbHVlKSB7CisgICAgICAgICAgICBzdGQ6OmF0b21pY19zdG9yZV9leHBsaWNpdCgKKyAgICAgICAgICAgICAgICAgICAgJm1SZW1vdGVSZWZjb3VudCwgKGludF9sZWFzdDMyX3QpdmFsdWUsIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpOworICAgICAgICB9CisKKyAgICAgICAgaW5saW5lIGJvb2wgaXNEZWFkT2JqZWN0KCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIChzdGQ6OmF0b21pY19sb2FkX2V4cGxpY2l0KAorICAgICAgICAgICAgICAgICAgICAmbUZsYWdzLCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KSAmIEZMQUdfREVBRF9PQkpFQ1QpICE9IDA7CisgICAgICAgIH0KKworICAgICAgICBpbmxpbmUgdm9pZCBzZXREZWFkT2JqZWN0KCkgeworICAgICAgICAgICAgKHZvaWQpc3RkOjphdG9taWNfZmV0Y2hfb3JfZXhwbGljaXQoCisgICAgICAgICAgICAgICAgICAgICZtRmxhZ3MsIChpbnRfbGVhc3QzMl90KUZMQUdfREVBRF9PQkpFQ1QsIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpOworICAgICAgICB9CisKKyAgICAgICAgaW5saW5lIHZvaWQgY2xlYXIoKSB7CisgICAgICAgICAgICBzdGQ6OmF0b21pY19zdG9yZV9leHBsaWNpdCgKKyAgICAgICAgICAgICAgICAgICAgJm1GbGFncywgKGludF9sZWFzdDMyX3QpMCwgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCk7CisgICAgICAgICAgICBzdGQ6OmF0b21pY19zdG9yZV9leHBsaWNpdCgKKyAgICAgICAgICAgICAgICAgICAgJm1SZW1vdGVSZWZjb3VudCwgKGludF9sZWFzdDMyX3QpMCwgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIC8vIENhdXRpb246IGF0b21pY19pbnRfZmFzdDMyX3QgaXMgNjQgYml0cyBvbiBMUDY0LgorICAgICAgICBzdGQ6OmF0b21pY19pbnRfbGVhc3QzMl90IG1GbGFnczsKKyAgICAgICAgc3RkOjphdG9taWNfaW50X2xlYXN0MzJfdCBtUmVtb3RlUmVmY291bnQ7CisgICAgICAgIGludDMyX3QgdW51c2VkWzZdIF9fYXR0cmlidXRlX18oKF9fdW51c2VkX18pKTsgLy8gYWRkaXRpb25hbCBidWZmZXIgc3BhY2UKKyAgICB9OworCisgICAgaW5saW5lIFNoYXJlZENvbnRyb2wgKmdldFNoYXJlZENvbnRyb2woKSBjb25zdCB7CisgICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxTaGFyZWRDb250cm9sICo+KG1NZW1vcnktPnBvaW50ZXIoKSk7CisgICAgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfQlVGRkVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzhkOTRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaApAQCAtMCwwICsxLDg0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9CVUZGRVJfQkFTRV9IXworCisjZGVmaW5lIE1FRElBX0JVRkZFUl9CQVNFX0hfCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTWVkaWFCdWZmZXJCYXNlOworY2xhc3MgTWV0YURhdGFCYXNlOworCitjbGFzcyBNZWRpYUJ1ZmZlck9ic2VydmVyIHsKK3B1YmxpYzoKKyAgICBNZWRpYUJ1ZmZlck9ic2VydmVyKCkge30KKyAgICB2aXJ0dWFsIH5NZWRpYUJ1ZmZlck9ic2VydmVyKCkge30KKworICAgIHZpcnR1YWwgdm9pZCBzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcikgPSAwOworCitwcml2YXRlOgorICAgIE1lZGlhQnVmZmVyT2JzZXJ2ZXIoY29uc3QgTWVkaWFCdWZmZXJPYnNlcnZlciAmKTsKKyAgICBNZWRpYUJ1ZmZlck9ic2VydmVyICZvcGVyYXRvcj0oY29uc3QgTWVkaWFCdWZmZXJPYnNlcnZlciAmKTsKK307CisKK2NsYXNzIE1lZGlhQnVmZmVyQmFzZSB7CitwdWJsaWM6CisgICAgc3RhdGljIE1lZGlhQnVmZmVyQmFzZSAqQ3JlYXRlKHNpemVfdCBzaXplKTsKKworICAgIC8vIElmIE1lZGlhQnVmZmVyR3JvdXAgaXMgc2V0LCBkZWNyZW1lbnQgdGhlIGxvY2FsIHJlZmVyZW5jZSBjb3VudDsKKyAgICAvLyBpZiB0aGUgbG9jYWwgcmVmZXJlbmNlIGNvdW50IGRyb3BzIHRvIDAsIHJldHVybiB0aGUgYnVmZmVyIHRvIHRoZQorICAgIC8vIGFzc29jaWF0ZWQgTWVkaWFCdWZmZXJHcm91cC4KKyAgICAvLworICAgIC8vIElmIG5vIE1lZGlhQnVmZmVyR3JvdXAgaXMgc2V0LCB0aGUgbG9jYWwgcmVmZXJlbmNlIGNvdW50IG11c3QgYmUgemVybworICAgIC8vIHdoZW4gY2FsbGVkLCB3aGVyZXVwb24gdGhlIE1lZGlhQnVmZmVyIGlzIGRlbGV0ZWQuCisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2UoKSA9IDA7CisKKyAgICAvLyBJbmNyZW1lbnRzIHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQuCisgICAgLy8gVXNlIG9ubHkgd2hlbiBNZWRpYUJ1ZmZlckdyb3VwIGlzIHNldC4KKyAgICB2aXJ0dWFsIHZvaWQgYWRkX3JlZigpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCAqZGF0YSgpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHNpemVfdCBzaXplKCkgY29uc3QgPSAwOworCisgICAgdmlydHVhbCBzaXplX3QgcmFuZ2Vfb2Zmc2V0KCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgc2l6ZV90IHJhbmdlX2xlbmd0aCgpIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRfcmFuZ2Uoc2l6ZV90IG9mZnNldCwgc2l6ZV90IGxlbmd0aCkgPSAwOworCisgICAgdmlydHVhbCBNZXRhRGF0YUJhc2UmIG1ldGFfZGF0YSgpID0gMDsKKworICAgIC8vIENsZWFycyBtZXRhIGRhdGEgYW5kIHJlc2V0cyB0aGUgcmFuZ2UgdG8gdGhlIGZ1bGwgZXh0ZW50LgorICAgIHZpcnR1YWwgdm9pZCByZXNldCgpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRPYnNlcnZlcihNZWRpYUJ1ZmZlck9ic2VydmVyICpncm91cCkgPSAwOworCisgICAgLy8gUmV0dXJucyBhIGNsb25lIG9mIHRoaXMgTWVkaWFCdWZmZXJCYXNlIGluY3JlYXNpbmcgaXRzIHJlZmVyZW5jZQorICAgIC8vIGNvdW50LiBUaGUgY2xvbmUgcmVmZXJlbmNlcyB0aGUgc2FtZSBkYXRhIGJ1dCBoYXMgaXRzIG93biByYW5nZSBhbmQKKyAgICAvLyBNZXRhRGF0YS4KKyAgICB2aXJ0dWFsIE1lZGlhQnVmZmVyQmFzZSAqY2xvbmUoKSA9IDA7CisKKyAgICB2aXJ0dWFsIGludCByZWZjb3VudCgpIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgaW50IGxvY2FsUmVmY291bnQoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBpbnQgcmVtb3RlUmVmY291bnQoKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIH5NZWRpYUJ1ZmZlckJhc2UoKSB7fTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfQlVGRkVSX0JBU0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVkNWRmNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX0JVRkZFUl9HUk9VUF9IXworCisjZGVmaW5lIE1FRElBX0JVRkZFUl9HUk9VUF9IXworCisjaW5jbHVkZSA8bGlzdD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNZWRpYUJ1ZmZlckJhc2U7CisKK2NsYXNzIE1lZGlhQnVmZmVyR3JvdXAgOiBwdWJsaWMgTWVkaWFCdWZmZXJPYnNlcnZlciB7CitwdWJsaWM6CisgICAgTWVkaWFCdWZmZXJHcm91cChzaXplX3QgZ3Jvd3RoTGltaXQgPSAwKTsKKworICAgIC8vIGNyZWF0ZSBhIG1lZGlhIGJ1ZmZlciBncm91cCB3aXRoIHByZWFsbG9jYXRlZCBidWZmZXJzCisgICAgTWVkaWFCdWZmZXJHcm91cChzaXplX3QgYnVmZmVycywgc2l6ZV90IGJ1ZmZlcl9zaXplLCBzaXplX3QgZ3Jvd3RoTGltaXQgPSAwKTsKKworICAgIH5NZWRpYUJ1ZmZlckdyb3VwKCk7CisKKyAgICB2b2lkIGFkZF9idWZmZXIoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpOworCisgICAgYm9vbCBoYXNfYnVmZmVycygpOworCisgICAgLy8gSWYgbm9uQmxvY2tpbmcgaXMgZmFsc2UsIGl0IGJsb2NrcyB1bnRpbCBhIGJ1ZmZlciBpcyBhdmFpbGFibGUgYW5kCisgICAgLy8gcGFzc2VzIGl0IHRvIHRoZSBjYWxsZXIgaW4gKmJ1ZmZlciwgd2hpbGUgcmV0dXJuaW5nIE9LLgorICAgIC8vIFRoZSByZXR1cm5lZCBidWZmZXIgd2lsbCBoYXZlIGEgcmVmZXJlbmNlIGNvdW50IG9mIDEuCisgICAgLy8gSWYgbm9uQmxvY2tpbmcgaXMgdHJ1ZSBhbmQgYSBidWZmZXIgaXMgbm90IGltbWVkaWF0ZWx5IGF2YWlsYWJsZSwKKyAgICAvLyBidWZmZXIgaXMgc2V0IHRvIE5VTEwgYW5kIGl0IHJldHVybnMgV09VTERfQkxPQ0suCisgICAgLy8gSWYgcmVxdWVzdGVkU2l6ZSBpcyAwLCBhbnkgZnJlZSBNZWRpYUJ1ZmZlciB3aWxsIGJlIHJldHVybmVkLgorICAgIC8vIElmIHJlcXVlc3RlZFNpemUgaXMgPiAwLCB0aGUgcmV0dXJuZWQgTWVkaWFCdWZmZXIgc2hvdWxkIGhhdmUgYnVmZmVyCisgICAgLy8gc2l6ZSBvZiBhdCBsZWFzdCByZXF1c3RlZFNpemUuCisgICAgc3RhdHVzX3QgYWNxdWlyZV9idWZmZXIoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGJvb2wgbm9uQmxvY2tpbmcgPSBmYWxzZSwgc2l6ZV90IHJlcXVlc3RlZFNpemUgPSAwKTsKKworICAgIHNpemVfdCBidWZmZXJzKCkgY29uc3Q7CisKKyAgICAvLyBJZiBidWZmZXIgaXMgbnVsbHB0ciwgaGF2ZSBhY3F1aXJlX2J1ZmZlcigpIGNoZWNrIGZvciByZW1vdGUgcmVsZWFzZS4KKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpOworCitwcml2YXRlOgorICAgIHN0cnVjdCBJbnRlcm5hbERhdGE7CisgICAgSW50ZXJuYWxEYXRhICptSW50ZXJuYWw7CisKKyAgICBNZWRpYUJ1ZmZlckdyb3VwKGNvbnN0IE1lZGlhQnVmZmVyR3JvdXAgJik7CisgICAgTWVkaWFCdWZmZXJHcm91cCAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhQnVmZmVyR3JvdXAgJik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1FRElBX0JVRkZFUl9HUk9VUF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MjUzNTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmgKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVUQV9EQVRBX0hfCisKKyNkZWZpbmUgTUVUQV9EQVRBX0hfCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNZXRhRGF0YSBmaW5hbCA6IHB1YmxpYyBNZXRhRGF0YUJhc2UsIHB1YmxpYyBSZWZCYXNlIHsKK3B1YmxpYzoKKyAgICBNZXRhRGF0YSgpOworICAgIE1ldGFEYXRhKGNvbnN0IE1ldGFEYXRhICZmcm9tKTsKKyAgICBNZXRhRGF0YShjb25zdCBNZXRhRGF0YUJhc2UgJmZyb20pOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+TWV0YURhdGEoKTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgQm5NZWRpYVNvdXJjZTsKKyAgICBmcmllbmQgY2xhc3MgQnBNZWRpYVNvdXJjZTsKKyAgICBmcmllbmQgY2xhc3MgQnBNZWRpYUV4dHJhY3RvcjsKKyAgICBzdGF0aWMgc3A8TWV0YURhdGE+IGNyZWF0ZUZyb21QYXJjZWwoY29uc3QgUGFyY2VsICZwYXJjZWwpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNRVRBX0RBVEFfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmggYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZTM0ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oCkBAIC0wLDAgKzEsMzE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRVRBX0RBVEFfQkFTRV9IXworCisjZGVmaW5lIE1FVEFfREFUQV9CQVNFX0hfCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBUaGUgZm9sbG93aW5nIGtleXMgbWFwIHRvIGludDMyX3QgZGF0YSB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KK2VudW0geworICAgIGtLZXlNSU1FVHlwZSAgICAgICAgICA9ICdtaW1lJywgIC8vIGNzdHJpbmcKKyAgICBrS2V5V2lkdGggICAgICAgICAgICAgPSAnd2lkdCcsICAvLyBpbnQzMl90LCBpbWFnZSBwaXhlbAorICAgIGtLZXlIZWlnaHQgICAgICAgICAgICA9ICdoZWlnJywgIC8vIGludDMyX3QsIGltYWdlIHBpeGVsCisgICAga0tleURpc3BsYXlXaWR0aCAgICAgID0gJ2RXaWQnLCAgLy8gaW50MzJfdCwgZGlzcGxheS9wcmVzZW50YXRpb24KKyAgICBrS2V5RGlzcGxheUhlaWdodCAgICAgPSAnZEhndCcsICAvLyBpbnQzMl90LCBkaXNwbGF5L3ByZXNlbnRhdGlvbgorICAgIGtLZXlTQVJXaWR0aCAgICAgICAgICA9ICdzYXJXJywgIC8vIGludDMyX3QsIHNhbXBsZUFzcGVjdFJhdGlvIHdpZHRoCisgICAga0tleVNBUkhlaWdodCAgICAgICAgID0gJ3NhckgnLCAgLy8gaW50MzJfdCwgc2FtcGxlQXNwZWN0UmF0aW8gaGVpZ2h0CisgICAga0tleVRodW1ibmFpbFdpZHRoICAgID0gJ3RoYlcnLCAgLy8gaW50MzJfdCwgdGh1bWJuYWlsIHdpZHRoCisgICAga0tleVRodW1ibmFpbEhlaWdodCAgID0gJ3RoYkgnLCAgLy8gaW50MzJfdCwgdGh1bWJuYWlsIGhlaWdodAorCisgICAgLy8gYSByZWN0YW5nbGUsIGlmIGFic2VudCBhc3N1bWVkIHRvIGJlICgwLCAwLCB3aWR0aCAtIDEsIGhlaWdodCAtIDEpCisgICAga0tleUNyb3BSZWN0ICAgICAgICAgID0gJ2Nyb3AnLAorCisgICAga0tleVJvdGF0aW9uICAgICAgICAgID0gJ3JvdEEnLCAgLy8gaW50MzJfdCAoYW5nbGUgaW4gZGVncmVlcykKKyAgICBrS2V5SUZyYW1lc0ludGVydmFsICAgPSAnaWZpdicsICAvLyBpbnQzMl90CisgICAga0tleVN0cmlkZSAgICAgICAgICAgID0gJ3N0cmQnLCAgLy8gaW50MzJfdAorICAgIGtLZXlTbGljZUhlaWdodCAgICAgICA9ICdzbGh0JywgIC8vIGludDMyX3QKKyAgICBrS2V5Q2hhbm5lbENvdW50ICAgICAgPSAnI2NobicsICAvLyBpbnQzMl90CisgICAga0tleUNoYW5uZWxNYXNrICAgICAgID0gJ2Nobm0nLCAgLy8gaW50MzJfdAorICAgIGtLZXlTYW1wbGVSYXRlICAgICAgICA9ICdzcnRlJywgIC8vIGludDMyX3QgKGF1ZGlvIHNhbXBsaW5nIHJhdGUgSHopCisgICAga0tleVBjbUVuY29kaW5nICAgICAgID0gJ1BDTWUnLCAgLy8gaW50MzJfdCAoYXVkaW8gZW5jb2RpbmcgZW51bSkKKyAgICBrS2V5RnJhbWVSYXRlICAgICAgICAgPSAnZnJtUicsICAvLyBpbnQzMl90ICh2aWRlbyBmcmFtZSByYXRlIGZwcykKKyAgICBrS2V5Qml0UmF0ZSAgICAgICAgICAgPSAnYnJ0ZScsICAvLyBpbnQzMl90IChicHMpCisgICAga0tleU1heEJpdFJhdGUgICAgICAgID0gJ214QnInLCAgLy8gaW50MzJfdCAoYnBzKQorICAgIGtLZXlTdHJlYW1IZWFkZXIgICAgICA9ICdzdEhkJywgIC8vIHJhdyBkYXRhCisgICAga0tleUVTRFMgICAgICAgICAgICAgID0gJ2VzZHMnLCAgLy8gcmF3IGRhdGEKKyAgICBrS2V5QUFDUHJvZmlsZSAgICAgICAgPSAnYWFjcCcsICAvLyBpbnQzMl90CisgICAga0tleUFWQ0MgICAgICAgICAgICAgID0gJ2F2Y2MnLCAgLy8gcmF3IGRhdGEKKyAgICBrS2V5SFZDQyAgICAgICAgICAgICAgPSAnaHZjYycsICAvLyByYXcgZGF0YQorICAgIGtLZXlUaHVtYm5haWxIVkNDICAgICA9ICd0aHZjJywgIC8vIHJhdyBkYXRhCisgICAga0tleUQyNjMgICAgICAgICAgICAgID0gJ2QyNjMnLCAgLy8gcmF3IGRhdGEKKyAgICBrS2V5Vm9yYmlzSW5mbyAgICAgICAgPSAndmluZicsICAvLyByYXcgZGF0YQorICAgIGtLZXlWb3JiaXNCb29rcyAgICAgICA9ICd2Ym9vJywgIC8vIHJhdyBkYXRhCisgICAga0tleU9wdXNIZWFkZXIgICAgICAgID0gJ29oZHInLCAgLy8gcmF3IGRhdGEKKyAgICBrS2V5T3B1c0NvZGVjRGVsYXkgICAgPSAnb2NvZCcsICAvLyB1aW50NjRfdCAoY29kZWMgZGVsYXkgaW4gbnMpCisgICAga0tleU9wdXNTZWVrUHJlUm9sbCAgID0gJ29zcHInLCAgLy8gdWludDY0X3QgKHNlZWsgcHJlcm9sbCBpbiBucykKKyAgICBrS2V5RmxhY01ldGFkYXRhICAgICAgPSAnZmxNZCcsICAvLyByYXcgZGF0YQorICAgIGtLZXlWcDlDb2RlY1ByaXZhdGUgICA9ICd2cDlwJywgIC8vIHJhdyBkYXRhICh2cDkgY3NkIGluZm9ybWF0aW9uKQorICAgIGtLZXlXYW50c05BTEZyYWdtZW50cyA9ICdOQUxmJywKKyAgICBrS2V5SXNTeW5jRnJhbWUgICAgICAgPSAnc3luYycsICAvLyBpbnQzMl90IChib29sKQorICAgIGtLZXlJc0NvZGVjQ29uZmlnICAgICA9ICdjb25mJywgIC8vIGludDMyX3QgKGJvb2wpCisgICAga0tleUlzTXV4ZXJEYXRhICAgICAgID0gJ211eGQnLCAgLy8gaW50MzJfdCAoYm9vbCkKKyAgICBrS2V5VGltZSAgICAgICAgICAgICAgPSAndGltZScsICAvLyBpbnQ2NF90ICh1c2VjcykKKyAgICBrS2V5RGVjb2RpbmdUaW1lICAgICAgPSAnZGVjVCcsICAvLyBpbnQ2NF90IChkZWNvZGluZyB0aW1lc3RhbXAgaW4gdXNlY3MpCisgICAga0tleU5UUFRpbWUgICAgICAgICAgID0gJ250cFQnLCAgLy8gdWludDY0X3QgKG50cC10aW1lc3RhbXApCisgICAga0tleVRhcmdldFRpbWUgICAgICAgID0gJ3RhclQnLCAgLy8gaW50NjRfdCAodXNlY3MpCisgICAga0tleURyaWZ0VGltZSAgICAgICAgID0gJ2RmdFQnLCAgLy8gaW50NjRfdCAodXNlY3MpCisgICAga0tleUFuY2hvclRpbWUgICAgICAgID0gJ2FuY1QnLCAgLy8gaW50NjRfdCAodXNlY3MpCisgICAga0tleUR1cmF0aW9uICAgICAgICAgID0gJ2R1cmEnLCAgLy8gaW50NjRfdCAodXNlY3MpCisgICAga0tleVBpeGVsRm9ybWF0ICAgICAgID0gJ3BpeGYnLCAgLy8gaW50MzJfdAorICAgIGtLZXlDb2xvckZvcm1hdCAgICAgICA9ICdjb2xmJywgIC8vIGludDMyX3QKKyAgICBrS2V5Q29sb3JTcGFjZSAgICAgICAgPSAnY29scycsICAvLyBpbnQzMl90CisgICAga0tleVBsYXRmb3JtUHJpdmF0ZSAgID0gJ3ByaXYnLCAgLy8gcG9pbnRlcgorICAgIGtLZXlEZWNvZGVyQ29tcG9uZW50ICA9ICdkZWNDJywgIC8vIGNzdHJpbmcKKyAgICBrS2V5QnVmZmVySUQgICAgICAgICAgPSAnYmZJRCcsCisgICAga0tleU1heElucHV0U2l6ZSAgICAgID0gJ2lucFMnLAorICAgIGtLZXlNYXhXaWR0aCAgICAgICAgICA9ICdtYXhXJywKKyAgICBrS2V5TWF4SGVpZ2h0ICAgICAgICAgPSAnbWF4SCcsCisgICAga0tleVRodW1ibmFpbFRpbWUgICAgID0gJ3RoYlQnLCAgLy8gaW50NjRfdCAodXNlY3MpCisgICAga0tleVRyYWNrSUQgICAgICAgICAgID0gJ3RySUQnLAorICAgIGtLZXlJc0RSTSAgICAgICAgICAgICA9ICdpZHJtJywgIC8vIGludDMyX3QgKGJvb2wpCisgICAga0tleUVuY29kZXJEZWxheSAgICAgID0gJ2VuY2QnLCAgLy8gaW50MzJfdCAoZnJhbWVzKQorICAgIGtLZXlFbmNvZGVyUGFkZGluZyAgICA9ICdlbmNwJywgIC8vIGludDMyX3QgKGZyYW1lcykKKworICAgIGtLZXlBbGJ1bSAgICAgICAgICAgICA9ICdhbGJ1JywgIC8vIGNzdHJpbmcKKyAgICBrS2V5QXJ0aXN0ICAgICAgICAgICAgPSAnYXJ0aScsICAvLyBjc3RyaW5nCisgICAga0tleUFsYnVtQXJ0aXN0ICAgICAgID0gJ2FhcnQnLCAgLy8gY3N0cmluZworICAgIGtLZXlDb21wb3NlciAgICAgICAgICA9ICdjb21wJywgIC8vIGNzdHJpbmcKKyAgICBrS2V5R2VucmUgICAgICAgICAgICAgPSAnZ2VucicsICAvLyBjc3RyaW5nCisgICAga0tleVRpdGxlICAgICAgICAgICAgID0gJ3RpdGwnLCAgLy8gY3N0cmluZworICAgIGtLZXlZZWFyICAgICAgICAgICAgICA9ICd5ZWFyJywgIC8vIGNzdHJpbmcKKyAgICBrS2V5QWxidW1BcnQgICAgICAgICAgPSAnYWxiQScsICAvLyBjb21wcmVzc2VkIGltYWdlIGRhdGEKKyAgICBrS2V5QWxidW1BcnRNSU1FICAgICAgPSAnYWxBTScsICAvLyBjc3RyaW5nCisgICAga0tleUF1dGhvciAgICAgICAgICAgID0gJ2F1dGgnLCAgLy8gY3N0cmluZworICAgIGtLZXlDRFRyYWNrTnVtYmVyICAgICA9ICdjZHRyJywgIC8vIGNzdHJpbmcKKyAgICBrS2V5RGlzY051bWJlciAgICAgICAgPSAnZG51bScsICAvLyBjc3RyaW5nCisgICAga0tleURhdGUgICAgICAgICAgICAgID0gJ2RhdGUnLCAgLy8gY3N0cmluZworICAgIGtLZXlXcml0ZXIgICAgICAgICAgICA9ICd3cml0JywgIC8vIGNzdHJpbmcKKyAgICBrS2V5Q29tcGlsYXRpb24gICAgICAgPSAnY3BpbCcsICAvLyBjc3RyaW5nCisgICAga0tleUxvY2F0aW9uICAgICAgICAgID0gJ2xvYyAnLCAgLy8gY3N0cmluZworICAgIGtLZXlUaW1lU2NhbGUgICAgICAgICA9ICd0bXNsJywgIC8vIGludDMyX3QKKyAgICBrS2V5Q2FwdHVyZUZyYW1lcmF0ZSAgPSAnY2FwRicsICAvLyBmbG9hdCAoY2FwdHVyZSBmcHMpCisKKyAgICAvLyB2aWRlbyBwcm9maWxlIGFuZCBsZXZlbAorICAgIGtLZXlWaWRlb1Byb2ZpbGUgICAgICA9ICd2cHJmJywgIC8vIGludDMyX3QKKyAgICBrS2V5VmlkZW9MZXZlbCAgICAgICAgPSAndmxldicsICAvLyBpbnQzMl90CisKKyAgICAvLyBTZXQgdGhpcyBrZXkgdG8gZW5hYmxlIGF1dGhvcmluZyBmaWxlcyBpbiA2NC1iaXQgb2Zmc2V0CisgICAga0tleTY0Qml0RmlsZU9mZnNldCAgID0gJ2ZvYnQnLCAgLy8gaW50MzJfdCAoYm9vbCkKKyAgICBrS2V5MkJ5dGVOYWxMZW5ndGggICAgPSAnMk5BTCcsICAvLyBpbnQzMl90IChib29sKQorCisgICAgLy8gSWRlbnRpZnkgdGhlIGZpbGUgb3V0cHV0IGZvcm1hdCBmb3IgYXV0aG9yaW5nCisgICAgLy8gUGxlYXNlIHNlZSA8bWVkaWEvbWVkaWFyZWNvcmRlci5oPiBmb3IgdGhlIHN1cHBvcnRlZAorICAgIC8vIGZpbGUgb3V0cHV0IGZvcm1hdHMuCisgICAga0tleUZpbGVUeXBlICAgICAgICAgID0gJ2Z0eXAnLCAgLy8gaW50MzJfdAorCisgICAgLy8gVHJhY2sgYXV0aG9yaW5nIHByb2dyZXNzIHN0YXR1cworICAgIC8vIGtLZXlUcmFja1RpbWVTdGF0dXMgaXMgdXNlZCB0byB0cmFjayBwcm9ncmVzcyBpbiBlbGFwc2VkIHRpbWUKKyAgICBrS2V5VHJhY2tUaW1lU3RhdHVzICAgPSAndGt0bScsICAvLyBpbnQ2NF90CisKKyAgICBrS2V5UmVhbFRpbWVSZWNvcmRpbmcgPSAncnRyYycsICAvLyBib29sIChpbnQzMl90KQorICAgIGtLZXlOdW1CdWZmZXJzICAgICAgICA9ICduYmJmJywgIC8vIGludDMyX3QKKworICAgIC8vIE9nZyBmaWxlcyBjYW4gYmUgdGFnZ2VkIHRvIGJlIGF1dG9tYXRpY2FsbHkgbG9vcGluZy4uLgorICAgIGtLZXlBdXRvTG9vcCAgICAgICAgICA9ICdhdXRMJywgIC8vIGJvb2wgKGludDMyX3QpCisKKyAgICBrS2V5VmFsaWRTYW1wbGVzICAgICAgPSAndmFsRCcsICAvLyBpbnQzMl90CisKKyAgICBrS2V5SXNVbnJlYWRhYmxlICAgICAgPSAndW5yZScsICAvLyBib29sIChpbnQzMl90KQorCisgICAgLy8gQW4gaW5kaWNhdGlvbiB0aGF0IGEgdmlkZW8gYnVmZmVyIGhhcyBiZWVuIHJlbmRlcmVkLgorICAgIGtLZXlSZW5kZXJlZCAgICAgICAgICA9ICdyZW5kJywgIC8vIGJvb2wgKGludDMyX3QpCisKKyAgICAvLyBUaGUgbGFuZ3VhZ2UgY29kZSBmb3IgdGhpcyBtZWRpYQorICAgIGtLZXlNZWRpYUxhbmd1YWdlICAgICA9ICdsYW5nJywgIC8vIGNzdHJpbmcKKworICAgIC8vIFRvIHN0b3JlIHRoZSB0aW1lZCB0ZXh0IGZvcm1hdCBkYXRhCisgICAga0tleVRleHRGb3JtYXREYXRhICAgID0gJ3RleHQnLCAgLy8gcmF3IGRhdGEKKworICAgIGtLZXlSZXF1aXJlc1NlY3VyZUJ1ZmZlcnMgPSAnc2VjdScsICAvLyBib29sIChpbnQzMl90KQorCisgICAga0tleUlzQURUUyAgICAgICAgICAgID0gJ2FkdHMnLCAgLy8gYm9vbCAoaW50MzJfdCkKKyAgICBrS2V5QUFDQU9UICAgICAgICAgICAgPSAnYWFvdCcsICAvLyBpbnQzMl90CisKKyAgICAvLyBJZiBhIE1lZGlhQnVmZmVyJ3MgZGF0YSByZXByZXNlbnRzIChhdCBsZWFzdCBwYXJ0aWFsbHkpIGVuY3J5cHRlZAorICAgIC8vIGRhdGEsIHRoZSBmb2xsb3dpbmcgZmllbGRzIGFpZCBpbiBkZWNyeXB0aW9uLgorICAgIC8vIFRoZSBkYXRhIGNhbiBiZSB0aG91Z2h0IG9mIGFzIHBhaXJzIG9mIHBsYWluIGFuZCBlbmNyeXB0ZWQgZGF0YQorICAgIC8vIGZyYWdtZW50cywgaS5lLiBwbGFpbiBhbmQgZW5jcnlwdGVkIGRhdGEgYWx0ZXJuYXRlLgorICAgIC8vIFRoZSBmaXJzdCBmcmFnbWVudCBpcyBieSBjb252ZW50aW9uIHBsYWluIGRhdGEgKGlmIHRoYXQncyBub3QgdGhlCisgICAgLy8gY2FzZSwgc2ltcGx5IHNwZWNpZnkgcGxhaW4gZnJhZ21lbnQgc2l6ZSBvZiAwKS4KKyAgICAvLyBrS2V5RW5jcnlwdGVkU2l6ZXMgYW5kIGtLZXlQbGFpblNpemVzIGVhY2ggbWFwIHRvIGFuIGFycmF5IG9mCisgICAgLy8gc2l6ZV90IHZhbHVlcy4gVGhlIHN1bSB0b3RhbCBvZiBhbGwgc2l6ZV90IHZhbHVlcyBvZiBib3RoIGFycmF5cworICAgIC8vIG11c3QgZXF1YWwgdGhlIGFtb3VudCBvZiBkYXRhIChpLmUuIE1lZGlhQnVmZmVyJ3MgcmFuZ2VfbGVuZ3RoKCkpLgorICAgIC8vIElmIGJvdGggYXJyYXlzIGFyZSBwcmVzZW50LCB0aGV5IG11c3QgYmUgb2YgdGhlIHNhbWUgc2l6ZS4KKyAgICAvLyBJZiBvbmx5IGVuY3J5cHRlZCBzaXplcyBhcmUgcHJlc2VudCBpdCBpcyBhc3N1bWVkIHRoYXQgYWxsCisgICAgLy8gcGxhaW4gc2l6ZXMgYXJlIDAsIGkuZS4gYWxsIGZyYWdtZW50cyBhcmUgZW5jcnlwdGVkLgorICAgIC8vIFRvIHByb2dyYW1tYXRpY2FsbHkgc2V0IHRoZXNlIGFycmF5LCB1c2UgdGhlIE1ldGFEYXRhQmFzZTo6c2V0RGF0YSBBUEksIGkuZS4KKyAgICAvLyBjb25zdCBzaXplX3QgZW5jU2l6ZXNbXTsKKyAgICAvLyBtZXRhLT5zZXREYXRhKAorICAgIC8vICBrS2V5RW5jcnlwdGVkU2l6ZXMsIDAgLyogdHlwZSAqLywgZW5jU2l6ZXMsIHNpemVvZihlbmNTaXplcykpOworICAgIC8vIEEgcGxhaW4gc2l6ZXMgYXJyYXkgYnkgaXRzZWxmIG1ha2VzIG5vIHNlbnNlLgorICAgIGtLZXlFbmNyeXB0ZWRTaXplcyAgICA9ICdlbmNyJywgIC8vIHNpemVfdFtdCisgICAga0tleVBsYWluU2l6ZXMgICAgICAgID0gJ3BsYWknLCAgLy8gc2l6ZV90W10KKyAgICBrS2V5Q3J5cHRvS2V5ICAgICAgICAgPSAnY3J5SycsICAvLyB1aW50OF90WzE2XQorICAgIGtLZXlDcnlwdG9JViAgICAgICAgICA9ICdjcnlJJywgIC8vIHVpbnQ4X3RbMTZdCisgICAga0tleUNyeXB0b01vZGUgICAgICAgID0gJ2NyeU0nLCAgLy8gaW50MzJfdAorCisgICAga0tleUNyeXB0b0RlZmF1bHRJVlNpemUgPSAnY3J5UycsICAvLyBpbnQzMl90CisKKyAgICBrS2V5UHNzaCAgICAgICAgICAgICAgPSAncHNzaCcsICAvLyByYXcgZGF0YQorICAgIGtLZXlDQVN5c3RlbUlEICAgICAgICA9ICdjYWlkJywgIC8vIGludDMyX3QKKyAgICBrS2V5Q0FTZXNzaW9uSUQgICAgICAgPSAnc2VpZCcsICAvLyByYXcgZGF0YQorCisgICAga0tleUVuY3J5cHRlZEJ5dGVCbG9jayA9ICdjYmxrJywgIC8vIHVpbnQ4X3QKKyAgICBrS2V5U2tpcEJ5dGVCbG9jayAgICAgPSAnc2JsaycsICAvLyB1aW50OF90CisKKyAgICAvLyBQbGVhc2Ugc2VlIE1lZGlhRm9ybWF0LktFWV9JU19BVVRPU0VMRUNULgorICAgIGtLZXlUcmFja0lzQXV0b3NlbGVjdCA9ICdhdXRvJywgLy8gYm9vbCAoaW50MzJfdCkKKyAgICAvLyBQbGVhc2Ugc2VlIE1lZGlhRm9ybWF0LktFWV9JU19ERUZBVUxULgorICAgIGtLZXlUcmFja0lzRGVmYXVsdCAgICA9ICdkZmx0JywgLy8gYm9vbCAoaW50MzJfdCkKKyAgICAvLyBTaW1pbGFyIHRvIE1lZGlhRm9ybWF0LktFWV9JU19GT1JDRURfU1VCVElUTEUgYnV0IHBlcnRhaW5zIHRvIGF2IHRyYWNrcyBhcyB3ZWxsLgorICAgIGtLZXlUcmFja0lzRm9yY2VkICAgICA9ICdmcmNkJywgLy8gYm9vbCAoaW50MzJfdCkKKworICAgIC8vIEgyNjQgc3VwcGxlbWVudGFsIGVuaGFuY2VtZW50IGluZm9ybWF0aW9uIG9mZnNldHMvc2l6ZXMKKyAgICBrS2V5U0VJICAgICAgICAgICAgICAgPSAnc2VpICcsIC8vIHJhdyBkYXRhCisKKyAgICAvLyBNUEVHIHVzZXIgZGF0YSBvZmZzZXRzCisgICAga0tleU1wZWdVc2VyRGF0YSAgICAgID0gJ21wdWQnLCAvLyBzaXplX3RbXQorCisgICAgLy8gU2l6ZSBvZiBOQUxVIGxlbmd0aCBpbiBta3YvbXA0CisgICAga0tleU5hbExlbmd0aFNpemUgICAgID0gJ25hbHMnLCAvLyBpbnQzMl90CisKKyAgICAvLyBIRFIgcmVsYXRlZAorICAgIGtLZXlIZHJTdGF0aWNJbmZvICAgID0gJ2hkclMnLCAvLyBIRFJTdGF0aWNJbmZvCisKKyAgICAvLyBjb2xvciBhc3BlY3RzCisgICAga0tleUNvbG9yUmFuZ2UgICAgICAgPSAnY1JuZycsIC8vIGludDMyX3QsIGNvbG9yIHJhbmdlLCB2YWx1ZSBkZWZpbmVkIGJ5IENvbG9yQXNwZWN0cy5SYW5nZQorICAgIGtLZXlDb2xvclByaW1hcmllcyAgID0gJ2NQcm0nLCAvLyBpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xvciBQcmltYXJpZXMsIHZhbHVlIGRlZmluZWQgYnkgQ29sb3JBc3BlY3RzLlByaW1hcmllcworICAgIGtLZXlUcmFuc2ZlckZ1bmN0aW9uID0gJ3RGdW4nLCAvLyBpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cmFuc2ZlciBGdW5jdGlvbiwgdmFsdWUgZGVmaW5lZCBieSBDb2xvckFzcGVjdHMuVHJhbnNmZXIuCisgICAga0tleUNvbG9yTWF0cml4ICAgICAgPSAnY010eCcsIC8vIGludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbG9yIE1hdHJpeCwgdmFsdWUgZGVmaW5lZCBieSBDb2xvckFzcGVjdHMuTWF0cml4Q29lZmZzLgorICAgIGtLZXlUZW1wb3JhbExheWVySWQgID0gJ2lMeXInLCAvLyBpbnQzMl90LCB0ZW1wb3JhbCBsYXllci1pZC4gMC1iYXNlZCAoMCA9PiBiYXNlIGxheWVyKQorICAgIGtLZXlUZW1wb3JhbExheWVyQ291bnQgPSAnY0x5cicsIC8vIGludDMyX3QsIG51bWJlciBvZiB0ZW1wb3JhbCBsYXllcnMgZW5jb2RlZAorCisgICAga0tleVRpbGVXaWR0aCAgICAgICAgPSAndGlsVycsIC8vIGludDMyX3QsIEhFSUYgdGlsZSB3aWR0aAorICAgIGtLZXlUaWxlSGVpZ2h0ICAgICAgID0gJ3RpbEgnLCAvLyBpbnQzMl90LCBIRUlGIHRpbGUgaGVpZ2h0CisgICAga0tleUdyaWRSb3dzICAgICAgICAgPSAnZ3JkUicsIC8vIGludDMyX3QsIEhFSUYgZ3JpZCByb3dzCisgICAga0tleUdyaWRDb2xzICAgICAgICAgPSAnZ3JkQycsIC8vIGludDMyX3QsIEhFSUYgZ3JpZCBjb2x1bW5zCisgICAga0tleUljY1Byb2ZpbGUgICAgICAgPSAncHJvZicsIC8vIHJhdyBkYXRhLCBJQ0MgcHJvZmlsZSBkYXRhCisgICAga0tleUlzUHJpbWFyeUltYWdlICAgPSAncHJpbScsIC8vIGJvb2wgKGludDMyX3QpLCBpbWFnZSB0cmFjayBpcyB0aGUgcHJpbWFyeSBpbWFnZQorICAgIGtLZXlGcmFtZUNvdW50ICAgICAgID0gJ25mcm0nLCAvLyBpbnQzMl90LCB0b3RhbCBudW1iZXIgb2YgZnJhbWUgaW4gdmlkZW8gdHJhY2sKKyAgICBrS2V5RXhpZk9mZnNldCAgICAgICA9ICdleG9mJywgLy8gaW50NjRfdCwgRXhpZiBkYXRhIG9mZnNldAorICAgIGtLZXlFeGlmU2l6ZSAgICAgICAgID0gJ2V4c3onLCAvLyBpbnQ2NF90LCBFeGlmIGRhdGEgc2l6ZQorICAgIGtLZXlJc0V4aWYgICAgICAgICAgID0gJ2V4aWYnLCAvLyBib29sIChpbnQzMl90KSBidWZmZXIgY29udGFpbnMgZXhpZiBkYXRhIGJsb2NrCit9OworCitlbnVtIHsKKyAgICBrVHlwZUVTRFMgICAgICAgID0gJ2VzZHMnLAorICAgIGtUeXBlQVZDQyAgICAgICAgPSAnYXZjYycsCisgICAga1R5cGVIVkNDICAgICAgICA9ICdodmNjJywKKyAgICBrVHlwZUQyNjMgICAgICAgID0gJ2QyNjMnLAorfTsKKworZW51bSB7CisgICAga0NyeXB0b01vZGVVbmVuY3J5cHRlZCA9IDAsCisgICAga0NyeXB0b01vZGVBZXNDdHIgICAgICA9IDEsCisgICAga0NyeXB0b01vZGVBZXNDYmMgICAgICA9IDIsCit9OworCitjbGFzcyBQYXJjZWw7CisKK2NsYXNzIE1ldGFEYXRhQmFzZSB7CitwdWJsaWM6CisgICAgTWV0YURhdGFCYXNlKCk7CisgICAgTWV0YURhdGFCYXNlKGNvbnN0IE1ldGFEYXRhQmFzZSAmZnJvbSk7CisgICAgTWV0YURhdGFCYXNlJiBvcGVyYXRvciA9IChjb25zdCBNZXRhRGF0YUJhc2UgJik7CisKKyAgICB2aXJ0dWFsIH5NZXRhRGF0YUJhc2UoKTsKKworICAgIGVudW0gVHlwZSB7CisgICAgICAgIFRZUEVfTk9ORSAgICAgPSAnbm9uZScsCisgICAgICAgIFRZUEVfQ19TVFJJTkcgPSAnY3N0cicsCisgICAgICAgIFRZUEVfSU5UMzIgICAgPSAnaW4zMicsCisgICAgICAgIFRZUEVfSU5UNjQgICAgPSAnaW42NCcsCisgICAgICAgIFRZUEVfRkxPQVQgICAgPSAnZmxvYScsCisgICAgICAgIFRZUEVfUE9JTlRFUiAgPSAncHRyICcsCisgICAgICAgIFRZUEVfUkVDVCAgICAgPSAncmVjdCcsCisgICAgfTsKKworICAgIHZvaWQgY2xlYXIoKTsKKyAgICBib29sIHJlbW92ZSh1aW50MzJfdCBrZXkpOworCisgICAgYm9vbCBzZXRDU3RyaW5nKHVpbnQzMl90IGtleSwgY29uc3QgY2hhciAqdmFsdWUpOworICAgIGJvb2wgc2V0SW50MzIodWludDMyX3Qga2V5LCBpbnQzMl90IHZhbHVlKTsKKyAgICBib29sIHNldEludDY0KHVpbnQzMl90IGtleSwgaW50NjRfdCB2YWx1ZSk7CisgICAgYm9vbCBzZXRGbG9hdCh1aW50MzJfdCBrZXksIGZsb2F0IHZhbHVlKTsKKyAgICBib29sIHNldFBvaW50ZXIodWludDMyX3Qga2V5LCB2b2lkICp2YWx1ZSk7CisKKyAgICBib29sIHNldFJlY3QoCisgICAgICAgICAgICB1aW50MzJfdCBrZXksCisgICAgICAgICAgICBpbnQzMl90IGxlZnQsIGludDMyX3QgdG9wLAorICAgICAgICAgICAgaW50MzJfdCByaWdodCwgaW50MzJfdCBib3R0b20pOworCisgICAgYm9vbCBmaW5kQ1N0cmluZyh1aW50MzJfdCBrZXksIGNvbnN0IGNoYXIgKip2YWx1ZSkgY29uc3Q7CisgICAgYm9vbCBmaW5kSW50MzIodWludDMyX3Qga2V5LCBpbnQzMl90ICp2YWx1ZSkgY29uc3Q7CisgICAgYm9vbCBmaW5kSW50NjQodWludDMyX3Qga2V5LCBpbnQ2NF90ICp2YWx1ZSkgY29uc3Q7CisgICAgYm9vbCBmaW5kRmxvYXQodWludDMyX3Qga2V5LCBmbG9hdCAqdmFsdWUpIGNvbnN0OworICAgIGJvb2wgZmluZFBvaW50ZXIodWludDMyX3Qga2V5LCB2b2lkICoqdmFsdWUpIGNvbnN0OworCisgICAgYm9vbCBmaW5kUmVjdCgKKyAgICAgICAgICAgIHVpbnQzMl90IGtleSwKKyAgICAgICAgICAgIGludDMyX3QgKmxlZnQsIGludDMyX3QgKnRvcCwKKyAgICAgICAgICAgIGludDMyX3QgKnJpZ2h0LCBpbnQzMl90ICpib3R0b20pIGNvbnN0OworCisgICAgYm9vbCBzZXREYXRhKHVpbnQzMl90IGtleSwgdWludDMyX3QgdHlwZSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgICAgYm9vbCBmaW5kRGF0YSh1aW50MzJfdCBrZXksIHVpbnQzMl90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqKmRhdGEsIHNpemVfdCAqc2l6ZSkgY29uc3Q7CisKKyAgICBib29sIGhhc0RhdGEodWludDMyX3Qga2V5KSBjb25zdDsKKworICAgIFN0cmluZzggdG9TdHJpbmcoKSBjb25zdDsKKyAgICB2b2lkIGR1bXBUb0xvZygpIGNvbnN0OworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBCcE1lZGlhU291cmNlOworICAgIGZyaWVuZCBjbGFzcyBCbk1lZGlhU291cmNlOworICAgIGZyaWVuZCBjbGFzcyBCbk1lZGlhRXh0cmFjdG9yOworICAgIGZyaWVuZCBjbGFzcyBNZXRhRGF0YTsKKworICAgIHN0cnVjdCB0eXBlZF9kYXRhOworICAgIHN0cnVjdCBSZWN0OworICAgIHN0cnVjdCBNZXRhRGF0YUludGVybmFsOworICAgIE1ldGFEYXRhSW50ZXJuYWwgKm1JbnRlcm5hbERhdGE7CisgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwgJnBhcmNlbCk7CisgICAgc3RhdHVzX3QgdXBkYXRlRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgJnBhcmNlbCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1FVEFfREFUQV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvQW5kcm9pZC5icAppbmRleCAxNWRhYzU5Li4wN2UxMjRiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvQW5kcm9pZC5icApAQCAtMSw0ICsxLDYgQEAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKKy8vIFRPRE86IGNoYW5nZSBpdCBiYWNrIHRvIGNjX2xpYnJhcnlfc2hhcmVkIHdoZW4gdGhlcmUgaXMgYSB3YXkgdG8KKy8vIGV4cG9zZSBtZWRpYSBtZXRyaWNzIGFzIHN0YWJsZSBBUEkuCitjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlibWVkaWFtZXRyaWNzIiwKIAogICAgIHNyY3M6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9NZWRpYUFuYWx5dGljc0l0ZW0uY3BwIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL01lZGlhQW5hbHl0aWNzSXRlbS5jcHAKaW5kZXggZjk2OGMwOS4uMTM1YzliNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL01lZGlhQW5hbHl0aWNzSXRlbS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL01lZGlhQW5hbHl0aWNzSXRlbS5jcHAKQEAgLTI5LDggKzI5LDYgQEAKICNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAKLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KLQogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFBbmFseXRpY3NJdGVtLmg+CkBAIC02Miw3ICs2MCw3IEBACiAgICAgICBtUGtnVmVyc2lvbkNvZGUoMCksCiAgICAgICBtU2Vzc2lvbklEKE1lZGlhQW5hbHl0aWNzSXRlbTo6U2Vzc2lvbklETm9uZSksCiAgICAgICBtVGltZXN0YW1wKDApLAotICAgICAgbUZpbmFsaXplZCgwKSwKKyAgICAgIG1GaW5hbGl6ZWQoMSksCiAgICAgICBtUHJvcENvdW50KDApLCBtUHJvcFNpemUoMCksIG1Qcm9wcyhOVUxMKQogewogICAgIG1LZXkgPSBNZWRpYUFuYWx5dGljc0l0ZW06OmtLZXlOb25lOwpAQCAtNzQsNyArNzIsNyBAQAogICAgICAgbVBrZ1ZlcnNpb25Db2RlKDApLAogICAgICAgbVNlc3Npb25JRChNZWRpYUFuYWx5dGljc0l0ZW06OlNlc3Npb25JRE5vbmUpLAogICAgICAgbVRpbWVzdGFtcCgwKSwKLSAgICAgIG1GaW5hbGl6ZWQoMCksCisgICAgICBtRmluYWxpemVkKDEpLAogICAgICAgbVByb3BDb3VudCgwKSwgbVByb3BTaXplKDApLCBtUHJvcHMoTlVMTCkKIHsKICAgICBpZiAoREVCVUdfQUxMT0NBVElPTlMpIHsKQEAgLTEzOSwxNiArMTM3LDYgQEAKICAgICByZXR1cm4gZHN0OwogfQogCi0vLyBzbyBjbGllbnRzIGNhbiBzZW5kIGludGVybWVkaWF0ZSB2YWx1ZXMgdG8gYmUgb3ZlcmxhaWQgbGF0ZXIKLU1lZGlhQW5hbHl0aWNzSXRlbSAmTWVkaWFBbmFseXRpY3NJdGVtOjpzZXRGaW5hbGl6ZWQoYm9vbCB2YWx1ZSkgewotICAgIG1GaW5hbGl6ZWQgPSB2YWx1ZTsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLWJvb2wgTWVkaWFBbmFseXRpY3NJdGVtOjpnZXRGaW5hbGl6ZWQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1GaW5hbGl6ZWQ7Ci19Ci0KIE1lZGlhQW5hbHl0aWNzSXRlbSAmTWVkaWFBbmFseXRpY3NJdGVtOjpzZXRTZXNzaW9uSUQoTWVkaWFBbmFseXRpY3NJdGVtOjpTZXNzaW9uSURfdCBpZCkgewogICAgIG1TZXNzaW9uSUQgPSBpZDsKICAgICByZXR1cm4gKnRoaXM7CkBAIC0yMDUsMjEgKzE5MywxNyBAQAogICAgIHJldHVybiBtVWlkOwogfQogCi1NZWRpYUFuYWx5dGljc0l0ZW0gJk1lZGlhQW5hbHl0aWNzSXRlbTo6c2V0UGtnTmFtZShBU3RyaW5nIHBrZ05hbWUpIHsKK01lZGlhQW5hbHl0aWNzSXRlbSAmTWVkaWFBbmFseXRpY3NJdGVtOjpzZXRQa2dOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nICZwa2dOYW1lKSB7CiAgICAgbVBrZ05hbWUgPSBwa2dOYW1lOwogICAgIHJldHVybiAqdGhpczsKIH0KIAotQVN0cmluZyBNZWRpYUFuYWx5dGljc0l0ZW06OmdldFBrZ05hbWUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Qa2dOYW1lOwotfQotCi1NZWRpYUFuYWx5dGljc0l0ZW0gJk1lZGlhQW5hbHl0aWNzSXRlbTo6c2V0UGtnVmVyc2lvbkNvZGUoaW50MzJfdCBwa2dWZXJzaW9uQ29kZSkgeworTWVkaWFBbmFseXRpY3NJdGVtICZNZWRpYUFuYWx5dGljc0l0ZW06OnNldFBrZ1ZlcnNpb25Db2RlKGludDY0X3QgcGtnVmVyc2lvbkNvZGUpIHsKICAgICBtUGtnVmVyc2lvbkNvZGUgPSBwa2dWZXJzaW9uQ29kZTsKICAgICByZXR1cm4gKnRoaXM7CiB9CiAKLWludDMyX3QgTWVkaWFBbmFseXRpY3NJdGVtOjpnZXRQa2dWZXJzaW9uQ29kZSgpIGNvbnN0IHsKK2ludDY0X3QgTWVkaWFBbmFseXRpY3NJdGVtOjpnZXRQa2dWZXJzaW9uQ29kZSgpIGNvbnN0IHsKICAgICByZXR1cm4gbVBrZ1ZlcnNpb25Db2RlOwogfQogCkBAIC0yNjQsMTIgKzI0OCwxNyBAQAogfQogCiB2b2lkIE1lZGlhQW5hbHl0aWNzSXRlbTo6UHJvcDo6c2V0TmFtZShjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbGVuKSB7Ci0gICAgbU5hbWVMZW4gPSBsZW47CisgICAgZnJlZSgodm9pZCAqKW1OYW1lKTsKICAgICBtTmFtZSA9IChjb25zdCBjaGFyICopIG1hbGxvYyhsZW4rMSk7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtTmFtZSA9PSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZCBtYWxsb2MoKSBmb3IgcHJvcGVydHkgJyVzJyAobGVuICV6dSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgbGVuKTsKICAgICBtZW1jcHkgKCh2b2lkICopbU5hbWUsIG5hbWUsIGxlbisxKTsKKyAgICBtTmFtZUxlbiA9IGxlbjsKIH0KIAotLy8gdXNlZCBvbmx5IGFzIHBhcnQgb2YgYSBzdG9yaW5nIG9wZXJhdGlvbgorLy8gY29uc2lkZXIgdGhpcyAiZmluZC1vci1hbGxvY2F0ZSIuCisvLyBjYWxsZXIgdmFsaWRhdGVzIHR5cGUgYW5kIHVzZXMgY2xlYXJQcm9wVmFsdWUoKSBhY2NvcmRpbmdseQogTWVkaWFBbmFseXRpY3NJdGVtOjpQcm9wICpNZWRpYUFuYWx5dGljc0l0ZW06OmFsbG9jYXRlUHJvcChjb25zdCBjaGFyICpuYW1lKSB7CiAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihuYW1lKTsKICAgICBzaXplX3QgaSA9IGZpbmRQcm9wSW5kZXgobmFtZSwgbGVuKTsKQEAgLTI3OSwxMyArMjY4LDE0IEBACiAgICAgICAgIHByb3AgPSAmbVByb3BzW2ldOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChpID09IG1Qcm9wU2l6ZSkgewotICAgICAgICAgICAgZ3Jvd1Byb3BzKCk7Ci0gICAgICAgICAgICAvLyBYWFg6IHZlcmlmeSBzdWNjZXNzCisgICAgICAgICAgICBpZiAoZ3Jvd1Byb3BzKCkgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIGFsbG9jYXRpb24gZm9yIG5ldyBwcm9wcyIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGkgPSBtUHJvcENvdW50Kys7CiAgICAgICAgIHByb3AgPSAmbVByb3BzW2ldOwogICAgICAgICBwcm9wLT5zZXROYW1lKG5hbWUsIGxlbik7Ci0gICAgICAgIHByb3AtPm1UeXBlID0ga1R5cGVOb25lOyAgICAgICAgLy8gbWFrZSBjYWxsZXIgc2V0IHR5cGUgaW5mbwogICAgIH0KIAogICAgIHJldHVybiBwcm9wOwpAQCAtMzEyLDQxICszMDIsNTkgQEAKIC8vIHNldCB0aGUgdmFsdWVzCiB2b2lkIE1lZGlhQW5hbHl0aWNzSXRlbTo6c2V0SW50MzIoTWVkaWFBbmFseXRpY3NJdGVtOjpBdHRyIG5hbWUsIGludDMyX3QgdmFsdWUpIHsKICAgICBQcm9wICpwcm9wID0gYWxsb2NhdGVQcm9wKG5hbWUpOwotICAgIHByb3AtPm1UeXBlID0ga1R5cGVJbnQzMjsKLSAgICBwcm9wLT51LmludDMyVmFsdWUgPSB2YWx1ZTsKKyAgICBpZiAocHJvcCAhPSBOVUxMKSB7CisgICAgICAgIGNsZWFyUHJvcFZhbHVlKHByb3ApOworICAgICAgICBwcm9wLT5tVHlwZSA9IGtUeXBlSW50MzI7CisgICAgICAgIHByb3AtPnUuaW50MzJWYWx1ZSA9IHZhbHVlOworICAgIH0KIH0KIAogdm9pZCBNZWRpYUFuYWx5dGljc0l0ZW06OnNldEludDY0KE1lZGlhQW5hbHl0aWNzSXRlbTo6QXR0ciBuYW1lLCBpbnQ2NF90IHZhbHVlKSB7CiAgICAgUHJvcCAqcHJvcCA9IGFsbG9jYXRlUHJvcChuYW1lKTsKLSAgICBwcm9wLT5tVHlwZSA9IGtUeXBlSW50NjQ7Ci0gICAgcHJvcC0+dS5pbnQ2NFZhbHVlID0gdmFsdWU7CisgICAgaWYgKHByb3AgIT0gTlVMTCkgeworICAgICAgICBjbGVhclByb3BWYWx1ZShwcm9wKTsKKyAgICAgICAgcHJvcC0+bVR5cGUgPSBrVHlwZUludDY0OworICAgICAgICBwcm9wLT51LmludDY0VmFsdWUgPSB2YWx1ZTsKKyAgICB9CiB9CiAKIHZvaWQgTWVkaWFBbmFseXRpY3NJdGVtOjpzZXREb3VibGUoTWVkaWFBbmFseXRpY3NJdGVtOjpBdHRyIG5hbWUsIGRvdWJsZSB2YWx1ZSkgewogICAgIFByb3AgKnByb3AgPSBhbGxvY2F0ZVByb3AobmFtZSk7Ci0gICAgcHJvcC0+bVR5cGUgPSBrVHlwZURvdWJsZTsKLSAgICBwcm9wLT51LmRvdWJsZVZhbHVlID0gdmFsdWU7CisgICAgaWYgKHByb3AgIT0gTlVMTCkgeworICAgICAgICBjbGVhclByb3BWYWx1ZShwcm9wKTsKKyAgICAgICAgcHJvcC0+bVR5cGUgPSBrVHlwZURvdWJsZTsKKyAgICAgICAgcHJvcC0+dS5kb3VibGVWYWx1ZSA9IHZhbHVlOworICAgIH0KIH0KIAogdm9pZCBNZWRpYUFuYWx5dGljc0l0ZW06OnNldENTdHJpbmcoTWVkaWFBbmFseXRpY3NJdGVtOjpBdHRyIG5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKSB7CiAKICAgICBQcm9wICpwcm9wID0gYWxsb2NhdGVQcm9wKG5hbWUpOwogICAgIC8vIGFueSBvbGQgdmFsdWUgd2lsbCBiZSBnb25lCi0gICAgcHJvcC0+bVR5cGUgPSBrVHlwZUNTdHJpbmc7Ci0gICAgcHJvcC0+dS5DU3RyaW5nVmFsdWUgPSBzdHJkdXAodmFsdWUpOworICAgIGlmIChwcm9wICE9IE5VTEwpIHsKKyAgICAgICAgY2xlYXJQcm9wVmFsdWUocHJvcCk7CisgICAgICAgIHByb3AtPm1UeXBlID0ga1R5cGVDU3RyaW5nOworICAgICAgICBwcm9wLT51LkNTdHJpbmdWYWx1ZSA9IHN0cmR1cCh2YWx1ZSk7CisgICAgfQogfQogCiB2b2lkIE1lZGlhQW5hbHl0aWNzSXRlbTo6c2V0UmF0ZShNZWRpYUFuYWx5dGljc0l0ZW06OkF0dHIgbmFtZSwgaW50NjRfdCBjb3VudCwgaW50NjRfdCBkdXJhdGlvbikgewogICAgIFByb3AgKnByb3AgPSBhbGxvY2F0ZVByb3AobmFtZSk7Ci0gICAgcHJvcC0+bVR5cGUgPSBrVHlwZVJhdGU7Ci0gICAgcHJvcC0+dS5yYXRlLmNvdW50ID0gY291bnQ7Ci0gICAgcHJvcC0+dS5yYXRlLmR1cmF0aW9uID0gZHVyYXRpb247CisgICAgaWYgKHByb3AgIT0gTlVMTCkgeworICAgICAgICBjbGVhclByb3BWYWx1ZShwcm9wKTsKKyAgICAgICAgcHJvcC0+bVR5cGUgPSBrVHlwZVJhdGU7CisgICAgICAgIHByb3AtPnUucmF0ZS5jb3VudCA9IGNvdW50OworICAgICAgICBwcm9wLT51LnJhdGUuZHVyYXRpb24gPSBkdXJhdGlvbjsKKyAgICB9CiB9CiAKIAogLy8gZmluZC9hZGQvc2V0IGZ1c2VkIGludG8gYSBzaW5nbGUgb3BlcmF0aW9uCiB2b2lkIE1lZGlhQW5hbHl0aWNzSXRlbTo6YWRkSW50MzIoTWVkaWFBbmFseXRpY3NJdGVtOjpBdHRyIG5hbWUsIGludDMyX3QgdmFsdWUpIHsKICAgICBQcm9wICpwcm9wID0gYWxsb2NhdGVQcm9wKG5hbWUpOworICAgIGlmIChwcm9wID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBzd2l0Y2ggKHByb3AtPm1UeXBlKSB7CiAgICAgICAgIGNhc2Uga1R5cGVJbnQzMjoKICAgICAgICAgICAgIHByb3AtPnUuaW50MzJWYWx1ZSArPSB2YWx1ZTsKQEAgLTM2MSw2ICszNjksOSBAQAogCiB2b2lkIE1lZGlhQW5hbHl0aWNzSXRlbTo6YWRkSW50NjQoTWVkaWFBbmFseXRpY3NJdGVtOjpBdHRyIG5hbWUsIGludDY0X3QgdmFsdWUpIHsKICAgICBQcm9wICpwcm9wID0gYWxsb2NhdGVQcm9wKG5hbWUpOworICAgIGlmIChwcm9wID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBzd2l0Y2ggKHByb3AtPm1UeXBlKSB7CiAgICAgICAgIGNhc2Uga1R5cGVJbnQ2NDoKICAgICAgICAgICAgIHByb3AtPnUuaW50NjRWYWx1ZSArPSB2YWx1ZTsKQEAgLTM3NSw2ICszODYsOSBAQAogCiB2b2lkIE1lZGlhQW5hbHl0aWNzSXRlbTo6YWRkUmF0ZShNZWRpYUFuYWx5dGljc0l0ZW06OkF0dHIgbmFtZSwgaW50NjRfdCBjb3VudCwgaW50NjRfdCBkdXJhdGlvbikgewogICAgIFByb3AgKnByb3AgPSBhbGxvY2F0ZVByb3AobmFtZSk7CisgICAgaWYgKHByb3AgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQogICAgIHN3aXRjaCAocHJvcC0+bVR5cGUpIHsKICAgICAgICAgY2FzZSBrVHlwZVJhdGU6CiAgICAgICAgICAgICBwcm9wLT51LnJhdGUuY291bnQgKz0gY291bnQ7CkBAIC0zOTEsNiArNDA1LDkgQEAKIAogdm9pZCBNZWRpYUFuYWx5dGljc0l0ZW06OmFkZERvdWJsZShNZWRpYUFuYWx5dGljc0l0ZW06OkF0dHIgbmFtZSwgZG91YmxlIHZhbHVlKSB7CiAgICAgUHJvcCAqcHJvcCA9IGFsbG9jYXRlUHJvcChuYW1lKTsKKyAgICBpZiAocHJvcCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAgICAgc3dpdGNoIChwcm9wLT5tVHlwZSkgewogICAgICAgICBjYXNlIGtUeXBlRG91YmxlOgogICAgICAgICAgICAgcHJvcC0+dS5kb3VibGVWYWx1ZSArPSB2YWx1ZTsKQEAgLTU3Nyw2ICs1OTQsOSBAQAogICAgIC8vIGZpeCBhbnkgcG9pbnRlcnMgdGhhdCB3ZSBibGluZGx5IGNvcGllZCwgc28gd2UgaGF2ZSBvdXIgb3duIGNvcGllcwogICAgIGlmIChkc3QtPm1OYW1lKSB7CiAgICAgICAgIHZvaWQgKnAgPSAgbWFsbG9jKGRzdC0+bU5hbWVMZW4gKyAxKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihwID09IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZCBtYWxsb2MoKSBkdXBpbmcgcHJvcGVydHkgJyVzJyAobGVuICV6dSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdC0+bU5hbWUsIGRzdC0+bU5hbWVMZW4pOwogICAgICAgICBtZW1jcHkgKHAsIHNyYy0+bU5hbWUsIGRzdC0+bU5hbWVMZW4gKyAxKTsKICAgICAgICAgZHN0LT5tTmFtZSA9IChjb25zdCBjaGFyICopIHA7CiAgICAgfQpAQCAtNTg1LDcgKzYwNSw3IEBACiAgICAgfQogfQogCi12b2lkIE1lZGlhQW5hbHl0aWNzSXRlbTo6Z3Jvd1Byb3BzKGludCBpbmNyZW1lbnQpCitib29sIE1lZGlhQW5hbHl0aWNzSXRlbTo6Z3Jvd1Byb3BzKGludCBpbmNyZW1lbnQpCiB7CiAgICAgaWYgKGluY3JlbWVudCA8PSAwKSB7CiAgICAgICAgIGluY3JlbWVudCA9IGtHcm93UHJvcHM7CkBAIC01OTksNiArNjE5LDEwIEBACiAgICAgICAgIH0KICAgICAgICAgbVByb3BzID0gbmk7CiAgICAgICAgIG1Qcm9wU2l6ZSA9IG5zaXplOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVygiTWVkaWFBbmFseXRpY3NJdGVtOjpncm93UHJvcHMgZmFpbHMiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIH0KIApAQCAtNjEyLDkgKzYzNiwxMiBAQAogICAgIG1QaWQgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgIG1VaWQgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgIG1Qa2dOYW1lID0gZGF0YS5yZWFkQ1N0cmluZygpOwotICAgIG1Qa2dWZXJzaW9uQ29kZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgbVBrZ1ZlcnNpb25Db2RlID0gZGF0YS5yZWFkSW50NjQoKTsKICAgICBtU2Vzc2lvbklEID0gZGF0YS5yZWFkSW50NjQoKTsKKyAgICAvLyBXZSBubyBsb25nZXIgcGF5IGF0dGVudGlvbiB0byB1c2VyIHNldHRpbmcgb2YgZmluYWxpemVkLCBCVVQgaXQncworICAgIC8vIHN0aWxsIHBhcnQgb2YgdGhlIHdpcmUgcGFja2V0IC0tIHNvIHJlYWQgJiBkaXNjYXJkLgogICAgIG1GaW5hbGl6ZWQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgIG1GaW5hbGl6ZWQgPSAxOwogICAgIG1UaW1lc3RhbXAgPSBkYXRhLnJlYWRJbnQ2NCgpOwogCiAgICAgaW50IGNvdW50ID0gZGF0YS5yZWFkSW50MzIoKTsKQEAgLTY1OSw3ICs2ODYsNyBAQAogICAgIGRhdGEtPndyaXRlSW50MzIobVBpZCk7CiAgICAgZGF0YS0+d3JpdGVJbnQzMihtVWlkKTsKICAgICBkYXRhLT53cml0ZUNTdHJpbmcobVBrZ05hbWUuY19zdHIoKSk7Ci0gICAgZGF0YS0+d3JpdGVJbnQzMihtUGtnVmVyc2lvbkNvZGUpOworICAgIGRhdGEtPndyaXRlSW50NjQobVBrZ1ZlcnNpb25Db2RlKTsKICAgICBkYXRhLT53cml0ZUludDY0KG1TZXNzaW9uSUQpOwogICAgIGRhdGEtPndyaXRlSW50MzIobUZpbmFsaXplZCk7CiAgICAgZGF0YS0+d3JpdGVJbnQ2NChtVGltZXN0YW1wKTsKQEAgLTY5OSwxMSArNzI2LDExIEBACiB9CiAKIAotQVN0cmluZyBNZWRpYUFuYWx5dGljc0l0ZW06OnRvU3RyaW5nKCkgewotICAgcmV0dXJuIHRvU3RyaW5nKC0xKTsKK3N0ZDo6c3RyaW5nIE1lZGlhQW5hbHl0aWNzSXRlbTo6dG9TdHJpbmcoKSB7CisgICByZXR1cm4gdG9TdHJpbmcoUFJPVE9fTEFTVCk7CiB9CiAKLUFTdHJpbmcgTWVkaWFBbmFseXRpY3NJdGVtOjp0b1N0cmluZyhpbnQgdmVyc2lvbikgeworc3RkOjpzdHJpbmcgTWVkaWFBbmFseXRpY3NJdGVtOjp0b1N0cmluZyhpbnQgdmVyc2lvbikgewogCiAgICAgLy8gdjAgOiByZWxlYXNlZCB3aXRoICdvJwogICAgIC8vIHYxIDogYnVnIGZpeCAobWlzc2luZyBwaWQvZmluYWxpemVkIHNlcGFyYXRvciksCkBAIC03MTYsNyArNzQzLDcgQEAKICAgICAgICAgdmVyc2lvbiA9IFBST1RPX0xBU1Q7CiAgICAgfQogCi0gICAgQVN0cmluZyByZXN1bHQ7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OwogICAgIGNoYXIgYnVmZmVyWzUxMl07CiAKICAgICBpZiAodmVyc2lvbiA9PSBQUk9UT19WMCkgewpAQCAtNzM4LDcgKzc2NSw3IEBACiAKICAgICBpZiAodmVyc2lvbiA+PSBQUk9UT19WMSkgewogICAgICAgICByZXN1bHQuYXBwZW5kKG1Qa2dOYW1lKTsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIjolZDoiLCBtUGtnVmVyc2lvbkNvZGUpOworICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiOiUiICBQUklkNjQgIjoiLCBtUGtnVmVyc2lvbkNvZGUpOwogICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgfQogCkBAIC04MTMsNyArODQwLDcgQEAKIGJvb2wgTWVkaWFBbmFseXRpY3NJdGVtOjpzZWxmcmVjb3JkKGJvb2wgZm9yY2VuZXcpIHsKIAogICAgIGlmIChERUJVR19BUEkpIHsKLSAgICAgICAgQVN0cmluZyBwID0gdGhpcy0+dG9TdHJpbmcoKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgcCA9IHRoaXMtPnRvU3RyaW5nKCk7CiAgICAgICAgIEFMT0dEKCJzZWxmcmVjb3JkIG9mOiAlcyBbZm9yY2VuZXc9JWRdIiwgcC5jX3N0cigpLCBmb3JjZW5ldyk7CiAgICAgfQogCkBAIC04MjIsMTMgKzg0OSwxMyBAQAogICAgIGlmIChzdmMgIT0gTlVMTCkgewogICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW06OlNlc3Npb25JRF90IG5ld2lkID0gc3ZjLT5zdWJtaXQodGhpcywgZm9yY2VuZXcpOwogICAgICAgICBpZiAobmV3aWQgPT0gU2Vzc2lvbklESW52YWxpZCkgewotICAgICAgICAgICAgQVN0cmluZyBwID0gdGhpcy0+dG9TdHJpbmcoKTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHAgPSB0aGlzLT50b1N0cmluZygpOwogICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byByZWNvcmQ6ICVzIFtmb3JjZW5ldz0lZF0iLCBwLmNfc3RyKCksIGZvcmNlbmV3KTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9IGVsc2UgewotICAgICAgICBBU3RyaW5nIHAgPSB0aGlzLT50b1N0cmluZygpOworICAgICAgICBzdGQ6OnN0cmluZyBwID0gdGhpcy0+dG9TdHJpbmcoKTsKICAgICAgICAgQUxPR1coIlVuYWJsZSB0byByZWNvcmQ6ICVzIFtmb3JjZW5ldz0lZF0iLCBwLmNfc3RyKCksIGZvcmNlbmV3KTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTk1NiwzOSArOTgzLDMwIEBACiAgICAgICAgIG1TZXNzaW9uSUQgPSBpbmNvbWluZy0+bVNlc3Npb25JRDsKICAgICB9CiAKLSAgICAvLyB3ZSBhbHdheXMgdGFrZSB0aGUgbW9yZSByZWNlbnQgJ2ZpbmFsaXplZCcgdmFsdWUKLSAgICBzZXRGaW5hbGl6ZWQoaW5jb21pbmctPmdldEZpbmFsaXplZCgpKTsKLQogICAgIC8vIGZvciBlYWNoIGF0dHJpYnV0ZSBmcm9tICdpbmNvbWluZycsIHJlc29sdmUgYXBwcm9wcmlhdGVseQogICAgIGludCBuYXR0ciA9IGluY29taW5nLT5tUHJvcENvdW50OwogICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IG5hdHRyOyBpKysgKSB7CiAgICAgICAgIFByb3AgKmlwcm9wID0gJmluY29taW5nLT5tUHJvcHNbaV07Ci0gICAgICAgIFByb3AgKm9wcm9wID0gZmluZFByb3AoaXByb3AtPm1OYW1lKTsKICAgICAgICAgY29uc3QgY2hhciAqcCA9IGlwcm9wLT5tTmFtZTsKICAgICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihwKTsKLSAgICAgICAgY2hhciBzZW1hbnRpYyA9IHBbbGVuLTFdOworCisgICAgICAgIC8vIHNob3VsZCBpZ25vcmUgYSB6ZXJvIGxlbmd0aCBuYW1lLi4uCisgICAgICAgIGlmIChsZW4gPT0gMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBQcm9wICpvcHJvcCA9IGZpbmRQcm9wKGlwcm9wLT5tTmFtZSk7CiAKICAgICAgICAgaWYgKG9wcm9wID09IE5VTEwpIHsKICAgICAgICAgICAgIC8vIG5vIG9wcm9wLCBzbyB3ZSBpbnNlcnQgdGhlIG5ldyBvbmUKICAgICAgICAgICAgIG9wcm9wID0gYWxsb2NhdGVQcm9wKHApOwotICAgICAgICAgICAgY29weVByb3Aob3Byb3AsIGlwcm9wKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIG1lcmdlIGlwcm9wIGludG8gb3Byb3AKLSAgICAgICAgICAgIHN3aXRjaCAoc2VtYW50aWMpIHsKLSAgICAgICAgICAgICAgICBjYXNlICc8JzogICAgICAgLy8gZmlyc3QgIGFrYSBrZWVwIG9sZCkKLSAgICAgICAgICAgICAgICAgICAgLyogbm9wICovCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDogICAgICAgIC8vIGRlZmF1bHQgaXMgJ2xhc3QnCi0gICAgICAgICAgICAgICAgY2FzZSAnPic6ICAgICAgIC8vIGxhc3QgKGFrYSBrZWVwIG5ldykKLSAgICAgICAgICAgICAgICAgICAgY29weVByb3Aob3Byb3AsIGlwcm9wKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICcrJzogICAgICAgLyogc3VtICovCi0gICAgICAgICAgICAgICAgICAgIC8vIFhYWCB2YWxpZGF0ZSBudW1lcmljIHR5cGVzLCBzdW0gaW4gcGxhY2UKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KKyAgICAgICAgICAgIGlmIChvcHJvcCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgY29weVByb3Aob3Byb3AsIGlwcm9wKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coImRyb3BwZWQgcHJvcGVydHkgJyVzJyIsIGlwcm9wLT5tTmFtZSk7CiAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb3B5UHJvcChvcHJvcCwgaXByb3ApOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvaW5jbHVkZS9NZWRpYUFuYWx5dGljc0l0ZW0uaCBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9pbmNsdWRlL01lZGlhQW5hbHl0aWNzSXRlbS5oCmluZGV4IGRkNzQ1MmYuLjI2M2NkZTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9pbmNsdWRlL01lZGlhQW5hbHl0aWNzSXRlbS5oCisrKyBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9pbmNsdWRlL01lZGlhQW5hbHl0aWNzSXRlbS5oCkBAIC0xOCw2ICsxOCw3IEBACiAjZGVmaW5lIEFORFJPSURfTUVESUFfTUVESUFBTkFMWVRJQ1NJVEVNX0gKIAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CkBAIC0yNSwxMyArMjYsMTAgQEAKICNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CiAjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CiAKLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCi0KLQogY2xhc3MgSU1lZGlhQW5hbHl0aWNzU2VydmljZTsKK2NsYXNzIFBhcmNlbDsKIAogLy8gdGhlIGNsYXNzIGludGVyZmFjZQogLy8KQEAgLTY2LDcgKzY0LDcgQEAKICAgICAgICAgLy8gdmFsdWVzIGNhbiBiZSAiY29tcG9uZW50L2NvbXBvbmVudCIKICAgICAgICAgLy8gYmFzaWMgdmFsdWVzOiAidmlkZW8iLCAiYXVkaW8iLCAiZHJtIgogICAgICAgICAvLyBYWFg6IG5lZWQgdG8gYmV0dGVyIGRlZmluZSB0aGUgZm9ybWF0Ci0gICAgICAgIHR5cGVkZWYgQVN0cmluZyBLZXk7CisgICAgICAgIHR5cGVkZWYgc3RkOjpzdHJpbmcgS2V5OwogICAgICAgICBzdGF0aWMgY29uc3QgS2V5IGtLZXlOb25lOyAgICAgICAgICAgICAgLy8gIiIKICAgICAgICAgc3RhdGljIGNvbnN0IEtleSBrS2V5QW55OyAgICAgICAgICAgICAgIC8vICIqIgogCkBAIC05MSwxMCArODksNiBAQAogICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0oS2V5KTsKICAgICAgICAgfk1lZGlhQW5hbHl0aWNzSXRlbSgpOwogCi0gICAgICAgIC8vIHNvIGNsaWVudHMgY2FuIHNlbmQgaW50ZXJtZWRpYXRlIHZhbHVlcyB0byBiZSBvdmVybGFpZCBsYXRlcgotICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0gJnNldEZpbmFsaXplZChib29sKTsKLSAgICAgICAgYm9vbCBnZXRGaW5hbGl6ZWQoKSBjb25zdDsKLQogICAgICAgICAvLyBTZXNzaW9uSUQgdGllcyBtdWx0aXBsZSBzdWJtaXNzaW9ucyBmb3Igc2FtZSBrZXkgdG9nZXRoZXIKICAgICAgICAgLy8gc28gdGhhdCBpZiB2aWRlbyAiaGVpZ2h0IiBhbmQgIndpZHRoIiBhcmUga25vd24gYXQgb25lIHBvaW50CiAgICAgICAgIC8vIGFuZCAiZnJhbWVyYXRlIiBpcyBvbmx5IGtub3duIGxhdGVyLCB0aGV5IGNhbiBiZSBiZSBicm91Z2h0CkBAIC0xNzAsMTggKzE2NCwxOCBAQAogICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0gJnNldFVpZCh1aWRfdCk7CiAgICAgICAgIHVpZF90IGdldFVpZCgpIGNvbnN0OwogCi0gICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAmc2V0UGtnTmFtZShBU3RyaW5nKTsKLSAgICAgICAgQVN0cmluZyBnZXRQa2dOYW1lKCkgY29uc3Q7CisgICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAmc2V0UGtnTmFtZShjb25zdCBzdGQ6OnN0cmluZyAmcGtnTmFtZSk7CisgICAgICAgIHN0ZDo6c3RyaW5nIGdldFBrZ05hbWUoKSBjb25zdCB7IHJldHVybiBtUGtnTmFtZTsgfQogCi0gICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAmc2V0UGtnVmVyc2lvbkNvZGUoaW50MzJfdCk7Ci0gICAgICAgIGludDMyX3QgZ2V0UGtnVmVyc2lvbkNvZGUoKSBjb25zdDsKKyAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtICZzZXRQa2dWZXJzaW9uQ29kZShpbnQ2NF90KTsKKyAgICAgICAgaW50NjRfdCBnZXRQa2dWZXJzaW9uQ29kZSgpIGNvbnN0OwogCiAgICAgICAgIC8vIG91ciBzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGJpbmRlciBjYWxscwogICAgICAgICBpbnQzMl90IHdyaXRlVG9QYXJjZWwoUGFyY2VsICopOwogICAgICAgICBpbnQzMl90IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCYpOwogCi0gICAgICAgIEFTdHJpbmcgdG9TdHJpbmcoKTsKLSAgICAgICAgQVN0cmluZyB0b1N0cmluZyhpbnQgdmVyc2lvbik7CisgICAgICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCk7CisgICAgICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKGludCB2ZXJzaW9uKTsKIAogICAgICAgICAvLyBhcmUgd2UgY29sbGVjdGluZyBhbmFseXRpY3MgZGF0YQogICAgICAgICBzdGF0aWMgYm9vbCBpc0VuYWJsZWQoKTsKQEAgLTIwNCw4ICsxOTgsOCBAQAogICAgICAgICAvLyB0byBoZWxwIHZhbGlkYXRlIHRoYXQgQSBkb2Vzbid0IG1lc3Mgd2l0aCBCJ3MgcmVjb3JkcwogICAgICAgICBwaWRfdCAgICAgbVBpZDsKICAgICAgICAgdWlkX3QgICAgIG1VaWQ7Ci0gICAgICAgIEFTdHJpbmcgICBtUGtnTmFtZTsKLSAgICAgICAgaW50MzJfdCAgIG1Qa2dWZXJzaW9uQ29kZTsKKyAgICAgICAgc3RkOjpzdHJpbmcgICBtUGtnTmFtZTsKKyAgICAgICAgaW50NjRfdCAgIG1Qa2dWZXJzaW9uQ29kZTsKIAogICAgICAgICAvLyBsZXQncyByZXVzZSBhIGJpbmRlciBjb25uZWN0aW9uCiAgICAgICAgIHN0YXRpYyBzcDxJTWVkaWFBbmFseXRpY3NTZXJ2aWNlPiBzQW5hbHl0aWNzU2VydmljZTsKQEAgLTI0Myw3ICsyMzcsNyBAQAogICAgICAgICBlbnVtIHsKICAgICAgICAgICAgIGtHcm93UHJvcHMgPSAxMAogICAgICAgICB9OwotICAgICAgICB2b2lkIGdyb3dQcm9wcyhpbnQgaW5jcmVtZW50ID0ga0dyb3dQcm9wcyk7CisgICAgICAgIGJvb2wgZ3Jvd1Byb3BzKGludCBpbmNyZW1lbnQgPSBrR3Jvd1Byb3BzKTsKICAgICAgICAgc2l6ZV90IGZpbmRQcm9wSW5kZXgoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IGxlbik7CiAgICAgICAgIFByb3AgKmZpbmRQcm9wKGNvbnN0IGNoYXIgKm5hbWUpOwogICAgICAgICBQcm9wICphbGxvY2F0ZVByb3AoY29uc3QgY2hhciAqbmFtZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYTg3ODkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvQW5kcm9pZC5icApAQCAtMCwwICsxLDc5IEBACitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJtZWRpYXBsYXllcjJfaGVhZGVycyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKK30KKworY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYm1lZGlhcGxheWVyMiIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJKQXVkaW9UcmFjay5jcHAiLAorICAgICAgICAiTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQuY3BwIiwKKyAgICAgICAgIm1lZGlhcGxheWVyMi5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYW5kcm9pZF9ydW50aW1lIiwKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50IiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYV9vbXgiLAorICAgICAgICAibGlibWVkaWFfcGxheWVyMl91dGlsIiwKKyAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGlidXRpbHMiLAorCisgICAgICAgICJsaWJjcnlwdG8iLAorICAgICAgICAibGlibWVkaWFkcm0iLAorICAgICAgICAibGlibWVkaWFtZXRyaWNzIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKKyAgICAgICAgImxpYm1lZGlhdXRpbHMiLAorICAgICAgICAibGlibWVtdW5yZWFjaGFibGUiLAorICAgICAgICAibGlibmF0aXZld2luZG93IiwKKyAgICAgICAgImxpYnBvd2VybWFuYWdlciIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9odHRwbGl2ZSIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9wbGF5ZXIyIiwKKyAgICBdLAorCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGliYXVkaW9jbGllbnQiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYm1lZGlhX29teCIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfbnVwbGF5ZXIyIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3J0c3AiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfdGltZWR0ZXh0IiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV25vLWVycm9yPWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgZGlhZzogeworICAgICAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICB9LAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvSkF1ZGlvVHJhY2suY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0pBdWRpb1RyYWNrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzBjYzU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0pBdWRpb1RyYWNrLmNwcApAQCAtMCwwICsxLDY4OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJKQXVkaW9UcmFjayIKKworI2luY2x1ZGUgIm1lZGlhL0pBdWRpb0F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJtZWRpYS9KQXVkaW9Gb3JtYXQuaCIKKyNpbmNsdWRlICJtZWRpYXBsYXllcjIvSkF1ZGlvVHJhY2suaCIKKworI2luY2x1ZGUgPGFuZHJvaWRfbWVkaWFfQXVkaW9FcnJvcnMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBUT0RPOiBTdG9yZSBKYXZhIGNsYXNzL21ldGhvZElEIGFzIGEgbWVtYmVyIHZhcmlhYmxlIGluIHRoZSBjbGFzcy4KKy8vIFRPRE86IEFkZCBOVUxMICYmIEV4Y2VwdGlvbiBjaGVja3MgYWZ0ZXIgZXZlcnkgSk5JIGNhbGwuCitKQXVkaW9UcmFjazo6SkF1ZGlvVHJhY2soICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA8IFVzYWdlcyBvZiB0aGUgYXJndW1lbnRzIGFyZSBiZWxvdyA+CisgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwgICAgICAgICAgICAgICAvLyBBdWRpb0F1ZGlvQXR0cmlidXRlcworICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXVkaW9Gb3JtYXQgJiYgYnVmZmVyU2l6ZUluQnl0ZXMKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF1ZGlvRm9ybWF0ICYmIGJ1ZmZlclNpemVJbkJ5dGVzCisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCAgICAgICAgICAgICAvLyBBdWRpb0Zvcm1hdCAmJiBidWZmZXJTaXplSW5CeXRlcworICAgICAgICBjYWxsYmFja190IGNiZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT2ZmbG9hZAorICAgICAgICB2b2lkKiB1c2VyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT2ZmbG9hZAorICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnVmZmVyU2l6ZUluQnl0ZXMKKyAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwgICAgICAgICAgICAgICAgICAgIC8vIEF1ZGlvVHJhY2sKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcywgICAgICAgIC8vIEF1ZGlvQXR0cmlidXRlcworICAgICAgICBmbG9hdCBtYXhSZXF1aXJlZFNwZWVkKSB7ICAgICAgICAgICAgICAgICAgICAgLy8gYnVmZmVyU2l6ZUluQnl0ZXMKKworICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGpjbGFzcyBqQXVkaW9UcmFja0NscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL0F1ZGlvVHJhY2siKTsKKyAgICBtQXVkaW9UcmFja0NscyA9IChqY2xhc3MpIGVudi0+TmV3R2xvYmFsUmVmKGpBdWRpb1RyYWNrQ2xzKTsKKworICAgIG1heFJlcXVpcmVkU3BlZWQgPSBzdGQ6Om1pbihzdGQ6Om1heChtYXhSZXF1aXJlZFNwZWVkLCAxLjBmKSwgQVVESU9fVElNRVNUUkVUQ0hfU1BFRURfTUFYKTsKKworICAgIGludCBidWZmZXJTaXplSW5CeXRlcyA9IDA7CisgICAgaWYgKHNhbXBsZVJhdGUgPT0gMCB8fCBmcmFtZUNvdW50ID4gMCkgeworICAgICAgICAvLyBNYW51YWxseSBjYWxjdWxhdGUgYnVmZmVyIHNpemUuCisgICAgICAgIGJ1ZmZlclNpemVJbkJ5dGVzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoYW5uZWxNYXNrKQorICAgICAgICAgICAgICAgICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpICogKGZyYW1lQ291bnQgPiAwID8gZnJhbWVDb3VudCA6IDEpOworICAgIH0gZWxzZSBpZiAoc2FtcGxlUmF0ZSA+IDApIHsKKyAgICAgICAgLy8gQ2FsbCBKYXZhIEF1ZGlvVHJhY2s6OmdldE1pbkJ1ZmZlclNpemUoKS4KKyAgICAgICAgam1ldGhvZElEIGpHZXRNaW5CdWZmZXJTaXplID0KKyAgICAgICAgICAgICAgICBlbnYtPkdldFN0YXRpY01ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAiZ2V0TWluQnVmZmVyU2l6ZSIsICIoSUlJKUkiKTsKKyAgICAgICAgYnVmZmVyU2l6ZUluQnl0ZXMgPSBlbnYtPkNhbGxTdGF0aWNJbnRNZXRob2QobUF1ZGlvVHJhY2tDbHMsIGpHZXRNaW5CdWZmZXJTaXplLAorICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIG91dENoYW5uZWxNYXNrRnJvbU5hdGl2ZShjaGFubmVsTWFzayksIGF1ZGlvRm9ybWF0RnJvbU5hdGl2ZShmb3JtYXQpKTsKKyAgICB9CisgICAgYnVmZmVyU2l6ZUluQnl0ZXMgPSAoaW50KSAoYnVmZmVyU2l6ZUluQnl0ZXMgKiBtYXhSZXF1aXJlZFNwZWVkKTsKKworICAgIC8vIENyZWF0ZSBhIEphdmEgQXVkaW9UcmFjayBvYmplY3QgdGhyb3VnaCBpdHMgQnVpbGRlci4KKyAgICBqY2xhc3MgakJ1aWxkZXJDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9BdWRpb1RyYWNrJEJ1aWxkZXIiKTsKKyAgICBqbWV0aG9kSUQgakJ1aWxkZXJDdG9yID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgIjxpbml0PiIsICIoKVYiKTsKKyAgICBqb2JqZWN0IGpCdWlsZGVyT2JqID0gZW52LT5OZXdPYmplY3QoakJ1aWxkZXJDbHMsIGpCdWlsZGVyQ3Rvcik7CisKKyAgICBqbWV0aG9kSUQgalNldEF1ZGlvQXR0cmlidXRlcyA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICJzZXRBdWRpb0F0dHJpYnV0ZXMiLAorICAgICAgICAgICAgIihMYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXM7KUxhbmRyb2lkL21lZGlhL0F1ZGlvVHJhY2skQnVpbGRlcjsiKTsKKyAgICBqQnVpbGRlck9iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChqQnVpbGRlck9iaiwgalNldEF1ZGlvQXR0cmlidXRlcywKKyAgICAgICAgICAgIEpBdWRpb0F0dHJpYnV0ZXM6OmNyZWF0ZUF1ZGlvQXR0cmlidXRlc09iaihlbnYsIHBBdHRyaWJ1dGVzLCBzdHJlYW1UeXBlKSk7CisKKyAgICBqbWV0aG9kSUQgalNldEF1ZGlvRm9ybWF0ID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgInNldEF1ZGlvRm9ybWF0IiwKKyAgICAgICAgICAgICIoTGFuZHJvaWQvbWVkaWEvQXVkaW9Gb3JtYXQ7KUxhbmRyb2lkL21lZGlhL0F1ZGlvVHJhY2skQnVpbGRlcjsiKTsKKyAgICBqQnVpbGRlck9iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChqQnVpbGRlck9iaiwgalNldEF1ZGlvRm9ybWF0LAorICAgICAgICAgICAgSkF1ZGlvRm9ybWF0OjpjcmVhdGVBdWRpb0Zvcm1hdE9iaihlbnYsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2spKTsKKworICAgIGptZXRob2RJRCBqU2V0QnVmZmVyU2l6ZUluQnl0ZXMgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAic2V0QnVmZmVyU2l6ZUluQnl0ZXMiLAorICAgICAgICAgICAgIihJKUxhbmRyb2lkL21lZGlhL0F1ZGlvVHJhY2skQnVpbGRlcjsiKTsKKyAgICBqQnVpbGRlck9iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChqQnVpbGRlck9iaiwgalNldEJ1ZmZlclNpemVJbkJ5dGVzLCBidWZmZXJTaXplSW5CeXRlcyk7CisKKyAgICAvLyBXZSBvbmx5IHVzZSBzdHJlYW1pbmcgbW9kZSBvZiBKYXZhIEF1ZGlvVHJhY2suCisgICAgamZpZWxkSUQgak1vZGVTdHJlYW0gPSBlbnYtPkdldFN0YXRpY0ZpZWxkSUQobUF1ZGlvVHJhY2tDbHMsICJNT0RFX1NUUkVBTSIsICJJIik7CisgICAgamludCB0cmFuc2Zlck1vZGUgPSBlbnYtPkdldFN0YXRpY0ludEZpZWxkKG1BdWRpb1RyYWNrQ2xzLCBqTW9kZVN0cmVhbSk7CisgICAgam1ldGhvZElEIGpTZXRUcmFuc2Zlck1vZGUgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAic2V0VHJhbnNmZXJNb2RlIiwKKyAgICAgICAgICAgICIoSSlMYW5kcm9pZC9tZWRpYS9BdWRpb1RyYWNrJEJ1aWxkZXI7Iik7CisgICAgakJ1aWxkZXJPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoakJ1aWxkZXJPYmosIGpTZXRUcmFuc2Zlck1vZGUsCisgICAgICAgICAgICB0cmFuc2Zlck1vZGUgLyogSmF2YSBBdWRpb1RyYWNrOjpNT0RFX1NUUkVBTSAqLyk7CisKKyAgICBpZiAoc2Vzc2lvbklkICE9IDApIHsKKyAgICAgICAgam1ldGhvZElEIGpTZXRTZXNzaW9uSWQgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAic2V0U2Vzc2lvbklkIiwKKyAgICAgICAgICAgICAgICAiKEkpTGFuZHJvaWQvbWVkaWEvQXVkaW9UcmFjayRCdWlsZGVyOyIpOworICAgICAgICBqQnVpbGRlck9iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChqQnVpbGRlck9iaiwgalNldFNlc3Npb25JZCwgc2Vzc2lvbklkKTsKKyAgICB9CisKKyAgICBpZiAoY2JmICE9IE5VTEwpIHsKKyAgICAgICAgam1ldGhvZElEIGpTZXRPZmZsb2FkZWRQbGF5YmFjayA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICJzZXRPZmZsb2FkZWRQbGF5YmFjayIsCisgICAgICAgICAgICAgICAgIihaKUxhbmRyb2lkL21lZGlhL0F1ZGlvVHJhY2skQnVpbGRlcjsiKTsKKyAgICAgICAgakJ1aWxkZXJPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoakJ1aWxkZXJPYmosIGpTZXRPZmZsb2FkZWRQbGF5YmFjaywgdHJ1ZSk7CisgICAgICAgIG1GbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQ7CisgICAgfQorCisgICAgam1ldGhvZElEIGpCdWlsZCA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICJidWlsZCIsICIoKUxhbmRyb2lkL21lZGlhL0F1ZGlvVHJhY2s7Iik7CisgICAgbUF1ZGlvVHJhY2tPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoakJ1aWxkZXJPYmosIGpCdWlsZCk7CisKKyAgICBpZiAoY2JmICE9IE5VTEwpIHsKKyAgICAgICAgLy8gU2V0IG9mZmxvYWQgbW9kZSBjYWxsYmFjaworICAgICAgICBqb2JqZWN0IGpTdHJlYW1FdmVudENhbGxiYWNrT2JqID0gY3JlYXRlU3RyZWFtRXZlbnRDYWxsYmFjayhjYmYsIHVzZXIpOworICAgICAgICBqb2JqZWN0IGpFeGVjdXRvck9iaiA9IGNyZWF0ZUNhbGxiYWNrRXhlY3V0b3IoKTsKKyAgICAgICAgam1ldGhvZElEIGpTZXRTdHJlYW1FdmVudENhbGxiYWNrID0gZW52LT5HZXRNZXRob2RJRCgKKyAgICAgICAgICAgICAgICBqQXVkaW9UcmFja0NscywKKyAgICAgICAgICAgICAgICAic2V0U3RyZWFtRXZlbnRDYWxsYmFjayIsCisgICAgICAgICAgICAgICAgIihMamF2YS91dGlsL2NvbmN1cnJlbnQvRXhlY3V0b3I7TGFuZHJvaWQvbWVkaWEvQXVkaW9UcmFjayRTdHJlYW1FdmVudENhbGxiYWNrOylWIik7CisgICAgICAgIGVudi0+Q2FsbFZvaWRNZXRob2QoCisgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2tPYmosIGpTZXRTdHJlYW1FdmVudENhbGxiYWNrLCBqRXhlY3V0b3JPYmosIGpTdHJlYW1FdmVudENhbGxiYWNrT2JqKTsKKyAgICB9Cit9CisKK0pBdWRpb1RyYWNrOjp+SkF1ZGlvVHJhY2soKSB7CisgICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgZW52LT5EZWxldGVHbG9iYWxSZWYobUF1ZGlvVHJhY2tDbHMpOworfQorCitzaXplX3QgSkF1ZGlvVHJhY2s6OmZyYW1lQ291bnQoKSB7CisgICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgam1ldGhvZElEIGpHZXRCdWZmZXJTaXplSW5GcmFtZXMgPSBlbnYtPkdldE1ldGhvZElEKAorICAgICAgICAgICAgbUF1ZGlvVHJhY2tDbHMsICJnZXRCdWZmZXJTaXplSW5GcmFtZXMiLCAiKClJIik7CisgICAgcmV0dXJuIGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldEJ1ZmZlclNpemVJbkZyYW1lcyk7Cit9CisKK3NpemVfdCBKQXVkaW9UcmFjazo6Y2hhbm5lbENvdW50KCkgeworICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGptZXRob2RJRCBqR2V0Q2hhbm5lbENvdW50ID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgImdldENoYW5uZWxDb3VudCIsICIoKUkiKTsKKyAgICByZXR1cm4gZW52LT5DYWxsSW50TWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqR2V0Q2hhbm5lbENvdW50KTsKK30KKwordWludDMyX3QgSkF1ZGlvVHJhY2s6OmxhdGVuY3koKSB7CisgICAgLy8gVE9ETzogQ3VycmVudGx5IGhhcmQtY29kZWQgYXMgcmV0dXJuaW5nIHplcm8uCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXR1c190IEpBdWRpb1RyYWNrOjpnZXRQb3NpdGlvbih1aW50MzJfdCAqcG9zaXRpb24pIHsKKyAgICBpZiAocG9zaXRpb24gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGptZXRob2RJRCBqR2V0UGxheWJhY2tIZWFkUG9zaXRpb24gPSBlbnYtPkdldE1ldGhvZElEKAorICAgICAgICAgICAgbUF1ZGlvVHJhY2tDbHMsICJnZXRQbGF5YmFja0hlYWRQb3NpdGlvbiIsICIoKUkiKTsKKyAgICAqcG9zaXRpb24gPSBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRQbGF5YmFja0hlYWRQb3NpdGlvbik7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2Jvb2wgSkF1ZGlvVHJhY2s6OmdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCYgdGltZXN0YW1wKSB7CisgICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisKKyAgICBqY2xhc3MgakF1ZGlvVGltZVN0YW1wQ2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvQXVkaW9UaW1lc3RhbXAiKTsKKyAgICBqb2JqZWN0IGpBdWRpb1RpbWVTdGFtcE9iaiA9IGVudi0+QWxsb2NPYmplY3QoakF1ZGlvVGltZVN0YW1wQ2xzKTsKKworICAgIGpmaWVsZElEIGpGcmFtZVBvc2l0aW9uID0gZW52LT5HZXRGaWVsZElEKGpBdWRpb1RpbWVTdGFtcENscywgImZyYW1lUG9zaXRpb24iLCAiTCIpOworICAgIGpmaWVsZElEIGpOYW5vVGltZSA9IGVudi0+R2V0RmllbGRJRChqQXVkaW9UaW1lU3RhbXBDbHMsICJuYW5vVGltZSIsICJMIik7CisKKyAgICBqbWV0aG9kSUQgakdldFRpbWVzdGFtcCA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsCisgICAgICAgICAgICAiZ2V0VGltZXN0YW1wIiwgIihMYW5kcm9pZC9tZWRpYS9BdWRpb1RpbWVzdGFtcClCIik7CisgICAgYm9vbCBzdWNjZXNzID0gZW52LT5DYWxsQm9vbGVhbk1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldFRpbWVzdGFtcCwgakF1ZGlvVGltZVN0YW1wT2JqKTsKKworICAgIGlmICghc3VjY2VzcykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbG9uZyBsb25nIGZyYW1lUG9zaXRpb24gPSBlbnYtPkdldExvbmdGaWVsZChqQXVkaW9UaW1lU3RhbXBPYmosIGpGcmFtZVBvc2l0aW9uKTsKKyAgICBsb25nIGxvbmcgbmFub1RpbWUgPSBlbnYtPkdldExvbmdGaWVsZChqQXVkaW9UaW1lU3RhbXBPYmosIGpOYW5vVGltZSk7CisKKyAgICBzdHJ1Y3QgdGltZXNwZWMgdHM7CisgICAgY29uc3QgbG9uZyBsb25nIHNlY29uZFRvTmFubyA9IDEwMDAwMDAwMDBMTDsgLy8gMUU5CisgICAgdHMudHZfc2VjID0gbmFub1RpbWUgLyBzZWNvbmRUb05hbm87CisgICAgdHMudHZfbnNlYyA9IG5hbm9UaW1lICUgc2Vjb25kVG9OYW5vOworICAgIHRpbWVzdGFtcC5tVGltZSA9IHRzOworICAgIHRpbWVzdGFtcC5tUG9zaXRpb24gPSAodWludDMyX3QpIGZyYW1lUG9zaXRpb247CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OmdldFRpbWVzdGFtcChFeHRlbmRlZFRpbWVzdGFtcCAqdGltZXN0YW1wIF9fdW51c2VkKSB7CisgICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXMgYWZ0ZXIgYXBwcm9wcmlhdGUgSmF2YSBBdWRpb1RyYWNrIG1ldGhvZCBpcyBhdmFpbGFibGUuCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBKQXVkaW9UcmFjazo6c2V0UGxheWJhY2tSYXRlKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZwbGF5YmFja1JhdGUpIHsKKyAgICAvLyBUT0RPOiBleGlzdGluZyBuYXRpdmUgQXVkaW9UcmFjayByZXR1cm5zIElOVkFMSURfT1BFUkFUSU9OIG9uIG9mZmxvYWQvZGlyZWN0L2Zhc3QgdHJhY2tzLgorICAgIC8vIFNob3VsZCB3ZSBkbyB0aGUgc2FtZSB0aGluZz8KKyAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKworICAgIGpjbGFzcyBqUGxheWJhY2tQYXJhbXNDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9QbGF5YmFja1BhcmFtcyIpOworICAgIGptZXRob2RJRCBqUGxheWJhY2tQYXJhbXNDdG9yID0gZW52LT5HZXRNZXRob2RJRChqUGxheWJhY2tQYXJhbXNDbHMsICI8aW5pdD4iLCAiKClWIik7CisgICAgam9iamVjdCBqUGxheWJhY2tQYXJhbXNPYmogPSBlbnYtPk5ld09iamVjdChqUGxheWJhY2tQYXJhbXNDbHMsIGpQbGF5YmFja1BhcmFtc0N0b3IpOworCisgICAgam1ldGhvZElEIGpTZXRBdWRpb0ZhbGxiYWNrTW9kZSA9IGVudi0+R2V0TWV0aG9kSUQoCisgICAgICAgICAgICBqUGxheWJhY2tQYXJhbXNDbHMsICJzZXRBdWRpb0ZhbGxiYWNrTW9kZSIsICIoSSlMYW5kcm9pZC9tZWRpYS9QbGF5YmFja1BhcmFtczsiKTsKKyAgICBqUGxheWJhY2tQYXJhbXNPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoCisgICAgICAgICAgICBqUGxheWJhY2tQYXJhbXNPYmosIGpTZXRBdWRpb0ZhbGxiYWNrTW9kZSwgcGxheWJhY2tSYXRlLm1GYWxsYmFja01vZGUpOworCisgICAgam1ldGhvZElEIGpTZXRBdWRpb1N0cmV0Y2hNb2RlID0gZW52LT5HZXRNZXRob2RJRCgKKyAgICAgICAgICAgICAgICBqUGxheWJhY2tQYXJhbXNDbHMsICJzZXRBdWRpb1N0cmV0Y2hNb2RlIiwgIihJKUxhbmRyb2lkL21lZGlhL1BsYXliYWNrUGFyYW1zOyIpOworICAgIGpQbGF5YmFja1BhcmFtc09iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZCgKKyAgICAgICAgICAgIGpQbGF5YmFja1BhcmFtc09iaiwgalNldEF1ZGlvU3RyZXRjaE1vZGUsIHBsYXliYWNrUmF0ZS5tU3RyZXRjaE1vZGUpOworCisgICAgam1ldGhvZElEIGpTZXRQaXRjaCA9IGVudi0+R2V0TWV0aG9kSUQoCisgICAgICAgICAgICBqUGxheWJhY2tQYXJhbXNDbHMsICJzZXRQaXRjaCIsICIoRilMYW5kcm9pZC9tZWRpYS9QbGF5YmFja1BhcmFtczsiKTsKKyAgICBqUGxheWJhY2tQYXJhbXNPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoalBsYXliYWNrUGFyYW1zT2JqLCBqU2V0UGl0Y2gsIHBsYXliYWNrUmF0ZS5tUGl0Y2gpOworCisgICAgam1ldGhvZElEIGpTZXRTcGVlZCA9IGVudi0+R2V0TWV0aG9kSUQoCisgICAgICAgICAgICBqUGxheWJhY2tQYXJhbXNDbHMsICJzZXRTcGVlZCIsICIoRilMYW5kcm9pZC9tZWRpYS9QbGF5YmFja1BhcmFtczsiKTsKKyAgICBqUGxheWJhY2tQYXJhbXNPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoalBsYXliYWNrUGFyYW1zT2JqLCBqU2V0U3BlZWQsIHBsYXliYWNrUmF0ZS5tU3BlZWQpOworCisKKyAgICAvLyBTZXQgdGhpcyBKYXZhIFBsYXliYWNrUGFyYW1zIG9iamVjdCBpbnRvIEphdmEgQXVkaW9UcmFjay4KKyAgICBqbWV0aG9kSUQgalNldFBsYXliYWNrUGFyYW1zID0gZW52LT5HZXRNZXRob2RJRCgKKyAgICAgICAgICAgIG1BdWRpb1RyYWNrQ2xzLCAic2V0UGxheWJhY2tQYXJhbXMiLCAiKExhbmRyb2lkL21lZGlhL1BsYXliYWNrUGFyYW1zOylWIik7CisgICAgZW52LT5DYWxsVm9pZE1ldGhvZChtQXVkaW9UcmFja09iaiwgalNldFBsYXliYWNrUGFyYW1zLCBqUGxheWJhY2tQYXJhbXNPYmopOworICAgIC8vIFRPRE86IFNob3VsZCB3ZSBjYXRjaCB0aGUgSmF2YSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24/CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2NvbnN0IEF1ZGlvUGxheWJhY2tSYXRlIEpBdWRpb1RyYWNrOjpnZXRQbGF5YmFja1JhdGUoKSB7CisgICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisKKyAgICBqbWV0aG9kSUQgakdldFBsYXliYWNrUGFyYW1zID0gZW52LT5HZXRNZXRob2RJRCgKKyAgICAgICAgICAgIG1BdWRpb1RyYWNrQ2xzLCAiZ2V0UGxheWJhY2tQYXJhbXMiLCAiKClMYW5kcm9pZC9tZWRpYS9QbGF5YmFja1BhcmFtczsiKTsKKyAgICBqb2JqZWN0IGpQbGF5YmFja1BhcmFtc09iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldFBsYXliYWNrUGFyYW1zKTsKKworICAgIEF1ZGlvUGxheWJhY2tSYXRlIHBsYXliYWNrUmF0ZTsKKyAgICBqY2xhc3MgalBsYXliYWNrUGFyYW1zQ2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvUGxheWJhY2tQYXJhbXMiKTsKKworICAgIGptZXRob2RJRCBqR2V0QXVkaW9GYWxsYmFja01vZGUgPSBlbnYtPkdldE1ldGhvZElEKAorICAgICAgICAgICAgalBsYXliYWNrUGFyYW1zQ2xzLCAiZ2V0QXVkaW9GYWxsYmFja01vZGUiLCAiKClJIik7CisgICAgLy8gVE9ETzogU2hvdWxkIHdlIGVuYWJsZSBwYXNzaW5nIEFVRElPX1RJTUVTVFJFVENIX0ZBTExCQUNLX0NVVF9SRVBFQVQ/CisgICAgLy8gICAgICAgVGhlIGVudW0gaXMgaW50ZXJuYWwgb25seSwgc28gaXQgaXMgbm90IGRlZmluZWQgaW4gUGxheWJhY2tQYXJtYXMuamF2YS4KKyAgICAvLyBUT0RPOiBJcyB0aGlzIHJpZ2h0IHdheSB0byBjb252ZXJ0IGFuIGludCB0byBhbiBlbnVtPworICAgIHBsYXliYWNrUmF0ZS5tRmFsbGJhY2tNb2RlID0gc3RhdGljX2Nhc3Q8QXVkaW9UaW1lc3RyZXRjaEZhbGxiYWNrTW9kZT4oCisgICAgICAgICAgICBlbnYtPkNhbGxJbnRNZXRob2QoalBsYXliYWNrUGFyYW1zT2JqLCBqR2V0QXVkaW9GYWxsYmFja01vZGUpKTsKKworICAgIGptZXRob2RJRCBqR2V0QXVkaW9TdHJldGNoTW9kZSA9IGVudi0+R2V0TWV0aG9kSUQoCisgICAgICAgICAgICBqUGxheWJhY2tQYXJhbXNDbHMsICJnZXRBdWRpb1N0cmV0Y2hNb2RlIiwgIigpSSIpOworICAgIHBsYXliYWNrUmF0ZS5tU3RyZXRjaE1vZGUgPSBzdGF0aWNfY2FzdDxBdWRpb1RpbWVzdHJldGNoU3RyZXRjaE1vZGU+KAorICAgICAgICAgICAgZW52LT5DYWxsSW50TWV0aG9kKGpQbGF5YmFja1BhcmFtc09iaiwgakdldEF1ZGlvU3RyZXRjaE1vZGUpKTsKKworICAgIGptZXRob2RJRCBqR2V0UGl0Y2ggPSBlbnYtPkdldE1ldGhvZElEKGpQbGF5YmFja1BhcmFtc0NscywgImdldFBpdGNoIiwgIigpRiIpOworICAgIHBsYXliYWNrUmF0ZS5tUGl0Y2ggPSBlbnYtPkNhbGxGbG9hdE1ldGhvZChqUGxheWJhY2tQYXJhbXNPYmosIGpHZXRQaXRjaCk7CisKKyAgICBqbWV0aG9kSUQgakdldFNwZWVkID0gZW52LT5HZXRNZXRob2RJRChqUGxheWJhY2tQYXJhbXNDbHMsICJnZXRTcGVlZCIsICIoKUYiKTsKKyAgICBwbGF5YmFja1JhdGUubVNwZWVkID0gZW52LT5DYWxsRmxvYXRNZXRob2QoalBsYXliYWNrUGFyYW1zT2JqLCBqR2V0U3BlZWQpOworCisgICAgcmV0dXJuIHBsYXliYWNrUmF0ZTsKK30KKworbWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdHVzIEpBdWRpb1RyYWNrOjphcHBseVZvbHVtZVNoYXBlcigKKyAgICAgICAgY29uc3Qgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4mIGNvbmZpZ3VyYXRpb24sCisgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4mIG9wZXJhdGlvbikgeworCisgICAgam9iamVjdCBqQ29uZmlndXJhdGlvbk9iaiA9IGNyZWF0ZVZvbHVtZVNoYXBlckNvbmZpZ3VyYXRpb25PYmooY29uZmlndXJhdGlvbik7CisgICAgam9iamVjdCBqT3BlcmF0aW9uT2JqID0gY3JlYXRlVm9sdW1lU2hhcGVyT3BlcmF0aW9uT2JqKG9wZXJhdGlvbik7CisKKyAgICBpZiAoakNvbmZpZ3VyYXRpb25PYmogPT0gTlVMTCB8fCBqT3BlcmF0aW9uT2JqID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIG1lZGlhOjpWb2x1bWVTaGFwZXI6OlN0YXR1cyhCQURfVkFMVUUpOworICAgIH0KKworICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworCisgICAgam1ldGhvZElEIGpDcmVhdGVWb2x1bWVTaGFwZXIgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAiY3JlYXRlVm9sdW1lU2hhcGVyIiwKKyAgICAgICAgICAgICIoTGFuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyJENvbmZpZ3VyYXRpb247KUxhbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlcjsiKTsKKyAgICBqb2JqZWN0IGpWb2x1bWVTaGFwZXJPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoCisgICAgICAgICAgICBtQXVkaW9UcmFja09iaiwgakNyZWF0ZVZvbHVtZVNoYXBlciwgakNvbmZpZ3VyYXRpb25PYmopOworCisgICAgamNsYXNzIGpWb2x1bWVTaGFwZXJDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXIiKTsKKyAgICBqbWV0aG9kSUQgakFwcGx5ID0gZW52LT5HZXRNZXRob2RJRChqVm9sdW1lU2hhcGVyQ2xzLCAiYXBwbHkiLAorICAgICAgICAgICAgIihMYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXIkT3BlcmF0aW9uOylWIik7CisgICAgZW52LT5DYWxsVm9pZE1ldGhvZChqVm9sdW1lU2hhcGVyT2JqLCBqQXBwbHksIGpPcGVyYXRpb25PYmopOworCisgICAgcmV0dXJuIG1lZGlhOjpWb2x1bWVTaGFwZXI6OlN0YXR1cyhOT19FUlJPUik7Cit9CisKK3N0YXR1c190IEpBdWRpb1RyYWNrOjpzZXRBdXhFZmZlY3RTZW5kTGV2ZWwoZmxvYXQgbGV2ZWwpIHsKKyAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBqbWV0aG9kSUQgalNldEF1eEVmZmVjdFNlbmRMZXZlbCA9IGVudi0+R2V0TWV0aG9kSUQoCisgICAgICAgICAgICBtQXVkaW9UcmFja0NscywgInNldEF1eEVmZmVjdFNlbmRMZXZlbCIsICIoRilJIik7CisgICAgaW50IHJlc3VsdCA9IGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgalNldEF1eEVmZmVjdFNlbmRMZXZlbCwgbGV2ZWwpOworICAgIHJldHVybiBqYXZhVG9OYXRpdmVTdGF0dXMocmVzdWx0KTsKK30KKworc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OmF0dGFjaEF1eEVmZmVjdChpbnQgZWZmZWN0SWQpIHsKKyAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBqbWV0aG9kSUQgakF0dGFjaEF1eEVmZmVjdCA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJhdHRhY2hBdXhFZmZlY3QiLCAiKEkpSSIpOworICAgIGludCByZXN1bHQgPSBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpBdHRhY2hBdXhFZmZlY3QsIGVmZmVjdElkKTsKKyAgICByZXR1cm4gamF2YVRvTmF0aXZlU3RhdHVzKHJlc3VsdCk7Cit9CisKK3N0YXR1c190IEpBdWRpb1RyYWNrOjpzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIHsKKyAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICAvLyBUT0RPOiBKYXZhIHNldFN0ZXJlb1ZvbHVtZSBpcyBkZXByZWNhdGVkLiBEbyB3ZSByZWFsbHkgbmVlZCB0aGlzIG1ldGhvZD8KKyAgICBqbWV0aG9kSUQgalNldFN0ZXJlb1ZvbHVtZSA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJzZXRTdGVyZW9Wb2x1bWUiLCAiKEZGKUkiKTsKKyAgICBpbnQgcmVzdWx0ID0gZW52LT5DYWxsSW50TWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqU2V0U3RlcmVvVm9sdW1lLCBsZWZ0LCByaWdodCk7CisgICAgcmV0dXJuIGphdmFUb05hdGl2ZVN0YXR1cyhyZXN1bHQpOworfQorCitzdGF0dXNfdCBKQXVkaW9UcmFjazo6c2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSkgeworICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGptZXRob2RJRCBqU2V0Vm9sdW1lID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgInNldFZvbHVtZSIsICIoRilJIik7CisgICAgaW50IHJlc3VsdCA9IGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgalNldFZvbHVtZSwgdm9sdW1lKTsKKyAgICByZXR1cm4gamF2YVRvTmF0aXZlU3RhdHVzKHJlc3VsdCk7Cit9CisKK3N0YXR1c190IEpBdWRpb1RyYWNrOjpzdGFydCgpIHsKKyAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBqbWV0aG9kSUQgalBsYXkgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAicGxheSIsICIoKVYiKTsKKyAgICAvLyBUT0RPOiBTaG91bGQgd2UgY2F0Y2ggdGhlIEphdmEgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGZyb20gcGxheSgpPworICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpQbGF5KTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3NzaXplX3QgSkF1ZGlvVHJhY2s6OndyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUsIGJvb2wgYmxvY2tpbmcpIHsKKyAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBqYnl0ZUFycmF5IGpBdWRpb0RhdGEgPSBlbnYtPk5ld0J5dGVBcnJheShzaXplKTsKKyAgICBlbnYtPlNldEJ5dGVBcnJheVJlZ2lvbihqQXVkaW9EYXRhLCAwLCBzaXplLCAoamJ5dGUgKikgYnVmZmVyKTsKKworICAgIGpjbGFzcyBqQnl0ZUJ1ZmZlckNscyA9IGVudi0+RmluZENsYXNzKCJqYXZhL25pby9CeXRlQnVmZmVyIik7CisgICAgam1ldGhvZElEIGpXcmFwID0gZW52LT5HZXRTdGF0aWNNZXRob2RJRChqQnl0ZUJ1ZmZlckNscywgIndyYXAiLCAiKFtCKUxqYXZhL25pby9CeXRlQnVmZmVyOyIpOworICAgIGpvYmplY3QgakJ5dGVCdWZmZXJPYmogPSBlbnYtPkNhbGxTdGF0aWNPYmplY3RNZXRob2QoakJ5dGVCdWZmZXJDbHMsIGpXcmFwLCBqQXVkaW9EYXRhKTsKKworICAgIGludCB3cml0ZU1vZGUgPSAwOworICAgIGlmIChibG9ja2luZykgeworICAgICAgICBqZmllbGRJRCBqV3JpdGVCbG9ja2luZyA9IGVudi0+R2V0U3RhdGljRmllbGRJRChtQXVkaW9UcmFja0NscywgIldSSVRFX0JMT0NLSU5HIiwgIkkiKTsKKyAgICAgICAgd3JpdGVNb2RlID0gZW52LT5HZXRTdGF0aWNJbnRGaWVsZChtQXVkaW9UcmFja0NscywgaldyaXRlQmxvY2tpbmcpOworICAgIH0gZWxzZSB7CisgICAgICAgIGpmaWVsZElEIGpXcml0ZU5vbkJsb2NraW5nID0gZW52LT5HZXRTdGF0aWNGaWVsZElEKAorICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrQ2xzLCAiV1JJVEVfTk9OX0JMT0NLSU5HIiwgIkkiKTsKKyAgICAgICAgd3JpdGVNb2RlID0gZW52LT5HZXRTdGF0aWNJbnRGaWVsZChtQXVkaW9UcmFja0NscywgaldyaXRlTm9uQmxvY2tpbmcpOworICAgIH0KKworICAgIGptZXRob2RJRCBqV3JpdGUgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAid3JpdGUiLCAiKExqYXZhL25pby9CeXRlQnVmZmVyO0lJKUkiKTsKKyAgICBpbnQgcmVzdWx0ID0gZW52LT5DYWxsSW50TWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqV3JpdGUsIGpCeXRlQnVmZmVyT2JqLCBzaXplLCB3cml0ZU1vZGUpOworCisgICAgaWYgKHJlc3VsdCA+PSAwKSB7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGphdmFUb05hdGl2ZVN0YXR1cyhyZXN1bHQpOworICAgIH0KK30KKwordm9pZCBKQXVkaW9UcmFjazo6c3RvcCgpIHsKKyAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBqbWV0aG9kSUQgalN0b3AgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAic3RvcCIsICIoKVYiKTsKKyAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqU3RvcCk7CisgICAgLy8gVE9ETzogU2hvdWxkIHdlIGNhdGNoIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbj8KK30KKworLy8gVE9ETzogSXMgdGhlIHJpZ2h0IGltcGxlbWVudGF0aW9uPworYm9vbCBKQXVkaW9UcmFjazo6c3RvcHBlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gIWlzUGxheWluZygpOworfQorCit2b2lkIEpBdWRpb1RyYWNrOjpmbHVzaCgpIHsKKyAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBqbWV0aG9kSUQgakZsdXNoID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgImZsdXNoIiwgIigpViIpOworICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpGbHVzaCk7Cit9CisKK3ZvaWQgSkF1ZGlvVHJhY2s6OnBhdXNlKCkgeworICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGptZXRob2RJRCBqUGF1c2UgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAicGF1c2UiLCAiKClWIik7CisgICAgZW52LT5DYWxsVm9pZE1ldGhvZChtQXVkaW9UcmFja09iaiwgalBhdXNlKTsKKyAgICAvLyBUT0RPOiBTaG91bGQgd2UgY2F0Y2ggSWxsZWdhbFN0YXRlRXhjZXB0aW9uPworfQorCitib29sIEpBdWRpb1RyYWNrOjppc1BsYXlpbmcoKSBjb25zdCB7CisgICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgam1ldGhvZElEIGpHZXRQbGF5U3RhdGUgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAiZ2V0UGxheVN0YXRlIiwgIigpSSIpOworICAgIGludCBjdXJyZW50UGxheVN0YXRlID0gZW52LT5DYWxsSW50TWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqR2V0UGxheVN0YXRlKTsKKworICAgIC8vIFRPRE86IEluIEphdmEgQXVkaW9UcmFjaywgdGhlcmUgaXMgbm8gU1RPUFBJTkcgc3RhdGUuCisgICAgLy8gVGhpcyBtZWFucyB3aGlsZSBzdG9wcGluZywgaXNQbGF5aW5nKCkgd2lsbCByZXR1cm4gZGlmZmVyZW50IHZhbHVlIGluIHR3byBjbGFzcy4KKyAgICAvLyAgLSBpbiBleGlzdGluZyBuYXRpdmUgQXVkaW9UcmFjazogdHJ1ZQorICAgIC8vICAtIGluIEpBdWRpb1RyYWNrOiBmYWxzZQorICAgIC8vIElmIG5vdCBva2F5LCBhbHNvIG1vZGlmeSB0aGUgaW1wbGVtZW50YXRpb24gb2Ygc3RvcHBlZCgpLgorICAgIGpmaWVsZElEIGpQbGF5U3RhdGVQbGF5aW5nID0gZW52LT5HZXRTdGF0aWNGaWVsZElEKG1BdWRpb1RyYWNrQ2xzLCAiUExBWVNUQVRFX1BMQVlJTkciLCAiSSIpOworICAgIGludCBzdGF0ZVBsYXlpbmcgPSBlbnYtPkdldFN0YXRpY0ludEZpZWxkKG1BdWRpb1RyYWNrQ2xzLCBqUGxheVN0YXRlUGxheWluZyk7CisgICAgcmV0dXJuIGN1cnJlbnRQbGF5U3RhdGUgPT0gc3RhdGVQbGF5aW5nOworfQorCit1aW50MzJfdCBKQXVkaW9UcmFjazo6Z2V0U2FtcGxlUmF0ZSgpIHsKKyAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBqbWV0aG9kSUQgakdldFNhbXBsZVJhdGUgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAiZ2V0U2FtcGxlUmF0ZSIsICIoKUkiKTsKKyAgICByZXR1cm4gZW52LT5DYWxsSW50TWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqR2V0U2FtcGxlUmF0ZSk7Cit9CisKK3N0YXR1c190IEpBdWRpb1RyYWNrOjpnZXRCdWZmZXJEdXJhdGlvbkluVXMoaW50NjRfdCAqZHVyYXRpb24pIHsKKyAgICBpZiAoZHVyYXRpb24gPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGptZXRob2RJRCBqR2V0QnVmZmVyU2l6ZUluRnJhbWVzID0gZW52LT5HZXRNZXRob2RJRCgKKyAgICAgICAgICAgIG1BdWRpb1RyYWNrQ2xzLCAiZ2V0QnVmZmVyU2l6ZUluRnJhbWVzIiwgIigpSSIpOworICAgIGludCBidWZmZXJTaXplSW5GcmFtZXMgPSBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRCdWZmZXJTaXplSW5GcmFtZXMpOworCisgICAgY29uc3QgZG91YmxlIHNlY29uZFRvTWljcm8gPSAxMDAwMDAwTEw7IC8vIDFFNgorICAgIGludCBzYW1wbGVSYXRlID0gSkF1ZGlvVHJhY2s6OmdldFNhbXBsZVJhdGUoKTsKKyAgICBmbG9hdCBzcGVlZCA9IEpBdWRpb1RyYWNrOjpnZXRQbGF5YmFja1JhdGUoKS5tU3BlZWQ7CisKKyAgICAqZHVyYXRpb24gPSAoaW50NjRfdCkgKGJ1ZmZlclNpemVJbkZyYW1lcyAqIHNlY29uZFRvTWljcm8gLyAoc2FtcGxlUmF0ZSAqIHNwZWVkKSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCithdWRpb19mb3JtYXRfdCBKQXVkaW9UcmFjazo6Zm9ybWF0KCkgeworICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGptZXRob2RJRCBqR2V0QXVkaW9Gb3JtYXQgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAiZ2V0QXVkaW9Gb3JtYXQiLCAiKClJIik7CisgICAgaW50IGphdmFGb3JtYXQgPSBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRBdWRpb0Zvcm1hdCk7CisgICAgcmV0dXJuIGF1ZGlvRm9ybWF0VG9OYXRpdmUoamF2YUZvcm1hdCk7Cit9CisKK3N0YXR1c190IEpBdWRpb1RyYWNrOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkgY29uc3QKK3sKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworICAgIHJlc3VsdC5hcHBlbmQoIiBKQXVkaW9UcmFjazo6ZHVtcFxuIik7CisKKyAgICAvLyBUT0RPOiBSZW1vdmUgbG9ncyB0aGF0IGluY2x1ZGVzIHVuYXZhaWxhYmxlIGluZm9ybWF0aW9uIGZyb20gYmVsb3cuCisvLyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIHN0YXR1cyglZCksIHN0YXRlKCVkKSwgc2Vzc2lvbiBJZCglZCksIGZsYWdzKCUjeClcbiIsCisvLyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0dXMsIG1TdGF0ZSwgbVNlc3Npb25JZCwgbUZsYWdzKTsKKy8vICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgc3RyZWFtIHR5cGUoJWQpLCBsZWZ0IC0gcmlnaHQgdm9sdW1lKCVmLCAlZilcbiIsCisvLyAgICAgICAgICAgICAgICAgICAgICAgIChtU3RyZWFtVHlwZSA9PSBBVURJT19TVFJFQU1fREVGQVVMVCkgPworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdG9fc3RyZWFtX3R5cGUoJm1BdHRyaWJ1dGVzKSA6IG1TdHJlYW1UeXBlLAorLy8gICAgICAgICAgICAgICAgICAgICAgICBtVm9sdW1lW0FVRElPX0lOVEVSTEVBVkVfTEVGVF0sIG1Wb2x1bWVbQVVESU9fSU5URVJMRUFWRV9SSUdIVF0pOworLy8gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBmb3JtYXQoJSN4KSwgY2hhbm5lbCBtYXNrKCUjeCksIGNoYW5uZWwgY291bnQoJXUpXG4iLAorLy8gICAgICAgICAgICAgICAgICBmb3JtYXQoKSwgbUNoYW5uZWxNYXNrLCBjaGFubmVsQ291bnQoKSk7CisvLyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIHNhbXBsZSByYXRlKCV1KSwgb3JpZ2luYWwgc2FtcGxlIHJhdGUoJXUpLCBzcGVlZCglZilcbiIsCisvLyAgICAgICAgICAgIGdldFNhbXBsZVJhdGUoKSwgbU9yaWdpbmFsU2FtcGxlUmF0ZSwgbVBsYXliYWNrUmF0ZS5tU3BlZWQpOworLy8gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBmcmFtZSBjb3VudCglenUpLCByZXEuIGZyYW1lIGNvdW50KCV6dSlcbiIsCisvLyAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQoKSwgbVJlcUZyYW1lQ291bnQpOworLy8gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBub3RpZi4gZnJhbWUgY291bnQoJXUpLCByZXEuIG5vdGlmLiBmcmFtZSBjb3VudCgldSksIgorLy8gICAgICAgICAgICAiIHJlcS4gbm90aWYuIHBlciBidWZmKCV1KVxuIiwKKy8vICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QsIG1Ob3RpZmljYXRpb25GcmFtZXNSZXEsIG1Ob3RpZmljYXRpb25zUGVyQnVmZmVyUmVxKTsKKy8vICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgbGF0ZW5jeSAoJWQpLCBzZWxlY3RlZCBkZXZpY2UgSWQoJWQpLCByb3V0ZWQgZGV2aWNlIElkKCVkKVxuIiwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZW5jeSgpLCBtU2VsZWN0ZWREZXZpY2VJZCwgZ2V0Um91dGVkRGV2aWNlSWQoKSk7CisvLyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIG91dHB1dCglZCkgQUYgbGF0ZW5jeSAoJXUpIEFGIGZyYW1lIGNvdW50KCV6dSkgQUYgU2FtcGxlUmF0ZSgldSlcbiIsCisvLyAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXQsIG1BZkxhdGVuY3ksIG1BZkZyYW1lQ291bnQsIG1BZlNhbXBsZVJhdGUpOworICAgIDo6d3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCithdWRpb19wb3J0X2hhbmRsZV90IEpBdWRpb1RyYWNrOjpnZXRSb3V0ZWREZXZpY2VJZCgpIHsKKyAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBqbWV0aG9kSUQgakdldFJvdXRlZERldmljZSA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJnZXRSb3V0ZWREZXZpY2UiLAorICAgICAgICAgICAgIigpTGFuZHJvaWQvbWVkaWEvQXVkaW9EZXZpY2VJbmZvOyIpOworICAgIGpvYmplY3QgakF1ZGlvRGV2aWNlSW5mb09iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldFJvdXRlZERldmljZSk7CisgICAgaWYgKGVudi0+SXNTYW1lT2JqZWN0KGpBdWRpb0RldmljZUluZm9PYmosIE5VTEwpKSB7CisgICAgICAgIHJldHVybiBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgIH0KKworICAgIGpjbGFzcyBqQXVkaW9EZXZpY2VJbmZvQ2xzID0gZW52LT5GaW5kQ2xhc3MoIkxhbmRyb2lkL21lZGlhL0F1ZGlvRGV2aWNlSW5mbyIpOworICAgIGptZXRob2RJRCBqR2V0SWQgPSBlbnYtPkdldE1ldGhvZElEKGpBdWRpb0RldmljZUluZm9DbHMsICJnZXRJZCIsICIoKUkiKTsKKyAgICBqaW50IHJvdXRlZERldmljZUlkID0gZW52LT5DYWxsSW50TWV0aG9kKGpBdWRpb0RldmljZUluZm9PYmosIGpHZXRJZCk7CisgICAgcmV0dXJuIHJvdXRlZERldmljZUlkOworfQorCithdWRpb19zZXNzaW9uX3QgSkF1ZGlvVHJhY2s6OmdldEF1ZGlvU2Vzc2lvbklkKCkgeworICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGptZXRob2RJRCBqR2V0QXVkaW9TZXNzaW9uSWQgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAiZ2V0QXVkaW9TZXNzaW9uSWQiLCAiKClJIik7CisgICAgamludCBzZXNzaW9uSWQgPSBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRBdWRpb1Nlc3Npb25JZCk7CisgICAgcmV0dXJuIChhdWRpb19zZXNzaW9uX3QpIHNlc3Npb25JZDsKK30KKworc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OnNldE91dHB1dERldmljZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKSB7CisgICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgamNsYXNzIGpNUDJJbXBsQ2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvTWVkaWFQbGF5ZXIySW1wbCIpOworICAgIGptZXRob2RJRCBqU2V0QXVkaW9PdXRwdXREZXZpY2VCeUlkID0gZW52LT5HZXRNZXRob2RJRCgKKyAgICAgICAgICAgIGpNUDJJbXBsQ2xzLCAic2V0QXVkaW9PdXRwdXREZXZpY2VCeUlkIiwgIihMYW5kcm9pZC9tZWRpYS9BdWRpb1RyYWNrO0kpWiIpOworICAgIGpib29sZWFuIHJlc3VsdCA9IGVudi0+Q2FsbFN0YXRpY0Jvb2xlYW5NZXRob2QoCisgICAgICAgICAgICBqTVAySW1wbENscywgalNldEF1ZGlvT3V0cHV0RGV2aWNlQnlJZCwgbUF1ZGlvVHJhY2tPYmosIGRldmljZUlkKTsKKyAgICByZXR1cm4gcmVzdWx0ID09IHRydWUgPyBOT19FUlJPUiA6IEJBRF9WQUxVRTsKK30KKworc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OnBlbmRpbmdEdXJhdGlvbihpbnQzMl90ICptc2VjKSB7CisgICAgaWYgKG1zZWMgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGJvb2wgaXNQdXJlUGNtRGF0YSA9IGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KCkpICYmIChnZXRGbGFncygpICYgQVVESU9fRkxBR19IV19BVl9TWU5DKSA9PSAwOworICAgIGlmICghaXNQdXJlUGNtRGF0YSkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgLy8gVE9ETzogTmVlZCB0byBrbm93IHRoZSBkaWZmZXJlbmNlIGJ0dy4gY2xpZW50IGFuZCBzZXJ2ZXIgdGltZS4KKyAgICAvLyBJZiBnZXRUaW1lc3RhbXAoRXh0ZW5kZWRUaW1lc3RhbXApIGlzIHJlYWR5LCBhbmQgdW4tY29tbWVudCBiZWxvdyBhbmQgbW9kaWZ5IGFwcHJvcHJpYXRlbHkuCisgICAgLy8gKGNvcGllZCBmcm9tIEF1ZGlvVHJhY2suY3BwKQorCisvLyAgICBFeHRlbmRlZFRpbWVzdGFtcCBldHM7CisvLyAgICBFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT04gbG9jYXRpb24gPSBFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSOworLy8gICAgaWYgKGdldFRpbWVzdGFtcF9sKCZldHMpID09IE9LICYmIGV0cy5tVGltZU5zW2xvY2F0aW9uXSA+IDApIHsKKy8vICAgICAgICBpbnQ2NF90IGRpZmYgPSBldHMubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9DTElFTlRdCisvLyAgICAgICAgICAgICAgICAtIGV0cy5tUG9zaXRpb25bbG9jYXRpb25dOworLy8gICAgICAgIGlmIChkaWZmIDwgMCkgeworLy8gICAgICAgICAgICAqbXNlYyA9IDA7CisvLyAgICAgICAgfSBlbHNlIHsKKy8vICAgICAgICAgICAgLy8gbXMgaXMgdGhlIHBsYXliYWNrIHRpbWUgYnkgZnJhbWVzCisvLyAgICAgICAgICAgIGludDY0X3QgbXMgPSAoaW50NjRfdCkoKGRvdWJsZSlkaWZmICogMTAwMCAvCisvLyAgICAgICAgICAgICAgICAgICAgKChkb3VibGUpbVNhbXBsZVJhdGUgKiBtUGxheWJhY2tSYXRlLm1TcGVlZCkpOworLy8gICAgICAgICAgICAvLyBjbG9ja2RpZmYgaXMgdGhlIHRpbWVzdGFtcCBhZ2UgKG5lZ2F0aXZlKQorLy8gICAgICAgICAgICBpbnQ2NF90IGNsb2NrZGlmZiA9IChtU3RhdGUgIT0gU1RBVEVfQUNUSVZFKSA/IDAgOgorLy8gICAgICAgICAgICAgICAgICAgIGV0cy5tVGltZU5zW2xvY2F0aW9uXQorLy8gICAgICAgICAgICAgICAgICAgICsgZXRzLm1UaW1lYmFzZU9mZnNldFtFeHRlbmRlZFRpbWVzdGFtcDo6VElNRUJBU0VfTU9OT1RPTklDXQorLy8gICAgICAgICAgICAgICAgICAgIC0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOworLy8KKy8vICAgICAgICAgICAgLy9BTE9HVigibXM6ICVsbGQgIGNsb2NrZGlmZjogJWxsZCIsIChsb25nIGxvbmcpbXMsIChsb25nIGxvbmcpY2xvY2tkaWZmKTsKKy8vICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludCBOQU5PU19QRVJfTUlMTElTID0gMTAwMDAwMDsKKy8vICAgICAgICAgICAgKm1zZWMgPSAoaW50MzJfdCkobXMgKyBjbG9ja2RpZmYgLyBOQU5PU19QRVJfTUlMTElTKTsKKy8vICAgICAgICB9CisvLyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworLy8gICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBKQXVkaW9UcmFjazo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjaygKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjayBfX3VudXNlZCkgeworICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzIGFmdGVyIGFwcHJvcHJpYXRlIEphdmEgQXVkaW9UcmFjayBtZXRob2QgaXMgYXZhaWxhYmxlLgorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soCisgICAgICAgIGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2sgX191bnVzZWQpIHsKKyAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdGhpcyBhZnRlciBhcHByb3ByaWF0ZSBKYXZhIEF1ZGlvVHJhY2sgbWV0aG9kIGlzIGF2YWlsYWJsZS4KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLyAgICAgICAgICAgICAgICBQcml2YXRlIG1ldGhvZCBiZWdpbnMgICAgICAgICAgICAgICAgICAvLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworam9iamVjdCBKQXVkaW9UcmFjazo6Y3JlYXRlVm9sdW1lU2hhcGVyQ29uZmlndXJhdGlvbk9iaigKKyAgICAgICAgY29uc3Qgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4mIGNvbmZpZykgeworCisgICAgLy8gVE9ETzogSmF2YSBWb2x1bWVTaGFwZXIncyBzZXRJZCgpIC8gc2V0T3B0aW9uRmxhZ3MoKSBhcmUgaGlkZGVuLgorICAgIGlmIChjb25maWcgPT0gTlVMTCB8fCBjb25maWctPmdldFR5cGUoKSA9PSBtZWRpYTo6Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uOjpUWVBFX0lEKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworCisgICAgLy8gUmVmZXJlbmNlZCAiYW5kcm9pZF9tZWRpYV9Wb2x1bWVTaGFwZXIuaCIuCisgICAgamZsb2F0QXJyYXkgeGFycmF5ID0gbnVsbHB0cjsKKyAgICBqZmxvYXRBcnJheSB5YXJyYXkgPSBudWxscHRyOworICAgIGlmIChjb25maWctPmdldFR5cGUoKSA9PSBtZWRpYTo6Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uOjpUWVBFX1NDQUxFKSB7CisgICAgICAgIC8vIGNvbnZlcnQgY3VydmUgYXJyYXlzCisgICAgICAgIHhhcnJheSA9IGVudi0+TmV3RmxvYXRBcnJheShjb25maWctPnNpemUoKSk7CisgICAgICAgIHlhcnJheSA9IGVudi0+TmV3RmxvYXRBcnJheShjb25maWctPnNpemUoKSk7CisgICAgICAgIGZsb2F0ICogY29uc3QgeCA9IGVudi0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKHhhcnJheSwgbnVsbHB0ciAvKiBpc0NvcHkgKi8pOworICAgICAgICBmbG9hdCAqIGNvbnN0IHkgPSBlbnYtPkdldEZsb2F0QXJyYXlFbGVtZW50cyh5YXJyYXksIG51bGxwdHIgLyogaXNDb3B5ICovKTsKKyAgICAgICAgZmxvYXQgKnhwdHIgPSB4LCAqeXB0ciA9IHk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcHQgOiAqY29uZmlnLmdldCgpKSB7CisgICAgICAgICAgICAqeHB0cisrID0gcHQuZmlyc3Q7CisgICAgICAgICAgICAqeXB0cisrID0gcHQuc2Vjb25kOworICAgICAgICB9CisgICAgICAgIGVudi0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyh4YXJyYXksIHgsIDAgLyogbW9kZSAqLyk7CisgICAgICAgIGVudi0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyh5YXJyYXksIHksIDAgLyogbW9kZSAqLyk7CisgICAgfQorCisgICAgamNsYXNzIGpCdWlsZGVyQ2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyJENvbmZpZ3VyYXRpb24kQnVpbGRlciIpOworICAgIGptZXRob2RJRCBqQnVpbGRlckN0b3IgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAiPGluaXQ+IiwgIigpViIpOworICAgIGpvYmplY3QgakJ1aWxkZXJPYmogPSBlbnYtPk5ld09iamVjdChqQnVpbGRlckNscywgakJ1aWxkZXJDdG9yKTsKKworICAgIGptZXRob2RJRCBqU2V0RHVyYXRpb24gPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAic2V0RHVyYXRpb24iLAorICAgICAgICAgICAgIihMKUxhbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlciRDb25maWd1cmF0aW9uJEJ1aWxkZXI7Iik7CisgICAgakJ1aWxkZXJPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoakJ1aWxkZXJDbHMsIGpTZXREdXJhdGlvbiwgKGpsb25nKSBjb25maWctPmdldER1cmF0aW9uTXMoKSk7CisKKyAgICBqbWV0aG9kSUQgalNldEludGVycG9sYXRvclR5cGUgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAic2V0SW50ZXJwb2xhdG9yVHlwZSIsCisgICAgICAgICAgICAiKEkpTGFuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyJENvbmZpZ3VyYXRpb24kQnVpbGRlcjsiKTsKKyAgICBqQnVpbGRlck9iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChqQnVpbGRlckNscywgalNldEludGVycG9sYXRvclR5cGUsCisgICAgICAgICAgICBjb25maWctPmdldEludGVycG9sYXRvclR5cGUoKSk7CisKKyAgICBqbWV0aG9kSUQgalNldEN1cnZlID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgInNldEN1cnZlIiwKKyAgICAgICAgICAgICIoW0ZbRilMYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXIkQ29uZmlndXJhdGlvbiRCdWlsZGVyOyIpOworICAgIGpCdWlsZGVyT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGpCdWlsZGVyQ2xzLCBqU2V0Q3VydmUsIHhhcnJheSwgeWFycmF5KTsKKworICAgIGptZXRob2RJRCBqQnVpbGQgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAiYnVpbGQiLAorICAgICAgICAgICAgIigpTGFuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyJENvbmZpZ3VyYXRpb247Iik7CisgICAgcmV0dXJuIGVudi0+Q2FsbE9iamVjdE1ldGhvZChqQnVpbGRlck9iaiwgakJ1aWxkKTsKK30KKworam9iamVjdCBKQXVkaW9UcmFjazo6Y3JlYXRlVm9sdW1lU2hhcGVyT3BlcmF0aW9uT2JqKAorICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+JiBvcGVyYXRpb24pIHsKKworICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworCisgICAgamNsYXNzIGpCdWlsZGVyQ2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyJE9wZXJhdGlvbiRCdWlsZGVyIik7CisgICAgam1ldGhvZElEIGpCdWlsZGVyQ3RvciA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICI8aW5pdD4iLCAiKClWIik7CisgICAgam9iamVjdCBqQnVpbGRlck9iaiA9IGVudi0+TmV3T2JqZWN0KGpCdWlsZGVyQ2xzLCBqQnVpbGRlckN0b3IpOworCisgICAgLy8gU2V0IFhPZmZzZXQKKyAgICBqbWV0aG9kSUQgalNldFhPZmZzZXQgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAic2V0WE9mZnNldCIsCisgICAgICAgICAgICAiKEYpTGFuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyJE9wZXJhdGlvbiRCdWlsZGVyOyIpOworICAgIGpCdWlsZGVyT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGpCdWlsZGVyQ2xzLCBqU2V0WE9mZnNldCwgb3BlcmF0aW9uLT5nZXRYT2Zmc2V0KCkpOworCisgICAgaW50MzJfdCBmbGFncyA9IG9wZXJhdGlvbi0+Z2V0RmxhZ3MoKTsKKworICAgIGlmIChvcGVyYXRpb24tPmdldFJlcGxhY2VJZCgpID49IDApIHsKKyAgICAgICAgam1ldGhvZElEIGpSZXBsYWNlID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgInJlcGxhY2UiLAorICAgICAgICAgICAgICAgICIoSUIpTGFuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyJE9wZXJhdGlvbiRCdWlsZGVyOyIpOworICAgICAgICBib29sIGpvaW4gPSAoZmxhZ3MgfCBtZWRpYTo6Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb246OkZMQUdfSk9JTikgIT0gMDsKKyAgICAgICAgakJ1aWxkZXJPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoakJ1aWxkZXJDbHMsIGpSZXBsYWNlLCBvcGVyYXRpb24tPmdldFJlcGxhY2VJZCgpLCBqb2luKTsKKyAgICB9CisKKyAgICBpZiAoZmxhZ3MgfCBtZWRpYTo6Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb246OkZMQUdfUkVWRVJTRSkgeworICAgICAgICBqbWV0aG9kSUQgalJldmVyc2UgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAicmV2ZXJzZSIsCisgICAgICAgICAgICAgICAgIigpTGFuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyJE9wZXJhdGlvbiRCdWlsZGVyOyIpOworICAgICAgICBqQnVpbGRlck9iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChqQnVpbGRlckNscywgalJldmVyc2UpOworICAgIH0KKworICAgIC8vIFRPRE86IFZvbHVtZVNoYXBlciBKYXZhZG9jIHNheXMgIkRvIG5vdCBjYWxsIHRlcm1pbmF0ZSgpIGRpcmVjdGx5Ii4gQ2FuIHdlIGNhbGwgdGhpcz8KKyAgICBpZiAoZmxhZ3MgfCBtZWRpYTo6Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb246OkZMQUdfVEVSTUlOQVRFKSB7CisgICAgICAgIGptZXRob2RJRCBqVGVybWluYXRlID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgInRlcm1pbmF0ZSIsCisgICAgICAgICAgICAgICAgIigpTGFuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyJE9wZXJhdGlvbiRCdWlsZGVyOyIpOworICAgICAgICBqQnVpbGRlck9iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChqQnVpbGRlckNscywgalRlcm1pbmF0ZSk7CisgICAgfQorCisgICAgaWYgKGZsYWdzIHwgbWVkaWE6OlZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uOjpGTEFHX0RFTEFZKSB7CisgICAgICAgIGptZXRob2RJRCBqRGVmZXIgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAiZGVmZXIiLAorICAgICAgICAgICAgICAgICIoKUxhbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlciRPcGVyYXRpb24kQnVpbGRlcjsiKTsKKyAgICAgICAgakJ1aWxkZXJPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoakJ1aWxkZXJDbHMsIGpEZWZlcik7CisgICAgfQorCisgICAgaWYgKGZsYWdzIHwgbWVkaWE6OlZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uOjpGTEFHX0NSRUFURV9JRl9ORUNFU1NBUlkpIHsKKyAgICAgICAgam1ldGhvZElEIGpDcmVhdGVJZk5lZWRlZCA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICJjcmVhdGVJZk5lZWRlZCIsCisgICAgICAgICAgICAgICAgIigpTGFuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyJE9wZXJhdGlvbiRCdWlsZGVyOyIpOworICAgICAgICBqQnVpbGRlck9iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChqQnVpbGRlckNscywgakNyZWF0ZUlmTmVlZGVkKTsKKyAgICB9CisKKyAgICAvLyBUT0RPOiBIYW5kbGUgZXJyb3IgY2FzZSAoY2FuIGl0IGJlIE5VTEw/KQorICAgIGptZXRob2RJRCBqQnVpbGQgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAiYnVpbGQiLAorICAgICAgICAgICAgIigpTGFuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyJE9wZXJhdGlvbjsiKTsKKyAgICByZXR1cm4gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGpCdWlsZGVyT2JqLCBqQnVpbGQpOworfQorCitqb2JqZWN0IEpBdWRpb1RyYWNrOjpjcmVhdGVTdHJlYW1FdmVudENhbGxiYWNrKGNhbGxiYWNrX3QgY2JmLCB2b2lkKiB1c2VyKSB7CisgICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgamNsYXNzIGpDYWxsYmFja0NscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL01lZGlhUGxheWVyMkltcGwkU3RyZWFtRXZlbnRDYWxsYmFjayIpOworICAgIGptZXRob2RJRCBqQ2FsbGJhY2tDdG9yID0gZW52LT5HZXRNZXRob2RJRChqQ2FsbGJhY2tDbHMsICI8aW5pdD4iLCAiKEpKSilWIik7CisgICAgam9iamVjdCBqQ2FsbGJhY2tPYmogPSBlbnYtPk5ld09iamVjdChqQ2FsbGJhY2tDbHMsIGpDYWxsYmFja0N0b3IsIHRoaXMsIGNiZiwgdXNlcik7CisgICAgcmV0dXJuIGpDYWxsYmFja09iajsKK30KKworam9iamVjdCBKQXVkaW9UcmFjazo6Y3JlYXRlQ2FsbGJhY2tFeGVjdXRvcigpIHsKKyAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBqY2xhc3MgakV4ZWN1dG9yc0NscyA9IGVudi0+RmluZENsYXNzKCJqYXZhL3V0aWwvY29uY3VycmVudC9FeGVjdXRvcnMiKTsKKyAgICBqbWV0aG9kSUQgak5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yID0gZW52LT5HZXRTdGF0aWNNZXRob2RJRChqRXhlY3V0b3JzQ2xzLAorICAgICAgICAgICAgIm5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yIiwgIigpTGphdmEvdXRpbC9jb25jdXJyZW50L0V4ZWN1dG9yU2VydmljZTsiKTsKKyAgICBqb2JqZWN0IGpTaW5nbGVUaHJlYWRFeGVjdXRvck9iaiA9CisgICAgICAgICAgICBlbnYtPkNhbGxTdGF0aWNPYmplY3RNZXRob2QoakV4ZWN1dG9yc0Nscywgak5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yKTsKKyAgICByZXR1cm4galNpbmdsZVRocmVhZEV4ZWN1dG9yT2JqOworfQorCitzdGF0dXNfdCBKQXVkaW9UcmFjazo6amF2YVRvTmF0aXZlU3RhdHVzKGludCBqYXZhU3RhdHVzKSB7CisgICAgc3dpdGNoIChqYXZhU3RhdHVzKSB7CisgICAgY2FzZSBBVURJT19KQVZBX1NVQ0NFU1M6CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICBjYXNlIEFVRElPX0pBVkFfQkFEX1ZBTFVFOgorICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIGNhc2UgQVVESU9fSkFWQV9JTlZBTElEX09QRVJBVElPTjoKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIGNhc2UgQVVESU9fSkFWQV9QRVJNSVNTSU9OX0RFTklFRDoKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIGNhc2UgQVVESU9fSkFWQV9OT19JTklUOgorICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICBjYXNlIEFVRElPX0pBVkFfV09VTERfQkxPQ0s6CisgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKKyAgICBjYXNlIEFVRElPX0pBVkFfREVBRF9PQkpFQ1Q6CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJBdWRpb091dHB1dC5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZTFkMWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQuY3BwCkBAIC0wLDAgKzEsNzI3IEBACisvKgorKioKKyoqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0IgorI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJBdWRpb091dHB1dC5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4gLy8gZm9yIHByb3BlcnR5X2dldAorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1RyYWNrLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKworbmFtZXNwYWNlIHsKKworY29uc3QgZmxvYXQga01heFJlcXVpcmVkU3BlZWQgPSA4LjBmOyAvLyBmb3IgUENNIHRyYWNrcyBhbGxvdyB1cCB0byA4eCBzcGVlZHVwLgorCit9IC8vIGFub255bW91cyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBUT0RPOiBGaW5kIHJlYWwgY2F1c2Ugb2YgQXVkaW8vVmlkZW8gZGVsYXkgaW4gUFYgZnJhbWV3b3JrIGFuZCByZW1vdmUgdGhpcyB3b3JrYXJvdW5kCisvKiBzdGF0aWMgKi8gaW50IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjptTWluQnVmZmVyQ291bnQgPSA0OworLyogc3RhdGljICovIGJvb2wgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6Om1Jc09uRW11bGF0b3IgPSBmYWxzZTsKKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdCB7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisKKyAgICByZXN1bHQuYXBwZW5kKCIgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXRcbiIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgMjU1LCAiICBzdHJlYW0gdHlwZSglZCksIGxlZnQgLSByaWdodCB2b2x1bWUoJWYsICVmKVxuIiwKKyAgICAgICAgICAgIG1TdHJlYW1UeXBlLCBtTGVmdFZvbHVtZSwgbVJpZ2h0Vm9sdW1lKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCAyNTUsICIgIG1zZWMgcGVyIGZyYW1lKCVmKSwgbGF0ZW5jeSAoJWQpXG4iLAorICAgICAgICAgICAgbU1zZWNzUGVyRnJhbWUsIChtVHJhY2sgIT0gMCkgPyBtVHJhY2stPmxhdGVuY3koKSA6IC0xKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCAyNTUsICIgIGF1eCBlZmZlY3QgaWQoJWQpLCBzZW5kIGxldmVsICglZilcbiIsCisgICAgICAgICAgICBtQXV4RWZmZWN0SWQsIG1TZW5kTGV2ZWwpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKworICAgIDo6d3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgaWYgKG1UcmFjayAhPSAwKSB7CisgICAgICAgIG1UcmFjay0+ZHVtcChmZCwgYXJncyk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6Ok1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0KGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsIHVpZF90IHVpZCwgaW50IHBpZCwKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBhdHRyLCBjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGRldmljZUNhbGxiYWNrKQorICAgIDogbUNhbGxiYWNrKE5VTEwpLAorICAgICAgbUNhbGxiYWNrQ29va2llKE5VTEwpLAorICAgICAgbUNhbGxiYWNrRGF0YShOVUxMKSwKKyAgICAgIG1TdHJlYW1UeXBlKEFVRElPX1NUUkVBTV9NVVNJQyksCisgICAgICBtTGVmdFZvbHVtZSgxLjApLAorICAgICAgbVJpZ2h0Vm9sdW1lKDEuMCksCisgICAgICBtUGxheWJhY2tSYXRlKEFVRElPX1BMQVlCQUNLX1JBVEVfREVGQVVMVCksCisgICAgICBtU2FtcGxlUmF0ZUh6KDApLAorICAgICAgbU1zZWNzUGVyRnJhbWUoMCksCisgICAgICBtRnJhbWVTaXplKDApLAorICAgICAgbVNlc3Npb25JZChzZXNzaW9uSWQpLAorICAgICAgbVVpZCh1aWQpLAorICAgICAgbVBpZChwaWQpLAorICAgICAgbVNlbmRMZXZlbCgwLjApLAorICAgICAgbUF1eEVmZmVjdElkKDApLAorICAgICAgbUZsYWdzKEFVRElPX09VVFBVVF9GTEFHX05PTkUpLAorICAgICAgbVNlbGVjdGVkRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSksCisgICAgICBtUm91dGVkRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSksCisgICAgICBtRGV2aWNlQ2FsbGJhY2tFbmFibGVkKGZhbHNlKSwKKyAgICAgIG1EZXZpY2VDYWxsYmFjayhkZXZpY2VDYWxsYmFjaykgeworICAgIEFMT0dWKCJNZWRpYVBsYXllcjJBdWRpb091dHB1dCglZCkiLCBzZXNzaW9uSWQpOworICAgIGlmIChhdHRyICE9IE5VTEwpIHsKKyAgICAgICAgbUF0dHJpYnV0ZXMgPSAoYXVkaW9fYXR0cmlidXRlc190ICopIGNhbGxvYygxLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CisgICAgICAgIGlmIChtQXR0cmlidXRlcyAhPSBOVUxMKSB7CisgICAgICAgICAgICBtZW1jcHkobUF0dHJpYnV0ZXMsIGF0dHIsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgICAgIG1TdHJlYW1UeXBlID0gYXVkaW9fYXR0cmlidXRlc190b19zdHJlYW1fdHlwZShhdHRyKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1BdHRyaWJ1dGVzID0gTlVMTDsKKyAgICB9CisKKyAgICBzZXRNaW5CdWZmZXJDb3VudCgpOworfQorCitNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6fk1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0KCkgeworICAgIGNsb3NlKCk7CisgICAgZnJlZShtQXR0cmlidXRlcyk7CisgICAgZGVsZXRlIG1DYWxsYmFja0RhdGE7Cit9CisKKy8vc3RhdGljCit2b2lkIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpzZXRNaW5CdWZmZXJDb3VudCgpIHsKKyAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgaWYgKHByb3BlcnR5X2dldCgicm8ua2VybmVsLnFlbXUiLCB2YWx1ZSwgMCkpIHsKKyAgICAgICAgbUlzT25FbXVsYXRvciA9IHRydWU7CisgICAgICAgIG1NaW5CdWZmZXJDb3VudCA9IDEyOyAgLy8gdG8gcHJldmVudCBzeXN0ZW1hdGljIGJ1ZmZlciB1bmRlcnJ1biBmb3IgZW11bGF0b3IKKyAgICB9Cit9CisKKy8vIHN0YXRpYworYm9vbCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6aXNPbkVtdWxhdG9yKCkgeworICAgIHNldE1pbkJ1ZmZlckNvdW50KCk7ICAvLyBiZW5pZ24gcmFjZSB3cnQgb3RoZXIgdGhyZWFkcworICAgIHJldHVybiBtSXNPbkVtdWxhdG9yOworfQorCisvLyBzdGF0aWMKK2ludCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0TWluQnVmZmVyQ291bnQoKSB7CisgICAgc2V0TWluQnVmZmVyQ291bnQoKTsgIC8vIGJlbmlnbiByYWNlIHdydCBvdGhlciB0aHJlYWRzCisgICAgcmV0dXJuIG1NaW5CdWZmZXJDb3VudDsKK30KKworc3NpemVfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6YnVmZmVyU2l6ZSgpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKG1UcmFjayA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbVRyYWNrLT5mcmFtZUNvdW50KCkgKiBtRnJhbWVTaXplOworfQorCitzc2l6ZV90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpmcmFtZUNvdW50KCkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobVRyYWNrID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtVHJhY2stPmZyYW1lQ291bnQoKTsKK30KKworc3NpemVfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Y2hhbm5lbENvdW50KCkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobVRyYWNrID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtVHJhY2stPmNoYW5uZWxDb3VudCgpOworfQorCitzc2l6ZV90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpmcmFtZVNpemUoKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGlmIChtVHJhY2sgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1GcmFtZVNpemU7Cit9CisKK3VpbnQzMl90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpsYXRlbmN5ICgpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKG1UcmFjayA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gbVRyYWNrLT5sYXRlbmN5KCk7Cit9CisKK2Zsb2F0IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0Ojptc2Vjc1BlckZyYW1lKCkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gbU1zZWNzUGVyRnJhbWU7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRQb3NpdGlvbih1aW50MzJfdCAqcG9zaXRpb24pIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKG1UcmFjayA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbVRyYWNrLT5nZXRQb3NpdGlvbihwb3NpdGlvbik7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAgJnRzKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGlmIChtVHJhY2sgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1UcmFjay0+Z2V0VGltZXN0YW1wKHRzKTsKK30KKworLy8gVE9ETzogUmVtb3ZlIHVubmVjZXNzYXJ5IGNhbGxzIHRvIGdldFBsYXllZE91dER1cmF0aW9uVXMoKQorLy8gYXMgaXQgYWNxdWlyZXMgbG9ja3MgYW5kIG1heSBxdWVyeSB0aGUgYXVkaW8gZHJpdmVyLgorLy8KKy8vIFNvbWUgY2FsbHMgY291bGQgY29uY2VpdmFibHkgcmV0cmlldmUgZXh0cmFwb2xhdGVkIGRhdGEgaW5zdGVhZCBvZgorLy8gYWNjZXNzaW5nIGdldFRpbWVzdGFtcCgpIG9yIGdldFBvc2l0aW9uKCkgZXZlcnkgdGltZSBhIGRhdGEgYnVmZmVyIHdpdGgKKy8vIGEgbWVkaWEgdGltZSBpcyByZWNlaXZlZC4KKy8vCisvLyBDYWxjdWxhdGUgZHVyYXRpb24gb2YgcGxheWVkIHNhbXBsZXMgaWYgcGxheWVkIGF0IG5vcm1hbCByYXRlIChpLmUuLCAxLjApLgoraW50NjRfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0UGxheWVkT3V0RHVyYXRpb25VcyhpbnQ2NF90IG5vd1VzKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGlmIChtVHJhY2sgPT0gMCB8fCBtU2FtcGxlUmF0ZUh6ID09IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdWludDMyX3QgbnVtRnJhbWVzUGxheWVkOworICAgIGludDY0X3QgbnVtRnJhbWVzUGxheWVkQXRVczsKKyAgICBBdWRpb1RpbWVzdGFtcCB0czsKKworICAgIHN0YXR1c190IHJlcyA9IG1UcmFjay0+Z2V0VGltZXN0YW1wKHRzKTsKKyAgICBpZiAocmVzID09IE9LKSB7ICAgICAgICAgICAgICAgICAvLyBjYXNlIDE6IG1peGluZyBhdWRpbyB0cmFja3MgYW5kIG9mZmxvYWRlZCB0cmFja3MuCisgICAgICAgIG51bUZyYW1lc1BsYXllZCA9IHRzLm1Qb3NpdGlvbjsKKyAgICAgICAgbnVtRnJhbWVzUGxheWVkQXRVcyA9IHRzLm1UaW1lLnR2X3NlYyAqIDEwMDAwMDBMTCArIHRzLm1UaW1lLnR2X25zZWMgLyAxMDAwOworICAgICAgICAvL0FMT0dEKCJnZXRUaW1lc3RhbXA6IE9LICVkICVsbGQiLCBudW1GcmFtZXNQbGF5ZWQsIChsb25nIGxvbmcpbnVtRnJhbWVzUGxheWVkQXRVcyk7CisgICAgfSBlbHNlIGlmIChyZXMgPT0gV09VTERfQkxPQ0spIHsgLy8gY2FzZSAyOiB0cmFuc2l0b3J5IHN0YXRlIG9uIHN0YXJ0IG9mIGEgbmV3IHRyYWNrCisgICAgICAgIG51bUZyYW1lc1BsYXllZCA9IDA7CisgICAgICAgIG51bUZyYW1lc1BsYXllZEF0VXMgPSBub3dVczsKKyAgICAgICAgLy9BTE9HRCgiZ2V0VGltZXN0YW1wOiBXT1VMRF9CTE9DSyAlZCAlbGxkIiwKKyAgICAgICAgLy8gICAgICAgIG51bUZyYW1lc1BsYXllZCwgKGxvbmcgbG9uZyludW1GcmFtZXNQbGF5ZWRBdFVzKTsKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXNlIDM6IHRyYW5zaXRvcnkgYXQgbmV3IHRyYWNrIG9yIGF1ZGlvIGZhc3QgdHJhY2tzLgorICAgICAgICByZXMgPSBtVHJhY2stPmdldFBvc2l0aW9uKCZudW1GcmFtZXNQbGF5ZWQpOworICAgICAgICBDSEVDS19FUShyZXMsIChzdGF0dXNfdClPSyk7CisgICAgICAgIG51bUZyYW1lc1BsYXllZEF0VXMgPSBub3dVczsKKyAgICAgICAgbnVtRnJhbWVzUGxheWVkQXRVcyArPSAxMDAwTEwgKiBtVHJhY2stPmxhdGVuY3koKSAvIDI7IC8qIFhYWCAqLworICAgICAgICAvL0FMT0dEKCJnZXRQb3NpdGlvbjogJXUgJWxsZCIsIG51bUZyYW1lc1BsYXllZCwgKGxvbmcgbG9uZyludW1GcmFtZXNQbGF5ZWRBdFVzKTsKKyAgICB9CisKKyAgICAvLyBDSEVDS19FUShudW1GcmFtZXNQbGF5ZWQgJiAoMSA8PCAzMSksIDApOyAgLy8gY2FuJ3QgYmUgbmVnYXRpdmUgdW50aWwgMTIuNCBocnMsIHRlc3QKKyAgICAvLyBUT0RPOiByZW1vdmUgdGhlIChpbnQzMl90KSBjYXN0aW5nIGJlbG93IGFzIGl0IG1heSBvdmVyZmxvdyBhdCAxMi40IGhvdXJzLgorICAgIGludDY0X3QgZHVyYXRpb25VcyA9IChpbnQ2NF90KSgoaW50MzJfdCludW1GcmFtZXNQbGF5ZWQgKiAxMDAwMDAwTEwgLyBtU2FtcGxlUmF0ZUh6KQorICAgICAgICAgICAgKyBub3dVcyAtIG51bUZyYW1lc1BsYXllZEF0VXM7CisgICAgaWYgKGR1cmF0aW9uVXMgPCAwKSB7CisgICAgICAgIC8vIE9jY3VycyB3aGVuIG51bUZyYW1lc1BsYXllZCBwb3NpdGlvbiBpcyB2ZXJ5IHNtYWxsIGFuZCB0aGUgZm9sbG93aW5nOgorICAgICAgICAvLyAoMSkgSW4gY2FzZSAxLCB0aGUgdGltZSBub3dVcyBpcyBjb21wdXRlZCBiZWZvcmUgZ2V0VGltZXN0YW1wKCkgaXMgY2FsbGVkIGFuZAorICAgICAgICAvLyAgICAgbnVtRnJhbWVzUGxheWVkQXRVcyBpcyBncmVhdGVyIHRoYW4gbm93VXMgYnkgdGltZSBtb3JlIHRoYW4gbnVtRnJhbWVzUGxheWVkLgorICAgICAgICAvLyAoMikgSW4gY2FzZSAzLCB1c2luZyBnZXRQb3NpdGlvbiBhbmQgYWRkaW5nIG1BdWRpb1NpbmstPmxhdGVuY3koKSB0bworICAgICAgICAvLyAgICAgbnVtRnJhbWVzUGxheWVkQXRVcywgYnkgYSB0aW1lIGFtb3VudCBncmVhdGVyIHRoYW4gbnVtRnJhbWVzUGxheWVkLgorICAgICAgICAvLworICAgICAgICAvLyBCb3RoIG9mIHRoZXNlIGFyZSB0cmFuc2l0b3J5IGNvbmRpdGlvbnMuCisgICAgICAgIEFMT0dWKCJnZXRQbGF5ZWRPdXREdXJhdGlvblVzOiBuZWdhdGl2ZSBkdXJhdGlvbiAlbGxkIHNldCB0byB6ZXJvIiwgKGxvbmcgbG9uZylkdXJhdGlvblVzKTsKKyAgICAgICAgZHVyYXRpb25VcyA9IDA7CisgICAgfQorICAgIEFMT0dWKCJnZXRQbGF5ZWRPdXREdXJhdGlvblVzKCVsbGQpIG5vd1VzKCVsbGQpIGZyYW1lcygldSkgZnJhbWVzQXQoJWxsZCkiLAorICAgICAgICAgICAgKGxvbmcgbG9uZylkdXJhdGlvblVzLCAobG9uZyBsb25nKW5vd1VzLAorICAgICAgICAgICAgbnVtRnJhbWVzUGxheWVkLCAobG9uZyBsb25nKW51bUZyYW1lc1BsYXllZEF0VXMpOworICAgIHJldHVybiBkdXJhdGlvblVzOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0RnJhbWVzV3JpdHRlbih1aW50MzJfdCAqZnJhbWVzd3JpdHRlbikgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobVRyYWNrID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIEV4dGVuZGVkVGltZXN0YW1wIGV0czsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtVHJhY2stPmdldFRpbWVzdGFtcCgmZXRzKTsKKyAgICBpZiAoc3RhdHVzID09IE9LIHx8IHN0YXR1cyA9PSBXT1VMRF9CTE9DSykgeworICAgICAgICAqZnJhbWVzd3JpdHRlbiA9ICh1aW50MzJfdClldHMubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9DTElFTlRdOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGlmIChtVHJhY2sgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1UcmFjay0+c2V0UGFyYW1ldGVycyhrZXlWYWx1ZVBhaXJzKTsKK30KKworU3RyaW5nOCAgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cykgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobVRyYWNrID09IDApIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZzg6OmVtcHR5KCk7CisgICAgfQorICAgIHJldHVybiBtVHJhY2stPmdldFBhcmFtZXRlcnMoa2V5cyk7Cit9CisKK3ZvaWQgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OnNldEF1ZGlvQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKiBhdHRyaWJ1dGVzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGlmIChhdHRyaWJ1dGVzID09IE5VTEwpIHsKKyAgICAgICAgZnJlZShtQXR0cmlidXRlcyk7CisgICAgICAgIG1BdHRyaWJ1dGVzID0gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobUF0dHJpYnV0ZXMgPT0gTlVMTCkgeworICAgICAgICAgICAgbUF0dHJpYnV0ZXMgPSAoYXVkaW9fYXR0cmlidXRlc190ICopIGNhbGxvYygxLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KG1BdHRyaWJ1dGVzLCBhdHRyaWJ1dGVzLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CisgICAgICAgIG1TdHJlYW1UeXBlID0gYXVkaW9fYXR0cmlidXRlc190b19zdHJlYW1fdHlwZShhdHRyaWJ1dGVzKTsKKyAgICB9Cit9CisKK3ZvaWQgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OnNldEF1ZGlvU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgLy8gZG8gbm90IGFsbG93IGRpcmVjdCBzdHJlYW0gdHlwZSBtb2RpZmljYXRpb24gaWYgYXR0cmlidXRlcyBoYXZlIGJlZW4gc2V0CisgICAgaWYgKG1BdHRyaWJ1dGVzID09IE5VTEwpIHsKKyAgICAgICAgbVN0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOworICAgIH0KK30KKwordm9pZCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Y2xvc2VfbCgpIHsKKyAgICBtVHJhY2suY2xlYXIoKTsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6Om9wZW4oCisgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsIGludCBjaGFubmVsQ291bnQsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGludCBidWZmZXJDb3VudCwKKyAgICAgICAgQXVkaW9DYWxsYmFjayBjYiwgdm9pZCAqY29va2llLAorICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvLAorICAgICAgICBib29sIGRvTm90UmVjb25uZWN0LAorICAgICAgICB1aW50MzJfdCBzdWdnZXN0ZWRGcmFtZUNvdW50KSB7CisgICAgQUxPR1YoIm9wZW4oJXUsICVkLCAweCV4LCAweCV4LCAlZCwgJWQgMHgleCkiLCBzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQsIGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgIGZvcm1hdCwgYnVmZmVyQ291bnQsIG1TZXNzaW9uSWQsIGZsYWdzKTsKKworICAgIC8vIG9mZmxvYWRpbmcgaXMgb25seSBzdXBwb3J0ZWQgaW4gY2FsbGJhY2sgbW9kZSBmb3Igbm93LgorICAgIC8vIG9mZmxvYWRJbmZvIG11c3QgYmUgcHJlc2VudCBpZiBvZmZsb2FkIGZsYWcgaXMgc2V0CisgICAgaWYgKCgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSAhPSAwKSAmJgorICAgICAgICAgICAgKChjYiA9PSBOVUxMKSB8fCAob2ZmbG9hZEluZm8gPT0gTlVMTCkpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gY29tcHV0ZSBmcmFtZSBjb3VudCBmb3IgdGhlIEF1ZGlvVHJhY2sgaW50ZXJuYWwgYnVmZmVyCisgICAgc2l6ZV90IGZyYW1lQ291bnQ7CisgICAgaWYgKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDApIHsKKyAgICAgICAgZnJhbWVDb3VudCA9IDA7IC8vIEF1ZGlvVHJhY2sgd2lsbCBnZXQgZnJhbWUgY291bnQgZnJvbSBBdWRpb0ZsaW5nZXIKKyAgICB9IGVsc2UgeworICAgICAgICAvLyB0cnkgdG8gZXN0aW1hdGUgdGhlIGJ1ZmZlciBwcm9jZXNzaW5nIGZldGNoIHNpemUgZnJvbSBBdWRpb0ZsaW5nZXIuCisgICAgICAgIC8vIGZyYW1lc1BlckJ1ZmZlciBpcyBhcHByb3hpbWF0ZSBhbmQgZ2VuZXJhbGx5IGNvcnJlY3QsIGV4Y2VwdCB3aGVuIGl0J3Mgbm90IDotKS4KKyAgICAgICAgdWludDMyX3QgYWZTYW1wbGVSYXRlOworICAgICAgICBzaXplX3QgYWZGcmFtZUNvdW50OworICAgICAgICBpZiAoQXVkaW9TeXN0ZW06OmdldE91dHB1dEZyYW1lQ291bnQoJmFmRnJhbWVDb3VudCwgbVN0cmVhbVR5cGUpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoQXVkaW9TeXN0ZW06OmdldE91dHB1dFNhbXBsaW5nUmF0ZSgmYWZTYW1wbGVSYXRlLCBtU3RyZWFtVHlwZSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICB9CisgICAgICAgIGNvbnN0IHNpemVfdCBmcmFtZXNQZXJCdWZmZXIgPQorICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2FtcGxlUmF0ZSAqIGFmRnJhbWVDb3VudCAvIGFmU2FtcGxlUmF0ZTsKKworICAgICAgICBpZiAoYnVmZmVyQ291bnQgPT0gMCkgeworICAgICAgICAgICAgLy8gdXNlIHN1Z2dlc3RlZEZyYW1lQ291bnQKKyAgICAgICAgICAgIGJ1ZmZlckNvdW50ID0gKHN1Z2dlc3RlZEZyYW1lQ291bnQgKyBmcmFtZXNQZXJCdWZmZXIgLSAxKSAvIGZyYW1lc1BlckJ1ZmZlcjsKKyAgICAgICAgfQorICAgICAgICAvLyBDaGVjayBhcmd1bWVudCBidWZmZXJDb3VudCBhZ2FpbnN0IHRoZSBtaW5pbnVtIGJ1ZmZlciBjb3VudAorICAgICAgICBpZiAoYnVmZmVyQ291bnQgIT0gMCAmJiBidWZmZXJDb3VudCA8IG1NaW5CdWZmZXJDb3VudCkgeworICAgICAgICAgICAgQUxPR1YoImJ1ZmZlckNvdW50ICglZCkgaW5jcmVhc2VkIHRvICVkIiwgYnVmZmVyQ291bnQsIG1NaW5CdWZmZXJDb3VudCk7CisgICAgICAgICAgICBidWZmZXJDb3VudCA9IG1NaW5CdWZmZXJDb3VudDsKKyAgICAgICAgfQorICAgICAgICAvLyBpZiBmcmFtZUNvdW50IGlzIDAsIHRoZW4gQXVkaW9UcmFjayB3aWxsIGdldCBmcmFtZSBjb3VudCBmcm9tIEF1ZGlvRmxpbmdlcgorICAgICAgICAvLyB3aGljaCB3aWxsIGJlIHRoZSBtaW5pbXVtIHNpemUgcGVybWl0dGVkLgorICAgICAgICBmcmFtZUNvdW50ID0gYnVmZmVyQ291bnQgKiBmcmFtZXNQZXJCdWZmZXI7CisgICAgfQorCisgICAgaWYgKGNoYW5uZWxNYXNrID09IENIQU5ORUxfTUFTS19VU0VfQ0hBTk5FTF9PUkRFUikgeworICAgICAgICBjaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChjaGFubmVsQ291bnQpOworICAgICAgICBpZiAoMCA9PSBjaGFubmVsTWFzaykgeworICAgICAgICAgICAgQUxPR0UoIm9wZW4oKSBlcnJvciwgY2FuXCd0IGRlcml2ZSBtYXNrIGZvciAlZCBhdWRpbyBjaGFubmVscyIsIGNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgfQorICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBtQ2FsbGJhY2sgPSBjYjsKKyAgICBtQ2FsbGJhY2tDb29raWUgPSBjb29raWU7CisKKyAgICBzcDxBdWRpb1RyYWNrPiB0OworICAgIENhbGxiYWNrRGF0YSAqbmV3Y2JkID0gTlVMTDsKKworICAgIEFMT0dWKCJjcmVhdGluZyBuZXcgQXVkaW9UcmFjayIpOworCisgICAgaWYgKG1DYWxsYmFjayAhPSBOVUxMKSB7CisgICAgICAgIG5ld2NiZCA9IG5ldyBDYWxsYmFja0RhdGEodGhpcyk7CisgICAgICAgIHQgPSBuZXcgQXVkaW9UcmFjaygKKyAgICAgICAgICAgICAgICBtU3RyZWFtVHlwZSwKKyAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgIENhbGxiYWNrV3JhcHBlciwKKyAgICAgICAgICAgICAgICBuZXdjYmQsCisgICAgICAgICAgICAgICAgMCwgIC8vIG5vdGlmaWNhdGlvbiBmcmFtZXMKKyAgICAgICAgICAgICAgICBtU2Vzc2lvbklkLAorICAgICAgICAgICAgICAgIEF1ZGlvVHJhY2s6OlRSQU5TRkVSX0NBTExCQUNLLAorICAgICAgICAgICAgICAgIG9mZmxvYWRJbmZvLAorICAgICAgICAgICAgICAgIG1VaWQsCisgICAgICAgICAgICAgICAgbVBpZCwKKyAgICAgICAgICAgICAgICBtQXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICBkb05vdFJlY29ubmVjdCwKKyAgICAgICAgICAgICAgICAxLjBmLCAgLy8gZGVmYXVsdCB2YWx1ZSBmb3IgbWF4UmVxdWlyZWRTcGVlZAorICAgICAgICAgICAgICAgIG1TZWxlY3RlZERldmljZUlkKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBUT0RPOiBEdWUgdG8gYnVmZmVyIG1lbW9yeSBjb25jZXJucywgd2UgdXNlIGEgbWF4IHRhcmdldCBwbGF5YmFjayBzcGVlZAorICAgICAgICAvLyBiYXNlZCBvbiBtUGxheWJhY2tSYXRlIGF0IHRoZSB0aW1lIG9mIG9wZW4gKGluc3RlYWQgb2Yga01heFJlcXVpcmVkU3BlZWQpLAorICAgICAgICAvLyBhbHNvIGNsYW1waW5nIHRoZSB0YXJnZXQgc3BlZWQgdG8gMS4wIDw9IHRhcmdldFNwZWVkIDw9IGtNYXhSZXF1aXJlZFNwZWVkLgorICAgICAgICBjb25zdCBmbG9hdCB0YXJnZXRTcGVlZCA9CisgICAgICAgICAgICAgICAgc3RkOjptaW4oc3RkOjptYXgobVBsYXliYWNrUmF0ZS5tU3BlZWQsIDEuMGYpLCBrTWF4UmVxdWlyZWRTcGVlZCk7CisgICAgICAgIEFMT0dXX0lGKHRhcmdldFNwZWVkICE9IG1QbGF5YmFja1JhdGUubVNwZWVkLAorICAgICAgICAgICAgICAgICJ0cmFjayB0YXJnZXQgc3BlZWQ6JWYgY2xhbXBlZCBmcm9tIHBsYXliYWNrIHNwZWVkOiVmIiwKKyAgICAgICAgICAgICAgICB0YXJnZXRTcGVlZCwgbVBsYXliYWNrUmF0ZS5tU3BlZWQpOworICAgICAgICB0ID0gbmV3IEF1ZGlvVHJhY2soCisgICAgICAgICAgICAgICAgbVN0cmVhbVR5cGUsCisgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICBOVUxMLCAvLyBjYWxsYmFjaworICAgICAgICAgICAgICAgIE5VTEwsIC8vIHVzZXIgZGF0YQorICAgICAgICAgICAgICAgIDAsIC8vIG5vdGlmaWNhdGlvbiBmcmFtZXMKKyAgICAgICAgICAgICAgICBtU2Vzc2lvbklkLAorICAgICAgICAgICAgICAgIEF1ZGlvVHJhY2s6OlRSQU5TRkVSX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgTlVMTCwgLy8gb2ZmbG9hZCBpbmZvCisgICAgICAgICAgICAgICAgbVVpZCwKKyAgICAgICAgICAgICAgICBtUGlkLAorICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgIGRvTm90UmVjb25uZWN0LAorICAgICAgICAgICAgICAgIHRhcmdldFNwZWVkLAorICAgICAgICAgICAgICAgIG1TZWxlY3RlZERldmljZUlkKTsKKyAgICB9CisKKyAgICBpZiAoKHQgPT0gMCkgfHwgKHQtPmluaXRDaGVjaygpICE9IE5PX0VSUk9SKSkgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGNyZWF0ZSBhdWRpbyB0cmFjayIpOworICAgICAgICBkZWxldGUgbmV3Y2JkOworICAgICAgICAvLyB0IGdvZXMgb3V0IG9mIHNjb3BlLCBzbyByZWZlcmVuY2UgY291bnQgZHJvcHMgdG8gemVybworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBzdWNjZXNzZnVsIEF1ZGlvVHJhY2sgaW5pdGlhbGl6YXRpb24gaW1wbGllcyBhIGxlZ2FjeSBzdHJlYW0gdHlwZSB3YXMgZ2VuZXJhdGVkCisgICAgICAgIC8vIGZyb20gdGhlIGF1ZGlvIGF0dHJpYnV0ZXMKKyAgICAgICAgbVN0cmVhbVR5cGUgPSB0LT5zdHJlYW1UeXBlKCk7CisgICAgfQorCisgICAgQ0hFQ0soKHQgIT0gTlVMTCkgJiYgKChtQ2FsbGJhY2sgPT0gTlVMTCkgfHwgKG5ld2NiZCAhPSBOVUxMKSkpOworCisgICAgbUNhbGxiYWNrRGF0YSA9IG5ld2NiZDsKKyAgICBBTE9HVigic2V0Vm9sdW1lIik7CisgICAgdC0+c2V0Vm9sdW1lKG1MZWZ0Vm9sdW1lLCBtUmlnaHRWb2x1bWUpOworCisgICAgbVNhbXBsZVJhdGVIeiA9IHNhbXBsZVJhdGU7CisgICAgbUZsYWdzID0gZmxhZ3M7CisgICAgbU1zZWNzUGVyRnJhbWUgPSAxRTNmIC8gKG1QbGF5YmFja1JhdGUubVNwZWVkICogc2FtcGxlUmF0ZSk7CisgICAgbUZyYW1lU2l6ZSA9IHQtPmZyYW1lU2l6ZSgpOworICAgIG1UcmFjayA9IHQ7CisKKyAgICByZXR1cm4gdXBkYXRlVHJhY2tfbCgpOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6dXBkYXRlVHJhY2tfbCgpIHsKKyAgICBpZiAobVRyYWNrID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIHN0YXR1c190IHJlcyA9IE5PX0VSUk9SOworICAgIC8vIE5vdGUgc29tZSBvdXRwdXQgZGV2aWNlcyBtYXkgZ2l2ZSB1cyBhIGRpcmVjdCB0cmFjayBldmVuIHRob3VnaCB3ZSBkb24ndCBzcGVjaWZ5IGl0LgorICAgIC8vIEV4YW1wbGU6IExpbmUgYXBwbGljYXRpb24gYi8xNzQ1OTk4Mi4KKyAgICBpZiAoKG1UcmFjay0+Z2V0RmxhZ3MoKQorICAgICAgICAgICAgJiAoQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkpID09IDApIHsKKyAgICAgICAgcmVzID0gbVRyYWNrLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrUmF0ZSk7CisgICAgICAgIGlmIChyZXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIG1UcmFjay0+c2V0QXV4RWZmZWN0U2VuZExldmVsKG1TZW5kTGV2ZWwpOworICAgICAgICAgICAgcmVzID0gbVRyYWNrLT5hdHRhY2hBdXhFZmZlY3QobUF1eEVmZmVjdElkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtVHJhY2stPnNldE91dHB1dERldmljZShtU2VsZWN0ZWREZXZpY2VJZCk7CisgICAgaWYgKG1EZXZpY2VDYWxsYmFja0VuYWJsZWQpIHsKKyAgICAgICAgbVRyYWNrLT5hZGRBdWRpb0RldmljZUNhbGxiYWNrKG1EZXZpY2VDYWxsYmFjay5wcm9tb3RlKCkpOworICAgIH0KKyAgICBBTE9HVigidXBkYXRlVHJhY2tfbCgpIERPTkUgc3RhdHVzICVkIiwgcmVzKTsKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6c3RhcnQoKSB7CisgICAgQUxPR1YoInN0YXJ0Iik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGlmIChtQ2FsbGJhY2tEYXRhICE9IE5VTEwpIHsKKyAgICAgICAgbUNhbGxiYWNrRGF0YS0+ZW5kVHJhY2tTd2l0Y2goKTsKKyAgICB9CisgICAgaWYgKG1UcmFjayAhPSAwKSB7CisgICAgICAgIG1UcmFjay0+c2V0Vm9sdW1lKG1MZWZ0Vm9sdW1lLCBtUmlnaHRWb2x1bWUpOworICAgICAgICBtVHJhY2stPnNldEF1eEVmZmVjdFNlbmRMZXZlbChtU2VuZExldmVsKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVRyYWNrLT5zdGFydCgpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKK30KKworc3NpemVfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6d3JpdGUoY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSwgYm9vbCBibG9ja2luZykgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1DYWxsYmFjayAhPSBOVUxMLCAiRG9uJ3QgY2FsbCB3cml0ZSBpZiBzdXBwbHlpbmcgYSBjYWxsYmFjay4iKTsKKworICAgIC8vQUxPR1YoIndyaXRlKCVwLCAldSkiLCBidWZmZXIsIHNpemUpOworICAgIGlmIChtVHJhY2sgIT0gMCkgeworICAgICAgICByZXR1cm4gbVRyYWNrLT53cml0ZShidWZmZXIsIHNpemUsIGJsb2NraW5nKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0lOSVQ7Cit9CisKK3ZvaWQgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OnN0b3AoKSB7CisgICAgQUxPR1YoInN0b3AiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKG1UcmFjayAhPSAwKSB7CisgICAgICAgIG1UcmFjay0+c3RvcCgpOworICAgIH0KK30KKwordm9pZCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Zmx1c2goKSB7CisgICAgQUxPR1YoImZsdXNoIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGlmIChtVHJhY2sgIT0gMCkgeworICAgICAgICBtVHJhY2stPmZsdXNoKCk7CisgICAgfQorfQorCit2b2lkIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpwYXVzZSgpIHsKKyAgICBBTE9HVigicGF1c2UiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKG1UcmFjayAhPSAwKSB7CisgICAgICAgIG1UcmFjay0+cGF1c2UoKTsKKyAgICB9Cit9CisKK3ZvaWQgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmNsb3NlKCkgeworICAgIEFMT0dWKCJjbG9zZSIpOworICAgIHNwPEF1ZGlvVHJhY2s+IHRyYWNrOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgICAgICB0cmFjayA9IG1UcmFjazsKKyAgICAgICAgY2xvc2VfbCgpOyAvLyBjbGVhcnMgbVRyYWNrCisgICAgfQorICAgIC8vIGRlc3RydWN0aW9uIG9mIHRoZSB0cmFjayBvY2N1cnMgb3V0c2lkZSBvZiBtdXRleC4KK30KKwordm9pZCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6c2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KSB7CisgICAgQUxPR1YoInNldFZvbHVtZSglZiwgJWYpIiwgbGVmdCwgcmlnaHQpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBtTGVmdFZvbHVtZSA9IGxlZnQ7CisgICAgbVJpZ2h0Vm9sdW1lID0gcmlnaHQ7CisgICAgaWYgKG1UcmFjayAhPSAwKSB7CisgICAgICAgIG1UcmFjay0+c2V0Vm9sdW1lKGxlZnQsIHJpZ2h0KTsKKyAgICB9Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpzZXRQbGF5YmFja1JhdGUoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnJhdGUpIHsKKyAgICBBTE9HVigic2V0UGxheWJhY2tSYXRlKCVmICVmICVkICVkKSIsCisgICAgICAgICAgICAgICAgcmF0ZS5tU3BlZWQsIHJhdGUubVBpdGNoLCByYXRlLm1GYWxsYmFja01vZGUsIHJhdGUubVN0cmV0Y2hNb2RlKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKG1UcmFjayA9PSAwKSB7CisgICAgICAgIC8vIHJlbWVtYmVyIHJhdGUgc28gdGhhdCB3ZSBjYW4gc2V0IGl0IHdoZW4gdGhlIHRyYWNrIGlzIG9wZW5lZAorICAgICAgICBtUGxheWJhY2tSYXRlID0gcmF0ZTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICBzdGF0dXNfdCByZXMgPSBtVHJhY2stPnNldFBsYXliYWNrUmF0ZShyYXRlKTsKKyAgICBpZiAocmVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIC8vIHJhdGUubVNwZWVkIGlzIGFsd2F5cyBncmVhdGVyIHRoYW4gMCBpZiBzZXRQbGF5YmFja1JhdGUgc3VjY2VlZGVkCisgICAgQ0hFQ0tfR1QocmF0ZS5tU3BlZWQsIDAuZik7CisgICAgbVBsYXliYWNrUmF0ZSA9IHJhdGU7CisgICAgaWYgKG1TYW1wbGVSYXRlSHogIT0gMCkgeworICAgICAgICBtTXNlY3NQZXJGcmFtZSA9IDFFM2YgLyAocmF0ZS5tU3BlZWQgKiBtU2FtcGxlUmF0ZUh6KTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmdldFBsYXliYWNrUmF0ZShBdWRpb1BsYXliYWNrUmF0ZSAqcmF0ZSkgeworICAgIEFMT0dWKCJzZXRQbGF5YmFja1JhdGUiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKG1UcmFjayA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICAqcmF0ZSA9IG1UcmFjay0+Z2V0UGxheWJhY2tSYXRlKCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6c2V0QXV4RWZmZWN0U2VuZExldmVsKGZsb2F0IGxldmVsKSB7CisgICAgQUxPR1YoInNldEF1eEVmZmVjdFNlbmRMZXZlbCglZikiLCBsZXZlbCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIG1TZW5kTGV2ZWwgPSBsZXZlbDsKKyAgICBpZiAobVRyYWNrICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG1UcmFjay0+c2V0QXV4RWZmZWN0U2VuZExldmVsKGxldmVsKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6YXR0YWNoQXV4RWZmZWN0KGludCBlZmZlY3RJZCkgeworICAgIEFMT0dWKCJhdHRhY2hBdXhFZmZlY3QoJWQpIiwgZWZmZWN0SWQpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBtQXV4RWZmZWN0SWQgPSBlZmZlY3RJZDsKKyAgICBpZiAobVRyYWNrICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG1UcmFjay0+YXR0YWNoQXV4RWZmZWN0KGVmZmVjdElkKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6c2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpIHsKKyAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlKCVkKSIsIGRldmljZUlkKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgbVNlbGVjdGVkRGV2aWNlSWQgPSBkZXZpY2VJZDsKKyAgICBpZiAobVRyYWNrICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG1UcmFjay0+c2V0T3V0cHV0RGV2aWNlKGRldmljZUlkKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0Um91dGVkRGV2aWNlSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCogZGV2aWNlSWQpIHsKKyAgICBBTE9HVigiZ2V0Um91dGVkRGV2aWNlSWQiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKG1UcmFjayAhPSAwKSB7CisgICAgICAgIG1Sb3V0ZWREZXZpY2VJZCA9IG1UcmFjay0+Z2V0Um91dGVkRGV2aWNlSWQoKTsKKyAgICB9CisgICAgKmRldmljZUlkID0gbVJvdXRlZERldmljZUlkOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKSB7CisgICAgQUxPR1YoImVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2ssICVkIiwgZW5hYmxlZCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIG1EZXZpY2VDYWxsYmFja0VuYWJsZWQgPSBlbmFibGVkOworICAgIGlmIChtVHJhY2sgIT0gMCkgeworICAgICAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBtVHJhY2stPmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2sobURldmljZUNhbGxiYWNrLnByb21vdGUoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBtVHJhY2stPnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sobURldmljZUNhbGxiYWNrLnByb21vdGUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvLyBzdGF0aWMKK3ZvaWQgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OkNhbGxiYWNrV3JhcHBlcigKKyAgICAgICAgaW50IGV2ZW50LCB2b2lkICpjb29raWUsIHZvaWQgKmluZm8pIHsKKyAgICAvL0FMT0dWKCJjYWxsYmFja3dyYXBwZXIiKTsKKyAgICBDYWxsYmFja0RhdGEgKmRhdGEgPSAoQ2FsbGJhY2tEYXRhKiljb29raWU7CisgICAgLy8gbG9jayB0byBlbnN1cmUgd2UgYXJlbid0IGNhdWdodCBpbiB0aGUgbWlkZGxlIG9mIGEgdHJhY2sgc3dpdGNoLgorICAgIGRhdGEtPmxvY2soKTsKKyAgICBNZWRpYVBsYXllcjJBdWRpb091dHB1dCAqbWUgPSBkYXRhLT5nZXRPdXRwdXQoKTsKKyAgICBBdWRpb1RyYWNrOjpCdWZmZXIgKmJ1ZmZlciA9IChBdWRpb1RyYWNrOjpCdWZmZXIgKilpbmZvOworICAgIGlmIChtZSA9PSBOVUxMKSB7CisgICAgICAgIC8vIG5vIG91dHB1dCBzZXQsIGxpa2VseSBiZWNhdXNlIHRoZSB0cmFjayB3YXMgc2NoZWR1bGVkIHRvIGJlIHJldXNlZAorICAgICAgICAvLyBieSBhbm90aGVyIHBsYXllciwgYnV0IHRoZSBmb3JtYXQgdHVybmVkIG91dCB0byBiZSBpbmNvbXBhdGlibGUuCisgICAgICAgIGRhdGEtPnVubG9jaygpOworICAgICAgICBpZiAoYnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+c2l6ZSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN3aXRjaChldmVudCkgeworICAgIGNhc2UgQXVkaW9UcmFjazo6RVZFTlRfTU9SRV9EQVRBOiB7CisgICAgICAgIHNpemVfdCBhY3R1YWxTaXplID0gKCptZS0+bUNhbGxiYWNrKSgKKyAgICAgICAgICAgICAgICBtZSwgYnVmZmVyLT5yYXcsIGJ1ZmZlci0+c2l6ZSwgbWUtPm1DYWxsYmFja0Nvb2tpZSwKKyAgICAgICAgICAgICAgICBDQl9FVkVOVF9GSUxMX0JVRkZFUik7CisKKyAgICAgICAgLy8gTG9nIHdoZW4gbm8gZGF0YSBpcyByZXR1cm5lZCBmcm9tIHRoZSBjYWxsYmFjay4KKyAgICAgICAgLy8gKDEpIFdlIG1heSBoYXZlIG5vIGRhdGEgKGVzcGVjaWFsbHkgd2l0aCBuZXR3b3JrIHN0cmVhbWluZyBzb3VyY2VzKS4KKyAgICAgICAgLy8gKDIpIFdlIG1heSBoYXZlIHJlYWNoZWQgdGhlIEVPUyBhbmQgdGhlIGF1ZGlvIHRyYWNrIGlzIG5vdCBzdG9wcGVkIHlldC4KKyAgICAgICAgLy8gTm90ZSB0aGF0IEF3ZXNvbWVQbGF5ZXIvQXVkaW9QbGF5ZXIgd2lsbCBvbmx5IHJldHVybiB6ZXJvIHNpemUgd2hlbiBpdCByZWFjaGVzIHRoZSBFT1MuCisgICAgICAgIC8vIE51UGxheWVyMlJlbmRlcmVyIHdpbGwgcmV0dXJuIHplcm8gd2hlbiBpdCBkb2Vzbid0IGhhdmUgZGF0YSAoaXQgZG9lc24ndCBibG9jayB0byBmaWxsKS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhpcyBpcyBhIGJlbmlnbiBidXN5LXdhaXQsIHdpdGggdGhlIG5leHQgZGF0YSByZXF1ZXN0IGdlbmVyYXRlZCAxMCBtcyBvciBtb3JlIGxhdGVyOworICAgICAgICAvLyBuZXZlcnRoZWxlc3MgZm9yIHBvd2VyIHJlYXNvbnMsIHdlIGRvbid0IHdhbnQgdG8gc2VlIHRvbyBtYW55IG9mIHRoZXNlLgorCisgICAgICAgIEFMT0dWX0lGKGFjdHVhbFNpemUgPT0gMCAmJiBidWZmZXItPnNpemUgPiAwLCAiY2FsbGJhY2t3cmFwcGVyOiBlbXB0eSBidWZmZXIgcmV0dXJuZWQiKTsKKworICAgICAgICBidWZmZXItPnNpemUgPSBhY3R1YWxTaXplOworICAgICAgICB9IGJyZWFrOworCisgICAgY2FzZSBBdWRpb1RyYWNrOjpFVkVOVF9TVFJFQU1fRU5EOgorICAgICAgICAvLyBjdXJyZW50bHkgb25seSBvY2N1cnMgZm9yIG9mZmxvYWRlZCBjYWxsYmFja3MKKyAgICAgICAgQUxPR1YoImNhbGxiYWNrd3JhcHBlcjogZGVsaXZlciBFVkVOVF9TVFJFQU1fRU5EIik7CisgICAgICAgICgqbWUtPm1DYWxsYmFjaykobWUsIE5VTEwgLyogYnVmZmVyICovLCAwIC8qIHNpemUgKi8sCisgICAgICAgICAgICAgICAgbWUtPm1DYWxsYmFja0Nvb2tpZSwgQ0JfRVZFTlRfU1RSRUFNX0VORCk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBBdWRpb1RyYWNrOjpFVkVOVF9ORVdfSUFVRElPVFJBQ0sgOgorICAgICAgICBBTE9HVigiY2FsbGJhY2t3cmFwcGVyOiBkZWxpdmVyIEVWRU5UX1RFQVJfRE9XTiIpOworICAgICAgICAoKm1lLT5tQ2FsbGJhY2spKG1lLCAgTlVMTCAvKiBidWZmZXIgKi8sIDAgLyogc2l6ZSAqLywKKyAgICAgICAgICAgICAgICBtZS0+bUNhbGxiYWNrQ29va2llLCBDQl9FVkVOVF9URUFSX0RPV04pOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgQXVkaW9UcmFjazo6RVZFTlRfVU5ERVJSVU46CisgICAgICAgIC8vIFRoaXMgb2NjdXJzIHdoZW4gdGhlcmUgaXMgbm8gZGF0YSBhdmFpbGFibGUsIHR5cGljYWxseQorICAgICAgICAvLyB3aGVuIHRoZXJlIGlzIGEgZmFpbHVyZSB0byBzdXBwbHkgZGF0YSB0byB0aGUgQXVkaW9UcmFjay4gIEl0IGNhbiBhbHNvCisgICAgICAgIC8vIG9jY3VyIGluIG5vbi1vZmZsb2FkZWQgbW9kZSB3aGVuIHRoZSBhdWRpbyBkZXZpY2UgY29tZXMgb3V0IG9mIHN0YW5kYnkuCisgICAgICAgIC8vCisgICAgICAgIC8vIElmIGFuIEF1ZGlvVHJhY2sgdW5kZXJydW5zIGl0IG91dHB1dHMgc2lsZW5jZS4gU2luY2UgdGhpcyBoYXBwZW5zIHN1ZGRlbmx5CisgICAgICAgIC8vIGl0IG1heSBzb3VuZCBsaWtlIGFuIGF1ZGlibGUgcG9wIG9yIGdsaXRjaC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlIHVuZGVycnVuIGV2ZW50IGlzIHNlbnQgb25jZSBwZXIgdHJhY2sgdW5kZXJydW47IHRoZSBjb25kaXRpb24gaXMgcmVzZXQKKyAgICAgICAgLy8gd2hlbiBtb3JlIGRhdGEgaXMgc2VudCB0byB0aGUgQXVkaW9UcmFjay4KKyAgICAgICAgQUxPR0QoImNhbGxiYWNrd3JhcHBlcjogRVZFTlRfVU5ERVJSVU4gKGRpc2NhcmRlZCkiKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HRSgicmVjZWl2ZWQgdW5rbm93biBldmVudCB0eXBlOiAlZCBpbnNpZGUgQ2FsbGJhY2tXcmFwcGVyICEiLCBldmVudCk7CisgICAgfQorCisgICAgZGF0YS0+dW5sb2NrKCk7Cit9CisKK2F1ZGlvX3Nlc3Npb25fdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0U2Vzc2lvbklkKCkgY29uc3QKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgcmV0dXJuIG1TZXNzaW9uSWQ7Cit9CisKK3VpbnQzMl90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRTYW1wbGVSYXRlKCkgY29uc3QKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKG1UcmFjayA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gbVRyYWNrLT5nZXRTYW1wbGVSYXRlKCk7Cit9CisKK2ludDY0X3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmdldEJ1ZmZlckR1cmF0aW9uSW5VcygpIGNvbnN0Cit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGlmIChtVHJhY2sgPT0gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaW50NjRfdCBkdXJhdGlvbjsKKyAgICBpZiAobVRyYWNrLT5nZXRCdWZmZXJEdXJhdGlvbkluVXMoJmR1cmF0aW9uKSAhPSBPSykgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIGR1cmF0aW9uOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSkF1ZGlvVHJhY2suaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KQXVkaW9UcmFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMTgyNWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSkF1ZGlvVHJhY2suaApAQCAtMCwwICsxLDQxOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0pBVURJT1RSQUNLX0gKKyNkZWZpbmUgQU5EUk9JRF9KQVVESU9UUkFDS19ICisKKyNpbmNsdWRlIDxqbmkuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CisjaW5jbHVkZSA8bWVkaWEvVm9sdW1lU2hhcGVyLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1RpbWVzdGFtcC5oPiAgIC8vIEl0IGhhcyBkZXBlbmRlbmN5IG9uIGF1ZGlvLmgvRXJyb3JzLmgsIGJ1dCBkb2Vzbid0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmNsdWRlIHRoZW0gaW4gaXQuIFRoZXJlZm9yZSBpdCBpcyBpbmNsdWRlZCBoZXJlIGF0IGxhc3QuCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgSkF1ZGlvVHJhY2sgeworcHVibGljOgorCisgICAgLyogRXZlbnRzIHVzZWQgYnkgQXVkaW9UcmFjayBjYWxsYmFjayBmdW5jdGlvbiAoY2FsbGJhY2tfdCkuCisgICAgICogS2VlcCBpbiBzeW5jIHdpdGggZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb1RyYWNrLmphdmEgTkFUSVZFX0VWRU5UXyouCisgICAgICovCisgICAgZW51bSBldmVudF90eXBlIHsKKyAgICAgICAgRVZFTlRfTU9SRV9EQVRBID0gMCwgICAgICAgIC8vIFJlcXVlc3QgdG8gd3JpdGUgbW9yZSBkYXRhIHRvIGJ1ZmZlci4KKyAgICAgICAgRVZFTlRfTkVXX0lBVURJT1RSQUNLID0gNiwgIC8vIElBdWRpb1RyYWNrIHdhcyByZS1jcmVhdGVkLCBlaXRoZXIgZHVlIHRvIHJlLXJvdXRpbmcgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2b2x1bnRhcnkgaW52YWxpZGF0aW9uIGJ5IG1lZGlhc2VydmVyLCBvciBtZWRpYXNlcnZlciBjcmFzaC4KKyAgICAgICAgRVZFTlRfU1RSRUFNX0VORCA9IDcsICAgICAgIC8vIFNlbnQgYWZ0ZXIgYWxsIHRoZSBidWZmZXJzIHF1ZXVlZCBpbiBBRiBhbmQgSFcgYXJlIHBsYXllZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFjayAoYWZ0ZXIgc3RvcCBpcyBjYWxsZWQpIGZvciBhbiBvZmZsb2FkZWQgdHJhY2suCisgICAgfTsKKworICAgIGNsYXNzIEJ1ZmZlcgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHNpemVfdCAgICAgIG1TaXplOyAgICAgICAgLy8gaW5wdXQvb3V0cHV0IGluIGJ5dGVzLgorICAgICAgICB2b2lkKiAgICAgICBtRGF0YTsgICAgICAgIC8vIHBvaW50ZXIgdG8gdGhlIGF1ZGlvIGRhdGEuCisgICAgfTsKKworICAgIC8qIEFzIGEgY29udmVuaWVuY2UsIGlmIGEgY2FsbGJhY2sgaXMgc3VwcGxpZWQsIGEgaGFuZGxlciB0aHJlYWQKKyAgICAgKiBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgcHJpb3JpdHkuIFRoaXMgdGhyZWFkCisgICAgICogaW52b2tlcyB0aGUgY2FsbGJhY2sgd2hlbiBhIG5ldyBidWZmZXIgYmVjb21lcyBhdmFpbGFibGUgb3IgdmFyaW91cyBjb25kaXRpb25zIG9jY3VyLgorICAgICAqCisgICAgICogUGFyYW1ldGVyczoKKyAgICAgKgorICAgICAqIGV2ZW50OiAgIHR5cGUgb2YgZXZlbnQgbm90aWZpZWQgKHNlZSBlbnVtIEF1ZGlvVHJhY2s6OmV2ZW50X3R5cGUpLgorICAgICAqIHVzZXI6ICAgIFBvaW50ZXIgdG8gY29udGV4dCBmb3IgdXNlIGJ5IHRoZSBjYWxsYmFjayByZWNlaXZlci4KKyAgICAgKiBpbmZvOiAgICBQb2ludGVyIHRvIG9wdGlvbmFsIHBhcmFtZXRlciBhY2NvcmRpbmcgdG8gZXZlbnQgdHlwZToKKyAgICAgKiAgICAgICAgICAtIEVWRU5UX01PUkVfREFUQTogcG9pbnRlciB0byBKQXVkaW9UcmFjazo6QnVmZmVyIHN0cnVjdC4gVGhlIGNhbGxiYWNrIG11c3Qgbm90CisgICAgICogICAgICAgICAgICB3cml0ZSBtb3JlIGJ5dGVzIHRoYW4gaW5kaWNhdGVkIGJ5ICdzaXplJyBmaWVsZCBhbmQgdXBkYXRlICdzaXplJyBpZiBmZXdlciBieXRlcworICAgICAqICAgICAgICAgICAgYXJlIHdyaXR0ZW4uCisgICAgICogICAgICAgICAgLSBFVkVOVF9ORVdfSUFVRElPVFJBQ0s6IHVudXNlZC4KKyAgICAgKiAgICAgICAgICAtIEVWRU5UX1NUUkVBTV9FTkQ6IHVudXNlZC4KKyAgICAgKi8KKworICAgIHR5cGVkZWYgdm9pZCAoKmNhbGxiYWNrX3QpKGludCBldmVudCwgdm9pZCogdXNlciwgdm9pZCAqaW5mbyk7CisKKyAgICAvKiBDcmVhdGVzIGFuIEpBdWRpb1RyYWNrIG9iamVjdCBmb3Igbm9uLW9mZmxvYWQgbW9kZS4KKyAgICAgKiBPbmNlIGNyZWF0ZWQsIHRoZSB0cmFjayBuZWVkcyB0byBiZSBzdGFydGVkIGJlZm9yZSBpdCBjYW4gYmUgdXNlZC4KKyAgICAgKiBVbnNwZWNpZmllZCB2YWx1ZXMgYXJlIHNldCB0byBhcHByb3ByaWF0ZSBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKgorICAgICAqIFBhcmFtZXRlcnM6CisgICAgICoKKyAgICAgKiBzdHJlYW1UeXBlOiAgICAgICAgIFNlbGVjdCB0aGUgdHlwZSBvZiBhdWRpbyBzdHJlYW0gdGhpcyB0cmFjayBpcyBhdHRhY2hlZCB0bworICAgICAqICAgICAgICAgICAgICAgICAgICAgKGUuZy4gQVVESU9fU1RSRUFNX01VU0lDKS4KKyAgICAgKiBzYW1wbGVSYXRlOiAgICAgICAgIERhdGEgc291cmNlIHNhbXBsaW5nIHJhdGUgaW4gSHouICBaZXJvIG1lYW5zIHRvIHVzZSB0aGUgc2luayBzYW1wbGUgcmF0ZS4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIEEgbm9uLXplcm8gdmFsdWUgbXVzdCBiZSBzcGVjaWZpZWQgaWYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUIGlzIHNldC4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIDAgd2lsbCBub3Qgd29yayB3aXRoIGN1cnJlbnQgcG9saWN5IGltcGxlbWVudGF0aW9uIGZvciBkaXJlY3Qgb3V0cHV0CisgICAgICogICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24gd2hlcmUgYW4gZXhhY3QgbWF0Y2ggaXMgbmVlZGVkIGZvciBzYW1wbGluZyByYXRlLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgKFRPRE86IENoZWNrIGRpcmVjdCBvdXRwdXQgYWZ0ZXIgZmxhZ3MgY2FuIGJlIHVzZWQgaW4gSmF2YSBBdWRpb1RyYWNrLikKKyAgICAgKiBmb3JtYXQ6ICAgICAgICAgICAgIEF1ZGlvIGZvcm1hdC4gRm9yIG1peGVkIHRyYWNrcywgYW55IFBDTSBmb3JtYXQgc3VwcG9ydGVkIGJ5IHNlcnZlciBpcyBPSy4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIEZvciBkaXJlY3QgYW5kIG9mZmxvYWRlZCB0cmFja3MsIHRoZSBwb3NzaWJsZSBmb3JtYXQocykgZGVwZW5kcyBvbiB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBzaW5rLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgKFRPRE86IEhvdyBjYW4gd2UgY2hlY2sgd2hldGhlciBhIGZvcm1hdCBpcyBzdXBwb3J0ZWQ/KQorICAgICAqIGNoYW5uZWxNYXNrOiAgICAgICAgQ2hhbm5lbCBtYXNrLCBzdWNoIHRoYXQgYXVkaW9faXNfb3V0cHV0X2NoYW5uZWwoY2hhbm5lbE1hc2spIGlzIHRydWUuCisgICAgICogY2JmOiAgICAgICAgICAgICAgICBDYWxsYmFjayBmdW5jdGlvbi4gSWYgbm90IG51bGwsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHBlcmlvZGljYWxseQorICAgICAqICAgICAgICAgICAgICAgICAgICAgdG8gcHJvdmlkZSBuZXcgZGF0YSBhbmQgaW5mb3JtIG9mIG1hcmtlciwgcG9zaXRpb24gdXBkYXRlcywgZXRjLgorICAgICAqIHVzZXI6ICAgICAgICAgICAgICAgQ29udGV4dCBmb3IgdXNlIGJ5IHRoZSBjYWxsYmFjayByZWNlaXZlci4KKyAgICAgKiBmcmFtZUNvdW50OiAgICAgICAgIE1pbmltdW0gc2l6ZSBvZiB0cmFjayBQQ00gYnVmZmVyIGluIGZyYW1lcy4gVGhpcyBkZWZpbmVzIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24ncyBjb250cmlidXRpb24gdG8gdGhlIGxhdGVuY3kgb2YgdGhlIHRyYWNrLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgVGhlIGFjdHVhbCBzaXplIHNlbGVjdGVkIGJ5IHRoZSBKQXVkaW9UcmFjayBjb3VsZCBiZSBsYXJnZXIgaWYgdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWQgc2l6ZSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIGN1cnJlbnQgYXVkaW8gSEFMIGNvbmZpZ3VyYXRpb24uCisgICAgICogICAgICAgICAgICAgICAgICAgICBaZXJvIG1lYW5zIHRvIHVzZSBhIGRlZmF1bHQgdmFsdWUuCisgICAgICogc2Vzc2lvbklkOiAgICAgICAgICBTcGVjaWZpYyBzZXNzaW9uIElELCBvciB6ZXJvIHRvIHVzZSBkZWZhdWx0LgorICAgICAqIHBBdHRyaWJ1dGVzOiAgICAgICAgSWYgbm90IE5VTEwsIHN1cGVyc2VkZXMgc3RyZWFtVHlwZSBmb3IgdXNlIGNhc2Ugc2VsZWN0aW9uLgorICAgICAqIG1heFJlcXVpcmVkU3BlZWQ6ICAgRm9yIFBDTSB0cmFja3MsIHRoaXMgY3JlYXRlcyBhbiBhcHByb3ByaWF0ZSBidWZmZXIgc2l6ZSB0aGF0IHdpbGwgYWxsb3cKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIG1heFJlcXVpcmVkU3BlZWQgcGxheWJhY2suIFZhbHVlcyBsZXNzIHRoYW4gMS4wZiBhbmQgZ3JlYXRlciB0aGFuCisgICAgICogICAgICAgICAgICAgICAgICAgICBBVURJT19USU1FU1RSRVRDSF9TUEVFRF9NQVggd2lsbCBiZSBjbGFtcGVkLiAgRm9yIG5vbi1QQ00gdHJhY2tzCisgICAgICogICAgICAgICAgICAgICAgICAgICBhbmQgZGlyZWN0IG9yIG9mZmxvYWRlZCB0cmFja3MsIHRoaXMgcGFyYW1ldGVyIGlzIGlnbm9yZWQuCisgICAgICogICAgICAgICAgICAgICAgICAgICAoVE9ETzogSGFuZGxlIHRoaXMgYWZ0ZXIgb2ZmbG9hZCAvIGRpcmVjdCB0cmFjayBpcyBzdXBwb3J0ZWQuKQorICAgICAqCisgICAgICogVE9ETzogUmV2aXZlIHJlbW92ZWQgYXJndW1lbnRzIGFmdGVyIG9mZmxvYWQgbW9kZSBpcyBzdXBwb3J0ZWQuCisgICAgICovCisgICAgSkF1ZGlvVHJhY2soYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAorICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgIGNhbGxiYWNrX3QgY2JmLAorICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIsCisgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSAwLAorICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgID0gQVVESU9fU0VTU0lPTl9BTExPQ0FURSwKKyAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzID0gTlVMTCwKKyAgICAgICAgICAgICAgICBmbG9hdCBtYXhSZXF1aXJlZFNwZWVkID0gMS4wZik7CisKKyAgICAvKgorICAgICAgIC8vIFEuIE1heSBiZSB1c2VkIGluIEF1ZGlvVHJhY2suc2V0UHJlZmVycmVkRGV2aWNlKEF1ZGlvRGV2aWNlSW5mbyk/CisgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkLAorCisgICAgICAgLy8gVE9ETzogTm8gcGxhY2UgdG8gdXNlIHRoZXNlIHZhbHVlcy4KKyAgICAgICBpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcywKKyAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8sCisgICAgKi8KKworICAgIHZpcnR1YWwgfkpBdWRpb1RyYWNrKCk7CisKKyAgICBzaXplX3QgZnJhbWVDb3VudCgpOworICAgIHNpemVfdCBjaGFubmVsQ291bnQoKTsKKworICAgIC8qIFJldHVybnMgdGhpcyB0cmFjaydzIGVzdGltYXRlZCBsYXRlbmN5IGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKiBUaGlzIGluY2x1ZGVzIHRoZSBsYXRlbmN5IGR1ZSB0byBBdWRpb1RyYWNrIGJ1ZmZlciBzaXplLCBBdWRpb01peGVyIChpZiBhbnkpCisgICAgICogYW5kIGF1ZGlvIGhhcmR3YXJlIGRyaXZlci4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBsYXRlbmN5KCk7CisKKyAgICAvKiBSZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiBmcmFtZXMgcGxheWVkIHNpbmNlIHBsYXliYWNrIHN0YXJ0LgorICAgICAqIFRoZSBjb3VudGVyIHdpbGwgd3JhcCAob3ZlcmZsb3cpIHBlcmlvZGljYWxseSwgZS5nLiBldmVyeSB+MjcgaG91cnMgYXQgNDQuMSBrSHouCisgICAgICogSXQgaXMgcmVzZXQgdG8gemVybyBieSBmbHVzaCgpLCByZWxvYWQoKSwgYW5kIHN0b3AoKS4KKyAgICAgKgorICAgICAqIFBhcmFtZXRlcnM6CisgICAgICoKKyAgICAgKiBwb3NpdGlvbjogQWRkcmVzcyB3aGVyZSB0byByZXR1cm4gcGxheSBoZWFkIHBvc2l0aW9uLgorICAgICAqCisgICAgICogUmV0dXJuZWQgc3RhdHVzIChmcm9tIHV0aWxzL0Vycm9ycy5oKSBjYW4gYmU6CisgICAgICogIC0gTk9fRVJST1I6IHN1Y2Nlc3NmdWwgb3BlcmF0aW9uCisgICAgICogIC0gQkFEX1ZBTFVFOiBwb3NpdGlvbiBpcyBOVUxMCisgICAgICovCisgICAgc3RhdHVzX3QgZ2V0UG9zaXRpb24odWludDMyX3QgKnBvc2l0aW9uKTsKKworICAgIC8vIFRPRE86IERvZXMgdGhpcyBjb21tZW50IGFwcGx5IHNhbWUgdG8gSmF2YSBBdWRpb1RyYWNrOjpnZXRUaW1lc3RhbXA/CisgICAgLy8gQ2hhbmdlZCB0aGUgcmV0dXJuIHR5cGUgZnJvbSBzdGF0dXNfdCB0byBib29sLCBzaW5jZSBKYXZhIEF1ZGlvVHJhY2s6OmdldFRpbWVzdGFtcCByZXR1cm5zCisgICAgLy8gYm9vbGVhbi4gV2lsbCBKYXZhIGdldFRpbWVzdGFtcFdpdGhTdGF0dXMoKSBiZSBwdWJsaWM/CisgICAgLyogUG9sbCBmb3IgYSB0aW1lc3RhbXAgb24gZGVtYW5kLgorICAgICAqIFVzZSBpZiBFVkVOVF9ORVdfVElNRVNUQU1QIGlzIG5vdCBkZWxpdmVyZWQgb2Z0ZW4gZW5vdWdoIGZvciB5b3VyIG5lZWRzLAorICAgICAqIG9yIGlmIHlvdSBuZWVkIHRvIGdldCB0aGUgbW9zdCByZWNlbnQgdGltZXN0YW1wIG91dHNpZGUgb2YgdGhlIGV2ZW50IGNhbGxiYWNrIGhhbmRsZXIuCisgICAgICogQ2F1dGlvbjogY2FsbGluZyB0aGlzIG1ldGhvZCB0b28gb2Z0ZW4gbWF5IGJlIGluZWZmaWNpZW50OworICAgICAqIGlmIHlvdSBuZWVkIGEgaGlnaCByZXNvbHV0aW9uIG1hcHBpbmcgYmV0d2VlbiBmcmFtZSBwb3NpdGlvbiBhbmQgcHJlc2VudGF0aW9uIHRpbWUsCisgICAgICogY29uc2lkZXIgaW1wbGVtZW50aW5nIHRoYXQgYXQgYXBwbGljYXRpb24gbGV2ZWwsIGJhc2VkIG9uIHRoZSBsb3cgcmVzb2x1dGlvbiB0aW1lc3RhbXBzLgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aW1lc3RhbXAgaXMgdmFsaWQuCisgICAgICogVGhlIHRpbWVzdGFtcCBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkIG9uIHJldHVybiwgaWYgZmFsc2UgaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgYm9vbCBnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCk7CisKKyAgICAvLyBUT0RPOiBUaGlzIGRvYyBpcyBqdXN0IGNvcGllZCBmcm9tIEF1ZGlvVHJhY2suaC4gUmV2aXNlIGl0IGFmdGVyIGltcGxlbWVuYXRpb24uCisgICAgLyogUmV0dXJuIHRoZSBleHRlbmRlZCB0aW1lc3RhbXAsIHdpdGggYWRkaXRpb25hbCB0aW1lYmFzZSBpbmZvIGFuZCBpbXByb3ZlZCBkcmFpbiBiZWhhdmlvci4KKyAgICAgKgorICAgICAqIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgQXVkaW9UcmFjay5qYXZhIEFQSToKKyAgICAgKiBnZXRUaW1lc3RhbXAoQE5vbk51bGwgQXVkaW9UaW1lc3RhbXAgdGltZXN0YW1wLCBAQXVkaW9UaW1lc3RhbXAuVGltZWJhc2UgaW50IHRpbWViYXNlKQorICAgICAqCisgICAgICogU29tZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoaXMgbWV0aG9kIGFuZCB0aGUgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wJiB0aW1lc3RhbXApIG1ldGhvZAorICAgICAqCisgICAgICogICAxLiBzdG9wKCkgYnkgaXRzZWxmIGRvZXMgbm90IHJlc2V0IHRoZSBmcmFtZSBwb3NpdGlvbi4KKyAgICAgKiAgICAgIEEgZm9sbG93aW5nIHN0YXJ0KCkgcmVzZXRzIHRoZSBmcmFtZSBwb3NpdGlvbiB0byAwLgorICAgICAqICAgMi4gZmx1c2goKSBieSBpdHNlbGYgZG9lcyBub3QgcmVzZXQgdGhlIGZyYW1lIHBvc2l0aW9uLgorICAgICAqICAgICAgVGhlIGZyYW1lIHBvc2l0aW9uIGFkdmFuY2VzIGJ5IHRoZSBudW1iZXIgb2YgZnJhbWVzIGZsdXNoZWQsCisgICAgICogICAgICB3aGVuIHRoZSBmaXJzdCBmcmFtZSBhZnRlciBmbHVzaCByZWFjaGVzIHRoZSBhdWRpbyBzaW5rLgorICAgICAqICAgMy4gQk9PVFRJTUUgY2xvY2sgb2Zmc2V0cyBhcmUgcHJvdmlkZWQgdG8gaGVscCBzeW5jaHJvbml6ZSB3aXRoCisgICAgICogICAgICBub24tYXVkaW8gc3RyZWFtcywgZS5nLiBzZW5zb3IgZGF0YS4KKyAgICAgKiAgIDQuIFBvc2l0aW9uIGlzIHJldHVybmVkIHdpdGggNjQgYml0cyBvZiByZXNvbHV0aW9uLgorICAgICAqCisgICAgICogUGFyYW1ldGVyczoKKyAgICAgKiAgdGltZXN0YW1wOiBBIHBvaW50ZXIgdG8gdGhlIGNhbGxlciBhbGxvY2F0ZWQgRXh0ZW5kZWRUaW1lc3RhbXAuCisgICAgICoKKyAgICAgKiBSZXR1cm5zIE5PX0VSUk9SICAgIG9uIHN1Y2Nlc3M7IHRpbWVzdGFtcCBpcyBmaWxsZWQgd2l0aCB2YWxpZCBkYXRhLgorICAgICAqICAgICAgICAgQkFEX1ZBTFVFICAgaWYgdGltZXN0YW1wIGlzIE5VTEwuCisgICAgICogICAgICAgICBXT1VMRF9CTE9DSyBpZiBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgc3RhcnQoKSB3aGVuIHRoZSBudW1iZXIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIG9mIGZyYW1lcyBjb25zdW1lZCBpcyBsZXNzIHRoYW4gdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgICBvdmVyYWxsIGhhcmR3YXJlIGxhdGVuY3kgdG8gcGh5c2ljYWwgb3V0cHV0LiBJbiBXT1VMRF9CTE9DSyBjYXNlcywKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIG9uZSBtaWdodCBwb2xsIGFnYWluLCBvciB1c2UgZ2V0UG9zaXRpb24oKSwgb3IgdXNlIDAgcG9zaXRpb24gYW5kCisgICAgICogICAgICAgICAgICAgICAgICAgICBjdXJyZW50IHRpbWUgZm9yIHRoZSB0aW1lc3RhbXAuCisgICAgICogICAgICAgICAgICAgICAgICAgICBJZiBXT1VMRF9CTE9DSyBpcyByZXR1cm5lZCwgdGhlIHRpbWVzdGFtcCBpcyBzdGlsbAorICAgICAqICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgd2l0aCB0aGUgTE9DQVRJT05fQ0xJRU5UIHBvcnRpb24gZmlsbGVkLgorICAgICAqICAgICAgICAgREVBRF9PQkpFQ1QgaWYgQXVkaW9GbGluZ2VyIGRpZXMgb3IgdGhlIG91dHB1dCBkZXZpY2UgY2hhbmdlcyBhbmQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIHRoZSB0cmFjayBjYW5ub3QgYmUgYXV0b21hdGljYWxseSByZXN0b3JlZC4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIFRoZSBhcHBsaWNhdGlvbiBuZWVkcyB0byByZWNyZWF0ZSB0aGUgQXVkaW9UcmFjaworICAgICAqICAgICAgICAgICAgICAgICAgICAgYmVjYXVzZSB0aGUgYXVkaW8gZGV2aWNlIGNoYW5nZWQgb3IgQXVkaW9GbGluZ2VyIGRpZWQuCisgICAgICogICAgICAgICAgICAgICAgICAgICBUaGlzIHR5cGljYWxseSBvY2N1cnMgZm9yIGRpcmVjdCBvciBvZmZsb2FkZWQgdHJhY2tzCisgICAgICogICAgICAgICAgICAgICAgICAgICBvciBpZiBtRG9Ob3RSZWNvbm5lY3QgaXMgdHJ1ZS4KKyAgICAgKiAgICAgICAgIElOVkFMSURfT1BFUkFUSU9OICBpZiBjYWxsZWQgb24gYSBvZmZsb2FkZWQgb3IgZGlyZWN0IHRyYWNrLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgVXNlIGdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCYgdGltZXN0YW1wKSBpbnN0ZWFkLgorICAgICAqLworICAgIHN0YXR1c190IGdldFRpbWVzdGFtcChFeHRlbmRlZFRpbWVzdGFtcCAqdGltZXN0YW1wKTsKKworICAgIC8qIFNldCBzb3VyY2UgcGxheWJhY2sgcmF0ZSBmb3IgdGltZXN0cmV0Y2gKKyAgICAgKiAxLjAgaXMgbm9ybWFsIHNwZWVkOiA8IDEuMCBpcyBzbG93ZXIsID4gMS4wIGlzIGZhc3RlcgorICAgICAqIDEuMCBpcyBub3JtYWwgcGl0Y2g6IDwgMS4wIGlzIGxvd2VyIHBpdGNoLCA+IDEuMCBpcyBoaWdoZXIgcGl0Y2gKKyAgICAgKgorICAgICAqIEFVRElPX1RJTUVTVFJFVENIX1NQRUVEX01JTiA8PSBzcGVlZCA8PSBBVURJT19USU1FU1RSRVRDSF9TUEVFRF9NQVgKKyAgICAgKiBBVURJT19USU1FU1RSRVRDSF9QSVRDSF9NSU4gPD0gcGl0Y2ggPD0gQVVESU9fVElNRVNUUkVUQ0hfUElUQ0hfTUFYCisgICAgICoKKyAgICAgKiBTcGVlZCBpbmNyZWFzZXMgdGhlIHBsYXliYWNrIHJhdGUgb2YgbWVkaWEsIGJ1dCBkb2VzIG5vdCBhbHRlciBwaXRjaC4KKyAgICAgKiBQaXRjaCBpbmNyZWFzZXMgdGhlICJ0b25hbCBmcmVxdWVuY3kiIG9mIG1lZGlhLCBidXQgZG9lcyBub3QgYWZmZWN0IHRoZSBwbGF5YmFjayByYXRlLgorICAgICAqLworICAgIHN0YXR1c190IHNldFBsYXliYWNrUmF0ZShjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcGxheWJhY2tSYXRlKTsKKworICAgIC8qIFJldHVybiBjdXJyZW50IHBsYXliYWNrIHJhdGUgKi8KKyAgICBjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSBnZXRQbGF5YmFja1JhdGUoKTsKKworICAgIC8qIFNldHMgdGhlIHZvbHVtZSBzaGFwZXIgb2JqZWN0ICovCisgICAgbWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdHVzIGFwcGx5Vm9sdW1lU2hhcGVyKAorICAgICAgICAgICAgY29uc3Qgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4mIGNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+JiBvcGVyYXRpb24pOworCisgICAgLyogU2V0IHRoZSBzZW5kIGxldmVsIGZvciB0aGlzIHRyYWNrLiBBbiBhdXhpbGlhcnkgZWZmZWN0IHNob3VsZCBiZSBhdHRhY2hlZAorICAgICAqIHRvIHRoZSB0cmFjayB3aXRoIGF0dGFjaEVmZmVjdCgpLiBMZXZlbCBtdXN0IGJlID49IDAuMCBhbmQgPD0gMS4wLgorICAgICAqLworICAgIHN0YXR1c190IHNldEF1eEVmZmVjdFNlbmRMZXZlbChmbG9hdCBsZXZlbCk7CisKKyAgICAvKiBBdHRhY2ggdHJhY2sgYXV4aWxpYXJ5IG91dHB1dCB0byBzcGVjaWZpZWQgZWZmZWN0LiBVc2UgZWZmZWN0SWQgPSAwCisgICAgICogdG8gZGV0YWNoIHRyYWNrIGZyb20gZWZmZWN0LgorICAgICAqCisgICAgICogUGFyYW1ldGVyczoKKyAgICAgKgorICAgICAqIGVmZmVjdElkOiBlZmZlY3RJZCBvYnRhaW5lZCBmcm9tIEF1ZGlvRWZmZWN0OjppZCgpLgorICAgICAqCisgICAgICogUmV0dXJuZWQgc3RhdHVzIChmcm9tIHV0aWxzL0Vycm9ycy5oKSBjYW4gYmU6CisgICAgICogIC0gTk9fRVJST1I6IHN1Y2Nlc3NmdWwgb3BlcmF0aW9uCisgICAgICogIC0gSU5WQUxJRF9PUEVSQVRJT046IFRoZSBlZmZlY3QgaXMgbm90IGFuIGF1eGlsaWFyeSBlZmZlY3QuCisgICAgICogIC0gQkFEX1ZBTFVFOiBUaGUgc3BlY2lmaWVkIGVmZmVjdCBJRCBpcyBpbnZhbGlkLgorICAgICAqLworICAgIHN0YXR1c190IGF0dGFjaEF1eEVmZmVjdChpbnQgZWZmZWN0SWQpOworCisgICAgLyogU2V0IHZvbHVtZSBmb3IgdGhpcyB0cmFjaywgbW9zdGx5IHVzZWQgZm9yIGdhbWVzJyBzb3VuZCBlZmZlY3RzCisgICAgICogbGVmdCBhbmQgcmlnaHQgdm9sdW1lcy4gTGV2ZWxzIG11c3QgYmUgPj0gMC4wIGFuZCA8PSAxLjAuCisgICAgICogVGhpcyBpcyB0aGUgb2xkZXIgQVBJLiAgTmV3IGFwcGxpY2F0aW9ucyBzaG91bGQgdXNlIHNldFZvbHVtZShmbG9hdCkgd2hlbiBwb3NzaWJsZS4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOworCisgICAgLyogU2V0IHZvbHVtZSBmb3IgYWxsIGNoYW5uZWxzLiBUaGlzIGlzIHRoZSBwcmVmZXJyZWQgQVBJIGZvciBuZXcgYXBwbGljYXRpb25zLAorICAgICAqIGVzcGVjaWFsbHkgZm9yIG11bHRpLWNoYW5uZWwgY29udGVudC4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzZXRWb2x1bWUoZmxvYXQgdm9sdW1lKTsKKworICAgIC8vIFRPRE86IERvZXMgdGhpcyBjb21tZW50IGVxdWFsbHkgYXBwbHkgdG8gdGhlIEphdmEgQXVkaW9UcmFjazo6cGxheSgpPworICAgIC8qIEFmdGVyIGl0J3MgY3JlYXRlZCB0aGUgdHJhY2sgaXMgbm90IGFjdGl2ZS4gQ2FsbCBzdGFydCgpIHRvCisgICAgICogbWFrZSBpdCBhY3RpdmUuIElmIHNldCwgdGhlIGNhbGxiYWNrIHdpbGwgc3RhcnQgYmVpbmcgY2FsbGVkLgorICAgICAqIElmIHRoZSB0cmFjayB3YXMgcHJldmlvdXNseSBwYXVzZWQsIHZvbHVtZSBpcyByYW1wZWQgdXAgb3ZlciB0aGUgZmlyc3QgbWl4IGJ1ZmZlci4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzdGFydCgpOworCisgICAgLy8gVE9ETzogRG9lcyB0aGlzIGNvbW1lbnQgc3RpbGwgYXBwbGllcz8gSXQgc2VlbXMgbm90LiAob2J0YWluQnVmZmVyLCBBdWRpb0ZsaW5nZXIsIC4uLikKKyAgICAvKiBBcyBhIGNvbnZlbmllbmNlIHdlIHByb3ZpZGUgYSB3cml0ZSgpIGludGVyZmFjZSB0byB0aGUgYXVkaW8gYnVmZmVyLgorICAgICAqIElucHV0IHBhcmFtZXRlciAnc2l6ZScgaXMgaW4gYnl0ZSB1bml0cy4KKyAgICAgKiBUaGlzIGlzIGltcGxlbWVudGVkIG9uIHRvcCBvZiBvYnRhaW5CdWZmZXIvcmVsZWFzZUJ1ZmZlci4gRm9yIGJlc3QKKyAgICAgKiBwZXJmb3JtYW5jZSB1c2UgY2FsbGJhY2tzLiBSZXR1cm5zIGFjdHVhbCBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiA+PSAwLAorICAgICAqIG9yIG9uZSBvZiB0aGUgZm9sbG93aW5nIG5lZ2F0aXZlIHN0YXR1cyBjb2RlczoKKyAgICAgKiAgICAgIElOVkFMSURfT1BFUkFUSU9OICAgQXVkaW9UcmFjayBpcyBjb25maWd1cmVkIGZvciBzdGF0aWMgYnVmZmVyIG9yIHN0cmVhbWluZyBtb2RlCisgICAgICogICAgICBCQURfVkFMVUUgICAgICAgICAgIHNpemUgaXMgaW52YWxpZAorICAgICAqICAgICAgV09VTERfQkxPQ0sgICAgICAgICB3aGVuIG9idGFpbkJ1ZmZlcigpIHJldHVybnMgc2FtZSwgb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9UcmFjayB3YXMgc3RvcHBlZCBkdXJpbmcgdGhlIHdyaXRlCisgICAgICogICAgICBERUFEX09CSkVDVCAgICAgICAgIHdoZW4gQXVkaW9GbGluZ2VyIGRpZXMgb3IgdGhlIG91dHB1dCBkZXZpY2UgY2hhbmdlcyBhbmQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRyYWNrIGNhbm5vdCBiZSBhdXRvbWF0aWNhbGx5IHJlc3RvcmVkLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgYXBwbGljYXRpb24gbmVlZHMgdG8gcmVjcmVhdGUgdGhlIEF1ZGlvVHJhY2sKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmVjYXVzZSB0aGUgYXVkaW8gZGV2aWNlIGNoYW5nZWQgb3IgQXVkaW9GbGluZ2VyIGRpZWQuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdHlwaWNhbGx5IG9jY3VycyBmb3IgZGlyZWN0IG9yIG9mZmxvYWQgdHJhY2tzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGlmIG1Eb05vdFJlY29ubmVjdCBpcyB0cnVlLgorICAgICAqICAgICAgb3IgYW55IG90aGVyIGVycm9yIGNvZGUgcmV0dXJuZWQgYnkgSUF1ZGlvVHJhY2s6OnN0YXJ0KCkgb3IgcmVzdG9yZVRyYWNrX2woKS4KKyAgICAgKiBEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIG9ubHkgcmV0dXJuIHdoZW4gYWxsIGRhdGEgaGFzIGJlZW4gdHJhbnNmZXJyZWQuIFNldCAnYmxvY2tpbmcnIHRvCisgICAgICogZmFsc2UgZm9yIHRoZSBtZXRob2QgdG8gcmV0dXJuIGltbWVkaWF0ZWx5IHdpdGhvdXQgd2FpdGluZyB0byB0cnkgbXVsdGlwbGUgdGltZXMgdG8gd3JpdGUKKyAgICAgKiB0aGUgZnVsbCBjb250ZW50IG9mIHRoZSBidWZmZXIuCisgICAgICovCisgICAgc3NpemVfdCB3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplLCBib29sIGJsb2NraW5nID0gdHJ1ZSk7CisKKyAgICAvLyBUT0RPOiBEb2VzIHRoaXMgY29tbWVudCBlcXVhbGx5IGFwcGx5IHRvIHRoZSBKYXZhIEF1ZGlvVHJhY2s6OnN0b3AoKT8KKyAgICAvKiBTdG9wIGEgdHJhY2suCisgICAgICogSW4gc3RhdGljIGJ1ZmZlciBtb2RlLCB0aGUgdHJhY2sgaXMgc3RvcHBlZCBpbW1lZGlhdGVseS4KKyAgICAgKiBJbiBzdHJlYW1pbmcgbW9kZSwgdGhlIGNhbGxiYWNrIHdpbGwgY2Vhc2UgYmVpbmcgY2FsbGVkLiAgTm90ZSB0aGF0IG9idGFpbkJ1ZmZlcigpIHN0aWxsCisgICAgICogd29ya3MgYW5kIHdpbGwgZmlsbCB1cCBidWZmZXJzIHVudGlsIHRoZSBwb29sIGlzIGV4aGF1c3RlZCwgYW5kIHRoZW4gd2lsbCByZXR1cm4gV09VTERfQkxPQ0suCisgICAgICogSW4gc3RyZWFtaW5nIG1vZGUgdGhlIHN0b3AgZG9lcyBub3Qgb2NjdXIgaW1tZWRpYXRlbHk6IGFueSBkYXRhIHJlbWFpbmluZyBpbiB0aGUgYnVmZmVyCisgICAgICogaXMgZmlyc3QgZHJhaW5lZCwgbWl4ZWQsIGFuZCBvdXRwdXQsIGFuZCBvbmx5IHRoZW4gaXMgdGhlIHRyYWNrIG1hcmtlZCBhcyBzdG9wcGVkLgorICAgICAqLworICAgIHZvaWQgc3RvcCgpOworICAgIGJvb2wgc3RvcHBlZCgpIGNvbnN0OworCisgICAgLy8gVE9ETzogRG9lcyB0aGlzIGNvbW1lbnQgZXF1YWxseSBhcHBseSB0byB0aGUgSmF2YSBBdWRpb1RyYWNrOjpmbHVzaCgpPworICAgIC8qIEZsdXNoIGEgc3RvcHBlZCBvciBwYXVzZWQgdHJhY2suIEFsbCBwcmV2aW91c2x5IGJ1ZmZlcmVkIGRhdGEgaXMgZGlzY2FyZGVkIGltbWVkaWF0ZWx5LgorICAgICAqIFRoaXMgaGFzIHRoZSBlZmZlY3Qgb2YgZHJhaW5pbmcgdGhlIGJ1ZmZlcnMgd2l0aG91dCBtaXhpbmcgb3Igb3V0cHV0LgorICAgICAqIEZsdXNoIGlzIGludGVuZGVkIGZvciBzdHJlYW1pbmcgbW9kZSwgZm9yIGV4YW1wbGUgYmVmb3JlIHN3aXRjaGluZyB0byBub24tY29udGlndW91cyBjb250ZW50LgorICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgYSBuby1vcCBpZiB0aGUgdHJhY2sgaXMgbm90IHN0b3BwZWQgb3IgcGF1c2VkLCBvciB1c2VzIGEgc3RhdGljIGJ1ZmZlci4KKyAgICAgKi8KKyAgICB2b2lkIGZsdXNoKCk7CisKKyAgICAvLyBUT0RPOiBEb2VzIHRoaXMgY29tbWVudCBlcXVhbGx5IGFwcGx5IHRvIHRoZSBKYXZhIEF1ZGlvVHJhY2s6OnBhdXNlKCk/CisgICAgLy8gQXQgbGVhc3Qgd2UgYXJlIG5vdCB1c2luZyBvYnRhaW5CdWZmZXIuCisgICAgLyogUGF1c2UgYSB0cmFjay4gQWZ0ZXIgcGF1c2UsIHRoZSBjYWxsYmFjayB3aWxsIGNlYXNlIGJlaW5nIGNhbGxlZCBhbmQKKyAgICAgKiBvYnRhaW5CdWZmZXIgcmV0dXJucyBXT1VMRF9CTE9DSy4gTm90ZSB0aGF0IG9idGFpbkJ1ZmZlcigpIHN0aWxsIHdvcmtzCisgICAgICogYW5kIHdpbGwgZmlsbCB1cCBidWZmZXJzIHVudGlsIHRoZSBwb29sIGlzIGV4aGF1c3RlZC4KKyAgICAgKiBWb2x1bWUgaXMgcmFtcGVkIGRvd24gb3ZlciB0aGUgbmV4dCBtaXggYnVmZmVyIGZvbGxvd2luZyB0aGUgcGF1c2UgcmVxdWVzdCwKKyAgICAgKiBhbmQgdGhlbiB0aGUgdHJhY2sgaXMgbWFya2VkIGFzIHBhdXNlZC4gSXQgY2FuIGJlIHJlc3VtZWQgd2l0aCByYW1wIHVwIGJ5IHN0YXJ0KCkuCisgICAgICovCisgICAgdm9pZCBwYXVzZSgpOworCisgICAgYm9vbCBpc1BsYXlpbmcoKSBjb25zdDsKKworICAgIC8qIFJldHVybiBjdXJyZW50IHNvdXJjZSBzYW1wbGUgcmF0ZSBpbiBIei4KKyAgICAgKiBJZiBzcGVjaWZpZWQgYXMgemVybyBpbiBjb25zdHJ1Y3RvciwgdGhpcyB3aWxsIGJlIHRoZSBzaW5rIHNhbXBsZSByYXRlLgorICAgICAqLworICAgIHVpbnQzMl90IGdldFNhbXBsZVJhdGUoKTsKKworICAgIC8qIFJldHVybnMgdGhlIGJ1ZmZlciBkdXJhdGlvbiBpbiBtaWNyb3NlY29uZHMgYXQgY3VycmVudCBwbGF5YmFjayByYXRlLiAqLworICAgIHN0YXR1c190IGdldEJ1ZmZlckR1cmF0aW9uSW5VcyhpbnQ2NF90ICpkdXJhdGlvbik7CisKKyAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQoKTsKKworICAgIC8qCisgICAgICogRHVtcHMgdGhlIHN0YXRlIG9mIGFuIGF1ZGlvIHRyYWNrLgorICAgICAqIE5vdCBhIGdlbmVyYWwtcHVycG9zZSBBUEk7IGludGVuZGVkIG9ubHkgZm9yIHVzZSBieSBtZWRpYSBwbGF5ZXIgc2VydmljZSB0byBkdW1wIGl0cyB0cmFja3MuCisgICAgICovCisgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0OworCisgICAgLyogUmV0dXJucyB0aGUgSUQgb2YgdGhlIGF1ZGlvIGRldmljZSBhY3R1YWxseSB1c2VkIGJ5IHRoZSBvdXRwdXQgdG8gd2hpY2ggdGhpcyBBdWRpb1RyYWNrIGlzCisgICAgICogYXR0YWNoZWQuIFdoZW4gdGhlIEF1ZGlvVHJhY2sgaXMgaW5hY3RpdmUsIGl0IHdpbGwgcmV0dXJuIEFVRElPX1BPUlRfSEFORExFX05PTkUuCisgICAgICovCisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXRSb3V0ZWREZXZpY2VJZCgpOworCisgICAgLyogUmV0dXJucyB0aGUgSUQgb2YgdGhlIGF1ZGlvIHNlc3Npb24gdGhpcyBBdWRpb1RyYWNrIGJlbG9uZ3MgdG8uICovCisgICAgYXVkaW9fc2Vzc2lvbl90IGdldEF1ZGlvU2Vzc2lvbklkKCk7CisKKyAgICAvKiBTZWxlY3RzIHRoZSBhdWRpbyBkZXZpY2UgdG8gdXNlIGZvciBvdXRwdXQgb2YgdGhpcyBBdWRpb1RyYWNrLiBBIHZhbHVlIG9mCisgICAgICogQVVESU9fUE9SVF9IQU5ETEVfTk9ORSBpbmRpY2F0ZXMgZGVmYXVsdCByb3V0aW5nLgorICAgICAqCisgICAgICogUGFyYW1ldGVyczoKKyAgICAgKiAgVGhlIGRldmljZSBJRCBvZiB0aGUgc2VsZWN0ZWQgZGV2aWNlIChhcyByZXR1cm5lZCBieSB0aGUgQXVkaW9EZXZpY2VzTWFuYWdlciBBUEkpLgorICAgICAqCisgICAgICogUmV0dXJuZWQgdmFsdWU6CisgICAgICogIC0gTk9fRVJST1I6IHN1Y2Nlc3NmdWwgb3BlcmF0aW9uCisgICAgICogIC0gQkFEX1ZBTFVFOiBmYWlsZWQgdG8gZmluZCB0aGUgdmFsaWQgb3V0cHV0IGRldmljZSB3aXRoIGdpdmVuIGRldmljZSBJZC4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCk7CisKKyAgICAvLyBUT0RPOiBBZGQgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUIHdoZW4gaXQgaXMgcG9zc2libGUgdG8gY2hlY2suCisgICAgLy8gVE9ETzogQWRkIEFVRElPX0ZMQUdfSFdfQVZfU1lOQyB3aGVuIGl0IGlzIHBvc3NpYmxlIHRvIGNoZWNrLgorICAgIC8qIFJldHVybnMgdGhlIGZsYWdzICovCisgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZ2V0RmxhZ3MoKSBjb25zdCB7IHJldHVybiBtRmxhZ3M7IH0KKworICAgIC8qIE9idGFpbiB0aGUgcGVuZGluZyBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMgZm9yIHBsYXliYWNrIG9mIHB1cmUgUENNIGRhdGEgcmVtYWluaW5nIGluCisgICAgICogQXVkaW9UcmFjay4KKyAgICAgKgorICAgICAqIFJldHVybnMgTk9fRVJST1IgaWYgc3VjY2Vzc2Z1bC4KKyAgICAgKiAgICAgICAgIElOVkFMSURfT1BFUkFUSU9OIGlmIHRoZSBBdWRpb1RyYWNrIGRvZXMgbm90IGNvbnRhaW4gcHVyZSBQQ00gZGF0YS4KKyAgICAgKiAgICAgICAgIEJBRF9WQUxVRSBpZiBtc2VjIGlzIG51bGxwdHIuCisgICAgICovCisgICAgc3RhdHVzX3QgcGVuZGluZ0R1cmF0aW9uKGludDMyX3QgKm1zZWMpOworCisgICAgLyogQWRkcyBhbiBBdWRpb0RldmljZUNhbGxiYWNrLiBUaGUgY2FsbGVyIHdpbGwgYmUgbm90aWZpZWQgd2hlbiB0aGUgYXVkaW8gZGV2aWNlIHRvIHdoaWNoIHRoaXMKKyAgICAgKiBBdWRpb1RyYWNrIGlzIHJvdXRlZCBpcyB1cGRhdGVkLgorICAgICAqIFJlcGxhY2VzIGFueSBwcmV2aW91c2x5IGluc3RhbGxlZCBjYWxsYmFjay4KKyAgICAgKgorICAgICAqIFBhcmFtZXRlcnM6CisgICAgICoKKyAgICAgKiBjYWxsYmFjazogVGhlIGNhbGxiYWNrIGludGVyZmFjZQorICAgICAqCisgICAgICogUmV0dXJucyBOT19FUlJPUiBpZiBzdWNjZXNzZnVsLgorICAgICAqICAgICAgICAgSU5WQUxJRF9PUEVSQVRJT04gaWYgdGhlIHNhbWUgY2FsbGJhY2sgaXMgYWxyZWFkeSBpbnN0YWxsZWQuCisgICAgICogICAgICAgICBOT19JTklUIG9yIFBSRU1JU1NJT05fREVOSUVEIGlmIEF1ZGlvRmxpbmdlciBzZXJ2aWNlIGlzIG5vdCByZWFjaGFibGUKKyAgICAgKiAgICAgICAgIEJBRF9WQUxVRSBpZiB0aGUgY2FsbGJhY2sgaXMgTlVMTAorICAgICAqLworICAgIHN0YXR1c190IGFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjayk7CisKKyAgICAvKiBSZW1vdmVzIGFuIEF1ZGlvRGV2aWNlQ2FsbGJhY2suCisgICAgICoKKyAgICAgKiBQYXJhbWV0ZXJzOgorICAgICAqCisgICAgICogY2FsbGJhY2s6IFRoZSBjYWxsYmFjayBpbnRlcmZhY2UKKyAgICAgKgorICAgICAqIFJldHVybnMgTk9fRVJST1IgaWYgc3VjY2Vzc2Z1bC4KKyAgICAgKiAgICAgICAgIElOVkFMSURfT1BFUkFUSU9OIGlmIHRoZSBjYWxsYmFjayBpcyBub3QgaW5zdGFsbGVkCisgICAgICogICAgICAgICBCQURfVkFMVUUgaWYgdGhlIGNhbGxiYWNrIGlzIE5VTEwKKyAgICAgKi8KKyAgICBzdGF0dXNfdCByZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2spOworCitwcml2YXRlOgorICAgIGF1ZGlvX291dHB1dF9mbGFnc190IG1GbGFnczsKKworICAgIGpjbGFzcyBtQXVkaW9UcmFja0NsczsKKyAgICBqb2JqZWN0IG1BdWRpb1RyYWNrT2JqOworCisgICAgLyogQ3JlYXRlcyBhIEphdmEgVm9sdW1lU2hhcGVyLkNvbmZpZ3VyYXRpb24gb2JqZWN0IGZyb20gVm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uICovCisgICAgam9iamVjdCBjcmVhdGVWb2x1bWVTaGFwZXJDb25maWd1cmF0aW9uT2JqKAorICAgICAgICAgICAgY29uc3Qgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4mIGNvbmZpZyk7CisKKyAgICAvKiBDcmVhdGVzIGEgSmF2YSBWb2x1bWVTaGFwZXIuT3BlcmF0aW9uIG9iamVjdCBmcm9tIFZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uICovCisgICAgam9iamVjdCBjcmVhdGVWb2x1bWVTaGFwZXJPcGVyYXRpb25PYmooCisgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+JiBvcGVyYXRpb24pOworCisgICAgLyogQ3JlYXRlcyBhIEphdmEgU3RyZWFtRXZlbnRDYWxsYmFjayBvYmplY3QgKi8KKyAgICBqb2JqZWN0IGNyZWF0ZVN0cmVhbUV2ZW50Q2FsbGJhY2soY2FsbGJhY2tfdCBjYmYsIHZvaWQqIHVzZXIpOworCisgICAgLyogQ3JlYXRlcyBhIEphdmEgRXhlY3V0b3Igb2JqZWN0IGZvciBydW5uaW5nIGEgY2FsbGJhY2sgKi8KKyAgICBqb2JqZWN0IGNyZWF0ZUNhbGxiYWNrRXhlY3V0b3IoKTsKKworICAgIHN0YXR1c190IGphdmFUb05hdGl2ZVN0YXR1cyhpbnQgamF2YVN0YXR1cyk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9KQVVESU9UUkFDS19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJBdWRpb091dHB1dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNWI4ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQuaApAQCAtMCwwICsxLDE5MSBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBUExBWUVSMkFVRElPT1VUUFVUX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQVBMQVlFUjJBVURJT09VVFBVVF9ICisKKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEF1ZGlvVHJhY2s7CisKK2NsYXNzIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0IDogcHVibGljIE1lZGlhUGxheWVyMkludGVyZmFjZTo6QXVkaW9TaW5rCit7CisgICAgY2xhc3MgQ2FsbGJhY2tEYXRhOworCitwdWJsaWM6CisgICAgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKiBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgZGV2aWNlQ2FsbGJhY2spOworICAgIHZpcnR1YWwgfk1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0KCk7CisKKyAgICB2aXJ0dWFsIGJvb2wgcmVhZHkoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVHJhY2sgIT0gMDsKKyAgICB9CisgICAgdmlydHVhbCBzc2l6ZV90IGJ1ZmZlclNpemUoKSBjb25zdDsKKyAgICB2aXJ0dWFsIHNzaXplX3QgZnJhbWVDb3VudCgpIGNvbnN0OworICAgIHZpcnR1YWwgc3NpemVfdCBjaGFubmVsQ291bnQoKSBjb25zdDsKKyAgICB2aXJ0dWFsIHNzaXplX3QgZnJhbWVTaXplKCkgY29uc3Q7CisgICAgdmlydHVhbCB1aW50MzJfdCBsYXRlbmN5KCkgY29uc3Q7CisgICAgdmlydHVhbCBmbG9hdCBtc2Vjc1BlckZyYW1lKCkgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQb3NpdGlvbih1aW50MzJfdCAqcG9zaXRpb24pIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wICZ0cykgY29uc3Q7CisgICAgdmlydHVhbCBpbnQ2NF90IGdldFBsYXllZE91dER1cmF0aW9uVXMoaW50NjRfdCBub3dVcykgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZXNXcml0dGVuKHVpbnQzMl90ICpmcmFtZXN3cml0dGVuKSBjb25zdDsKKyAgICB2aXJ0dWFsIGF1ZGlvX3Nlc3Npb25fdCBnZXRTZXNzaW9uSWQoKSBjb25zdDsKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFNhbXBsZVJhdGUoKSBjb25zdDsKKyAgICB2aXJ0dWFsIGludDY0X3QgZ2V0QnVmZmVyRHVyYXRpb25JblVzKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW4oCisgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLCBpbnQgY2hhbm5lbENvdW50LCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgaW50IGJ1ZmZlckNvdW50LAorICAgICAgICAgICAgQXVkaW9DYWxsYmFjayBjYiwgdm9pZCAqY29va2llLAorICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FLAorICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gTlVMTCwKKyAgICAgICAgICAgIGJvb2wgZG9Ob3RSZWNvbm5lY3QgPSBmYWxzZSwKKyAgICAgICAgICAgIHVpbnQzMl90IHN1Z2dlc3RlZEZyYW1lQ291bnQgPSAwKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIHNzaXplX3Qgd3JpdGUoY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSwgYm9vbCBibG9ja2luZyA9IHRydWUpOworICAgIHZpcnR1YWwgdm9pZCBzdG9wKCk7CisgICAgdmlydHVhbCB2b2lkIGZsdXNoKCk7CisgICAgdmlydHVhbCB2b2lkIHBhdXNlKCk7CisgICAgdmlydHVhbCB2b2lkIGNsb3NlKCk7CisgICAgdm9pZCBzZXRBdWRpb1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKTsKKyAgICB2aXJ0dWFsIGF1ZGlvX3N0cmVhbV90eXBlX3QgZ2V0QXVkaW9TdHJlYW1UeXBlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVN0cmVhbVR5cGU7CisgICAgfQorICAgIHZvaWQgc2V0QXVkaW9BdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqIGF0dHJpYnV0ZXMpOworCisgICAgdm9pZCBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGxheWJhY2tSYXRlKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlJiByYXRlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBsYXliYWNrUmF0ZShBdWRpb1BsYXliYWNrUmF0ZSogcmF0ZSAvKiBub25udWxsICovKTsKKworICAgIHN0YXR1c190IHNldEF1eEVmZmVjdFNlbmRMZXZlbChmbG9hdCBsZXZlbCk7CisgICAgc3RhdHVzX3QgYXR0YWNoQXV4RWZmZWN0KGludCBlZmZlY3RJZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3Q7CisKKyAgICBzdGF0aWMgYm9vbCBpc09uRW11bGF0b3IoKTsKKyAgICBzdGF0aWMgaW50IGdldE1pbkJ1ZmZlckNvdW50KCk7CisgICAgdmlydHVhbCBib29sIG5lZWRzVHJhaWxpbmdQYWRkaW5nKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgLy8gVE9ETzogcmV0dXJuIGNvcnJlY3QgdmFsdWUuCisgICAgICAgIC8vcmV0dXJuIG1OZXh0T3V0cHV0ID09IE5VTEw7CisgICAgfQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKTsKKyAgICB2aXJ0dWFsIFN0cmluZzggZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKTsKKworICAgIC8vIEF1ZGlvUm91dGluZworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Um91dGVkRGV2aWNlSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCogZGV2aWNlSWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpOworCitwcml2YXRlOgorICAgIHN0YXRpYyB2b2lkIHNldE1pbkJ1ZmZlckNvdW50KCk7CisgICAgc3RhdGljIHZvaWQgQ2FsbGJhY2tXcmFwcGVyKGludCBldmVudCwgdm9pZCAqbWUsIHZvaWQgKmluZm8pOworICAgIHZvaWQgZGVsZXRlUmVjeWNsZWRUcmFja19sKCk7CisgICAgdm9pZCBjbG9zZV9sKCk7CisgICAgc3RhdHVzX3QgdXBkYXRlVHJhY2tfbCgpOworCisgICAgc3A8QXVkaW9UcmFjaz4gICAgICAgICAgbVRyYWNrOworICAgIEF1ZGlvQ2FsbGJhY2sgICAgICAgICAgIG1DYWxsYmFjazsKKyAgICB2b2lkICogICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tDb29raWU7CisgICAgQ2FsbGJhY2tEYXRhICogICAgICAgICAgbUNhbGxiYWNrRGF0YTsKKyAgICBhdWRpb19zdHJlYW1fdHlwZV90ICAgICBtU3RyZWFtVHlwZTsKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgKiAgICBtQXR0cmlidXRlczsKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtTGVmdFZvbHVtZTsKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtUmlnaHRWb2x1bWU7CisgICAgQXVkaW9QbGF5YmFja1JhdGUgICAgICAgbVBsYXliYWNrUmF0ZTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZUh6OyAvLyBzYW1wbGUgcmF0ZSBvZiB0aGUgY29udGVudCwgYXMgc2V0IGluIG9wZW4oKQorICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1Nc2Vjc1BlckZyYW1lOworICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1GcmFtZVNpemU7CisgICAgYXVkaW9fc2Vzc2lvbl90ICAgICAgICAgbVNlc3Npb25JZDsKKyAgICB1aWRfdCAgICAgICAgICAgICAgICAgICBtVWlkOworICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1QaWQ7CisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbVNlbmRMZXZlbDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtQXV4RWZmZWN0SWQ7CisgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgICAgbUZsYWdzOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgIG1TZWxlY3RlZERldmljZUlkOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgIG1Sb3V0ZWREZXZpY2VJZDsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICBtRGV2aWNlQ2FsbGJhY2tFbmFibGVkOworICAgIHdwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiAgICAgICAgbURldmljZUNhbGxiYWNrOworICAgIG11dGFibGUgTXV0ZXggICAgICAgICAgIG1Mb2NrOworCisgICAgLy8gc3RhdGljIHZhcmlhYmxlcyBiZWxvdyBub3QgcHJvdGVjdGVkIGJ5IG11dGV4CisgICAgc3RhdGljIGJvb2wgICAgICAgICAgICAgbUlzT25FbXVsYXRvcjsKKyAgICBzdGF0aWMgaW50ICAgICAgICAgICAgICBtTWluQnVmZmVyQ291bnQ7ICAvLyAxMiBmb3IgZW11bGF0b3I7IG90aGVyd2lzZSA0CisKKyAgICAvLyBDYWxsYmFja0RhdGEgaXMgd2hhdCBpcyBwYXNzZWQgdG8gdGhlIEF1ZGlvVHJhY2sgYXMgdGhlICJ1c2VyIiBkYXRhLgorICAgIC8vIFdlIG5lZWQgdG8gYmUgYWJsZSB0byB0YXJnZXQgdGhpcyB0byBhIGRpZmZlcmVudCBPdXRwdXQgb24gdGhlIGZseSwKKyAgICAvLyBzbyB3ZSBjYW4ndCB1c2UgdGhlIE91dHB1dCBpdHNlbGYgZm9yIHRoaXMuCisgICAgY2xhc3MgQ2FsbGJhY2tEYXRhIHsKKyAgICAgICAgZnJpZW5kIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OworICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgQ2FsbGJhY2tEYXRhKE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0ICpjb29raWUpIHsKKyAgICAgICAgICAgIG1EYXRhID0gY29va2llOworICAgICAgICAgICAgbVN3aXRjaGluZyA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0ICpnZXRPdXRwdXQoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbURhdGE7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBzZXRPdXRwdXQoTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQqIG5ld2Nvb2tpZSkgeworICAgICAgICAgICAgbURhdGEgPSBuZXdjb29raWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gbG9jay91bmxvY2sgYXJlIHVzZWQgYnkgdGhlIGNhbGxiYWNrIGJlZm9yZSBhY2Nlc3NpbmcgdGhlIHBheWxvYWQgb2YgdGhpcyBvYmplY3QKKyAgICAgICAgdm9pZCBsb2NrKCkgY29uc3QgeworICAgICAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICB9CisgICAgICAgIHZvaWQgdW5sb2NrKCkgY29uc3QgeworICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyB0cnlCZWdpblRyYWNrU3dpdGNoL2VuZFRyYWNrU3dpdGNoIGFyZSB1c2VkIHdoZW4gdGhlIENhbGxiYWNrRGF0YSBpcyBoYW5kZWQgb3ZlcgorICAgICAgICAvLyB0byB0aGUgbmV4dCBzaW5rLgorCisgICAgICAgIC8vIHRyeUJlZ2luVHJhY2tTd2l0Y2goKSByZXR1cm5zIHRydWUgb25seSBpZiBpdCBvYnRhaW5zIHRoZSBsb2NrLgorICAgICAgICBib29sIHRyeUJlZ2luVHJhY2tTd2l0Y2goKSB7CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1Td2l0Y2hpbmcsICJ0cnlCZWdpblRyYWNrU3dpdGNoKCkgYWxyZWFkeSBjYWxsZWQiKTsKKyAgICAgICAgICAgIGlmIChtTG9jay50cnlMb2NrKCkgIT0gT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU3dpdGNoaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHZvaWQgZW5kVHJhY2tTd2l0Y2goKSB7CisgICAgICAgICAgICBpZiAobVN3aXRjaGluZykgeworICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVN3aXRjaGluZyA9IGZhbHNlOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBNZWRpYVBsYXllcjJBdWRpb091dHB1dCAqbURhdGE7CisgICAgICAgIG11dGFibGUgTXV0ZXggbUxvY2s7IC8vIGEgcmVjdXJzaXZlIG11dGV4IG1pZ2h0IG1ha2UgdGhpcyB1bm5lY2Vzc2FyeS4KKyAgICAgICAgYm9vbCBtU3dpdGNoaW5nOworICAgICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDYWxsYmFja0RhdGEpOworICAgIH07Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9NRURJQVBMQVlFUjJBVURJT09VVFBVVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIySW50ZXJmYWNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIySW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJiZjg5MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJJbnRlcmZhY2UuaApAQCAtMCwwICsxLDI4MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBUExBWUVSMklOVEVSRkFDRV9ICisjZGVmaW5lIEFORFJPSURfTUVESUFQTEFZRVIySU5URVJGQUNFX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCisjaW5jbHVkZSA8bWVkaWEvQVZTeW5jU2V0dGluZ3MuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9UaW1lc3RhbXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9CdWZmZXJpbmdTZXR0aW5ncy5oPgorI2luY2x1ZGUgPG1lZGlhL01ldGFkYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgorI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJUeXBlcy5oPgorCisvLyBGd2QgZGVjbCB0byBtYWtlIHN1cmUgZXZlcnlvbmUgYWdyZWVzIHRoYXQgdGhlIHNjb3BlIG9mIHN0cnVjdCBzb2NrYWRkcl9pbiBpcworLy8gZ2xvYmFsLCBhbmQgbm90IGluIGFuZHJvaWQ6Ogorc3RydWN0IHNvY2thZGRyX2luOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBEYXRhU291cmNlRGVzYzsKK2NsYXNzIFBhcmNlbDsKK3N0cnVjdCBBTmF0aXZlV2luZG93V3JhcHBlcjsKKworI2RlZmluZSBERUZBVUxUX0FVRElPU0lOS19CVUZGRVJDT1VOVCA0CisjZGVmaW5lIERFRkFVTFRfQVVESU9TSU5LX0JVRkZFUlNJWkUgMTIwMAorI2RlZmluZSBERUZBVUxUX0FVRElPU0lOS19TQU1QTEVSQVRFIDQ0MTAwCisKKy8vIHdoZW4gdGhlIGNoYW5uZWwgbWFzayBpc24ndCBrbm93biwgdXNlIHRoZSBjaGFubmVsIGNvdW50IHRvIGRlcml2ZSBhIG1hc2sgaW4gQXVkaW9TaW5rOjpvcGVuKCkKKyNkZWZpbmUgQ0hBTk5FTF9NQVNLX1VTRV9DSEFOTkVMX09SREVSIDAKKworLy8gZHVyYXRpb24gYmVsb3cgd2hpY2ggd2UgZG8gbm90IGFsbG93IGRlZXAgYXVkaW8gYnVmZmVyaW5nCisjZGVmaW5lIEFVRElPX1NJTktfTUlOX0RFRVBfQlVGRkVSX0RVUkFUSU9OX1VTIDUwMDAwMDAKKworY2xhc3MgTWVkaWFQbGF5ZXIySW50ZXJmYWNlTGlzdGVuZXI6IHB1YmxpYyBSZWZCYXNlCit7CitwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIG5vdGlmeShpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqb2JqKSA9IDA7Cit9OworCitjbGFzcyBNZWRpYVBsYXllcjJJbnRlcmZhY2UgOiBwdWJsaWMgQUhhbmRsZXIgeworcHVibGljOgorICAgIC8vIEF1ZGlvU2luazogYWJzdHJhY3Rpb24gbGF5ZXIgZm9yIGF1ZGlvIG91dHB1dAorICAgIGNsYXNzIEF1ZGlvU2luayA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGVudW0gY2JfZXZlbnRfdCB7CisgICAgICAgICAgICBDQl9FVkVOVF9GSUxMX0JVRkZFUiwgICAvLyBSZXF1ZXN0IHRvIHdyaXRlIG1vcmUgZGF0YSB0byBidWZmZXIuCisgICAgICAgICAgICBDQl9FVkVOVF9TVFJFQU1fRU5ELCAgICAvLyBTZW50IGFmdGVyIGFsbCB0aGUgYnVmZmVycyBxdWV1ZWQgaW4gQUYgYW5kIEhXIGFyZSBwbGF5ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2sgKGFmdGVyIHN0b3AgaXMgY2FsbGVkKQorICAgICAgICAgICAgQ0JfRVZFTlRfVEVBUl9ET1dOICAgICAgLy8gVGhlIEF1ZGlvVHJhY2sgd2FzIGludmFsaWRhdGVkIGR1ZSB0byB1c2UgY2FzZSBjaGFuZ2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIHJlLWV2YWx1YXRlIG9mZmxvYWRpbmcgb3B0aW9ucworICAgICAgICB9OworCisgICAgICAgIC8vIENhbGxiYWNrIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSB3cml0dGVuIHRvIHRoZSBidWZmZXIuCisgICAgICAgIHR5cGVkZWYgc2l6ZV90ICgqQXVkaW9DYWxsYmFjaykoCisgICAgICAgICAgICAgICAgQXVkaW9TaW5rICphdWRpb1NpbmssIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUsIHZvaWQgKmNvb2tpZSwgY2JfZXZlbnRfdCBldmVudCk7CisKKyAgICAgICAgdmlydHVhbCB+QXVkaW9TaW5rKCkge30KKyAgICAgICAgdmlydHVhbCBib29sIHJlYWR5KCkgY29uc3QgPSAwOyAvLyBhdWRpbyBvdXRwdXQgaXMgb3BlbiBhbmQgcmVhZHkKKyAgICAgICAgdmlydHVhbCBzc2l6ZV90IGJ1ZmZlclNpemUoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgc3NpemVfdCBmcmFtZUNvdW50KCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIHNzaXplX3QgY2hhbm5lbENvdW50KCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIHNzaXplX3QgZnJhbWVTaXplKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGxhdGVuY3koKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgZmxvYXQgbXNlY3NQZXJGcmFtZSgpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQb3NpdGlvbih1aW50MzJfdCAqcG9zaXRpb24pIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAgJnRzKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgaW50NjRfdCBnZXRQbGF5ZWRPdXREdXJhdGlvblVzKGludDY0X3Qgbm93VXMpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZXNXcml0dGVuKHVpbnQzMl90ICpmcmFtZXN3cml0dGVuKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgYXVkaW9fc2Vzc2lvbl90IGdldFNlc3Npb25JZCgpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBhdWRpb19zdHJlYW1fdHlwZV90IGdldEF1ZGlvU3RyZWFtVHlwZSgpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTYW1wbGVSYXRlKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIGludDY0X3QgZ2V0QnVmZmVyRHVyYXRpb25JblVzKCkgY29uc3QgPSAwOworCisgICAgICAgIC8vIElmIG5vIGNhbGxiYWNrIGlzIHNwZWNpZmllZCwgdXNlIHRoZSAid3JpdGUiIEFQSSBiZWxvdyB0byBzdWJtaXQKKyAgICAgICAgLy8gYXVkaW8gZGF0YS4KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuKAorICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsIGludCBjaGFubmVsQ291bnQsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdD1BVURJT19GT1JNQVRfUENNXzE2X0JJVCwKKyAgICAgICAgICAgICAgICBpbnQgYnVmZmVyQ291bnQ9REVGQVVMVF9BVURJT1NJTktfQlVGRkVSQ09VTlQsCisgICAgICAgICAgICAgICAgQXVkaW9DYWxsYmFjayBjYiA9IE5VTEwsCisgICAgICAgICAgICAgICAgdm9pZCAqY29va2llID0gTlVMTCwKKyAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkUsCisgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gTlVMTCwKKyAgICAgICAgICAgICAgICBib29sIGRvTm90UmVjb25uZWN0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgdWludDMyX3Qgc3VnZ2VzdGVkRnJhbWVDb3VudCA9IDApID0gMDsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCkgPSAwOworCisgICAgICAgIC8qIElucHV0IHBhcmFtZXRlciB8c2l6ZXwgaXMgaW4gYnl0ZSB1bml0cyBzdG9yZWQgaW4gfGJ1ZmZlcnwuCisgICAgICAgICAqIERhdGEgaXMgY29waWVkIG92ZXIgYW5kIGFjdHVhbCBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiAoPj0gMCkKKyAgICAgICAgICogaXMgcmV0dXJuZWQsIG9yIG5vIGRhdGEgaXMgY29waWVkIGFuZCBhIG5lZ2F0aXZlIHN0YXR1cyBjb2RlCisgICAgICAgICAqIGlzIHJldHVybmVkIChldmVuIHdoZW4gfGJsb2NraW5nfCBpcyB0cnVlKS4KKyAgICAgICAgICogV2hlbiB8YmxvY2tpbmd8IGlzIGZhbHNlLCBBdWRpb1Npbmsgd2lsbCBpbW1lZGlhdGVseSByZXR1cm4gYWZ0ZXIKKyAgICAgICAgICogcGFydCBvZiBvciBmdWxsIHxidWZmZXJ8IGlzIGNvcGllZCBvdmVyLgorICAgICAgICAgKiBXaGVuIHxibG9ja2luZ3wgaXMgdHJ1ZSwgQXVkaW9TaW5rIHdpbGwgd2FpdCB0byBjb3B5IHRoZSBlbnRpcmUKKyAgICAgICAgICogYnVmZmVyLCB1bmxlc3MgYW4gZXJyb3Igb2NjdXJzIG9yIHRoZSBjb3B5IG9wZXJhdGlvbiBpcworICAgICAgICAgKiBwcmVtYXR1cmVseSBzdG9wcGVkLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzc2l6ZV90IHdyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUsIGJvb2wgYmxvY2tpbmcgPSB0cnVlKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHN0b3AoKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBmbHVzaCgpID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHBhdXNlKCkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja1JhdGUoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUmIHJhdGUpID0gMDsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQbGF5YmFja1JhdGUoQXVkaW9QbGF5YmFja1JhdGUqIHJhdGUgLyogbm9ubnVsbCAqLykgPSAwOworICAgICAgICB2aXJ0dWFsIGJvb2wgbmVlZHNUcmFpbGluZ1BhZGRpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiAvKiBrZXlWYWx1ZVBhaXJzICovKSB7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBTdHJpbmc4IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYgLyoga2V5cyAqLykgeworICAgICAgICAgICAgcmV0dXJuIFN0cmluZzg6OmVtcHR5KCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBBdWRpb1JvdXRpbmcKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0Um91dGVkRGV2aWNlSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCogZGV2aWNlSWQpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKTsKKyAgICB9OworCisgICAgTWVkaWFQbGF5ZXIySW50ZXJmYWNlKCkgOiBtTGlzdGVuZXIoTlVMTCkgeyB9CisgICAgdmlydHVhbCB+TWVkaWFQbGF5ZXIySW50ZXJmYWNlKCkgeyB9CisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0QXVkaW9TaW5rKGNvbnN0IHNwPEF1ZGlvU2luaz4mIGF1ZGlvU2luaykgeworICAgICAgICBtQXVkaW9TaW5rID0gYXVkaW9TaW5rOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxEYXRhU291cmNlRGVzYz4gJmRzZCkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlTmV4dERhdGFTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZURlc2M+ICZkc2QpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcGxheU5leHREYXRhU291cmNlKGludDY0X3Qgc3JjSWQpID0gMDsKKworICAgIC8vIHBhc3MgdGhlIGJ1ZmZlcmVkIG5hdGl2ZSB3aW5kb3cgdG8gdGhlIG1lZGlhIHBsYXllciBzZXJ2aWNlCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWaWRlb1N1cmZhY2VUZXh0dXJlKGNvbnN0IHNwPEFOYXRpdmVXaW5kb3dXcmFwcGVyPiYgbnd3KSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlcmluZ1NldHRpbmdzKEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgeworICAgICAgICAqYnVmZmVyaW5nID0gQnVmZmVyaW5nU2V0dGluZ3MoKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiAvKiBidWZmZXJpbmcgKi8pIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZUFzeW5jKCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKSA9IDA7CisgICAgdmlydHVhbCBib29sIGlzUGxheWluZygpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBsYXliYWNrU2V0dGluZ3MoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUmIHJhdGUpIHsKKyAgICAgICAgLy8gYnkgZGVmYXVsdCwgcGxheWVycyBvbmx5IHN1cHBvcnQgc2V0dGluZyByYXRlIHRvIHRoZSBkZWZhdWx0CisgICAgICAgIGlmICghaXNBdWRpb1BsYXliYWNrUmF0ZUVxdWFsKHJhdGUsIEFVRElPX1BMQVlCQUNLX1JBVEVfREVGQVVMVCkpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBsYXliYWNrU2V0dGluZ3MoQXVkaW9QbGF5YmFja1JhdGUqIHJhdGUgLyogbm9ubnVsbCAqLykgeworICAgICAgICAqcmF0ZSA9IEFVRElPX1BMQVlCQUNLX1JBVEVfREVGQVVMVDsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN5bmNTZXR0aW5ncyhjb25zdCBBVlN5bmNTZXR0aW5ncyYgc3luYywgZmxvYXQgLyogdmlkZW9GcHMgKi8pIHsKKyAgICAgICAgLy8gQnkgZGVmYXVsdCwgcGxheWVycyBvbmx5IHN1cHBvcnQgc2V0dGluZyBzeW5jIHNvdXJjZSB0byBkZWZhdWx0OyBhbGwgb3RoZXIgc3luYworICAgICAgICAvLyBzZXR0aW5ncyBhcmUgaWdub3JlZC4gVGhlcmUgaXMgbm8gcmVxdWlyZW1lbnQgZm9yIGdldHRlcnMgdG8gcmV0dXJuIHNldCB2YWx1ZXMuCisgICAgICAgIGlmIChzeW5jLm1Tb3VyY2UgIT0gQVZTWU5DX1NPVVJDRV9ERUZBVUxUKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTeW5jU2V0dGluZ3MoCisgICAgICAgICAgICBBVlN5bmNTZXR0aW5ncyogc3luYyAvKiBub25udWxsICovLCBmbG9hdCogdmlkZW9GcHMgLyogbm9ubnVsbCAqLykgeworICAgICAgICAqc3luYyA9IEFWU3luY1NldHRpbmdzKCk7CisgICAgICAgICp2aWRlb0ZwcyA9IC0xLmY7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZWVrVG8oCisgICAgICAgICAgICBpbnQ2NF90IG1zZWMsIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUgPSBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDdXJyZW50UG9zaXRpb24oaW50NjRfdCAqbXNlYykgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RHVyYXRpb24oaW50NjRfdCAqbXNlYykgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzZXQoKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBub3RpZnlBdChpbnQ2NF90IC8qIG1lZGlhVGltZVVzICovKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRMb29waW5nKGludCBsb29wKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsICZyZXF1ZXN0KSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSkgPSAwOworCisgICAgLy8gSW52b2tlIGEgZ2VuZXJpYyBtZXRob2Qgb24gdGhlIHBsYXllciBieSB1c2luZyBvcGFxdWUgcGFyY2VscworICAgIC8vIGZvciB0aGUgcmVxdWVzdCBhbmQgcmVwbHkuCisgICAgLy8KKyAgICAvLyBAcGFyYW0gcmVxdWVzdCBQYXJjZWwgdGhhdCBpcyBwb3NpdGlvbmVkIGF0IHRoZSBzdGFydCBvZiB0aGUKKyAgICAvLyAgICAgICAgICAgICAgICBkYXRhIHNlbnQgYnkgdGhlIGphdmEgbGF5ZXIuCisgICAgLy8gQHBhcmFtW291dF0gcmVwbHkgUGFyY2VsIHRvIGhvbGQgdGhlIHJlcGx5IGRhdGEuIENhbm5vdCBiZSBudWxsLgorICAgIC8vIEByZXR1cm4gT0sgaWYgdGhlIGNhbGwgd2FzIHN1Y2Nlc3NmdWwuCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbnZva2UoY29uc3QgUGFyY2VsJiByZXF1ZXN0LCBQYXJjZWwgKnJlcGx5KSA9IDA7CisKKyAgICAvLyBUaGUgQ2xpZW50IGluIHRoZSBNZXRhZGF0YVBsYXllclNlcnZpY2UgY2FsbHMgdGhpcyBtZXRob2Qgb24KKyAgICAvLyB0aGUgbmF0aXZlIHBsYXllciB0byByZXRyaWV2ZSBhbGwgb3IgYSBzdWJzZXQgb2YgbWV0YWRhdGEuCisgICAgLy8KKyAgICAvLyBAcGFyYW0gaWRzIFNvcnRlZExpc3Qgb2YgbWV0YWRhdGEgSUQgdG8gYmUgZmV0Y2guIElmIGVtcHR5LCBhbGwKKyAgICAvLyAgICAgICAgICAgIHRoZSBrbm93biBtZXRhZGF0YSBzaG91bGQgYmUgcmV0dXJuZWQuCisgICAgLy8gQHBhcmFtW2lub3V0XSByZWNvcmRzIFBhcmNlbCB3aGVyZSB0aGUgcGxheWVyIGFwcGVuZHMgaXRzIG1ldGFkYXRhLgorICAgIC8vIEByZXR1cm4gT0sgaWYgdGhlIGNhbGwgd2FzIHN1Y2Nlc3NmdWwuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhZGF0YShjb25zdCBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciYgLyogaWRzICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiAvKiByZWNvcmRzICovKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9OworCisgICAgdm9pZCBzZXRMaXN0ZW5lcihjb25zdCBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2VMaXN0ZW5lcj4gJmxpc3RlbmVyKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTGlzdGVuZXJMb2NrKTsKKyAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgfQorCisgICAgdm9pZCBzZW5kRXZlbnQoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDE9MCwgaW50IGV4dDI9MCwgY29uc3QgUGFyY2VsICpvYmo9TlVMTCkgeworICAgICAgICBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2VMaXN0ZW5lcj4gbGlzdGVuZXI7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTGlzdGVuZXJMb2NrKTsKKyAgICAgICAgICAgIGxpc3RlbmVyID0gbUxpc3RlbmVyOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxpc3RlbmVyKSB7CisgICAgICAgICAgICBsaXN0ZW5lci0+bm90aWZ5KHNyY0lkLCBtc2csIGV4dDEsIGV4dDIsIG9iaik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IC8qIGZkICovLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiAvKiBhcmdzICovKSBjb25zdCB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICYgLyogbXNnICovKSBvdmVycmlkZSB7IH0KKworICAgIC8vIE1vZHVsYXIgRFJNCisgICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlRHJtKGNvbnN0IHVpbnQ4X3QgLyogdXVpZCAqL1sxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgLyogZHJtU2Vzc2lvbklkICovKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlRHJtKCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgc3A8QXVkaW9TaW5rPiBtQXVkaW9TaW5rOworCitwcml2YXRlOgorICAgIE11dGV4IG1MaXN0ZW5lckxvY2s7CisgICAgc3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlTGlzdGVuZXI+IG1MaXN0ZW5lcjsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisKKyNlbmRpZiAvLyBBTkRST0lEX01FRElBUExBWUVSMklOVEVSRkFDRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyVHlwZXMuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJUeXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MDViNTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyVHlwZXMuaApAQCAtMCwwICsxLDIwNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBUExBWUVSMl9UWVBFU19ICisjZGVmaW5lIEFORFJPSURfTUVESUFQTEFZRVIyX1RZUEVTX0gKKworI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyX2NvbW1vbi5oPgorCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit0eXBlZGVmIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGUgTWVkaWFQbGF5ZXIyU2Vla01vZGU7CisKK2VudW0gbWVkaWEyX2V2ZW50X3R5cGUgeworICAgIE1FRElBMl9OT1AgICAgICAgICAgICAgICA9IDAsIC8vIGludGVyZmFjZSB0ZXN0IG1lc3NhZ2UKKyAgICBNRURJQTJfUFJFUEFSRUQgICAgICAgICAgPSAxLAorICAgIE1FRElBMl9QTEFZQkFDS19DT01QTEVURSA9IDIsCisgICAgTUVESUEyX0JVRkZFUklOR19VUERBVEUgID0gMywKKyAgICBNRURJQTJfU0VFS19DT01QTEVURSAgICAgPSA0LAorICAgIE1FRElBMl9TRVRfVklERU9fU0laRSAgICA9IDUsCisgICAgTUVESUEyX1NUQVJURUQgICAgICAgICAgID0gNiwKKyAgICBNRURJQTJfUEFVU0VEICAgICAgICAgICAgPSA3LAorICAgIE1FRElBMl9TVE9QUEVEICAgICAgICAgICA9IDgsCisgICAgTUVESUEyX1NLSVBQRUQgICAgICAgICAgID0gOSwKKyAgICBNRURJQTJfTk9USUZZX1RJTUUgICAgICAgPSA5OCwKKyAgICBNRURJQTJfVElNRURfVEVYVCAgICAgICAgPSA5OSwKKyAgICBNRURJQTJfRVJST1IgICAgICAgICAgICAgPSAxMDAsCisgICAgTUVESUEyX0lORk8gICAgICAgICAgICAgID0gMjAwLAorICAgIE1FRElBMl9TVUJUSVRMRV9EQVRBICAgICA9IDIwMSwKKyAgICBNRURJQTJfTUVUQV9EQVRBICAgICAgICAgPSAyMDIsCisgICAgTUVESUEyX0RSTV9JTkZPICAgICAgICAgID0gMjEwLAorICAgIE1FRElBMl9BVURJT19ST1VUSU5HX0NIQU5HRUQgPSAxMDAwMCwKK307CisKKy8vIEdlbmVyaWMgZXJyb3IgY29kZXMgZm9yIHRoZSBtZWRpYSBwbGF5ZXIgZnJhbWV3b3JrLiAgRXJyb3JzIGFyZSBmYXRhbCwgdGhlCisvLyBwbGF5YmFjayBtdXN0IGFib3J0LgorLy8KKy8vIEVycm9ycyBhcmUgY29tbXVuaWNhdGVkIGJhY2sgdG8gdGhlIGNsaWVudCB1c2luZyB0aGUKKy8vIE1lZGlhUGxheWVyMkxpc3RlbmVyOjpub3RpZnkgbWV0aG9kIGRlZmluZWQgYmVsb3cuCisvLyBJbiB0aGlzIHNpdHVhdGlvbiwgJ25vdGlmeScgaXMgaW52b2tlZCB3aXRoIHRoZSBmb2xsb3dpbmc6CisvLyAgICdtc2cnIGlzIHNldCB0byBNRURJQV9FUlJPUi4KKy8vICAgJ2V4dDEnIHNob3VsZCBiZSBhIHZhbHVlIGZyb20gdGhlIGVudW0gbWVkaWEyX2Vycm9yX3R5cGUuCisvLyAgICdleHQyJyBjb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBkZXBlbmRhbnQgZXJyb3IgY29kZSB0byBwcm92aWRlCisvLyAgICAgICAgICBtb3JlIGRldGFpbHMuIFNob3VsZCBkZWZhdWx0IHRvIDAgd2hlbiBub3QgdXNlZC4KKy8vCisvLyBUaGUgY29kZXMgYXJlIGRpc3RyaWJ1dGVkIGFzIGZvbGxvdzoKKy8vICAgMHh4OiBSZXNlcnZlZAorLy8gICAxeHg6IEFuZHJvaWQgUGxheWVyIGVycm9ycy4gU29tZXRoaW5nIHdlbnQgd3JvbmcgaW5zaWRlIHRoZSBNZWRpYVBsYXllcjIuCisvLyAgIDJ4eDogTWVkaWEgZXJyb3JzIChlLmcgQ29kZWMgbm90IHN1cHBvcnRlZCkuIFRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHRoZQorLy8gICAgICAgIG1lZGlhIGl0c2VsZi4KKy8vICAgM3h4OiBSdW50aW1lIGVycm9ycy4gU29tZSBleHRyYW9yZGluYXJ5IGNvbmRpdGlvbiBhcm9zZSBtYWtpbmcgdGhlIHBsYXliYWNrCisvLyAgICAgICAgaW1wb3NzaWJsZS4KKy8vCitlbnVtIG1lZGlhMl9lcnJvcl90eXBlIHsKKyAgICAvLyAweHgKKyAgICBNRURJQTJfRVJST1JfVU5LTk9XTiA9IDEsCisgICAgLy8gMXh4CisgICAgLy8gTUVESUEyX0VSUk9SX1NFUlZFUl9ESUVEID0gMTAwLAorICAgIC8vIDJ4eAorICAgIE1FRElBMl9FUlJPUl9OT1RfVkFMSURfRk9SX1BST0dSRVNTSVZFX1BMQVlCQUNLID0gMjAwLAorICAgIC8vIDN4eAorICAgIE1FRElBMl9FUlJPUl9GQUlMRURfVE9fU0VUX0RBVEFfU09VUkNFID0gMzAwLAorfTsKKworCisvLyBJbmZvIGFuZCB3YXJuaW5nIGNvZGVzIGZvciB0aGUgbWVkaWEgcGxheWVyIGZyYW1ld29yay4gIFRoZXNlIGFyZSBub24gZmF0YWwsCisvLyB0aGUgcGxheWJhY2sgaXMgZ29pbmcgb24gYnV0IHRoZXJlIG1pZ2h0IGJlIHNvbWUgdXNlciB2aXNpYmxlIGlzc3Vlcy4KKy8vCisvLyBJbmZvIGFuZCB3YXJuaW5nIG1lc3NhZ2VzIGFyZSBjb21tdW5pY2F0ZWQgYmFjayB0byB0aGUgY2xpZW50IHVzaW5nIHRoZQorLy8gTWVkaWFQbGF5ZXIyTGlzdGVuZXI6Om5vdGlmeSBtZXRob2QgZGVmaW5lZCBiZWxvdy4gIEluIHRoaXMgc2l0dWF0aW9uLAorLy8gJ25vdGlmeScgaXMgaW52b2tlZCB3aXRoIHRoZSBmb2xsb3dpbmc6CisvLyAgICdtc2cnIGlzIHNldCB0byBNRURJQV9JTkZPLgorLy8gICAnZXh0MScgc2hvdWxkIGJlIGEgdmFsdWUgZnJvbSB0aGUgZW51bSBtZWRpYTJfaW5mb190eXBlLgorLy8gICAnZXh0MicgY29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gZGVwZW5kYW50IGluZm8gY29kZSB0byBwcm92aWRlCisvLyAgICAgICAgICBtb3JlIGRldGFpbHMuIFNob3VsZCBkZWZhdWx0IHRvIDAgd2hlbiBub3QgdXNlZC4KKy8vCisvLyBUaGUgY29kZXMgYXJlIGRpc3RyaWJ1dGVkIGFzIGZvbGxvdzoKKy8vICAgMHh4OiBSZXNlcnZlZAorLy8gICA3eHg6IEFuZHJvaWQgUGxheWVyIGluZm8vd2FybmluZyAoZS5nIHBsYXllciBsYWdnaW5nIGJlaGluZC4pCisvLyAgIDh4eDogTWVkaWEgaW5mby93YXJuaW5nIChlLmcgbWVkaWEgYmFkbHkgaW50ZXJsZWF2ZWQuKQorLy8KK2VudW0gbWVkaWEyX2luZm9fdHlwZSB7CisgICAgLy8gMHh4CisgICAgTUVESUEyX0lORk9fVU5LTk9XTiA9IDEsCisgICAgLy8gVGhlIHBsYXllciB3YXMgc3RhcnRlZCBiZWNhdXNlIGl0IHdhcyB1c2VkIGFzIHRoZSBuZXh0IHBsYXllciBmb3IgYW5vdGhlcgorICAgIC8vIHBsYXllciwgd2hpY2gganVzdCBjb21wbGV0ZWQgcGxheWJhY2sKKyAgICBNRURJQTJfSU5GT19TVEFSVEVEX0FTX05FWFQgPSAyLAorICAgIC8vIFRoZSBwbGF5ZXIganVzdCBwdXNoZWQgdGhlIHZlcnkgZmlyc3QgdmlkZW8gZnJhbWUgZm9yIHJlbmRlcmluZworICAgIE1FRElBMl9JTkZPX1ZJREVPX1JFTkRFUklOR19TVEFSVCA9IDMsCisgICAgLy8gVGhlIHBsYXllciBqdXN0IHB1c2hlZCB0aGUgdmVyeSBmaXJzdCBhdWRpbyBmcmFtZSBmb3IgcmVuZGVyaW5nCisgICAgTUVESUEyX0lORk9fQVVESU9fUkVOREVSSU5HX1NUQVJUID0gNCwKKyAgICAvLyBUaGUgcGxheWVyIGp1c3QgY29tcGxldGVkIHRoZSBwbGF5YmFjayBvZiB0aGlzIGRhdGEgc291cmNlCisgICAgTUVESUEyX0lORk9fUExBWUJBQ0tfQ09NUExFVEUgPSA1LAorICAgIC8vIFRoZSBwbGF5ZXIganVzdCBjb21wbGV0ZWQgdGhlIHBsYXliYWNrIG9mIHRoZSBmdWxsIHBsYXkgbGlzdAorICAgIE1FRElBMl9JTkZPX1BMQVlMSVNUX0VORCA9IDYsCisKKyAgICAvLzF4eAorICAgIC8vIFRoZSBwbGF5ZXIganVzdCBwcmVwYXJlZCBhIGRhdGEgc291cmNlLgorICAgIE1FRElBMl9JTkZPX1BSRVBBUkVEID0gMTAwLAorICAgIC8vIFRoZSBwbGF5ZXIganVzdCBjb21wbGV0ZWQgYSBjYWxsIHBsYXkoKS4KKyAgICBNRURJQTJfSU5GT19DT01QTEVURV9DQUxMX1BMQVkgPSAxMDEsCisgICAgLy8gVGhlIHBsYXllciBqdXN0IGNvbXBsZXRlZCBhIGNhbGwgcGF1c2UoKS4KKyAgICBNRURJQTJfSU5GT19DT01QTEVURV9DQUxMX1BBVVNFID0gMTAyLAorICAgIC8vIFRoZSBwbGF5ZXIganVzdCBjb21wbGV0ZWQgYSBjYWxsIHNlZWtUby4KKyAgICBNRURJQTJfSU5GT19DT01QTEVURV9DQUxMX1NFRUsgPSAxMDMsCisKKyAgICAvLyA3eHgKKyAgICAvLyBUaGUgdmlkZW8gaXMgdG9vIGNvbXBsZXggZm9yIHRoZSBkZWNvZGVyOiBpdCBjYW4ndCBkZWNvZGUgZnJhbWVzIGZhc3QKKyAgICAvLyBlbm91Z2guIFBvc3NpYmx5IG9ubHkgdGhlIGF1ZGlvIHBsYXlzIGZpbmUgYXQgdGhpcyBzdGFnZS4KKyAgICBNRURJQTJfSU5GT19WSURFT19UUkFDS19MQUdHSU5HID0gNzAwLAorICAgIC8vIE1lZGlhUGxheWVyMiBpcyB0ZW1wb3JhcmlseSBwYXVzaW5nIHBsYXliYWNrIGludGVybmFsbHkgaW4gb3JkZXIgdG8KKyAgICAvLyBidWZmZXIgbW9yZSBkYXRhLgorICAgIE1FRElBMl9JTkZPX0JVRkZFUklOR19TVEFSVCA9IDcwMSwKKyAgICAvLyBNZWRpYVBsYXllcjIgaXMgcmVzdW1pbmcgcGxheWJhY2sgYWZ0ZXIgZmlsbGluZyBidWZmZXJzLgorICAgIE1FRElBMl9JTkZPX0JVRkZFUklOR19FTkQgPSA3MDIsCisgICAgLy8gQmFuZHdpZHRoIGluIHJlY2VudCBwYXN0CisgICAgTUVESUEyX0lORk9fTkVUV09SS19CQU5EV0lEVEggPSA3MDMsCisKKyAgICAvLyA4eHgKKyAgICAvLyBCYWQgaW50ZXJsZWF2aW5nIG1lYW5zIHRoYXQgYSBtZWRpYSBoYXMgYmVlbiBpbXByb3Blcmx5IGludGVybGVhdmVkIG9yIG5vdAorICAgIC8vIGludGVybGVhdmVkIGF0IGFsbCwgZS5nIGhhcyBhbGwgdGhlIHZpZGVvIHNhbXBsZXMgZmlyc3QgdGhlbiBhbGwgdGhlIGF1ZGlvCisgICAgLy8gb25lcy4gVmlkZW8gaXMgcGxheWluZyBidXQgYSBsb3Qgb2YgZGlzayBzZWVrIG1heSBiZSBoYXBwZW5pbmcuCisgICAgTUVESUEyX0lORk9fQkFEX0lOVEVSTEVBVklORyA9IDgwMCwKKyAgICAvLyBUaGUgbWVkaWEgaXMgbm90IHNlZWthYmxlIChlLmcgbGl2ZSBzdHJlYW0pLgorICAgIE1FRElBMl9JTkZPX05PVF9TRUVLQUJMRSA9IDgwMSwKKyAgICAvLyBOZXcgbWVkaWEgbWV0YWRhdGEgaXMgYXZhaWxhYmxlLgorICAgIE1FRElBMl9JTkZPX01FVEFEQVRBX1VQREFURSA9IDgwMiwKKyAgICAvLyBBdWRpbyBjYW4gbm90IGJlIHBsYXllZC4KKyAgICBNRURJQTJfSU5GT19QTEFZX0FVRElPX0VSUk9SID0gODA0LAorICAgIC8vIFZpZGVvIGNhbiBub3QgYmUgcGxheWVkLgorICAgIE1FRElBMl9JTkZPX1BMQVlfVklERU9fRVJST1IgPSA4MDUsCisKKyAgICAvLzl4eAorICAgIE1FRElBMl9JTkZPX1RJTUVEX1RFWFRfRVJST1IgPSA5MDAsCit9OworCisvLyBEbyBub3QgY2hhbmdlIHRoZXNlIHZhbHVlcyB3aXRob3V0IHVwZGF0aW5nIHRoZWlyIGNvdW50ZXJwYXJ0cyBpbiBNZWRpYVBsYXllcjIuamF2YQorZW51bSBtZWRpYXBsYXllcjJfc3RhdGVzIHsKKyAgICBNRURJQVBMQVlFUjJfU1RBVEVfSURMRSAgICAgICAgID0gMSwKKyAgICBNRURJQVBMQVlFUjJfU1RBVEVfUFJFUEFSRUQgICAgID0gMiwKKyAgICBNRURJQVBMQVlFUjJfU1RBVEVfUExBWUlORyAgICAgID0gMywKKyAgICBNRURJQVBMQVlFUjJfU1RBVEVfUEFVU0VEICAgICAgID0gNCwKKyAgICBNRURJQVBMQVlFUjJfU1RBVEVfRVJST1IgICAgICAgID0gNSwKK307CisKK2VudW0gbWVkaWFfcGxheWVyMl9pbnRlcm5hbF9zdGF0ZXMgeworICAgIE1FRElBX1BMQVlFUjJfU1RBVEVfRVJST1IgICAgICAgID0gMCwKKyAgICBNRURJQV9QTEFZRVIyX0lETEUgICAgICAgICAgICAgICA9IDEgPDwgMCwKKyAgICBNRURJQV9QTEFZRVIyX0lOSVRJQUxJWkVEICAgICAgICA9IDEgPDwgMSwKKyAgICBNRURJQV9QTEFZRVIyX1BSRVBBUklORyAgICAgICAgICA9IDEgPDwgMiwKKyAgICBNRURJQV9QTEFZRVIyX1BSRVBBUkVEICAgICAgICAgICA9IDEgPDwgMywKKyAgICBNRURJQV9QTEFZRVIyX1NUQVJURUQgICAgICAgICAgICA9IDEgPDwgNCwKKyAgICBNRURJQV9QTEFZRVIyX1BBVVNFRCAgICAgICAgICAgICA9IDEgPDwgNSwKKyAgICBNRURJQV9QTEFZRVIyX1NUT1BQRUQgICAgICAgICAgICA9IDEgPDwgNiwKKyAgICBNRURJQV9QTEFZRVIyX1BMQVlCQUNLX0NPTVBMRVRFICA9IDEgPDwgNworfTsKKworLy8gS2VlcCBLRVlfUEFSQU1FVEVSXyogaW4gc3luYyB3aXRoIE1lZGlhUGxheWVyMi5qYXZhLgorLy8gVGhlIHNhbWUgZW51bSBzcGFjZSBpcyB1c2VkIGZvciBib3RoIHNldCBhbmQgZ2V0LCBpbiBjYXNlIHRoZXJlIGFyZSBmdXR1cmUga2V5cyB0aGF0CisvLyBjYW4gYmUgYm90aCBzZXQgYW5kIGdldC4gIEJ1dCBhcyBvZiBub3csIGFsbCBwYXJhbWV0ZXJzIGFyZSBlaXRoZXIgc2V0IG9ubHkgb3IgZ2V0IG9ubHkuCitlbnVtIG1lZGlhMl9wYXJhbWV0ZXJfa2V5cyB7CisgICAgLy8gU3RyZWFtaW5nL2J1ZmZlcmluZyBwYXJhbWV0ZXJzCisgICAgTUVESUEyX0tFWV9QQVJBTUVURVJfQ0FDSEVfU1RBVF9DT0xMRUNUX0ZSRVFfTVMgPSAxMTAwLCAgICAgICAgICAgIC8vIHNldCBvbmx5CisKKyAgICAvLyBSZXR1cm4gYSBQYXJjZWwgY29udGFpbmluZyBhIHNpbmdsZSBpbnQsIHdoaWNoIGlzIHRoZSBjaGFubmVsIGNvdW50IG9mIHRoZQorICAgIC8vIGF1ZGlvIHRyYWNrLCBvciB6ZXJvIGZvciBlcnJvciAoZS5nLiBubyBhdWRpbyB0cmFjaykgb3IgdW5rbm93bi4KKyAgICBNRURJQTJfS0VZX1BBUkFNRVRFUl9BVURJT19DSEFOTkVMX0NPVU5UID0gMTIwMCwgICAgICAgICAgICAgICAgICAgLy8gZ2V0IG9ubHkKKworICAgIC8vIFBsYXliYWNrIHJhdGUgZXhwcmVzc2VkIGluIHBlcm1pbGxlICgxMDAwIGlzIG5vcm1hbCBzcGVlZCksIHNhdmVkIGFzIGludDMyX3QsIHdpdGggbmVnYXRpdmUKKyAgICAvLyB2YWx1ZXMgdXNlZCBmb3IgcmV3aW5kaW5nIG9yIHJldmVyc2UgcGxheWJhY2suCisgICAgTUVESUEyX0tFWV9QQVJBTUVURVJfUExBWUJBQ0tfUkFURV9QRVJNSUxMRSA9IDEzMDAsICAgICAgICAgICAgICAgIC8vIHNldCBvbmx5CisKKyAgICAvLyBTZXQgYSBQYXJjZWwgY29udGFpbmluZyB0aGUgdmFsdWUgb2YgYSBwYXJjZWxsZWQgSmF2YSBBdWRpb0F0dHJpYnV0ZSBpbnN0YW5jZQorICAgIE1FRElBMl9LRVlfUEFSQU1FVEVSX0FVRElPX0FUVFJJQlVURVMgPSAxNDAwICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgb25seQorfTsKKworLy8gS2VlcCBJTlZPS0VfSURfKiBpbiBzeW5jIHdpdGggTWVkaWFQbGF5ZXIyLmphdmEuCitlbnVtIG1lZGlhX3BsYXllcjJfaW52b2tlX2lkcyB7CisgICAgTUVESUFfUExBWUVSMl9JTlZPS0VfSURfR0VUX1RSQUNLX0lORk8gPSAxLAorICAgIE1FRElBX1BMQVlFUjJfSU5WT0tFX0lEX0FERF9FWFRFUk5BTF9TT1VSQ0UgPSAyLAorICAgIE1FRElBX1BMQVlFUjJfSU5WT0tFX0lEX0FERF9FWFRFUk5BTF9TT1VSQ0VfRkQgPSAzLAorICAgIE1FRElBX1BMQVlFUjJfSU5WT0tFX0lEX1NFTEVDVF9UUkFDSyA9IDQsCisgICAgTUVESUFfUExBWUVSMl9JTlZPS0VfSURfVU5TRUxFQ1RfVFJBQ0sgPSA1LAorICAgIE1FRElBX1BMQVlFUjJfSU5WT0tFX0lEX1NFVF9WSURFT19TQ0FMSU5HX01PREUgPSA2LAorICAgIE1FRElBX1BMQVlFUjJfSU5WT0tFX0lEX0dFVF9TRUxFQ1RFRF9UUkFDSyA9IDcKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX01FRElBUExBWUVSMl9UWVBFU19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvbWVkaWFwbGF5ZXIyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvbWVkaWFwbGF5ZXIyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU4NjE5MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9tZWRpYXBsYXllcjIuaApAQCAtMCwwICsxLDE4MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBUExBWUVSMl9ICisjZGVmaW5lIEFORFJPSURfTUVESUFQTEFZRVIyX0gKKworI2luY2x1ZGUgPG1lZGlhL0FWU3luY1NldHRpbmdzLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaD4KKyNpbmNsdWRlIDxtZWRpYS9CdWZmZXJpbmdTZXR0aW5ncy5oPgorI2luY2x1ZGUgPG1lZGlhL01ldGFkYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvbWVkaWFwbGF5ZXJfY29tbW9uLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkludGVyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJUeXBlcy5oPgorCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8tYmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBTmF0aXZlV2luZG93V3JhcHBlcjsKK3N0cnVjdCBEYXRhU291cmNlRGVzYzsKK2NsYXNzIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OworCisvLyByZWYtY291bnRlZCBvYmplY3QgZm9yIGNhbGxiYWNrcworY2xhc3MgTWVkaWFQbGF5ZXIyTGlzdGVuZXI6IHZpcnR1YWwgcHVibGljIFJlZkJhc2UKK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5KGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICpvYmopID0gMDsKK307CisKK2NsYXNzIE1lZGlhUGxheWVyMiA6IHB1YmxpYyBNZWRpYVBsYXllcjJJbnRlcmZhY2VMaXN0ZW5lcgoreworcHVibGljOgorICAgIH5NZWRpYVBsYXllcjIoKTsKKworICAgIHN0YXRpYyBzcDxNZWRpYVBsYXllcjI+IENyZWF0ZSgpOworICAgIHN0YXRpYyBzdGF0dXNfdCBEdW1wQWxsKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CisKKyAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBkaXNjb25uZWN0KCk7CisKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBnZXRTcmNJZChpbnQ2NF90ICpzcmNJZCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxEYXRhU291cmNlRGVzYz4gJmRzZCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgcHJlcGFyZU5leHREYXRhU291cmNlKGNvbnN0IHNwPERhdGFTb3VyY2VEZXNjPiAmZHNkKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBwbGF5TmV4dERhdGFTb3VyY2UoaW50NjRfdCBzcmNJZCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0VmlkZW9TdXJmYWNlVGV4dHVyZShjb25zdCBzcDxBTmF0aXZlV2luZG93V3JhcHBlcj4mIG53dyk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0TGlzdGVuZXIoY29uc3Qgc3A8TWVkaWFQbGF5ZXIyTGlzdGVuZXI+JiBsaXN0ZW5lcik7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0QnVmZmVyaW5nU2V0dGluZ3MoQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBwcmVwYXJlQXN5bmMoKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzdGFydCgpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHN0b3AoKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBwYXVzZSgpOworICAgICAgICAgICAgYm9vbCAgICAgICAgICAgIGlzUGxheWluZygpOworICAgICAgICAgICAgbWVkaWFwbGF5ZXIyX3N0YXRlcyBnZXRNZWRpYVBsYXllcjJTdGF0ZSgpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldFBsYXliYWNrU2V0dGluZ3MoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUmIHJhdGUpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldFBsYXliYWNrU2V0dGluZ3MoQXVkaW9QbGF5YmFja1JhdGUqIHJhdGUgLyogbm9ubnVsbCAqLyk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0U3luY1NldHRpbmdzKGNvbnN0IEFWU3luY1NldHRpbmdzJiBzeW5jLCBmbG9hdCB2aWRlb0Zwc0hpbnQpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldFN5bmNTZXR0aW5ncygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWU3luY1NldHRpbmdzKiBzeW5jIC8qIG5vbm51bGwgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdmlkZW9GcHMgLyogbm9ubnVsbCAqLyk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0VmlkZW9XaWR0aChpbnQgKncpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldFZpZGVvSGVpZ2h0KGludCAqaCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2Vla1RvKAorICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG1zZWMsCisgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUgPSBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBub3RpZnlBdChpbnQ2NF90IG1lZGlhVGltZVVzKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBnZXRDdXJyZW50UG9zaXRpb24oaW50NjRfdCAqbXNlYyk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0RHVyYXRpb24oaW50NjRfdCAqbXNlYyk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRBdWRpb1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCB0eXBlKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBnZXRBdWRpb1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCAqdHlwZSk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0TG9vcGluZyhpbnQgbG9vcCk7CisgICAgICAgICAgICBib29sICAgICAgICAgICAgaXNMb29waW5nKCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0Vm9sdW1lKGZsb2F0IGxlZnRWb2x1bWUsIGZsb2F0IHJpZ2h0Vm9sdW1lKTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBub3RpZnkoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwgKm9iaiA9IE5VTEwpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGludm9rZShjb25zdCBQYXJjZWwmIHJlcXVlc3QsIFBhcmNlbCAqcmVwbHkpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldE1ldGFkYXRhRmlsdGVyKGNvbnN0IFBhcmNlbCYgZmlsdGVyKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBnZXRNZXRhZGF0YShib29sIHVwZGF0ZV9vbmx5LCBib29sIGFwcGx5X2ZpbHRlciwgUGFyY2VsICptZXRhZGF0YSk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0QXVkaW9TZXNzaW9uSWQoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCk7CisgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgZ2V0QXVkaW9TZXNzaW9uSWQoKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRBdXhFZmZlY3RTZW5kTGV2ZWwoZmxvYXQgbGV2ZWwpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGF0dGFjaEF1eEVmZmVjdChpbnQgZWZmZWN0SWQpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwmIHJlcXVlc3QpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwqIHJlcGx5KTsKKworICAgICAgICAgICAgLy8gTW9kdWxhciBEUk0KKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBwcmVwYXJlRHJtKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgZHJtU2Vzc2lvbklkKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICByZWxlYXNlRHJtKCk7CisgICAgICAgICAgICAvLyBBdWRpb1JvdXRpbmcKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCk7CisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldFJvdXRlZERldmljZUlkKCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpOworCisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOworCitwcml2YXRlOgorICAgIE1lZGlhUGxheWVyMigpOworICAgIGJvb2wgaW5pdCgpOworCisgICAgLy8gQHBhcmFtIHR5cGUgT2YgdGhlIG1ldGFkYXRhIHRvIGJlIHRlc3RlZC4KKyAgICAvLyBAcmV0dXJuIHRydWUgaWYgdGhlIG1ldGFkYXRhIHNob3VsZCBiZSBkcm9wcGVkIGFjY29yZGluZyB0bworICAgIC8vICAgICAgICAgICAgICB0aGUgZmlsdGVycy4KKyAgICBib29sIHNob3VsZERyb3BNZXRhZGF0YShtZWRpYTo6TWV0YWRhdGE6OlR5cGUgdHlwZSkgY29uc3Q7CisKKyAgICAvLyBBZGQgYSBuZXcgZWxlbWVudCB0byB0aGUgc2V0IG9mIG1ldGFkYXRhIHVwZGF0ZWQuIE5vb3AgaWYKKyAgICAvLyB0aGUgZWxlbWVudCBleGlzdHMgYWxyZWFkeS4KKyAgICAvLyBAcGFyYW0gdHlwZSBPZiB0aGUgbWV0YWRhdGEgdG8gYmUgcmVjb3JkZWQuCisgICAgdm9pZCBhZGROZXdNZXRhZGF0YVVwZGF0ZShtZWRpYTo6TWV0YWRhdGE6OlR5cGUgdHlwZSk7CisKKyAgICAvLyBEaXNjb25uZWN0IGZyb20gdGhlIGN1cnJlbnRseSBjb25uZWN0ZWQgQU5hdGl2ZVdpbmRvdy4KKyAgICB2b2lkIGRpc2Nvbm5lY3ROYXRpdmVXaW5kb3dfbCgpOworCisgICAgc3RhdHVzX3Qgc2V0QXVkaW9BdHRyaWJ1dGVzX2woY29uc3QgUGFyY2VsICZyZXF1ZXN0KTsKKworICAgIHZvaWQgY2xlYXJfbCgpOworICAgIHN0YXR1c190IHNlZWtUb19sKGludDY0X3QgbXNlYywgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSk7CisgICAgc3RhdHVzX3QgcHJlcGFyZUFzeW5jX2woKTsKKyAgICBzdGF0dXNfdCBnZXREdXJhdGlvbl9sKGludDY0X3QgKm1zZWMpOworICAgIHN0YXR1c190IHJlc2V0X2woKTsKKyAgICBzdGF0dXNfdCBjaGVja1N0YXRlRm9yS2V5U2V0X2woaW50IGtleSk7CisKKyAgICBwaWRfdCAgICAgICAgICAgICAgICAgICAgICAgbVBpZDsKKyAgICB1aWRfdCAgICAgICAgICAgICAgICAgICAgICAgbVVpZDsKKyAgICBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2U+ICAgbVBsYXllcjsKKyAgICBzcDxNZWRpYVBsYXllcjJBdWRpb091dHB1dD4gbUF1ZGlvT3V0cHV0OworICAgIGludDY0X3QgICAgICAgICAgICAgICAgICAgICBtU3JjSWQ7CisgICAgdGhyZWFkX2lkX3QgICAgICAgICAgICAgICAgIG1Mb2NrVGhyZWFkSWQ7CisgICAgbXV0YWJsZSBNdXRleCAgICAgICAgICAgICAgIG1Mb2NrOworICAgIE11dGV4ICAgICAgICAgICAgICAgICAgICAgICBtTm90aWZ5TG9jazsKKyAgICBzcDxNZWRpYVBsYXllcjJMaXN0ZW5lcj4gICAgbUxpc3RlbmVyOworICAgIG1lZGlhX3BsYXllcjJfaW50ZXJuYWxfc3RhdGVzIG1DdXJyZW50U3RhdGU7CisgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50UG9zaXRpb247CisgICAgTWVkaWFQbGF5ZXIyU2Vla01vZGUgICAgICAgIG1DdXJyZW50U2Vla01vZGU7CisgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgIG1TZWVrUG9zaXRpb247CisgICAgTWVkaWFQbGF5ZXIyU2Vla01vZGUgICAgICAgIG1TZWVrTW9kZTsKKyAgICBhdWRpb19zdHJlYW1fdHlwZV90ICAgICAgICAgbVN0cmVhbVR5cGU7CisgICAgUGFyY2VsKiAgICAgICAgICAgICAgICAgICAgIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWw7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1Mb29wOworICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICBtTGVmdFZvbHVtZTsKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgbVJpZ2h0Vm9sdW1lOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBtVmlkZW9XaWR0aDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvSGVpZ2h0OworICAgIGF1ZGlvX3Nlc3Npb25fdCAgICAgICAgICAgICBtQXVkaW9TZXNzaW9uSWQ7CisgICAgYXVkaW9fYXR0cmlidXRlc190ICogICAgICAgIG1BdWRpb0F0dHJpYnV0ZXM7CisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgIG1TZW5kTGV2ZWw7CisKKyAgICBzcDxBTmF0aXZlV2luZG93V3JhcHBlcj4gICAgbUNvbm5lY3RlZFdpbmRvdzsKKworICAgIC8vIE1ldGFkYXRhIGZpbHRlcnMuCisgICAgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXIgbU1ldGFkYXRhQWxsb3c7ICAvLyBwcm90ZWN0ZWQgYnkgbUxvY2sKKyAgICBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciBtTWV0YWRhdGFEcm9wOyAgLy8gcHJvdGVjdGVkIGJ5IG1Mb2NrCisKKyAgICAvLyBNZXRhZGF0YSB1cGRhdGVkLiBGb3IgZWFjaCBNRURJQV9JTkZPX01FVEFEQVRBX1VQREFURQorICAgIC8vIG5vdGlmaWNhdGlvbiB3ZSB0cnkgdG8gdXBkYXRlIG1NZXRhZGF0YVVwZGF0ZWQgd2hpY2ggaXMgYQorICAgIC8vIHNldDogbm8gZHVwbGljYXRlLgorICAgIC8vIGdldE1ldGFkYXRhIGNsZWFycyB0aGlzIHNldC4KKyAgICBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciBtTWV0YWRhdGFVcGRhdGVkOyAgLy8gcHJvdGVjdGVkIGJ5IG1Mb2NrCit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9NRURJQVBMQVlFUjJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL21lZGlhcGxheWVyMi5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbWVkaWFwbGF5ZXIyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTU2N2RjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL21lZGlhcGxheWVyMi5jcHAKQEAgLTAsMCArMSwxNTUyIEBACisvKgorKioKKyoqIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1lZGlhUGxheWVyMk5hdGl2ZSIKKworI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKworI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZURlc2MuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYS9NZW1vcnlMZWFrVHJhY2tVdGlsLmg+CisjaW5jbHVkZSA8bWVkaWEvTWV0YWRhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtXcmFwcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQuaD4KKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvbWVkaWFwbGF5ZXIyLmg+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxzeXN0ZW0vd2luZG93Lmg+CisKKyNpbmNsdWRlIDxudXBsYXllcjIvTnVQbGF5ZXIyRHJpdmVyLmg+CisKKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2V4dGVybiBBTG9vcGVyUm9zdGVyIGdMb29wZXJSb3N0ZXI7CisKK25hbWVzcGFjZSB7CisKK2NvbnN0IGludCBrRHVtcExvY2tSZXRyaWVzID0gNTA7Citjb25zdCBpbnQga0R1bXBMb2NrU2xlZXBVcyA9IDIwMDAwOworCisvLyBNYXggbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGZpbHRlci4KK2NvbnN0IGludCBrTWF4RmlsdGVyU2l6ZSA9IDY0OyAgLy8gSSBwdWxsZWQgdGhhdCBvdXQgb2YgdGhpbiBhaXIuCisKKy8vIEZJWE1FOiBNb3ZlIGFsbCB0aGUgbWV0YWRhdGEgcmVsYXRlZCBmdW5jdGlvbiBpbiB0aGUgTWV0YWRhdGEuY3BwCisKKy8vIFVubWFyc2hhbGwgYSBmaWx0ZXIgZnJvbSBhIFBhcmNlbC4KKy8vIEZpbHRlciBmb3JtYXQgaW4gYSBwYXJjZWw6CisvLworLy8gIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKy8vIHwgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciBvZiBlbnRyaWVzIChuKSAgICAgICAgICAgICAgICAgICB8CisvLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworLy8gfCAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgdHlwZSAxICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisvLyB8ICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSB0eXBlIDIgICAgICAgICAgICAgICAgICAgICAgICAgfAorLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKy8vICAuLi4uCisvLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworLy8gfCAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgdHlwZSBuICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisvLworLy8gQHBhcmFtIHAgUGFyY2VsIHRoYXQgc2hvdWxkIHN0YXJ0IHdpdGggYSBmaWx0ZXIuCisvLyBAcGFyYW1bb3V0XSBmaWx0ZXIgT24gZXhpdCBjb250YWlucyB0aGUgbGlzdCBvZiBtZXRhZGF0YSB0eXBlIHRvIGJlCisvLyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWQuCisvLyBAcGFyYW1bb3V0XSBzdGF0dXMgT24gZXhpdCBjb250YWlucyB0aGUgc3RhdHVzIGNvZGUgdG8gYmUgcmV0dXJuZWQuCisvLyBAcmV0dXJuIHRydWUgaWYgdGhlIHBhcmNlbCBzdGFydHMgd2l0aCBhIHZhbGlkIGZpbHRlci4KK2Jvb2wgdW5tYXJzaGFsbEZpbHRlcihjb25zdCBQYXJjZWwmIHAsCisgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXIgKmZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKSB7CisgICAgaW50MzJfdCB2YWw7CisgICAgaWYgKHAucmVhZEludDMyKCZ2YWwpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVhZCBmaWx0ZXIncyBsZW5ndGgiKTsKKyAgICAgICAgKnN0YXR1cyA9IE5PVF9FTk9VR0hfREFUQTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICh2YWwgPiBrTWF4RmlsdGVyU2l6ZSB8fCB2YWwgPCAwKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIGZpbHRlciBsZW4gJWQiLCB2YWwpOworICAgICAgICAqc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29uc3Qgc2l6ZV90IG51bSA9IHZhbDsKKworICAgIGZpbHRlci0+Y2xlYXIoKTsKKyAgICBmaWx0ZXItPnNldENhcGFjaXR5KG51bSk7CisKKyAgICBzaXplX3Qgc2l6ZSA9IG51bSAqIHNpemVvZihtZWRpYTo6TWV0YWRhdGE6OlR5cGUpOworCisKKyAgICBpZiAocC5kYXRhQXZhaWwoKSA8IHNpemUpIHsKKyAgICAgICAgQUxPR0UoIkZpbHRlciB0b28gc2hvcnQgZXhwZWN0ZWQgJXp1IGJ1dCBnb3QgJXp1Iiwgc2l6ZSwgcC5kYXRhQXZhaWwoKSk7CisgICAgICAgICpzdGF0dXMgPSBOT1RfRU5PVUdIX0RBVEE7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjb25zdCBtZWRpYTo6TWV0YWRhdGE6OlR5cGUgKmRhdGEgPQorICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBtZWRpYTo6TWV0YWRhdGE6OlR5cGUqPihwLnJlYWRJbnBsYWNlKHNpemUpKTsKKworICAgIGlmIChOVUxMID09IGRhdGEpIHsKKyAgICAgICAgQUxPR0UoIkZpbHRlciBoYWQgbm8gZGF0YSIpOworICAgICAgICAqc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gVE9ETzogVGhlIHN0bCBpbXBsIG9mIHZlY3RvciB3b3VsZCBiZSBtb3JlIGVmZmljaWVudCBoZXJlCisgICAgLy8gYmVjYXVzZSBpdCBkZWdlbmVyYXRlcyBpbnRvIGEgbWVtY3B5IG9uIHBvZCB0eXBlcy4gVHJ5IHRvCisgICAgLy8gcmVwbGFjZSBsYXRlciBvciB1c2Ugc3RsOjpzZXQuCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW07ICsraSkgeworICAgICAgICBmaWx0ZXItPmFkZCgqZGF0YSk7CisgICAgICAgICsrZGF0YTsKKyAgICB9CisgICAgKnN0YXR1cyA9IE9LOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBAcGFyYW0gZmlsdGVyIE9mIG1ldGFkYXRhIHR5cGUuCisvLyBAcGFyYW0gdmFsIFRvIGJlIHNlYXJjaGVkLgorLy8gQHJldHVybiB0cnVlIGlmIGEgbWF0Y2ggd2FzIGZvdW5kLgorYm9vbCBmaW5kTWV0YWRhdGEoY29uc3QgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXImIGZpbHRlciwgY29uc3QgaW50MzJfdCB2YWwpIHsKKyAgICAvLyBEZWFsIHdpdGggZW1wdHkgYW5kIEFOWSByaWdodCBhd2F5CisgICAgaWYgKGZpbHRlci5pc0VtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoZmlsdGVyWzBdID09IG1lZGlhOjpNZXRhZGF0YTo6a0FueSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmlsdGVyLmluZGV4T2YodmFsKSA+PSAwOworfQorCisvLyBtYXJzaGFsbGluZyB0YWcgaW5kaWNhdGluZyBmbGF0dGVuZWQgdXRmMTYgdGFncworLy8ga2VlcCBpbiBzeW5jIHdpdGggZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXMuamF2YQorY29uc3QgaW50MzJfdCBrQXVkaW9BdHRyaWJ1dGVzTWFyc2hhbGxUYWdGbGF0dGVuVGFncyA9IDE7CisKKy8vIEF1ZGlvIGF0dHJpYnV0ZXMgZm9ybWF0IGluIGEgcGFyY2VsOgorLy8KKy8vICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKy8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisvLyB8ICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKy8vIHwgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisvLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworLy8gfCAgICAgICAgICAgICAgICAgICAgICAgc291cmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisvLyB8ICAgICAgICAgICAgICAgICAgICAgICBmbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKy8vIHwgICAgICAgICAgICAgICAgICAgICAgIGtBdWRpb0F0dHJpYnV0ZXNNYXJzaGFsbFRhZ0ZsYXR0ZW5UYWdzICB8IC8vIGlnbm9yZSB0YWdzIGlmIG5vdCBmb3VuZAorLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKy8vIHwgICAgICAgICAgICAgICAgICAgICAgIGZsYXR0ZW5lZCB0YWdzIGluIFVURjE2ICAgICAgICAgICAgICAgICB8CisvLyB8ICAgICAgICAgICAgICAgICAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKy8vCisvLyBAcGFyYW0gcCBQYXJjZWwgdGhhdCBjb250YWlucyBhdWRpbyBhdHRyaWJ1dGVzLgorLy8gQHBhcmFtW291dF0gYXR0cmlidXRlcyBPbiBleGl0IHBvaW50cyB0byBhbiBpbml0aWFsaXplZCBhdWRpb19hdHRyaWJ1dGVzX3Qgc3RydWN0dXJlCisvLyBAcGFyYW1bb3V0XSBzdGF0dXMgT24gZXhpdCBjb250YWlucyB0aGUgc3RhdHVzIGNvZGUgdG8gYmUgcmV0dXJuZWQuCit2b2lkIHVubWFyc2hhbGxBdWRpb0F0dHJpYnV0ZXMoY29uc3QgUGFyY2VsJiBwYXJjZWwsIGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcykgeworICAgIGF0dHJpYnV0ZXMtPnVzYWdlID0gKGF1ZGlvX3VzYWdlX3QpIHBhcmNlbC5yZWFkSW50MzIoKTsKKyAgICBhdHRyaWJ1dGVzLT5jb250ZW50X3R5cGUgPSAoYXVkaW9fY29udGVudF90eXBlX3QpIHBhcmNlbC5yZWFkSW50MzIoKTsKKyAgICBhdHRyaWJ1dGVzLT5zb3VyY2UgPSAoYXVkaW9fc291cmNlX3QpIHBhcmNlbC5yZWFkSW50MzIoKTsKKyAgICBhdHRyaWJ1dGVzLT5mbGFncyA9IChhdWRpb19mbGFnc19tYXNrX3QpIHBhcmNlbC5yZWFkSW50MzIoKTsKKyAgICBjb25zdCBib29sIGhhc0ZsYXR0ZW5lZFRhZyA9IChwYXJjZWwucmVhZEludDMyKCkgPT0ga0F1ZGlvQXR0cmlidXRlc01hcnNoYWxsVGFnRmxhdHRlblRhZ3MpOworICAgIGlmIChoYXNGbGF0dGVuZWRUYWcpIHsKKyAgICAgICAgLy8gdGhlIHRhZ3MgYXJlIFVURjE2LCBjb252ZXJ0IHRvIFVURjgKKyAgICAgICAgU3RyaW5nMTYgdGFncyA9IHBhcmNlbC5yZWFkU3RyaW5nMTYoKTsKKyAgICAgICAgc3NpemVfdCByZWFsVGFnU2l6ZSA9IHV0ZjE2X3RvX3V0ZjhfbGVuZ3RoKHRhZ3Muc3RyaW5nKCksIHRhZ3Muc2l6ZSgpKTsKKyAgICAgICAgaWYgKHJlYWxUYWdTaXplIDw9IDApIHsKKyAgICAgICAgICAgIHN0cmNweShhdHRyaWJ1dGVzLT50YWdzLCAiIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBjb3B5IHRoZSBmbGF0dGVuZWQgc3RyaW5nIGludG8gdGhlIGF0dHJpYnV0ZXMgYXMgdGhlIGRlc3RpbmF0aW9uIGZvciB0aGUgY29udmVyc2lvbjoKKyAgICAgICAgICAgIC8vIGNvcHlpbmcgYXJyYXkgc2l6ZSAtMSwgYXJyYXkgZm9yIHRhZ3Mgd2FzIGNhbGxvYydkLCBubyBuZWVkIHRvIE5VTEwtdGVybWluYXRlIGl0CisgICAgICAgICAgICBzaXplX3QgdGFnU2l6ZSA9IHJlYWxUYWdTaXplID4gQVVESU9fQVRUUklCVVRFU19UQUdTX01BWF9TSVpFIC0gMSA/CisgICAgICAgICAgICAgICAgICAgIEFVRElPX0FUVFJJQlVURVNfVEFHU19NQVhfU0laRSAtIDEgOiByZWFsVGFnU2l6ZTsKKyAgICAgICAgICAgIHV0ZjE2X3RvX3V0ZjgodGFncy5zdHJpbmcoKSwgdGFnU2l6ZSwgYXR0cmlidXRlcy0+dGFncywKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGF0dHJpYnV0ZXMtPnRhZ3MpIC8gc2l6ZW9mKGF0dHJpYnV0ZXMtPnRhZ3NbMF0pKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJ1bm1hcnNoYWxsQXVkaW9BdHRyaWJ1dGVzKCkgcmVjZWl2ZWQgdW5mbGF0dGVuZWQgdGFncywgaWdub3JpbmcgdGFnIHZhbHVlcyIpOworICAgICAgICBzdHJjcHkoYXR0cmlidXRlcy0+dGFncywgIiIpOworICAgIH0KK30KKworY2xhc3MgQXVkaW9EZXZpY2VVcGRhdGVkTm90aWZpZXI6IHB1YmxpYyBBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjayB7CitwdWJsaWM6CisgICAgQXVkaW9EZXZpY2VVcGRhdGVkTm90aWZpZXIoY29uc3Qgc3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlPiYgbGlzdGVuZXIpCisgICAgICAgIDogbUxpc3RlbmVyKGxpc3RlbmVyKSB7IH0KKworICAgIH5BdWRpb0RldmljZVVwZGF0ZWROb3RpZmllcigpIHsgfQorCisgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9EZXZpY2VVcGRhdGUoYXVkaW9faW9faGFuZGxlX3QgYXVkaW9JbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKSBvdmVycmlkZSB7CisgICAgICAgIHNwPE1lZGlhUGxheWVyMkludGVyZmFjZT4gbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOworICAgICAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgbGlzdGVuZXItPnNlbmRFdmVudCgwLCBNRURJQTJfQVVESU9fUk9VVElOR19DSEFOR0VELCBhdWRpb0lvLCBkZXZpY2VJZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygibGlzdGVuZXIgZm9yIHByb2Nlc3MgJWQgZGVhdGggaXMgZ29uZSIsIE1FRElBMl9BVURJT19ST1VUSU5HX0NIQU5HRUQpOworICAgICAgICB9CisgICAgfQorCitwcml2YXRlOgorICAgIHdwPE1lZGlhUGxheWVyMkludGVyZmFjZT4gbUxpc3RlbmVyOworfTsKKworY2xhc3MgcHJveHlMaXN0ZW5lciA6IHB1YmxpYyBNZWRpYVBsYXllcjJJbnRlcmZhY2VMaXN0ZW5lciB7CitwdWJsaWM6CisgICAgcHJveHlMaXN0ZW5lcihjb25zdCB3cDxNZWRpYVBsYXllcjI+ICZwbGF5ZXIpCisgICAgICAgIDogbVBsYXllcihwbGF5ZXIpIHsgfQorCisgICAgfnByb3h5TGlzdGVuZXIoKSB7IH07CisKKyAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5KGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICpvYmopIG92ZXJyaWRlIHsKKyAgICAgICAgc3A8TWVkaWFQbGF5ZXIyPiBwbGF5ZXIgPSBtUGxheWVyLnByb21vdGUoKTsKKyAgICAgICAgaWYgKHBsYXllciAhPSBOVUxMKSB7CisgICAgICAgICAgICBwbGF5ZXItPm5vdGlmeShzcmNJZCwgbXNnLCBleHQxLCBleHQyLCBvYmopOworICAgICAgICB9CisgICAgfQorCitwcml2YXRlOgorICAgIHdwPE1lZGlhUGxheWVyMj4gbVBsYXllcjsKK307CisKK011dGV4IHNSZWNvcmRMb2NrOworU29ydGVkVmVjdG9yPHdwPE1lZGlhUGxheWVyMj4gPiAqc1BsYXllcnM7CisKK3ZvaWQgZW5zdXJlSW5pdF9sKCkgeworICAgIGlmIChzUGxheWVycyA9PSBOVUxMKSB7CisgICAgICAgIHNQbGF5ZXJzID0gbmV3IFNvcnRlZFZlY3Rvcjx3cDxNZWRpYVBsYXllcjI+ID4oKTsKKyAgICB9Cit9CisKK3ZvaWQgYWRkUGxheWVyKGNvbnN0IHdwPE1lZGlhUGxheWVyMj4mIHBsYXllcikgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKHNSZWNvcmRMb2NrKTsKKyAgICBlbnN1cmVJbml0X2woKTsKKyAgICBzUGxheWVycy0+YWRkKHBsYXllcik7Cit9CisKK3ZvaWQgcmVtb3ZlUGxheWVyKGNvbnN0IHdwPE1lZGlhUGxheWVyMj4mIHBsYXllcikgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKHNSZWNvcmRMb2NrKTsKKyAgICBlbnN1cmVJbml0X2woKTsKKyAgICBzUGxheWVycy0+cmVtb3ZlKHBsYXllcik7Cit9CisKKy8qKgorICogVGhlIG9ubHkgYXJndW1lbnRzIHRoaXMgdW5kZXJzdGFuZHMgcmlnaHQgbm93IGFyZSAtYywgLXZvbiBhbmQgLXZvZmYsCisgKiB3aGljaCBhcmUgcGFyc2VkIGJ5IEFMb29wZXJSb3N0ZXI6OmR1bXAoKQorICovCitzdGF0dXNfdCBkdW1wUGxheWVycyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIHsKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKyAgICBTb3J0ZWRWZWN0b3I8IHNwPE1lZGlhUGxheWVyMj4gPiBwbGF5ZXJzOyAvL3RvIHNlcmlhbGlzZSB0aGUgbXV0ZXggdW5sb2NrICYgY2xpZW50IGRlc3RydWN0aW9uLgorCisgICAgaWYgKGNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oU3RyaW5nMTYoImFuZHJvaWQucGVybWlzc2lvbi5EVU1QIikpID09IGZhbHNlKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlBlcm1pc3Npb24gRGVuaWFsOiBjYW4ndCBkdW1wIE1lZGlhUGxheWVyMlxuIik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB9IGVsc2UgeworICAgICAgICB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhzUmVjb3JkTG9jayk7CisgICAgICAgICAgICBlbnN1cmVJbml0X2woKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBuID0gc1BsYXllcnMtPnNpemUoKTsgaSA8IG47ICsraSkgeworICAgICAgICAgICAgICAgIHNwPE1lZGlhUGxheWVyMj4gcCA9ICgqc1BsYXllcnMpW2ldLnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICBpZiAocCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHAtPmR1bXAoZmQsIGFyZ3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwbGF5ZXJzLmFkZChwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiBGaWxlcyBvcGVuZWQgYW5kL29yIG1hcHBlZDpcbiIpOworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIvcHJvYy8lZC9tYXBzIiwgZ2V0cGlkKCkpOworICAgICAgICBGSUxFICpmID0gZm9wZW4oYnVmZmVyLCAiciIpOworICAgICAgICBpZiAoZikgeworICAgICAgICAgICAgd2hpbGUgKCFmZW9mKGYpKSB7CisgICAgICAgICAgICAgICAgZmdldHMoYnVmZmVyLCBTSVpFLCBmKTsKKyAgICAgICAgICAgICAgICBpZiAoc3Ryc3RyKGJ1ZmZlciwgIiAvc3RvcmFnZS8iKSB8fAorICAgICAgICAgICAgICAgICAgICBzdHJzdHIoYnVmZmVyLCAiIC9zeXN0ZW0vc291bmRzLyIpIHx8CisgICAgICAgICAgICAgICAgICAgIHN0cnN0cihidWZmZXIsICIgL2RhdGEvIikgfHwKKyAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGJ1ZmZlciwgIiAvc3lzdGVtL21lZGlhLyIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgIik7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmY2xvc2UoZik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJjb3VsZG4ndCBvcGVuICIpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi9wcm9jLyVkL2ZkIiwgZ2V0cGlkKCkpOworICAgICAgICBESVIgKmQgPSBvcGVuZGlyKGJ1ZmZlcik7CisgICAgICAgIGlmIChkKSB7CisgICAgICAgICAgICBzdHJ1Y3QgZGlyZW50ICplbnQ7CisgICAgICAgICAgICB3aGlsZSgoZW50ID0gcmVhZGRpcihkKSkgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmIChzdHJjbXAoZW50LT5kX25hbWUsIi4iKSAmJiBzdHJjbXAoZW50LT5kX25hbWUsIi4uIikpIHsKKyAgICAgICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiL3Byb2MvJWQvZmQvJXMiLCBnZXRwaWQoKSwgZW50LT5kX25hbWUpOworICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3RhdCBzOworICAgICAgICAgICAgICAgICAgICBpZiAobHN0YXQoYnVmZmVyLCAmcykgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzLnN0X21vZGUgJiBTX0lGTVQpID09IFNfSUZMTkspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGxpbmt0b1syNTZdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4gPSByZWFkbGluayhidWZmZXIsIGxpbmt0bywgc2l6ZW9mKGxpbmt0bykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxlbiA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobGVuID4gMjU1KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rdG9bMjUyXSA9ICcuJzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmt0b1syNTNdID0gJy4nOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua3RvWzI1NF0gPSAnLic7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rdG9bMjU1XSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rdG9bbGVuXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cnN0cihsaW5rdG8sICIvc3RvcmFnZS8iKSA9PSBsaW5rdG8gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnN0cihsaW5rdG8sICIvc3lzdGVtL3NvdW5kcy8iKSA9PSBsaW5rdG8gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnN0cihsaW5rdG8sICIvZGF0YS8iKSA9PSBsaW5rdG8gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnN0cihsaW5rdG8sICIvc3lzdGVtL21lZGlhLyIpID09IGxpbmt0bykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAtPiAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQobGlua3RvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgdW5leHBlY3RlZCB0eXBlIGZvciAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsb3NlZGlyKGQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiY291bGRuJ3Qgb3BlbiAiKTsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CisgICAgICAgIH0KKworICAgICAgICBnTG9vcGVyUm9zdGVyLmR1bXAoZmQsIGFyZ3MpOworCisgICAgICAgIGJvb2wgZHVtcE1lbSA9IGZhbHNlOworICAgICAgICBib29sIHVucmVhY2hhYmxlTWVtb3J5ID0gZmFsc2U7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXJncy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKGFyZ3NbaV0gPT0gU3RyaW5nMTYoIi1tIikpIHsKKyAgICAgICAgICAgICAgICBkdW1wTWVtID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXSA9PSBTdHJpbmcxNigiLS11bnJlYWNoYWJsZSIpKSB7CisgICAgICAgICAgICAgICAgdW5yZWFjaGFibGVNZW1vcnkgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChkdW1wTWVtKSB7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJcbkR1bXBpbmcgbWVtb3J5OlxuIik7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBzID0gZHVtcE1lbW9yeUFkZHJlc3NlcygxMDAgLyogbGltaXQgKi8pOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChzLmNfc3RyKCksIHMuc2l6ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodW5yZWFjaGFibGVNZW1vcnkpIHsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuRHVtcGluZyB1bnJlYWNoYWJsZSBtZW1vcnk6XG4iKTsKKyAgICAgICAgICAgIC8vIFRPRE8gLSBzaG91bGQgbGltaXQgYmUgYW4gYXJndW1lbnQgcGFyYW1ldGVyPworICAgICAgICAgICAgLy8gVE9ETzogZW5hYmxlIEdldFVucmVhY2hhYmxlTWVtb3J5U3RyaW5nIGlmIGl0J3MgcGFydCBvZiBzdGFibGUgQVBJCisgICAgICAgICAgICAvL3N0ZDo6c3RyaW5nIHMgPSBHZXRVbnJlYWNoYWJsZU1lbW9yeVN0cmluZyh0cnVlIC8qIGNvbnRlbnRzICovLCAxMDAwMCAvKiBsaW1pdCAqLyk7CisgICAgICAgICAgICAvL3Jlc3VsdC5hcHBlbmQocy5jX3N0cigpLCBzLnNpemUoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKKy8vc3RhdGljCitzcDxNZWRpYVBsYXllcjI+IE1lZGlhUGxheWVyMjo6Q3JlYXRlKCkgeworICAgIHNwPE1lZGlhUGxheWVyMj4gcGxheWVyID0gbmV3IE1lZGlhUGxheWVyMigpOworCisgICAgaWYgKCFwbGF5ZXItPmluaXQoKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBBTE9HVigiQ3JlYXRlIG5ldyBwbGF5ZXIoJXApIiwgcGxheWVyLmdldCgpKTsKKworICAgIGFkZFBsYXllcihwbGF5ZXIpOworICAgIHJldHVybiBwbGF5ZXI7Cit9CisKKy8vIHN0YXRpYworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpEdW1wQWxsKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgeworICAgIHJldHVybiBkdW1wUGxheWVycyhmZCwgYXJncyk7Cit9CisKK01lZGlhUGxheWVyMjo6TWVkaWFQbGF5ZXIyKCkgeworICAgIEFMT0dWKCJjb25zdHJ1Y3RvciIpOworICAgIG1TcmNJZCA9IDA7CisgICAgbUxvY2tUaHJlYWRJZCA9IDA7CisgICAgbUxpc3RlbmVyID0gTlVMTDsKKyAgICBtU3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9NVVNJQzsKKyAgICBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsID0gTlVMTDsKKyAgICBtQ3VycmVudFBvc2l0aW9uID0gLTE7CisgICAgbUN1cnJlbnRTZWVrTW9kZSA9IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkM7CisgICAgbVNlZWtQb3NpdGlvbiA9IC0xOworICAgIG1TZWVrTW9kZSA9IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkM7CisgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUjJfSURMRTsKKyAgICBtTG9vcCA9IGZhbHNlOworICAgIG1MZWZ0Vm9sdW1lID0gbVJpZ2h0Vm9sdW1lID0gMS4wOworICAgIG1WaWRlb1dpZHRoID0gbVZpZGVvSGVpZ2h0ID0gMDsKKyAgICBtQXVkaW9TZXNzaW9uSWQgPSAoYXVkaW9fc2Vzc2lvbl90KSBBdWRpb1N5c3RlbTo6bmV3QXVkaW9VbmlxdWVJZChBVURJT19VTklRVUVfSURfVVNFX1NFU1NJT04pOworICAgIEF1ZGlvU3lzdGVtOjphY3F1aXJlQXVkaW9TZXNzaW9uSWQobUF1ZGlvU2Vzc2lvbklkLCAtMSk7CisgICAgbVNlbmRMZXZlbCA9IDA7CisKKyAgICAvLyBUT0RPOiBnZXQgcGlkIGFuZCB1aWQgZnJvbSBKQVZBCisgICAgbVBpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKKyAgICBtVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOworCisgICAgbUF1ZGlvQXR0cmlidXRlcyA9IE5VTEw7Cit9CisKK01lZGlhUGxheWVyMjo6fk1lZGlhUGxheWVyMigpIHsKKyAgICBBTE9HVigiZGVzdHJ1Y3RvciIpOworICAgIGlmIChtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsICE9IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWw7CisgICAgICAgIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgPSBOVUxMOworICAgIH0KKyAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUF1ZGlvU2Vzc2lvbklkKG1BdWRpb1Nlc3Npb25JZCwgLTEpOworICAgIGRpc2Nvbm5lY3QoKTsKKyAgICByZW1vdmVQbGF5ZXIodGhpcyk7CisgICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXMgIT0gTlVMTCkgeworICAgICAgICBmcmVlKG1BdWRpb0F0dHJpYnV0ZXMpOworICAgIH0KK30KKworYm9vbCBNZWRpYVBsYXllcjI6OmluaXQoKSB7CisgICAgLy8gVE9ETzogYWZ0ZXIgbWVyZ2Ugd2l0aCBOdVBsYXllcjJEcml2ZXIsIE1lZGlhUGxheWVyMiB3aWxsIGhhdmUgaXRzIG93bgorICAgIC8vIGxvb3BlciBmb3Igbm90aWZpY2F0aW9uLgorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIE1lZGlhUGxheWVyMjo6ZGlzY29ubmVjdCgpIHsKKyAgICBBTE9HVigiZGlzY29ubmVjdCIpOworICAgIHNwPE1lZGlhUGxheWVyMkludGVyZmFjZT4gcDsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIHAgPSBtUGxheWVyOworICAgICAgICBtUGxheWVyLmNsZWFyKCk7CisgICAgfQorCisgICAgaWYgKHAgIT0gMCkgeworICAgICAgICBwLT5zZXRMaXN0ZW5lcihOVUxMKTsKKyAgICAgICAgcC0+cmVzZXQoKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIGRpc2Nvbm5lY3ROYXRpdmVXaW5kb3dfbCgpOworICAgIH0KK30KKwordm9pZCBNZWRpYVBsYXllcjI6OmNsZWFyX2woKSB7CisgICAgbUN1cnJlbnRQb3NpdGlvbiA9IC0xOworICAgIG1DdXJyZW50U2Vla01vZGUgPSBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DOworICAgIG1TZWVrUG9zaXRpb24gPSAtMTsKKyAgICBtU2Vla01vZGUgPSBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DOworICAgIG1WaWRlb1dpZHRoID0gbVZpZGVvSGVpZ2h0ID0gMDsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRMaXN0ZW5lcihjb25zdCBzcDxNZWRpYVBsYXllcjJMaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CisgICAgQUxPR1YoInNldExpc3RlbmVyIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6Z2V0U3JjSWQoaW50NjRfdCAqc3JjSWQpIHsKKyAgICBpZiAoc3JjSWQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgKnNyY0lkID0gbVNyY0lkOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXREYXRhU291cmNlKGNvbnN0IHNwPERhdGFTb3VyY2VEZXNjPiAmZHNkKSB7CisgICAgaWYgKGRzZCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEFMT0dWKCJzZXREYXRhU291cmNlIHR5cGUoJWQpLCBzcmNJZCglbGxkKSIsIGRzZC0+bVR5cGUsIChsb25nIGxvbmcpZHNkLT5tSWQpOworCisgICAgc3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlPiBvbGRQbGF5ZXI7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHsKKyAgICAgICAgaWYgKCEoKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVIyX0lETEUpCisgICAgICAgICAgICAgIHx8IG1DdXJyZW50U3RhdGUgPT0gTUVESUFfUExBWUVSMl9TVEFURV9FUlJPUikpIHsKKyAgICAgICAgICAgIEFMT0dFKCJzZXREYXRhU291cmNlIGNhbGxlZCBpbiB3cm9uZyBzdGF0ZSAlZCIsIG1DdXJyZW50U3RhdGUpOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisKKyAgICAgICAgc3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlPiBwbGF5ZXIgPSBuZXcgTnVQbGF5ZXIyRHJpdmVyKG1QaWQsIG1VaWQpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBwbGF5ZXItPmluaXRDaGVjaygpOworICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBwbGF5ZXIgb2JqZWN0LCBpbml0Q2hlY2sgZmFpbGVkKCVkKSIsIGVycik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisKKyAgICAgICAgY2xlYXJfbCgpOworCisgICAgICAgIHBsYXllci0+c2V0TGlzdGVuZXIobmV3IHByb3h5TGlzdGVuZXIodGhpcykpOworICAgICAgICBtQXVkaW9PdXRwdXQgPSBuZXcgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQobUF1ZGlvU2Vzc2lvbklkLCBtVWlkLAorICAgICAgICAgICAgICAgIG1QaWQsIG1BdWRpb0F0dHJpYnV0ZXMsIG5ldyBBdWRpb0RldmljZVVwZGF0ZWROb3RpZmllcihwbGF5ZXIpKTsKKyAgICAgICAgcGxheWVyLT5zZXRBdWRpb1NpbmsobUF1ZGlvT3V0cHV0KTsKKworICAgICAgICBlcnIgPSBwbGF5ZXItPnNldERhdGFTb3VyY2UoZHNkKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoInNldERhdGFTb3VyY2UgZXJyb3I6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKworICAgICAgICBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2U+IG9sZFBsYXllciA9IG1QbGF5ZXI7CisgICAgICAgIG1QbGF5ZXIgPSBwbGF5ZXI7CisgICAgICAgIG1TcmNJZCA9IGRzZC0+bUlkOworICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSMl9JTklUSUFMSVpFRDsKKyAgICB9CisKKyAgICBpZiAob2xkUGxheWVyICE9IE5VTEwpIHsKKyAgICAgICAgb2xkUGxheWVyLT5zZXRMaXN0ZW5lcihOVUxMKTsKKyAgICAgICAgb2xkUGxheWVyLT5yZXNldCgpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpwcmVwYXJlTmV4dERhdGFTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZURlc2M+ICZkc2QpIHsKKyAgICBpZiAoZHNkID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgQUxPR1YoInByZXBhcmVOZXh0RGF0YVNvdXJjZSB0eXBlKCVkKSwgc3JjSWQoJWxsZCkiLCBkc2QtPm1UeXBlLCAobG9uZyBsb25nKWRzZC0+bUlkKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1QbGF5ZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgicHJlcGFyZU5leHREYXRhU291cmNlIGZhaWxlZDogc3RhdGUgJVgsIG1QbGF5ZXIoJXApIiwgbUN1cnJlbnRTdGF0ZSwgbVBsYXllci5nZXQoKSk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgcmV0dXJuIG1QbGF5ZXItPnByZXBhcmVOZXh0RGF0YVNvdXJjZShkc2QpOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnBsYXlOZXh0RGF0YVNvdXJjZShpbnQ2NF90IHNyY0lkKSB7CisgICAgQUxPR1YoInBsYXlOZXh0RGF0YVNvdXJjZSBzcmNJZCglbGxkKSIsIChsb25nIGxvbmcpc3JjSWQpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobVBsYXllciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJwbGF5TmV4dERhdGFTb3VyY2UgZmFpbGVkOiBzdGF0ZSAlWCwgbVBsYXllciglcCkiLCBtQ3VycmVudFN0YXRlLCBtUGxheWVyLmdldCgpKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBtU3JjSWQgPSBzcmNJZDsKKyAgICByZXR1cm4gbVBsYXllci0+cGxheU5leHREYXRhU291cmNlKHNyY0lkKTsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjppbnZva2UoY29uc3QgUGFyY2VsJiByZXF1ZXN0LCBQYXJjZWwgKnJlcGx5KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBjb25zdCBib29sIGhhc0JlZW5Jbml0aWFsaXplZCA9CisgICAgICAgICAgICAobUN1cnJlbnRTdGF0ZSAhPSBNRURJQV9QTEFZRVIyX1NUQVRFX0VSUk9SKSAmJgorICAgICAgICAgICAgKChtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSMl9JRExFKSAhPSBNRURJQV9QTEFZRVIyX0lETEUpOworICAgIGlmICgobVBsYXllciA9PSBOVUxMKSB8fCAhaGFzQmVlbkluaXRpYWxpemVkKSB7CisgICAgICAgIEFMT0dFKCJpbnZva2UgZmFpbGVkOiB3cm9uZyBzdGF0ZSAlWCwgbVBsYXllciglcCkiLCBtQ3VycmVudFN0YXRlLCBtUGxheWVyLmdldCgpKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBBTE9HVigiaW52b2tlICV6dSIsIHJlcXVlc3QuZGF0YVNpemUoKSk7CisgICAgcmV0dXJuIG1QbGF5ZXItPmludm9rZShyZXF1ZXN0LCByZXBseSk7Cit9CisKKy8vIFRoaXMgY2FsbCBkb2Vzbid0IG5lZWQgdG8gYWNjZXNzIHRoZSBuYXRpdmUgcGxheWVyLgorc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRNZXRhZGF0YUZpbHRlcihjb25zdCBQYXJjZWwmIGZpbHRlcikgeworICAgIEFMT0dEKCJzZXRNZXRhZGF0YUZpbHRlciIpOworCisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyIGFsbG93LCBkcm9wOworCisgICAgaWYgKHVubWFyc2hhbGxGaWx0ZXIoZmlsdGVyLCAmYWxsb3csICZzdGF0dXMpICYmCisgICAgICAgIHVubWFyc2hhbGxGaWx0ZXIoZmlsdGVyLCAmZHJvcCwgJnN0YXR1cykpIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworCisgICAgICAgIG1NZXRhZGF0YUFsbG93ID0gYWxsb3c7CisgICAgICAgIG1NZXRhZGF0YURyb3AgPSBkcm9wOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OmdldE1ldGFkYXRhKGJvb2wgdXBkYXRlX29ubHksIGJvb2wgLyogYXBwbHlfZmlsdGVyICovLCBQYXJjZWwgKnJlcGx5KSB7CisgICAgQUxPR0QoImdldE1ldGFkYXRhIik7CisgICAgc3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlPiBwbGF5ZXI7CisgICAgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXIgaWRzOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICB7CisgICAgICAgIGlmIChtUGxheWVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICB9CisKKyAgICAgICAgcGxheWVyID0gbVBsYXllcjsKKyAgICAgICAgLy8gUGxhY2Vob2xkZXIgZm9yIHRoZSByZXR1cm4gY29kZSwgdXBkYXRlZCBieSB0aGUgY2FsbGVyLgorICAgICAgICByZXBseS0+d3JpdGVJbnQzMigtMSk7CisKKyAgICAgICAgLy8gV2UgZG9uJ3QgYmxvY2sgbm90aWZpY2F0aW9ucyB3aGlsZSB3ZSBmZXRjaCB0aGUgZGF0YS4gV2UgY2xlYXIKKyAgICAgICAgLy8gbU1ldGFkYXRhVXBkYXRlZCBmaXJzdCBzbyB3ZSBkb24ndCBsb3NlIG5vdGlmaWNhdGlvbnMgaGFwcGVuaW5nCisgICAgICAgIC8vIGR1cmluZyB0aGUgcmVzdCBvZiB0aGlzIGNhbGwuCisgICAgICAgIGlmICh1cGRhdGVfb25seSkgeworICAgICAgICAgICAgaWRzID0gbU1ldGFkYXRhVXBkYXRlZDsKKyAgICAgICAgfQorICAgICAgICBtTWV0YWRhdGFVcGRhdGVkLmNsZWFyKCk7CisgICAgfQorCisgICAgbWVkaWE6Ok1ldGFkYXRhIG1ldGFkYXRhKHJlcGx5KTsKKworICAgIG1ldGFkYXRhLmFwcGVuZEhlYWRlcigpOworICAgIHN0YXR1c190IHN0YXR1cyA9IHBsYXllci0+Z2V0TWV0YWRhdGEoaWRzLCByZXBseSk7CisKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIG1ldGFkYXRhLnJlc2V0UGFyY2VsKCk7CisgICAgICAgIEFMT0dFKCJnZXRNZXRhZGF0YSBmYWlsZWQgJWQiLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIC8vIEZJWE1FOiBlbWVudCBmaWx0ZXJpbmcgb24gdGhlIHJlc3VsdC4gTm90IGNyaXRpY2FsIHNpbmNlCisgICAgLy8gZmlsdGVyaW5nIHRha2VzIHBsYWNlIG9uIHRoZSB1cGRhdGUgbm90aWZpY2F0aW9ucyBhbHJlYWR5LiBUaGlzCisgICAgLy8gd291bGQgYmUgd2hlbiBhbGwgdGhlIG1ldGFkYXRhIGFyZSBmZXRjaCBhbmQgYSBmaWx0ZXIgaXMgc2V0LgorCisgICAgLy8gRXZlcnl0aGluZyBpcyBmaW5lLCB1cGRhdGUgdGhlIG1ldGFkYXRhIGxlbmd0aC4KKyAgICBtZXRhZGF0YS51cGRhdGVMZW5ndGgoKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgTWVkaWFQbGF5ZXIyOjpkaXNjb25uZWN0TmF0aXZlV2luZG93X2woKSB7CisgICAgaWYgKG1Db25uZWN0ZWRXaW5kb3cgIT0gTlVMTCAmJiBtQ29ubmVjdGVkV2luZG93LT5nZXRBTmF0aXZlV2luZG93KCkgIT0gTlVMTCkgeworICAgICAgICBzdGF0dXNfdCBlcnIgPSBuYXRpdmVfd2luZG93X2FwaV9kaXNjb25uZWN0KAorICAgICAgICAgICAgICAgIG1Db25uZWN0ZWRXaW5kb3ctPmdldEFOYXRpdmVXaW5kb3coKSwgTkFUSVZFX1dJTkRPV19BUElfTUVESUEpOworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dXKCJuYXRpdmVXaW5kb3dEaXNjb25uZWN0IHJldHVybmVkIGFuIGVycm9yOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCBlcnIpOworICAgICAgICB9CisgICAgfQorICAgIG1Db25uZWN0ZWRXaW5kb3cuY2xlYXIoKTsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRWaWRlb1N1cmZhY2VUZXh0dXJlKGNvbnN0IHNwPEFOYXRpdmVXaW5kb3dXcmFwcGVyPiYgbnd3KSB7CisgICAgQU5hdGl2ZVdpbmRvdyAqYW53ID0gKG53dyA9PSBOVUxMID8gTlVMTCA6IG53dy0+Z2V0QU5hdGl2ZVdpbmRvdygpKTsKKyAgICBBTE9HVigic2V0VmlkZW9TdXJmYWNlVGV4dHVyZSglcCkiLCBhbncpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1QbGF5ZXIgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBpZiAoYW53ICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKG1Db25uZWN0ZWRXaW5kb3cgIT0gTlVMTAorICAgICAgICAgICAgJiYgbUNvbm5lY3RlZFdpbmRvdy0+Z2V0QU5hdGl2ZVdpbmRvdygpID09IGFudykgeworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgICAgIHN0YXR1c190IGVyciA9IG5hdGl2ZV93aW5kb3dfYXBpX2Nvbm5lY3QoYW53LCBOQVRJVkVfV0lORE9XX0FQSV9NRURJQSk7CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoInNldFZpZGVvU3VyZmFjZVRleHR1cmUgZmFpbGVkOiAlZCIsIGVycik7CisgICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2UgbXVzdCBkbyB0aGUgcmVzZXQgYmVmb3JlIGRpc2Nvbm5lY3RpbmcgZnJvbSB0aGUgQU5XLgorICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHF1ZXVlL2RlcXVldWUgY2FsbHMgY291bGQgYmUgbWFkZSBvbiB0aGUgZGlzY29ubmVjdGVkCisgICAgICAgICAgICAvLyBBTlcsIHdoaWNoIG1heSByZXN1bHQgaW4gZXJyb3JzLgorICAgICAgICAgICAgbVBsYXllci0+cmVzZXQoKTsKKyAgICAgICAgICAgIGRpc2Nvbm5lY3ROYXRpdmVXaW5kb3dfbCgpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIE5vdGUgdGhhdCB3ZSBtdXN0IHNldCB0aGUgcGxheWVyJ3MgbmV3IEdyYXBoaWNCdWZmZXJQcm9kdWNlciBiZWZvcmUKKyAgICAvLyBkaXNjb25uZWN0aW5nIHRoZSBvbGQgb25lLiAgT3RoZXJ3aXNlIHF1ZXVlL2RlcXVldWUgY2FsbHMgY291bGQgYmUgbWFkZQorICAgIC8vIG9uIHRoZSBkaXNjb25uZWN0ZWQgQU5XLCB3aGljaCBtYXkgcmVzdWx0IGluIGVycm9ycy4KKyAgICBzdGF0dXNfdCBlcnIgPSBtUGxheWVyLT5zZXRWaWRlb1N1cmZhY2VUZXh0dXJlKG53dyk7CisKKyAgICBkaXNjb25uZWN0TmF0aXZlV2luZG93X2woKTsKKworICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgbUNvbm5lY3RlZFdpbmRvdyA9IG53dzsKKyAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgfSBlbHNlIGlmIChhbncgIT0gTlVMTCkgeworICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbmF0aXZlX3dpbmRvd19hcGlfZGlzY29ubmVjdChhbncsIE5BVElWRV9XSU5ET1dfQVBJX01FRElBKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HVygibmF0aXZlV2luZG93RGlzY29ubmVjdCByZXR1cm5lZCBhbiBlcnJvcjogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgZXJyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6Z2V0QnVmZmVyaW5nU2V0dGluZ3MoQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKSB7CisgICAgQUxPR1YoImdldEJ1ZmZlcmluZ1NldHRpbmdzIik7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtUGxheWVyID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgc3RhdHVzX3QgcmV0ID0gbVBsYXllci0+Z2V0QnVmZmVyaW5nU2V0dGluZ3MoYnVmZmVyaW5nKTsKKyAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dWKCJnZXRCdWZmZXJpbmdTZXR0aW5nc3slc30iLCBidWZmZXJpbmctPnRvU3RyaW5nKCkuc3RyaW5nKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJnZXRCdWZmZXJpbmdTZXR0aW5ncyByZXR1cm5lZCAlZCIsIHJldCk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0QnVmZmVyaW5nU2V0dGluZ3MoY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MmIGJ1ZmZlcmluZykgeworICAgIEFMT0dWKCJzZXRCdWZmZXJpbmdTZXR0aW5nc3slc30iLCBidWZmZXJpbmcudG9TdHJpbmcoKS5zdHJpbmcoKSk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtUGxheWVyID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtUGxheWVyLT5zZXRCdWZmZXJpbmdTZXR0aW5ncyhidWZmZXJpbmcpOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldEF1ZGlvQXR0cmlidXRlc19sKGNvbnN0IFBhcmNlbCAmcGFyY2VsKSB7CisgICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXMgIT0gTlVMTCkgeworICAgICAgICBmcmVlKG1BdWRpb0F0dHJpYnV0ZXMpOworICAgIH0KKyAgICBtQXVkaW9BdHRyaWJ1dGVzID0gKGF1ZGlvX2F0dHJpYnV0ZXNfdCAqKSBjYWxsb2MoMSwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOworICAgIGlmIChtQXVkaW9BdHRyaWJ1dGVzID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisgICAgdW5tYXJzaGFsbEF1ZGlvQXR0cmlidXRlcyhwYXJjZWwsIG1BdWRpb0F0dHJpYnV0ZXMpOworCisgICAgQUxPR1YoInNldEF1ZGlvQXR0cmlidXRlc19sKCkgdXNhZ2U9JWQgY29udGVudD0lZCBmbGFncz0weCV4IHRhZ3M9JXMiLAorICAgICAgICAgICAgbUF1ZGlvQXR0cmlidXRlcy0+dXNhZ2UsIG1BdWRpb0F0dHJpYnV0ZXMtPmNvbnRlbnRfdHlwZSwgbUF1ZGlvQXR0cmlidXRlcy0+ZmxhZ3MsCisgICAgICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzLT50YWdzKTsKKworICAgIGlmIChtQXVkaW9PdXRwdXQgIT0gMCkgeworICAgICAgICBtQXVkaW9PdXRwdXQtPnNldEF1ZGlvQXR0cmlidXRlcyhtQXVkaW9BdHRyaWJ1dGVzKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnByZXBhcmVBc3luYygpIHsKKyAgICBBTE9HVigicHJlcGFyZUFzeW5jIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAoKG1QbGF5ZXIgIT0gMCkgJiYgKG1DdXJyZW50U3RhdGUgJiAoTUVESUFfUExBWUVSMl9JTklUSUFMSVpFRCB8IE1FRElBX1BMQVlFUjJfU1RPUFBFRCkpKSB7CisgICAgICAgIGlmIChtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHNldEF1ZGlvQXR0cmlidXRlc19sKCptQXVkaW9BdHRyaWJ1dGVzUGFyY2VsKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG1BdWRpb091dHB1dCAhPSAwKSB7CisgICAgICAgICAgICBtQXVkaW9PdXRwdXQtPnNldEF1ZGlvU3RyZWFtVHlwZShtU3RyZWFtVHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUjJfUFJFUEFSSU5HOworICAgICAgICByZXR1cm4gbVBsYXllci0+cHJlcGFyZUFzeW5jKCk7CisgICAgfQorICAgIEFMT0dFKCJwcmVwYXJlQXN5bmMgY2FsbGVkIGluIHN0YXRlICVkLCBtUGxheWVyKCVwKSIsIG1DdXJyZW50U3RhdGUsIG1QbGF5ZXIuZ2V0KCkpOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzdGFydCgpIHsKKyAgICBBTE9HVigic3RhcnQiKTsKKworICAgIHN0YXR1c190IHJldCA9IE5PX0VSUk9SOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICBtTG9ja1RocmVhZElkID0gZ2V0VGhyZWFkSWQoKTsKKworICAgIGlmIChtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSMl9TVEFSVEVEKSB7CisgICAgICAgIHJldCA9IE5PX0VSUk9SOworICAgIH0gZWxzZSBpZiAoIChtUGxheWVyICE9IDApICYmICggbUN1cnJlbnRTdGF0ZSAmICggTUVESUFfUExBWUVSMl9QUkVQQVJFRCB8CisgICAgICAgICAgICAgICAgICAgIE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEUgfCBNRURJQV9QTEFZRVIyX1BBVVNFRCApICkgKSB7CisgICAgICAgIG1QbGF5ZXItPnNldExvb3BpbmcobUxvb3ApOworCisgICAgICAgIGlmIChtQXVkaW9PdXRwdXQgIT0gMCkgeworICAgICAgICAgICAgbUF1ZGlvT3V0cHV0LT5zZXRWb2x1bWUobUxlZnRWb2x1bWUsIG1SaWdodFZvbHVtZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUF1ZGlvT3V0cHV0ICE9IDApIHsKKyAgICAgICAgICAgIG1BdWRpb091dHB1dC0+c2V0QXV4RWZmZWN0U2VuZExldmVsKG1TZW5kTGV2ZWwpOworICAgICAgICB9CisgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVIyX1NUQVJURUQ7CisgICAgICAgIHJldCA9IG1QbGF5ZXItPnN0YXJ0KCk7CisgICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVIyX1NUQVRFX0VSUk9SOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG1DdXJyZW50U3RhdGUgPT0gTUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJwbGF5YmFjayBjb21wbGV0ZWQgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHN0YXJ0KCkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJzdGFydCBjYWxsZWQgaW4gc3RhdGUgJWQsIG1QbGF5ZXIoJXApIiwgbUN1cnJlbnRTdGF0ZSwgbVBsYXllci5nZXQoKSk7CisgICAgICAgIHJldCA9IElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIG1Mb2NrVGhyZWFkSWQgPSAwOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzdG9wKCkgeworICAgIEFMT0dWKCJzdG9wIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUjJfU1RPUFBFRCkgcmV0dXJuIE5PX0VSUk9SOworICAgIGlmICggKG1QbGF5ZXIgIT0gMCkgJiYgKCBtQ3VycmVudFN0YXRlICYgKCBNRURJQV9QTEFZRVIyX1NUQVJURUQgfCBNRURJQV9QTEFZRVIyX1BSRVBBUkVEIHwKKyAgICAgICAgICAgICAgICAgICAgTUVESUFfUExBWUVSMl9QQVVTRUQgfCBNRURJQV9QTEFZRVIyX1BMQVlCQUNLX0NPTVBMRVRFICkgKSApIHsKKyAgICAgICAgc3RhdHVzX3QgcmV0ID0gbVBsYXllci0+c3RvcCgpOworICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSMl9TVEFURV9FUlJPUjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVIyX1NUT1BQRUQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgQUxPR0UoInN0b3AgY2FsbGVkIGluIHN0YXRlICVkLCBtUGxheWVyKCVwKSIsIG1DdXJyZW50U3RhdGUsIG1QbGF5ZXIuZ2V0KCkpOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpwYXVzZSgpIHsKKyAgICBBTE9HVigicGF1c2UiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtQ3VycmVudFN0YXRlICYgKE1FRElBX1BMQVlFUjJfUEFVU0VEfE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEUpKQorICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgaWYgKChtUGxheWVyICE9IDApICYmIChtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSMl9TVEFSVEVEKSkgeworICAgICAgICBzdGF0dXNfdCByZXQgPSBtUGxheWVyLT5wYXVzZSgpOworICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSMl9TVEFURV9FUlJPUjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVIyX1BBVVNFRDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBBTE9HRSgicGF1c2UgY2FsbGVkIGluIHN0YXRlICVkLCBtUGxheWVyKCVwKSIsIG1DdXJyZW50U3RhdGUsIG1QbGF5ZXIuZ2V0KCkpOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworYm9vbCBNZWRpYVBsYXllcjI6OmlzUGxheWluZygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtUGxheWVyICE9IDApIHsKKyAgICAgICAgYm9vbCB0ZW1wID0gbVBsYXllci0+aXNQbGF5aW5nKCk7CisgICAgICAgIEFMT0dWKCJpc1BsYXlpbmc6ICVkIiwgdGVtcCk7CisgICAgICAgIGlmICgobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUjJfU1RBUlRFRCkgJiYgISB0ZW1wKSB7CisgICAgICAgICAgICBBTE9HRSgiaW50ZXJuYWwvZXh0ZXJuYWwgc3RhdGUgbWlzbWF0Y2ggY29ycmVjdGVkIik7CisgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSMl9QQVVTRUQ7CisgICAgICAgIH0gZWxzZSBpZiAoKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVIyX1BBVVNFRCkgJiYgdGVtcCkgeworICAgICAgICAgICAgQUxPR0UoImludGVybmFsL2V4dGVybmFsIHN0YXRlIG1pc21hdGNoIGNvcnJlY3RlZCIpOworICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUjJfU1RBUlRFRDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGVtcDsKKyAgICB9CisgICAgQUxPR1YoImlzUGxheWluZzogbm8gYWN0aXZlIHBsYXllciIpOworICAgIHJldHVybiBmYWxzZTsKK30KKworbWVkaWFwbGF5ZXIyX3N0YXRlcyBNZWRpYVBsYXllcjI6OmdldE1lZGlhUGxheWVyMlN0YXRlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVIyX1NUQVRFX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBNRURJQVBMQVlFUjJfU1RBVEVfRVJST1I7CisgICAgfQorICAgIGlmIChtUGxheWVyID09IDAKKyAgICAgICAgfHwgKG1DdXJyZW50U3RhdGUgJgorICAgICAgICAgICAgKE1FRElBX1BMQVlFUjJfSURMRSB8IE1FRElBX1BMQVlFUjJfSU5JVElBTElaRUQgfCBNRURJQV9QTEFZRVIyX1BSRVBBUklORykpKSB7CisgICAgICAgIHJldHVybiBNRURJQVBMQVlFUjJfU1RBVEVfSURMRTsKKyAgICB9CisgICAgaWYgKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVIyX1NUQVJURUQpIHsKKyAgICAgICAgcmV0dXJuIE1FRElBUExBWUVSMl9TVEFURV9QTEFZSU5HOworICAgIH0KKyAgICBpZiAobUN1cnJlbnRTdGF0ZQorICAgICAgICAmIChNRURJQV9QTEFZRVIyX1BBVVNFRCB8IE1FRElBX1BMQVlFUjJfU1RPUFBFRCB8IE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEUpKSB7CisgICAgICAgIHJldHVybiBNRURJQVBMQVlFUjJfU1RBVEVfUEFVU0VEOworICAgIH0KKyAgICAvLyBub3cgb25seSBtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSMl9QUkVQQVJFRCBpcyB0cnVlCisgICAgcmV0dXJuIE1FRElBUExBWUVSMl9TVEFURV9QUkVQQVJFRDsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRQbGF5YmFja1NldHRpbmdzKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlJiByYXRlKSB7CisgICAgQUxPR1YoInNldFBsYXliYWNrU2V0dGluZ3M6ICVmICVmICVkICVkIiwKKyAgICAgICAgICAgIHJhdGUubVNwZWVkLCByYXRlLm1QaXRjaCwgcmF0ZS5tRmFsbGJhY2tNb2RlLCByYXRlLm1TdHJldGNoTW9kZSk7CisgICAgLy8gTmVnYXRpdmUgc3BlZWQgYW5kIHBpdGNoIGRvZXMgbm90IG1ha2Ugc2Vuc2UuIEZ1cnRoZXIgdmFsaWRhdGlvbiB3aWxsCisgICAgLy8gYmUgZG9uZSBieSB0aGUgcmVzcGVjdGl2ZSBtZWRpYXBsYXllcnMuCisgICAgaWYgKHJhdGUubVNwZWVkIDw9IDAuZiB8fCByYXRlLm1QaXRjaCA8IDAuZikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtUGxheWVyID09IDAgfHwgKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVIyX1NUT1BQRUQpKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBtUGxheWVyLT5zZXRQbGF5YmFja1NldHRpbmdzKHJhdGUpOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6Z2V0UGxheWJhY2tTZXR0aW5ncyhBdWRpb1BsYXliYWNrUmF0ZSogcmF0ZSAvKiBub25udWxsICovKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobVBsYXllciA9PSAwKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgc3RhdHVzX3QgcmV0ID0gbVBsYXllci0+Z2V0UGxheWJhY2tTZXR0aW5ncyhyYXRlKTsKKyAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dWKCJnZXRQbGF5YmFja1NldHRpbmdzKCVmLCAlZiwgJWQsICVkKSIsCisgICAgICAgICAgICAgICAgcmF0ZS0+bVNwZWVkLCByYXRlLT5tUGl0Y2gsIHJhdGUtPm1GYWxsYmFja01vZGUsIHJhdGUtPm1TdHJldGNoTW9kZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoImdldFBsYXliYWNrU2V0dGluZ3MgcmV0dXJuZWQgJWQiLCByZXQpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldFN5bmNTZXR0aW5ncyhjb25zdCBBVlN5bmNTZXR0aW5ncyYgc3luYywgZmxvYXQgdmlkZW9GcHNIaW50KSB7CisgICAgQUxPR1YoInNldFN5bmNTZXR0aW5nczogJXUgJXUgJWYgJWYiLAorICAgICAgICAgICAgc3luYy5tU291cmNlLCBzeW5jLm1BdWRpb0FkanVzdE1vZGUsIHN5bmMubVRvbGVyYW5jZSwgdmlkZW9GcHNIaW50KTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtUGxheWVyID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVBsYXllci0+c2V0U3luY1NldHRpbmdzKHN5bmMsIHZpZGVvRnBzSGludCk7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6Z2V0U3luY1NldHRpbmdzKAorICAgICAgICBBVlN5bmNTZXR0aW5ncyogc3luYyAvKiBub25udWxsICovLCBmbG9hdCogdmlkZW9GcHMgLyogbm9ubnVsbCAqLykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1QbGF5ZXIgPT0gMCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIHN0YXR1c190IHJldCA9IG1QbGF5ZXItPmdldFN5bmNTZXR0aW5ncyhzeW5jLCB2aWRlb0Zwcyk7CisgICAgaWYgKHJldCA9PSBOT19FUlJPUikgeworICAgICAgICBBTE9HVigiZ2V0U3luY1NldHRpbmdzKCV1LCAldSwgJWYsICVmKSIsCisgICAgICAgICAgICAgICAgc3luYy0+bVNvdXJjZSwgc3luYy0+bUF1ZGlvQWRqdXN0TW9kZSwgc3luYy0+bVRvbGVyYW5jZSwgKnZpZGVvRnBzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiZ2V0U3luY1NldHRpbmdzIHJldHVybmVkICVkIiwgcmV0KTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKKworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OmdldFZpZGVvV2lkdGgoaW50ICp3KSB7CisgICAgQUxPR1YoImdldFZpZGVvV2lkdGgiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtUGxheWVyID09IDApIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICAqdyA9IG1WaWRlb1dpZHRoOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpnZXRWaWRlb0hlaWdodChpbnQgKmgpIHsKKyAgICBBTE9HVigiZ2V0VmlkZW9IZWlnaHQiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtUGxheWVyID09IDApIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICAqaCA9IG1WaWRlb0hlaWdodDsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6Z2V0Q3VycmVudFBvc2l0aW9uKGludDY0X3QgKm1zZWMpIHsKKyAgICBBTE9HVigiZ2V0Q3VycmVudFBvc2l0aW9uIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobVBsYXllciA9PSAwKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgaWYgKG1DdXJyZW50UG9zaXRpb24gPj0gMCkgeworICAgICAgICBBTE9HVigiVXNpbmcgY2FjaGVkIHNlZWsgcG9zaXRpb246ICVsbGQiLCAobG9uZyBsb25nKW1DdXJyZW50UG9zaXRpb24pOworICAgICAgICAqbXNlYyA9IG1DdXJyZW50UG9zaXRpb247CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgc3RhdHVzX3QgcmV0ID0gbVBsYXllci0+Z2V0Q3VycmVudFBvc2l0aW9uKG1zZWMpOworICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR1YoImdldEN1cnJlbnRQb3NpdGlvbiA9ICVsbGQiLCAobG9uZyBsb25nKSptc2VjKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiZ2V0Q3VycmVudFBvc2l0aW9uIHJldHVybmVkICVkIiwgcmV0KTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpnZXREdXJhdGlvbihpbnQ2NF90ICptc2VjKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBTE9HVigiZ2V0RHVyYXRpb25fbCIpOworICAgIGJvb2wgaXNWYWxpZFN0YXRlID0gKG1DdXJyZW50U3RhdGUgJiAoTUVESUFfUExBWUVSMl9QUkVQQVJFRCB8IE1FRElBX1BMQVlFUjJfU1RBUlRFRCB8CisgICAgICAgICAgICBNRURJQV9QTEFZRVIyX1BBVVNFRCB8IE1FRElBX1BMQVlFUjJfU1RPUFBFRCB8IE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEUpKTsKKyAgICBpZiAobVBsYXllciA9PSAwIHx8ICFpc1ZhbGlkU3RhdGUpIHsKKyAgICAgICAgQUxPR0UoIkF0dGVtcHQgdG8gY2FsbCBnZXREdXJhdGlvbiBpbiB3cm9uZyBzdGF0ZTogbVBsYXllcj0lcCwgbUN1cnJlbnRTdGF0ZT0ldSIsCisgICAgICAgICAgICAgICAgbVBsYXllci5nZXQoKSwgbUN1cnJlbnRTdGF0ZSk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgaW50NjRfdCBkdXJhdGlvbk1zOworICAgIHN0YXR1c190IHJldCA9IG1QbGF5ZXItPmdldER1cmF0aW9uKCZkdXJhdGlvbk1zKTsKKworICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR1YoImdldER1cmF0aW9uID0gJWxsZCIsIChsb25nIGxvbmcpZHVyYXRpb25Ncyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoImdldER1cmF0aW9uIHJldHVybmVkICVkIiwgcmV0KTsKKyAgICAgICAgLy8gRG8gbm90IGVudGVyIGVycm9yIHN0YXRlIGp1c3QgYmVjYXVzZSBubyBkdXJhdGlvbiB3YXMgYXZhaWxhYmxlLgorICAgICAgICBkdXJhdGlvbk1zID0gLTE7CisgICAgfQorCisgICAgaWYgKG1zZWMpIHsKKyAgICAgICAgKm1zZWMgPSBkdXJhdGlvbk1zOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6c2Vla1RvX2woaW50NjRfdCBtc2VjLCBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlKSB7CisgICAgQUxPR1YoInNlZWtUbyAoJWxsZCwgJWQpIiwgKGxvbmcgbG9uZyltc2VjLCBtb2RlKTsKKyAgICBpZiAoKG1QbGF5ZXIgPT0gMCkgfHwgIShtQ3VycmVudFN0YXRlICYgKE1FRElBX1BMQVlFUjJfU1RBUlRFRCB8IE1FRElBX1BMQVlFUjJfUFJFUEFSRUQgfAorICAgICAgICAgICAgTUVESUFfUExBWUVSMl9QQVVTRUQgfCBNRURJQV9QTEFZRVIyX1BMQVlCQUNLX0NPTVBMRVRFKSkpIHsKKyAgICAgICAgQUxPR0UoIkF0dGVtcHQgdG8gcGVyZm9ybSBzZWVrVG8gaW4gd3Jvbmcgc3RhdGU6IG1QbGF5ZXI9JXAsIG1DdXJyZW50U3RhdGU9JXUiLAorICAgICAgICAgICAgICBtUGxheWVyLmdldCgpLCBtQ3VycmVudFN0YXRlKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBpZiAobXNlYyA8IDApIHsKKyAgICAgICAgQUxPR1coIkF0dGVtcHQgdG8gc2VlayB0byBpbnZhbGlkIHBvc2l0aW9uOiAlbGxkIiwgKGxvbmcgbG9uZyltc2VjKTsKKyAgICAgICAgbXNlYyA9IDA7CisgICAgfQorCisgICAgaW50NjRfdCBkdXJhdGlvbk1zOworICAgIHN0YXR1c190IGVyciA9IG1QbGF5ZXItPmdldER1cmF0aW9uKCZkdXJhdGlvbk1zKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR1coIlN0cmVhbSBoYXMgbm8gZHVyYXRpb24gYW5kIGlzIHRoZXJlZm9yZSBub3Qgc2Vla2FibGUuIik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKG1zZWMgPiBkdXJhdGlvbk1zKSB7CisgICAgICAgIEFMT0dXKCJBdHRlbXB0IHRvIHNlZWsgdG8gcGFzdCBlbmQgb2YgZmlsZTogcmVxdWVzdCA9ICVsbGQsIGR1cmF0aW9uTXMgPSAlbGxkIiwKKyAgICAgICAgICAgICAgKGxvbmcgbG9uZyltc2VjLCAobG9uZyBsb25nKWR1cmF0aW9uTXMpOworCisgICAgICAgIG1zZWMgPSBkdXJhdGlvbk1zOworICAgIH0KKworICAgIC8vIGNhY2hlIGR1cmF0aW9uCisgICAgbUN1cnJlbnRQb3NpdGlvbiA9IG1zZWM7CisgICAgbUN1cnJlbnRTZWVrTW9kZSA9IG1vZGU7CisgICAgaWYgKG1TZWVrUG9zaXRpb24gPCAwKSB7CisgICAgICAgIG1TZWVrUG9zaXRpb24gPSBtc2VjOworICAgICAgICBtU2Vla01vZGUgPSBtb2RlOworICAgICAgICByZXR1cm4gbVBsYXllci0+c2Vla1RvKG1zZWMsIG1vZGUpOworICAgIH0KKyAgICBBTE9HVigiU2VlayBpbiBwcm9ncmVzcyAtIHF1ZXVlIHVwIHNlZWtUb1slbGxkLCAlZF0iLCAobG9uZyBsb25nKW1zZWMsIG1vZGUpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZWVrVG8oaW50NjRfdCBtc2VjLCBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlKSB7CisgICAgbUxvY2tUaHJlYWRJZCA9IGdldFRocmVhZElkKCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBzZWVrVG9fbChtc2VjLCBtb2RlKTsKKyAgICBtTG9ja1RocmVhZElkID0gMDsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6bm90aWZ5QXQoaW50NjRfdCBtZWRpYVRpbWVVcykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1QbGF5ZXIgIT0gMCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgcmV0dXJuIG1QbGF5ZXItPm5vdGlmeUF0KG1lZGlhVGltZVVzKTsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpyZXNldF9sKCkgeworICAgIG1Mb29wID0gZmFsc2U7CisgICAgaWYgKG1DdXJyZW50U3RhdGUgPT0gTUVESUFfUExBWUVSMl9JRExFKSB7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgaWYgKG1QbGF5ZXIgIT0gMCkgeworICAgICAgICBzdGF0dXNfdCByZXQgPSBtUGxheWVyLT5yZXNldCgpOworICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgicmVzZXQoKSBmYWlsZWQgd2l0aCByZXR1cm4gY29kZSAoJWQpIiwgcmV0KTsKKyAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVIyX1NUQVRFX0VSUk9SOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVBsYXllci0+c2V0TGlzdGVuZXIoTlVMTCk7CisgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSMl9JRExFOworICAgICAgICB9CisgICAgICAgIC8vIHNldERhdGFTb3VyY2UgaGFzIHRvIGJlIGNhbGxlZCBhZ2FpbiB0byBjcmVhdGUgYQorICAgICAgICAvLyBuZXcgbWVkaWFwbGF5ZXIuCisgICAgICAgIG1QbGF5ZXIgPSAwOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBjbGVhcl9sKCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnJlc2V0KCkgeworICAgIEFMT0dWKCJyZXNldCIpOworICAgIG1Mb2NrVGhyZWFkSWQgPSBnZXRUaHJlYWRJZCgpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gcmVzZXRfbCgpOworICAgIG1Mb2NrVGhyZWFkSWQgPSAwOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRBdWRpb1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCB0eXBlKSB7CisgICAgQUxPR1YoIk1lZGlhUGxheWVyMjo6c2V0QXVkaW9TdHJlYW1UeXBlIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobVN0cmVhbVR5cGUgPT0gdHlwZSkgcmV0dXJuIE5PX0VSUk9SOworICAgIGlmIChtQ3VycmVudFN0YXRlICYgKCBNRURJQV9QTEFZRVIyX1BSRVBBUkVEIHwgTUVESUFfUExBWUVSMl9TVEFSVEVEIHwKKyAgICAgICAgICAgICAgICBNRURJQV9QTEFZRVIyX1BBVVNFRCB8IE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEUgKSApIHsKKyAgICAgICAgLy8gQ2FuJ3QgY2hhbmdlIHRoZSBzdHJlYW0gdHlwZSBhZnRlciBwcmVwYXJlCisgICAgICAgIEFMT0dFKCJzZXRBdWRpb1N0cmVhbSBjYWxsZWQgaW4gc3RhdGUgJWQiLCBtQ3VycmVudFN0YXRlKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICAvLyBjYWNoZQorICAgIG1TdHJlYW1UeXBlID0gdHlwZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6Z2V0QXVkaW9TdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3QgKnR5cGUpIHsKKyAgICBBTE9HVigiZ2V0QXVkaW9TdHJlYW1UeXBlIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAqdHlwZSA9IG1TdHJlYW1UeXBlOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRMb29waW5nKGludCBsb29wKSB7CisgICAgQUxPR1YoIk1lZGlhUGxheWVyMjo6c2V0TG9vcGluZyIpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbUxvb3AgPSAobG9vcCAhPSAwKTsKKyAgICBpZiAobVBsYXllciAhPSAwKSB7CisgICAgICAgIHJldHVybiBtUGxheWVyLT5zZXRMb29waW5nKGxvb3ApOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgTWVkaWFQbGF5ZXIyOjppc0xvb3BpbmcoKSB7CisgICAgQUxPR1YoImlzTG9vcGluZyIpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1QbGF5ZXIgIT0gMCkgeworICAgICAgICByZXR1cm4gbUxvb3A7CisgICAgfQorICAgIEFMT0dWKCJpc0xvb3Bpbmc6IG5vIGFjdGl2ZSBwbGF5ZXIiKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0Vm9sdW1lKGZsb2F0IGxlZnRWb2x1bWUsIGZsb2F0IHJpZ2h0Vm9sdW1lKSB7CisgICAgQUxPR1YoIk1lZGlhUGxheWVyMjo6c2V0Vm9sdW1lKCVmLCAlZikiLCBsZWZ0Vm9sdW1lLCByaWdodFZvbHVtZSk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtTGVmdFZvbHVtZSA9IGxlZnRWb2x1bWU7CisgICAgbVJpZ2h0Vm9sdW1lID0gcmlnaHRWb2x1bWU7CisgICAgaWYgKG1BdWRpb091dHB1dCAhPSAwKSB7CisgICAgICAgIG1BdWRpb091dHB1dC0+c2V0Vm9sdW1lKGxlZnRWb2x1bWUsIHJpZ2h0Vm9sdW1lKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldEF1ZGlvU2Vzc2lvbklkKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpIHsKKyAgICBBTE9HVigiTWVkaWFQbGF5ZXIyOjpzZXRBdWRpb1Nlc3Npb25JZCglZCkiLCBzZXNzaW9uSWQpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKCEobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUjJfSURMRSkpIHsKKyAgICAgICAgQUxPR0UoInNldEF1ZGlvU2Vzc2lvbklkIGNhbGxlZCBpbiBzdGF0ZSAlZCIsIG1DdXJyZW50U3RhdGUpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIGlmIChzZXNzaW9uSWQgPCAwKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmIChzZXNzaW9uSWQgIT0gbUF1ZGlvU2Vzc2lvbklkKSB7CisgICAgICAgIEF1ZGlvU3lzdGVtOjphY3F1aXJlQXVkaW9TZXNzaW9uSWQoc2Vzc2lvbklkLCAtMSk7CisgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQobUF1ZGlvU2Vzc2lvbklkLCAtMSk7CisgICAgICAgIG1BdWRpb1Nlc3Npb25JZCA9IHNlc3Npb25JZDsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCithdWRpb19zZXNzaW9uX3QgTWVkaWFQbGF5ZXIyOjpnZXRBdWRpb1Nlc3Npb25JZCgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtQXVkaW9TZXNzaW9uSWQ7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0QXV4RWZmZWN0U2VuZExldmVsKGZsb2F0IGxldmVsKSB7CisgICAgQUxPR1YoIk1lZGlhUGxheWVyMjo6c2V0QXV4RWZmZWN0U2VuZExldmVsKCVmKSIsIGxldmVsKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1TZW5kTGV2ZWwgPSBsZXZlbDsKKyAgICBpZiAobUF1ZGlvT3V0cHV0ICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG1BdWRpb091dHB1dC0+c2V0QXV4RWZmZWN0U2VuZExldmVsKGxldmVsKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OmF0dGFjaEF1eEVmZmVjdChpbnQgZWZmZWN0SWQpIHsKKyAgICBBTE9HVigiTWVkaWFQbGF5ZXIyOjphdHRhY2hBdXhFZmZlY3QoJWQpIiwgZWZmZWN0SWQpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1BdWRpb091dHB1dCA9PSAwIHx8CisgICAgICAgIChtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSMl9JRExFKSB8fAorICAgICAgICAobUN1cnJlbnRTdGF0ZSA9PSBNRURJQV9QTEFZRVIyX1NUQVRFX0VSUk9SICkpIHsKKyAgICAgICAgQUxPR0UoImF0dGFjaEF1eEVmZmVjdCBjYWxsZWQgaW4gc3RhdGUgJWQsIG1QbGF5ZXIoJXApIiwgbUN1cnJlbnRTdGF0ZSwgbVBsYXllci5nZXQoKSk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICByZXR1cm4gbUF1ZGlvT3V0cHV0LT5hdHRhY2hBdXhFZmZlY3QoZWZmZWN0SWQpOworfQorCisvLyBhbHdheXMgY2FsbCB3aXRoIGxvY2sgaGVsZAorc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpjaGVja1N0YXRlRm9yS2V5U2V0X2woaW50IGtleSkgeworICAgIHN3aXRjaChrZXkpIHsKKyAgICBjYXNlIE1FRElBMl9LRVlfUEFSQU1FVEVSX0FVRElPX0FUVFJJQlVURVM6CisgICAgICAgIGlmIChtQ3VycmVudFN0YXRlICYgKCBNRURJQV9QTEFZRVIyX1BSRVBBUkVEIHwgTUVESUFfUExBWUVSMl9TVEFSVEVEIHwKKyAgICAgICAgICAgICAgICBNRURJQV9QTEFZRVIyX1BBVVNFRCB8IE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEUpICkgeworICAgICAgICAgICAgLy8gQ2FuJ3QgY2hhbmdlIHRoZSBhdWRpbyBhdHRyaWJ1dGVzIGFmdGVyIHByZXBhcmUKKyAgICAgICAgICAgIEFMT0dFKCJ0cnlpbmcgdG8gc2V0IGF1ZGlvIGF0dHJpYnV0ZXMgY2FsbGVkIGluIHN0YXRlICVkIiwgbUN1cnJlbnRTdGF0ZSk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgLy8gcGFyYW1ldGVyIGRvZXNuJ3QgcmVxdWlyZSBwbGF5ZXIgc3RhdGUgY2hlY2sKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsJiByZXF1ZXN0KSB7CisgICAgQUxPR1YoIk1lZGlhUGxheWVyMjo6c2V0UGFyYW1ldGVyKCVkKSIsIGtleSk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAoY2hlY2tTdGF0ZUZvcktleVNldF9sKGtleSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgc3dpdGNoIChrZXkpIHsKKyAgICBjYXNlIE1FRElBMl9LRVlfUEFSQU1FVEVSX0FVRElPX0FUVFJJQlVURVM6CisgICAgICAgIC8vIHNhdmUgdGhlIG1hcnNoYWxsZWQgYXVkaW8gYXR0cmlidXRlcworICAgICAgICBpZiAobUF1ZGlvQXR0cmlidXRlc1BhcmNlbCAhPSBOVUxMKSB7CisgICAgICAgICAgICBkZWxldGUgbUF1ZGlvQXR0cmlidXRlc1BhcmNlbDsKKyAgICAgICAgfQorICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsID0gbmV3IFBhcmNlbCgpOworICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsLT5hcHBlbmRGcm9tKCZyZXF1ZXN0LCAwLCByZXF1ZXN0LmRhdGFTaXplKCkpOworICAgICAgICBzdGF0dXMgPSBzZXRBdWRpb0F0dHJpYnV0ZXNfbChyZXF1ZXN0KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HVl9JRihtUGxheWVyID09IE5VTEwsICJzZXRQYXJhbWV0ZXI6IG5vIGFjdGl2ZSBwbGF5ZXIiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKG1QbGF5ZXIgIT0gTlVMTCkgeworICAgICAgICBzdGF0dXMgPSBtUGxheWVyLT5zZXRQYXJhbWV0ZXIoa2V5LCByZXF1ZXN0KTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSkgeworICAgIEFMT0dWKCJNZWRpYVBsYXllcjI6OmdldFBhcmFtZXRlciglZCkiLCBrZXkpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKGtleSA9PSBNRURJQTJfS0VZX1BBUkFNRVRFUl9BVURJT19BVFRSSUJVVEVTKSB7CisgICAgICAgIGlmIChyZXBseSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGlmIChtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHJlcGx5LT5hcHBlbmRGcm9tKG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwsIDAsIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwtPmRhdGFTaXplKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBpZiAobVBsYXllciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dWKCJnZXRQYXJhbWV0ZXI6IG5vIGFjdGl2ZSBwbGF5ZXIiKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHN0YXR1c190IHN0YXR1cyA9ICBtUGxheWVyLT5nZXRQYXJhbWV0ZXIoa2V5LCByZXBseSk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICBBTE9HRCgiZ2V0UGFyYW1ldGVyIHJldHVybnMgJWQiLCBzdGF0dXMpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitib29sIE1lZGlhUGxheWVyMjo6c2hvdWxkRHJvcE1ldGFkYXRhKG1lZGlhOjpNZXRhZGF0YTo6VHlwZSBjb2RlKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworCisgICAgaWYgKGZpbmRNZXRhZGF0YShtTWV0YWRhdGFEcm9wLCBjb2RlKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAobU1ldGFkYXRhQWxsb3cuaXNFbXB0eSgpIHx8IGZpbmRNZXRhZGF0YShtTWV0YWRhdGFBbGxvdywgY29kZSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KKworCit2b2lkIE1lZGlhUGxheWVyMjo6YWRkTmV3TWV0YWRhdGFVcGRhdGUobWVkaWE6Ok1ldGFkYXRhOjpUeXBlIG1ldGFkYXRhX3R5cGUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKG1NZXRhZGF0YVVwZGF0ZWQuaW5kZXhPZihtZXRhZGF0YV90eXBlKSA8IDApIHsKKyAgICAgICAgbU1ldGFkYXRhVXBkYXRlZC5hZGQobWV0YWRhdGFfdHlwZSk7CisgICAgfQorfQorCit2b2lkIE1lZGlhUGxheWVyMjo6bm90aWZ5KGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICpvYmopIHsKKyAgICBBTE9HVigibWVzc2FnZSByZWNlaXZlZCBzcmNJZD0lbGxkLCBtc2c9JWQsIGV4dDE9JWQsIGV4dDI9JWQiLAorICAgICAgICAgIChsb25nIGxvbmcpc3JjSWQsIG1zZywgZXh0MSwgZXh0Mik7CisKKyAgICBpZiAoTUVESUEyX0lORk8gPT0gbXNnICYmIE1FRElBMl9JTkZPX01FVEFEQVRBX1VQREFURSA9PSBleHQxKSB7CisgICAgICAgIGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6VHlwZSBtZXRhZGF0YV90eXBlID0gZXh0MjsKKworICAgICAgICBpZihzaG91bGREcm9wTWV0YWRhdGEobWV0YWRhdGFfdHlwZSkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFVwZGF0ZSB0aGUgbGlzdCBvZiBtZXRhZGF0YSB0aGF0IGhhdmUgY2hhbmdlZC4gZ2V0TWV0YWRhdGEKKyAgICAgICAgLy8gYWxzbyBhY2Nlc3MgbU1ldGFkYXRhVXBkYXRlZCBhbmQgY2xlYXJzIGl0LgorICAgICAgICBhZGROZXdNZXRhZGF0YVVwZGF0ZShtZXRhZGF0YV90eXBlKTsKKyAgICB9CisKKyAgICBib29sIHNlbmQgPSB0cnVlOworICAgIGJvb2wgbG9ja2VkID0gZmFsc2U7CisKKyAgICAvLyBUT0RPOiBJbiB0aGUgZnV0dXJlLCB3ZSBtaWdodCBiZSBvbiB0aGUgc2FtZSB0aHJlYWQgaWYgdGhlIGFwcCBpcworICAgIC8vIHJ1bm5pbmcgaW4gdGhlIHNhbWUgcHJvY2VzcyBhcyB0aGUgbWVkaWEgc2VydmVyLiBJbiB0aGF0IGNhc2UsCisgICAgLy8gdGhpcyB3aWxsIGRlYWRsb2NrLgorICAgIC8vCisgICAgLy8gVGhlIHRocmVhZElkIGhhY2sgYmVsb3cgd29ya3MgYXJvdW5kIHRoaXMgZm9yIHRoZSBjYXJlIG9mIHByZXBhcmUsCisgICAgLy8gc2Vla1RvLCBzdGFydCwgYW5kIHJlc2V0IHdpdGhpbiB0aGUgc2FtZSBwcm9jZXNzLgorICAgIC8vIEZJWE1FOiBSZW1lbWJlciwgdGhpcyBpcyBhIGhhY2ssIGl0J3Mgbm90IGV2ZW4gYSBoYWNrIHRoYXQgaXMgYXBwbGllZAorICAgIC8vIGNvbnNpc3RlbnRseSBmb3IgYWxsIHVzZS1jYXNlcywgdGhpcyBuZWVkcyB0byBiZSByZXZpc2l0ZWQuCisgICAgaWYgKG1Mb2NrVGhyZWFkSWQgIT0gZ2V0VGhyZWFkSWQoKSkgeworICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgIGxvY2tlZCA9IHRydWU7CisgICAgfQorCisgICAgLy8gQWxsb3dzIGNhbGxzIGZyb20gSk5JIGluIGlkbGUgc3RhdGUgdG8gbm90aWZ5IGVycm9ycworICAgIGlmICghKG1zZyA9PSBNRURJQTJfRVJST1IgJiYgbUN1cnJlbnRTdGF0ZSA9PSBNRURJQV9QTEFZRVIyX0lETEUpICYmIG1QbGF5ZXIgPT0gMCkgeworICAgICAgICBBTE9HVigibm90aWZ5KCVsbGQsICVkLCAlZCwgJWQpIGNhbGxiYWNrIG9uIGRpc2Nvbm5lY3RlZCBtZWRpYXBsYXllciIsCisgICAgICAgICAgICAgIChsb25nIGxvbmcpc3JjSWQsIG1zZywgZXh0MSwgZXh0Mik7CisgICAgICAgIGlmIChsb2NrZWQpIG1Mb2NrLnVubG9jaygpOyAgIC8vIHJlbGVhc2UgdGhlIGxvY2sgd2hlbiBkb25lLgorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3dpdGNoIChtc2cpIHsKKyAgICBjYXNlIE1FRElBMl9OT1A6IC8vIGludGVyZmFjZSB0ZXN0IG1lc3NhZ2UKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNRURJQTJfUFJFUEFSRUQ6CisgICAgICAgIEFMT0dWKCJNZWRpYVBsYXllcjI6Om5vdGlmeSgpIHByZXBhcmVkIik7CisgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVIyX1BSRVBBUkVEOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1FRElBMl9EUk1fSU5GTzoKKyAgICAgICAgQUxPR1YoIk1lZGlhUGxheWVyMjo6bm90aWZ5KCkgTUVESUEyX0RSTV9JTkZPKCVsbGQsICVkLCAlZCwgJWQsICVwKSIsCisgICAgICAgICAgICAgIChsb25nIGxvbmcpc3JjSWQsIG1zZywgZXh0MSwgZXh0Miwgb2JqKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNRURJQTJfUExBWUJBQ0tfQ09NUExFVEU6CisgICAgICAgIEFMT0dWKCJwbGF5YmFjayBjb21wbGV0ZSIpOworICAgICAgICBpZiAobUN1cnJlbnRTdGF0ZSA9PSBNRURJQV9QTEFZRVIyX0lETEUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJwbGF5YmFjayBjb21wbGV0ZSBpbiBpZGxlIHN0YXRlIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtTG9vcCkgeworICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNRURJQTJfRVJST1I6CisgICAgICAgIC8vIEFsd2F5cyBsb2cgZXJyb3JzLgorICAgICAgICAvLyBleHQxOiBNZWRpYSBmcmFtZXdvcmsgZXJyb3IgY29kZS4KKyAgICAgICAgLy8gZXh0MjogSW1wbGVtZW50YXRpb24gZGVwZW5kYW50IGVycm9yIGNvZGUuCisgICAgICAgIEFMT0dFKCJlcnJvciAoJWQsICVkKSIsIGV4dDEsIGV4dDIpOworICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSMl9TVEFURV9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNRURJQTJfSU5GTzoKKyAgICAgICAgLy8gZXh0MTogTWVkaWEgZnJhbWV3b3JrIGVycm9yIGNvZGUuCisgICAgICAgIC8vIGV4dDI6IEltcGxlbWVudGF0aW9uIGRlcGVuZGFudCBlcnJvciBjb2RlLgorICAgICAgICBpZiAoZXh0MSAhPSBNRURJQTJfSU5GT19WSURFT19UUkFDS19MQUdHSU5HKSB7CisgICAgICAgICAgICBBTE9HVygiaW5mby93YXJuaW5nICglZCwgJWQpIiwgZXh0MSwgZXh0Mik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNRURJQTJfU0VFS19DT01QTEVURToKKyAgICAgICAgQUxPR1YoIlJlY2VpdmVkIHNlZWsgY29tcGxldGUiKTsKKyAgICAgICAgaWYgKG1TZWVrUG9zaXRpb24gIT0gbUN1cnJlbnRQb3NpdGlvbiB8fCAobVNlZWtNb2RlICE9IG1DdXJyZW50U2Vla01vZGUpKSB7CisgICAgICAgICAgICBBTE9HVigiRXhlY3V0aW5nIHF1ZXVlZCBzZWVrVG8oJWxsZCwgJWQpIiwKKyAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbUN1cnJlbnRQb3NpdGlvbiwgbUN1cnJlbnRTZWVrTW9kZSk7CisgICAgICAgICAgICBtU2Vla1Bvc2l0aW9uID0gLTE7CisgICAgICAgICAgICBtU2Vla01vZGUgPSBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DOworICAgICAgICAgICAgc2Vla1RvX2wobUN1cnJlbnRQb3NpdGlvbiwgbUN1cnJlbnRTZWVrTW9kZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBBTE9HVigiQWxsIHNlZWtzIGNvbXBsZXRlIC0gcmV0dXJuIHRvIHJlZ3VsYXJseSBzY2hlZHVsZWQgcHJvZ3JhbSIpOworICAgICAgICAgICAgbUN1cnJlbnRQb3NpdGlvbiA9IG1TZWVrUG9zaXRpb24gPSAtMTsKKyAgICAgICAgICAgIG1DdXJyZW50U2Vla01vZGUgPSBtU2Vla01vZGUgPSBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUVESUEyX0JVRkZFUklOR19VUERBVEU6CisgICAgICAgIEFMT0dWKCJidWZmZXJpbmcgJWQiLCBleHQxKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNRURJQTJfU0VUX1ZJREVPX1NJWkU6CisgICAgICAgIEFMT0dWKCJOZXcgdmlkZW8gc2l6ZSAlZCB4ICVkIiwgZXh0MSwgZXh0Mik7CisgICAgICAgIG1WaWRlb1dpZHRoID0gZXh0MTsKKyAgICAgICAgbVZpZGVvSGVpZ2h0ID0gZXh0MjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNRURJQTJfTk9USUZZX1RJTUU6CisgICAgICAgIEFMT0dWKCJSZWNlaXZlZCBub3RpZnkgdGltZSBtZXNzYWdlIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUVESUEyX1RJTUVEX1RFWFQ6CisgICAgICAgIEFMT0dWKCJSZWNlaXZlZCB0aW1lZCB0ZXh0IG1lc3NhZ2UiKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNRURJQTJfU1VCVElUTEVfREFUQToKKyAgICAgICAgQUxPR1YoIlJlY2VpdmVkIHN1YnRpdGxlIGRhdGEgbWVzc2FnZSIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1FRElBMl9NRVRBX0RBVEE6CisgICAgICAgIEFMT0dWKCJSZWNlaXZlZCB0aW1lZCBtZXRhZGF0YSBtZXNzYWdlIik7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dWKCJ1bnJlY29nbml6ZWQgbWVzc2FnZTogKCVkLCAlZCwgJWQpIiwgbXNnLCBleHQxLCBleHQyKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgc3A8TWVkaWFQbGF5ZXIyTGlzdGVuZXI+IGxpc3RlbmVyID0gbUxpc3RlbmVyOworICAgIGlmIChsb2NrZWQpIG1Mb2NrLnVubG9jaygpOworCisgICAgLy8gdGhpcyBwcmV2ZW50cyByZS1lbnRyYW50IGNhbGxzIGludG8gY2xpZW50IGNvZGUKKyAgICBpZiAoKGxpc3RlbmVyICE9IDApICYmIHNlbmQpIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Ob3RpZnlMb2NrKTsKKyAgICAgICAgQUxPR1YoImNhbGxiYWNrIGFwcGxpY2F0aW9uIik7CisgICAgICAgIGxpc3RlbmVyLT5ub3RpZnkoc3JjSWQsIG1zZywgZXh0MSwgZXh0Miwgb2JqKTsKKyAgICAgICAgQUxPR1YoImJhY2sgZnJvbSBjYWxsYmFjayIpOworICAgIH0KK30KKworLy8gTW9kdWxhciBEUk0KK3N0YXR1c190IE1lZGlhUGxheWVyMjo6cHJlcGFyZURybShjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBWZWN0b3I8dWludDhfdD4mIGRybVNlc3Npb25JZCkgeworICAgIC8vIFRPRE8gY2hhbmdlIHRvIEFMT0dWCisgICAgQUxPR0QoInByZXBhcmVEcm06IHV1aWQ6ICVwICBkcm1TZXNzaW9uSWQ6ICVwKCV6dSkiLCB1dWlkLAorICAgICAgICAgICAgZHJtU2Vzc2lvbklkLmFycmF5KCksIGRybVNlc3Npb25JZC5zaXplKCkpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1QbGF5ZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICAvLyBPbmx5IGFsbG93ZWQgaXQgaW4gcGxheWVyJ3MgcHJlcGFyaW5nL3ByZXBhcmVkIHN0YXRlLgorICAgIC8vIFdlIGdldCBoZXJlIG9ubHkgaWYgTUVESUFfRFJNX0lORk8gaGFzIGFscmVhZHkgYXJyaXZlZCAoZS5nLiwgcHJlcGFyZSBpcyBoYWxmLXdheSB0aHJvdWdoIG9yCisgICAgLy8gY29tcGxldGVkKSBzbyB0aGUgc3RhdGUgY2hhbmdlIHRvICJwcmVwYXJlZCIgbWlnaHQgbm90IGhhdmUgaGFwcGVuZWQgeWV0IChlLmcuLCBidWZmZXJpbmcpLgorICAgIC8vIFN0aWxsLCB3ZSBjYW4gYWxsb3cgcHJlcGFyZURybSBmb3IgdGhlIHVzZSBjYXNlIG9mIGJlaW5nIGNhbGxlZCBpbiBPbkRybUluZm9MaXN0ZW5lci4KKyAgICBpZiAoIShtQ3VycmVudFN0YXRlICYgKE1FRElBX1BMQVlFUjJfUFJFUEFSSU5HIHwgTUVESUFfUExBWUVSMl9QUkVQQVJFRCkpKSB7CisgICAgICAgIEFMT0dFKCJwcmVwYXJlRHJtIGlzIGNhbGxlZCBpbiB0aGUgd3Jvbmcgc3RhdGUgKCVkKS4iLCBtQ3VycmVudFN0YXRlKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGlmIChkcm1TZXNzaW9uSWQuaXNFbXB0eSgpKSB7CisgICAgICAgIEFMT0dFKCJwcmVwYXJlRHJtOiBVbmV4cGVjdGVkLiBDYW4ndCBwcm9jZWVkIHdpdGggY3J5cHRvLiBFbXB0eSBkcm1TZXNzaW9uSWQuIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICAvLyBQYXNzaW5nIGRvd24gdG8gbWVkaWFzZXJ2ZXIgbWFpbmx5IGZvciBjcmVhdGluZyB0aGUgY3J5cHRvCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVBsYXllci0+cHJlcGFyZURybSh1dWlkLCBkcm1TZXNzaW9uSWQpOworICAgIEFMT0dFX0lGKHN0YXR1cyAhPSBPSywgInByZXBhcmVEcm06IEZhaWxlZCBhdCBtZWRpYXNlcnZlciB3aXRoIHJldDogJWQiLCBzdGF0dXMpOworCisgICAgLy8gVE9ETyBjaGFuZ2UgdG8gQUxPR1YKKyAgICBBTE9HRCgicHJlcGFyZURybTogbWVkaWFzZXJ2ZXI6OnByZXBhcmVEcm0gcmV0PSVkIiwgc3RhdHVzKTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6cmVsZWFzZURybSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtUGxheWVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgLy8gTm90IGFsbG93aW5nIHJlbGVhc2VEcm0gaW4gYW4gYWN0aXZlL3Jlc3VtYWJsZSBzdGF0ZQorICAgIGlmIChtQ3VycmVudFN0YXRlICYgKE1FRElBX1BMQVlFUjJfU1RBUlRFRCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfUExBWUVSMl9QQVVTRUQgfAorICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEUgfAorICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX1BMQVlFUjJfU1RBVEVfRVJST1IpKSB7CisgICAgICAgIEFMT0dFKCJyZWxlYXNlRHJtIFVuZXhwZWN0ZWQgc3RhdGUgJWQuIENhbiBvbmx5IGJlIGNhbGxlZCBpbiBzdG9wcGVkL2lkbGUuIiwgbUN1cnJlbnRTdGF0ZSk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtUGxheWVyLT5yZWxlYXNlRHJtKCk7CisgICAgLy8gVE9ETyBjaGFuZ2UgdG8gQUxPR1YKKyAgICBBTE9HRCgicmVsZWFzZURybTogbWVkaWFzZXJ2ZXI6OnJlbGVhc2VEcm0gcmV0OiAlZCIsIHN0YXR1cyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICBBTE9HRSgicmVsZWFzZURybTogRmFpbGVkIGF0IG1lZGlhc2VydmVyIHdpdGggcmV0OiAlZCIsIHN0YXR1cyk7CisgICAgICAgIC8vIE92ZXJyaWRpbmcgdG8gT0sgc28gdGhlIGNsaWVudCBwcm9jZWVkIHdpdGggaXRzIG93biBjbGVhbnVwCisgICAgICAgIC8vIENsaWVudCBjYW4ndCBkbyBtb3JlIGNsZWFudXAuIG1lZGlhc2VydmVyIHJlbGVhc2UgaXRzIGNyeXB0byBhdCBlbmQgb2Ygc2Vzc2lvbiBhbnl3YXkuCisgICAgICAgIHN0YXR1cyA9IE9LOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtQXVkaW9PdXRwdXQgPT0gTlVMTCkgeworICAgICAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlOiBhdWRpbyBzaW5rIG5vdCBpbml0Iik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbUF1ZGlvT3V0cHV0LT5zZXRPdXRwdXREZXZpY2UoZGV2aWNlSWQpOworfQorCithdWRpb19wb3J0X2hhbmRsZV90IE1lZGlhUGxheWVyMjo6Z2V0Um91dGVkRGV2aWNlSWQoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUF1ZGlvT3V0cHV0ID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1YoImdldFJvdXRlZERldmljZUlkOiBhdWRpbyBzaW5rIG5vdCBpbml0Iik7CisgICAgICAgIHJldHVybiBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgIH0KKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1BdWRpb091dHB1dC0+Z2V0Um91dGVkRGV2aWNlSWQoJmRldmljZUlkKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgIH0KKyAgICByZXR1cm4gZGV2aWNlSWQ7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6ZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtQXVkaW9PdXRwdXQgPT0gTlVMTCkgeworICAgICAgICBBTE9HVigiYWRkQXVkaW9EZXZpY2VDYWxsYmFjazogcGxheWVyIG5vdCBpbml0Iik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbUF1ZGlvT3V0cHV0LT5lbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGVuYWJsZWQpOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSB7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisgICAgcmVzdWx0LmFwcGVuZCgiIE1lZGlhUGxheWVyMlxuIik7CisgICAgc25wcmludGYoYnVmZmVyLCAyNTUsICIgIHBpZCglZCksIGxvb3BpbmcoJXMpXG4iLCBtUGlkLCBtTG9vcD8idHJ1ZSI6ICJmYWxzZSIpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKworICAgIHNwPE1lZGlhUGxheWVyMkludGVyZmFjZT4gcGxheWVyOworICAgIHNwPE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0PiBhdWRpb091dHB1dDsKKyAgICBib29sIGxvY2tlZCA9IGZhbHNlOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwga0R1bXBMb2NrUmV0cmllczsgKytpKSB7CisgICAgICAgIGlmIChtTG9jay50cnlMb2NrKCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGxvY2tlZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB1c2xlZXAoa0R1bXBMb2NrU2xlZXBVcyk7CisgICAgfQorCisgICAgaWYgKGxvY2tlZCkgeworICAgICAgICBwbGF5ZXIgPSBtUGxheWVyOworICAgICAgICBhdWRpb091dHB1dCA9IG1BdWRpb091dHB1dDsKKyAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiICBsb2NrIGlzIHRha2VuLCBubyBkdW1wIGZyb20gcGxheWVyIGFuZCBhdWRpbyBvdXRwdXRcbiIpOworICAgIH0KKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKworICAgIGlmIChwbGF5ZXIgIT0gTlVMTCkgeworICAgICAgICBwbGF5ZXItPmR1bXAoZmQsIGFyZ3MpOworICAgIH0KKyAgICBpZiAoYXVkaW9PdXRwdXQgIT0gMCkgeworICAgICAgICBhdWRpb091dHB1dC0+ZHVtcChmZCwgYXJncyk7CisgICAgfQorICAgIHdyaXRlKGZkLCAiXG4iLCAxKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDBiMzYxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNzAgQEAKK2NjX2xpYnJhcnlfc3RhdGljIHsKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkpXYWtlTG9jay5jcHAiLAorICAgICAgICAiR2VuZXJpY1NvdXJjZTIuY3BwIiwKKyAgICAgICAgIkhUVFBMaXZlU291cmNlMi5jcHAiLAorICAgICAgICAiTnVQbGF5ZXIyLmNwcCIsCisgICAgICAgICJOdVBsYXllcjJDQ0RlY29kZXIuY3BwIiwKKyAgICAgICAgIk51UGxheWVyMkRlY29kZXIuY3BwIiwKKyAgICAgICAgIk51UGxheWVyMkRlY29kZXJCYXNlLmNwcCIsCisgICAgICAgICJOdVBsYXllcjJEZWNvZGVyUGFzc1Rocm91Z2guY3BwIiwKKyAgICAgICAgIk51UGxheWVyMkRyaXZlci5jcHAiLAorICAgICAgICAiTnVQbGF5ZXIyRHJtLmNwcCIsCisgICAgICAgICJOdVBsYXllcjJSZW5kZXJlci5jcHAiLAorICAgICAgICAiUlRTUFNvdXJjZTIuY3BwIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhcGxheWVyMl9oZWFkZXJzIiwKKyAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cyIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBwcm9kdWN0X3ZhcmlhYmxlczogeworICAgICAgICBkZWJ1Z2dhYmxlOiB7CisgICAgICAgICAgICBjZmxhZ3M6IFsKKyAgICAgICAgICAgICAgICAiLURFTkFCTEVfU1RBR0VGUklHSFRfRVhQRVJJTUVOVFMiLAorICAgICAgICAgICAgXSwKKyAgICAgICAgfQorICAgIH0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJtZWRpYWRybSIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCisgICAgICAgICJsaWJwb3dlcm1hbmFnZXIiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKKyAgICBdLAorCisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X251cGxheWVyMiIsCisKKyAgICB0YWdzOiBbImVuZyJdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBkaWFnOiB7CisgICAgICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIH0sCisgICAgfSwKKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9HZW5lcmljU291cmNlMi5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0dlbmVyaWNTb3VyY2UyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTZiMTAzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9HZW5lcmljU291cmNlMi5jcHAKQEAgLTAsMCArMSwxNjE1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkdlbmVyaWNTb3VyY2UyIgorCisjaW5jbHVkZSAiR2VuZXJpY1NvdXJjZTIuaCIKKyNpbmNsdWRlICJOdVBsYXllcjJEcm0uaCIKKworI2luY2x1ZGUgIkFub3RoZXJQYWNrZXRTb3VyY2UuaCIKKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFCdWZmZXJIb2xkZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtXcmFwcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZUZhY3RvcnkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDbG9jay5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTmRrVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgIi4uLy4uL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgiCisjaW5jbHVkZSAiLi4vLi4vbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9IVFRQQmFzZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBjb25zdCBpbnQga0luaXRpYWxNYXJrTXMgICAgICAgID0gNTAwMDsgIC8vIDVzZWNzCisKKy8vc3RhdGljIGNvbnN0IGludCBrUGF1c2VQbGF5YmFja01hcmtNcyAgPSAyMDAwOyAgLy8gMnNlY3MKK3N0YXRpYyBjb25zdCBpbnQga1Jlc3VtZVBsYXliYWNrTWFya01zID0gMTUwMDA7ICAvLyAxNXNlY3MKKworTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6R2VuZXJpY1NvdXJjZTIoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAorICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgIGNvbnN0IHNwPE1lZGlhQ2xvY2s+ICZtZWRpYUNsb2NrKQorICAgIDogU291cmNlKG5vdGlmeSksCisgICAgICBtQXVkaW9UaW1lVXMoMCksCisgICAgICBtQXVkaW9MYXN0RGVxdWV1ZVRpbWVVcygwKSwKKyAgICAgIG1WaWRlb1RpbWVVcygwKSwKKyAgICAgIG1WaWRlb0xhc3REZXF1ZXVlVGltZVVzKDApLAorICAgICAgbVByZXZCdWZmZXJQZXJjZW50YWdlKC0xKSwKKyAgICAgIG1Qb2xsQnVmZmVyaW5nR2VuZXJhdGlvbigwKSwKKyAgICAgIG1TZW50UGF1c2VPbkJ1ZmZlcmluZyhmYWxzZSksCisgICAgICBtQXVkaW9EYXRhR2VuZXJhdGlvbigwKSwKKyAgICAgIG1WaWRlb0RhdGFHZW5lcmF0aW9uKDApLAorICAgICAgbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbigwKSwKKyAgICAgIG1GZXRjaFRpbWVkVGV4dERhdGFHZW5lcmF0aW9uKDApLAorICAgICAgbUR1cmF0aW9uVXMoLTFsbCksCisgICAgICBtQXVkaW9Jc1ZvcmJpcyhmYWxzZSksCisgICAgICBtSXNTZWN1cmUoZmFsc2UpLAorICAgICAgbUlzU3RyZWFtaW5nKGZhbHNlKSwKKyAgICAgIG1VSUQodWlkKSwKKyAgICAgIG1NZWRpYUNsb2NrKG1lZGlhQ2xvY2spLAorICAgICAgbUZkKC0xKSwKKyAgICAgIG1CaXRyYXRlKC0xbGwpLAorICAgICAgbVBlbmRpbmdSZWFkQnVmZmVyVHlwZXMoMCkgeworICAgIEFMT0dWKCJHZW5lcmljU291cmNlMiIpOworICAgIENIRUNLKG1lZGlhQ2xvY2sgIT0gTlVMTCk7CisKKyAgICBtQnVmZmVyaW5nU2V0dGluZ3MubUluaXRpYWxNYXJrTXMgPSBrSW5pdGlhbE1hcmtNczsKKyAgICBtQnVmZmVyaW5nU2V0dGluZ3MubVJlc3VtZVBsYXliYWNrTWFya01zID0ga1Jlc3VtZVBsYXliYWNrTWFya01zOworICAgIHJlc2V0RGF0YVNvdXJjZSgpOworfQorCit2b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OnJlc2V0RGF0YVNvdXJjZSgpIHsKKyAgICBBTE9HVigicmVzZXREYXRhU291cmNlIik7CisKKyAgICBtSFRUUFNlcnZpY2UuY2xlYXIoKTsKKyAgICBtSHR0cFNvdXJjZS5jbGVhcigpOworICAgIG1EaXNjb25uZWN0ZWQgPSBmYWxzZTsKKyAgICBtVXJpLmNsZWFyKCk7CisgICAgbVVyaUhlYWRlcnMuY2xlYXIoKTsKKyAgICBpZiAobUZkID49IDApIHsKKyAgICAgICAgY2xvc2UobUZkKTsKKyAgICAgICAgbUZkID0gLTE7CisgICAgfQorICAgIG1PZmZzZXQgPSAwOworICAgIG1MZW5ndGggPSAwOworICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgbVByZXBhcmluZyA9IGZhbHNlOworCisgICAgbUlzRHJtUHJvdGVjdGVkID0gZmFsc2U7CisgICAgbUlzRHJtUmVsZWFzZWQgPSBmYWxzZTsKKyAgICBtSXNTZWN1cmUgPSBmYWxzZTsKKyAgICBtTWltZXMuY2xlYXIoKTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6c2V0RGF0YVNvdXJjZSgKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBTE9HVigic2V0RGF0YVNvdXJjZSB1cmw6ICVzIiwgdXJsKTsKKworICAgIHJlc2V0RGF0YVNvdXJjZSgpOworCisgICAgbUhUVFBTZXJ2aWNlID0gaHR0cFNlcnZpY2U7CisgICAgbVVyaSA9IHVybDsKKworICAgIGlmIChoZWFkZXJzKSB7CisgICAgICAgIG1VcmlIZWFkZXJzID0gKmhlYWRlcnM7CisgICAgfQorCisgICAgLy8gZGVsYXkgZGF0YSBzb3VyY2UgY3JlYXRpb24gdG8gcHJlcGFyZUFzeW5jKCkgdG8gYXZvaWQgYmxvY2tpbmcKKyAgICAvLyB0aGUgY2FsbGluZyB0aHJlYWQgaW4gc2V0RGF0YVNvdXJjZSBmb3IgYW55IHNpZ25pZmljYW50IHRpbWUuCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpzZXREYXRhU291cmNlKAorICAgICAgICBpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQUxPR1YoInNldERhdGFTb3VyY2UgJWQvJWxsZC8lbGxkIiwgZmQsIChsb25nIGxvbmcpb2Zmc2V0LCAobG9uZyBsb25nKWxlbmd0aCk7CisKKyAgICByZXNldERhdGFTb3VyY2UoKTsKKworICAgIG1GZCA9IGR1cChmZCk7CisgICAgbU9mZnNldCA9IG9mZnNldDsKKyAgICBtTGVuZ3RoID0gbGVuZ3RoOworCisgICAgLy8gZGVsYXkgZGF0YSBzb3VyY2UgY3JlYXRpb24gdG8gcHJlcGFyZUFzeW5jKCkgdG8gYXZvaWQgYmxvY2tpbmcKKyAgICAvLyB0aGUgY2FsbGluZyB0aHJlYWQgaW4gc2V0RGF0YVNvdXJjZSBmb3IgYW55IHNpZ25pZmljYW50IHRpbWUuCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpzZXREYXRhU291cmNlKGNvbnN0IHNwPERhdGFTb3VyY2U+JiBzb3VyY2UpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIEFMT0dWKCJzZXREYXRhU291cmNlIChzb3VyY2U6ICVwKSIsIHNvdXJjZS5nZXQoKSk7CisKKyAgICByZXNldERhdGFTb3VyY2UoKTsKKyAgICBtRGF0YVNvdXJjZSA9IHNvdXJjZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3NwPE1ldGFEYXRhPiBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpnZXRGaWxlRm9ybWF0TWV0YSgpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtRmlsZU1ldGE7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OmluaXRGcm9tRGF0YVNvdXJjZSgpIHsKKyAgICBtRXh0cmFjdG9yID0gbmV3IEFNZWRpYUV4dHJhY3RvcldyYXBwZXIoQU1lZGlhRXh0cmFjdG9yX25ldygpKTsKKyAgICBDSEVDSyhtRGF0YVNvdXJjZSAhPSBOVUxMIHx8IG1GZCAhPSAtMSk7CisgICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSA9IG1EYXRhU291cmNlOworICAgIGNvbnN0IGludCBmZCA9IG1GZDsKKyAgICBjb25zdCBpbnQ2NF90IG9mZnNldCA9IG1PZmZzZXQ7CisgICAgY29uc3QgaW50NjRfdCBsZW5ndGggPSBtTGVuZ3RoOworCisgICAgbUxvY2sudW5sb2NrKCk7CisgICAgLy8gVGhpcyBtaWdodCB0YWtlIGxvbmcgdGltZSBpZiBkYXRhIHNvdXJjZSBpcyBub3QgcmVsaWFibGUuCisgICAgc3RhdHVzX3QgZXJyOworICAgIGlmIChkYXRhU291cmNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgbURhdGFTb3VyY2VXcmFwcGVyID0gbmV3IEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKGRhdGFTb3VyY2UpOworICAgICAgICBlcnIgPSBtRXh0cmFjdG9yLT5zZXREYXRhU291cmNlKG1EYXRhU291cmNlV3JhcHBlci0+Z2V0QU1lZGlhRGF0YVNvdXJjZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBlcnIgPSBtRXh0cmFjdG9yLT5zZXREYXRhU291cmNlKGZkLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgfQorCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiaW5pdEZyb21EYXRhU291cmNlLCBmYWlsZWQgdG8gY3JlYXRlIGRhdGEgc291cmNlISIpOworICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHNpemVfdCBudW10cmFja3MgPSBtRXh0cmFjdG9yLT5nZXRUcmFja0NvdW50KCk7CisgICAgaWYgKG51bXRyYWNrcyA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJpbml0RnJvbURhdGFTb3VyY2UsIHNvdXJjZSBoYXMgbm8gdHJhY2shIik7CisgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgbUxvY2subG9jaygpOworICAgIG1GZCA9IC0xOworICAgIG1EYXRhU291cmNlID0gZGF0YVNvdXJjZTsKKyAgICBtRmlsZU1ldGEgPSBjb252ZXJ0TWVkaWFGb3JtYXRXcmFwcGVyVG9NZXRhRGF0YShtRXh0cmFjdG9yLT5nZXRGb3JtYXQoKSk7CisgICAgaWYgKG1GaWxlTWV0YSAhPSBOVUxMKSB7CisgICAgICAgIGludDY0X3QgZHVyYXRpb247CisgICAgICAgIGlmIChtRmlsZU1ldGEtPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvbikpIHsKKyAgICAgICAgICAgIG1EdXJhdGlvblVzID0gZHVyYXRpb247CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQzMl90IHRvdGFsQml0cmF0ZSA9IDA7CisKKyAgICBtTWltZXMuY2xlYXIoKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtdHJhY2tzOyArK2kpIHsKKworICAgICAgICBzcDxBTWVkaWFGb3JtYXRXcmFwcGVyPiB0cmFja0Zvcm1hdCA9IG1FeHRyYWN0b3ItPmdldFRyYWNrRm9ybWF0KGkpOworICAgICAgICBpZiAodHJhY2tGb3JtYXQgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoIm5vIG1ldGFkYXRhIGZvciB0cmFjayAlenUiLCBpKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgc3A8QU1lZGlhRXh0cmFjdG9yV3JhcHBlcj4gdHJhY2tFeHRyYWN0b3IgPSBuZXcgQU1lZGlhRXh0cmFjdG9yV3JhcHBlcihBTWVkaWFFeHRyYWN0b3JfbmV3KCkpOworICAgICAgICBpZiAobURhdGFTb3VyY2VXcmFwcGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGVyciA9IHRyYWNrRXh0cmFjdG9yLT5zZXREYXRhU291cmNlKG1EYXRhU291cmNlV3JhcHBlci0+Z2V0QU1lZGlhRGF0YVNvdXJjZSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVyciA9IHRyYWNrRXh0cmFjdG9yLT5zZXREYXRhU291cmNlKGZkLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBjaGFyICptaW1lOworICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IGNvbnZlcnRNZWRpYUZvcm1hdFdyYXBwZXJUb01ldGFEYXRhKHRyYWNrRm9ybWF0KTsKKyAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworCisgICAgICAgIEFMT0dWKCJpbml0RnJvbURhdGFTb3VyY2UgdHJhY2tbJXp1XTogJXMiLCBpLCBtaW1lKTsKKworICAgICAgICAvLyBEbyB0aGUgc3RyaW5nIGNvbXBhcmUgaW1tZWRpYXRlbHkgd2l0aCAibWltZSIsCisgICAgICAgIC8vIHdlIGNhbid0IGFzc3VtZSAibWltZSIgd291bGQgc3RheSB2YWxpZCBhZnRlciBhbm90aGVyCisgICAgICAgIC8vIGV4dHJhY3RvciBvcGVyYXRpb24sIHNvbWUgZXh0cmFjdG9ycyBtaWdodCBtb2RpZnkgbWV0YQorICAgICAgICAvLyBkdXJpbmcgZ2V0VHJhY2soKSBhbmQgbWFrZSBpdCBpbnZhbGlkLgorICAgICAgICBpZiAoIXN0cm5jYXNlY21wKG1pbWUsICJhdWRpby8iLCA2KSkgeworICAgICAgICAgICAgaWYgKG1BdWRpb1RyYWNrLm1FeHRyYWN0b3IgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrLm1JbmRleCA9IGk7CisgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2subUV4dHJhY3RvciA9IHRyYWNrRXh0cmFjdG9yOworICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrLm1FeHRyYWN0b3ItPnNlbGVjdFRyYWNrKGkpOworICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrLm1QYWNrZXRzID0gbmV3IEFub3RoZXJQYWNrZXRTb3VyY2UobWV0YSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTKSkgeworICAgICAgICAgICAgICAgICAgICBtQXVkaW9Jc1ZvcmJpcyA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbUF1ZGlvSXNWb3JiaXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtTWltZXMuYWRkKFN0cmluZzgobWltZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcChtaW1lLCAidmlkZW8vIiwgNikpIHsKKyAgICAgICAgICAgIGlmIChtVmlkZW9UcmFjay5tRXh0cmFjdG9yID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtVmlkZW9UcmFjay5tSW5kZXggPSBpOworICAgICAgICAgICAgICAgIG1WaWRlb1RyYWNrLm1FeHRyYWN0b3IgPSB0cmFja0V4dHJhY3RvcjsKKyAgICAgICAgICAgICAgICBtVmlkZW9UcmFjay5tRXh0cmFjdG9yLT5zZWxlY3RUcmFjayhpKTsKKyAgICAgICAgICAgICAgICBtVmlkZW9UcmFjay5tUGFja2V0cyA9IG5ldyBBbm90aGVyUGFja2V0U291cmNlKG1ldGEpOworCisgICAgICAgICAgICAgICAgLy8gdmlkZW8gYWx3YXlzIGF0IHRoZSBiZWdpbm5pbmcKKyAgICAgICAgICAgICAgICBtTWltZXMuaW5zZXJ0QXQoU3RyaW5nOChtaW1lKSwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtRXh0cmFjdG9ycy5wdXNoKHRyYWNrRXh0cmFjdG9yKTsKKyAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzOworICAgICAgICBpZiAobWV0YS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uVXMpKSB7CisgICAgICAgICAgICBpZiAoZHVyYXRpb25VcyA+IG1EdXJhdGlvblVzKSB7CisgICAgICAgICAgICAgICAgbUR1cmF0aW9uVXMgPSBkdXJhdGlvblVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBiaXRyYXRlOworICAgICAgICBpZiAodG90YWxCaXRyYXRlID49IDAgJiYgbWV0YS0+ZmluZEludDMyKGtLZXlCaXRSYXRlLCAmYml0cmF0ZSkpIHsKKyAgICAgICAgICAgIHRvdGFsQml0cmF0ZSArPSBiaXRyYXRlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdG90YWxCaXRyYXRlID0gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HVigiaW5pdEZyb21EYXRhU291cmNlIG1FeHRyYWN0b3JzLnNpemUoKTogJXp1ICBtSXNTZWN1cmU6ICVkICBtaW1lWzBdOiAlcyIsIG1FeHRyYWN0b3JzLnNpemUoKSwKKyAgICAgICAgICAgIG1Jc1NlY3VyZSwgKG1NaW1lcy5pc0VtcHR5KCkgPyAiTk9ORSIgOiBtTWltZXNbMF0uc3RyaW5nKCkpKTsKKworICAgIGlmIChtRXh0cmFjdG9ycy5zaXplKCkgPT0gMCkgeworICAgICAgICBBTE9HRSgiYi8yMzcwNTY5NSIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICAvLyBNb2R1bGFyIERSTTogVGhlIHJldHVybiB2YWx1ZSBkb2Vzbid0IGFmZmVjdCBzb3VyY2UgaW5pdGlhbGl6YXRpb24uCisgICAgKHZvaWQpY2hlY2tEcm1JbmZvKCk7CisKKyAgICBtQml0cmF0ZSA9IHRvdGFsQml0cmF0ZTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6Z2V0QnVmZmVyaW5nU2V0dGluZ3MoCisgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgeworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgKmJ1ZmZlcmluZyA9IG1CdWZmZXJpbmdTZXR0aW5nczsKKyAgICB9CisKKyAgICBBTE9HVigiZ2V0QnVmZmVyaW5nU2V0dGluZ3N7JXN9IiwgYnVmZmVyaW5nLT50b1N0cmluZygpLnN0cmluZygpKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OnNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiBidWZmZXJpbmcpIHsKKyAgICBBTE9HVigic2V0QnVmZmVyaW5nU2V0dGluZ3N7JXN9IiwgYnVmZmVyaW5nLnRvU3RyaW5nKCkuc3RyaW5nKCkpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtQnVmZmVyaW5nU2V0dGluZ3MgPSBidWZmZXJpbmc7CisgICAgcmV0dXJuIE9LOworfQorCitpbnQ2NF90IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OmdldExhc3RSZWFkUG9zaXRpb24oKSB7CisgICAgaWYgKG1BdWRpb1RyYWNrLm1FeHRyYWN0b3IgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gbUF1ZGlvVGltZVVzOworICAgIH0gZWxzZSBpZiAobVZpZGVvVHJhY2subUV4dHJhY3RvciAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiBtVmlkZW9UaW1lVXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCitib29sIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OmlzU3RyZWFtaW5nKCkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1Jc1N0cmVhbWluZzsKK30KKworTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6fkdlbmVyaWNTb3VyY2UyKCkgeworICAgIEFMT0dWKCJ+R2VuZXJpY1NvdXJjZTIiKTsKKyAgICBpZiAobUxvb3BlciAhPSBOVUxMKSB7CisgICAgICAgIG1Mb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKGlkKCkpOworICAgICAgICBtTG9vcGVyLT5zdG9wKCk7CisgICAgfQorICAgIGlmIChtRGF0YVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIG1EYXRhU291cmNlLT5jbG9zZSgpOworICAgIH0KKyAgICByZXNldERhdGFTb3VyY2UoKTsKK30KKwordm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpwcmVwYXJlQXN5bmMoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBTE9HVigicHJlcGFyZUFzeW5jOiAobG9vcGVyOiAlZCkiLCAobUxvb3BlciAhPSBOVUxMKSk7CisKKyAgICBpZiAobUxvb3BlciA9PSBOVUxMKSB7CisgICAgICAgIG1Mb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICAgICAgbUxvb3Blci0+c2V0TmFtZSgiZ2VuZXJpYyIpOworICAgICAgICBtTG9vcGVyLT5zdGFydChmYWxzZSwgLyogcnVuT25DYWxsaW5nVGhyZWFkICovCisgICAgICAgICAgICAgICAgICAgICAgIHRydWUsICAvKiBjYW5DYWxsSmF2YSAqLworICAgICAgICAgICAgICAgICAgICAgICBQUklPUklUWV9ERUZBVUxUKTsKKworICAgICAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIodGhpcyk7CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFByZXBhcmVBc3luYywgdGhpcyk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6b25QcmVwYXJlQXN5bmMoKSB7CisgICAgQUxPR1YoIm9uUHJlcGFyZUFzeW5jOiBtRGF0YVNvdXJjZTogJWQiLCAobURhdGFTb3VyY2UgIT0gTlVMTCkpOworCisgICAgLy8gZGVsYXllZCBkYXRhIHNvdXJjZSBjcmVhdGlvbgorICAgIGlmIChtRGF0YVNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIC8vIHNldCB0byBmYWxzZSBmaXJzdCwgaWYgdGhlIGV4dHJhY3RvcgorICAgICAgICAvLyBjb21lcyBiYWNrIGFzIHNlY3VyZSwgc2V0IGl0IHRvIHRydWUgdGhlbi4KKyAgICAgICAgbUlzU2VjdXJlID0gZmFsc2U7CisKKyAgICAgICAgaWYgKCFtVXJpLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVyaSA9IG1VcmkuY19zdHIoKTsKKyAgICAgICAgICAgIFN0cmluZzggY29udGVudFR5cGU7CisKKyAgICAgICAgICAgIGlmICghc3RybmNhc2VjbXAoImh0dHA6Ly8iLCB1cmksIDcpIHx8ICFzdHJuY2FzZWNtcCgiaHR0cHM6Ly8iLCB1cmksIDgpKSB7CisgICAgICAgICAgICAgICAgbUh0dHBTb3VyY2UgPSBEYXRhU291cmNlRmFjdG9yeTo6Q3JlYXRlTWVkaWFIVFRQKG1IVFRQU2VydmljZSk7CisgICAgICAgICAgICAgICAgaWYgKG1IdHRwU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgaHR0cCBzb3VyY2UhIik7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeVByZXBhcmVkQW5kQ2xlYW51cChVTktOT1dOX0VSUk9SKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAvLyBUaGlzIG1pZ2h0IHRha2UgbG9uZyB0aW1lIGlmIGNvbm5lY3Rpb24gaGFzIHNvbWUgaXNzdWUuCisgICAgICAgICAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0gRGF0YVNvdXJjZUZhY3Rvcnk6OkNyZWF0ZUZyb21VUkkoCisgICAgICAgICAgICAgICAgICAgbUhUVFBTZXJ2aWNlLCB1cmksICZtVXJpSGVhZGVycywgJmNvbnRlbnRUeXBlLAorICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEhUVFBCYXNlICo+KG1IdHRwU291cmNlLmdldCgpKSk7CisgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgICAgICBpZiAoIW1EaXNjb25uZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICBtRGF0YVNvdXJjZSA9IGRhdGFTb3VyY2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobUZkID09IC0xICYmIG1EYXRhU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIGRhdGEgc291cmNlISIpOworICAgICAgICAgICAgbm90aWZ5UHJlcGFyZWRBbmRDbGVhbnVwKFVOS05PV05fRVJST1IpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1EYXRhU291cmNlICE9IG51bGxwdHIgJiYgbURhdGFTb3VyY2UtPmZsYWdzKCkgJiBEYXRhU291cmNlOjprSXNDYWNoaW5nRGF0YVNvdXJjZSkgeworICAgICAgICBtQ2FjaGVkU291cmNlID0gc3RhdGljX2Nhc3Q8TnVDYWNoZWRTb3VyY2UyICo+KG1EYXRhU291cmNlLmdldCgpKTsKKyAgICB9CisKKyAgICAvLyBGb3IgY2FjaGVkIHN0cmVhbWluZyBjYXNlcywgd2UgbmVlZCB0byB3YWl0IGZvciBlbm91Z2gKKyAgICAvLyBidWZmZXJpbmcgYmVmb3JlIHJlcG9ydGluZyBwcmVwYXJlZC4KKyAgICBtSXNTdHJlYW1pbmcgPSAobUNhY2hlZFNvdXJjZSAhPSBOVUxMKTsKKworICAgIC8vIGluaXQgZXh0cmFjdG9yIGZyb20gZGF0YSBzb3VyY2UKKyAgICBzdGF0dXNfdCBlcnIgPSBpbml0RnJvbURhdGFTb3VyY2UoKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0IGZyb20gZGF0YSBzb3VyY2UhIik7CisgICAgICAgIG5vdGlmeVByZXBhcmVkQW5kQ2xlYW51cChlcnIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1WaWRlb1RyYWNrLm1FeHRyYWN0b3IgIT0gTlVMTCkgeworICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IGdldEZvcm1hdE1ldGFfbChmYWxzZSAvKiBhdWRpbyAqLyk7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgIGVyciA9IGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZShtZXRhLCAmbXNnKTsKKyAgICAgICAgaWYoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBub3RpZnlQcmVwYXJlZEFuZENsZWFudXAoZXJyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlWaWRlb1NpemVDaGFuZ2VkKG1zZyk7CisgICAgfQorCisgICAgbm90aWZ5RmxhZ3NDaGFuZ2VkKAorICAgICAgICAgICAgLy8gRkxBR19TRUNVUkUgd2lsbCBiZSBrbm93biBpZi93aGVuIHByZXBhcmVEcm0gaXMgY2FsbGVkIGJ5IHRoZSBhcHAKKyAgICAgICAgICAgIC8vIEZMQUdfUFJPVEVDVEVEIHdpbGwgYmUga25vd24gaWYvd2hlbiBwcmVwYXJlRHJtIGlzIGNhbGxlZCBieSB0aGUgYXBwCisgICAgICAgICAgICBGTEFHX0NBTl9QQVVTRSB8CisgICAgICAgICAgICBGTEFHX0NBTl9TRUVLX0JBQ0tXQVJEIHwKKyAgICAgICAgICAgIEZMQUdfQ0FOX1NFRUtfRk9SV0FSRCB8CisgICAgICAgICAgICBGTEFHX0NBTl9TRUVLKTsKKworICAgIGZpbmlzaFByZXBhcmVBc3luYygpOworCisgICAgQUxPR1YoIm9uUHJlcGFyZUFzeW5jOiBEb25lIik7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6ZmluaXNoUHJlcGFyZUFzeW5jKCkgeworICAgIEFMT0dWKCJmaW5pc2hQcmVwYXJlQXN5bmMiKTsKKworICAgIGlmIChtSXNTdHJlYW1pbmcpIHsKKyAgICAgICAgbUNhY2hlZFNvdXJjZS0+cmVzdW1lRmV0Y2hpbmdJZk5lY2Vzc2FyeSgpOworICAgICAgICBtUHJlcGFyaW5nID0gdHJ1ZTsKKyAgICAgICAgc2NoZWR1bGVQb2xsQnVmZmVyaW5nKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbm90aWZ5UHJlcGFyZWQoKTsKKyAgICB9CisKKyAgICBpZiAobUF1ZGlvVHJhY2subUV4dHJhY3RvciAhPSBOVUxMKSB7CisgICAgICAgIHBvc3RSZWFkQnVmZmVyKE1FRElBX1RSQUNLX1RZUEVfQVVESU8pOworICAgIH0KKworICAgIGlmIChtVmlkZW9UcmFjay5tRXh0cmFjdG9yICE9IE5VTEwpIHsKKyAgICAgICAgcG9zdFJlYWRCdWZmZXIoTUVESUFfVFJBQ0tfVFlQRV9WSURFTyk7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6Om5vdGlmeVByZXBhcmVkQW5kQ2xlYW51cChzdGF0dXNfdCBlcnIpIHsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIG1EYXRhU291cmNlLmNsZWFyKCk7CisgICAgICAgIG1DYWNoZWRTb3VyY2UuY2xlYXIoKTsKKyAgICAgICAgbUh0dHBTb3VyY2UuY2xlYXIoKTsKKworICAgICAgICBtQml0cmF0ZSA9IC0xOworICAgICAgICBtUHJldkJ1ZmZlclBlcmNlbnRhZ2UgPSAtMTsKKyAgICAgICAgKyttUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb247CisgICAgfQorICAgIG5vdGlmeVByZXBhcmVkKGVycik7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6c3RhcnQoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBTE9HSSgic3RhcnQiKTsKKworICAgIGlmIChtQXVkaW9UcmFjay5tRXh0cmFjdG9yICE9IE5VTEwpIHsKKyAgICAgICAgcG9zdFJlYWRCdWZmZXIoTUVESUFfVFJBQ0tfVFlQRV9BVURJTyk7CisgICAgfQorCisgICAgaWYgKG1WaWRlb1RyYWNrLm1FeHRyYWN0b3IgIT0gTlVMTCkgeworICAgICAgICBwb3N0UmVhZEJ1ZmZlcihNRURJQV9UUkFDS19UWVBFX1ZJREVPKTsKKyAgICB9CisKKyAgICBtU3RhcnRlZCA9IHRydWU7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6c3RvcCgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1TdGFydGVkID0gZmFsc2U7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6cGF1c2UoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtU3RhcnRlZCA9IGZhbHNlOworfQorCit2b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OnJlc3VtZSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1TdGFydGVkID0gdHJ1ZTsKK30KKwordm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpkaXNjb25uZWN0KCkgeworICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UsIGh0dHBTb3VyY2U7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBkYXRhU291cmNlID0gbURhdGFTb3VyY2U7CisgICAgICAgIGh0dHBTb3VyY2UgPSBtSHR0cFNvdXJjZTsKKyAgICAgICAgbURpc2Nvbm5lY3RlZCA9IHRydWU7CisgICAgfQorCisgICAgaWYgKGRhdGFTb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAvLyBkaXNjb25uZWN0IGRhdGEgc291cmNlCisgICAgICAgIGlmIChkYXRhU291cmNlLT5mbGFncygpICYgRGF0YVNvdXJjZTo6a0lzQ2FjaGluZ0RhdGFTb3VyY2UpIHsKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PE51Q2FjaGVkU291cmNlMiAqPihkYXRhU291cmNlLmdldCgpKS0+ZGlzY29ubmVjdCgpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChodHRwU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgc3RhdGljX2Nhc3Q8SFRUUEJhc2UgKj4oaHR0cFNvdXJjZS5nZXQoKSktPmRpc2Nvbm5lY3QoKTsKKyAgICB9CisKKyAgICBtRGF0YVNvdXJjZVdyYXBwZXIgPSBOVUxMOworCit9CisKK3N0YXR1c190IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OmZlZWRNb3JlVFNEYXRhKCkgeworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpzZW5kQ2FjaGVTdGF0cygpIHsKKyAgICBpbnQzMl90IGticHMgPSAwOworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICBpZiAobUNhY2hlZFNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIGVyciA9IG1DYWNoZWRTb3VyY2UtPmdldEVzdGltYXRlZEJhbmR3aWR0aEticHMoJmticHMpOworICAgIH0KKworICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOworICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRDYWNoZVN0YXRzKTsKKyAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiYmFuZHdpZHRoIiwga2Jwcyk7CisgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgY2FzZSBrV2hhdFByZXBhcmVBc3luYzoKKyAgICAgIHsKKyAgICAgICAgICBvblByZXBhcmVBc3luYygpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBrV2hhdEZldGNoU3VidGl0bGVEYXRhOgorICAgICAgeworICAgICAgICAgIGZldGNoVGV4dERhdGEoa1doYXRTZW5kU3VidGl0bGVEYXRhLCBNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFLAorICAgICAgICAgICAgICAgICAgbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbiwgbVN1YnRpdGxlVHJhY2subVBhY2tldHMsIG1zZyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2Uga1doYXRGZXRjaFRpbWVkVGV4dERhdGE6CisgICAgICB7CisgICAgICAgICAgZmV0Y2hUZXh0RGF0YShrV2hhdFNlbmRUaW1lZFRleHREYXRhLCBNRURJQV9UUkFDS19UWVBFX1RJTUVEVEVYVCwKKyAgICAgICAgICAgICAgICAgIG1GZXRjaFRpbWVkVGV4dERhdGFHZW5lcmF0aW9uLCBtVGltZWRUZXh0VHJhY2subVBhY2tldHMsIG1zZyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2Uga1doYXRTZW5kU3VidGl0bGVEYXRhOgorICAgICAgeworICAgICAgICAgIHNlbmRUZXh0RGF0YShrV2hhdFN1YnRpdGxlRGF0YSwgTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRSwKKyAgICAgICAgICAgICAgICAgIG1GZXRjaFN1YnRpdGxlRGF0YUdlbmVyYXRpb24sIG1TdWJ0aXRsZVRyYWNrLm1QYWNrZXRzLCBtc2cpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIGtXaGF0U2VuZEdsb2JhbFRpbWVkVGV4dERhdGE6CisgICAgICB7CisgICAgICAgICAgc2VuZEdsb2JhbFRleHREYXRhKGtXaGF0VGltZWRUZXh0RGF0YSwgbUZldGNoVGltZWRUZXh0RGF0YUdlbmVyYXRpb24sIG1zZyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIGtXaGF0U2VuZFRpbWVkVGV4dERhdGE6CisgICAgICB7CisgICAgICAgICAgc2VuZFRleHREYXRhKGtXaGF0VGltZWRUZXh0RGF0YSwgTUVESUFfVFJBQ0tfVFlQRV9USU1FRFRFWFQsCisgICAgICAgICAgICAgICAgICBtRmV0Y2hUaW1lZFRleHREYXRhR2VuZXJhdGlvbiwgbVRpbWVkVGV4dFRyYWNrLm1QYWNrZXRzLCBtc2cpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIGtXaGF0Q2hhbmdlQVZTb3VyY2U6CisgICAgICB7CisgICAgICAgICAgaW50MzJfdCB0cmFja0luZGV4OworICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ0cmFja0luZGV4IiwgJnRyYWNrSW5kZXgpKTsKKyAgICAgICAgICBjb25zdCBzcDxBTWVkaWFFeHRyYWN0b3JXcmFwcGVyPiBleHRyYWN0b3IgPSBtRXh0cmFjdG9ycy5pdGVtQXQodHJhY2tJbmRleCk7CisKKyAgICAgICAgICBUcmFjayogdHJhY2s7CisgICAgICAgICAgQVN0cmluZyBtaW1lOworICAgICAgICAgIG1lZGlhX3RyYWNrX3R5cGUgdHJhY2tUeXBlLCBjb3VudGVycGFydFR5cGU7CisgICAgICAgICAgc3A8QU1lZGlhRm9ybWF0V3JhcHBlcj4gZm9ybWF0ID0gZXh0cmFjdG9yLT5nZXRUcmFja0Zvcm1hdCh0cmFja0luZGV4KTsKKyAgICAgICAgICBmb3JtYXQtPmdldFN0cmluZyhBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKTsKKyAgICAgICAgICBpZiAoIXN0cm5jYXNlY21wKG1pbWUuY19zdHIoKSwgImF1ZGlvLyIsIDYpKSB7CisgICAgICAgICAgICAgIHRyYWNrID0gJm1BdWRpb1RyYWNrOworICAgICAgICAgICAgICB0cmFja1R5cGUgPSBNRURJQV9UUkFDS19UWVBFX0FVRElPOworICAgICAgICAgICAgICBjb3VudGVycGFydFR5cGUgPSBNRURJQV9UUkFDS19UWVBFX1ZJREVPOzsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBDSEVDSyghc3RybmNhc2VjbXAobWltZS5jX3N0cigpLCAidmlkZW8vIiwgNikpOworICAgICAgICAgICAgICB0cmFjayA9ICZtVmlkZW9UcmFjazsKKyAgICAgICAgICAgICAgdHJhY2tUeXBlID0gTUVESUFfVFJBQ0tfVFlQRV9WSURFTzsKKyAgICAgICAgICAgICAgY291bnRlcnBhcnRUeXBlID0gTUVESUFfVFJBQ0tfVFlQRV9BVURJTzs7CisgICAgICAgICAgfQorCisKKyAgICAgICAgICB0cmFjay0+bUV4dHJhY3RvciA9IGV4dHJhY3RvcjsKKyAgICAgICAgICB0cmFjay0+bUV4dHJhY3Rvci0+c2VsZWN0U2luZ2xlVHJhY2sodHJhY2tJbmRleCk7CisgICAgICAgICAgdHJhY2stPm1JbmRleCA9IHRyYWNrSW5kZXg7CisgICAgICAgICAgKyttQXVkaW9EYXRhR2VuZXJhdGlvbjsKKyAgICAgICAgICArK21WaWRlb0RhdGFHZW5lcmF0aW9uOworCisgICAgICAgICAgaW50NjRfdCB0aW1lVXMsIGFjdHVhbFRpbWVVczsKKyAgICAgICAgICBjb25zdCBib29sIGZvcm1hdENoYW5nZSA9IHRydWU7CisgICAgICAgICAgaWYgKHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX0FVRElPKSB7CisgICAgICAgICAgICAgIHRpbWVVcyA9IG1BdWRpb0xhc3REZXF1ZXVlVGltZVVzOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHRpbWVVcyA9IG1WaWRlb0xhc3REZXF1ZXVlVGltZVVzOworICAgICAgICAgIH0KKyAgICAgICAgICByZWFkQnVmZmVyKHRyYWNrVHlwZSwgdGltZVVzLCBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DIC8qIG1vZGUgKi8sCisgICAgICAgICAgICAgICAgICAmYWN0dWFsVGltZVVzLCBmb3JtYXRDaGFuZ2UpOworICAgICAgICAgIHJlYWRCdWZmZXIoY291bnRlcnBhcnRUeXBlLCAtMSwgTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQyAvKiBtb2RlICovLAorICAgICAgICAgICAgICAgICAgTlVMTCwgIWZvcm1hdENoYW5nZSk7CisgICAgICAgICAgQUxPR1YoInRpbWVVcyAlbGxkIGFjdHVhbFRpbWVVcyAlbGxkIiwgKGxvbmcgbG9uZyl0aW1lVXMsIChsb25nIGxvbmcpYWN0dWFsVGltZVVzKTsKKworICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIGtXaGF0U2VlazoKKyAgICAgIHsKKyAgICAgICAgICBvblNlZWsobXNnKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBrV2hhdFJlYWRCdWZmZXI6CisgICAgICB7CisgICAgICAgICAgb25SZWFkQnVmZmVyKG1zZyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2Uga1doYXRQb2xsQnVmZmVyaW5nOgorICAgICAgeworICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7CisgICAgICAgICAgaWYgKGdlbmVyYXRpb24gPT0gbVBvbGxCdWZmZXJpbmdHZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgIG9uUG9sbEJ1ZmZlcmluZygpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBTb3VyY2U6Om9uTWVzc2FnZVJlY2VpdmVkKG1zZyk7CisgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OmZldGNoVGV4dERhdGEoCisgICAgICAgIHVpbnQzMl90IHNlbmRXaGF0LAorICAgICAgICBtZWRpYV90cmFja190eXBlIHR5cGUsCisgICAgICAgIGludDMyX3QgY3VyR2VuLAorICAgICAgICBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiYgcGFja2V0cywKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+JiBtc2cpIHsKKyAgICBpbnQzMl90IG1zZ0dlbmVyYXRpb247CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmbXNnR2VuZXJhdGlvbikpOworICAgIGlmIChtc2dHZW5lcmF0aW9uICE9IGN1ckdlbikgeworICAgICAgICAvLyBzdGFsZQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50MzJfdCBhdmFpbDsKKyAgICBpZiAocGFja2V0cy0+aGFzQnVmZmVyQXZhaWxhYmxlKCZhdmFpbCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDY0X3QgdGltZVVzOworICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CisKKyAgICBpbnQ2NF90IHN1YlRpbWVVcyA9IDA7CisgICAgcmVhZEJ1ZmZlcih0eXBlLCB0aW1lVXMsIE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMgLyogbW9kZSAqLywgJnN1YlRpbWVVcyk7CisKKyAgICBzdGF0dXNfdCBlb3NSZXN1bHQ7CisgICAgaWYgKCFwYWNrZXRzLT5oYXNCdWZmZXJBdmFpbGFibGUoJmVvc1Jlc3VsdCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtc2ctPndoYXQoKSA9PSBrV2hhdEZldGNoU3VidGl0bGVEYXRhKSB7CisgICAgICAgIHN1YlRpbWVVcyAtPSAxMDAwMDAwbGw7ICAvLyBzZW5kIHN1YnRpbGUgZGF0YSBvbmUgc2Vjb25kIGVhcmxpZXIKKyAgICB9CisgICAgc3A8QU1lc3NhZ2U+IG1zZzIgPSBuZXcgQU1lc3NhZ2Uoc2VuZFdoYXQsIHRoaXMpOworICAgIG1zZzItPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbXNnR2VuZXJhdGlvbik7CisgICAgbU1lZGlhQ2xvY2stPmFkZFRpbWVyKG1zZzIsIHN1YlRpbWVVcyk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6c2VuZFRleHREYXRhKAorICAgICAgICB1aW50MzJfdCB3aGF0LAorICAgICAgICBtZWRpYV90cmFja190eXBlIHR5cGUsCisgICAgICAgIGludDMyX3QgY3VyR2VuLAorICAgICAgICBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiYgcGFja2V0cywKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+JiBtc2cpIHsKKyAgICBpbnQzMl90IG1zZ0dlbmVyYXRpb247CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmbXNnR2VuZXJhdGlvbikpOworICAgIGlmIChtc2dHZW5lcmF0aW9uICE9IGN1ckdlbikgeworICAgICAgICAvLyBzdGFsZQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50NjRfdCBzdWJUaW1lVXM7CisgICAgaWYgKHBhY2tldHMtPm5leHRCdWZmZXJUaW1lKCZzdWJUaW1lVXMpICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQ2NF90IG5leHRTdWJUaW1lVXM7CisgICAgcmVhZEJ1ZmZlcih0eXBlLCAtMSwgTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQyAvKiBtb2RlICovLCAmbmV4dFN1YlRpbWVVcyk7CisKKyAgICBzcDxBQnVmZmVyPiBidWZmZXI7CisgICAgc3RhdHVzX3QgZGVxdWV1ZVN0YXR1cyA9IHBhY2tldHMtPmRlcXVldWVBY2Nlc3NVbml0KCZidWZmZXIpOworICAgIGlmIChkZXF1ZXVlU3RhdHVzID09IE9LKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKKyAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIHdoYXQpOworICAgICAgICBub3RpZnktPnNldEJ1ZmZlcigiYnVmZmVyIiwgYnVmZmVyKTsKKyAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisKKyAgICAgICAgaWYgKG1zZy0+d2hhdCgpID09IGtXaGF0U2VuZFN1YnRpdGxlRGF0YSkgeworICAgICAgICAgICAgbmV4dFN1YlRpbWVVcyAtPSAxMDAwMDAwbGw7ICAvLyBzZW5kIHN1YnRpbGUgZGF0YSBvbmUgc2Vjb25kIGVhcmxpZXIKKyAgICAgICAgfQorICAgICAgICBtTWVkaWFDbG9jay0+YWRkVGltZXIobXNnLCBuZXh0U3ViVGltZVVzKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6c2VuZEdsb2JhbFRleHREYXRhKAorICAgICAgICB1aW50MzJfdCB3aGF0LAorICAgICAgICBpbnQzMl90IGN1ckdlbiwKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZykgeworICAgIGludDMyX3QgbXNnR2VuZXJhdGlvbjsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZtc2dHZW5lcmF0aW9uKSk7CisgICAgaWYgKG1zZ0dlbmVyYXRpb24gIT0gY3VyR2VuKSB7CisgICAgICAgIC8vIHN0YWxlCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2b2lkICpkYXRhID0gTlVMTDsKKyAgICBzaXplX3Qgc2l6ZSA9IDA7CisgICAgaWYgKG1UaW1lZFRleHRUcmFjay5tRXh0cmFjdG9yLT5nZXRUcmFja0Zvcm1hdChtVGltZWRUZXh0VHJhY2subUluZGV4KS0+Z2V0QnVmZmVyKAorICAgICAgICAgICAgICAgICAgICAidGV4dCIsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgbUdsb2JhbFRpbWVkVGV4dCA9IG5ldyBBQnVmZmVyKHNpemUpOworICAgICAgICBpZiAobUdsb2JhbFRpbWVkVGV4dC0+ZGF0YSgpKSB7CisgICAgICAgICAgICBtZW1jcHkobUdsb2JhbFRpbWVkVGV4dC0+ZGF0YSgpLCBkYXRhLCBzaXplKTsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBnbG9iYWxNZXRhID0gbUdsb2JhbFRpbWVkVGV4dC0+bWV0YSgpOworICAgICAgICAgICAgZ2xvYmFsTWV0YS0+c2V0SW50NjQoInRpbWVVcyIsIDApOworICAgICAgICAgICAgZ2xvYmFsTWV0YS0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfVEVYVF8zR1BQKTsKKyAgICAgICAgICAgIGdsb2JhbE1ldGEtPnNldEludDMyKCJnbG9iYWwiLCAxKTsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKKyAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCB3aGF0KTsKKyAgICAgICAgICAgIG5vdGlmeS0+c2V0QnVmZmVyKCJidWZmZXIiLCBtR2xvYmFsVGltZWRUZXh0KTsKKyAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgICAgICB9CisgICAgfQorfQorCitzcDxBTWVzc2FnZT4gTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6Z2V0Rm9ybWF0KGJvb2wgYXVkaW8pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBnZXRGb3JtYXRfbChhdWRpbyk7Cit9CisKK3NwPE1ldGFEYXRhPiBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpnZXRGb3JtYXRNZXRhKGJvb2wgYXVkaW8pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBnZXRGb3JtYXRNZXRhX2woYXVkaW8pOworfQorCitzcDxBTWVzc2FnZT4gTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6Z2V0Rm9ybWF0X2woYm9vbCBhdWRpbykgeworICAgIHNwPEFNZWRpYUV4dHJhY3RvcldyYXBwZXI+IGV4dHJhY3RvciA9IGF1ZGlvID8gbUF1ZGlvVHJhY2subUV4dHJhY3RvciA6IG1WaWRlb1RyYWNrLm1FeHRyYWN0b3I7CisgICAgc2l6ZV90IHRyYWNrSW5kZXggPSBhdWRpbyA/IG1BdWRpb1RyYWNrLm1JbmRleCA6IG1WaWRlb1RyYWNrLm1JbmRleDsKKworICAgIGlmIChleHRyYWN0b3IgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gZXh0cmFjdG9yLT5nZXRUcmFja0Zvcm1hdCh0cmFja0luZGV4KS0+dG9BTWVzc2FnZSgpOworfQorCitzcDxNZXRhRGF0YT4gTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6Z2V0Rm9ybWF0TWV0YV9sKGJvb2wgYXVkaW8pIHsKKyAgICBzcDxBTWVkaWFFeHRyYWN0b3JXcmFwcGVyPiBleHRyYWN0b3IgPSBhdWRpbyA/IG1BdWRpb1RyYWNrLm1FeHRyYWN0b3IgOiBtVmlkZW9UcmFjay5tRXh0cmFjdG9yOworICAgIHNpemVfdCB0cmFja0luZGV4ID0gYXVkaW8gPyBtQXVkaW9UcmFjay5tSW5kZXggOiBtVmlkZW9UcmFjay5tSW5kZXg7CisKKyAgICBpZiAoZXh0cmFjdG9yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGNvbnZlcnRNZWRpYUZvcm1hdFdyYXBwZXJUb01ldGFEYXRhKGV4dHJhY3Rvci0+Z2V0VHJhY2tGb3JtYXQodHJhY2tJbmRleCkpOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpkZXF1ZXVlQWNjZXNzVW5pdCgKKyAgICAgICAgYm9vbCBhdWRpbywgc3A8QUJ1ZmZlcj4gKmFjY2Vzc1VuaXQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIC8vIElmIGhhcyBnb25lIHRocm91Z2ggc3RvcC9yZWxlYXNlRHJtIHNlcXVlbmNlLCB3ZSBubyBsb25nZXIgc2VuZCBkb3duIGFueSBidWZmZXIgYi9jCisgICAgLy8gdGhlIGNvZGVjJ3MgY3J5cHRvIG9iamVjdCBoYXMgZ29uZSBhd2F5IChiLzM3OTYwMDk2KS4KKyAgICAvLyBOb3RlOiBUaGlzIHdpbGwgYmUgdW5uZWNlc3Nhcnkgd2hlbiBzdG9wKCkgY2hhbmdlcyBiZWhhdmlvciBhbmQgcmVsZWFzZXMgY29kZWMgKGIvMzUyNDgyODMpLgorICAgIGlmICghbVN0YXJ0ZWQgJiYgbUlzRHJtUmVsZWFzZWQpIHsKKyAgICAgICAgcmV0dXJuIC1FV09VTERCTE9DSzsKKyAgICB9CisKKyAgICBUcmFjayAqdHJhY2sgPSBhdWRpbyA/ICZtQXVkaW9UcmFjayA6ICZtVmlkZW9UcmFjazsKKworICAgIGlmICh0cmFjay0+bUV4dHJhY3RvciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRVdPVUxEQkxPQ0s7CisgICAgfQorCisgICAgc3RhdHVzX3QgZmluYWxSZXN1bHQ7CisgICAgaWYgKCF0cmFjay0+bVBhY2tldHMtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZmluYWxSZXN1bHQpKSB7CisgICAgICAgIGlmIChmaW5hbFJlc3VsdCA9PSBPSykgeworICAgICAgICAgICAgcG9zdFJlYWRCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgIGF1ZGlvID8gTUVESUFfVFJBQ0tfVFlQRV9BVURJTyA6IE1FRElBX1RSQUNLX1RZUEVfVklERU8pOworICAgICAgICAgICAgcmV0dXJuIC1FV09VTERCTE9DSzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmluYWxSZXN1bHQ7CisgICAgfQorCisgICAgc3RhdHVzX3QgcmVzdWx0ID0gdHJhY2stPm1QYWNrZXRzLT5kZXF1ZXVlQWNjZXNzVW5pdChhY2Nlc3NVbml0KTsKKworICAgIC8vIHN0YXJ0IHB1bGxpbmcgaW4gbW9yZSBidWZmZXJzIGlmIGNhY2hlIGlzIHJ1bm5pbmcgbG93CisgICAgLy8gc28gdGhhdCBkZWNvZGVyIGhhcyBsZXNzIGNoYW5jZSBvZiBiZWluZyBzdGFydmVkCisgICAgaWYgKCFtSXNTdHJlYW1pbmcpIHsKKyAgICAgICAgaWYgKHRyYWNrLT5tUGFja2V0cy0+Z2V0QXZhaWxhYmxlQnVmZmVyQ291bnQoJmZpbmFsUmVzdWx0KSA8IDIpIHsKKyAgICAgICAgICAgIHBvc3RSZWFkQnVmZmVyKGF1ZGlvPyBNRURJQV9UUkFDS19UWVBFX0FVRElPIDogTUVESUFfVFJBQ0tfVFlQRV9WSURFTyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPSB0cmFjay0+bVBhY2tldHMtPmdldEJ1ZmZlcmVkRHVyYXRpb25VcygmZmluYWxSZXN1bHQpOworICAgICAgICAvLyBUT0RPOiBtYXhSZWJ1ZmZlcmluZ01hcmtNcyBjb3VsZCBiZSBsYXJnZXIgdGhhbgorICAgICAgICAvLyBtQnVmZmVyaW5nU2V0dGluZ3MubVJlc3VtZVBsYXliYWNrTWFya01zCisgICAgICAgIGludDY0X3QgcmVzdGFydEJ1ZmZlcmluZ01hcmtVcyA9CisgICAgICAgICAgICAgbUJ1ZmZlcmluZ1NldHRpbmdzLm1SZXN1bWVQbGF5YmFja01hcmtNcyAqIDEwMDBsbCAvIDI7CisgICAgICAgIGlmIChmaW5hbFJlc3VsdCA9PSBPSykgeworICAgICAgICAgICAgaWYgKGR1cmF0aW9uVXMgPCByZXN0YXJ0QnVmZmVyaW5nTWFya1VzKSB7CisgICAgICAgICAgICAgICAgcG9zdFJlYWRCdWZmZXIoYXVkaW8/IE1FRElBX1RSQUNLX1RZUEVfQVVESU8gOiBNRURJQV9UUkFDS19UWVBFX1ZJREVPKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0cmFjay0+bVBhY2tldHMtPmdldEF2YWlsYWJsZUJ1ZmZlckNvdW50KCZmaW5hbFJlc3VsdCkgPCAyCisgICAgICAgICAgICAgICAgJiYgIW1TZW50UGF1c2VPbkJ1ZmZlcmluZyAmJiAhbVByZXBhcmluZykgeworICAgICAgICAgICAgICAgIG1DYWNoZWRTb3VyY2UtPnJlc3VtZUZldGNoaW5nSWZOZWNlc3NhcnkoKTsKKyAgICAgICAgICAgICAgICBzZW5kQ2FjaGVTdGF0cygpOworICAgICAgICAgICAgICAgIG1TZW50UGF1c2VPbkJ1ZmZlcmluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOworICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFBhdXNlT25CdWZmZXJpbmdTdGFydCk7CisgICAgICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocmVzdWx0ICE9IE9LKSB7CisgICAgICAgIGlmIChtU3VidGl0bGVUcmFjay5tRXh0cmFjdG9yICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1TdWJ0aXRsZVRyYWNrLm1QYWNrZXRzLT5jbGVhcigpOworICAgICAgICAgICAgbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbisrOworICAgICAgICB9CisgICAgICAgIGlmIChtVGltZWRUZXh0VHJhY2subUV4dHJhY3RvciAhPSBOVUxMKSB7CisgICAgICAgICAgICBtVGltZWRUZXh0VHJhY2subVBhY2tldHMtPmNsZWFyKCk7CisgICAgICAgICAgICBtRmV0Y2hUaW1lZFRleHREYXRhR2VuZXJhdGlvbisrOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgaW50NjRfdCB0aW1lVXM7CisgICAgc3RhdHVzX3QgZW9zUmVzdWx0OyAvLyBpZ25vcmVkCisgICAgQ0hFQ0soKCphY2Nlc3NVbml0KS0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKKyAgICBpZiAoYXVkaW8pIHsKKyAgICAgICAgbUF1ZGlvTGFzdERlcXVldWVUaW1lVXMgPSB0aW1lVXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVZpZGVvTGFzdERlcXVldWVUaW1lVXMgPSB0aW1lVXM7CisgICAgfQorCisgICAgaWYgKG1TdWJ0aXRsZVRyYWNrLm1FeHRyYWN0b3IgIT0gTlVMTAorICAgICAgICAgICAgJiYgIW1TdWJ0aXRsZVRyYWNrLm1QYWNrZXRzLT5oYXNCdWZmZXJBdmFpbGFibGUoJmVvc1Jlc3VsdCkpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEZldGNoU3VidGl0bGVEYXRhLCB0aGlzKTsKKyAgICAgICAgbXNnLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKKyAgICAgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1GZXRjaFN1YnRpdGxlRGF0YUdlbmVyYXRpb24pOworICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICB9CisKKyAgICBpZiAobVRpbWVkVGV4dFRyYWNrLm1FeHRyYWN0b3IgIT0gTlVMTAorICAgICAgICAgICAgJiYgIW1UaW1lZFRleHRUcmFjay5tUGFja2V0cy0+aGFzQnVmZmVyQXZhaWxhYmxlKCZlb3NSZXN1bHQpKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRGZXRjaFRpbWVkVGV4dERhdGEsIHRoaXMpOworICAgICAgICBtc2ctPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOworICAgICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUZldGNoVGltZWRUZXh0RGF0YUdlbmVyYXRpb24pOworICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpnZXREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAqZHVyYXRpb25VcyA9IG1EdXJhdGlvblVzOworICAgIHJldHVybiBPSzsKK30KKworc2l6ZV90IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OmdldFRyYWNrQ291bnQoKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUV4dHJhY3RvcnMuc2l6ZSgpOworfQorCitzcDxBTWVzc2FnZT4gTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6Z2V0VHJhY2tJbmZvKHNpemVfdCB0cmFja0luZGV4KSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBzaXplX3QgdHJhY2tDb3VudCA9IG1FeHRyYWN0b3JzLnNpemUoKTsKKyAgICBpZiAodHJhY2tJbmRleCA+PSB0cmFja0NvdW50KSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBtRXh0cmFjdG9ycy5pdGVtQXQodHJhY2tJbmRleCktPmdldFRyYWNrRm9ybWF0KHRyYWNrSW5kZXgpLT50b0FNZXNzYWdlKCk7CisgICAgaWYgKGZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJubyBtZXRhZGF0YSBmb3IgdHJhY2sgJXp1IiwgdHJhY2tJbmRleCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIEFTdHJpbmcgbWltZTsKKyAgICBDSEVDSyhmb3JtYXQtPmZpbmRTdHJpbmcoQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSkpOworCisgICAgaW50MzJfdCB0cmFja1R5cGU7CisgICAgaWYgKCFzdHJuY2FzZWNtcChtaW1lLmNfc3RyKCksICJ2aWRlby8iLCA2KSkgeworICAgICAgICB0cmFja1R5cGUgPSBNRURJQV9UUkFDS19UWVBFX1ZJREVPOworICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKG1pbWUuY19zdHIoKSwgImF1ZGlvLyIsIDYpKSB7CisgICAgICAgIHRyYWNrVHlwZSA9IE1FRElBX1RSQUNLX1RZUEVfQVVESU87CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLmNfc3RyKCksIE1FRElBX01JTUVUWVBFX1RFWFRfM0dQUCkpIHsKKyAgICAgICAgdHJhY2tUeXBlID0gTUVESUFfVFJBQ0tfVFlQRV9USU1FRFRFWFQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdHJhY2tUeXBlID0gTUVESUFfVFJBQ0tfVFlQRV9VTktOT1dOOworICAgIH0KKyAgICBmb3JtYXQtPnNldEludDMyKCJ0eXBlIiwgdHJhY2tUeXBlKTsKKworICAgIEFTdHJpbmcgbGFuZzsKKyAgICBpZiAoIWZvcm1hdC0+ZmluZFN0cmluZygibGFuZ3VhZ2UiLCAmbGFuZykpIHsKKyAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoImxhbmd1YWdlIiwgInVuZCIpOworICAgIH0KKworICAgIGlmICh0cmFja1R5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRSkgeworICAgICAgICBpbnQzMl90IGlzQXV0b3NlbGVjdCA9IDEsIGlzRGVmYXVsdCA9IDAsIGlzRm9yY2VkID0gMDsKKyAgICAgICAgZm9ybWF0LT5maW5kSW50MzIoQU1FRElBRk9STUFUX0tFWV9JU19BVVRPU0VMRUNULCAmaXNBdXRvc2VsZWN0KTsKKyAgICAgICAgZm9ybWF0LT5maW5kSW50MzIoQU1FRElBRk9STUFUX0tFWV9JU19ERUZBVUxULCAmaXNEZWZhdWx0KTsKKyAgICAgICAgZm9ybWF0LT5maW5kSW50MzIoQU1FRElBRk9STUFUX0tFWV9JU19GT1JDRURfU1VCVElUTEUsICZpc0ZvcmNlZCk7CisKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiYXV0byIsICEhaXNBdXRvc2VsZWN0KTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiZGVmYXVsdCIsICEhaXNEZWZhdWx0KTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiZm9yY2VkIiwgISFpc0ZvcmNlZCk7CisgICAgfQorCisgICAgcmV0dXJuIGZvcm1hdDsKK30KKworc3NpemVfdCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpnZXRTZWxlY3RlZFRyYWNrKG1lZGlhX3RyYWNrX3R5cGUgdHlwZSkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgY29uc3QgVHJhY2sgKnRyYWNrID0gTlVMTDsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIE1FRElBX1RSQUNLX1RZUEVfVklERU86CisgICAgICAgIHRyYWNrID0gJm1WaWRlb1RyYWNrOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1FRElBX1RSQUNLX1RZUEVfQVVESU86CisgICAgICAgIHRyYWNrID0gJm1BdWRpb1RyYWNrOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1FRElBX1RSQUNLX1RZUEVfVElNRURURVhUOgorICAgICAgICB0cmFjayA9ICZtVGltZWRUZXh0VHJhY2s7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRToKKyAgICAgICAgdHJhY2sgPSAmbVN1YnRpdGxlVHJhY2s7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICh0cmFjayAhPSBOVUxMICYmIHRyYWNrLT5tRXh0cmFjdG9yICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIHRyYWNrLT5tSW5kZXg7CisgICAgfQorCisgICAgcmV0dXJuIC0xOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpzZWxlY3RUcmFjayhzaXplX3QgdHJhY2tJbmRleCwgYm9vbCBzZWxlY3QsIGludDY0X3QgdGltZVVzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBTE9HVigiJXMgdHJhY2s6ICV6dSIsIHNlbGVjdCA/ICJzZWxlY3QiIDogImRlc2VsZWN0IiwgdHJhY2tJbmRleCk7CisKKyAgICBpZiAodHJhY2tJbmRleCA+PSBtRXh0cmFjdG9ycy5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9JTkRFWDsKKyAgICB9CisKKyAgICBpZiAoIXNlbGVjdCkgeworICAgICAgICBUcmFjayogdHJhY2sgPSBOVUxMOworICAgICAgICBpZiAobVN1YnRpdGxlVHJhY2subUV4dHJhY3RvciAhPSBOVUxMICYmIHRyYWNrSW5kZXggPT0gbVN1YnRpdGxlVHJhY2subUluZGV4KSB7CisgICAgICAgICAgICB0cmFjayA9ICZtU3VidGl0bGVUcmFjazsKKyAgICAgICAgICAgIG1GZXRjaFN1YnRpdGxlRGF0YUdlbmVyYXRpb24rKzsKKyAgICAgICAgfSBlbHNlIGlmIChtVGltZWRUZXh0VHJhY2subUV4dHJhY3RvciAhPSBOVUxMICYmIHRyYWNrSW5kZXggPT0gbVRpbWVkVGV4dFRyYWNrLm1JbmRleCkgeworICAgICAgICAgICAgdHJhY2sgPSAmbVRpbWVkVGV4dFRyYWNrOworICAgICAgICAgICAgbUZldGNoVGltZWRUZXh0RGF0YUdlbmVyYXRpb24rKzsKKyAgICAgICAgfQorICAgICAgICBpZiAodHJhY2sgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgICAgIHRyYWNrLT5tRXh0cmFjdG9yID0gTlVMTDsKKyAgICAgICAgdHJhY2stPm1QYWNrZXRzLT5jbGVhcigpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgY29uc3Qgc3A8QU1lZGlhRXh0cmFjdG9yV3JhcHBlcj4gZXh0cmFjdG9yID0gbUV4dHJhY3RvcnMuaXRlbUF0KHRyYWNrSW5kZXgpOworICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gY29udmVydE1lZGlhRm9ybWF0V3JhcHBlclRvTWV0YURhdGEoZXh0cmFjdG9yLT5nZXRUcmFja0Zvcm1hdCh0cmFja0luZGV4KSk7CisgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICBDSEVDSyhtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisgICAgaWYgKCFzdHJuY2FzZWNtcChtaW1lLCAidGV4dC8iLCA1KSkgeworICAgICAgICBib29sIGlzU3VidGl0bGUgPSBzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1RFWFRfM0dQUCk7CisgICAgICAgIFRyYWNrICp0cmFjayA9IGlzU3VidGl0bGUgPyAmbVN1YnRpdGxlVHJhY2sgOiAmbVRpbWVkVGV4dFRyYWNrOworICAgICAgICBpZiAodHJhY2stPm1FeHRyYWN0b3IgIT0gTlVMTCAmJiB0cmFjay0+bUluZGV4ID09IHRyYWNrSW5kZXgpIHsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgICAgICB0cmFjay0+bUluZGV4ID0gdHJhY2tJbmRleDsKKyAgICAgICAgdHJhY2stPm1FeHRyYWN0b3IgPSBtRXh0cmFjdG9ycy5pdGVtQXQodHJhY2tJbmRleCk7CisgICAgICAgIHRyYWNrLT5tRXh0cmFjdG9yLT5zZWxlY3RTaW5nbGVUcmFjayh0cmFja0luZGV4KTsKKyAgICAgICAgaWYgKHRyYWNrLT5tUGFja2V0cyA9PSBOVUxMKSB7CisgICAgICAgICAgICB0cmFjay0+bVBhY2tldHMgPSBuZXcgQW5vdGhlclBhY2tldFNvdXJjZShtZXRhKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyYWNrLT5tUGFja2V0cy0+Y2xlYXIoKTsKKyAgICAgICAgICAgIHRyYWNrLT5tUGFja2V0cy0+c2V0Rm9ybWF0KG1ldGEpOworCisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNTdWJ0aXRsZSkgeworICAgICAgICAgICAgbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbisrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUZldGNoVGltZWRUZXh0RGF0YUdlbmVyYXRpb24rKzsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1c190IGVvc1Jlc3VsdDsgLy8gaWdub3JlZAorICAgICAgICBpZiAobVN1YnRpdGxlVHJhY2subUV4dHJhY3RvciAhPSBOVUxMCisgICAgICAgICAgICAgICAgJiYgIW1TdWJ0aXRsZVRyYWNrLm1QYWNrZXRzLT5oYXNCdWZmZXJBdmFpbGFibGUoJmVvc1Jlc3VsdCkpIHsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRGZXRjaFN1YnRpdGxlRGF0YSwgdGhpcyk7CisgICAgICAgICAgICBtc2ctPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOworICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1GZXRjaFN1YnRpdGxlRGF0YUdlbmVyYXRpb24pOworICAgICAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgICAgIH0KKworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnMiA9IG5ldyBBTWVzc2FnZShrV2hhdFNlbmRHbG9iYWxUaW1lZFRleHREYXRhLCB0aGlzKTsKKyAgICAgICAgbXNnMi0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtRmV0Y2hUaW1lZFRleHREYXRhR2VuZXJhdGlvbik7CisgICAgICAgIG1zZzItPnBvc3QoKTsKKworICAgICAgICBpZiAobVRpbWVkVGV4dFRyYWNrLm1FeHRyYWN0b3IgIT0gTlVMTAorICAgICAgICAgICAgICAgICYmICFtVGltZWRUZXh0VHJhY2subVBhY2tldHMtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZW9zUmVzdWx0KSkgeworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEZldGNoVGltZWRUZXh0RGF0YSwgdGhpcyk7CisgICAgICAgICAgICBtc2ctPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOworICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1GZXRjaFRpbWVkVGV4dERhdGFHZW5lcmF0aW9uKTsKKyAgICAgICAgICAgIG1zZy0+cG9zdCgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKG1pbWUsICJhdWRpby8iLCA2KSB8fCAhc3RybmNhc2VjbXAobWltZSwgInZpZGVvLyIsIDYpKSB7CisgICAgICAgIGJvb2wgYXVkaW8gPSAhc3RybmNhc2VjbXAobWltZSwgImF1ZGlvLyIsIDYpOworICAgICAgICBUcmFjayAqdHJhY2sgPSBhdWRpbyA/ICZtQXVkaW9UcmFjayA6ICZtVmlkZW9UcmFjazsKKyAgICAgICAgaWYgKHRyYWNrLT5tRXh0cmFjdG9yICE9IE5VTEwgJiYgdHJhY2stPm1JbmRleCA9PSB0cmFja0luZGV4KSB7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2hhbmdlQVZTb3VyY2UsIHRoaXMpOworICAgICAgICBtc2ctPnNldEludDMyKCJ0cmFja0luZGV4IiwgdHJhY2tJbmRleCk7CisgICAgICAgIG1zZy0+cG9zdCgpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpzZWVrVG8oaW50NjRfdCBzZWVrVGltZVVzLCBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlKSB7CisgICAgQUxPR1YoInNlZWtUbzogJWxsZCwgJWQiLCAobG9uZyBsb25nKXNlZWtUaW1lVXMsIG1vZGUpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZWVrLCB0aGlzKTsKKyAgICBtc2ctPnNldEludDY0KCJzZWVrVGltZVVzIiwgc2Vla1RpbWVVcyk7CisgICAgbXNnLT5zZXRJbnQzMigibW9kZSIsIG1vZGUpOworCisgICAgLy8gTmVlZCB0byBjYWxsIHJlYWRCdWZmZXIgb24gfG1Mb29wZXJ8IHRvIGVuc3VyZSB0aGUgY2FsbHMgdG8KKyAgICAvLyBJTWVkaWFTb3VyY2U6OnJlYWQqIGFyZSBzZXJpYWxpemVkLiBOb3RlIHRoYXQgSU1lZGlhU291cmNlOjpyZWFkKgorICAgIC8vIGlzIGNhbGxlZCB3aXRob3V0IHxtTG9ja3wgYWNxdWlyZWQgYW5kIE1lZGlhU291cmNlIGlzIG5vdCB0aHJlYWQgc2FmZS4KKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworICAgIGlmIChlcnIgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgeworICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKwordm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpvblNlZWsoY29uc3Qgc3A8QU1lc3NhZ2U+JiBtc2cpIHsKKyAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CisgICAgaW50MzJfdCBtb2RlOworICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzZWVrVGltZVVzIiwgJnNlZWtUaW1lVXMpKTsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigibW9kZSIsICZtb2RlKSk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgc3RhdHVzX3QgZXJyID0gZG9TZWVrKHNlZWtUaW1lVXMsIChNZWRpYVBsYXllcjJTZWVrTW9kZSltb2RlKTsKKyAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CisKKyAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6ZG9TZWVrKGludDY0X3Qgc2Vla1RpbWVVcywgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSkgeworICAgIGlmIChtVmlkZW9UcmFjay5tRXh0cmFjdG9yICE9IE5VTEwpIHsKKyAgICAgICAgKyttVmlkZW9EYXRhR2VuZXJhdGlvbjsKKworICAgICAgICBpbnQ2NF90IGFjdHVhbFRpbWVVczsKKyAgICAgICAgcmVhZEJ1ZmZlcihNRURJQV9UUkFDS19UWVBFX1ZJREVPLCBzZWVrVGltZVVzLCBtb2RlLCAmYWN0dWFsVGltZVVzKTsKKworICAgICAgICBpZiAobW9kZSAhPSBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19DTE9TRVNUKSB7CisgICAgICAgICAgICBzZWVrVGltZVVzID0gYWN0dWFsVGltZVVzOworICAgICAgICB9CisgICAgICAgIG1WaWRlb0xhc3REZXF1ZXVlVGltZVVzID0gYWN0dWFsVGltZVVzOworICAgIH0KKworICAgIGlmIChtQXVkaW9UcmFjay5tRXh0cmFjdG9yICE9IE5VTEwpIHsKKyAgICAgICAgKyttQXVkaW9EYXRhR2VuZXJhdGlvbjsKKyAgICAgICAgcmVhZEJ1ZmZlcihNRURJQV9UUkFDS19UWVBFX0FVRElPLCBzZWVrVGltZVVzLCBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19DTE9TRVNUKTsKKyAgICAgICAgbUF1ZGlvTGFzdERlcXVldWVUaW1lVXMgPSBzZWVrVGltZVVzOworICAgIH0KKworICAgIGlmIChtU3VidGl0bGVUcmFjay5tRXh0cmFjdG9yICE9IE5VTEwpIHsKKyAgICAgICAgbVN1YnRpdGxlVHJhY2subVBhY2tldHMtPmNsZWFyKCk7CisgICAgICAgIG1GZXRjaFN1YnRpdGxlRGF0YUdlbmVyYXRpb24rKzsKKyAgICB9CisKKyAgICBpZiAobVRpbWVkVGV4dFRyYWNrLm1FeHRyYWN0b3IgIT0gTlVMTCkgeworICAgICAgICBtVGltZWRUZXh0VHJhY2subVBhY2tldHMtPmNsZWFyKCk7CisgICAgICAgIG1GZXRjaFRpbWVkVGV4dERhdGFHZW5lcmF0aW9uKys7CisgICAgfQorCisgICAgKyttUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb247CisgICAgc2NoZWR1bGVQb2xsQnVmZmVyaW5nKCk7CisgICAgcmV0dXJuIE9LOworfQorCitzcDxBQnVmZmVyPiBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjptZWRpYUJ1ZmZlclRvQUJ1ZmZlcigKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlKiBtYiwKKyAgICAgICAgbWVkaWFfdHJhY2tfdHlwZSB0cmFja1R5cGUpIHsKKyAgICBib29sIGF1ZGlvID0gdHJhY2tUeXBlID09IE1FRElBX1RSQUNLX1RZUEVfQVVESU87CisgICAgc2l6ZV90IG91dExlbmd0aCA9IG1iLT5yYW5nZV9sZW5ndGgoKTsKKworICAgIGlmIChhdWRpbyAmJiBtQXVkaW9Jc1ZvcmJpcykgeworICAgICAgICBvdXRMZW5ndGggKz0gc2l6ZW9mKGludDMyX3QpOworICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGFiOworCisgICAgaWYgKG1Jc0RybVByb3RlY3RlZCkgICB7CisgICAgICAgIC8vIE1vZHVsYXIgRFJNCisgICAgICAgIC8vIEVuYWJsZWQgZm9yIGJvdGggdmlkZW8vYXVkaW8gc28gMSkgbWVkaWEgYnVmZmVyIGlzIHJldXNlZCB3aXRob3V0IGV4dHJhIGNvcHlpbmcKKyAgICAgICAgLy8gMikgbWV0YSBkYXRhIGNhbiBiZSByZXRyaWV2ZWQgaW4gb25JbnB1dEJ1ZmZlckZldGNoZWQgZm9yIGNhbGxpbmcgcXVldWVTZWN1cmVJbnB1dEJ1ZmZlci4KKworICAgICAgICAvLyBkYXRhIGlzIGFscmVhZHkgcHJvdmlkZWQgaW4gdGhlIGJ1ZmZlcgorICAgICAgICBhYiA9IG5ldyBBQnVmZmVyKE5VTEwsIG1iLT5yYW5nZV9sZW5ndGgoKSk7CisgICAgICAgIGFiLT5tZXRhKCktPnNldE9iamVjdCgibWVkaWFCdWZmZXJIb2xkZXIiLCBuZXcgTWVkaWFCdWZmZXJIb2xkZXIobWIpKTsKKworICAgICAgICAvLyBNb2R1bGFyIERSTTogUmVxdWlyZWQgYi9jIG9mIHRoZSBhYm92ZSBhZGRfcmVmLgorICAgICAgICAvLyBJZiByZWY+MCwgdGhlcmUgbXVzdCBiZSBhbiBvYnNlcnZlciwgb3IgaXQnbGwgY3Jhc2ggYXQgcmVsZWFzZSgpLgorICAgICAgICAvLyBUT0RPOiBNZWRpYUJ1ZmZlciBtaWdodCBuZWVkIHRvIGJlIHJldmlzZWQgdG8gZWFzZSBzdWNoIG5lZWQuCisgICAgICAgIG1iLT5zZXRPYnNlcnZlcih0aGlzKTsKKyAgICAgICAgLy8gc2V0TWVkaWFCdWZmZXJCYXNlKCkgaW50ZXJlc3RpbmdseSBkb2Vzbid0IGluY3JlbWVudCB0aGUgcmVmIGNvdW50IG9uIGl0cyBvd24uCisgICAgICAgIC8vIEV4dHJhIGluY3JlbWVudCAoc2luY2Ugd2Ugd2FudCB0byBrZWVwIG1iIGFsaXZlIGFuZCBhdHRhY2hlZCB0byBhYiBiZXlvbmQgdGhpcyBmdW5jdGlvbgorICAgICAgICAvLyBjYWxsLiBUaGlzIGlzIHRvIGNvdW50ZXIgdGhlIGVmZmVjdCBvZiBtYi0+cmVsZWFzZSgpIHRvd2FyZHMgdGhlIGVuZC4KKyAgICAgICAgbWItPmFkZF9yZWYoKTsKKworICAgIH0gZWxzZSB7CisgICAgICAgIGFiID0gbmV3IEFCdWZmZXIob3V0TGVuZ3RoKTsKKyAgICAgICAgbWVtY3B5KGFiLT5kYXRhKCksCisgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKW1iLT5kYXRhKCkgKyBtYi0+cmFuZ2Vfb2Zmc2V0KCksCisgICAgICAgICAgICAgICBtYi0+cmFuZ2VfbGVuZ3RoKCkpOworICAgIH0KKworICAgIGlmIChhdWRpbyAmJiBtQXVkaW9Jc1ZvcmJpcykgeworICAgICAgICBpbnQzMl90IG51bVBhZ2VTYW1wbGVzOworICAgICAgICBpZiAoIW1iLT5tZXRhX2RhdGEoKS5maW5kSW50MzIoa0tleVZhbGlkU2FtcGxlcywgJm51bVBhZ2VTYW1wbGVzKSkgeworICAgICAgICAgICAgbnVtUGFnZVNhbXBsZXMgPSAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQ4X3QqIGFiRW5kID0gYWItPmRhdGEoKSArIG1iLT5yYW5nZV9sZW5ndGgoKTsKKyAgICAgICAgbWVtY3B5KGFiRW5kLCAmbnVtUGFnZVNhbXBsZXMsIHNpemVvZihudW1QYWdlU2FtcGxlcykpOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBtZXRhID0gYWItPm1ldGEoKTsKKworICAgIGludDY0X3QgdGltZVVzOworICAgIENIRUNLKG1iLT5tZXRhX2RhdGEoKS5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKKyAgICBtZXRhLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKKworICAgIGlmICh0cmFja1R5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9WSURFTykgeworICAgICAgICBpbnQzMl90IGxheWVySWQ7CisgICAgICAgIGlmIChtYi0+bWV0YV9kYXRhKCkuZmluZEludDMyKGtLZXlUZW1wb3JhbExheWVySWQsICZsYXllcklkKSkgeworICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoInRlbXBvcmFsLWxheWVyLWlkIiwgbGF5ZXJJZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodHJhY2tUeXBlID09IE1FRElBX1RSQUNLX1RZUEVfVElNRURURVhUKSB7CisgICAgICAgIEFTdHJpbmcgbWltZTsKKyAgICAgICAgc3A8QU1lZGlhRXh0cmFjdG9yV3JhcHBlcj4gZXh0cmFjdG9yID0gbVRpbWVkVGV4dFRyYWNrLm1FeHRyYWN0b3I7CisgICAgICAgIHNpemVfdCB0cmFja0luZGV4ID0gbVRpbWVkVGV4dFRyYWNrLm1JbmRleDsKKyAgICAgICAgQ0hFQ0soZXh0cmFjdG9yICE9IE5VTEwKKyAgICAgICAgICAgICAgICAmJiBleHRyYWN0b3ItPmdldFRyYWNrRm9ybWF0KHRyYWNrSW5kZXgpLT5nZXRTdHJpbmcoQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSkpOworICAgICAgICBtZXRhLT5zZXRTdHJpbmcoIm1pbWUiLCBtaW1lLmNfc3RyKCkpOworICAgIH0KKworICAgIGludDY0X3QgZHVyYXRpb25VczsKKyAgICBpZiAobWItPm1ldGFfZGF0YSgpLmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvblVzKSkgeworICAgICAgICBtZXRhLT5zZXRJbnQ2NCgiZHVyYXRpb25VcyIsIGR1cmF0aW9uVXMpOworICAgIH0KKworICAgIGlmICh0cmFja1R5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRSkgeworICAgICAgICBtZXRhLT5zZXRJbnQzMihBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lOREVYLCBtU3VidGl0bGVUcmFjay5tSW5kZXgpOworICAgIH0KKworICAgIHVpbnQzMl90IGRhdGFUeXBlOyAvLyB1bnVzZWQKKyAgICBjb25zdCB2b2lkICpzZWlEYXRhOworICAgIHNpemVfdCBzZWlMZW5ndGg7CisgICAgaWYgKG1iLT5tZXRhX2RhdGEoKS5maW5kRGF0YShrS2V5U0VJLCAmZGF0YVR5cGUsICZzZWlEYXRhLCAmc2VpTGVuZ3RoKSkgeworICAgICAgICBzcDxBQnVmZmVyPiBzZWkgPSBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoc2VpRGF0YSwgc2VpTGVuZ3RoKTs7CisgICAgICAgIG1ldGEtPnNldEJ1ZmZlcigic2VpIiwgc2VpKTsKKyAgICB9CisKKyAgICBjb25zdCB2b2lkICptcGVnVXNlckRhdGFQb2ludGVyOworICAgIHNpemVfdCBtcGVnVXNlckRhdGFMZW5ndGg7CisgICAgaWYgKG1iLT5tZXRhX2RhdGEoKS5maW5kRGF0YSgKKyAgICAgICAgICAgIGtLZXlNcGVnVXNlckRhdGEsICZkYXRhVHlwZSwgJm1wZWdVc2VyRGF0YVBvaW50ZXIsICZtcGVnVXNlckRhdGFMZW5ndGgpKSB7CisgICAgICAgIHNwPEFCdWZmZXI+IG1wZWdVc2VyRGF0YSA9IEFCdWZmZXI6OkNyZWF0ZUFzQ29weShtcGVnVXNlckRhdGFQb2ludGVyLCBtcGVnVXNlckRhdGFMZW5ndGgpOworICAgICAgICBtZXRhLT5zZXRCdWZmZXIoQU1FRElBRk9STUFUX0tFWV9NUEVHX1VTRVJfREFUQSwgbXBlZ1VzZXJEYXRhKTsKKyAgICB9CisKKyAgICBtYi0+cmVsZWFzZSgpOworICAgIG1iID0gTlVMTDsKKworICAgIHJldHVybiBhYjsKK30KKworaW50MzJfdCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpnZXREYXRhR2VuZXJhdGlvbihtZWRpYV90cmFja190eXBlIHR5cGUpIGNvbnN0IHsKKyAgICBpbnQzMl90IGdlbmVyYXRpb24gPSAtMTsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIE1FRElBX1RSQUNLX1RZUEVfVklERU86CisgICAgICAgIGdlbmVyYXRpb24gPSBtVmlkZW9EYXRhR2VuZXJhdGlvbjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNRURJQV9UUkFDS19UWVBFX0FVRElPOgorICAgICAgICBnZW5lcmF0aW9uID0gbUF1ZGlvRGF0YUdlbmVyYXRpb247CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUVESUFfVFJBQ0tfVFlQRV9USU1FRFRFWFQ6CisgICAgICAgIGdlbmVyYXRpb24gPSBtRmV0Y2hUaW1lZFRleHREYXRhR2VuZXJhdGlvbjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFOgorICAgICAgICBnZW5lcmF0aW9uID0gbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGdlbmVyYXRpb247Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6cG9zdFJlYWRCdWZmZXIobWVkaWFfdHJhY2tfdHlwZSB0cmFja1R5cGUpIHsKKyAgICBpZiAoKG1QZW5kaW5nUmVhZEJ1ZmZlclR5cGVzICYgKDEgPDwgdHJhY2tUeXBlKSkgPT0gMCkgeworICAgICAgICBtUGVuZGluZ1JlYWRCdWZmZXJUeXBlcyB8PSAoMSA8PCB0cmFja1R5cGUpOworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVhZEJ1ZmZlciwgdGhpcyk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoInRyYWNrVHlwZSIsIHRyYWNrVHlwZSk7CisgICAgICAgIG1zZy0+cG9zdCgpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpvblJlYWRCdWZmZXIoY29uc3Qgc3A8QU1lc3NhZ2U+JiBtc2cpIHsKKyAgICBpbnQzMl90IHRtcFR5cGU7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInRyYWNrVHlwZSIsICZ0bXBUeXBlKSk7CisgICAgbWVkaWFfdHJhY2tfdHlwZSB0cmFja1R5cGUgPSAobWVkaWFfdHJhY2tfdHlwZSl0bXBUeXBlOworICAgIG1QZW5kaW5nUmVhZEJ1ZmZlclR5cGVzICY9IH4oMSA8PCB0cmFja1R5cGUpOworICAgIHJlYWRCdWZmZXIodHJhY2tUeXBlKTsKK30KKwordm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpyZWFkQnVmZmVyKAorICAgICAgICBtZWRpYV90cmFja190eXBlIHRyYWNrVHlwZSwgaW50NjRfdCBzZWVrVGltZVVzLCBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlLAorICAgICAgICBpbnQ2NF90ICphY3R1YWxUaW1lVXMsIGJvb2wgZm9ybWF0Q2hhbmdlKSB7CisgICAgVHJhY2sgKnRyYWNrOworICAgIHNpemVfdCBtYXhCdWZmZXJzID0gMTsKKyAgICBzd2l0Y2ggKHRyYWNrVHlwZSkgeworICAgICAgICBjYXNlIE1FRElBX1RSQUNLX1RZUEVfVklERU86CisgICAgICAgICAgICB0cmFjayA9ICZtVmlkZW9UcmFjazsKKyAgICAgICAgICAgIG1heEJ1ZmZlcnMgPSA4OyAgLy8gdG9vIGxhcmdlIG9mIGEgbnVtYmVyIG1heSBpbmZsdWVuY2Ugc2Vla3MKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1FRElBX1RSQUNLX1RZUEVfQVVESU86CisgICAgICAgICAgICB0cmFjayA9ICZtQXVkaW9UcmFjazsKKyAgICAgICAgICAgIG1heEJ1ZmZlcnMgPSA2NDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEU6CisgICAgICAgICAgICB0cmFjayA9ICZtU3VidGl0bGVUcmFjazsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1FRElBX1RSQUNLX1RZUEVfVElNRURURVhUOgorICAgICAgICAgICAgdHJhY2sgPSAmbVRpbWVkVGV4dFRyYWNrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBUUkVTUEFTUygpOworICAgIH0KKworICAgIGlmICh0cmFjay0+bUV4dHJhY3RvciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoYWN0dWFsVGltZVVzKSB7CisgICAgICAgICphY3R1YWxUaW1lVXMgPSBzZWVrVGltZVVzOworICAgIH0KKworCisgICAgYm9vbCBzZWVraW5nID0gZmFsc2U7CisgICAgc3A8QU1lZGlhRXh0cmFjdG9yV3JhcHBlcj4gZXh0cmFjdG9yID0gdHJhY2stPm1FeHRyYWN0b3I7CisgICAgaWYgKHNlZWtUaW1lVXMgPj0gMCkgeworICAgICAgICBleHRyYWN0b3ItPnNlZWtUbyhzZWVrVGltZVVzLCBtb2RlKTsKKyAgICAgICAgc2Vla2luZyA9IHRydWU7CisgICAgfQorCisgICAgaW50MzJfdCBnZW5lcmF0aW9uID0gZ2V0RGF0YUdlbmVyYXRpb24odHJhY2tUeXBlKTsKKyAgICBmb3IgKHNpemVfdCBudW1CdWZmZXJzID0gMDsgbnVtQnVmZmVycyA8IG1heEJ1ZmZlcnM7ICkgeworICAgICAgICBWZWN0b3I8c3A8QUJ1ZmZlcj4gPiBhQnVmZmVyczsKKworICAgICAgICBtTG9jay51bmxvY2soKTsKKworICAgICAgICBzcDxBTWVkaWFGb3JtYXRXcmFwcGVyPiBmb3JtYXQ7CisgICAgICAgIHNzaXplX3Qgc2FtcGxlU2l6ZSA9IC0xOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBleHRyYWN0b3ItPmdldFNhbXBsZUZvcm1hdChmb3JtYXQpOworICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICBzYW1wbGVTaXplID0gZXh0cmFjdG9yLT5nZXRTYW1wbGVTaXplKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXJyICE9IE9LIHx8IHNhbXBsZVNpemUgPCAwKSB7CisgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgICAgICB0cmFjay0+bVBhY2tldHMtPnNpZ25hbEVPUyhlcnIgIT0gT0sgPyBlcnIgOiBFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc3A8QUJ1ZmZlcj4gYWJ1ZiA9IG5ldyBBQnVmZmVyKHNhbXBsZVNpemUpOworICAgICAgICBzYW1wbGVTaXplID0gZXh0cmFjdG9yLT5yZWFkU2FtcGxlRGF0YShhYnVmKTsKKyAgICAgICAgbUxvY2subG9jaygpOworCisgICAgICAgIC8vIGluIGNhc2UgdHJhY2sgaGFzIGJlZW4gY2hhbmdlZCBzaW5jZSB3ZSBkb24ndCBoYXZlIGxvY2sgZm9yIHNvbWUgdGltZS4KKyAgICAgICAgaWYgKGdlbmVyYXRpb24gIT0gZ2V0RGF0YUdlbmVyYXRpb24odHJhY2tUeXBlKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpbnQ2NF90IHRpbWVVcyA9IGV4dHJhY3Rvci0+Z2V0U2FtcGxlVGltZSgpOworICAgICAgICBpZiAodGltZVVzIDwgMCkgeworICAgICAgICAgICAgdHJhY2stPm1QYWNrZXRzLT5zaWduYWxFT1MoRVJST1JfTUFMRk9STUVEKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1ldGEgPSBhYnVmLT5tZXRhKCk7CisgICAgICAgIGZvcm1hdC0+d3JpdGVUb0FNZXNzYWdlKG1ldGEpOworICAgICAgICBtZXRhLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKKyAgICAgICAgaWYgKHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX0FVRElPKSB7CisgICAgICAgICAgICBtQXVkaW9UaW1lVXMgPSB0aW1lVXM7CisgICAgICAgIH0gZWxzZSBpZiAodHJhY2tUeXBlID09IE1FRElBX1RSQUNLX1RZUEVfVklERU8pIHsKKyAgICAgICAgICAgIG1WaWRlb1RpbWVVcyA9IHRpbWVVczsKKyAgICAgICAgfQorCisgICAgICAgIHF1ZXVlRGlzY29udGludWl0eUlmTmVlZGVkKHNlZWtpbmcsIGZvcm1hdENoYW5nZSwgdHJhY2tUeXBlLCB0cmFjayk7CisKKyAgICAgICAgaWYgKG51bUJ1ZmZlcnMgPT0gMCAmJiBhY3R1YWxUaW1lVXMgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgKmFjdHVhbFRpbWVVcyA9IHRpbWVVczsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2Vla2luZykgeworICAgICAgICAgICAgaWYgKG1ldGEgIT0gbnVsbHB0ciAmJiBtb2RlID09IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX0NMT1NFU1QKKyAgICAgICAgICAgICAgICAgICAgJiYgc2Vla1RpbWVVcyA+IHRpbWVVcykgeworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBleHRyYSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgICAgICBleHRyYS0+c2V0SW50NjQoInJlc3VtZS1hdC1tZWRpYVRpbWVVcyIsIHNlZWtUaW1lVXMpOworICAgICAgICAgICAgICAgIG1ldGEtPnNldE1lc3NhZ2UoImV4dHJhIiwgZXh0cmEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdHJhY2stPm1QYWNrZXRzLT5xdWV1ZUFjY2Vzc1VuaXQoYWJ1Zik7CisgICAgICAgIGZvcm1hdENoYW5nZSA9IGZhbHNlOworICAgICAgICBzZWVraW5nID0gZmFsc2U7CisgICAgICAgICsrbnVtQnVmZmVyczsKKyAgICAgICAgZXh0cmFjdG9yLT5hZHZhbmNlKCk7CisKKyAgICB9CisKKyAgICBpZiAobUlzU3RyZWFtaW5nCisgICAgICAgICYmICh0cmFja1R5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9WSURFTyB8fCB0cmFja1R5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9BVURJTykpIHsKKyAgICAgICAgc3RhdHVzX3QgZmluYWxSZXN1bHQ7CisgICAgICAgIGludDY0X3QgZHVyYXRpb25VcyA9IHRyYWNrLT5tUGFja2V0cy0+Z2V0QnVmZmVyZWREdXJhdGlvblVzKCZmaW5hbFJlc3VsdCk7CisKKyAgICAgICAgLy8gVE9ETzogbWF4UmVidWZmZXJpbmdNYXJrTXMgY291bGQgYmUgbGFyZ2VyIHRoYW4KKyAgICAgICAgLy8gbUJ1ZmZlcmluZ1NldHRpbmdzLm1SZXN1bWVQbGF5YmFja01hcmtNcworICAgICAgICBpbnQ2NF90IG1hcmtVcyA9IChtUHJlcGFyaW5nID8gbUJ1ZmZlcmluZ1NldHRpbmdzLm1Jbml0aWFsTWFya01zCisgICAgICAgICAgICA6IG1CdWZmZXJpbmdTZXR0aW5ncy5tUmVzdW1lUGxheWJhY2tNYXJrTXMpICogMTAwMGxsOworICAgICAgICBpZiAoZmluYWxSZXN1bHQgPT0gRVJST1JfRU5EX09GX1NUUkVBTSB8fCBkdXJhdGlvblVzID49IG1hcmtVcykgeworICAgICAgICAgICAgaWYgKG1QcmVwYXJpbmcgfHwgbVNlbnRQYXVzZU9uQnVmZmVyaW5nKSB7CisgICAgICAgICAgICAgICAgVHJhY2sgKmNvdW50ZXJUcmFjayA9CisgICAgICAgICAgICAgICAgICAgICh0cmFja1R5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9WSURFTyA/ICZtQXVkaW9UcmFjayA6ICZtVmlkZW9UcmFjayk7CisgICAgICAgICAgICAgICAgaWYgKGNvdW50ZXJUcmFjay0+bUV4dHJhY3RvciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uVXMgPSBjb3VudGVyVHJhY2stPm1QYWNrZXRzLT5nZXRCdWZmZXJlZER1cmF0aW9uVXMoJmZpbmFsUmVzdWx0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGZpbmFsUmVzdWx0ID09IEVSUk9SX0VORF9PRl9TVFJFQU0gfHwgZHVyYXRpb25VcyA+PSBtYXJrVXMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1QcmVwYXJpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeVByZXBhcmVkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtUHJlcGFyaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kQ2FjaGVTdGF0cygpOworICAgICAgICAgICAgICAgICAgICAgICAgbVNlbnRQYXVzZU9uQnVmZmVyaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gZHVwTm90aWZ5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRSZXN1bWVPbkJ1ZmZlcmluZ0VuZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHBvc3RSZWFkQnVmZmVyKHRyYWNrVHlwZSk7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OnF1ZXVlRGlzY29udGludWl0eUlmTmVlZGVkKAorICAgICAgICBib29sIHNlZWtpbmcsIGJvb2wgZm9ybWF0Q2hhbmdlLCBtZWRpYV90cmFja190eXBlIHRyYWNrVHlwZSwgVHJhY2sgKnRyYWNrKSB7CisgICAgLy8gZm9ybWF0Q2hhbmdlICYmIHNlZWtpbmc6IHRyYWNrIHdob3NlIHNvdXJjZSBpcyBjaGFuZ2VkIGR1cmluZyBzZWxlY3Rpb24KKyAgICAvLyBmb3JtYXRDaGFuZ2UgJiYgIXNlZWtpbmc6IHRyYWNrIHdob3NlIHNvdXJjZSBpcyBub3QgY2hhbmdlZCBkdXJpbmcgc2VsZWN0aW9uCisgICAgLy8gIWZvcm1hdENoYW5nZTogbm9ybWFsIHNlZWsKKyAgICBpZiAoKHNlZWtpbmcgfHwgZm9ybWF0Q2hhbmdlKQorICAgICAgICAgICAgJiYgKHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX0FVRElPCisgICAgICAgICAgICB8fCB0cmFja1R5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9WSURFTykpIHsKKyAgICAgICAgQVRTUGFyc2VyOjpEaXNjb250aW51aXR5VHlwZSB0eXBlID0gKGZvcm1hdENoYW5nZSAmJiBzZWVraW5nKQorICAgICAgICAgICAgICAgID8gQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX0ZPUk1BVENIQU5HRQorICAgICAgICAgICAgICAgIDogQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX05PTkU7CisgICAgICAgIHRyYWNrLT5tUGFja2V0cy0+cXVldWVEaXNjb250aW51aXR5KHR5cGUsIE5VTEwgLyogZXh0cmEgKi8sIHRydWUgLyogZGlzY2FyZCAqLyk7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6Om5vdGlmeUJ1ZmZlcmluZ1VwZGF0ZShpbnQzMl90IHBlcmNlbnRhZ2UpIHsKKyAgICAvLyBCdWZmZXJpbmcgcGVyY2VudCBjb3VsZCBnbyBiYWNrd2FyZCBhcyBpdCdzIGVzdGltYXRlZCBmcm9tIHJlbWFpbmluZworICAgIC8vIGRhdGEgYW5kIGxhc3QgYWNjZXNzIHRpbWUuIFRoaXMgY291bGQgY2F1c2UgdGhlIGJ1ZmZlcmluZyBwb3NpdGlvbgorICAgIC8vIGRyYXduIG9uIG1lZGlhIGNvbnRyb2wgdG8gaml0dGVyIHNsaWdodGx5LiBSZW1lbWJlciBwcmV2aW91c2x5IHJlcG9ydGVkCisgICAgLy8gcGVyY2VudGFnZSBhbmQgZG9uJ3QgYWxsb3cgaXQgdG8gZ28gYmFja3dhcmQuCisgICAgaWYgKHBlcmNlbnRhZ2UgPCBtUHJldkJ1ZmZlclBlcmNlbnRhZ2UpIHsKKyAgICAgICAgcGVyY2VudGFnZSA9IG1QcmV2QnVmZmVyUGVyY2VudGFnZTsKKyAgICB9IGVsc2UgaWYgKHBlcmNlbnRhZ2UgPiAxMDApIHsKKyAgICAgICAgcGVyY2VudGFnZSA9IDEwMDsKKyAgICB9CisKKyAgICBtUHJldkJ1ZmZlclBlcmNlbnRhZ2UgPSBwZXJjZW50YWdlOworCisgICAgQUxPR1YoIm5vdGlmeUJ1ZmZlcmluZ1VwZGF0ZTogYnVmZmVyaW5nICVkJSUiLCBwZXJjZW50YWdlKTsKKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRCdWZmZXJpbmdVcGRhdGUpOworICAgIG5vdGlmeS0+c2V0SW50MzIoInBlcmNlbnRhZ2UiLCBwZXJjZW50YWdlKTsKKyAgICBub3RpZnktPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpzY2hlZHVsZVBvbGxCdWZmZXJpbmcoKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFBvbGxCdWZmZXJpbmcsIHRoaXMpOworICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb24pOworICAgIC8vIEVucXVpcmVzIGJ1ZmZlcmluZyBzdGF0dXMgZXZlcnkgc2Vjb25kLgorICAgIG1zZy0+cG9zdCgxMDAwMDAwbGwpOworfQorCit2b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6Om9uUG9sbEJ1ZmZlcmluZygpIHsKKyAgICBzdGF0dXNfdCBmaW5hbFN0YXR1cyA9IFVOS05PV05fRVJST1I7CisgICAgaW50NjRfdCBjYWNoZWREdXJhdGlvblVzID0gLTFsbDsKKyAgICBzc2l6ZV90IGNhY2hlZERhdGFSZW1haW5pbmcgPSAtMTsKKworICAgIGlmIChtQ2FjaGVkU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgY2FjaGVkRGF0YVJlbWFpbmluZyA9IG1DYWNoZWRTb3VyY2UtPmFwcHJveERhdGFSZW1haW5pbmcoJmZpbmFsU3RhdHVzKTsKKworICAgICAgICBpZiAoZmluYWxTdGF0dXMgPT0gT0spIHsKKyAgICAgICAgICAgIG9mZjY0X3Qgc2l6ZTsKKyAgICAgICAgICAgIGludDY0X3QgYml0cmF0ZSA9IDBsbDsKKyAgICAgICAgICAgIGlmIChtRHVyYXRpb25VcyA+IDAgJiYgbUNhY2hlZFNvdXJjZS0+Z2V0U2l6ZSgmc2l6ZSkgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAvLyB8Yml0cmF0ZXwgdXNlcyBiaXRzL3NlY29uZCB1bml0LCB3aGlsZSBzaXplIGlzIG51bWJlciBvZiBieXRlcy4KKyAgICAgICAgICAgICAgICBiaXRyYXRlID0gc2l6ZSAqIDgwMDAwMDBsbCAvIG1EdXJhdGlvblVzOworICAgICAgICAgICAgfSBlbHNlIGlmIChtQml0cmF0ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBiaXRyYXRlID0gbUJpdHJhdGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYml0cmF0ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBjYWNoZWREdXJhdGlvblVzID0gY2FjaGVkRGF0YVJlbWFpbmluZyAqIDgwMDAwMDBsbCAvIGJpdHJhdGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZmluYWxTdGF0dXMgIT0gT0spIHsKKyAgICAgICAgQUxPR1YoIm9uUG9sbEJ1ZmZlcmluZzogRU9TIChmaW5hbFN0YXR1cyA9ICVkKSIsIGZpbmFsU3RhdHVzKTsKKworICAgICAgICBpZiAoZmluYWxTdGF0dXMgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgbm90aWZ5QnVmZmVyaW5nVXBkYXRlKDEwMCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGNhY2hlZER1cmF0aW9uVXMgPj0gMGxsKSB7CisgICAgICAgIGlmIChtRHVyYXRpb25VcyA+IDBsbCkgeworICAgICAgICAgICAgaW50NjRfdCBjYWNoZWRQb3NVcyA9IGdldExhc3RSZWFkUG9zaXRpb24oKSArIGNhY2hlZER1cmF0aW9uVXM7CisgICAgICAgICAgICBpbnQgcGVyY2VudGFnZSA9IDEwMC4wICogY2FjaGVkUG9zVXMgLyBtRHVyYXRpb25VczsKKyAgICAgICAgICAgIGlmIChwZXJjZW50YWdlID4gMTAwKSB7CisgICAgICAgICAgICAgICAgcGVyY2VudGFnZSA9IDEwMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbm90aWZ5QnVmZmVyaW5nVXBkYXRlKHBlcmNlbnRhZ2UpOworICAgICAgICB9CisKKyAgICAgICAgQUxPR1YoIm9uUG9sbEJ1ZmZlcmluZzogY2FjaGVkRHVyYXRpb25VcyAlLjFmIHNlYyIsIGNhY2hlZER1cmF0aW9uVXMgLyAxMDAwMDAwLjBmKTsKKyAgICB9CisKKyAgICBzY2hlZHVsZVBvbGxCdWZmZXJpbmcoKTsKK30KKworLy8gTW9kdWxhciBEUk0KK3N0YXR1c190IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OnByZXBhcmVEcm0oCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sCisgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmZHJtU2Vzc2lvbklkLAorICAgICAgICBzcDxBTWVkaWFDcnlwdG9XcmFwcGVyPiAqb3V0Q3J5cHRvKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBTE9HVigicHJlcGFyZURybSIpOworCisgICAgbUlzRHJtUHJvdGVjdGVkID0gZmFsc2U7CisgICAgbUlzRHJtUmVsZWFzZWQgPSBmYWxzZTsKKyAgICBtSXNTZWN1cmUgPSBmYWxzZTsKKworICAgIHN0YXR1c190IHN0YXR1cyA9IE9LOworICAgIHNwPEFNZWRpYUNyeXB0b1dyYXBwZXI+IGNyeXB0byA9CisgICAgICAgIG5ldyBBTWVkaWFDcnlwdG9XcmFwcGVyKHV1aWQsIGRybVNlc3Npb25JZC5hcnJheSgpLCBkcm1TZXNzaW9uSWQuc2l6ZSgpKTsKKyAgICBpZiAoY3J5cHRvID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoInByZXBhcmVEcm06IGZhaWxlZCB0byBjcmVhdGUgY3J5cHRvLiIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgQUxPR1YoInByZXBhcmVEcm06IGNyeXB0byBjcmVhdGVkIGZvciB1dWlkOiAlcyIsCisgICAgICAgICAgICBEcm1VVUlEOjp0b0hleFN0cmluZyh1dWlkKS5zdHJpbmcoKSk7CisKKyAgICAqb3V0Q3J5cHRvID0gY3J5cHRvOworICAgIC8vIGFzIGxvbmcgYSB0aGVyZSBpcyBhbiBhY3RpdmUgY3J5cHRvCisgICAgbUlzRHJtUHJvdGVjdGVkID0gdHJ1ZTsKKworICAgIGlmIChtTWltZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgc3RhdHVzID0gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgQUxPR0UoInByZXBhcmVEcm06IFVuZXhwZWN0ZWQuIE11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgdHJhY2suIHN0YXR1czogJWQiLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIC8vIGZpcnN0IG1pbWUgaW4gdGhpcyBsaXN0IGlzIGVpdGhlciB0aGUgdmlkZW8gdHJhY2ssIG9yIHRoZSBmaXJzdCBhdWRpbyB0cmFjaworICAgIGNvbnN0IGNoYXIgKm1pbWUgPSBtTWltZXNbMF0uc3RyaW5nKCk7CisgICAgbUlzU2VjdXJlID0gY3J5cHRvLT5yZXF1aXJlc1NlY3VyZURlY29kZXJDb21wb25lbnQobWltZSk7CisgICAgQUxPR1YoInByZXBhcmVEcm06IHJlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudCBtaW1lOiAlcyAgaXNTZWN1cmU6ICVkIiwKKyAgICAgICAgICAgIG1pbWUsIG1Jc1NlY3VyZSk7CisKKyAgICAvLyBDaGVja2luZyB0aGUgbWVtYmVyIGZsYWdzIHdoaWxlIGluIHRoZSBsb29wZXIgdG8gc2VuZCBvdXQgdGhlIG5vdGlmaWNhdGlvbi4KKyAgICAvLyBUaGUgbGVnYWN5IG1EZWNyeXB0SGFuZGxlIT1OVUxMIGNoZWNrIChmb3IgRkxBR19QUk9URUNURUQpIGlzIGVxdWl2YWxlbnQgdG8gbUlzRHJtUHJvdGVjdGVkLgorICAgIG5vdGlmeUZsYWdzQ2hhbmdlZCgKKyAgICAgICAgICAgIChtSXNTZWN1cmUgPyBGTEFHX1NFQ1VSRSA6IDApIHwKKyAgICAgICAgICAgIC8vIFNldHRpbmcgInByb3RlY3RlZCBzY3JlZW4iIG9ubHkgZm9yIEwxOiBiLzM4MzkwODM2CisgICAgICAgICAgICAobUlzU2VjdXJlID8gRkxBR19QUk9URUNURUQgOiAwKSB8CisgICAgICAgICAgICBGTEFHX0NBTl9QQVVTRSB8CisgICAgICAgICAgICBGTEFHX0NBTl9TRUVLX0JBQ0tXQVJEIHwKKyAgICAgICAgICAgIEZMQUdfQ0FOX1NFRUtfRk9SV0FSRCB8CisgICAgICAgICAgICBGTEFHX0NBTl9TRUVLKTsKKworICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgQUxPR1YoInByZXBhcmVEcm06IG1DcnlwdG86ICVwIiwgb3V0Q3J5cHRvLT5nZXQoKSk7CisgICAgICAgIEFMT0dEKCJwcmVwYXJlRHJtIHJldDogJWQgIiwgc3RhdHVzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgicHJlcGFyZURybSBlcnI6ICVkIiwgc3RhdHVzKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6cmVsZWFzZURybSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIEFMT0dWKCJyZWxlYXNlRHJtIik7CisKKyAgICBpZiAobUlzRHJtUHJvdGVjdGVkKSB7CisgICAgICAgIG1Jc0RybVByb3RlY3RlZCA9IGZhbHNlOworICAgICAgICAvLyB0byBwcmV2ZW50IHJldHVybmluZyBhbnkgbW9yZSBidWZmZXIgYWZ0ZXIgc3RvcC9yZWxlYXNlRHJtIChiLzM3OTYwMDk2KQorICAgICAgICBtSXNEcm1SZWxlYXNlZCA9IHRydWU7CisgICAgICAgIEFMT0dWKCJyZWxlYXNlRHJtOiBtSXNEcm1Qcm90ZWN0ZWQgaXMgcmVzZXQuIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoInJlbGVhc2VEcm06IG1Jc0RybVByb3RlY3RlZCBpcyBhbHJlYWR5IGZhbHNlLiIpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6Y2hlY2tEcm1JbmZvKCkKK3sKKyAgICAvLyBjbGVhcmluZyB0aGUgZmxhZyBhdCBwcmVwYXJlIGluIGNhc2UgdGhlIHBsYXllciBpcyByZXVzZWQgYWZ0ZXIgc3RvcC9yZWxlYXNlRHJtIHdpdGggdGhlCisgICAgLy8gc2FtZSBzb3VyY2Ugd2l0aG91dCBiZWluZyByZXNldCAoY2FsbGVkIGJ5IHByZXBhcmVBc3luYy9pbml0RnJvbURhdGFTb3VyY2UpCisgICAgbUlzRHJtUmVsZWFzZWQgPSBmYWxzZTsKKworICAgIGlmIChtRXh0cmFjdG9yID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1YoImNoZWNrRHJtSW5mbzogTm8gZXh0cmFjdG9yIik7CisgICAgICAgIHJldHVybiBPSzsgLy8gbGV0dGluZyB0aGUgY2FsbGVyIHJlc3BvbmRzIGFjY29yZGluZ2x5CisgICAgfQorCisgICAgUHNzaEluZm8gKnBzc2hJbmZvID0gbUV4dHJhY3Rvci0+Z2V0UHNzaEluZm8oKTsKKyAgICBpZiAocHNzaEluZm8gPT0gTlVMTCkgeworICAgICAgICBBTE9HVigiY2hlY2tEcm1JbmZvOiBObyBQU1NIIik7CisgICAgICAgIHJldHVybiBPSzsgLy8gc291cmNlIHdpdGhvdXQgRFJNIGluZm8KKyAgICB9CisKKyAgICBzcDxBQnVmZmVyPiBkcm1JbmZvQnVmZmVyID0gTnVQbGF5ZXIyRHJtOjpyZXRyaWV2ZURybUluZm8ocHNzaEluZm8pOworICAgIEFMT0dWKCJjaGVja0RybUluZm86IE1FRElBX0RSTV9JTkZPIFBTU0ggZHJtIGluZm8gc2l6ZTogJWQiLCAoaW50KWRybUluZm9CdWZmZXItPnNpemUoKSk7CisKKyAgICBpZiAoZHJtSW5mb0J1ZmZlci0+c2l6ZSgpID09IDApIHsKKyAgICAgICAgQUxPR0UoImNoZWNrRHJtSW5mbzogVW5leHBlY3RlZCBwYXJjZWwgc2l6ZTogMCIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBub3RpZnlEcm1JbmZvKGRybUluZm9CdWZmZXIpOworCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OnNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKQoreworICAgIC8vQUxPR1YoInNpZ25hbEJ1ZmZlclJldHVybmVkICVwICByZWZDb3VudDogJWQiLCBidWZmZXIsIGJ1ZmZlci0+bG9jYWxSZWZjb3VudCgpKTsKKworICAgIGJ1ZmZlci0+c2V0T2JzZXJ2ZXIoTlVMTCk7CisgICAgYnVmZmVyLT5yZWxlYXNlKCk7IC8vIHRoaXMgbGVhZHMgdG8gZGVsZXRlIHNpbmNlIHRoYXQgdGhlcmUgaXMgbm8gb2JzZXJ2b3IKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvR2VuZXJpY1NvdXJjZTIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvR2VuZXJpY1NvdXJjZTIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmM1MTgyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9HZW5lcmljU291cmNlMi5oCkBAIC0wLDAgKzEsMjU1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEdFTkVSSUNfU09VUkNFMl9IXworCisjZGVmaW5lIEdFTkVSSUNfU09VUkNFMl9IXworCisjaW5jbHVkZSAiTnVQbGF5ZXIyLmgiCisjaW5jbHVkZSAiTnVQbGF5ZXIyU291cmNlLmgiCisKKyNpbmNsdWRlICJBVFNQYXJzZXIuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL21lZGlhcGxheWVyMi5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrV3JhcHBlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIERlY3J5cHRIYW5kbGU7CitzdHJ1Y3QgQW5vdGhlclBhY2tldFNvdXJjZTsKK3N0cnVjdCBBUlRTUENvbnRyb2xsZXI7CitjbGFzcyBEYXRhU291cmNlOworY2xhc3MgSURhdGFTb3VyY2U7CitjbGFzcyBJTWVkaWFTb3VyY2U7CitzdHJ1Y3QgTWVkaWFIVFRQU2VydmljZTsKK3N0cnVjdCBNZWRpYVNvdXJjZTsKK2NsYXNzIE1lZGlhQnVmZmVyOworc3RydWN0IE1lZGlhQ2xvY2s7CitzdHJ1Y3QgTnVDYWNoZWRTb3VyY2UyOworCitzdHJ1Y3QgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMiA6IHB1YmxpYyBOdVBsYXllcjI6OlNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE1lZGlhQnVmZmVyT2JzZXJ2ZXIgLy8gTW9kdWxhciBEUk0KK3sKKyAgICBHZW5lcmljU291cmNlMihjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgdWlkX3QgdWlkLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ2xvY2s+ICZtZWRpYUNsb2NrKTsKKworICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CisKKyAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKKworICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZT4mIGRhdGFTb3VyY2UpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJpbmdTZXR0aW5ncygKKyAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgdm9pZCBwcmVwYXJlQXN5bmMoKTsKKworICAgIHZpcnR1YWwgdm9pZCBzdGFydCgpOworICAgIHZpcnR1YWwgdm9pZCBzdG9wKCk7CisgICAgdmlydHVhbCB2b2lkIHBhdXNlKCk7CisgICAgdmlydHVhbCB2b2lkIHJlc3VtZSgpOworCisgICAgdmlydHVhbCB2b2lkIGRpc2Nvbm5lY3QoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZmVlZE1vcmVUU0RhdGEoKTsKKworICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZpbGVGb3JtYXRNZXRhKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRlcXVldWVBY2Nlc3NVbml0KGJvb2wgYXVkaW8sIHNwPEFCdWZmZXI+ICphY2Nlc3NVbml0KTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RHVyYXRpb24oaW50NjRfdCAqZHVyYXRpb25Vcyk7CisgICAgdmlydHVhbCBzaXplX3QgZ2V0VHJhY2tDb3VudCgpIGNvbnN0OworICAgIHZpcnR1YWwgc3A8QU1lc3NhZ2U+IGdldFRyYWNrSW5mbyhzaXplX3QgdHJhY2tJbmRleCkgY29uc3Q7CisgICAgdmlydHVhbCBzc2l6ZV90IGdldFNlbGVjdGVkVHJhY2sobWVkaWFfdHJhY2tfdHlwZSB0eXBlKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNlbGVjdFRyYWNrKHNpemVfdCB0cmFja0luZGV4LCBib29sIHNlbGVjdCwgaW50NjRfdCB0aW1lVXMpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2Vla1RvKAorICAgICAgICBpbnQ2NF90IHNlZWtUaW1lVXMsCisgICAgICAgIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUgPSBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgYm9vbCBpc1N0cmVhbWluZygpIGNvbnN0OworCisgICAgLy8gTW9kdWxhciBEUk0KKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlRHJtKAorICAgICAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmZHJtU2Vzc2lvbklkLAorICAgICAgICAgICAgc3A8QU1lZGlhQ3J5cHRvV3JhcHBlcj4gKm91dENyeXB0byk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VEcm0oKTsKKworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+R2VuZXJpY1NvdXJjZTIoKTsKKworICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKKyAgICB2aXJ0dWFsIHNwPEFNZXNzYWdlPiBnZXRGb3JtYXQoYm9vbCBhdWRpbyk7CisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0TWV0YShib29sIGF1ZGlvKTsKKworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRQcmVwYXJlQXN5bmMsCisgICAgICAgIGtXaGF0RmV0Y2hTdWJ0aXRsZURhdGEsCisgICAgICAgIGtXaGF0RmV0Y2hUaW1lZFRleHREYXRhLAorICAgICAgICBrV2hhdFNlbmRTdWJ0aXRsZURhdGEsCisgICAgICAgIGtXaGF0U2VuZEdsb2JhbFRpbWVkVGV4dERhdGEsCisgICAgICAgIGtXaGF0U2VuZFRpbWVkVGV4dERhdGEsCisgICAgICAgIGtXaGF0Q2hhbmdlQVZTb3VyY2UsCisgICAgICAgIGtXaGF0UG9sbEJ1ZmZlcmluZywKKyAgICAgICAga1doYXRTZWVrLAorICAgICAgICBrV2hhdFJlYWRCdWZmZXIsCisgICAgICAgIGtXaGF0U3RhcnQsCisgICAgICAgIGtXaGF0UmVzdW1lLAorICAgICAgICBrV2hhdFNlY3VyZURlY29kZXJzSW5zdGFudGlhdGVkLAorICAgIH07CisKKyAgICBzdHJ1Y3QgVHJhY2sgeworICAgICAgICBzaXplX3QgbUluZGV4OworICAgICAgICBzcDxBTWVkaWFFeHRyYWN0b3JXcmFwcGVyPiBtRXh0cmFjdG9yOworICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBtUGFja2V0czsKKyAgICB9OworCisgICAgaW50NjRfdCBtQXVkaW9UaW1lVXM7CisgICAgaW50NjRfdCBtQXVkaW9MYXN0RGVxdWV1ZVRpbWVVczsKKyAgICBpbnQ2NF90IG1WaWRlb1RpbWVVczsKKyAgICBpbnQ2NF90IG1WaWRlb0xhc3REZXF1ZXVlVGltZVVzOworCisgICAgQnVmZmVyaW5nU2V0dGluZ3MgbUJ1ZmZlcmluZ1NldHRpbmdzOworICAgIGludDMyX3QgbVByZXZCdWZmZXJQZXJjZW50YWdlOworICAgIGludDMyX3QgbVBvbGxCdWZmZXJpbmdHZW5lcmF0aW9uOworICAgIGJvb2wgbVNlbnRQYXVzZU9uQnVmZmVyaW5nOworCisgICAgaW50MzJfdCBtQXVkaW9EYXRhR2VuZXJhdGlvbjsKKyAgICBpbnQzMl90IG1WaWRlb0RhdGFHZW5lcmF0aW9uOworICAgIGludDMyX3QgbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbjsKKyAgICBpbnQzMl90IG1GZXRjaFRpbWVkVGV4dERhdGFHZW5lcmF0aW9uOworICAgIGludDY0X3QgbUR1cmF0aW9uVXM7CisgICAgYm9vbCBtQXVkaW9Jc1ZvcmJpczsKKyAgICAvLyBTZWN1cmUgY29kZWMgaXMgcmVxdWlyZWQuCisgICAgYm9vbCBtSXNTZWN1cmU7CisgICAgYm9vbCBtSXNTdHJlYW1pbmc7CisgICAgdWlkX3QgbVVJRDsKKyAgICBjb25zdCBzcDxNZWRpYUNsb2NrPiBtTWVkaWFDbG9jazsKKyAgICBzcDxNZWRpYUhUVFBTZXJ2aWNlPiBtSFRUUFNlcnZpY2U7CisgICAgQVN0cmluZyBtVXJpOworICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1VcmlIZWFkZXJzOworICAgIGludCBtRmQ7CisgICAgaW50NjRfdCBtT2Zmc2V0OworICAgIGludDY0X3QgbUxlbmd0aDsKKworICAgIGJvb2wgbURpc2Nvbm5lY3RlZDsKKyAgICBzcDxEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKKyAgICBzcDxOdUNhY2hlZFNvdXJjZTI+IG1DYWNoZWRTb3VyY2U7CisgICAgc3A8RGF0YVNvdXJjZT4gbUh0dHBTb3VyY2U7CisgICAgc3A8TWV0YURhdGE+IG1GaWxlTWV0YTsKKyAgICBzcDxBTWVkaWFEYXRhU291cmNlV3JhcHBlcj4gbURhdGFTb3VyY2VXcmFwcGVyOworICAgIHNwPEFNZWRpYUV4dHJhY3RvcldyYXBwZXI+IG1FeHRyYWN0b3I7CisgICAgVmVjdG9yPHNwPEFNZWRpYUV4dHJhY3RvcldyYXBwZXI+ID4gbUV4dHJhY3RvcnM7CisgICAgYm9vbCBtU3RhcnRlZDsKKyAgICBib29sIG1QcmVwYXJpbmc7CisgICAgaW50NjRfdCBtQml0cmF0ZTsKKyAgICB1aW50MzJfdCBtUGVuZGluZ1JlYWRCdWZmZXJUeXBlczsKKyAgICBzcDxBQnVmZmVyPiBtR2xvYmFsVGltZWRUZXh0OworCisgICAgVHJhY2sgbVZpZGVvVHJhY2s7CisgICAgVHJhY2sgbUF1ZGlvVHJhY2s7CisgICAgVHJhY2sgbVN1YnRpdGxlVHJhY2s7CisgICAgVHJhY2sgbVRpbWVkVGV4dFRyYWNrOworCisgICAgbXV0YWJsZSBNdXRleCBtTG9jazsKKworICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CisKKyAgICB2b2lkIHJlc2V0RGF0YVNvdXJjZSgpOworCisgICAgc3RhdHVzX3QgaW5pdEZyb21EYXRhU291cmNlKCk7CisgICAgaW50NjRfdCBnZXRMYXN0UmVhZFBvc2l0aW9uKCk7CisKKyAgICB2b2lkIG5vdGlmeVByZXBhcmVkQW5kQ2xlYW51cChzdGF0dXNfdCBlcnIpOworICAgIHZvaWQgb25TZWN1cmVEZWNvZGVyc0luc3RhbnRpYXRlZChzdGF0dXNfdCBlcnIpOworICAgIHZvaWQgZmluaXNoUHJlcGFyZUFzeW5jKCk7CisgICAgc3RhdHVzX3Qgc3RhcnRTb3VyY2VzKCk7CisKKyAgICB2b2lkIG9uU2Vlayhjb25zdCBzcDxBTWVzc2FnZT4mIG1zZyk7CisgICAgc3RhdHVzX3QgZG9TZWVrKGludDY0X3Qgc2Vla1RpbWVVcywgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSk7CisKKyAgICB2b2lkIG9uUHJlcGFyZUFzeW5jKCk7CisKKyAgICB2b2lkIGZldGNoVGV4dERhdGEoCisgICAgICAgICAgICB1aW50MzJfdCB3aGF0LCBtZWRpYV90cmFja190eXBlIHR5cGUsCisgICAgICAgICAgICBpbnQzMl90IGN1ckdlbiwgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4mIHBhY2tldHMsIGNvbnN0IHNwPEFNZXNzYWdlPiYgbXNnKTsKKworICAgIHZvaWQgc2VuZEdsb2JhbFRleHREYXRhKAorICAgICAgICAgICAgdWludDMyX3Qgd2hhdCwKKyAgICAgICAgICAgIGludDMyX3QgY3VyR2VuLCBzcDxBTWVzc2FnZT4gbXNnKTsKKworICAgIHZvaWQgc2VuZFRleHREYXRhKAorICAgICAgICAgICAgdWludDMyX3Qgd2hhdCwgbWVkaWFfdHJhY2tfdHlwZSB0eXBlLAorICAgICAgICAgICAgaW50MzJfdCBjdXJHZW4sIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+JiBwYWNrZXRzLCBjb25zdCBzcDxBTWVzc2FnZT4mIG1zZyk7CisKKyAgICBzcDxBQnVmZmVyPiBtZWRpYUJ1ZmZlclRvQUJ1ZmZlcigKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqbWJ1ZiwKKyAgICAgICAgICAgIG1lZGlhX3RyYWNrX3R5cGUgdHJhY2tUeXBlKTsKKworICAgIHZvaWQgcG9zdFJlYWRCdWZmZXIobWVkaWFfdHJhY2tfdHlwZSB0cmFja1R5cGUpOworICAgIHZvaWQgb25SZWFkQnVmZmVyKGNvbnN0IHNwPEFNZXNzYWdlPiYgbXNnKTsKKyAgICAvLyBXaGVuIHxtb2RlfCBpcyBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19DTE9TRVNULCB0aGUgYnVmZmVyIHJlYWQgc2hhbGwKKyAgICAvLyBpbmNsdWRlIGFuIGl0ZW0gaW5kaWNhdGluZyBza2lwcGluZyByZW5kZXJpbmcgYWxsIGJ1ZmZlcnMgd2l0aCB0aW1lc3RhbXAKKyAgICAvLyBlYXJsaWVyIHRoYW4gfHNlZWtUaW1lVXN8LgorICAgIC8vIEZvciBvdGhlciBtb2RlcywgdGhlIGJ1ZmZlciByZWFkIHdpbGwgbm90IGluY2x1ZGUgdGhlIGl0ZW0gYXMgYWJvdmUgaW4gb3JkZXIKKyAgICAvLyB0byBmYWNpbGl0YXRlIGZhc3Qgc2VlayBvcGVyYXRpb24uCisgICAgdm9pZCByZWFkQnVmZmVyKAorICAgICAgICAgICAgbWVkaWFfdHJhY2tfdHlwZSB0cmFja1R5cGUsCisgICAgICAgICAgICBpbnQ2NF90IHNlZWtUaW1lVXMgPSAtMWxsLAorICAgICAgICAgICAgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSA9IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMsCisgICAgICAgICAgICBpbnQ2NF90ICphY3R1YWxUaW1lVXMgPSBOVUxMLCBib29sIGZvcm1hdENoYW5nZSA9IGZhbHNlKTsKKworICAgIHZvaWQgcXVldWVEaXNjb250aW51aXR5SWZOZWVkZWQoCisgICAgICAgICAgICBib29sIHNlZWtpbmcsIGJvb2wgZm9ybWF0Q2hhbmdlLCBtZWRpYV90cmFja190eXBlIHRyYWNrVHlwZSwgVHJhY2sgKnRyYWNrKTsKKworICAgIHZvaWQgc2NoZWR1bGVQb2xsQnVmZmVyaW5nKCk7CisgICAgdm9pZCBvblBvbGxCdWZmZXJpbmcoKTsKKyAgICB2b2lkIG5vdGlmeUJ1ZmZlcmluZ1VwZGF0ZShpbnQzMl90IHBlcmNlbnRhZ2UpOworCisgICAgdm9pZCBzZW5kQ2FjaGVTdGF0cygpOworCisgICAgc3A8QU1lc3NhZ2U+IGdldEZvcm1hdF9sKGJvb2wgYXVkaW8pOworICAgIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXRNZXRhX2woYm9vbCBhdWRpbyk7CisgICAgaW50MzJfdCBnZXREYXRhR2VuZXJhdGlvbihtZWRpYV90cmFja190eXBlIHR5cGUpIGNvbnN0OworCisgICAgLy8gTW9kdWxhciBEUk0KKyAgICAvLyBUaGUgc291cmNlIGlzIERSTSBwcm90ZWN0ZWQgYW5kIGlzIHByZXBhcmVkIGZvciBEUk0uCisgICAgYm9vbCBtSXNEcm1Qcm90ZWN0ZWQ7CisgICAgLy8gcmVsZWFzZURybSBoYXMgYmVlbiBwcm9jZXNzZWQuCisgICAgYm9vbCBtSXNEcm1SZWxlYXNlZDsKKyAgICBWZWN0b3I8U3RyaW5nOD4gbU1pbWVzOworCisgICAgc3RhdHVzX3QgY2hlY2tEcm1JbmZvKCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhHZW5lcmljU291cmNlMik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEdFTkVSSUNfU09VUkNFMl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9IVFRQTGl2ZVNvdXJjZTIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9IVFRQTGl2ZVNvdXJjZTIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MWNhY2QKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0hUVFBMaXZlU291cmNlMi5jcHAKQEAgLTAsMCArMSw0NDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiSFRUUExpdmVTb3VyY2UyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiSFRUUExpdmVTb3VyY2UyLmgiCisKKyNpbmNsdWRlICJBbm90aGVyUGFja2V0U291cmNlLmgiCisjaW5jbHVkZSAiTGl2ZURhdGFTb3VyY2UuaCIKKworI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUFNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKworLy8gZGVmYXVsdCBidWZmZXIgcHJlcGFyZS9yZWFkeS91bmRlcmZsb3cgbWFya3MKK3N0YXRpYyBjb25zdCBpbnQga1JlYWR5TWFya01zICAgICA9IDUwMDA7ICAvLyA1IHNlY29uZHMKK3N0YXRpYyBjb25zdCBpbnQga1ByZXBhcmVNYXJrTXMgICA9IDE1MDA7ICAvLyAxLjUgc2Vjb25kcworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK051UGxheWVyMjo6SFRUUExpdmVTb3VyY2UyOjpIVFRQTGl2ZVNvdXJjZTIoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAorICAgICAgICBjb25zdCBzcDxNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpCisgICAgOiBTb3VyY2Uobm90aWZ5KSwKKyAgICAgIG1IVFRQU2VydmljZShodHRwU2VydmljZSksCisgICAgICBtVVJMKHVybCksCisgICAgICBtRmxhZ3MoMCksCisgICAgICBtRmluYWxSZXN1bHQoT0spLAorICAgICAgbU9mZnNldCgwKSwKKyAgICAgIG1GZXRjaFN1YnRpdGxlRGF0YUdlbmVyYXRpb24oMCksCisgICAgICBtRmV0Y2hNZXRhRGF0YUdlbmVyYXRpb24oMCksCisgICAgICBtSGFzTWV0YWRhdGEoZmFsc2UpLAorICAgICAgbU1ldGFkYXRhU2VsZWN0ZWQoZmFsc2UpIHsKKyAgICBtQnVmZmVyaW5nU2V0dGluZ3MubUluaXRpYWxNYXJrTXMgPSBrUHJlcGFyZU1hcmtNczsKKyAgICBtQnVmZmVyaW5nU2V0dGluZ3MubVJlc3VtZVBsYXliYWNrTWFya01zID0ga1JlYWR5TWFya01zOworICAgIGlmIChoZWFkZXJzKSB7CisgICAgICAgIG1FeHRyYUhlYWRlcnMgPSAqaGVhZGVyczsKKworICAgICAgICBzc2l6ZV90IGluZGV4ID0KKyAgICAgICAgICAgIG1FeHRyYUhlYWRlcnMuaW5kZXhPZktleShTdHJpbmc4KCJ4LWhpZGUtdXJscy1mcm9tLWxvZyIpKTsKKworICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgbUZsYWdzIHw9IGtGbGFnSW5jb2duaXRvOworCisgICAgICAgICAgICBtRXh0cmFIZWFkZXJzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOworICAgICAgICB9CisgICAgfQorfQorCitOdVBsYXllcjI6OkhUVFBMaXZlU291cmNlMjo6fkhUVFBMaXZlU291cmNlMigpIHsKKyAgICBpZiAobUxpdmVTZXNzaW9uICE9IE5VTEwpIHsKKyAgICAgICAgbUxpdmVTZXNzaW9uLT5kaXNjb25uZWN0KCk7CisKKyAgICAgICAgbUxpdmVMb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKG1MaXZlU2Vzc2lvbi0+aWQoKSk7CisgICAgICAgIG1MaXZlTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihpZCgpKTsKKyAgICAgICAgbUxpdmVMb29wZXItPnN0b3AoKTsKKworICAgICAgICBtTGl2ZVNlc3Npb24uY2xlYXIoKTsKKyAgICAgICAgbUxpdmVMb29wZXIuY2xlYXIoKTsKKyAgICB9Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6SFRUUExpdmVTb3VyY2UyOjpnZXRCdWZmZXJpbmdTZXR0aW5ncygKKyAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgeworICAgICpidWZmZXJpbmcgPSBtQnVmZmVyaW5nU2V0dGluZ3M7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6SFRUUExpdmVTb3VyY2UyOjpzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSB7CisgICAgbUJ1ZmZlcmluZ1NldHRpbmdzID0gYnVmZmVyaW5nOworCisgICAgaWYgKG1MaXZlU2Vzc2lvbiAhPSBOVUxMKSB7CisgICAgICAgIG1MaXZlU2Vzc2lvbi0+c2V0QnVmZmVyaW5nU2V0dGluZ3MobUJ1ZmZlcmluZ1NldHRpbmdzKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpIVFRQTGl2ZVNvdXJjZTI6OnByZXBhcmVBc3luYygpIHsKKyAgICBpZiAobUxpdmVMb29wZXIgPT0gTlVMTCkgeworICAgICAgICBtTGl2ZUxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgICAgICBtTGl2ZUxvb3Blci0+c2V0TmFtZSgiaHR0cCBsaXZlIik7CisgICAgICAgIG1MaXZlTG9vcGVyLT5zdGFydChmYWxzZSwgLyogcnVuT25DYWxsaW5nVGhyZWFkICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGNhbkNhbGxKYXZhICovKTsKKworICAgICAgICBtTGl2ZUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKHRoaXMpOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXNzaW9uTm90aWZ5LCB0aGlzKTsKKworICAgIG1MaXZlU2Vzc2lvbiA9IG5ldyBMaXZlU2Vzc2lvbigKKyAgICAgICAgICAgIG5vdGlmeSwKKyAgICAgICAgICAgIChtRmxhZ3MgJiBrRmxhZ0luY29nbml0bykgPyBMaXZlU2Vzc2lvbjo6a0ZsYWdJbmNvZ25pdG8gOiAwLAorICAgICAgICAgICAgbUhUVFBTZXJ2aWNlKTsKKworICAgIG1MaXZlTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobUxpdmVTZXNzaW9uKTsKKworICAgIG1MaXZlU2Vzc2lvbi0+c2V0QnVmZmVyaW5nU2V0dGluZ3MobUJ1ZmZlcmluZ1NldHRpbmdzKTsKKyAgICBtTGl2ZVNlc3Npb24tPmNvbm5lY3RBc3luYygKKyAgICAgICAgICAgIG1VUkwuY19zdHIoKSwgbUV4dHJhSGVhZGVycy5pc0VtcHR5KCkgPyBOVUxMIDogJm1FeHRyYUhlYWRlcnMpOworfQorCit2b2lkIE51UGxheWVyMjo6SFRUUExpdmVTb3VyY2UyOjpzdGFydCgpIHsKK30KKworc3A8TWV0YURhdGE+IE51UGxheWVyMjo6SFRUUExpdmVTb3VyY2UyOjpnZXRGb3JtYXRNZXRhKGJvb2wgYXVkaW8pIHsKKyAgICBzcDxNZXRhRGF0YT4gbWV0YTsKKyAgICBpZiAobUxpdmVTZXNzaW9uICE9IE5VTEwpIHsKKyAgICAgICAgbUxpdmVTZXNzaW9uLT5nZXRTdHJlYW1Gb3JtYXRNZXRhKAorICAgICAgICAgICAgICAgIGF1ZGlvID8gTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfQVVESU8KKyAgICAgICAgICAgICAgICAgICAgICA6IExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX1ZJREVPLAorICAgICAgICAgICAgICAgICZtZXRhKTsKKyAgICB9CisKKyAgICByZXR1cm4gbWV0YTsKK30KKworc3A8QU1lc3NhZ2U+IE51UGxheWVyMjo6SFRUUExpdmVTb3VyY2UyOjpnZXRGb3JtYXQoYm9vbCBhdWRpbykgeworICAgIHNwPE1ldGFEYXRhPiBtZXRhOworICAgIHN0YXR1c190IGVyciA9IC1FV09VTERCTE9DSzsKKyAgICBpZiAobUxpdmVTZXNzaW9uICE9IE5VTEwpIHsKKyAgICAgICAgZXJyID0gbUxpdmVTZXNzaW9uLT5nZXRTdHJlYW1Gb3JtYXRNZXRhKAorICAgICAgICAgICAgICAgIGF1ZGlvID8gTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfQVVESU8KKyAgICAgICAgICAgICAgICAgICAgICA6IExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX1ZJREVPLAorICAgICAgICAgICAgICAgICZtZXRhKTsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgIGlmIChlcnIgPT0gLUVXT1VMREJMT0NLKSB7CisgICAgICAgIGZvcm1hdCA9IG5ldyBBTWVzc2FnZSgpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJlcnIiLCBlcnIpOworICAgICAgICByZXR1cm4gZm9ybWF0OworICAgIH0KKworICAgIGlmIChlcnIgIT0gT0sgfHwgY29udmVydE1ldGFEYXRhVG9NZXNzYWdlKG1ldGEsICZmb3JtYXQpICE9IE9LKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gZm9ybWF0OworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OkhUVFBMaXZlU291cmNlMjo6ZmVlZE1vcmVUU0RhdGEoKSB7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OkhUVFBMaXZlU291cmNlMjo6ZGVxdWV1ZUFjY2Vzc1VuaXQoCisgICAgICAgIGJvb2wgYXVkaW8sIHNwPEFCdWZmZXI+ICphY2Nlc3NVbml0KSB7CisgICAgcmV0dXJuIG1MaXZlU2Vzc2lvbi0+ZGVxdWV1ZUFjY2Vzc1VuaXQoCisgICAgICAgICAgICBhdWRpbyA/IExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX0FVRElPCisgICAgICAgICAgICAgICAgICA6IExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX1ZJREVPLAorICAgICAgICAgICAgYWNjZXNzVW5pdCk7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6SFRUUExpdmVTb3VyY2UyOjpnZXREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzKSB7CisgICAgcmV0dXJuIG1MaXZlU2Vzc2lvbi0+Z2V0RHVyYXRpb24oZHVyYXRpb25Vcyk7Cit9CisKK3NpemVfdCBOdVBsYXllcjI6OkhUVFBMaXZlU291cmNlMjo6Z2V0VHJhY2tDb3VudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUxpdmVTZXNzaW9uLT5nZXRUcmFja0NvdW50KCk7Cit9CisKK3NwPEFNZXNzYWdlPiBOdVBsYXllcjI6OkhUVFBMaXZlU291cmNlMjo6Z2V0VHJhY2tJbmZvKHNpemVfdCB0cmFja0luZGV4KSBjb25zdCB7CisgICAgcmV0dXJuIG1MaXZlU2Vzc2lvbi0+Z2V0VHJhY2tJbmZvKHRyYWNrSW5kZXgpOworfQorCitzc2l6ZV90IE51UGxheWVyMjo6SFRUUExpdmVTb3VyY2UyOjpnZXRTZWxlY3RlZFRyYWNrKG1lZGlhX3RyYWNrX3R5cGUgdHlwZSkgY29uc3QgeworICAgIGlmIChtTGl2ZVNlc3Npb24gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIGlmICh0eXBlID09IE1FRElBX1RSQUNLX1RZUEVfTUVUQURBVEEpIHsKKyAgICAgICAgLy8gTUVESUFfVFJBQ0tfVFlQRV9NRVRBREFUQSBpcyBhbHdheXMgbGFzdCB0cmFjaworICAgICAgICAvLyBtTWV0YWRhdGFTZWxlY3RlZCBjYW4gb25seSBiZSB0cnVlIHdoZW4gbUhhc01ldGFkYXRhIGlzIHRydWUKKyAgICAgICAgcmV0dXJuIG1NZXRhZGF0YVNlbGVjdGVkID8gKG1MaXZlU2Vzc2lvbi0+Z2V0VHJhY2tDb3VudCgpIC0gMSkgOiAtMTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbUxpdmVTZXNzaW9uLT5nZXRTZWxlY3RlZFRyYWNrKHR5cGUpOworICAgIH0KK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpIVFRQTGl2ZVNvdXJjZTI6OnNlbGVjdFRyYWNrKHNpemVfdCB0cmFja0luZGV4LCBib29sIHNlbGVjdCwgaW50NjRfdCAvKnRpbWVVcyovKSB7CisgICAgaWYgKG1MaXZlU2Vzc2lvbiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICBib29sIHBvc3RGZXRjaE1zZyA9IGZhbHNlLCBpc1N1YiA9IGZhbHNlOworICAgIGlmICghbUhhc01ldGFkYXRhIHx8IHRyYWNrSW5kZXggIT0gbUxpdmVTZXNzaW9uLT5nZXRUcmFja0NvdW50KCkgLSAxKSB7CisgICAgICAgIGVyciA9IG1MaXZlU2Vzc2lvbi0+c2VsZWN0VHJhY2sodHJhY2tJbmRleCwgc2VsZWN0KTsKKyAgICAgICAgcG9zdEZldGNoTXNnID0gc2VsZWN0OworICAgICAgICBpc1N1YiA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gbWV0YWRhdGEgdHJhY2s7IGkuZS4gKG1IYXNNZXRhZGF0YSAmJiB0cmFja0luZGV4ID09IG1MaXZlU2Vzc2lvbi0+Z2V0VHJhY2tDb3VudCgpIC0gMSkKKyAgICAgICAgaWYgKG1NZXRhZGF0YVNlbGVjdGVkICYmICFzZWxlY3QpIHsKKyAgICAgICAgICAgIGVyciA9IE9LOworICAgICAgICB9IGVsc2UgaWYgKCFtTWV0YWRhdGFTZWxlY3RlZCAmJiBzZWxlY3QpIHsKKyAgICAgICAgICAgIHBvc3RGZXRjaE1zZyA9IHRydWU7CisgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVyciA9IEJBRF9WQUxVRTsgLy8gYmVoYXZlIGFzIExpdmVTZXNzaW9uOjpzZWxlY3RUcmFjaworICAgICAgICB9CisKKyAgICAgICAgbU1ldGFkYXRhU2VsZWN0ZWQgPSBzZWxlY3Q7CisgICAgfQorCisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICBpbnQzMl90ICZnZW5lcmF0aW9uID0gaXNTdWIgPyBtRmV0Y2hTdWJ0aXRsZURhdGFHZW5lcmF0aW9uIDogbUZldGNoTWV0YURhdGFHZW5lcmF0aW9uOworICAgICAgICBnZW5lcmF0aW9uKys7CisgICAgICAgIGlmIChwb3N0RmV0Y2hNc2cpIHsKKyAgICAgICAgICAgIGludDMyX3Qgd2hhdCA9IGlzU3ViID8ga1doYXRGZXRjaFN1YnRpdGxlRGF0YSA6IGtXaGF0RmV0Y2hNZXRhRGF0YTsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uod2hhdCwgdGhpcyk7CisgICAgICAgICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgZ2VuZXJhdGlvbik7CisgICAgICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIExpdmVTZXNzaW9uOjpzZWxlY3RUcmFjayByZXR1cm5zIEJBRF9WQUxVRSB3aGVuIHNlbGVjdGluZyB0aGUgY3VycmVudGx5CisgICAgLy8gc2VsZWN0ZWQgdHJhY2ssIG9yIHVuc2VsZWN0aW5nIGEgbm9uLXNlbGVjdGVkIHRyYWNrLiBJbiB0aGlzIGNhc2UgaXQncyBhbgorICAgIC8vIG5vLW9wIHNvIHdlIHJldHVybiBPSy4KKyAgICByZXR1cm4gKGVyciA9PSBPSyB8fCBlcnIgPT0gQkFEX1ZBTFVFKSA/IChzdGF0dXNfdClPSyA6IGVycjsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpIVFRQTGl2ZVNvdXJjZTI6OnNlZWtUbyhpbnQ2NF90IHNlZWtUaW1lVXMsIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUpIHsKKyAgICBpZiAobUxpdmVTZXNzaW9uLT5pc1NlZWthYmxlKCkpIHsKKyAgICAgICAgcmV0dXJuIG1MaXZlU2Vzc2lvbi0+c2Vla1RvKHNlZWtUaW1lVXMsIG1vZGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpIVFRQTGl2ZVNvdXJjZTI6OnBvbGxGb3JSYXdEYXRhKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgaW50MzJfdCBjdXJyZW50R2VuZXJhdGlvbiwKKyAgICAgICAgTGl2ZVNlc3Npb246OlN0cmVhbVR5cGUgZmV0Y2hUeXBlLCBpbnQzMl90IHB1c2hXaGF0KSB7CisKKyAgICBpbnQzMl90IGdlbmVyYXRpb247CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOworCisgICAgaWYgKGdlbmVyYXRpb24gIT0gY3VycmVudEdlbmVyYXRpb24pIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKKyAgICB3aGlsZSAobUxpdmVTZXNzaW9uLT5kZXF1ZXVlQWNjZXNzVW5pdChmZXRjaFR5cGUsICZidWZmZXIpID09IE9LKSB7CisKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOworICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgcHVzaFdoYXQpOworICAgICAgICBub3RpZnktPnNldEJ1ZmZlcigiYnVmZmVyIiwgYnVmZmVyKTsKKworICAgICAgICBpbnQ2NF90IHRpbWVVcywgYmFzZVVzLCBkZWxheVVzOworICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJiYXNlVXMiLCAmYmFzZVVzKSk7CisgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKKyAgICAgICAgZGVsYXlVcyA9IGJhc2VVcyArIHRpbWVVcyAtIEFMb29wZXI6OkdldE5vd1VzKCk7CisKKyAgICAgICAgaWYgKGZldGNoVHlwZSA9PSBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9TVUJUSVRMRVMpIHsKKyAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgICAgICAgICAgbXNnLT5wb3N0KGRlbGF5VXMgPiAwbGwgPyBkZWxheVVzIDogMGxsKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChmZXRjaFR5cGUgPT0gTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfTUVUQURBVEEpIHsKKyAgICAgICAgICAgIGlmIChkZWxheVVzIDwgLTEwMDAwMDBsbCkgeyAvLyAxIHNlY29uZAorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgICAgICAgICAvLyBwdXNoIGFsbCBjdXJyZW50bHkgYXZhaWxhYmxlIG1ldGFkYXRhIGJ1ZmZlcnMgaW4gZWFjaCBpbnZvY2F0aW9uIG9mIHBvbGxGb3JSYXdEYXRhCisgICAgICAgICAgICAvLyBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB0cnkgYWdhaW4gaW4gMSBzZWNvbmQKKyAgICBtc2ctPnBvc3QoMTAwMDAwMGxsKTsKK30KKwordm9pZCBOdVBsYXllcjI6OkhUVFBMaXZlU291cmNlMjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRTZXNzaW9uTm90aWZ5OgorICAgICAgICB7CisgICAgICAgICAgICBvblNlc3Npb25Ob3RpZnkobXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdEZldGNoU3VidGl0bGVEYXRhOgorICAgICAgICB7CisgICAgICAgICAgICBwb2xsRm9yUmF3RGF0YSgKKyAgICAgICAgICAgICAgICAgICAgbXNnLCBtRmV0Y2hTdWJ0aXRsZURhdGFHZW5lcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAvKiBmZXRjaCAqLyBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9TVUJUSVRMRVMsCisgICAgICAgICAgICAgICAgICAgIC8qIHB1c2ggKi8ga1doYXRTdWJ0aXRsZURhdGEpOworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRGZXRjaE1ldGFEYXRhOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIW1NZXRhZGF0YVNlbGVjdGVkKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBvbGxGb3JSYXdEYXRhKAorICAgICAgICAgICAgICAgICAgICBtc2csIG1GZXRjaE1ldGFEYXRhR2VuZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgLyogZmV0Y2ggKi8gTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfTUVUQURBVEEsCisgICAgICAgICAgICAgICAgICAgIC8qIHB1c2ggKi8ga1doYXRUaW1lZE1ldGFEYXRhKTsKKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgU291cmNlOjpvbk1lc3NhZ2VSZWNlaXZlZChtc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6SFRUUExpdmVTb3VyY2UyOjpvblNlc3Npb25Ob3RpZnkoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBpbnQzMl90IHdoYXQ7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoIndoYXQiLCAmd2hhdCkpOworCisgICAgc3dpdGNoICh3aGF0KSB7CisgICAgICAgIGNhc2UgTGl2ZVNlc3Npb246OmtXaGF0UHJlcGFyZWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG5vdGlmeSB0aGUgY3VycmVudCBzaXplIGhlcmUgaWYgd2UgaGF2ZSBpdCwgb3RoZXJ3aXNlIHJlcG9ydCBhbiBpbml0aWFsIHNpemUgb2YgKDAsMCkKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBnZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pOworICAgICAgICAgICAgaW50MzJfdCB3aWR0aDsKKyAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0OworICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSBOVUxMICYmCisgICAgICAgICAgICAgICAgICAgIGZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkgJiYgZm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgbm90aWZ5VmlkZW9TaXplQ2hhbmdlZChmb3JtYXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBub3RpZnlWaWRlb1NpemVDaGFuZ2VkKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICAgICAgICAgIGlmIChtTGl2ZVNlc3Npb24tPmlzU2Vla2FibGUoKSkgeworICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfQ0FOX1BBVVNFOworICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfQ0FOX1NFRUs7CisgICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19DQU5fU0VFS19CQUNLV0FSRDsKKyAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX0NBTl9TRUVLX0ZPUldBUkQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtTGl2ZVNlc3Npb24tPmhhc0R5bmFtaWNEdXJhdGlvbigpKSB7CisgICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19EWU5BTUlDX0RVUkFUSU9OOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBub3RpZnlGbGFnc0NoYW5nZWQoZmxhZ3MpOworCisgICAgICAgICAgICBub3RpZnlQcmVwYXJlZCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIExpdmVTZXNzaW9uOjprV2hhdFByZXBhcmF0aW9uRmFpbGVkOgorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnI7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOworCisgICAgICAgICAgICBub3RpZnlQcmVwYXJlZChlcnIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIExpdmVTZXNzaW9uOjprV2hhdFN0cmVhbXNDaGFuZ2VkOgorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBjaGFuZ2VkTWFzazsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKAorICAgICAgICAgICAgICAgICAgICAgICAgImNoYW5nZWRNYXNrIiwgKGludDMyX3QgKikmY2hhbmdlZE1hc2spKTsKKworICAgICAgICAgICAgYm9vbCBhdWRpbyA9IGNoYW5nZWRNYXNrICYgTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfQVVESU87CisgICAgICAgICAgICBib29sIHZpZGVvID0gY2hhbmdlZE1hc2sgJiBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9WSURFTzsKKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5OworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgicmVwbHkiLCAmcmVwbHkpKTsKKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOworICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0UXVldWVEZWNvZGVyU2h1dGRvd24pOworICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiYXVkaW8iLCBhdWRpbyk7CisgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ2aWRlbyIsIHZpZGVvKTsKKyAgICAgICAgICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgicmVwbHkiLCByZXBseSk7CisgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBMaXZlU2Vzc2lvbjo6a1doYXRCdWZmZXJpbmdTdGFydDoKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOworICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0UGF1c2VPbkJ1ZmZlcmluZ1N0YXJ0KTsKKyAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIExpdmVTZXNzaW9uOjprV2hhdEJ1ZmZlcmluZ0VuZDoKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOworICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0UmVzdW1lT25CdWZmZXJpbmdFbmQpOworICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisKKyAgICAgICAgY2FzZSBMaXZlU2Vzc2lvbjo6a1doYXRCdWZmZXJpbmdVcGRhdGU6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKKyAgICAgICAgICAgIGludDMyX3QgcGVyY2VudGFnZTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJwZXJjZW50YWdlIiwgJnBlcmNlbnRhZ2UpKTsKKyAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEJ1ZmZlcmluZ1VwZGF0ZSk7CisgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJwZXJjZW50YWdlIiwgcGVyY2VudGFnZSk7CisgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBMaXZlU2Vzc2lvbjo6a1doYXRNZXRhZGF0YURldGVjdGVkOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIW1IYXNNZXRhZGF0YSkgeworICAgICAgICAgICAgICAgIG1IYXNNZXRhZGF0YSA9IHRydWU7CisKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gZHVwTm90aWZ5KCk7CisgICAgICAgICAgICAgICAgLy8gbm90aWZpY2F0aW9uIHdpdGhvdXQgYnVmZmVyIHRyaWdnZXJzIE1FRElBMl9JTkZPX01FVEFEQVRBX1VQREFURQorICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFRpbWVkTWV0YURhdGEpOworICAgICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIExpdmVTZXNzaW9uOjprV2hhdEVycm9yOgorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBUUkVTUEFTUygpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9IVFRQTGl2ZVNvdXJjZTIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSFRUUExpdmVTb3VyY2UyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdkMzY1MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSFRUUExpdmVTb3VyY2UyLmgKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBIVFRQX0xJVkVfU09VUkNFMl9IXworCisjZGVmaW5lIEhUVFBfTElWRV9TT1VSQ0UyX0hfCisKKyNpbmNsdWRlICJOdVBsYXllcjIuaCIKKyNpbmNsdWRlICJOdVBsYXllcjJTb3VyY2UuaCIKKworI2luY2x1ZGUgIkxpdmVTZXNzaW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IExpdmVTZXNzaW9uOworCitzdHJ1Y3QgTnVQbGF5ZXIyOjpIVFRQTGl2ZVNvdXJjZTIgOiBwdWJsaWMgTnVQbGF5ZXIyOjpTb3VyY2UgeworICAgIEhUVFBMaXZlU291cmNlMigKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJpbmdTZXR0aW5ncygKKyAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgdm9pZCBwcmVwYXJlQXN5bmMoKTsKKyAgICB2aXJ0dWFsIHZvaWQgc3RhcnQoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVxdWV1ZUFjY2Vzc1VuaXQoYm9vbCBhdWRpbywgc3A8QUJ1ZmZlcj4gKmFjY2Vzc1VuaXQpOworICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdE1ldGEoYm9vbCBhdWRpbyk7CisgICAgdmlydHVhbCBzcDxBTWVzc2FnZT4gZ2V0Rm9ybWF0KGJvb2wgYXVkaW8pOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBmZWVkTW9yZVRTRGF0YSgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RHVyYXRpb24oaW50NjRfdCAqZHVyYXRpb25Vcyk7CisgICAgdmlydHVhbCBzaXplX3QgZ2V0VHJhY2tDb3VudCgpIGNvbnN0OworICAgIHZpcnR1YWwgc3A8QU1lc3NhZ2U+IGdldFRyYWNrSW5mbyhzaXplX3QgdHJhY2tJbmRleCkgY29uc3Q7CisgICAgdmlydHVhbCBzc2l6ZV90IGdldFNlbGVjdGVkVHJhY2sobWVkaWFfdHJhY2tfdHlwZSAvKiB0eXBlICovKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNlbGVjdFRyYWNrKHNpemVfdCB0cmFja0luZGV4LCBib29sIHNlbGVjdCwgaW50NjRfdCB0aW1lVXMpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2Vla1RvKAorICAgICAgICAgICAgaW50NjRfdCBzZWVrVGltZVVzLAorICAgICAgICAgICAgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSA9IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+SFRUUExpdmVTb3VyY2UyKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworCitwcml2YXRlOgorICAgIGVudW0gRmxhZ3MgeworICAgICAgICAvLyBEb24ndCBsb2cgYW55IFVSTHMuCisgICAgICAgIGtGbGFnSW5jb2duaXRvID0gMSwKKyAgICB9OworCisgICAgZW51bSB7CisgICAgICAgIGtXaGF0U2Vzc2lvbk5vdGlmeSwKKyAgICAgICAga1doYXRGZXRjaFN1YnRpdGxlRGF0YSwKKyAgICAgICAga1doYXRGZXRjaE1ldGFEYXRhLAorICAgIH07CisKKyAgICBzcDxNZWRpYUhUVFBTZXJ2aWNlPiBtSFRUUFNlcnZpY2U7CisgICAgQVN0cmluZyBtVVJMOworICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1FeHRyYUhlYWRlcnM7CisgICAgdWludDMyX3QgbUZsYWdzOworICAgIHN0YXR1c190IG1GaW5hbFJlc3VsdDsKKyAgICBvZmY2NF90IG1PZmZzZXQ7CisgICAgc3A8QUxvb3Blcj4gbUxpdmVMb29wZXI7CisgICAgc3A8TGl2ZVNlc3Npb24+IG1MaXZlU2Vzc2lvbjsKKyAgICBpbnQzMl90IG1GZXRjaFN1YnRpdGxlRGF0YUdlbmVyYXRpb247CisgICAgaW50MzJfdCBtRmV0Y2hNZXRhRGF0YUdlbmVyYXRpb247CisgICAgYm9vbCBtSGFzTWV0YWRhdGE7CisgICAgYm9vbCBtTWV0YWRhdGFTZWxlY3RlZDsKKyAgICBCdWZmZXJpbmdTZXR0aW5ncyBtQnVmZmVyaW5nU2V0dGluZ3M7CisKKyAgICB2b2lkIG9uU2Vzc2lvbk5vdGlmeShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCBwb2xsRm9yUmF3RGF0YSgKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBpbnQzMl90IGN1cnJlbnRHZW5lcmF0aW9uLAorICAgICAgICAgICAgTGl2ZVNlc3Npb246OlN0cmVhbVR5cGUgZmV0Y2hUeXBlLCBpbnQzMl90IHB1c2hXaGF0KTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEhUVFBMaXZlU291cmNlMik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEhUVFBfTElWRV9TT1VSQ0UyX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0pXYWtlTG9jay5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0pXYWtlTG9jay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlhMTA3MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSldha2VMb2NrLmNwcApAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJKV2FrZUxvY2siCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJKV2FrZUxvY2suaCIKKworI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPHBvd2VybWFuYWdlci9Qb3dlck1hbmFnZXIuaD4KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vVE9ETzogdXNlIEpBVkEgUG93ZXJNYW5hZ2VyLCBpbnN0ZWFkIG9mIGJpbmRlcgorSldha2VMb2NrOjpKV2FrZUxvY2soKSA6CisgICAgbVBvd2VyTWFuYWdlcihOVUxMKSwKKyAgICBtV2FrZUxvY2tUb2tlbihOVUxMKSwKKyAgICBtV2FrZUxvY2tDb3VudCgwKSwKKyAgICBtRGVhdGhSZWNpcGllbnQobmV3IFBNRGVhdGhSZWNpcGllbnQodGhpcykpIHt9CisKK0pXYWtlTG9jazo6fkpXYWtlTG9jaygpIHsKKyAgICBpZiAobVBvd2VyTWFuYWdlciAhPSBOVUxMKSB7CisgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IElJbnRlcmZhY2U6OmFzQmluZGVyKG1Qb3dlck1hbmFnZXIpOworICAgICAgICBiaW5kZXItPnVubGlua1RvRGVhdGgobURlYXRoUmVjaXBpZW50KTsKKyAgICB9CisgICAgY2xlYXJQb3dlck1hbmFnZXIoKTsKK30KKworYm9vbCBKV2FrZUxvY2s6OmFjcXVpcmUoKSB7CisgICAgaWYgKG1XYWtlTG9ja0NvdW50ID09IDApIHsKKyAgICAgICAgQ0hFQ0sobVdha2VMb2NrVG9rZW4gPT0gTlVMTCk7CisgICAgICAgIGlmIChtUG93ZXJNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgICAgIC8vIHVzZSBjaGVja1NlcnZpY2UoKSB0byBhdm9pZCBibG9ja2luZyBpZiBwb3dlciBzZXJ2aWNlIGlzIG5vdCB1cCB5ZXQKKyAgICAgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9CisgICAgICAgICAgICAgICAgZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmNoZWNrU2VydmljZShTdHJpbmcxNigicG93ZXIiKSk7CisgICAgICAgICAgICBpZiAoYmluZGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiY291bGQgbm90IGdldCB0aGUgcG93ZXIgbWFuYWdlciBzZXJ2aWNlIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1Qb3dlck1hbmFnZXIgPSBpbnRlcmZhY2VfY2FzdDxJUG93ZXJNYW5hZ2VyPihiaW5kZXIpOworICAgICAgICAgICAgICAgIGJpbmRlci0+bGlua1RvRGVhdGgobURlYXRoUmVjaXBpZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobVBvd2VyTWFuYWdlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBuZXcgQkJpbmRlcigpOworICAgICAgICAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtUG93ZXJNYW5hZ2VyLT5hY3F1aXJlV2FrZUxvY2soCisgICAgICAgICAgICAgICAgICAgIFBPV0VSTUFOQUdFUl9QQVJUSUFMX1dBS0VfTE9DSywKKyAgICAgICAgICAgICAgICAgICAgYmluZGVyLCBTdHJpbmcxNigiSldha2VMb2NrIiksIFN0cmluZzE2KCJtZWRpYSIpKTsKKyAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIG1XYWtlTG9ja1Rva2VuID0gYmluZGVyOworICAgICAgICAgICAgICAgIG1XYWtlTG9ja0NvdW50Kys7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBtV2FrZUxvY2tDb3VudCsrOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEpXYWtlTG9jazo6cmVsZWFzZShib29sIGZvcmNlKSB7CisgICAgaWYgKG1XYWtlTG9ja0NvdW50ID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoZm9yY2UpIHsKKyAgICAgICAgLy8gRm9yY2Ugd2FrZWxvY2sgcmVsZWFzZSBiZWxvdyBieSBzZXR0aW5nIHJlZmVyZW5jZSBjb3VudCB0byAxLgorICAgICAgICBtV2FrZUxvY2tDb3VudCA9IDE7CisgICAgfQorICAgIGlmICgtLW1XYWtlTG9ja0NvdW50ID09IDApIHsKKyAgICAgICAgQ0hFQ0sobVdha2VMb2NrVG9rZW4gIT0gTlVMTCk7CisgICAgICAgIGlmIChtUG93ZXJNYW5hZ2VyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgICAgICAgICAgbVBvd2VyTWFuYWdlci0+cmVsZWFzZVdha2VMb2NrKG1XYWtlTG9ja1Rva2VuLCAwIC8qIGZsYWdzICovKTsKKyAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworICAgICAgICB9CisgICAgICAgIG1XYWtlTG9ja1Rva2VuLmNsZWFyKCk7CisgICAgfQorfQorCit2b2lkIEpXYWtlTG9jazo6Y2xlYXJQb3dlck1hbmFnZXIoKSB7CisgICAgcmVsZWFzZSh0cnVlKTsKKyAgICBtUG93ZXJNYW5hZ2VyLmNsZWFyKCk7Cit9CisKK3ZvaWQgSldha2VMb2NrOjpQTURlYXRoUmVjaXBpZW50OjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8gX191bnVzZWQpIHsKKyAgICBpZiAobVdha2VMb2NrICE9IE5VTEwpIHsKKyAgICAgICAgbVdha2VMb2NrLT5jbGVhclBvd2VyTWFuYWdlcigpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSldha2VMb2NrLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0pXYWtlTG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhY2U4N2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0pXYWtlTG9jay5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSl9XQUtFTE9DS19IXworI2RlZmluZSBKX1dBS0VMT0NLX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8cG93ZXJtYW5hZ2VyL0lQb3dlck1hbmFnZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgSldha2VMb2NrIDogcHVibGljIFJlZkJhc2UgeworCitwdWJsaWM6CisgICAgSldha2VMb2NrKCk7CisKKyAgICAvLyBOT1RFOiBhY3F1aXJlIGFuZCByZWxlYXNlIGFyZSBub3QgdGhyZWFkIHNhZmUKKworICAgIC8vIHJldHVybnMgdHJ1ZSBpZiB3YWtlbG9jayB3YXMgYWNxdWlyZWQKKyAgICBib29sIGFjcXVpcmUoKTsKKyAgICB2b2lkIHJlbGVhc2UoYm9vbCBmb3JjZSA9IGZhbHNlKTsKKworICAgIHZpcnR1YWwgfkpXYWtlTG9jaygpOworCitwcml2YXRlOgorICAgIHNwPElQb3dlck1hbmFnZXI+IG1Qb3dlck1hbmFnZXI7CisgICAgc3A8SUJpbmRlcj4gICAgICAgbVdha2VMb2NrVG9rZW47CisgICAgdWludDMyX3QgICAgICAgICAgbVdha2VMb2NrQ291bnQ7CisKKyAgICBjbGFzcyBQTURlYXRoUmVjaXBpZW50IDogcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IFBNRGVhdGhSZWNpcGllbnQoSldha2VMb2NrICp3YWtlTG9jaykgOiBtV2FrZUxvY2sod2FrZUxvY2spIHt9CisgICAgICAgIHZpcnR1YWwgflBNRGVhdGhSZWNpcGllbnQoKSB7fQorCisgICAgICAgIC8vIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50CisgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICZ3aG8pOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgUE1EZWF0aFJlY2lwaWVudChjb25zdCBQTURlYXRoUmVjaXBpZW50Jik7CisgICAgICAgIFBNRGVhdGhSZWNpcGllbnQmIG9wZXJhdG9yPSAoY29uc3QgUE1EZWF0aFJlY2lwaWVudCYpOworCisgICAgICAgIEpXYWtlTG9jayAqbVdha2VMb2NrOworICAgIH07CisKKyAgICBjb25zdCBzcDxQTURlYXRoUmVjaXBpZW50PiBtRGVhdGhSZWNpcGllbnQ7CisKKyAgICB2b2lkIGNsZWFyUG93ZXJNYW5hZ2VyKCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhKV2FrZUxvY2spOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBKX1dBS0VMT0NLX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpjb3B5IHRvIG1lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTk9USUNFIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OT1RJQ0UKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL05PVElDRQpyZW5hbWUgdG8gbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OT1RJQ0UKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjBiNjk4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjIuY3BwCkBAIC0wLDAgKzEsMzExNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJOdVBsYXllcjIiCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJOdVBsYXllcjIuaCIKKworI2luY2x1ZGUgIkhUVFBMaXZlU291cmNlMi5oIgorI2luY2x1ZGUgIk51UGxheWVyMkNDRGVjb2Rlci5oIgorI2luY2x1ZGUgIk51UGxheWVyMkRlY29kZXIuaCIKKyNpbmNsdWRlICJOdVBsYXllcjJEZWNvZGVyQmFzZS5oIgorI2luY2x1ZGUgIk51UGxheWVyMkRlY29kZXJQYXNzVGhyb3VnaC5oIgorI2luY2x1ZGUgIk51UGxheWVyMkRyaXZlci5oIgorI2luY2x1ZGUgIk51UGxheWVyMlJlbmRlcmVyLmgiCisjaW5jbHVkZSAiTnVQbGF5ZXIyU291cmNlLmgiCisjaW5jbHVkZSAiUlRTUFNvdXJjZTIuaCIKKyNpbmNsdWRlICJHZW5lcmljU291cmNlMi5oIgorI2luY2x1ZGUgIlRleHREZXNjcmlwdGlvbnMuaCIKKworI2luY2x1ZGUgIkFUU1BhcnNlci5oIgorCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKworI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaD4KKyNpbmNsdWRlIDxtZWRpYS9BVlN5bmNTZXR0aW5ncy5oPgorI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VEZXNjLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka1dyYXBwZXIuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYXZjX3V0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNsb2NrLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorCisjaW5jbHVkZSAiRVNEUy5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisKKyNpbmNsdWRlIDxzeXN0ZW0vd2luZG93Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIHN0YXR1c190IHNlbmRNZXRhRGF0YVRvSGFsKHNwPE1lZGlhUGxheWVyMkludGVyZmFjZTo6QXVkaW9TaW5rPiYgc2luaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEpIHsKKyAgICBpbnQzMl90IHNhbXBsZVJhdGUgPSAwOworICAgIGludDMyX3QgYml0UmF0ZSA9IDA7CisgICAgaW50MzJfdCBjaGFubmVsTWFzayA9IDA7CisgICAgaW50MzJfdCBkZWxheVNhbXBsZXMgPSAwOworICAgIGludDMyX3QgcGFkZGluZ1NhbXBsZXMgPSAwOworCisgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcigpOworCisgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnNhbXBsZVJhdGUpKSB7CisgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEFVRElPX09GRkxPQURfQ09ERUNfU0FNUExFX1JBVEUpLCBzYW1wbGVSYXRlKTsKKyAgICB9CisgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbE1hc2ssICZjaGFubmVsTWFzaykpIHsKKyAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQVVESU9fT0ZGTE9BRF9DT0RFQ19OVU1fQ0hBTk5FTCksIGNoYW5uZWxNYXNrKTsKKyAgICB9CisgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5Qml0UmF0ZSwgJmJpdFJhdGUpKSB7CisgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEFVRElPX09GRkxPQURfQ09ERUNfQVZHX0JJVF9SQVRFKSwgYml0UmF0ZSk7CisgICAgfQorICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUVuY29kZXJEZWxheSwgJmRlbGF5U2FtcGxlcykpIHsKKyAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQVVESU9fT0ZGTE9BRF9DT0RFQ19ERUxBWV9TQU1QTEVTKSwgZGVsYXlTYW1wbGVzKTsKKyAgICB9CisgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5RW5jb2RlclBhZGRpbmcsICZwYWRkaW5nU2FtcGxlcykpIHsKKyAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQVVESU9fT0ZGTE9BRF9DT0RFQ19QQURESU5HX1NBTVBMRVMpLCBwYWRkaW5nU2FtcGxlcyk7CisgICAgfQorCisgICAgQUxPR1YoInNlbmRNZXRhRGF0YVRvSGFsOiBiaXRSYXRlICVkLCBzYW1wbGVSYXRlICVkLCBjaGFuTWFzayAlZCwiCisgICAgICAgICAgImRlbGF5U2FtcGxlICVkLCBwYWRkaW5nU2FtcGxlICVkIiwgYml0UmF0ZSwgc2FtcGxlUmF0ZSwKKyAgICAgICAgICBjaGFubmVsTWFzaywgZGVsYXlTYW1wbGVzLCBwYWRkaW5nU2FtcGxlcyk7CisKKyAgICBzaW5rLT5zZXRQYXJhbWV0ZXJzKHBhcmFtLnRvU3RyaW5nKCkpOworICAgIHJldHVybiBPSzsKK30KKworCitzdHJ1Y3QgTnVQbGF5ZXIyOjpBY3Rpb24gOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgQWN0aW9uKCkge30KKworICAgIHZpcnR1YWwgdm9pZCBleGVjdXRlKE51UGxheWVyMiAqcGxheWVyKSA9IDA7CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQWN0aW9uKTsKK307CisKK3N0cnVjdCBOdVBsYXllcjI6OlNlZWtBY3Rpb24gOiBwdWJsaWMgQWN0aW9uIHsKKyAgICBleHBsaWNpdCBTZWVrQWN0aW9uKGludDY0X3Qgc2Vla1RpbWVVcywgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSkKKyAgICAgICAgOiBtU2Vla1RpbWVVcyhzZWVrVGltZVVzKSwKKyAgICAgICAgICBtTW9kZShtb2RlKSB7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGV4ZWN1dGUoTnVQbGF5ZXIyICpwbGF5ZXIpIHsKKyAgICAgICAgcGxheWVyLT5wZXJmb3JtU2VlayhtU2Vla1RpbWVVcywgbU1vZGUpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBpbnQ2NF90IG1TZWVrVGltZVVzOworICAgIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1Nb2RlOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2Vla0FjdGlvbik7Cit9OworCitzdHJ1Y3QgTnVQbGF5ZXIyOjpSZXN1bWVEZWNvZGVyQWN0aW9uIDogcHVibGljIEFjdGlvbiB7CisgICAgZXhwbGljaXQgUmVzdW1lRGVjb2RlckFjdGlvbihib29sIG5lZWROb3RpZnkpCisgICAgICAgIDogbU5lZWROb3RpZnkobmVlZE5vdGlmeSkgeworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBleGVjdXRlKE51UGxheWVyMiAqcGxheWVyKSB7CisgICAgICAgIHBsYXllci0+cGVyZm9ybVJlc3VtZURlY29kZXJzKG1OZWVkTm90aWZ5KTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgYm9vbCBtTmVlZE5vdGlmeTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFJlc3VtZURlY29kZXJBY3Rpb24pOworfTsKKworc3RydWN0IE51UGxheWVyMjo6U2V0U3VyZmFjZUFjdGlvbiA6IHB1YmxpYyBBY3Rpb24geworICAgIGV4cGxpY2l0IFNldFN1cmZhY2VBY3Rpb24oY29uc3Qgc3A8QU5hdGl2ZVdpbmRvd1dyYXBwZXI+ICZud3cpCisgICAgICAgIDogbU5hdGl2ZVdpbmRvdyhud3cpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgZXhlY3V0ZShOdVBsYXllcjIgKnBsYXllcikgeworICAgICAgICBwbGF5ZXItPnBlcmZvcm1TZXRTdXJmYWNlKG1OYXRpdmVXaW5kb3cpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzcDxBTmF0aXZlV2luZG93V3JhcHBlcj4gbU5hdGl2ZVdpbmRvdzsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNldFN1cmZhY2VBY3Rpb24pOworfTsKKworc3RydWN0IE51UGxheWVyMjo6Rmx1c2hEZWNvZGVyQWN0aW9uIDogcHVibGljIEFjdGlvbiB7CisgICAgRmx1c2hEZWNvZGVyQWN0aW9uKEZsdXNoQ29tbWFuZCBhdWRpbywgRmx1c2hDb21tYW5kIHZpZGVvKQorICAgICAgICA6IG1BdWRpbyhhdWRpbyksCisgICAgICAgICAgbVZpZGVvKHZpZGVvKSB7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGV4ZWN1dGUoTnVQbGF5ZXIyICpwbGF5ZXIpIHsKKyAgICAgICAgcGxheWVyLT5wZXJmb3JtRGVjb2RlckZsdXNoKG1BdWRpbywgbVZpZGVvKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgRmx1c2hDb21tYW5kIG1BdWRpbzsKKyAgICBGbHVzaENvbW1hbmQgbVZpZGVvOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRmx1c2hEZWNvZGVyQWN0aW9uKTsKK307CisKK3N0cnVjdCBOdVBsYXllcjI6OlBvc3RNZXNzYWdlQWN0aW9uIDogcHVibGljIEFjdGlvbiB7CisgICAgZXhwbGljaXQgUG9zdE1lc3NhZ2VBY3Rpb24oY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpCisgICAgICAgIDogbU1lc3NhZ2UobXNnKSB7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGV4ZWN1dGUoTnVQbGF5ZXIyICopIHsKKyAgICAgICAgbU1lc3NhZ2UtPnBvc3QoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3A8QU1lc3NhZ2U+IG1NZXNzYWdlOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUG9zdE1lc3NhZ2VBY3Rpb24pOworfTsKKworLy8gVXNlIHRoaXMgaWYgdGhlcmUncyBubyBzdGF0ZSBuZWNlc3NhcnkgdG8gc2F2ZSBpbiBvcmRlciB0byBleGVjdXRlCisvLyB0aGUgYWN0aW9uLgorc3RydWN0IE51UGxheWVyMjo6U2ltcGxlQWN0aW9uIDogcHVibGljIEFjdGlvbiB7CisgICAgdHlwZWRlZiB2b2lkIChOdVBsYXllcjI6OipBY3Rpb25GdW5jKSgpOworCisgICAgZXhwbGljaXQgU2ltcGxlQWN0aW9uKEFjdGlvbkZ1bmMgZnVuYykKKyAgICAgICAgOiBtRnVuYyhmdW5jKSB7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGV4ZWN1dGUoTnVQbGF5ZXIyICpwbGF5ZXIpIHsKKyAgICAgICAgKHBsYXllci0+Km1GdW5jKSgpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBBY3Rpb25GdW5jIG1GdW5jOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2ltcGxlQWN0aW9uKTsKK307CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK051UGxheWVyMjo6TnVQbGF5ZXIyKHBpZF90IHBpZCwgdWlkX3QgdWlkLCBjb25zdCBzcDxNZWRpYUNsb2NrPiAmbWVkaWFDbG9jaykKKyAgICA6IG1QSUQocGlkKSwKKyAgICAgIG1VSUQodWlkKSwKKyAgICAgIG1NZWRpYUNsb2NrKG1lZGlhQ2xvY2spLAorICAgICAgbVNvdXJjZUZsYWdzKDApLAorICAgICAgbU9mZmxvYWRBdWRpbyhmYWxzZSksCisgICAgICBtQXVkaW9EZWNvZGVyR2VuZXJhdGlvbigwKSwKKyAgICAgIG1WaWRlb0RlY29kZXJHZW5lcmF0aW9uKDApLAorICAgICAgbVJlbmRlcmVyR2VuZXJhdGlvbigwKSwKKyAgICAgIG1MYXN0U3RhcnRlZFBsYXlpbmdUaW1lTnMoMCksCisgICAgICBtUHJldmlvdXNTZWVrVGltZVVzKDApLAorICAgICAgbUF1ZGlvRU9TKGZhbHNlKSwKKyAgICAgIG1WaWRlb0VPUyhmYWxzZSksCisgICAgICBtU2NhblNvdXJjZXNQZW5kaW5nKGZhbHNlKSwKKyAgICAgIG1TY2FuU291cmNlc0dlbmVyYXRpb24oMCksCisgICAgICBtUG9sbER1cmF0aW9uR2VuZXJhdGlvbigwKSwKKyAgICAgIG1UaW1lZFRleHRHZW5lcmF0aW9uKDApLAorICAgICAgbUZsdXNoaW5nQXVkaW8oTk9ORSksCisgICAgICBtRmx1c2hpbmdWaWRlbyhOT05FKSwKKyAgICAgIG1SZXN1bWVQZW5kaW5nKGZhbHNlKSwKKyAgICAgIG1WaWRlb1NjYWxpbmdNb2RlKE5BVElWRV9XSU5ET1dfU0NBTElOR19NT0RFX1NDQUxFX1RPX1dJTkRPVyksCisgICAgICBtUGxheWJhY2tTZXR0aW5ncyhBVURJT19QTEFZQkFDS19SQVRFX0RFRkFVTFQpLAorICAgICAgbVZpZGVvRnBzSGludCgtMS5mKSwKKyAgICAgIG1TdGFydGVkKGZhbHNlKSwKKyAgICAgIG1QcmVwYXJlZChmYWxzZSksCisgICAgICBtUmVzZXR0aW5nKGZhbHNlKSwKKyAgICAgIG1Tb3VyY2VTdGFydGVkKGZhbHNlKSwKKyAgICAgIG1BdWRpb0RlY29kZXJFcnJvcihmYWxzZSksCisgICAgICBtVmlkZW9EZWNvZGVyRXJyb3IoZmFsc2UpLAorICAgICAgbVBhdXNlZChmYWxzZSksCisgICAgICBtUGF1c2VkQnlDbGllbnQodHJ1ZSksCisgICAgICBtUGF1c2VkRm9yQnVmZmVyaW5nKGZhbHNlKSwKKyAgICAgIG1Jc0RybVByb3RlY3RlZChmYWxzZSksCisgICAgICBtRGF0YVNvdXJjZVR5cGUoREFUQV9TT1VSQ0VfVFlQRV9OT05FKSB7CisgICAgQ0hFQ0sobWVkaWFDbG9jayAhPSBOVUxMKTsKKyAgICBjbGVhckZsdXNoQ29tcGxldGUoKTsKK30KKworTnVQbGF5ZXIyOjp+TnVQbGF5ZXIyKCkgeworfQorCit2b2lkIE51UGxheWVyMjo6c2V0RHJpdmVyKGNvbnN0IHdwPE51UGxheWVyMkRyaXZlcj4gJmRyaXZlcikgeworICAgIG1Ecml2ZXIgPSBkcml2ZXI7Cit9CisKK3N0YXRpYyBib29sIElzSFRUUExpdmVVUkwoY29uc3QgY2hhciAqdXJsKSB7CisgICAgaWYgKCFzdHJuY2FzZWNtcCgiaHR0cDovLyIsIHVybCwgNykKKyAgICAgICAgICAgIHx8ICFzdHJuY2FzZWNtcCgiaHR0cHM6Ly8iLCB1cmwsIDgpCisgICAgICAgICAgICB8fCAhc3RybmNhc2VjbXAoImZpbGU6Ly8iLCB1cmwsIDcpKSB7CisgICAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4odXJsKTsKKyAgICAgICAgaWYgKGxlbiA+PSA1ICYmICFzdHJjYXNlY21wKCIubTN1OCIsICZ1cmxbbGVuIC0gNV0pKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdHJzdHIodXJsLCJtM3U4IikpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OmNyZWF0ZU51UGxheWVyMlNvdXJjZShjb25zdCBzcDxEYXRhU291cmNlRGVzYz4gJmRzZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPFNvdXJjZT4gKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEFfU09VUkNFX1RZUEUgKmRhdGFTb3VyY2VUeXBlKSB7CisgICAgc3RhdHVzX3QgZXJyID0gTk9fRVJST1I7CisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFNvdXJjZU5vdGlmeSwgdGhpcyk7CisgICAgbm90aWZ5LT5zZXRJbnQ2NCgic3JjSWQiLCBkc2QtPm1JZCk7CisKKyAgICBzd2l0Y2ggKGRzZC0+bVR5cGUpIHsKKyAgICAgICAgY2FzZSBEYXRhU291cmNlRGVzYzo6VFlQRV9VUkw6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCA9IGRzZC0+bVVybC5jX3N0cigpOworICAgICAgICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbih1cmwpOworCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UgPSBkc2QtPm1IdHRwU2VydmljZTsKKyAgICAgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gJihkc2QtPm1IZWFkZXJzKTsKKworICAgICAgICAgICAgaWYgKElzSFRUUExpdmVVUkwodXJsKSkgeworICAgICAgICAgICAgICAgICpzb3VyY2UgPSBuZXcgSFRUUExpdmVTb3VyY2UyKG5vdGlmeSwgaHR0cFNlcnZpY2UsIHVybCwgaGVhZGVycyk7CisgICAgICAgICAgICAgICAgQUxPR1YoImNyZWF0ZU51UGxheWVyMlNvdXJjZSBIVFRQTGl2ZVNvdXJjZTIgJXMiLCB1cmwpOworICAgICAgICAgICAgICAgICpkYXRhU291cmNlVHlwZSA9IERBVEFfU09VUkNFX1RZUEVfSFRUUF9MSVZFOworICAgICAgICAgICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAodXJsLCAicnRzcDovLyIsIDcpKSB7CisgICAgICAgICAgICAgICAgKnNvdXJjZSA9IG5ldyBSVFNQU291cmNlMigKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeSwgaHR0cFNlcnZpY2UsIHVybCwgaGVhZGVycywgbVVJRCk7CisgICAgICAgICAgICAgICAgQUxPR1YoImNyZWF0ZU51UGxheWVyMlNvdXJjZSBSVFNQU291cmNlMiAlcyIsIHVybCk7CisgICAgICAgICAgICAgICAgKmRhdGFTb3VyY2VUeXBlID0gREFUQV9TT1VSQ0VfVFlQRV9SVFNQOworICAgICAgICAgICAgfSBlbHNlIGlmICgoIXN0cm5jYXNlY21wKHVybCwgImh0dHA6Ly8iLCA3KQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgIXN0cm5jYXNlY21wKHVybCwgImh0dHBzOi8vIiwgOCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKChsZW4gPj0gNCAmJiAhc3RyY2FzZWNtcCgiLnNkcCIsICZ1cmxbbGVuIC0gNF0pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHN0cnN0cih1cmwsICIuc2RwPyIpKSkgeworICAgICAgICAgICAgICAgICpzb3VyY2UgPSBuZXcgUlRTUFNvdXJjZTIoCisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnksIGh0dHBTZXJ2aWNlLCB1cmwsIGhlYWRlcnMsIG1VSUQsIHRydWUpOworICAgICAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVOdVBsYXllcjJTb3VyY2UgUlRTUFNvdXJjZTIgaHR0cC9odHRwcy8uc2RwICVzIiwgdXJsKTsKKyAgICAgICAgICAgICAgICAqZGF0YVNvdXJjZVR5cGUgPSBEQVRBX1NPVVJDRV9UWVBFX1JUU1A7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVOdVBsYXllcjJTb3VyY2UgR2VuZXJpY1NvdXJjZTIgJXMiLCB1cmwpOworCisgICAgICAgICAgICAgICAgc3A8R2VuZXJpY1NvdXJjZTI+IGdlbmVyaWNTb3VyY2UgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEdlbmVyaWNTb3VyY2UyKG5vdGlmeSwgbVVJRCwgbU1lZGlhQ2xvY2spOworCisgICAgICAgICAgICAgICAgZXJyID0gZ2VuZXJpY1NvdXJjZS0+c2V0RGF0YVNvdXJjZShodHRwU2VydmljZSwgdXJsLCBoZWFkZXJzKTsKKworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgKnNvdXJjZSA9IGdlbmVyaWNTb3VyY2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgKnNvdXJjZSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIE51UGxheWVyMlNvdXJjZSEiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyByZWdhcmRsZXNzIG9mIHN1Y2Nlc3MvZmFpbHVyZQorICAgICAgICAgICAgICAgICpkYXRhU291cmNlVHlwZSA9IERBVEFfU09VUkNFX1RZUEVfR0VORVJJQ19VUkw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRGF0YVNvdXJjZURlc2M6OlRZUEVfRkQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEdlbmVyaWNTb3VyY2UyPiBnZW5lcmljU291cmNlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IEdlbmVyaWNTb3VyY2UyKG5vdGlmeSwgbVVJRCwgbU1lZGlhQ2xvY2spOworCisgICAgICAgICAgICBBTE9HVigiY3JlYXRlTnVQbGF5ZXIyU291cmNlIGZkICVkLyVsbGQvJWxsZCBzb3VyY2U6ICVwIiwKKyAgICAgICAgICAgICAgICAgIGRzZC0+bUZELCAobG9uZyBsb25nKWRzZC0+bUZET2Zmc2V0LCAobG9uZyBsb25nKWRzZC0+bUZETGVuZ3RoLAorICAgICAgICAgICAgICAgICAgZ2VuZXJpY1NvdXJjZS5nZXQoKSk7CisKKyAgICAgICAgICAgIGVyciA9IGdlbmVyaWNTb3VyY2UtPnNldERhdGFTb3VyY2UoZHNkLT5tRkQsIGRzZC0+bUZET2Zmc2V0LCBkc2QtPm1GRExlbmd0aCk7CisKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBOdVBsYXllcjJTb3VyY2UhIik7CisgICAgICAgICAgICAgICAgKnNvdXJjZSA9IE5VTEw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICpzb3VyY2UgPSBnZW5lcmljU291cmNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAqZGF0YVNvdXJjZVR5cGUgPSBEQVRBX1NPVVJDRV9UWVBFX0dFTkVSSUNfRkQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRGF0YVNvdXJjZURlc2M6OlRZUEVfQ0FMTEJBQ0s6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEdlbmVyaWNTb3VyY2UyPiBnZW5lcmljU291cmNlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IEdlbmVyaWNTb3VyY2UyKG5vdGlmeSwgbVVJRCwgbU1lZGlhQ2xvY2spOworICAgICAgICAgICAgZXJyID0gZ2VuZXJpY1NvdXJjZS0+c2V0RGF0YVNvdXJjZShkc2QtPm1DYWxsYmFja1NvdXJjZSk7CisKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBOdVBsYXllcjJTb3VyY2UhIik7CisgICAgICAgICAgICAgICAgKnNvdXJjZSA9IE5VTEw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICpzb3VyY2UgPSBnZW5lcmljU291cmNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAqZGF0YVNvdXJjZVR5cGUgPSBEQVRBX1NPVVJDRV9UWVBFX01FRElBOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZXJyID0gQkFEX1RZUEU7CisgICAgICAgICAgICAqc291cmNlID0gTlVMTDsKKyAgICAgICAgICAgICpkYXRhU291cmNlVHlwZSA9IERBVEFfU09VUkNFX1RZUEVfTk9ORTsKKyAgICAgICAgICAgIEFMT0dFKCJpbnZhbGlkIGRhdGEgc291cmNlIHR5cGUhIik7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCit2b2lkIE51UGxheWVyMjo6c2V0RGF0YVNvdXJjZUFzeW5jKGNvbnN0IHNwPERhdGFTb3VyY2VEZXNjPiAmZHNkKSB7CisgICAgREFUQV9TT1VSQ0VfVFlQRSBkYXRhU291cmNlVHlwZTsKKyAgICBzcDxTb3VyY2U+IHNvdXJjZTsKKyAgICBjcmVhdGVOdVBsYXllcjJTb3VyY2UoZHNkLCAmc291cmNlLCAmZGF0YVNvdXJjZVR5cGUpOworCisgICAgLy8gVE9ETzogY3VycmVudGx5IE51UGxheWVyMkRyaXZlciBtYWtlcyBibG9ja2luZyBjYWxsIHRvIHNldERhdGFTb3VyY2VBc3luYworICAgIC8vIGFuZCBleHBlY3RzIG5vdGlmeVNldERhdGFTb3VyY2VDb21wbGV0ZWQgcmVnYXJkbGVzcyBvZiBzdWNjZXNzIG9yIGZhaWx1cmUuCisgICAgLy8gVGhpcyB3aWxsIGJlIGNoYW5nZWQgc2luY2Ugc2V0RGF0YVNvdXJjZSBzaG91bGQgYmUgYXN5bmNocm9ub3VzIGF0IEpBVkEgbGV2ZWwuCisgICAgLy8gV2hlbiBpdCBzdWNjZWVkcywgYXBwIHdpbGwgZ2V0IG9uSW5mbyBub3RpZmljYXRpb24uIE90aGVyd2lzZSwgb25FcnJvcgorICAgIC8vIHdpbGwgYmUgY2FsbGVkLgorICAgIC8qCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBub3RpZnlMaXN0ZW5lcihkc2QtPm1JZCwgTUVESUEyX0VSUk9SLCBNRURJQTJfRVJST1JfRkFJTEVEX1RPX1NFVF9EQVRBX1NPVVJDRSwgZXJyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIE5vdywgc291cmNlICE9IE5VTEwuCisgICAgKi8KKworICAgIG1EYXRhU291cmNlVHlwZSA9IGRhdGFTb3VyY2VUeXBlOworCisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldERhdGFTb3VyY2UsIHRoaXMpOworICAgIG1zZy0+c2V0T2JqZWN0KCJzb3VyY2UiLCBzb3VyY2UpOworICAgIG1zZy0+c2V0SW50NjQoInNyY0lkIiwgZHNkLT5tSWQpOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyMjo6cHJlcGFyZU5leHREYXRhU291cmNlQXN5bmMoY29uc3Qgc3A8RGF0YVNvdXJjZURlc2M+ICZkc2QpIHsKKyAgICBEQVRBX1NPVVJDRV9UWVBFIGRhdGFTb3VyY2VUeXBlOworICAgIHNwPFNvdXJjZT4gc291cmNlOworICAgIGNyZWF0ZU51UGxheWVyMlNvdXJjZShkc2QsICZzb3VyY2UsICZkYXRhU291cmNlVHlwZSk7CisKKyAgICAvKgorICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgbm90aWZ5TGlzdGVuZXIoZHNkLT5tSWQsIE1FRElBMl9FUlJPUiwgTUVESUEyX0VSUk9SX0ZBSUxFRF9UT19TRVRfREFUQV9TT1VSQ0UsIGVycik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBOb3csIHNvdXJjZSAhPSBOVUxMLgorICAgICovCisKKyAgICBtTmV4dERhdGFTb3VyY2VUeXBlID0gZGF0YVNvdXJjZVR5cGU7CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UHJlcGFyZU5leHREYXRhU291cmNlLCB0aGlzKTsKKyAgICBtc2ctPnNldE9iamVjdCgic291cmNlIiwgc291cmNlKTsKKyAgICBtc2ctPnNldEludDY0KCJzcmNJZCIsIGRzZC0+bUlkKTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjI6OnBsYXlOZXh0RGF0YVNvdXJjZShpbnQ2NF90IHNyY0lkKSB7CisgICAgZGlzY29ubmVjdFNvdXJjZSgpOworCisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFBsYXlOZXh0RGF0YVNvdXJjZSwgdGhpcyk7CisgICAgbXNnLT5zZXRJbnQ2NCgic3JjSWQiLCBzcmNJZCk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6Z2V0QnVmZmVyaW5nU2V0dGluZ3MoCisgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzICpidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRCdWZmZXJpbmdTZXR0aW5ncywgdGhpcyk7CisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKKyAgICBpZiAoZXJyID09IE9LICYmIHJlc3BvbnNlICE9IE5VTEwpIHsKKyAgICAgICAgQ0hFQ0socmVzcG9uc2UtPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOworICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICByZWFkRnJvbUFNZXNzYWdlKHJlc3BvbnNlLCBidWZmZXJpbmcpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6c2V0QnVmZmVyaW5nU2V0dGluZ3MoY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MmIGJ1ZmZlcmluZykgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXRCdWZmZXJpbmdTZXR0aW5ncywgdGhpcyk7CisgICAgd3JpdGVUb0FNZXNzYWdlKG1zZywgYnVmZmVyaW5nKTsKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworICAgIGlmIChlcnIgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgeworICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpwcmVwYXJlQXN5bmMoKSB7CisgICAgQUxPR1YoInByZXBhcmVBc3luYyIpOworCisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFByZXBhcmUsIHRoaXMpKS0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyMjo6c2V0VmlkZW9TdXJmYWNlVGV4dHVyZUFzeW5jKGNvbnN0IHNwPEFOYXRpdmVXaW5kb3dXcmFwcGVyPiAmbnd3KSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldFZpZGVvU3VyZmFjZSwgdGhpcyk7CisKKyAgICBpZiAobnd3ID09IE5VTEwgfHwgbnd3LT5nZXRBTmF0aXZlV2luZG93KCkgPT0gTlVMTCkgeworICAgICAgICBtc2ctPnNldE9iamVjdCgic3VyZmFjZSIsIE5VTEwpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1zZy0+c2V0T2JqZWN0KCJzdXJmYWNlIiwgbnd3KTsKKyAgICB9CisKKyAgICBtc2ctPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjI6OnNldEF1ZGlvU2luayhjb25zdCBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2U6OkF1ZGlvU2luaz4gJnNpbmspIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0QXVkaW9TaW5rLCB0aGlzKTsKKyAgICBtc2ctPnNldE9iamVjdCgic2luayIsIHNpbmspOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyMjo6c3RhcnQoKSB7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFN0YXJ0LCB0aGlzKSktPnBvc3QoKTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpzZXRQbGF5YmFja1NldHRpbmdzKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZyYXRlKSB7CisgICAgLy8gZG8gc29tZSBjdXJzb3J5IHZhbGlkYXRpb24gb2YgdGhlIHNldHRpbmdzIGhlcmUuIGF1ZGlvIG1vZGVzIGFyZQorICAgIC8vIG9ubHkgdmFsaWRhdGVkIHdoZW4gc2V0IG9uIHRoZSBhdWRpb3NpbmsuCisgICAgIGlmICgocmF0ZS5tU3BlZWQgIT0gMC5mICYmIHJhdGUubVNwZWVkIDwgQVVESU9fVElNRVNUUkVUQ0hfU1BFRURfTUlOKQorICAgICAgICAgICAgfHwgcmF0ZS5tU3BlZWQgPiBBVURJT19USU1FU1RSRVRDSF9TUEVFRF9NQVgKKyAgICAgICAgICAgIHx8IHJhdGUubVBpdGNoIDwgQVVESU9fVElNRVNUUkVUQ0hfU1BFRURfTUlOCisgICAgICAgICAgICB8fCByYXRlLm1QaXRjaCA+IEFVRElPX1RJTUVTVFJFVENIX1NQRUVEX01BWCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q29uZmlnUGxheWJhY2ssIHRoaXMpOworICAgIHdyaXRlVG9BTWVzc2FnZShtc2csIHJhdGUpOworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CisgICAgaWYgKGVyciA9PSBPSyAmJiByZXNwb25zZSAhPSBOVUxMKSB7CisgICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpnZXRQbGF5YmFja1NldHRpbmdzKEF1ZGlvUGxheWJhY2tSYXRlICpyYXRlIC8qIG5vbm51bGwgKi8pIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0UGxheWJhY2tTZXR0aW5ncywgdGhpcyk7CisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKKyAgICBpZiAoZXJyID09IE9LICYmIHJlc3BvbnNlICE9IE5VTEwpIHsKKyAgICAgICAgQ0hFQ0socmVzcG9uc2UtPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOworICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICByZWFkRnJvbUFNZXNzYWdlKHJlc3BvbnNlLCByYXRlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OnNldFN5bmNTZXR0aW5ncyhjb25zdCBBVlN5bmNTZXR0aW5ncyAmc3luYywgZmxvYXQgdmlkZW9GcHNIaW50KSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENvbmZpZ1N5bmMsIHRoaXMpOworICAgIHdyaXRlVG9BTWVzc2FnZShtc2csIHN5bmMsIHZpZGVvRnBzSGludCk7CisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKKyAgICBpZiAoZXJyID09IE9LICYmIHJlc3BvbnNlICE9IE5VTEwpIHsKKyAgICAgICAgQ0hFQ0socmVzcG9uc2UtPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OmdldFN5bmNTZXR0aW5ncygKKyAgICAgICAgQVZTeW5jU2V0dGluZ3MgKnN5bmMgLyogbm9ubnVsbCAqLywgZmxvYXQgKnZpZGVvRnBzIC8qIG5vbm51bGwgKi8pIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0U3luY1NldHRpbmdzLCB0aGlzKTsKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworICAgIGlmIChlcnIgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgeworICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIHJlYWRGcm9tQU1lc3NhZ2UocmVzcG9uc2UsIHN5bmMsIHZpZGVvRnBzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCit2b2lkIE51UGxheWVyMjo6cGF1c2UoKSB7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFBhdXNlLCB0aGlzKSktPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjI6OnJlc2V0QXN5bmMoKSB7CisgICAgZGlzY29ubmVjdFNvdXJjZSgpOworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRSZXNldCwgdGhpcykpLT5wb3N0KCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpkaXNjb25uZWN0U291cmNlKCkgeworICAgIHNwPFNvdXJjZT4gc291cmNlOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Tb3VyY2VMb2NrKTsKKyAgICAgICAgc291cmNlID0gbVNvdXJjZTsKKyAgICB9CisKKyAgICBpZiAoc291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgLy8gRHVyaW5nIGEgcmVzZXQsIHRoZSBkYXRhIHNvdXJjZSBtaWdodCBiZSB1bnJlc3BvbnNpdmUgYWxyZWFkeSwgd2UgbmVlZCB0bworICAgICAgICAvLyBkaXNjb25uZWN0IGV4cGxpY2l0bHkgc28gdGhhdCByZWFkcyBleGl0IHByb21wdGx5LgorICAgICAgICAvLyBXZSBjYW4ndCBxdWV1ZSB0aGUgZGlzY29ubmVjdCByZXF1ZXN0IHRvIHRoZSBsb29wZXIsIGFzIGl0IG1pZ2h0IGJlCisgICAgICAgIC8vIHF1ZXVlZCBiZWhpbmQgYSBzdHVjayByZWFkIGFuZCBuZXZlciBnZXRzIHByb2Nlc3NlZC4KKyAgICAgICAgLy8gRG9pbmcgYSBkaXNjb25uZWN0IG91dHNpZGUgdGhlIGxvb3BlciB0byBhbGxvd3MgdGhlIHBlbmRpbmcgcmVhZHMgdG8gZXhpdAorICAgICAgICAvLyAoZWl0aGVyIHN1Y2Nlc3NmdWxseSBvciB3aXRoIGVycm9yKS4KKyAgICAgICAgc291cmNlLT5kaXNjb25uZWN0KCk7CisgICAgfQorCit9CisKK3N0YXR1c190IE51UGxheWVyMjo6bm90aWZ5QXQoaW50NjRfdCBtZWRpYVRpbWVVcykgeworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXROb3RpZnlUaW1lLCB0aGlzKTsKKyAgICBub3RpZnktPnNldEludDY0KCJ0aW1lclVzIiwgbWVkaWFUaW1lVXMpOworICAgIG1NZWRpYUNsb2NrLT5hZGRUaW1lcihub3RpZnksIG1lZGlhVGltZVVzKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpzZWVrVG9Bc3luYyhpbnQ2NF90IHNlZWtUaW1lVXMsIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUsIGJvb2wgbmVlZE5vdGlmeSkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZWVrLCB0aGlzKTsKKyAgICBtc2ctPnNldEludDY0KCJzZWVrVGltZVVzIiwgc2Vla1RpbWVVcyk7CisgICAgbXNnLT5zZXRJbnQzMigibW9kZSIsIG1vZGUpOworICAgIG1zZy0+c2V0SW50MzIoIm5lZWROb3RpZnkiLCBuZWVkTm90aWZ5KTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKworCit2b2lkIE51UGxheWVyMjo6d3JpdGVUcmFja0luZm8oCisgICAgICAgIFBhcmNlbCogcmVwbHksIGNvbnN0IHNwPEFNZXNzYWdlPiYgZm9ybWF0KSBjb25zdCB7CisgICAgaWYgKGZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJOVUxMIGZvcm1hdCIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGludDMyX3QgdHJhY2tUeXBlOworICAgIGlmICghZm9ybWF0LT5maW5kSW50MzIoInR5cGUiLCAmdHJhY2tUeXBlKSkgeworICAgICAgICBBTE9HRSgibm8gdHJhY2sgdHlwZSIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQVN0cmluZyBtaW1lOworICAgIGlmICghZm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKSB7CisgICAgICAgIC8vIEphdmEgTWVkaWFQbGF5ZXIgb25seSB1c2VzIG1pbWV0eXBlIGZvciBzdWJ0aXRsZSBhbmQgdGltZWR0ZXh0IHRyYWNrcy4KKyAgICAgICAgLy8gSWYgd2UgY2FuJ3QgZmluZCB0aGUgbWltZXR5cGUgaGVyZSBpdCBtZWFucyB0aGF0IHdlIHdvdWxkbid0IGJlIG5lZWRpbmcKKyAgICAgICAgLy8gdGhlIG1pbWV0eXBlIG9uIHRoZSBKYXZhIGVuZC4gV2Ugc3RpbGwgd3JpdGUgYSBwbGFjZWhvbGRlciBtaW1lIHRvIGtlZXAgdGhlCisgICAgICAgIC8vIChkZSlzZXJpYWxpemF0aW9uIGxvZ2ljIHNpbXBsZS4KKyAgICAgICAgaWYgKHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX0FVRElPKSB7CisgICAgICAgICAgICBtaW1lID0gImF1ZGlvLyI7CisgICAgICAgIH0gZWxzZSBpZiAodHJhY2tUeXBlID09IE1FRElBX1RSQUNLX1RZUEVfVklERU8pIHsKKyAgICAgICAgICAgIG1pbWUgPSAidmlkZW8vIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJ1bmtub3duIHRyYWNrIHR5cGU6ICVkIiwgdHJhY2tUeXBlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFTdHJpbmcgbGFuZzsKKyAgICBpZiAoIWZvcm1hdC0+ZmluZFN0cmluZygibGFuZ3VhZ2UiLCAmbGFuZykpIHsKKyAgICAgICAgQUxPR0UoIm5vIGxhbmd1YWdlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICByZXBseS0+d3JpdGVJbnQzMigyKTsgLy8gd3JpdGUgc29tZXRoaW5nIG5vbi16ZXJvCisgICAgcmVwbHktPndyaXRlSW50MzIodHJhY2tUeXBlKTsKKyAgICByZXBseS0+d3JpdGVTdHJpbmcxNihTdHJpbmcxNihtaW1lLmNfc3RyKCkpKTsKKyAgICByZXBseS0+d3JpdGVTdHJpbmcxNihTdHJpbmcxNihsYW5nLmNfc3RyKCkpKTsKKworICAgIGlmICh0cmFja1R5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRSkgeworICAgICAgICBpbnQzMl90IGlzQXV0bywgaXNEZWZhdWx0LCBpc0ZvcmNlZDsKKyAgICAgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoImF1dG8iLCAmaXNBdXRvKSk7CisgICAgICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJkZWZhdWx0IiwgJmlzRGVmYXVsdCkpOworICAgICAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigiZm9yY2VkIiwgJmlzRm9yY2VkKSk7CisKKyAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaXNBdXRvKTsKKyAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaXNEZWZhdWx0KTsKKyAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaXNGb3JjZWQpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0U2V0RGF0YVNvdXJjZToKKyAgICAgICAgeworICAgICAgICAgICAgQUxPR1YoImtXaGF0U2V0RGF0YVNvdXJjZSIpOworCisgICAgICAgICAgICBDSEVDSyhtU291cmNlID09IE5VTEwpOworCisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgic291cmNlIiwgJm9iaikpOworICAgICAgICAgICAgaWYgKG9iaiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Tb3VyY2VMb2NrKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgic3JjSWQiLCAmbVNyY0lkKSk7CisgICAgICAgICAgICAgICAgbVNvdXJjZSA9IHN0YXRpY19jYXN0PFNvdXJjZSAqPihvYmouZ2V0KCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgICAgIEFMT0dFKCJrV2hhdFNldERhdGFTb3VyY2UsIHNvdXJjZSBzaG91bGQgbm90IGJlIE5VTEwiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ0hFQ0sobURyaXZlciAhPSBOVUxMKTsKKyAgICAgICAgICAgIHNwPE51UGxheWVyMkRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVNldERhdGFTb3VyY2VDb21wbGV0ZWQobVNyY0lkLCBlcnIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0UHJlcGFyZU5leHREYXRhU291cmNlOgorICAgICAgICB7CisgICAgICAgICAgICBBTE9HVigia1doYXRQcmVwYXJlTmV4dERhdGFTb3VyY2UiKTsKKworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoInNvdXJjZSIsICZvYmopKTsKKyAgICAgICAgICAgIGlmIChvYmogIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU291cmNlTG9jayk7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInNyY0lkIiwgJm1OZXh0U3JjSWQpKTsKKyAgICAgICAgICAgICAgICBtTmV4dFNvdXJjZSA9IHN0YXRpY19jYXN0PFNvdXJjZSAqPihvYmouZ2V0KCkpOworICAgICAgICAgICAgICAgIG1OZXh0U291cmNlLT5wcmVwYXJlQXN5bmMoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXJyID0gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0UGxheU5leHREYXRhU291cmNlOgorICAgICAgICB7CisgICAgICAgICAgICBBTE9HVigia1doYXRQbGF5TmV4dERhdGFTb3VyY2UiKTsKKyAgICAgICAgICAgIGludDY0X3Qgc3JjSWQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgic3JjSWQiLCAmc3JjSWQpKTsKKyAgICAgICAgICAgIGlmIChzcmNJZCAhPSBtTmV4dFNyY0lkKSB7CisgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoc3JjSWQsIE1FRElBMl9FUlJPUiwgTUVESUEyX0VSUk9SX1VOS05PV04sIDApOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVJlc2V0dGluZyA9IHRydWU7CisgICAgICAgICAgICBzdG9wUGxheWJhY2tUaW1lcigia1doYXRQbGF5TmV4dERhdGFTb3VyY2UiKTsKKyAgICAgICAgICAgIHN0b3BSZWJ1ZmZlcmluZ1RpbWVyKHRydWUpOworCisgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgbmV3IEZsdXNoRGVjb2RlckFjdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIEZMVVNIX0NNRF9TSFVURE9XTiAvKiBhdWRpbyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIEZMVVNIX0NNRF9TSFVURE9XTiAvKiB2aWRlbyAqLykpOworCisgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUFjdGlvbigmTnVQbGF5ZXIyOjpwZXJmb3JtUGxheU5leHREYXRhU291cmNlKSk7CisKKyAgICAgICAgICAgIHByb2Nlc3NEZWZlcnJlZEFjdGlvbnMoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdEdldEJ1ZmZlcmluZ1NldHRpbmdzOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKworICAgICAgICAgICAgQUxPR1YoImtXaGF0R2V0QnVmZmVyaW5nU2V0dGluZ3MiKTsKKyAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzIGJ1ZmZlcmluZzsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOworICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGVyciA9IG1Tb3VyY2UtPmdldEJ1ZmZlcmluZ1NldHRpbmdzKCZidWZmZXJpbmcpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICB3cml0ZVRvQU1lc3NhZ2UocmVzcG9uc2UsIGJ1ZmZlcmluZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0U2V0QnVmZmVyaW5nU2V0dGluZ3M6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworCisgICAgICAgICAgICBBTE9HVigia1doYXRTZXRCdWZmZXJpbmdTZXR0aW5ncyIpOworICAgICAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MgYnVmZmVyaW5nOworICAgICAgICAgICAgcmVhZEZyb21BTWVzc2FnZShtc2csICZidWZmZXJpbmcpOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZXJyID0gbVNvdXJjZS0+c2V0QnVmZmVyaW5nU2V0dGluZ3MoYnVmZmVyaW5nKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXJyID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0UHJlcGFyZToKKyAgICAgICAgeworICAgICAgICAgICAgQUxPR1YoIm9uTWVzc2FnZVJlY2VpdmVkIGtXaGF0UHJlcGFyZSIpOworCisgICAgICAgICAgICBtU291cmNlLT5wcmVwYXJlQXN5bmMoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdEdldFRyYWNrSW5mbzoKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisKKyAgICAgICAgICAgIFBhcmNlbCogcmVwbHk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJyZXBseSIsICh2b2lkKiopJnJlcGx5KSk7CisKKyAgICAgICAgICAgIHNpemVfdCBpbmJhbmRUcmFja3MgPSAwOworICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGluYmFuZFRyYWNrcyA9IG1Tb3VyY2UtPmdldFRyYWNrQ291bnQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2l6ZV90IGNjVHJhY2tzID0gMDsKKyAgICAgICAgICAgIGlmIChtQ0NEZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBjY1RyYWNrcyA9IG1DQ0RlY29kZXItPmdldFRyYWNrQ291bnQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gdG90YWwgdHJhY2sgY291bnQKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGluYmFuZFRyYWNrcyArIGNjVHJhY2tzKTsKKworICAgICAgICAgICAgLy8gd3JpdGUgaW5iYW5kIHRyYWNrcworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmJhbmRUcmFja3M7ICsraSkgeworICAgICAgICAgICAgICAgIHdyaXRlVHJhY2tJbmZvKHJlcGx5LCBtU291cmNlLT5nZXRUcmFja0luZm8oaSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB3cml0ZSBDQyB0cmFjaworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjY1RyYWNrczsgKytpKSB7CisgICAgICAgICAgICAgICAgd3JpdGVUcmFja0luZm8ocmVwbHksIG1DQ0RlY29kZXItPmdldFRyYWNrSW5mbyhpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRHZXRTZWxlY3RlZFRyYWNrOgorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBPSzsKKworICAgICAgICAgICAgICAgIGludDMyX3QgdHlwZTMyOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ0eXBlIiwgKGludDMyX3QqKSZ0eXBlMzIpKTsKKyAgICAgICAgICAgICAgICBtZWRpYV90cmFja190eXBlIHR5cGUgPSAobWVkaWFfdHJhY2tfdHlwZSl0eXBlMzI7CisgICAgICAgICAgICAgICAgc3NpemVfdCBzZWxlY3RlZFRyYWNrID0gbVNvdXJjZS0+Z2V0U2VsZWN0ZWRUcmFjayh0eXBlKTsKKworICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHk7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigicmVwbHkiLCAodm9pZCoqKSZyZXBseSkpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNlbGVjdGVkVHJhY2spOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CisKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFNlbGVjdFRyYWNrOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKworICAgICAgICAgICAgc2l6ZV90IHRyYWNrSW5kZXg7CisgICAgICAgICAgICBpbnQzMl90IHNlbGVjdDsKKyAgICAgICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU2l6ZSgidHJhY2tJbmRleCIsICZ0cmFja0luZGV4KSk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigic2VsZWN0IiwgJnNlbGVjdCkpOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKKworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gSU5WQUxJRF9PUEVSQVRJT047CisKKyAgICAgICAgICAgIHNpemVfdCBpbmJhbmRUcmFja3MgPSAwOworICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGluYmFuZFRyYWNrcyA9IG1Tb3VyY2UtPmdldFRyYWNrQ291bnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNpemVfdCBjY1RyYWNrcyA9IDA7CisgICAgICAgICAgICBpZiAobUNDRGVjb2RlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgY2NUcmFja3MgPSBtQ0NEZWNvZGVyLT5nZXRUcmFja0NvdW50KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0cmFja0luZGV4IDwgaW5iYW5kVHJhY2tzKSB7CisgICAgICAgICAgICAgICAgZXJyID0gbVNvdXJjZS0+c2VsZWN0VHJhY2sodHJhY2tJbmRleCwgc2VsZWN0LCB0aW1lVXMpOworCisgICAgICAgICAgICAgICAgaWYgKCFzZWxlY3QgJiYgZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdHlwZTsKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGluZm8gPSBtU291cmNlLT5nZXRUcmFja0luZm8odHJhY2tJbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvICE9IE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmZvLT5maW5kSW50MzIoInR5cGUiLCAmdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0eXBlID09IE1FRElBX1RSQUNLX1RZUEVfVElNRURURVhUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICArK21UaW1lZFRleHRHZW5lcmF0aW9uOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0cmFja0luZGV4IC09IGluYmFuZFRyYWNrczsKKworICAgICAgICAgICAgICAgIGlmICh0cmFja0luZGV4IDwgY2NUcmFja3MpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gbUNDRGVjb2Rlci0+c2VsZWN0VHJhY2sodHJhY2tJbmRleCwgc2VsZWN0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKworICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFBvbGxEdXJhdGlvbjoKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOworCisgICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPSBtUG9sbER1cmF0aW9uR2VuZXJhdGlvbikgeworICAgICAgICAgICAgICAgIC8vIHN0YWxlCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKKyAgICAgICAgICAgIGlmIChtRHJpdmVyICE9IE5VTEwgJiYgbVNvdXJjZS0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uVXMpID09IE9LKSB7CisgICAgICAgICAgICAgICAgc3A8TnVQbGF5ZXIyRHJpdmVyPiBkcml2ZXIgPSBtRHJpdmVyLnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlEdXJhdGlvbihtU3JjSWQsIGR1cmF0aW9uVXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbXNnLT5wb3N0KDEwMDAwMDBsbCk7ICAvLyBwb2xsIGFnYWluIGluIGEgc2Vjb25kLgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0U2V0VmlkZW9TdXJmYWNlOgorICAgICAgICB7CisKKyAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgic3VyZmFjZSIsICZvYmopKTsKKyAgICAgICAgICAgIHNwPEFOYXRpdmVXaW5kb3dXcmFwcGVyPiBud3cgPSBzdGF0aWNfY2FzdDxBTmF0aXZlV2luZG93V3JhcHBlciAqPihvYmouZ2V0KCkpOworCisgICAgICAgICAgICBBTE9HRCgib25TZXRWaWRlb1N1cmZhY2UoJXAsICVzIHZpZGVvIGRlY29kZXIpIiwKKyAgICAgICAgICAgICAgICAgICAgKG53dyA9PSBOVUxMID8gTlVMTCA6IG53dy0+Z2V0QU5hdGl2ZVdpbmRvdygpKSwKKyAgICAgICAgICAgICAgICAgICAgKG1Tb3VyY2UgIT0gTlVMTCAmJiBtU3RhcnRlZCAmJiBtU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pICE9IE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtVmlkZW9EZWNvZGVyICE9IE5VTEwpID8gImhhdmUiIDogIm5vIik7CisKKyAgICAgICAgICAgIC8vIE5lZWQgdG8gY2hlY2sgbVN0YXJ0ZWQgYmVmb3JlIGNhbGxpbmcgbVNvdXJjZS0+Z2V0Rm9ybWF0IGJlY2F1c2UgTnVQbGF5ZXIyIG1pZ2h0CisgICAgICAgICAgICAvLyBiZSBpbiBwcmVwYXJpbmcgc3RhdGUgYW5kIGl0IGNvdWxkIHRha2UgbG9uZyB0aW1lLgorICAgICAgICAgICAgLy8gV2hlbiBtU3RhcnRlZCBpcyB0cnVlLCBtU291cmNlIG11c3QgaGF2ZSBiZWVuIHNldC4KKyAgICAgICAgICAgIGlmIChtU291cmNlID09IE5VTEwgfHwgIW1TdGFydGVkIHx8IG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLykgPT0gTlVMTAorICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBtVmlkZW9EZWNvZGVyJ3MgbU5hdGl2ZVdpbmRvdyBpcyBhbHdheXMgbm9uLW51bGwKKyAgICAgICAgICAgICAgICAgICAgfHwgKG1WaWRlb0RlY29kZXIgIT0gTlVMTCAmJiBtVmlkZW9EZWNvZGVyLT5zZXRWaWRlb1N1cmZhY2Uobnd3KSA9PSBPSykpIHsKKyAgICAgICAgICAgICAgICBwZXJmb3JtU2V0U3VyZmFjZShud3cpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgbmV3IEZsdXNoRGVjb2RlckFjdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAob2JqICE9IE5VTEwgPyBGTFVTSF9DTURfRkxVU0ggOiBGTFVTSF9DTURfTk9ORSkgLyogYXVkaW8gKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxVU0hfQ01EX1NIVVRET1dOIC8qIHZpZGVvICovKSk7CisKKyAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKG5ldyBTZXRTdXJmYWNlQWN0aW9uKG53dykpOworCisgICAgICAgICAgICBpZiAob2JqICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSXNzdWUgYSBzZWVrIHRvIHJlZnJlc2ggdGhlIHZpZGVvIHNjcmVlbiBvbmx5IGlmIHN0YXJ0ZWQgb3RoZXJ3aXNlCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBleHRyYWN0b3IgbWF5IG5vdCB5ZXQgYmUgc3RhcnRlZCBhbmQgd2lsbCBhc3NlcnQuCisgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSB2aWRlbyBkZWNvZGVyIGlzIG5vdCBzZXQgKHBlcmhhcHMgYXVkaW8gb25seSBpbiB0aGlzIGNhc2UpCisgICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBwZXJmb3JtIGEgc2VlayBhcyBpdCBpcyBub3QgbmVlZGVkLgorICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGN1cnJlbnRQb3NpdGlvblVzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldEN1cnJlbnRQb3NpdGlvbigmY3VycmVudFBvc2l0aW9uVXMpID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNlZWtBY3Rpb24oY3VycmVudFBvc2l0aW9uVXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQyAvKiBtb2RlICovKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIG5ldyBzdXJmYWNlIHRleHR1cmUsIGluc3RhbnRpYXRlIGRlY29kZXJzCisgICAgICAgICAgICAgICAgLy8gYWdhaW4gaWYgcG9zc2libGUuCisgICAgICAgICAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2ltcGxlQWN0aW9uKCZOdVBsYXllcjI6OnBlcmZvcm1TY2FuU291cmNlcykpOworCisgICAgICAgICAgICAgICAgLy8gQWZ0ZXIgYSBmbHVzaCB3aXRob3V0IHNodXRkb3duLCBkZWNvZGVyIGlzIHBhdXNlZC4KKyAgICAgICAgICAgICAgICAvLyBEb24ndCByZXN1bWUgaXQgdW50aWwgc291cmNlIHNlZWsgaXMgZG9uZSwgb3RoZXJ3aXNlIGl0IGNvdWxkCisgICAgICAgICAgICAgICAgLy8gc3RhcnQgcHVsbGluZyBzdGFsZSBkYXRhIHRvbyBzb29uLgorICAgICAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlc3VtZURlY29kZXJBY3Rpb24oZmFsc2UgLyogbmVlZE5vdGlmeSAqLykpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcm9jZXNzRGVmZXJyZWRBY3Rpb25zKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRTZXRBdWRpb1Npbms6CisgICAgICAgIHsKKyAgICAgICAgICAgIEFMT0dWKCJrV2hhdFNldEF1ZGlvU2luayIpOworCisgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoInNpbmsiLCAmb2JqKSk7CisKKyAgICAgICAgICAgIG1BdWRpb1NpbmsgPSBzdGF0aWNfY2FzdDxNZWRpYVBsYXllcjJJbnRlcmZhY2U6OkF1ZGlvU2luayAqPihvYmouZ2V0KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0U3RhcnQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIEFMT0dWKCJrV2hhdFN0YXJ0Iik7CisgICAgICAgICAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgICAgICAvLyBkbyBub3QgcmVzdW1lIHlldCBpZiB0aGUgc291cmNlIGlzIHN0aWxsIGJ1ZmZlcmluZworICAgICAgICAgICAgICAgIGlmICghbVBhdXNlZEZvckJ1ZmZlcmluZykgeworICAgICAgICAgICAgICAgICAgICBvblJlc3VtZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb25TdGFydCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVBhdXNlZEJ5Q2xpZW50ID0gZmFsc2U7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9TVEFSVEVELCAwLCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdENvbmZpZ1BsYXliYWNrOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKyAgICAgICAgICAgIEF1ZGlvUGxheWJhY2tSYXRlIHJhdGUgLyogc2FuaXRpemVkICovOworICAgICAgICAgICAgcmVhZEZyb21BTWVzc2FnZShtc2csICZyYXRlKTsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOworICAgICAgICAgICAgaWYgKG1SZW5kZXJlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgLy8gQXVkaW9TaW5rIGFsbG93cyBvbmx5IDEuZiBhbmQgMC5mIGZvciBvZmZsb2FkIG1vZGUuCisgICAgICAgICAgICAgICAgLy8gRm9yIG90aGVyIHNwZWVkLCBzd2l0Y2ggdG8gbm9uLW9mZmxvYWQgbW9kZS4KKyAgICAgICAgICAgICAgICBpZiAobU9mZmxvYWRBdWRpbyAmJiAoKHJhdGUubVNwZWVkICE9IDAuZiAmJiByYXRlLm1TcGVlZCAhPSAxLmYpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCByYXRlLm1QaXRjaCAhPSAxLmYpKSB7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgY3VycmVudFBvc2l0aW9uVXM7CisgICAgICAgICAgICAgICAgICAgIGlmIChnZXRDdXJyZW50UG9zaXRpb24oJmN1cnJlbnRQb3NpdGlvblVzKSAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBvc2l0aW9uVXMgPSBtUHJldmlvdXNTZWVrVGltZVVzOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gU2V0IG1QbGF5YmFja1NldHRpbmdzIHNvIHRoYXQgdGhlIG5ldyBhdWRpbyBkZWNvZGVyIGNhbgorICAgICAgICAgICAgICAgICAgICAvLyBiZSBjcmVhdGVkIGNvcnJlY3RseS4KKyAgICAgICAgICAgICAgICAgICAgbVBsYXliYWNrU2V0dGluZ3MgPSByYXRlOworICAgICAgICAgICAgICAgICAgICBpZiAoIW1QYXVzZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1SZW5kZXJlci0+cGF1c2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXN0YXJ0QXVkaW8oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBvc2l0aW9uVXMsIHRydWUgLyogZm9yY2VOb25PZmZsb2FkICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogbmVlZHNUb0NyZWF0ZUF1ZGlvRGVjb2RlciAqLyk7CisgICAgICAgICAgICAgICAgICAgIGlmICghbVBhdXNlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVJlbmRlcmVyLT5yZXN1bWUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGVyciA9IG1SZW5kZXJlci0+c2V0UGxheWJhY2tTZXR0aW5ncyhyYXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBpZiAocmF0ZS5tU3BlZWQgPT0gMC5mKSB7CisgICAgICAgICAgICAgICAgICAgIG9uUGF1c2UoKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfUEFVU0VELCAwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgbVBhdXNlZEJ5Q2xpZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSBhbGwgb3RoZXIgc2V0dGluZ3MgKHVzaW5nIG5vbi1wYXVzZWQgc3BlZWQpCisgICAgICAgICAgICAgICAgICAgIC8vIHNvIHdlIGNhbiByZXN0b3JlIHRoZW0gb24gc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgQXVkaW9QbGF5YmFja1JhdGUgbmV3UmF0ZSA9IHJhdGU7CisgICAgICAgICAgICAgICAgICAgIG5ld1JhdGUubVNwZWVkID0gbVBsYXliYWNrU2V0dGluZ3MubVNwZWVkOworICAgICAgICAgICAgICAgICAgICBtUGxheWJhY2tTZXR0aW5ncyA9IG5ld1JhdGU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgLyogcmF0ZS5tU3BlZWQgIT0gMC5mICovCisgICAgICAgICAgICAgICAgICAgIG1QbGF5YmFja1NldHRpbmdzID0gcmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgcmVzdW1lIHlldCBpZiB0aGUgc291cmNlIGlzIHN0aWxsIGJ1ZmZlcmluZworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtUGF1c2VkRm9yQnVmZmVyaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25SZXN1bWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtUHJlcGFyZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9uU3RhcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG1QYXVzZWRCeUNsaWVudCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1WaWRlb0RlY29kZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBwYXJhbXMgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJwbGF5YmFjay1zcGVlZCIsIG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZCk7CisgICAgICAgICAgICAgICAgbVZpZGVvRGVjb2Rlci0+c2V0UGFyYW1ldGVycyhwYXJhbXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0R2V0UGxheWJhY2tTZXR0aW5nczoKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisgICAgICAgICAgICBBdWRpb1BsYXliYWNrUmF0ZSByYXRlID0gbVBsYXliYWNrU2V0dGluZ3M7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICAgICAgICAgIGlmIChtUmVuZGVyZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGVyciA9IG1SZW5kZXJlci0+Z2V0UGxheWJhY2tTZXR0aW5ncygmcmF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgLy8gZ2V0IHBsYXliYWNrIHNldHRpbmdzIHVzZWQgYnkgcmVuZGVyZXIsIGFzIGl0IG1heSBiZQorICAgICAgICAgICAgICAgIC8vIHNsaWdodGx5IG9mZiBkdWUgdG8gYXVkaW9zaW5rIG5vdCB0YWtpbmcgc21hbGwgY2hhbmdlcy4KKyAgICAgICAgICAgICAgICBtUGxheWJhY2tTZXR0aW5ncyA9IHJhdGU7CisgICAgICAgICAgICAgICAgaWYgKG1QYXVzZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmF0ZS5tU3BlZWQgPSAwLmY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIHdyaXRlVG9BTWVzc2FnZShyZXNwb25zZSwgcmF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0Q29uZmlnU3luYzoKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisKKyAgICAgICAgICAgIEFMT0dWKCJrV2hhdENvbmZpZ1N5bmMiKTsKKyAgICAgICAgICAgIEFWU3luY1NldHRpbmdzIHN5bmM7CisgICAgICAgICAgICBmbG9hdCB2aWRlb0Zwc0hpbnQ7CisgICAgICAgICAgICByZWFkRnJvbUFNZXNzYWdlKG1zZywgJnN5bmMsICZ2aWRlb0Zwc0hpbnQpOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgICAgICAgICBpZiAobVJlbmRlcmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBtUmVuZGVyZXItPnNldFN5bmNTZXR0aW5ncyhzeW5jLCB2aWRlb0Zwc0hpbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIG1TeW5jU2V0dGluZ3MgPSBzeW5jOworICAgICAgICAgICAgICAgIG1WaWRlb0Zwc0hpbnQgPSB2aWRlb0Zwc0hpbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0R2V0U3luY1NldHRpbmdzOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKyAgICAgICAgICAgIEFWU3luY1NldHRpbmdzIHN5bmMgPSBtU3luY1NldHRpbmdzOworICAgICAgICAgICAgZmxvYXQgdmlkZW9GcHMgPSBtVmlkZW9GcHNIaW50OworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgICAgICAgICBpZiAobVJlbmRlcmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBtUmVuZGVyZXItPmdldFN5bmNTZXR0aW5ncygmc3luYywgJnZpZGVvRnBzKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIG1TeW5jU2V0dGluZ3MgPSBzeW5jOworICAgICAgICAgICAgICAgICAgICBtVmlkZW9GcHNIaW50ID0gdmlkZW9GcHM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIHdyaXRlVG9BTWVzc2FnZShyZXNwb25zZSwgc3luYywgdmlkZW9GcHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOworICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFNjYW5Tb3VyY2VzOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb247CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7CisgICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPSBtU2NhblNvdXJjZXNHZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgLy8gRHJvcCBvYnNvbGV0ZSBtc2cuCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1TY2FuU291cmNlc1BlbmRpbmcgPSBmYWxzZTsKKworICAgICAgICAgICAgQUxPR1YoInNjYW5uaW5nIHNvdXJjZXMgaGF2ZUF1ZGlvPSVkLCBoYXZlVmlkZW89JWQiLAorICAgICAgICAgICAgICAgICBtQXVkaW9EZWNvZGVyICE9IE5VTEwsIG1WaWRlb0RlY29kZXIgIT0gTlVMTCk7CisKKyAgICAgICAgICAgIGJvb2wgbUhhZEFueVNvdXJjZXNCZWZvcmUgPQorICAgICAgICAgICAgICAgIChtQXVkaW9EZWNvZGVyICE9IE5VTEwpIHx8IChtVmlkZW9EZWNvZGVyICE9IE5VTEwpOworICAgICAgICAgICAgYm9vbCByZXNjYW4gPSBmYWxzZTsKKworICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSB2aWRlbyBiZWZvcmUgYXVkaW8gYmVjYXVzZSBzdWNjZXNzZnVsIGluaXRpYWxpemF0aW9uIG9mCisgICAgICAgICAgICAvLyB2aWRlbyBtYXkgY2hhbmdlIGRlZXAgYnVmZmVyIG1vZGUgb2YgYXVkaW8uCisgICAgICAgICAgICBpZiAobU5hdGl2ZVdpbmRvdyAhPSBOVUxMICYmIG1OYXRpdmVXaW5kb3ctPmdldEFOYXRpdmVXaW5kb3coKSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKGluc3RhbnRpYXRlRGVjb2RlcihmYWxzZSwgJm1WaWRlb0RlY29kZXIpID09IC1FV09VTERCTE9DSykgeworICAgICAgICAgICAgICAgICAgICByZXNjYW4gPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRG9uJ3QgdHJ5IHRvIHJlLW9wZW4gYXVkaW8gc2luayBpZiB0aGVyZSdzIGFuIGV4aXN0aW5nIGRlY29kZXIuCisgICAgICAgICAgICBpZiAobUF1ZGlvU2luayAhPSBOVUxMICYmIG1BdWRpb0RlY29kZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmIChpbnN0YW50aWF0ZURlY29kZXIodHJ1ZSwgJm1BdWRpb0RlY29kZXIpID09IC1FV09VTERCTE9DSykgeworICAgICAgICAgICAgICAgICAgICByZXNjYW4gPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFtSGFkQW55U291cmNlc0JlZm9yZQorICAgICAgICAgICAgICAgICAgICAmJiAobUF1ZGlvRGVjb2RlciAhPSBOVUxMIHx8IG1WaWRlb0RlY29kZXIgIT0gTlVMTCkpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlJ3ZlIGZvdW5kIGFueXRoaW5nIHBsYXlhYmxlLgorCisgICAgICAgICAgICAgICAgaWYgKG1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19EWU5BTUlDX0RVUkFUSU9OKSB7CisgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlUG9sbER1cmF0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0dXNfdCBlcnI7CisgICAgICAgICAgICBpZiAoKGVyciA9IG1Tb3VyY2UtPmZlZWRNb3JlVFNEYXRhKCkpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgaWYgKG1BdWRpb0RlY29kZXIgPT0gTlVMTCAmJiBtVmlkZW9EZWNvZGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgbm90IGN1cnJlbnRseSBkZWNvZGluZyBhbnl0aGluZyAobm8gYXVkaW8gb3IKKyAgICAgICAgICAgICAgICAgICAgLy8gdmlkZW8gdHJhY2tzIGZvdW5kKSBhbmQgd2UganVzdCByYW4gb3V0IG9mIGlucHV0IGRhdGEuCisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9QTEFZQkFDS19DT01QTEVURSwgMCwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9FUlJPUiwgTUVESUEyX0VSUk9SX1VOS05PV04sIGVycik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChyZXNjYW4pIHsKKyAgICAgICAgICAgICAgICBtc2ctPnBvc3QoMTAwMDAwbGwpOworICAgICAgICAgICAgICAgIG1TY2FuU291cmNlc1BlbmRpbmcgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0VmlkZW9Ob3RpZnk6CisgICAgICAgIGNhc2Uga1doYXRBdWRpb05vdGlmeToKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbCBhdWRpbyA9IG1zZy0+d2hhdCgpID09IGtXaGF0QXVkaW9Ob3RpZnk7CisKKyAgICAgICAgICAgIGludDMyX3QgY3VycmVudERlY29kZXJHZW5lcmF0aW9uID0KKyAgICAgICAgICAgICAgICAoYXVkaW8/IG1BdWRpb0RlY29kZXJHZW5lcmF0aW9uIDogbVZpZGVvRGVjb2RlckdlbmVyYXRpb24pOworICAgICAgICAgICAgaW50MzJfdCByZXF1ZXN0ZXJHZW5lcmF0aW9uID0gY3VycmVudERlY29kZXJHZW5lcmF0aW9uIC0gMTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJnJlcXVlc3RlckdlbmVyYXRpb24pKTsKKworICAgICAgICAgICAgaWYgKHJlcXVlc3RlckdlbmVyYXRpb24gIT0gY3VycmVudERlY29kZXJHZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImdvdCBtZXNzYWdlIGZyb20gb2xkICVzIGRlY29kZXIsIGdlbmVyYXRpb24oJWQ6JWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIsIHJlcXVlc3RlckdlbmVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RGVjb2RlckdlbmVyYXRpb24pOworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseTsKKyAgICAgICAgICAgICAgICBpZiAoIShtc2ctPmZpbmRNZXNzYWdlKCJyZXBseSIsICZyZXBseSkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXBseS0+c2V0SW50MzIoImVyciIsIElORk9fRElTQ09OVElOVUlUWSk7CisgICAgICAgICAgICAgICAgcmVwbHktPnBvc3QoKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludDMyX3Qgd2hhdDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ3aGF0IiwgJndoYXQpKTsKKworICAgICAgICAgICAgaWYgKHdoYXQgPT0gRGVjb2RlckJhc2U6OmtXaGF0SW5wdXREaXNjb250aW51aXR5KSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBmb3JtYXRDaGFuZ2U7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImZvcm1hdENoYW5nZSIsICZmb3JtYXRDaGFuZ2UpKTsKKworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBkaXNjb250aW51aXR5OiBmb3JtYXRDaGFuZ2UgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIiwgZm9ybWF0Q2hhbmdlKTsKKworICAgICAgICAgICAgICAgIGlmIChmb3JtYXRDaGFuZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZsdXNoRGVjb2RlckFjdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gPyBGTFVTSF9DTURfU0hVVERPV04gOiBGTFVTSF9DTURfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gPyBGTFVTSF9DTURfTk9ORSA6IEZMVVNIX0NNRF9TSFVURE9XTikpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUFjdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk51UGxheWVyMjo6cGVyZm9ybVNjYW5Tb3VyY2VzKSk7CisKKyAgICAgICAgICAgICAgICBwcm9jZXNzRGVmZXJyZWRBY3Rpb25zKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gRGVjb2RlckJhc2U6OmtXaGF0RU9TKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBlcnI7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiZ290ICVzIGRlY29kZXIgRU9TIiwgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImdvdCAlcyBkZWNvZGVyIEVPUyB3LyBlcnJvciAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1SZW5kZXJlci0+cXVldWVFT1MoYXVkaW8sIGVycik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gRGVjb2RlckJhc2U6OmtXaGF0Rmx1c2hDb21wbGV0ZWQpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiZGVjb2RlciAlcyBmbHVzaCBjb21wbGV0ZWQiLCBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKKworICAgICAgICAgICAgICAgIGhhbmRsZUZsdXNoQ29tcGxldGUoYXVkaW8sIHRydWUgLyogaXNEZWNvZGVyICovKTsKKyAgICAgICAgICAgICAgICBmaW5pc2hGbHVzaElmUG9zc2libGUoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBEZWNvZGVyQmFzZTo6a1doYXRWaWRlb1NpemVDaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdDsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJmb3JtYXQiLCAmZm9ybWF0KSk7CisKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gaW5wdXRGb3JtYXQgPQorICAgICAgICAgICAgICAgICAgICAgICAgbVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKTsKKworICAgICAgICAgICAgICAgIHNldFZpZGVvU2NhbGluZ01vZGUobVZpZGVvU2NhbGluZ01vZGUpOworICAgICAgICAgICAgICAgIHVwZGF0ZVZpZGVvU2l6ZShtU3JjSWQsIGlucHV0Rm9ybWF0LCBmb3JtYXQpOworICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IERlY29kZXJCYXNlOjprV2hhdFNodXRkb3duQ29tcGxldGVkKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIHNodXRkb3duIGNvbXBsZXRlZCIsIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOworICAgICAgICAgICAgICAgIGlmIChhdWRpbykgeworICAgICAgICAgICAgICAgICAgICBtQXVkaW9EZWNvZGVyLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIG1BdWRpb0RlY29kZXJFcnJvciA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICArK21BdWRpb0RlY29kZXJHZW5lcmF0aW9uOworCisgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKChpbnQpbUZsdXNoaW5nQXVkaW8sIChpbnQpU0hVVFRJTkdfRE9XTl9ERUNPREVSKTsKKyAgICAgICAgICAgICAgICAgICAgbUZsdXNoaW5nQXVkaW8gPSBTSFVUX0RPV047CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbVZpZGVvRGVjb2Rlci5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICBtVmlkZW9EZWNvZGVyRXJyb3IgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgKyttVmlkZW9EZWNvZGVyR2VuZXJhdGlvbjsKKworICAgICAgICAgICAgICAgICAgICBDSEVDS19FUSgoaW50KW1GbHVzaGluZ1ZpZGVvLCAoaW50KVNIVVRUSU5HX0RPV05fREVDT0RFUik7CisgICAgICAgICAgICAgICAgICAgIG1GbHVzaGluZ1ZpZGVvID0gU0hVVF9ET1dOOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZpbmlzaEZsdXNoSWZQb3NzaWJsZSgpOworICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IERlY29kZXJCYXNlOjprV2hhdFJlc3VtZUNvbXBsZXRlZCkgeworICAgICAgICAgICAgICAgIGZpbmlzaFJlc3VtZSgpOworICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IERlY29kZXJCYXNlOjprV2hhdEVycm9yKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyOworICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpIHx8IGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICBlcnIgPSBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIERlY29kZXIgZXJyb3JzIGNhbiBiZSBkdWUgdG8gU291cmNlIChlLmcuIGZyb20gc3RyZWFtaW5nKSwKKyAgICAgICAgICAgICAgICAvLyBvciBmcm9tIGRlY29kaW5nIGNvcnJ1cHRlZCBiaXRzdHJlYW1zLCBvciBmcm9tIG90aGVyIGRlY29kZXIKKyAgICAgICAgICAgICAgICAvLyBNZWRpYUNvZGVjIG9wZXJhdGlvbnMgKGUuZy4gZnJvbSBhbiBvbmdvaW5nIHJlc2V0IG9yIHNlZWspLgorICAgICAgICAgICAgICAgIC8vIFRoZXkgbWF5IGFsc28gYmUgZHVlIHRvIG9wZW5BdWRpb1NpbmsgZmFpbHVyZSBhdAorICAgICAgICAgICAgICAgIC8vIGRlY29kZXIgc3RhcnQgb3IgYWZ0ZXIgYSBmb3JtYXQgY2hhbmdlLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gV2UgdHJ5IHRvIGdyYWNlZnVsbHkgc2h1dCBkb3duIHRoZSBhZmZlY3RlZCBkZWNvZGVyIGlmIHBvc3NpYmxlLAorICAgICAgICAgICAgICAgIC8vIHJhdGhlciB0aGFuIHRyeWluZyB0byBmb3JjZSB0aGUgc2h1dGRvd24gd2l0aCBzb21ldGhpbmcKKyAgICAgICAgICAgICAgICAvLyBzaW1pbGFyIHRvIHBlcmZvcm1SZXNldCgpLiBUaGlzIG1ldGhvZCBjYW4gbGVhZCB0byBhIGhhbmcKKyAgICAgICAgICAgICAgICAvLyBpZiBNZWRpYUNvZGVjIGZ1bmN0aW9ucyBibG9jayBhZnRlciBhbiBlcnJvciwgYnV0IHRoZXkgc2hvdWxkCisgICAgICAgICAgICAgICAgLy8gdHlwaWNhbGx5IHJldHVybiBJTlZBTElEX09QRVJBVElPTiBpbnN0ZWFkIG9mIGJsb2NraW5nLgorCisgICAgICAgICAgICAgICAgRmx1c2hTdGF0dXMgKmZsdXNoaW5nID0gYXVkaW8gPyAmbUZsdXNoaW5nQXVkaW8gOiAmbUZsdXNoaW5nVmlkZW87CisgICAgICAgICAgICAgICAgQUxPR0UoInJlY2VpdmVkIGVycm9yKCUjeCkgZnJvbSAlcyBkZWNvZGVyLCBmbHVzaGluZyglZCksIG5vdyBzaHV0dGluZyBkb3duIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyciwgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIiwgKmZsdXNoaW5nKTsKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoKmZsdXNoaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTk9ORToKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmx1c2hEZWNvZGVyQWN0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gPyBGTFVTSF9DTURfU0hVVERPV04gOiBGTFVTSF9DTURfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvID8gRkxVU0hfQ01EX05PTkUgOiBGTFVTSF9DTURfU0hVVERPV04pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NEZWZlcnJlZEFjdGlvbnMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEZMVVNISU5HX0RFQ09ERVI6CisgICAgICAgICAgICAgICAgICAgICAgICAqZmx1c2hpbmcgPSBGTFVTSElOR19ERUNPREVSX1NIVVRET1dOOyAvLyBpbml0aWF0ZSBzaHV0ZG93biBhZnRlciBmbHVzaC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBXYWl0IGZvciBmbHVzaCB0byBjb21wbGV0ZS4KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGTFVTSElOR19ERUNPREVSX1NIVVRET1dOOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIFdhaXQgZm9yIGZsdXNoIHRvIGNvbXBsZXRlLgorICAgICAgICAgICAgICAgICAgICBjYXNlIFNIVVRUSU5HX0RPV05fREVDT0RFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBXYWl0IGZvciBzaHV0ZG93biB0byBjb21wbGV0ZS4KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGTFVTSEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGVjb2RlcihhdWRpbyktPmluaXRpYXRlU2h1dGRvd24oKTsgLy8gSW4gdGhlIG1pZGRsZSBvZiBhIHNlZWsuCisgICAgICAgICAgICAgICAgICAgICAgICAqZmx1c2hpbmcgPSBTSFVUVElOR19ET1dOX0RFQ09ERVI7ICAgICAvLyBTaHV0IGRvd24uCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTSFVUX0RPV046CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hGbHVzaElmUG9zc2libGUoKTsgIC8vIFNob3VsZCBub3Qgb2NjdXIuCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgIC8vIEZpbmlzaCBhbnl3YXlzLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobVNvdXJjZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChhdWRpbykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1WaWRlb0RlY29kZXJFcnJvciB8fCBtU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pID09IE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbU5hdGl2ZVdpbmRvdyA9PSBOVUxMIHx8IG1OYXRpdmVXaW5kb3ctPmdldEFOYXRpdmVXaW5kb3coKSA9PSBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1WaWRlb0RlY29kZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gYm90aCBhdWRpbyBhbmQgdmlkZW8gaGF2ZSBlcnJvciwgb3IgdGhpcyBzdHJlYW0gaGFzIG9ubHkgYXVkaW8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCBoYXMgZXJyb3IsIG5vdGlmeSBjbGllbnQgb2YgZXJyb3IuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfRVJST1IsIE1FRElBMl9FUlJPUl9VTktOT1dOLCBlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGF1ZGlvIHRyYWNrIGhhcyBlcnJvci4gVmlkZW8gdHJhY2sgY291bGQgYmUgc3RpbGwgZ29vZCB0byBwbGF5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX0lORk8sIE1FRElBMl9JTkZPX1BMQVlfQVVESU9fRVJST1IsIGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9EZWNvZGVyRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1BdWRpb0RlY29kZXJFcnJvciB8fCBtU291cmNlLT5nZXRGb3JtYXQodHJ1ZSAvKiBhdWRpbyAqLykgPT0gTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtQXVkaW9TaW5rID09IE5VTEwgfHwgbUF1ZGlvRGVjb2RlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBib3RoIGF1ZGlvIGFuZCB2aWRlbyBoYXZlIGVycm9yLCBvciB0aGlzIHN0cmVhbSBoYXMgb25seSB2aWRlbworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGhhcyBlcnJvciwgbm90aWZ5IGNsaWVudCBvZiBlcnJvci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9FUlJPUiwgTUVESUEyX0VSUk9SX1VOS05PV04sIGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgdmlkZW8gdHJhY2sgaGFzIGVycm9yLiBBdWRpbyB0cmFjayBjb3VsZCBiZSBzdGlsbCBnb29kIHRvIHBsYXkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfSU5GTywgTUVESUEyX0lORk9fUExBWV9WSURFT19FUlJPUiwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1WaWRlb0RlY29kZXJFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dWKCJVbmhhbmRsZWQgZGVjb2RlciBub3RpZmljYXRpb24gJWQgJyVjJWMlYyVjJy4iLAorICAgICAgICAgICAgICAgICAgICAgIHdoYXQsCisgICAgICAgICAgICAgICAgICAgICAgd2hhdCA+PiAyNCwKKyAgICAgICAgICAgICAgICAgICAgICAod2hhdCA+PiAxNikgJiAweGZmLAorICAgICAgICAgICAgICAgICAgICAgICh3aGF0ID4+IDgpICYgMHhmZiwKKyAgICAgICAgICAgICAgICAgICAgICB3aGF0ICYgMHhmZik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFJlbmRlcmVyTm90aWZ5OgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IHJlcXVlc3RlckdlbmVyYXRpb24gPSBtUmVuZGVyZXJHZW5lcmF0aW9uIC0gMTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJnJlcXVlc3RlckdlbmVyYXRpb24pKTsKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0ZXJHZW5lcmF0aW9uICE9IG1SZW5kZXJlckdlbmVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiZ290IG1lc3NhZ2UgZnJvbSBvbGQgcmVuZGVyZXIsIGdlbmVyYXRpb24oJWQ6JWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlckdlbmVyYXRpb24sIG1SZW5kZXJlckdlbmVyYXRpb24pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50MzJfdCB3aGF0OworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoIndoYXQiLCAmd2hhdCkpOworCisgICAgICAgICAgICBpZiAod2hhdCA9PSBSZW5kZXJlcjo6a1doYXRFT1MpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGF1ZGlvOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJhdWRpbyIsICZhdWRpbykpOworCisgICAgICAgICAgICAgICAgaW50MzJfdCBmaW5hbFJlc3VsdDsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZmluYWxSZXN1bHQiLCAmZmluYWxSZXN1bHQpKTsKKworICAgICAgICAgICAgICAgIGlmIChhdWRpbykgeworICAgICAgICAgICAgICAgICAgICBtQXVkaW9FT1MgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1WaWRlb0VPUyA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGZpbmFsUmVzdWx0ID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoInJlYWNoZWQgJXMgRU9TIiwgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzIHRyYWNrIGVuY291bnRlcmVkIGFuIGVycm9yICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIsIGZpbmFsUmVzdWx0KTsKKworICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3JjSWQsIE1FRElBMl9FUlJPUiwgTUVESUEyX0VSUk9SX1VOS05PV04sIGZpbmFsUmVzdWx0KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKG1BdWRpb0VPUyB8fCBtQXVkaW9EZWNvZGVyID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAobVZpZGVvRU9TIHx8IG1WaWRlb0RlY29kZXIgPT0gTlVMTCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfUExBWUJBQ0tfQ09NUExFVEUsIDAsIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBSZW5kZXJlcjo6a1doYXRGbHVzaENvbXBsZXRlKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBhdWRpbzsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYXVkaW8iLCAmYXVkaW8pKTsKKworICAgICAgICAgICAgICAgIGlmIChhdWRpbykgeworICAgICAgICAgICAgICAgICAgICBtQXVkaW9FT1MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtVmlkZW9FT1MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBBTE9HVigicmVuZGVyZXIgJXMgZmx1c2ggY29tcGxldGVkLiIsIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOworICAgICAgICAgICAgICAgIGlmIChhdWRpbyAmJiAobUZsdXNoaW5nQXVkaW8gPT0gTk9ORSB8fCBtRmx1c2hpbmdBdWRpbyA9PSBGTFVTSEVECisgICAgICAgICAgICAgICAgICAgICAgICB8fCBtRmx1c2hpbmdBdWRpbyA9PSBTSFVUX0RPV04pKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZsdXNoIGhhcyBiZWVuIGhhbmRsZWQgYnkgdGVhciBkb3duLgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaGFuZGxlRmx1c2hDb21wbGV0ZShhdWRpbywgZmFsc2UgLyogaXNEZWNvZGVyICovKTsKKyAgICAgICAgICAgICAgICBmaW5pc2hGbHVzaElmUG9zc2libGUoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBSZW5kZXJlcjo6a1doYXRWaWRlb1JlbmRlcmluZ1N0YXJ0KSB7CisgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfSU5GTywgTUVESUEyX0lORk9fVklERU9fUkVOREVSSU5HX1NUQVJULCAwKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBSZW5kZXJlcjo6a1doYXRNZWRpYVJlbmRlcmluZ1N0YXJ0KSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIm1lZGlhIHJlbmRlcmluZyBzdGFydGVkIik7CisgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfU1RBUlRFRCwgMCwgMCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gUmVuZGVyZXI6OmtXaGF0QXVkaW9UZWFyRG93bikgeworICAgICAgICAgICAgICAgIGludDMyX3QgcmVhc29uOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJyZWFzb24iLCAmcmVhc29uKSk7CisgICAgICAgICAgICAgICAgQUxPR1YoIlRlYXIgZG93biBhdWRpbyB3aXRoIHJlYXNvbiAlZC4iLCByZWFzb24pOworICAgICAgICAgICAgICAgIGlmIChyZWFzb24gPT0gUmVuZGVyZXI6OmtEdWVUb1RpbWVvdXQgJiYgIShtUGF1c2VkICYmIG1PZmZsb2FkQXVkaW8pKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRpbWVvdXRXaGVuUGF1c2VkIGlzIG9ubHkgZm9yIG9mZmxvYWQgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIlJlY2VpdmUgYSBzdGFsZSBtZXNzYWdlIGZvciB0ZWFyZG93bi4iKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludDY0X3QgcG9zaXRpb25VczsKKyAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDY0KCJwb3NpdGlvblVzIiwgJnBvc2l0aW9uVXMpKSB7CisgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uVXMgPSBtUHJldmlvdXNTZWVrVGltZVVzOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJlc3RhcnRBdWRpbygKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uVXMsIHJlYXNvbiA9PSBSZW5kZXJlcjo6a0ZvcmNlTm9uT2ZmbG9hZCAvKiBmb3JjZU5vbk9mZmxvYWQgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICByZWFzb24gIT0gUmVuZGVyZXI6OmtEdWVUb1RpbWVvdXQgLyogbmVlZHNUb0NyZWF0ZUF1ZGlvRGVjb2RlciAqLyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRNb3JlRGF0YVF1ZXVlZDoKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0UmVzZXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIEFMT0dWKCJrV2hhdFJlc2V0Iik7CisKKyAgICAgICAgICAgIG1SZXNldHRpbmcgPSB0cnVlOworICAgICAgICAgICAgc3RvcFBsYXliYWNrVGltZXIoImtXaGF0UmVzZXQiKTsKKyAgICAgICAgICAgIHN0b3BSZWJ1ZmZlcmluZ1RpbWVyKHRydWUpOworCisgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgbmV3IEZsdXNoRGVjb2RlckFjdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIEZMVVNIX0NNRF9TSFVURE9XTiAvKiBhdWRpbyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIEZMVVNIX0NNRF9TSFVURE9XTiAvKiB2aWRlbyAqLykpOworCisgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUFjdGlvbigmTnVQbGF5ZXIyOjpwZXJmb3JtUmVzZXQpKTsKKworICAgICAgICAgICAgcHJvY2Vzc0RlZmVycmVkQWN0aW9ucygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0Tm90aWZ5VGltZToKKyAgICAgICAgeworICAgICAgICAgICAgQUxPR1YoImtXaGF0Tm90aWZ5VGltZSIpOworICAgICAgICAgICAgaW50NjRfdCB0aW1lclVzOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInRpbWVyVXMiLCAmdGltZXJVcykpOworCisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9OT1RJRllfVElNRSwgdGltZXJVcywgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRTZWVrOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CisgICAgICAgICAgICBpbnQzMl90IG1vZGU7CisgICAgICAgICAgICBpbnQzMl90IG5lZWROb3RpZnk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgic2Vla1RpbWVVcyIsICZzZWVrVGltZVVzKSk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigibW9kZSIsICZtb2RlKSk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigibmVlZE5vdGlmeSIsICZuZWVkTm90aWZ5KSk7CisKKyAgICAgICAgICAgIEFMT0dWKCJrV2hhdFNlZWsgc2Vla1RpbWVVcz0lbGxkIHVzLCBtb2RlPSVkLCBuZWVkTm90aWZ5PSVkIiwKKyAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylzZWVrVGltZVVzLCBtb2RlLCBuZWVkTm90aWZ5KTsKKworICAgICAgICAgICAgaWYgKCFtU3RhcnRlZCkgeworICAgICAgICAgICAgICAgIGlmICghbVNvdXJjZVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNvdXJjZVN0YXJ0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBtU291cmNlLT5zdGFydCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc2Vla1RpbWVVcyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcGVyZm9ybVNlZWsoc2Vla1RpbWVVcywgKE1lZGlhUGxheWVyMlNlZWtNb2RlKW1vZGUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChuZWVkTm90aWZ5KSB7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeURyaXZlclNlZWtDb21wbGV0ZShtU3JjSWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gc2Vla3MgY2FuIHRha2UgYSB3aGlsZSwgc28gd2UgZXNzZW50aWFsbHkgcGF1c2VkCisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9QQVVTRUQsIDAsIDApOworCisgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgbmV3IEZsdXNoRGVjb2RlckFjdGlvbihGTFVTSF9DTURfRkxVU0ggLyogYXVkaW8gKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxVU0hfQ01EX0ZMVVNIIC8qIHZpZGVvICovKSk7CisKKyAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICBuZXcgU2Vla0FjdGlvbihzZWVrVGltZVVzLCAoTWVkaWFQbGF5ZXIyU2Vla01vZGUpbW9kZSkpOworCisgICAgICAgICAgICAvLyBBZnRlciBhIGZsdXNoIHdpdGhvdXQgc2h1dGRvd24sIGRlY29kZXIgaXMgcGF1c2VkLgorICAgICAgICAgICAgLy8gRG9uJ3QgcmVzdW1lIGl0IHVudGlsIHNvdXJjZSBzZWVrIGlzIGRvbmUsIG90aGVyd2lzZSBpdCBjb3VsZAorICAgICAgICAgICAgLy8gc3RhcnQgcHVsbGluZyBzdGFsZSBkYXRhIHRvbyBzb29uLgorICAgICAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgIG5ldyBSZXN1bWVEZWNvZGVyQWN0aW9uKG5lZWROb3RpZnkpKTsKKworICAgICAgICAgICAgcHJvY2Vzc0RlZmVycmVkQWN0aW9ucygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0UGF1c2U6CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uUGF1c2UoKTsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX1BBVVNFRCwgMCwgMCk7CisgICAgICAgICAgICBtUGF1c2VkQnlDbGllbnQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0U291cmNlTm90aWZ5OgorICAgICAgICB7CisgICAgICAgICAgICBvblNvdXJjZU5vdGlmeShtc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0Q2xvc2VkQ2FwdGlvbk5vdGlmeToKKyAgICAgICAgeworICAgICAgICAgICAgb25DbG9zZWRDYXB0aW9uTm90aWZ5KG1zZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRQcmVwYXJlRHJtOgorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBvblByZXBhcmVEcm0obXNnKTsKKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJzdGF0dXMiLCBzdGF0dXMpOworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0UmVsZWFzZURybToKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gb25SZWxlYXNlRHJtKCk7CisKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigic3RhdHVzIiwgc3RhdHVzKTsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpvblJlc3VtZSgpIHsKKyAgICBpZiAoIW1QYXVzZWQgfHwgbVJlc2V0dGluZykgeworICAgICAgICBBTE9HRF9JRihtUmVzZXR0aW5nLCAicmVzZXR0aW5nLCBvblJlc3VtZSBkaXNjYXJkZWQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtUGF1c2VkID0gZmFsc2U7CisgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBtU291cmNlLT5yZXN1bWUoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVygicmVzdW1lIGNhbGxlZCB3aGVuIHNvdXJjZSBpcyBnb25lIG9yIG5vdCBzZXQiKTsKKyAgICB9CisgICAgLy8gfG1BdWRpb0RlY29kZXJ8IG1heSBoYXZlIGJlZW4gcmVsZWFzZWQgZHVlIHRvIHRoZSBwYXVzZSB0aW1lb3V0LCBzbyByZS1jcmVhdGUgaXQgaWYKKyAgICAvLyBuZWVkZWQuCisgICAgaWYgKGF1ZGlvRGVjb2RlclN0aWxsTmVlZGVkKCkgJiYgbUF1ZGlvRGVjb2RlciA9PSBOVUxMKSB7CisgICAgICAgIGluc3RhbnRpYXRlRGVjb2Rlcih0cnVlIC8qIGF1ZGlvICovLCAmbUF1ZGlvRGVjb2Rlcik7CisgICAgfQorICAgIGlmIChtUmVuZGVyZXIgIT0gTlVMTCkgeworICAgICAgICBtUmVuZGVyZXItPnJlc3VtZSgpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dXKCJyZXN1bWUgY2FsbGVkIHdoZW4gcmVuZGVyZXIgaXMgZ29uZSBvciBub3Qgc2V0Iik7CisgICAgfQorCisgICAgc3RhcnRQbGF5YmFja1RpbWVyKCJvbnJlc3VtZSIpOworfQorCit2b2lkIE51UGxheWVyMjo6b25TdGFydCgpIHsKKyAgICBBTE9HVigib25TdGFydDogbUNyeXB0bzogJXAiLCBtQ3J5cHRvLmdldCgpKTsKKworICAgIGlmICghbVNvdXJjZVN0YXJ0ZWQpIHsKKyAgICAgICAgbVNvdXJjZVN0YXJ0ZWQgPSB0cnVlOworICAgICAgICBtU291cmNlLT5zdGFydCgpOworICAgIH0KKworICAgIG1PZmZsb2FkQXVkaW8gPSBmYWxzZTsKKyAgICBtQXVkaW9FT1MgPSBmYWxzZTsKKyAgICBtVmlkZW9FT1MgPSBmYWxzZTsKKyAgICBtU3RhcnRlZCA9IHRydWU7CisgICAgbVBhdXNlZCA9IGZhbHNlOworCisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworCisgICAgaWYgKG1Tb3VyY2UtPmlzUmVhbFRpbWUoKSkgeworICAgICAgICBmbGFncyB8PSBSZW5kZXJlcjo6RkxBR19SRUFMX1RJTUU7CisgICAgfQorCisgICAgYm9vbCBoYXNBdWRpbyA9IChtU291cmNlLT5nZXRGb3JtYXQodHJ1ZSAvKiBhdWRpbyAqLykgIT0gTlVMTCk7CisgICAgYm9vbCBoYXNWaWRlbyA9IChtU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pICE9IE5VTEwpOworICAgIGlmICghaGFzQXVkaW8gJiYgIWhhc1ZpZGVvKSB7CisgICAgICAgIEFMT0dFKCJubyBtZXRhZGF0YSBmb3IgZWl0aGVyIGF1ZGlvIG9yIHZpZGVvIHNvdXJjZSIpOworICAgICAgICBtU291cmNlLT5zdG9wKCk7CisgICAgICAgIG1Tb3VyY2VTdGFydGVkID0gZmFsc2U7CisgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX0VSUk9SLCBNRURJQTJfRVJST1JfVU5LTk9XTiwgRVJST1JfTUFMRk9STUVEKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HVl9JRighaGFzQXVkaW8sICJubyBtZXRhZGF0YSBmb3IgYXVkaW8gc291cmNlIik7ICAvLyB2aWRlbyBvbmx5IHN0cmVhbQorCisgICAgc3A8TWV0YURhdGE+IGF1ZGlvTWV0YSA9IG1Tb3VyY2UtPmdldEZvcm1hdE1ldGEodHJ1ZSAvKiBhdWRpbyAqLyk7CisKKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fTVVTSUM7CisgICAgaWYgKG1BdWRpb1NpbmsgIT0gTlVMTCkgeworICAgICAgICBzdHJlYW1UeXBlID0gbUF1ZGlvU2luay0+Z2V0QXVkaW9TdHJlYW1UeXBlKCk7CisgICAgfQorCisgICAgbU9mZmxvYWRBdWRpbyA9CisgICAgICAgIGNhbk9mZmxvYWRTdHJlYW0oYXVkaW9NZXRhLCBoYXNWaWRlbywgbVNvdXJjZS0+aXNTdHJlYW1pbmcoKSwgc3RyZWFtVHlwZSkKKyAgICAgICAgICAgICAgICAmJiAobVBsYXliYWNrU2V0dGluZ3MubVNwZWVkID09IDEuZiAmJiBtUGxheWJhY2tTZXR0aW5ncy5tUGl0Y2ggPT0gMS5mKTsKKworICAgIC8vIE1vZHVsYXIgRFJNOiBEaXNhYmxpbmcgYXVkaW8gb2ZmbG9hZCBpZiB0aGUgc291cmNlIGlzIHByb3RlY3RlZAorICAgIGlmIChtT2ZmbG9hZEF1ZGlvICYmIG1Jc0RybVByb3RlY3RlZCkgeworICAgICAgICBtT2ZmbG9hZEF1ZGlvID0gZmFsc2U7CisgICAgICAgIEFMT0dWKCJvblN0YXJ0OiBEaXNhYmxpbmcgbU9mZmxvYWRBdWRpbyBub3cgdGhhdCB0aGUgc291cmNlIGlzIHByb3RlY3RlZC4iKTsKKyAgICB9CisKKyAgICBpZiAobU9mZmxvYWRBdWRpbykgeworICAgICAgICBmbGFncyB8PSBSZW5kZXJlcjo6RkxBR19PRkZMT0FEX0FVRElPOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZW5kZXJlck5vdGlmeSwgdGhpcyk7CisgICAgKyttUmVuZGVyZXJHZW5lcmF0aW9uOworICAgIG5vdGlmeS0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtUmVuZGVyZXJHZW5lcmF0aW9uKTsKKyAgICBtUmVuZGVyZXIgPSBuZXcgUmVuZGVyZXIobUF1ZGlvU2luaywgbU1lZGlhQ2xvY2ssIG5vdGlmeSwgZmxhZ3MpOworICAgIG1SZW5kZXJlckxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgIG1SZW5kZXJlckxvb3Blci0+c2V0TmFtZSgiTnVQbGF5ZXJSZW5kZXJlciIpOworICAgIG1SZW5kZXJlckxvb3Blci0+c3RhcnQoZmFsc2UsIGZhbHNlLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKKyAgICBtUmVuZGVyZXJMb29wZXItPnJlZ2lzdGVySGFuZGxlcihtUmVuZGVyZXIpOworCisgICAgc3RhdHVzX3QgZXJyID0gbVJlbmRlcmVyLT5zZXRQbGF5YmFja1NldHRpbmdzKG1QbGF5YmFja1NldHRpbmdzKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgbVNvdXJjZVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfRVJST1IsIE1FRElBMl9FUlJPUl9VTktOT1dOLCBlcnIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZmxvYXQgcmF0ZSA9IGdldEZyYW1lUmF0ZSgpOworICAgIGlmIChyYXRlID4gMCkgeworICAgICAgICBtUmVuZGVyZXItPnNldFZpZGVvRnJhbWVSYXRlKHJhdGUpOworICAgIH0KKworICAgIGlmIChtVmlkZW9EZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgbVZpZGVvRGVjb2Rlci0+c2V0UmVuZGVyZXIobVJlbmRlcmVyKTsKKyAgICB9CisgICAgaWYgKG1BdWRpb0RlY29kZXIgIT0gTlVMTCkgeworICAgICAgICBtQXVkaW9EZWNvZGVyLT5zZXRSZW5kZXJlcihtUmVuZGVyZXIpOworICAgIH0KKworICAgIHN0YXJ0UGxheWJhY2tUaW1lcigib25zdGFydCIpOworCisgICAgcG9zdFNjYW5Tb3VyY2VzKCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpzdGFydFBsYXliYWNrVGltZXIoY29uc3QgY2hhciAqd2hlcmUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVBsYXlpbmdUaW1lTG9jayk7CisgICAgaWYgKG1MYXN0U3RhcnRlZFBsYXlpbmdUaW1lTnMgPT0gMCkgeworICAgICAgICBtTGFzdFN0YXJ0ZWRQbGF5aW5nVGltZU5zID0gc3lzdGVtVGltZSgpOworICAgICAgICBBTE9HVigic3RhcnRQbGF5YmFja1RpbWVyKCkgdGltZSAlMjAiIFBSSWQ2NCAiICglcykiLCAgbUxhc3RTdGFydGVkUGxheWluZ1RpbWVOcywgd2hlcmUpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OnN0b3BQbGF5YmFja1RpbWVyKGNvbnN0IGNoYXIgKndoZXJlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1QbGF5aW5nVGltZUxvY2spOworCisgICAgQUxPR1YoInN0b3BQbGF5YmFja1RpbWVyKCkgIHRpbWUgJTIwIiBQUklkNjQgIiAoJXMpIiwgbUxhc3RTdGFydGVkUGxheWluZ1RpbWVOcywgd2hlcmUpOworCisgICAgaWYgKG1MYXN0U3RhcnRlZFBsYXlpbmdUaW1lTnMgIT0gMCkgeworICAgICAgICBzcDxOdVBsYXllcjJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOworICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGludDY0X3Qgbm93ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgICAgaW50NjRfdCBwbGF5ZWQgPSBub3cgLSBtTGFzdFN0YXJ0ZWRQbGF5aW5nVGltZU5zOworICAgICAgICAgICAgQUxPR1YoInN0b3BQbGF5YmFja1RpbWVyKCkgIGxvZyAgJTIwIiBQUklkNjQgIiIsIHBsYXllZCk7CisKKyAgICAgICAgICAgIGlmIChwbGF5ZWQgPiAwKSB7CisgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlNb3JlUGxheWluZ1RpbWVVcyhtU3JjSWQsIChwbGF5ZWQrNTAwKS8xMDAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtTGFzdFN0YXJ0ZWRQbGF5aW5nVGltZU5zID0gMDsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpzdGFydFJlYnVmZmVyaW5nVGltZXIoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1QbGF5aW5nVGltZUxvY2spOworICAgIGlmIChtTGFzdFN0YXJ0ZWRSZWJ1ZmZlcmluZ1RpbWVOcyA9PSAwKSB7CisgICAgICAgIG1MYXN0U3RhcnRlZFJlYnVmZmVyaW5nVGltZU5zID0gc3lzdGVtVGltZSgpOworICAgICAgICBBTE9HVigic3RhcnRSZWJ1ZmZlcmluZ1RpbWVyKCkgdGltZSAlMjAiIFBSSWQ2NCAiIiwgIG1MYXN0U3RhcnRlZFJlYnVmZmVyaW5nVGltZU5zKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpzdG9wUmVidWZmZXJpbmdUaW1lcihib29sIGV4aXRpbmdQbGF5YmFjaykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtUGxheWluZ1RpbWVMb2NrKTsKKworICAgIEFMT0dWKCJzdG9wUmVidWZmZXJUaW1lcigpICB0aW1lICUyMCIgUFJJZDY0ICIgKGV4aXRpbmcgJWQpIiwgbUxhc3RTdGFydGVkUmVidWZmZXJpbmdUaW1lTnMsIGV4aXRpbmdQbGF5YmFjayk7CisKKyAgICBpZiAobUxhc3RTdGFydGVkUmVidWZmZXJpbmdUaW1lTnMgIT0gMCkgeworICAgICAgICBzcDxOdVBsYXllcjJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOworICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGludDY0X3Qgbm93ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgICAgaW50NjRfdCByZWJ1ZmZlcmVkID0gbm93IC0gbUxhc3RTdGFydGVkUmVidWZmZXJpbmdUaW1lTnM7CisgICAgICAgICAgICBBTE9HVigic3RvcFJlYnVmZmVyaW5nVGltZXIoKSAgbG9nICAlMjAiIFBSSWQ2NCAiIiwgcmVidWZmZXJlZCk7CisKKyAgICAgICAgICAgIGlmIChyZWJ1ZmZlcmVkID4gMCkgeworICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5TW9yZVJlYnVmZmVyaW5nVGltZVVzKG1TcmNJZCwgKHJlYnVmZmVyZWQrNTAwKS8xMDAwKTsKKyAgICAgICAgICAgICAgICBpZiAoZXhpdGluZ1BsYXliYWNrKSB7CisgICAgICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5UmVidWZmZXJpbmdXaGVuRXhpdChtU3JjSWQsIHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtTGFzdFN0YXJ0ZWRSZWJ1ZmZlcmluZ1RpbWVOcyA9IDA7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6b25QYXVzZSgpIHsKKworICAgIHN0b3BQbGF5YmFja1RpbWVyKCJvblBhdXNlIik7CisKKyAgICBpZiAobVBhdXNlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1QYXVzZWQgPSB0cnVlOworICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgbVNvdXJjZS0+cGF1c2UoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVygicGF1c2UgY2FsbGVkIHdoZW4gc291cmNlIGlzIGdvbmUgb3Igbm90IHNldCIpOworICAgIH0KKyAgICBpZiAobVJlbmRlcmVyICE9IE5VTEwpIHsKKyAgICAgICAgbVJlbmRlcmVyLT5wYXVzZSgpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dXKCJwYXVzZSBjYWxsZWQgd2hlbiByZW5kZXJlciBpcyBnb25lIG9yIG5vdCBzZXQiKTsKKyAgICB9CisKK30KKworYm9vbCBOdVBsYXllcjI6OmF1ZGlvRGVjb2RlclN0aWxsTmVlZGVkKCkgeworICAgIC8vIEF1ZGlvIGRlY29kZXIgaXMgbm8gbG9uZ2VyIG5lZWRlZCBpZiBpdCdzIGluIHNodXQvc2h1dHRpbmcgZG93biBzdGF0dXMuCisgICAgcmV0dXJuICgobUZsdXNoaW5nQXVkaW8gIT0gU0hVVF9ET1dOKSAmJiAobUZsdXNoaW5nQXVkaW8gIT0gU0hVVFRJTkdfRE9XTl9ERUNPREVSKSk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpoYW5kbGVGbHVzaENvbXBsZXRlKGJvb2wgYXVkaW8sIGJvb2wgaXNEZWNvZGVyKSB7CisgICAgLy8gV2Ugd2FpdCBmb3IgYm90aCB0aGUgZGVjb2RlciBmbHVzaCBhbmQgdGhlIHJlbmRlcmVyIGZsdXNoIHRvIGNvbXBsZXRlCisgICAgLy8gYmVmb3JlIGVudGVyaW5nIGVpdGhlciB0aGUgRkxVU0hFRCBvciB0aGUgU0hVVFRJTkdfRE9XTl9ERUNPREVSIHN0YXRlLgorCisgICAgbUZsdXNoQ29tcGxldGVbYXVkaW9dW2lzRGVjb2Rlcl0gPSB0cnVlOworICAgIGlmICghbUZsdXNoQ29tcGxldGVbYXVkaW9dWyFpc0RlY29kZXJdKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBGbHVzaFN0YXR1cyAqc3RhdGUgPSBhdWRpbyA/ICZtRmx1c2hpbmdBdWRpbyA6ICZtRmx1c2hpbmdWaWRlbzsKKyAgICBzd2l0Y2ggKCpzdGF0ZSkgeworICAgICAgICBjYXNlIEZMVVNISU5HX0RFQ09ERVI6CisgICAgICAgIHsKKyAgICAgICAgICAgICpzdGF0ZSA9IEZMVVNIRUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRkxVU0hJTkdfREVDT0RFUl9TSFVURE9XTjoKKyAgICAgICAgeworICAgICAgICAgICAgKnN0YXRlID0gU0hVVFRJTkdfRE9XTl9ERUNPREVSOworCisgICAgICAgICAgICBBTE9HVigiaW5pdGlhdGluZyAlcyBkZWNvZGVyIHNodXRkb3duIiwgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CisgICAgICAgICAgICBnZXREZWNvZGVyKGF1ZGlvKS0+aW5pdGlhdGVTaHV0ZG93bigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLy8gZGVjb2RlciBmbHVzaCBjb21wbGV0ZXMgb25seSBvY2N1ciBpbiBhIGZsdXNoaW5nIHN0YXRlLgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihpc0RlY29kZXIsICJkZWNvZGVyIGZsdXNoIGluIGludmFsaWQgc3RhdGUgJWQiLCAqc3RhdGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6ZmluaXNoRmx1c2hJZlBvc3NpYmxlKCkgeworICAgIGlmIChtRmx1c2hpbmdBdWRpbyAhPSBOT05FICYmIG1GbHVzaGluZ0F1ZGlvICE9IEZMVVNIRUQKKyAgICAgICAgICAgICYmIG1GbHVzaGluZ0F1ZGlvICE9IFNIVVRfRE9XTikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1GbHVzaGluZ1ZpZGVvICE9IE5PTkUgJiYgbUZsdXNoaW5nVmlkZW8gIT0gRkxVU0hFRAorICAgICAgICAgICAgJiYgbUZsdXNoaW5nVmlkZW8gIT0gU0hVVF9ET1dOKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBTE9HVigiYm90aCBhdWRpbyBhbmQgdmlkZW8gYXJlIGZsdXNoZWQgbm93LiIpOworCisgICAgbUZsdXNoaW5nQXVkaW8gPSBOT05FOworICAgIG1GbHVzaGluZ1ZpZGVvID0gTk9ORTsKKworICAgIGNsZWFyRmx1c2hDb21wbGV0ZSgpOworCisgICAgcHJvY2Vzc0RlZmVycmVkQWN0aW9ucygpOworfQorCit2b2lkIE51UGxheWVyMjo6cG9zdFNjYW5Tb3VyY2VzKCkgeworICAgIGlmIChtU2NhblNvdXJjZXNQZW5kaW5nKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2NhblNvdXJjZXMsIHRoaXMpOworICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtU2NhblNvdXJjZXNHZW5lcmF0aW9uKTsKKyAgICBtc2ctPnBvc3QoKTsKKworICAgIG1TY2FuU291cmNlc1BlbmRpbmcgPSB0cnVlOworfQorCit2b2lkIE51UGxheWVyMjo6dHJ5T3BlbkF1ZGlvU2lua0Zvck9mZmxvYWQoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LCBjb25zdCBzcDxNZXRhRGF0YT4gJmF1ZGlvTWV0YSwgYm9vbCBoYXNWaWRlbykgeworICAgIC8vIE5vdGU6IFRoaXMgaXMgY2FsbGVkIGVhcmx5IGluIE51UGxheWVyMiB0byBkZXRlcm1pbmUgd2hldGhlciBvZmZsb2FkaW5nCisgICAgLy8gaXMgcG9zc2libGU7IG90aGVyd2lzZSB0aGUgZGVjb2RlcnMgY2FsbCB0aGUgcmVuZGVyZXIgb3BlbkF1ZGlvU2luayBkaXJlY3RseS4KKworICAgIHN0YXR1c190IGVyciA9IG1SZW5kZXJlci0+b3BlbkF1ZGlvU2luaygKKyAgICAgICAgICAgIGZvcm1hdCwgdHJ1ZSAvKiBvZmZsb2FkT25seSAqLywgaGFzVmlkZW8sCisgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLCAmbU9mZmxvYWRBdWRpbywgbVNvdXJjZS0+aXNTdHJlYW1pbmcoKSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAvLyBBbnkgZmFpbHVyZSB3ZSB0dXJuIG9mZiBtT2ZmbG9hZEF1ZGlvLgorICAgICAgICBtT2ZmbG9hZEF1ZGlvID0gZmFsc2U7CisgICAgfSBlbHNlIGlmIChtT2ZmbG9hZEF1ZGlvKSB7CisgICAgICAgIHNlbmRNZXRhRGF0YVRvSGFsKG1BdWRpb1NpbmssIGF1ZGlvTWV0YSk7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6Y2xvc2VBdWRpb1NpbmsoKSB7CisgICAgbVJlbmRlcmVyLT5jbG9zZUF1ZGlvU2luaygpOworfQorCit2b2lkIE51UGxheWVyMjo6cmVzdGFydEF1ZGlvKAorICAgICAgICBpbnQ2NF90IGN1cnJlbnRQb3NpdGlvblVzLCBib29sIGZvcmNlTm9uT2ZmbG9hZCwgYm9vbCBuZWVkc1RvQ3JlYXRlQXVkaW9EZWNvZGVyKSB7CisgICAgaWYgKG1BdWRpb0RlY29kZXIgIT0gTlVMTCkgeworICAgICAgICBtQXVkaW9EZWNvZGVyLT5wYXVzZSgpOworICAgICAgICBtQXVkaW9EZWNvZGVyLmNsZWFyKCk7CisgICAgICAgIG1BdWRpb0RlY29kZXJFcnJvciA9IGZhbHNlOworICAgICAgICArK21BdWRpb0RlY29kZXJHZW5lcmF0aW9uOworICAgIH0KKyAgICBpZiAobUZsdXNoaW5nQXVkaW8gPT0gRkxVU0hJTkdfREVDT0RFUikgeworICAgICAgICBtRmx1c2hDb21wbGV0ZVsxIC8qIGF1ZGlvICovXVsxIC8qIGlzRGVjb2RlciAqL10gPSB0cnVlOworICAgICAgICBtRmx1c2hpbmdBdWRpbyA9IEZMVVNIRUQ7CisgICAgICAgIGZpbmlzaEZsdXNoSWZQb3NzaWJsZSgpOworICAgIH0gZWxzZSBpZiAobUZsdXNoaW5nQXVkaW8gPT0gRkxVU0hJTkdfREVDT0RFUl9TSFVURE9XTgorICAgICAgICAgICAgfHwgbUZsdXNoaW5nQXVkaW8gPT0gU0hVVFRJTkdfRE9XTl9ERUNPREVSKSB7CisgICAgICAgIG1GbHVzaENvbXBsZXRlWzEgLyogYXVkaW8gKi9dWzEgLyogaXNEZWNvZGVyICovXSA9IHRydWU7CisgICAgICAgIG1GbHVzaGluZ0F1ZGlvID0gU0hVVF9ET1dOOworICAgICAgICBmaW5pc2hGbHVzaElmUG9zc2libGUoKTsKKyAgICAgICAgbmVlZHNUb0NyZWF0ZUF1ZGlvRGVjb2RlciA9IGZhbHNlOworICAgIH0KKyAgICBpZiAobVJlbmRlcmVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjbG9zZUF1ZGlvU2luaygpOworICAgIG1SZW5kZXJlci0+Zmx1c2godHJ1ZSAvKiBhdWRpbyAqLywgZmFsc2UgLyogbm90aWZ5Q29tcGxldGUgKi8pOworICAgIGlmIChtVmlkZW9EZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgbVJlbmRlcmVyLT5mbHVzaChmYWxzZSAvKiBhdWRpbyAqLywgZmFsc2UgLyogbm90aWZ5Q29tcGxldGUgKi8pOworICAgIH0KKworICAgIHBlcmZvcm1TZWVrKGN1cnJlbnRQb3NpdGlvblVzLCBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DIC8qIG1vZGUgKi8pOworCisgICAgaWYgKGZvcmNlTm9uT2ZmbG9hZCkgeworICAgICAgICBtUmVuZGVyZXItPnNpZ25hbERpc2FibGVPZmZsb2FkQXVkaW8oKTsKKyAgICAgICAgbU9mZmxvYWRBdWRpbyA9IGZhbHNlOworICAgIH0KKyAgICBpZiAobmVlZHNUb0NyZWF0ZUF1ZGlvRGVjb2RlcikgeworICAgICAgICBpbnN0YW50aWF0ZURlY29kZXIodHJ1ZSAvKiBhdWRpbyAqLywgJm1BdWRpb0RlY29kZXIsICFmb3JjZU5vbk9mZmxvYWQpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OmRldGVybWluZUF1ZGlvTW9kZUNoYW5nZShjb25zdCBzcDxBTWVzc2FnZT4gJmF1ZGlvRm9ybWF0KSB7CisgICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCB8fCBtQXVkaW9TaW5rID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtUmVuZGVyZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygiTm8gcmVuZGVyZXIgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGF1ZGlvIG1vZGUuIFVzZSBub24tb2ZmbG9hZCBmb3Igc2FmZXR5LiIpOworICAgICAgICBtT2ZmbG9hZEF1ZGlvID0gZmFsc2U7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzcDxNZXRhRGF0YT4gYXVkaW9NZXRhID0gbVNvdXJjZS0+Z2V0Rm9ybWF0TWV0YSh0cnVlIC8qIGF1ZGlvICovKTsKKyAgICBzcDxBTWVzc2FnZT4gdmlkZW9Gb3JtYXQgPSBtU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pOworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSA9IG1BdWRpb1NpbmstPmdldEF1ZGlvU3RyZWFtVHlwZSgpOworICAgIGNvbnN0IGJvb2wgaGFzVmlkZW8gPSAodmlkZW9Gb3JtYXQgIT0gTlVMTCk7CisgICAgYm9vbCBjYW5PZmZsb2FkID0gY2FuT2ZmbG9hZFN0cmVhbSgKKyAgICAgICAgICAgIGF1ZGlvTWV0YSwgaGFzVmlkZW8sIG1Tb3VyY2UtPmlzU3RyZWFtaW5nKCksIHN0cmVhbVR5cGUpCisgICAgICAgICAgICAgICAgICAgICYmIChtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQgPT0gMS5mICYmIG1QbGF5YmFja1NldHRpbmdzLm1QaXRjaCA9PSAxLmYpOworCisgICAgLy8gTW9kdWxhciBEUk06IERpc2FibGluZyBhdWRpbyBvZmZsb2FkIGlmIHRoZSBzb3VyY2UgaXMgcHJvdGVjdGVkCisgICAgaWYgKGNhbk9mZmxvYWQgJiYgbUlzRHJtUHJvdGVjdGVkKSB7CisgICAgICAgIGNhbk9mZmxvYWQgPSBmYWxzZTsKKyAgICAgICAgQUxPR1YoImRldGVybWluZUF1ZGlvTW9kZUNoYW5nZTogRGlzYWJsaW5nIG1PZmZsb2FkQXVkaW8gYi9jIHRoZSBzb3VyY2UgaXMgcHJvdGVjdGVkLiIpOworICAgIH0KKworICAgIGlmIChjYW5PZmZsb2FkKSB7CisgICAgICAgIGlmICghbU9mZmxvYWRBdWRpbykgeworICAgICAgICAgICAgbVJlbmRlcmVyLT5zaWduYWxFbmFibGVPZmZsb2FkQXVkaW8oKTsKKyAgICAgICAgfQorICAgICAgICAvLyBvcGVuIGF1ZGlvIHNpbmsgZWFybHkgdW5kZXIgb2ZmbG9hZCBtb2RlLgorICAgICAgICB0cnlPcGVuQXVkaW9TaW5rRm9yT2ZmbG9hZChhdWRpb0Zvcm1hdCwgYXVkaW9NZXRhLCBoYXNWaWRlbyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1PZmZsb2FkQXVkaW8pIHsKKyAgICAgICAgICAgIG1SZW5kZXJlci0+c2lnbmFsRGlzYWJsZU9mZmxvYWRBdWRpbygpOworICAgICAgICAgICAgbU9mZmxvYWRBdWRpbyA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0dXNfdCBOdVBsYXllcjI6Omluc3RhbnRpYXRlRGVjb2RlcigKKyAgICAgICAgYm9vbCBhdWRpbywgc3A8RGVjb2RlckJhc2U+ICpkZWNvZGVyLCBib29sIGNoZWNrQXVkaW9Nb2RlQ2hhbmdlKSB7CisgICAgLy8gVGhlIGF1ZGlvIGRlY29kZXIgY291bGQgYmUgY2xlYXJlZCBieSB0ZWFyIGRvd24uIElmIHN0aWxsIGluIHNodXQgZG93bgorICAgIC8vIHByb2Nlc3MsIG5vIG5lZWQgdG8gY3JlYXRlIGEgbmV3IGF1ZGlvIGRlY29kZXIuCisgICAgaWYgKCpkZWNvZGVyICE9IE5VTEwgfHwgKGF1ZGlvICYmIG1GbHVzaGluZ0F1ZGlvID09IFNIVVRfRE9XTikpIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBtU291cmNlLT5nZXRGb3JtYXQoYXVkaW8pOworCisgICAgaWYgKGZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXR1c190IGVycjsKKyAgICAgICAgaWYgKGZvcm1hdC0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSAmJiBlcnIpIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3JtYXQtPnNldEludDMyKCJwcmlvcml0eSIsIDAgLyogcmVhbHRpbWUgKi8pOworCisgICAgaWYgKCFhdWRpbykgeworICAgICAgICBBU3RyaW5nIG1pbWU7CisgICAgICAgIENIRUNLKGZvcm1hdC0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSk7CisKKyAgICAgICAgc3A8QU1lc3NhZ2U+IGNjTm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2xvc2VkQ2FwdGlvbk5vdGlmeSwgdGhpcyk7CisgICAgICAgIGlmIChtQ0NEZWNvZGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIG1DQ0RlY29kZXIgPSBuZXcgQ0NEZWNvZGVyKGNjTm90aWZ5KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfU0VDVVJFKSB7CisgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJzZWN1cmUiLCB0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfUFJPVEVDVEVEKSB7CisgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJwcm90ZWN0ZWQiLCB0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IHJhdGUgPSBnZXRGcmFtZVJhdGUoKTsKKyAgICAgICAgaWYgKHJhdGUgPiAwKSB7CisgICAgICAgICAgICBmb3JtYXQtPnNldEZsb2F0KCJvcGVyYXRpbmctcmF0ZSIsIHJhdGUgKiBtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGF1ZGlvKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRBdWRpb05vdGlmeSwgdGhpcyk7CisgICAgICAgICsrbUF1ZGlvRGVjb2RlckdlbmVyYXRpb247CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtQXVkaW9EZWNvZGVyR2VuZXJhdGlvbik7CisKKyAgICAgICAgaWYgKGNoZWNrQXVkaW9Nb2RlQ2hhbmdlKSB7CisgICAgICAgICAgICBkZXRlcm1pbmVBdWRpb01vZGVDaGFuZ2UoZm9ybWF0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAobU9mZmxvYWRBdWRpbykgeworICAgICAgICAgICAgbVNvdXJjZS0+c2V0T2ZmbG9hZEF1ZGlvKHRydWUgLyogb2ZmbG9hZCAqLyk7CisKKyAgICAgICAgICAgIGNvbnN0IGJvb2wgaGFzVmlkZW8gPSAobVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qYXVkaW8gKi8pICE9IE5VTEwpOworICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiaGFzLXZpZGVvIiwgaGFzVmlkZW8pOworICAgICAgICAgICAgKmRlY29kZXIgPSBuZXcgRGVjb2RlclBhc3NUaHJvdWdoKG5vdGlmeSwgbVNvdXJjZSwgbVJlbmRlcmVyKTsKKyAgICAgICAgICAgIEFMT0dWKCJpbnN0YW50aWF0ZURlY29kZXIgYXVkaW8gRGVjb2RlclBhc3NUaHJvdWdoICBoYXNWaWRlbzogJWQiLCBoYXNWaWRlbyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU291cmNlLT5zZXRPZmZsb2FkQXVkaW8oZmFsc2UgLyogb2ZmbG9hZCAqLyk7CisKKyAgICAgICAgICAgICpkZWNvZGVyID0gbmV3IERlY29kZXIobm90aWZ5LCBtU291cmNlLCBtUElELCBtVUlELCBtUmVuZGVyZXIpOworICAgICAgICAgICAgQUxPR1YoImluc3RhbnRpYXRlRGVjb2RlciBhdWRpbyBEZWNvZGVyIik7CisgICAgICAgIH0KKyAgICAgICAgbUF1ZGlvRGVjb2RlckVycm9yID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFZpZGVvTm90aWZ5LCB0aGlzKTsKKyAgICAgICAgKyttVmlkZW9EZWNvZGVyR2VuZXJhdGlvbjsKKyAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1WaWRlb0RlY29kZXJHZW5lcmF0aW9uKTsKKworICAgICAgICAqZGVjb2RlciA9IG5ldyBEZWNvZGVyKAorICAgICAgICAgICAgICAgIG5vdGlmeSwgbVNvdXJjZSwgbVBJRCwgbVVJRCwgbVJlbmRlcmVyLCBtTmF0aXZlV2luZG93LCBtQ0NEZWNvZGVyKTsKKyAgICAgICAgbVZpZGVvRGVjb2RlckVycm9yID0gZmFsc2U7CisKKyAgICAgICAgLy8gZW5hYmxlIEZSQyBpZiBoaWdoLXF1YWxpdHkgQVYgc3luYyBpcyByZXF1ZXN0ZWQsIGV2ZW4gaWYgbm90CisgICAgICAgIC8vIGRpcmVjdGx5IHF1ZXVpbmcgdG8gZGlzcGxheSwgYXMgdGhpcyB3aWxsIGV2ZW4gaW1wcm92ZSB0ZXh0dXJldmlldworICAgICAgICAvLyBwbGF5YmFjay4KKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHByb3BlcnR5X2dldF9ib29sKCJwZXJzaXN0LnN5cy5tZWRpYS5hdnN5bmMiLCBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJhdXRvLWZyYyIsIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgICgqZGVjb2RlciktPmluaXQoKTsKKworICAgIC8vIE1vZHVsYXIgRFJNCisgICAgaWYgKG1Jc0RybVByb3RlY3RlZCkgeworICAgICAgICBmb3JtYXQtPnNldE9iamVjdCgiY3J5cHRvIiwgbUNyeXB0byk7CisgICAgICAgIEFMT0dWKCJpbnN0YW50aWF0ZURlY29kZXI6IG1DcnlwdG86ICVwIGlzU2VjdXJlOiAlZCIsIG1DcnlwdG8uZ2V0KCksCisgICAgICAgICAgICAgICAgKG1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19TRUNVUkUpICE9IDApOworICAgIH0KKworICAgICgqZGVjb2RlciktPmNvbmZpZ3VyZShmb3JtYXQpOworCisgICAgaWYgKCFhdWRpbykgeworICAgICAgICBzcDxBTWVzc2FnZT4gcGFyYW1zID0gbmV3IEFNZXNzYWdlKCk7CisgICAgICAgIGZsb2F0IHJhdGUgPSBnZXRGcmFtZVJhdGUoKTsKKyAgICAgICAgaWYgKHJhdGUgPiAwKSB7CisgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJmcmFtZS1yYXRlLXRvdGFsIiwgcmF0ZSk7CisgICAgICAgIH0KKworICAgICAgICBzcDxNZXRhRGF0YT4gZmlsZU1ldGEgPSBnZXRGaWxlTWV0YSgpOworICAgICAgICBpZiAoZmlsZU1ldGEgIT0gTlVMTCkgeworICAgICAgICAgICAgaW50MzJfdCB2aWRlb1RlbXBvcmFsTGF5ZXJDb3VudDsKKyAgICAgICAgICAgIGlmIChmaWxlTWV0YS0+ZmluZEludDMyKGtLZXlUZW1wb3JhbExheWVyQ291bnQsICZ2aWRlb1RlbXBvcmFsTGF5ZXJDb3VudCkKKyAgICAgICAgICAgICAgICAgICAgJiYgdmlkZW9UZW1wb3JhbExheWVyQ291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRJbnQzMigidGVtcG9yYWwtbGF5ZXItY291bnQiLCB2aWRlb1RlbXBvcmFsTGF5ZXJDb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocGFyYW1zLT5jb3VudEVudHJpZXMoKSA+IDApIHsKKyAgICAgICAgICAgICgqZGVjb2RlciktPnNldFBhcmFtZXRlcnMocGFyYW1zKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjp1cGRhdGVWaWRlb1NpemUoCisgICAgICAgIGludDY0X3Qgc3JjSWQsCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmaW5wdXRGb3JtYXQsCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmb3V0cHV0Rm9ybWF0KSB7CisgICAgaWYgKGlucHV0Rm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coIlVua25vd24gdmlkZW8gc2l6ZSwgcmVwb3J0aW5nIDB4MCEiKTsKKyAgICAgICAgbm90aWZ5TGlzdGVuZXIoc3JjSWQsIE1FRElBMl9TRVRfVklERU9fU0laRSwgMCwgMCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW50MzJfdCBlcnIgPSBPSzsKKyAgICBpbnB1dEZvcm1hdC0+ZmluZEludDMyKCJlcnIiLCAmZXJyKTsKKyAgICBpZiAoZXJyID09IC1FV09VTERCTE9DSykgeworICAgICAgICBBTE9HVygiVmlkZW8gbWV0YSBpcyBub3QgYXZhaWxhYmxlIHlldCEiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dXKCJTb21ldGhpbmcgaXMgd3Jvbmcgd2l0aCB2aWRlbyBtZXRhISIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50MzJfdCBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQ7CisgICAgaWYgKG91dHB1dEZvcm1hdCAhPSBOVUxMKSB7CisgICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgICAgICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKSk7CisgICAgICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSk7CisKKyAgICAgICAgaW50MzJfdCBjcm9wTGVmdCwgY3JvcFRvcCwgY3JvcFJpZ2h0LCBjcm9wQm90dG9tOworICAgICAgICBDSEVDSyhvdXRwdXRGb3JtYXQtPmZpbmRSZWN0KAorICAgICAgICAgICAgICAgICAgICAiY3JvcCIsCisgICAgICAgICAgICAgICAgICAgICZjcm9wTGVmdCwgJmNyb3BUb3AsICZjcm9wUmlnaHQsICZjcm9wQm90dG9tKSk7CisKKyAgICAgICAgZGlzcGxheVdpZHRoID0gY3JvcFJpZ2h0IC0gY3JvcExlZnQgKyAxOworICAgICAgICBkaXNwbGF5SGVpZ2h0ID0gY3JvcEJvdHRvbSAtIGNyb3BUb3AgKyAxOworCisgICAgICAgIEFMT0dWKCJWaWRlbyBvdXRwdXQgZm9ybWF0IGNoYW5nZWQgdG8gJWQgeCAlZCAiCisgICAgICAgICAgICAgIihjcm9wOiAlZCB4ICVkIEAgKCVkLCAlZCkpIiwKKyAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgIGRpc3BsYXlXaWR0aCwKKyAgICAgICAgICAgICBkaXNwbGF5SGVpZ2h0LAorICAgICAgICAgICAgIGNyb3BMZWZ0LCBjcm9wVG9wKTsKKyAgICB9IGVsc2UgeworICAgICAgICBDSEVDSyhpbnB1dEZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZkaXNwbGF5V2lkdGgpKTsKKyAgICAgICAgQ0hFQ0soaW5wdXRGb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmRpc3BsYXlIZWlnaHQpKTsKKworICAgICAgICBBTE9HVigiVmlkZW8gaW5wdXQgZm9ybWF0ICVkIHggJWQiLCBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQpOworICAgIH0KKworICAgIC8vIFRha2UgaW50byBhY2NvdW50IHNhbXBsZSBhc3BlY3QgcmF0aW8gaWYgbmVjZXNzYXJ5OgorICAgIGludDMyX3Qgc2FyV2lkdGgsIHNhckhlaWdodDsKKyAgICBpZiAoaW5wdXRGb3JtYXQtPmZpbmRJbnQzMigic2FyLXdpZHRoIiwgJnNhcldpZHRoKQorICAgICAgICAgICAgJiYgaW5wdXRGb3JtYXQtPmZpbmRJbnQzMigic2FyLWhlaWdodCIsICZzYXJIZWlnaHQpCisgICAgICAgICAgICAmJiBzYXJXaWR0aCA+IDAgJiYgc2FySGVpZ2h0ID4gMCkgeworICAgICAgICBBTE9HVigiU2FtcGxlIGFzcGVjdCByYXRpbyAlZCA6ICVkIiwgc2FyV2lkdGgsIHNhckhlaWdodCk7CisKKyAgICAgICAgZGlzcGxheVdpZHRoID0gKGRpc3BsYXlXaWR0aCAqIHNhcldpZHRoKSAvIHNhckhlaWdodDsKKworICAgICAgICBBTE9HVigiZGlzcGxheSBkaW1lbnNpb25zICVkIHggJWQiLCBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgICAgICAgaWYgKGlucHV0Rm9ybWF0LT5maW5kSW50MzIoImRpc3BsYXktd2lkdGgiLCAmd2lkdGgpCisgICAgICAgICAgICAgICAgJiYgaW5wdXRGb3JtYXQtPmZpbmRJbnQzMigiZGlzcGxheS1oZWlnaHQiLCAmaGVpZ2h0KQorICAgICAgICAgICAgICAgICYmIHdpZHRoID4gMCAmJiBoZWlnaHQgPiAwCisgICAgICAgICAgICAgICAgJiYgZGlzcGxheVdpZHRoID4gMCAmJiBkaXNwbGF5SGVpZ2h0ID4gMCkgeworICAgICAgICAgICAgaWYgKGRpc3BsYXlIZWlnaHQgKiAoaW50NjRfdCl3aWR0aCAvIGhlaWdodCA+IChpbnQ2NF90KWRpc3BsYXlXaWR0aCkgeworICAgICAgICAgICAgICAgIGRpc3BsYXlIZWlnaHQgPSAoaW50MzJfdCkoZGlzcGxheVdpZHRoICogKGludDY0X3QpaGVpZ2h0IC8gd2lkdGgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkaXNwbGF5V2lkdGggPSAoaW50MzJfdCkoZGlzcGxheUhlaWdodCAqIChpbnQ2NF90KXdpZHRoIC8gaGVpZ2h0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJWaWRlbyBkaXNwbGF5IHdpZHRoIGFuZCBoZWlnaHQgYXJlIG92ZXJyaWRkZW4gdG8gJWQgeCAlZCIsCisgICAgICAgICAgICAgICAgIGRpc3BsYXlXaWR0aCwgZGlzcGxheUhlaWdodCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQzMl90IHJvdGF0aW9uRGVncmVlczsKKyAgICBpZiAoIWlucHV0Rm9ybWF0LT5maW5kSW50MzIoInJvdGF0aW9uLWRlZ3JlZXMiLCAmcm90YXRpb25EZWdyZWVzKSkgeworICAgICAgICByb3RhdGlvbkRlZ3JlZXMgPSAwOworICAgIH0KKworICAgIGlmIChyb3RhdGlvbkRlZ3JlZXMgPT0gOTAgfHwgcm90YXRpb25EZWdyZWVzID09IDI3MCkgeworICAgICAgICBpbnQzMl90IHRtcCA9IGRpc3BsYXlXaWR0aDsKKyAgICAgICAgZGlzcGxheVdpZHRoID0gZGlzcGxheUhlaWdodDsKKyAgICAgICAgZGlzcGxheUhlaWdodCA9IHRtcDsKKyAgICB9CisKKyAgICBub3RpZnlMaXN0ZW5lcigKKyAgICAgICAgICAgIHNyY0lkLAorICAgICAgICAgICAgTUVESUEyX1NFVF9WSURFT19TSVpFLAorICAgICAgICAgICAgZGlzcGxheVdpZHRoLAorICAgICAgICAgICAgZGlzcGxheUhlaWdodCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpub3RpZnlMaXN0ZW5lcihpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqaW4pIHsKKyAgICBpZiAobURyaXZlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzcDxOdVBsYXllcjJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOworCisgICAgaWYgKGRyaXZlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBkcml2ZXItPm5vdGlmeUxpc3RlbmVyKHNyY0lkLCBtc2csIGV4dDEsIGV4dDIsIGluKTsKK30KKwordm9pZCBOdVBsYXllcjI6OmZsdXNoRGVjb2Rlcihib29sIGF1ZGlvLCBib29sIG5lZWRTaHV0ZG93bikgeworICAgIEFMT0dWKCJbJXNdIGZsdXNoRGVjb2RlciBuZWVkU2h1dGRvd249JWQiLAorICAgICAgICAgIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIsIG5lZWRTaHV0ZG93bik7CisKKyAgICBjb25zdCBzcDxEZWNvZGVyQmFzZT4gJmRlY29kZXIgPSBnZXREZWNvZGVyKGF1ZGlvKTsKKyAgICBpZiAoZGVjb2RlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dJKCJmbHVzaERlY29kZXIgJXMgd2l0aG91dCBkZWNvZGVyIHByZXNlbnQiLAorICAgICAgICAgICAgIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gTWFrZSBzdXJlIHdlIGRvbid0IGNvbnRpbnVlIHRvIHNjYW4gc291cmNlcyB1bnRpbCB3ZSBmaW5pc2ggZmx1c2hpbmcuCisgICAgKyttU2NhblNvdXJjZXNHZW5lcmF0aW9uOworICAgIGlmIChtU2NhblNvdXJjZXNQZW5kaW5nKSB7CisgICAgICAgIGlmICghbmVlZFNodXRkb3duKSB7CisgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUFjdGlvbigmTnVQbGF5ZXIyOjpwZXJmb3JtU2NhblNvdXJjZXMpKTsKKyAgICAgICAgfQorICAgICAgICBtU2NhblNvdXJjZXNQZW5kaW5nID0gZmFsc2U7CisgICAgfQorCisgICAgZGVjb2Rlci0+c2lnbmFsRmx1c2goKTsKKworICAgIEZsdXNoU3RhdHVzIG5ld1N0YXR1cyA9CisgICAgICAgIG5lZWRTaHV0ZG93biA/IEZMVVNISU5HX0RFQ09ERVJfU0hVVERPV04gOiBGTFVTSElOR19ERUNPREVSOworCisgICAgbUZsdXNoQ29tcGxldGVbYXVkaW9dW2ZhbHNlIC8qIGlzRGVjb2RlciAqL10gPSAobVJlbmRlcmVyID09IE5VTEwpOworICAgIG1GbHVzaENvbXBsZXRlW2F1ZGlvXVt0cnVlIC8qIGlzRGVjb2RlciAqL10gPSBmYWxzZTsKKyAgICBpZiAoYXVkaW8pIHsKKyAgICAgICAgQUxPR0VfSUYobUZsdXNoaW5nQXVkaW8gIT0gTk9ORSwKKyAgICAgICAgICAgICAgICAiYXVkaW8gZmx1c2hEZWNvZGVyKCkgaXMgY2FsbGVkIGluIHN0YXRlICVkIiwgbUZsdXNoaW5nQXVkaW8pOworICAgICAgICBtRmx1c2hpbmdBdWRpbyA9IG5ld1N0YXR1czsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRV9JRihtRmx1c2hpbmdWaWRlbyAhPSBOT05FLAorICAgICAgICAgICAgICAgICJ2aWRlbyBmbHVzaERlY29kZXIoKSBpcyBjYWxsZWQgaW4gc3RhdGUgJWQiLCBtRmx1c2hpbmdWaWRlbyk7CisgICAgICAgIG1GbHVzaGluZ1ZpZGVvID0gbmV3U3RhdHVzOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OnF1ZXVlRGVjb2RlclNodXRkb3duKAorICAgICAgICBib29sIGF1ZGlvLCBib29sIHZpZGVvLCBjb25zdCBzcDxBTWVzc2FnZT4gJnJlcGx5KSB7CisgICAgQUxPR0koInF1ZXVlRGVjb2RlclNodXRkb3duIGF1ZGlvPSVkLCB2aWRlbz0lZCIsIGF1ZGlvLCB2aWRlbyk7CisKKyAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKKyAgICAgICAgICAgIG5ldyBGbHVzaERlY29kZXJBY3Rpb24oCisgICAgICAgICAgICAgICAgYXVkaW8gPyBGTFVTSF9DTURfU0hVVERPV04gOiBGTFVTSF9DTURfTk9ORSwKKyAgICAgICAgICAgICAgICB2aWRlbyA/IEZMVVNIX0NNRF9TSFVURE9XTiA6IEZMVVNIX0NNRF9OT05FKSk7CisKKyAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKKyAgICAgICAgICAgIG5ldyBTaW1wbGVBY3Rpb24oJk51UGxheWVyMjo6cGVyZm9ybVNjYW5Tb3VyY2VzKSk7CisKKyAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjayhuZXcgUG9zdE1lc3NhZ2VBY3Rpb24ocmVwbHkpKTsKKworICAgIHByb2Nlc3NEZWZlcnJlZEFjdGlvbnMoKTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpzZXRWaWRlb1NjYWxpbmdNb2RlKGludDMyX3QgbW9kZSkgeworICAgIG1WaWRlb1NjYWxpbmdNb2RlID0gbW9kZTsKKyAgICBpZiAobU5hdGl2ZVdpbmRvdyAhPSBOVUxMICYmIG1OYXRpdmVXaW5kb3ctPmdldEFOYXRpdmVXaW5kb3coKSAhPSBOVUxMKSB7CisgICAgICAgIHN0YXR1c190IHJldCA9IG5hdGl2ZV93aW5kb3dfc2V0X3NjYWxpbmdfbW9kZSgKKyAgICAgICAgICAgICAgICBtTmF0aXZlV2luZG93LT5nZXRBTmF0aXZlV2luZG93KCksIG1WaWRlb1NjYWxpbmdNb2RlKTsKKyAgICAgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgc2NhbGluZyBtb2RlICglZCk6ICVzIiwKKyAgICAgICAgICAgICAgICAtcmV0LCBzdHJlcnJvcigtcmV0KSk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpnZXRUcmFja0luZm8oUGFyY2VsKiByZXBseSkgY29uc3QgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRUcmFja0luZm8sIHRoaXMpOworICAgIG1zZy0+c2V0UG9pbnRlcigicmVwbHkiLCByZXBseSk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6Z2V0U2VsZWN0ZWRUcmFjayhpbnQzMl90IHR5cGUsIFBhcmNlbCogcmVwbHkpIGNvbnN0IHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0U2VsZWN0ZWRUcmFjaywgdGhpcyk7CisgICAgbXNnLT5zZXRQb2ludGVyKCJyZXBseSIsIHJlcGx5KTsKKyAgICBtc2ctPnNldEludDMyKCJ0eXBlIiwgdHlwZSk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworICAgIGlmIChlcnIgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgeworICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6c2VsZWN0VHJhY2soc2l6ZV90IHRyYWNrSW5kZXgsIGJvb2wgc2VsZWN0LCBpbnQ2NF90IHRpbWVVcykgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZWxlY3RUcmFjaywgdGhpcyk7CisgICAgbXNnLT5zZXRTaXplKCJ0cmFja0luZGV4IiwgdHJhY2tJbmRleCk7CisgICAgbXNnLT5zZXRJbnQzMigic2VsZWN0Iiwgc2VsZWN0KTsKKyAgICBtc2ctPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOworCisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoIXJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpKSB7CisgICAgICAgIGVyciA9IE9LOworICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6Z2V0Q3VycmVudFBvc2l0aW9uKGludDY0X3QgKm1lZGlhVXMpIHsKKyAgICBzcDxSZW5kZXJlcj4gcmVuZGVyZXIgPSBtUmVuZGVyZXI7CisgICAgaWYgKHJlbmRlcmVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgcmV0dXJuIHJlbmRlcmVyLT5nZXRDdXJyZW50UG9zaXRpb24obWVkaWFVcyk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpnZXRTdGF0cyhWZWN0b3I8c3A8QU1lc3NhZ2U+ID4gKm1UcmFja1N0YXRzKSB7CisgICAgQ0hFQ0sobVRyYWNrU3RhdHMgIT0gTlVMTCk7CisKKyAgICBtVHJhY2tTdGF0cy0+Y2xlYXIoKTsKKyAgICBpZiAobVZpZGVvRGVjb2RlciAhPSBOVUxMKSB7CisgICAgICAgIG1UcmFja1N0YXRzLT5wdXNoX2JhY2sobVZpZGVvRGVjb2Rlci0+Z2V0U3RhdHMoKSk7CisgICAgfQorICAgIGlmIChtQXVkaW9EZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgbVRyYWNrU3RhdHMtPnB1c2hfYmFjayhtQXVkaW9EZWNvZGVyLT5nZXRTdGF0cygpKTsKKyAgICB9Cit9CisKK3NwPE1ldGFEYXRhPiBOdVBsYXllcjI6OmdldEZpbGVNZXRhKCkgeworICAgIHJldHVybiBtU291cmNlLT5nZXRGaWxlRm9ybWF0TWV0YSgpOworfQorCitmbG9hdCBOdVBsYXllcjI6OmdldEZyYW1lUmF0ZSgpIHsKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1Tb3VyY2UtPmdldEZvcm1hdE1ldGEoZmFsc2UgLyogYXVkaW8gKi8pOworICAgIGlmIChtZXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGludDMyX3QgcmF0ZTsKKyAgICBpZiAoIW1ldGEtPmZpbmRJbnQzMihrS2V5RnJhbWVSYXRlLCAmcmF0ZSkpIHsKKyAgICAgICAgLy8gZmFsbCBiYWNrIHRvIHRyeSBmaWxlIG1ldGEKKyAgICAgICAgc3A8TWV0YURhdGE+IGZpbGVNZXRhID0gZ2V0RmlsZU1ldGEoKTsKKyAgICAgICAgaWYgKGZpbGVNZXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dXKCJzb3VyY2UgaGFzIHZpZGVvIG1ldGEgYnV0IG5vdCBmaWxlIG1ldGEiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpbnQzMl90IGZpbGVNZXRhUmF0ZTsKKyAgICAgICAgaWYgKCFmaWxlTWV0YS0+ZmluZEludDMyKGtLZXlGcmFtZVJhdGUsICZmaWxlTWV0YVJhdGUpKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZpbGVNZXRhUmF0ZTsKKyAgICB9CisgICAgcmV0dXJuIHJhdGU7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpzY2hlZHVsZVBvbGxEdXJhdGlvbigpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UG9sbER1cmF0aW9uLCB0aGlzKTsKKyAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbVBvbGxEdXJhdGlvbkdlbmVyYXRpb24pOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyMjo6Y2FuY2VsUG9sbER1cmF0aW9uKCkgeworICAgICsrbVBvbGxEdXJhdGlvbkdlbmVyYXRpb247Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpwcm9jZXNzRGVmZXJyZWRBY3Rpb25zKCkgeworICAgIHdoaWxlICghbURlZmVycmVkQWN0aW9ucy5lbXB0eSgpKSB7CisgICAgICAgIC8vIFdlIHdvbid0IGV4ZWN1dGUgYW55IGRlZmVycmVkIGFjdGlvbnMgdW50aWwgd2UncmUgbm8gbG9uZ2VyIGluCisgICAgICAgIC8vIGFuIGludGVybWVkaWF0ZSBzdGF0ZSwgaS5lLiBvbmUgbW9yZSBtb3JlIGRlY29kZXJzIGFyZSBjdXJyZW50bHkKKyAgICAgICAgLy8gZmx1c2hpbmcgb3Igc2h1dHRpbmcgZG93bi4KKworICAgICAgICBpZiAobUZsdXNoaW5nQXVkaW8gIT0gTk9ORSB8fCBtRmx1c2hpbmdWaWRlbyAhPSBOT05FKSB7CisgICAgICAgICAgICAvLyBXZSdyZSBjdXJyZW50bHkgZmx1c2hpbmcsIHBvc3Rwb25lIHRoZSByZXNldCB1bnRpbCB0aGF0J3MKKyAgICAgICAgICAgIC8vIGNvbXBsZXRlZC4KKworICAgICAgICAgICAgQUxPR1YoInBvc3Rwb25pbmcgYWN0aW9uIG1GbHVzaGluZ0F1ZGlvPSVkLCBtRmx1c2hpbmdWaWRlbz0lZCIsCisgICAgICAgICAgICAgICAgICBtRmx1c2hpbmdBdWRpbywgbUZsdXNoaW5nVmlkZW8pOworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHNwPEFjdGlvbj4gYWN0aW9uID0gKm1EZWZlcnJlZEFjdGlvbnMuYmVnaW4oKTsKKyAgICAgICAgbURlZmVycmVkQWN0aW9ucy5lcmFzZShtRGVmZXJyZWRBY3Rpb25zLmJlZ2luKCkpOworCisgICAgICAgIGFjdGlvbi0+ZXhlY3V0ZSh0aGlzKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpwZXJmb3JtU2VlayhpbnQ2NF90IHNlZWtUaW1lVXMsIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUpIHsKKyAgICBBTE9HVigicGVyZm9ybVNlZWsgc2Vla1RpbWVVcz0lbGxkIHVzICglLjJmIHNlY3MpLCBtb2RlPSVkIiwKKyAgICAgICAgICAobG9uZyBsb25nKXNlZWtUaW1lVXMsIHNlZWtUaW1lVXMgLyAxRTYsIG1vZGUpOworCisgICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgeworICAgICAgICAvLyBUaGlzIGhhcHBlbnMgd2hlbiByZXNldCBvY2N1cnMgcmlnaHQgYmVmb3JlIHRoZSBsb29wIG1vZGUKKyAgICAgICAgLy8gYXN5bmNocm9ub3VzbHkgc2Vla3MgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzdHJlYW0uCisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobUF1ZGlvRGVjb2RlciAhPSBOVUxMIHx8IG1WaWRlb0RlY29kZXIgIT0gTlVMTCwKKyAgICAgICAgICAgICAgICAibVNvdXJjZSBpcyBOVUxMIGFuZCBkZWNvZGVycyBub3QgTlVMTCBhdWRpbyglcCkgdmlkZW8oJXApIiwKKyAgICAgICAgICAgICAgICBtQXVkaW9EZWNvZGVyLmdldCgpLCBtVmlkZW9EZWNvZGVyLmdldCgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtUHJldmlvdXNTZWVrVGltZVVzID0gc2Vla1RpbWVVczsKKyAgICBtU291cmNlLT5zZWVrVG8oc2Vla1RpbWVVcywgbW9kZSk7CisgICAgKyttVGltZWRUZXh0R2VuZXJhdGlvbjsKKworICAgIC8vIGV2ZXJ5dGhpbmcncyBmbHVzaGVkLCBjb250aW51ZSBwbGF5YmFjay4KK30KKwordm9pZCBOdVBsYXllcjI6OnBlcmZvcm1EZWNvZGVyRmx1c2goRmx1c2hDb21tYW5kIGF1ZGlvLCBGbHVzaENvbW1hbmQgdmlkZW8pIHsKKyAgICBBTE9HVigicGVyZm9ybURlY29kZXJGbHVzaCBhdWRpbz0lZCwgdmlkZW89JWQiLCBhdWRpbywgdmlkZW8pOworCisgICAgaWYgKChhdWRpbyA9PSBGTFVTSF9DTURfTk9ORSB8fCBtQXVkaW9EZWNvZGVyID09IE5VTEwpCisgICAgICAgICAgICAmJiAodmlkZW8gPT0gRkxVU0hfQ01EX05PTkUgfHwgbVZpZGVvRGVjb2RlciA9PSBOVUxMKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGF1ZGlvICE9IEZMVVNIX0NNRF9OT05FICYmIG1BdWRpb0RlY29kZXIgIT0gTlVMTCkgeworICAgICAgICBmbHVzaERlY29kZXIodHJ1ZSAvKiBhdWRpbyAqLywgKGF1ZGlvID09IEZMVVNIX0NNRF9TSFVURE9XTikpOworICAgIH0KKworICAgIGlmICh2aWRlbyAhPSBGTFVTSF9DTURfTk9ORSAmJiBtVmlkZW9EZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgZmx1c2hEZWNvZGVyKGZhbHNlIC8qIGF1ZGlvICovLCAodmlkZW8gPT0gRkxVU0hfQ01EX1NIVVRET1dOKSk7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6cGVyZm9ybVJlc2V0KCkgeworICAgIEFMT0dWKCJwZXJmb3JtUmVzZXQiKTsKKworICAgIENIRUNLKG1BdWRpb0RlY29kZXIgPT0gTlVMTCk7CisgICAgQ0hFQ0sobVZpZGVvRGVjb2RlciA9PSBOVUxMKTsKKworICAgIHN0b3BQbGF5YmFja1RpbWVyKCJwZXJmb3JtUmVzZXQiKTsKKyAgICBzdG9wUmVidWZmZXJpbmdUaW1lcih0cnVlKTsKKworICAgIGNhbmNlbFBvbGxEdXJhdGlvbigpOworCisgICAgKyttU2NhblNvdXJjZXNHZW5lcmF0aW9uOworICAgIG1TY2FuU291cmNlc1BlbmRpbmcgPSBmYWxzZTsKKworICAgIGlmIChtUmVuZGVyZXJMb29wZXIgIT0gTlVMTCkgeworICAgICAgICBpZiAobVJlbmRlcmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1SZW5kZXJlckxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIobVJlbmRlcmVyLT5pZCgpKTsKKyAgICAgICAgfQorICAgICAgICBtUmVuZGVyZXJMb29wZXItPnN0b3AoKTsKKyAgICAgICAgbVJlbmRlcmVyTG9vcGVyLmNsZWFyKCk7CisgICAgfQorICAgIG1SZW5kZXJlci5jbGVhcigpOworICAgICsrbVJlbmRlcmVyR2VuZXJhdGlvbjsKKworICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgbVNvdXJjZS0+c3RvcCgpOworCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU291cmNlTG9jayk7CisgICAgICAgIG1Tb3VyY2UuY2xlYXIoKTsKKyAgICB9CisKKyAgICBpZiAobURyaXZlciAhPSBOVUxMKSB7CisgICAgICAgIHNwPE51UGxheWVyMkRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CisgICAgICAgIGlmIChkcml2ZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlSZXNldENvbXBsZXRlKG1TcmNJZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgIG1QcmVwYXJlZCA9IGZhbHNlOworICAgIG1SZXNldHRpbmcgPSBmYWxzZTsKKyAgICBtU291cmNlU3RhcnRlZCA9IGZhbHNlOworCisgICAgLy8gTW9kdWxhciBEUk0KKyAgICBpZiAobUNyeXB0byAhPSBOVUxMKSB7CisgICAgICAgIC8vIGRlY29kZXJzIHdpbGwgYmUgZmx1c2hlZCBiZWZvcmUgdGhpcyBzbyB0aGVpciBtQ3J5cHRvIHdvdWxkIGdvIGF3YXkgb24gdGhlaXIgb3duCisgICAgICAgIC8vIFRPRE8gY2hhbmdlIHRvIEFMT0dWCisgICAgICAgIEFMT0dEKCJwZXJmb3JtUmVzZXQgbUNyeXB0bzogJXAiLCBtQ3J5cHRvLmdldCgpKTsKKyAgICAgICAgbUNyeXB0by5jbGVhcigpOworICAgIH0KKyAgICBtSXNEcm1Qcm90ZWN0ZWQgPSBmYWxzZTsKK30KKwordm9pZCBOdVBsYXllcjI6OnBlcmZvcm1QbGF5TmV4dERhdGFTb3VyY2UoKSB7CisgICAgQUxPR1YoInBlcmZvcm1QbGF5TmV4dERhdGFTb3VyY2UiKTsKKworICAgIENIRUNLKG1BdWRpb0RlY29kZXIgPT0gTlVMTCk7CisgICAgQ0hFQ0sobVZpZGVvRGVjb2RlciA9PSBOVUxMKTsKKworICAgIHN0b3BQbGF5YmFja1RpbWVyKCJwZXJmb3JtUGxheU5leHREYXRhU291cmNlIik7CisgICAgc3RvcFJlYnVmZmVyaW5nVGltZXIodHJ1ZSk7CisKKyAgICBjYW5jZWxQb2xsRHVyYXRpb24oKTsKKworICAgICsrbVNjYW5Tb3VyY2VzR2VuZXJhdGlvbjsKKyAgICBtU2NhblNvdXJjZXNQZW5kaW5nID0gZmFsc2U7CisKKyAgICArK21SZW5kZXJlckdlbmVyYXRpb247CisKKyAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICB9CisKKyAgICBsb25nIHByZXZpb3VzU3JjSWQ7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVNvdXJjZUxvY2spOworICAgICAgICBtU291cmNlID0gbU5leHRTb3VyY2U7CisgICAgICAgIG1OZXh0U291cmNlID0gTlVMTDsKKyAgICAgICAgcHJldmlvdXNTcmNJZCA9IG1TcmNJZDsKKyAgICAgICAgbVNyY0lkID0gbU5leHRTcmNJZDsKKyAgICAgICAgKyttTmV4dFNyY0lkOyAgLy8gdG8gZGlzdGluZ3Vpc2ggdGhlIHR3byBzb3VyY2VzLgorICAgIH0KKworICAgIGlmIChtRHJpdmVyICE9IE5VTEwpIHsKKyAgICAgICAgc3A8TnVQbGF5ZXIyRHJpdmVyPiBkcml2ZXIgPSBtRHJpdmVyLnByb21vdGUoKTsKKyAgICAgICAgaWYgKGRyaXZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihwcmV2aW91c1NyY0lkLCBNRURJQTJfSU5GTywgTUVESUEyX0lORk9fUExBWUJBQ0tfQ09NUExFVEUsIDApOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfSU5GTywgTUVESUEyX0lORk9fU1RBUlRFRF9BU19ORVhULCAwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgbVByZXBhcmVkID0gdHJ1ZTsgIC8vIFRPRE86IHdoYXQgaWYgaXQncyBub3QgcHJlcGFyZWQKKyAgICBtUmVzZXR0aW5nID0gZmFsc2U7CisgICAgbVNvdXJjZVN0YXJ0ZWQgPSBmYWxzZTsKKworICAgIC8vIE1vZHVsYXIgRFJNCisgICAgaWYgKG1DcnlwdG8gIT0gTlVMTCkgeworICAgICAgICAvLyBkZWNvZGVycyB3aWxsIGJlIGZsdXNoZWQgYmVmb3JlIHRoaXMgc28gdGhlaXIgbUNyeXB0byB3b3VsZCBnbyBhd2F5IG9uIHRoZWlyIG93bgorICAgICAgICAvLyBUT0RPIGNoYW5nZSB0byBBTE9HVgorICAgICAgICBBTE9HRCgicGVyZm9ybVJlc2V0IG1DcnlwdG86ICVwIiwgbUNyeXB0by5nZXQoKSk7CisgICAgICAgIG1DcnlwdG8uY2xlYXIoKTsKKyAgICB9CisgICAgbUlzRHJtUHJvdGVjdGVkID0gZmFsc2U7CisKKyAgICBpZiAobVJlbmRlcmVyICE9IE5VTEwpIHsKKyAgICAgICAgbVJlbmRlcmVyLT5yZXN1bWUoKTsKKyAgICB9CisKKyAgICBvblN0YXJ0KCk7CisgICAgbVBhdXNlZEJ5Q2xpZW50ID0gZmFsc2U7CisgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfU1RBUlRFRCwgMCwgMCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpwZXJmb3JtU2NhblNvdXJjZXMoKSB7CisgICAgQUxPR1YoInBlcmZvcm1TY2FuU291cmNlcyIpOworCisgICAgaWYgKCFtU3RhcnRlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1BdWRpb0RlY29kZXIgPT0gTlVMTCB8fCBtVmlkZW9EZWNvZGVyID09IE5VTEwpIHsKKyAgICAgICAgcG9zdFNjYW5Tb3VyY2VzKCk7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6cGVyZm9ybVNldFN1cmZhY2UoY29uc3Qgc3A8QU5hdGl2ZVdpbmRvd1dyYXBwZXI+ICZud3cpIHsKKyAgICBBTE9HVigicGVyZm9ybVNldFN1cmZhY2UiKTsKKworICAgIG1OYXRpdmVXaW5kb3cgPSBud3c7CisKKyAgICAvLyBYWFggLSBpZ25vcmUgZXJyb3IgZnJvbSBzZXRWaWRlb1NjYWxpbmdNb2RlIGZvciBub3cKKyAgICBzZXRWaWRlb1NjYWxpbmdNb2RlKG1WaWRlb1NjYWxpbmdNb2RlKTsKKworICAgIGlmIChtRHJpdmVyICE9IE5VTEwpIHsKKyAgICAgICAgc3A8TnVQbGF5ZXIyRHJpdmVyPiBkcml2ZXIgPSBtRHJpdmVyLnByb21vdGUoKTsKKyAgICAgICAgaWYgKGRyaXZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVNldFN1cmZhY2VDb21wbGV0ZShtU3JjSWQpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6cGVyZm9ybVJlc3VtZURlY29kZXJzKGJvb2wgbmVlZE5vdGlmeSkgeworICAgIGlmIChuZWVkTm90aWZ5KSB7CisgICAgICAgIG1SZXN1bWVQZW5kaW5nID0gdHJ1ZTsKKyAgICAgICAgaWYgKG1WaWRlb0RlY29kZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgLy8gaWYgYXVkaW8tb25seSwgd2UgY2FuIG5vdGlmeSBzZWVrIGNvbXBsZXRlIG5vdywKKyAgICAgICAgICAgIC8vIGFzIHRoZSByZXN1bWUgb3BlcmF0aW9uIHdpbGwgYmUgcmVsYXRpdmVseSBmYXN0LgorICAgICAgICAgICAgZmluaXNoUmVzdW1lKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobVZpZGVvRGVjb2RlciAhPSBOVUxMKSB7CisgICAgICAgIC8vIFdoZW4gdGhlcmUgaXMgY29udGludW91cyBzZWVrLCBNZWRpYVBsYXllciB3aWxsIGNhY2hlIHRoZSBzZWVrCisgICAgICAgIC8vIHBvc2l0aW9uLCBhbmQgc2VuZCBkb3duIG5ldyBzZWVrIHJlcXVlc3Qgd2hlbiBwcmV2aW91cyBzZWVrIGlzCisgICAgICAgIC8vIGNvbXBsZXRlLiBMZXQncyB3YWl0IGZvciBhdCBsZWFzdCBvbmUgdmlkZW8gb3V0cHV0IGZyYW1lIGJlZm9yZQorICAgICAgICAvLyBub3RpZnlpbmcgc2VlayBjb21wbGV0ZSwgc28gdGhhdCB0aGUgdmlkZW8gdGh1bWJuYWlsIGdldHMgdXBkYXRlZAorICAgICAgICAvLyB3aGVuIHNlZWtiYXIgaXMgZHJhZ2dlZC4KKyAgICAgICAgbVZpZGVvRGVjb2Rlci0+c2lnbmFsUmVzdW1lKG5lZWROb3RpZnkpOworICAgIH0KKworICAgIGlmIChtQXVkaW9EZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgbUF1ZGlvRGVjb2Rlci0+c2lnbmFsUmVzdW1lKGZhbHNlIC8qIG5lZWROb3RpZnkgKi8pOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OmZpbmlzaFJlc3VtZSgpIHsKKyAgICBpZiAobVJlc3VtZVBlbmRpbmcpIHsKKyAgICAgICAgbVJlc3VtZVBlbmRpbmcgPSBmYWxzZTsKKyAgICAgICAgbm90aWZ5RHJpdmVyU2Vla0NvbXBsZXRlKG1TcmNJZCk7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6bm90aWZ5RHJpdmVyU2Vla0NvbXBsZXRlKGludDY0X3Qgc3JjSWQpIHsKKyAgICBpZiAobURyaXZlciAhPSBOVUxMKSB7CisgICAgICAgIHNwPE51UGxheWVyMkRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CisgICAgICAgIGlmIChkcml2ZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlTZWVrQ29tcGxldGUoc3JjSWQpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6b25Tb3VyY2VOb3RpZnkoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBpbnQzMl90IHdoYXQ7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoIndoYXQiLCAmd2hhdCkpOworCisgICAgaW50NjRfdCBzcmNJZDsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgic3JjSWQiLCAmc3JjSWQpKTsKKyAgICBzd2l0Y2ggKHdoYXQpIHsKKyAgICAgICAgY2FzZSBTb3VyY2U6OmtXaGF0UHJlcGFyZWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIEFMT0dWKCJOdVBsYXllcjI6Om9uU291cmNlTm90aWZ5IFNvdXJjZTo6a1doYXRQcmVwYXJlZCBzb3VyY2U6ICVwIiwgbVNvdXJjZS5nZXQoKSk7CisgICAgICAgICAgICBpZiAobVNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHN0YWxlIG5vdGlmaWNhdGlvbiBmcm9tIGEgc291cmNlIHRoYXQgd2FzCisgICAgICAgICAgICAgICAgLy8gYXN5bmNocm9ub3VzbHkgcHJlcGFyaW5nIHdoZW4gdGhlIGNsaWVudCBjYWxsZWQgcmVzZXQoKS4KKyAgICAgICAgICAgICAgICAvLyBXZSBoYW5kbGVkIHRoZSByZXNldCwgdGhlIHNvdXJjZSBpcyBnb25lLgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQzMl90IGVycjsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAvLyBzaHV0IGRvd24gcG90ZW50aWFsIHNlY3VyZSBjb2RlY3MgaW4gY2FzZSBjbGllbnQgbmV2ZXIgY2FsbHMgcmVzZXQKKyAgICAgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGbHVzaERlY29kZXJBY3Rpb24oRkxVU0hfQ01EX1NIVVRET1dOIC8qIGF1ZGlvICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTFVTSF9DTURfU0hVVERPV04gLyogdmlkZW8gKi8pKTsKKyAgICAgICAgICAgICAgICBwcm9jZXNzRGVmZXJyZWRBY3Rpb25zKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1QcmVwYXJlZCA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNwPE51UGxheWVyMkRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAvLyBub3RpZnkgZHVyYXRpb24gZmlyc3QsIHNvIHRoYXQgaXQncyBkZWZpbml0ZWx5IHNldCB3aGVuCisgICAgICAgICAgICAgICAgLy8gdGhlIGFwcCByZWNlaXZlZCB0aGUgInByZXBhcmUgY29tcGxldGUiIGNhbGxiYWNrLgorICAgICAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKKyAgICAgICAgICAgICAgICBpZiAobVNvdXJjZS0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uVXMpID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5RHVyYXRpb24oc3JjSWQsIGR1cmF0aW9uVXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVByZXBhcmVDb21wbGV0ZWQoc3JjSWQsIGVycik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gTW9kdWxhciBEUk0KKyAgICAgICAgY2FzZSBTb3VyY2U6OmtXaGF0RHJtSW5mbzoKKyAgICAgICAgeworICAgICAgICAgICAgUGFyY2VsIHBhcmNlbDsKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGRybUluZm87CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRCdWZmZXIoImRybUluZm8iLCAmZHJtSW5mbykpOworICAgICAgICAgICAgcGFyY2VsLnNldERhdGEoZHJtSW5mby0+ZGF0YSgpLCBkcm1JbmZvLT5zaXplKCkpOworCisgICAgICAgICAgICBBTE9HVigib25Tb3VyY2VOb3RpZnkoKSBrV2hhdERybUluZm8gTUVESUEyX0RSTV9JTkZPIGRybUluZm86ICVwICBwYXJjZWwgc2l6ZTogJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgZHJtSW5mby5nZXQoKSwgcGFyY2VsLmRhdGFTaXplKCkpOworCisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihzcmNJZCwgTUVESUEyX0RSTV9JTkZPLCAwIC8qIGV4dDEgKi8sIDAgLyogZXh0MiAqLywgJnBhcmNlbCk7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBTb3VyY2U6OmtXaGF0RmxhZ3NDaGFuZ2VkOgorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBmbGFnczsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJmbGFncyIsIChpbnQzMl90ICopJmZsYWdzKSk7CisKKyAgICAgICAgICAgIHNwPE51UGxheWVyMkRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKKworICAgICAgICAgICAgICAgIEFMT0dWKCJvblNvdXJjZU5vdGlmeSgpIGtXaGF0RmxhZ3NDaGFuZ2VkICBGTEFHX0NBTl9QQVVTRTogJWQgICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJGTEFHX0NBTl9TRUVLX0JBQ0tXQVJEOiAlZCBcblx0XHRcdFx0IEZMQUdfQ0FOX1NFRUtfRk9SV0FSRDogJWQgICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJGTEFHX0NBTl9TRUVLOiAlZCAgRkxBR19EWU5BTUlDX0RVUkFUSU9OOiAlZCBcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcdFx0XHRcdCBGTEFHX1NFQ1VSRTogJWQgIEZMQUdfUFJPVEVDVEVEOiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBTb3VyY2U6OkZMQUdfQ0FOX1BBVVNFKSAhPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgKGZsYWdzICYgU291cmNlOjpGTEFHX0NBTl9TRUVLX0JBQ0tXQVJEKSAhPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgKGZsYWdzICYgU291cmNlOjpGTEFHX0NBTl9TRUVLX0ZPUldBUkQpICE9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBTb3VyY2U6OkZMQUdfQ0FOX1NFRUspICE9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBTb3VyY2U6OkZMQUdfRFlOQU1JQ19EVVJBVElPTikgIT0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIFNvdXJjZTo6RkxBR19TRUNVUkUpICE9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBTb3VyY2U6OkZMQUdfUFJPVEVDVEVEKSAhPSAwKTsKKworICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBOdVBsYXllcjI6OlNvdXJjZTo6RkxBR19DQU5fU0VFSykgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeUxpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0lkLCBNRURJQTJfSU5GTywgTUVESUEyX0lORk9fTk9UX1NFRUtBQkxFLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlGbGFnc0NoYW5nZWQoc3JjSWQsIGZsYWdzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChtU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfRFlOQU1JQ19EVVJBVElPTikKKyAgICAgICAgICAgICAgICAgICAgJiYgKCEoZmxhZ3MgJiBTb3VyY2U6OkZMQUdfRFlOQU1JQ19EVVJBVElPTikpKSB7CisgICAgICAgICAgICAgICAgY2FuY2VsUG9sbER1cmF0aW9uKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCEobVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX0RZTkFNSUNfRFVSQVRJT04pCisgICAgICAgICAgICAgICAgICAgICYmIChmbGFncyAmIFNvdXJjZTo6RkxBR19EWU5BTUlDX0RVUkFUSU9OKQorICAgICAgICAgICAgICAgICAgICAmJiAobUF1ZGlvRGVjb2RlciAhPSBOVUxMIHx8IG1WaWRlb0RlY29kZXIgIT0gTlVMTCkpIHsKKyAgICAgICAgICAgICAgICBzY2hlZHVsZVBvbGxEdXJhdGlvbigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtU291cmNlRmxhZ3MgPSBmbGFnczsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBTb3VyY2U6OmtXaGF0VmlkZW9TaXplQ2hhbmdlZDoKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoImZvcm1hdCIsICZmb3JtYXQpKTsKKworICAgICAgICAgICAgdXBkYXRlVmlkZW9TaXplKHNyY0lkLCBmb3JtYXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNvdXJjZTo6a1doYXRCdWZmZXJpbmdVcGRhdGU6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgcGVyY2VudGFnZTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJwZXJjZW50YWdlIiwgJnBlcmNlbnRhZ2UpKTsKKworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoc3JjSWQsIE1FRElBMl9CVUZGRVJJTkdfVVBEQVRFLCBwZXJjZW50YWdlLCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBTb3VyY2U6OmtXaGF0UGF1c2VPbkJ1ZmZlcmluZ1N0YXJ0OgorICAgICAgICB7CisgICAgICAgICAgICAvLyBpZ25vcmUgaWYgbm90IHBsYXlpbmcKKyAgICAgICAgICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICAgICAgICAgIEFMT0dJKCJidWZmZXIgbG93LCBwYXVzaW5nLi4uIik7CisKKyAgICAgICAgICAgICAgICBzdGFydFJlYnVmZmVyaW5nVGltZXIoKTsKKyAgICAgICAgICAgICAgICBtUGF1c2VkRm9yQnVmZmVyaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBvblBhdXNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihzcmNJZCwgTUVESUEyX0lORk8sIE1FRElBMl9JTkZPX0JVRkZFUklOR19TVEFSVCwgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU291cmNlOjprV2hhdFJlc3VtZU9uQnVmZmVyaW5nRW5kOgorICAgICAgICB7CisgICAgICAgICAgICAvLyBpZ25vcmUgaWYgbm90IHBsYXlpbmcKKyAgICAgICAgICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICAgICAgICAgIEFMT0dJKCJidWZmZXIgcmVhZHksIHJlc3VtaW5nLi4uIik7CisKKyAgICAgICAgICAgICAgICBzdG9wUmVidWZmZXJpbmdUaW1lcihmYWxzZSk7CisgICAgICAgICAgICAgICAgbVBhdXNlZEZvckJ1ZmZlcmluZyA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgLy8gZG8gbm90IHJlc3VtZSB5ZXQgaWYgY2xpZW50IGRpZG4ndCB1bnBhdXNlCisgICAgICAgICAgICAgICAgaWYgKCFtUGF1c2VkQnlDbGllbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgb25SZXN1bWUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihzcmNJZCwgTUVESUEyX0lORk8sIE1FRElBMl9JTkZPX0JVRkZFUklOR19FTkQsIDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNvdXJjZTo6a1doYXRDYWNoZVN0YXRzOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGticHM7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYmFuZHdpZHRoIiwgJmticHMpKTsKKworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoc3JjSWQsIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19ORVRXT1JLX0JBTkRXSURUSCwga2Jwcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU291cmNlOjprV2hhdFN1YnRpdGxlRGF0YToKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kQnVmZmVyKCJidWZmZXIiLCAmYnVmZmVyKSk7CisKKyAgICAgICAgICAgIHNlbmRTdWJ0aXRsZURhdGEoYnVmZmVyLCAwIC8qIGJhc2VJbmRleCAqLyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU291cmNlOjprV2hhdFRpbWVkTWV0YURhdGE6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKKyAgICAgICAgICAgIGlmICghbXNnLT5maW5kQnVmZmVyKCJidWZmZXIiLCAmYnVmZmVyKSkgeworICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKHNyY0lkLCBNRURJQTJfSU5GTywgTUVESUEyX0lORk9fTUVUQURBVEFfVVBEQVRFLCAwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2VuZFRpbWVkTWV0YURhdGEoYnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBTb3VyY2U6OmtXaGF0VGltZWRUZXh0RGF0YToKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uOworICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pCisgICAgICAgICAgICAgICAgICAgICYmIGdlbmVyYXRpb24gIT0gbVRpbWVkVGV4dEdlbmVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kQnVmZmVyKCJidWZmZXIiLCAmYnVmZmVyKSk7CisKKyAgICAgICAgICAgIHNwPE51UGxheWVyMkRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoZHJpdmVyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50NjRfdCBwb3NNczsKKyAgICAgICAgICAgIGludDY0X3QgdGltZVVzLCBwb3NVczsKKyAgICAgICAgICAgIGRyaXZlci0+Z2V0Q3VycmVudFBvc2l0aW9uKCZwb3NNcyk7CisgICAgICAgICAgICBwb3NVcyA9IHBvc01zICogMTAwMGxsOworICAgICAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworCisgICAgICAgICAgICBpZiAocG9zVXMgPCB0aW1lVXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKSB7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtVGltZWRUZXh0R2VuZXJhdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1zZy0+cG9zdCh0aW1lVXMgLSBwb3NVcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNlbmRUaW1lZFRleHREYXRhKGJ1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU291cmNlOjprV2hhdFF1ZXVlRGVjb2RlclNodXRkb3duOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGF1ZGlvLCB2aWRlbzsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJhdWRpbyIsICZhdWRpbykpOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInZpZGVvIiwgJnZpZGVvKSk7CisKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoInJlcGx5IiwgJnJlcGx5KSk7CisKKyAgICAgICAgICAgIHF1ZXVlRGVjb2RlclNodXRkb3duKGF1ZGlvLCB2aWRlbywgcmVwbHkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNvdXJjZTo6a1doYXREcm1Ob0xpY2Vuc2U6CisgICAgICAgIHsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKHNyY0lkLCBNRURJQTJfRVJST1IsIE1FRElBMl9FUlJPUl9VTktOT1dOLCBFUlJPUl9EUk1fTk9fTElDRU5TRSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBUUkVTUEFTUygpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6Om9uQ2xvc2VkQ2FwdGlvbk5vdGlmeShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIGludDMyX3Qgd2hhdDsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigid2hhdCIsICZ3aGF0KSk7CisKKyAgICBzd2l0Y2ggKHdoYXQpIHsKKyAgICAgICAgY2FzZSBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6a1doYXRDbG9zZWRDYXB0aW9uRGF0YToKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kQnVmZmVyKCJidWZmZXIiLCAmYnVmZmVyKSk7CisKKyAgICAgICAgICAgIHNpemVfdCBpbmJhbmRUcmFja3MgPSAwOworICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGluYmFuZFRyYWNrcyA9IG1Tb3VyY2UtPmdldFRyYWNrQ291bnQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2VuZFN1YnRpdGxlRGF0YShidWZmZXIsIGluYmFuZFRyYWNrcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgTnVQbGF5ZXIyOjpDQ0RlY29kZXI6OmtXaGF0VHJhY2tBZGRlZDoKKyAgICAgICAgeworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfSU5GTywgTUVESUEyX0lORk9fTUVUQURBVEFfVVBEQVRFLCAwKTsKKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICB9CisKKworfQorCit2b2lkIE51UGxheWVyMjo6c2VuZFN1YnRpdGxlRGF0YShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyLCBpbnQzMl90IGJhc2VJbmRleCkgeworICAgIGludDMyX3QgdHJhY2tJbmRleDsKKyAgICBpbnQ2NF90IHRpbWVVcywgZHVyYXRpb25VczsKKyAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSU5ERVgsICZ0cmFja0luZGV4KSk7CisgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoImR1cmF0aW9uVXMiLCAmZHVyYXRpb25VcykpOworCisgICAgUGFyY2VsIGluOworICAgIGluLndyaXRlSW50MzIodHJhY2tJbmRleCArIGJhc2VJbmRleCk7CisgICAgaW4ud3JpdGVJbnQ2NCh0aW1lVXMpOworICAgIGluLndyaXRlSW50NjQoZHVyYXRpb25Vcyk7CisgICAgaW4ud3JpdGVJbnQzMihidWZmZXItPnNpemUoKSk7CisgICAgaW4ud3JpdGVJbnQzMihidWZmZXItPnNpemUoKSk7CisgICAgaW4ud3JpdGUoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKKworICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX1NVQlRJVExFX0RBVEEsIDAsIDAsICZpbik7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpzZW5kVGltZWRNZXRhRGF0YShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgaW50NjRfdCB0aW1lVXM7CisgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworCisgICAgUGFyY2VsIGluOworICAgIGluLndyaXRlSW50NjQodGltZVVzKTsKKyAgICBpbi53cml0ZUludDMyKGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICBpbi53cml0ZUludDMyKGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICBpbi53cml0ZShidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOworCisgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfTUVUQV9EQVRBLCAwLCAwLCAmaW4pOworfQorCit2b2lkIE51UGxheWVyMjo6c2VuZFRpbWVkVGV4dERhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgc2l6ZV90IHNpemUgPSAwOworICAgIGludDY0X3QgdGltZVVzOworICAgIGludDMyX3QgZmxhZyA9IFRleHREZXNjcmlwdGlvbnM6OklOX0JBTkRfVEVYVF8zR1BQOworCisgICAgQVN0cmluZyBtaW1lOworICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKKyAgICBDSEVDSyhzdHJjYXNlY21wKG1pbWUuY19zdHIoKSwgTUVESUFfTUlNRVRZUEVfVEVYVF8zR1BQKSA9PSAwKTsKKworICAgIGRhdGEgPSBidWZmZXItPmRhdGEoKTsKKyAgICBzaXplID0gYnVmZmVyLT5zaXplKCk7CisKKyAgICBQYXJjZWwgcGFyY2VsOworICAgIGlmIChzaXplID4gMCkgeworICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CisgICAgICAgIGludDMyX3QgZ2xvYmFsID0gMDsKKyAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImdsb2JhbCIsICZnbG9iYWwpICYmIGdsb2JhbCkgeworICAgICAgICAgICAgZmxhZyB8PSBUZXh0RGVzY3JpcHRpb25zOjpHTE9CQUxfREVTQ1JJUFRJT05TOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmxhZyB8PSBUZXh0RGVzY3JpcHRpb25zOjpMT0NBTF9ERVNDUklQVElPTlM7CisgICAgICAgIH0KKyAgICAgICAgVGV4dERlc2NyaXB0aW9uczo6Z2V0UGFyY2VsT2ZEZXNjcmlwdGlvbnMoCisgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilkYXRhLCBzaXplLCBmbGFnLCB0aW1lVXMgLyAxMDAwLCAmcGFyY2VsKTsKKyAgICB9CisKKyAgICBpZiAoKHBhcmNlbC5kYXRhU2l6ZSgpID4gMCkpIHsKKyAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfVElNRURfVEVYVCwgMCwgMCwgJnBhcmNlbCk7CisgICAgfSBlbHNlIHsgIC8vIHNlbmQgYW4gZW1wdHkgdGltZWQgdGV4dAorICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9USU1FRF9URVhULCAwLCAwKTsKKyAgICB9Cit9CisKK2NvbnN0IGNoYXIgKk51UGxheWVyMjo6Z2V0RGF0YVNvdXJjZVR5cGUoKSB7CisgICAgc3dpdGNoIChtRGF0YVNvdXJjZVR5cGUpIHsKKyAgICAgICAgY2FzZSBEQVRBX1NPVVJDRV9UWVBFX0hUVFBfTElWRToKKyAgICAgICAgICAgIHJldHVybiAiSFRUUExpdmUiOworCisgICAgICAgIGNhc2UgREFUQV9TT1VSQ0VfVFlQRV9SVFNQOgorICAgICAgICAgICAgcmV0dXJuICJSVFNQIjsKKworICAgICAgICBjYXNlIERBVEFfU09VUkNFX1RZUEVfR0VORVJJQ19VUkw6CisgICAgICAgICAgICByZXR1cm4gIkdlblVSTCI7CisKKyAgICAgICAgY2FzZSBEQVRBX1NPVVJDRV9UWVBFX0dFTkVSSUNfRkQ6CisgICAgICAgICAgICByZXR1cm4gIkdlbkZEIjsKKworICAgICAgICBjYXNlIERBVEFfU09VUkNFX1RZUEVfTUVESUE6CisgICAgICAgICAgICByZXR1cm4gIk1lZGlhIjsKKworICAgICAgICBjYXNlIERBVEFfU09VUkNFX1RZUEVfTk9ORToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiTm9uZSI7CisgICAgfQorIH0KKworLy8gTW9kdWxhciBEUk0gYmVnaW4KK3N0YXR1c190IE51UGxheWVyMjo6cHJlcGFyZURybShjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBWZWN0b3I8dWludDhfdD4gJmRybVNlc3Npb25JZCkKK3sKKyAgICBBTE9HVigicHJlcGFyZURybSAiKTsKKworICAgIC8vIFBhc3NpbmcgdG8gdGhlIGxvb3BlciBhbnl3YXk7IGNhbGxlZCBpbiBhIHByZS1jb25maWcgcHJlcGFyZWQgc3RhdGUgc28gbm8gcmFjZSBvbiBtQ3J5cHRvCisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFByZXBhcmVEcm0sIHRoaXMpOworICAgIC8vIHN5bmNocm9ub3VzIGNhbGwgc28ganVzdCBwYXNzaW5nIHRoZSBhZGRyZXNzIGJ1dCB3aXRoIGxvY2FsIGNvcGllcyBvZiAiY29uc3QiIGFyZ3MKKyAgICB1aW50OF90IFVVSURbMTZdOworICAgIG1lbWNweShVVUlELCB1dWlkLCBzaXplb2YoVVVJRCkpOworICAgIFZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWQgPSBkcm1TZXNzaW9uSWQ7CisgICAgbXNnLT5zZXRQb2ludGVyKCJ1dWlkIiwgKHZvaWQqKVVVSUQpOworICAgIG1zZy0+c2V0UG9pbnRlcigiZHJtU2Vzc2lvbklkIiwgKHZvaWQqKSZzZXNzaW9uSWQpOworCisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKKworICAgIGlmIChzdGF0dXMgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgeworICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJzdGF0dXMiLCAmc3RhdHVzKSk7CisgICAgICAgIEFMT0dWKCJwcmVwYXJlRHJtIHJldDogJWQgIiwgc3RhdHVzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgicHJlcGFyZURybSBlcnI6ICVkIiwgc3RhdHVzKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OnJlbGVhc2VEcm0oKQoreworICAgIEFMT0dWKCJyZWxlYXNlRHJtICIpOworCisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlbGVhc2VEcm0sIHRoaXMpOworCisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKKworICAgIGlmIChzdGF0dXMgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgeworICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJzdGF0dXMiLCAmc3RhdHVzKSk7CisgICAgICAgIEFMT0dWKCJyZWxlYXNlRHJtIHJldDogJWQgIiwgc3RhdHVzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgicmVsZWFzZURybSBlcnI6ICVkIiwgc3RhdHVzKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6Om9uUHJlcGFyZURybShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykKK3sKKyAgICAvLyBUT0RPIGNoYW5nZSB0byBBTE9HVgorICAgIEFMT0dEKCJvblByZXBhcmVEcm0gIik7CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICBpZiAobVNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJvblByZXBhcmVEcm06IE5vIHNvdXJjZS4gb25QcmVwYXJlRHJtIGZhaWxlZCB3aXRoICVkLiIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdWludDhfdCAqdXVpZDsKKyAgICBWZWN0b3I8dWludDhfdD4gKmRybVNlc3Npb25JZDsKKyAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJ1dWlkIiwgKHZvaWQqKikmdXVpZCkpOworICAgIENIRUNLKG1zZy0+ZmluZFBvaW50ZXIoImRybVNlc3Npb25JZCIsICh2b2lkKiopJmRybVNlc3Npb25JZCkpOworCisgICAgc3RhdHVzID0gT0s7CisgICAgc3A8QU1lZGlhQ3J5cHRvV3JhcHBlcj4gY3J5cHRvID0gTlVMTDsKKworICAgIHN0YXR1cyA9IG1Tb3VyY2UtPnByZXBhcmVEcm0odXVpZCwgKmRybVNlc3Npb25JZCwgJmNyeXB0byk7CisgICAgaWYgKGNyeXB0byA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJvblByZXBhcmVEcm06IG1Tb3VyY2UtPnByZXBhcmVEcm0gZmFpbGVkLiBzdGF0dXM6ICVkIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgQUxPR1YoIm9uUHJlcGFyZURybTogbVNvdXJjZS0+cHJlcGFyZURybSBzdWNjZWVkZWQiKTsKKworICAgIGlmIChtQ3J5cHRvICE9IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIm9uUHJlcGFyZURybTogVW5leHBlY3RlZC4gQWxyZWFkeSBoYXZpbmcgbUNyeXB0bzogJXAiLCBtQ3J5cHRvLmdldCgpKTsKKyAgICAgICAgbUNyeXB0by5jbGVhcigpOworICAgIH0KKworICAgIG1DcnlwdG8gPSBjcnlwdG87CisgICAgbUlzRHJtUHJvdGVjdGVkID0gdHJ1ZTsKKyAgICAvLyBUT0RPIGNoYW5nZSB0byBBTE9HVgorICAgIEFMT0dEKCJvblByZXBhcmVEcm06IG1DcnlwdG86ICVwIiwgbUNyeXB0by5nZXQoKSk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6Om9uUmVsZWFzZURybSgpCit7CisgICAgLy8gVE9ETyBjaGFuZ2UgdG8gQUxPR1YKKyAgICBBTE9HRCgib25SZWxlYXNlRHJtICIpOworCisgICAgaWYgKCFtSXNEcm1Qcm90ZWN0ZWQpIHsKKyAgICAgICAgQUxPR1coIm9uUmVsZWFzZURybTogVW5leHBlY3RlZC4gbUlzRHJtUHJvdGVjdGVkIGlzIGFscmVhZHkgZmFsc2UuIik7CisgICAgfQorCisgICAgbUlzRHJtUHJvdGVjdGVkID0gZmFsc2U7CisKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgaWYgKG1DcnlwdG8gIT0gTlVMTCkgeworICAgICAgICAvLyBub3RpZnlpbmcgdGhlIHNvdXJjZSBmaXJzdCBiZWZvcmUgcmVtb3ZpbmcgY3J5cHRvIGZyb20gY29kZWMKKyAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgbVNvdXJjZS0+cmVsZWFzZURybSgpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzPU9LOworICAgICAgICAvLyBmaXJzdCBtYWtpbmcgc3VyZSB0aGUgY29kZWNzIGhhdmUgcmVsZWFzZWQgdGhlaXIgY3J5cHRvIHJlZmVyZW5jZQorICAgICAgICBjb25zdCBzcDxEZWNvZGVyQmFzZT4gJnZpZGVvRGVjb2RlciA9IGdldERlY29kZXIoZmFsc2UvKmF1ZGlvKi8pOworICAgICAgICBpZiAodmlkZW9EZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHZpZGVvRGVjb2Rlci0+cmVsZWFzZUNyeXB0bygpOworICAgICAgICAgICAgQUxPR1YoIm9uUmVsZWFzZURybTogdmlkZW8gZGVjb2RlciByZXQ6ICVkIiwgc3RhdHVzKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHNwPERlY29kZXJCYXNlPiAmYXVkaW9EZWNvZGVyID0gZ2V0RGVjb2Rlcih0cnVlLyphdWRpbyovKTsKKyAgICAgICAgaWYgKGF1ZGlvRGVjb2RlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXNfYXVkaW8gPSBhdWRpb0RlY29kZXItPnJlbGVhc2VDcnlwdG8oKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsgICAvLyBvdGhlcndpc2UsIHJldHVybmluZyB0aGUgZmlyc3QgZXJyb3IKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0dXNfYXVkaW87CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigib25SZWxlYXNlRHJtOiBhdWRpbyBkZWNvZGVyIHJldDogJWQiLCBzdGF0dXNfYXVkaW8pOworICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETyBjaGFuZ2UgdG8gQUxPR1YKKyAgICAgICAgQUxPR0QoIm9uUmVsZWFzZURybTogbUNyeXB0bzogJXAiLCBtQ3J5cHRvLmdldCgpKTsKKyAgICAgICAgbUNyeXB0by5jbGVhcigpOworICAgIH0gZWxzZSB7ICAgLy8gbUNyeXB0byA9PSBOVUxMCisgICAgICAgIEFMT0dFKCJvblJlbGVhc2VEcm06IFVuZXhwZWN0ZWQuIFRoZXJlIGlzIG5vIGNyeXB0by4iKTsKKyAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKy8vIE1vZHVsYXIgRFJNIGVuZAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3A8QU1lc3NhZ2U+IE51UGxheWVyMjo6U291cmNlOjpnZXRGb3JtYXQoYm9vbCBhdWRpbykgeworICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gZ2V0Rm9ybWF0TWV0YShhdWRpbyk7CisKKyAgICBpZiAobWV0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2U7CisKKyAgICBpZihjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UobWV0YSwgJm1zZykgPT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1zZzsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpTb3VyY2U6Om5vdGlmeUZsYWdzQ2hhbmdlZCh1aW50MzJfdCBmbGFncykgeworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRGbGFnc0NoYW5nZWQpOworICAgIG5vdGlmeS0+c2V0SW50MzIoImZsYWdzIiwgZmxhZ3MpOworICAgIG5vdGlmeS0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyMjo6U291cmNlOjpub3RpZnlWaWRlb1NpemVDaGFuZ2VkKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7CisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFZpZGVvU2l6ZUNoYW5nZWQpOworICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgiZm9ybWF0IiwgZm9ybWF0KTsKKyAgICBub3RpZnktPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjI6OlNvdXJjZTo6bm90aWZ5UHJlcGFyZWQoc3RhdHVzX3QgZXJyKSB7CisgICAgQUxPR1YoIlNvdXJjZTo6bm90aWZ5UHJlcGFyZWQgJWQiLCBlcnIpOworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRQcmVwYXJlZCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKyAgICBub3RpZnktPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjI6OlNvdXJjZTo6bm90aWZ5RHJtSW5mbyhjb25zdCBzcDxBQnVmZmVyPiAmZHJtSW5mb0J1ZmZlcikKK3sKKyAgICBBTE9HVigiU291cmNlOjpub3RpZnlEcm1JbmZvIik7CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gZHVwTm90aWZ5KCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0RHJtSW5mbyk7CisgICAgbm90aWZ5LT5zZXRCdWZmZXIoImRybUluZm8iLCBkcm1JbmZvQnVmZmVyKTsKKworICAgIG5vdGlmeS0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyMjo6U291cmNlOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJiAvKiBtc2cgKi8pIHsKKyAgICBUUkVTUEFTUygpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZmODVmOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyLmgKQEAgLTAsMCArMSwzNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTlVfUExBWUVSMl9IXworCisjZGVmaW5lIE5VX1BMQVlFUjJfSF8KKworI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgorCisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkludGVyZmFjZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBQnVmZmVyOworc3RydWN0IEFNZWRpYUNyeXB0b1dyYXBwZXI7CitzdHJ1Y3QgQU1lc3NhZ2U7CitzdHJ1Y3QgQU5hdGl2ZVdpbmRvd1dyYXBwZXI7CitzdHJ1Y3QgQXVkaW9QbGF5YmFja1JhdGU7CitzdHJ1Y3QgQVZTeW5jU2V0dGluZ3M7CitzdHJ1Y3QgRGF0YVNvdXJjZURlc2M7CitzdHJ1Y3QgTWVkaWFDbG9jazsKK3N0cnVjdCBNZWRpYUhUVFBTZXJ2aWNlOworY2xhc3MgTWV0YURhdGE7CitzdHJ1Y3QgTnVQbGF5ZXIyRHJpdmVyOworCitzdHJ1Y3QgTnVQbGF5ZXIyIDogcHVibGljIEFIYW5kbGVyIHsKKyAgICBleHBsaWNpdCBOdVBsYXllcjIocGlkX3QgcGlkLCB1aWRfdCB1aWQsIGNvbnN0IHNwPE1lZGlhQ2xvY2s+ICZtZWRpYUNsb2NrKTsKKworICAgIHZvaWQgc2V0RHJpdmVyKGNvbnN0IHdwPE51UGxheWVyMkRyaXZlcj4gJmRyaXZlcik7CisKKyAgICB2b2lkIHNldERhdGFTb3VyY2VBc3luYyhjb25zdCBzcDxEYXRhU291cmNlRGVzYz4gJmRzZCk7CisgICAgdm9pZCBwcmVwYXJlTmV4dERhdGFTb3VyY2VBc3luYyhjb25zdCBzcDxEYXRhU291cmNlRGVzYz4gJmRzZCk7CisgICAgdm9pZCBwbGF5TmV4dERhdGFTb3VyY2UoaW50NjRfdCBzcmNJZCk7CisKKyAgICBzdGF0dXNfdCBnZXRCdWZmZXJpbmdTZXR0aW5ncyhCdWZmZXJpbmdTZXR0aW5ncyogYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pOworICAgIHN0YXR1c190IHNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiBidWZmZXJpbmcpOworCisgICAgdm9pZCBwcmVwYXJlQXN5bmMoKTsKKworICAgIHZvaWQgc2V0VmlkZW9TdXJmYWNlVGV4dHVyZUFzeW5jKGNvbnN0IHNwPEFOYXRpdmVXaW5kb3dXcmFwcGVyPiAmbnd3KTsKKworICAgIHZvaWQgc2V0QXVkaW9TaW5rKGNvbnN0IHNwPE1lZGlhUGxheWVyMkludGVyZmFjZTo6QXVkaW9TaW5rPiAmc2luayk7CisgICAgc3RhdHVzX3Qgc2V0UGxheWJhY2tTZXR0aW5ncyhjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcmF0ZSk7CisgICAgc3RhdHVzX3QgZ2V0UGxheWJhY2tTZXR0aW5ncyhBdWRpb1BsYXliYWNrUmF0ZSAqcmF0ZSAvKiBub25udWxsICovKTsKKyAgICBzdGF0dXNfdCBzZXRTeW5jU2V0dGluZ3MoY29uc3QgQVZTeW5jU2V0dGluZ3MgJnN5bmMsIGZsb2F0IHZpZGVvRnBzSGludCk7CisgICAgc3RhdHVzX3QgZ2V0U3luY1NldHRpbmdzKEFWU3luY1NldHRpbmdzICpzeW5jIC8qIG5vbm51bGwgKi8sIGZsb2F0ICp2aWRlb0ZwcyAvKiBub25udWxsICovKTsKKworICAgIHZvaWQgc3RhcnQoKTsKKworICAgIHZvaWQgcGF1c2UoKTsKKworICAgIC8vIFdpbGwgbm90aWZ5IHRoZSBkcml2ZXIgdGhyb3VnaCAibm90aWZ5UmVzZXRDb21wbGV0ZSIgb25jZSBmaW5pc2hlZC4KKyAgICB2b2lkIHJlc2V0QXN5bmMoKTsKKworICAgIC8vIFJlcXVlc3QgYSBub3RpZmljYXRpb24gd2hlbiBzcGVjaWZpZWQgbWVkaWEgdGltZSBpcyByZWFjaGVkLgorICAgIHN0YXR1c190IG5vdGlmeUF0KGludDY0X3QgbWVkaWFUaW1lVXMpOworCisgICAgLy8gV2lsbCBub3RpZnkgdGhlIGRyaXZlciB0aHJvdWdoICJub3RpZnlTZWVrQ29tcGxldGUiIG9uY2UgZmluaXNoZWQKKyAgICAvLyBhbmQgbmVlZE5vdGlmeSBpcyB0cnVlLgorICAgIHZvaWQgc2Vla1RvQXN5bmMoCisgICAgICAgICAgICBpbnQ2NF90IHNlZWtUaW1lVXMsCisgICAgICAgICAgICBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlID0gTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQywKKyAgICAgICAgICAgIGJvb2wgbmVlZE5vdGlmeSA9IGZhbHNlKTsKKworICAgIHN0YXR1c190IHNldFZpZGVvU2NhbGluZ01vZGUoaW50MzJfdCBtb2RlKTsKKyAgICBzdGF0dXNfdCBnZXRUcmFja0luZm8oUGFyY2VsKiByZXBseSkgY29uc3Q7CisgICAgc3RhdHVzX3QgZ2V0U2VsZWN0ZWRUcmFjayhpbnQzMl90IHR5cGUsIFBhcmNlbCogcmVwbHkpIGNvbnN0OworICAgIHN0YXR1c190IHNlbGVjdFRyYWNrKHNpemVfdCB0cmFja0luZGV4LCBib29sIHNlbGVjdCwgaW50NjRfdCB0aW1lVXMpOworICAgIHN0YXR1c190IGdldEN1cnJlbnRQb3NpdGlvbihpbnQ2NF90ICptZWRpYVVzKTsKKyAgICB2b2lkIGdldFN0YXRzKFZlY3RvcjxzcDxBTWVzc2FnZT4gPiAqbVRyYWNrU3RhdHMpOworCisgICAgc3A8TWV0YURhdGE+IGdldEZpbGVNZXRhKCk7CisgICAgZmxvYXQgZ2V0RnJhbWVSYXRlKCk7CisKKyAgICAvLyBNb2R1bGFyIERSTQorICAgIHN0YXR1c190IHByZXBhcmVEcm0oY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZkcm1TZXNzaW9uSWQpOworICAgIHN0YXR1c190IHJlbGVhc2VEcm0oKTsKKworICAgIGNvbnN0IGNoYXIgKmdldERhdGFTb3VyY2VUeXBlKCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5OdVBsYXllcjIoKTsKKworICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKK3B1YmxpYzoKKyAgICBzdHJ1Y3QgU3RyZWFtTGlzdGVuZXI7CisgICAgc3RydWN0IFNvdXJjZTsKKworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgRGVjb2RlcjsKKyAgICBzdHJ1Y3QgRGVjb2RlckJhc2U7CisgICAgc3RydWN0IERlY29kZXJQYXNzVGhyb3VnaDsKKyAgICBzdHJ1Y3QgQ0NEZWNvZGVyOworICAgIHN0cnVjdCBHZW5lcmljU291cmNlMjsKKyAgICBzdHJ1Y3QgSFRUUExpdmVTb3VyY2UyOworICAgIHN0cnVjdCBSZW5kZXJlcjsKKyAgICBzdHJ1Y3QgUlRTUFNvdXJjZTI7CisgICAgc3RydWN0IEFjdGlvbjsKKyAgICBzdHJ1Y3QgU2Vla0FjdGlvbjsKKyAgICBzdHJ1Y3QgU2V0U3VyZmFjZUFjdGlvbjsKKyAgICBzdHJ1Y3QgUmVzdW1lRGVjb2RlckFjdGlvbjsKKyAgICBzdHJ1Y3QgRmx1c2hEZWNvZGVyQWN0aW9uOworICAgIHN0cnVjdCBQb3N0TWVzc2FnZUFjdGlvbjsKKyAgICBzdHJ1Y3QgU2ltcGxlQWN0aW9uOworCisgICAgZW51bSB7CisgICAgICAgIGtXaGF0U2V0RGF0YVNvdXJjZSAgICAgICAgICAgICAgPSAnPURhUycsCisgICAgICAgIGtXaGF0UHJlcGFyZSAgICAgICAgICAgICAgICAgICAgPSAncHJlcCcsCisgICAgICAgIGtXaGF0UHJlcGFyZU5leHREYXRhU291cmNlICAgICAgPSAncE5EUycsCisgICAgICAgIGtXaGF0UGxheU5leHREYXRhU291cmNlICAgICAgICAgPSAncGxOUycsCisgICAgICAgIGtXaGF0U2V0VmlkZW9TdXJmYWNlICAgICAgICAgICAgPSAnPVZTdScsCisgICAgICAgIGtXaGF0U2V0QXVkaW9TaW5rICAgICAgICAgICAgICAgPSAnPUF1UycsCisgICAgICAgIGtXaGF0TW9yZURhdGFRdWV1ZWQgICAgICAgICAgICAgPSAnbW9yZScsCisgICAgICAgIGtXaGF0Q29uZmlnUGxheWJhY2sgICAgICAgICAgICAgPSAnY2ZQQicsCisgICAgICAgIGtXaGF0Q29uZmlnU3luYyAgICAgICAgICAgICAgICAgPSAnY2ZTeScsCisgICAgICAgIGtXaGF0R2V0UGxheWJhY2tTZXR0aW5ncyAgICAgICAgPSAnZ1BiUycsCisgICAgICAgIGtXaGF0R2V0U3luY1NldHRpbmdzICAgICAgICAgICAgPSAnZ1N5UycsCisgICAgICAgIGtXaGF0U3RhcnQgICAgICAgICAgICAgICAgICAgICAgPSAnc3RydCcsCisgICAgICAgIGtXaGF0U2NhblNvdXJjZXMgICAgICAgICAgICAgICAgPSAnc2NhbicsCisgICAgICAgIGtXaGF0VmlkZW9Ob3RpZnkgICAgICAgICAgICAgICAgPSAndmlkTicsCisgICAgICAgIGtXaGF0QXVkaW9Ob3RpZnkgICAgICAgICAgICAgICAgPSAnYXVkTicsCisgICAgICAgIGtXaGF0Q2xvc2VkQ2FwdGlvbk5vdGlmeSAgICAgICAgPSAnY2FwTicsCisgICAgICAgIGtXaGF0UmVuZGVyZXJOb3RpZnkgICAgICAgICAgICAgPSAncmVuTicsCisgICAgICAgIGtXaGF0UmVzZXQgICAgICAgICAgICAgICAgICAgICAgPSAncnNldCcsCisgICAgICAgIGtXaGF0Tm90aWZ5VGltZSAgICAgICAgICAgICAgICAgPSAnbmZ5VCcsCisgICAgICAgIGtXaGF0U2VlayAgICAgICAgICAgICAgICAgICAgICAgPSAnc2VlaycsCisgICAgICAgIGtXaGF0UGF1c2UgICAgICAgICAgICAgICAgICAgICAgPSAncGF1cycsCisgICAgICAgIGtXaGF0UmVzdW1lICAgICAgICAgICAgICAgICAgICAgPSAncnNtZScsCisgICAgICAgIGtXaGF0UG9sbER1cmF0aW9uICAgICAgICAgICAgICAgPSAncG9sRCcsCisgICAgICAgIGtXaGF0U291cmNlTm90aWZ5ICAgICAgICAgICAgICAgPSAnc3JjTicsCisgICAgICAgIGtXaGF0R2V0VHJhY2tJbmZvICAgICAgICAgICAgICAgPSAnZ1RySScsCisgICAgICAgIGtXaGF0R2V0U2VsZWN0ZWRUcmFjayAgICAgICAgICAgPSAnZ1NlbCcsCisgICAgICAgIGtXaGF0U2VsZWN0VHJhY2sgICAgICAgICAgICAgICAgPSAnc2VsVCcsCisgICAgICAgIGtXaGF0R2V0QnVmZmVyaW5nU2V0dGluZ3MgICAgICAgPSAnZ0J1cycsCisgICAgICAgIGtXaGF0U2V0QnVmZmVyaW5nU2V0dGluZ3MgICAgICAgPSAnc0J1UycsCisgICAgICAgIGtXaGF0UHJlcGFyZURybSAgICAgICAgICAgICAgICAgPSAncERybScsCisgICAgICAgIGtXaGF0UmVsZWFzZURybSAgICAgICAgICAgICAgICAgPSAnckRybScsCisgICAgfTsKKworICAgIHdwPE51UGxheWVyMkRyaXZlcj4gbURyaXZlcjsKKyAgICBwaWRfdCBtUElEOworICAgIHVpZF90IG1VSUQ7CisgICAgY29uc3Qgc3A8TWVkaWFDbG9jaz4gbU1lZGlhQ2xvY2s7CisgICAgTXV0ZXggbVNvdXJjZUxvY2s7ICAvLyBndWFyZCB8bVNvdXJjZXwuCisgICAgc3A8U291cmNlPiBtU291cmNlOworICAgIGludDY0X3QgbVNyY0lkOworICAgIHVpbnQzMl90IG1Tb3VyY2VGbGFnczsKKyAgICBzcDxTb3VyY2U+IG1OZXh0U291cmNlOworICAgIGludDY0X3QgbU5leHRTcmNJZDsKKyAgICB1aW50MzJfdCBtTmV4dFNvdXJjZUZsYWdzOworICAgIHNwPEFOYXRpdmVXaW5kb3dXcmFwcGVyPiBtTmF0aXZlV2luZG93OworICAgIHNwPE1lZGlhUGxheWVyMkludGVyZmFjZTo6QXVkaW9TaW5rPiBtQXVkaW9TaW5rOworICAgIHNwPERlY29kZXJCYXNlPiBtVmlkZW9EZWNvZGVyOworICAgIGJvb2wgbU9mZmxvYWRBdWRpbzsKKyAgICBzcDxEZWNvZGVyQmFzZT4gbUF1ZGlvRGVjb2RlcjsKKyAgICBzcDxDQ0RlY29kZXI+IG1DQ0RlY29kZXI7CisgICAgc3A8UmVuZGVyZXI+IG1SZW5kZXJlcjsKKyAgICBzcDxBTG9vcGVyPiBtUmVuZGVyZXJMb29wZXI7CisgICAgaW50MzJfdCBtQXVkaW9EZWNvZGVyR2VuZXJhdGlvbjsKKyAgICBpbnQzMl90IG1WaWRlb0RlY29kZXJHZW5lcmF0aW9uOworICAgIGludDMyX3QgbVJlbmRlcmVyR2VuZXJhdGlvbjsKKworICAgIE11dGV4IG1QbGF5aW5nVGltZUxvY2s7CisgICAgaW50NjRfdCBtTGFzdFN0YXJ0ZWRQbGF5aW5nVGltZU5zOworICAgIHZvaWQgc3RvcFBsYXliYWNrVGltZXIoY29uc3QgY2hhciAqd2hlcmUpOworICAgIHZvaWQgc3RhcnRQbGF5YmFja1RpbWVyKGNvbnN0IGNoYXIgKndoZXJlKTsKKworICAgIGludDY0X3QgbUxhc3RTdGFydGVkUmVidWZmZXJpbmdUaW1lTnM7CisgICAgdm9pZCBzdGFydFJlYnVmZmVyaW5nVGltZXIoKTsKKyAgICB2b2lkIHN0b3BSZWJ1ZmZlcmluZ1RpbWVyKGJvb2wgZXhpdGluZ1BsYXliYWNrKTsKKworICAgIGludDY0X3QgbVByZXZpb3VzU2Vla1RpbWVVczsKKworICAgIExpc3Q8c3A8QWN0aW9uPiA+IG1EZWZlcnJlZEFjdGlvbnM7CisKKyAgICBib29sIG1BdWRpb0VPUzsKKyAgICBib29sIG1WaWRlb0VPUzsKKworICAgIGJvb2wgbVNjYW5Tb3VyY2VzUGVuZGluZzsKKyAgICBpbnQzMl90IG1TY2FuU291cmNlc0dlbmVyYXRpb247CisKKyAgICBpbnQzMl90IG1Qb2xsRHVyYXRpb25HZW5lcmF0aW9uOworICAgIGludDMyX3QgbVRpbWVkVGV4dEdlbmVyYXRpb247CisKKyAgICBlbnVtIEZsdXNoU3RhdHVzIHsKKyAgICAgICAgTk9ORSwKKyAgICAgICAgRkxVU0hJTkdfREVDT0RFUiwKKyAgICAgICAgRkxVU0hJTkdfREVDT0RFUl9TSFVURE9XTiwKKyAgICAgICAgU0hVVFRJTkdfRE9XTl9ERUNPREVSLAorICAgICAgICBGTFVTSEVELAorICAgICAgICBTSFVUX0RPV04sCisgICAgfTsKKworICAgIGVudW0gRmx1c2hDb21tYW5kIHsKKyAgICAgICAgRkxVU0hfQ01EX05PTkUsCisgICAgICAgIEZMVVNIX0NNRF9GTFVTSCwKKyAgICAgICAgRkxVU0hfQ01EX1NIVVRET1dOLAorICAgIH07CisKKyAgICAvLyBTdGF0dXMgb2YgZmx1c2ggcmVzcG9uc2VzIGZyb20gdGhlIGRlY29kZXIgYW5kIHJlbmRlcmVyLgorICAgIGJvb2wgbUZsdXNoQ29tcGxldGVbMl1bMl07CisKKyAgICBGbHVzaFN0YXR1cyBtRmx1c2hpbmdBdWRpbzsKKyAgICBGbHVzaFN0YXR1cyBtRmx1c2hpbmdWaWRlbzsKKworICAgIC8vIFN0YXR1cyBvZiBmbHVzaCByZXNwb25zZXMgZnJvbSB0aGUgZGVjb2RlciBhbmQgcmVuZGVyZXIuCisgICAgYm9vbCBtUmVzdW1lUGVuZGluZzsKKworICAgIGludDMyX3QgbVZpZGVvU2NhbGluZ01vZGU7CisKKyAgICBBdWRpb1BsYXliYWNrUmF0ZSBtUGxheWJhY2tTZXR0aW5nczsKKyAgICBBVlN5bmNTZXR0aW5ncyBtU3luY1NldHRpbmdzOworICAgIGZsb2F0IG1WaWRlb0Zwc0hpbnQ7CisgICAgYm9vbCBtU3RhcnRlZDsKKyAgICBib29sIG1QcmVwYXJlZDsKKyAgICBib29sIG1SZXNldHRpbmc7CisgICAgYm9vbCBtU291cmNlU3RhcnRlZDsKKyAgICBib29sIG1BdWRpb0RlY29kZXJFcnJvcjsKKyAgICBib29sIG1WaWRlb0RlY29kZXJFcnJvcjsKKworICAgIC8vIEFjdHVhbCBwYXVzZSBzdGF0ZSwgZWl0aGVyIGFzIHJlcXVlc3RlZCBieSBjbGllbnQgb3IgZHVlIHRvIGJ1ZmZlcmluZy4KKyAgICBib29sIG1QYXVzZWQ7CisKKyAgICAvLyBQYXVzZSBzdGF0ZSBhcyByZXF1ZXN0ZWQgYnkgY2xpZW50LiBOb3RlIHRoYXQgaWYgbVBhdXNlZEJ5Q2xpZW50IGlzCisgICAgLy8gdHJ1ZSwgbVBhdXNlZCBpcyBhbHdheXMgdHJ1ZTsgaWYgbVBhdXNlZEJ5Q2xpZW50IGlzIGZhbHNlLCBtUGF1c2VkIGNvdWxkCisgICAgLy8gc3RpbGwgYmVjb21lIHRydWUsIHdoZW4gd2UgcGF1c2UgaW50ZXJuYWxseSBkdWUgdG8gYnVmZmVyaW5nLgorICAgIGJvb2wgbVBhdXNlZEJ5Q2xpZW50OworCisgICAgLy8gUGF1c2Ugc3RhdGUgYXMgcmVxdWVzdGVkIGJ5IHNvdXJjZSAoaW50ZXJuYWxseSkgZHVlIHRvIGJ1ZmZlcmluZworICAgIGJvb2wgbVBhdXNlZEZvckJ1ZmZlcmluZzsKKworICAgIC8vIE1vZHVsYXIgRFJNCisgICAgc3A8QU1lZGlhQ3J5cHRvV3JhcHBlcj4gbUNyeXB0bzsKKyAgICBib29sIG1Jc0RybVByb3RlY3RlZDsKKworICAgIHR5cGVkZWYgZW51bSB7CisgICAgICAgIERBVEFfU09VUkNFX1RZUEVfTk9ORSwKKyAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9IVFRQX0xJVkUsCisgICAgICAgIERBVEFfU09VUkNFX1RZUEVfUlRTUCwKKyAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9HRU5FUklDX1VSTCwKKyAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9HRU5FUklDX0ZELAorICAgICAgICBEQVRBX1NPVVJDRV9UWVBFX01FRElBLAorICAgIH0gREFUQV9TT1VSQ0VfVFlQRTsKKworICAgIHN0ZDo6YXRvbWljPERBVEFfU09VUkNFX1RZUEU+IG1EYXRhU291cmNlVHlwZTsKKyAgICBzdGQ6OmF0b21pYzxEQVRBX1NPVVJDRV9UWVBFPiBtTmV4dERhdGFTb3VyY2VUeXBlOworCisgICAgaW5saW5lIGNvbnN0IHNwPERlY29kZXJCYXNlPiAmZ2V0RGVjb2Rlcihib29sIGF1ZGlvKSB7CisgICAgICAgIHJldHVybiBhdWRpbyA/IG1BdWRpb0RlY29kZXIgOiBtVmlkZW9EZWNvZGVyOworICAgIH0KKworICAgIGlubGluZSB2b2lkIGNsZWFyRmx1c2hDb21wbGV0ZSgpIHsKKyAgICAgICAgbUZsdXNoQ29tcGxldGVbMF1bMF0gPSBmYWxzZTsKKyAgICAgICAgbUZsdXNoQ29tcGxldGVbMF1bMV0gPSBmYWxzZTsKKyAgICAgICAgbUZsdXNoQ29tcGxldGVbMV1bMF0gPSBmYWxzZTsKKyAgICAgICAgbUZsdXNoQ29tcGxldGVbMV1bMV0gPSBmYWxzZTsKKyAgICB9CisKKyAgICB2b2lkIGRpc2Nvbm5lY3RTb3VyY2UoKTsKKworICAgIHN0YXR1c190IGNyZWF0ZU51UGxheWVyMlNvdXJjZShjb25zdCBzcDxEYXRhU291cmNlRGVzYz4gJmRzZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8U291cmNlPiAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRBX1NPVVJDRV9UWVBFICpkYXRhU291cmNlVHlwZSk7CisKKyAgICB2b2lkIHRyeU9wZW5BdWRpb1NpbmtGb3JPZmZsb2FkKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIGNvbnN0IHNwPE1ldGFEYXRhPiAmYXVkaW9NZXRhLCBib29sIGhhc1ZpZGVvKTsKKyAgICB2b2lkIGNsb3NlQXVkaW9TaW5rKCk7CisgICAgdm9pZCByZXN0YXJ0QXVkaW8oCisgICAgICAgICAgICBpbnQ2NF90IGN1cnJlbnRQb3NpdGlvblVzLCBib29sIGZvcmNlTm9uT2ZmbG9hZCwgYm9vbCBuZWVkc1RvQ3JlYXRlQXVkaW9EZWNvZGVyKTsKKyAgICB2b2lkIGRldGVybWluZUF1ZGlvTW9kZUNoYW5nZShjb25zdCBzcDxBTWVzc2FnZT4gJmF1ZGlvRm9ybWF0KTsKKworICAgIHN0YXR1c190IGluc3RhbnRpYXRlRGVjb2RlcigKKyAgICAgICAgICAgIGJvb2wgYXVkaW8sIHNwPERlY29kZXJCYXNlPiAqZGVjb2RlciwgYm9vbCBjaGVja0F1ZGlvTW9kZUNoYW5nZSA9IHRydWUpOworCisgICAgdm9pZCB1cGRhdGVWaWRlb1NpemUoCisgICAgICAgICAgICBpbnQ2NF90IHNyY0lkLAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZpbnB1dEZvcm1hdCwKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmb3V0cHV0Rm9ybWF0ID0gTlVMTCk7CisKKyAgICB2b2lkIG5vdGlmeUxpc3RlbmVyKGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICppbiA9IE5VTEwpOworCisgICAgdm9pZCBoYW5kbGVGbHVzaENvbXBsZXRlKGJvb2wgYXVkaW8sIGJvb2wgaXNEZWNvZGVyKTsKKyAgICB2b2lkIGZpbmlzaEZsdXNoSWZQb3NzaWJsZSgpOworCisgICAgdm9pZCBvblN0YXJ0KCk7CisgICAgdm9pZCBvblJlc3VtZSgpOworICAgIHZvaWQgb25QYXVzZSgpOworCisgICAgYm9vbCBhdWRpb0RlY29kZXJTdGlsbE5lZWRlZCgpOworCisgICAgdm9pZCBmbHVzaERlY29kZXIoYm9vbCBhdWRpbywgYm9vbCBuZWVkU2h1dGRvd24pOworCisgICAgdm9pZCBmaW5pc2hSZXN1bWUoKTsKKyAgICB2b2lkIG5vdGlmeURyaXZlclNlZWtDb21wbGV0ZShpbnQ2NF90IHNyY0lkKTsKKworICAgIHZvaWQgcG9zdFNjYW5Tb3VyY2VzKCk7CisKKyAgICB2b2lkIHNjaGVkdWxlUG9sbER1cmF0aW9uKCk7CisgICAgdm9pZCBjYW5jZWxQb2xsRHVyYXRpb24oKTsKKworICAgIHZvaWQgcHJvY2Vzc0RlZmVycmVkQWN0aW9ucygpOworCisgICAgdm9pZCBwZXJmb3JtU2VlayhpbnQ2NF90IHNlZWtUaW1lVXMsIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUpOworICAgIHZvaWQgcGVyZm9ybURlY29kZXJGbHVzaChGbHVzaENvbW1hbmQgYXVkaW8sIEZsdXNoQ29tbWFuZCB2aWRlbyk7CisgICAgdm9pZCBwZXJmb3JtUmVzZXQoKTsKKyAgICB2b2lkIHBlcmZvcm1QbGF5TmV4dERhdGFTb3VyY2UoKTsKKyAgICB2b2lkIHBlcmZvcm1TY2FuU291cmNlcygpOworICAgIHZvaWQgcGVyZm9ybVNldFN1cmZhY2UoY29uc3Qgc3A8QU5hdGl2ZVdpbmRvd1dyYXBwZXI+ICZudyk7CisgICAgdm9pZCBwZXJmb3JtUmVzdW1lRGVjb2RlcnMoYm9vbCBuZWVkTm90aWZ5KTsKKworICAgIHZvaWQgb25Tb3VyY2VOb3RpZnkoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZvaWQgb25DbG9zZWRDYXB0aW9uTm90aWZ5KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKworICAgIHZvaWQgcXVldWVEZWNvZGVyU2h1dGRvd24oCisgICAgICAgICAgICBib29sIGF1ZGlvLCBib29sIHZpZGVvLCBjb25zdCBzcDxBTWVzc2FnZT4gJnJlcGx5KTsKKworICAgIHZvaWQgc2VuZFN1YnRpdGxlRGF0YShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyLCBpbnQzMl90IGJhc2VJbmRleCk7CisgICAgdm9pZCBzZW5kVGltZWRNZXRhRGF0YShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKKyAgICB2b2lkIHNlbmRUaW1lZFRleHREYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOworCisgICAgdm9pZCB3cml0ZVRyYWNrSW5mbyhQYXJjZWwqIHJlcGx5LCBjb25zdCBzcDxBTWVzc2FnZT4mIGZvcm1hdCkgY29uc3Q7CisKKyAgICBzdGF0dXNfdCBvblByZXBhcmVEcm0oY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHN0YXR1c190IG9uUmVsZWFzZURybSgpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTnVQbGF5ZXIyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTlVfUExBWUVSMl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJDQ0RlY29kZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJDQ0RlY29kZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0OGUzODgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkNDRGVjb2Rlci5jcHAKQEAgLTAsMCArMSw1ODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTnVQbGF5ZXIyQ0NEZWNvZGVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlICJOdVBsYXllcjJDQ0RlY29kZXIuaCIKKworI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9hdmNfdXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBJbiBDRUEtNzA4QiwgdGhlIG1heGltdW0gYmFuZHdpZHRoIG9mIENDIGlzIHNldCB0byA5NjAwYnBzLgorc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4QmFuZHdpdGhTaXplQnl0ZXMgPSA5NjAwIC8gODsKKworc3RydWN0IENDRGF0YSB7CisgICAgQ0NEYXRhKHVpbnQ4X3QgdHlwZSwgdWludDhfdCBkYXRhMSwgdWludDhfdCBkYXRhMikKKyAgICAgICAgOiBtVHlwZSh0eXBlKSwgbURhdGExKGRhdGExKSwgbURhdGEyKGRhdGEyKSB7CisgICAgfQorICAgIGJvb2wgZ2V0Q2hhbm5lbChzaXplX3QgKmNoYW5uZWwpIGNvbnN0IHsKKyAgICAgICAgaWYgKG1EYXRhMSA+PSAweDEwICYmIG1EYXRhMSA8PSAweDFmKSB7CisgICAgICAgICAgICAqY2hhbm5lbCA9IChtRGF0YTEgPj0gMHgxOCA/IDEgOiAwKSArIChtVHlwZSA/IDIgOiAwKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB1aW50OF90IG1UeXBlOworICAgIHVpbnQ4X3QgbURhdGExOworICAgIHVpbnQ4X3QgbURhdGEyOworfTsKKworc3RhdGljIGJvb2wgaXNOdWxsUGFkKENDRGF0YSAqY2MpIHsKKyAgICByZXR1cm4gY2MtPm1EYXRhMSA8IDB4MTAgJiYgY2MtPm1EYXRhMiA8IDB4MTA7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBCeXRlUGFpcihjb25zdCBzcDxBQnVmZmVyPiAmY2NCdWYpIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKTsKK3N0YXRpYyB2b2lkIGR1bXBCeXRlUGFpcihjb25zdCBzcDxBQnVmZmVyPiAmY2NCdWYpIHsKKyAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICBBU3RyaW5nIG91dDsKKworICAgIHdoaWxlIChvZmZzZXQgPCBjY0J1Zi0+c2l6ZSgpKSB7CisgICAgICAgIGNoYXIgdG1wWzEyOF07CisKKyAgICAgICAgQ0NEYXRhICpjYyA9IChDQ0RhdGEgKikgKGNjQnVmLT5kYXRhKCkgKyBvZmZzZXQpOworCisgICAgICAgIGlmIChpc051bGxQYWQoY2MpKSB7CisgICAgICAgICAgICAvLyAxIG51bGwgcGFkIG9yIFhEUyBtZXRhZGF0YSwgaWdub3JlCisgICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZW9mKENDRGF0YSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjYy0+bURhdGExID49IDB4MjAgJiYgY2MtPm1EYXRhMSA8PSAweDdmKSB7CisgICAgICAgICAgICAvLyAyIGJhc2ljIGNoYXJzCisgICAgICAgICAgICBzbnByaW50Zih0bXAsIHNpemVvZih0bXApLCAiWyVkXUJhc2ljOiAlYyAlYyIsIGNjLT5tVHlwZSwgY2MtPm1EYXRhMSwgY2MtPm1EYXRhMik7CisgICAgICAgIH0gZWxzZSBpZiAoKGNjLT5tRGF0YTEgPT0gMHgxMSB8fCBjYy0+bURhdGExID09IDB4MTkpCisgICAgICAgICAgICAgICAgICYmIGNjLT5tRGF0YTIgPj0gMHgzMCAmJiBjYy0+bURhdGEyIDw9IDB4M2YpIHsKKyAgICAgICAgICAgIC8vIDEgc3BlY2lhbCBjaGFyCisgICAgICAgICAgICBzbnByaW50Zih0bXAsIHNpemVvZih0bXApLCAiWyVkXVNwZWNpYWw6ICUwMnggJTAyeCIsIGNjLT5tVHlwZSwgY2MtPm1EYXRhMSwgY2MtPm1EYXRhMik7CisgICAgICAgIH0gZWxzZSBpZiAoKGNjLT5tRGF0YTEgPT0gMHgxMiB8fCBjYy0+bURhdGExID09IDB4MUEpCisgICAgICAgICAgICAgICAgICYmIGNjLT5tRGF0YTIgPj0gMHgyMCAmJiBjYy0+bURhdGEyIDw9IDB4M2YpeworICAgICAgICAgICAgLy8gMSBTcGFuaXNoL0ZyZW5jaCBjaGFyCisgICAgICAgICAgICBzbnByaW50Zih0bXAsIHNpemVvZih0bXApLCAiWyVkXVNwYW5pc2g6ICUwMnggJTAyeCIsIGNjLT5tVHlwZSwgY2MtPm1EYXRhMSwgY2MtPm1EYXRhMik7CisgICAgICAgIH0gZWxzZSBpZiAoKGNjLT5tRGF0YTEgPT0gMHgxMyB8fCBjYy0+bURhdGExID09IDB4MUIpCisgICAgICAgICAgICAgICAgICYmIGNjLT5tRGF0YTIgPj0gMHgyMCAmJiBjYy0+bURhdGEyIDw9IDB4M2YpeworICAgICAgICAgICAgLy8gMSBQb3J0dWd1ZXNlL0dlcm1hbi9EYW5pc2ggY2hhcgorICAgICAgICAgICAgc25wcmludGYodG1wLCBzaXplb2YodG1wKSwgIlslZF1HZXJtYW46ICUwMnggJTAyeCIsIGNjLT5tVHlwZSwgY2MtPm1EYXRhMSwgY2MtPm1EYXRhMik7CisgICAgICAgIH0gZWxzZSBpZiAoKGNjLT5tRGF0YTEgPT0gMHgxMSB8fCBjYy0+bURhdGExID09IDB4MTkpCisgICAgICAgICAgICAgICAgICYmIGNjLT5tRGF0YTIgPj0gMHgyMCAmJiBjYy0+bURhdGEyIDw9IDB4MmYpeworICAgICAgICAgICAgLy8gTWlkLVJvdyBDb2RlcyAoVGFibGUgNjkpCisgICAgICAgICAgICBzbnByaW50Zih0bXAsIHNpemVvZih0bXApLCAiWyVkXU1pZC1yb3c6ICUwMnggJTAyeCIsIGNjLT5tVHlwZSwgY2MtPm1EYXRhMSwgY2MtPm1EYXRhMik7CisgICAgICAgIH0gZWxzZSBpZiAoKChjYy0+bURhdGExID09IDB4MTQgfHwgY2MtPm1EYXRhMSA9PSAweDFjKQorICAgICAgICAgICAgICAgICAgJiYgY2MtPm1EYXRhMiA+PSAweDIwICYmIGNjLT5tRGF0YTIgPD0gMHgyZikKKyAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICAgICAgICAgICAgKChjYy0+bURhdGExID09IDB4MTcgfHwgY2MtPm1EYXRhMSA9PSAweDFmKQorICAgICAgICAgICAgICAgICAgJiYgY2MtPm1EYXRhMiA+PSAweDIxICYmIGNjLT5tRGF0YTIgPD0gMHgyMykpeworICAgICAgICAgICAgLy8gTWlzYyBDb250cm9sIENvZGVzIChUYWJsZSA3MCkKKyAgICAgICAgICAgIHNucHJpbnRmKHRtcCwgc2l6ZW9mKHRtcCksICJbJWRdQ3RybDogJTAyeCAlMDJ4IiwgY2MtPm1UeXBlLCBjYy0+bURhdGExLCBjYy0+bURhdGEyKTsKKyAgICAgICAgfSBlbHNlIGlmICgoY2MtPm1EYXRhMSAmIDB4NzApID09IDB4MTAKKyAgICAgICAgICAgICAgICAmJiAoY2MtPm1EYXRhMiAmIDB4NDApID09IDB4NDAKKyAgICAgICAgICAgICAgICAmJiAoKGNjLT5tRGF0YTEgJiAweDA3KSB8fCAhKGNjLT5tRGF0YTIgJiAweDIwKSkgKSB7CisgICAgICAgICAgICAvLyBQcmVhbWJsZSBBZGRyZXNzIENvZGVzIChUYWJsZSA3MSkKKyAgICAgICAgICAgIHNucHJpbnRmKHRtcCwgc2l6ZW9mKHRtcCksICJbJWRdUEFDOiAlMDJ4ICUwMngiLCBjYy0+bVR5cGUsIGNjLT5tRGF0YTEsIGNjLT5tRGF0YTIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc25wcmludGYodG1wLCBzaXplb2YodG1wKSwgIlslZF1JbnZhbGlkOiAlMDJ4ICUwMngiLCBjYy0+bVR5cGUsIGNjLT5tRGF0YTEsIGNjLT5tRGF0YTIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG91dC5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBvdXQuYXBwZW5kKCIsICIpOworICAgICAgICB9CisKKyAgICAgICAgb3V0LmFwcGVuZCh0bXApOworCisgICAgICAgIG9mZnNldCArPSBzaXplb2YoQ0NEYXRhKTsKKyAgICB9CisKKyAgICBBTE9HSSgiJXMiLCBvdXQuY19zdHIoKSk7Cit9CisKK051UGxheWVyMjo6Q0NEZWNvZGVyOjpDQ0RlY29kZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpCisgICAgOiBtTm90aWZ5KG5vdGlmeSksCisgICAgICBtU2VsZWN0ZWRUcmFjaygtMSksCisgICAgICBtRFRWQ0NQYWNrZXQobmV3IEFCdWZmZXIoa01heEJhbmR3aXRoU2l6ZUJ5dGVzKSkgeworICAgIG1EVFZDQ1BhY2tldC0+c2V0UmFuZ2UoMCwgMCk7CisKKyAgICAvLyBJbiBDRUEtNjA4LCBzdHJlYW1zIGZyb20gcGFja2V0cyB3aGljaCBoYXZlIHRoZSB2YWx1ZSAwIG9mIGNjX3R5cGUgY29udGFpbiBDQzEgYW5kIENDMiwgYW5kCisgICAgLy8gc3RyZWFtcyBmcm9tIHBhY2tldHMgd2hpY2ggaGF2ZSB0aGUgdmFsdWUgMSBvZiBjY190eXBlIGNvbnRhaW4gQ0MzIGFuZCBDQzQuCisgICAgLy8gVGhlIGZvbGxvd2luZyBhcnJheSBpbmRpY2F0ZXMgdGhlIGN1cnJlbnQgdHJhbnNtaXR0aW5nIGNoYW5uZWxzIGZvciBlYWNoIHZhbHVlIG9mIGNjX3R5cGUuCisgICAgbUxpbmUyMUNoYW5uZWxzWzBdID0gMDsgLy8gQ0MxCisgICAgbUxpbmUyMUNoYW5uZWxzWzFdID0gMjsgLy8gQ0MzCit9CisKK3NpemVfdCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6Z2V0VHJhY2tDb3VudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVRyYWNrcy5zaXplKCk7Cit9CisKK3NwPEFNZXNzYWdlPiBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6Z2V0VHJhY2tJbmZvKHNpemVfdCBpbmRleCkgY29uc3QgeworICAgIGlmICghaXNUcmFja1ZhbGlkKGluZGV4KSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbmV3IEFNZXNzYWdlKCk7CisKKyAgICBDQ1RyYWNrIHRyYWNrID0gbVRyYWNrc1tpbmRleF07CisKKyAgICBmb3JtYXQtPnNldEludDMyKCJ0eXBlIiwgTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRSk7CisgICAgZm9ybWF0LT5zZXRTdHJpbmcoImxhbmd1YWdlIiwgInVuZCIpOworCisgICAgc3dpdGNoICh0cmFjay5tVHJhY2tUeXBlKSB7CisgICAgICAgIGNhc2Uga1RyYWNrVHlwZUNFQTYwODoKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfVEVYVF9DRUFfNjA4KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGtUcmFja1R5cGVDRUE3MDg6CisgICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX1RFWFRfQ0VBXzcwOCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJVbmtub3duIHRyYWNrIHR5cGU6ICVkIiwgdHJhY2subVRyYWNrVHlwZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvLyBGb3IgQ0VBLTYwOCBDQzEsIGZpZWxkIDAgY2hhbm5lbCAwCisgICAgYm9vbCBpc0RlZmF1bHRBdXRvID0gdHJhY2subVRyYWNrVHlwZSA9PSBrVHJhY2tUeXBlQ0VBNjA4CisgICAgICAgICAgICAmJiB0cmFjay5tVHJhY2tDaGFubmVsID09IDA7CisgICAgLy8gRm9yIENFQS03MDgsIFByaW1hcnkgQ2FwdGlvbiBTZXJ2aWNlLgorICAgIGJvb2wgaXNEZWZhdWx0T25seSA9IHRyYWNrLm1UcmFja1R5cGUgPT0ga1RyYWNrVHlwZUNFQTcwOAorICAgICAgICAgICAgJiYgdHJhY2subVRyYWNrQ2hhbm5lbCA9PSAxOworICAgIGZvcm1hdC0+c2V0SW50MzIoImF1dG8iLCBpc0RlZmF1bHRBdXRvKTsKKyAgICBmb3JtYXQtPnNldEludDMyKCJkZWZhdWx0IiwgaXNEZWZhdWx0QXV0byB8fCBpc0RlZmF1bHRPbmx5KTsKKyAgICBmb3JtYXQtPnNldEludDMyKCJmb3JjZWQiLCAwKTsKKworICAgIHJldHVybiBmb3JtYXQ7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6Q0NEZWNvZGVyOjpzZWxlY3RUcmFjayhzaXplX3QgaW5kZXgsIGJvb2wgc2VsZWN0KSB7CisgICAgaWYgKCFpc1RyYWNrVmFsaWQoaW5kZXgpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKHNlbGVjdCkgeworICAgICAgICBpZiAobVNlbGVjdGVkVHJhY2sgPT0gKHNzaXplX3QpaW5kZXgpIHsKKyAgICAgICAgICAgIEFMT0dFKCJ0cmFjayAlenUgYWxyZWFkeSBzZWxlY3RlZCIsIGluZGV4KTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoInNlbGVjdGVkIHRyYWNrICV6dSIsIGluZGV4KTsKKyAgICAgICAgbVNlbGVjdGVkVHJhY2sgPSBpbmRleDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobVNlbGVjdGVkVHJhY2sgIT0gKHNzaXplX3QpaW5kZXgpIHsKKyAgICAgICAgICAgIEFMT0dFKCJ0cmFjayAlenUgaXMgbm90IHNlbGVjdGVkIiwgaW5kZXgpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigidW5zZWxlY3RlZCB0cmFjayAlenUiLCBpbmRleCk7CisgICAgICAgIG1TZWxlY3RlZFRyYWNrID0gLTE7CisgICAgfQorCisgICAgLy8gQ2xlYXIgdGhlIHByZXZpb3VzIHRyYWNrIHBheWxvYWRzCisgICAgbUNDTWFwLmNsZWFyKCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgTnVQbGF5ZXIyOjpDQ0RlY29kZXI6OmlzU2VsZWN0ZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1TZWxlY3RlZFRyYWNrID49IDAgJiYgbVNlbGVjdGVkVHJhY2sgPCAoaW50MzJfdClnZXRUcmFja0NvdW50KCk7Cit9CisKK2Jvb2wgTnVQbGF5ZXIyOjpDQ0RlY29kZXI6OmlzVHJhY2tWYWxpZChzaXplX3QgaW5kZXgpIGNvbnN0IHsKKyAgICByZXR1cm4gaW5kZXggPCBnZXRUcmFja0NvdW50KCk7Cit9CisKKy8vIHJldHVybnMgdHJ1ZSBpZiBhIG5ldyBDQyB0cmFjayBpcyBmb3VuZAorYm9vbCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6ZXh0cmFjdEZyb21TRUkoY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpIHsKKyAgICBzcDxBQnVmZmVyPiBzZWk7CisgICAgaWYgKCFhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRCdWZmZXIoInNlaSIsICZzZWkpIHx8IHNlaSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQ2NF90IHRpbWVVczsKKyAgICBDSEVDSyhhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworCisgICAgYm9vbCB0cmFja0FkZGVkID0gZmFsc2U7CisKKyAgICBjb25zdCBOQUxQb3NpdGlvbiAqbmFsID0gKE5BTFBvc2l0aW9uICopc2VpLT5kYXRhKCk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNlaS0+c2l6ZSgpIC8gc2l6ZW9mKE5BTFBvc2l0aW9uKTsgKytpLCArK25hbCkgeworICAgICAgICB0cmFja0FkZGVkIHw9IHBhcnNlU0VJTmFsVW5pdCgKKyAgICAgICAgICAgICAgICB0aW1lVXMsIGFjY2Vzc1VuaXQtPmRhdGEoKSArIG5hbC0+bmFsT2Zmc2V0LCBuYWwtPm5hbFNpemUpOworICAgIH0KKworICAgIHJldHVybiB0cmFja0FkZGVkOworfQorCisvLyByZXR1cm5zIHRydWUgaWYgYSBuZXcgQ0MgdHJhY2sgaXMgZm91bmQKK2Jvb2wgTnVQbGF5ZXIyOjpDQ0RlY29kZXI6OnBhcnNlU0VJTmFsVW5pdChpbnQ2NF90IHRpbWVVcywgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICB1bnNpZ25lZCBuYWxUeXBlID0gZGF0YVswXSAmIDB4MWY7CisKKyAgICAvLyB0aGUgYnVmZmVyIHNob3VsZCBvbmx5IGhhdmUgU0VJIGluIGl0CisgICAgaWYgKG5hbFR5cGUgIT0gNikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCB0cmFja0FkZGVkID0gZmFsc2U7CisgICAgTkFMQml0UmVhZGVyIGJyKGRhdGEgKyAxLCBzaXplIC0gMSk7CisKKyAgICAvLyBzZWlfbWVzc2FnZSgpCisgICAgd2hpbGUgKGJyLmF0TGVhc3ROdW1CaXRzTGVmdCgxNikpIHsgLy8gYXQgbGVhc3QgMTYtYml0IGZvciBzZWlfbWVzc2FnZSgpCisgICAgICAgIHVpbnQzMl90IHBheWxvYWRfdHlwZSA9IDA7CisgICAgICAgIHNpemVfdCBwYXlsb2FkX3NpemUgPSAwOworICAgICAgICB1aW50OF90IGxhc3RfYnl0ZTsKKworICAgICAgICBkbyB7CisgICAgICAgICAgICBsYXN0X2J5dGUgPSBici5nZXRCaXRzKDgpOworICAgICAgICAgICAgcGF5bG9hZF90eXBlICs9IGxhc3RfYnl0ZTsKKyAgICAgICAgfSB3aGlsZSAobGFzdF9ieXRlID09IDB4RkYpOworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGxhc3RfYnl0ZSA9IGJyLmdldEJpdHMoOCk7CisgICAgICAgICAgICBwYXlsb2FkX3NpemUgKz0gbGFzdF9ieXRlOworICAgICAgICB9IHdoaWxlIChsYXN0X2J5dGUgPT0gMHhGRik7CisKKyAgICAgICAgaWYgKHBheWxvYWRfc2l6ZSA+IFNJWkVfTUFYIC8gOAorICAgICAgICAgICAgICAgIHx8ICFici5hdExlYXN0TnVtQml0c0xlZnQocGF5bG9hZF9zaXplICogOCkpIHsKKyAgICAgICAgICAgIEFMT0dWKCJNYWxmb3JtZWQgU0VJIHBheWxvYWQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gc2VpX3BheWxvYWQoKQorICAgICAgICBpZiAocGF5bG9hZF90eXBlID09IDQpIHsKKyAgICAgICAgICAgIGJvb2wgaXNDQyA9IGZhbHNlOworICAgICAgICAgICAgaWYgKHBheWxvYWRfc2l6ZSA+IDEgKyAyICsgNCArIDEpIHsKKyAgICAgICAgICAgICAgICAvLyB1c2VyX2RhdGFfcmVnaXN0ZXJlZF9pdHVfdF90MzUoKQorCisgICAgICAgICAgICAgICAgLy8gQVRTQyBBLzcyOiA2LjQuMgorICAgICAgICAgICAgICAgIHVpbnQ4X3QgaXR1X3RfdDM1X2NvdW50cnlfY29kZSA9IGJyLmdldEJpdHMoOCk7CisgICAgICAgICAgICAgICAgdWludDE2X3QgaXR1X3RfdDM1X3Byb3ZpZGVyX2NvZGUgPSBici5nZXRCaXRzKDE2KTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB1c2VyX2lkZW50aWZpZXIgPSBici5nZXRCaXRzKDMyKTsKKyAgICAgICAgICAgICAgICB1aW50OF90IHVzZXJfZGF0YV90eXBlX2NvZGUgPSBici5nZXRCaXRzKDgpOworCisgICAgICAgICAgICAgICAgcGF5bG9hZF9zaXplIC09IDEgKyAyICsgNCArIDE7CisKKyAgICAgICAgICAgICAgICBpc0NDID0gaXR1X3RfdDM1X2NvdW50cnlfY29kZSA9PSAweEI1CisgICAgICAgICAgICAgICAgICAgICAgICAmJiBpdHVfdF90MzVfcHJvdmlkZXJfY29kZSA9PSAweDAwMzEKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHVzZXJfaWRlbnRpZmllciA9PSAnR0E5NCcKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHVzZXJfZGF0YV90eXBlX2NvZGUgPT0gMHgzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaXNDQyAmJiBwYXlsb2FkX3NpemUgPiAyKSB7CisgICAgICAgICAgICAgICAgdHJhY2tBZGRlZCB8PSBwYXJzZU1QRUdDQ0RhdGEodGltZVVzLCBici5kYXRhKCksIGJyLm51bUJpdHNMZWZ0KCkgLyA4KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIk1hbGZvcm1lZCBTRUkgcGF5bG9hZCB0eXBlIDQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dWKCJVbnN1cHBvcnRlZCBTRUkgcGF5bG9hZCB0eXBlICVkIiwgcGF5bG9hZF90eXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNraXBwaW5nIHJlbWFpbmluZyBiaXRzIG9mIHRoaXMgcGF5bG9hZAorICAgICAgICBici5za2lwQml0cyhwYXlsb2FkX3NpemUgKiA4KTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJhY2tBZGRlZDsKK30KKworLy8gcmV0dXJucyB0cnVlIGlmIGEgbmV3IENDIHRyYWNrIGlzIGZvdW5kCitib29sIE51UGxheWVyMjo6Q0NEZWNvZGVyOjpleHRyYWN0RnJvbU1QRUdVc2VyRGF0YShjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCkgeworICAgIHNwPEFCdWZmZXI+IG1wZWdVc2VyRGF0YTsKKyAgICBpZiAoIWFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEJ1ZmZlcihBTUVESUFGT1JNQVRfS0VZX01QRUdfVVNFUl9EQVRBLCAmbXBlZ1VzZXJEYXRhKQorICAgICAgICAgICAgfHwgbXBlZ1VzZXJEYXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGludDY0X3QgdGltZVVzOworICAgIENIRUNLKGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CisKKyAgICBib29sIHRyYWNrQWRkZWQgPSBmYWxzZTsKKworICAgIGNvbnN0IHNpemVfdCAqdXNlckRhdGEgPSAoc2l6ZV90ICopbXBlZ1VzZXJEYXRhLT5kYXRhKCk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1wZWdVc2VyRGF0YS0+c2l6ZSgpIC8gc2l6ZW9mKHNpemVfdCk7ICsraSkgeworICAgICAgICB0cmFja0FkZGVkIHw9IHBhcnNlTVBFR1VzZXJEYXRhVW5pdCgKKyAgICAgICAgICAgICAgICB0aW1lVXMsIGFjY2Vzc1VuaXQtPmRhdGEoKSArIHVzZXJEYXRhW2ldLCBhY2Nlc3NVbml0LT5zaXplKCkgLSB1c2VyRGF0YVtpXSk7CisgICAgfQorCisgICAgcmV0dXJuIHRyYWNrQWRkZWQ7Cit9CisKKy8vIHJldHVybnMgdHJ1ZSBpZiBhIG5ldyBDQyB0cmFjayBpcyBmb3VuZAorYm9vbCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6cGFyc2VNUEVHVXNlckRhdGFVbml0KGludDY0X3QgdGltZVVzLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFCaXRSZWFkZXIgYnIoZGF0YSArIDQsIDUpOworCisgICAgdWludDMyX3QgdXNlcl9pZGVudGlmaWVyID0gYnIuZ2V0Qml0cygzMik7CisgICAgdWludDhfdCB1c2VyX2RhdGFfdHlwZSA9IGJyLmdldEJpdHMoOCk7CisKKyAgICBpZiAodXNlcl9pZGVudGlmaWVyID09ICdHQTk0JyAmJiB1c2VyX2RhdGFfdHlwZSA9PSAweDMpIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlTVBFR0NDRGF0YSh0aW1lVXMsIGRhdGEgKyA5LCBzaXplIC0gOSk7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyByZXR1cm5zIHRydWUgaWYgYSBuZXcgQ0MgdHJhY2sgaXMgZm91bmQKK2Jvb2wgTnVQbGF5ZXIyOjpDQ0RlY29kZXI6OnBhcnNlTVBFR0NDRGF0YShpbnQ2NF90IHRpbWVVcywgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBib29sIHRyYWNrQWRkZWQgPSBmYWxzZTsKKworICAgIC8vIE1QRUdfY2NfZGF0YSgpCisgICAgLy8gQVRTQyBBLzUzIFBhcnQgNDogNi4yLjMuMQorICAgIEFCaXRSZWFkZXIgYnIoZGF0YSwgc2l6ZSk7CisKKyAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8PSAxNikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYnIuc2tpcEJpdHMoMSk7CisgICAgYm9vbCBwcm9jZXNzX2NjX2RhdGFfZmxhZyA9IGJyLmdldEJpdHMoMSk7CisgICAgYnIuc2tpcEJpdHMoMSk7CisgICAgc2l6ZV90IGNjX2NvdW50ID0gYnIuZ2V0Qml0cyg1KTsKKyAgICBici5za2lwQml0cyg4KTsKKworICAgIGlmICghcHJvY2Vzc19jY19kYXRhX2ZsYWcgfHwgMyAqIDggKiBjY19jb3VudCA+PSBici5udW1CaXRzTGVmdCgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzcDxBQnVmZmVyPiBsaW5lMjFDQ0J1ZiA9IE5VTEw7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNjX2NvdW50OyArK2kpIHsKKyAgICAgICAgYnIuc2tpcEJpdHMoNSk7CisgICAgICAgIGJvb2wgY2NfdmFsaWQgPSBici5nZXRCaXRzKDEpOworICAgICAgICB1aW50OF90IGNjX3R5cGUgPSBici5nZXRCaXRzKDIpOworCisgICAgICAgIGlmIChjY192YWxpZCkgeworICAgICAgICAgICAgaWYgKGNjX3R5cGUgPT0gMykgeworICAgICAgICAgICAgICAgIGlmIChtRFRWQ0NQYWNrZXQtPnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhY2tBZGRlZCB8PSBwYXJzZURUVkNDUGFja2V0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVVcywgbURUVkNDUGFja2V0LT5kYXRhKCksIG1EVFZDQ1BhY2tldC0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgbURUVkNDUGFja2V0LT5zZXRSYW5nZSgwLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVtY3B5KG1EVFZDQ1BhY2tldC0+ZGF0YSgpICsgbURUVkNDUGFja2V0LT5zaXplKCksIGJyLmRhdGEoKSwgMik7CisgICAgICAgICAgICAgICAgbURUVkNDUGFja2V0LT5zZXRSYW5nZSgwLCBtRFRWQ0NQYWNrZXQtPnNpemUoKSArIDIpOworICAgICAgICAgICAgICAgIGJyLnNraXBCaXRzKDE2KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobURUVkNDUGFja2V0LT5zaXplKCkgPiAwICYmIGNjX3R5cGUgPT0gMikgeworICAgICAgICAgICAgICAgIG1lbWNweShtRFRWQ0NQYWNrZXQtPmRhdGEoKSArIG1EVFZDQ1BhY2tldC0+c2l6ZSgpLCBici5kYXRhKCksIDIpOworICAgICAgICAgICAgICAgIG1EVFZDQ1BhY2tldC0+c2V0UmFuZ2UoMCwgbURUVkNDUGFja2V0LT5zaXplKCkgKyAyKTsKKyAgICAgICAgICAgICAgICBici5za2lwQml0cygxNik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNjX3R5cGUgPT0gMCB8fCBjY190eXBlID09IDEpIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGNjX2RhdGFfMSA9IGJyLmdldEJpdHMoOCkgJiAweDdmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2NfZGF0YV8yID0gYnIuZ2V0Qml0cyg4KSAmIDB4N2Y7CisKKyAgICAgICAgICAgICAgICBDQ0RhdGEgY2MoY2NfdHlwZSwgY2NfZGF0YV8xLCBjY19kYXRhXzIpOworCisgICAgICAgICAgICAgICAgaWYgKGlzTnVsbFBhZCgmY2MpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHNpemVfdCBjaGFubmVsOworICAgICAgICAgICAgICAgIGlmIChjYy5nZXRDaGFubmVsKCZjaGFubmVsKSkgeworICAgICAgICAgICAgICAgICAgICBtTGluZTIxQ2hhbm5lbHNbY2NfdHlwZV0gPSBjaGFubmVsOworCisgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIG5ldyB0cmFjayBpZiBpdCBkb2VzIG5vdCBleGlzdC4KKyAgICAgICAgICAgICAgICAgICAgZ2V0VHJhY2tJbmRleChrVHJhY2tUeXBlQ0VBNjA4LCBjaGFubmVsLCAmdHJhY2tBZGRlZCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGlzU2VsZWN0ZWQoKSAmJiBtVHJhY2tzW21TZWxlY3RlZFRyYWNrXS5tVHJhY2tUeXBlID09IGtUcmFja1R5cGVDRUE2MDgKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIG1UcmFja3NbbVNlbGVjdGVkVHJhY2tdLm1UcmFja0NoYW5uZWwgPT0gbUxpbmUyMUNoYW5uZWxzW2NjX3R5cGVdKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lMjFDQ0J1ZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lMjFDQ0J1ZiA9IG5ldyBBQnVmZmVyKChjY19jb3VudCAtIGkpICogc2l6ZW9mKENDRGF0YSkpOworICAgICAgICAgICAgICAgICAgICAgICAgbGluZTIxQ0NCdWYtPnNldFJhbmdlKDAsIDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShsaW5lMjFDQ0J1Zi0+ZGF0YSgpICsgbGluZTIxQ0NCdWYtPnNpemUoKSwgJmNjLCBzaXplb2YoY2MpKTsKKyAgICAgICAgICAgICAgICAgICAgbGluZTIxQ0NCdWYtPnNldFJhbmdlKDAsIGxpbmUyMUNDQnVmLT5zaXplKCkgKyBzaXplb2YoQ0NEYXRhKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBici5za2lwQml0cygxNik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoKGNjX3R5cGUgPT0gMyB8fCBjY190eXBlID09IDIpICYmIG1EVFZDQ1BhY2tldC0+c2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIHRyYWNrQWRkZWQgfD0gcGFyc2VEVFZDQ1BhY2tldCh0aW1lVXMsIG1EVFZDQ1BhY2tldC0+ZGF0YSgpLCBtRFRWQ0NQYWNrZXQtPnNpemUoKSk7CisgICAgICAgICAgICAgICAgbURUVkNDUGFja2V0LT5zZXRSYW5nZSgwLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyLnNraXBCaXRzKDE2KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpc1NlbGVjdGVkKCkgJiYgbVRyYWNrc1ttU2VsZWN0ZWRUcmFja10ubVRyYWNrVHlwZSA9PSBrVHJhY2tUeXBlQ0VBNjA4CisgICAgICAgICAgICAmJiBsaW5lMjFDQ0J1ZiAhPSBOVUxMICYmIGxpbmUyMUNDQnVmLT5zaXplKCkgPiAwKSB7CisgICAgICAgIG1DQ01hcC5hZGQodGltZVVzLCBsaW5lMjFDQ0J1Zik7CisgICAgfQorCisgICAgcmV0dXJuIHRyYWNrQWRkZWQ7Cit9CisKKy8vIHJldHVybnMgdHJ1ZSBpZiBhIG5ldyBDQyB0cmFjayBpcyBmb3VuZAorYm9vbCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6cGFyc2VEVFZDQ1BhY2tldChpbnQ2NF90IHRpbWVVcywgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICAvLyBDRUEtNzA4QiA1IERUVkNDIFBhY2tldCBMYXllci4KKyAgICBBQml0UmVhZGVyIGJyKGRhdGEsIHNpemUpOworICAgIGJyLnNraXBCaXRzKDIpOworCisgICAgc2l6ZV90IHBhY2tldF9zaXplID0gYnIuZ2V0Qml0cyg2KTsKKyAgICBpZiAocGFja2V0X3NpemUgPT0gMCkgcGFja2V0X3NpemUgPSA2NDsKKyAgICBwYWNrZXRfc2l6ZSAqPSAyOworCisgICAgaWYgKHNpemUgIT0gcGFja2V0X3NpemUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgdHJhY2tBZGRlZCA9IGZhbHNlOworCisgICAgd2hpbGUgKGJyLm51bUJpdHNMZWZ0KCkgPj0gMTYpIHsKKyAgICAgICAgLy8gQ0VBLTcwOEIgRmlndXJlIDUgYW5kIDYuCisgICAgICAgIHVpbnQ4X3Qgc2VydmljZV9udW1iZXIgPSBici5nZXRCaXRzKDMpOworICAgICAgICBzaXplX3QgYmxvY2tfc2l6ZSA9IGJyLmdldEJpdHMoNSk7CisKKyAgICAgICAgaWYgKHNlcnZpY2VfbnVtYmVyID09IDY0KSB7CisgICAgICAgICAgICBici5za2lwQml0cygyKTsKKyAgICAgICAgICAgIHNlcnZpY2VfbnVtYmVyID0gYnIuZ2V0Qml0cyg2KTsKKworICAgICAgICAgICAgaWYgKHNlcnZpY2VfbnVtYmVyIDwgNjQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJhY2tBZGRlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgYmxvY2tfc2l6ZSAqIDgpIHsKKyAgICAgICAgICAgIHJldHVybiB0cmFja0FkZGVkOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJsb2NrX3NpemUgPiAwKSB7CisgICAgICAgICAgICBzaXplX3QgdHJhY2tJbmRleCA9IGdldFRyYWNrSW5kZXgoa1RyYWNrVHlwZUNFQTcwOCwgc2VydmljZV9udW1iZXIsICZ0cmFja0FkZGVkKTsKKyAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRUcmFjayA9PSAoc3NpemVfdCl0cmFja0luZGV4KSB7CisgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gY2NQYWNrZXQgPSBuZXcgQUJ1ZmZlcihibG9ja19zaXplKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoY2NQYWNrZXQtPmRhdGEoKSwgYnIuZGF0YSgpLCBibG9ja19zaXplKTsKKyAgICAgICAgICAgICAgICBtQ0NNYXAuYWRkKHRpbWVVcywgY2NQYWNrZXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyLnNraXBCaXRzKGJsb2NrX3NpemUgKiA4KTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJhY2tBZGRlZDsKK30KKworLy8gcmV0dXJuIHRoZSB0cmFjayBpbmRleCBmb3IgYSBnaXZlbiB0eXBlIGFuZCBjaGFubmVsLgorLy8gaWYgdGhlIHRyYWNrIGRvZXMgbm90IGV4aXN0LCBjcmVhdGVzIGEgbmV3IG9uZS4KK3NpemVfdCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6Z2V0VHJhY2tJbmRleCgKKyAgICAgICAgaW50MzJfdCB0cmFja1R5cGUsIHNpemVfdCBjaGFubmVsLCBib29sICp0cmFja0FkZGVkKSB7CisgICAgQ0NUcmFjayB0cmFjayh0cmFja1R5cGUsIGNoYW5uZWwpOworICAgIHNzaXplX3QgaW5kZXggPSBtVHJhY2tJbmRpY2VzLmluZGV4T2ZLZXkodHJhY2spOworCisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAvLyBBIG5ldyB0cmFjayBpcyBhZGRlZC4KKyAgICAgICAgaW5kZXggPSBtVHJhY2tzLnNpemUoKTsKKyAgICAgICAgbVRyYWNrSW5kaWNlcy5hZGQodHJhY2ssIGluZGV4KTsKKyAgICAgICAgbVRyYWNrcy5hZGQodHJhY2spOworICAgICAgICAqdHJhY2tBZGRlZCA9IHRydWU7CisgICAgICAgIHJldHVybiBpbmRleDsKKyAgICB9CisKKyAgICByZXR1cm4gbVRyYWNrSW5kaWNlcy52YWx1ZUF0KGluZGV4KTsKK30KKwordm9pZCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6ZGVjb2RlKGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KSB7CisgICAgaWYgKGV4dHJhY3RGcm9tTVBFR1VzZXJEYXRhKGFjY2Vzc1VuaXQpIHx8IGV4dHJhY3RGcm9tU0VJKGFjY2Vzc1VuaXQpKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICAgICAgbXNnLT5zZXRJbnQzMigid2hhdCIsIGtXaGF0VHJhY2tBZGRlZCk7CisgICAgICAgIG1zZy0+cG9zdCgpOworICAgIH0KKyAgICAvLyBUT0RPOiBleHRyYWN0IENDIGZyb20gb3RoZXIgc291cmNlcworfQorCit2b2lkIE51UGxheWVyMjo6Q0NEZWNvZGVyOjpkaXNwbGF5KGludDY0X3QgdGltZVVzKSB7CisgICAgaWYgKCFpc1NlbGVjdGVkKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNzaXplX3QgaW5kZXggPSBtQ0NNYXAuaW5kZXhPZktleSh0aW1lVXMpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1YoImNjIGZvciB0aW1lc3RhbXAgJSIgUFJJZDY0ICIgbm90IGZvdW5kIiwgdGltZVVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGNjQnVmOworCisgICAgaWYgKGluZGV4ID09IDApIHsKKyAgICAgICAgY2NCdWYgPSBtQ0NNYXAudmFsdWVBdChpbmRleCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2l6ZV90IHNpemUgPSAwOworCisgICAgICAgIGZvciAoc3NpemVfdCBpID0gMDsgaSA8PSBpbmRleDsgKytpKSB7CisgICAgICAgICAgICBzaXplICs9IG1DQ01hcC52YWx1ZUF0KGkpLT5zaXplKCk7CisgICAgICAgIH0KKworICAgICAgICBjY0J1ZiA9IG5ldyBBQnVmZmVyKHNpemUpOworICAgICAgICBjY0J1Zi0+c2V0UmFuZ2UoMCwgMCk7CisKKyAgICAgICAgZm9yIChzc2l6ZV90IGkgPSAwOyBpIDw9IGluZGV4OyArK2kpIHsKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZiA9IG1DQ01hcC52YWx1ZUF0KGkpOworICAgICAgICAgICAgbWVtY3B5KGNjQnVmLT5kYXRhKCkgKyBjY0J1Zi0+c2l6ZSgpLCBidWYtPmRhdGEoKSwgYnVmLT5zaXplKCkpOworICAgICAgICAgICAgY2NCdWYtPnNldFJhbmdlKDAsIGNjQnVmLT5zaXplKCkgKyBidWYtPnNpemUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY2NCdWYtPnNpemUoKSA+IDApIHsKKyNpZiAwCisgICAgICAgIGR1bXBCeXRlUGFpcihjY0J1Zik7CisjZW5kaWYKKworICAgICAgICBjY0J1Zi0+bWV0YSgpLT5zZXRJbnQzMihBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lOREVYLCBtU2VsZWN0ZWRUcmFjayk7CisgICAgICAgIGNjQnVmLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOworICAgICAgICBjY0J1Zi0+bWV0YSgpLT5zZXRJbnQ2NCgiZHVyYXRpb25VcyIsIDBsbCk7CisKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1Ob3RpZnktPmR1cCgpOworICAgICAgICBtc2ctPnNldEludDMyKCJ3aGF0Iiwga1doYXRDbG9zZWRDYXB0aW9uRGF0YSk7CisgICAgICAgIG1zZy0+c2V0QnVmZmVyKCJidWZmZXIiLCBjY0J1Zik7CisgICAgICAgIG1zZy0+cG9zdCgpOworICAgIH0KKworICAgIC8vIHJlbW92ZSBhbGwgZW50cmllcyBiZWZvcmUgdGltZVVzCisgICAgbUNDTWFwLnJlbW92ZUl0ZW1zQXQoMCwgaW5kZXggKyAxKTsKK30KKwordm9pZCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6Zmx1c2goKSB7CisgICAgbUNDTWFwLmNsZWFyKCk7CisgICAgbURUVkNDUGFja2V0LT5zZXRSYW5nZSgwLCAwKTsKK30KKworaW50MzJfdCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6Q0NUcmFjazo6Y29tcGFyZShjb25zdCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6Q0NUcmFjayYgcmhzKSBjb25zdCB7CisgICAgaW50MzJfdCBjbXAgPSBtVHJhY2tUeXBlIC0gcmhzLm1UcmFja1R5cGU7CisgICAgaWYgKGNtcCAhPSAwKSByZXR1cm4gY21wOworICAgIHJldHVybiBtVHJhY2tDaGFubmVsIC0gcmhzLm1UcmFja0NoYW5uZWw7Cit9CisKK2Jvb2wgTnVQbGF5ZXIyOjpDQ0RlY29kZXI6OkNDVHJhY2s6Om9wZXJhdG9yPChjb25zdCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6Q0NUcmFjayYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbXBhcmUocmhzKSA8IDA7Cit9CisKK2Jvb2wgTnVQbGF5ZXIyOjpDQ0RlY29kZXI6OkNDVHJhY2s6Om9wZXJhdG9yPT0oY29uc3QgTnVQbGF5ZXIyOjpDQ0RlY29kZXI6OkNDVHJhY2smIHJocykgY29uc3QgeworICAgIHJldHVybiBjb21wYXJlKHJocykgPT0gMDsKK30KKworYm9vbCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6Q0NUcmFjazo6b3BlcmF0b3IhPShjb25zdCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6Q0NUcmFjayYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbXBhcmUocmhzKSAhPSAwOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkNDRGVjb2Rlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJDQ0RlY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2Q1ZWEyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJDQ0RlY29kZXIuaApAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE5VUExBWUVSMl9DQ0RFQ09ERVJfSF8KKworI2RlZmluZSBOVVBMQVlFUjJfQ0NERUNPREVSX0hfCisKKyNpbmNsdWRlICJOdVBsYXllcjIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgTnVQbGF5ZXIyOjpDQ0RlY29kZXIgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgZW51bSB7CisgICAgICAgIGtXaGF0Q2xvc2VkQ2FwdGlvbkRhdGEsCisgICAgICAgIGtXaGF0VHJhY2tBZGRlZCwKKyAgICB9OworCisgICAgZW51bSB7CisgICAgICAgIGtUcmFja1R5cGVDRUE2MDgsCisgICAgICAgIGtUcmFja1R5cGVDRUE3MDgsCisgICAgfTsKKworICAgIGV4cGxpY2l0IENDRGVjb2Rlcihjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSk7CisKKyAgICBzaXplX3QgZ2V0VHJhY2tDb3VudCgpIGNvbnN0OworICAgIHNwPEFNZXNzYWdlPiBnZXRUcmFja0luZm8oc2l6ZV90IGluZGV4KSBjb25zdDsKKyAgICBzdGF0dXNfdCBzZWxlY3RUcmFjayhzaXplX3QgaW5kZXgsIGJvb2wgc2VsZWN0KTsKKyAgICBib29sIGlzU2VsZWN0ZWQoKSBjb25zdDsKKyAgICB2b2lkIGRlY29kZShjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCk7CisgICAgdm9pZCBkaXNwbGF5KGludDY0X3QgdGltZVVzKTsKKyAgICB2b2lkIGZsdXNoKCk7CisKK3ByaXZhdGU6CisgICAgLy8gQ0MgdHJhY2sgaWRlbnRpZmllci4KKyAgICBzdHJ1Y3QgQ0NUcmFjayB7CisgICAgICAgIENDVHJhY2soKSA6IG1UcmFja1R5cGUoMCksIG1UcmFja0NoYW5uZWwoMCkgeyB9CisKKyAgICAgICAgQ0NUcmFjayhjb25zdCBpbnQzMl90IHRyYWNrVHlwZSwgY29uc3Qgc2l6ZV90IHRyYWNrQ2hhbm5lbCkKKyAgICAgICAgICAgIDogbVRyYWNrVHlwZSh0cmFja1R5cGUpLCBtVHJhY2tDaGFubmVsKHRyYWNrQ2hhbm5lbCkgeyB9CisKKyAgICAgICAgaW50MzJfdCBtVHJhY2tUeXBlOworICAgICAgICBzaXplX3QgbVRyYWNrQ2hhbm5lbDsKKworICAgICAgICAvLyBUaGUgb3JkZXJpbmcgb2YgQ0NUcmFja3MgaXMgdG8gYnVpbGQgYSBtYXAgb2YgdHJhY2sgdG8gaW5kZXguCisgICAgICAgIC8vIEl0IGlzIG5lY2Vzc2FyeSB0byBmaW5kIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCBDQ1RyYWNrIHdoZW4gQ0MgZGF0YSBjb21lcy4KKyAgICAgICAgaW50IGNvbXBhcmUoY29uc3QgTnVQbGF5ZXIyOjpDQ0RlY29kZXI6OkNDVHJhY2smIHJocykgY29uc3Q7CisgICAgICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6Q0NUcmFjayYgcmhzKSBjb25zdDsKKyAgICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6Q0NUcmFjayYgcmhzKSBjb25zdDsKKyAgICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6Q0NUcmFjayYgcmhzKSBjb25zdDsKKyAgICB9OworCisgICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7CisgICAgS2V5ZWRWZWN0b3I8aW50NjRfdCwgc3A8QUJ1ZmZlcj4gPiBtQ0NNYXA7CisgICAgc3NpemVfdCBtU2VsZWN0ZWRUcmFjazsKKyAgICBLZXllZFZlY3RvcjxDQ1RyYWNrLCBzaXplX3Q+IG1UcmFja0luZGljZXM7CisgICAgVmVjdG9yPENDVHJhY2s+IG1UcmFja3M7CisKKyAgICAvLyBDRUEtNjA4IGNsb3NlZCBjYXB0aW9uCisgICAgc2l6ZV90IG1MaW5lMjFDaGFubmVsc1syXTsgLy8gVGhlIGN1cnJlbnQgY2hhbm5lbHMgb2YgTlRTQ19DQ19GSUVMRF97MSwgMn0KKworICAgIC8vIENFQS03MDggY2xvc2VkIGNhcHRpb24KKyAgICBzcDxBQnVmZmVyPiBtRFRWQ0NQYWNrZXQ7CisKKyAgICBib29sIGlzVHJhY2tWYWxpZChzaXplX3QgaW5kZXgpIGNvbnN0OworICAgIHNpemVfdCBnZXRUcmFja0luZGV4KGludDMyX3QgdHJhY2tUeXBlLCBzaXplX3QgY2hhbm5lbCwgYm9vbCAqdHJhY2tBZGRlZCk7CisKKyAgICAvLyBFeHRyYWN0IGZyb20gSC4yNjQgU0VJcworICAgIGJvb2wgZXh0cmFjdEZyb21TRUkoY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpOworICAgIGJvb2wgcGFyc2VTRUlOYWxVbml0KGludDY0X3QgdGltZVVzLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgICAvLyBFeHRyYWN0IGZyb20gTVBFRyB1c2VyIGRhdGEKKyAgICBib29sIGV4dHJhY3RGcm9tTVBFR1VzZXJEYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KTsKKyAgICBib29sIHBhcnNlTVBFR1VzZXJEYXRhVW5pdChpbnQ2NF90IHRpbWVVcywgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgICAgLy8gRXh0cmFjdCBDQyB0cmFja3MgZnJvbSBNUEVHX2NjX2RhdGEKKyAgICBib29sIHBhcnNlTVBFR0NDRGF0YShpbnQ2NF90IHRpbWVVcywgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIGJvb2wgcGFyc2VEVFZDQ1BhY2tldChpbnQ2NF90IHRpbWVVcywgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ0NEZWNvZGVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTlVQTEFZRVIyX0NDREVDT0RFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEZWNvZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRGVjb2Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ1MTM4YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRGVjb2Rlci5jcHAKQEAgLTAsMCArMSwxMjk5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk51UGxheWVyMkRlY29kZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgIk51UGxheWVyMkNDRGVjb2Rlci5oIgorI2luY2x1ZGUgIk51UGxheWVyMkRlY29kZXIuaCIKKyNpbmNsdWRlICJOdVBsYXllcjJEcm0uaCIKKyNpbmNsdWRlICJOdVBsYXllcjJSZW5kZXJlci5oIgorI2luY2x1ZGUgIk51UGxheWVyMlNvdXJjZS5oIgorCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUJ1ZmZlckhvbGRlci5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUNvZGVjLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrV3JhcHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYXZjX3V0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5oPgorCisjaW5jbHVkZSA8c3lzdGVtL3dpbmRvdy5oPgorI2luY2x1ZGUgIkFUU1BhcnNlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBmbG9hdCBrRGlzcGxheVJlZnJlc2hpbmdSYXRlID0gNjAuZjsgLy8gVE9ETzogZ2V0IHRoaXMgZnJvbSB0aGUgZGlzcGxheQorCisvLyBUaGUgZGVmYXVsdCB0b3RhbCB2aWRlbyBmcmFtZSByYXRlIG9mIGEgc3RyZWFtIHdoZW4gdGhhdCBpbmZvIGlzIG5vdCBhdmFpbGFibGUgZnJvbQorLy8gdGhlIHNvdXJjZS4KK3N0YXRpYyBmbG9hdCBrRGVmYXVsdFZpZGVvRnJhbWVSYXRlVG90YWwgPSAzMC5mOworCitzdGF0aWMgaW5saW5lIGJvb2wgZ2V0QXVkaW9EZWVwQnVmZmVyU2V0dGluZygpIHsKKyAgICByZXR1cm4gcHJvcGVydHlfZ2V0X2Jvb2woIm1lZGlhLnN0YWdlZnJpZ2h0LmF1ZGlvLmRlZXAiLCBmYWxzZSAvKiBkZWZhdWx0X3ZhbHVlICovKTsKK30KKworTnVQbGF5ZXIyOjpEZWNvZGVyOjpEZWNvZGVyKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKKyAgICAgICAgY29uc3Qgc3A8U291cmNlPiAmc291cmNlLAorICAgICAgICBwaWRfdCBwaWQsCisgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgY29uc3Qgc3A8UmVuZGVyZXI+ICZyZW5kZXJlciwKKyAgICAgICAgY29uc3Qgc3A8QU5hdGl2ZVdpbmRvd1dyYXBwZXI+ICZud3csCisgICAgICAgIGNvbnN0IHNwPENDRGVjb2Rlcj4gJmNjRGVjb2RlcikKKyAgICA6IERlY29kZXJCYXNlKG5vdGlmeSksCisgICAgICBtTmF0aXZlV2luZG93KG53dyksCisgICAgICBtU291cmNlKHNvdXJjZSksCisgICAgICBtUmVuZGVyZXIocmVuZGVyZXIpLAorICAgICAgbUNDRGVjb2RlcihjY0RlY29kZXIpLAorICAgICAgbVBpZChwaWQpLAorICAgICAgbVVpZCh1aWQpLAorICAgICAgbVNraXBSZW5kZXJpbmdVbnRpbE1lZGlhVGltZVVzKC0xbGwpLAorICAgICAgbU51bUZyYW1lc1RvdGFsKDBsbCksCisgICAgICBtTnVtSW5wdXRGcmFtZXNEcm9wcGVkKDBsbCksCisgICAgICBtTnVtT3V0cHV0RnJhbWVzRHJvcHBlZCgwbGwpLAorICAgICAgbVZpZGVvV2lkdGgoMCksCisgICAgICBtVmlkZW9IZWlnaHQoMCksCisgICAgICBtSXNBdWRpbyh0cnVlKSwKKyAgICAgIG1Jc1ZpZGVvQVZDKGZhbHNlKSwKKyAgICAgIG1Jc1NlY3VyZShmYWxzZSksCisgICAgICBtSXNFbmNyeXB0ZWQoZmFsc2UpLAorICAgICAgbUlzRW5jcnlwdGVkT2JzZXJ2ZWRFYXJsaWVyKGZhbHNlKSwKKyAgICAgIG1Gb3JtYXRDaGFuZ2VQZW5kaW5nKGZhbHNlKSwKKyAgICAgIG1UaW1lQ2hhbmdlUGVuZGluZyhmYWxzZSksCisgICAgICBtRnJhbWVSYXRlVG90YWwoa0RlZmF1bHRWaWRlb0ZyYW1lUmF0ZVRvdGFsKSwKKyAgICAgIG1QbGF5YmFja1NwZWVkKDEuMGYpLAorICAgICAgbU51bVZpZGVvVGVtcG9yYWxMYXllclRvdGFsKDEpLCAvLyBkZWNvZGUgYWxsIGxheWVycworICAgICAgbU51bVZpZGVvVGVtcG9yYWxMYXllckFsbG93ZWQoMSksCisgICAgICBtQ3VycmVudE1heFZpZGVvVGVtcG9yYWxMYXllcklkKDApLAorICAgICAgbVJlc3VtZVBlbmRpbmcoZmFsc2UpLAorICAgICAgbUNvbXBvbmVudE5hbWUoImRlY29kZXIiKSB7CisgICAgbVZpZGVvVGVtcG9yYWxMYXllckFnZ3JlZ2F0ZUZwc1swXSA9IG1GcmFtZVJhdGVUb3RhbDsKK30KKworTnVQbGF5ZXIyOjpEZWNvZGVyOjp+RGVjb2RlcigpIHsKKyAgICAvLyBOZWVkIHRvIHN0b3AgbG9vcGVyIGZpcnN0IHNpbmNlIG1Db2RlYyBjb3VsZCBiZSBhY2Nlc3NlZCBvbiB0aGUgbURlY29kZXJMb29wZXIuCisgICAgc3RvcExvb3BlcigpOworICAgIGlmIChtQ29kZWMgIT0gTlVMTCkgeworICAgICAgICBtQ29kZWMtPnJlbGVhc2UoKTsKKyAgICB9CisgICAgcmVsZWFzZUFuZFJlc2V0TWVkaWFCdWZmZXJzKCk7Cit9CisKK3NwPEFNZXNzYWdlPiBOdVBsYXllcjI6OkRlY29kZXI6OmdldFN0YXRzKCkgY29uc3QgeworICAgIG1TdGF0cy0+c2V0SW50NjQoImZyYW1lcy10b3RhbCIsIG1OdW1GcmFtZXNUb3RhbCk7CisgICAgbVN0YXRzLT5zZXRJbnQ2NCgiZnJhbWVzLWRyb3BwZWQtaW5wdXQiLCBtTnVtSW5wdXRGcmFtZXNEcm9wcGVkKTsKKyAgICBtU3RhdHMtPnNldEludDY0KCJmcmFtZXMtZHJvcHBlZC1vdXRwdXQiLCBtTnVtT3V0cHV0RnJhbWVzRHJvcHBlZCk7CisgICAgcmV0dXJuIG1TdGF0czsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpEZWNvZGVyOjpzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8QU5hdGl2ZVdpbmRvd1dyYXBwZXI+ICZud3cpIHsKKyAgICBpZiAobnd3ID09IE5VTEwgfHwgbnd3LT5nZXRBTmF0aXZlV2luZG93KCkgPT0gTlVMTAorICAgICAgICB8fCBBRGVidWc6OmlzRXhwZXJpbWVudEVuYWJsZWQoImxlZ2FjeS1zZXRzdXJmYWNlIikpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0VmlkZW9TdXJmYWNlLCB0aGlzKTsKKworICAgIG1zZy0+c2V0T2JqZWN0KCJzdXJmYWNlIiwgbnd3KTsKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworICAgIGlmIChlcnIgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgeworICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIEFMT0dWKCJbJXNdIG9uTWVzc2FnZTogJXMiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBtc2ctPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisKKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRDb2RlY05vdGlmeToKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBjYklEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImNhbGxiYWNrSUQiLCAmY2JJRCkpOworCisgICAgICAgICAgICBBTE9HVigiWyVzXSBrV2hhdENvZGVjTm90aWZ5OiBjYklEID0gJWQsIHBhdXNlZCA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgbUlzQXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIiwgY2JJRCwgbVBhdXNlZCk7CisKKyAgICAgICAgICAgIGlmIChtUGF1c2VkKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoY2JJRCkgeworICAgICAgICAgICAgICAgIGNhc2UgQU1lZGlhQ29kZWNXcmFwcGVyOjpDQl9JTlBVVF9BVkFJTEFCTEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGluZGV4OworICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiaW5kZXgiLCAmaW5kZXgpKTsKKworICAgICAgICAgICAgICAgICAgICBoYW5kbGVBbklucHV0QnVmZmVyKGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBBTWVkaWFDb2RlY1dyYXBwZXI6OkNCX09VVFBVVF9BVkFJTEFCTEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGluZGV4OworICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZmxhZ3M7CisKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImluZGV4IiwgJmluZGV4KSk7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFNpemUoIm9mZnNldCIsICZvZmZzZXQpKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU2l6ZSgic2l6ZSIsICZzaXplKSk7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJmbGFncyIsICZmbGFncykpOworCisgICAgICAgICAgICAgICAgICAgIGhhbmRsZUFuT3V0cHV0QnVmZmVyKGluZGV4LCBvZmZzZXQsIHNpemUsIHRpbWVVcywgZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEFNZWRpYUNvZGVjV3JhcHBlcjo6Q0JfT1VUUFVUX0ZPUk1BVF9DSEFOR0VEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgiZm9ybWF0IiwgJmZvcm1hdCkpOworCisgICAgICAgICAgICAgICAgICAgIGhhbmRsZU91dHB1dEZvcm1hdENoYW5nZShmb3JtYXQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEFNZWRpYUNvZGVjV3JhcHBlcjo6Q0JfRVJST1I6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnI7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJEZWNvZGVyICglcykgcmVwb3J0ZWQgZXJyb3IgOiAweCV4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSXNBdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iLCBlcnIpOworCisgICAgICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKGVycik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUUkVTUEFTUygpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFJlbmRlckJ1ZmZlcjoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFpc1N0YWxlUmVwbHkobXNnKSkgeworICAgICAgICAgICAgICAgIG9uUmVuZGVyQnVmZmVyKG1zZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRBdWRpb091dHB1dEZvcm1hdENoYW5nZWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghaXNTdGFsZVJlcGx5KG1zZykpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnI7CisgICAgICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSAmJiBlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlJlbmRlcmVyIHJlcG9ydGVkIDB4JXggd2hlbiBjaGFuZ2luZyBhdWRpbyBvdXRwdXQgZm9ybWF0IiwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoZXJyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRTZXRWaWRlb1N1cmZhY2U6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworCisgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoInN1cmZhY2UiLCAmb2JqKSk7CisgICAgICAgICAgICBzcDxBTmF0aXZlV2luZG93V3JhcHBlcj4gbnd3ID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBTmF0aXZlV2luZG93V3JhcHBlciAqPihvYmouZ2V0KCkpOyAvLyBub24tbnVsbAorICAgICAgICAgICAgaWYgKG53dyA9PSBOVUxMIHx8IG53dy0+Z2V0QU5hdGl2ZVdpbmRvdygpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludDMyX3QgZXJyID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAvLyBOT1RFOiBpbiBwcmFjdGljZSBtTmF0aXZlV2luZG93IGlzIGFsd2F5cyBub24tbnVsbCwKKyAgICAgICAgICAgIC8vIGJ1dCBjaGVja2luZyBoZXJlIGZvciBjb21wbGV0ZW5lc3MKKyAgICAgICAgICAgIGlmIChtQ29kZWMgIT0gTlVMTAorICAgICAgICAgICAgICAgICYmIG1OYXRpdmVXaW5kb3cgIT0gTlVMTCAmJiBtTmF0aXZlV2luZG93LT5nZXRBTmF0aXZlV2luZG93KCkgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IG9uY2UgQXdlc29tZVBsYXllciBpcyByZW1vdmVkLCByZW1vdmUgdGhpcyBhdXRvbWF0aWMgY29ubmVjdGluZworICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBzdXJmYWNlIGJ5IE1lZGlhUGxheWVyU2VydmljZS4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIGF0IHRoaXMgcG9pbnQgTWVkaWFQbGF5ZXIyTWFuYWdlcjo6Y2xpZW50IGhhcyBhbHJlYWR5IGNvbm5lY3RlZCB0byB0aGUKKyAgICAgICAgICAgICAgICAvLyBzdXJmYWNlLCB3aGljaCBNZWRpYUNvZGVjIGRvZXMgbm90IGV4cGVjdAorICAgICAgICAgICAgICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfYXBpX2Rpc2Nvbm5lY3Qobnd3LT5nZXRBTmF0aXZlV2luZG93KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQVRJVkVfV0lORE9XX0FQSV9NRURJQSk7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICBlcnIgPSBtQ29kZWMtPnNldE91dHB1dFN1cmZhY2Uobnd3KTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0lfSUYoZXJyLCAiY29kZWMgc2V0T3V0cHV0U3VyZmFjZSByZXR1cm5lZDogJWQiLCBlcnIpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNvbm5lY3QgdG8gdGhlIG9sZCBzdXJmYWNlIGFzIE1QUzo6Q2xpZW50IHdpbGwgZXhwZWN0IHRvCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZSBhYmxlIHRvIGRpc2Nvbm5lY3QgZnJvbSBpdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKW5hdGl2ZV93aW5kb3dfYXBpX2Nvbm5lY3QobU5hdGl2ZVdpbmRvdy0+Z2V0QU5hdGl2ZVdpbmRvdygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQVRJVkVfV0lORE9XX0FQSV9NRURJQSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1OYXRpdmVXaW5kb3cgPSBud3c7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICAvLyByZWNvbm5lY3QgdG8gdGhlIG5ldyBzdXJmYWNlIG9uIGVycm9yIGFzIE1QUzo6Q2xpZW50IHdpbGwgZXhwZWN0IHRvCisgICAgICAgICAgICAgICAgICAgIC8vIGJlIGFibGUgdG8gZGlzY29ubmVjdCBmcm9tIGl0LgorICAgICAgICAgICAgICAgICAgICAodm9pZCluYXRpdmVfd2luZG93X2FwaV9jb25uZWN0KG53dy0+Z2V0QU5hdGl2ZVdpbmRvdygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfQVBJX01FRElBKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXREcm1SZWxlYXNlQ3J5cHRvOgorICAgICAgICB7CisgICAgICAgICAgICBBTE9HVigia1doYXREcm1SZWxlYXNlQ3J5cHRvIik7CisgICAgICAgICAgICBvblJlbGVhc2VDcnlwdG8obXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIERlY29kZXJCYXNlOjpvbk1lc3NhZ2VSZWNlaXZlZChtc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6RGVjb2Rlcjo6b25Db25maWd1cmUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKKyAgICBBTE9HVigiWyVzXSBvbkNvbmZpZ3VyZSAoZm9ybWF0PSVzKSIsIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKyAgICBDSEVDSyhtQ29kZWMgPT0gTlVMTCk7CisKKyAgICBtRm9ybWF0Q2hhbmdlUGVuZGluZyA9IGZhbHNlOworICAgIG1UaW1lQ2hhbmdlUGVuZGluZyA9IGZhbHNlOworCisgICAgKyttQnVmZmVyR2VuZXJhdGlvbjsKKworICAgIEFTdHJpbmcgbWltZTsKKyAgICBDSEVDSyhmb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOworCisgICAgbUlzQXVkaW8gPSAhc3RybmNhc2VjbXAoImF1ZGlvLyIsIG1pbWUuY19zdHIoKSwgNik7CisgICAgbUlzVmlkZW9BVkMgPSAhc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsIG1pbWUuY19zdHIoKSk7CisKKyAgICBtQ29tcG9uZW50TmFtZSA9IG1pbWU7CisgICAgbUNvbXBvbmVudE5hbWUuYXBwZW5kKCIgZGVjb2RlciIpOworICAgIEFMT0dWKCJbJXNdIG9uQ29uZmlndXJlIChud3c9JXApIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwKKyAgICAgICAgICAobU5hdGl2ZVdpbmRvdyA9PSBOVUxMID8gTlVMTCA6IG1OYXRpdmVXaW5kb3ctPmdldEFOYXRpdmVXaW5kb3coKSkpOworCisgICAgbUNvZGVjID0gQU1lZGlhQ29kZWNXcmFwcGVyOjpDcmVhdGVEZWNvZGVyQnlUeXBlKG1pbWUpOworICAgIGludDMyX3Qgc2VjdXJlID0gMDsKKyAgICBpZiAoZm9ybWF0LT5maW5kSW50MzIoInNlY3VyZSIsICZzZWN1cmUpICYmIHNlY3VyZSAhPSAwKSB7CisgICAgICAgIGlmIChtQ29kZWMgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKG1Db2RlYy0+Z2V0TmFtZSgmbUNvbXBvbmVudE5hbWUpID09IE9LKSB7CisgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuYXBwZW5kKCIuc2VjdXJlIik7CisgICAgICAgICAgICAgICAgbUNvZGVjLT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgQUxPR0koIlslc10gY3JlYXRpbmciLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBtQ29kZWMgPSBBTWVkaWFDb2RlY1dyYXBwZXI6OkNyZWF0ZUNvZGVjQnlOYW1lKG1Db21wb25lbnROYW1lKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUNvZGVjID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobUNvZGVjID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgJXMlcyBkZWNvZGVyIiwKKyAgICAgICAgICAgICAgICAoc2VjdXJlID8gInNlY3VyZSAiIDogIiIpLCBtaW1lLmNfc3RyKCkpOworICAgICAgICBoYW5kbGVFcnJvcihOT19JTklUKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtSXNTZWN1cmUgPSBzZWN1cmU7CisKKyAgICBtQ29kZWMtPmdldE5hbWUoJm1Db21wb25lbnROYW1lKTsKKworICAgIHN0YXR1c190IGVycjsKKyAgICBpZiAobU5hdGl2ZVdpbmRvdyAhPSBOVUxMICYmIG1OYXRpdmVXaW5kb3ctPmdldEFOYXRpdmVXaW5kb3coKSAhPSBOVUxMKSB7CisgICAgICAgIC8vIGRpc2Nvbm5lY3QgZnJvbSBzdXJmYWNlIGFzIE1lZGlhQ29kZWMgd2lsbCByZWNvbm5lY3QKKyAgICAgICAgZXJyID0gbmF0aXZlX3dpbmRvd19hcGlfZGlzY29ubmVjdChtTmF0aXZlV2luZG93LT5nZXRBTmF0aXZlV2luZG93KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19BUElfTUVESUEpOworICAgICAgICAvLyBXZSB0cmVhdCB0aGlzIGFzIGEgd2FybmluZywgYXMgdGhpcyBpcyBhIHByZXBhcmF0b3J5IHN0ZXAuCisgICAgICAgIC8vIENvZGVjIHdpbGwgdHJ5IHRvIGNvbm5lY3QgdG8gdGhlIHN1cmZhY2UsIHdoaWNoIGlzIHdoZXJlCisgICAgICAgIC8vIGFueSBlcnJvciBzaWduYWxpbmcgd2lsbCBvY2N1ci4KKyAgICAgICAgQUxPR1dfSUYoZXJyICE9IE9LLCAiZmFpbGVkIHRvIGRpc2Nvbm5lY3QgZnJvbSBzdXJmYWNlOiAlZCIsIGVycik7CisgICAgfQorCisgICAgLy8gTW9kdWxhciBEUk0KKyAgICBzcDxSZWZCYXNlPiBvYmpDcnlwdG87CisgICAgZm9ybWF0LT5maW5kT2JqZWN0KCJjcnlwdG8iLCAmb2JqQ3J5cHRvKTsKKyAgICBzcDxBTWVkaWFDcnlwdG9XcmFwcGVyPiBjcnlwdG8gPSBzdGF0aWNfY2FzdDxBTWVkaWFDcnlwdG9XcmFwcGVyICo+KG9iakNyeXB0by5nZXQoKSk7CisgICAgLy8gbm9uLWVuY3J5cHRlZCBzb3VyY2Ugd29uJ3QgaGF2ZSBhIGNyeXB0bworICAgIG1Jc0VuY3J5cHRlZCA9IChjcnlwdG8gIT0gTlVMTCk7CisgICAgLy8gY29uZmlndXJlIGlzIGNhbGxlZCBvbmNlOyBzdGlsbCB1c2luZyBPUiBpbiBjYXNlIHRoZSBiZWhhdmlvciBjaGFuZ2VzLgorICAgIG1Jc0VuY3J5cHRlZE9ic2VydmVkRWFybGllciA9IG1Jc0VuY3J5cHRlZE9ic2VydmVkRWFybGllciB8fCBtSXNFbmNyeXB0ZWQ7CisgICAgQUxPR1YoIm9uQ29uZmlndXJlIG1DcnlwdG86ICVwLCBtSXNTZWN1cmU6ICVkIiwgY3J5cHRvLmdldCgpLCBtSXNTZWN1cmUpOworCisgICAgZXJyID0gbUNvZGVjLT5jb25maWd1cmUoCisgICAgICAgICAgICBBTWVkaWFGb3JtYXRXcmFwcGVyOjpDcmVhdGUoZm9ybWF0KSwKKyAgICAgICAgICAgIG1OYXRpdmVXaW5kb3csCisgICAgICAgICAgICBjcnlwdG8sCisgICAgICAgICAgICAwIC8qIGZsYWdzICovKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjb25maWd1cmUgWyVzXSBkZWNvZGVyIChlcnI9JWQpIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyKTsKKyAgICAgICAgbUNvZGVjLT5yZWxlYXNlKCk7CisgICAgICAgIG1Db2RlYy5jbGVhcigpOworICAgICAgICBoYW5kbGVFcnJvcihlcnIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHJlbWVtYmVyQ29kZWNTcGVjaWZpY0RhdGEoZm9ybWF0KTsKKworICAgIC8vIHRoZSBmb2xsb3dpbmcgc2hvdWxkIHdvcmsgaW4gY29uZmlndXJlZCBzdGF0ZQorICAgIHNwPEFNZWRpYUZvcm1hdFdyYXBwZXI+IG91dHB1dEZvcm1hdCA9IG1Db2RlYy0+Z2V0T3V0cHV0Rm9ybWF0KCk7CisgICAgaWYgKG91dHB1dEZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIGhhbmRsZUVycm9yKElOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtSW5wdXRGb3JtYXQgPSBtQ29kZWMtPmdldElucHV0Rm9ybWF0KCk7CisgICAgaWYgKG1JbnB1dEZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIGhhbmRsZUVycm9yKElOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1TdGF0cy0+c2V0U3RyaW5nKCJtaW1lIiwgbWltZS5jX3N0cigpKTsKKyAgICBtU3RhdHMtPnNldFN0cmluZygiY29tcG9uZW50LW5hbWUiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKKworICAgIGlmICghbUlzQXVkaW8pIHsKKyAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgICAgICBpZiAob3V0cHV0Rm9ybWF0LT5nZXRJbnQzMigid2lkdGgiLCAmd2lkdGgpCisgICAgICAgICAgICAgICAgJiYgb3V0cHV0Rm9ybWF0LT5nZXRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpIHsKKyAgICAgICAgICAgIG1TdGF0cy0+c2V0SW50MzIoIndpZHRoIiwgd2lkdGgpOworICAgICAgICAgICAgbVN0YXRzLT5zZXRJbnQzMigiaGVpZ2h0IiwgaGVpZ2h0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZShrV2hhdENvZGVjTm90aWZ5LCB0aGlzKTsKKyAgICBtQ29kZWMtPnNldENhbGxiYWNrKHJlcGx5KTsKKworICAgIGVyciA9IG1Db2RlYy0+c3RhcnQoKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc3RhcnQgWyVzXSBkZWNvZGVyIChlcnI9JWQpIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyKTsKKyAgICAgICAgbUNvZGVjLT5yZWxlYXNlKCk7CisgICAgICAgIG1Db2RlYy5jbGVhcigpOworICAgICAgICBoYW5kbGVFcnJvcihlcnIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcmVsZWFzZUFuZFJlc2V0TWVkaWFCdWZmZXJzKCk7CisKKyAgICBtUGF1c2VkID0gZmFsc2U7CisgICAgbVJlc3VtZVBlbmRpbmcgPSBmYWxzZTsKK30KKwordm9pZCBOdVBsYXllcjI6OkRlY29kZXI6Om9uU2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJnBhcmFtcykgeworICAgIGJvb2wgbmVlZEFkanVzdExheWVycyA9IGZhbHNlOworICAgIGZsb2F0IGZyYW1lUmF0ZVRvdGFsOworICAgIGlmIChwYXJhbXMtPmZpbmRGbG9hdCgiZnJhbWUtcmF0ZS10b3RhbCIsICZmcmFtZVJhdGVUb3RhbCkKKyAgICAgICAgICAgICYmIG1GcmFtZVJhdGVUb3RhbCAhPSBmcmFtZVJhdGVUb3RhbCkgeworICAgICAgICBuZWVkQWRqdXN0TGF5ZXJzID0gdHJ1ZTsKKyAgICAgICAgbUZyYW1lUmF0ZVRvdGFsID0gZnJhbWVSYXRlVG90YWw7CisgICAgfQorCisgICAgaW50MzJfdCBudW1WaWRlb1RlbXBvcmFsTGF5ZXJUb3RhbDsKKyAgICBpZiAocGFyYW1zLT5maW5kSW50MzIoInRlbXBvcmFsLWxheWVyLWNvdW50IiwgJm51bVZpZGVvVGVtcG9yYWxMYXllclRvdGFsKQorICAgICAgICAgICAgJiYgbnVtVmlkZW9UZW1wb3JhbExheWVyVG90YWwgPj0gMAorICAgICAgICAgICAgJiYgbnVtVmlkZW9UZW1wb3JhbExheWVyVG90YWwgPD0ga01heE51bVZpZGVvVGVtcG9yYWxMYXllcnMKKyAgICAgICAgICAgICYmIG1OdW1WaWRlb1RlbXBvcmFsTGF5ZXJUb3RhbCAhPSBudW1WaWRlb1RlbXBvcmFsTGF5ZXJUb3RhbCkgeworICAgICAgICBuZWVkQWRqdXN0TGF5ZXJzID0gdHJ1ZTsKKyAgICAgICAgbU51bVZpZGVvVGVtcG9yYWxMYXllclRvdGFsID0gc3RkOjptYXgobnVtVmlkZW9UZW1wb3JhbExheWVyVG90YWwsIDEpOworICAgIH0KKworICAgIGlmIChuZWVkQWRqdXN0TGF5ZXJzICYmIG1OdW1WaWRlb1RlbXBvcmFsTGF5ZXJUb3RhbCA+IDEpIHsKKyAgICAgICAgLy8gVE9ETzogRm9yIG5vdywgbGF5ZXIgZnBzIGlzIGNhbGN1bGF0ZWQgZm9yIHNvbWUgc3BlY2lmaWMgYXJjaGl0ZWN0dXJlcy4KKyAgICAgICAgLy8gQnV0IGl0IHJlYWxseSBzaG91bGQgYmUgZXh0cmFjdGVkIGZyb20gdGhlIHN0cmVhbS4KKyAgICAgICAgbVZpZGVvVGVtcG9yYWxMYXllckFnZ3JlZ2F0ZUZwc1swXSA9CisgICAgICAgICAgICBtRnJhbWVSYXRlVG90YWwgLyAoZmxvYXQpKDFsbCA8PCAobU51bVZpZGVvVGVtcG9yYWxMYXllclRvdGFsIC0gMSkpOworICAgICAgICBmb3IgKGludDMyX3QgaSA9IDE7IGkgPCBtTnVtVmlkZW9UZW1wb3JhbExheWVyVG90YWw7ICsraSkgeworICAgICAgICAgICAgbVZpZGVvVGVtcG9yYWxMYXllckFnZ3JlZ2F0ZUZwc1tpXSA9CisgICAgICAgICAgICAgICAgbUZyYW1lUmF0ZVRvdGFsIC8gKGZsb2F0KSgxbGwgPDwgKG1OdW1WaWRlb1RlbXBvcmFsTGF5ZXJUb3RhbCAtIGkpKQorICAgICAgICAgICAgICAgICsgbVZpZGVvVGVtcG9yYWxMYXllckFnZ3JlZ2F0ZUZwc1tpIC0gMV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbG9hdCBwbGF5YmFja1NwZWVkOworICAgIGlmIChwYXJhbXMtPmZpbmRGbG9hdCgicGxheWJhY2stc3BlZWQiLCAmcGxheWJhY2tTcGVlZCkKKyAgICAgICAgICAgICYmIG1QbGF5YmFja1NwZWVkICE9IHBsYXliYWNrU3BlZWQpIHsKKyAgICAgICAgbmVlZEFkanVzdExheWVycyA9IHRydWU7CisgICAgICAgIG1QbGF5YmFja1NwZWVkID0gcGxheWJhY2tTcGVlZDsKKyAgICB9CisKKyAgICBpZiAobmVlZEFkanVzdExheWVycykgeworICAgICAgICBmbG9hdCBkZWNvZGVGcmFtZVJhdGUgPSBtRnJhbWVSYXRlVG90YWw7CisgICAgICAgIC8vIGVuYWJsZSB0ZW1wb3JhbCBsYXllcmluZyBvcHRpbWl6YXRpb24gb25seSBpZiB3ZSBrbm93IHRoZSBsYXllcmluZyBkZXB0aAorICAgICAgICBpZiAobU51bVZpZGVvVGVtcG9yYWxMYXllclRvdGFsID4gMSkgeworICAgICAgICAgICAgaW50MzJfdCBsYXllcklkOworICAgICAgICAgICAgZm9yIChsYXllcklkID0gMDsgbGF5ZXJJZCA8IG1OdW1WaWRlb1RlbXBvcmFsTGF5ZXJUb3RhbCAtIDE7ICsrbGF5ZXJJZCkgeworICAgICAgICAgICAgICAgIGlmIChtVmlkZW9UZW1wb3JhbExheWVyQWdncmVnYXRlRnBzW2xheWVySWRdICogbVBsYXliYWNrU3BlZWQKKyAgICAgICAgICAgICAgICAgICAgICAgID49IGtEaXNwbGF5UmVmcmVzaGluZ1JhdGUgKiAwLjkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbU51bVZpZGVvVGVtcG9yYWxMYXllckFsbG93ZWQgPSBsYXllcklkICsgMTsKKyAgICAgICAgICAgIGRlY29kZUZyYW1lUmF0ZSA9IG1WaWRlb1RlbXBvcmFsTGF5ZXJBZ2dyZWdhdGVGcHNbbGF5ZXJJZF07CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIm9uU2V0UGFyYW1ldGVyczogYWxsb3dlZCBsYXllcnM9JWQsIGRlY29kZUZwcz0lZyIsCisgICAgICAgICAgICAgICAgbU51bVZpZGVvVGVtcG9yYWxMYXllckFsbG93ZWQsIGRlY29kZUZyYW1lUmF0ZSk7CisKKyAgICAgICAgaWYgKG1Db2RlYyA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HVygib25TZXRQYXJhbWV0ZXJzIGNhbGxlZCBiZWZvcmUgY29kZWMgaXMgY3JlYXRlZC4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHNwPEFNZWRpYUZvcm1hdFdyYXBwZXI+IGNvZGVjUGFyYW1zID0gbmV3IEFNZWRpYUZvcm1hdFdyYXBwZXIoKTsKKyAgICAgICAgY29kZWNQYXJhbXMtPnNldEZsb2F0KCJvcGVyYXRpbmctcmF0ZSIsIGRlY29kZUZyYW1lUmF0ZSAqIG1QbGF5YmFja1NwZWVkKTsKKyAgICAgICAgbUNvZGVjLT5zZXRQYXJhbWV0ZXJzKGNvZGVjUGFyYW1zKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyOjpvblNldFJlbmRlcmVyKGNvbnN0IHNwPFJlbmRlcmVyPiAmcmVuZGVyZXIpIHsKKyAgICBtUmVuZGVyZXIgPSByZW5kZXJlcjsKK30KKwordm9pZCBOdVBsYXllcjI6OkRlY29kZXI6Om9uUmVzdW1lKGJvb2wgbm90aWZ5Q29tcGxldGUpIHsKKyAgICBtUGF1c2VkID0gZmFsc2U7CisKKyAgICBpZiAobm90aWZ5Q29tcGxldGUpIHsKKyAgICAgICAgbVJlc3VtZVBlbmRpbmcgPSB0cnVlOworICAgIH0KKworICAgIGlmIChtQ29kZWMgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiWyVzXSBvblJlc3VtZSB3aXRob3V0IGEgdmFsaWQgY29kZWMiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgaGFuZGxlRXJyb3IoTk9fSU5JVCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUNvZGVjLT5zdGFydCgpOworfQorCit2b2lkIE51UGxheWVyMjo6RGVjb2Rlcjo6ZG9GbHVzaChib29sIG5vdGlmeUNvbXBsZXRlKSB7CisgICAgaWYgKG1DQ0RlY29kZXIgIT0gTlVMTCkgeworICAgICAgICBtQ0NEZWNvZGVyLT5mbHVzaCgpOworICAgIH0KKworICAgIGlmIChtUmVuZGVyZXIgIT0gTlVMTCkgeworICAgICAgICBtUmVuZGVyZXItPmZsdXNoKG1Jc0F1ZGlvLCBub3RpZnlDb21wbGV0ZSk7CisgICAgICAgIG1SZW5kZXJlci0+c2lnbmFsVGltZURpc2NvbnRpbnVpdHkoKTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICBpZiAobUNvZGVjICE9IE5VTEwpIHsKKyAgICAgICAgZXJyID0gbUNvZGVjLT5mbHVzaCgpOworICAgICAgICBtQ1NEc1RvU3VibWl0ID0gbUNTRHNGb3JDdXJyZW50Rm9ybWF0OyAvLyBjb3B5IG9wZXJhdG9yCisgICAgICAgICsrbUJ1ZmZlckdlbmVyYXRpb247CisgICAgfQorCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGZsdXNoIFslc10gKGVycj0lZCkiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOworICAgICAgICBoYW5kbGVFcnJvcihlcnIpOworICAgICAgICAvLyBmaW5pc2ggd2l0aCBwb3N0aW5nIGtXaGF0Rmx1c2hDb21wbGV0ZWQuCisgICAgICAgIC8vIHdlIGF0dGVtcHQgdG8gcmVsZWFzZSB0aGUgYnVmZmVycyBldmVuIGlmIGZsdXNoIGZhaWxzLgorICAgIH0KKyAgICByZWxlYXNlQW5kUmVzZXRNZWRpYUJ1ZmZlcnMoKTsKKyAgICBtUGF1c2VkID0gdHJ1ZTsKK30KKworCit2b2lkIE51UGxheWVyMjo6RGVjb2Rlcjo6b25GbHVzaCgpIHsKKyAgICBkb0ZsdXNoKHRydWUpOworCisgICAgaWYgKGlzRGlzY29udGludWl0eVBlbmRpbmcoKSkgeworICAgICAgICAvLyBUaGlzIGNvdWxkIGhhcHBlbiBpZiB0aGUgY2xpZW50IHN0YXJ0cyBzZWVraW5nL3NodXRkb3duCisgICAgICAgIC8vIGFmdGVyIHdlIHF1ZXVlZCBhbiBFT1MgZm9yIGRpc2NvbnRpbnVpdGllcy4KKyAgICAgICAgLy8gV2UgY2FuIGNvbnNpZGVyIGRpc2NvbnRpbnVpdHkgaGFuZGxlZC4KKyAgICAgICAgZmluaXNoSGFuZGxlRGlzY29udGludWl0eShmYWxzZSAvKiBmbHVzaE9uVGltZUNoYW5nZSAqLyk7CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEZsdXNoQ29tcGxldGVkKTsKKyAgICBub3RpZnktPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjI6OkRlY29kZXI6Om9uU2h1dGRvd24oYm9vbCBub3RpZnlDb21wbGV0ZSkgeworICAgIHN0YXR1c190IGVyciA9IE9LOworCisgICAgLy8gaWYgdGhlcmUgaXMgYSBwZW5kaW5nIHJlc3VtZSByZXF1ZXN0LCBub3RpZnkgY29tcGxldGUgbm93CisgICAgbm90aWZ5UmVzdW1lQ29tcGxldGVJZk5lY2Vzc2FyeSgpOworCisgICAgaWYgKG1Db2RlYyAhPSBOVUxMKSB7CisgICAgICAgIGVyciA9IG1Db2RlYy0+cmVsZWFzZSgpOworICAgICAgICBtQ29kZWMgPSBOVUxMOworICAgICAgICArK21CdWZmZXJHZW5lcmF0aW9uOworCisgICAgICAgIGlmIChtTmF0aXZlV2luZG93ICE9IE5VTEwgJiYgbU5hdGl2ZVdpbmRvdy0+Z2V0QU5hdGl2ZVdpbmRvdygpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8vIHJlY29ubmVjdCB0byBzdXJmYWNlIGFzIE1lZGlhQ29kZWMgZGlzY29ubmVjdGVkIGZyb20gaXQKKyAgICAgICAgICAgIHN0YXR1c190IGVycm9yID0gbmF0aXZlX3dpbmRvd19hcGlfY29ubmVjdChtTmF0aXZlV2luZG93LT5nZXRBTmF0aXZlV2luZG93KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19BUElfTUVESUEpOworICAgICAgICAgICAgQUxPR1dfSUYoZXJyb3IgIT0gTk9fRVJST1IsCisgICAgICAgICAgICAgICAgICAgICJbJXNdIGZhaWxlZCB0byBjb25uZWN0IHRvIG5hdGl2ZSB3aW5kb3csIGVycm9yPSVkIiwKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyb3IpOworICAgICAgICB9CisgICAgICAgIG1Db21wb25lbnROYW1lID0gImRlY29kZXIiOworICAgIH0KKworICAgIHJlbGVhc2VBbmRSZXNldE1lZGlhQnVmZmVycygpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHJlbGVhc2UgWyVzXSAoZXJyPSVkKSIsIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7CisgICAgICAgIGhhbmRsZUVycm9yKGVycik7CisgICAgICAgIC8vIGZpbmlzaCB3aXRoIHBvc3Rpbmcga1doYXRTaHV0ZG93bkNvbXBsZXRlZC4KKyAgICB9CisKKyAgICBpZiAobm90aWZ5Q29tcGxldGUpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRTaHV0ZG93bkNvbXBsZXRlZCk7CisgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgICAgICBtUGF1c2VkID0gdHJ1ZTsKKyAgICB9Cit9CisKKy8qCisgKiByZXR1cm5zIHRydWUgaWYgd2Ugc2hvdWxkIHJlcXVlc3QgbW9yZSBkYXRhCisgKi8KK2Jvb2wgTnVQbGF5ZXIyOjpEZWNvZGVyOjpkb1JlcXVlc3RCdWZmZXJzKCkgeworICAgIGlmIChpc0Rpc2NvbnRpbnVpdHlQZW5kaW5nKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICB3aGlsZSAoZXJyID09IE9LICYmICFtRGVxdWV1ZWRJbnB1dEJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICBzaXplX3QgYnVmZmVySXggPSAqbURlcXVldWVkSW5wdXRCdWZmZXJzLmJlZ2luKCk7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICAgICAgbXNnLT5zZXRTaXplKCJidWZmZXItaXgiLCBidWZmZXJJeCk7CisgICAgICAgIGVyciA9IGZldGNoSW5wdXREYXRhKG1zZyk7CisgICAgICAgIGlmIChlcnIgIT0gT0sgJiYgZXJyICE9IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgIC8vIGlmIEVPUywgbmVlZCB0byBxdWV1ZSBFT1MgYnVmZmVyCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBtRGVxdWV1ZWRJbnB1dEJ1ZmZlcnMuZXJhc2UobURlcXVldWVkSW5wdXRCdWZmZXJzLmJlZ2luKCkpOworCisgICAgICAgIGlmICghbVBlbmRpbmdJbnB1dE1lc3NhZ2VzLmVtcHR5KCkKKyAgICAgICAgICAgICAgICB8fCAhb25JbnB1dEJ1ZmZlckZldGNoZWQobXNnKSkgeworICAgICAgICAgICAgbVBlbmRpbmdJbnB1dE1lc3NhZ2VzLnB1c2hfYmFjayhtc2cpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGVyciA9PSAtRVdPVUxEQkxPQ0sKKyAgICAgICAgICAgICYmIG1Tb3VyY2UtPmZlZWRNb3JlVFNEYXRhKCkgPT0gT0s7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyOjpoYW5kbGVFcnJvcihpbnQzMl90IGVycikKK3sKKyAgICAvLyBXZSBjYW5ub3QgaW1tZWRpYXRlbHkgcmVsZWFzZSB0aGUgY29kZWMgZHVlIHRvIGJ1ZmZlcnMgc3RpbGwgb3V0c3RhbmRpbmcKKyAgICAvLyBpbiB0aGUgcmVuZGVyZXIuICBXZSBzaWduYWwgdG8gdGhlIHBsYXllciB0aGUgZXJyb3Igc28gaXQgY2FuIHNodXRkb3duL3JlbGVhc2UgdGhlCisgICAgLy8gZGVjb2RlciBhZnRlciBmbHVzaGluZyBhbmQgaW5jcmVtZW50IHRoZSBnZW5lcmF0aW9uIHRvIGRpc2NhcmQgdW5uZWNlc3NhcnkgbWVzc2FnZXMuCisKKyAgICArK21CdWZmZXJHZW5lcmF0aW9uOworCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEVycm9yKTsKKyAgICBub3RpZnktPnNldEludDMyKCJlcnIiLCBlcnIpOworICAgIG5vdGlmeS0+cG9zdCgpOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OkRlY29kZXI6OnJlbGVhc2VDcnlwdG8oKQoreworICAgIEFMT0dWKCJyZWxlYXNlQ3J5cHRvIik7CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RHJtUmVsZWFzZUNyeXB0bywgdGhpcyk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworICAgIGlmIChzdGF0dXMgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgeworICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJzdGF0dXMiLCAmc3RhdHVzKSk7CisgICAgICAgIEFMT0dWKCJyZWxlYXNlQ3J5cHRvIHJldDogJWQgIiwgc3RhdHVzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgicmVsZWFzZUNyeXB0byBlcnI6ICVkIiwgc3RhdHVzKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCit2b2lkIE51UGxheWVyMjo6RGVjb2Rlcjo6b25SZWxlYXNlQ3J5cHRvKGNvbnN0IHNwPEFNZXNzYWdlPiYgbXNnKQoreworICAgIHN0YXR1c190IHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgIGlmIChtQ29kZWMgIT0gTlVMTCkgeworICAgICAgICBzdGF0dXMgPSBtQ29kZWMtPnJlbGVhc2VDcnlwdG8oKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyByZXR1cm5pbmcgT0sgaWYgdGhlIGNvZGVjIGhhcyBiZWVuIGFscmVhZHkgcmVsZWFzZWQKKyAgICAgICAgc3RhdHVzID0gT0s7CisgICAgICAgIEFMT0dFKCJvblJlbGVhc2VDcnlwdG8gTm8gbUNvZGVjLiBlcnI6ICVkIiwgc3RhdHVzKTsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgcmVzcG9uc2UtPnNldEludDMyKCJzdGF0dXMiLCBzdGF0dXMpOworICAgIC8vIENsZWFyaW5nIHRoZSBzdGF0ZSBhcyBpdCdzIHRpZWQgdG8gY3J5cHRvLiBtSXNFbmNyeXB0ZWRPYnNlcnZlZEVhcmxpZXIgaXMgc3RpY2t5IHRob3VnaAorICAgIC8vIGFuZCBsYXN0cyBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoaXMgY29kZWMuIFNlZSBpdHMgdXNlIGluIGZldGNoSW5wdXREYXRhLgorICAgIG1Jc0VuY3J5cHRlZCA9IGZhbHNlOworCisgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CisgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7Cit9CisKK2Jvb2wgTnVQbGF5ZXIyOjpEZWNvZGVyOjpoYW5kbGVBbklucHV0QnVmZmVyKHNpemVfdCBpbmRleCkgeworICAgIGlmIChpc0Rpc2NvbnRpbnVpdHlQZW5kaW5nKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChtQ29kZWMgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiWyVzXSBoYW5kbGVBbklucHV0QnVmZmVyIHdpdGhvdXQgYSB2YWxpZCBjb2RlYyIsIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOworICAgICAgICBoYW5kbGVFcnJvcihOT19JTklUKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHNpemVfdCBidWZmZXJTaXplID0gMDsKKyAgICB1aW50OF90ICpidWZmZXJCYXNlID0gbUNvZGVjLT5nZXRJbnB1dEJ1ZmZlcihpbmRleCwgJmJ1ZmZlclNpemUpOworCisgICAgaWYgKGJ1ZmZlckJhc2UgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiWyVzXSBoYW5kbGVBbklucHV0QnVmZmVyLCBmYWlsZWQgdG8gZ2V0IGlucHV0IGJ1ZmZlciIsIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOworICAgICAgICBoYW5kbGVFcnJvcihVTktOT1dOX0VSUk9SKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IGJ1ZmZlciA9CisgICAgICAgIG5ldyBNZWRpYUNvZGVjQnVmZmVyKE5VTEwgLyogZm9ybWF0ICovLCBuZXcgQUJ1ZmZlcihidWZmZXJCYXNlLCBidWZmZXJTaXplKSk7CisKKyAgICBpZiAoaW5kZXggPj0gbUlucHV0QnVmZmVycy5zaXplKCkpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IG1JbnB1dEJ1ZmZlcnMuc2l6ZSgpOyBpIDw9IGluZGV4OyArK2kpIHsKKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlcnMuYWRkKCk7CisgICAgICAgICAgICBtTWVkaWFCdWZmZXJzLmFkZCgpOworICAgICAgICAgICAgbUlucHV0QnVmZmVySXNEZXF1ZXVlZC5hZGQoKTsKKyAgICAgICAgICAgIG1NZWRpYUJ1ZmZlcnMuZWRpdEl0ZW1BdChpKSA9IE5VTEw7CisgICAgICAgICAgICBtSW5wdXRCdWZmZXJJc0RlcXVldWVkLmVkaXRJdGVtQXQoaSkgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtSW5wdXRCdWZmZXJzLmVkaXRJdGVtQXQoaW5kZXgpID0gYnVmZmVyOworCisgICAgLy9DSEVDS19MVChidWZmZXJJeCwgbUlucHV0QnVmZmVycy5zaXplKCkpOworCisgICAgaWYgKG1NZWRpYUJ1ZmZlcnNbaW5kZXhdICE9IE5VTEwpIHsKKyAgICAgICAgbU1lZGlhQnVmZmVyc1tpbmRleF0tPnJlbGVhc2UoKTsKKyAgICAgICAgbU1lZGlhQnVmZmVycy5lZGl0SXRlbUF0KGluZGV4KSA9IE5VTEw7CisgICAgfQorICAgIG1JbnB1dEJ1ZmZlcklzRGVxdWV1ZWQuZWRpdEl0ZW1BdChpbmRleCkgPSB0cnVlOworCisgICAgaWYgKCFtQ1NEc1RvU3VibWl0LmlzRW1wdHkoKSkgeworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKCk7CisgICAgICAgIG1zZy0+c2V0U2l6ZSgiYnVmZmVyLWl4IiwgaW5kZXgpOworCisgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG1DU0RzVG9TdWJtaXQuaXRlbUF0KDApOworICAgICAgICBBTE9HSSgiWyVzXSByZXN1Ym1pdHRpbmcgQ1NEIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgIG1zZy0+c2V0QnVmZmVyKCJidWZmZXIiLCBidWZmZXIpOworICAgICAgICBtQ1NEc1RvU3VibWl0LnJlbW92ZUF0KDApOworICAgICAgICBpZiAoIW9uSW5wdXRCdWZmZXJGZXRjaGVkKG1zZykpIHsKKyAgICAgICAgICAgIGhhbmRsZUVycm9yKFVOS05PV05fRVJST1IpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHdoaWxlICghbVBlbmRpbmdJbnB1dE1lc3NhZ2VzLmVtcHR5KCkpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9ICptUGVuZGluZ0lucHV0TWVzc2FnZXMuYmVnaW4oKTsKKyAgICAgICAgaWYgKCFvbklucHV0QnVmZmVyRmV0Y2hlZChtc2cpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBtUGVuZGluZ0lucHV0TWVzc2FnZXMuZXJhc2UobVBlbmRpbmdJbnB1dE1lc3NhZ2VzLmJlZ2luKCkpOworICAgIH0KKworICAgIGlmICghbUlucHV0QnVmZmVySXNEZXF1ZXVlZC5lZGl0SXRlbUF0KGluZGV4KSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBtRGVxdWV1ZWRJbnB1dEJ1ZmZlcnMucHVzaF9iYWNrKGluZGV4KTsKKworICAgIG9uUmVxdWVzdElucHV0QnVmZmVycygpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE51UGxheWVyMjo6RGVjb2Rlcjo6aGFuZGxlQW5PdXRwdXRCdWZmZXIoCisgICAgICAgIHNpemVfdCBpbmRleCwKKyAgICAgICAgc2l6ZV90IG9mZnNldCwKKyAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgIGludDY0X3QgdGltZVVzLAorICAgICAgICBpbnQzMl90IGZsYWdzKSB7CisgICAgaWYgKG1Db2RlYyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJbJXNdIGhhbmRsZUFuT3V0cHV0QnVmZmVyIHdpdGhvdXQgYSB2YWxpZCBjb2RlYyIsIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOworICAgICAgICBoYW5kbGVFcnJvcihOT19JTklUKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworLy8gICAgQ0hFQ0tfTFQoYnVmZmVySXgsIG1PdXRwdXRCdWZmZXJzLnNpemUoKSk7CisKKyAgICBzaXplX3QgYnVmZmVyU2l6ZSA9IDA7CisgICAgdWludDhfdCAqYnVmZmVyQmFzZSA9IG1Db2RlYy0+Z2V0T3V0cHV0QnVmZmVyKGluZGV4LCAmYnVmZmVyU2l6ZSk7CisKKyAgICBpZiAoYnVmZmVyQmFzZSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJbJXNdIGhhbmRsZUFuT3V0cHV0QnVmZmVyLCBmYWlsZWQgdG8gZ2V0IG91dHB1dCBidWZmZXIiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgaGFuZGxlRXJyb3IoVU5LTk9XTl9FUlJPUik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWZmZXIgPQorICAgICAgICBuZXcgTWVkaWFDb2RlY0J1ZmZlcihOVUxMIC8qIGZvcm1hdCAqLywgbmV3IEFCdWZmZXIoYnVmZmVyQmFzZSwgYnVmZmVyU2l6ZSkpOworCisgICAgaWYgKGluZGV4ID49IG1PdXRwdXRCdWZmZXJzLnNpemUoKSkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gbU91dHB1dEJ1ZmZlcnMuc2l6ZSgpOyBpIDw9IGluZGV4OyArK2kpIHsKKyAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJzLmFkZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgbU91dHB1dEJ1ZmZlcnMuZWRpdEl0ZW1BdChpbmRleCkgPSBidWZmZXI7CisKKyAgICBidWZmZXItPnNldFJhbmdlKG9mZnNldCwgc2l6ZSk7CisgICAgYnVmZmVyLT5tZXRhKCktPmNsZWFyKCk7CisgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOworCisgICAgYm9vbCBlb3MgPSBmbGFncyAmIEFNRURJQUNPREVDX0JVRkZFUl9GTEFHX0VORF9PRl9TVFJFQU07CisgICAgLy8gd2UgZG8gbm90IGV4cGVjdCBDT0RFQ0NPTkZJRyBvciBTWU5DRlJBTUUgZm9yIGRlY29kZXIKKworICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZShrV2hhdFJlbmRlckJ1ZmZlciwgdGhpcyk7CisgICAgcmVwbHktPnNldFNpemUoImJ1ZmZlci1peCIsIGluZGV4KTsKKyAgICByZXBseS0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtQnVmZmVyR2VuZXJhdGlvbik7CisKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIEFMT0dJKCJbJXNdIHNhdyBvdXRwdXQgRU9TIiwgbUlzQXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CisKKyAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJlb3MiLCB0cnVlKTsKKyAgICAgICAgcmVwbHktPnNldEludDMyKCJlb3MiLCB0cnVlKTsKKyAgICB9CisKKyAgICBtTnVtRnJhbWVzVG90YWwgKz0gIW1Jc0F1ZGlvOworCisgICAgaWYgKG1Ta2lwUmVuZGVyaW5nVW50aWxNZWRpYVRpbWVVcyA+PSAwKSB7CisgICAgICAgIGlmICh0aW1lVXMgPCBtU2tpcFJlbmRlcmluZ1VudGlsTWVkaWFUaW1lVXMpIHsKKyAgICAgICAgICAgIEFMT0dWKCJbJXNdIGRyb3BwaW5nIGJ1ZmZlciBhdCB0aW1lICVsbGQgYXMgcmVxdWVzdGVkLiIsCisgICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCAobG9uZyBsb25nKXRpbWVVcyk7CisKKyAgICAgICAgICAgIHJlcGx5LT5wb3N0KCk7CisgICAgICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICAgICAgbm90aWZ5UmVzdW1lQ29tcGxldGVJZk5lY2Vzc2FyeSgpOworICAgICAgICAgICAgICAgIGlmIChtUmVuZGVyZXIgIT0gTlVMTCAmJiAhaXNEaXNjb250aW51aXR5UGVuZGluZygpKSB7CisgICAgICAgICAgICAgICAgICAgIG1SZW5kZXJlci0+cXVldWVFT1MobUlzQXVkaW8sIEVSUk9SX0VORF9PRl9TVFJFQU0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgbVNraXBSZW5kZXJpbmdVbnRpbE1lZGlhVGltZVVzID0gLTE7CisgICAgfQorCisgICAgLy8gd2FpdCB1bnRpbCAxc3QgZnJhbWUgY29tZXMgb3V0IHRvIHNpZ25hbCByZXN1bWUgY29tcGxldGUKKyAgICBub3RpZnlSZXN1bWVDb21wbGV0ZUlmTmVjZXNzYXJ5KCk7CisKKyAgICBpZiAobVJlbmRlcmVyICE9IE5VTEwpIHsKKyAgICAgICAgLy8gc2VuZCB0aGUgYnVmZmVyIHRvIHJlbmRlcmVyLgorICAgICAgICBtUmVuZGVyZXItPnF1ZXVlQnVmZmVyKG1Jc0F1ZGlvLCBidWZmZXIsIHJlcGx5KTsKKyAgICAgICAgaWYgKGVvcyAmJiAhaXNEaXNjb250aW51aXR5UGVuZGluZygpKSB7CisgICAgICAgICAgICBtUmVuZGVyZXItPnF1ZXVlRU9TKG1Jc0F1ZGlvLCBFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIE51UGxheWVyMjo6RGVjb2Rlcjo6aGFuZGxlT3V0cHV0Rm9ybWF0Q2hhbmdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7CisgICAgaWYgKCFtSXNBdWRpbykgeworICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CisgICAgICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpCisgICAgICAgICAgICAgICAgJiYgZm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKSB7CisgICAgICAgICAgICBtU3RhdHMtPnNldEludDMyKCJ3aWR0aCIsIHdpZHRoKTsKKyAgICAgICAgICAgIG1TdGF0cy0+c2V0SW50MzIoImhlaWdodCIsIGhlaWdodCk7CisgICAgICAgIH0KKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRWaWRlb1NpemVDaGFuZ2VkKTsKKyAgICAgICAgbm90aWZ5LT5zZXRNZXNzYWdlKCJmb3JtYXQiLCBmb3JtYXQpOworICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICB9IGVsc2UgaWYgKG1SZW5kZXJlciAhPSBOVUxMKSB7CisgICAgICAgIHVpbnQzMl90IGZsYWdzOworICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXM7CisgICAgICAgIGJvb2wgaGFzVmlkZW8gPSAobVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKSAhPSBOVUxMKTsKKyAgICAgICAgaWYgKGdldEF1ZGlvRGVlcEJ1ZmZlclNldHRpbmcoKSAvLyBvdmVycmlkZSByZWdhcmRsZXNzIG9mIHNvdXJjZSBkdXJhdGlvbgorICAgICAgICAgICAgICAgIHx8IChtU291cmNlLT5nZXREdXJhdGlvbigmZHVyYXRpb25VcykgPT0gT0sKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGR1cmF0aW9uVXMgPiBBVURJT19TSU5LX01JTl9ERUVQX0JVRkZFUl9EVVJBVElPTl9VUykpIHsKKyAgICAgICAgICAgIGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfREVFUF9CVUZGRVI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkU7CisgICAgICAgIH0KKworICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRBdWRpb091dHB1dEZvcm1hdENoYW5nZWQsIHRoaXMpOworICAgICAgICByZXBseS0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtQnVmZmVyR2VuZXJhdGlvbik7CisgICAgICAgIG1SZW5kZXJlci0+Y2hhbmdlQXVkaW9Gb3JtYXQoCisgICAgICAgICAgICAgICAgZm9ybWF0LCBmYWxzZSAvKiBvZmZsb2FkT25seSAqLywgaGFzVmlkZW8sCisgICAgICAgICAgICAgICAgZmxhZ3MsIG1Tb3VyY2UtPmlzU3RyZWFtaW5nKCksIHJlcGx5KTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyOjpyZWxlYXNlQW5kUmVzZXRNZWRpYUJ1ZmZlcnMoKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTWVkaWFCdWZmZXJzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtTWVkaWFCdWZmZXJzW2ldICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1NZWRpYUJ1ZmZlcnNbaV0tPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1NZWRpYUJ1ZmZlcnMuZWRpdEl0ZW1BdChpKSA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgbU1lZGlhQnVmZmVycy5yZXNpemUobUlucHV0QnVmZmVycy5zaXplKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1lZGlhQnVmZmVycy5zaXplKCk7IGkrKykgeworICAgICAgICBtTWVkaWFCdWZmZXJzLmVkaXRJdGVtQXQoaSkgPSBOVUxMOworICAgIH0KKyAgICBtSW5wdXRCdWZmZXJJc0RlcXVldWVkLmNsZWFyKCk7CisgICAgbUlucHV0QnVmZmVySXNEZXF1ZXVlZC5yZXNpemUobUlucHV0QnVmZmVycy5zaXplKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0QnVmZmVySXNEZXF1ZXVlZC5zaXplKCk7IGkrKykgeworICAgICAgICBtSW5wdXRCdWZmZXJJc0RlcXVldWVkLmVkaXRJdGVtQXQoaSkgPSBmYWxzZTsKKyAgICB9CisKKyAgICBtUGVuZGluZ0lucHV0TWVzc2FnZXMuY2xlYXIoKTsKKyAgICBtRGVxdWV1ZWRJbnB1dEJ1ZmZlcnMuY2xlYXIoKTsKKyAgICBtU2tpcFJlbmRlcmluZ1VudGlsTWVkaWFUaW1lVXMgPSAtMTsKK30KKworYm9vbCBOdVBsYXllcjI6OkRlY29kZXI6OmlzU3RhbGVSZXBseShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7CisgICAgcmV0dXJuIGdlbmVyYXRpb24gIT0gbUJ1ZmZlckdlbmVyYXRpb247Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6RGVjb2Rlcjo6ZmV0Y2hJbnB1dERhdGEoc3A8QU1lc3NhZ2U+ICZyZXBseSkgeworICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQ7CisgICAgYm9vbCBkcm9wQWNjZXNzVW5pdCA9IHRydWU7CisgICAgZG8geworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5kZXF1ZXVlQWNjZXNzVW5pdChtSXNBdWRpbywgJmFjY2Vzc1VuaXQpOworCisgICAgICAgIGlmIChlcnIgPT0gLUVXT1VMREJMT0NLKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9IGVsc2UgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgaWYgKGVyciA9PSBJTkZPX0RJU0NPTlRJTlVJVFkpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHR5cGU7CisgICAgICAgICAgICAgICAgQ0hFQ0soYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kSW50MzIoImRpc2NvbnRpbnVpdHkiLCAmdHlwZSkpOworCisgICAgICAgICAgICAgICAgYm9vbCBmb3JtYXRDaGFuZ2UgPQorICAgICAgICAgICAgICAgICAgICAobUlzQXVkaW8gJiYKKyAgICAgICAgICAgICAgICAgICAgICh0eXBlICYgQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX0FVRElPX0ZPUk1BVCkpCisgICAgICAgICAgICAgICAgICAgIHx8ICghbUlzQXVkaW8gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHlwZSAmIEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9WSURFT19GT1JNQVQpKTsKKworICAgICAgICAgICAgICAgIGJvb2wgdGltZUNoYW5nZSA9ICh0eXBlICYgQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX1RJTUUpICE9IDA7CisKKyAgICAgICAgICAgICAgICBBTE9HSSgiJXMgZGlzY29udGludWl0eSAoZm9ybWF0PSVkLCB0aW1lPSVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBtSXNBdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iLCBmb3JtYXRDaGFuZ2UsIHRpbWVDaGFuZ2UpOworCisgICAgICAgICAgICAgICAgYm9vbCBzZWFtbGVzc0Zvcm1hdENoYW5nZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBuZXdGb3JtYXQgPSBtU291cmNlLT5nZXRGb3JtYXQobUlzQXVkaW8pOworICAgICAgICAgICAgICAgIGlmIChmb3JtYXRDaGFuZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgc2VhbWxlc3NGb3JtYXRDaGFuZ2UgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHNTZWFtbGVzc0Zvcm1hdENoYW5nZShuZXdGb3JtYXQpOworICAgICAgICAgICAgICAgICAgICAvLyB0cmVhdCBzZWFtbGVzcyBmb3JtYXQgY2hhbmdlIHNlcGFyYXRlbHkKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0Q2hhbmdlID0gIXNlYW1sZXNzRm9ybWF0Q2hhbmdlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEZvciBmb3JtYXQgb3IgdGltZSBjaGFuZ2UsIHJldHVybiBFT1MgdG8gcXVldWUgRU9TIGlucHV0LAorICAgICAgICAgICAgICAgIC8vIHRoZW4gd2FpdCBmb3IgRU9TIG9uIG91dHB1dC4KKyAgICAgICAgICAgICAgICBpZiAoZm9ybWF0Q2hhbmdlIC8qIG5vdCBzZWFtbGVzcyAqLykgeworICAgICAgICAgICAgICAgICAgICBtRm9ybWF0Q2hhbmdlUGVuZGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aW1lQ2hhbmdlKSB7CisgICAgICAgICAgICAgICAgICAgIHJlbWVtYmVyQ29kZWNTcGVjaWZpY0RhdGEobmV3Rm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgbVRpbWVDaGFuZ2VQZW5kaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlYW1sZXNzRm9ybWF0Q2hhbmdlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHJldXNlIGV4aXN0aW5nIGRlY29kZXIgYW5kIGRvbid0IGZsdXNoCisgICAgICAgICAgICAgICAgICAgIHJlbWVtYmVyQ29kZWNTcGVjaWZpY0RhdGEobmV3Rm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBzdHJlYW0gaXMgdW5hZmZlY3RlZCBieSB0aGUgZGlzY29udGludWl0eQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVXT1VMREJMT0NLOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcmVwbHkgc2hvdWxkIG9ubHkgYmUgcmV0dXJuZWQgd2l0aG91dCBhIGJ1ZmZlciBzZXQKKyAgICAgICAgICAgIC8vIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgKGluY2x1ZGluZyBFT1MpCisgICAgICAgICAgICBDSEVDSyhlcnIgIT0gT0spOworCisgICAgICAgICAgICByZXBseS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgfQorCisgICAgICAgIGRyb3BBY2Nlc3NVbml0ID0gZmFsc2U7CisgICAgICAgIGlmICghbUlzQXVkaW8gJiYgIW1Jc0VuY3J5cHRlZCkgeworICAgICAgICAgICAgLy8gRXh0cmEgc2FmZWd1YXJkIGlmIGhpZ2hlci1sZXZlbCBiZWhhdmlvciBjaGFuZ2VzLiBPdGhlcndpc2UsIG5vdCByZXF1aXJlZCBub3cuCisgICAgICAgICAgICAvLyBQcmV2ZW50aW5nIHRoZSBidWZmZXIgZnJvbSBiZWluZyBwcm9jZXNzZWQgKGFuZCBzZW50IHRvIGNvZGVjKSBpZiB0aGlzIGlzIGEgbGF0ZXIKKyAgICAgICAgICAgIC8vIHJvdW5kIG9mIHBsYXliYWNrIGJ1dCB0aGlzIHRpbWUgd2l0aG91dCBwcmVwYXJlRHJtLiBPciBpZiB0aGVyZSBpcyBhIHJhY2UgYmV0d2VlbgorICAgICAgICAgICAgLy8gc3RvcCAod2hpY2ggaXMgbm90IGJsb2NraW5nKSBhbmQgcmVsZWFzZURybSBhbGxvd2luZyBidWZmZXJzIGJlaW5nIHByb2Nlc3NlZCBhZnRlcgorICAgICAgICAgICAgLy8gQ3J5cHRvIGhhcyBiZWVuIHJlbGVhc2VkIChHZW5lcmljU291cmNlIGN1cnJlbnRseSBwcmV2ZW50cyB0aGlzIHJhY2UgdGhvdWdoKS4KKyAgICAgICAgICAgIC8vIFBhcnRpY3VsYXJseSBkb2luZyB0aGlzIGNoZWNrIGJlZm9yZSBJc0FWQ1JlZmVyZW5jZUZyYW1lIGNhbGwgdG8gcHJldmVudCBwYXJzaW5nCisgICAgICAgICAgICAvLyBvZiBlbmNyeXB0ZWQgZGF0YS4KKyAgICAgICAgICAgIGlmIChtSXNFbmNyeXB0ZWRPYnNlcnZlZEVhcmxpZXIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZmV0Y2hJbnB1dERhdGE6IG1pc21hdGNoZWQgbUlzRW5jcnlwdGVkL21Jc0VuY3J5cHRlZE9ic2VydmVkRWFybGllciAoMC8xKSIpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQzMl90IGxheWVySWQgPSAwOworICAgICAgICAgICAgYm9vbCBoYXZlTGF5ZXJJZCA9IGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEludDMyKCJ0ZW1wb3JhbC1sYXllci1pZCIsICZsYXllcklkKTsKKyAgICAgICAgICAgIGlmIChtUmVuZGVyZXItPmdldFZpZGVvTGF0ZUJ5VXMoKSA+IDEwMDAwMGxsCisgICAgICAgICAgICAgICAgICAgICYmIG1Jc1ZpZGVvQVZDCisgICAgICAgICAgICAgICAgICAgICYmICFJc0FWQ1JlZmVyZW5jZUZyYW1lKGFjY2Vzc1VuaXQpKSB7CisgICAgICAgICAgICAgICAgZHJvcEFjY2Vzc1VuaXQgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChoYXZlTGF5ZXJJZCAmJiBtTnVtVmlkZW9UZW1wb3JhbExheWVyVG90YWwgPiAxKSB7CisgICAgICAgICAgICAgICAgLy8gQWRkIG9ubHkgb25lIGxheWVyIGVhY2ggdGltZS4KKyAgICAgICAgICAgICAgICBpZiAobGF5ZXJJZCA+IG1DdXJyZW50TWF4VmlkZW9UZW1wb3JhbExheWVySWQgKyAxCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBsYXllcklkID49IG1OdW1WaWRlb1RlbXBvcmFsTGF5ZXJBbGxvd2VkKSB7CisgICAgICAgICAgICAgICAgICAgIGRyb3BBY2Nlc3NVbml0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImRyb3BwaW5nIGxheWVyKCVkKSwgc3BlZWQ9JWcsIGFsbG93ZWQgbGF5ZXIgY291bnQ9JWQsIG1heCBsYXllcklkPSVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcklkLCBtUGxheWJhY2tTcGVlZCwgbU51bVZpZGVvVGVtcG9yYWxMYXllckFsbG93ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRNYXhWaWRlb1RlbXBvcmFsTGF5ZXJJZCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsYXllcklkID4gbUN1cnJlbnRNYXhWaWRlb1RlbXBvcmFsTGF5ZXJJZCkgeworICAgICAgICAgICAgICAgICAgICBtQ3VycmVudE1heFZpZGVvVGVtcG9yYWxMYXllcklkID0gbGF5ZXJJZDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxheWVySWQgPT0gMCAmJiBtTnVtVmlkZW9UZW1wb3JhbExheWVyVG90YWwgPiAxCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBJc0lEUihhY2Nlc3NVbml0LT5kYXRhKCksIGFjY2Vzc1VuaXQtPnNpemUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRNYXhWaWRlb1RlbXBvcmFsTGF5ZXJJZCA9IG1OdW1WaWRlb1RlbXBvcmFsTGF5ZXJUb3RhbCAtIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGRyb3BBY2Nlc3NVbml0KSB7CisgICAgICAgICAgICAgICAgaWYgKGxheWVySWQgPD0gbUN1cnJlbnRNYXhWaWRlb1RlbXBvcmFsTGF5ZXJJZCAmJiBsYXllcklkID4gMCkgeworICAgICAgICAgICAgICAgICAgICBtQ3VycmVudE1heFZpZGVvVGVtcG9yYWxMYXllcklkID0gbGF5ZXJJZCAtIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICsrbU51bUlucHV0RnJhbWVzRHJvcHBlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gd2hpbGUgKGRyb3BBY2Nlc3NVbml0KTsKKworICAgIC8vIEFMT0dWKCJyZXR1cm5lZCBhIHZhbGlkIGJ1ZmZlciBvZiAlcyBkYXRhIiwgbUlzQXVkaW8gPyAibUlzQXVkaW8iIDogInZpZGVvIik7CisjaWYgMAorICAgIGludDY0X3QgbWVkaWFUaW1lVXM7CisgICAgQ0hFQ0soYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZtZWRpYVRpbWVVcykpOworICAgIEFMT0dWKCJbJXNdIGZlZWRpbmcgaW5wdXQgYnVmZmVyIGF0IG1lZGlhIHRpbWUgJS4zZiIsCisgICAgICAgICBtSXNBdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iLAorICAgICAgICAgbWVkaWFUaW1lVXMgLyAxRTYpOworI2VuZGlmCisKKyAgICBpZiAobUNDRGVjb2RlciAhPSBOVUxMKSB7CisgICAgICAgIG1DQ0RlY29kZXItPmRlY29kZShhY2Nlc3NVbml0KTsKKyAgICB9CisKKyAgICByZXBseS0+c2V0QnVmZmVyKCJidWZmZXIiLCBhY2Nlc3NVbml0KTsKKworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBOdVBsYXllcjI6OkRlY29kZXI6Om9uSW5wdXRCdWZmZXJGZXRjaGVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgaWYgKG1Db2RlYyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJbJXNdIG9uSW5wdXRCdWZmZXJGZXRjaGVkIHdpdGhvdXQgYSB2YWxpZCBjb2RlYyIsIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOworICAgICAgICBoYW5kbGVFcnJvcihOT19JTklUKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHNpemVfdCBidWZmZXJJeDsKKyAgICBDSEVDSyhtc2ctPmZpbmRTaXplKCJidWZmZXItaXgiLCAmYnVmZmVySXgpKTsKKyAgICBDSEVDS19MVChidWZmZXJJeCwgbUlucHV0QnVmZmVycy5zaXplKCkpOworICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IGNvZGVjQnVmZmVyID0gbUlucHV0QnVmZmVyc1tidWZmZXJJeF07CisKKyAgICBzcDxBQnVmZmVyPiBidWZmZXI7CisgICAgYm9vbCBoYXNCdWZmZXIgPSBtc2ctPmZpbmRCdWZmZXIoImJ1ZmZlciIsICZidWZmZXIpOworICAgIGJvb2wgbmVlZHNDb3B5ID0gdHJ1ZTsKKworICAgIGlmIChidWZmZXIgPT0gTlVMTCAvKiBpbmNsdWRlcyAhaGFzQnVmZmVyICovKSB7CisgICAgICAgIGludDMyX3Qgc3RyZWFtRXJyID0gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImVyciIsICZzdHJlYW1FcnIpIHx8ICFoYXNCdWZmZXIpOworCisgICAgICAgIENIRUNLKHN0cmVhbUVyciAhPSBPSyk7CisKKyAgICAgICAgLy8gYXR0ZW1wdCB0byBxdWV1ZSBFT1MKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUNvZGVjLT5xdWV1ZUlucHV0QnVmZmVyKAorICAgICAgICAgICAgICAgIGJ1ZmZlckl4LAorICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgIEFNRURJQUNPREVDX0JVRkZFUl9GTEFHX0VORF9PRl9TVFJFQU0pOworICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICBtSW5wdXRCdWZmZXJJc0RlcXVldWVkLmVkaXRJdGVtQXQoYnVmZmVySXgpID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtRXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgIHN0cmVhbUVyciA9IGVycjsKKyAgICAgICAgICAgIC8vIGVyciB3aWxsIG5vdCBiZSBFUlJPUl9FTkRfT0ZfU1RSRUFNCisgICAgICAgIH0KKworICAgICAgICBpZiAoc3RyZWFtRXJyICE9IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgIEFMT0dFKCJTdHJlYW0gZXJyb3IgZm9yIFslc10gKGVycj0lZCksIEVPUyAlcyBxdWV1ZWQiLAorICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICBzdHJlYW1FcnIsCisgICAgICAgICAgICAgICAgICAgIGVyciA9PSBPSyA/ICJzdWNjZXNzZnVsbHkiIDogInVuc3VjY2Vzc2Z1bGx5Iik7CisgICAgICAgICAgICBoYW5kbGVFcnJvcihzdHJlYW1FcnIpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IGV4dHJhOworICAgICAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRNZXNzYWdlKCJleHRyYSIsICZleHRyYSkgJiYgZXh0cmEgIT0gTlVMTCkgeworICAgICAgICAgICAgaW50NjRfdCByZXN1bWVBdE1lZGlhVGltZVVzOworICAgICAgICAgICAgaWYgKGV4dHJhLT5maW5kSW50NjQoCisgICAgICAgICAgICAgICAgICAgICAgICAicmVzdW1lLWF0LW1lZGlhVGltZVVzIiwgJnJlc3VtZUF0TWVkaWFUaW1lVXMpKSB7CisgICAgICAgICAgICAgICAgQUxPR0koIlslc10gc3VwcHJlc3NpbmcgcmVuZGVyaW5nIHVudGlsICVsbGQgdXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgKGxvbmcgbG9uZylyZXN1bWVBdE1lZGlhVGltZVVzKTsKKyAgICAgICAgICAgICAgICBtU2tpcFJlbmRlcmluZ1VudGlsTWVkaWFUaW1lVXMgPSByZXN1bWVBdE1lZGlhVGltZVVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50NjRfdCB0aW1lVXMgPSAwOworICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKKworICAgICAgICBpbnQzMl90IGVvcywgY3NkOworICAgICAgICAvLyB3ZSBkbyBub3QgZXhwZWN0IFNZTkNGUkFNRSBmb3IgZGVjb2RlcgorICAgICAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigiZW9zIiwgJmVvcykgJiYgZW9zKSB7CisgICAgICAgICAgICBmbGFncyB8PSBBTUVESUFDT0RFQ19CVUZGRVJfRkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICB9IGVsc2UgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImNzZCIsICZjc2QpICYmIGNzZCkgeworICAgICAgICAgICAgZmxhZ3MgfD0gQU1FRElBQ09ERUNfQlVGRkVSX0ZMQUdfQ09ERUNfQ09ORklHOworICAgICAgICB9CisKKyAgICAgICAgLy8gTW9kdWxhciBEUk0KKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICptZWRpYUJ1ZiA9IE5VTEw7CisgICAgICAgIHNwPEFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXI+IGNyeXB0SW5mbzsKKworICAgICAgICAvLyBjb3B5IGludG8gY29kZWMgYnVmZmVyCisgICAgICAgIGlmIChuZWVkc0NvcHkpIHsKKyAgICAgICAgICAgIGlmIChidWZmZXItPnNpemUoKSA+IGNvZGVjQnVmZmVyLT5jYXBhY2l0eSgpKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoRVJST1JfQlVGRkVSX1RPT19TTUFMTCk7CisgICAgICAgICAgICAgICAgbURlcXVldWVkSW5wdXRCdWZmZXJzLnB1c2hfYmFjayhidWZmZXJJeCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYnVmZmVyLT5kYXRhKCkgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGNvZGVjQnVmZmVyLT5zZXRSYW5nZSgwLCBidWZmZXItPnNpemUoKSk7CisgICAgICAgICAgICAgICAgbWVtY3B5KGNvZGVjQnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CisgICAgICAgICAgICB9IGVsc2UgeyAvLyBObyBidWZmZXItPmRhdGEoKQorICAgICAgICAgICAgICAgIC8vTW9kdWxhciBEUk0KKyAgICAgICAgICAgICAgICBzcDxSZWZCYXNlPiBob2xkZXI7CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kT2JqZWN0KCJtZWRpYUJ1ZmZlckhvbGRlciIsICZob2xkZXIpKSB7CisgICAgICAgICAgICAgICAgICAgIG1lZGlhQnVmID0gKGhvbGRlciAhPSBudWxscHRyKSA/CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxNZWRpYUJ1ZmZlckhvbGRlcio+KGhvbGRlci5nZXQoKSktPm1lZGlhQnVmZmVyKCkgOiBudWxscHRyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobWVkaWFCdWYgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBjb2RlY0J1ZmZlci0+c2V0UmFuZ2UoMCwgbWVkaWFCdWYtPnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShjb2RlY0J1ZmZlci0+ZGF0YSgpLCBtZWRpYUJ1Zi0+ZGF0YSgpLCBtZWRpYUJ1Zi0+c2l6ZSgpKTsKKworICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGFfZGF0YSA9IG1lZGlhQnVmLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgY3J5cHRJbmZvID0gQU1lZGlhQ29kZWNDcnlwdG9JbmZvV3JhcHBlcjo6Q3JlYXRlKG1ldGFfZGF0YSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gTm8gbWVkaWFCdWYKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIm9uSW5wdXRCdWZmZXJGZXRjaGVkOiBidWZmZXItPmRhdGEoKS9tZWRpYUJ1ZiBhcmUgTlVMTCBmb3IgJXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5nZXQoKSk7CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKFVOS05PV05fRVJST1IpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSAvLyBidWZmZXItPmRhdGEoKQorICAgICAgICB9IC8vIG5lZWRzQ29weQorCisgICAgICAgIHN0YXR1c190IGVycjsKKyAgICAgICAgaWYgKGNyeXB0SW5mbyAhPSBOVUxMKSB7CisgICAgICAgICAgICBlcnIgPSBtQ29kZWMtPnF1ZXVlU2VjdXJlSW5wdXRCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckl4LAorICAgICAgICAgICAgICAgICAgICBjb2RlY0J1ZmZlci0+b2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgIGNyeXB0SW5mbywKKyAgICAgICAgICAgICAgICAgICAgdGltZVVzLAorICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgICAgICAgICAvLyBzeW5jaHJvbm91cyBjYWxsIHNvIGRvbmUgd2l0aCBjcnlwdEluZm8gaGVyZQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXJyID0gbUNvZGVjLT5xdWV1ZUlucHV0QnVmZmVyKAorICAgICAgICAgICAgICAgICAgICBidWZmZXJJeCwKKyAgICAgICAgICAgICAgICAgICAgY29kZWNCdWZmZXItPm9mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICBjb2RlY0J1ZmZlci0+c2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICB0aW1lVXMsCisgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICAgICAgfSAvLyBubyBjcnlwdEluZm8KKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgib25JbnB1dEJ1ZmZlckZldGNoZWQ6IHF1ZXVlJXNJbnB1dEJ1ZmZlciBmYWlsZWQgZm9yIFslc10gKGVycj0lZCkiLAorICAgICAgICAgICAgICAgICAgICAoY3J5cHRJbmZvICE9IE5VTEwgPyAiU2VjdXJlIiA6ICIiKSwKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyKTsKKyAgICAgICAgICAgIGhhbmRsZUVycm9yKGVycik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtSW5wdXRCdWZmZXJJc0RlcXVldWVkLmVkaXRJdGVtQXQoYnVmZmVySXgpID0gZmFsc2U7CisgICAgICAgIH0KKworICAgIH0gICAvLyBidWZmZXIgIT0gTlVMTAorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIE51UGxheWVyMjo6RGVjb2Rlcjo6b25SZW5kZXJCdWZmZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgaW50MzJfdCByZW5kZXI7CisgICAgc2l6ZV90IGJ1ZmZlckl4OworICAgIGludDMyX3QgZW9zOworICAgIENIRUNLKG1zZy0+ZmluZFNpemUoImJ1ZmZlci1peCIsICZidWZmZXJJeCkpOworCisgICAgaWYgKCFtSXNBdWRpbykgeworICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gYnVmZmVyID0gbU91dHB1dEJ1ZmZlcnNbYnVmZmVySXhdOworICAgICAgICBidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKTsKKworICAgICAgICBpZiAobUNDRGVjb2RlciAhPSBOVUxMICYmIG1DQ0RlY29kZXItPmlzU2VsZWN0ZWQoKSkgeworICAgICAgICAgICAgbUNDRGVjb2Rlci0+ZGlzcGxheSh0aW1lVXMpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1Db2RlYyA9PSBOVUxMKSB7CisgICAgICAgIGVyciA9IE5PX0lOSVQ7CisgICAgfSBlbHNlIGlmIChtc2ctPmZpbmRJbnQzMigicmVuZGVyIiwgJnJlbmRlcikgJiYgcmVuZGVyKSB7CisgICAgICAgIGludDY0X3QgdGltZXN0YW1wTnM7CisgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJ0aW1lc3RhbXBOcyIsICZ0aW1lc3RhbXBOcykpOworICAgICAgICBlcnIgPSBtQ29kZWMtPnJlbGVhc2VPdXRwdXRCdWZmZXJBdFRpbWUoYnVmZmVySXgsIHRpbWVzdGFtcE5zKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtTnVtT3V0cHV0RnJhbWVzRHJvcHBlZCArPSAhbUlzQXVkaW87CisgICAgICAgIGVyciA9IG1Db2RlYy0+cmVsZWFzZU91dHB1dEJ1ZmZlcihidWZmZXJJeCwgZmFsc2UgLyogcmVuZGVyICovKTsKKyAgICB9CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHJlbGVhc2Ugb3V0cHV0IGJ1ZmZlciBmb3IgWyVzXSAoZXJyPSVkKSIsCisgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyKTsKKyAgICAgICAgaGFuZGxlRXJyb3IoZXJyKTsKKyAgICB9CisgICAgaWYgKG1zZy0+ZmluZEludDMyKCJlb3MiLCAmZW9zKSAmJiBlb3MKKyAgICAgICAgICAgICYmIGlzRGlzY29udGludWl0eVBlbmRpbmcoKSkgeworICAgICAgICBmaW5pc2hIYW5kbGVEaXNjb250aW51aXR5KHRydWUgLyogZmx1c2hPblRpbWVDaGFuZ2UgKi8pOworICAgIH0KK30KKworYm9vbCBOdVBsYXllcjI6OkRlY29kZXI6OmlzRGlzY29udGludWl0eVBlbmRpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Gb3JtYXRDaGFuZ2VQZW5kaW5nIHx8IG1UaW1lQ2hhbmdlUGVuZGluZzsKK30KKwordm9pZCBOdVBsYXllcjI6OkRlY29kZXI6OmZpbmlzaEhhbmRsZURpc2NvbnRpbnVpdHkoYm9vbCBmbHVzaE9uVGltZUNoYW5nZSkgeworICAgIEFMT0dWKCJmaW5pc2hIYW5kbGVEaXNjb250aW51aXR5OiBmb3JtYXQgJWQsIHRpbWUgJWQsIGZsdXNoICVkIiwKKyAgICAgICAgICAgIG1Gb3JtYXRDaGFuZ2VQZW5kaW5nLCBtVGltZUNoYW5nZVBlbmRpbmcsIGZsdXNoT25UaW1lQ2hhbmdlKTsKKworICAgIC8vIElmIHdlIGhhdmUgZm9ybWF0IGNoYW5nZSwgcGF1c2UgYW5kIHdhaXQgdG8gYmUga2lsbGVkOworICAgIC8vIElmIHdlIGhhdmUgdGltZSBjaGFuZ2Ugb25seSwgZmx1c2ggYW5kIHJlc3RhcnQgZmV0Y2hpbmcuCisKKyAgICBpZiAobUZvcm1hdENoYW5nZVBlbmRpbmcpIHsKKyAgICAgICAgbVBhdXNlZCA9IHRydWU7CisgICAgfSBlbHNlIGlmIChtVGltZUNoYW5nZVBlbmRpbmcpIHsKKyAgICAgICAgaWYgKGZsdXNoT25UaW1lQ2hhbmdlKSB7CisgICAgICAgICAgICBkb0ZsdXNoKGZhbHNlIC8qIG5vdGlmeUNvbXBsZXRlICovKTsKKyAgICAgICAgICAgIHNpZ25hbFJlc3VtZShmYWxzZSAvKiBub3RpZnlDb21wbGV0ZSAqLyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBOb3RpZnkgTnVQbGF5ZXIyIHRvIGVpdGhlciBzaHV0ZG93biBkZWNvZGVyLCBvciByZXNjYW4gc291cmNlcworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBtc2ctPnNldEludDMyKCJ3aGF0Iiwga1doYXRJbnB1dERpc2NvbnRpbnVpdHkpOworICAgIG1zZy0+c2V0SW50MzIoImZvcm1hdENoYW5nZSIsIG1Gb3JtYXRDaGFuZ2VQZW5kaW5nKTsKKyAgICBtc2ctPnBvc3QoKTsKKworICAgIG1Gb3JtYXRDaGFuZ2VQZW5kaW5nID0gZmFsc2U7CisgICAgbVRpbWVDaGFuZ2VQZW5kaW5nID0gZmFsc2U7Cit9CisKK2Jvb2wgTnVQbGF5ZXIyOjpEZWNvZGVyOjpzdXBwb3J0c1NlYW1sZXNzQXVkaW9Gb3JtYXRDaGFuZ2UoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmdGFyZ2V0Rm9ybWF0KSBjb25zdCB7CisgICAgaWYgKHRhcmdldEZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEFTdHJpbmcgbWltZTsKKyAgICBpZiAoIXRhcmdldEZvcm1hdC0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFzdHJjYXNlY21wKG1pbWUuY19zdHIoKSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKSkgeworICAgICAgICAvLyBmaWVsZC1ieS1maWVsZCBjb21wYXJpc29uCisgICAgICAgIGNvbnN0IGNoYXIgKiBrZXlzW10gPSB7ICJjaGFubmVsLWNvdW50IiwgInNhbXBsZS1yYXRlIiwgImlzLWFkdHMiIH07CisgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgc2l6ZW9mKGtleXMpIC8gc2l6ZW9mKGtleXNbMF0pOyBpKyspIHsKKyAgICAgICAgICAgIGludDMyX3Qgb2xkVmFsLCBuZXdWYWw7CisgICAgICAgICAgICBpZiAoIW1JbnB1dEZvcm1hdC0+Z2V0SW50MzIoa2V5c1tpXSwgJm9sZFZhbCkgfHwKKyAgICAgICAgICAgICAgICAgICAgIXRhcmdldEZvcm1hdC0+ZmluZEludDMyKGtleXNbaV0sICZuZXdWYWwpIHx8CisgICAgICAgICAgICAgICAgICAgIG9sZFZhbCAhPSBuZXdWYWwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzcDxBQnVmZmVyPiBuZXdCdWY7CisgICAgICAgIHVpbnQ4X3QgKm9sZEJ1ZkRhdGEgPSBOVUxMOworICAgICAgICBzaXplX3Qgb2xkQnVmU2l6ZSA9IDA7CisgICAgICAgIGlmIChtSW5wdXRGb3JtYXQtPmdldEJ1ZmZlcigiY3NkLTAiLCAodm9pZCoqKSZvbGRCdWZEYXRhLCAmb2xkQnVmU2l6ZSkgJiYKKyAgICAgICAgICAgICAgICB0YXJnZXRGb3JtYXQtPmZpbmRCdWZmZXIoImNzZC0wIiwgJm5ld0J1ZikpIHsKKyAgICAgICAgICAgIGlmIChvbGRCdWZTaXplICE9IG5ld0J1Zi0+c2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICFtZW1jbXAob2xkQnVmRGF0YSwgbmV3QnVmLT5kYXRhKCksIG9sZEJ1ZlNpemUpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBOdVBsYXllcjI6OkRlY29kZXI6OnN1cHBvcnRzU2VhbWxlc3NGb3JtYXRDaGFuZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZ0YXJnZXRGb3JtYXQpIGNvbnN0IHsKKyAgICBpZiAobUlucHV0Rm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICh0YXJnZXRGb3JtYXQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBBU3RyaW5nIG9sZE1pbWUsIG5ld01pbWU7CisgICAgaWYgKCFtSW5wdXRGb3JtYXQtPmdldFN0cmluZygibWltZSIsICZvbGRNaW1lKQorICAgICAgICAgICAgfHwgIXRhcmdldEZvcm1hdC0+ZmluZFN0cmluZygibWltZSIsICZuZXdNaW1lKQorICAgICAgICAgICAgfHwgIShvbGRNaW1lID09IG5ld01pbWUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIGF1ZGlvID0gIXN0cm5jYXNlY21wKG9sZE1pbWUuY19zdHIoKSwgImF1ZGlvLyIsIHN0cmxlbigiYXVkaW8vIikpOworICAgIGJvb2wgc2VhbWxlc3M7CisgICAgaWYgKGF1ZGlvKSB7CisgICAgICAgIHNlYW1sZXNzID0gc3VwcG9ydHNTZWFtbGVzc0F1ZGlvRm9ybWF0Q2hhbmdlKHRhcmdldEZvcm1hdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50MzJfdCBpc0FkYXB0aXZlOworICAgICAgICBzZWFtbGVzcyA9IChtQ29kZWMgIT0gTlVMTCAmJgorICAgICAgICAgICAgICAgIG1JbnB1dEZvcm1hdC0+Z2V0SW50MzIoImFkYXB0aXZlLXBsYXliYWNrIiwgJmlzQWRhcHRpdmUpICYmCisgICAgICAgICAgICAgICAgaXNBZGFwdGl2ZSk7CisgICAgfQorCisgICAgQUxPR1YoIiVzIHNlYW1sZXNzIHN1cHBvcnQgZm9yICVzIiwgc2VhbWxlc3MgPyAieWVzIiA6ICJubyIsIG9sZE1pbWUuY19zdHIoKSk7CisgICAgcmV0dXJuIHNlYW1sZXNzOworfQorCit2b2lkIE51UGxheWVyMjo6RGVjb2Rlcjo6cmVtZW1iZXJDb2RlY1NwZWNpZmljRGF0YShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgeworICAgIGlmIChmb3JtYXQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1DU0RzRm9yQ3VycmVudEZvcm1hdC5jbGVhcigpOworICAgIGZvciAoaW50MzJfdCBpID0gMDsgOyArK2kpIHsKKyAgICAgICAgQVN0cmluZyB0YWcgPSAiY3NkLSI7CisgICAgICAgIHRhZy5hcHBlbmQoaSk7CisgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKKyAgICAgICAgaWYgKCFmb3JtYXQtPmZpbmRCdWZmZXIodGFnLmNfc3RyKCksICZidWZmZXIpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBtQ1NEc0ZvckN1cnJlbnRGb3JtYXQucHVzaChidWZmZXIpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OkRlY29kZXI6Om5vdGlmeVJlc3VtZUNvbXBsZXRlSWZOZWNlc3NhcnkoKSB7CisgICAgaWYgKG1SZXN1bWVQZW5kaW5nKSB7CisgICAgICAgIG1SZXN1bWVQZW5kaW5nID0gZmFsc2U7CisKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRSZXN1bWVDb21wbGV0ZWQpOworICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRGVjb2Rlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEZWNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRmYjEwZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRGVjb2Rlci5oCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE5VUExBWUVSMl9ERUNPREVSX0hfCisjZGVmaW5lIE5VUExBWUVSMl9ERUNPREVSX0hfCisKKyNpbmNsdWRlICJOdVBsYXllcjIuaCIKKworI2luY2x1ZGUgIk51UGxheWVyMkRlY29kZXJCYXNlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTWVkaWFDb2RlY0J1ZmZlcjsKKworc3RydWN0IEFNZWRpYUNvZGVjV3JhcHBlcjsKK3N0cnVjdCBBTWVkaWFGb3JtYXRXcmFwcGVyOworCitzdHJ1Y3QgTnVQbGF5ZXIyOjpEZWNvZGVyIDogcHVibGljIERlY29kZXJCYXNlIHsKKyAgICBEZWNvZGVyKGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAorICAgICAgICAgICAgY29uc3Qgc3A8U291cmNlPiAmc291cmNlLAorICAgICAgICAgICAgcGlkX3QgcGlkLAorICAgICAgICAgICAgdWlkX3QgdWlkLAorICAgICAgICAgICAgY29uc3Qgc3A8UmVuZGVyZXI+ICZyZW5kZXJlciA9IE5VTEwsCisgICAgICAgICAgICBjb25zdCBzcDxBTmF0aXZlV2luZG93V3JhcHBlcj4gJm53dyA9IE5VTEwsCisgICAgICAgICAgICBjb25zdCBzcDxDQ0RlY29kZXI+ICZjY0RlY29kZXIgPSBOVUxMKTsKKworICAgIHZpcnR1YWwgc3A8QU1lc3NhZ2U+IGdldFN0YXRzKCkgY29uc3Q7CisKKyAgICAvLyBzZXRzIHRoZSBvdXRwdXQgc3VyZmFjZSBvZiB2aWRlbyBkZWNvZGVycy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxBTmF0aXZlV2luZG93V3JhcHBlcj4gJm53dyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VDcnlwdG8oKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkRlY29kZXIoKTsKKworICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25Db25maWd1cmUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpOworICAgIHZpcnR1YWwgdm9pZCBvblNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZwYXJhbXMpOworICAgIHZpcnR1YWwgdm9pZCBvblNldFJlbmRlcmVyKGNvbnN0IHNwPFJlbmRlcmVyPiAmcmVuZGVyZXIpOworICAgIHZpcnR1YWwgdm9pZCBvblJlc3VtZShib29sIG5vdGlmeUNvbXBsZXRlKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25GbHVzaCgpOworICAgIHZpcnR1YWwgdm9pZCBvblNodXRkb3duKGJvb2wgbm90aWZ5Q29tcGxldGUpOworICAgIHZpcnR1YWwgYm9vbCBkb1JlcXVlc3RCdWZmZXJzKCk7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtXaGF0Q29kZWNOb3RpZnkgICAgICAgICA9ICdjZGNOJywKKyAgICAgICAga1doYXRSZW5kZXJCdWZmZXIgICAgICAgID0gJ3JuZHInLAorICAgICAgICBrV2hhdFNldFZpZGVvU3VyZmFjZSAgICAgPSAnc1N1cicsCisgICAgICAgIGtXaGF0QXVkaW9PdXRwdXRGb3JtYXRDaGFuZ2VkID0gJ2FvZmMnLAorICAgICAgICBrV2hhdERybVJlbGVhc2VDcnlwdG8gICAgPSAnckRybScsCisgICAgfTsKKworICAgIGVudW0geworICAgICAgICBrTWF4TnVtVmlkZW9UZW1wb3JhbExheWVycyA9IDMyLAorICAgIH07CisKKyAgICBzcDxBTmF0aXZlV2luZG93V3JhcHBlcj4gbU5hdGl2ZVdpbmRvdzsKKworICAgIHNwPFNvdXJjZT4gbVNvdXJjZTsKKyAgICBzcDxSZW5kZXJlcj4gbVJlbmRlcmVyOworICAgIHNwPENDRGVjb2Rlcj4gbUNDRGVjb2RlcjsKKworICAgIHNwPEFNZWRpYUZvcm1hdFdyYXBwZXI+IG1JbnB1dEZvcm1hdDsKKyAgICBzcDxBTWVkaWFDb2RlY1dyYXBwZXI+IG1Db2RlYzsKKworICAgIExpc3Q8c3A8QU1lc3NhZ2U+ID4gbVBlbmRpbmdJbnB1dE1lc3NhZ2VzOworCisgICAgVmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+ID4gbUlucHV0QnVmZmVyczsKKyAgICBWZWN0b3I8c3A8TWVkaWFDb2RlY0J1ZmZlcj4gPiBtT3V0cHV0QnVmZmVyczsKKyAgICBWZWN0b3I8c3A8QUJ1ZmZlcj4gPiBtQ1NEc0ZvckN1cnJlbnRGb3JtYXQ7CisgICAgVmVjdG9yPHNwPEFCdWZmZXI+ID4gbUNTRHNUb1N1Ym1pdDsKKyAgICBWZWN0b3I8Ym9vbD4gbUlucHV0QnVmZmVySXNEZXF1ZXVlZDsKKyAgICBWZWN0b3I8TWVkaWFCdWZmZXIgKj4gbU1lZGlhQnVmZmVyczsKKyAgICBWZWN0b3I8c2l6ZV90PiBtRGVxdWV1ZWRJbnB1dEJ1ZmZlcnM7CisKKyAgICBjb25zdCBwaWRfdCBtUGlkOworICAgIGNvbnN0IHVpZF90IG1VaWQ7CisgICAgaW50NjRfdCBtU2tpcFJlbmRlcmluZ1VudGlsTWVkaWFUaW1lVXM7CisgICAgaW50NjRfdCBtTnVtRnJhbWVzVG90YWw7CisgICAgaW50NjRfdCBtTnVtSW5wdXRGcmFtZXNEcm9wcGVkOworICAgIGludDY0X3QgbU51bU91dHB1dEZyYW1lc0Ryb3BwZWQ7CisgICAgaW50MzJfdCBtVmlkZW9XaWR0aDsKKyAgICBpbnQzMl90IG1WaWRlb0hlaWdodDsKKyAgICBib29sIG1Jc0F1ZGlvOworICAgIGJvb2wgbUlzVmlkZW9BVkM7CisgICAgYm9vbCBtSXNTZWN1cmU7CisgICAgYm9vbCBtSXNFbmNyeXB0ZWQ7CisgICAgYm9vbCBtSXNFbmNyeXB0ZWRPYnNlcnZlZEVhcmxpZXI7CisgICAgYm9vbCBtRm9ybWF0Q2hhbmdlUGVuZGluZzsKKyAgICBib29sIG1UaW1lQ2hhbmdlUGVuZGluZzsKKyAgICBmbG9hdCBtRnJhbWVSYXRlVG90YWw7CisgICAgZmxvYXQgbVBsYXliYWNrU3BlZWQ7CisgICAgaW50MzJfdCBtTnVtVmlkZW9UZW1wb3JhbExheWVyVG90YWw7CisgICAgaW50MzJfdCBtTnVtVmlkZW9UZW1wb3JhbExheWVyQWxsb3dlZDsKKyAgICBpbnQzMl90IG1DdXJyZW50TWF4VmlkZW9UZW1wb3JhbExheWVySWQ7CisgICAgZmxvYXQgbVZpZGVvVGVtcG9yYWxMYXllckFnZ3JlZ2F0ZUZwc1trTWF4TnVtVmlkZW9UZW1wb3JhbExheWVyc107CisKKyAgICBib29sIG1SZXN1bWVQZW5kaW5nOworICAgIEFTdHJpbmcgbUNvbXBvbmVudE5hbWU7CisKKyAgICB2b2lkIGhhbmRsZUVycm9yKGludDMyX3QgZXJyKTsKKyAgICBib29sIGhhbmRsZUFuSW5wdXRCdWZmZXIoc2l6ZV90IGluZGV4KTsKKyAgICBib29sIGhhbmRsZUFuT3V0cHV0QnVmZmVyKAorICAgICAgICAgICAgc2l6ZV90IGluZGV4LAorICAgICAgICAgICAgc2l6ZV90IG9mZnNldCwKKyAgICAgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMsCisgICAgICAgICAgICBpbnQzMl90IGZsYWdzKTsKKyAgICB2b2lkIGhhbmRsZU91dHB1dEZvcm1hdENoYW5nZShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCk7CisKKyAgICB2b2lkIHJlbGVhc2VBbmRSZXNldE1lZGlhQnVmZmVycygpOworICAgIGJvb2wgaXNTdGFsZVJlcGx5KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKworICAgIHZvaWQgZG9GbHVzaChib29sIG5vdGlmeUNvbXBsZXRlKTsKKyAgICBzdGF0dXNfdCBmZXRjaElucHV0RGF0YShzcDxBTWVzc2FnZT4gJnJlcGx5KTsKKyAgICBib29sIG9uSW5wdXRCdWZmZXJGZXRjaGVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2b2lkIG9uUmVuZGVyQnVmZmVyKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKworICAgIGJvb2wgc3VwcG9ydHNTZWFtbGVzc0Zvcm1hdENoYW5nZShjb25zdCBzcDxBTWVzc2FnZT4gJnRvKSBjb25zdDsKKyAgICBib29sIHN1cHBvcnRzU2VhbWxlc3NBdWRpb0Zvcm1hdENoYW5nZShjb25zdCBzcDxBTWVzc2FnZT4gJnRhcmdldEZvcm1hdCkgY29uc3Q7CisgICAgdm9pZCByZW1lbWJlckNvZGVjU3BlY2lmaWNEYXRhKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KTsKKyAgICBib29sIGlzRGlzY29udGludWl0eVBlbmRpbmcoKSBjb25zdDsKKyAgICB2b2lkIGZpbmlzaEhhbmRsZURpc2NvbnRpbnVpdHkoYm9vbCBmbHVzaE9uVGltZUNoYW5nZSk7CisKKyAgICB2b2lkIG5vdGlmeVJlc3VtZUNvbXBsZXRlSWZOZWNlc3NhcnkoKTsKKworICAgIHZvaWQgb25SZWxlYXNlQ3J5cHRvKGNvbnN0IHNwPEFNZXNzYWdlPiYgbXNnKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERlY29kZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBOVVBMQVlFUjJfREVDT0RFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEZWNvZGVyQmFzZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXJCYXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzE5ODhmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEZWNvZGVyQmFzZS5jcHAKQEAgLTAsMCArMSwyMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTnVQbGF5ZXIyRGVjb2RlckJhc2UiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgIk51UGxheWVyMkRlY29kZXJCYXNlLmgiCisKKyNpbmNsdWRlICJOdVBsYXllcjJSZW5kZXJlci5oIgorCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK051UGxheWVyMjo6RGVjb2RlckJhc2U6OkRlY29kZXJCYXNlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5KQorICAgIDogIG1Ob3RpZnkobm90aWZ5KSwKKyAgICAgICBtQnVmZmVyR2VuZXJhdGlvbigwKSwKKyAgICAgICBtUGF1c2VkKGZhbHNlKSwKKyAgICAgICBtU3RhdHMobmV3IEFNZXNzYWdlKSwKKyAgICAgICBtUmVxdWVzdElucHV0QnVmZmVyc1BlbmRpbmcoZmFsc2UpIHsKKyAgICAvLyBFdmVyeSBkZWNvZGVyIGhhcyBpdHMgb3duIGxvb3BlciBiZWNhdXNlIE1lZGlhQ29kZWMgb3BlcmF0aW9ucworICAgIC8vIGFyZSBibG9ja2luZywgYnV0IE51UGxheWVyMiBuZWVkcyBhc3luY2hyb25vdXMgb3BlcmF0aW9ucy4KKyAgICBtRGVjb2Rlckxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgIG1EZWNvZGVyTG9vcGVyLT5zZXROYW1lKCJOUERlY29kZXIiKTsKKyAgICBtRGVjb2Rlckxvb3Blci0+c3RhcnQoZmFsc2UsIC8qIHJ1bk9uQ2FsbGluZ1RocmVhZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCAgLyogY2FuQ2FsbEphdmEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7Cit9CisKK051UGxheWVyMjo6RGVjb2RlckJhc2U6On5EZWNvZGVyQmFzZSgpIHsKKyAgICBzdG9wTG9vcGVyKCk7Cit9CisKK3N0YXRpYworc3RhdHVzX3QgUG9zdEFuZEF3YWl0UmVzcG9uc2UoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBzcDxBTWVzc2FnZT4gKnJlc3BvbnNlKSB7CisgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZShyZXNwb25zZSk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKCEoKnJlc3BvbnNlKS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSkgeworICAgICAgICBlcnIgPSBPSzsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCit2b2lkIE51UGxheWVyMjo6RGVjb2RlckJhc2U6OmNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDb25maWd1cmUsIHRoaXMpOworICAgIG1zZy0+c2V0TWVzc2FnZSgiZm9ybWF0IiwgZm9ybWF0KTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjI6OkRlY29kZXJCYXNlOjppbml0KCkgeworICAgIG1EZWNvZGVyTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIodGhpcyk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyQmFzZTo6c3RvcExvb3BlcigpIHsKKyAgICBtRGVjb2Rlckxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIoaWQoKSk7CisgICAgbURlY29kZXJMb29wZXItPnN0b3AoKTsKK30KKwordm9pZCBOdVBsYXllcjI6OkRlY29kZXJCYXNlOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmcGFyYW1zKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldFBhcmFtZXRlcnMsIHRoaXMpOworICAgIG1zZy0+c2V0TWVzc2FnZSgicGFyYW1zIiwgcGFyYW1zKTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjI6OkRlY29kZXJCYXNlOjpzZXRSZW5kZXJlcihjb25zdCBzcDxSZW5kZXJlcj4gJnJlbmRlcmVyKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldFJlbmRlcmVyLCB0aGlzKTsKKyAgICBtc2ctPnNldE9iamVjdCgicmVuZGVyZXIiLCByZW5kZXJlcik7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyQmFzZTo6cGF1c2UoKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFBhdXNlLCB0aGlzKTsKKworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICBQb3N0QW5kQXdhaXRSZXNwb25zZShtc2csICZyZXNwb25zZSk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyQmFzZTo6c2lnbmFsRmx1c2goKSB7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdEZsdXNoLCB0aGlzKSktPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjI6OkRlY29kZXJCYXNlOjpzaWduYWxSZXN1bWUoYm9vbCBub3RpZnlDb21wbGV0ZSkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZXN1bWUsIHRoaXMpOworICAgIG1zZy0+c2V0SW50MzIoIm5vdGlmeUNvbXBsZXRlIiwgbm90aWZ5Q29tcGxldGUpOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyMjo6RGVjb2RlckJhc2U6OmluaXRpYXRlU2h1dGRvd24oKSB7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFNodXRkb3duLCB0aGlzKSktPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjI6OkRlY29kZXJCYXNlOjpvblJlcXVlc3RJbnB1dEJ1ZmZlcnMoKSB7CisgICAgaWYgKG1SZXF1ZXN0SW5wdXRCdWZmZXJzUGVuZGluZykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gZG9SZXF1ZXN0QnVmZmVycygpIHJldHVybiB0cnVlIGlmIHdlIHNob3VsZCByZXF1ZXN0IG1vcmUgZGF0YQorICAgIGlmIChkb1JlcXVlc3RCdWZmZXJzKCkpIHsKKyAgICAgICAgbVJlcXVlc3RJbnB1dEJ1ZmZlcnNQZW5kaW5nID0gdHJ1ZTsKKworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVxdWVzdElucHV0QnVmZmVycywgdGhpcyk7CisgICAgICAgIG1zZy0+cG9zdCgxMCAqIDEwMDBsbCk7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6RGVjb2RlckJhc2U6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisKKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRDb25maWd1cmU6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJmb3JtYXQiLCAmZm9ybWF0KSk7CisgICAgICAgICAgICBvbkNvbmZpZ3VyZShmb3JtYXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0U2V0UGFyYW1ldGVyczoKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHBhcmFtczsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoInBhcmFtcyIsICZwYXJhbXMpKTsKKyAgICAgICAgICAgIG9uU2V0UGFyYW1ldGVycyhwYXJhbXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0U2V0UmVuZGVyZXI6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgicmVuZGVyZXIiLCAmb2JqKSk7CisgICAgICAgICAgICBvblNldFJlbmRlcmVyKHN0YXRpY19jYXN0PFJlbmRlcmVyICo+KG9iai5nZXQoKSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0UGF1c2U6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworCisgICAgICAgICAgICBtUGF1c2VkID0gdHJ1ZTsKKworICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSktPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFJlcXVlc3RJbnB1dEJ1ZmZlcnM6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1SZXF1ZXN0SW5wdXRCdWZmZXJzUGVuZGluZyA9IGZhbHNlOworICAgICAgICAgICAgb25SZXF1ZXN0SW5wdXRCdWZmZXJzKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRGbHVzaDoKKyAgICAgICAgeworICAgICAgICAgICAgb25GbHVzaCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0UmVzdW1lOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IG5vdGlmeUNvbXBsZXRlOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoIm5vdGlmeUNvbXBsZXRlIiwgJm5vdGlmeUNvbXBsZXRlKSk7CisKKyAgICAgICAgICAgIG9uUmVzdW1lKG5vdGlmeUNvbXBsZXRlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFNodXRkb3duOgorICAgICAgICB7CisgICAgICAgICAgICBvblNodXRkb3duKHRydWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OkRlY29kZXJCYXNlOjpoYW5kbGVFcnJvcihpbnQzMl90IGVycikKK3sKKyAgICAvLyBXZSBjYW5ub3QgaW1tZWRpYXRlbHkgcmVsZWFzZSB0aGUgY29kZWMgZHVlIHRvIGJ1ZmZlcnMgc3RpbGwgb3V0c3RhbmRpbmcKKyAgICAvLyBpbiB0aGUgcmVuZGVyZXIuICBXZSBzaWduYWwgdG8gdGhlIHBsYXllciB0aGUgZXJyb3Igc28gaXQgY2FuIHNodXRkb3duL3JlbGVhc2UgdGhlCisgICAgLy8gZGVjb2RlciBhZnRlciBmbHVzaGluZyBhbmQgaW5jcmVtZW50IHRoZSBnZW5lcmF0aW9uIHRvIGRpc2NhcmQgdW5uZWNlc3NhcnkgbWVzc2FnZXMuCisKKyAgICArK21CdWZmZXJHZW5lcmF0aW9uOworCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEVycm9yKTsKKyAgICBub3RpZnktPnNldEludDMyKCJlcnIiLCBlcnIpOworICAgIG5vdGlmeS0+cG9zdCgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXJCYXNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXJCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU1N2YwZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRGVjb2RlckJhc2UuaApAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBOVVBMQVlFUjJfREVDT0RFUl9CQVNFX0hfCisKKyNkZWZpbmUgTlVQTEFZRVIyX0RFQ09ERVJfQkFTRV9IXworCisjaW5jbHVkZSAiTnVQbGF5ZXIyLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFCdWZmZXI7CitzdHJ1Y3QgQU5hdGl2ZVdpbmRvd1dyYXBwZXI7CitzdHJ1Y3QgTWVkaWFDb2RlYzsKK2NsYXNzIE1lZGlhQnVmZmVyOworY2xhc3MgTWVkaWFDb2RlY0J1ZmZlcjsKKworc3RydWN0IE51UGxheWVyMjo6RGVjb2RlckJhc2UgOiBwdWJsaWMgQUhhbmRsZXIgeworICAgIGV4cGxpY2l0IERlY29kZXJCYXNlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5KTsKKworICAgIHZvaWQgY29uZmlndXJlKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KTsKKyAgICB2b2lkIGluaXQoKTsKKyAgICB2b2lkIHNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZwYXJhbXMpOworCisgICAgLy8gU3luY2hyb25vdXMgY2FsbCB0byBlbnN1cmUgZGVjb2RlciB3aWxsIG5vdCByZXF1ZXN0IG9yIHNlbmQgb3V0IGRhdGEuCisgICAgdm9pZCBwYXVzZSgpOworCisgICAgdm9pZCBzZXRSZW5kZXJlcihjb25zdCBzcDxSZW5kZXJlcj4gJnJlbmRlcmVyKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxBTmF0aXZlV2luZG93V3JhcHBlcj4gJikgeyByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047IH0KKworICAgIHZvaWQgc2lnbmFsRmx1c2goKTsKKyAgICB2b2lkIHNpZ25hbFJlc3VtZShib29sIG5vdGlmeUNvbXBsZXRlKTsKKyAgICB2b2lkIGluaXRpYXRlU2h1dGRvd24oKTsKKworICAgIHZpcnR1YWwgc3A8QU1lc3NhZ2U+IGdldFN0YXRzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVN0YXRzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUNyeXB0bygpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGVudW0geworICAgICAgICBrV2hhdElucHV0RGlzY29udGludWl0eSAgPSAnaW5EaScsCisgICAgICAgIGtXaGF0VmlkZW9TaXplQ2hhbmdlZCAgICA9ICd2aVNDJywKKyAgICAgICAga1doYXRGbHVzaENvbXBsZXRlZCAgICAgID0gJ2Zsc0MnLAorICAgICAgICBrV2hhdFNodXRkb3duQ29tcGxldGVkICAgPSAnc2hEQycsCisgICAgICAgIGtXaGF0UmVzdW1lQ29tcGxldGVkICAgICA9ICdyZXNDJywKKyAgICAgICAga1doYXRFT1MgICAgICAgICAgICAgICAgID0gJ2VvcyAnLAorICAgICAgICBrV2hhdEVycm9yICAgICAgICAgICAgICAgPSAnZXJyICcsCisgICAgfTsKKworcHJvdGVjdGVkOgorCisgICAgdmlydHVhbCB+RGVjb2RlckJhc2UoKTsKKworICAgIHZvaWQgc3RvcExvb3BlcigpOworCisgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKworICAgIHZpcnR1YWwgdm9pZCBvbkNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBvblNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZwYXJhbXMpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgb25TZXRSZW5kZXJlcihjb25zdCBzcDxSZW5kZXJlcj4gJnJlbmRlcmVyKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIG9uUmVzdW1lKGJvb2wgbm90aWZ5Q29tcGxldGUpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgb25GbHVzaCgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgb25TaHV0ZG93bihib29sIG5vdGlmeUNvbXBsZXRlKSA9IDA7CisKKyAgICB2b2lkIG9uUmVxdWVzdElucHV0QnVmZmVycygpOworICAgIHZpcnR1YWwgYm9vbCBkb1JlcXVlc3RCdWZmZXJzKCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBoYW5kbGVFcnJvcihpbnQzMl90IGVycik7CisKKyAgICBzcDxBTWVzc2FnZT4gbU5vdGlmeTsKKyAgICBpbnQzMl90IG1CdWZmZXJHZW5lcmF0aW9uOworICAgIGJvb2wgbVBhdXNlZDsKKyAgICBzcDxBTWVzc2FnZT4gbVN0YXRzOworCitwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrV2hhdENvbmZpZ3VyZSAgICAgICAgICAgPSAnY29uZicsCisgICAgICAgIGtXaGF0U2V0UGFyYW1ldGVycyAgICAgICA9ICdzZXRQJywKKyAgICAgICAga1doYXRTZXRSZW5kZXJlciAgICAgICAgID0gJ3NldFInLAorICAgICAgICBrV2hhdFBhdXNlICAgICAgICAgICAgICAgPSAncGF1cycsCisgICAgICAgIGtXaGF0UmVxdWVzdElucHV0QnVmZmVycyA9ICdyZXFCJywKKyAgICAgICAga1doYXRGbHVzaCAgICAgICAgICAgICAgID0gJ2ZsdXMnLAorICAgICAgICBrV2hhdFNodXRkb3duICAgICAgICAgICAgPSAnc2h1RCcsCisgICAgfTsKKworICAgIHNwPEFMb29wZXI+IG1EZWNvZGVyTG9vcGVyOworICAgIGJvb2wgbVJlcXVlc3RJbnB1dEJ1ZmZlcnNQZW5kaW5nOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRGVjb2RlckJhc2UpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBOVVBMQVlFUjJfREVDT0RFUl9CQVNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXJQYXNzVGhyb3VnaC5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXJQYXNzVGhyb3VnaC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUwYzFkOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRGVjb2RlclBhc3NUaHJvdWdoLmNwcApAQCAtMCwwICsxLDQzNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJOdVBsYXllcjJEZWNvZGVyUGFzc1Rocm91Z2giCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgIk51UGxheWVyMkRlY29kZXJQYXNzVGhyb3VnaC5oIgorCisjaW5jbHVkZSAiTnVQbGF5ZXIyUmVuZGVyZXIuaCIKKyNpbmNsdWRlICJOdVBsYXllcjJTb3VyY2UuaCIKKworI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorCisjaW5jbHVkZSAiQVRTUGFyc2VyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gVE9ETyBvcHRpbWl6ZSBidWZmZXIgc2l6ZSBmb3IgcG93ZXIgY29uc3VtcHRpb24KKy8vIFRoZSBvZmZsb2FkIHJlYWQgYnVmZmVyIHNpemUgaXMgMzIgS0IgYnV0IDI0IEtCIHVzZXMgbGVzcyBwb3dlci4KK3N0YXRpYyBjb25zdCBzaXplX3Qga0FnZ3JlZ2F0ZUJ1ZmZlclNpemVCeXRlcyA9IDI0ICogMTAyNDsKK3N0YXRpYyBjb25zdCBzaXplX3Qga01heENhY2hlZEJ5dGVzID0gMjAwMDAwOworCitOdVBsYXllcjI6OkRlY29kZXJQYXNzVGhyb3VnaDo6RGVjb2RlclBhc3NUaHJvdWdoKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKKyAgICAgICAgY29uc3Qgc3A8U291cmNlPiAmc291cmNlLAorICAgICAgICBjb25zdCBzcDxSZW5kZXJlcj4gJnJlbmRlcmVyKQorICAgIDogRGVjb2RlckJhc2Uobm90aWZ5KSwKKyAgICAgIG1Tb3VyY2Uoc291cmNlKSwKKyAgICAgIG1SZW5kZXJlcihyZW5kZXJlciksCisgICAgICBtU2tpcFJlbmRlcmluZ1VudGlsTWVkaWFUaW1lVXMoLTFsbCksCisgICAgICBtUmVhY2hlZEVPUyh0cnVlKSwKKyAgICAgIG1QZW5kaW5nQXVkaW9FcnIoT0spLAorICAgICAgbVBlbmRpbmdCdWZmZXJzVG9EcmFpbigwKSwKKyAgICAgIG1DYWNoZWRCeXRlcygwKSwKKyAgICAgIG1Db21wb25lbnROYW1lKCJwYXNzIHRocm91Z2ggZGVjb2RlciIpIHsKKyAgICBBTE9HV19JRihyZW5kZXJlciA9PSBOVUxMLCAiZXhwZWN0IGEgbm9uLU5VTEwgcmVuZGVyZXIiKTsKK30KKworTnVQbGF5ZXIyOjpEZWNvZGVyUGFzc1Rocm91Z2g6On5EZWNvZGVyUGFzc1Rocm91Z2goKSB7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyUGFzc1Rocm91Z2g6Om9uQ29uZmlndXJlKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7CisgICAgQUxPR1YoIlslc10gb25Db25maWd1cmUiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICBtQ2FjaGVkQnl0ZXMgPSAwOworICAgIG1QZW5kaW5nQnVmZmVyc1RvRHJhaW4gPSAwOworICAgIG1SZWFjaGVkRU9TID0gZmFsc2U7CisgICAgKyttQnVmZmVyR2VuZXJhdGlvbjsKKworICAgIG9uUmVxdWVzdElucHV0QnVmZmVycygpOworCisgICAgaW50MzJfdCBoYXNWaWRlbyA9IDA7CisgICAgZm9ybWF0LT5maW5kSW50MzIoImhhcy12aWRlbyIsICZoYXNWaWRlbyk7CisKKyAgICAvLyBUaGUgYXVkaW8gc2luayBpcyBhbHJlYWR5IG9wZW5lZCBiZWZvcmUgdGhlIFBhc3NUaHJvdWdoIGRlY29kZXIgaXMgY3JlYXRlZC4KKyAgICAvLyBPcGVuaW5nIGFnYWluIG1pZ2h0IGJlIHJlbGV2YW50IGlmIGRlY29kZXIgaXMgaW5zdGFudGlhdGVkIGFmdGVyIHNodXRkb3duIGFuZAorICAgIC8vIGZvcm1hdCBpcyBkaWZmZXJlbnQuCisgICAgc3RhdHVzX3QgZXJyID0gbVJlbmRlcmVyLT5vcGVuQXVkaW9TaW5rKAorICAgICAgICAgICAgZm9ybWF0LCB0cnVlIC8qIG9mZmxvYWRPbmx5ICovLCBoYXNWaWRlbywKKyAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUgLyogZmxhZ3MgKi8sIE5VTEwgLyogaXNPZmZsb2FkZWQgKi8sIG1Tb3VyY2UtPmlzU3RyZWFtaW5nKCkpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgaGFuZGxlRXJyb3IoZXJyKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyUGFzc1Rocm91Z2g6Om9uU2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJi8qcGFyYW1zKi8pIHsKKyAgICBBTE9HVygib25TZXRQYXJhbWV0ZXJzKCkgY2FsbGVkIHVuZXhwZWN0ZWRseSIpOworfQorCit2b2lkIE51UGxheWVyMjo6RGVjb2RlclBhc3NUaHJvdWdoOjpvblNldFJlbmRlcmVyKAorICAgICAgICBjb25zdCBzcDxSZW5kZXJlcj4gJnJlbmRlcmVyKSB7CisgICAgLy8gcmVuZGVyZXIgY2FuJ3QgYmUgY2hhbmdlZCBkdXJpbmcgb2ZmbG9hZGluZworICAgIEFMT0dXX0lGKHJlbmRlcmVyICE9IG1SZW5kZXJlciwKKyAgICAgICAgICAgICJpZ25vcmluZyByZXF1ZXN0IHRvIGNoYW5nZSByZW5kZXJlciIpOworfQorCitib29sIE51UGxheWVyMjo6RGVjb2RlclBhc3NUaHJvdWdoOjppc1N0YWxlUmVwbHkoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBpbnQzMl90IGdlbmVyYXRpb247CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOworICAgIHJldHVybiBnZW5lcmF0aW9uICE9IG1CdWZmZXJHZW5lcmF0aW9uOworfQorCitib29sIE51UGxheWVyMjo6RGVjb2RlclBhc3NUaHJvdWdoOjppc0RvbmVGZXRjaGluZygpIGNvbnN0IHsKKyAgICBBTE9HVigiWyVzXSBtQ2FjaGVkQnl0ZXMgPSAlenUsIG1SZWFjaGVkRU9TID0gJWQgbVBhdXNlZCA9ICVkIiwKKyAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIG1DYWNoZWRCeXRlcywgbVJlYWNoZWRFT1MsIG1QYXVzZWQpOworCisgICAgcmV0dXJuIG1DYWNoZWRCeXRlcyA+PSBrTWF4Q2FjaGVkQnl0ZXMgfHwgbVJlYWNoZWRFT1MgfHwgbVBhdXNlZDsKK30KKworLyoKKyAqIHJldHVybnMgdHJ1ZSBpZiB3ZSBzaG91bGQgcmVxdWVzdCBtb3JlIGRhdGEKKyAqLworYm9vbCBOdVBsYXllcjI6OkRlY29kZXJQYXNzVGhyb3VnaDo6ZG9SZXF1ZXN0QnVmZmVycygpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICB3aGlsZSAoIWlzRG9uZUZldGNoaW5nKCkpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgpOworCisgICAgICAgIGVyciA9IGZldGNoSW5wdXREYXRhKG1zZyk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgb25JbnB1dEJ1ZmZlckZldGNoZWQobXNnKTsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyID09IC1FV09VTERCTE9DSworICAgICAgICAgICAgJiYgbVNvdXJjZS0+ZmVlZE1vcmVUU0RhdGEoKSA9PSBPSzsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpEZWNvZGVyUGFzc1Rocm91Z2g6OmRlcXVldWVBY2Nlc3NVbml0KHNwPEFCdWZmZXI+ICphY2Nlc3NVbml0KSB7CisgICAgc3RhdHVzX3QgZXJyOworCisgICAgLy8gRGlkIHdlIHNhdmUgYW4gYWNjZXNzVW5pdCBlYXJsaWVyIGJlY2F1c2Ugb2YgYSBkaXNjb250aW51aXR5PworICAgIGlmIChtUGVuZGluZ0F1ZGlvQWNjZXNzVW5pdCAhPSBOVUxMKSB7CisgICAgICAgICphY2Nlc3NVbml0ID0gbVBlbmRpbmdBdWRpb0FjY2Vzc1VuaXQ7CisgICAgICAgIG1QZW5kaW5nQXVkaW9BY2Nlc3NVbml0LmNsZWFyKCk7CisgICAgICAgIGVyciA9IG1QZW5kaW5nQXVkaW9FcnI7CisgICAgICAgIEFMT0dWKCJmZWVkRGVjb2RlcklucHV0RGF0YSgpIHVzZSBtUGVuZGluZ0F1ZGlvQWNjZXNzVW5pdCIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGVyciA9IG1Tb3VyY2UtPmRlcXVldWVBY2Nlc3NVbml0KHRydWUgLyogYXVkaW8gKi8sIGFjY2Vzc1VuaXQpOworICAgIH0KKworICAgIGlmIChlcnIgPT0gSU5GT19ESVNDT05USU5VSVRZIHx8IGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIGlmIChtQWdncmVnYXRlQnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8vIFdlIGFscmVhZHkgaGF2ZSBzb21lIGRhdGEgc28gc2F2ZSB0aGlzIGZvciBsYXRlci4KKyAgICAgICAgICAgIG1QZW5kaW5nQXVkaW9FcnIgPSBlcnI7CisgICAgICAgICAgICBtUGVuZGluZ0F1ZGlvQWNjZXNzVW5pdCA9ICphY2Nlc3NVbml0OworICAgICAgICAgICAgKCphY2Nlc3NVbml0KS5jbGVhcigpOworICAgICAgICAgICAgQUxPR0QoInJldHVybiBhZ2dyZWdhdGVkIGJ1ZmZlciBhbmQgc2F2ZSBlcnIoPSVkKSBmb3IgbGF0ZXIiLCBlcnIpOworICAgICAgICAgICAgZXJyID0gT0s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCitzcDxBQnVmZmVyPiBOdVBsYXllcjI6OkRlY29kZXJQYXNzVGhyb3VnaDo6YWdncmVnYXRlQnVmZmVyKAorICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCkgeworICAgIHNwPEFCdWZmZXI+IGFnZ3JlZ2F0ZTsKKworICAgIGlmIChhY2Nlc3NVbml0ID09IE5VTEwpIHsKKyAgICAgICAgLy8gYWNjZXNzVW5pdCBpcyBzYXZlZCB0byBtUGVuZGluZ0F1ZGlvQWNjZXNzVW5pdAorICAgICAgICAvLyByZXR1cm4gY3VycmVudCBtQWdncmVnYXRlQnVmZmVyCisgICAgICAgIGFnZ3JlZ2F0ZSA9IG1BZ2dyZWdhdGVCdWZmZXI7CisgICAgICAgIG1BZ2dyZWdhdGVCdWZmZXIuY2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIGFnZ3JlZ2F0ZTsKKyAgICB9CisKKyAgICBzaXplX3Qgc21hbGxTaXplID0gYWNjZXNzVW5pdC0+c2l6ZSgpOworICAgIGlmICgobUFnZ3JlZ2F0ZUJ1ZmZlciA9PSBOVUxMKQorICAgICAgICAgICAgLy8gRG9uJ3QgYm90aGVyIGlmIG9ubHkgcm9vbSBmb3IgYSBmZXcgc21hbGwgYnVmZmVycy4KKyAgICAgICAgICAgICYmIChzbWFsbFNpemUgPCAoa0FnZ3JlZ2F0ZUJ1ZmZlclNpemVCeXRlcyAvIDMpKSkgeworICAgICAgICAvLyBDcmVhdGUgYSBsYXJnZXIgYnVmZmVyIGZvciBjb21iaW5pbmcgc21hbGxlciBidWZmZXJzIGZyb20gdGhlIGV4dHJhY3Rvci4KKyAgICAgICAgbUFnZ3JlZ2F0ZUJ1ZmZlciA9IG5ldyBBQnVmZmVyKGtBZ2dyZWdhdGVCdWZmZXJTaXplQnl0ZXMpOworICAgICAgICBtQWdncmVnYXRlQnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsgLy8gc3RhcnQgZW1wdHkKKyAgICB9CisKKyAgICBpZiAobUFnZ3JlZ2F0ZUJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICBpbnQ2NF90IGR1bW15OworICAgICAgICBib29sIHNtYWxsVGltZXN0YW1wVmFsaWQgPSBhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcyk7CisgICAgICAgIGJvb2wgYmlnVGltZXN0YW1wVmFsaWQgPSBtQWdncmVnYXRlQnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJmR1bW15KTsKKyAgICAgICAgLy8gV2lsbCB0aGUgc21hbGxlciBidWZmZXIgZml0PworICAgICAgICBzaXplX3QgYmlnU2l6ZSA9IG1BZ2dyZWdhdGVCdWZmZXItPnNpemUoKTsKKyAgICAgICAgc2l6ZV90IHJvb21MZWZ0ID0gbUFnZ3JlZ2F0ZUJ1ZmZlci0+Y2FwYWNpdHkoKSAtIGJpZ1NpemU7CisgICAgICAgIC8vIFNob3VsZCB3ZSBzYXZlIHRoaXMgc21hbGwgYnVmZmVyIGZvciB0aGUgbmV4dCBiaWcgYnVmZmVyPworICAgICAgICAvLyBJZiB0aGUgZmlyc3Qgc21hbGwgYnVmZmVyIGRpZCBub3QgaGF2ZSBhIHRpbWVzdGFtcCB0aGVuIHNhdmUKKyAgICAgICAgLy8gYW55IGJ1ZmZlciB0aGF0IGRvZXMgaGF2ZSBhIHRpbWVzdGFtcCB1bnRpbCB0aGUgbmV4dCBiaWcgYnVmZmVyLgorICAgICAgICBpZiAoKHNtYWxsU2l6ZSA+IHJvb21MZWZ0KQorICAgICAgICAgICAgfHwgKCFiaWdUaW1lc3RhbXBWYWxpZCAmJiAoYmlnU2l6ZSA+IDApICYmIHNtYWxsVGltZXN0YW1wVmFsaWQpKSB7CisgICAgICAgICAgICBtUGVuZGluZ0F1ZGlvRXJyID0gT0s7CisgICAgICAgICAgICBtUGVuZGluZ0F1ZGlvQWNjZXNzVW5pdCA9IGFjY2Vzc1VuaXQ7CisgICAgICAgICAgICBhZ2dyZWdhdGUgPSBtQWdncmVnYXRlQnVmZmVyOworICAgICAgICAgICAgbUFnZ3JlZ2F0ZUJ1ZmZlci5jbGVhcigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gR3JhYiB0aW1lIGZyb20gZmlyc3Qgc21hbGwgYnVmZmVyIGlmIGF2YWlsYWJsZS4KKyAgICAgICAgICAgIGlmICgoYmlnU2l6ZSA9PSAwKSAmJiBzbWFsbFRpbWVzdGFtcFZhbGlkKSB7CisgICAgICAgICAgICAgICAgbUFnZ3JlZ2F0ZUJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEFwcGVuZCBzbWFsbCBidWZmZXIgdG8gdGhlIGJpZ2dlciBidWZmZXIuCisgICAgICAgICAgICBtZW1jcHkobUFnZ3JlZ2F0ZUJ1ZmZlci0+YmFzZSgpICsgYmlnU2l6ZSwgYWNjZXNzVW5pdC0+ZGF0YSgpLCBzbWFsbFNpemUpOworICAgICAgICAgICAgYmlnU2l6ZSArPSBzbWFsbFNpemU7CisgICAgICAgICAgICBtQWdncmVnYXRlQnVmZmVyLT5zZXRSYW5nZSgwLCBiaWdTaXplKTsKKworICAgICAgICAgICAgQUxPR1YoImZlZWREZWNvZGVySW5wdXREYXRhKCkgc21hbGxTaXplID0gJXp1LCBiaWdTaXplID0gJXp1LCBjYXBhY2l0eSA9ICV6dSIsCisgICAgICAgICAgICAgICAgICAgIHNtYWxsU2l6ZSwgYmlnU2l6ZSwgbUFnZ3JlZ2F0ZUJ1ZmZlci0+Y2FwYWNpdHkoKSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBkZWNpZGVkIG5vdCB0byBhZ2dyZWdhdGUKKyAgICAgICAgYWdncmVnYXRlID0gYWNjZXNzVW5pdDsKKyAgICB9CisKKyAgICByZXR1cm4gYWdncmVnYXRlOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OkRlY29kZXJQYXNzVGhyb3VnaDo6ZmV0Y2hJbnB1dERhdGEoc3A8QU1lc3NhZ2U+ICZyZXBseSkgeworICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQ7CisKKyAgICBkbyB7CisgICAgICAgIHN0YXR1c190IGVyciA9IGRlcXVldWVBY2Nlc3NVbml0KCZhY2Nlc3NVbml0KTsKKworICAgICAgICBpZiAoZXJyID09IC1FV09VTERCTE9DSykgeworICAgICAgICAgICAgLy8gRmx1c2ggb3V0IHRoZSBhZ2dyZWdhdGUgYnVmZmVyIHRvIHRyeSB0byBhdm9pZCB1bmRlcnJ1bi4KKyAgICAgICAgICAgIGFjY2Vzc1VuaXQgPSBhZ2dyZWdhdGVCdWZmZXIoTlVMTCAvKiBhY2Nlc3NVbml0ICovKTsKKyAgICAgICAgICAgIGlmIChhY2Nlc3NVbml0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0gZWxzZSBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBpZiAoZXJyID09IElORk9fRElTQ09OVElOVUlUWSkgeworICAgICAgICAgICAgICAgIGludDMyX3QgdHlwZTsKKyAgICAgICAgICAgICAgICBDSEVDSyhhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQzMigiZGlzY29udGludWl0eSIsICZ0eXBlKSk7CisKKyAgICAgICAgICAgICAgICBib29sIGZvcm1hdENoYW5nZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAodHlwZSAmIEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9BVURJT19GT1JNQVQpICE9IDA7CisKKyAgICAgICAgICAgICAgICBib29sIHRpbWVDaGFuZ2UgPQorICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGUgJiBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfVElNRSkgIT0gMDsKKworICAgICAgICAgICAgICAgIEFMT0dJKCJhdWRpbyBkaXNjb250aW51aXR5IChmb3JtYXRDaGFuZ2U9JWQsIHRpbWU9JWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdENoYW5nZSwgdGltZUNoYW5nZSk7CisKKyAgICAgICAgICAgICAgICBpZiAoZm9ybWF0Q2hhbmdlIHx8IHRpbWVDaGFuZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1Ob3RpZnktPmR1cCgpOworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJ3aGF0Iiwga1doYXRJbnB1dERpc2NvbnRpbnVpdHkpOworICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIHBlcmZvcm0gc2VhbWxlc3MgZm9ybWF0IGNoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgLy8gb25seSBub3RpZnkgTnVQbGF5ZXIyIHRvIHNjYW4gc291cmNlcworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJmb3JtYXRDaGFuZ2UiLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+cG9zdCgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aW1lQ2hhbmdlKSB7CisgICAgICAgICAgICAgICAgICAgIGRvRmx1c2goZmFsc2UgLyogbm90aWZ5Q29tcGxldGUgKi8pOworICAgICAgICAgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdENoYW5nZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBkbyBzZWFtbGVzcyBmb3JtYXQgY2hhbmdlCisgICAgICAgICAgICAgICAgICAgIGVyciA9IE9LOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgc3RyZWFtIGlzIHVuYWZmZWN0ZWQgYnkgdGhlIGRpc2NvbnRpbnVpdHkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FV09VTERCTE9DSzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlcGx5LT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorCisgICAgICAgIGFjY2Vzc1VuaXQgPSBhZ2dyZWdhdGVCdWZmZXIoYWNjZXNzVW5pdCk7CisgICAgfSB3aGlsZSAoYWNjZXNzVW5pdCA9PSBOVUxMKTsKKworI2lmIDAKKyAgICBpbnQ2NF90IG1lZGlhVGltZVVzOworICAgIENIRUNLKGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbWVkaWFUaW1lVXMpKTsKKyAgICBBTE9HVigiZmVlZGluZyBhdWRpbyBpbnB1dCBidWZmZXIgYXQgbWVkaWEgdGltZSAlLjJmIHNlY3MiLAorICAgICAgICAgbWVkaWFUaW1lVXMgLyAxRTYpOworI2VuZGlmCisKKyAgICByZXBseS0+c2V0QnVmZmVyKCJidWZmZXIiLCBhY2Nlc3NVbml0KTsKKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBOdVBsYXllcjI6OkRlY29kZXJQYXNzVGhyb3VnaDo6b25JbnB1dEJ1ZmZlckZldGNoZWQoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgaWYgKG1SZWFjaGVkRU9TKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzcDxBQnVmZmVyPiBidWZmZXI7CisgICAgYm9vbCBoYXNCdWZmZXIgPSBtc2ctPmZpbmRCdWZmZXIoImJ1ZmZlciIsICZidWZmZXIpOworICAgIGlmIChidWZmZXIgPT0gTlVMTCkgeworICAgICAgICBpbnQzMl90IHN0cmVhbUVyciA9IEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJlcnIiLCAmc3RyZWFtRXJyKSB8fCAhaGFzQnVmZmVyKTsKKyAgICAgICAgaWYgKHN0cmVhbUVyciA9PSBPSykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0cmVhbUVyciAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICBoYW5kbGVFcnJvcihzdHJlYW1FcnIpOworICAgICAgICB9CisgICAgICAgIG1SZWFjaGVkRU9TID0gdHJ1ZTsKKyAgICAgICAgaWYgKG1SZW5kZXJlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBtUmVuZGVyZXItPnF1ZXVlRU9TKHRydWUgLyogYXVkaW8gKi8sIEVSUk9SX0VORF9PRl9TVFJFQU0pOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gZXh0cmE7CisgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kTWVzc2FnZSgiZXh0cmEiLCAmZXh0cmEpICYmIGV4dHJhICE9IE5VTEwpIHsKKyAgICAgICAgaW50NjRfdCByZXN1bWVBdE1lZGlhVGltZVVzOworICAgICAgICBpZiAoZXh0cmEtPmZpbmRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAgInJlc3VtZS1hdC1tZWRpYXRpbWVVcyIsICZyZXN1bWVBdE1lZGlhVGltZVVzKSkgeworICAgICAgICAgICAgQUxPR0koIlslc10gc3VwcHJlc3NpbmcgcmVuZGVyaW5nIHVudGlsICVsbGQgdXMiLAorICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCAobG9uZyBsb25nKXJlc3VtZUF0TWVkaWFUaW1lVXMpOworICAgICAgICAgICAgbVNraXBSZW5kZXJpbmdVbnRpbE1lZGlhVGltZVVzID0gcmVzdW1lQXRNZWRpYVRpbWVVczsKKyAgICAgICAgfQorICAgIH0KKworICAgIGludDMyX3QgYnVmZmVyU2l6ZSA9IGJ1ZmZlci0+c2l6ZSgpOworICAgIG1DYWNoZWRCeXRlcyArPSBidWZmZXJTaXplOworCisgICAgaW50NjRfdCB0aW1lVXMgPSAwOworICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKKyAgICBpZiAobVNraXBSZW5kZXJpbmdVbnRpbE1lZGlhVGltZVVzID49IDApIHsKKyAgICAgICAgaWYgKHRpbWVVcyA8IG1Ta2lwUmVuZGVyaW5nVW50aWxNZWRpYVRpbWVVcykgeworICAgICAgICAgICAgQUxPR1YoIlslc10gZHJvcHBpbmcgYnVmZmVyIGF0IHRpbWUgJWxsZCBhcyByZXF1ZXN0ZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIChsb25nIGxvbmcpdGltZVVzKTsKKworICAgICAgICAgICAgb25CdWZmZXJDb25zdW1lZChidWZmZXJTaXplKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1Ta2lwUmVuZGVyaW5nVW50aWxNZWRpYVRpbWVVcyA9IC0xOworICAgIH0KKworICAgIGlmIChtUmVuZGVyZXIgPT0gTlVMTCkgeworICAgICAgICBvbkJ1ZmZlckNvbnN1bWVkKGJ1ZmZlclNpemUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKGtXaGF0QnVmZmVyQ29uc3VtZWQsIHRoaXMpOworICAgIHJlcGx5LT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1CdWZmZXJHZW5lcmF0aW9uKTsKKyAgICByZXBseS0+c2V0SW50MzIoInNpemUiLCBidWZmZXJTaXplKTsKKworICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IG1jQnVmZmVyID0gbmV3IE1lZGlhQ29kZWNCdWZmZXIobnVsbHB0ciwgYnVmZmVyKTsKKyAgICBtY0J1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKKworICAgIG1SZW5kZXJlci0+cXVldWVCdWZmZXIodHJ1ZSAvKiBhdWRpbyAqLywgbWNCdWZmZXIsIHJlcGx5KTsKKworICAgICsrbVBlbmRpbmdCdWZmZXJzVG9EcmFpbjsKKyAgICBBTE9HVigib25JbnB1dEJ1ZmZlckZpbGxlZDogI1RvRHJhaW4gPSAlenUsIGNhY2hlZEJ5dGVzID0gJXp1IiwKKyAgICAgICAgICAgIG1QZW5kaW5nQnVmZmVyc1RvRHJhaW4sIG1DYWNoZWRCeXRlcyk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyUGFzc1Rocm91Z2g6Om9uQnVmZmVyQ29uc3VtZWQoaW50MzJfdCBzaXplKSB7CisgICAgLS1tUGVuZGluZ0J1ZmZlcnNUb0RyYWluOworICAgIG1DYWNoZWRCeXRlcyAtPSBzaXplOworICAgIEFMT0dWKCJvbkJ1ZmZlckNvbnN1bWVkOiAjVG9EcmFpbiA9ICV6dSwgY2FjaGVkQnl0ZXMgPSAlenUiLAorICAgICAgICAgICAgbVBlbmRpbmdCdWZmZXJzVG9EcmFpbiwgbUNhY2hlZEJ5dGVzKTsKKyAgICBvblJlcXVlc3RJbnB1dEJ1ZmZlcnMoKTsKK30KKwordm9pZCBOdVBsYXllcjI6OkRlY29kZXJQYXNzVGhyb3VnaDo6b25SZXN1bWUoYm9vbCBub3RpZnlDb21wbGV0ZSkgeworICAgIG1QYXVzZWQgPSBmYWxzZTsKKworICAgIG9uUmVxdWVzdElucHV0QnVmZmVycygpOworCisgICAgaWYgKG5vdGlmeUNvbXBsZXRlKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0UmVzdW1lQ29tcGxldGVkKTsKKyAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6RGVjb2RlclBhc3NUaHJvdWdoOjpkb0ZsdXNoKGJvb2wgbm90aWZ5Q29tcGxldGUpIHsKKyAgICArK21CdWZmZXJHZW5lcmF0aW9uOworICAgIG1Ta2lwUmVuZGVyaW5nVW50aWxNZWRpYVRpbWVVcyA9IC0xOworICAgIG1QZW5kaW5nQXVkaW9BY2Nlc3NVbml0LmNsZWFyKCk7CisgICAgbVBlbmRpbmdBdWRpb0VyciA9IE9LOworICAgIG1BZ2dyZWdhdGVCdWZmZXIuY2xlYXIoKTsKKworICAgIGlmIChtUmVuZGVyZXIgIT0gTlVMTCkgeworICAgICAgICBtUmVuZGVyZXItPmZsdXNoKHRydWUgLyogYXVkaW8gKi8sIG5vdGlmeUNvbXBsZXRlKTsKKyAgICAgICAgbVJlbmRlcmVyLT5zaWduYWxUaW1lRGlzY29udGludWl0eSgpOworICAgIH0KKworICAgIG1QZW5kaW5nQnVmZmVyc1RvRHJhaW4gPSAwOworICAgIG1DYWNoZWRCeXRlcyA9IDA7CisgICAgbVJlYWNoZWRFT1MgPSBmYWxzZTsKK30KKwordm9pZCBOdVBsYXllcjI6OkRlY29kZXJQYXNzVGhyb3VnaDo6b25GbHVzaCgpIHsKKyAgICBkb0ZsdXNoKHRydWUgLyogbm90aWZ5Q29tcGxldGUgKi8pOworCisgICAgbVBhdXNlZCA9IHRydWU7CisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEZsdXNoQ29tcGxldGVkKTsKKyAgICBub3RpZnktPnBvc3QoKTsKKworfQorCit2b2lkIE51UGxheWVyMjo6RGVjb2RlclBhc3NUaHJvdWdoOjpvblNodXRkb3duKGJvb2wgbm90aWZ5Q29tcGxldGUpIHsKKyAgICArK21CdWZmZXJHZW5lcmF0aW9uOworICAgIG1Ta2lwUmVuZGVyaW5nVW50aWxNZWRpYVRpbWVVcyA9IC0xOworCisgICAgaWYgKG5vdGlmeUNvbXBsZXRlKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0U2h1dGRvd25Db21wbGV0ZWQpOworICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICB9CisKKyAgICBtUmVhY2hlZEVPUyA9IHRydWU7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyUGFzc1Rocm91Z2g6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgQUxPR1YoIlslc10gb25NZXNzYWdlOiAlcyIsIG1Db21wb25lbnROYW1lLmNfc3RyKCksCisgICAgICAgICAgICBtc2ctPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisKKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRCdWZmZXJDb25zdW1lZDoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFpc1N0YWxlUmVwbHkobXNnKSkgeworICAgICAgICAgICAgICAgIGludDMyX3Qgc2l6ZTsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigic2l6ZSIsICZzaXplKSk7CisgICAgICAgICAgICAgICAgb25CdWZmZXJDb25zdW1lZChzaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIERlY29kZXJCYXNlOjpvbk1lc3NhZ2VSZWNlaXZlZChtc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEZWNvZGVyUGFzc1Rocm91Z2guaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRGVjb2RlclBhc3NUaHJvdWdoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM4YzYwYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRGVjb2RlclBhc3NUaHJvdWdoLmgKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBOVVBMQVlFUjJfREVDT0RFUl9QQVNTX1RIUk9VR0hfSF8KKworI2RlZmluZSBOVVBMQVlFUjJfREVDT0RFUl9QQVNTX1RIUk9VR0hfSF8KKworI2luY2x1ZGUgIk51UGxheWVyMi5oIgorCisjaW5jbHVkZSAiTnVQbGF5ZXIyRGVjb2RlckJhc2UuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgTnVQbGF5ZXIyOjpEZWNvZGVyUGFzc1Rocm91Z2ggOiBwdWJsaWMgRGVjb2RlckJhc2UgeworICAgIERlY29kZXJQYXNzVGhyb3VnaChjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8U291cmNlPiAmc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxSZW5kZXJlcj4gJnJlbmRlcmVyKTsKKworcHJvdGVjdGVkOgorCisgICAgdmlydHVhbCB+RGVjb2RlclBhc3NUaHJvdWdoKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworCisgICAgdmlydHVhbCB2b2lkIG9uQ29uZmlndXJlKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KTsKKyAgICB2aXJ0dWFsIHZvaWQgb25TZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmcGFyYW1zKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25TZXRSZW5kZXJlcihjb25zdCBzcDxSZW5kZXJlcj4gJnJlbmRlcmVyKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25SZXN1bWUoYm9vbCBub3RpZnlDb21wbGV0ZSk7CisgICAgdmlydHVhbCB2b2lkIG9uRmx1c2goKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25TaHV0ZG93bihib29sIG5vdGlmeUNvbXBsZXRlKTsKKyAgICB2aXJ0dWFsIGJvb2wgZG9SZXF1ZXN0QnVmZmVycygpOworCitwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrV2hhdEJ1ZmZlckNvbnN1bWVkICAgICA9ICdidWZDJywKKyAgICB9OworCisgICAgc3A8U291cmNlPiBtU291cmNlOworICAgIHNwPFJlbmRlcmVyPiBtUmVuZGVyZXI7CisgICAgaW50NjRfdCBtU2tpcFJlbmRlcmluZ1VudGlsTWVkaWFUaW1lVXM7CisKKyAgICBib29sICAgIG1SZWFjaGVkRU9TOworCisgICAgLy8gVXNlZCBieSBmZWVkRGVjb2RlcklucHV0RGF0YSB0byBhZ2dyZWdhdGUgc21hbGwgYnVmZmVycyBpbnRvCisgICAgLy8gb25lIGxhcmdlIGJ1ZmZlci4KKyAgICBzcDxBQnVmZmVyPiBtUGVuZGluZ0F1ZGlvQWNjZXNzVW5pdDsKKyAgICBzdGF0dXNfdCAgICBtUGVuZGluZ0F1ZGlvRXJyOworICAgIHNwPEFCdWZmZXI+IG1BZ2dyZWdhdGVCdWZmZXI7CisKKyAgICAvLyBtUGVuZGluZ0J1ZmZlcnNUb0RyYWluIGFyZSBvbmx5IGZvciBkZWJ1Z2dpbmcuIEl0IGNhbiBiZSByZW1vdmVkCisgICAgLy8gd2hlbiB0aGUgcG93ZXIgaW52ZXN0aWdhdGlvbiBpcyBkb25lLgorICAgIHNpemVfdCAgbVBlbmRpbmdCdWZmZXJzVG9EcmFpbjsKKyAgICBzaXplX3QgIG1DYWNoZWRCeXRlczsKKyAgICBBU3RyaW5nIG1Db21wb25lbnROYW1lOworCisgICAgYm9vbCBpc1N0YWxlUmVwbHkoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIGJvb2wgaXNEb25lRmV0Y2hpbmcoKSBjb25zdDsKKworICAgIHN0YXR1c190IGRlcXVldWVBY2Nlc3NVbml0KHNwPEFCdWZmZXI+ICphY2Nlc3NVbml0KTsKKyAgICBzcDxBQnVmZmVyPiBhZ2dyZWdhdGVCdWZmZXIoY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpOworICAgIHN0YXR1c190IGZldGNoSW5wdXREYXRhKHNwPEFNZXNzYWdlPiAmcmVwbHkpOworICAgIHZvaWQgZG9GbHVzaChib29sIG5vdGlmeUNvbXBsZXRlKTsKKworICAgIHZvaWQgb25JbnB1dEJ1ZmZlckZldGNoZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZvaWQgb25CdWZmZXJDb25zdW1lZChpbnQzMl90IHNpemUpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRGVjb2RlclBhc3NUaHJvdWdoKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTlVQTEFZRVIyX0RFQ09ERVJfUEFTU19USFJPVUdIX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRyaXZlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRyaXZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNkMTdhNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJpdmVyLmNwcApAQCAtMCwwICsxLDEwODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTnVQbGF5ZXIyRHJpdmVyIgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKworI2luY2x1ZGUgIk51UGxheWVyMkRyaXZlci5oIgorCisjaW5jbHVkZSAiTnVQbGF5ZXIyLmgiCisjaW5jbHVkZSAiTnVQbGF5ZXIyU291cmNlLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlRGVzYy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ2xvY2suaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmg+CisKK3N0YXRpYyBjb25zdCBpbnQga0R1bXBMb2NrUmV0cmllcyA9IDUwOworc3RhdGljIGNvbnN0IGludCBrRHVtcExvY2tTbGVlcFVzID0gMjAwMDA7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IFBhcmNlbFdyYXBwZXIgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgc3RhdGljIHNwPFBhcmNlbFdyYXBwZXI+IENyZWF0ZShjb25zdCBQYXJjZWwgKnApIHsKKyAgICAgICAgaWYgKHAgIT0gTlVMTCkgeworICAgICAgICAgICAgc3A8UGFyY2VsV3JhcHBlcj4gcHcgPSBuZXcgUGFyY2VsV3JhcHBlcigpOworICAgICAgICAgICAgaWYgKHB3LT5hcHBlbmRGcm9tKHApID09IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHB3OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGNvbnN0IFBhcmNlbCAqZ2V0UGFyY2VsKCkgeworICAgICAgICByZXR1cm4gbVBhcmNlbDsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5QYXJjZWxXcmFwcGVyKCkgeworICAgICAgICBpZiAobVBhcmNlbCAhPSBOVUxMKSB7CisgICAgICAgICAgICBkZWxldGUgbVBhcmNlbDsKKyAgICAgICAgfQorICAgIH0KKworcHJpdmF0ZToKKyAgICBQYXJjZWxXcmFwcGVyKCkKKyAgICAgICAgOiBtUGFyY2VsKE5VTEwpIHsgfQorCisgICAgc3RhdHVzX3QgYXBwZW5kRnJvbShjb25zdCBQYXJjZWwgKnApIHsKKyAgICAgICAgaWYgKG1QYXJjZWwgPT0gTlVMTCkgeworICAgICAgICAgICAgbVBhcmNlbCA9IG5ldyBQYXJjZWw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1QYXJjZWwtPmFwcGVuZEZyb20ocCwgMCAvKiBzdGFydCAqLywgcC0+ZGF0YVNpemUoKSk7CisgICAgfQorCisgICAgUGFyY2VsICptUGFyY2VsOworfTsKKworLy8ga2V5IGZvciBtZWRpYSBzdGF0aXN0aWNzCitzdGF0aWMgY29uc3QgY2hhciAqa0tleVBsYXllciA9ICJudXBsYXllciI7CisvLyBhdHRycyBmb3IgbWVkaWEgc3RhdGlzdGljcworICAgIC8vIE5COiB0aGVzZSBhcmUgbWF0Y2hlZCB3aXRoIHB1YmxpYyBKYXZhIEFQSSBjb25zdGFudHMgZGVmaW5lZAorICAgIC8vIGluIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFQbGF5ZXIyLmphdmEKKyAgICAvLyBUaGVzZSBtdXN0IGJlIGtlcHQgc3luY2hyb25pemVkIHdpdGggdGhlIGNvbnN0YW50cyB0aGVyZS4KK3N0YXRpYyBjb25zdCBjaGFyICprUGxheWVyVk1pbWUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci52aWRlby5taW1lIjsKK3N0YXRpYyBjb25zdCBjaGFyICprUGxheWVyVkNvZGVjID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIudmlkZW8uY29kZWMiOworc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJXaWR0aCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLndpZHRoIjsKK3N0YXRpYyBjb25zdCBjaGFyICprUGxheWVySGVpZ2h0ID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuaGVpZ2h0IjsKK3N0YXRpYyBjb25zdCBjaGFyICprUGxheWVyRnJhbWVzID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZnJhbWVzIjsKK3N0YXRpYyBjb25zdCBjaGFyICprUGxheWVyRnJhbWVzRHJvcHBlZCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmRyb3BwZWQiOworc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJBTWltZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmF1ZGlvLm1pbWUiOworc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJBQ29kZWMgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5hdWRpby5jb2RlYyI7CitzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckR1cmF0aW9uID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZHVyYXRpb25NcyI7CitzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllclBsYXlpbmcgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5wbGF5aW5nTXMiOworc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJFcnJvciA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmVyciI7CitzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckVycm9yQ29kZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmVycmNvZGUiOworCisvLyBOQjogVGhlc2UgYXJlIG5vdCB5ZXQgZXhwb3NlZCBhcyBwdWJsaWMgSmF2YSBBUEkgY29uc3RhbnRzLgorc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJFcnJvclN0YXRlID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZXJyc3RhdGUiOworc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJEYXRhU291cmNlVHlwZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmRhdGFTb3VyY2UiOworLy8KK3N0YXRpYyBjb25zdCBjaGFyICprUGxheWVyUmVidWZmZXJpbmcgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5yZWJ1ZmZlcmluZ01zIjsKK3N0YXRpYyBjb25zdCBjaGFyICprUGxheWVyUmVidWZmZXJpbmdDb3VudCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLnJlYnVmZmVycyI7CitzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllclJlYnVmZmVyaW5nQXRFeGl0ID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIucmVidWZmZXJFeGl0IjsKKworCitOdVBsYXllcjJEcml2ZXI6Ok51UGxheWVyMkRyaXZlcihwaWRfdCBwaWQsIHVpZF90IHVpZCkKKyAgICA6IG1TdGF0ZShTVEFURV9JRExFKSwKKyAgICAgIG1Bc3luY1Jlc3VsdChVTktOT1dOX0VSUk9SKSwKKyAgICAgIG1TcmNJZCgwKSwKKyAgICAgIG1TZXRTdXJmYWNlSW5Qcm9ncmVzcyhmYWxzZSksCisgICAgICBtRHVyYXRpb25VcygtMSksCisgICAgICBtUG9zaXRpb25VcygtMSksCisgICAgICBtU2Vla0luUHJvZ3Jlc3MoZmFsc2UpLAorICAgICAgbVBsYXlpbmdUaW1lVXMoMCksCisgICAgICBtUmVidWZmZXJpbmdUaW1lVXMoMCksCisgICAgICBtUmVidWZmZXJpbmdFdmVudHMoMCksCisgICAgICBtUmVidWZmZXJpbmdBdEV4aXQoZmFsc2UpLAorICAgICAgbUxvb3BlcihuZXcgQUxvb3BlciksCisgICAgICBtTnVQbGF5ZXIyTG9vcGVyKG5ldyBBTG9vcGVyKSwKKyAgICAgIG1NZWRpYUNsb2NrKG5ldyBNZWRpYUNsb2NrKSwKKyAgICAgIG1QbGF5ZXIobmV3IE51UGxheWVyMihwaWQsIHVpZCwgbU1lZGlhQ2xvY2spKSwKKyAgICAgIG1QbGF5ZXJGbGFncygwKSwKKyAgICAgIG1BbmFseXRpY3NJdGVtKE5VTEwpLAorICAgICAgbUNsaWVudFVpZCh1aWQpLAorICAgICAgbUF0RU9TKGZhbHNlKSwKKyAgICAgIG1Mb29waW5nKGZhbHNlKSwKKyAgICAgIG1BdXRvTG9vcChmYWxzZSkgeworICAgIEFMT0dEKCJOdVBsYXllcjJEcml2ZXIoJXApIGNyZWF0ZWQsIGNsaWVudFBpZCglZCkiLCB0aGlzLCBwaWQpOworICAgIG1Mb29wZXItPnNldE5hbWUoIk51UGxheWVyMkRyaXZlciBMb29wZXIiKTsKKyAgICBtTnVQbGF5ZXIyTG9vcGVyLT5zZXROYW1lKCJOdVBsYXllcjIgTG9vcGVyIik7CisKKyAgICBtTWVkaWFDbG9jay0+aW5pdCgpOworCisgICAgLy8gc2V0IHVwIGFuIGFuYWx5dGljcyByZWNvcmQKKyAgICBtQW5hbHl0aWNzSXRlbSA9IG5ldyBNZWRpYUFuYWx5dGljc0l0ZW0oa0tleVBsYXllcik7CisgICAgbUFuYWx5dGljc0l0ZW0tPnNldFVpZChtQ2xpZW50VWlkKTsKKworICAgIG1OdVBsYXllcjJMb29wZXItPnN0YXJ0KAorICAgICAgICAgICAgZmFsc2UsIC8qIHJ1bk9uQ2FsbGluZ1RocmVhZCAqLworICAgICAgICAgICAgdHJ1ZSwgIC8qIGNhbkNhbGxKYXZhICovCisgICAgICAgICAgICBQUklPUklUWV9BVURJTyk7CisKKyAgICBtTnVQbGF5ZXIyTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobVBsYXllcik7CisKKyAgICBtUGxheWVyLT5zZXREcml2ZXIodGhpcyk7Cit9CisKK051UGxheWVyMkRyaXZlcjo6fk51UGxheWVyMkRyaXZlcigpIHsKKyAgICBBTE9HVigifk51UGxheWVyMkRyaXZlciglcCkiLCB0aGlzKTsKKyAgICBtTnVQbGF5ZXIyTG9vcGVyLT5zdG9wKCk7CisgICAgbUxvb3Blci0+c3RvcCgpOworCisgICAgLy8gZmluYWxpemUgYW55IHBlbmRpbmcgbWV0cmljcywgdXN1YWxseSBhIG5vLW9wLgorICAgIHVwZGF0ZU1ldHJpY3MoImRlc3RydWN0b3IiKTsKKyAgICBsb2dNZXRyaWNzKCJkZXN0cnVjdG9yIik7CisKKyAgICBpZiAobUFuYWx5dGljc0l0ZW0gIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbUFuYWx5dGljc0l0ZW07CisgICAgICAgIG1BbmFseXRpY3NJdGVtID0gTlVMTDsKKyAgICB9Cit9CisKK3N0YXR1c190IE51UGxheWVyMkRyaXZlcjo6aW5pdENoZWNrKCkgeworICAgIG1Mb29wZXItPnN0YXJ0KAorICAgICAgICAgICAgZmFsc2UsIC8qIHJ1bk9uQ2FsbGluZ1RocmVhZCAqLworICAgICAgICAgICAgdHJ1ZSwgIC8qIGNhbkNhbGxKYXZhICovCisgICAgICAgICAgICBQUklPUklUWV9BVURJTyk7CisKKyAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIodGhpcyk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OnNldERhdGFTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZURlc2M+ICZkc2QpIHsKKyAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglcCkiLCB0aGlzKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9JRExFKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBtU3JjSWQgPSBkc2QtPm1JZDsKKyAgICBtU3RhdGUgPSBTVEFURV9TRVRfREFUQVNPVVJDRV9QRU5ESU5HOworCisgICAgbVBsYXllci0+c2V0RGF0YVNvdXJjZUFzeW5jKGRzZCk7CisKKyAgICB3aGlsZSAobVN0YXRlID09IFNUQVRFX1NFVF9EQVRBU09VUkNFX1BFTkRJTkcpIHsKKyAgICAgICAgbUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKKyAgICB9CisKKyAgICByZXR1cm4gbUFzeW5jUmVzdWx0OworfQorCitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OnByZXBhcmVOZXh0RGF0YVNvdXJjZShjb25zdCBzcDxEYXRhU291cmNlRGVzYz4gJmRzZCkgeworICAgIEFMT0dWKCJwcmVwYXJlTmV4dERhdGFTb3VyY2UoJXApIiwgdGhpcyk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIG1QbGF5ZXItPnByZXBhcmVOZXh0RGF0YVNvdXJjZUFzeW5jKGRzZCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE51UGxheWVyMkRyaXZlcjo6cGxheU5leHREYXRhU291cmNlKGludDY0X3Qgc3JjSWQpIHsKKyAgICBBTE9HVigicGxheU5leHREYXRhU291cmNlKCVwKSIsIHRoaXMpOworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBtU3JjSWQgPSBzcmNJZDsKKyAgICBtUGxheWVyLT5wbGF5TmV4dERhdGFTb3VyY2Uoc3JjSWQpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OnNldFZpZGVvU3VyZmFjZVRleHR1cmUoY29uc3Qgc3A8QU5hdGl2ZVdpbmRvd1dyYXBwZXI+ICZud3cpIHsKKyAgICBBTE9HVigic2V0VmlkZW9TdXJmYWNlVGV4dHVyZSglcCkiLCB0aGlzKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1TZXRTdXJmYWNlSW5Qcm9ncmVzcykgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc3dpdGNoIChtU3RhdGUpIHsKKyAgICAgICAgY2FzZSBTVEFURV9TRVRfREFUQVNPVVJDRV9QRU5ESU5HOgorICAgICAgICBjYXNlIFNUQVRFX1JFU0VUX0lOX1BST0dSRVNTOgorICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBtU2V0U3VyZmFjZUluUHJvZ3Jlc3MgPSB0cnVlOworCisgICAgbVBsYXllci0+c2V0VmlkZW9TdXJmYWNlVGV4dHVyZUFzeW5jKG53dyk7CisKKyAgICB3aGlsZSAobVNldFN1cmZhY2VJblByb2dyZXNzKSB7CisgICAgICAgIG1Db25kaXRpb24ud2FpdChtTG9jayk7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OmdldEJ1ZmZlcmluZ1NldHRpbmdzKEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcpIHsKKyAgICBBTE9HVigiZ2V0QnVmZmVyaW5nU2V0dGluZ3MoJXApIiwgdGhpcyk7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX0lETEUpIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBtUGxheWVyLT5nZXRCdWZmZXJpbmdTZXR0aW5ncyhidWZmZXJpbmcpOworfQorCitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OnNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiBidWZmZXJpbmcpIHsKKyAgICBBTE9HVigic2V0QnVmZmVyaW5nU2V0dGluZ3MoJXApIiwgdGhpcyk7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX0lETEUpIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBtUGxheWVyLT5zZXRCdWZmZXJpbmdTZXR0aW5ncyhidWZmZXJpbmcpOworfQorCitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OnByZXBhcmVBc3luYygpIHsKKyAgICBBTE9HVigicHJlcGFyZUFzeW5jKCVwKSIsIHRoaXMpOworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBzd2l0Y2ggKG1TdGF0ZSkgeworICAgICAgICBjYXNlIFNUQVRFX1VOUFJFUEFSRUQ6CisgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9QUkVQQVJJTkc7CisgICAgICAgICAgICBtUGxheWVyLT5wcmVwYXJlQXN5bmMoKTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEOgorICAgICAgICAgICAgLy8gdGhpcyBpcyByZWFsbHkganVzdCBwYXVzZWQuIGhhbmRsZSBhcyBzZWVrIHRvIHN0YXJ0CisgICAgICAgICAgICBtQXRFT1MgPSBmYWxzZTsKKyAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUklORzsKKyAgICAgICAgICAgIG1QbGF5ZXItPnNlZWtUb0FzeW5jKDAsIE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMgLyogbW9kZSAqLywKKyAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBuZWVkTm90aWZ5ICovKTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9OworfQorCitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OnN0YXJ0KCkgeworICAgIEFMT0dEKCJzdGFydCglcCksIHN0YXRlIGlzICVkLCBlb3MgaXMgJWQiLCB0aGlzLCBtU3RhdGUsIG1BdEVPUyk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gc3RhcnRfbCgpOworfQorCitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OnN0YXJ0X2woKSB7CisgICAgc3dpdGNoIChtU3RhdGUpIHsKKyAgICAgICAgY2FzZSBTVEFURV9QQVVTRUQ6CisgICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSRUQ6CisgICAgICAgIGNhc2UgU1RBVEVfUFJFUEFSRUQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1QbGF5ZXItPnN0YXJ0KCk7CisKKyAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICB9CisKKyAgICAgICAgY2FzZSBTVEFURV9SVU5OSU5HOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAobUF0RU9TKSB7CisgICAgICAgICAgICAgICAgbVBsYXllci0+c2Vla1RvQXN5bmMoMCk7CisgICAgICAgICAgICAgICAgbUF0RU9TID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbVBvc2l0aW9uVXMgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBtU3RhdGUgPSBTVEFURV9SVU5OSU5HOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OnN0b3AoKSB7CisgICAgQUxPR0QoInN0b3AoJXApIiwgdGhpcyk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIHN3aXRjaCAobVN0YXRlKSB7CisgICAgICAgIGNhc2UgU1RBVEVfUlVOTklORzoKKyAgICAgICAgICAgIG1QbGF5ZXItPnBhdXNlKCk7CisgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKworICAgICAgICBjYXNlIFNUQVRFX1BBVVNFRDoKKyAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRUQ7CisgICAgICAgICAgICAvL25vdGlmeUxpc3RlbmVyX2woTUVESUEyX1NUT1BQRUQpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTVEFURV9QUkVQQVJFRDoKKyAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEOgorICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUklORzoKKyAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJFRDoKKyAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRUQ7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpwYXVzZSgpIHsKKyAgICBBTE9HRCgicGF1c2UoJXApIiwgdGhpcyk7CisgICAgLy8gVGhlIE51UGxheWVyUmVuZGVyZXIgbWF5IGdldCBmbHVzaGVkIGlmIHBhdXNlIGZvciBsb25nIGVub3VnaCwgZS5nLiB0aGUgcGF1c2UgdGltZW91dCB0ZWFyCisgICAgLy8gZG93biBmb3IgYXVkaW8gb2ZmbG9hZCBtb2RlLiBJZiB0aGF0IGhhcHBlbnMsIHRoZSBOdVBsYXllclJlbmRlcmVyIHdpbGwgbm8gbG9uZ2VyIGtub3cgdGhlCisgICAgLy8gY3VycmVudCBwb3NpdGlvbi4gU28gc2ltaWxhciB0byBzZWVrVG8sIHVwZGF0ZSB8bVBvc2l0aW9uVXN8IHRvIHRoZSBwYXVzZSBwb3NpdGlvbiBieSBjYWxsaW5nCisgICAgLy8gZ2V0Q3VycmVudFBvc2l0aW9uIGhlcmUuCisgICAgaW50NjRfdCB1bnVzZWQ7CisgICAgZ2V0Q3VycmVudFBvc2l0aW9uKCZ1bnVzZWQpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIHN3aXRjaCAobVN0YXRlKSB7CisgICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEOgorICAgICAgICBjYXNlIFNUQVRFX1BSRVBBUkVEOgorICAgICAgICAgICAgcmV0dXJuIE9LOworCisgICAgICAgIGNhc2UgU1RBVEVfUlVOTklORzoKKyAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1BBVVNFRDsKKyAgICAgICAgICAgIG1QbGF5ZXItPnBhdXNlKCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBOdVBsYXllcjJEcml2ZXI6OmlzUGxheWluZygpIHsKKyAgICByZXR1cm4gbVN0YXRlID09IFNUQVRFX1JVTk5JTkcgJiYgIW1BdEVPUzsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpzZXRQbGF5YmFja1NldHRpbmdzKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZyYXRlKSB7CisgICAgc3RhdHVzX3QgZXJyID0gbVBsYXllci0+c2V0UGxheWJhY2tTZXR0aW5ncyhyYXRlKTsKKyAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgIC8vIHRyeSB0byB1cGRhdGUgcG9zaXRpb24KKyAgICAgICAgaW50NjRfdCB1bnVzZWQ7CisgICAgICAgIGdldEN1cnJlbnRQb3NpdGlvbigmdW51c2VkKTsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgaWYgKHJhdGUubVNwZWVkID09IDAuZiAmJiBtU3RhdGUgPT0gU1RBVEVfUlVOTklORykgeworICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfUEFVU0VEOworICAgICAgICB9IGVsc2UgaWYgKHJhdGUubVNwZWVkICE9IDAuZgorICAgICAgICAgICAgICAgICYmIChtU3RhdGUgPT0gU1RBVEVfUEFVU0VECisgICAgICAgICAgICAgICAgICAgIHx8IG1TdGF0ZSA9PSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJFRAorICAgICAgICAgICAgICAgICAgICB8fCBtU3RhdGUgPT0gU1RBVEVfUFJFUEFSRUQpKSB7CisgICAgICAgICAgICBlcnIgPSBzdGFydF9sKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpnZXRQbGF5YmFja1NldHRpbmdzKEF1ZGlvUGxheWJhY2tSYXRlICpyYXRlKSB7CisgICAgcmV0dXJuIG1QbGF5ZXItPmdldFBsYXliYWNrU2V0dGluZ3MocmF0ZSk7Cit9CisKK3N0YXR1c190IE51UGxheWVyMkRyaXZlcjo6c2V0U3luY1NldHRpbmdzKGNvbnN0IEFWU3luY1NldHRpbmdzICZzeW5jLCBmbG9hdCB2aWRlb0Zwc0hpbnQpIHsKKyAgICByZXR1cm4gbVBsYXllci0+c2V0U3luY1NldHRpbmdzKHN5bmMsIHZpZGVvRnBzSGludCk7Cit9CisKK3N0YXR1c190IE51UGxheWVyMkRyaXZlcjo6Z2V0U3luY1NldHRpbmdzKEFWU3luY1NldHRpbmdzICpzeW5jLCBmbG9hdCAqdmlkZW9GcHMpIHsKKyAgICByZXR1cm4gbVBsYXllci0+Z2V0U3luY1NldHRpbmdzKHN5bmMsIHZpZGVvRnBzKTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpzZWVrVG8oaW50NjRfdCBtc2VjLCBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlKSB7CisgICAgQUxPR0QoInNlZWtUbyglcCkgKCVsbGQgbXMsICVkKSBhdCBzdGF0ZSAlZCIsIHRoaXMsIChsb25nIGxvbmcpbXNlYywgbW9kZSwgbVN0YXRlKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaW50NjRfdCBzZWVrVGltZVVzID0gbXNlYyAqIDEwMDBsbDsKKworICAgIHN3aXRjaCAobVN0YXRlKSB7CisgICAgICAgIGNhc2UgU1RBVEVfUFJFUEFSRUQ6CisgICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSRUQ6CisgICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEOgorICAgICAgICBjYXNlIFNUQVRFX1JVTk5JTkc6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1BdEVPUyA9IGZhbHNlOworICAgICAgICAgICAgbVNlZWtJblByb2dyZXNzID0gdHJ1ZTsKKyAgICAgICAgICAgIG1QbGF5ZXItPnNlZWtUb0FzeW5jKHNlZWtUaW1lVXMsIG1vZGUsIHRydWUgLyogbmVlZE5vdGlmeSAqLyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgbVBvc2l0aW9uVXMgPSBzZWVrVGltZVVzOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpnZXRDdXJyZW50UG9zaXRpb24oaW50NjRfdCAqbXNlYykgeworICAgIGludDY0X3QgdGVtcFVzID0gMDsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgICAgIGlmIChtU2Vla0luUHJvZ3Jlc3MgfHwgKG1TdGF0ZSA9PSBTVEFURV9QQVVTRUQgJiYgIW1BdEVPUykpIHsKKyAgICAgICAgICAgIHRlbXBVcyA9IChtUG9zaXRpb25VcyA8PSAwKSA/IDAgOiBtUG9zaXRpb25VczsKKyAgICAgICAgICAgICptc2VjID0gZGl2Um91bmQodGVtcFVzLCAoaW50NjRfdCkoMTAwMCkpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdHVzX3QgcmV0ID0gbVBsYXllci0+Z2V0Q3VycmVudFBvc2l0aW9uKCZ0ZW1wVXMpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAvLyBXZSBuZWVkIHRvIGNoZWNrIG1TZWVrSW5Qcm9ncmVzcyBoZXJlIGJlY2F1c2UgbVBsYXllci0+c2Vla1RvQXN5bmMgaXMgYW4gYXN5bmMgY2FsbCwgd2hpY2gKKyAgICAvLyBtZWFucyBnZXRDdXJyZW50UG9zaXRpb24gY2FuIGJlIGNhbGxlZCBiZWZvcmUgc2VlayBpcyBjb21wbGV0ZWQuIElvdywgcmVuZGVyZXIgbWF5IHJldHVybiBhCisgICAgLy8gcG9zaXRpb24gdmFsdWUgdGhhdCdzIGRpZmZlcmVudCB0aGUgc2VlayB0byBwb3NpdGlvbi4KKyAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgIHRlbXBVcyA9IChtUG9zaXRpb25VcyA8PSAwKSA/IDAgOiBtUG9zaXRpb25VczsKKyAgICB9IGVsc2UgeworICAgICAgICBtUG9zaXRpb25VcyA9IHRlbXBVczsKKyAgICB9CisgICAgKm1zZWMgPSBkaXZSb3VuZCh0ZW1wVXMsIChpbnQ2NF90KSgxMDAwKSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OmdldER1cmF0aW9uKGludDY0X3QgKm1zZWMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1EdXJhdGlvblVzIDwgMCkgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICAqbXNlYyA9IChtRHVyYXRpb25VcyArIDUwMGxsKSAvIDEwMDA7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyRHJpdmVyOjp1cGRhdGVNZXRyaWNzKGNvbnN0IGNoYXIgKndoZXJlKSB7CisgICAgaWYgKHdoZXJlID09IE5VTEwpIHsKKyAgICAgICAgd2hlcmUgPSAidW5rbm93biI7CisgICAgfQorICAgIEFMT0dWKCJ1cGRhdGVNZXRyaWNzKCVwKSBmcm9tICVzIGF0IHN0YXRlICVkIiwgdGhpcywgd2hlcmUsIG1TdGF0ZSk7CisKKyAgICAvLyBnYXRoZXIgdGhlIGZpbmFsIHN0YXRzIGZvciB0aGlzIHJlY29yZAorICAgIFZlY3RvcjxzcDxBTWVzc2FnZT4+IHRyYWNrU3RhdHM7CisgICAgbVBsYXllci0+Z2V0U3RhdHMoJnRyYWNrU3RhdHMpOworCisgICAgaWYgKHRyYWNrU3RhdHMuc2l6ZSgpID4gMCkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRyYWNrU3RhdHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmc3RhdHMgPSB0cmFja1N0YXRzLml0ZW1BdChpKTsKKworICAgICAgICAgICAgQVN0cmluZyBtaW1lOworICAgICAgICAgICAgc3RhdHMtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSk7CisKKyAgICAgICAgICAgIEFTdHJpbmcgbmFtZTsKKyAgICAgICAgICAgIHN0YXRzLT5maW5kU3RyaW5nKCJjb21wb25lbnQtbmFtZSIsICZuYW1lKTsKKworICAgICAgICAgICAgaWYgKG1pbWUuc3RhcnRzV2l0aCgidmlkZW8vIikpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CisgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoa1BsYXllclZNaW1lLCBtaW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGlmICghbmFtZS5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtQbGF5ZXJWQ29kZWMsIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHN0YXRzLT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgc3RhdHMtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtQbGF5ZXJXaWR0aCwgd2lkdGgpOworICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa1BsYXllckhlaWdodCwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQ2NF90IG51bUZyYW1lc1RvdGFsID0gMDsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IG51bUZyYW1lc0Ryb3BwZWQgPSAwOworICAgICAgICAgICAgICAgIHN0YXRzLT5maW5kSW50NjQoImZyYW1lcy10b3RhbCIsICZudW1GcmFtZXNUb3RhbCk7CisgICAgICAgICAgICAgICAgc3RhdHMtPmZpbmRJbnQ2NCgiZnJhbWVzLWRyb3BwZWQtb3V0cHV0IiwgJm51bUZyYW1lc0Ryb3BwZWQpOworCisgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDY0KGtQbGF5ZXJGcmFtZXMsIG51bUZyYW1lc1RvdGFsKTsKKyAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50NjQoa1BsYXllckZyYW1lc0Ryb3BwZWQsIG51bUZyYW1lc0Ryb3BwZWQpOworCisKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobWltZS5zdGFydHNXaXRoKCJhdWRpby8iKSkgeworICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtQbGF5ZXJBTWltZSwgbWltZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBpZiAoIW5hbWUuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrUGxheWVyQUNvZGVjLCBuYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGFsd2F5cyBwcm92aWRlIGR1cmF0aW9uIGFuZCBwbGF5aW5nIHRpbWUsIGV2ZW4gaWYgdGhleSBoYXZlIDAvdW5rbm93biB2YWx1ZXMuCisKKyAgICAvLyBnZXREdXJhdGlvbigpIHVzZXMgbUxvY2sgZm9yIG11dGV4IC0tIGNhcmVmdWwgd2hlcmUgd2UgdXNlIGl0LgorICAgIGludDY0X3QgZHVyYXRpb25fbXMgPSAtMTsKKyAgICBnZXREdXJhdGlvbigmZHVyYXRpb25fbXMpOworICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChrUGxheWVyRHVyYXRpb24sIGR1cmF0aW9uX21zKTsKKworICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChrUGxheWVyUGxheWluZywgKG1QbGF5aW5nVGltZVVzKzUwMCkvMTAwMCApOworCisgICAgaWYgKG1SZWJ1ZmZlcmluZ0V2ZW50cyAhPSAwKSB7CisgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChrUGxheWVyUmVidWZmZXJpbmcsIChtUmVidWZmZXJpbmdUaW1lVXMrNTAwKS8xMDAwICk7CisgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrUGxheWVyUmVidWZmZXJpbmdDb3VudCwgbVJlYnVmZmVyaW5nRXZlbnRzKTsKKyAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtQbGF5ZXJSZWJ1ZmZlcmluZ0F0RXhpdCwgbVJlYnVmZmVyaW5nQXRFeGl0KTsKKyAgICB9CisKKyAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrUGxheWVyRGF0YVNvdXJjZVR5cGUsIG1QbGF5ZXItPmdldERhdGFTb3VyY2VUeXBlKCkpOworfQorCisKK3ZvaWQgTnVQbGF5ZXIyRHJpdmVyOjpsb2dNZXRyaWNzKGNvbnN0IGNoYXIgKndoZXJlKSB7CisgICAgaWYgKHdoZXJlID09IE5VTEwpIHsKKyAgICAgICAgd2hlcmUgPSAidW5rbm93biI7CisgICAgfQorICAgIEFMT0dWKCJsb2dNZXRyaWNzKCVwKSBmcm9tICVzIGF0IHN0YXRlICVkIiwgdGhpcywgd2hlcmUsIG1TdGF0ZSk7CisKKyAgICBpZiAobUFuYWx5dGljc0l0ZW0gPT0gTlVMTCB8fCBtQW5hbHl0aWNzSXRlbS0+aXNFbmFibGVkKCkgPT0gZmFsc2UpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGxvZyBvbmx5IG5vbi1lbXB0eSByZWNvcmRzCisgICAgLy8gd2UgYWx3YXlzIHVwZGF0ZU1ldHJpY3MoKSBiZWZvcmUgd2UgZ2V0IGhlcmUKKyAgICAvLyBhbmQgdGhhdCBhbHdheXMgaW5qZWN0cyAzIGZpZWxkcyAoZHVyYXRpb24sIHBsYXlpbmcgdGltZSwgYW5kCisgICAgLy8gZGF0YXNvdXJjZSkgaW50byB0aGUgcmVjb3JkLgorICAgIC8vIFNvIHRoZSBjYW5vbmljYWwgImVtcHR5IiByZWNvcmQgaGFzIDMgZWxlbWVudHMgaW4gaXQuCisgICAgaWYgKG1BbmFseXRpY3NJdGVtLT5jb3VudCgpID4gMykgeworCisgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZWxmcmVjb3JkKCk7CisKKyAgICAgICAgLy8gcmUtaW5pdCBpbiBjYXNlIHdlIHByZXBhcmUoKSBhbmQgc3RhcnQoKSBhZ2Fpbi4KKyAgICAgICAgZGVsZXRlIG1BbmFseXRpY3NJdGVtIDsKKyAgICAgICAgbUFuYWx5dGljc0l0ZW0gPSBuZXcgTWVkaWFBbmFseXRpY3NJdGVtKGtLZXlQbGF5ZXIpOworICAgICAgICBpZiAobUFuYWx5dGljc0l0ZW0pIHsKKyAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRVaWQobUNsaWVudFVpZCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiZGlkIG5vdCBoYXZlIGFueXRoaW5nIHRvIHJlY29yZCIpOworICAgIH0KK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpyZXNldCgpIHsKKyAgICBBTE9HRCgicmVzZXQoJXApIGF0IHN0YXRlICVkIiwgdGhpcywgbVN0YXRlKTsKKworICAgIHVwZGF0ZU1ldHJpY3MoInJlc2V0Iik7CisgICAgbG9nTWV0cmljcygicmVzZXQiKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBzd2l0Y2ggKG1TdGF0ZSkgeworICAgICAgICBjYXNlIFNUQVRFX0lETEU6CisgICAgICAgICAgICByZXR1cm4gT0s7CisKKyAgICAgICAgY2FzZSBTVEFURV9TRVRfREFUQVNPVVJDRV9QRU5ESU5HOgorICAgICAgICBjYXNlIFNUQVRFX1JFU0VUX0lOX1BST0dSRVNTOgorICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworCisgICAgICAgIGNhc2UgU1RBVEVfUFJFUEFSSU5HOgorICAgICAgICB7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKG1TcmNJZCwgTUVESUEyX1BSRVBBUkVEKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfU1RPUFBFRCkgeworICAgICAgICAvLyBub3RpZnlMaXN0ZW5lcl9sKE1FRElBMl9TVE9QUEVEKTsKKyAgICB9CisKKyAgICBtU3RhdGUgPSBTVEFURV9SRVNFVF9JTl9QUk9HUkVTUzsKKyAgICBtUGxheWVyLT5yZXNldEFzeW5jKCk7CisKKyAgICB3aGlsZSAobVN0YXRlID09IFNUQVRFX1JFU0VUX0lOX1BST0dSRVNTKSB7CisgICAgICAgIG1Db25kaXRpb24ud2FpdChtTG9jayk7CisgICAgfQorCisgICAgbUR1cmF0aW9uVXMgPSAtMTsKKyAgICBtUG9zaXRpb25VcyA9IC0xOworICAgIG1Mb29waW5nID0gZmFsc2U7CisgICAgbVBsYXlpbmdUaW1lVXMgPSAwOworICAgIG1SZWJ1ZmZlcmluZ1RpbWVVcyA9IDA7CisgICAgbVJlYnVmZmVyaW5nRXZlbnRzID0gMDsKKyAgICBtUmVidWZmZXJpbmdBdEV4aXQgPSBmYWxzZTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpub3RpZnlBdChpbnQ2NF90IG1lZGlhVGltZVVzKSB7CisgICAgQUxPR1YoIm5vdGlmeUF0KCVwKSwgdGltZTolbGxkIiwgdGhpcywgKGxvbmcgbG9uZyltZWRpYVRpbWVVcyk7CisgICAgcmV0dXJuIG1QbGF5ZXItPm5vdGlmeUF0KG1lZGlhVGltZVVzKTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpzZXRMb29waW5nKGludCBsb29wKSB7CisgICAgbUxvb3BpbmcgPSBsb29wICE9IDA7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6Omludm9rZShjb25zdCBQYXJjZWwgJnJlcXVlc3QsIFBhcmNlbCAqcmVwbHkpIHsKKyAgICBpZiAocmVwbHkgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgicmVwbHkgaXMgYSBOVUxMIHBvaW50ZXIiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpbnQzMl90IG1ldGhvZElkOworICAgIHN0YXR1c190IHJldCA9IHJlcXVlc3QucmVhZEludDMyKCZtZXRob2RJZCk7CisgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJldHJpZXZlIHRoZSByZXF1ZXN0ZWQgbWV0aG9kIHRvIGludm9rZSwgZXJyKCVkKSIsIHJldCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgc3dpdGNoIChtZXRob2RJZCkgeworICAgICAgICBjYXNlIE1FRElBX1BMQVlFUjJfSU5WT0tFX0lEX1NFVF9WSURFT19TQ0FMSU5HX01PREU6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBtb2RlID0gcmVxdWVzdC5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHJldHVybiBtUGxheWVyLT5zZXRWaWRlb1NjYWxpbmdNb2RlKG1vZGUpOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBNRURJQV9QTEFZRVIyX0lOVk9LRV9JRF9HRVRfVFJBQ0tfSU5GTzoKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPmdldFRyYWNrSW5mbyhyZXBseSk7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE1FRElBX1BMQVlFUjJfSU5WT0tFX0lEX1NFTEVDVF9UUkFDSzoKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHRyYWNrSW5kZXggPSByZXF1ZXN0LnJlYWRJbnQzMigpOworICAgICAgICAgICAgaW50NjRfdCBtc2VjID0gMDsKKyAgICAgICAgICAgIC8vIGdldEN1cnJlbnRQb3NpdGlvbiBzaG91bGQgYWx3YXlzIHJldHVybiBPSworICAgICAgICAgICAgZ2V0Q3VycmVudFBvc2l0aW9uKCZtc2VjKTsKKyAgICAgICAgICAgIHJldHVybiBtUGxheWVyLT5zZWxlY3RUcmFjayh0cmFja0luZGV4LCB0cnVlIC8qIHNlbGVjdCAqLywgbXNlYyAqIDEwMDBsbCk7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE1FRElBX1BMQVlFUjJfSU5WT0tFX0lEX1VOU0VMRUNUX1RSQUNLOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgdHJhY2tJbmRleCA9IHJlcXVlc3QucmVhZEludDMyKCk7CisgICAgICAgICAgICByZXR1cm4gbVBsYXllci0+c2VsZWN0VHJhY2sodHJhY2tJbmRleCwgZmFsc2UgLyogc2VsZWN0ICovLCAweGRlYWRiZWVmIC8qIG5vdCB1c2VkICovKTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgTUVESUFfUExBWUVSMl9JTlZPS0VfSURfR0VUX1NFTEVDVEVEX1RSQUNLOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IHR5cGUgPSByZXF1ZXN0LnJlYWRJbnQzMigpOworICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPmdldFNlbGVjdGVkVHJhY2sodHlwZSwgcmVwbHkpOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMkRyaXZlcjo6c2V0QXVkaW9TaW5rKGNvbnN0IHNwPEF1ZGlvU2luaz4gJmF1ZGlvU2luaykgeworICAgIG1QbGF5ZXItPnNldEF1ZGlvU2luayhhdWRpb1NpbmspOworICAgIG1BdWRpb1NpbmsgPSBhdWRpb1Npbms7Cit9CisKK3N0YXR1c190IE51UGxheWVyMkRyaXZlcjo6c2V0UGFyYW1ldGVyKAorICAgICAgICBpbnQgLyoga2V5ICovLCBjb25zdCBQYXJjZWwgJiAvKiByZXF1ZXN0ICovKSB7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OmdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwgKnJlcGx5KSB7CisKKyAgICBpZiAoa2V5ID09IEZPVVJDQygnbScsJ3QnLCdyJywnWCcpKSB7CisgICAgICAgIC8vIG10clggLS0gYSBwbGF5IG9uICdtZXRyaWNzJyAobm90IG1hdHJpeCkKKyAgICAgICAgLy8gZ2F0aGVyIGN1cnJlbnQgaW5mbyBhbGwgdG9nZXRoZXIsIHBhcmNlbCBpdCwgYW5kIHNlbmQgaXQgYmFjaworICAgICAgICB1cGRhdGVNZXRyaWNzKCJhcGkiKTsKKyAgICAgICAgbUFuYWx5dGljc0l0ZW0tPndyaXRlVG9QYXJjZWwocmVwbHkpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OmdldE1ldGFkYXRhKAorICAgICAgICBjb25zdCBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciYgLyogaWRzICovLCBQYXJjZWwgKnJlY29yZHMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgdXNpbmcgbWVkaWE6Ok1ldGFkYXRhOworCisgICAgTWV0YWRhdGEgbWV0YShyZWNvcmRzKTsKKworICAgIG1ldGEuYXBwZW5kQm9vbCgKKyAgICAgICAgICAgIE1ldGFkYXRhOjprUGF1c2VBdmFpbGFibGUsCisgICAgICAgICAgICBtUGxheWVyRmxhZ3MgJiBOdVBsYXllcjI6OlNvdXJjZTo6RkxBR19DQU5fUEFVU0UpOworCisgICAgbWV0YS5hcHBlbmRCb29sKAorICAgICAgICAgICAgTWV0YWRhdGE6OmtTZWVrQmFja3dhcmRBdmFpbGFibGUsCisgICAgICAgICAgICBtUGxheWVyRmxhZ3MgJiBOdVBsYXllcjI6OlNvdXJjZTo6RkxBR19DQU5fU0VFS19CQUNLV0FSRCk7CisKKyAgICBtZXRhLmFwcGVuZEJvb2woCisgICAgICAgICAgICBNZXRhZGF0YTo6a1NlZWtGb3J3YXJkQXZhaWxhYmxlLAorICAgICAgICAgICAgbVBsYXllckZsYWdzICYgTnVQbGF5ZXIyOjpTb3VyY2U6OkZMQUdfQ0FOX1NFRUtfRk9SV0FSRCk7CisKKyAgICBtZXRhLmFwcGVuZEJvb2woCisgICAgICAgICAgICBNZXRhZGF0YTo6a1NlZWtBdmFpbGFibGUsCisgICAgICAgICAgICBtUGxheWVyRmxhZ3MgJiBOdVBsYXllcjI6OlNvdXJjZTo6RkxBR19DQU5fU0VFSyk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyRHJpdmVyOjpub3RpZnlSZXNldENvbXBsZXRlKGludDY0X3QgLyogc3JjSWQgKi8pIHsKKyAgICBBTE9HRCgibm90aWZ5UmVzZXRDb21wbGV0ZSglcCkiLCB0aGlzKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgQ0hFQ0tfRVEobVN0YXRlLCBTVEFURV9SRVNFVF9JTl9QUk9HUkVTUyk7CisgICAgbVN0YXRlID0gU1RBVEVfSURMRTsKKyAgICBtQ29uZGl0aW9uLmJyb2FkY2FzdCgpOworfQorCit2b2lkIE51UGxheWVyMkRyaXZlcjo6bm90aWZ5U2V0U3VyZmFjZUNvbXBsZXRlKGludDY0X3QgLyogc3JjSWQgKi8pIHsKKyAgICBBTE9HVigibm90aWZ5U2V0U3VyZmFjZUNvbXBsZXRlKCVwKSIsIHRoaXMpOworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBDSEVDSyhtU2V0U3VyZmFjZUluUHJvZ3Jlc3MpOworICAgIG1TZXRTdXJmYWNlSW5Qcm9ncmVzcyA9IGZhbHNlOworCisgICAgbUNvbmRpdGlvbi5icm9hZGNhc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjJEcml2ZXI6Om5vdGlmeUR1cmF0aW9uKGludDY0X3QgLyogc3JjSWQgKi8sIGludDY0X3QgZHVyYXRpb25VcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgbUR1cmF0aW9uVXMgPSBkdXJhdGlvblVzOworfQorCit2b2lkIE51UGxheWVyMkRyaXZlcjo6bm90aWZ5TW9yZVBsYXlpbmdUaW1lVXMoaW50NjRfdCAvKiBzcmNJZCAqLywgaW50NjRfdCBwbGF5aW5nVXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIG1QbGF5aW5nVGltZVVzICs9IHBsYXlpbmdVczsKK30KKwordm9pZCBOdVBsYXllcjJEcml2ZXI6Om5vdGlmeU1vcmVSZWJ1ZmZlcmluZ1RpbWVVcyhpbnQ2NF90IC8qIHNyY0lkICovLCBpbnQ2NF90IHJlYnVmZmVyaW5nVXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIG1SZWJ1ZmZlcmluZ1RpbWVVcyArPSByZWJ1ZmZlcmluZ1VzOworICAgIG1SZWJ1ZmZlcmluZ0V2ZW50cysrOworfQorCit2b2lkIE51UGxheWVyMkRyaXZlcjo6bm90aWZ5UmVidWZmZXJpbmdXaGVuRXhpdChpbnQ2NF90IC8qIHNyY0lkICovLCBib29sIHN0YXR1cykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgbVJlYnVmZmVyaW5nQXRFeGl0ID0gc3RhdHVzOworfQorCit2b2lkIE51UGxheWVyMkRyaXZlcjo6bm90aWZ5U2Vla0NvbXBsZXRlKGludDY0X3Qgc3JjSWQpIHsKKyAgICBBTE9HVigibm90aWZ5U2Vla0NvbXBsZXRlKCVwKSIsIHRoaXMpOworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgbVNlZWtJblByb2dyZXNzID0gZmFsc2U7CisgICAgbm90aWZ5U2Vla0NvbXBsZXRlX2woc3JjSWQpOworfQorCit2b2lkIE51UGxheWVyMkRyaXZlcjo6bm90aWZ5U2Vla0NvbXBsZXRlX2woaW50NjRfdCBzcmNJZCkgeworICAgIGJvb2wgd2FzU2Vla2luZyA9IHRydWU7CisgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJJTkcpIHsKKyAgICAgICAgd2FzU2Vla2luZyA9IGZhbHNlOworICAgICAgICBtU3RhdGUgPSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJFRDsKKyAgICAgICAgbUNvbmRpdGlvbi5icm9hZGNhc3QoKTsKKyAgICB9IGVsc2UgaWYgKG1TdGF0ZSA9PSBTVEFURV9TVE9QUEVEKSB7CisgICAgICAgIC8vIG5vIG5lZWQgdG8gbm90aWZ5IGxpc3RlbmVyCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbm90aWZ5TGlzdGVuZXJfbChzcmNJZCwgd2FzU2Vla2luZyA/IE1FRElBMl9TRUVLX0NPTVBMRVRFIDogTUVESUEyX1BSRVBBUkVEKTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpkdW1wKAorICAgICAgICBpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJiAvKiBhcmdzICovKSBjb25zdCB7CisKKyAgICBWZWN0b3I8c3A8QU1lc3NhZ2U+ID4gdHJhY2tTdGF0czsKKyAgICBtUGxheWVyLT5nZXRTdGF0cygmdHJhY2tTdGF0cyk7CisKKyAgICBBU3RyaW5nIGxvZ1N0cmluZygiIE51UGxheWVyMlxuIik7CisgICAgY2hhciBidWZbMjU2XSA9IHswfTsKKworICAgIGJvb2wgbG9ja2VkID0gZmFsc2U7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrRHVtcExvY2tSZXRyaWVzOyArK2kpIHsKKyAgICAgICAgaWYgKG1Mb2NrLnRyeUxvY2soKSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgbG9ja2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHVzbGVlcChrRHVtcExvY2tTbGVlcFVzKTsKKyAgICB9CisKKyAgICBpZiAobG9ja2VkKSB7CisgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIgIHN0YXRlKCVkKSwgYXRFT1MoJWQpLCBsb29waW5nKCVkKSwgYXV0b0xvb3AoJWQpXG4iLAorICAgICAgICAgICAgICAgIG1TdGF0ZSwgbUF0RU9TLCBtTG9vcGluZywgbUF1dG9Mb29wKTsKKyAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiAgTlBEKCVwKSBsb2NrIGlzIHRha2VuXG4iLCB0aGlzKTsKKyAgICB9CisgICAgbG9nU3RyaW5nLmFwcGVuZChidWYpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0cmFja1N0YXRzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmc3RhdHMgPSB0cmFja1N0YXRzLml0ZW1BdChpKTsKKworICAgICAgICBBU3RyaW5nIG1pbWU7CisgICAgICAgIGlmIChzdGF0cy0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSkgeworICAgICAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiAgbWltZSglcylcbiIsIG1pbWUuY19zdHIoKSk7CisgICAgICAgICAgICBsb2dTdHJpbmcuYXBwZW5kKGJ1Zik7CisgICAgICAgIH0KKworICAgICAgICBBU3RyaW5nIG5hbWU7CisgICAgICAgIGlmIChzdGF0cy0+ZmluZFN0cmluZygiY29tcG9uZW50LW5hbWUiLCAmbmFtZSkpIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIgICAgZGVjb2RlciglcylcbiIsIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBsb2dTdHJpbmcuYXBwZW5kKGJ1Zik7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWltZS5zdGFydHNXaXRoKCJ2aWRlby8iKSkgeworICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgICAgICAgICAgaWYgKHN0YXRzLT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKQorICAgICAgICAgICAgICAgICAgICAmJiBzdGF0cy0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSkgeworICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIgICAgcmVzb2x1dGlvbiglZCB4ICVkKVxuIiwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgbG9nU3RyaW5nLmFwcGVuZChidWYpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQ2NF90IG51bUZyYW1lc1RvdGFsID0gMDsKKyAgICAgICAgICAgIGludDY0X3QgbnVtRnJhbWVzRHJvcHBlZCA9IDA7CisKKyAgICAgICAgICAgIHN0YXRzLT5maW5kSW50NjQoImZyYW1lcy10b3RhbCIsICZudW1GcmFtZXNUb3RhbCk7CisgICAgICAgICAgICBzdGF0cy0+ZmluZEludDY0KCJmcmFtZXMtZHJvcHBlZC1vdXRwdXQiLCAmbnVtRnJhbWVzRHJvcHBlZCk7CisgICAgICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiICAgIG51bUZyYW1lc1RvdGFsKCVsbGQpLCBudW1GcmFtZXNEcm9wcGVkKCVsbGQpLCAiCisgICAgICAgICAgICAgICAgICAgICAicGVyY2VudGFnZURyb3BwZWQoJS4yZiUlKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbnVtRnJhbWVzVG90YWwsCisgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW51bUZyYW1lc0Ryb3BwZWQsCisgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXNUb3RhbCA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAwLjAgOiAoZG91YmxlKShudW1GcmFtZXNEcm9wcGVkICogMTAwKSAvIG51bUZyYW1lc1RvdGFsKTsKKyAgICAgICAgICAgIGxvZ1N0cmluZy5hcHBlbmQoYnVmKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dJKCIlcyIsIGxvZ1N0cmluZy5jX3N0cigpKTsKKworICAgIGlmIChmZCA+PSAwKSB7CisgICAgICAgIEZJTEUgKm91dCA9IGZkb3BlbihkdXAoZmQpLCAidyIpOworICAgICAgICBmcHJpbnRmKG91dCwgIiVzIiwgbG9nU3RyaW5nLmNfc3RyKCkpOworICAgICAgICBmY2xvc2Uob3V0KTsKKyAgICAgICAgb3V0ID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyRHJpdmVyOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdE5vdGlmeUxpc3RlbmVyOiB7CisgICAgICAgICAgICBpbnQ2NF90IHNyY0lkOworICAgICAgICAgICAgaW50MzJfdCBtc2dJZDsKKyAgICAgICAgICAgIGludDMyX3QgZXh0MSA9IDA7CisgICAgICAgICAgICBpbnQzMl90IGV4dDIgPSAwOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInNyY0lkIiwgJnNyY0lkKSk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigibWVzc2FnZUlkIiwgJm1zZ0lkKSk7CisgICAgICAgICAgICBtc2ctPmZpbmRJbnQzMigiZXh0MSIsICZleHQxKTsKKyAgICAgICAgICAgIG1zZy0+ZmluZEludDMyKCJleHQyIiwgJmV4dDIpOworICAgICAgICAgICAgc3A8UGFyY2VsV3JhcHBlcj4gaW47CisgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7CisgICAgICAgICAgICBpZiAobXNnLT5maW5kT2JqZWN0KCJwYXJjZWwiLCAmb2JqKSAmJiBvYmogIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGluID0gc3RhdGljX2Nhc3Q8UGFyY2VsV3JhcHBlciAqPihvYmouZ2V0KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2VuZEV2ZW50KHNyY0lkLCBtc2dJZCwgZXh0MSwgZXh0MiwgKGluID09IE5VTEwgPyBOVUxMIDogaW4tPmdldFBhcmNlbCgpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMkRyaXZlcjo6bm90aWZ5TGlzdGVuZXIoCisgICAgICAgIGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICppbikgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgbm90aWZ5TGlzdGVuZXJfbChzcmNJZCwgbXNnLCBleHQxLCBleHQyLCBpbik7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyRHJpdmVyOjpub3RpZnlMaXN0ZW5lcl9sKAorICAgICAgICBpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqaW4pIHsKKyAgICBBTE9HRCgibm90aWZ5TGlzdGVuZXJfbCglcCksICglbGxkLCAlZCwgJWQsICVkLCAlZCksIGxvb3Agc2V0dGluZyglZCwgJWQpIiwKKyAgICAgICAgICAgIHRoaXMsIChsb25nIGxvbmcpc3JjSWQsIG1zZywgZXh0MSwgZXh0MiwKKyAgICAgICAgICAgIChpbiA9PSBOVUxMID8gLTEgOiAoaW50KWluLT5kYXRhU2l6ZSgpKSwgbUF1dG9Mb29wLCBtTG9vcGluZyk7CisgICAgaWYgKHNyY0lkID09IG1TcmNJZCkgeworICAgICAgICBzd2l0Y2ggKG1zZykgeworICAgICAgICAgICAgY2FzZSBNRURJQTJfUExBWUJBQ0tfQ09NUExFVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9SRVNFVF9JTl9QUk9HUkVTUykgeworICAgICAgICAgICAgICAgICAgICBpZiAobUF1dG9Mb29wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fTVVTSUM7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvU2luayAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IG1BdWRpb1NpbmstPmdldEF1ZGlvU3RyZWFtVHlwZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbVR5cGUgPT0gQVVESU9fU1RSRUFNX05PVElGSUNBVElPTikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJkaXNhYmxpbmcgYXV0by1sb29wIGZvciBub3RpZmljYXRpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXV0b0xvb3AgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobUxvb3BpbmcgfHwgbUF1dG9Mb29wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtUGxheWVyLT5zZWVrVG9Bc3luYygwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQXVkaW9TaW5rICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcmVuZGVyZXIgaGFzIHN0b3BwZWQgdGhlIHNpbmsgYXQgdGhlIGVuZCBpbiBvcmRlciB0byBwbGF5IG91dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsYXN0IGxpdHRsZSBiaXQgb2YgYXVkaW8uIEluIGxvb3BpbmcgbW9kZSwgd2UgbmVlZCB0byByZXN0YXJ0IGl0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1NpbmstPnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBzZW5kIGNvbXBsZXRpb24gZXZlbnQgd2hlbiBsb29waW5nCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5X2dldF9ib29sKCJwZXJzaXN0LmRlYnVnLnNmLnN0YXRzIiwgZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8U3RyaW5nMTY+IGFyZ3M7CisgICAgICAgICAgICAgICAgICAgICAgICBkdW1wKC0xLCBhcmdzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtUGxheWVyLT5wYXVzZSgpOworICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9QQVVTRUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIE1FRElBMl9FUlJPUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyB3aGVuIHdlIGhhdmUgYW4gZXJyb3IsIGFkZCBpdCB0byB0aGUgYW5hbHl0aWNzIGZvciB0aGlzIHBsYXliYWNrLgorICAgICAgICAgICAgICAgIC8vIGV4dDEgaXMgb3VyIHByaW1hcnkgJ2Vycm9yIHR5cGUnIHZhbHVlLiBPbmx5IGFkZCBleHQyIHdoZW4gbm9uLXplcm8uCisgICAgICAgICAgICAgICAgLy8gW3Rlc3QgYWdhaW5zdCBtc2cgaXMgZHVlIHRvIGZhbGwgdGhyb3VnaCBmcm9tIHByZXZpb3VzIHN3aXRjaCB2YWx1ZV0KKyAgICAgICAgICAgICAgICBpZiAobXNnID09IE1FRElBMl9FUlJPUikgeworICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa1BsYXllckVycm9yLCBleHQxKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dDIgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtQbGF5ZXJFcnJvckNvZGUsIGV4dDIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtQbGF5ZXJFcnJvclN0YXRlLCBzdGF0ZVN0cmluZyhtU3RhdGUpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQXRFT1MgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdE5vdGlmeUxpc3RlbmVyLCB0aGlzKTsKKyAgICBub3RpZnktPnNldEludDY0KCJzcmNJZCIsIHNyY0lkKTsKKyAgICBub3RpZnktPnNldEludDMyKCJtZXNzYWdlSWQiLCBtc2cpOworICAgIG5vdGlmeS0+c2V0SW50MzIoImV4dDEiLCBleHQxKTsKKyAgICBub3RpZnktPnNldEludDMyKCJleHQyIiwgZXh0Mik7CisgICAgbm90aWZ5LT5zZXRPYmplY3QoInBhcmNlbCIsIFBhcmNlbFdyYXBwZXI6OkNyZWF0ZShpbikpOworICAgIG5vdGlmeS0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyMkRyaXZlcjo6bm90aWZ5U2V0RGF0YVNvdXJjZUNvbXBsZXRlZChpbnQ2NF90IC8qIHNyY0lkICovLCBzdGF0dXNfdCBlcnIpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgQ0hFQ0tfRVEobVN0YXRlLCBTVEFURV9TRVRfREFUQVNPVVJDRV9QRU5ESU5HKTsKKworICAgIG1Bc3luY1Jlc3VsdCA9IGVycjsKKyAgICBtU3RhdGUgPSAoZXJyID09IE9LKSA/IFNUQVRFX1VOUFJFUEFSRUQgOiBTVEFURV9JRExFOworICAgIG1Db25kaXRpb24uYnJvYWRjYXN0KCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyRHJpdmVyOjpub3RpZnlQcmVwYXJlQ29tcGxldGVkKGludDY0X3Qgc3JjSWQsIHN0YXR1c190IGVycikgeworICAgIEFMT0dWKCJub3RpZnlQcmVwYXJlQ29tcGxldGVkICVkIiwgZXJyKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAoc3JjSWQgIT0gbVNyY0lkKSB7CisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woc3JjSWQsIE1FRElBMl9QUkVQQVJFRCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKHNyY0lkLCBNRURJQTJfRVJST1IsIE1FRElBMl9FUlJPUl9VTktOT1dOLCBlcnIpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobVN0YXRlICE9IFNUQVRFX1BSRVBBUklORykgeworICAgICAgICAvLyBXZSB3ZXJlIHByZXBhcmluZyBhc3luY2hyb25vdXNseSB3aGVuIHRoZSBjbGllbnQgY2FsbGVkCisgICAgICAgIC8vIHJlc2V0KCksIHdlIHNlbnQgYSBwcmVtYXR1cmUgInByZXBhcmVkIiBub3RpZmljYXRpb24gYW5kCisgICAgICAgIC8vIHRoZW4gaW5pdGlhdGVkIHRoZSByZXNldC4gVGhpcyBub3RpZmljYXRpb24gaXMgc3RhbGUuCisgICAgICAgIENIRUNLKG1TdGF0ZSA9PSBTVEFURV9SRVNFVF9JTl9QUk9HUkVTUyB8fCBtU3RhdGUgPT0gU1RBVEVfSURMRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDSEVDS19FUShtU3RhdGUsIFNUQVRFX1BSRVBBUklORyk7CisKKyAgICBtQXN5bmNSZXN1bHQgPSBlcnI7CisKKyAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgIC8vIHVwZGF0ZSBzdGF0ZSBiZWZvcmUgbm90aWZ5aW5nIGNsaWVudCwgc28gdGhhdCBpZiBjbGllbnQgY2FsbHMgYmFjayBpbnRvIE51UGxheWVyMkRyaXZlcgorICAgICAgICAvLyBpbiByZXNwb25zZSwgTnVQbGF5ZXIyRHJpdmVyIGhhcyB0aGUgcmlnaHQgc3RhdGUKKyAgICAgICAgbVN0YXRlID0gU1RBVEVfUFJFUEFSRUQ7CisgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woc3JjSWQsIE1FRElBMl9QUkVQQVJFRCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVN0YXRlID0gU1RBVEVfVU5QUkVQQVJFRDsKKyAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChzcmNJZCwgTUVESUEyX0VSUk9SLCBNRURJQTJfRVJST1JfVU5LTk9XTiwgZXJyKTsKKyAgICB9CisKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1QbGF5ZXItPmdldEZpbGVNZXRhKCk7CisgICAgaW50MzJfdCBsb29wOworICAgIGlmIChtZXRhICE9IE5VTEwKKyAgICAgICAgICAgICYmIG1ldGEtPmZpbmRJbnQzMihrS2V5QXV0b0xvb3AsICZsb29wKSAmJiBsb29wICE9IDApIHsKKyAgICAgICAgbUF1dG9Mb29wID0gdHJ1ZTsKKyAgICB9CisKKyAgICBtQ29uZGl0aW9uLmJyb2FkY2FzdCgpOworfQorCit2b2lkIE51UGxheWVyMkRyaXZlcjo6bm90aWZ5RmxhZ3NDaGFuZ2VkKGludDY0X3QgLyogc3JjSWQgKi8sIHVpbnQzMl90IGZsYWdzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIG1QbGF5ZXJGbGFncyA9IGZsYWdzOworfQorCisvLyBNb2R1bGFyIERSTQorc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpwcmVwYXJlRHJtKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmZHJtU2Vzc2lvbklkKQoreworICAgIEFMT0dWKCJwcmVwYXJlRHJtKCVwKSBzdGF0ZTogJWQiLCB0aGlzLCBtU3RhdGUpOworCisgICAgLy8gbGVhdmluZyB0aGUgc3RhdGUgdmVyaWZpY2F0aW9uIGZvciBtZWRpYXBsYXllci5jcHAKKyAgICBzdGF0dXNfdCByZXQgPSBtUGxheWVyLT5wcmVwYXJlRHJtKHV1aWQsIGRybVNlc3Npb25JZCk7CisKKyAgICBBTE9HVigicHJlcGFyZURybSByZXQ6ICVkIiwgcmV0KTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXR1c190IE51UGxheWVyMkRyaXZlcjo6cmVsZWFzZURybSgpCit7CisgICAgQUxPR1YoInJlbGVhc2VEcm0oJXApIHN0YXRlOiAlZCIsIHRoaXMsIG1TdGF0ZSk7CisKKyAgICAvLyBsZWF2aW5nIHRoZSBzdGF0ZSB2ZXJpZmljYXRpb24gZm9yIG1lZGlhcGxheWVyLmNwcAorICAgIHN0YXR1c190IHJldCA9IG1QbGF5ZXItPnJlbGVhc2VEcm0oKTsKKworICAgIEFMT0dWKCJyZWxlYXNlRHJtIHJldDogJWQiLCByZXQpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RkOjpzdHJpbmcgTnVQbGF5ZXIyRHJpdmVyOjpzdGF0ZVN0cmluZyhTdGF0ZSBzdGF0ZSkgeworICAgIGNvbnN0IGNoYXIgKnJ2YWwgPSBOVUxMOworICAgIGNoYXIgcmF3YnVmZmVyWzE2XTsgIC8vIGFsbG93cyAiJWQiCisKKyAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgIGNhc2UgU1RBVEVfSURMRTogcnZhbCA9ICJJRExFIjsgYnJlYWs7CisgICAgICAgIGNhc2UgU1RBVEVfU0VUX0RBVEFTT1VSQ0VfUEVORElORzogcnZhbCA9ICJTRVRfREFUQVNPVVJDRV9QRU5ESU5HIjsgYnJlYWs7CisgICAgICAgIGNhc2UgU1RBVEVfVU5QUkVQQVJFRDogcnZhbCA9ICJVTlBSRVBBUkVEIjsgYnJlYWs7CisgICAgICAgIGNhc2UgU1RBVEVfUFJFUEFSSU5HOiBydmFsID0gIlBSRVBBUklORyI7IGJyZWFrOworICAgICAgICBjYXNlIFNUQVRFX1BSRVBBUkVEOiBydmFsID0gIlBSRVBBUkVEIjsgYnJlYWs7CisgICAgICAgIGNhc2UgU1RBVEVfUlVOTklORzogcnZhbCA9ICJSVU5OSU5HIjsgYnJlYWs7CisgICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEOiBydmFsID0gIlBBVVNFRCI7IGJyZWFrOworICAgICAgICBjYXNlIFNUQVRFX1JFU0VUX0lOX1BST0dSRVNTOiBydmFsID0gIlJFU0VUX0lOX1BST0dSRVNTIjsgYnJlYWs7CisgICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRDogcnZhbCA9ICJTVE9QUEVEIjsgYnJlYWs7CisgICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSSU5HOiBydmFsID0gIlNUT1BQRURfQU5EX1BSRVBBUklORyI7IGJyZWFrOworICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUkVEOiBydmFsID0gIlNUT1BQRURfQU5EX1BSRVBBUkVEIjsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvLyB5ZXMsIHRoaXMgYnVmZmVyIGlzIHNoYXJlZCBhbmQgdnVsbmVyYWJsZSB0byByYWNlcworICAgICAgICAgICAgc25wcmludGYocmF3YnVmZmVyLCBzaXplb2YocmF3YnVmZmVyKSwgIiVkIiwgc3RhdGUpOworICAgICAgICAgICAgcnZhbCA9IHJhd2J1ZmZlcjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBydmFsOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcml2ZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJpdmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRhMjU2NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJpdmVyLmgKQEAgLTAsMCArMSwxNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFMb29wZXI7CitzdHJ1Y3QgTWVkaWFDbG9jazsKK3N0cnVjdCBOdVBsYXllcjI7CisKK3N0cnVjdCBOdVBsYXllcjJEcml2ZXIgOiBwdWJsaWMgTWVkaWFQbGF5ZXIySW50ZXJmYWNlIHsKKyAgICBleHBsaWNpdCBOdVBsYXllcjJEcml2ZXIocGlkX3QgcGlkLCB1aWRfdCB1aWQpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxEYXRhU291cmNlRGVzYz4gJmRzZCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlTmV4dERhdGFTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZURlc2M+ICZkc2QpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcGxheU5leHREYXRhU291cmNlKGludDY0X3Qgc3JjSWQpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWaWRlb1N1cmZhY2VUZXh0dXJlKGNvbnN0IHNwPEFOYXRpdmVXaW5kb3dXcmFwcGVyPiAmbnd3KSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyaW5nU2V0dGluZ3MoCisgICAgICAgICAgICBCdWZmZXJpbmdTZXR0aW5ncyogYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QnVmZmVyaW5nU2V0dGluZ3MoY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MmIGJ1ZmZlcmluZykgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmVBc3luYygpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7CisgICAgdmlydHVhbCBib29sIGlzUGxheWluZygpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGxheWJhY2tTZXR0aW5ncyhjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcmF0ZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQbGF5YmFja1NldHRpbmdzKEF1ZGlvUGxheWJhY2tSYXRlICpyYXRlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN5bmNTZXR0aW5ncyhjb25zdCBBVlN5bmNTZXR0aW5ncyAmc3luYywgZmxvYXQgdmlkZW9GcHNIaW50KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN5bmNTZXR0aW5ncyhBVlN5bmNTZXR0aW5ncyAqc3luYywgZmxvYXQgKnZpZGVvRnBzKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNlZWtUbygKKyAgICAgICAgICAgIGludDY0X3QgbXNlYywgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSA9IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q3VycmVudFBvc2l0aW9uKGludDY0X3QgKm1zZWMpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RHVyYXRpb24oaW50NjRfdCAqbXNlYyk7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZXNldCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgbm90aWZ5QXQoaW50NjRfdCBtZWRpYVRpbWVVcykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRMb29waW5nKGludCBsb29wKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGludm9rZShjb25zdCBQYXJjZWwgJnJlcXVlc3QsIFBhcmNlbCAqcmVwbHkpOworICAgIHZpcnR1YWwgdm9pZCBzZXRBdWRpb1NpbmsoY29uc3Qgc3A8QXVkaW9TaW5rPiAmYXVkaW9TaW5rKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwgJnJlcXVlc3QpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCAqcmVwbHkpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhZGF0YSgKKyAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyJiBpZHMsIFBhcmNlbCAqcmVjb3Jkcyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSBjb25zdDsKKworICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgb3ZlcnJpZGU7CisKKyAgICB2b2lkIG5vdGlmeVNldERhdGFTb3VyY2VDb21wbGV0ZWQoaW50NjRfdCBzcmNJZCwgc3RhdHVzX3QgZXJyKTsKKyAgICB2b2lkIG5vdGlmeVByZXBhcmVDb21wbGV0ZWQoaW50NjRfdCBzcmNJZCwgc3RhdHVzX3QgZXJyKTsKKyAgICB2b2lkIG5vdGlmeVJlc2V0Q29tcGxldGUoaW50NjRfdCBzcmNJZCk7CisgICAgdm9pZCBub3RpZnlTZXRTdXJmYWNlQ29tcGxldGUoaW50NjRfdCBzcmNJZCk7CisgICAgdm9pZCBub3RpZnlEdXJhdGlvbihpbnQ2NF90IHNyY0lkLCBpbnQ2NF90IGR1cmF0aW9uVXMpOworICAgIHZvaWQgbm90aWZ5TW9yZVBsYXlpbmdUaW1lVXMoaW50NjRfdCBzcmNJZCwgaW50NjRfdCB0aW1lVXMpOworICAgIHZvaWQgbm90aWZ5TW9yZVJlYnVmZmVyaW5nVGltZVVzKGludDY0X3Qgc3JjSWQsIGludDY0X3QgdGltZVVzKTsKKyAgICB2b2lkIG5vdGlmeVJlYnVmZmVyaW5nV2hlbkV4aXQoaW50NjRfdCBzcmNJZCwgYm9vbCBzdGF0dXMpOworICAgIHZvaWQgbm90aWZ5U2Vla0NvbXBsZXRlKGludDY0X3Qgc3JjSWQpOworICAgIHZvaWQgbm90aWZ5U2Vla0NvbXBsZXRlX2woaW50NjRfdCBzcmNJZCk7CisgICAgdm9pZCBub3RpZnlMaXN0ZW5lcihpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSA9IDAsIGludCBleHQyID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCAqaW4gPSBOVUxMKTsKKyAgICB2b2lkIG5vdGlmeUZsYWdzQ2hhbmdlZChpbnQ2NF90IHNyY0lkLCB1aW50MzJfdCBmbGFncyk7CisKKyAgICAvLyBNb2R1bGFyIERSTQorICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZURybShjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBWZWN0b3I8dWludDhfdD4gJmRybVNlc3Npb25JZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlRHJtKCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5OdVBsYXllcjJEcml2ZXIoKTsKKworcHJpdmF0ZToKKyAgICBlbnVtIFN0YXRlIHsKKyAgICAgICAgU1RBVEVfSURMRSwKKyAgICAgICAgU1RBVEVfU0VUX0RBVEFTT1VSQ0VfUEVORElORywKKyAgICAgICAgU1RBVEVfVU5QUkVQQVJFRCwKKyAgICAgICAgU1RBVEVfUFJFUEFSSU5HLAorICAgICAgICBTVEFURV9QUkVQQVJFRCwKKyAgICAgICAgU1RBVEVfUlVOTklORywKKyAgICAgICAgU1RBVEVfUEFVU0VELAorICAgICAgICBTVEFURV9SRVNFVF9JTl9QUk9HUkVTUywKKyAgICAgICAgU1RBVEVfU1RPUFBFRCwgICAgICAgICAgICAgICAgICAvLyBlcXVpdmFsZW50IHRvIFBBVVNFRAorICAgICAgICBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJJTkcsICAgIC8vIGVxdWl2YWxlbnQgdG8gUEFVU0VELCBidXQgc2Vla2luZworICAgICAgICBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJFRCwgICAgIC8vIGVxdWl2YWxlbnQgdG8gUEFVU0VELCBidXQgc2VlayBjb21wbGV0ZQorICAgIH07CisKKyAgICBzdGQ6OnN0cmluZyBzdGF0ZVN0cmluZyhTdGF0ZSBzdGF0ZSk7CisKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXROb3RpZnlMaXN0ZW5lciwKKyAgICB9OworCisgICAgbXV0YWJsZSBNdXRleCBtTG9jazsKKyAgICBDb25kaXRpb24gbUNvbmRpdGlvbjsKKworICAgIFN0YXRlIG1TdGF0ZTsKKworICAgIHN0YXR1c190IG1Bc3luY1Jlc3VsdDsKKworICAgIC8vIFRoZSBmb2xsb3dpbmcgYXJlIHByb3RlY3RlZCB0aHJvdWdoICJtTG9jayIKKyAgICAvLyA+Pj4KKyAgICBpbnQ2NF90IG1TcmNJZDsKKyAgICBib29sIG1TZXRTdXJmYWNlSW5Qcm9ncmVzczsKKyAgICBpbnQ2NF90IG1EdXJhdGlvblVzOworICAgIGludDY0X3QgbVBvc2l0aW9uVXM7CisgICAgYm9vbCBtU2Vla0luUHJvZ3Jlc3M7CisgICAgaW50NjRfdCBtUGxheWluZ1RpbWVVczsKKyAgICBpbnQ2NF90IG1SZWJ1ZmZlcmluZ1RpbWVVczsKKyAgICBpbnQzMl90IG1SZWJ1ZmZlcmluZ0V2ZW50czsKKyAgICBib29sIG1SZWJ1ZmZlcmluZ0F0RXhpdDsKKyAgICAvLyA8PDwKKworICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CisgICAgc3A8QUxvb3Blcj4gbU51UGxheWVyMkxvb3BlcjsKKyAgICBjb25zdCBzcDxNZWRpYUNsb2NrPiBtTWVkaWFDbG9jazsKKyAgICBjb25zdCBzcDxOdVBsYXllcjI+IG1QbGF5ZXI7CisgICAgc3A8QXVkaW9TaW5rPiBtQXVkaW9TaW5rOworICAgIHVpbnQzMl90IG1QbGF5ZXJGbGFnczsKKworICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAqbUFuYWx5dGljc0l0ZW07CisgICAgdWlkX3QgbUNsaWVudFVpZDsKKworICAgIGJvb2wgbUF0RU9TOworICAgIGJvb2wgbUxvb3Bpbmc7CisgICAgYm9vbCBtQXV0b0xvb3A7CisKKyAgICB2b2lkIHVwZGF0ZU1ldHJpY3MoY29uc3QgY2hhciAqd2hlcmUpOworICAgIHZvaWQgbG9nTWV0cmljcyhjb25zdCBjaGFyICp3aGVyZSk7CisKKyAgICBzdGF0dXNfdCBzdGFydF9sKCk7CisgICAgdm9pZCBub3RpZnlMaXN0ZW5lcl9sKGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxID0gMCwgaW50IGV4dDIgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwgKmluID0gTlVMTCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhOdVBsYXllcjJEcml2ZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRybS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRybS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg1M2FlMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJtLmNwcApAQCAtMCwwICsxLDE3NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJOdVBsYXllcjJEcm0iCisKKyNpbmNsdWRlICJOdVBsYXllcjJEcm0uaCIKKworI2luY2x1ZGUgPG1lZGlhL05ka1dyYXBwZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1ZlY3RvcjxEcm1VVUlEPiBOdVBsYXllcjJEcm06OnBhcnNlUFNTSChjb25zdCB2b2lkICpwc3NoLCBzaXplX3QgcHNzaHNpemUpCit7CisgICAgVmVjdG9yPERybVVVSUQ+IGRybVNjaGVtZXMsIGVtcHR5OworICAgIGNvbnN0IGludCBEQVRBTEVOX1NJWkUgPSA0OworCisgICAgLy8gdGhlIGZvcm1hdCBvZiB0aGUgYnVmZmVyIGlzIDEgb3IgbW9yZSBvZjoKKyAgICAvLyAgICB7CisgICAgLy8gICAgICAgIDE2IGJ5dGUgdXVpZAorICAgIC8vICAgICAgICA0IGJ5dGUgZGF0YSBsZW5ndGggTgorICAgIC8vICAgICAgICBOIGJ5dGVzIG9mIGRhdGEKKyAgICAvLyAgICB9CisgICAgLy8gRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgc291cmNlIGRhdGEuCisgICAgLy8gU2luY2Ugd2UgZ290IHRoZSBkYXRhIGZyb20gc3RhZ2VmcmlnaHQsIHdlIHRydXN0IGl0IGlzIHZhbGlkIGFuZCBwcm9wZXJseSBmb3JtYXR0ZWQuCisKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gKGNvbnN0IHVpbnQ4X3QqKXBzc2g7CisgICAgc2l6ZV90IGxlbiA9IHBzc2hzaXplOworICAgIHNpemVfdCBudW1lbnRyaWVzID0gMDsKKyAgICB3aGlsZSAobGVuID4gMCkgeworICAgICAgICBpZiAobGVuIDwgRHJtVVVJRDo6VVVJRF9TSVpFKSB7CisgICAgICAgICAgICBBTE9HRSgiUGFyc2VQU1NIOiBpbnZhbGlkIFBTU0ggZGF0YSIpOworICAgICAgICAgICAgcmV0dXJuIGVtcHR5OworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgdWludDhfdCAqdXVpZFB0ciA9IGRhdGE7CisKKyAgICAgICAgLy8gc2tpcCB1dWlkCisgICAgICAgIGRhdGEgKz0gRHJtVVVJRDo6VVVJRF9TSVpFOworICAgICAgICBsZW4gLT0gRHJtVVVJRDo6VVVJRF9TSVpFOworCisgICAgICAgIC8vIGdldCBkYXRhIGxlbmd0aAorICAgICAgICBpZiAobGVuIDwgREFUQUxFTl9TSVpFKSB7CisgICAgICAgICAgICBBTE9HRSgiUGFyc2VQU1NIOiBpbnZhbGlkIFBTU0ggZGF0YSIpOworICAgICAgICAgICAgcmV0dXJuIGVtcHR5OworICAgICAgICB9CisKKyAgICAgICAgdWludDMyX3QgZGF0YWxlbiA9ICooKHVpbnQzMl90KilkYXRhKTsKKyAgICAgICAgZGF0YSArPSBEQVRBTEVOX1NJWkU7CisgICAgICAgIGxlbiAtPSBEQVRBTEVOX1NJWkU7CisKKyAgICAgICAgaWYgKGxlbiA8IGRhdGFsZW4pIHsKKyAgICAgICAgICAgIEFMT0dFKCJQYXJzZVBTU0g6IGludmFsaWQgUFNTSCBkYXRhIik7CisgICAgICAgICAgICByZXR1cm4gZW1wdHk7CisgICAgICAgIH0KKworICAgICAgICAvLyBza2lwIHRoZSBkYXRhCisgICAgICAgIGRhdGEgKz0gZGF0YWxlbjsKKyAgICAgICAgbGVuIC09IGRhdGFsZW47CisKKyAgICAgICAgRHJtVVVJRCBfdXVpZCh1dWlkUHRyKTsKKyAgICAgICAgZHJtU2NoZW1lcy5hZGQoX3V1aWQpOworCisgICAgICAgIEFMT0dWKCJQYXJzZVBTU0hbJXp1XTogJXM6ICVzIiwgbnVtZW50cmllcywKKyAgICAgICAgICAgICAgICBfdXVpZC50b0hleFN0cmluZygpLnN0cmluZygpLAorICAgICAgICAgICAgICAgIERybVVVSUQ6OmFycmF5VG9IZXgoZGF0YSwgZGF0YWxlbikuc3RyaW5nKCkKKyAgICAgICAgICAgICApOworCisgICAgICAgIG51bWVudHJpZXMrKzsKKyAgICB9CisKKyAgICByZXR1cm4gZHJtU2NoZW1lczsKK30KKworVmVjdG9yPERybVVVSUQ+IE51UGxheWVyMkRybTo6Z2V0U3VwcG9ydGVkRHJtU2NoZW1lcyhjb25zdCB2b2lkICpwc3NoLCBzaXplX3QgcHNzaHNpemUpCit7CisgICAgVmVjdG9yPERybVVVSUQ+IHBzc2hEUk1zID0gcGFyc2VQU1NIKHBzc2gsIHBzc2hzaXplKTsKKworICAgIFZlY3RvcjxEcm1VVUlEPiBzdXBwb3J0ZWREUk1zOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcHNzaERSTXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgRHJtVVVJRCB1dWlkID0gcHNzaERSTXNbaV07CisgICAgICAgIGlmIChBTWVkaWFEcm1XcmFwcGVyOjppc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkLnB0cigpLCBOVUxMKSkgeworICAgICAgICAgICAgc3VwcG9ydGVkRFJNcy5hZGQodXVpZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HVigiZ2V0U3VwcG9ydGVkRHJtU2NoZW1lczogcHNzaERSTXM6ICV6dSBzdXBwb3J0ZWREUk1zOiAlenUiLAorICAgICAgICAgICAgcHNzaERSTXMuc2l6ZSgpLCBzdXBwb3J0ZWREUk1zLnNpemUoKSk7CisKKyAgICByZXR1cm4gc3VwcG9ydGVkRFJNczsKK30KKworc3A8QUJ1ZmZlcj4gTnVQbGF5ZXIyRHJtOjpyZXRyaWV2ZURybUluZm8oY29uc3Qgdm9pZCAqcHNzaCwgdWludDMyX3QgcHNzaHNpemUpCit7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIGJ1ZjsKKworICAgIC8vIDEpIFBTU0ggYnl0ZXMKKyAgICBidWYud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KCZwc3Noc2l6ZSksIHNpemVvZihwc3Noc2l6ZSkpOworICAgIGJ1Zi53cml0ZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIgKj4ocHNzaCksIHBzc2hzaXplKTsKKworICAgIEFMT0dWKCJyZXRyaWV2ZURybUluZm86IE1FRElBMl9EUk1fSU5GTyAgUFNTSDogc2l6ZTogJXUgJXMiLCBwc3Noc2l6ZSwKKyAgICAgICAgICAgIERybVVVSUQ6OmFycmF5VG9IZXgoKHVpbnQ4X3QqKXBzc2gsIHBzc2hzaXplKS5zdHJpbmcoKSk7CisKKyAgICAvLyAyKSBzdXBwb3J0ZWREUk1zCisgICAgVmVjdG9yPERybVVVSUQ+IHN1cHBvcnRlZERSTXMgPSBnZXRTdXBwb3J0ZWREcm1TY2hlbWVzKHBzc2gsIHBzc2hzaXplKTsKKyAgICB1aW50MzJfdCBuID0gc3VwcG9ydGVkRFJNcy5zaXplKCk7CisgICAgYnVmLndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhciAqPigmbiksIHNpemVvZihuKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgRHJtVVVJRCB1dWlkID0gc3VwcG9ydGVkRFJNc1tpXTsKKyAgICAgICAgYnVmLndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPigmbiksIHNpemVvZihuKSk7CisgICAgICAgIGJ1Zi53cml0ZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIgKj4odXVpZC5wdHIoKSksIERybVVVSUQ6OlVVSURfU0laRSk7CisKKyAgICAgICAgQUxPR1YoInJldHJpZXZlRHJtSW5mbzogTUVESUEyX0RSTV9JTkZPICBzdXBwb3J0ZWRTY2hlbWVbJXp1XSAlcyIsIGksCisgICAgICAgICAgICAgICAgdXVpZC50b0hleFN0cmluZygpLnN0cmluZygpKTsKKyAgICB9CisKKyAgICBzcDxBQnVmZmVyPiBkcm1JbmZvQnVmZmVyID0gQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KGJ1Zi5zdHIoKS5jX3N0cigpLCBidWYudGVsbHAoKSk7CisgICAgcmV0dXJuIGRybUluZm9CdWZmZXI7Cit9CisKK3NwPEFCdWZmZXI+IE51UGxheWVyMkRybTo6cmV0cmlldmVEcm1JbmZvKFBzc2hJbmZvICpwc3NoSW5mbykKK3sKKworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBwc3NoLCBkcm1JbmZvOworCisgICAgLy8gMCkgR2VuZXJhdGUgUFNTSCBieXRlcworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcHNzaEluZm8tPm51bWVudHJpZXM7IGkrKykgeworICAgICAgICBQc3NoRW50cnkgKmVudHJ5ID0gJnBzc2hJbmZvLT5lbnRyaWVzW2ldOworICAgICAgICB1aW50MzJfdCBkYXRhbGVuID0gZW50cnktPmRhdGFsZW47CisgICAgICAgIHBzc2gud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KCZlbnRyeS0+dXVpZCksIHNpemVvZihlbnRyeS0+dXVpZCkpOworICAgICAgICBwc3NoLndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPigmZGF0YWxlbiksIHNpemVvZihkYXRhbGVuKSk7CisgICAgICAgIHBzc2gud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KGVudHJ5LT5kYXRhKSwgZGF0YWxlbik7CisgICAgfQorCisgICAgdWludDMyX3QgcHNzaFNpemUgPSBwc3NoLnRlbGxwKCk7CisgICAgY29uc3QgdWludDhfdCogcHNzaFB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHBzc2guc3RyKCkuY19zdHIoKSk7CisgICAgY29uc3QgY2hhciAqcHNzaEhleCA9IERybVVVSUQ6OmFycmF5VG9IZXgocHNzaFB0ciwgcHNzaFNpemUpLnN0cmluZygpOworICAgIEFMT0dWKCJyZXRyaWV2ZURybUluZm86IE1FRElBX0RSTV9JTkZPICBQU1NIOiBzaXplOiAldSAlcyIsIHBzc2hTaXplLCBwc3NoSGV4KTsKKworICAgIC8vIDEpIFdyaXRlIFBTU0ggYnl0ZXMKKyAgICBkcm1JbmZvLndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPigmcHNzaFNpemUpLCBzaXplb2YocHNzaFNpemUpKTsKKyAgICBkcm1JbmZvLndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPihwc3NoLnN0cigpLmNfc3RyKCkpLCBwc3NoU2l6ZSk7CisKKyAgICAvLyAyKSBXcml0ZSBzdXBwb3J0ZWREUk1zCisgICAgdWludDMyX3QgbnVtZW50cmllcyA9IHBzc2hJbmZvLT5udW1lbnRyaWVzOworICAgIGRybUluZm8ud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KCZudW1lbnRyaWVzKSwgc2l6ZW9mKG51bWVudHJpZXMpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bWVudHJpZXM7IGkrKykgeworICAgICAgICBQc3NoRW50cnkgKmVudHJ5ID0gJnBzc2hJbmZvLT5lbnRyaWVzW2ldOworICAgICAgICBkcm1JbmZvLndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPigmZW50cnktPnV1aWQpLCBzaXplb2YoZW50cnktPnV1aWQpKTsKKyAgICAgICAgQUxPR1YoInJldHJpZXZlRHJtSW5mbzogTUVESUFfRFJNX0lORk8gIHN1cHBvcnRlZFNjaGVtZVslenVdICVzIiwgaSwKKyAgICAgICAgICAgICAgICBEcm1VVUlEOjphcnJheVRvSGV4KChjb25zdCB1aW50OF90KikmZW50cnktPnV1aWQsIHNpemVvZihBTWVkaWFVVUlEKSkuc3RyaW5nKCkpOworICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGRybUluZm9CdWYgPSBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoZHJtSW5mby5zdHIoKS5jX3N0cigpLCBkcm1JbmZvLnRlbGxwKCkpOworICAgIGRybUluZm9CdWYtPnNldFJhbmdlKDAsIGRybUluZm8udGVsbHAoKSk7CisgICAgcmV0dXJuIGRybUluZm9CdWY7Cit9CisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcm0uaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlkMjQxNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJtLmgKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBOVVBMQVlFUjJfRFJNX0hfCisjZGVmaW5lIE5VUExBWUVSMl9EUk1fSF8KKworI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisKKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworICAgIHN0cnVjdCBEcm1VVUlEIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IGludCBVVUlEX1NJWkUgPSAxNjsKKworICAgICAgICBEcm1VVUlEKCkgeworICAgICAgICAgICAgbWVtc2V0KHRoaXMtPnV1aWQsIDAsIHNpemVvZih1dWlkKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB0byBhbGxvdyBkZWZpbmluZyBWZWN0b3IvS2V5ZWRWZWN0b3Igb2YgVVVJRCB0eXBlCisgICAgICAgIERybVVVSUQoY29uc3QgRHJtVVVJRCAmYSkgeworICAgICAgICAgICAgbWVtY3B5KHRoaXMtPnV1aWQsIGEudXVpZCwgc2l6ZW9mKHV1aWQpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRvIGFsbG93IGRlZmluaW5nIFZlY3Rvci9LZXllZFZlY3RvciBvZiBVVUlEIHR5cGUKKyAgICAgICAgRHJtVVVJRChjb25zdCB1aW50OF90IHV1aWRfaW5bVVVJRF9TSVpFXSkgeworICAgICAgICAgICAgbWVtY3B5KHRoaXMtPnV1aWQsIHV1aWRfaW4sIHNpemVvZih1dWlkKSk7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCB1aW50OF90ICpwdHIoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gdXVpZDsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZzggdG9IZXhTdHJpbmcoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gYXJyYXlUb0hleCh1dWlkLCBVVUlEX1NJWkUpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIFN0cmluZzggdG9IZXhTdHJpbmcoY29uc3QgdWludDhfdCB1dWlkX2luW1VVSURfU0laRV0pIHsKKyAgICAgICAgICAgIHJldHVybiBhcnJheVRvSGV4KHV1aWRfaW4sIFVVSURfU0laRSk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgU3RyaW5nOCBhcnJheVRvSGV4KGNvbnN0IHVpbnQ4X3QgKmFycmF5LCBpbnQgYnl0ZXMpIHsKKyAgICAgICAgICAgIFN0cmluZzggcmVzdWx0OworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJTAyeCIsIGFycmF5W2ldKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgICB1aW50OF90IHV1aWRbVVVJRF9TSVpFXTsKKyAgICB9OworCisKKyAgICBzdHJ1Y3QgTnVQbGF5ZXIyRHJtIHsKKworICAgICAgICAvLyBzdGF0aWMgaGVscGVycyAtIGludGVybmFsCisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIHN0YXRpYyBWZWN0b3I8RHJtVVVJRD4gcGFyc2VQU1NIKGNvbnN0IHZvaWQgKnBzc2gsIHNpemVfdCBwc3Noc2l6ZSk7CisgICAgICAgIHN0YXRpYyBWZWN0b3I8RHJtVVVJRD4gZ2V0U3VwcG9ydGVkRHJtU2NoZW1lcyhjb25zdCB2b2lkICpwc3NoLCBzaXplX3QgcHNzaHNpemUpOworCisgICAgICAgIC8vIHN0YXRpYyBoZWxwZXJzIC0gcHVibGljCisKKyAgICBwdWJsaWM6CisgICAgICAgIHN0YXRpYyBzcDxBQnVmZmVyPiByZXRyaWV2ZURybUluZm8oY29uc3Qgdm9pZCAqcHNzaCwgdWludDMyX3QgcHNzaHNpemUpOworICAgICAgICBzdGF0aWMgc3A8QUJ1ZmZlcj4gcmV0cmlldmVEcm1JbmZvKFBzc2hJbmZvICopOworCisgICAgfTsgIC8vIE51UGxheWVyMkRybQorCit9ICAgLy8gYW5kcm9pZAorCisjZW5kaWYgICAgIC8vTlVQTEFZRVIyX0RSTV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJSZW5kZXJlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMlJlbmRlcmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGJkOTAwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJSZW5kZXJlci5jcHAKQEAgLTAsMCArMSwyMDc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJOdVBsYXllcjJSZW5kZXJlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkpXYWtlTG9jay5oIgorI2luY2x1ZGUgIk51UGxheWVyMlJlbmRlcmVyLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNsb2NrLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmg+CisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qCisgKiBFeGFtcGxlIG9mIGNvbW1vbiBjb25maWd1cmF0aW9uIHNldHRpbmdzIGluIHNoZWxsIHNjcmlwdCBmb3JtCisKKyAgICNUdXJuIG9mZmxvYWQgYXVkaW8gb2ZmICh1c2UgUENNIGZvciBQbGF5IE11c2ljKSAtLSBBdWRpb1BvbGljeU1hbmFnZXIKKyAgIGFkYiBzaGVsbCBzZXRwcm9wIGF1ZGlvLm9mZmxvYWQuZGlzYWJsZSAxCisKKyAgICNBbGxvdyBvZmZsb2FkIGF1ZGlvIHdpdGggdmlkZW8gKHJlcXVpcmVzIG9mZmxvYWRpbmcgdG8gYmUgZW5hYmxlZCkgLS0gQXVkaW9Qb2xpY3lNYW5hZ2VyCisgICBhZGIgc2hlbGwgc2V0cHJvcCBhdWRpby5vZmZsb2FkLnZpZGVvIDEKKworICAgI1VzZSBhdWRpbyBjYWxsYmFja3MgZm9yIFBDTSBkYXRhCisgICBhZGIgc2hlbGwgc2V0cHJvcCBtZWRpYS5zdGFnZWZyaWdodC5hdWRpby5jYmsgMQorCisgICAjVXNlIGRlZXAgYnVmZmVyIGZvciBQQ00gZGF0YSB3aXRoIHZpZGVvIChpdCBpcyBnZW5lcmFsbHkgZW5hYmxlZCBmb3IgYXVkaW8tb25seSkKKyAgIGFkYiBzaGVsbCBzZXRwcm9wIG1lZGlhLnN0YWdlZnJpZ2h0LmF1ZGlvLmRlZXAgMQorCisgICAjU2V0IHNpemUgb2YgYnVmZmVycyBmb3IgcGNtIGF1ZGlvIHNpbmsgaW4gbXNlYyAoZXhhbXBsZTogMTAwMCBtc2VjKQorICAgYWRiIHNoZWxsIHNldHByb3AgbWVkaWEuc3RhZ2VmcmlnaHQuYXVkaW8uc2luayAxMDAwCisKKyAqIFRoZXNlIGNvbmZpZ3VyYXRpb25zIHRha2UgZWZmZWN0IGZvciB0aGUgbmV4dCB0cmFjayBwbGF5ZWQgKG5vdCB0aGUgY3VycmVudCB0cmFjaykuCisgKi8KKworc3RhdGljIGlubGluZSBib29sIGdldFVzZUF1ZGlvQ2FsbGJhY2tTZXR0aW5nKCkgeworICAgIHJldHVybiBwcm9wZXJ0eV9nZXRfYm9vbCgibWVkaWEuc3RhZ2VmcmlnaHQuYXVkaW8uY2JrIiwgZmFsc2UgLyogZGVmYXVsdF92YWx1ZSAqLyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50MzJfdCBnZXRBdWRpb1NpbmtQY21Nc1NldHRpbmcoKSB7CisgICAgcmV0dXJuIHByb3BlcnR5X2dldF9pbnQzMigKKyAgICAgICAgICAgICJtZWRpYS5zdGFnZWZyaWdodC5hdWRpby5zaW5rIiwgNTAwIC8qIGRlZmF1bHRfdmFsdWUgKi8pOworfQorCisvLyBNYXhpbXVtIHRpbWUgaW4gcGF1c2VkIHN0YXRlIHdoZW4gb2ZmbG9hZGluZyBhdWRpbyBkZWNvbXByZXNzaW9uLiBXaGVuIGVsYXBzZWQsIHRoZSBBdWRpb1NpbmsKKy8vIGlzIGNsb3NlZCB0byBhbGxvdyB0aGUgYXVkaW8gRFNQIHRvIHBvd2VyIGRvd24uCitzdGF0aWMgY29uc3QgaW50NjRfdCBrT2ZmbG9hZFBhdXNlTWF4VXMgPSAxMDAwMDAwMGxsOworCisvLyBNYXhpbXVtIGFsbG93ZWQgZGVsYXkgZnJvbSBBdWRpb1NpbmssIDEuNSBzZWNvbmRzLgorc3RhdGljIGNvbnN0IGludDY0X3Qga01heEFsbG93ZWRBdWRpb1NpbmtEZWxheVVzID0gMTUwMDAwMGxsOworCitzdGF0aWMgY29uc3QgaW50NjRfdCBrTWluaW11bUF1ZGlvQ2xvY2tVcGRhdGVQZXJpb2RVcyA9IDIwIC8qIG1zZWMgKi8gKiAxMDAwOworCisvLyBzdGF0aWMKK2NvbnN0IE51UGxheWVyMjo6UmVuZGVyZXI6OlBjbUluZm8gTnVQbGF5ZXIyOjpSZW5kZXJlcjo6QVVESU9fUENNSU5GT19JTklUSUFMSVpFUiA9IHsKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9OT05FLAorICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLAorICAgICAgICBBVURJT19GT1JNQVRfSU5WQUxJRCwKKyAgICAgICAgMCwgLy8gbU51bUNoYW5uZWxzCisgICAgICAgIDAgLy8gbVNhbXBsZVJhdGUKK307CisKKy8vIHN0YXRpYworY29uc3QgaW50NjRfdCBOdVBsYXllcjI6OlJlbmRlcmVyOjprTWluUG9zaXRpb25VcGRhdGVEZWxheVVzID0gMTAwMDAwbGw7CisKK051UGxheWVyMjo6UmVuZGVyZXI6OlJlbmRlcmVyKAorICAgICAgICBjb25zdCBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2U6OkF1ZGlvU2luaz4gJnNpbmssCisgICAgICAgIGNvbnN0IHNwPE1lZGlhQ2xvY2s+ICZtZWRpYUNsb2NrLAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKKyAgICAgICAgdWludDMyX3QgZmxhZ3MpCisgICAgOiBtQXVkaW9TaW5rKHNpbmspLAorICAgICAgbVVzZVZpcnR1YWxBdWRpb1NpbmsoZmFsc2UpLAorICAgICAgbU5vdGlmeShub3RpZnkpLAorICAgICAgbUZsYWdzKGZsYWdzKSwKKyAgICAgIG1OdW1GcmFtZXNXcml0dGVuKDApLAorICAgICAgbURyYWluQXVkaW9RdWV1ZVBlbmRpbmcoZmFsc2UpLAorICAgICAgbURyYWluVmlkZW9RdWV1ZVBlbmRpbmcoZmFsc2UpLAorICAgICAgbUF1ZGlvUXVldWVHZW5lcmF0aW9uKDApLAorICAgICAgbVZpZGVvUXVldWVHZW5lcmF0aW9uKDApLAorICAgICAgbUF1ZGlvRHJhaW5HZW5lcmF0aW9uKDApLAorICAgICAgbVZpZGVvRHJhaW5HZW5lcmF0aW9uKDApLAorICAgICAgbUF1ZGlvRU9TR2VuZXJhdGlvbigwKSwKKyAgICAgIG1NZWRpYUNsb2NrKG1lZGlhQ2xvY2spLAorICAgICAgbVBsYXliYWNrU2V0dGluZ3MoQVVESU9fUExBWUJBQ0tfUkFURV9ERUZBVUxUKSwKKyAgICAgIG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXMoLTEpLAorICAgICAgbUFuY2hvclRpbWVNZWRpYVVzKC0xKSwKKyAgICAgIG1BbmNob3JOdW1GcmFtZXNXcml0dGVuKC0xKSwKKyAgICAgIG1WaWRlb0xhdGVCeVVzKDBsbCksCisgICAgICBtTmV4dFZpZGVvVGltZU1lZGlhVXMoLTEpLAorICAgICAgbUhhc0F1ZGlvKGZhbHNlKSwKKyAgICAgIG1IYXNWaWRlbyhmYWxzZSksCisgICAgICBtTm90aWZ5Q29tcGxldGVBdWRpbyhmYWxzZSksCisgICAgICBtTm90aWZ5Q29tcGxldGVWaWRlbyhmYWxzZSksCisgICAgICBtU3luY1F1ZXVlcyhmYWxzZSksCisgICAgICBtUGF1c2VkKGZhbHNlKSwKKyAgICAgIG1QYXVzZURyYWluQXVkaW9BbGxvd2VkVXMoMCksCisgICAgICBtVmlkZW9TYW1wbGVSZWNlaXZlZChmYWxzZSksCisgICAgICBtVmlkZW9SZW5kZXJpbmdTdGFydGVkKGZhbHNlKSwKKyAgICAgIG1WaWRlb1JlbmRlcmluZ1N0YXJ0R2VuZXJhdGlvbigwKSwKKyAgICAgIG1BdWRpb1JlbmRlcmluZ1N0YXJ0R2VuZXJhdGlvbigwKSwKKyAgICAgIG1SZW5kZXJpbmdEYXRhRGVsaXZlcmVkKGZhbHNlKSwKKyAgICAgIG1OZXh0QXVkaW9DbG9ja1VwZGF0ZVRpbWVVcygtMSksCisgICAgICBtTGFzdEF1ZGlvTWVkaWFUaW1lVXMoLTEpLAorICAgICAgbUF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dEdlbmVyYXRpb24oMCksCisgICAgICBtQXVkaW9Ub3JuRG93bihmYWxzZSksCisgICAgICBtQ3VycmVudE9mZmxvYWRJbmZvKEFVRElPX0lORk9fSU5JVElBTElaRVIpLAorICAgICAgbUN1cnJlbnRQY21JbmZvKEFVRElPX1BDTUlORk9fSU5JVElBTElaRVIpLAorICAgICAgbVRvdGFsQnVmZmVyc1F1ZXVlZCgwKSwKKyAgICAgIG1MYXN0QXVkaW9CdWZmZXJEcmFpbmVkKDApLAorICAgICAgbVVzZUF1ZGlvQ2FsbGJhY2soZmFsc2UpLAorICAgICAgbVdha2VMb2NrKG5ldyBKV2FrZUxvY2soKSkgeworICAgIENIRUNLKG1lZGlhQ2xvY2sgIT0gTlVMTCk7CisgICAgbVBsYXliYWNrUmF0ZSA9IG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZDsKKyAgICBtTWVkaWFDbG9jay0+c2V0UGxheWJhY2tSYXRlKG1QbGF5YmFja1JhdGUpOworfQorCitOdVBsYXllcjI6OlJlbmRlcmVyOjp+UmVuZGVyZXIoKSB7CisgICAgaWYgKG9mZmxvYWRpbmdBdWRpbygpKSB7CisgICAgICAgIG1BdWRpb1NpbmstPnN0b3AoKTsKKyAgICAgICAgbUF1ZGlvU2luay0+Zmx1c2goKTsKKyAgICAgICAgbUF1ZGlvU2luay0+Y2xvc2UoKTsKKyAgICB9CisKKyAgICAvLyBUcnkgdG8gYXZvaWQgcmFjaW5nIGNvbmRpdGlvbiBpbiBjYXNlIGNhbGxiYWNrIGlzIHN0aWxsIG9uLgorICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgaWYgKG1Vc2VBdWRpb0NhbGxiYWNrKSB7CisgICAgICAgIGZsdXNoUXVldWUoJm1BdWRpb1F1ZXVlKTsKKyAgICAgICAgZmx1c2hRdWV1ZSgmbVZpZGVvUXVldWUpOworICAgIH0KKyAgICBtV2FrZUxvY2suY2xlYXIoKTsKKyAgICBtVmlkZW9TY2hlZHVsZXIuY2xlYXIoKTsKKyAgICBtTm90aWZ5LmNsZWFyKCk7CisgICAgbUF1ZGlvU2luay5jbGVhcigpOworfQorCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6OnF1ZXVlQnVmZmVyKAorICAgICAgICBib29sIGF1ZGlvLAorICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeUNvbnN1bWVkKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFF1ZXVlQnVmZmVyLCB0aGlzKTsKKyAgICBtc2ctPnNldEludDMyKCJxdWV1ZUdlbmVyYXRpb24iLCBnZXRRdWV1ZUdlbmVyYXRpb24oYXVkaW8pKTsKKyAgICBtc2ctPnNldEludDMyKCJhdWRpbyIsIHN0YXRpY19jYXN0PGludDMyX3Q+KGF1ZGlvKSk7CisgICAgbXNnLT5zZXRPYmplY3QoImJ1ZmZlciIsIGJ1ZmZlcik7CisgICAgbXNnLT5zZXRNZXNzYWdlKCJub3RpZnlDb25zdW1lZCIsIG5vdGlmeUNvbnN1bWVkKTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpxdWV1ZUVPUyhib29sIGF1ZGlvLCBzdGF0dXNfdCBmaW5hbFJlc3VsdCkgeworICAgIENIRUNLX05FKGZpbmFsUmVzdWx0LCAoc3RhdHVzX3QpT0spOworCisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFF1ZXVlRU9TLCB0aGlzKTsKKyAgICBtc2ctPnNldEludDMyKCJxdWV1ZUdlbmVyYXRpb24iLCBnZXRRdWV1ZUdlbmVyYXRpb24oYXVkaW8pKTsKKyAgICBtc2ctPnNldEludDMyKCJhdWRpbyIsIHN0YXRpY19jYXN0PGludDMyX3Q+KGF1ZGlvKSk7CisgICAgbXNnLT5zZXRJbnQzMigiZmluYWxSZXN1bHQiLCBmaW5hbFJlc3VsdCk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6UmVuZGVyZXI6OnNldFBsYXliYWNrU2V0dGluZ3MoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnJhdGUpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q29uZmlnUGxheWJhY2ssIHRoaXMpOworICAgIHdyaXRlVG9BTWVzc2FnZShtc2csIHJhdGUpOworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CisgICAgaWYgKGVyciA9PSBPSyAmJiByZXNwb25zZSAhPSBOVUxMKSB7CisgICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6b25Db25maWdQbGF5YmFjayhjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcmF0ZSAvKiBzYW5pdGl6ZWQgKi8pIHsKKyAgICBpZiAocmF0ZS5tU3BlZWQgPT0gMC5mKSB7CisgICAgICAgIG9uUGF1c2UoKTsKKyAgICAgICAgLy8gZG9uJ3QgY2FsbCBhdWRpb3NpbmsncyBzZXRQbGF5YmFja1JhdGUgaWYgcGF1c2luZywgYXMgcGl0Y2ggZG9lcyBub3QKKyAgICAgICAgLy8gaGF2ZSB0byBjb3JyZXNwb25kIHRvIHRoZSBhbnkgbm9uLTAgc3BlZWQgKGUuZyBvbGQgc3BlZWQpLiBLZWVwCisgICAgICAgIC8vIHNldHRpbmdzIG5vbmV0aGVsZXNzLCB1c2luZyB0aGUgb2xkIHNwZWVkLCBpbiBjYXNlIGF1ZGlvc2luayBjaGFuZ2VzLgorICAgICAgICBBdWRpb1BsYXliYWNrUmF0ZSBuZXdSYXRlID0gcmF0ZTsKKyAgICAgICAgbmV3UmF0ZS5tU3BlZWQgPSBtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQ7CisgICAgICAgIG1QbGF5YmFja1NldHRpbmdzID0gbmV3UmF0ZTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGlmIChtQXVkaW9TaW5rICE9IE5VTEwgJiYgbUF1ZGlvU2luay0+cmVhZHkoKSkgeworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQXVkaW9TaW5rLT5zZXRQbGF5YmFja1JhdGUocmF0ZSk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CisgICAgbVBsYXliYWNrU2V0dGluZ3MgPSByYXRlOworICAgIG1QbGF5YmFja1JhdGUgPSByYXRlLm1TcGVlZDsKKyAgICBtTWVkaWFDbG9jay0+c2V0UGxheWJhY2tSYXRlKG1QbGF5YmFja1JhdGUpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6Z2V0UGxheWJhY2tTZXR0aW5ncyhBdWRpb1BsYXliYWNrUmF0ZSAqcmF0ZSAvKiBub25udWxsICovKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEdldFBsYXliYWNrU2V0dGluZ3MsIHRoaXMpOworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CisgICAgaWYgKGVyciA9PSBPSyAmJiByZXNwb25zZSAhPSBOVUxMKSB7CisgICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgcmVhZEZyb21BTWVzc2FnZShyZXNwb25zZSwgcmF0ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6b25HZXRQbGF5YmFja1NldHRpbmdzKEF1ZGlvUGxheWJhY2tSYXRlICpyYXRlIC8qIG5vbm51bGwgKi8pIHsKKyAgICBpZiAobUF1ZGlvU2luayAhPSBOVUxMICYmIG1BdWRpb1NpbmstPnJlYWR5KCkpIHsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUF1ZGlvU2luay0+Z2V0UGxheWJhY2tSYXRlKHJhdGUpOworICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICBpZiAoIWlzQXVkaW9QbGF5YmFja1JhdGVFcXVhbCgqcmF0ZSwgbVBsYXliYWNrU2V0dGluZ3MpKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImNvcnJlY3RpbmcgbWlzbWF0Y2ggaW4gaW50ZXJuYWwvZXh0ZXJuYWwgcGxheWJhY2sgcmF0ZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gZ2V0IHBsYXliYWNrIHNldHRpbmdzIHVzZWQgYnkgYXVkaW9zaW5rLCBhcyBpdCBtYXkgYmUKKyAgICAgICAgICAgIC8vIHNsaWdodGx5IG9mZiBkdWUgdG8gYXVkaW9zaW5rIG5vdCB0YWtpbmcgc21hbGwgY2hhbmdlcy4KKyAgICAgICAgICAgIG1QbGF5YmFja1NldHRpbmdzID0gKnJhdGU7CisgICAgICAgICAgICBpZiAobVBhdXNlZCkgeworICAgICAgICAgICAgICAgIHJhdGUtPm1TcGVlZCA9IDAuZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICAqcmF0ZSA9IG1QbGF5YmFja1NldHRpbmdzOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6c2V0U3luY1NldHRpbmdzKGNvbnN0IEFWU3luY1NldHRpbmdzICZzeW5jLCBmbG9hdCB2aWRlb0Zwc0hpbnQpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q29uZmlnU3luYywgdGhpcyk7CisgICAgd3JpdGVUb0FNZXNzYWdlKG1zZywgc3luYywgdmlkZW9GcHNIaW50KTsKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworICAgIGlmIChlcnIgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgeworICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6UmVuZGVyZXI6Om9uQ29uZmlnU3luYyhjb25zdCBBVlN5bmNTZXR0aW5ncyAmc3luYywgZmxvYXQgdmlkZW9GcHNIaW50IF9fdW51c2VkKSB7CisgICAgaWYgKHN5bmMubVNvdXJjZSAhPSBBVlNZTkNfU09VUkNFX0RFRkFVTFQpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgLy8gVE9ETzogc3VwcG9ydCBzeW5jIHNvdXJjZXMKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6UmVuZGVyZXI6OmdldFN5bmNTZXR0aW5ncyhBVlN5bmNTZXR0aW5ncyAqc3luYywgZmxvYXQgKnZpZGVvRnBzKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEdldFN5bmNTZXR0aW5ncywgdGhpcyk7CisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKKyAgICBpZiAoZXJyID09IE9LICYmIHJlc3BvbnNlICE9IE5VTEwpIHsKKyAgICAgICAgQ0hFQ0socmVzcG9uc2UtPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOworICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICByZWFkRnJvbUFNZXNzYWdlKHJlc3BvbnNlLCBzeW5jLCB2aWRlb0Zwcyk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6b25HZXRTeW5jU2V0dGluZ3MoCisgICAgICAgIEFWU3luY1NldHRpbmdzICpzeW5jIC8qIG5vbm51bGwgKi8sIGZsb2F0ICp2aWRlb0ZwcyAvKiBub25udWxsICovKSB7CisgICAgKnN5bmMgPSBtU3luY1NldHRpbmdzOworICAgICp2aWRlb0ZwcyA9IC0xLmY7CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6OmZsdXNoKGJvb2wgYXVkaW8sIGJvb2wgbm90aWZ5Q29tcGxldGUpIHsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgICAgIGlmIChhdWRpbykgeworICAgICAgICAgICAgbU5vdGlmeUNvbXBsZXRlQXVkaW8gfD0gbm90aWZ5Q29tcGxldGU7CisgICAgICAgICAgICBjbGVhckF1ZGlvRmlyc3RBbmNob3JUaW1lX2woKTsKKyAgICAgICAgICAgICsrbUF1ZGlvUXVldWVHZW5lcmF0aW9uOworICAgICAgICAgICAgKyttQXVkaW9EcmFpbkdlbmVyYXRpb247CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtTm90aWZ5Q29tcGxldGVWaWRlbyB8PSBub3RpZnlDb21wbGV0ZTsKKyAgICAgICAgICAgICsrbVZpZGVvUXVldWVHZW5lcmF0aW9uOworICAgICAgICAgICAgKyttVmlkZW9EcmFpbkdlbmVyYXRpb247CisgICAgICAgIH0KKworICAgICAgICBtTWVkaWFDbG9jay0+Y2xlYXJBbmNob3IoKTsKKyAgICAgICAgbVZpZGVvTGF0ZUJ5VXMgPSAwOworICAgICAgICBtTmV4dFZpZGVvVGltZU1lZGlhVXMgPSAtMTsKKyAgICAgICAgbVN5bmNRdWV1ZXMgPSBmYWxzZTsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Rmx1c2gsIHRoaXMpOworICAgIG1zZy0+c2V0SW50MzIoImF1ZGlvIiwgc3RhdGljX2Nhc3Q8aW50MzJfdD4oYXVkaW8pKTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpzaWduYWxUaW1lRGlzY29udGludWl0eSgpIHsKK30KKwordm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpzaWduYWxEaXNhYmxlT2ZmbG9hZEF1ZGlvKCkgeworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXREaXNhYmxlT2ZmbG9hZEF1ZGlvLCB0aGlzKSktPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpzaWduYWxFbmFibGVPZmZsb2FkQXVkaW8oKSB7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdEVuYWJsZU9mZmxvYWRBdWRpbywgdGhpcykpLT5wb3N0KCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6cGF1c2UoKSB7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFBhdXNlLCB0aGlzKSktPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpyZXN1bWUoKSB7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFJlc3VtZSwgdGhpcykpLT5wb3N0KCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6c2V0VmlkZW9GcmFtZVJhdGUoZmxvYXQgZnBzKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldFZpZGVvRnJhbWVSYXRlLCB0aGlzKTsKKyAgICBtc2ctPnNldEZsb2F0KCJmcmFtZS1yYXRlIiwgZnBzKTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKworLy8gQ2FsbGVkIG9uIGFueSB0aHJlYWRzIHdpdGhvdXQgbUxvY2sgYWNxdWlyZWQuCitzdGF0dXNfdCBOdVBsYXllcjI6OlJlbmRlcmVyOjpnZXRDdXJyZW50UG9zaXRpb24oaW50NjRfdCAqbWVkaWFVcykgeworICAgIHN0YXR1c190IHJlc3VsdCA9IG1NZWRpYUNsb2NrLT5nZXRNZWRpYVRpbWUoQUxvb3Blcjo6R2V0Tm93VXMoKSwgbWVkaWFVcyk7CisgICAgaWYgKHJlc3VsdCA9PSBPSykgeworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8vIE1lZGlhQ2xvY2sgaGFzIG5vdCBzdGFydGVkIHlldC4gVHJ5IHRvIHN0YXJ0IGl0IGlmIHBvc3NpYmxlLgorICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgaWYgKG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXMgPT0gLTEpIHsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBBdWRpb1RpbWVzdGFtcCB0czsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gbUF1ZGlvU2luay0+Z2V0VGltZXN0YW1wKHRzKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEF1ZGlvU2luayBoYXMgcmVuZGVyZWQgc29tZSBmcmFtZXMuCisgICAgICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgICAgICBpbnQ2NF90IG5vd01lZGlhVXMgPSBtQXVkaW9TaW5rLT5nZXRQbGF5ZWRPdXREdXJhdGlvblVzKG5vd1VzKQorICAgICAgICAgICAgICAgICsgbUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVczsKKyAgICAgICAgbU1lZGlhQ2xvY2stPnVwZGF0ZUFuY2hvcihub3dNZWRpYVVzLCBub3dVcywgLTEpOworICAgIH0KKworICAgIHJldHVybiBtTWVkaWFDbG9jay0+Z2V0TWVkaWFUaW1lKEFMb29wZXI6OkdldE5vd1VzKCksIG1lZGlhVXMpOworfQorCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6OmNsZWFyQXVkaW9GaXJzdEFuY2hvclRpbWVfbCgpIHsKKyAgICBtQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzID0gLTE7CisgICAgbU1lZGlhQ2xvY2stPnNldFN0YXJ0aW5nVGltZU1lZGlhKC0xKTsKK30KKwordm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpzZXRBdWRpb0ZpcnN0QW5jaG9yVGltZUlmTmVlZGVkX2woaW50NjRfdCBtZWRpYVVzKSB7CisgICAgaWYgKG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXMgPT0gLTEpIHsKKyAgICAgICAgbUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVcyA9IG1lZGlhVXM7CisgICAgICAgIG1NZWRpYUNsb2NrLT5zZXRTdGFydGluZ1RpbWVNZWRpYShtZWRpYVVzKTsKKyAgICB9Cit9CisKKy8vIENhbGxlZCBvbiByZW5kZXJlciBsb29wZXIuCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6OmNsZWFyQW5jaG9yVGltZSgpIHsKKyAgICBtTWVkaWFDbG9jay0+Y2xlYXJBbmNob3IoKTsKKyAgICBtQW5jaG9yVGltZU1lZGlhVXMgPSAtMTsKKyAgICBtQW5jaG9yTnVtRnJhbWVzV3JpdHRlbiA9IC0xOworfQorCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6OnNldFZpZGVvTGF0ZUJ5VXMoaW50NjRfdCBsYXRlVXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIG1WaWRlb0xhdGVCeVVzID0gbGF0ZVVzOworfQorCitpbnQ2NF90IE51UGxheWVyMjo6UmVuZGVyZXI6OmdldFZpZGVvTGF0ZUJ5VXMoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gbVZpZGVvTGF0ZUJ5VXM7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6UmVuZGVyZXI6Om9wZW5BdWRpb1NpbmsoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICBib29sIG9mZmxvYWRPbmx5LAorICAgICAgICBib29sIGhhc1ZpZGVvLAorICAgICAgICB1aW50MzJfdCBmbGFncywKKyAgICAgICAgYm9vbCAqaXNPZmZsb2FkZWQsCisgICAgICAgIGJvb2wgaXNTdHJlYW1pbmcpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0T3BlbkF1ZGlvU2luaywgdGhpcyk7CisgICAgbXNnLT5zZXRNZXNzYWdlKCJmb3JtYXQiLCBmb3JtYXQpOworICAgIG1zZy0+c2V0SW50MzIoIm9mZmxvYWQtb25seSIsIG9mZmxvYWRPbmx5KTsKKyAgICBtc2ctPnNldEludDMyKCJoYXMtdmlkZW8iLCBoYXNWaWRlbyk7CisgICAgbXNnLT5zZXRJbnQzMigiZmxhZ3MiLCBmbGFncyk7CisgICAgbXNnLT5zZXRJbnQzMigiaXNTdHJlYW1pbmciLCBpc1N0cmVhbWluZyk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3QgcG9zdFN0YXR1cyA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKKworICAgIGludDMyX3QgZXJyOworICAgIGlmIChwb3N0U3RhdHVzICE9IE9LIHx8IHJlc3BvbnNlLmdldCgpID09IG51bGxwdHIgfHwgIXJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpKSB7CisgICAgICAgIGVyciA9IElOVkFMSURfT1BFUkFUSU9OOworICAgIH0gZWxzZSBpZiAoZXJyID09IE9LICYmIGlzT2ZmbG9hZGVkICE9IE5VTEwpIHsKKyAgICAgICAgaW50MzJfdCBvZmZsb2FkOworICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJvZmZsb2FkIiwgJm9mZmxvYWQpKTsKKyAgICAgICAgKmlzT2ZmbG9hZGVkID0gKG9mZmxvYWQgIT0gMCk7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6Y2xvc2VBdWRpb1NpbmsoKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENsb3NlQXVkaW9TaW5rLCB0aGlzKTsKKworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6Y2hhbmdlQXVkaW9Gb3JtYXQoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICBib29sIG9mZmxvYWRPbmx5LAorICAgICAgICBib29sIGhhc1ZpZGVvLAorICAgICAgICB1aW50MzJfdCBmbGFncywKKyAgICAgICAgYm9vbCBpc1N0cmVhbWluZywKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpIHsKKyAgICBzcDxBTWVzc2FnZT4gbWV0YSA9IG5ldyBBTWVzc2FnZTsKKyAgICBtZXRhLT5zZXRNZXNzYWdlKCJmb3JtYXQiLCBmb3JtYXQpOworICAgIG1ldGEtPnNldEludDMyKCJvZmZsb2FkLW9ubHkiLCBvZmZsb2FkT25seSk7CisgICAgbWV0YS0+c2V0SW50MzIoImhhcy12aWRlbyIsIGhhc1ZpZGVvKTsKKyAgICBtZXRhLT5zZXRJbnQzMigiZmxhZ3MiLCBmbGFncyk7CisgICAgbWV0YS0+c2V0SW50MzIoImlzU3RyZWFtaW5nIiwgaXNTdHJlYW1pbmcpOworCisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENoYW5nZUF1ZGlvRm9ybWF0LCB0aGlzKTsKKyAgICBtc2ctPnNldEludDMyKCJxdWV1ZUdlbmVyYXRpb24iLCBnZXRRdWV1ZUdlbmVyYXRpb24odHJ1ZSAvKiBhdWRpbyAqLykpOworICAgIG1zZy0+c2V0TWVzc2FnZSgibm90aWZ5Iiwgbm90aWZ5KTsKKyAgICBtc2ctPnNldE1lc3NhZ2UoIm1ldGEiLCBtZXRhKTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdE9wZW5BdWRpb1Npbms6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJmb3JtYXQiLCAmZm9ybWF0KSk7CisKKyAgICAgICAgICAgIGludDMyX3Qgb2ZmbG9hZE9ubHk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigib2ZmbG9hZC1vbmx5IiwgJm9mZmxvYWRPbmx5KSk7CisKKyAgICAgICAgICAgIGludDMyX3QgaGFzVmlkZW87CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiaGFzLXZpZGVvIiwgJmhhc1ZpZGVvKSk7CisKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImZsYWdzIiwgKGludDMyX3QgKikmZmxhZ3MpKTsKKworICAgICAgICAgICAgdWludDMyX3QgaXNTdHJlYW1pbmc7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiaXNTdHJlYW1pbmciLCAoaW50MzJfdCAqKSZpc1N0cmVhbWluZykpOworCisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBvbk9wZW5BdWRpb1NpbmsoZm9ybWF0LCBvZmZsb2FkT25seSwgaGFzVmlkZW8sIGZsYWdzLCBpc1N0cmVhbWluZyk7CisKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigib2ZmbG9hZCIsIG9mZmxvYWRpbmdBdWRpbygpKTsKKworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRDbG9zZUF1ZGlvU2luazoKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisKKyAgICAgICAgICAgIG9uQ2xvc2VBdWRpb1NpbmsoKTsKKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFN0b3BBdWRpb1Npbms6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1BdWRpb1NpbmstPnN0b3AoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdENoYW5nZUF1ZGlvRm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IHF1ZXVlR2VuZXJhdGlvbjsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJxdWV1ZUdlbmVyYXRpb24iLCAmcXVldWVHZW5lcmF0aW9uKSk7CisKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJub3RpZnkiLCAmbm90aWZ5KSk7CisKKyAgICAgICAgICAgIGlmIChvZmZsb2FkaW5nQXVkaW8oKSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJjaGFuZ2VBdWRpb0Zvcm1hdCBzaG91bGQgTk9UIGJlIGNhbGxlZCBpbiBvZmZsb2FkIG1vZGUiKTsKKyAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJlcnIiLCBJTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtZXRhOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgibWV0YSIsICZtZXRhKSk7CisKKyAgICAgICAgICAgIGlmIChxdWV1ZUdlbmVyYXRpb24gIT0gZ2V0UXVldWVHZW5lcmF0aW9uKHRydWUgLyogYXVkaW8gKi8pCisgICAgICAgICAgICAgICAgICAgIHx8IG1BdWRpb1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBvbkNoYW5nZUF1ZGlvRm9ybWF0KG1ldGEsIG5vdGlmeSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFF1ZXVlRW50cnkgZW50cnk7CisgICAgICAgICAgICBlbnRyeS5tTm90aWZ5Q29uc3VtZWQgPSBub3RpZnk7CisgICAgICAgICAgICBlbnRyeS5tTWV0YSA9IG1ldGE7CisKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgICAgICAgICBtQXVkaW9RdWV1ZS5wdXNoX2JhY2soZW50cnkpOworICAgICAgICAgICAgcG9zdERyYWluQXVkaW9RdWV1ZV9sKCk7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdERyYWluQXVkaW9RdWV1ZToKKyAgICAgICAgeworICAgICAgICAgICAgbURyYWluQXVkaW9RdWV1ZVBlbmRpbmcgPSBmYWxzZTsKKworICAgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImRyYWluR2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7CisgICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPSBnZXREcmFpbkdlbmVyYXRpb24odHJ1ZSAvKiBhdWRpbyAqLykpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG9uRHJhaW5BdWRpb1F1ZXVlKCkpIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBudW1GcmFtZXNQbGF5ZWQ7CisgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobUF1ZGlvU2luay0+Z2V0UG9zaXRpb24oJm51bUZyYW1lc1BsYXllZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXR1c190KU9LKTsKKworICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBBdWRpb1RyYWNrIHJhY2Ugd2hlbiBzdGFydCBpcyBpbW1lZGlhdGVseSBjYWxsZWQgYWZ0ZXIgZmx1c2guCisgICAgICAgICAgICAgICAgdWludDMyX3QgbnVtRnJhbWVzUGVuZGluZ1BsYXlvdXQgPQorICAgICAgICAgICAgICAgICAgICAobU51bUZyYW1lc1dyaXR0ZW4gPiBudW1GcmFtZXNQbGF5ZWQgPworICAgICAgICAgICAgICAgICAgICAgICAgbU51bUZyYW1lc1dyaXR0ZW4gLSBudW1GcmFtZXNQbGF5ZWQgOiAwKTsKKworICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgaG93IGxvbmcgdGhlIGF1ZGlvIHNpbmsgd2lsbCBoYXZlIGRhdGEgdG8KKyAgICAgICAgICAgICAgICAvLyBwbGF5IGJhY2suCisgICAgICAgICAgICAgICAgaW50NjRfdCBkZWxheVVzID0KKyAgICAgICAgICAgICAgICAgICAgbUF1ZGlvU2luay0+bXNlY3NQZXJGcmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAqIG51bUZyYW1lc1BlbmRpbmdQbGF5b3V0ICogMTAwMGxsOworICAgICAgICAgICAgICAgIGlmIChtUGxheWJhY2tSYXRlID4gMS4wZikgeworICAgICAgICAgICAgICAgICAgICBkZWxheVVzIC89IG1QbGF5YmFja1JhdGU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gTGV0J3MgZ2l2ZSBpdCBtb3JlIGRhdGEgYWZ0ZXIgYWJvdXQgaGFsZiB0aGF0IHRpbWUKKyAgICAgICAgICAgICAgICAvLyBoYXMgZWxhcHNlZC4KKyAgICAgICAgICAgICAgICBkZWxheVVzIC89IDI7CisgICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhlIGJ1ZmZlciBzaXplIHRvIGVzdGltYXRlIG1heGltdW0gZGVsYXkgcGVybWl0dGVkLgorICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgbWF4RHJhaW5EZWxheVVzID0gc3RkOjptYXgoCisgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9TaW5rLT5nZXRCdWZmZXJEdXJhdGlvbkluVXMoKSwgKGludDY0X3QpNTAwMDAwIC8qIGhhbGYgc2Vjb25kICovKTsKKyAgICAgICAgICAgICAgICBBTE9HRF9JRihkZWxheVVzID4gbWF4RHJhaW5EZWxheVVzLCAicG9zdERyYWluQXVkaW9RdWV1ZSBsb25nIGRlbGF5OiAlbGxkID4gJWxsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWRlbGF5VXMsIChsb25nIGxvbmcpbWF4RHJhaW5EZWxheVVzKTsKKyAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICAgICAgICAgIHBvc3REcmFpbkF1ZGlvUXVldWVfbChkZWxheVVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdERyYWluVmlkZW9RdWV1ZToKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImRyYWluR2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7CisgICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPSBnZXREcmFpbkdlbmVyYXRpb24oZmFsc2UgLyogYXVkaW8gKi8pKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1EcmFpblZpZGVvUXVldWVQZW5kaW5nID0gZmFsc2U7CisKKyAgICAgICAgICAgIG9uRHJhaW5WaWRlb1F1ZXVlKCk7CisKKyAgICAgICAgICAgIHBvc3REcmFpblZpZGVvUXVldWUoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFBvc3REcmFpblZpZGVvUXVldWU6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJkcmFpbkdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOworICAgICAgICAgICAgaWYgKGdlbmVyYXRpb24gIT0gZ2V0RHJhaW5HZW5lcmF0aW9uKGZhbHNlIC8qIGF1ZGlvICovKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtRHJhaW5WaWRlb1F1ZXVlUGVuZGluZyA9IGZhbHNlOworICAgICAgICAgICAgcG9zdERyYWluVmlkZW9RdWV1ZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0UXVldWVCdWZmZXI6CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uUXVldWVCdWZmZXIobXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFF1ZXVlRU9TOgorICAgICAgICB7CisgICAgICAgICAgICBvblF1ZXVlRU9TKG1zZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRFT1M6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJhdWRpb0VPU0dlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOworICAgICAgICAgICAgaWYgKGdlbmVyYXRpb24gIT0gbUF1ZGlvRU9TR2VuZXJhdGlvbikgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzX3QgZmluYWxSZXN1bHQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZmluYWxSZXN1bHQiLCAmZmluYWxSZXN1bHQpKTsKKyAgICAgICAgICAgIG5vdGlmeUVPUyh0cnVlIC8qIGF1ZGlvICovLCBmaW5hbFJlc3VsdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRDb25maWdQbGF5YmFjazoKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisgICAgICAgICAgICBBdWRpb1BsYXliYWNrUmF0ZSByYXRlOworICAgICAgICAgICAgcmVhZEZyb21BTWVzc2FnZShtc2csICZyYXRlKTsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG9uQ29uZmlnUGxheWJhY2socmF0ZSk7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0R2V0UGxheWJhY2tTZXR0aW5nczoKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisgICAgICAgICAgICBBdWRpb1BsYXliYWNrUmF0ZSByYXRlID0gQVVESU9fUExBWUJBQ0tfUkFURV9ERUZBVUxUOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gb25HZXRQbGF5YmFja1NldHRpbmdzKCZyYXRlKTsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICB3cml0ZVRvQU1lc3NhZ2UocmVzcG9uc2UsIHJhdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOworICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdENvbmZpZ1N5bmM6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworICAgICAgICAgICAgQVZTeW5jU2V0dGluZ3Mgc3luYzsKKyAgICAgICAgICAgIGZsb2F0IHZpZGVvRnBzSGludDsKKyAgICAgICAgICAgIHJlYWRGcm9tQU1lc3NhZ2UobXNnLCAmc3luYywgJnZpZGVvRnBzSGludCk7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBvbkNvbmZpZ1N5bmMoc3luYywgdmlkZW9GcHNIaW50KTsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRHZXRTeW5jU2V0dGluZ3M6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworCisgICAgICAgICAgICBBTE9HVigia1doYXRHZXRTeW5jU2V0dGluZ3MiKTsKKyAgICAgICAgICAgIEFWU3luY1NldHRpbmdzIHN5bmM7CisgICAgICAgICAgICBmbG9hdCB2aWRlb0ZwcyA9IC0xLmY7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBvbkdldFN5bmNTZXR0aW5ncygmc3luYywgJnZpZGVvRnBzKTsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICB3cml0ZVRvQU1lc3NhZ2UocmVzcG9uc2UsIHN5bmMsIHZpZGVvRnBzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRGbHVzaDoKKyAgICAgICAgeworICAgICAgICAgICAgb25GbHVzaChtc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0RGlzYWJsZU9mZmxvYWRBdWRpbzoKKyAgICAgICAgeworICAgICAgICAgICAgb25EaXNhYmxlT2ZmbG9hZEF1ZGlvKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRFbmFibGVPZmZsb2FkQXVkaW86CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uRW5hYmxlT2ZmbG9hZEF1ZGlvKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRQYXVzZToKKyAgICAgICAgeworICAgICAgICAgICAgb25QYXVzZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0UmVzdW1lOgorICAgICAgICB7CisgICAgICAgICAgICBvblJlc3VtZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0U2V0VmlkZW9GcmFtZVJhdGU6CisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb2F0IGZwczsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEZsb2F0KCJmcmFtZS1yYXRlIiwgJmZwcykpOworICAgICAgICAgICAgb25TZXRWaWRlb0ZyYW1lUmF0ZShmcHMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0QXVkaW9UZWFyRG93bjoKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCByZWFzb247CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicmVhc29uIiwgJnJlYXNvbikpOworCisgICAgICAgICAgICBvbkF1ZGlvVGVhckRvd24oKEF1ZGlvVGVhckRvd25SZWFzb24pcmVhc29uKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdEF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dDoKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImRyYWluR2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7CisgICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPSBtQXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0R2VuZXJhdGlvbikgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoIkF1ZGlvIE9mZmxvYWQgdGVhciBkb3duIGR1ZSB0byBwYXVzZSB0aW1lb3V0LiIpOworICAgICAgICAgICAgb25BdWRpb1RlYXJEb3duKGtEdWVUb1RpbWVvdXQpOworICAgICAgICAgICAgbVdha2VMb2NrLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBUUkVTUEFTUygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6OnBvc3REcmFpbkF1ZGlvUXVldWVfbChpbnQ2NF90IGRlbGF5VXMpIHsKKyAgICBpZiAobURyYWluQXVkaW9RdWV1ZVBlbmRpbmcgfHwgbVN5bmNRdWV1ZXMgfHwgbVVzZUF1ZGlvQ2FsbGJhY2spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtQXVkaW9RdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBGSVhNRTogaWYgcGF1c2VkLCB3YWl0IHVudGlsIEF1ZGlvVHJhY2sgc3RvcCgpIGlzIGNvbXBsZXRlIGJlZm9yZSBkZWxpdmVyaW5nIGRhdGEuCisgICAgaWYgKG1QYXVzZWQpIHsKKyAgICAgICAgY29uc3QgaW50NjRfdCBkaWZmVXMgPSBtUGF1c2VEcmFpbkF1ZGlvQWxsb3dlZFVzIC0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyAgICAgICAgaWYgKGRpZmZVcyA+IGRlbGF5VXMpIHsKKyAgICAgICAgICAgIGRlbGF5VXMgPSBkaWZmVXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtRHJhaW5BdWRpb1F1ZXVlUGVuZGluZyA9IHRydWU7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdERyYWluQXVkaW9RdWV1ZSwgdGhpcyk7CisgICAgbXNnLT5zZXRJbnQzMigiZHJhaW5HZW5lcmF0aW9uIiwgbUF1ZGlvRHJhaW5HZW5lcmF0aW9uKTsKKyAgICBtc2ctPnBvc3QoZGVsYXlVcyk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6cHJlcGFyZUZvck1lZGlhUmVuZGVyaW5nU3RhcnRfbCgpIHsKKyAgICBtQXVkaW9SZW5kZXJpbmdTdGFydEdlbmVyYXRpb24gPSBtQXVkaW9EcmFpbkdlbmVyYXRpb247CisgICAgbVZpZGVvUmVuZGVyaW5nU3RhcnRHZW5lcmF0aW9uID0gbVZpZGVvRHJhaW5HZW5lcmF0aW9uOworICAgIG1SZW5kZXJpbmdEYXRhRGVsaXZlcmVkID0gZmFsc2U7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6bm90aWZ5SWZNZWRpYVJlbmRlcmluZ1N0YXJ0ZWRfbCgpIHsKKyAgICBpZiAobVZpZGVvUmVuZGVyaW5nU3RhcnRHZW5lcmF0aW9uID09IG1WaWRlb0RyYWluR2VuZXJhdGlvbiAmJgorICAgICAgICBtQXVkaW9SZW5kZXJpbmdTdGFydEdlbmVyYXRpb24gPT0gbUF1ZGlvRHJhaW5HZW5lcmF0aW9uKSB7CisgICAgICAgIG1SZW5kZXJpbmdEYXRhRGVsaXZlcmVkID0gdHJ1ZTsKKyAgICAgICAgaWYgKG1QYXVzZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtVmlkZW9SZW5kZXJpbmdTdGFydEdlbmVyYXRpb24gPSAtMTsKKyAgICAgICAgbUF1ZGlvUmVuZGVyaW5nU3RhcnRHZW5lcmF0aW9uID0gLTE7CisKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRNZWRpYVJlbmRlcmluZ1N0YXJ0KTsKKyAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgfQorfQorCisvLyBzdGF0aWMKK3NpemVfdCBOdVBsYXllcjI6OlJlbmRlcmVyOjpBdWRpb1NpbmtDYWxsYmFjaygKKyAgICAgICAgTWVkaWFQbGF5ZXIySW50ZXJmYWNlOjpBdWRpb1NpbmsgKiAvKiBhdWRpb1NpbmsgKi8sCisgICAgICAgIHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgIHZvaWQgKmNvb2tpZSwKKyAgICAgICAgTWVkaWFQbGF5ZXIySW50ZXJmYWNlOjpBdWRpb1Npbms6OmNiX2V2ZW50X3QgZXZlbnQpIHsKKyAgICBOdVBsYXllcjI6OlJlbmRlcmVyICptZSA9IChOdVBsYXllcjI6OlJlbmRlcmVyICopY29va2llOworCisgICAgc3dpdGNoIChldmVudCkgeworICAgICAgICBjYXNlIE1lZGlhUGxheWVyMkludGVyZmFjZTo6QXVkaW9TaW5rOjpDQl9FVkVOVF9GSUxMX0JVRkZFUjoKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1lLT5maWxsQXVkaW9CdWZmZXIoYnVmZmVyLCBzaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBNZWRpYVBsYXllcjJJbnRlcmZhY2U6OkF1ZGlvU2luazo6Q0JfRVZFTlRfU1RSRUFNX0VORDoKKyAgICAgICAgeworICAgICAgICAgICAgQUxPR1YoIkF1ZGlvU2luazo6Q0JfRVZFTlRfU1RSRUFNX0VORCIpOworICAgICAgICAgICAgbWUtPm5vdGlmeUVPU0NhbGxiYWNrKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgTWVkaWFQbGF5ZXIySW50ZXJmYWNlOjpBdWRpb1Npbms6OkNCX0VWRU5UX1RFQVJfRE9XTjoKKyAgICAgICAgeworICAgICAgICAgICAgQUxPR1YoIkF1ZGlvU2luazo6Q0JfRVZFTlRfVEVBUl9ET1dOIik7CisgICAgICAgICAgICBtZS0+bm90aWZ5QXVkaW9UZWFyRG93bihrRHVlVG9FcnJvcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6Om5vdGlmeUVPU0NhbGxiYWNrKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAoIW1Vc2VBdWRpb0NhbGxiYWNrKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBub3RpZnlFT1NfbCh0cnVlIC8qIGF1ZGlvICovLCBFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKK30KKworc2l6ZV90IE51UGxheWVyMjo6UmVuZGVyZXI6OmZpbGxBdWRpb0J1ZmZlcih2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmICghbVVzZUF1ZGlvQ2FsbGJhY2spIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgYm9vbCBoYXNFT1MgPSBmYWxzZTsKKworICAgIHNpemVfdCBzaXplQ29waWVkID0gMDsKKyAgICBib29sIGZpcnN0RW50cnkgPSB0cnVlOworICAgIFF1ZXVlRW50cnkgKmVudHJ5OyAgLy8gd2lsbCBiZSB2YWxpZCBhZnRlciB3aGlsZSBsb29wIGlmIGhhc0VPUyBpcyBzZXQuCisgICAgd2hpbGUgKHNpemVDb3BpZWQgPCBzaXplICYmICFtQXVkaW9RdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgIGVudHJ5ID0gJiptQXVkaW9RdWV1ZS5iZWdpbigpOworCisgICAgICAgIGlmIChlbnRyeS0+bUJ1ZmZlciA9PSBOVUxMKSB7IC8vIEVPUworICAgICAgICAgICAgaGFzRU9TID0gdHJ1ZTsKKyAgICAgICAgICAgIG1BdWRpb1F1ZXVlLmVyYXNlKG1BdWRpb1F1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmlyc3RFbnRyeSAmJiBlbnRyeS0+bU9mZnNldCA9PSAwKSB7CisgICAgICAgICAgICBmaXJzdEVudHJ5ID0gZmFsc2U7CisgICAgICAgICAgICBpbnQ2NF90IG1lZGlhVGltZVVzOworICAgICAgICAgICAgQ0hFQ0soZW50cnktPm1CdWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbWVkaWFUaW1lVXMpKTsKKyAgICAgICAgICAgIEFMT0dWKCJmaWxsQXVkaW9CdWZmZXI6IHJlbmRlcmluZyBhdWRpbyBhdCBtZWRpYSB0aW1lICUuMmYgc2VjcyIsIG1lZGlhVGltZVVzIC8gMUU2KTsKKyAgICAgICAgICAgIHNldEF1ZGlvRmlyc3RBbmNob3JUaW1lSWZOZWVkZWRfbChtZWRpYVRpbWVVcyk7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgY29weSA9IGVudHJ5LT5tQnVmZmVyLT5zaXplKCkgLSBlbnRyeS0+bU9mZnNldDsKKyAgICAgICAgc2l6ZV90IHNpemVSZW1haW5pbmcgPSBzaXplIC0gc2l6ZUNvcGllZDsKKyAgICAgICAgaWYgKGNvcHkgPiBzaXplUmVtYWluaW5nKSB7CisgICAgICAgICAgICBjb3B5ID0gc2l6ZVJlbWFpbmluZzsKKyAgICAgICAgfQorCisgICAgICAgIG1lbWNweSgoY2hhciAqKWJ1ZmZlciArIHNpemVDb3BpZWQsCisgICAgICAgICAgICAgICBlbnRyeS0+bUJ1ZmZlci0+ZGF0YSgpICsgZW50cnktPm1PZmZzZXQsCisgICAgICAgICAgICAgICBjb3B5KTsKKworICAgICAgICBlbnRyeS0+bU9mZnNldCArPSBjb3B5OworICAgICAgICBpZiAoZW50cnktPm1PZmZzZXQgPT0gZW50cnktPm1CdWZmZXItPnNpemUoKSkgeworICAgICAgICAgICAgZW50cnktPm1Ob3RpZnlDb25zdW1lZC0+cG9zdCgpOworICAgICAgICAgICAgbUF1ZGlvUXVldWUuZXJhc2UobUF1ZGlvUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICBlbnRyeSA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgc2l6ZUNvcGllZCArPSBjb3B5OworCisgICAgICAgIG5vdGlmeUlmTWVkaWFSZW5kZXJpbmdTdGFydGVkX2woKTsKKyAgICB9CisKKyAgICBpZiAobUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVcyA+PSAwKSB7CisgICAgICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgICAgICBpbnQ2NF90IG5vd01lZGlhVXMgPQorICAgICAgICAgICAgbUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVcyArIG1BdWRpb1NpbmstPmdldFBsYXllZE91dER1cmF0aW9uVXMobm93VXMpOworICAgICAgICAvLyB3ZSBkb24ndCBrbm93IGhvdyBtdWNoIGRhdGEgd2UgYXJlIHF1ZXVlaW5nIGZvciBvZmZsb2FkZWQgdHJhY2tzLgorICAgICAgICBtTWVkaWFDbG9jay0+dXBkYXRlQW5jaG9yKG5vd01lZGlhVXMsIG5vd1VzLCBJTlQ2NF9NQVgpOworICAgIH0KKworICAgIC8vIGZvciBub24tb2ZmbG9hZGVkIGF1ZGlvLCB3ZSBuZWVkIHRvIGNvbXB1dGUgdGhlIGZyYW1lcyB3cml0dGVuIGJlY2F1c2UKKyAgICAvLyB0aGVyZSBpcyBubyBFVkVOVF9TVFJFQU1fRU5EIG5vdGlmaWNhdGlvbi4gVGhlIGZyYW1lcyB3cml0dGVuIGdpdmVzCisgICAgLy8gYW4gZXN0aW1hdGUgb24gdGhlIHBlbmRpbmcgcGxheWVkIG91dCBkdXJhdGlvbi4KKyAgICBpZiAoIW9mZmxvYWRpbmdBdWRpbygpKSB7CisgICAgICAgIG1OdW1GcmFtZXNXcml0dGVuICs9IHNpemVDb3BpZWQgLyBtQXVkaW9TaW5rLT5mcmFtZVNpemUoKTsKKyAgICB9CisKKyAgICBpZiAoaGFzRU9TKSB7CisgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wQXVkaW9TaW5rLCB0aGlzKSktPnBvc3QoKTsKKyAgICAgICAgLy8gQXMgdGhlcmUgaXMgY3VycmVudGx5IG5vIEVWRU5UX1NUUkVBTV9FTkQgY2FsbGJhY2sgbm90aWZpY2F0aW9uIGZvcgorICAgICAgICAvLyBub24tb2ZmbG9hZGVkIGF1ZGlvIHRyYWNrcywgd2UgbmVlZCB0byBwb3N0IHRoZSBFT1Mgb3Vyc2VsdmVzLgorICAgICAgICBpZiAoIW9mZmxvYWRpbmdBdWRpbygpKSB7CisgICAgICAgICAgICBpbnQ2NF90IHBvc3RFT1NEZWxheVVzID0gMDsKKyAgICAgICAgICAgIGlmIChtQXVkaW9TaW5rLT5uZWVkc1RyYWlsaW5nUGFkZGluZygpKSB7CisgICAgICAgICAgICAgICAgcG9zdEVPU0RlbGF5VXMgPSBnZXRQZW5kaW5nQXVkaW9QbGF5b3V0RHVyYXRpb25VcyhBTG9vcGVyOjpHZXROb3dVcygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJmaWxsQXVkaW9CdWZmZXI6IG5vdGlmeUVPU19sICIKKyAgICAgICAgICAgICAgICAgICAgIm1OdW1GcmFtZXNXcml0dGVuOiV1ICBmaW5hbFJlc3VsdDolZCAgcG9zdEVPU0RlbGF5OiVsbGQiLAorICAgICAgICAgICAgICAgICAgICBtTnVtRnJhbWVzV3JpdHRlbiwgZW50cnktPm1GaW5hbFJlc3VsdCwgKGxvbmcgbG9uZylwb3N0RU9TRGVsYXlVcyk7CisgICAgICAgICAgICBub3RpZnlFT1NfbCh0cnVlIC8qIGF1ZGlvICovLCBlbnRyeS0+bUZpbmFsUmVzdWx0LCBwb3N0RU9TRGVsYXlVcyk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNpemVDb3BpZWQ7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6ZHJhaW5BdWRpb1F1ZXVlVW50aWxMYXN0RU9TKCkgeworICAgIExpc3Q8UXVldWVFbnRyeT46Oml0ZXJhdG9yIGl0ID0gbUF1ZGlvUXVldWUuYmVnaW4oKSwgaXRFT1MgPSBpdDsKKyAgICBib29sIGZvdW5kRU9TID0gZmFsc2U7CisgICAgd2hpbGUgKGl0ICE9IG1BdWRpb1F1ZXVlLmVuZCgpKSB7CisgICAgICAgIGludDMyX3QgZW9zOworICAgICAgICBRdWV1ZUVudHJ5ICplbnRyeSA9ICYqaXQrKzsKKyAgICAgICAgaWYgKChlbnRyeS0+bUJ1ZmZlciA9PSBudWxscHRyICYmIGVudHJ5LT5tTm90aWZ5Q29uc3VtZWQgPT0gbnVsbHB0cikKKyAgICAgICAgICAgICAgICB8fCAoZW50cnktPm1Ob3RpZnlDb25zdW1lZC0+ZmluZEludDMyKCJlb3MiLCAmZW9zKSAmJiBlb3MgIT0gMCkpIHsKKyAgICAgICAgICAgIGl0RU9TID0gaXQ7CisgICAgICAgICAgICBmb3VuZEVPUyA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZm91bmRFT1MpIHsKKyAgICAgICAgLy8gcG9zdCBhbGwgcmVwbGllcyBiZWZvcmUgRU9TIGFuZCBkcm9wIHRoZSBzYW1wbGVzCisgICAgICAgIGZvciAoaXQgPSBtQXVkaW9RdWV1ZS5iZWdpbigpOyBpdCAhPSBpdEVPUzsgaXQrKykgeworICAgICAgICAgICAgaWYgKGl0LT5tQnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXQtPm1Ob3RpZnlDb25zdW1lZCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGRlbGF5IGRvZXNuJ3QgbWF0dGVyIGFzIHdlIGRvbid0IGV2ZW4gaGF2ZSBhbiBBdWRpb1RyYWNrCisgICAgICAgICAgICAgICAgICAgIG5vdGlmeUVPUyh0cnVlIC8qIGF1ZGlvICovLCBpdC0+bUZpbmFsUmVzdWx0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBUQUcgZm9yIHJlLW9wZW5pbmcgYXVkaW8gc2luay4KKyAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2VBdWRpb0Zvcm1hdChpdC0+bU1ldGEsIGl0LT5tTm90aWZ5Q29uc3VtZWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaXQtPm1Ob3RpZnlDb25zdW1lZC0+cG9zdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1BdWRpb1F1ZXVlLmVyYXNlKG1BdWRpb1F1ZXVlLmJlZ2luKCksIGl0RU9TKTsKKyAgICB9Cit9CisKK2Jvb2wgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6b25EcmFpbkF1ZGlvUXVldWUoKSB7CisgICAgLy8gZG8gbm90IGRyYWluIGF1ZGlvIGR1cmluZyB0ZWFyZG93biBhcyBxdWV1ZWQgYnVmZmVycyBtYXkgYmUgaW52YWxpZC4KKyAgICBpZiAobUF1ZGlvVG9ybkRvd24pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBUT0RPOiBUaGlzIGNhbGwgdG8gZ2V0UG9zaXRpb24gY2hlY2tzIGlmIEF1ZGlvVHJhY2sgaGFzIGJlZW4gY3JlYXRlZAorICAgIC8vIGluIEF1ZGlvU2luayBiZWZvcmUgZHJhaW5pbmcgYXVkaW8uIElmIEF1ZGlvVHJhY2sgZG9lc24ndCBleGlzdCwgdGhlbgorICAgIC8vIENIRUNLcyBvbiBnZXRQb3NpdGlvbiB3aWxsIGZhaWwuCisgICAgLy8gV2Ugc3RpbGwgbmVlZCB0byBmaWd1cmUgb3V0IHdoeSBBdWRpb1RyYWNrIGlzIG5vdCBjcmVhdGVkIHdoZW4KKyAgICAvLyB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4gT25lIHBvc3NpYmxlIHJlYXNvbiBjb3VsZCBiZSBsZWZ0b3ZlcgorICAgIC8vIGF1ZGlvLiBBbm90aGVyIHBvc3NpYmxlIHBsYWNlIGlzIHRvIGNoZWNrIHdoZXRoZXIgZGVjb2RlcgorICAgIC8vIGhhcyByZWNlaXZlZCBJTkZPX0ZPUk1BVF9DSEFOR0VEIGFzIHRoZSBmaXJzdCBidWZmZXIgc2luY2UKKyAgICAvLyBBdWRpb1NpbmsgaXMgb3BlbmVkIHRoZXJlLCBhbmQgcG9zc2libGUgaW50ZXJhY3Rpb25zIHdpdGggZmx1c2gKKyAgICAvLyBpbW1lZGlhdGVseSBhZnRlciBzdGFydC4gSW52ZXN0aWdhdGUgZXJyb3IgbWVzc2FnZQorICAgIC8vICJ2b3JiaXNfZHNwX3N5bnRoZXNpcyByZXR1cm5lZCAtMTM1IiwgYWxvbmcgd2l0aCBSVFNQLgorICAgIHVpbnQzMl90IG51bUZyYW1lc1BsYXllZDsKKyAgICBpZiAobUF1ZGlvU2luay0+Z2V0UG9zaXRpb24oJm51bUZyYW1lc1BsYXllZCkgIT0gT0spIHsKKyAgICAgICAgLy8gV2hlbiBnZXRQb3NpdGlvbiBmYWlscywgcmVuZGVyZXIgd2lsbCBub3QgcmVzY2hlZHVsZSB0aGUgZHJhaW5pbmcKKyAgICAgICAgLy8gdW5sZXNzIG5ldyBzYW1wbGVzIGFyZSBxdWV1ZWQuCisgICAgICAgIC8vIElmIHdlIGhhdmUgcGVuZGluZyBFT1MgKG9yICJlb3MiIG1hcmtlciBmb3IgZGlzY29udGludWl0aWVzKSwgd2UgbmVlZAorICAgICAgICAvLyB0byBwb3N0IHRoZXNlIG5vdyBhcyBOdVBsYXllcjJEZWNvZGVyIG1pZ2h0IGJlIHdhaXRpbmcgZm9yIGl0LgorICAgICAgICBkcmFpbkF1ZGlvUXVldWVVbnRpbExhc3RFT1MoKTsKKworICAgICAgICBBTE9HVygib25EcmFpbkF1ZGlvUXVldWUoKTogYXVkaW8gc2luayBpcyBub3QgcmVhZHkiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworI2lmIDAKKyAgICBzc2l6ZV90IG51bUZyYW1lc0F2YWlsYWJsZVRvV3JpdGUgPQorICAgICAgICBtQXVkaW9TaW5rLT5mcmFtZUNvdW50KCkgLSAobU51bUZyYW1lc1dyaXR0ZW4gLSBudW1GcmFtZXNQbGF5ZWQpOworCisgICAgaWYgKG51bUZyYW1lc0F2YWlsYWJsZVRvV3JpdGUgPT0gbUF1ZGlvU2luay0+ZnJhbWVDb3VudCgpKSB7CisgICAgICAgIEFMT0dJKCJhdWRpbyBzaW5rIHVuZGVycnVuIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoImF1ZGlvIHF1ZXVlIGhhcyAlZCBmcmFtZXMgbGVmdCB0byBwbGF5IiwKKyAgICAgICAgICAgICBtQXVkaW9TaW5rLT5mcmFtZUNvdW50KCkgLSBudW1GcmFtZXNBdmFpbGFibGVUb1dyaXRlKTsKKyAgICB9CisjZW5kaWYKKworICAgIHVpbnQzMl90IHByZXZGcmFtZXNXcml0dGVuID0gbU51bUZyYW1lc1dyaXR0ZW47CisgICAgd2hpbGUgKCFtQXVkaW9RdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgIFF1ZXVlRW50cnkgKmVudHJ5ID0gJiptQXVkaW9RdWV1ZS5iZWdpbigpOworCisgICAgICAgIGlmIChlbnRyeS0+bUJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoZW50cnktPm1Ob3RpZnlDb25zdW1lZCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgLy8gVEFHIGZvciByZS1vcGVuIGF1ZGlvIHNpbmsuCisgICAgICAgICAgICAgICAgb25DaGFuZ2VBdWRpb0Zvcm1hdChlbnRyeS0+bU1ldGEsIGVudHJ5LT5tTm90aWZ5Q29uc3VtZWQpOworICAgICAgICAgICAgICAgIG1BdWRpb1F1ZXVlLmVyYXNlKG1BdWRpb1F1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBFT1MKKyAgICAgICAgICAgIGlmIChtUGF1c2VkKSB7CisgICAgICAgICAgICAgICAgLy8gRG8gbm90IG5vdGlmeSBFT1Mgd2hlbiBwYXVzZWQuCisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gYXZvaWQgc3dpdGNoIHRvIG5leHQgY2xpcCB3aGlsZSBpbiBwYXVzZS4KKyAgICAgICAgICAgICAgICBBTE9HVigib25EcmFpbkF1ZGlvUXVldWUoKTogRG8gbm90IG5vdGlmeSBFT1Mgd2hlbiBwYXVzZWQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludDY0X3QgcG9zdEVPU0RlbGF5VXMgPSAwOworICAgICAgICAgICAgaWYgKG1BdWRpb1NpbmstPm5lZWRzVHJhaWxpbmdQYWRkaW5nKCkpIHsKKyAgICAgICAgICAgICAgICBwb3N0RU9TRGVsYXlVcyA9IGdldFBlbmRpbmdBdWRpb1BsYXlvdXREdXJhdGlvblVzKEFMb29wZXI6OkdldE5vd1VzKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm90aWZ5RU9TKHRydWUgLyogYXVkaW8gKi8sIGVudHJ5LT5tRmluYWxSZXN1bHQsIHBvc3RFT1NEZWxheVVzKTsKKyAgICAgICAgICAgIG1MYXN0QXVkaW9NZWRpYVRpbWVVcyA9IGdldER1cmF0aW9uVXNJZlBsYXllZEF0U2FtcGxlUmF0ZShtTnVtRnJhbWVzV3JpdHRlbik7CisKKyAgICAgICAgICAgIG1BdWRpb1F1ZXVlLmVyYXNlKG1BdWRpb1F1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgZW50cnkgPSBOVUxMOworICAgICAgICAgICAgaWYgKG1BdWRpb1NpbmstPm5lZWRzVHJhaWxpbmdQYWRkaW5nKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB3ZSdyZSBub3QgaW4gZ2FwbGVzcyBwbGF5YmFjayAoaS5lLiB0aHJvdWdoIHNldE5leHRQbGF5ZXIpLCB3ZQorICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gc3RvcCB0aGUgdHJhY2sgaGVyZSwgYmVjYXVzZSB0aGF0IHdpbGwgcGxheSBvdXQgdGhlIGxhc3QKKyAgICAgICAgICAgICAgICAvLyBsaXR0bGUgYml0IGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuIE90aGVyd2lzZSBzaG9ydCBmaWxlcyB3b24ndCBwbGF5LgorICAgICAgICAgICAgICAgIG1BdWRpb1NpbmstPnN0b3AoKTsKKyAgICAgICAgICAgICAgICBtTnVtRnJhbWVzV3JpdHRlbiA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBtTGFzdEF1ZGlvQnVmZmVyRHJhaW5lZCA9IGVudHJ5LT5tQnVmZmVyT3JkaW5hbDsKKworICAgICAgICAvLyBpZ25vcmUgMC1zaXplZCBidWZmZXIgd2hpY2ggY291bGQgYmUgRU9TIG1hcmtlciB3aXRoIG5vIGRhdGEKKyAgICAgICAgaWYgKGVudHJ5LT5tT2Zmc2V0ID09IDAgJiYgZW50cnktPm1CdWZmZXItPnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGludDY0X3QgbWVkaWFUaW1lVXM7CisgICAgICAgICAgICBDSEVDSyhlbnRyeS0+bUJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZtZWRpYVRpbWVVcykpOworICAgICAgICAgICAgQUxPR1YoIm9uRHJhaW5BdWRpb1F1ZXVlOiByZW5kZXJpbmcgYXVkaW8gYXQgbWVkaWEgdGltZSAlLjJmIHNlY3MiLAorICAgICAgICAgICAgICAgICAgICBtZWRpYVRpbWVVcyAvIDFFNik7CisgICAgICAgICAgICBvbk5ld0F1ZGlvTWVkaWFUaW1lKG1lZGlhVGltZVVzKTsKKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBjb3B5ID0gZW50cnktPm1CdWZmZXItPnNpemUoKSAtIGVudHJ5LT5tT2Zmc2V0OworCisgICAgICAgIHNzaXplX3Qgd3JpdHRlbiA9IG1BdWRpb1NpbmstPndyaXRlKGVudHJ5LT5tQnVmZmVyLT5kYXRhKCkgKyBlbnRyeS0+bU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weSwgZmFsc2UgLyogYmxvY2tpbmcgKi8pOworICAgICAgICBpZiAod3JpdHRlbiA8IDApIHsKKyAgICAgICAgICAgIC8vIEFuIGVycm9yIGluIEF1ZGlvU2luayB3cml0ZS4gUGVyaGFwcyB0aGUgQXVkaW9TaW5rIHdhcyBub3QgcHJvcGVybHkgb3BlbmVkLgorICAgICAgICAgICAgaWYgKHdyaXR0ZW4gPT0gV09VTERfQkxPQ0spIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9TaW5rIHdyaXRlIHdvdWxkIGJsb2NrIHdoZW4gd3JpdGluZyAlenUgYnl0ZXMiLCBjb3B5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkF1ZGlvU2luayB3cml0ZSBlcnJvciglemQpIHdoZW4gd3JpdGluZyAlenUgYnl0ZXMiLCB3cml0dGVuLCBjb3B5KTsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbiB3aGVuIEF1ZGlvU2luayB3YXMgb3BlbmVkIHdpdGggZG9Ob3RSZWNvbm5lY3QgZmxhZyBzZXQgdG8KKyAgICAgICAgICAgICAgICAvLyB0cnVlLCBpbiB3aGljaCBjYXNlIHRoZSBOdVBsYXllcjIgd2lsbCBoYW5kbGUgdGhlIHJlY29ubmVjdC4KKyAgICAgICAgICAgICAgICBub3RpZnlBdWRpb1RlYXJEb3duKGtEdWVUb0Vycm9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZW50cnktPm1PZmZzZXQgKz0gd3JpdHRlbjsKKyAgICAgICAgc2l6ZV90IHJlbWFpbmRlciA9IGVudHJ5LT5tQnVmZmVyLT5zaXplKCkgLSBlbnRyeS0+bU9mZnNldDsKKyAgICAgICAgaWYgKChzc2l6ZV90KXJlbWFpbmRlciA8IG1BdWRpb1NpbmstPmZyYW1lU2l6ZSgpKSB7CisgICAgICAgICAgICBpZiAocmVtYWluZGVyID4gMCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJDb3JydXB0ZWQgYXVkaW8gYnVmZmVyIGhhcyBmcmFjdGlvbmFsIGZyYW1lcywgZGlzY2FyZGluZyAlenUgYnl0ZXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmRlcik7CisgICAgICAgICAgICAgICAgZW50cnktPm1PZmZzZXQgKz0gcmVtYWluZGVyOworICAgICAgICAgICAgICAgIGNvcHkgLT0gcmVtYWluZGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlbnRyeS0+bU5vdGlmeUNvbnN1bWVkLT5wb3N0KCk7CisgICAgICAgICAgICBtQXVkaW9RdWV1ZS5lcmFzZShtQXVkaW9RdWV1ZS5iZWdpbigpKTsKKworICAgICAgICAgICAgZW50cnkgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IGNvcGllZEZyYW1lcyA9IHdyaXR0ZW4gLyBtQXVkaW9TaW5rLT5mcmFtZVNpemUoKTsKKyAgICAgICAgbU51bUZyYW1lc1dyaXR0ZW4gKz0gY29waWVkRnJhbWVzOworCisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgICAgICAgICBpbnQ2NF90IG1heFRpbWVNZWRpYTsKKyAgICAgICAgICAgIG1heFRpbWVNZWRpYSA9CisgICAgICAgICAgICAgICAgbUFuY2hvclRpbWVNZWRpYVVzICsKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KShtYXgoKGxvbmcgbG9uZyltTnVtRnJhbWVzV3JpdHRlbiAtIG1BbmNob3JOdW1GcmFtZXNXcml0dGVuLCAwTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMTAwMExMICogbUF1ZGlvU2luay0+bXNlY3NQZXJGcmFtZSgpKTsKKyAgICAgICAgICAgIG1NZWRpYUNsb2NrLT51cGRhdGVNYXhUaW1lTWVkaWEobWF4VGltZU1lZGlhKTsKKworICAgICAgICAgICAgbm90aWZ5SWZNZWRpYVJlbmRlcmluZ1N0YXJ0ZWRfbCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHdyaXR0ZW4gIT0gKHNzaXplX3QpY29weSkgeworICAgICAgICAgICAgLy8gQSBzaG9ydCBjb3VudCB3YXMgcmVjZWl2ZWQgZnJvbSBBdWRpb1Npbms6OndyaXRlKCkKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBBdWRpb1Npbmsgd3JpdGUgaXMgY2FsbGVkIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAgICAgICAgICAgLy8gSXQgbWF5IHJldHVybiB3aXRoIGEgc2hvcnQgY291bnQgd2hlbjoKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyAxKSBTaXplIHRvIGJlIGNvcGllZCBpcyBub3QgYSBtdWx0aXBsZSBvZiB0aGUgZnJhbWUgc2l6ZS4gRnJhY3Rpb25hbCBmcmFtZXMgYXJlCisgICAgICAgICAgICAvLyAgICBkaXNjYXJkZWQuCisgICAgICAgICAgICAvLyAyKSBUaGUgZGF0YSB0byBiZSBjb3BpZWQgZXhjZWVkcyB0aGUgYXZhaWxhYmxlIGJ1ZmZlciBpbiBBdWRpb1NpbmsuCisgICAgICAgICAgICAvLyAzKSBBbiBlcnJvciBvY2N1cnMgYW5kIGRhdGEgaGFzIGJlZW4gcGFydGlhbGx5IGNvcGllZCB0byB0aGUgYnVmZmVyIGluIEF1ZGlvU2luay4KKyAgICAgICAgICAgIC8vIDQpIEF1ZGlvU2luayBpcyBhbiBBdWRpb0NhY2hlIGZvciBkYXRhIHJldHJpZXZhbCwgYW5kIHRoZSBBdWRpb0NhY2hlIGlzIGV4Y2VlZGVkLgorCisgICAgICAgICAgICAvLyAoQ2FzZSAxKQorICAgICAgICAgICAgLy8gTXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBmcmFtZSBzaXplLiAgSWYgaXQgaXMgbm90IGEgbXVsdGlwbGUgb2YgYSBmcmFtZSBzaXplLCBpdAorICAgICAgICAgICAgLy8gbmVlZHMgdG8gZmFpbCwgYXMgd2Ugc2hvdWxkIG5vdCBjYXJyeSBvdmVyIGZyYWN0aW9uYWwgZnJhbWVzIGJldHdlZW4gY2FsbHMuCisgICAgICAgICAgICBDSEVDS19FUShjb3B5ICUgbUF1ZGlvU2luay0+ZnJhbWVTaXplKCksIDB1KTsKKworICAgICAgICAgICAgLy8gKENhc2UgMiwgMywgNCkKKyAgICAgICAgICAgIC8vIFJldHVybiBlYXJseSB0byB0aGUgY2FsbGVyLgorICAgICAgICAgICAgLy8gQmV3YXJlIG9mIGNhbGxpbmcgaW1tZWRpYXRlbHkgYWdhaW4gYXMgdGhpcyBtYXkgYnVzeS1sb29wIGlmIHlvdSBhcmUgbm90IGNhcmVmdWwuCisgICAgICAgICAgICBBTE9HVigiQXVkaW9TaW5rIHdyaXRlIHNob3J0IGZyYW1lIGNvdW50ICV6ZCA8ICV6dSIsIHdyaXR0ZW4sIGNvcHkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBjYWxjdWxhdGUgd2hldGhlciB3ZSBuZWVkIHRvIHJlc2NoZWR1bGUgYW5vdGhlciB3cml0ZS4KKyAgICBib29sIHJlc2NoZWR1bGUgPSAhbUF1ZGlvUXVldWUuZW1wdHkoKQorICAgICAgICAgICAgJiYgKCFtUGF1c2VkCisgICAgICAgICAgICAgICAgfHwgcHJldkZyYW1lc1dyaXR0ZW4gIT0gbU51bUZyYW1lc1dyaXR0ZW4pOyAvLyBwZXJtaXQgcGF1c2UgdG8gZmlsbCBidWZmZXJzCisgICAgLy9BTE9HRCgicmVzY2hlZHVsZTolZCAgZW1wdHk6JWQgIG1QYXVzZWQ6JWQgIHByZXZGcmFtZXNXcml0dGVuOiV1ICBtTnVtRnJhbWVzV3JpdHRlbjoldSIsCisgICAgLy8gICAgICAgIHJlc2NoZWR1bGUsIG1BdWRpb1F1ZXVlLmVtcHR5KCksIG1QYXVzZWQsIHByZXZGcmFtZXNXcml0dGVuLCBtTnVtRnJhbWVzV3JpdHRlbik7CisgICAgcmV0dXJuIHJlc2NoZWR1bGU7Cit9CisKK2ludDY0X3QgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6Z2V0RHVyYXRpb25Vc0lmUGxheWVkQXRTYW1wbGVSYXRlKHVpbnQzMl90IG51bUZyYW1lcykgeworICAgIGludDMyX3Qgc2FtcGxlUmF0ZSA9IG9mZmxvYWRpbmdBdWRpbygpID8KKyAgICAgICAgICAgIG1DdXJyZW50T2ZmbG9hZEluZm8uc2FtcGxlX3JhdGUgOiBtQ3VycmVudFBjbUluZm8ubVNhbXBsZVJhdGU7CisgICAgaWYgKHNhbXBsZVJhdGUgPT0gMCkgeworICAgICAgICBBTE9HRSgic2FtcGxlUmF0ZSBpcyAwIGluICVzIG1vZGUiLCBvZmZsb2FkaW5nQXVkaW8oKSA/ICJvZmZsb2FkIiA6ICJub24tb2ZmbG9hZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLy8gVE9ETzogcmVtb3ZlIHRoZSAoaW50MzJfdCkgY2FzdGluZyBiZWxvdyBhcyBpdCBtYXkgb3ZlcmZsb3cgYXQgMTIuNCBob3Vycy4KKyAgICByZXR1cm4gKGludDY0X3QpKChpbnQzMl90KW51bUZyYW1lcyAqIDEwMDAwMDBMTCAvIHNhbXBsZVJhdGUpOworfQorCisvLyBDYWxjdWxhdGUgZHVyYXRpb24gb2YgcGVuZGluZyBzYW1wbGVzIGlmIHBsYXllZCBhdCBub3JtYWwgcmF0ZSAoaS5lLiwgMS4wKS4KK2ludDY0X3QgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6Z2V0UGVuZGluZ0F1ZGlvUGxheW91dER1cmF0aW9uVXMoaW50NjRfdCBub3dVcykgeworICAgIGludDY0X3Qgd3JpdHRlbkF1ZGlvRHVyYXRpb25VcyA9IGdldER1cmF0aW9uVXNJZlBsYXllZEF0U2FtcGxlUmF0ZShtTnVtRnJhbWVzV3JpdHRlbik7CisgICAgaWYgKG1Vc2VWaXJ0dWFsQXVkaW9TaW5rKSB7CisgICAgICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgICAgICBpbnQ2NF90IG1lZGlhVXM7CisgICAgICAgIGlmIChtTWVkaWFDbG9jay0+Z2V0TWVkaWFUaW1lKG5vd1VzLCAmbWVkaWFVcykgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiAwbGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gd3JpdHRlbkF1ZGlvRHVyYXRpb25VcyAtIChtZWRpYVVzIC0gbUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCBpbnQ2NF90IGF1ZGlvU2lua1BsYXllZFVzID0gbUF1ZGlvU2luay0+Z2V0UGxheWVkT3V0RHVyYXRpb25Vcyhub3dVcyk7CisgICAgaW50NjRfdCBwZW5kaW5nVXMgPSB3cml0dGVuQXVkaW9EdXJhdGlvblVzIC0gYXVkaW9TaW5rUGxheWVkVXM7CisgICAgaWYgKHBlbmRpbmdVcyA8IDApIHsKKyAgICAgICAgLy8gVGhpcyBzaG91bGRuJ3QgaGFwcGVuIHVubGVzcyB0aGUgdGltZXN0YW1wIGlzIHN0YWxlLgorICAgICAgICBBTE9HVygiJXM6IHBlbmRpbmdVcyAlbGxkIDwgMCwgY2xhbXBpbmcgdG8gemVybywgcG90ZW50aWFsIHJlc3VtZSBhZnRlciBwYXVzZSAiCisgICAgICAgICAgICAgICAgIndyaXR0ZW5BdWRpb0R1cmF0aW9uVXM6ICVsbGQsIGF1ZGlvU2lua1BsYXllZFVzOiAlbGxkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgKGxvbmcgbG9uZylwZW5kaW5nVXMsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyl3cml0dGVuQXVkaW9EdXJhdGlvblVzLCAobG9uZyBsb25nKWF1ZGlvU2lua1BsYXllZFVzKTsKKyAgICAgICAgcGVuZGluZ1VzID0gMDsKKyAgICB9CisgICAgcmV0dXJuIHBlbmRpbmdVczsKK30KKworaW50NjRfdCBOdVBsYXllcjI6OlJlbmRlcmVyOjpnZXRSZWFsVGltZVVzKGludDY0X3QgbWVkaWFUaW1lVXMsIGludDY0X3Qgbm93VXMpIHsKKyAgICBpbnQ2NF90IHJlYWxVczsKKyAgICBpZiAobU1lZGlhQ2xvY2stPmdldFJlYWxUaW1lRm9yKG1lZGlhVGltZVVzLCAmcmVhbFVzKSAhPSBPSykgeworICAgICAgICAvLyBJZiBmYWlsZWQgdG8gZ2V0IGN1cnJlbnQgcG9zaXRpb24sIGUuZy4gZHVlIHRvIGF1ZGlvIGNsb2NrIGlzCisgICAgICAgIC8vIG5vdCByZWFkeSwgdGhlbiBqdXN0IHBsYXkgb3V0IHZpZGVvIGltbWVkaWF0ZWx5IHdpdGhvdXQgZGVsYXkuCisgICAgICAgIHJldHVybiBub3dVczsKKyAgICB9CisgICAgcmV0dXJuIHJlYWxVczsKK30KKwordm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpvbk5ld0F1ZGlvTWVkaWFUaW1lKGludDY0X3QgbWVkaWFUaW1lVXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIC8vIFRSSUNLWTogdm9yYmlzIGRlY29kZXIgZ2VuZXJhdGVzIG11bHRpcGxlIGZyYW1lcyB3aXRoIHRoZSBzYW1lCisgICAgLy8gdGltZXN0YW1wLCBzbyBvbmx5IHVwZGF0ZSBvbiB0aGUgZmlyc3QgZnJhbWUgd2l0aCBhIGdpdmVuIHRpbWVzdGFtcAorICAgIGlmIChtZWRpYVRpbWVVcyA9PSBtQW5jaG9yVGltZU1lZGlhVXMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzZXRBdWRpb0ZpcnN0QW5jaG9yVGltZUlmTmVlZGVkX2wobWVkaWFUaW1lVXMpOworCisgICAgLy8gbU5leHRBdWRpb0Nsb2NrVXBkYXRlVGltZVVzIGlzIC0xIGlmIHdlJ3JlIHdhaXRpbmcgZm9yIGF1ZGlvIHNpbmsgdG8gc3RhcnQKKyAgICBpZiAobU5leHRBdWRpb0Nsb2NrVXBkYXRlVGltZVVzID09IC0xKSB7CisgICAgICAgIEF1ZGlvVGltZXN0YW1wIHRzOworICAgICAgICBpZiAobUF1ZGlvU2luay0+Z2V0VGltZXN0YW1wKHRzKSA9PSBPSyAmJiB0cy5tUG9zaXRpb24gPiAwKSB7CisgICAgICAgICAgICBtTmV4dEF1ZGlvQ2xvY2tVcGRhdGVUaW1lVXMgPSAwOyAvLyBzdGFydCBvdXIgY2xvY2sgdXBkYXRlcworICAgICAgICB9CisgICAgfQorICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgIGlmIChtTmV4dEF1ZGlvQ2xvY2tVcGRhdGVUaW1lVXMgPj0gMCkgeworICAgICAgICBpZiAobm93VXMgPj0gbU5leHRBdWRpb0Nsb2NrVXBkYXRlVGltZVVzKSB7CisgICAgICAgICAgICBpbnQ2NF90IG5vd01lZGlhVXMgPSBtZWRpYVRpbWVVcyAtIGdldFBlbmRpbmdBdWRpb1BsYXlvdXREdXJhdGlvblVzKG5vd1VzKTsKKyAgICAgICAgICAgIG1NZWRpYUNsb2NrLT51cGRhdGVBbmNob3Iobm93TWVkaWFVcywgbm93VXMsIG1lZGlhVGltZVVzKTsKKyAgICAgICAgICAgIG1Vc2VWaXJ0dWFsQXVkaW9TaW5rID0gZmFsc2U7CisgICAgICAgICAgICBtTmV4dEF1ZGlvQ2xvY2tVcGRhdGVUaW1lVXMgPSBub3dVcyArIGtNaW5pbXVtQXVkaW9DbG9ja1VwZGF0ZVBlcmlvZFVzOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50NjRfdCB1bnVzZWQ7CisgICAgICAgIGlmICgobU1lZGlhQ2xvY2stPmdldE1lZGlhVGltZShub3dVcywgJnVudXNlZCkgIT0gT0spCisgICAgICAgICAgICAgICAgJiYgKGdldER1cmF0aW9uVXNJZlBsYXllZEF0U2FtcGxlUmF0ZShtTnVtRnJhbWVzV3JpdHRlbikKKyAgICAgICAgICAgICAgICAgICAgICAgID4ga01heEFsbG93ZWRBdWRpb1NpbmtEZWxheVVzKSkgeworICAgICAgICAgICAgLy8gRW5vdWdoIGRhdGEgaGFzIGJlZW4gc2VudCB0byBBdWRpb1NpbmssIGJ1dCBBdWRpb1NpbmsgaGFzIG5vdCByZW5kZXJlZAorICAgICAgICAgICAgLy8gYW55IGRhdGEgeWV0LiBTb21ldGhpbmcgaXMgd3Jvbmcgd2l0aCBBdWRpb1NpbmssIGUuZy4sIHRoZSBkZXZpY2UgaXMgbm90CisgICAgICAgICAgICAvLyBjb25uZWN0ZWQgdG8gYXVkaW8gb3V0LgorICAgICAgICAgICAgLy8gU3dpdGNoIHRvIHN5c3RlbSBjbG9jay4gVGhpcyBlc3NlbnRpYWxseSBjcmVhdGVzIGEgdmlydHVhbCBBdWRpb1Npbmsgd2l0aAorICAgICAgICAgICAgLy8gaW5pdGlhbCBsYXRlbnR5IG9mIGdldER1cmF0aW9uVXNJZlBsYXllZEF0U2FtcGxlUmF0ZShtTnVtRnJhbWVzV3JpdHRlbikuCisgICAgICAgICAgICAvLyBUaGlzIHZpcnR1YWwgQXVkaW9TaW5rIHJlbmRlcnMgYXVkaW8gZGF0YSBzdGFydGluZyBmcm9tIHRoZSB2ZXJ5IGZpcnN0IHNhbXBsZQorICAgICAgICAgICAgLy8gYW5kIGl0J3MgcGFjZWQgYnkgc3lzdGVtIGNsb2NrLgorICAgICAgICAgICAgQUxPR1coIkF1ZGlvU2luayBzdHVjay4gQVJFIFlPVSBDT05ORUNURUQgVE8gQVVESU8gT1VUPyBTd2l0Y2hpbmcgdG8gc3lzdGVtIGNsb2NrLiIpOworICAgICAgICAgICAgbU1lZGlhQ2xvY2stPnVwZGF0ZUFuY2hvcihtQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzLCBub3dVcywgbWVkaWFUaW1lVXMpOworICAgICAgICAgICAgbVVzZVZpcnR1YWxBdWRpb1NpbmsgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIG1BbmNob3JOdW1GcmFtZXNXcml0dGVuID0gbU51bUZyYW1lc1dyaXR0ZW47CisgICAgbUFuY2hvclRpbWVNZWRpYVVzID0gbWVkaWFUaW1lVXM7Cit9CisKKy8vIENhbGxlZCB3aXRob3V0IG1Mb2NrIGFjcXVpcmVkLgordm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpwb3N0RHJhaW5WaWRlb1F1ZXVlKCkgeworICAgIGlmIChtRHJhaW5WaWRlb1F1ZXVlUGVuZGluZworICAgICAgICAgICAgfHwgZ2V0U3luY1F1ZXVlcygpCisgICAgICAgICAgICB8fCAobVBhdXNlZCAmJiBtVmlkZW9TYW1wbGVSZWNlaXZlZCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtVmlkZW9RdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBRdWV1ZUVudHJ5ICZlbnRyeSA9ICptVmlkZW9RdWV1ZS5iZWdpbigpOworCisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdERyYWluVmlkZW9RdWV1ZSwgdGhpcyk7CisgICAgbXNnLT5zZXRJbnQzMigiZHJhaW5HZW5lcmF0aW9uIiwgZ2V0RHJhaW5HZW5lcmF0aW9uKGZhbHNlIC8qIGF1ZGlvICovKSk7CisKKyAgICBpZiAoZW50cnkubUJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIC8vIEVPUyBkb2Vzbid0IGNhcnJ5IGEgdGltZXN0YW1wLgorICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICAgICAgbURyYWluVmlkZW9RdWV1ZVBlbmRpbmcgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgaWYgKG1GbGFncyAmIEZMQUdfUkVBTF9USU1FKSB7CisgICAgICAgIGludDY0X3QgcmVhbFRpbWVVczsKKyAgICAgICAgQ0hFQ0soZW50cnkubUJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZyZWFsVGltZVVzKSk7CisKKyAgICAgICAgcmVhbFRpbWVVcyA9IG1WaWRlb1NjaGVkdWxlci0+c2NoZWR1bGUocmVhbFRpbWVVcyAqIDEwMDApIC8gMTAwMDsKKworICAgICAgICBpbnQ2NF90IHR3b1ZzeW5jc1VzID0gMiAqIChtVmlkZW9TY2hlZHVsZXItPmdldFZzeW5jUGVyaW9kKCkgLyAxMDAwKTsKKworICAgICAgICBpbnQ2NF90IGRlbGF5VXMgPSByZWFsVGltZVVzIC0gbm93VXM7CisKKyAgICAgICAgQUxPR1dfSUYoZGVsYXlVcyA+IDUwMDAwMCwgInVudXN1YWxseSBoaWdoIGRlbGF5VXM6ICVsbGQiLCAobG9uZyBsb25nKWRlbGF5VXMpOworICAgICAgICAvLyBwb3N0IDIgZGlzcGxheSByZWZyZXNoZXMgYmVmb3JlIHJlbmRlcmluZyBpcyBkdWUKKyAgICAgICAgbXNnLT5wb3N0KGRlbGF5VXMgPiB0d29Wc3luY3NVcyA/IGRlbGF5VXMgLSB0d29Wc3luY3NVcyA6IDApOworCisgICAgICAgIG1EcmFpblZpZGVvUXVldWVQZW5kaW5nID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDY0X3QgbWVkaWFUaW1lVXM7CisgICAgQ0hFQ0soZW50cnkubUJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZtZWRpYVRpbWVVcykpOworCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICBpZiAobUFuY2hvclRpbWVNZWRpYVVzIDwgMCkgeworICAgICAgICAgICAgbU1lZGlhQ2xvY2stPnVwZGF0ZUFuY2hvcihtZWRpYVRpbWVVcywgbm93VXMsIG1lZGlhVGltZVVzKTsKKyAgICAgICAgICAgIG1BbmNob3JUaW1lTWVkaWFVcyA9IG1lZGlhVGltZVVzOworICAgICAgICB9CisgICAgfQorICAgIG1OZXh0VmlkZW9UaW1lTWVkaWFVcyA9IG1lZGlhVGltZVVzICsgMTAwMDAwOworICAgIGlmICghbUhhc0F1ZGlvKSB7CisgICAgICAgIC8vIHNtb290aCBvdXQgdmlkZW9zID49IDEwZnBzCisgICAgICAgIG1NZWRpYUNsb2NrLT51cGRhdGVNYXhUaW1lTWVkaWEobU5leHRWaWRlb1RpbWVNZWRpYVVzKTsKKyAgICB9CisKKyAgICBpZiAoIW1WaWRlb1NhbXBsZVJlY2VpdmVkIHx8IG1lZGlhVGltZVVzIDwgbUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVcykgeworICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQ2NF90IHR3b1ZzeW5jc1VzID0gMiAqIChtVmlkZW9TY2hlZHVsZXItPmdldFZzeW5jUGVyaW9kKCkgLyAxMDAwKTsKKworICAgICAgICAvLyBwb3N0IDIgZGlzcGxheSByZWZyZXNoZXMgYmVmb3JlIHJlbmRlcmluZyBpcyBkdWUKKyAgICAgICAgbU1lZGlhQ2xvY2stPmFkZFRpbWVyKG1zZywgbWVkaWFUaW1lVXMsIC10d29Wc3luY3NVcyk7CisgICAgfQorCisgICAgbURyYWluVmlkZW9RdWV1ZVBlbmRpbmcgPSB0cnVlOworfQorCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6Om9uRHJhaW5WaWRlb1F1ZXVlKCkgeworICAgIGlmIChtVmlkZW9RdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBRdWV1ZUVudHJ5ICplbnRyeSA9ICYqbVZpZGVvUXVldWUuYmVnaW4oKTsKKworICAgIGlmIChlbnRyeS0+bUJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIC8vIEVPUworCisgICAgICAgIG5vdGlmeUVPUyhmYWxzZSAvKiBhdWRpbyAqLywgZW50cnktPm1GaW5hbFJlc3VsdCk7CisKKyAgICAgICAgbVZpZGVvUXVldWUuZXJhc2UobVZpZGVvUXVldWUuYmVnaW4oKSk7CisgICAgICAgIGVudHJ5ID0gTlVMTDsKKworICAgICAgICBzZXRWaWRlb0xhdGVCeVVzKDApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgaW50NjRfdCByZWFsVGltZVVzOworICAgIGludDY0X3QgbWVkaWFUaW1lVXMgPSAtMTsKKyAgICBpZiAobUZsYWdzICYgRkxBR19SRUFMX1RJTUUpIHsKKyAgICAgICAgQ0hFQ0soZW50cnktPm1CdWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmcmVhbFRpbWVVcykpOworICAgIH0gZWxzZSB7CisgICAgICAgIENIRUNLKGVudHJ5LT5tQnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJm1lZGlhVGltZVVzKSk7CisKKyAgICAgICAgcmVhbFRpbWVVcyA9IGdldFJlYWxUaW1lVXMobWVkaWFUaW1lVXMsIG5vd1VzKTsKKyAgICB9CisgICAgcmVhbFRpbWVVcyA9IG1WaWRlb1NjaGVkdWxlci0+c2NoZWR1bGUocmVhbFRpbWVVcyAqIDEwMDApIC8gMTAwMDsKKworICAgIGJvb2wgdG9vTGF0ZSA9IGZhbHNlOworCisgICAgaWYgKCFtUGF1c2VkKSB7CisgICAgICAgIHNldFZpZGVvTGF0ZUJ5VXMobm93VXMgLSByZWFsVGltZVVzKTsKKyAgICAgICAgdG9vTGF0ZSA9IChtVmlkZW9MYXRlQnlVcyA+IDQwMDAwKTsKKworICAgICAgICBpZiAodG9vTGF0ZSkgeworICAgICAgICAgICAgQUxPR1YoInZpZGVvIGxhdGUgYnkgJWxsZCB1cyAoJS4yZiBzZWNzKSIsCisgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbVZpZGVvTGF0ZUJ5VXMsIG1WaWRlb0xhdGVCeVVzIC8gMUU2KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludDY0X3QgbWVkaWFVcyA9IDA7CisgICAgICAgICAgICBtTWVkaWFDbG9jay0+Z2V0TWVkaWFUaW1lKHJlYWxUaW1lVXMsICZtZWRpYVVzKTsKKyAgICAgICAgICAgIEFMT0dWKCJyZW5kZXJpbmcgdmlkZW8gYXQgbWVkaWEgdGltZSAlLjJmIHNlY3MiLAorICAgICAgICAgICAgICAgICAgICAobUZsYWdzICYgRkxBR19SRUFMX1RJTUUgPyByZWFsVGltZVVzIDoKKyAgICAgICAgICAgICAgICAgICAgbWVkaWFVcykgLyAxRTYpOworCisgICAgICAgICAgICBpZiAoIShtRmxhZ3MgJiBGTEFHX1JFQUxfVElNRSkKKyAgICAgICAgICAgICAgICAgICAgJiYgbUxhc3RBdWRpb01lZGlhVGltZVVzICE9IC0xCisgICAgICAgICAgICAgICAgICAgICYmIG1lZGlhVGltZVVzID4gbUxhc3RBdWRpb01lZGlhVGltZVVzKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgYXVkaW8gZW5kcyBiZWZvcmUgdmlkZW8sIHZpZGVvIGNvbnRpbnVlcyB0byBkcml2ZSBtZWRpYSBjbG9jay4KKyAgICAgICAgICAgICAgICAvLyBBbHNvIHNtb290aCBvdXQgdmlkZW9zID49IDEwZnBzLgorICAgICAgICAgICAgICAgIG1NZWRpYUNsb2NrLT51cGRhdGVNYXhUaW1lTWVkaWEobWVkaWFUaW1lVXMgKyAxMDAwMDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0VmlkZW9MYXRlQnlVcygwKTsKKyAgICAgICAgaWYgKCFtVmlkZW9TYW1wbGVSZWNlaXZlZCAmJiAhbUhhc0F1ZGlvKSB7CisgICAgICAgICAgICAvLyBUaGlzIHdpbGwgZW5zdXJlIHRoYXQgdGhlIGZpcnN0IGZyYW1lIGFmdGVyIGEgZmx1c2ggd29uJ3QgYmUgdXNlZCBhcyBhbmNob3IKKyAgICAgICAgICAgIC8vIHdoZW4gcmVuZGVyZXIgaXMgaW4gcGF1c2VkIHN0YXRlLCBiZWNhdXNlIHJlc3VtZSBjYW4gaGFwcGVuIGFueSB0aW1lIGFmdGVyIHNlZWsuCisgICAgICAgICAgICBjbGVhckFuY2hvclRpbWUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEFsd2F5cyByZW5kZXIgdGhlIGZpcnN0IHZpZGVvIGZyYW1lIHdoaWxlIGtlZXBpbmcgc3RhdHMgb24gQS9WIHN5bmMuCisgICAgaWYgKCFtVmlkZW9TYW1wbGVSZWNlaXZlZCkgeworICAgICAgICByZWFsVGltZVVzID0gbm93VXM7CisgICAgICAgIHRvb0xhdGUgPSBmYWxzZTsKKyAgICB9CisKKyAgICBlbnRyeS0+bU5vdGlmeUNvbnN1bWVkLT5zZXRJbnQ2NCgidGltZXN0YW1wTnMiLCByZWFsVGltZVVzICogMTAwMGxsKTsKKyAgICBlbnRyeS0+bU5vdGlmeUNvbnN1bWVkLT5zZXRJbnQzMigicmVuZGVyIiwgIXRvb0xhdGUpOworICAgIGVudHJ5LT5tTm90aWZ5Q29uc3VtZWQtPnBvc3QoKTsKKyAgICBtVmlkZW9RdWV1ZS5lcmFzZShtVmlkZW9RdWV1ZS5iZWdpbigpKTsKKyAgICBlbnRyeSA9IE5VTEw7CisKKyAgICBtVmlkZW9TYW1wbGVSZWNlaXZlZCA9IHRydWU7CisKKyAgICBpZiAoIW1QYXVzZWQpIHsKKyAgICAgICAgaWYgKCFtVmlkZW9SZW5kZXJpbmdTdGFydGVkKSB7CisgICAgICAgICAgICBtVmlkZW9SZW5kZXJpbmdTdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIG5vdGlmeVZpZGVvUmVuZGVyaW5nU3RhcnQoKTsKKyAgICAgICAgfQorICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICBub3RpZnlJZk1lZGlhUmVuZGVyaW5nU3RhcnRlZF9sKCk7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6Om5vdGlmeVZpZGVvUmVuZGVyaW5nU3RhcnQoKSB7CisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFZpZGVvUmVuZGVyaW5nU3RhcnQpOworICAgIG5vdGlmeS0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6Om5vdGlmeUVPUyhib29sIGF1ZGlvLCBzdGF0dXNfdCBmaW5hbFJlc3VsdCwgaW50NjRfdCBkZWxheVVzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBub3RpZnlFT1NfbChhdWRpbywgZmluYWxSZXN1bHQsIGRlbGF5VXMpOworfQorCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6Om5vdGlmeUVPU19sKGJvb2wgYXVkaW8sIHN0YXR1c190IGZpbmFsUmVzdWx0LCBpbnQ2NF90IGRlbGF5VXMpIHsKKyAgICBpZiAoYXVkaW8gJiYgZGVsYXlVcyA+IDApIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEVPUywgdGhpcyk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoImF1ZGlvRU9TR2VuZXJhdGlvbiIsIG1BdWRpb0VPU0dlbmVyYXRpb24pOworICAgICAgICBtc2ctPnNldEludDMyKCJmaW5hbFJlc3VsdCIsIGZpbmFsUmVzdWx0KTsKKyAgICAgICAgbXNnLT5wb3N0KGRlbGF5VXMpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRFT1MpOworICAgIG5vdGlmeS0+c2V0SW50MzIoImF1ZGlvIiwgc3RhdGljX2Nhc3Q8aW50MzJfdD4oYXVkaW8pKTsKKyAgICBub3RpZnktPnNldEludDMyKCJmaW5hbFJlc3VsdCIsIGZpbmFsUmVzdWx0KTsKKyAgICBub3RpZnktPnBvc3QoZGVsYXlVcyk7CisKKyAgICBpZiAoYXVkaW8pIHsKKyAgICAgICAgLy8gVmlkZW8gbWlnaHQgb3V0bGl2ZSBhdWRpby4gQ2xlYXIgYW5jaG9yIHRvIGVuYWJsZSB2aWRlbyBvbmx5IGNhc2UuCisgICAgICAgIG1BbmNob3JUaW1lTWVkaWFVcyA9IC0xOworICAgICAgICBtSGFzQXVkaW8gPSBmYWxzZTsKKyAgICAgICAgaWYgKG1OZXh0VmlkZW9UaW1lTWVkaWFVcyA+PSAwKSB7CisgICAgICAgICAgICBpbnQ2NF90IG1lZGlhVXMgPSAwOworICAgICAgICAgICAgbU1lZGlhQ2xvY2stPmdldE1lZGlhVGltZShBTG9vcGVyOjpHZXROb3dVcygpLCAmbWVkaWFVcyk7CisgICAgICAgICAgICBpZiAobU5leHRWaWRlb1RpbWVNZWRpYVVzID4gbWVkaWFVcykgeworICAgICAgICAgICAgICAgIG1NZWRpYUNsb2NrLT51cGRhdGVNYXhUaW1lTWVkaWEobU5leHRWaWRlb1RpbWVNZWRpYVVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpub3RpZnlBdWRpb1RlYXJEb3duKEF1ZGlvVGVhckRvd25SZWFzb24gcmVhc29uKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEF1ZGlvVGVhckRvd24sIHRoaXMpOworICAgIG1zZy0+c2V0SW50MzIoInJlYXNvbiIsIHJlYXNvbik7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6b25RdWV1ZUJ1ZmZlcihjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIGludDMyX3QgYXVkaW87CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImF1ZGlvIiwgJmF1ZGlvKSk7CisKKyAgICBpZiAoZHJvcEJ1ZmZlcklmU3RhbGUoYXVkaW8sIG1zZykpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChhdWRpbykgeworICAgICAgICBtSGFzQXVkaW8gPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIG1IYXNWaWRlbyA9IHRydWU7CisgICAgfQorCisgICAgaWYgKG1IYXNWaWRlbykgeworICAgICAgICBpZiAobVZpZGVvU2NoZWR1bGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIG1WaWRlb1NjaGVkdWxlciA9IG5ldyBWaWRlb0ZyYW1lU2NoZWR1bGVyKCk7CisgICAgICAgICAgICBtVmlkZW9TY2hlZHVsZXItPmluaXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoImJ1ZmZlciIsICZvYmopKTsKKyAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWZmZXIgPSBzdGF0aWNfY2FzdDxNZWRpYUNvZGVjQnVmZmVyICo+KG9iai5nZXQoKSk7CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5Q29uc3VtZWQ7CisgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgibm90aWZ5Q29uc3VtZWQiLCAmbm90aWZ5Q29uc3VtZWQpKTsKKworICAgIFF1ZXVlRW50cnkgZW50cnk7CisgICAgZW50cnkubUJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICBlbnRyeS5tTm90aWZ5Q29uc3VtZWQgPSBub3RpZnlDb25zdW1lZDsKKyAgICBlbnRyeS5tT2Zmc2V0ID0gMDsKKyAgICBlbnRyeS5tRmluYWxSZXN1bHQgPSBPSzsKKyAgICBlbnRyeS5tQnVmZmVyT3JkaW5hbCA9ICsrbVRvdGFsQnVmZmVyc1F1ZXVlZDsKKworICAgIGlmIChhdWRpbykgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICBtQXVkaW9RdWV1ZS5wdXNoX2JhY2soZW50cnkpOworICAgICAgICBwb3N0RHJhaW5BdWRpb1F1ZXVlX2woKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtVmlkZW9RdWV1ZS5wdXNoX2JhY2soZW50cnkpOworICAgICAgICBwb3N0RHJhaW5WaWRlb1F1ZXVlKCk7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBpZiAoIW1TeW5jUXVldWVzIHx8IG1BdWRpb1F1ZXVlLmVtcHR5KCkgfHwgbVZpZGVvUXVldWUuZW1wdHkoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gZmlyc3RBdWRpb0J1ZmZlciA9ICgqbUF1ZGlvUXVldWUuYmVnaW4oKSkubUJ1ZmZlcjsKKyAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBmaXJzdFZpZGVvQnVmZmVyID0gKCptVmlkZW9RdWV1ZS5iZWdpbigpKS5tQnVmZmVyOworCisgICAgaWYgKGZpcnN0QXVkaW9CdWZmZXIgPT0gTlVMTCB8fCBmaXJzdFZpZGVvQnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgLy8gRU9TIHNpZ25hbGxlZCBvbiBlaXRoZXIgcXVldWUuCisgICAgICAgIHN5bmNRdWV1ZXNEb25lX2woKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDY0X3QgZmlyc3RBdWRpb1RpbWVVczsKKyAgICBpbnQ2NF90IGZpcnN0VmlkZW9UaW1lVXM7CisgICAgQ0hFQ0soZmlyc3RBdWRpb0J1ZmZlci0+bWV0YSgpCisgICAgICAgICAgICAtPmZpbmRJbnQ2NCgidGltZVVzIiwgJmZpcnN0QXVkaW9UaW1lVXMpKTsKKyAgICBDSEVDSyhmaXJzdFZpZGVvQnVmZmVyLT5tZXRhKCkKKyAgICAgICAgICAgIC0+ZmluZEludDY0KCJ0aW1lVXMiLCAmZmlyc3RWaWRlb1RpbWVVcykpOworCisgICAgaW50NjRfdCBkaWZmID0gZmlyc3RWaWRlb1RpbWVVcyAtIGZpcnN0QXVkaW9UaW1lVXM7CisKKyAgICBBTE9HVigicXVldWVEaWZmID0gJS4yZiBzZWNzIiwgZGlmZiAvIDFFNik7CisKKyAgICBpZiAoZGlmZiA+IDEwMDAwMGxsKSB7CisgICAgICAgIC8vIEF1ZGlvIGRhdGEgc3RhcnRzIE1vcmUgdGhhbiAwLjEgc2VjcyBiZWZvcmUgdmlkZW8uCisgICAgICAgIC8vIERyb3Agc29tZSBhdWRpby4KKworICAgICAgICAoKm1BdWRpb1F1ZXVlLmJlZ2luKCkpLm1Ob3RpZnlDb25zdW1lZC0+cG9zdCgpOworICAgICAgICBtQXVkaW9RdWV1ZS5lcmFzZShtQXVkaW9RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN5bmNRdWV1ZXNEb25lX2woKTsKK30KKwordm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpzeW5jUXVldWVzRG9uZV9sKCkgeworICAgIGlmICghbVN5bmNRdWV1ZXMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1TeW5jUXVldWVzID0gZmFsc2U7CisKKyAgICBpZiAoIW1BdWRpb1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgcG9zdERyYWluQXVkaW9RdWV1ZV9sKCk7CisgICAgfQorCisgICAgaWYgKCFtVmlkZW9RdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICBwb3N0RHJhaW5WaWRlb1F1ZXVlKCk7CisgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6b25RdWV1ZUVPUyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIGludDMyX3QgYXVkaW87CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImF1ZGlvIiwgJmF1ZGlvKSk7CisKKyAgICBpZiAoZHJvcEJ1ZmZlcklmU3RhbGUoYXVkaW8sIG1zZykpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDMyX3QgZmluYWxSZXN1bHQ7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImZpbmFsUmVzdWx0IiwgJmZpbmFsUmVzdWx0KSk7CisKKyAgICBRdWV1ZUVudHJ5IGVudHJ5OworICAgIGVudHJ5Lm1PZmZzZXQgPSAwOworICAgIGVudHJ5Lm1GaW5hbFJlc3VsdCA9IGZpbmFsUmVzdWx0OworCisgICAgaWYgKGF1ZGlvKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgICAgIGlmIChtQXVkaW9RdWV1ZS5lbXB0eSgpICYmIG1TeW5jUXVldWVzKSB7CisgICAgICAgICAgICBzeW5jUXVldWVzRG9uZV9sKCk7CisgICAgICAgIH0KKyAgICAgICAgbUF1ZGlvUXVldWUucHVzaF9iYWNrKGVudHJ5KTsKKyAgICAgICAgcG9zdERyYWluQXVkaW9RdWV1ZV9sKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1WaWRlb1F1ZXVlLmVtcHR5KCkgJiYgZ2V0U3luY1F1ZXVlcygpKSB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICAgICAgc3luY1F1ZXVlc0RvbmVfbCgpOworICAgICAgICB9CisgICAgICAgIG1WaWRlb1F1ZXVlLnB1c2hfYmFjayhlbnRyeSk7CisgICAgICAgIHBvc3REcmFpblZpZGVvUXVldWUoKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6b25GbHVzaChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIGludDMyX3QgYXVkaW8sIG5vdGlmeUNvbXBsZXRlOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJhdWRpbyIsICZhdWRpbykpOworCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICBpZiAoYXVkaW8pIHsKKyAgICAgICAgICAgIG5vdGlmeUNvbXBsZXRlID0gbU5vdGlmeUNvbXBsZXRlQXVkaW87CisgICAgICAgICAgICBtTm90aWZ5Q29tcGxldGVBdWRpbyA9IGZhbHNlOworICAgICAgICAgICAgbUxhc3RBdWRpb01lZGlhVGltZVVzID0gLTE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBub3RpZnlDb21wbGV0ZSA9IG1Ob3RpZnlDb21wbGV0ZVZpZGVvOworICAgICAgICAgICAgbU5vdGlmeUNvbXBsZXRlVmlkZW8gPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHdlJ3JlIGN1cnJlbnRseSBzeW5jaW5nIHRoZSBxdWV1ZXMsIGkuZS4gZHJvcHBpbmcgYXVkaW8gd2hpbGUKKyAgICAgICAgLy8gYWxpZ25pbmcgdGhlIGZpcnN0IGF1ZGlvL3ZpZGVvIGJ1ZmZlciB0aW1lcyBhbmQgb25seSBvbmUgb2YgdGhlCisgICAgICAgIC8vIHR3byBxdWV1ZXMgaGFzIGRhdGEsIHdlIG1heSBzdGFydmUgdGhhdCBxdWV1ZSBieSBub3QgcmVxdWVzdGluZworICAgICAgICAvLyBtb3JlIGJ1ZmZlcnMgZnJvbSB0aGUgZGVjb2Rlci4gSWYgdGhlIG90aGVyIHNvdXJjZSB0aGVuIGVuY291bnRlcnMKKyAgICAgICAgLy8gYSBkaXNjb250aW51aXR5IHRoYXQgbGVhZHMgdG8gZmx1c2hpbmcsIHdlJ2xsIG5ldmVyIGZpbmQgdGhlCisgICAgICAgIC8vIGNvcnJlc3BvbmRpbmcgZGlzY29udGludWl0eSBvbiB0aGUgb3RoZXIgcXVldWUuCisgICAgICAgIC8vIFRoZXJlZm9yZSB3ZSdsbCBzdG9wIHN5bmNpbmcgdGhlIHF1ZXVlcyBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlbQorICAgICAgICAvLyBpcyBmbHVzaGVkLgorICAgICAgICBzeW5jUXVldWVzRG9uZV9sKCk7CisgICAgfQorICAgIGNsZWFyQW5jaG9yVGltZSgpOworCisgICAgQUxPR1YoImZsdXNoaW5nICVzIiwgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CisgICAgaWYgKGF1ZGlvKSB7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgICAgICAgICBmbHVzaFF1ZXVlKCZtQXVkaW9RdWV1ZSk7CisKKyAgICAgICAgICAgICsrbUF1ZGlvRHJhaW5HZW5lcmF0aW9uOworICAgICAgICAgICAgKyttQXVkaW9FT1NHZW5lcmF0aW9uOworICAgICAgICAgICAgcHJlcGFyZUZvck1lZGlhUmVuZGVyaW5nU3RhcnRfbCgpOworCisgICAgICAgICAgICAvLyB0aGUgZnJhbWUgY291bnQgd2lsbCBiZSByZXNldCBhZnRlciBmbHVzaC4KKyAgICAgICAgICAgIGNsZWFyQXVkaW9GaXJzdEFuY2hvclRpbWVfbCgpOworICAgICAgICB9CisKKyAgICAgICAgbURyYWluQXVkaW9RdWV1ZVBlbmRpbmcgPSBmYWxzZTsKKworICAgICAgICBpZiAob2ZmbG9hZGluZ0F1ZGlvKCkpIHsKKyAgICAgICAgICAgIG1BdWRpb1NpbmstPnBhdXNlKCk7CisgICAgICAgICAgICBtQXVkaW9TaW5rLT5mbHVzaCgpOworICAgICAgICAgICAgaWYgKCFtUGF1c2VkKSB7CisgICAgICAgICAgICAgICAgbUF1ZGlvU2luay0+c3RhcnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1BdWRpb1NpbmstPnBhdXNlKCk7CisgICAgICAgICAgICBtQXVkaW9TaW5rLT5mbHVzaCgpOworICAgICAgICAgICAgLy8gQ2FsbCBzdG9wKCkgdG8gc2lnbmFsIHRvIHRoZSBBdWRpb1NpbmsgdG8gY29tcGxldGVseSBmaWxsIHRoZQorICAgICAgICAgICAgLy8gaW50ZXJuYWwgYnVmZmVyIGJlZm9yZSByZXN1bWluZyBwbGF5YmFjay4KKyAgICAgICAgICAgIC8vIEZJWE1FOiB0aGlzIGlzIGlnbm9yZWQgYWZ0ZXIgZmx1c2goKS4KKyAgICAgICAgICAgIG1BdWRpb1NpbmstPnN0b3AoKTsKKyAgICAgICAgICAgIGlmIChtUGF1c2VkKSB7CisgICAgICAgICAgICAgICAgLy8gUmFjZSBjb25kaXRpb246IGlmIHJlbmRlcmVyIGlzIHBhdXNlZCBhbmQgYXVkaW8gc2luayBpcyBzdG9wcGVkLAorICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGF1ZGlvIHRyYWNrIGJ1ZmZlciBmdWxseSBkcmFpbnMKKyAgICAgICAgICAgICAgICAvLyBiZWZvcmUgZGVsaXZlcmluZyBkYXRhLgorICAgICAgICAgICAgICAgIC8vIEZJWE1FOiByZW1vdmUgdGhpcyBpZiB3ZSBjYW4gZGV0ZWN0IGlmIHN0b3AoKSBpcyBjb21wbGV0ZS4KKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgZGVsYXlVcyA9IDIgKiA1MCAqIDEwMDA7IC8vICgyIGZ1bGwgbWl4ZXIgdGhyZWFkIGN5Y2xlcyBhdCA1MG1zKQorICAgICAgICAgICAgICAgIG1QYXVzZURyYWluQXVkaW9BbGxvd2VkVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpICsgZGVsYXlVczsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUF1ZGlvU2luay0+c3RhcnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1OdW1GcmFtZXNXcml0dGVuID0gMDsKKyAgICAgICAgfQorICAgICAgICBtTmV4dEF1ZGlvQ2xvY2tVcGRhdGVUaW1lVXMgPSAtMTsKKyAgICB9IGVsc2UgeworICAgICAgICBmbHVzaFF1ZXVlKCZtVmlkZW9RdWV1ZSk7CisKKyAgICAgICAgbURyYWluVmlkZW9RdWV1ZVBlbmRpbmcgPSBmYWxzZTsKKworICAgICAgICBpZiAobVZpZGVvU2NoZWR1bGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1WaWRlb1NjaGVkdWxlci0+cmVzdGFydCgpOworICAgICAgICB9CisKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgKyttVmlkZW9EcmFpbkdlbmVyYXRpb247CisgICAgICAgIHByZXBhcmVGb3JNZWRpYVJlbmRlcmluZ1N0YXJ0X2woKTsKKyAgICB9CisKKyAgICBtVmlkZW9TYW1wbGVSZWNlaXZlZCA9IGZhbHNlOworCisgICAgaWYgKG5vdGlmeUNvbXBsZXRlKSB7CisgICAgICAgIG5vdGlmeUZsdXNoQ29tcGxldGUoYXVkaW8pOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpmbHVzaFF1ZXVlKExpc3Q8UXVldWVFbnRyeT4gKnF1ZXVlKSB7CisgICAgd2hpbGUgKCFxdWV1ZS0+ZW1wdHkoKSkgeworICAgICAgICBRdWV1ZUVudHJ5ICplbnRyeSA9ICYqcXVldWUtPmJlZ2luKCk7CisKKyAgICAgICAgaWYgKGVudHJ5LT5tQnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGVudHJ5LT5tTm90aWZ5Q29uc3VtZWQtPnBvc3QoKTsKKyAgICAgICAgfSBlbHNlIGlmIChlbnRyeS0+bU5vdGlmeUNvbnN1bWVkICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIC8vIElzIGl0IG5lZWRlZCB0byBvcGVuIGF1ZGlvIHNpbmsgbm93PworICAgICAgICAgICAgb25DaGFuZ2VBdWRpb0Zvcm1hdChlbnRyeS0+bU1ldGEsIGVudHJ5LT5tTm90aWZ5Q29uc3VtZWQpOworICAgICAgICB9CisKKyAgICAgICAgcXVldWUtPmVyYXNlKHF1ZXVlLT5iZWdpbigpKTsKKyAgICAgICAgZW50cnkgPSBOVUxMOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpub3RpZnlGbHVzaENvbXBsZXRlKGJvb2wgYXVkaW8pIHsKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0Rmx1c2hDb21wbGV0ZSk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigiYXVkaW8iLCBzdGF0aWNfY2FzdDxpbnQzMl90PihhdWRpbykpOworICAgIG5vdGlmeS0+cG9zdCgpOworfQorCitib29sIE51UGxheWVyMjo6UmVuZGVyZXI6OmRyb3BCdWZmZXJJZlN0YWxlKAorICAgICAgICBib29sIGF1ZGlvLCBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIGludDMyX3QgcXVldWVHZW5lcmF0aW9uOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJxdWV1ZUdlbmVyYXRpb24iLCAmcXVldWVHZW5lcmF0aW9uKSk7CisKKyAgICBpZiAocXVldWVHZW5lcmF0aW9uID09IGdldFF1ZXVlR2VuZXJhdGlvbihhdWRpbykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnlDb25zdW1lZDsKKyAgICBpZiAobXNnLT5maW5kTWVzc2FnZSgibm90aWZ5Q29uc3VtZWQiLCAmbm90aWZ5Q29uc3VtZWQpKSB7CisgICAgICAgIG5vdGlmeUNvbnN1bWVkLT5wb3N0KCk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6b25BdWRpb1NpbmtDaGFuZ2VkKCkgeworICAgIGlmIChvZmZsb2FkaW5nQXVkaW8oKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIENIRUNLKCFtRHJhaW5BdWRpb1F1ZXVlUGVuZGluZyk7CisgICAgbU51bUZyYW1lc1dyaXR0ZW4gPSAwOworICAgIG1BbmNob3JOdW1GcmFtZXNXcml0dGVuID0gLTE7CisgICAgdWludDMyX3Qgd3JpdHRlbjsKKyAgICBpZiAobUF1ZGlvU2luay0+Z2V0RnJhbWVzV3JpdHRlbigmd3JpdHRlbikgPT0gT0spIHsKKyAgICAgICAgbU51bUZyYW1lc1dyaXR0ZW4gPSB3cml0dGVuOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpvbkRpc2FibGVPZmZsb2FkQXVkaW8oKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBtRmxhZ3MgJj0gfkZMQUdfT0ZGTE9BRF9BVURJTzsKKyAgICArK21BdWRpb0RyYWluR2VuZXJhdGlvbjsKKyAgICBpZiAobUF1ZGlvUmVuZGVyaW5nU3RhcnRHZW5lcmF0aW9uICE9IC0xKSB7CisgICAgICAgIHByZXBhcmVGb3JNZWRpYVJlbmRlcmluZ1N0YXJ0X2woKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6b25FbmFibGVPZmZsb2FkQXVkaW8oKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBtRmxhZ3MgfD0gRkxBR19PRkZMT0FEX0FVRElPOworICAgICsrbUF1ZGlvRHJhaW5HZW5lcmF0aW9uOworICAgIGlmIChtQXVkaW9SZW5kZXJpbmdTdGFydEdlbmVyYXRpb24gIT0gLTEpIHsKKyAgICAgICAgcHJlcGFyZUZvck1lZGlhUmVuZGVyaW5nU3RhcnRfbCgpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpvblBhdXNlKCkgeworICAgIGlmIChtUGF1c2VkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgICAgIC8vIHdlIGRvIG5vdCBpbmNyZW1lbnQgYXVkaW8gZHJhaW4gZ2VuZXJhdGlvbiBzbyB0aGF0IHdlIGZpbGwgYXVkaW8gYnVmZmVyIGR1cmluZyBwYXVzZS4KKyAgICAgICAgKyttVmlkZW9EcmFpbkdlbmVyYXRpb247CisgICAgICAgIHByZXBhcmVGb3JNZWRpYVJlbmRlcmluZ1N0YXJ0X2woKTsKKyAgICAgICAgbVBhdXNlZCA9IHRydWU7CisgICAgICAgIG1NZWRpYUNsb2NrLT5zZXRQbGF5YmFja1JhdGUoMC4wKTsKKyAgICB9CisKKyAgICBtRHJhaW5BdWRpb1F1ZXVlUGVuZGluZyA9IGZhbHNlOworICAgIG1EcmFpblZpZGVvUXVldWVQZW5kaW5nID0gZmFsc2U7CisKKyAgICAvLyBOb3RlOiBhdWRpbyBkYXRhIG1heSBub3QgaGF2ZSBiZWVuIGRlY29kZWQsIGFuZCB0aGUgQXVkaW9TaW5rIG1heSBub3QgYmUgb3BlbmVkLgorICAgIG1BdWRpb1NpbmstPnBhdXNlKCk7CisgICAgc3RhcnRBdWRpb09mZmxvYWRQYXVzZVRpbWVvdXQoKTsKKworICAgIEFMT0dWKCJub3cgcGF1c2VkIGF1ZGlvIHF1ZXVlIGhhcyAlenUgZW50cmllcywgdmlkZW8gaGFzICV6dSBlbnRyaWVzIiwKKyAgICAgICAgICBtQXVkaW9RdWV1ZS5zaXplKCksIG1WaWRlb1F1ZXVlLnNpemUoKSk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6b25SZXN1bWUoKSB7CisgICAgaWYgKCFtUGF1c2VkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBOb3RlOiBhdWRpbyBkYXRhIG1heSBub3QgaGF2ZSBiZWVuIGRlY29kZWQsIGFuZCB0aGUgQXVkaW9TaW5rIG1heSBub3QgYmUgb3BlbmVkLgorICAgIGNhbmNlbEF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dCgpOworICAgIGlmIChtQXVkaW9TaW5rLT5yZWFkeSgpKSB7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1BdWRpb1NpbmstPnN0YXJ0KCk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJjYW5ub3Qgc3RhcnQgQXVkaW9TaW5rIGVyciAlZCIsIGVycik7CisgICAgICAgICAgICBub3RpZnlBdWRpb1RlYXJEb3duKGtEdWVUb0Vycm9yKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgbVBhdXNlZCA9IGZhbHNlOworICAgICAgICAvLyByZW5kZXJpbmcgc3RhcnRlZCBtZXNzYWdlIG1heSBoYXZlIGJlZW4gZGVsYXllZCBpZiB3ZSB3ZXJlIHBhdXNlZC4KKyAgICAgICAgaWYgKG1SZW5kZXJpbmdEYXRhRGVsaXZlcmVkKSB7CisgICAgICAgICAgICBub3RpZnlJZk1lZGlhUmVuZGVyaW5nU3RhcnRlZF9sKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gY29uZmlndXJlIGF1ZGlvc2luayBhcyB3ZSBkaWQgbm90IGRvIGl0IHdoZW4gcGF1c2luZworICAgICAgICBpZiAobUF1ZGlvU2luayAhPSBOVUxMICYmIG1BdWRpb1NpbmstPnJlYWR5KCkpIHsKKyAgICAgICAgICAgIG1BdWRpb1NpbmstPnNldFBsYXliYWNrUmF0ZShtUGxheWJhY2tTZXR0aW5ncyk7CisgICAgICAgIH0KKworICAgICAgICBtTWVkaWFDbG9jay0+c2V0UGxheWJhY2tSYXRlKG1QbGF5YmFja1JhdGUpOworCisgICAgICAgIGlmICghbUF1ZGlvUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgcG9zdERyYWluQXVkaW9RdWV1ZV9sKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIW1WaWRlb1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgcG9zdERyYWluVmlkZW9RdWV1ZSgpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpvblNldFZpZGVvRnJhbWVSYXRlKGZsb2F0IGZwcykgeworICAgIGlmIChtVmlkZW9TY2hlZHVsZXIgPT0gTlVMTCkgeworICAgICAgICBtVmlkZW9TY2hlZHVsZXIgPSBuZXcgVmlkZW9GcmFtZVNjaGVkdWxlcigpOworICAgIH0KKyAgICBtVmlkZW9TY2hlZHVsZXItPmluaXQoZnBzKTsKK30KKworaW50MzJfdCBOdVBsYXllcjI6OlJlbmRlcmVyOjpnZXRRdWV1ZUdlbmVyYXRpb24oYm9vbCBhdWRpbykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgcmV0dXJuIChhdWRpbyA/IG1BdWRpb1F1ZXVlR2VuZXJhdGlvbiA6IG1WaWRlb1F1ZXVlR2VuZXJhdGlvbik7Cit9CisKK2ludDMyX3QgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6Z2V0RHJhaW5HZW5lcmF0aW9uKGJvb2wgYXVkaW8pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIHJldHVybiAoYXVkaW8gPyBtQXVkaW9EcmFpbkdlbmVyYXRpb24gOiBtVmlkZW9EcmFpbkdlbmVyYXRpb24pOworfQorCitib29sIE51UGxheWVyMjo6UmVuZGVyZXI6OmdldFN5bmNRdWV1ZXMoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gbVN5bmNRdWV1ZXM7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6b25BdWRpb1RlYXJEb3duKEF1ZGlvVGVhckRvd25SZWFzb24gcmVhc29uKSB7CisgICAgaWYgKG1BdWRpb1Rvcm5Eb3duKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUF1ZGlvVG9ybkRvd24gPSB0cnVlOworCisgICAgaW50NjRfdCBjdXJyZW50UG9zaXRpb25VczsKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgaWYgKGdldEN1cnJlbnRQb3NpdGlvbigmY3VycmVudFBvc2l0aW9uVXMpID09IE9LKSB7CisgICAgICAgIG5vdGlmeS0+c2V0SW50NjQoInBvc2l0aW9uVXMiLCBjdXJyZW50UG9zaXRpb25Vcyk7CisgICAgfQorCisgICAgbUF1ZGlvU2luay0+c3RvcCgpOworICAgIG1BdWRpb1NpbmstPmZsdXNoKCk7CisKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRBdWRpb1RlYXJEb3duKTsKKyAgICBub3RpZnktPnNldEludDMyKCJyZWFzb24iLCByZWFzb24pOworICAgIG5vdGlmeS0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6OnN0YXJ0QXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0KCkgeworICAgIGlmIChvZmZsb2FkaW5nQXVkaW8oKSkgeworICAgICAgICBtV2FrZUxvY2stPmFjcXVpcmUoKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dCwgdGhpcyk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoImRyYWluR2VuZXJhdGlvbiIsIG1BdWRpb09mZmxvYWRQYXVzZVRpbWVvdXRHZW5lcmF0aW9uKTsKKyAgICAgICAgbXNnLT5wb3N0KGtPZmZsb2FkUGF1c2VNYXhVcyk7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6OmNhbmNlbEF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dCgpIHsKKyAgICAvLyBXZSBtYXkgaGF2ZSBjYWxsZWQgc3RhcnRBdWRpb09mZmxvYWRQYXVzZVRpbWVvdXQoKSB3aXRob3V0CisgICAgLy8gdGhlIEF1ZGlvU2luayBvcGVuIGFuZCB3aXRoIG9mZmxvYWRpbmdBdWRpbyBlbmFibGVkLgorICAgIC8vCisgICAgLy8gV2hlbiB3ZSBjYW5jZWwsIGl0IG1heSBiZSB0aGF0IG9mZmxvYWRpbmdBdWRpbyBpcyBzdWJzZXF1ZW50bHkgZGlzYWJsZWQsIHNvIHJlZ2FyZGxlc3MKKyAgICAvLyB3ZSBhbHdheXMgcmVsZWFzZSB0aGUgd2FrZWxvY2sgYW5kIGluY3JlbWVudCB0aGUgcGF1c2UgdGltZW91dCBnZW5lcmF0aW9uLgorICAgIC8vCisgICAgLy8gTm90ZTogVGhlIGFjcXVpcmVkIHdha2Vsb2NrIHByZXZlbnRzIHRoZSBkZXZpY2UgZnJvbSBzdXNwZW5kaW5nCisgICAgLy8gaW1tZWRpYXRlbHkgYWZ0ZXIgb2ZmbG9hZCBwYXVzZSAoaW4gY2FzZSBhIHJlc3VtZSBoYXBwZW5zIHNob3J0bHkgdGhlcmVhZnRlcikuCisgICAgbVdha2VMb2NrLT5yZWxlYXNlKHRydWUpOworICAgICsrbUF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dEdlbmVyYXRpb247Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6UmVuZGVyZXI6Om9uT3BlbkF1ZGlvU2luaygKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgIGJvb2wgb2ZmbG9hZE9ubHksCisgICAgICAgIGJvb2wgaGFzVmlkZW8sCisgICAgICAgIHVpbnQzMl90IGZsYWdzLAorICAgICAgICBib29sIGlzU3RyZWFtaW5nKSB7CisgICAgQUxPR1YoIm9wZW5BdWRpb1Npbms6IG9mZmxvYWRPbmx5KCVkKSBvZmZsb2FkaW5nQXVkaW8oJWQpIiwKKyAgICAgICAgICAgIG9mZmxvYWRPbmx5LCBvZmZsb2FkaW5nQXVkaW8oKSk7CisgICAgYm9vbCBhdWRpb1NpbmtDaGFuZ2VkID0gZmFsc2U7CisKKyAgICBpbnQzMl90IG51bUNoYW5uZWxzOworICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJjaGFubmVsLWNvdW50IiwgJm51bUNoYW5uZWxzKSk7CisKKyAgICBpbnQzMl90IGNoYW5uZWxNYXNrOworICAgIGlmICghZm9ybWF0LT5maW5kSW50MzIoImNoYW5uZWwtbWFzayIsICZjaGFubmVsTWFzaykpIHsKKyAgICAgICAgLy8gc2lnbmFsIHRvIHRoZSBBdWRpb1NpbmsgdG8gZGVyaXZlIHRoZSBtYXNrIGZyb20gY291bnQuCisgICAgICAgIGNoYW5uZWxNYXNrID0gQ0hBTk5FTF9NQVNLX1VTRV9DSEFOTkVMX09SREVSOworICAgIH0KKworICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKKyAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigic2FtcGxlLXJhdGUiLCAmc2FtcGxlUmF0ZSkpOworCisgICAgaWYgKG9mZmxvYWRpbmdBdWRpbygpKSB7CisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgICAgIEFTdHJpbmcgbWltZTsKKyAgICAgICAgQ0hFQ0soZm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbWFwTWltZVRvQXVkaW9Gb3JtYXQoYXVkaW9Gb3JtYXQsIG1pbWUuY19zdHIoKSk7CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIkNvdWxkbid0IG1hcCBtaW1lIFwiJXNcIiB0byBhIHZhbGlkICIKKyAgICAgICAgICAgICAgICAgICAgImF1ZGlvX2Zvcm1hdCIsIG1pbWUuY19zdHIoKSk7CisgICAgICAgICAgICBvbkRpc2FibGVPZmZsb2FkQXVkaW8oKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dWKCJNaW1lIFwiJXNcIiBtYXBwZWQgdG8gYXVkaW9fZm9ybWF0IDB4JXgiLAorICAgICAgICAgICAgICAgICAgICBtaW1lLmNfc3RyKCksIGF1ZGlvRm9ybWF0KTsKKworICAgICAgICAgICAgaW50IGF2Z0JpdFJhdGUgPSAtMTsKKyAgICAgICAgICAgIGZvcm1hdC0+ZmluZEludDMyKCJiaXRyYXRlIiwgJmF2Z0JpdFJhdGUpOworCisgICAgICAgICAgICBpbnQzMl90IGFhY1Byb2ZpbGUgPSAtMTsKKyAgICAgICAgICAgIGlmIChhdWRpb0Zvcm1hdCA9PSBBVURJT19GT1JNQVRfQUFDCisgICAgICAgICAgICAgICAgICAgICYmIGZvcm1hdC0+ZmluZEludDMyKCJhYWMtcHJvZmlsZSIsICZhYWNQcm9maWxlKSkgeworICAgICAgICAgICAgICAgIC8vIFJlZGVmaW5lIEFBQyBmb3JtYXQgYXMgcGVyIGFhYyBwcm9maWxlCisgICAgICAgICAgICAgICAgbWFwQUFDUHJvZmlsZVRvQXVkaW9Gb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb0Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFhY1Byb2ZpbGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdWRpb19vZmZsb2FkX2luZm9fdCBvZmZsb2FkSW5mbyA9IEFVRElPX0lORk9fSU5JVElBTElaRVI7CisgICAgICAgICAgICBvZmZsb2FkSW5mby5kdXJhdGlvbl91cyA9IC0xOworICAgICAgICAgICAgZm9ybWF0LT5maW5kSW50NjQoCisgICAgICAgICAgICAgICAgICAgICJkdXJhdGlvblVzIiwgJm9mZmxvYWRJbmZvLmR1cmF0aW9uX3VzKTsKKyAgICAgICAgICAgIG9mZmxvYWRJbmZvLnNhbXBsZV9yYXRlID0gc2FtcGxlUmF0ZTsKKyAgICAgICAgICAgIG9mZmxvYWRJbmZvLmNoYW5uZWxfbWFzayA9IGNoYW5uZWxNYXNrOworICAgICAgICAgICAgb2ZmbG9hZEluZm8uZm9ybWF0ID0gYXVkaW9Gb3JtYXQ7CisgICAgICAgICAgICBvZmZsb2FkSW5mby5zdHJlYW1fdHlwZSA9IEFVRElPX1NUUkVBTV9NVVNJQzsKKyAgICAgICAgICAgIG9mZmxvYWRJbmZvLmJpdF9yYXRlID0gYXZnQml0UmF0ZTsKKyAgICAgICAgICAgIG9mZmxvYWRJbmZvLmhhc192aWRlbyA9IGhhc1ZpZGVvOworICAgICAgICAgICAgb2ZmbG9hZEluZm8uaXNfc3RyZWFtaW5nID0gaXNTdHJlYW1pbmc7CisKKyAgICAgICAgICAgIGlmIChtZW1jbXAoJm1DdXJyZW50T2ZmbG9hZEluZm8sICZvZmZsb2FkSW5mbywgc2l6ZW9mKG9mZmxvYWRJbmZvKSkgPT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJvcGVuQXVkaW9TaW5rOiBubyBjaGFuZ2UgaW4gb2ZmbG9hZCBtb2RlIik7CisgICAgICAgICAgICAgICAgLy8gbm8gY2hhbmdlIGZyb20gcHJldmlvdXMgY29uZmlndXJhdGlvbiwgZXZlcnl0aGluZyBvay4KKyAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ3VycmVudFBjbUluZm8gPSBBVURJT19QQ01JTkZPX0lOSVRJQUxJWkVSOworCisgICAgICAgICAgICBBTE9HVigib3BlbkF1ZGlvU2luazogdHJ5IHRvIG9wZW4gQXVkaW9TaW5rIGluIG9mZmxvYWQgbW9kZSIpOworICAgICAgICAgICAgdWludDMyX3Qgb2ZmbG9hZEZsYWdzID0gZmxhZ3M7CisgICAgICAgICAgICBvZmZsb2FkRmxhZ3MgfD0gQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRDsKKyAgICAgICAgICAgIG9mZmxvYWRGbGFncyAmPSB+QVVESU9fT1VUUFVUX0ZMQUdfREVFUF9CVUZGRVI7CisgICAgICAgICAgICBhdWRpb1NpbmtDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIG1BdWRpb1NpbmstPmNsb3NlKCk7CisKKyAgICAgICAgICAgIGVyciA9IG1BdWRpb1NpbmstPm9wZW4oCisgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgIGF1ZGlvRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAwIC8qIGJ1ZmZlckNvdW50IC0gdW51c2VkICovLAorICAgICAgICAgICAgICAgICAgICAmTnVQbGF5ZXIyOjpSZW5kZXJlcjo6QXVkaW9TaW5rQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgIHRoaXMsCisgICAgICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdClvZmZsb2FkRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICZvZmZsb2FkSW5mbyk7CisKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBtQXVkaW9TaW5rLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrU2V0dGluZ3MpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHBsYXliYWNrIGlzIG9mZmxvYWRlZCB0byBoL3csIHdlIHBhc3MKKyAgICAgICAgICAgICAgICAvLyB0aGUgSEFMIHNvbWUgbWV0YWRhdGEgaW5mb3JtYXRpb24uCisgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byBkbyB0aGlzIGZvciBQQ00gYmVjYXVzZSBpdAorICAgICAgICAgICAgICAgIC8vIHdpbGwgYmUgZ29pbmcgdGhyb3VnaCB0aGUgQXVkaW9GbGluZ2VyIG1peGVyCisgICAgICAgICAgICAgICAgLy8gYmVmb3JlIHJlYWNoaW5nIHRoZSBoYXJkd2FyZS4KKyAgICAgICAgICAgICAgICAvLyBUT0RPCisgICAgICAgICAgICAgICAgbUN1cnJlbnRPZmZsb2FkSW5mbyA9IG9mZmxvYWRJbmZvOworICAgICAgICAgICAgICAgIGlmICghbVBhdXNlZCkgeyAvLyBmb3IgcHJldmlldyBtb2RlLCBkb24ndCBzdGFydCBpZiBwYXVzZWQKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gbUF1ZGlvU2luay0+c3RhcnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1ZfSUYoZXJyID09IE9LLCAib3BlbkF1ZGlvU2luazogb2ZmbG9hZCBzdWNjZWVkZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAvLyBDbGVhbiB1cCwgZmFsbCBiYWNrIHRvIG5vbiBvZmZsb2FkIG1vZGUuCisgICAgICAgICAgICAgICAgbUF1ZGlvU2luay0+Y2xvc2UoKTsKKyAgICAgICAgICAgICAgICBvbkRpc2FibGVPZmZsb2FkQXVkaW8oKTsKKyAgICAgICAgICAgICAgICBtQ3VycmVudE9mZmxvYWRJbmZvID0gQVVESU9fSU5GT19JTklUSUFMSVpFUjsKKyAgICAgICAgICAgICAgICBBTE9HVigib3BlbkF1ZGlvU2luazogb2ZmbG9hZCBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICBpZiAob2ZmbG9hZE9ubHkpIHsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5QXVkaW9UZWFyRG93bihrRm9yY2VOb25PZmZsb2FkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1Vc2VBdWRpb0NhbGxiYWNrID0gdHJ1ZTsgIC8vIG9mZmxvYWQgbW9kZSB0cmFuc2ZlcnMgZGF0YSB0aHJvdWdoIGNhbGxiYWNrCisgICAgICAgICAgICAgICAgKyttQXVkaW9EcmFpbkdlbmVyYXRpb247ICAvLyBkaXNjYXJkIHBlbmRpbmcga1doYXREcmFpbkF1ZGlvUXVldWUgbWVzc2FnZS4KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIW9mZmxvYWRPbmx5ICYmICFvZmZsb2FkaW5nQXVkaW8oKSkgeworICAgICAgICBBTE9HVigib3BlbkF1ZGlvU2luazogb3BlbiBBdWRpb1NpbmsgaW4gTk9OLW9mZmxvYWQgbW9kZSIpOworICAgICAgICB1aW50MzJfdCBwY21GbGFncyA9IGZsYWdzOworICAgICAgICBwY21GbGFncyAmPSB+QVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRDsKKworICAgICAgICBjb25zdCBQY21JbmZvIGluZm8gPSB7CisgICAgICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KWNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdClwY21GbGFncywKKyAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwgLy8gVE9ETzogY2hhbmdlIHRvIGF1ZGlvRm9ybWF0CisgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZQorICAgICAgICB9OworICAgICAgICBpZiAobWVtY21wKCZtQ3VycmVudFBjbUluZm8sICZpbmZvLCBzaXplb2YoaW5mbykpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dWKCJvcGVuQXVkaW9TaW5rOiBubyBjaGFuZ2UgaW4gcGNtIG1vZGUiKTsKKyAgICAgICAgICAgIC8vIG5vIGNoYW5nZSBmcm9tIHByZXZpb3VzIGNvbmZpZ3VyYXRpb24sIGV2ZXJ5dGhpbmcgb2suCisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKworICAgICAgICBhdWRpb1NpbmtDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgbUF1ZGlvU2luay0+Y2xvc2UoKTsKKyAgICAgICAgbUN1cnJlbnRPZmZsb2FkSW5mbyA9IEFVRElPX0lORk9fSU5JVElBTElaRVI7CisgICAgICAgIC8vIE5vdGU6IEl0IGlzIHBvc3NpYmxlIHRvIHNldCB1cCB0aGUgY2FsbGJhY2ssIGJ1dCBub3QgdXNlIGl0IHRvIHNlbmQgYXVkaW8gZGF0YS4KKyAgICAgICAgLy8gVGhpcyByZXF1aXJlcyBhIGZpeCBpbiBBdWRpb1NpbmsgdG8gZXhwbGljaXRseSBzcGVjaWZ5IHRoZSB0cmFuc2ZlciBtb2RlLgorICAgICAgICBtVXNlQXVkaW9DYWxsYmFjayA9IGdldFVzZUF1ZGlvQ2FsbGJhY2tTZXR0aW5nKCk7CisgICAgICAgIGlmIChtVXNlQXVkaW9DYWxsYmFjaykgeworICAgICAgICAgICAgKyttQXVkaW9EcmFpbkdlbmVyYXRpb247ICAvLyBkaXNjYXJkIHBlbmRpbmcga1doYXREcmFpbkF1ZGlvUXVldWUgbWVzc2FnZS4KKyAgICAgICAgfQorCisgICAgICAgIC8vIENvbXB1dGUgdGhlIGRlc2lyZWQgYnVmZmVyIHNpemUuCisgICAgICAgIC8vIEZvciBjYWxsYmFjayBtb2RlLCB0aGUgYW1vdW50IG9mIHRpbWUgYmVmb3JlIHdha2V1cCBpcyBhYm91dCBoYWxmIHRoZSBidWZmZXIgc2l6ZS4KKyAgICAgICAgY29uc3QgdWludDMyX3QgZnJhbWVDb3VudCA9CisgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzYW1wbGVSYXRlICogZ2V0QXVkaW9TaW5rUGNtTXNTZXR0aW5nKCkgLyAxMDAwOworCisgICAgICAgIC8vIFRoZSBkb05vdFJlY29ubmVjdCBtZWFucyBBdWRpb1Npbmsgd2lsbCBzaWduYWwgYmFjayBhbmQgbGV0IE51UGxheWVyMiB0byByZS1jb25zdHJ1Y3QKKyAgICAgICAgLy8gQXVkaW9TaW5rLiBXZSBkb24ndCB3YW50IHRoaXMgd2hlbiB0aGVyZSdzIHZpZGVvIGJlY2F1c2UgaXQgd2lsbCBjYXVzZSBhIHZpZGVvIHNlZWsgdG8KKyAgICAgICAgLy8gdGhlIHByZXZpb3VzIEkgZnJhbWUuIEJ1dCB3ZSBkbyB3YW50IHRoaXMgd2hlbiB0aGVyZSdzIG9ubHkgYXVkaW8gYmVjYXVzZSBpdCB3aWxsIGdpdmUKKyAgICAgICAgLy8gTnVQbGF5ZXIyIGEgY2hhbmNlIHRvIHN3aXRjaCBmcm9tIG5vbi1vZmZsb2FkIG1vZGUgdG8gb2ZmbG9hZCBtb2RlLgorICAgICAgICAvLyBTbyB3ZSBvbmx5IHNldCBkb05vdFJlY29ubmVjdCB3aGVuIHRoZXJlJ3Mgbm8gdmlkZW8uCisgICAgICAgIGNvbnN0IGJvb2wgZG9Ob3RSZWNvbm5lY3QgPSAhaGFzVmlkZW87CisKKyAgICAgICAgLy8gV2Ugc2hvdWxkIGFsd2F5cyBiZSBhYmxlIHRvIHNldCBvdXIgcGxheWJhY2sgc2V0dGluZ3MgaWYgdGhlIHNpbmsgaXMgY2xvc2VkLgorICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1BdWRpb1NpbmstPnNldFBsYXliYWNrUmF0ZShtUGxheWJhY2tTZXR0aW5ncykgIT0gT0ssCisgICAgICAgICAgICAgICAgIm9uT3BlbkF1ZGlvU2luazogY2FuJ3Qgc2V0IHBsYXliYWNrIHJhdGUgb24gY2xvc2VkIHNpbmsiKTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUF1ZGlvU2luay0+b3BlbigKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdCljaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsCisgICAgICAgICAgICAgICAgICAgIDAgLyogYnVmZmVyQ291bnQgLSB1bnVzZWQgKi8sCisgICAgICAgICAgICAgICAgICAgIG1Vc2VBdWRpb0NhbGxiYWNrID8gJk51UGxheWVyMjo6UmVuZGVyZXI6OkF1ZGlvU2lua0NhbGxiYWNrIDogTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgbVVzZUF1ZGlvQ2FsbGJhY2sgPyB0aGlzIDogTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KXBjbUZsYWdzLAorICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICBkb05vdFJlY29ubmVjdCwKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dXKCJvcGVuQXVkaW9TaW5rOiBub24gb2ZmbG9hZGVkIG9wZW4gZmFpbGVkIHN0YXR1czogJWQiLCBlcnIpOworICAgICAgICAgICAgbUF1ZGlvU2luay0+Y2xvc2UoKTsKKyAgICAgICAgICAgIG1DdXJyZW50UGNtSW5mbyA9IEFVRElPX1BDTUlORk9fSU5JVElBTElaRVI7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIG1DdXJyZW50UGNtSW5mbyA9IGluZm87CisgICAgICAgIGlmICghbVBhdXNlZCkgeyAvLyBmb3IgcHJldmlldyBtb2RlLCBkb24ndCBzdGFydCBpZiBwYXVzZWQKKyAgICAgICAgICAgIG1BdWRpb1NpbmstPnN0YXJ0KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGF1ZGlvU2lua0NoYW5nZWQpIHsKKyAgICAgICAgb25BdWRpb1NpbmtDaGFuZ2VkKCk7CisgICAgfQorICAgIG1BdWRpb1Rvcm5Eb3duID0gZmFsc2U7CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6Om9uQ2xvc2VBdWRpb1NpbmsoKSB7CisgICAgbUF1ZGlvU2luay0+Y2xvc2UoKTsKKyAgICBtQ3VycmVudE9mZmxvYWRJbmZvID0gQVVESU9fSU5GT19JTklUSUFMSVpFUjsKKyAgICBtQ3VycmVudFBjbUluZm8gPSBBVURJT19QQ01JTkZPX0lOSVRJQUxJWkVSOworfQorCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6Om9uQ2hhbmdlQXVkaW9Gb3JtYXQoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbWV0YSwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpIHsKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgIENIRUNLKG1ldGEtPmZpbmRNZXNzYWdlKCJmb3JtYXQiLCAmZm9ybWF0KSk7CisKKyAgICBpbnQzMl90IG9mZmxvYWRPbmx5OworICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMigib2ZmbG9hZC1vbmx5IiwgJm9mZmxvYWRPbmx5KSk7CisKKyAgICBpbnQzMl90IGhhc1ZpZGVvOworICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMigiaGFzLXZpZGVvIiwgJmhhc1ZpZGVvKSk7CisKKyAgICB1aW50MzJfdCBmbGFnczsKKyAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoImZsYWdzIiwgKGludDMyX3QgKikmZmxhZ3MpKTsKKworICAgIHVpbnQzMl90IGlzU3RyZWFtaW5nOworICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMigiaXNTdHJlYW1pbmciLCAoaW50MzJfdCAqKSZpc1N0cmVhbWluZykpOworCisgICAgc3RhdHVzX3QgZXJyID0gb25PcGVuQXVkaW9TaW5rKGZvcm1hdCwgb2ZmbG9hZE9ubHksIGhhc1ZpZGVvLCBmbGFncywgaXNTdHJlYW1pbmcpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBub3RpZnktPnNldEludDMyKCJlcnIiLCBlcnIpOworICAgIH0KKyAgICBub3RpZnktPnBvc3QoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJSZW5kZXJlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJSZW5kZXJlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyY2YwZDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMlJlbmRlcmVyLmgKQEAgLTAsMCArMSwzMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTlVQTEFZRVIyX1JFTkRFUkVSX0hfCisKKyNkZWZpbmUgTlVQTEFZRVIyX1JFTkRFUkVSX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgorI2luY2x1ZGUgPG1lZGlhL0FWU3luY1NldHRpbmdzLmg+CisKKyNpbmNsdWRlICJOdVBsYXllcjIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyAgSldha2VMb2NrOworc3RydWN0IE1lZGlhQ2xvY2s7CitjbGFzcyBNZWRpYUNvZGVjQnVmZmVyOworc3RydWN0IFZpZGVvRnJhbWVTY2hlZHVsZXI7CisKK3N0cnVjdCBOdVBsYXllcjI6OlJlbmRlcmVyIDogcHVibGljIEFIYW5kbGVyIHsKKyAgICBlbnVtIEZsYWdzIHsKKyAgICAgICAgRkxBR19SRUFMX1RJTUUgPSAxLAorICAgICAgICBGTEFHX09GRkxPQURfQVVESU8gPSAyLAorICAgIH07CisgICAgUmVuZGVyZXIoY29uc3Qgc3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlOjpBdWRpb1Npbms+ICZzaW5rLAorICAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ2xvY2s+ICZtZWRpYUNsb2NrLAorICAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAorICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7CisKKyAgICBzdGF0aWMgc2l6ZV90IEF1ZGlvU2lua0NhbGxiYWNrKAorICAgICAgICAgICAgTWVkaWFQbGF5ZXIySW50ZXJmYWNlOjpBdWRpb1NpbmsgKmF1ZGlvU2luaywKKyAgICAgICAgICAgIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCB2b2lkICptZSwKKyAgICAgICAgICAgIE1lZGlhUGxheWVyMkludGVyZmFjZTo6QXVkaW9TaW5rOjpjYl9ldmVudF90IGV2ZW50KTsKKworICAgIHZvaWQgcXVldWVCdWZmZXIoCisgICAgICAgICAgICBib29sIGF1ZGlvLAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5Q29uc3VtZWQpOworCisgICAgdm9pZCBxdWV1ZUVPUyhib29sIGF1ZGlvLCBzdGF0dXNfdCBmaW5hbFJlc3VsdCk7CisKKyAgICBzdGF0dXNfdCBzZXRQbGF5YmFja1NldHRpbmdzKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZyYXRlIC8qIHNhbml0aXplZCAqLyk7CisgICAgc3RhdHVzX3QgZ2V0UGxheWJhY2tTZXR0aW5ncyhBdWRpb1BsYXliYWNrUmF0ZSAqcmF0ZSAvKiBub25udWxsICovKTsKKyAgICBzdGF0dXNfdCBzZXRTeW5jU2V0dGluZ3MoY29uc3QgQVZTeW5jU2V0dGluZ3MgJnN5bmMsIGZsb2F0IHZpZGVvRnBzSGludCk7CisgICAgc3RhdHVzX3QgZ2V0U3luY1NldHRpbmdzKEFWU3luY1NldHRpbmdzICpzeW5jIC8qIG5vbm51bGwgKi8sIGZsb2F0ICp2aWRlb0ZwcyAvKiBub25udWxsICovKTsKKworICAgIHZvaWQgZmx1c2goYm9vbCBhdWRpbywgYm9vbCBub3RpZnlDb21wbGV0ZSk7CisKKyAgICB2b2lkIHNpZ25hbFRpbWVEaXNjb250aW51aXR5KCk7CisKKyAgICB2b2lkIHNpZ25hbERpc2FibGVPZmZsb2FkQXVkaW8oKTsKKyAgICB2b2lkIHNpZ25hbEVuYWJsZU9mZmxvYWRBdWRpbygpOworCisgICAgdm9pZCBwYXVzZSgpOworICAgIHZvaWQgcmVzdW1lKCk7CisKKyAgICB2b2lkIHNldFZpZGVvRnJhbWVSYXRlKGZsb2F0IGZwcyk7CisKKyAgICBzdGF0dXNfdCBnZXRDdXJyZW50UG9zaXRpb24oaW50NjRfdCAqbWVkaWFVcyk7CisgICAgaW50NjRfdCBnZXRWaWRlb0xhdGVCeVVzKCk7CisKKyAgICBzdGF0dXNfdCBvcGVuQXVkaW9TaW5rKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgICAgICBib29sIG9mZmxvYWRPbmx5LAorICAgICAgICAgICAgYm9vbCBoYXNWaWRlbywKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAorICAgICAgICAgICAgYm9vbCAqaXNPZmZsb2FkZWQsCisgICAgICAgICAgICBib29sIGlzU3RyZWFtaW5nKTsKKyAgICB2b2lkIGNsb3NlQXVkaW9TaW5rKCk7CisKKyAgICAvLyByZS1vcGVuIGF1ZGlvIHNpbmsgYWZ0ZXIgYWxsIHBlbmRpbmcgYXVkaW8gYnVmZmVycyBwbGF5ZWQuCisgICAgdm9pZCBjaGFuZ2VBdWRpb0Zvcm1hdCgKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgYm9vbCBvZmZsb2FkT25seSwKKyAgICAgICAgICAgIGJvb2wgaGFzVmlkZW8sCisgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKKyAgICAgICAgICAgIGJvb2wgaXNTdHJlYW1pbmcsCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSk7CisKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRFT1MgICAgICAgICAgICAgICAgICAgICAgPSAnZW9zICcsCisgICAgICAgIGtXaGF0Rmx1c2hDb21wbGV0ZSAgICAgICAgICAgID0gJ2ZsdUMnLAorICAgICAgICBrV2hhdFBvc2l0aW9uICAgICAgICAgICAgICAgICA9ICdwb3NpJywKKyAgICAgICAga1doYXRWaWRlb1JlbmRlcmluZ1N0YXJ0ICAgICAgPSAndmRyZCcsCisgICAgICAgIGtXaGF0TWVkaWFSZW5kZXJpbmdTdGFydCAgICAgID0gJ21kcmQnLAorICAgICAgICBrV2hhdEF1ZGlvVGVhckRvd24gICAgICAgICAgICA9ICdhZFREJywKKyAgICAgICAga1doYXRBdWRpb09mZmxvYWRQYXVzZVRpbWVvdXQgPSAnYU9QVCcsCisgICAgfTsKKworICAgIGVudW0gQXVkaW9UZWFyRG93blJlYXNvbiB7CisgICAgICAgIGtEdWVUb0Vycm9yID0gMCwgICAvLyBDb3VsZCByZXN0YXJ0IHdpdGggZWl0aGVyIG9mZmxvYWQgb3Igbm9uLW9mZmxvYWQuCisgICAgICAgIGtEdWVUb1RpbWVvdXQsCisgICAgICAgIGtGb3JjZU5vbk9mZmxvYWQsICAvLyBSZXN0YXJ0IG9ubHkgd2l0aCBub24tb2ZmbG9hZC4KKyAgICB9OworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+UmVuZGVyZXIoKTsKKworICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtXaGF0RHJhaW5BdWRpb1F1ZXVlICAgICA9ICdkcmFBJywKKyAgICAgICAga1doYXREcmFpblZpZGVvUXVldWUgICAgID0gJ2RyYVYnLAorICAgICAgICBrV2hhdFBvc3REcmFpblZpZGVvUXVldWUgPSAncERWUScsCisgICAgICAgIGtXaGF0UXVldWVCdWZmZXIgICAgICAgICA9ICdxdWVCJywKKyAgICAgICAga1doYXRRdWV1ZUVPUyAgICAgICAgICAgID0gJ3FFT1MnLAorICAgICAgICBrV2hhdENvbmZpZ1BsYXliYWNrICAgICAgPSAnY2ZQQicsCisgICAgICAgIGtXaGF0Q29uZmlnU3luYyAgICAgICAgICA9ICdjZlN5JywKKyAgICAgICAga1doYXRHZXRQbGF5YmFja1NldHRpbmdzID0gJ2dQYlMnLAorICAgICAgICBrV2hhdEdldFN5bmNTZXR0aW5ncyAgICAgPSAnZ1N5UycsCisgICAgICAgIGtXaGF0Rmx1c2ggICAgICAgICAgICAgICA9ICdmbHVzJywKKyAgICAgICAga1doYXRQYXVzZSAgICAgICAgICAgICAgID0gJ3BhdXMnLAorICAgICAgICBrV2hhdFJlc3VtZSAgICAgICAgICAgICAgPSAncmVzbScsCisgICAgICAgIGtXaGF0T3BlbkF1ZGlvU2luayAgICAgICA9ICdvcG5BJywKKyAgICAgICAga1doYXRDbG9zZUF1ZGlvU2luayAgICAgID0gJ2Nsc0EnLAorICAgICAgICBrV2hhdENoYW5nZUF1ZGlvRm9ybWF0ICAgPSAnY2hnQScsCisgICAgICAgIGtXaGF0U3RvcEF1ZGlvU2luayAgICAgICA9ICdzdHBBJywKKyAgICAgICAga1doYXREaXNhYmxlT2ZmbG9hZEF1ZGlvID0gJ25vT0EnLAorICAgICAgICBrV2hhdEVuYWJsZU9mZmxvYWRBdWRpbyAgPSAnZW5PQScsCisgICAgICAgIGtXaGF0U2V0VmlkZW9GcmFtZVJhdGUgICA9ICdzVkZSJywKKyAgICB9OworCisgICAgLy8gaWYgbUJ1ZmZlciAhPSBudWxscHRyLCBpdCdzIGEgYnVmZmVyIGNvbnRhaW5pbmcgcmVhbCBkYXRhLgorICAgIC8vIGVsc2UgaWYgbU5vdGlmeUNvbnN1bWVkID09IG51bGxwdHIsIGl0J3MgRU9TLgorICAgIC8vIGVsc2UgaXQncyBhIHRhZyBmb3IgcmUtb3BlbmluZyBhdWRpbyBzaW5rIGluIGRpZmZlcmVudCBmb3JtYXQuCisgICAgc3RydWN0IFF1ZXVlRW50cnkgeworICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBtQnVmZmVyOworICAgICAgICBzcDxBTWVzc2FnZT4gbU1ldGE7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5Q29uc3VtZWQ7CisgICAgICAgIHNpemVfdCBtT2Zmc2V0OworICAgICAgICBzdGF0dXNfdCBtRmluYWxSZXN1bHQ7CisgICAgICAgIGludDMyX3QgbUJ1ZmZlck9yZGluYWw7CisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtNaW5Qb3NpdGlvblVwZGF0ZURlbGF5VXM7CisKKyAgICBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2U6OkF1ZGlvU2luaz4gbUF1ZGlvU2luazsKKyAgICBib29sIG1Vc2VWaXJ0dWFsQXVkaW9TaW5rOworICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5OworICAgIE11dGV4IG1Mb2NrOworICAgIHVpbnQzMl90IG1GbGFnczsKKyAgICBMaXN0PFF1ZXVlRW50cnk+IG1BdWRpb1F1ZXVlOworICAgIExpc3Q8UXVldWVFbnRyeT4gbVZpZGVvUXVldWU7CisgICAgdWludDMyX3QgbU51bUZyYW1lc1dyaXR0ZW47CisgICAgc3A8VmlkZW9GcmFtZVNjaGVkdWxlcj4gbVZpZGVvU2NoZWR1bGVyOworCisgICAgYm9vbCBtRHJhaW5BdWRpb1F1ZXVlUGVuZGluZzsKKyAgICBib29sIG1EcmFpblZpZGVvUXVldWVQZW5kaW5nOworICAgIGludDMyX3QgbUF1ZGlvUXVldWVHZW5lcmF0aW9uOworICAgIGludDMyX3QgbVZpZGVvUXVldWVHZW5lcmF0aW9uOworICAgIGludDMyX3QgbUF1ZGlvRHJhaW5HZW5lcmF0aW9uOworICAgIGludDMyX3QgbVZpZGVvRHJhaW5HZW5lcmF0aW9uOworICAgIGludDMyX3QgbUF1ZGlvRU9TR2VuZXJhdGlvbjsKKworICAgIGNvbnN0IHNwPE1lZGlhQ2xvY2s+IG1NZWRpYUNsb2NrOworICAgIGZsb2F0IG1QbGF5YmFja1JhdGU7IC8vIGF1ZGlvIHRyYWNrIHJhdGUKKworICAgIEF1ZGlvUGxheWJhY2tSYXRlIG1QbGF5YmFja1NldHRpbmdzOworICAgIEFWU3luY1NldHRpbmdzIG1TeW5jU2V0dGluZ3M7CisgICAgZmxvYXQgbVZpZGVvRnBzSGludDsKKworICAgIGludDY0X3QgbUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVczsKKyAgICBpbnQ2NF90IG1BbmNob3JUaW1lTWVkaWFVczsKKyAgICBpbnQ2NF90IG1BbmNob3JOdW1GcmFtZXNXcml0dGVuOworICAgIGludDY0X3QgbVZpZGVvTGF0ZUJ5VXM7CisgICAgaW50NjRfdCBtTmV4dFZpZGVvVGltZU1lZGlhVXM7CisgICAgYm9vbCBtSGFzQXVkaW87CisgICAgYm9vbCBtSGFzVmlkZW87CisKKyAgICBib29sIG1Ob3RpZnlDb21wbGV0ZUF1ZGlvOworICAgIGJvb2wgbU5vdGlmeUNvbXBsZXRlVmlkZW87CisKKyAgICBib29sIG1TeW5jUXVldWVzOworCisgICAgLy8gbW9kaWZpZWQgb24gb25seSByZW5kZXJlcidzIHRocmVhZC4KKyAgICBib29sIG1QYXVzZWQ7CisgICAgaW50NjRfdCBtUGF1c2VEcmFpbkF1ZGlvQWxsb3dlZFVzOyAvLyB0aW1lIHdoZW4gd2UgY2FuIGRyYWluL2RlbGl2ZXIgYXVkaW8gaW4gcGF1c2UgbW9kZS4KKworICAgIGJvb2wgbVZpZGVvU2FtcGxlUmVjZWl2ZWQ7CisgICAgYm9vbCBtVmlkZW9SZW5kZXJpbmdTdGFydGVkOworICAgIGludDMyX3QgbVZpZGVvUmVuZGVyaW5nU3RhcnRHZW5lcmF0aW9uOworICAgIGludDMyX3QgbUF1ZGlvUmVuZGVyaW5nU3RhcnRHZW5lcmF0aW9uOworICAgIGJvb2wgbVJlbmRlcmluZ0RhdGFEZWxpdmVyZWQ7CisKKyAgICBpbnQ2NF90IG1OZXh0QXVkaW9DbG9ja1VwZGF0ZVRpbWVVczsKKyAgICAvLyB0aGUgbWVkaWEgdGltZXN0YW1wIG9mIGxhc3QgYXVkaW8gc2FtcGxlIHJpZ2h0IGJlZm9yZSBFT1MuCisgICAgaW50NjRfdCBtTGFzdEF1ZGlvTWVkaWFUaW1lVXM7CisKKyAgICBpbnQzMl90IG1BdWRpb09mZmxvYWRQYXVzZVRpbWVvdXRHZW5lcmF0aW9uOworICAgIGJvb2wgbUF1ZGlvVG9ybkRvd247CisgICAgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgbUN1cnJlbnRPZmZsb2FkSW5mbzsKKworICAgIHN0cnVjdCBQY21JbmZvIHsKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbUNoYW5uZWxNYXNrOworICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBtRmxhZ3M7CisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IG1Gb3JtYXQ7CisgICAgICAgIGludDMyX3QgbU51bUNoYW5uZWxzOworICAgICAgICBpbnQzMl90IG1TYW1wbGVSYXRlOworICAgIH07CisgICAgUGNtSW5mbyBtQ3VycmVudFBjbUluZm87CisgICAgc3RhdGljIGNvbnN0IFBjbUluZm8gQVVESU9fUENNSU5GT19JTklUSUFMSVpFUjsKKworICAgIGludDMyX3QgbVRvdGFsQnVmZmVyc1F1ZXVlZDsKKyAgICBpbnQzMl90IG1MYXN0QXVkaW9CdWZmZXJEcmFpbmVkOworICAgIGJvb2wgbVVzZUF1ZGlvQ2FsbGJhY2s7CisKKyAgICBzcDxKV2FrZUxvY2s+IG1XYWtlTG9jazsKKworICAgIHN0YXR1c190IGdldEN1cnJlbnRQb3NpdGlvbk9uTG9vcGVyKGludDY0X3QgKm1lZGlhVXMpOworICAgIHN0YXR1c190IGdldEN1cnJlbnRQb3NpdGlvbk9uTG9vcGVyKAorICAgICAgICAgICAgaW50NjRfdCAqbWVkaWFVcywgaW50NjRfdCBub3dVcywgYm9vbCBhbGxvd1Bhc3RRdWV1ZWRWaWRlbyA9IGZhbHNlKTsKKyAgICBib29sIGdldEN1cnJlbnRQb3NpdGlvbklmUGF1c2VkX2woaW50NjRfdCAqbWVkaWFVcyk7CisgICAgc3RhdHVzX3QgZ2V0Q3VycmVudFBvc2l0aW9uRnJvbUFuY2hvcigKKyAgICAgICAgICAgIGludDY0X3QgKm1lZGlhVXMsIGludDY0X3Qgbm93VXMsIGJvb2wgYWxsb3dQYXN0UXVldWVkVmlkZW8gPSBmYWxzZSk7CisKKyAgICB2b2lkIG5vdGlmeUVPU0NhbGxiYWNrKCk7CisgICAgc2l6ZV90IGZpbGxBdWRpb0J1ZmZlcih2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKTsKKworICAgIGJvb2wgb25EcmFpbkF1ZGlvUXVldWUoKTsKKyAgICB2b2lkIGRyYWluQXVkaW9RdWV1ZVVudGlsTGFzdEVPUygpOworICAgIGludDY0X3QgZ2V0UGVuZGluZ0F1ZGlvUGxheW91dER1cmF0aW9uVXMoaW50NjRfdCBub3dVcyk7CisgICAgdm9pZCBwb3N0RHJhaW5BdWRpb1F1ZXVlX2woaW50NjRfdCBkZWxheVVzID0gMCk7CisKKyAgICB2b2lkIGNsZWFyQW5jaG9yVGltZSgpOworICAgIHZvaWQgY2xlYXJBdWRpb0ZpcnN0QW5jaG9yVGltZV9sKCk7CisgICAgdm9pZCBzZXRBdWRpb0ZpcnN0QW5jaG9yVGltZUlmTmVlZGVkX2woaW50NjRfdCBtZWRpYVVzKTsKKyAgICB2b2lkIHNldFZpZGVvTGF0ZUJ5VXMoaW50NjRfdCBsYXRlVXMpOworCisgICAgdm9pZCBvbk5ld0F1ZGlvTWVkaWFUaW1lKGludDY0X3QgbWVkaWFUaW1lVXMpOworICAgIGludDY0X3QgZ2V0UmVhbFRpbWVVcyhpbnQ2NF90IG1lZGlhVGltZVVzLCBpbnQ2NF90IG5vd1VzKTsKKworICAgIHZvaWQgb25EcmFpblZpZGVvUXVldWUoKTsKKyAgICB2b2lkIHBvc3REcmFpblZpZGVvUXVldWUoKTsKKworICAgIHZvaWQgcHJlcGFyZUZvck1lZGlhUmVuZGVyaW5nU3RhcnRfbCgpOworICAgIHZvaWQgbm90aWZ5SWZNZWRpYVJlbmRlcmluZ1N0YXJ0ZWRfbCgpOworCisgICAgdm9pZCBvblF1ZXVlQnVmZmVyKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2b2lkIG9uUXVldWVFT1MoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZvaWQgb25GbHVzaChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCBvbkF1ZGlvU2lua0NoYW5nZWQoKTsKKyAgICB2b2lkIG9uRGlzYWJsZU9mZmxvYWRBdWRpbygpOworICAgIHZvaWQgb25FbmFibGVPZmZsb2FkQXVkaW8oKTsKKyAgICBzdGF0dXNfdCBvbkNvbmZpZ1BsYXliYWNrKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZyYXRlIC8qIHNhbml0aXplZCAqLyk7CisgICAgc3RhdHVzX3Qgb25HZXRQbGF5YmFja1NldHRpbmdzKEF1ZGlvUGxheWJhY2tSYXRlICpyYXRlIC8qIG5vbm51bGwgKi8pOworICAgIHN0YXR1c190IG9uQ29uZmlnU3luYyhjb25zdCBBVlN5bmNTZXR0aW5ncyAmc3luYywgZmxvYXQgdmlkZW9GcHNIaW50KTsKKyAgICBzdGF0dXNfdCBvbkdldFN5bmNTZXR0aW5ncyhBVlN5bmNTZXR0aW5ncyAqc3luYyAvKiBub25udWxsICovLCBmbG9hdCAqdmlkZW9GcHMgLyogbm9ubnVsbCAqLyk7CisKKyAgICB2b2lkIG9uUGF1c2UoKTsKKyAgICB2b2lkIG9uUmVzdW1lKCk7CisgICAgdm9pZCBvblNldFZpZGVvRnJhbWVSYXRlKGZsb2F0IGZwcyk7CisgICAgaW50MzJfdCBnZXRRdWV1ZUdlbmVyYXRpb24oYm9vbCBhdWRpbyk7CisgICAgaW50MzJfdCBnZXREcmFpbkdlbmVyYXRpb24oYm9vbCBhdWRpbyk7CisgICAgYm9vbCBnZXRTeW5jUXVldWVzKCk7CisgICAgdm9pZCBvbkF1ZGlvVGVhckRvd24oQXVkaW9UZWFyRG93blJlYXNvbiByZWFzb24pOworICAgIHN0YXR1c190IG9uT3BlbkF1ZGlvU2luaygKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgYm9vbCBvZmZsb2FkT25seSwKKyAgICAgICAgICAgIGJvb2wgaGFzVmlkZW8sCisgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKKyAgICAgICAgICAgIGJvb2wgaXNTdHJlYW1pbmcpOworICAgIHZvaWQgb25DbG9zZUF1ZGlvU2luaygpOworICAgIHZvaWQgb25DaGFuZ2VBdWRpb0Zvcm1hdChjb25zdCBzcDxBTWVzc2FnZT4gJm1ldGEsIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5KTsKKworICAgIHZvaWQgbm90aWZ5RU9TKGJvb2wgYXVkaW8sIHN0YXR1c190IGZpbmFsUmVzdWx0LCBpbnQ2NF90IGRlbGF5VXMgPSAwKTsKKyAgICB2b2lkIG5vdGlmeUVPU19sKGJvb2wgYXVkaW8sIHN0YXR1c190IGZpbmFsUmVzdWx0LCBpbnQ2NF90IGRlbGF5VXMgPSAwKTsKKyAgICB2b2lkIG5vdGlmeUZsdXNoQ29tcGxldGUoYm9vbCBhdWRpbyk7CisgICAgdm9pZCBub3RpZnlQb3NpdGlvbigpOworICAgIHZvaWQgbm90aWZ5VmlkZW9MYXRlQnkoaW50NjRfdCBsYXRlQnlVcyk7CisgICAgdm9pZCBub3RpZnlWaWRlb1JlbmRlcmluZ1N0YXJ0KCk7CisgICAgdm9pZCBub3RpZnlBdWRpb1RlYXJEb3duKEF1ZGlvVGVhckRvd25SZWFzb24gcmVhc29uKTsKKworICAgIHZvaWQgZmx1c2hRdWV1ZShMaXN0PFF1ZXVlRW50cnk+ICpxdWV1ZSk7CisgICAgYm9vbCBkcm9wQnVmZmVySWZTdGFsZShib29sIGF1ZGlvLCBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCBzeW5jUXVldWVzRG9uZV9sKCk7CisKKyAgICBib29sIG9mZmxvYWRpbmdBdWRpbygpIGNvbnN0IHsgcmV0dXJuIChtRmxhZ3MgJiBGTEFHX09GRkxPQURfQVVESU8pICE9IDA7IH0KKworICAgIHZvaWQgc3RhcnRBdWRpb09mZmxvYWRQYXVzZVRpbWVvdXQoKTsKKyAgICB2b2lkIGNhbmNlbEF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dCgpOworCisgICAgaW50NjRfdCBnZXREdXJhdGlvblVzSWZQbGF5ZWRBdFNhbXBsZVJhdGUodWludDMyX3QgbnVtRnJhbWVzKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFJlbmRlcmVyKTsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBOVVBMQVlFUjJfUkVOREVSRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyU291cmNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMlNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MjIzNWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMlNvdXJjZS5oCkBAIC0wLDAgKzEsMTY2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE5VUExBWUVSMl9TT1VSQ0VfSF8KKworI2RlZmluZSBOVVBMQVlFUjJfU09VUkNFX0hfCisKKyNpbmNsdWRlICJOdVBsYXllcjIuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9tZWRpYXBsYXllcjIuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQUJ1ZmZlcjsKK3N0cnVjdCBBTWVkaWFDcnlwdG9XcmFwcGVyOworY2xhc3MgTWVkaWFCdWZmZXI7CisKK3N0cnVjdCBOdVBsYXllcjI6OlNvdXJjZSA6IHB1YmxpYyBBSGFuZGxlciB7CisgICAgZW51bSBGbGFncyB7CisgICAgICAgIEZMQUdfQ0FOX1BBVVNFICAgICAgICAgID0gMSwKKyAgICAgICAgRkxBR19DQU5fU0VFS19CQUNLV0FSRCAgPSAyLCAgLy8gdGhlICIxMCBzZWMgYmFjayBidXR0b24iCisgICAgICAgIEZMQUdfQ0FOX1NFRUtfRk9SV0FSRCAgID0gNCwgIC8vIHRoZSAiMTAgc2VjIGZvcndhcmQgYnV0dG9uIgorICAgICAgICBGTEFHX0NBTl9TRUVLICAgICAgICAgICA9IDgsICAvLyB0aGUgInNlZWsgYmFyIgorICAgICAgICBGTEFHX0RZTkFNSUNfRFVSQVRJT04gICA9IDE2LAorICAgICAgICBGTEFHX1NFQ1VSRSAgICAgICAgICAgICA9IDMyLCAvLyBTZWN1cmUgY29kZWMgaXMgcmVxdWlyZWQuCisgICAgICAgIEZMQUdfUFJPVEVDVEVEICAgICAgICAgID0gNjQsIC8vIFRoZSBzY3JlZW4gbmVlZHMgdG8gYmUgcHJvdGVjdGVkIChzY3JlZW5zaG90IGlzIGRpc2FibGVkKS4KKyAgICB9OworCisgICAgZW51bSB7CisgICAgICAgIGtXaGF0UHJlcGFyZWQsCisgICAgICAgIGtXaGF0RmxhZ3NDaGFuZ2VkLAorICAgICAgICBrV2hhdFZpZGVvU2l6ZUNoYW5nZWQsCisgICAgICAgIGtXaGF0QnVmZmVyaW5nVXBkYXRlLAorICAgICAgICBrV2hhdFBhdXNlT25CdWZmZXJpbmdTdGFydCwKKyAgICAgICAga1doYXRSZXN1bWVPbkJ1ZmZlcmluZ0VuZCwKKyAgICAgICAga1doYXRDYWNoZVN0YXRzLAorICAgICAgICBrV2hhdFN1YnRpdGxlRGF0YSwKKyAgICAgICAga1doYXRUaW1lZFRleHREYXRhLAorICAgICAgICBrV2hhdFRpbWVkTWV0YURhdGEsCisgICAgICAgIGtXaGF0UXVldWVEZWNvZGVyU2h1dGRvd24sCisgICAgICAgIGtXaGF0RHJtTm9MaWNlbnNlLAorICAgICAgICAvLyBNb2R1bGFyIERSTQorICAgICAgICBrV2hhdERybUluZm8sCisgICAgfTsKKworICAgIC8vIFRoZSBwcm92aWRlcyBtZXNzYWdlIGlzIHVzZWQgdG8gbm90aWZ5IHRoZSBwbGF5ZXIgYWJvdXQgdmFyaW91cworICAgIC8vIGV2ZW50cy4KKyAgICBleHBsaWNpdCBTb3VyY2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpCisgICAgICAgIDogbU5vdGlmeShub3RpZnkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlcmluZ1NldHRpbmdzKAorICAgICAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgcHJlcGFyZUFzeW5jKCkgPSAwOworCisgICAgdmlydHVhbCB2b2lkIHN0YXJ0KCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBzdG9wKCkge30KKyAgICB2aXJ0dWFsIHZvaWQgcGF1c2UoKSB7fQorICAgIHZpcnR1YWwgdm9pZCByZXN1bWUoKSB7fQorCisgICAgLy8gRXhwbGljaXRseSBkaXNjb25uZWN0IHRoZSB1bmRlcmxpbmcgZGF0YSBzb3VyY2UKKyAgICB2aXJ0dWFsIHZvaWQgZGlzY29ubmVjdCgpIHt9CisKKyAgICAvLyBSZXR1cm5zIE9LIGlmZiBtb3JlIGRhdGEgd2FzIGF2YWlsYWJsZSwKKyAgICAvLyBhbiBlcnJvciBvciBFUlJPUl9FTkRfT0ZfU1RSRUFNIGlmIG5vdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGZlZWRNb3JlVFNEYXRhKCkgPSAwOworCisgICAgLy8gUmV0dXJucyBub24tTlVMTCBmb3JtYXQgd2hlbiB0aGUgc3BlY2lmaWVkIHRyYWNrIGV4aXN0cy4KKyAgICAvLyBXaGVuIHRoZSBmb3JtYXQgaGFzICJlcnIiIHNldCB0byAtRVdPVUxEQkxPQ0ssIHNvdXJjZSBuZWVkcyBtb3JlIHRpbWUgdG8gZ2V0IHZhbGlkIG1ldGEgZGF0YS4KKyAgICAvLyBSZXR1cm5zIE5VTEwgaWYgdGhlIHNwZWNpZmllZCB0cmFjayBkb2Vzbid0IGV4aXN0IG9yIGlzIGludmFsaWQ7CisgICAgdmlydHVhbCBzcDxBTWVzc2FnZT4gZ2V0Rm9ybWF0KGJvb2wgYXVkaW8pOworCisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0TWV0YShib29sIC8qIGF1ZGlvICovKSB7IHJldHVybiBOVUxMOyB9CisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0RmlsZUZvcm1hdE1ldGEoKSBjb25zdCB7IHJldHVybiBOVUxMOyB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRlcXVldWVBY2Nlc3NVbml0KAorICAgICAgICAgICAgYm9vbCBhdWRpbywgc3A8QUJ1ZmZlcj4gKmFjY2Vzc1VuaXQpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RHVyYXRpb24oaW50NjRfdCAqIC8qIGR1cmF0aW9uVXMgKi8pIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHZpcnR1YWwgc2l6ZV90IGdldFRyYWNrQ291bnQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHZpcnR1YWwgc3A8QU1lc3NhZ2U+IGdldFRyYWNrSW5mbyhzaXplX3QgLyogdHJhY2tJbmRleCAqLykgY29uc3QgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHNzaXplX3QgZ2V0U2VsZWN0ZWRUcmFjayhtZWRpYV90cmFja190eXBlIC8qIHR5cGUgKi8pIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2VsZWN0VHJhY2soc2l6ZV90IC8qIHRyYWNrSW5kZXggKi8sIGJvb2wgLyogc2VsZWN0ICovLCBpbnQ2NF90IC8qIHRpbWVVcyovKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNlZWtUbygKKyAgICAgICAgICAgIGludDY0X3QgLyogc2Vla1RpbWVVcyAqLywKKyAgICAgICAgICAgIE1lZGlhUGxheWVyMlNlZWtNb2RlIC8qIG1vZGUgKi8gPSBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNSZWFsVGltZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBpc1N0cmVhbWluZygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHNldE9mZmxvYWRBdWRpbyhib29sIC8qIG9mZmxvYWQgKi8pIHt9CisKKyAgICAvLyBNb2R1bGFyIERSTQorICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZURybSgKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgLyogdXVpZCAqL1sxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmIC8qIGRybVNlc3Npb25JZCAqLywKKyAgICAgICAgICAgIHNwPEFNZWRpYUNyeXB0b1dyYXBwZXI+ICogLyogY3J5cHRvICovKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VEcm0oKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5Tb3VyY2UoKSB7fQorCisgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKworICAgIHNwPEFNZXNzYWdlPiBkdXBOb3RpZnkoKSBjb25zdCB7IHJldHVybiBtTm90aWZ5LT5kdXAoKTsgfQorCisgICAgdm9pZCBub3RpZnlGbGFnc0NoYW5nZWQodWludDMyX3QgZmxhZ3MpOworICAgIHZvaWQgbm90aWZ5VmlkZW9TaXplQ2hhbmdlZChjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCA9IE5VTEwpOworICAgIHZvaWQgbm90aWZ5UHJlcGFyZWQoc3RhdHVzX3QgZXJyID0gT0spOworICAgIC8vIE1vZHVsYXIgRFJNCisgICAgdm9pZCBub3RpZnlEcm1JbmZvKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOworCitwcml2YXRlOgorICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5OworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU291cmNlKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTlVQTEFZRVIyX1NPVVJDRV9IXworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL1JUU1BTb3VyY2UyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvUlRTUFNvdXJjZTIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZmUzODMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL1JUU1BTb3VyY2UyLmNwcApAQCAtMCwwICsxLDkwMiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJSVFNQU291cmNlMiIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIlJUU1BTb3VyY2UyLmgiCisKKyNpbmNsdWRlICJBbm90aGVyUGFja2V0U291cmNlLmgiCisjaW5jbHVkZSAiTXlIYW5kbGVyLmgiCisjaW5jbHVkZSAiU0RQTG9hZGVyLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUhUVFBTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdCBpbnQ2NF90IGtOZWFyRU9TVGltZW91dFVzID0gMjAwMDAwMGxsOyAvLyAyIHNlY3MKKworLy8gRGVmYXVsdCBCdWZmZXIgVW5kZXJmbG93L1ByZXBhcmUvU3RhcnRTZXJ2ZXIvT3ZlcmZsb3cgTWFya3MKK3N0YXRpYyBjb25zdCBpbnQga1VuZGVyZmxvd01hcmtNcyAgID0gIDEwMDA7ICAvLyAxIHNlY29uZAorc3RhdGljIGNvbnN0IGludCBrUHJlcGFyZU1hcmtNcyAgICAgPSAgMzAwMDsgIC8vIDMgc2Vjb25kcworLy9zdGF0aWMgY29uc3QgaW50IGtTdGFydFNlcnZlck1hcmtNcyA9ICA1MDAwOworc3RhdGljIGNvbnN0IGludCBrT3ZlcmZsb3dNYXJrTXMgICAgPSAxMDAwMDsgIC8vIDEwIHNlY29uZHMKKworTnVQbGF5ZXIyOjpSVFNQU291cmNlMjo6UlRTUFNvdXJjZTIoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAorICAgICAgICBjb25zdCBzcDxNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCisgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgYm9vbCBpc1NEUCkKKyAgICA6IFNvdXJjZShub3RpZnkpLAorICAgICAgbUhUVFBTZXJ2aWNlKGh0dHBTZXJ2aWNlKSwKKyAgICAgIG1VUkwodXJsKSwKKyAgICAgIG1VSUQodWlkKSwKKyAgICAgIG1GbGFncygwKSwKKyAgICAgIG1Jc1NEUChpc1NEUCksCisgICAgICBtU3RhdGUoRElTQ09OTkVDVEVEKSwKKyAgICAgIG1GaW5hbFJlc3VsdChPSyksCisgICAgICBtRGlzY29ubmVjdFJlcGx5SUQoMCksCisgICAgICBtQnVmZmVyaW5nKGZhbHNlKSwKKyAgICAgIG1JblByZXBhcmF0aW9uUGhhc2UodHJ1ZSksCisgICAgICBtRU9TUGVuZGluZyhmYWxzZSksCisgICAgICBtU2Vla0dlbmVyYXRpb24oMCksCisgICAgICBtRU9TVGltZW91dEF1ZGlvKDApLAorICAgICAgbUVPU1RpbWVvdXRWaWRlbygwKSB7CisgICAgbUJ1ZmZlcmluZ1NldHRpbmdzLm1Jbml0aWFsTWFya01zID0ga1ByZXBhcmVNYXJrTXM7CisgICAgbUJ1ZmZlcmluZ1NldHRpbmdzLm1SZXN1bWVQbGF5YmFja01hcmtNcyA9IGtPdmVyZmxvd01hcmtNczsKKyAgICBpZiAoaGVhZGVycykgeworICAgICAgICBtRXh0cmFIZWFkZXJzID0gKmhlYWRlcnM7CisKKyAgICAgICAgc3NpemVfdCBpbmRleCA9CisgICAgICAgICAgICBtRXh0cmFIZWFkZXJzLmluZGV4T2ZLZXkoU3RyaW5nOCgieC1oaWRlLXVybHMtZnJvbS1sb2ciKSk7CisKKyAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgIG1GbGFncyB8PSBrRmxhZ0luY29nbml0bzsKKworICAgICAgICAgICAgbUV4dHJhSGVhZGVycy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKKyAgICAgICAgfQorICAgIH0KK30KKworTnVQbGF5ZXIyOjpSVFNQU291cmNlMjo6flJUU1BTb3VyY2UyKCkgeworICAgIGlmIChtTG9vcGVyICE9IE5VTEwpIHsKKyAgICAgICAgbUxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIoaWQoKSk7CisgICAgICAgIG1Mb29wZXItPnN0b3AoKTsKKyAgICB9Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6UlRTUFNvdXJjZTI6OmdldEJ1ZmZlcmluZ1NldHRpbmdzKAorICAgICAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1CdWZmZXJpbmdTZXR0aW5nc0xvY2spOworICAgICpidWZmZXJpbmcgPSBtQnVmZmVyaW5nU2V0dGluZ3M7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OlJUU1BTb3VyY2UyOjpzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1CdWZmZXJpbmdTZXR0aW5nc0xvY2spOworICAgIG1CdWZmZXJpbmdTZXR0aW5ncyA9IGJ1ZmZlcmluZzsKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSVFNQU291cmNlMjo6cHJlcGFyZUFzeW5jKCkgeworICAgIGlmIChtSXNTRFAgJiYgbUhUVFBTZXJ2aWNlID09IE5VTEwpIHsKKyAgICAgICAgbm90aWZ5UHJlcGFyZWQoQkFEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtTG9vcGVyID09IE5VTEwpIHsKKyAgICAgICAgbUxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgICAgICBtTG9vcGVyLT5zZXROYW1lKCJydHNwIik7CisgICAgICAgIG1Mb29wZXItPnN0YXJ0KCk7CisKKyAgICAgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKHRoaXMpOworICAgIH0KKworICAgIENIRUNLKG1IYW5kbGVyID09IE5VTEwpOworICAgIENIRUNLKG1TRFBMb2FkZXIgPT0gTlVMTCk7CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0Tm90aWZ5LCB0aGlzKTsKKworICAgIENIRUNLX0VRKG1TdGF0ZSwgKGludClESVNDT05ORUNURUQpOworICAgIG1TdGF0ZSA9IENPTk5FQ1RJTkc7CisKKyAgICBpZiAobUlzU0RQKSB7CisgICAgICAgIG1TRFBMb2FkZXIgPSBuZXcgU0RQTG9hZGVyKG5vdGlmeSwKKyAgICAgICAgICAgICAgICAobUZsYWdzICYga0ZsYWdJbmNvZ25pdG8pID8gU0RQTG9hZGVyOjprRmxhZ0luY29nbml0byA6IDAsCisgICAgICAgICAgICAgICAgbUhUVFBTZXJ2aWNlKTsKKworICAgICAgICBtU0RQTG9hZGVyLT5sb2FkKAorICAgICAgICAgICAgICAgIG1VUkwuY19zdHIoKSwgbUV4dHJhSGVhZGVycy5pc0VtcHR5KCkgPyBOVUxMIDogJm1FeHRyYUhlYWRlcnMpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1IYW5kbGVyID0gbmV3IE15SGFuZGxlcihtVVJMLmNfc3RyKCksIG5vdGlmeSwgdHJ1ZSAvKiB1aWRWYWxpZCAqLywgbVVJRCk7CisgICAgICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlcik7CisKKyAgICAgICAgbUhhbmRsZXItPmNvbm5lY3QoKTsKKyAgICB9CisKKyAgICBzdGFydEJ1ZmZlcmluZ0lmTmVjZXNzYXJ5KCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSVFNQU291cmNlMjo6c3RhcnQoKSB7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSVFNQU291cmNlMjo6c3RvcCgpIHsKKyAgICBpZiAobUxvb3BlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdERpc2Nvbm5lY3QsIHRoaXMpOworCisgICAgc3A8QU1lc3NhZ2U+IGR1bW15OworICAgIG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJmR1bW15KTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpSVFNQU291cmNlMjo6ZmVlZE1vcmVUU0RhdGEoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1CdWZmZXJpbmdMb2NrKTsKKyAgICByZXR1cm4gbUZpbmFsUmVzdWx0OworfQorCitzcDxNZXRhRGF0YT4gTnVQbGF5ZXIyOjpSVFNQU291cmNlMjo6Z2V0Rm9ybWF0TWV0YShib29sIGF1ZGlvKSB7CisgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gc291cmNlID0gZ2V0U291cmNlKGF1ZGlvKTsKKworICAgIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gc291cmNlLT5nZXRGb3JtYXQoKTsKK30KKworYm9vbCBOdVBsYXllcjI6OlJUU1BTb3VyY2UyOjpoYXZlU3VmZmljaWVudERhdGFPbkFsbFRyYWNrcygpIHsKKyAgICAvLyBXZSdyZSBnb2luZyB0byBidWZmZXIgYXQgbGVhc3QgMiBzZWNzIHdvcnRoIGRhdGEgb24gYWxsIHRyYWNrcyBiZWZvcmUKKyAgICAvLyBzdGFydGluZyBwbGF5YmFjayAoYm90aCBhdCBzdGFydHVwIGFuZCBhZnRlciBhIHNlZWspLgorCisgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga01pbkR1cmF0aW9uVXMgPSAyMDAwMDAwbGw7CisKKyAgICBpbnQ2NF90IG1lZGlhRHVyYXRpb25VcyA9IDA7CisgICAgZ2V0RHVyYXRpb24oJm1lZGlhRHVyYXRpb25Vcyk7CisgICAgaWYgKChtQXVkaW9UcmFjayAhPSBOVUxMICYmIG1BdWRpb1RyYWNrLT5pc0ZpbmlzaGVkKG1lZGlhRHVyYXRpb25VcykpCisgICAgICAgICAgICB8fCAobVZpZGVvVHJhY2sgIT0gTlVMTCAmJiBtVmlkZW9UcmFjay0+aXNGaW5pc2hlZChtZWRpYUR1cmF0aW9uVXMpKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgaW50NjRfdCBkdXJhdGlvblVzOworICAgIGlmIChtQXVkaW9UcmFjayAhPSBOVUxMCisgICAgICAgICAgICAmJiAoZHVyYXRpb25VcyA9IG1BdWRpb1RyYWNrLT5nZXRCdWZmZXJlZER1cmF0aW9uVXMoJmVycikpCisgICAgICAgICAgICAgICAgICAgIDwga01pbkR1cmF0aW9uVXMKKyAgICAgICAgICAgICYmIGVyciA9PSBPSykgeworICAgICAgICBBTE9HVigiYXVkaW8gdHJhY2sgZG9lc24ndCBoYXZlIGVub3VnaCBkYXRhIHlldC4gKCUuMmYgc2VjcyBidWZmZXJlZCkiLAorICAgICAgICAgICAgICBkdXJhdGlvblVzIC8gMUU2KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChtVmlkZW9UcmFjayAhPSBOVUxMCisgICAgICAgICAgICAmJiAoZHVyYXRpb25VcyA9IG1WaWRlb1RyYWNrLT5nZXRCdWZmZXJlZER1cmF0aW9uVXMoJmVycikpCisgICAgICAgICAgICAgICAgICAgIDwga01pbkR1cmF0aW9uVXMKKyAgICAgICAgICAgICYmIGVyciA9PSBPSykgeworICAgICAgICBBTE9HVigidmlkZW8gdHJhY2sgZG9lc24ndCBoYXZlIGVub3VnaCBkYXRhIHlldC4gKCUuMmYgc2VjcyBidWZmZXJlZCkiLAorICAgICAgICAgICAgICBkdXJhdGlvblVzIC8gMUU2KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OlJUU1BTb3VyY2UyOjpkZXF1ZXVlQWNjZXNzVW5pdCgKKyAgICAgICAgYm9vbCBhdWRpbywgc3A8QUJ1ZmZlcj4gKmFjY2Vzc1VuaXQpIHsKKyAgICBpZiAoIXN0b3BCdWZmZXJpbmdJZk5lY2Vzc2FyeSgpKSB7CisgICAgICAgIHJldHVybiAtRVdPVUxEQkxPQ0s7CisgICAgfQorCisgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gc291cmNlID0gZ2V0U291cmNlKGF1ZGlvKTsKKworICAgIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVXT1VMREJMT0NLOworICAgIH0KKworICAgIHN0YXR1c190IGZpbmFsUmVzdWx0OworICAgIGlmICghc291cmNlLT5oYXNCdWZmZXJBdmFpbGFibGUoJmZpbmFsUmVzdWx0KSkgeworICAgICAgICBpZiAoZmluYWxSZXN1bHQgPT0gT0spIHsKKworICAgICAgICAgICAgLy8gSWYgb3RoZXIgc291cmNlIGFscmVhZHkgc2lnbmFsZWQgRU9TLCB0aGlzIHNvdXJjZSBzaG91bGQgYWxzbyByZXR1cm4gRU9TCisgICAgICAgICAgICBpZiAoc291cmNlUmVhY2hlZEVPUyghYXVkaW8pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIElmIHRoaXMgc291cmNlIGhhcyBkZXRlY3RlZCBuZWFyIGVuZCwgZ2l2ZSBpdCBzb21lIHRpbWUgdG8gcmV0cmlldmUgbW9yZQorICAgICAgICAgICAgLy8gZGF0YSBiZWZvcmUgcmV0dXJuaW5nIEVPUworICAgICAgICAgICAgaW50NjRfdCBtZWRpYUR1cmF0aW9uVXMgPSAwOworICAgICAgICAgICAgZ2V0RHVyYXRpb24oJm1lZGlhRHVyYXRpb25Vcyk7CisgICAgICAgICAgICBpZiAoc291cmNlLT5pc0ZpbmlzaGVkKG1lZGlhRHVyYXRpb25VcykpIHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IGVvc1RpbWVvdXQgPSBhdWRpbyA/IG1FT1NUaW1lb3V0QXVkaW8gOiBtRU9TVGltZW91dFZpZGVvOworICAgICAgICAgICAgICAgIGlmIChlb3NUaW1lb3V0ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0RU9TVGltZW91dChhdWRpbywgQUxvb3Blcjo6R2V0Tm93VXMoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoQUxvb3Blcjo6R2V0Tm93VXMoKSAtIGVvc1RpbWVvdXQpID4ga05lYXJFT1NUaW1lb3V0VXMpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0RU9TVGltZW91dChhdWRpbywgMCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gLUVXT1VMREJMT0NLOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIXNvdXJjZU5lYXJFT1MoIWF1ZGlvKSkgeworICAgICAgICAgICAgICAgIC8vIFdlIHNob3VsZCBub3QgZW50ZXIgYnVmZmVyaW5nIG1vZGUKKyAgICAgICAgICAgICAgICAvLyBpZiBhbnkgb2YgdGhlIHNvdXJjZXMgYWxyZWFkeSBoYXZlIGRldGVjdGVkIEVPUy4KKyAgICAgICAgICAgICAgICBzdGFydEJ1ZmZlcmluZ0lmTmVjZXNzYXJ5KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiAtRVdPVUxEQkxPQ0s7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZpbmFsUmVzdWx0OworICAgIH0KKworICAgIHNldEVPU1RpbWVvdXQoYXVkaW8sIDApOworCisgICAgcmV0dXJuIHNvdXJjZS0+ZGVxdWV1ZUFjY2Vzc1VuaXQoYWNjZXNzVW5pdCk7Cit9CisKK3NwPEFub3RoZXJQYWNrZXRTb3VyY2U+IE51UGxheWVyMjo6UlRTUFNvdXJjZTI6OmdldFNvdXJjZShib29sIGF1ZGlvKSB7CisgICAgaWYgKG1UU1BhcnNlciAhPSBOVUxMKSB7CisgICAgICAgIHNwPE1lZGlhU291cmNlPiBzb3VyY2UgPSBtVFNQYXJzZXItPmdldFNvdXJjZSgKKyAgICAgICAgICAgICAgICBhdWRpbyA/IEFUU1BhcnNlcjo6QVVESU8gOiBBVFNQYXJzZXI6OlZJREVPKTsKKworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8QW5vdGhlclBhY2tldFNvdXJjZSAqPihzb3VyY2UuZ2V0KCkpOworICAgIH0KKworICAgIHJldHVybiBhdWRpbyA/IG1BdWRpb1RyYWNrIDogbVZpZGVvVHJhY2s7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSVFNQU291cmNlMjo6c2V0RU9TVGltZW91dChib29sIGF1ZGlvLCBpbnQ2NF90IHRpbWVvdXQpIHsKKyAgICBpZiAoYXVkaW8pIHsKKyAgICAgICAgbUVPU1RpbWVvdXRBdWRpbyA9IHRpbWVvdXQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUVPU1RpbWVvdXRWaWRlbyA9IHRpbWVvdXQ7CisgICAgfQorfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OlJUU1BTb3VyY2UyOjpnZXREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzKSB7CisgICAgKmR1cmF0aW9uVXMgPSAtMWxsOworCisgICAgaW50NjRfdCBhdWRpb0R1cmF0aW9uVXM7CisgICAgaWYgKG1BdWRpb1RyYWNrICE9IE5VTEwKKyAgICAgICAgICAgICYmIG1BdWRpb1RyYWNrLT5nZXRGb3JtYXQoKS0+ZmluZEludDY0KAorICAgICAgICAgICAgICAgIGtLZXlEdXJhdGlvbiwgJmF1ZGlvRHVyYXRpb25VcykKKyAgICAgICAgICAgICYmIGF1ZGlvRHVyYXRpb25VcyA+ICpkdXJhdGlvblVzKSB7CisgICAgICAgICpkdXJhdGlvblVzID0gYXVkaW9EdXJhdGlvblVzOworICAgIH0KKworICAgIGludDY0X3QgdmlkZW9EdXJhdGlvblVzOworICAgIGlmIChtVmlkZW9UcmFjayAhPSBOVUxMCisgICAgICAgICAgICAmJiBtVmlkZW9UcmFjay0+Z2V0Rm9ybWF0KCktPmZpbmRJbnQ2NCgKKyAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sICZ2aWRlb0R1cmF0aW9uVXMpCisgICAgICAgICAgICAmJiB2aWRlb0R1cmF0aW9uVXMgPiAqZHVyYXRpb25VcykgeworICAgICAgICAqZHVyYXRpb25VcyA9IHZpZGVvRHVyYXRpb25VczsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6UlRTUFNvdXJjZTI6OnNlZWtUbyhpbnQ2NF90IHNlZWtUaW1lVXMsIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UGVyZm9ybVNlZWssIHRoaXMpOworICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCArK21TZWVrR2VuZXJhdGlvbik7CisgICAgbXNnLT5zZXRJbnQ2NCgidGltZVVzIiwgc2Vla1RpbWVVcyk7CisgICAgbXNnLT5zZXRJbnQzMigibW9kZSIsIG1vZGUpOworCisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKKyAgICBpZiAoZXJyID09IE9LICYmIHJlc3BvbnNlICE9IE5VTEwpIHsKKyAgICAgICAgQ0hFQ0socmVzcG9uc2UtPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOworICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSVFNQU291cmNlMjo6cGVyZm9ybVNlZWsoaW50NjRfdCBzZWVrVGltZVVzKSB7CisgICAgaWYgKG1TdGF0ZSAhPSBDT05ORUNURUQpIHsKKyAgICAgICAgZmluaXNoU2VlayhJTlZBTElEX09QRVJBVElPTik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtU3RhdGUgPSBTRUVLSU5HOworICAgIG1IYW5kbGVyLT5zZWVrKHNlZWtUaW1lVXMpOworICAgIG1FT1NQZW5kaW5nID0gZmFsc2U7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSVFNQU291cmNlMjo6c2NoZWR1bGVQb2xsQnVmZmVyaW5nKCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQb2xsQnVmZmVyaW5nLCB0aGlzKTsKKyAgICBtc2ctPnBvc3QoMTAwMDAwMGxsKTsgLy8gMSBzZWNvbmQgaW50ZXJ2YWxzCit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSVFNQU291cmNlMjo6Y2hlY2tCdWZmZXJpbmcoCisgICAgICAgIGJvb2wgKnByZXBhcmVkLCBib29sICp1bmRlcmZsb3csIGJvb2wgKm92ZXJmbG93LCBib29sICpzdGFydFNlcnZlciwgYm9vbCAqZmluaXNoZWQpIHsKKyAgICBzaXplX3QgbnVtVHJhY2tzID0gbVRyYWNrcy5zaXplKCk7CisgICAgc2l6ZV90IHByZXBhcmVkQ291bnQsIHVuZGVyZmxvd0NvdW50LCBvdmVyZmxvd0NvdW50LCBzdGFydENvdW50LCBmaW5pc2hlZENvdW50OworICAgIHByZXBhcmVkQ291bnQgPSB1bmRlcmZsb3dDb3VudCA9IG92ZXJmbG93Q291bnQgPSBzdGFydENvdW50ID0gZmluaXNoZWRDb3VudCA9IDA7CisKKyAgICBzaXplX3QgY291bnQgPSBudW1UcmFja3M7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgIHN0YXR1c190IGZpbmFsUmVzdWx0OworICAgICAgICBUcmFja0luZm8gKmluZm8gPSAmbVRyYWNrcy5lZGl0SXRlbUF0KGkpOworICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBzcmMgPSBpbmZvLT5tU291cmNlOworICAgICAgICBpZiAoc3JjID09IE5VTEwpIHsKKyAgICAgICAgICAgIC0tbnVtVHJhY2tzOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaW50NjRfdCBidWZmZXJlZER1cmF0aW9uVXMgPSBzcmMtPmdldEJ1ZmZlcmVkRHVyYXRpb25VcygmZmluYWxSZXN1bHQpOworCisgICAgICAgIGludDY0X3QgaW5pdGlhbE1hcmtVczsKKyAgICAgICAgaW50NjRfdCBtYXhSZWJ1ZmZlcmluZ01hcmtVczsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1CdWZmZXJpbmdTZXR0aW5nc0xvY2spOworICAgICAgICAgICAgaW5pdGlhbE1hcmtVcyA9IG1CdWZmZXJpbmdTZXR0aW5ncy5tSW5pdGlhbE1hcmtNcyAqIDEwMDBsbDsKKyAgICAgICAgICAgIC8vIFRPRE86IG1heFJlYnVmZmVyaW5nTWFya1VzIGNvdWxkIGJlIGxhcmdlciB0aGFuCisgICAgICAgICAgICAvLyBtQnVmZmVyaW5nU2V0dGluZ3MubVJlc3VtZVBsYXliYWNrTWFya01zICogMTAwMGxsLgorICAgICAgICAgICAgbWF4UmVidWZmZXJpbmdNYXJrVXMgPSBtQnVmZmVyaW5nU2V0dGluZ3MubVJlc3VtZVBsYXliYWNrTWFya01zICogMTAwMGxsOworICAgICAgICB9CisgICAgICAgIC8vIGlzRmluaXNoZWQgd2hlbiBkdXJhdGlvbiBpcyAwIGNoZWNrcyBmb3IgRU9TIHJlc3VsdCBvbmx5CisgICAgICAgIGlmIChidWZmZXJlZER1cmF0aW9uVXMgPiBpbml0aWFsTWFya1VzCisgICAgICAgICAgICAgICAgfHwgc3JjLT5pc0ZpbmlzaGVkKC8qIGR1cmF0aW9uICovIDApKSB7CisgICAgICAgICAgICArK3ByZXBhcmVkQ291bnQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3JjLT5pc0ZpbmlzaGVkKC8qIGR1cmF0aW9uICovIDApKSB7CisgICAgICAgICAgICArK292ZXJmbG93Q291bnQ7CisgICAgICAgICAgICArK2ZpbmlzaGVkQ291bnQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUT0RPOiByZWRlZmluZSBrVW5kZXJmbG93TWFya01zIHRvIGEgZmFpciB2YWx1ZSwKKyAgICAgICAgICAgIGlmIChidWZmZXJlZER1cmF0aW9uVXMgPCBrVW5kZXJmbG93TWFya01zICogMTAwMCkgeworICAgICAgICAgICAgICAgICsrdW5kZXJmbG93Q291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYnVmZmVyZWREdXJhdGlvblVzID4gbWF4UmVidWZmZXJpbmdNYXJrVXMpIHsKKyAgICAgICAgICAgICAgICArK292ZXJmbG93Q291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQ2NF90IHN0YXJ0U2VydmVyTWFya1VzID0KKyAgICAgICAgICAgICAgICAgICAgKGtVbmRlcmZsb3dNYXJrTXMgKiAxMDAwbGwgKyBtYXhSZWJ1ZmZlcmluZ01hcmtVcykgLyAyOworICAgICAgICAgICAgaWYgKGJ1ZmZlcmVkRHVyYXRpb25VcyA8IHN0YXJ0U2VydmVyTWFya1VzKSB7CisgICAgICAgICAgICAgICAgKytzdGFydENvdW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgKnByZXBhcmVkICAgID0gKHByZXBhcmVkQ291bnQgPT0gbnVtVHJhY2tzKTsKKyAgICAqdW5kZXJmbG93ICAgPSAodW5kZXJmbG93Q291bnQgPiAwKTsKKyAgICAqb3ZlcmZsb3cgICAgPSAob3ZlcmZsb3dDb3VudCA9PSBudW1UcmFja3MpOworICAgICpzdGFydFNlcnZlciA9IChzdGFydENvdW50ID4gMCk7CisgICAgKmZpbmlzaGVkICAgID0gKGZpbmlzaGVkQ291bnQgPiAwKTsKK30KKwordm9pZCBOdVBsYXllcjI6OlJUU1BTb3VyY2UyOjpvblBvbGxCdWZmZXJpbmcoKSB7CisgICAgYm9vbCBwcmVwYXJlZCwgdW5kZXJmbG93LCBvdmVyZmxvdywgc3RhcnRTZXJ2ZXIsIGZpbmlzaGVkOworICAgIGNoZWNrQnVmZmVyaW5nKCZwcmVwYXJlZCwgJnVuZGVyZmxvdywgJm92ZXJmbG93LCAmc3RhcnRTZXJ2ZXIsICZmaW5pc2hlZCk7CisKKyAgICBpZiAocHJlcGFyZWQgJiYgbUluUHJlcGFyYXRpb25QaGFzZSkgeworICAgICAgICBtSW5QcmVwYXJhdGlvblBoYXNlID0gZmFsc2U7CisgICAgICAgIG5vdGlmeVByZXBhcmVkKCk7CisgICAgfQorCisgICAgaWYgKCFtSW5QcmVwYXJhdGlvblBoYXNlICYmIHVuZGVyZmxvdykgeworICAgICAgICBzdGFydEJ1ZmZlcmluZ0lmTmVjZXNzYXJ5KCk7CisgICAgfQorCisgICAgaWYgKGhhdmVTdWZmaWNpZW50RGF0YU9uQWxsVHJhY2tzKCkpIHsKKyAgICAgICAgc3RvcEJ1ZmZlcmluZ0lmTmVjZXNzYXJ5KCk7CisgICAgfQorCisgICAgaWYgKG92ZXJmbG93ICYmIG1IYW5kbGVyICE9IE5VTEwpIHsKKyAgICAgICAgbUhhbmRsZXItPnBhdXNlKCk7CisgICAgfQorCisgICAgaWYgKHN0YXJ0U2VydmVyICYmIG1IYW5kbGVyICE9IE5VTEwpIHsKKyAgICAgICAgbUhhbmRsZXItPnJlc3VtZSgpOworICAgIH0KKworICAgIGlmIChmaW5pc2hlZCAmJiBtSGFuZGxlciAhPSBOVUxMKSB7CisgICAgICAgIG1IYW5kbGVyLT5jYW5jZWxBY2Nlc3NVbml0VGltZW91dENoZWNrKCk7CisgICAgfQorCisgICAgc2NoZWR1bGVQb2xsQnVmZmVyaW5nKCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSVFNQU291cmNlMjo6c2lnbmFsU291cmNlRU9TKHN0YXR1c190IHJlc3VsdCkgeworICAgIGNvbnN0IGJvb2wgYXVkaW8gPSB0cnVlOworICAgIGNvbnN0IGJvb2wgdmlkZW8gPSBmYWxzZTsKKworICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHNvdXJjZSA9IGdldFNvdXJjZShhdWRpbyk7CisgICAgaWYgKHNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIHNvdXJjZS0+c2lnbmFsRU9TKHJlc3VsdCk7CisgICAgfQorCisgICAgc291cmNlID0gZ2V0U291cmNlKHZpZGVvKTsKKyAgICBpZiAoc291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgc291cmNlLT5zaWduYWxFT1MocmVzdWx0KTsKKyAgICB9Cit9CisKK2Jvb2wgTnVQbGF5ZXIyOjpSVFNQU291cmNlMjo6c291cmNlUmVhY2hlZEVPUyhib29sIGF1ZGlvKSB7CisgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gc291cmNlID0gZ2V0U291cmNlKGF1ZGlvKTsKKyAgICBzdGF0dXNfdCBmaW5hbFJlc3VsdDsKKyAgICByZXR1cm4gKHNvdXJjZSAhPSBOVUxMICYmCisgICAgICAgICAgICAhc291cmNlLT5oYXNCdWZmZXJBdmFpbGFibGUoJmZpbmFsUmVzdWx0KSAmJgorICAgICAgICAgICAgZmluYWxSZXN1bHQgPT0gRVJST1JfRU5EX09GX1NUUkVBTSk7Cit9CisKK2Jvb2wgTnVQbGF5ZXIyOjpSVFNQU291cmNlMjo6c291cmNlTmVhckVPUyhib29sIGF1ZGlvKSB7CisgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gc291cmNlID0gZ2V0U291cmNlKGF1ZGlvKTsKKyAgICBpbnQ2NF90IG1lZGlhRHVyYXRpb25VcyA9IDA7CisgICAgZ2V0RHVyYXRpb24oJm1lZGlhRHVyYXRpb25Vcyk7CisgICAgcmV0dXJuIChzb3VyY2UgIT0gTlVMTCAmJiBzb3VyY2UtPmlzRmluaXNoZWQobWVkaWFEdXJhdGlvblVzKSk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSVFNQU291cmNlMjo6b25TaWduYWxFT1MoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBpbnQzMl90IGdlbmVyYXRpb247CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOworCisgICAgaWYgKGdlbmVyYXRpb24gIT0gbVNlZWtHZW5lcmF0aW9uKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobUVPU1BlbmRpbmcpIHsKKyAgICAgICAgc2lnbmFsU291cmNlRU9TKEVSUk9SX0VORF9PRl9TVFJFQU0pOworICAgICAgICBtRU9TUGVuZGluZyA9IGZhbHNlOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OlJUU1BTb3VyY2UyOjpwb3N0U291cmNlRU9TSWZOZWNlc3NhcnkoKSB7CisgICAgY29uc3QgYm9vbCBhdWRpbyA9IHRydWU7CisgICAgY29uc3QgYm9vbCB2aWRlbyA9IGZhbHNlOworICAgIC8vIElmIGEgc291cmNlIGhhcyBkZXRlY3RlZCBuZWFyIGVuZCwgZ2l2ZSBpdCBzb21lIHRpbWUgdG8gcmV0cmlldmUgbW9yZQorICAgIC8vIGRhdGEgYmVmb3JlIHNpZ25hbGluZyBFT1MKKyAgICBpZiAoc291cmNlTmVhckVPUyhhdWRpbykgfHwgc291cmNlTmVhckVPUyh2aWRlbykpIHsKKyAgICAgICAgaWYgKCFtRU9TUGVuZGluZykgeworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNpZ25hbEVPUywgdGhpcyk7CisgICAgICAgICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbVNlZWtHZW5lcmF0aW9uKTsKKyAgICAgICAgICAgIG1zZy0+cG9zdChrTmVhckVPU1RpbWVvdXRVcyk7CisgICAgICAgICAgICBtRU9TUGVuZGluZyA9IHRydWU7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSVFNQU291cmNlMjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBpZiAobXNnLT53aGF0KCkgPT0ga1doYXREaXNjb25uZWN0KSB7CisgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOworICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisKKyAgICAgICAgbURpc2Nvbm5lY3RSZXBseUlEID0gcmVwbHlJRDsKKyAgICAgICAgZmluaXNoRGlzY29ubmVjdElmUG9zc2libGUoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0gZWxzZSBpZiAobXNnLT53aGF0KCkgPT0ga1doYXRQZXJmb3JtU2VlaykgeworICAgICAgICBpbnQzMl90IGdlbmVyYXRpb247CisgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKKyAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmbVNlZWtSZXBseUlEKSk7CisKKyAgICAgICAgaWYgKGdlbmVyYXRpb24gIT0gbVNlZWtHZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAvLyBvYnNvbGV0ZS4KKyAgICAgICAgICAgIGZpbmlzaFNlZWsoT0spOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaW50NjRfdCBzZWVrVGltZVVzOworICAgICAgICBpbnQzMl90IG1vZGU7CisgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJ0aW1lVXMiLCAmc2Vla1RpbWVVcykpOworICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigibW9kZSIsICZtb2RlKSk7CisKKyAgICAgICAgLy8gVE9ETzogYWRkICJtb2RlIiB0byBwZXJmb3JtU2Vlay4KKyAgICAgICAgcGVyZm9ybVNlZWsoc2Vla1RpbWVVcy8qLCAoTWVkaWFQbGF5ZXIyU2Vla01vZGUpbW9kZSAqLyk7CisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKG1zZy0+d2hhdCgpID09IGtXaGF0UG9sbEJ1ZmZlcmluZykgeworICAgICAgICBvblBvbGxCdWZmZXJpbmcoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0gZWxzZSBpZiAobXNnLT53aGF0KCkgPT0ga1doYXRTaWduYWxFT1MpIHsKKyAgICAgICAgb25TaWduYWxFT1MobXNnKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIENIRUNLX0VRKG1zZy0+d2hhdCgpLCBrV2hhdE5vdGlmeSk7CisKKyAgICBpbnQzMl90IHdoYXQ7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoIndoYXQiLCAmd2hhdCkpOworCisgICAgc3dpdGNoICh3aGF0KSB7CisgICAgICAgIGNhc2UgTXlIYW5kbGVyOjprV2hhdENvbm5lY3RlZDoKKyAgICAgICAgeworICAgICAgICAgICAgb25Db25uZWN0ZWQoKTsKKworICAgICAgICAgICAgbm90aWZ5VmlkZW9TaXplQ2hhbmdlZCgpOworCisgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisKKyAgICAgICAgICAgIGlmIChtSGFuZGxlci0+aXNTZWVrYWJsZSgpKSB7CisgICAgICAgICAgICAgICAgZmxhZ3MgPSBGTEFHX0NBTl9QQVVTRQorICAgICAgICAgICAgICAgICAgICAgICAgfCBGTEFHX0NBTl9TRUVLCisgICAgICAgICAgICAgICAgICAgICAgICB8IEZMQUdfQ0FOX1NFRUtfQkFDS1dBUkQKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgRkxBR19DQU5fU0VFS19GT1JXQVJEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBub3RpZnlGbGFnc0NoYW5nZWQoZmxhZ3MpOworICAgICAgICAgICAgc2NoZWR1bGVQb2xsQnVmZmVyaW5nKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgTXlIYW5kbGVyOjprV2hhdERpc2Nvbm5lY3RlZDoKKyAgICAgICAgeworICAgICAgICAgICAgb25EaXNjb25uZWN0ZWQobXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBNeUhhbmRsZXI6OmtXaGF0U2Vla0RvbmU6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1TdGF0ZSA9IENPTk5FQ1RFRDsKKyAgICAgICAgICAgIC8vIFVuYmxvY2sgc2Vla1RvIGhlcmUgaW4gY2FzZSB3ZSBhdHRlbXB0ZWQgdG8gc2VlayBpbiBhIGxpdmUgc3RyZWFtCisgICAgICAgICAgICBmaW5pc2hTZWVrKE9LKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBNeUhhbmRsZXI6OmtXaGF0U2Vla1BhdXNlZDoKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gc291cmNlID0gZ2V0U291cmNlKHRydWUgLyogYXVkaW8gKi8pOworICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgc291cmNlLT5xdWV1ZURpc2NvbnRpbnVpdHkoQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBleHRyYSAqLyBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgLyogZGlzY2FyZCAqLyB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNvdXJjZSA9IGdldFNvdXJjZShmYWxzZSAvKiB2aWRlbyAqLyk7CisgICAgICAgICAgICBpZiAoc291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBzb3VyY2UtPnF1ZXVlRGlzY29udGludWl0eShBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4dHJhICovIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBkaXNjYXJkICovIHRydWUpOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgICAgICAgICBtc2ctPmZpbmRJbnQzMigiZXJyIiwgJmVycik7CisKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZSIsICZ0aW1lVXMpKTsKKyAgICAgICAgICAgICAgICBtSGFuZGxlci0+Y29udGludWVTZWVrQWZ0ZXJQYXVzZSh0aW1lVXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmaW5pc2hTZWVrKGVycik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgTXlIYW5kbGVyOjprV2hhdEFjY2Vzc1VuaXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNpemVfdCB0cmFja0luZGV4OworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU2l6ZSgidHJhY2tJbmRleCIsICZ0cmFja0luZGV4KSk7CisKKyAgICAgICAgICAgIGlmIChtVFNQYXJzZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIENIRUNLX0xUKHRyYWNrSW5kZXgsIG1UcmFja3Muc2l6ZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQ0hFQ0tfRVEodHJhY2tJbmRleCwgMHUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0OworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kQnVmZmVyKCJhY2Nlc3NVbml0IiwgJmFjY2Vzc1VuaXQpKTsKKworICAgICAgICAgICAgaW50MzJfdCBkYW1hZ2VkOworICAgICAgICAgICAgaWYgKGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEludDMyKCJkYW1hZ2VkIiwgJmRhbWFnZWQpCisgICAgICAgICAgICAgICAgICAgICYmIGRhbWFnZWQpIHsKKyAgICAgICAgICAgICAgICBBTE9HSSgiZHJvcHBpbmcgZGFtYWdlZCBhY2Nlc3MgdW5pdC4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1UU1BhcnNlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgc2l6ZV90IG9mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgICAgICAgICAgICAgd2hpbGUgKG9mZnNldCArIDE4OCA8PSBhY2Nlc3NVbml0LT5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gbVRTUGFyc2VyLT5mZWVkVFNQYWNrZXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzVW5pdC0+ZGF0YSgpICsgb2Zmc2V0LCAxODgpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAxODg7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA8IGFjY2Vzc1VuaXQtPnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICBlcnIgPSBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBzaWduYWxTb3VyY2VFT1MoZXJyKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwb3N0U291cmNlRU9TSWZOZWNlc3NhcnkoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgVHJhY2tJbmZvICppbmZvID0gJm1UcmFja3MuZWRpdEl0ZW1BdCh0cmFja0luZGV4KTsKKworICAgICAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gc291cmNlID0gaW5mby0+bVNvdXJjZTsKKyAgICAgICAgICAgIGlmIChzb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHJ0cFRpbWU7CisgICAgICAgICAgICAgICAgQ0hFQ0soYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kSW50MzIoInJ0cC10aW1lIiwgKGludDMyX3QgKikmcnRwVGltZSkpOworCisgICAgICAgICAgICAgICAgaWYgKCFpbmZvLT5tTlBUTWFwcGluZ1ZhbGlkKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBsaXZlIHN0cmVhbSwgd2UgZGlkbid0IHJlY2VpdmUgYW55IG5vcm1hbAorICAgICAgICAgICAgICAgICAgICAvLyBwbGF5dGltZSBtYXBwaW5nLiBXZSB3b24ndCBtYXAgdG8gbnB0IHRpbWUuCisgICAgICAgICAgICAgICAgICAgIHNvdXJjZS0+cXVldWVBY2Nlc3NVbml0KGFjY2Vzc1VuaXQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQ2NF90IG5wdFVzID0KKyAgICAgICAgICAgICAgICAgICAgKChkb3VibGUpcnRwVGltZSAtIChkb3VibGUpaW5mby0+bVJUUFRpbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAvIGluZm8tPm1UaW1lU2NhbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICogMTAwMDAwMGxsCisgICAgICAgICAgICAgICAgICAgICAgICArIGluZm8tPm1Ob3JtYWxQbGF5dGltZVVzOworCisgICAgICAgICAgICAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgbnB0VXMpOworCisgICAgICAgICAgICAgICAgc291cmNlLT5xdWV1ZUFjY2Vzc1VuaXQoYWNjZXNzVW5pdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwb3N0U291cmNlRU9TSWZOZWNlc3NhcnkoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBNeUhhbmRsZXI6OmtXaGF0RU9TOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGZpbmFsUmVzdWx0OworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImZpbmFsUmVzdWx0IiwgJmZpbmFsUmVzdWx0KSk7CisgICAgICAgICAgICBDSEVDS19ORShmaW5hbFJlc3VsdCwgKHN0YXR1c190KU9LKTsKKworICAgICAgICAgICAgaWYgKG1UU1BhcnNlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgc2lnbmFsU291cmNlRU9TKGZpbmFsUmVzdWx0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2l6ZV90IHRyYWNrSW5kZXg7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTaXplKCJ0cmFja0luZGV4IiwgJnRyYWNrSW5kZXgpKTsKKyAgICAgICAgICAgIENIRUNLX0xUKHRyYWNrSW5kZXgsIG1UcmFja3Muc2l6ZSgpKTsKKworICAgICAgICAgICAgVHJhY2tJbmZvICppbmZvID0gJm1UcmFja3MuZWRpdEl0ZW1BdCh0cmFja0luZGV4KTsKKyAgICAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHNvdXJjZSA9IGluZm8tPm1Tb3VyY2U7CisgICAgICAgICAgICBpZiAoc291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBzb3VyY2UtPnNpZ25hbEVPUyhmaW5hbFJlc3VsdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBNeUhhbmRsZXI6OmtXaGF0U2Vla0Rpc2NvbnRpbnVpdHk6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNpemVfdCB0cmFja0luZGV4OworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU2l6ZSgidHJhY2tJbmRleCIsICZ0cmFja0luZGV4KSk7CisgICAgICAgICAgICBDSEVDS19MVCh0cmFja0luZGV4LCBtVHJhY2tzLnNpemUoKSk7CisKKyAgICAgICAgICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtVHJhY2tzLmVkaXRJdGVtQXQodHJhY2tJbmRleCk7CisgICAgICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBzb3VyY2UgPSBpbmZvLT5tU291cmNlOworICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgc291cmNlLT5xdWV1ZURpc2NvbnRpbnVpdHkoCisgICAgICAgICAgICAgICAgICAgICAgICBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfVElNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGRpc2NhcmQgKi8pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgTXlIYW5kbGVyOjprV2hhdE5vcm1hbFBsYXlUaW1lTWFwcGluZzoKKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZV90IHRyYWNrSW5kZXg7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTaXplKCJ0cmFja0luZGV4IiwgJnRyYWNrSW5kZXgpKTsKKyAgICAgICAgICAgIENIRUNLX0xUKHRyYWNrSW5kZXgsIG1UcmFja3Muc2l6ZSgpKTsKKworICAgICAgICAgICAgdWludDMyX3QgcnRwVGltZTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJydHBUaW1lIiwgKGludDMyX3QgKikmcnRwVGltZSkpOworCisgICAgICAgICAgICBpbnQ2NF90IG5wdFVzOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoIm5wdFVzIiwgJm5wdFVzKSk7CisKKyAgICAgICAgICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtVHJhY2tzLmVkaXRJdGVtQXQodHJhY2tJbmRleCk7CisgICAgICAgICAgICBpbmZvLT5tUlRQVGltZSA9IHJ0cFRpbWU7CisgICAgICAgICAgICBpbmZvLT5tTm9ybWFsUGxheXRpbWVVcyA9IG5wdFVzOworICAgICAgICAgICAgaW5mby0+bU5QVE1hcHBpbmdWYWxpZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU0RQTG9hZGVyOjprV2hhdFNEUExvYWRlZDoKKyAgICAgICAgeworICAgICAgICAgICAgb25TRFBMb2FkZWQobXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6UlRTUFNvdXJjZTI6Om9uQ29ubmVjdGVkKCkgeworICAgIENIRUNLKG1BdWRpb1RyYWNrID09IE5VTEwpOworICAgIENIRUNLKG1WaWRlb1RyYWNrID09IE5VTEwpOworCisgICAgc2l6ZV90IG51bVRyYWNrcyA9IG1IYW5kbGVyLT5jb3VudFRyYWNrcygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtVHJhY2tzOyArK2kpIHsKKyAgICAgICAgaW50MzJfdCB0aW1lU2NhbGU7CisgICAgICAgIHNwPE1ldGFEYXRhPiBmb3JtYXQgPSBtSGFuZGxlci0+Z2V0VHJhY2tGb3JtYXQoaSwgJnRpbWVTY2FsZSk7CisKKyAgICAgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICAgICAgQ0hFQ0soZm9ybWF0LT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisKKyAgICAgICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHMlRTKSkgeworICAgICAgICAgICAgLy8gVmVyeSBzcGVjaWFsIGNhc2UgZm9yIE1QRUcyIFRyYW5zcG9ydCBTdHJlYW1zLgorICAgICAgICAgICAgQ0hFQ0tfRVEobnVtVHJhY2tzLCAxdSk7CisKKyAgICAgICAgICAgIG1UU1BhcnNlciA9IG5ldyBBVFNQYXJzZXI7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBib29sIGlzQXVkaW8gPSAhc3RybmNhc2VjbXAobWltZSwgImF1ZGlvLyIsIDYpOworICAgICAgICBib29sIGlzVmlkZW8gPSAhc3RybmNhc2VjbXAobWltZSwgInZpZGVvLyIsIDYpOworCisgICAgICAgIFRyYWNrSW5mbyBpbmZvOworICAgICAgICBpbmZvLm1UaW1lU2NhbGUgPSB0aW1lU2NhbGU7CisgICAgICAgIGluZm8ubVJUUFRpbWUgPSAwOworICAgICAgICBpbmZvLm1Ob3JtYWxQbGF5dGltZVVzID0gMGxsOworICAgICAgICBpbmZvLm1OUFRNYXBwaW5nVmFsaWQgPSBmYWxzZTsKKworICAgICAgICBpZiAoKGlzQXVkaW8gJiYgbUF1ZGlvVHJhY2sgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICB8fCAoaXNWaWRlbyAmJiBtVmlkZW9UcmFjayA9PSBOVUxMKSkgeworICAgICAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gc291cmNlID0gbmV3IEFub3RoZXJQYWNrZXRTb3VyY2UoZm9ybWF0KTsKKworICAgICAgICAgICAgaWYgKGlzQXVkaW8pIHsKKyAgICAgICAgICAgICAgICBtQXVkaW9UcmFjayA9IHNvdXJjZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVZpZGVvVHJhY2sgPSBzb3VyY2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGluZm8ubVNvdXJjZSA9IHNvdXJjZTsKKyAgICAgICAgfQorCisgICAgICAgIG1UcmFja3MucHVzaChpbmZvKTsKKyAgICB9CisKKyAgICBtU3RhdGUgPSBDT05ORUNURUQ7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSVFNQU291cmNlMjo6b25TRFBMb2FkZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJlc3VsdCIsICZlcnIpKTsKKworICAgIG1TRFBMb2FkZXIuY2xlYXIoKTsKKworICAgIGlmIChtRGlzY29ubmVjdFJlcGx5SUQgIT0gMCkgeworICAgICAgICBlcnIgPSBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgc3A8QVNlc3Npb25EZXNjcmlwdGlvbj4gZGVzYzsKKyAgICAgICAgc3A8UmVmQmFzZT4gb2JqOworICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoImRlc2NyaXB0aW9uIiwgJm9iaikpOworICAgICAgICBkZXNjID0gc3RhdGljX2Nhc3Q8QVNlc3Npb25EZXNjcmlwdGlvbiAqPihvYmouZ2V0KCkpOworCisgICAgICAgIEFTdHJpbmcgcnRzcFVyaTsKKyAgICAgICAgaWYgKCFkZXNjLT5maW5kQXR0cmlidXRlKDAsICJhPWNvbnRyb2wiLCAmcnRzcFVyaSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gZmluZCB1cmwgaW4gU0RQIik7CisgICAgICAgICAgICBlcnIgPSBVTktOT1dOX0VSUk9SOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdE5vdGlmeSwgdGhpcyk7CisKKyAgICAgICAgICAgIG1IYW5kbGVyID0gbmV3IE15SGFuZGxlcihydHNwVXJpLmNfc3RyKCksIG5vdGlmeSwgdHJ1ZSAvKiB1aWRWYWxpZCAqLywgbVVJRCk7CisgICAgICAgICAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobUhhbmRsZXIpOworCisgICAgICAgICAgICBtSGFuZGxlci0+bG9hZFNEUChkZXNjKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgaWYgKG1TdGF0ZSA9PSBDT05ORUNUSU5HKSB7CisgICAgICAgICAgICAvLyBXZSdyZSBzdGlsbCBpbiB0aGUgcHJlcGFyYXRpb24gcGhhc2UsIHNpZ25hbCB0aGF0IGl0CisgICAgICAgICAgICAvLyBmYWlsZWQuCisgICAgICAgICAgICBub3RpZnlQcmVwYXJlZChlcnIpOworICAgICAgICB9CisKKyAgICAgICAgbVN0YXRlID0gRElTQ09OTkVDVEVEOworICAgICAgICBzZXRFcnJvcihlcnIpOworCisgICAgICAgIGlmIChtRGlzY29ubmVjdFJlcGx5SUQgIT0gMCkgeworICAgICAgICAgICAgZmluaXNoRGlzY29ubmVjdElmUG9zc2libGUoKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OlJUU1BTb3VyY2UyOjpvbkRpc2Nvbm5lY3RlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIGlmIChtU3RhdGUgPT0gRElTQ09OTkVDVEVEKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJlc3VsdCIsICZlcnIpKTsKKyAgICBDSEVDS19ORShlcnIsIChzdGF0dXNfdClPSyk7CisKKyAgICBtTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlci0+aWQoKSk7CisgICAgbUhhbmRsZXIuY2xlYXIoKTsKKworICAgIGlmIChtU3RhdGUgPT0gQ09OTkVDVElORykgeworICAgICAgICAvLyBXZSdyZSBzdGlsbCBpbiB0aGUgcHJlcGFyYXRpb24gcGhhc2UsIHNpZ25hbCB0aGF0IGl0CisgICAgICAgIC8vIGZhaWxlZC4KKyAgICAgICAgbm90aWZ5UHJlcGFyZWQoZXJyKTsKKyAgICB9CisKKyAgICBtU3RhdGUgPSBESVNDT05ORUNURUQ7CisgICAgc2V0RXJyb3IoZXJyKTsKKworICAgIGlmIChtRGlzY29ubmVjdFJlcGx5SUQgIT0gMCkgeworICAgICAgICBmaW5pc2hEaXNjb25uZWN0SWZQb3NzaWJsZSgpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OlJUU1BTb3VyY2UyOjpmaW5pc2hEaXNjb25uZWN0SWZQb3NzaWJsZSgpIHsKKyAgICBpZiAobVN0YXRlICE9IERJU0NPTk5FQ1RFRCkgeworICAgICAgICBpZiAobUhhbmRsZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgbUhhbmRsZXItPmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgfSBlbHNlIGlmIChtU0RQTG9hZGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1TRFBMb2FkZXItPmNhbmNlbCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAobmV3IEFNZXNzYWdlKS0+cG9zdFJlcGx5KG1EaXNjb25uZWN0UmVwbHlJRCk7CisgICAgbURpc2Nvbm5lY3RSZXBseUlEID0gMDsKK30KKwordm9pZCBOdVBsYXllcjI6OlJUU1BTb3VyY2UyOjpzZXRFcnJvcihzdGF0dXNfdCBlcnIpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUJ1ZmZlcmluZ0xvY2spOworICAgIG1GaW5hbFJlc3VsdCA9IGVycjsKK30KKwordm9pZCBOdVBsYXllcjI6OlJUU1BTb3VyY2UyOjpzdGFydEJ1ZmZlcmluZ0lmTmVjZXNzYXJ5KCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtQnVmZmVyaW5nTG9jayk7CisKKyAgICBpZiAoIW1CdWZmZXJpbmcpIHsKKyAgICAgICAgbUJ1ZmZlcmluZyA9IHRydWU7CisKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOworICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRQYXVzZU9uQnVmZmVyaW5nU3RhcnQpOworICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICB9Cit9CisKK2Jvb2wgTnVQbGF5ZXIyOjpSVFNQU291cmNlMjo6c3RvcEJ1ZmZlcmluZ0lmTmVjZXNzYXJ5KCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtQnVmZmVyaW5nTG9jayk7CisKKyAgICBpZiAobUJ1ZmZlcmluZykgeworICAgICAgICBpZiAoIWhhdmVTdWZmaWNpZW50RGF0YU9uQWxsVHJhY2tzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIG1CdWZmZXJpbmcgPSBmYWxzZTsKKworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gZHVwTm90aWZ5KCk7CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFJlc3VtZU9uQnVmZmVyaW5nRW5kKTsKKyAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSVFNQU291cmNlMjo6ZmluaXNoU2VlayhzdGF0dXNfdCBlcnIpIHsKKyAgICBpZiAobVNlZWtSZXBseUlEID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzcDxBTWVzc2FnZT4gc2Vla1JlcGx5ID0gbmV3IEFNZXNzYWdlOworICAgIHNlZWtSZXBseS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgc2Vla1JlcGx5LT5wb3N0UmVwbHkobVNlZWtSZXBseUlEKTsKKyAgICBtU2Vla1JlcGx5SUQgPSBOVUxMOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9SVFNQU291cmNlMi5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9SVFNQU291cmNlMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMmMzZTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL1JUU1BTb3VyY2UyLmgKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgUlRTUF9TT1VSQ0UyX0hfCisKKyNkZWZpbmUgUlRTUF9TT1VSQ0UyX0hfCisKKyNpbmNsdWRlICJOdVBsYXllcjJTb3VyY2UuaCIKKworI2luY2x1ZGUgIkFUU1BhcnNlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBTG9vcGVyOworc3RydWN0IEFSZXBseVRva2VuOworc3RydWN0IEFub3RoZXJQYWNrZXRTb3VyY2U7CitzdHJ1Y3QgTXlIYW5kbGVyOworc3RydWN0IFNEUExvYWRlcjsKKworc3RydWN0IE51UGxheWVyMjo6UlRTUFNvdXJjZTIgOiBwdWJsaWMgTnVQbGF5ZXIyOjpTb3VyY2UgeworICAgIFJUU1BTb3VyY2UyKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKKyAgICAgICAgICAgIHVpZF90IHVpZCA9IDAsCisgICAgICAgICAgICBib29sIGlzU0RQID0gZmFsc2UpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJpbmdTZXR0aW5ncygKKyAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgdm9pZCBwcmVwYXJlQXN5bmMoKTsKKyAgICB2aXJ0dWFsIHZvaWQgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIHZvaWQgc3RvcCgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBmZWVkTW9yZVRTRGF0YSgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBkZXF1ZXVlQWNjZXNzVW5pdChib29sIGF1ZGlvLCBzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldER1cmF0aW9uKGludDY0X3QgKmR1cmF0aW9uVXMpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2Vla1RvKAorICAgICAgICAgICAgaW50NjRfdCBzZWVrVGltZVVzLAorICAgICAgICAgICAgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSA9IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMpIG92ZXJyaWRlOworCisgICAgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5SVFNQU291cmNlMigpOworCisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0TWV0YShib29sIGF1ZGlvKTsKKworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXROb3RpZnkgICAgICAgICAgPSAnbm90aScsCisgICAgICAgIGtXaGF0RGlzY29ubmVjdCAgICAgID0gJ2Rpc2MnLAorICAgICAgICBrV2hhdFBlcmZvcm1TZWVrICAgICA9ICdzZWVrJywKKyAgICAgICAga1doYXRQb2xsQnVmZmVyaW5nICAgPSAncG9sbCcsCisgICAgICAgIGtXaGF0U2lnbmFsRU9TICAgICAgID0gJ2VvcyAnLAorICAgIH07CisKKyAgICBlbnVtIFN0YXRlIHsKKyAgICAgICAgRElTQ09OTkVDVEVELAorICAgICAgICBDT05ORUNUSU5HLAorICAgICAgICBDT05ORUNURUQsCisgICAgICAgIFNFRUtJTkcsCisgICAgfTsKKworICAgIGVudW0gRmxhZ3MgeworICAgICAgICAvLyBEb24ndCBsb2cgYW55IFVSTHMuCisgICAgICAgIGtGbGFnSW5jb2duaXRvID0gMSwKKyAgICB9OworCisgICAgc3RydWN0IFRyYWNrSW5mbyB7CisgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IG1Tb3VyY2U7CisKKyAgICAgICAgaW50MzJfdCBtVGltZVNjYWxlOworICAgICAgICB1aW50MzJfdCBtUlRQVGltZTsKKyAgICAgICAgaW50NjRfdCBtTm9ybWFsUGxheXRpbWVVczsKKyAgICAgICAgYm9vbCBtTlBUTWFwcGluZ1ZhbGlkOworICAgIH07CisKKyAgICBzcDxNZWRpYUhUVFBTZXJ2aWNlPiBtSFRUUFNlcnZpY2U7CisgICAgQVN0cmluZyBtVVJMOworICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1FeHRyYUhlYWRlcnM7CisgICAgdWlkX3QgbVVJRDsKKyAgICB1aW50MzJfdCBtRmxhZ3M7CisgICAgYm9vbCBtSXNTRFA7CisgICAgU3RhdGUgbVN0YXRlOworICAgIHN0YXR1c190IG1GaW5hbFJlc3VsdDsKKyAgICBzcDxBUmVwbHlUb2tlbj4gbURpc2Nvbm5lY3RSZXBseUlEOworICAgIE11dGV4IG1CdWZmZXJpbmdMb2NrOworICAgIGJvb2wgbUJ1ZmZlcmluZzsKKyAgICBib29sIG1JblByZXBhcmF0aW9uUGhhc2U7CisgICAgYm9vbCBtRU9TUGVuZGluZzsKKworICAgIE11dGV4IG1CdWZmZXJpbmdTZXR0aW5nc0xvY2s7CisgICAgQnVmZmVyaW5nU2V0dGluZ3MgbUJ1ZmZlcmluZ1NldHRpbmdzOworCisgICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKKyAgICBzcDxNeUhhbmRsZXI+IG1IYW5kbGVyOworICAgIHNwPFNEUExvYWRlcj4gbVNEUExvYWRlcjsKKworICAgIFZlY3RvcjxUcmFja0luZm8+IG1UcmFja3M7CisgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gbUF1ZGlvVHJhY2s7CisgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gbVZpZGVvVHJhY2s7CisKKyAgICBzcDxBVFNQYXJzZXI+IG1UU1BhcnNlcjsKKworICAgIGludDMyX3QgbVNlZWtHZW5lcmF0aW9uOworCisgICAgaW50NjRfdCBtRU9TVGltZW91dEF1ZGlvOworICAgIGludDY0X3QgbUVPU1RpbWVvdXRWaWRlbzsKKworICAgIHNwPEFSZXBseVRva2VuPiBtU2Vla1JlcGx5SUQ7CisKKyAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBnZXRTb3VyY2UoYm9vbCBhdWRpbyk7CisKKyAgICB2b2lkIG9uQ29ubmVjdGVkKCk7CisgICAgdm9pZCBvblNEUExvYWRlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCBvbkRpc2Nvbm5lY3RlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCBmaW5pc2hEaXNjb25uZWN0SWZQb3NzaWJsZSgpOworCisgICAgdm9pZCBwZXJmb3JtU2VlayhpbnQ2NF90IHNlZWtUaW1lVXMpOworICAgIHZvaWQgc2NoZWR1bGVQb2xsQnVmZmVyaW5nKCk7CisgICAgdm9pZCBjaGVja0J1ZmZlcmluZygKKyAgICAgICAgICAgIGJvb2wgKnByZXBhcmVkLAorICAgICAgICAgICAgYm9vbCAqdW5kZXJmbG93LAorICAgICAgICAgICAgYm9vbCAqb3ZlcmZsb3csCisgICAgICAgICAgICBib29sICpzdGFydFNlcnZlciwKKyAgICAgICAgICAgIGJvb2wgKmZpbmlzaGVkKTsKKyAgICB2b2lkIG9uUG9sbEJ1ZmZlcmluZygpOworCisgICAgYm9vbCBoYXZlU3VmZmljaWVudERhdGFPbkFsbFRyYWNrcygpOworCisgICAgdm9pZCBzZXRFT1NUaW1lb3V0KGJvb2wgYXVkaW8sIGludDY0X3QgdGltZW91dCk7CisgICAgdm9pZCBzZXRFcnJvcihzdGF0dXNfdCBlcnIpOworICAgIHZvaWQgc3RhcnRCdWZmZXJpbmdJZk5lY2Vzc2FyeSgpOworICAgIGJvb2wgc3RvcEJ1ZmZlcmluZ0lmTmVjZXNzYXJ5KCk7CisgICAgdm9pZCBmaW5pc2hTZWVrKHN0YXR1c190IGVycik7CisKKyAgICB2b2lkIHBvc3RTb3VyY2VFT1NJZk5lY2Vzc2FyeSgpOworICAgIHZvaWQgc2lnbmFsU291cmNlRU9TKHN0YXR1c190IHJlc3VsdCk7CisgICAgdm9pZCBvblNpZ25hbEVPUyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKKyAgICBib29sIHNvdXJjZU5lYXJFT1MoYm9vbCBhdWRpbyk7CisgICAgYm9vbCBzb3VyY2VSZWFjaGVkRU9TKGJvb2wgYXVkaW8pOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUlRTUFNvdXJjZTIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBSVFNQX1NPVVJDRTJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM3OTczYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNzggQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkFjdGl2aXR5TWFuYWdlci5jcHAiLAorICAgICAgICAiTWVkaWFQbGF5ZXJGYWN0b3J5LmNwcCIsCisgICAgICAgICJNZWRpYVBsYXllclNlcnZpY2UuY3BwIiwKKyAgICAgICAgIk1lZGlhUmVjb3JkZXJDbGllbnQuY3BwIiwKKyAgICAgICAgIk1ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmNwcCIsCisgICAgICAgICJTdGFnZWZyaWdodFJlY29yZGVyLmNwcCIsCisgICAgICAgICJUZXN0UGxheWVyU3R1Yi5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wIiwKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50IiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjYW1lcmFfY2xpZW50IiwKKyAgICAgICAgImxpYmNyeXB0byIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliZGwiLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmhpZGxtZW1vcnkiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYm1lZGlhX29teCIsCisgICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCisgICAgICAgICJsaWJtZWRpYWRybSIsCisgICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAorICAgICAgICAibGlibWVkaWF1dGlscyIsCisgICAgICAgICJsaWJtZW11bnJlYWNoYWJsZSIsCisgICAgICAgICJsaWJwb3dlcm1hbmFnZXIiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9odHRwbGl2ZSIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9udXBsYXllciIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9ydHNwIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3RpbWVkdGV4dCIsCisgICAgXSwKKworICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsibGlibWVkaWEiXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibSIsCisgICAgXSwKKworICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIG5hbWU6ICJsaWJtZWRpYXBsYXllcnNlcnZpY2UiLAorCisgICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgZGlhZzogeworICAgICAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICB9LAorICAgIH0sCisKK30KKworc3ViZGlycyA9IFsiKiJdCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLm1rIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmYzc0YTkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotIwotIyBsaWJtZWRpYXBsYXllcnNlcnZpY2UKLSMKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgXAotICAgIEFjdGl2aXR5TWFuYWdlci5jcHAgICAgICAgICBcCi0gICAgSERDUC5jcHAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBNZWRpYVBsYXllckZhY3RvcnkuY3BwICAgICAgXAotICAgIE1lZGlhUGxheWVyU2VydmljZS5jcHAgICAgICBcCi0gICAgTWVkaWFSZWNvcmRlckNsaWVudC5jcHAgICAgIFwKLSAgICBNZXRhZGF0YVJldHJpZXZlckNsaWVudC5jcHAgXAotICAgIFJlbW90ZURpc3BsYXkuY3BwICAgICAgICAgICBcCi0gICAgU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAgICAgIFwKLSAgICBUZXN0UGxheWVyU3R1Yi5jcHAgICAgICAgICAgXAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9ICAgICAgIFwKLSAgICBsaWJiaW5kZXIgICAgICAgICAgICAgICAgICAgXAotICAgIGxpYmNyeXB0byAgICAgICAgICAgICAgICAgICBcCi0gICAgbGliY3V0aWxzICAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJkcm1mcmFtZXdvcmsgICAgICAgICAgICAgXAotICAgIGxpYmxvZyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbGliZGwgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJndWkgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGxpYmF1ZGlvY2xpZW50ICAgICAgICAgICAgICBcCi0gICAgbGlibWVkaWEgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJtZWRpYW1ldHJpY3MgICAgICAgICAgICAgXAotICAgIGxpYm1lZGlhZHJtICAgICAgICAgICAgICAgICBcCi0gICAgbGlibWVkaWF1dGlscyAgICAgICAgICAgICAgIFwKLSAgICBsaWJtZW11bnJlYWNoYWJsZSAgICAgICAgICAgXAotICAgIGxpYnN0YWdlZnJpZ2h0ICAgICAgICAgICAgICBcCi0gICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiAgIFwKLSAgICBsaWJzdGFnZWZyaWdodF9odHRwbGl2ZSAgICAgXAotICAgIGxpYnN0YWdlZnJpZ2h0X29teCAgICAgICAgICBcCi0gICAgbGlic3RhZ2VmcmlnaHRfd2ZkICAgICAgICAgIFwKLSAgICBsaWJ1dGlscyAgICAgICAgICAgICAgICAgICAgXAotICAgIGxpYm5hdGl2ZXdpbmRvdyAgICAgICAgICAgICBcCi0gICAgbGliaGlkbGJhc2UgICAgICAgICAgICAgICAgIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAgXAotCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9ICAgICAgIFwKLSAgICBsaWJzdGFnZWZyaWdodF9udXBsYXllciAgICAgXAotICAgIGxpYnN0YWdlZnJpZ2h0X3J0c3AgICAgICAgICBcCi0gICAgbGlic3RhZ2VmcmlnaHRfdGltZWR0ZXh0ICAgIFwKLQotTE9DQUxfRVhQT1JUX1NIQVJFRF9MSUJSQVJZX0hFQURFUlMgOj0gbGlibWVkaWEKLQotTE9DQUxfQ19JTkNMVURFUyA6PSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlICAgICAgICAgICAgICAgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcCAgICAgICAgICAgICAgICAgIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheSAgICAgICAgICBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtICAgICAgICAgICAgICAgICAgXAotICAgICQoTE9DQUxfUEFUSCkvaW5jbHVkZS9tZWRpYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmcmFtZXdvcmtzL2F2L2luY2x1ZGUvY2FtZXJhICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4ICAgICAgICAgICAgICAgICAgXAotICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvaGFyZHdhcmUgICAgICAgICAgICAgICAgIFwKLSAgICBleHRlcm5hbC90cmVtb2xvL1RyZW1vbG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0KLUxPQ0FMX0NGTEFHUyArPSAtV2Vycm9yIC1Xbm8tZXJyb3I9ZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMgLVdhbGwKLQotTE9DQUxfTU9EVUxFOj0gbGlibWVkaWFwbGF5ZXJzZXJ2aWNlCi0KLUxPQ0FMXzMyX0JJVF9PTkxZIDo9IHRydWUKLQotTE9DQUxfU0FOSVRJWkUgOj0gY2ZpCi1MT0NBTF9TQU5JVElaRV9ESUFHIDo9IGNmaQotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCi0KLWluY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9IRENQLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9IRENQLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZlMzkzNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvSERDUC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiSERDUCIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkhEQ1AuaCIKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0KLSNpbmNsdWRlIDxkbGZjbi5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLUhEQ1A6OkhEQ1AoYm9vbCBjcmVhdGVFbmNyeXB0aW9uTW9kdWxlKQotICAgIDogbUlzRW5jcnlwdGlvbk1vZHVsZShjcmVhdGVFbmNyeXB0aW9uTW9kdWxlKSwKLSAgICAgIG1MaWJIYW5kbGUoTlVMTCksCi0gICAgICBtSERDUE1vZHVsZShOVUxMKSB7Ci0gICAgbUxpYkhhbmRsZSA9IGRsb3BlbigibGlic3RhZ2VmcmlnaHRfaGRjcC5zbyIsIFJUTERfTk9XKTsKLQotICAgIGlmIChtTGliSGFuZGxlID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBsb2NhdGUgbGlic3RhZ2VmcmlnaHRfaGRjcC5zbyIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgdHlwZWRlZiBIRENQTW9kdWxlICooKkNyZWF0ZUhEQ1BNb2R1bGVGdW5jKSgKLSAgICAgICAgICAgIHZvaWQgKiwgSERDUE1vZHVsZTo6T2JzZXJ2ZXJGdW5jKTsKLQotICAgIENyZWF0ZUhEQ1BNb2R1bGVGdW5jIGNyZWF0ZUhEQ1BNb2R1bGUgPQotICAgICAgICBtSXNFbmNyeXB0aW9uTW9kdWxlCi0gICAgICAgICAgICA/IChDcmVhdGVIRENQTW9kdWxlRnVuYylkbHN5bShtTGliSGFuZGxlLCAiY3JlYXRlSERDUE1vZHVsZSIpCi0gICAgICAgICAgICA6IChDcmVhdGVIRENQTW9kdWxlRnVuYylkbHN5bSgKLSAgICAgICAgICAgICAgICAgICAgbUxpYkhhbmRsZSwgImNyZWF0ZUhEQ1BNb2R1bGVGb3JEZWNyeXB0aW9uIik7Ci0KLSAgICBpZiAoY3JlYXRlSERDUE1vZHVsZSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJVbmFibGUgdG8gZmluZCBzeW1ib2wgJ2NyZWF0ZUhEQ1BNb2R1bGUnLiIpOwotICAgIH0gZWxzZSBpZiAoKG1IRENQTW9kdWxlID0gY3JlYXRlSERDUE1vZHVsZSgKLSAgICAgICAgICAgICAgICAgICAgdGhpcywgJkhEQ1A6Ok9ic2VydmVXcmFwcGVyKSkgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiY3JlYXRlSERDUE1vZHVsZSBmYWlsZWQuIik7Ci0gICAgfQotfQotCi1IRENQOjp+SERDUCgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKG1IRENQTW9kdWxlICE9IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlIG1IRENQTW9kdWxlOwotICAgICAgICBtSERDUE1vZHVsZSA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKG1MaWJIYW5kbGUgIT0gTlVMTCkgewotICAgICAgICBkbGNsb3NlKG1MaWJIYW5kbGUpOwotICAgICAgICBtTGliSGFuZGxlID0gTlVMTDsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEhEQ1A6OnNldE9ic2VydmVyKGNvbnN0IHNwPElIRENQT2JzZXJ2ZXI+ICZvYnNlcnZlcikgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobUhEQ1BNb2R1bGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0KLSAgICBtT2JzZXJ2ZXIgPSBvYnNlcnZlcjsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgSERDUDo6aW5pdEFzeW5jKGNvbnN0IGNoYXIgKmhvc3QsIHVuc2lnbmVkIHBvcnQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKG1IRENQTW9kdWxlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1IRENQTW9kdWxlLT5pbml0QXN5bmMoaG9zdCwgcG9ydCk7Ci19Ci0KLXN0YXR1c190IEhEQ1A6OnNodXRkb3duQXN5bmMoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtSERDUE1vZHVsZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLQotICAgIHJldHVybiBtSERDUE1vZHVsZS0+c2h1dGRvd25Bc3luYygpOwotfQotCi11aW50MzJfdCBIRENQOjpnZXRDYXBzKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobUhEQ1BNb2R1bGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0KLSAgICByZXR1cm4gbUhEQ1BNb2R1bGUtPmdldENhcHMoKTsKLX0KLQotc3RhdHVzX3QgSERDUDo6ZW5jcnlwdCgKLSAgICAgICAgY29uc3Qgdm9pZCAqaW5EYXRhLCBzaXplX3Qgc2l6ZSwgdWludDMyX3Qgc3RyZWFtQ1RSLAotICAgICAgICB1aW50NjRfdCAqb3V0SW5wdXRDVFIsIHZvaWQgKm91dERhdGEpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgQ0hFQ0sobUlzRW5jcnlwdGlvbk1vZHVsZSk7Ci0KLSAgICBpZiAobUhEQ1BNb2R1bGUgPT0gTlVMTCkgewotICAgICAgICAqb3V0SW5wdXRDVFIgPSAwOwotCi0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLQotICAgIHJldHVybiBtSERDUE1vZHVsZS0+ZW5jcnlwdChpbkRhdGEsIHNpemUsIHN0cmVhbUNUUiwgb3V0SW5wdXRDVFIsIG91dERhdGEpOwotfQotCi1zdGF0dXNfdCBIRENQOjplbmNyeXB0TmF0aXZlKAotICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiAmZ3JhcGhpY0J1ZmZlciwKLSAgICAgICAgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUsIHVpbnQzMl90IHN0cmVhbUNUUiwKLSAgICAgICAgdWludDY0X3QgKm91dElucHV0Q1RSLCB2b2lkICpvdXREYXRhKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIENIRUNLKG1Jc0VuY3J5cHRpb25Nb2R1bGUpOwotCi0gICAgaWYgKG1IRENQTW9kdWxlID09IE5VTEwpIHsKLSAgICAgICAgKm91dElucHV0Q1RSID0gMDsKLQotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0KLSAgICByZXR1cm4gbUhEQ1BNb2R1bGUtPmVuY3J5cHROYXRpdmUoZ3JhcGhpY0J1ZmZlci0+aGFuZGxlLAotICAgICAgICAgICAgICAgICAgICBvZmZzZXQsIHNpemUsIHN0cmVhbUNUUiwgb3V0SW5wdXRDVFIsIG91dERhdGEpOwotfQotCi1zdGF0dXNfdCBIRENQOjpkZWNyeXB0KAotICAgICAgICBjb25zdCB2b2lkICppbkRhdGEsIHNpemVfdCBzaXplLAotICAgICAgICB1aW50MzJfdCBzdHJlYW1DVFIsIHVpbnQ2NF90IG91dElucHV0Q1RSLCB2b2lkICpvdXREYXRhKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIENIRUNLKCFtSXNFbmNyeXB0aW9uTW9kdWxlKTsKLQotICAgIGlmIChtSERDUE1vZHVsZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLQotICAgIHJldHVybiBtSERDUE1vZHVsZS0+ZGVjcnlwdChpbkRhdGEsIHNpemUsIHN0cmVhbUNUUiwgb3V0SW5wdXRDVFIsIG91dERhdGEpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgSERDUDo6T2JzZXJ2ZVdyYXBwZXIodm9pZCAqbWUsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MikgewotICAgIHN0YXRpY19jYXN0PEhEQ1AgKj4obWUpLT5vYnNlcnZlKG1zZywgZXh0MSwgZXh0Mik7Ci19Ci0KLXZvaWQgSERDUDo6b2JzZXJ2ZShpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKG1PYnNlcnZlciAhPSBOVUxMKSB7Ci0gICAgICAgIG1PYnNlcnZlci0+bm90aWZ5KG1zZywgZXh0MSwgZXh0MiwgTlVMTCAvKiBvYmogKi8pOwotICAgIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0hEQ1AuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9IRENQLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYzYxYjUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0hEQ1AuaAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEhEQ1BfSF8KLQotI2RlZmluZSBIRENQX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9JSERDUC5oPgotI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IEhEQ1AgOiBwdWJsaWMgQm5IRENQIHsKLSAgICBleHBsaWNpdCBIRENQKGJvb2wgY3JlYXRlRW5jcnlwdGlvbk1vZHVsZSk7Ci0gICAgdmlydHVhbCB+SERDUCgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPYnNlcnZlcihjb25zdCBzcDxJSERDUE9ic2VydmVyPiAmb2JzZXJ2ZXIpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdEFzeW5jKGNvbnN0IGNoYXIgKmhvc3QsIHVuc2lnbmVkIHBvcnQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2h1dGRvd25Bc3luYygpOwotICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0Q2FwcygpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBlbmNyeXB0KAotICAgICAgICAgICAgY29uc3Qgdm9pZCAqaW5EYXRhLCBzaXplX3Qgc2l6ZSwgdWludDMyX3Qgc3RyZWFtQ1RSLAotICAgICAgICAgICAgdWludDY0X3QgKm91dElucHV0Q1RSLCB2b2lkICpvdXREYXRhKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZW5jcnlwdE5hdGl2ZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+ICZncmFwaGljQnVmZmVyLAotICAgICAgICAgICAgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUsIHVpbnQzMl90IHN0cmVhbUNUUiwKLSAgICAgICAgICAgIHVpbnQ2NF90ICpvdXRJbnB1dENUUiwgdm9pZCAqb3V0RGF0YSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGRlY3J5cHQoCi0gICAgICAgICAgICBjb25zdCB2b2lkICppbkRhdGEsIHNpemVfdCBzaXplLAotICAgICAgICAgICAgdWludDMyX3Qgc3RyZWFtQ1RSLCB1aW50NjRfdCBvdXRJbnB1dENUUiwgdm9pZCAqb3V0RGF0YSk7Ci0KLXByaXZhdGU6Ci0gICAgTXV0ZXggbUxvY2s7Ci0KLSAgICBib29sIG1Jc0VuY3J5cHRpb25Nb2R1bGU7Ci0KLSAgICB2b2lkICptTGliSGFuZGxlOwotICAgIEhEQ1BNb2R1bGUgKm1IRENQTW9kdWxlOwotICAgIHNwPElIRENQT2JzZXJ2ZXI+IG1PYnNlcnZlcjsKLQotICAgIHN0YXRpYyB2b2lkIE9ic2VydmVXcmFwcGVyKHZvaWQgKm1lLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIpOwotICAgIHZvaWQgb2JzZXJ2ZShpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIpOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSERDUCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIEhEQ1BfSF8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyRmFjdG9yeS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJGYWN0b3J5LmNwcAppbmRleCA2ODZjMDU5Li4xMzc2Y2NjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJGYWN0b3J5LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJGYWN0b3J5LmNwcApAQCAtMjAsOCArMjAsOCBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAppbmRleCAzNDQ1NDY5Li45YmNmYzgzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcApAQCAtNTUsNiArNTUsNyBAQAogI2luY2x1ZGUgPG1lZGlhL01ldGFkYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgogI2luY2x1ZGUgPG1lZGlhL01lbW9yeUxlYWtUcmFja1V0aWwuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgpAQCAtNzcsMTEgKzc4LDcgQEAKICNpbmNsdWRlICJUZXN0UGxheWVyU3R1Yi5oIgogI2luY2x1ZGUgIm51cGxheWVyL051UGxheWVyRHJpdmVyLmgiCiAKLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YLmg+Ci0KLSNpbmNsdWRlICJIRENQLmgiCiAjaW5jbHVkZSAiSFRUUEJhc2UuaCIKLSNpbmNsdWRlICJSZW1vdGVEaXNwbGF5LmgiCiAKIHN0YXRpYyBjb25zdCBpbnQga0R1bXBMb2NrUmV0cmllcyA9IDUwOwogc3RhdGljIGNvbnN0IGludCBrRHVtcExvY2tTbGVlcFVzID0gMjAwMDA7CkBAIC05Myw2ICs5MCw3IEBACiB1c2luZyBhbmRyb2lkOjpCQURfVkFMVUU7CiB1c2luZyBhbmRyb2lkOjpOT1RfRU5PVUdIX0RBVEE7CiB1c2luZyBhbmRyb2lkOjpQYXJjZWw7Cit1c2luZyBhbmRyb2lkOjptZWRpYTo6Vm9sdW1lU2hhcGVyOwogCiAvLyBNYXggbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGZpbHRlci4KIGNvbnN0IGludCBrTWF4RmlsdGVyU2l6ZSA9IDY0OyAgLy8gSSBwdWxsZWQgdGhhdCBvdXQgb2YgdGhpbiBhaXIuCkBAIC0zMzcsMjkgKzMzNSwxMyBAQAogICAgIHJldHVybiBNZWRpYUNvZGVjTGlzdDo6Z2V0TG9jYWxJbnN0YW5jZSgpOwogfQogCi1zcDxJT01YPiBNZWRpYVBsYXllclNlcnZpY2U6OmdldE9NWCgpIHsKLSAgICBBTE9HSSgiTWVkaWFQbGF5ZXJTZXJ2aWNlOjpnZXRPTVgiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKG1PTVguZ2V0KCkgPT0gTlVMTCkgewotICAgICAgICBtT01YID0gbmV3IE9NWDsKLSAgICB9Ci0KLSAgICByZXR1cm4gbU9NWDsKLX0KLQotc3A8SUhEQ1A+IE1lZGlhUGxheWVyU2VydmljZTo6bWFrZUhEQ1AoYm9vbCBjcmVhdGVFbmNyeXB0aW9uTW9kdWxlKSB7Ci0gICAgcmV0dXJuIG5ldyBIRENQKGNyZWF0ZUVuY3J5cHRpb25Nb2R1bGUpOwotfQotCiBzcDxJUmVtb3RlRGlzcGxheT4gTWVkaWFQbGF5ZXJTZXJ2aWNlOjpsaXN0ZW5Gb3JSZW1vdGVEaXNwbGF5KAotICAgICAgICBjb25zdCBTdHJpbmcxNiAmb3BQYWNrYWdlTmFtZSwKLSAgICAgICAgY29uc3Qgc3A8SVJlbW90ZURpc3BsYXlDbGllbnQ+JiBjbGllbnQsIGNvbnN0IFN0cmluZzgmIGlmYWNlKSB7Ci0gICAgaWYgKCFjaGVja1Blcm1pc3Npb24oImFuZHJvaWQucGVybWlzc2lvbi5DT05UUk9MX1dJRklfRElTUExBWSIpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KKyAgICAgICAgY29uc3QgU3RyaW5nMTYgJi8qb3BQYWNrYWdlTmFtZSovLAorICAgICAgICBjb25zdCBzcDxJUmVtb3RlRGlzcGxheUNsaWVudD4mIC8qY2xpZW50Ki8sCisgICAgICAgIGNvbnN0IFN0cmluZzgmIC8qaWZhY2UqLykgeworICAgIEFMT0dFKCJsaXN0ZW5Gb3JSZW1vdGVEaXNwbGF5IGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQhIik7CiAKLSAgICByZXR1cm4gbmV3IFJlbW90ZURpc3BsYXkob3BQYWNrYWdlTmFtZSwgY2xpZW50LCBpZmFjZS5zdHJpbmcoKSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdApAQCAtNjA5LDYgKzU5MSw3IEBACiAgICAgICAgIGZyZWUobUF1ZGlvQXR0cmlidXRlcyk7CiAgICAgfQogICAgIGNsZWFyRGVhdGhOb3RpZmllcnNfbCgpOworICAgIG1BdWRpb0RldmljZVVwZGF0ZWRMaXN0ZW5lci5jbGVhcigpOwogfQogCiB2b2lkIE1lZGlhUGxheWVyU2VydmljZTo6Q2xpZW50OjpkaXNjb25uZWN0KCkKQEAgLTcxNiw2ICs2OTksMTcgQEAKICAgICB9CiB9CiAKK3ZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OkF1ZGlvRGV2aWNlVXBkYXRlZE5vdGlmaWVyOjpvbkF1ZGlvRGV2aWNlVXBkYXRlKAorICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvLAorICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKSB7CisgICAgc3A8TWVkaWFQbGF5ZXJCYXNlPiBsaXN0ZW5lciA9IG1MaXN0ZW5lci5wcm9tb3RlKCk7CisgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKKyAgICAgICAgbGlzdGVuZXItPnNlbmRFdmVudChNRURJQV9BVURJT19ST1VUSU5HX0NIQU5HRUQsIGF1ZGlvSW8sIGRldmljZUlkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVygibGlzdGVuZXIgZm9yIHByb2Nlc3MgJWQgZGVhdGggaXMgZ29uZSIsIE1FRElBX0FVRElPX1JPVVRJTkdfQ0hBTkdFRCk7CisgICAgfQorfQorCiB2b2lkIE1lZGlhUGxheWVyU2VydmljZTo6Q2xpZW50OjpjbGVhckRlYXRoTm90aWZpZXJzX2woKSB7CiAgICAgaWYgKG1FeHRyYWN0b3JEZWF0aExpc3RlbmVyICE9IG51bGxwdHIpIHsKICAgICAgICAgbUV4dHJhY3RvckRlYXRoTGlzdGVuZXItPnVubGlua1RvRGVhdGgoKTsKQEAgLTc0OCwzNiArNzQyLDI1IEBACiAgICAgICAgICAgICBuZXcgU2VydmljZURlYXRoTm90aWZpZXIoYmluZGVyLCBwLCBNRURJQUVYVFJBQ1RPUl9QUk9DRVNTX0RFQVRIKTsKICAgICBiaW5kZXItPmxpbmtUb0RlYXRoKGV4dHJhY3RvckRlYXRoTGlzdGVuZXIpOwogCi0gICAgc3A8U2VydmljZURlYXRoTm90aWZpZXI+IGNvZGVjRGVhdGhMaXN0ZW5lcjsKLSAgICBpZiAocHJvcGVydHlfZ2V0X2Jvb2woInBlcnNpc3QubWVkaWEudHJlYmxlX29teCIsIHRydWUpKSB7Ci0gICAgICAgIC8vIFRyZWJsZSBJT214Ci0gICAgICAgIHNwPElPbXg+IG9teCA9IElPbXg6OmdldFNlcnZpY2UoKTsKLSAgICAgICAgaWYgKG9teCA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBBTE9HRSgiVHJlYmxlIElPbXggbm90IGF2YWlsYWJsZSIpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgY29kZWNEZWF0aExpc3RlbmVyID0gbmV3IFNlcnZpY2VEZWF0aE5vdGlmaWVyKG9teCwgcCwgTUVESUFDT0RFQ19QUk9DRVNTX0RFQVRIKTsKLSAgICAgICAgb214LT5saW5rVG9EZWF0aChjb2RlY0RlYXRoTGlzdGVuZXIsIDApOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIExlZ2FjeSBJT01YCi0gICAgICAgIGJpbmRlciA9IHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5jb2RlYyIpKTsKLSAgICAgICAgaWYgKGJpbmRlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgiY29kZWMgc2VydmljZSBub3QgYXZhaWxhYmxlIik7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBjb2RlY0RlYXRoTGlzdGVuZXIgPSBuZXcgU2VydmljZURlYXRoTm90aWZpZXIoYmluZGVyLCBwLCBNRURJQUNPREVDX1BST0NFU1NfREVBVEgpOwotICAgICAgICBiaW5kZXItPmxpbmtUb0RlYXRoKGNvZGVjRGVhdGhMaXN0ZW5lcik7CisgICAgc3A8SU9teD4gb214ID0gSU9teDo6Z2V0U2VydmljZSgpOworICAgIGlmIChvbXggPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSU9teCBzZXJ2aWNlIGlzIG5vdCBhdmFpbGFibGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQorICAgIHNwPFNlcnZpY2VEZWF0aE5vdGlmaWVyPiBjb2RlY0RlYXRoTGlzdGVuZXIgPQorICAgICAgICAgICAgbmV3IFNlcnZpY2VEZWF0aE5vdGlmaWVyKG9teCwgcCwgTUVESUFDT0RFQ19QUk9DRVNTX0RFQVRIKTsKKyAgICBvbXgtPmxpbmtUb0RlYXRoKGNvZGVjRGVhdGhMaXN0ZW5lciwgMCk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAKICAgICBjbGVhckRlYXRoTm90aWZpZXJzX2woKTsKICAgICBtRXh0cmFjdG9yRGVhdGhMaXN0ZW5lciA9IGV4dHJhY3RvckRlYXRoTGlzdGVuZXI7CiAgICAgbUNvZGVjRGVhdGhMaXN0ZW5lciA9IGNvZGVjRGVhdGhMaXN0ZW5lcjsKKyAgICBtQXVkaW9EZXZpY2VVcGRhdGVkTGlzdGVuZXIgPSBuZXcgQXVkaW9EZXZpY2VVcGRhdGVkTm90aWZpZXIocCk7CiAKICAgICBpZiAoIXAtPmhhcmR3YXJlT3V0cHV0KCkpIHsKICAgICAgICAgbUF1ZGlvT3V0cHV0ID0gbmV3IEF1ZGlvT3V0cHV0KG1BdWRpb1Nlc3Npb25JZCwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpLAotICAgICAgICAgICAgICAgIG1QaWQsIG1BdWRpb0F0dHJpYnV0ZXMpOworICAgICAgICAgICAgICAgIG1QaWQsIG1BdWRpb0F0dHJpYnV0ZXMsIG1BdWRpb0RldmljZVVwZGF0ZWRMaXN0ZW5lcik7CiAgICAgICAgIHN0YXRpY19jYXN0PE1lZGlhUGxheWVySW50ZXJmYWNlKj4ocC5nZXQoKSktPnNldEF1ZGlvU2luayhtQXVkaW9PdXRwdXQpOwogICAgIH0KIApAQCAtOTA3LDcgKzg5MCw3IEBACiAKIHN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6Q2xpZW50OjpzZXREYXRhU291cmNlKAogICAgICAgICBjb25zdCBzcDxJRGF0YVNvdXJjZT4gJnNvdXJjZSkgewotICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UgPSBEYXRhU291cmNlOjpDcmVhdGVGcm9tSURhdGFTb3VyY2Uoc291cmNlKTsKKyAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0gQ3JlYXRlRGF0YVNvdXJjZUZyb21JRGF0YVNvdXJjZShzb3VyY2UpOwogICAgIHBsYXllcl90eXBlIHBsYXllclR5cGUgPSBNZWRpYVBsYXllckZhY3Rvcnk6OmdldFBsYXllclR5cGUodGhpcywgZGF0YVNvdXJjZSk7CiAgICAgc3A8TWVkaWFQbGF5ZXJCYXNlPiBwID0gc2V0RGF0YVNvdXJjZV9wcmUocGxheWVyVHlwZSk7CiAgICAgaWYgKHAgPT0gTlVMTCkgewpAQCAtMTA2NCwxOCArMTA0NywxOCBAQAogICAgIHJldHVybiBwLT5zZXRCdWZmZXJpbmdTZXR0aW5ncyhidWZmZXJpbmcpOwogfQogCi1zdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6Z2V0RGVmYXVsdEJ1ZmZlcmluZ1NldHRpbmdzKAorc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OmdldEJ1ZmZlcmluZ1NldHRpbmdzKAogICAgICAgICBCdWZmZXJpbmdTZXR0aW5ncyogYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pCiB7CiAgICAgc3A8TWVkaWFQbGF5ZXJCYXNlPiBwID0gZ2V0UGxheWVyKCk7CiAgICAgLy8gVE9ETzogY3JlYXRlIG1QbGF5ZXIgb24gZGVtYW5kLgogICAgIGlmIChwID09IDApIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIHN0YXR1c190IHJldCA9IHAtPmdldERlZmF1bHRCdWZmZXJpbmdTZXR0aW5ncyhidWZmZXJpbmcpOworICAgIHN0YXR1c190IHJldCA9IHAtPmdldEJ1ZmZlcmluZ1NldHRpbmdzKGJ1ZmZlcmluZyk7CiAgICAgaWYgKHJldCA9PSBOT19FUlJPUikgewotICAgICAgICBBTE9HVigiWyVkXSBnZXREZWZhdWx0QnVmZmVyaW5nU2V0dGluZ3N7JXN9IiwKKyAgICAgICAgQUxPR1YoIlslZF0gZ2V0QnVmZmVyaW5nU2V0dGluZ3N7JXN9IiwKICAgICAgICAgICAgICAgICBtQ29ubklkLCBidWZmZXJpbmctPnRvU3RyaW5nKCkuc3RyaW5nKCkpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJbJWRdIGdldERlZmF1bHRCdWZmZXJpbmdTZXR0aW5ncyByZXR1cm5lZCAlZCIsIG1Db25uSWQsIHJldCk7CisgICAgICAgIEFMT0dFKCJbJWRdIGdldEJ1ZmZlcmluZ1NldHRpbmdzIHJldHVybmVkICVkIiwgbUNvbm5JZCwgcmV0KTsKICAgICB9CiAgICAgcmV0dXJuIHJldDsKIH0KQEAgLTEyODIsNiArMTI2NSwxNCBAQAogICAgIHJldHVybiBwLT5yZXNldCgpOwogfQogCitzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6bm90aWZ5QXQoaW50NjRfdCBtZWRpYVRpbWVVcykKK3sKKyAgICBBTE9HVigiWyVkXSBub3RpZnlBdCglbGxkKSIsIG1Db25uSWQsIChsb25nIGxvbmcpbWVkaWFUaW1lVXMpOworICAgIHNwPE1lZGlhUGxheWVyQmFzZT4gcCA9IGdldFBsYXllcigpOworICAgIGlmIChwID09IDApIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIHJldHVybiBwLT5ub3RpZnlBdChtZWRpYVRpbWVVcyk7Cit9CisKIHN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6Q2xpZW50OjpzZXRBdWRpb1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCB0eXBlKQogewogICAgIEFMT0dWKCJbJWRdIHNldEF1ZGlvU3RyZWFtVHlwZSglZCkiLCBtQ29ubklkLCB0eXBlKTsKQEAgLTE1MzQsNiArMTUyNSw0MiBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKK3N0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6Q2xpZW50OjpzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkKK3sKKyAgICBBTE9HVigiWyVkXSBzZXRPdXRwdXREZXZpY2UiLCBtQ29ubklkKTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICAgICAgaWYgKG1BdWRpb091dHB1dC5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gbUF1ZGlvT3V0cHV0LT5zZXRPdXRwdXREZXZpY2UoZGV2aWNlSWQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19JTklUOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6Z2V0Um91dGVkRGV2aWNlSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCogZGV2aWNlSWQpCit7CisgICAgQUxPR1YoIlslZF0gZ2V0Um91dGVkRGV2aWNlSWQiLCBtQ29ubklkKTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICAgICAgaWYgKG1BdWRpb091dHB1dC5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gbUF1ZGlvT3V0cHV0LT5nZXRSb3V0ZWREZXZpY2VJZChkZXZpY2VJZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0lOSVQ7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6Q2xpZW50OjplbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCkKK3sKKyAgICBBTE9HVigiWyVkXSBlbmFibGVBdWRpb0RldmljZUNhbGxiYWNrLCAlZCIsIG1Db25uSWQsIGVuYWJsZWQpOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgICAgICBpZiAobUF1ZGlvT3V0cHV0LmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBtQXVkaW9PdXRwdXQtPmVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soZW5hYmxlZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0lOSVQ7Cit9CisKICNpZiBDQUxMQkFDS19BTlRBR09OSVpFUgogY29uc3QgaW50IEFudGFnb25pemVyOjppbnRlcnZhbCA9IDEwMDAwOyAvLyAxMCBtc2VjcwogCkBAIC0xNTcyLDcgKzE1OTksNyBAQAogI3VuZGVmIExPR19UQUcKICNkZWZpbmUgTE9HX1RBRyAiQXVkaW9TaW5rIgogTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6QXVkaW9PdXRwdXQoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwgdWlkX3QgdWlkLCBpbnQgcGlkLAotICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIGF0dHIpCisgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogYXR0ciwgY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBkZXZpY2VDYWxsYmFjaykKICAgICA6IG1DYWxsYmFjayhOVUxMKSwKICAgICAgIG1DYWxsYmFja0Nvb2tpZShOVUxMKSwKICAgICAgIG1DYWxsYmFja0RhdGEoTlVMTCksCkBAIC0xNTg5LDcgKzE2MTYsMTEgQEAKICAgICAgIG1TZW5kTGV2ZWwoMC4wKSwKICAgICAgIG1BdXhFZmZlY3RJZCgwKSwKICAgICAgIG1GbGFncyhBVURJT19PVVRQVVRfRkxBR19OT05FKSwKLSAgICAgIG1Wb2x1bWVIYW5kbGVyKG5ldyBWb2x1bWVIYW5kbGVyKCkpCisgICAgICBtVm9sdW1lSGFuZGxlcihuZXcgbWVkaWE6OlZvbHVtZUhhbmRsZXIoKSksCisgICAgICBtU2VsZWN0ZWREZXZpY2VJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKSwKKyAgICAgIG1Sb3V0ZWREZXZpY2VJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKSwKKyAgICAgIG1EZXZpY2VDYWxsYmFja0VuYWJsZWQoZmFsc2UpLAorICAgICAgbURldmljZUNhbGxiYWNrKGRldmljZUNhbGxiYWNrKQogewogICAgIEFMT0dWKCJBdWRpb091dHB1dCglZCkiLCBzZXNzaW9uSWQpOwogICAgIGlmIChhdHRyICE9IE5VTEwpIHsKQEAgLTE5NzUsNyArMjAwNiw5IEBACiAgICAgICAgICAgICAgICAgICAgIG1VaWQsCiAgICAgICAgICAgICAgICAgICAgIG1QaWQsCiAgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICBkb05vdFJlY29ubmVjdCk7CisgICAgICAgICAgICAgICAgICAgIGRvTm90UmVjb25uZWN0LAorICAgICAgICAgICAgICAgICAgICAxLjBmLCAgLy8gZGVmYXVsdCB2YWx1ZSBmb3IgbWF4UmVxdWlyZWRTcGVlZAorICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWREZXZpY2VJZCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBUT0RPOiBEdWUgdG8gYnVmZmVyIG1lbW9yeSBjb25jZXJucywgd2UgdXNlIGEgbWF4IHRhcmdldCBwbGF5YmFjayBzcGVlZAogICAgICAgICAgICAgLy8gYmFzZWQgb24gbVBsYXliYWNrUmF0ZSBhdCB0aGUgdGltZSBvZiBvcGVuIChpbnN0ZWFkIG9mIGtNYXhSZXF1aXJlZFNwZWVkKSwKQEAgLTIwMDIsNyArMjAzNSw4IEBACiAgICAgICAgICAgICAgICAgICAgIG1QaWQsCiAgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVzLAogICAgICAgICAgICAgICAgICAgICBkb05vdFJlY29ubmVjdCwKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0U3BlZWQpOworICAgICAgICAgICAgICAgICAgICB0YXJnZXRTcGVlZCwKKyAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkRGV2aWNlSWQpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKCh0ID09IDApIHx8ICh0LT5pbml0Q2hlY2soKSAhPSBOT19FUlJPUikpIHsKQEAgLTIwOTYsNiArMjEzMCwxMCBAQAogICAgICAgICAgICAgcmVzID0gbVRyYWNrLT5hdHRhY2hBdXhFZmZlY3QobUF1eEVmZmVjdElkKTsKICAgICAgICAgfQogICAgIH0KKyAgICBtVHJhY2stPnNldE91dHB1dERldmljZShtU2VsZWN0ZWREZXZpY2VJZCk7CisgICAgaWYgKG1EZXZpY2VDYWxsYmFja0VuYWJsZWQpIHsKKyAgICAgICAgbVRyYWNrLT5hZGRBdWRpb0RldmljZUNhbGxiYWNrKG1EZXZpY2VDYWxsYmFjay5wcm9tb3RlKCkpOworICAgIH0KICAgICBBTE9HVigidXBkYXRlVHJhY2soKSBET05FIHN0YXR1cyAlZCIsIHJlcyk7CiAgICAgcmV0dXJuIHJlczsKIH0KQEAgLTIzMTEsNiArMjM0OSw0NSBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAorc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6c2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpCit7CisgICAgQUxPR1YoInNldE91dHB1dERldmljZSglZCkiLCBkZXZpY2VJZCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIG1TZWxlY3RlZERldmljZUlkID0gZGV2aWNlSWQ7CisgICAgaWYgKG1UcmFjayAhPSAwKSB7CisgICAgICAgIHJldHVybiBtVHJhY2stPnNldE91dHB1dERldmljZShkZXZpY2VJZCk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6Z2V0Um91dGVkRGV2aWNlSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCogZGV2aWNlSWQpCit7CisgICAgQUxPR1YoImdldFJvdXRlZERldmljZUlkIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGlmIChtVHJhY2sgIT0gMCkgeworICAgICAgICBtUm91dGVkRGV2aWNlSWQgPSBtVHJhY2stPmdldFJvdXRlZERldmljZUlkKCk7CisgICAgfQorICAgICpkZXZpY2VJZCA9IG1Sb3V0ZWREZXZpY2VJZDsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OmVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKQoreworICAgIEFMT0dWKCJlbmFibGVBdWRpb0RldmljZUNhbGxiYWNrLCAlZCIsIGVuYWJsZWQpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBtRGV2aWNlQ2FsbGJhY2tFbmFibGVkID0gZW5hYmxlZDsKKyAgICBpZiAobVRyYWNrICE9IDApIHsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgICAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICAgICAgc3RhdHVzID0gbVRyYWNrLT5hZGRBdWRpb0RldmljZUNhbGxiYWNrKG1EZXZpY2VDYWxsYmFjay5wcm9tb3RlKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gbVRyYWNrLT5yZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKG1EZXZpY2VDYWxsYmFjay5wcm9tb3RlKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKwogVm9sdW1lU2hhcGVyOjpTdGF0dXMgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6YXBwbHlWb2x1bWVTaGFwZXIoCiAgICAgICAgICAgICAgICAgY29uc3Qgc3A8Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiYgY29uZmlndXJhdGlvbiwKICAgICAgICAgICAgICAgICBjb25zdCBzcDxWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4mIG9wZXJhdGlvbikKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaAppbmRleCAzNGU1ZTJhLi5iZmI3Y2MyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oCkBAIC03Nyw4ICs3NywxMiBAQAogICAgICAgICBjbGFzcyBDYWxsYmFja0RhdGE7CiAKICAgICAgcHVibGljOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb091dHB1dChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLCB1aWRfdCB1aWQsIGludCBwaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICogYXR0cik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvT3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICogYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGRldmljZUNhbGxiYWNrKTsKICAgICAgICAgdmlydHVhbCAgICAgICAgICAgICAgICAgfkF1ZGlvT3V0cHV0KCk7CiAKICAgICAgICAgdmlydHVhbCBib29sICAgICAgICAgICAgcmVhZHkoKSBjb25zdCB7IHJldHVybiBtVHJhY2sgIT0gMDsgfQpAQCAtMTMxLDEwICsxMzUsMTUgQEAKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKTsKICAgICAgICAgdmlydHVhbCBTdHJpbmc4ICAgICAgICAgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKTsKIAotICAgICAgICB2aXJ0dWFsIFZvbHVtZVNoYXBlcjo6U3RhdHVzIGFwcGx5Vm9sdW1lU2hhcGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4mIGNvbmZpZ3VyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+JiBvcGVyYXRpb24pIG92ZXJyaWRlOwotICAgICAgICB2aXJ0dWFsIHNwPFZvbHVtZVNoYXBlcjo6U3RhdGU+IGdldFZvbHVtZVNoYXBlclN0YXRlKGludCBpZCkgb3ZlcnJpZGU7CisgICAgICAgIHZpcnR1YWwgbWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdHVzIGFwcGx5Vm9sdW1lU2hhcGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24+JiBjb25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4mIG9wZXJhdGlvbikgb3ZlcnJpZGU7CisgICAgICAgIHZpcnR1YWwgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdGU+IGdldFZvbHVtZVNoYXBlclN0YXRlKGludCBpZCkgb3ZlcnJpZGU7CisKKyAgICAgICAgLy8gQXVkaW9Sb3V0aW5nCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldE91dHB1dERldmljZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0Um91dGVkRGV2aWNlSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCogZGV2aWNlSWQpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBlbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCk7CiAKICAgICBwcml2YXRlOgogICAgICAgICBzdGF0aWMgdm9pZCAgICAgICAgICAgICBzZXRNaW5CdWZmZXJDb3VudCgpOwpAQCAtMTY0LDcgKzE3MywxMSBAQAogICAgICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtU2VuZExldmVsOwogICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtQXV4RWZmZWN0SWQ7CiAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICAgIG1GbGFnczsKLSAgICAgICAgc3A8Vm9sdW1lSGFuZGxlcj4gICAgICAgbVZvbHVtZUhhbmRsZXI7CisgICAgICAgIHNwPG1lZGlhOjpWb2x1bWVIYW5kbGVyPiAgICAgICBtVm9sdW1lSGFuZGxlcjsKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICAgbVNlbGVjdGVkRGV2aWNlSWQ7CisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgIG1Sb3V0ZWREZXZpY2VJZDsKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbURldmljZUNhbGxiYWNrRW5hYmxlZDsKKyAgICAgICAgd3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+ICAgICAgICBtRGV2aWNlQ2FsbGJhY2s7CiAgICAgICAgIG11dGFibGUgTXV0ZXggICAgICAgICAgIG1Mb2NrOwogCiAgICAgICAgIC8vIHN0YXRpYyB2YXJpYWJsZXMgYmVsb3cgbm90IHByb3RlY3RlZCBieSBtdXRleApAQCAtMjI2LDggKzIzOSw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uSWQpOwogCiAgICAgdmlydHVhbCBzcDxJTWVkaWFDb2RlY0xpc3Q+IGdldENvZGVjTGlzdCgpIGNvbnN0OwotICAgIHZpcnR1YWwgc3A8SU9NWD4gICAgICAgICAgICBnZXRPTVgoKTsKLSAgICB2aXJ0dWFsIHNwPElIRENQPiAgICAgICAgICAgbWFrZUhEQ1AoYm9vbCBjcmVhdGVFbmNyeXB0aW9uTW9kdWxlKTsKIAogICAgIHZpcnR1YWwgc3A8SVJlbW90ZURpc3BsYXk+IGxpc3RlbkZvclJlbW90ZURpc3BsYXkoY29uc3QgU3RyaW5nMTYgJm9wUGFja2FnZU5hbWUsCiAgICAgICAgICAgICBjb25zdCBzcDxJUmVtb3RlRGlzcGxheUNsaWVudD4mIGNsaWVudCwgY29uc3QgU3RyaW5nOCYgaWZhY2UpOwpAQCAtMzA3LDcgKzMxOCw3IEBACiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFZpZGVvU3VyZmFjZVRleHR1cmUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGJ1ZmZlclByb2R1Y2VyKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0QnVmZmVyaW5nU2V0dGluZ3MoY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MmIGJ1ZmZlcmluZykgb3ZlcnJpZGU7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldERlZmF1bHRCdWZmZXJpbmdTZXR0aW5ncygKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0QnVmZmVyaW5nU2V0dGluZ3MoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKSBvdmVycmlkZTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgcHJlcGFyZUFzeW5jKCk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHN0YXJ0KCk7CkBAIC0zMjUsNiArMzM2LDcgQEAKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0Q3VycmVudFBvc2l0aW9uKGludCogbXNlYyk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldER1cmF0aW9uKGludCogbXNlYyk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHJlc2V0KCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIG5vdGlmeUF0KGludDY0X3QgbWVkaWFUaW1lVXMpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRBdWRpb1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCB0eXBlKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0TG9vcGluZyhpbnQgbG9vcCk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFZvbHVtZShmbG9hdCBsZWZ0Vm9sdW1lLCBmbG9hdCByaWdodFZvbHVtZSk7CkBAIC0zNDEsMTAgKzM1MywxMCBAQAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBnZXRSZXRyYW5zbWl0RW5kcG9pbnQoc3RydWN0IHNvY2thZGRyX2luKiBlbmRwb2ludCk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldE5leHRQbGF5ZXIoY29uc3Qgc3A8SU1lZGlhUGxheWVyPiYgcGxheWVyKTsKIAotICAgICAgICB2aXJ0dWFsIFZvbHVtZVNoYXBlcjo6U3RhdHVzIGFwcGx5Vm9sdW1lU2hhcGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4mIGNvbmZpZ3VyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+JiBvcGVyYXRpb24pIG92ZXJyaWRlOwotICAgICAgICB2aXJ0dWFsIHNwPFZvbHVtZVNoYXBlcjo6U3RhdGU+IGdldFZvbHVtZVNoYXBlclN0YXRlKGludCBpZCkgb3ZlcnJpZGU7CisgICAgICAgIHZpcnR1YWwgbWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdHVzIGFwcGx5Vm9sdW1lU2hhcGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24+JiBjb25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4mIG9wZXJhdGlvbikgb3ZlcnJpZGU7CisgICAgICAgIHZpcnR1YWwgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdGU+IGdldFZvbHVtZVNoYXBlclN0YXRlKGludCBpZCkgb3ZlcnJpZGU7CiAKICAgICAgICAgc3A8TWVkaWFQbGF5ZXJCYXNlPiAgICAgY3JlYXRlUGxheWVyKHBsYXllcl90eXBlIHBsYXllclR5cGUpOwogCkBAIC0zNzIsNiArMzg0LDEwIEBACiAgICAgICAgIC8vIE1vZHVsYXIgRFJNCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZURybShjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBWZWN0b3I8dWludDhfdD4mIGRybVNlc3Npb25JZCk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZURybSgpOworICAgICAgICAvLyBBdWRpb1JvdXRpbmcKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Um91dGVkRGV2aWNlSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCogZGV2aWNlSWQpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKTsKIAogICAgIHByaXZhdGU6CiAgICAgICAgIGNsYXNzIFNlcnZpY2VEZWF0aE5vdGlmaWVyOgpAQCAtNDAxLDYgKzQxNywyMSBAQAogICAgICAgICAgICAgd3A8TWVkaWFQbGF5ZXJCYXNlPiBtTGlzdGVuZXI7CiAgICAgICAgIH07CiAKKyAgICAgICAgY2xhc3MgQXVkaW9EZXZpY2VVcGRhdGVkTm90aWZpZXI6IHB1YmxpYyBBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaworICAgICAgICB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIEF1ZGlvRGV2aWNlVXBkYXRlZE5vdGlmaWVyKGNvbnN0IHNwPE1lZGlhUGxheWVyQmFzZT4mIGxpc3RlbmVyKSB7CisgICAgICAgICAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB+QXVkaW9EZXZpY2VVcGRhdGVkTm90aWZpZXIoKSB7fQorCisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb0RldmljZVVwZGF0ZShhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCk7CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIHdwPE1lZGlhUGxheWVyQmFzZT4gbUxpc3RlbmVyOworICAgICAgICB9OworCiAgICAgICAgIHZvaWQgY2xlYXJEZWF0aE5vdGlmaWVyc19sKCk7CiAKICAgICAgICAgZnJpZW5kIGNsYXNzIE1lZGlhUGxheWVyU2VydmljZTsKQEAgLTQ3OSw2ICs1MTAsNyBAQAogCiAgICAgICAgIHNwPFNlcnZpY2VEZWF0aE5vdGlmaWVyPiBtRXh0cmFjdG9yRGVhdGhMaXN0ZW5lcjsKICAgICAgICAgc3A8U2VydmljZURlYXRoTm90aWZpZXI+IG1Db2RlY0RlYXRoTGlzdGVuZXI7CisgICAgICAgIHNwPEF1ZGlvRGV2aWNlVXBkYXRlZE5vdGlmaWVyPiBtQXVkaW9EZXZpY2VVcGRhdGVkTGlzdGVuZXI7CiAjaWYgQ0FMTEJBQ0tfQU5UQUdPTklaRVIKICAgICAgICAgICAgICAgICAgICAgQW50YWdvbml6ZXIqICAgICAgICAgICAgICAgICAgbUFudGFnb25pemVyOwogI2VuZGlmCkBAIC00OTMsNyArNTI1LDYgQEAKICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8IHdwPENsaWVudD4gPiAgbUNsaWVudHM7CiAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPCB3cDxNZWRpYVJlY29yZGVyQ2xpZW50PiA+IG1NZWRpYVJlY29yZGVyQ2xpZW50czsKICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgbU5leHRDb25uSWQ7Ci0gICAgICAgICAgICAgICAgc3A8SU9NWD4gICAgICAgICAgICAgICAgICAgIG1PTVg7CiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5jcHAKaW5kZXggOWI5YjNiYi4uNDIwNjY0NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcApAQCAtNDExLDYgKzQxMSwyNSBAQAogICAgIH0KIH0KIAorTWVkaWFSZWNvcmRlckNsaWVudDo6QXVkaW9EZXZpY2VVcGRhdGVkTm90aWZpZXI6OkF1ZGlvRGV2aWNlVXBkYXRlZE5vdGlmaWVyKAorICAgICAgICBjb25zdCBzcDxJTWVkaWFSZWNvcmRlckNsaWVudD4mIGxpc3RlbmVyKSB7CisgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7Cit9CisKK01lZGlhUmVjb3JkZXJDbGllbnQ6OkF1ZGlvRGV2aWNlVXBkYXRlZE5vdGlmaWVyOjp+QXVkaW9EZXZpY2VVcGRhdGVkTm90aWZpZXIoKSB7Cit9CisKK3ZvaWQgTWVkaWFSZWNvcmRlckNsaWVudDo6QXVkaW9EZXZpY2VVcGRhdGVkTm90aWZpZXI6Om9uQXVkaW9EZXZpY2VVcGRhdGUoCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8sCisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpIHsKKyAgICBzcDxJTWVkaWFSZWNvcmRlckNsaWVudD4gbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOworICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKSB7CisgICAgICAgIGxpc3RlbmVyLT5ub3RpZnkoTUVESUFfUkVDT1JERVJfQVVESU9fUk9VVElOR19DSEFOR0VELCBhdWRpb0lvLCBkZXZpY2VJZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1coImxpc3RlbmVyIGZvciBwcm9jZXNzICVkIGRlYXRoIGlzIGdvbmUiLCBNRURJQV9SRUNPUkRFUl9BVURJT19ST1VUSU5HX0NIQU5HRUQpOworICAgIH0KK30KKwogdm9pZCBNZWRpYVJlY29yZGVyQ2xpZW50OjpjbGVhckRlYXRoTm90aWZpZXJzX2woKSB7CiAgICAgaWYgKG1DYW1lcmFEZWF0aExpc3RlbmVyICE9IG51bGxwdHIpIHsKICAgICAgICAgbUNhbWVyYURlYXRoTGlzdGVuZXItPnVubGlua1RvRGVhdGgoKTsKQEAgLTQ1MCwyNyArNDY5LDE3IEBACiAgICAgfQogICAgIHNDYW1lcmFDaGVja2VkID0gdHJ1ZTsKIAotICAgIGlmIChwcm9wZXJ0eV9nZXRfYm9vbCgicGVyc2lzdC5tZWRpYS50cmVibGVfb214IiwgdHJ1ZSkpIHsKLSAgICAgICAgLy8gVHJlYmxlIElPbXgKLSAgICAgICAgc3A8SU9teD4gb214ID0gSU9teDo6Z2V0U2VydmljZSgpOwotICAgICAgICBpZiAob214ID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIEFMT0dFKCJUcmVibGUgSU9teCBub3QgYXZhaWxhYmxlIik7Ci0gICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICAgICAgfQotICAgICAgICBtQ29kZWNEZWF0aExpc3RlbmVyID0gbmV3IFNlcnZpY2VEZWF0aE5vdGlmaWVyKG9teCwgbGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpNRURJQUNPREVDX1BST0NFU1NfREVBVEgpOwotICAgICAgICBvbXgtPmxpbmtUb0RlYXRoKG1Db2RlY0RlYXRoTGlzdGVuZXIsIDApOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIExlZ2FjeSBJT01YCi0gICAgICAgIGJpbmRlciA9IHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5jb2RlYyIpKTsKLSAgICAgICAgaWYgKGJpbmRlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gY29ubmVjdCB0byBtZWRpYSBjb2RlYyBzZXJ2aWNlIik7Ci0gICAgICAgICAgIHJldHVybiBOT19JTklUOwotICAgICAgICB9Ci0gICAgICAgIG1Db2RlY0RlYXRoTGlzdGVuZXIgPSBuZXcgU2VydmljZURlYXRoTm90aWZpZXIoYmluZGVyLCBsaXN0ZW5lciwKLSAgICAgICAgICAgICAgICBNZWRpYVBsYXllclNlcnZpY2U6Ok1FRElBQ09ERUNfUFJPQ0VTU19ERUFUSCk7Ci0gICAgICAgIGJpbmRlci0+bGlua1RvRGVhdGgobUNvZGVjRGVhdGhMaXN0ZW5lcik7CisgICAgc3A8SU9teD4gb214ID0gSU9teDo6Z2V0U2VydmljZSgpOworICAgIGlmIChvbXggPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSU9teCBzZXJ2aWNlIGlzIG5vdCBhdmFpbGFibGUiKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQorICAgIG1Db2RlY0RlYXRoTGlzdGVuZXIgPSBuZXcgU2VydmljZURlYXRoTm90aWZpZXIob214LCBsaXN0ZW5lciwKKyAgICAgICAgICAgIE1lZGlhUGxheWVyU2VydmljZTo6TUVESUFDT0RFQ19QUk9DRVNTX0RFQVRIKTsKKyAgICBvbXgtPmxpbmtUb0RlYXRoKG1Db2RlY0RlYXRoTGlzdGVuZXIsIDApOworCisgICAgbUF1ZGlvRGV2aWNlVXBkYXRlZE5vdGlmaWVyID0gbmV3IEF1ZGlvRGV2aWNlVXBkYXRlZE5vdGlmaWVyKGxpc3RlbmVyKTsKKyAgICBtUmVjb3JkZXItPnNldEF1ZGlvRGV2aWNlQ2FsbGJhY2sobUF1ZGlvRGV2aWNlVXBkYXRlZE5vdGlmaWVyKTsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTQ5Miw0ICs1MDEsNDAgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IE1lZGlhUmVjb3JkZXJDbGllbnQ6OnNldElucHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpIHsKKyAgICBBTE9HVigic2V0SW5wdXREZXZpY2UoJWQpIiwgZGV2aWNlSWQpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobVJlY29yZGVyICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIG1SZWNvcmRlci0+c2V0SW5wdXREZXZpY2UoZGV2aWNlSWQpOworICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKK30KKworc3RhdHVzX3QgTWVkaWFSZWNvcmRlckNsaWVudDo6Z2V0Um91dGVkRGV2aWNlSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCogZGV2aWNlSWQpIHsKKyAgICBBTE9HVigiZ2V0Um91dGVkRGV2aWNlSWQiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKG1SZWNvcmRlciAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiBtUmVjb3JkZXItPmdldFJvdXRlZERldmljZUlkKGRldmljZUlkKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0lOSVQ7Cit9CisKK3N0YXR1c190IE1lZGlhUmVjb3JkZXJDbGllbnQ6OmVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKSB7CisgICAgQUxPR1YoImVuYWJsZURldmljZUNhbGxiYWNrOiAlZCIsIGVuYWJsZWQpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobVJlY29yZGVyICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIG1SZWNvcmRlci0+ZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhlbmFibGVkKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0lOSVQ7Cit9CisKK3N0YXR1c190IE1lZGlhUmVjb3JkZXJDbGllbnQ6OmdldEFjdGl2ZU1pY3JvcGhvbmVzKAorICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBhY3RpdmVNaWNyb3Bob25lcykgeworICAgIEFMT0dWKCJnZXRBY3RpdmVNaWNyb3Bob25lcyIpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobVJlY29yZGVyICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIG1SZWNvcmRlci0+Z2V0QWN0aXZlTWljcm9waG9uZXMoYWN0aXZlTWljcm9waG9uZXMpOworICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKK30KIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuaAppbmRleCA3MTFkYjJjLi5kMmU2ODFmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmgKQEAgLTE4LDYgKzE4LDcgQEAKICNpZm5kZWYgQU5EUk9JRF9NRURJQVJFQ09SREVSQ0xJRU5UX0gKICNkZWZpbmUgQU5EUk9JRF9NRURJQVJFQ09SREVSQ0xJRU5UX0gKIAorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUmVjb3JkZXIuaD4KIAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214Lmg+CkBAIC01OCw2ICs1OSwxOCBAQAogICAgICAgICB3cDxJTWVkaWFSZWNvcmRlckNsaWVudD4gbUxpc3RlbmVyOwogICAgIH07CiAKKyAgICBjbGFzcyBBdWRpb0RldmljZVVwZGF0ZWROb3RpZmllcjogcHVibGljIEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgICAgQXVkaW9EZXZpY2VVcGRhdGVkTm90aWZpZXIoY29uc3Qgc3A8SU1lZGlhUmVjb3JkZXJDbGllbnQ+JiBsaXN0ZW5lcik7CisgICAgICAgIHZpcnR1YWwgfkF1ZGlvRGV2aWNlVXBkYXRlZE5vdGlmaWVyKCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvRGV2aWNlVXBkYXRlKAorICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8sCisgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCk7CisgICAgcHJpdmF0ZToKKyAgICAgICAgd3A8SU1lZGlhUmVjb3JkZXJDbGllbnQ+IG1MaXN0ZW5lcjsKKyAgICB9OworCiAgICAgdm9pZCBjbGVhckRlYXRoTm90aWZpZXJzX2woKTsKIAogcHVibGljOgpAQCAtOTEsNiArMTA0LDExIEBACiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICBzZXRJbnB1dFN1cmZhY2UoY29uc3Qgc3A8UGVyc2lzdGVudFN1cmZhY2U+JiBzdXJmYWNlKTsKICAgICB2aXJ0dWFsICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBxdWVyeVN1cmZhY2VNZWRpYVNvdXJjZSgpOworICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgc2V0SW5wdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCk7CisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICBnZXRSb3V0ZWREZXZpY2VJZChhdWRpb19wb3J0X2hhbmRsZV90KiBkZXZpY2VJZCk7CisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICBlbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCk7CisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICBnZXRBY3RpdmVNaWNyb3Bob25lcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKTsKIAogcHJpdmF0ZToKICAgICBmcmllbmQgY2xhc3MgICAgICAgICAgIE1lZGlhUGxheWVyU2VydmljZTsgIC8vIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSBjb25zdHJ1Y3RvcgpAQCAtMTAzLDYgKzEyMSw3IEBACiAKICAgICBzcDxTZXJ2aWNlRGVhdGhOb3RpZmllcj4gbUNhbWVyYURlYXRoTGlzdGVuZXI7CiAgICAgc3A8U2VydmljZURlYXRoTm90aWZpZXI+IG1Db2RlY0RlYXRoTGlzdGVuZXI7CisgICAgc3A8QXVkaW9EZXZpY2VVcGRhdGVkTm90aWZpZXI+IG1BdWRpb0RldmljZVVwZGF0ZWROb3RpZmllcjsKIAogICAgIHBpZF90ICAgICAgICAgICAgICAgICAgbVBpZDsKICAgICBNdXRleCAgICAgICAgICAgICAgICAgIG1Mb2NrOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZXRhZGF0YVJldHJpZXZlckNsaWVudC5jcHAKaW5kZXggNWE0NjhmMy4uNDBiMTdiZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuY3BwCkBAIC0zMSwxMCArMzEsMTEgQEAKICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFNZXRhZGF0YVJldHJpZXZlckludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ludGVyZmFjZVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL1ZpZGVvRnJhbWUuaD4KICNpbmNsdWRlICJNZXRhZGF0YVJldHJpZXZlckNsaWVudC5oIgpAQCAtNDcsNyArNDgsNiBAQAogewogICAgIEFMT0dWKCJNZXRhZGF0YVJldHJpZXZlckNsaWVudCBjb25zdHJ1Y3RvciBwaWQoJWQpIiwgcGlkKTsKICAgICBtUGlkID0gcGlkOwotICAgIG1UaHVtYm5haWwgPSBOVUxMOwogICAgIG1BbGJ1bUFydCA9IE5VTEw7CiAgICAgbVJldHJpZXZlciA9IE5VTEw7CiB9CkBAIC03Niw3ICs3Niw2IEBACiAgICAgQUxPR1YoImRpc2Nvbm5lY3QgZnJvbSBwaWQgJWQiLCBtUGlkKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgbVJldHJpZXZlci5jbGVhcigpOwotICAgIG1UaHVtYm5haWwuY2xlYXIoKTsKICAgICBtQWxidW1BcnQuY2xlYXIoKTsKICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CiB9CkBAIC0xODAsNyArMTc5LDcgQEAKICAgICBBTE9HVigic2V0RGF0YVNvdXJjZShJRGF0YVNvdXJjZSkiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAKLSAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbUlEYXRhU291cmNlKHNvdXJjZSk7CisgICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSA9IENyZWF0ZURhdGFTb3VyY2VGcm9tSURhdGFTb3VyY2Uoc291cmNlKTsKICAgICBwbGF5ZXJfdHlwZSBwbGF5ZXJUeXBlID0KICAgICAgICAgTWVkaWFQbGF5ZXJGYWN0b3J5OjpnZXRQbGF5ZXJUeXBlKE5VTEwgLyogY2xpZW50ICovLCBkYXRhU291cmNlKTsKICAgICBBTE9HVigicGxheWVyIHR5cGUgPSAlZCIsIHBsYXllclR5cGUpOwpAQCAtMjAwLDM0ICsxOTksNzQgQEAKICAgICAgICAgICAgIChsb25nIGxvbmcpdGltZVVzLCBvcHRpb24sIGNvbG9yRm9ybWF0LCBtZXRhT25seSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIE11dGV4OjpBdXRvbG9jayBnbG9jayhzTG9jayk7Ci0gICAgbVRodW1ibmFpbC5jbGVhcigpOwogICAgIGlmIChtUmV0cmlldmVyID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoInJldHJpZXZlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIFZpZGVvRnJhbWUgKmZyYW1lID0gbVJldHJpZXZlci0+Z2V0RnJhbWVBdFRpbWUoCi0gICAgICAgICAgICB0aW1lVXMsIG9wdGlvbiwgY29sb3JGb3JtYXQsIG1ldGFPbmx5KTsKKyAgICBzcDxJTWVtb3J5PiBmcmFtZSA9IG1SZXRyaWV2ZXItPmdldEZyYW1lQXRUaW1lKHRpbWVVcywgb3B0aW9uLCBjb2xvckZvcm1hdCwgbWV0YU9ubHkpOwogICAgIGlmIChmcmFtZSA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gY2FwdHVyZSBhIHZpZGVvIGZyYW1lIik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBzaXplX3Qgc2l6ZSA9IGZyYW1lLT5nZXRGbGF0dGVuZWRTaXplKCk7Ci0gICAgc3A8TWVtb3J5SGVhcEJhc2U+IGhlYXAgPSBuZXcgTWVtb3J5SGVhcEJhc2Uoc2l6ZSwgMCwgIk1ldGFkYXRhUmV0cmlldmVyQ2xpZW50Iik7Ci0gICAgaWYgKGhlYXAgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGNyZWF0ZSBNZW1vcnlEZWFsZXIiKTsKLSAgICAgICAgZGVsZXRlIGZyYW1lOworICAgIHJldHVybiBmcmFtZTsKK30KKworc3A8SU1lbW9yeT4gTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQ6OmdldEltYWdlQXRJbmRleCgKKyAgICAgICAgaW50IGluZGV4LCBpbnQgY29sb3JGb3JtYXQsIGJvb2wgbWV0YU9ubHksIGJvb2wgdGh1bWJuYWlsKSB7CisgICAgQUxPR1YoImdldEltYWdlQXRJbmRleDogaW5kZXgoJWQpIGNvbG9yRm9ybWF0KCVkKSwgbWV0YU9ubHkoJWQpIHRodW1ibmFpbCglZCkiLAorICAgICAgICAgICAgaW5kZXgsIGNvbG9yRm9ybWF0LCBtZXRhT25seSwgdGh1bWJuYWlsKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGdsb2NrKHNMb2NrKTsKKyAgICBpZiAobVJldHJpZXZlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJyZXRyaWV2ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBtVGh1bWJuYWlsID0gbmV3IE1lbW9yeUJhc2UoaGVhcCwgMCwgc2l6ZSk7Ci0gICAgaWYgKG1UaHVtYm5haWwgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgibm90IGVub3VnaCBtZW1vcnkgZm9yIFZpZGVvRnJhbWUgc2l6ZT0lenUiLCBzaXplKTsKLSAgICAgICAgZGVsZXRlIGZyYW1lOworICAgIHNwPElNZW1vcnk+IGZyYW1lID0gbVJldHJpZXZlci0+Z2V0SW1hZ2VBdEluZGV4KGluZGV4LCBjb2xvckZvcm1hdCwgbWV0YU9ubHksIHRodW1ibmFpbCk7CisgICAgaWYgKGZyYW1lID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byBleHRyYWN0IGltYWdlIik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBWaWRlb0ZyYW1lICpmcmFtZUNvcHkgPSBzdGF0aWNfY2FzdDxWaWRlb0ZyYW1lICo+KG1UaHVtYm5haWwtPnBvaW50ZXIoKSk7Ci0gICAgZnJhbWVDb3B5LT5jb3B5RmxhdHRlbmVkKCpmcmFtZSk7Ci0gICAgZGVsZXRlIGZyYW1lOyAgLy8gRml4IG1lbW9yeSBsZWFrYWdlCi0gICAgcmV0dXJuIG1UaHVtYm5haWw7CisgICAgcmV0dXJuIGZyYW1lOworfQorCitzcDxJTWVtb3J5PiBNZXRhZGF0YVJldHJpZXZlckNsaWVudDo6Z2V0SW1hZ2VSZWN0QXRJbmRleCgKKyAgICAgICAgaW50IGluZGV4LCBpbnQgY29sb3JGb3JtYXQsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20pIHsKKyAgICBBTE9HVigiZ2V0SW1hZ2VSZWN0QXRJbmRleDogaW5kZXgoJWQpIGNvbG9yRm9ybWF0KCVkKSwgcmVjdCB7JWQsICVkLCAlZCwgJWR9IiwKKyAgICAgICAgICAgIGluZGV4LCBjb2xvckZvcm1hdCwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGdsb2NrKHNMb2NrKTsKKyAgICBpZiAobVJldHJpZXZlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJyZXRyaWV2ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzcDxJTWVtb3J5PiBmcmFtZSA9IG1SZXRyaWV2ZXItPmdldEltYWdlUmVjdEF0SW5kZXgoCisgICAgICAgICAgICBpbmRleCwgY29sb3JGb3JtYXQsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisgICAgaWYgKGZyYW1lID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byBleHRyYWN0IGltYWdlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gZnJhbWU7Cit9CisKK3N0YXR1c190IE1ldGFkYXRhUmV0cmlldmVyQ2xpZW50OjpnZXRGcmFtZUF0SW5kZXgoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzcDxJTWVtb3J5PiA+ICpmcmFtZXMsCisgICAgICAgICAgICBpbnQgZnJhbWVJbmRleCwgaW50IG51bUZyYW1lcywgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5KSB7CisgICAgQUxPR1YoImdldEZyYW1lQXRJbmRleDogZnJhbWVJbmRleCglZCksIG51bUZyYW1lcyglZCksIGNvbG9yRm9ybWF0KCVkKSwgbWV0YU9ubHkoJWQpIiwKKyAgICAgICAgICAgIGZyYW1lSW5kZXgsIG51bUZyYW1lcywgY29sb3JGb3JtYXQsIG1ldGFPbmx5KTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGdsb2NrKHNMb2NrKTsKKyAgICBpZiAobVJldHJpZXZlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJyZXRyaWV2ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBtUmV0cmlldmVyLT5nZXRGcmFtZUF0SW5kZXgoCisgICAgICAgICAgICBmcmFtZXMsIGZyYW1lSW5kZXgsIG51bUZyYW1lcywgY29sb3JGb3JtYXQsIG1ldGFPbmx5KTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIGZyYW1lcy0+Y2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgcmV0dXJuIE9LOwogfQogCiBzcDxJTWVtb3J5PiBNZXRhZGF0YVJldHJpZXZlckNsaWVudDo6ZXh0cmFjdEFsYnVtQXJ0KCkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZXRhZGF0YVJldHJpZXZlckNsaWVudC5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmgKaW5kZXggYzc4Y2Q0Yi4uMjcyZDA5MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmgKQEAgLTUyLDYgKzUyLDEzIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgICAgICBzZXREYXRhU291cmNlKGNvbnN0IHNwPElEYXRhU291cmNlPiYgc291cmNlLCBjb25zdCBjaGFyICptaW1lKTsKICAgICB2aXJ0dWFsIHNwPElNZW1vcnk+ICAgICAgICAgICAgIGdldEZyYW1lQXRUaW1lKAogICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMsIGludCBvcHRpb24sIGludCBjb2xvckZvcm1hdCwgYm9vbCBtZXRhT25seSk7CisgICAgdmlydHVhbCBzcDxJTWVtb3J5PiAgICAgICAgICAgICBnZXRJbWFnZUF0SW5kZXgoCisgICAgICAgICAgICBpbnQgaW5kZXgsIGludCBjb2xvckZvcm1hdCwgYm9vbCBtZXRhT25seSwgYm9vbCB0aHVtYm5haWwpOworICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gICAgICAgICAgICAgZ2V0SW1hZ2VSZWN0QXRJbmRleCgKKyAgICAgICAgICAgIGludCBpbmRleCwgaW50IGNvbG9yRm9ybWF0LCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lQXRJbmRleCgKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzcDxJTWVtb3J5PiA+ICpmcmFtZXMsCisgICAgICAgICAgICAgICAgaW50IGZyYW1lSW5kZXgsIGludCBudW1GcmFtZXMsIGludCBjb2xvckZvcm1hdCwgYm9vbCBtZXRhT25seSk7CiAgICAgdmlydHVhbCBzcDxJTWVtb3J5PiAgICAgICAgICAgICBleHRyYWN0QWxidW1BcnQoKTsKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqICAgICAgICAgICAgIGV4dHJhY3RNZXRhZGF0YShpbnQga2V5Q29kZSk7CiAKQEAgLTY4LDkgKzc1LDggQEAKICAgICBzcDxNZWRpYU1ldGFkYXRhUmV0cmlldmVyQmFzZT4gICAgICAgICBtUmV0cmlldmVyOwogICAgIHBpZF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QaWQ7CiAKLSAgICAvLyBLZWVwIHRoZSBzaGFyZWQgbWVtb3J5IGNvcHkgb2YgYWxidW0gYXJ0IGFuZCBjYXB0dXJlIGZyYW1lIChmb3IgdGh1bWJuYWlsKQorICAgIC8vIEtlZXAgdGhlIHNoYXJlZCBtZW1vcnkgY29weSBvZiBhbGJ1bSBhcnQKICAgICBzcDxJTWVtb3J5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWxidW1BcnQ7Ci0gICAgc3A8SU1lbW9yeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRodW1ibmFpbDsKIH07CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvUmVtb3RlRGlzcGxheS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvUmVtb3RlRGlzcGxheS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYjRiNWQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1JlbW90ZURpc3BsYXkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDEyLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIlJlbW90ZURpc3BsYXkuaCIKLQotI2luY2x1ZGUgInNvdXJjZS9XaWZpRGlzcGxheVNvdXJjZS5oIgotCi0jaW5jbHVkZSA8bWVkaWEvSVJlbW90ZURpc3BsYXlDbGllbnQuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FOZXR3b3JrU2Vzc2lvbi5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLVJlbW90ZURpc3BsYXk6OlJlbW90ZURpc3BsYXkoCi0gICAgICAgIGNvbnN0IFN0cmluZzE2ICZvcFBhY2thZ2VOYW1lLAotICAgICAgICBjb25zdCBzcDxJUmVtb3RlRGlzcGxheUNsaWVudD4gJmNsaWVudCwKLSAgICAgICAgY29uc3QgY2hhciAqaWZhY2UpCi0gICAgOiBtTG9vcGVyKG5ldyBBTG9vcGVyKSwKLSAgICAgIG1OZXRTZXNzaW9uKG5ldyBBTmV0d29ya1Nlc3Npb24pIHsKLSAgICBtTG9vcGVyLT5zZXROYW1lKCJ3ZmRfbG9vcGVyIik7Ci0KLSAgICBtU291cmNlID0gbmV3IFdpZmlEaXNwbGF5U291cmNlKG9wUGFja2FnZU5hbWUsIG1OZXRTZXNzaW9uLCBjbGllbnQpOwotICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcihtU291cmNlKTsKLQotICAgIG1OZXRTZXNzaW9uLT5zdGFydCgpOwotICAgIG1Mb29wZXItPnN0YXJ0KCk7Ci0KLSAgICBtU291cmNlLT5zdGFydChpZmFjZSk7Ci19Ci0KLVJlbW90ZURpc3BsYXk6On5SZW1vdGVEaXNwbGF5KCkgewotfQotCi1zdGF0dXNfdCBSZW1vdGVEaXNwbGF5OjpwYXVzZSgpIHsKLSAgICByZXR1cm4gbVNvdXJjZS0+cGF1c2UoKTsKLX0KLQotc3RhdHVzX3QgUmVtb3RlRGlzcGxheTo6cmVzdW1lKCkgewotICAgIHJldHVybiBtU291cmNlLT5yZXN1bWUoKTsKLX0KLQotc3RhdHVzX3QgUmVtb3RlRGlzcGxheTo6ZGlzcG9zZSgpIHsKLSAgICBtU291cmNlLT5zdG9wKCk7Ci0gICAgbVNvdXJjZS5jbGVhcigpOwotCi0gICAgbUxvb3Blci0+c3RvcCgpOwotICAgIG1OZXRTZXNzaW9uLT5zdG9wKCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvUmVtb3RlRGlzcGxheS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1JlbW90ZURpc3BsYXkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ1NzNlOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvUmVtb3RlRGlzcGxheS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDEyLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBSRU1PVEVfRElTUExBWV9IXwotCi0jZGVmaW5lIFJFTU9URV9ESVNQTEFZX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSVJlbW90ZURpc3BsYXkuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBBTG9vcGVyOwotc3RydWN0IEFOZXR3b3JrU2Vzc2lvbjsKLWNsYXNzIElSZW1vdGVEaXNwbGF5Q2xpZW50Owotc3RydWN0IFdpZmlEaXNwbGF5U291cmNlOwotCi1zdHJ1Y3QgUmVtb3RlRGlzcGxheSA6IHB1YmxpYyBCblJlbW90ZURpc3BsYXkgewotICAgIFJlbW90ZURpc3BsYXkoCi0gICAgICAgICAgICBjb25zdCBTdHJpbmcxNiAmb3BQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgIGNvbnN0IHNwPElSZW1vdGVEaXNwbGF5Q2xpZW50PiAmY2xpZW50LAotICAgICAgICAgICAgY29uc3QgY2hhciAqaWZhY2UpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdW1lKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBkaXNwb3NlKCk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5SZW1vdGVEaXNwbGF5KCk7Ci0KLXByaXZhdGU6Ci0gICAgc3A8QUxvb3Blcj4gbU5ldExvb3BlcjsKLSAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOwotICAgIHNwPEFOZXR3b3JrU2Vzc2lvbj4gbU5ldFNlc3Npb247Ci0gICAgc3A8V2lmaURpc3BsYXlTb3VyY2U+IG1Tb3VyY2U7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhSZW1vdGVEaXNwbGF5KTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gUkVNT1RFX0RJU1BMQVlfSF8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwCmluZGV4IDg5MzU0ZDYuLjMwYzBiMWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAKQEAgLTY5LDIyICs2OSwzMyBAQAogLy8ga2V5IGZvciBtZWRpYSBzdGF0aXN0aWNzCiBzdGF0aWMgY29uc3QgY2hhciAqa0tleVJlY29yZGVyID0gInJlY29yZGVyIjsKIC8vIGF0dHJzIGZvciBtZWRpYSBzdGF0aXN0aWNzCi1zdGF0aWMgY29uc3QgY2hhciAqa1JlY29yZGVySGVpZ2h0ID0gImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci5oZWlnaHQiOwotc3RhdGljIGNvbnN0IGNoYXIgKmtSZWNvcmRlcldpZHRoID0gImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci53aWR0aCI7Ci1zdGF0aWMgY29uc3QgY2hhciAqa1JlY29yZGVyRnJhbWVSYXRlID0gImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci5mcmFtZS1yYXRlIjsKLXN0YXRpYyBjb25zdCBjaGFyICprUmVjb3JkZXJWaWRlb0JpdHJhdGUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLnZpZGVvLWJpdHJhdGUiOwotc3RhdGljIGNvbnN0IGNoYXIgKmtSZWNvcmRlckF1ZGlvU2FtcGxlUmF0ZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIuYXVkaW8tc2FtcGxlcmF0ZSI7Ci1zdGF0aWMgY29uc3QgY2hhciAqa1JlY29yZGVyQXVkaW9DaGFubmVscyA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIuYXVkaW8tY2hhbm5lbHMiOworLy8gTkI6IHRoZXNlIGFyZSBtYXRjaGVkIHdpdGggcHVibGljIEphdmEgQVBJIGNvbnN0YW50cyBkZWZpbmVkCisvLyBpbiBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhUmVjb3JkZXIuamF2YQorLy8gVGhlc2UgbXVzdCBiZSBrZXB0IHN5bmNocm9uaXplZCB3aXRoIHRoZSBjb25zdGFudHMgdGhlcmUuCiBzdGF0aWMgY29uc3QgY2hhciAqa1JlY29yZGVyQXVkaW9CaXRyYXRlID0gImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci5hdWRpby1iaXRyYXRlIjsKLXN0YXRpYyBjb25zdCBjaGFyICprUmVjb3JkZXJWaWRlb0lmcmFtZUludGVydmFsID0gImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci52aWRlby1pZnJhbWUtaW50ZXJ2YWwiOwotc3RhdGljIGNvbnN0IGNoYXIgKmtSZWNvcmRlck1vdmllVGltZXNjYWxlID0gImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci5tb3ZpZS10aW1lc2NhbGUiOworc3RhdGljIGNvbnN0IGNoYXIgKmtSZWNvcmRlckF1ZGlvQ2hhbm5lbHMgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLmF1ZGlvLWNoYW5uZWxzIjsKK3N0YXRpYyBjb25zdCBjaGFyICprUmVjb3JkZXJBdWRpb1NhbXBsZVJhdGUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLmF1ZGlvLXNhbXBsZXJhdGUiOwogc3RhdGljIGNvbnN0IGNoYXIgKmtSZWNvcmRlckF1ZGlvVGltZXNjYWxlID0gImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci5hdWRpby10aW1lc2NhbGUiOwotc3RhdGljIGNvbnN0IGNoYXIgKmtSZWNvcmRlclZpZGVvVGltZXNjYWxlID0gImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci52aWRlby10aW1lc2NhbGUiOwotc3RhdGljIGNvbnN0IGNoYXIgKmtSZWNvcmRlclZpZGVvUHJvZmlsZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIudmlkZW8tZW5jb2Rlci1wcm9maWxlIjsKLXN0YXRpYyBjb25zdCBjaGFyICprUmVjb3JkZXJWaWRlb0xldmVsID0gImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci52aWRlby1lbmNvZGVyLWxldmVsIjsKLXN0YXRpYyBjb25zdCBjaGFyICprUmVjb3JkZXJDYXB0dXJlRnBzRW5hYmxlID0gImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci5jYXB0dXJlLWZwc2VuYWJsZSI7CiBzdGF0aWMgY29uc3QgY2hhciAqa1JlY29yZGVyQ2FwdHVyZUZwcyA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIuY2FwdHVyZS1mcHMiOworc3RhdGljIGNvbnN0IGNoYXIgKmtSZWNvcmRlckNhcHR1cmVGcHNFbmFibGUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLmNhcHR1cmUtZnBzZW5hYmxlIjsKK3N0YXRpYyBjb25zdCBjaGFyICprUmVjb3JkZXJGcmFtZVJhdGUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLmZyYW1lLXJhdGUiOworc3RhdGljIGNvbnN0IGNoYXIgKmtSZWNvcmRlckhlaWdodCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIuaGVpZ2h0IjsKK3N0YXRpYyBjb25zdCBjaGFyICprUmVjb3JkZXJNb3ZpZVRpbWVzY2FsZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIubW92aWUtdGltZXNjYWxlIjsKIHN0YXRpYyBjb25zdCBjaGFyICprUmVjb3JkZXJSb3RhdGlvbiA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIucm90YXRpb24iOworc3RhdGljIGNvbnN0IGNoYXIgKmtSZWNvcmRlclZpZGVvQml0cmF0ZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIudmlkZW8tYml0cmF0ZSI7CitzdGF0aWMgY29uc3QgY2hhciAqa1JlY29yZGVyVmlkZW9JZnJhbWVJbnRlcnZhbCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIudmlkZW8taWZyYW1lLWludGVydmFsIjsKK3N0YXRpYyBjb25zdCBjaGFyICprUmVjb3JkZXJWaWRlb0xldmVsID0gImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci52aWRlby1lbmNvZGVyLWxldmVsIjsKK3N0YXRpYyBjb25zdCBjaGFyICprUmVjb3JkZXJWaWRlb1Byb2ZpbGUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLnZpZGVvLWVuY29kZXItcHJvZmlsZSI7CitzdGF0aWMgY29uc3QgY2hhciAqa1JlY29yZGVyVmlkZW9UaW1lc2NhbGUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLnZpZGVvLXRpbWVzY2FsZSI7CitzdGF0aWMgY29uc3QgY2hhciAqa1JlY29yZGVyV2lkdGggPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLndpZHRoIjsKKworLy8gbmV3IGZpZWxkcywgbm90IHlldCBmcm96ZW4gaW4gdGhlIHB1YmxpYyBKYXZhIEFQSSBkZWZpbml0aW9ucworc3RhdGljIGNvbnN0IGNoYXIgKmtSZWNvcmRlckF1ZGlvTWltZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIuYXVkaW8ubWltZSI7CitzdGF0aWMgY29uc3QgY2hhciAqa1JlY29yZGVyVmlkZW9NaW1lID0gImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci52aWRlby5taW1lIjsKK3N0YXRpYyBjb25zdCBjaGFyICprUmVjb3JkZXJEdXJhdGlvbk1zID0gImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci5kdXJhdGlvbk1zIjsKK3N0YXRpYyBjb25zdCBjaGFyICprUmVjb3JkZXJQYXVzZWQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLnBhdXNlZE1zIjsKK3N0YXRpYyBjb25zdCBjaGFyICprUmVjb3JkZXJOdW1QYXVzZXMgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLk5QYXVzZXMiOworCiAKIC8vIFRvIGNvbGxlY3QgdGhlIGVuY29kZXIgdXNhZ2UgZm9yIHRoZSBiYXR0ZXJ5IGFwcAogc3RhdGljIHZvaWQgYWRkQmF0dGVyeURhdGEodWludDMyX3QgcGFyYW1zKSB7CkBAIC0xMDEsOSArMTEyLDExIEBACiAgICAgOiBNZWRpYVJlY29yZGVyQmFzZShvcFBhY2thZ2VOYW1lKSwKICAgICAgIG1Xcml0ZXIoTlVMTCksCiAgICAgICBtT3V0cHV0RmQoLTEpLAotICAgICAgbUF1ZGlvU291cmNlKEFVRElPX1NPVVJDRV9DTlQpLAorICAgICAgbUF1ZGlvU291cmNlKChhdWRpb19zb3VyY2VfdClBVURJT19TT1VSQ0VfQ05UKSwgLy8gaW5pdGlhbGl6ZSB3aXRoIGludmFsaWQgdmFsdWUKICAgICAgIG1WaWRlb1NvdXJjZShWSURFT19TT1VSQ0VfTElTVF9FTkQpLAotICAgICAgbVN0YXJ0ZWQoZmFsc2UpIHsKKyAgICAgIG1TdGFydGVkKGZhbHNlKSwKKyAgICAgIG1TZWxlY3RlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpLAorICAgICAgbURldmljZUNhbGxiYWNrRW5hYmxlZChmYWxzZSkgewogCiAgICAgQUxPR1YoIkNvbnN0cnVjdG9yIik7CiAKQEAgLTEyMCwyMiArMTMzLDE4IEBACiAgICAgfQogCiAgICAgLy8gbG9nIHRoZSBjdXJyZW50IHJlY29yZCwgcHJvdmlkZWQgaXQgaGFzIHNvbWUgaW5mb3JtYXRpb24gd29ydGggcmVjb3JkaW5nCi0gICAgaWYgKG1BbmFseXRpY3NEaXJ0eSAmJiBtQW5hbHl0aWNzSXRlbSAhPSBOVUxMKSB7Ci0gICAgICAgIHVwZGF0ZU1ldHJpY3MoKTsKLSAgICAgICAgaWYgKG1BbmFseXRpY3NJdGVtLT5jb3VudCgpID4gMCkgewotICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEZpbmFsaXplZCh0cnVlKTsKLSAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZWxmcmVjb3JkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZGVsZXRlIG1BbmFseXRpY3NJdGVtOwotICAgICAgICBtQW5hbHl0aWNzSXRlbSA9IE5VTEw7Ci0gICAgfQorICAgIC8vIE5COiB0aGlzIGFsc28gcmVjbGFpbXMgJiBjbGVhcnMgbUFuYWx5dGljc0l0ZW0uCisgICAgZmx1c2hBbmRSZXNldE1ldHJpY3MoZmFsc2UpOwogfQogCiB2b2lkIFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnVwZGF0ZU1ldHJpY3MoKSB7CiAgICAgQUxPR1YoInVwZGF0ZU1ldHJpY3MiKTsKIAotICAgIC8vIHdlJ2xsIHBvcHVsYXRlIHRoZSB2YWx1ZXMgZnJvbSB0aGUgcmF3IGZpZWxkcy4KLSAgICAvLyAoTk9UIGdvaW5nIHRvIHBvcHVsYXRlIGFzIHdlIGdvIHRocm91Z2ggdGhlIHZhcmlvdXMgc2V0KiBvcHMpCisgICAgLy8gd2UgcnVuIGFzIHBhcnQgb2YgdGhlIG1lZGlhIHBsYXllciBzZXJ2aWNlOyB3aGF0IHdlIHJlYWxseSB3YW50IHRvCisgICAgLy8ga25vdyBpcyB0aGUgYXBwIHdoaWNoIHJlcXVlc3RlZCB0aGUgcmVjb3JkaW5nLgorICAgIG1BbmFseXRpY3NJdGVtLT5zZXRVaWQobUNsaWVudFVpZCk7CisKKyAgICAvLyBwb3B1bGF0ZSB0aGUgdmFsdWVzIGZyb20gdGhlIHJhdyBmaWVsZHMuCiAKICAgICAvLyBUQkQgbU91dHB1dEZvcm1hdCAgPSBPVVRQVVRfRk9STUFUX1RIUkVFX0dQUDsKICAgICAvLyBUQkQgbUF1ZGlvRW5jb2RlciAgPSBBVURJT19FTkNPREVSX0FNUl9OQjsKQEAgLTE2Myw3ICsxNzIsNiBAQAogICAgIC8vIFRCRCBtVHJhY2tFdmVyeVRpbWVEdXJhdGlvblVzID0gMDsKICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa1JlY29yZGVyQ2FwdHVyZUZwc0VuYWJsZSwgbUNhcHR1cmVGcHNFbmFibGUpOwogICAgIG1BbmFseXRpY3NJdGVtLT5zZXREb3VibGUoa1JlY29yZGVyQ2FwdHVyZUZwcywgbUNhcHR1cmVGcHMpOwotICAgIC8vIFRCRCBtQ2FwdHVyZUZwcyA9IC0xLjA7CiAgICAgLy8gVEJEIG1DYW1lcmFTb3VyY2VUaW1lTGFwc2UgPSBOVUxMOwogICAgIC8vIFRCRCBtTWV0YURhdGFTdG9yZWRJblZpZGVvQnVmZmVycyA9IGtNZXRhZGF0YUJ1ZmZlclR5cGVJbnZhbGlkOwogICAgIC8vIFRCRCBtRW5jb2RlclByb2ZpbGVzID0gTWVkaWFQcm9maWxlczo6Z2V0SW5zdGFuY2UoKTsKQEAgLTE3MiwyNiArMTgwLDI5IEBACiAgICAgLy8gUElJIG1Mb25naXR1ZGV4MTAwMDAgPSAtMzYwMDAwMDsKICAgICAvLyBUQkQgbVRvdGFsQml0UmF0ZSA9IDA7CiAKLSAgICAvLyBUQkQ6IHNvbWUgZHVyYXRpb24gaW5mb3JtYXRpb24gKGNhcHR1cmUsIHBhdXNlZCkKLSAgICAvLwotCisgICAgLy8gZHVyYXRpb24gaW5mb3JtYXRpb24gKHJlY29yZGVkLCBwYXVzZWQsICMgb2YgcGF1c2VzKQorICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChrUmVjb3JkZXJEdXJhdGlvbk1zLCAobUR1cmF0aW9uUmVjb3JkZWRVcys1MDApLzEwMDAgKTsKKyAgICBpZiAobU5QYXVzZXMgIT0gMCkgeworICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50NjQoa1JlY29yZGVyUGF1c2VkLCAobUR1cmF0aW9uUGF1c2VkVXMrNTAwKS8xMDAwICk7CisgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrUmVjb3JkZXJOdW1QYXVzZXMsIG1OUGF1c2VzKTsKKyAgICB9CiB9CiAKLXZvaWQgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6cmVzZXRNZXRyaWNzKCkgewotICAgIEFMT0dWKCJyZXNldE1ldHJpY3MiKTsKLSAgICAvLyBmbHVzaCBhbnl0aGluZyB3ZSBoYXZlLCByZXN0YXJ0IHRoZSByZWNvcmQKK3ZvaWQgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6Zmx1c2hBbmRSZXNldE1ldHJpY3MoYm9vbCByZWluaXRpYWxpemUpIHsKKyAgICBBTE9HVigiZmx1c2hBbmRSZXNldE1ldHJpY3MiKTsKKyAgICAvLyBmbHVzaCBhbnl0aGluZyB3ZSBoYXZlLCBtYXliZSBzZXR1cCBhIG5ldyByZWNvcmQKICAgICBpZiAobUFuYWx5dGljc0RpcnR5ICYmIG1BbmFseXRpY3NJdGVtICE9IE5VTEwpIHsKICAgICAgICAgdXBkYXRlTWV0cmljcygpOwogICAgICAgICBpZiAobUFuYWx5dGljc0l0ZW0tPmNvdW50KCkgPiAwKSB7Ci0gICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0RmluYWxpemVkKHRydWUpOwogICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNlbGZyZWNvcmQoKTsKICAgICAgICAgfQogICAgICAgICBkZWxldGUgbUFuYWx5dGljc0l0ZW07CiAgICAgICAgIG1BbmFseXRpY3NJdGVtID0gTlVMTDsKICAgICB9Ci0gICAgbUFuYWx5dGljc0l0ZW0gPSBuZXcgTWVkaWFBbmFseXRpY3NJdGVtKGtLZXlSZWNvcmRlcik7Ci0gICAgKHZvaWQpIG1BbmFseXRpY3NJdGVtLT5nZW5lcmF0ZVNlc3Npb25JRCgpOwogICAgIG1BbmFseXRpY3NEaXJ0eSA9IGZhbHNlOworICAgIGlmIChyZWluaXRpYWxpemUpIHsKKyAgICAgICAgbUFuYWx5dGljc0l0ZW0gPSBuZXcgTWVkaWFBbmFseXRpY3NJdGVtKGtLZXlSZWNvcmRlcik7CisgICAgfQogfQogCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjppbml0KCkgewpAQCAtMjA0LDcgKzIxNSw3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi0vLyBUaGUgY2xpZW50IHNpZGUgb2YgbWVkaWFzZXJ2ZXIgYXNrcyBpdCB0byBjcmVhdCBhIFN1cmZhY2VNZWRpYVNvdXJjZQorLy8gVGhlIGNsaWVudCBzaWRlIG9mIG1lZGlhc2VydmVyIGFza3MgaXQgdG8gY3JlYXRlIGEgU3VyZmFjZU1lZGlhU291cmNlCiAvLyBhbmQgcmV0dXJuIGEgaW50ZXJmYWNlIHJlZmVyZW5jZS4gVGhlIGNsaWVudCBzaWRlIHdpbGwgdXNlIHRoYXQKIC8vIHdoaWxlIGVuY29kaW5nIEdMIEZyYW1lcwogc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gU3RhZ2VmcmlnaHRSZWNvcmRlcjo6cXVlcnlTdXJmYWNlTWVkaWFTb3VyY2UoKSBjb25zdCB7CkBAIC0xMDI3LDYgKzEwMzgsOCBAQAogICAgICAgICBtQW5hbHl0aWNzRGlydHkgPSB0cnVlOwogICAgICAgICBtU3RhcnRlZCA9IHRydWU7CiAKKyAgICAgICAgbVN0YXJ0ZWRSZWNvcmRpbmdVcyA9IHN5c3RlbVRpbWUoKSAvIDEwMDA7CisKICAgICAgICAgdWludDMyX3QgcGFyYW1zID0gSU1lZGlhUGxheWVyU2VydmljZTo6a0JhdHRlcnlEYXRhQ29kZWNTdGFydGVkOwogICAgICAgICBpZiAobUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9DTlQpIHsKICAgICAgICAgICAgIHBhcmFtcyB8PSBJTWVkaWFQbGF5ZXJTZXJ2aWNlOjprQmF0dGVyeURhdGFUcmFja0F1ZGlvOwpAQCAtMTA2OSw3ICsxMDgyLDggQEAKICAgICAgICAgICAgICAgICBtQXVkaW9DaGFubmVscywKICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICBtQ2xpZW50VWlkLAotICAgICAgICAgICAgICAgIG1DbGllbnRQaWQpOworICAgICAgICAgICAgICAgIG1DbGllbnRQaWQsCisgICAgICAgICAgICAgICAgbVNlbGVjdGVkRGV2aWNlSWQpOwogCiAgICAgc3RhdHVzX3QgZXJyID0gYXVkaW9Tb3VyY2UtPmluaXRDaGVjaygpOwogCkBAIC0xMTA1LDYgKzExMTksMTQgQEAKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAorICAgIC8vIGxvZyBhdWRpbyBtaW1lIHR5cGUgZm9yIG1lZGlhIG1ldHJpY3MKKyAgICBpZiAobUFuYWx5dGljc0l0ZW0gIT0gTlVMTCkgeworICAgICAgICBBU3RyaW5nIGF1ZGlvbWltZTsKKyAgICAgICAgaWYgKGZvcm1hdC0+ZmluZFN0cmluZygibWltZSIsICZhdWRpb21pbWUpKSB7CisgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrUmVjb3JkZXJBdWRpb01pbWUsIGF1ZGlvbWltZS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIGludDMyX3QgbWF4SW5wdXRTaXplOwogICAgIENIRUNLKGF1ZGlvU291cmNlLT5nZXRGb3JtYXQoKS0+ZmluZEludDMyKAogICAgICAgICAgICAgICAgIGtLZXlNYXhJbnB1dFNpemUsICZtYXhJbnB1dFNpemUpKTsKQEAgLTExMjAsNiArMTE0MiwxMCBAQAogCiAgICAgc3A8TWVkaWFDb2RlY1NvdXJjZT4gYXVkaW9FbmNvZGVyID0KICAgICAgICAgICAgIE1lZGlhQ29kZWNTb3VyY2U6OkNyZWF0ZShtTG9vcGVyLCBmb3JtYXQsIGF1ZGlvU291cmNlKTsKKyAgICBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtQXVkaW9EZXZpY2VDYWxsYmFjay5wcm9tb3RlKCk7CisgICAgaWYgKG1EZXZpY2VDYWxsYmFja0VuYWJsZWQgJiYgY2FsbGJhY2sgIT0gMCkgeworICAgICAgICBhdWRpb1NvdXJjZS0+YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhjYWxsYmFjayk7CisgICAgfQogICAgIG1BdWRpb1NvdXJjZU5vZGUgPSBhdWRpb1NvdXJjZTsKIAogICAgIGlmIChhdWRpb0VuY29kZXIgPT0gTlVMTCkgewpAQCAtMTY0Nyw2ICsxNjczLDE0IEBACiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKKyAgICAvLyBsb2cgdmlkZW8gbWltZSB0eXBlIGZvciBtZWRpYSBtZXRyaWNzCisgICAgaWYgKG1BbmFseXRpY3NJdGVtICE9IE5VTEwpIHsKKyAgICAgICAgQVN0cmluZyB2aWRlb21pbWU7CisgICAgICAgIGlmIChmb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmdmlkZW9taW1lKSkgeworICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoa1JlY29yZGVyVmlkZW9NaW1lLCB2aWRlb21pbWUuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBpZiAoY2FtZXJhU291cmNlICE9IE5VTEwpIHsKICAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBjYW1lcmFTb3VyY2UtPmdldEZvcm1hdCgpOwogCkBAIC0xOTA5LDYgKzE5NDMsMTMgQEAKICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKICAgICBtZXRhLT5zZXRJbnQ2NChrS2V5VGltZSwgbVBhdXNlU3RhcnRUaW1lVXMpOwogCisgICAgaWYgKG1TdGFydGVkUmVjb3JkaW5nVXMgIT0gMCkgeworICAgICAgICAvLyBzaG91bGQgYWx3YXlzIGJlIHRydWUKKyAgICAgICAgaW50NjRfdCByZWNvcmRpbmdVcyA9IG1QYXVzZVN0YXJ0VGltZVVzIC0gbVN0YXJ0ZWRSZWNvcmRpbmdVczsKKyAgICAgICAgbUR1cmF0aW9uUmVjb3JkZWRVcyArPSByZWNvcmRpbmdVczsKKyAgICAgICAgbVN0YXJ0ZWRSZWNvcmRpbmdVcyA9IDA7CisgICAgfQorCiAgICAgaWYgKG1BdWRpb0VuY29kZXJTb3VyY2UgIT0gTlVMTCkgewogICAgICAgICBtQXVkaW9FbmNvZGVyU291cmNlLT5wYXVzZSgpOwogICAgIH0KQEAgLTE5NjcsNiArMjAwOCwxNiBAQAogICAgICAgICBzb3VyY2UtPnNldElucHV0QnVmZmVyVGltZU9mZnNldCgoaW50NjRfdCl0aW1lT2Zmc2V0KTsKICAgICAgICAgc291cmNlLT5zdGFydChtZXRhLmdldCgpKTsKICAgICB9CisKKworICAgIC8vIHN1bSBpbmZvIG9uIHBhdXNlIGR1cmF0aW9uCisgICAgLy8gKGlnbm9yZSB0aGUgMzBtc2VjIG9mIG92ZXJsYXAgYWRqdXN0bWVudCBmYWN0b3JlZCBpbnRvIG1Ub3RhbFBhdXNlZER1cmF0aW9uVXMpCisgICAgaW50NjRfdCBwYXVzZWRVcyA9IHJlc3VtZVN0YXJ0VGltZVVzIC0gbVBhdXNlU3RhcnRUaW1lVXM7CisgICAgbUR1cmF0aW9uUGF1c2VkVXMgKz0gcGF1c2VkVXM7CisgICAgbU5QYXVzZXMrKzsKKyAgICAvLyBhbmQgYSB0aW1lc3RhbXAgbWFya2luZyB0aGF0IHdlJ3JlIGJhY2sgdG8gcmVjb3JkaW5nLi4uLgorICAgIG1TdGFydGVkUmVjb3JkaW5nVXMgPSByZXN1bWVTdGFydFRpbWVVczsKKwogICAgIG1QYXVzZVN0YXJ0VGltZVVzID0gMDsKIAogICAgIHJldHVybiBPSzsKQEAgLTE5OTUsMTAgKzIwNDYsMjggQEAKICAgICAgICAgbVdyaXRlci5jbGVhcigpOwogICAgIH0KIAotICAgIHJlc2V0TWV0cmljcygpOworICAgIC8vIGFjY291bnQgZm9yIHRoZSBsYXN0ICdzZWdtZW50JyAtLSB3aGV0aGVyIHBhdXNlZCBvciByZWNvcmRpbmcKKyAgICBpZiAobVBhdXNlU3RhcnRUaW1lVXMgIT0gMCkgeworICAgICAgICAvLyB3ZSB3ZXJlIHBhdXNlZAorICAgICAgICBpbnQ2NF90IGFkZGl0aXZlID0gc3RvcFRpbWVVcyAtIG1QYXVzZVN0YXJ0VGltZVVzOworICAgICAgICBtRHVyYXRpb25QYXVzZWRVcyArPSBhZGRpdGl2ZTsKKyAgICAgICAgbU5QYXVzZXMrKzsKKyAgICB9IGVsc2UgaWYgKG1TdGFydGVkUmVjb3JkaW5nVXMgIT0gMCkgeworICAgICAgICAvLyB3ZSB3ZXJlIHJlY29yZGluZworICAgICAgICBpbnQ2NF90IGFkZGl0aXZlID0gc3RvcFRpbWVVcyAtIG1TdGFydGVkUmVjb3JkaW5nVXM7CisgICAgICAgIG1EdXJhdGlvblJlY29yZGVkVXMgKz0gYWRkaXRpdmU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1coInN0b3Agd2hpbGUgbmVpdGhlciByZWNvcmRpbmcgbm9yIHBhdXNlZCIpOworICAgIH0KIAorICAgIGZsdXNoQW5kUmVzZXRNZXRyaWNzKHRydWUpOworCisgICAgbUR1cmF0aW9uUmVjb3JkZWRVcyA9IDA7CisgICAgbUR1cmF0aW9uUGF1c2VkVXMgPSAwOworICAgIG1OUGF1c2VzID0gMDsKICAgICBtVG90YWxQYXVzZWREdXJhdGlvblVzID0gMDsKICAgICBtUGF1c2VTdGFydFRpbWVVcyA9IDA7CisgICAgbVN0YXJ0ZWRSZWNvcmRpbmdVcyA9IDA7CiAKICAgICBtR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmNsZWFyKCk7CiAgICAgbVBlcnNpc3RlbnRTdXJmYWNlLmNsZWFyKCk7CkBAIC0yMDM5LDcgKzIxMDgsNyBAQAogICAgIHN0b3AoKTsKIAogICAgIC8vIE5vIGF1ZGlvIG9yIHZpZGVvIHNvdXJjZSBieSBkZWZhdWx0Ci0gICAgbUF1ZGlvU291cmNlID0gQVVESU9fU09VUkNFX0NOVDsKKyAgICBtQXVkaW9Tb3VyY2UgPSAoYXVkaW9fc291cmNlX3QpQVVESU9fU09VUkNFX0NOVDsgLy8gcmVzZXQgdG8gaW52YWxpZCB2YWx1ZQogICAgIG1WaWRlb1NvdXJjZSA9IFZJREVPX1NPVVJDRV9MSVNUX0VORDsKIAogICAgIC8vIERlZmF1bHQgcGFyYW1ldGVycwpAQCAtMjA3Nyw2ICsyMTQ2LDEyIEBACiAgICAgbUxvbmdpdHVkZXgxMDAwMCA9IC0zNjAwMDAwOwogICAgIG1Ub3RhbEJpdFJhdGUgPSAwOwogCisgICAgLy8gdHJhY2tpbmcgaG93IGxvbmcgd2UgcmVjb3JkZWQuCisgICAgbUR1cmF0aW9uUmVjb3JkZWRVcyA9IDA7CisgICAgbVN0YXJ0ZWRSZWNvcmRpbmdVcyA9IDA7CisgICAgbUR1cmF0aW9uUGF1c2VkVXMgPSAwOworICAgIG1OUGF1c2VzID0gMDsKKwogICAgIG1PdXRwdXRGZCA9IC0xOwogCiAgICAgcmV0dXJuIE9LOwpAQCAtMjExNiw2ICsyMTkxLDU1IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRJbnB1dERldmljZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKSB7CisgICAgQUxPR1YoInNldElucHV0RGV2aWNlIik7CisKKyAgICBpZiAobVNlbGVjdGVkRGV2aWNlSWQgIT0gZGV2aWNlSWQpIHsKKyAgICAgICAgbVNlbGVjdGVkRGV2aWNlSWQgPSBkZXZpY2VJZDsKKyAgICAgICAgaWYgKG1BdWRpb1NvdXJjZU5vZGUgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIG1BdWRpb1NvdXJjZU5vZGUtPnNldElucHV0RGV2aWNlKGRldmljZUlkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OmdldFJvdXRlZERldmljZUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QqIGRldmljZUlkKSB7CisgICAgQUxPR1YoImdldFJvdXRlZERldmljZUlkIik7CisKKyAgICBpZiAobUF1ZGlvU291cmNlTm9kZSAhPSAwKSB7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1BdWRpb1NvdXJjZU5vZGUtPmdldFJvdXRlZERldmljZUlkKGRldmljZUlkKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIE5PX0lOSVQ7Cit9CisKK3ZvaWQgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0QXVkaW9EZXZpY2VDYWxsYmFjaygKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaykgeworICAgIG1BdWRpb0RldmljZUNhbGxiYWNrID0gY2FsbGJhY2s7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OmVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKSB7CisgICAgbURldmljZUNhbGxiYWNrRW5hYmxlZCA9IGVuYWJsZWQ7CisgICAgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2sucHJvbW90ZSgpOworICAgIGlmIChtQXVkaW9Tb3VyY2VOb2RlICE9IDAgJiYgY2FsbGJhY2sgIT0gMCkgeworICAgICAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICAgICAgcmV0dXJuIG1BdWRpb1NvdXJjZU5vZGUtPmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soY2FsbGJhY2spOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG1BdWRpb1NvdXJjZU5vZGUtPnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soY2FsbGJhY2spOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6Z2V0QWN0aXZlTWljcm9waG9uZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKSB7CisgICAgaWYgKG1BdWRpb1NvdXJjZU5vZGUgIT0gMCkgeworICAgICAgICByZXR1cm4gbUF1ZGlvU291cmNlTm9kZS0+Z2V0QWN0aXZlTWljcm9waG9uZXMoYWN0aXZlTWljcm9waG9uZXMpOworICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKK30KKworCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpkdW1wKAogICAgICAgICBpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0IHsKICAgICBBTE9HVigiZHVtcCIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmgKaW5kZXggOWE2YzRkYS4uZmFhMmU1OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oCkBAIC0yNSw3ICsyNSw3IEBACiAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KIAotI2luY2x1ZGUgPE1ldGFkYXRhQnVmZmVyVHlwZS5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL01ldGFkYXRhQnVmZmVyVHlwZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTcyLDYgKzcyLDEyIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgY29uc3Q7CiAgICAgLy8gUXVlcnlpbmcgYSBTdXJmYWNlTWVkaWFTb3VyY2VyCiAgICAgdmlydHVhbCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBxdWVyeVN1cmZhY2VNZWRpYVNvdXJjZSgpIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SW5wdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRSb3V0ZWREZXZpY2VJZChhdWRpb19wb3J0X2hhbmRsZV90KiBkZXZpY2VJZCk7CisgICAgdmlydHVhbCB2b2lkIHNldEF1ZGlvRGV2aWNlQ2FsbGJhY2soY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjayk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBlbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBhY3RpdmVNaWNyb3Bob25lcyk7CisKIAogcHJpdmF0ZToKICAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOwpAQCAtODksNyArOTUsNyBAQAogCiAgICAgTWVkaWFBbmFseXRpY3NJdGVtICptQW5hbHl0aWNzSXRlbTsKICAgICBib29sIG1BbmFseXRpY3NEaXJ0eTsKLSAgICB2b2lkIHJlc2V0TWV0cmljcygpOworICAgIHZvaWQgZmx1c2hBbmRSZXNldE1ldHJpY3MoYm9vbCByZWluaXRpYWxpemUpOwogICAgIHZvaWQgdXBkYXRlTWV0cmljcygpOwogCiAgICAgYXVkaW9fc291cmNlX3QgbUF1ZGlvU291cmNlOwpAQCAtMTIxLDYgKzEyNywxMSBAQAogICAgIGludDMyX3QgbVN0YXJ0VGltZU9mZnNldE1zOwogICAgIGludDMyX3QgbVRvdGFsQml0UmF0ZTsKIAorICAgIGludDY0X3QgbUR1cmF0aW9uUmVjb3JkZWRVczsKKyAgICBpbnQ2NF90IG1TdGFydGVkUmVjb3JkaW5nVXM7CisgICAgaW50NjRfdCBtRHVyYXRpb25QYXVzZWRVczsKKyAgICBpbnQzMl90IG1OUGF1c2VzOworCiAgICAgYm9vbCBtQ2FwdHVyZUZwc0VuYWJsZTsKICAgICBkb3VibGUgbUNhcHR1cmVGcHM7CiAgICAgaW50NjRfdCBtVGltZUJldHdlZW5DYXB0dXJlVXM7CkBAIC0xNDQsNiArMTU1LDEwIEBACiAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKICAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOwogCisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBtU2VsZWN0ZWREZXZpY2VJZDsKKyAgICBib29sIG1EZXZpY2VDYWxsYmFja0VuYWJsZWQ7CisgICAgd3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+IG1BdWRpb0RldmljZUNhbGxiYWNrOworCiAgICAgc3RhdGljIGNvbnN0IGludCBrTWF4SGlnaFNwZWVkRnBzID0gMTAwMDsKIAogICAgIHN0YXR1c190IHByZXBhcmVJbnRlcm5hbCgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL2luY2x1ZGUvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9pbmNsdWRlL01lZGlhUGxheWVySW50ZXJmYWNlLmgKaW5kZXggNmQwMmNjZS4uMzExOTk1MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL2luY2x1ZGUvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvaW5jbHVkZS9NZWRpYVBsYXllckludGVyZmFjZS5oCkBAIC0xNDksMTAgKzE0OSwxNSBAQAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYgLyoga2V5VmFsdWVQYWlycyAqLykgeyByZXR1cm4gTk9fRVJST1I7IH0KICAgICAgICAgdmlydHVhbCBTdHJpbmc4ICAgICBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIC8qIGtleXMgKi8pIHsgcmV0dXJuIFN0cmluZzg6OmVtcHR5KCk7IH0KIAotICAgICAgICB2aXJ0dWFsIFZvbHVtZVNoYXBlcjo6U3RhdHVzIGFwcGx5Vm9sdW1lU2hhcGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiYgY29uZmlndXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPiYgb3BlcmF0aW9uKTsKLSAgICAgICAgdmlydHVhbCBzcDxWb2x1bWVTaGFwZXI6OlN0YXRlPiBnZXRWb2x1bWVTaGFwZXJTdGF0ZShpbnQgaWQpOworICAgICAgICB2aXJ0dWFsIG1lZGlhOjpWb2x1bWVTaGFwZXI6OlN0YXR1cyBhcHBseVZvbHVtZVNoYXBlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24+JiBjb25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPiYgb3BlcmF0aW9uKTsKKyAgICAgICAgdmlydHVhbCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpTdGF0ZT4gZ2V0Vm9sdW1lU2hhcGVyU3RhdGUoaW50IGlkKTsKKworICAgICAgICAvLyBBdWRpb1JvdXRpbmcKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0Um91dGVkRGV2aWNlSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCogZGV2aWNlSWQpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKTsKICAgICB9OwogCiAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllckJhc2UoKSB7fQpAQCAtMTgzLDcgKzE4OCw3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWaWRlb1N1cmZhY2VUZXh0dXJlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgYnVmZmVyUHJvZHVjZXIpID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0RGVmYXVsdEJ1ZmZlcmluZ1NldHRpbmdzKAorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0QnVmZmVyaW5nU2V0dGluZ3MoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgewogICAgICAgICAqYnVmZmVyaW5nID0gQnVmZmVyaW5nU2V0dGluZ3MoKTsKICAgICAgICAgcmV0dXJuIE9LOwpAQCAtMjI4LDYgKzIzMyw5IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRDdXJyZW50UG9zaXRpb24oaW50ICptc2VjKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXREdXJhdGlvbihpbnQgKm1zZWMpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHJlc2V0KCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgbm90aWZ5QXQoaW50NjRfdCAvKiBtZWRpYVRpbWVVcyAqLykgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0TG9vcGluZyhpbnQgbG9vcCkgPSAwOwogICAgIHZpcnR1YWwgcGxheWVyX3R5cGUgcGxheWVyVHlwZSgpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwgJnJlcXVlc3QpID0gMDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BV2FrZUxvY2suY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FXYWtlTG9jay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg0YmEyZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BV2FrZUxvY2suY3BwCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJBV2FrZUxvY2siCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJBV2FrZUxvY2suaCIKKworI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPHBvd2VybWFuYWdlci9Qb3dlck1hbmFnZXIuaD4KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0FXYWtlTG9jazo6QVdha2VMb2NrKCkgOgorICAgIG1Qb3dlck1hbmFnZXIoTlVMTCksCisgICAgbVdha2VMb2NrVG9rZW4oTlVMTCksCisgICAgbVdha2VMb2NrQ291bnQoMCksCisgICAgbURlYXRoUmVjaXBpZW50KG5ldyBQTURlYXRoUmVjaXBpZW50KHRoaXMpKSB7fQorCitBV2FrZUxvY2s6On5BV2FrZUxvY2soKSB7CisgICAgaWYgKG1Qb3dlck1hbmFnZXIgIT0gTlVMTCkgeworICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBJSW50ZXJmYWNlOjphc0JpbmRlcihtUG93ZXJNYW5hZ2VyKTsKKyAgICAgICAgYmluZGVyLT51bmxpbmtUb0RlYXRoKG1EZWF0aFJlY2lwaWVudCk7CisgICAgfQorICAgIGNsZWFyUG93ZXJNYW5hZ2VyKCk7Cit9CisKK2Jvb2wgQVdha2VMb2NrOjphY3F1aXJlKCkgeworICAgIGlmIChtV2FrZUxvY2tDb3VudCA9PSAwKSB7CisgICAgICAgIENIRUNLKG1XYWtlTG9ja1Rva2VuID09IE5VTEwpOworICAgICAgICBpZiAobVBvd2VyTWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAvLyB1c2UgY2hlY2tTZXJ2aWNlKCkgdG8gYXZvaWQgYmxvY2tpbmcgaWYgcG93ZXIgc2VydmljZSBpcyBub3QgdXAgeWV0CisgICAgICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPQorICAgICAgICAgICAgICAgIGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5jaGVja1NlcnZpY2UoU3RyaW5nMTYoInBvd2VyIikpOworICAgICAgICAgICAgaWYgKGJpbmRlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImNvdWxkIG5vdCBnZXQgdGhlIHBvd2VyIG1hbmFnZXIgc2VydmljZSIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtUG93ZXJNYW5hZ2VyID0gaW50ZXJmYWNlX2Nhc3Q8SVBvd2VyTWFuYWdlcj4oYmluZGVyKTsKKyAgICAgICAgICAgICAgICBiaW5kZXItPmxpbmtUb0RlYXRoKG1EZWF0aFJlY2lwaWVudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Qb3dlck1hbmFnZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gbmV3IEJCaW5kZXIoKTsKKyAgICAgICAgICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVBvd2VyTWFuYWdlci0+YWNxdWlyZVdha2VMb2NrKAorICAgICAgICAgICAgICAgICAgICBQT1dFUk1BTkFHRVJfUEFSVElBTF9XQUtFX0xPQ0ssCisgICAgICAgICAgICAgICAgICAgIGJpbmRlciwgU3RyaW5nMTYoIkFXYWtlTG9jayIpLCBTdHJpbmcxNigibWVkaWEiKSk7CisgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBtV2FrZUxvY2tUb2tlbiA9IGJpbmRlcjsKKyAgICAgICAgICAgICAgICBtV2FrZUxvY2tDb3VudCsrOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVdha2VMb2NrQ291bnQrKzsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBBV2FrZUxvY2s6OnJlbGVhc2UoYm9vbCBmb3JjZSkgeworICAgIGlmIChtV2FrZUxvY2tDb3VudCA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGZvcmNlKSB7CisgICAgICAgIC8vIEZvcmNlIHdha2Vsb2NrIHJlbGVhc2UgYmVsb3cgYnkgc2V0dGluZyByZWZlcmVuY2UgY291bnQgdG8gMS4KKyAgICAgICAgbVdha2VMb2NrQ291bnQgPSAxOworICAgIH0KKyAgICBpZiAoLS1tV2FrZUxvY2tDb3VudCA9PSAwKSB7CisgICAgICAgIENIRUNLKG1XYWtlTG9ja1Rva2VuICE9IE5VTEwpOworICAgICAgICBpZiAobVBvd2VyTWFuYWdlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICAgICAgICAgIG1Qb3dlck1hbmFnZXItPnJlbGVhc2VXYWtlTG9jayhtV2FrZUxvY2tUb2tlbiwgMCAvKiBmbGFncyAqLyk7CisgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKKyAgICAgICAgfQorICAgICAgICBtV2FrZUxvY2tUb2tlbi5jbGVhcigpOworICAgIH0KK30KKwordm9pZCBBV2FrZUxvY2s6OmNsZWFyUG93ZXJNYW5hZ2VyKCkgeworICAgIHJlbGVhc2UodHJ1ZSk7CisgICAgbVBvd2VyTWFuYWdlci5jbGVhcigpOworfQorCit2b2lkIEFXYWtlTG9jazo6UE1EZWF0aFJlY2lwaWVudDo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKSB7CisgICAgaWYgKG1XYWtlTG9jayAhPSBOVUxMKSB7CisgICAgICAgIG1XYWtlTG9jay0+Y2xlYXJQb3dlck1hbmFnZXIoKTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BV2FrZUxvY2suaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BV2FrZUxvY2suaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVdha2VMb2NrLmgKcmVuYW1lIHRvIG1lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BV2FrZUxvY2suaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDViYjdhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw2NiBAQAorY2NfbGlicmFyeV9zdGF0aWMgeworCisgICAgc3JjczogWworICAgICAgICAiQVdha2VMb2NrLmNwcCIsCisgICAgICAgICJHZW5lcmljU291cmNlLmNwcCIsCisgICAgICAgICJIVFRQTGl2ZVNvdXJjZS5jcHAiLAorICAgICAgICAiTnVQbGF5ZXIuY3BwIiwKKyAgICAgICAgIk51UGxheWVyQ0NEZWNvZGVyLmNwcCIsCisgICAgICAgICJOdVBsYXllckRlY29kZXIuY3BwIiwKKyAgICAgICAgIk51UGxheWVyRGVjb2RlckJhc2UuY3BwIiwKKyAgICAgICAgIk51UGxheWVyRGVjb2RlclBhc3NUaHJvdWdoLmNwcCIsCisgICAgICAgICJOdVBsYXllckRyaXZlci5jcHAiLAorICAgICAgICAiTnVQbGF5ZXJEcm0uY3BwIiwKKyAgICAgICAgIk51UGxheWVyUmVuZGVyZXIuY3BwIiwKKyAgICAgICAgIk51UGxheWVyU3RyZWFtTGlzdGVuZXIuY3BwIiwKKyAgICAgICAgIlJUU1BTb3VyY2UuY3BwIiwKKyAgICAgICAgIlN0cmVhbWluZ1NvdXJjZS5jcHAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZSIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcCIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dCIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIHByb2R1Y3RfdmFyaWFibGVzOiB7CisgICAgICAgIGRlYnVnZ2FibGU6IHsKKyAgICAgICAgICAgIGNmbGFnczogWworICAgICAgICAgICAgICAgICItREVOQUJMRV9TVEFHRUZSSUdIVF9FWFBFUklNRU5UUyIsCisgICAgICAgICAgICBdLAorICAgICAgICB9CisgICAgfSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYm1lZGlhZHJtIiwKKyAgICAgICAgImxpYnBvd2VybWFuYWdlciIsCisgICAgXSwKKworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9udXBsYXllciIsCisKKyAgICB0YWdzOiBbImVuZyJdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBkaWFnOiB7CisgICAgICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIH0sCisgICAgfSwKKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FuZHJvaWQubWsgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU4MjYzMS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEdlbmVyaWNTb3VyY2UuY3BwICAgICAgICAgICAgICAgXAotICAgICAgICBIVFRQTGl2ZVNvdXJjZS5jcHAgICAgICAgICAgICAgIFwKLSAgICAgICAgTnVQbGF5ZXIuY3BwICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIE51UGxheWVyQ0NEZWNvZGVyLmNwcCAgICAgICAgICAgXAotICAgICAgICBOdVBsYXllckRlY29kZXIuY3BwICAgICAgICAgICAgIFwKLSAgICAgICAgTnVQbGF5ZXJEZWNvZGVyQmFzZS5jcHAgICAgICAgICBcCi0gICAgICAgIE51UGxheWVyRGVjb2RlclBhc3NUaHJvdWdoLmNwcCAgXAotICAgICAgICBOdVBsYXllckRyaXZlci5jcHAgICAgICAgICAgICAgIFwKLSAgICAgICAgTnVQbGF5ZXJEcm0uY3BwICAgICAgICAgICAgICAgICBcCi0gICAgICAgIE51UGxheWVyUmVuZGVyZXIuY3BwICAgICAgICAgICAgXAotICAgICAgICBOdVBsYXllclN0cmVhbUxpc3RlbmVyLmNwcCAgICAgIFwKLSAgICAgICAgUlRTUFNvdXJjZS5jcHAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIFN0cmVhbWluZ1NvdXJjZS5jcHAgICAgICAgICAgICAgXAotCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLQlmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0ICAgICAgICAgICAgICAgICAgICAgXAotCWZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUgICAgICAgICAgICBcCi0JZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlICAgICAgICAgICAgIFwKLQlmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMgICAgICAgICAgICAgXAotCWZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcCAgICAgICAgICAgICAgICBcCi0JZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQgICAgICAgICAgIFwKLQlmcmFtZXdvcmtzL2F2L21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZSAgICAgICAgICAgICAgXAotCWZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAotCi1MT0NBTF9DRkxBR1MgKz0gLVdlcnJvciAtV2FsbAotCi0jIGVuYWJsZSBleHBlcmltZW50cyBvbmx5IGluIHVzZXJkZWJ1ZyBhbmQgZW5nIGJ1aWxkcwotaWZuZXEgKCwkKGZpbHRlciB1c2VyZGVidWcgZW5nLCQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpKSkKLUxPQ0FMX0NGTEFHUyArPSAtREVOQUJMRV9TVEFHRUZSSUdIVF9FWFBFUklNRU5UUwotZW5kaWYKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSAgICAgICBcCi0gICAgbGliYmluZGVyICAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJ1aSAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGxpYmd1aSAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbGlibWVkaWEgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJtZWRpYWRybSAgICAgICAgICAgICAgICAgXAotCi1MT0NBTF9NT0RVTEU6PSBsaWJzdGFnZWZyaWdodF9udXBsYXllcgotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBlbmcKLQotTE9DQUxfU0FOSVRJWkUgOj0gY2ZpCi1MT0NBTF9TQU5JVElaRV9ESUFHIDo9IGNmaQotCi1pbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5jcHAKaW5kZXggYWEyMWZmZi4uMjNkNjZiYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmNwcApAQCAtMjMsMTcgKzIzLDIyIEBACiAjaW5jbHVkZSAiQW5vdGhlclBhY2tldFNvdXJjZS5oIgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUJ1ZmZlckhvbGRlci5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZUZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvSW50ZXJmYWNlVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ2xvY2suaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogI2luY2x1ZGUgIi4uLy4uL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgiCkBAIC00MSwyMiArNDYsMjYgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdGF0aWMgY29uc3QgaW50IGtMb3dXYXRlck1hcmtNcyAgICAgICAgICA9IDIwMDA7ICAvLyAyc2Vjcwotc3RhdGljIGNvbnN0IGludCBrSGlnaFdhdGVyTWFya01zICAgICAgICAgPSA1MDAwOyAgLy8gNXNlY3MKLXN0YXRpYyBjb25zdCBpbnQga0hpZ2hXYXRlck1hcmtSZWJ1ZmZlck1zID0gMTUwMDA7ICAvLyAxNXNlY3MKK3N0YXRpYyBjb25zdCBpbnQga0luaXRpYWxNYXJrTXMgICAgICAgID0gNTAwMDsgIC8vIDVzZWNzCiAKLXN0YXRpYyBjb25zdCBpbnQga0xvd1dhdGVyTWFya0tCICA9IDQwOwotc3RhdGljIGNvbnN0IGludCBrSGlnaFdhdGVyTWFya0tCID0gMjAwOworLy9zdGF0aWMgY29uc3QgaW50IGtQYXVzZVBsYXliYWNrTWFya01zICA9IDIwMDA7ICAvLyAyc2Vjcworc3RhdGljIGNvbnN0IGludCBrUmVzdW1lUGxheWJhY2tNYXJrTXMgPSAxNTAwMDsgIC8vIDE1c2VjcwogCiBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6R2VuZXJpY1NvdXJjZSgKICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCiAgICAgICAgIGJvb2wgdWlkVmFsaWQsCi0gICAgICAgIHVpZF90IHVpZCkKKyAgICAgICAgdWlkX3QgdWlkLAorICAgICAgICBjb25zdCBzcDxNZWRpYUNsb2NrPiAmbWVkaWFDbG9jaykKICAgICA6IFNvdXJjZShub3RpZnkpLAogICAgICAgbUF1ZGlvVGltZVVzKDApLAogICAgICAgbUF1ZGlvTGFzdERlcXVldWVUaW1lVXMoMCksCiAgICAgICBtVmlkZW9UaW1lVXMoMCksCiAgICAgICBtVmlkZW9MYXN0RGVxdWV1ZVRpbWVVcygwKSwKKyAgICAgIG1QcmV2QnVmZmVyUGVyY2VudGFnZSgtMSksCisgICAgICBtUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb24oMCksCisgICAgICBtU2VudFBhdXNlT25CdWZmZXJpbmcoZmFsc2UpLAorICAgICAgbUF1ZGlvRGF0YUdlbmVyYXRpb24oMCksCisgICAgICBtVmlkZW9EYXRhR2VuZXJhdGlvbigwKSwKICAgICAgIG1GZXRjaFN1YnRpdGxlRGF0YUdlbmVyYXRpb24oMCksCiAgICAgICBtRmV0Y2hUaW1lZFRleHREYXRhR2VuZXJhdGlvbigwKSwKICAgICAgIG1EdXJhdGlvblVzKC0xbGwpLApAQCAtNjUsMTIgKzc0LDE1IEBACiAgICAgICBtSXNTdHJlYW1pbmcoZmFsc2UpLAogICAgICAgbVVJRFZhbGlkKHVpZFZhbGlkKSwKICAgICAgIG1VSUQodWlkKSwKKyAgICAgIG1NZWRpYUNsb2NrKG1lZGlhQ2xvY2spLAogICAgICAgbUZkKC0xKSwKICAgICAgIG1CaXRyYXRlKC0xbGwpLAogICAgICAgbVBlbmRpbmdSZWFkQnVmZmVyVHlwZXMoMCkgewogICAgIEFMT0dWKCJHZW5lcmljU291cmNlIik7CisgICAgQ0hFQ0sobWVkaWFDbG9jayAhPSBOVUxMKTsKIAotICAgIG1CdWZmZXJpbmdNb25pdG9yID0gbmV3IEJ1ZmZlcmluZ01vbml0b3Iobm90aWZ5KTsKKyAgICBtQnVmZmVyaW5nU2V0dGluZ3MubUluaXRpYWxNYXJrTXMgPSBrSW5pdGlhbE1hcmtNczsKKyAgICBtQnVmZmVyaW5nU2V0dGluZ3MubVJlc3VtZVBsYXliYWNrTWFya01zID0ga1Jlc3VtZVBsYXliYWNrTWFya01zOwogICAgIHJlc2V0RGF0YVNvdXJjZSgpOwogfQogCkBAIC03OSw2ICs5MSw3IEBACiAKICAgICBtSFRUUFNlcnZpY2UuY2xlYXIoKTsKICAgICBtSHR0cFNvdXJjZS5jbGVhcigpOworICAgIG1EaXNjb25uZWN0ZWQgPSBmYWxzZTsKICAgICBtVXJpLmNsZWFyKCk7CiAgICAgbVVyaUhlYWRlcnMuY2xlYXIoKTsKICAgICBpZiAobUZkID49IDApIHsKQEAgLTg4LDE0ICsxMDEsNyBAQAogICAgIG1PZmZzZXQgPSAwOwogICAgIG1MZW5ndGggPSAwOwogICAgIG1TdGFydGVkID0gZmFsc2U7Ci0gICAgbVN0b3BSZWFkID0gdHJ1ZTsKLQotICAgIGlmIChtQnVmZmVyaW5nTW9uaXRvckxvb3BlciAhPSBOVUxMKSB7Ci0gICAgICAgIG1CdWZmZXJpbmdNb25pdG9yTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtQnVmZmVyaW5nTW9uaXRvci0+aWQoKSk7Ci0gICAgICAgIG1CdWZmZXJpbmdNb25pdG9yTG9vcGVyLT5zdG9wKCk7Ci0gICAgICAgIG1CdWZmZXJpbmdNb25pdG9yTG9vcGVyID0gTlVMTDsKLSAgICB9Ci0gICAgbUJ1ZmZlcmluZ01vbml0b3ItPnN0b3AoKTsKKyAgICBtUHJlcGFyaW5nID0gZmFsc2U7CiAKICAgICBtSXNEcm1Qcm90ZWN0ZWQgPSBmYWxzZTsKICAgICBtSXNEcm1SZWxlYXNlZCA9IGZhbHNlOwpAQCAtMTA3LDYgKzExMyw3IEBACiAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCiAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIEFMT0dWKCJzZXREYXRhU291cmNlIHVybDogJXMiLCB1cmwpOwogCiAgICAgcmVzZXREYXRhU291cmNlKCk7CkBAIC0xMjUsNiArMTMyLDcgQEAKIAogc3RhdHVzX3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnNldERhdGFTb3VyY2UoCiAgICAgICAgIGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBBTE9HVigic2V0RGF0YVNvdXJjZSAlZC8lbGxkLyVsbGQiLCBmZCwgKGxvbmcgbG9uZylvZmZzZXQsIChsb25nIGxvbmcpbGVuZ3RoKTsKIAogICAgIHJlc2V0RGF0YVNvdXJjZSgpOwpAQCAtMTM5LDYgKzE0Nyw3IEBACiB9CiAKIHN0YXR1c190IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpzZXREYXRhU291cmNlKGNvbnN0IHNwPERhdGFTb3VyY2U+JiBzb3VyY2UpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIEFMT0dWKCJzZXREYXRhU291cmNlIChzb3VyY2U6ICVwKSIsIHNvdXJjZS5nZXQoKSk7CiAKICAgICByZXNldERhdGFTb3VyY2UoKTsKQEAgLTE0NywyMSArMTU2LDM0IEBACiB9CiAKIHNwPE1ldGFEYXRhPiBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6Z2V0RmlsZUZvcm1hdE1ldGEoKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICByZXR1cm4gbUZpbGVNZXRhOwogfQogCiBzdGF0dXNfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6aW5pdEZyb21EYXRhU291cmNlKCkgewogICAgIHNwPElNZWRpYUV4dHJhY3Rvcj4gZXh0cmFjdG9yOwogICAgIENIRUNLKG1EYXRhU291cmNlICE9IE5VTEwpOworICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UgPSBtRGF0YVNvdXJjZTsKIAotICAgIGV4dHJhY3RvciA9IE1lZGlhRXh0cmFjdG9yOjpDcmVhdGUobURhdGFTb3VyY2UsIE5VTEwpOworICAgIG1Mb2NrLnVubG9jaygpOworICAgIC8vIFRoaXMgbWlnaHQgdGFrZSBsb25nIHRpbWUgaWYgZGF0YSBzb3VyY2UgaXMgbm90IHJlbGlhYmxlLgorICAgIGV4dHJhY3RvciA9IE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Q3JlYXRlKGRhdGFTb3VyY2UsIE5VTEwpOwogCiAgICAgaWYgKGV4dHJhY3RvciA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJpbml0RnJvbURhdGFTb3VyY2UsIGNhbm5vdCBjcmVhdGUgZXh0cmFjdG9yISIpOwogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CiAKLSAgICBtRmlsZU1ldGEgPSBleHRyYWN0b3ItPmdldE1ldGFEYXRhKCk7CisgICAgc3A8TWV0YURhdGE+IGZpbGVNZXRhID0gZXh0cmFjdG9yLT5nZXRNZXRhRGF0YSgpOworCisgICAgc2l6ZV90IG51bXRyYWNrcyA9IGV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKKyAgICBpZiAobnVtdHJhY2tzID09IDApIHsKKyAgICAgICAgQUxPR0UoImluaXRGcm9tRGF0YVNvdXJjZSwgc291cmNlIGhhcyBubyB0cmFjayEiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgbUxvY2subG9jaygpOworICAgIG1GaWxlTWV0YSA9IGZpbGVNZXRhOwogICAgIGlmIChtRmlsZU1ldGEgIT0gTlVMTCkgewogICAgICAgICBpbnQ2NF90IGR1cmF0aW9uOwogICAgICAgICBpZiAobUZpbGVNZXRhLT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb24pKSB7CkBAIC0xNzEsMTIgKzE5Myw2IEBACiAKICAgICBpbnQzMl90IHRvdGFsQml0cmF0ZSA9IDA7CiAKLSAgICBzaXplX3QgbnVtdHJhY2tzID0gZXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOwotICAgIGlmIChudW10cmFja3MgPT0gMCkgewotICAgICAgICBBTE9HRSgiaW5pdEZyb21EYXRhU291cmNlLCBzb3VyY2UgaGFzIG5vIHRyYWNrISIpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KICAgICBtTWltZXMuY2xlYXIoKTsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtdHJhY2tzOyArK2kpIHsKQEAgLTI1OSwxNCArMjc1LDIzIEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6Z2V0RGVmYXVsdEJ1ZmZlcmluZ1NldHRpbmdzKAorc3RhdHVzX3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmdldEJ1ZmZlcmluZ1NldHRpbmdzKAogICAgICAgICBCdWZmZXJpbmdTZXR0aW5ncyogYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pIHsKLSAgICBtQnVmZmVyaW5nTW9uaXRvci0+Z2V0RGVmYXVsdEJ1ZmZlcmluZ1NldHRpbmdzKGJ1ZmZlcmluZyk7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICAqYnVmZmVyaW5nID0gbUJ1ZmZlcmluZ1NldHRpbmdzOworICAgIH0KKworICAgIEFMT0dWKCJnZXRCdWZmZXJpbmdTZXR0aW5nc3slc30iLCBidWZmZXJpbmctPnRvU3RyaW5nKCkuc3RyaW5nKCkpOwogICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiBidWZmZXJpbmcpIHsKLSAgICByZXR1cm4gbUJ1ZmZlcmluZ01vbml0b3ItPnNldEJ1ZmZlcmluZ1NldHRpbmdzKGJ1ZmZlcmluZyk7CisgICAgQUxPR1YoInNldEJ1ZmZlcmluZ1NldHRpbmdzeyVzfSIsIGJ1ZmZlcmluZy50b1N0cmluZygpLnN0cmluZygpKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbUJ1ZmZlcmluZ1NldHRpbmdzID0gYnVmZmVyaW5nOworICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnN0YXJ0U291cmNlcygpIHsKQEAgLTMwMCwyMiArMzI1LDExIEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6c2V0QnVmZmVycygKLSAgICAgICAgYm9vbCBhdWRpbywgVmVjdG9yPE1lZGlhQnVmZmVyICo+ICZidWZmZXJzKSB7Ci0gICAgaWYgKG1Jc1NlY3VyZSAmJiAhYXVkaW8gJiYgbVZpZGVvVHJhY2subVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBtVmlkZW9UcmFjay5tU291cmNlLT5zZXRCdWZmZXJzKGJ1ZmZlcnMpOwotICAgIH0KLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KIGJvb2wgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmlzU3RyZWFtaW5nKCkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgcmV0dXJuIG1Jc1N0cmVhbWluZzsKIH0KIAotdm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6c2V0T2ZmbG9hZEF1ZGlvKGJvb2wgb2ZmbG9hZCkgewotICAgIG1CdWZmZXJpbmdNb25pdG9yLT5zZXRPZmZsb2FkQXVkaW8ob2ZmbG9hZCk7Ci19Ci0KIE51UGxheWVyOjpHZW5lcmljU291cmNlOjp+R2VuZXJpY1NvdXJjZSgpIHsKICAgICBBTE9HVigifkdlbmVyaWNTb3VyY2UiKTsKICAgICBpZiAobUxvb3BlciAhPSBOVUxMKSB7CkBAIC0zMjYsNiArMzQwLDcgQEAKIH0KIAogdm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6cHJlcGFyZUFzeW5jKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQUxPR1YoInByZXBhcmVBc3luYzogKGxvb3BlcjogJWQpIiwgKG1Mb29wZXIgIT0gTlVMTCkpOwogCiAgICAgaWYgKG1Mb29wZXIgPT0gTlVMTCkgewpAQCAtMzU0LDcgKzM2OSw3IEBACiAgICAgICAgICAgICBTdHJpbmc4IGNvbnRlbnRUeXBlOwogCiAgICAgICAgICAgICBpZiAoIXN0cm5jYXNlY21wKCJodHRwOi8vIiwgdXJpLCA3KSB8fCAhc3RybmNhc2VjbXAoImh0dHBzOi8vIiwgdXJpLCA4KSkgewotICAgICAgICAgICAgICAgIG1IdHRwU291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlTWVkaWFIVFRQKG1IVFRQU2VydmljZSk7CisgICAgICAgICAgICAgICAgbUh0dHBTb3VyY2UgPSBEYXRhU291cmNlRmFjdG9yeTo6Q3JlYXRlTWVkaWFIVFRQKG1IVFRQU2VydmljZSk7CiAgICAgICAgICAgICAgICAgaWYgKG1IdHRwU291cmNlID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgaHR0cCBzb3VyY2UhIik7CiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeVByZXBhcmVkQW5kQ2xlYW51cChVTktOT1dOX0VSUk9SKTsKQEAgLTM2Miw5ICszNzcsMTUgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1EYXRhU291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSSgKKyAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICAgICAgLy8gVGhpcyBtaWdodCB0YWtlIGxvbmcgdGltZSBpZiBjb25uZWN0aW9uIGhhcyBzb21lIGlzc3VlLgorICAgICAgICAgICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSA9IERhdGFTb3VyY2VGYWN0b3J5OjpDcmVhdGVGcm9tVVJJKAogICAgICAgICAgICAgICAgICAgIG1IVFRQU2VydmljZSwgdXJpLCAmbVVyaUhlYWRlcnMsICZjb250ZW50VHlwZSwKICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxIVFRQQmFzZSAqPihtSHR0cFNvdXJjZS5nZXQoKSkpOworICAgICAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICAgICAgaWYgKCFtRGlzY29ubmVjdGVkKSB7CisgICAgICAgICAgICAgICAgbURhdGFTb3VyY2UgPSBkYXRhU291cmNlOworICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKHByb3BlcnR5X2dldF9ib29sKCJtZWRpYS5zdGFnZWZyaWdodC5leHRyYWN0cmVtb3RlIiwgdHJ1ZSkgJiYKICAgICAgICAgICAgICAgICAgICAgIUZpbGVTb3VyY2U6OnJlcXVpcmVzRHJtKG1GZCwgbU9mZnNldCwgbUxlbmd0aCwgbnVsbHB0ciAvKiBtaW1lICovKSkgewpAQCAtMzc5LDcgKzQwMCw3IEBACiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJJRGF0YVNvdXJjZShGaWxlU291cmNlKTogJXAgJWQgJWxsZCAlbGxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UuZ2V0KCksIG1GZCwgKGxvbmcgbG9uZyltT2Zmc2V0LCAobG9uZyBsb25nKW1MZW5ndGgpOwogICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlLmdldCgpICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1EYXRhU291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbUlEYXRhU291cmNlKHNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtRGF0YVNvdXJjZSA9IENyZWF0ZURhdGFTb3VyY2VGcm9tSURhdGFTb3VyY2Uoc291cmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZSAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIGxvY2FsIGZpbGUgZGVzY3JpcHRvciBhcyBpdCBpcyBub3QgbmVlZGVkIGFueW1vcmUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2UobUZkKTsKQEAgLTM5Nyw3ICs0MTgsNyBAQAogICAgICAgICAgICAgICAgIG1EYXRhU291cmNlID0gbmV3IEZpbGVTb3VyY2UobUZkLCBtT2Zmc2V0LCBtTGVuZ3RoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIFRPRE86IGNsb3NlIHNob3VsZCBhbHdheXMgYmUgZG9uZSBvbiBtRmQsIHNlZSB0aGUgbGluZXMgZm9sbG93aW5nCi0gICAgICAgICAgICAvLyBEYXRhU291cmNlOjpDcmVhdGVGcm9tSURhdGFTb3VyY2UgYWJvdmUsCisgICAgICAgICAgICAvLyBDcmVhdGVEYXRhU291cmNlRnJvbUlEYXRhU291cmNlIGFib3ZlLAogICAgICAgICAgICAgLy8gYW5kIHRoZSBGaWxlU291cmNlIGNvbnN0cnVjdG9yIHNob3VsZCBkdXAgdGhlIG1GZCBhcmd1bWVudCBhcyBuZWVkZWQuCiAgICAgICAgICAgICBtRmQgPSAtMTsKICAgICAgICAgfQpAQCAtNDI3LDcgKzQ0OCw3IEBACiAgICAgfQogCiAgICAgaWYgKG1WaWRlb1RyYWNrLm1Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IGRvR2V0Rm9ybWF0TWV0YShmYWxzZSAvKiBhdWRpbyAqLyk7CisgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gZ2V0Rm9ybWF0TWV0YV9sKGZhbHNlIC8qIGF1ZGlvICovKTsKICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZTsKICAgICAgICAgZXJyID0gY29udmVydE1ldGFEYXRhVG9NZXNzYWdlKG1ldGEsICZtc2cpOwogICAgICAgICBpZihlcnIgIT0gT0spIHsKQEAgLTQ2MSw0NyArNDgyLDM5IEBACiAgICAgfQogCiAgICAgaWYgKG1Jc1N0cmVhbWluZykgewotICAgICAgICBpZiAobUJ1ZmZlcmluZ01vbml0b3JMb29wZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgbUJ1ZmZlcmluZ01vbml0b3ItPnByZXBhcmUobUNhY2hlZFNvdXJjZSwgbUR1cmF0aW9uVXMsIG1CaXRyYXRlLAotICAgICAgICAgICAgICAgICAgICBtSXNTdHJlYW1pbmcpOwotCi0gICAgICAgICAgICBtQnVmZmVyaW5nTW9uaXRvckxvb3BlciA9IG5ldyBBTG9vcGVyOwotICAgICAgICAgICAgbUJ1ZmZlcmluZ01vbml0b3JMb29wZXItPnNldE5hbWUoIkdTQk1vbml0b3IiKTsKLSAgICAgICAgICAgIG1CdWZmZXJpbmdNb25pdG9yTG9vcGVyLT5zdGFydCgpOwotICAgICAgICAgICAgbUJ1ZmZlcmluZ01vbml0b3JMb29wZXItPnJlZ2lzdGVySGFuZGxlcihtQnVmZmVyaW5nTW9uaXRvcik7Ci0gICAgICAgIH0KLQotICAgICAgICBtQnVmZmVyaW5nTW9uaXRvci0+ZW5zdXJlQ2FjaGVJc0ZldGNoaW5nKCk7Ci0gICAgICAgIG1CdWZmZXJpbmdNb25pdG9yLT5yZXN0YXJ0UG9sbEJ1ZmZlcmluZygpOworICAgICAgICBtQ2FjaGVkU291cmNlLT5yZXN1bWVGZXRjaGluZ0lmTmVjZXNzYXJ5KCk7CisgICAgICAgIG1QcmVwYXJpbmcgPSB0cnVlOworICAgICAgICBzY2hlZHVsZVBvbGxCdWZmZXJpbmcoKTsKICAgICB9IGVsc2UgewogICAgICAgICBub3RpZnlQcmVwYXJlZCgpOwogICAgIH0KKworICAgIGlmIChtQXVkaW9UcmFjay5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgcG9zdFJlYWRCdWZmZXIoTUVESUFfVFJBQ0tfVFlQRV9BVURJTyk7CisgICAgfQorCisgICAgaWYgKG1WaWRlb1RyYWNrLm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBwb3N0UmVhZEJ1ZmZlcihNRURJQV9UUkFDS19UWVBFX1ZJREVPKTsKKyAgICB9CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6Om5vdGlmeVByZXBhcmVkQW5kQ2xlYW51cChzdGF0dXNfdCBlcnIpIHsKICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UgPSBtRGF0YVNvdXJjZTsKLSAgICAgICAgICAgIHNwPE51Q2FjaGVkU291cmNlMj4gY2FjaGVkU291cmNlID0gbUNhY2hlZFNvdXJjZTsKLSAgICAgICAgICAgIHNwPERhdGFTb3VyY2U+IGh0dHBTb3VyY2UgPSBtSHR0cFNvdXJjZTsKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobURpc2Nvbm5lY3RMb2NrKTsKLSAgICAgICAgICAgICAgICBtRGF0YVNvdXJjZS5jbGVhcigpOwotICAgICAgICAgICAgICAgIG1DYWNoZWRTb3VyY2UuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICBtSHR0cFNvdXJjZS5jbGVhcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1CaXRyYXRlID0gLTE7CisgICAgICAgIG1EYXRhU291cmNlLmNsZWFyKCk7CisgICAgICAgIG1DYWNoZWRTb3VyY2UuY2xlYXIoKTsKKyAgICAgICAgbUh0dHBTb3VyY2UuY2xlYXIoKTsKIAotICAgICAgICBtQnVmZmVyaW5nTW9uaXRvci0+Y2FuY2VsUG9sbEJ1ZmZlcmluZygpOworICAgICAgICBtQml0cmF0ZSA9IC0xOworICAgICAgICBtUHJldkJ1ZmZlclBlcmNlbnRhZ2UgPSAtMTsKKyAgICAgICAgKyttUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb247CiAgICAgfQogICAgIG5vdGlmeVByZXBhcmVkKGVycik7CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnN0YXJ0KCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQUxPR0koInN0YXJ0Iik7CiAKLSAgICBtU3RvcFJlYWQgPSBmYWxzZTsKICAgICBpZiAobUF1ZGlvVHJhY2subVNvdXJjZSAhPSBOVUxMKSB7CiAgICAgICAgIHBvc3RSZWFkQnVmZmVyKE1FRElBX1RSQUNLX1RZUEVfQVVESU8pOwogICAgIH0KQEAgLTUxMSwzMCArNTI0LDMwIEBACiAgICAgfQogCiAgICAgbVN0YXJ0ZWQgPSB0cnVlOwotCi0gICAgKG5ldyBBTWVzc2FnZShrV2hhdFN0YXJ0LCB0aGlzKSktPnBvc3QoKTsKIH0KIAogdm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6c3RvcCgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIG1TdGFydGVkID0gZmFsc2U7CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnBhdXNlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKIH0KIAogdm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6cmVzdW1lKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgbVN0YXJ0ZWQgPSB0cnVlOwotCi0gICAgKG5ldyBBTWVzc2FnZShrV2hhdFJlc3VtZSwgdGhpcykpLT5wb3N0KCk7CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmRpc2Nvbm5lY3QoKSB7CiAgICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSwgaHR0cFNvdXJjZTsKICAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGlzY29ubmVjdExvY2spOworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgICAgICBkYXRhU291cmNlID0gbURhdGFTb3VyY2U7CiAgICAgICAgIGh0dHBTb3VyY2UgPSBtSHR0cFNvdXJjZTsKKyAgICAgICAgbURpc2Nvbm5lY3RlZCA9IHRydWU7CiAgICAgfQogCiAgICAgaWYgKGRhdGFTb3VyY2UgIT0gTlVMTCkgewpAQCAtNTUxLDcgKzU2NCwyNCBAQAogICAgIHJldHVybiBPSzsKIH0KIAordm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6c2VuZENhY2hlU3RhdHMoKSB7CisgICAgaW50MzJfdCBrYnBzID0gMDsKKyAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworCisgICAgaWYgKG1DYWNoZWRTb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBlcnIgPSBtQ2FjaGVkU291cmNlLT5nZXRFc3RpbWF0ZWRCYW5kd2lkdGhLYnBzKCZrYnBzKTsKKyAgICB9CisKKyAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKKyAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0Q2FjaGVTdGF0cyk7CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImJhbmR3aWR0aCIsIGticHMpOworICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICB9Cit9CisKIHZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CiAgICAgICBjYXNlIGtXaGF0UHJlcGFyZUFzeW5jOgogICAgICAgewpAQCAtNjIwLDYgKzY1MCw4IEBACiAgICAgICAgICAgdHJhY2stPm1Tb3VyY2UgPSBzb3VyY2U7CiAgICAgICAgICAgdHJhY2stPm1Tb3VyY2UtPnN0YXJ0KCk7CiAgICAgICAgICAgdHJhY2stPm1JbmRleCA9IHRyYWNrSW5kZXg7CisgICAgICAgICAgKyttQXVkaW9EYXRhR2VuZXJhdGlvbjsKKyAgICAgICAgICArK21WaWRlb0RhdGFHZW5lcmF0aW9uOwogCiAgICAgICAgICAgaW50NjRfdCB0aW1lVXMsIGFjdHVhbFRpbWVVczsKICAgICAgICAgICBjb25zdCBib29sIGZvcm1hdENoYW5nZSA9IHRydWU7CkBAIC02MzcsMzcgKzY2OSw2IEBACiAgICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAKLSAgICAgIGNhc2Uga1doYXRTdGFydDoKLSAgICAgIGNhc2Uga1doYXRSZXN1bWU6Ci0gICAgICB7Ci0gICAgICAgICAgbUJ1ZmZlcmluZ01vbml0b3ItPnJlc3RhcnRQb2xsQnVmZmVyaW5nKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2Uga1doYXRHZXRGb3JtYXQ6Ci0gICAgICB7Ci0gICAgICAgICAgb25HZXRGb3JtYXRNZXRhKG1zZyk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2Uga1doYXRHZXRTZWxlY3RlZFRyYWNrOgotICAgICAgewotICAgICAgICAgIG9uR2V0U2VsZWN0ZWRUcmFjayhtc2cpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIGtXaGF0R2V0VHJhY2tJbmZvOgotICAgICAgewotICAgICAgICAgIG9uR2V0VHJhY2tJbmZvKG1zZyk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2Uga1doYXRTZWxlY3RUcmFjazoKLSAgICAgIHsKLSAgICAgICAgICBvblNlbGVjdFRyYWNrKG1zZyk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KICAgICAgIGNhc2Uga1doYXRTZWVrOgogICAgICAgewogICAgICAgICAgIG9uU2Vlayhtc2cpOwpAQCAtNjgwLDI1ICs2ODEsMTMgQEAKICAgICAgICAgICBicmVhazsKICAgICAgIH0KIAotICAgICAgY2FzZSBrV2hhdFByZXBhcmVEcm06CisgICAgICBjYXNlIGtXaGF0UG9sbEJ1ZmZlcmluZzoKICAgICAgIHsKLSAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBvblByZXBhcmVEcm0obXNnKTsKLSAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJzdGF0dXMiLCBzdGF0dXMpOwotICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwotICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKLSAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIGtXaGF0UmVsZWFzZURybToKLSAgICAgIHsKLSAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBvblJlbGVhc2VEcm0oKTsKLSAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJzdGF0dXMiLCBzdGF0dXMpOwotICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwotICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKLSAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7CisgICAgICAgICAgaWYgKGdlbmVyYXRpb24gPT0gbVBvbGxCdWZmZXJpbmdHZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgIG9uUG9sbEJ1ZmZlcmluZygpOworICAgICAgICAgIH0KICAgICAgICAgICBicmVhazsKICAgICAgIH0KIApAQCAtNzI5LDE3ICs3MTgsMjAgQEAKICAgICBpbnQ2NF90IHRpbWVVczsKICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwogCi0gICAgaW50NjRfdCBzdWJUaW1lVXM7CisgICAgaW50NjRfdCBzdWJUaW1lVXMgPSAwOwogICAgIHJlYWRCdWZmZXIodHlwZSwgdGltZVVzLCBNZWRpYVBsYXllclNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMgLyogbW9kZSAqLywgJnN1YlRpbWVVcyk7CiAKLSAgICBpbnQ2NF90IGRlbGF5VXMgPSBzdWJUaW1lVXMgLSB0aW1lVXM7CisgICAgc3RhdHVzX3QgZW9zUmVzdWx0OworICAgIGlmICghcGFja2V0cy0+aGFzQnVmZmVyQXZhaWxhYmxlKCZlb3NSZXN1bHQpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKICAgICBpZiAobXNnLT53aGF0KCkgPT0ga1doYXRGZXRjaFN1YnRpdGxlRGF0YSkgewotICAgICAgICBjb25zdCBpbnQ2NF90IG9uZVNlY1VzID0gMTAwMDAwMGxsOwotICAgICAgICBkZWxheVVzIC09IG9uZVNlY1VzOworICAgICAgICBzdWJUaW1lVXMgLT0gMTAwMDAwMGxsOyAgLy8gc2VuZCBzdWJ0aWxlIGRhdGEgb25lIHNlY29uZCBlYXJsaWVyCiAgICAgfQogICAgIHNwPEFNZXNzYWdlPiBtc2cyID0gbmV3IEFNZXNzYWdlKHNlbmRXaGF0LCB0aGlzKTsKICAgICBtc2cyLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1zZ0dlbmVyYXRpb24pOwotICAgIG1zZzItPnBvc3QoZGVsYXlVcyA8IDAgPyAwIDogZGVsYXlVcyk7CisgICAgbU1lZGlhQ2xvY2stPmFkZFRpbWVyKG1zZzIsIHN1YlRpbWVVcyk7CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnNlbmRUZXh0RGF0YSgKQEAgLTc3MSw4ICs3NjMsMTAgQEAKICAgICAgICAgbm90aWZ5LT5zZXRCdWZmZXIoImJ1ZmZlciIsIGJ1ZmZlcik7CiAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwogCi0gICAgICAgIGNvbnN0IGludDY0X3QgZGVsYXlVcyA9IG5leHRTdWJUaW1lVXMgLSBzdWJUaW1lVXM7Ci0gICAgICAgIG1zZy0+cG9zdChkZWxheVVzIDwgMCA/IDAgOiBkZWxheVVzKTsKKyAgICAgICAgaWYgKG1zZy0+d2hhdCgpID09IGtXaGF0U2VuZFN1YnRpdGxlRGF0YSkgeworICAgICAgICAgICAgbmV4dFN1YlRpbWVVcyAtPSAxMDAwMDAwbGw7ICAvLyBzZW5kIHN1YnRpbGUgZGF0YSBvbmUgc2Vjb25kIGVhcmxpZXIKKyAgICAgICAgfQorICAgICAgICBtTWVkaWFDbG9jay0+YWRkVGltZXIobXNnLCBuZXh0U3ViVGltZVVzKTsKICAgICB9CiB9CiAKQEAgLTgwOCwzNCArODAyLDExIEBACiB9CiAKIHNwPE1ldGFEYXRhPiBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6Z2V0Rm9ybWF0TWV0YShib29sIGF1ZGlvKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEdldEZvcm1hdCwgdGhpcyk7Ci0gICAgbXNnLT5zZXRJbnQzMigiYXVkaW8iLCBhdWRpbyk7Ci0KLSAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7Ci0gICAgc3A8UmVmQmFzZT4gZm9ybWF0OwotICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKLSAgICBpZiAoZXJyID09IE9LICYmIHJlc3BvbnNlICE9IE5VTEwpIHsKLSAgICAgICAgQ0hFQ0socmVzcG9uc2UtPmZpbmRPYmplY3QoImZvcm1hdCIsICZmb3JtYXQpKTsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PE1ldGFEYXRhKj4oZm9ybWF0LmdldCgpKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gZ2V0Rm9ybWF0TWV0YV9sKGF1ZGlvKTsKIH0KIAotdm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6b25HZXRGb3JtYXRNZXRhKGNvbnN0IHNwPEFNZXNzYWdlPiYgbXNnKSBjb25zdCB7Ci0gICAgaW50MzJfdCBhdWRpbzsKLSAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYXVkaW8iLCAmYXVkaW8pKTsKLQotICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICBzcDxNZXRhRGF0YT4gZm9ybWF0ID0gZG9HZXRGb3JtYXRNZXRhKGF1ZGlvKTsKLSAgICByZXNwb25zZS0+c2V0T2JqZWN0KCJmb3JtYXQiLCBmb3JtYXQpOwotCi0gICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7Ci0gICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwotICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7Ci19Ci0KLXNwPE1ldGFEYXRhPiBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6ZG9HZXRGb3JtYXRNZXRhKGJvb2wgYXVkaW8pIGNvbnN0IHsKK3NwPE1ldGFEYXRhPiBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6Z2V0Rm9ybWF0TWV0YV9sKGJvb2wgYXVkaW8pIHsKICAgICBzcDxJTWVkaWFTb3VyY2U+IHNvdXJjZSA9IGF1ZGlvID8gbUF1ZGlvVHJhY2subVNvdXJjZSA6IG1WaWRlb1RyYWNrLm1Tb3VyY2U7CiAKICAgICBpZiAoc291cmNlID09IE5VTEwpIHsKQEAgLTg0NywxMCArODE4LDcgQEAKIAogc3RhdHVzX3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmRlcXVldWVBY2Nlc3NVbml0KAogICAgICAgICBib29sIGF1ZGlvLCBzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCkgewotICAgIGlmIChhdWRpbyAmJiAhbVN0YXJ0ZWQpIHsKLSAgICAgICAgcmV0dXJuIC1FV09VTERCTE9DSzsKLSAgICB9Ci0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIC8vIElmIGhhcyBnb25lIHRocm91Z2ggc3RvcC9yZWxlYXNlRHJtIHNlcXVlbmNlLCB3ZSBubyBsb25nZXIgc2VuZCBkb3duIGFueSBidWZmZXIgYi9jCiAgICAgLy8gdGhlIGNvZGVjJ3MgY3J5cHRvIG9iamVjdCBoYXMgZ29uZSBhd2F5IChiLzM3OTYwMDk2KS4KICAgICAvLyBOb3RlOiBUaGlzIHdpbGwgYmUgdW5uZWNlc3Nhcnkgd2hlbiBzdG9wKCkgY2hhbmdlcyBiZWhhdmlvciBhbmQgcmVsZWFzZXMgY29kZWMgKGIvMzUyNDgyODMpLgpAQCAtODc2LDEwICs4NDQsMzIgQEAKIAogICAgIHN0YXR1c190IHJlc3VsdCA9IHRyYWNrLT5tUGFja2V0cy0+ZGVxdWV1ZUFjY2Vzc1VuaXQoYWNjZXNzVW5pdCk7CiAKLSAgICAvLyBzdGFydCBwdWxsaW5nIGluIG1vcmUgYnVmZmVycyBpZiB3ZSBvbmx5IGhhdmUgb25lIChvciBubykgYnVmZmVyIGxlZnQKKyAgICAvLyBzdGFydCBwdWxsaW5nIGluIG1vcmUgYnVmZmVycyBpZiBjYWNoZSBpcyBydW5uaW5nIGxvdwogICAgIC8vIHNvIHRoYXQgZGVjb2RlciBoYXMgbGVzcyBjaGFuY2Ugb2YgYmVpbmcgc3RhcnZlZAotICAgIGlmICh0cmFjay0+bVBhY2tldHMtPmdldEF2YWlsYWJsZUJ1ZmZlckNvdW50KCZmaW5hbFJlc3VsdCkgPCAyKSB7Ci0gICAgICAgIHBvc3RSZWFkQnVmZmVyKGF1ZGlvPyBNRURJQV9UUkFDS19UWVBFX0FVRElPIDogTUVESUFfVFJBQ0tfVFlQRV9WSURFTyk7CisgICAgaWYgKCFtSXNTdHJlYW1pbmcpIHsKKyAgICAgICAgaWYgKHRyYWNrLT5tUGFja2V0cy0+Z2V0QXZhaWxhYmxlQnVmZmVyQ291bnQoJmZpbmFsUmVzdWx0KSA8IDIpIHsKKyAgICAgICAgICAgIHBvc3RSZWFkQnVmZmVyKGF1ZGlvPyBNRURJQV9UUkFDS19UWVBFX0FVRElPIDogTUVESUFfVFJBQ0tfVFlQRV9WSURFTyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPSB0cmFjay0+bVBhY2tldHMtPmdldEJ1ZmZlcmVkRHVyYXRpb25VcygmZmluYWxSZXN1bHQpOworICAgICAgICAvLyBUT0RPOiBtYXhSZWJ1ZmZlcmluZ01hcmtNcyBjb3VsZCBiZSBsYXJnZXIgdGhhbgorICAgICAgICAvLyBtQnVmZmVyaW5nU2V0dGluZ3MubVJlc3VtZVBsYXliYWNrTWFya01zCisgICAgICAgIGludDY0X3QgcmVzdGFydEJ1ZmZlcmluZ01hcmtVcyA9CisgICAgICAgICAgICAgbUJ1ZmZlcmluZ1NldHRpbmdzLm1SZXN1bWVQbGF5YmFja01hcmtNcyAqIDEwMDBsbCAvIDI7CisgICAgICAgIGlmIChmaW5hbFJlc3VsdCA9PSBPSykgeworICAgICAgICAgICAgaWYgKGR1cmF0aW9uVXMgPCByZXN0YXJ0QnVmZmVyaW5nTWFya1VzKSB7CisgICAgICAgICAgICAgICAgcG9zdFJlYWRCdWZmZXIoYXVkaW8/IE1FRElBX1RSQUNLX1RZUEVfQVVESU8gOiBNRURJQV9UUkFDS19UWVBFX1ZJREVPKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0cmFjay0+bVBhY2tldHMtPmdldEF2YWlsYWJsZUJ1ZmZlckNvdW50KCZmaW5hbFJlc3VsdCkgPCAyCisgICAgICAgICAgICAgICAgJiYgIW1TZW50UGF1c2VPbkJ1ZmZlcmluZyAmJiAhbVByZXBhcmluZykgeworICAgICAgICAgICAgICAgIG1DYWNoZWRTb3VyY2UtPnJlc3VtZUZldGNoaW5nSWZOZWNlc3NhcnkoKTsKKyAgICAgICAgICAgICAgICBzZW5kQ2FjaGVTdGF0cygpOworICAgICAgICAgICAgICAgIG1TZW50UGF1c2VPbkJ1ZmZlcmluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOworICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFBhdXNlT25CdWZmZXJpbmdTdGFydCk7CisgICAgICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAocmVzdWx0ICE9IE9LKSB7CkBAIC04OTksNyArODg5LDYgQEAKICAgICBDSEVDSygoKmFjY2Vzc1VuaXQpLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwogICAgIGlmIChhdWRpbykgewogICAgICAgICBtQXVkaW9MYXN0RGVxdWV1ZVRpbWVVcyA9IHRpbWVVczsKLSAgICAgICAgbUJ1ZmZlcmluZ01vbml0b3ItPnVwZGF0ZURlcXVldWVkQnVmZmVyVGltZSh0aW1lVXMpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1WaWRlb0xhc3REZXF1ZXVlVGltZVVzID0gdGltZVVzOwogICAgIH0KQEAgLTkyNCw0MyArOTEzLDE4IEBACiB9CiAKIHN0YXR1c190IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpnZXREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICAqZHVyYXRpb25VcyA9IG1EdXJhdGlvblVzOwogICAgIHJldHVybiBPSzsKIH0KIAogc2l6ZV90IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpnZXRUcmFja0NvdW50KCkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgcmV0dXJuIG1Tb3VyY2VzLnNpemUoKTsKIH0KIAogc3A8QU1lc3NhZ2U+IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpnZXRUcmFja0luZm8oc2l6ZV90IHRyYWNrSW5kZXgpIGNvbnN0IHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0VHJhY2tJbmZvLCB0aGlzKTsKLSAgICBtc2ctPnNldFNpemUoInRyYWNrSW5kZXgiLCB0cmFja0luZGV4KTsKLQotICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKLSAgICBzcDxSZWZCYXNlPiBmb3JtYXQ7Ci0gICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOwotICAgIGlmIChlcnIgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgewotICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZE9iamVjdCgiZm9ybWF0IiwgJmZvcm1hdCkpOwotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8QU1lc3NhZ2UqPihmb3JtYXQuZ2V0KCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLX0KLQotdm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6b25HZXRUcmFja0luZm8oY29uc3Qgc3A8QU1lc3NhZ2U+JiBtc2cpIGNvbnN0IHsKLSAgICBzaXplX3QgdHJhY2tJbmRleDsKLSAgICBDSEVDSyhtc2ctPmZpbmRTaXplKCJ0cmFja0luZGV4IiwgJnRyYWNrSW5kZXgpKTsKLQotICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gZG9HZXRUcmFja0luZm8odHJhY2tJbmRleCk7Ci0gICAgcmVzcG9uc2UtPnNldE9iamVjdCgiZm9ybWF0IiwgZm9ybWF0KTsKLQotICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwotICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKLSAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOwotfQotCi1zcDxBTWVzc2FnZT4gTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmRvR2V0VHJhY2tJbmZvKHNpemVfdCB0cmFja0luZGV4KSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBzaXplX3QgdHJhY2tDb3VudCA9IG1Tb3VyY2VzLnNpemUoKTsKICAgICBpZiAodHJhY2tJbmRleCA+PSB0cmFja0NvdW50KSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtOTcwLDcgKzkzNCwxMSBAQAogICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbVNvdXJjZXMuaXRlbUF0KHRyYWNrSW5kZXgpLT5nZXRGb3JtYXQoKTsKICAgICBpZiAobWV0YSA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJubyBtZXRhZGF0YSBmb3IgdHJhY2sgJXp1IiwgdHJhY2tJbmRleCk7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJ0eXBlIiwgTUVESUFfVFJBQ0tfVFlQRV9VTktOT1dOKTsKKyAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CisgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJsYW5ndWFnZSIsICJ1bmQiKTsKKworICAgICAgICByZXR1cm4gZm9ybWF0OwogICAgIH0KIAogICAgIGNvbnN0IGNoYXIgKm1pbWU7CkBAIC0xMDEwLDM1ICs5NzgsNyBAQAogfQogCiBzc2l6ZV90IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpnZXRTZWxlY3RlZFRyYWNrKG1lZGlhX3RyYWNrX3R5cGUgdHlwZSkgY29uc3QgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRTZWxlY3RlZFRyYWNrLCB0aGlzKTsKLSAgICBtc2ctPnNldEludDMyKCJ0eXBlIiwgdHlwZSk7Ci0KLSAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7Ci0gICAgaW50MzJfdCBpbmRleDsKLSAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7Ci0gICAgaWYgKGVyciA9PSBPSyAmJiByZXNwb25zZSAhPSBOVUxMKSB7Ci0gICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kSW50MzIoImluZGV4IiwgJmluZGV4KSk7Ci0gICAgICAgIHJldHVybiBpbmRleDsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotfQotCi12b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpvbkdldFNlbGVjdGVkVHJhY2soY29uc3Qgc3A8QU1lc3NhZ2U+JiBtc2cpIGNvbnN0IHsKLSAgICBpbnQzMl90IHRtcFR5cGU7Ci0gICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInR5cGUiLCAmdG1wVHlwZSkpOwotICAgIG1lZGlhX3RyYWNrX3R5cGUgdHlwZSA9IChtZWRpYV90cmFja190eXBlKXRtcFR5cGU7Ci0KLSAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgc3NpemVfdCBpbmRleCA9IGRvR2V0U2VsZWN0ZWRUcmFjayh0eXBlKTsKLSAgICByZXNwb25zZS0+c2V0SW50MzIoImluZGV4IiwgaW5kZXgpOwotCi0gICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7Ci0gICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwotICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7Ci19Ci0KLXNzaXplX3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmRvR2V0U2VsZWN0ZWRUcmFjayhtZWRpYV90cmFja190eXBlIHR5cGUpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGNvbnN0IFRyYWNrICp0cmFjayA9IE5VTEw7CiAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgY2FzZSBNRURJQV9UUkFDS19UWVBFX1ZJREVPOgpAQCAtMTA2NSwzOCArMTAwNSw5IEBACiB9CiAKIHN0YXR1c190IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpzZWxlY3RUcmFjayhzaXplX3QgdHJhY2tJbmRleCwgYm9vbCBzZWxlY3QsIGludDY0X3QgdGltZVVzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBBTE9HVigiJXMgdHJhY2s6ICV6dSIsIHNlbGVjdCA/ICJzZWxlY3QiIDogImRlc2VsZWN0IiwgdHJhY2tJbmRleCk7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlbGVjdFRyYWNrLCB0aGlzKTsKLSAgICBtc2ctPnNldEludDMyKCJ0cmFja0luZGV4IiwgdHJhY2tJbmRleCk7Ci0gICAgbXNnLT5zZXRJbnQzMigic2VsZWN0Iiwgc2VsZWN0KTsKLSAgICBtc2ctPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwogCi0gICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwotICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKLSAgICBpZiAoZXJyID09IE9LICYmIHJlc3BvbnNlICE9IE5VTEwpIHsKLSAgICAgICAgQ0hFQ0socmVzcG9uc2UtPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6Om9uU2VsZWN0VHJhY2soY29uc3Qgc3A8QU1lc3NhZ2U+JiBtc2cpIHsKLSAgICBpbnQzMl90IHRyYWNrSW5kZXgsIHNlbGVjdDsKLSAgICBpbnQ2NF90IHRpbWVVczsKLSAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigidHJhY2tJbmRleCIsICZ0cmFja0luZGV4KSk7Ci0gICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInNlbGVjdCIsICZzZWxlY3QpKTsKLSAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwotCi0gICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgIHN0YXR1c190IGVyciA9IGRvU2VsZWN0VHJhY2sodHJhY2tJbmRleCwgc2VsZWN0LCB0aW1lVXMpOwotICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKLQotICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwotICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKLSAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOwotfQotCi1zdGF0dXNfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6ZG9TZWxlY3RUcmFjayhzaXplX3QgdHJhY2tJbmRleCwgYm9vbCBzZWxlY3QsIGludDY0X3QgdGltZVVzKSB7CiAgICAgaWYgKHRyYWNrSW5kZXggPj0gbVNvdXJjZXMuc2l6ZSgpKSB7CiAgICAgICAgIHJldHVybiBCQURfSU5ERVg7CiAgICAgfQpAQCAtMTE4OCwxMCArMTA5OSwxNCBAQAogfQogCiBzdGF0dXNfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6c2Vla1RvKGludDY0X3Qgc2Vla1RpbWVVcywgTWVkaWFQbGF5ZXJTZWVrTW9kZSBtb2RlKSB7CisgICAgQUxPR1YoInNlZWtUbzogJWxsZCwgJWQiLCAobG9uZyBsb25nKXNlZWtUaW1lVXMsIG1vZGUpOwogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZWVrLCB0aGlzKTsKICAgICBtc2ctPnNldEludDY0KCJzZWVrVGltZVVzIiwgc2Vla1RpbWVVcyk7CiAgICAgbXNnLT5zZXRJbnQzMigibW9kZSIsIG1vZGUpOwogCisgICAgLy8gTmVlZCB0byBjYWxsIHJlYWRCdWZmZXIgb24gfG1Mb29wZXJ8IHRvIGVuc3VyZSB0aGUgY2FsbHMgdG8KKyAgICAvLyBJTWVkaWFTb3VyY2U6OnJlYWQqIGFyZSBzZXJpYWxpemVkLiBOb3RlIHRoYXQgSU1lZGlhU291cmNlOjpyZWFkKgorICAgIC8vIGlzIGNhbGxlZCB3aXRob3V0IHxtTG9ja3wgYWNxdWlyZWQgYW5kIE1lZGlhU291cmNlIGlzIG5vdCB0aHJlYWQgc2FmZS4KICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CiAgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOwogICAgIGlmIChlcnIgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgewpAQCAtMTIxNywxNyArMTEzMiw5IEBACiB9CiAKIHN0YXR1c190IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpkb1NlZWsoaW50NjRfdCBzZWVrVGltZVVzLCBNZWRpYVBsYXllclNlZWtNb2RlIG1vZGUpIHsKLSAgICBtQnVmZmVyaW5nTW9uaXRvci0+dXBkYXRlRGVxdWV1ZWRCdWZmZXJUaW1lKC0xbGwpOwotCi0gICAgLy8gSWYgdGhlIFdpZGV2aW5lIHNvdXJjZSBpcyBzdG9wcGVkLCBkbyBub3QgYXR0ZW1wdCB0byByZWFkIGFueQotICAgIC8vIG1vcmUgYnVmZmVycy4KLSAgICAvLwotICAgIC8vIFRPRE86IHJldmlzaXQgYWZ0ZXIgd2lkZXZpbmUgaXMgcmVtb3ZlZC4gIE1heSBiZSBhYmxlIHRvCi0gICAgLy8gY29tYmluZSBtU3RvcFJlYWQgd2l0aCBtU3RhcnRlZC4KLSAgICBpZiAobVN0b3BSZWFkKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9CiAgICAgaWYgKG1WaWRlb1RyYWNrLm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICArK21WaWRlb0RhdGFHZW5lcmF0aW9uOworCiAgICAgICAgIGludDY0X3QgYWN0dWFsVGltZVVzOwogICAgICAgICByZWFkQnVmZmVyKE1FRElBX1RSQUNLX1RZUEVfVklERU8sIHNlZWtUaW1lVXMsIG1vZGUsICZhY3R1YWxUaW1lVXMpOwogCkBAIC0xMjM4LDcgKzExNDUsOCBAQAogICAgIH0KIAogICAgIGlmIChtQXVkaW9UcmFjay5tU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgcmVhZEJ1ZmZlcihNRURJQV9UUkFDS19UWVBFX0FVRElPLCBzZWVrVGltZVVzKTsKKyAgICAgICAgKyttQXVkaW9EYXRhR2VuZXJhdGlvbjsKKyAgICAgICAgcmVhZEJ1ZmZlcihNRURJQV9UUkFDS19UWVBFX0FVRElPLCBzZWVrVGltZVVzLCBNZWRpYVBsYXllclNlZWtNb2RlOjpTRUVLX0NMT1NFU1QpOwogICAgICAgICBtQXVkaW9MYXN0RGVxdWV1ZVRpbWVVcyA9IHNlZWtUaW1lVXM7CiAgICAgfQogCkBAIC0xMjUyLDE3ICsxMTYwLDEzIEBACiAgICAgICAgIG1GZXRjaFRpbWVkVGV4dERhdGFHZW5lcmF0aW9uKys7CiAgICAgfQogCi0gICAgLy8gSWYgY3VycmVudGx5IGJ1ZmZlcmluZywgcG9zdCBrV2hhdEJ1ZmZlcmluZ0VuZCBmaXJzdCwgc28gdGhhdAotICAgIC8vIE51UGxheWVyIHJlc3VtZXMuIE90aGVyd2lzZSwgaWYgY2FjaGUgaGl0cyBoaWdoIHdhdGVybWFyawotICAgIC8vIGJlZm9yZSBuZXcgcG9sbGluZyBoYXBwZW5zLCBubyBvbmUgd2lsbCByZXN1bWUgdGhlIHBsYXliYWNrLgotICAgIG1CdWZmZXJpbmdNb25pdG9yLT5zdG9wQnVmZmVyaW5nSWZOZWNlc3NhcnkoKTsKLSAgICBtQnVmZmVyaW5nTW9uaXRvci0+cmVzdGFydFBvbGxCdWZmZXJpbmcoKTsKLQorICAgICsrbVBvbGxCdWZmZXJpbmdHZW5lcmF0aW9uOworICAgIHNjaGVkdWxlUG9sbEJ1ZmZlcmluZygpOwogICAgIHJldHVybiBPSzsKIH0KIAogc3A8QUJ1ZmZlcj4gTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6Om1lZGlhQnVmZmVyVG9BQnVmZmVyKAotICAgICAgICBNZWRpYUJ1ZmZlciogbWIsCisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSogbWIsCiAgICAgICAgIG1lZGlhX3RyYWNrX3R5cGUgdHJhY2tUeXBlKSB7CiAgICAgYm9vbCBhdWRpbyA9IHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX0FVRElPOwogICAgIHNpemVfdCBvdXRMZW5ndGggPSBtYi0+cmFuZ2VfbGVuZ3RoKCk7CkBAIC0xMjgwLDE0ICsxMTg0LDEyIEBACiAKICAgICAgICAgLy8gZGF0YSBpcyBhbHJlYWR5IHByb3ZpZGVkIGluIHRoZSBidWZmZXIKICAgICAgICAgYWIgPSBuZXcgQUJ1ZmZlcihOVUxMLCBtYi0+cmFuZ2VfbGVuZ3RoKCkpOwotICAgICAgICBtYi0+YWRkX3JlZigpOwotICAgICAgICBhYi0+c2V0TWVkaWFCdWZmZXJCYXNlKG1iKTsKKyAgICAgICAgYWItPm1ldGEoKS0+c2V0T2JqZWN0KCJtZWRpYUJ1ZmZlckhvbGRlciIsIG5ldyBNZWRpYUJ1ZmZlckhvbGRlcihtYikpOwogCiAgICAgICAgIC8vIE1vZHVsYXIgRFJNOiBSZXF1aXJlZCBiL2Mgb2YgdGhlIGFib3ZlIGFkZF9yZWYuCiAgICAgICAgIC8vIElmIHJlZj4wLCB0aGVyZSBtdXN0IGJlIGFuIG9ic2VydmVyLCBvciBpdCdsbCBjcmFzaCBhdCByZWxlYXNlKCkuCiAgICAgICAgIC8vIFRPRE86IE1lZGlhQnVmZmVyIG1pZ2h0IG5lZWQgdG8gYmUgcmV2aXNlZCB0byBlYXNlIHN1Y2ggbmVlZC4KICAgICAgICAgbWItPnNldE9ic2VydmVyKHRoaXMpOwotICAgICAgICAvLyBzZXRNZWRpYUJ1ZmZlckJhc2UoKSBpbnRlcmVzdGluZ2x5IGRvZXNuJ3QgaW5jcmVtZW50IHRoZSByZWYgY291bnQgb24gaXRzIG93bi4KICAgICAgICAgLy8gRXh0cmEgaW5jcmVtZW50IChzaW5jZSB3ZSB3YW50IHRvIGtlZXAgbWIgYWxpdmUgYW5kIGF0dGFjaGVkIHRvIGFiIGJleW9uZCB0aGlzIGZ1bmN0aW9uCiAgICAgICAgIC8vIGNhbGwuIFRoaXMgaXMgdG8gY291bnRlciB0aGUgZWZmZWN0IG9mIG1iLT5yZWxlYXNlKCkgdG93YXJkcyB0aGUgZW5kLgogICAgICAgICBtYi0+YWRkX3JlZigpOwpAQCAtMTMwMSw3ICsxMjAzLDcgQEAKIAogICAgIGlmIChhdWRpbyAmJiBtQXVkaW9Jc1ZvcmJpcykgewogICAgICAgICBpbnQzMl90IG51bVBhZ2VTYW1wbGVzOwotICAgICAgICBpZiAoIW1iLT5tZXRhX2RhdGEoKS0+ZmluZEludDMyKGtLZXlWYWxpZFNhbXBsZXMsICZudW1QYWdlU2FtcGxlcykpIHsKKyAgICAgICAgaWYgKCFtYi0+bWV0YV9kYXRhKCkuZmluZEludDMyKGtLZXlWYWxpZFNhbXBsZXMsICZudW1QYWdlU2FtcGxlcykpIHsKICAgICAgICAgICAgIG51bVBhZ2VTYW1wbGVzID0gLTE7CiAgICAgICAgIH0KIApAQCAtMTMxMiwxMiArMTIxNCwxMiBAQAogICAgIHNwPEFNZXNzYWdlPiBtZXRhID0gYWItPm1ldGEoKTsKIAogICAgIGludDY0X3QgdGltZVVzOwotICAgIENIRUNLKG1iLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7CisgICAgQ0hFQ0sobWItPm1ldGFfZGF0YSgpLmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOwogICAgIG1ldGEtPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwogCiAgICAgaWYgKHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1ZJREVPKSB7CiAgICAgICAgIGludDMyX3QgbGF5ZXJJZDsKLSAgICAgICAgaWYgKG1iLT5tZXRhX2RhdGEoKS0+ZmluZEludDMyKGtLZXlUZW1wb3JhbExheWVySWQsICZsYXllcklkKSkgeworICAgICAgICBpZiAobWItPm1ldGFfZGF0YSgpLmZpbmRJbnQzMihrS2V5VGVtcG9yYWxMYXllcklkLCAmbGF5ZXJJZCkpIHsKICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKCJ0ZW1wb3JhbC1sYXllci1pZCIsIGxheWVySWQpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTMzMCwyOCArMTIzMiwyOCBAQAogICAgIH0KIAogICAgIGludDY0X3QgZHVyYXRpb25VczsKLSAgICBpZiAobWItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb25VcykpIHsKKyAgICBpZiAobWItPm1ldGFfZGF0YSgpLmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvblVzKSkgewogICAgICAgICBtZXRhLT5zZXRJbnQ2NCgiZHVyYXRpb25VcyIsIGR1cmF0aW9uVXMpOwogICAgIH0KIAogICAgIGlmICh0cmFja1R5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRSkgewotICAgICAgICBtZXRhLT5zZXRJbnQzMigidHJhY2tJbmRleCIsIG1TdWJ0aXRsZVRyYWNrLm1JbmRleCk7CisgICAgICAgIG1ldGEtPnNldEludDMyKCJ0cmFjay1pbmRleCIsIG1TdWJ0aXRsZVRyYWNrLm1JbmRleCk7CiAgICAgfQogCiAgICAgdWludDMyX3QgZGF0YVR5cGU7IC8vIHVudXNlZAogICAgIGNvbnN0IHZvaWQgKnNlaURhdGE7CiAgICAgc2l6ZV90IHNlaUxlbmd0aDsKLSAgICBpZiAobWItPm1ldGFfZGF0YSgpLT5maW5kRGF0YShrS2V5U0VJLCAmZGF0YVR5cGUsICZzZWlEYXRhLCAmc2VpTGVuZ3RoKSkgeworICAgIGlmIChtYi0+bWV0YV9kYXRhKCkuZmluZERhdGEoa0tleVNFSSwgJmRhdGFUeXBlLCAmc2VpRGF0YSwgJnNlaUxlbmd0aCkpIHsKICAgICAgICAgc3A8QUJ1ZmZlcj4gc2VpID0gQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KHNlaURhdGEsIHNlaUxlbmd0aCk7OwogICAgICAgICBtZXRhLT5zZXRCdWZmZXIoInNlaSIsIHNlaSk7CiAgICAgfQogCiAgICAgY29uc3Qgdm9pZCAqbXBlZ1VzZXJEYXRhUG9pbnRlcjsKICAgICBzaXplX3QgbXBlZ1VzZXJEYXRhTGVuZ3RoOwotICAgIGlmIChtYi0+bWV0YV9kYXRhKCktPmZpbmREYXRhKAorICAgIGlmIChtYi0+bWV0YV9kYXRhKCkuZmluZERhdGEoCiAgICAgICAgICAgICBrS2V5TXBlZ1VzZXJEYXRhLCAmZGF0YVR5cGUsICZtcGVnVXNlckRhdGFQb2ludGVyLCAmbXBlZ1VzZXJEYXRhTGVuZ3RoKSkgewogICAgICAgICBzcDxBQnVmZmVyPiBtcGVnVXNlckRhdGEgPSBBQnVmZmVyOjpDcmVhdGVBc0NvcHkobXBlZ1VzZXJEYXRhUG9pbnRlciwgbXBlZ1VzZXJEYXRhTGVuZ3RoKTsKLSAgICAgICAgbWV0YS0+c2V0QnVmZmVyKCJtcGVnVXNlckRhdGEiLCBtcGVnVXNlckRhdGEpOworICAgICAgICBtZXRhLT5zZXRCdWZmZXIoIm1wZWctdXNlci1kYXRhIiwgbXBlZ1VzZXJEYXRhKTsKICAgICB9CiAKICAgICBtYi0+cmVsZWFzZSgpOwpAQCAtMTM2MCw5ICsxMjYyLDI5IEBACiAgICAgcmV0dXJuIGFiOwogfQogCi12b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpwb3N0UmVhZEJ1ZmZlcihtZWRpYV90cmFja190eXBlIHRyYWNrVHlwZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtUmVhZEJ1ZmZlckxvY2spOworaW50MzJfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6Z2V0RGF0YUdlbmVyYXRpb24obWVkaWFfdHJhY2tfdHlwZSB0eXBlKSBjb25zdCB7CisgICAgaW50MzJfdCBnZW5lcmF0aW9uID0gLTE7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBNRURJQV9UUkFDS19UWVBFX1ZJREVPOgorICAgICAgICBnZW5lcmF0aW9uID0gbVZpZGVvRGF0YUdlbmVyYXRpb247CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUVESUFfVFJBQ0tfVFlQRV9BVURJTzoKKyAgICAgICAgZ2VuZXJhdGlvbiA9IG1BdWRpb0RhdGFHZW5lcmF0aW9uOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1FRElBX1RSQUNLX1RZUEVfVElNRURURVhUOgorICAgICAgICBnZW5lcmF0aW9uID0gbUZldGNoVGltZWRUZXh0RGF0YUdlbmVyYXRpb247CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRToKKyAgICAgICAgZ2VuZXJhdGlvbiA9IG1GZXRjaFN1YnRpdGxlRGF0YUdlbmVyYXRpb247CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KIAorICAgIHJldHVybiBnZW5lcmF0aW9uOworfQorCit2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpwb3N0UmVhZEJ1ZmZlcihtZWRpYV90cmFja190eXBlIHRyYWNrVHlwZSkgewogICAgIGlmICgobVBlbmRpbmdSZWFkQnVmZmVyVHlwZXMgJiAoMSA8PCB0cmFja1R5cGUpKSA9PSAwKSB7CiAgICAgICAgIG1QZW5kaW5nUmVhZEJ1ZmZlclR5cGVzIHw9ICgxIDw8IHRyYWNrVHlwZSk7CiAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZWFkQnVmZmVyLCB0aGlzKTsKQEAgLTEzNzUsMjUgKzEyOTcsMTMgQEAKICAgICBpbnQzMl90IHRtcFR5cGU7CiAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInRyYWNrVHlwZSIsICZ0bXBUeXBlKSk7CiAgICAgbWVkaWFfdHJhY2tfdHlwZSB0cmFja1R5cGUgPSAobWVkaWFfdHJhY2tfdHlwZSl0bXBUeXBlOworICAgIG1QZW5kaW5nUmVhZEJ1ZmZlclR5cGVzICY9IH4oMSA8PCB0cmFja1R5cGUpOwogICAgIHJlYWRCdWZmZXIodHJhY2tUeXBlKTsKLSAgICB7Ci0gICAgICAgIC8vIG9ubHkgcHJvdGVjdCB0aGUgdmFyaWFibGUgY2hhbmdlLCBhcyByZWFkQnVmZmVyIG1heQotICAgICAgICAvLyB0YWtlIGNvbnNpZGVyYWJsZSB0aW1lLgotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVJlYWRCdWZmZXJMb2NrKTsKLSAgICAgICAgbVBlbmRpbmdSZWFkQnVmZmVyVHlwZXMgJj0gfigxIDw8IHRyYWNrVHlwZSk7Ci0gICAgfQogfQogCiB2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpyZWFkQnVmZmVyKAogICAgICAgICBtZWRpYV90cmFja190eXBlIHRyYWNrVHlwZSwgaW50NjRfdCBzZWVrVGltZVVzLCBNZWRpYVBsYXllclNlZWtNb2RlIG1vZGUsCiAgICAgICAgIGludDY0X3QgKmFjdHVhbFRpbWVVcywgYm9vbCBmb3JtYXRDaGFuZ2UpIHsKLSAgICAvLyBEbyBub3QgcmVhZCBkYXRhIGlmIFdpZGV2aW5lIHNvdXJjZSBpcyBzdG9wcGVkCi0gICAgLy8KLSAgICAvLyBUT0RPOiByZXZpc2l0IGFmdGVyIHdpZGV2aW5lIGlzIHJlbW92ZWQuICBNYXkgYmUgYWJsZSB0bwotICAgIC8vIGNvbWJpbmUgbVN0b3BSZWFkIHdpdGggbVN0YXJ0ZWQuCi0gICAgaWYgKG1TdG9wUmVhZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQogICAgIFRyYWNrICp0cmFjazsKICAgICBzaXplX3QgbWF4QnVmZmVycyA9IDE7CiAgICAgc3dpdGNoICh0cmFja1R5cGUpIHsKQEAgLTE0MzcsMzkgKzEzNDcsNTAgQEAKICAgICAgICAgb3B0aW9ucy5zZXROb25CbG9ja2luZygpOwogICAgIH0KIAorICAgIGludDMyX3QgZ2VuZXJhdGlvbiA9IGdldERhdGFHZW5lcmF0aW9uKHRyYWNrVHlwZSk7CiAgICAgZm9yIChzaXplX3QgbnVtQnVmZmVycyA9IDA7IG51bUJ1ZmZlcnMgPCBtYXhCdWZmZXJzOyApIHsKLSAgICAgICAgVmVjdG9yPE1lZGlhQnVmZmVyICo+IG1lZGlhQnVmZmVyczsKKyAgICAgICAgVmVjdG9yPE1lZGlhQnVmZmVyQmFzZSAqPiBtZWRpYUJ1ZmZlcnM7CiAgICAgICAgIHN0YXR1c190IGVyciA9IE5PX0VSUk9SOwogCisgICAgICAgIHNwPElNZWRpYVNvdXJjZT4gc291cmNlID0gdHJhY2stPm1Tb3VyY2U7CisgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICBpZiAoY291bGRSZWFkTXVsdGlwbGUpIHsKLSAgICAgICAgICAgIGVyciA9IHRyYWNrLT5tU291cmNlLT5yZWFkTXVsdGlwbGUoCisgICAgICAgICAgICBlcnIgPSBzb3VyY2UtPnJlYWRNdWx0aXBsZSgKICAgICAgICAgICAgICAgICAgICAgJm1lZGlhQnVmZmVycywgbWF4QnVmZmVycyAtIG51bUJ1ZmZlcnMsICZvcHRpb25zKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyICptYnVmID0gTlVMTDsKLSAgICAgICAgICAgIGVyciA9IHRyYWNrLT5tU291cmNlLT5yZWFkKCZtYnVmLCAmb3B0aW9ucyk7CisgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKm1idWYgPSBOVUxMOworICAgICAgICAgICAgZXJyID0gc291cmNlLT5yZWFkKCZtYnVmLCAmb3B0aW9ucyk7CiAgICAgICAgICAgICBpZiAoZXJyID09IE9LICYmIG1idWYgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIG1lZGlhQnVmZmVycy5wdXNoX2JhY2sobWJ1Zik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgbUxvY2subG9jaygpOwogCiAgICAgICAgIG9wdGlvbnMuY2xlYXJOb25QZXJzaXN0ZW50KCk7CiAKICAgICAgICAgc2l6ZV90IGlkID0gMDsKICAgICAgICAgc2l6ZV90IGNvdW50ID0gbWVkaWFCdWZmZXJzLnNpemUoKTsKKworICAgICAgICAvLyBpbiBjYXNlIHRyYWNrIGhhcyBiZWVuIGNoYW5nZWQgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBsb2NrIGZvciBzb21lIHRpbWUuCisgICAgICAgIGlmIChnZW5lcmF0aW9uICE9IGdldERhdGFHZW5lcmF0aW9uKHRyYWNrVHlwZSkpIHsKKyAgICAgICAgICAgIGZvciAoOyBpZCA8IGNvdW50OyArK2lkKSB7CisgICAgICAgICAgICAgICAgbWVkaWFCdWZmZXJzW2lkXS0+cmVsZWFzZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBmb3IgKDsgaWQgPCBjb3VudDsgKytpZCkgewogICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqbWJ1ZiA9IG1lZGlhQnVmZmVyc1tpZF07Ci0gICAgICAgICAgICBpZiAoIW1idWYtPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKSB7Ci0gICAgICAgICAgICAgICAgbWJ1Zi0+bWV0YV9kYXRhKCktPmR1bXBUb0xvZygpOworICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICptYnVmID0gbWVkaWFCdWZmZXJzW2lkXTsKKyAgICAgICAgICAgIGlmICghbWJ1Zi0+bWV0YV9kYXRhKCkuZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSkgeworICAgICAgICAgICAgICAgIG1idWYtPm1ldGFfZGF0YSgpLmR1bXBUb0xvZygpOwogICAgICAgICAgICAgICAgIHRyYWNrLT5tUGFja2V0cy0+c2lnbmFsRU9TKEVSUk9SX01BTEZPUk1FRCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAodHJhY2tUeXBlID09IE1FRElBX1RSQUNLX1RZUEVfQVVESU8pIHsKICAgICAgICAgICAgICAgICBtQXVkaW9UaW1lVXMgPSB0aW1lVXM7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlcmluZ01vbml0b3ItPnVwZGF0ZVF1ZXVlZFRpbWUodHJ1ZSAvKiBpc0F1ZGlvICovLCB0aW1lVXMpOwogICAgICAgICAgICAgfSBlbHNlIGlmICh0cmFja1R5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9WSURFTykgewogICAgICAgICAgICAgICAgIG1WaWRlb1RpbWVVcyA9IHRpbWVVczsKLSAgICAgICAgICAgICAgICBtQnVmZmVyaW5nTW9uaXRvci0+dXBkYXRlUXVldWVkVGltZShmYWxzZSAvKiBpc0F1ZGlvICovLCB0aW1lVXMpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBxdWV1ZURpc2NvbnRpbnVpdHlJZk5lZWRlZChzZWVraW5nLCBmb3JtYXRDaGFuZ2UsIHRyYWNrVHlwZSwgdHJhY2spOwpAQCAtMTUxNiw2ICsxNDM3LDQxIEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KKworICAgIGlmIChtSXNTdHJlYW1pbmcKKyAgICAgICAgJiYgKHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1ZJREVPIHx8IHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX0FVRElPKSkgeworICAgICAgICBzdGF0dXNfdCBmaW5hbFJlc3VsdDsKKyAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzID0gdHJhY2stPm1QYWNrZXRzLT5nZXRCdWZmZXJlZER1cmF0aW9uVXMoJmZpbmFsUmVzdWx0KTsKKworICAgICAgICAvLyBUT0RPOiBtYXhSZWJ1ZmZlcmluZ01hcmtNcyBjb3VsZCBiZSBsYXJnZXIgdGhhbgorICAgICAgICAvLyBtQnVmZmVyaW5nU2V0dGluZ3MubVJlc3VtZVBsYXliYWNrTWFya01zCisgICAgICAgIGludDY0X3QgbWFya1VzID0gKG1QcmVwYXJpbmcgPyBtQnVmZmVyaW5nU2V0dGluZ3MubUluaXRpYWxNYXJrTXMKKyAgICAgICAgICAgIDogbUJ1ZmZlcmluZ1NldHRpbmdzLm1SZXN1bWVQbGF5YmFja01hcmtNcykgKiAxMDAwbGw7CisgICAgICAgIGlmIChmaW5hbFJlc3VsdCA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNIHx8IGR1cmF0aW9uVXMgPj0gbWFya1VzKSB7CisgICAgICAgICAgICBpZiAobVByZXBhcmluZyB8fCBtU2VudFBhdXNlT25CdWZmZXJpbmcpIHsKKyAgICAgICAgICAgICAgICBUcmFjayAqY291bnRlclRyYWNrID0KKyAgICAgICAgICAgICAgICAgICAgKHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1ZJREVPID8gJm1BdWRpb1RyYWNrIDogJm1WaWRlb1RyYWNrKTsKKyAgICAgICAgICAgICAgICBpZiAoY291bnRlclRyYWNrLT5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25VcyA9IGNvdW50ZXJUcmFjay0+bVBhY2tldHMtPmdldEJ1ZmZlcmVkRHVyYXRpb25VcygmZmluYWxSZXN1bHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZmluYWxSZXN1bHQgPT0gRVJST1JfRU5EX09GX1NUUkVBTSB8fCBkdXJhdGlvblVzID49IG1hcmtVcykgeworICAgICAgICAgICAgICAgICAgICBpZiAobVByZXBhcmluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5UHJlcGFyZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QcmVwYXJpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRDYWNoZVN0YXRzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtU2VudFBhdXNlT25CdWZmZXJpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFJlc3VtZU9uQnVmZmVyaW5nRW5kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgcG9zdFJlYWRCdWZmZXIodHJhY2tUeXBlKTsKKyAgICB9CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnF1ZXVlRGlzY29udGludWl0eUlmTmVlZGVkKApAQCAtMTUzMywxNjAgKzE0ODksNyBAQAogICAgIH0KIH0KIAotTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OkJ1ZmZlcmluZ01vbml0b3I6OkJ1ZmZlcmluZ01vbml0b3IoY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpCi0gICAgOiBtTm90aWZ5KG5vdGlmeSksCi0gICAgICBtRHVyYXRpb25VcygtMWxsKSwKLSAgICAgIG1CaXRyYXRlKC0xbGwpLAotICAgICAgbUlzU3RyZWFtaW5nKGZhbHNlKSwKLSAgICAgIG1BdWRpb1RpbWVVcygwKSwKLSAgICAgIG1WaWRlb1RpbWVVcygwKSwKLSAgICAgIG1Qb2xsQnVmZmVyaW5nR2VuZXJhdGlvbigwKSwKLSAgICAgIG1QcmVwYXJlQnVmZmVyaW5nKGZhbHNlKSwKLSAgICAgIG1CdWZmZXJpbmcoZmFsc2UpLAotICAgICAgbVByZXZCdWZmZXJQZXJjZW50YWdlKC0xKSwKLSAgICAgIG1PZmZsb2FkQXVkaW8oZmFsc2UpLAotICAgICAgbUZpcnN0RGVxdWV1ZWRCdWZmZXJSZWFsVXMoLTFsbCksCi0gICAgICBtRmlyc3REZXF1ZXVlZEJ1ZmZlck1lZGlhVXMoLTFsbCksCi0gICAgICBtbGFzdERlcXVldWVkQnVmZmVyTWVkaWFVcygtMWxsKSB7Ci0gICAgICBnZXREZWZhdWx0QnVmZmVyaW5nU2V0dGluZ3MoJm1TZXR0aW5ncyk7Ci19Ci0KLU51UGxheWVyOjpHZW5lcmljU291cmNlOjpCdWZmZXJpbmdNb25pdG9yOjp+QnVmZmVyaW5nTW9uaXRvcigpIHsKLX0KLQotdm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6QnVmZmVyaW5nTW9uaXRvcjo6Z2V0RGVmYXVsdEJ1ZmZlcmluZ1NldHRpbmdzKAotICAgICAgICBCdWZmZXJpbmdTZXR0aW5ncyAqYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pIHsKLSAgICBidWZmZXJpbmctPm1Jbml0aWFsQnVmZmVyaW5nTW9kZSA9IEJVRkZFUklOR19NT0RFX1RJTUVfT05MWTsKLSAgICBidWZmZXJpbmctPm1SZWJ1ZmZlcmluZ01vZGUgPSBCVUZGRVJJTkdfTU9ERV9USU1FX1RIRU5fU0laRTsKLSAgICBidWZmZXJpbmctPm1Jbml0aWFsV2F0ZXJtYXJrTXMgPSBrSGlnaFdhdGVyTWFya01zOwotICAgIGJ1ZmZlcmluZy0+bVJlYnVmZmVyaW5nV2F0ZXJtYXJrTG93TXMgPSBrTG93V2F0ZXJNYXJrTXM7Ci0gICAgYnVmZmVyaW5nLT5tUmVidWZmZXJpbmdXYXRlcm1hcmtIaWdoTXMgPSBrSGlnaFdhdGVyTWFya1JlYnVmZmVyTXM7Ci0gICAgYnVmZmVyaW5nLT5tUmVidWZmZXJpbmdXYXRlcm1hcmtMb3dLQiA9IGtMb3dXYXRlck1hcmtLQjsKLSAgICBidWZmZXJpbmctPm1SZWJ1ZmZlcmluZ1dhdGVybWFya0hpZ2hLQiA9IGtIaWdoV2F0ZXJNYXJrS0I7Ci0KLSAgICBBTE9HVigiQnVmZmVyaW5nTW9uaXRvcjo6Z2V0RGVmYXVsdEJ1ZmZlcmluZ1NldHRpbmdzeyVzfSIsCi0gICAgICAgICAgICBidWZmZXJpbmctPnRvU3RyaW5nKCkuc3RyaW5nKCkpOwotfQotCi1zdGF0dXNfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6QnVmZmVyaW5nTW9uaXRvcjo6c2V0QnVmZmVyaW5nU2V0dGluZ3MoCi0gICAgICAgIGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzICZidWZmZXJpbmcpIHsKLSAgICBBTE9HVigiQnVmZmVyaW5nTW9uaXRvcjo6c2V0QnVmZmVyaW5nU2V0dGluZ3N7JXN9IiwKLSAgICAgICAgICAgIGJ1ZmZlcmluZy50b1N0cmluZygpLnN0cmluZygpKTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKGJ1ZmZlcmluZy5Jc1NpemVCYXNlZEJ1ZmZlcmluZ01vZGUoYnVmZmVyaW5nLm1Jbml0aWFsQnVmZmVyaW5nTW9kZSkKLSAgICAgICAgICAgIHx8IChidWZmZXJpbmcuSXNUaW1lQmFzZWRCdWZmZXJpbmdNb2RlKGJ1ZmZlcmluZy5tUmVidWZmZXJpbmdNb2RlKQotICAgICAgICAgICAgICAgICYmIGJ1ZmZlcmluZy5tUmVidWZmZXJpbmdXYXRlcm1hcmtMb3dNcyA+IGJ1ZmZlcmluZy5tUmVidWZmZXJpbmdXYXRlcm1hcmtIaWdoTXMpCi0gICAgICAgICAgICB8fCAoYnVmZmVyaW5nLklzU2l6ZUJhc2VkQnVmZmVyaW5nTW9kZShidWZmZXJpbmcubVJlYnVmZmVyaW5nTW9kZSkKLSAgICAgICAgICAgICAgICAmJiBidWZmZXJpbmcubVJlYnVmZmVyaW5nV2F0ZXJtYXJrTG93S0IgPiBidWZmZXJpbmcubVJlYnVmZmVyaW5nV2F0ZXJtYXJrSGlnaEtCKSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBtU2V0dGluZ3MgPSBidWZmZXJpbmc7Ci0gICAgaWYgKG1TZXR0aW5ncy5tSW5pdGlhbEJ1ZmZlcmluZ01vZGUgPT0gQlVGRkVSSU5HX01PREVfTk9ORSkgewotICAgICAgICBtU2V0dGluZ3MubUluaXRpYWxXYXRlcm1hcmtNcyA9IEJ1ZmZlcmluZ1NldHRpbmdzOjprTm9XYXRlcm1hcms7Ci0gICAgfQotICAgIGlmICghbVNldHRpbmdzLklzVGltZUJhc2VkQnVmZmVyaW5nTW9kZShtU2V0dGluZ3MubVJlYnVmZmVyaW5nTW9kZSkpIHsKLSAgICAgICAgbVNldHRpbmdzLm1SZWJ1ZmZlcmluZ1dhdGVybWFya0xvd01zID0gQnVmZmVyaW5nU2V0dGluZ3M6OmtOb1dhdGVybWFyazsKLSAgICAgICAgbVNldHRpbmdzLm1SZWJ1ZmZlcmluZ1dhdGVybWFya0hpZ2hNcyA9IElOVDMyX01BWDsKLSAgICB9Ci0gICAgaWYgKCFtU2V0dGluZ3MuSXNTaXplQmFzZWRCdWZmZXJpbmdNb2RlKG1TZXR0aW5ncy5tUmVidWZmZXJpbmdNb2RlKSkgewotICAgICAgICBtU2V0dGluZ3MubVJlYnVmZmVyaW5nV2F0ZXJtYXJrTG93S0IgPSBCdWZmZXJpbmdTZXR0aW5nczo6a05vV2F0ZXJtYXJrOwotICAgICAgICBtU2V0dGluZ3MubVJlYnVmZmVyaW5nV2F0ZXJtYXJrSGlnaEtCID0gSU5UMzJfTUFYOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OkJ1ZmZlcmluZ01vbml0b3I6OnByZXBhcmUoCi0gICAgICAgIGNvbnN0IHNwPE51Q2FjaGVkU291cmNlMj4gJmNhY2hlZFNvdXJjZSwKLSAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzLAotICAgICAgICBpbnQ2NF90IGJpdHJhdGUsCi0gICAgICAgIGJvb2wgaXNTdHJlYW1pbmcpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHByZXBhcmVfbChjYWNoZWRTb3VyY2UsIGR1cmF0aW9uVXMsIGJpdHJhdGUsIGlzU3RyZWFtaW5nKTsKLX0KLQotdm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6QnVmZmVyaW5nTW9uaXRvcjo6c3RvcCgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHByZXBhcmVfbChOVUxMIC8qIGNhY2hlZFNvdXJjZSAqLywgLTEgLyogZHVyYXRpb25VcyAqLywKLSAgICAgICAgICAgIC0xIC8qIGJpdHJhdGUgKi8sIGZhbHNlIC8qIGlzU3RyZWFtaW5nICovKTsKLX0KLQotdm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6QnVmZmVyaW5nTW9uaXRvcjo6Y2FuY2VsUG9sbEJ1ZmZlcmluZygpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGNhbmNlbFBvbGxCdWZmZXJpbmdfbCgpOwotfQotCi12b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpCdWZmZXJpbmdNb25pdG9yOjpyZXN0YXJ0UG9sbEJ1ZmZlcmluZygpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtSXNTdHJlYW1pbmcpIHsKLSAgICAgICAgY2FuY2VsUG9sbEJ1ZmZlcmluZ19sKCk7Ci0gICAgICAgIG9uUG9sbEJ1ZmZlcmluZ19sKCk7Ci0gICAgfQotfQotCi12b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpCdWZmZXJpbmdNb25pdG9yOjpzdG9wQnVmZmVyaW5nSWZOZWNlc3NhcnkoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBzdG9wQnVmZmVyaW5nSWZOZWNlc3NhcnlfbCgpOwotfQotCi12b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpCdWZmZXJpbmdNb25pdG9yOjplbnN1cmVDYWNoZUlzRmV0Y2hpbmcoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBlbnN1cmVDYWNoZUlzRmV0Y2hpbmdfbCgpOwotfQotCi12b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpCdWZmZXJpbmdNb25pdG9yOjp1cGRhdGVRdWV1ZWRUaW1lKGJvb2wgaXNBdWRpbywgaW50NjRfdCB0aW1lVXMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChpc0F1ZGlvKSB7Ci0gICAgICAgIG1BdWRpb1RpbWVVcyA9IHRpbWVVczsKLSAgICB9IGVsc2UgewotICAgICAgICBtVmlkZW9UaW1lVXMgPSB0aW1lVXM7Ci0gICAgfQotfQotCi12b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpCdWZmZXJpbmdNb25pdG9yOjpzZXRPZmZsb2FkQXVkaW8oYm9vbCBvZmZsb2FkKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBtT2ZmbG9hZEF1ZGlvID0gb2ZmbG9hZDsKLX0KLQotdm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6QnVmZmVyaW5nTW9uaXRvcjo6dXBkYXRlRGVxdWV1ZWRCdWZmZXJUaW1lKGludDY0X3QgbWVkaWFVcykgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1lZGlhVXMgPCAwKSB7Ci0gICAgICAgIG1GaXJzdERlcXVldWVkQnVmZmVyUmVhbFVzID0gLTFsbDsKLSAgICAgICAgbUZpcnN0RGVxdWV1ZWRCdWZmZXJNZWRpYVVzID0gLTFsbDsKLSAgICB9IGVsc2UgaWYgKG1GaXJzdERlcXVldWVkQnVmZmVyUmVhbFVzIDwgMCkgewotICAgICAgICBtRmlyc3REZXF1ZXVlZEJ1ZmZlclJlYWxVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0gICAgICAgIG1GaXJzdERlcXVldWVkQnVmZmVyTWVkaWFVcyA9IG1lZGlhVXM7Ci0gICAgfQotICAgIG1sYXN0RGVxdWV1ZWRCdWZmZXJNZWRpYVVzID0gbWVkaWFVczsKLX0KLQotdm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6QnVmZmVyaW5nTW9uaXRvcjo6cHJlcGFyZV9sKAotICAgICAgICBjb25zdCBzcDxOdUNhY2hlZFNvdXJjZTI+ICZjYWNoZWRTb3VyY2UsCi0gICAgICAgIGludDY0X3QgZHVyYXRpb25VcywKLSAgICAgICAgaW50NjRfdCBiaXRyYXRlLAotICAgICAgICBib29sIGlzU3RyZWFtaW5nKSB7Ci0KLSAgICBtQ2FjaGVkU291cmNlID0gY2FjaGVkU291cmNlOwotICAgIG1EdXJhdGlvblVzID0gZHVyYXRpb25VczsKLSAgICBtQml0cmF0ZSA9IGJpdHJhdGU7Ci0gICAgbUlzU3RyZWFtaW5nID0gaXNTdHJlYW1pbmc7Ci0gICAgbUF1ZGlvVGltZVVzID0gMDsKLSAgICBtVmlkZW9UaW1lVXMgPSAwOwotICAgIG1QcmVwYXJlQnVmZmVyaW5nID0gKGNhY2hlZFNvdXJjZSAhPSBOVUxMKTsKLSAgICBjYW5jZWxQb2xsQnVmZmVyaW5nX2woKTsKLSAgICBtT2ZmbG9hZEF1ZGlvID0gZmFsc2U7Ci0gICAgbUZpcnN0RGVxdWV1ZWRCdWZmZXJSZWFsVXMgPSAtMWxsOwotICAgIG1GaXJzdERlcXVldWVkQnVmZmVyTWVkaWFVcyA9IC0xbGw7Ci0gICAgbWxhc3REZXF1ZXVlZEJ1ZmZlck1lZGlhVXMgPSAtMWxsOwotfQotCi12b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpCdWZmZXJpbmdNb25pdG9yOjpjYW5jZWxQb2xsQnVmZmVyaW5nX2woKSB7Ci0gICAgbUJ1ZmZlcmluZyA9IGZhbHNlOwotICAgICsrbVBvbGxCdWZmZXJpbmdHZW5lcmF0aW9uOwotICAgIG1QcmV2QnVmZmVyUGVyY2VudGFnZSA9IC0xOwotfQotCi12b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpCdWZmZXJpbmdNb25pdG9yOjpub3RpZnlCdWZmZXJpbmdVcGRhdGVfbChpbnQzMl90IHBlcmNlbnRhZ2UpIHsKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6Om5vdGlmeUJ1ZmZlcmluZ1VwZGF0ZShpbnQzMl90IHBlcmNlbnRhZ2UpIHsKICAgICAvLyBCdWZmZXJpbmcgcGVyY2VudCBjb3VsZCBnbyBiYWNrd2FyZCBhcyBpdCdzIGVzdGltYXRlZCBmcm9tIHJlbWFpbmluZwogICAgIC8vIGRhdGEgYW5kIGxhc3QgYWNjZXNzIHRpbWUuIFRoaXMgY291bGQgY2F1c2UgdGhlIGJ1ZmZlcmluZyBwb3NpdGlvbgogICAgIC8vIGRyYXduIG9uIG1lZGlhIGNvbnRyb2wgdG8gaml0dGVyIHNsaWdodGx5LiBSZW1lbWJlciBwcmV2aW91c2x5IHJlcG9ydGVkCkBAIC0xNjk5LDEwNiArMTUwMiwyOCBAQAogCiAgICAgbVByZXZCdWZmZXJQZXJjZW50YWdlID0gcGVyY2VudGFnZTsKIAotICAgIEFMT0dWKCJub3RpZnlCdWZmZXJpbmdVcGRhdGVfbDogYnVmZmVyaW5nICVkJSUiLCBwZXJjZW50YWdlKTsKKyAgICBBTE9HVigibm90aWZ5QnVmZmVyaW5nVXBkYXRlOiBidWZmZXJpbmcgJWQlJSIsIHBlcmNlbnRhZ2UpOwogCi0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1Ob3RpZnktPmR1cCgpOwotICAgIG1zZy0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEJ1ZmZlcmluZ1VwZGF0ZSk7Ci0gICAgbXNnLT5zZXRJbnQzMigicGVyY2VudGFnZSIsIHBlcmNlbnRhZ2UpOwotICAgIG1zZy0+cG9zdCgpOworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRCdWZmZXJpbmdVcGRhdGUpOworICAgIG5vdGlmeS0+c2V0SW50MzIoInBlcmNlbnRhZ2UiLCBwZXJjZW50YWdlKTsKKyAgICBub3RpZnktPnBvc3QoKTsKIH0KIAotdm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6QnVmZmVyaW5nTW9uaXRvcjo6c3RhcnRCdWZmZXJpbmdJZk5lY2Vzc2FyeV9sKCkgewotICAgIGlmIChtUHJlcGFyZUJ1ZmZlcmluZykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCFtQnVmZmVyaW5nKSB7Ci0gICAgICAgIEFMT0dEKCJzdGFydEJ1ZmZlcmluZ0lmTmVjZXNzYXJ5X2wiKTsKLQotICAgICAgICBtQnVmZmVyaW5nID0gdHJ1ZTsKLQotICAgICAgICBlbnN1cmVDYWNoZUlzRmV0Y2hpbmdfbCgpOwotICAgICAgICBzZW5kQ2FjaGVTdGF0c19sKCk7Ci0KLSAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRQYXVzZU9uQnVmZmVyaW5nU3RhcnQpOwotICAgICAgICBub3RpZnktPnBvc3QoKTsKLSAgICB9Ci19Ci0KLXZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OkJ1ZmZlcmluZ01vbml0b3I6OnN0b3BCdWZmZXJpbmdJZk5lY2Vzc2FyeV9sKCkgewotICAgIGlmIChtUHJlcGFyZUJ1ZmZlcmluZykgewotICAgICAgICBBTE9HRCgic3RvcEJ1ZmZlcmluZ0lmTmVjZXNzYXJ5X2wsIG1CdWZmZXJpbmc9JWQiLCBtQnVmZmVyaW5nKTsKLQotICAgICAgICBtUHJlcGFyZUJ1ZmZlcmluZyA9IGZhbHNlOwotCi0gICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0UHJlcGFyZWQpOwotICAgICAgICBub3RpZnktPnNldEludDMyKCJlcnIiLCBPSyk7Ci0gICAgICAgIG5vdGlmeS0+cG9zdCgpOwotCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobUJ1ZmZlcmluZykgewotICAgICAgICBBTE9HRCgic3RvcEJ1ZmZlcmluZ0lmTmVjZXNzYXJ5X2wiKTsKLSAgICAgICAgbUJ1ZmZlcmluZyA9IGZhbHNlOwotCi0gICAgICAgIHNlbmRDYWNoZVN0YXRzX2woKTsKLQotICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFJlc3VtZU9uQnVmZmVyaW5nRW5kKTsKLSAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0gICAgfQotfQotCi12b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpCdWZmZXJpbmdNb25pdG9yOjpzZW5kQ2FjaGVTdGF0c19sKCkgewotICAgIGludDMyX3Qga2JwcyA9IDA7Ci0gICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKLQotICAgIGlmIChtQ2FjaGVkU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgZXJyID0gbUNhY2hlZFNvdXJjZS0+Z2V0RXN0aW1hdGVkQmFuZHdpZHRoS2Jwcygma2Jwcyk7Ci0gICAgfQotCi0gICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdENhY2hlU3RhdHMpOwotICAgICAgICBub3RpZnktPnNldEludDMyKCJiYW5kd2lkdGgiLCBrYnBzKTsKLSAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0gICAgfQotfQotCi12b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpCdWZmZXJpbmdNb25pdG9yOjplbnN1cmVDYWNoZUlzRmV0Y2hpbmdfbCgpIHsKLSAgICBpZiAobUNhY2hlZFNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1DYWNoZWRTb3VyY2UtPnJlc3VtZUZldGNoaW5nSWZOZWNlc3NhcnkoKTsKLSAgICB9Ci19Ci0KLXZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OkJ1ZmZlcmluZ01vbml0b3I6OnNjaGVkdWxlUG9sbEJ1ZmZlcmluZ19sKCkgewordm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6c2NoZWR1bGVQb2xsQnVmZmVyaW5nKCkgewogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQb2xsQnVmZmVyaW5nLCB0aGlzKTsKICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbVBvbGxCdWZmZXJpbmdHZW5lcmF0aW9uKTsKICAgICAvLyBFbnF1aXJlcyBidWZmZXJpbmcgc3RhdHVzIGV2ZXJ5IHNlY29uZC4KICAgICBtc2ctPnBvc3QoMTAwMDAwMGxsKTsKIH0KIAotaW50NjRfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6QnVmZmVyaW5nTW9uaXRvcjo6Z2V0TGFzdFJlYWRQb3NpdGlvbl9sKCkgewotICAgIGlmIChtQXVkaW9UaW1lVXMgPiAwKSB7Ci0gICAgICAgIHJldHVybiBtQXVkaW9UaW1lVXM7Ci0gICAgfSBlbHNlIGlmIChtVmlkZW9UaW1lVXMgPiAwKSB7Ci0gICAgICAgIHJldHVybiBtVmlkZW9UaW1lVXM7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi12b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpCdWZmZXJpbmdNb25pdG9yOjpvblBvbGxCdWZmZXJpbmdfbCgpIHsKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6Om9uUG9sbEJ1ZmZlcmluZygpIHsKICAgICBzdGF0dXNfdCBmaW5hbFN0YXR1cyA9IFVOS05PV05fRVJST1I7CiAgICAgaW50NjRfdCBjYWNoZWREdXJhdGlvblVzID0gLTFsbDsKICAgICBzc2l6ZV90IGNhY2hlZERhdGFSZW1haW5pbmcgPSAtMTsKIAogICAgIGlmIChtQ2FjaGVkU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgY2FjaGVkRGF0YVJlbWFpbmluZyA9Ci0gICAgICAgICAgICAgICAgbUNhY2hlZFNvdXJjZS0+YXBwcm94RGF0YVJlbWFpbmluZygmZmluYWxTdGF0dXMpOworICAgICAgICBjYWNoZWREYXRhUmVtYWluaW5nID0gbUNhY2hlZFNvdXJjZS0+YXBwcm94RGF0YVJlbWFpbmluZygmZmluYWxTdGF0dXMpOwogCiAgICAgICAgIGlmIChmaW5hbFN0YXR1cyA9PSBPSykgewogICAgICAgICAgICAgb2ZmNjRfdCBzaXplOwpAQCAtMTgxNiwxNTcgKzE1NDEsNDkgQEAKICAgICB9CiAKICAgICBpZiAoZmluYWxTdGF0dXMgIT0gT0spIHsKLSAgICAgICAgQUxPR1YoIm9uUG9sbEJ1ZmZlcmluZ19sOiBFT1MgKGZpbmFsU3RhdHVzID0gJWQpIiwgZmluYWxTdGF0dXMpOworICAgICAgICBBTE9HVigib25Qb2xsQnVmZmVyaW5nOiBFT1MgKGZpbmFsU3RhdHVzID0gJWQpIiwgZmluYWxTdGF0dXMpOwogCiAgICAgICAgIGlmIChmaW5hbFN0YXR1cyA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7Ci0gICAgICAgICAgICBub3RpZnlCdWZmZXJpbmdVcGRhdGVfbCgxMDApOworICAgICAgICAgICAgbm90aWZ5QnVmZmVyaW5nVXBkYXRlKDEwMCk7CiAgICAgICAgIH0KIAotICAgICAgICBzdG9wQnVmZmVyaW5nSWZOZWNlc3NhcnlfbCgpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgaWYgKGNhY2hlZER1cmF0aW9uVXMgPj0gMGxsKSB7CiAgICAgICAgIGlmIChtRHVyYXRpb25VcyA+IDBsbCkgewotICAgICAgICAgICAgaW50NjRfdCBjYWNoZWRQb3NVcyA9IGdldExhc3RSZWFkUG9zaXRpb25fbCgpICsgY2FjaGVkRHVyYXRpb25VczsKKyAgICAgICAgICAgIGludDY0X3QgY2FjaGVkUG9zVXMgPSBnZXRMYXN0UmVhZFBvc2l0aW9uKCkgKyBjYWNoZWREdXJhdGlvblVzOwogICAgICAgICAgICAgaW50IHBlcmNlbnRhZ2UgPSAxMDAuMCAqIGNhY2hlZFBvc1VzIC8gbUR1cmF0aW9uVXM7CiAgICAgICAgICAgICBpZiAocGVyY2VudGFnZSA+IDEwMCkgewogICAgICAgICAgICAgICAgIHBlcmNlbnRhZ2UgPSAxMDA7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG5vdGlmeUJ1ZmZlcmluZ1VwZGF0ZV9sKHBlcmNlbnRhZ2UpOworICAgICAgICAgICAgbm90aWZ5QnVmZmVyaW5nVXBkYXRlKHBlcmNlbnRhZ2UpOwogICAgICAgICB9CiAKLSAgICAgICAgQUxPR1YoIm9uUG9sbEJ1ZmZlcmluZ19sOiBjYWNoZWREdXJhdGlvblVzICUuMWYgc2VjIiwgY2FjaGVkRHVyYXRpb25VcyAvIDEwMDAwMDAuMGYpOwotCi0gICAgICAgIGlmIChtUHJlcGFyZUJ1ZmZlcmluZykgewotICAgICAgICAgICAgaWYgKGNhY2hlZER1cmF0aW9uVXMgPiBtU2V0dGluZ3MubUluaXRpYWxXYXRlcm1hcmtNcyAqIDEwMDApIHsKLSAgICAgICAgICAgICAgICBzdG9wQnVmZmVyaW5nSWZOZWNlc3NhcnlfbCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG1TZXR0aW5ncy5Jc1RpbWVCYXNlZEJ1ZmZlcmluZ01vZGUobVNldHRpbmdzLm1SZWJ1ZmZlcmluZ01vZGUpKSB7Ci0gICAgICAgICAgICBpZiAoY2FjaGVkRHVyYXRpb25VcyA8IG1TZXR0aW5ncy5tUmVidWZmZXJpbmdXYXRlcm1hcmtMb3dNcyAqIDEwMDApIHsKLSAgICAgICAgICAgICAgICAvLyBUYWtlIGludG8gYWNjb3VudCB0aGUgZGF0YSBjYWNoZWQgaW4gZG93bnN0cmVhbSBjb21wb25lbnRzIHRvIHRyeSB0byBhdm9pZAotICAgICAgICAgICAgICAgIC8vIHVubmVjZXNzYXJ5IHBhdXNlLgotICAgICAgICAgICAgICAgIGlmIChtT2ZmbG9hZEF1ZGlvICYmIG1GaXJzdERlcXVldWVkQnVmZmVyUmVhbFVzID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBkb3duU3RyZWFtQ2FjaGVVcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtbGFzdERlcXVldWVkQnVmZmVyTWVkaWFVcyAtIG1GaXJzdERlcXVldWVkQnVmZmVyTWVkaWFVcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKEFMb29wZXI6OkdldE5vd1VzKCkgLSBtRmlyc3REZXF1ZXVlZEJ1ZmZlclJlYWxVcyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkb3duU3RyZWFtQ2FjaGVVcyA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZER1cmF0aW9uVXMgKz0gZG93blN0cmVhbUNhY2hlVXM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2FjaGVkRHVyYXRpb25VcyA8IG1TZXR0aW5ncy5tUmVidWZmZXJpbmdXYXRlcm1hcmtMb3dNcyAqIDEwMDApIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhcnRCdWZmZXJpbmdJZk5lY2Vzc2FyeV9sKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChjYWNoZWREdXJhdGlvblVzID4gbVNldHRpbmdzLm1SZWJ1ZmZlcmluZ1dhdGVybWFya0hpZ2hNcyAqIDEwMDApIHsKLSAgICAgICAgICAgICAgICBzdG9wQnVmZmVyaW5nSWZOZWNlc3NhcnlfbCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChjYWNoZWREYXRhUmVtYWluaW5nID49IDAKLSAgICAgICAgICAgICYmIG1TZXR0aW5ncy5Jc1NpemVCYXNlZEJ1ZmZlcmluZ01vZGUobVNldHRpbmdzLm1SZWJ1ZmZlcmluZ01vZGUpKSB7Ci0gICAgICAgIEFMT0dWKCJvblBvbGxCdWZmZXJpbmdfbDogY2FjaGVkRGF0YVJlbWFpbmluZyAlemQgYnl0ZXMiLAotICAgICAgICAgICAgICAgIGNhY2hlZERhdGFSZW1haW5pbmcpOwotCi0gICAgICAgIGlmIChjYWNoZWREYXRhUmVtYWluaW5nIDwgKG1TZXR0aW5ncy5tUmVidWZmZXJpbmdXYXRlcm1hcmtMb3dLQiA8PCAxMCkpIHsKLSAgICAgICAgICAgIHN0YXJ0QnVmZmVyaW5nSWZOZWNlc3NhcnlfbCgpOwotICAgICAgICB9IGVsc2UgaWYgKGNhY2hlZERhdGFSZW1haW5pbmcgPiAobVNldHRpbmdzLm1SZWJ1ZmZlcmluZ1dhdGVybWFya0hpZ2hLQiA8PCAxMCkpIHsKLSAgICAgICAgICAgIHN0b3BCdWZmZXJpbmdJZk5lY2Vzc2FyeV9sKCk7Ci0gICAgICAgIH0KKyAgICAgICAgQUxPR1YoIm9uUG9sbEJ1ZmZlcmluZzogY2FjaGVkRHVyYXRpb25VcyAlLjFmIHNlYyIsIGNhY2hlZER1cmF0aW9uVXMgLyAxMDAwMDAwLjBmKTsKICAgICB9CiAKLSAgICBzY2hlZHVsZVBvbGxCdWZmZXJpbmdfbCgpOwotfQotCi12b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpCdWZmZXJpbmdNb25pdG9yOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewotICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKLSAgICAgIGNhc2Uga1doYXRQb2xsQnVmZmVyaW5nOgotICAgICAgewotICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKLSAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7Ci0gICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiA9PSBtUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb24pIHsKLSAgICAgICAgICAgICAgb25Qb2xsQnVmZmVyaW5nX2woKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBkZWZhdWx0OgotICAgICAgICAgIFRSRVNQQVNTKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgfQorICAgIHNjaGVkdWxlUG9sbEJ1ZmZlcmluZygpOwogfQogCiAvLyBNb2R1bGFyIERSTQogc3RhdHVzX3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnByZXBhcmVEcm0oCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmZHJtU2Vzc2lvbklkLCBzcDxJQ3J5cHRvPiAqY3J5cHRvKQoteworICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBWZWN0b3I8dWludDhfdD4gJmRybVNlc3Npb25JZCwgc3A8SUNyeXB0bz4gKm91dENyeXB0bykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQUxPR1YoInByZXBhcmVEcm0iKTsKIAotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQcmVwYXJlRHJtLCB0aGlzKTsKLSAgICAvLyBzeW5jaHJvbm91cyBjYWxsIHNvIGp1c3QgcGFzc2luZyB0aGUgYWRkcmVzcyBidXQgd2l0aCBsb2NhbCBjb3BpZXMgb2YgImNvbnN0IiBhcmdzCi0gICAgdWludDhfdCBVVUlEWzE2XTsKLSAgICBtZW1jcHkoVVVJRCwgdXVpZCwgc2l6ZW9mKFVVSUQpKTsKLSAgICBWZWN0b3I8dWludDhfdD4gc2Vzc2lvbklkID0gZHJtU2Vzc2lvbklkOwotICAgIG1zZy0+c2V0UG9pbnRlcigidXVpZCIsICh2b2lkKilVVUlEKTsKLSAgICBtc2ctPnNldFBvaW50ZXIoImRybVNlc3Npb25JZCIsICh2b2lkKikmc2Vzc2lvbklkKTsKLSAgICBtc2ctPnNldFBvaW50ZXIoImNyeXB0byIsICh2b2lkKiljcnlwdG8pOwotCi0gICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwotICAgIHN0YXR1c190IHN0YXR1cyA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKLQotICAgIGlmIChzdGF0dXMgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgewotICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJzdGF0dXMiLCAmc3RhdHVzKSk7Ci0gICAgICAgIEFMT0dWX0lGKHN0YXR1cyA9PSBPSywgInByZXBhcmVEcm06IG1DcnlwdG86ICVwICglZCkiLCBjcnlwdG8tPmdldCgpLAotICAgICAgICAgICAgICAgICgqY3J5cHRvICE9IE5VTEwgPyAoKmNyeXB0byktPmdldFN0cm9uZ0NvdW50KCkgOiAwKSk7Ci0gICAgICAgIEFMT0dEKCJwcmVwYXJlRHJtIHJldDogJWQgIiwgc3RhdHVzKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgicHJlcGFyZURybSBlcnI6ICVkIiwgc3RhdHVzKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6cmVsZWFzZURybSgpCi17Ci0gICAgQUxPR1YoInJlbGVhc2VEcm0iKTsKLQotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZWxlYXNlRHJtLCB0aGlzKTsKLQotICAgIC8vIHN5bmNocm9ub3VzIGNhbGwgdG8gdXBkYXRlIHRoZSBzb3VyY2Ugc3RhdGVzIGJlZm9yZSB0aGUgcGxheWVyIHByb2NlZWRlcyB3aXRoIGNyeXB0byBjbGVhbnVwCi0gICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwotICAgIHN0YXR1c190IHN0YXR1cyA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKLQotICAgIGlmIChzdGF0dXMgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgewotICAgICAgICBBTE9HRCgicmVsZWFzZURybSByZXQ6IE9LICIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJyZWxlYXNlRHJtIGVycjogJWQiLCBzdGF0dXMpOwotICAgIH0KLQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpvblByZXBhcmVEcm0oY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpCi17Ci0gICAgQUxPR1YoIm9uUHJlcGFyZURybSAiKTsKLQogICAgIG1Jc0RybVByb3RlY3RlZCA9IGZhbHNlOwogICAgIG1Jc0RybVJlbGVhc2VkID0gZmFsc2U7CiAgICAgbUlzU2VjdXJlID0gZmFsc2U7CiAKLSAgICB1aW50OF90ICp1dWlkOwotICAgIFZlY3Rvcjx1aW50OF90PiAqZHJtU2Vzc2lvbklkOwotICAgIHNwPElDcnlwdG8+ICpvdXRDcnlwdG87Ci0gICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigidXVpZCIsICh2b2lkKiopJnV1aWQpKTsKLSAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJkcm1TZXNzaW9uSWQiLCAodm9pZCoqKSZkcm1TZXNzaW9uSWQpKTsKLSAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJjcnlwdG8iLCAodm9pZCoqKSZvdXRDcnlwdG8pKTsKLQogICAgIHN0YXR1c190IHN0YXR1cyA9IE9LOwotICAgIHNwPElDcnlwdG8+IGNyeXB0byA9IE51UGxheWVyRHJtOjpjcmVhdGVDcnlwdG9BbmRQbHVnaW4odXVpZCwgKmRybVNlc3Npb25JZCwgc3RhdHVzKTsKKyAgICBzcDxJQ3J5cHRvPiBjcnlwdG8gPSBOdVBsYXllckRybTo6Y3JlYXRlQ3J5cHRvQW5kUGx1Z2luKHV1aWQsIGRybVNlc3Npb25JZCwgc3RhdHVzKTsKICAgICBpZiAoY3J5cHRvID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIm9uUHJlcGFyZURybTogY3JlYXRlQ3J5cHRvIGZhaWxlZC4gc3RhdHVzOiAlZCIsIHN0YXR1cyk7CisgICAgICAgIEFMT0dFKCJwcmVwYXJlRHJtOiBjcmVhdGVDcnlwdG8gZmFpbGVkLiBzdGF0dXM6ICVkIiwgc3RhdHVzKTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9Ci0gICAgQUxPR1YoIm9uUHJlcGFyZURybTogY3JlYXRlQ3J5cHRvQW5kUGx1Z2luIHN1Y2NlZWRlZCBmb3IgdXVpZDogJXMiLAorICAgIEFMT0dWKCJwcmVwYXJlRHJtOiBjcmVhdGVDcnlwdG9BbmRQbHVnaW4gc3VjY2VlZGVkIGZvciB1dWlkOiAlcyIsCiAgICAgICAgICAgICBEcm1VVUlEOjp0b0hleFN0cmluZyh1dWlkKS5zdHJpbmcoKSk7CiAKICAgICAqb3V0Q3J5cHRvID0gY3J5cHRvOwpAQCAtMTk3NSwxNCArMTU5MiwxNCBAQAogCiAgICAgaWYgKG1NaW1lcy5zaXplKCkgPT0gMCkgewogICAgICAgICBzdGF0dXMgPSBVTktOT1dOX0VSUk9SOwotICAgICAgICBBTE9HRSgib25QcmVwYXJlRHJtOiBVbmV4cGVjdGVkLiBNdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHRyYWNrLiBzdGF0dXM6ICVkIiwgc3RhdHVzKTsKKyAgICAgICAgQUxPR0UoInByZXBhcmVEcm06IFVuZXhwZWN0ZWQuIE11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgdHJhY2suIHN0YXR1czogJWQiLCBzdGF0dXMpOwogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIAogICAgIC8vIGZpcnN0IG1pbWUgaW4gdGhpcyBsaXN0IGlzIGVpdGhlciB0aGUgdmlkZW8gdHJhY2ssIG9yIHRoZSBmaXJzdCBhdWRpbyB0cmFjawogICAgIGNvbnN0IGNoYXIgKm1pbWUgPSBtTWltZXNbMF0uc3RyaW5nKCk7CiAgICAgbUlzU2VjdXJlID0gY3J5cHRvLT5yZXF1aXJlc1NlY3VyZURlY29kZXJDb21wb25lbnQobWltZSk7Ci0gICAgQUxPR1YoIm9uUHJlcGFyZURybTogcmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50IG1pbWU6ICVzICBpc1NlY3VyZTogJWQiLAorICAgIEFMT0dWKCJwcmVwYXJlRHJtOiByZXF1aXJlc1NlY3VyZURlY29kZXJDb21wb25lbnQgbWltZTogJXMgIGlzU2VjdXJlOiAlZCIsCiAgICAgICAgICAgICBtaW1lLCBtSXNTZWN1cmUpOwogCiAgICAgLy8gQ2hlY2tpbmcgdGhlIG1lbWJlciBmbGFncyB3aGlsZSBpbiB0aGUgbG9vcGVyIHRvIHNlbmQgb3V0IHRoZSBub3RpZmljYXRpb24uCkBAIC0xOTk2LDE4ICsxNjEzLDI3IEBACiAgICAgICAgICAgICBGTEFHX0NBTl9TRUVLX0ZPUldBUkQgfAogICAgICAgICAgICAgRkxBR19DQU5fU0VFSyk7CiAKKyAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgIEFMT0dWKCJwcmVwYXJlRHJtOiBtQ3J5cHRvOiAlcCAoJWQpIiwgb3V0Q3J5cHRvLT5nZXQoKSwKKyAgICAgICAgICAgICAgICAoKm91dENyeXB0byAhPSBOVUxMID8gKCpvdXRDcnlwdG8pLT5nZXRTdHJvbmdDb3VudCgpIDogMCkpOworICAgICAgICBBTE9HRCgicHJlcGFyZURybSByZXQ6ICVkICIsIHN0YXR1cyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoInByZXBhcmVEcm0gZXJyOiAlZCIsIHN0YXR1cyk7CisgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXR1c190IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpvblJlbGVhc2VEcm0oKQoteworc3RhdHVzX3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnJlbGVhc2VEcm0oKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBTE9HVigicmVsZWFzZURybSIpOworCiAgICAgaWYgKG1Jc0RybVByb3RlY3RlZCkgewogICAgICAgICBtSXNEcm1Qcm90ZWN0ZWQgPSBmYWxzZTsKICAgICAgICAgLy8gdG8gcHJldmVudCByZXR1cm5pbmcgYW55IG1vcmUgYnVmZmVyIGFmdGVyIHN0b3AvcmVsZWFzZURybSAoYi8zNzk2MDA5NikKICAgICAgICAgbUlzRHJtUmVsZWFzZWQgPSB0cnVlOwotICAgICAgICBBTE9HVigib25SZWxlYXNlRHJtOiBtSXNEcm1Qcm90ZWN0ZWQgaXMgcmVzZXQuIik7CisgICAgICAgIEFMT0dWKCJyZWxlYXNlRHJtOiBtSXNEcm1Qcm90ZWN0ZWQgaXMgcmVzZXQuIik7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIm9uUmVsZWFzZURybTogbUlzRHJtUHJvdGVjdGVkIGlzIGFscmVhZHkgZmFsc2UuIik7CisgICAgICAgIEFMT0dFKCJyZWxlYXNlRHJtOiBtSXNEcm1Qcm90ZWN0ZWQgaXMgYWxyZWFkeSBmYWxzZS4iKTsKICAgICB9CiAKICAgICByZXR1cm4gT0s7CkBAIC0yMDUxLDcgKzE2NzcsNyBAQAogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6c2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXIgKmJ1ZmZlcikKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKQogewogICAgIC8vQUxPR1YoInNpZ25hbEJ1ZmZlclJldHVybmVkICVwICByZWZDb3VudDogJWQiLCBidWZmZXIsIGJ1ZmZlci0+bG9jYWxSZWZjb3VudCgpKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmgKaW5kZXggNDA2NDEzMy4uMDY1Y2FjMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5oCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSAiQVRTUGFyc2VyLmgiCiAKICNpbmNsdWRlIDxtZWRpYS9tZWRpYXBsYXllci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzQsMTMgKzM1LDE2IEBACiBjbGFzcyBJRGF0YVNvdXJjZTsKIHN0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKIHN0cnVjdCBNZWRpYVNvdXJjZTsKK2NsYXNzIElNZWRpYVNvdXJjZTsKIGNsYXNzIE1lZGlhQnVmZmVyOworc3RydWN0IE1lZGlhQ2xvY2s7CiBzdHJ1Y3QgTnVDYWNoZWRTb3VyY2UyOwogCiBzdHJ1Y3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2UgOiBwdWJsaWMgTnVQbGF5ZXI6OlNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBNZWRpYUJ1ZmZlck9ic2VydmVyIC8vIE1vZHVsYXIgRFJNCiB7Ci0gICAgR2VuZXJpY1NvdXJjZShjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgYm9vbCB1aWRWYWxpZCwgdWlkX3QgdWlkKTsKKyAgICBHZW5lcmljU291cmNlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCBib29sIHVpZFZhbGlkLCB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNsb2NrPiAmbWVkaWFDbG9jayk7CiAKICAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKAogICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKQEAgLTUxLDcgKzU1LDcgQEAKIAogICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZT4mIGRhdGFTb3VyY2UpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZWZhdWx0QnVmZmVyaW5nU2V0dGluZ3MoCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJpbmdTZXR0aW5ncygKICAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSBvdmVycmlkZTsKIApAQCAtNzksMTcgKzgzLDEzIEBACiAgICAgICAgIGludDY0X3Qgc2Vla1RpbWVVcywKICAgICAgICAgTWVkaWFQbGF5ZXJTZWVrTW9kZSBtb2RlID0gTWVkaWFQbGF5ZXJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DKSBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QnVmZmVycyhib29sIGF1ZGlvLCBWZWN0b3I8TWVkaWFCdWZmZXIgKj4gJmJ1ZmZlcnMpOwotCiAgICAgdmlydHVhbCBib29sIGlzU3RyZWFtaW5nKCkgY29uc3Q7CiAKLSAgICB2aXJ0dWFsIHZvaWQgc2V0T2ZmbG9hZEF1ZGlvKGJvb2wgb2ZmbG9hZCk7Ci0KICAgICAvLyBNb2R1bGFyIERSTQotICAgIHZpcnR1YWwgdm9pZCBzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlciAqYnVmZmVyKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlRHJtKAotICAgICAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZkcm1TZXNzaW9uSWQsIHNwPElDcnlwdG8+ICpjcnlwdG8pOworICAgICAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZkcm1TZXNzaW9uSWQsIHNwPElDcnlwdG8+ICpvdXRDcnlwdG8pOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlRHJtKCk7CiAKQEAgLTExMSwxNyArMTExLDExIEBACiAgICAgICAgIGtXaGF0U2VuZFRpbWVkVGV4dERhdGEsCiAgICAgICAgIGtXaGF0Q2hhbmdlQVZTb3VyY2UsCiAgICAgICAgIGtXaGF0UG9sbEJ1ZmZlcmluZywKLSAgICAgICAga1doYXRHZXRGb3JtYXQsCi0gICAgICAgIGtXaGF0R2V0U2VsZWN0ZWRUcmFjaywKLSAgICAgICAga1doYXRTZWxlY3RUcmFjaywKICAgICAgICAga1doYXRTZWVrLAogICAgICAgICBrV2hhdFJlYWRCdWZmZXIsCiAgICAgICAgIGtXaGF0U3RhcnQsCiAgICAgICAgIGtXaGF0UmVzdW1lLAogICAgICAgICBrV2hhdFNlY3VyZURlY29kZXJzSW5zdGFudGlhdGVkLAotICAgICAgICAvLyBNb2R1bGFyIERSTQotICAgICAgICBrV2hhdFByZXBhcmVEcm0sCi0gICAgICAgIGtXaGF0UmVsZWFzZURybSwKICAgICB9OwogCiAgICAgc3RydWN0IFRyYWNrIHsKQEAgLTEzMCw4NCArMTI0LDYgQEAKICAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gbVBhY2tldHM7CiAgICAgfTsKIAotICAgIC8vIEhlbHBlciB0byBtb25pdG9yIGJ1ZmZlcmluZyBzdGF0dXMuIFRoZSBwb2xsaW5nIGhhcHBlbnMgZXZlcnkgc2Vjb25kLgotICAgIC8vIFdoZW4gbmVjZXNzYXJ5LCBpdCB3aWxsIHNlbmQgb3V0IGJ1ZmZlcmluZyBldmVudHMgdG8gdGhlIHBsYXllci4KLSAgICBzdHJ1Y3QgQnVmZmVyaW5nTW9uaXRvciA6IHB1YmxpYyBBSGFuZGxlciB7Ci0gICAgcHVibGljOgotICAgICAgICBleHBsaWNpdCBCdWZmZXJpbmdNb25pdG9yKGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5KTsKLQotICAgICAgICB2b2lkIGdldERlZmF1bHRCdWZmZXJpbmdTZXR0aW5ncyhCdWZmZXJpbmdTZXR0aW5ncyAqYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pOwotICAgICAgICBzdGF0dXNfdCBzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyAmYnVmZmVyaW5nKTsKLQotICAgICAgICAvLyBTZXQgdXAgc3RhdGUuCi0gICAgICAgIHZvaWQgcHJlcGFyZShjb25zdCBzcDxOdUNhY2hlZFNvdXJjZTI+ICZjYWNoZWRTb3VyY2UsCi0gICAgICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzLAotICAgICAgICAgICAgICAgIGludDY0X3QgYml0cmF0ZSwKLSAgICAgICAgICAgICAgICBib29sIGlzU3RyZWFtaW5nKTsKLSAgICAgICAgLy8gU3RvcCBhbmQgcmVzZXQgYnVmZmVyaW5nIG1vbml0b3IuCi0gICAgICAgIHZvaWQgc3RvcCgpOwotICAgICAgICAvLyBDYW5jZWwgdGhlIGN1cnJlbnQgbW9uaXRvciB0YXNrLgotICAgICAgICB2b2lkIGNhbmNlbFBvbGxCdWZmZXJpbmcoKTsKLSAgICAgICAgLy8gUmVzdGFydCB0aGUgbW9uaXRvciB0YXNrLgotICAgICAgICB2b2lkIHJlc3RhcnRQb2xsQnVmZmVyaW5nKCk7Ci0gICAgICAgIC8vIFN0b3AgYnVmZmVyaW5nIHRhc2sgYW5kIHNlbmQgb3V0IGNvcnJlc3BvbmRpbmcgZXZlbnRzLgotICAgICAgICB2b2lkIHN0b3BCdWZmZXJpbmdJZk5lY2Vzc2FyeSgpOwotICAgICAgICAvLyBNYWtlIHN1cmUgZGF0YSBzb3VyY2UgaXMgZ2V0dGluZyBkYXRhLgotICAgICAgICB2b2lkIGVuc3VyZUNhY2hlSXNGZXRjaGluZygpOwotICAgICAgICAvLyBVcGRhdGUgbWVkaWEgdGltZSBvZiBqdXN0IGV4dHJhY3RlZCBidWZmZXIgZnJvbSBkYXRhIHNvdXJjZS4KLSAgICAgICAgdm9pZCB1cGRhdGVRdWV1ZWRUaW1lKGJvb2wgaXNBdWRpbywgaW50NjRfdCB0aW1lVXMpOwotCi0gICAgICAgIC8vIFNldCB0aGUgb2ZmbG9hZCBtb2RlLgotICAgICAgICB2b2lkIHNldE9mZmxvYWRBdWRpbyhib29sIG9mZmxvYWQpOwotICAgICAgICAvLyBVcGRhdGUgbWVkaWEgdGltZSBvZiBsYXN0IGRlcXVldWVkIGJ1ZmZlciB3aGljaCBpcyBzZW50IHRvIHRoZSBkZWNvZGVyLgotICAgICAgICB2b2lkIHVwZGF0ZURlcXVldWVkQnVmZmVyVGltZShpbnQ2NF90IG1lZGlhVXMpOwotCi0gICAgcHJvdGVjdGVkOgotICAgICAgICB2aXJ0dWFsIH5CdWZmZXJpbmdNb25pdG9yKCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBlbnVtIHsKLSAgICAgICAgICAgIGtXaGF0UG9sbEJ1ZmZlcmluZywKLSAgICAgICAgfTsKLQotICAgICAgICBzcDxBTWVzc2FnZT4gbU5vdGlmeTsKLQotICAgICAgICBzcDxOdUNhY2hlZFNvdXJjZTI+IG1DYWNoZWRTb3VyY2U7Ci0gICAgICAgIGludDY0X3QgbUR1cmF0aW9uVXM7Ci0gICAgICAgIGludDY0X3QgbUJpdHJhdGU7Ci0gICAgICAgIGJvb2wgbUlzU3RyZWFtaW5nOwotCi0gICAgICAgIGludDY0X3QgbUF1ZGlvVGltZVVzOwotICAgICAgICBpbnQ2NF90IG1WaWRlb1RpbWVVczsKLSAgICAgICAgaW50MzJfdCBtUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb247Ci0gICAgICAgIGJvb2wgbVByZXBhcmVCdWZmZXJpbmc7Ci0gICAgICAgIGJvb2wgbUJ1ZmZlcmluZzsKLSAgICAgICAgaW50MzJfdCBtUHJldkJ1ZmZlclBlcmNlbnRhZ2U7Ci0KLSAgICAgICAgbXV0YWJsZSBNdXRleCBtTG9jazsKLQotICAgICAgICBCdWZmZXJpbmdTZXR0aW5ncyBtU2V0dGluZ3M7Ci0gICAgICAgIGJvb2wgbU9mZmxvYWRBdWRpbzsKLSAgICAgICAgaW50NjRfdCBtRmlyc3REZXF1ZXVlZEJ1ZmZlclJlYWxVczsKLSAgICAgICAgaW50NjRfdCBtRmlyc3REZXF1ZXVlZEJ1ZmZlck1lZGlhVXM7Ci0gICAgICAgIGludDY0X3QgbWxhc3REZXF1ZXVlZEJ1ZmZlck1lZGlhVXM7Ci0KLSAgICAgICAgdm9pZCBwcmVwYXJlX2woY29uc3Qgc3A8TnVDYWNoZWRTb3VyY2UyPiAmY2FjaGVkU291cmNlLAotICAgICAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VcywKLSAgICAgICAgICAgICAgICBpbnQ2NF90IGJpdHJhdGUsCi0gICAgICAgICAgICAgICAgYm9vbCBpc1N0cmVhbWluZyk7Ci0gICAgICAgIHZvaWQgY2FuY2VsUG9sbEJ1ZmZlcmluZ19sKCk7Ci0gICAgICAgIHZvaWQgbm90aWZ5QnVmZmVyaW5nVXBkYXRlX2woaW50MzJfdCBwZXJjZW50YWdlKTsKLSAgICAgICAgdm9pZCBzdGFydEJ1ZmZlcmluZ0lmTmVjZXNzYXJ5X2woKTsKLSAgICAgICAgdm9pZCBzdG9wQnVmZmVyaW5nSWZOZWNlc3NhcnlfbCgpOwotICAgICAgICB2b2lkIHNlbmRDYWNoZVN0YXRzX2woKTsKLSAgICAgICAgdm9pZCBlbnN1cmVDYWNoZUlzRmV0Y2hpbmdfbCgpOwotICAgICAgICBpbnQ2NF90IGdldExhc3RSZWFkUG9zaXRpb25fbCgpOwotICAgICAgICB2b2lkIG9uUG9sbEJ1ZmZlcmluZ19sKCk7Ci0gICAgICAgIHZvaWQgc2NoZWR1bGVQb2xsQnVmZmVyaW5nX2woKTsKLSAgICB9OwotCiAgICAgVmVjdG9yPHNwPElNZWRpYVNvdXJjZT4gPiBtU291cmNlczsKICAgICBUcmFjayBtQXVkaW9UcmFjazsKICAgICBpbnQ2NF90IG1BdWRpb1RpbWVVczsKQEAgLTIxOCw2ICsxMzQsMTMgQEAKICAgICBUcmFjayBtU3VidGl0bGVUcmFjazsKICAgICBUcmFjayBtVGltZWRUZXh0VHJhY2s7CiAKKyAgICBCdWZmZXJpbmdTZXR0aW5ncyBtQnVmZmVyaW5nU2V0dGluZ3M7CisgICAgaW50MzJfdCBtUHJldkJ1ZmZlclBlcmNlbnRhZ2U7CisgICAgaW50MzJfdCBtUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb247CisgICAgYm9vbCBtU2VudFBhdXNlT25CdWZmZXJpbmc7CisKKyAgICBpbnQzMl90IG1BdWRpb0RhdGFHZW5lcmF0aW9uOworICAgIGludDMyX3QgbVZpZGVvRGF0YUdlbmVyYXRpb247CiAgICAgaW50MzJfdCBtRmV0Y2hTdWJ0aXRsZURhdGFHZW5lcmF0aW9uOwogICAgIGludDMyX3QgbUZldGNoVGltZWRUZXh0RGF0YUdlbmVyYXRpb247CiAgICAgaW50NjRfdCBtRHVyYXRpb25VczsKQEAgLTIyNyw2ICsxNTAsNyBAQAogICAgIGJvb2wgbUlzU3RyZWFtaW5nOwogICAgIGJvb2wgbVVJRFZhbGlkOwogICAgIHVpZF90IG1VSUQ7CisgICAgY29uc3Qgc3A8TWVkaWFDbG9jaz4gbU1lZGlhQ2xvY2s7CiAgICAgc3A8SU1lZGlhSFRUUFNlcnZpY2U+IG1IVFRQU2VydmljZTsKICAgICBBU3RyaW5nIG1Vcmk7CiAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbVVyaUhlYWRlcnM7CkBAIC0yMzQsMjIgKzE1OCwyMCBAQAogICAgIGludDY0X3QgbU9mZnNldDsKICAgICBpbnQ2NF90IG1MZW5ndGg7CiAKKyAgICBib29sIG1EaXNjb25uZWN0ZWQ7CiAgICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7CiAgICAgc3A8TnVDYWNoZWRTb3VyY2UyPiBtQ2FjaGVkU291cmNlOwogICAgIHNwPERhdGFTb3VyY2U+IG1IdHRwU291cmNlOwogICAgIHNwPE1ldGFEYXRhPiBtRmlsZU1ldGE7CiAgICAgYm9vbCBtU3RhcnRlZDsKLSAgICBib29sIG1TdG9wUmVhZDsKKyAgICBib29sIG1QcmVwYXJpbmc7CiAgICAgaW50NjRfdCBtQml0cmF0ZTsKLSAgICBzcDxCdWZmZXJpbmdNb25pdG9yPiBtQnVmZmVyaW5nTW9uaXRvcjsKICAgICB1aW50MzJfdCBtUGVuZGluZ1JlYWRCdWZmZXJUeXBlczsKICAgICBzcDxBQnVmZmVyPiBtR2xvYmFsVGltZWRUZXh0OwogCi0gICAgbXV0YWJsZSBNdXRleCBtUmVhZEJ1ZmZlckxvY2s7Ci0gICAgbXV0YWJsZSBNdXRleCBtRGlzY29ubmVjdExvY2s7CisgICAgbXV0YWJsZSBNdXRleCBtTG9jazsKIAogICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7Ci0gICAgc3A8QUxvb3Blcj4gbUJ1ZmZlcmluZ01vbml0b3JMb29wZXI7CiAKICAgICB2b2lkIHJlc2V0RGF0YVNvdXJjZSgpOwogCkBAIC0yNjEsMTggKzE4Myw2IEBACiAgICAgdm9pZCBmaW5pc2hQcmVwYXJlQXN5bmMoKTsKICAgICBzdGF0dXNfdCBzdGFydFNvdXJjZXMoKTsKIAotICAgIHZvaWQgb25HZXRGb3JtYXRNZXRhKGNvbnN0IHNwPEFNZXNzYWdlPiYgbXNnKSBjb25zdDsKLSAgICBzcDxNZXRhRGF0YT4gZG9HZXRGb3JtYXRNZXRhKGJvb2wgYXVkaW8pIGNvbnN0OwotCi0gICAgdm9pZCBvbkdldFRyYWNrSW5mbyhjb25zdCBzcDxBTWVzc2FnZT4mIG1zZykgY29uc3Q7Ci0gICAgc3A8QU1lc3NhZ2U+IGRvR2V0VHJhY2tJbmZvKHNpemVfdCB0cmFja0luZGV4KSBjb25zdDsKLQotICAgIHZvaWQgb25HZXRTZWxlY3RlZFRyYWNrKGNvbnN0IHNwPEFNZXNzYWdlPiYgbXNnKSBjb25zdDsKLSAgICBzc2l6ZV90IGRvR2V0U2VsZWN0ZWRUcmFjayhtZWRpYV90cmFja190eXBlIHR5cGUpIGNvbnN0OwotCi0gICAgdm9pZCBvblNlbGVjdFRyYWNrKGNvbnN0IHNwPEFNZXNzYWdlPiYgbXNnKTsKLSAgICBzdGF0dXNfdCBkb1NlbGVjdFRyYWNrKHNpemVfdCB0cmFja0luZGV4LCBib29sIHNlbGVjdCwgaW50NjRfdCB0aW1lVXMpOwotCiAgICAgdm9pZCBvblNlZWsoY29uc3Qgc3A8QU1lc3NhZ2U+JiBtc2cpOwogICAgIHN0YXR1c190IGRvU2VlayhpbnQ2NF90IHNlZWtUaW1lVXMsIE1lZGlhUGxheWVyU2Vla01vZGUgbW9kZSk7CiAKQEAgLTI5MSw3ICsyMDEsNyBAQAogICAgICAgICAgICAgaW50MzJfdCBjdXJHZW4sIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+JiBwYWNrZXRzLCBjb25zdCBzcDxBTWVzc2FnZT4mIG1zZyk7CiAKICAgICBzcDxBQnVmZmVyPiBtZWRpYUJ1ZmZlclRvQUJ1ZmZlcigKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyICptYnVmLAorICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICptYnVmLAogICAgICAgICAgICAgbWVkaWFfdHJhY2tfdHlwZSB0cmFja1R5cGUpOwogCiAgICAgdm9pZCBwb3N0UmVhZEJ1ZmZlcihtZWRpYV90cmFja190eXBlIHRyYWNrVHlwZSk7CkBAIC0zMTAsNiArMjIwLDE1IEBACiAgICAgdm9pZCBxdWV1ZURpc2NvbnRpbnVpdHlJZk5lZWRlZCgKICAgICAgICAgICAgIGJvb2wgc2Vla2luZywgYm9vbCBmb3JtYXRDaGFuZ2UsIG1lZGlhX3RyYWNrX3R5cGUgdHJhY2tUeXBlLCBUcmFjayAqdHJhY2spOwogCisgICAgdm9pZCBzY2hlZHVsZVBvbGxCdWZmZXJpbmcoKTsKKyAgICB2b2lkIG9uUG9sbEJ1ZmZlcmluZygpOworICAgIHZvaWQgbm90aWZ5QnVmZmVyaW5nVXBkYXRlKGludDMyX3QgcGVyY2VudGFnZSk7CisKKyAgICB2b2lkIHNlbmRDYWNoZVN0YXRzKCk7CisKKyAgICBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0TWV0YV9sKGJvb2wgYXVkaW8pOworICAgIGludDMyX3QgZ2V0RGF0YUdlbmVyYXRpb24obWVkaWFfdHJhY2tfdHlwZSB0eXBlKSBjb25zdDsKKwogICAgIC8vIE1vZHVsYXIgRFJNCiAgICAgLy8gVGhlIHNvdXJjZSBpcyBEUk0gcHJvdGVjdGVkIGFuZCBpcyBwcmVwYXJlZCBmb3IgRFJNLgogICAgIGJvb2wgbUlzRHJtUHJvdGVjdGVkOwpAQCAtMzE4LDggKzIzNyw2IEBACiAgICAgVmVjdG9yPFN0cmluZzg+IG1NaW1lczsKIAogICAgIHN0YXR1c190IGNoZWNrRHJtSW5mbygpOwotICAgIHN0YXR1c190IG9uUHJlcGFyZURybShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7Ci0gICAgc3RhdHVzX3Qgb25SZWxlYXNlRHJtKCk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhHZW5lcmljU291cmNlKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvSFRUUExpdmVTb3VyY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0hUVFBMaXZlU291cmNlLmNwcAppbmRleCBhZDRjMjIzLi4xMWYxYmZkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvSFRUUExpdmVTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9IVFRQTGl2ZVNvdXJjZS5jcHAKQEAgLTM1LDcgKzM1LDYgQEAKIC8vIGRlZmF1bHQgYnVmZmVyIHByZXBhcmUvcmVhZHkvdW5kZXJmbG93IG1hcmtzCiBzdGF0aWMgY29uc3QgaW50IGtSZWFkeU1hcmtNcyAgICAgPSA1MDAwOyAgLy8gNSBzZWNvbmRzCiBzdGF0aWMgY29uc3QgaW50IGtQcmVwYXJlTWFya01zICAgPSAxNTAwOyAgLy8gMS41IHNlY29uZHMKLXN0YXRpYyBjb25zdCBpbnQga1VuZGVyZmxvd01hcmtNcyA9IDEwMDA7ICAvLyAxIHNlY29uZAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTU0LDcgKzUzLDggQEAKICAgICAgIG1GZXRjaE1ldGFEYXRhR2VuZXJhdGlvbigwKSwKICAgICAgIG1IYXNNZXRhZGF0YShmYWxzZSksCiAgICAgICBtTWV0YWRhdGFTZWxlY3RlZChmYWxzZSkgewotICAgIGdldERlZmF1bHRCdWZmZXJpbmdTZXR0aW5ncygmbUJ1ZmZlcmluZ1NldHRpbmdzKTsKKyAgICBtQnVmZmVyaW5nU2V0dGluZ3MubUluaXRpYWxNYXJrTXMgPSBrUHJlcGFyZU1hcmtNczsKKyAgICBtQnVmZmVyaW5nU2V0dGluZ3MubVJlc3VtZVBsYXliYWNrTWFya01zID0ga1JlYWR5TWFya01zOwogICAgIGlmIChoZWFkZXJzKSB7CiAgICAgICAgIG1FeHRyYUhlYWRlcnMgPSAqaGVhZGVyczsKIApAQCAtODIsMzUgKzgyLDE2IEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBOdVBsYXllcjo6SFRUUExpdmVTb3VyY2U6OmdldERlZmF1bHRCdWZmZXJpbmdTZXR0aW5ncygKK3N0YXR1c190IE51UGxheWVyOjpIVFRQTGl2ZVNvdXJjZTo6Z2V0QnVmZmVyaW5nU2V0dGluZ3MoCiAgICAgICAgICAgICBCdWZmZXJpbmdTZXR0aW5ncyogYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pIHsKLSAgICBidWZmZXJpbmctPm1Jbml0aWFsQnVmZmVyaW5nTW9kZSA9IEJVRkZFUklOR19NT0RFX1RJTUVfT05MWTsKLSAgICBidWZmZXJpbmctPm1SZWJ1ZmZlcmluZ01vZGUgPSBCVUZGRVJJTkdfTU9ERV9USU1FX09OTFk7Ci0gICAgYnVmZmVyaW5nLT5tSW5pdGlhbFdhdGVybWFya01zID0ga1ByZXBhcmVNYXJrTXM7Ci0gICAgYnVmZmVyaW5nLT5tUmVidWZmZXJpbmdXYXRlcm1hcmtMb3dNcyA9IGtVbmRlcmZsb3dNYXJrTXM7Ci0gICAgYnVmZmVyaW5nLT5tUmVidWZmZXJpbmdXYXRlcm1hcmtIaWdoTXMgPSBrUmVhZHlNYXJrTXM7CisgICAgKmJ1ZmZlcmluZyA9IG1CdWZmZXJpbmdTZXR0aW5nczsKIAogICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXI6OkhUVFBMaXZlU291cmNlOjpzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSB7Ci0gICAgaWYgKGJ1ZmZlcmluZy5Jc1NpemVCYXNlZEJ1ZmZlcmluZ01vZGUoYnVmZmVyaW5nLm1Jbml0aWFsQnVmZmVyaW5nTW9kZSkKLSAgICAgICAgICAgIHx8IGJ1ZmZlcmluZy5Jc1NpemVCYXNlZEJ1ZmZlcmluZ01vZGUoYnVmZmVyaW5nLm1SZWJ1ZmZlcmluZ01vZGUpCi0gICAgICAgICAgICB8fCAoYnVmZmVyaW5nLklzVGltZUJhc2VkQnVmZmVyaW5nTW9kZShidWZmZXJpbmcubVJlYnVmZmVyaW5nTW9kZSkKLSAgICAgICAgICAgICAgICAmJiBidWZmZXJpbmcubVJlYnVmZmVyaW5nV2F0ZXJtYXJrTG93TXMgPiBidWZmZXJpbmcubVJlYnVmZmVyaW5nV2F0ZXJtYXJrSGlnaE1zKSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQogICAgIG1CdWZmZXJpbmdTZXR0aW5ncyA9IGJ1ZmZlcmluZzsKIAotICAgIGlmIChtQnVmZmVyaW5nU2V0dGluZ3MubUluaXRpYWxCdWZmZXJpbmdNb2RlID09IEJVRkZFUklOR19NT0RFX05PTkUpIHsKLSAgICAgICAgbUJ1ZmZlcmluZ1NldHRpbmdzLm1Jbml0aWFsV2F0ZXJtYXJrTXMgPSBCdWZmZXJpbmdTZXR0aW5nczo6a05vV2F0ZXJtYXJrOwotICAgIH0KLSAgICBpZiAobUJ1ZmZlcmluZ1NldHRpbmdzLm1SZWJ1ZmZlcmluZ01vZGUgPT0gQlVGRkVSSU5HX01PREVfTk9ORSkgewotICAgICAgICBtQnVmZmVyaW5nU2V0dGluZ3MubVJlYnVmZmVyaW5nV2F0ZXJtYXJrTG93TXMgPSBCdWZmZXJpbmdTZXR0aW5nczo6a05vV2F0ZXJtYXJrOwotICAgICAgICBtQnVmZmVyaW5nU2V0dGluZ3MubVJlYnVmZmVyaW5nV2F0ZXJtYXJrSGlnaE1zID0gSU5UMzJfTUFYOwotICAgIH0KLQogICAgIGlmIChtTGl2ZVNlc3Npb24gIT0gTlVMTCkgewogICAgICAgICBtTGl2ZVNlc3Npb24tPnNldEJ1ZmZlcmluZ1NldHRpbmdzKG1CdWZmZXJpbmdTZXR0aW5ncyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0hUVFBMaXZlU291cmNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvSFRUUExpdmVTb3VyY2UuaAppbmRleCAyODY2YTZhLi4yZDZjNjA0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvSFRUUExpdmVTb3VyY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvSFRUUExpdmVTb3VyY2UuaApAQCAtMzQsNyArMzQsNyBAQAogICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZWZhdWx0QnVmZmVyaW5nU2V0dGluZ3MoCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJpbmdTZXR0aW5ncygKICAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSBvdmVycmlkZTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5jcHAKaW5kZXggZGYzNjA0Ni4uYTVmNWZjNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuY3BwCkBAIC00OCw3ICs0OCw5IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9hdmNfdXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ2xvY2suaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CkBAIC01Niw3ICs1OCw2IEBACiAjaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgogCi0jaW5jbHVkZSAiYXZjX3V0aWxzLmgiCiAKICNpbmNsdWRlICJFU0RTLmgiCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KQEAgLTE3MiwxNCArMTczLDE3IEBACiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLU51UGxheWVyOjpOdVBsYXllcihwaWRfdCBwaWQpCitOdVBsYXllcjo6TnVQbGF5ZXIocGlkX3QgcGlkLCBjb25zdCBzcDxNZWRpYUNsb2NrPiAmbWVkaWFDbG9jaykKICAgICA6IG1VSURWYWxpZChmYWxzZSksCiAgICAgICBtUElEKHBpZCksCisgICAgICBtTWVkaWFDbG9jayhtZWRpYUNsb2NrKSwKICAgICAgIG1Tb3VyY2VGbGFncygwKSwKICAgICAgIG1PZmZsb2FkQXVkaW8oZmFsc2UpLAogICAgICAgbUF1ZGlvRGVjb2RlckdlbmVyYXRpb24oMCksCiAgICAgICBtVmlkZW9EZWNvZGVyR2VuZXJhdGlvbigwKSwKICAgICAgIG1SZW5kZXJlckdlbmVyYXRpb24oMCksCisgICAgICBtTGFzdFN0YXJ0ZWRQbGF5aW5nVGltZU5zKDApLAorICAgICAgbUxhc3RTdGFydGVkUmVidWZmZXJpbmdUaW1lTnMoMCksCiAgICAgICBtUHJldmlvdXNTZWVrVGltZVVzKDApLAogICAgICAgbUF1ZGlvRU9TKGZhbHNlKSwKICAgICAgIG1WaWRlb0VPUyhmYWxzZSksCkBAIC0yMDQsNiArMjA4LDcgQEAKICAgICAgIG1QYXVzZWRGb3JCdWZmZXJpbmcoZmFsc2UpLAogICAgICAgbUlzRHJtUHJvdGVjdGVkKGZhbHNlKSwKICAgICAgIG1EYXRhU291cmNlVHlwZShEQVRBX1NPVVJDRV9UWVBFX05PTkUpIHsKKyAgICBDSEVDSyhtZWRpYUNsb2NrICE9IE5VTEwpOwogICAgIGNsZWFyRmx1c2hDb21wbGV0ZSgpOwogfQogCkBAIC0yMTUsOCArMjIwLDExIEBACiAgICAgbVVJRCA9IHVpZDsKIH0KIAotdm9pZCBOdVBsYXllcjo6c2V0RHJpdmVyKGNvbnN0IHdwPE51UGxheWVyRHJpdmVyPiAmZHJpdmVyKSB7Cit2b2lkIE51UGxheWVyOjppbml0KGNvbnN0IHdwPE51UGxheWVyRHJpdmVyPiAmZHJpdmVyKSB7CiAgICAgbURyaXZlciA9IGRyaXZlcjsKKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRNZWRpYUNsb2NrTm90aWZ5LCB0aGlzKTsKKyAgICBtTWVkaWFDbG9jay0+c2V0Tm90aWZpY2F0aW9uTWVzc2FnZShub3RpZnkpOwogfQogCiB2b2lkIE51UGxheWVyOjpzZXREYXRhU291cmNlQXN5bmMoY29uc3Qgc3A8SVN0cmVhbVNvdXJjZT4gJnNvdXJjZSkgewpAQCAtMjc4LDcgKzI4Niw3IEBACiAgICAgICAgIEFMT0dWKCJzZXREYXRhU291cmNlQXN5bmMgR2VuZXJpY1NvdXJjZSAlcyIsIHVybCk7CiAKICAgICAgICAgc3A8R2VuZXJpY1NvdXJjZT4gZ2VuZXJpY1NvdXJjZSA9Ci0gICAgICAgICAgICAgICAgbmV3IEdlbmVyaWNTb3VyY2Uobm90aWZ5LCBtVUlEVmFsaWQsIG1VSUQpOworICAgICAgICAgICAgICAgIG5ldyBHZW5lcmljU291cmNlKG5vdGlmeSwgbVVJRFZhbGlkLCBtVUlELCBtTWVkaWFDbG9jayk7CiAKICAgICAgICAgc3RhdHVzX3QgZXJyID0gZ2VuZXJpY1NvdXJjZS0+c2V0RGF0YVNvdXJjZShodHRwU2VydmljZSwgdXJsLCBoZWFkZXJzKTsKIApAQCAtMzAxLDcgKzMwOSw3IEBACiAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFNvdXJjZU5vdGlmeSwgdGhpcyk7CiAKICAgICBzcDxHZW5lcmljU291cmNlPiBzb3VyY2UgPQotICAgICAgICAgICAgbmV3IEdlbmVyaWNTb3VyY2Uobm90aWZ5LCBtVUlEVmFsaWQsIG1VSUQpOworICAgICAgICAgICAgbmV3IEdlbmVyaWNTb3VyY2Uobm90aWZ5LCBtVUlEVmFsaWQsIG1VSUQsIG1NZWRpYUNsb2NrKTsKIAogICAgIEFMT0dWKCJzZXREYXRhU291cmNlQXN5bmMgZmQgJWQvJWxsZC8lbGxkIHNvdXJjZTogJXAiLAogICAgICAgICAgICAgZmQsIChsb25nIGxvbmcpb2Zmc2V0LCAobG9uZyBsb25nKWxlbmd0aCwgc291cmNlLmdldCgpKTsKQEAgLTMyMiw3ICszMzAsNyBAQAogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXREYXRhU291cmNlLCB0aGlzKTsKICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0U291cmNlTm90aWZ5LCB0aGlzKTsKIAotICAgIHNwPEdlbmVyaWNTb3VyY2U+IHNvdXJjZSA9IG5ldyBHZW5lcmljU291cmNlKG5vdGlmeSwgbVVJRFZhbGlkLCBtVUlEKTsKKyAgICBzcDxHZW5lcmljU291cmNlPiBzb3VyY2UgPSBuZXcgR2VuZXJpY1NvdXJjZShub3RpZnksIG1VSURWYWxpZCwgbVVJRCwgbU1lZGlhQ2xvY2spOwogICAgIHN0YXR1c190IGVyciA9IHNvdXJjZS0+c2V0RGF0YVNvdXJjZShkYXRhU291cmNlKTsKIAogICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTMzNSw5ICszNDMsOSBAQAogICAgIG1EYXRhU291cmNlVHlwZSA9IERBVEFfU09VUkNFX1RZUEVfTUVESUE7CiB9CiAKLXN0YXR1c190IE51UGxheWVyOjpnZXREZWZhdWx0QnVmZmVyaW5nU2V0dGluZ3MoCitzdGF0dXNfdCBOdVBsYXllcjo6Z2V0QnVmZmVyaW5nU2V0dGluZ3MoCiAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzICpidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXREZWZhdWx0QnVmZmVyaW5nU2V0dGluZ3MsIHRoaXMpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRCdWZmZXJpbmdTZXR0aW5ncywgdGhpcyk7CiAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwogICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKICAgICBpZiAoZXJyID09IE9LICYmIHJlc3BvbnNlICE9IE5VTEwpIHsKQEAgLTQ3MCw2ICs0NzgsMTMgQEAKICAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVzZXQsIHRoaXMpKS0+cG9zdCgpOwogfQogCitzdGF0dXNfdCBOdVBsYXllcjo6bm90aWZ5QXQoaW50NjRfdCBtZWRpYVRpbWVVcykgeworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXROb3RpZnlUaW1lLCB0aGlzKTsKKyAgICBub3RpZnktPnNldEludDY0KCJ0aW1lclVzIiwgbWVkaWFUaW1lVXMpOworICAgIG1NZWRpYUNsb2NrLT5hZGRUaW1lcihub3RpZnksIG1lZGlhVGltZVVzKTsKKyAgICByZXR1cm4gT0s7Cit9CisKIHZvaWQgTnVQbGF5ZXI6OnNlZWtUb0FzeW5jKGludDY0X3Qgc2Vla1RpbWVVcywgTWVkaWFQbGF5ZXJTZWVrTW9kZSBtb2RlLCBib29sIG5lZWROb3RpZnkpIHsKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VlaywgdGhpcyk7CiAgICAgbXNnLT5zZXRJbnQ2NCgic2Vla1RpbWVVcyIsIHNlZWtUaW1lVXMpOwpAQCAtNTU2LDE2ICs1NzEsMTYgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgY2FzZSBrV2hhdEdldERlZmF1bHRCdWZmZXJpbmdTZXR0aW5nczoKKyAgICAgICAgY2FzZSBrV2hhdEdldEJ1ZmZlcmluZ1NldHRpbmdzOgogICAgICAgICB7CiAgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAotICAgICAgICAgICAgQUxPR1YoImtXaGF0R2V0RGVmYXVsdEJ1ZmZlcmluZ1NldHRpbmdzIik7CisgICAgICAgICAgICBBTE9HVigia1doYXRHZXRCdWZmZXJpbmdTZXR0aW5ncyIpOwogICAgICAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MgYnVmZmVyaW5nOwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7CiAgICAgICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gbVNvdXJjZS0+Z2V0RGVmYXVsdEJ1ZmZlcmluZ1NldHRpbmdzKCZidWZmZXJpbmcpOworICAgICAgICAgICAgICAgIGVyciA9IG1Tb3VyY2UtPmdldEJ1ZmZlcmluZ1NldHRpbmdzKCZidWZmZXJpbmcpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBlcnIgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgIH0KQEAgLTEyNzQsNyArMTI4OSw4IEBACiAgICAgICAgICAgICAgICAgQUxPR1YoIlRlYXIgZG93biBhdWRpbyB3aXRoIHJlYXNvbiAlZC4iLCByZWFzb24pOwogICAgICAgICAgICAgICAgIGlmIChyZWFzb24gPT0gUmVuZGVyZXI6OmtEdWVUb1RpbWVvdXQgJiYgIShtUGF1c2VkICYmIG1PZmZsb2FkQXVkaW8pKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFRpbWVvdXRXaGVuUGF1c2VkIGlzIG9ubHkgZm9yIG9mZmxvYWQgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgQUxPR1coIlJlY2VpdmUgYSBzdGFsZSBtZXNzYWdlIGZvciB0ZWFyZG93bi4iKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIlJlY2VpdmVkIGEgc3RhbGUgbWVzc2FnZSBmb3IgdGVhcmRvd24sIG1QYXVzZWQoJWQpLCBtT2ZmbG9hZEF1ZGlvKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYXVzZWQsIG1PZmZsb2FkQXVkaW8pOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaW50NjRfdCBwb3NpdGlvblVzOwpAQCAtMTI5OSw2ICsxMzE1LDggQEAKICAgICAgICAgICAgIEFMT0dWKCJrV2hhdFJlc2V0Iik7CiAKICAgICAgICAgICAgIG1SZXNldHRpbmcgPSB0cnVlOworICAgICAgICAgICAgdXBkYXRlUGxheWJhY2tUaW1lcih0cnVlIC8qIHN0b3BwaW5nICovLCAia1doYXRSZXNldCIpOworICAgICAgICAgICAgdXBkYXRlUmVidWZmZXJpbmdUaW1lcih0cnVlIC8qIHN0b3BwaW5nICovLCB0cnVlIC8qIGV4aXRpbmcgKi8pOwogCiAgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKICAgICAgICAgICAgICAgICAgICAgbmV3IEZsdXNoRGVjb2RlckFjdGlvbigKQEAgLTEzMTIsNiArMTMzMCwxNiBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0Tm90aWZ5VGltZToKKyAgICAgICAgeworICAgICAgICAgICAgQUxPR1YoImtXaGF0Tm90aWZ5VGltZSIpOworICAgICAgICAgICAgaW50NjRfdCB0aW1lclVzOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInRpbWVyVXMiLCAmdGltZXJVcykpOworCisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9OT1RJRllfVElNRSwgdGltZXJVcywgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2Uga1doYXRTZWVrOgogICAgICAgICB7CiAgICAgICAgICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CkBAIC0xNDAxLDYgKzE0MjksNDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBrV2hhdE1lZGlhQ2xvY2tOb3RpZnk6CisgICAgICAgIHsKKyAgICAgICAgICAgIEFMT0dWKCJrV2hhdE1lZGlhQ2xvY2tOb3RpZnkiKTsKKyAgICAgICAgICAgIGludDY0X3QgYW5jaG9yTWVkaWFVcywgYW5jaG9yUmVhbFVzOworICAgICAgICAgICAgZmxvYXQgcGxheWJhY2tSYXRlOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoImFuY2hvci1tZWRpYS11cyIsICZhbmNob3JNZWRpYVVzKSk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgiYW5jaG9yLXJlYWwtdXMiLCAmYW5jaG9yUmVhbFVzKSk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRGbG9hdCgicGxheWJhY2stcmF0ZSIsICZwbGF5YmFja1JhdGUpKTsKKworICAgICAgICAgICAgUGFyY2VsIGluOworICAgICAgICAgICAgaW4ud3JpdGVJbnQ2NChhbmNob3JNZWRpYVVzKTsKKyAgICAgICAgICAgIGluLndyaXRlSW50NjQoYW5jaG9yUmVhbFVzKTsKKyAgICAgICAgICAgIGluLndyaXRlRmxvYXQocGxheWJhY2tSYXRlKTsKKworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUFfVElNRV9ESVNDT05USU5VSVRZLCAwLCAwLCAmaW4pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0R2V0U3RhdHM6CisgICAgICAgIHsKKyAgICAgICAgICAgIEFMT0dWKCJrV2hhdEdldFN0YXRzIik7CisKKyAgICAgICAgICAgIFZlY3RvcjxzcDxBTWVzc2FnZT4+ICp0cmFja1N0YXRzOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigidHJhY2tzdGF0cyIsICh2b2lkKiopJnRyYWNrU3RhdHMpKTsKKworICAgICAgICAgICAgdHJhY2tTdGF0cy0+Y2xlYXIoKTsKKyAgICAgICAgICAgIGlmIChtVmlkZW9EZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICB0cmFja1N0YXRzLT5wdXNoX2JhY2sobVZpZGVvRGVjb2Rlci0+Z2V0U3RhdHMoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUF1ZGlvRGVjb2RlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgdHJhY2tTdGF0cy0+cHVzaF9iYWNrKG1BdWRpb0RlY29kZXItPmdldFN0YXRzKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyByZXNwb25kIGZvciBzeW5jaHJvbml6YXRpb24KKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIFRSRVNQQVNTKCk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTE0MjksNyArMTQ5OCw3IEBACiAgICAgICAgIEFMT0dXKCJyZXN1bWUgY2FsbGVkIHdoZW4gcmVuZGVyZXIgaXMgZ29uZSBvciBub3Qgc2V0Iik7CiAgICAgfQogCi0gICAgbUxhc3RTdGFydGVkUGxheWluZ1RpbWVOcyA9IHN5c3RlbVRpbWUoKTsKKyAgICBzdGFydFBsYXliYWNrVGltZXIoIm9ucmVzdW1lIik7CiB9CiAKIHN0YXR1c190IE51UGxheWVyOjpvbkluc3RhbnRpYXRlU2VjdXJlRGVjb2RlcnMoKSB7CkBAIC0xNTIzLDcgKzE1OTIsNyBAQAogICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZW5kZXJlck5vdGlmeSwgdGhpcyk7CiAgICAgKyttUmVuZGVyZXJHZW5lcmF0aW9uOwogICAgIG5vdGlmeS0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtUmVuZGVyZXJHZW5lcmF0aW9uKTsKLSAgICBtUmVuZGVyZXIgPSBuZXcgUmVuZGVyZXIobUF1ZGlvU2luaywgbm90aWZ5LCBmbGFncyk7CisgICAgbVJlbmRlcmVyID0gbmV3IFJlbmRlcmVyKG1BdWRpb1NpbmssIG1NZWRpYUNsb2NrLCBub3RpZnksIGZsYWdzKTsKICAgICBtUmVuZGVyZXJMb29wZXIgPSBuZXcgQUxvb3BlcjsKICAgICBtUmVuZGVyZXJMb29wZXItPnNldE5hbWUoIk51UGxheWVyUmVuZGVyZXIiKTsKICAgICBtUmVuZGVyZXJMb29wZXItPnN0YXJ0KGZhbHNlLCBmYWxzZSwgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7CkBAIC0xNTQ5LDEyICsxNjE4LDkxIEBACiAgICAgICAgIG1BdWRpb0RlY29kZXItPnNldFJlbmRlcmVyKG1SZW5kZXJlcik7CiAgICAgfQogCi0gICAgbUxhc3RTdGFydGVkUGxheWluZ1RpbWVOcyA9IHN5c3RlbVRpbWUoKTsKKyAgICBzdGFydFBsYXliYWNrVGltZXIoIm9uc3RhcnQiKTsKIAogICAgIHBvc3RTY2FuU291cmNlcygpOwogfQogCit2b2lkIE51UGxheWVyOjpzdGFydFBsYXliYWNrVGltZXIoY29uc3QgY2hhciAqd2hlcmUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVBsYXlpbmdUaW1lTG9jayk7CisgICAgaWYgKG1MYXN0U3RhcnRlZFBsYXlpbmdUaW1lTnMgPT0gMCkgeworICAgICAgICBtTGFzdFN0YXJ0ZWRQbGF5aW5nVGltZU5zID0gc3lzdGVtVGltZSgpOworICAgICAgICBBTE9HVigic3RhcnRQbGF5YmFja1RpbWVyKCkgdGltZSAlMjAiIFBSSWQ2NCAiICglcykiLCAgbUxhc3RTdGFydGVkUGxheWluZ1RpbWVOcywgd2hlcmUpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjo6dXBkYXRlUGxheWJhY2tUaW1lcihib29sIHN0b3BwaW5nLCBjb25zdCBjaGFyICp3aGVyZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtUGxheWluZ1RpbWVMb2NrKTsKKworICAgIEFMT0dWKCJ1cGRhdGVQbGF5YmFja1RpbWVyKCVzKSAgdGltZSAlMjAiIFBSSWQ2NCAiICglcykiLAorCSAgc3RvcHBpbmcgPyAic3RvcCIgOiAic25hcCIsIG1MYXN0U3RhcnRlZFBsYXlpbmdUaW1lTnMsIHdoZXJlKTsKKworICAgIGlmIChtTGFzdFN0YXJ0ZWRQbGF5aW5nVGltZU5zICE9IDApIHsKKyAgICAgICAgc3A8TnVQbGF5ZXJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOworICAgICAgICBpbnQ2NF90IG5vdyA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgaWYgKGRyaXZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBpbnQ2NF90IHBsYXllZCA9IG5vdyAtIG1MYXN0U3RhcnRlZFBsYXlpbmdUaW1lTnM7CisgICAgICAgICAgICBBTE9HVigidXBkYXRlUGxheWJhY2tUaW1lcigpICBsb2cgICUyMCIgUFJJZDY0ICIiLCBwbGF5ZWQpOworCisgICAgICAgICAgICBpZiAocGxheWVkID4gMCkgeworICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5TW9yZVBsYXlpbmdUaW1lVXMoKHBsYXllZCs1MDApLzEwMDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisJaWYgKHN0b3BwaW5nKSB7CisgICAgICAgICAgICBtTGFzdFN0YXJ0ZWRQbGF5aW5nVGltZU5zID0gMDsKKwl9IGVsc2UgeworICAgICAgICAgICAgbUxhc3RTdGFydGVkUGxheWluZ1RpbWVOcyA9IG5vdzsKKwl9CisgICAgfQorfQorCit2b2lkIE51UGxheWVyOjpzdGFydFJlYnVmZmVyaW5nVGltZXIoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1QbGF5aW5nVGltZUxvY2spOworICAgIGlmIChtTGFzdFN0YXJ0ZWRSZWJ1ZmZlcmluZ1RpbWVOcyA9PSAwKSB7CisgICAgICAgIG1MYXN0U3RhcnRlZFJlYnVmZmVyaW5nVGltZU5zID0gc3lzdGVtVGltZSgpOworICAgICAgICBBTE9HVigic3RhcnRSZWJ1ZmZlcmluZ1RpbWVyKCkgdGltZSAlMjAiIFBSSWQ2NCAiIiwgIG1MYXN0U3RhcnRlZFJlYnVmZmVyaW5nVGltZU5zKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OnVwZGF0ZVJlYnVmZmVyaW5nVGltZXIoYm9vbCBzdG9wcGluZywgYm9vbCBleGl0aW5nUGxheWJhY2spIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVBsYXlpbmdUaW1lTG9jayk7CisKKyAgICBBTE9HVigidXBkYXRlUmVidWZmZXJpbmdUaW1lciglcykgIHRpbWUgJTIwIiBQUklkNjQgIiAoZXhpdGluZyAlZCkiLAorCSAgc3RvcHBpbmcgPyAic3RvcCIgOiAic25hcCIsIG1MYXN0U3RhcnRlZFJlYnVmZmVyaW5nVGltZU5zLCBleGl0aW5nUGxheWJhY2spOworCisgICAgaWYgKG1MYXN0U3RhcnRlZFJlYnVmZmVyaW5nVGltZU5zICE9IDApIHsKKyAgICAgICAgc3A8TnVQbGF5ZXJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOworICAgICAgICBpbnQ2NF90IG5vdyA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgaWYgKGRyaXZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBpbnQ2NF90IHJlYnVmZmVyZWQgPSBub3cgLSBtTGFzdFN0YXJ0ZWRSZWJ1ZmZlcmluZ1RpbWVOczsKKyAgICAgICAgICAgIEFMT0dWKCJ1cGRhdGVSZWJ1ZmZlcmluZ1RpbWVyKCkgIGxvZyAgJTIwIiBQUklkNjQgIiIsIHJlYnVmZmVyZWQpOworCisgICAgICAgICAgICBpZiAocmVidWZmZXJlZCA+IDApIHsKKyAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeU1vcmVSZWJ1ZmZlcmluZ1RpbWVVcygocmVidWZmZXJlZCs1MDApLzEwMDApOworICAgICAgICAgICAgICAgIGlmIChleGl0aW5nUGxheWJhY2spIHsKKyAgICAgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlSZWJ1ZmZlcmluZ1doZW5FeGl0KHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCWlmIChzdG9wcGluZykgeworICAgICAgICAgICAgbUxhc3RTdGFydGVkUmVidWZmZXJpbmdUaW1lTnMgPSAwOworCX0gZWxzZSB7CisgICAgICAgICAgICBtTGFzdFN0YXJ0ZWRSZWJ1ZmZlcmluZ1RpbWVOcyA9IG5vdzsKKwl9CisgICAgfQorfQorCit2b2lkIE51UGxheWVyOjp1cGRhdGVJbnRlcm5hbFRpbWVycygpIHsKKyAgICAvLyB1cGRhdGUgdmFsdWVzLCBidXQgdGlja2luZyBjbG9ja3Mga2VlcCB0aWNraW5nCisgICAgQUxPR1YoInVwZGF0ZUludGVybmFsVGltZXJzKCkiKTsKKyAgICB1cGRhdGVQbGF5YmFja1RpbWVyKGZhbHNlIC8qIHN0b3BwaW5nICovLCAidXBkYXRlSW50ZXJuYWxUaW1lcnMiKTsKKyAgICB1cGRhdGVSZWJ1ZmZlcmluZ1RpbWVyKGZhbHNlIC8qIHN0b3BwaW5nICovLCBmYWxzZSAvKiBleGl0aW5nICovKTsKK30KKwogdm9pZCBOdVBsYXllcjo6b25QYXVzZSgpIHsKKworICAgIHVwZGF0ZVBsYXliYWNrVGltZXIodHJ1ZSAvKiBzdG9wcGluZyAqLywgIm9uUGF1c2UiKTsKKwogICAgIGlmIChtUGF1c2VkKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0xNTcwLDEzICsxNzE4LDYgQEAKICAgICAgICAgQUxPR1coInBhdXNlIGNhbGxlZCB3aGVuIHJlbmRlcmVyIGlzIGdvbmUgb3Igbm90IHNldCIpOwogICAgIH0KIAotICAgIHNwPE51UGxheWVyRHJpdmVyPiBkcml2ZXIgPSBtRHJpdmVyLnByb21vdGUoKTsKLSAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKLSAgICAgICAgaW50NjRfdCBub3cgPSBzeXN0ZW1UaW1lKCk7Ci0gICAgICAgIGludDY0X3QgcGxheWVkID0gbm93IC0gbUxhc3RTdGFydGVkUGxheWluZ1RpbWVOczsKLQotICAgICAgICBkcml2ZXItPm5vdGlmeU1vcmVQbGF5aW5nVGltZVVzKChwbGF5ZWQrNTAwKS8xMDAwKTsKLSAgICB9CiB9CiAKIGJvb2wgTnVQbGF5ZXI6OmF1ZGlvRGVjb2RlclN0aWxsTmVlZGVkKCkgewpAQCAtMTY3Miw2ICsxODEzLDggQEAKIAogdm9pZCBOdVBsYXllcjo6cmVzdGFydEF1ZGlvKAogICAgICAgICBpbnQ2NF90IGN1cnJlbnRQb3NpdGlvblVzLCBib29sIGZvcmNlTm9uT2ZmbG9hZCwgYm9vbCBuZWVkc1RvQ3JlYXRlQXVkaW9EZWNvZGVyKSB7CisgICAgQUxPR0QoInJlc3RhcnRBdWRpbyB0aW1lVXMoJWxsZCksIGRvbnRPZmZsb2FkKCVkKSwgY3JlYXRlRGVjb2RlciglZCkiLAorICAgICAgICAgIChsb25nIGxvbmcpY3VycmVudFBvc2l0aW9uVXMsIGZvcmNlTm9uT2ZmbG9hZCwgbmVlZHNUb0NyZWF0ZUF1ZGlvRGVjb2Rlcik7CiAgICAgaWYgKG1BdWRpb0RlY29kZXIgIT0gTlVMTCkgewogICAgICAgICBtQXVkaW9EZWNvZGVyLT5wYXVzZSgpOwogICAgICAgICBtQXVkaW9EZWNvZGVyLmNsZWFyKCk7CkBAIC0yMDkwLDE2ICsyMjMzLDE2IEBACiAgICAgcmV0dXJuIHJlbmRlcmVyLT5nZXRDdXJyZW50UG9zaXRpb24obWVkaWFVcyk7CiB9CiAKLXZvaWQgTnVQbGF5ZXI6OmdldFN0YXRzKFZlY3RvcjxzcDxBTWVzc2FnZT4gPiAqbVRyYWNrU3RhdHMpIHsKLSAgICBDSEVDSyhtVHJhY2tTdGF0cyAhPSBOVUxMKTsKK3ZvaWQgTnVQbGF5ZXI6OmdldFN0YXRzKFZlY3RvcjxzcDxBTWVzc2FnZT4gPiAqdHJhY2tTdGF0cykgeworICAgIENIRUNLKHRyYWNrU3RhdHMgIT0gTlVMTCk7CiAKLSAgICBtVHJhY2tTdGF0cy0+Y2xlYXIoKTsKLSAgICBpZiAobVZpZGVvRGVjb2RlciAhPSBOVUxMKSB7Ci0gICAgICAgIG1UcmFja1N0YXRzLT5wdXNoX2JhY2sobVZpZGVvRGVjb2Rlci0+Z2V0U3RhdHMoKSk7Ci0gICAgfQotICAgIGlmIChtQXVkaW9EZWNvZGVyICE9IE5VTEwpIHsKLSAgICAgICAgbVRyYWNrU3RhdHMtPnB1c2hfYmFjayhtQXVkaW9EZWNvZGVyLT5nZXRTdGF0cygpKTsKLSAgICB9CisgICAgQUxPR1YoIk51UGxheWVyOjpnZXRTdGF0cygpIik7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEdldFN0YXRzLCB0aGlzKTsKKyAgICBtc2ctPnNldFBvaW50ZXIoInRyYWNrc3RhdHMiLCB0cmFja1N0YXRzKTsKKworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICAodm9pZCkgbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworICAgIC8vIHJlc3BvbnNlIGlzIGZvciBzeW5jaHJvbml6YXRpb24sIGlnbm9yZSBjb250ZW50cwogfQogCiBzcDxNZXRhRGF0YT4gTnVQbGF5ZXI6OmdldEZpbGVNZXRhKCkgewpAQCAtMjIwMyw2ICsyMzQ2LDkgQEAKICAgICBDSEVDSyhtQXVkaW9EZWNvZGVyID09IE5VTEwpOwogICAgIENIRUNLKG1WaWRlb0RlY29kZXIgPT0gTlVMTCk7CiAKKyAgICB1cGRhdGVQbGF5YmFja1RpbWVyKHRydWUgLyogc3RvcHBpbmcgKi8sICJwZXJmb3JtUmVzZXQiKTsKKyAgICB1cGRhdGVSZWJ1ZmZlcmluZ1RpbWVyKHRydWUgLyogc3RvcHBpbmcgKi8sIHRydWUgLyogZXhpdGluZyAqLyk7CisKICAgICBjYW5jZWxQb2xsRHVyYXRpb24oKTsKIAogICAgICsrbVNjYW5Tb3VyY2VzR2VuZXJhdGlvbjsKQEAgLTI0NTUsNiArMjYwMSw3IEBACiAgICAgICAgICAgICBpZiAobVN0YXJ0ZWQpIHsKICAgICAgICAgICAgICAgICBBTE9HSSgiYnVmZmVyIGxvdywgcGF1c2luZy4uLiIpOwogCisgICAgICAgICAgICAgICAgc3RhcnRSZWJ1ZmZlcmluZ1RpbWVyKCk7CiAgICAgICAgICAgICAgICAgbVBhdXNlZEZvckJ1ZmZlcmluZyA9IHRydWU7CiAgICAgICAgICAgICAgICAgb25QYXVzZSgpOwogICAgICAgICAgICAgfQpAQCAtMjQ2OCw2ICsyNjE1LDcgQEAKICAgICAgICAgICAgIGlmIChtU3RhcnRlZCkgewogICAgICAgICAgICAgICAgIEFMT0dJKCJidWZmZXIgcmVhZHksIHJlc3VtaW5nLi4uIik7CiAKKyAgICAgICAgICAgICAgICB1cGRhdGVSZWJ1ZmZlcmluZ1RpbWVyKHRydWUgLyogc3RvcHBpbmcgKi8sIGZhbHNlIC8qIGV4aXRpbmcgKi8pOwogICAgICAgICAgICAgICAgIG1QYXVzZWRGb3JCdWZmZXJpbmcgPSBmYWxzZTsKIAogICAgICAgICAgICAgICAgIC8vIGRvIG5vdCByZXN1bWUgeWV0IGlmIGNsaWVudCBkaWRuJ3QgdW5wYXVzZQpAQCAtMjYwMSw3ICsyNzQ5LDcgQEAKIHZvaWQgTnVQbGF5ZXI6OnNlbmRTdWJ0aXRsZURhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciwgaW50MzJfdCBiYXNlSW5kZXgpIHsKICAgICBpbnQzMl90IHRyYWNrSW5kZXg7CiAgICAgaW50NjRfdCB0aW1lVXMsIGR1cmF0aW9uVXM7Ci0gICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigidHJhY2tJbmRleCIsICZ0cmFja0luZGV4KSk7CisgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigidHJhY2staW5kZXgiLCAmdHJhY2tJbmRleCkpOwogICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJkdXJhdGlvblVzIiwgJmR1cmF0aW9uVXMpKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuaAppbmRleCBjNjk4MzVmLi5lNDAwZDE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuaApAQCAtMzAsMTUgKzMwLDE2IEBACiBzdHJ1Y3QgQXVkaW9QbGF5YmFja1JhdGU7CiBzdHJ1Y3QgQVZTeW5jU2V0dGluZ3M7CiBjbGFzcyBJRGF0YVNvdXJjZTsKK3N0cnVjdCBNZWRpYUNsb2NrOwogY2xhc3MgTWV0YURhdGE7CiBzdHJ1Y3QgTnVQbGF5ZXJEcml2ZXI7CiAKIHN0cnVjdCBOdVBsYXllciA6IHB1YmxpYyBBSGFuZGxlciB7Ci0gICAgZXhwbGljaXQgTnVQbGF5ZXIocGlkX3QgcGlkKTsKKyAgICBleHBsaWNpdCBOdVBsYXllcihwaWRfdCBwaWQsIGNvbnN0IHNwPE1lZGlhQ2xvY2s+ICZtZWRpYUNsb2NrKTsKIAogICAgIHZvaWQgc2V0VUlEKHVpZF90IHVpZCk7CiAKLSAgICB2b2lkIHNldERyaXZlcihjb25zdCB3cDxOdVBsYXllckRyaXZlcj4gJmRyaXZlcik7CisgICAgdm9pZCBpbml0KGNvbnN0IHdwPE51UGxheWVyRHJpdmVyPiAmZHJpdmVyKTsKIAogICAgIHZvaWQgc2V0RGF0YVNvdXJjZUFzeW5jKGNvbnN0IHNwPElTdHJlYW1Tb3VyY2U+ICZzb3VyY2UpOwogCkBAIC01MSw3ICs1Miw3IEBACiAKICAgICB2b2lkIHNldERhdGFTb3VyY2VBc3luYyhjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKTsKIAotICAgIHN0YXR1c190IGdldERlZmF1bHRCdWZmZXJpbmdTZXR0aW5ncyhCdWZmZXJpbmdTZXR0aW5ncyogYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pOworICAgIHN0YXR1c190IGdldEJ1ZmZlcmluZ1NldHRpbmdzKEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLyk7CiAgICAgc3RhdHVzX3Qgc2V0QnVmZmVyaW5nU2V0dGluZ3MoY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MmIGJ1ZmZlcmluZyk7CiAKICAgICB2b2lkIHByZXBhcmVBc3luYygpOwpAQCAtNzIsNiArNzMsOSBAQAogICAgIC8vIFdpbGwgbm90aWZ5IHRoZSBkcml2ZXIgdGhyb3VnaCAibm90aWZ5UmVzZXRDb21wbGV0ZSIgb25jZSBmaW5pc2hlZC4KICAgICB2b2lkIHJlc2V0QXN5bmMoKTsKIAorICAgIC8vIFJlcXVlc3QgYSBub3RpZmljYXRpb24gd2hlbiBzcGVjaWZpZWQgbWVkaWEgdGltZSBpcyByZWFjaGVkLgorICAgIHN0YXR1c190IG5vdGlmeUF0KGludDY0X3QgbWVkaWFUaW1lVXMpOworCiAgICAgLy8gV2lsbCBub3RpZnkgdGhlIGRyaXZlciB0aHJvdWdoICJub3RpZnlTZWVrQ29tcGxldGUiIG9uY2UgZmluaXNoZWQKICAgICAvLyBhbmQgbmVlZE5vdGlmeSBpcyB0cnVlLgogICAgIHZvaWQgc2Vla1RvQXN5bmMoCkBAIC04NCw3ICs4OCw3IEBACiAgICAgc3RhdHVzX3QgZ2V0U2VsZWN0ZWRUcmFjayhpbnQzMl90IHR5cGUsIFBhcmNlbCogcmVwbHkpIGNvbnN0OwogICAgIHN0YXR1c190IHNlbGVjdFRyYWNrKHNpemVfdCB0cmFja0luZGV4LCBib29sIHNlbGVjdCwgaW50NjRfdCB0aW1lVXMpOwogICAgIHN0YXR1c190IGdldEN1cnJlbnRQb3NpdGlvbihpbnQ2NF90ICptZWRpYVVzKTsKLSAgICB2b2lkIGdldFN0YXRzKFZlY3RvcjxzcDxBTWVzc2FnZT4gPiAqbVRyYWNrU3RhdHMpOworICAgIHZvaWQgZ2V0U3RhdHMoVmVjdG9yPHNwPEFNZXNzYWdlPiA+ICp0cmFja1N0YXRzKTsKIAogICAgIHNwPE1ldGFEYXRhPiBnZXRGaWxlTWV0YSgpOwogICAgIGZsb2F0IGdldEZyYW1lUmF0ZSgpOwpAQCAtOTUsNiArOTksOCBAQAogCiAgICAgY29uc3QgY2hhciAqZ2V0RGF0YVNvdXJjZVR5cGUoKTsKIAorICAgIHZvaWQgdXBkYXRlSW50ZXJuYWxUaW1lcnMoKTsKKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfk51UGxheWVyKCk7CiAKQEAgLTEzOSw2ICsxNDUsNyBAQAogICAgICAgICBrV2hhdENsb3NlZENhcHRpb25Ob3RpZnkgICAgICAgID0gJ2NhcE4nLAogICAgICAgICBrV2hhdFJlbmRlcmVyTm90aWZ5ICAgICAgICAgICAgID0gJ3Jlbk4nLAogICAgICAgICBrV2hhdFJlc2V0ICAgICAgICAgICAgICAgICAgICAgID0gJ3JzZXQnLAorICAgICAgICBrV2hhdE5vdGlmeVRpbWUgICAgICAgICAgICAgICAgID0gJ25meVQnLAogICAgICAgICBrV2hhdFNlZWsgICAgICAgICAgICAgICAgICAgICAgID0gJ3NlZWsnLAogICAgICAgICBrV2hhdFBhdXNlICAgICAgICAgICAgICAgICAgICAgID0gJ3BhdXMnLAogICAgICAgICBrV2hhdFJlc3VtZSAgICAgICAgICAgICAgICAgICAgID0gJ3JzbWUnLApAQCAtMTQ3LDE2ICsxNTQsMTkgQEAKICAgICAgICAga1doYXRHZXRUcmFja0luZm8gICAgICAgICAgICAgICA9ICdnVHJJJywKICAgICAgICAga1doYXRHZXRTZWxlY3RlZFRyYWNrICAgICAgICAgICA9ICdnU2VsJywKICAgICAgICAga1doYXRTZWxlY3RUcmFjayAgICAgICAgICAgICAgICA9ICdzZWxUJywKLSAgICAgICAga1doYXRHZXREZWZhdWx0QnVmZmVyaW5nU2V0dGluZ3MgPSAnZ0RCUycsCisgICAgICAgIGtXaGF0R2V0QnVmZmVyaW5nU2V0dGluZ3MgICAgICAgPSAnZ0J1cycsCiAgICAgICAgIGtXaGF0U2V0QnVmZmVyaW5nU2V0dGluZ3MgICAgICAgPSAnc0J1UycsCiAgICAgICAgIGtXaGF0UHJlcGFyZURybSAgICAgICAgICAgICAgICAgPSAncERybScsCiAgICAgICAgIGtXaGF0UmVsZWFzZURybSAgICAgICAgICAgICAgICAgPSAnckRybScsCisgICAgICAgIGtXaGF0TWVkaWFDbG9ja05vdGlmeSAgICAgICAgICAgPSAnbWNrTicsCisgICAgICAgIGtXaGF0R2V0U3RhdHMgICAgICAgICAgICAgICAgICAgPSAnZ1N0cycsCiAgICAgfTsKIAogICAgIHdwPE51UGxheWVyRHJpdmVyPiBtRHJpdmVyOwogICAgIGJvb2wgbVVJRFZhbGlkOwogICAgIHVpZF90IG1VSUQ7CiAgICAgcGlkX3QgbVBJRDsKKyAgICBjb25zdCBzcDxNZWRpYUNsb2NrPiBtTWVkaWFDbG9jazsKICAgICBNdXRleCBtU291cmNlTG9jazsgIC8vIGd1YXJkIHxtU291cmNlfC4KICAgICBzcDxTb3VyY2U+IG1Tb3VyY2U7CiAgICAgdWludDMyX3QgbVNvdXJjZUZsYWdzOwpAQCAtMTcyLDcgKzE4MiwxNCBAQAogICAgIGludDMyX3QgbVZpZGVvRGVjb2RlckdlbmVyYXRpb247CiAgICAgaW50MzJfdCBtUmVuZGVyZXJHZW5lcmF0aW9uOwogCisgICAgTXV0ZXggbVBsYXlpbmdUaW1lTG9jazsKICAgICBpbnQ2NF90IG1MYXN0U3RhcnRlZFBsYXlpbmdUaW1lTnM7CisgICAgdm9pZCB1cGRhdGVQbGF5YmFja1RpbWVyKGJvb2wgc3RvcHBpbmcsIGNvbnN0IGNoYXIgKndoZXJlKTsKKyAgICB2b2lkIHN0YXJ0UGxheWJhY2tUaW1lcihjb25zdCBjaGFyICp3aGVyZSk7CisKKyAgICBpbnQ2NF90IG1MYXN0U3RhcnRlZFJlYnVmZmVyaW5nVGltZU5zOworICAgIHZvaWQgc3RhcnRSZWJ1ZmZlcmluZ1RpbWVyKCk7CisgICAgdm9pZCB1cGRhdGVSZWJ1ZmZlcmluZ1RpbWVyKGJvb2wgc3RvcHBpbmcsIGJvb2wgZXhpdGluZ1BsYXliYWNrKTsKIAogICAgIGludDY0X3QgbVByZXZpb3VzU2Vla1RpbWVVczsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyQ0NEZWNvZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckNDRGVjb2Rlci5jcHAKaW5kZXggNzNiMDdiYi4uZmIxMjM2MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyQ0NEZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJDQ0RlY29kZXIuY3BwCkBAIC0xOSwxMyArMTksMTMgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCi0jaW5jbHVkZSAiYXZjX3V0aWxzLmgiCiAjaW5jbHVkZSAiTnVQbGF5ZXJDQ0RlY29kZXIuaCIKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYXZjX3V0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTE1NSw3ICsxNTUsOSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBBTE9HRSgiVW5rbm93biB0cmFjayB0eXBlOiAlZCIsIHRyYWNrLm1UcmFja1R5cGUpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJ0eXBlIiwgTUVESUFfVFJBQ0tfVFlQRV9VTktOT1dOKTsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOworICAgICAgICAgICAgcmV0dXJuIGZvcm1hdDsKICAgICB9CiAKICAgICAvLyBGb3IgQ0VBLTYwOCBDQzEsIGZpZWxkIDAgY2hhbm5lbCAwCkBAIC0zMDEsNyArMzAzLDcgQEAKIC8vIHJldHVybnMgdHJ1ZSBpZiBhIG5ldyBDQyB0cmFjayBpcyBmb3VuZAogYm9vbCBOdVBsYXllcjo6Q0NEZWNvZGVyOjpleHRyYWN0RnJvbU1QRUdVc2VyRGF0YShjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCkgewogICAgIHNwPEFCdWZmZXI+IG1wZWdVc2VyRGF0YTsKLSAgICBpZiAoIWFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEJ1ZmZlcigibXBlZ1VzZXJEYXRhIiwgJm1wZWdVc2VyRGF0YSkKKyAgICBpZiAoIWFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEJ1ZmZlcigibXBlZy11c2VyLWRhdGEiLCAmbXBlZ1VzZXJEYXRhKQogICAgICAgICAgICAgfHwgbXBlZ1VzZXJEYXRhID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTUzOCw3ICs1NDAsNyBAQAogICAgICAgICBkdW1wQnl0ZVBhaXIoY2NCdWYpOwogI2VuZGlmCiAKLSAgICAgICAgY2NCdWYtPm1ldGEoKS0+c2V0SW50MzIoInRyYWNrSW5kZXgiLCBtU2VsZWN0ZWRUcmFjayk7CisgICAgICAgIGNjQnVmLT5tZXRhKCktPnNldEludDMyKCJ0cmFjay1pbmRleCIsIG1TZWxlY3RlZFRyYWNrKTsKICAgICAgICAgY2NCdWYtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CiAgICAgICAgIGNjQnVmLT5tZXRhKCktPnNldEludDY0KCJkdXJhdGlvblVzIiwgMGxsKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmNwcAppbmRleCBhYzE4N2NjLi42OWNkODJlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmNwcApAQCAtMjksMTAgKzI5LDEyIEBACiAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUJ1ZmZlckhvbGRlci5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgpAQCAtNDAsNyArNDIsNiBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CiAKLSNpbmNsdWRlICJhdmNfdXRpbHMuaCIKICNpbmNsdWRlICJBVFNQYXJzZXIuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNzQ0LDI2ICs3NDUsMzUgQEAKICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZW5kZXJCdWZmZXIsIHRoaXMpOwogICAgIHJlcGx5LT5zZXRTaXplKCJidWZmZXItaXgiLCBpbmRleCk7CiAgICAgcmVwbHktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUJ1ZmZlckdlbmVyYXRpb24pOworICAgIHJlcGx5LT5zZXRTaXplKCJzaXplIiwgc2l6ZSk7CiAKICAgICBpZiAoZW9zKSB7CiAgICAgICAgIEFMT0dJKCJbJXNdIHNhdyBvdXRwdXQgRU9TIiwgbUlzQXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CiAKICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJlb3MiLCB0cnVlKTsKICAgICAgICAgcmVwbHktPnNldEludDMyKCJlb3MiLCB0cnVlKTsKLSAgICB9IGVsc2UgaWYgKG1Ta2lwUmVuZGVyaW5nVW50aWxNZWRpYVRpbWVVcyA+PSAwKSB7CisgICAgfQorCisgICAgbU51bUZyYW1lc1RvdGFsICs9ICFtSXNBdWRpbzsKKworICAgIGlmIChtU2tpcFJlbmRlcmluZ1VudGlsTWVkaWFUaW1lVXMgPj0gMCkgewogICAgICAgICBpZiAodGltZVVzIDwgbVNraXBSZW5kZXJpbmdVbnRpbE1lZGlhVGltZVVzKSB7CiAgICAgICAgICAgICBBTE9HVigiWyVzXSBkcm9wcGluZyBidWZmZXIgYXQgdGltZSAlbGxkIGFzIHJlcXVlc3RlZC4iLAogICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgKGxvbmcgbG9uZyl0aW1lVXMpOwogCiAgICAgICAgICAgICByZXBseS0+cG9zdCgpOworICAgICAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgICAgIG5vdGlmeVJlc3VtZUNvbXBsZXRlSWZOZWNlc3NhcnkoKTsKKyAgICAgICAgICAgICAgICBpZiAobVJlbmRlcmVyICE9IE5VTEwgJiYgIWlzRGlzY29udGludWl0eVBlbmRpbmcoKSkgeworICAgICAgICAgICAgICAgICAgICBtUmVuZGVyZXItPnF1ZXVlRU9TKG1Jc0F1ZGlvLCBFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogCiAgICAgICAgIG1Ta2lwUmVuZGVyaW5nVW50aWxNZWRpYVRpbWVVcyA9IC0xOwogICAgIH0KIAotICAgIG1OdW1GcmFtZXNUb3RhbCArPSAhbUlzQXVkaW87Ci0KICAgICAvLyB3YWl0IHVudGlsIDFzdCBmcmFtZSBjb21lcyBvdXQgdG8gc2lnbmFsIHJlc3VtZSBjb21wbGV0ZQogICAgIG5vdGlmeVJlc3VtZUNvbXBsZXRlSWZOZWNlc3NhcnkoKTsKIApAQCAtOTM3LDcgKzk0Nyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRNYXhWaWRlb1RlbXBvcmFsTGF5ZXJJZCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsYXllcklkID4gbUN1cnJlbnRNYXhWaWRlb1RlbXBvcmFsTGF5ZXJJZCkgewogICAgICAgICAgICAgICAgICAgICBtQ3VycmVudE1heFZpZGVvVGVtcG9yYWxMYXllcklkID0gbGF5ZXJJZDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxheWVySWQgPT0gMCAmJiBtTnVtVmlkZW9UZW1wb3JhbExheWVyVG90YWwgPiAxICYmIElzSURSKGFjY2Vzc1VuaXQpKSB7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsYXllcklkID09IDAgJiYgbU51bVZpZGVvVGVtcG9yYWxMYXllclRvdGFsID4gMQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgSXNJRFIoYWNjZXNzVW5pdC0+ZGF0YSgpLCBhY2Nlc3NVbml0LT5zaXplKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50TWF4VmlkZW9UZW1wb3JhbExheWVySWQgPSBtTnVtVmlkZW9UZW1wb3JhbExheWVyVG90YWwgLSAxOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTEwMzYsNyArMTA0Nyw3IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBNb2R1bGFyIERSTQotICAgICAgICBNZWRpYUJ1ZmZlciAqbWVkaWFCdWYgPSBOVUxMOworICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKm1lZGlhQnVmID0gTlVMTDsKICAgICAgICAgTnVQbGF5ZXJEcm06OkNyeXB0b0luZm8gKmNyeXB0SW5mbyA9IE5VTEw7CiAKICAgICAgICAgLy8gY29weSBpbnRvIGNvZGVjIGJ1ZmZlcgpAQCAtMTA1MiwxNiArMTA2MywxNyBAQAogICAgICAgICAgICAgICAgIG1lbWNweShjb2RlY0J1ZmZlci0+ZGF0YSgpLCBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOwogICAgICAgICAgICAgfSBlbHNlIHsgLy8gTm8gYnVmZmVyLT5kYXRhKCkKICAgICAgICAgICAgICAgICAvL01vZHVsYXIgRFJNCi0gICAgICAgICAgICAgICAgbWVkaWFCdWYgPSAoTWVkaWFCdWZmZXIqKWJ1ZmZlci0+Z2V0TWVkaWFCdWZmZXJCYXNlKCk7CisgICAgICAgICAgICAgICAgc3A8UmVmQmFzZT4gaG9sZGVyOworICAgICAgICAgICAgICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZE9iamVjdCgibWVkaWFCdWZmZXJIb2xkZXIiLCAmaG9sZGVyKSkgeworICAgICAgICAgICAgICAgICAgICBtZWRpYUJ1ZiA9IChob2xkZXIgIT0gbnVsbHB0cikgPworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TWVkaWFCdWZmZXJIb2xkZXIqPihob2xkZXIuZ2V0KCkpLT5tZWRpYUJ1ZmZlcigpIDogbnVsbHB0cjsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKG1lZGlhQnVmICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgY29kZWNCdWZmZXItPnNldFJhbmdlKDAsIG1lZGlhQnVmLT5zaXplKCkpOwogICAgICAgICAgICAgICAgICAgICBtZW1jcHkoY29kZWNCdWZmZXItPmRhdGEoKSwgbWVkaWFCdWYtPmRhdGEoKSwgbWVkaWFCdWYtPnNpemUoKSk7CiAKLSAgICAgICAgICAgICAgICAgICAgc3A8TWV0YURhdGE+IG1ldGFfZGF0YSA9IG1lZGlhQnVmLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhX2RhdGEgPSBtZWRpYUJ1Zi0+bWV0YV9kYXRhKCk7CiAgICAgICAgICAgICAgICAgICAgIGNyeXB0SW5mbyA9IE51UGxheWVyRHJtOjpnZXRTYW1wbGVDcnlwdG9JbmZvKG1ldGFfZGF0YSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgZ2V0TWVkaWFCdWZmZXIoKSBoYXMgaW5jcmVtZW50ZWQgdGhlIHJlZkNvdW50Ci0gICAgICAgICAgICAgICAgICAgIG1lZGlhQnVmLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gTm8gbWVkaWFCdWYKICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIm9uSW5wdXRCdWZmZXJGZXRjaGVkOiBidWZmZXItPmRhdGEoKS9tZWRpYUJ1ZiBhcmUgTlVMTCBmb3IgJXAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5nZXQoKSk7CkBAIC0xMTE2LDYgKzExMjgsNyBAQAogICAgIGludDMyX3QgcmVuZGVyOwogICAgIHNpemVfdCBidWZmZXJJeDsKICAgICBpbnQzMl90IGVvczsKKyAgICBzaXplX3Qgc2l6ZTsKICAgICBDSEVDSyhtc2ctPmZpbmRTaXplKCJidWZmZXItaXgiLCAmYnVmZmVySXgpKTsKIAogICAgIGlmICghbUlzQXVkaW8pIHsKQEAgLTExMzUsNyArMTE0OCwxMCBAQAogICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZXN0YW1wTnMiLCAmdGltZXN0YW1wTnMpKTsKICAgICAgICAgZXJyID0gbUNvZGVjLT5yZW5kZXJPdXRwdXRCdWZmZXJBbmRSZWxlYXNlKGJ1ZmZlckl4LCB0aW1lc3RhbXBOcyk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgbU51bU91dHB1dEZyYW1lc0Ryb3BwZWQgKz0gIW1Jc0F1ZGlvOworICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJlb3MiLCAmZW9zKSB8fCAhZW9zIHx8CisgICAgICAgICAgICAgICAgIW1zZy0+ZmluZFNpemUoInNpemUiLCAmc2l6ZSkgfHwgc2l6ZSkgeworICAgICAgICAgICAgbU51bU91dHB1dEZyYW1lc0Ryb3BwZWQgKz0gIW1Jc0F1ZGlvOworICAgICAgICB9CiAgICAgICAgIGVyciA9IG1Db2RlYy0+cmVsZWFzZU91dHB1dEJ1ZmZlcihidWZmZXJJeCk7CiAgICAgfQogICAgIGlmIChlcnIgIT0gT0spIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwCmluZGV4IGRjMjk3NjEuLjNlNWJkZDYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmNwcApAQCAtMjgsNiArMjgsOCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ2xvY2suaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAKQEAgLTQxLDYgKzQzLDkgQEAKIC8vIGtleSBmb3IgbWVkaWEgc3RhdGlzdGljcwogc3RhdGljIGNvbnN0IGNoYXIgKmtLZXlQbGF5ZXIgPSAibnVwbGF5ZXIiOwogLy8gYXR0cnMgZm9yIG1lZGlhIHN0YXRpc3RpY3MKKyAgICAvLyBOQjogdGhlc2UgYXJlIG1hdGNoZWQgd2l0aCBwdWJsaWMgSmF2YSBBUEkgY29uc3RhbnRzIGRlZmluZWQKKyAgICAvLyBpbiBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhUGxheWVyLmphdmEKKyAgICAvLyBUaGVzZSBtdXN0IGJlIGtlcHQgc3luY2hyb25pemVkIHdpdGggdGhlIGNvbnN0YW50cyB0aGVyZS4KIHN0YXRpYyBjb25zdCBjaGFyICprUGxheWVyVk1pbWUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci52aWRlby5taW1lIjsKIHN0YXRpYyBjb25zdCBjaGFyICprUGxheWVyVkNvZGVjID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIudmlkZW8uY29kZWMiOwogc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJXaWR0aCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLndpZHRoIjsKQEAgLTUzLDcgKzU4LDE0IEBACiBzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllclBsYXlpbmcgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5wbGF5aW5nTXMiOwogc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJFcnJvciA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmVyciI7CiBzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckVycm9yQ29kZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmVycmNvZGUiOworCisgICAgLy8gTkI6IFRoZXNlIGFyZSBub3QgeWV0IGV4cG9zZWQgYXMgcHVibGljIEphdmEgQVBJIGNvbnN0YW50cy4KK3N0YXRpYyBjb25zdCBjaGFyICprUGxheWVyRXJyb3JTdGF0ZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmVycnN0YXRlIjsKIHN0YXRpYyBjb25zdCBjaGFyICprUGxheWVyRGF0YVNvdXJjZVR5cGUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5kYXRhU291cmNlIjsKKy8vCitzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllclJlYnVmZmVyaW5nID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIucmVidWZmZXJpbmdNcyI7CitzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllclJlYnVmZmVyaW5nQ291bnQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5yZWJ1ZmZlcnMiOworc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJSZWJ1ZmZlcmluZ0F0RXhpdCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLnJlYnVmZmVyRXhpdCI7CiAKIAogTnVQbGF5ZXJEcml2ZXI6Ok51UGxheWVyRHJpdmVyKHBpZF90IHBpZCkKQEAgLTY1LDggKzc3LDEyIEBACiAgICAgICBtUG9zaXRpb25VcygtMSksCiAgICAgICBtU2Vla0luUHJvZ3Jlc3MoZmFsc2UpLAogICAgICAgbVBsYXlpbmdUaW1lVXMoMCksCisgICAgICBtUmVidWZmZXJpbmdUaW1lVXMoMCksCisgICAgICBtUmVidWZmZXJpbmdFdmVudHMoMCksCisgICAgICBtUmVidWZmZXJpbmdBdEV4aXQoZmFsc2UpLAogICAgICAgbUxvb3BlcihuZXcgQUxvb3BlciksCi0gICAgICBtUGxheWVyKG5ldyBOdVBsYXllcihwaWQpKSwKKyAgICAgIG1NZWRpYUNsb2NrKG5ldyBNZWRpYUNsb2NrKSwKKyAgICAgIG1QbGF5ZXIobmV3IE51UGxheWVyKHBpZCwgbU1lZGlhQ2xvY2spKSwKICAgICAgIG1QbGF5ZXJGbGFncygwKSwKICAgICAgIG1BbmFseXRpY3NJdGVtKE5VTEwpLAogICAgICAgbUNsaWVudFVpZCgtMSksCkBAIC03Niw5ICs5MiwxMCBAQAogICAgIEFMT0dEKCJOdVBsYXllckRyaXZlciglcCkgY3JlYXRlZCwgY2xpZW50UGlkKCVkKSIsIHRoaXMsIHBpZCk7CiAgICAgbUxvb3Blci0+c2V0TmFtZSgiTnVQbGF5ZXJEcml2ZXIgTG9vcGVyIik7CiAKKyAgICBtTWVkaWFDbG9jay0+aW5pdCgpOworCiAgICAgLy8gc2V0IHVwIGFuIGFuYWx5dGljcyByZWNvcmQKICAgICBtQW5hbHl0aWNzSXRlbSA9IG5ldyBNZWRpYUFuYWx5dGljc0l0ZW0oa0tleVBsYXllcik7Ci0gICAgbUFuYWx5dGljc0l0ZW0tPmdlbmVyYXRlU2Vzc2lvbklEKCk7CiAKICAgICBtTG9vcGVyLT5zdGFydCgKICAgICAgICAgICAgIGZhbHNlLCAvKiBydW5PbkNhbGxpbmdUaHJlYWQgKi8KQEAgLTg3LDcgKzEwNCw3IEBACiAKICAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobVBsYXllcik7CiAKLSAgICBtUGxheWVyLT5zZXREcml2ZXIodGhpcyk7CisgICAgbVBsYXllci0+aW5pdCh0aGlzKTsKIH0KIAogTnVQbGF5ZXJEcml2ZXI6On5OdVBsYXllckRyaXZlcigpIHsKQEAgLTIyNiw4ICsyNDMsOCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OmdldERlZmF1bHRCdWZmZXJpbmdTZXR0aW5ncyhCdWZmZXJpbmdTZXR0aW5ncyogYnVmZmVyaW5nKSB7Ci0gICAgQUxPR1YoImdldERlZmF1bHRCdWZmZXJpbmdTZXR0aW5ncyglcCkiLCB0aGlzKTsKK3N0YXR1c190IE51UGxheWVyRHJpdmVyOjpnZXRCdWZmZXJpbmdTZXR0aW5ncyhCdWZmZXJpbmdTZXR0aW5ncyogYnVmZmVyaW5nKSB7CisgICAgQUxPR1YoImdldEJ1ZmZlcmluZ1NldHRpbmdzKCVwKSIsIHRoaXMpOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9JRExFKSB7CkBAIC0yMzUsNyArMjUyLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBtUGxheWVyLT5nZXREZWZhdWx0QnVmZmVyaW5nU2V0dGluZ3MoYnVmZmVyaW5nKTsKKyAgICByZXR1cm4gbVBsYXllci0+Z2V0QnVmZmVyaW5nU2V0dGluZ3MoYnVmZmVyaW5nKTsKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OnNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiBidWZmZXJpbmcpIHsKQEAgLTUxOCw2ICs1MzUsNyBAQAogfQogCiB2b2lkIE51UGxheWVyRHJpdmVyOjp1cGRhdGVNZXRyaWNzKGNvbnN0IGNoYXIgKndoZXJlKSB7CisKICAgICBpZiAod2hlcmUgPT0gTlVMTCkgewogICAgICAgICB3aGVyZSA9ICJ1bmtub3duIjsKICAgICB9CkBAIC01NzUsOCArNTkzLDE2IEBACiAgICAgZ2V0RHVyYXRpb24oJmR1cmF0aW9uX21zKTsKICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50NjQoa1BsYXllckR1cmF0aW9uLCBkdXJhdGlvbl9tcyk7CiAKKyAgICBtUGxheWVyLT51cGRhdGVJbnRlcm5hbFRpbWVycygpOworCiAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDY0KGtQbGF5ZXJQbGF5aW5nLCAobVBsYXlpbmdUaW1lVXMrNTAwKS8xMDAwICk7CiAKKyAgICBpZiAobVJlYnVmZmVyaW5nRXZlbnRzICE9IDApIHsKKyAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDY0KGtQbGF5ZXJSZWJ1ZmZlcmluZywgKG1SZWJ1ZmZlcmluZ1RpbWVVcys1MDApLzEwMDAgKTsKKyAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtQbGF5ZXJSZWJ1ZmZlcmluZ0NvdW50LCBtUmVidWZmZXJpbmdFdmVudHMpOworICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa1BsYXllclJlYnVmZmVyaW5nQXRFeGl0LCBtUmVidWZmZXJpbmdBdEV4aXQpOworICAgIH0KKwogICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtQbGF5ZXJEYXRhU291cmNlVHlwZSwgbVBsYXllci0+Z2V0RGF0YVNvdXJjZVR5cGUoKSk7CiB9CiAKQEAgLTU5OCwxOCArNjI0LDE2IEBACiAgICAgLy8gU28gdGhlIGNhbm9uaWNhbCAiZW1wdHkiIHJlY29yZCBoYXMgMyBlbGVtZW50cyBpbiBpdC4KICAgICBpZiAobUFuYWx5dGljc0l0ZW0tPmNvdW50KCkgPiAzKSB7CiAKLSAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEZpbmFsaXplZCh0cnVlKTsKICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNlbGZyZWNvcmQoKTsKIAogICAgICAgICAvLyByZS1pbml0IGluIGNhc2Ugd2UgcHJlcGFyZSgpIGFuZCBzdGFydCgpIGFnYWluLgogICAgICAgICBkZWxldGUgbUFuYWx5dGljc0l0ZW0gOwogICAgICAgICBtQW5hbHl0aWNzSXRlbSA9IG5ldyBNZWRpYUFuYWx5dGljc0l0ZW0oIm51cGxheWVyIik7CiAgICAgICAgIGlmIChtQW5hbHl0aWNzSXRlbSkgewotICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPmdlbmVyYXRlU2Vzc2lvbklEKCk7CiAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0VWlkKG1DbGllbnRVaWQpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoImRpZCBub3QgaGF2ZSBhbnl0aGluZyB0byByZWNvcmQiKTsKKyAgICAgICAgQUxPR1YoIm5vdGhpbmcgdG8gcmVjb3JkIChvbmx5ICVkIGZpZWxkcykiLCBtQW5hbHl0aWNzSXRlbS0+Y291bnQoKSk7CiAgICAgfQogfQogCkBAIC02NDUsNiArNjY5LDExIEBACiAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfU1RPUFBFRCk7CiAgICAgfQogCisgICAgaWYgKHByb3BlcnR5X2dldF9ib29sKCJwZXJzaXN0LmRlYnVnLnNmLnN0YXRzIiwgZmFsc2UpKSB7CisgICAgICAgIFZlY3RvcjxTdHJpbmcxNj4gYXJnczsKKyAgICAgICAgZHVtcCgtMSwgYXJncyk7CisgICAgfQorCiAgICAgbVN0YXRlID0gU1RBVEVfUkVTRVRfSU5fUFJPR1JFU1M7CiAgICAgbVBsYXllci0+cmVzZXRBc3luYygpOwogCkBAIC02NTYsMTAgKzY4NSwxOCBAQAogICAgIG1Qb3NpdGlvblVzID0gLTE7CiAgICAgbUxvb3BpbmcgPSBmYWxzZTsKICAgICBtUGxheWluZ1RpbWVVcyA9IDA7CisgICAgbVJlYnVmZmVyaW5nVGltZVVzID0gMDsKKyAgICBtUmVidWZmZXJpbmdFdmVudHMgPSAwOworICAgIG1SZWJ1ZmZlcmluZ0F0RXhpdCA9IGZhbHNlOwogCiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6bm90aWZ5QXQoaW50NjRfdCBtZWRpYVRpbWVVcykgeworICAgIEFMT0dWKCJub3RpZnlBdCglcCksIHRpbWU6JWxsZCIsIHRoaXMsIChsb25nIGxvbmcpbWVkaWFUaW1lVXMpOworICAgIHJldHVybiBtUGxheWVyLT5ub3RpZnlBdChtZWRpYVRpbWVVcyk7Cit9CisKIHN0YXR1c190IE51UGxheWVyRHJpdmVyOjpzZXRMb29waW5nKGludCBsb29wKSB7CiAgICAgbUxvb3BpbmcgPSBsb29wICE9IDA7CiAgICAgcmV0dXJuIE9LOwpAQCAtODAxLDYgKzgzOCwxNyBAQAogICAgIG1QbGF5aW5nVGltZVVzICs9IHBsYXlpbmdVczsKIH0KIAordm9pZCBOdVBsYXllckRyaXZlcjo6bm90aWZ5TW9yZVJlYnVmZmVyaW5nVGltZVVzKGludDY0X3QgcmVidWZmZXJpbmdVcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgbVJlYnVmZmVyaW5nVGltZVVzICs9IHJlYnVmZmVyaW5nVXM7CisgICAgbVJlYnVmZmVyaW5nRXZlbnRzKys7Cit9CisKK3ZvaWQgTnVQbGF5ZXJEcml2ZXI6Om5vdGlmeVJlYnVmZmVyaW5nV2hlbkV4aXQoYm9vbCBzdGF0dXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIG1SZWJ1ZmZlcmluZ0F0RXhpdCA9IHN0YXR1czsKK30KKwogdm9pZCBOdVBsYXllckRyaXZlcjo6bm90aWZ5U2Vla0NvbXBsZXRlKCkgewogICAgIEFMT0dWKCJub3RpZnlTZWVrQ29tcGxldGUoJXApIiwgdGhpcyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKQEAgLTk1Niw2ICsxMDA0LDcgQEAKICAgICAgICAgICAgICAgICBpZiAoZXh0MiAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrUGxheWVyRXJyb3JDb2RlLCBleHQyKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoa1BsYXllckVycm9yU3RhdGUsIHN0YXRlU3RyaW5nKG1TdGF0ZSkuY19zdHIoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtQXRFT1MgPSB0cnVlOwogICAgICAgICAgICAgYnJlYWs7CkBAIC0xMDUyLDQgKzExMDEsMzAgQEAKICAgICByZXR1cm4gcmV0OwogfQogCitzdGQ6OnN0cmluZyBOdVBsYXllckRyaXZlcjo6c3RhdGVTdHJpbmcoU3RhdGUgc3RhdGUpIHsKKyAgICBjb25zdCBjaGFyICpydmFsID0gTlVMTDsKKyAgICBjaGFyIHJhd2J1ZmZlclsxNl07ICAvLyBhbGxvd3MgIiVkIgorCisgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICBjYXNlIFNUQVRFX0lETEU6IHJ2YWwgPSAiSURMRSI7IGJyZWFrOworICAgICAgICBjYXNlIFNUQVRFX1NFVF9EQVRBU09VUkNFX1BFTkRJTkc6IHJ2YWwgPSAiU0VUX0RBVEFTT1VSQ0VfUEVORElORyI7IGJyZWFrOworICAgICAgICBjYXNlIFNUQVRFX1VOUFJFUEFSRUQ6IHJ2YWwgPSAiVU5QUkVQQVJFRCI7IGJyZWFrOworICAgICAgICBjYXNlIFNUQVRFX1BSRVBBUklORzogcnZhbCA9ICJQUkVQQVJJTkciOyBicmVhazsKKyAgICAgICAgY2FzZSBTVEFURV9QUkVQQVJFRDogcnZhbCA9ICJQUkVQQVJFRCI7IGJyZWFrOworICAgICAgICBjYXNlIFNUQVRFX1JVTk5JTkc6IHJ2YWwgPSAiUlVOTklORyI7IGJyZWFrOworICAgICAgICBjYXNlIFNUQVRFX1BBVVNFRDogcnZhbCA9ICJQQVVTRUQiOyBicmVhazsKKyAgICAgICAgY2FzZSBTVEFURV9SRVNFVF9JTl9QUk9HUkVTUzogcnZhbCA9ICJSRVNFVF9JTl9QUk9HUkVTUyI7IGJyZWFrOworICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRUQ6IHJ2YWwgPSAiU1RPUFBFRCI7IGJyZWFrOworICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUklORzogcnZhbCA9ICJTVE9QUEVEX0FORF9QUkVQQVJJTkciOyBicmVhazsKKyAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJFRDogcnZhbCA9ICJTVE9QUEVEX0FORF9QUkVQQVJFRCI7IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLy8geWVzLCB0aGlzIGJ1ZmZlciBpcyBzaGFyZWQgYW5kIHZ1bG5lcmFibGUgdG8gcmFjZXMKKyAgICAgICAgICAgIHNucHJpbnRmKHJhd2J1ZmZlciwgc2l6ZW9mKHJhd2J1ZmZlciksICIlZCIsIHN0YXRlKTsKKyAgICAgICAgICAgIHJ2YWwgPSByYXdidWZmZXI7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcnZhbDsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmgKaW5kZXggZDBjZjFkZC4uYWQ4NzhmOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmgKQEAgLTIyLDYgKzIyLDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFMb29wZXI7CitzdHJ1Y3QgTWVkaWFDbG9jazsKIHN0cnVjdCBOdVBsYXllcjsKIAogc3RydWN0IE51UGxheWVyRHJpdmVyIDogcHVibGljIE1lZGlhUGxheWVySW50ZXJmYWNlIHsKQEAgLTQ1LDcgKzQ2LDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZpZGVvU3VyZmFjZVRleHR1cmUoCiAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAmYnVmZmVyUHJvZHVjZXIpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZWZhdWx0QnVmZmVyaW5nU2V0dGluZ3MoCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJpbmdTZXR0aW5ncygKICAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSBvdmVycmlkZTsKIApAQCAtNjQsNiArNjUsNyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q3VycmVudFBvc2l0aW9uKGludCAqbXNlYyk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREdXJhdGlvbihpbnQgKm1zZWMpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzZXQoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IG5vdGlmeUF0KGludDY0X3QgbWVkaWFUaW1lVXMpIG92ZXJyaWRlOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TG9vcGluZyhpbnQgbG9vcCk7CiAgICAgdmlydHVhbCBwbGF5ZXJfdHlwZSBwbGF5ZXJUeXBlKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbnZva2UoY29uc3QgUGFyY2VsICZyZXF1ZXN0LCBQYXJjZWwgKnJlcGx5KTsKQEAgLTgyLDYgKzg0LDggQEAKICAgICB2b2lkIG5vdGlmeVNldFN1cmZhY2VDb21wbGV0ZSgpOwogICAgIHZvaWQgbm90aWZ5RHVyYXRpb24oaW50NjRfdCBkdXJhdGlvblVzKTsKICAgICB2b2lkIG5vdGlmeU1vcmVQbGF5aW5nVGltZVVzKGludDY0X3QgdGltZVVzKTsKKyAgICB2b2lkIG5vdGlmeU1vcmVSZWJ1ZmZlcmluZ1RpbWVVcyhpbnQ2NF90IHRpbWVVcyk7CisgICAgdm9pZCBub3RpZnlSZWJ1ZmZlcmluZ1doZW5FeGl0KGJvb2wgc3RhdHVzKTsKICAgICB2b2lkIG5vdGlmeVNlZWtDb21wbGV0ZSgpOwogICAgIHZvaWQgbm90aWZ5U2Vla0NvbXBsZXRlX2woKTsKICAgICB2b2lkIG5vdGlmeUxpc3RlbmVyKGludCBtc2csIGludCBleHQxID0gMCwgaW50IGV4dDIgPSAwLCBjb25zdCBQYXJjZWwgKmluID0gTlVMTCk7CkBAIC0xMDksNiArMTEzLDggQEAKICAgICAgICAgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSRUQsICAgICAvLyBlcXVpdmFsZW50IHRvIFBBVVNFRCwgYnV0IHNlZWsgY29tcGxldGUKICAgICB9OwogCisgICAgc3RkOjpzdHJpbmcgc3RhdGVTdHJpbmcoU3RhdGUgc3RhdGUpOworCiAgICAgbXV0YWJsZSBNdXRleCBtTG9jazsKICAgICBDb25kaXRpb24gbUNvbmRpdGlvbjsKIApAQCAtMTI0LDkgKzEzMCwxMyBAQAogICAgIGludDY0X3QgbVBvc2l0aW9uVXM7CiAgICAgYm9vbCBtU2Vla0luUHJvZ3Jlc3M7CiAgICAgaW50NjRfdCBtUGxheWluZ1RpbWVVczsKKyAgICBpbnQ2NF90IG1SZWJ1ZmZlcmluZ1RpbWVVczsKKyAgICBpbnQzMl90IG1SZWJ1ZmZlcmluZ0V2ZW50czsKKyAgICBib29sIG1SZWJ1ZmZlcmluZ0F0RXhpdDsKICAgICAvLyA8PDwKIAogICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CisgICAgY29uc3Qgc3A8TWVkaWFDbG9jaz4gbU1lZGlhQ2xvY2s7CiAgICAgY29uc3Qgc3A8TnVQbGF5ZXI+IG1QbGF5ZXI7CiAgICAgc3A8QXVkaW9TaW5rPiBtQXVkaW9TaW5rOwogICAgIHVpbnQzMl90IG1QbGF5ZXJGbGFnczsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRybS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcm0uY3BwCmluZGV4IGI3YzlkYjcuLmJkZTA4NjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRybS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJtLmNwcApAQCAtMjAsNyArMjAsNyBAQAogI2luY2x1ZGUgIk51UGxheWVyRHJtLmgiCiAKICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSU1lZGlhRHJtU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0lNZWRpYURybVNlcnZpY2UuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogCkBAIC0yNjUsMTggKzI2NSwxMyBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLU51UGxheWVyRHJtOjpDcnlwdG9JbmZvICpOdVBsYXllckRybTo6Z2V0U2FtcGxlQ3J5cHRvSW5mbyhzcDxNZXRhRGF0YT4gbWV0YSkKK051UGxheWVyRHJtOjpDcnlwdG9JbmZvICpOdVBsYXllckRybTo6Z2V0U2FtcGxlQ3J5cHRvSW5mbyhNZXRhRGF0YUJhc2UgJm1ldGEpCiB7CiAgICAgdWludDMyX3QgdHlwZTsKICAgICBjb25zdCB2b2lkICpjcnlwdGVkZGF0YTsKICAgICBzaXplX3QgY3J5cHRlZHNpemU7CiAKLSAgICBpZiAobWV0YSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJnZXRTYW1wbGVDcnlwdG9JbmZvOiBVbmV4cGVjdGVkLiBObyBtZXRhIGRhdGEgZm9yIHNhbXBsZS4iKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKCFtZXRhLT5maW5kRGF0YShrS2V5RW5jcnlwdGVkU2l6ZXMsICZ0eXBlLCAmY3J5cHRlZGRhdGEsICZjcnlwdGVkc2l6ZSkpIHsKKyAgICBpZiAoIW1ldGEuZmluZERhdGEoa0tleUVuY3J5cHRlZFNpemVzLCAmdHlwZSwgJmNyeXB0ZWRkYXRhLCAmY3J5cHRlZHNpemUpKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBzaXplX3QgbnVtU3ViU2FtcGxlcyA9IGNyeXB0ZWRzaXplIC8gc2l6ZW9mKHNpemVfdCk7CkBAIC0yODgsNyArMjgzLDcgQEAKIAogICAgIGNvbnN0IHZvaWQgKmNsZWFyZGF0YTsKICAgICBzaXplX3QgY2xlYXJzaXplOwotICAgIGlmIChtZXRhLT5maW5kRGF0YShrS2V5UGxhaW5TaXplcywgJnR5cGUsICZjbGVhcmRhdGEsICZjbGVhcnNpemUpKSB7CisgICAgaWYgKG1ldGEuZmluZERhdGEoa0tleVBsYWluU2l6ZXMsICZ0eXBlLCAmY2xlYXJkYXRhLCAmY2xlYXJzaXplKSkgewogICAgICAgICBpZiAoY2xlYXJzaXplICE9IGNyeXB0ZWRzaXplKSB7CiAgICAgICAgICAgICAvLyBUaGUgdHdvIG11c3QgYmUgb2YgdGhlIHNhbWUgbGVuZ3RoLgogICAgICAgICAgICAgQUxPR0UoImdldFNhbXBsZUNyeXB0b0luZm8gbWlzbWF0Y2ggY3J5cHRlZHNpemU6ICV6dSAhPSBjbGVhcnNpemU6ICV6dSIsCkBAIC0yOTksNyArMjk0LDcgQEAKIAogICAgIGNvbnN0IHZvaWQgKmtleTsKICAgICBzaXplX3Qga2V5c2l6ZTsKLSAgICBpZiAobWV0YS0+ZmluZERhdGEoa0tleUNyeXB0b0tleSwgJnR5cGUsICZrZXksICZrZXlzaXplKSkgeworICAgIGlmIChtZXRhLmZpbmREYXRhKGtLZXlDcnlwdG9LZXksICZ0eXBlLCAma2V5LCAma2V5c2l6ZSkpIHsKICAgICAgICAgaWYgKGtleXNpemUgIT0ga0Jsb2NrU2l6ZSkgewogICAgICAgICAgICAgQUxPR0UoImdldFNhbXBsZUNyeXB0b0luZm8gS2V5cyBtdXN0IGJlICVkIGJ5dGVzIGluIGxlbmd0aDogJXp1IiwKICAgICAgICAgICAgICAgICAgICAga0Jsb2NrU2l6ZSwga2V5c2l6ZSk7CkBAIC0zMTAsNyArMzA1LDcgQEAKIAogICAgIGNvbnN0IHZvaWQgKml2OwogICAgIHNpemVfdCBpdnNpemU7Ci0gICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlDcnlwdG9JViwgJnR5cGUsICZpdiwgJml2c2l6ZSkpIHsKKyAgICBpZiAobWV0YS5maW5kRGF0YShrS2V5Q3J5cHRvSVYsICZ0eXBlLCAmaXYsICZpdnNpemUpKSB7CiAgICAgICAgIGlmIChpdnNpemUgIT0ga0Jsb2NrU2l6ZSkgewogICAgICAgICAgICAgQUxPR0UoImdldFNhbXBsZUNyeXB0b0luZm8gSVYgbXVzdCBiZSAlZCBieXRlcyBpbiBsZW5ndGg6ICV6dSIsCiAgICAgICAgICAgICAgICAgICAgIGtCbG9ja1NpemUsIGl2c2l6ZSk7CkBAIC0zMjAsNyArMzE1LDcgQEAKICAgICB9CiAKICAgICBpbnQzMl90IG1vZGU7Ci0gICAgaWYgKCFtZXRhLT5maW5kSW50MzIoa0tleUNyeXB0b01vZGUsICZtb2RlKSkgeworICAgIGlmICghbWV0YS5maW5kSW50MzIoa0tleUNyeXB0b01vZGUsICZtb2RlKSkgewogICAgICAgICBtb2RlID0gQ3J5cHRvUGx1Z2luOjprTW9kZV9BRVNfQ1RSOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJtLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcm0uaAppbmRleCA2YjhhMmQ5Li41MGY2OWZmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcm0uaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcm0uaApAQCAtMTA5LDcgKzEwOSw3IEBACiAgICAgICAgICAgICAgICAgc2l6ZV90ICpjbGVhcmJ5dGVzLAogICAgICAgICAgICAgICAgIHNpemVfdCAqZW5jcnlwdGVkYnl0ZXMpOwogCi0gICAgICAgIHN0YXRpYyBDcnlwdG9JbmZvICpnZXRTYW1wbGVDcnlwdG9JbmZvKHNwPE1ldGFEYXRhPiBtZXRhKTsKKyAgICAgICAgc3RhdGljIENyeXB0b0luZm8gKmdldFNhbXBsZUNyeXB0b0luZm8oTWV0YURhdGFCYXNlICZtZXRhKTsKIAogICAgIH07ICAvLyBOdVBsYXllckRybQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAKaW5kZXggYmQ4NjZjYi4uM2EyOGJiZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcApAQCAtMTgsMTMgKzE4LDEzIEBACiAjZGVmaW5lIExPR19UQUcgIk51UGxheWVyUmVuZGVyZXIiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKKyNpbmNsdWRlICJBV2FrZUxvY2suaCIKICNpbmNsdWRlICJOdVBsYXllclJlbmRlcmVyLmgiCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FXYWtlTG9jay5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ2xvY2suaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CkBAIC04OSw2ICs4OSw3IEBACiAKIE51UGxheWVyOjpSZW5kZXJlcjo6UmVuZGVyZXIoCiAgICAgICAgIGNvbnN0IHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiAmc2luaywKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFDbG9jaz4gJm1lZGlhQ2xvY2ssCiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAogICAgICAgICB1aW50MzJfdCBmbGFncykKICAgICA6IG1BdWRpb1Npbmsoc2luayksCkBAIC0xMDMsMTEgKzEwNCwxMyBAQAogICAgICAgbUF1ZGlvRHJhaW5HZW5lcmF0aW9uKDApLAogICAgICAgbVZpZGVvRHJhaW5HZW5lcmF0aW9uKDApLAogICAgICAgbUF1ZGlvRU9TR2VuZXJhdGlvbigwKSwKKyAgICAgIG1NZWRpYUNsb2NrKG1lZGlhQ2xvY2spLAogICAgICAgbVBsYXliYWNrU2V0dGluZ3MoQVVESU9fUExBWUJBQ0tfUkFURV9ERUZBVUxUKSwKICAgICAgIG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXMoLTEpLAogICAgICAgbUFuY2hvclRpbWVNZWRpYVVzKC0xKSwKICAgICAgIG1BbmNob3JOdW1GcmFtZXNXcml0dGVuKC0xKSwKICAgICAgIG1WaWRlb0xhdGVCeVVzKDBsbCksCisgICAgICBtTmV4dFZpZGVvVGltZU1lZGlhVXMoLTEpLAogICAgICAgbUhhc0F1ZGlvKGZhbHNlKSwKICAgICAgIG1IYXNWaWRlbyhmYWxzZSksCiAgICAgICBtTm90aWZ5Q29tcGxldGVBdWRpbyhmYWxzZSksCkBAIC0xMzAsNyArMTMzLDcgQEAKICAgICAgIG1MYXN0QXVkaW9CdWZmZXJEcmFpbmVkKDApLAogICAgICAgbVVzZUF1ZGlvQ2FsbGJhY2soZmFsc2UpLAogICAgICAgbVdha2VMb2NrKG5ldyBBV2FrZUxvY2soKSkgewotICAgIG1NZWRpYUNsb2NrID0gbmV3IE1lZGlhQ2xvY2s7CisgICAgQ0hFQ0sobWVkaWFDbG9jayAhPSBOVUxMKTsKICAgICBtUGxheWJhY2tSYXRlID0gbVBsYXliYWNrU2V0dGluZ3MubVNwZWVkOwogICAgIG1NZWRpYUNsb2NrLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrUmF0ZSk7CiB9CkBAIC0xNDksNyArMTUyLDYgQEAKICAgICAgICAgZmx1c2hRdWV1ZSgmbVZpZGVvUXVldWUpOwogICAgIH0KICAgICBtV2FrZUxvY2suY2xlYXIoKTsKLSAgICBtTWVkaWFDbG9jay5jbGVhcigpOwogICAgIG1WaWRlb1NjaGVkdWxlci5jbGVhcigpOwogICAgIG1Ob3RpZnkuY2xlYXIoKTsKICAgICBtQXVkaW9TaW5rLmNsZWFyKCk7CkBAIC0zMDAsNiArMzAyLDcgQEAKIAogICAgICAgICBtTWVkaWFDbG9jay0+Y2xlYXJBbmNob3IoKTsKICAgICAgICAgbVZpZGVvTGF0ZUJ5VXMgPSAwOworICAgICAgICBtTmV4dFZpZGVvVGltZU1lZGlhVXMgPSAtMTsKICAgICAgICAgbVN5bmNRdWV1ZXMgPSBmYWxzZTsKICAgICB9CiAKQEAgLTU0OCw4ICs1NTEsMTAgQEAKICAgICAgICAgICAgICAgICBDSEVDS19FUShtQXVkaW9TaW5rLT5nZXRQb3NpdGlvbigmbnVtRnJhbWVzUGxheWVkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdHVzX3QpT0spOwogCisgICAgICAgICAgICAgICAgLy8gSGFuZGxlIEF1ZGlvVHJhY2sgcmFjZSB3aGVuIHN0YXJ0IGlzIGltbWVkaWF0ZWx5IGNhbGxlZCBhZnRlciBmbHVzaC4KICAgICAgICAgICAgICAgICB1aW50MzJfdCBudW1GcmFtZXNQZW5kaW5nUGxheW91dCA9Ci0gICAgICAgICAgICAgICAgICAgIG1OdW1GcmFtZXNXcml0dGVuIC0gbnVtRnJhbWVzUGxheWVkOworICAgICAgICAgICAgICAgICAgICAobU51bUZyYW1lc1dyaXR0ZW4gPiBudW1GcmFtZXNQbGF5ZWQgPworICAgICAgICAgICAgICAgICAgICAgICAgbU51bUZyYW1lc1dyaXR0ZW4gLSBudW1GcmFtZXNQbGF5ZWQgOiAwKTsKIAogICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgaG93IGxvbmcgdGhlIGF1ZGlvIHNpbmsgd2lsbCBoYXZlIGRhdGEgdG8KICAgICAgICAgICAgICAgICAvLyBwbGF5IGJhY2suCkBAIC0xMjQ1LDgyICsxMjUwLDQ5IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBib29sIG5lZWRSZXBvc3REcmFpblZpZGVvUXVldWUgPSBmYWxzZTsKLSAgICBpbnQ2NF90IGRlbGF5VXM7CiAgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0gICAgaW50NjRfdCByZWFsVGltZVVzOwogICAgIGlmIChtRmxhZ3MgJiBGTEFHX1JFQUxfVElNRSkgewotICAgICAgICBpbnQ2NF90IG1lZGlhVGltZVVzOwotICAgICAgICBDSEVDSyhlbnRyeS5tQnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJm1lZGlhVGltZVVzKSk7Ci0gICAgICAgIHJlYWxUaW1lVXMgPSBtZWRpYVRpbWVVczsKLSAgICB9IGVsc2UgewotICAgICAgICBpbnQ2NF90IG1lZGlhVGltZVVzOwotICAgICAgICBDSEVDSyhlbnRyeS5tQnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJm1lZGlhVGltZVVzKSk7CisgICAgICAgIGludDY0X3QgcmVhbFRpbWVVczsKKyAgICAgICAgQ0hFQ0soZW50cnkubUJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZyZWFsVGltZVVzKSk7CiAKLSAgICAgICAgewotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICAgICAgICAgIGlmIChtQW5jaG9yVGltZU1lZGlhVXMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgbU1lZGlhQ2xvY2stPnVwZGF0ZUFuY2hvcihtZWRpYVRpbWVVcywgbm93VXMsIG1lZGlhVGltZVVzKTsKLSAgICAgICAgICAgICAgICBtQW5jaG9yVGltZU1lZGlhVXMgPSBtZWRpYVRpbWVVczsKLSAgICAgICAgICAgICAgICByZWFsVGltZVVzID0gbm93VXM7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFtVmlkZW9TYW1wbGVSZWNlaXZlZCkgewotICAgICAgICAgICAgICAgIC8vIEFsd2F5cyByZW5kZXIgdGhlIGZpcnN0IHZpZGVvIGZyYW1lLgotICAgICAgICAgICAgICAgIHJlYWxUaW1lVXMgPSBub3dVczsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVcyA8IDAKLSAgICAgICAgICAgICAgICB8fCBtTWVkaWFDbG9jay0+Z2V0UmVhbFRpbWVGb3IobWVkaWFUaW1lVXMsICZyZWFsVGltZVVzKSA9PSBPSykgewotICAgICAgICAgICAgICAgIHJlYWxUaW1lVXMgPSBnZXRSZWFsVGltZVVzKG1lZGlhVGltZVVzLCBub3dVcyk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1lZGlhVGltZVVzIC0gbUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVcyA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgbmVlZFJlcG9zdERyYWluVmlkZW9RdWV1ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcmVhbFRpbWVVcyA9IG5vd1VzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZWFsVGltZVVzID0gbm93VXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtSGFzQXVkaW8pIHsKLSAgICAgICAgICAgIC8vIHNtb290aCBvdXQgdmlkZW9zID49IDEwZnBzCi0gICAgICAgICAgICBtTWVkaWFDbG9jay0+dXBkYXRlTWF4VGltZU1lZGlhKG1lZGlhVGltZVVzICsgMTAwMDAwKTsKLSAgICAgICAgfQorICAgICAgICByZWFsVGltZVVzID0gbVZpZGVvU2NoZWR1bGVyLT5zY2hlZHVsZShyZWFsVGltZVVzICogMTAwMCkgLyAxMDAwOwogCi0gICAgICAgIC8vIEhldXJpc3RpY3MgdG8gaGFuZGxlIHNpdHVhdGlvbiB3aGVuIG1lZGlhIHRpbWUgY2hhbmdlZCB3aXRob3V0IGEKLSAgICAgICAgLy8gZGlzY29udGludWl0eS4gSWYgd2UgaGF2ZSBub3QgZHJhaW5lZCBhbiBhdWRpbyBidWZmZXIgdGhhdCB3YXMKLSAgICAgICAgLy8gcmVjZWl2ZWQgYWZ0ZXIgdGhpcyBidWZmZXIsIHJlcG9zdCBpbiAxMCBtc2VjLiBPdGhlcndpc2UgcmVwb3N0Ci0gICAgICAgIC8vIGluIDUwMCBtc2VjLgotICAgICAgICBkZWxheVVzID0gcmVhbFRpbWVVcyAtIG5vd1VzOwotICAgICAgICBpbnQ2NF90IHBvc3REZWxheVVzID0gLTE7Ci0gICAgICAgIGlmIChkZWxheVVzID4gNTAwMDAwKSB7Ci0gICAgICAgICAgICBwb3N0RGVsYXlVcyA9IDUwMDAwMDsKLSAgICAgICAgICAgIGlmIChtSGFzQXVkaW8gJiYgKG1MYXN0QXVkaW9CdWZmZXJEcmFpbmVkIC0gZW50cnkubUJ1ZmZlck9yZGluYWwpIDw9IDApIHsKLSAgICAgICAgICAgICAgICBwb3N0RGVsYXlVcyA9IDEwMDAwOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG5lZWRSZXBvc3REcmFpblZpZGVvUXVldWUpIHsKLSAgICAgICAgICAgIC8vIENIRUNLKG1QbGF5YmFja1JhdGUgPiAwKTsKLSAgICAgICAgICAgIC8vIENIRUNLKG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXMgPj0gMCk7Ci0gICAgICAgICAgICAvLyBDSEVDSyhtZWRpYVRpbWVVcyAtIG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXMgPj0gMCk7Ci0gICAgICAgICAgICBwb3N0RGVsYXlVcyA9IG1lZGlhVGltZVVzIC0gbUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVczsKLSAgICAgICAgICAgIHBvc3REZWxheVVzIC89IG1QbGF5YmFja1JhdGU7Ci0gICAgICAgIH0KKyAgICAgICAgaW50NjRfdCB0d29Wc3luY3NVcyA9IDIgKiAobVZpZGVvU2NoZWR1bGVyLT5nZXRWc3luY1BlcmlvZCgpIC8gMTAwMCk7CiAKLSAgICAgICAgaWYgKHBvc3REZWxheVVzID49IDApIHsKLSAgICAgICAgICAgIG1zZy0+c2V0V2hhdChrV2hhdFBvc3REcmFpblZpZGVvUXVldWUpOwotICAgICAgICAgICAgbXNnLT5wb3N0KHBvc3REZWxheVVzKTsKLSAgICAgICAgICAgIG1WaWRlb1NjaGVkdWxlci0+cmVzdGFydCgpOwotICAgICAgICAgICAgQUxPR0koInBvc3NpYmxlIHZpZGVvIHRpbWUganVtcCBvZiAlZG1zICglbGxkIDogJWxsZCkgb3IgdW5pbml0aWFsaXplZCBtZWRpYSBjbG9jaywiCi0gICAgICAgICAgICAgICAgICAgICIgcmV0cnlpbmcgaW4gJWRtcyIsCi0gICAgICAgICAgICAgICAgICAgIChpbnQpKGRlbGF5VXMgLyAxMDAwKSwgKGxvbmcgbG9uZyltZWRpYVRpbWVVcywKLSAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzLCAoaW50KShwb3N0RGVsYXlVcyAvIDEwMDApKTsKLSAgICAgICAgICAgIG1EcmFpblZpZGVvUXVldWVQZW5kaW5nID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQorICAgICAgICBpbnQ2NF90IGRlbGF5VXMgPSByZWFsVGltZVVzIC0gbm93VXM7CisKKyAgICAgICAgQUxPR1dfSUYoZGVsYXlVcyA+IDUwMDAwMCwgInVudXN1YWxseSBoaWdoIGRlbGF5VXM6ICVsbGQiLCAobG9uZyBsb25nKWRlbGF5VXMpOworICAgICAgICAvLyBwb3N0IDIgZGlzcGxheSByZWZyZXNoZXMgYmVmb3JlIHJlbmRlcmluZyBpcyBkdWUKKyAgICAgICAgbXNnLT5wb3N0KGRlbGF5VXMgPiB0d29Wc3luY3NVcyA/IGRlbGF5VXMgLSB0d29Wc3luY3NVcyA6IDApOworCisgICAgICAgIG1EcmFpblZpZGVvUXVldWVQZW5kaW5nID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIHJlYWxUaW1lVXMgPSBtVmlkZW9TY2hlZHVsZXItPnNjaGVkdWxlKHJlYWxUaW1lVXMgKiAxMDAwKSAvIDEwMDA7Ci0gICAgaW50NjRfdCB0d29Wc3luY3NVcyA9IDIgKiAobVZpZGVvU2NoZWR1bGVyLT5nZXRWc3luY1BlcmlvZCgpIC8gMTAwMCk7CisgICAgaW50NjRfdCBtZWRpYVRpbWVVczsKKyAgICBDSEVDSyhlbnRyeS5tQnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJm1lZGlhVGltZVVzKSk7CiAKLSAgICBkZWxheVVzID0gcmVhbFRpbWVVcyAtIG5vd1VzOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgaWYgKG1BbmNob3JUaW1lTWVkaWFVcyA8IDApIHsKKyAgICAgICAgICAgIG1NZWRpYUNsb2NrLT51cGRhdGVBbmNob3IobWVkaWFUaW1lVXMsIG5vd1VzLCBtZWRpYVRpbWVVcyk7CisgICAgICAgICAgICBtQW5jaG9yVGltZU1lZGlhVXMgPSBtZWRpYVRpbWVVczsKKyAgICAgICAgfQorICAgIH0KKyAgICBtTmV4dFZpZGVvVGltZU1lZGlhVXMgPSBtZWRpYVRpbWVVcyArIDEwMDAwMDsKKyAgICBpZiAoIW1IYXNBdWRpbykgeworICAgICAgICAvLyBzbW9vdGggb3V0IHZpZGVvcyA+PSAxMGZwcworICAgICAgICBtTWVkaWFDbG9jay0+dXBkYXRlTWF4VGltZU1lZGlhKG1OZXh0VmlkZW9UaW1lTWVkaWFVcyk7CisgICAgfQogCi0gICAgQUxPR1dfSUYoZGVsYXlVcyA+IDUwMDAwMCwgInVudXN1YWxseSBoaWdoIGRlbGF5VXM6ICUiIFBSSWQ2NCwgZGVsYXlVcyk7Ci0gICAgLy8gcG9zdCAyIGRpc3BsYXkgcmVmcmVzaGVzIGJlZm9yZSByZW5kZXJpbmcgaXMgZHVlCi0gICAgbXNnLT5wb3N0KGRlbGF5VXMgPiB0d29Wc3luY3NVcyA/IGRlbGF5VXMgLSB0d29Wc3luY3NVcyA6IDApOworICAgIGlmICghbVZpZGVvU2FtcGxlUmVjZWl2ZWQgfHwgbWVkaWFUaW1lVXMgPCBtQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzKSB7CisgICAgICAgIG1zZy0+cG9zdCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIGludDY0X3QgdHdvVnN5bmNzVXMgPSAyICogKG1WaWRlb1NjaGVkdWxlci0+Z2V0VnN5bmNQZXJpb2QoKSAvIDEwMDApOworCisgICAgICAgIC8vIHBvc3QgMiBkaXNwbGF5IHJlZnJlc2hlcyBiZWZvcmUgcmVuZGVyaW5nIGlzIGR1ZQorICAgICAgICBtTWVkaWFDbG9jay0+YWRkVGltZXIobXNnLCBtZWRpYVRpbWVVcywgLXR3b1ZzeW5jc1VzKTsKKyAgICB9CiAKICAgICBtRHJhaW5WaWRlb1F1ZXVlUGVuZGluZyA9IHRydWU7CiB9CkBAIC0xMzU0LDYgKzEzMjYsNyBAQAogCiAgICAgICAgIHJlYWxUaW1lVXMgPSBnZXRSZWFsVGltZVVzKG1lZGlhVGltZVVzLCBub3dVcyk7CiAgICAgfQorICAgIHJlYWxUaW1lVXMgPSBtVmlkZW9TY2hlZHVsZXItPnNjaGVkdWxlKHJlYWxUaW1lVXMgKiAxMDAwKSAvIDEwMDA7CiAKICAgICBib29sIHRvb0xhdGUgPSBmYWxzZTsKIApAQCAtMTQ0MCw2ICsxNDEzLDE0IEBACiAgICAgaWYgKGF1ZGlvKSB7CiAgICAgICAgIC8vIFZpZGVvIG1pZ2h0IG91dGxpdmUgYXVkaW8uIENsZWFyIGFuY2hvciB0byBlbmFibGUgdmlkZW8gb25seSBjYXNlLgogICAgICAgICBtQW5jaG9yVGltZU1lZGlhVXMgPSAtMTsKKyAgICAgICAgbUhhc0F1ZGlvID0gZmFsc2U7CisgICAgICAgIGlmIChtTmV4dFZpZGVvVGltZU1lZGlhVXMgPj0gMCkgeworICAgICAgICAgICAgaW50NjRfdCBtZWRpYVVzID0gMDsKKyAgICAgICAgICAgIG1NZWRpYUNsb2NrLT5nZXRNZWRpYVRpbWUoQUxvb3Blcjo6R2V0Tm93VXMoKSwgJm1lZGlhVXMpOworICAgICAgICAgICAgaWYgKG1OZXh0VmlkZW9UaW1lTWVkaWFVcyA+IG1lZGlhVXMpIHsKKyAgICAgICAgICAgICAgICBtTWVkaWFDbG9jay0+dXBkYXRlTWF4VGltZU1lZGlhKG1OZXh0VmlkZW9UaW1lTWVkaWFVcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiB9CiAKQEAgLTE2MzYsMTQgKzE2MTcsNyBAQAogICAgICAgICAgICAgLy8gaW50ZXJuYWwgYnVmZmVyIGJlZm9yZSByZXN1bWluZyBwbGF5YmFjay4KICAgICAgICAgICAgIC8vIEZJWE1FOiB0aGlzIGlzIGlnbm9yZWQgYWZ0ZXIgZmx1c2goKS4KICAgICAgICAgICAgIG1BdWRpb1NpbmstPnN0b3AoKTsKLSAgICAgICAgICAgIGlmIChtUGF1c2VkKSB7Ci0gICAgICAgICAgICAgICAgLy8gUmFjZSBjb25kaXRpb246IGlmIHJlbmRlcmVyIGlzIHBhdXNlZCBhbmQgYXVkaW8gc2luayBpcyBzdG9wcGVkLAotICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGF1ZGlvIHRyYWNrIGJ1ZmZlciBmdWxseSBkcmFpbnMKLSAgICAgICAgICAgICAgICAvLyBiZWZvcmUgZGVsaXZlcmluZyBkYXRhLgotICAgICAgICAgICAgICAgIC8vIEZJWE1FOiByZW1vdmUgdGhpcyBpZiB3ZSBjYW4gZGV0ZWN0IGlmIHN0b3AoKSBpcyBjb21wbGV0ZS4KLSAgICAgICAgICAgICAgICBjb25zdCBpbnQgZGVsYXlVcyA9IDIgKiA1MCAqIDEwMDA7IC8vICgyIGZ1bGwgbWl4ZXIgdGhyZWFkIGN5Y2xlcyBhdCA1MG1zKQotICAgICAgICAgICAgICAgIG1QYXVzZURyYWluQXVkaW9BbGxvd2VkVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpICsgZGVsYXlVczsKLSAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIW1QYXVzZWQpIHsKICAgICAgICAgICAgICAgICBtQXVkaW9TaW5rLT5zdGFydCgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbU51bUZyYW1lc1dyaXR0ZW4gPSAwOwpAQCAtMTcyOSw2ICsxNzAzLDggQEAKICAgICArK21BdWRpb0RyYWluR2VuZXJhdGlvbjsKICAgICBpZiAobUF1ZGlvUmVuZGVyaW5nU3RhcnRHZW5lcmF0aW9uICE9IC0xKSB7CiAgICAgICAgIHByZXBhcmVGb3JNZWRpYVJlbmRlcmluZ1N0YXJ0X2woKTsKKyAgICAgICAgLy8gUGF1c2VUaW1lb3V0IGlzIGFwcGxpZWQgdG8gb2ZmbG9hZCBtb2RlIG9ubHkuIENhbmNlbCBwZW5kaW5nIHRpbWVyLgorICAgICAgICBjYW5jZWxBdWRpb09mZmxvYWRQYXVzZVRpbWVvdXQoKTsKICAgICB9CiB9CiAKQEAgLTE4MzEsNiArMTgwNywxMiBAQAogICAgIGlmIChtQXVkaW9Ub3JuRG93bikgewogICAgICAgICByZXR1cm47CiAgICAgfQorCisgICAgLy8gVGltZW91dFdoZW5QYXVzZWQgaXMgb25seSBmb3Igb2ZmbG9hZCBtb2RlLgorICAgIGlmIChyZWFzb24gPT0ga0R1ZVRvVGltZW91dCAmJiAhb2ZmbG9hZGluZ0F1ZGlvKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIG1BdWRpb1Rvcm5Eb3duID0gdHJ1ZTsKIAogICAgIGludDY0X3QgY3VycmVudFBvc2l0aW9uVXM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuaAppbmRleCBmNThiNzljLi5hMDQ3OTc1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmgKQEAgLTM2LDYgKzM2LDcgQEAKICAgICAgICAgRkxBR19PRkZMT0FEX0FVRElPID0gMiwKICAgICB9OwogICAgIFJlbmRlcmVyKGNvbnN0IHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiAmc2luaywKKyAgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNsb2NrPiAmbWVkaWFDbG9jaywKICAgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOwogCkBAIC0xNjUsNyArMTY2LDcgQEAKICAgICBpbnQzMl90IG1WaWRlb0RyYWluR2VuZXJhdGlvbjsKICAgICBpbnQzMl90IG1BdWRpb0VPU0dlbmVyYXRpb247CiAKLSAgICBzcDxNZWRpYUNsb2NrPiBtTWVkaWFDbG9jazsKKyAgICBjb25zdCBzcDxNZWRpYUNsb2NrPiBtTWVkaWFDbG9jazsKICAgICBmbG9hdCBtUGxheWJhY2tSYXRlOyAvLyBhdWRpbyB0cmFjayByYXRlCiAKICAgICBBdWRpb1BsYXliYWNrUmF0ZSBtUGxheWJhY2tTZXR0aW5nczsKQEAgLTE3Niw2ICsxNzcsNyBAQAogICAgIGludDY0X3QgbUFuY2hvclRpbWVNZWRpYVVzOwogICAgIGludDY0X3QgbUFuY2hvck51bUZyYW1lc1dyaXR0ZW47CiAgICAgaW50NjRfdCBtVmlkZW9MYXRlQnlVczsKKyAgICBpbnQ2NF90IG1OZXh0VmlkZW9UaW1lTWVkaWFVczsKICAgICBib29sIG1IYXNBdWRpbzsKICAgICBib29sIG1IYXNWaWRlbzsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyU291cmNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJTb3VyY2UuaAppbmRleCA4YmE5YzBkLi45ZjVlZjc4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJTb3VyY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJTb3VyY2UuaApAQCAtNjYsNyArNjYsNyBAQAogICAgICAgICA6IG1Ob3RpZnkobm90aWZ5KSB7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZWZhdWx0QnVmZmVyaW5nU2V0dGluZ3MoCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJpbmdTZXR0aW5ncygKICAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QnVmZmVyaW5nU2V0dGluZ3MoY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MmIGJ1ZmZlcmluZykgPSAwOwogCkBAIC0xMjEsMTAgKzEyMSw2IEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlcnMoYm9vbCAvKiBhdWRpbyAqLywgVmVjdG9yPE1lZGlhQnVmZmVyICo+ICYvKiBidWZmZXJzICovKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KICAgICB2aXJ0dWFsIGJvb2wgaXNSZWFsVGltZSgpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFNQU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFNQU291cmNlLmNwcAppbmRleCA4YjNkMGRjLi44NTEyMTdiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRTUFNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUU1BTb3VyY2UuY3BwCkBAIC02Miw3ICs2Miw4IEBACiAgICAgICBtU2Vla0dlbmVyYXRpb24oMCksCiAgICAgICBtRU9TVGltZW91dEF1ZGlvKDApLAogICAgICAgbUVPU1RpbWVvdXRWaWRlbygwKSB7Ci0gICAgZ2V0RGVmYXVsdEJ1ZmZlcmluZ1NldHRpbmdzKCZtQnVmZmVyaW5nU2V0dGluZ3MpOworICAgIG1CdWZmZXJpbmdTZXR0aW5ncy5tSW5pdGlhbE1hcmtNcyA9IGtQcmVwYXJlTWFya01zOworICAgIG1CdWZmZXJpbmdTZXR0aW5ncy5tUmVzdW1lUGxheWJhY2tNYXJrTXMgPSBrT3ZlcmZsb3dNYXJrTXM7CiAgICAgaWYgKGhlYWRlcnMpIHsKICAgICAgICAgbUV4dHJhSGVhZGVycyA9ICpoZWFkZXJzOwogCkBAIC04NCwzMiArODUsMTcgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IE51UGxheWVyOjpSVFNQU291cmNlOjpnZXREZWZhdWx0QnVmZmVyaW5nU2V0dGluZ3MoCitzdGF0dXNfdCBOdVBsYXllcjo6UlRTUFNvdXJjZTo6Z2V0QnVmZmVyaW5nU2V0dGluZ3MoCiAgICAgICAgICAgICBCdWZmZXJpbmdTZXR0aW5ncyogYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pIHsKLSAgICBidWZmZXJpbmctPm1Jbml0aWFsQnVmZmVyaW5nTW9kZSA9IEJVRkZFUklOR19NT0RFX1RJTUVfT05MWTsKLSAgICBidWZmZXJpbmctPm1SZWJ1ZmZlcmluZ01vZGUgPSBCVUZGRVJJTkdfTU9ERV9USU1FX09OTFk7Ci0gICAgYnVmZmVyaW5nLT5tSW5pdGlhbFdhdGVybWFya01zID0ga1ByZXBhcmVNYXJrTXM7Ci0gICAgYnVmZmVyaW5nLT5tUmVidWZmZXJpbmdXYXRlcm1hcmtMb3dNcyA9IGtVbmRlcmZsb3dNYXJrTXM7Ci0gICAgYnVmZmVyaW5nLT5tUmVidWZmZXJpbmdXYXRlcm1hcmtIaWdoTXMgPSBrT3ZlcmZsb3dNYXJrTXM7Ci0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUJ1ZmZlcmluZ1NldHRpbmdzTG9jayk7CisgICAgKmJ1ZmZlcmluZyA9IG1CdWZmZXJpbmdTZXR0aW5nczsKICAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IE51UGxheWVyOjpSVFNQU291cmNlOjpzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSB7Ci0gICAgaWYgKG1Mb29wZXIgPT0gTlVMTCkgewotICAgICAgICBtQnVmZmVyaW5nU2V0dGluZ3MgPSBidWZmZXJpbmc7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0QnVmZmVyaW5nU2V0dGluZ3MsIHRoaXMpOwotICAgIHdyaXRlVG9BTWVzc2FnZShtc2csIGJ1ZmZlcmluZyk7Ci0gICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwotICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKLSAgICBpZiAoZXJyID09IE9LICYmIHJlc3BvbnNlICE9IE5VTEwpIHsKLSAgICAgICAgQ0hFQ0socmVzcG9uc2UtPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1CdWZmZXJpbmdTZXR0aW5nc0xvY2spOworICAgIG1CdWZmZXJpbmdTZXR0aW5ncyA9IGJ1ZmZlcmluZzsKKyAgICByZXR1cm4gT0s7CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OlJUU1BTb3VyY2U6OnByZXBhcmVBc3luYygpIHsKQEAgLTM1Niw4ICszNDIsMTcgQEAKICAgICAgICAgfQogICAgICAgICBpbnQ2NF90IGJ1ZmZlcmVkRHVyYXRpb25VcyA9IHNyYy0+Z2V0QnVmZmVyZWREdXJhdGlvblVzKCZmaW5hbFJlc3VsdCk7CiAKKyAgICAgICAgaW50NjRfdCBpbml0aWFsTWFya1VzOworICAgICAgICBpbnQ2NF90IG1heFJlYnVmZmVyaW5nTWFya1VzOworICAgICAgICB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUJ1ZmZlcmluZ1NldHRpbmdzTG9jayk7CisgICAgICAgICAgICBpbml0aWFsTWFya1VzID0gbUJ1ZmZlcmluZ1NldHRpbmdzLm1Jbml0aWFsTWFya01zICogMTAwMGxsOworICAgICAgICAgICAgLy8gVE9ETzogbWF4UmVidWZmZXJpbmdNYXJrVXMgY291bGQgYmUgbGFyZ2VyIHRoYW4KKyAgICAgICAgICAgIC8vIG1CdWZmZXJpbmdTZXR0aW5ncy5tUmVzdW1lUGxheWJhY2tNYXJrTXMgKiAxMDAwbGwuCisgICAgICAgICAgICBtYXhSZWJ1ZmZlcmluZ01hcmtVcyA9IG1CdWZmZXJpbmdTZXR0aW5ncy5tUmVzdW1lUGxheWJhY2tNYXJrTXMgKiAxMDAwbGw7CisgICAgICAgIH0KICAgICAgICAgLy8gaXNGaW5pc2hlZCB3aGVuIGR1cmF0aW9uIGlzIDAgY2hlY2tzIGZvciBFT1MgcmVzdWx0IG9ubHkKLSAgICAgICAgaWYgKGJ1ZmZlcmVkRHVyYXRpb25VcyA+IG1CdWZmZXJpbmdTZXR0aW5ncy5tSW5pdGlhbFdhdGVybWFya01zICogMTAwMAorICAgICAgICBpZiAoYnVmZmVyZWREdXJhdGlvblVzID4gaW5pdGlhbE1hcmtVcwogICAgICAgICAgICAgICAgIHx8IHNyYy0+aXNGaW5pc2hlZCgvKiBkdXJhdGlvbiAqLyAwKSkgewogICAgICAgICAgICAgKytwcmVwYXJlZENvdW50OwogICAgICAgICB9CkBAIC0zNjYsMTUgKzM2MSwxNSBAQAogICAgICAgICAgICAgKytvdmVyZmxvd0NvdW50OwogICAgICAgICAgICAgKytmaW5pc2hlZENvdW50OwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGJ1ZmZlcmVkRHVyYXRpb25VcyA8IG1CdWZmZXJpbmdTZXR0aW5ncy5tUmVidWZmZXJpbmdXYXRlcm1hcmtMb3dNcyAqIDEwMDApIHsKKyAgICAgICAgICAgIC8vIFRPRE86IHJlZGVmaW5lIGtVbmRlcmZsb3dNYXJrTXMgdG8gYSBmYWlyIHZhbHVlLAorICAgICAgICAgICAgaWYgKGJ1ZmZlcmVkRHVyYXRpb25VcyA8IGtVbmRlcmZsb3dNYXJrTXMgKiAxMDAwKSB7CiAgICAgICAgICAgICAgICAgKyt1bmRlcmZsb3dDb3VudDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChidWZmZXJlZER1cmF0aW9uVXMgPiBtQnVmZmVyaW5nU2V0dGluZ3MubVJlYnVmZmVyaW5nV2F0ZXJtYXJrSGlnaE1zICogMTAwMCkgeworICAgICAgICAgICAgaWYgKGJ1ZmZlcmVkRHVyYXRpb25VcyA+IG1heFJlYnVmZmVyaW5nTWFya1VzKSB7CiAgICAgICAgICAgICAgICAgKytvdmVyZmxvd0NvdW50OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaW50NjRfdCBzdGFydFNlcnZlck1hcmtVcyA9Ci0gICAgICAgICAgICAgICAgICAgIChtQnVmZmVyaW5nU2V0dGluZ3MubVJlYnVmZmVyaW5nV2F0ZXJtYXJrTG93TXMKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbUJ1ZmZlcmluZ1NldHRpbmdzLm1SZWJ1ZmZlcmluZ1dhdGVybWFya0hpZ2hNcykgLyAyICogMTAwMGxsOworICAgICAgICAgICAgICAgICAgICAoa1VuZGVyZmxvd01hcmtNcyAqIDEwMDBsbCArIG1heFJlYnVmZmVyaW5nTWFya1VzKSAvIDI7CiAgICAgICAgICAgICBpZiAoYnVmZmVyZWREdXJhdGlvblVzIDwgc3RhcnRTZXJ2ZXJNYXJrVXMpIHsKICAgICAgICAgICAgICAgICArK3N0YXJ0Q291bnQ7CiAgICAgICAgICAgICB9CkBAIC01MTIsMzYgKzUwNyw2IEBACiAgICAgfSBlbHNlIGlmIChtc2ctPndoYXQoKSA9PSBrV2hhdFNpZ25hbEVPUykgewogICAgICAgICBvblNpZ25hbEVPUyhtc2cpOwogICAgICAgICByZXR1cm47Ci0gICAgfSBlbHNlIGlmIChtc2ctPndoYXQoKSA9PSBrV2hhdFNldEJ1ZmZlcmluZ1NldHRpbmdzKSB7Ci0gICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwotICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7Ci0KLSAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MgYnVmZmVyaW5nOwotICAgICAgICByZWFkRnJvbUFNZXNzYWdlKG1zZywgJmJ1ZmZlcmluZyk7Ci0KLSAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0gICAgICAgIGlmIChidWZmZXJpbmcuSXNTaXplQmFzZWRCdWZmZXJpbmdNb2RlKGJ1ZmZlcmluZy5tSW5pdGlhbEJ1ZmZlcmluZ01vZGUpCi0gICAgICAgICAgICAgICAgfHwgYnVmZmVyaW5nLklzU2l6ZUJhc2VkQnVmZmVyaW5nTW9kZShidWZmZXJpbmcubVJlYnVmZmVyaW5nTW9kZSkKLSAgICAgICAgICAgICAgICB8fCAoYnVmZmVyaW5nLm1SZWJ1ZmZlcmluZ1dhdGVybWFya0xvd01zID4gYnVmZmVyaW5nLm1SZWJ1ZmZlcmluZ1dhdGVybWFya0hpZ2hNcwotICAgICAgICAgICAgICAgICAgICAmJiBidWZmZXJpbmcuSXNUaW1lQmFzZWRCdWZmZXJpbmdNb2RlKGJ1ZmZlcmluZy5tUmVidWZmZXJpbmdNb2RlKSkpIHsKLSAgICAgICAgICAgIGVyciA9IEJBRF9WQUxVRTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChidWZmZXJpbmcubUluaXRpYWxCdWZmZXJpbmdNb2RlID09IEJVRkZFUklOR19NT0RFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBidWZmZXJpbmcubUluaXRpYWxXYXRlcm1hcmtNcyA9IEJ1ZmZlcmluZ1NldHRpbmdzOjprTm9XYXRlcm1hcms7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYnVmZmVyaW5nLm1SZWJ1ZmZlcmluZ01vZGUgPT0gQlVGRkVSSU5HX01PREVfTk9ORSkgewotICAgICAgICAgICAgICAgIGJ1ZmZlcmluZy5tUmVidWZmZXJpbmdXYXRlcm1hcmtMb3dNcyA9IEJ1ZmZlcmluZ1NldHRpbmdzOjprTm9XYXRlcm1hcms7Ci0gICAgICAgICAgICAgICAgYnVmZmVyaW5nLm1SZWJ1ZmZlcmluZ1dhdGVybWFya0hpZ2hNcyA9IElOVDMyX01BWDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUJ1ZmZlcmluZ1NldHRpbmdzID0gYnVmZmVyaW5nOwotICAgICAgICB9Ci0KLSAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7Ci0gICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7Ci0KLSAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIENIRUNLX0VRKG1zZy0+d2hhdCgpLCBrV2hhdE5vdGlmeSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRTUFNvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUU1BTb3VyY2UuaAppbmRleCAwODEyOTkxLi4wM2ZjZTA4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRTUFNvdXJjZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFNQU291cmNlLmgKQEAgLTQwLDcgKzQwLDcgQEAKICAgICAgICAgICAgIHVpZF90IHVpZCA9IDAsCiAgICAgICAgICAgICBib29sIGlzU0RQID0gZmFsc2UpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZWZhdWx0QnVmZmVyaW5nU2V0dGluZ3MoCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJpbmdTZXR0aW5ncygKICAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSBvdmVycmlkZTsKIApAQCAtNzEsNyArNzEsNiBAQAogICAgICAgICBrV2hhdFBlcmZvcm1TZWVrICAgICA9ICdzZWVrJywKICAgICAgICAga1doYXRQb2xsQnVmZmVyaW5nICAgPSAncG9sbCcsCiAgICAgICAgIGtXaGF0U2lnbmFsRU9TICAgICAgID0gJ2VvcyAnLAotICAgICAgICBrV2hhdFNldEJ1ZmZlcmluZ1NldHRpbmdzID0gJ3NCdVMnLAogICAgIH07CiAKICAgICBlbnVtIFN0YXRlIHsKQEAgLTEwOSw2ICsxMDgsOCBAQAogICAgIGJvb2wgbUJ1ZmZlcmluZzsKICAgICBib29sIG1JblByZXBhcmF0aW9uUGhhc2U7CiAgICAgYm9vbCBtRU9TUGVuZGluZzsKKworICAgIE11dGV4IG1CdWZmZXJpbmdTZXR0aW5nc0xvY2s7CiAgICAgQnVmZmVyaW5nU2V0dGluZ3MgbUJ1ZmZlcmluZ1NldHRpbmdzOwogCiAgICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9TdHJlYW1pbmdTb3VyY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1N0cmVhbWluZ1NvdXJjZS5jcHAKaW5kZXggZmMwODAzYi4uYjNkYTUzZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1N0cmVhbWluZ1NvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1N0cmVhbWluZ1NvdXJjZS5jcHAKQEAgLTI0LDEwICsyNCwxMSBAQAogI2luY2x1ZGUgIkFub3RoZXJQYWNrZXRTb3VyY2UuaCIKICNpbmNsdWRlICJOdVBsYXllclN0cmVhbUxpc3RlbmVyLmgiCiAKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUtleXMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAKQEAgLTUxLDE5ICs1MiwxNCBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgTnVQbGF5ZXI6OlN0cmVhbWluZ1NvdXJjZTo6Z2V0RGVmYXVsdEJ1ZmZlcmluZ1NldHRpbmdzKAorc3RhdHVzX3QgTnVQbGF5ZXI6OlN0cmVhbWluZ1NvdXJjZTo6Z2V0QnVmZmVyaW5nU2V0dGluZ3MoCiAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzICpidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgewogICAgICpidWZmZXJpbmcgPSBCdWZmZXJpbmdTZXR0aW5ncygpOwogICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXI6OlN0cmVhbWluZ1NvdXJjZTo6c2V0QnVmZmVyaW5nU2V0dGluZ3MoCi0gICAgICAgIGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzICZidWZmZXJpbmcpIHsKLSAgICBpZiAoYnVmZmVyaW5nLm1Jbml0aWFsQnVmZmVyaW5nTW9kZSAhPSBCVUZGRVJJTkdfTU9ERV9OT05FCi0gICAgICAgICAgICB8fCBidWZmZXJpbmcubVJlYnVmZmVyaW5nTW9kZSAhPSBCVUZGRVJJTkdfTU9ERV9OT05FKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCisgICAgICAgIGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzICYgLyogYnVmZmVyaW5nICovKSB7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0xMTksNyArMTE1LDcgQEAKICAgICAgICAgICAgIGludDMyX3QgbWFzazsKICAgICAgICAgICAgIGlmIChleHRyYSAhPSBOVUxMCiAgICAgICAgICAgICAgICAgICAgICYmIGV4dHJhLT5maW5kSW50MzIoCi0gICAgICAgICAgICAgICAgICAgICAgICBJU3RyZWFtTGlzdGVuZXI6OmtLZXlEaXNjb250aW51aXR5TWFzaywgJm1hc2spKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBrSVN0cmVhbUxpc3RlbmVyS2V5RGlzY29udGludWl0eU1hc2ssICZtYXNrKSkgewogICAgICAgICAgICAgICAgIGlmIChtYXNrID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNsaWVudCBzcGVjaWZpZWQgYW4gaWxsZWdhbCBkaXNjb250aW51aXR5IHR5cGUuIik7CiAgICAgICAgICAgICAgICAgICAgIHNldEVycm9yKEVSUk9SX1VOU1VQUE9SVEVEKTsKQEAgLTE0Nyw3ICsxNDMsNyBAQAogICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG1lZGlhVGltZVVzOwogICAgICAgICAgICAgICAgICAgICBtZW1jcHkoJm1lZGlhVGltZVVzLCAmYnVmZmVyWzJdLCBzaXplb2YobWVkaWFUaW1lVXMpKTsKIAotICAgICAgICAgICAgICAgICAgICBleHRyYS0+c2V0SW50NjQoSVN0cmVhbUxpc3RlbmVyOjprS2V5TWVkaWFUaW1lVXMsIG1lZGlhVGltZVVzKTsKKyAgICAgICAgICAgICAgICAgICAgZXh0cmEtPnNldEludDY0KGtBVFNQYXJzZXJLZXlNZWRpYVRpbWVVcywgbWVkaWFUaW1lVXMpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIG1UU1BhcnNlci0+c2lnbmFsRGlzY29udGludWl0eSgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9TdHJlYW1pbmdTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9TdHJlYW1pbmdTb3VyY2UuaAppbmRleCAyZTFkMmIzLi43NmQxZDBiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvU3RyZWFtaW5nU291cmNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1N0cmVhbWluZ1NvdXJjZS5oCkBAIC0zMiw3ICszMiw3IEBACiAgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKICAgICAgICAgICAgIGNvbnN0IHNwPElTdHJlYW1Tb3VyY2U+ICZzb3VyY2UpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZWZhdWx0QnVmZmVyaW5nU2V0dGluZ3MoCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJpbmdTZXR0aW5ncygKICAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSBvdmVycmlkZTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTM2YmRkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyNSBAQAorY2NfdGVzdCB7CisKKyAgICBuYW1lOiAiRHJtU2Vzc2lvbk1hbmFnZXJfdGVzdCIsCisKKyAgICB0YWdzOiBbInRlc3RzIl0sCisKKyAgICBzcmNzOiBbIkRybVNlc3Npb25NYW5hZ2VyX3Rlc3QuY3BwIl0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhcGxheWVyc2VydmljZSIsCisgICAgICAgICJsaWJtZWRpYWRybSIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xIiwKKyAgICBdLAorCisgICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL3Rlc3RzL0FuZHJvaWQubWsgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI5Yjg1Zi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSMgQnVpbGQgdGhlIHVuaXQgdGVzdHMuCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gRHJtU2Vzc2lvbk1hbmFnZXJfdGVzdAotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotCi1MT0NBTF9TUkNfRklMRVMgOj0gXAotCURybVNlc3Npb25NYW5hZ2VyX3Rlc3QuY3BwIFwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0JbGlibG9nIFwKLQlsaWJtZWRpYXBsYXllcnNlcnZpY2UgXAotCWxpYm1lZGlhZHJtIFwKLQlsaWJ1dGlscyBcCi0JYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4wIFwKLQotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0JZnJhbWV3b3Jrcy9hdi9pbmNsdWRlIFwKLQlmcmFtZXdvcmtzL2F2L21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZSBcCi0KLUxPQ0FMX0NGTEFHUyArPSAtV2Vycm9yIC1XYWxsCi0KLUxPQ0FMXzMyX0JJVF9PTkxZIDo9IHRydWUKLQotaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvRHJtU2Vzc2lvbk1hbmFnZXJfdGVzdC5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvRHJtU2Vzc2lvbk1hbmFnZXJfdGVzdC5jcHAKaW5kZXggYzUyMTJmYy4uZDgxZWUwNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL3Rlc3RzL0RybVNlc3Npb25NYW5hZ2VyX3Rlc3QuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9Ecm1TZXNzaW9uTWFuYWdlcl90ZXN0LmNwcApAQCAtMjAsMTEgKzIwLDExIEBACiAKICNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgogCi0jaW5jbHVkZSA8bWVkaWEvRHJtLmg+Ci0jaW5jbHVkZSA8bWVkaWEvRHJtU2Vzc2lvbkNsaWVudEludGVyZmFjZS5oPgotI2luY2x1ZGUgPG1lZGlhL0RybVNlc3Npb25NYW5hZ2VyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Qcm9jZXNzSW5mb0ludGVyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0RybUhhbC5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0RybVNlc3Npb25DbGllbnRJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9Ecm1TZXNzaW9uTWFuYWdlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJuYmFpby9BbmRyb2lkLmJwCmluZGV4IDQyMjBiNzcuLmE0ZGYzOGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibmJhaW8vQW5kcm9pZC5icApAQCAtNDEsMTEgKzQxLDggQEAKICAgICAgICAgIkF1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UuY3BwIiwKICAgICAgICAgIkF1ZGlvU3RyZWFtSW5Tb3VyY2UuY3BwIiwKICAgICAgICAgIkF1ZGlvU3RyZWFtT3V0U2luay5jcHAiLAotICAgICAgICAiTkJMb2cuY3BwIiwKLSAgICAgICAgIlBlcmZvcm1hbmNlQW5hbHlzaXMuY3BwIiwKICAgICAgICAgIlBpcGUuY3BwIiwKICAgICAgICAgIlBpcGVSZWFkZXIuY3BwIiwKLSAgICAgICAgIlJlcG9ydFBlcmZvcm1hbmNlLmNwcCIsCiAgICAgICAgICJTb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmNwcCIsCiAgICAgXSwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vTkJMb2cuY3BwIGIvbWVkaWEvbGlibmJhaW8vTkJMb2cuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjYzOWQyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm5iYWlvL05CTG9nLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyMTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0qIERvY3VtZW50YXRpb246IFdvcmtmbG93IHN1bW1hcnkgZm9yIGhpc3RvZ3JhbSBkYXRhIHByb2Nlc3Npbmc6Ci0qIEZvciBtb3JlIGRldGFpbHMgb24gRklGTywgcGxlYXNlIHNlZSBzeXN0ZW0vbWVkaWEvYXVkaW9fdXRpbHM7IGRveHlnZW4KLSogVE9ETzogYWRkIHRoaXMgZG9jdW1lbnRhdGlvbiB0byBkb3h5Z2VuIG9uY2UgaXQgaXMgZnVydGhlciBkZXZlbG9wZWQKLSogMSkgV3JpdGluZyBidWZmZXIgcGVyaW9kIHRpbWVzdGFtcCB0byB0aGUgY2lyY3VsYXIgYnVmZmVyCi0qIG9uV29yaygpCi0qICAgICBDYWxsZWQgZXZlcnkgcGVyaW9kIGxlbmd0aCAoZS5nLiwgNG1zKQotKiAgICAgQ2FsbHMgTE9HX0hJU1RfVFMKLSogTE9HX0hJU1RfVFMKLSogICAgIEhhc2hlcyBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyLCBhbmQgd3JpdGVzIHNpbmdsZSB0aW1lc3RhbXAgdG8gYnVmZmVyCi0qICAgICBjYWxscyBOQkxPRzo6V3JpdGVyOjpsb2dFdmVudEhpc3RUUyBvbmNlCi0qIE5CTE9HOjpXcml0ZXI6OmxvZ0V2ZW50SGlzdFRTCi0qICAgICBjYWxscyBOQkxPRzo6V3JpdGVyOjpsb2cgb24gaGFzaCBhbmQgY3VycmVudCB0aW1lc3RhbXAKLSogICAgIHRpbWUgaXMgaW4gQ0xPQ0tfTU9OT1RPTklDIGNvbnZlcnRlZCB0byBucwotKiBOQkxPRzo6V3JpdGVyOjpsb2coRXZlbnQsIGNvbnN0IHZvaWQqLCBzaXplX3QpCi0qICAgICBJbml0aWFsaXplcyBFbnRyeSwgYSBzdHJ1Y3QgY29udGFpbmluZyBvbmUgbG9nIGVudHJ5Ci0qICAgICBFbnRyeSBjb250YWlucyB0aGUgZXZlbnQgdHlwZSAobUV2ZW50KSwgZGF0YSBsZW5ndGggKG1MZW5ndGgpLAotKiAgICAgYW5kIGRhdGEgcG9pbnRlciAobURhdGEpCi0qICAgICBUT0RPOiB3aHkgbUxlbmd0aCAobWF4IGxlbmd0aCBvZiBidWZmZXIgZGF0YSkgIG11c3QgYmUgPD0ga01heExlbmd0aCA9IDI1NT8KLSogICAgIGNhbGxzIE5CTE9HOjpXcml0ZXI6OmxvZyhFbnRyeSAqLCBib29sKQotKiBOQkxvZzo6V3JpdGVyOjpsb2coRW50cnkgKiwgYm9vbCkKLSogICAgIENhbGxzIGNvcHlFbnRyeURhdGFBdCB0byBmb3JtYXQgZGF0YSBhcyBmb2xsb3dzIGluIHRlbXAgYXJyYXk6Ci0qICAgICBbdHlwZV1bbGVuZ3RoXVtkYXRhIC4uLiBdW2xlbmd0aF0KLSogICAgIGNhbGxzIGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyLndyaXRlIG9uIHRlbXAKLSogYXVkaW9fdXRpbHNfZmlmb193cml0ZXIud3JpdGUKLSogICAgIGNhbGxzIG9idGFpbigpLCBtZW1jcHkgKHJlZmVyZW5jZSBpbiBkb3h5Z2VuKQotKiAgICAgcmV0dXJucyBudW1iZXIgb2YgZnJhbWVzIHdyaXR0ZW4KLSogc3NpemVfdCBhdWRpb191dGlsc19maWZvX3JlYWRlcjo6b2J0YWluCi0qICAgICBEZXRlcm1pbmVzIHJlYWRhYmxlIGJ1ZmZlciBzZWN0aW9uIHZpYSBwb2ludGVyIGFyaXRobWV0aWMgb24gcmVhZGVyCi0qICAgICBhbmQgd3JpdGVyIHBvaW50ZXJzCi0qIFNpbWlsYXJseSwgTE9HX0FVRElPX1NUQVRFKCkgaXMgY2FsbGVkIGJ5IG9uU3RhdGVDaGFuZ2Ugd2hlbmV2ZXIgYXVkaW8gaXMKLSogdHVybmVkIG9uIG9yIG9mZiwgYW5kIHdyaXRlcyB0aGlzIG5vdGlmaWNhdGlvbiB0byB0aGUgRklGTy4KLSoKLSogMikgcmVhZGluZyB0aGUgZGF0YSBmcm9tIHNoYXJlZCBtZW1vcnkKLSogVGhyZWFkOjp0aHJlYWRsb29wKCkKLSogICAgIFRPRE86IGFkZCBkZXNjcmlwdGlvbj8KLSogTkJMb2c6Ok1lcmdlVGhyZWFkOjp0aHJlYWRMb29wKCkKLSogICAgIGNhbGxzIE5CTG9nOjpNZXJnZXI6Om1lcmdlCi0qIE5CTG9nOjpNZXJnZXI6Om1lcmdlCi0qICAgICBNZXJnZXMgc25hcHNob3RzIHNvcnRlZCBieSB0aW1lc3RhbXAKLSogICAgIGZvciBlYWNoIHJlYWRlciBpbiB2ZWN0b3Igb2YgY2xhc3MgTmFtZWRSZWFkZXIsCi0qICAgICBjYWxsc05hbWVkUmVhZGVyOjpyZWFkZXIoKS0+Z2V0U25hcHNob3QKLSogICAgIFRPRE86IGNoZWNrIHdoZXRoZXIgdGhlIHJlc3Qgb2YgdGhpcyBmdW5jdGlvbiBpcyByZWxldmFudAotKiBOQkxvZzo6UmVhZGVyOjpnZXRTbmFwc2hvdAotKiAgICAgY29waWVzIHNuYXBzaG90IG9mIHJlYWRlcidzIGZpZm8gYnVmZmVyIGludG8gaXRzIG93biBidWZmZXIKLSogICAgIGNhbGxzIG1GaWZvUmVhZGVyLT5vYnRhaW4gdG8gZmluZCByZWFkYWJsZSBkYXRhCi0qICAgICBzZXRzIHNuYXBzaG90LmJlZ2luKCkgYW5kIC5lbmQoKSBpdGVyYXRvcnMgdG8gYm91bmRhcmllcyBvZiB2YWxpZCBlbnRyaWVzCi0qICAgICBtb3ZlcyB0aGUgZmlmbyByZWFkZXIgaW5kZXggdG8gYWZ0ZXIgdGhlIGxhc3QgZW50cnkgcmVhZAotKiAgICAgaW4gdGhpcyBjYXNlLCB0aGUgYnVmZmVyIGlzIGluIHNoYXJlZCBtZW1vcnkuIGluICg0KSwgdGhlIGJ1ZmZlciBpcyBwcml2YXRlCi0qCi0qIDMpIHJlYWRpbmcgdGhlIGRhdGEgZnJvbSBwcml2YXRlIGJ1ZmZlcgotKiBNZWRpYUxvZ1NlcnZpY2U6OmR1bXAKLSogICAgIGNhbGxzIE5CTG9nOjpSZWFkZXI6OmR1bXAoQ09OU09MRSkKLSogICAgIFRoZSBwcml2YXRlIGJ1ZmZlciBjb250YWlucyBhbGwgbG9ncyBmb3IgYWxsIHJlYWRlcnMgaW4gc2hhcmVkIG1lbW9yeQotKiBOQkxvZzo6UmVhZGVyOjpkdW1wKGludCkKLSogICAgIGNhbGxzIGdldFNuYXBzaG90IG9uIHRoZSBjdXJyZW50IHJlYWRlcgotKiAgICAgY2FsbHMgZHVtcChpbnQsIHNpemVfdCwgU25hcHNob3QpCi0qIE5CTG9nOjpSZWFkZXI6OmR1bXAoaW50LCBzaXplLCBzbmFwc2hvdCkKLSogICAgIGl0ZXJhdGVzIHRocm91Z2ggc25hcHNob3QncyBldmVudHMgYW5kIHN3aXRjaGVzIGJhc2VkIG9uIHRoZWlyIHR5cGUKLSogICAgIChzdHJpbmcsIHRpbWVzdGFtcCwgZXRjLi4uKQotKiAgICAgSW4gdGhlIGNhc2Ugb2YgRVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTLCBhZGRzIGEgbGlzdCBvZiB0aW1lc3RhbXAgc2VxdWVuY2VzCi0qICAgICAoaGlzdG9ncmFtIGVudHJ5KSB0byBOQkxvZzo6bUhpc3RzCi0qICAgICBUT0RPOiBhZGQgZXZlcnkgSElTVE9HUkFNX0VOVFJZX1RTIHRvIHR3bwotKiAgICAgY2lyY3VsYXIgYnVmZmVyczogb25lIHNob3J0LXRlcm0gYW5kIG9uZSBsb25nLXRlcm0gKGNhbiBhZGQgZXZlbiBsb25nZXItdGVybQotKiAgICAgc3RydWN0dXJlcyBpbiB0aGUgZnV0dXJlKS4gV2hlbiBkdW1wIGlzIGNhbGxlZCwgcHJpbnQgZXZlcnl0aGluZyBjdXJyZW50bHkKLSogICAgIGluIHRoZSBidWZmZXIuCi0qIE5CTG9nOjpkcmF3SGlzdG9ncmFtCi0qICAgICBpbnB1dDogdGltZXN0YW1wIGFycmF5Ci0qICAgICBidWNrZXRzIHRoaXMgdG8gYSBoaXN0b2dyYW0gYW5kIHByaW50cwotKgotKi8KLQotI2RlZmluZSBMT0dfVEFHICJOQkxvZyIKLS8vICNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8Y2xpbWl0cz4KLSNpbmNsdWRlIDxkZXF1ZT4KLSNpbmNsdWRlIDxmc3RyZWFtPgotLy8gI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgPG51bWVyaWM+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3lzL3ByY3RsLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPG5ldz4KLSNpbmNsdWRlIDxhdWRpb191dGlscy9yb3VuZHVwLmg+Ci0jaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJMb2cuaD4KLSNpbmNsdWRlIDxtZWRpYS9uYmFpby9QZXJmb3JtYW5jZUFuYWx5c2lzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvbmJhaW8vUmVwb3J0UGVyZm9ybWFuY2UuaD4KLS8vICNpbmNsdWRlIDx1dGlscy9DYWxsU3RhY2suaD4gLy8gdXNlZCB0byBwcmludCBjYWxsc3RhY2sKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0KLSNpbmNsdWRlIDxxdWV1ZT4KLSNpbmNsdWRlIDx1dGlsaXR5PgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWludCBOQkxvZzo6RW50cnk6OmNvcHlFbnRyeURhdGFBdChzaXplX3Qgb2Zmc2V0KSBjb25zdAotewotICAgIC8vIEZJWE1FIFRoaXMgaXMgdG9vIHNsb3cKLSAgICBpZiAob2Zmc2V0ID09IDApCi0gICAgICAgIHJldHVybiBtRXZlbnQ7Ci0gICAgZWxzZSBpZiAob2Zmc2V0ID09IDEpCi0gICAgICAgIHJldHVybiBtTGVuZ3RoOwotICAgIGVsc2UgaWYgKG9mZnNldCA8IChzaXplX3QpIChtTGVuZ3RoICsgMikpCi0gICAgICAgIHJldHVybiAoKGNoYXIgKikgbURhdGEpW29mZnNldCAtIDJdOwotICAgIGVsc2UgaWYgKG9mZnNldCA9PSAoc2l6ZV90KSAobUxlbmd0aCArIDIpKQotICAgICAgICByZXR1cm4gbUxlbmd0aDsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiAwOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLypzdGF0aWMqLwotc3RkOjp1bmlxdWVfcHRyPE5CTG9nOjpBYnN0cmFjdEVudHJ5PiBOQkxvZzo6QWJzdHJhY3RFbnRyeTo6YnVpbGRFbnRyeShjb25zdCB1aW50OF90ICpwdHIpIHsKLSAgICBjb25zdCB1aW50OF90IHR5cGUgPSBFbnRyeUl0ZXJhdG9yKHB0ciktPnR5cGU7Ci0gICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBFVkVOVF9TVEFSVF9GTVQ6Ci0gICAgICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEZvcm1hdEVudHJ5PihGb3JtYXRFbnRyeShwdHIpKTsKLSAgICBjYXNlIEVWRU5UX0FVRElPX1NUQVRFOgotICAgIGNhc2UgRVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTOgotICAgICAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxIaXN0b2dyYW1FbnRyeT4oSGlzdG9ncmFtRW50cnkocHRyKSk7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgQUxPR1coIlRyaWVkIHRvIGNyZWF0ZSBBYnN0cmFjdEVudHJ5IG9mIHR5cGUgJWQiLCB0eXBlKTsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotfQotCi1OQkxvZzo6QWJzdHJhY3RFbnRyeTo6QWJzdHJhY3RFbnRyeShjb25zdCB1aW50OF90ICplbnRyeSkgOiBtRW50cnkoZW50cnkpIHsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLU5CTG9nOjpFbnRyeUl0ZXJhdG9yIE5CTG9nOjpGb3JtYXRFbnRyeTo6YmVnaW4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIEVudHJ5SXRlcmF0b3IobUVudHJ5KTsKLX0KLQotY29uc3QgY2hhciAqTkJMb2c6OkZvcm1hdEVudHJ5Ojpmb3JtYXRTdHJpbmcoKSBjb25zdCB7Ci0gICAgcmV0dXJuIChjb25zdCBjaGFyKikgbUVudHJ5ICsgb2Zmc2V0b2YoZW50cnksIGRhdGEpOwotfQotCi1zaXplX3QgTkJMb2c6OkZvcm1hdEVudHJ5Ojpmb3JtYXRTdHJpbmdMZW5ndGgoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1FbnRyeVtvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV07Ci19Ci0KLU5CTG9nOjpFbnRyeUl0ZXJhdG9yIE5CTG9nOjpGb3JtYXRFbnRyeTo6YXJncygpIGNvbnN0IHsKLSAgICBhdXRvIGl0ID0gYmVnaW4oKTsKLSAgICAvLyBza2lwIHN0YXJ0IGZtdAotICAgICsraXQ7Ci0gICAgLy8gc2tpcCB0aW1lc3RhbXAKLSAgICArK2l0OwotICAgIC8vIHNraXAgaGFzaAotICAgICsraXQ7Ci0gICAgLy8gU2tpcCBhdXRob3IgaWYgcHJlc2VudAotICAgIGlmIChpdC0+dHlwZSA9PSBFVkVOVF9BVVRIT1IpIHsKLSAgICAgICAgKytpdDsKLSAgICB9Ci0gICAgcmV0dXJuIGl0OwotfQotCi1pbnQ2NF90IE5CTG9nOjpGb3JtYXRFbnRyeTo6dGltZXN0YW1wKCkgY29uc3QgewotICAgIGF1dG8gaXQgPSBiZWdpbigpOwotICAgIC8vIHNraXAgc3RhcnQgZm10Ci0gICAgKytpdDsKLSAgICByZXR1cm4gaXQucGF5bG9hZDxpbnQ2NF90PigpOwotfQotCi1OQkxvZzo6bG9nX2hhc2hfdCBOQkxvZzo6Rm9ybWF0RW50cnk6Omhhc2goKSBjb25zdCB7Ci0gICAgYXV0byBpdCA9IGJlZ2luKCk7Ci0gICAgLy8gc2tpcCBzdGFydCBmbXQKLSAgICArK2l0OwotICAgIC8vIHNraXAgdGltZXN0YW1wCi0gICAgKytpdDsKLSAgICAvLyB1bmFsaWduZWQgNjQtYml0IHJlYWQgbm90IHN1cHBvcnRlZAotICAgIGxvZ19oYXNoX3QgaGFzaDsKLSAgICBtZW1jcHkoJmhhc2gsIGl0LT5kYXRhLCBzaXplb2YoaGFzaCkpOwotICAgIHJldHVybiBoYXNoOwotfQotCi1pbnQgTkJMb2c6OkZvcm1hdEVudHJ5OjphdXRob3IoKSBjb25zdCB7Ci0gICAgYXV0byBpdCA9IGJlZ2luKCk7Ci0gICAgLy8gc2tpcCBzdGFydCBmbXQKLSAgICArK2l0OwotICAgIC8vIHNraXAgdGltZXN0YW1wCi0gICAgKytpdDsKLSAgICAvLyBza2lwIGhhc2gKLSAgICArK2l0OwotICAgIC8vIGlmIHRoZXJlIGlzIGFuIGF1dGhvciBlbnRyeSwgcmV0dXJuIGl0LCByZXR1cm4gLTEgb3RoZXJ3aXNlCi0gICAgaWYgKGl0LT50eXBlID09IEVWRU5UX0FVVEhPUikgewotICAgICAgICByZXR1cm4gaXQucGF5bG9hZDxpbnQ+KCk7Ci0gICAgfQotICAgIHJldHVybiAtMTsKLX0KLQotTkJMb2c6OkVudHJ5SXRlcmF0b3IgTkJMb2c6OkZvcm1hdEVudHJ5Ojpjb3B5V2l0aEF1dGhvcigKLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0LCBpbnQgYXV0aG9yKSBjb25zdCB7Ci0gICAgYXV0byBpdCA9IGJlZ2luKCk7Ci0gICAgLy8gY29weSBmbXQgc3RhcnQgZW50cnkKLSAgICBpdC5jb3B5VG8oZHN0KTsKLSAgICAvLyBjb3B5IHRpbWVzdGFtcAotICAgICgrK2l0KS5jb3B5VG8oZHN0KTsgICAgLy8gY29weSBoYXNoCi0gICAgKCsraXQpLmNvcHlUbyhkc3QpOwotICAgIC8vIGluc2VydCBhdXRob3IgZW50cnkKLSAgICBzaXplX3QgYXV0aG9yRW50cnlTaXplID0gTkJMb2c6OkVudHJ5OjprT3ZlcmhlYWQgKyBzaXplb2YoYXV0aG9yKTsKLSAgICB1aW50OF90IGF1dGhvckVudHJ5W2F1dGhvckVudHJ5U2l6ZV07Ci0gICAgYXV0aG9yRW50cnlbb2Zmc2V0b2YoZW50cnksIHR5cGUpXSA9IEVWRU5UX0FVVEhPUjsKLSAgICBhdXRob3JFbnRyeVtvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gPQotICAgICAgICBhdXRob3JFbnRyeVthdXRob3JFbnRyeVNpemUgKyBOQkxvZzo6RW50cnk6OmtQcmV2aW91c0xlbmd0aE9mZnNldF0gPQotICAgICAgICBzaXplb2YoYXV0aG9yKTsKLSAgICAqKGludCopICgmYXV0aG9yRW50cnlbb2Zmc2V0b2YoZW50cnksIGRhdGEpXSkgPSBhdXRob3I7Ci0gICAgZHN0LT53cml0ZShhdXRob3JFbnRyeSwgYXV0aG9yRW50cnlTaXplKTsKLSAgICAvLyBjb3B5IHJlc3Qgb2YgZW50cmllcwotICAgIHdoaWxlICgoKytpdCktPnR5cGUgIT0gRVZFTlRfRU5EX0ZNVCkgewotICAgICAgICBpdC5jb3B5VG8oZHN0KTsKLSAgICB9Ci0gICAgaXQuY29weVRvKGRzdCk7Ci0gICAgKytpdDsKLSAgICByZXR1cm4gaXQ7Ci19Ci0KLXZvaWQgTkJMb2c6OkVudHJ5SXRlcmF0b3I6OmNvcHlUbyhzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QpIGNvbnN0IHsKLSAgICBzaXplX3QgbGVuZ3RoID0gcHRyW29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSArIE5CTG9nOjpFbnRyeTo6a092ZXJoZWFkOwotICAgIGRzdC0+d3JpdGUocHRyLCBsZW5ndGgpOwotfQotCi12b2lkIE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpjb3B5RGF0YSh1aW50OF90ICpkc3QpIGNvbnN0IHsKLSAgICBtZW1jcHkoKHZvaWQqKSBkc3QsIHB0ciArIG9mZnNldG9mKGVudHJ5LCBkYXRhKSwgcHRyW29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSk7Ci19Ci0KLU5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpFbnRyeUl0ZXJhdG9yKCkKLSAgICA6IHB0cihudWxscHRyKSB7fQotCi1OQkxvZzo6RW50cnlJdGVyYXRvcjo6RW50cnlJdGVyYXRvcihjb25zdCB1aW50OF90ICplbnRyeSkKLSAgICA6IHB0cihlbnRyeSkge30KLQotTkJMb2c6OkVudHJ5SXRlcmF0b3I6OkVudHJ5SXRlcmF0b3IoY29uc3QgTkJMb2c6OkVudHJ5SXRlcmF0b3IgJm90aGVyKQotICAgIDogcHRyKG90aGVyLnB0cikge30KLQotY29uc3QgTkJMb2c6OmVudHJ5JiBOQkxvZzo6RW50cnlJdGVyYXRvcjo6b3BlcmF0b3IqKCkgY29uc3QgewotICAgIHJldHVybiAqKGVudHJ5KikgcHRyOwotfQotCi1jb25zdCBOQkxvZzo6ZW50cnkqIE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpvcGVyYXRvci0+KCkgY29uc3QgewotICAgIHJldHVybiAoZW50cnkqKSBwdHI7Ci19Ci0KLU5CTG9nOjpFbnRyeUl0ZXJhdG9yJiBOQkxvZzo6RW50cnlJdGVyYXRvcjo6b3BlcmF0b3IrKygpIHsKLSAgICBwdHIgKz0gcHRyW29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSArIE5CTG9nOjpFbnRyeTo6a092ZXJoZWFkOwotICAgIHJldHVybiAqdGhpczsKLX0KLQotTkJMb2c6OkVudHJ5SXRlcmF0b3ImIE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpvcGVyYXRvci0tKCkgewotICAgIHB0ciAtPSBwdHJbTkJMb2c6OkVudHJ5OjprUHJldmlvdXNMZW5ndGhPZmZzZXRdICsgTkJMb2c6OkVudHJ5OjprT3ZlcmhlYWQ7Ci0gICAgcmV0dXJuICp0aGlzOwotfQotCi1OQkxvZzo6RW50cnlJdGVyYXRvciBOQkxvZzo6RW50cnlJdGVyYXRvcjo6bmV4dCgpIGNvbnN0IHsKLSAgICBFbnRyeUl0ZXJhdG9yIGF1eCgqdGhpcyk7Ci0gICAgcmV0dXJuICsrYXV4OwotfQotCi1OQkxvZzo6RW50cnlJdGVyYXRvciBOQkxvZzo6RW50cnlJdGVyYXRvcjo6cHJldigpIGNvbnN0IHsKLSAgICBFbnRyeUl0ZXJhdG9yIGF1eCgqdGhpcyk7Ci0gICAgcmV0dXJuIC0tYXV4OwotfQotCi1pbnQgTkJMb2c6OkVudHJ5SXRlcmF0b3I6Om9wZXJhdG9yLShjb25zdCBOQkxvZzo6RW50cnlJdGVyYXRvciAmb3RoZXIpIGNvbnN0IHsKLSAgICByZXR1cm4gcHRyIC0gb3RoZXIucHRyOwotfQotCi1ib29sIE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpvcGVyYXRvciE9KGNvbnN0IEVudHJ5SXRlcmF0b3IgJm90aGVyKSBjb25zdCB7Ci0gICAgcmV0dXJuIHB0ciAhPSBvdGhlci5wdHI7Ci19Ci0KLWJvb2wgTkJMb2c6OkVudHJ5SXRlcmF0b3I6Omhhc0NvbnNpc3RlbnRMZW5ndGgoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHB0cltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gPT0gcHRyW3B0cltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gKwotICAgICAgICBOQkxvZzo6RW50cnk6OmtPdmVyaGVhZCArIE5CTG9nOjpFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0XTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWludDY0X3QgTkJMb2c6Okhpc3RvZ3JhbUVudHJ5Ojp0aW1lc3RhbXAoKSBjb25zdCB7Ci0gICAgcmV0dXJuIEVudHJ5SXRlcmF0b3IobUVudHJ5KS5wYXlsb2FkPEhpc3RUc0VudHJ5PigpLnRzOwotfQotCi1OQkxvZzo6bG9nX2hhc2hfdCBOQkxvZzo6SGlzdG9ncmFtRW50cnk6Omhhc2goKSBjb25zdCB7Ci0gICAgcmV0dXJuIEVudHJ5SXRlcmF0b3IobUVudHJ5KS5wYXlsb2FkPEhpc3RUc0VudHJ5PigpLmhhc2g7Ci19Ci0KLWludCBOQkxvZzo6SGlzdG9ncmFtRW50cnk6OmF1dGhvcigpIGNvbnN0IHsKLSAgICBFbnRyeUl0ZXJhdG9yIGl0KG1FbnRyeSk7Ci0gICAgaWYgKGl0LT5sZW5ndGggPT0gc2l6ZW9mKEhpc3RUc0VudHJ5V2l0aEF1dGhvcikpIHsKLSAgICAgICAgcmV0dXJuIGl0LnBheWxvYWQ8SGlzdFRzRW50cnlXaXRoQXV0aG9yPigpLmF1dGhvcjsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotfQotCi1OQkxvZzo6RW50cnlJdGVyYXRvciBOQkxvZzo6SGlzdG9ncmFtRW50cnk6OmNvcHlXaXRoQXV0aG9yKAotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QsIGludCBhdXRob3IpIGNvbnN0IHsKLSAgICAvLyBDdXJyZW50IGhpc3RvZ3JhbSBlbnRyeSBoYXMge3R5cGUsIGxlbmd0aCwgc3RydWN0IEhpc3RUc0VudHJ5LCBsZW5ndGh9LgotICAgIC8vIFdlIG5vdyB3YW50IHt0eXBlLCBsZW5ndGgsIHN0cnVjdCBIaXN0VHNFbnRyeVdpdGhBdXRob3IsIGxlbmd0aH0KLSAgICB1aW50OF90IGJ1ZmZlcltFbnRyeTo6a092ZXJoZWFkICsgc2l6ZW9mKEhpc3RUc0VudHJ5V2l0aEF1dGhvcildOwotICAgIC8vIENvcHkgY29udGVudCB1bnRpbCB0aGUgcG9pbnQgd2Ugd2FudCB0byBhZGQgdGhlIGF1dGhvcgotICAgIG1lbWNweShidWZmZXIsIG1FbnRyeSwgc2l6ZW9mKGVudHJ5KSArIHNpemVvZihIaXN0VHNFbnRyeSkpOwotICAgIC8vIENvcHkgdGhlIGF1dGhvcgotICAgICooaW50KikgKGJ1ZmZlciArIHNpemVvZihlbnRyeSkgKyBzaXplb2YoSGlzdFRzRW50cnkpKSA9IGF1dGhvcjsKLSAgICAvLyBVcGRhdGUgbGVuZ3RocwotICAgIGJ1ZmZlcltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gPSBzaXplb2YoSGlzdFRzRW50cnlXaXRoQXV0aG9yKTsKLSAgICBidWZmZXJbc2l6ZW9mKGJ1ZmZlcikgKyBFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0XSA9IHNpemVvZihIaXN0VHNFbnRyeVdpdGhBdXRob3IpOwotICAgIC8vIFdyaXRlIG5ldyBidWZmZXIgaW50byBGSUZPCi0gICAgZHN0LT53cml0ZShidWZmZXIsIHNpemVvZihidWZmZXIpKTsKLSAgICByZXR1cm4gRW50cnlJdGVyYXRvcihtRW50cnkpLm5leHQoKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiAwICAgLy8gRklYTUUgc2VlIG5vdGUgaW4gTkJMb2cuaAotTkJMb2c6OlRpbWVsaW5lOjpUaW1lbGluZShzaXplX3Qgc2l6ZSwgdm9pZCAqc2hhcmVkKQotICAgIDogbVNpemUocm91bmR1cChzaXplKSksIG1Pd24oc2hhcmVkID09IE5VTEwpLAotICAgICAgbVNoYXJlZCgoU2hhcmVkICopIChtT3duID8gbmV3IGNoYXJbc2hhcmVkU2l6ZShzaXplKV0gOiBzaGFyZWQpKQotewotICAgIG5ldyAobVNoYXJlZCkgU2hhcmVkOwotfQotCi1OQkxvZzo6VGltZWxpbmU6On5UaW1lbGluZSgpCi17Ci0gICAgbVNoYXJlZC0+flNoYXJlZCgpOwotICAgIGlmIChtT3duKSB7Ci0gICAgICAgIGRlbGV0ZVtdIChjaGFyICopIG1TaGFyZWQ7Ci0gICAgfQotfQotI2VuZGlmCi0KLS8qc3RhdGljKi8KLXNpemVfdCBOQkxvZzo6VGltZWxpbmU6OnNoYXJlZFNpemUoc2l6ZV90IHNpemUpCi17Ci0gICAgLy8gVE9ETyBmaWZvIG5vdyBzdXBwb3J0cyBub24tcG93ZXItb2YtMiBidWZmZXIgc2l6ZXMsIHNvIGNvdWxkIHJlbW92ZSB0aGUgcm91bmR1cAotICAgIHJldHVybiBzaXplb2YoU2hhcmVkKSArIHJvdW5kdXAoc2l6ZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1OQkxvZzo6V3JpdGVyOjpXcml0ZXIoKQotICAgIDogbVNoYXJlZChOVUxMKSwgbUZpZm8oTlVMTCksIG1GaWZvV3JpdGVyKE5VTEwpLCBtRW5hYmxlZChmYWxzZSksIG1QaWRUYWcoTlVMTCksIG1QaWRUYWdTaXplKDApCi17Ci19Ci0KLU5CTG9nOjpXcml0ZXI6OldyaXRlcih2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKQotICAgIDogbVNoYXJlZCgoU2hhcmVkICopIHNoYXJlZCksCi0gICAgICBtRmlmbyhtU2hhcmVkICE9IE5VTEwgPwotICAgICAgICBuZXcgYXVkaW9fdXRpbHNfZmlmbyhzaXplLCBzaXplb2YodWludDhfdCksCi0gICAgICAgICAgICBtU2hhcmVkLT5tQnVmZmVyLCBtU2hhcmVkLT5tUmVhciwgTlVMTCAvKnRocm90dGxlc0Zyb250Ki8pIDogTlVMTCksCi0gICAgICBtRmlmb1dyaXRlcihtRmlmbyAhPSBOVUxMID8gbmV3IGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyKCptRmlmbykgOiBOVUxMKSwKLSAgICAgIG1FbmFibGVkKG1GaWZvV3JpdGVyICE9IE5VTEwpCi17Ci0gICAgLy8gY2FjaGluZyBwaWQgYW5kIHByb2Nlc3MgbmFtZQotICAgIHBpZF90IGlkID0gOjpnZXRwaWQoKTsKLSAgICBjaGFyIHByb2NOYW1lWzE2XTsKLSAgICBpbnQgc3RhdHVzID0gcHJjdGwoUFJfR0VUX05BTUUsIHByb2NOYW1lKTsKLSAgICBpZiAoc3RhdHVzKSB7ICAvLyBlcnJvciBnZXR0aW5nIHByb2Nlc3MgbmFtZQotICAgICAgICBwcm9jTmFtZVswXSA9ICdcMCc7Ci0gICAgfQotICAgIHNpemVfdCBsZW5ndGggPSBzdHJsZW4ocHJvY05hbWUpOwotICAgIG1QaWRUYWdTaXplID0gbGVuZ3RoICsgc2l6ZW9mKHBpZF90KTsKLSAgICBtUGlkVGFnID0gbmV3IGNoYXJbbVBpZFRhZ1NpemVdOwotICAgIG1lbWNweShtUGlkVGFnLCAmaWQsIHNpemVvZihwaWRfdCkpOwotICAgIG1lbWNweShtUGlkVGFnICsgc2l6ZW9mKHBpZF90KSwgcHJvY05hbWUsIGxlbmd0aCk7Ci19Ci0KLU5CTG9nOjpXcml0ZXI6OldyaXRlcihjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSwgc2l6ZV90IHNpemUpCi0gICAgOiBXcml0ZXIoaU1lbW9yeSAhPSAwID8gKFNoYXJlZCAqKSBpTWVtb3J5LT5wb2ludGVyKCkgOiBOVUxMLCBzaXplKQotewotICAgIG1JTWVtb3J5ID0gaU1lbW9yeTsKLX0KLQotTkJMb2c6OldyaXRlcjo6fldyaXRlcigpCi17Ci0gICAgZGVsZXRlIG1GaWZvV3JpdGVyOwotICAgIGRlbGV0ZSBtRmlmbzsKLSAgICBkZWxldGVbXSBtUGlkVGFnOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZyhjb25zdCBjaGFyICpzdHJpbmcpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RyaW5nID09IE5VTEwsICJBdHRlbXB0ZWQgdG8gbG9nIE5VTEwgc3RyaW5nIik7Ci0gICAgc2l6ZV90IGxlbmd0aCA9IHN0cmxlbihzdHJpbmcpOwotICAgIGlmIChsZW5ndGggPiBFbnRyeTo6a01heExlbmd0aCkgewotICAgICAgICBsZW5ndGggPSBFbnRyeTo6a01heExlbmd0aDsKLSAgICB9Ci0gICAgbG9nKEVWRU5UX1NUUklORywgc3RyaW5nLCBsZW5ndGgpOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ2YoY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHZhX2xpc3QgYXA7Ci0gICAgdmFfc3RhcnQoYXAsIGZtdCk7Ci0gICAgV3JpdGVyOjpsb2d2ZihmbXQsIGFwKTsgICAgIC8vIHRoZSBXcml0ZXI6OiBpcyBuZWVkZWQgdG8gYXZvaWQgdmlydHVhbCBkaXNwYXRjaCBmb3IgTG9ja2VkV3JpdGVyCi0gICAgdmFfZW5kKGFwKTsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2d2Zihjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGNoYXIgYnVmZmVyW0VudHJ5OjprTWF4TGVuZ3RoICsgMSAvKk5VTCovXTsKLSAgICBpbnQgbGVuZ3RoID0gdnNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIGZtdCwgYXApOwotICAgIGlmIChsZW5ndGggPj0gKGludCkgc2l6ZW9mKGJ1ZmZlcikpIHsKLSAgICAgICAgbGVuZ3RoID0gc2l6ZW9mKGJ1ZmZlcikgLSAxOwotICAgICAgICAvLyBOVUwgdGVybWluYXRpb24gaXMgbm90IHJlcXVpcmVkCi0gICAgICAgIC8vIGJ1ZmZlcltsZW5ndGhdID0gJ1wwJzsKLSAgICB9Ci0gICAgaWYgKGxlbmd0aCA+PSAwKSB7Ci0gICAgICAgIGxvZyhFVkVOVF9TVFJJTkcsIGJ1ZmZlciwgbGVuZ3RoKTsKLSAgICB9Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nVGltZXN0YW1wKCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW50NjRfdCB0cyA9IGdldF9tb25vdG9uaWNfbnMoKTsKLSAgICBpZiAodHMgPiAwKSB7Ci0gICAgICAgIGxvZyhFVkVOVF9USU1FU1RBTVAsICZ0cywgc2l6ZW9mKHRzKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgdGltZXN0YW1wIik7Ci0gICAgfQotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ1RpbWVzdGFtcChjb25zdCBpbnQ2NF90IHRzKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBsb2coRVZFTlRfVElNRVNUQU1QLCAmdHMsIHNpemVvZih0cykpOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ0ludGVnZXIoY29uc3QgaW50IHgpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGxvZyhFVkVOVF9JTlRFR0VSLCAmeCwgc2l6ZW9mKHgpKTsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dGbG9hdChjb25zdCBmbG9hdCB4KQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBsb2coRVZFTlRfRkxPQVQsICZ4LCBzaXplb2YoeCkpOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ1BJRCgpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGxvZyhFVkVOVF9QSUQsIG1QaWRUYWcsIG1QaWRUYWdTaXplKTsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dTdGFydChjb25zdCBjaGFyICpmbXQpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHNpemVfdCBsZW5ndGggPSBzdHJsZW4oZm10KTsKLSAgICBpZiAobGVuZ3RoID4gRW50cnk6OmtNYXhMZW5ndGgpIHsKLSAgICAgICAgbGVuZ3RoID0gRW50cnk6OmtNYXhMZW5ndGg7Ci0gICAgfQotICAgIGxvZyhFVkVOVF9TVEFSVF9GTVQsIGZtdCwgbGVuZ3RoKTsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dFbmQoKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBFbnRyeSBlbnRyeSA9IEVudHJ5KEVWRU5UX0VORF9GTVQsIE5VTEwsIDApOwotICAgIGxvZygmZW50cnksIHRydWUpOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ0hhc2gobG9nX2hhc2hfdCBoYXNoKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBsb2coRVZFTlRfSEFTSCwgJmhhc2gsIHNpemVvZihoYXNoKSk7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nRXZlbnRIaXN0VHMoRXZlbnQgZXZlbnQsIGxvZ19oYXNoX3QgaGFzaCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgSGlzdFRzRW50cnkgZGF0YTsKLSAgICBkYXRhLmhhc2ggPSBoYXNoOwotICAgIGRhdGEudHMgPSBnZXRfbW9ub3RvbmljX25zKCk7Ci0gICAgaWYgKGRhdGEudHMgPiAwKSB7Ci0gICAgICAgIGxvZyhldmVudCwgJmRhdGEsIHNpemVvZihkYXRhKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgdGltZXN0YW1wIik7Ci0gICAgfQotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ0Zvcm1hdChjb25zdCBjaGFyICpmbXQsIGxvZ19oYXNoX3QgaGFzaCwgLi4uKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHZhX2xpc3QgYXA7Ci0gICAgdmFfc3RhcnQoYXAsIGhhc2gpOwotICAgIFdyaXRlcjo6bG9nVkZvcm1hdChmbXQsIGhhc2gsIGFwKTsKLSAgICB2YV9lbmQoYXApOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ1ZGb3JtYXQoY29uc3QgY2hhciAqZm10LCBsb2dfaGFzaF90IGhhc2gsIHZhX2xpc3QgYXJncCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgV3JpdGVyOjpsb2dTdGFydChmbXQpOwotICAgIGludCBpOwotICAgIGRvdWJsZSBmOwotICAgIGNoYXIqIHM7Ci0gICAgaW50NjRfdCB0OwotICAgIFdyaXRlcjo6bG9nVGltZXN0YW1wKCk7Ci0gICAgV3JpdGVyOjpsb2dIYXNoKGhhc2gpOwotICAgIGZvciAoY29uc3QgY2hhciAqcCA9IGZtdDsgKnAgIT0gJ1wwJzsgcCsrKSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCBtb3JlIGNvbXBsZXggZm9ybWF0dGluZyBzdWNoIGFzICUuM2YKLSAgICAgICAgaWYgKCpwICE9ICclJykgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgc3dpdGNoKCorK3ApIHsKLSAgICAgICAgY2FzZSAncyc6IC8vIHN0cmluZwotICAgICAgICAgICAgcyA9IHZhX2FyZyhhcmdwLCBjaGFyICopOwotICAgICAgICAgICAgV3JpdGVyOjpsb2cocyk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICd0JzogLy8gdGltZXN0YW1wCi0gICAgICAgICAgICB0ID0gdmFfYXJnKGFyZ3AsIGludDY0X3QpOwotICAgICAgICAgICAgV3JpdGVyOjpsb2dUaW1lc3RhbXAodCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICdkJzogLy8gaW50ZWdlcgotICAgICAgICAgICAgaSA9IHZhX2FyZyhhcmdwLCBpbnQpOwotICAgICAgICAgICAgV3JpdGVyOjpsb2dJbnRlZ2VyKGkpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAnZic6IC8vIGZsb2F0Ci0gICAgICAgICAgICBmID0gdmFfYXJnKGFyZ3AsIGRvdWJsZSk7IC8vIGZsb2F0IGFyZ3VtZW50cyBhcmUgcHJvbW90ZWQgdG8gZG91YmxlIGluIHZhcmFyZyBsaXN0cwotICAgICAgICAgICAgV3JpdGVyOjpsb2dGbG9hdCgoZmxvYXQpZik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICdwJzogLy8gcGlkCi0gICAgICAgICAgICBXcml0ZXI6OmxvZ1BJRCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLy8gdGhlICIlXDAiIGNhc2UgZmluaXNoZXMgcGFyc2luZwotICAgICAgICBjYXNlICdcMCc6Ci0gICAgICAgICAgICAtLXA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICclJzoKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HVygiTkJMb2cgV3JpdGVyIHBhcnNlZCBpbnZhbGlkIGZvcm1hdCBzcGVjaWZpZXI6ICVjIiwgKnApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgV3JpdGVyOjpsb2dFbmQoKTsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2coRXZlbnQgZXZlbnQsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW5ndGgpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChkYXRhID09IE5VTEwgfHwgbGVuZ3RoID4gRW50cnk6OmtNYXhMZW5ndGgpIHsKLSAgICAgICAgLy8gVE9ETyBQZXJoYXBzIGl0IG1ha2VzIHNlbnNlIHRvIGRpc3BsYXkgdHJ1bmNhdGVkIGRhdGEgb3IgYXQgbGVhc3QgYQotICAgICAgICAvLyAgICAgIG1lc3NhZ2UgdGhhdCB0aGUgZGF0YSBpcyB0b28gbG9uZz8gIFRoZSBjdXJyZW50IGJlaGF2aW9yIGNhbiBjcmVhdGUKLSAgICAgICAgLy8gICAgICBhIGNvbmZ1c2lvbiBmb3IgYSBwcm9ncmFtbWVyIGRlYnVnZ2luZyB0aGVpciBjb2RlLgotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIC8vIElnbm9yZSBpZiBpbnZhbGlkIGV2ZW50Ci0gICAgaWYgKGV2ZW50ID09IEVWRU5UX1JFU0VSVkVEIHx8IGV2ZW50ID49IEVWRU5UX1VQUEVSX0JPVU5EKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRW50cnkgZXRyKGV2ZW50LCBkYXRhLCBsZW5ndGgpOwotICAgIGxvZygmZXRyLCB0cnVlIC8qdHJ1c3RlZCovKTsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2coY29uc3QgTkJMb2c6OkVudHJ5ICpldHIsIGJvb2wgdHJ1c3RlZCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKCF0cnVzdGVkKSB7Ci0gICAgICAgIGxvZyhldHItPm1FdmVudCwgZXRyLT5tRGF0YSwgZXRyLT5tTGVuZ3RoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzaXplX3QgbmVlZCA9IGV0ci0+bUxlbmd0aCArIEVudHJ5OjprT3ZlcmhlYWQ7ICAgIC8vIG1FdmVudCwgbUxlbmd0aCwgZGF0YVttTGVuZ3RoXSwgbUxlbmd0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCA9IG51bWJlciBvZiBieXRlcyB3cml0dGVuIHRvIEZJRk8KLQotICAgIC8vIEZJWE1FIG9wdGltaXplIHRoaXMgdXNpbmcgbWVtY3B5IGZvciB0aGUgZGF0YSBwYXJ0IG9mIHRoZSBFbnRyeS4KLSAgICAvLyBUaGUgRW50cnkgY291bGQgaGF2ZSBhIG1ldGhvZCBjb3B5VG8ocHRyLCBvZmZzZXQsIHNpemUpIHRvIG9wdGltaXplIHRoZSBjb3B5LgotICAgIC8vIGNoZWNrcyBzaXplIG9mIGEgc2luZ2xlIGxvZyBFbnRyeTogdHlwZSwgbGVuZ3RoLCBkYXRhIHBvaW50ZXIgYW5kIGVuZGluZwotICAgIHVpbnQ4X3QgdGVtcFtFbnRyeTo6a01heExlbmd0aCArIEVudHJ5OjprT3ZlcmhlYWRdOwotICAgIC8vIHdyaXRlIHRoaXMgZGF0YSB0byB0ZW1wIGFycmF5Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuZWVkOyBpKyspIHsKLSAgICAgICAgdGVtcFtpXSA9IGV0ci0+Y29weUVudHJ5RGF0YUF0KGkpOwotICAgIH0KLSAgICAvLyB3cml0ZSB0byBjaXJjdWxhciBidWZmZXIKLSAgICBtRmlmb1dyaXRlci0+d3JpdGUodGVtcCwgbmVlZCk7Ci19Ci0KLWJvb2wgTkJMb2c6OldyaXRlcjo6aXNFbmFibGVkKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbUVuYWJsZWQ7Ci19Ci0KLWJvb2wgTkJMb2c6OldyaXRlcjo6c2V0RW5hYmxlZChib29sIGVuYWJsZWQpCi17Ci0gICAgYm9vbCBvbGQgPSBtRW5hYmxlZDsKLSAgICBtRW5hYmxlZCA9IGVuYWJsZWQgJiYgbVNoYXJlZCAhPSBOVUxMOwotICAgIHJldHVybiBvbGQ7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1OQkxvZzo6TG9ja2VkV3JpdGVyOjpMb2NrZWRXcml0ZXIoKQotICAgIDogV3JpdGVyKCkKLXsKLX0KLQotTkJMb2c6OkxvY2tlZFdyaXRlcjo6TG9ja2VkV3JpdGVyKHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpCi0gICAgOiBXcml0ZXIoc2hhcmVkLCBzaXplKQotewotfQotCi12b2lkIE5CTG9nOjpMb2NrZWRXcml0ZXI6OmxvZyhjb25zdCBjaGFyICpzdHJpbmcpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBXcml0ZXI6OmxvZyhzdHJpbmcpOwotfQotCi12b2lkIE5CTG9nOjpMb2NrZWRXcml0ZXI6OmxvZ2YoY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0gICAgLy8gRklYTUUgc2hvdWxkIG5vdCB0YWtlIHRoZSBsb2NrIHVudGlsIGFmdGVyIGZvcm1hdHRpbmcgaXMgZG9uZQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgdmFfbGlzdCBhcDsKLSAgICB2YV9zdGFydChhcCwgZm10KTsKLSAgICBXcml0ZXI6OmxvZ3ZmKGZtdCwgYXApOwotICAgIHZhX2VuZChhcCk7Ci19Ci0KLXZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9ndmYoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQotewotICAgIC8vIEZJWE1FIHNob3VsZCBub3QgdGFrZSB0aGUgbG9jayB1bnRpbCBhZnRlciBmb3JtYXR0aW5nIGlzIGRvbmUKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIFdyaXRlcjo6bG9ndmYoZm10LCBhcCk7Ci19Ci0KLXZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nVGltZXN0YW1wKCkKLXsKLSAgICAvLyBGSVhNRSBzaG91bGQgbm90IHRha2UgdGhlIGxvY2sgdW50aWwgYWZ0ZXIgdGhlIGNsb2NrX2dldHRpbWUoKSBzeXNjYWxsCi0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBXcml0ZXI6OmxvZ1RpbWVzdGFtcCgpOwotfQotCi12b2lkIE5CTG9nOjpMb2NrZWRXcml0ZXI6OmxvZ1RpbWVzdGFtcChjb25zdCBpbnQ2NF90IHRzKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgV3JpdGVyOjpsb2dUaW1lc3RhbXAodHMpOwotfQotCi12b2lkIE5CTG9nOjpMb2NrZWRXcml0ZXI6OmxvZ0ludGVnZXIoY29uc3QgaW50IHgpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBXcml0ZXI6OmxvZ0ludGVnZXIoeCk7Ci19Ci0KLXZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nRmxvYXQoY29uc3QgZmxvYXQgeCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIFdyaXRlcjo6bG9nRmxvYXQoeCk7Ci19Ci0KLXZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nUElEKCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIFdyaXRlcjo6bG9nUElEKCk7Ci19Ci0KLXZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nU3RhcnQoY29uc3QgY2hhciAqZm10KQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgV3JpdGVyOjpsb2dTdGFydChmbXQpOwotfQotCi0KLXZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nRW5kKCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIFdyaXRlcjo6bG9nRW5kKCk7Ci19Ci0KLXZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nSGFzaChsb2dfaGFzaF90IGhhc2gpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBXcml0ZXI6OmxvZ0hhc2goaGFzaCk7Ci19Ci0KLWJvb2wgTkJMb2c6OkxvY2tlZFdyaXRlcjo6aXNFbmFibGVkKCkgY29uc3QKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBXcml0ZXI6OmlzRW5hYmxlZCgpOwotfQotCi1ib29sIE5CTG9nOjpMb2NrZWRXcml0ZXI6OnNldEVuYWJsZWQoYm9vbCBlbmFibGVkKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIFdyaXRlcjo6c2V0RW5hYmxlZChlbmFibGVkKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNvbnN0IHN0ZDo6c2V0PE5CTG9nOjpFdmVudD4gTkJMb2c6OlJlYWRlcjo6c3RhcnRpbmdUeXBlcyB7TkJMb2c6OkV2ZW50OjpFVkVOVF9TVEFSVF9GTVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5CTG9nOjpFdmVudDo6RVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTfTsKLWNvbnN0IHN0ZDo6c2V0PE5CTG9nOjpFdmVudD4gTkJMb2c6OlJlYWRlcjo6ZW5kaW5nVHlwZXMgICB7TkJMb2c6OkV2ZW50OjpFVkVOVF9FTkRfRk1ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQkxvZzo6RXZlbnQ6OkVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkJMb2c6OkV2ZW50OjpFVkVOVF9BVURJT19TVEFURX07Ci0KLU5CTG9nOjpSZWFkZXI6OlJlYWRlcihjb25zdCB2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKQotICAgIDogbVNoYXJlZCgoLypjb25zdCovIFNoYXJlZCAqKSBzaGFyZWQpLCAvKm1JTWVtb3J5Ki8KLSAgICAgIG1GZCgtMSksIG1JbmRlbnQoMCksCi0gICAgICBtRmlmbyhtU2hhcmVkICE9IE5VTEwgPwotICAgICAgICBuZXcgYXVkaW9fdXRpbHNfZmlmbyhzaXplLCBzaXplb2YodWludDhfdCksCi0gICAgICAgICAgICBtU2hhcmVkLT5tQnVmZmVyLCBtU2hhcmVkLT5tUmVhciwgTlVMTCAvKnRocm90dGxlc0Zyb250Ki8pIDogTlVMTCksCi0gICAgICBtRmlmb1JlYWRlcihtRmlmbyAhPSBOVUxMID8gbmV3IGF1ZGlvX3V0aWxzX2ZpZm9fcmVhZGVyKCptRmlmbykgOiBOVUxMKQotewotfQotCi1OQkxvZzo6UmVhZGVyOjpSZWFkZXIoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnksIHNpemVfdCBzaXplKQotICAgIDogUmVhZGVyKGlNZW1vcnkgIT0gMCA/IChTaGFyZWQgKikgaU1lbW9yeS0+cG9pbnRlcigpIDogTlVMTCwgc2l6ZSkKLXsKLSAgICBtSU1lbW9yeSA9IGlNZW1vcnk7Ci19Ci0KLU5CTG9nOjpSZWFkZXI6On5SZWFkZXIoKQotewotICAgIGRlbGV0ZSBtRmlmb1JlYWRlcjsKLSAgICBkZWxldGUgbUZpZm87Ci19Ci0KLWNvbnN0IHVpbnQ4X3QgKk5CTG9nOjpSZWFkZXI6OmZpbmRMYXN0RW50cnlPZlR5cGVzKGNvbnN0IHVpbnQ4X3QgKmZyb250LCBjb25zdCB1aW50OF90ICpiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxFdmVudD4gJnR5cGVzKSB7Ci0gICAgd2hpbGUgKGJhY2sgKyBFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0ID49IGZyb250KSB7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKnByZXYgPSBiYWNrIC0gYmFja1tFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0XSAtIEVudHJ5OjprT3ZlcmhlYWQ7Ci0gICAgICAgIGlmIChwcmV2IDwgZnJvbnQgfHwgcHJldiArIHByZXZbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnRyeTo6a092ZXJoZWFkICE9IGJhY2spIHsKLQotICAgICAgICAgICAgLy8gcHJldiBwb2ludHMgdG8gYW4gb3V0IG9mIGxpbWl0cyBvciBpbmNvbnNpc3RlbnQgZW50cnkKLSAgICAgICAgICAgIHJldHVybiBudWxscHRyOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0eXBlcy5maW5kKChjb25zdCBFdmVudCkgcHJldltvZmZzZXRvZihlbnRyeSwgdHlwZSldKSAhPSB0eXBlcy5lbmQoKSkgewotICAgICAgICAgICAgcmV0dXJuIHByZXY7Ci0gICAgICAgIH0KLSAgICAgICAgYmFjayA9IHByZXY7Ci0gICAgfQotICAgIHJldHVybiBudWxscHRyOyAvLyBubyBlbnRyeSBmb3VuZAotfQotCi1zdGQ6OnVuaXF1ZV9wdHI8TkJMb2c6OlJlYWRlcjo6U25hcHNob3Q+IE5CTG9nOjpSZWFkZXI6OmdldFNuYXBzaG90KCkKLXsKLSAgICBpZiAobUZpZm9SZWFkZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPE5CTG9nOjpSZWFkZXI6OlNuYXBzaG90PihuZXcgU25hcHNob3QoKSk7Ci0gICAgfQotICAgIC8vIG1ha2UgYSBjb3B5IHRvIGF2b2lkIHJhY2UgY29uZGl0aW9uIHdpdGggd3JpdGVyCi0gICAgc2l6ZV90IGNhcGFjaXR5ID0gbUZpZm8tPmNhcGFjaXR5KCk7Ci0KLSAgICAvLyBUaGlzIGVtdWxhdGVzIHRoZSBiZWhhdmlvdXIgb2YgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXI6OnJlYWQsIGJ1dCB3aXRob3V0IGluY3JlbWVudGluZyB0aGUKLSAgICAvLyByZWFkZXIgaW5kZXguIFRoZSBpbmRleCBpcyBpbmNyZW1lbnRlZCBhZnRlciBoYW5kbGluZyBjb3JydXB0aW9uLCB0byBhZnRlciB0aGUgbGFzdCBjb21wbGV0ZQotICAgIC8vIGVudHJ5IG9mIHRoZSBidWZmZXIKLSAgICBzaXplX3QgbG9zdDsKLSAgICBhdWRpb191dGlsc19pb3ZlYyBpb3ZlY1syXTsKLSAgICBzc2l6ZV90IGF2YWlsVG9SZWFkID0gbUZpZm9SZWFkZXItPm9idGFpbihpb3ZlYywgY2FwYWNpdHksIE5VTEwgLyp0aW1lb3V0Ki8sICZsb3N0KTsKLSAgICBpZiAoYXZhaWxUb1JlYWQgPD0gMCkgewotICAgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPE5CTG9nOjpSZWFkZXI6OlNuYXBzaG90PihuZXcgU25hcHNob3QoKSk7Ci0gICAgfQotCi0gICAgc3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90PiBzbmFwc2hvdChuZXcgU25hcHNob3QoYXZhaWxUb1JlYWQpKTsKLSAgICBtZW1jcHkoc25hcHNob3QtPm1EYXRhLCAoY29uc3QgY2hhciAqKSBtRmlmby0+YnVmZmVyKCkgKyBpb3ZlY1swXS5tT2Zmc2V0LCBpb3ZlY1swXS5tTGVuZ3RoKTsKLSAgICBpZiAoaW92ZWNbMV0ubUxlbmd0aCA+IDApIHsKLSAgICAgICAgbWVtY3B5KHNuYXBzaG90LT5tRGF0YSArIChpb3ZlY1swXS5tTGVuZ3RoKSwKLSAgICAgICAgICAgIChjb25zdCBjaGFyICopIG1GaWZvLT5idWZmZXIoKSArIGlvdmVjWzFdLm1PZmZzZXQsIGlvdmVjWzFdLm1MZW5ndGgpOwotICAgIH0KLQotICAgIC8vIEhhbmRsZSBjb3JydXB0ZWQgYnVmZmVyCi0gICAgLy8gUG90ZW50aWFsbHksIGEgYnVmZmVyIGhhcyBjb3JydXB0ZWQgZGF0YSBvbiBib3RoIGJlZ2lubmluZyAoZHVlIHRvIG92ZXJmbG93KSBhbmQgZW5kCi0gICAgLy8gKGR1ZSB0byBpbmNvbXBsZXRlIGZvcm1hdCBlbnRyeSkuIEJ1dCBldmVuIGlmIHRoZSBlbmQgZm9ybWF0IGVudHJ5IGlzIGluY29tcGxldGUsCi0gICAgLy8gaXQgZW5kcyBpbiBhIGNvbXBsZXRlIGVudHJ5ICh3aGljaCBpcyBub3QgYW4gRU5EX0ZNVCkuIFNvIGlzIHNhZmUgdG8gdHJhdmVyc2UgYmFja3dhcmRzLgotICAgIC8vIFRPRE86IGhhbmRsZSBjbGllbnQgY29ycnVwdGlvbiAoaW4gdGhlIG1pZGRsZSBvZiBhIGJ1ZmZlcikKLQotICAgIGNvbnN0IHVpbnQ4X3QgKmJhY2sgPSBzbmFwc2hvdC0+bURhdGEgKyBhdmFpbFRvUmVhZDsKLSAgICBjb25zdCB1aW50OF90ICpmcm9udCA9IHNuYXBzaG90LT5tRGF0YTsKLQotICAgIC8vIEZpbmQgbGFzdCBFTkRfRk1ULiA8YmFjaz4gaXMgc2l0dGluZyBvbiBhbiBlbnRyeSB3aGljaCBtaWdodCBiZSB0aGUgbWlkZGxlIG9mIGEgRm9ybWF0RW50cnkuCi0gICAgLy8gV2UgZ28gYmFja3dhcmRzIHVudGlsIHdlIGZpbmQgYW4gRVZFTlRfRU5EX0ZNVC4KLSAgICBjb25zdCB1aW50OF90ICpsYXN0RW5kID0gZmluZExhc3RFbnRyeU9mVHlwZXMoZnJvbnQsIGJhY2ssIGVuZGluZ1R5cGVzKTsKLSAgICBpZiAobGFzdEVuZCA9PSBudWxscHRyKSB7Ci0gICAgICAgIHNuYXBzaG90LT5tRW5kID0gc25hcHNob3QtPm1CZWdpbiA9IEVudHJ5SXRlcmF0b3IoZnJvbnQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIGVuZCBvZiBzbmFwc2hvdCBwb2ludHMgdG8gYWZ0ZXIgbGFzdCBFTkRfRk1UIGVudHJ5Ci0gICAgICAgIHNuYXBzaG90LT5tRW5kID0gRW50cnlJdGVyYXRvcihsYXN0RW5kKS5uZXh0KCk7Ci0gICAgICAgIC8vIGZpbmQgZmlyc3QgU1RBUlRfRk1UCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmZpcnN0U3RhcnQgPSBudWxscHRyOwotICAgICAgICBjb25zdCB1aW50OF90ICpmaXJzdFN0YXJ0VG1wID0gc25hcHNob3QtPm1FbmQ7Ci0gICAgICAgIHdoaWxlICgoZmlyc3RTdGFydFRtcCA9IGZpbmRMYXN0RW50cnlPZlR5cGVzKGZyb250LCBmaXJzdFN0YXJ0VG1wLCBzdGFydGluZ1R5cGVzKSkKLSAgICAgICAgICAgICAgICAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBmaXJzdFN0YXJ0ID0gZmlyc3RTdGFydFRtcDsKLSAgICAgICAgfQotICAgICAgICAvLyBmaXJzdFN0YXJ0IGlzIG51bGwgaWYgbm8gU1RBUlRfRk1UIGVudHJ5IHdhcyBmb3VuZCBiZWZvcmUgbGFzdEVuZAotICAgICAgICBpZiAoZmlyc3RTdGFydCA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBzbmFwc2hvdC0+bUJlZ2luID0gc25hcHNob3QtPm1FbmQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzbmFwc2hvdC0+bUJlZ2luID0gRW50cnlJdGVyYXRvcihmaXJzdFN0YXJ0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIGFkdmFuY2UgZmlmbyByZWFkZXIgaW5kZXggdG8gYWZ0ZXIgbGFzdCBlbnRyeSByZWFkLgotICAgIG1GaWZvUmVhZGVyLT5yZWxlYXNlKHNuYXBzaG90LT5tRW5kIC0gZnJvbnQpOwotCi0gICAgc25hcHNob3QtPm1Mb3N0ID0gbG9zdDsKLSAgICByZXR1cm4gc25hcHNob3Q7Ci0KLX0KLQotLy8gVE9ETzogbW92ZSB0aGlzIHRvIFBlcmZvcm1hbmNlQW5hbHlzaXMKLS8vIFRPRE86IG1ha2UgY2FsbCB0byBkdW1wIHBlcmlvZGljIHNvIHRoYXQgZGF0YSBpbiBzaGFyZWQgRklGTyBkb2VzIG5vdCBnZXQgb3ZlcndyaXR0ZW4KLXZvaWQgTkJMb2c6OlJlYWRlcjo6ZHVtcChpbnQgZmQsIHNpemVfdCBpbmRlbnQsIE5CTG9nOjpSZWFkZXI6OlNuYXBzaG90ICZzbmFwc2hvdCkKLXsKLSAgICBtRmQgPSBmZDsKLSAgICBtSW5kZW50ID0gaW5kZW50OwotICAgIFN0cmluZzggdGltZXN0YW1wLCBib2R5OwotICAgIC8vIEZJWE1FOiB0aGlzIGlzIG5vdCB0aHJlYWQgc2FmZQotICAgIC8vIFRPRE86IG5lZWQgYSBzZXBhcmF0ZSBpbnN0YW5jZSBvZiBwZXJmb3JtYW5jZUFuYWx5c2lzIGZvciBlYWNoIHRocmVhZAotICAgIC8vIHVzZWQgdG8gc3RvcmUgZGF0YSBhbmQgdG8gY2FsbCBhbmFseXNpcyBmdW5jdGlvbnMKLSAgICBzdGF0aWMgUmVwb3J0UGVyZm9ybWFuY2U6OlBlcmZvcm1hbmNlQW5hbHlzaXMgcGVyZm9ybWFuY2VBbmFseXNpczsKLSAgICBzaXplX3QgbG9zdCA9IHNuYXBzaG90Lmxvc3QoKSArIChzbmFwc2hvdC5iZWdpbigpIC0gRW50cnlJdGVyYXRvcihzbmFwc2hvdC5kYXRhKCkpKTsKLSAgICBpZiAobG9zdCA+IDApIHsKLSAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIndhcm5pbmc6IGxvc3QgJXp1IGJ5dGVzIHdvcnRoIG9mIGV2ZW50cyIsIGxvc3QpOwotICAgICAgICAvLyBUT0RPIHRpbWVzdGFtcCBlbXB0eSBoZXJlLCBvbmx5IG90aGVyIGNob2ljZSB0byB3YWl0IGZvciB0aGUgZmlyc3QgdGltZXN0YW1wIGV2ZW50IGluIHRoZQotICAgICAgICAvLyAgICAgIGxvZyB0byBwdXNoIGl0IG91dC4gIENvbnNpZGVyIGtlZXBpbmcgdGhlIHRpbWVzdGFtcC9ib2R5IGJldHdlZW4gY2FsbHMgdG8gY29weUVudHJ5RGF0YUF0KCkuCi0gICAgICAgIGR1bXBMaW5lKHRpbWVzdGFtcCwgYm9keSk7Ci0gICAgfQotCi0gICAgZm9yIChhdXRvIGVudHJ5ID0gc25hcHNob3QuYmVnaW4oKTsgZW50cnkgIT0gc25hcHNob3QuZW5kKCk7KSB7Ci0gICAgICAgIHN3aXRjaCAoZW50cnktPnR5cGUpIHsKLSAgICAgICAgY2FzZSBFVkVOVF9TVEFSVF9GTVQ6Ci0gICAgICAgICAgICBlbnRyeSA9IGhhbmRsZUZvcm1hdChGb3JtYXRFbnRyeShlbnRyeSksICZ0aW1lc3RhbXAsICZib2R5KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUzogewotICAgICAgICAgICAgSGlzdFRzRW50cnlXaXRoQXV0aG9yICpkYXRhID0gKEhpc3RUc0VudHJ5V2l0aEF1dGhvciAqKSAoZW50cnktPmRhdGEpOwotICAgICAgICAgICAgLy8gVE9ETyBUaGlzIG1lbWNwaWVzIGFyZSBoZXJlIHRvIGF2b2lkIHVuYWxpZ25lZCBtZW1vcnkgYWNjZXNzIGNyYXNoLgotICAgICAgICAgICAgLy8gVGhlcmUncyBwcm9iYWJseSBhIG1vcmUgZWZmaWNpZW50IHdheSB0byBkbyBpdAotICAgICAgICAgICAgbG9nX2hhc2hfdCBoYXNoOwotICAgICAgICAgICAgbWVtY3B5KCZoYXNoLCAmKGRhdGEtPmhhc2gpLCBzaXplb2YoaGFzaCkpOwotICAgICAgICAgICAgaW50NjRfdCB0czsKLSAgICAgICAgICAgIG1lbWNweSgmdHMsICZkYXRhLT50cywgc2l6ZW9mKHRzKSk7Ci0gICAgICAgICAgICBwZXJmb3JtYW5jZUFuYWx5c2lzLmxvZ1RzRW50cnkodHMpOwotICAgICAgICAgICAgKytlbnRyeTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRVZFTlRfQVVESU9fU1RBVEU6IHsKLSAgICAgICAgICAgIHBlcmZvcm1hbmNlQW5hbHlzaXMuaGFuZGxlU3RhdGVDaGFuZ2UoKTsKLSAgICAgICAgICAgICsrZW50cnk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEVWRU5UX0VORF9GTVQ6Ci0gICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgid2FybmluZzogZ290IHRvIGVuZCBmb3JtYXQgZXZlbnQiKTsKLSAgICAgICAgICAgICsrZW50cnk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFVkVOVF9SRVNFUlZFRDoKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJvZHkuYXBwZW5kRm9ybWF0KCJ3YXJuaW5nOiB1bmV4cGVjdGVkIGV2ZW50ICVkIiwgZW50cnktPnR5cGUpOwotICAgICAgICAgICAgKytlbnRyeTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIHBlcmZvcm1hbmNlQW5hbHlzaXMucmVwb3J0UGVyZm9ybWFuY2UoJmJvZHkpOwotICAgIGlmICghYm9keS5pc0VtcHR5KCkpIHsKLSAgICAgICAgZHVtcExpbmUodGltZXN0YW1wLCBib2R5KTsKLSAgICB9Ci19Ci0KLXZvaWQgTkJMb2c6OlJlYWRlcjo6ZHVtcChpbnQgZmQsIHNpemVfdCBpbmRlbnQpCi17Ci0gICAgLy8gZ2V0IGEgc25hcHNob3QsIGR1bXAgaXQKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+IHNuYXAgPSBnZXRTbmFwc2hvdCgpOwotICAgIGR1bXAoZmQsIGluZGVudCwgKnNuYXApOwotfQotCi12b2lkIE5CTG9nOjpSZWFkZXI6OmR1bXBMaW5lKGNvbnN0IFN0cmluZzggJnRpbWVzdGFtcCwgU3RyaW5nOCAmYm9keSkKLXsKLSAgICBpZiAobUZkID49IDApIHsKLSAgICAgICAgZHByaW50ZihtRmQsICIlLipzJXMgJXNcbiIsIG1JbmRlbnQsICIiLCB0aW1lc3RhbXAuc3RyaW5nKCksIGJvZHkuc3RyaW5nKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dJKCIlLipzJXMgJXMiLCBtSW5kZW50LCAiIiwgdGltZXN0YW1wLnN0cmluZygpLCBib2R5LnN0cmluZygpKTsKLSAgICB9Ci0gICAgYm9keS5jbGVhcigpOwotfQotCi1ib29sIE5CTG9nOjpSZWFkZXI6OmlzSU1lbW9yeShjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSkgY29uc3QKLXsKLSAgICByZXR1cm4gaU1lbW9yeSAhPSAwICYmIG1JTWVtb3J5ICE9IDAgJiYgaU1lbW9yeS0+cG9pbnRlcigpID09IG1JTWVtb3J5LT5wb2ludGVyKCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIE5CTG9nOjphcHBlbmRUaW1lc3RhbXAoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSkgewotICAgIGludDY0X3QgdHM7Ci0gICAgbWVtY3B5KCZ0cywgZGF0YSwgc2l6ZW9mKHRzKSk7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCJbJWQuJTAzZF0iLCAoaW50KSAodHMgLyAoMTAwMCAqIDEwMDAgKiAxMDAwKSksCi0gICAgICAgICAgICAgICAgICAgIChpbnQpICgodHMgLyAoMTAwMCAqIDEwMDApKSAlIDEwMDApKTsKLX0KLQotdm9pZCBOQkxvZzo6YXBwZW5kSW50KFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpIHsKLSAgICBpbnQgeCA9ICooKGludCopIGRhdGEpOwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiPCVkPiIsIHgpOwotfQotCi12b2lkIE5CTG9nOjphcHBlbmRGbG9hdChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKSB7Ci0gICAgZmxvYXQgZjsKLSAgICBtZW1jcHkoJmYsIGRhdGEsIHNpemVvZihmbG9hdCkpOwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiPCVmPiIsIGYpOwotfQotCi12b2lkIE5CTG9nOjphcHBlbmRQSUQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IGxlbmd0aCkgewotICAgIHBpZF90IGlkID0gKigocGlkX3QqKSBkYXRhKTsKLSAgICBjaGFyICogbmFtZSA9ICYoKGNoYXIqKSBkYXRhKVtzaXplb2YocGlkX3QpXTsKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIjxQSUQ6ICVkLCBuYW1lOiAlLipzPiIsIGlkLCAoaW50KSAobGVuZ3RoIC0gc2l6ZW9mKHBpZF90KSksIG5hbWUpOwotfQotCi1TdHJpbmc4IE5CTG9nOjpidWZmZXJEdW1wKGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCi17Ci0gICAgU3RyaW5nOCBzdHI7Ci0gICAgc3RyLmFwcGVuZCgiWyAiKTsKLSAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgICAgc3RyLmFwcGVuZEZvcm1hdCgiJWQgIiwgYnVmZmVyW2ldKTsKLSAgICB9Ci0gICAgc3RyLmFwcGVuZCgiXSIpOwotICAgIHJldHVybiBzdHI7Ci19Ci0KLVN0cmluZzggTkJMb2c6OmJ1ZmZlckR1bXAoY29uc3QgRW50cnlJdGVyYXRvciAmaXQpCi17Ci0gICAgcmV0dXJuIGJ1ZmZlckR1bXAoaXQsIGl0LT5sZW5ndGggKyBFbnRyeTo6a092ZXJoZWFkKTsKLX0KLQotTkJMb2c6OkVudHJ5SXRlcmF0b3IgTkJMb2c6OlJlYWRlcjo6aGFuZGxlRm9ybWF0KGNvbnN0IEZvcm1hdEVudHJ5ICZmbXRFbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggKnRpbWVzdGFtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggKmJvZHkpIHsKLSAgICAvLyBsb2cgdGltZXN0YW1wCi0gICAgaW50NjRfdCB0cyA9IGZtdEVudHJ5LnRpbWVzdGFtcCgpOwotICAgIHRpbWVzdGFtcC0+Y2xlYXIoKTsKLSAgICB0aW1lc3RhbXAtPmFwcGVuZEZvcm1hdCgiWyVkLiUwM2RdIiwgKGludCkgKHRzIC8gKDEwMDAgKiAxMDAwICogMTAwMCkpLAotICAgICAgICAgICAgICAgICAgICAoaW50KSAoKHRzIC8gKDEwMDAgKiAxMDAwKSkgJSAxMDAwKSk7Ci0KLSAgICAvLyBsb2cgdW5pcXVlIGhhc2gKLSAgICBsb2dfaGFzaF90IGhhc2ggPSBmbXRFbnRyeS5oYXNoKCk7Ci0gICAgLy8gcHJpbnQgb25seSBsb3dlciAxNmJpdCBvZiBoYXNoIGFzIGhleCBhbmQgbGluZSBhcyBpbnQgdG8gcmVkdWNlIHNwYW0gaW4gdGhlIGxvZwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS40WC0lZCAiLCAoaW50KShoYXNoID4+IDE2KSAmIDB4RkZGRiwgKGludCkgaGFzaCAmIDB4RkZGRik7Ci0KLSAgICAvLyBsb2cgYXV0aG9yIChpZiBwcmVzZW50KQotICAgIGhhbmRsZUF1dGhvcihmbXRFbnRyeSwgYm9keSk7Ci0KLSAgICAvLyBsb2cgc3RyaW5nCi0gICAgTkJMb2c6OkVudHJ5SXRlcmF0b3IgYXJnID0gZm10RW50cnkuYXJncygpOwotCi0gICAgY29uc3QgY2hhciogZm10ID0gZm10RW50cnkuZm9ybWF0U3RyaW5nKCk7Ci0gICAgc2l6ZV90IGZtdF9sZW5ndGggPSBmbXRFbnRyeS5mb3JtYXRTdHJpbmdMZW5ndGgoKTsKLQotICAgIGZvciAoc2l6ZV90IGZtdF9vZmZzZXQgPSAwOyBmbXRfb2Zmc2V0IDwgZm10X2xlbmd0aDsgKytmbXRfb2Zmc2V0KSB7Ci0gICAgICAgIGlmIChmbXRbZm10X29mZnNldF0gIT0gJyUnKSB7Ci0gICAgICAgICAgICBib2R5LT5hcHBlbmQoJmZtdFtmbXRfb2Zmc2V0XSwgMSk7IC8vIFRPRE8gb3B0aW1pemUgdG8gd3JpdGUgY29uc2VjdXRpdmUgc3RyaW5ncyBhdCBvbmNlCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICAvLyBjYXNlICIlJSIiCi0gICAgICAgIGlmIChmbXRbKytmbXRfb2Zmc2V0XSA9PSAnJScpIHsKLSAgICAgICAgICAgIGJvZHktPmFwcGVuZCgiJSIpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gY2FzZSAiJVwwIgotICAgICAgICBpZiAoZm10X29mZnNldCA9PSBmbXRfbGVuZ3RoKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIE5CTG9nOjpFdmVudCBldmVudCA9IChOQkxvZzo6RXZlbnQpIGFyZy0+dHlwZTsKLSAgICAgICAgc2l6ZV90IGxlbmd0aCA9IGFyZy0+bGVuZ3RoOwotCi0gICAgICAgIC8vIFRPRE8gY2hlY2sgbGVuZ3RoIGZvciBldmVudCB0eXBlIGlzIGNvcnJlY3QKLQotICAgICAgICBpZiAoZXZlbnQgPT0gRVZFTlRfRU5EX0ZNVCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgbW9yZSBjb21wbGV4IGZvcm1hdHRpbmcgc3VjaCBhcyAlLjNmCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdHVtID0gYXJnLT5kYXRhOyAvLyBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGV2ZW50IGFyZ3MKLSAgICAgICAgc3dpdGNoKGZtdFtmbXRfb2Zmc2V0XSkKLSAgICAgICAgewotICAgICAgICBjYXNlICdzJzogLy8gc3RyaW5nCi0gICAgICAgICAgICBBTE9HV19JRihldmVudCAhPSBFVkVOVF9TVFJJTkcsCi0gICAgICAgICAgICAgICAgIk5CTG9nIFJlYWRlciBpbmNvbXBhdGlibGUgZXZlbnQgZm9yIHN0cmluZyBzcGVjaWZpZXI6ICVkIiwgZXZlbnQpOwotICAgICAgICAgICAgYm9keS0+YXBwZW5kKChjb25zdCBjaGFyKikgZGF0dW0sIGxlbmd0aCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICd0JzogLy8gdGltZXN0YW1wCi0gICAgICAgICAgICBBTE9HV19JRihldmVudCAhPSBFVkVOVF9USU1FU1RBTVAsCi0gICAgICAgICAgICAgICAgIk5CTG9nIFJlYWRlciBpbmNvbXBhdGlibGUgZXZlbnQgZm9yIHRpbWVzdGFtcCBzcGVjaWZpZXI6ICVkIiwgZXZlbnQpOwotICAgICAgICAgICAgYXBwZW5kVGltZXN0YW1wKGJvZHksIGRhdHVtKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJ2QnOiAvLyBpbnRlZ2VyCi0gICAgICAgICAgICBBTE9HV19JRihldmVudCAhPSBFVkVOVF9JTlRFR0VSLAotICAgICAgICAgICAgICAgICJOQkxvZyBSZWFkZXIgaW5jb21wYXRpYmxlIGV2ZW50IGZvciBpbnRlZ2VyIHNwZWNpZmllcjogJWQiLCBldmVudCk7Ci0gICAgICAgICAgICBhcHBlbmRJbnQoYm9keSwgZGF0dW0pOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAnZic6IC8vIGZsb2F0Ci0gICAgICAgICAgICBBTE9HV19JRihldmVudCAhPSBFVkVOVF9GTE9BVCwKLSAgICAgICAgICAgICAgICAiTkJMb2cgUmVhZGVyIGluY29tcGF0aWJsZSBldmVudCBmb3IgZmxvYXQgc3BlY2lmaWVyOiAlZCIsIGV2ZW50KTsKLSAgICAgICAgICAgIGFwcGVuZEZsb2F0KGJvZHksIGRhdHVtKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJ3AnOiAvLyBwaWQKLSAgICAgICAgICAgIEFMT0dXX0lGKGV2ZW50ICE9IEVWRU5UX1BJRCwKLSAgICAgICAgICAgICAgICAiTkJMb2cgUmVhZGVyIGluY29tcGF0aWJsZSBldmVudCBmb3IgcGlkIHNwZWNpZmllcjogJWQiLCBldmVudCk7Ci0gICAgICAgICAgICBhcHBlbmRQSUQoYm9keSwgZGF0dW0sIGxlbmd0aCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1coIk5CTG9nIFJlYWRlciBlbmNvdW50ZXJlZCB1bmtub3duIGNoYXJhY3RlciAlYyIsIGZtdFtmbXRfb2Zmc2V0XSk7Ci0gICAgICAgIH0KLSAgICAgICAgKythcmc7Ci0gICAgfQotICAgIEFMT0dXX0lGKGFyZy0+dHlwZSAhPSBFVkVOVF9FTkRfRk1ULCAiRXhwZWN0ZWQgZW5kIG9mIGZvcm1hdCwgZ290ICVkIiwgYXJnLT50eXBlKTsKLSAgICArK2FyZzsKLSAgICByZXR1cm4gYXJnOwotfQotCi1OQkxvZzo6TWVyZ2VyOjpNZXJnZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSk6Ci0gICAgICBtU2hhcmVkKChTaGFyZWQgKikgc2hhcmVkKSwKLSAgICAgIG1GaWZvKG1TaGFyZWQgIT0gTlVMTCA/Ci0gICAgICAgIG5ldyBhdWRpb191dGlsc19maWZvKHNpemUsIHNpemVvZih1aW50OF90KSwKLSAgICAgICAgICAgIG1TaGFyZWQtPm1CdWZmZXIsIG1TaGFyZWQtPm1SZWFyLCBOVUxMIC8qdGhyb3R0bGVzRnJvbnQqLykgOiBOVUxMKSwKLSAgICAgIG1GaWZvV3JpdGVyKG1GaWZvICE9IE5VTEwgPyBuZXcgYXVkaW9fdXRpbHNfZmlmb193cml0ZXIoKm1GaWZvKSA6IE5VTEwpCi0gICAgICB7fQotCi12b2lkIE5CTG9nOjpNZXJnZXI6OmFkZFJlYWRlcihjb25zdCBOQkxvZzo6TmFtZWRSZWFkZXIgJnJlYWRlcikgewotICAgIC8vIEZJWE1FIFRoaXMgaXMgY2FsbGVkIGJ5IGJpbmRlciB0aHJlYWQgaW4gTWVkaWFMb2dTZXJ2aWNlOjpyZWdpc3RlcldyaXRlcgotICAgIC8vICAgICAgIGJ1dCB0aGUgYWNjZXNzIHRvIHNoYXJlZCB2YXJpYWJsZSBtTmFtZWRSZWFkZXJzIGlzIG5vdCB5ZXQgcHJvdGVjdGVkIGJ5IGEgbG9jay4KLSAgICBtTmFtZWRSZWFkZXJzLnB1c2hfYmFjayhyZWFkZXIpOwotfQotCi0vLyBpdGVtcyBwbGFjZWQgaW4gcHJpb3JpdHkgcXVldWUgZHVyaW5nIG1lcmdlCi0vLyBjb21wb3NlZCBieSBhIHRpbWVzdGFtcCBhbmQgdGhlIGluZGV4IG9mIHRoZSBzbmFwc2hvdCB3aGVyZSB0aGUgdGltZXN0YW1wIGNhbWUgZnJvbQotc3RydWN0IE1lcmdlSXRlbQotewotICAgIGludDY0X3QgdHM7Ci0gICAgaW50IGluZGV4OwotICAgIE1lcmdlSXRlbShpbnQ2NF90IHRzLCBpbnQgaW5kZXgpOiB0cyh0cyksIGluZGV4KGluZGV4KSB7fQotfTsKLQotLy8gb3BlcmF0b3JzIG5lZWRlZCBmb3IgcHJpb3JpdHkgcXVldWUgaW4gbWVyZ2UKLS8vIGJvb2wgb3BlcmF0b3I+KGNvbnN0IGludDY0X3QgJnQxLCBjb25zdCBpbnQ2NF90ICZ0MikgewotLy8gICAgIHJldHVybiB0MS50dl9zZWMgPiB0Mi50dl9zZWMgfHwgKHQxLnR2X3NlYyA9PSB0Mi50dl9zZWMgJiYgdDEudHZfbnNlYyA+IHQyLnR2X25zZWMpOwotLy8gfQotCi1ib29sIG9wZXJhdG9yPihjb25zdCBzdHJ1Y3QgTWVyZ2VJdGVtICZpMSwgY29uc3Qgc3RydWN0IE1lcmdlSXRlbSAmaTIpIHsKLSAgICByZXR1cm4gaTEudHMgPiBpMi50cyB8fCAoaTEudHMgPT0gaTIudHMgJiYgaTEuaW5kZXggPiBpMi5pbmRleCk7Ci19Ci0KLS8vIE1lcmdlIHJlZ2lzdGVyZWQgcmVhZGVycywgc29ydGVkIGJ5IHRpbWVzdGFtcAotdm9pZCBOQkxvZzo6TWVyZ2VyOjptZXJnZSgpIHsKLSAgICAvLyBGSVhNRSBUaGlzIGlzIGNhbGxlZCBieSBtZXJnZSB0aHJlYWQKLSAgICAvLyAgICAgICBidXQgdGhlIGFjY2VzcyB0byBzaGFyZWQgdmFyaWFibGUgbU5hbWVkUmVhZGVycyBpcyBub3QgeWV0IHByb3RlY3RlZCBieSBhIGxvY2suCi0gICAgaW50IG5Mb2dzID0gbU5hbWVkUmVhZGVycy5zaXplKCk7Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPE5CTG9nOjpSZWFkZXI6OlNuYXBzaG90Pj4gc25hcHNob3RzKG5Mb2dzKTsKLSAgICBzdGQ6OnZlY3RvcjxOQkxvZzo6RW50cnlJdGVyYXRvcj4gb2Zmc2V0cyhuTG9ncyk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuTG9nczsgKytpKSB7Ci0gICAgICAgIHNuYXBzaG90c1tpXSA9IG1OYW1lZFJlYWRlcnNbaV0ucmVhZGVyKCktPmdldFNuYXBzaG90KCk7Ci0gICAgICAgIG9mZnNldHNbaV0gPSBzbmFwc2hvdHNbaV0tPmJlZ2luKCk7Ci0gICAgfQotICAgIC8vIGluaXRpYWxpemUgb2Zmc2V0cwotICAgIC8vIFRPRE8gY3VzdG9tIGhlYXAgaW1wbGVtZW50YXRpb24gY291bGQgYWxsb3cgdG8gdXBkYXRlIHRvcCwgaW1wcm92aW5nIHBlcmZvcm1hbmNlCi0gICAgLy8gZm9yIGJ1cnN0eSBidWZmZXJzCi0gICAgc3RkOjpwcmlvcml0eV9xdWV1ZTxNZXJnZUl0ZW0sIHN0ZDo6dmVjdG9yPE1lcmdlSXRlbT4sIHN0ZDo6Z3JlYXRlcjxNZXJnZUl0ZW0+PiB0aW1lc3RhbXBzOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkxvZ3M7ICsraSkKLSAgICB7Ci0gICAgICAgIGlmIChvZmZzZXRzW2ldICE9IHNuYXBzaG90c1tpXS0+ZW5kKCkpIHsKLSAgICAgICAgICAgIGludDY0X3QgdHMgPSBBYnN0cmFjdEVudHJ5OjpidWlsZEVudHJ5KG9mZnNldHNbaV0pLT50aW1lc3RhbXAoKTsKLSAgICAgICAgICAgIHRpbWVzdGFtcHMuZW1wbGFjZSh0cywgaSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB3aGlsZSAoIXRpbWVzdGFtcHMuZW1wdHkoKSkgewotICAgICAgICAvLyBmaW5kIG1pbmltdW0gdGltZXN0YW1wCi0gICAgICAgIGludCBpbmRleCA9IHRpbWVzdGFtcHMudG9wKCkuaW5kZXg7Ci0gICAgICAgIC8vIGNvcHkgaXQgdG8gdGhlIGxvZywgaW5jcmVhc2luZyBvZmZzZXQKLSAgICAgICAgb2Zmc2V0c1tpbmRleF0gPSBBYnN0cmFjdEVudHJ5OjpidWlsZEVudHJ5KG9mZnNldHNbaW5kZXhdKS0+Y29weVdpdGhBdXRob3IobUZpZm9Xcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKLSAgICAgICAgLy8gdXBkYXRlIGRhdGEgc3RydWN0dXJlcwotICAgICAgICB0aW1lc3RhbXBzLnBvcCgpOwotICAgICAgICBpZiAob2Zmc2V0c1tpbmRleF0gIT0gc25hcHNob3RzW2luZGV4XS0+ZW5kKCkpIHsKLSAgICAgICAgICAgIGludDY0X3QgdHMgPSBBYnN0cmFjdEVudHJ5OjpidWlsZEVudHJ5KG9mZnNldHNbaW5kZXhdKS0+dGltZXN0YW1wKCk7Ci0gICAgICAgICAgICB0aW1lc3RhbXBzLmVtcGxhY2UodHMsIGluZGV4KTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotY29uc3Qgc3RkOjp2ZWN0b3I8TkJMb2c6Ok5hbWVkUmVhZGVyPiYgTkJMb2c6Ok1lcmdlcjo6Z2V0TmFtZWRSZWFkZXJzKCkgY29uc3QgewotICAgIC8vIEZJWE1FIFRoaXMgaXMgcmV0dXJuaW5nIGEgcmVmZXJlbmNlIHRvIGEgc2hhcmVkIHZhcmlhYmxlIHRoYXQgbmVlZHMgYSBsb2NrCi0gICAgcmV0dXJuIG1OYW1lZFJlYWRlcnM7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1OQkxvZzo6TWVyZ2VSZWFkZXI6Ok1lcmdlUmVhZGVyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUsIE1lcmdlciAmbWVyZ2VyKQotICAgIDogUmVhZGVyKHNoYXJlZCwgc2l6ZSksIG1OYW1lZFJlYWRlcnMobWVyZ2VyLmdldE5hbWVkUmVhZGVycygpKSB7fQotCi12b2lkIE5CTG9nOjpNZXJnZVJlYWRlcjo6aGFuZGxlQXV0aG9yKGNvbnN0IE5CTG9nOjpBYnN0cmFjdEVudHJ5ICZlbnRyeSwgU3RyaW5nOCAqYm9keSkgewotICAgIGludCBhdXRob3IgPSBlbnRyeS5hdXRob3IoKTsKLSAgICAvLyBGSVhNRSBOZWVkcyBhIGxvY2sKLSAgICBjb25zdCBjaGFyKiBuYW1lID0gbU5hbWVkUmVhZGVyc1thdXRob3JdLm5hbWUoKTsKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiVzOiAiLCBuYW1lKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLU5CTG9nOjpNZXJnZVRocmVhZDo6TWVyZ2VUaHJlYWQoTkJMb2c6Ok1lcmdlciAmbWVyZ2VyKQotICAgIDogbU1lcmdlcihtZXJnZXIpLAotICAgICAgbVRpbWVvdXRVcygwKSB7fQotCi1OQkxvZzo6TWVyZ2VUaHJlYWQ6On5NZXJnZVRocmVhZCgpIHsKLSAgICAvLyBzZXQgZXhpdCBmbGFnLCBzZXQgdGltZW91dCB0byAwIHRvIGZvcmNlIHRocmVhZExvb3AgdG8gZXhpdCBhbmQgd2FpdCBmb3IgdGhlIHRocmVhZCB0byBqb2luCi0gICAgcmVxdWVzdEV4aXQoKTsKLSAgICBzZXRUaW1lb3V0VXMoMCk7Ci0gICAgam9pbigpOwotfQotCi1ib29sIE5CTG9nOjpNZXJnZVRocmVhZDo6dGhyZWFkTG9vcCgpIHsKLSAgICBib29sIGRvTWVyZ2U7Ci0gICAgewotICAgICAgICBBdXRvTXV0ZXggX2wobU11dGV4KTsKLSAgICAgICAgLy8gSWYgbVRpbWVvdXRVcyBpcyBuZWdhdGl2ZSwgd2FpdCBvbiB0aGUgY29uZGl0aW9uIHZhcmlhYmxlIHVudGlsIGl0J3MgcG9zaXRpdmUuCi0gICAgICAgIC8vIElmIGl0J3MgcG9zaXRpdmUsIHdhaXQga1RocmVhZFNsZWVwUGVyaW9kVXMgYW5kIHRoZW4gbWVyZ2UKLSAgICAgICAgbnNlY3NfdCB3YWl0VGltZSA9IG1UaW1lb3V0VXMgPiAwID8ga1RocmVhZFNsZWVwUGVyaW9kVXMgKiAxMDAwIDogTExPTkdfTUFYOwotICAgICAgICBtQ29uZC53YWl0UmVsYXRpdmUobU11dGV4LCB3YWl0VGltZSk7Ci0gICAgICAgIGRvTWVyZ2UgPSBtVGltZW91dFVzID4gMDsKLSAgICAgICAgbVRpbWVvdXRVcyAtPSBrVGhyZWFkU2xlZXBQZXJpb2RVczsKLSAgICB9Ci0gICAgaWYgKGRvTWVyZ2UpIHsKLSAgICAgICAgbU1lcmdlci5tZXJnZSgpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBOQkxvZzo6TWVyZ2VUaHJlYWQ6Ondha2V1cCgpIHsKLSAgICBzZXRUaW1lb3V0VXMoa1RocmVhZFdha2V1cFBlcmlvZFVzKTsKLX0KLQotdm9pZCBOQkxvZzo6TWVyZ2VUaHJlYWQ6OnNldFRpbWVvdXRVcyhpbnQgdGltZSkgewotICAgIEF1dG9NdXRleCBfbChtTXV0ZXgpOwotICAgIG1UaW1lb3V0VXMgPSB0aW1lOwotICAgIG1Db25kLnNpZ25hbCgpOwotfQotCi19ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL09XTkVSUyBiL21lZGlhL2xpYm5iYWlvL09XTkVSUwppbmRleCBmOWNiNTY3Li5lZWNlNzFmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9PV05FUlMKKysrIGIvbWVkaWEvbGlibmJhaW8vT1dORVJTCkBAIC0xICsxLDIgQEAKIGdrYXN0ZW5AZ29vZ2xlLmNvbQoraHVuZ2FAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vUGVyZm9ybWFuY2VBbmFseXNpcy5jcHAgYi9tZWRpYS9saWJuYmFpby9QZXJmb3JtYW5jZUFuYWx5c2lzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIzYmRkYy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJuYmFpby9QZXJmb3JtYW5jZUFuYWx5c2lzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM3NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0jZGVmaW5lIExPR19UQUcgIlBlcmZvcm1hbmNlQW5hbHlzaXMiCi0vLyAjZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGNsaW1pdHM+Ci0jaW5jbHVkZSA8ZGVxdWU+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgPG51bWVyaWM+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3lzL3ByY3RsLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPG5ldz4KLSNpbmNsdWRlIDxhdWRpb191dGlscy9yb3VuZHVwLmg+Ci0jaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJMb2cuaD4KLSNpbmNsdWRlIDxtZWRpYS9uYmFpby9QZXJmb3JtYW5jZUFuYWx5c2lzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvbmJhaW8vUmVwb3J0UGVyZm9ybWFuY2UuaD4KLS8vICNpbmNsdWRlIDx1dGlscy9DYWxsU3RhY2suaD4gLy8gdXNlZCB0byBwcmludCBjYWxsc3RhY2sKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0KLSNpbmNsdWRlIDxxdWV1ZT4KLSNpbmNsdWRlIDx1dGlsaXR5PgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLW5hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZSB7Ci0KLVBlcmZvcm1hbmNlQW5hbHlzaXM6OlBlcmZvcm1hbmNlQW5hbHlzaXMoKSB7Ci0gICAgLy8gVGhlc2UgdmFyaWFibGVzIHdpbGwgYmUgKEZJWE1FKSBsZWFybmVkIGZyb20gdGhlIGRhdGEKLSAgICBrUGVyaW9kTXMgPSA0OyAvLyB0eXBpY2FsIGJ1ZmZlciBwZXJpb2QgKG1vZGUpCi0gICAgLy8gYXZlcmFnZSBudW1iZXIgb2YgTXMgc3BlbnQgcHJvY2Vzc2luZyBidWZmZXIKLSAgICBrUGVyaW9kTXNDUFUgPSBzdGF0aWNfY2FzdDxpbnQ+KGtQZXJpb2RNcyAqIGtSYXRpbyk7Ci19Ci0KLS8vIGNvbnZlcnRzIGEgdGltZSBzZXJpZXMgaW50byBhIG1hcC4ga2V5OiBidWZmZXIgcGVyaW9kIGxlbmd0aC4gdmFsdWU6IGNvdW50Ci1zdGF0aWMgc3RkOjptYXA8aW50LCBpbnQ+IGJ1aWxkQnVja2V0cyhjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiAmc2FtcGxlcykgewotICAgIC8vIFRPRE8gYWxsb3cgYnVja2V0cyBvZiB2YXJpYWJsZSByZXNvbHV0aW9uCi0gICAgc3RkOjptYXA8aW50LCBpbnQ+IGJ1Y2tldHM7Ci0gICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBzYW1wbGVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICsrYnVja2V0c1tkZWx0YU1zKHNhbXBsZXNbaSAtIDFdLCBzYW1wbGVzW2ldKV07Ci0gICAgfQotICAgIHJldHVybiBidWNrZXRzOwotfQotCi1zdGF0aWMgaW50IHdpZHRoT2YoaW50IHgpIHsKLSAgICBpbnQgd2lkdGggPSAwOwotICAgIHdoaWxlICh4ID4gMCkgewotICAgICAgICArK3dpZHRoOwotICAgICAgICB4IC89IDEwOwotICAgIH0KLSAgICByZXR1cm4gd2lkdGg7Ci19Ci0KLS8vIEdpdmVuIGEgc2VyaWVzIG9mIGF1ZGlvIHByb2Nlc3Npbmcgd2FrZXVwIHRpbWVzdGFtcHMsCi0vLyBidWNrZXRzIHRoZSB0aW1lIGludGVydmFscyBpbnRvIGEgaGlzdG9ncmFtLCBzZWFyY2hlcyBmb3IKLS8vIG91dGxpZXJzLCBhbmFseXplcyB0aGUgb3V0bGllciBzZXJpZXMgZm9yIHVuZXhwZWN0ZWRseQotLy8gc21hbGwgb3IgbGFyZ2UgdmFsdWVzIGFuZCBzdG9yZXMgdGhlc2UgYXMgcGVha3MsIGFuZCBmbHVzaGVzCi0vLyB0aGUgdGltZXN0YW1wIHNlcmllcyBmcm9tIG1lbW9yeS4KLXZvaWQgUGVyZm9ybWFuY2VBbmFseXNpczo6cHJvY2Vzc0FuZEZsdXNoVGltZVN0YW1wU2VyaWVzKCkgewotICAgIC8vIDEpIGFuYWx5emUgdGhlIHNlcmllcyB0byBzdG9yZSBhbGwgb3V0bGllcnMgYW5kIHRoZWlyIGV4YWN0IHRpbWVzdGFtcHM6Ci0gICAgc3RvcmVPdXRsaWVyRGF0YShtVGltZVN0YW1wU2VyaWVzKTsKLQotICAgIC8vIDIpIGRldGVjdCBwZWFrcyBpbiB0aGUgb3V0bGllciBzZXJpZXMKLSAgICBkZXRlY3RQZWFrcygpOwotCi0gICAgLy8gMykgY29tcHV0ZSBpdHMgaGlzdG9ncmFtLCBhcHBlbmQgdG8gbVJlY2VudEhpc3RzIGFuZCBjbGVhciB0aGUgdGltZSBzZXJpZXMKLSAgICBtUmVjZW50SGlzdHMuZW1wbGFjZV9iYWNrKHN0YXRpY19jYXN0PHRpbWVzdGFtcD4obVRpbWVTdGFtcFNlcmllc1swXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZEJ1Y2tldHMobVRpbWVTdGFtcFNlcmllcykpOwotICAgIC8vIGRvIG5vdCBsZXQgbVJlY2VudEhpc3RzIGV4Y2VlZCBjYXBhY2l0eQotICAgIC8vIEFMT0dEKCJtUmVjZW50SGlzdHMgc2l6ZTogJWQiLCBzdGF0aWNfY2FzdDxpbnQ+KG1SZWNlbnRIaXN0cy5zaXplKCkpKTsKLSAgICBpZiAobVJlY2VudEhpc3RzLnNpemUoKSA+PSBrUmVjZW50SGlzdHNDYXBhY2l0eSkgewotICAgICAgICAvLyAgQUxPR0QoInBvcHBlZCBiYWNrIG1SZWNlbnRIaXN0cyIpOwotICAgICAgICBtUmVjZW50SGlzdHMucG9wX2Zyb250KCk7Ci0gICAgfQotICAgIG1UaW1lU3RhbXBTZXJpZXMuY2xlYXIoKTsKLX0KLQotLy8gZm9yY2VzIHNob3J0LXRlcm0gaGlzdG9ncmFtIHN0b3JhZ2UgdG8gYXZvaWQgYWRkaW5nIGlkbGUgYXVkaW8gdGltZSBpbnRlcnZhbAotLy8gdG8gYnVmZmVyIHBlcmlvZCBkYXRhCi12b2lkIFBlcmZvcm1hbmNlQW5hbHlzaXM6OmhhbmRsZVN0YXRlQ2hhbmdlKCkgewotICAgIEFMT0dEKCJoYW5kbGVTdGF0ZUNoYW5nZSIpOwotICAgIHByb2Nlc3NBbmRGbHVzaFRpbWVTdGFtcFNlcmllcygpOwotICAgIHJldHVybjsKLX0KLQotLy8gVGFrZXMgYSBzaW5nbGUgYnVmZmVyIHBlcmlvZCB0aW1lc3RhbXAgZW50cnkgaW5mb3JtYXRpb24gYW5kIHN0b3JlcyBpdCBpbiBhCi0vLyB0ZW1wb3Jhcnkgc2VyaWVzIG9mIHRpbWVzdGFtcHMuIE9uY2UgdGhlIHNlcmllcyBpcyBmdWxsLCB0aGUgZGF0YSBpcyBhbmFseXplZCwKLS8vIHN0b3JlZCwgYW5kIGVtcHRpZWQuCi12b2lkIFBlcmZvcm1hbmNlQW5hbHlzaXM6OmxvZ1RzRW50cnkoaW50NjRfdCB0cykgewotICAgIC8vIFRPRE8gbWlnaHQgd2FudCB0byBmaWx0ZXIgZXhjZXNzaXZlbHkgaGlnaCBvdXRsaWVycywgd2hpY2ggYXJlIHVzdWFsbHkgY2F1c2VkCi0gICAgLy8gYnkgdGhlIHRocmVhZCBiZWluZyBpbmFjdGl2ZS4KLSAgICAvLyBTdG9yZSB0aW1lIHNlcmllcyBkYXRhIGZvciBlYWNoIHJlYWRlciBpbiBvcmRlciB0byBidWNrZXQgaXQgb25jZSB0aGVyZQotICAgIC8vIGlzIGVub3VnaCBkYXRhLiBUaGVuLCB3cml0ZSB0byByZWNlbnRIaXN0cyBhcyBhIGhpc3RvZ3JhbS4KLSAgICBtVGltZVN0YW1wU2VyaWVzLnB1c2hfYmFjayh0cyk7Ci0gICAgLy8gaWYgbGVuZ3RoIG9mIHRoZSB0aW1lIHNlcmllcyBoYXMgcmVhY2hlZCBrU2hvcnRIaXN0U2l6ZSBzYW1wbGVzLAotICAgIC8vIGFuYWx5emUgdGhlIGRhdGEgYW5kIGZsdXNoIHRoZSB0aW1lc3RhbXAgc2VyaWVzIGZyb20gbWVtb3J5Ci0gICAgaWYgKG1UaW1lU3RhbXBTZXJpZXMuc2l6ZSgpID49IGtTaG9ydEhpc3RTaXplKSB7Ci0gICAgICAgIHByb2Nlc3NBbmRGbHVzaFRpbWVTdGFtcFNlcmllcygpOwotICAgIH0KLX0KLQotLy8gV2hlbiB0aGUgc2hvcnQtdGVybSBoaXN0b2dyYW0gYXJyYXkgbVJlY2VudEhpc3RzIGhhcyByZWFjaGVkIGNhcGFjaXR5LAotLy8gbWVyZ2UgaGlzdG9ncmFtcyBmb3IgZGF0YSBjb21wcmVzc2lvbiBhbmQgc3RvcmUgdGhlbSBpbiBtTG9uZ1Rlcm1IaXN0cwotLy8gY2xlYXJzIG1SZWNlbnRIaXN0cwotLy8gVE9ETzogaGF2ZSBsb2dUc0VudHJ5IHdyaXRlIGRpcmVjdGx5IHRvIG1Mb25nVGVybUhpc3RzLCBkaXNjYXJkIG1SZWNlbnRIaXN0cywKLS8vIHN0YXJ0IGEgbmV3IGhpc3RvZ3JhbSB3aGVuIGEgcGVhayBvY2N1cnMKLXZvaWQgUGVyZm9ybWFuY2VBbmFseXNpczo6cHJvY2Vzc0FuZEZsdXNoUmVjZW50SGlzdHMoKSB7Ci0KLSAgICAvLyBCdWNrZXRzIGlzIHVzZWQgdG8gYWdncmVnYXRlIHNob3J0LXRlcm0gaGlzdG9ncmFtcy4KLSAgICBIaXN0b2dyYW0gYnVja2V0czsKLSAgICB0aW1lc3RhbXAgc3RhcnRpbmdUcyA9IG1SZWNlbnRIaXN0c1swXS5maXJzdDsKLQotICAgIGZvciAoY29uc3QgYXV0byAmc2hvcnRIaXN0OiBtUmVjZW50SGlzdHMpIHsKLSAgICAgICAgLy8gSWYgdGhlIHRpbWUgYmV0d2VlbiBzdGFydGluZyBhbmQgZW5kaW5nIHRpbWVzdGFtcHMgaGFzIHJlYWNoZWQgdGhlIG1heGltdW0sCi0gICAgICAgIC8vIGFkZCB0aGUgY3VycmVudCBoaXN0b2dyYW0gKGJ1Y2tldHMpIHRvIHRoZSBsb25nLXRlcm0gaGlzdG9ncmFtIGJ1ZmZlciwKLSAgICAgICAgLy8gY2xlYXIgYnVja2V0cywgYW5kIHN0YXJ0IGEgbmV3IGxvbmctdGVybSBoaXN0b2dyYW0gYWdncmVnYXRpb24gcHJvY2Vzcy4KLSAgICAgICAgaWYgKGRlbHRhTXMoc3RhcnRpbmdUcywgc2hvcnRIaXN0LmZpcnN0KSA+PSBrTWF4SGlzdFRpbWVzcGFuTXMpIHsKLSAgICAgICAgICAgIG1Mb25nVGVybUhpc3RzLmVtcGxhY2VfYmFjayhzdGFydGluZ1RzLCBzdGQ6Om1vdmUoYnVja2V0cykpOwotICAgICAgICAgICAgYnVja2V0cy5jbGVhcigpOwotICAgICAgICAgICAgc3RhcnRpbmdUcyA9IHNob3J0SGlzdC5maXJzdDsKLSAgICAgICAgICAgIC8vIFdoZW4gbWVtb3J5IGlzIGZ1bGwsIGRlbGV0ZSBvbGRlc3QgaGlzdG9ncmFtCi0gICAgICAgICAgICAvLyBUT0RPIHVzZSBhIGNpcmN1bGFyIGJ1ZmZlcgotICAgICAgICAgICAgaWYgKG1Mb25nVGVybUhpc3RzLnNpemUoKSA+PSBrTG9uZ1Rlcm1IaXN0c0NhcGFjaXR5KSB7Ci0gICAgICAgICAgICAgICAgbUxvbmdUZXJtSGlzdHMucG9wX2Zyb250KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBhZGQgY3VycmVudCBoaXN0b2dyYW0gdG8gYnVja2V0cwotICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmNvdW50UGFpciA6IHNob3J0SGlzdC5zZWNvbmQpIHsKLSAgICAgICAgICAgIGJ1Y2tldHNbY291bnRQYWlyLmZpcnN0XSArPSBjb3VudFBhaXIuc2Vjb25kOwotICAgICAgICB9Ci0gICAgfQotICAgIG1SZWNlbnRIaXN0cy5jbGVhcigpOwotICAgIC8vIFRPRE86IGRlY2lkZSB3aGVuL3doZXJlIHRvIGNhbGwgd3JpdGVUb0ZpbGUKLSAgICAvLyBUT0RPOiBhZGQgYSB0aHJlYWQtc3BlY2lmaWMgZXh0ZW5zaW9uIHRvIHRoZSBmaWxlIG5hbWUKLSAgICBzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga05hbWUgPSAoY29uc3QgY2hhciAqKSAiL2RhdGEvbWlzYy9hdWRpb3NlcnZlci9zYW1wbGVfcmVzdWx0cy50eHQiOwotICAgIHdyaXRlVG9GaWxlKG1PdXRsaWVyRGF0YSwgbUxvbmdUZXJtSGlzdHMsIGtOYW1lLCBmYWxzZSk7Ci19Ci0KLS8vIEdpdmVuIGEgc2VyaWVzIG9mIG91dGxpZXIgaW50ZXJ2YWxzIChtT3V0bGllciBkYXRhKSwKLS8vIGxvb2tzIGZvciBjaGFuZ2VzIGluIGRpc3RyaWJ1dGlvbiAocGVha3MpLCB3aGljaCBjYW4gYmUgZWl0aGVyIHBvc2l0aXZlIG9yIG5lZ2F0aXZlLgotLy8gVGhlIGZ1bmN0aW9uIHNldHMgdGhlIG1lYW4gdG8gdGhlIHN0YXJ0aW5nIHZhbHVlIGFuZCBzaWdtYSB0byAwLCBhbmQgdXBkYXRlcwotLy8gdGhlbSBhcyBsb25nIGFzIG5vIHBlYWsgaXMgZGV0ZWN0ZWQuIFdoZW4gYSB2YWx1ZSBpcyBtb3JlIHRoYW4gJ3RocmVzaG9sZCcKLS8vIHN0YW5kYXJkIGRldmlhdGlvbnMgZnJvbSB0aGUgbWVhbiwgYSBwZWFrIGlzIGRldGVjdGVkIGFuZCB0aGUgbWVhbiBhbmQgc2lnbWEKLS8vIGFyZSBzZXQgdG8gdGhlIHBlYWsgdmFsdWUgYW5kIDAuCi12b2lkIFBlcmZvcm1hbmNlQW5hbHlzaXM6OmRldGVjdFBlYWtzKCkgewotICAgIGlmIChtT3V0bGllckRhdGEuZW1wdHkoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gY29tcHV0ZSBtZWFuIG9mIHRoZSBkaXN0cmlidXRpb24uIFVzZWQgdG8gY2hlY2sgd2hldGhlciBhIHZhbHVlIGlzIGxhcmdlCi0gICAgY29uc3QgZG91YmxlIGtUeXBpY2FsRGlmZiA9IHN0ZDo6YWNjdW11bGF0ZSgKLSAgICAgICAgbU91dGxpZXJEYXRhLmJlZ2luKCksIG1PdXRsaWVyRGF0YS5lbmQoKSwgMCwKLSAgICAgICAgW10oYXV0byAmYSwgYXV0byAmYil7cmV0dXJuIGEgKyBiLmZpcnN0O30pIC8gbU91dGxpZXJEYXRhLnNpemUoKTsKLSAgICAvLyBBTE9HRCgidHlwaWNhbERpZmYgJWYiLCBrVHlwaWNhbERpZmYpOwotCi0gICAgLy8gaXRlcmF0b3IgYXQgdGhlIGJlZ2lubmluZyBvZiBhIHNlcXVlbmNlLCBvciB1cGRhdGVkIHRvIHRoZSBtb3N0IHJlY2VudCBwZWFrCi0gICAgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8dWludDY0X3QsIHVpbnQ2NF90Pj46Oml0ZXJhdG9yIHN0YXJ0ID0gbU91dGxpZXJEYXRhLmJlZ2luKCk7Ci0gICAgLy8gdGhlIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBhcmUgdXBkYXRlZCBldmVyeSB0aW1lIGEgcGVhayBpcyBkZXRlY3RlZAotICAgIC8vIGluaXRpYWxpemUgZmlyc3QgdGltZS4gVGhlIG1lYW4gZnJvbSB0aGUgcHJldmlvdXMgc2VxdWVuY2UgaXMgc3RvcmVkCi0gICAgLy8gZm9yIHRoZSBuZXh0IHNlcXVlbmNlLiBIZXJlLCB0aGV5IGFyZSBpbml0aWFsaXplZCBmb3IgdGhlIGZpcnN0IHRpbWUuCi0gICAgaWYgKG1QZWFrRGV0ZWN0b3JNZWFuIDwgMCkgewotICAgICAgICBtUGVha0RldGVjdG9yTWVhbiA9IHN0YXRpY19jYXN0PGRvdWJsZT4oc3RhcnQtPmZpcnN0KTsKLSAgICAgICAgbVBlYWtEZXRlY3RvclNkID0gMDsKLSAgICB9Ci0gICAgYXV0byBzcXIgPSBbXShhdXRvIHgpeyByZXR1cm4geCAqIHg7IH07Ci0gICAgZm9yIChhdXRvIGl0ID0gbU91dGxpZXJEYXRhLmJlZ2luKCk7IGl0ICE9IG1PdXRsaWVyRGF0YS5lbmQoKTsgKytpdCkgewotICAgICAgICAvLyBubyBzdXJwcmlzZSBvY2N1cnJlZDoKLSAgICAgICAgLy8gdGhlIG5ldyBlbGVtZW50IGlzIGEgc21hbGwgbnVtYmVyIG9mIHN0YW5kYXJkIGRldmlhdGlvbnMgZnJvbSB0aGUgbWVhbgotICAgICAgICBpZiAoKGZhYnMoaXQtPmZpcnN0IC0gbVBlYWtEZXRlY3Rvck1lYW4pIDwga1N0ZGRldlRocmVzaG9sZCAqIG1QZWFrRGV0ZWN0b3JTZCkgfHwKLSAgICAgICAgICAgICAvLyBvcjogcmlnaHQgYWZ0ZXIgcGVhayBoYXMgYmVlbiBkZXRlY3RlZCwgdGhlIGRlbHRhIGlzIHNtYWxsZXIgdGhhbiBhdmVyYWdlCi0gICAgICAgICAgICAobVBlYWtEZXRlY3RvclNkID09IDAgJiYgZmFicyhpdC0+Zmlyc3QgLSBtUGVha0RldGVjdG9yTWVhbikgPCBrVHlwaWNhbERpZmYpKSB7Ci0gICAgICAgICAgICAvLyB1cGRhdGUgdGhlIG1lYW4gYW5kIHNkOgotICAgICAgICAgICAgLy8gY291bnQgbnVtYmVyIG9mIGVsZW1lbnRzIChkaXN0YW5jZSBiZXR3ZWVuIHN0YXJ0IGludGVyYXRvciBhbmQgY3VycmVudCkKLSAgICAgICAgICAgIGNvbnN0IGludCBrTiA9IHN0ZDo6ZGlzdGFuY2Uoc3RhcnQsIGl0KSArIDE7Ci0gICAgICAgICAgICAvLyB1c3VhbCBmb3JtdWxhcyBmb3IgbWVhbiBhbmQgc2QKLSAgICAgICAgICAgIG1QZWFrRGV0ZWN0b3JNZWFuID0gc3RkOjphY2N1bXVsYXRlKHN0YXJ0LCBpdCArIDEsIDAuMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10oYXV0byAmYSwgYXV0byAmYil7cmV0dXJuIGEgKyBiLmZpcnN0O30pIC8ga047Ci0gICAgICAgICAgICBtUGVha0RldGVjdG9yU2QgPSBzcXJ0KHN0ZDo6YWNjdW11bGF0ZShzdGFydCwgaXQgKyAxLCAwLjAsCi0gICAgICAgICAgICAgICAgICAgICAgWz1dKGF1dG8gJmEsIGF1dG8gJmIpeyByZXR1cm4gYSArIHNxcihiLmZpcnN0IC0gbVBlYWtEZXRlY3Rvck1lYW4pO30pKSAvCi0gICAgICAgICAgICAgICAgICAgICAgKChrTiA+IDEpPyBrTiAtIDEgOiBrTik7IC8vIGtOIC0gMTogbWVhbiBpcyBjb3JyZWxhdGVkIHdpdGggdmFyaWFuY2UKLSAgICAgICAgfQotICAgICAgICAvLyBzdXJwcmlzaW5nIHZhbHVlOiBzdG9yZSBwZWFrIHRpbWVzdGFtcCBhbmQgcmVzZXQgbWVhbiwgc2QsIGFuZCBzdGFydCBpdGVyYXRvcgotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIG1QZWFrVGltZXN0YW1wcy5lbXBsYWNlX2JhY2soaXQtPnNlY29uZCk7Ci0gICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgcG9wX2Zyb250IG9uY2UgYSBjaXJjdWxhciBidWZmZXIgaXMgaW4gcGxhY2UKLSAgICAgICAgICAgIGlmIChtUGVha1RpbWVzdGFtcHMuc2l6ZSgpID49IGtQZWFrU2VyaWVzU2l6ZSkgewotICAgICAgICAgICAgICAgIG1QZWFrVGltZXN0YW1wcy5wb3BfZnJvbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1QZWFrRGV0ZWN0b3JNZWFuID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihpdC0+Zmlyc3QpOwotICAgICAgICAgICAgbVBlYWtEZXRlY3RvclNkID0gMDsKLSAgICAgICAgICAgIHN0YXJ0ID0gaXQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuOwotfQotCi0vLyBDYWxsZWQgYnkgTG9nVHNFbnRyeS4gVGhlIGlucHV0IGlzIGEgdmVjdG9yIG9mIHRpbWVzdGFtcHMuCi0vLyBGaW5kcyBvdXRsaWVycyBhbmQgd3JpdGVzIHRvIG1PdXRsaWVyZGF0YS4KLS8vIEVhY2ggdmFsdWUgaW4gbU91dGxpZXJkYXRhIGNvbnNpc3RzIG9mOiA8b3V0bGllciB0aW1lc3RhbXAsIHRpbWUgZWxhcHNlZCBzaW5jZSBwcmV2aW91cyBvdXRsaWVyPi4KLS8vIGUuZy4gdGltZXN0YW1wcyAobXMpIDEsIDQsIDUsIDE2LCAxOCwgMjggd2lsbCBwcm9kdWNlIHBhaXJzICg0LCA1KSwgKDEzLCAxOCkuCi0vLyBUaGlzIGZ1bmN0aW9uIGlzIGFwcGxpZWQgdG8gdGhlIHRpbWUgc2VyaWVzIGJlZm9yZSBpdCBpcyBjb252ZXJ0ZWQgaW50byBhIGhpc3RvZ3JhbS4KLXZvaWQgUGVyZm9ybWFuY2VBbmFseXNpczo6c3RvcmVPdXRsaWVyRGF0YShjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiAmdGltZXN0YW1wcykgewotICAgIGlmICh0aW1lc3RhbXBzLnNpemUoKSA8IDEpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvLyBmaXJzdCBwYXNzOiBuZWVkIHRvIGluaXRpYWxpemUKLSAgICBpZiAobUVsYXBzZWQgPT0gMCkgewotICAgICAgICBtUHJldk5zID0gdGltZXN0YW1wc1swXTsKLSAgICB9Ci0gICAgZm9yIChjb25zdCBhdXRvICZ0czogdGltZXN0YW1wcykgewotICAgICAgICBjb25zdCB1aW50NjRfdCBkaWZmTXMgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oZGVsdGFNcyhtUHJldk5zLCB0cykpOwotICAgICAgICBpZiAoZGlmZk1zID49IHN0YXRpY19jYXN0PHVpbnQ2NF90PihrT3V0bGllck1zKSkgewotICAgICAgICAgICAgbU91dGxpZXJEYXRhLmVtcGxhY2VfYmFjayhtRWxhcHNlZCwgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KG1QcmV2TnMpKTsKLSAgICAgICAgICAgIC8vIFJlbW92ZSBvbGRlc3QgdmFsdWUgaWYgdGhlIHZlY3RvciBpcyBmdWxsCi0gICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgcG9wX2Zyb250IG9uY2UgY2lyY3VsYXIgYnVmZmVyIGlzIGluIHBsYWNlCi0gICAgICAgICAgICAvLyBGSVhNRTogbWFrZSBzdXJlIGtTaG9ydEhpc3RTaXplIGlzIGxhcmdlIGVub3VnaCB0aGF0IHRoYXQgZGF0YSB3aWxsIG5ldmVyIGJlIGxvc3QKLSAgICAgICAgICAgIC8vIGJlZm9yZSBiZWluZyB3cml0dGVuIHRvIGZpbGUgb3IgdG8gYSBGSUZPCi0gICAgICAgICAgICBpZiAobU91dGxpZXJEYXRhLnNpemUoKSA+PSBrT3V0bGllclNlcmllc1NpemUpIHsKLSAgICAgICAgICAgICAgICBtT3V0bGllckRhdGEucG9wX2Zyb250KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRWxhcHNlZCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgbUVsYXBzZWQgKz0gZGlmZk1zOwotICAgICAgICBtUHJldk5zID0gdHM7Ci0gICAgfQotfQotCi0KLS8vIEZJWE1FOiBkZWxldGUgdGhpcyB0ZW1wb3JhcnkgdGVzdCBjb2RlLCByZWN5Y2xlZCBmb3IgdmFyaW91cyBuZXcgZnVuY3Rpb25zCi12b2lkIFBlcmZvcm1hbmNlQW5hbHlzaXM6OnRlc3RGdW5jdGlvbigpIHsKLSAgICAvLyBwcm9kdWNlcyB2YWx1ZXMgKDQ6IDUwMDAwMDApLCAoMTM6IDE4MDAwMDAwKQotICAgIC8vIG5zIHRpbWVzdGFtcHMgb2YgYnVmZmVyIHBlcmlvZHMKLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PmtUZW1wVGVzdERhdGEgPSB7MTAwMDAwMCwgNDAwMDAwMCwgNTAwMDAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYwMDAwMDAsIDE4MDAwMDAwLCAyODAwMDAwMH07Ci0gICAgUGVyZm9ybWFuY2VBbmFseXNpczo6c3RvcmVPdXRsaWVyRGF0YShrVGVtcFRlc3REYXRhKTsKLSAgICBmb3IgKGNvbnN0IGF1dG8gJm91dGxpZXI6IG1PdXRsaWVyRGF0YSkgewotICAgICAgICBBTE9HRSgiUGVyZm9ybWFuY2VBbmFseXNpcyB0ZXN0ICVsbGQ6ICVsbGQiLAotICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KG91dGxpZXIuZmlyc3QpLCBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KG91dGxpZXIuc2Vjb25kKSk7Ci0gICAgfQotICAgIGRldGVjdFBlYWtzKCk7Ci19Ci0KLS8vIFRPRE8gTWFrZSBpdCByZXR1cm4gYSBzdGQ6OnN0cmluZyBpbnN0ZWFkIG9mIG1vZGlmeWluZyBib2R5IC0tPiBpcyB0aGlzIHN0aWxsIHJlbGV2YW50PwotLy8gVE9ETyBjb25zaWRlciBjaGFuZ2luZyBhbGwgaW50cyB0byB1aW50MzJfdCBvciB1aW50NjRfdAotLy8gVE9ETzogbW92ZSB0aGlzIHRvIFJlcG9ydFBlcmZvcm1hbmNlLCBwcm9iYWJseSBtYWtlIGl0IGEgZnJpZW5kIGZ1bmN0aW9uIG9mIFBlcmZvcm1hbmNlQW5hbHlzaXMKLXZvaWQgUGVyZm9ybWFuY2VBbmFseXNpczo6cmVwb3J0UGVyZm9ybWFuY2UoU3RyaW5nOCAqYm9keSwgaW50IG1heEhlaWdodCkgewotICAgIGlmIChtUmVjZW50SGlzdHMuc2l6ZSgpIDwgMSkgewotICAgICAgICBBTE9HRCgicmVwb3J0UGVyZm9ybWFuY2U6IG1SZWNlbnRIaXN0cyBpcyBlbXB0eSIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEFMT0dEKCJyZXBvcnRQZXJmb3JtYW5jZTogaGlzdHMgc2l6ZSAlZCIsIHN0YXRpY19jYXN0PGludD4obVJlY2VudEhpc3RzLnNpemUoKSkpOwotICAgIC8vIFRPRE86IG1vcmUgZWxhYm9yYXRlIGRhdGEgYW5hbHlzaXMKLSAgICBzdGQ6Om1hcDxpbnQsIGludD4gYnVja2V0czsKLSAgICBmb3IgKGNvbnN0IGF1dG8gJnNob3J0SGlzdDogbVJlY2VudEhpc3RzKSB7Ci0gICAgICAgIGZvciAoY29uc3QgYXV0byAmY291bnRQYWlyIDogc2hvcnRIaXN0LnNlY29uZCkgewotICAgICAgICAgICAgYnVja2V0c1tjb3VudFBhaXIuZmlyc3RdICs9IGNvdW50UGFpci5zZWNvbmQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyB1bmRlcnNjb3JlcyBhbmQgc3BhY2VzIGxlbmd0aCBjb3JyZXNwb25kcyB0byBtYXhpbXVtIHdpZHRoIG9mIGhpc3RvZ3JhbQotICAgIHN0YXRpYyBjb25zdCBpbnQga0xlbiA9IDQwOwotICAgIHN0ZDo6c3RyaW5nIHVuZGVyc2NvcmVzKGtMZW4sICdfJyk7Ci0gICAgc3RkOjpzdHJpbmcgc3BhY2VzKGtMZW4sICcgJyk7Ci0KLSAgICBhdXRvIGl0ID0gYnVja2V0cy5iZWdpbigpOwotICAgIGludCBtYXhEZWx0YSA9IGl0LT5maXJzdDsKLSAgICBpbnQgbWF4Q291bnQgPSBpdC0+c2Vjb25kOwotICAgIC8vIENvbXB1dGUgbWF4aW11bSB2YWx1ZXMKLSAgICB3aGlsZSAoKytpdCAhPSBidWNrZXRzLmVuZCgpKSB7Ci0gICAgICAgIGlmIChpdC0+Zmlyc3QgPiBtYXhEZWx0YSkgewotICAgICAgICAgICAgbWF4RGVsdGEgPSBpdC0+Zmlyc3Q7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGl0LT5zZWNvbmQgPiBtYXhDb3VudCkgewotICAgICAgICAgICAgbWF4Q291bnQgPSBpdC0+c2Vjb25kOwotICAgICAgICB9Ci0gICAgfQotICAgIGludCBoZWlnaHQgPSBsb2cyKG1heENvdW50KSArIDE7IC8vIG1heENvdW50ID4gMCwgc2FmZSB0byBjYWxsIGxvZzIKLSAgICBjb25zdCBpbnQgbGVmdFBhZGRpbmcgPSB3aWR0aE9mKDEgPDwgaGVpZ2h0KTsKLSAgICBjb25zdCBpbnQgY29sV2lkdGggPSBzdGQ6Om1heChzdGQ6Om1heCh3aWR0aE9mKG1heERlbHRhKSArIDEsIDMpLCBsZWZ0UGFkZGluZyArIDIpOwotICAgIGludCBzY2FsaW5nRmFjdG9yID0gMTsKLSAgICAvLyBzY2FsZSBkYXRhIGlmIGl0IGV4Y2VlZHMgbWF4aW11bSBoZWlnaHQKLSAgICBpZiAoaGVpZ2h0ID4gbWF4SGVpZ2h0KSB7Ci0gICAgICAgIHNjYWxpbmdGYWN0b3IgPSAoaGVpZ2h0ICsgbWF4SGVpZ2h0KSAvIG1heEhlaWdodDsKLSAgICAgICAgaGVpZ2h0IC89IHNjYWxpbmdGYWN0b3I7Ci0gICAgfQotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lKnMiLCBsZWZ0UGFkZGluZyArIDExLCAiT2NjdXJyZW5jZXMiKTsKLSAgICAvLyB3cml0ZSBoaXN0b2dyYW0gbGFiZWwgbGluZSB3aXRoIGJ1Y2tldCB2YWx1ZXMKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxuJXMiLCAiICIpOwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJSpzIiwgbGVmdFBhZGRpbmcsICIgIik7Ci0gICAgZm9yIChhdXRvIGNvbnN0ICZ4IDogYnVja2V0cykgewotICAgICAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqZCIsIGNvbFdpZHRoLCB4LnNlY29uZCk7Ci0gICAgfQotICAgIC8vIHdyaXRlIGhpc3RvZ3JhbSBhc2NpaSBhcnQKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxuJXMiLCAiICIpOwotICAgIGZvciAoaW50IHJvdyA9IGhlaWdodCAqIHNjYWxpbmdGYWN0b3I7IHJvdyA+PSAwOyByb3cgLT0gc2NhbGluZ0ZhY3RvcikgewotICAgICAgICBjb25zdCBpbnQgdmFsdWUgPSAxIDw8IHJvdzsKLSAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlLipzIiwgbGVmdFBhZGRpbmcsIHNwYWNlcy5jX3N0cigpKTsKLSAgICAgICAgZm9yIChhdXRvIGNvbnN0ICZ4IDogYnVja2V0cykgewotICAgICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyVzIiwgY29sV2lkdGggLSAxLCBzcGFjZXMuY19zdHIoKSwgeC5zZWNvbmQgPCB2YWx1ZSA/ICIgIiA6ICJ8Iik7Ci0gICAgICAgIH0KLSAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiVzIiwgIiAiKTsKLSAgICB9Ci0gICAgLy8gcHJpbnQgeC1heGlzCi0gICAgY29uc3QgaW50IGNvbHVtbnMgPSBzdGF0aWNfY2FzdDxpbnQ+KGJ1Y2tldHMuc2l6ZSgpKTsKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqYyIsIGxlZnRQYWRkaW5nLCAnICcpOwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyIsIChjb2x1bW5zICsgMSkgKiBjb2xXaWR0aCwgdW5kZXJzY29yZXMuY19zdHIoKSk7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiVzIiwgIiAiKTsKLQotICAgIC8vIHdyaXRlIGZvb3RlciB3aXRoIGJ1Y2tldCBsYWJlbHMKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqcyIsIGxlZnRQYWRkaW5nLCAiICIpOwotICAgIGZvciAoYXV0byBjb25zdCAmeCA6IGJ1Y2tldHMpIHsKLSAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlKmQiLCBjb2xXaWR0aCwgeC5maXJzdCk7Ci0gICAgfQotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyVzIiwgY29sV2lkdGgsIHNwYWNlcy5jX3N0cigpLCAibXNcbiIpOwotCi0gICAgLy8gTm93IHJlcG9ydCBnbGl0Y2hlcwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG50aW1lIGVsYXBzZWQgYmV0d2VlbiBnbGl0Y2hlcyBhbmQgZ2xpdGNoIHRpbWVzdGFtcHNcbiIpOwotICAgIGZvciAoY29uc3QgYXV0byAmb3V0bGllcjogbU91dGxpZXJEYXRhKSB7Ci0gICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJWxsZDogJWxsZFxuIiwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPihvdXRsaWVyLmZpcnN0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4ob3V0bGllci5zZWNvbmQpKTsKLSAgICB9Ci0KLX0KLQotCi0vLyBQcm9kdWNlcyBhIGxvZyB3YXJuaW5nIGlmIHRoZSB0aW1pbmcgb2YgcmVjZW50IGJ1ZmZlciBwZXJpb2RzIGNhdXNlZCBhIGdsaXRjaAotLy8gQ29tcHV0ZXMgc3VtIG9mIHJ1bm5pbmcgd2luZG93IG9mIHRocmVlIGJ1ZmZlciBwZXJpb2RzCi0vLyBDaGVja3Mgd2hldGhlciB0aGUgYnVmZmVyIHBlcmlvZHMgbGVhdmUgZW5vdWdoIENQVSB0aW1lIGZvciB0aGUgbmV4dCBvbmUKLS8vIGUuZy4gaWYgYSBidWZmZXIgcGVyaW9kIGlzIGV4cGVjdGVkIHRvIGJlIDQgbXMgYW5kIGEgYnVmZmVyIHJlcXVpcmVzIDMgbXMgb2YgQ1BVIHRpbWUsCi0vLyBoZXJlIGFyZSBzb21lIGdsaXRjaCBjYXNlczoKLS8vIDQgKyA0ICsgNiA7IDUgKyA0ICsgNTsgMiArIDIgKyAxMAotLy8gVE9ETzogZGV2ZWxvcCB0aGlzIGNvZGUgdG8gdHJhY2sgY2hhbmdlcyBpbiBoaXN0b2dyYW0gZGlzdHJpYnV0aW9uIGluIGFkZGl0aW9uCi0vLyB0byAvIGluc3RlYWQgb2YgZ2xpdGNoZXMuCi12b2lkIFBlcmZvcm1hbmNlQW5hbHlzaXM6OmFsZXJ0SWZHbGl0Y2goY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4gJnNhbXBsZXMpIHsKLSAgICBzdGQ6OmRlcXVlPGludD4gcGVyaW9kcyhrTnVtQnVmZiwga1BlcmlvZE1zKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMjsgaSA8IHNhbXBsZXMuc2l6ZSgpOyArK2kpIHsgLy8gc2tpcCBmaXJzdCB0aW1lIGVudHJ5Ci0gICAgICAgIHBlcmlvZHMucHVzaF9mcm9udChkZWx0YU1zKHNhbXBsZXNbaSAtIDFdLCBzYW1wbGVzW2ldKSk7Ci0gICAgICAgIHBlcmlvZHMucG9wX2JhY2soKTsKLSAgICAgICAgLy8gVE9ETzogY2hlY2sgdGhhdCBhbGwgZ2xpdGNoIGNhc2VzIGFyZSBjb3ZlcmVkCi0gICAgICAgIGlmIChzdGQ6OmFjY3VtdWxhdGUocGVyaW9kcy5iZWdpbigpLCBwZXJpb2RzLmVuZCgpLCAwKSA+IGtOdW1CdWZmICoga1BlcmlvZE1zICsKLSAgICAgICAgICAgIGtQZXJpb2RNcyAtIGtQZXJpb2RNc0NQVSkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJBIGdsaXRjaCBvY2N1cnJlZCIpOwotICAgICAgICAgICAgICAgIHBlcmlvZHMuYXNzaWduKGtOdW1CdWZmLCBrUGVyaW9kTXMpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybjsKLX0KLQotfSAvLyBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UKLQotfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9QaXBlUmVhZGVyLmNwcCBiL21lZGlhL2xpYm5iYWlvL1BpcGVSZWFkZXIuY3BwCmluZGV4IDI0ODZiNzYuLjM1YTQzZDggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL1BpcGVSZWFkZXIuY3BwCisrKyBiL21lZGlhL2xpYm5iYWlvL1BpcGVSZWFkZXIuY3BwCkBAIC0yNiw3ICsyNiw3IEBACiAKIFBpcGVSZWFkZXI6OlBpcGVSZWFkZXIoUGlwZSYgcGlwZSkgOgogICAgICAgICBOQkFJT19Tb3VyY2UocGlwZS5tRm9ybWF0KSwKLSAgICAgICAgbVBpcGUocGlwZSksIG1GaWZvUmVhZGVyKG1QaXBlLm1GaWZvLCBmYWxzZSAvKnRocm90dGxlc1dyaXRlciovLCB0cnVlIC8qZmx1c2gqLyksCisgICAgICAgIG1QaXBlKHBpcGUpLCBtRmlmb1JlYWRlcihtUGlwZS5tRmlmbywgZmFsc2UgLyp0aHJvdHRsZXNXcml0ZXIqLywgZmFsc2UgLypmbHVzaCovKSwKICAgICAgICAgbUZyYW1lc092ZXJydW4oMCksCiAgICAgICAgIG1PdmVycnVucygwKQogewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vUmVwb3J0UGVyZm9ybWFuY2UuY3BwIGIvbWVkaWEvbGlibmJhaW8vUmVwb3J0UGVyZm9ybWFuY2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzUwYWRhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm5iYWlvL1JlcG9ydFBlcmZvcm1hbmNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIlJlcG9ydFBlcmZvcm1hbmNlIgotCi0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxxdWV1ZT4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0jaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJMb2cuaD4KLSNpbmNsdWRlIDxtZWRpYS9uYmFpby9QZXJmb3JtYW5jZUFuYWx5c2lzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvbmJhaW8vUmVwb3J0UGVyZm9ybWFuY2UuaD4KLS8vICNpbmNsdWRlIDx1dGlscy9DYWxsU3RhY2suaD4gLy8gdXNlZCB0byBwcmludCBjYWxsc3RhY2sKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlIHsKLQotLy8gV3JpdGVzIG91dGxpZXIgaW50ZXJ2YWxzLCB0aW1lc3RhbXBzLCBhbmQgaGlzdG9ncmFtcyBzcGFubmluZyBsb25nIHRpbWUgaW50ZXJ2YWxzIHRvIGEgZmlsZS4KLS8vIFRPRE86IGZvcm1hdCB0aGUgZGF0YSBlZmZpY2llbnRseSBhbmQgd3JpdGUgZGlmZmVyZW50IHR5cGVzIG9mIGRhdGEgdG8gZGlmZmVyZW50IGZpbGVzCi12b2lkIHdyaXRlVG9GaWxlKHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPG91dGxpZXJJbnRlcnZhbCwgdGltZXN0YW1wPj4gJm91dGxpZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8dGltZXN0YW1wLCBIaXN0b2dyYW0+PiAmaGlzdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoga05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFwcGVuZCkgewotICAgIEFMT0dEKCJ3cml0aW5nIHBlcmZvcm1hbmNlIGRhdGEgdG8gZmlsZSIpOwotICAgIGlmIChvdXRsaWVyRGF0YS5lbXB0eSgpIHx8IGhpc3RzLmVtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN0ZDo6b2ZzdHJlYW0gb2ZzOwotICAgIG9mcy5vcGVuKGtOYW1lLCBhcHBlbmQgPyBzdGQ6Omlvczo6YXBwIDogc3RkOjppb3M6OnRydW5jKTsKLSAgICBpZiAoIW9mcy5pc19vcGVuKCkpIHsKLSAgICAgICAgQUxPR1coImNvdWxkbid0IG9wZW4gZmlsZSAlcyIsIGtOYW1lKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBvZnMgPDwgIk91dGxpZXIgZGF0YTogaW50ZXJ2YWwgYW5kIHRpbWVzdGFtcFxuIjsKLSAgICBmb3IgKGNvbnN0IGF1dG8gJm91dGxpZXIgOiBvdXRsaWVyRGF0YSkgewotICAgICAgICBvZnMgPDwgb3V0bGllci5maXJzdCA8PCAiOiAiIDw8IG91dGxpZXIuc2Vjb25kIDw8ICJcbiI7Ci0gICAgfQotICAgIG9mcyA8PCAiSGlzdG9ncmFtIGRhdGFcbiI7Ci0gICAgZm9yIChjb25zdCBhdXRvICZoaXN0IDogaGlzdHMpIHsKLSAgICAgICAgb2ZzIDw8ICJcdHRpbWVzdGFtcFxuIjsKLSAgICAgICAgb2ZzIDw8IGhpc3QuZmlyc3QgPDwgIlxuIjsKLSAgICAgICAgb2ZzIDw8ICJcdGJ1Y2tldHMgYW5kIGNvdW50c1xuIjsKLSAgICAgICAgZm9yIChjb25zdCBhdXRvICZidWNrZXQgOiBoaXN0LnNlY29uZCkgewotICAgICAgICAgICAgb2ZzIDw8IGJ1Y2tldC5maXJzdCA8PCAiOiAiIDw8IGJ1Y2tldC5zZWNvbmQgPDwgIlxuIjsKLSAgICAgICAgfQotICAgIH0KLSAgICBvZnMuY2xvc2UoKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UKLQotfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL05CTG9nLmggYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL05CTG9nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNDhlZTEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9OQkxvZy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTk1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBOb24tYmxvY2tpbmcgZXZlbnQgbG9nZ2VyIGludGVuZGVkIGZvciBzYWZlIGNvbW11bmljYXRpb24gYmV0d2VlbiBwcm9jZXNzZXMgdmlhIHNoYXJlZCBtZW1vcnkKLQotI2lmbmRlZiBBTkRST0lEX01FRElBX05CTE9HX0gKLSNkZWZpbmUgQU5EUk9JRF9NRURJQV9OQkxPR19ICi0KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2ZpZm8uaD4KLSNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxkZXF1ZT4KLSNpbmNsdWRlIDxzZXQ+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIFN0cmluZzg7Ci0KLWNsYXNzIE5CTG9nIHsKLQotcHVibGljOgotCi10eXBlZGVmIHVpbnQ2NF90IGxvZ19oYXNoX3Q7Ci0KLS8vIEZJWE1FIEV2ZXJ5dGhpbmcgbmVlZGVkIGZvciBjbGllbnQgKHdyaXRlciBBUEkgYW5kIHJlZ2lzdHJhdGlvbikgc2hvdWxkIGJlIGlzb2xhdGVkCi0vLyAgICAgICBmcm9tIHRoZSByZXN0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbi4KLWNsYXNzIFdyaXRlcjsKLWNsYXNzIFJlYWRlcjsKLQotZW51bSBFdmVudCA6IHVpbnQ4X3QgewotICAgIEVWRU5UX1JFU0VSVkVELAotICAgIEVWRU5UX1NUUklORywgICAgICAgICAgICAgICAvLyBBU0NJSSBzdHJpbmcsIG5vdCBOVUwtdGVybWluYXRlZAotICAgIC8vIFRPRE86IG1ha2UgdGltZXN0YW1wIG9wdGlvbmFsCi0gICAgRVZFTlRfVElNRVNUQU1QLCAgICAgICAgICAgIC8vIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDKQotICAgIEVWRU5UX0lOVEVHRVIsICAgICAgICAgICAgICAvLyBpbnRlZ2VyIHZhbHVlIGVudHJ5Ci0gICAgRVZFTlRfRkxPQVQsICAgICAgICAgICAgICAgIC8vIGZsb2F0aW5nIHBvaW50IHZhbHVlIGVudHJ5Ci0gICAgRVZFTlRfUElELCAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgSUQgYW5kIHByb2Nlc3MgbmFtZQotICAgIEVWRU5UX0FVVEhPUiwgICAgICAgICAgICAgICAvLyBhdXRob3IgaW5kZXggKHByZXNlbnQgaW4gbWVyZ2VkIGxvZ3MpIHRyYWNrcyBlbnRyeSdzIG9yaWdpbmFsIGxvZwotICAgIEVWRU5UX1NUQVJUX0ZNVCwgICAgICAgICAgICAvLyBsb2dGb3JtYXQgc3RhcnQgZXZlbnQ6IGVudHJ5IGluY2x1ZGVzIGZvcm1hdCBzdHJpbmcsIGZvbGxvd2luZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbnRyaWVzIGNvbnRhaW4gZm9ybWF0IGFyZ3VtZW50cwotICAgIEVWRU5UX0hBU0gsICAgICAgICAgICAgICAgICAvLyB1bmlxdWUgSEFTSCBvZiBsb2cgb3JpZ2luLCBvcmlnaW5hdGVzIGZyb20gaGFzaCBvZiBmaWxlIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGxpbmUgbnVtYmVyCi0gICAgRVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTLCAgIC8vIHNpbmdsZSBkYXR1bSBmb3IgdGltZXN0YW1wIGhpc3RvZ3JhbQotICAgIEVWRU5UX0FVRElPX1NUQVRFLCAgICAgICAgICAvLyBhdWRpbyBvbi9vZmYgZXZlbnQ6IGxvZ2dlZCB1cG9uIEZhc3RNaXhlcjo6b25TdGF0ZUNoYW5nZSgpIGNhbGwKLSAgICBFVkVOVF9FTkRfRk1ULCAgICAgICAgICAgICAgLy8gZW5kIG9mIGxvZ0Zvcm1hdCBhcmd1bWVudCBsaXN0Ci0KLSAgICBFVkVOVF9VUFBFUl9CT1VORCwgICAgICAgICAgLy8gdG8gY2hlY2sgZm9yIGludmFsaWQgZXZlbnRzCi19OwotCi1wcml2YXRlOgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEFQSSBmb3IgaGFuZGxpbmcgZm9ybWF0IGVudHJ5IG9wZXJhdGlvbnMKLQotLy8gYSBmb3JtYXR0ZWQgZW50cnkgaGFzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgotLy8gICAgKiBTVEFSVF9GTVQgZW50cnksIGNvbnRhaW5pbmcgdGhlIGZvcm1hdCBzdHJpbmcKLS8vICAgICogVElNRVNUQU1QIGVudHJ5Ci0vLyAgICAqIEhBU0ggZW50cnkKLS8vICAgICogYXV0aG9yIGVudHJ5IG9mIHRoZSB0aHJlYWQgdGhhdCBnZW5lcmF0ZWQgaXQgKG9wdGlvbmFsLCBwcmVzZW50IGluIG1lcmdlZCBsb2cpCi0vLyAgICAqIGZvcm1hdCBhcmcxCi0vLyAgICAqIGZvcm1hdCBhcmcyCi0vLyAgICAqIC4uLgotLy8gICAgKiBFTkRfRk1UIGVudHJ5Ci0KLS8vIGVudHJ5IHJlcHJlc2VudGF0aW9uIGluIG1lbW9yeQotc3RydWN0IGVudHJ5IHsKLSAgICBjb25zdCB1aW50OF90IHR5cGU7Ci0gICAgY29uc3QgdWludDhfdCBsZW5ndGg7Ci0gICAgY29uc3QgdWludDhfdCBkYXRhWzBdOwotfTsKLQotLy8gZW50cnkgdGFpbCByZXByZXNlbnRhdGlvbiAoYWZ0ZXIgZGF0YSkKLXN0cnVjdCBlbmRpbmcgewotICAgIHVpbnQ4X3QgbGVuZ3RoOwotICAgIHVpbnQ4X3QgbmV4dFswXTsKLX07Ci0KLS8vIGVudHJ5IGl0ZXJhdG9yCi1jbGFzcyBFbnRyeUl0ZXJhdG9yIHsKLXB1YmxpYzoKLSAgICBFbnRyeUl0ZXJhdG9yKCk7Ci0gICAgZXhwbGljaXQgRW50cnlJdGVyYXRvcihjb25zdCB1aW50OF90ICplbnRyeSk7Ci0gICAgRW50cnlJdGVyYXRvcihjb25zdCBFbnRyeUl0ZXJhdG9yICZvdGhlcik7Ci0KLSAgICAvLyBkZXJlZmVyZW5jZSB1bmRlcmx5aW5nIGVudHJ5Ci0gICAgY29uc3QgZW50cnkmICAgIG9wZXJhdG9yKigpIGNvbnN0OwotICAgIGNvbnN0IGVudHJ5KiAgICBvcGVyYXRvci0+KCkgY29uc3Q7Ci0gICAgLy8gYWR2YW5jZSB0byBuZXh0IGVudHJ5Ci0gICAgRW50cnlJdGVyYXRvciYgICAgICAgb3BlcmF0b3IrKygpOyAvLyArK2kKLSAgICAvLyBiYWNrIHRvIHByZXZpb3VzIGVudHJ5Ci0gICAgRW50cnlJdGVyYXRvciYgICAgICAgb3BlcmF0b3ItLSgpOyAvLyAtLWkKLSAgICBFbnRyeUl0ZXJhdG9yICAgICAgICBuZXh0KCkgY29uc3Q7Ci0gICAgRW50cnlJdGVyYXRvciAgICAgICAgcHJldigpIGNvbnN0OwotICAgIGJvb2wgICAgICAgICAgICBvcGVyYXRvciE9KGNvbnN0IEVudHJ5SXRlcmF0b3IgJm90aGVyKSBjb25zdDsKLSAgICBpbnQgICAgICAgICAgICAgb3BlcmF0b3ItKGNvbnN0IEVudHJ5SXRlcmF0b3IgJm90aGVyKSBjb25zdDsKLQotICAgIGJvb2wgICAgICAgICAgICBoYXNDb25zaXN0ZW50TGVuZ3RoKCkgY29uc3Q7Ci0gICAgdm9pZCAgICAgICAgICAgIGNvcHlUbyhzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QpIGNvbnN0OwotICAgIHZvaWQgICAgICAgICAgICBjb3B5RGF0YSh1aW50OF90ICpkc3QpIGNvbnN0OwotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgICBpbmxpbmUgY29uc3QgVCYgcGF5bG9hZCgpIHsKLSAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFQgKj4ocHRyICsgb2Zmc2V0b2YoZW50cnksIGRhdGEpKTsKLSAgICB9Ci0KLSAgICBpbmxpbmUgb3BlcmF0b3IgY29uc3QgdWludDhfdCooKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBwdHI7Ci0gICAgfQotCi1wcml2YXRlOgotICAgIGNvbnN0IHVpbnQ4X3QgICpwdHI7Ci19OwotCi1jbGFzcyBBYnN0cmFjdEVudHJ5IHsKLXB1YmxpYzoKLQotICAgIC8vIEVudHJ5IHN0YXJ0aW5nIGluIHRoZSBnaXZlbiBwb2ludGVyCi0gICAgZXhwbGljaXQgQWJzdHJhY3RFbnRyeShjb25zdCB1aW50OF90ICplbnRyeSk7Ci0gICAgdmlydHVhbCB+QWJzdHJhY3RFbnRyeSgpIHt9Ci0KLSAgICAvLyBidWlsZCBjb25jcmV0ZSBlbnRyeSBvZiBhcHByb3ByaWF0ZSBjbGFzcyBmcm9tIHBvaW50ZXIKLSAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEFic3RyYWN0RW50cnk+IGJ1aWxkRW50cnkoY29uc3QgdWludDhfdCAqcHRyKTsKLQotICAgIC8vIGdldCBmb3JtYXQgZW50cnkgdGltZXN0YW1wCi0gICAgLy8gVE9ETyBjb25zaWRlciBjaGFuZ2luZyB0byB1aW50NjRfdAotICAgIHZpcnR1YWwgaW50NjRfdCAgICAgIHRpbWVzdGFtcCgpIGNvbnN0ID0gMDsKLQotICAgIC8vIGdldCBmb3JtYXQgZW50cnkncyB1bmlxdWUgaWQKLSAgICB2aXJ0dWFsIGxvZ19oYXNoX3QgICBoYXNoKCkgY29uc3QgPSAwOwotCi0gICAgLy8gZW50cnkncyBhdXRob3IgaW5kZXggKC0xIGlmIG5vbmUgcHJlc2VudCkKLSAgICAvLyBhIE1lcmdlciBoYXMgYSB2ZWN0b3Igb2YgUmVhZGVycywgYXV0aG9yIHNpbXBseSBwb2ludHMgdG8gdGhlIGluZGV4IG9mIHRoZQotICAgIC8vIFJlYWRlciB0aGF0IG9yaWdpbmF0ZWQgdGhlIGVudHJ5Ci0gICAgLy8gVE9ETyBjb25zaWRlciBjaGFuZ2luZyB0byB1aW50MzJfdAotICAgIHZpcnR1YWwgaW50ICAgICAgICAgIGF1dGhvcigpIGNvbnN0ID0gMDsKLQotICAgIC8vIGNvcHkgZW50cnksIGFkZGluZyBhdXRob3IgYmVmb3JlIHRpbWVzdGFtcCwgcmV0dXJucyBpdGVyYXRvciB0byBlbmQgb2YgZW50cnkKLSAgICB2aXJ0dWFsIEVudHJ5SXRlcmF0b3IgICAgY29weVdpdGhBdXRob3Ioc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1dGhvcikgY29uc3QgPSAwOwotCi1wcm90ZWN0ZWQ6Ci0gICAgLy8gY29waWVzIG9yZGluYXJ5IGVudHJ5IGZyb20gc3JjIHRvIGRzdCwgYW5kIHJldHVybnMgbGVuZ3RoIG9mIGVudHJ5Ci0gICAgLy8gc2l6ZV90ICAgICAgY29weUVudHJ5KGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyICpkc3QsIGNvbnN0IGl0ZXJhdG9yICZpdCk7Ci0gICAgY29uc3QgdWludDhfdCAgKm1FbnRyeTsKLX07Ci0KLWNsYXNzIEZvcm1hdEVudHJ5IDogcHVibGljIEFic3RyYWN0RW50cnkgewotcHVibGljOgotICAgIC8vIGV4cGxpY2l0IEZvcm1hdEVudHJ5KGNvbnN0IEVudHJ5SXRlcmF0b3IgJml0KTsKLSAgICBleHBsaWNpdCBGb3JtYXRFbnRyeShjb25zdCB1aW50OF90ICpwdHIpIDogQWJzdHJhY3RFbnRyeShwdHIpIHt9Ci0gICAgdmlydHVhbCB+Rm9ybWF0RW50cnkoKSB7fQotCi0gICAgRW50cnlJdGVyYXRvciBiZWdpbigpIGNvbnN0OwotCi0gICAgLy8gRW50cnkncyBmb3JtYXQgc3RyaW5nCi0gICAgY29uc3QgICBjaGFyKiBmb3JtYXRTdHJpbmcoKSBjb25zdDsKLQotICAgIC8vIEVucnR5J3MgZm9ybWF0IHN0cmluZyBsZW5ndGgKLSAgICAgICAgICAgIHNpemVfdCAgICAgIGZvcm1hdFN0cmluZ0xlbmd0aCgpIGNvbnN0OwotCi0gICAgLy8gRm9ybWF0IGFyZ3VtZW50cyAoZXhjbHVkaW5nIGZvcm1hdCBzdHJpbmcsIHRpbWVzdGFtcCBhbmQgYXV0aG9yKQotICAgICAgICAgICAgRW50cnlJdGVyYXRvciAgICBhcmdzKCkgY29uc3Q7Ci0KLSAgICAvLyBnZXQgZm9ybWF0IGVudHJ5IHRpbWVzdGFtcAotICAgIHZpcnR1YWwgaW50NjRfdCAgICAgdGltZXN0YW1wKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICAvLyBnZXQgZm9ybWF0IGVudHJ5J3MgdW5pcXVlIGlkCi0gICAgdmlydHVhbCBsb2dfaGFzaF90ICBoYXNoKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICAvLyBlbnRyeSdzIGF1dGhvciBpbmRleCAoLTEgaWYgbm9uZSBwcmVzZW50KQotICAgIC8vIGEgTWVyZ2VyIGhhcyBhIHZlY3RvciBvZiBSZWFkZXJzLCBhdXRob3Igc2ltcGx5IHBvaW50cyB0byB0aGUgaW5kZXggb2YgdGhlCi0gICAgLy8gUmVhZGVyIHRoYXQgb3JpZ2luYXRlZCB0aGUgZW50cnkKLSAgICB2aXJ0dWFsIGludCAgICAgICAgIGF1dGhvcigpIGNvbnN0IG92ZXJyaWRlOwotCi0gICAgLy8gY29weSBlbnRyeSwgYWRkaW5nIGF1dGhvciBiZWZvcmUgdGltZXN0YW1wLCByZXR1cm5zIHNpemUgb2Ygb3JpZ2luYWwgZW50cnkKLSAgICB2aXJ0dWFsIEVudHJ5SXRlcmF0b3IgICAgY29weVdpdGhBdXRob3Ioc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1dGhvcikgY29uc3Qgb3ZlcnJpZGU7Ci0KLX07Ci0KLWNsYXNzIEhpc3RvZ3JhbUVudHJ5IDogcHVibGljIEFic3RyYWN0RW50cnkgewotcHVibGljOgotICAgIGV4cGxpY2l0IEhpc3RvZ3JhbUVudHJ5KGNvbnN0IHVpbnQ4X3QgKnB0cikgOiBBYnN0cmFjdEVudHJ5KHB0cikgewotICAgIH0KLSAgICB2aXJ0dWFsIH5IaXN0b2dyYW1FbnRyeSgpIHt9Ci0KLSAgICB2aXJ0dWFsIGludDY0X3QgICAgIHRpbWVzdGFtcCgpIGNvbnN0IG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCBsb2dfaGFzaF90ICBoYXNoKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICB2aXJ0dWFsIGludCAgICAgICAgIGF1dGhvcigpIGNvbnN0IG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCBFbnRyeUl0ZXJhdG9yICAgIGNvcHlXaXRoQXV0aG9yKHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdXRob3IpIGNvbnN0IG92ZXJyaWRlOwotCi19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gcmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgbG9nIGVudHJ5IGluIHByaXZhdGUgbWVtb3J5Ci1zdHJ1Y3QgRW50cnkgewotICAgIEVudHJ5KEV2ZW50IGV2ZW50LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoKQotICAgICAgICA6IG1FdmVudChldmVudCksIG1MZW5ndGgobGVuZ3RoKSwgbURhdGEoZGF0YSkgeyB9Ci0gICAgLyp2aXJ0dWFsKi8gfkVudHJ5KCkgeyB9Ci0KLSAgICAvLyB1c2VkIGR1cmluZyB3cml0aW5nIHRvIGZvcm1hdCBFbnRyeSBpbmZvcm1hdGlvbiBhcyBmb2xsb3dzOiBbdHlwZV1bbGVuZ3RoXVtkYXRhIC4uLiBdW2xlbmd0aF0KLSAgICBpbnQgICAgIGNvcHlFbnRyeURhdGFBdChzaXplX3Qgb2Zmc2V0KSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgV3JpdGVyOwotICAgIEV2ZW50ICAgICAgIG1FdmVudDsgICAgIC8vIGV2ZW50IHR5cGUKLSAgICB1aW50OF90ICAgICBtTGVuZ3RoOyAgICAvLyBsZW5ndGggb2YgYWRkaXRpb25hbCBkYXRhLCAwIDw9IG1MZW5ndGggPD0ga01heExlbmd0aAotICAgIGNvbnN0IHZvaWQgKm1EYXRhOyAgICAgIC8vIGV2ZW50IHR5cGUtc3BlY2lmaWMgZGF0YQotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heExlbmd0aCA9IDI1NTsKLXB1YmxpYzoKLSAgICAvLyBtRXZlbnQsIG1MZW5ndGgsIG1EYXRhWy4uLl0sIGR1cGxpY2F0ZSBtTGVuZ3RoCi0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrT3ZlcmhlYWQgPSBzaXplb2YoZW50cnkpICsgc2l6ZW9mKGVuZGluZyk7Ci0gICAgLy8gZW5kaW5kIGxlbmd0aCBvZiBwcmV2aW91cyBlbnRyeQotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1ByZXZpb3VzTGVuZ3RoT2Zmc2V0ID0gLSBzaXplb2YoZW5kaW5nKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihlbmRpbmcsIGxlbmd0aCk7Ci19OwotCi1zdHJ1Y3QgSGlzdFRzRW50cnkgewotICAgIGxvZ19oYXNoX3QgaGFzaDsKLSAgICBpbnQ2NF90IHRzOwotfTsgLy9UT0RPIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdHJ1Y3QgSGlzdFRzRW50cnlXaXRoQXV0aG9yIHsKLSAgICBsb2dfaGFzaF90IGhhc2g7Ci0gICAgaW50NjRfdCB0czsKLSAgICBpbnQgYXV0aG9yOwotfTsgLy9UT0RPIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi11c2luZyBTdGF0ZVRzRW50cnlXaXRoQXV0aG9yID0gSGlzdFRzRW50cnlXaXRoQXV0aG9yOwotCi1zdHJ1Y3QgSGlzdEludEVudHJ5IHsKLSAgICBsb2dfaGFzaF90IGhhc2g7Ci0gICAgaW50IHZhbHVlOwotfTsgLy9UT0RPIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0vLyByZXByZXNlbnRhdGlvbiBvZiBhIHNpbmdsZSBsb2cgZW50cnkgaW4gc2hhcmVkIG1lbW9yeQotLy8gIGJ5dGVbMF0gICAgICAgICAgICAgbUV2ZW50Ci0vLyAgYnl0ZVsxXSAgICAgICAgICAgICBtTGVuZ3RoCi0vLyAgYnl0ZVsyXSAgICAgICAgICAgICBtRGF0YVswXQotLy8gIC4uLgotLy8gIGJ5dGVbMitpXSAgICAgICAgICAgbURhdGFbaV0KLS8vICAuLi4KLS8vICBieXRlWzIrbUxlbmd0aC0xXSAgIG1EYXRhW21MZW5ndGgtMV0KLS8vICBieXRlWzIrbUxlbmd0aF0gICAgIGR1cGxpY2F0ZSBjb3B5IG9mIG1MZW5ndGggdG8gcGVybWl0IHJldmVyc2Ugc2NhbgotLy8gIGJ5dGVbMyttTGVuZ3RoXSAgICAgc3RhcnQgb2YgbmV4dCBsb2cgZW50cnkKLQotICAgIHN0YXRpYyB2b2lkICAgIGFwcGVuZEludChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKTsKLSAgICBzdGF0aWMgdm9pZCAgICBhcHBlbmRGbG9hdChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKTsKLSAgICBzdGF0aWMgdm9pZCAgICBhcHBlbmRQSUQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbmd0aCk7Ci0gICAgc3RhdGljIHZvaWQgICAgYXBwZW5kVGltZXN0YW1wKFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpOwotICAgIHN0YXRpYyBzaXplX3QgIGZtdEVudHJ5TGVuZ3RoKGNvbnN0IHVpbnQ4X3QgKmRhdGEpOwotICAgIHN0YXRpYyBTdHJpbmc4IGJ1ZmZlckR1bXAoY29uc3QgdWludDhfdCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7Ci0gICAgc3RhdGljIFN0cmluZzggYnVmZmVyRHVtcChjb25zdCBFbnRyeUl0ZXJhdG9yICZpdCk7Ci1wdWJsaWM6Ci0KLS8vIExvY2F0ZWQgaW4gc2hhcmVkIG1lbW9yeSwgbXVzdCBiZSBQT0QuCi0vLyBFeGFjdGx5IG9uZSBwcm9jZXNzIG11c3QgZXhwbGljaXRseSBjYWxsIHRoZSBjb25zdHJ1Y3RvciBvciB1c2UgcGxhY2VtZW50IG5ldy4KLS8vIFNpbmNlIHRoaXMgaXMgYSBQT0QsIHRoZSBkZXN0cnVjdG9yIGlzIGVtcHR5IGFuZCB1bm5lY2Vzc2FyeSB0byBjYWxsIGl0IGV4cGxpY2l0bHkuCi1zdHJ1Y3QgU2hhcmVkIHsKLSAgICBTaGFyZWQoKSAvKiBtUmVhciBpbml0aWFsaXplZCB2aWEgZGVmYXVsdCBjb25zdHJ1Y3RvciAqLyB7IH0KLSAgICAvKnZpcnR1YWwqLyB+U2hhcmVkKCkgeyB9Ci0KLSAgICBhdWRpb191dGlsc19maWZvX2luZGV4ICBtUmVhcjsgIC8vIGluZGV4IG9uZSBieXRlIHBhc3QgdGhlIGVuZCBvZiBtb3N0IHJlY2VudCBFbnRyeQotICAgIGNoYXIgICAgbUJ1ZmZlclswXTsgICAgICAgICAgICAgLy8gY2lyY3VsYXIgYnVmZmVyIGZvciBlbnRyaWVzCi19OwotCi1wdWJsaWM6Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBGSVhNRSBUaW1lbGluZSB3YXMgaW50ZW5kZWQgdG8gd3JhcCBXcml0ZXIgYW5kIFJlYWRlciwgYnV0IGlzbid0IGFjdHVhbGx5IHVzZWQgeWV0LgotLy8gRm9yIG5vdyBpdCBpcyBqdXN0IGEgbmFtZXNwYWNlIGZvciBzaGFyZWRTaXplKCkuCi1jbGFzcyBUaW1lbGluZSA6IHB1YmxpYyBSZWZCYXNlIHsKLXB1YmxpYzoKLSNpZiAwCi0gICAgVGltZWxpbmUoc2l6ZV90IHNpemUsIHZvaWQgKnNoYXJlZCA9IE5VTEwpOwotICAgIHZpcnR1YWwgflRpbWVsaW5lKCk7Ci0jZW5kaWYKLQotICAgIC8vIElucHV0IHBhcmFtZXRlciAnc2l6ZScgaXMgdGhlIGRlc2lyZWQgc2l6ZSBvZiB0aGUgdGltZWxpbmUgaW4gYnl0ZSB1bml0cy4KLSAgICAvLyBSZXR1cm5zIHRoZSBzaXplIHJvdW5kZWQgdXAgdG8gYSBwb3dlci1vZi0yLCBwbHVzIHRoZSBjb25zdGFudCBzaXplIG92ZXJoZWFkIGZvciBpbmRpY2VzLgotICAgIHN0YXRpYyBzaXplX3Qgc2hhcmVkU2l6ZShzaXplX3Qgc2l6ZSk7Ci0KLSNpZiAwCi1wcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyAgICBXcml0ZXI7Ci0gICAgZnJpZW5kIGNsYXNzICAgIFJlYWRlcjsKLQotICAgIGNvbnN0IHNpemVfdCAgICBtU2l6ZTsgICAgICAvLyBjaXJjdWxhciBidWZmZXIgc2l6ZSBpbiBieXRlcywgbXVzdCBiZSBhIHBvd2VyIG9mIDIKLSAgICBib29sICAgICAgICAgICAgbU93bjsgICAgICAgLy8gd2hldGhlciBJIG93biB0aGUgbWVtb3J5IGF0IG1TaGFyZWQKLSAgICBTaGFyZWQqIGNvbnN0ICAgbVNoYXJlZDsgICAgLy8gcG9pbnRlciB0byBzaGFyZWQgbWVtb3J5Ci0jZW5kaWYKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBXcml0ZXIgaXMgdGhyZWFkLXNhZmUgd2l0aCByZXNwZWN0IHRvIFJlYWRlciwgYnV0IG5vdCB3aXRoIHJlc3BlY3QgdG8gbXVsdGlwbGUgdGhyZWFkcwotLy8gY2FsbGluZyBXcml0ZXIgbWV0aG9kcy4gIElmIHlvdSBuZWVkIG11bHRpLXRocmVhZCBzYWZldHkgZm9yIHdyaXRpbmcsIHVzZSBMb2NrZWRXcml0ZXIuCi1jbGFzcyBXcml0ZXIgOiBwdWJsaWMgUmVmQmFzZSB7Ci1wdWJsaWM6Ci0gICAgV3JpdGVyKCk7ICAgICAgICAgICAgICAgICAgIC8vIGR1bW15IG5vcCBpbXBsZW1lbnRhdGlvbiB3aXRob3V0IHNoYXJlZCBtZW1vcnkKLQotICAgIC8vIElucHV0IHBhcmFtZXRlciAnc2l6ZScgaXMgdGhlIGRlc2lyZWQgc2l6ZSBvZiB0aGUgdGltZWxpbmUgaW4gYnl0ZSB1bml0cy4KLSAgICAvLyBUaGUgc2l6ZSBvZiB0aGUgc2hhcmVkIG1lbW9yeSBtdXN0IGJlIGF0IGxlYXN0IFRpbWVsaW5lOjpzaGFyZWRTaXplKHNpemUpLgotICAgIFdyaXRlcih2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKTsKLSAgICBXcml0ZXIoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnksIHNpemVfdCBzaXplKTsKLQotICAgIHZpcnR1YWwgfldyaXRlcigpOwotCi0gICAgLy8gRklYTUUgbmVlZHMgY29tbWVudHMsIGFuZCBzb21lIHNob3VsZCBiZSBwcml2YXRlCi0gICAgdmlydHVhbCB2b2lkICAgIGxvZyhjb25zdCBjaGFyICpzdHJpbmcpOwotICAgIHZpcnR1YWwgdm9pZCAgICBsb2dmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7Ci0gICAgdmlydHVhbCB2b2lkICAgIGxvZ3ZmKGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCk7Ci0gICAgdmlydHVhbCB2b2lkICAgIGxvZ1RpbWVzdGFtcCgpOwotICAgIHZpcnR1YWwgdm9pZCAgICBsb2dUaW1lc3RhbXAoY29uc3QgaW50NjRfdCB0cyk7Ci0gICAgdmlydHVhbCB2b2lkICAgIGxvZ0ludGVnZXIoY29uc3QgaW50IHgpOwotICAgIHZpcnR1YWwgdm9pZCAgICBsb2dGbG9hdChjb25zdCBmbG9hdCB4KTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgbG9nUElEKCk7Ci0gICAgdmlydHVhbCB2b2lkICAgIGxvZ0Zvcm1hdChjb25zdCBjaGFyICpmbXQsIGxvZ19oYXNoX3QgaGFzaCwgLi4uKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgbG9nVkZvcm1hdChjb25zdCBjaGFyICpmbXQsIGxvZ19oYXNoX3QgaGFzaCwgdmFfbGlzdCBhcCk7Ci0gICAgdmlydHVhbCB2b2lkICAgIGxvZ1N0YXJ0KGNvbnN0IGNoYXIgKmZtdCk7Ci0gICAgdmlydHVhbCB2b2lkICAgIGxvZ0VuZCgpOwotICAgIHZpcnR1YWwgdm9pZCAgICBsb2dIYXNoKGxvZ19oYXNoX3QgaGFzaCk7Ci0gICAgdmlydHVhbCB2b2lkICAgIGxvZ0V2ZW50SGlzdFRzKEV2ZW50IGV2ZW50LCBsb2dfaGFzaF90IGhhc2gpOwotCi0gICAgdmlydHVhbCBib29sICAgIGlzRW5hYmxlZCgpIGNvbnN0OwotCi0gICAgLy8gcmV0dXJuIHZhbHVlIGZvciBhbGwgb2YgdGhlc2UgaXMgdGhlIHByZXZpb3VzIGlzRW5hYmxlZCgpCi0gICAgdmlydHVhbCBib29sICAgIHNldEVuYWJsZWQoYm9vbCBlbmFibGVkKTsgICAvLyBidXQgd29uJ3QgZW5hYmxlIGlmIG5vIHNoYXJlZCBtZW1vcnkKLSAgICAgICAgICAgIGJvb2wgICAgZW5hYmxlKCkgICAgeyByZXR1cm4gc2V0RW5hYmxlZCh0cnVlKTsgfQotICAgICAgICAgICAgYm9vbCAgICBkaXNhYmxlKCkgICB7IHJldHVybiBzZXRFbmFibGVkKGZhbHNlKTsgfQotCi0gICAgc3A8SU1lbW9yeT4gICAgIGdldElNZW1vcnkoKSBjb25zdCAgeyByZXR1cm4gbUlNZW1vcnk7IH0KLQotcHJpdmF0ZToKLSAgICAvLyAwIDw9IGxlbmd0aCA8PSBrTWF4TGVuZ3RoCi0gICAgLy8gd3JpdGVzIGEgc2luZ2xlIEVudHJ5IHRvIHRoZSBGSUZPCi0gICAgdm9pZCAgICBsb2coRXZlbnQgZXZlbnQsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW5ndGgpOwotICAgIC8vIGNoZWNrcyB2YWxpZGl0eSBvZiBhbiBldmVudCBiZWZvcmUgY2FsbGluZyBsb2cgYWJvdmUgdGhpcyBvbmUKLSAgICB2b2lkICAgIGxvZyhjb25zdCBFbnRyeSAqZW50cnksIGJvb2wgdHJ1c3RlZCA9IGZhbHNlKTsKLQotICAgIFNoYXJlZCogY29uc3QgICBtU2hhcmVkOyAgICAvLyByYXcgcG9pbnRlciB0byBzaGFyZWQgbWVtb3J5Ci0gICAgc3A8SU1lbW9yeT4gICAgIG1JTWVtb3J5OyAgIC8vIHJlZi1jb3VudGVkIHZlcnNpb24sIGluaXRpYWxpemVkIGluIGNvbnN0cnVjdG9yIGFuZCB0aGVuIGNvbnN0Ci0gICAgYXVkaW9fdXRpbHNfZmlmbyAqIGNvbnN0IG1GaWZvOyAgICAgICAgICAgICAgICAgLy8gRklGTyBpdHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9uLU5VTEwgdW5sZXNzIGNvbnN0cnVjdG9yIGZhaWxzCi0gICAgYXVkaW9fdXRpbHNfZmlmb193cml0ZXIgKiBjb25zdCBtRmlmb1dyaXRlcjsgICAgLy8gdXNlZCB0byB3cml0ZSB0byBGSUZPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vbi1OVUxMIHVubGVzcyBkdW1teSBjb25zdHJ1Y3RvciB1c2VkCi0gICAgYm9vbCAgICAgICAgICAgIG1FbmFibGVkOyAgIC8vIHdoZXRoZXIgdG8gYWN0dWFsbHkgbG9nCi0KLSAgICAvLyBjYWNoZWQgcGlkIGFuZCBwcm9jZXNzIG5hbWUgdG8gdXNlIGluICVwIGZvcm1hdCBzcGVjaWZpZXIKLSAgICAvLyB0b3RhbCB0YWcgbGVuZ3RoIGlzIG1QaWRUYWdTaXplIGFuZCBwcm9jZXNzIG5hbWUgaXMgbm90IHplcm8gdGVybWluYXRlZAotICAgIGNoYXIgICAqbVBpZFRhZzsKLSAgICBzaXplX3QgIG1QaWRUYWdTaXplOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIFNpbWlsYXIgdG8gV3JpdGVyLCBidXQgc2FmZSBmb3IgbXVsdGlwbGUgdGhyZWFkcyB0byBjYWxsIGNvbmN1cnJlbnRseQotY2xhc3MgTG9ja2VkV3JpdGVyIDogcHVibGljIFdyaXRlciB7Ci1wdWJsaWM6Ci0gICAgTG9ja2VkV3JpdGVyKCk7Ci0gICAgTG9ja2VkV3JpdGVyKHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpOwotCi0gICAgdmlydHVhbCB2b2lkICAgIGxvZyhjb25zdCBjaGFyICpzdHJpbmcpOwotICAgIHZpcnR1YWwgdm9pZCAgICBsb2dmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7Ci0gICAgdmlydHVhbCB2b2lkICAgIGxvZ3ZmKGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCk7Ci0gICAgdmlydHVhbCB2b2lkICAgIGxvZ1RpbWVzdGFtcCgpOwotICAgIHZpcnR1YWwgdm9pZCAgICBsb2dUaW1lc3RhbXAoY29uc3QgaW50NjRfdCB0cyk7Ci0gICAgdmlydHVhbCB2b2lkICAgIGxvZ0ludGVnZXIoY29uc3QgaW50IHgpOwotICAgIHZpcnR1YWwgdm9pZCAgICBsb2dGbG9hdChjb25zdCBmbG9hdCB4KTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgbG9nUElEKCk7Ci0gICAgdmlydHVhbCB2b2lkICAgIGxvZ1N0YXJ0KGNvbnN0IGNoYXIgKmZtdCk7Ci0gICAgdmlydHVhbCB2b2lkICAgIGxvZ0VuZCgpOwotICAgIHZpcnR1YWwgdm9pZCAgICBsb2dIYXNoKGxvZ19oYXNoX3QgaGFzaCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgICAgaXNFbmFibGVkKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBib29sICAgIHNldEVuYWJsZWQoYm9vbCBlbmFibGVkKTsKLQotcHJpdmF0ZToKLSAgICBtdXRhYmxlIE11dGV4ICAgbUxvY2s7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgUmVhZGVyIDogcHVibGljIFJlZkJhc2UgewotcHVibGljOgotCi0gICAgLy8gQSBzbmFwc2hvdCBvZiBhIHJlYWRlcnMgYnVmZmVyCi0gICAgLy8gVGhpcyBpcyByYXcgZGF0YS4gTm8gYW5hbHlzaXMgaGFzIGJlZW4gZG9uZSBvbiBpdAotICAgIGNsYXNzIFNuYXBzaG90IHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIFNuYXBzaG90KCkgOiBtRGF0YShOVUxMKSwgbUxvc3QoMCkge30KLQotICAgICAgICBTbmFwc2hvdChzaXplX3QgYnVmZmVyU2l6ZSkgOiBtRGF0YShuZXcgdWludDhfdFtidWZmZXJTaXplXSkge30KLQotICAgICAgICB+U25hcHNob3QoKSB7IGRlbGV0ZVtdIG1EYXRhOyB9Ci0KLSAgICAgICAgLy8gY29weSBvZiB0aGUgYnVmZmVyCi0gICAgICAgIHVpbnQ4X3QgKmRhdGEoKSBjb25zdCB7IHJldHVybiBtRGF0YTsgfQotCi0gICAgICAgIC8vIGFtb3VudCBvZiBkYXRhIGxvc3QgKGdpdmVuIGJ5IGF1ZGlvX3V0aWxzX2ZpZm9fcmVhZGVyKQotICAgICAgICBzaXplX3QgICBsb3N0KCkgY29uc3QgeyByZXR1cm4gbUxvc3Q7IH0KLQotICAgICAgICAvLyBpdGVyYXRvciB0byBiZWdpbm5pbmcgb2YgcmVhZGFibGUgc2VnbWVudCBvZiBzbmFwc2hvdAotICAgICAgICAvLyBkYXRhIGJldHdlZW4gYmVnaW4gYW5kIGVuZCBoYXMgdmFsaWQgZW50cmllcwotICAgICAgICBFbnRyeUl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gbUJlZ2luOyB9Ci0KLSAgICAgICAgLy8gaXRlcmF0b3IgdG8gZW5kIG9mIHJlYWRhYmxlIHNlZ21lbnQgb2Ygc25hcHNob3QKLSAgICAgICAgRW50cnlJdGVyYXRvciBlbmQoKSB7IHJldHVybiBtRW5kOyB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBmcmllbmQgY2xhc3MgUmVhZGVyOwotICAgICAgICB1aW50OF90ICAgICAgICAgICAgICAqbURhdGE7Ci0gICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICBtTG9zdDsKLSAgICAgICAgRW50cnlJdGVyYXRvciBtQmVnaW47Ci0gICAgICAgIEVudHJ5SXRlcmF0b3IgbUVuZDsKLSAgICB9OwotCi0gICAgLy8gSW5wdXQgcGFyYW1ldGVyICdzaXplJyBpcyB0aGUgZGVzaXJlZCBzaXplIG9mIHRoZSB0aW1lbGluZSBpbiBieXRlIHVuaXRzLgotICAgIC8vIFRoZSBzaXplIG9mIHRoZSBzaGFyZWQgbWVtb3J5IG11c3QgYmUgYXQgbGVhc3QgVGltZWxpbmU6OnNoYXJlZFNpemUoc2l6ZSkuCi0gICAgUmVhZGVyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpOwotICAgIFJlYWRlcihjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSwgc2l6ZV90IHNpemUpOwotCi0gICAgdmlydHVhbCB+UmVhZGVyKCk7Ci0KLSAgICAvLyBnZXQgc25hcHNob3Qgb2YgcmVhZGVycyBmaWZvIGJ1ZmZlciwgZWZmZWN0aXZlbHkgY29uc3VtaW5nIHRoZSBidWZmZXIKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+IGdldFNuYXBzaG90KCk7Ci0gICAgLy8gZHVtcCBhIHBhcnRpY3VsYXIgc25hcHNob3Qgb2YgdGhlIHJlYWRlcgotICAgIC8vIFRPRE86IG1vdmUgZHVtcCB0byBQZXJmb3JtYW5jZUFuYWx5c2lzLiBNb2RlbC92aWV3L2NvbnRyb2xsZXIgZGVzaWduCi0gICAgdm9pZCAgICAgZHVtcChpbnQgZmQsIHNpemVfdCBpbmRlbnQsIFNuYXBzaG90ICYgc25hcCk7Ci0gICAgLy8gZHVtcCB0aGUgY3VycmVudCBjb250ZW50IG9mIHRoZSByZWFkZXIncyBidWZmZXIgKGNhbGwgZ2V0U25hcHNob3QoKSBhbmQgcHJldmlvdXMgZHVtcCgpKQotICAgIHZvaWQgICAgIGR1bXAoaW50IGZkLCBzaXplX3QgaW5kZW50ID0gMCk7Ci0gICAgYm9vbCAgICAgaXNJTWVtb3J5KGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5KSBjb25zdDsKLQotcHJpdmF0ZToKLQotICAgIHN0YXRpYyBjb25zdCBzdGQ6OnNldDxFdmVudD4gc3RhcnRpbmdUeXBlczsKLSAgICBzdGF0aWMgY29uc3Qgc3RkOjpzZXQ8RXZlbnQ+IGVuZGluZ1R5cGVzOwotICAgIC8qY29uc3QqLyBTaGFyZWQqIGNvbnN0IG1TaGFyZWQ7ICAgIC8vIHJhdyBwb2ludGVyIHRvIHNoYXJlZCBtZW1vcnksIGFjdHVhbGx5IGNvbnN0IGJ1dCBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWNsYXJlZCBhcyBjb25zdCBiZWNhdXNlIGF1ZGlvX3V0aWxzX2ZpZm8oKSBjb25zdHJ1Y3RvcgotICAgIHNwPElNZW1vcnk+IG1JTWVtb3J5OyAgICAgICAvLyByZWYtY291bnRlZCB2ZXJzaW9uLCBhc3NpZ25lZCBvbmx5IGluIGNvbnN0cnVjdG9yCi0gICAgaW50ICAgICBtRmQ7ICAgICAgICAgICAgICAgIC8vIGZpbGUgZGVzY3JpcHRvcgotICAgIGludCAgICAgbUluZGVudDsgICAgICAgICAgICAvLyBpbmRlbnRhdGlvbiBsZXZlbAotICAgIGF1ZGlvX3V0aWxzX2ZpZm8gKiBjb25zdCBtRmlmbzsgICAgICAgICAgICAgICAgIC8vIEZJRk8gaXRzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vbi1OVUxMIHVubGVzcyBjb25zdHJ1Y3RvciBmYWlscwotICAgIGF1ZGlvX3V0aWxzX2ZpZm9fcmVhZGVyICogY29uc3QgbUZpZm9SZWFkZXI7ICAgIC8vIHVzZWQgdG8gcmVhZCBmcm9tIEZJRk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9uLU5VTEwgdW5sZXNzIGNvbnN0cnVjdG9yIGZhaWxzCi0KLSAgICAvLyBUT0RPOiBpdCBtaWdodCBiZSBjbGVhcmVyLCBpbnN0ZWFkIG9mIGEgZGlyZWN0IG1hcCBmcm9tIHNvdXJjZSBsb2NhdGlvbiB0byB2ZWN0b3Igb2YKLSAgICAvLyB0aW1lc3RhbXBzLCBpZiB3ZSBpbnN0ZWFkIGZpcnN0IG1hcHBlZCBmcm9tIHNvdXJjZSBsb2NhdGlvbiB0byBhbiBvYmplY3QgdGhhdAotICAgIC8vIHJlcHJlc2VudGVkIHRoYXQgbG9jYXRpb24uIEFuZCBvbmVfb2YgaXRzIGZpZWxkcyB3b3VsZCBiZSBhIHZlY3RvciBvZiB0aW1lc3RhbXBzLgotICAgIC8vIFRoYXQgd291bGQgYWxsb3cgdXMgdG8gcmVjb3JkIG90aGVyIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzb3VyY2UgbG9jYXRpb24gYmV5b25kIHRpbWVzdGFtcHMuCi0gICAgdm9pZCAgICBkdW1wTGluZShjb25zdCBTdHJpbmc4JiB0aW1lc3RhbXAsIFN0cmluZzgmIGJvZHkpOwotCi0gICAgRW50cnlJdGVyYXRvciAgIGhhbmRsZUZvcm1hdChjb25zdCBGb3JtYXRFbnRyeSAmZm10RW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggKnRpbWVzdGFtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCAqYm9keSk7Ci0gICAgLy8gZHVtbXkgbWV0aG9kIGZvciBoYW5kbGluZyBhYnNlbnQgYXV0aG9yIGVudHJ5Ci0gICAgdmlydHVhbCB2b2lkIGhhbmRsZUF1dGhvcihjb25zdCBBYnN0cmFjdEVudHJ5JiAvKmZtdEVudHJ5Ki8sIFN0cmluZzgqIC8qYm9keSovKSB7fQotCi0gICAgLy8gU2VhcmNoZXMgZm9yIHRoZSBsYXN0IGVudHJ5IG9mIHR5cGUgPHR5cGU+IGluIHRoZSByYW5nZSBbZnJvbnQsIGJhY2spCi0gICAgLy8gYmFjayBoYXMgdG8gYmUgZW50cnktYWxpZ25lZC4gUmV0dXJucyBudWxscHRyIGlmIG5vbmUgZW5jb251bnRlcmVkLgotICAgIHN0YXRpYyBjb25zdCB1aW50OF90ICpmaW5kTGFzdEVudHJ5T2ZUeXBlcyhjb25zdCB1aW50OF90ICpmcm9udCwgY29uc3QgdWludDhfdCAqYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8RXZlbnQ+ICZ0eXBlcyk7Ci0KLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtTcXVhc2hUaW1lc3RhbXAgPSA1OyAvLyBzcXVhc2ggdGhpcyBtYW55IG9yIG1vcmUgYWRqYWNlbnQgdGltZXN0YW1wcwotfTsKLQotLy8gV3JhcHBlciBmb3IgYSByZWFkZXIgd2l0aCBhIG5hbWUuIENvbnRhaW5zIGEgcG9pbnRlciB0byB0aGUgcmVhZGVyIGFuZCBhIHBvaW50ZXIgdG8gdGhlIG5hbWUKLWNsYXNzIE5hbWVkUmVhZGVyIHsKLXB1YmxpYzoKLSAgICBOYW1lZFJlYWRlcigpIHsgbU5hbWVbMF0gPSAnXDAnOyB9IC8vIGZvciBWZWN0b3IKLSAgICBOYW1lZFJlYWRlcihjb25zdCBzcDxOQkxvZzo6UmVhZGVyPiYgcmVhZGVyLCBjb25zdCBjaGFyICpuYW1lKSA6Ci0gICAgICAgIG1SZWFkZXIocmVhZGVyKQotICAgICAgICB7IHN0cmxjcHkobU5hbWUsIG5hbWUsIHNpemVvZihtTmFtZSkpOyB9Ci0gICAgfk5hbWVkUmVhZGVyKCkgeyB9Ci0gICAgY29uc3Qgc3A8TkJMb2c6OlJlYWRlcj4mICByZWFkZXIoKSBjb25zdCB7IHJldHVybiBtUmVhZGVyOyB9Ci0gICAgY29uc3QgY2hhciogICAgICAgICAgICAgICBuYW1lKCkgY29uc3QgeyByZXR1cm4gbU5hbWU7IH0KLQotcHJpdmF0ZToKLSAgICBzcDxOQkxvZzo6UmVhZGVyPiAgIG1SZWFkZXI7Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4TmFtZSA9IDMyOwotICAgIGNoYXIgICAgICAgICAgICAgICAgbU5hbWVba01heE5hbWVdOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIE1lcmdlciA6IHB1YmxpYyBSZWZCYXNlIHsKLXB1YmxpYzoKLSAgICBNZXJnZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICB2aXJ0dWFsIH5NZXJnZXIoKSB7fQotCi0gICAgdm9pZCBhZGRSZWFkZXIoY29uc3QgTmFtZWRSZWFkZXIgJnJlYWRlcik7Ci0gICAgLy8gVE9ETyBhZGQgcmVtb3ZlUmVhZGVyCi0gICAgdm9pZCBtZXJnZSgpOwotICAgIC8vIEZJWE1FIFRoaXMgaXMgcmV0dXJuaW5nIGEgcmVmZXJlbmNlIHRvIGEgc2hhcmVkIHZhcmlhYmxlIHRoYXQgbmVlZHMgYSBsb2NrCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8TmFtZWRSZWFkZXI+JiBnZXROYW1lZFJlYWRlcnMoKSBjb25zdDsKLXByaXZhdGU6Ci0gICAgLy8gdmVjdG9yIG9mIHRoZSByZWFkZXJzIHRoZSBtZXJnZXIgaXMgc3VwcG9zZWQgdG8gbWVyZ2UgZnJvbS4KLSAgICAvLyBldmVyeSByZWFkZXIgcmVhZHMgZnJvbSBhIHdyaXRlcidzIGJ1ZmZlcgotICAgIC8vIEZJWE1FIE5lZWRzIHRvIGJlIHByb3RlY3RlZCBieSBhIGxvY2sKLSAgICBzdGQ6OnZlY3RvcjxOYW1lZFJlYWRlcj4gbU5hbWVkUmVhZGVyczsKLQotICAgIC8vIFRPRE8gTmVlZCBjb21tZW50cyBvbiBhbGwgb2YgdGhlc2UKLSAgICBTaGFyZWQgKiBjb25zdCBtU2hhcmVkOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvPiBtRmlmbzsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+IG1GaWZvV3JpdGVyOwotfTsKLQotY2xhc3MgTWVyZ2VSZWFkZXIgOiBwdWJsaWMgUmVhZGVyIHsKLXB1YmxpYzoKLSAgICBNZXJnZVJlYWRlcihjb25zdCB2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplLCBNZXJnZXIgJm1lcmdlcik7Ci1wcml2YXRlOgotICAgIC8vIEZJWE1FIE5lZWRzIHRvIGJlIHByb3RlY3RlZCBieSBhIGxvY2ssCi0gICAgLy8gICAgICAgYmVjYXVzZSBldmVuIHRob3VnaCBvdXIgdXNlIG9mIGl0IGlzIHJlYWQtb25seSB0aGVyZSBtYXkgYmUgYXN5bmNocm9ub3VzIHVwZGF0ZXMKLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxOYW1lZFJlYWRlcj4mIG1OYW1lZFJlYWRlcnM7Ci0gICAgLy8gaGFuZGxlIGF1dGhvciBlbnRyeSBieSBsb29raW5nIHVwIHRoZSBhdXRob3IncyBuYW1lIGFuZCBhcHBlbmRpbmcgaXQgdG8gdGhlIGJvZHkKLSAgICAvLyByZXR1cm5zIG51bWJlciBvZiBieXRlcyByZWFkIGZyb20gZm10RW50cnkKLSAgICB2b2lkIGhhbmRsZUF1dGhvcihjb25zdCBBYnN0cmFjdEVudHJ5ICZmbXRFbnRyeSwgU3RyaW5nOCAqYm9keSk7Ci19OwotCi0vLyBNZXJnZVRocmVhZCBpcyBhIHRocmVhZCB0aGF0IGNvbnRhaW5zIGEgTWVyZ2VyLiBJdCB3b3JrcyBhcyBhIHJldHJpZ2dlcmFibGUgb25lLXNob3Q6Ci0vLyB3aGVuIHRyaWdnZXJlZCwgaXQgYXdha2VzIGZvciBhIGxhcHNlIG9mIHRpbWUsIGR1cmluZyB3aGljaCBpdCBwZXJpb2RpY2FsbHkgbWVyZ2VzOyBpZgotLy8gcmV0cmlnZ2VyZWQsIHRoZSB0aW1lb3V0IGlzIHJlc2V0LgotLy8gVGhlIHRocmVhZCBpcyB0cmlnZ2VyZWQgb24gQXVkaW9GbGluZ2VyIGJpbmRlciBhY3Rpdml0eS4KLWNsYXNzIE1lcmdlVGhyZWFkIDogcHVibGljIFRocmVhZCB7Ci1wdWJsaWM6Ci0gICAgTWVyZ2VUaHJlYWQoTWVyZ2VyICZtZXJnZXIpOwotICAgIHZpcnR1YWwgfk1lcmdlVGhyZWFkKCkgb3ZlcnJpZGU7Ci0KLSAgICAvLyBSZXNldCB0aW1lb3V0IGFuZCBhY3RpdmF0ZSB0aHJlYWQgdG8gbWVyZ2UgcGVyaW9kaWNhbGx5IGlmIGl0J3MgaWRsZQotICAgIHZvaWQgd2FrZXVwKCk7Ci0KLSAgICAvLyBTZXQgdGltZW91dCBwZXJpb2QgdW50aWwgdGhlIG1lcmdpbmcgdGhyZWFkIGdvZXMgaWRsZSBhZ2FpbgotICAgIHZvaWQgc2V0VGltZW91dFVzKGludCB0aW1lKTsKLQotcHJpdmF0ZToKLSAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpIG92ZXJyaWRlOwotCi0gICAgLy8gdGhlIG1lcmdlciB3aG8gYWN0dWFsbHkgZG9lcyB0aGUgd29yayBvZiBtZXJnaW5nIHRoZSBsb2dzCi0gICAgTWVyZ2VyJiAgICAgbU1lcmdlcjsKLQotICAgIC8vIG11dGV4IGZvciB0aGUgY29uZGl0aW9uIHZhcmlhYmxlCi0gICAgTXV0ZXggICAgICAgbU11dGV4OwotCi0gICAgLy8gY29uZGl0aW9uIHZhcmlhYmxlIHRvIGFjdGl2YXRlIG1lcmdpbmcgb24gdGltZW91dCA+PSAwCi0gICAgQ29uZGl0aW9uICAgbUNvbmQ7Ci0KLSAgICAvLyB0aW1lIGxlZnQgdW50aWwgdGhlIHRocmVhZCBibG9ja3MgYWdhaW4gKGluIG1pY3Jvc2Vjb25kcykKLSAgICBpbnQgICAgICAgICBtVGltZW91dFVzOwotCi0gICAgLy8gbWVyZ2luZyBwZXJpb2Qgd2hlbiB0aGUgdGhyZWFkIGlzIGF3YWtlCi0gICAgc3RhdGljIGNvbnN0IGludCAga1RocmVhZFNsZWVwUGVyaW9kVXMgPSAxMDAwMDAwIC8qMXMqLzsKLQotICAgIC8vIGluaXRpYWwgdGltZW91dCB2YWx1ZSB3aGVuIHRyaWdnZXJlZAotICAgIHN0YXRpYyBjb25zdCBpbnQgIGtUaHJlYWRXYWtldXBQZXJpb2RVcyA9IDMwMDAwMDAgLyozcyovOwotfTsKLQotfTsgIC8vIGNsYXNzIE5CTG9nCi0KLS8vIFRPRE8gcHV0IHNvbWV3aGVyZSBlbHNlCi1zdGF0aWMgaW5saW5lIGludDY0X3QgZ2V0X21vbm90b25pY19ucygpIHsKLSAgICB0aW1lc3BlYyB0czsKLSAgICBpZiAoY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZ0cykgPT0gMCkgewotICAgICAgICByZXR1cm4gKHVpbnQ2NF90KSB0cy50dl9zZWMgKiAxMDAwICogMTAwMCAqIDEwMDAgKyB0cy50dl9uc2VjOwotICAgIH0KLSAgICByZXR1cm4gMDsgLy8gc2hvdWxkIG5vdCBoYXBwZW4uCi19Ci0KLX0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIEFORFJPSURfTUVESUFfTkJMT0dfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9QZXJmb3JtYW5jZUFuYWx5c2lzLmggYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL1BlcmZvcm1hbmNlQW5hbHlzaXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBkYzE0OC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL1BlcmZvcm1hbmNlQW5hbHlzaXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gTm9uLWJsb2NraW5nIGV2ZW50IGxvZ2dlciBpbnRlbmRlZCBmb3Igc2FmZSBjb21tdW5pY2F0aW9uIGJldHdlZW4gcHJvY2Vzc2VzIHZpYSBzaGFyZWQgbWVtb3J5Ci0KLSNpZm5kZWYgQU5EUk9JRF9NRURJQV9QRVJGT1JNQU5DRUFOQUxZU0lTX0gKLSNkZWZpbmUgQU5EUk9JRF9NRURJQV9QRVJGT1JNQU5DRUFOQUxZU0lTX0gKLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxkZXF1ZT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSAiTkJMb2cuaCIKLSNpbmNsdWRlICJSZXBvcnRQZXJmb3JtYW5jZS5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLW5hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZSB7Ci0KLWNsYXNzIFBlcmZvcm1hbmNlQW5hbHlzaXMgewotICAgIC8vIFRoaXMgY2xhc3Mgc3RvcmVzIGFuZCBhbmFseXplcyBhdWRpbyBwcm9jZXNzaW5nIHdha2V1cCB0aW1lc3RhbXBzIGZyb20gTkJMb2cKLSAgICAvLyBGSVhNRTogY3VycmVudGx5LCBhbGwgcGVyZm9ybWFuY2UgZGF0YSBpcyBzdG9yZWQgaW4gZGVxdWVzLiBOZWVkIHRvIGFkZCBhIG11dGV4LgotICAgIC8vIEZJWE1FOiBjb250aW51ZSB0aGlzIHdheSB1bnRpbCBhbmFseXNpcyBpcyBkb25lIGluIGEgc2VwYXJhdGUgdGhyZWFkLiBUaGVuLCB1c2UKLSAgICAvLyB0aGUgZmlmbyB3cml0ZXIgdXRpbGl0aWVzLgotcHVibGljOgotCi0gICAgUGVyZm9ybWFuY2VBbmFseXNpcygpOwotCi0gICAgLy8gR2l2ZW4gYSBzZXJpZXMgb2YgYXVkaW8gcHJvY2Vzc2luZyB3YWtldXAgdGltZXN0YW1wcywKLSAgICAvLyBjb21wcmVzc2VzIGFuZCBhbmQgYW5hbHl6ZXMgdGhlIGRhdGEsIGFuZCBmbHVzaGVzCi0gICAgLy8gdGhlIHRpbWVzdGFtcCBzZXJpZXMgZnJvbSBtZW1vcnkuCi0gICAgdm9pZCBwcm9jZXNzQW5kRmx1c2hUaW1lU3RhbXBTZXJpZXMoKTsKLQotICAgIC8vIENhbGxlZCB3aGVuIGFuIGF1ZGlvIG9uL29mZiBldmVudCBpcyByZWFkIGZyb20gdGhlIGJ1ZmZlciwKLSAgICAvLyBlLmcuIEVWRU5UX0FVRElPX1NUQVRFLgotICAgIC8vIGNhbGxzIGZsdXNoVGltZVN0YW1wU2VyaWVzIG9uIHRoZSBkYXRhIHVwIHRvIHRoZSBldmVudCwKLSAgICAvLyBlZmZlY3RpdmVseSBkaXNjYXJkaW5nIHRoZSBpZGxlIGF1ZGlvIHRpbWUgaW50ZXJ2YWwKLSAgICB2b2lkIGhhbmRsZVN0YXRlQ2hhbmdlKCk7Ci0KLSAgICAvLyBXaGVuIHRoZSBzaG9ydC10ZXJtIGhpc3RvZ3JhbSBhcnJheSBtUmVjZW50SGlzdHMgaGFzIHJlYWNoZWQgY2FwYWNpdHksCi0gICAgLy8gbWVyZ2VzIGhpc3RvZ3JhbXMgZm9yIGRhdGEgY29tcHJlc3Npb24gYW5kIHN0b3JlcyB0aGVtIGluIG1Mb25nVGVybUhpc3RzCi0gICAgdm9pZCBwcm9jZXNzQW5kRmx1c2hSZWNlbnRIaXN0cygpOwotCi0gICAgLy8gV3JpdGVzIHdha2V1cCB0aW1lc3RhbXAgZW50cnkgdG8gbG9nIGFuZCBydW5zIGFuYWx5c2lzCi0gICAgLy8gVE9ETzogbWFrZSB0aGlzIHRocmVhZCBzYWZlLiBFYWNoIHRocmVhZCBzaG91bGQgaGF2ZSBpdHMgb3duIGluc3RhbmNlCi0gICAgLy8gb2YgUGVyZm9ybWFuY2VBbmFseXNpcy4KLSAgICB2b2lkIGxvZ1RzRW50cnkodGltZXN0YW1wX3JhdyB0cyk7Ci0KLSAgICAvLyBGSVhNRTogbWFrZSBwZWFrZGV0ZWN0b3IgYW5kIHN0b3JlT3V0bGllckRhdGEgYSBzaW5nbGUgZnVuY3Rpb24KLSAgICAvLyBJbnB1dDogbU91dGxpZXJEYXRhLiBMb29rcyBhdCB0aW1lIGVsYXBzZWQgYmV0d2VlbiBvdXRsaWVycwotICAgIC8vIGZpbmRzIHNpZ25pZmljYW50IGNoYW5nZXMgaW4gdGhlIGRpc3RyaWJ1dGlvbgotICAgIC8vIHdyaXRlcyB0aW1lc3RhbXBzIG9mIHNpZ25pZmljYW50IGNoYW5nZXMgdG8gbVBlYWtUaW1lc3RhbXBzCi0gICAgdm9pZCBkZXRlY3RQZWFrcygpOwotCi0gICAgLy8gcnVucyBhbmFseXNpcyBvbiB0aW1lc3RhbXAgc2VyaWVzIGJlZm9yZSBpdCBpcyBjb252ZXJ0ZWQgdG8gYSBoaXN0b2dyYW0KLSAgICAvLyBmaW5kcyBvdXRsaWVycwotICAgIC8vIHdyaXRlcyB0byBtT3V0bGllckRhdGEgPHRpbWUgZWxhcHNlZCBzaW5jZSBwcmV2aW91cyBvdXRsaWVyLCBvdXRsaWVyIHRpbWVzdGFtcD4KLSAgICB2b2lkIHN0b3JlT3V0bGllckRhdGEoY29uc3Qgc3RkOjp2ZWN0b3I8dGltZXN0YW1wX3Jhdz4gJnRpbWVzdGFtcHMpOwotCi0gICAgLy8gaW5wdXQ6IHNlcmllcyBvZiBzaG9ydCBoaXN0b2dyYW1zLiBHZW5lcmF0ZXMgYSBzdHJpbmcgb2YgYW5hbHlzaXMgb2YgdGhlIGJ1ZmZlciBwZXJpb2RzCi0gICAgLy8gVE9ETzogV0lQIHdyaXRlIG1vcmUgZGV0YWlsZWQgYW5hbHlzaXMKLSAgICAvLyBGSVhNRTogbW92ZSB0aGlzIGRhdGEgdmlzdWFsaXphdGlvbiB0byBhIHNlcGFyYXRlIGNsYXNzLiBNb2RlbC92aWV3L2NvbnRyb2xsZXIKLSAgICB2b2lkIHJlcG9ydFBlcmZvcm1hbmNlKFN0cmluZzggKmJvZHksIGludCBtYXhIZWlnaHQgPSAxMCk7Ci0KLSAgICAvLyBUT0RPOiBkZWxldGUgdGhpcy4gdGVtcCBmb3IgdGVzdGluZwotICAgIHZvaWQgdGVzdEZ1bmN0aW9uKCk7Ci0KLSAgICAvLyBUaGlzIGZ1bmN0aW9uIHVzZWQgdG8gZGV0ZWN0IGdsaXRjaGVzIGluIGEgdGltZSBzZXJpZXMKLSAgICAvLyBUT0RPIGluY29ycG9yYXRlIHRoaXMgaW50byB0aGUgYW5hbHlzaXMgKGN1cnJlbnRseSB1bnVzZWQpCi0gICAgdm9pZCBhbGVydElmR2xpdGNoKGNvbnN0IHN0ZDo6dmVjdG9yPHRpbWVzdGFtcF9yYXc+ICZzYW1wbGVzKTsKLQotcHJpdmF0ZToKLQotICAgIC8vIHN0b3JlcyBvdXRsaWVyIGFuYWx5c2lzOiA8ZWxhcHNlZCB0aW1lIGJldHdlZW4gb3V0bGllcnMgaW4gbXMsIG91dGxpZXIgdGltZXN0YW1wPgotICAgIHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPG91dGxpZXJJbnRlcnZhbCwgdGltZXN0YW1wPj4gbU91dGxpZXJEYXRhOwotCi0gICAgLy8gc3RvcmVzIGVhY2ggdGltZXN0YW1wIGF0IHdoaWNoIGEgcGVhayB3YXMgZGV0ZWN0ZWQKLSAgICAvLyBhIHBlYWsgaXMgYSBtb21lbnQgYXQgd2hpY2ggdGhlIGF2ZXJhZ2Ugb3V0bGllciBpbnRlcnZhbCBjaGFuZ2VkIHNpZ25pZmljYW50bHkKLSAgICBzdGQ6OmRlcXVlPHRpbWVzdGFtcD4gbVBlYWtUaW1lc3RhbXBzOwotCi0gICAgLy8gVE9ETzogdHVybiB0aGVzZSBpbnRvIGNpcmN1bGFyIGJ1ZmZlcnMgZm9yIGJldHRlciBkYXRhIGZsb3cKLSAgICAvLyBGSUZPIG9mIHNtYWxsIGhpc3RvZ3JhbXMKLSAgICAvLyBzdG9yZXMgZml4ZWQtc2l6ZSBzaG9ydCBidWZmZXIgcGVyaW9kIGhpc3RvZ3JhbXMgd2l0aCB0aW1lc3RhbXAgb2YgZmlyc3Qgc2FtcGxlCi0gICAgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8dGltZXN0YW1wLCBIaXN0b2dyYW0+PiBtUmVjZW50SGlzdHM7Ci0KLSAgICAvLyBGSUZPIG9mIHNtYWxsIGhpc3RvZ3JhbXMKLSAgICAvLyBzdG9yZXMgZml4ZWQtc2l6ZSBsb25nLXRlcm0gYnVmZmVyIHBlcmlvZCBoaXN0b2dyYW1zIHdpdGggdGltZXN0YW1wIG9mIGZpcnN0IHNhbXBsZQotICAgIHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPHRpbWVzdGFtcCwgSGlzdG9ncmFtPj4gbUxvbmdUZXJtSGlzdHM7Ci0KLSAgICAvLyB2ZWN0b3Igb2YgdGltZXN0YW1wcywgY29sbGVjdGVkIGZyb20gTkJMb2cgZm9yIGEgKFRPRE8pIHNwZWNpZmljIHRocmVhZAotICAgIC8vIHdoZW4gYSB2ZWN0b3IgcmVhY2hlcyBpdHMgbWF4aW11bSBzaXplLCB0aGUgZGF0YSBpcyBwcm9jZXNzZWQgYW5kIGZsdXNoZWQKLSAgICBzdGQ6OnZlY3Rvcjx0aW1lc3RhbXBfcmF3PiBtVGltZVN0YW1wU2VyaWVzOwotCi0gICAgc3RhdGljIGNvbnN0IGludCBrTXNQZXJTZWMgPSAxMDAwOwotCi0gICAgLy8gUGFyYW1ldGVycyB1c2VkIHdoZW4gZGV0ZWN0aW5nIG91dGxpZXJzCi0gICAgLy8gVE9ETzogbGVhcm4gc29tZSBvZiB0aGVzZSBmcm9tIHRoZSBkYXRhLCBkZWxldGUgdW51c2VkIG9uZXMKLSAgICAvLyBGSVhNRTogZGVjaWRlIHdoZXRoZXIgdG8gbWFrZSBrUGVyaW9kTXMgc3RhdGljLgotICAgIHN0YXRpYyBjb25zdCBpbnQga051bUJ1ZmYgPSAzOyAvLyBudW1iZXIgb2YgYnVmZmVycyBjb25zaWRlcmVkIGluIGxvY2FsIGhpc3RvcnkKLSAgICBpbnQga1BlcmlvZE1zOyAvLyBjdXJyZW50IHBlcmlvZCBsZW5ndGggaXMgaWRlYWxseSA0IG1zCi0gICAgc3RhdGljIGNvbnN0IGludCBrT3V0bGllck1zID0gNzsgLy8gdmFsdWVzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gdGhpcyBjYXVzZSBnbGl0Y2hlcwotICAgIC8vIERBQyBwcm9jZXNzaW5nIHRpbWUgZm9yIDQgbXMgYnVmZmVyCi0gICAgc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga1JhdGlvID0gMC43NTsgLy8gZXN0aW1hdGUgb2YgQ1BVIHRpbWUgYXMgcmF0aW8gb2YgcGVyaW9kIGxlbmd0aAotICAgIGludCBrUGVyaW9kTXNDUFU7IC8vIGNvbXB1dGUgYmFzZWQgb24ga1BlcmlvZExlbiBhbmQga1JhdGlvCi0KLSAgICAvLyBQZWFrIGRldGVjdGlvbjogbnVtYmVyIG9mIHN0YW5kYXJkIGRldmlhdGlvbnMgZnJvbSBtZWFuIGNvbnNpZGVyZWQgYSBzaWduaWZpY2FudCBjaGFuZ2UKLSAgICBzdGF0aWMgY29uc3QgaW50IGtTdGRkZXZUaHJlc2hvbGQgPSA1OwotCi0gICAgLy8gY2FwYWNpdHkgYWxsb2NhdGVkIHRvIGRhdGEgc3RydWN0dXJlcwotICAgIC8vIFRPRE86IGFkanVzdCBhbGwgb2YgdGhlc2UgdmFsdWVzCi0gICAgc3RhdGljIGNvbnN0IGludCBrUmVjZW50SGlzdHNDYXBhY2l0eSA9IDEwMDsgLy8gbnVtYmVyIG9mIHNob3J0LXRlcm0gaGlzdG9ncmFtcyBzdG9yZWQgaW4gbWVtb3J5Ci0gICAgc3RhdGljIGNvbnN0IGludCBrU2hvcnRIaXN0U2l6ZSA9IDUwOyAvLyBudW1iZXIgb2Ygc2FtcGxlcyBpbiBhIHNob3J0LXRlcm0gaGlzdG9ncmFtCi0gICAgc3RhdGljIGNvbnN0IGludCBrT3V0bGllclNlcmllc1NpemUgPSAxMDA7IC8vIG51bWJlciBvZiB2YWx1ZXMgc3RvcmVkIGluIG91dGxpZXIgYXJyYXkKLSAgICBzdGF0aWMgY29uc3QgaW50IGtQZWFrU2VyaWVzU2l6ZSA9IDEwMDsgLy8gbnVtYmVyIG9mIHZhbHVlcyBzdG9yZWQgaW4gcGVhayBhcnJheQotICAgIHN0YXRpYyBjb25zdCBpbnQga0xvbmdUZXJtSGlzdHNDYXBhY2l0eSA9IDIwOyAvLyBudW1iZXIgb2YgbG9uZy10ZXJtIGhpc3RvZ3JhbSBzdG9yZWQgaW4gbWVtb3J5Ci0gICAgLy8gbWF4aW11bSBlbGFwc2VkIHRpbWUgYmV0d2VlbiBmaXJzdCBhbmQgbGFzdCB0aW1lc3RhbXAgb2YgYSBsb25nLXRlcm0gaGlzdG9ncmFtCi0gICAgc3RhdGljIGNvbnN0IGludCBrTWF4SGlzdFRpbWVzcGFuTXMgPSA1ICoga01zUGVyU2VjOwotCi0gICAgLy8gdGhlc2UgdmFyaWFibGVzIGFyZSBzdG9yZWQgaW4tY2xhc3MgdG8gZW5zdXJlIGNvbnRpbnVpdHkgd2hpbGUgYW5hbHl6aW5nIHRoZSB0aW1lc3RhbXAKLSAgICAvLyBzZXJpZXMgb25lIHNob3J0IHNlcXVlbmNlIGF0IGEgdGltZTogdGhlIHZhcmlhYmxlcyBhcmUgbm90IHJlLWluaXRpYWxpemVkIGV2ZXJ5IHRpbWUuCi0gICAgLy8gRklYTUU6IGNyZWF0ZSBpbm5lciBjbGFzcyBmb3IgdGhlc2UgdmFyaWFibGVzIGFuZCBkZWNpZGUgd2hpY2ggb3RoZXIgb25lcyB0byBhZGQgdG8gaXQKLSAgICBkb3VibGUgbVBlYWtEZXRlY3Rvck1lYW4gPSAtMTsKLSAgICBkb3VibGUgbVBlYWtEZXRlY3RvclNkID0gLTE7Ci0gICAgLy8gdmFyaWFibGVzIGZvciBzdG9yZU91dGxpZXJEYXRhCi0gICAgdWludDY0X3QgbUVsYXBzZWQgPSAwOwotICAgIGludDY0X3QgbVByZXZOcyA9IC0xOwotCi19OwotCi19IC8vIG5hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZQotCi19ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBBTkRST0lEX01FRElBX1BFUkZPUk1BTkNFQU5BTFlTSVNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9SZXBvcnRQZXJmb3JtYW5jZS5oIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9SZXBvcnRQZXJmb3JtYW5jZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2QyODEwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vUmVwb3J0UGVyZm9ybWFuY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfTUVESUFfUkVQT1JUUEVSRk9STUFOQ0VfSAotI2RlZmluZSBBTkRST0lEX01FRElBX1JFUE9SVFBFUkZPUk1BTkNFX0gKLQotI2luY2x1ZGUgPGRlcXVlPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gVGhpcyBjbGFzcyBpcyB1c2VkIGJ5IHJlcG9ydFBlcmZvcm1hbmNlIGZ1bmN0aW9uCi0vLyBUT0RPIG1vdmUgcmVwb3J0UGVyZm9ybWFuY2UgZnVuY3Rpb24gdG8gUmVwb3J0UGVyZm9ybWFuY2UuY3BwCi1jbGFzcyBTdHJpbmc4OwotCi1uYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UgewotCi0vLyBzdG9yZXMgYSBoaXN0b2dyYW06IGtleTogb2JzZXJ2ZWQgYnVmZmVyIHBlcmlvZC4gdmFsdWU6IGNvdW50Ci0vLyBUT0RPOiB1bnNpZ25lZCwgdW5zaWduZWQKLXVzaW5nIEhpc3RvZ3JhbSA9IHN0ZDo6bWFwPGludCwgaW50PjsKLQotdXNpbmcgb3V0bGllckludGVydmFsID0gdWludDY0X3Q7Ci0vLyBpbnQ2NF90IHRpbWVzdGFtcHMgYXJlIGNvbnZlcnRlZCB0byB1aW50NjRfdCBpbiBQZXJmb3JtYW5jZUFuYWx5c2lzOjpzdG9yZU91dGxpZXJEYXRhLAotLy8gYW5kIGFsbCBhbmFseXNpcyBmdW5jdGlvbnMgdXNlIHVpbnQ2NF90LgotdXNpbmcgdGltZXN0YW1wID0gdWludDY0X3Q7Ci11c2luZyB0aW1lc3RhbXBfcmF3ID0gaW50NjRfdDsKLQotLy8gRklYTUU6IGRlY2lkZSB3aGV0aGVyIHRvIHVzZSA2NCBvciAzMiBiaXRzCi0vLyBUT0RPOiB0aGUgY29kZSBoYXMgYSBtaXggb2YgdHlwZWRlZiBhbmQgdXNpbmcuIFN0YW5kYXJkaXplIHRvIG9uZSBvciB0aGUgb3RoZXIuCi10eXBlZGVmIHVpbnQ2NF90IGxvZ19oYXNoX3Q7Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGRlbHRhTXMoaW50NjRfdCBuczEsIGludDY0X3QgbnMyKSB7Ci0gICAgcmV0dXJuIChuczIgLSBuczEpIC8gKDEwMDAgKiAxMDAwKTsKLX0KLQotc3RhdGljIGlubGluZSB1aW50MzJfdCBsb2cyKHVpbnQzMl90IHgpIHsKLSAgICAvLyBUaGlzIHdvcmtzIGZvciB4ID4gMAotICAgIHJldHVybiAzMSAtIF9fYnVpbHRpbl9jbHooeCk7Ci19Ci0KLS8vIFdyaXRlcyBvdXRsaWVyIGludGVydmFscywgdGltZXN0YW1wcywgYW5kIGhpc3RvZ3JhbXMgc3Bhbm5pbmcgbG9uZyB0aW1lCi0vLyBpbnRlcnZhbHMgdG8gYSBmaWxlLgotdm9pZCB3cml0ZVRvRmlsZShzdGQ6OmRlcXVlPHN0ZDo6cGFpcjxvdXRsaWVySW50ZXJ2YWwsIHRpbWVzdGFtcD4+ICZvdXRsaWVyRGF0YSwKLSAgICAgICAgICAgICAgICAgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8dGltZXN0YW1wLCBIaXN0b2dyYW0+PiAmaGlzdHMsCi0gICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBrTmFtZSwKLSAgICAgICAgICAgICAgICAgYm9vbCBhcHBlbmQpOwotCi19IC8vIG5hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZQotCi19ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBBTkRST0lEX01FRElBX1JFUE9SVFBFUkZPUk1BTkNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJuYmxvZy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0YWFmNzcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJuYmxvZy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMjggQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKworICAgIG5hbWU6ICJsaWJuYmxvZyIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJOQkxvZy5jcHAiLAorICAgICAgICAiUGVyZm9ybWFuY2VBbmFseXNpcy5jcHAiLAorICAgICAgICAiUmVwb3J0UGVyZm9ybWFuY2UuY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsic3lzdGVtL21lZGlhL2F1ZGlvX3V0aWxzL2luY2x1ZGUiXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9OQkxvZy5jcHAgYi9tZWRpYS9saWJuYmxvZy9OQkxvZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZmYTNlMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5ibG9nL05CTG9nLmNwcApAQCAtMCwwICsxLDExNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTkJMb2ciCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2xpbWl0cz4KKyNpbmNsdWRlIDxkZXF1ZT4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxudW1lcmljPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxuZXc+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcm91bmR1cC5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL05CTG9nLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmg+CisjaW5jbHVkZSA8dXRpbHMvQ2FsbFN0YWNrLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCisjaW5jbHVkZSA8cXVldWU+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitpbnQgTkJMb2c6OkVudHJ5Ojpjb3B5RW50cnlEYXRhQXQoc2l6ZV90IG9mZnNldCkgY29uc3QKK3sKKyAgICAvLyBGSVhNRSBUaGlzIGlzIHRvbyBzbG93CisgICAgaWYgKG9mZnNldCA9PSAwKQorICAgICAgICByZXR1cm4gbUV2ZW50OworICAgIGVsc2UgaWYgKG9mZnNldCA9PSAxKQorICAgICAgICByZXR1cm4gbUxlbmd0aDsKKyAgICBlbHNlIGlmIChvZmZzZXQgPCAoc2l6ZV90KSAobUxlbmd0aCArIDIpKQorICAgICAgICByZXR1cm4gKChjaGFyICopIG1EYXRhKVtvZmZzZXQgLSAyXTsKKyAgICBlbHNlIGlmIChvZmZzZXQgPT0gKHNpemVfdCkgKG1MZW5ndGggKyAyKSkKKyAgICAgICAgcmV0dXJuIG1MZW5ndGg7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qc3RhdGljKi8KK3N0ZDo6dW5pcXVlX3B0cjxOQkxvZzo6QWJzdHJhY3RFbnRyeT4gTkJMb2c6OkFic3RyYWN0RW50cnk6OmJ1aWxkRW50cnkoY29uc3QgdWludDhfdCAqcHRyKSB7CisgICAgY29uc3QgdWludDhfdCB0eXBlID0gRW50cnlJdGVyYXRvcihwdHIpLT50eXBlOworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgRVZFTlRfU1RBUlRfRk1UOgorICAgICAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxGb3JtYXRFbnRyeT4oRm9ybWF0RW50cnkocHRyKSk7CisgICAgY2FzZSBFVkVOVF9BVURJT19TVEFURToKKyAgICBjYXNlIEVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUzoKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8SGlzdG9ncmFtRW50cnk+KEhpc3RvZ3JhbUVudHJ5KHB0cikpOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dXKCJUcmllZCB0byBjcmVhdGUgQWJzdHJhY3RFbnRyeSBvZiB0eXBlICVkIiwgdHlwZSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KK30KKworTkJMb2c6OkFic3RyYWN0RW50cnk6OkFic3RyYWN0RW50cnkoY29uc3QgdWludDhfdCAqZW50cnkpIDogbUVudHJ5KGVudHJ5KSB7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOQkxvZzo6RW50cnlJdGVyYXRvciBOQkxvZzo6Rm9ybWF0RW50cnk6OmJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBFbnRyeUl0ZXJhdG9yKG1FbnRyeSk7Cit9CisKK2NvbnN0IGNoYXIgKk5CTG9nOjpGb3JtYXRFbnRyeTo6Zm9ybWF0U3RyaW5nKCkgY29uc3QgeworICAgIHJldHVybiAoY29uc3QgY2hhciopIG1FbnRyeSArIG9mZnNldG9mKGVudHJ5LCBkYXRhKTsKK30KKworc2l6ZV90IE5CTG9nOjpGb3JtYXRFbnRyeTo6Zm9ybWF0U3RyaW5nTGVuZ3RoKCkgY29uc3QgeworICAgIHJldHVybiBtRW50cnlbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldOworfQorCitOQkxvZzo6RW50cnlJdGVyYXRvciBOQkxvZzo6Rm9ybWF0RW50cnk6OmFyZ3MoKSBjb25zdCB7CisgICAgYXV0byBpdCA9IGJlZ2luKCk7CisgICAgLy8gc2tpcCBzdGFydCBmbXQKKyAgICArK2l0OworICAgIC8vIHNraXAgdGltZXN0YW1wCisgICAgKytpdDsKKyAgICAvLyBza2lwIGhhc2gKKyAgICArK2l0OworICAgIC8vIFNraXAgYXV0aG9yIGlmIHByZXNlbnQKKyAgICBpZiAoaXQtPnR5cGUgPT0gRVZFTlRfQVVUSE9SKSB7CisgICAgICAgICsraXQ7CisgICAgfQorICAgIHJldHVybiBpdDsKK30KKworaW50NjRfdCBOQkxvZzo6Rm9ybWF0RW50cnk6OnRpbWVzdGFtcCgpIGNvbnN0IHsKKyAgICBhdXRvIGl0ID0gYmVnaW4oKTsKKyAgICAvLyBza2lwIHN0YXJ0IGZtdAorICAgICsraXQ7CisgICAgcmV0dXJuIGl0LnBheWxvYWQ8aW50NjRfdD4oKTsKK30KKworTkJMb2c6OmxvZ19oYXNoX3QgTkJMb2c6OkZvcm1hdEVudHJ5OjpoYXNoKCkgY29uc3QgeworICAgIGF1dG8gaXQgPSBiZWdpbigpOworICAgIC8vIHNraXAgc3RhcnQgZm10CisgICAgKytpdDsKKyAgICAvLyBza2lwIHRpbWVzdGFtcAorICAgICsraXQ7CisgICAgLy8gdW5hbGlnbmVkIDY0LWJpdCByZWFkIG5vdCBzdXBwb3J0ZWQKKyAgICBsb2dfaGFzaF90IGhhc2g7CisgICAgbWVtY3B5KCZoYXNoLCBpdC0+ZGF0YSwgc2l6ZW9mKGhhc2gpKTsKKyAgICByZXR1cm4gaGFzaDsKK30KKworaW50IE5CTG9nOjpGb3JtYXRFbnRyeTo6YXV0aG9yKCkgY29uc3QgeworICAgIGF1dG8gaXQgPSBiZWdpbigpOworICAgIC8vIHNraXAgc3RhcnQgZm10CisgICAgKytpdDsKKyAgICAvLyBza2lwIHRpbWVzdGFtcAorICAgICsraXQ7CisgICAgLy8gc2tpcCBoYXNoCisgICAgKytpdDsKKyAgICAvLyBpZiB0aGVyZSBpcyBhbiBhdXRob3IgZW50cnksIHJldHVybiBpdCwgcmV0dXJuIC0xIG90aGVyd2lzZQorICAgIGlmIChpdC0+dHlwZSA9PSBFVkVOVF9BVVRIT1IpIHsKKyAgICAgICAgcmV0dXJuIGl0LnBheWxvYWQ8aW50PigpOworICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKK05CTG9nOjpFbnRyeUl0ZXJhdG9yIE5CTG9nOjpGb3JtYXRFbnRyeTo6Y29weVdpdGhBdXRob3IoCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCwgaW50IGF1dGhvcikgY29uc3QgeworICAgIGF1dG8gaXQgPSBiZWdpbigpOworICAgIC8vIGNvcHkgZm10IHN0YXJ0IGVudHJ5CisgICAgaXQuY29weVRvKGRzdCk7CisgICAgLy8gY29weSB0aW1lc3RhbXAKKyAgICAoKytpdCkuY29weVRvKGRzdCk7ICAgIC8vIGNvcHkgaGFzaAorICAgICgrK2l0KS5jb3B5VG8oZHN0KTsKKyAgICAvLyBpbnNlcnQgYXV0aG9yIGVudHJ5CisgICAgc2l6ZV90IGF1dGhvckVudHJ5U2l6ZSA9IE5CTG9nOjpFbnRyeTo6a092ZXJoZWFkICsgc2l6ZW9mKGF1dGhvcik7CisgICAgdWludDhfdCBhdXRob3JFbnRyeVthdXRob3JFbnRyeVNpemVdOworICAgIGF1dGhvckVudHJ5W29mZnNldG9mKGVudHJ5LCB0eXBlKV0gPSBFVkVOVF9BVVRIT1I7CisgICAgYXV0aG9yRW50cnlbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldID0KKyAgICAgICAgYXV0aG9yRW50cnlbYXV0aG9yRW50cnlTaXplICsgTkJMb2c6OkVudHJ5OjprUHJldmlvdXNMZW5ndGhPZmZzZXRdID0KKyAgICAgICAgc2l6ZW9mKGF1dGhvcik7CisgICAgKihpbnQqKSAoJmF1dGhvckVudHJ5W29mZnNldG9mKGVudHJ5LCBkYXRhKV0pID0gYXV0aG9yOworICAgIGRzdC0+d3JpdGUoYXV0aG9yRW50cnksIGF1dGhvckVudHJ5U2l6ZSk7CisgICAgLy8gY29weSByZXN0IG9mIGVudHJpZXMKKyAgICB3aGlsZSAoKCsraXQpLT50eXBlICE9IEVWRU5UX0VORF9GTVQpIHsKKyAgICAgICAgaXQuY29weVRvKGRzdCk7CisgICAgfQorICAgIGl0LmNvcHlUbyhkc3QpOworICAgICsraXQ7CisgICAgcmV0dXJuIGl0OworfQorCit2b2lkIE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpjb3B5VG8oc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0KSBjb25zdCB7CisgICAgc2l6ZV90IGxlbmd0aCA9IHB0cltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gKyBOQkxvZzo6RW50cnk6OmtPdmVyaGVhZDsKKyAgICBkc3QtPndyaXRlKHB0ciwgbGVuZ3RoKTsKK30KKwordm9pZCBOQkxvZzo6RW50cnlJdGVyYXRvcjo6Y29weURhdGEodWludDhfdCAqZHN0KSBjb25zdCB7CisgICAgbWVtY3B5KCh2b2lkKikgZHN0LCBwdHIgKyBvZmZzZXRvZihlbnRyeSwgZGF0YSksIHB0cltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0pOworfQorCitOQkxvZzo6RW50cnlJdGVyYXRvcjo6RW50cnlJdGVyYXRvcigpCisgICAgOiBwdHIobnVsbHB0cikge30KKworTkJMb2c6OkVudHJ5SXRlcmF0b3I6OkVudHJ5SXRlcmF0b3IoY29uc3QgdWludDhfdCAqZW50cnkpCisgICAgOiBwdHIoZW50cnkpIHt9CisKK05CTG9nOjpFbnRyeUl0ZXJhdG9yOjpFbnRyeUl0ZXJhdG9yKGNvbnN0IE5CTG9nOjpFbnRyeUl0ZXJhdG9yICZvdGhlcikKKyAgICA6IHB0cihvdGhlci5wdHIpIHt9CisKK2NvbnN0IE5CTG9nOjplbnRyeSYgTkJMb2c6OkVudHJ5SXRlcmF0b3I6Om9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICByZXR1cm4gKihlbnRyeSopIHB0cjsKK30KKworY29uc3QgTkJMb2c6OmVudHJ5KiBOQkxvZzo6RW50cnlJdGVyYXRvcjo6b3BlcmF0b3ItPigpIGNvbnN0IHsKKyAgICByZXR1cm4gKGVudHJ5KikgcHRyOworfQorCitOQkxvZzo6RW50cnlJdGVyYXRvciYgTkJMb2c6OkVudHJ5SXRlcmF0b3I6Om9wZXJhdG9yKysoKSB7CisgICAgcHRyICs9IHB0cltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gKyBOQkxvZzo6RW50cnk6OmtPdmVyaGVhZDsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK05CTG9nOjpFbnRyeUl0ZXJhdG9yJiBOQkxvZzo6RW50cnlJdGVyYXRvcjo6b3BlcmF0b3ItLSgpIHsKKyAgICBwdHIgLT0gcHRyW05CTG9nOjpFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0XSArIE5CTG9nOjpFbnRyeTo6a092ZXJoZWFkOworICAgIHJldHVybiAqdGhpczsKK30KKworTkJMb2c6OkVudHJ5SXRlcmF0b3IgTkJMb2c6OkVudHJ5SXRlcmF0b3I6Om5leHQoKSBjb25zdCB7CisgICAgRW50cnlJdGVyYXRvciBhdXgoKnRoaXMpOworICAgIHJldHVybiArK2F1eDsKK30KKworTkJMb2c6OkVudHJ5SXRlcmF0b3IgTkJMb2c6OkVudHJ5SXRlcmF0b3I6OnByZXYoKSBjb25zdCB7CisgICAgRW50cnlJdGVyYXRvciBhdXgoKnRoaXMpOworICAgIHJldHVybiAtLWF1eDsKK30KKworaW50IE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpvcGVyYXRvci0oY29uc3QgTkJMb2c6OkVudHJ5SXRlcmF0b3IgJm90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIHB0ciAtIG90aGVyLnB0cjsKK30KKworYm9vbCBOQkxvZzo6RW50cnlJdGVyYXRvcjo6b3BlcmF0b3IhPShjb25zdCBFbnRyeUl0ZXJhdG9yICZvdGhlcikgY29uc3QgeworICAgIHJldHVybiBwdHIgIT0gb3RoZXIucHRyOworfQorCitib29sIE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpoYXNDb25zaXN0ZW50TGVuZ3RoKCkgY29uc3QgeworICAgIHJldHVybiBwdHJbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldID09IHB0cltwdHJbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldICsKKyAgICAgICAgTkJMb2c6OkVudHJ5OjprT3ZlcmhlYWQgKyBOQkxvZzo6RW50cnk6OmtQcmV2aW91c0xlbmd0aE9mZnNldF07Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQ2NF90IE5CTG9nOjpIaXN0b2dyYW1FbnRyeTo6dGltZXN0YW1wKCkgY29uc3QgeworICAgIHJldHVybiBFbnRyeUl0ZXJhdG9yKG1FbnRyeSkucGF5bG9hZDxIaXN0VHNFbnRyeT4oKS50czsKK30KKworTkJMb2c6OmxvZ19oYXNoX3QgTkJMb2c6Okhpc3RvZ3JhbUVudHJ5OjpoYXNoKCkgY29uc3QgeworICAgIHJldHVybiBFbnRyeUl0ZXJhdG9yKG1FbnRyeSkucGF5bG9hZDxIaXN0VHNFbnRyeT4oKS5oYXNoOworfQorCitpbnQgTkJMb2c6Okhpc3RvZ3JhbUVudHJ5OjphdXRob3IoKSBjb25zdCB7CisgICAgRW50cnlJdGVyYXRvciBpdChtRW50cnkpOworICAgIGlmIChpdC0+bGVuZ3RoID09IHNpemVvZihIaXN0VHNFbnRyeVdpdGhBdXRob3IpKSB7CisgICAgICAgIHJldHVybiBpdC5wYXlsb2FkPEhpc3RUc0VudHJ5V2l0aEF1dGhvcj4oKS5hdXRob3I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KKworTkJMb2c6OkVudHJ5SXRlcmF0b3IgTkJMb2c6Okhpc3RvZ3JhbUVudHJ5Ojpjb3B5V2l0aEF1dGhvcigKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0LCBpbnQgYXV0aG9yKSBjb25zdCB7CisgICAgLy8gQ3VycmVudCBoaXN0b2dyYW0gZW50cnkgaGFzIHt0eXBlLCBsZW5ndGgsIHN0cnVjdCBIaXN0VHNFbnRyeSwgbGVuZ3RofS4KKyAgICAvLyBXZSBub3cgd2FudCB7dHlwZSwgbGVuZ3RoLCBzdHJ1Y3QgSGlzdFRzRW50cnlXaXRoQXV0aG9yLCBsZW5ndGh9CisgICAgdWludDhfdCBidWZmZXJbRW50cnk6OmtPdmVyaGVhZCArIHNpemVvZihIaXN0VHNFbnRyeVdpdGhBdXRob3IpXTsKKyAgICAvLyBDb3B5IGNvbnRlbnQgdW50aWwgdGhlIHBvaW50IHdlIHdhbnQgdG8gYWRkIHRoZSBhdXRob3IKKyAgICBtZW1jcHkoYnVmZmVyLCBtRW50cnksIHNpemVvZihlbnRyeSkgKyBzaXplb2YoSGlzdFRzRW50cnkpKTsKKyAgICAvLyBDb3B5IHRoZSBhdXRob3IKKyAgICAqKGludCopIChidWZmZXIgKyBzaXplb2YoZW50cnkpICsgc2l6ZW9mKEhpc3RUc0VudHJ5KSkgPSBhdXRob3I7CisgICAgLy8gVXBkYXRlIGxlbmd0aHMKKyAgICBidWZmZXJbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldID0gc2l6ZW9mKEhpc3RUc0VudHJ5V2l0aEF1dGhvcik7CisgICAgYnVmZmVyW29mZnNldG9mKGVudHJ5LCBkYXRhKSArIHNpemVvZihIaXN0VHNFbnRyeVdpdGhBdXRob3IpICsgb2Zmc2V0b2YoZW5kaW5nLCBsZW5ndGgpXQorICAgICAgICA9IHNpemVvZihIaXN0VHNFbnRyeVdpdGhBdXRob3IpOworICAgIC8vIFdyaXRlIG5ldyBidWZmZXIgaW50byBGSUZPCisgICAgZHN0LT53cml0ZShidWZmZXIsIHNpemVvZihidWZmZXIpKTsKKyAgICByZXR1cm4gRW50cnlJdGVyYXRvcihtRW50cnkpLm5leHQoKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiAwICAgLy8gRklYTUUgc2VlIG5vdGUgaW4gTkJMb2cuaAorTkJMb2c6OlRpbWVsaW5lOjpUaW1lbGluZShzaXplX3Qgc2l6ZSwgdm9pZCAqc2hhcmVkKQorICAgIDogbVNpemUocm91bmR1cChzaXplKSksIG1Pd24oc2hhcmVkID09IE5VTEwpLAorICAgICAgbVNoYXJlZCgoU2hhcmVkICopIChtT3duID8gbmV3IGNoYXJbc2hhcmVkU2l6ZShzaXplKV0gOiBzaGFyZWQpKQoreworICAgIG5ldyAobVNoYXJlZCkgU2hhcmVkOworfQorCitOQkxvZzo6VGltZWxpbmU6On5UaW1lbGluZSgpCit7CisgICAgbVNoYXJlZC0+flNoYXJlZCgpOworICAgIGlmIChtT3duKSB7CisgICAgICAgIGRlbGV0ZVtdIChjaGFyICopIG1TaGFyZWQ7CisgICAgfQorfQorI2VuZGlmCisKKy8qc3RhdGljKi8KK3NpemVfdCBOQkxvZzo6VGltZWxpbmU6OnNoYXJlZFNpemUoc2l6ZV90IHNpemUpCit7CisgICAgLy8gVE9ETyBmaWZvIG5vdyBzdXBwb3J0cyBub24tcG93ZXItb2YtMiBidWZmZXIgc2l6ZXMsIHNvIGNvdWxkIHJlbW92ZSB0aGUgcm91bmR1cAorICAgIHJldHVybiBzaXplb2YoU2hhcmVkKSArIHJvdW5kdXAoc2l6ZSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOQkxvZzo6V3JpdGVyOjpXcml0ZXIoKQorICAgIDogbVNoYXJlZChOVUxMKSwgbUZpZm8oTlVMTCksIG1GaWZvV3JpdGVyKE5VTEwpLCBtRW5hYmxlZChmYWxzZSksIG1QaWRUYWcoTlVMTCksIG1QaWRUYWdTaXplKDApCit7Cit9CisKK05CTG9nOjpXcml0ZXI6OldyaXRlcih2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKQorICAgIDogbVNoYXJlZCgoU2hhcmVkICopIHNoYXJlZCksCisgICAgICBtRmlmbyhtU2hhcmVkICE9IE5VTEwgPworICAgICAgICBuZXcgYXVkaW9fdXRpbHNfZmlmbyhzaXplLCBzaXplb2YodWludDhfdCksCisgICAgICAgICAgICBtU2hhcmVkLT5tQnVmZmVyLCBtU2hhcmVkLT5tUmVhciwgTlVMTCAvKnRocm90dGxlc0Zyb250Ki8pIDogTlVMTCksCisgICAgICBtRmlmb1dyaXRlcihtRmlmbyAhPSBOVUxMID8gbmV3IGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyKCptRmlmbykgOiBOVUxMKSwKKyAgICAgIG1FbmFibGVkKG1GaWZvV3JpdGVyICE9IE5VTEwpCit7CisgICAgLy8gY2FjaGluZyBwaWQgYW5kIHByb2Nlc3MgbmFtZQorICAgIHBpZF90IGlkID0gOjpnZXRwaWQoKTsKKyAgICBjaGFyIHByb2NOYW1lWzE2XTsKKyAgICBpbnQgc3RhdHVzID0gcHJjdGwoUFJfR0VUX05BTUUsIHByb2NOYW1lKTsKKyAgICBpZiAoc3RhdHVzKSB7ICAvLyBlcnJvciBnZXR0aW5nIHByb2Nlc3MgbmFtZQorICAgICAgICBwcm9jTmFtZVswXSA9ICdcMCc7CisgICAgfQorICAgIHNpemVfdCBsZW5ndGggPSBzdHJsZW4ocHJvY05hbWUpOworICAgIG1QaWRUYWdTaXplID0gbGVuZ3RoICsgc2l6ZW9mKHBpZF90KTsKKyAgICBtUGlkVGFnID0gbmV3IGNoYXJbbVBpZFRhZ1NpemVdOworICAgIG1lbWNweShtUGlkVGFnLCAmaWQsIHNpemVvZihwaWRfdCkpOworICAgIG1lbWNweShtUGlkVGFnICsgc2l6ZW9mKHBpZF90KSwgcHJvY05hbWUsIGxlbmd0aCk7Cit9CisKK05CTG9nOjpXcml0ZXI6OldyaXRlcihjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSwgc2l6ZV90IHNpemUpCisgICAgOiBXcml0ZXIoaU1lbW9yeSAhPSAwID8gKFNoYXJlZCAqKSBpTWVtb3J5LT5wb2ludGVyKCkgOiBOVUxMLCBzaXplKQoreworICAgIG1JTWVtb3J5ID0gaU1lbW9yeTsKK30KKworTkJMb2c6OldyaXRlcjo6fldyaXRlcigpCit7CisgICAgZGVsZXRlIG1GaWZvV3JpdGVyOworICAgIGRlbGV0ZSBtRmlmbzsKKyAgICBkZWxldGVbXSBtUGlkVGFnOworfQorCit2b2lkIE5CTG9nOjpXcml0ZXI6OmxvZyhjb25zdCBjaGFyICpzdHJpbmcpCit7CisgICAgaWYgKCFtRW5hYmxlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RyaW5nID09IE5VTEwsICJBdHRlbXB0ZWQgdG8gbG9nIE5VTEwgc3RyaW5nIik7CisgICAgc2l6ZV90IGxlbmd0aCA9IHN0cmxlbihzdHJpbmcpOworICAgIGlmIChsZW5ndGggPiBFbnRyeTo6a01heExlbmd0aCkgeworICAgICAgICBsZW5ndGggPSBFbnRyeTo6a01heExlbmd0aDsKKyAgICB9CisgICAgbG9nKEVWRU5UX1NUUklORywgc3RyaW5nLCBsZW5ndGgpOworfQorCit2b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ2YoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisgICAgaWYgKCFtRW5hYmxlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHZhX2xpc3QgYXA7CisgICAgdmFfc3RhcnQoYXAsIGZtdCk7CisgICAgV3JpdGVyOjpsb2d2ZihmbXQsIGFwKTsgICAgIC8vIHRoZSBXcml0ZXI6OiBpcyBuZWVkZWQgdG8gYXZvaWQgdmlydHVhbCBkaXNwYXRjaCBmb3IgTG9ja2VkV3JpdGVyCisgICAgdmFfZW5kKGFwKTsKK30KKwordm9pZCBOQkxvZzo6V3JpdGVyOjpsb2d2Zihjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApCit7CisgICAgaWYgKCFtRW5hYmxlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNoYXIgYnVmZmVyW0VudHJ5OjprTWF4TGVuZ3RoICsgMSAvKk5VTCovXTsKKyAgICBpbnQgbGVuZ3RoID0gdnNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIGZtdCwgYXApOworICAgIGlmIChsZW5ndGggPj0gKGludCkgc2l6ZW9mKGJ1ZmZlcikpIHsKKyAgICAgICAgbGVuZ3RoID0gc2l6ZW9mKGJ1ZmZlcikgLSAxOworICAgICAgICAvLyBOVUwgdGVybWluYXRpb24gaXMgbm90IHJlcXVpcmVkCisgICAgICAgIC8vIGJ1ZmZlcltsZW5ndGhdID0gJ1wwJzsKKyAgICB9CisgICAgaWYgKGxlbmd0aCA+PSAwKSB7CisgICAgICAgIGxvZyhFVkVOVF9TVFJJTkcsIGJ1ZmZlciwgbGVuZ3RoKTsKKyAgICB9Cit9CisKK3ZvaWQgTkJMb2c6OldyaXRlcjo6bG9nVGltZXN0YW1wKCkKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW50NjRfdCB0cyA9IGdldF9tb25vdG9uaWNfbnMoKTsKKyAgICBpZiAodHMgPiAwKSB7CisgICAgICAgIGxvZyhFVkVOVF9USU1FU1RBTVAsICZ0cywgc2l6ZW9mKHRzKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgdGltZXN0YW1wIik7CisgICAgfQorfQorCit2b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ1RpbWVzdGFtcChjb25zdCBpbnQ2NF90IHRzKQoreworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBsb2coRVZFTlRfVElNRVNUQU1QLCAmdHMsIHNpemVvZih0cykpOworfQorCit2b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ0ludGVnZXIoY29uc3QgaW50IHgpCit7CisgICAgaWYgKCFtRW5hYmxlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGxvZyhFVkVOVF9JTlRFR0VSLCAmeCwgc2l6ZW9mKHgpKTsKK30KKwordm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dGbG9hdChjb25zdCBmbG9hdCB4KQoreworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBsb2coRVZFTlRfRkxPQVQsICZ4LCBzaXplb2YoeCkpOworfQorCit2b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ1BJRCgpCit7CisgICAgaWYgKCFtRW5hYmxlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGxvZyhFVkVOVF9QSUQsIG1QaWRUYWcsIG1QaWRUYWdTaXplKTsKK30KKwordm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dTdGFydChjb25zdCBjaGFyICpmbXQpCit7CisgICAgaWYgKCFtRW5hYmxlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNpemVfdCBsZW5ndGggPSBzdHJsZW4oZm10KTsKKyAgICBpZiAobGVuZ3RoID4gRW50cnk6OmtNYXhMZW5ndGgpIHsKKyAgICAgICAgbGVuZ3RoID0gRW50cnk6OmtNYXhMZW5ndGg7CisgICAgfQorICAgIGxvZyhFVkVOVF9TVEFSVF9GTVQsIGZtdCwgbGVuZ3RoKTsKK30KKwordm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dFbmQoKQoreworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBFbnRyeSBlbnRyeSA9IEVudHJ5KEVWRU5UX0VORF9GTVQsIE5VTEwsIDApOworICAgIGxvZygmZW50cnksIHRydWUpOworfQorCit2b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ0hhc2gobG9nX2hhc2hfdCBoYXNoKQoreworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBsb2coRVZFTlRfSEFTSCwgJmhhc2gsIHNpemVvZihoYXNoKSk7Cit9CisKK3ZvaWQgTkJMb2c6OldyaXRlcjo6bG9nRXZlbnRIaXN0VHMoRXZlbnQgZXZlbnQsIGxvZ19oYXNoX3QgaGFzaCkKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgSGlzdFRzRW50cnkgZGF0YTsKKyAgICBkYXRhLmhhc2ggPSBoYXNoOworICAgIGRhdGEudHMgPSBnZXRfbW9ub3RvbmljX25zKCk7CisgICAgaWYgKGRhdGEudHMgPiAwKSB7CisgICAgICAgIGxvZyhldmVudCwgJmRhdGEsIHNpemVvZihkYXRhKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgdGltZXN0YW1wIik7CisgICAgfQorfQorCit2b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ0Zvcm1hdChjb25zdCBjaGFyICpmbXQsIGxvZ19oYXNoX3QgaGFzaCwgLi4uKQoreworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZhX2xpc3QgYXA7CisgICAgdmFfc3RhcnQoYXAsIGhhc2gpOworICAgIFdyaXRlcjo6bG9nVkZvcm1hdChmbXQsIGhhc2gsIGFwKTsKKyAgICB2YV9lbmQoYXApOworfQorCit2b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ1ZGb3JtYXQoY29uc3QgY2hhciAqZm10LCBsb2dfaGFzaF90IGhhc2gsIHZhX2xpc3QgYXJncCkKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgV3JpdGVyOjpsb2dTdGFydChmbXQpOworICAgIGludCBpOworICAgIGRvdWJsZSBmOworICAgIGNoYXIqIHM7CisgICAgaW50NjRfdCB0OworICAgIFdyaXRlcjo6bG9nVGltZXN0YW1wKCk7CisgICAgV3JpdGVyOjpsb2dIYXNoKGhhc2gpOworICAgIGZvciAoY29uc3QgY2hhciAqcCA9IGZtdDsgKnAgIT0gJ1wwJzsgcCsrKSB7CisgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCBtb3JlIGNvbXBsZXggZm9ybWF0dGluZyBzdWNoIGFzICUuM2YKKyAgICAgICAgaWYgKCpwICE9ICclJykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoKCorK3ApIHsKKyAgICAgICAgY2FzZSAncyc6IC8vIHN0cmluZworICAgICAgICAgICAgcyA9IHZhX2FyZyhhcmdwLCBjaGFyICopOworICAgICAgICAgICAgV3JpdGVyOjpsb2cocyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICd0JzogLy8gdGltZXN0YW1wCisgICAgICAgICAgICB0ID0gdmFfYXJnKGFyZ3AsIGludDY0X3QpOworICAgICAgICAgICAgV3JpdGVyOjpsb2dUaW1lc3RhbXAodCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICdkJzogLy8gaW50ZWdlcgorICAgICAgICAgICAgaSA9IHZhX2FyZyhhcmdwLCBpbnQpOworICAgICAgICAgICAgV3JpdGVyOjpsb2dJbnRlZ2VyKGkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnZic6IC8vIGZsb2F0CisgICAgICAgICAgICBmID0gdmFfYXJnKGFyZ3AsIGRvdWJsZSk7IC8vIGZsb2F0IGFyZ3VtZW50cyBhcmUgcHJvbW90ZWQgdG8gZG91YmxlIGluIHZhcmFyZyBsaXN0cworICAgICAgICAgICAgV3JpdGVyOjpsb2dGbG9hdCgoZmxvYXQpZik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICdwJzogLy8gcGlkCisgICAgICAgICAgICBXcml0ZXI6OmxvZ1BJRCgpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLy8gdGhlICIlXDAiIGNhc2UgZmluaXNoZXMgcGFyc2luZworICAgICAgICBjYXNlICdcMCc6CisgICAgICAgICAgICAtLXA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICclJzoKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HVygiTkJMb2cgV3JpdGVyIHBhcnNlZCBpbnZhbGlkIGZvcm1hdCBzcGVjaWZpZXI6ICVjIiwgKnApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgV3JpdGVyOjpsb2dFbmQoKTsKK30KKwordm9pZCBOQkxvZzo6V3JpdGVyOjpsb2coRXZlbnQgZXZlbnQsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW5ndGgpCit7CisgICAgaWYgKCFtRW5hYmxlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChkYXRhID09IE5VTEwgfHwgbGVuZ3RoID4gRW50cnk6OmtNYXhMZW5ndGgpIHsKKyAgICAgICAgLy8gVE9ETyBQZXJoYXBzIGl0IG1ha2VzIHNlbnNlIHRvIGRpc3BsYXkgdHJ1bmNhdGVkIGRhdGEgb3IgYXQgbGVhc3QgYQorICAgICAgICAvLyAgICAgIG1lc3NhZ2UgdGhhdCB0aGUgZGF0YSBpcyB0b28gbG9uZz8gIFRoZSBjdXJyZW50IGJlaGF2aW9yIGNhbiBjcmVhdGUKKyAgICAgICAgLy8gICAgICBhIGNvbmZ1c2lvbiBmb3IgYSBwcm9ncmFtbWVyIGRlYnVnZ2luZyB0aGVpciBjb2RlLgorICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIElnbm9yZSBpZiBpbnZhbGlkIGV2ZW50CisgICAgaWYgKGV2ZW50ID09IEVWRU5UX1JFU0VSVkVEIHx8IGV2ZW50ID49IEVWRU5UX1VQUEVSX0JPVU5EKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgRW50cnkgZXRyKGV2ZW50LCBkYXRhLCBsZW5ndGgpOworICAgIGxvZygmZXRyLCB0cnVlIC8qdHJ1c3RlZCovKTsKK30KKwordm9pZCBOQkxvZzo6V3JpdGVyOjpsb2coY29uc3QgTkJMb2c6OkVudHJ5ICpldHIsIGJvb2wgdHJ1c3RlZCkKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCF0cnVzdGVkKSB7CisgICAgICAgIGxvZyhldHItPm1FdmVudCwgZXRyLT5tRGF0YSwgZXRyLT5tTGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzaXplX3QgbmVlZCA9IGV0ci0+bUxlbmd0aCArIEVudHJ5OjprT3ZlcmhlYWQ7ICAgIC8vIG1FdmVudCwgbUxlbmd0aCwgZGF0YVttTGVuZ3RoXSwgbUxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCA9IG51bWJlciBvZiBieXRlcyB3cml0dGVuIHRvIEZJRk8KKworICAgIC8vIEZJWE1FIG9wdGltaXplIHRoaXMgdXNpbmcgbWVtY3B5IGZvciB0aGUgZGF0YSBwYXJ0IG9mIHRoZSBFbnRyeS4KKyAgICAvLyBUaGUgRW50cnkgY291bGQgaGF2ZSBhIG1ldGhvZCBjb3B5VG8ocHRyLCBvZmZzZXQsIHNpemUpIHRvIG9wdGltaXplIHRoZSBjb3B5LgorICAgIC8vIGNoZWNrcyBzaXplIG9mIGEgc2luZ2xlIGxvZyBFbnRyeTogdHlwZSwgbGVuZ3RoLCBkYXRhIHBvaW50ZXIgYW5kIGVuZGluZworICAgIHVpbnQ4X3QgdGVtcFtFbnRyeTo6a01heExlbmd0aCArIEVudHJ5OjprT3ZlcmhlYWRdOworICAgIC8vIHdyaXRlIHRoaXMgZGF0YSB0byB0ZW1wIGFycmF5CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuZWVkOyBpKyspIHsKKyAgICAgICAgdGVtcFtpXSA9IGV0ci0+Y29weUVudHJ5RGF0YUF0KGkpOworICAgIH0KKyAgICAvLyB3cml0ZSB0byBjaXJjdWxhciBidWZmZXIKKyAgICBtRmlmb1dyaXRlci0+d3JpdGUodGVtcCwgbmVlZCk7Cit9CisKK2Jvb2wgTkJMb2c6OldyaXRlcjo6aXNFbmFibGVkKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbUVuYWJsZWQ7Cit9CisKK2Jvb2wgTkJMb2c6OldyaXRlcjo6c2V0RW5hYmxlZChib29sIGVuYWJsZWQpCit7CisgICAgYm9vbCBvbGQgPSBtRW5hYmxlZDsKKyAgICBtRW5hYmxlZCA9IGVuYWJsZWQgJiYgbVNoYXJlZCAhPSBOVUxMOworICAgIHJldHVybiBvbGQ7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOQkxvZzo6TG9ja2VkV3JpdGVyOjpMb2NrZWRXcml0ZXIoKQorICAgIDogV3JpdGVyKCkKK3sKK30KKworTkJMb2c6OkxvY2tlZFdyaXRlcjo6TG9ja2VkV3JpdGVyKHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpCisgICAgOiBXcml0ZXIoc2hhcmVkLCBzaXplKQoreworfQorCit2b2lkIE5CTG9nOjpMb2NrZWRXcml0ZXI6OmxvZyhjb25zdCBjaGFyICpzdHJpbmcpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBXcml0ZXI6OmxvZyhzdHJpbmcpOworfQorCit2b2lkIE5CTG9nOjpMb2NrZWRXcml0ZXI6OmxvZ2YoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisgICAgLy8gRklYTUUgc2hvdWxkIG5vdCB0YWtlIHRoZSBsb2NrIHVudGlsIGFmdGVyIGZvcm1hdHRpbmcgaXMgZG9uZQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgdmFfbGlzdCBhcDsKKyAgICB2YV9zdGFydChhcCwgZm10KTsKKyAgICBXcml0ZXI6OmxvZ3ZmKGZtdCwgYXApOworICAgIHZhX2VuZChhcCk7Cit9CisKK3ZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9ndmYoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQoreworICAgIC8vIEZJWE1FIHNob3VsZCBub3QgdGFrZSB0aGUgbG9jayB1bnRpbCBhZnRlciBmb3JtYXR0aW5nIGlzIGRvbmUKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIFdyaXRlcjo6bG9ndmYoZm10LCBhcCk7Cit9CisKK3ZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nVGltZXN0YW1wKCkKK3sKKyAgICAvLyBGSVhNRSBzaG91bGQgbm90IHRha2UgdGhlIGxvY2sgdW50aWwgYWZ0ZXIgdGhlIGNsb2NrX2dldHRpbWUoKSBzeXNjYWxsCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBXcml0ZXI6OmxvZ1RpbWVzdGFtcCgpOworfQorCit2b2lkIE5CTG9nOjpMb2NrZWRXcml0ZXI6OmxvZ1RpbWVzdGFtcChjb25zdCBpbnQ2NF90IHRzKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgV3JpdGVyOjpsb2dUaW1lc3RhbXAodHMpOworfQorCit2b2lkIE5CTG9nOjpMb2NrZWRXcml0ZXI6OmxvZ0ludGVnZXIoY29uc3QgaW50IHgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBXcml0ZXI6OmxvZ0ludGVnZXIoeCk7Cit9CisKK3ZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nRmxvYXQoY29uc3QgZmxvYXQgeCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIFdyaXRlcjo6bG9nRmxvYXQoeCk7Cit9CisKK3ZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nUElEKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIFdyaXRlcjo6bG9nUElEKCk7Cit9CisKK3ZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nU3RhcnQoY29uc3QgY2hhciAqZm10KQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgV3JpdGVyOjpsb2dTdGFydChmbXQpOworfQorCisKK3ZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nRW5kKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIFdyaXRlcjo6bG9nRW5kKCk7Cit9CisKK3ZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nSGFzaChsb2dfaGFzaF90IGhhc2gpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBXcml0ZXI6OmxvZ0hhc2goaGFzaCk7Cit9CisKK2Jvb2wgTkJMb2c6OkxvY2tlZFdyaXRlcjo6aXNFbmFibGVkKCkgY29uc3QKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBXcml0ZXI6OmlzRW5hYmxlZCgpOworfQorCitib29sIE5CTG9nOjpMb2NrZWRXcml0ZXI6OnNldEVuYWJsZWQoYm9vbCBlbmFibGVkKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIFdyaXRlcjo6c2V0RW5hYmxlZChlbmFibGVkKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NvbnN0IHN0ZDo6c2V0PE5CTG9nOjpFdmVudD4gTkJMb2c6OlJlYWRlcjo6c3RhcnRpbmdUeXBlcyB7TkJMb2c6OkV2ZW50OjpFVkVOVF9TVEFSVF9GTVQsCisgICAgICAgIE5CTG9nOjpFdmVudDo6RVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTLAorICAgICAgICBOQkxvZzo6RXZlbnQ6OkVWRU5UX0FVRElPX1NUQVRFfTsKK2NvbnN0IHN0ZDo6c2V0PE5CTG9nOjpFdmVudD4gTkJMb2c6OlJlYWRlcjo6ZW5kaW5nVHlwZXMgICB7TkJMb2c6OkV2ZW50OjpFVkVOVF9FTkRfRk1ULAorICAgICAgICBOQkxvZzo6RXZlbnQ6OkVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUywKKyAgICAgICAgTkJMb2c6OkV2ZW50OjpFVkVOVF9BVURJT19TVEFURX07CisKK05CTG9nOjpSZWFkZXI6OlJlYWRlcihjb25zdCB2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKQorICAgIDogbUZkKC0xKSwgbUluZGVudCgwKSwgbUxvc3QoMCksCisgICAgICBtU2hhcmVkKCgvKmNvbnN0Ki8gU2hhcmVkICopIHNoYXJlZCksIC8qbUlNZW1vcnkqLworICAgICAgbUZpZm8obVNoYXJlZCAhPSBOVUxMID8KKyAgICAgICAgbmV3IGF1ZGlvX3V0aWxzX2ZpZm8oc2l6ZSwgc2l6ZW9mKHVpbnQ4X3QpLAorICAgICAgICAgICAgbVNoYXJlZC0+bUJ1ZmZlciwgbVNoYXJlZC0+bVJlYXIsIE5VTEwgLyp0aHJvdHRsZXNGcm9udCovKSA6IE5VTEwpLAorICAgICAgbUZpZm9SZWFkZXIobUZpZm8gIT0gTlVMTCA/IG5ldyBhdWRpb191dGlsc19maWZvX3JlYWRlcigqbUZpZm8pIDogTlVMTCkKK3sKK30KKworTkJMb2c6OlJlYWRlcjo6UmVhZGVyKGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5LCBzaXplX3Qgc2l6ZSkKKyAgICA6IFJlYWRlcihpTWVtb3J5ICE9IDAgPyAoU2hhcmVkICopIGlNZW1vcnktPnBvaW50ZXIoKSA6IE5VTEwsIHNpemUpCit7CisgICAgbUlNZW1vcnkgPSBpTWVtb3J5OworfQorCitOQkxvZzo6UmVhZGVyOjp+UmVhZGVyKCkKK3sKKyAgICBkZWxldGUgbUZpZm9SZWFkZXI7CisgICAgZGVsZXRlIG1GaWZvOworfQorCitjb25zdCB1aW50OF90ICpOQkxvZzo6UmVhZGVyOjpmaW5kTGFzdEVudHJ5T2ZUeXBlcyhjb25zdCB1aW50OF90ICpmcm9udCwgY29uc3QgdWludDhfdCAqYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8RXZlbnQ+ICZ0eXBlcykgeworICAgIHdoaWxlIChiYWNrICsgRW50cnk6OmtQcmV2aW91c0xlbmd0aE9mZnNldCA+PSBmcm9udCkgeworICAgICAgICBjb25zdCB1aW50OF90ICpwcmV2ID0gYmFjayAtIGJhY2tbRW50cnk6OmtQcmV2aW91c0xlbmd0aE9mZnNldF0gLSBFbnRyeTo6a092ZXJoZWFkOworICAgICAgICBpZiAocHJldiA8IGZyb250IHx8IHByZXYgKyBwcmV2W29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW50cnk6OmtPdmVyaGVhZCAhPSBiYWNrKSB7CisKKyAgICAgICAgICAgIC8vIHByZXYgcG9pbnRzIHRvIGFuIG91dCBvZiBsaW1pdHMgb3IgaW5jb25zaXN0ZW50IGVudHJ5CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZXMuZmluZCgoY29uc3QgRXZlbnQpIHByZXZbb2Zmc2V0b2YoZW50cnksIHR5cGUpXSkgIT0gdHlwZXMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBwcmV2OworICAgICAgICB9CisgICAgICAgIGJhY2sgPSBwcmV2OworICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsgLy8gbm8gZW50cnkgZm91bmQKK30KKworLy8gQ29waWVzIGNvbnRlbnQgb2YgYSBSZWFkZXIgRklGTyBpbnRvIGl0cyBTbmFwc2hvdAorLy8gVGhlIFNuYXBzaG90IGhhcyB0aGUgc2FtZSByYXcgZGF0YSwgYnV0IHJlcHJlc2VudGVkIGFzIGEgc2VxdWVuY2Ugb2YgZW50cmllcworLy8gYW5kIGFuIEVudHJ5SXRlcmF0b3IgbWFraW5nIGl0IHBvc3NpYmxlIHRvIHByb2Nlc3MgdGhlIGRhdGEuCitzdGQ6OnVuaXF1ZV9wdHI8TkJMb2c6OlJlYWRlcjo6U25hcHNob3Q+IE5CTG9nOjpSZWFkZXI6OmdldFNuYXBzaG90KCkKK3sKKyAgICBpZiAobUZpZm9SZWFkZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPE5CTG9nOjpSZWFkZXI6OlNuYXBzaG90PihuZXcgU25hcHNob3QoKSk7CisgICAgfQorICAgIC8vIG1ha2UgYSBjb3B5IHRvIGF2b2lkIHJhY2UgY29uZGl0aW9uIHdpdGggd3JpdGVyCisgICAgc2l6ZV90IGNhcGFjaXR5ID0gbUZpZm8tPmNhcGFjaXR5KCk7CisKKyAgICAvLyBUaGlzIGVtdWxhdGVzIHRoZSBiZWhhdmlvdXIgb2YgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXI6OnJlYWQsIGJ1dCB3aXRob3V0IGluY3JlbWVudGluZyB0aGUKKyAgICAvLyByZWFkZXIgaW5kZXguIFRoZSBpbmRleCBpcyBpbmNyZW1lbnRlZCBhZnRlciBoYW5kbGluZyBjb3JydXB0aW9uLCB0byBhZnRlciB0aGUgbGFzdCBjb21wbGV0ZQorICAgIC8vIGVudHJ5IG9mIHRoZSBidWZmZXIKKyAgICBzaXplX3QgbG9zdDsKKyAgICBhdWRpb191dGlsc19pb3ZlYyBpb3ZlY1syXTsKKyAgICBzc2l6ZV90IGF2YWlsVG9SZWFkID0gbUZpZm9SZWFkZXItPm9idGFpbihpb3ZlYywgY2FwYWNpdHksIE5VTEwgLyp0aW1lb3V0Ki8sICZsb3N0KTsKKyAgICBpZiAoYXZhaWxUb1JlYWQgPD0gMCkgeworICAgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPE5CTG9nOjpSZWFkZXI6OlNuYXBzaG90PihuZXcgU25hcHNob3QoKSk7CisgICAgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90PiBzbmFwc2hvdChuZXcgU25hcHNob3QoYXZhaWxUb1JlYWQpKTsKKyAgICBtZW1jcHkoc25hcHNob3QtPm1EYXRhLCAoY29uc3QgY2hhciAqKSBtRmlmby0+YnVmZmVyKCkgKyBpb3ZlY1swXS5tT2Zmc2V0LCBpb3ZlY1swXS5tTGVuZ3RoKTsKKyAgICBpZiAoaW92ZWNbMV0ubUxlbmd0aCA+IDApIHsKKyAgICAgICAgbWVtY3B5KHNuYXBzaG90LT5tRGF0YSArIChpb3ZlY1swXS5tTGVuZ3RoKSwKKyAgICAgICAgICAgIChjb25zdCBjaGFyICopIG1GaWZvLT5idWZmZXIoKSArIGlvdmVjWzFdLm1PZmZzZXQsIGlvdmVjWzFdLm1MZW5ndGgpOworICAgIH0KKworICAgIC8vIEhhbmRsZSBjb3JydXB0ZWQgYnVmZmVyCisgICAgLy8gUG90ZW50aWFsbHksIGEgYnVmZmVyIGhhcyBjb3JydXB0ZWQgZGF0YSBvbiBib3RoIGJlZ2lubmluZyAoZHVlIHRvIG92ZXJmbG93KSBhbmQgZW5kCisgICAgLy8gKGR1ZSB0byBpbmNvbXBsZXRlIGZvcm1hdCBlbnRyeSkuIEJ1dCBldmVuIGlmIHRoZSBlbmQgZm9ybWF0IGVudHJ5IGlzIGluY29tcGxldGUsCisgICAgLy8gaXQgZW5kcyBpbiBhIGNvbXBsZXRlIGVudHJ5ICh3aGljaCBpcyBub3QgYW4gRU5EX0ZNVCkuIFNvIGlzIHNhZmUgdG8gdHJhdmVyc2UgYmFja3dhcmRzLgorICAgIC8vIFRPRE86IGhhbmRsZSBjbGllbnQgY29ycnVwdGlvbiAoaW4gdGhlIG1pZGRsZSBvZiBhIGJ1ZmZlcikKKworICAgIGNvbnN0IHVpbnQ4X3QgKmJhY2sgPSBzbmFwc2hvdC0+bURhdGEgKyBhdmFpbFRvUmVhZDsKKyAgICBjb25zdCB1aW50OF90ICpmcm9udCA9IHNuYXBzaG90LT5tRGF0YTsKKworICAgIC8vIEZpbmQgbGFzdCBFTkRfRk1ULiA8YmFjaz4gaXMgc2l0dGluZyBvbiBhbiBlbnRyeSB3aGljaCBtaWdodCBiZSB0aGUgbWlkZGxlIG9mIGEgRm9ybWF0RW50cnkuCisgICAgLy8gV2UgZ28gYmFja3dhcmRzIHVudGlsIHdlIGZpbmQgYW4gRVZFTlRfRU5EX0ZNVC4KKyAgICBjb25zdCB1aW50OF90ICpsYXN0RW5kID0gZmluZExhc3RFbnRyeU9mVHlwZXMoZnJvbnQsIGJhY2ssIGVuZGluZ1R5cGVzKTsKKyAgICBpZiAobGFzdEVuZCA9PSBudWxscHRyKSB7CisgICAgICAgIHNuYXBzaG90LT5tRW5kID0gc25hcHNob3QtPm1CZWdpbiA9IEVudHJ5SXRlcmF0b3IoZnJvbnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGVuZCBvZiBzbmFwc2hvdCBwb2ludHMgdG8gYWZ0ZXIgbGFzdCBFTkRfRk1UIGVudHJ5CisgICAgICAgIHNuYXBzaG90LT5tRW5kID0gRW50cnlJdGVyYXRvcihsYXN0RW5kKS5uZXh0KCk7CisgICAgICAgIC8vIGZpbmQgZmlyc3QgU1RBUlRfRk1UCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmZpcnN0U3RhcnQgPSBudWxscHRyOworICAgICAgICBjb25zdCB1aW50OF90ICpmaXJzdFN0YXJ0VG1wID0gc25hcHNob3QtPm1FbmQ7CisgICAgICAgIHdoaWxlICgoZmlyc3RTdGFydFRtcCA9IGZpbmRMYXN0RW50cnlPZlR5cGVzKGZyb250LCBmaXJzdFN0YXJ0VG1wLCBzdGFydGluZ1R5cGVzKSkKKyAgICAgICAgICAgICAgICAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBmaXJzdFN0YXJ0ID0gZmlyc3RTdGFydFRtcDsKKyAgICAgICAgfQorICAgICAgICAvLyBmaXJzdFN0YXJ0IGlzIG51bGwgaWYgbm8gU1RBUlRfRk1UIGVudHJ5IHdhcyBmb3VuZCBiZWZvcmUgbGFzdEVuZAorICAgICAgICBpZiAoZmlyc3RTdGFydCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBzbmFwc2hvdC0+bUJlZ2luID0gc25hcHNob3QtPm1FbmQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzbmFwc2hvdC0+bUJlZ2luID0gRW50cnlJdGVyYXRvcihmaXJzdFN0YXJ0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGFkdmFuY2UgZmlmbyByZWFkZXIgaW5kZXggdG8gYWZ0ZXIgbGFzdCBlbnRyeSByZWFkLgorICAgIG1GaWZvUmVhZGVyLT5yZWxlYXNlKHNuYXBzaG90LT5tRW5kIC0gZnJvbnQpOworCisgICAgc25hcHNob3QtPm1Mb3N0ID0gbG9zdDsKKyAgICByZXR1cm4gc25hcHNob3Q7CisKK30KKworLy8gVGFrZXMgcmF3IGNvbnRlbnQgb2YgdGhlIGxvY2FsIG1lcmdlciBGSUZPLCBwcm9jZXNzZXMgbG9nIGVudHJpZXMsIGFuZAorLy8gd3JpdGVzIHRoZSBkYXRhIHRvIGEgbWFwIG9mIGNsYXNzIFBlcmZvcm1hbmNlQW5hbHlzaXMsIGJhc2VkIG9uIHRoZWlyIHRocmVhZCBJRC4KK3ZvaWQgTkJMb2c6Ok1lcmdlUmVhZGVyOjpnZXRBbmRQcm9jZXNzU25hcHNob3QoTkJMb2c6OlJlYWRlcjo6U25hcHNob3QgJnNuYXBzaG90KQoreworICAgIFN0cmluZzggdGltZXN0YW1wLCBib2R5OworCisgICAgZm9yIChhdXRvIGVudHJ5ID0gc25hcHNob3QuYmVnaW4oKTsgZW50cnkgIT0gc25hcHNob3QuZW5kKCk7KSB7CisgICAgICAgIHN3aXRjaCAoZW50cnktPnR5cGUpIHsKKyAgICAgICAgY2FzZSBFVkVOVF9TVEFSVF9GTVQ6CisgICAgICAgICAgICBlbnRyeSA9IGhhbmRsZUZvcm1hdChGb3JtYXRFbnRyeShlbnRyeSksICZ0aW1lc3RhbXAsICZib2R5KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUzogeworICAgICAgICAgICAgSGlzdFRzRW50cnlXaXRoQXV0aG9yICpkYXRhID0gKEhpc3RUc0VudHJ5V2l0aEF1dGhvciAqKSAoZW50cnktPmRhdGEpOworICAgICAgICAgICAgLy8gVE9ETyBUaGlzIG1lbWNwaWVzIGFyZSBoZXJlIHRvIGF2b2lkIHVuYWxpZ25lZCBtZW1vcnkgYWNjZXNzIGNyYXNoLgorICAgICAgICAgICAgLy8gVGhlcmUncyBwcm9iYWJseSBhIG1vcmUgZWZmaWNpZW50IHdheSB0byBkbyBpdAorICAgICAgICAgICAgbG9nX2hhc2hfdCBoYXNoOworICAgICAgICAgICAgbWVtY3B5KCZoYXNoLCAmKGRhdGEtPmhhc2gpLCBzaXplb2YoaGFzaCkpOworICAgICAgICAgICAgaW50NjRfdCB0czsKKyAgICAgICAgICAgIG1lbWNweSgmdHMsICZkYXRhLT50cywgc2l6ZW9mKHRzKSk7CisgICAgICAgICAgICAvLyBUT0RPOiBoYXNoIGZvciBoaXN0b2dyYW0gdHMgYW5kIGF1ZGlvIHN0YXRlIG5lZWQgdG8gbWF0Y2gKKyAgICAgICAgICAgIC8vIGFuZCBjb3JyZXNwb25kIHRvIGF1ZGlvIHByb2R1Y3Rpb24gc291cmNlIGZpbGUgbG9jYXRpb24KKyAgICAgICAgICAgIG1UaHJlYWRQZXJmb3JtYW5jZUFuYWx5c2lzW2RhdGEtPmF1dGhvcl1bMCAvKmhhc2gqL10ubG9nVHNFbnRyeSh0cyk7CisgICAgICAgICAgICArK2VudHJ5OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBFVkVOVF9BVURJT19TVEFURTogeworICAgICAgICAgICAgSGlzdFRzRW50cnlXaXRoQXV0aG9yICpkYXRhID0gKEhpc3RUc0VudHJ5V2l0aEF1dGhvciAqKSAoZW50cnktPmRhdGEpOworICAgICAgICAgICAgLy8gVE9ETyBUaGlzIG1lbWNwaWVzIGFyZSBoZXJlIHRvIGF2b2lkIHVuYWxpZ25lZCBtZW1vcnkgYWNjZXNzIGNyYXNoLgorICAgICAgICAgICAgLy8gVGhlcmUncyBwcm9iYWJseSBhIG1vcmUgZWZmaWNpZW50IHdheSB0byBkbyBpdAorICAgICAgICAgICAgbG9nX2hhc2hfdCBoYXNoOworICAgICAgICAgICAgbWVtY3B5KCZoYXNoLCAmKGRhdGEtPmhhc2gpLCBzaXplb2YoaGFzaCkpOworICAgICAgICAgICAgLy8gVE9ETzogcmVtb3ZlIHRzIGlmIHVudXNlZAorICAgICAgICAgICAgaW50NjRfdCB0czsKKyAgICAgICAgICAgIG1lbWNweSgmdHMsICZkYXRhLT50cywgc2l6ZW9mKHRzKSk7CisgICAgICAgICAgICBtVGhyZWFkUGVyZm9ybWFuY2VBbmFseXNpc1tkYXRhLT5hdXRob3JdWzAgLypoYXNoKi9dLmhhbmRsZVN0YXRlQ2hhbmdlKCk7CisgICAgICAgICAgICArK2VudHJ5OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBFVkVOVF9FTkRfRk1UOgorICAgICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIndhcm5pbmc6IGdvdCB0byBlbmQgZm9ybWF0IGV2ZW50Iik7CisgICAgICAgICAgICArK2VudHJ5OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfUkVTRVJWRUQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgid2FybmluZzogdW5leHBlY3RlZCBldmVudCAlZCIsIGVudHJ5LT50eXBlKTsKKyAgICAgICAgICAgICsrZW50cnk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBGSVhNRTogZGVjaWRlIHdoZXRoZXIgdG8gcHJpbnQgdGhlIHdhcm5pbmdzIGhlcmUgb3IgZWxzZXdoZXJlCisgICAgaWYgKCFib2R5LmlzRW1wdHkoKSkgeworICAgICAgICBkdW1wTGluZSh0aW1lc3RhbXAsIGJvZHkpOworICAgIH0KK30KKwordm9pZCBOQkxvZzo6TWVyZ2VSZWFkZXI6OmdldEFuZFByb2Nlc3NTbmFwc2hvdCgpCit7CisgICAgLy8gZ2V0IGEgc25hcHNob3QsIHByb2Nlc3MgaXQKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+IHNuYXAgPSBnZXRTbmFwc2hvdCgpOworICAgIGdldEFuZFByb2Nlc3NTbmFwc2hvdCgqc25hcCk7Cit9CisKK3ZvaWQgTkJMb2c6Ok1lcmdlUmVhZGVyOjpkdW1wKGludCBmZCwgaW50IGluZGVudCkgeworICAgIC8vIFRPRE86IGFkZCBhIG11dGV4IGFyb3VuZCBtZWRpYS5sb2cgZHVtcAorICAgIFJlcG9ydFBlcmZvcm1hbmNlOjpkdW1wKGZkLCBpbmRlbnQsIG1UaHJlYWRQZXJmb3JtYW5jZUFuYWx5c2lzKTsKK30KKworLy8gV3JpdGVzIGEgc3RyaW5nIHRvIHRoZSBjb25zb2xlCit2b2lkIE5CTG9nOjpSZWFkZXI6OmR1bXBMaW5lKGNvbnN0IFN0cmluZzggJnRpbWVzdGFtcCwgU3RyaW5nOCAmYm9keSkKK3sKKyAgICBpZiAobUZkID49IDApIHsKKyAgICAgICAgZHByaW50ZihtRmQsICIlLipzJXMgJXNcbiIsIG1JbmRlbnQsICIiLCB0aW1lc3RhbXAuc3RyaW5nKCksIGJvZHkuc3RyaW5nKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dJKCIlLipzJXMgJXMiLCBtSW5kZW50LCAiIiwgdGltZXN0YW1wLnN0cmluZygpLCBib2R5LnN0cmluZygpKTsKKyAgICB9CisgICAgYm9keS5jbGVhcigpOworfQorCitib29sIE5CTG9nOjpSZWFkZXI6OmlzSU1lbW9yeShjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSkgY29uc3QKK3sKKyAgICByZXR1cm4gaU1lbW9yeSAhPSAwICYmIG1JTWVtb3J5ICE9IDAgJiYgaU1lbW9yeS0+cG9pbnRlcigpID09IG1JTWVtb3J5LT5wb2ludGVyKCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIE5CTG9nOjphcHBlbmRUaW1lc3RhbXAoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSkgeworICAgIGludDY0X3QgdHM7CisgICAgbWVtY3B5KCZ0cywgZGF0YSwgc2l6ZW9mKHRzKSk7CisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCJbJWQuJTAzZF0iLCAoaW50KSAodHMgLyAoMTAwMCAqIDEwMDAgKiAxMDAwKSksCisgICAgICAgICAgICAgICAgICAgIChpbnQpICgodHMgLyAoMTAwMCAqIDEwMDApKSAlIDEwMDApKTsKK30KKwordm9pZCBOQkxvZzo6YXBwZW5kSW50KFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpIHsKKyAgICBpbnQgeCA9ICooKGludCopIGRhdGEpOworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiPCVkPiIsIHgpOworfQorCit2b2lkIE5CTG9nOjphcHBlbmRGbG9hdChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKSB7CisgICAgZmxvYXQgZjsKKyAgICBtZW1jcHkoJmYsIGRhdGEsIHNpemVvZihmbG9hdCkpOworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiPCVmPiIsIGYpOworfQorCit2b2lkIE5CTG9nOjphcHBlbmRQSUQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IGxlbmd0aCkgeworICAgIHBpZF90IGlkID0gKigocGlkX3QqKSBkYXRhKTsKKyAgICBjaGFyICogbmFtZSA9ICYoKGNoYXIqKSBkYXRhKVtzaXplb2YocGlkX3QpXTsKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIjxQSUQ6ICVkLCBuYW1lOiAlLipzPiIsIGlkLCAoaW50KSAobGVuZ3RoIC0gc2l6ZW9mKHBpZF90KSksIG5hbWUpOworfQorCitTdHJpbmc4IE5CTG9nOjpidWZmZXJEdW1wKGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCit7CisgICAgU3RyaW5nOCBzdHI7CisgICAgc3RyLmFwcGVuZCgiWyAiKTsKKyAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgIHsKKyAgICAgICAgc3RyLmFwcGVuZEZvcm1hdCgiJWQgIiwgYnVmZmVyW2ldKTsKKyAgICB9CisgICAgc3RyLmFwcGVuZCgiXSIpOworICAgIHJldHVybiBzdHI7Cit9CisKK1N0cmluZzggTkJMb2c6OmJ1ZmZlckR1bXAoY29uc3QgRW50cnlJdGVyYXRvciAmaXQpCit7CisgICAgcmV0dXJuIGJ1ZmZlckR1bXAoaXQsIGl0LT5sZW5ndGggKyBFbnRyeTo6a092ZXJoZWFkKTsKK30KKworTkJMb2c6OkVudHJ5SXRlcmF0b3IgTkJMb2c6OlJlYWRlcjo6aGFuZGxlRm9ybWF0KGNvbnN0IEZvcm1hdEVudHJ5ICZmbXRFbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggKnRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggKmJvZHkpIHsKKyAgICAvLyBsb2cgdGltZXN0YW1wCisgICAgaW50NjRfdCB0cyA9IGZtdEVudHJ5LnRpbWVzdGFtcCgpOworICAgIHRpbWVzdGFtcC0+Y2xlYXIoKTsKKyAgICB0aW1lc3RhbXAtPmFwcGVuZEZvcm1hdCgiWyVkLiUwM2RdIiwgKGludCkgKHRzIC8gKDEwMDAgKiAxMDAwICogMTAwMCkpLAorICAgICAgICAgICAgICAgICAgICAoaW50KSAoKHRzIC8gKDEwMDAgKiAxMDAwKSkgJSAxMDAwKSk7CisKKyAgICAvLyBsb2cgdW5pcXVlIGhhc2gKKyAgICBsb2dfaGFzaF90IGhhc2ggPSBmbXRFbnRyeS5oYXNoKCk7CisgICAgLy8gcHJpbnQgb25seSBsb3dlciAxNmJpdCBvZiBoYXNoIGFzIGhleCBhbmQgbGluZSBhcyBpbnQgdG8gcmVkdWNlIHNwYW0gaW4gdGhlIGxvZworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS40WC0lZCAiLCAoaW50KShoYXNoID4+IDE2KSAmIDB4RkZGRiwgKGludCkgaGFzaCAmIDB4RkZGRik7CisKKyAgICAvLyBsb2cgYXV0aG9yIChpZiBwcmVzZW50KQorICAgIGhhbmRsZUF1dGhvcihmbXRFbnRyeSwgYm9keSk7CisKKyAgICAvLyBsb2cgc3RyaW5nCisgICAgTkJMb2c6OkVudHJ5SXRlcmF0b3IgYXJnID0gZm10RW50cnkuYXJncygpOworCisgICAgY29uc3QgY2hhciogZm10ID0gZm10RW50cnkuZm9ybWF0U3RyaW5nKCk7CisgICAgc2l6ZV90IGZtdF9sZW5ndGggPSBmbXRFbnRyeS5mb3JtYXRTdHJpbmdMZW5ndGgoKTsKKworICAgIGZvciAoc2l6ZV90IGZtdF9vZmZzZXQgPSAwOyBmbXRfb2Zmc2V0IDwgZm10X2xlbmd0aDsgKytmbXRfb2Zmc2V0KSB7CisgICAgICAgIGlmIChmbXRbZm10X29mZnNldF0gIT0gJyUnKSB7CisgICAgICAgICAgICBib2R5LT5hcHBlbmQoJmZtdFtmbXRfb2Zmc2V0XSwgMSk7IC8vIFRPRE8gb3B0aW1pemUgdG8gd3JpdGUgY29uc2VjdXRpdmUgc3RyaW5ncyBhdCBvbmNlCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBjYXNlICIlJSIiCisgICAgICAgIGlmIChmbXRbKytmbXRfb2Zmc2V0XSA9PSAnJScpIHsKKyAgICAgICAgICAgIGJvZHktPmFwcGVuZCgiJSIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gY2FzZSAiJVwwIgorICAgICAgICBpZiAoZm10X29mZnNldCA9PSBmbXRfbGVuZ3RoKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIE5CTG9nOjpFdmVudCBldmVudCA9IChOQkxvZzo6RXZlbnQpIGFyZy0+dHlwZTsKKyAgICAgICAgc2l6ZV90IGxlbmd0aCA9IGFyZy0+bGVuZ3RoOworCisgICAgICAgIC8vIFRPRE8gY2hlY2sgbGVuZ3RoIGZvciBldmVudCB0eXBlIGlzIGNvcnJlY3QKKworICAgICAgICBpZiAoZXZlbnQgPT0gRVZFTlRfRU5EX0ZNVCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgbW9yZSBjb21wbGV4IGZvcm1hdHRpbmcgc3VjaCBhcyAlLjNmCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdHVtID0gYXJnLT5kYXRhOyAvLyBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGV2ZW50IGFyZ3MKKyAgICAgICAgc3dpdGNoKGZtdFtmbXRfb2Zmc2V0XSkKKyAgICAgICAgeworICAgICAgICBjYXNlICdzJzogLy8gc3RyaW5nCisgICAgICAgICAgICBBTE9HV19JRihldmVudCAhPSBFVkVOVF9TVFJJTkcsCisgICAgICAgICAgICAgICAgIk5CTG9nIFJlYWRlciBpbmNvbXBhdGlibGUgZXZlbnQgZm9yIHN0cmluZyBzcGVjaWZpZXI6ICVkIiwgZXZlbnQpOworICAgICAgICAgICAgYm9keS0+YXBwZW5kKChjb25zdCBjaGFyKikgZGF0dW0sIGxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICd0JzogLy8gdGltZXN0YW1wCisgICAgICAgICAgICBBTE9HV19JRihldmVudCAhPSBFVkVOVF9USU1FU1RBTVAsCisgICAgICAgICAgICAgICAgIk5CTG9nIFJlYWRlciBpbmNvbXBhdGlibGUgZXZlbnQgZm9yIHRpbWVzdGFtcCBzcGVjaWZpZXI6ICVkIiwgZXZlbnQpOworICAgICAgICAgICAgYXBwZW5kVGltZXN0YW1wKGJvZHksIGRhdHVtKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ2QnOiAvLyBpbnRlZ2VyCisgICAgICAgICAgICBBTE9HV19JRihldmVudCAhPSBFVkVOVF9JTlRFR0VSLAorICAgICAgICAgICAgICAgICJOQkxvZyBSZWFkZXIgaW5jb21wYXRpYmxlIGV2ZW50IGZvciBpbnRlZ2VyIHNwZWNpZmllcjogJWQiLCBldmVudCk7CisgICAgICAgICAgICBhcHBlbmRJbnQoYm9keSwgZGF0dW0pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnZic6IC8vIGZsb2F0CisgICAgICAgICAgICBBTE9HV19JRihldmVudCAhPSBFVkVOVF9GTE9BVCwKKyAgICAgICAgICAgICAgICAiTkJMb2cgUmVhZGVyIGluY29tcGF0aWJsZSBldmVudCBmb3IgZmxvYXQgc3BlY2lmaWVyOiAlZCIsIGV2ZW50KTsKKyAgICAgICAgICAgIGFwcGVuZEZsb2F0KGJvZHksIGRhdHVtKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ3AnOiAvLyBwaWQKKyAgICAgICAgICAgIEFMT0dXX0lGKGV2ZW50ICE9IEVWRU5UX1BJRCwKKyAgICAgICAgICAgICAgICAiTkJMb2cgUmVhZGVyIGluY29tcGF0aWJsZSBldmVudCBmb3IgcGlkIHNwZWNpZmllcjogJWQiLCBldmVudCk7CisgICAgICAgICAgICBhcHBlbmRQSUQoYm9keSwgZGF0dW0sIGxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR1coIk5CTG9nIFJlYWRlciBlbmNvdW50ZXJlZCB1bmtub3duIGNoYXJhY3RlciAlYyIsIGZtdFtmbXRfb2Zmc2V0XSk7CisgICAgICAgIH0KKyAgICAgICAgKythcmc7CisgICAgfQorICAgIEFMT0dXX0lGKGFyZy0+dHlwZSAhPSBFVkVOVF9FTkRfRk1ULCAiRXhwZWN0ZWQgZW5kIG9mIGZvcm1hdCwgZ290ICVkIiwgYXJnLT50eXBlKTsKKyAgICArK2FyZzsKKyAgICByZXR1cm4gYXJnOworfQorCitOQkxvZzo6TWVyZ2VyOjpNZXJnZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSk6CisgICAgICBtU2hhcmVkKChTaGFyZWQgKikgc2hhcmVkKSwKKyAgICAgIG1GaWZvKG1TaGFyZWQgIT0gTlVMTCA/CisgICAgICAgIG5ldyBhdWRpb191dGlsc19maWZvKHNpemUsIHNpemVvZih1aW50OF90KSwKKyAgICAgICAgICAgIG1TaGFyZWQtPm1CdWZmZXIsIG1TaGFyZWQtPm1SZWFyLCBOVUxMIC8qdGhyb3R0bGVzRnJvbnQqLykgOiBOVUxMKSwKKyAgICAgIG1GaWZvV3JpdGVyKG1GaWZvICE9IE5VTEwgPyBuZXcgYXVkaW9fdXRpbHNfZmlmb193cml0ZXIoKm1GaWZvKSA6IE5VTEwpCisgICAgICB7fQorCit2b2lkIE5CTG9nOjpNZXJnZXI6OmFkZFJlYWRlcihjb25zdCBOQkxvZzo6TmFtZWRSZWFkZXIgJnJlYWRlcikgeworCisgICAgLy8gRklYTUUgVGhpcyBpcyBjYWxsZWQgYnkgYmluZGVyIHRocmVhZCBpbiBNZWRpYUxvZ1NlcnZpY2U6OnJlZ2lzdGVyV3JpdGVyCisgICAgLy8gICAgICAgYnV0IHRoZSBhY2Nlc3MgdG8gc2hhcmVkIHZhcmlhYmxlIG1OYW1lZFJlYWRlcnMgaXMgbm90IHlldCBwcm90ZWN0ZWQgYnkgYSBsb2NrLgorICAgIG1OYW1lZFJlYWRlcnMucHVzaF9iYWNrKHJlYWRlcik7Cit9CisKKy8vIGl0ZW1zIHBsYWNlZCBpbiBwcmlvcml0eSBxdWV1ZSBkdXJpbmcgbWVyZ2UKKy8vIGNvbXBvc2VkIGJ5IGEgdGltZXN0YW1wIGFuZCB0aGUgaW5kZXggb2YgdGhlIHNuYXBzaG90IHdoZXJlIHRoZSB0aW1lc3RhbXAgY2FtZSBmcm9tCitzdHJ1Y3QgTWVyZ2VJdGVtCit7CisgICAgaW50NjRfdCB0czsKKyAgICBpbnQgaW5kZXg7CisgICAgTWVyZ2VJdGVtKGludDY0X3QgdHMsIGludCBpbmRleCk6IHRzKHRzKSwgaW5kZXgoaW5kZXgpIHt9Cit9OworCisvLyBvcGVyYXRvcnMgbmVlZGVkIGZvciBwcmlvcml0eSBxdWV1ZSBpbiBtZXJnZQorLy8gYm9vbCBvcGVyYXRvcj4oY29uc3QgaW50NjRfdCAmdDEsIGNvbnN0IGludDY0X3QgJnQyKSB7CisvLyAgICAgcmV0dXJuIHQxLnR2X3NlYyA+IHQyLnR2X3NlYyB8fCAodDEudHZfc2VjID09IHQyLnR2X3NlYyAmJiB0MS50dl9uc2VjID4gdDIudHZfbnNlYyk7CisvLyB9CisKK2Jvb2wgb3BlcmF0b3I+KGNvbnN0IHN0cnVjdCBNZXJnZUl0ZW0gJmkxLCBjb25zdCBzdHJ1Y3QgTWVyZ2VJdGVtICZpMikgeworICAgIHJldHVybiBpMS50cyA+IGkyLnRzIHx8IChpMS50cyA9PSBpMi50cyAmJiBpMS5pbmRleCA+IGkyLmluZGV4KTsKK30KKworLy8gTWVyZ2UgcmVnaXN0ZXJlZCByZWFkZXJzLCBzb3J0ZWQgYnkgdGltZXN0YW1wLCBhbmQgd3JpdGUgZGF0YSB0byBhIHNpbmdsZSBGSUZPIGluIGxvY2FsIG1lbW9yeQordm9pZCBOQkxvZzo6TWVyZ2VyOjptZXJnZSgpIHsKKyAgICAvLyBGSVhNRSBUaGlzIGlzIGNhbGxlZCBieSBtZXJnZSB0aHJlYWQKKyAgICAvLyAgICAgICBidXQgdGhlIGFjY2VzcyB0byBzaGFyZWQgdmFyaWFibGUgbU5hbWVkUmVhZGVycyBpcyBub3QgeWV0IHByb3RlY3RlZCBieSBhIGxvY2suCisgICAgaW50IG5Mb2dzID0gbU5hbWVkUmVhZGVycy5zaXplKCk7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPE5CTG9nOjpSZWFkZXI6OlNuYXBzaG90Pj4gc25hcHNob3RzKG5Mb2dzKTsKKyAgICBzdGQ6OnZlY3RvcjxOQkxvZzo6RW50cnlJdGVyYXRvcj4gb2Zmc2V0cyhuTG9ncyk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuTG9nczsgKytpKSB7CisgICAgICAgIHNuYXBzaG90c1tpXSA9IG1OYW1lZFJlYWRlcnNbaV0ucmVhZGVyKCktPmdldFNuYXBzaG90KCk7CisgICAgICAgIG9mZnNldHNbaV0gPSBzbmFwc2hvdHNbaV0tPmJlZ2luKCk7CisgICAgfQorICAgIC8vIGluaXRpYWxpemUgb2Zmc2V0cworICAgIC8vIFRPRE8gY3VzdG9tIGhlYXAgaW1wbGVtZW50YXRpb24gY291bGQgYWxsb3cgdG8gdXBkYXRlIHRvcCwgaW1wcm92aW5nIHBlcmZvcm1hbmNlCisgICAgLy8gZm9yIGJ1cnN0eSBidWZmZXJzCisgICAgc3RkOjpwcmlvcml0eV9xdWV1ZTxNZXJnZUl0ZW0sIHN0ZDo6dmVjdG9yPE1lcmdlSXRlbT4sIHN0ZDo6Z3JlYXRlcjxNZXJnZUl0ZW0+PiB0aW1lc3RhbXBzOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkxvZ3M7ICsraSkKKyAgICB7CisgICAgICAgIGlmIChvZmZzZXRzW2ldICE9IHNuYXBzaG90c1tpXS0+ZW5kKCkpIHsKKyAgICAgICAgICAgIGludDY0X3QgdHMgPSBBYnN0cmFjdEVudHJ5OjpidWlsZEVudHJ5KG9mZnNldHNbaV0pLT50aW1lc3RhbXAoKTsKKyAgICAgICAgICAgIHRpbWVzdGFtcHMuZW1wbGFjZSh0cywgaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB3aGlsZSAoIXRpbWVzdGFtcHMuZW1wdHkoKSkgeworICAgICAgICAvLyBmaW5kIG1pbmltdW0gdGltZXN0YW1wCisgICAgICAgIGludCBpbmRleCA9IHRpbWVzdGFtcHMudG9wKCkuaW5kZXg7CisgICAgICAgIC8vIGNvcHkgaXQgdG8gdGhlIGxvZywgaW5jcmVhc2luZyBvZmZzZXQKKyAgICAgICAgb2Zmc2V0c1tpbmRleF0gPSBBYnN0cmFjdEVudHJ5OjpidWlsZEVudHJ5KG9mZnNldHNbaW5kZXhdKS0+Y29weVdpdGhBdXRob3IobUZpZm9Xcml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKKyAgICAgICAgLy8gdXBkYXRlIGRhdGEgc3RydWN0dXJlcworICAgICAgICB0aW1lc3RhbXBzLnBvcCgpOworICAgICAgICBpZiAob2Zmc2V0c1tpbmRleF0gIT0gc25hcHNob3RzW2luZGV4XS0+ZW5kKCkpIHsKKyAgICAgICAgICAgIGludDY0X3QgdHMgPSBBYnN0cmFjdEVudHJ5OjpidWlsZEVudHJ5KG9mZnNldHNbaW5kZXhdKS0+dGltZXN0YW1wKCk7CisgICAgICAgICAgICB0aW1lc3RhbXBzLmVtcGxhY2UodHMsIGluZGV4KTsKKyAgICAgICAgfQorICAgIH0KK30KKworY29uc3Qgc3RkOjp2ZWN0b3I8TkJMb2c6Ok5hbWVkUmVhZGVyPiYgTkJMb2c6Ok1lcmdlcjo6Z2V0TmFtZWRSZWFkZXJzKCkgY29uc3QgeworICAgIC8vIEZJWE1FIFRoaXMgaXMgcmV0dXJuaW5nIGEgcmVmZXJlbmNlIHRvIGEgc2hhcmVkIHZhcmlhYmxlIHRoYXQgbmVlZHMgYSBsb2NrCisgICAgcmV0dXJuIG1OYW1lZFJlYWRlcnM7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOQkxvZzo6TWVyZ2VSZWFkZXI6Ok1lcmdlUmVhZGVyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUsIE1lcmdlciAmbWVyZ2VyKQorICAgIDogUmVhZGVyKHNoYXJlZCwgc2l6ZSksIG1OYW1lZFJlYWRlcnMobWVyZ2VyLmdldE5hbWVkUmVhZGVycygpKSB7fQorCit2b2lkIE5CTG9nOjpNZXJnZVJlYWRlcjo6aGFuZGxlQXV0aG9yKGNvbnN0IE5CTG9nOjpBYnN0cmFjdEVudHJ5ICZlbnRyeSwgU3RyaW5nOCAqYm9keSkgeworICAgIGludCBhdXRob3IgPSBlbnRyeS5hdXRob3IoKTsKKyAgICAvLyBGSVhNRSBOZWVkcyBhIGxvY2sKKyAgICBjb25zdCBjaGFyKiBuYW1lID0gbU5hbWVkUmVhZGVyc1thdXRob3JdLm5hbWUoKTsKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiVzOiAiLCBuYW1lKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05CTG9nOjpNZXJnZVRocmVhZDo6TWVyZ2VUaHJlYWQoTkJMb2c6Ok1lcmdlciAmbWVyZ2VyLCBOQkxvZzo6TWVyZ2VSZWFkZXIgJm1lcmdlUmVhZGVyKQorICAgIDogbU1lcmdlcihtZXJnZXIpLAorICAgICAgbU1lcmdlUmVhZGVyKG1lcmdlUmVhZGVyKSwKKyAgICAgIG1UaW1lb3V0VXMoMCkge30KKworTkJMb2c6Ok1lcmdlVGhyZWFkOjp+TWVyZ2VUaHJlYWQoKSB7CisgICAgLy8gc2V0IGV4aXQgZmxhZywgc2V0IHRpbWVvdXQgdG8gMCB0byBmb3JjZSB0aHJlYWRMb29wIHRvIGV4aXQgYW5kIHdhaXQgZm9yIHRoZSB0aHJlYWQgdG8gam9pbgorICAgIHJlcXVlc3RFeGl0KCk7CisgICAgc2V0VGltZW91dFVzKDApOworICAgIGpvaW4oKTsKK30KKworYm9vbCBOQkxvZzo6TWVyZ2VUaHJlYWQ6OnRocmVhZExvb3AoKSB7CisgICAgYm9vbCBkb01lcmdlOworICAgIHsKKyAgICAgICAgQXV0b011dGV4IF9sKG1NdXRleCk7CisgICAgICAgIC8vIElmIG1UaW1lb3V0VXMgaXMgbmVnYXRpdmUsIHdhaXQgb24gdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSB1bnRpbCBpdCdzIHBvc2l0aXZlLgorICAgICAgICAvLyBJZiBpdCdzIHBvc2l0aXZlLCB3YWl0IGtUaHJlYWRTbGVlcFBlcmlvZFVzIGFuZCB0aGVuIG1lcmdlCisgICAgICAgIG5zZWNzX3Qgd2FpdFRpbWUgPSBtVGltZW91dFVzID4gMCA/IGtUaHJlYWRTbGVlcFBlcmlvZFVzICogMTAwMCA6IExMT05HX01BWDsKKyAgICAgICAgbUNvbmQud2FpdFJlbGF0aXZlKG1NdXRleCwgd2FpdFRpbWUpOworICAgICAgICBkb01lcmdlID0gbVRpbWVvdXRVcyA+IDA7CisgICAgICAgIG1UaW1lb3V0VXMgLT0ga1RocmVhZFNsZWVwUGVyaW9kVXM7CisgICAgfQorICAgIGlmIChkb01lcmdlKSB7CisgICAgICAgIC8vIE1lcmdlIGRhdGEgZnJvbSBhbGwgdGhlIHJlYWRlcnMKKyAgICAgICAgbU1lcmdlci5tZXJnZSgpOworICAgICAgICAvLyBQcm9jZXNzIHRoZSBkYXRhIGNvbGxlY3RlZCBieSBtTWVyZ2VyIGFuZCB3cml0ZSBpdCB0byBQZXJmb3JtYW5jZUFuYWx5c2lzCisgICAgICAgIC8vIEZJWE1FOiBkZWNpZGUgd2hldGhlciB0byBjYWxsIGdldEFuZFByb2Nlc3NTbmFwc2hvdCBldmVyeSB0aW1lCisgICAgICAgIC8vIG9yIHdoZXRoZXIgdG8gaGF2ZSBhIHNlcGFyYXRlIHRocmVhZCB0aGF0IGNhbGxzIGl0IHdpdGggYSBsb3dlciBmcmVxdWVuY3kKKyAgICAgICAgbU1lcmdlUmVhZGVyLmdldEFuZFByb2Nlc3NTbmFwc2hvdCgpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBOQkxvZzo6TWVyZ2VUaHJlYWQ6Ondha2V1cCgpIHsKKyAgICBzZXRUaW1lb3V0VXMoa1RocmVhZFdha2V1cFBlcmlvZFVzKTsKK30KKwordm9pZCBOQkxvZzo6TWVyZ2VUaHJlYWQ6OnNldFRpbWVvdXRVcyhpbnQgdGltZSkgeworICAgIEF1dG9NdXRleCBfbChtTXV0ZXgpOworICAgIG1UaW1lb3V0VXMgPSB0aW1lOworICAgIG1Db25kLnNpZ25hbCgpOworfQorCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuY3BwIGIvbWVkaWEvbGlibmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA5ZTkzZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuY3BwCkBAIC0wLDAgKzEsMzc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjZGVmaW5lIExPR19UQUcgIlBlcmZvcm1hbmNlQW5hbHlzaXMiCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNsaW1pdHM+CisjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPG51bWVyaWM+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPG5ldz4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9yb3VuZHVwLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvTkJMb2cuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKKyNpbmNsdWRlIDxxdWV1ZT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZSB7CisKKy8vIEdpdmVuIGFuIGF1ZGlvIHByb2Nlc3Npbmcgd2FrZXVwIHRpbWVzdGFtcCwgYnVja2V0cyB0aGUgdGltZSBpbnRlcnZhbAorLy8gc2luY2UgdGhlIHByZXZpb3VzIHRpbWVzdGFtcCBpbnRvIGEgaGlzdG9ncmFtLCBzZWFyY2hlcyBmb3IKKy8vIG91dGxpZXJzLCBhbmFseXplcyB0aGUgb3V0bGllciBzZXJpZXMgZm9yIHVuZXhwZWN0ZWRseQorLy8gc21hbGwgb3IgbGFyZ2UgdmFsdWVzIGFuZCBzdG9yZXMgdGhlc2UgYXMgcGVha3MKK3ZvaWQgUGVyZm9ybWFuY2VBbmFseXNpczo6bG9nVHNFbnRyeSh0aW1lc3RhbXAgdHMpIHsKKyAgICAvLyBhZnRlciBhIHN0YXRlIGNoYW5nZSwgc3RhcnQgYSBuZXcgc2VyaWVzIGFuZCBkbyBub3QKKyAgICAvLyByZWNvcmQgdGltZSBpbnRlcnZhbHMgaW4tYmV0d2VlbgorICAgIGlmIChtQnVmZmVyUGVyaW9kLm1QcmV2VHMgPT0gMCkgeworICAgICAgICBtQnVmZmVyUGVyaW9kLm1QcmV2VHMgPSB0czsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGNhbGN1bGF0ZSB0aW1lIGludGVydmFsIGJldHdlZW4gY3VycmVudCBhbmQgcHJldmlvdXMgdGltZXN0YW1wCisgICAgY29uc3QgbXNJbnRlcnZhbCBkaWZmTXMgPSBzdGF0aWNfY2FzdDxtc0ludGVydmFsPigKKyAgICAgICAgZGVsdGFNcyhtQnVmZmVyUGVyaW9kLm1QcmV2VHMsIHRzKSk7CisKKyAgICBjb25zdCBpbnQgZGlmZkppZmZ5ID0gZGVsdGFKaWZmeShtQnVmZmVyUGVyaW9kLm1QcmV2VHMsIHRzKTsKKworICAgIC8vIG9sZCB2ZXJzdXMgbmV3IHdlaWdodCByYXRpbyB3aGVuIHVwZGF0aW5nIHRoZSBidWZmZXIgcGVyaW9kIG1lYW4KKyAgICBzdGF0aWMgY29uc3RleHByIGRvdWJsZSBleHBvbmVudGlhbFdlaWdodCA9IDAuOTk5OworICAgIC8vIHVwZGF0ZSBidWZmZXIgcGVyaW9kIG1lYW4gd2l0aCBleHBvbmVudGlhbCB3ZWlnaHRpbmcKKyAgICBtQnVmZmVyUGVyaW9kLm1NZWFuID0gKG1CdWZmZXJQZXJpb2QubU1lYW4gPCAwKSA/IGRpZmZNcyA6CisgICAgICAgICAgICBleHBvbmVudGlhbFdlaWdodCAqIG1CdWZmZXJQZXJpb2QubU1lYW4gKyAoMS4wIC0gZXhwb25lbnRpYWxXZWlnaHQpICogZGlmZk1zOworICAgIC8vIHNldCBtT3V0bGllckZhY3RvciB0byBhIHNtYWxsZXIgdmFsdWUgZm9yIHRoZSBmYXN0bWl4ZXIgdGhyZWFkCisgICAgY29uc3QgaW50IGtGYXN0TWl4ZXJNYXggPSAxMDsKKyAgICAvLyBOb3JtYWxNaXhlciB0aW1lcyB2YXJ5IG11Y2ggbW9yZSB0aGFuIEZhc3RNaXhlciB0aW1lcy4KKyAgICAvLyBUT0RPOiBtT3V0bGllckZhY3RvciB2YWx1ZXMgYXJlIHNldCBlbXBpcmljYWxseSBiYXNlZCBvbiB3aGF0IGFwcGVhcnMgdG8gYmUKKyAgICAvLyBhbiBvdXRsaWVyLiBMZWFybiB0aGVzZSB2YWx1ZXMgZnJvbSB0aGUgZGF0YS4KKyAgICBtQnVmZmVyUGVyaW9kLm1PdXRsaWVyRmFjdG9yID0gbUJ1ZmZlclBlcmlvZC5tTWVhbiA8IGtGYXN0TWl4ZXJNYXggPyAxLjggOiAyLjA7CisgICAgLy8gc2V0IG91dGxpZXIgdGhyZXNob2xkCisgICAgbUJ1ZmZlclBlcmlvZC5tT3V0bGllciA9IG1CdWZmZXJQZXJpb2QubU1lYW4gKiBtQnVmZmVyUGVyaW9kLm1PdXRsaWVyRmFjdG9yOworCisgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgdGltZSBpbnRlcnZhbCBiZXR3ZWVuIHRoZSBjdXJyZW50IHRpbWVzdGFtcAorICAgIC8vIGFuZCB0aGUgcHJldmlvdXMgb25lIGlzIGxvbmcgZW5vdWdoIHRvIGNvdW50IGFzIGFuIG91dGxpZXIKKyAgICBjb25zdCBib29sIGlzT3V0bGllciA9IGRldGVjdEFuZFN0b3JlT3V0bGllcihkaWZmTXMpOworICAgIC8vIElmIGFuIG91dGxpZXIgd2FzIGZvdW5kLCBjaGVjayB3aGV0aGVyIGl0IHdhcyBhIHBlYWsKKyAgICBpZiAoaXNPdXRsaWVyKSB7CisgICAgICAgIC8qYm9vbCBpc1BlYWsgPSovIGRldGVjdEFuZFN0b3JlUGVhaygKKyAgICAgICAgICAgIG1PdXRsaWVyRGF0YVswXS5maXJzdCwgbU91dGxpZXJEYXRhWzBdLnNlY29uZCk7CisgICAgICAgIC8vIFRPRE86IGRlY2lkZSB3aGV0aGVyIHRvIGluc2VydCBhIG5ldyBlbXB0eSBoaXN0b2dyYW0gaWYgYSBwZWFrCisgICAgICAgIC8vIFRPRE86IHJlbW92ZSBpc1BlYWsgaWYgdW51c2VkIHRvIGF2b2lkICJ1bnVzZWQgdmFyaWFibGUiIGVycm9yCisgICAgICAgIC8vIG9jY3VycmVkIGF0IHRoZSBjdXJyZW50IHRpbWVzdGFtcAorICAgIH0KKworICAgIC8vIEluc2VydCBhIGhpc3RvZ3JhbSB0byBtSGlzdHMgaWYgaXQgaXMgZW1wdHksIG9yCisgICAgLy8gY2xvc2UgdGhlIGN1cnJlbnQgaGlzdG9ncmFtIGFuZCBpbnNlcnQgYSBuZXcgZW1wdHkgb25lIGlmCisgICAgLy8gaWYgdGhlIGN1cnJlbnQgaGlzdG9ncmFtIGhhcyBzcGFubmVkIGl0cyBtYXhpbXVtIHRpbWUgaW50ZXJ2YWwuCisgICAgaWYgKG1IaXN0cy5lbXB0eSgpIHx8CisgICAgICAgIGRlbHRhTXMobUhpc3RzWzBdLmZpcnN0LCB0cykgPj0ga01heExlbmd0aC5IaXN0VGltZXNwYW5NcykgeworICAgICAgICBtSGlzdHMuZW1wbGFjZV9mcm9udCh0cywgc3RkOjptYXA8aW50LCBpbnQ+KCkpOworICAgICAgICAvLyBXaGVuIG1lbW9yeSBpcyBmdWxsLCBkZWxldGUgb2xkZXN0IGhpc3RvZ3JhbQorICAgICAgICAvLyBUT0RPOiB1c2UgYSBjaXJjdWxhciBidWZmZXIKKyAgICAgICAgaWYgKG1IaXN0cy5zaXplKCkgPj0ga01heExlbmd0aC5IaXN0cykgeworICAgICAgICAgICAgbUhpc3RzLnJlc2l6ZShrTWF4TGVuZ3RoLkhpc3RzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBhZGQgY3VycmVudCB0aW1lIGludGVydmFscyB0byBoaXN0b2dyYW0KKyAgICArK21IaXN0c1swXS5zZWNvbmRbZGlmZkppZmZ5XTsKKyAgICAvLyB1cGRhdGUgcHJldmlvdXMgdGltZXN0YW1wCisgICAgbUJ1ZmZlclBlcmlvZC5tUHJldlRzID0gdHM7Cit9CisKKworLy8gZm9yY2VzIHNob3J0LXRlcm0gaGlzdG9ncmFtIHN0b3JhZ2UgdG8gYXZvaWQgYWRkaW5nIGlkbGUgYXVkaW8gdGltZSBpbnRlcnZhbAorLy8gdG8gYnVmZmVyIHBlcmlvZCBkYXRhCit2b2lkIFBlcmZvcm1hbmNlQW5hbHlzaXM6OmhhbmRsZVN0YXRlQ2hhbmdlKCkgeworICAgIG1CdWZmZXJQZXJpb2QubVByZXZUcyA9IDA7CisgICAgcmV0dXJuOworfQorCisKKy8vIENoZWNrcyB3aGV0aGVyIHRoZSB0aW1lIGludGVydmFsIGJldHdlZW4gdHdvIG91dGxpZXJzIGlzIGZhciBlbm91Z2ggZnJvbQorLy8gYSB0eXBpY2FsIGRlbHRhIHRvIGJlIGNvbnNpZGVyZWQgYSBwZWFrLgorLy8gbG9va3MgZm9yIGNoYW5nZXMgaW4gZGlzdHJpYnV0aW9uIChwZWFrcyksIHdoaWNoIGNhbiBiZSBlaXRoZXIgcG9zaXRpdmUgb3IgbmVnYXRpdmUuCisvLyBUaGUgZnVuY3Rpb24gc2V0cyB0aGUgbWVhbiB0byB0aGUgc3RhcnRpbmcgdmFsdWUgYW5kIHNpZ21hIHRvIDAsIGFuZCB1cGRhdGVzCisvLyB0aGVtIGFzIGxvbmcgYXMgbm8gcGVhayBpcyBkZXRlY3RlZC4gV2hlbiBhIHZhbHVlIGlzIG1vcmUgdGhhbiAndGhyZXNob2xkJworLy8gc3RhbmRhcmQgZGV2aWF0aW9ucyBmcm9tIHRoZSBtZWFuLCBhIHBlYWsgaXMgZGV0ZWN0ZWQgYW5kIHRoZSBtZWFuIGFuZCBzaWdtYQorLy8gYXJlIHNldCB0byB0aGUgcGVhayB2YWx1ZSBhbmQgMC4KK2Jvb2wgUGVyZm9ybWFuY2VBbmFseXNpczo6ZGV0ZWN0QW5kU3RvcmVQZWFrKG1zSW50ZXJ2YWwgZGlmZiwgdGltZXN0YW1wIHRzKSB7CisgICAgYm9vbCBpc1BlYWsgPSBmYWxzZTsKKyAgICBpZiAobU91dGxpZXJEYXRhLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBVcGRhdGUgbWVhbiBvZiB0aGUgZGlzdHJpYnV0aW9uCisgICAgLy8gVHlwaWNhbERpZmYgaXMgdXNlZCB0byBjaGVjayB3aGV0aGVyIGEgdmFsdWUgaXMgdW51c3VhbGx5IGxhcmdlCisgICAgLy8gd2hlbiB3ZSBjYW5ub3QgdXNlIHN0YW5kYXJkIGRldmlhdGlvbnMgZnJvbSB0aGUgbWVhbiBiZWNhdXNlIHRoZSBzZCBpcyBzZXQgdG8gMC4KKyAgICBtT3V0bGllckRpc3RyaWJ1dGlvbi5tVHlwaWNhbERpZmYgPSAobU91dGxpZXJEaXN0cmlidXRpb24ubVR5cGljYWxEaWZmICoKKyAgICAgICAgICAgIChtT3V0bGllckRhdGEuc2l6ZSgpIC0gMSkgKyBkaWZmKSAvIG1PdXRsaWVyRGF0YS5zaXplKCk7CisKKyAgICAvLyBJbml0aWFsaXplIHNob3J0LXRlcm0gbWVhbiBhdCBzdGFydCBvZiBwcm9ncmFtCisgICAgaWYgKG1PdXRsaWVyRGlzdHJpYnV0aW9uLm1NZWFuID09IDApIHsKKyAgICAgICAgbU91dGxpZXJEaXN0cmlidXRpb24ubU1lYW4gPSBkaWZmOworICAgIH0KKyAgICAvLyBVcGRhdGUgbGVuZ3RoIG9mIGN1cnJlbnQgc2VxdWVuY2Ugb2Ygb3V0bGllcnMKKyAgICBtT3V0bGllckRpc3RyaWJ1dGlvbi5tTisrOworCisgICAgLy8gQ2hlY2sgd2hldGhlciBhIGxhcmdlIGRldmlhdGlvbiBmcm9tIHRoZSBtZWFuIG9jY3VycmVkLgorICAgIC8vIElmIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gaGFzIGJlZW4gcmVzZXQgdG8gemVybywgdGhlIGNvbXBhcmlzb24gaXMKKyAgICAvLyBpbnN0ZWFkIHRvIHRoZSBtZWFuIG9mIHRoZSBmdWxsIG1PdXRsaWVySW50ZXJ2YWwgc2VxdWVuY2UuCisgICAgaWYgKChmYWJzKGRpZmYgLSBtT3V0bGllckRpc3RyaWJ1dGlvbi5tTWVhbikgPAorICAgICAgICAgICAgbU91dGxpZXJEaXN0cmlidXRpb24ua01heERldmlhdGlvbiAqIG1PdXRsaWVyRGlzdHJpYnV0aW9uLm1TZCkgfHwKKyAgICAgICAgICAgIChtT3V0bGllckRpc3RyaWJ1dGlvbi5tU2QgPT0gMCAmJgorICAgICAgICAgICAgZmFicyhkaWZmIC0gbU91dGxpZXJEaXN0cmlidXRpb24ubU1lYW4pIDwKKyAgICAgICAgICAgIG1PdXRsaWVyRGlzdHJpYnV0aW9uLm1UeXBpY2FsRGlmZikpIHsKKyAgICAgICAgLy8gdXBkYXRlIHRoZSBtZWFuIGFuZCBzZCB1c2luZyBvbmxpbmUgYWxnb3JpdGhtCisgICAgICAgIC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLworICAgICAgICAvLyBBbGdvcml0aG1zX2Zvcl9jYWxjdWxhdGluZ192YXJpYW5jZSNPbmxpbmVfYWxnb3JpdGhtCisgICAgICAgIG1PdXRsaWVyRGlzdHJpYnV0aW9uLm1OKys7CisgICAgICAgIGNvbnN0IGRvdWJsZSBrRGVsdGEgPSBkaWZmIC0gbU91dGxpZXJEaXN0cmlidXRpb24ubU1lYW47CisgICAgICAgIG1PdXRsaWVyRGlzdHJpYnV0aW9uLm1NZWFuICs9IGtEZWx0YSAvIG1PdXRsaWVyRGlzdHJpYnV0aW9uLm1OOworICAgICAgICBjb25zdCBkb3VibGUga0RlbHRhMiA9IGRpZmYgLSBtT3V0bGllckRpc3RyaWJ1dGlvbi5tTWVhbjsKKyAgICAgICAgbU91dGxpZXJEaXN0cmlidXRpb24ubU0yICs9IGtEZWx0YSAqIGtEZWx0YTI7CisgICAgICAgIG1PdXRsaWVyRGlzdHJpYnV0aW9uLm1TZCA9IChtT3V0bGllckRpc3RyaWJ1dGlvbi5tTiA8IDIpID8gMCA6CisgICAgICAgICAgICAgICAgc3FydChtT3V0bGllckRpc3RyaWJ1dGlvbi5tTTIgLyAobU91dGxpZXJEaXN0cmlidXRpb24ubU4gLSAxKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gbmV3IHZhbHVlIGlzIGZhciBmcm9tIHRoZSBtZWFuOgorICAgICAgICAvLyBzdG9yZSBwZWFrIHRpbWVzdGFtcCBhbmQgcmVzZXQgbWVhbiwgc2QsIGFuZCBzaG9ydC10ZXJtIHNlcXVlbmNlCisgICAgICAgIGlzUGVhayA9IHRydWU7CisgICAgICAgIG1QZWFrVGltZXN0YW1wcy5lbXBsYWNlX2Zyb250KHRzKTsKKyAgICAgICAgLy8gaWYgbVBlYWtzIGhhcyByZWFjaGVkIGNhcGFjaXR5LCBkZWxldGUgb2xkZXN0IGRhdGEKKyAgICAgICAgLy8gTm90ZTogdGhpcyBtZWFucyB0aGF0IG1PdXRsaWVyRGlzdHJpYnV0aW9uIHZhbHVlcyBkbyBub3QgZXhhY3RseQorICAgICAgICAvLyBtYXRjaCB0aGUgZGF0YSB3ZSBoYXZlIGluIG1QZWFrVGltZXN0YW1wcywgYnV0IHRoaXMgaXMgbm90IGFuIGlzc3VlCisgICAgICAgIC8vIGluIHByYWN0aWNlIGZvciBlc3RpbWF0aW5nIGZ1dHVyZSBwZWFrcy4KKyAgICAgICAgLy8gVE9ETzogdHVybiB0aGlzIGludG8gYSBjaXJjdWxhciBidWZmZXIKKyAgICAgICAgaWYgKG1QZWFrVGltZXN0YW1wcy5zaXplKCkgPj0ga01heExlbmd0aC5QZWFrcykgeworICAgICAgICAgICAgbVBlYWtUaW1lc3RhbXBzLnJlc2l6ZShrTWF4TGVuZ3RoLlBlYWtzKTsKKyAgICAgICAgfQorICAgICAgICBtT3V0bGllckRpc3RyaWJ1dGlvbi5tTWVhbiA9IDA7CisgICAgICAgIG1PdXRsaWVyRGlzdHJpYnV0aW9uLm1TZCA9IDA7CisgICAgICAgIG1PdXRsaWVyRGlzdHJpYnV0aW9uLm1OID0gMDsKKyAgICAgICAgbU91dGxpZXJEaXN0cmlidXRpb24ubU0yID0gMDsKKyAgICB9CisgICAgcmV0dXJuIGlzUGVhazsKK30KKworCisvLyBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIHRpbWVzdGFtcCBhbmQgdGhlIHByZXZpb3VzCisvLyBvbmUgaXMgYmV5b25kIGEgdGhyZXNob2xkLiBJZiB5ZXMsIHN0b3JlcyB0aGUgdGltZXN0YW1wIGFzIGFuIG91dGxpZXIKKy8vIGFuZCB3cml0ZXMgdG8gbU91dGxpZXJkYXRhIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorLy8gVGltZSBlbGFwc2VkIHNpbmNlIHByZXZpb3VzIG91dGxpZXI6IFRpbWVzdGFtcCBvZiBzdGFydCBvZiBvdXRsaWVyCisvLyBlLmcuIHRpbWVzdGFtcHMgKG1zKSAxLCA0LCA1LCAxNiwgMTgsIDI4IHdpbGwgcHJvZHVjZSBwYWlycyAoNCwgNSksICgxMywgMTgpLgorLy8gVE9ETzogbGVhcm4gd2hhdCB0aW1lc3RhbXAgc2VxdWVuY2VzIGNvcnJlbGF0ZSB3aXRoIGdsaXRjaGVzIGluc3RlYWQgb2YKKy8vIG1hbnVhbGx5IGRlc2lnbmluZyBhIGhldXJpc3RpYy4KK2Jvb2wgUGVyZm9ybWFuY2VBbmFseXNpczo6ZGV0ZWN0QW5kU3RvcmVPdXRsaWVyKGNvbnN0IG1zSW50ZXJ2YWwgZGlmZk1zKSB7CisgICAgYm9vbCBpc091dGxpZXIgPSBmYWxzZTsKKyAgICBpZiAoZGlmZk1zID49IG1CdWZmZXJQZXJpb2QubU91dGxpZXIpIHsKKyAgICAgICAgaXNPdXRsaWVyID0gdHJ1ZTsKKyAgICAgICAgbU91dGxpZXJEYXRhLmVtcGxhY2VfZnJvbnQoCisgICAgICAgICAgICAgICAgbU91dGxpZXJEaXN0cmlidXRpb24ubUVsYXBzZWQsIG1CdWZmZXJQZXJpb2QubVByZXZUcyk7CisgICAgICAgIC8vIFJlbW92ZSBvbGRlc3QgdmFsdWUgaWYgdGhlIHZlY3RvciBpcyBmdWxsCisgICAgICAgIC8vIFRPRE86IHR1cm4gdGhpcyBpbnRvIGEgY2lyY3VsYXIgYnVmZmVyCisgICAgICAgIC8vIFRPRE86IG1ha2Ugc3VyZSBrU2hvcnRIaXN0U2l6ZSBpcyBsYXJnZSBlbm91Z2ggdGhhdCB0aGF0IGRhdGEgd2lsbCBuZXZlciBiZSBsb3N0CisgICAgICAgIC8vIGJlZm9yZSBiZWluZyB3cml0dGVuIHRvIGZpbGUgb3IgdG8gYSBGSUZPCisgICAgICAgIGlmIChtT3V0bGllckRhdGEuc2l6ZSgpID49IGtNYXhMZW5ndGguT3V0bGllcnMpIHsKKyAgICAgICAgICAgIG1PdXRsaWVyRGF0YS5yZXNpemUoa01heExlbmd0aC5PdXRsaWVycyk7CisgICAgICAgIH0KKyAgICAgICAgbU91dGxpZXJEaXN0cmlidXRpb24ubUVsYXBzZWQgPSAwOworICAgIH0KKyAgICBtT3V0bGllckRpc3RyaWJ1dGlvbi5tRWxhcHNlZCArPSBkaWZmTXM7CisgICAgcmV0dXJuIGlzT3V0bGllcjsKK30KKworc3RhdGljIGludCB3aWR0aE9mKGludCB4KSB7CisgICAgaW50IHdpZHRoID0gMDsKKyAgICBpZiAoeCA8IDApIHsKKyAgICAgICAgd2lkdGgrKzsKKyAgICAgICAgeCA9IHggPT0gSU5UX01JTiA/IElOVF9NQVggOiAteDsKKyAgICB9CisgICAgLy8gYXNzZXJ0ICh4ID49IDApCisgICAgZG8geworICAgICAgICArK3dpZHRoOworICAgICAgICB4IC89IDEwOworICAgIH0gd2hpbGUgKHggPiAwKTsKKyAgICByZXR1cm4gd2lkdGg7Cit9CisKKy8vIGNvbXB1dGVzIHRoZSBjb2x1bW4gd2lkdGggcmVxdWlyZWQgZm9yIGEgc3BlY2lmaWMgaGlzdG9ncmFtIHZhbHVlCitpbmxpbmUgaW50IG51bWJlcldpZHRoKGRvdWJsZSBudW1iZXIsIGludCBsZWZ0UGFkZGluZykgeworICAgIC8vIEFkZGVkIHZhbHVlcyBhY2NvdW50IGZvciB3aGl0ZXNwYWNlcyBuZWVkZWQgYXJvdW5kIG51bWJlcnMsIGFuZCBmb3IgdGhlCisgICAgLy8gZG90IGFuZCBkZWNpbWFsIGRpZ2l0IG5vdCBhY2NvdW50ZWQgZm9yIGJ5IHdpZHRoT2YKKyAgICByZXR1cm4gc3RkOjptYXgoc3RkOjptYXgod2lkdGhPZihzdGF0aWNfY2FzdDxpbnQ+KG51bWJlcikpICsgMywgMiksIGxlZnRQYWRkaW5nICsgMSk7Cit9CisKKy8vIHJvdW5kcyB2YWx1ZSB0byBwcmVjaXNpb24gYmFzZWQgb24gbG9nLWRpc3RhbmNlIGZyb20gbWVhbgorX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikpKQoraW5saW5lIGRvdWJsZSBsb2dSb3VuZChkb3VibGUgeCwgZG91YmxlIG1lYW4pIHsKKyAgICAvLyBMYXJnZXIgdmFsdWVzIGRlY3JlYXNlIHJhbmdlIG9mIGhpZ2ggcmVzb2x1dGlvbiBhbmQgcHJldmVudCBvdmVyZmxvdworICAgIC8vIG9mIGEgaGlzdG9ncmFtIG9uIHRoZSBjb25zb2xlLgorICAgIC8vIFRoZSBmb2xsb3dpbmcgZm9ybXVsYSBhZGp1c3RzIGtCYXNlIGJhc2VkIG9uIHRoZSBidWZmZXIgcGVyaW9kIGxlbmd0aC4KKyAgICAvLyBEaWZmZXJlbnQgdGhyZWFkcyBoYXZlIGJ1ZmZlciBwZXJpb2RzIHJhbmdpbmcgZnJvbSAyIHRvIDQwLiBUaGUKKyAgICAvLyBmb3JtdWxhIGJlbG93IG1hcHMgYnVmZmVyIHBlcmlvZCAyIHRvIGtCYXNlID0gfjEsIDQgdG8gfjIsIDIwIHRvIH4zLCA0MCB0byB+NC4KKyAgICAvLyBUT0RPOiB0aWdodGVuIHRoaXMgZm9yIGhpZ2hlciBtZWFucywgdGhlIGRhdGEgc3RpbGwgb3ZlcmZsb3dzCisgICAgY29uc3QgZG91YmxlIGtCYXNlID0gbG9nKG1lYW4pIC8gbG9nKDIuMik7CisgICAgY29uc3QgZG91YmxlIHBvd2VyID0gZmxvb3IoCisgICAgICAgIGxvZyhhYnMoeCAtIG1lYW4pIC8gbWVhbikgLyBsb2coa0Jhc2UpKSArIDI7CisgICAgLy8gZG8gbm90IHJvdW5kIHZhbHVlcyBjbG9zZSB0byB0aGUgbWVhbgorICAgIGlmIChwb3dlciA8IDEpIHsKKyAgICAgICAgcmV0dXJuIHg7CisgICAgfQorICAgIGNvbnN0IGludCBmYWN0b3IgPSBzdGF0aWNfY2FzdDxpbnQ+KHBvdygxMCwgcG93ZXIpKTsKKyAgICByZXR1cm4gKHN0YXRpY19jYXN0PGludD4oeCkgKiBmYWN0b3IpIC8gZmFjdG9yOworfQorCisvLyBUT0RPIE1ha2UgaXQgcmV0dXJuIGEgc3RkOjpzdHJpbmcgaW5zdGVhZCBvZiBtb2RpZnlpbmcgYm9keQorLy8gVE9ETzogbW92ZSB0aGlzIHRvIFJlcG9ydFBlcmZvcm1hbmNlLCBwcm9iYWJseSBtYWtlIGl0IGEgZnJpZW5kIGZ1bmN0aW9uCisvLyBvZiBQZXJmb3JtYW5jZUFuYWx5c2lzCit2b2lkIFBlcmZvcm1hbmNlQW5hbHlzaXM6OnJlcG9ydFBlcmZvcm1hbmNlKFN0cmluZzggKmJvZHksIGludCBhdXRob3IsIGxvZ19oYXNoX3QgaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heEhlaWdodCkgeworICAgIGlmIChtSGlzdHMuZW1wdHkoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gbXMgb2YgYWN0aXZlIGF1ZGlvIGluIGRpc3BsYXllZCBoaXN0b2dyYW0KKyAgICBkb3VibGUgZWxhcHNlZE1zID0gMDsKKyAgICAvLyBzdGFydGluZyB0aW1lc3RhbXAgb2YgaGlzdG9ncmFtCisgICAgdGltZXN0YW1wIHN0YXJ0aW5nVHMgPSBtSGlzdHNbMF0uZmlyc3Q7CisKKyAgICAvLyBoaXN0b2dyYW0gd2hpY2ggc3RvcmVzIC4xIHByZWNpc2lvbiBtcyBjb3VudHMgaW5zdGVhZCBvZiBKaWZmeSBtdWx0aXBsZSBjb3VudHMKKyAgICBzdGQ6Om1hcDxkb3VibGUsIGludD4gYnVja2V0czsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnNob3J0SGlzdDogbUhpc3RzKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmY291bnRQYWlyIDogc2hvcnRIaXN0LnNlY29uZCkgeworICAgICAgICAgICAgY29uc3QgZG91YmxlIG1zID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihjb3VudFBhaXIuZmlyc3QpIC8ga0ppZmZ5UGVyTXM7CisgICAgICAgICAgICBidWNrZXRzW2xvZ1JvdW5kKG1zLCBtQnVmZmVyUGVyaW9kLm1NZWFuKV0gKz0gY291bnRQYWlyLnNlY29uZDsKKyAgICAgICAgICAgIGVsYXBzZWRNcyArPSBtcyAqIGNvdW50UGFpci5zZWNvbmQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB1bmRlcnNjb3JlcyBhbmQgc3BhY2VzIGxlbmd0aCBjb3JyZXNwb25kcyB0byBtYXhpbXVtIHdpZHRoIG9mIGhpc3RvZ3JhbQorICAgIHN0YXRpYyBjb25zdCBpbnQga0xlbiA9IDIwMDsKKyAgICBzdGQ6OnN0cmluZyB1bmRlcnNjb3JlcyhrTGVuLCAnXycpOworICAgIHN0ZDo6c3RyaW5nIHNwYWNlcyhrTGVuLCAnICcpOworCisgICAgYXV0byBpdCA9IGJ1Y2tldHMuYmVnaW4oKTsKKyAgICBkb3VibGUgbWF4RGVsdGEgPSBpdC0+Zmlyc3Q7CisgICAgaW50IG1heENvdW50ID0gaXQtPnNlY29uZDsKKyAgICAvLyBDb21wdXRlIG1heGltdW0gdmFsdWVzCisgICAgd2hpbGUgKCsraXQgIT0gYnVja2V0cy5lbmQoKSkgeworICAgICAgICBpZiAoaXQtPmZpcnN0ID4gbWF4RGVsdGEpIHsKKyAgICAgICAgICAgIG1heERlbHRhID0gaXQtPmZpcnN0OworICAgICAgICB9CisgICAgICAgIGlmIChpdC0+c2Vjb25kID4gbWF4Q291bnQpIHsKKyAgICAgICAgICAgIG1heENvdW50ID0gaXQtPnNlY29uZDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpbnQgaGVpZ2h0ID0gbG9nMihtYXhDb3VudCkgKyAxOyAvLyBtYXhDb3VudCA+IDAsIHNhZmUgdG8gY2FsbCBsb2cyCisgICAgY29uc3QgaW50IGxlZnRQYWRkaW5nID0gd2lkdGhPZigxIDw8IGhlaWdodCk7CisgICAgY29uc3QgaW50IGJ1Y2tldFdpZHRoID0gbnVtYmVyV2lkdGgobWF4RGVsdGEsIGxlZnRQYWRkaW5nKTsKKyAgICBpbnQgc2NhbGluZ0ZhY3RvciA9IDE7CisgICAgLy8gc2NhbGUgZGF0YSBpZiBpdCBleGNlZWRzIG1heGltdW0gaGVpZ2h0CisgICAgaWYgKGhlaWdodCA+IG1heEhlaWdodCkgeworICAgICAgICBzY2FsaW5nRmFjdG9yID0gKGhlaWdodCArIG1heEhlaWdodCkgLyBtYXhIZWlnaHQ7CisgICAgICAgIGhlaWdodCAvPSBzY2FsaW5nRmFjdG9yOworICAgIH0KKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxuJSpzICUzLjJmICVzIiwgbGVmdFBhZGRpbmcgKyAxMSwKKyAgICAgICAgICAgICJPY2N1cnJlbmNlcyBpbiIsIChlbGFwc2VkTXMgLyBrTXNQZXJTZWMpLCAic2Vjb25kcyBvZiBhdWRpbzoiKTsKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxuJSpzJWQsICVsbGQsICVsbGRcbiIsIGxlZnRQYWRkaW5nICsgMTEsCisgICAgICAgICAgICAiVGhyZWFkLCBoYXNoLCBzdGFydGluZyB0aW1lc3RhbXA6ICIsIGF1dGhvciwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZyBpbnQ+KGhhc2gpLCBzdGF0aWNfY2FzdDxsb25nIGxvbmcgaW50PihzdGFydGluZ1RzKSk7CisgICAgLy8gd3JpdGUgaGlzdG9ncmFtIGxhYmVsIGxpbmUgd2l0aCBidWNrZXQgdmFsdWVzCisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiVzIiwgIiAiKTsKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqcyIsIGxlZnRQYWRkaW5nLCAiICIpOworICAgIGZvciAoYXV0byBjb25zdCAmeCA6IGJ1Y2tldHMpIHsKKyAgICAgICAgY29uc3QgaW50IGNvbFdpZHRoID0gbnVtYmVyV2lkdGgoeC5maXJzdCwgbGVmdFBhZGRpbmcpOworICAgICAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqZCIsIGNvbFdpZHRoLCB4LnNlY29uZCk7CisgICAgfQorICAgIC8vIHdyaXRlIGhpc3RvZ3JhbSBhc2NpaSBhcnQKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxuJXMiLCAiICIpOworICAgIGZvciAoaW50IHJvdyA9IGhlaWdodCAqIHNjYWxpbmdGYWN0b3I7IHJvdyA+PSAwOyByb3cgLT0gc2NhbGluZ0ZhY3RvcikgeworICAgICAgICBjb25zdCBpbnQgdmFsdWUgPSAxIDw8IHJvdzsKKyAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlLipzIiwgbGVmdFBhZGRpbmcsIHNwYWNlcy5jX3N0cigpKTsKKyAgICAgICAgZm9yIChhdXRvIGNvbnN0ICZ4IDogYnVja2V0cykgeworICAgICAgICAgICAgY29uc3QgaW50IGNvbFdpZHRoID0gbnVtYmVyV2lkdGgoeC5maXJzdCwgbGVmdFBhZGRpbmcpOworICAgICAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlLipzJXMiLCBjb2xXaWR0aCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VzLmNfc3RyKCksIHguc2Vjb25kIDwgdmFsdWUgPyAiICIgOiAifCIpOworICAgICAgICB9CisgICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lcyIsICIgIik7CisgICAgfQorICAgIC8vIHByaW50IHgtYXhpcworICAgIGNvbnN0IGludCBjb2x1bW5zID0gc3RhdGljX2Nhc3Q8aW50PihidWNrZXRzLnNpemUoKSk7CisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlKmMiLCBsZWZ0UGFkZGluZywgJyAnKTsKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUuKnMiLCAoY29sdW1ucyArIDEpICogYnVja2V0V2lkdGgsIHVuZGVyc2NvcmVzLmNfc3RyKCkpOworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lcyIsICIgIik7CisKKyAgICAvLyB3cml0ZSBmb290ZXIgd2l0aCBidWNrZXQgbGFiZWxzCisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlKnMiLCBsZWZ0UGFkZGluZywgIiAiKTsKKyAgICBmb3IgKGF1dG8gY29uc3QgJnggOiBidWNrZXRzKSB7CisgICAgICAgIGNvbnN0IGludCBjb2xXaWR0aCA9IG51bWJlcldpZHRoKHguZmlyc3QsIGxlZnRQYWRkaW5nKTsKKyAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlKi4qZiIsIGNvbFdpZHRoLCAxLCB4LmZpcnN0KTsKKyAgICB9CisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlLipzJXMiLCBidWNrZXRXaWR0aCwgc3BhY2VzLmNfc3RyKCksICJtc1xuIik7CisKKyAgICAvLyBOb3cgcmVwb3J0IGdsaXRjaGVzCisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbnRpbWUgZWxhcHNlZCBiZXR3ZWVuIGdsaXRjaGVzIGFuZCBnbGl0Y2ggdGltZXN0YW1wczpcbiIpOworICAgIGZvciAoY29uc3QgYXV0byAmb3V0bGllcjogbU91dGxpZXJEYXRhKSB7CisgICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJWxsZDogJWxsZFxuIiwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPihvdXRsaWVyLmZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4ob3V0bGllci5zZWNvbmQpKTsKKyAgICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIHdyaXRlcyBzdW1tYXJ5IG9mIHBlcmZvcm1hbmNlIGludG8gc3BlY2lmaWVkIGZpbGUgZGVzY3JpcHRvcgordm9pZCBkdW1wKGludCBmZCwgaW50IGluZGVudCwgUGVyZm9ybWFuY2VBbmFseXNpc01hcCAmdGhyZWFkUGVyZm9ybWFuY2VBbmFseXNpcykgeworICAgIFN0cmluZzggYm9keTsKKyAgICBjb25zdCBjaGFyKiBjb25zdCBrRGlyZWN0b3J5ID0gIi9kYXRhL21pc2MvYXVkaW9zZXJ2ZXIvIjsKKyAgICBmb3IgKGF1dG8gJiB0aHJlYWQgOiB0aHJlYWRQZXJmb3JtYW5jZUFuYWx5c2lzKSB7CisgICAgICAgIGZvciAoYXV0byAmIGhhc2g6IHRocmVhZC5zZWNvbmQpIHsKKyAgICAgICAgICAgIFBlcmZvcm1hbmNlQW5hbHlzaXMmIGN1cnIgPSBoYXNoLnNlY29uZDsKKyAgICAgICAgICAgIC8vIHdyaXRlIHBlcmZvcm1hbmNlIGRhdGEgdG8gY29uc29sZQorICAgICAgICAgICAgY3Vyci5yZXBvcnRQZXJmb3JtYW5jZSgmYm9keSwgdGhyZWFkLmZpcnN0LCBoYXNoLmZpcnN0KTsKKyAgICAgICAgICAgIGlmICghYm9keS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBkdW1wTGluZShmZCwgaW5kZW50LCBib2R5KTsKKyAgICAgICAgICAgICAgICBib2R5LmNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyB3cml0ZSB0byBmaWxlCisgICAgICAgICAgICB3cml0ZVRvRmlsZShjdXJyLm1IaXN0cywgY3Vyci5tT3V0bGllckRhdGEsIGN1cnIubVBlYWtUaW1lc3RhbXBzLAorICAgICAgICAgICAgICAgICAgICAgICAga0RpcmVjdG9yeSwgZmFsc2UsIHRocmVhZC5maXJzdCwgaGFzaC5maXJzdCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworLy8gV3JpdGVzIGEgc3RyaW5nIGludG8gc3BlY2lmaWVkIGZpbGUgZGVzY3JpcHRvcgordm9pZCBkdW1wTGluZShpbnQgZmQsIGludCBpbmRlbnQsIGNvbnN0IFN0cmluZzggJmJvZHkpIHsKKyAgICBkcHJpbnRmKGZkLCAiJS4qcyVzIFxuIiwgaW5kZW50LCAiIiwgYm9keS5zdHJpbmcoKSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlCisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuY3BwIGIvbWVkaWEvbGlibmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyN2U3MzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJuYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5jcHAKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlJlcG9ydFBlcmZvcm1hbmNlIgorCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxxdWV1ZT4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL05CTG9nLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZSB7CisKKworLy8gVE9ETzogdXNlIGEgZnVuY3Rpb24gbGlrZSB0aGlzIHRvIGV4dHJhY3QgbG9naWMgZnJvbSB3cml0ZVRvRmlsZQorLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzkyNzk2MjAKKworLy8gV3JpdGVzIG91dGxpZXIgaW50ZXJ2YWxzLCB0aW1lc3RhbXBzLCBhbmQgaGlzdG9ncmFtcyBzcGFubmluZyBsb25nIHRpbWUgaW50ZXJ2YWxzIHRvIGZpbGUuCisvLyBUT0RPOiB3cml0ZSBkYXRhIGluIGJpbmFyeSBmb3JtYXQKK3ZvaWQgd3JpdGVUb0ZpbGUoY29uc3Qgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8dGltZXN0YW1wLCBIaXN0b2dyYW0+PiAmaGlzdHMsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPG1zSW50ZXJ2YWwsIHRpbWVzdGFtcD4+ICZvdXRsaWVyRGF0YSwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpkZXF1ZTx0aW1lc3RhbXA+ICZwZWFrVGltZXN0YW1wcywKKyAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGRpcmVjdG9yeSwgYm9vbCBhcHBlbmQsIGludCBhdXRob3IsIGxvZ19oYXNoX3QgaGFzaCkgeworCisgICAgLy8gVE9ETzogcmVtb3ZlIG9sZCBmaWxlcywgaW1wbGVtZW50IHJvdGF0aW5nIGZpbGVzIGFzIGluIEF1ZGlvRmxpbmdlci5jcHAKKworICAgIGlmIChvdXRsaWVyRGF0YS5lbXB0eSgpICYmIGhpc3RzLmVtcHR5KCkgJiYgcGVha1RpbWVzdGFtcHMuZW1wdHkoKSkgeworICAgICAgICBBTE9HVygiTm8gZGF0YSwgcmV0dXJuaW5nLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RkOjpzdHJpbmdzdHJlYW0gb3V0bGllck5hbWU7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gaGlzdG9ncmFtTmFtZTsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBwZWFrTmFtZTsKKworICAgIC8vIGdldCBjdXJyZW50IHRpbWUKKyAgICBjaGFyIGN1cnJUaW1lWzE2XTsgLy9ZWVlZTU1EREhITU1TUyArICdcMCcgKyBvbmUgdW51c2VkCisgICAgc3RydWN0IHRpbWV2YWwgdHY7CisgICAgZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisgICAgc3RydWN0IHRtIHRtOworICAgIGxvY2FsdGltZV9yKCZ0di50dl9zZWMsICZ0bSk7CisgICAgc3RyZnRpbWUoY3VyclRpbWUsIHNpemVvZihjdXJyVGltZSksICIlWSVtJWQlSCVNJVMiLCAmdG0pOworCisgICAgLy8gZ2VuZXJhdGUgZmlsZSBuYW1lcworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGNvbW1vbjsKKyAgICBjb21tb24gPDwgYXV0aG9yIDw8ICJfIiA8PCBoYXNoIDw8ICJfIiA8PCBjdXJyVGltZSA8PCAiLmNzdiI7CisKKyAgICBoaXN0b2dyYW1OYW1lIDw8IGRpcmVjdG9yeSA8PCAiaGlzdG9ncmFtc18iIDw8IGNvbW1vbi5zdHIoKTsKKyAgICBvdXRsaWVyTmFtZSA8PCBkaXJlY3RvcnkgPDwgIm91dGxpZXJzXyIgPDwgY29tbW9uLnN0cigpOworICAgIHBlYWtOYW1lIDw8IGRpcmVjdG9yeSA8PCAicGVha3NfIiA8PCBjb21tb24uc3RyKCk7CisKKyAgICBzdGQ6Om9mc3RyZWFtIGhmczsKKyAgICBoZnMub3BlbihoaXN0b2dyYW1OYW1lLnN0cigpLCBhcHBlbmQgPyBzdGQ6Omlvczo6YXBwIDogc3RkOjppb3M6OnRydW5jKTsKKyAgICBpZiAoIWhmcy5pc19vcGVuKCkpIHsKKyAgICAgICAgQUxPR1coImNvdWxkbid0IG9wZW4gZmlsZSAlcyIsIGhpc3RvZ3JhbU5hbWUuc3RyKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gZWFjaCBoaXN0b2dyYW0gaXMgd3JpdHRlbiBhcyBhIGxpbmUgd2hlcmUgdGhlIGZpcnN0IHZhbHVlIGlzIHRoZSB0aW1lc3RhbXAgYW5kCisgICAgLy8gc3Vic2VxdWVudCB2YWx1ZXMgYXJlIHBhaXJzIG9mIGJ1Y2tldHMgYW5kIGNvdW50cy4gRWFjaCB2YWx1ZSBpcyBzZXBhcmF0ZWQKKyAgICAvLyBieSBhIGNvbW1hLCBhbmQgZWFjaCBoaXN0b2dyYW0gaXMgc2VwYXJhdGVkIGJ5IGEgbmV3bGluZS4KKyAgICBmb3IgKGF1dG8gaGlzdCA9IGhpc3RzLmJlZ2luKCk7IGhpc3QgIT0gaGlzdHMuZW5kKCk7ICsraGlzdCkgeworICAgICAgICBoZnMgPDwgaGlzdC0+Zmlyc3QgPDwgIiwgIjsKKyAgICAgICAgZm9yIChhdXRvIGJ1Y2tldCA9IGhpc3QtPnNlY29uZC5iZWdpbigpOyBidWNrZXQgIT0gaGlzdC0+c2Vjb25kLmVuZCgpOyArK2J1Y2tldCkgeworICAgICAgICAgICAgaGZzIDw8IGJ1Y2tldC0+Zmlyc3QgLyBzdGF0aWNfY2FzdDxkb3VibGU+KGtKaWZmeVBlck1zKQorICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgYnVja2V0LT5zZWNvbmQ7CisgICAgICAgICAgICBpZiAoc3RkOjpuZXh0KGJ1Y2tldCkgIT0gZW5kKGhpc3QtPnNlY29uZCkpIHsKKyAgICAgICAgICAgICAgICBoZnMgPDwgIiwgIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc3RkOjpuZXh0KGhpc3QpICE9IGVuZChoaXN0cykpIHsKKyAgICAgICAgICAgIGhmcyA8PCAiXG4iOworICAgICAgICB9CisgICAgfQorICAgIGhmcy5jbG9zZSgpOworCisgICAgc3RkOjpvZnN0cmVhbSBvZnM7CisgICAgb2ZzLm9wZW4ob3V0bGllck5hbWUuc3RyKCksIGFwcGVuZCA/IHN0ZDo6aW9zOjphcHAgOiBzdGQ6Omlvczo6dHJ1bmMpOworICAgIGlmICghb2ZzLmlzX29wZW4oKSkgeworICAgICAgICBBTE9HVygiY291bGRuJ3Qgb3BlbiBmaWxlICVzIiwgb3V0bGllck5hbWUuc3RyKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gb3V0bGllcnMgYXJlIHdyaXR0ZW4gYXMgcGFpcnMgc2VwYXJhdGVkIGJ5IG5ld2xpbmVzLCB3aGVyZSBlYWNoCisgICAgLy8gcGFpcidzIHZhbHVlcyBhcmUgc2VwYXJhdGVkIGJ5IGEgY29tbWEKKyAgICBmb3IgKGNvbnN0IGF1dG8gJm91dGxpZXIgOiBvdXRsaWVyRGF0YSkgeworICAgICAgICBvZnMgPDwgb3V0bGllci5maXJzdCA8PCAiLCAiIDw8IG91dGxpZXIuc2Vjb25kIDw8ICJcbiI7CisgICAgfQorICAgIG9mcy5jbG9zZSgpOworCisgICAgc3RkOjpvZnN0cmVhbSBwZnM7CisgICAgcGZzLm9wZW4ocGVha05hbWUuc3RyKCksIGFwcGVuZCA/IHN0ZDo6aW9zOjphcHAgOiBzdGQ6Omlvczo6dHJ1bmMpOworICAgIGlmICghcGZzLmlzX29wZW4oKSkgeworICAgICAgICBBTE9HVygiY291bGRuJ3Qgb3BlbiBmaWxlICVzIiwgcGVha05hbWUuc3RyKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gcGVha3MgYXJlIHNpbXBseSB0aW1lc3RhbXBzIHNlcGFyYXRlZCBieSBjb21tYXMKKyAgICBmb3IgKGF1dG8gcGVhayA9IHBlYWtUaW1lc3RhbXBzLmJlZ2luKCk7IHBlYWsgIT0gcGVha1RpbWVzdGFtcHMuZW5kKCk7ICsrcGVhaykgeworICAgICAgICBwZnMgPDwgKnBlYWs7CisgICAgICAgIGlmIChzdGQ6Om5leHQocGVhaykgIT0gZW5kKHBlYWtUaW1lc3RhbXBzKSkgeworICAgICAgICAgICAgcGZzIDw8ICIsICI7CisgICAgICAgIH0KKyAgICB9CisgICAgcGZzLmNsb3NlKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlCisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9OQkxvZy5oIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9OQkxvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNmYxNzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL05CTG9nLmgKQEAgLTAsMCArMSw2MTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBOb24tYmxvY2tpbmcgZXZlbnQgbG9nZ2VyIGludGVuZGVkIGZvciBzYWZlIGNvbW11bmljYXRpb24gYmV0d2VlbiBwcm9jZXNzZXMgdmlhIHNoYXJlZCBtZW1vcnkKKworI2lmbmRlZiBBTkRST0lEX01FRElBX05CTE9HX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9OQkxPR19ICisKKyNpbmNsdWRlIDxkZXF1ZT4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2ZpZm8uaD4KKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFN0cmluZzg7CisKK2NsYXNzIE5CTG9nIHsKKworcHVibGljOgorCisgICAgdXNpbmcgbG9nX2hhc2hfdCA9IFJlcG9ydFBlcmZvcm1hbmNlOjpsb2dfaGFzaF90OworCisgICAgLy8gRklYTUUgRXZlcnl0aGluZyBuZWVkZWQgZm9yIGNsaWVudCAod3JpdGVyIEFQSSBhbmQgcmVnaXN0cmF0aW9uKSBzaG91bGQgYmUgaXNvbGF0ZWQKKyAgICAvLyAgICAgICBmcm9tIHRoZSByZXN0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbi4KKyAgICBjbGFzcyBXcml0ZXI7CisgICAgY2xhc3MgUmVhZGVyOworCisgICAgZW51bSBFdmVudCA6IHVpbnQ4X3QgeworICAgICAgICBFVkVOVF9SRVNFUlZFRCwKKyAgICAgICAgRVZFTlRfU1RSSU5HLCAgICAgICAgICAgICAgIC8vIEFTQ0lJIHN0cmluZywgbm90IE5VTC10ZXJtaW5hdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBtYWtlIHRpbWVzdGFtcCBvcHRpb25hbAorICAgICAgICBFVkVOVF9USU1FU1RBTVAsICAgICAgICAgICAgLy8gY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMpCisgICAgICAgIEVWRU5UX0lOVEVHRVIsICAgICAgICAgICAgICAvLyBpbnRlZ2VyIHZhbHVlIGVudHJ5CisgICAgICAgIEVWRU5UX0ZMT0FULCAgICAgICAgICAgICAgICAvLyBmbG9hdGluZyBwb2ludCB2YWx1ZSBlbnRyeQorICAgICAgICBFVkVOVF9QSUQsICAgICAgICAgICAgICAgICAgLy8gcHJvY2VzcyBJRCBhbmQgcHJvY2VzcyBuYW1lCisgICAgICAgIEVWRU5UX0FVVEhPUiwgICAgICAgICAgICAgICAvLyBhdXRob3IgaW5kZXggKHByZXNlbnQgaW4gbWVyZ2VkIGxvZ3MpIHRyYWNrcyBlbnRyeSdzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvcmlnaW5hbCBsb2cKKyAgICAgICAgRVZFTlRfU1RBUlRfRk1ULCAgICAgICAgICAgIC8vIGxvZ0Zvcm1hdCBzdGFydCBldmVudDogZW50cnkgaW5jbHVkZXMgZm9ybWF0IHN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvbGxvd2luZyBlbnRyaWVzIGNvbnRhaW4gZm9ybWF0IGFyZ3VtZW50cworICAgICAgICBFVkVOVF9IQVNILCAgICAgICAgICAgICAgICAgLy8gdW5pcXVlIEhBU0ggb2YgbG9nIG9yaWdpbiwgb3JpZ2luYXRlcyBmcm9tIGhhc2ggb2YgZmlsZSBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgbGluZSBudW1iZXIKKyAgICAgICAgRVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTLCAgIC8vIHNpbmdsZSBkYXR1bSBmb3IgdGltZXN0YW1wIGhpc3RvZ3JhbQorICAgICAgICBFVkVOVF9BVURJT19TVEFURSwgICAgICAgICAgLy8gYXVkaW8gb24vb2ZmIGV2ZW50OiBsb2dnZWQgb24gRmFzdE1peGVyOjpvblN0YXRlQ2hhbmdlIGNhbGwKKyAgICAgICAgRVZFTlRfRU5EX0ZNVCwgICAgICAgICAgICAgIC8vIGVuZCBvZiBsb2dGb3JtYXQgYXJndW1lbnQgbGlzdAorCisgICAgICAgIEVWRU5UX1VQUEVSX0JPVU5ELCAgICAgICAgICAvLyB0byBjaGVjayBmb3IgaW52YWxpZCBldmVudHMKKyAgICB9OworCitwcml2YXRlOgorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gQVBJIGZvciBoYW5kbGluZyBmb3JtYXQgZW50cnkgb3BlcmF0aW9ucworCisgICAgLy8gYSBmb3JtYXR0ZWQgZW50cnkgaGFzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgorICAgIC8vICAgICogU1RBUlRfRk1UIGVudHJ5LCBjb250YWluaW5nIHRoZSBmb3JtYXQgc3RyaW5nCisgICAgLy8gICAgKiBUSU1FU1RBTVAgZW50cnkKKyAgICAvLyAgICAqIEhBU0ggZW50cnkKKyAgICAvLyAgICAqIGF1dGhvciBlbnRyeSBvZiB0aGUgdGhyZWFkIHRoYXQgZ2VuZXJhdGVkIGl0IChvcHRpb25hbCwgcHJlc2VudCBpbiBtZXJnZWQgbG9nKQorICAgIC8vICAgICogZm9ybWF0IGFyZzEKKyAgICAvLyAgICAqIGZvcm1hdCBhcmcyCisgICAgLy8gICAgKiAuLi4KKyAgICAvLyAgICAqIEVORF9GTVQgZW50cnkKKworICAgIC8vIGVudHJ5IHJlcHJlc2VudGF0aW9uIGluIG1lbW9yeQorICAgIHN0cnVjdCBlbnRyeSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgdHlwZTsKKyAgICAgICAgY29uc3QgdWludDhfdCBsZW5ndGg7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgZGF0YVswXTsKKyAgICB9OworCisgICAgLy8gZW50cnkgdGFpbCByZXByZXNlbnRhdGlvbiAoYWZ0ZXIgZGF0YSkKKyAgICBzdHJ1Y3QgZW5kaW5nIHsKKyAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgIHVpbnQ4X3QgbmV4dFswXTsKKyAgICB9OworCisgICAgLy8gZW50cnkgaXRlcmF0b3IKKyAgICBjbGFzcyBFbnRyeUl0ZXJhdG9yIHsKKyAgICBwdWJsaWM6CisgICAgICAgIEVudHJ5SXRlcmF0b3IoKTsKKyAgICAgICAgZXhwbGljaXQgRW50cnlJdGVyYXRvcihjb25zdCB1aW50OF90ICplbnRyeSk7CisgICAgICAgIEVudHJ5SXRlcmF0b3IoY29uc3QgRW50cnlJdGVyYXRvciAmb3RoZXIpOworCisgICAgICAgIC8vIGRlcmVmZXJlbmNlIHVuZGVybHlpbmcgZW50cnkKKyAgICAgICAgY29uc3QgZW50cnkmICAgIG9wZXJhdG9yKigpIGNvbnN0OworICAgICAgICBjb25zdCBlbnRyeSogICAgb3BlcmF0b3ItPigpIGNvbnN0OworICAgICAgICAvLyBhZHZhbmNlIHRvIG5leHQgZW50cnkKKyAgICAgICAgRW50cnlJdGVyYXRvciYgICAgICAgb3BlcmF0b3IrKygpOyAvLyArK2kKKyAgICAgICAgLy8gYmFjayB0byBwcmV2aW91cyBlbnRyeQorICAgICAgICBFbnRyeUl0ZXJhdG9yJiAgICAgICBvcGVyYXRvci0tKCk7IC8vIC0taQorICAgICAgICBFbnRyeUl0ZXJhdG9yICAgICAgICBuZXh0KCkgY29uc3Q7CisgICAgICAgIEVudHJ5SXRlcmF0b3IgICAgICAgIHByZXYoKSBjb25zdDsKKyAgICAgICAgYm9vbCAgICAgICAgICAgIG9wZXJhdG9yIT0oY29uc3QgRW50cnlJdGVyYXRvciAmb3RoZXIpIGNvbnN0OworICAgICAgICBpbnQgICAgICAgICAgICAgb3BlcmF0b3ItKGNvbnN0IEVudHJ5SXRlcmF0b3IgJm90aGVyKSBjb25zdDsKKworICAgICAgICBib29sICAgICAgICAgICAgaGFzQ29uc2lzdGVudExlbmd0aCgpIGNvbnN0OworICAgICAgICB2b2lkICAgICAgICAgICAgY29weVRvKHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCkgY29uc3Q7CisgICAgICAgIHZvaWQgICAgICAgICAgICBjb3B5RGF0YSh1aW50OF90ICpkc3QpIGNvbnN0OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIGlubGluZSBjb25zdCBUJiBwYXlsb2FkKCkgeworICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFQgKj4ocHRyICsgb2Zmc2V0b2YoZW50cnksIGRhdGEpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSBvcGVyYXRvciBjb25zdCB1aW50OF90KigpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBwdHI7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgICpwdHI7CisgICAgfTsKKworICAgIGNsYXNzIEFic3RyYWN0RW50cnkgeworICAgIHB1YmxpYzoKKworICAgICAgICAvLyBFbnRyeSBzdGFydGluZyBpbiB0aGUgZ2l2ZW4gcG9pbnRlcgorICAgICAgICBleHBsaWNpdCBBYnN0cmFjdEVudHJ5KGNvbnN0IHVpbnQ4X3QgKmVudHJ5KTsKKyAgICAgICAgdmlydHVhbCB+QWJzdHJhY3RFbnRyeSgpIHt9CisKKyAgICAgICAgLy8gYnVpbGQgY29uY3JldGUgZW50cnkgb2YgYXBwcm9wcmlhdGUgY2xhc3MgZnJvbSBwb2ludGVyCisgICAgICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QWJzdHJhY3RFbnRyeT4gYnVpbGRFbnRyeShjb25zdCB1aW50OF90ICpwdHIpOworCisgICAgICAgIC8vIGdldCBmb3JtYXQgZW50cnkgdGltZXN0YW1wCisgICAgICAgIHZpcnR1YWwgaW50NjRfdCAgICAgIHRpbWVzdGFtcCgpIGNvbnN0ID0gMDsKKworICAgICAgICAvLyBnZXQgZm9ybWF0IGVudHJ5J3MgdW5pcXVlIGlkCisgICAgICAgIHZpcnR1YWwgbG9nX2hhc2hfdCAgIGhhc2goKSBjb25zdCA9IDA7CisKKyAgICAgICAgLy8gZW50cnkncyBhdXRob3IgaW5kZXggKC0xIGlmIG5vbmUgcHJlc2VudCkKKyAgICAgICAgLy8gYSBNZXJnZXIgaGFzIGEgdmVjdG9yIG9mIFJlYWRlcnMsIGF1dGhvciBzaW1wbHkgcG9pbnRzIHRvIHRoZSBpbmRleCBvZiB0aGUKKyAgICAgICAgLy8gUmVhZGVyIHRoYXQgb3JpZ2luYXRlZCB0aGUgZW50cnkKKyAgICAgICAgLy8gVE9ETyBjb25zaWRlciBjaGFuZ2luZyB0byB1aW50MzJfdAorICAgICAgICB2aXJ0dWFsIGludCAgICAgICAgICBhdXRob3IoKSBjb25zdCA9IDA7CisKKyAgICAgICAgLy8gY29weSBlbnRyeSwgYWRkaW5nIGF1dGhvciBiZWZvcmUgdGltZXN0YW1wLCByZXR1cm5zIGl0ZXJhdG9yIHRvIGVuZCBvZiBlbnRyeQorICAgICAgICB2aXJ0dWFsIEVudHJ5SXRlcmF0b3IgICAgY29weVdpdGhBdXRob3Ioc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1dGhvcikgY29uc3QgPSAwOworCisgICAgcHJvdGVjdGVkOgorICAgICAgICAvLyBjb3BpZXMgb3JkaW5hcnkgZW50cnkgZnJvbSBzcmMgdG8gZHN0LCBhbmQgcmV0dXJucyBsZW5ndGggb2YgZW50cnkKKyAgICAgICAgLy8gc2l6ZV90ICAgICAgY29weUVudHJ5KGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyICpkc3QsIGNvbnN0IGl0ZXJhdG9yICZpdCk7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgICptRW50cnk7CisgICAgfTsKKworICAgIGNsYXNzIEZvcm1hdEVudHJ5IDogcHVibGljIEFic3RyYWN0RW50cnkgeworICAgIHB1YmxpYzoKKyAgICAgICAgLy8gZXhwbGljaXQgRm9ybWF0RW50cnkoY29uc3QgRW50cnlJdGVyYXRvciAmaXQpOworICAgICAgICBleHBsaWNpdCBGb3JtYXRFbnRyeShjb25zdCB1aW50OF90ICpwdHIpIDogQWJzdHJhY3RFbnRyeShwdHIpIHt9CisgICAgICAgIHZpcnR1YWwgfkZvcm1hdEVudHJ5KCkge30KKworICAgICAgICBFbnRyeUl0ZXJhdG9yIGJlZ2luKCkgY29uc3Q7CisKKyAgICAgICAgLy8gRW50cnkncyBmb3JtYXQgc3RyaW5nCisgICAgICAgIGNvbnN0ICAgY2hhciogZm9ybWF0U3RyaW5nKCkgY29uc3Q7CisKKyAgICAgICAgLy8gRW5ydHkncyBmb3JtYXQgc3RyaW5nIGxlbmd0aAorICAgICAgICBzaXplX3QgICAgICBmb3JtYXRTdHJpbmdMZW5ndGgoKSBjb25zdDsKKworICAgICAgICAvLyBGb3JtYXQgYXJndW1lbnRzIChleGNsdWRpbmcgZm9ybWF0IHN0cmluZywgdGltZXN0YW1wIGFuZCBhdXRob3IpCisgICAgICAgIEVudHJ5SXRlcmF0b3IgICAgYXJncygpIGNvbnN0OworCisgICAgICAgIC8vIGdldCBmb3JtYXQgZW50cnkgdGltZXN0YW1wCisgICAgICAgIHZpcnR1YWwgaW50NjRfdCAgICAgdGltZXN0YW1wKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAgICAgLy8gZ2V0IGZvcm1hdCBlbnRyeSdzIHVuaXF1ZSBpZAorICAgICAgICB2aXJ0dWFsIGxvZ19oYXNoX3QgIGhhc2goKSBjb25zdCBvdmVycmlkZTsKKworICAgICAgICAvLyBlbnRyeSdzIGF1dGhvciBpbmRleCAoLTEgaWYgbm9uZSBwcmVzZW50KQorICAgICAgICAvLyBhIE1lcmdlciBoYXMgYSB2ZWN0b3Igb2YgUmVhZGVycywgYXV0aG9yIHNpbXBseSBwb2ludHMgdG8gdGhlIGluZGV4IG9mIHRoZQorICAgICAgICAvLyBSZWFkZXIgdGhhdCBvcmlnaW5hdGVkIHRoZSBlbnRyeQorICAgICAgICB2aXJ0dWFsIGludCAgICAgICAgIGF1dGhvcigpIGNvbnN0IG92ZXJyaWRlOworCisgICAgICAgIC8vIGNvcHkgZW50cnksIGFkZGluZyBhdXRob3IgYmVmb3JlIHRpbWVzdGFtcCwgcmV0dXJucyBzaXplIG9mIG9yaWdpbmFsIGVudHJ5CisgICAgICAgIHZpcnR1YWwgRW50cnlJdGVyYXRvciAgICBjb3B5V2l0aEF1dGhvcihzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXV0aG9yKSBjb25zdCBvdmVycmlkZTsKKworICAgIH07CisKKyAgICBjbGFzcyBIaXN0b2dyYW1FbnRyeSA6IHB1YmxpYyBBYnN0cmFjdEVudHJ5IHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IEhpc3RvZ3JhbUVudHJ5KGNvbnN0IHVpbnQ4X3QgKnB0cikgOiBBYnN0cmFjdEVudHJ5KHB0cikgeworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgfkhpc3RvZ3JhbUVudHJ5KCkge30KKworICAgICAgICB2aXJ0dWFsIGludDY0X3QgICAgIHRpbWVzdGFtcCgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgICAgIHZpcnR1YWwgbG9nX2hhc2hfdCAgaGFzaCgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgICAgIHZpcnR1YWwgaW50ICAgICAgICAgYXV0aG9yKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAgICAgdmlydHVhbCBFbnRyeUl0ZXJhdG9yICAgIGNvcHlXaXRoQXV0aG9yKHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdXRob3IpIGNvbnN0IG92ZXJyaWRlOworCisgICAgfTsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLy8gcmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgbG9nIGVudHJ5IGluIHByaXZhdGUgbWVtb3J5CisgICAgc3RydWN0IEVudHJ5IHsKKyAgICAgICAgRW50cnkoRXZlbnQgZXZlbnQsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW5ndGgpCisgICAgICAgICAgICA6IG1FdmVudChldmVudCksIG1MZW5ndGgobGVuZ3RoKSwgbURhdGEoZGF0YSkgeyB9CisgICAgICAgIC8qdmlydHVhbCovIH5FbnRyeSgpIHsgfQorCisgICAgICAgIC8vIHVzZWQgZHVyaW5nIHdyaXRpbmcgdG8gZm9ybWF0IEVudHJ5IGluZm9ybWF0aW9uIGFzIGZvbGxvd3M6CisgICAgICAgIC8vIFt0eXBlXVtsZW5ndGhdW2RhdGEgLi4uIF1bbGVuZ3RoXQorICAgICAgICBpbnQgICAgIGNvcHlFbnRyeURhdGFBdChzaXplX3Qgb2Zmc2V0KSBjb25zdDsKKworICAgIHByaXZhdGU6CisgICAgICAgIGZyaWVuZCBjbGFzcyBXcml0ZXI7CisgICAgICAgIEV2ZW50ICAgICAgIG1FdmVudDsgICAgIC8vIGV2ZW50IHR5cGUKKyAgICAgICAgdWludDhfdCAgICAgbUxlbmd0aDsgICAgLy8gbGVuZ3RoIG9mIGFkZGl0aW9uYWwgZGF0YSwgMCA8PSBtTGVuZ3RoIDw9IGtNYXhMZW5ndGgKKyAgICAgICAgY29uc3Qgdm9pZCAqbURhdGE7ICAgICAgLy8gZXZlbnQgdHlwZS1zcGVjaWZpYyBkYXRhCisgICAgICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heExlbmd0aCA9IDI1NTsKKyAgICBwdWJsaWM6CisgICAgICAgIC8vIG1FdmVudCwgbUxlbmd0aCwgbURhdGFbLi4uXSwgZHVwbGljYXRlIG1MZW5ndGgKKyAgICAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrT3ZlcmhlYWQgPSBzaXplb2YoZW50cnkpICsgc2l6ZW9mKGVuZGluZyk7CisgICAgICAgIC8vIGVuZGluZCBsZW5ndGggb2YgcHJldmlvdXMgZW50cnkKKyAgICAgICAgc3RhdGljIGNvbnN0IHNzaXplX3Qga1ByZXZpb3VzTGVuZ3RoT2Zmc2V0ID0gLSBzaXplb2YoZW5kaW5nKSArCisgICAgICAgICAgICBvZmZzZXRvZihlbmRpbmcsIGxlbmd0aCk7CisgICAgfTsKKworICAgIHN0cnVjdCBIaXN0VHNFbnRyeSB7CisgICAgICAgIGxvZ19oYXNoX3QgaGFzaDsKKyAgICAgICAgaW50NjRfdCB0czsKKyAgICB9OyAvL1RPRE8gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyAgICBzdHJ1Y3QgSGlzdFRzRW50cnlXaXRoQXV0aG9yIHsKKyAgICAgICAgbG9nX2hhc2hfdCBoYXNoOworICAgICAgICBpbnQ2NF90IHRzOworICAgICAgICBpbnQgYXV0aG9yOworICAgIH07IC8vVE9ETyBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworICAgIHN0cnVjdCBIaXN0SW50RW50cnkgeworICAgICAgICBsb2dfaGFzaF90IGhhc2g7CisgICAgICAgIGludCB2YWx1ZTsKKyAgICB9OyAvL1RPRE8gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyAgICAvLyByZXByZXNlbnRhdGlvbiBvZiBhIHNpbmdsZSBsb2cgZW50cnkgaW4gc2hhcmVkIG1lbW9yeQorICAgIC8vICBieXRlWzBdICAgICAgICAgICAgIG1FdmVudAorICAgIC8vICBieXRlWzFdICAgICAgICAgICAgIG1MZW5ndGgKKyAgICAvLyAgYnl0ZVsyXSAgICAgICAgICAgICBtRGF0YVswXQorICAgIC8vICAuLi4KKyAgICAvLyAgYnl0ZVsyK2ldICAgICAgICAgICBtRGF0YVtpXQorICAgIC8vICAuLi4KKyAgICAvLyAgYnl0ZVsyK21MZW5ndGgtMV0gICBtRGF0YVttTGVuZ3RoLTFdCisgICAgLy8gIGJ5dGVbMittTGVuZ3RoXSAgICAgZHVwbGljYXRlIGNvcHkgb2YgbUxlbmd0aCB0byBwZXJtaXQgcmV2ZXJzZSBzY2FuCisgICAgLy8gIGJ5dGVbMyttTGVuZ3RoXSAgICAgc3RhcnQgb2YgbmV4dCBsb2cgZW50cnkKKworICAgIHN0YXRpYyB2b2lkICAgIGFwcGVuZEludChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKTsKKyAgICBzdGF0aWMgdm9pZCAgICBhcHBlbmRGbG9hdChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKTsKKyAgICBzdGF0aWMgdm9pZCAgICBhcHBlbmRQSUQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbmd0aCk7CisgICAgc3RhdGljIHZvaWQgICAgYXBwZW5kVGltZXN0YW1wKFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpOworICAgIHN0YXRpYyBzaXplX3QgIGZtdEVudHJ5TGVuZ3RoKGNvbnN0IHVpbnQ4X3QgKmRhdGEpOworICAgIHN0YXRpYyBTdHJpbmc4IGJ1ZmZlckR1bXAoY29uc3QgdWludDhfdCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CisgICAgc3RhdGljIFN0cmluZzggYnVmZmVyRHVtcChjb25zdCBFbnRyeUl0ZXJhdG9yICZpdCk7CitwdWJsaWM6CisKKyAgICAvLyBMb2NhdGVkIGluIHNoYXJlZCBtZW1vcnksIG11c3QgYmUgUE9ELgorICAgIC8vIEV4YWN0bHkgb25lIHByb2Nlc3MgbXVzdCBleHBsaWNpdGx5IGNhbGwgdGhlIGNvbnN0cnVjdG9yIG9yIHVzZSBwbGFjZW1lbnQgbmV3LgorICAgIC8vIFNpbmNlIHRoaXMgaXMgYSBQT0QsIHRoZSBkZXN0cnVjdG9yIGlzIGVtcHR5IGFuZCB1bm5lY2Vzc2FyeSB0byBjYWxsIGl0IGV4cGxpY2l0bHkuCisgICAgc3RydWN0IFNoYXJlZCB7CisgICAgICAgIFNoYXJlZCgpIC8qIG1SZWFyIGluaXRpYWxpemVkIHZpYSBkZWZhdWx0IGNvbnN0cnVjdG9yICovIHsgfQorICAgICAgICAvKnZpcnR1YWwqLyB+U2hhcmVkKCkgeyB9CisKKyAgICAgICAgYXVkaW9fdXRpbHNfZmlmb19pbmRleCAgbVJlYXI7ICAvLyBpbmRleCBvbmUgYnl0ZSBwYXN0IHRoZSBlbmQgb2YgbW9zdCByZWNlbnQgRW50cnkKKyAgICAgICAgY2hhciAgICBtQnVmZmVyWzBdOyAgICAgICAgICAgICAvLyBjaXJjdWxhciBidWZmZXIgZm9yIGVudHJpZXMKKyAgICB9OworCitwdWJsaWM6CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8vIEZJWE1FIFRpbWVsaW5lIHdhcyBpbnRlbmRlZCB0byB3cmFwIFdyaXRlciBhbmQgUmVhZGVyLCBidXQgaXNuJ3QgYWN0dWFsbHkgdXNlZCB5ZXQuCisgICAgLy8gRm9yIG5vdyBpdCBpcyBqdXN0IGEgbmFtZXNwYWNlIGZvciBzaGFyZWRTaXplKCkuCisgICAgY2xhc3MgVGltZWxpbmUgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgcHVibGljOgorI2lmIDAKKyAgICAgICAgVGltZWxpbmUoc2l6ZV90IHNpemUsIHZvaWQgKnNoYXJlZCA9IE5VTEwpOworICAgICAgICB2aXJ0dWFsIH5UaW1lbGluZSgpOworI2VuZGlmCisKKyAgICAgICAgLy8gSW5wdXQgcGFyYW1ldGVyICdzaXplJyBpcyB0aGUgZGVzaXJlZCBzaXplIG9mIHRoZSB0aW1lbGluZSBpbiBieXRlIHVuaXRzLgorICAgICAgICAvLyBSZXR1cm5zIHRoZSBzaXplIHJvdW5kZWQgdXAgdG8gYSBwb3dlci1vZi0yLCBwbHVzIHRoZSBjb25zdGFudCBzaXplIG92ZXJoZWFkIGZvciBpbmRpY2VzLgorICAgICAgICBzdGF0aWMgc2l6ZV90IHNoYXJlZFNpemUoc2l6ZV90IHNpemUpOworCisjaWYgMAorICAgIHByaXZhdGU6CisgICAgICAgIGZyaWVuZCBjbGFzcyAgICBXcml0ZXI7CisgICAgICAgIGZyaWVuZCBjbGFzcyAgICBSZWFkZXI7CisKKyAgICAgICAgY29uc3Qgc2l6ZV90ICAgIG1TaXplOyAgICAgIC8vIGNpcmN1bGFyIGJ1ZmZlciBzaXplIGluIGJ5dGVzLCBtdXN0IGJlIGEgcG93ZXIgb2YgMgorICAgICAgICBib29sICAgICAgICAgICAgbU93bjsgICAgICAgLy8gd2hldGhlciBJIG93biB0aGUgbWVtb3J5IGF0IG1TaGFyZWQKKyAgICAgICAgU2hhcmVkKiBjb25zdCAgIG1TaGFyZWQ7ICAgIC8vIHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeQorI2VuZGlmCisgICAgfTsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLy8gV3JpdGVyIGlzIHRocmVhZC1zYWZlIHdpdGggcmVzcGVjdCB0byBSZWFkZXIsIGJ1dCBub3Qgd2l0aCByZXNwZWN0IHRvIG11bHRpcGxlIHRocmVhZHMKKyAgICAvLyBjYWxsaW5nIFdyaXRlciBtZXRob2RzLiAgSWYgeW91IG5lZWQgbXVsdGktdGhyZWFkIHNhZmV0eSBmb3Igd3JpdGluZywgdXNlIExvY2tlZFdyaXRlci4KKyAgICBjbGFzcyBXcml0ZXIgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgcHVibGljOgorICAgICAgICBXcml0ZXIoKTsgICAgICAgICAgICAgICAgICAgLy8gZHVtbXkgbm9wIGltcGxlbWVudGF0aW9uIHdpdGhvdXQgc2hhcmVkIG1lbW9yeQorCisgICAgICAgIC8vIElucHV0IHBhcmFtZXRlciAnc2l6ZScgaXMgdGhlIGRlc2lyZWQgc2l6ZSBvZiB0aGUgdGltZWxpbmUgaW4gYnl0ZSB1bml0cy4KKyAgICAgICAgLy8gVGhlIHNpemUgb2YgdGhlIHNoYXJlZCBtZW1vcnkgbXVzdCBiZSBhdCBsZWFzdCBUaW1lbGluZTo6c2hhcmVkU2l6ZShzaXplKS4KKyAgICAgICAgV3JpdGVyKHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpOworICAgICAgICBXcml0ZXIoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnksIHNpemVfdCBzaXplKTsKKworICAgICAgICB2aXJ0dWFsIH5Xcml0ZXIoKTsKKworICAgICAgICAvLyBGSVhNRSBuZWVkcyBjb21tZW50cywgYW5kIHNvbWUgc2hvdWxkIGJlIHByaXZhdGUKKyAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZyhjb25zdCBjaGFyICpzdHJpbmcpOworICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nZihjb25zdCBjaGFyICpmbXQsIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOworICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9ndmYoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKTsKKyAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ1RpbWVzdGFtcCgpOworICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nVGltZXN0YW1wKGNvbnN0IGludDY0X3QgdHMpOworICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nSW50ZWdlcihjb25zdCBpbnQgeCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dGbG9hdChjb25zdCBmbG9hdCB4KTsKKyAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ1BJRCgpOworICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nRm9ybWF0KGNvbnN0IGNoYXIgKmZtdCwgbG9nX2hhc2hfdCBoYXNoLCAuLi4pOworICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nVkZvcm1hdChjb25zdCBjaGFyICpmbXQsIGxvZ19oYXNoX3QgaGFzaCwgdmFfbGlzdCBhcCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dTdGFydChjb25zdCBjaGFyICpmbXQpOworICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nRW5kKCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dIYXNoKGxvZ19oYXNoX3QgaGFzaCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dFdmVudEhpc3RUcyhFdmVudCBldmVudCwgbG9nX2hhc2hfdCBoYXNoKTsKKworICAgICAgICB2aXJ0dWFsIGJvb2wgICAgaXNFbmFibGVkKCkgY29uc3Q7CisKKyAgICAgICAgLy8gcmV0dXJuIHZhbHVlIGZvciBhbGwgb2YgdGhlc2UgaXMgdGhlIHByZXZpb3VzIGlzRW5hYmxlZCgpCisgICAgICAgIHZpcnR1YWwgYm9vbCAgICBzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCk7ICAgLy8gYnV0IHdvbid0IGVuYWJsZSBpZiBubyBzaGFyZWQgbWVtb3J5CisgICAgICAgIGJvb2wgICAgZW5hYmxlKCkgICAgeyByZXR1cm4gc2V0RW5hYmxlZCh0cnVlKTsgfQorICAgICAgICBib29sICAgIGRpc2FibGUoKSAgIHsgcmV0dXJuIHNldEVuYWJsZWQoZmFsc2UpOyB9CisKKyAgICAgICAgc3A8SU1lbW9yeT4gICAgIGdldElNZW1vcnkoKSBjb25zdCAgeyByZXR1cm4gbUlNZW1vcnk7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIC8vIDAgPD0gbGVuZ3RoIDw9IGtNYXhMZW5ndGgKKyAgICAgICAgLy8gd3JpdGVzIGEgc2luZ2xlIEVudHJ5IHRvIHRoZSBGSUZPCisgICAgICAgIHZvaWQgICAgbG9nKEV2ZW50IGV2ZW50LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoKTsKKyAgICAgICAgLy8gY2hlY2tzIHZhbGlkaXR5IG9mIGFuIGV2ZW50IGJlZm9yZSBjYWxsaW5nIGxvZyBhYm92ZSB0aGlzIG9uZQorICAgICAgICB2b2lkICAgIGxvZyhjb25zdCBFbnRyeSAqZW50cnksIGJvb2wgdHJ1c3RlZCA9IGZhbHNlKTsKKworICAgICAgICBTaGFyZWQqIGNvbnN0ICAgbVNoYXJlZDsgICAgLy8gcmF3IHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeQorICAgICAgICBzcDxJTWVtb3J5PiAgICAgbUlNZW1vcnk7ICAgLy8gcmVmLWNvdW50ZWQgdmVyc2lvbiwgaW5pdGlhbGl6ZWQgaW4gY29uc3RydWN0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGVuIGNvbnN0CisgICAgICAgIGF1ZGlvX3V0aWxzX2ZpZm8gKiBjb25zdCBtRmlmbzsgICAgICAgICAgICAgICAgIC8vIEZJRk8gaXRzZWxmLCBub24tTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmxlc3MgY29uc3RydWN0b3IgZmFpbHMKKyAgICAgICAgYXVkaW9fdXRpbHNfZmlmb193cml0ZXIgKiBjb25zdCBtRmlmb1dyaXRlcjsgICAgLy8gdXNlZCB0byB3cml0ZSB0byBGSUZPLCBub24tTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmxlc3MgZHVtbXkgY29uc3RydWN0b3IgdXNlZAorICAgICAgICBib29sICAgICAgICAgICAgbUVuYWJsZWQ7ICAgLy8gd2hldGhlciB0byBhY3R1YWxseSBsb2cKKworICAgICAgICAvLyBjYWNoZWQgcGlkIGFuZCBwcm9jZXNzIG5hbWUgdG8gdXNlIGluICVwIGZvcm1hdCBzcGVjaWZpZXIKKyAgICAgICAgLy8gdG90YWwgdGFnIGxlbmd0aCBpcyBtUGlkVGFnU2l6ZSBhbmQgcHJvY2VzcyBuYW1lIGlzIG5vdCB6ZXJvIHRlcm1pbmF0ZWQKKyAgICAgICAgY2hhciAgICptUGlkVGFnOworICAgICAgICBzaXplX3QgIG1QaWRUYWdTaXplOworICAgIH07CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8vIFNpbWlsYXIgdG8gV3JpdGVyLCBidXQgc2FmZSBmb3IgbXVsdGlwbGUgdGhyZWFkcyB0byBjYWxsIGNvbmN1cnJlbnRseQorICAgIGNsYXNzIExvY2tlZFdyaXRlciA6IHB1YmxpYyBXcml0ZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgTG9ja2VkV3JpdGVyKCk7CisgICAgICAgIExvY2tlZFdyaXRlcih2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKTsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nKGNvbnN0IGNoYXIgKnN0cmluZyk7CisgICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7CisgICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2d2Zihjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApOworICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nVGltZXN0YW1wKCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dUaW1lc3RhbXAoY29uc3QgaW50NjRfdCB0cyk7CisgICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dJbnRlZ2VyKGNvbnN0IGludCB4KTsKKyAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ0Zsb2F0KGNvbnN0IGZsb2F0IHgpOworICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nUElEKCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dTdGFydChjb25zdCBjaGFyICpmbXQpOworICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nRW5kKCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dIYXNoKGxvZ19oYXNoX3QgaGFzaCk7CisKKyAgICAgICAgdmlydHVhbCBib29sICAgIGlzRW5hYmxlZCgpIGNvbnN0OworICAgICAgICB2aXJ0dWFsIGJvb2wgICAgc2V0RW5hYmxlZChib29sIGVuYWJsZWQpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgbXV0YWJsZSBNdXRleCAgIG1Mb2NrOworICAgIH07CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGNsYXNzIFJlYWRlciA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIC8vIEEgc25hcHNob3Qgb2YgYSByZWFkZXJzIGJ1ZmZlcgorICAgICAgICAvLyBUaGlzIGlzIHJhdyBkYXRhLiBObyBhbmFseXNpcyBoYXMgYmVlbiBkb25lIG9uIGl0CisgICAgICAgIGNsYXNzIFNuYXBzaG90IHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgU25hcHNob3QoKSA6IG1EYXRhKE5VTEwpLCBtTG9zdCgwKSB7fQorCisgICAgICAgICAgICBTbmFwc2hvdChzaXplX3QgYnVmZmVyU2l6ZSkgOiBtRGF0YShuZXcgdWludDhfdFtidWZmZXJTaXplXSkge30KKworICAgICAgICAgICAgflNuYXBzaG90KCkgeyBkZWxldGVbXSBtRGF0YTsgfQorCisgICAgICAgICAgICAvLyBjb3B5IG9mIHRoZSBidWZmZXIKKyAgICAgICAgICAgIHVpbnQ4X3QgKmRhdGEoKSBjb25zdCB7IHJldHVybiBtRGF0YTsgfQorCisgICAgICAgICAgICAvLyBhbW91bnQgb2YgZGF0YSBsb3N0IChnaXZlbiBieSBhdWRpb191dGlsc19maWZvX3JlYWRlcikKKyAgICAgICAgICAgIHNpemVfdCAgIGxvc3QoKSBjb25zdCB7IHJldHVybiBtTG9zdDsgfQorCisgICAgICAgICAgICAvLyBpdGVyYXRvciB0byBiZWdpbm5pbmcgb2YgcmVhZGFibGUgc2VnbWVudCBvZiBzbmFwc2hvdAorICAgICAgICAgICAgLy8gZGF0YSBiZXR3ZWVuIGJlZ2luIGFuZCBlbmQgaGFzIHZhbGlkIGVudHJpZXMKKyAgICAgICAgICAgIEVudHJ5SXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBtQmVnaW47IH0KKworICAgICAgICAgICAgLy8gaXRlcmF0b3IgdG8gZW5kIG9mIHJlYWRhYmxlIHNlZ21lbnQgb2Ygc25hcHNob3QKKyAgICAgICAgICAgIEVudHJ5SXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gbUVuZDsgfQorCisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICBmcmllbmQgY2xhc3MgTWVyZ2VSZWFkZXI7CisgICAgICAgICAgICBmcmllbmQgY2xhc3MgUmVhZGVyOworICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgICAgKm1EYXRhOworICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgIG1Mb3N0OworICAgICAgICAgICAgRW50cnlJdGVyYXRvciBtQmVnaW47CisgICAgICAgICAgICBFbnRyeUl0ZXJhdG9yIG1FbmQ7CisgICAgICAgIH07CisKKyAgICAgICAgLy8gSW5wdXQgcGFyYW1ldGVyICdzaXplJyBpcyB0aGUgZGVzaXJlZCBzaXplIG9mIHRoZSB0aW1lbGluZSBpbiBieXRlIHVuaXRzLgorICAgICAgICAvLyBUaGUgc2l6ZSBvZiB0aGUgc2hhcmVkIG1lbW9yeSBtdXN0IGJlIGF0IGxlYXN0IFRpbWVsaW5lOjpzaGFyZWRTaXplKHNpemUpLgorICAgICAgICBSZWFkZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSk7CisgICAgICAgIFJlYWRlcihjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSwgc2l6ZV90IHNpemUpOworCisgICAgICAgIHZpcnR1YWwgflJlYWRlcigpOworCisgICAgICAgIC8vIGdldCBzbmFwc2hvdCBvZiByZWFkZXJzIGZpZm8gYnVmZmVyLCBlZmZlY3RpdmVseSBjb25zdW1pbmcgdGhlIGJ1ZmZlcgorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+IGdldFNuYXBzaG90KCk7CisKKyAgICAgICAgYm9vbCAgICAgaXNJTWVtb3J5KGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5KSBjb25zdDsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgLy8gcHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBwZXJmb3JtYW5jZSB0byB0aGUgY29uc29sZQorICAgICAgICB2b2lkICAgIGR1bXBMaW5lKGNvbnN0IFN0cmluZzgmIHRpbWVzdGFtcCwgU3RyaW5nOCYgYm9keSk7CisgICAgICAgIEVudHJ5SXRlcmF0b3IgICBoYW5kbGVGb3JtYXQoY29uc3QgRm9ybWF0RW50cnkgJmZtdEVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggKnRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4ICpib2R5KTsKKyAgICAgICAgaW50IG1GZDsgICAgICAgICAgICAgICAgLy8gZmlsZSBkZXNjcmlwdG9yCisgICAgICAgIGludCBtSW5kZW50OyAgICAgICAgICAgIC8vIGluZGVudGF0aW9uIGxldmVsCisgICAgICAgIGludCBtTG9zdDsgICAgICAgICAgICAgIC8vIGJ5dGVzIG9mIGRhdGEgbG9zdCBiZWZvcmUgYnVmZmVyIHdhcyByZWFkCisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGF0aWMgY29uc3Qgc3RkOjpzZXQ8RXZlbnQ+IHN0YXJ0aW5nVHlwZXM7CisgICAgICAgIHN0YXRpYyBjb25zdCBzdGQ6OnNldDxFdmVudD4gZW5kaW5nVHlwZXM7CisKKyAgICAgICAgLy8gZGVjbGFyZWQgYXMgY29uc3QgYmVjYXVzZSBhdWRpb191dGlsc19maWZvKCkgY29uc3RydWN0b3IKKyAgICAgICAgc3A8SU1lbW9yeT4gbUlNZW1vcnk7ICAgICAgIC8vIHJlZi1jb3VudGVkIHZlcnNpb24sIGFzc2lnbmVkIG9ubHkgaW4gY29uc3RydWN0b3IKKworICAgICAgICAvKmNvbnN0Ki8gU2hhcmVkKiBjb25zdCBtU2hhcmVkOyAgICAvLyByYXcgcG9pbnRlciB0byBzaGFyZWQgbWVtb3J5LCBhY3R1YWxseSBjb25zdCBidXQgbm90CisgICAgICAgIGF1ZGlvX3V0aWxzX2ZpZm8gKiBjb25zdCBtRmlmbzsgICAgICAgICAgICAgICAgIC8vIEZJRk8gaXRzZWxmLAorICAgICAgICAvLyBub24tTlVMTCB1bmxlc3MgY29uc3RydWN0b3IgZmFpbHMKKyAgICAgICAgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXIgKiBjb25zdCBtRmlmb1JlYWRlcjsgICAgLy8gdXNlZCB0byByZWFkIGZyb20gRklGTywKKyAgICAgICAgLy8gbm9uLU5VTEwgdW5sZXNzIGNvbnN0cnVjdG9yIGZhaWxzCisKKyAgICAgICAgLy8gU2VhcmNoZXMgZm9yIHRoZSBsYXN0IGVudHJ5IG9mIHR5cGUgPHR5cGU+IGluIHRoZSByYW5nZSBbZnJvbnQsIGJhY2spCisgICAgICAgIC8vIGJhY2sgaGFzIHRvIGJlIGVudHJ5LWFsaWduZWQuIFJldHVybnMgbnVsbHB0ciBpZiBub25lIGVuY29udW50ZXJlZC4KKyAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgKmZpbmRMYXN0RW50cnlPZlR5cGVzKGNvbnN0IHVpbnQ4X3QgKmZyb250LCBjb25zdCB1aW50OF90ICpiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8RXZlbnQ+ICZ0eXBlcyk7CisKKyAgICAgICAgLy8gZHVtbXkgbWV0aG9kIGZvciBoYW5kbGluZyBhYnNlbnQgYXV0aG9yIGVudHJ5CisgICAgICAgIHZpcnR1YWwgdm9pZCBoYW5kbGVBdXRob3IoY29uc3QgQWJzdHJhY3RFbnRyeSYgLypmbXRFbnRyeSovLCBTdHJpbmc4KiAvKmJvZHkqLykge30KKyAgICB9OworCisgICAgLy8gV3JhcHBlciBmb3IgYSByZWFkZXIgd2l0aCBhIG5hbWUuIENvbnRhaW5zIGEgcG9pbnRlciB0byB0aGUgcmVhZGVyIGFuZCBhIHBvaW50ZXIgdG8gdGhlIG5hbWUKKyAgICBjbGFzcyBOYW1lZFJlYWRlciB7CisgICAgcHVibGljOgorICAgICAgICBOYW1lZFJlYWRlcigpIHsgbU5hbWVbMF0gPSAnXDAnOyB9IC8vIGZvciBWZWN0b3IKKyAgICAgICAgTmFtZWRSZWFkZXIoY29uc3Qgc3A8TkJMb2c6OlJlYWRlcj4mIHJlYWRlciwgY29uc3QgY2hhciAqbmFtZSkgOgorICAgICAgICAgICAgbVJlYWRlcihyZWFkZXIpCisgICAgICAgICAgICB7IHN0cmxjcHkobU5hbWUsIG5hbWUsIHNpemVvZihtTmFtZSkpOyB9CisgICAgICAgIH5OYW1lZFJlYWRlcigpIHsgfQorICAgICAgICBjb25zdCBzcDxOQkxvZzo6UmVhZGVyPiYgIHJlYWRlcigpIGNvbnN0IHsgcmV0dXJuIG1SZWFkZXI7IH0KKyAgICAgICAgY29uc3QgY2hhciogICAgICAgICAgICAgICBuYW1lKCkgY29uc3QgeyByZXR1cm4gbU5hbWU7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHNwPE5CTG9nOjpSZWFkZXI+ICAgbVJlYWRlcjsKKyAgICAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4TmFtZSA9IDMyOworICAgICAgICBjaGFyICAgICAgICAgICAgICAgIG1OYW1lW2tNYXhOYW1lXTsKKyAgICB9OworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvLyBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gcmVhZCBkYXRhIGZyb20gZWFjaCB0aHJlYWQncyBpbmRpdmlkdWFsIEZJRk8gaW4gc2hhcmVkIG1lbW9yeQorICAgIC8vIGFuZCB3cml0ZSBpdCB0byBhIHNpbmdsZSBGSUZPIGluIGxvY2FsIG1lbW9yeS4KKyAgICBjbGFzcyBNZXJnZXIgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgcHVibGljOgorICAgICAgICBNZXJnZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSk7CisKKyAgICAgICAgdmlydHVhbCB+TWVyZ2VyKCkge30KKworICAgICAgICB2b2lkIGFkZFJlYWRlcihjb25zdCBOYW1lZFJlYWRlciAmcmVhZGVyKTsKKyAgICAgICAgLy8gVE9ETyBhZGQgcmVtb3ZlUmVhZGVyCisgICAgICAgIHZvaWQgbWVyZ2UoKTsKKworICAgICAgICAvLyBGSVhNRSBUaGlzIGlzIHJldHVybmluZyBhIHJlZmVyZW5jZSB0byBhIHNoYXJlZCB2YXJpYWJsZSB0aGF0IG5lZWRzIGEgbG9jaworICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxOYW1lZFJlYWRlcj4mIGdldE5hbWVkUmVhZGVycygpIGNvbnN0OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgLy8gdmVjdG9yIG9mIHRoZSByZWFkZXJzIHRoZSBtZXJnZXIgaXMgc3VwcG9zZWQgdG8gbWVyZ2UgZnJvbS4KKyAgICAgICAgLy8gZXZlcnkgcmVhZGVyIHJlYWRzIGZyb20gYSB3cml0ZXIncyBidWZmZXIKKyAgICAgICAgLy8gRklYTUUgTmVlZHMgdG8gYmUgcHJvdGVjdGVkIGJ5IGEgbG9jaworICAgICAgICBzdGQ6OnZlY3RvcjxOYW1lZFJlYWRlcj4gbU5hbWVkUmVhZGVyczsKKworICAgICAgICBTaGFyZWQgKiBjb25zdCBtU2hhcmVkOyAvLyByYXcgcG9pbnRlciB0byBzaGFyZWQgbWVtb3J5CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvPiBtRmlmbzsgLy8gRklGTyBpdHNlbGYKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiBtRmlmb1dyaXRlcjsgLy8gdXNlZCB0byB3cml0ZSB0byBGSUZPCisgICAgfTsKKworICAgIC8vIFRoaXMgY2xhc3MgaGFzIGEgcG9pbnRlciB0byB0aGUgRklGTyBpbiBsb2NhbCBtZW1vcnkgd2hpY2ggc3RvcmVzIHRoZSBtZXJnZWQKKyAgICAvLyBkYXRhIGNvbGxlY3RlZCBieSBOQkxvZzo6TWVyZ2VyIGZyb20gYWxsIE5hbWVkUmVhZGVycy4gSXQgaXMgdXNlZCB0byBwcm9jZXNzCisgICAgLy8gdGhpcyBkYXRhIGFuZCB3cml0ZSB0aGUgcmVzdWx0IHRvIFBlcmZvcm1hbmNlQW5hbHlzaXMuCisgICAgY2xhc3MgTWVyZ2VSZWFkZXIgOiBwdWJsaWMgUmVhZGVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIE1lcmdlUmVhZGVyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUsIE1lcmdlciAmbWVyZ2VyKTsKKworICAgICAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgaW5kZW50ID0gMCk7CisgICAgICAgIC8vIHByb2Nlc3MgYSBwYXJ0aWN1bGFyIHNuYXBzaG90IG9mIHRoZSByZWFkZXIKKyAgICAgICAgdm9pZCBnZXRBbmRQcm9jZXNzU25hcHNob3QoU25hcHNob3QgJiBzbmFwKTsKKyAgICAgICAgLy8gY2FsbCBnZXRTbmFwc2hvdCBvZiB0aGUgY29udGVudCBvZiB0aGUgcmVhZGVyJ3MgYnVmZmVyIGFuZCBwcm9jZXNzIHRoZSBkYXRhCisgICAgICAgIHZvaWQgZ2V0QW5kUHJvY2Vzc1NuYXBzaG90KCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICAvLyBGSVhNRSBOZWVkcyB0byBiZSBwcm90ZWN0ZWQgYnkgYSBsb2NrLAorICAgICAgICAvLyAgICAgICBiZWNhdXNlIGV2ZW4gdGhvdWdoIG91ciB1c2Ugb2YgaXQgaXMgcmVhZC1vbmx5IHRoZXJlIG1heSBiZSBhc3luY2hyb25vdXMgdXBkYXRlcworICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxOYW1lZFJlYWRlcj4mIG1OYW1lZFJlYWRlcnM7CisKKyAgICAgICAgLy8gYW5hbHl6ZXMsIGNvbXByZXNzZXMgYW5kIHN0b3JlcyB0aGUgbWVyZ2VkIGRhdGEKKyAgICAgICAgLy8gY29udGFpbnMgYSBzZXBhcmF0ZSBpbnN0YW5jZSBmb3IgZXZlcnkgYXV0aG9yICh0aHJlYWQpLCBhbmQgZm9yIGV2ZXJ5IHNvdXJjZSBmaWxlCisgICAgICAgIC8vIGxvY2F0aW9uIHdpdGhpbiBlYWNoIGF1dGhvcgorICAgICAgICBSZXBvcnRQZXJmb3JtYW5jZTo6UGVyZm9ybWFuY2VBbmFseXNpc01hcCBtVGhyZWFkUGVyZm9ybWFuY2VBbmFseXNpczsKKworICAgICAgICAvLyBoYW5kbGUgYXV0aG9yIGVudHJ5IGJ5IGxvb2tpbmcgdXAgdGhlIGF1dGhvcidzIG5hbWUgYW5kIGFwcGVuZGluZyBpdCB0byB0aGUgYm9keQorICAgICAgICAvLyByZXR1cm5zIG51bWJlciBvZiBieXRlcyByZWFkIGZyb20gZm10RW50cnkKKyAgICAgICAgdm9pZCBoYW5kbGVBdXRob3IoY29uc3QgQWJzdHJhY3RFbnRyeSAmZm10RW50cnksIFN0cmluZzggKmJvZHkpOworICAgIH07CisKKyAgICAvLyBNZXJnZVRocmVhZCBpcyBhIHRocmVhZCB0aGF0IGNvbnRhaW5zIGEgTWVyZ2VyLiBJdCB3b3JrcyBhcyBhIHJldHJpZ2dlcmFibGUgb25lLXNob3Q6CisgICAgLy8gd2hlbiB0cmlnZ2VyZWQsIGl0IGF3YWtlcyBmb3IgYSBsYXBzZSBvZiB0aW1lLCBkdXJpbmcgd2hpY2ggaXQgcGVyaW9kaWNhbGx5IG1lcmdlczsgaWYKKyAgICAvLyByZXRyaWdnZXJlZCwgdGhlIHRpbWVvdXQgaXMgcmVzZXQuCisgICAgLy8gVGhlIHRocmVhZCBpcyB0cmlnZ2VyZWQgb24gQXVkaW9GbGluZ2VyIGJpbmRlciBhY3Rpdml0eS4KKyAgICBjbGFzcyBNZXJnZVRocmVhZCA6IHB1YmxpYyBUaHJlYWQgeworICAgIHB1YmxpYzoKKyAgICAgICAgTWVyZ2VUaHJlYWQoTWVyZ2VyICZtZXJnZXIsIE1lcmdlUmVhZGVyICZtZXJnZVJlYWRlcik7CisgICAgICAgIHZpcnR1YWwgfk1lcmdlVGhyZWFkKCkgb3ZlcnJpZGU7CisKKyAgICAgICAgLy8gUmVzZXQgdGltZW91dCBhbmQgYWN0aXZhdGUgdGhyZWFkIHRvIG1lcmdlIHBlcmlvZGljYWxseSBpZiBpdCdzIGlkbGUKKyAgICAgICAgdm9pZCB3YWtldXAoKTsKKworICAgICAgICAvLyBTZXQgdGltZW91dCBwZXJpb2QgdW50aWwgdGhlIG1lcmdpbmcgdGhyZWFkIGdvZXMgaWRsZSBhZ2FpbgorICAgICAgICB2b2lkIHNldFRpbWVvdXRVcyhpbnQgdGltZSk7CisKKyAgICBwcml2YXRlOgorICAgICAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpIG92ZXJyaWRlOworCisgICAgICAgIC8vIHRoZSBtZXJnZXIgd2hvIGFjdHVhbGx5IGRvZXMgdGhlIHdvcmsgb2YgbWVyZ2luZyB0aGUgbG9ncworICAgICAgICBNZXJnZXImICAgICBtTWVyZ2VyOworCisgICAgICAgIC8vIHRoZSBtZXJnZXJlYWRlciB1c2VkIHRvIHByb2Nlc3MgZGF0YSBtZXJnZWQgYnkgbU1lcmdlcgorICAgICAgICBNZXJnZVJlYWRlciYgbU1lcmdlUmVhZGVyOworCisgICAgICAgIC8vIG11dGV4IGZvciB0aGUgY29uZGl0aW9uIHZhcmlhYmxlCisgICAgICAgIE11dGV4ICAgICAgIG1NdXRleDsKKworICAgICAgICAvLyBjb25kaXRpb24gdmFyaWFibGUgdG8gYWN0aXZhdGUgbWVyZ2luZyBvbiB0aW1lb3V0ID49IDAKKyAgICAgICAgQ29uZGl0aW9uICAgbUNvbmQ7CisKKyAgICAgICAgLy8gdGltZSBsZWZ0IHVudGlsIHRoZSB0aHJlYWQgYmxvY2tzIGFnYWluIChpbiBtaWNyb3NlY29uZHMpCisgICAgICAgIGludCAgICAgICAgIG1UaW1lb3V0VXM7CisKKyAgICAgICAgLy8gbWVyZ2luZyBwZXJpb2Qgd2hlbiB0aGUgdGhyZWFkIGlzIGF3YWtlCisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgIGtUaHJlYWRTbGVlcFBlcmlvZFVzID0gMTAwMDAwMCAvKjFzKi87CisKKyAgICAgICAgLy8gaW5pdGlhbCB0aW1lb3V0IHZhbHVlIHdoZW4gdHJpZ2dlcmVkCisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgIGtUaHJlYWRXYWtldXBQZXJpb2RVcyA9IDMwMDAwMDAgLyozcyovOworICAgIH07CisKK307ICAvLyBjbGFzcyBOQkxvZworCisvLyBUT0RPIHB1dCBzb21ld2hlcmUgZWxzZQorc3RhdGljIGlubGluZSBpbnQ2NF90IGdldF9tb25vdG9uaWNfbnMoKSB7CisgICAgdGltZXNwZWMgdHM7CisgICAgaWYgKGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdHMpID09IDApIHsKKyAgICAgICAgcmV0dXJuICh1aW50NjRfdCkgdHMudHZfc2VjICogMTAwMCAqIDEwMDAgKiAxMDAwICsgdHMudHZfbnNlYzsKKyAgICB9CisgICAgcmV0dXJuIDA7IC8vIHNob3VsZCBub3QgaGFwcGVuLgorfQorCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX01FRElBX05CTE9HX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5oIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRmZTlkNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5oCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX1BFUkZPUk1BTkNFQU5BTFlTSVNfSAorI2RlZmluZSBBTkRST0lEX01FRElBX1BFUkZPUk1BTkNFQU5BTFlTSVNfSAorCisjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPG1lZGlhL25ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlIHsKKworY2xhc3MgUGVyZm9ybWFuY2VBbmFseXNpczsKKworLy8gYSBtYXAgb2YgUGVyZm9ybWFuY2VBbmFseXNpcyBpbnN0YW5jZXMKKy8vIFRoZSBvdXRlciBrZXkgaXMgZm9yIHRoZSB0aHJlYWQsIHRoZSBpbm5lciBrZXkgZm9yIHRoZSBzb3VyY2UgZmlsZSBsb2NhdGlvbi4KK3VzaW5nIFBlcmZvcm1hbmNlQW5hbHlzaXNNYXAgPSBzdGQ6Om1hcDxpbnQsIHN0ZDo6bWFwPGxvZ19oYXNoX3QsIFBlcmZvcm1hbmNlQW5hbHlzaXM+PjsKKworY2xhc3MgUGVyZm9ybWFuY2VBbmFseXNpcyB7CisgICAgLy8gVGhpcyBjbGFzcyBzdG9yZXMgYW5kIGFuYWx5emVzIGF1ZGlvIHByb2Nlc3Npbmcgd2FrZXVwIHRpbWVzdGFtcHMgZnJvbSBOQkxvZworICAgIC8vIEZJWE1FOiBjdXJyZW50bHksIGFsbCBwZXJmb3JtYW5jZSBkYXRhIGlzIHN0b3JlZCBpbiBkZXF1ZXMuIFR1cm4gdGhlc2UgaW50byBjaXJjdWxhcgorICAgIC8vIGJ1ZmZlcnMuCisgICAgLy8gVE9ETzogYWRkIGEgbXV0ZXguCitwdWJsaWM6CisKKyAgICBQZXJmb3JtYW5jZUFuYWx5c2lzKCkge307CisKKyAgICBmcmllbmQgdm9pZCBkdW1wKGludCBmZCwgaW50IGluZGVudCwKKyAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1hbmNlQW5hbHlzaXNNYXAgJnRocmVhZFBlcmZvcm1hbmNlQW5hbHlzaXMpOworCisgICAgLy8gQ2FsbGVkIGluIHRoZSBjYXNlIG9mIGFuIGF1ZGlvIG9uL29mZiBldmVudCwgZS5nLiwgRVZFTlRfQVVESU9fU1RBVEUuCisgICAgLy8gVXNlZCB0byBkaXNjYXJkIGlkbGUgdGltZSBpbnRlcnZhbHMKKyAgICB2b2lkIGhhbmRsZVN0YXRlQ2hhbmdlKCk7CisKKyAgICAvLyBXcml0ZXMgd2FrZXVwIHRpbWVzdGFtcCBlbnRyeSB0byBsb2cgYW5kIHJ1bnMgYW5hbHlzaXMKKyAgICB2b2lkIGxvZ1RzRW50cnkodGltZXN0YW1wIHRzKTsKKworICAgIC8vIEZJWE1FOiBtYWtlIHBlYWtkZXRlY3RvciBhbmQgc3RvcmVPdXRsaWVyRGF0YSBhIHNpbmdsZSBmdW5jdGlvbgorICAgIC8vIElucHV0OiBtT3V0bGllckRhdGEuIExvb2tzIGF0IHRpbWUgZWxhcHNlZCBiZXR3ZWVuIG91dGxpZXJzCisgICAgLy8gZmluZHMgc2lnbmlmaWNhbnQgY2hhbmdlcyBpbiB0aGUgZGlzdHJpYnV0aW9uCisgICAgLy8gd3JpdGVzIHRpbWVzdGFtcHMgb2Ygc2lnbmlmaWNhbnQgY2hhbmdlcyB0byBtUGVha1RpbWVzdGFtcHMKKyAgICBib29sIGRldGVjdEFuZFN0b3JlUGVhayhtc0ludGVydmFsIGRlbHRhLCB0aW1lc3RhbXAgdHMpOworCisgICAgLy8gc3RvcmVzIHRpbWVzdGFtcHMgb2YgaW50ZXJ2YWxzIGFib3ZlIGEgdGhyZXNob2xkOiB0aGVzZSBhcmUgYXNzdW1lZCBvdXRsaWVycy4KKyAgICAvLyB3cml0ZXMgdG8gbU91dGxpZXJEYXRhIDx0aW1lIGVsYXBzZWQgc2luY2UgcHJldmlvdXMgb3V0bGllciwgb3V0bGllciB0aW1lc3RhbXA+CisgICAgYm9vbCBkZXRlY3RBbmRTdG9yZU91dGxpZXIoY29uc3QgbXNJbnRlcnZhbCBkaWZmTXMpOworCisgICAgLy8gR2VuZXJhdGVzIGEgc3RyaW5nIG9mIGFuYWx5c2lzIG9mIHRoZSBidWZmZXIgcGVyaW9kcyBhbmQgcHJpbnRzIHRvIGNvbnNvbGUKKyAgICAvLyBGSVhNRTogbW92ZSB0aGlzIGRhdGEgdmlzdWFsaXphdGlvbiB0byBhIHNlcGFyYXRlIGNsYXNzLiBNb2RlbC92aWV3L2NvbnRyb2xsZXIKKyAgICB2b2lkIHJlcG9ydFBlcmZvcm1hbmNlKFN0cmluZzggKmJvZHksIGludCBhdXRob3IsIGxvZ19oYXNoX3QgaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhIZWlnaHQgPSAxMCk7CisKK3ByaXZhdGU6CisKKyAgICAvLyBUT0RPIHVzZSBhIGNpcmN1bGFyIGJ1ZmZlciBmb3IgdGhlIGRlcXVlcyBhbmQgdmVjdG9ycyBiZWxvdworCisgICAgLy8gc3RvcmVzIG91dGxpZXIgYW5hbHlzaXM6CisgICAgLy8gPGVsYXBzZWQgdGltZSBiZXR3ZWVuIG91dGxpZXJzIGluIG1zLCBvdXRsaWVyIGJlZ2lubmluZyB0aW1lc3RhbXA+CisgICAgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8bXNJbnRlcnZhbCwgdGltZXN0YW1wPj4gbU91dGxpZXJEYXRhOworCisgICAgLy8gc3RvcmVzIGVhY2ggdGltZXN0YW1wIGF0IHdoaWNoIGEgcGVhayB3YXMgZGV0ZWN0ZWQKKyAgICAvLyBhIHBlYWsgaXMgYSBtb21lbnQgYXQgd2hpY2ggdGhlIGF2ZXJhZ2Ugb3V0bGllciBpbnRlcnZhbCBjaGFuZ2VkIHNpZ25pZmljYW50bHkKKyAgICBzdGQ6OmRlcXVlPHRpbWVzdGFtcD4gbVBlYWtUaW1lc3RhbXBzOworCisgICAgLy8gc3RvcmVzIGJ1ZmZlciBwZXJpb2QgaGlzdG9ncmFtcyB3aXRoIHRpbWVzdGFtcCBvZiBmaXJzdCBzYW1wbGUKKyAgICBzdGQ6OmRlcXVlPHN0ZDo6cGFpcjx0aW1lc3RhbXAsIEhpc3RvZ3JhbT4+IG1IaXN0czsKKworICAgIC8vIFBhcmFtZXRlcnMgdXNlZCB3aGVuIGRldGVjdGluZyBvdXRsaWVycworICAgIHN0cnVjdCBCdWZmZXJQZXJpb2QgeworICAgICAgICBkb3VibGUgICAgbU1lYW4gPSAtMTsgICAgICAgICAgLy8gYXZlcmFnZSB0aW1lIGJldHdlZW4gYXVkaW8gcHJvY2Vzc2luZyB3YWtldXBzCisgICAgICAgIGRvdWJsZSAgICBtT3V0bGllckZhY3RvciA9IC0xOyAvLyB2YWx1ZXMgPiBtTWVhbiAqIG1PdXRsaWVyRmFjdG9yIGFyZSBvdXRsaWVycworICAgICAgICBkb3VibGUgICAgbU91dGxpZXIgPSAtMTsgICAgICAgLy8gdGhpcyBpcyBzZXQgdG8gbU1lYW4gKiBtT3V0bGllckZhY3RvcgorICAgICAgICB0aW1lc3RhbXAgbVByZXZUcyA9IC0xOyAgICAgICAgLy8gcHJldmlvdXMgdGltZXN0YW1wCisgICAgfSBtQnVmZmVyUGVyaW9kOworCisgICAgLy8gY2FwYWNpdHkgYWxsb2NhdGVkIHRvIGRhdGEgc3RydWN0dXJlcworICAgIHN0cnVjdCBNYXhMZW5ndGggeworICAgICAgICBzaXplX3QgSGlzdHM7IC8vIG51bWJlciBvZiBoaXN0b2dyYW1zIHN0b3JlZCBpbiBtZW1vcnkKKyAgICAgICAgc2l6ZV90IE91dGxpZXJzOyAvLyBudW1iZXIgb2YgdmFsdWVzIHN0b3JlZCBpbiBvdXRsaWVyIGFycmF5CisgICAgICAgIHNpemVfdCBQZWFrczsgLy8gbnVtYmVyIG9mIHZhbHVlcyBzdG9yZWQgaW4gcGVhayBhcnJheQorICAgICAgICBpbnQgSGlzdFRpbWVzcGFuTXM7IC8vIG1heGltdW0gaGlzdG9ncmFtIHRpbWVzcGFuCisgICAgfTsKKyAgICAvLyBUaGVzZSB2YWx1ZXMgYWxsb3cgZm9yIDEwIGhvdXJzIG9mIGRhdGEgYWxsb3dpbmcgZm9yIGEgZ2xpdGNoIGFuZCBhIHBlYWsKKyAgICAvLyBhcyBvZnRlbiBhcyBldmVyeSAzIHNlY29uZHMKKyAgICBzdGF0aWMgY29uc3RleHByIE1heExlbmd0aCBrTWF4TGVuZ3RoID0gey5IaXN0cyA9IDYwLCAuT3V0bGllcnMgPSAxMjAwMCwKKyAgICAgICAgICAgIC5QZWFrcyA9IDEyMDAwLCAuSGlzdFRpbWVzcGFuTXMgPSAxMCAqIGtTZWNQZXJNaW4gKiBrTXNQZXJTZWMgfTsKKworICAgIC8vIHRoZXNlIHZhcmlhYmxlcyBlbnN1cmUgY29udGludWl0eSB3aGlsZSBhbmFseXppbmcgdGhlIHRpbWVzdGFtcAorICAgIC8vIHNlcmllcyBvbmUgc2FtcGxlIGF0IGEgdGltZS4KKyAgICAvLyBUT0RPOiBjaGFuZ2UgdGhpcyB0byBhIHJ1bm5pbmcgdmFyaWFuY2UvbWVhbiBjbGFzcworICAgIHN0cnVjdCBPdXRsaWVyRGlzdHJpYnV0aW9uIHsKKyAgICAgICAgbXNJbnRlcnZhbCBtTWVhbiA9IDA7ICAgICAgICAgLy8gc2FtcGxlIG1lYW4gc2luY2UgcHJldmlvdXMgcGVhaworICAgICAgICBtc0ludGVydmFsIG1TZCA9IDA7ICAgICAgICAgICAvLyBzYW1wbGUgc2Qgc2luY2UgcHJldmlvdXMgcGVhaworICAgICAgICBtc0ludGVydmFsIG1FbGFwc2VkID0gMDsgICAgICAvLyB0aW1lIHNpbmNlIHByZXZpb3VzIGRldGVjdGVkIG91dGxpZXIKKyAgICAgICAgY29uc3QgaW50ICBrTWF4RGV2aWF0aW9uID0gNTsgLy8gc3RhbmRhcmQgZGV2aWF0aW9ucyBmcm9tIHRoZSBtZWFuIHRocmVzaG9sZAorICAgICAgICBtc0ludGVydmFsIG1UeXBpY2FsRGlmZiA9IDA7ICAvLyBnbG9iYWwgbWVhbiBvZiBvdXRsaWVycworICAgICAgICBkb3VibGUgICAgIG1OID0gMDsgICAgICAgICAgICAvLyBsZW5ndGggb2Ygc2VxdWVuY2Ugc2luY2UgdGhlIGxhc3QgcGVhaworICAgICAgICBkb3VibGUgICAgIG1NMiA9IDA7ICAgICAgICAgICAvLyB1c2VkIHRvIGNhbGN1bGF0ZSBzZAorICAgIH0gbU91dGxpZXJEaXN0cmlidXRpb247Cit9OworCit2b2lkIGR1bXAoaW50IGZkLCBpbnQgaW5kZW50LCBQZXJmb3JtYW5jZUFuYWx5c2lzTWFwICZ0aHJlYWRQZXJmb3JtYW5jZUFuYWx5c2lzKTsKK3ZvaWQgZHVtcExpbmUoaW50IGZkLCBpbnQgaW5kZW50LCBjb25zdCBTdHJpbmc4ICZib2R5KTsKKworfSAvLyBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UKKworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9QRVJGT1JNQU5DRUFOQUxZU0lTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuaCBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzA4NDJmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfUkVQT1JUUEVSRk9STUFOQ0VfSAorI2RlZmluZSBBTkRST0lEX01FRElBX1JFUE9SVFBFUkZPUk1BTkNFX0gKKworI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gVGhlIFN0cmluZzggY2xhc3MgaXMgdXNlZCBieSByZXBvcnRQZXJmb3JtYW5jZSBmdW5jdGlvbgorY2xhc3MgU3RyaW5nODsKKworbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlIHsKKworY29uc3RleHByIGludCBrTXNQZXJTZWMgPSAxMDAwOworY29uc3RleHByIGludCBrU2VjUGVyTWluID0gNjA7CisKK2NvbnN0ZXhwciBpbnQga0ppZmZ5UGVyTXMgPSAxMDsgLy8gdGltZSB1bml0IGZvciBoaXN0b2dyYW0gYXMgYSBtdWx0aXBsZSBvZiBtaWxsaXNlY29uZHMKKworLy8gc3RvcmVzIGEgaGlzdG9ncmFtOiBrZXk6IG9ic2VydmVkIGJ1ZmZlciBwZXJpb2QgKG11bHRpcGxlIG9mIGppZmZ5KS4gdmFsdWU6IGNvdW50Cit1c2luZyBIaXN0b2dyYW0gPSBzdGQ6Om1hcDxpbnQsIGludD47CisKK3VzaW5nIG1zSW50ZXJ2YWwgPSBkb3VibGU7Cit1c2luZyBqaWZmeUludGVydmFsID0gZG91YmxlOworCit1c2luZyB0aW1lc3RhbXAgPSBpbnQ2NF90OworCit1c2luZyBsb2dfaGFzaF90ID0gdWludDY0X3Q7CisKK3N0YXRpYyBpbmxpbmUgaW50IGRlbHRhTXMoaW50NjRfdCBuczEsIGludDY0X3QgbnMyKSB7CisgICAgcmV0dXJuIChuczIgLSBuczEpIC8gKDEwMDAgKiAxMDAwKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZGVsdGFKaWZmeShpbnQ2NF90IG5zMSwgaW50NjRfdCBuczIpIHsKKyAgICByZXR1cm4gKGtKaWZmeVBlck1zICogKG5zMiAtIG5zMSkpIC8gKDEwMDAgKiAxMDAwKTsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBsb2cyKHVpbnQzMl90IHgpIHsKKyAgICAvLyBUaGlzIHdvcmtzIGZvciB4ID4gMAorICAgIHJldHVybiAzMSAtIF9fYnVpbHRpbl9jbHooeCk7Cit9CisKKy8vIFdyaXRlcyBvdXRsaWVyIGludGVydmFscywgdGltZXN0YW1wcywgcGVha3MgdGltZXN0YW1wcywgYW5kIGhpc3RvZ3JhbXMgdG8gYSBmaWxlLgordm9pZCB3cml0ZVRvRmlsZShjb25zdCBzdGQ6OmRlcXVlPHN0ZDo6cGFpcjx0aW1lc3RhbXAsIEhpc3RvZ3JhbT4+ICZoaXN0cywKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8bXNJbnRlcnZhbCwgdGltZXN0YW1wPj4gJm91dGxpZXJEYXRhLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmRlcXVlPHRpbWVzdGFtcD4gJnBlYWtUaW1lc3RhbXBzLAorICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoga0RpcmVjdG9yeSwgYm9vbCBhcHBlbmQsIGludCBhdXRob3IsIGxvZ19oYXNoX3QgaGFzaCk7CisKK30gLy8gbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlCisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfUkVQT1JUUEVSRk9STUFOQ0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUFDRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FBQ0V4dHJhY3Rvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiYTE4NTguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUFDRXh0cmFjdG9yLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM5MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJBQUNFeHRyYWN0b3IiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJpbmNsdWRlL0FBQ0V4dHJhY3Rvci5oIgotI2luY2x1ZGUgImluY2x1ZGUvYXZjX3V0aWxzLmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBBQUNTb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UgewotcHVibGljOgotICAgIEFBQ1NvdXJjZShjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLAotICAgICAgICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEsCi0gICAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50NjRfdD4gJm9mZnNldF92ZWN0b3IsCi0gICAgICAgICAgICAgIGludDY0X3QgZnJhbWVfZHVyYXRpb25fdXMpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0KLSAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+QUFDU291cmNlKCk7Ci0KLXByaXZhdGU6Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4RnJhbWVTaXplOwotICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOwotICAgIHNwPE1ldGFEYXRhPiBtTWV0YTsKLQotICAgIG9mZjY0X3QgbU9mZnNldDsKLSAgICBpbnQ2NF90IG1DdXJyZW50VGltZVVzOwotICAgIGJvb2wgbVN0YXJ0ZWQ7Ci0gICAgTWVkaWFCdWZmZXJHcm91cCAqbUdyb3VwOwotCi0gICAgVmVjdG9yPHVpbnQ2NF90PiBtT2Zmc2V0VmVjdG9yOwotICAgIGludDY0X3QgbUZyYW1lRHVyYXRpb25VczsKLQotICAgIEFBQ1NvdXJjZShjb25zdCBBQUNTb3VyY2UgJik7Ci0gICAgQUFDU291cmNlICZvcGVyYXRvcj0oY29uc3QgQUFDU291cmNlICYpOwotfTsKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotLy8gUmV0dXJucyB0aGUgc2FtcGxlIHJhdGUgYmFzZWQgb24gdGhlIHNhbXBsaW5nIGZyZXF1ZW5jeSBpbmRleAotdWludDMyX3QgZ2V0X3NhbXBsZV9yYXRlKGNvbnN0IHVpbnQ4X3Qgc2ZfaW5kZXgpCi17Ci0gICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IHNhbXBsZV9yYXRlc1tdID0KLSAgICB7Ci0gICAgICAgIDk2MDAwLCA4ODIwMCwgNjQwMDAsIDQ4MDAwLCA0NDEwMCwgMzIwMDAsCi0gICAgICAgIDI0MDAwLCAyMjA1MCwgMTYwMDAsIDEyMDAwLCAxMTAyNSwgODAwMAotICAgIH07Ci0KLSAgICBpZiAoc2ZfaW5kZXggPCBzaXplb2Yoc2FtcGxlX3JhdGVzKSAvIHNpemVvZihzYW1wbGVfcmF0ZXNbMF0pKSB7Ci0gICAgICAgIHJldHVybiBzYW1wbGVfcmF0ZXNbc2ZfaW5kZXhdOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi0vLyBSZXR1cm5zIHRoZSBmcmFtZSBsZW5ndGggaW4gYnl0ZXMgYXMgZGVzY3JpYmVkIGluIGFuIEFEVFMgaGVhZGVyIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBvZmZzZXQsCi0vLyAgICAgb3IgMCBpZiB0aGUgc2l6ZSBjYW4ndCBiZSByZWFkIGR1ZSB0byBhbiBlcnJvciBpbiB0aGUgaGVhZGVyIG9yIGEgcmVhZCBmYWlsdXJlLgotLy8gVGhlIHJldHVybmVkIHZhbHVlIGlzIHRoZSBBQUMgZnJhbWUgc2l6ZSB3aXRoIHRoZSBBRFRTIGhlYWRlciBsZW5ndGggKHJlZ2FyZGxlc3Mgb2YKLS8vICAgICB0aGUgcHJlc2VuY2Ugb2YgdGhlIENSQykuCi0vLyBJZiBoZWFkZXJTaXplIGlzIG5vbi1OVUxMLCBpdCB3aWxsIGJlIHVzZWQgdG8gcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBoZWFkZXIgb2YgdGhpcyBBRFRTIGZyYW1lLgotc3RhdGljIHNpemVfdCBnZXRBZHRzRnJhbWVMZW5ndGgoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCogaGVhZGVyU2l6ZSkgewotCi0gICAgY29uc3Qgc2l6ZV90IGtBZHRzSGVhZGVyTGVuZ3RoTm9DcmMgPSA3OwotICAgIGNvbnN0IHNpemVfdCBrQWR0c0hlYWRlckxlbmd0aFdpdGhDcmMgPSA5OwotCi0gICAgc2l6ZV90IGZyYW1lU2l6ZSA9IDA7Ci0KLSAgICB1aW50OF90IHN5bmN3b3JkWzJdOwotICAgIGlmIChzb3VyY2UtPnJlYWRBdChvZmZzZXQsICZzeW5jd29yZCwgMikgIT0gMikgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKChzeW5jd29yZFswXSAhPSAweGZmKSB8fCAoKHN5bmN3b3JkWzFdICYgMHhmNikgIT0gMHhmMCkpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgdWludDhfdCBwcm90ZWN0aW9uQWJzZW50OwotICAgIGlmIChzb3VyY2UtPnJlYWRBdChvZmZzZXQgKyAxLCAmcHJvdGVjdGlvbkFic2VudCwgMSkgPCAxKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBwcm90ZWN0aW9uQWJzZW50ICY9IDB4MTsKLQotICAgIHVpbnQ4X3QgaGVhZGVyWzNdOwotICAgIGlmIChzb3VyY2UtPnJlYWRBdChvZmZzZXQgKyAzLCAmaGVhZGVyLCAzKSA8IDMpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgZnJhbWVTaXplID0gKGhlYWRlclswXSAmIDB4MykgPDwgMTEgfCBoZWFkZXJbMV0gPDwgMyB8IGhlYWRlclsyXSA+PiA1OwotCi0gICAgLy8gcHJvdGVjdGlvbkFic2VudCBpcyAwIGlmIHRoZXJlIGlzIENSQwotICAgIHNpemVfdCBoZWFkU2l6ZSA9IHByb3RlY3Rpb25BYnNlbnQgPyBrQWR0c0hlYWRlckxlbmd0aE5vQ3JjIDoga0FkdHNIZWFkZXJMZW5ndGhXaXRoQ3JjOwotICAgIGlmIChoZWFkU2l6ZSA+IGZyYW1lU2l6ZSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKGhlYWRlclNpemUgIT0gTlVMTCkgewotICAgICAgICAqaGVhZGVyU2l6ZSA9IGhlYWRTaXplOwotICAgIH0KLQotICAgIHJldHVybiBmcmFtZVNpemU7Ci19Ci0KLUFBQ0V4dHJhY3Rvcjo6QUFDRXh0cmFjdG9yKAotICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBjb25zdCBzcDxBTWVzc2FnZT4gJl9tZXRhKQotICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKLSAgICAgIG1Jbml0Q2hlY2soTk9fSU5JVCksCi0gICAgICBtRnJhbWVEdXJhdGlvblVzKDApIHsKLSAgICBzcDxBTWVzc2FnZT4gbWV0YSA9IF9tZXRhOwotCi0gICAgaWYgKG1ldGEgPT0gTlVMTCkgewotICAgICAgICBTdHJpbmc4IG1pbWVUeXBlOwotICAgICAgICBmbG9hdCBjb25maWRlbmNlOwotICAgICAgICBzcDxBTWVzc2FnZT4gX21ldGE7Ci0KLSAgICAgICAgaWYgKCFTbmlmZkFBQyhtRGF0YVNvdXJjZSwgJm1pbWVUeXBlLCAmY29uZmlkZW5jZSwgJm1ldGEpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnQ2NF90IG9mZnNldDsKLSAgICBDSEVDSyhtZXRhLT5maW5kSW50NjQoIm9mZnNldCIsICZvZmZzZXQpKTsKLQotICAgIHVpbnQ4X3QgcHJvZmlsZSwgc2ZfaW5kZXgsIGNoYW5uZWwsIGhlYWRlclsyXTsKLSAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQgKyAyLCAmaGVhZGVyLCAyKSA8IDIpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHByb2ZpbGUgPSAoaGVhZGVyWzBdID4+IDYpICYgMHgzOwotICAgIHNmX2luZGV4ID0gKGhlYWRlclswXSA+PiAyKSAmIDB4ZjsKLSAgICB1aW50MzJfdCBzciA9IGdldF9zYW1wbGVfcmF0ZShzZl9pbmRleCk7Ci0gICAgaWYgKHNyID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjaGFubmVsID0gKGhlYWRlclswXSAmIDB4MSkgPDwgMiB8IChoZWFkZXJbMV0gPj4gNik7Ci0KLSAgICBtTWV0YSA9IE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YShwcm9maWxlLCBzZl9pbmRleCwgY2hhbm5lbCk7Ci0KLSAgICBvZmY2NF90IHN0cmVhbVNpemUsIG51bUZyYW1lcyA9IDA7Ci0gICAgc2l6ZV90IGZyYW1lU2l6ZSA9IDA7Ci0gICAgaW50NjRfdCBkdXJhdGlvbiA9IDA7Ci0KLSAgICBpZiAobURhdGFTb3VyY2UtPmdldFNpemUoJnN0cmVhbVNpemUpID09IE9LKSB7Ci0gICAgICAgICB3aGlsZSAob2Zmc2V0IDwgc3RyZWFtU2l6ZSkgewotICAgICAgICAgICAgaWYgKChmcmFtZVNpemUgPSBnZXRBZHRzRnJhbWVMZW5ndGgoc291cmNlLCBvZmZzZXQsIE5VTEwpKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coInByZW1hdHVyZWQgQUFDIHN0cmVhbSAoJWxsZCB2cyAlbGxkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW9mZnNldCwgKGxvbmcgbG9uZylzdHJlYW1TaXplKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbU9mZnNldFZlY3Rvci5wdXNoKG9mZnNldCk7Ci0KLSAgICAgICAgICAgIG9mZnNldCArPSBmcmFtZVNpemU7Ci0gICAgICAgICAgICBudW1GcmFtZXMgKys7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSb3VuZCB1cCBhbmQgZ2V0IHRoZSBkdXJhdGlvbgotICAgICAgICBtRnJhbWVEdXJhdGlvblVzID0gKDEwMjQgKiAxMDAwMDAwbGwgKyAoc3IgLSAxKSkgLyBzcjsKLSAgICAgICAgZHVyYXRpb24gPSBudW1GcmFtZXMgKiBtRnJhbWVEdXJhdGlvblVzOwotICAgICAgICBtTWV0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvbik7Ci0gICAgfQotCi0gICAgbUluaXRDaGVjayA9IE9LOwotfQotCi1BQUNFeHRyYWN0b3I6On5BQUNFeHRyYWN0b3IoKSB7Ci19Ci0KLXNwPE1ldGFEYXRhPiBBQUNFeHRyYWN0b3I6OmdldE1ldGFEYXRhKCkgewotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOwotCi0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIG1ldGE7Ci0gICAgfQotCi0gICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTKTsKLQotICAgIHJldHVybiBtZXRhOwotfQotCi1zaXplX3QgQUFDRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpIHsKLSAgICByZXR1cm4gbUluaXRDaGVjayA9PSBPSyA/IDEgOiAwOwotfQotCi1zcDxJTWVkaWFTb3VyY2U+IEFBQ0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7Ci0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggIT0gMCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gbmV3IEFBQ1NvdXJjZShtRGF0YVNvdXJjZSwgbU1ldGEsIG1PZmZzZXRWZWN0b3IsIG1GcmFtZUR1cmF0aW9uVXMpOwotfQotCi1zcDxNZXRhRGF0YT4gQUFDRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKLSAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBtTWV0YTsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotLy8gODE5MiA9IDJeMTMsIDEzYml0IEFBQyBmcmFtZSBzaXplIChpbiBieXRlcykKLWNvbnN0IHNpemVfdCBBQUNTb3VyY2U6OmtNYXhGcmFtZVNpemUgPSA4MTkyOwotCi1BQUNTb3VyY2U6OkFBQ1NvdXJjZSgKLSAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhLAotICAgICAgICBjb25zdCBWZWN0b3I8dWludDY0X3Q+ICZvZmZzZXRfdmVjdG9yLAotICAgICAgICBpbnQ2NF90IGZyYW1lX2R1cmF0aW9uX3VzKQotICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKLSAgICAgIG1NZXRhKG1ldGEpLAotICAgICAgbU9mZnNldCgwKSwKLSAgICAgIG1DdXJyZW50VGltZVVzKDApLAotICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAotICAgICAgbUdyb3VwKE5VTEwpLAotICAgICAgbU9mZnNldFZlY3RvcihvZmZzZXRfdmVjdG9yKSwKLSAgICAgIG1GcmFtZUR1cmF0aW9uVXMoZnJhbWVfZHVyYXRpb25fdXMpIHsKLX0KLQotQUFDU291cmNlOjp+QUFDU291cmNlKCkgewotICAgIGlmIChtU3RhcnRlZCkgewotICAgICAgICBzdG9wKCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBBQUNTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICogLyogcGFyYW1zICovKSB7Ci0gICAgQ0hFQ0soIW1TdGFydGVkKTsKLQotICAgIGlmIChtT2Zmc2V0VmVjdG9yLmVtcHR5KCkpIHsKLSAgICAgICAgbU9mZnNldCA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbU9mZnNldCA9IG1PZmZzZXRWZWN0b3IuaXRlbUF0KDApOwotICAgIH0KLQotICAgIG1DdXJyZW50VGltZVVzID0gMDsKLSAgICBtR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cDsKLSAgICBtR3JvdXAtPmFkZF9idWZmZXIobmV3IE1lZGlhQnVmZmVyKGtNYXhGcmFtZVNpemUpKTsKLSAgICBtU3RhcnRlZCA9IHRydWU7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEFBQ1NvdXJjZTo6c3RvcCgpIHsKLSAgICBDSEVDSyhtU3RhcnRlZCk7Ci0KLSAgICBkZWxldGUgbUdyb3VwOwotICAgIG1Hcm91cCA9IE5VTEw7Ci0KLSAgICBtU3RhcnRlZCA9IGZhbHNlOwotICAgIHJldHVybiBPSzsKLX0KLQotc3A8TWV0YURhdGE+IEFBQ1NvdXJjZTo6Z2V0Rm9ybWF0KCkgewotICAgIHJldHVybiBtTWV0YTsKLX0KLQotc3RhdHVzX3QgQUFDU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKLSAgICAqb3V0ID0gTlVMTDsKLQotICAgIGludDY0X3Qgc2Vla1RpbWVVczsKLSAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKLSAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSkgewotICAgICAgICBpZiAobUZyYW1lRHVyYXRpb25VcyA+IDApIHsKLSAgICAgICAgICAgIGludDY0X3Qgc2Vla0ZyYW1lID0gc2Vla1RpbWVVcyAvIG1GcmFtZUR1cmF0aW9uVXM7Ci0gICAgICAgICAgICBpZiAoc2Vla0ZyYW1lIDwgMCB8fCBzZWVrRnJhbWUgPj0gKGludDY0X3QpbU9mZnNldFZlY3Rvci5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjcwMjM5NTA3Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DdXJyZW50VGltZVVzID0gc2Vla0ZyYW1lICogbUZyYW1lRHVyYXRpb25VczsKLQotICAgICAgICAgICAgbU9mZnNldCA9IG1PZmZzZXRWZWN0b3IuaXRlbUF0KHNlZWtGcmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzaXplX3QgZnJhbWVTaXplLCBmcmFtZVNpemVXaXRob3V0SGVhZGVyLCBoZWFkZXJTaXplOwotICAgIGlmICgoZnJhbWVTaXplID0gZ2V0QWR0c0ZyYW1lTGVuZ3RoKG1EYXRhU291cmNlLCBtT2Zmc2V0LCAmaGVhZGVyU2l6ZSkpID09IDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07Ci0gICAgfQotCi0gICAgTWVkaWFCdWZmZXIgKmJ1ZmZlcjsKLSAgICBzdGF0dXNfdCBlcnIgPSBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBmcmFtZVNpemVXaXRob3V0SGVhZGVyID0gZnJhbWVTaXplIC0gaGVhZGVyU2l6ZTsKLSAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChtT2Zmc2V0ICsgaGVhZGVyU2l6ZSwgYnVmZmVyLT5kYXRhKCksCi0gICAgICAgICAgICAgICAgZnJhbWVTaXplV2l0aG91dEhlYWRlcikgIT0gKHNzaXplX3QpZnJhbWVTaXplV2l0aG91dEhlYWRlcikgewotICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgYnVmZmVyID0gTlVMTDsKLQotICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgfQotCi0gICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgZnJhbWVTaXplV2l0aG91dEhlYWRlcik7Ci0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIG1DdXJyZW50VGltZVVzKTsKLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOwotCi0gICAgbU9mZnNldCArPSBmcmFtZVNpemU7Ci0gICAgbUN1cnJlbnRUaW1lVXMgKz0gbUZyYW1lRHVyYXRpb25VczsKLQotICAgICpvdXQgPSBidWZmZXI7Ci0gICAgcmV0dXJuIE9LOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1ib29sIFNuaWZmQUFDKAotICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UsCi0gICAgICAgIHNwPEFNZXNzYWdlPiAqbWV0YSkgewotICAgIG9mZjY0X3QgcG9zID0gMDsKLQotICAgIGZvciAoOzspIHsKLSAgICAgICAgdWludDhfdCBpZDNoZWFkZXJbMTBdOwotICAgICAgICBpZiAoc291cmNlLT5yZWFkQXQocG9zLCBpZDNoZWFkZXIsIHNpemVvZihpZDNoZWFkZXIpKQotICAgICAgICAgICAgICAgIDwgKHNzaXplX3Qpc2l6ZW9mKGlkM2hlYWRlcikpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtZW1jbXAoIklEMyIsIGlkM2hlYWRlciwgMykpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2tpcCB0aGUgSUQzdjIgaGVhZGVyLgotCi0gICAgICAgIHNpemVfdCBsZW4gPQotICAgICAgICAgICAgKChpZDNoZWFkZXJbNl0gJiAweDdmKSA8PCAyMSkKLSAgICAgICAgICAgIHwgKChpZDNoZWFkZXJbN10gJiAweDdmKSA8PCAxNCkKLSAgICAgICAgICAgIHwgKChpZDNoZWFkZXJbOF0gJiAweDdmKSA8PCA3KQotICAgICAgICAgICAgfCAoaWQzaGVhZGVyWzldICYgMHg3Zik7Ci0KLSAgICAgICAgbGVuICs9IDEwOwotCi0gICAgICAgIHBvcyArPSBsZW47Ci0KLSAgICAgICAgQUxPR1YoInNraXBwZWQgSUQzIHRhZywgbmV3IHN0YXJ0aW5nIG9mZnNldCBpcyAlbGxkICgweCUwMTZsbHgpIiwKLSAgICAgICAgICAgICAgICAobG9uZyBsb25nKXBvcywgKGxvbmcgbG9uZylwb3MpOwotICAgIH0KLQotICAgIHVpbnQ4X3QgaGVhZGVyWzJdOwotCi0gICAgaWYgKHNvdXJjZS0+cmVhZEF0KHBvcywgJmhlYWRlciwgMikgIT0gMikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gQURUUyBzeW5jd29yZAotICAgIGlmICgoaGVhZGVyWzBdID09IDB4ZmYpICYmICgoaGVhZGVyWzFdICYgMHhmNikgPT0gMHhmMCkpIHsKLSAgICAgICAgKm1pbWVUeXBlID0gTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFM7Ci0gICAgICAgICpjb25maWRlbmNlID0gMC4yOwotCi0gICAgICAgICptZXRhID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAoKm1ldGEpLT5zZXRJbnQ2NCgib2Zmc2V0IiwgcG9zKTsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQUNXcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUFDV3JpdGVyLmNwcAppbmRleCA4YjFlMWMzLi4yZWE1ZmNkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQUNXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FBQ1dyaXRlci5jcHAKQEAgLTMwLDggKzMwLDggQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFyZWNvcmRlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC02Nyw3ICs2Nyw3IEBACiB9CiAKIAotc3RhdHVzX3QgQUFDV3JpdGVyOjphZGRTb3VyY2UoY29uc3Qgc3A8SU1lZGlhU291cmNlPiAmc291cmNlKSB7CitzdGF0dXNfdCBBQUNXcml0ZXI6OmFkZFNvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSkgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBtSW5pdENoZWNrOwogICAgIH0KQEAgLTI5NCw3ICsyOTQsNyBAQAogICAgIHByY3RsKFBSX1NFVF9OQU1FLCAodW5zaWduZWQgbG9uZykiQUFDV3JpdGVyVGhyZWFkIiwgMCwgMCwgMCk7CiAKICAgICB3aGlsZSAoIW1Eb25lICYmIGVyciA9PSBPSykgewotICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyOworICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcjsKICAgICAgICAgZXJyID0gbVNvdXJjZS0+cmVhZCgmYnVmZmVyKTsKIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CkBAIC0zMTYsNyArMzE2LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGludDMyX3QgaXNDb2RlY1NwZWNpZmljID0gMDsKLSAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQzMihrS2V5SXNDb2RlY0NvbmZpZywgJmlzQ29kZWNTcGVjaWZpYykgJiYgaXNDb2RlY1NwZWNpZmljKSB7CisgICAgICAgIGlmIChidWZmZXItPm1ldGFfZGF0YSgpLmZpbmRJbnQzMihrS2V5SXNDb2RlY0NvbmZpZywgJmlzQ29kZWNTcGVjaWZpYykgJiYgaXNDb2RlY1NwZWNpZmljKSB7CiAgICAgICAgICAgICBBTE9HVigiRHJvcCBjb2RlYyBzcGVjaWZpYyBpbmZvIGJ1ZmZlciIpOwogICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBidWZmZXIgPSBOVUxMOwpAQCAtMzI0LDcgKzMyNCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzOwotICAgICAgICBDSEVDSyhidWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lc3RhbXBVcykpOworICAgICAgICBDSEVDSyhidWZmZXItPm1ldGFfZGF0YSgpLmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVzdGFtcFVzKSk7CiAgICAgICAgIGlmICh0aW1lc3RhbXBVcyA+IG1Fc3RpbWF0ZWREdXJhdGlvblVzKSB7CiAgICAgICAgICAgICBtRXN0aW1hdGVkRHVyYXRpb25VcyA9IHRpbWVzdGFtcFVzOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcAppbmRleCBhMmViOWE4Li43ZjM5ZDEwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAKQEAgLTI4LDggKzI4LDcgQEAKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oPgogCi0jaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgotCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9hdmNfdXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpAQCAtMzgsMTIgKzM3LDEyIEBACiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9CdWZmZXJQcm9kdWNlcldyYXBwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDbGllbnQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9QZXJzaXN0ZW50U3VyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFCdWZmZXJIb2xkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9PTVhCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9vbXgvMS4wL1dPbXhOb2RlLmg+CiAKQEAgLTU1LDcgKzU0LDYgQEAKICNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9JbmRleEV4dC5oPgogI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0FzU3RyaW5nLmg+CiAKLSNpbmNsdWRlICJpbmNsdWRlL2F2Y191dGlscy5oIgogI2luY2x1ZGUgImluY2x1ZGUvQUNvZGVjQnVmZmVyQ2hhbm5lbC5oIgogI2luY2x1ZGUgImluY2x1ZGUvRGF0YUNvbnZlcnRlci5oIgogI2luY2x1ZGUgImluY2x1ZGUvU2VjdXJlQnVmZmVyLmgiCkBAIC0xMjcsNiArMTI1LDMyIEBACiAgICAgfQogfQogCitzdGF0aWMgT01YX1ZJREVPX0NPTlRST0xSQVRFVFlQRSBnZXRWaWRlb0JpdHJhdGVNb2RlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgaW50MzJfdCB0bXA7CisgICAgaWYgKG1zZy0+ZmluZEludDMyKCJiaXRyYXRlLW1vZGUiLCAmdG1wKSkgeworICAgICAgICAvLyBleHBsaWNpdGx5IHRyYW5zbGF0ZSBmcm9tIE1lZGlhQ29kZWNJbmZvLkVuY29kZXJDYXBhYmlsaXRpZXMuCisgICAgICAgIC8vIEJJVFJBVEVfTU9ERV8qIGludG8gT01YIGJpdHJhdGUgbW9kZS4KKyAgICAgICAgc3dpdGNoICh0bXApIHsKKyAgICAgICAgICAgIC8vQklUUkFURV9NT0RFX0NRCisgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBPTVhfVmlkZW9fQ29udHJvbFJhdGVDb25zdGFudFF1YWxpdHk7CisgICAgICAgICAgICAvL0JJVFJBVEVfTU9ERV9WQlIKKyAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIE9NWF9WaWRlb19Db250cm9sUmF0ZVZhcmlhYmxlOworICAgICAgICAgICAgLy9CSVRSQVRFX01PREVfQ0JSCisgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBPTVhfVmlkZW9fQ29udHJvbFJhdGVDb25zdGFudDsKKyAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPTVhfVmlkZW9fQ29udHJvbFJhdGVWYXJpYWJsZTsKK30KKworc3RhdGljIGJvb2wgZmluZFZpZGVvQml0cmF0ZUNvbnRyb2xJbmZvKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLAorICAgICAgICBPTVhfVklERU9fQ09OVFJPTFJBVEVUWVBFICptb2RlLCBpbnQzMl90ICpiaXRyYXRlLCBpbnQzMl90ICpxdWFsaXR5KSB7CisgICAgKm1vZGUgPSBnZXRWaWRlb0JpdHJhdGVNb2RlKG1zZyk7CisgICAgYm9vbCBpc0NRID0gKCptb2RlID09IE9NWF9WaWRlb19Db250cm9sUmF0ZUNvbnN0YW50UXVhbGl0eSk7CisgICAgcmV0dXJuICghaXNDUSAmJiBtc2ctPmZpbmRJbnQzMigiYml0cmF0ZSIsIGJpdHJhdGUpKQorICAgICAgICAgfHwgKGlzQ1EgJiYgbXNnLT5maW5kSW50MzIoInF1YWxpdHkiLCBxdWFsaXR5KSk7Cit9CisKIHN0cnVjdCBNZXNzYWdlTGlzdCA6IHB1YmxpYyBSZWZCYXNlIHsKICAgICBNZXNzYWdlTGlzdCgpIHsKICAgICB9CkBAIC01MjgsNiArNTUyLDcgQEAKICAgICAgIG1OYXRpdmVXaW5kb3dVc2FnZUJpdHMoMCksCiAgICAgICBtTGFzdE5hdGl2ZVdpbmRvd0RhdGFTcGFjZShIQUxfREFUQVNQQUNFX1VOS05PV04pLAogICAgICAgbUlzVmlkZW8oZmFsc2UpLAorICAgICAgbUlzSW1hZ2UoZmFsc2UpLAogICAgICAgbUlzRW5jb2RlcihmYWxzZSksCiAgICAgICBtRmF0YWxFcnJvcihmYWxzZSksCiAgICAgICBtU2h1dGRvd25JblByb2dyZXNzKGZhbHNlKSwKQEAgLTU0Miw3ICs1NjcsNyBAQAogICAgICAgbU1ldGFkYXRhQnVmZmVyc1RvU3VibWl0KDApLAogICAgICAgbU51bVVuZGVxdWV1ZWRCdWZmZXJzKDApLAogICAgICAgbVJlcGVhdEZyYW1lRGVsYXlVcygtMWxsKSwKLSAgICAgIG1NYXhQdHNHYXBVcygtMWxsKSwKKyAgICAgIG1NYXhQdHNHYXBVcygwbGwpLAogICAgICAgbU1heEZwcygtMSksCiAgICAgICBtRnBzKC0xLjApLAogICAgICAgbUNhcHR1cmVGcHMoLTEuMCksCkBAIC01NTMsNiArNTc4LDggQEAKICAgICAgIG1EZXNjcmliZUhEUlN0YXRpY0luZm9JbmRleCgoT01YX0lOREVYVFlQRSkwKSwKICAgICAgIG1TdGF0ZUdlbmVyYXRpb24oMCksCiAgICAgICBtVmVuZG9yRXh0ZW5zaW9uc1N0YXR1cyhrRXh0ZW5zaW9uc1VuY2hlY2tlZCkgeworICAgIG1lbXNldCgmbUxhc3RIRFJTdGF0aWNJbmZvLCAwLCBzaXplb2YobUxhc3RIRFJTdGF0aWNJbmZvKSk7CisKICAgICBtVW5pbml0aWFsaXplZFN0YXRlID0gbmV3IFVuaW5pdGlhbGl6ZWRTdGF0ZSh0aGlzKTsKICAgICBtTG9hZGVkU3RhdGUgPSBuZXcgTG9hZGVkU3RhdGUodGhpcyk7CiAgICAgbUxvYWRlZFRvSWRsZVN0YXRlID0gbmV3IExvYWRlZFRvSWRsZVN0YXRlKHRoaXMpOwpAQCAtNTc1LDggKzYwMiw2IEBACiAgICAgbWVtc2V0KCZtTGFzdE5hdGl2ZVdpbmRvd0Nyb3AsIDAsIHNpemVvZihtTGFzdE5hdGl2ZVdpbmRvd0Nyb3ApKTsKIAogICAgIGNoYW5nZVN0YXRlKG1VbmluaXRpYWxpemVkU3RhdGUpOwotCi0gICAgbVRyZWJsZUZsYWcgPSBmYWxzZTsKIH0KIAogQUNvZGVjOjp+QUNvZGVjKCkgewpAQCAtODI4LDExICs4NTMsNyBAQAogc3RhdHVzX3QgQUNvZGVjOjphbGxvY2F0ZUJ1ZmZlcnNPblBvcnQoT01YX1UzMiBwb3J0SW5kZXgpIHsKICAgICBDSEVDSyhwb3J0SW5kZXggPT0ga1BvcnRJbmRleElucHV0IHx8IHBvcnRJbmRleCA9PSBrUG9ydEluZGV4T3V0cHV0KTsKIAotICAgIGlmIChnZXRUcmVibGVGbGFnKCkpIHsKLSAgICAgICAgQ0hFQ0sobUFsbG9jYXRvcltwb3J0SW5kZXhdID09IE5VTEwpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIENIRUNLKG1EZWFsZXJbcG9ydEluZGV4XSA9PSBOVUxMKTsKLSAgICB9CisgICAgQ0hFQ0sobUFsbG9jYXRvcltwb3J0SW5kZXhdID09IE5VTEwpOwogICAgIENIRUNLKG1CdWZmZXJzW3BvcnRJbmRleF0uaXNFbXB0eSgpKTsKIAogICAgIHN0YXR1c190IGVycjsKQEAgLTg3NCw3ICs4OTUsMTAgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHNpemVfdCBhbGlnbm1lbnQgPSBNZW1vcnlEZWFsZXI6OmdldEFsbG9jYXRpb25BbGlnbm1lbnQoKTsKKyAgICAgICAgICAgIHNpemVfdCBhbGlnbm1lbnQgPSAzMjsgLy8gVGhpcyBpcyB0aGUgdmFsdWUgY3VycmVudGx5IHJldHVybmVkIGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1lbW9yeURlYWxlcjo6Z2V0QWxsb2NhdGlvbkFsaWdubWVudCgpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBGaXggdGhpcyB3aGVuIFRyZWJsZSBoYXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWVtb3J5SGVhcC9NZW1vcnlEZWFsZXIuCiAKICAgICAgICAgICAgIEFMT0dWKCJbJXNdIEFsbG9jYXRpbmcgJXUgYnVmZmVycyBvZiBzaXplICV6dSAoZnJvbSAldSB1c2luZyAlcykgb24gJXMgcG9ydCIsCiAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksCkBAIC04OTYsMTggKzkyMCwxNSBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobW9kZSAhPSBJT01YOjprUG9ydE1vZGVQcmVzZXRTZWN1cmVCdWZmZXIpIHsKLSAgICAgICAgICAgICAgICBpZiAoZ2V0VHJlYmxlRmxhZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1BbGxvY2F0b3JbcG9ydEluZGV4XSA9IFRBbGxvY2F0b3I6OmdldFNlcnZpY2UoImFzaG1lbSIpOwotICAgICAgICAgICAgICAgICAgICBpZiAobUFsbG9jYXRvcltwb3J0SW5kZXhdID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJoaWRsIGFsbG9jYXRvciBvbiBwb3J0ICVkIGlzIG51bGwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KXBvcnRJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHRvdGFsU2l6ZSA9IGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGlnbmVkU2l6ZSArIGFsaWduZWRDb252U2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1EZWFsZXJbcG9ydEluZGV4XSA9IG5ldyBNZW1vcnlEZWFsZXIodG90YWxTaXplLCAiQUNvZGVjIik7CisgICAgICAgICAgICAgICAgbUFsbG9jYXRvcltwb3J0SW5kZXhdID0gVEFsbG9jYXRvcjo6Z2V0U2VydmljZSgiYXNobWVtIik7CisgICAgICAgICAgICAgICAgaWYgKG1BbGxvY2F0b3JbcG9ydEluZGV4XSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJoaWRsIGFsbG9jYXRvciBvbiBwb3J0ICVkIGlzIG51bGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpcG9ydEluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gVE9ETzogV2hlbiBUcmVibGUgaGFzIE1lbW9yeUhlYXAvTWVtb3J5RGVhbGVyLCB3ZSBzaG91bGQKKyAgICAgICAgICAgICAgICAvLyBzcGVjaWZ5IHRoZSBoZWFwIHNpemUgdG8gYmUKKyAgICAgICAgICAgICAgICAvLyBkZWYubkJ1ZmZlckNvdW50QWN0dWFsICogKGFsaWduZWRTaXplICsgYWxpZ25lZENvbnZTaXplKS4KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQgPQpAQCAtOTM2LDIzICs5NTcsNTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBTZWN1cmVCdWZmZXIoZm9ybWF0LCBuYXRpdmVfaGFuZGxlLCBidWZTaXplKTsKICAgICAgICAgICAgICAgICAgICAgaW5mby5tQ29kZWNEYXRhID0gaW5mby5tRGF0YTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0VHJlYmxlRmxhZygpKSB7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VjY2VzczsKKyAgICAgICAgICAgICAgICAgICAgYXV0byB0cmFuc1N0YXR1cyA9IG1BbGxvY2F0b3JbcG9ydEluZGV4XS0+YWxsb2NhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJnN1Y2Nlc3MsICZoaWRsTWVtVG9rZW5dKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkbF9tZW1vcnkgY29uc3QmIG0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGxNZW1Ub2tlbiA9IG07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJoaWRsJ3MgQXNobWVtQWxsb2NhdG9yIGZhaWxlZCBhdCB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0OiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zU3RhdHVzLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghc3VjY2VzcykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBoaWRsTWVtID0gbWFwTWVtb3J5KGhpZGxNZW1Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChoaWRsTWVtID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZXJyID0gbU9NWE5vZGUtPnVzZUJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0SW5kZXgsIGhpZGxNZW1Ub2tlbiwgJmluZm8ubUJ1ZmZlcklEKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAobW9kZSA9PSBJT01YOjprUG9ydE1vZGVEeW5hbWljQU5XQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBWaWRlb05hdGl2ZU1ldGFkYXRhKiBtZXRhRGF0YSA9IChWaWRlb05hdGl2ZU1ldGFkYXRhKikoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiloaWRsTWVtLT5nZXRQb2ludGVyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbWV0YURhdGEtPm5GZW5jZUZkID0gLTE7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpbmZvLm1Db2RlY0RhdGEgPSBuZXcgU2hhcmVkTWVtb3J5QnVmZmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgaGlkbE1lbSk7CisgICAgICAgICAgICAgICAgICAgIGluZm8ubUNvZGVjUmVmID0gaGlkbE1lbTsKKworICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSByZXF1aXJlIGNvbnZlcnNpb24sIGFsbG9jYXRlIGNvbnZlcnNpb24gYnVmZmVyIGZvciBjbGllbnQgdXNlOworICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UsIHJldXNlIGNvZGVjIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICBpZiAobUNvbnZlcnRlcltwb3J0SW5kZXhdICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0dUKGNvbnZlcnNpb25CdWZmZXJTaXplLCAoc2l6ZV90KTApOwogICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZXNzOwotICAgICAgICAgICAgICAgICAgICAgICAgYXV0byB0cmFuc1N0YXR1cyA9IG1BbGxvY2F0b3JbcG9ydEluZGV4XS0+YWxsb2NhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZlNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBtQWxsb2NhdG9yW3BvcnRJbmRleF0tPmFsbG9jYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uQnVmZmVyU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZzdWNjZXNzLCAmaGlkbE1lbVRva2VuXSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkbF9tZW1vcnkgY29uc3QmIG0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkbE1lbVRva2VuID0gbTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoImhpZGwncyBBc2htZW1BbGxvY2F0b3IgZmFpbGVkIGF0IHRoZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0OiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc1N0YXR1cy5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtOTYwLDY3ICsxMDEzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoaWRsTWVtID09IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gbU9NWE5vZGUtPnVzZUJ1ZmZlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydEluZGV4LCBoaWRsTWVtVG9rZW4sICZpbmZvLm1CdWZmZXJJRCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW0gPSBtRGVhbGVyW3BvcnRJbmRleF0tPmFsbG9jYXRlKGJ1ZlNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lbSA9PSBOVUxMIHx8IG1lbS0+cG9pbnRlcigpID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBtT01YTm9kZS0+dXNlQnVmZmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0SW5kZXgsIG1lbSwgJmluZm8ubUJ1ZmZlcklEKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtb2RlID09IElPTVg6OmtQb3J0TW9kZUR5bmFtaWNBTldCdWZmZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFZpZGVvTmF0aXZlTWV0YWRhdGEqIG1ldGFEYXRhID0gKFZpZGVvTmF0aXZlTWV0YWRhdGEqKSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VHJlYmxlRmxhZygpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKWhpZGxNZW0tPmdldFBvaW50ZXIoKSA6IG1lbS0+cG9pbnRlcigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhLT5uRmVuY2VGZCA9IC0xOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGdldFRyZWJsZUZsYWcoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5tQ29kZWNEYXRhID0gbmV3IFNoYXJlZE1lbW9yeUJ1ZmZlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBoaWRsTWVtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8ubUNvZGVjUmVmID0gaGlkbE1lbTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8ubUNvZGVjRGF0YSA9IG5ldyBTaGFyZWRNZW1vcnlCdWZmZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgbWVtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8ubUNvZGVjUmVmID0gbWVtOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgcmVxdWlyZSBjb252ZXJzaW9uLCBhbGxvY2F0ZSBjb252ZXJzaW9uIGJ1ZmZlciBmb3IgY2xpZW50IHVzZTsKLSAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCByZXVzZSBjb2RlYyBidWZmZXIKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Db252ZXJ0ZXJbcG9ydEluZGV4XSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19HVChjb252ZXJzaW9uQnVmZmVyU2l6ZSwgKHNpemVfdCkwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRUcmVibGVGbGFnKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1Y2Nlc3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFsbG9jYXRvcltwb3J0SW5kZXhdLT5hbGxvY2F0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb25CdWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZzdWNjZXNzLCAmaGlkbE1lbVRva2VuXSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRsX21lbW9yeSBjb25zdCYgbSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGxNZW1Ub2tlbiA9IG07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN1Y2Nlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkbE1lbSA9IG1hcE1lbW9yeShoaWRsTWVtVG9rZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoaWRsTWVtID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5tRGF0YSA9IG5ldyBTaGFyZWRNZW1vcnlCdWZmZXIoZm9ybWF0LCBoaWRsTWVtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLm1NZW1SZWYgPSBoaWRsTWVtOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW0gPSBtRGVhbGVyW3BvcnRJbmRleF0tPmFsbG9jYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbkJ1ZmZlclNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZW0gPT0gTlVMTHx8IG1lbS0+cG9pbnRlcigpID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5tRGF0YSA9IG5ldyBTaGFyZWRNZW1vcnlCdWZmZXIoZm9ybWF0LCBtZW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8ubU1lbVJlZiA9IG1lbTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8ubURhdGEgPSBuZXcgU2hhcmVkTWVtb3J5QnVmZmVyKGZvcm1hdCwgaGlkbE1lbSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLm1NZW1SZWYgPSBoaWRsTWVtOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5tRGF0YSA9IGluZm8ubUNvZGVjRGF0YTsKICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8ubU1lbVJlZiA9IGluZm8ubUNvZGVjUmVmOwpAQCAtMTU4MSwxMSArMTU3NSw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoZ2V0VHJlYmxlRmxhZygpKSB7Ci0gICAgICAgIG1BbGxvY2F0b3JbcG9ydEluZGV4XS5jbGVhcigpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1EZWFsZXJbcG9ydEluZGV4XS5jbGVhcigpOwotICAgIH0KKyAgICBtQWxsb2NhdG9yW3BvcnRJbmRleF0uY2xlYXIoKTsKICAgICByZXR1cm4gZXJyOwogfQogCkBAIC0xNzIyLDYgKzE3MTIsOCBAQAogICAgIG1Db25maWdGb3JtYXQgPSBtc2c7CiAKICAgICBtSXNFbmNvZGVyID0gZW5jb2RlcjsKKyAgICBtSXNWaWRlbyA9ICFzdHJuY2FzZWNtcChtaW1lLCAidmlkZW8vIiwgNik7CisgICAgbUlzSW1hZ2UgPSAhc3RybmNhc2VjbXAobWltZSwgImltYWdlLyIsIDYpOwogCiAgICAgbVBvcnRNb2RlW2tQb3J0SW5kZXhJbnB1dF0gPSBJT01YOjprUG9ydE1vZGVQcmVzZXRCeXRlQnVmZmVyOwogICAgIG1Qb3J0TW9kZVtrUG9ydEluZGV4T3V0cHV0XSA9IElPTVg6OmtQb3J0TW9kZVByZXNldEJ5dGVCdWZmZXI7CkBAIC0xNzMyLDE5ICsxNzI0LDI3IEBACiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCi0gICAgaW50MzJfdCBiaXRSYXRlID0gMDsKLSAgICAvLyBGTEFDIGVuY29kZXIgZG9lc24ndCBuZWVkIGEgYml0cmF0ZSwgb3RoZXIgZW5jb2RlcnMgZG8KLSAgICBpZiAoZW5jb2RlciAmJiBzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMpCi0gICAgICAgICAgICAmJiAhbXNnLT5maW5kSW50MzIoImJpdHJhdGUiLCAmYml0UmF0ZSkpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIE9NWF9WSURFT19DT05UUk9MUkFURVRZUEUgYml0cmF0ZU1vZGU7CisgICAgaW50MzJfdCBiaXRyYXRlID0gMCwgcXVhbGl0eTsKKyAgICAvLyBGTEFDIGVuY29kZXIgb3IgdmlkZW8gZW5jb2RlciBpbiBjb25zdGFudCBxdWFsaXR5IG1vZGUgZG9lc24ndCBuZWVkIGEKKyAgICAvLyBiaXRyYXRlLCBvdGhlciBlbmNvZGVycyBkby4KKyAgICBpZiAoZW5jb2RlcikgeworICAgICAgICBpZiAobUlzVmlkZW8gfHwgbUlzSW1hZ2UpIHsKKyAgICAgICAgICAgIGlmICghZmluZFZpZGVvQml0cmF0ZUNvbnRyb2xJbmZvKG1zZywgJmJpdHJhdGVNb2RlLCAmYml0cmF0ZSwgJnF1YWxpdHkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRkxBQykKKyAgICAgICAgICAgICYmICFtc2ctPmZpbmRJbnQzMigiYml0cmF0ZSIsICZiaXRyYXRlKSkgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gcHJvcGFnYXRlIGJpdHJhdGUgdG8gdGhlIG91dHB1dCBzbyB0aGF0IHRoZSBtdXhlciBoYXMgaXQKLSAgICBpZiAoZW5jb2RlciAmJiBtc2ctPmZpbmRJbnQzMigiYml0cmF0ZSIsICZiaXRSYXRlKSkgeworICAgIGlmIChlbmNvZGVyICYmIG1zZy0+ZmluZEludDMyKCJiaXRyYXRlIiwgJmJpdHJhdGUpKSB7CiAgICAgICAgIC8vIFRlY2huaWNhbGx5IElTTyBzcGVjIHNheXMgdGhhdCAnYml0cmF0ZScgc2hvdWxkIGJlIDAgZm9yIFZCUiBldmVuIHRob3VnaCBpdCBpcyB0aGUKICAgICAgICAgLy8gYXZlcmFnZSBiaXRyYXRlLiBXZSd2ZSBiZWVuIHNldHRpbmcgYm90aCBiaXRyYXRlIGFuZCBtYXgtYml0cmF0ZSB0byB0aGlzIHNhbWUgdmFsdWUuCi0gICAgICAgIG91dHB1dEZvcm1hdC0+c2V0SW50MzIoImJpdHJhdGUiLCBiaXRSYXRlKTsKLSAgICAgICAgb3V0cHV0Rm9ybWF0LT5zZXRJbnQzMigibWF4LWJpdHJhdGUiLCBiaXRSYXRlKTsKKyAgICAgICAgb3V0cHV0Rm9ybWF0LT5zZXRJbnQzMigiYml0cmF0ZSIsIGJpdHJhdGUpOworICAgICAgICBvdXRwdXRGb3JtYXQtPnNldEludDMyKCJtYXgtYml0cmF0ZSIsIGJpdHJhdGUpOwogICAgIH0KIAogICAgIGludDMyX3Qgc3RvcmVNZXRhOwpAQCAtMTgwMSw5ICsxODAxLDcgQEAKICAgICAvLyBPbmx5IGVuYWJsZSBtZXRhZGF0YSBtb2RlIG9uIGVuY29kZXIgb3V0cHV0IGlmIGVuY29kZXIgY2FuIHByZXBlbmQKICAgICAvLyBzcHMvcHBzIHRvIGlkciBmcmFtZXMsIHNpbmNlIGluIG1ldGFkYXRhIG1vZGUgdGhlIGJpdHN0cmVhbSBpcyBpbiBhbgogICAgIC8vIG9wYXF1ZSBoYW5kbGUsIHRvIHdoaWNoIHdlIGRvbid0IGhhdmUgYWNjZXNzLgotICAgIGludDMyX3QgdmlkZW8gPSAhc3RybmNhc2VjbXAobWltZSwgInZpZGVvLyIsIDYpOwotICAgIG1Jc1ZpZGVvID0gdmlkZW87Ci0gICAgaWYgKGVuY29kZXIgJiYgdmlkZW8pIHsKKyAgICBpZiAoZW5jb2RlciAmJiBtSXNWaWRlbykgewogICAgICAgICBPTVhfQk9PTCBlbmFibGUgPSAoT01YX0JPT0wpIChwcmVwZW5kU1BTUFBTCiAgICAgICAgICAgICAmJiBtc2ctPmZpbmRJbnQzMigiYW5kcm9pZC5fc3RvcmUtbWV0YWRhdGEtaW4tYnVmZmVycy1vdXRwdXQiLCAmc3RvcmVNZXRhKQogICAgICAgICAgICAgJiYgc3RvcmVNZXRhICE9IDApOwpAQCAtMTgyNSwxNiArMTgyMywyMSBAQAogCiAgICAgICAgIC8vIG9ubHkgYWxsb3cgMzItYml0IHZhbHVlLCBzaW5jZSB3ZSBwYXNzIGl0IGFzIFUzMiB0byBPTVguCiAgICAgICAgIGlmICghbXNnLT5maW5kSW50NjQoIm1heC1wdHMtZ2FwLXRvLWVuY29kZXIiLCAmbU1heFB0c0dhcFVzKSkgewotICAgICAgICAgICAgbU1heFB0c0dhcFVzID0gLTFsbDsKLSAgICAgICAgfSBlbHNlIGlmIChtTWF4UHRzR2FwVXMgPiBJTlQzMl9NQVggfHwgbU1heFB0c0dhcFVzIDwgMCkgeworICAgICAgICAgICAgbU1heFB0c0dhcFVzID0gMGxsOworICAgICAgICB9IGVsc2UgaWYgKG1NYXhQdHNHYXBVcyA+IElOVDMyX01BWCB8fCBtTWF4UHRzR2FwVXMgPCBJTlQzMl9NSU4pIHsKICAgICAgICAgICAgIEFMT0dXKCJVbnN1cHBvcnRlZCB2YWx1ZSBmb3IgbWF4IHB0cyBnYXAgJWxsZCIsIChsb25nIGxvbmcpIG1NYXhQdHNHYXBVcyk7Ci0gICAgICAgICAgICBtTWF4UHRzR2FwVXMgPSAtMWxsOworICAgICAgICAgICAgbU1heFB0c0dhcFVzID0gMGxsOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKCFtc2ctPmZpbmRGbG9hdCgibWF4LWZwcy10by1lbmNvZGVyIiwgJm1NYXhGcHMpKSB7CiAgICAgICAgICAgICBtTWF4RnBzID0gLTE7CiAgICAgICAgIH0KIAorICAgICAgICAvLyBub3RpZnkgR3JhcGhpY0J1ZmZlclNvdXJjZSB0byBhbGxvdyBiYWNrd2FyZCBmcmFtZXMKKyAgICAgICAgaWYgKG1NYXhQdHNHYXBVcyA8IDBsbCkgeworICAgICAgICAgICAgbU1heEZwcyA9IC0xOworICAgICAgICB9CisKICAgICAgICAgaWYgKCFtc2ctPmZpbmREb3VibGUoInRpbWUtbGFwc2UtZnBzIiwgJm1DYXB0dXJlRnBzKSkgewogICAgICAgICAgICAgbUNhcHR1cmVGcHMgPSAtMS4wOwogICAgICAgICB9CkBAIC0xODQ5LDkgKzE4NTIsOSBAQAogICAgIC8vIE5PVEU6IHdlIG9ubHkgdXNlIG5hdGl2ZSB3aW5kb3cgZm9yIHZpZGVvIGRlY29kZXJzCiAgICAgc3A8UmVmQmFzZT4gb2JqOwogICAgIGJvb2wgaGF2ZU5hdGl2ZVdpbmRvdyA9IG1zZy0+ZmluZE9iamVjdCgibmF0aXZlLXdpbmRvdyIsICZvYmopCi0gICAgICAgICAgICAmJiBvYmogIT0gTlVMTCAmJiB2aWRlbyAmJiAhZW5jb2RlcjsKKyAgICAgICAgICAgICYmIG9iaiAhPSBOVUxMICYmIG1Jc1ZpZGVvICYmICFlbmNvZGVyOwogICAgIG1Vc2luZ05hdGl2ZVdpbmRvdyA9IGhhdmVOYXRpdmVXaW5kb3c7Ci0gICAgaWYgKHZpZGVvICYmICFlbmNvZGVyKSB7CisgICAgaWYgKG1Jc1ZpZGVvICYmICFlbmNvZGVyKSB7CiAgICAgICAgIGlucHV0Rm9ybWF0LT5zZXRJbnQzMigiYWRhcHRpdmUtcGxheWJhY2siLCBmYWxzZSk7CiAKICAgICAgICAgaW50MzJfdCB1c2FnZVByb3RlY3RlZDsKQEAgLTIwMTQsNyArMjAxNyw3IEBACiAgICAgKHZvaWQpbXNnLT5maW5kSW50MzIoInBjbS1lbmNvZGluZyIsIChpbnQzMl90KikmcGNtRW5jb2RpbmcpOwogICAgIC8vIGludmFsaWQgZW5jb2RpbmdzIHdpbGwgZGVmYXVsdCB0byBQQ00tMTZiaXQgaW4gc2V0dXBSYXdBdWRpb0Zvcm1hdC4KIAotICAgIGlmICh2aWRlbykgeworICAgIGlmIChtSXNWaWRlbyB8fCBtSXNJbWFnZSkgewogICAgICAgICAvLyBkZXRlcm1pbmUgbmVlZCBmb3Igc29mdHdhcmUgcmVuZGVyZXIKICAgICAgICAgYm9vbCB1c2luZ1N3UmVuZGVyZXIgPSBmYWxzZTsKICAgICAgICAgaWYgKGhhdmVOYXRpdmVXaW5kb3cgJiYgbUNvbXBvbmVudE5hbWUuc3RhcnRzV2l0aCgiT01YLmdvb2dsZS4iKSkgewpAQCAtMjE0NiwxNiArMjE0OSwyMCBAQAogICAgICAgICAgICAgICAgIC8vIHZhbHVlIGlzIHVua25vd24KICAgICAgICAgICAgICAgICBkcmMudGFyZ2V0UmVmTGV2ZWwgPSAtMTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImFhYy1kcmMtZWZmZWN0LXR5cGUiLCAmZHJjLmVmZmVjdFR5cGUpKSB7CisgICAgICAgICAgICAgICAgLy8gdmFsdWUgaXMgdW5rbm93bgorICAgICAgICAgICAgICAgIGRyYy5lZmZlY3RUeXBlID0gLTI7IC8vIHZhbGlkIHZhbHVlcyBhcmUgLTEgYW5kIG92ZXIKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgZXJyID0gc2V0dXBBQUNDb2RlYygKLSAgICAgICAgICAgICAgICAgICAgZW5jb2RlciwgbnVtQ2hhbm5lbHMsIHNhbXBsZVJhdGUsIGJpdFJhdGUsIGFhY1Byb2ZpbGUsCisgICAgICAgICAgICAgICAgICAgIGVuY29kZXIsIG51bUNoYW5uZWxzLCBzYW1wbGVSYXRlLCBiaXRyYXRlLCBhYWNQcm9maWxlLAogICAgICAgICAgICAgICAgICAgICBpc0FEVFMgIT0gMCwgc2JyTW9kZSwgbWF4T3V0cHV0Q2hhbm5lbENvdW50LCBkcmMsCiAgICAgICAgICAgICAgICAgICAgIHBjbUxpbWl0ZXJFbmFibGUpOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIpKSB7Ci0gICAgICAgIGVyciA9IHNldHVwQU1SQ29kZWMoZW5jb2RlciwgZmFsc2UgLyogaXNXQU1SICovLCBiaXRSYXRlKTsKKyAgICAgICAgZXJyID0gc2V0dXBBTVJDb2RlYyhlbmNvZGVyLCBmYWxzZSAvKiBpc1dBTVIgKi8sIGJpdHJhdGUpOwogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCKSkgewotICAgICAgICBlcnIgPSBzZXR1cEFNUkNvZGVjKGVuY29kZXIsIHRydWUgLyogaXNXQU1SICovLCBiaXRSYXRlKTsKKyAgICAgICAgZXJyID0gc2V0dXBBTVJDb2RlYyhlbmNvZGVyLCB0cnVlIC8qIGlzV0FNUiAqLywgYml0cmF0ZSk7CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVcpCiAgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX01MQVcpKSB7CiAgICAgICAgIC8vIFRoZXNlIGFyZSBQQ00tbGlrZSBmb3JtYXRzIHdpdGggYSBmaXhlZCBzYW1wbGUgcmF0ZSBidXQKQEAgLTIyNjksNyArMjI3Niw3IEBACiAgICAgICAgIHJhdGVGbG9hdCA9IChmbG9hdClyYXRlSW50OyAgLy8gMTZNSHogKEZMSU5UTUFYKSBpcyBPSyBmb3IgdXBwZXIgYm91bmQuCiAgICAgfQogICAgIGlmIChyYXRlRmxvYXQgPiAwKSB7Ci0gICAgICAgIGVyciA9IHNldE9wZXJhdGluZ1JhdGUocmF0ZUZsb2F0LCB2aWRlbyk7CisgICAgICAgIGVyciA9IHNldE9wZXJhdGluZ1JhdGUocmF0ZUZsb2F0LCBtSXNWaWRlbyk7CiAgICAgICAgIGVyciA9IE9LOyAvLyBpZ25vcmUgZXJyb3JzCiAgICAgfQogCkBAIC0yMjk0LDcgKzIzMDEsNyBAQAogICAgIH0KIAogICAgIC8vIGNyZWF0ZSBkYXRhIGNvbnZlcnRlcnMgaWYgbmVlZGVkCi0gICAgaWYgKCF2aWRlbyAmJiBlcnIgPT0gT0spIHsKKyAgICBpZiAoIW1Jc1ZpZGVvICYmICFtSXNJbWFnZSAmJiBlcnIgPT0gT0spIHsKICAgICAgICAgQXVkaW9FbmNvZGluZyBjb2RlY1BjbUVuY29kaW5nID0ga0F1ZGlvRW5jb2RpbmdQY20xNmJpdDsKICAgICAgICAgaWYgKGVuY29kZXIpIHsKICAgICAgICAgICAgICh2b2lkKW1JbnB1dEZvcm1hdC0+ZmluZEludDMyKCJwY20tZW5jb2RpbmciLCAoaW50MzJfdCopJmNvZGVjUGNtRW5jb2RpbmcpOwpAQCAtMjc4MCw3ICsyNzg3LDcgQEAKICAgICAgICAgICAgID8gT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdE1QNEFEVFMKICAgICAgICAgICAgIDogT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdE1QNEZGOwogCi0gICAgT01YX0FVRElPX1BBUkFNX0FORFJPSURfQUFDUFJFU0VOVEFUSU9OVFlQRSBwcmVzZW50YXRpb247CisgICAgT01YX0FVRElPX1BBUkFNX0FORFJPSURfQUFDRFJDUFJFU0VOVEFUSU9OVFlQRSBwcmVzZW50YXRpb247CiAgICAgSW5pdE9NWFBhcmFtcygmcHJlc2VudGF0aW9uKTsKICAgICBwcmVzZW50YXRpb24ubk1heE91dHB1dENoYW5uZWxzID0gbWF4T3V0cHV0Q2hhbm5lbENvdW50OwogICAgIHByZXNlbnRhdGlvbi5uRHJjQ3V0ID0gZHJjLmRyY0N1dDsKQEAgLTI3ODksMTQgKzI3OTYsMjkgQEAKICAgICBwcmVzZW50YXRpb24ublRhcmdldFJlZmVyZW5jZUxldmVsID0gZHJjLnRhcmdldFJlZkxldmVsOwogICAgIHByZXNlbnRhdGlvbi5uRW5jb2RlZFRhcmdldExldmVsID0gZHJjLmVuY29kZWRUYXJnZXRMZXZlbDsKICAgICBwcmVzZW50YXRpb24ublBDTUxpbWl0ZXJFbmFibGUgPSBwY21MaW1pdGVyRW5hYmxlOworICAgIHByZXNlbnRhdGlvbi5uRHJjRWZmZWN0VHlwZSA9IGRyYy5lZmZlY3RUeXBlOwogCiAgICAgc3RhdHVzX3QgcmVzID0gbU9NWE5vZGUtPnNldFBhcmFtZXRlcigKICAgICAgICAgICAgIE9NWF9JbmRleFBhcmFtQXVkaW9BYWMsICZwcm9maWxlLCBzaXplb2YocHJvZmlsZSkpOwogICAgIGlmIChyZXMgPT0gT0spIHsKICAgICAgICAgLy8gb3B0aW9uYWwgcGFyYW1ldGVycywgd2lsbCBub3QgY2F1c2UgY29uZmlndXJhdGlvbiBmYWlsdXJlCi0gICAgICAgIG1PTVhOb2RlLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgIGlmIChtT01YTm9kZS0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkQWFjRHJjUHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgICZwcmVzZW50YXRpb24sIHNpemVvZihwcmVzZW50YXRpb24pKSA9PSBFUlJPUl9VTlNVUFBPUlRFRCkgeworICAgICAgICAgICAgLy8gcHJpb3IgdG8gOS4wIHdlIHVzZWQgYSBkaWZmZXJlbnQgY29uZmlnIHN0cnVjdHVyZSBhbmQgaW5kZXgKKyAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9BTkRST0lEX0FBQ1BSRVNFTlRBVElPTlRZUEUgcHJlc2VudGF0aW9uODsKKyAgICAgICAgICAgIEluaXRPTVhQYXJhbXMoJnByZXNlbnRhdGlvbjgpOworICAgICAgICAgICAgcHJlc2VudGF0aW9uOC5uTWF4T3V0cHV0Q2hhbm5lbHMgPSBwcmVzZW50YXRpb24ubk1heE91dHB1dENoYW5uZWxzOworICAgICAgICAgICAgcHJlc2VudGF0aW9uOC5uRHJjQ3V0ID0gcHJlc2VudGF0aW9uLm5EcmNDdXQ7CisgICAgICAgICAgICBwcmVzZW50YXRpb244Lm5EcmNCb29zdCA9IHByZXNlbnRhdGlvbi5uRHJjQm9vc3Q7CisgICAgICAgICAgICBwcmVzZW50YXRpb244Lm5IZWF2eUNvbXByZXNzaW9uID0gcHJlc2VudGF0aW9uLm5IZWF2eUNvbXByZXNzaW9uOworICAgICAgICAgICAgcHJlc2VudGF0aW9uOC5uVGFyZ2V0UmVmZXJlbmNlTGV2ZWwgPSBwcmVzZW50YXRpb24ublRhcmdldFJlZmVyZW5jZUxldmVsOworICAgICAgICAgICAgcHJlc2VudGF0aW9uOC5uRW5jb2RlZFRhcmdldExldmVsID0gcHJlc2VudGF0aW9uLm5FbmNvZGVkVGFyZ2V0TGV2ZWw7CisgICAgICAgICAgICBwcmVzZW50YXRpb244Lm5QQ01MaW1pdGVyRW5hYmxlID0gcHJlc2VudGF0aW9uLm5QQ01MaW1pdGVyRW5hYmxlOworICAgICAgICAgICAgKHZvaWQpbU9NWE5vZGUtPnNldFBhcmFtZXRlcigKICAgICAgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZEFhY1ByZXNlbnRhdGlvbiwKLSAgICAgICAgICAgICAgICAmcHJlc2VudGF0aW9uLCBzaXplb2YocHJlc2VudGF0aW9uKSk7CisgICAgICAgICAgICAgICAgJnByZXNlbnRhdGlvbjgsIHNpemVvZihwcmVzZW50YXRpb244KSk7CisgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBBTE9HVygiZGlkIG5vdCBzZXQgQXVkaW9BbmRyb2lkQWFjUHJlc2VudGF0aW9uIGR1ZSB0byBlcnJvciAlZCB3aGVuIHNldHRpbmcgQXVkaW9BYWMiLCByZXMpOwogICAgIH0KQEAgLTMyMTksNiArMzI0MSw3IEBACiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19WUDgsIE9NWF9WSURFT19Db2RpbmdWUDggfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOSwgT01YX1ZJREVPX0NvZGluZ1ZQOSB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fRE9MQllfVklTSU9OLCBPTVhfVklERU9fQ29kaW5nRG9sYnlWaXNpb24gfSwKKyAgICB7IE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQywgT01YX1ZJREVPX0NvZGluZ0ltYWdlSEVJQyB9LAogfTsKIAogc3RhdGljIHN0YXR1c190IEdldFZpZGVvQ29kaW5nVHlwZUZyb21NaW1lKApAQCAtMzI5Miw2ICszMzE1LDIyIEBACiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCisgICAgaWYgKGNvbXByZXNzaW9uRm9ybWF0ID09IE9NWF9WSURFT19Db2RpbmdIRVZDKSB7CisgICAgICAgIGludDMyX3QgcHJvZmlsZTsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJwcm9maWxlIiwgJnByb2ZpbGUpKSB7CisgICAgICAgICAgICAvLyB2ZXJpZnkgaWYgTWFpbjEwIHByb2ZpbGUgaXMgc3VwcG9ydGVkIGF0IGFsbCwgYW5kIGZhaWwKKyAgICAgICAgICAgIC8vIGltbWVkaWF0ZWx5IGlmIGl0J3Mgbm90IHN1cHBvcnRlZC4KKyAgICAgICAgICAgIGlmIChwcm9maWxlID09IE9NWF9WSURFT19IRVZDUHJvZmlsZU1haW4xMCB8fAorICAgICAgICAgICAgICAgIHByb2ZpbGUgPT0gT01YX1ZJREVPX0hFVkNQcm9maWxlTWFpbjEwSERSMTApIHsKKyAgICAgICAgICAgICAgICBlcnIgPSB2ZXJpZnlTdXBwb3J0Rm9yUHJvZmlsZUFuZExldmVsKAorICAgICAgICAgICAgICAgICAgICAgICAga1BvcnRJbmRleElucHV0LCBwcm9maWxlLCAwKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgaWYgKGNvbXByZXNzaW9uRm9ybWF0ID09IE9NWF9WSURFT19Db2RpbmdWUDkpIHsKICAgICAgICAgT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUgcGFyYW1zOwogICAgICAgICBJbml0T01YUGFyYW1zKCZwYXJhbXMpOwpAQCAtMzc0NSwxMCArMzc4NCwxMiBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAotICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodCwgYml0cmF0ZTsKKyAgICBPTVhfVklERU9fQ09OVFJPTFJBVEVUWVBFIGJpdHJhdGVNb2RlOworICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodCwgYml0cmF0ZSA9IDAsIHF1YWxpdHk7CiAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpCiAgICAgICAgICAgICB8fCAhbXNnLT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpCi0gICAgICAgICAgICB8fCAhbXNnLT5maW5kSW50MzIoImJpdHJhdGUiLCAmYml0cmF0ZSkpIHsKKyAgICAgICAgICAgIHx8ICFmaW5kVmlkZW9CaXRyYXRlQ29udHJvbEluZm8oCisgICAgICAgICAgICAgICAgICAgIG1zZywgJmJpdHJhdGVNb2RlLCAmYml0cmF0ZSwgJnF1YWxpdHkpKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKQEAgLTM3ODEsNiArMzgyMiw4IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgbUZwcyA9IChkb3VibGUpZnJhbWVyYXRlOwogICAgIH0KKyAgICAvLyBwcm9wYWdhdGUgZnJhbWVyYXRlIHRvIHRoZSBvdXRwdXQgc28gdGhhdCB0aGUgbXV4ZXIgaGFzIGl0CisgICAgb3V0cHV0Rm9ybWF0LT5zZXRJbnQzMigiZnJhbWUtcmF0ZSIsIChpbnQzMl90KW1GcHMpOwogCiAgICAgdmlkZW9fZGVmLT54RnJhbWVyYXRlID0gKE9NWF9VMzIpKG1GcHMgKiA2NTUzNik7CiAgICAgdmlkZW9fZGVmLT5lQ29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nVW51c2VkOwpAQCAtMzg3Miw3ICszOTE1LDggQEAKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgT01YX1ZJREVPX0NvZGluZ0hFVkM6Ci0gICAgICAgICAgICBlcnIgPSBzZXR1cEhFVkNFbmNvZGVyUGFyYW1ldGVycyhtc2cpOworICAgICAgICBjYXNlIE9NWF9WSURFT19Db2RpbmdJbWFnZUhFSUM6CisgICAgICAgICAgICBlcnIgPSBzZXR1cEhFVkNFbmNvZGVyUGFyYW1ldGVycyhtc2csIG91dHB1dEZvcm1hdCk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIE9NWF9WSURFT19Db2RpbmdWUDg6CkBAIC0zOTk5LDE1ICs0MDQzLDYgQEAKICAgICByZXR1cm4gcmV0ID4gMCA/IHJldCAtIDEgOiAwOwogfQogCi1zdGF0aWMgT01YX1ZJREVPX0NPTlRST0xSQVRFVFlQRSBnZXRCaXRyYXRlTW9kZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewotICAgIGludDMyX3QgdG1wOwotICAgIGlmICghbXNnLT5maW5kSW50MzIoImJpdHJhdGUtbW9kZSIsICZ0bXApKSB7Ci0gICAgICAgIHJldHVybiBPTVhfVmlkZW9fQ29udHJvbFJhdGVWYXJpYWJsZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8T01YX1ZJREVPX0NPTlRST0xSQVRFVFlQRT4odG1wKTsKLX0KLQogc3RhdHVzX3QgQUNvZGVjOjpzZXR1cE1QRUc0RW5jb2RlclBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICBpbnQzMl90IGJpdHJhdGU7CiAgICAgZmxvYXQgaUZyYW1lSW50ZXJ2YWw7CkBAIC00MDE2LDcgKzQwNTEsNyBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgT01YX1ZJREVPX0NPTlRST0xSQVRFVFlQRSBiaXRyYXRlTW9kZSA9IGdldEJpdHJhdGVNb2RlKG1zZyk7CisgICAgT01YX1ZJREVPX0NPTlRST0xSQVRFVFlQRSBiaXRyYXRlTW9kZSA9IGdldFZpZGVvQml0cmF0ZU1vZGUobXNnKTsKIAogICAgIGZsb2F0IGZyYW1lUmF0ZTsKICAgICBpZiAoIW1zZy0+ZmluZEZsb2F0KCJmcmFtZS1yYXRlIiwgJmZyYW1lUmF0ZSkpIHsKQEAgLTQwNjQsNyArNDA5OSw3IEBACiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIH0KIAotICAgICAgICBlcnIgPSB2ZXJpZnlTdXBwb3J0Rm9yUHJvZmlsZUFuZExldmVsKHByb2ZpbGUsIGxldmVsKTsKKyAgICAgICAgZXJyID0gdmVyaWZ5U3VwcG9ydEZvclByb2ZpbGVBbmRMZXZlbChrUG9ydEluZGV4T3V0cHV0LCBwcm9maWxlLCBsZXZlbCk7CiAKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKQEAgLTQwODEsNyArNDExNiw3IEBACiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCi0gICAgZXJyID0gY29uZmlndXJlQml0cmF0ZShiaXRyYXRlLCBiaXRyYXRlTW9kZSk7CisgICAgZXJyID0gY29uZmlndXJlQml0cmF0ZShiaXRyYXRlTW9kZSwgYml0cmF0ZSk7CiAKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBlcnI7CkBAIC00MDk4LDcgKzQxMzMsNyBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgT01YX1ZJREVPX0NPTlRST0xSQVRFVFlQRSBiaXRyYXRlTW9kZSA9IGdldEJpdHJhdGVNb2RlKG1zZyk7CisgICAgT01YX1ZJREVPX0NPTlRST0xSQVRFVFlQRSBiaXRyYXRlTW9kZSA9IGdldFZpZGVvQml0cmF0ZU1vZGUobXNnKTsKIAogICAgIGZsb2F0IGZyYW1lUmF0ZTsKICAgICBpZiAoIW1zZy0+ZmluZEZsb2F0KCJmcmFtZS1yYXRlIiwgJmZyYW1lUmF0ZSkpIHsKQEAgLTQxMzYsNyArNDE3MSw3IEBACiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIH0KIAotICAgICAgICBlcnIgPSB2ZXJpZnlTdXBwb3J0Rm9yUHJvZmlsZUFuZExldmVsKHByb2ZpbGUsIGxldmVsKTsKKyAgICAgICAgZXJyID0gdmVyaWZ5U3VwcG9ydEZvclByb2ZpbGVBbmRMZXZlbChrUG9ydEluZGV4T3V0cHV0LCBwcm9maWxlLCBsZXZlbCk7CiAKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKQEAgLTQxNTgsNyArNDE5Myw3IEBACiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCi0gICAgZXJyID0gY29uZmlndXJlQml0cmF0ZShiaXRyYXRlLCBiaXRyYXRlTW9kZSk7CisgICAgZXJyID0gY29uZmlndXJlQml0cmF0ZShiaXRyYXRlTW9kZSwgYml0cmF0ZSk7CiAKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBlcnI7CkBAIC00MjI4LDcgKzQyNjMsNyBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgT01YX1ZJREVPX0NPTlRST0xSQVRFVFlQRSBiaXRyYXRlTW9kZSA9IGdldEJpdHJhdGVNb2RlKG1zZyk7CisgICAgT01YX1ZJREVPX0NPTlRST0xSQVRFVFlQRSBiaXRyYXRlTW9kZSA9IGdldFZpZGVvQml0cmF0ZU1vZGUobXNnKTsKIAogICAgIGZsb2F0IGZyYW1lUmF0ZTsKICAgICBpZiAoIW1zZy0+ZmluZEZsb2F0KCJmcmFtZS1yYXRlIiwgJmZyYW1lUmF0ZSkpIHsKQEAgLTQyNzEsNyArNDMwNiw3IEBACiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIH0KIAotICAgICAgICBlcnIgPSB2ZXJpZnlTdXBwb3J0Rm9yUHJvZmlsZUFuZExldmVsKHByb2ZpbGUsIGxldmVsKTsKKyAgICAgICAgZXJyID0gdmVyaWZ5U3VwcG9ydEZvclByb2ZpbGVBbmRMZXZlbChrUG9ydEluZGV4T3V0cHV0LCBwcm9maWxlLCBsZXZlbCk7CiAKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKQEAgLTQyODUsNyArNDMyMCw3IEBACiAgICAgICAgIC8vIFVzZSBsYXJnZXN0IHN1cHBvcnRlZCBwcm9maWxlIGZvciBBVkMgcmVjb3JkaW5nIGlmIHByb2ZpbGUgaXMgbm90IHNwZWNpZmllZC4KICAgICAgICAgZm9yIChPTVhfVklERU9fQVZDUFJPRklMRVRZUEUgcHJvZmlsZSA6IHsKICAgICAgICAgICAgICAgICBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2gsIE9NWF9WSURFT19BVkNQcm9maWxlTWFpbiB9KSB7Ci0gICAgICAgICAgICBpZiAodmVyaWZ5U3VwcG9ydEZvclByb2ZpbGVBbmRMZXZlbChwcm9maWxlLCAwKSA9PSBPSykgeworICAgICAgICAgICAgaWYgKHZlcmlmeVN1cHBvcnRGb3JQcm9maWxlQW5kTGV2ZWwoa1BvcnRJbmRleE91dHB1dCwgcHJvZmlsZSwgMCkgPT0gT0spIHsKICAgICAgICAgICAgICAgICBoMjY0dHlwZS5lUHJvZmlsZSA9IHByb2ZpbGU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC00Mzg0LDI2ICs0NDE5LDY0IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gY29uZmlndXJlQml0cmF0ZShiaXRyYXRlLCBiaXRyYXRlTW9kZSk7CisgICAgcmV0dXJuIGNvbmZpZ3VyZUJpdHJhdGUoYml0cmF0ZU1vZGUsIGJpdHJhdGUpOwogfQogCi1zdGF0dXNfdCBBQ29kZWM6OnNldHVwSEVWQ0VuY29kZXJQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgaW50MzJfdCBiaXRyYXRlOwotICAgIGZsb2F0IGlGcmFtZUludGVydmFsOwotICAgIGlmICghbXNnLT5maW5kSW50MzIoImJpdHJhdGUiLCAmYml0cmF0ZSkKLSAgICAgICAgICAgIHx8ICFtc2ctPmZpbmRBc0Zsb2F0KCJpLWZyYW1lLWludGVydmFsIiwgJmlGcmFtZUludGVydmFsKSkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CitzdGF0dXNfdCBBQ29kZWM6OmNvbmZpZ3VyZUltYWdlR3JpZCgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIHNwPEFNZXNzYWdlPiAmb3V0cHV0Rm9ybWF0KSB7CisgICAgaW50MzJfdCB0aWxlV2lkdGgsIHRpbGVIZWlnaHQsIGdyaWRSb3dzLCBncmlkQ29sczsKKyAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJ0aWxlLXdpZHRoIiwgJnRpbGVXaWR0aCkgfHwKKyAgICAgICAgIW1zZy0+ZmluZEludDMyKCJ0aWxlLWhlaWdodCIsICZ0aWxlSGVpZ2h0KSB8fAorICAgICAgICAhbXNnLT5maW5kSW50MzIoImdyaWQtcm93cyIsICZncmlkUm93cykgfHwKKyAgICAgICAgIW1zZy0+ZmluZEludDMyKCJncmlkLWNvbHMiLCAmZ3JpZENvbHMpKSB7CisgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKLSAgICBPTVhfVklERU9fQ09OVFJPTFJBVEVUWVBFIGJpdHJhdGVNb2RlID0gZ2V0Qml0cmF0ZU1vZGUobXNnKTsKKyAgICBPTVhfVklERU9fUEFSQU1fQU5EUk9JRF9JTUFHRUdSSURUWVBFIGdyaWRUeXBlOworICAgIEluaXRPTVhQYXJhbXMoJmdyaWRUeXBlKTsKKyAgICBncmlkVHlwZS5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKKyAgICBncmlkVHlwZS5iRW5hYmxlZCA9IE9NWF9UUlVFOworICAgIGdyaWRUeXBlLm5UaWxlV2lkdGggPSB0aWxlV2lkdGg7CisgICAgZ3JpZFR5cGUublRpbGVIZWlnaHQgPSB0aWxlSGVpZ2h0OworICAgIGdyaWRUeXBlLm5HcmlkUm93cyA9IGdyaWRSb3dzOworICAgIGdyaWRUeXBlLm5HcmlkQ29scyA9IGdyaWRDb2xzOwogCi0gICAgZmxvYXQgZnJhbWVSYXRlOwotICAgIGlmICghbXNnLT5maW5kRmxvYXQoImZyYW1lLXJhdGUiLCAmZnJhbWVSYXRlKSkgewotICAgICAgICBpbnQzMl90IHRtcDsKLSAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiZnJhbWUtcmF0ZSIsICZ0bXApKSB7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIH0KLSAgICAgICAgZnJhbWVSYXRlID0gKGZsb2F0KXRtcDsKKyAgICBzdGF0dXNfdCBlcnIgPSBtT01YTm9kZS0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1WaWRlb0FuZHJvaWRJbWFnZUdyaWQsCisgICAgICAgICAgICAmZ3JpZFR5cGUsIHNpemVvZihncmlkVHlwZSkpOworCisgICAgLy8gZm9yIHZpZGVvIGVuY29kZXJzLCBncmlkIGNvbmZpZyBpcyBvbmx5IGEgaGludC4KKyAgICBpZiAoIW1Jc0ltYWdlKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICAvLyBpbWFnZSBlbmNvZGVycyBtdXN0IHN1cHBvcnQgZ3JpZCBjb25maWcuCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIC8vIHF1ZXJ5IHRvIGdldCB0aGUgaW1hZ2UgZW5jb2RlcidzIHJlYWwgZ3JpZCBjb25maWcgYXMgaXQgbWlnaHQgYmUKKyAgICAvLyBkaWZmZXJlbnQgZnJvbSB0aGUgcmVxdWVzdGVkLCBhbmQgdHJhbnNmZXIgdGhhdCB0byB0aGUgb3V0cHV0LgorICAgIGVyciA9IG1PTVhOb2RlLT5nZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbVZpZGVvQW5kcm9pZEltYWdlR3JpZCwKKyAgICAgICAgICAgICZncmlkVHlwZSwgc2l6ZW9mKGdyaWRUeXBlKSk7CisKKyAgICBpZiAoZXJyID09IE9LICYmIGdyaWRUeXBlLmJFbmFibGVkKSB7CisgICAgICAgIG91dHB1dEZvcm1hdC0+c2V0SW50MzIoInRpbGUtd2lkdGgiLCBncmlkVHlwZS5uVGlsZVdpZHRoKTsKKyAgICAgICAgb3V0cHV0Rm9ybWF0LT5zZXRJbnQzMigidGlsZS1oZWlnaHQiLCBncmlkVHlwZS5uVGlsZUhlaWdodCk7CisgICAgICAgIG91dHB1dEZvcm1hdC0+c2V0SW50MzIoImdyaWQtcm93cyIsIGdyaWRUeXBlLm5HcmlkUm93cyk7CisgICAgICAgIG91dHB1dEZvcm1hdC0+c2V0SW50MzIoImdyaWQtY29scyIsIGdyaWRUeXBlLm5HcmlkQ29scyk7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgQUNvZGVjOjpzZXR1cEhFVkNFbmNvZGVyUGFyYW1ldGVycygKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIHNwPEFNZXNzYWdlPiAmb3V0cHV0Rm9ybWF0KSB7CisgICAgT01YX1ZJREVPX0NPTlRST0xSQVRFVFlQRSBiaXRyYXRlTW9kZTsKKyAgICBpbnQzMl90IGJpdHJhdGUsIHF1YWxpdHk7CisgICAgaWYgKCFmaW5kVmlkZW9CaXRyYXRlQ29udHJvbEluZm8obXNnLCAmYml0cmF0ZU1vZGUsICZiaXRyYXRlLCAmcXVhbGl0eSkpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAogICAgIE9NWF9WSURFT19QQVJBTV9IRVZDVFlQRSBoZXZjVHlwZTsKQEAgLTQ0MjQsNyArNDQ5Nyw3IEBACiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIH0KIAotICAgICAgICBlcnIgPSB2ZXJpZnlTdXBwb3J0Rm9yUHJvZmlsZUFuZExldmVsKHByb2ZpbGUsIGxldmVsKTsKKyAgICAgICAgZXJyID0gdmVyaWZ5U3VwcG9ydEZvclByb2ZpbGVBbmRMZXZlbChrUG9ydEluZGV4T3V0cHV0LCBwcm9maWxlLCBsZXZlbCk7CiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KQEAgLTQ0MzMsNyArNDUwNiwyNyBAQAogICAgICAgICBoZXZjVHlwZS5lTGV2ZWwgPSBzdGF0aWNfY2FzdDxPTVhfVklERU9fSEVWQ0xFVkVMVFlQRT4obGV2ZWwpOwogICAgIH0KICAgICAvLyBUT0RPOiBmaW5lciBjb250cm9sPwotICAgIGhldmNUeXBlLm5LZXlGcmFtZUludGVydmFsID0gc2V0UEZyYW1lc1NwYWNpbmcoaUZyYW1lSW50ZXJ2YWwsIGZyYW1lUmF0ZSkgKyAxOworICAgIGlmIChtSXNJbWFnZSkgeworICAgICAgICBoZXZjVHlwZS5uS2V5RnJhbWVJbnRlcnZhbCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmxvYXQgaUZyYW1lSW50ZXJ2YWw7CisgICAgICAgIGlmICghbXNnLT5maW5kQXNGbG9hdCgiaS1mcmFtZS1pbnRlcnZhbCIsICZpRnJhbWVJbnRlcnZhbCkpIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IGZyYW1lUmF0ZTsKKyAgICAgICAgaWYgKCFtc2ctPmZpbmRGbG9hdCgiZnJhbWUtcmF0ZSIsICZmcmFtZVJhdGUpKSB7CisgICAgICAgICAgICBpbnQzMl90IHRtcDsKKyAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImZyYW1lLXJhdGUiLCAmdG1wKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyYW1lUmF0ZSA9IChmbG9hdCl0bXA7CisgICAgICAgIH0KKworICAgICAgICBoZXZjVHlwZS5uS2V5RnJhbWVJbnRlcnZhbCA9CisgICAgICAgICAgICAgICAgc2V0UEZyYW1lc1NwYWNpbmcoaUZyYW1lSW50ZXJ2YWwsIGZyYW1lUmF0ZSkgKyAxOworICAgIH0KKwogCiAgICAgZXJyID0gbU9NWE5vZGUtPnNldFBhcmFtZXRlcigKICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtVmlkZW9IZXZjLCAmaGV2Y1R5cGUsIHNpemVvZihoZXZjVHlwZSkpOwpAQCAtNDQ0MSw3ICs0NTM0LDEzIEBACiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCi0gICAgcmV0dXJuIGNvbmZpZ3VyZUJpdHJhdGUoYml0cmF0ZSwgYml0cmF0ZU1vZGUpOworICAgIGVyciA9IGNvbmZpZ3VyZUltYWdlR3JpZChtc2csIG91dHB1dEZvcm1hdCk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgcmV0dXJuIGNvbmZpZ3VyZUJpdHJhdGUoYml0cmF0ZU1vZGUsIGJpdHJhdGUsIHF1YWxpdHkpOwogfQogCiBzdGF0dXNfdCBBQ29kZWM6OnNldHVwVlBYRW5jb2RlclBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIHNwPEFNZXNzYWdlPiAmb3V0cHV0Rm9ybWF0KSB7CkBAIC00NDYyLDcgKzQ1NjEsNyBAQAogICAgIH0KICAgICBtc2ctPmZpbmRBc0Zsb2F0KCJpLWZyYW1lLWludGVydmFsIiwgJmlGcmFtZUludGVydmFsKTsKIAotICAgIE9NWF9WSURFT19DT05UUk9MUkFURVRZUEUgYml0cmF0ZU1vZGUgPSBnZXRCaXRyYXRlTW9kZShtc2cpOworICAgIE9NWF9WSURFT19DT05UUk9MUkFURVRZUEUgYml0cmF0ZU1vZGUgPSBnZXRWaWRlb0JpdHJhdGVNb2RlKG1zZyk7CiAKICAgICBmbG9hdCBmcmFtZVJhdGU7CiAgICAgaWYgKCFtc2ctPmZpbmRGbG9hdCgiZnJhbWUtcmF0ZSIsICZmcmFtZVJhdGUpKSB7CkBAIC00NTM5LDE0ICs0NjM4LDE0IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gY29uZmlndXJlQml0cmF0ZShiaXRyYXRlLCBiaXRyYXRlTW9kZSk7CisgICAgcmV0dXJuIGNvbmZpZ3VyZUJpdHJhdGUoYml0cmF0ZU1vZGUsIGJpdHJhdGUpOwogfQogCiBzdGF0dXNfdCBBQ29kZWM6OnZlcmlmeVN1cHBvcnRGb3JQcm9maWxlQW5kTGV2ZWwoCi0gICAgICAgIGludDMyX3QgcHJvZmlsZSwgaW50MzJfdCBsZXZlbCkgeworICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgaW50MzJfdCBwcm9maWxlLCBpbnQzMl90IGxldmVsKSB7CiAgICAgT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUgcGFyYW1zOwogICAgIEluaXRPTVhQYXJhbXMoJnBhcmFtcyk7Ci0gICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4T3V0cHV0OworICAgIHBhcmFtcy5uUG9ydEluZGV4ID0gcG9ydEluZGV4OwogCiAgICAgZm9yIChPTVhfVTMyIGluZGV4ID0gMDsgaW5kZXggPD0ga01heEluZGljZXNUb0NoZWNrOyArK2luZGV4KSB7CiAgICAgICAgIHBhcmFtcy5uUHJvZmlsZUluZGV4ID0gaW5kZXg7CkBAIC00NTc1LDcgKzQ2NzQsNyBAQAogfQogCiBzdGF0dXNfdCBBQ29kZWM6OmNvbmZpZ3VyZUJpdHJhdGUoCi0gICAgICAgIGludDMyX3QgYml0cmF0ZSwgT01YX1ZJREVPX0NPTlRST0xSQVRFVFlQRSBiaXRyYXRlTW9kZSkgeworICAgICAgICBPTVhfVklERU9fQ09OVFJPTFJBVEVUWVBFIGJpdHJhdGVNb2RlLCBpbnQzMl90IGJpdHJhdGUsIGludDMyX3QgcXVhbGl0eSkgewogICAgIE9NWF9WSURFT19QQVJBTV9CSVRSQVRFVFlQRSBiaXRyYXRlVHlwZTsKICAgICBJbml0T01YUGFyYW1zKCZiaXRyYXRlVHlwZSk7CiAgICAgYml0cmF0ZVR5cGUublBvcnRJbmRleCA9IGtQb3J0SW5kZXhPdXRwdXQ7CkBAIC00NTg4LDcgKzQ2ODcsMTMgQEAKICAgICB9CiAKICAgICBiaXRyYXRlVHlwZS5lQ29udHJvbFJhdGUgPSBiaXRyYXRlTW9kZTsKLSAgICBiaXRyYXRlVHlwZS5uVGFyZ2V0Qml0cmF0ZSA9IGJpdHJhdGU7CisKKyAgICAvLyB3cml0ZSBpdCBvdXQgZXhwbGljaXRseSBldmVuIGlmIGl0J3MgYSB1bmlvbgorICAgIGlmIChiaXRyYXRlTW9kZSA9PSBPTVhfVmlkZW9fQ29udHJvbFJhdGVDb25zdGFudFF1YWxpdHkpIHsKKyAgICAgICAgYml0cmF0ZVR5cGUublF1YWxpdHlGYWN0b3IgPSBxdWFsaXR5OworICAgIH0gZWxzZSB7CisgICAgICAgIGJpdHJhdGVUeXBlLm5UYXJnZXRCaXRyYXRlID0gYml0cmF0ZTsKKyAgICB9CiAKICAgICByZXR1cm4gbU9NWE5vZGUtPnNldFBhcmFtZXRlcigKICAgICAgICAgICAgIE9NWF9JbmRleFBhcmFtVmlkZW9CaXRyYXRlLCAmYml0cmF0ZVR5cGUsIHNpemVvZihiaXRyYXRlVHlwZSkpOwpAQCAtNDg0MSw4ICs0OTQ2LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5IZWlnaHQgPSB2aWRlb0RlZi0+bkZyYW1lSGVpZ2h0OwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVjdC5uTGVmdCA8IDAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5Ub3AgPCAwIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVjdC5uTGVmdCA8IDAgfHwgcmVjdC5uVG9wIDwgMCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QubldpZHRoID09IDAgfHwgcmVjdC5uSGVpZ2h0ID09IDAgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5MZWZ0ICsgcmVjdC5uV2lkdGggPiB2aWRlb0RlZi0+bkZyYW1lV2lkdGggfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5Ub3AgKyByZWN0Lm5IZWlnaHQgPiB2aWRlb0RlZi0+bkZyYW1lSGVpZ2h0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIldyb25nIGNyb3BwZWQgcmVjdCAoJWQsICVkLCAldSwgJXUpIHZzLiBmcmFtZSAoJXUsICV1KSIsCkBAIC00ODc2LDcgKzQ5ODEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKWdldEhEUlN0YXRpY0luZm9Gb3JWaWRlb0NvZGVjKGtQb3J0SW5kZXhJbnB1dCwgbm90aWZ5KTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxhdGVuY3kgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc0VuY29kZXIgJiYgZ2V0TGF0ZW5jeSgmbGF0ZW5jeSkgPT0gT0sgJiYgbGF0ZW5jeSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtSXNFbmNvZGVyICYmICFtSXNJbWFnZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMYXRlbmN5KCZsYXRlbmN5KSA9PSBPSyAmJiBsYXRlbmN5ID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImxhdGVuY3kiLCBsYXRlbmN5KTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNDkzMiw3ICs1MDM4LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0U3RyaW5nKCJtaW1lIiwgbWltZS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbnRyYVJlZnJlc2hQZXJpb2QgPSAwOwotICAgICAgICAgICAgICAgICAgICBpZiAobUlzRW5jb2RlciAmJiBnZXRJbnRyYVJlZnJlc2hQZXJpb2QoJmludHJhUmVmcmVzaFBlcmlvZCkgPT0gT0sKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc0VuY29kZXIgJiYgIW1Jc0ltYWdlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SW50cmFSZWZyZXNoUGVyaW9kKCZpbnRyYVJlZnJlc2hQZXJpb2QpID09IE9LCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaW50cmFSZWZyZXNoUGVyaW9kID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiaW50cmEtcmVmcmVzaC1wZXJpb2QiLCBpbnRyYVJlZnJlc2hQZXJpb2QpOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC01MjIwLDEzICs1MzI3LDEzIEBACiAgICAgY29udmVydENvZGVjQ29sb3JBc3BlY3RzVG9QbGF0Zm9ybUFzcGVjdHMoYXNwZWN0cywgJnJhbmdlLCAmc3RhbmRhcmQsICZ0cmFuc2Zlcik7CiAKICAgICAvLyBpZiBzb21lIGFzcGVjdHMgYXJlIHVuc3BlY2lmaWVkLCB1c2UgZGF0YXNwYWNlIGZpZWxkcwotICAgIGlmIChyYW5nZSAhPSAwKSB7CisgICAgaWYgKHJhbmdlID09IDApIHsKICAgICAgICAgcmFuZ2UgPSAoZGF0YVNwYWNlICYgSEFMX0RBVEFTUEFDRV9SQU5HRV9NQVNLKSA+PiBIQUxfREFUQVNQQUNFX1JBTkdFX1NISUZUOwogICAgIH0KLSAgICBpZiAoc3RhbmRhcmQgIT0gMCkgeworICAgIGlmIChzdGFuZGFyZCA9PSAwKSB7CiAgICAgICAgIHN0YW5kYXJkID0gKGRhdGFTcGFjZSAmIEhBTF9EQVRBU1BBQ0VfU1RBTkRBUkRfTUFTSykgPj4gSEFMX0RBVEFTUEFDRV9TVEFOREFSRF9TSElGVDsKICAgICB9Ci0gICAgaWYgKHRyYW5zZmVyICE9IDApIHsKKyAgICBpZiAodHJhbnNmZXIgPT0gMCkgewogICAgICAgICB0cmFuc2ZlciA9IChkYXRhU3BhY2UgJiBIQUxfREFUQVNQQUNFX1RSQU5TRkVSX01BU0spID4+IEhBTF9EQVRBU1BBQ0VfVFJBTlNGRVJfU0hJRlQ7CiAgICAgfQogCkBAIC01NjQxLDcgKzU3NDgsNyBAQAogICAgIC8vIGJ5IHRoaXMgIk1lZGlhQnVmZmVyIiBvYmplY3QuIE5vdyB0aGF0IHRoZSBPTVggY29tcG9uZW50IGhhcwogICAgIC8vIHRvbGQgdXMgdGhhdCBpdCdzIGRvbmUgd2l0aCB0aGUgaW5wdXQgYnVmZmVyLCB3ZSBjYW4gZGVjcmVtZW50CiAgICAgLy8gdGhlIG1lZGlhQnVmZmVyJ3MgcmVmZXJlbmNlIGNvdW50LgotICAgIGluZm8tPm1EYXRhLT5zZXRNZWRpYUJ1ZmZlckJhc2UoTlVMTCk7CisgICAgaW5mby0+bURhdGEtPm1ldGEoKS0+c2V0T2JqZWN0KCJtZWRpYUJ1ZmZlckhvbGRlciIsIHNwPE1lZGlhQnVmZmVySG9sZGVyPihudWxscHRyKSk7CiAKICAgICBQb3J0TW9kZSBtb2RlID0gZ2V0UG9ydE1vZGUoa1BvcnRJbmRleElucHV0KTsKIApAQCAtNjA1Miw3ICs2MTU5LDcgQEAKICAgICAgICAgICAgIH0KICNpZiAwCiAgICAgICAgICAgICBpZiAobUNvZGVjLT5tTmF0aXZlV2luZG93ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpZiAoSXNJRFIoaW5mby0+bURhdGEpKSB7CisgICAgICAgICAgICAgICAgaWYgKElzSURSKGluZm8tPm1EYXRhLT5kYXRhKCksIGluZm8tPm1EYXRhLT5zaXplKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJJRFIgZnJhbWUiKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC02MTQwLDYgKzYyNDcsMTQgQEAKICAgICAgICAgICAgIG1Db2RlYy0+bUxhc3ROYXRpdmVXaW5kb3dEYXRhU3BhY2UgPSBkYXRhU3BhY2U7CiAgICAgICAgICAgICBBTE9HV19JRihlcnIgIT0gTk9fRVJST1IsICJmYWlsZWQgdG8gc2V0IGRhdGFzcGFjZTogJWQiLCBlcnIpOwogICAgICAgICB9CisgICAgICAgIGlmIChidWZmZXItPmZvcm1hdCgpLT5jb250YWlucygiaGRyLXN0YXRpYy1pbmZvIikpIHsKKyAgICAgICAgICAgIEhEUlN0YXRpY0luZm8gaW5mbzsKKyAgICAgICAgICAgIGlmIChDb2xvclV0aWxzOjpnZXRIRFJTdGF0aWNJbmZvRnJvbUZvcm1hdChidWZmZXItPmZvcm1hdCgpLCAmaW5mbykKKyAgICAgICAgICAgICAgICAmJiBtZW1jbXAoJm1Db2RlYy0+bUxhc3RIRFJTdGF0aWNJbmZvLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkgeworICAgICAgICAgICAgICAgIHNldE5hdGl2ZVdpbmRvd0hkck1ldGFkYXRhKG1Db2RlYy0+bU5hdGl2ZVdpbmRvdy5nZXQoKSwgJmluZm8pOworICAgICAgICAgICAgICAgIG1Db2RlYy0+bUxhc3RIRFJTdGF0aWNJbmZvID0gaW5mbzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCiAgICAgICAgIC8vIHNhdmUgYnVmZmVycyBzZW50IHRvIHRoZSBzdXJmYWNlIHNvIHdlIGNhbiBnZXQgcmVuZGVyIHRpbWUgd2hlbiB0aGV5IHJldHVybgogICAgICAgICBpbnQ2NF90IG1lZGlhVGltZVVzID0gLTE7CkBAIC02MjQ5LDEzICs2MzY0LDggQEAKIAogICAgIGlmIChtRGVhdGhOb3RpZmllciAhPSBOVUxMKSB7CiAgICAgICAgIGlmIChtQ29kZWMtPm1PTVhOb2RlICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGlmIChtQ29kZWMtPmdldFRyZWJsZUZsYWcoKSkgewotICAgICAgICAgICAgICAgIGF1dG8gdE9teE5vZGUgPSBtQ29kZWMtPm1PTVhOb2RlLT5nZXRIYWxJbnRlcmZhY2UoKTsKLSAgICAgICAgICAgICAgICB0T214Tm9kZS0+dW5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IElJbnRlcmZhY2U6OmFzQmluZGVyKG1Db2RlYy0+bU9NWE5vZGUpOwotICAgICAgICAgICAgICAgIGJpbmRlci0+dW5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllcik7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBhdXRvIHRPbXhOb2RlID0gbUNvZGVjLT5tT01YTm9kZS0+Z2V0SGFsSW50ZXJmYWNlKCk7CisgICAgICAgICAgICB0T214Tm9kZS0+dW5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllcik7CiAgICAgICAgIH0KICAgICAgICAgbURlYXRoTm90aWZpZXIuY2xlYXIoKTsKICAgICB9CkBAIC02MzQ0LDExMiArNjQ1NCw0OCBAQAogCiAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdE9NWERpZWQsIG1Db2RlYyk7CiAKLSAgICBWZWN0b3I8QVN0cmluZz4gbWF0Y2hpbmdDb2RlY3M7Ci0gICAgVmVjdG9yPEFTdHJpbmc+IG93bmVyczsKLQotICAgIEFTdHJpbmcgbWltZTsKKyAgICBzcDxSZWZCYXNlPiBvYmo7CisgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJjb2RlY0luZm8iLCAmb2JqKSk7CisgICAgc3A8TWVkaWFDb2RlY0luZm8+IGluZm8gPSAoTWVkaWFDb2RlY0luZm8gKilvYmouZ2V0KCk7CisgICAgaWYgKGluZm8gPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiVW5leHBlY3RlZCBudWxscHRyIGZvciBjb2RlYyBpbmZvcm1hdGlvbiIpOworICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclVuZGVmaW5lZCwgVU5LTk9XTl9FUlJPUik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgQVN0cmluZyBvd25lciA9IChpbmZvLT5nZXRPd25lck5hbWUoKSA9PSBudWxscHRyKSA/ICJkZWZhdWx0IiA6IGluZm8tPmdldE93bmVyTmFtZSgpOwogCiAgICAgQVN0cmluZyBjb21wb25lbnROYW1lOwotICAgIGludDMyX3QgZW5jb2RlciA9IGZhbHNlOwotICAgIGlmIChtc2ctPmZpbmRTdHJpbmcoImNvbXBvbmVudE5hbWUiLCAmY29tcG9uZW50TmFtZSkpIHsKLSAgICAgICAgc3A8SU1lZGlhQ29kZWNMaXN0PiBsaXN0ID0gTWVkaWFDb2RlY0xpc3Q6OmdldEluc3RhbmNlKCk7Ci0gICAgICAgIGlmIChsaXN0ID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gb2J0YWluIE1lZGlhQ29kZWNMaXN0IHdoaWxlICIKLSAgICAgICAgICAgICAgICAgICAgImF0dGVtcHRpbmcgdG8gY3JlYXRlIGNvZGVjIFwiJXNcIiIsCi0gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudE5hbWUuY19zdHIoKSk7Ci0gICAgICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclVuZGVmaW5lZCwgTk9fSU5JVCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgc3NpemVfdCBpbmRleCA9IGxpc3QtPmZpbmRDb2RlY0J5TmFtZShjb21wb25lbnROYW1lLmNfc3RyKCkpOwotICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGZpbmQgY29kZWMgXCIlc1wiIiwKLSAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50TmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoT01YX0Vycm9ySW52YWxpZENvbXBvbmVudCwgTkFNRV9OT1RfRk9VTkQpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHNwPE1lZGlhQ29kZWNJbmZvPiBpbmZvID0gbGlzdC0+Z2V0Q29kZWNJbmZvKGluZGV4KTsKLSAgICAgICAgaWYgKGluZm8gPT0gbnVsbHB0cikgewotICAgICAgICAgICAgQUxPR0UoIlVuZXhwZWN0ZWQgZXJyb3IgKGluZGV4IG91dC1vZi1ib3VuZCkgd2hpbGUgIgotICAgICAgICAgICAgICAgICAgICAicmV0cmlldmluZyBpbmZvcm1hdGlvbiBmb3IgY29kZWMgXCIlc1wiIiwKLSAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50TmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoT01YX0Vycm9yVW5kZWZpbmVkLCBVTktOT1dOX0VSUk9SKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBtYXRjaGluZ0NvZGVjcy5hZGQoaW5mby0+Z2V0Q29kZWNOYW1lKCkpOwotICAgICAgICBvd25lcnMuYWRkKGluZm8tPmdldE93bmVyTmFtZSgpID09IG51bGxwdHIgPwotICAgICAgICAgICAgICAgICJkZWZhdWx0IiA6IGluZm8tPmdldE93bmVyTmFtZSgpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBDSEVDSyhtc2ctPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOwotCi0gICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImVuY29kZXIiLCAmZW5jb2RlcikpIHsKLSAgICAgICAgICAgIGVuY29kZXIgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIE1lZGlhQ29kZWNMaXN0OjpmaW5kTWF0Y2hpbmdDb2RlY3MoCi0gICAgICAgICAgICAgICAgbWltZS5jX3N0cigpLAotICAgICAgICAgICAgICAgIGVuY29kZXIsIC8vIGNyZWF0ZUVuY29kZXIKLSAgICAgICAgICAgICAgICAwLCAgICAgICAvLyBmbGFncwotICAgICAgICAgICAgICAgICZtYXRjaGluZ0NvZGVjcywKLSAgICAgICAgICAgICAgICAmb3duZXJzKTsKLSAgICB9CisgICAgQ0hFQ0sobXNnLT5maW5kU3RyaW5nKCJjb21wb25lbnROYW1lIiwgJmNvbXBvbmVudE5hbWUpKTsKIAogICAgIHNwPENvZGVjT2JzZXJ2ZXI+IG9ic2VydmVyID0gbmV3IENvZGVjT2JzZXJ2ZXI7CiAgICAgc3A8SU9NWD4gb214OwogICAgIHNwPElPTVhOb2RlPiBvbXhOb2RlOwogCiAgICAgc3RhdHVzX3QgZXJyID0gTkFNRV9OT1RfRk9VTkQ7Ci0gICAgZm9yIChzaXplX3QgbWF0Y2hJbmRleCA9IDA7IG1hdGNoSW5kZXggPCBtYXRjaGluZ0NvZGVjcy5zaXplKCk7Ci0gICAgICAgICAgICArK21hdGNoSW5kZXgpIHsKLSAgICAgICAgY29tcG9uZW50TmFtZSA9IG1hdGNoaW5nQ29kZWNzW21hdGNoSW5kZXhdOwotCi0gICAgICAgIE9NWENsaWVudCBjbGllbnQ7Ci0gICAgICAgIGJvb2wgdHJlYmxlRmxhZzsKLSAgICAgICAgaWYgKGNsaWVudC5jb25uZWN0KG93bmVyc1ttYXRjaEluZGV4XS5jX3N0cigpLCAmdHJlYmxlRmxhZykgIT0gT0spIHsKLSAgICAgICAgICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoT01YX0Vycm9yVW5kZWZpbmVkLCBOT19JTklUKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBvbXggPSBjbGllbnQuaW50ZXJmYWNlKCk7Ci0KLSAgICAgICAgcGlkX3QgdGlkID0gZ2V0dGlkKCk7Ci0gICAgICAgIGludCBwcmV2UHJpb3JpdHkgPSBhbmRyb2lkR2V0VGhyZWFkUHJpb3JpdHkodGlkKTsKLSAgICAgICAgYW5kcm9pZFNldFRocmVhZFByaW9yaXR5KHRpZCwgQU5EUk9JRF9QUklPUklUWV9GT1JFR1JPVU5EKTsKLSAgICAgICAgZXJyID0gb214LT5hbGxvY2F0ZU5vZGUoY29tcG9uZW50TmFtZS5jX3N0cigpLCBvYnNlcnZlciwgJm9teE5vZGUpOwotICAgICAgICBhbmRyb2lkU2V0VGhyZWFkUHJpb3JpdHkodGlkLCBwcmV2UHJpb3JpdHkpOwotCi0gICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgIG1Db2RlYy0+c2V0VHJlYmxlRmxhZyh0cmVibGVGbGFnKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1coIkFsbG9jYXRpbmcgY29tcG9uZW50ICclcycgZmFpbGVkLCB0cnkgbmV4dCBvbmUuIiwgY29tcG9uZW50TmFtZS5jX3N0cigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIG9teE5vZGUgPSBOVUxMOworICAgIE9NWENsaWVudCBjbGllbnQ7CisgICAgaWYgKGNsaWVudC5jb25uZWN0KG93bmVyLmNfc3RyKCkpICE9IE9LKSB7CisgICAgICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoT01YX0Vycm9yVW5kZWZpbmVkLCBOT19JTklUKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KKyAgICBvbXggPSBjbGllbnQuaW50ZXJmYWNlKCk7CiAKLSAgICBpZiAob214Tm9kZSA9PSBOVUxMKSB7Ci0gICAgICAgIGlmICghbWltZS5lbXB0eSgpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGluc3RhbnRpYXRlIGEgJXNjb2RlciBmb3IgdHlwZSAnJXMnIHdpdGggZXJyICUjeC4iLAotICAgICAgICAgICAgICAgICAgICBlbmNvZGVyID8gImVuIiA6ICJkZSIsIG1pbWUuY19zdHIoKSwgZXJyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gaW5zdGFudGlhdGUgY29kZWMgJyVzJyB3aXRoIGVyciAlI3guIiwgY29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOwotICAgICAgICB9CisgICAgcGlkX3QgdGlkID0gZ2V0dGlkKCk7CisgICAgaW50IHByZXZQcmlvcml0eSA9IGFuZHJvaWRHZXRUaHJlYWRQcmlvcml0eSh0aWQpOworICAgIGFuZHJvaWRTZXRUaHJlYWRQcmlvcml0eSh0aWQsIEFORFJPSURfUFJJT1JJVFlfRk9SRUdST1VORCk7CisgICAgZXJyID0gb214LT5hbGxvY2F0ZU5vZGUoY29tcG9uZW50TmFtZS5jX3N0cigpLCBvYnNlcnZlciwgJm9teE5vZGUpOworICAgIGFuZHJvaWRTZXRUaHJlYWRQcmlvcml0eSh0aWQsIHByZXZQcmlvcml0eSk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gaW5zdGFudGlhdGUgY29kZWMgJyVzJyB3aXRoIGVyciAlI3guIiwgY29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOwogCiAgICAgICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoKE9NWF9FUlJPUlRZUEUpZXJyLCBtYWtlTm9TaWRlRWZmZWN0U3RhdHVzKGVycikpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgbURlYXRoTm90aWZpZXIgPSBuZXcgRGVhdGhOb3RpZmllcihub3RpZnkpOwotICAgIGlmIChtQ29kZWMtPmdldFRyZWJsZUZsYWcoKSkgewotICAgICAgICBhdXRvIHRPbXhOb2RlID0gb214Tm9kZS0+Z2V0SGFsSW50ZXJmYWNlKCk7Ci0gICAgICAgIGlmICghdE9teE5vZGUtPmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCAwKSkgewotICAgICAgICAgICAgbURlYXRoTm90aWZpZXIuY2xlYXIoKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChJSW50ZXJmYWNlOjphc0JpbmRlcihvbXhOb2RlKS0+bGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIpICE9IE9LKSB7Ci0gICAgICAgICAgICAvLyBUaGlzIHdhcyBhIGxvY2FsIGJpbmRlciwgaWYgaXQgZGllcyBzbyBkbyB3ZSwgd2Ugd29uJ3QgY2FyZQotICAgICAgICAgICAgLy8gYWJvdXQgYW55IG5vdGlmaWNhdGlvbnMgaW4gdGhlIGFmdGVybGlmZS4KLSAgICAgICAgICAgIG1EZWF0aE5vdGlmaWVyLmNsZWFyKCk7Ci0gICAgICAgIH0KKyAgICBhdXRvIHRPbXhOb2RlID0gb214Tm9kZS0+Z2V0SGFsSW50ZXJmYWNlKCk7CisgICAgaWYgKCF0T214Tm9kZS0+bGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIsIDApKSB7CisgICAgICAgIG1EZWF0aE5vdGlmaWVyLmNsZWFyKCk7CiAgICAgfQogCiAgICAgbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0T01YTWVzc2FnZUxpc3QsIG1Db2RlYyk7CkBAIC02NjQ1LDExICs2NjkxLDExIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAobUNvZGVjLT5tTWF4UHRzR2FwVXMgPiAwbGwpIHsKKyAgICBpZiAobUNvZGVjLT5tTWF4UHRzR2FwVXMgIT0gMGxsKSB7CiAgICAgICAgIE9NWF9QQVJBTV9VMzJUWVBFIG1heFB0c0dhcFBhcmFtczsKICAgICAgICAgSW5pdE9NWFBhcmFtcygmbWF4UHRzR2FwUGFyYW1zKTsKICAgICAgICAgbWF4UHRzR2FwUGFyYW1zLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4SW5wdXQ7Ci0gICAgICAgIG1heFB0c0dhcFBhcmFtcy5uVTMyID0gKHVpbnQzMl90KSBtQ29kZWMtPm1NYXhQdHNHYXBVczsKKyAgICAgICAgbWF4UHRzR2FwUGFyYW1zLm5VMzIgPSAodWludDMyX3QpbUNvZGVjLT5tTWF4UHRzR2FwVXM7CiAKICAgICAgICAgZXJyID0gbUNvZGVjLT5tT01YTm9kZS0+c2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtTWF4RnJhbWVEdXJhdGlvbkZvckJpdHJhdGVDb250cm9sLApAQCAtNjY2Miw3ICs2NzA4LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChtQ29kZWMtPm1NYXhGcHMgPiAwKSB7CisgICAgaWYgKG1Db2RlYy0+bU1heEZwcyA+IDAgfHwgbUNvZGVjLT5tTWF4UHRzR2FwVXMgPCAwKSB7CiAgICAgICAgIGVyciA9IHN0YXR1c0Zyb21CaW5kZXJTdGF0dXMoCiAgICAgICAgICAgICAgICAgbUNvZGVjLT5tR3JhcGhpY0J1ZmZlclNvdXJjZS0+c2V0TWF4RnBzKG1Db2RlYy0+bU1heEZwcykpOwogCkBAIC02NzU1LDkgKzY4MDEsMTQgQEAKIAogICAgIHNwPFJlZkJhc2U+IG9iajsKICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoImlucHV0LXN1cmZhY2UiLCAmb2JqKSk7CisgICAgaWYgKG9iaiA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJbJXNdIE5VTEwgaW5wdXQgc3VyZmFjZSIsIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgIG1Db2RlYy0+bUNhbGxiYWNrLT5vbklucHV0U3VyZmFjZURlY2xpbmVkKEJBRF9WQUxVRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKICAgICBzcDxQZXJzaXN0ZW50U3VyZmFjZT4gc3VyZmFjZSA9IHN0YXRpY19jYXN0PFBlcnNpc3RlbnRTdXJmYWNlICo+KG9iai5nZXQoKSk7CiAgICAgbUNvZGVjLT5tR3JhcGhpY0J1ZmZlclNvdXJjZSA9IHN1cmZhY2UtPmdldEJ1ZmZlclNvdXJjZSgpOwotCiAgICAgc3RhdHVzX3QgZXJyID0gc2V0dXBJbnB1dFN1cmZhY2UoKTsKIAogICAgIGlmIChlcnIgPT0gT0spIHsKQEAgLTcyOTcsMTIgKzczNDgsMTYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGZsb2F0IHJhdGU7Ci0gICAgaWYgKHBhcmFtcy0+ZmluZEZsb2F0KCJvcGVyYXRpbmctcmF0ZSIsICZyYXRlKSAmJiByYXRlID4gMCkgewotICAgICAgICBzdGF0dXNfdCBlcnIgPSBzZXRPcGVyYXRpbmdSYXRlKHJhdGUsIG1Jc1ZpZGVvKTsKKyAgICBpbnQzMl90IHJhdGVJbnQgPSAtMTsKKyAgICBmbG9hdCByYXRlRmxvYXQgPSAtMTsKKyAgICBpZiAoIXBhcmFtcy0+ZmluZEZsb2F0KCJvcGVyYXRpbmctcmF0ZSIsICZyYXRlRmxvYXQpKSB7CisgICAgICAgIHBhcmFtcy0+ZmluZEludDMyKCJvcGVyYXRpbmctcmF0ZSIsICZyYXRlSW50KTsKKyAgICAgICAgcmF0ZUZsb2F0ID0gKGZsb2F0KSByYXRlSW50OyAvLyAxNk1IeiAoRkxJTlRNQVgpIGlzIE9LIGZvciB1cHBlciBib3VuZC4KKyAgICB9CisgICAgaWYgKHJhdGVGbG9hdCA+IDApIHsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gc2V0T3BlcmF0aW5nUmF0ZShyYXRlRmxvYXQsIG1Jc1ZpZGVvKTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgcGFyYW1ldGVyICdvcGVyYXRpbmctcmF0ZScgKGVyciAlZCkiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIEFMT0dJKCJGYWlsZWQgdG8gc2V0IHBhcmFtZXRlciAnb3BlcmF0aW5nLXJhdGUnIChlcnIgJWQpIiwgZXJyKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNzMyNywxMCArNzM4Miw4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBzdGF0dXNfdCBlcnIgPSBjb25maWd1cmVUZW1wb3JhbExheWVycyhwYXJhbXMsIGZhbHNlIC8qIGluQ29uZmlndXJlICovLCBtT3V0cHV0Rm9ybWF0KTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIGVyciA9IE9LOyAvLyBpZ25vcmUgZmFpbHVyZQotICAgIH0KKyAgICAvLyBJZ25vcmUgZXJyb3JzIGFzIGZhaWx1cmUgaXMgZXhwZWN0ZWQgZm9yIGNvZGVjcyB0aGF0IGFyZW4ndCB2aWRlbyBlbmNvZGVycy4KKyAgICAodm9pZCljb25maWd1cmVUZW1wb3JhbExheWVycyhwYXJhbXMsIGZhbHNlIC8qIGluQ29uZmlndXJlICovLCBtT3V0cHV0Rm9ybWF0KTsKIAogICAgIHJldHVybiBzZXRWZW5kb3JQYXJhbWV0ZXJzKHBhcmFtcyk7CiB9CkBAIC03NTg2LDggKzc2MzksMTAgQEAKICAgICAgICAgICAgICAgICBjb25maWctPnBhcmFtW3BhcmFtSW5kZXhdLmJTZXQgPQogICAgICAgICAgICAgICAgICAgICAoT01YX0JPT0wpcGFyYW1zLT5maW5kU3RyaW5nKGV4aXN0aW5nS2V5LT5zZWNvbmQuY19zdHIoKSwgJnZhbHVlKTsKICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLT5wYXJhbVtwYXJhbUluZGV4XS5iU2V0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cm5jcHkoKGNoYXIgKiljb25maWctPnBhcmFtW3BhcmFtSW5kZXhdLmNTdHJpbmcsIHZhbHVlLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE9NWF9DT05GSUdfQU5EUk9JRF9WRU5ET1JfUEFSQU1UWVBFOjpjU3RyaW5nKSk7CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkc3RTaXplID0gc2l6ZW9mKGNvbmZpZy0+cGFyYW1bcGFyYW1JbmRleF0uY1N0cmluZyk7CisgICAgICAgICAgICAgICAgICAgIHN0cm5jcHkoKGNoYXIgKiljb25maWctPnBhcmFtW3BhcmFtSW5kZXhdLmNTdHJpbmcsIHZhbHVlLmNfc3RyKCksIGRzdFNpemUgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gbnVsbCB0ZXJtaW5hdGUgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5wYXJhbVtwYXJhbUluZGV4XS5jU3RyaW5nW2RzdFNpemUgLSAxXSA9ICdcMCc7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtNzg1NiwxMSArNzkxMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tQnVmZmVyc1trUG9ydEluZGV4T3V0cHV0XS5zaXplKCkpOwogICAgICAgICAgICAgICAgICAgICBlcnIgPSBGQUlMRURfVFJBTlNBQ1RJT047CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Db2RlYy0+Z2V0VHJlYmxlRmxhZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1BbGxvY2F0b3Jba1BvcnRJbmRleE91dHB1dF0uY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bURlYWxlcltrUG9ydEluZGV4T3V0cHV0XS5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUFsbG9jYXRvcltrUG9ydEluZGV4T3V0cHV0XS5jbGVhcigpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKQEAgLTgyNzIsOCArODMyMyw5IEBACiAgICAgfQogCiAgICAgYm9vbCBpc1ZpZGVvID0gc3RybmNhc2VjbXAobWltZSwgInZpZGVvLyIsIDYpID09IDA7CisgICAgYm9vbCBpc0ltYWdlID0gc3RybmNhc2VjbXAobWltZSwgImltYWdlLyIsIDYpID09IDA7CiAKLSAgICBpZiAoaXNWaWRlbykgeworICAgIGlmIChpc1ZpZGVvIHx8IGlzSW1hZ2UpIHsKICAgICAgICAgT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUgcGFyYW07CiAgICAgICAgIEluaXRPTVhQYXJhbXMoJnBhcmFtKTsKICAgICAgICAgcGFyYW0ublBvcnRJbmRleCA9IGlzRW5jb2RlciA/IGtQb3J0SW5kZXhPdXRwdXQgOiBrUG9ydEluZGV4SW5wdXQ7CkBAIC04NDYyLDEyICs4NTE0LDQgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXZvaWQgQUNvZGVjOjpzZXRUcmVibGVGbGFnKGJvb2wgdHJlYmxlRmxhZykgewotICAgIG1UcmVibGVGbGFnID0gdHJlYmxlRmxhZzsKLX0KLQotYm9vbCBBQ29kZWM6OmdldFRyZWJsZUZsYWcoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1UcmVibGVGbGFnOwotfQotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjQnVmZmVyQ2hhbm5lbC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWNCdWZmZXJDaGFubmVsLmNwcAppbmRleCAzYzdhZTNlLi43MTBhZTY4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWNCdWZmZXJDaGFubmVsLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWNCdWZmZXJDaGFubmVsLmNwcApAQCAtMjIsNiArMjIsNyBAQAogCiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYXMvbmF0aXZlLzEuMC9JRGVzY3JhbWJsZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+CisjaW5jbHVkZSA8aGlkbG1lbW9yeS9GcmFtZXdvcmtVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0NvcmUuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KQEAgLTM0LDYgKzM1LDcgQEAKICNpbmNsdWRlICJpbmNsdWRlL1NoYXJlZE1lbW9yeUJ1ZmZlci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Cit1c2luZyBoYXJkd2FyZTo6ZnJvbUhlYXA7CiB1c2luZyBoYXJkd2FyZTo6aGlkbF9oYW5kbGU7CiB1c2luZyBoYXJkd2FyZTo6aGlkbF9zdHJpbmc7CiB1c2luZyBoYXJkd2FyZTo6aGlkbF92ZWM7CkBAIC0xNjIsNyArMTY0LDcgQEAKICAgICAgICAgc2l6ZV90IHNpemU7CiAgICAgICAgIGl0LT5tU2hhcmVkRW5jcnlwdGVkQnVmZmVyLT5nZXRNZW1vcnkoJm9mZnNldCwgJnNpemUpOwogICAgICAgICBoYXJkd2FyZTo6Y2FzOjpuYXRpdmU6OlYxXzA6OlNoYXJlZEJ1ZmZlciBzcmNCdWZmZXIgPSB7Ci0gICAgICAgICAgICAgICAgLmhlYXBCYXNlID0gbUhpZGxNZW1vcnksCisgICAgICAgICAgICAgICAgLmhlYXBCYXNlID0gKm1IaWRsTWVtb3J5LAogICAgICAgICAgICAgICAgIC5vZmZzZXQgPSAodWludDY0X3QpIG9mZnNldCwKICAgICAgICAgICAgICAgICAuc2l6ZSA9IHNpemUKICAgICAgICAgfTsKQEAgLTMwOCwxMSArMzEwLDggQEAKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAobURlc2NyYW1ibGVyICE9IG51bGxwdHIpIHsKICAgICAgICAgc3A8SU1lbW9yeUhlYXA+IGhlYXAgPSBkZWFsZXItPmdldE1lbW9yeUhlYXAoKTsKLSAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBuYXRpdmVIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKLSAgICAgICAgaWYgKG5hdGl2ZUhhbmRsZSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBpbnQgZmQgPSBoZWFwLT5nZXRIZWFwSUQoKTsKLSAgICAgICAgICAgIG5hdGl2ZUhhbmRsZS0+ZGF0YVswXSA9IGZkOwotICAgICAgICAgICAgbUhpZGxNZW1vcnkgPSBoaWRsX21lbW9yeSgiYXNobWVtIiwgaGlkbF9oYW5kbGUobmF0aXZlSGFuZGxlKSwgaGVhcC0+Z2V0U2l6ZSgpKTsKKyAgICAgICAgbUhpZGxNZW1vcnkgPSBmcm9tSGVhcChoZWFwKTsKKyAgICAgICAgaWYgKG1IaWRsTWVtb3J5ICE9IE5VTEwpIHsKICAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVkIGhpZGxfbWVtb3J5IGZvciBkZXNjcmFtYmxlciIpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0byBjcmVhdGUgaGlkbF9tZW1vcnkgZm9yIGRlc2NyYW1ibGVyIik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BTVJFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQU1SRXh0cmFjdG9yLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg5MjUyMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BTVJFeHRyYWN0b3IuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzY1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIkFNUkV4dHJhY3RvciIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgImluY2x1ZGUvQU1SRXh0cmFjdG9yLmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIEFNUlNvdXJjZSA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7Ci1wdWJsaWM6Ci0gICAgQU1SU291cmNlKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsCi0gICAgICAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSwKLSAgICAgICAgICAgICAgYm9vbCBpc1dpZGUsCi0gICAgICAgICAgICAgIGNvbnN0IG9mZjY0X3QgKm9mZnNldF90YWJsZSwKLSAgICAgICAgICAgICAgc2l6ZV90IG9mZnNldF90YWJsZV9sZW5ndGgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0KLSAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+QU1SU291cmNlKCk7Ci0KLXByaXZhdGU6Ci0gICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7Ci0gICAgc3A8TWV0YURhdGE+IG1NZXRhOwotICAgIGJvb2wgbUlzV2lkZTsKLQotICAgIG9mZjY0X3QgbU9mZnNldDsKLSAgICBpbnQ2NF90IG1DdXJyZW50VGltZVVzOwotICAgIGJvb2wgbVN0YXJ0ZWQ7Ci0gICAgTWVkaWFCdWZmZXJHcm91cCAqbUdyb3VwOwotCi0gICAgb2ZmNjRfdCBtT2Zmc2V0VGFibGVbT0ZGU0VUX1RBQkxFX0xFTl07Ci0gICAgc2l6ZV90IG1PZmZzZXRUYWJsZUxlbmd0aDsKLQotICAgIEFNUlNvdXJjZShjb25zdCBBTVJTb3VyY2UgJik7Ci0gICAgQU1SU291cmNlICZvcGVyYXRvcj0oY29uc3QgQU1SU291cmNlICYpOwotfTsKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotc3RhdGljIHNpemVfdCBnZXRGcmFtZVNpemUoYm9vbCBpc1dpZGUsIHVuc2lnbmVkIEZUKSB7Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrRnJhbWVTaXplTkJbMTZdID0gewotICAgICAgICA5NSwgMTAzLCAxMTgsIDEzNCwgMTQ4LCAxNTksIDIwNCwgMjQ0LAotICAgICAgICAzOSwgNDMsIDM4LCAzNywgLy8gU0lECi0gICAgICAgIDAsIDAsIDAsIC8vIGZ1dHVyZSB1c2UKLSAgICAgICAgMCAvLyBubyBkYXRhCi0gICAgfTsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtGcmFtZVNpemVXQlsxNl0gPSB7Ci0gICAgICAgIDEzMiwgMTc3LCAyNTMsIDI4NSwgMzE3LCAzNjUsIDM5NywgNDYxLCA0NzcsCi0gICAgICAgIDQwLCAvLyBTSUQKLSAgICAgICAgMCwgMCwgMCwgMCwgLy8gZnV0dXJlIHVzZQotICAgICAgICAwLCAvLyBzcGVlY2ggbG9zdAotICAgICAgICAwIC8vIG5vIGRhdGEKLSAgICB9OwotCi0gICAgaWYgKEZUID4gMTUgfHwgKGlzV2lkZSAmJiBGVCA+IDkgJiYgRlQgPCAxNCkgfHwgKCFpc1dpZGUgJiYgRlQgPiAxMSAmJiBGVCA8IDE1KSkgewotICAgICAgICBBTE9HRSgiaWxsZWdhbCBBTVIgZnJhbWUgdHlwZSAlZCIsIEZUKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgc2l6ZV90IGZyYW1lU2l6ZSA9IGlzV2lkZSA/IGtGcmFtZVNpemVXQltGVF0gOiBrRnJhbWVTaXplTkJbRlRdOwotCi0gICAgLy8gUm91bmQgdXAgYml0cyB0byBieXRlcyBhbmQgYWRkIDEgZm9yIHRoZSBoZWFkZXIgYnl0ZS4KLSAgICBmcmFtZVNpemUgPSAoZnJhbWVTaXplICsgNykgLyA4ICsgMTsKLQotICAgIHJldHVybiBmcmFtZVNpemU7Ci19Ci0KLXN0YXRpYyBzdGF0dXNfdCBnZXRGcmFtZVNpemVCeU9mZnNldChjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLAotICAgICAgICBvZmY2NF90IG9mZnNldCwgYm9vbCBpc1dpZGUsIHNpemVfdCAqZnJhbWVTaXplKSB7Ci0gICAgdWludDhfdCBoZWFkZXI7Ci0gICAgc3NpemVfdCBjb3VudCA9IHNvdXJjZS0+cmVhZEF0KG9mZnNldCwgJmhlYWRlciwgMSk7Ci0gICAgaWYgKGNvdW50ID09IDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07Ci0gICAgfSBlbHNlIGlmIChjb3VudCA8IDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgIH0KLQotICAgIHVuc2lnbmVkIEZUID0gKGhlYWRlciA+PiAzKSAmIDB4MGY7Ci0KLSAgICAqZnJhbWVTaXplID0gZ2V0RnJhbWVTaXplKGlzV2lkZSwgRlQpOwotICAgIGlmICgqZnJhbWVTaXplID09IDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1BTVJFeHRyYWN0b3I6OkFNUkV4dHJhY3Rvcihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKQotICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKLSAgICAgIG1Jbml0Q2hlY2soTk9fSU5JVCksCi0gICAgICBtT2Zmc2V0VGFibGVMZW5ndGgoMCkgewotICAgIFN0cmluZzggbWltZVR5cGU7Ci0gICAgZmxvYXQgY29uZmlkZW5jZTsKLSAgICBpZiAoIVNuaWZmQU1SKG1EYXRhU291cmNlLCAmbWltZVR5cGUsICZjb25maWRlbmNlLCBOVUxMKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbUlzV2lkZSA9IChtaW1lVHlwZSA9PSBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IpOwotCi0gICAgbU1ldGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgbU1ldGEtPnNldENTdHJpbmcoCi0gICAgICAgICAgICBrS2V5TUlNRVR5cGUsIG1Jc1dpZGUgPyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQik7Ci0KLSAgICBtTWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgMSk7Ci0gICAgbU1ldGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBtSXNXaWRlID8gMTYwMDAgOiA4MDAwKTsKLQotICAgIG9mZjY0X3Qgb2Zmc2V0ID0gbUlzV2lkZSA/IDkgOiA2OwotICAgIG9mZjY0X3Qgc3RyZWFtU2l6ZTsKLSAgICBzaXplX3QgZnJhbWVTaXplLCBudW1GcmFtZXMgPSAwOwotICAgIGludDY0X3QgZHVyYXRpb24gPSAwOwotCi0gICAgaWYgKG1EYXRhU291cmNlLT5nZXRTaXplKCZzdHJlYW1TaXplKSA9PSBPSykgewotICAgICAgICAgd2hpbGUgKG9mZnNldCA8IHN0cmVhbVNpemUpIHsKLSAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRGcmFtZVNpemVCeU9mZnNldChzb3VyY2UsIG9mZnNldCwgbUlzV2lkZSwgJmZyYW1lU2l6ZSk7Ci0gICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7Ci0gICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoKG51bUZyYW1lcyAlIDUwID09IDApICYmIChudW1GcmFtZXMgLyA1MCA8IE9GRlNFVF9UQUJMRV9MRU4pKSB7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfRVEobU9mZnNldFRhYmxlTGVuZ3RoLCBudW1GcmFtZXMgLyA1MCk7Ci0gICAgICAgICAgICAgICAgbU9mZnNldFRhYmxlW21PZmZzZXRUYWJsZUxlbmd0aF0gPSBvZmZzZXQgLSAobUlzV2lkZSA/IDk6IDYpOwotICAgICAgICAgICAgICAgIG1PZmZzZXRUYWJsZUxlbmd0aCArKzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgb2Zmc2V0ICs9IGZyYW1lU2l6ZTsKLSAgICAgICAgICAgIGR1cmF0aW9uICs9IDIwMDAwOyAgLy8gRWFjaCBmcmFtZSBpcyAyMG1zCi0gICAgICAgICAgICBudW1GcmFtZXMgKys7Ci0gICAgICAgIH0KLQotICAgICAgICBtTWV0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvbik7Ci0gICAgfQotCi0gICAgbUluaXRDaGVjayA9IE9LOwotfQotCi1BTVJFeHRyYWN0b3I6On5BTVJFeHRyYWN0b3IoKSB7Ci19Ci0KLXNwPE1ldGFEYXRhPiBBTVJFeHRyYWN0b3I6OmdldE1ldGFEYXRhKCkgewotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOwotCi0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIG1ldGE7Ci0gICAgfQotCi0gICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIG1Jc1dpZGUgPyAiYXVkaW8vYW1yLXdiIiA6ICJhdWRpby9hbXIiKTsKLQotICAgIHJldHVybiBtZXRhOwotfQotCi1zaXplX3QgQU1SRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpIHsKLSAgICByZXR1cm4gbUluaXRDaGVjayA9PSBPSyA/IDEgOiAwOwotfQotCi1zcDxJTWVkaWFTb3VyY2U+IEFNUkV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7Ci0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggIT0gMCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gbmV3IEFNUlNvdXJjZShtRGF0YVNvdXJjZSwgbU1ldGEsIG1Jc1dpZGUsCi0gICAgICAgICAgICBtT2Zmc2V0VGFibGUsIG1PZmZzZXRUYWJsZUxlbmd0aCk7Ci19Ci0KLXNwPE1ldGFEYXRhPiBBTVJFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgewotICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ICE9IDApIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1NZXRhOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1BTVJTb3VyY2U6OkFNUlNvdXJjZSgKLSAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhLAotICAgICAgICBib29sIGlzV2lkZSwgY29uc3Qgb2ZmNjRfdCAqb2Zmc2V0X3RhYmxlLCBzaXplX3Qgb2Zmc2V0X3RhYmxlX2xlbmd0aCkKLSAgICA6IG1EYXRhU291cmNlKHNvdXJjZSksCi0gICAgICBtTWV0YShtZXRhKSwKLSAgICAgIG1Jc1dpZGUoaXNXaWRlKSwKLSAgICAgIG1PZmZzZXQobUlzV2lkZSA/IDkgOiA2KSwKLSAgICAgIG1DdXJyZW50VGltZVVzKDApLAotICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAotICAgICAgbUdyb3VwKE5VTEwpLAotICAgICAgbU9mZnNldFRhYmxlTGVuZ3RoKG9mZnNldF90YWJsZV9sZW5ndGgpIHsKLSAgICBpZiAobU9mZnNldFRhYmxlTGVuZ3RoID4gMCAmJiBtT2Zmc2V0VGFibGVMZW5ndGggPD0gT0ZGU0VUX1RBQkxFX0xFTikgewotICAgICAgICBtZW1jcHkgKChjaGFyKiltT2Zmc2V0VGFibGUsIChjaGFyKilvZmZzZXRfdGFibGUsIHNpemVvZihvZmY2NF90KSAqIG1PZmZzZXRUYWJsZUxlbmd0aCk7Ci0gICAgfQotfQotCi1BTVJTb3VyY2U6On5BTVJTb3VyY2UoKSB7Ci0gICAgaWYgKG1TdGFydGVkKSB7Ci0gICAgICAgIHN0b3AoKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEFNUlNvdXJjZTo6c3RhcnQoTWV0YURhdGEgKiAvKiBwYXJhbXMgKi8pIHsKLSAgICBDSEVDSyghbVN0YXJ0ZWQpOwotCi0gICAgbU9mZnNldCA9IG1Jc1dpZGUgPyA5IDogNjsKLSAgICBtQ3VycmVudFRpbWVVcyA9IDA7Ci0gICAgbUdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXA7Ci0gICAgbUdyb3VwLT5hZGRfYnVmZmVyKG5ldyBNZWRpYUJ1ZmZlcigxMjgpKTsKLSAgICBtU3RhcnRlZCA9IHRydWU7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEFNUlNvdXJjZTo6c3RvcCgpIHsKLSAgICBDSEVDSyhtU3RhcnRlZCk7Ci0KLSAgICBkZWxldGUgbUdyb3VwOwotICAgIG1Hcm91cCA9IE5VTEw7Ci0KLSAgICBtU3RhcnRlZCA9IGZhbHNlOwotICAgIHJldHVybiBPSzsKLX0KLQotc3A8TWV0YURhdGE+IEFNUlNvdXJjZTo6Z2V0Rm9ybWF0KCkgewotICAgIHJldHVybiBtTWV0YTsKLX0KLQotc3RhdHVzX3QgQU1SU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKLSAgICAqb3V0ID0gTlVMTDsKLQotICAgIGludDY0X3Qgc2Vla1RpbWVVczsKLSAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKLSAgICBpZiAobU9mZnNldFRhYmxlTGVuZ3RoID4gMCAmJiBvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7Ci0gICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICBpbnQ2NF90IHNlZWtGcmFtZSA9IHNlZWtUaW1lVXMgLyAyMDAwMGxsOyAgLy8gMjBtcyBwZXIgZnJhbWUuCi0gICAgICAgIG1DdXJyZW50VGltZVVzID0gc2Vla0ZyYW1lICogMjAwMDBsbDsKLQotICAgICAgICBzaXplX3QgaW5kZXggPSBzZWVrRnJhbWUgPCAwID8gMCA6IHNlZWtGcmFtZSAvIDUwOwotICAgICAgICBpZiAoaW5kZXggPj0gbU9mZnNldFRhYmxlTGVuZ3RoKSB7Ci0gICAgICAgICAgICBpbmRleCA9IG1PZmZzZXRUYWJsZUxlbmd0aCAtIDE7Ci0gICAgICAgIH0KLQotICAgICAgICBtT2Zmc2V0ID0gbU9mZnNldFRhYmxlW2luZGV4XSArIChtSXNXaWRlID8gOSA6IDYpOwotCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpPCBzZWVrRnJhbWUgLSBpbmRleCAqIDUwOyBpKyspIHsKLSAgICAgICAgICAgIHN0YXR1c190IGVycjsKLSAgICAgICAgICAgIGlmICgoZXJyID0gZ2V0RnJhbWVTaXplQnlPZmZzZXQobURhdGFTb3VyY2UsIG1PZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlzV2lkZSwgJnNpemUpKSAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtT2Zmc2V0ICs9IHNpemU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB1aW50OF90IGhlYWRlcjsKLSAgICBzc2l6ZV90IG4gPSBtRGF0YVNvdXJjZS0+cmVhZEF0KG1PZmZzZXQsICZoZWFkZXIsIDEpOwotCi0gICAgaWYgKG4gPCAxKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgIH0KLQotICAgIGlmIChoZWFkZXIgJiAweDgzKSB7Ci0gICAgICAgIC8vIFBhZGRpbmcgYml0cyBtdXN0IGJlIDAuCi0KLSAgICAgICAgQUxPR0UoInBhZGRpbmcgYml0cyBtdXN0IGJlIDAsIGhlYWRlciBpcyAweCUwMngiLCBoZWFkZXIpOwotCi0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgdW5zaWduZWQgRlQgPSAoaGVhZGVyID4+IDMpICYgMHgwZjsKLQotICAgIHNpemVfdCBmcmFtZVNpemUgPSBnZXRGcmFtZVNpemUobUlzV2lkZSwgRlQpOwotICAgIGlmIChmcmFtZVNpemUgPT0gMCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIE1lZGlhQnVmZmVyICpidWZmZXI7Ci0gICAgc3RhdHVzX3QgZXJyID0gbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgbiA9IG1EYXRhU291cmNlLT5yZWFkQXQobU9mZnNldCwgYnVmZmVyLT5kYXRhKCksIGZyYW1lU2l6ZSk7Ci0KLSAgICBpZiAobiAhPSAoc3NpemVfdClmcmFtZVNpemUpIHsKLSAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIGJ1ZmZlciA9IE5VTEw7Ci0KLSAgICAgICAgaWYgKG4gPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBvbmx5IHBhcnRpYWwgZnJhbWUgaXMgYXZhaWxhYmxlLCB0cmVhdCBpdCBhcyBFT1MuCi0gICAgICAgICAgICBtT2Zmc2V0ICs9IG47Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIGZyYW1lU2l6ZSk7Ci0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIG1DdXJyZW50VGltZVVzKTsKLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOwotCi0gICAgbU9mZnNldCArPSBmcmFtZVNpemU7Ci0gICAgbUN1cnJlbnRUaW1lVXMgKz0gMjAwMDA7ICAvLyBFYWNoIGZyYW1lIGlzIDIwbXMKLQotICAgICpvdXQgPSBidWZmZXI7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLWJvb2wgU25pZmZBTVIoCi0gICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSwKLSAgICAgICAgc3A8QU1lc3NhZ2U+ICopIHsKLSAgICBjaGFyIGhlYWRlcls5XTsKLQotICAgIGlmIChzb3VyY2UtPnJlYWRBdCgwLCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKSAhPSBzaXplb2YoaGVhZGVyKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKCFtZW1jbXAoaGVhZGVyLCAiIyFBTVJcbiIsIDYpKSB7Ci0gICAgICAgICptaW1lVHlwZSA9IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQjsKLSAgICAgICAgKmNvbmZpZGVuY2UgPSAwLjU7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIGlmICghbWVtY21wKGhlYWRlciwgIiMhQU1SLVdCXG4iLCA5KSkgewotICAgICAgICAqbWltZVR5cGUgPSBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0I7Ci0gICAgICAgICpjb25maWRlbmNlID0gMC41OwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FNUldyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BTVJXcml0ZXIuY3BwCmluZGV4IDk2MWI1N2YuLjQxMTA2YTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FNUldyaXRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQU1SV3JpdGVyLmNwcApAQCAtMjUsOCArMjUsOCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXJlY29yZGVyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTU0LDcgKzU0LDcgQEAKICAgICByZXR1cm4gbUluaXRDaGVjazsKIH0KIAotc3RhdHVzX3QgQU1SV3JpdGVyOjphZGRTb3VyY2UoY29uc3Qgc3A8SU1lZGlhU291cmNlPiAmc291cmNlKSB7CitzdGF0dXNfdCBBTVJXcml0ZXI6OmFkZFNvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSkgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBtSW5pdENoZWNrOwogICAgIH0KQEAgLTE5Myw3ICsxOTMsNyBAQAogCiAgICAgcHJjdGwoUFJfU0VUX05BTUUsICh1bnNpZ25lZCBsb25nKSJBTVJXcml0ZXIiLCAwLCAwLCAwKTsKICAgICB3aGlsZSAoIW1Eb25lKSB7Ci0gICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXI7CisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyOwogICAgICAgICBlcnIgPSBtU291cmNlLT5yZWFkKCZidWZmZXIpOwogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTIxNSw3ICsyMTUsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBVczsKLSAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZXN0YW1wVXMpKTsKKyAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhX2RhdGEoKS5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lc3RhbXBVcykpOwogICAgICAgICBpZiAodGltZXN0YW1wVXMgPiBtRXN0aW1hdGVkRHVyYXRpb25VcykgewogICAgICAgICAgICAgbUVzdGltYXRlZER1cmF0aW9uVXMgPSB0aW1lc3RhbXBVczsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQVZJRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FWSUV4dHJhY3Rvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNjIxMWUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQVZJRXh0cmFjdG9yLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEzMDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiQVZJRXh0cmFjdG9yIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiaW5jbHVkZS9hdmNfdXRpbHMuaCIKLSNpbmNsdWRlICJpbmNsdWRlL0FWSUV4dHJhY3Rvci5oIgotCi0jaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBBVklFeHRyYWN0b3I6OkFWSVNvdXJjZSA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7Ci0gICAgQVZJU291cmNlKGNvbnN0IHNwPEFWSUV4dHJhY3Rvcj4gJmV4dHJhY3Rvciwgc2l6ZV90IHRyYWNrSW5kZXgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLQotICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkFWSVNvdXJjZSgpOwotCi1wcml2YXRlOgotICAgIHNwPEFWSUV4dHJhY3Rvcj4gbUV4dHJhY3RvcjsKLSAgICBzaXplX3QgbVRyYWNrSW5kZXg7Ci0gICAgY29uc3QgQVZJRXh0cmFjdG9yOjpUcmFjayAmbVRyYWNrOwotICAgIE1lZGlhQnVmZmVyR3JvdXAgKm1CdWZmZXJHcm91cDsKLSAgICBzaXplX3QgbVNhbXBsZUluZGV4OwotCi0gICAgc3A8TVAzU3BsaXR0ZXI+IG1TcGxpdHRlcjsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFWSVNvdXJjZSk7Ci19OwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1zdHJ1Y3QgQVZJRXh0cmFjdG9yOjpNUDNTcGxpdHRlciA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICBNUDNTcGxpdHRlcigpOwotCi0gICAgdm9pZCBjbGVhcigpOwotICAgIHZvaWQgYXBwZW5kKE1lZGlhQnVmZmVyICpidWZmZXIpOwotICAgIHN0YXR1c190IHJlYWQoTWVkaWFCdWZmZXIgKipidWZmZXIpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+TVAzU3BsaXR0ZXIoKTsKLQotcHJpdmF0ZToKLSAgICBib29sIG1GaW5kU3luYzsKLSAgICBpbnQ2NF90IG1CYXNlVGltZVVzOwotICAgIGludDY0X3QgbU51bVNhbXBsZXNSZWFkOwotICAgIHNwPEFCdWZmZXI+IG1CdWZmZXI7Ci0KLSAgICBib29sIHJlc3luYygpOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTVAzU3BsaXR0ZXIpOwotfTsKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotQVZJRXh0cmFjdG9yOjpBVklTb3VyY2U6OkFWSVNvdXJjZSgKLSAgICAgICAgY29uc3Qgc3A8QVZJRXh0cmFjdG9yPiAmZXh0cmFjdG9yLCBzaXplX3QgdHJhY2tJbmRleCkKLSAgICA6IG1FeHRyYWN0b3IoZXh0cmFjdG9yKSwKLSAgICAgIG1UcmFja0luZGV4KHRyYWNrSW5kZXgpLAotICAgICAgbVRyYWNrKG1FeHRyYWN0b3ItPm1UcmFja3MuaXRlbUF0KHRyYWNrSW5kZXgpKSwKLSAgICAgIG1CdWZmZXJHcm91cChOVUxMKSB7Ci19Ci0KLUFWSUV4dHJhY3Rvcjo6QVZJU291cmNlOjp+QVZJU291cmNlKCkgewotICAgIGlmIChtQnVmZmVyR3JvdXApIHsKLSAgICAgICAgc3RvcCgpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgQVZJRXh0cmFjdG9yOjpBVklTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKLSAgICBDSEVDSyghbUJ1ZmZlckdyb3VwKTsKLQotICAgIG1CdWZmZXJHcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwOwotCi0gICAgbUJ1ZmZlckdyb3VwLT5hZGRfYnVmZmVyKG5ldyBNZWRpYUJ1ZmZlcihtVHJhY2subU1heFNhbXBsZVNpemUpKTsKLSAgICBtQnVmZmVyR3JvdXAtPmFkZF9idWZmZXIobmV3IE1lZGlhQnVmZmVyKG1UcmFjay5tTWF4U2FtcGxlU2l6ZSkpOwotICAgIG1TYW1wbGVJbmRleCA9IDA7Ci0KLSAgICBjb25zdCBjaGFyICptaW1lOwotICAgIENIRUNLKG1UcmFjay5tTWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOwotCi0gICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpKSB7Ci0gICAgICAgIG1TcGxpdHRlciA9IG5ldyBNUDNTcGxpdHRlcjsKLSAgICB9IGVsc2UgewotICAgICAgICBtU3BsaXR0ZXIuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEFWSUV4dHJhY3Rvcjo6QVZJU291cmNlOjpzdG9wKCkgewotICAgIENIRUNLKG1CdWZmZXJHcm91cCk7Ci0KLSAgICBkZWxldGUgbUJ1ZmZlckdyb3VwOwotICAgIG1CdWZmZXJHcm91cCA9IE5VTEw7Ci0KLSAgICBtU3BsaXR0ZXIuY2xlYXIoKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3A8TWV0YURhdGE+IEFWSUV4dHJhY3Rvcjo6QVZJU291cmNlOjpnZXRGb3JtYXQoKSB7Ci0gICAgcmV0dXJuIG1UcmFjay5tTWV0YTsKLX0KLQotc3RhdHVzX3QgQVZJRXh0cmFjdG9yOjpBVklTb3VyY2U6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewotICAgIENIRUNLKG1CdWZmZXJHcm91cCk7Ci0KLSAgICAqYnVmZmVyID0gTlVMTDsKLQotICAgIGludDY0X3Qgc2Vla1RpbWVVczsKLSAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgc2Vla01vZGU7Ci0gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmc2Vla01vZGUpKSB7Ci0gICAgICAgIHN0YXR1c190IGVyciA9Ci0gICAgICAgICAgICBtRXh0cmFjdG9yLT5nZXRTYW1wbGVJbmRleEF0VGltZSgKLSAgICAgICAgICAgICAgICAgICAgbVRyYWNrSW5kZXgsIHNlZWtUaW1lVXMsIHNlZWtNb2RlLCAmbVNhbXBsZUluZGV4KTsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtU3BsaXR0ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgbVNwbGl0dGVyLT5jbGVhcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yICg7OykgewotICAgICAgICBpZiAobVNwbGl0dGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1TcGxpdHRlci0+cmVhZChidWZmZXIpOwotCi0gICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGVyciAhPSAtRUFHQUlOKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG9mZjY0X3Qgb2Zmc2V0OwotICAgICAgICBzaXplX3Qgc2l6ZTsKLSAgICAgICAgYm9vbCBpc0tleTsKLSAgICAgICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IG1FeHRyYWN0b3ItPmdldFNhbXBsZUluZm8oCi0gICAgICAgICAgICAgICAgbVRyYWNrSW5kZXgsIG1TYW1wbGVJbmRleCwgJm9mZnNldCwgJnNpemUsICZpc0tleSwgJnRpbWVVcyk7Ci0KLSAgICAgICAgKyttU2FtcGxlSW5kZXg7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07Ci0gICAgICAgIH0KLQotICAgICAgICBNZWRpYUJ1ZmZlciAqb3V0OwotICAgICAgICBDSEVDS19FUShtQnVmZmVyR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZvdXQpLCAoc3RhdHVzX3QpT0spOwotCi0gICAgICAgIHNzaXplX3QgbiA9IG1FeHRyYWN0b3ItPm1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBvdXQtPmRhdGEoKSwgc2l6ZSk7Ci0KLSAgICAgICAgaWYgKG4gPCAoc3NpemVfdClzaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gbiA8IDAgPyAoc3RhdHVzX3QpbiA6IChzdGF0dXNfdClFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBvdXQtPnNldF9yYW5nZSgwLCBzaXplKTsKLQotICAgICAgICBvdXQtPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKLQotICAgICAgICBpZiAoaXNLZXkpIHsKLSAgICAgICAgICAgIG91dC0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVNwbGl0dGVyID09IE5VTEwpIHsKLSAgICAgICAgICAgICpidWZmZXIgPSBvdXQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIG1TcGxpdHRlci0+YXBwZW5kKG91dCk7Ci0gICAgICAgIG91dC0+cmVsZWFzZSgpOwotICAgICAgICBvdXQgPSBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotQVZJRXh0cmFjdG9yOjpNUDNTcGxpdHRlcjo6TVAzU3BsaXR0ZXIoKQotICAgIDogbUZpbmRTeW5jKHRydWUpLAotICAgICAgbUJhc2VUaW1lVXMoLTFsbCksCi0gICAgICBtTnVtU2FtcGxlc1JlYWQoMCkgewotfQotCi1BVklFeHRyYWN0b3I6Ok1QM1NwbGl0dGVyOjp+TVAzU3BsaXR0ZXIoKSB7Ci19Ci0KLXZvaWQgQVZJRXh0cmFjdG9yOjpNUDNTcGxpdHRlcjo6Y2xlYXIoKSB7Ci0gICAgbUZpbmRTeW5jID0gdHJ1ZTsKLSAgICBtQmFzZVRpbWVVcyA9IC0xbGw7Ci0gICAgbU51bVNhbXBsZXNSZWFkID0gMDsKLQotICAgIGlmIChtQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7Ci0gICAgfQotfQotCi12b2lkIEFWSUV4dHJhY3Rvcjo6TVAzU3BsaXR0ZXI6OmFwcGVuZChNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7Ci0gICAgc2l6ZV90IHByZXZDYXBhY2l0eSA9IChtQnVmZmVyICE9IE5VTEwpID8gbUJ1ZmZlci0+Y2FwYWNpdHkoKSA6IDA7Ci0KLSAgICBpZiAobUJhc2VUaW1lVXMgPCAwKSB7Ci0gICAgICAgIENIRUNLKG1CdWZmZXIgPT0gTlVMTCB8fCBtQnVmZmVyLT5zaXplKCkgPT0gMCk7Ci0gICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJm1CYXNlVGltZVVzKSk7Ci0gICAgICAgIG1OdW1TYW1wbGVzUmVhZCA9IDA7Ci0gICAgfQotCi0gICAgaWYgKG1CdWZmZXIgIT0gTlVMTCAmJiBtQnVmZmVyLT5vZmZzZXQoKSA+IDApIHsKLSAgICAgICAgbWVtbW92ZShtQnVmZmVyLT5iYXNlKCksIG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+c2l6ZSgpKTsKLSAgICAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgbUJ1ZmZlci0+c2l6ZSgpKTsKLSAgICB9Ci0KLSAgICBpZiAobUJ1ZmZlciA9PSBOVUxMCi0gICAgICAgICAgICB8fCBtQnVmZmVyLT5zaXplKCkgKyBidWZmZXItPnJhbmdlX2xlbmd0aCgpID4gcHJldkNhcGFjaXR5KSB7Ci0gICAgICAgIHNpemVfdCBuZXdDYXBhY2l0eSA9Ci0gICAgICAgICAgICAocHJldkNhcGFjaXR5ICsgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSArIDEwMjMpICYgfjEwMjM7Ci0KLSAgICAgICAgc3A8QUJ1ZmZlcj4gbmV3QnVmZmVyID0gbmV3IEFCdWZmZXIobmV3Q2FwYWNpdHkpOwotICAgICAgICBpZiAobUJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtZW1jcHkobmV3QnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+c2l6ZSgpKTsKLSAgICAgICAgICAgIG5ld0J1ZmZlci0+c2V0UmFuZ2UoMCwgbUJ1ZmZlci0+c2l6ZSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5ld0J1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUJ1ZmZlciA9IG5ld0J1ZmZlcjsKLSAgICB9Ci0KLSAgICBtZW1jcHkobUJ1ZmZlci0+ZGF0YSgpICsgbUJ1ZmZlci0+c2l6ZSgpLAotICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKLSAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7Ci0KLSAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCBtQnVmZmVyLT5zaXplKCkgKyBidWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKLX0KLQotYm9vbCBBVklFeHRyYWN0b3I6Ok1QM1NwbGl0dGVyOjpyZXN5bmMoKSB7Ci0gICAgaWYgKG1CdWZmZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgYm9vbCBmb3VuZFN5bmMgPSBmYWxzZTsKLSAgICBmb3IgKHNpemVfdCBvZmZzZXQgPSAwOyBvZmZzZXQgKyAzIDwgbUJ1ZmZlci0+c2l6ZSgpOyArK29mZnNldCkgewotICAgICAgICB1aW50MzJfdCBmaXJzdEhlYWRlciA9IFUzMl9BVChtQnVmZmVyLT5kYXRhKCkgKyBvZmZzZXQpOwotCi0gICAgICAgIHNpemVfdCBmcmFtZVNpemU7Ci0gICAgICAgIGlmICghR2V0TVBFR0F1ZGlvRnJhbWVTaXplKGZpcnN0SGVhZGVyLCAmZnJhbWVTaXplKSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBzaXplX3Qgc3Vic2VxdWVudE9mZnNldCA9IG9mZnNldCArIGZyYW1lU2l6ZTsKLSAgICAgICAgc2l6ZV90IGkgPSAzOwotICAgICAgICB3aGlsZSAoaSA+IDApIHsKLSAgICAgICAgICAgIGlmIChzdWJzZXF1ZW50T2Zmc2V0ICsgMyA+PSBtQnVmZmVyLT5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNYXNrID0gMHhmZmZlMGMwMDsKLQotICAgICAgICAgICAgdWludDMyX3QgaGVhZGVyID0gVTMyX0FUKG1CdWZmZXItPmRhdGEoKSArIHN1YnNlcXVlbnRPZmZzZXQpOwotICAgICAgICAgICAgaWYgKChoZWFkZXIgJiBrTWFzaykgIT0gKGZpcnN0SGVhZGVyICYga01hc2spKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghR2V0TVBFR0F1ZGlvRnJhbWVTaXplKGhlYWRlciwgJmZyYW1lU2l6ZSkpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3Vic2VxdWVudE9mZnNldCArPSBmcmFtZVNpemU7Ci0gICAgICAgICAgICAtLWk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaSA9PSAwKSB7Ci0gICAgICAgICAgICBmb3VuZFN5bmMgPSB0cnVlOwotICAgICAgICAgICAgbWVtbW92ZShtQnVmZmVyLT5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPmRhdGEoKSArIG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+c2l6ZSgpIC0gb2Zmc2V0KTsKLQotICAgICAgICAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgbUJ1ZmZlci0+c2l6ZSgpIC0gb2Zmc2V0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGZvdW5kU3luYzsKLX0KLQotc3RhdHVzX3QgQVZJRXh0cmFjdG9yOjpNUDNTcGxpdHRlcjo6cmVhZChNZWRpYUJ1ZmZlciAqKm91dCkgewotICAgICpvdXQgPSBOVUxMOwotCi0gICAgaWYgKG1GaW5kU3luYykgewotICAgICAgICBpZiAoIXJlc3luYygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVBR0FJTjsKLSAgICAgICAgfQotCi0gICAgICAgIG1GaW5kU3luYyA9IGZhbHNlOwotICAgIH0KLQotICAgIGlmIChtQnVmZmVyLT5zaXplKCkgPCA0KSB7Ci0gICAgICAgIHJldHVybiAtRUFHQUlOOwotICAgIH0KLQotICAgIHVpbnQzMl90IGhlYWRlciA9IFUzMl9BVChtQnVmZmVyLT5kYXRhKCkpOwotICAgIHNpemVfdCBmcmFtZVNpemU7Ci0gICAgaW50IHNhbXBsZVJhdGU7Ci0gICAgaW50IG51bVNhbXBsZXM7Ci0gICAgaWYgKCFHZXRNUEVHQXVkaW9GcmFtZVNpemUoCi0gICAgICAgICAgICAgICAgaGVhZGVyLCAmZnJhbWVTaXplLCAmc2FtcGxlUmF0ZSwgTlVMTCwgTlVMTCwgJm51bVNhbXBsZXMpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgaWYgKG1CdWZmZXItPnNpemUoKSA8IGZyYW1lU2l6ZSkgewotICAgICAgICByZXR1cm4gLUVBR0FJTjsKLSAgICB9Ci0KLSAgICBNZWRpYUJ1ZmZlciAqbWJ1ZiA9IG5ldyBNZWRpYUJ1ZmZlcihmcmFtZVNpemUpOwotICAgIG1lbWNweShtYnVmLT5kYXRhKCksIG1CdWZmZXItPmRhdGEoKSwgZnJhbWVTaXplKTsKLQotICAgIGludDY0X3QgdGltZVVzID0gbUJhc2VUaW1lVXMgKyAobU51bVNhbXBsZXNSZWFkICogMTAwMDAwMGxsKSAvIHNhbXBsZVJhdGU7Ci0gICAgbU51bVNhbXBsZXNSZWFkICs9IG51bVNhbXBsZXM7Ci0KLSAgICBtYnVmLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7Ci0KLSAgICBtQnVmZmVyLT5zZXRSYW5nZSgKLSAgICAgICAgICAgIG1CdWZmZXItPm9mZnNldCgpICsgZnJhbWVTaXplLCBtQnVmZmVyLT5zaXplKCkgLSBmcmFtZVNpemUpOwotCi0gICAgKm91dCA9IG1idWY7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLUFWSUV4dHJhY3Rvcjo6QVZJRXh0cmFjdG9yKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZkYXRhU291cmNlKQotICAgIDogbURhdGFTb3VyY2UoZGF0YVNvdXJjZSkgewotICAgIG1Jbml0Q2hlY2sgPSBwYXJzZUhlYWRlcnMoKTsKLQotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIG1UcmFja3MuY2xlYXIoKTsKLSAgICB9Ci19Ci0KLUFWSUV4dHJhY3Rvcjo6fkFWSUV4dHJhY3RvcigpIHsKLX0KLQotc2l6ZV90IEFWSUV4dHJhY3Rvcjo6Y291bnRUcmFja3MoKSB7Ci0gICAgcmV0dXJuIG1UcmFja3Muc2l6ZSgpOwotfQotCi1zcDxNZWRpYVNvdXJjZT4gQVZJRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKLSAgICByZXR1cm4gaW5kZXggPCBtVHJhY2tzLnNpemUoKSA/IG5ldyBBVklTb3VyY2UodGhpcywgaW5kZXgpIDogTlVMTDsKLX0KLQotc3A8TWV0YURhdGE+IEFWSUV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncykgewotICAgIHJldHVybiBpbmRleCA8IG1UcmFja3Muc2l6ZSgpID8gbVRyYWNrcy5lZGl0SXRlbUF0KGluZGV4KS5tTWV0YSA6IE5VTEw7Ci19Ci0KLXNwPE1ldGFEYXRhPiBBVklFeHRyYWN0b3I6OmdldE1ldGFEYXRhKCkgewotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOwotCi0gICAgaWYgKG1Jbml0Q2hlY2sgPT0gT0spIHsKLSAgICAgICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9BVkkpOwotICAgIH0KLQotICAgIHJldHVybiBtZXRhOwotfQotCi1zdGF0dXNfdCBBVklFeHRyYWN0b3I6OnBhcnNlSGVhZGVycygpIHsKLSAgICBtVHJhY2tzLmNsZWFyKCk7Ci0gICAgbU1vdmllT2Zmc2V0ID0gMDsKLSAgICBtRm91bmRJbmRleCA9IGZhbHNlOwotICAgIG1PZmZzZXRzQXJlQWJzb2x1dGUgPSBmYWxzZTsKLQotICAgIHNzaXplX3QgcmVzID0gcGFyc2VDaHVuaygwbGwsIC0xbGwpOwotCi0gICAgaWYgKHJlcyA8IDApIHsKLSAgICAgICAgcmV0dXJuIChzdGF0dXNfdClyZXM7Ci0gICAgfQotCi0gICAgaWYgKG1Nb3ZpZU9mZnNldCA9PSAwbGwgfHwgIW1Gb3VuZEluZGV4KSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zc2l6ZV90IEFWSUV4dHJhY3Rvcjo6cGFyc2VDaHVuayhvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBzaXplLCBpbnQgZGVwdGgpIHsKLSAgICBpZiAoc2l6ZSA+PSAwICYmIHNpemUgPCA4KSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgdWludDhfdCB0bXBbMTJdOwotICAgIHNzaXplX3QgbiA9IG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCB0bXAsIDgpOwotCi0gICAgaWYgKG4gPCA4KSB7Ci0gICAgICAgIHJldHVybiAobiA8IDApID8gbiA6IChzc2l6ZV90KUVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBmb3VyY2MgPSBVMzJfQVQodG1wKTsKLSAgICB1aW50MzJfdCBjaHVua1NpemUgPSBVMzJMRV9BVCgmdG1wWzRdKTsKLQotICAgIGlmIChzaXplID49IDAgJiYgY2h1bmtTaXplICsgOCA+IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgY29uc3QgY2hhciBrUHJlZml4W10gPSAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjsKLSAgICBjb25zdCBjaGFyICpwcmVmaXggPSAma1ByZWZpeFtzdHJsZW4oa1ByZWZpeCkgLSAyICogZGVwdGhdOwotCi0gICAgaWYgKGZvdXJjYyA9PSBGT1VSQ0MoJ0wnLCAnSScsICdTJywgJ1QnKQotICAgICAgICAgICAgfHwgZm91cmNjID09IEZPVVJDQygnUicsICdJJywgJ0YnLCAnRicpKSB7Ci0gICAgICAgIC8vIEl0J3MgYSBsaXN0IG9mIGNodW5rcwotCi0gICAgICAgIGlmIChzaXplID49IDAgJiYgc2l6ZSA8IDEyKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgbiA9IG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0ICsgOCwgJnRtcFs4XSwgNCk7Ci0KLSAgICAgICAgaWYgKG4gPCA0KSB7Ci0gICAgICAgICAgICByZXR1cm4gKG4gPCAwKSA/IG4gOiAoc3NpemVfdClFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICB1aW50MzJfdCBzdWJGb3VyY2MgPSBVMzJfQVQoJnRtcFs4XSk7Ci0KLSAgICAgICAgQUxPR1YoIiVzIG9mZnNldCAweCUwOGxseCBMSVNUIG9mICclYyVjJWMlYycsIHNpemUgJWQiLAotICAgICAgICAgICAgIHByZWZpeCwKLSAgICAgICAgICAgICBvZmZzZXQsCi0gICAgICAgICAgICAgKGNoYXIpKHN1YkZvdXJjYyA+PiAyNCksCi0gICAgICAgICAgICAgKGNoYXIpKChzdWJGb3VyY2MgPj4gMTYpICYgMHhmZiksCi0gICAgICAgICAgICAgKGNoYXIpKChzdWJGb3VyY2MgPj4gOCkgJiAweGZmKSwKLSAgICAgICAgICAgICAoY2hhcikoc3ViRm91cmNjICYgMHhmZiksCi0gICAgICAgICAgICAgY2h1bmtTaXplIC0gNCk7Ci0KLSAgICAgICAgaWYgKHN1YkZvdXJjYyA9PSBGT1VSQ0MoJ20nLCAnbycsICd2JywgJ2knKSkgewotICAgICAgICAgICAgLy8gV2UncmUgbm90IGdvaW5nIHRvIHBhcnNlIHRoaXMsIGJ1dCB3aWxsIHRha2Ugbm90ZSBvZiB0aGUKLSAgICAgICAgICAgIC8vIG9mZnNldC4KLQotICAgICAgICAgICAgbU1vdmllT2Zmc2V0ID0gb2Zmc2V0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb2ZmNjRfdCBzdWJPZmZzZXQgPSBvZmZzZXQgKyAxMjsKLSAgICAgICAgICAgIG9mZjY0X3Qgc3ViT2Zmc2V0TGltaXQgPSBzdWJPZmZzZXQgKyBjaHVua1NpemUgLSA0OwotICAgICAgICAgICAgd2hpbGUgKHN1Yk9mZnNldCA8IHN1Yk9mZnNldExpbWl0KSB7Ci0gICAgICAgICAgICAgICAgc3NpemVfdCByZXMgPQotICAgICAgICAgICAgICAgICAgICBwYXJzZUNodW5rKHN1Yk9mZnNldCwgc3ViT2Zmc2V0TGltaXQgLSBzdWJPZmZzZXQsIGRlcHRoICsgMSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVzIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHN1Yk9mZnNldCArPSByZXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiJXMgb2Zmc2V0IDB4JTA4bGx4IENIVU5LICclYyVjJWMlYyciLAotICAgICAgICAgICAgIHByZWZpeCwKLSAgICAgICAgICAgICBvZmZzZXQsCi0gICAgICAgICAgICAgKGNoYXIpKGZvdXJjYyA+PiAyNCksCi0gICAgICAgICAgICAgKGNoYXIpKChmb3VyY2MgPj4gMTYpICYgMHhmZiksCi0gICAgICAgICAgICAgKGNoYXIpKChmb3VyY2MgPj4gOCkgJiAweGZmKSwKLSAgICAgICAgICAgICAoY2hhcikoZm91cmNjICYgMHhmZikpOwotCi0gICAgICAgIHN0YXR1c190IGVyciA9IE9LOwotCi0gICAgICAgIHN3aXRjaCAoZm91cmNjKSB7Ci0gICAgICAgICAgICBjYXNlIEZPVVJDQygncycsICd0JywgJ3InLCAnaCcpOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IHBhcnNlU3RyZWFtSGVhZGVyKG9mZnNldCArIDgsIGNodW5rU2l6ZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ3QnLCAncicsICdmJyk6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gcGFyc2VTdHJlYW1Gb3JtYXQob2Zmc2V0ICsgOCwgY2h1bmtTaXplKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAnZCcsICd4JywgJzEnKToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBwYXJzZUluZGV4KG9mZnNldCArIDgsIGNodW5rU2l6ZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGNodW5rU2l6ZSAmIDEpIHsKLSAgICAgICAgKytjaHVua1NpemU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGNodW5rU2l6ZSArIDg7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpHZXRNSU1FVHlwZUZvckhhbmRsZXIodWludDMyX3QgaGFuZGxlcikgewotICAgIHN3aXRjaCAoaGFuZGxlcikgewotICAgICAgICAvLyBXb3cuLi4gc2hhbWVsZXNzbHkgY29waWVkIGZyb20KLSAgICAgICAgLy8gaHR0cDovL3dpa2kubXVsdGltZWRpYS5jeC9pbmRleC5waHA/dGl0bGU9SVNPX01QRUctNAotCi0gICAgICAgIGNhc2UgRk9VUkNDKCczJywgJ0knLCAnVicsICcyJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCczJywgJ2knLCAndicsICcyJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdCJywgJ0wnLCAnWicsICcwJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdEJywgJ0knLCAnRycsICdJJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdEJywgJ0knLCAnVicsICcxJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdkJywgJ2knLCAndicsICcxJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdEJywgJ0knLCAnVicsICdYJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdkJywgJ2knLCAndicsICd4Jyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdEJywgJ1gnLCAnNScsICcwJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdkJywgJ3gnLCAnNScsICcwJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdEJywgJ1gnLCAnRycsICdNJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdFJywgJ00nLCAnNCcsICdBJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdFJywgJ1AnLCAnSCcsICdWJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdGJywgJ00nLCAnUCcsICc0Jyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdmJywgJ20nLCAncCcsICc0Jyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdGJywgJ1YnLCAnRicsICdXJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdIJywgJ0QnLCAnWCcsICc0Jyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdoJywgJ2QnLCAneCcsICc0Jyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdNJywgJzQnLCAnQycsICdDJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdNJywgJzQnLCAnUycsICcyJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJzQnLCAncycsICcyJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdNJywgJ1AnLCAnNCcsICdTJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ3AnLCAnNCcsICdzJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdNJywgJ1AnLCAnNCcsICdWJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ3AnLCAnNCcsICd2Jyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdNJywgJ1YnLCAnWCcsICdNJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdSJywgJ00nLCAnUCcsICc0Jyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdTJywgJ0UnLCAnRCcsICdHJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdTJywgJ00nLCAnUCcsICc0Jyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdVJywgJ00nLCAnUCcsICc0Jyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdXJywgJ1YnLCAnMScsICdGJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdYJywgJ1YnLCAnSScsICdEJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdYJywgJ3YnLCAnaScsICdEJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCd4JywgJ3YnLCAnaScsICdkJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdYJywgJ1YnLCAnSScsICdYJyk6Ci0gICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQ7Ci0KLSAgICAgICAgLy8gZnJvbSBodHRwOi8vd2lraS5tdWx0aW1lZGlhLmN4L2luZGV4LnBocD90aXRsZT1IMjY0Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdhJywgJ3YnLCAnYycsICcxJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdkJywgJ2EnLCAndicsICdjJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCd4JywgJzInLCAnNicsICc0Jyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdIJywgJzInLCAnNicsICc0Jyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCd2JywgJ3MnLCAncycsICdoJyk6Ci0gICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfVklERU9fQVZDOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEFWSUV4dHJhY3Rvcjo6cGFyc2VTdHJlYW1IZWFkZXIob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKHNpemUgIT0gNTYpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBpZiAobVRyYWNrcy5zaXplKCkgPiA5OSkgewotICAgICAgICByZXR1cm4gLUVSQU5HRTsKLSAgICB9Ci0KLSAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcihzaXplKTsKLSAgICBzc2l6ZV90IG4gPSBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKLQotICAgIGlmIChuIDwgKHNzaXplX3Qpc2l6ZSkgewotICAgICAgICByZXR1cm4gbiA8IDAgPyAoc3RhdHVzX3QpbiA6IEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBjb25zdCB1aW50OF90ICpkYXRhID0gYnVmZmVyLT5kYXRhKCk7Ci0KLSAgICB1aW50MzJfdCB0eXBlID0gVTMyX0FUKGRhdGEpOwotICAgIHVpbnQzMl90IGhhbmRsZXIgPSBVMzJfQVQoJmRhdGFbNF0pOwotICAgIHVpbnQzMl90IGZsYWdzID0gVTMyTEVfQVQoJmRhdGFbOF0pOwotCi0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7Ci0KLSAgICB1aW50MzJfdCByYXRlID0gVTMyTEVfQVQoJmRhdGFbMjBdKTsKLSAgICB1aW50MzJfdCBzY2FsZSA9IFUzMkxFX0FUKCZkYXRhWzI0XSk7Ci0KLSAgICB1aW50MzJfdCBzYW1wbGVTaXplID0gVTMyTEVfQVQoJmRhdGFbNDRdKTsKLQotICAgIGNvbnN0IGNoYXIgKm1pbWUgPSBOVUxMOwotICAgIFRyYWNrOjpLaW5kIGtpbmQgPSBUcmFjazo6T1RIRVI7Ci0KLSAgICBpZiAodHlwZSA9PSBGT1VSQ0MoJ3YnLCAnaScsICdkJywgJ3MnKSkgewotICAgICAgICBtaW1lID0gR2V0TUlNRVR5cGVGb3JIYW5kbGVyKGhhbmRsZXIpOwotCi0gICAgICAgIGlmIChtaW1lICYmIHN0cm5jYXNlY21wKG1pbWUsICJ2aWRlby8iLCA2KSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtaW1lID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dXKCJVbnN1cHBvcnRlZCB2aWRlbyBmb3JtYXQgJyVjJWMlYyVjJyIsCi0gICAgICAgICAgICAgICAgIChjaGFyKShoYW5kbGVyID4+IDI0KSwKLSAgICAgICAgICAgICAgICAgKGNoYXIpKChoYW5kbGVyID4+IDE2KSAmIDB4ZmYpLAotICAgICAgICAgICAgICAgICAoY2hhcikoKGhhbmRsZXIgPj4gOCkgJiAweGZmKSwKLSAgICAgICAgICAgICAgICAgKGNoYXIpKGhhbmRsZXIgJiAweGZmKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBraW5kID0gVHJhY2s6OlZJREVPOwotICAgIH0gZWxzZSBpZiAodHlwZSA9PSBGT1VSQ0MoJ2EnLCAndScsICdkJywgJ3MnKSkgewotICAgICAgICBpZiAobWltZSAmJiBzdHJuY2FzZWNtcChtaW1lLCAiYXVkaW8vIiwgNikpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBraW5kID0gVHJhY2s6OkFVRElPOwotICAgIH0KLQotICAgIGlmICghbWltZSkgewotICAgICAgICBtaW1lID0gImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSI7Ci0gICAgfQotCi0gICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIG1pbWUpOwotCi0gICAgbVRyYWNrcy5wdXNoKCk7Ci0gICAgVHJhY2sgKnRyYWNrID0gJm1UcmFja3MuZWRpdEl0ZW1BdChtVHJhY2tzLnNpemUoKSAtIDEpOwotCi0gICAgdHJhY2stPm1NZXRhID0gbWV0YTsKLSAgICB0cmFjay0+bVJhdGUgPSByYXRlOwotICAgIHRyYWNrLT5tU2NhbGUgPSBzY2FsZTsKLSAgICB0cmFjay0+bUJ5dGVzUGVyU2FtcGxlID0gc2FtcGxlU2l6ZTsKLSAgICB0cmFjay0+bUtpbmQgPSBraW5kOwotICAgIHRyYWNrLT5tTnVtU3luY1NhbXBsZXMgPSAwOwotICAgIHRyYWNrLT5tVGh1bWJuYWlsU2FtcGxlU2l6ZSA9IDA7Ci0gICAgdHJhY2stPm1UaHVtYm5haWxTYW1wbGVJbmRleCA9IC0xOwotICAgIHRyYWNrLT5tTWF4U2FtcGxlU2l6ZSA9IDA7Ci0gICAgdHJhY2stPm1BdmdDaHVua1NpemUgPSAxLjA7Ci0gICAgdHJhY2stPm1GaXJzdENodW5rU2l6ZSA9IDA7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEFWSUV4dHJhY3Rvcjo6cGFyc2VTdHJlYW1Gb3JtYXQob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKG1UcmFja3MuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgVHJhY2sgKnRyYWNrID0gJm1UcmFja3MuZWRpdEl0ZW1BdChtVHJhY2tzLnNpemUoKSAtIDEpOwotCi0gICAgaWYgKHRyYWNrLT5tS2luZCA9PSBUcmFjazo6T1RIRVIpIHsKLSAgICAgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCB0aGlzIGNvbnRlbnQsIGJ1dCB0aGF0J3Mgbm90IGEgcGFyc2luZyBlcnJvci4KLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIGJvb2wgaXNWaWRlbyA9ICh0cmFjay0+bUtpbmQgPT0gVHJhY2s6OlZJREVPKTsKLQotICAgIGlmICgoaXNWaWRlbyAmJiBzaXplIDwgNDApIHx8ICghaXNWaWRlbyAmJiBzaXplIDwgMTYpKSB7Ci0gICAgICAgIC8vIEV4cGVjdGVkIGEgQklUTUFQSU5GTyBvciBXQVZFRk9STUFUKEVYKSBzdHJ1Y3R1cmUsIHJlc3BlY3RpdmVseS4KLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcihzaXplKTsKLSAgICBzc2l6ZV90IG4gPSBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKLQotICAgIGlmIChuIDwgKHNzaXplX3Qpc2l6ZSkgewotICAgICAgICByZXR1cm4gbiA8IDAgPyAoc3RhdHVzX3QpbiA6IEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBjb25zdCB1aW50OF90ICpkYXRhID0gYnVmZmVyLT5kYXRhKCk7Ci0KLSAgICBpZiAoaXNWaWRlbykgewotICAgICAgICB1aW50MzJfdCB3aWR0aCA9IFUzMkxFX0FUKCZkYXRhWzRdKTsKLSAgICAgICAgdWludDMyX3QgaGVpZ2h0ID0gVTMyTEVfQVQoJmRhdGFbOF0pOwotCi0gICAgICAgIHRyYWNrLT5tTWV0YS0+c2V0SW50MzIoa0tleVdpZHRoLCB3aWR0aCk7Ci0gICAgICAgIHRyYWNrLT5tTWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKLSAgICB9IGVsc2UgewotICAgICAgICB1aW50MzJfdCBmb3JtYXQgPSBVMTZMRV9BVChkYXRhKTsKLQotICAgICAgICBpZiAoZm9ybWF0ID09IDB4NTUpIHsKLSAgICAgICAgICAgIHRyYWNrLT5tTWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1coIlVuc3VwcG9ydGVkIGF1ZGlvIGZvcm1hdCA9IDB4JTA0eCIsIGZvcm1hdCk7Ci0gICAgICAgIH0KLQotICAgICAgICB1aW50MzJfdCBudW1DaGFubmVscyA9IFUxNkxFX0FUKCZkYXRhWzJdKTsKLSAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IFUzMkxFX0FUKCZkYXRhWzRdKTsKLQotICAgICAgICB0cmFjay0+bU1ldGEtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG51bUNoYW5uZWxzKTsKLSAgICAgICAgdHJhY2stPm1NZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi0vLyBzdGF0aWMKLWJvb2wgQVZJRXh0cmFjdG9yOjpJc0NvcnJlY3RDaHVua1R5cGUoCi0gICAgICAgIHNzaXplX3QgdHJhY2tJbmRleCwgVHJhY2s6OktpbmQga2luZCwgdWludDMyX3QgY2h1bmtUeXBlKSB7Ci0gICAgdWludDMyX3QgY2h1bmtCYXNlID0gY2h1bmtUeXBlICYgMHhmZmZmOwotCi0gICAgc3dpdGNoIChraW5kKSB7Ci0gICAgICAgIGNhc2UgVHJhY2s6OlZJREVPOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY2h1bmtCYXNlICE9IEZPVVJDQygwLCAwLCAnZCcsICdjJykKLSAgICAgICAgICAgICAgICAgICAgJiYgY2h1bmtCYXNlICE9IEZPVVJDQygwLCAwLCAnZCcsICdiJykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgVHJhY2s6OkFVRElPOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY2h1bmtCYXNlICE9IEZPVVJDQygwLCAwLCAndycsICdiJykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAodHJhY2tJbmRleCA8IDApIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgdWludDhfdCBoaSA9IGNodW5rVHlwZSA+PiAyNDsKLSAgICB1aW50OF90IGxvID0gKGNodW5rVHlwZSA+PiAxNikgJiAweGZmOwotCi0gICAgaWYgKGhpIDwgJzAnIHx8IGhpID4gJzknIHx8IGxvIDwgJzAnIHx8IGxvID4gJzknKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAodHJhY2tJbmRleCAhPSAoMTAgKiAoaGkgLSAnMCcpICsgKGxvIC0gJzAnKSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1zdGF0dXNfdCBBVklFeHRyYWN0b3I6OnBhcnNlSW5kZXgob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKChzaXplICUgMTYpICE9IDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcihzaXplKTsKLSAgICBzc2l6ZV90IG4gPSBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKLQotICAgIGlmIChuIDwgKHNzaXplX3Qpc2l6ZSkgewotICAgICAgICByZXR1cm4gbiA8IDAgPyAoc3RhdHVzX3QpbiA6IEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBjb25zdCB1aW50OF90ICpkYXRhID0gYnVmZmVyLT5kYXRhKCk7Ci0KLSAgICB3aGlsZSAoc2l6ZSA+IDApIHsKLSAgICAgICAgdWludDMyX3QgY2h1bmtUeXBlID0gVTMyX0FUKGRhdGEpOwotCi0gICAgICAgIHVpbnQ4X3QgaGkgPSBjaHVua1R5cGUgPj4gMjQ7Ci0gICAgICAgIHVpbnQ4X3QgbG8gPSAoY2h1bmtUeXBlID4+IDE2KSAmIDB4ZmY7Ci0KLSAgICAgICAgaWYgKGhpIDwgJzAnIHx8IGhpID4gJzknIHx8IGxvIDwgJzAnIHx8IGxvID4gJzknKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgc2l6ZV90IHRyYWNrSW5kZXggPSAxMCAqIChoaSAtICcwJykgKyAobG8gLSAnMCcpOwotCi0gICAgICAgIGlmICh0cmFja0luZGV4ID49IG1UcmFja3Muc2l6ZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgVHJhY2sgKnRyYWNrID0gJm1UcmFja3MuZWRpdEl0ZW1BdCh0cmFja0luZGV4KTsKLQotICAgICAgICBpZiAoIUlzQ29ycmVjdENodW5rVHlwZSgtMSwgdHJhY2stPm1LaW5kLCBjaHVua1R5cGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHRyYWNrLT5tS2luZCA9PSBUcmFjazo6T1RIRVIpIHsKLSAgICAgICAgICAgIGRhdGEgKz0gMTY7Ci0gICAgICAgICAgICBzaXplIC09IDE2OwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICB1aW50MzJfdCBmbGFncyA9IFUzMkxFX0FUKCZkYXRhWzRdKTsKLSAgICAgICAgdWludDMyX3Qgb2Zmc2V0ID0gVTMyTEVfQVQoJmRhdGFbOF0pOwotICAgICAgICB1aW50MzJfdCBjaHVua1NpemUgPSBVMzJMRV9BVCgmZGF0YVsxMl0pOwotCi0gICAgICAgIGlmIChjaHVua1NpemUgPiB0cmFjay0+bU1heFNhbXBsZVNpemUpIHsKLSAgICAgICAgICAgIHRyYWNrLT5tTWF4U2FtcGxlU2l6ZSA9IGNodW5rU2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyYWNrLT5tU2FtcGxlcy5wdXNoKCk7Ci0KLSAgICAgICAgU2FtcGxlSW5mbyAqaW5mbyA9Ci0gICAgICAgICAgICAmdHJhY2stPm1TYW1wbGVzLmVkaXRJdGVtQXQodHJhY2stPm1TYW1wbGVzLnNpemUoKSAtIDEpOwotCi0gICAgICAgIGluZm8tPm1PZmZzZXQgPSBvZmZzZXQ7Ci0gICAgICAgIGluZm8tPm1Jc0tleSA9IChmbGFncyAmIDB4MTApICE9IDA7Ci0KLSAgICAgICAgaWYgKGluZm8tPm1Jc0tleSkgewotICAgICAgICAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4TnVtU3luY1NhbXBsZXNUb1NjYW4gPSAyMDsKLQotICAgICAgICAgICAgaWYgKHRyYWNrLT5tTnVtU3luY1NhbXBsZXMgPCBrTWF4TnVtU3luY1NhbXBsZXNUb1NjYW4pIHsKLSAgICAgICAgICAgICAgICBpZiAoY2h1bmtTaXplID4gdHJhY2stPm1UaHVtYm5haWxTYW1wbGVTaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tVGh1bWJuYWlsU2FtcGxlU2l6ZSA9IGNodW5rU2l6ZTsKLQotICAgICAgICAgICAgICAgICAgICB0cmFjay0+bVRodW1ibmFpbFNhbXBsZUluZGV4ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tU2FtcGxlcy5zaXplKCkgLSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgKyt0cmFjay0+bU51bVN5bmNTYW1wbGVzOwotICAgICAgICB9Ci0KLSAgICAgICAgZGF0YSArPSAxNjsKLSAgICAgICAgc2l6ZSAtPSAxNjsKLSAgICB9Ci0KLSAgICBpZiAoIW1UcmFja3MuaXNFbXB0eSgpKSB7Ci0gICAgICAgIG9mZjY0X3Qgb2Zmc2V0OwotICAgICAgICBzaXplX3Qgc2l6ZTsKLSAgICAgICAgYm9vbCBpc0tleTsKLSAgICAgICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IGdldFNhbXBsZUluZm8oMCwgMCwgJm9mZnNldCwgJnNpemUsICZpc0tleSwgJnRpbWVVcyk7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgbU9mZnNldHNBcmVBYnNvbHV0ZSA9ICFtT2Zmc2V0c0FyZUFic29sdXRlOwotICAgICAgICAgICAgZXJyID0gZ2V0U2FtcGxlSW5mbygwLCAwLCAmb2Zmc2V0LCAmc2l6ZSwgJmlzS2V5LCAmdGltZVVzKTsKLQotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBBTE9HVigiQ2h1bmsgb2Zmc2V0cyBhcmUgJXMiLAotICAgICAgICAgICAgIG1PZmZzZXRzQXJlQWJzb2x1dGUgPyAiYWJzb2x1dGUiIDogIm1vdmllLWNodW5rIHJlbGF0aXZlIik7Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIFRyYWNrICp0cmFjayA9ICZtVHJhY2tzLmVkaXRJdGVtQXQoaSk7Ci0KLSAgICAgICAgaWYgKHRyYWNrLT5tQnl0ZXNQZXJTYW1wbGUgPiAwKSB7Ci0gICAgICAgICAgICAvLyBBc3N1bWUgYWxsIGNodW5rcyBhcmUgcm91Z2hseSB0aGUgc2FtZSBzaXplIGZvciBub3cuCi0KLSAgICAgICAgICAgIC8vIENvbXB1dGUgdGhlIGF2Zy4gc2l6ZSBvZiB0aGUgZmlyc3QgMTI4IGNodW5rcyAoaWYgdGhlcmUgYXJlCi0gICAgICAgICAgICAvLyB0aGF0IG1hbnkpLCBidXQgZXhjbHVkZSB0aGUgc2l6ZSBvZiB0aGUgZmlyc3Qgb25lLCBzaW5jZQotICAgICAgICAgICAgLy8gaXQgbWF5IGJlIGFuIG91dGxpZXIuCi0gICAgICAgICAgICBzaXplX3QgbnVtU2FtcGxlc1RvQXZlcmFnZSA9IHRyYWNrLT5tU2FtcGxlcy5zaXplKCk7Ci0gICAgICAgICAgICBpZiAobnVtU2FtcGxlc1RvQXZlcmFnZSA+IDI1NikgewotICAgICAgICAgICAgICAgIG51bVNhbXBsZXNUb0F2ZXJhZ2UgPSAyNTY7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRvdWJsZSBhdmdDaHVua1NpemUgPSAwOwotICAgICAgICAgICAgc2l6ZV90IGo7Ci0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDw9IG51bVNhbXBsZXNUb0F2ZXJhZ2U7ICsraikgewotICAgICAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0OwotICAgICAgICAgICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICAgICAgICAgIGJvb2wgaXNLZXk7Ci0gICAgICAgICAgICAgICAgaW50NjRfdCBkdW1teTsKLQotICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9Ci0gICAgICAgICAgICAgICAgICAgIGdldFNhbXBsZUluZm8oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LCAmc2l6ZSwgJmlzS2V5LCAmZHVtbXkpOwotCi0gICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChqID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1GaXJzdENodW5rU2l6ZSA9IHNpemU7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGF2Z0NodW5rU2l6ZSArPSBzaXplOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhdmdDaHVua1NpemUgLz0gbnVtU2FtcGxlc1RvQXZlcmFnZTsKLQotICAgICAgICAgICAgdHJhY2stPm1BdmdDaHVua1NpemUgPSBhdmdDaHVua1NpemU7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXM7Ci0gICAgICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywKLSAgICAgICAgICAgICAgICAgZ2V0U2FtcGxlVGltZShpLCB0cmFjay0+bVNhbXBsZXMuc2l6ZSgpIC0gMSwgJmR1cmF0aW9uVXMpKTsKLQotICAgICAgICBBTE9HVigidHJhY2sgJWQgZHVyYXRpb24gPSAlLjJmIHNlY3MiLCBpLCBkdXJhdGlvblVzIC8gMUU2KTsKLQotICAgICAgICB0cmFjay0+bU1ldGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb25Vcyk7Ci0gICAgICAgIHRyYWNrLT5tTWV0YS0+c2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgdHJhY2stPm1NYXhTYW1wbGVTaXplKTsKLQotICAgICAgICBjb25zdCBjaGFyICp0bXA7Ci0gICAgICAgIENIRUNLKHRyYWNrLT5tTWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmdG1wKSk7Ci0KLSAgICAgICAgQVN0cmluZyBtaW1lID0gdG1wOwotCi0gICAgICAgIGlmICghc3RybmNhc2VjbXAoInZpZGVvLyIsIG1pbWUuY19zdHIoKSwgNikpIHsKLSAgICAgICAgICAgIGlmICh0cmFjay0+bVRodW1ibmFpbFNhbXBsZUluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBpbnQ2NF90IHRodW1ibmFpbFRpbWVVczsKLSAgICAgICAgICAgICAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2FtcGxlVGltZShpLCB0cmFjay0+bVRodW1ibmFpbFNhbXBsZUluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRodW1ibmFpbFRpbWVVcykpOwotCi0gICAgICAgICAgICAgICAgdHJhY2stPm1NZXRhLT5zZXRJbnQ2NChrS2V5VGh1bWJuYWlsVGltZSwgdGh1bWJuYWlsVGltZVVzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0KLSAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcChtaW1lLmNfc3RyKCksIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KSkgewotICAgICAgICAgICAgICAgIGVyciA9IGFkZE1QRUc0Q29kZWNTcGVjaWZpY0RhdGEoaSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUuY19zdHIoKSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKSkgewotICAgICAgICAgICAgICAgIGVyciA9IGFkZEgyNjRDb2RlY1NwZWNpZmljRGF0YShpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtRm91bmRJbmRleCA9IHRydWU7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXRpYyBzaXplX3QgR2V0U2l6ZVdpZHRoKHNpemVfdCB4KSB7Ci0gICAgc2l6ZV90IG4gPSAxOwotICAgIHdoaWxlICh4ID4gMTI3KSB7Ci0gICAgICAgICsrbjsKLSAgICAgICAgeCA+Pj0gNzsKLSAgICB9Ci0gICAgcmV0dXJuIG47Ci19Ci0KLXN0YXRpYyB1aW50OF90ICpFbmNvZGVTaXplKHVpbnQ4X3QgKmRzdCwgc2l6ZV90IHgpIHsKLSAgICB3aGlsZSAoeCA+IDEyNykgewotICAgICAgICAqZHN0KysgPSAoeCAmIDB4N2YpIHwgMHg4MDsKLSAgICAgICAgeCA+Pj0gNzsKLSAgICB9Ci0gICAgKmRzdCsrID0geDsKLSAgICByZXR1cm4gZHN0OwotfQotCi1zcDxBQnVmZmVyPiBNYWtlTVBFRzRWaWRlb0NvZGVjU3BlY2lmaWNEYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZjb25maWcpIHsKLSAgICBzaXplX3QgbGVuMSA9IGNvbmZpZy0+c2l6ZSgpICsgR2V0U2l6ZVdpZHRoKGNvbmZpZy0+c2l6ZSgpKSArIDE7Ci0gICAgc2l6ZV90IGxlbjIgPSBsZW4xICsgR2V0U2l6ZVdpZHRoKGxlbjEpICsgMSArIDEzOwotICAgIHNpemVfdCBsZW4zID0gbGVuMiArIEdldFNpemVXaWR0aChsZW4yKSArIDEgKyAzOwotCi0gICAgc3A8QUJ1ZmZlcj4gY3NkID0gbmV3IEFCdWZmZXIobGVuMyk7Ci0gICAgdWludDhfdCAqZHN0ID0gY3NkLT5kYXRhKCk7Ci0gICAgKmRzdCsrID0gMHgwMzsKLSAgICBkc3QgPSBFbmNvZGVTaXplKGRzdCwgbGVuMiArIDMpOwotICAgICpkc3QrKyA9IDB4MDA7ICAvLyBFU19JRAotICAgICpkc3QrKyA9IDB4MDA7Ci0gICAgKmRzdCsrID0gMHgwMDsgIC8vIHN0cmVhbURlcGVuZGVuY2VGbGFnLCBVUkxfRmxhZywgT0NSc3RyZWFtRmxhZwotCi0gICAgKmRzdCsrID0gMHgwNDsKLSAgICBkc3QgPSBFbmNvZGVTaXplKGRzdCwgbGVuMSArIDEzKTsKLSAgICAqZHN0KysgPSAweDAxOyAgLy8gVmlkZW8gSVNPL0lFQyAxNDQ5Ni0yIFNpbXBsZSBQcm9maWxlCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAxMjsgKytpKSB7Ci0gICAgICAgICpkc3QrKyA9IDB4MDA7Ci0gICAgfQotCi0gICAgKmRzdCsrID0gMHgwNTsKLSAgICBkc3QgPSBFbmNvZGVTaXplKGRzdCwgY29uZmlnLT5zaXplKCkpOwotICAgIG1lbWNweShkc3QsIGNvbmZpZy0+ZGF0YSgpLCBjb25maWctPnNpemUoKSk7Ci0gICAgZHN0ICs9IGNvbmZpZy0+c2l6ZSgpOwotCi0gICAgLy8gaGV4ZHVtcChjc2QtPmRhdGEoKSwgY3NkLT5zaXplKCkpOwotCi0gICAgcmV0dXJuIGNzZDsKLX0KLQotc3RhdHVzX3QgQVZJRXh0cmFjdG9yOjphZGRNUEVHNENvZGVjU3BlY2lmaWNEYXRhKHNpemVfdCB0cmFja0luZGV4KSB7Ci0gICAgVHJhY2sgKnRyYWNrID0gJm1UcmFja3MuZWRpdEl0ZW1BdCh0cmFja0luZGV4KTsKLQotICAgIG9mZjY0X3Qgb2Zmc2V0OwotICAgIHNpemVfdCBzaXplOwotICAgIGJvb2wgaXNLZXk7Ci0gICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgc3RhdHVzX3QgZXJyID0KLSAgICAgICAgZ2V0U2FtcGxlSW5mbyh0cmFja0luZGV4LCAwLCAmb2Zmc2V0LCAmc2l6ZSwgJmlzS2V5LCAmdGltZVVzKTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcihzaXplKTsKLSAgICBzc2l6ZV90IG4gPSBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKLQotICAgIGlmIChuIDwgKHNzaXplX3Qpc2l6ZSkgewotICAgICAgICByZXR1cm4gbiA8IDAgPyAoc3RhdHVzX3QpbiA6IEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICAvLyBFeHRyYWN0IGV2ZXJ5dGhpbmcgdXAgdG8gdGhlIGZpcnN0IFZPUCBzdGFydCBjb2RlIGZyb20gdGhlIGZpcnN0Ci0gICAgLy8gZnJhbWUncyBlbmNvZGVkIGRhdGEgYW5kIHVzZSBpdCB0byBjb25zdHJ1Y3QgYW4gRVNEUyB3aXRoIHRoZQotICAgIC8vIGNvZGVjIHNwZWNpZmljIGRhdGEuCi0KLSAgICBzaXplX3QgaSA9IDA7Ci0gICAgYm9vbCBmb3VuZCA9IGZhbHNlOwotICAgIHdoaWxlIChpICsgMyA8IGJ1ZmZlci0+c2l6ZSgpKSB7Ci0gICAgICAgIGlmICghbWVtY21wKCJceDAwXHgwMFx4MDFceGI2IiwgJmJ1ZmZlci0+ZGF0YSgpW2ldLCA0KSkgewotICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICArK2k7Ci0gICAgfQotCi0gICAgaWYgKCFmb3VuZCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgaSk7Ci0KLSAgICBzcDxBQnVmZmVyPiBjc2QgPSBNYWtlTVBFRzRWaWRlb0NvZGVjU3BlY2lmaWNEYXRhKGJ1ZmZlcik7Ci0gICAgdHJhY2stPm1NZXRhLT5zZXREYXRhKGtLZXlFU0RTLCBrVHlwZUVTRFMsIGNzZC0+ZGF0YSgpLCBjc2QtPnNpemUoKSk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEFWSUV4dHJhY3Rvcjo6YWRkSDI2NENvZGVjU3BlY2lmaWNEYXRhKHNpemVfdCB0cmFja0luZGV4KSB7Ci0gICAgVHJhY2sgKnRyYWNrID0gJm1UcmFja3MuZWRpdEl0ZW1BdCh0cmFja0luZGV4KTsKLQotICAgIG9mZjY0X3Qgb2Zmc2V0OwotICAgIHNpemVfdCBzaXplOwotICAgIGJvb2wgaXNLZXk7Ci0gICAgaW50NjRfdCB0aW1lVXM7Ci0KLSAgICAvLyBFeHRyYWN0IGNvZGVjIHNwZWNpZmljIGRhdGEgZnJvbSB0aGUgZmlyc3Qgbm9uLWVtcHR5IHNhbXBsZS4KLQotICAgIHNpemVfdCBzYW1wbGVJbmRleCA9IDA7Ci0gICAgZm9yICg7OykgewotICAgICAgICBzdGF0dXNfdCBlcnIgPQotICAgICAgICAgICAgZ2V0U2FtcGxlSW5mbygKLSAgICAgICAgICAgICAgICAgICAgdHJhY2tJbmRleCwgc2FtcGxlSW5kZXgsICZvZmZzZXQsICZzaXplLCAmaXNLZXksICZ0aW1lVXMpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2l6ZSA+IDApIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgKytzYW1wbGVJbmRleDsKLSAgICB9Ci0KLSAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcihzaXplKTsKLSAgICBzc2l6ZV90IG4gPSBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKLQotICAgIGlmIChuIDwgKHNzaXplX3Qpc2l6ZSkgewotICAgICAgICByZXR1cm4gbiA8IDAgPyAoc3RhdHVzX3QpbiA6IEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IE1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YShidWZmZXIpOwotCi0gICAgaWYgKG1ldGEgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGV4dHJhY3QgQVZDIGNvZGVjIHNwZWNpZmljIGRhdGEiKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7Ci0gICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJndpZHRoKSk7Ci0gICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZoZWlnaHQpKTsKLQotICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgY29uc3Qgdm9pZCAqY3NkOwotICAgIHNpemVfdCBjc2RTaXplOwotICAgIENIRUNLKG1ldGEtPmZpbmREYXRhKGtLZXlBVkNDLCAmdHlwZSwgJmNzZCwgJmNzZFNpemUpKTsKLQotICAgIHRyYWNrLT5tTWV0YS0+c2V0SW50MzIoa0tleVdpZHRoLCB3aWR0aCk7Ci0gICAgdHJhY2stPm1NZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBoZWlnaHQpOwotICAgIHRyYWNrLT5tTWV0YS0+c2V0RGF0YShrS2V5QVZDQywgdHlwZSwgY3NkLCBjc2RTaXplKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgQVZJRXh0cmFjdG9yOjpnZXRTYW1wbGVJbmZvKAotICAgICAgICBzaXplX3QgdHJhY2tJbmRleCwgc2l6ZV90IHNhbXBsZUluZGV4LAotICAgICAgICBvZmY2NF90ICpvZmZzZXQsIHNpemVfdCAqc2l6ZSwgYm9vbCAqaXNLZXksCi0gICAgICAgIGludDY0X3QgKnNhbXBsZVRpbWVVcykgewotICAgIGlmICh0cmFja0luZGV4ID49IG1UcmFja3Muc2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiAtRVJBTkdFOwotICAgIH0KLQotICAgIGNvbnN0IFRyYWNrICZ0cmFjayA9IG1UcmFja3MuaXRlbUF0KHRyYWNrSW5kZXgpOwotCi0gICAgaWYgKHNhbXBsZUluZGV4ID49IHRyYWNrLm1TYW1wbGVzLnNpemUoKSkgewotICAgICAgICByZXR1cm4gLUVSQU5HRTsKLSAgICB9Ci0KLSAgICBjb25zdCBTYW1wbGVJbmZvICZpbmZvID0gdHJhY2subVNhbXBsZXMuaXRlbUF0KHNhbXBsZUluZGV4KTsKLQotICAgIGlmICghbU9mZnNldHNBcmVBYnNvbHV0ZSkgewotICAgICAgICAqb2Zmc2V0ID0gaW5mby5tT2Zmc2V0ICsgbU1vdmllT2Zmc2V0ICsgODsKLSAgICB9IGVsc2UgewotICAgICAgICAqb2Zmc2V0ID0gaW5mby5tT2Zmc2V0OwotICAgIH0KLQotICAgICpzaXplID0gMDsKLQotICAgIHVpbnQ4X3QgdG1wWzhdOwotICAgIHNzaXplX3QgbiA9IG1EYXRhU291cmNlLT5yZWFkQXQoKm9mZnNldCwgdG1wLCA4KTsKLQotICAgIGlmIChuIDwgOCkgewotICAgICAgICByZXR1cm4gbiA8IDAgPyAoc3RhdHVzX3QpbiA6IChzdGF0dXNfdClFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgdWludDMyX3QgY2h1bmtUeXBlID0gVTMyX0FUKHRtcCk7Ci0KLSAgICBpZiAoIUlzQ29ycmVjdENodW5rVHlwZSh0cmFja0luZGV4LCB0cmFjay5tS2luZCwgY2h1bmtUeXBlKSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgICpvZmZzZXQgKz0gODsKLSAgICAqc2l6ZSA9IFUzMkxFX0FUKCZ0bXBbNF0pOwotCi0gICAgKmlzS2V5ID0gaW5mby5tSXNLZXk7Ci0KLSAgICBpZiAodHJhY2subUJ5dGVzUGVyU2FtcGxlID4gMCkgewotICAgICAgICBzaXplX3Qgc2FtcGxlU3RhcnRJbkJ5dGVzOwotICAgICAgICBpZiAoc2FtcGxlSW5kZXggPT0gMCkgewotICAgICAgICAgICAgc2FtcGxlU3RhcnRJbkJ5dGVzID0gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNhbXBsZVN0YXJ0SW5CeXRlcyA9Ci0gICAgICAgICAgICAgICAgdHJhY2subUZpcnN0Q2h1bmtTaXplICsgdHJhY2subUF2Z0NodW5rU2l6ZSAqIChzYW1wbGVJbmRleCAtIDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgc2FtcGxlSW5kZXggPSBzYW1wbGVTdGFydEluQnl0ZXMgLyB0cmFjay5tQnl0ZXNQZXJTYW1wbGU7Ci0gICAgfQotCi0gICAgKnNhbXBsZVRpbWVVcyA9IChzYW1wbGVJbmRleCAqIDEwMDAwMDBsbCAqIHRyYWNrLm1SYXRlKSAvIHRyYWNrLm1TY2FsZTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgQVZJRXh0cmFjdG9yOjpnZXRTYW1wbGVUaW1lKAotICAgICAgICBzaXplX3QgdHJhY2tJbmRleCwgc2l6ZV90IHNhbXBsZUluZGV4LCBpbnQ2NF90ICpzYW1wbGVUaW1lVXMpIHsKLSAgICBvZmY2NF90IG9mZnNldDsKLSAgICBzaXplX3Qgc2l6ZTsKLSAgICBib29sIGlzS2V5OwotICAgIHJldHVybiBnZXRTYW1wbGVJbmZvKAotICAgICAgICAgICAgdHJhY2tJbmRleCwgc2FtcGxlSW5kZXgsICZvZmZzZXQsICZzaXplLCAmaXNLZXksIHNhbXBsZVRpbWVVcyk7Ci19Ci0KLXN0YXR1c190IEFWSUV4dHJhY3Rvcjo6Z2V0U2FtcGxlSW5kZXhBdFRpbWUoCi0gICAgICAgIHNpemVfdCB0cmFja0luZGV4LAotICAgICAgICBpbnQ2NF90IHRpbWVVcywgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlLAotICAgICAgICBzaXplX3QgKnNhbXBsZUluZGV4KSBjb25zdCB7Ci0gICAgaWYgKHRyYWNrSW5kZXggPj0gbVRyYWNrcy5zaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIC1FUkFOR0U7Ci0gICAgfQotCi0gICAgY29uc3QgVHJhY2sgJnRyYWNrID0gbVRyYWNrcy5pdGVtQXQodHJhY2tJbmRleCk7Ci0KLSAgICBzc2l6ZV90IGNsb3Nlc3RTYW1wbGVJbmRleDsKLQotICAgIGlmICh0cmFjay5tQnl0ZXNQZXJTYW1wbGUgPiAwKSB7Ci0gICAgICAgIHNpemVfdCBjbG9zZXN0Qnl0ZU9mZnNldCA9Ci0gICAgICAgICAgICAodGltZVVzICogdHJhY2subUJ5dGVzUGVyU2FtcGxlKQotICAgICAgICAgICAgICAgIC8gdHJhY2subVJhdGUgKiB0cmFjay5tU2NhbGUgLyAxMDAwMDAwbGw7Ci0KLSAgICAgICAgaWYgKGNsb3Nlc3RCeXRlT2Zmc2V0IDw9IHRyYWNrLm1GaXJzdENodW5rU2l6ZSkgewotICAgICAgICAgICAgY2xvc2VzdFNhbXBsZUluZGV4ID0gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNsb3Nlc3RTYW1wbGVJbmRleCA9Ci0gICAgICAgICAgICAgICAgKGNsb3Nlc3RCeXRlT2Zmc2V0IC0gdHJhY2subUZpcnN0Q2h1bmtTaXplKQotICAgICAgICAgICAgICAgICAgICAvIHRyYWNrLm1BdmdDaHVua1NpemU7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICAvLyBFYWNoIGNodW5rIGNvbnRhaW5zIGEgc2luZ2xlIHNhbXBsZS4KLSAgICAgICAgY2xvc2VzdFNhbXBsZUluZGV4ID0gdGltZVVzIC8gdHJhY2subVJhdGUgKiB0cmFjay5tU2NhbGUgLyAxMDAwMDAwbGw7Ci0gICAgfQotCi0gICAgc3NpemVfdCBudW1TYW1wbGVzID0gdHJhY2subVNhbXBsZXMuc2l6ZSgpOwotCi0gICAgaWYgKGNsb3Nlc3RTYW1wbGVJbmRleCA8IDApIHsKLSAgICAgICAgY2xvc2VzdFNhbXBsZUluZGV4ID0gMDsKLSAgICB9IGVsc2UgaWYgKGNsb3Nlc3RTYW1wbGVJbmRleCA+PSBudW1TYW1wbGVzKSB7Ci0gICAgICAgIGNsb3Nlc3RTYW1wbGVJbmRleCA9IG51bVNhbXBsZXMgLSAxOwotICAgIH0KLQotICAgIGlmIChtb2RlID09IE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUKSB7Ci0gICAgICAgICpzYW1wbGVJbmRleCA9IGNsb3Nlc3RTYW1wbGVJbmRleDsKLQotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgc3NpemVfdCBwcmV2U3luY1NhbXBsZUluZGV4ID0gY2xvc2VzdFNhbXBsZUluZGV4OwotICAgIHdoaWxlIChwcmV2U3luY1NhbXBsZUluZGV4ID49IDApIHsKLSAgICAgICAgY29uc3QgU2FtcGxlSW5mbyAmaW5mbyA9Ci0gICAgICAgICAgICB0cmFjay5tU2FtcGxlcy5pdGVtQXQocHJldlN5bmNTYW1wbGVJbmRleCk7Ci0KLSAgICAgICAgaWYgKGluZm8ubUlzS2V5KSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIC0tcHJldlN5bmNTYW1wbGVJbmRleDsKLSAgICB9Ci0KLSAgICBzc2l6ZV90IG5leHRTeW5jU2FtcGxlSW5kZXggPSBjbG9zZXN0U2FtcGxlSW5kZXg7Ci0gICAgd2hpbGUgKG5leHRTeW5jU2FtcGxlSW5kZXggPCBudW1TYW1wbGVzKSB7Ci0gICAgICAgIGNvbnN0IFNhbXBsZUluZm8gJmluZm8gPQotICAgICAgICAgICAgdHJhY2subVNhbXBsZXMuaXRlbUF0KG5leHRTeW5jU2FtcGxlSW5kZXgpOwotCi0gICAgICAgIGlmIChpbmZvLm1Jc0tleSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICArK25leHRTeW5jU2FtcGxlSW5kZXg7Ci0gICAgfQotCi0gICAgc3dpdGNoIChtb2RlKSB7Ci0gICAgICAgIGNhc2UgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkM6Ci0gICAgICAgIHsKLSAgICAgICAgICAgICpzYW1wbGVJbmRleCA9IHByZXZTeW5jU2FtcGxlSW5kZXg7Ci0KLSAgICAgICAgICAgIHJldHVybiBwcmV2U3luY1NhbXBsZUluZGV4ID49IDAgPyBPSyA6IFVOS05PV05fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19ORVhUX1NZTkM6Ci0gICAgICAgIHsKLSAgICAgICAgICAgICpzYW1wbGVJbmRleCA9IG5leHRTeW5jU2FtcGxlSW5kZXg7Ci0KLSAgICAgICAgICAgIHJldHVybiBuZXh0U3luY1NhbXBsZUluZGV4IDwgbnVtU2FtcGxlcyA/IE9LIDogVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1RfU1lOQzoKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHByZXZTeW5jU2FtcGxlSW5kZXggPCAwICYmIG5leHRTeW5jU2FtcGxlSW5kZXggPj0gbnVtU2FtcGxlcykgewotICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocHJldlN5bmNTYW1wbGVJbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICAqc2FtcGxlSW5kZXggPSBuZXh0U3luY1NhbXBsZUluZGV4OwotICAgICAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG5leHRTeW5jU2FtcGxlSW5kZXggPj0gbnVtU2FtcGxlcykgewotICAgICAgICAgICAgICAgICpzYW1wbGVJbmRleCA9IHByZXZTeW5jU2FtcGxlSW5kZXg7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzaXplX3QgZGlzdDEgPSBjbG9zZXN0U2FtcGxlSW5kZXggLSBwcmV2U3luY1NhbXBsZUluZGV4OwotICAgICAgICAgICAgc2l6ZV90IGRpc3QyID0gbmV4dFN5bmNTYW1wbGVJbmRleCAtIGNsb3Nlc3RTYW1wbGVJbmRleDsKLQotICAgICAgICAgICAgKnNhbXBsZUluZGV4ID0KLSAgICAgICAgICAgICAgICAoZGlzdDEgPCBkaXN0MikgPyBwcmV2U3luY1NhbXBsZUluZGV4IDogbmV4dFN5bmNTYW1wbGVJbmRleDsKLQotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFRSRVNQQVNTKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLWJvb2wgU25pZmZBVkkoCi0gICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSwKLSAgICAgICAgc3A8QU1lc3NhZ2U+ICopIHsKLSAgICBjaGFyIHRtcFsxMl07Ci0gICAgaWYgKHNvdXJjZS0+cmVhZEF0KDAsIHRtcCwgMTIpIDwgMTIpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmICghbWVtY21wKHRtcCwgIlJJRkYiLCA0KSAmJiAhbWVtY21wKCZ0bXBbOF0sICJBVkkgIiwgNCkpIHsKLSAgICAgICAgbWltZVR5cGUtPnNldFRvKE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9BVkkpOwotCi0gICAgICAgIC8vIEp1c3QgYSB0YWQgb3ZlciB0aGUgbXAzIGV4dHJhY3RvcidzIGNvbmZpZGVuY2UsIHNpbmNlCi0gICAgICAgIC8vIHRoZXNlIC5hdmkgZmlsZXMgbWF5IGNvbnRhaW4gLm1wMyBjb250ZW50IHRoYXQgb3RoZXJ3aXNlIHdvdWxkCi0gICAgICAgIC8vIG1pc3Rha2VubHkgbGVhZCB0byB1cyBpZGVudGlmeWluZyB0aGUgZW50aXJlIGZpbGUgYXMgYSAubXAzIGZpbGUuCi0gICAgICAgICpjb25maWRlbmNlID0gMC4yMTsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5icAppbmRleCBjOGQ0ZTRhLi40OGUzNTFiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQuYnAKQEAgLTQsMzcgKzQsMTE0IEBACiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKIH0KIAorY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9lc2RzIiwKKworICAgIHNyY3M6IFsiRVNEUy5jcHAiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBkaWFnOiB7CisgICAgICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIH0sCisgICAgfSwKKworICAgIHNoYXJlZF9saWJzOiBbImxpYm1lZGlhIl0sCit9CisKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfbWV0YWRhdGF1dGlscyIsCisKKyAgICBzcmNzOiBbIk1ldGFEYXRhVXRpbHMuY3BwIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgZGlhZzogeworICAgICAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICB9LAorICAgIH0sCisKKyAgICBzaGFyZWRfbGliczogWyJsaWJtZWRpYSJdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2NvZGVjYmFzZSIsCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkNvZGVjQmFzZS5jcHAiLAorICAgICAgICAiRnJhbWVSZW5kZXJUcmFja2VyLmNwcCIsCisgICAgICAgICJNZWRpYUNvZGVjTGlzdFdyaXRlci5jcHAiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYV9vbXgiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhcy5uYXRpdmVAMS4wIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgZGlhZzogeworICAgICAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICB9LAorICAgIH0sCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHQiLAogCiAgICAgc3JjczogWwogICAgICAgICAiQUNvZGVjLmNwcCIsCiAgICAgICAgICJBQ29kZWNCdWZmZXJDaGFubmVsLmNwcCIsCi0gICAgICAgICJBQUNFeHRyYWN0b3IuY3BwIiwKICAgICAgICAgIkFBQ1dyaXRlci5jcHAiLAotICAgICAgICAiQU1SRXh0cmFjdG9yLmNwcCIsCiAgICAgICAgICJBTVJXcml0ZXIuY3BwIiwKICAgICAgICAgIkF1ZGlvUGxheWVyLmNwcCIsCisgICAgICAgICJBdWRpb1ByZXNlbnRhdGlvbkluZm8uY3BwIiwKICAgICAgICAgIkF1ZGlvU291cmNlLmNwcCIsCiAgICAgICAgICJCdWZmZXJJbXBsLmNwcCIsCi0gICAgICAgICJDb2RlY0Jhc2UuY3BwIiwKICAgICAgICAgIkNhbGxiYWNrRGF0YVNvdXJjZS5jcHAiLAorICAgICAgICAiQ2FsbGJhY2tNZWRpYVNvdXJjZS5jcHAiLAogICAgICAgICAiQ2FtZXJhU291cmNlLmNwcCIsCiAgICAgICAgICJDYW1lcmFTb3VyY2VUaW1lTGFwc2UuY3BwIiwKICAgICAgICAgIkRhdGFDb252ZXJ0ZXIuY3BwIiwKLSAgICAgICAgIkRhdGFTb3VyY2UuY3BwIiwKKyAgICAgICAgIkRhdGFTb3VyY2VGYWN0b3J5LmNwcCIsCiAgICAgICAgICJEYXRhVVJJU291cmNlLmNwcCIsCi0gICAgICAgICJFU0RTLmNwcCIsCiAgICAgICAgICJGaWxlU291cmNlLmNwcCIsCi0gICAgICAgICJGTEFDRXh0cmFjdG9yLmNwcCIsCi0gICAgICAgICJGcmFtZVJlbmRlclRyYWNrZXIuY3BwIiwKKyAgICAgICAgIkZyYW1lRGVjb2Rlci5jcHAiLAogICAgICAgICAiSFRUUEJhc2UuY3BwIiwKICAgICAgICAgIkhldmNVdGlscy5jcHAiLAotICAgICAgICAiSXRlbVRhYmxlLmNwcCIsCisgICAgICAgICJJbnRlcmZhY2VVdGlscy5jcHAiLAogICAgICAgICAiSlBFR1NvdXJjZS5jcHAiLAotICAgICAgICAiTVAzRXh0cmFjdG9yLmNwcCIsCiAgICAgICAgICJNUEVHMlRTV3JpdGVyLmNwcCIsCi0gICAgICAgICJNUEVHNEV4dHJhY3Rvci5jcHAiLAogICAgICAgICAiTVBFRzRXcml0ZXIuY3BwIiwKICAgICAgICAgIk1lZGlhQWRhcHRlci5jcHAiLAogICAgICAgICAiTWVkaWFDbG9jay5jcHAiLApAQCAtNDIsODUgKzExOSw3MiBAQAogICAgICAgICAiTWVkaWFDb2RlY0xpc3QuY3BwIiwKICAgICAgICAgIk1lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmNwcCIsCiAgICAgICAgICJNZWRpYUNvZGVjU291cmNlLmNwcCIsCi0gICAgICAgICJNZWRpYUV4dHJhY3Rvci5jcHAiLAorICAgICAgICAiTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmNwcCIsCiAgICAgICAgICJNZWRpYVN5bmMuY3BwIiwKLSAgICAgICAgIk1pZGlFeHRyYWN0b3IuY3BwIiwKICAgICAgICAgImh0dHAvTWVkaWFIVFRQLmNwcCIsCiAgICAgICAgICJNZWRpYU11eGVyLmNwcCIsCi0gICAgICAgICJNZWRpYVNvdXJjZS5jcHAiLAogICAgICAgICAiTnVDYWNoZWRTb3VyY2UyLmNwcCIsCiAgICAgICAgICJOdU1lZGlhRXh0cmFjdG9yLmNwcCIsCiAgICAgICAgICJPTVhDbGllbnQuY3BwIiwKICAgICAgICAgIk9teEluZm9CdWlsZGVyLmNwcCIsCi0gICAgICAgICJPZ2dFeHRyYWN0b3IuY3BwIiwKLSAgICAgICAgIlNhbXBsZUl0ZXJhdG9yLmNwcCIsCi0gICAgICAgICJTYW1wbGVUYWJsZS5jcHAiLAorICAgICAgICAiUmVtb3RlTWVkaWFFeHRyYWN0b3IuY3BwIiwKKyAgICAgICAgIlJlbW90ZU1lZGlhU291cmNlLmNwcCIsCiAgICAgICAgICJTaW1wbGVEZWNvZGluZ1NvdXJjZS5jcHAiLAogICAgICAgICAiU2tpcEN1dEJ1ZmZlci5jcHAiLAogICAgICAgICAiU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuY3BwIiwKICAgICAgICAgIlN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwIiwKLSAgICAgICAgIlN1cmZhY2VNZWRpYVNvdXJjZS5jcHAiLAorICAgICAgICAiU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIuY3BwIiwKICAgICAgICAgIlN1cmZhY2VVdGlscy5jcHAiLAotICAgICAgICAiVGhyb3R0bGVkU291cmNlLmNwcCIsCiAgICAgICAgICJVdGlscy5jcHAiLAotICAgICAgICAiVkJSSVNlZWtlci5jcHAiLAorICAgICAgICAiVGhyb3R0bGVkU291cmNlLmNwcCIsCiAgICAgICAgICJWaWRlb0ZyYW1lU2NoZWR1bGVyLmNwcCIsCi0gICAgICAgICJXQVZFeHRyYWN0b3IuY3BwIiwKLSAgICAgICAgIlhJTkdTZWVrZXIuY3BwIiwKLSAgICAgICAgImF2Y191dGlscy5jcHAiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYXVkaW91dGlscyIsCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGliY2FtZXJhX2NsaWVudCIsCi0gICAgICAgICJsaWJjcnlwdG8iLAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYmRsIiwKICAgICAgICAgImxpYmRybWZyYW1ld29yayIsCi0gICAgICAgICJsaWJleHBhdCIsCiAgICAgICAgICJsaWJndWkiLAorICAgICAgICAibGliaW9uIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJtZWRpYV9vbXgiLAogICAgICAgICAibGliYXVkaW9jbGllbnQiLAorICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAogICAgICAgICAibGlibWVkaWFtZXRyaWNzIiwKICAgICAgICAgImxpYm1lZGlhdXRpbHMiLAogICAgICAgICAibGlibmV0ZF9jbGllbnQiLAotICAgICAgICAibGlic29uaXZveCIsCiAgICAgICAgICJsaWJ1aSIsCiAgICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJ2b3JiaXNpZGVjIiwKLSAgICAgICAgImxpYm1lZGlhZHJtIiwKLSAgICAgICAgImxpYm5hdGl2ZXdpbmRvdyIsCi0KICAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXhfdXRpbHMiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZmxhY2RlYyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9jb2RlY2Jhc2UiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXhfdXRpbHMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyIiwKLSAgICAgICAgImxpYmRsIiwKICAgICAgICAgImxpYlJTY3BwIiwKKyAgICAgICAgImxpYmhpZGxhbGxvY2F0b3J1dGlscyIsCiAgICAgICAgICJsaWJoaWRsYmFzZSIsCiAgICAgICAgICJsaWJoaWRsbWVtb3J5IiwKKyAgICAgICAgImxpYnppcGFyY2hpdmUiLAogICAgICAgICAiYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAiLAotICAgICAgICAiYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAiLAotICAgICAgICAiYW5kcm9pZC5oaWRsLnRva2VuQDEuMC11dGlscyIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhc0AxLjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYXMubmF0aXZlQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5hbGxvY2F0b3JAMi4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MubWFwcGVyQDIuMCIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9jb2xvcl9jb252ZXJzaW9uIiwKICAgICAgICAgImxpYnl1dl9zdGF0aWMiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfYWFjZW5jIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21hdHJvc2thIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21lZGlhZmlsdGVyIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3dlYm0iLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfdGltZWR0ZXh0IiwKICAgICAgICAgImxpYnZweCIsCiAgICAgICAgICJsaWJ3ZWJtIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21wZWcydHMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZXNkcyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9pZDMiLAogICAgICAgICAibGliRkxBQyIsCiAgICAgXSwKQEAgLTE0MSw2ICsyMDUsOTIgQEAKICAgICAgICAgIi1XYWxsIiwKICAgICBdLAogCisgICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCisKKyAgICBwcm9kdWN0X3ZhcmlhYmxlczogeworICAgICAgICBkZWJ1Z2dhYmxlOiB7CisgICAgICAgICAgICAvLyBlbmFibGUgZXhwZXJpbWVudHMgb25seSBpbiB1c2VyZGVidWcgYW5kIGVuZyBidWlsZHMKKyAgICAgICAgICAgIGNmbGFnczogWyItREVOQUJMRV9TVEFHRUZSSUdIVF9FWFBFUklNRU5UUyJdLAorICAgICAgICB9LAorICAgIH0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBkaWFnOiB7CisgICAgICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIH0sCisgICAgfSwKK30KKworY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3BsYXllcjIiLAorCisgICAgc3JjczogWworICAgICAgICAiQ2FsbGJhY2tEYXRhU291cmNlLmNwcCIsCisgICAgICAgICJDYWxsYmFja01lZGlhU291cmNlLmNwcCIsCisgICAgICAgICJEYXRhU291cmNlRmFjdG9yeS5jcHAiLAorICAgICAgICAiRGF0YVVSSVNvdXJjZS5jcHAiLAorICAgICAgICAiRmlsZVNvdXJjZS5jcHAiLAorICAgICAgICAiSFRUUEJhc2UuY3BwIiwKKyAgICAgICAgIkhldmNVdGlscy5jcHAiLAorICAgICAgICAiSW50ZXJmYWNlVXRpbHMuY3BwIiwKKyAgICAgICAgIk1lZGlhQ2xvY2suY3BwIiwKKyAgICAgICAgIk1lZGlhRXh0cmFjdG9yRmFjdG9yeS5jcHAiLAorICAgICAgICAiTmRrVXRpbHMuY3BwIiwKKyAgICAgICAgIk51Q2FjaGVkU291cmNlMi5jcHAiLAorICAgICAgICAiUmVtb3RlTWVkaWFFeHRyYWN0b3IuY3BwIiwKKyAgICAgICAgIlJlbW90ZU1lZGlhU291cmNlLmNwcCIsCisgICAgICAgICJVdGlscy5jcHAiLAorICAgICAgICAiVmlkZW9GcmFtZVNjaGVkdWxlci5jcHAiLAorICAgICAgICAiaHR0cC9NZWRpYUhUVFAuY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliZHJtZnJhbWV3b3JrIiwKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWFfcGxheWVyMl91dGlsIiwKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50IiwKKyAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKKyAgICAgICAgImxpYm5ldGRfY2xpZW50IiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnppcGFyY2hpdmUiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfZXNkcyIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOlsKKyAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGlibWVkaWFfcGxheWVyMl91dGlsIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVduby1tdWx0aWNoYXIiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV25vLWVycm9yPWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCiAgICAgcHJvZHVjdF92YXJpYWJsZXM6IHsKICAgICAgICAgZGVidWdnYWJsZTogewogICAgICAgICAgICAgLy8gZW5hYmxlIGV4cGVyaW1lbnRzIG9ubHkgaW4gdXNlcmRlYnVnIGFuZCBlbmcgYnVpbGRzCkBAIC0xNjEsNiArMzExLDcgQEAKIH0KIAogc3ViZGlycyA9IFsKKyAgICAiY29kZWMyIiwKICAgICAiY29kZWNzLyoiLAogICAgICJjb2xvcmNvbnZlcnNpb24iLAogICAgICJmaWx0ZXJzIiwKQEAgLTE2OSwxMyArMzIwLDExIEBACiAgICAgImh0dHAiLAogICAgICJodHRwbGl2ZSIsCiAgICAgImlkMyIsCi0gICAgIm1hdHJvc2thIiwKICAgICAibXBlZzJ0cyIsCiAgICAgIm9teCIsCiAgICAgInJ0c3AiLAogICAgICJ0ZXN0cyIsCiAgICAgInRpbWVkdGV4dCIsCiAgICAgIndlYm0iLAotICAgICJ3aWZpLWRpc3BsYXkiLAogICAgICJ4bWxwYXJzZXIiLAogXQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwCmluZGV4IGIzZmI4ZDQuLmE2ZjBhMGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1BsYXllci5jcHAKQEAgLTIzLDYgKzIzLDcgQEAKIAogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVHJhY2suaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0F1ZGlvLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29rdXAuaD4KQEAgLTMwLDcgKzMxLDYgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BdWRpb1BsYXllci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAKQEAgLTY3LDcgKzY3LDcgQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9QbGF5ZXI6OnNldFNvdXJjZShjb25zdCBzcDxJTWVkaWFTb3VyY2U+ICZzb3VyY2UpIHsKK3ZvaWQgQXVkaW9QbGF5ZXI6OnNldFNvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSkgewogICAgIENIRUNLKG1Tb3VyY2UgPT0gTlVMTCk7CiAgICAgbVNvdXJjZSA9IHNvdXJjZTsKIH0KQEAgLTM2Myw3ICszNjMsNyBAQAogICAgIC8vIFdoZW4gb2ZmbG9hZGluZywgdGhlIE9NWCBjb21wb25lbnQgaXMgbm90IHVzZWQgc28gdGhpcyBoYWNrCiAgICAgLy8gaXMgbm90IG5lZWRlZAogICAgIGlmICghdXNlT2ZmbG9hZCgpKSB7Ci0gICAgICAgIHdwPElNZWRpYVNvdXJjZT4gdG1wID0gbVNvdXJjZTsKKyAgICAgICAgd3A8TWVkaWFTb3VyY2U+IHRtcCA9IG1Tb3VyY2U7CiAgICAgICAgIG1Tb3VyY2UuY2xlYXIoKTsKICAgICAgICAgd2hpbGUgKHRtcC5wcm9tb3RlKCkgIT0gTlVMTCkgewogICAgICAgICAgICAgdXNsZWVwKDEwMDApOwpAQCAtNTQzLDcgKzU0Myw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmKG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgIT0gMCkgewotICAgICAgICAgICAgICAgIENIRUNLKG1JbnB1dEJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NCgKKyAgICAgICAgICAgICAgICBDSEVDSyhtSW5wdXRCdWZmZXItPm1ldGFfZGF0YSgpLmZpbmRJbnQ2NCgKICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlUaW1lLCAmbVBvc2l0aW9uVGltZU1lZGlhVXMpKTsKICAgICAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QcmVzZW50YXRpb25JbmZvLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUHJlc2VudGF0aW9uSW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZlMTg1OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUHJlc2VudGF0aW9uSW5mby5jcHAKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vICNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkF1ZGlvUHJlc2VudGF0aW9uSW5mbyIKKworI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUHJlc2VudGF0aW9uSW5mby5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0F1ZGlvUHJlc2VudGF0aW9uSW5mbzo6QXVkaW9QcmVzZW50YXRpb25JbmZvKCkgeworfQorCitBdWRpb1ByZXNlbnRhdGlvbkluZm86On5BdWRpb1ByZXNlbnRhdGlvbkluZm8oKSB7CisgICAgbVByZXNlbnRhdGlvbnMuY2xlYXIoKTsKK30KKwordm9pZCBBdWRpb1ByZXNlbnRhdGlvbkluZm86OmFkZFByZXNlbnRhdGlvbihzcDxBdWRpb1ByZXNlbnRhdGlvbj4gcHJlc2VudGF0aW9uKSB7CisgICAgbVByZXNlbnRhdGlvbnMucHVzaChwcmVzZW50YXRpb24pOworfQorCitzaXplX3QgQXVkaW9QcmVzZW50YXRpb25JbmZvOjpjb3VudFByZXNlbnRhdGlvbnMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1QcmVzZW50YXRpb25zLnNpemUoKTsKK30KKworLy8gUmV0dXJucyBhbiBBdWRpb1ByZXNlbnRhdGlvbiBmb3IgdGhlIGdpdmVuIHZhbGlkIGluZGV4CisvLyBpbmRleCBtdXN0IGJlID49MCBhbmQgPCBjb3VudFByZXNlbnRhdGlvbnMoKQorY29uc3Qgc3A8QXVkaW9QcmVzZW50YXRpb24+IEF1ZGlvUHJlc2VudGF0aW9uSW5mbzo6Z2V0UHJlc2VudGF0aW9uKHNpemVfdCBpbmRleCkgY29uc3QgeworICAgIHJldHVybiBtUHJlc2VudGF0aW9uc1tpbmRleF07Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5jcHAKaW5kZXggZjJiMWYxMC4uMmFlMzIxOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmNwcApAQCAtNTIsNyArNTIsNyBAQAogQXVkaW9Tb3VyY2U6OkF1ZGlvU291cmNlKAogICAgICAgICBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwgY29uc3QgU3RyaW5nMTYgJm9wUGFja2FnZU5hbWUsCiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsIHVpbnQzMl90IGNoYW5uZWxDb3VudCwgdWludDMyX3Qgb3V0U2FtcGxlUmF0ZSwKLSAgICAgICAgdWlkX3QgdWlkLCBwaWRfdCBwaWQpCisgICAgICAgIHVpZF90IHVpZCwgcGlkX3QgcGlkLCBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQpCiAgICAgOiBtU3RhcnRlZChmYWxzZSksCiAgICAgICBtU2FtcGxlUmF0ZShzYW1wbGVSYXRlKSwKICAgICAgIG1PdXRTYW1wbGVSYXRlKG91dFNhbXBsZVJhdGUgPiAwID8gb3V0U2FtcGxlUmF0ZSA6IHNhbXBsZVJhdGUpLApAQCAtMTAxLDcgKzEwMSw5IEBACiAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUmVjb3JkOjpUUkFOU0ZFUl9ERUZBVUxULAogICAgICAgICAgICAgICAgICAgICBBVURJT19JTlBVVF9GTEFHX05PTkUsCiAgICAgICAgICAgICAgICAgICAgIHVpZCwKLSAgICAgICAgICAgICAgICAgICAgcGlkKTsKKyAgICAgICAgICAgICAgICAgICAgcGlkLAorICAgICAgICAgICAgICAgICAgICBOVUxMIC8qcEF0dHJpYnV0ZXMqLywKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWREZXZpY2VJZCk7CiAgICAgICAgIG1Jbml0Q2hlY2sgPSBtUmVjb3JkLT5pbml0Q2hlY2soKTsKICAgICAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKICAgICAgICAgICAgIG1SZWNvcmQuY2xlYXIoKTsKQEAgLTIzOCw3ICsyNDAsNyBAQAogfQogCiBzdGF0dXNfdCBBdWRpb1NvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICogLyogb3B0aW9ucyAqLykgeworICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICogLyogb3B0aW9ucyAqLykgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgKm91dCA9IE5VTEw7CiAKQEAgLTI2Myw3ICsyNjUsNyBAQAogCiAgICAgLy8gTXV0ZS9zdXBwcmVzcyB0aGUgcmVjb3JkaW5nIHNvdW5kCiAgICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgQ0hFQ0soYnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7CisgICAgQ0hFQ0soYnVmZmVyLT5tZXRhX2RhdGEoKS5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKICAgICBpbnQ2NF90IGVsYXBzZWRUaW1lVXMgPSB0aW1lVXMgLSBtU3RhcnRUaW1lVXM7CiAgICAgaWYgKGVsYXBzZWRUaW1lVXMgPCBrQXV0b1JhbXBTdGFydFVzKSB7CiAgICAgICAgIG1lbXNldCgodWludDhfdCAqKSBidWZmZXItPmRhdGEoKSwgMCwgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CkBAIC0yODcsNyArMjg5LDcgQEAKIAogICAgIGlmIChtU2FtcGxlUmF0ZSAhPSBtT3V0U2FtcGxlUmF0ZSkgewogICAgICAgICAgICAgdGltZVVzICo9IChpbnQ2NF90KW1TYW1wbGVSYXRlIC8gKGludDY0X3QpbU91dFNhbXBsZVJhdGU7Ci0gICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKKyAgICAgICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7CiAgICAgfQogCiAgICAgKm91dCA9IGJ1ZmZlcjsKQEAgLTMwOSw3ICszMTEsNyBAQAogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBBdWRpb1NvdXJjZTo6c2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgewordm9pZCBBdWRpb1NvdXJjZTo6c2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpIHsKICAgICBBTE9HVigic2lnbmFsQnVmZmVyUmV0dXJuZWQ6ICVwIiwgYnVmZmVyLT5kYXRhKCkpOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgLS1tTnVtQ2xpZW50T3duZWRCdWZmZXJzOwpAQCAtNDMxLDExICs0MzMsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIChtU2FtcGxlUmF0ZSA+PiAxKSkgLyBtU2FtcGxlUmF0ZTsKIAogICAgIGlmIChtTnVtRnJhbWVzUmVjZWl2ZWQgPT0gMCkgewotICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5QW5jaG9yVGltZSwgbVN0YXJ0VGltZVVzKTsKKyAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5QW5jaG9yVGltZSwgbVN0YXJ0VGltZVVzKTsKICAgICB9CiAKLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgbVByZXZTYW1wbGVUaW1lVXMpOwotICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlEcmlmdFRpbWUsIHRpbWVVcyAtIG1Jbml0aWFsUmVhZFRpbWVVcyk7CisgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgbVByZXZTYW1wbGVUaW1lVXMpOworICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleURyaWZ0VGltZSwgdGltZVVzIC0gbUluaXRpYWxSZWFkVGltZVVzKTsKICAgICBtUHJldlNhbXBsZVRpbWVVcyA9IHRpbWVzdGFtcFVzOwogICAgIG1OdW1GcmFtZXNSZWNlaXZlZCArPSBidWZmZXJTaXplIC8gZnJhbWVTaXplOwogICAgIG1CdWZmZXJzUmVjZWl2ZWQucHVzaF9iYWNrKGJ1ZmZlcik7CkBAIC00NjUsNCArNDY3LDQzIEBACiAgICAgcmV0dXJuIHZhbHVlOwogfQogCitzdGF0dXNfdCBBdWRpb1NvdXJjZTo6c2V0SW5wdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgeworICAgIGlmIChtUmVjb3JkICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG1SZWNvcmQtPnNldElucHV0RGV2aWNlKGRldmljZUlkKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0lOSVQ7Cit9CisKK3N0YXR1c190IEF1ZGlvU291cmNlOjpnZXRSb3V0ZWREZXZpY2VJZChhdWRpb19wb3J0X2hhbmRsZV90KiBkZXZpY2VJZCkgeworICAgIGlmIChtUmVjb3JkICE9IDApIHsKKyAgICAgICAgKmRldmljZUlkID0gbVJlY29yZC0+Z2V0Um91dGVkRGV2aWNlSWQoKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKK30KKworc3RhdHVzX3QgQXVkaW9Tb3VyY2U6OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soCisgICAgICAgIGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2spIHsKKyAgICBpZiAobVJlY29yZCAhPSAwKSB7CisgICAgICAgIHJldHVybiBtUmVjb3JkLT5hZGRBdWRpb0RldmljZUNhbGxiYWNrKGNhbGxiYWNrKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0lOSVQ7Cit9CisKK3N0YXR1c190IEF1ZGlvU291cmNlOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKAorICAgICAgICBjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrKSB7CisgICAgaWYgKG1SZWNvcmQgIT0gMCkgeworICAgICAgICByZXR1cm4gbVJlY29yZC0+cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhjYWxsYmFjayk7CisgICAgfQorICAgIHJldHVybiBOT19JTklUOworfQorCitzdGF0dXNfdCBBdWRpb1NvdXJjZTo6Z2V0QWN0aXZlTWljcm9waG9uZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKSB7CisgICAgaWYgKG1SZWNvcmQgIT0gMCkgeworICAgICAgICByZXR1cm4gbVJlY29yZC0+Z2V0QWN0aXZlTWljcm9waG9uZXMoYWN0aXZlTWljcm9waG9uZXMpOworICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0J1ZmZlckltcGwuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQnVmZmVySW1wbC5jcHAKaW5kZXggZmVlMzczOS4uYjc2MDI3MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQnVmZmVySW1wbC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQnVmZmVySW1wbC5jcHAKQEAgLTI5LDYgKzI5LDggQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCisvLyBTaGFyZWRNZW1vcnlCdWZmZXIKKwogU2hhcmVkTWVtb3J5QnVmZmVyOjpTaGFyZWRNZW1vcnlCdWZmZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIGNvbnN0IHNwPElNZW1vcnk+ICZtZW0pCiAgICAgOiBNZWRpYUNvZGVjQnVmZmVyKGZvcm1hdCwgbmV3IEFCdWZmZXIobWVtLT5wb2ludGVyKCksIG1lbS0+c2l6ZSgpKSksCiAgICAgICBtTWVtb3J5KG1lbSkgewpAQCAtMzksNiArNDEsOCBAQAogICAgICAgbVRNZW1vcnkobWVtKSB7CiB9CiAKKy8vIFNlY3VyZUJ1ZmZlcgorCiBTZWN1cmVCdWZmZXI6OlNlY3VyZUJ1ZmZlcihjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwgY29uc3Qgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSkKICAgICA6IE1lZGlhQ29kZWNCdWZmZXIoZm9ybWF0LCBuZXcgQUJ1ZmZlcihudWxscHRyLCBzaXplKSksCiAgICAgICBtUG9pbnRlcihwdHIpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbGxiYWNrRGF0YVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYWxsYmFja0RhdGFTb3VyY2UuY3BwCmluZGV4IDZkZmUyZGUuLjkyZTZlYjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbGxiYWNrRGF0YVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FsbGJhY2tEYXRhU291cmNlLmNwcApAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgImluY2x1ZGUvQ2FsbGJhY2tEYXRhU291cmNlLmgiCiAKICNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lEYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KIApAQCAtMzQsNyArMzUsMTAgQEAKICAgICAgIG1Jc0Nsb3NlZChmYWxzZSkgewogICAgIC8vIFNldCB1cCB0aGUgYnVmZmVyIHRvIHJlYWQgaW50by4KICAgICBtTWVtb3J5ID0gbUlEYXRhU291cmNlLT5nZXRJTWVtb3J5KCk7Ci0gICAgbU5hbWUgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbGxiYWNrRGF0YVNvdXJjZSglcykiLCBtSURhdGFTb3VyY2UtPnRvU3RyaW5nKCkuc3RyaW5nKCkpOworICAgIG1OYW1lID0gU3RyaW5nODo6Zm9ybWF0KCJDYWxsYmFja0RhdGFTb3VyY2UoJWQtPiVkLCAlcykiLAorICAgICAgICAgICAgZ2V0cGlkKCksCisgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCisgICAgICAgICAgICBtSURhdGFTb3VyY2UtPnRvU3RyaW5nKCkuc3RyaW5nKCkpOwogCiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbGxiYWNrTWVkaWFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FsbGJhY2tNZWRpYVNvdXJjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE3MzkyZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbGxiYWNrTWVkaWFTb3VyY2UuY3BwCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9DYWxsYmFja01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhU291cmNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworQ2FsbGJhY2tNZWRpYVNvdXJjZTo6Q2FsbGJhY2tNZWRpYVNvdXJjZShjb25zdCBzcDxJTWVkaWFTb3VyY2U+ICZzb3VyY2UpCisgICAgOm1Tb3VyY2Uoc291cmNlKSB7fQorCitDYWxsYmFja01lZGlhU291cmNlOjp+Q2FsbGJhY2tNZWRpYVNvdXJjZSgpIHt9CisKK3N0YXR1c190IENhbGxiYWNrTWVkaWFTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKKyAgICByZXR1cm4gbVNvdXJjZS0+c3RhcnQocGFyYW1zKTsKK30KKworc3RhdHVzX3QgQ2FsbGJhY2tNZWRpYVNvdXJjZTo6c3RvcCgpIHsKKyAgICByZXR1cm4gbVNvdXJjZS0+c3RvcCgpOworfQorCitzcDxNZXRhRGF0YT4gQ2FsbGJhY2tNZWRpYVNvdXJjZTo6Z2V0Rm9ybWF0KCkgeworICAgIHJldHVybiBtU291cmNlLT5nZXRGb3JtYXQoKTsKK30KKworc3RhdHVzX3QgQ2FsbGJhY2tNZWRpYVNvdXJjZTo6cmVhZChNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CisgICAgcmV0dXJuIG1Tb3VyY2UtPnJlYWQoYnVmZmVyLCByZWludGVycHJldF9jYXN0PGNvbnN0IFJlYWRPcHRpb25zKj4ob3B0aW9ucykpOworfQorCitzdGF0dXNfdCBDYWxsYmFja01lZGlhU291cmNlOjpwYXVzZSgpIHsKKyAgICByZXR1cm4gbVNvdXJjZS0+cGF1c2UoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuY3BwCmluZGV4IDZlZDBkMGUuLmRiMzcwMjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcApAQCAtMTA0MCw3ICsxMDQwLDcgQEAKICAgICByZWxlYXNlUmVjb3JkaW5nRnJhbWUoZnJhbWUpOwogfQogCi12b2lkIENhbWVyYVNvdXJjZTo6c2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgewordm9pZCBDYW1lcmFTb3VyY2U6OnNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKSB7CiAgICAgQUxPR1YoInNpZ25hbEJ1ZmZlclJldHVybmVkOiAlcCIsIGJ1ZmZlci0+ZGF0YSgpKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIGZvciAoTGlzdDxzcDxJTWVtb3J5PiA+OjppdGVyYXRvciBpdCA9IG1GcmFtZXNCZWluZ0VuY29kZWQuYmVnaW4oKTsKQEAgLTEwNTksNyArMTA1OSw3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYVNvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKICAgICBBTE9HVigicmVhZCIpOwogCiAgICAgKmJ1ZmZlciA9IE5VTEw7CkBAIC0xMTAwLDcgKzExMDAsNyBAQAogICAgICAgICAqYnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKGZyYW1lLT5wb2ludGVyKCksIGZyYW1lLT5zaXplKCkpOwogICAgICAgICAoKmJ1ZmZlciktPnNldE9ic2VydmVyKHRoaXMpOwogICAgICAgICAoKmJ1ZmZlciktPmFkZF9yZWYoKTsKLSAgICAgICAgKCpidWZmZXIpLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIGZyYW1lVGltZSk7CisgICAgICAgICgqYnVmZmVyKS0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIGZyYW1lVGltZSk7CiAgICAgfQogICAgIHJldHVybiBPSzsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuY3BwCmluZGV4IDk3MDUyNmEuLjNhZDgyZDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlVGltZUxhcHNlLmNwcApAQCAtMTY4LDcgKzE2OCw3IEBACiAgICAgcmV0dXJuIGlzU3VjY2Vzc2Z1bDsKIH0KIAotdm9pZCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OnNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyKiBidWZmZXIpIHsKK3ZvaWQgQ2FtZXJhU291cmNlVGltZUxhcHNlOjpzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlckJhc2UqIGJ1ZmZlcikgewogICAgIEFMT0dWKCJzaWduYWxCdWZmZXJSZXR1cm5lZCIpOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtUXVpY2tTdG9wTG9jayk7CiAgICAgaWYgKG1RdWlja1N0b3AgJiYgKGJ1ZmZlciA9PSBtTGFzdFJlYWRCdWZmZXJDb3B5KSkgewpAQCAtMTgwLDkgKzE4MCw5IEBACiB9CiAKIHZvaWQgY3JlYXRlTWVkaWFCdWZmZXJDb3B5KAotICAgICAgICBjb25zdCBNZWRpYUJ1ZmZlciYgc291cmNlQnVmZmVyLAorICAgICAgICBjb25zdCBNZWRpYUJ1ZmZlckJhc2UmIHNvdXJjZUJ1ZmZlciwKICAgICAgICAgaW50NjRfdCBmcmFtZVRpbWUsCi0gICAgICAgIE1lZGlhQnVmZmVyICoqbmV3QnVmZmVyKSB7CisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm5ld0J1ZmZlcikgewogCiAgICAgQUxPR1YoImNyZWF0ZU1lZGlhQnVmZmVyQ29weSIpOwogICAgIHNpemVfdCBzb3VyY2VTaXplID0gc291cmNlQnVmZmVyLnNpemUoKTsKQEAgLTE5MSwyMCArMTkxLDIwIEBACiAgICAgKCpuZXdCdWZmZXIpID0gbmV3IE1lZGlhQnVmZmVyKHNvdXJjZVNpemUpOwogICAgIG1lbWNweSgoKm5ld0J1ZmZlciktPmRhdGEoKSwgc291cmNlUG9pbnRlciwgc291cmNlU2l6ZSk7CiAKLSAgICAoKm5ld0J1ZmZlciktPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgZnJhbWVUaW1lKTsKKyAgICAoKm5ld0J1ZmZlciktPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCBmcmFtZVRpbWUpOwogfQogCi12b2lkIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6ZmlsbExhc3RSZWFkQnVmZmVyQ29weShNZWRpYUJ1ZmZlciYgc291cmNlQnVmZmVyKSB7Cit2b2lkIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6ZmlsbExhc3RSZWFkQnVmZmVyQ29weShNZWRpYUJ1ZmZlckJhc2UmIHNvdXJjZUJ1ZmZlcikgewogICAgIEFMT0dWKCJmaWxsTGFzdFJlYWRCdWZmZXJDb3B5Iik7CiAgICAgaW50NjRfdCBmcmFtZVRpbWU7Ci0gICAgQ0hFQ0soc291cmNlQnVmZmVyLm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZmcmFtZVRpbWUpKTsKKyAgICBDSEVDSyhzb3VyY2VCdWZmZXIubWV0YV9kYXRhKCkuZmluZEludDY0KGtLZXlUaW1lLCAmZnJhbWVUaW1lKSk7CiAgICAgY3JlYXRlTWVkaWFCdWZmZXJDb3B5KHNvdXJjZUJ1ZmZlciwgZnJhbWVUaW1lLCAmbUxhc3RSZWFkQnVmZmVyQ29weSk7CiAgICAgbUxhc3RSZWFkQnVmZmVyQ29weS0+YWRkX3JlZigpOwogICAgIG1MYXN0UmVhZEJ1ZmZlckNvcHktPnNldE9ic2VydmVyKHRoaXMpOwogfQogCiBzdGF0dXNfdCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CiAgICAgQUxPR1YoInJlYWQiKTsKICAgICBpZiAobUxhc3RSZWFkQnVmZmVyQ29weSA9PSBOVUxMKSB7CiAgICAgICAgIG1MYXN0UmVhZFN0YXR1cyA9IENhbWVyYVNvdXJjZTo6cmVhZChidWZmZXIsIG9wdGlvbnMpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9EYXRhU291cmNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIyMDUzZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9EYXRhU291cmNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiRGF0YVNvdXJjZSIKLQotI2luY2x1ZGUgImluY2x1ZGUvQ2FsbGJhY2tEYXRhU291cmNlLmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9IVFRQQmFzZS5oIgotI2luY2x1ZGUgImluY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9JRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBDb25uZWN0aW9uLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVVSSVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhSFRUUC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZURhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0KLSNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1ib29sIERhdGFTb3VyY2U6OmdldFVJbnQxNihvZmY2NF90IG9mZnNldCwgdWludDE2X3QgKngpIHsKLSAgICAqeCA9IDA7Ci0KLSAgICB1aW50OF90IGJ5dGVbMl07Ci0gICAgaWYgKHJlYWRBdChvZmZzZXQsIGJ5dGUsIDIpICE9IDIpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgICp4ID0gKGJ5dGVbMF0gPDwgOCkgfCBieXRlWzFdOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgRGF0YVNvdXJjZTo6Z2V0VUludDI0KG9mZjY0X3Qgb2Zmc2V0LCB1aW50MzJfdCAqeCkgewotICAgICp4ID0gMDsKLQotICAgIHVpbnQ4X3QgYnl0ZVszXTsKLSAgICBpZiAocmVhZEF0KG9mZnNldCwgYnl0ZSwgMykgIT0gMykgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgKnggPSAoYnl0ZVswXSA8PCAxNikgfCAoYnl0ZVsxXSA8PCA4KSB8IGJ5dGVbMl07Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBEYXRhU291cmNlOjpnZXRVSW50MzIob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4KSB7Ci0gICAgKnggPSAwOwotCi0gICAgdWludDMyX3QgdG1wOwotICAgIGlmIChyZWFkQXQob2Zmc2V0LCAmdG1wLCA0KSAhPSA0KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAqeCA9IG50b2hsKHRtcCk7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBEYXRhU291cmNlOjpnZXRVSW50NjQob2ZmNjRfdCBvZmZzZXQsIHVpbnQ2NF90ICp4KSB7Ci0gICAgKnggPSAwOwotCi0gICAgdWludDY0X3QgdG1wOwotICAgIGlmIChyZWFkQXQob2Zmc2V0LCAmdG1wLCA4KSAhPSA4KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAqeCA9IG50b2g2NCh0bXApOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgRGF0YVNvdXJjZTo6Z2V0VUludDE2VmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MTZfdCAqeCwgc2l6ZV90IHNpemUpIHsKLSAgICBpZiAoc2l6ZSA9PSAyKSB7Ci0gICAgICAgIHJldHVybiBnZXRVSW50MTYob2Zmc2V0LCB4KTsKLSAgICB9Ci0gICAgaWYgKHNpemUgPT0gMSkgewotICAgICAgICB1aW50OF90IHRtcDsKLSAgICAgICAgaWYgKHJlYWRBdChvZmZzZXQsICZ0bXAsIDEpID09IDEpIHsKLSAgICAgICAgICAgICp4ID0gdG1wOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIERhdGFTb3VyY2U6OmdldFVJbnQzMlZhcihvZmY2NF90IG9mZnNldCwgdWludDMyX3QgKngsIHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKHNpemUgPT0gNCkgewotICAgICAgICByZXR1cm4gZ2V0VUludDMyKG9mZnNldCwgeCk7Ci0gICAgfQotICAgIGlmIChzaXplID09IDIpIHsKLSAgICAgICAgdWludDE2X3QgdG1wOwotICAgICAgICBpZiAoZ2V0VUludDE2KG9mZnNldCwgJnRtcCkpIHsKLSAgICAgICAgICAgICp4ID0gdG1wOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIERhdGFTb3VyY2U6OmdldFVJbnQ2NFZhcihvZmY2NF90IG9mZnNldCwgdWludDY0X3QgKngsIHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKHNpemUgPT0gOCkgewotICAgICAgICByZXR1cm4gZ2V0VUludDY0KG9mZnNldCwgeCk7Ci0gICAgfQotICAgIGlmIChzaXplID09IDQpIHsKLSAgICAgICAgdWludDMyX3QgdG1wOwotICAgICAgICBpZiAoZ2V0VUludDMyKG9mZnNldCwgJnRtcCkpIHsKLSAgICAgICAgICAgICp4ID0gdG1wOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0dXNfdCBEYXRhU291cmNlOjpnZXRTaXplKG9mZjY0X3QgKnNpemUpIHsKLSAgICAqc2l6ZSA9IDA7Ci0KLSAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci19Ci0KLXNwPElEYXRhU291cmNlPiBEYXRhU291cmNlOjpnZXRJRGF0YVNvdXJjZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbnVsbHB0cjsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotLy8gc3RhdGljCi1zcDxEYXRhU291cmNlPiBEYXRhU291cmNlOjpDcmVhdGVGcm9tVVJJKAotICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAotICAgICAgICBjb25zdCBjaGFyICp1cmksCi0gICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAotICAgICAgICBTdHJpbmc4ICpjb250ZW50VHlwZSwKLSAgICAgICAgSFRUUEJhc2UgKmh0dHBTb3VyY2UpIHsKLSAgICBpZiAoY29udGVudFR5cGUgIT0gTlVMTCkgewotICAgICAgICAqY29udGVudFR5cGUgPSAiIjsKLSAgICB9Ci0KLSAgICBzcDxEYXRhU291cmNlPiBzb3VyY2U7Ci0gICAgaWYgKCFzdHJuY2FzZWNtcCgiZmlsZTovLyIsIHVyaSwgNykpIHsKLSAgICAgICAgc291cmNlID0gbmV3IEZpbGVTb3VyY2UodXJpICsgNyk7Ci0gICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAoImh0dHA6Ly8iLCB1cmksIDcpIHx8ICFzdHJuY2FzZWNtcCgiaHR0cHM6Ly8iLCB1cmksIDgpKSB7Ci0gICAgICAgIGlmIChodHRwU2VydmljZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBodHRwIHNlcnZpY2UhIik7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChodHRwU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgICAgIHNwPElNZWRpYUhUVFBDb25uZWN0aW9uPiBjb25uID0gaHR0cFNlcnZpY2UtPm1ha2VIVFRQQ29ubmVjdGlvbigpOwotICAgICAgICAgICAgaWYgKGNvbm4gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gbWFrZSBodHRwIGNvbm5lY3Rpb24gZnJvbSBodHRwIHNlcnZpY2UhIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBodHRwU291cmNlID0gbmV3IE1lZGlhSFRUUChjb25uKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZzggY2FjaGVDb25maWc7Ci0gICAgICAgIGJvb2wgZGlzY29ubmVjdEF0SGlnaHdhdGVybWFyayA9IGZhbHNlOwotICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBub25DYWNoZVNwZWNpZmljSGVhZGVyczsKLSAgICAgICAgaWYgKGhlYWRlcnMgIT0gTlVMTCkgewotICAgICAgICAgICAgbm9uQ2FjaGVTcGVjaWZpY0hlYWRlcnMgPSAqaGVhZGVyczsKLSAgICAgICAgICAgIE51Q2FjaGVkU291cmNlMjo6UmVtb3ZlQ2FjaGVTcGVjaWZpY0hlYWRlcnMoCi0gICAgICAgICAgICAgICAgICAgICZub25DYWNoZVNwZWNpZmljSGVhZGVycywKLSAgICAgICAgICAgICAgICAgICAgJmNhY2hlQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICAmZGlzY29ubmVjdEF0SGlnaHdhdGVybWFyayk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaHR0cFNvdXJjZS0+Y29ubmVjdCh1cmksICZub25DYWNoZVNwZWNpZmljSGVhZGVycykgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY29ubmVjdCBodHRwIHNvdXJjZSEiKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbnRlbnRUeXBlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICpjb250ZW50VHlwZSA9IGh0dHBTb3VyY2UtPmdldE1JTUVUeXBlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzb3VyY2UgPSBOdUNhY2hlZFNvdXJjZTI6OkNyZWF0ZSgKLSAgICAgICAgICAgICAgICBodHRwU291cmNlLAotICAgICAgICAgICAgICAgIGNhY2hlQ29uZmlnLmlzRW1wdHkoKSA/IE5VTEwgOiBjYWNoZUNvbmZpZy5zdHJpbmcoKSwKLSAgICAgICAgICAgICAgICBkaXNjb25uZWN0QXRIaWdod2F0ZXJtYXJrKTsKLSAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcCgiZGF0YToiLCB1cmksIDUpKSB7Ci0gICAgICAgIHNvdXJjZSA9IERhdGFVUklTb3VyY2U6OkNyZWF0ZSh1cmkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIEFzc3VtZSBpdCdzIGEgZmlsZW5hbWUuCi0gICAgICAgIHNvdXJjZSA9IG5ldyBGaWxlU291cmNlKHVyaSk7Ci0gICAgfQotCi0gICAgaWYgKHNvdXJjZSA9PSBOVUxMIHx8IHNvdXJjZS0+aW5pdENoZWNrKCkgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIHNvdXJjZTsKLX0KLQotc3A8RGF0YVNvdXJjZT4gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbUZkKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKSB7Ci0gICAgc3A8RmlsZVNvdXJjZT4gc291cmNlID0gbmV3IEZpbGVTb3VyY2UoZmQsIG9mZnNldCwgbGVuZ3RoKTsKLSAgICByZXR1cm4gc291cmNlLT5pbml0Q2hlY2soKSAhPSBPSyA/IG51bGxwdHIgOiBzb3VyY2U7Ci19Ci0KLXNwPERhdGFTb3VyY2U+IERhdGFTb3VyY2U6OkNyZWF0ZU1lZGlhSFRUUChjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlKSB7Ci0gICAgaWYgKGh0dHBTZXJ2aWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgc3A8SU1lZGlhSFRUUENvbm5lY3Rpb24+IGNvbm4gPSBodHRwU2VydmljZS0+bWFrZUhUVFBDb25uZWN0aW9uKCk7Ci0gICAgaWYgKGNvbm4gPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhSFRUUChjb25uKTsKLSAgICB9Ci19Ci0KLXNwPERhdGFTb3VyY2U+IERhdGFTb3VyY2U6OkNyZWF0ZUZyb21JRGF0YVNvdXJjZShjb25zdCBzcDxJRGF0YVNvdXJjZT4gJnNvdXJjZSkgewotICAgIHJldHVybiBuZXcgVGlueUNhY2hlU291cmNlKG5ldyBDYWxsYmFja0RhdGFTb3VyY2Uoc291cmNlKSk7Ci19Ci0KLVN0cmluZzggRGF0YVNvdXJjZTo6Z2V0TUlNRVR5cGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIFN0cmluZzgoImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOwotfQotCi1zcDxJRGF0YVNvdXJjZT4gRGF0YVNvdXJjZTo6YXNJRGF0YVNvdXJjZSgpIHsKLSAgICByZXR1cm4gUmVtb3RlRGF0YVNvdXJjZTo6d3JhcChzcDxEYXRhU291cmNlPih0aGlzKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9EYXRhU291cmNlRmFjdG9yeS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9EYXRhU291cmNlRmFjdG9yeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRiZjBjYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFTb3VyY2VGYWN0b3J5LmNwcApAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkRhdGFTb3VyY2UiCisKKyNpbmNsdWRlICJpbmNsdWRlL0hUVFBCYXNlLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaCIKKworI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUENvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUhUVFBTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZUZhY3RvcnkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhVVJJU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhSFRUUC5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBzdGF0aWMKK3NwPERhdGFTb3VyY2U+IERhdGFTb3VyY2VGYWN0b3J5OjpDcmVhdGVGcm9tVVJJKAorICAgICAgICBjb25zdCBzcDxNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCisgICAgICAgIFN0cmluZzggKmNvbnRlbnRUeXBlLAorICAgICAgICBIVFRQQmFzZSAqaHR0cFNvdXJjZSkgeworICAgIGlmIChjb250ZW50VHlwZSAhPSBOVUxMKSB7CisgICAgICAgICpjb250ZW50VHlwZSA9ICIiOworICAgIH0KKworICAgIHNwPERhdGFTb3VyY2U+IHNvdXJjZTsKKyAgICBpZiAoIXN0cm5jYXNlY21wKCJmaWxlOi8vIiwgdXJpLCA3KSkgeworICAgICAgICBzb3VyY2UgPSBuZXcgRmlsZVNvdXJjZSh1cmkgKyA3KTsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcCgiaHR0cDovLyIsIHVyaSwgNykgfHwgIXN0cm5jYXNlY21wKCJodHRwczovLyIsIHVyaSwgOCkpIHsKKyAgICAgICAgaWYgKGh0dHBTZXJ2aWNlID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGh0dHAgc2VydmljZSEiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGh0dHBTb3VyY2UgPT0gTlVMTCkgeworICAgICAgICAgICAgc3A8TWVkaWFIVFRQQ29ubmVjdGlvbj4gY29ubiA9IGh0dHBTZXJ2aWNlLT5tYWtlSFRUUENvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgIGlmIChjb25uID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG1ha2UgaHR0cCBjb25uZWN0aW9uIGZyb20gaHR0cCBzZXJ2aWNlISIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaHR0cFNvdXJjZSA9IG5ldyBNZWRpYUhUVFAoY29ubik7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmc4IGNhY2hlQ29uZmlnOworICAgICAgICBib29sIGRpc2Nvbm5lY3RBdEhpZ2h3YXRlcm1hcmsgPSBmYWxzZTsKKyAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbm9uQ2FjaGVTcGVjaWZpY0hlYWRlcnM7CisgICAgICAgIGlmIChoZWFkZXJzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG5vbkNhY2hlU3BlY2lmaWNIZWFkZXJzID0gKmhlYWRlcnM7CisgICAgICAgICAgICBOdUNhY2hlZFNvdXJjZTI6OlJlbW92ZUNhY2hlU3BlY2lmaWNIZWFkZXJzKAorICAgICAgICAgICAgICAgICAgICAmbm9uQ2FjaGVTcGVjaWZpY0hlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICZjYWNoZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgJmRpc2Nvbm5lY3RBdEhpZ2h3YXRlcm1hcmspOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGh0dHBTb3VyY2UtPmNvbm5lY3QodXJpLCAmbm9uQ2FjaGVTcGVjaWZpY0hlYWRlcnMpICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNvbm5lY3QgaHR0cCBzb3VyY2UhIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb250ZW50VHlwZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAqY29udGVudFR5cGUgPSBodHRwU291cmNlLT5nZXRNSU1FVHlwZSgpOworICAgICAgICB9CisKKyAgICAgICAgc291cmNlID0gTnVDYWNoZWRTb3VyY2UyOjpDcmVhdGUoCisgICAgICAgICAgICAgICAgaHR0cFNvdXJjZSwKKyAgICAgICAgICAgICAgICBjYWNoZUNvbmZpZy5pc0VtcHR5KCkgPyBOVUxMIDogY2FjaGVDb25maWcuc3RyaW5nKCksCisgICAgICAgICAgICAgICAgZGlzY29ubmVjdEF0SGlnaHdhdGVybWFyayk7CisgICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAoImRhdGE6IiwgdXJpLCA1KSkgeworICAgICAgICBzb3VyY2UgPSBEYXRhVVJJU291cmNlOjpDcmVhdGUodXJpKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBBc3N1bWUgaXQncyBhIGZpbGVuYW1lLgorICAgICAgICBzb3VyY2UgPSBuZXcgRmlsZVNvdXJjZSh1cmkpOworICAgIH0KKworICAgIGlmIChzb3VyY2UgPT0gTlVMTCB8fCBzb3VyY2UtPmluaXRDaGVjaygpICE9IE9LKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBzb3VyY2U7Cit9CisKK3NwPERhdGFTb3VyY2U+IERhdGFTb3VyY2VGYWN0b3J5OjpDcmVhdGVGcm9tRmQoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpIHsKKyAgICBzcDxGaWxlU291cmNlPiBzb3VyY2UgPSBuZXcgRmlsZVNvdXJjZShmZCwgb2Zmc2V0LCBsZW5ndGgpOworICAgIHJldHVybiBzb3VyY2UtPmluaXRDaGVjaygpICE9IE9LID8gbnVsbHB0ciA6IHNvdXJjZTsKK30KKworc3A8RGF0YVNvdXJjZT4gRGF0YVNvdXJjZUZhY3Rvcnk6OkNyZWF0ZU1lZGlhSFRUUChjb25zdCBzcDxNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UpIHsKKyAgICBpZiAoaHR0cFNlcnZpY2UgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzcDxNZWRpYUhUVFBDb25uZWN0aW9uPiBjb25uID0gaHR0cFNlcnZpY2UtPm1ha2VIVFRQQ29ubmVjdGlvbigpOworICAgIGlmIChjb25uID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUhUVFAoY29ubik7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRVNEUy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9FU0RTLmNwcAppbmRleCBjMzE3MjBkLi5lYTA1OWU4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9FU0RTLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9FU0RTLmNwcApAQCAtMTgsNyArMTgsNyBAQAogI2RlZmluZSBMT0dfVEFHICJFU0RTIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgogCiAjaW5jbHVkZSAiaW5jbHVkZS9FU0RTLmgiCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZMQUNFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRkxBQ0V4dHJhY3Rvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiODhlNWQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRkxBQ0V4dHJhY3Rvci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4NjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiRkxBQ0V4dHJhY3RvciIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgImluY2x1ZGUvRkxBQ0V4dHJhY3Rvci5oIgotLy8gVm9yYmlzIGNvbW1lbnRzCi0jaW5jbHVkZSAiaW5jbHVkZS9PZ2dFeHRyYWN0b3IuaCIKLS8vIGxpYkZMQUMgcGFyc2VyCi0jaW5jbHVkZSAiRkxBQy9zdHJlYW1fZGVjb2Rlci5oIgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIEZMQUNQYXJzZXI7Ci0KLWNsYXNzIEZMQUNTb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UgewotCi1wdWJsaWM6Ci0gICAgRkxBQ1NvdXJjZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZkYXRhU291cmNlLAotICAgICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZ0cmFja01ldGFkYXRhKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkZMQUNTb3VyY2UoKTsKLQotcHJpdmF0ZToKLSAgICBzcDxEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKLSAgICBzcDxNZXRhRGF0YT4gbVRyYWNrTWV0YWRhdGE7Ci0gICAgc3A8RkxBQ1BhcnNlcj4gbVBhcnNlcjsKLSAgICBib29sIG1Jbml0Q2hlY2s7Ci0gICAgYm9vbCBtU3RhcnRlZDsKLQotICAgIHN0YXR1c190IGluaXQoKTsKLQotICAgIC8vIG5vIGNvcHkgY29uc3RydWN0b3Igb3IgYXNzaWdubWVudAotICAgIEZMQUNTb3VyY2UoY29uc3QgRkxBQ1NvdXJjZSAmKTsKLSAgICBGTEFDU291cmNlICZvcGVyYXRvcj0oY29uc3QgRkxBQ1NvdXJjZSAmKTsKLQotfTsKLQotLy8gRkxBQ1BhcnNlciB3cmFwcyBhIEMgbGliRkxBQyBwYXJzZXIgYWthIHN0cmVhbSBkZWNvZGVyCi0KLWNsYXNzIEZMQUNQYXJzZXIgOiBwdWJsaWMgUmVmQmFzZSB7Ci0KLXB1YmxpYzoKLSAgICBlbnVtIHsKLSAgICAgICAga01heENoYW5uZWxzID0gOCwKLSAgICB9OwotCi0gICAgZXhwbGljaXQgRkxBQ1BhcnNlcigKLSAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJmRhdGFTb3VyY2UsCi0gICAgICAgIC8vIElmIG1ldGFkYXRhIHBvaW50ZXJzIGFyZW4ndCBwcm92aWRlZCwgd2UgZG9uJ3QgZmlsbCB0aGVtCi0gICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmZmlsZU1ldGFkYXRhID0gMCwKLSAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZ0cmFja01ldGFkYXRhID0gMCk7Ci0KLSAgICBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtSW5pdENoZWNrOwotICAgIH0KLQotICAgIC8vIHN0cmVhbSBwcm9wZXJ0aWVzCi0gICAgdW5zaWduZWQgZ2V0TWF4QmxvY2tTaXplKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVN0cmVhbUluZm8ubWF4X2Jsb2Nrc2l6ZTsKLSAgICB9Ci0gICAgdW5zaWduZWQgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1TdHJlYW1JbmZvLnNhbXBsZV9yYXRlOwotICAgIH0KLSAgICB1bnNpZ25lZCBnZXRDaGFubmVscygpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1TdHJlYW1JbmZvLmNoYW5uZWxzOwotICAgIH0KLSAgICB1bnNpZ25lZCBnZXRCaXRzUGVyU2FtcGxlKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVN0cmVhbUluZm8uYml0c19wZXJfc2FtcGxlOwotICAgIH0KLSAgICBGTEFDX191aW50NjQgZ2V0VG90YWxTYW1wbGVzKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVN0cmVhbUluZm8udG90YWxfc2FtcGxlczsKLSAgICB9Ci0KLSAgICAvLyBtZWRpYSBidWZmZXJzCi0gICAgdm9pZCBhbGxvY2F0ZUJ1ZmZlcnMoKTsKLSAgICB2b2lkIHJlbGVhc2VCdWZmZXJzKCk7Ci0gICAgTWVkaWFCdWZmZXIgKnJlYWRCdWZmZXIoKSB7Ci0gICAgICAgIHJldHVybiByZWFkQnVmZmVyKGZhbHNlLCAwTEwpOwotICAgIH0KLSAgICBNZWRpYUJ1ZmZlciAqcmVhZEJ1ZmZlcihGTEFDX191aW50NjQgc2FtcGxlKSB7Ci0gICAgICAgIHJldHVybiByZWFkQnVmZmVyKHRydWUsIHNhbXBsZSk7Ci0gICAgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+RkxBQ1BhcnNlcigpOwotCi1wcml2YXRlOgotICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOwotICAgIHNwPE1ldGFEYXRhPiBtRmlsZU1ldGFkYXRhOwotICAgIHNwPE1ldGFEYXRhPiBtVHJhY2tNZXRhZGF0YTsKLSAgICBib29sIG1Jbml0Q2hlY2s7Ci0KLSAgICAvLyBtZWRpYSBidWZmZXJzCi0gICAgc2l6ZV90IG1NYXhCdWZmZXJTaXplOwotICAgIE1lZGlhQnVmZmVyR3JvdXAgKm1Hcm91cDsKLSAgICB2b2lkICgqbUNvcHkpKHNob3J0ICpkc3QsIGNvbnN0IGludCAqIHNyY1trTWF4Q2hhbm5lbHNdLCB1bnNpZ25lZCBuU2FtcGxlcywgdW5zaWduZWQgbkNoYW5uZWxzKTsKLQotICAgIC8vIGhhbmRsZSB0byB1bmRlcmx5aW5nIGxpYkZMQUMgcGFyc2VyCi0gICAgRkxBQ19fU3RyZWFtRGVjb2RlciAqbURlY29kZXI7Ci0KLSAgICAvLyBjdXJyZW50IHBvc2l0aW9uIHdpdGhpbiB0aGUgZGF0YSBzb3VyY2UKLSAgICBvZmY2NF90IG1DdXJyZW50UG9zOwotICAgIGJvb2wgbUVPRjsKLQotICAgIC8vIGNhY2hlZCB3aGVuIHRoZSBTVFJFQU1JTkZPIG1ldGFkYXRhIGlzIHBhcnNlZCBieSBsaWJGTEFDCi0gICAgRkxBQ19fU3RyZWFtTWV0YWRhdGFfU3RyZWFtSW5mbyBtU3RyZWFtSW5mbzsKLSAgICBib29sIG1TdHJlYW1JbmZvVmFsaWQ7Ci0KLSAgICAvLyBjYWNoZWQgd2hlbiBhIGRlY29kZWQgUENNIGJsb2NrIGlzICJ3cml0dGVuIiBieSBsaWJGTEFDIHBhcnNlcgotICAgIGJvb2wgbVdyaXRlUmVxdWVzdGVkOwotICAgIGJvb2wgbVdyaXRlQ29tcGxldGVkOwotICAgIEZMQUNfX0ZyYW1lSGVhZGVyIG1Xcml0ZUhlYWRlcjsKLSAgICBGTEFDX19pbnQzMiBjb25zdCAqIG1Xcml0ZUJ1ZmZlcltrTWF4Q2hhbm5lbHNdOwotCi0gICAgLy8gbW9zdCByZWNlbnQgZXJyb3IgcmVwb3J0ZWQgYnkgbGliRkxBQyBwYXJzZXIKLSAgICBGTEFDX19TdHJlYW1EZWNvZGVyRXJyb3JTdGF0dXMgbUVycm9yU3RhdHVzOwotCi0gICAgc3RhdHVzX3QgaW5pdCgpOwotICAgIE1lZGlhQnVmZmVyICpyZWFkQnVmZmVyKGJvb2wgZG9TZWVrLCBGTEFDX191aW50NjQgc2FtcGxlKTsKLQotICAgIC8vIG5vIGNvcHkgY29uc3RydWN0b3Igb3IgYXNzaWdubWVudAotICAgIEZMQUNQYXJzZXIoY29uc3QgRkxBQ1BhcnNlciAmKTsKLSAgICBGTEFDUGFyc2VyICZvcGVyYXRvcj0oY29uc3QgRkxBQ1BhcnNlciAmKTsKLQotICAgIC8vIEZMQUMgcGFyc2VyIGNhbGxiYWNrcyBhcyBDKysgaW5zdGFuY2UgbWV0aG9kcwotICAgIEZMQUNfX1N0cmVhbURlY29kZXJSZWFkU3RhdHVzIHJlYWRDYWxsYmFjaygKLSAgICAgICAgICAgIEZMQUNfX2J5dGUgYnVmZmVyW10sIHNpemVfdCAqYnl0ZXMpOwotICAgIEZMQUNfX1N0cmVhbURlY29kZXJTZWVrU3RhdHVzIHNlZWtDYWxsYmFjaygKLSAgICAgICAgICAgIEZMQUNfX3VpbnQ2NCBhYnNvbHV0ZV9ieXRlX29mZnNldCk7Ci0gICAgRkxBQ19fU3RyZWFtRGVjb2RlclRlbGxTdGF0dXMgdGVsbENhbGxiYWNrKAotICAgICAgICAgICAgRkxBQ19fdWludDY0ICphYnNvbHV0ZV9ieXRlX29mZnNldCk7Ci0gICAgRkxBQ19fU3RyZWFtRGVjb2Rlckxlbmd0aFN0YXR1cyBsZW5ndGhDYWxsYmFjaygKLSAgICAgICAgICAgIEZMQUNfX3VpbnQ2NCAqc3RyZWFtX2xlbmd0aCk7Ci0gICAgRkxBQ19fYm9vbCBlb2ZDYWxsYmFjaygpOwotICAgIEZMQUNfX1N0cmVhbURlY29kZXJXcml0ZVN0YXR1cyB3cml0ZUNhbGxiYWNrKAotICAgICAgICAgICAgY29uc3QgRkxBQ19fRnJhbWUgKmZyYW1lLCBjb25zdCBGTEFDX19pbnQzMiAqIGNvbnN0IGJ1ZmZlcltdKTsKLSAgICB2b2lkIG1ldGFkYXRhQ2FsbGJhY2soY29uc3QgRkxBQ19fU3RyZWFtTWV0YWRhdGEgKm1ldGFkYXRhKTsKLSAgICB2b2lkIGVycm9yQ2FsbGJhY2soRkxBQ19fU3RyZWFtRGVjb2RlckVycm9yU3RhdHVzIHN0YXR1cyk7Ci0KLSAgICAvLyBGTEFDIHBhcnNlciBjYWxsYmFja3MgYXMgQy1jYWxsYWJsZSBmdW5jdGlvbnMKLSAgICBzdGF0aWMgRkxBQ19fU3RyZWFtRGVjb2RlclJlYWRTdGF0dXMgcmVhZF9jYWxsYmFjaygKLSAgICAgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKmRlY29kZXIsCi0gICAgICAgICAgICBGTEFDX19ieXRlIGJ1ZmZlcltdLCBzaXplX3QgKmJ5dGVzLAotICAgICAgICAgICAgdm9pZCAqY2xpZW50X2RhdGEpOwotICAgIHN0YXRpYyBGTEFDX19TdHJlYW1EZWNvZGVyU2Vla1N0YXR1cyBzZWVrX2NhbGxiYWNrKAotICAgICAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqZGVjb2RlciwKLSAgICAgICAgICAgIEZMQUNfX3VpbnQ2NCBhYnNvbHV0ZV9ieXRlX29mZnNldCwKLSAgICAgICAgICAgIHZvaWQgKmNsaWVudF9kYXRhKTsKLSAgICBzdGF0aWMgRkxBQ19fU3RyZWFtRGVjb2RlclRlbGxTdGF0dXMgdGVsbF9jYWxsYmFjaygKLSAgICAgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKmRlY29kZXIsCi0gICAgICAgICAgICBGTEFDX191aW50NjQgKmFic29sdXRlX2J5dGVfb2Zmc2V0LAotICAgICAgICAgICAgdm9pZCAqY2xpZW50X2RhdGEpOwotICAgIHN0YXRpYyBGTEFDX19TdHJlYW1EZWNvZGVyTGVuZ3RoU3RhdHVzIGxlbmd0aF9jYWxsYmFjaygKLSAgICAgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKmRlY29kZXIsCi0gICAgICAgICAgICBGTEFDX191aW50NjQgKnN0cmVhbV9sZW5ndGgsCi0gICAgICAgICAgICB2b2lkICpjbGllbnRfZGF0YSk7Ci0gICAgc3RhdGljIEZMQUNfX2Jvb2wgZW9mX2NhbGxiYWNrKAotICAgICAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqZGVjb2RlciwKLSAgICAgICAgICAgIHZvaWQgKmNsaWVudF9kYXRhKTsKLSAgICBzdGF0aWMgRkxBQ19fU3RyZWFtRGVjb2RlcldyaXRlU3RhdHVzIHdyaXRlX2NhbGxiYWNrKAotICAgICAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqZGVjb2RlciwKLSAgICAgICAgICAgIGNvbnN0IEZMQUNfX0ZyYW1lICpmcmFtZSwgY29uc3QgRkxBQ19faW50MzIgKiBjb25zdCBidWZmZXJbXSwKLSAgICAgICAgICAgIHZvaWQgKmNsaWVudF9kYXRhKTsKLSAgICBzdGF0aWMgdm9pZCBtZXRhZGF0YV9jYWxsYmFjaygKLSAgICAgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKmRlY29kZXIsCi0gICAgICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1NZXRhZGF0YSAqbWV0YWRhdGEsCi0gICAgICAgICAgICB2b2lkICpjbGllbnRfZGF0YSk7Ci0gICAgc3RhdGljIHZvaWQgZXJyb3JfY2FsbGJhY2soCi0gICAgICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1EZWNvZGVyICpkZWNvZGVyLAotICAgICAgICAgICAgRkxBQ19fU3RyZWFtRGVjb2RlckVycm9yU3RhdHVzIHN0YXR1cywKLSAgICAgICAgICAgIHZvaWQgKmNsaWVudF9kYXRhKTsKLQotfTsKLQotLy8gVGhlIEZMQUMgcGFyc2VyIGNhbGxzIG91ciBDKysgc3RhdGljIGNhbGxiYWNrcyB1c2luZyBDIGNhbGxpbmcgY29udmVudGlvbnMsCi0vLyBpbnNpZGUgRkxBQ19fc3RyZWFtX2RlY29kZXJfcHJvY2Vzc191bnRpbF9lbmRfb2ZfbWV0YWRhdGEKLS8vIGFuZCBGTEFDX19zdHJlYW1fZGVjb2Rlcl9wcm9jZXNzX3NpbmdsZS4KLS8vIFdlIGltbWVkaWF0ZWx5IHRoZW4gY2FsbCBvdXIgY29ycmVzcG9uZGluZyBDKysgaW5zdGFuY2UgbWV0aG9kcwotLy8gd2l0aCB0aGUgc2FtZSBwYXJhbWV0ZXIgbGlzdCwgYnV0IGRpc2NhcmQgcmVkdW5kYW50IGluZm9ybWF0aW9uLgotCi1GTEFDX19TdHJlYW1EZWNvZGVyUmVhZFN0YXR1cyBGTEFDUGFyc2VyOjpyZWFkX2NhbGxiYWNrKAotICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1EZWNvZGVyICogLyogZGVjb2RlciAqLywgRkxBQ19fYnl0ZSBidWZmZXJbXSwKLSAgICAgICAgc2l6ZV90ICpieXRlcywgdm9pZCAqY2xpZW50X2RhdGEpCi17Ci0gICAgcmV0dXJuICgoRkxBQ1BhcnNlciAqKSBjbGllbnRfZGF0YSktPnJlYWRDYWxsYmFjayhidWZmZXIsIGJ5dGVzKTsKLX0KLQotRkxBQ19fU3RyZWFtRGVjb2RlclNlZWtTdGF0dXMgRkxBQ1BhcnNlcjo6c2Vla19jYWxsYmFjaygKLSAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqIC8qIGRlY29kZXIgKi8sCi0gICAgICAgIEZMQUNfX3VpbnQ2NCBhYnNvbHV0ZV9ieXRlX29mZnNldCwgdm9pZCAqY2xpZW50X2RhdGEpCi17Ci0gICAgcmV0dXJuICgoRkxBQ1BhcnNlciAqKSBjbGllbnRfZGF0YSktPnNlZWtDYWxsYmFjayhhYnNvbHV0ZV9ieXRlX29mZnNldCk7Ci19Ci0KLUZMQUNfX1N0cmVhbURlY29kZXJUZWxsU3RhdHVzIEZMQUNQYXJzZXI6OnRlbGxfY2FsbGJhY2soCi0gICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKiAvKiBkZWNvZGVyICovLAotICAgICAgICBGTEFDX191aW50NjQgKmFic29sdXRlX2J5dGVfb2Zmc2V0LCB2b2lkICpjbGllbnRfZGF0YSkKLXsKLSAgICByZXR1cm4gKChGTEFDUGFyc2VyICopIGNsaWVudF9kYXRhKS0+dGVsbENhbGxiYWNrKGFic29sdXRlX2J5dGVfb2Zmc2V0KTsKLX0KLQotRkxBQ19fU3RyZWFtRGVjb2Rlckxlbmd0aFN0YXR1cyBGTEFDUGFyc2VyOjpsZW5ndGhfY2FsbGJhY2soCi0gICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKiAvKiBkZWNvZGVyICovLAotICAgICAgICBGTEFDX191aW50NjQgKnN0cmVhbV9sZW5ndGgsIHZvaWQgKmNsaWVudF9kYXRhKQotewotICAgIHJldHVybiAoKEZMQUNQYXJzZXIgKikgY2xpZW50X2RhdGEpLT5sZW5ndGhDYWxsYmFjayhzdHJlYW1fbGVuZ3RoKTsKLX0KLQotRkxBQ19fYm9vbCBGTEFDUGFyc2VyOjplb2ZfY2FsbGJhY2soCi0gICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKiAvKiBkZWNvZGVyICovLCB2b2lkICpjbGllbnRfZGF0YSkKLXsKLSAgICByZXR1cm4gKChGTEFDUGFyc2VyICopIGNsaWVudF9kYXRhKS0+ZW9mQ2FsbGJhY2soKTsKLX0KLQotRkxBQ19fU3RyZWFtRGVjb2RlcldyaXRlU3RhdHVzIEZMQUNQYXJzZXI6OndyaXRlX2NhbGxiYWNrKAotICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1EZWNvZGVyICogLyogZGVjb2RlciAqLywgY29uc3QgRkxBQ19fRnJhbWUgKmZyYW1lLAotICAgICAgICBjb25zdCBGTEFDX19pbnQzMiAqIGNvbnN0IGJ1ZmZlcltdLCB2b2lkICpjbGllbnRfZGF0YSkKLXsKLSAgICByZXR1cm4gKChGTEFDUGFyc2VyICopIGNsaWVudF9kYXRhKS0+d3JpdGVDYWxsYmFjayhmcmFtZSwgYnVmZmVyKTsKLX0KLQotdm9pZCBGTEFDUGFyc2VyOjptZXRhZGF0YV9jYWxsYmFjaygKLSAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqIC8qIGRlY29kZXIgKi8sCi0gICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbU1ldGFkYXRhICptZXRhZGF0YSwgdm9pZCAqY2xpZW50X2RhdGEpCi17Ci0gICAgKChGTEFDUGFyc2VyICopIGNsaWVudF9kYXRhKS0+bWV0YWRhdGFDYWxsYmFjayhtZXRhZGF0YSk7Ci19Ci0KLXZvaWQgRkxBQ1BhcnNlcjo6ZXJyb3JfY2FsbGJhY2soCi0gICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKiAvKiBkZWNvZGVyICovLAotICAgICAgICBGTEFDX19TdHJlYW1EZWNvZGVyRXJyb3JTdGF0dXMgc3RhdHVzLCB2b2lkICpjbGllbnRfZGF0YSkKLXsKLSAgICAoKEZMQUNQYXJzZXIgKikgY2xpZW50X2RhdGEpLT5lcnJvckNhbGxiYWNrKHN0YXR1cyk7Ci19Ci0KLS8vIFRoZXNlIGFyZSB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFja3Mgd2l0aCBDKysgY2FsbGluZyBjb252ZW50aW9ucwotCi1GTEFDX19TdHJlYW1EZWNvZGVyUmVhZFN0YXR1cyBGTEFDUGFyc2VyOjpyZWFkQ2FsbGJhY2soCi0gICAgICAgIEZMQUNfX2J5dGUgYnVmZmVyW10sIHNpemVfdCAqYnl0ZXMpCi17Ci0gICAgc2l6ZV90IHJlcXVlc3RlZCA9ICpieXRlczsKLSAgICBzc2l6ZV90IGFjdHVhbCA9IG1EYXRhU291cmNlLT5yZWFkQXQobUN1cnJlbnRQb3MsIGJ1ZmZlciwgcmVxdWVzdGVkKTsKLSAgICBpZiAoMCA+IGFjdHVhbCkgewotICAgICAgICAqYnl0ZXMgPSAwOwotICAgICAgICByZXR1cm4gRkxBQ19fU1RSRUFNX0RFQ09ERVJfUkVBRF9TVEFUVVNfQUJPUlQ7Ci0gICAgfSBlbHNlIGlmICgwID09IGFjdHVhbCkgewotICAgICAgICAqYnl0ZXMgPSAwOwotICAgICAgICBtRU9GID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIEZMQUNfX1NUUkVBTV9ERUNPREVSX1JFQURfU1RBVFVTX0VORF9PRl9TVFJFQU07Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYXNzZXJ0KGFjdHVhbCA8PSByZXF1ZXN0ZWQpOwotICAgICAgICAqYnl0ZXMgPSBhY3R1YWw7Ci0gICAgICAgIG1DdXJyZW50UG9zICs9IGFjdHVhbDsKLSAgICAgICAgcmV0dXJuIEZMQUNfX1NUUkVBTV9ERUNPREVSX1JFQURfU1RBVFVTX0NPTlRJTlVFOwotICAgIH0KLX0KLQotRkxBQ19fU3RyZWFtRGVjb2RlclNlZWtTdGF0dXMgRkxBQ1BhcnNlcjo6c2Vla0NhbGxiYWNrKAotICAgICAgICBGTEFDX191aW50NjQgYWJzb2x1dGVfYnl0ZV9vZmZzZXQpCi17Ci0gICAgbUN1cnJlbnRQb3MgPSBhYnNvbHV0ZV9ieXRlX29mZnNldDsKLSAgICBtRU9GID0gZmFsc2U7Ci0gICAgcmV0dXJuIEZMQUNfX1NUUkVBTV9ERUNPREVSX1NFRUtfU1RBVFVTX09LOwotfQotCi1GTEFDX19TdHJlYW1EZWNvZGVyVGVsbFN0YXR1cyBGTEFDUGFyc2VyOjp0ZWxsQ2FsbGJhY2soCi0gICAgICAgIEZMQUNfX3VpbnQ2NCAqYWJzb2x1dGVfYnl0ZV9vZmZzZXQpCi17Ci0gICAgKmFic29sdXRlX2J5dGVfb2Zmc2V0ID0gbUN1cnJlbnRQb3M7Ci0gICAgcmV0dXJuIEZMQUNfX1NUUkVBTV9ERUNPREVSX1RFTExfU1RBVFVTX09LOwotfQotCi1GTEFDX19TdHJlYW1EZWNvZGVyTGVuZ3RoU3RhdHVzIEZMQUNQYXJzZXI6Omxlbmd0aENhbGxiYWNrKAotICAgICAgICBGTEFDX191aW50NjQgKnN0cmVhbV9sZW5ndGgpCi17Ci0gICAgb2ZmNjRfdCBzaXplOwotICAgIGlmIChPSyA9PSBtRGF0YVNvdXJjZS0+Z2V0U2l6ZSgmc2l6ZSkpIHsKLSAgICAgICAgKnN0cmVhbV9sZW5ndGggPSBzaXplOwotICAgICAgICByZXR1cm4gRkxBQ19fU1RSRUFNX0RFQ09ERVJfTEVOR1RIX1NUQVRVU19PSzsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gRkxBQ19fU1RSRUFNX0RFQ09ERVJfTEVOR1RIX1NUQVRVU19VTlNVUFBPUlRFRDsKLSAgICB9Ci19Ci0KLUZMQUNfX2Jvb2wgRkxBQ1BhcnNlcjo6ZW9mQ2FsbGJhY2soKQotewotICAgIHJldHVybiBtRU9GOwotfQotCi1GTEFDX19TdHJlYW1EZWNvZGVyV3JpdGVTdGF0dXMgRkxBQ1BhcnNlcjo6d3JpdGVDYWxsYmFjaygKLSAgICAgICAgY29uc3QgRkxBQ19fRnJhbWUgKmZyYW1lLCBjb25zdCBGTEFDX19pbnQzMiAqIGNvbnN0IGJ1ZmZlcltdKQotewotICAgIGlmIChtV3JpdGVSZXF1ZXN0ZWQpIHsKLSAgICAgICAgbVdyaXRlUmVxdWVzdGVkID0gZmFsc2U7Ci0gICAgICAgIC8vIEZMQUMgcGFyc2VyIGRvZXNuJ3QgZnJlZSBvciByZWFsbG9jIGJ1ZmZlciB1bnRpbCBuZXh0IGZyYW1lIG9yIGZpbmlzaAotICAgICAgICBtV3JpdGVIZWFkZXIgPSBmcmFtZS0+aGVhZGVyOwotICAgICAgICBtZW1tb3ZlKG1Xcml0ZUJ1ZmZlciwgYnVmZmVyLCBzaXplb2YoY29uc3QgRkxBQ19faW50MzIgKiBjb25zdCkgKiBnZXRDaGFubmVscygpKTsKLSAgICAgICAgbVdyaXRlQ29tcGxldGVkID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIEZMQUNfX1NUUkVBTV9ERUNPREVSX1dSSVRFX1NUQVRVU19DT05USU5VRTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiRkxBQ1BhcnNlcjo6d3JpdGVDYWxsYmFjayB1bmV4cGVjdGVkIik7Ci0gICAgICAgIHJldHVybiBGTEFDX19TVFJFQU1fREVDT0RFUl9XUklURV9TVEFUVVNfQUJPUlQ7Ci0gICAgfQotfQotCi12b2lkIEZMQUNQYXJzZXI6Om1ldGFkYXRhQ2FsbGJhY2soY29uc3QgRkxBQ19fU3RyZWFtTWV0YWRhdGEgKm1ldGFkYXRhKQotewotICAgIHN3aXRjaCAobWV0YWRhdGEtPnR5cGUpIHsKLSAgICBjYXNlIEZMQUNfX01FVEFEQVRBX1RZUEVfU1RSRUFNSU5GTzoKLSAgICAgICAgaWYgKCFtU3RyZWFtSW5mb1ZhbGlkKSB7Ci0gICAgICAgICAgICBtU3RyZWFtSW5mbyA9IG1ldGFkYXRhLT5kYXRhLnN0cmVhbV9pbmZvOwotICAgICAgICAgICAgbVN0cmVhbUluZm9WYWxpZCA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiRkxBQ1BhcnNlcjo6bWV0YWRhdGFDYWxsYmFjayB1bmV4cGVjdGVkIFNUUkVBTUlORk8iKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIEZMQUNfX01FVEFEQVRBX1RZUEVfVk9SQklTX0NPTU1FTlQ6Ci0gICAgICAgIHsKLSAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtTWV0YWRhdGFfVm9yYmlzQ29tbWVudCAqdmM7Ci0gICAgICAgIHZjID0gJm1ldGFkYXRhLT5kYXRhLnZvcmJpc19jb21tZW50OwotICAgICAgICBmb3IgKEZMQUNfX3VpbnQzMiBpID0gMDsgaSA8IHZjLT5udW1fY29tbWVudHM7ICsraSkgewotICAgICAgICAgICAgRkxBQ19fU3RyZWFtTWV0YWRhdGFfVm9yYmlzQ29tbWVudF9FbnRyeSAqdmNlOwotICAgICAgICAgICAgdmNlID0gJnZjLT5jb21tZW50c1tpXTsKLSAgICAgICAgICAgIGlmIChtRmlsZU1ldGFkYXRhICE9IDAgJiYgdmNlLT5lbnRyeSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcGFyc2VWb3JiaXNDb21tZW50KG1GaWxlTWV0YWRhdGEsIChjb25zdCBjaGFyICopIHZjZS0+ZW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICB2Y2UtPmxlbmd0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIEZMQUNfX01FVEFEQVRBX1RZUEVfUElDVFVSRToKLSAgICAgICAgaWYgKG1GaWxlTWV0YWRhdGEgIT0gMCkgewotICAgICAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtTWV0YWRhdGFfUGljdHVyZSAqcCA9ICZtZXRhZGF0YS0+ZGF0YS5waWN0dXJlOwotICAgICAgICAgICAgbUZpbGVNZXRhZGF0YS0+c2V0RGF0YShrS2V5QWxidW1BcnQsCi0gICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhOjpUWVBFX05PTkUsIHAtPmRhdGEsIHAtPmRhdGFfbGVuZ3RoKTsKLSAgICAgICAgICAgIG1GaWxlTWV0YWRhdGEtPnNldENTdHJpbmcoa0tleUFsYnVtQXJ0TUlNRSwgcC0+bWltZV90eXBlKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBBTE9HVygiRkxBQ1BhcnNlcjo6bWV0YWRhdGFDYWxsYmFjayB1bmV4cGVjdGVkIHR5cGUgJXUiLCBtZXRhZGF0YS0+dHlwZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotdm9pZCBGTEFDUGFyc2VyOjplcnJvckNhbGxiYWNrKEZMQUNfX1N0cmVhbURlY29kZXJFcnJvclN0YXR1cyBzdGF0dXMpCi17Ci0gICAgQUxPR0UoIkZMQUNQYXJzZXI6OmVycm9yQ2FsbGJhY2sgc3RhdHVzPSVkIiwgc3RhdHVzKTsKLSAgICBtRXJyb3JTdGF0dXMgPSBzdGF0dXM7Ci19Ci0KLS8vIENvcHkgc2FtcGxlcyBmcm9tIEZMQUMgbmF0aXZlIDMyLWJpdCBub24taW50ZXJsZWF2ZWQgdG8gMTYtYml0IGludGVybGVhdmVkLgotLy8gVGhlc2UgYXJlIGNhbmRpZGF0ZXMgZm9yIG9wdGltaXphdGlvbiBpZiBuZWVkZWQuCi0KLXN0YXRpYyB2b2lkIGNvcHlNb25vOCgKLSAgICAgICAgc2hvcnQgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNQYXJzZXI6OmtNYXhDaGFubmVsc10sCi0gICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICAqZHN0KysgPSBzcmNbMF1baV0gPDwgODsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlTdGVyZW84KAotICAgICAgICBzaG9ydCAqZHN0LAotICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ1BhcnNlcjo6a01heENoYW5uZWxzXSwKLSAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCi0gICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7Ci0gICAgICAgICpkc3QrKyA9IHNyY1swXVtpXSA8PCA4OwotICAgICAgICAqZHN0KysgPSBzcmNbMV1baV0gPDwgODsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlNdWx0aUNoOChzaG9ydCAqZHN0LCBjb25zdCBpbnQgKiBzcmNbRkxBQ1BhcnNlcjo6a01heENoYW5uZWxzXSwgdW5zaWduZWQgblNhbXBsZXMsIHVuc2lnbmVkIG5DaGFubmVscykKLXsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgbkNoYW5uZWxzOyArK2MpIHsKLSAgICAgICAgICAgICpkc3QrKyA9IHNyY1tjXVtpXSA8PCA4OwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5TW9ubzE2KAotICAgICAgICBzaG9ydCAqZHN0LAotICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ1BhcnNlcjo6a01heENoYW5uZWxzXSwKLSAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCi0gICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7Ci0gICAgICAgICpkc3QrKyA9IHNyY1swXVtpXTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlTdGVyZW8xNigKLSAgICAgICAgc2hvcnQgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNQYXJzZXI6OmtNYXhDaGFubmVsc10sCi0gICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICAqZHN0KysgPSBzcmNbMF1baV07Ci0gICAgICAgICpkc3QrKyA9IHNyY1sxXVtpXTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlNdWx0aUNoMTYoc2hvcnQgKmRzdCwgY29uc3QgaW50ICogc3JjW0ZMQUNQYXJzZXI6OmtNYXhDaGFubmVsc10sIHVuc2lnbmVkIG5TYW1wbGVzLCB1bnNpZ25lZCBuQ2hhbm5lbHMpCi17Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG5DaGFubmVsczsgKytjKSB7Ci0gICAgICAgICAgICAqZHN0KysgPSBzcmNbY11baV07Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIDI0LWJpdCB2ZXJzaW9ucyBzaG91bGQgZG8gZGl0aGVyaW5nIG9yIG5vaXNlLXNoYXBpbmcsIGhlcmUgb3IgaW4gQXVkaW9GbGluZ2VyCi0KLXN0YXRpYyB2b2lkIGNvcHlNb25vMjQoCi0gICAgICAgIHNob3J0ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDUGFyc2VyOjprTWF4Q2hhbm5lbHNdLAotICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldID4+IDg7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5U3RlcmVvMjQoCi0gICAgICAgIHNob3J0ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDUGFyc2VyOjprTWF4Q2hhbm5lbHNdLAotICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldID4+IDg7Ci0gICAgICAgICpkc3QrKyA9IHNyY1sxXVtpXSA+PiA4OwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgY29weU11bHRpQ2gyNChzaG9ydCAqZHN0LCBjb25zdCBpbnQgKiBzcmNbRkxBQ1BhcnNlcjo6a01heENoYW5uZWxzXSwgdW5zaWduZWQgblNhbXBsZXMsIHVuc2lnbmVkIG5DaGFubmVscykKLXsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgbkNoYW5uZWxzOyArK2MpIHsKLSAgICAgICAgICAgICpkc3QrKyA9IHNyY1tjXVtpXSA+PiA4OwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5VHJlc3Bhc3MoCi0gICAgICAgIHNob3J0ICogLyogZHN0ICovLAotICAgICAgICBjb25zdCBpbnQgKltGTEFDUGFyc2VyOjprTWF4Q2hhbm5lbHNdIC8qIHNyYyAqLywKLSAgICAgICAgdW5zaWduZWQgLyogblNhbXBsZXMgKi8sCi0gICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewotICAgIFRSRVNQQVNTKCk7Ci19Ci0KLS8vIEZMQUNQYXJzZXIKLQotRkxBQ1BhcnNlcjo6RkxBQ1BhcnNlcigKLSAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJmRhdGFTb3VyY2UsCi0gICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmZmlsZU1ldGFkYXRhLAotICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJnRyYWNrTWV0YWRhdGEpCi0gICAgOiBtRGF0YVNvdXJjZShkYXRhU291cmNlKSwKLSAgICAgIG1GaWxlTWV0YWRhdGEoZmlsZU1ldGFkYXRhKSwKLSAgICAgIG1UcmFja01ldGFkYXRhKHRyYWNrTWV0YWRhdGEpLAotICAgICAgbUluaXRDaGVjayhmYWxzZSksCi0gICAgICBtTWF4QnVmZmVyU2l6ZSgwKSwKLSAgICAgIG1Hcm91cChOVUxMKSwKLSAgICAgIG1Db3B5KGNvcHlUcmVzcGFzcyksCi0gICAgICBtRGVjb2RlcihOVUxMKSwKLSAgICAgIG1DdXJyZW50UG9zKDBMTCksCi0gICAgICBtRU9GKGZhbHNlKSwKLSAgICAgIG1TdHJlYW1JbmZvVmFsaWQoZmFsc2UpLAotICAgICAgbVdyaXRlUmVxdWVzdGVkKGZhbHNlKSwKLSAgICAgIG1Xcml0ZUNvbXBsZXRlZChmYWxzZSksCi0gICAgICBtRXJyb3JTdGF0dXMoKEZMQUNfX1N0cmVhbURlY29kZXJFcnJvclN0YXR1cykgLTEpCi17Ci0gICAgQUxPR1YoIkZMQUNQYXJzZXI6OkZMQUNQYXJzZXIiKTsKLSAgICBtZW1zZXQoJm1TdHJlYW1JbmZvLCAwLCBzaXplb2YobVN0cmVhbUluZm8pKTsKLSAgICBtZW1zZXQoJm1Xcml0ZUhlYWRlciwgMCwgc2l6ZW9mKG1Xcml0ZUhlYWRlcikpOwotICAgIG1Jbml0Q2hlY2sgPSBpbml0KCk7Ci19Ci0KLUZMQUNQYXJzZXI6On5GTEFDUGFyc2VyKCkKLXsKLSAgICBBTE9HVigiRkxBQ1BhcnNlcjo6fkZMQUNQYXJzZXIiKTsKLSAgICBpZiAobURlY29kZXIgIT0gTlVMTCkgewotICAgICAgICBGTEFDX19zdHJlYW1fZGVjb2Rlcl9kZWxldGUobURlY29kZXIpOwotICAgICAgICBtRGVjb2RlciA9IE5VTEw7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBGTEFDUGFyc2VyOjppbml0KCkKLXsKLSAgICAvLyBzZXR1cCBsaWJGTEFDIHBhcnNlcgotICAgIG1EZWNvZGVyID0gRkxBQ19fc3RyZWFtX2RlY29kZXJfbmV3KCk7Ci0gICAgaWYgKG1EZWNvZGVyID09IE5VTEwpIHsKLSAgICAgICAgLy8gVGhlIG5ldyBzaG91bGQgc3VjY2VlZCwgc2luY2UgcHJvYmFibHkgYWxsIGl0IGRvZXMgaXMgYSBtYWxsb2MKLSAgICAgICAgLy8gdGhhdCBhbHdheXMgc3VjY2VlZHMgaW4gQW5kcm9pZC4gIEJ1dCB0byBhdm9pZCBkZXBlbmRlbmNlIG9uIHRoZQotICAgICAgICAvLyBsaWJGTEFDIGludGVybmFscywgd2UgY2hlY2sgYW5kIGxvZyBoZXJlLgotICAgICAgICBBTE9HRSgibmV3IGZhaWxlZCIpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgRkxBQ19fc3RyZWFtX2RlY29kZXJfc2V0X21kNV9jaGVja2luZyhtRGVjb2RlciwgZmFsc2UpOwotICAgIEZMQUNfX3N0cmVhbV9kZWNvZGVyX3NldF9tZXRhZGF0YV9pZ25vcmVfYWxsKG1EZWNvZGVyKTsKLSAgICBGTEFDX19zdHJlYW1fZGVjb2Rlcl9zZXRfbWV0YWRhdGFfcmVzcG9uZCgKLSAgICAgICAgICAgIG1EZWNvZGVyLCBGTEFDX19NRVRBREFUQV9UWVBFX1NUUkVBTUlORk8pOwotICAgIEZMQUNfX3N0cmVhbV9kZWNvZGVyX3NldF9tZXRhZGF0YV9yZXNwb25kKAotICAgICAgICAgICAgbURlY29kZXIsIEZMQUNfX01FVEFEQVRBX1RZUEVfUElDVFVSRSk7Ci0gICAgRkxBQ19fc3RyZWFtX2RlY29kZXJfc2V0X21ldGFkYXRhX3Jlc3BvbmQoCi0gICAgICAgICAgICBtRGVjb2RlciwgRkxBQ19fTUVUQURBVEFfVFlQRV9WT1JCSVNfQ09NTUVOVCk7Ci0gICAgRkxBQ19fU3RyZWFtRGVjb2RlckluaXRTdGF0dXMgaW5pdFN0YXR1czsKLSAgICBpbml0U3RhdHVzID0gRkxBQ19fc3RyZWFtX2RlY29kZXJfaW5pdF9zdHJlYW0oCi0gICAgICAgICAgICBtRGVjb2RlciwKLSAgICAgICAgICAgIHJlYWRfY2FsbGJhY2ssIHNlZWtfY2FsbGJhY2ssIHRlbGxfY2FsbGJhY2ssCi0gICAgICAgICAgICBsZW5ndGhfY2FsbGJhY2ssIGVvZl9jYWxsYmFjaywgd3JpdGVfY2FsbGJhY2ssCi0gICAgICAgICAgICBtZXRhZGF0YV9jYWxsYmFjaywgZXJyb3JfY2FsbGJhY2ssICh2b2lkICopIHRoaXMpOwotICAgIGlmIChpbml0U3RhdHVzICE9IEZMQUNfX1NUUkVBTV9ERUNPREVSX0lOSVRfU1RBVFVTX09LKSB7Ci0gICAgICAgIC8vIEEgZmFpbHVyZSBoZXJlIHByb2JhYmx5IGluZGljYXRlcyBhIHByb2dyYW1taW5nIGVycm9yIGFuZCBzbyBpcwotICAgICAgICAvLyB1bmxpa2VseSB0byBoYXBwZW4uIEJ1dCB3ZSBjaGVjayBhbmQgbG9nIGhlcmUgc2ltaWxhcmx5IHRvIGFib3ZlLgotICAgICAgICBBTE9HRSgiaW5pdF9zdHJlYW0gZmFpbGVkICVkIiwgaW5pdFN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICAvLyBwYXJzZSBhbGwgbWV0YWRhdGEKLSAgICBpZiAoIUZMQUNfX3N0cmVhbV9kZWNvZGVyX3Byb2Nlc3NfdW50aWxfZW5kX29mX21ldGFkYXRhKG1EZWNvZGVyKSkgewotICAgICAgICBBTE9HRSgiZW5kX29mX21ldGFkYXRhIGZhaWxlZCIpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgaWYgKG1TdHJlYW1JbmZvVmFsaWQpIHsKLSAgICAgICAgLy8gY2hlY2sgY2hhbm5lbCBjb3VudAotICAgICAgICBpZiAoZ2V0Q2hhbm5lbHMoKSA9PSAwIHx8IGdldENoYW5uZWxzKCkgPiBrTWF4Q2hhbm5lbHMpIHsKLSAgICAgICAgICAgIEFMT0dFKCJ1bnN1cHBvcnRlZCBjaGFubmVsIGNvdW50ICV1IiwgZ2V0Q2hhbm5lbHMoKSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICAgICAgfQotICAgICAgICAvLyBjaGVjayBiaXQgZGVwdGgKLSAgICAgICAgc3dpdGNoIChnZXRCaXRzUGVyU2FtcGxlKCkpIHsKLSAgICAgICAgY2FzZSA4OgotICAgICAgICBjYXNlIDE2OgotICAgICAgICBjYXNlIDI0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HRSgidW5zdXBwb3J0ZWQgYml0cyBwZXIgc2FtcGxlICV1IiwgZ2V0Qml0c1BlclNhbXBsZSgpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19JTklUOwotICAgICAgICB9Ci0gICAgICAgIC8vIGNoZWNrIHNhbXBsZSByYXRlCi0gICAgICAgIHN3aXRjaCAoZ2V0U2FtcGxlUmF0ZSgpKSB7Ci0gICAgICAgIGNhc2UgIDgwMDA6Ci0gICAgICAgIGNhc2UgMTEwMjU6Ci0gICAgICAgIGNhc2UgMTIwMDA6Ci0gICAgICAgIGNhc2UgMTYwMDA6Ci0gICAgICAgIGNhc2UgMjIwNTA6Ci0gICAgICAgIGNhc2UgMjQwMDA6Ci0gICAgICAgIGNhc2UgMzIwMDA6Ci0gICAgICAgIGNhc2UgNDQxMDA6Ci0gICAgICAgIGNhc2UgNDgwMDA6Ci0gICAgICAgIGNhc2UgODgyMDA6Ci0gICAgICAgIGNhc2UgOTYwMDA6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dFKCJ1bnN1cHBvcnRlZCBzYW1wbGUgcmF0ZSAldSIsIGdldFNhbXBsZVJhdGUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICAgICAgfQotICAgICAgICAvLyBjb25maWd1cmUgdGhlIGFwcHJvcHJpYXRlIGNvcHkgZnVuY3Rpb24sIGRlZmF1bHRpbmcgdG8gdHJlc3Bhc3MKLSAgICAgICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7Ci0gICAgICAgICAgICB1bnNpZ25lZCBtQ2hhbm5lbHM7Ci0gICAgICAgICAgICB1bnNpZ25lZCBtQml0c1BlclNhbXBsZTsKLSAgICAgICAgICAgIHZvaWQgKCptQ29weSkoc2hvcnQgKmRzdCwgY29uc3QgaW50ICogc3JjW2tNYXhDaGFubmVsc10sIHVuc2lnbmVkIG5TYW1wbGVzLCB1bnNpZ25lZCBuQ2hhbm5lbHMpOwotICAgICAgICB9IHRhYmxlW10gPSB7Ci0gICAgICAgICAgICB7IDEsICA4LCBjb3B5TW9ubzggICAgfSwKLSAgICAgICAgICAgIHsgMiwgIDgsIGNvcHlTdGVyZW84ICB9LAotICAgICAgICAgICAgeyA4LCAgOCwgY29weU11bHRpQ2g4ICB9LAotICAgICAgICAgICAgeyAxLCAxNiwgY29weU1vbm8xNiAgIH0sCi0gICAgICAgICAgICB7IDIsIDE2LCBjb3B5U3RlcmVvMTYgfSwKLSAgICAgICAgICAgIHsgOCwgMTYsIGNvcHlNdWx0aUNoMTYgfSwKLSAgICAgICAgICAgIHsgMSwgMjQsIGNvcHlNb25vMjQgICB9LAotICAgICAgICAgICAgeyAyLCAyNCwgY29weVN0ZXJlbzI0IH0sCi0gICAgICAgICAgICB7IDgsIDI0LCBjb3B5TXVsdGlDaDI0IH0sCi0gICAgICAgIH07Ci0gICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzaXplb2YodGFibGUpL3NpemVvZih0YWJsZVswXSk7ICsraSkgewotICAgICAgICAgICAgaWYgKHRhYmxlW2ldLm1DaGFubmVscyA+PSBnZXRDaGFubmVscygpICYmCi0gICAgICAgICAgICAgICAgICAgIHRhYmxlW2ldLm1CaXRzUGVyU2FtcGxlID09IGdldEJpdHNQZXJTYW1wbGUoKSkgewotICAgICAgICAgICAgICAgIG1Db3B5ID0gdGFibGVbaV0ubUNvcHk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gcG9wdWxhdGUgdHJhY2sgbWV0YWRhdGEKLSAgICAgICAgaWYgKG1UcmFja01ldGFkYXRhICE9IDApIHsKLSAgICAgICAgICAgIG1UcmFja01ldGFkYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKLSAgICAgICAgICAgIG1UcmFja01ldGFkYXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBnZXRDaGFubmVscygpKTsKLSAgICAgICAgICAgIG1UcmFja01ldGFkYXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgZ2V0U2FtcGxlUmF0ZSgpKTsKLSAgICAgICAgICAgIG1UcmFja01ldGFkYXRhLT5zZXRJbnQzMihrS2V5UGNtRW5jb2RpbmcsIGtBdWRpb0VuY29kaW5nUGNtMTZiaXQpOwotICAgICAgICAgICAgLy8gc2FtcGxlIHJhdGUgaXMgbm9uLXplcm8sIHNvIGRpdmlzaW9uIGJ5IHplcm8gbm90IHBvc3NpYmxlCi0gICAgICAgICAgICBtVHJhY2tNZXRhZGF0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAoZ2V0VG90YWxTYW1wbGVzKCkgKiAxMDAwMDAwTEwpIC8gZ2V0U2FtcGxlUmF0ZSgpKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJtaXNzaW5nIFNUUkVBTUlORk8iKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIGlmIChtRmlsZU1ldGFkYXRhICE9IDApIHsKLSAgICAgICAgbUZpbGVNZXRhZGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMpOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgRkxBQ1BhcnNlcjo6YWxsb2NhdGVCdWZmZXJzKCkKLXsKLSAgICBDSEVDSyhtR3JvdXAgPT0gTlVMTCk7Ci0gICAgbUdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXA7Ci0gICAgbU1heEJ1ZmZlclNpemUgPSBnZXRNYXhCbG9ja1NpemUoKSAqIGdldENoYW5uZWxzKCkgKiBzaXplb2Yoc2hvcnQpOwotICAgIG1Hcm91cC0+YWRkX2J1ZmZlcihuZXcgTWVkaWFCdWZmZXIobU1heEJ1ZmZlclNpemUpKTsKLX0KLQotdm9pZCBGTEFDUGFyc2VyOjpyZWxlYXNlQnVmZmVycygpCi17Ci0gICAgQ0hFQ0sobUdyb3VwICE9IE5VTEwpOwotICAgIGRlbGV0ZSBtR3JvdXA7Ci0gICAgbUdyb3VwID0gTlVMTDsKLX0KLQotTWVkaWFCdWZmZXIgKkZMQUNQYXJzZXI6OnJlYWRCdWZmZXIoYm9vbCBkb1NlZWssIEZMQUNfX3VpbnQ2NCBzYW1wbGUpCi17Ci0gICAgbVdyaXRlUmVxdWVzdGVkID0gdHJ1ZTsKLSAgICBtV3JpdGVDb21wbGV0ZWQgPSBmYWxzZTsKLSAgICBpZiAoZG9TZWVrKSB7Ci0gICAgICAgIC8vIFdlIGltcGxlbWVudCB0aGUgc2VlayBjYWxsYmFjaywgc28gdGhpcyB3b3JrcyB3aXRob3V0IGV4cGxpY2l0IGZsdXNoCi0gICAgICAgIGlmICghRkxBQ19fc3RyZWFtX2RlY29kZXJfc2Vla19hYnNvbHV0ZShtRGVjb2Rlciwgc2FtcGxlKSkgewotICAgICAgICAgICAgQUxPR0UoIkZMQUNQYXJzZXI6OnJlYWRCdWZmZXIgc2VlayB0byBzYW1wbGUgJWxsZCBmYWlsZWQiLCAobG9uZyBsb25nKXNhbXBsZSk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBBTE9HVigiRkxBQ1BhcnNlcjo6cmVhZEJ1ZmZlciBzZWVrIHRvIHNhbXBsZSAlbGxkIHN1Y2NlZWRlZCIsIChsb25nIGxvbmcpc2FtcGxlKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoIUZMQUNfX3N0cmVhbV9kZWNvZGVyX3Byb2Nlc3Nfc2luZ2xlKG1EZWNvZGVyKSkgewotICAgICAgICAgICAgQUxPR0UoIkZMQUNQYXJzZXI6OnJlYWRCdWZmZXIgcHJvY2Vzc19zaW5nbGUgZmFpbGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoIW1Xcml0ZUNvbXBsZXRlZCkgewotICAgICAgICBBTE9HVigiRkxBQ1BhcnNlcjo6cmVhZEJ1ZmZlciB3cml0ZSBkaWQgbm90IGNvbXBsZXRlIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICAvLyB2ZXJpZnkgdGhhdCBibG9jayBoZWFkZXIga2VlcHMgdGhlIHByb21pc2VzIG1hZGUgYnkgU1RSRUFNSU5GTwotICAgIHVuc2lnbmVkIGJsb2Nrc2l6ZSA9IG1Xcml0ZUhlYWRlci5ibG9ja3NpemU7Ci0gICAgaWYgKGJsb2Nrc2l6ZSA9PSAwIHx8IGJsb2Nrc2l6ZSA+IGdldE1heEJsb2NrU2l6ZSgpKSB7Ci0gICAgICAgIEFMT0dFKCJGTEFDUGFyc2VyOjpyZWFkQnVmZmVyIHdyaXRlIGludmFsaWQgYmxvY2tzaXplICV1IiwgYmxvY2tzaXplKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmIChtV3JpdGVIZWFkZXIuc2FtcGxlX3JhdGUgIT0gZ2V0U2FtcGxlUmF0ZSgpIHx8Ci0gICAgICAgIG1Xcml0ZUhlYWRlci5jaGFubmVscyAhPSBnZXRDaGFubmVscygpIHx8Ci0gICAgICAgIG1Xcml0ZUhlYWRlci5iaXRzX3Blcl9zYW1wbGUgIT0gZ2V0Qml0c1BlclNhbXBsZSgpKSB7Ci0gICAgICAgIEFMT0dFKCJGTEFDUGFyc2VyOjpyZWFkQnVmZmVyIHdyaXRlIGNoYW5nZWQgcGFyYW1ldGVycyBtaWQtc3RyZWFtOiAlZC8lZC8lZCAtPiAlZC8lZC8lZCIsCi0gICAgICAgICAgICAgICAgZ2V0U2FtcGxlUmF0ZSgpLCBnZXRDaGFubmVscygpLCBnZXRCaXRzUGVyU2FtcGxlKCksCi0gICAgICAgICAgICAgICAgbVdyaXRlSGVhZGVyLnNhbXBsZV9yYXRlLCBtV3JpdGVIZWFkZXIuY2hhbm5lbHMsIG1Xcml0ZUhlYWRlci5iaXRzX3Blcl9zYW1wbGUpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgLy8gYWNxdWlyZSBhIG1lZGlhIGJ1ZmZlcgotICAgIENIRUNLKG1Hcm91cCAhPSBOVUxMKTsKLSAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyOwotICAgIHN0YXR1c190IGVyciA9IG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJmJ1ZmZlcik7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgc2l6ZV90IGJ1ZmZlclNpemUgPSBibG9ja3NpemUgKiBnZXRDaGFubmVscygpICogc2l6ZW9mKHNob3J0KTsKLSAgICBDSEVDSyhidWZmZXJTaXplIDw9IG1NYXhCdWZmZXJTaXplKTsKLSAgICBzaG9ydCAqZGF0YSA9IChzaG9ydCAqKSBidWZmZXItPmRhdGEoKTsKLSAgICBidWZmZXItPnNldF9yYW5nZSgwLCBidWZmZXJTaXplKTsKLSAgICAvLyBjb3B5IFBDTSBmcm9tIEZMQUMgd3JpdGUgYnVmZmVyIHRvIG91ciBtZWRpYSBidWZmZXIsIHdpdGggaW50ZXJsZWF2aW5nCi0gICAgKCptQ29weSkoZGF0YSwgbVdyaXRlQnVmZmVyLCBibG9ja3NpemUsIGdldENoYW5uZWxzKCkpOwotICAgIC8vIGZpbGwgaW4gYnVmZmVyIG1ldGFkYXRhCi0gICAgQ0hFQ0sobVdyaXRlSGVhZGVyLm51bWJlcl90eXBlID09IEZMQUNfX0ZSQU1FX05VTUJFUl9UWVBFX1NBTVBMRV9OVU1CRVIpOwotICAgIEZMQUNfX3VpbnQ2NCBzYW1wbGVOdW1iZXIgPSBtV3JpdGVIZWFkZXIubnVtYmVyLnNhbXBsZV9udW1iZXI7Ci0gICAgaW50NjRfdCB0aW1lVXMgPSAoMTAwMDAwMExMICogc2FtcGxlTnVtYmVyKSAvIGdldFNhbXBsZVJhdGUoKTsKLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOwotICAgIHJldHVybiBidWZmZXI7Ci19Ci0KLS8vIEZMQUNzb3VyY2UKLQotRkxBQ1NvdXJjZTo6RkxBQ1NvdXJjZSgKLSAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJmRhdGFTb3VyY2UsCi0gICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmdHJhY2tNZXRhZGF0YSkKLSAgICA6IG1EYXRhU291cmNlKGRhdGFTb3VyY2UpLAotICAgICAgbVRyYWNrTWV0YWRhdGEodHJhY2tNZXRhZGF0YSksCi0gICAgICBtUGFyc2VyKDApLAotICAgICAgbUluaXRDaGVjayhmYWxzZSksCi0gICAgICBtU3RhcnRlZChmYWxzZSkKLXsKLSAgICBBTE9HVigiRkxBQ1NvdXJjZTo6RkxBQ1NvdXJjZSIpOwotICAgIG1Jbml0Q2hlY2sgPSBpbml0KCk7Ci19Ci0KLUZMQUNTb3VyY2U6On5GTEFDU291cmNlKCkKLXsKLSAgICBBTE9HVigifkZMQUNTb3VyY2U6OkZMQUNTb3VyY2UiKTsKLSAgICBpZiAobVN0YXJ0ZWQpIHsKLSAgICAgICAgc3RvcCgpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgRkxBQ1NvdXJjZTo6c3RhcnQoTWV0YURhdGEgKiAvKiBwYXJhbXMgKi8pCi17Ci0gICAgQUxPR1YoIkZMQUNTb3VyY2U6OnN0YXJ0Iik7Ci0KLSAgICBDSEVDSyghbVN0YXJ0ZWQpOwotICAgIG1QYXJzZXItPmFsbG9jYXRlQnVmZmVycygpOwotICAgIG1TdGFydGVkID0gdHJ1ZTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRkxBQ1NvdXJjZTo6c3RvcCgpCi17Ci0gICAgQUxPR1YoIkZMQUNTb3VyY2U6OnN0b3AiKTsKLQotICAgIENIRUNLKG1TdGFydGVkKTsKLSAgICBtUGFyc2VyLT5yZWxlYXNlQnVmZmVycygpOwotICAgIG1TdGFydGVkID0gZmFsc2U7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXNwPE1ldGFEYXRhPiBGTEFDU291cmNlOjpnZXRGb3JtYXQoKQotewotICAgIHJldHVybiBtVHJhY2tNZXRhZGF0YTsKLX0KLQotc3RhdHVzX3QgRkxBQ1NvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXIgKipvdXRCdWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKQotewotICAgIE1lZGlhQnVmZmVyICpidWZmZXI7Ci0gICAgLy8gcHJvY2VzcyBhbiBvcHRpb25hbCBzZWVrIHJlcXVlc3QKLSAgICBpbnQ2NF90IHNlZWtUaW1lVXM7Ci0gICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7Ci0gICAgaWYgKChOVUxMICE9IG9wdGlvbnMpICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7Ci0gICAgICAgIEZMQUNfX3VpbnQ2NCBzYW1wbGU7Ci0gICAgICAgIGlmIChzZWVrVGltZVVzIDw9IDBMTCkgewotICAgICAgICAgICAgc2FtcGxlID0gMExMOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gc2FtcGxlIGFuZCB0b3RhbCBzYW1wbGVzIGFyZSBib3RoIHplcm8tYmFzZWQsIGFuZCBzZWVrIHRvIEVPRiBvawotICAgICAgICAgICAgc2FtcGxlID0gKHNlZWtUaW1lVXMgKiBtUGFyc2VyLT5nZXRTYW1wbGVSYXRlKCkpIC8gMTAwMDAwMExMOwotICAgICAgICAgICAgaWYgKHNhbXBsZSA+PSBtUGFyc2VyLT5nZXRUb3RhbFNhbXBsZXMoKSkgewotICAgICAgICAgICAgICAgIHNhbXBsZSA9IG1QYXJzZXItPmdldFRvdGFsU2FtcGxlcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJ1ZmZlciA9IG1QYXJzZXItPnJlYWRCdWZmZXIoc2FtcGxlKTsKLSAgICAvLyBvdGhlcndpc2UgcmVhZCBzZXF1ZW50aWFsbHkKLSAgICB9IGVsc2UgewotICAgICAgICBidWZmZXIgPSBtUGFyc2VyLT5yZWFkQnVmZmVyKCk7Ci0gICAgfQotICAgICpvdXRCdWZmZXIgPSBidWZmZXI7Ci0gICAgcmV0dXJuIGJ1ZmZlciAhPSBOVUxMID8gKHN0YXR1c190KSBPSyA6IChzdGF0dXNfdCkgRVJST1JfRU5EX09GX1NUUkVBTTsKLX0KLQotc3RhdHVzX3QgRkxBQ1NvdXJjZTo6aW5pdCgpCi17Ci0gICAgQUxPR1YoIkZMQUNTb3VyY2U6OmluaXQiKTsKLSAgICAvLyByZS11c2UgdGhlIHNhbWUgdHJhY2sgbWV0YWRhdGEgcGFzc2VkIGludG8gY29uc3RydWN0b3IgZnJvbSBGTEFDRXh0cmFjdG9yCi0gICAgbVBhcnNlciA9IG5ldyBGTEFDUGFyc2VyKG1EYXRhU291cmNlKTsKLSAgICByZXR1cm4gbVBhcnNlci0+aW5pdENoZWNrKCk7Ci19Ci0KLS8vIEZMQUNFeHRyYWN0b3IKLQotRkxBQ0V4dHJhY3Rvcjo6RkxBQ0V4dHJhY3RvcigKLSAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJmRhdGFTb3VyY2UpCi0gICAgOiBtRGF0YVNvdXJjZShkYXRhU291cmNlKSwKLSAgICAgIG1Jbml0Q2hlY2soZmFsc2UpCi17Ci0gICAgQUxPR1YoIkZMQUNFeHRyYWN0b3I6OkZMQUNFeHRyYWN0b3IiKTsKLSAgICBtSW5pdENoZWNrID0gaW5pdCgpOwotfQotCi1GTEFDRXh0cmFjdG9yOjp+RkxBQ0V4dHJhY3RvcigpCi17Ci0gICAgQUxPR1YoIn5GTEFDRXh0cmFjdG9yOjpGTEFDRXh0cmFjdG9yIik7Ci19Ci0KLXNpemVfdCBGTEFDRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpCi17Ci0gICAgcmV0dXJuIG1Jbml0Q2hlY2sgPT0gT0sgPyAxIDogMDsKLX0KLQotc3A8SU1lZGlhU291cmNlPiBGTEFDRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpCi17Ci0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggPiAwKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gbmV3IEZMQUNTb3VyY2UobURhdGFTb3VyY2UsIG1UcmFja01ldGFkYXRhKTsKLX0KLQotc3A8TWV0YURhdGE+IEZMQUNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKLSAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCA+IDApIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBtVHJhY2tNZXRhZGF0YTsKLX0KLQotc3RhdHVzX3QgRkxBQ0V4dHJhY3Rvcjo6aW5pdCgpCi17Ci0gICAgbUZpbGVNZXRhZGF0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICBtVHJhY2tNZXRhZGF0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICAvLyBGTEFDUGFyc2VyIHdpbGwgZmlsbCBpbiB0aGUgbWV0YWRhdGEgZm9yIHVzCi0gICAgbVBhcnNlciA9IG5ldyBGTEFDUGFyc2VyKG1EYXRhU291cmNlLCBtRmlsZU1ldGFkYXRhLCBtVHJhY2tNZXRhZGF0YSk7Ci0gICAgcmV0dXJuIG1QYXJzZXItPmluaXRDaGVjaygpOwotfQotCi1zcDxNZXRhRGF0YT4gRkxBQ0V4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoKQotewotICAgIHJldHVybiBtRmlsZU1ldGFkYXRhOwotfQotCi0vLyBTbmlmZmVyCi0KLWJvb2wgU25pZmZGTEFDKAotICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UsCi0gICAgICAgIHNwPEFNZXNzYWdlPiAqKQotewotICAgIC8vIGZpcnN0IDQgaXMgdGhlIHNpZ25hdHVyZSB3b3JkCi0gICAgLy8gc2Vjb25kIDQgaXMgdGhlIHNpemVvZiBTVFJFQU1JTkZPCi0gICAgLy8gMDQyIGlzIHRoZSBtYW5kYXRvcnkgU1RSRUFNSU5GTwotICAgIC8vIG5vIG5lZWQgdG8gcmVhZCByZXN0IG9mIHRoZSBoZWFkZXIsIGFzIGEgcHJlbWF0dXJlIEVPRiB3aWxsIGJlIGNhdWdodCBsYXRlcgotICAgIHVpbnQ4X3QgaGVhZGVyWzQrNF07Ci0gICAgaWYgKHNvdXJjZS0+cmVhZEF0KDAsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpICE9IHNpemVvZihoZWFkZXIpCi0gICAgICAgICAgICB8fCBtZW1jbXAoImZMYUNcMFwwXDBcMDQyIiwgaGVhZGVyLCA0KzQpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgICptaW1lVHlwZSA9IE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUM7Ci0gICAgKmNvbmZpZGVuY2UgPSAwLjU7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5jcHAKaW5kZXggOTdkODk4OC4uZWVmNTMxNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5jcHAKQEAgLTE5NCwxMiArMTk0LDYgQEAKICAgICByZXR1cm4gbURlY3J5cHRIYW5kbGU7CiB9CiAKLXZvaWQgRmlsZVNvdXJjZTo6Z2V0RHJtSW5mbyhzcDxEZWNyeXB0SGFuZGxlPiAmaGFuZGxlLCBEcm1NYW5hZ2VyQ2xpZW50ICoqY2xpZW50KSB7Ci0gICAgaGFuZGxlID0gbURlY3J5cHRIYW5kbGU7Ci0KLSAgICAqY2xpZW50ID0gbURybU1hbmFnZXJDbGllbnQ7Ci19Ci0KIHNzaXplX3QgRmlsZVNvdXJjZTo6cmVhZEF0RFJNKG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewogICAgIHNpemVfdCBEUk1fQ0FDSEVfU0laRSA9IDEwMjQ7CiAgICAgaWYgKG1Ecm1CdWYgPT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRnJhbWVEZWNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZyYW1lRGVjb2Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlhMjE5ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZyYW1lRGVjb2Rlci5jcHAKQEAgLTAsMCArMSw3NDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkZyYW1lRGVjb2RlciIKKworI2luY2x1ZGUgImluY2x1ZGUvRnJhbWVEZWNvZGVyLmgiCisjaW5jbHVkZSA8YmluZGVyL01lbW9yeUJhc2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KKyNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NvbG9yQ29udmVydGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvVmlkZW9GcmFtZS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBjb25zdCBpbnQ2NF90IGtCdWZmZXJUaW1lT3V0VXMgPSAxMDAwMGxsOyAvLyAxMCBtc2VjCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtSZXRyeUNvdW50ID0gNTA7IC8vIG11c3QgYmUgPjAKKworc3A8SU1lbW9yeT4gYWxsb2NWaWRlb0ZyYW1lKGNvbnN0IHNwPE1ldGFEYXRhPiYgdHJhY2tNZXRhLAorICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgaW50MzJfdCB0aWxlV2lkdGgsIGludDMyX3QgdGlsZUhlaWdodCwKKyAgICAgICAgaW50MzJfdCBkc3RCcHAsIGJvb2wgbWV0YU9ubHkgPSBmYWxzZSkgeworICAgIGludDMyX3Qgcm90YXRpb25BbmdsZTsKKyAgICBpZiAoIXRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlSb3RhdGlvbiwgJnJvdGF0aW9uQW5nbGUpKSB7CisgICAgICAgIHJvdGF0aW9uQW5nbGUgPSAwOyAgLy8gQnkgZGVmYXVsdCwgbm8gcm90YXRpb24KKyAgICB9CisgICAgdWludDMyX3QgdHlwZTsKKyAgICBjb25zdCB2b2lkICppY2NEYXRhOworICAgIHNpemVfdCBpY2NTaXplOworICAgIGlmICghdHJhY2tNZXRhLT5maW5kRGF0YShrS2V5SWNjUHJvZmlsZSwgJnR5cGUsICZpY2NEYXRhLCAmaWNjU2l6ZSkpeworICAgICAgICBpY2NEYXRhID0gTlVMTDsKKyAgICAgICAgaWNjU2l6ZSA9IDA7CisgICAgfQorCisgICAgaW50MzJfdCBzYXJXaWR0aCwgc2FySGVpZ2h0OworICAgIGludDMyX3QgZGlzcGxheVdpZHRoLCBkaXNwbGF5SGVpZ2h0OworICAgIGlmICh0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5U0FSV2lkdGgsICZzYXJXaWR0aCkKKyAgICAgICAgICAgICYmIHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlTQVJIZWlnaHQsICZzYXJIZWlnaHQpCisgICAgICAgICAgICAmJiBzYXJIZWlnaHQgIT0gMCkgeworICAgICAgICBkaXNwbGF5V2lkdGggPSAod2lkdGggKiBzYXJXaWR0aCkgLyBzYXJIZWlnaHQ7CisgICAgICAgIGRpc3BsYXlIZWlnaHQgPSBoZWlnaHQ7CisgICAgfSBlbHNlIGlmICh0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5RGlzcGxheVdpZHRoLCAmZGlzcGxheVdpZHRoKQorICAgICAgICAgICAgICAgICYmIHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlEaXNwbGF5SGVpZ2h0LCAmZGlzcGxheUhlaWdodCkKKyAgICAgICAgICAgICAgICAmJiBkaXNwbGF5V2lkdGggPiAwICYmIGRpc3BsYXlIZWlnaHQgPiAwCisgICAgICAgICAgICAgICAgJiYgd2lkdGggPiAwICYmIGhlaWdodCA+IDApIHsKKyAgICAgICAgQUxPR1YoImZvdW5kIGRpc3BsYXkgc2l6ZSAlZHglZCIsIGRpc3BsYXlXaWR0aCwgZGlzcGxheUhlaWdodCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGlzcGxheVdpZHRoID0gd2lkdGg7CisgICAgICAgIGRpc3BsYXlIZWlnaHQgPSBoZWlnaHQ7CisgICAgfQorCisgICAgVmlkZW9GcmFtZSBmcmFtZSh3aWR0aCwgaGVpZ2h0LCBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQsCisgICAgICAgICAgICB0aWxlV2lkdGgsIHRpbGVIZWlnaHQsIHJvdGF0aW9uQW5nbGUsIGRzdEJwcCwgIW1ldGFPbmx5LCBpY2NTaXplKTsKKworICAgIHNpemVfdCBzaXplID0gZnJhbWUuZ2V0RmxhdHRlbmVkU2l6ZSgpOworICAgIHNwPE1lbW9yeUhlYXBCYXNlPiBoZWFwID0gbmV3IE1lbW9yeUhlYXBCYXNlKHNpemUsIDAsICJNZXRhZGF0YVJldHJpZXZlckNsaWVudCIpOworICAgIGlmIChoZWFwID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byBjcmVhdGUgTWVtb3J5RGVhbGVyIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzcDxJTWVtb3J5PiBmcmFtZU1lbSA9IG5ldyBNZW1vcnlCYXNlKGhlYXAsIDAsIHNpemUpOworICAgIGlmIChmcmFtZU1lbSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJub3QgZW5vdWdoIG1lbW9yeSBmb3IgVmlkZW9GcmFtZSBzaXplPSV6dSIsIHNpemUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgVmlkZW9GcmFtZSogZnJhbWVDb3B5ID0gc3RhdGljX2Nhc3Q8VmlkZW9GcmFtZSo+KGZyYW1lTWVtLT5wb2ludGVyKCkpOworICAgIGZyYW1lQ29weS0+aW5pdChmcmFtZSwgaWNjRGF0YSwgaWNjU2l6ZSk7CisKKyAgICByZXR1cm4gZnJhbWVNZW07Cit9CisKK2Jvb2wgZmluZFRodW1ibmFpbEluZm8oCisgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmdHJhY2tNZXRhLCBpbnQzMl90ICp3aWR0aCwgaW50MzJfdCAqaGVpZ2h0LAorICAgICAgICB1aW50MzJfdCAqdHlwZSA9IE5VTEwsIGNvbnN0IHZvaWQgKipkYXRhID0gTlVMTCwgc2l6ZV90ICpzaXplID0gTlVMTCkgeworICAgIHVpbnQzMl90IGR1bW15VHlwZTsKKyAgICBjb25zdCB2b2lkICpkdW1teURhdGE7CisgICAgc2l6ZV90IGR1bW15U2l6ZTsKKyAgICByZXR1cm4gdHJhY2tNZXRhLT5maW5kSW50MzIoa0tleVRodW1ibmFpbFdpZHRoLCB3aWR0aCkKKyAgICAgICAgJiYgdHJhY2tNZXRhLT5maW5kSW50MzIoa0tleVRodW1ibmFpbEhlaWdodCwgaGVpZ2h0KQorICAgICAgICAmJiB0cmFja01ldGEtPmZpbmREYXRhKGtLZXlUaHVtYm5haWxIVkNDLAorICAgICAgICAgICAgICAgIHR5cGUgPzogJmR1bW15VHlwZSwgZGF0YSA/OiAmZHVtbXlEYXRhLCBzaXplID86ICZkdW1teVNpemUpOworfQorCitib29sIGZpbmRHcmlkSW5mbyhjb25zdCBzcDxNZXRhRGF0YT4gJnRyYWNrTWV0YSwKKyAgICAgICAgaW50MzJfdCAqdGlsZVdpZHRoLCBpbnQzMl90ICp0aWxlSGVpZ2h0LCBpbnQzMl90ICpncmlkUm93cywgaW50MzJfdCAqZ3JpZENvbHMpIHsKKyAgICByZXR1cm4gdHJhY2tNZXRhLT5maW5kSW50MzIoa0tleVRpbGVXaWR0aCwgdGlsZVdpZHRoKSAmJiAoKnRpbGVXaWR0aCA+IDApCisgICAgICAgICYmIHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlUaWxlSGVpZ2h0LCB0aWxlSGVpZ2h0KSAmJiAoKnRpbGVIZWlnaHQgPiAwKQorICAgICAgICAmJiB0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5R3JpZFJvd3MsIGdyaWRSb3dzKSAmJiAoKmdyaWRSb3dzID4gMCkKKyAgICAgICAgJiYgdHJhY2tNZXRhLT5maW5kSW50MzIoa0tleUdyaWRDb2xzLCBncmlkQ29scykgJiYgKCpncmlkQ29scyA+IDApOworfQorCitib29sIGdldERzdENvbG9yRm9ybWF0KAorICAgICAgICBhbmRyb2lkX3BpeGVsX2Zvcm1hdF90IGNvbG9yRm9ybWF0LAorICAgICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSAqZHN0Rm9ybWF0LAorICAgICAgICBpbnQzMl90ICpkc3RCcHApIHsKKyAgICBzd2l0Y2ggKGNvbG9yRm9ybWF0KSB7CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1OgorICAgICAgICB7CisgICAgICAgICAgICAqZHN0Rm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1OworICAgICAgICAgICAgKmRzdEJwcCA9IDI7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4OgorICAgICAgICB7CisgICAgICAgICAgICAqZHN0Rm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdDMyQml0UkdCQTg4ODg7CisgICAgICAgICAgICAqZHN0QnBwID0gNDsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9CR1JBXzg4ODg6CisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3RGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0MzJiaXRCR1JBODg4ODsKKyAgICAgICAgICAgICpkc3RCcHAgPSA0OworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIGNvbG9yIGZvcm1hdDogJWQiLCBjb2xvckZvcm1hdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vc3RhdGljCitzcDxJTWVtb3J5PiBGcmFtZURlY29kZXI6OmdldE1ldGFkYXRhT25seSgKKyAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZ0cmFja01ldGEsIGludCBjb2xvckZvcm1hdCwgYm9vbCB0aHVtYm5haWwpIHsKKyAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBkc3RGb3JtYXQ7CisgICAgaW50MzJfdCBkc3RCcHA7CisgICAgaWYgKCFnZXREc3RDb2xvckZvcm1hdCgKKyAgICAgICAgICAgIChhbmRyb2lkX3BpeGVsX2Zvcm1hdF90KWNvbG9yRm9ybWF0LCAmZHN0Rm9ybWF0LCAmZHN0QnBwKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQsIHRpbGVXaWR0aCA9IDAsIHRpbGVIZWlnaHQgPSAwOworICAgIGlmICh0aHVtYm5haWwpIHsKKyAgICAgICAgaWYgKCFmaW5kVGh1bWJuYWlsSW5mbyh0cmFja01ldGEsICZ3aWR0aCwgJmhlaWdodCkpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQ0hFQ0sodHJhY2tNZXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmd2lkdGgpKTsKKyAgICAgICAgQ0hFQ0sodHJhY2tNZXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgJmhlaWdodCkpOworCisgICAgICAgIGludDMyX3QgZ3JpZFJvd3MsIGdyaWRDb2xzOworICAgICAgICBpZiAoIWZpbmRHcmlkSW5mbyh0cmFja01ldGEsICZ0aWxlV2lkdGgsICZ0aWxlSGVpZ2h0LCAmZ3JpZFJvd3MsICZncmlkQ29scykpIHsKKyAgICAgICAgICAgIHRpbGVXaWR0aCA9IHRpbGVIZWlnaHQgPSAwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBhbGxvY1ZpZGVvRnJhbWUodHJhY2tNZXRhLAorICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgdGlsZVdpZHRoLCB0aWxlSGVpZ2h0LCBkc3RCcHAsIHRydWUgLyptZXRhT25seSovKTsKK30KKworRnJhbWVEZWNvZGVyOjpGcmFtZURlY29kZXIoCisgICAgICAgIGNvbnN0IEFTdHJpbmcgJmNvbXBvbmVudE5hbWUsCisgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmdHJhY2tNZXRhLAorICAgICAgICBjb25zdCBzcDxJTWVkaWFTb3VyY2U+ICZzb3VyY2UpCisgICAgOiBtQ29tcG9uZW50TmFtZShjb21wb25lbnROYW1lKSwKKyAgICAgIG1UcmFja01ldGEodHJhY2tNZXRhKSwKKyAgICAgIG1Tb3VyY2Uoc291cmNlKSwKKyAgICAgIG1Ec3RGb3JtYXQoT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1KSwKKyAgICAgIG1Ec3RCcHAoMiksCisgICAgICBtSGF2ZU1vcmVJbnB1dHModHJ1ZSksCisgICAgICBtRmlyc3RTYW1wbGUodHJ1ZSkgeworfQorCitGcmFtZURlY29kZXI6On5GcmFtZURlY29kZXIoKSB7CisgICAgaWYgKG1EZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgbURlY29kZXItPnJlbGVhc2UoKTsKKyAgICAgICAgbVNvdXJjZS0+c3RvcCgpOworICAgIH0KK30KKworc3RhdHVzX3QgRnJhbWVEZWNvZGVyOjppbml0KAorICAgICAgICBpbnQ2NF90IGZyYW1lVGltZVVzLCBzaXplX3QgbnVtRnJhbWVzLCBpbnQgb3B0aW9uLCBpbnQgY29sb3JGb3JtYXQpIHsKKyAgICBpZiAoIWdldERzdENvbG9yRm9ybWF0KAorICAgICAgICAgICAgKGFuZHJvaWRfcGl4ZWxfZm9ybWF0X3QpY29sb3JGb3JtYXQsICZtRHN0Rm9ybWF0LCAmbURzdEJwcCkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiB2aWRlb0Zvcm1hdCA9IG9uR2V0Rm9ybWF0QW5kU2Vla09wdGlvbnMoCisgICAgICAgICAgICBmcmFtZVRpbWVVcywgbnVtRnJhbWVzLCBvcHRpb24sICZtUmVhZE9wdGlvbnMpOworICAgIGlmICh2aWRlb0Zvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJ2aWRlbyBmb3JtYXQgb3Igc2VlayBtb2RlIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIHN0YXR1c190IGVycjsKKyAgICBzcDxBTG9vcGVyPiBsb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICBsb29wZXItPnN0YXJ0KCk7CisgICAgc3A8TWVkaWFDb2RlYz4gZGVjb2RlciA9IE1lZGlhQ29kZWM6OkNyZWF0ZUJ5Q29tcG9uZW50TmFtZSgKKyAgICAgICAgICAgIGxvb3BlciwgbUNvbXBvbmVudE5hbWUsICZlcnIpOworICAgIGlmIChkZWNvZGVyLmdldCgpID09IE5VTEwgfHwgZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gaW5zdGFudGlhdGUgZGVjb2RlciBbJXNdIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiAoZGVjb2Rlci5nZXQoKSA9PSBOVUxMKSA/IE5PX01FTU9SWSA6IGVycjsKKyAgICB9CisKKyAgICBlcnIgPSBkZWNvZGVyLT5jb25maWd1cmUoCisgICAgICAgICAgICB2aWRlb0Zvcm1hdCwgTlVMTCAvKiBzdXJmYWNlICovLCBOVUxMIC8qIGNyeXB0byAqLywgMCAvKiBmbGFncyAqLyk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HVygiY29uZmlndXJlIHJldHVybmVkIGVycm9yICVkICglcykiLCBlcnIsIGFzU3RyaW5nKGVycikpOworICAgICAgICBkZWNvZGVyLT5yZWxlYXNlKCk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgZXJyID0gZGVjb2Rlci0+c3RhcnQoKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dXKCJzdGFydCByZXR1cm5lZCBlcnJvciAlZCAoJXMpIiwgZXJyLCBhc1N0cmluZyhlcnIpKTsKKyAgICAgICAgZGVjb2Rlci0+cmVsZWFzZSgpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGVyciA9IG1Tb3VyY2UtPnN0YXJ0KCk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HVygic291cmNlIGZhaWxlZCB0byBzdGFydDogJWQgKCVzKSIsIGVyciwgYXNTdHJpbmcoZXJyKSk7CisgICAgICAgIGRlY29kZXItPnJlbGVhc2UoKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgbURlY29kZXIgPSBkZWNvZGVyOworCisgICAgcmV0dXJuIE9LOworfQorCitzcDxJTWVtb3J5PiBGcmFtZURlY29kZXI6OmV4dHJhY3RGcmFtZShGcmFtZVJlY3QgKnJlY3QpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBvbkV4dHJhY3RSZWN0KHJlY3QpOworICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgZXJyID0gZXh0cmFjdEludGVybmFsKCk7CisgICAgfQorICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIG1GcmFtZXMuc2l6ZSgpID4gMCA/IG1GcmFtZXNbMF0gOiBOVUxMOworfQorCitzdGF0dXNfdCBGcmFtZURlY29kZXI6OmV4dHJhY3RGcmFtZXMoc3RkOjp2ZWN0b3I8c3A8SU1lbW9yeT4gPiogZnJhbWVzKSB7CisgICAgc3RhdHVzX3QgZXJyID0gZXh0cmFjdEludGVybmFsKCk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZyYW1lcy5zaXplKCk7IGkrKykgeworICAgICAgICBmcmFtZXMtPnB1c2hfYmFjayhtRnJhbWVzW2ldKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBGcmFtZURlY29kZXI6OmV4dHJhY3RJbnRlcm5hbCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICBib29sIGRvbmUgPSBmYWxzZTsKKyAgICBzaXplX3QgcmV0cmllc0xlZnQgPSBrUmV0cnlDb3VudDsKKyAgICBkbyB7CisgICAgICAgIHNpemVfdCBpbmRleDsKKyAgICAgICAgaW50NjRfdCBwdHNVcyA9IDBsbDsKKyAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworCisgICAgICAgIC8vIFF1ZXVlIGFzIG1hbnkgaW5wdXRzIGFzIHdlIHBvc3NpYmx5IGNhbiwgdGhlbiBibG9jayBvbiBkZXF1ZXVpbmcKKyAgICAgICAgLy8gb3V0cHV0cy4gQWZ0ZXIgZ2V0dGluZyBlYWNoIG91dHB1dCwgY29tZSBiYWNrIGFuZCBxdWV1ZSB0aGUgaW5wdXRzCisgICAgICAgIC8vIGFnYWluIHRvIGtlZXAgdGhlIGRlY29kZXIgYnVzeS4KKyAgICAgICAgd2hpbGUgKG1IYXZlTW9yZUlucHV0cykgeworICAgICAgICAgICAgZXJyID0gbURlY29kZXItPmRlcXVldWVJbnB1dEJ1ZmZlcigmaW5kZXgsIDApOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dWKCJUaW1lZCBvdXQgd2FpdGluZyBmb3IgaW5wdXQiKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0cmllc0xlZnQpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gT0s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gY29kZWNCdWZmZXI7CisgICAgICAgICAgICBlcnIgPSBtRGVjb2Rlci0+Z2V0SW5wdXRCdWZmZXIoaW5kZXgsICZjb2RlY0J1ZmZlcik7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0byBnZXQgaW5wdXQgYnVmZmVyICV6dSIsIGluZGV4KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICptZWRpYUJ1ZmZlciA9IE5VTEw7CisKKyAgICAgICAgICAgIGVyciA9IG1Tb3VyY2UtPnJlYWQoJm1lZGlhQnVmZmVyLCAmbVJlYWRPcHRpb25zKTsKKyAgICAgICAgICAgIG1SZWFkT3B0aW9ucy5jbGVhclNlZWtUbygpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dXKCJJbnB1dCBFcnJvciBvciBFT1MiKTsKKyAgICAgICAgICAgICAgICBtSGF2ZU1vcmVJbnB1dHMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZiAoIW1GaXJzdFNhbXBsZSAmJiBlcnIgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtZWRpYUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPiBjb2RlY0J1ZmZlci0+Y2FwYWNpdHkoKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJidWZmZXIgc2l6ZSAoJXp1KSB0b28gbGFyZ2UgZm9yIGNvZGVjIGlucHV0IHNpemUgKCV6dSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFCdWZmZXItPnJhbmdlX2xlbmd0aCgpLCBjb2RlY0J1ZmZlci0+Y2FwYWNpdHkoKSk7CisgICAgICAgICAgICAgICAgbUhhdmVNb3JlSW5wdXRzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZXJyID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb2RlY0J1ZmZlci0+c2V0UmFuZ2UoMCwgbWVkaWFCdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKKworICAgICAgICAgICAgICAgIENIRUNLKG1lZGlhQnVmZmVyLT5tZXRhX2RhdGEoKS5maW5kSW50NjQoa0tleVRpbWUsICZwdHNVcykpOworICAgICAgICAgICAgICAgIG1lbWNweShjb2RlY0J1ZmZlci0+ZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QqKW1lZGlhQnVmZmVyLT5kYXRhKCkgKyBtZWRpYUJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOworCisgICAgICAgICAgICAgICAgb25JbnB1dFJlY2VpdmVkKGNvZGVjQnVmZmVyLCBtZWRpYUJ1ZmZlci0+bWV0YV9kYXRhKCksIG1GaXJzdFNhbXBsZSwgJmZsYWdzKTsKKyAgICAgICAgICAgICAgICBtRmlyc3RTYW1wbGUgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbWVkaWFCdWZmZXItPnJlbGVhc2UoKTsKKworICAgICAgICAgICAgaWYgKG1IYXZlTW9yZUlucHV0cykgeworICAgICAgICAgICAgICAgIEFMT0dWKCJRdWV1ZUlucHV0OiBzaXplPSV6dSB0cz0lIiBQUklkNjQgIiB1cyBmbGFncz0leCIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY0J1ZmZlci0+c2l6ZSgpLCBwdHNVcywgZmxhZ3MpOworCisgICAgICAgICAgICAgICAgZXJyID0gbURlY29kZXItPnF1ZXVlSW5wdXRCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjQnVmZmVyLT5vZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjQnVmZmVyLT5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICBwdHNVcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKworICAgICAgICAgICAgICAgIGlmIChmbGFncyAmIE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0VPUykgeworICAgICAgICAgICAgICAgICAgICBtSGF2ZU1vcmVJbnB1dHMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAoZXJyID09IE9LKSB7CisgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0LCBzaXplOworICAgICAgICAgICAgLy8gd2FpdCBmb3IgYSBkZWNvZGVkIGJ1ZmZlcgorICAgICAgICAgICAgZXJyID0gbURlY29kZXItPmRlcXVldWVPdXRwdXRCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICZpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICZwdHNVcywKKyAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAorICAgICAgICAgICAgICAgICAgICBrQnVmZmVyVGltZU91dFVzKTsKKworICAgICAgICAgICAgaWYgKGVyciA9PSBJTkZPX0ZPUk1BVF9DSEFOR0VEKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIlJlY2VpdmVkIGZvcm1hdCBjaGFuZ2UiKTsKKyAgICAgICAgICAgICAgICBlcnIgPSBtRGVjb2Rlci0+Z2V0T3V0cHV0Rm9ybWF0KCZtT3V0cHV0Rm9ybWF0KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyID09IElORk9fT1VUUFVUX0JVRkZFUlNfQ0hBTkdFRCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJPdXRwdXQgYnVmZmVycyBjaGFuZ2VkIik7CisgICAgICAgICAgICAgICAgZXJyID0gT0s7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gLUVBR0FJTiAvKiBJTkZPX1RSWV9BR0FJTl9MQVRFUiAqLyAmJiAtLXJldHJpZXNMZWZ0ID4gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiVGltZWQtb3V0IHdhaXRpbmcgZm9yIG91dHB1dC4uIHJldHJpZXMgbGVmdCA9ICV6dSIsIHJldHJpZXNMZWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gT0s7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UncmUgc2Vla2luZyB3aXRoIENMT1NFU1Qgb3B0aW9uIGFuZCBvYnRhaW5lZCBhIHZhbGlkIHRhcmdldFRpbWVVcworICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSBleHRyYWN0b3IsIGRlY29kZSB0byB0aGUgc3BlY2lmaWVkIGZyYW1lLiBPdGhlcndpc2Ugd2UncmUgZG9uZS4KKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlJlY2VpdmVkIGFuIG91dHB1dCBidWZmZXIsIHRpbWVVcz0lbGxkIiwgKGxvbmcgbG9uZylwdHNVcyk7CisgICAgICAgICAgICAgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IHZpZGVvRnJhbWVCdWZmZXI7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IG1EZWNvZGVyLT5nZXRPdXRwdXRCdWZmZXIoaW5kZXgsICZ2aWRlb0ZyYW1lQnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0byBnZXQgb3V0cHV0IGJ1ZmZlciAlenUiLCBpbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlcnIgPSBvbk91dHB1dFJlY2VpdmVkKHZpZGVvRnJhbWVCdWZmZXIsIG1PdXRwdXRGb3JtYXQsIHB0c1VzLCAmZG9uZSk7CisgICAgICAgICAgICAgICAgICAgIG1EZWNvZGVyLT5yZWxlYXNlT3V0cHV0QnVmZmVyKGluZGV4KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiUmVjZWl2ZWQgZXJyb3IgJWQgKCVzKSBpbnN0ZWFkIG9mIG91dHB1dCIsIGVyciwgYXNTdHJpbmcoZXJyKSk7CisgICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gd2hpbGUgKGVyciA9PSBPSyAmJiAhZG9uZSk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gZ2V0IHZpZGVvIGZyYW1lIChlcnIgJWQpIiwgZXJyKTsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1ZpZGVvRnJhbWVEZWNvZGVyOjpWaWRlb0ZyYW1lRGVjb2RlcigKKyAgICAgICAgY29uc3QgQVN0cmluZyAmY29tcG9uZW50TmFtZSwKKyAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZ0cmFja01ldGEsCisgICAgICAgIGNvbnN0IHNwPElNZWRpYVNvdXJjZT4gJnNvdXJjZSkKKyAgICA6IEZyYW1lRGVjb2Rlcihjb21wb25lbnROYW1lLCB0cmFja01ldGEsIHNvdXJjZSksCisgICAgICBtSXNBdmNPckhldmMoZmFsc2UpLAorICAgICAgbVNlZWtNb2RlKE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DKSwKKyAgICAgIG1UYXJnZXRUaW1lVXMoLTFsbCksCisgICAgICBtTnVtRnJhbWVzKDApLAorICAgICAgbU51bUZyYW1lc0RlY29kZWQoMCkgeworfQorCitzcDxBTWVzc2FnZT4gVmlkZW9GcmFtZURlY29kZXI6Om9uR2V0Rm9ybWF0QW5kU2Vla09wdGlvbnMoCisgICAgICAgIGludDY0X3QgZnJhbWVUaW1lVXMsIHNpemVfdCBudW1GcmFtZXMsIGludCBzZWVrTW9kZSwgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zICpvcHRpb25zKSB7CisgICAgbVNlZWtNb2RlID0gc3RhdGljX2Nhc3Q8TWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZT4oc2Vla01vZGUpOworICAgIGlmIChtU2Vla01vZGUgPCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQyB8fAorICAgICAgICAgICAgbVNlZWtNb2RlID4gTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX0ZSQU1FX0lOREVYKSB7CisgICAgICAgIEFMT0dFKCJVbmtub3duIHNlZWsgbW9kZTogJWQiLCBtU2Vla01vZGUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbU51bUZyYW1lcyA9IG51bUZyYW1lczsKKworICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgaWYgKCF0cmFja01ldGEoKS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpIHsKKyAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBmaW5kIG1pbWUgdHlwZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBtSXNBdmNPckhldmMgPSAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpCisgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKTsKKworICAgIGlmIChmcmFtZVRpbWVVcyA8IDApIHsKKyAgICAgICAgaW50NjRfdCB0aHVtYk5haWxUaW1lOworICAgICAgICBpZiAoIXRyYWNrTWV0YSgpLT5maW5kSW50NjQoa0tleVRodW1ibmFpbFRpbWUsICZ0aHVtYk5haWxUaW1lKQorICAgICAgICAgICAgICAgIHx8IHRodW1iTmFpbFRpbWUgPCAwKSB7CisgICAgICAgICAgICB0aHVtYk5haWxUaW1lID0gMDsKKyAgICAgICAgfQorICAgICAgICBvcHRpb25zLT5zZXRTZWVrVG8odGh1bWJOYWlsVGltZSwgbVNlZWtNb2RlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBvcHRpb25zLT5zZXRTZWVrVG8oZnJhbWVUaW1lVXMsIG1TZWVrTW9kZSk7CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IHZpZGVvRm9ybWF0OworICAgIGlmIChjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UodHJhY2tNZXRhKCksICZ2aWRlb0Zvcm1hdCkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoImIvMjM2ODA3ODAiKTsKKyAgICAgICAgQUxPR1coIkZhaWxlZCB0byBjb252ZXJ0IG1ldGEgZGF0YSB0byBtZXNzYWdlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8vIFRPRE86IFVzZSBGbGV4aWJsZSBjb2xvciBpbnN0ZWFkCisgICAgdmlkZW9Gb3JtYXQtPnNldEludDMyKCJjb2xvci1mb3JtYXQiLCBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKTsKKworICAgIC8vIEZvciB0aGUgdGh1bWJuYWlsIGV4dHJhY3Rpb24gY2FzZSwgdHJ5IHRvIGFsbG9jYXRlIHNpbmdsZSBidWZmZXIgaW4gYm90aAorICAgIC8vIGlucHV0IGFuZCBvdXRwdXQgcG9ydHMsIGlmIHNlZWtpbmcgdG8gYSBzeW5jIGZyYW1lLiBOT1RFOiBUaGlzIHJlcXVlc3QgbWF5CisgICAgLy8gZmFpbCBpZiBjb21wb25lbnQgcmVxdWlyZXMgbW9yZSB0aGFuIHRoYXQgZm9yIGRlY29kaW5nLgorICAgIGJvb2wgaXNTZWVraW5nQ2xvc2VzdCA9IChtU2Vla01vZGUgPT0gTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1QpCisgICAgICAgICAgICB8fCAobVNlZWtNb2RlID09IE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19GUkFNRV9JTkRFWCk7CisgICAgaWYgKCFpc1NlZWtpbmdDbG9zZXN0KSB7CisgICAgICAgIHZpZGVvRm9ybWF0LT5zZXRJbnQzMigiYW5kcm9pZC5fbnVtLWlucHV0LWJ1ZmZlcnMiLCAxKTsKKyAgICAgICAgdmlkZW9Gb3JtYXQtPnNldEludDMyKCJhbmRyb2lkLl9udW0tb3V0cHV0LWJ1ZmZlcnMiLCAxKTsKKyAgICB9CisgICAgcmV0dXJuIHZpZGVvRm9ybWF0OworfQorCitzdGF0dXNfdCBWaWRlb0ZyYW1lRGVjb2Rlcjo6b25JbnB1dFJlY2VpdmVkKAorICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmY29kZWNCdWZmZXIsCisgICAgICAgIE1ldGFEYXRhQmFzZSAmc2FtcGxlTWV0YSwgYm9vbCBmaXJzdFNhbXBsZSwgdWludDMyX3QgKmZsYWdzKSB7CisgICAgYm9vbCBpc1NlZWtpbmdDbG9zZXN0ID0gKG1TZWVrTW9kZSA9PSBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVCkKKyAgICAgICAgICAgIHx8IChtU2Vla01vZGUgPT0gTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX0ZSQU1FX0lOREVYKTsKKworICAgIGlmIChmaXJzdFNhbXBsZSAmJiBpc1NlZWtpbmdDbG9zZXN0KSB7CisgICAgICAgIHNhbXBsZU1ldGEuZmluZEludDY0KGtLZXlUYXJnZXRUaW1lLCAmbVRhcmdldFRpbWVVcyk7CisgICAgICAgIEFMT0dWKCJTZWVraW5nIGNsb3Nlc3Q6IHRhcmdldFRpbWVVcz0lbGxkIiwgKGxvbmcgbG9uZyltVGFyZ2V0VGltZVVzKTsKKyAgICB9CisKKyAgICBpZiAobUlzQXZjT3JIZXZjICYmICFpc1NlZWtpbmdDbG9zZXN0CisgICAgICAgICAgICAmJiBJc0lEUihjb2RlY0J1ZmZlci0+ZGF0YSgpLCBjb2RlY0J1ZmZlci0+c2l6ZSgpKSkgeworICAgICAgICAvLyBPbmx5IG5lZWQgdG8gZGVjb2RlIG9uZSBJRFIgZnJhbWUsIHVubGVzcyB3ZSdyZSBzZWVraW5nIHdpdGggQ0xPU0VTVAorICAgICAgICAvLyBvcHRpb24sIGluIHdoaWNoIGNhc2Ugd2UgbmVlZCB0byBhY3R1YWxseSBkZWNvZGUgdG8gdGFyZ2V0VGltZVVzLgorICAgICAgICAqZmxhZ3MgfD0gTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfRU9TOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFZpZGVvRnJhbWVEZWNvZGVyOjpvbk91dHB1dFJlY2VpdmVkKAorICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmdmlkZW9GcmFtZUJ1ZmZlciwKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQsCisgICAgICAgIGludDY0X3QgdGltZVVzLCBib29sICpkb25lKSB7CisgICAgYm9vbCBzaG91bGRPdXRwdXQgPSAobVRhcmdldFRpbWVVcyA8IDBsbCkgfHwgKHRpbWVVcyA+PSBtVGFyZ2V0VGltZVVzKTsKKworICAgIC8vIElmIHRoaXMgaXMgbm90IHRoZSB0YXJnZXQgZnJhbWUsIHNraXAgY29sb3IgY29udmVydC4KKyAgICBpZiAoIXNob3VsZE91dHB1dCkgeworICAgICAgICAqZG9uZSA9IGZhbHNlOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgKmRvbmUgPSAoKyttTnVtRnJhbWVzRGVjb2RlZCA+PSBtTnVtRnJhbWVzKTsKKworICAgIGlmIChvdXRwdXRGb3JtYXQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgICBDSEVDSyhvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpKTsKKyAgICBDSEVDSyhvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpOworCisgICAgaW50MzJfdCBjcm9wX2xlZnQsIGNyb3BfdG9wLCBjcm9wX3JpZ2h0LCBjcm9wX2JvdHRvbTsKKyAgICBpZiAoIW91dHB1dEZvcm1hdC0+ZmluZFJlY3QoImNyb3AiLCAmY3JvcF9sZWZ0LCAmY3JvcF90b3AsICZjcm9wX3JpZ2h0LCAmY3JvcF9ib3R0b20pKSB7CisgICAgICAgIGNyb3BfbGVmdCA9IGNyb3BfdG9wID0gMDsKKyAgICAgICAgY3JvcF9yaWdodCA9IHdpZHRoIC0gMTsKKyAgICAgICAgY3JvcF9ib3R0b20gPSBoZWlnaHQgLSAxOworICAgIH0KKworICAgIHNwPElNZW1vcnk+IGZyYW1lTWVtID0gYWxsb2NWaWRlb0ZyYW1lKAorICAgICAgICAgICAgdHJhY2tNZXRhKCksCisgICAgICAgICAgICAoY3JvcF9yaWdodCAtIGNyb3BfbGVmdCArIDEpLAorICAgICAgICAgICAgKGNyb3BfYm90dG9tIC0gY3JvcF90b3AgKyAxKSwKKyAgICAgICAgICAgIDAsCisgICAgICAgICAgICAwLAorICAgICAgICAgICAgZHN0QnBwKCkpOworICAgIGFkZEZyYW1lKGZyYW1lTWVtKTsKKyAgICBWaWRlb0ZyYW1lKiBmcmFtZSA9IHN0YXRpY19jYXN0PFZpZGVvRnJhbWUqPihmcmFtZU1lbS0+cG9pbnRlcigpKTsKKworICAgIGludDMyX3Qgc3JjRm9ybWF0OworICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJjb2xvci1mb3JtYXQiLCAmc3JjRm9ybWF0KSk7CisKKyAgICBDb2xvckNvbnZlcnRlciBjb252ZXJ0ZXIoKE9NWF9DT0xPUl9GT1JNQVRUWVBFKXNyY0Zvcm1hdCwgZHN0Rm9ybWF0KCkpOworCisgICAgaWYgKGNvbnZlcnRlci5pc1ZhbGlkKCkpIHsKKyAgICAgICAgY29udmVydGVyLmNvbnZlcnQoCisgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKil2aWRlb0ZyYW1lQnVmZmVyLT5kYXRhKCksCisgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICBjcm9wX2xlZnQsIGNyb3BfdG9wLCBjcm9wX3JpZ2h0LCBjcm9wX2JvdHRvbSwKKyAgICAgICAgICAgICAgICBmcmFtZS0+Z2V0RmxhdHRlbmVkRGF0YSgpLAorICAgICAgICAgICAgICAgIGZyYW1lLT5tV2lkdGgsCisgICAgICAgICAgICAgICAgZnJhbWUtPm1IZWlnaHQsCisgICAgICAgICAgICAgICAgY3JvcF9sZWZ0LCBjcm9wX3RvcCwgY3JvcF9yaWdodCwgY3JvcF9ib3R0b20pOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgQUxPR0UoIlVuYWJsZSB0byBjb252ZXJ0IGZyb20gZm9ybWF0IDB4JTA4eCB0byAweCUwOHgiLAorICAgICAgICAgICAgICAgIHNyY0Zvcm1hdCwgZHN0Rm9ybWF0KCkpOworICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0ltYWdlRGVjb2Rlcjo6SW1hZ2VEZWNvZGVyKAorICAgICAgICBjb25zdCBBU3RyaW5nICZjb21wb25lbnROYW1lLAorICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJnRyYWNrTWV0YSwKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhU291cmNlPiAmc291cmNlKQorICAgIDogRnJhbWVEZWNvZGVyKGNvbXBvbmVudE5hbWUsIHRyYWNrTWV0YSwgc291cmNlKSwKKyAgICAgIG1GcmFtZShOVUxMKSwKKyAgICAgIG1XaWR0aCgwKSwKKyAgICAgIG1IZWlnaHQoMCksCisgICAgICBtR3JpZFJvd3MoMSksCisgICAgICBtR3JpZENvbHMoMSksCisgICAgICBtVGlsZVdpZHRoKDApLAorICAgICAgbVRpbGVIZWlnaHQoMCksCisgICAgICBtVGlsZXNEZWNvZGVkKDApLAorICAgICAgbVRhcmdldFRpbGVzKDApIHsKK30KKworc3A8QU1lc3NhZ2U+IEltYWdlRGVjb2Rlcjo6b25HZXRGb3JtYXRBbmRTZWVrT3B0aW9ucygKKyAgICAgICAgaW50NjRfdCBmcmFtZVRpbWVVcywgc2l6ZV90IC8qbnVtRnJhbWVzKi8sCisgICAgICAgIGludCAvKnNlZWtNb2RlKi8sIE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworICAgIHNwPE1ldGFEYXRhPiBvdmVycmlkZU1ldGE7CisgICAgaWYgKGZyYW1lVGltZVVzIDwgMCkgeworICAgICAgICB1aW50MzJfdCB0eXBlOworICAgICAgICBjb25zdCB2b2lkICpkYXRhOworICAgICAgICBzaXplX3Qgc2l6ZTsKKworICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgc3RhbmQtYWxvbmUgdGh1bWJuYWlsLCBzZXQgdXAgdGhlIG92ZXJyaWRlIG1ldGEsCisgICAgICAgIC8vIGFuZCBzZXQgc2Vla1RvIHRpbWUgdG8gLTEuCisgICAgICAgIGlmICghZmluZFRodW1ibmFpbEluZm8odHJhY2tNZXRhKCksICZtV2lkdGgsICZtSGVpZ2h0LCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgQUxPR0UoIlRodW1ibmFpbCBub3QgYXZhaWxhYmxlIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBvdmVycmlkZU1ldGEgPSBuZXcgTWV0YURhdGEoKih0cmFja01ldGEoKSkpOworICAgICAgICBvdmVycmlkZU1ldGEtPnJlbW92ZShrS2V5RGlzcGxheVdpZHRoKTsKKyAgICAgICAgb3ZlcnJpZGVNZXRhLT5yZW1vdmUoa0tleURpc3BsYXlIZWlnaHQpOworICAgICAgICBvdmVycmlkZU1ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgbVdpZHRoKTsKKyAgICAgICAgb3ZlcnJpZGVNZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBtSGVpZ2h0KTsKKyAgICAgICAgb3ZlcnJpZGVNZXRhLT5zZXREYXRhKGtLZXlIVkNDLCB0eXBlLCBkYXRhLCBzaXplKTsKKyAgICAgICAgb3B0aW9ucy0+c2V0U2Vla1RvKC0xKTsKKyAgICB9IGVsc2UgeworICAgICAgICBDSEVDSyh0cmFja01ldGEoKS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJm1XaWR0aCkpOworICAgICAgICBDSEVDSyh0cmFja01ldGEoKS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZtSGVpZ2h0KSk7CisKKyAgICAgICAgb3B0aW9ucy0+c2V0U2Vla1RvKGZyYW1lVGltZVVzKTsKKyAgICB9CisKKyAgICBtR3JpZFJvd3MgPSBtR3JpZENvbHMgPSAxOworICAgIGlmIChvdmVycmlkZU1ldGEgPT0gTlVMTCkgeworICAgICAgICAvLyBjaGVjayBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSB0aWxlZCBoZWlmCisgICAgICAgIGludDMyX3QgdGlsZVdpZHRoLCB0aWxlSGVpZ2h0LCBncmlkUm93cywgZ3JpZENvbHM7CisgICAgICAgIGlmIChmaW5kR3JpZEluZm8odHJhY2tNZXRhKCksICZ0aWxlV2lkdGgsICZ0aWxlSGVpZ2h0LCAmZ3JpZFJvd3MsICZncmlkQ29scykpIHsKKyAgICAgICAgICAgIGlmIChtV2lkdGggPD0gdGlsZVdpZHRoICogZ3JpZENvbHMgJiYgbUhlaWdodCA8PSB0aWxlSGVpZ2h0ICogZ3JpZFJvd3MpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiZ3JpZDogJWR4JWQsIHRpbGUgc2l6ZTogJWR4JWQsIHBpY3R1cmUgc2l6ZTogJWR4JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgZ3JpZENvbHMsIGdyaWRSb3dzLCB0aWxlV2lkdGgsIHRpbGVIZWlnaHQsIG1XaWR0aCwgbUhlaWdodCk7CisKKyAgICAgICAgICAgICAgICBvdmVycmlkZU1ldGEgPSBuZXcgTWV0YURhdGEoKih0cmFja01ldGEoKSkpOworICAgICAgICAgICAgICAgIG92ZXJyaWRlTWV0YS0+c2V0SW50MzIoa0tleVdpZHRoLCB0aWxlV2lkdGgpOworICAgICAgICAgICAgICAgIG92ZXJyaWRlTWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgdGlsZUhlaWdodCk7CisgICAgICAgICAgICAgICAgbVRpbGVXaWR0aCA9IHRpbGVXaWR0aDsKKyAgICAgICAgICAgICAgICBtVGlsZUhlaWdodCA9IHRpbGVIZWlnaHQ7CisgICAgICAgICAgICAgICAgbUdyaWRDb2xzID0gZ3JpZENvbHM7CisgICAgICAgICAgICAgICAgbUdyaWRSb3dzID0gZ3JpZFJvd3M7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCJpZ25vcmUgYmFkIGdyaWQ6ICVkeCVkLCB0aWxlIHNpemU6ICVkeCVkLCBwaWN0dXJlIHNpemU6ICVkeCVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyaWRDb2xzLCBncmlkUm93cywgdGlsZVdpZHRoLCB0aWxlSGVpZ2h0LCBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChvdmVycmlkZU1ldGEgPT0gTlVMTCkgeworICAgICAgICAgICAgb3ZlcnJpZGVNZXRhID0gdHJhY2tNZXRhKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgbVRhcmdldFRpbGVzID0gbUdyaWRDb2xzICogbUdyaWRSb3dzOworCisgICAgc3A8QU1lc3NhZ2U+IHZpZGVvRm9ybWF0OworICAgIGlmIChjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2Uob3ZlcnJpZGVNZXRhLCAmdmlkZW9Gb3JtYXQpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJiLzIzNjgwNzgwIik7CisgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gY29udmVydCBtZXRhIGRhdGEgdG8gbWVzc2FnZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvLyBUT0RPOiBVc2UgRmxleGlibGUgY29sb3IgaW5zdGVhZAorICAgIHZpZGVvRm9ybWF0LT5zZXRJbnQzMigiY29sb3ItZm9ybWF0IiwgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcik7CisKKyAgICBpZiAoKG1HcmlkUm93cyA9PSAxKSAmJiAobUdyaWRDb2xzID09IDEpKSB7CisgICAgICAgIHZpZGVvRm9ybWF0LT5zZXRJbnQzMigiYW5kcm9pZC5fbnVtLWlucHV0LWJ1ZmZlcnMiLCAxKTsKKyAgICAgICAgdmlkZW9Gb3JtYXQtPnNldEludDMyKCJhbmRyb2lkLl9udW0tb3V0cHV0LWJ1ZmZlcnMiLCAxKTsKKyAgICB9CisgICAgcmV0dXJuIHZpZGVvRm9ybWF0OworfQorCitzdGF0dXNfdCBJbWFnZURlY29kZXI6Om9uRXh0cmFjdFJlY3QoRnJhbWVSZWN0ICpyZWN0KSB7CisgICAgLy8gVE9ETzoKKyAgICAvLyBUaGlzIGNhbGxiYWNrIGlzIGZvciB2ZXJpZnlpbmcgd2hldGhlciB3ZSBjYW4gZGVjb2RlIHRoZSByZWN0LAorICAgIC8vIGFuZCBpZiBzbywgc2V0IHVwIHRoZSBpbnRlcm5hbCB2YXJpYWJsZXMgZm9yIGRlY29kaW5nLgorICAgIC8vIEN1cnJlbnRseSwgcmVjdCBkZWNvZGluZyBpcyByZXN0cmljdGVkIHRvIHNlcXVlbnRpYWxseSBkZWNvZGluZyBvbmUKKyAgICAvLyByb3cgb2YgdGlsZXMgYXQgYSB0aW1lLiBXZSBjYW4ndCBkZWNvZGUgYXJiaXRyYXJ5IHJlY3RzLCBhcyB0aGUgaW1hZ2UKKyAgICAvLyB0cmFjayBkb2Vzbid0IHlldCBzdXBwb3J0IHNlZWtpbmcgYnkgdGlsZXMuIFNvIGFsbCB3ZSBkbyBoZXJlIGlzIHRvCisgICAgLy8gdmVyaWZ5IHRoZSByZWN0IGFnYWluc3Qgd2hhdCB3ZSBleHBlY3QuCisgICAgLy8gV2hlbiBzZWVraW5nIGJ5IHRpbGUgaXMgc3VwcG9ydGVkLCB0aGlzIGNvZGUgc2hvdWxkIGJlIHVwZGF0ZWQgdG8KKyAgICAvLyBzZXQgdGhlIHNlZWsgcGFyYW1ldGVycy4KKyAgICBpZiAocmVjdCA9PSBOVUxMKSB7CisgICAgICAgIGlmIChtVGlsZXNEZWNvZGVkID4gMCkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICB9CisgICAgICAgIG1UYXJnZXRUaWxlcyA9IG1HcmlkUm93cyAqIG1HcmlkQ29sczsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGlmIChtVGlsZVdpZHRoIDw9IDAgfHwgbVRpbGVIZWlnaHQgPD0wKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICBpbnQzMl90IHJvdyA9IG1UaWxlc0RlY29kZWQgLyBtR3JpZENvbHM7CisgICAgaW50MzJfdCBleHBlY3RlZFRvcCA9IHJvdyAqIG1UaWxlSGVpZ2h0OworICAgIGludDMyX3QgZXhwZWN0ZWRCb3QgPSAocm93ICsgMSkgKiBtVGlsZUhlaWdodDsKKyAgICBpZiAoZXhwZWN0ZWRCb3QgPiBtSGVpZ2h0KSB7CisgICAgICAgIGV4cGVjdGVkQm90ID0gbUhlaWdodDsKKyAgICB9CisgICAgaWYgKHJlY3QtPmxlZnQgIT0gMCB8fCByZWN0LT50b3AgIT0gZXhwZWN0ZWRUb3AKKyAgICAgICAgICAgIHx8IHJlY3QtPnJpZ2h0ICE9IG1XaWR0aCB8fCByZWN0LT5ib3R0b20gIT0gZXhwZWN0ZWRCb3QpIHsKKyAgICAgICAgQUxPR0UoImN1cnJlbnRseSBvbmx5IHN1cHBvcnQgc2VxdWVudGlhbCBkZWNvZGluZyBvZiBzbGljZXMiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIC8vIGFkdmFuY2Ugb25lIHJvdworICAgIG1UYXJnZXRUaWxlcyA9IG1UaWxlc0RlY29kZWQgKyBtR3JpZENvbHM7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBJbWFnZURlY29kZXI6Om9uT3V0cHV0UmVjZWl2ZWQoCisgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZ2aWRlb0ZyYW1lQnVmZmVyLAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm91dHB1dEZvcm1hdCwgaW50NjRfdCAvKnRpbWVVcyovLCBib29sICpkb25lKSB7CisgICAgaWYgKG91dHB1dEZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkpOworICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSk7CisKKyAgICBpZiAobUZyYW1lID09IE5VTEwpIHsKKyAgICAgICAgc3A8SU1lbW9yeT4gZnJhbWVNZW0gPSBhbGxvY1ZpZGVvRnJhbWUoCisgICAgICAgICAgICAgICAgdHJhY2tNZXRhKCksIG1XaWR0aCwgbUhlaWdodCwgbVRpbGVXaWR0aCwgbVRpbGVIZWlnaHQsIGRzdEJwcCgpKTsKKyAgICAgICAgbUZyYW1lID0gc3RhdGljX2Nhc3Q8VmlkZW9GcmFtZSo+KGZyYW1lTWVtLT5wb2ludGVyKCkpOworCisgICAgICAgIGFkZEZyYW1lKGZyYW1lTWVtKTsKKyAgICB9CisKKyAgICBpbnQzMl90IHNyY0Zvcm1hdDsKKyAgICBDSEVDSyhvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJnNyY0Zvcm1hdCkpOworCisgICAgQ29sb3JDb252ZXJ0ZXIgY29udmVydGVyKChPTVhfQ09MT1JfRk9STUFUVFlQRSlzcmNGb3JtYXQsIGRzdEZvcm1hdCgpKTsKKworICAgIGludDMyX3QgZHN0TGVmdCwgZHN0VG9wLCBkc3RSaWdodCwgZHN0Qm90dG9tOworICAgIGRzdExlZnQgPSBtVGlsZXNEZWNvZGVkICUgbUdyaWRDb2xzICogd2lkdGg7CisgICAgZHN0VG9wID0gbVRpbGVzRGVjb2RlZCAvIG1HcmlkQ29scyAqIGhlaWdodDsKKyAgICBkc3RSaWdodCA9IGRzdExlZnQgKyB3aWR0aCAtIDE7CisgICAgZHN0Qm90dG9tID0gZHN0VG9wICsgaGVpZ2h0IC0gMTsKKworICAgIGludDMyX3QgY3JvcF9sZWZ0LCBjcm9wX3RvcCwgY3JvcF9yaWdodCwgY3JvcF9ib3R0b207CisgICAgaWYgKCFvdXRwdXRGb3JtYXQtPmZpbmRSZWN0KCJjcm9wIiwgJmNyb3BfbGVmdCwgJmNyb3BfdG9wLCAmY3JvcF9yaWdodCwgJmNyb3BfYm90dG9tKSkgeworICAgICAgICBjcm9wX2xlZnQgPSBjcm9wX3RvcCA9IDA7CisgICAgICAgIGNyb3BfcmlnaHQgPSB3aWR0aCAtIDE7CisgICAgICAgIGNyb3BfYm90dG9tID0gaGVpZ2h0IC0gMTsKKyAgICB9CisKKyAgICAvLyBhcHBseSBjcm9wIG9uIGJvdHRvbS1yaWdodAorICAgIC8vIFRPRE86IG5lZWQgdG8gbW92ZSB0aGlzIGludG8gdGhlIGNvbG9yIGNvbnZlcnRlciBpdHNlbGYuCisgICAgaWYgKGRzdFJpZ2h0ID49IG1XaWR0aCkgeworICAgICAgICBjcm9wX3JpZ2h0ID0gbVdpZHRoIC0gZHN0TGVmdCAtIDE7CisgICAgICAgIGRzdFJpZ2h0ID0gZHN0TGVmdCArIGNyb3BfcmlnaHQ7CisgICAgfQorICAgIGlmIChkc3RCb3R0b20gPj0gbUhlaWdodCkgeworICAgICAgICBjcm9wX2JvdHRvbSA9IG1IZWlnaHQgLSBkc3RUb3AgLSAxOworICAgICAgICBkc3RCb3R0b20gPSBkc3RUb3AgKyBjcm9wX2JvdHRvbTsKKyAgICB9CisKKyAgICAqZG9uZSA9ICgrK21UaWxlc0RlY29kZWQgPj0gbVRhcmdldFRpbGVzKTsKKworICAgIGlmIChjb252ZXJ0ZXIuaXNWYWxpZCgpKSB7CisgICAgICAgIGNvbnZlcnRlci5jb252ZXJ0KAorICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopdmlkZW9GcmFtZUJ1ZmZlci0+ZGF0YSgpLAorICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgY3JvcF9sZWZ0LCBjcm9wX3RvcCwgY3JvcF9yaWdodCwgY3JvcF9ib3R0b20sCisgICAgICAgICAgICAgICAgbUZyYW1lLT5nZXRGbGF0dGVuZWREYXRhKCksCisgICAgICAgICAgICAgICAgbUZyYW1lLT5tV2lkdGgsCisgICAgICAgICAgICAgICAgbUZyYW1lLT5tSGVpZ2h0LAorICAgICAgICAgICAgICAgIGRzdExlZnQsIGRzdFRvcCwgZHN0UmlnaHQsIGRzdEJvdHRvbSk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBBTE9HRSgiVW5hYmxlIHRvIGNvbnZlcnQgZnJvbSBmb3JtYXQgMHglMDh4IHRvIDB4JTA4eCIsCisgICAgICAgICAgICAgICAgc3JjRm9ybWF0LCBkc3RGb3JtYXQoKSk7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSGV2Y1V0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hldmNVdGlscy5jcHAKaW5kZXggN2Q0NjNhOS4uZjE1MmEzOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSGV2Y1V0aWxzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9IZXZjVXRpbHMuY3BwCkBAIC0yMSwxMiArMjEsMTIgQEAKICNpbmNsdWRlIDx1dGlsaXR5PgogCiAjaW5jbHVkZSAiaW5jbHVkZS9IZXZjVXRpbHMuaCIKLSNpbmNsdWRlICJpbmNsdWRlL2F2Y191dGlscy5oIgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9hdmNfdXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAKQEAgLTE2Miw2ICsxNjIsOCBAQAogICAgIHJlYWRlci5za2lwQml0cygxKTsKICAgICAvLyBTa2lwIHZwc19tYXhfbGF5ZXJzX21pbnVzXzEKICAgICByZWFkZXIuc2tpcEJpdHMoNik7CisgICAgLy8gU2tpcCB2cHNfbWF4X3N1Yl9sYXllcnNfbWludXMxCisgICAgcmVhZGVyLnNraXBCaXRzKDMpOwogICAgIC8vIFNraXAgdnBzX3RlbXBvcmFsX2lkX25lc3RpbmdfZmxhZ3MKICAgICByZWFkZXIuc2tpcEJpdHMoMSk7CiAgICAgLy8gU2tpcCByZXNlcnZlZApAQCAtNDIyLDcgKzQyNCw3IEBACiAKICAgICB1aW50OF90ICpoZWFkZXIgPSBodmNjOwogICAgIGhlYWRlclswXSA9IDE7Ci0gICAgaGVhZGVyWzFdID0gKGtHZW5lcmFsUHJvZmlsZVNwYWNlIDw8IDYpIHwgKGtHZW5lcmFsVGllckZsYWcgPDwgNSkgfCBrR2VuZXJhbFByb2ZpbGVJZGM7CisgICAgaGVhZGVyWzFdID0gKGdlbmVyYWxQcm9maWxlU3BhY2UgPDwgNikgfCAoZ2VuZXJhbFRpZXJGbGFnIDw8IDUpIHwgZ2VuZXJhbFByb2ZpbGVJZGM7CiAgICAgaGVhZGVyWzJdID0gKGNvbXBhdGliaWxpdHlGbGFncyA+PiAyNCkgJiAweGZmOwogICAgIGhlYWRlclszXSA9IChjb21wYXRpYmlsaXR5RmxhZ3MgPj4gMTYpICYgMHhmZjsKICAgICBoZWFkZXJbNF0gPSAoY29tcGF0aWJpbGl0eUZsYWdzID4+IDgpICYgMHhmZjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ludGVyZmFjZVV0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ludGVyZmFjZVV0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmM1OTA4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSW50ZXJmYWNlVXRpbHMuY3BwCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZS9DYWxsYmFja0RhdGFTb3VyY2UuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NhbGxiYWNrTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZURhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVNZWRpYVNvdXJjZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3NwPERhdGFTb3VyY2U+IENyZWF0ZURhdGFTb3VyY2VGcm9tSURhdGFTb3VyY2UoY29uc3Qgc3A8SURhdGFTb3VyY2U+ICZzb3VyY2UpIHsKKyAgICBpZiAoc291cmNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBuZXcgVGlueUNhY2hlU291cmNlKG5ldyBDYWxsYmFja0RhdGFTb3VyY2Uoc291cmNlKSk7Cit9CisKK3NwPElEYXRhU291cmNlPiBDcmVhdGVJRGF0YVNvdXJjZUZyb21EYXRhU291cmNlKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UpIHsKKyAgICBpZiAoc291cmNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBSZW1vdGVEYXRhU291cmNlOjp3cmFwKHNvdXJjZSk7Cit9CisKK3NwPElNZWRpYUV4dHJhY3Rvcj4gQ3JlYXRlSU1lZGlhRXh0cmFjdG9yRnJvbU1lZGlhRXh0cmFjdG9yKAorICAgICAgICBNZWRpYUV4dHJhY3RvciAqZXh0cmFjdG9yLAorICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLAorICAgICAgICBjb25zdCBzcDxSZWZCYXNlPiAmcGx1Z2luKSB7CisgICAgaWYgKGV4dHJhY3RvciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gUmVtb3RlTWVkaWFFeHRyYWN0b3I6OndyYXAoZXh0cmFjdG9yLCBzb3VyY2UsIHBsdWdpbik7Cit9CisKK3NwPE1lZGlhU291cmNlPiBDcmVhdGVNZWRpYVNvdXJjZUZyb21JTWVkaWFTb3VyY2UoY29uc3Qgc3A8SU1lZGlhU291cmNlPiAmc291cmNlKSB7CisgICAgaWYgKHNvdXJjZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gbmV3IENhbGxiYWNrTWVkaWFTb3VyY2Uoc291cmNlKTsKK30KKworc3A8SU1lZGlhU291cmNlPiBDcmVhdGVJTWVkaWFTb3VyY2VGcm9tTWVkaWFTb3VyY2VCYXNlKAorICAgICAgICBjb25zdCBzcDxSZW1vdGVNZWRpYUV4dHJhY3Rvcj4gJmV4dHJhY3RvciwKKyAgICAgICAgTWVkaWFUcmFjayAqc291cmNlLCBjb25zdCBzcDxSZWZCYXNlPiAmcGx1Z2luKSB7CisgICAgaWYgKHNvdXJjZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gUmVtb3RlTWVkaWFTb3VyY2U6OndyYXAoZXh0cmFjdG9yLCBzb3VyY2UsIHBsdWdpbik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9JdGVtVGFibGUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSXRlbVRhYmxlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU4OWY0Zi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9JdGVtVGFibGUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTU1NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJJdGVtVGFibGUiCi0KLSNpbmNsdWRlIDxpbmNsdWRlL0l0ZW1UYWJsZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1uYW1lc3BhY2UgaGVpZiB7Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8KLS8vICBzdHJ1Y3QgdG8ga2VlcCB0cmFjayBvZiBvbmUgaW1hZ2UgaXRlbQotLy8KLQotc3RydWN0IEltYWdlSXRlbSB7Ci0gICAgZnJpZW5kIHN0cnVjdCBJdGVtUmVmZXJlbmNlOwotICAgIGZyaWVuZCBzdHJ1Y3QgSXRlbVByb3BlcnR5OwotCi0gICAgSW1hZ2VJdGVtKCkgOiBJbWFnZUl0ZW0oMCkge30KLSAgICBJbWFnZUl0ZW0odWludDMyX3QgX3R5cGUpIDogdHlwZShfdHlwZSksCi0gICAgICAgICAgICByb3dzKDApLCBjb2x1bW5zKDApLCB3aWR0aCgwKSwgaGVpZ2h0KDApLCByb3RhdGlvbigwKSwKLSAgICAgICAgICAgIG9mZnNldCgwKSwgc2l6ZSgwKSwgbmV4dFRpbGVJbmRleCgwKSB7fQotCi0gICAgYm9vbCBpc0dyaWQoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiB0eXBlID09IEZPVVJDQygnZycsICdyJywgJ2knLCAnZCcpOwotICAgIH0KLQotICAgIHN0YXR1c190IGdldE5leHRUaWxlSXRlbUlkKHVpbnQzMl90ICpuZXh0VGlsZUl0ZW1JZCwgYm9vbCByZXNldCkgewotICAgICAgICBpZiAocmVzZXQpIHsKLSAgICAgICAgICAgIG5leHRUaWxlSW5kZXggPSAwOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuZXh0VGlsZUluZGV4ID49IGRpbWdSZWZzLnNpemUoKSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07Ci0gICAgICAgIH0KLSAgICAgICAgKm5leHRUaWxlSXRlbUlkID0gZGltZ1JlZnNbbmV4dFRpbGVJbmRleCsrXTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgaW50MzJfdCByb3dzOwotICAgIGludDMyX3QgY29sdW1uczsKLSAgICBpbnQzMl90IHdpZHRoOwotICAgIGludDMyX3QgaGVpZ2h0OwotICAgIGludDMyX3Qgcm90YXRpb247Ci0gICAgb2ZmNjRfdCBvZmZzZXQ7Ci0gICAgc2l6ZV90IHNpemU7Ci0gICAgc3A8QUJ1ZmZlcj4gaHZjYzsKLSAgICBzcDxBQnVmZmVyPiBpY2M7Ci0KLSAgICBWZWN0b3I8dWludDMyX3Q+IHRodW1ibmFpbHM7Ci0gICAgVmVjdG9yPHVpbnQzMl90PiBkaW1nUmVmczsKLSAgICBzaXplX3QgbmV4dFRpbGVJbmRleDsKLX07Ci0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLwotLy8gIElTTyBib3hlcwotLy8KLQotc3RydWN0IEJveCB7Ci1wcm90ZWN0ZWQ6Ci0gICAgQm94KGNvbnN0IHNwPERhdGFTb3VyY2U+IHNvdXJjZSwgdWludDMyX3QgdHlwZSkgOgotICAgICAgICBtRGF0YVNvdXJjZShzb3VyY2UpLCBtVHlwZSh0eXBlKSB7fQotCi0gICAgdmlydHVhbCB+Qm94KCkge30KLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25DaHVua0RhdGEoCi0gICAgICAgICAgICB1aW50MzJfdCAvKnR5cGUqLywgb2ZmNjRfdCAvKm9mZnNldCovLCBzaXplX3QgLypzaXplKi8pIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIGlubGluZSB1aW50MzJfdCB0eXBlKCkgY29uc3QgeyByZXR1cm4gbVR5cGU7IH0KLQotICAgIGlubGluZSBzcDxEYXRhU291cmNlPiBzb3VyY2UoKSBjb25zdCB7IHJldHVybiBtRGF0YVNvdXJjZTsgfQotCi0gICAgc3RhdHVzX3QgcGFyc2VDaHVuayhvZmY2NF90ICpvZmZzZXQpOwotCi0gICAgc3RhdHVzX3QgcGFyc2VDaHVua3Mob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKLQotcHJpdmF0ZToKLSAgICBzcDxEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKLSAgICB1aW50MzJfdCBtVHlwZTsKLX07Ci0KLXN0YXR1c190IEJveDo6cGFyc2VDaHVuayhvZmY2NF90ICpvZmZzZXQpIHsKLSAgICBpZiAoKm9mZnNldCA8IDApIHsKLSAgICAgICAgQUxPR0UoImIvMjM1NDA5MTQiKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0gICAgdWludDMyX3QgaGRyWzJdOwotICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KCpvZmZzZXQsIGhkciwgOCkgPCA4KSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICB9Ci0gICAgdWludDY0X3QgY2h1bmtfc2l6ZSA9IG50b2hsKGhkclswXSk7Ci0gICAgaW50MzJfdCBjaHVua190eXBlID0gbnRvaGwoaGRyWzFdKTsKLSAgICBvZmY2NF90IGRhdGFfb2Zmc2V0ID0gKm9mZnNldCArIDg7Ci0KLSAgICBpZiAoY2h1bmtfc2l6ZSA9PSAxKSB7Ci0gICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KCpvZmZzZXQgKyA4LCAmY2h1bmtfc2l6ZSwgOCkgPCA4KSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgIH0KLSAgICAgICAgY2h1bmtfc2l6ZSA9IG50b2g2NChjaHVua19zaXplKTsKLSAgICAgICAgZGF0YV9vZmZzZXQgKz0gODsKLQotICAgICAgICBpZiAoY2h1bmtfc2l6ZSA8IDE2KSB7Ci0gICAgICAgICAgICAvLyBUaGUgc21hbGxlc3QgdmFsaWQgY2h1bmsgaXMgMTYgYnl0ZXMgbG9uZyBpbiB0aGlzIGNhc2UuCi0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChjaHVua19zaXplID09IDApIHsKLSAgICAgICAgLy8gVGhpcyBzaG91bGRuJ3QgaGFwcGVuIHNpbmNlIHdlIHNob3VsZCBuZXZlciBiZSB0b3AgbGV2ZWwKLSAgICAgICAgQUxPR0UoImludmFsaWQgY2h1bmsgc2l6ZSAwIGZvciBub24tdG9wIGxldmVsIGJveCIpOwotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0gZWxzZSBpZiAoY2h1bmtfc2l6ZSA8IDgpIHsKLSAgICAgICAgLy8gVGhlIHNtYWxsZXN0IHZhbGlkIGNodW5rIGlzIDggYnl0ZXMgbG9uZy4KLSAgICAgICAgQUxPR0UoImludmFsaWQgY2h1bmsgc2l6ZTogJWxsZCIsIChsb25nIGxvbmcpY2h1bmtfc2l6ZSk7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgY2hhciBjaHVua1s1XTsKLSAgICBNYWtlRm91ckNDU3RyaW5nKGNodW5rX3R5cGUsIGNodW5rKTsKLSAgICBBTE9HVigiY2h1bms6ICVzIEAgJWxsZCIsIGNodW5rLCAobG9uZyBsb25nKSpvZmZzZXQpOwotCi0gICAgb2ZmNjRfdCBjaHVua19kYXRhX3NpemUgPSBjaHVua19zaXplIC0gKGRhdGFfb2Zmc2V0IC0gKm9mZnNldCk7Ci0gICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IDApIHsKLSAgICAgICAgQUxPR0UoImIvMjM1NDA5MTQiKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBvbkNodW5rRGF0YShjaHVua190eXBlLCBkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgKm9mZnNldCArPSBjaHVua19zaXplOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgQm94OjpwYXJzZUNodW5rcyhvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKLSAgICBvZmY2NF90IHN0b3BPZmZzZXQgPSBvZmZzZXQgKyBzaXplOwotICAgIHdoaWxlIChvZmZzZXQgPCBzdG9wT2Zmc2V0KSB7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlQ2h1bmsoJm9mZnNldCk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG9mZnNldCAhPSBzdG9wT2Zmc2V0KSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotc3RydWN0IEZ1bGxCb3ggOiBwdWJsaWMgQm94IHsKLXByb3RlY3RlZDoKLSAgICBGdWxsQm94KGNvbnN0IHNwPERhdGFTb3VyY2U+IHNvdXJjZSwgdWludDMyX3QgdHlwZSkgOgotICAgICAgICBCb3goc291cmNlLCB0eXBlKSwgbVZlcnNpb24oMCksIG1GbGFncygwKSB7fQotCi0gICAgaW5saW5lIHVpbnQ4X3QgdmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1WZXJzaW9uOyB9Ci0KLSAgICBpbmxpbmUgdWludDMyX3QgZmxhZ3MoKSBjb25zdCB7IHJldHVybiBtRmxhZ3M7IH0KLQotICAgIHN0YXR1c190IHBhcnNlRnVsbEJveEhlYWRlcihvZmY2NF90ICpvZmZzZXQsIHNpemVfdCAqc2l6ZSk7Ci0KLXByaXZhdGU6Ci0gICAgdWludDhfdCBtVmVyc2lvbjsKLSAgICB1aW50MzJfdCBtRmxhZ3M7Ci19OwotCi1zdGF0dXNfdCBGdWxsQm94OjpwYXJzZUZ1bGxCb3hIZWFkZXIob2ZmNjRfdCAqb2Zmc2V0LCBzaXplX3QgKnNpemUpIHsKLSAgICBpZiAoKnNpemUgPCA0KSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotICAgIGlmICghc291cmNlKCktPnJlYWRBdCgqb2Zmc2V0LCAmbVZlcnNpb24sIDEpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICB9Ci0gICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDI0KCpvZmZzZXQgKyAxLCAmbUZsYWdzKSkgewotICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgfQotICAgICpvZmZzZXQgKz0gNDsKLSAgICAqc2l6ZSAtPSA0OwotICAgIHJldHVybiBPSzsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLwotLy8gIFByaW1hcnlJbWFnZSBib3gKLS8vCi0KLXN0cnVjdCBQaXRtQm94IDogcHVibGljIEZ1bGxCb3ggewotICAgIFBpdG1Cb3goY29uc3Qgc3A8RGF0YVNvdXJjZT4gc291cmNlKSA6Ci0gICAgICAgIEZ1bGxCb3goc291cmNlLCBGT1VSQ0MoJ3AnLCAnaScsICd0JywgJ20nKSkge30KLQotICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgdWludDMyX3QgKnByaW1hcnlJdGVtSWQpOwotfTsKLQotc3RhdHVzX3QgUGl0bUJveDo6cGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplLCB1aW50MzJfdCAqcHJpbWFyeUl0ZW1JZCkgewotICAgIHN0YXR1c190IGVyciA9IHBhcnNlRnVsbEJveEhlYWRlcigmb2Zmc2V0LCAmc2l6ZSk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHNpemVfdCBpdGVtSWRTaXplID0gKHZlcnNpb24oKSA9PSAwKSA/IDIgOiA0OwotICAgIGlmIChzaXplIDwgaXRlbUlkU2l6ZSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLSAgICB1aW50MzJfdCBpdGVtSWQ7Ci0gICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDMyVmFyKG9mZnNldCwgJml0ZW1JZCwgaXRlbUlkU2l6ZSkpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgIH0KLQotICAgIEFMT0dWKCJwcmltYXJ5IGlkICVkIiwgaXRlbUlkKTsKLSAgICAqcHJpbWFyeUl0ZW1JZCA9IGl0ZW1JZDsKLQotICAgIHJldHVybiBPSzsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLwotLy8gIEl0ZW1Mb2NhdGlvbiByZWxhdGVkIGJveGVzCi0vLwotCi1zdHJ1Y3QgRXh0ZW50RW50cnkgewotICAgIHVpbnQ2NF90IGV4dGVudEluZGV4OwotICAgIHVpbnQ2NF90IGV4dGVudE9mZnNldDsKLSAgICB1aW50NjRfdCBleHRlbnRMZW5ndGg7Ci19OwotCi1zdHJ1Y3QgSXRlbUxvYyB7Ci0gICAgSXRlbUxvYygpIDogSXRlbUxvYygwLCAwLCAwLCAwKSB7fQotICAgIEl0ZW1Mb2ModWludDMyX3QgaXRlbV9pZCwgdWludDE2X3QgY29uc3RydWN0aW9uX21ldGhvZCwKLSAgICAgICAgICAgIHVpbnQxNl90IGRhdGFfcmVmZXJlbmNlX2luZGV4LCB1aW50NjRfdCBiYXNlX29mZnNldCkgOgotICAgICAgICBpdGVtSWQoaXRlbV9pZCksCi0gICAgICAgIGNvbnN0cnVjdGlvbk1ldGhvZChjb25zdHJ1Y3Rpb25fbWV0aG9kKSwKLSAgICAgICAgZGF0YVJlZmVyZW5jZUluZGV4KGRhdGFfcmVmZXJlbmNlX2luZGV4KSwKLSAgICAgICAgYmFzZU9mZnNldChiYXNlX29mZnNldCkge30KLQotICAgIHZvaWQgYWRkRXh0ZW50KGNvbnN0IEV4dGVudEVudHJ5JiBleHRlbnQpIHsKLSAgICAgICAgZXh0ZW50cy5wdXNoX2JhY2soZXh0ZW50KTsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBnZXRMb2Mob2ZmNjRfdCAqb2Zmc2V0LCBzaXplX3QgKnNpemUsCi0gICAgICAgICAgICBvZmY2NF90IGlkYXRPZmZzZXQsIHNpemVfdCBpZGF0U2l6ZSkgY29uc3QgewotICAgICAgICAvLyBUT0RPOiBmaXggZXh0ZW50IGhhbmRsaW5nLCBmaXggY29uc3RydWN0aW9uTWV0aG9kID0gMgotICAgICAgICBDSEVDSyhleHRlbnRzLnNpemUoKSA9PSAxKTsKLSAgICAgICAgaWYgKGNvbnN0cnVjdGlvbk1ldGhvZCA9PSAwKSB7Ci0gICAgICAgICAgICAqb2Zmc2V0ID0gYmFzZU9mZnNldCArIGV4dGVudHNbMF0uZXh0ZW50T2Zmc2V0OwotICAgICAgICAgICAgKnNpemUgPSBleHRlbnRzWzBdLmV4dGVudExlbmd0aDsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfSBlbHNlIGlmIChjb25zdHJ1Y3Rpb25NZXRob2QgPT0gMSkgewotICAgICAgICAgICAgaWYgKGJhc2VPZmZzZXQgKyBleHRlbnRzWzBdLmV4dGVudE9mZnNldCArIGV4dGVudHNbMF0uZXh0ZW50TGVuZ3RoCi0gICAgICAgICAgICAgICAgICAgID4gaWRhdFNpemUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKm9mZnNldCA9IGJhc2VPZmZzZXQgKyBleHRlbnRzWzBdLmV4dGVudE9mZnNldCArIGlkYXRPZmZzZXQ7Ci0gICAgICAgICAgICAqc2l6ZSA9IGV4dGVudHNbMF0uZXh0ZW50TGVuZ3RoOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICAvLyBwYXJzZWQgaW5mbwotICAgIHVpbnQzMl90IGl0ZW1JZDsKLSAgICB1aW50MTZfdCBjb25zdHJ1Y3Rpb25NZXRob2Q7Ci0gICAgdWludDE2X3QgZGF0YVJlZmVyZW5jZUluZGV4OwotICAgIG9mZjY0X3QgYmFzZU9mZnNldDsKLSAgICBWZWN0b3I8RXh0ZW50RW50cnk+IGV4dGVudHM7Ci19OwotCi1zdHJ1Y3QgSWxvY0JveCA6IHB1YmxpYyBGdWxsQm94IHsKLSAgICBJbG9jQm94KGNvbnN0IHNwPERhdGFTb3VyY2U+IHNvdXJjZSwgS2V5ZWRWZWN0b3I8dWludDMyX3QsIEl0ZW1Mb2M+ICppdGVtTG9jcykgOgotICAgICAgICBGdWxsQm94KHNvdXJjZSwgRk9VUkNDKCdpJywgJ2wnLCAnbycsICdjJykpLAotICAgICAgICBtSXRlbUxvY3MoaXRlbUxvY3MpLCBtSGFzQ29uc3RydWN0TWV0aG9kMShmYWxzZSkge30KLQotICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICBib29sIGhhc0NvbnN0cnVjdE1ldGhvZDEoKSB7IHJldHVybiBtSGFzQ29uc3RydWN0TWV0aG9kMTsgfQotCi1wcml2YXRlOgotICAgIHN0YXRpYyBib29sIGlzU2l6ZUZpZWxkVmFsaWQodWludDMyX3Qgb2Zmc2V0X3NpemUpIHsKLSAgICAgICAgcmV0dXJuIG9mZnNldF9zaXplID09IDAgfHwgb2Zmc2V0X3NpemUgPT0gNCB8fCBvZmZzZXRfc2l6ZSA9PSA4OwotICAgIH0KLSAgICBLZXllZFZlY3Rvcjx1aW50MzJfdCwgSXRlbUxvYz4gKm1JdGVtTG9jczsKLSAgICBib29sIG1IYXNDb25zdHJ1Y3RNZXRob2QxOwotfTsKLQotc3RhdHVzX3QgSWxvY0JveDo6cGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gcGFyc2VGdWxsQm94SGVhZGVyKCZvZmZzZXQsICZzaXplKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGlmICh2ZXJzaW9uKCkgPiAyKSB7Ci0gICAgICAgIEFMT0dFKCIlczogaW52YWxpZCB2ZXJzaW9uICVkIiwgX19GVU5DVElPTl9fLCB2ZXJzaW9uKCkpOwotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGlmIChzaXplIDwgMikgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLSAgICB1aW50OF90IG9mZnNldF9zaXplOwotICAgIGlmICghc291cmNlKCktPnJlYWRBdChvZmZzZXQrKywgJm9mZnNldF9zaXplLCAxKSkgewotICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgfQotICAgIHVpbnQ4X3QgbGVuZ3RoX3NpemUgPSAob2Zmc2V0X3NpemUgJiAweEYpOwotICAgIG9mZnNldF9zaXplID4+PSA0OwotCi0gICAgdWludDhfdCBiYXNlX29mZnNldF9zaXplOwotICAgIGlmICghc291cmNlKCktPnJlYWRBdChvZmZzZXQrKywgJmJhc2Vfb2Zmc2V0X3NpemUsIDEpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICB9Ci0gICAgdWludDhfdCBpbmRleF9zaXplID0gMDsKLSAgICBpZiAodmVyc2lvbigpID09IDEgfHwgdmVyc2lvbigpID09IDIpIHsKLSAgICAgICAgaW5kZXhfc2l6ZSA9IChiYXNlX29mZnNldF9zaXplICYgMHhGKTsKLSAgICB9Ci0gICAgYmFzZV9vZmZzZXRfc2l6ZSA+Pj0gNDsKLSAgICBzaXplIC09IDI7Ci0KLSAgICBpZiAoIWlzU2l6ZUZpZWxkVmFsaWQob2Zmc2V0X3NpemUpCi0gICAgICAgICAgICB8fCAhaXNTaXplRmllbGRWYWxpZChsZW5ndGhfc2l6ZSkKLSAgICAgICAgICAgIHx8ICFpc1NpemVGaWVsZFZhbGlkKGJhc2Vfb2Zmc2V0X3NpemUpCi0gICAgICAgICAgICB8fCAhaXNTaXplRmllbGRWYWxpZCgoaW5kZXhfc2l6ZSkpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogb2Zmc2V0IHNpemUgbm90IHZhbGlkOiAlZCwgJWQsICVkLCAlZCIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICBvZmZzZXRfc2l6ZSwgbGVuZ3RoX3NpemUsIGJhc2Vfb2Zmc2V0X3NpemUsIGluZGV4X3NpemUpOwotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHVpbnQzMl90IGl0ZW1fY291bnQ7Ci0gICAgc2l6ZV90IGl0ZW1GaWVsZFNpemUgPSB2ZXJzaW9uKCkgPCAyID8gMiA6IDQ7Ci0gICAgaWYgKHNpemUgPCBpdGVtRmllbGRTaXplKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotICAgIGlmICghc291cmNlKCktPmdldFVJbnQzMlZhcihvZmZzZXQsICZpdGVtX2NvdW50LCBpdGVtRmllbGRTaXplKSkgewotICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgfQotCi0gICAgQUxPR1YoIml0ZW1fY291bnQgJWxsZCIsIChsb25nIGxvbmcpIGl0ZW1fY291bnQpOwotICAgIG9mZnNldCArPSBpdGVtRmllbGRTaXplOwotICAgIHNpemUgLT0gaXRlbUZpZWxkU2l6ZTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaXRlbV9jb3VudDsgaSsrKSB7Ci0gICAgICAgIHVpbnQzMl90IGl0ZW1faWQ7Ci0gICAgICAgIGlmICghc291cmNlKCktPmdldFVJbnQzMlZhcihvZmZzZXQsICZpdGVtX2lkLCBpdGVtRmllbGRTaXplKSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJpdGVtWyV6dV06IGlkICVsbGQiLCBpLCAobG9uZyBsb25nKWl0ZW1faWQpOwotICAgICAgICBvZmZzZXQgKz0gaXRlbUZpZWxkU2l6ZTsKLQotICAgICAgICB1aW50OF90IGNvbnN0cnVjdGlvbl9tZXRob2QgPSAwOwotICAgICAgICBpZiAodmVyc2lvbigpID09IDEgfHwgdmVyc2lvbigpID09IDIpIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgYnVmWzJdOwotICAgICAgICAgICAgaWYgKCFzb3VyY2UoKS0+cmVhZEF0KG9mZnNldCwgYnVmLCAyKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnN0cnVjdGlvbl9tZXRob2QgPSAoYnVmWzFdICYgMHhGKTsKLSAgICAgICAgICAgIEFMT0dWKCJjb25zdHJ1Y3Rpb25fbWV0aG9kICVkIiwgY29uc3RydWN0aW9uX21ldGhvZCk7Ci0gICAgICAgICAgICBpZiAoY29uc3RydWN0aW9uX21ldGhvZCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgbUhhc0NvbnN0cnVjdE1ldGhvZDEgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBvZmZzZXQgKz0gMjsKLSAgICAgICAgfQotCi0gICAgICAgIHVpbnQxNl90IGRhdGFfcmVmZXJlbmNlX2luZGV4OwotICAgICAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MTYob2Zmc2V0LCAmZGF0YV9yZWZlcmVuY2VfaW5kZXgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoImRhdGFfcmVmZXJlbmNlX2luZGV4ICVkIiwgZGF0YV9yZWZlcmVuY2VfaW5kZXgpOwotICAgICAgICBpZiAoZGF0YV9yZWZlcmVuY2VfaW5kZXggIT0gMCkgewotICAgICAgICAgICAgLy8gd2UgZG9uJ3Qgc3VwcG9ydCByZWZlcmVuY2UgdG8gb3RoZXIgZmlsZXMKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICAgICAgfQotICAgICAgICBvZmZzZXQgKz0gMjsKLQotICAgICAgICB1aW50NjRfdCBiYXNlX29mZnNldCA9IDA7Ci0gICAgICAgIGlmIChiYXNlX29mZnNldF9zaXplICE9IDApIHsKLSAgICAgICAgICAgIGlmICghc291cmNlKCktPmdldFVJbnQ2NFZhcihvZmZzZXQsICZiYXNlX29mZnNldCwgYmFzZV9vZmZzZXRfc2l6ZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvZmZzZXQgKz0gYmFzZV9vZmZzZXRfc2l6ZTsKLSAgICAgICAgfQotICAgICAgICBBTE9HVigiYmFzZV9vZmZzZXQgJWxsZCIsIChsb25nIGxvbmcpIGJhc2Vfb2Zmc2V0KTsKLQotICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUl0ZW1Mb2NzLT5hZGQoaXRlbV9pZCwgSXRlbUxvYygKLSAgICAgICAgICAgICAgICBpdGVtX2lkLCBjb25zdHJ1Y3Rpb25fbWV0aG9kLCBkYXRhX3JlZmVyZW5jZV9pbmRleCwgYmFzZV9vZmZzZXQpKTsKLSAgICAgICAgSXRlbUxvYyAmaXRlbSA9IG1JdGVtTG9jcy0+ZWRpdFZhbHVlQXQoaW5kZXgpOwotCi0gICAgICAgIHVpbnQxNl90IGV4dGVudF9jb3VudDsKLSAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDE2KG9mZnNldCwgJmV4dGVudF9jb3VudCkpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgfQotICAgICAgICBBTE9HVigiZXh0ZW50X2NvdW50ICVkIiwgZXh0ZW50X2NvdW50KTsKLQotICAgICAgICBpZiAoZXh0ZW50X2NvdW50ID4gMSAmJiAob2Zmc2V0X3NpemUgPT0gMCB8fCBsZW5ndGhfc2l6ZSA9PSAwKSkgewotICAgICAgICAgICAgLy8gaWYgdGhlIGl0ZW0gaXMgZGl2aWRlYyBpbnRvIG1vcmUgdGhhbiBvbmUgZXh0ZW50cywgb2Zmc2V0IGFuZAotICAgICAgICAgICAgLy8gbGVuZ3RoIG11c3QgYmUgcHJlc2VudC4KLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLSAgICAgICAgb2Zmc2V0ICs9IDI7Ci0KLSAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBleHRlbnRfY291bnQ7IGorKykgewotICAgICAgICAgICAgdWludDY0X3QgZXh0ZW50X2luZGV4ID0gMTsgLy8gZGVmYXVsdD0xCi0gICAgICAgICAgICBpZiAoKHZlcnNpb24oKSA9PSAxIHx8IHZlcnNpb24oKSA9PSAyKSAmJiAoaW5kZXhfc2l6ZSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDY0VmFyKG9mZnNldCwgJmV4dGVudF9pbmRleCwgaW5kZXhfc2l6ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBhZGQgc3VwcG9ydCBmb3IgdGhpcyBtb2RlCi0gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGluZGV4X3NpemU7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImV4dGVudF9pbmRleCAlbGxkIiwgKGxvbmcgbG9uZylleHRlbnRfaW5kZXgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1aW50NjRfdCBleHRlbnRfb2Zmc2V0ID0gMDsgLy8gZGVmYXVsdD0wCi0gICAgICAgICAgICBpZiAob2Zmc2V0X3NpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDY0VmFyKG9mZnNldCwgJmV4dGVudF9vZmZzZXQsIG9mZnNldF9zaXplKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9mZnNldCArPSBvZmZzZXRfc2l6ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dWKCJleHRlbnRfb2Zmc2V0ICVsbGQiLCAobG9uZyBsb25nKWV4dGVudF9vZmZzZXQpOwotCi0gICAgICAgICAgICB1aW50NjRfdCBleHRlbnRfbGVuZ3RoID0gMDsgLy8gdGhpcyBpbmRpY2F0ZXMgZnVsbCBsZW5ndGggb2YgZmlsZQotICAgICAgICAgICAgaWYgKGxlbmd0aF9zaXplID4gMCkgewotICAgICAgICAgICAgICAgIGlmICghc291cmNlKCktPmdldFVJbnQ2NFZhcihvZmZzZXQsICZleHRlbnRfbGVuZ3RoLCBsZW5ndGhfc2l6ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvZmZzZXQgKz0gbGVuZ3RoX3NpemU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigiZXh0ZW50X2xlbmd0aCAlbGxkIiwgKGxvbmcgbG9uZylleHRlbnRfbGVuZ3RoKTsKLQotICAgICAgICAgICAgaXRlbS5hZGRFeHRlbnQoeyBleHRlbnRfaW5kZXgsIGV4dGVudF9vZmZzZXQsIGV4dGVudF9sZW5ndGggfSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vCi0vLyAgSXRlbVJlZmVyZW5jZSByZWxhdGVkIGJveGVzCi0vLwotCi1zdHJ1Y3QgSXRlbVJlZmVyZW5jZSA6IHB1YmxpYyBCb3gsIHB1YmxpYyBSZWZCYXNlIHsKLSAgICBJdGVtUmVmZXJlbmNlKGNvbnN0IHNwPERhdGFTb3VyY2U+IHNvdXJjZSwgdWludDMyX3QgdHlwZSwgdWludDMyX3QgaXRlbUlkU2l6ZSkgOgotICAgICAgICBCb3goc291cmNlLCB0eXBlKSwgbUl0ZW1JZCgwKSwgbVJlZklkU2l6ZShpdGVtSWRTaXplKSB7fQotCi0gICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKLQotICAgIHVpbnQzMl90IGl0ZW1JZCgpIHsgcmV0dXJuIG1JdGVtSWQ7IH0KLQotICAgIHZvaWQgYXBwbHkoS2V5ZWRWZWN0b3I8dWludDMyX3QsIEltYWdlSXRlbT4gJml0ZW1JZFRvSW1hZ2VNYXApIGNvbnN0IHsKLSAgICAgICAgc3NpemVfdCBpbWFnZUluZGV4ID0gaXRlbUlkVG9JbWFnZU1hcC5pbmRleE9mS2V5KG1JdGVtSWQpOwotCi0gICAgICAgIC8vIGlnbm9yZSBub24taW1hZ2UgaXRlbXMKLSAgICAgICAgaWYgKGltYWdlSW5kZXggPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBBTE9HVigiYXR0YWNoIHJlZmVyZW5jZSB0eXBlIDB4JXggdG8gaXRlbSBpZCAlZCkiLCB0eXBlKCksIG1JdGVtSWQpOwotCi0gICAgICAgIGlmICh0eXBlKCkgPT0gRk9VUkNDKCdkJywgJ2knLCAnbScsICdnJykpIHsKLSAgICAgICAgICAgIEltYWdlSXRlbSAmaW1hZ2UgPSBpdGVtSWRUb0ltYWdlTWFwLmVkaXRWYWx1ZUF0KGltYWdlSW5kZXgpOwotICAgICAgICAgICAgaWYgKCFpbWFnZS5kaW1nUmVmcy5lbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImRpbWdSZWZzIGlmIG5vdCBjbGVhbiEiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGltYWdlLmRpbWdSZWZzLmFwcGVuZFZlY3RvcihtUmVmcyk7Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZSgpID09IEZPVVJDQygndCcsICdoJywgJ20nLCAnYicpKSB7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1SZWZzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaW1hZ2VJbmRleCA9IGl0ZW1JZFRvSW1hZ2VNYXAuaW5kZXhPZktleShtUmVmc1tpXSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBpZ25vcmUgbm9uLWltYWdlIGl0ZW1zCi0gICAgICAgICAgICAgICAgaWYgKGltYWdlSW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBTE9HVigiSW1hZ2UgaXRlbSBpZCAlZCB1c2VzIHRodW1ibmFpbCBpdGVtIGlkICVkIiwgbVJlZnNbaV0sIG1JdGVtSWQpOwotICAgICAgICAgICAgICAgIEltYWdlSXRlbSAmaW1hZ2UgPSBpdGVtSWRUb0ltYWdlTWFwLmVkaXRWYWx1ZUF0KGltYWdlSW5kZXgpOwotICAgICAgICAgICAgICAgIGlmICghaW1hZ2UudGh1bWJuYWlscy5lbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJhbHJlYWR5IGhhcyB0aHVtYm5haWxzISIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbWFnZS50aHVtYm5haWxzLnB1c2hfYmFjayhtSXRlbUlkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dXKCJpZ25vcmluZyB1bnN1cHBvcnRlZCByZWYgdHlwZSAweCV4IiwgdHlwZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotcHJpdmF0ZToKLSAgICB1aW50MzJfdCBtSXRlbUlkOwotICAgIHVpbnQzMl90IG1SZWZJZFNpemU7Ci0gICAgVmVjdG9yPHVpbnQzMl90PiBtUmVmczsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEl0ZW1SZWZlcmVuY2UpOwotfTsKLQotc3RhdHVzX3QgSXRlbVJlZmVyZW5jZTo6cGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKHNpemUgPCBtUmVmSWRTaXplICsgMikgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLSAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MzJWYXIob2Zmc2V0LCAmbUl0ZW1JZCwgbVJlZklkU2l6ZSkpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgIH0KLSAgICBvZmZzZXQgKz0gbVJlZklkU2l6ZTsKLQotICAgIHVpbnQxNl90IGNvdW50OwotICAgIGlmICghc291cmNlKCktPmdldFVJbnQxNihvZmZzZXQsICZjb3VudCkpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgIH0KLSAgICBvZmZzZXQgKz0gMjsKLSAgICBzaXplIC09IChtUmVmSWRTaXplICsgMik7Ci0KLSAgICBpZiAoc2l6ZSA8IGNvdW50ICogbVJlZklkU2l6ZSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICB1aW50MzJfdCByZWZJdGVtSWQ7Ci0gICAgICAgIGlmICghc291cmNlKCktPmdldFVJbnQzMlZhcihvZmZzZXQsICZyZWZJdGVtSWQsIG1SZWZJZFNpemUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgIH0KLSAgICAgICAgb2Zmc2V0ICs9IG1SZWZJZFNpemU7Ci0gICAgICAgIG1SZWZzLnB1c2hfYmFjayhyZWZJdGVtSWQpOwotICAgICAgICBBTE9HVigiaXRlbSBpZCAlZDogcmVmZXJlbmNpbmcgaXRlbSBpZCAlZCIsIG1JdGVtSWQsIHJlZkl0ZW1JZCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdHJ1Y3QgSXJlZkJveCA6IHB1YmxpYyBGdWxsQm94IHsKLSAgICBJcmVmQm94KGNvbnN0IHNwPERhdGFTb3VyY2U+IHNvdXJjZSwgVmVjdG9yPHNwPEl0ZW1SZWZlcmVuY2U+ID4gKml0ZW1SZWZzKSA6Ci0gICAgICAgIEZ1bGxCb3goc291cmNlLCBGT1VSQ0MoJ2knLCAncicsICdlJywgJ2YnKSksIG1SZWZJZFNpemUoMCksIG1JdGVtUmVmcyhpdGVtUmVmcykge30KLQotICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7Ci0KLXByb3RlY3RlZDoKLSAgICBzdGF0dXNfdCBvbkNodW5rRGF0YSh1aW50MzJfdCB0eXBlLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOwotCi1wcml2YXRlOgotICAgIHVpbnQzMl90IG1SZWZJZFNpemU7Ci0gICAgVmVjdG9yPHNwPEl0ZW1SZWZlcmVuY2U+ID4gKm1JdGVtUmVmczsKLX07Ci0KLXN0YXR1c190IElyZWZCb3g6OnBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgewotICAgIEFMT0dWKCIlczogb2Zmc2V0ICVsbGQsIHNpemUgJXp1IiwgX19GVU5DVElPTl9fLCAobG9uZyBsb25nKW9mZnNldCwgc2l6ZSk7Ci0gICAgc3RhdHVzX3QgZXJyID0gcGFyc2VGdWxsQm94SGVhZGVyKCZvZmZzZXQsICZzaXplKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgbVJlZklkU2l6ZSA9ICh2ZXJzaW9uKCkgPT0gMCkgPyAyIDogNDsKLSAgICByZXR1cm4gcGFyc2VDaHVua3Mob2Zmc2V0LCBzaXplKTsKLX0KLQotc3RhdHVzX3QgSXJlZkJveDo6b25DaHVua0RhdGEodWludDMyX3QgdHlwZSwgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7Ci0gICAgc3A8SXRlbVJlZmVyZW5jZT4gaXRlbVJlZiA9IG5ldyBJdGVtUmVmZXJlbmNlKHNvdXJjZSgpLCB0eXBlLCBtUmVmSWRTaXplKTsKLQotICAgIHN0YXR1c190IGVyciA9IGl0ZW1SZWYtPnBhcnNlKG9mZnNldCwgc2l6ZSk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBtSXRlbVJlZnMtPnB1c2hfYmFjayhpdGVtUmVmKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8KLS8vICBJdGVtUHJvcGVydHkgcmVsYXRlZCBib3hlcwotLy8KLQotc3RydWN0IEFzc29jaWF0aW9uRW50cnkgewotICAgIHVpbnQzMl90IGl0ZW1JZDsKLSAgICBib29sIGVzc2VudGlhbDsKLSAgICB1aW50MTZfdCBpbmRleDsKLX07Ci0KLXN0cnVjdCBJdGVtUHJvcGVydHkgOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgSXRlbVByb3BlcnR5KCkge30KLQotICAgIHZpcnR1YWwgdm9pZCBhdHRhY2hUbyhJbWFnZUl0ZW0gJi8qaW1hZ2UqLykgY29uc3QgewotICAgICAgICBBTE9HVygiVW5yZWNvZ25pemVkIHByb3BlcnR5Iik7Ci0gICAgfQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCAvKm9mZnNldCovLCBzaXplX3QgLypzaXplKi8pIHsKLSAgICAgICAgQUxPR1coIlVucmVjb2duaXplZCBwcm9wZXJ0eSIpOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi1wcml2YXRlOgotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEl0ZW1Qcm9wZXJ0eSk7Ci19OwotCi1zdHJ1Y3QgSXNwZUJveCA6IHB1YmxpYyBGdWxsQm94LCBwdWJsaWMgSXRlbVByb3BlcnR5IHsKLSAgICBJc3BlQm94KGNvbnN0IHNwPERhdGFTb3VyY2U+IHNvdXJjZSkgOgotICAgICAgICBGdWxsQm94KHNvdXJjZSwgRk9VUkNDKCdpJywgJ3MnLCAncCcsICdlJykpLCBtV2lkdGgoMCksIG1IZWlnaHQoMCkge30KLQotICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7Ci0KLSAgICB2b2lkIGF0dGFjaFRvKEltYWdlSXRlbSAmaW1hZ2UpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgICAgaW1hZ2Uud2lkdGggPSBtV2lkdGg7Ci0gICAgICAgIGltYWdlLmhlaWdodCA9IG1IZWlnaHQ7Ci0gICAgfQotCi1wcml2YXRlOgotICAgIHVpbnQzMl90IG1XaWR0aDsKLSAgICB1aW50MzJfdCBtSGVpZ2h0OwotfTsKLQotc3RhdHVzX3QgSXNwZUJveDo6cGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7Ci0gICAgQUxPR1YoIiVzOiBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKLQotICAgIHN0YXR1c190IGVyciA9IHBhcnNlRnVsbEJveEhlYWRlcigmb2Zmc2V0LCAmc2l6ZSk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmIChzaXplIDwgOCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLSAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MzIob2Zmc2V0LCAmbVdpZHRoKQotICAgICAgICAgICAgfHwgIXNvdXJjZSgpLT5nZXRVSW50MzIob2Zmc2V0ICsgNCwgJm1IZWlnaHQpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICB9Ci0gICAgQUxPR1YoInByb3BlcnR5IGlzcGU6ICVkeCVkIiwgbVdpZHRoLCBtSGVpZ2h0KTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RydWN0IEh2Y2NCb3ggOiBwdWJsaWMgQm94LCBwdWJsaWMgSXRlbVByb3BlcnR5IHsKLSAgICBIdmNjQm94KGNvbnN0IHNwPERhdGFTb3VyY2U+IHNvdXJjZSkgOgotICAgICAgICBCb3goc291cmNlLCBGT1VSQ0MoJ2gnLCAndicsICdjJywgJ0MnKSkge30KLQotICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7Ci0KLSAgICB2b2lkIGF0dGFjaFRvKEltYWdlSXRlbSAmaW1hZ2UpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgICAgaW1hZ2UuaHZjYyA9IG1IVkNDOwotICAgIH0KLQotcHJpdmF0ZToKLSAgICBzcDxBQnVmZmVyPiBtSFZDQzsKLX07Ci0KLXN0YXR1c190IEh2Y2NCb3g6OnBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgewotICAgIEFMT0dWKCIlczogb2Zmc2V0ICVsbGQsIHNpemUgJXp1IiwgX19GVU5DVElPTl9fLCAobG9uZyBsb25nKW9mZnNldCwgc2l6ZSk7Ci0KLSAgICBtSFZDQyA9IG5ldyBBQnVmZmVyKHNpemUpOwotCi0gICAgaWYgKG1IVkNDLT5kYXRhKCkgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiYi8yODQ3MTIwNiIpOwotICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgIH0KLQotICAgIGlmIChzb3VyY2UoKS0+cmVhZEF0KG9mZnNldCwgbUhWQ0MtPmRhdGEoKSwgc2l6ZSkgPCAoc3NpemVfdClzaXplKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICB9Ci0KLSAgICBBTE9HVigicHJvcGVydHkgaHZjQyIpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdHJ1Y3QgSXJvdEJveCA6IHB1YmxpYyBCb3gsIHB1YmxpYyBJdGVtUHJvcGVydHkgewotICAgIElyb3RCb3goY29uc3Qgc3A8RGF0YVNvdXJjZT4gc291cmNlKSA6Ci0gICAgICAgIEJveChzb3VyY2UsIEZPVVJDQygnaScsICdyJywgJ28nLCAndCcpKSwgbUFuZ2xlKDApIHt9Ci0KLSAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOwotCi0gICAgdm9pZCBhdHRhY2hUbyhJbWFnZUl0ZW0gJmltYWdlKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICAgIGltYWdlLnJvdGF0aW9uID0gbUFuZ2xlICogOTA7Ci0gICAgfQotCi1wcml2YXRlOgotICAgIHVpbnQ4X3QgbUFuZ2xlOwotfTsKLQotc3RhdHVzX3QgSXJvdEJveDo6cGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7Ci0gICAgQUxPR1YoIiVzOiBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKLQotICAgIGlmIChzaXplIDwgMSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLSAgICBpZiAoc291cmNlKCktPnJlYWRBdChvZmZzZXQsICZtQW5nbGUsIDEpICE9IDEpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgIH0KLSAgICBtQW5nbGUgJj0gMHgzOwotICAgIEFMT0dWKCJwcm9wZXJ0eSBpcm90OiAlZCIsIG1BbmdsZSk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0cnVjdCBDb2xyQm94IDogcHVibGljIEJveCwgcHVibGljIEl0ZW1Qcm9wZXJ0eSB7Ci0gICAgQ29sckJveChjb25zdCBzcDxEYXRhU291cmNlPiBzb3VyY2UpIDoKLSAgICAgICAgQm94KHNvdXJjZSwgRk9VUkNDKCdjJywgJ28nLCAnbCcsICdyJykpIHt9Ci0KLSAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOwotCi0gICAgdm9pZCBhdHRhY2hUbyhJbWFnZUl0ZW0gJmltYWdlKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICAgIGltYWdlLmljYyA9IG1JQ0NEYXRhOwotICAgIH0KLQotcHJpdmF0ZToKLSAgICBzcDxBQnVmZmVyPiBtSUNDRGF0YTsKLX07Ci0KLXN0YXR1c190IENvbHJCb3g6OnBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgewotICAgIEFMT0dWKCIlczogb2Zmc2V0ICVsbGQsIHNpemUgJXp1IiwgX19GVU5DVElPTl9fLCAobG9uZyBsb25nKW9mZnNldCwgc2l6ZSk7Ci0KLSAgICBpZiAoc2l6ZSA8IDQpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0gICAgdWludDMyX3QgY29sb3VyX3R5cGU7Ci0gICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDMyKG9mZnNldCwgJmNvbG91cl90eXBlKSkgewotICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgfQotICAgIG9mZnNldCArPSA0OwotICAgIHNpemUgLT0gNDsKLSAgICBpZiAoY29sb3VyX3R5cGUgPT0gRk9VUkNDKCduJywgJ2MnLCAnbCcsICd4JykpIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICBpZiAoKGNvbG91cl90eXBlICE9IEZPVVJDQygncicsICdJJywgJ0MnLCAnQycpKSAmJgotICAgICAgICAoY29sb3VyX3R5cGUgIT0gRk9VUkNDKCdwJywgJ3InLCAnbycsICdmJykpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgbUlDQ0RhdGEgPSBuZXcgQUJ1ZmZlcihzaXplKTsKLSAgICBpZiAobUlDQ0RhdGEtPmRhdGEoKSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJiLzI4NDcxMjA2Iik7Ci0gICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgfQotCi0gICAgaWYgKHNvdXJjZSgpLT5yZWFkQXQob2Zmc2V0LCBtSUNDRGF0YS0+ZGF0YSgpLCBzaXplKSAhPSAoc3NpemVfdClzaXplKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICB9Ci0KLSAgICBBTE9HVigicHJvcGVydHkgQ29scjogc2l6ZSAlemQiLCBzaXplKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0cnVjdCBJcG1hQm94IDogcHVibGljIEZ1bGxCb3ggewotICAgIElwbWFCb3goY29uc3Qgc3A8RGF0YVNvdXJjZT4gc291cmNlLCBWZWN0b3I8QXNzb2NpYXRpb25FbnRyeT4gKmFzc29jaWF0aW9ucykgOgotICAgICAgICBGdWxsQm94KHNvdXJjZSwgRk9VUkNDKCdpJywgJ3AnLCAnbScsICdhJykpLCBtQXNzb2NpYXRpb25zKGFzc29jaWF0aW9ucykge30KLQotICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7Ci1wcml2YXRlOgotICAgIFZlY3RvcjxBc3NvY2lhdGlvbkVudHJ5PiAqbUFzc29jaWF0aW9uczsKLX07Ci0KLXN0YXR1c190IElwbWFCb3g6OnBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgewotICAgIHN0YXR1c190IGVyciA9IHBhcnNlRnVsbEJveEhlYWRlcigmb2Zmc2V0LCAmc2l6ZSk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmIChzaXplIDwgNCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLSAgICB1aW50MzJfdCBlbnRyeUNvdW50OwotICAgIGlmICghc291cmNlKCktPmdldFVJbnQzMihvZmZzZXQsICZlbnRyeUNvdW50KSkgewotICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgfQotICAgIG9mZnNldCArPSA0OwotICAgIHNpemUgLT0gNDsKLQotICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgZW50cnlDb3VudDsgKytrKSB7Ci0gICAgICAgIHVpbnQzMl90IGl0ZW1JZCA9IDA7Ci0gICAgICAgIHNpemVfdCBpdGVtSWRTaXplID0gKHZlcnNpb24oKSA8IDEpID8gMiA6IDQ7Ci0KLSAgICAgICAgaWYgKHNpemUgPCBpdGVtSWRTaXplICsgMSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghc291cmNlKCktPmdldFVJbnQzMlZhcihvZmZzZXQsICZpdGVtSWQsIGl0ZW1JZFNpemUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgIH0KLSAgICAgICAgb2Zmc2V0ICs9IGl0ZW1JZFNpemU7Ci0gICAgICAgIHNpemUgLT0gaXRlbUlkU2l6ZTsKLQotICAgICAgICB1aW50OF90IGFzc29jaWF0aW9uQ291bnQ7Ci0gICAgICAgIGlmICghc291cmNlKCktPnJlYWRBdChvZmZzZXQsICZhc3NvY2lhdGlvbkNvdW50LCAxKSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICB9Ci0gICAgICAgIG9mZnNldCsrOwotICAgICAgICBzaXplLS07Ci0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhc3NvY2lhdGlvbkNvdW50OyArK2kpIHsKLSAgICAgICAgICAgIHNpemVfdCBwcm9wSW5kZXhTaXplID0gKGZsYWdzKCkgJiAxKSA/IDIgOiAxOwotICAgICAgICAgICAgaWYgKHNpemUgPCBwcm9wSW5kZXhTaXplKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVpbnQxNl90IHByb3BJbmRleDsKLSAgICAgICAgICAgIGlmICghc291cmNlKCktPmdldFVJbnQxNlZhcihvZmZzZXQsICZwcm9wSW5kZXgsIHByb3BJbmRleFNpemUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb2Zmc2V0ICs9IHByb3BJbmRleFNpemU7Ci0gICAgICAgICAgICBzaXplIC09IHByb3BJbmRleFNpemU7Ci0gICAgICAgICAgICB1aW50MTZfdCBiaXRtYXNrID0gKDEgPDwgKDggKiBwcm9wSW5kZXhTaXplIC0gMSkpOwotICAgICAgICAgICAgQXNzb2NpYXRpb25FbnRyeSBlbnRyeSA9IHsKLSAgICAgICAgICAgICAgICAgICAgLml0ZW1JZCA9IGl0ZW1JZCwKLSAgICAgICAgICAgICAgICAgICAgLmVzc2VudGlhbCA9ICEhKHByb3BJbmRleCAmIGJpdG1hc2spLAotICAgICAgICAgICAgICAgICAgICAuaW5kZXggPSAodWludDE2X3QpIChwcm9wSW5kZXggJiB+Yml0bWFzaykKLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgIEFMT0dWKCJpdGVtIGlkICVkIGFzc29jaWF0ZWQgdG8gcHJvcGVydHkgJWQgKGVzc2VudGlhbCAlZCkiLAotICAgICAgICAgICAgICAgICAgICBpdGVtSWQsIGVudHJ5LmluZGV4LCBlbnRyeS5lc3NlbnRpYWwpOwotCi0gICAgICAgICAgICBtQXNzb2NpYXRpb25zLT5wdXNoX2JhY2soZW50cnkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdHJ1Y3QgSXBjb0JveCA6IHB1YmxpYyBCb3ggewotICAgIElwY29Cb3goY29uc3Qgc3A8RGF0YVNvdXJjZT4gc291cmNlLCBWZWN0b3I8c3A8SXRlbVByb3BlcnR5PiA+ICpwcm9wZXJ0aWVzKSA6Ci0gICAgICAgIEJveChzb3VyY2UsIEZPVVJDQygnaScsICdwJywgJ2MnLCAnbycpKSwgbUl0ZW1Qcm9wZXJ0aWVzKHByb3BlcnRpZXMpIHt9Ci0KLSAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwotcHJvdGVjdGVkOgotICAgIHN0YXR1c190IG9uQ2h1bmtEYXRhKHVpbnQzMl90IHR5cGUsIG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7Ci0KLXByaXZhdGU6Ci0gICAgVmVjdG9yPHNwPEl0ZW1Qcm9wZXJ0eT4gPiAqbUl0ZW1Qcm9wZXJ0aWVzOwotfTsKLQotc3RhdHVzX3QgSXBjb0JveDo6cGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7Ci0gICAgQUxPR1YoIiVzOiBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKLSAgICAvLyBwdXNoIGR1bW15IGFzIHRoZSBpbmRleCBpcyAxLWJhc2VkCi0gICAgbUl0ZW1Qcm9wZXJ0aWVzLT5wdXNoX2JhY2sobmV3IEl0ZW1Qcm9wZXJ0eSgpKTsKLSAgICByZXR1cm4gcGFyc2VDaHVua3Mob2Zmc2V0LCBzaXplKTsKLX0KLQotc3RhdHVzX3QgSXBjb0JveDo6b25DaHVua0RhdGEodWludDMyX3QgdHlwZSwgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7Ci0gICAgc3A8SXRlbVByb3BlcnR5PiBpdGVtUHJvcGVydHk7Ci0gICAgc3dpdGNoKHR5cGUpIHsKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2gnLCAndicsICdjJywgJ0MnKToKLSAgICAgICAgewotICAgICAgICAgICAgaXRlbVByb3BlcnR5ID0gbmV3IEh2Y2NCb3goc291cmNlKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAncycsICdwJywgJ2UnKToKLSAgICAgICAgewotICAgICAgICAgICAgaXRlbVByb3BlcnR5ID0gbmV3IElzcGVCb3goc291cmNlKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAncicsICdvJywgJ3QnKToKLSAgICAgICAgewotICAgICAgICAgICAgaXRlbVByb3BlcnR5ID0gbmV3IElyb3RCb3goc291cmNlKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2MnLCAnbycsICdsJywgJ3InKToKLSAgICAgICAgewotICAgICAgICAgICAgaXRlbVByb3BlcnR5ID0gbmV3IENvbHJCb3goc291cmNlKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgewotICAgICAgICAgICAgLy8gcHVzaCBkdW1teSB0byBtYWludGFpbiBjb3JyZWN0IGl0ZW0gcHJvcGVydHkgaW5kZXgKLSAgICAgICAgICAgIGl0ZW1Qcm9wZXJ0eSA9IG5ldyBJdGVtUHJvcGVydHkoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIHN0YXR1c190IGVyciA9IGl0ZW1Qcm9wZXJ0eS0+cGFyc2Uob2Zmc2V0LCBzaXplKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIG1JdGVtUHJvcGVydGllcy0+cHVzaF9iYWNrKGl0ZW1Qcm9wZXJ0eSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdHJ1Y3QgSXBycEJveCA6IHB1YmxpYyBCb3ggewotICAgIElwcnBCb3goY29uc3Qgc3A8RGF0YVNvdXJjZT4gc291cmNlLAotICAgICAgICAgICAgVmVjdG9yPHNwPEl0ZW1Qcm9wZXJ0eT4gPiAqcHJvcGVydGllcywKLSAgICAgICAgICAgIFZlY3RvcjxBc3NvY2lhdGlvbkVudHJ5PiAqYXNzb2NpYXRpb25zKSA6Ci0gICAgICAgIEJveChzb3VyY2UsIEZPVVJDQygnaScsICdwJywgJ3InLCAncCcpKSwKLSAgICAgICAgbVByb3BlcnRpZXMocHJvcGVydGllcyksIG1Bc3NvY2lhdGlvbnMoYXNzb2NpYXRpb25zKSB7fQotCi0gICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKLXByb3RlY3RlZDoKLSAgICBzdGF0dXNfdCBvbkNodW5rRGF0YSh1aW50MzJfdCB0eXBlLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOwotCi1wcml2YXRlOgotICAgIFZlY3RvcjxzcDxJdGVtUHJvcGVydHk+ID4gKm1Qcm9wZXJ0aWVzOwotICAgIFZlY3RvcjxBc3NvY2lhdGlvbkVudHJ5PiAqbUFzc29jaWF0aW9uczsKLX07Ci0KLXN0YXR1c190IElwcnBCb3g6OnBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgewotICAgIEFMT0dWKCIlczogb2Zmc2V0ICVsbGQsIHNpemUgJXp1IiwgX19GVU5DVElPTl9fLCAobG9uZyBsb25nKW9mZnNldCwgc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUNodW5rcyhvZmZzZXQsIHNpemUpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBJcHJwQm94OjpvbkNodW5rRGF0YSh1aW50MzJfdCB0eXBlLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKLSAgICBzd2l0Y2godHlwZSkgewotICAgICAgICBjYXNlIEZPVVJDQygnaScsICdwJywgJ2MnLCAnbycpOgotICAgICAgICB7Ci0gICAgICAgICAgICBJcGNvQm94IGlwY29Cb3goc291cmNlKCksIG1Qcm9wZXJ0aWVzKTsKLSAgICAgICAgICAgIHJldHVybiBpcGNvQm94LnBhcnNlKG9mZnNldCwgc2l6ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAncCcsICdtJywgJ2EnKToKLSAgICAgICAgewotICAgICAgICAgICAgSXBtYUJveCBpcG1hQm94KHNvdXJjZSgpLCBtQXNzb2NpYXRpb25zKTsKLSAgICAgICAgICAgIHJldHVybiBpcG1hQm94LnBhcnNlKG9mZnNldCwgc2l6ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgewotICAgICAgICAgICAgQUxPR1coIlVucmVjb2duaXplZCBib3guIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8KLS8vICBJdGVtSW5mbyByZWxhdGVkIGJveGVzCi0vLwotc3RydWN0IEl0ZW1JbmZvIHsKLSAgICB1aW50MzJfdCBpdGVtSWQ7Ci0gICAgdWludDMyX3QgaXRlbVR5cGU7Ci19OwotCi1zdHJ1Y3QgSW5mZUJveCA6IHB1YmxpYyBGdWxsQm94IHsKLSAgICBJbmZlQm94KGNvbnN0IHNwPERhdGFTb3VyY2U+IHNvdXJjZSkgOgotICAgICAgICBGdWxsQm94KHNvdXJjZSwgRk9VUkNDKCdpJywgJ24nLCAnZicsICdlJykpIHt9Ci0KLSAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUsIEl0ZW1JbmZvICppdGVtSW5mbyk7Ci0KLXByaXZhdGU6Ci0gICAgYm9vbCBwYXJzZU51bGxUZXJtaW5hdGVkU3RyaW5nKG9mZjY0X3QgKm9mZnNldCwgc2l6ZV90ICpzaXplLCBTdHJpbmc4ICpvdXQpOwotfTsKLQotYm9vbCBJbmZlQm94OjpwYXJzZU51bGxUZXJtaW5hdGVkU3RyaW5nKAotICAgICAgICBvZmY2NF90ICpvZmZzZXQsIHNpemVfdCAqc2l6ZSwgU3RyaW5nOCAqb3V0KSB7Ci0gICAgY2hhciB0bXBbMjU2XTsKLSAgICBzaXplX3QgbGVuID0gMDsKLSAgICBvZmY2NF90IG5ld09mZnNldCA9ICpvZmZzZXQ7Ci0gICAgb2ZmNjRfdCBzdG9wT2Zmc2V0ID0gKm9mZnNldCArICpzaXplOwotICAgIHdoaWxlIChuZXdPZmZzZXQgPCBzdG9wT2Zmc2V0KSB7Ci0gICAgICAgIGlmICghc291cmNlKCktPnJlYWRBdChuZXdPZmZzZXQrKywgJnRtcFtsZW5dLCAxKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0bXBbbGVuXSA9PSAwKSB7Ci0gICAgICAgICAgICBvdXQtPmFwcGVuZCh0bXAsIGxlbik7Ci0KLSAgICAgICAgICAgICpvZmZzZXQgPSBuZXdPZmZzZXQ7Ci0gICAgICAgICAgICAqc2l6ZSA9IHN0b3BPZmZzZXQgLSBuZXdPZmZzZXQ7Ci0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICgrK2xlbiA+PSBzaXplb2YodG1wKSkgewotICAgICAgICAgICAgb3V0LT5hcHBlbmQodG1wLCBsZW4pOwotICAgICAgICAgICAgbGVuID0gMDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXR1c190IEluZmVCb3g6OnBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgSXRlbUluZm8gKml0ZW1JbmZvKSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gcGFyc2VGdWxsQm94SGVhZGVyKCZvZmZzZXQsICZzaXplKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYgKHZlcnNpb24oKSA9PSAwIHx8IHZlcnNpb24oKSA9PSAxKSB7Ci0gICAgICAgIGlmIChzaXplIDwgNCkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotICAgICAgICB1aW50MTZfdCBpdGVtX2lkOwotICAgICAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MTYob2Zmc2V0LCAmaXRlbV9pZCkpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgfQotICAgICAgICBBTE9HVigiaXRlbV9pZCAlZCIsIGl0ZW1faWQpOwotICAgICAgICB1aW50MTZfdCBpdGVtX3Byb3RlY3Rpb25faW5kZXg7Ci0gICAgICAgIGlmICghc291cmNlKCktPmdldFVJbnQxNihvZmZzZXQgKyAyLCAmaXRlbV9wcm90ZWN0aW9uX2luZGV4KSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICB9Ci0gICAgICAgIG9mZnNldCArPSA0OwotICAgICAgICBzaXplIC09IDQ7Ci0KLSAgICAgICAgU3RyaW5nOCBpdGVtX25hbWU7Ci0gICAgICAgIGlmICghcGFyc2VOdWxsVGVybWluYXRlZFN0cmluZygmb2Zmc2V0LCAmc2l6ZSwgJml0ZW1fbmFtZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmc4IGNvbnRlbnRfdHlwZTsKLSAgICAgICAgaWYgKCFwYXJzZU51bGxUZXJtaW5hdGVkU3RyaW5nKCZvZmZzZXQsICZzaXplLCAmY29udGVudF90eXBlKSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZzggY29udGVudF9lbmNvZGluZzsKLSAgICAgICAgaWYgKCFwYXJzZU51bGxUZXJtaW5hdGVkU3RyaW5nKCZvZmZzZXQsICZzaXplLCAmY29udGVudF9lbmNvZGluZykpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodmVyc2lvbigpID09IDEpIHsKLSAgICAgICAgICAgIHVpbnQzMl90IGV4dGVuc2lvbl90eXBlOwotICAgICAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDMyKG9mZnNldCwgJmV4dGVuc2lvbl90eXBlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9mZnNldCsrOwotICAgICAgICAgICAgc2l6ZS0tOwotICAgICAgICAgICAgLy8gVE9ETzogaGFuZGxlIHRoaXMgY2FzZQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsgLy8gdmVyc2lvbiA+PSAyCi0gICAgICAgIHVpbnQzMl90IGl0ZW1faWQ7Ci0gICAgICAgIHNpemVfdCBpdGVtSWRTaXplID0gKHZlcnNpb24oKSA9PSAyKSA/IDIgOiA0OwotICAgICAgICBpZiAoc2l6ZSA8IGl0ZW1JZFNpemUgKyA2KSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0gICAgICAgIGlmICghc291cmNlKCktPmdldFVJbnQzMlZhcihvZmZzZXQsICZpdGVtX2lkLCBpdGVtSWRTaXplKSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJpdGVtX2lkICVkIiwgaXRlbV9pZCk7Ci0gICAgICAgIG9mZnNldCArPSBpdGVtSWRTaXplOwotICAgICAgICB1aW50MTZfdCBpdGVtX3Byb3RlY3Rpb25faW5kZXg7Ci0gICAgICAgIGlmICghc291cmNlKCktPmdldFVJbnQxNihvZmZzZXQsICZpdGVtX3Byb3RlY3Rpb25faW5kZXgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoIml0ZW1fcHJvdGVjdGlvbl9pbmRleCAlZCIsIGl0ZW1fcHJvdGVjdGlvbl9pbmRleCk7Ci0gICAgICAgIG9mZnNldCArPSAyOwotICAgICAgICB1aW50MzJfdCBpdGVtX3R5cGU7Ci0gICAgICAgIGlmICghc291cmNlKCktPmdldFVJbnQzMihvZmZzZXQsICZpdGVtX3R5cGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgIH0KLQotICAgICAgICBpdGVtSW5mby0+aXRlbUlkID0gaXRlbV9pZDsKLSAgICAgICAgaXRlbUluZm8tPml0ZW1UeXBlID0gaXRlbV90eXBlOwotCi0gICAgICAgIGNoYXIgaXRlbVR5cGVTdHJpbmdbNV07Ci0gICAgICAgIE1ha2VGb3VyQ0NTdHJpbmcoaXRlbV90eXBlLCBpdGVtVHlwZVN0cmluZyk7Ci0gICAgICAgIEFMT0dWKCJpdGVtX3R5cGUgJXMiLCBpdGVtVHlwZVN0cmluZyk7Ci0gICAgICAgIG9mZnNldCArPSA0OwotICAgICAgICBzaXplIC09IGl0ZW1JZFNpemUgKyA2OwotCi0gICAgICAgIFN0cmluZzggaXRlbV9uYW1lOwotICAgICAgICBpZiAoIXBhcnNlTnVsbFRlcm1pbmF0ZWRTdHJpbmcoJm9mZnNldCwgJnNpemUsICZpdGVtX25hbWUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJpdGVtX25hbWUgJXMiLCBpdGVtX25hbWUuY19zdHIoKSk7Ci0KLSAgICAgICAgaWYgKGl0ZW1fdHlwZSA9PSBGT1VSQ0MoJ20nLCAnaScsICdtJywgJ2UnKSkgewotICAgICAgICAgICAgU3RyaW5nOCBjb250ZW50X3R5cGU7Ci0gICAgICAgICAgICBpZiAoIXBhcnNlTnVsbFRlcm1pbmF0ZWRTdHJpbmcoJm9mZnNldCwgJnNpemUsICZjb250ZW50X3R5cGUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nOCBjb250ZW50X2VuY29kaW5nOwotICAgICAgICAgICAgaWYgKCFwYXJzZU51bGxUZXJtaW5hdGVkU3RyaW5nKCZvZmZzZXQsICZzaXplLCAmY29udGVudF9lbmNvZGluZykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGl0ZW1fdHlwZSA9PSBGT1VSQ0MoJ3UnLCAncicsICdpJywgJyAnKSkgewotICAgICAgICAgICAgU3RyaW5nOCBpdGVtX3VyaV90eXBlOwotICAgICAgICAgICAgaWYgKCFwYXJzZU51bGxUZXJtaW5hdGVkU3RyaW5nKCZvZmZzZXQsICZzaXplLCAmaXRlbV91cmlfdHlwZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotc3RydWN0IElpbmZCb3ggOiBwdWJsaWMgRnVsbEJveCB7Ci0gICAgSWluZkJveChjb25zdCBzcDxEYXRhU291cmNlPiBzb3VyY2UsIFZlY3RvcjxJdGVtSW5mbz4gKml0ZW1JbmZvcykgOgotICAgICAgICBGdWxsQm94KHNvdXJjZSwgRk9VUkNDKCdpJywgJ2knLCAnbicsICdmJykpLAotICAgICAgICBtSXRlbUluZm9zKGl0ZW1JbmZvcyksIG1IYXNHcmlkcyhmYWxzZSkge30KLQotICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICBib29sIGhhc0dyaWRzKCkgeyByZXR1cm4gbUhhc0dyaWRzOyB9Ci0KLXByb3RlY3RlZDoKLSAgICBzdGF0dXNfdCBvbkNodW5rRGF0YSh1aW50MzJfdCB0eXBlLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOwotCi1wcml2YXRlOgotICAgIFZlY3RvcjxJdGVtSW5mbz4gKm1JdGVtSW5mb3M7Ci0gICAgYm9vbCBtSGFzR3JpZHM7Ci19OwotCi1zdGF0dXNfdCBJaW5mQm94OjpwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKLSAgICBBTE9HVigiJXM6IG9mZnNldCAlbGxkLCBzaXplICV6dSIsIF9fRlVOQ1RJT05fXywgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOwotCi0gICAgc3RhdHVzX3QgZXJyID0gcGFyc2VGdWxsQm94SGVhZGVyKCZvZmZzZXQsICZzaXplKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgc2l6ZV90IGVudHJ5Q291bnRTaXplID0gdmVyc2lvbigpID09IDAgPyAyIDogNDsKLSAgICBpZiAoc2l6ZSA8IGVudHJ5Q291bnRTaXplKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotICAgIHVpbnQzMl90IGVudHJ5X2NvdW50OwotICAgIGlmICghc291cmNlKCktPmdldFVJbnQzMlZhcihvZmZzZXQsICZlbnRyeV9jb3VudCwgZW50cnlDb3VudFNpemUpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICB9Ci0gICAgQUxPR1YoImVudHJ5X2NvdW50ICVkIiwgZW50cnlfY291bnQpOwotCi0gICAgb2ZmNjRfdCBzdG9wT2Zmc2V0ID0gb2Zmc2V0ICsgc2l6ZTsKLSAgICBvZmZzZXQgKz0gZW50cnlDb3VudFNpemU7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbnRyeV9jb3VudCAmJiBvZmZzZXQgPCBzdG9wT2Zmc2V0OyBpKyspIHsKLSAgICAgICAgQUxPR1YoImVudHJ5ICV6dSIsIGkpOwotICAgICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUNodW5rKCZvZmZzZXQpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChvZmZzZXQgIT0gc3RvcE9mZnNldCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgSWluZkJveDo6b25DaHVua0RhdGEodWludDMyX3QgdHlwZSwgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKHR5cGUgIT0gRk9VUkNDKCdpJywgJ24nLCAnZicsICdlJykpIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIEluZmVCb3ggaW5mZUJveChzb3VyY2UoKSk7Ci0gICAgSXRlbUluZm8gaXRlbUluZm87Ci0gICAgc3RhdHVzX3QgZXJyID0gaW5mZUJveC5wYXJzZShvZmZzZXQsIHNpemUsICZpdGVtSW5mbyk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBtSXRlbUluZm9zLT5wdXNoX2JhY2soaXRlbUluZm8pOwotICAgIG1IYXNHcmlkcyB8PSAoaXRlbUluZm8uaXRlbVR5cGUgPT0gRk9VUkNDKCdnJywgJ3InLCAnaScsICdkJykpOwotICAgIHJldHVybiBPSzsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLUl0ZW1UYWJsZTo6SXRlbVRhYmxlKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UpCi0gICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAotICAgICAgbVByaW1hcnlJdGVtSWQoMCksCi0gICAgICBtSWRhdE9mZnNldCgwKSwKLSAgICAgIG1JZGF0U2l6ZSgwKSwKLSAgICAgIG1JbWFnZUl0ZW1zVmFsaWQoZmFsc2UpLAotICAgICAgbUN1cnJlbnRJbWFnZUluZGV4KDApIHsKLSAgICBtUmVxdWlyZWRCb3hlcy5pbnNlcnQoJ2lwcnAnKTsKLSAgICBtUmVxdWlyZWRCb3hlcy5pbnNlcnQoJ2lsb2MnKTsKLSAgICBtUmVxdWlyZWRCb3hlcy5pbnNlcnQoJ3BpdG0nKTsKLSAgICBtUmVxdWlyZWRCb3hlcy5pbnNlcnQoJ2lpbmYnKTsKLX0KLQotSXRlbVRhYmxlOjp+SXRlbVRhYmxlKCkge30KLQotc3RhdHVzX3QgSXRlbVRhYmxlOjpwYXJzZSh1aW50MzJfdCB0eXBlLCBvZmY2NF90IGRhdGFfb2Zmc2V0LCBzaXplX3QgY2h1bmtfZGF0YV9zaXplKSB7Ci0gICAgc3dpdGNoKHR5cGUpIHsKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAnbCcsICdvJywgJ2MnKToKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHBhcnNlSWxvY0JveChkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZPVVJDQygnaScsICdpJywgJ24nLCAnZicpOgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcGFyc2VJaW5mQm94KGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdpJywgJ3AnLCAncicsICdwJyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJzZUlwcnBCb3goZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3AnLCAnaScsICd0JywgJ20nKToKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHBhcnNlUGl0bUJveChkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZPVVJDQygnaScsICdkJywgJ2EnLCAndCcpOgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcGFyc2VJZGF0Qm94KGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdpJywgJ3InLCAnZScsICdmJyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJzZUlyZWZCb3goZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAncCcsICdyJywgJ28nKToKLSAgICAgICAgewotICAgICAgICAgICAgQUxPR1coImlwcm8gYm94IG5vdCBzdXBwb3J0ZWQhIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICBBTE9HVygidW5yZWNvZ25pemVkIGJveCB0eXBlOiAweCV4IiwgdHlwZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci19Ci0KLXN0YXR1c190IEl0ZW1UYWJsZTo6cGFyc2VJbG9jQm94KG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgewotICAgIEFMT0dWKCIlczogb2Zmc2V0ICVsbGQsIHNpemUgJXp1IiwgX19GVU5DVElPTl9fLCAobG9uZyBsb25nKW9mZnNldCwgc2l6ZSk7Ci0KLSAgICBJbG9jQm94IGlsb2NCb3gobURhdGFTb3VyY2UsICZtSXRlbUxvY3MpOwotICAgIHN0YXR1c190IGVyciA9IGlsb2NCb3gucGFyc2Uob2Zmc2V0LCBzaXplKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYgKGlsb2NCb3guaGFzQ29uc3RydWN0TWV0aG9kMSgpKSB7Ci0gICAgICAgIG1SZXF1aXJlZEJveGVzLmluc2VydCgnaWRhdCcpOwotICAgIH0KLQotICAgIHJldHVybiBidWlsZEltYWdlSXRlbXNJZlBvc3NpYmxlKCdpbG9jJyk7Ci19Ci0KLXN0YXR1c190IEl0ZW1UYWJsZTo6cGFyc2VJaW5mQm94KG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgewotICAgIEFMT0dWKCIlczogb2Zmc2V0ICVsbGQsIHNpemUgJXp1IiwgX19GVU5DVElPTl9fLCAobG9uZyBsb25nKW9mZnNldCwgc2l6ZSk7Ci0KLSAgICBJaW5mQm94IGlpbmZCb3gobURhdGFTb3VyY2UsICZtSXRlbUluZm9zKTsKLSAgICBzdGF0dXNfdCBlcnIgPSBpaW5mQm94LnBhcnNlKG9mZnNldCwgc2l6ZSk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmIChpaW5mQm94Lmhhc0dyaWRzKCkpIHsKLSAgICAgICAgbVJlcXVpcmVkQm94ZXMuaW5zZXJ0KCdpcmVmJyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGJ1aWxkSW1hZ2VJdGVtc0lmUG9zc2libGUoJ2lpbmYnKTsKLX0KLQotc3RhdHVzX3QgSXRlbVRhYmxlOjpwYXJzZVBpdG1Cb3gob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7Ci0gICAgQUxPR1YoIiVzOiBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKLQotICAgIFBpdG1Cb3ggcGl0bUJveChtRGF0YVNvdXJjZSk7Ci0gICAgc3RhdHVzX3QgZXJyID0gcGl0bUJveC5wYXJzZShvZmZzZXQsIHNpemUsICZtUHJpbWFyeUl0ZW1JZCk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHJldHVybiBidWlsZEltYWdlSXRlbXNJZlBvc3NpYmxlKCdwaXRtJyk7Ci19Ci0KLXN0YXR1c190IEl0ZW1UYWJsZTo6cGFyc2VJcHJwQm94KG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgewotICAgIEFMT0dWKCIlczogb2Zmc2V0ICVsbGQsIHNpemUgJXp1IiwgX19GVU5DVElPTl9fLCAobG9uZyBsb25nKW9mZnNldCwgc2l6ZSk7Ci0KLSAgICBJcHJwQm94IGlwcnBCb3gobURhdGFTb3VyY2UsICZtSXRlbVByb3BlcnRpZXMsICZtQXNzb2NpYXRpb25zKTsKLSAgICBzdGF0dXNfdCBlcnIgPSBpcHJwQm94LnBhcnNlKG9mZnNldCwgc2l6ZSk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHJldHVybiBidWlsZEltYWdlSXRlbXNJZlBvc3NpYmxlKCdpcHJwJyk7Ci19Ci0KLXN0YXR1c190IEl0ZW1UYWJsZTo6cGFyc2VJZGF0Qm94KG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgewotICAgIEFMT0dWKCIlczogaWRhdCBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKLQotICAgIC8vIG9ubHkgcmVtZW1iZXIgdGhlIG9mZnNldCBhbmQgc2l6ZSBvZiBpZGF0IGJveCBmb3IgbGF0ZXIgdXNlCi0gICAgbUlkYXRPZmZzZXQgPSBvZmZzZXQ7Ci0gICAgbUlkYXRTaXplID0gc2l6ZTsKLQotICAgIHJldHVybiBidWlsZEltYWdlSXRlbXNJZlBvc3NpYmxlKCdpZGF0Jyk7Ci19Ci0KLXN0YXR1c190IEl0ZW1UYWJsZTo6cGFyc2VJcmVmQm94KG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgewotICAgIEFMT0dWKCIlczogb2Zmc2V0ICVsbGQsIHNpemUgJXp1IiwgX19GVU5DVElPTl9fLCAobG9uZyBsb25nKW9mZnNldCwgc2l6ZSk7Ci0KLSAgICBJcmVmQm94IGlyZWZCb3gobURhdGFTb3VyY2UsICZtSXRlbVJlZmVyZW5jZXMpOwotICAgIHN0YXR1c190IGVyciA9IGlyZWZCb3gucGFyc2Uob2Zmc2V0LCBzaXplKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcmV0dXJuIGJ1aWxkSW1hZ2VJdGVtc0lmUG9zc2libGUoJ2lyZWYnKTsKLX0KLQotc3RhdHVzX3QgSXRlbVRhYmxlOjpidWlsZEltYWdlSXRlbXNJZlBvc3NpYmxlKHVpbnQzMl90IHR5cGUpIHsKLSAgICBpZiAobUltYWdlSXRlbXNWYWxpZCkgewotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgbUJveGVzU2Vlbi5pbnNlcnQodHlwZSk7Ci0KLSAgICAvLyBuZWVkIGF0IGxlYXN0ICdpcHJwJywgJ2lsb2MnLCAncGl0bScsICdpaW5mJzsKLSAgICAvLyBuZWVkICdpZGF0JyBpZiBhbnkgaXRlbXMgdXNlZCBjb25zdHJ1Y3Rpb25fbWV0aG9kIG9mIDI7Ci0gICAgLy8gbmVlZCAnaXJlZicgaWYgdGhlcmUgYXJlIGdyaWRzLgotICAgIGlmICghc3RkOjppbmNsdWRlcygKLSAgICAgICAgICAgIG1Cb3hlc1NlZW4uYmVnaW4oKSwgbUJveGVzU2Vlbi5lbmQoKSwKLSAgICAgICAgICAgIG1SZXF1aXJlZEJveGVzLmJlZ2luKCksIG1SZXF1aXJlZEJveGVzLmVuZCgpKSkgewotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgQUxPR1YoImJ1aWxkaW5nIGltYWdlIHRhYmxlLi4uIik7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JdGVtSW5mb3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgY29uc3QgSXRlbUluZm8gJmluZm8gPSBtSXRlbUluZm9zW2ldOwotCi0KLSAgICAgICAgLy8gaWdub3JlIG5vbi1pbWFnZSBpdGVtcwotICAgICAgICBpZiAoaW5mby5pdGVtVHlwZSAhPSBGT1VSQ0MoJ2cnLCAncicsICdpJywgJ2QnKSAmJgotICAgICAgICAgICAgaW5mby5pdGVtVHlwZSAhPSBGT1VSQ0MoJ2gnLCAndicsICdjJywgJzEnKSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBzc2l6ZV90IGltYWdlSW5kZXggPSBtSXRlbUlkVG9JbWFnZU1hcC5pbmRleE9mS2V5KGluZm8uaXRlbUlkKTsKLSAgICAgICAgaWYgKGltYWdlSW5kZXggPj0gMCkgewotICAgICAgICAgICAgQUxPR1coImlnbm9yaW5nIGR1cGxpY2F0ZSBpbWFnZSBpdGVtIGlkICVkIiwgaW5mby5pdGVtSWQpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBzc2l6ZV90IGlsb2NJbmRleCA9IG1JdGVtTG9jcy5pbmRleE9mS2V5KGluZm8uaXRlbUlkKTsKLSAgICAgICAgaWYgKGlsb2NJbmRleCA8IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJpbG9jIG1pc3NpbmcgZm9yIGltYWdlIGl0ZW0gaWQgJWQiLCBpbmZvLml0ZW1JZCk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBjb25zdCBJdGVtTG9jICZpbG9jID0gbUl0ZW1Mb2NzW2lsb2NJbmRleF07Ci0KLSAgICAgICAgb2ZmNjRfdCBvZmZzZXQ7Ci0gICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICBpZiAoaWxvYy5nZXRMb2MoJm9mZnNldCwgJnNpemUsIG1JZGF0T2Zmc2V0LCBtSWRhdFNpemUpICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgSW1hZ2VJdGVtIGltYWdlKGluZm8uaXRlbVR5cGUpOwotCi0gICAgICAgIEFMT0dWKCJhZGRpbmcgJXM6IGl0ZW1JZCAlZCIsIGltYWdlLmlzR3JpZCgpID8gImdyaWQiIDogImltYWdlIiwgaW5mby5pdGVtSWQpOwotCi0gICAgICAgIGlmIChpbWFnZS5pc0dyaWQoKSkgewotICAgICAgICAgICAgLy8gSW1hZ2VHcmlkIHN0cnVjdCBpcyBhdCBsZWFzdCA4LWJ5dGUsIGF0IG1vc3QgMTItYnl0ZSAoaWYgZmxhZ3MmMSkKLSAgICAgICAgICAgIGlmIChzaXplIDwgOCB8fCBzaXplID4gMTIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdWludDhfdCBidWZbMTJdOwotICAgICAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgYnVmLCBzaXplKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW1hZ2Uucm93cyA9IGJ1ZlsyXSArIDE7Ci0gICAgICAgICAgICBpbWFnZS5jb2x1bW5zID0gYnVmWzNdICsgMTsKLQotICAgICAgICAgICAgQUxPR1YoInJvd3MgJWQsIGNvbHVtYW5zICVkIiwgaW1hZ2Uucm93cywgaW1hZ2UuY29sdW1ucyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbWFnZS5vZmZzZXQgPSBvZmZzZXQ7Ci0gICAgICAgICAgICBpbWFnZS5zaXplID0gc2l6ZTsKLSAgICAgICAgfQotICAgICAgICBtSXRlbUlkVG9JbWFnZU1hcC5hZGQoaW5mby5pdGVtSWQsIGltYWdlKTsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Bc3NvY2lhdGlvbnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgYXR0YWNoUHJvcGVydHkobUFzc29jaWF0aW9uc1tpXSk7Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSXRlbVJlZmVyZW5jZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbUl0ZW1SZWZlcmVuY2VzW2ldLT5hcHBseShtSXRlbUlkVG9JbWFnZU1hcCk7Ci0gICAgfQotCi0gICAgbUltYWdlSXRlbXNWYWxpZCA9IHRydWU7Ci0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIEl0ZW1UYWJsZTo6YXR0YWNoUHJvcGVydHkoY29uc3QgQXNzb2NpYXRpb25FbnRyeSAmYXNzb2NpYXRpb24pIHsKLSAgICBzc2l6ZV90IGltYWdlSW5kZXggPSBtSXRlbUlkVG9JbWFnZU1hcC5pbmRleE9mS2V5KGFzc29jaWF0aW9uLml0ZW1JZCk7Ci0KLSAgICAvLyBpZ25vcmUgbm9uLWltYWdlIGl0ZW1zCi0gICAgaWYgKGltYWdlSW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB1aW50MTZfdCBwcm9wZXJ0eUluZGV4ID0gYXNzb2NpYXRpb24uaW5kZXg7Ci0gICAgaWYgKHByb3BlcnR5SW5kZXggPj0gbUl0ZW1Qcm9wZXJ0aWVzLnNpemUoKSkgewotICAgICAgICBBTE9HVygiSWdub3JpbmcgaW52YWxpZCBwcm9wZXJ0eSBpbmRleCAlZCIsIHByb3BlcnR5SW5kZXgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQUxPR1YoImF0dGFjaCBwcm9wZXJ0eSAlZCB0byBpdGVtIGlkICVkKSIsCi0gICAgICAgICAgICBwcm9wZXJ0eUluZGV4LCBhc3NvY2lhdGlvbi5pdGVtSWQpOwotCi0gICAgbUl0ZW1Qcm9wZXJ0aWVzW3Byb3BlcnR5SW5kZXhdLT5hdHRhY2hUbygKLSAgICAgICAgICAgIG1JdGVtSWRUb0ltYWdlTWFwLmVkaXRWYWx1ZUF0KGltYWdlSW5kZXgpKTsKLX0KLQotc3A8TWV0YURhdGE+IEl0ZW1UYWJsZTo6Z2V0SW1hZ2VNZXRhKCkgewotICAgIGlmICghbUltYWdlSXRlbXNWYWxpZCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBzc2l6ZV90IGltYWdlSW5kZXggPSBtSXRlbUlkVG9JbWFnZU1hcC5pbmRleE9mS2V5KG1QcmltYXJ5SXRlbUlkKTsKLSAgICBpZiAoaW1hZ2VJbmRleCA8IDApIHsKLSAgICAgICAgQUxPR0UoIlByaW1hcnkgaXRlbSBpZCAlZCBub3QgZm91bmQhIiwgbVByaW1hcnlJdGVtSWQpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBBTE9HVigicHJpbWFyeSBpbWFnZSBpbmRleCAlenUiLCBpbWFnZUluZGV4KTsKLQotICAgIGNvbnN0IEltYWdlSXRlbSAqaW1hZ2UgPSAmbUl0ZW1JZFRvSW1hZ2VNYXBbaW1hZ2VJbmRleF07Ci0KLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQyk7Ci0KLSAgICBBTE9HVigic2V0dGluZyBpbWFnZSBzaXplICVkeCVkIiwgaW1hZ2UtPndpZHRoLCBpbWFnZS0+aGVpZ2h0KTsKLSAgICBtZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIGltYWdlLT53aWR0aCk7Ci0gICAgbWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgaW1hZ2UtPmhlaWdodCk7Ci0gICAgaWYgKGltYWdlLT5yb3RhdGlvbiAhPSAwKSB7Ci0gICAgICAgIC8vIFJvdGF0aW9uIGFuZ2xlIGluIEhFSUYgaXMgQ0NXLCBjb252ZXJ0IHRvIENXIGhlcmUgdG8gYmUKLSAgICAgICAgLy8gY29uc2lzdGVudCB3aXRoIHRoZSBvdGhlciBtZWRpYSBmb3JtYXRzLgotICAgICAgICBzd2l0Y2goaW1hZ2UtPnJvdGF0aW9uKSB7Ci0gICAgICAgICAgICBjYXNlIDkwOiBtZXRhLT5zZXRJbnQzMihrS2V5Um90YXRpb24sIDI3MCk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxODA6IG1ldGEtPnNldEludDMyKGtLZXlSb3RhdGlvbiwgMTgwKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDI3MDogbWV0YS0+c2V0SW50MzIoa0tleVJvdGF0aW9uLCA5MCk7IGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDogYnJlYWs7IC8vIGRvbid0IHNldCBpZiBpbnZhbGlkCi0gICAgICAgIH0KLSAgICB9Ci0gICAgbWV0YS0+c2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgaW1hZ2UtPndpZHRoICogaW1hZ2UtPmhlaWdodCAqIDEuNSk7Ci0KLSAgICBpZiAoIWltYWdlLT50aHVtYm5haWxzLmVtcHR5KCkpIHsKLSAgICAgICAgc3NpemVfdCB0aHVtYm5haWxJbmRleCA9IG1JdGVtSWRUb0ltYWdlTWFwLmluZGV4T2ZLZXkoaW1hZ2UtPnRodW1ibmFpbHNbMF0pOwotICAgICAgICBpZiAodGh1bWJuYWlsSW5kZXggPj0gMCkgewotICAgICAgICAgICAgY29uc3QgSW1hZ2VJdGVtICZ0aHVtYm5haWwgPSBtSXRlbUlkVG9JbWFnZU1hcFt0aHVtYm5haWxJbmRleF07Ci0KLSAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlUaHVtYm5haWxXaWR0aCwgdGh1bWJuYWlsLndpZHRoKTsKLSAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlUaHVtYm5haWxIZWlnaHQsIHRodW1ibmFpbC5oZWlnaHQpOwotICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5VGh1bWJuYWlsSFZDQywga1R5cGVIVkNDLAotICAgICAgICAgICAgICAgICAgICB0aHVtYm5haWwuaHZjYy0+ZGF0YSgpLCB0aHVtYm5haWwuaHZjYy0+c2l6ZSgpKTsKLSAgICAgICAgICAgIEFMT0dWKCJ0aHVtYm5haWwgbWV0YTogJWR4JWQsIGluZGV4ICV6ZCIsCi0gICAgICAgICAgICAgICAgICAgIHRodW1ibmFpbC53aWR0aCwgdGh1bWJuYWlsLmhlaWdodCwgdGh1bWJuYWlsSW5kZXgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1coIlJlZmVyZW5jZWQgdGh1bWJuYWlsIGRvZXMgbm90IGV4aXN0ISIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGltYWdlLT5pc0dyaWQoKSkgewotICAgICAgICBzc2l6ZV90IHRpbGVJbmRleCA9IG1JdGVtSWRUb0ltYWdlTWFwLmluZGV4T2ZLZXkoaW1hZ2UtPmRpbWdSZWZzWzBdKTsKLSAgICAgICAgaWYgKHRpbGVJbmRleCA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlHcmlkUm93cywgaW1hZ2UtPnJvd3MpOwotICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5R3JpZENvbHMsIGltYWdlLT5jb2x1bW5zKTsKLQotICAgICAgICAvLyBwb2ludCBpbWFnZSB0byB0aGUgZmlyc3QgdGlsZSBmb3IgZ3JpZCBzaXplIGFuZCBIVkNDCi0gICAgICAgIGltYWdlID0gJm1JdGVtSWRUb0ltYWdlTWFwLmVkaXRWYWx1ZUF0KHRpbGVJbmRleCk7Ci0gICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlHcmlkV2lkdGgsIGltYWdlLT53aWR0aCk7Ci0gICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlHcmlkSGVpZ2h0LCBpbWFnZS0+aGVpZ2h0KTsKLSAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgaW1hZ2UtPndpZHRoICogaW1hZ2UtPmhlaWdodCAqIDEuNSk7Ci0gICAgfQotCi0gICAgaWYgKGltYWdlLT5odmNjID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoImh2Y2MgaXMgbWlzc2luZyEiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIG1ldGEtPnNldERhdGEoa0tleUhWQ0MsIGtUeXBlSFZDQywgaW1hZ2UtPmh2Y2MtPmRhdGEoKSwgaW1hZ2UtPmh2Y2MtPnNpemUoKSk7Ci0KLSAgICBpZiAoaW1hZ2UtPmljYyAhPSBOVUxMKSB7Ci0gICAgICAgIG1ldGEtPnNldERhdGEoa0tleUljY1Byb2ZpbGUsIDAsIGltYWdlLT5pY2MtPmRhdGEoKSwgaW1hZ2UtPmljYy0+c2l6ZSgpKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1ldGE7Ci19Ci0KLXVpbnQzMl90IEl0ZW1UYWJsZTo6Y291bnRJbWFnZXMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1JbWFnZUl0ZW1zVmFsaWQgPyBtSXRlbUlkVG9JbWFnZU1hcC5zaXplKCkgOiAwOwotfQotCi1zdGF0dXNfdCBJdGVtVGFibGU6OmZpbmRQcmltYXJ5SW1hZ2UodWludDMyX3QgKmltYWdlSW5kZXgpIHsKLSAgICBpZiAoIW1JbWFnZUl0ZW1zVmFsaWQpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIHNzaXplX3QgaW5kZXggPSBtSXRlbUlkVG9JbWFnZU1hcC5pbmRleE9mS2V5KG1QcmltYXJ5SXRlbUlkKTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgKmltYWdlSW5kZXggPSBpbmRleDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEl0ZW1UYWJsZTo6ZmluZFRodW1ibmFpbCh1aW50MzJfdCAqaW1hZ2VJbmRleCkgewotICAgIGlmICghbUltYWdlSXRlbXNWYWxpZCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgc3NpemVfdCBwcmltYXJ5SW5kZXggPSBtSXRlbUlkVG9JbWFnZU1hcC5pbmRleE9mS2V5KG1QcmltYXJ5SXRlbUlkKTsKLSAgICBpZiAocHJpbWFyeUluZGV4IDwgMCkgewotICAgICAgICBBTE9HRSgiUHJpbWFyeSBpdGVtIGlkICVkIG5vdCBmb3VuZCEiLCBtUHJpbWFyeUl0ZW1JZCk7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgY29uc3QgSW1hZ2VJdGVtICZwcmltYXJ5SW1hZ2UgPSBtSXRlbUlkVG9JbWFnZU1hcFtwcmltYXJ5SW5kZXhdOwotICAgIGlmIChwcmltYXJ5SW1hZ2UudGh1bWJuYWlscy5lbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dXKCJVc2luZyBwcmltYXJ5IGluIHBsYWNlIG9mIHRodW1ibmFpbC4iKTsKLSAgICAgICAgKmltYWdlSW5kZXggPSBwcmltYXJ5SW5kZXg7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBzc2l6ZV90IHRodW1ibmFpbEluZGV4ID0gbUl0ZW1JZFRvSW1hZ2VNYXAuaW5kZXhPZktleSgKLSAgICAgICAgICAgIHByaW1hcnlJbWFnZS50aHVtYm5haWxzWzBdKTsKLSAgICBpZiAodGh1bWJuYWlsSW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dFKCJUaHVtYm5haWwgaXRlbSBpZCAlZCBub3QgZm91bmQhIiwgcHJpbWFyeUltYWdlLnRodW1ibmFpbHNbMF0pOwotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgICppbWFnZUluZGV4ID0gdGh1bWJuYWlsSW5kZXg7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBJdGVtVGFibGU6OmdldEltYWdlT2Zmc2V0QW5kU2l6ZSgKLSAgICAgICAgdWludDMyX3QgKmltYWdlSW5kZXgsIG9mZjY0X3QgKm9mZnNldCwgc2l6ZV90ICpzaXplKSB7Ci0gICAgaWYgKCFtSW1hZ2VJdGVtc1ZhbGlkKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBpZiAoaW1hZ2VJbmRleCAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICgqaW1hZ2VJbmRleCA+PSBtSXRlbUlkVG9JbWFnZU1hcC5zaXplKCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJCYWQgaW1hZ2UgaW5kZXghIik7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIG1DdXJyZW50SW1hZ2VJbmRleCA9ICppbWFnZUluZGV4OwotICAgIH0KLQotICAgIEltYWdlSXRlbSAmaW1hZ2UgPSBtSXRlbUlkVG9JbWFnZU1hcC5lZGl0VmFsdWVBdChtQ3VycmVudEltYWdlSW5kZXgpOwotICAgIGlmIChpbWFnZS5pc0dyaWQoKSkgewotICAgICAgICB1aW50MzJfdCB0aWxlSXRlbUlkOwotICAgICAgICBzdGF0dXNfdCBlcnIgPSBpbWFnZS5nZXROZXh0VGlsZUl0ZW1JZCgmdGlsZUl0ZW1JZCwgaW1hZ2VJbmRleCAhPSBOVUxMKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBzc2l6ZV90IHRpbGVJbWFnZUluZGV4ID0gbUl0ZW1JZFRvSW1hZ2VNYXAuaW5kZXhPZktleSh0aWxlSXRlbUlkKTsKLSAgICAgICAgaWYgKHRpbGVJbWFnZUluZGV4IDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07Ci0gICAgICAgIH0KLSAgICAgICAgKm9mZnNldCA9IG1JdGVtSWRUb0ltYWdlTWFwW3RpbGVJbWFnZUluZGV4XS5vZmZzZXQ7Ci0gICAgICAgICpzaXplID0gbUl0ZW1JZFRvSW1hZ2VNYXBbdGlsZUltYWdlSW5kZXhdLnNpemU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGltYWdlSW5kZXggPT0gTlVMTCkgewotICAgICAgICAgICAgLy8gRm9yIHNpbmdsZSBpbWFnZXMsIHdlIG9ubHkgYWxsb3cgaXQgdG8gYmUgcmVhZCBvbmNlLCBhZnRlciB0aGF0Ci0gICAgICAgICAgICAvLyBpdCdzIEVPUy4gIE5ldyBpbWFnZSBpbmRleCBtdXN0IGJlIHJlcXVlc3RlZCBlYWNoIHRpbWUuCi0gICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICAgICAgfQotICAgICAgICAqb2Zmc2V0ID0gbUl0ZW1JZFRvSW1hZ2VNYXBbbUN1cnJlbnRJbWFnZUluZGV4XS5vZmZzZXQ7Ci0gICAgICAgICpzaXplID0gbUl0ZW1JZFRvSW1hZ2VNYXBbbUN1cnJlbnRJbWFnZUluZGV4XS5zaXplOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotfSAvLyBuYW1lc3BhY2UgaGVpZgotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSlBFR1NvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9KUEVHU291cmNlLmNwcAppbmRleCBiYWZhNGIyLi4xMGViMmQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9KUEVHU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9KUEVHU291cmNlLmNwcApAQCAtMTgsOSArMTgsMTAgQEAKICNkZWZpbmUgTE9HX1RBRyAiSlBFR1NvdXJjZSIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAorI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9KUEVHU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KQEAgLTEwOCw3ICsxMDksNyBAQAogfQogCiBzdGF0dXNfdCBKUEVHU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogICAgICpvdXQgPSBOVUxMOwogCiAgICAgaW50NjRfdCBzZWVrVGltZVVzOwpAQCAtMTE3LDcgKzExOCw3IEBACiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KIAotICAgIE1lZGlhQnVmZmVyICpidWZmZXI7CisgICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXI7CiAgICAgbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKTsKIAogICAgIHNzaXplX3QgbiA9IG1Tb3VyY2UtPnJlYWRBdChtT2Zmc2V0LCBidWZmZXItPmRhdGEoKSwgbVNpemUgLSBtT2Zmc2V0KTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QM0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUDNFeHRyYWN0b3IuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmRmNTIyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QM0V4dHJhY3Rvci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2OTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiTVAzRXh0cmFjdG9yIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiaW5jbHVkZS9NUDNFeHRyYWN0b3IuaCIKLQotI2luY2x1ZGUgImluY2x1ZGUvYXZjX3V0aWxzLmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9JRDMuaCIKLSNpbmNsdWRlICJpbmNsdWRlL1ZCUklTZWVrZXIuaCIKLSNpbmNsdWRlICJpbmNsdWRlL1hJTkdTZWVrZXIuaCIKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBFdmVyeXRoaW5nIG11c3QgbWF0Y2ggZXhjZXB0IGZvcgotLy8gcHJvdGVjdGlvbiwgYml0cmF0ZSwgcGFkZGluZywgcHJpdmF0ZSBiaXRzLCBtb2RlLCBtb2RlIGV4dGVuc2lvbiwKLS8vIGNvcHlyaWdodCBiaXQsIG9yaWdpbmFsIGJpdCBhbmQgZW1waGFzaXMuCi0vLyBZZXMgLi4uIHRoZXJlIGFyZSB0aGluZ3MgdGhhdCBtdXN0IGluZGVlZCBtYXRjaC4uLgotc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNYXNrID0gMHhmZmZlMGMwMDsKLQotc3RhdGljIGJvb2wgUmVzeW5jKAotICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCB1aW50MzJfdCBtYXRjaF9oZWFkZXIsCi0gICAgICAgIG9mZjY0X3QgKmlub3V0X3Bvcywgb2ZmNjRfdCAqcG9zdF9pZDNfcG9zLCB1aW50MzJfdCAqb3V0X2hlYWRlcikgewotICAgIGlmIChwb3N0X2lkM19wb3MgIT0gTlVMTCkgewotICAgICAgICAqcG9zdF9pZDNfcG9zID0gMDsKLSAgICB9Ci0KLSAgICBpZiAoKmlub3V0X3BvcyA9PSAwKSB7Ci0gICAgICAgIC8vIFNraXAgYW4gb3B0aW9uYWwgSUQzIGhlYWRlciBpZiBzeW5jaW5nIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZwotICAgICAgICAvLyBvZiB0aGUgZGF0YXNvdXJjZS4KLQotICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICB1aW50OF90IGlkM2hlYWRlclsxMF07Ci0gICAgICAgICAgICBpZiAoc291cmNlLT5yZWFkQXQoKmlub3V0X3BvcywgaWQzaGVhZGVyLCBzaXplb2YoaWQzaGVhZGVyKSkKLSAgICAgICAgICAgICAgICAgICAgPCAoc3NpemVfdClzaXplb2YoaWQzaGVhZGVyKSkgewotICAgICAgICAgICAgICAgIC8vIElmIHdlIGNhbid0IGV2ZW4gcmVhZCB0aGVzZSAxMCBieXRlcywgd2UgbWlnaHQgYXMgd2VsbCBiYWlsCi0gICAgICAgICAgICAgICAgLy8gb3V0LCBldmVuIGlmIHRoZXJlIF93ZXJlXyAxMCBieXRlcyBvZiB2YWxpZCBtcDMgYXVkaW8gZGF0YS4uLgotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1lbWNtcCgiSUQzIiwgaWQzaGVhZGVyLCAzKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBTa2lwIHRoZSBJRDN2MiBoZWFkZXIuCi0KLSAgICAgICAgICAgIHNpemVfdCBsZW4gPQotICAgICAgICAgICAgICAgICgoaWQzaGVhZGVyWzZdICYgMHg3ZikgPDwgMjEpCi0gICAgICAgICAgICAgICAgfCAoKGlkM2hlYWRlcls3XSAmIDB4N2YpIDw8IDE0KQotICAgICAgICAgICAgICAgIHwgKChpZDNoZWFkZXJbOF0gJiAweDdmKSA8PCA3KQotICAgICAgICAgICAgICAgIHwgKGlkM2hlYWRlcls5XSAmIDB4N2YpOwotCi0gICAgICAgICAgICBsZW4gKz0gMTA7Ci0KLSAgICAgICAgICAgICppbm91dF9wb3MgKz0gbGVuOwotCi0gICAgICAgICAgICBBTE9HVigic2tpcHBlZCBJRDMgdGFnLCBuZXcgc3RhcnRpbmcgb2Zmc2V0IGlzICVsbGQgKDB4JTAxNmxseCkiLAotICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSppbm91dF9wb3MsIChsb25nIGxvbmcpKmlub3V0X3Bvcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocG9zdF9pZDNfcG9zICE9IE5VTEwpIHsKLSAgICAgICAgICAgICpwb3N0X2lkM19wb3MgPSAqaW5vdXRfcG9zOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgb2ZmNjRfdCBwb3MgPSAqaW5vdXRfcG9zOwotICAgIGJvb2wgdmFsaWQgPSBmYWxzZTsKLQotICAgIGNvbnN0IHNpemVfdCBrTWF4UmVhZEJ5dGVzID0gMTAyNDsKLSAgICBjb25zdCBzaXplX3Qga01heEJ5dGVzQ2hlY2tlZCA9IDEyOCAqIDEwMjQ7Ci0gICAgdWludDhfdCBidWZba01heFJlYWRCeXRlc107Ci0gICAgc3NpemVfdCBieXRlc1RvUmVhZCA9IGtNYXhSZWFkQnl0ZXM7Ci0gICAgc3NpemVfdCB0b3RhbEJ5dGVzUmVhZCA9IDA7Ci0gICAgc3NpemVfdCByZW1haW5pbmdCeXRlcyA9IDA7Ci0gICAgYm9vbCByZWFjaEVPUyA9IGZhbHNlOwotICAgIHVpbnQ4X3QgKnRtcCA9IGJ1ZjsKLQotICAgIGRvIHsKLSAgICAgICAgaWYgKHBvcyA+PSAob2ZmNjRfdCkoKmlub3V0X3BvcyArIGtNYXhCeXRlc0NoZWNrZWQpKSB7Ci0gICAgICAgICAgICAvLyBEb24ndCBzY2FuIGZvcmV2ZXIuCi0gICAgICAgICAgICBBTE9HVigiZ2l2aW5nIHVwIGF0IG9mZnNldCAlbGxkIiwgKGxvbmcgbG9uZylwb3MpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmVtYWluaW5nQnl0ZXMgPCA0KSB7Ci0gICAgICAgICAgICBpZiAocmVhY2hFT1MpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KGJ1ZiwgdG1wLCByZW1haW5pbmdCeXRlcyk7Ci0gICAgICAgICAgICAgICAgYnl0ZXNUb1JlYWQgPSBrTWF4UmVhZEJ5dGVzIC0gcmVtYWluaW5nQnl0ZXM7Ci0KLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIFRoZSBuZXh0IHJlYWQgcG9zaXRpb24gc2hvdWxkIHN0YXJ0IGZyb20gdGhlIGVuZCBvZgotICAgICAgICAgICAgICAgICAqIHRoZSBsYXN0IGJ1ZmZlciwgYW5kIHRodXMgc2hvdWxkIGluY2x1ZGUgdGhlIHJlbWFpbmluZwotICAgICAgICAgICAgICAgICAqIGJ5dGVzIGluIHRoZSBidWZmZXIuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgdG90YWxCeXRlc1JlYWQgPSBzb3VyY2UtPnJlYWRBdChwb3MgKyByZW1haW5pbmdCeXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiArIHJlbWFpbmluZ0J5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNUb1JlYWQpOwotICAgICAgICAgICAgICAgIGlmICh0b3RhbEJ5dGVzUmVhZCA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZWFjaEVPUyA9ICh0b3RhbEJ5dGVzUmVhZCAhPSBieXRlc1RvUmVhZCk7Ci0gICAgICAgICAgICAgICAgdG90YWxCeXRlc1JlYWQgKz0gcmVtYWluaW5nQnl0ZXM7Ci0gICAgICAgICAgICAgICAgcmVtYWluaW5nQnl0ZXMgPSB0b3RhbEJ5dGVzUmVhZDsKLSAgICAgICAgICAgICAgICB0bXAgPSBidWY7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB1aW50MzJfdCBoZWFkZXIgPSBVMzJfQVQodG1wKTsKLQotICAgICAgICBpZiAobWF0Y2hfaGVhZGVyICE9IDAgJiYgKGhlYWRlciAmIGtNYXNrKSAhPSAobWF0Y2hfaGVhZGVyICYga01hc2spKSB7Ci0gICAgICAgICAgICArK3BvczsKLSAgICAgICAgICAgICsrdG1wOwotICAgICAgICAgICAgLS1yZW1haW5pbmdCeXRlczsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgc2l6ZV90IGZyYW1lX3NpemU7Ci0gICAgICAgIGludCBzYW1wbGVfcmF0ZSwgbnVtX2NoYW5uZWxzLCBiaXRyYXRlOwotICAgICAgICBpZiAoIUdldE1QRUdBdWRpb0ZyYW1lU2l6ZSgKLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyLCAmZnJhbWVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgJnNhbXBsZV9yYXRlLCAmbnVtX2NoYW5uZWxzLCAmYml0cmF0ZSkpIHsKLSAgICAgICAgICAgICsrcG9zOwotICAgICAgICAgICAgKyt0bXA7Ci0gICAgICAgICAgICAtLXJlbWFpbmluZ0J5dGVzOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBBTE9HVigiZm91bmQgcG9zc2libGUgMXN0IGZyYW1lIGF0ICVsbGQgKGhlYWRlciA9IDB4JTA4eCkiLCAobG9uZyBsb25nKXBvcywgaGVhZGVyKTsKLQotICAgICAgICAvLyBXZSBmb3VuZCB3aGF0IGxvb2tzIGxpa2UgYSB2YWxpZCBmcmFtZSwKLSAgICAgICAgLy8gbm93IGZpbmQgaXRzIHN1Y2Nlc3NvcnMuCi0KLSAgICAgICAgb2ZmNjRfdCB0ZXN0X3BvcyA9IHBvcyArIGZyYW1lX3NpemU7Ci0KLSAgICAgICAgdmFsaWQgPSB0cnVlOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgewotICAgICAgICAgICAgdWludDhfdCB0bXBbNF07Ci0gICAgICAgICAgICBpZiAoc291cmNlLT5yZWFkQXQodGVzdF9wb3MsIHRtcCwgNCkgPCA0KSB7Ci0gICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdWludDMyX3QgdGVzdF9oZWFkZXIgPSBVMzJfQVQodG1wKTsKLQotICAgICAgICAgICAgQUxPR1YoInN1YnNlcXVlbnQgaGVhZGVyIGlzICUwOHgiLCB0ZXN0X2hlYWRlcik7Ci0KLSAgICAgICAgICAgIGlmICgodGVzdF9oZWFkZXIgJiBrTWFzaykgIT0gKGhlYWRlciAmIGtNYXNrKSkgewotICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNpemVfdCB0ZXN0X2ZyYW1lX3NpemU7Ci0gICAgICAgICAgICBpZiAoIUdldE1QRUdBdWRpb0ZyYW1lU2l6ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfaGVhZGVyLCAmdGVzdF9mcmFtZV9zaXplKSkgewotICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFMT0dWKCJmb3VuZCBzdWJzZXF1ZW50IGZyYW1lICMlZCBhdCAlbGxkIiwgaiArIDIsIChsb25nIGxvbmcpdGVzdF9wb3MpOwotCi0gICAgICAgICAgICB0ZXN0X3BvcyArPSB0ZXN0X2ZyYW1lX3NpemU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodmFsaWQpIHsKLSAgICAgICAgICAgICppbm91dF9wb3MgPSBwb3M7Ci0KLSAgICAgICAgICAgIGlmIChvdXRfaGVhZGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAqb3V0X2hlYWRlciA9IGhlYWRlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dWKCJubyBkaWNlLCBubyB2YWxpZCBzZXF1ZW5jZSBvZiBmcmFtZXMgZm91bmQuIik7Ci0gICAgICAgIH0KLQotICAgICAgICArK3BvczsKLSAgICAgICAgKyt0bXA7Ci0gICAgICAgIC0tcmVtYWluaW5nQnl0ZXM7Ci0gICAgfSB3aGlsZSAoIXZhbGlkKTsKLQotICAgIHJldHVybiB2YWxpZDsKLX0KLQotY2xhc3MgTVAzU291cmNlIDogcHVibGljIE1lZGlhU291cmNlIHsKLXB1YmxpYzoKLSAgICBNUDNTb3VyY2UoCi0gICAgICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEsIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsCi0gICAgICAgICAgICBvZmY2NF90IGZpcnN0X2ZyYW1lX3BvcywgdWludDMyX3QgZml4ZWRfaGVhZGVyLAotICAgICAgICAgICAgY29uc3Qgc3A8TVAzU2Vla2VyPiAmc2Vla2VyKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotCi0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfk1QM1NvdXJjZSgpOwotCi1wcml2YXRlOgotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heEZyYW1lU2l6ZTsKLSAgICBzcDxNZXRhRGF0YT4gbU1ldGE7Ci0gICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7Ci0gICAgb2ZmNjRfdCBtRmlyc3RGcmFtZVBvczsKLSAgICB1aW50MzJfdCBtRml4ZWRIZWFkZXI7Ci0gICAgb2ZmNjRfdCBtQ3VycmVudFBvczsKLSAgICBpbnQ2NF90IG1DdXJyZW50VGltZVVzOwotICAgIGJvb2wgbVN0YXJ0ZWQ7Ci0gICAgc3A8TVAzU2Vla2VyPiBtU2Vla2VyOwotICAgIE1lZGlhQnVmZmVyR3JvdXAgKm1Hcm91cDsKLQotICAgIGludDY0X3QgbUJhc2lzVGltZVVzOwotICAgIGludDY0X3QgbVNhbXBsZXNSZWFkOwotCi0gICAgTVAzU291cmNlKGNvbnN0IE1QM1NvdXJjZSAmKTsKLSAgICBNUDNTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBNUDNTb3VyY2UgJik7Ci19OwotCi1NUDNFeHRyYWN0b3I6Ok1QM0V4dHJhY3RvcigKLSAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtZXRhKQotICAgIDogbUluaXRDaGVjayhOT19JTklUKSwKLSAgICAgIG1EYXRhU291cmNlKHNvdXJjZSksCi0gICAgICBtRmlyc3RGcmFtZVBvcygtMSksCi0gICAgICBtRml4ZWRIZWFkZXIoMCkgewotCi0gICAgb2ZmNjRfdCBwb3MgPSAwOwotICAgIG9mZjY0X3QgcG9zdF9pZDNfcG9zOwotICAgIHVpbnQzMl90IGhlYWRlcjsKLSAgICBib29sIHN1Y2Nlc3M7Ci0KLSAgICBpbnQ2NF90IG1ldGFfb2Zmc2V0OwotICAgIHVpbnQzMl90IG1ldGFfaGVhZGVyOwotICAgIGludDY0X3QgbWV0YV9wb3N0X2lkM19vZmZzZXQ7Ci0gICAgaWYgKG1ldGEgIT0gTlVMTAotICAgICAgICAgICAgJiYgbWV0YS0+ZmluZEludDY0KCJvZmZzZXQiLCAmbWV0YV9vZmZzZXQpCi0gICAgICAgICAgICAmJiBtZXRhLT5maW5kSW50MzIoImhlYWRlciIsIChpbnQzMl90ICopJm1ldGFfaGVhZGVyKQotICAgICAgICAgICAgJiYgbWV0YS0+ZmluZEludDY0KCJwb3N0LWlkMy1vZmZzZXQiLCAmbWV0YV9wb3N0X2lkM19vZmZzZXQpKSB7Ci0gICAgICAgIC8vIFRoZSBzbmlmZmVyIGhhcyBhbHJlYWR5IGRvbmUgYWxsIHRoZSBoYXJkIHdvcmsgZm9yIHVzLCBzaW1wbHkKLSAgICAgICAgLy8gYWNjZXB0IGl0cyBqdWRnZW1lbnQuCi0gICAgICAgIHBvcyA9IChvZmY2NF90KW1ldGFfb2Zmc2V0OwotICAgICAgICBoZWFkZXIgPSBtZXRhX2hlYWRlcjsKLSAgICAgICAgcG9zdF9pZDNfcG9zID0gKG9mZjY0X3QpbWV0YV9wb3N0X2lkM19vZmZzZXQ7Ci0KLSAgICAgICAgc3VjY2VzcyA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3VjY2VzcyA9IFJlc3luYyhtRGF0YVNvdXJjZSwgMCwgJnBvcywgJnBvc3RfaWQzX3BvcywgJmhlYWRlcik7Ci0gICAgfQotCi0gICAgaWYgKCFzdWNjZXNzKSB7Ci0gICAgICAgIC8vIG1Jbml0Q2hlY2sgd2lsbCByZW1haW4gTk9fSU5JVAotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbUZpcnN0RnJhbWVQb3MgPSBwb3M7Ci0gICAgbUZpeGVkSGVhZGVyID0gaGVhZGVyOwotICAgIG1NZXRhID0gbmV3IE1ldGFEYXRhOwotICAgIHNwPFhJTkdTZWVrZXI+IHNlZWtlciA9IFhJTkdTZWVrZXI6OkNyZWF0ZUZyb21Tb3VyY2UobURhdGFTb3VyY2UsIG1GaXJzdEZyYW1lUG9zKTsKLQotICAgIGlmIChzZWVrZXIgPT0gTlVMTCkgewotICAgICAgICBtU2Vla2VyID0gVkJSSVNlZWtlcjo6Q3JlYXRlRnJvbVNvdXJjZShtRGF0YVNvdXJjZSwgcG9zdF9pZDNfcG9zKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtU2Vla2VyID0gc2Vla2VyOwotICAgICAgICBpbnQgZW5jZCA9IHNlZWtlci0+Z2V0RW5jb2RlckRlbGF5KCk7Ci0gICAgICAgIGludCBlbmNwID0gc2Vla2VyLT5nZXRFbmNvZGVyUGFkZGluZygpOwotICAgICAgICBpZiAoZW5jZCAhPSAwIHx8IGVuY3AgIT0gMCkgewotICAgICAgICAgICAgbU1ldGEtPnNldEludDMyKGtLZXlFbmNvZGVyRGVsYXksIGVuY2QpOwotICAgICAgICAgICAgbU1ldGEtPnNldEludDMyKGtLZXlFbmNvZGVyUGFkZGluZywgZW5jcCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobVNlZWtlciAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIFdoaWxlIGl0IGlzIHNhZmUgdG8gc2VuZCB0aGUgWElORy9WQlJJIGZyYW1lIHRvIHRoZSBkZWNvZGVyLCB0aGlzIHdpbGwKLSAgICAgICAgLy8gcmVzdWx0IGluIGFuIGV4dHJhIDExNTIgc2FtcGxlcyBiZWluZyBvdXRwdXQuIEluIGFkZGl0aW9uLCB0aGUgYml0cmF0ZQotICAgICAgICAvLyBvZiB0aGUgWGluZyBoZWFkZXIgbWlnaHQgbm90IG1hdGNoIHRoZSByZXN0IG9mIHRoZSBmaWxlLCB3aGljaCBjb3VsZAotICAgICAgICAvLyBsZWFkIHRvIHByb2JsZW1zIHdoZW4gc2Vla2luZy4gVGhlIHJlYWwgZmlyc3QgZnJhbWUgdG8gZGVjb2RlIGlzIGFmdGVyCi0gICAgICAgIC8vIHRoZSBYSU5HL1ZCUkkgZnJhbWUsIHNvIHNraXAgdGhlcmUuCi0gICAgICAgIHNpemVfdCBmcmFtZV9zaXplOwotICAgICAgICBpbnQgc2FtcGxlX3JhdGU7Ci0gICAgICAgIGludCBudW1fY2hhbm5lbHM7Ci0gICAgICAgIGludCBiaXRyYXRlOwotICAgICAgICBHZXRNUEVHQXVkaW9GcmFtZVNpemUoCi0gICAgICAgICAgICAgICAgaGVhZGVyLCAmZnJhbWVfc2l6ZSwgJnNhbXBsZV9yYXRlLCAmbnVtX2NoYW5uZWxzLCAmYml0cmF0ZSk7Ci0gICAgICAgIHBvcyArPSBmcmFtZV9zaXplOwotICAgICAgICBpZiAoIVJlc3luYyhtRGF0YVNvdXJjZSwgMCwgJnBvcywgJnBvc3RfaWQzX3BvcywgJmhlYWRlcikpIHsKLSAgICAgICAgICAgIC8vIG1Jbml0Q2hlY2sgd2lsbCByZW1haW4gTk9fSU5JVAotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1GaXJzdEZyYW1lUG9zID0gcG9zOwotICAgICAgICBtRml4ZWRIZWFkZXIgPSBoZWFkZXI7Ci0gICAgfQotCi0gICAgc2l6ZV90IGZyYW1lX3NpemU7Ci0gICAgaW50IHNhbXBsZV9yYXRlOwotICAgIGludCBudW1fY2hhbm5lbHM7Ci0gICAgaW50IGJpdHJhdGU7Ci0gICAgR2V0TVBFR0F1ZGlvRnJhbWVTaXplKAotICAgICAgICAgICAgaGVhZGVyLCAmZnJhbWVfc2l6ZSwgJnNhbXBsZV9yYXRlLCAmbnVtX2NoYW5uZWxzLCAmYml0cmF0ZSk7Ci0KLSAgICB1bnNpZ25lZCBsYXllciA9IDQgLSAoKGhlYWRlciA+PiAxNykgJiAzKTsKLQotICAgIHN3aXRjaCAobGF5ZXIpIHsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgbU1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHX0xBWUVSX0kpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIG1NZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR19MQVlFUl9JSSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgbU1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgVFJFU1BBU1MoKTsKLSAgICB9Ci0KLSAgICBtTWV0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsZV9yYXRlKTsKLSAgICBtTWV0YS0+c2V0SW50MzIoa0tleUJpdFJhdGUsIGJpdHJhdGUgKiAxMDAwKTsKLSAgICBtTWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbnVtX2NoYW5uZWxzKTsKLQotICAgIGludDY0X3QgZHVyYXRpb25VczsKLQotICAgIGlmIChtU2Vla2VyID09IE5VTEwgfHwgIW1TZWVrZXItPmdldER1cmF0aW9uKCZkdXJhdGlvblVzKSkgewotICAgICAgICBvZmY2NF90IGZpbGVTaXplOwotICAgICAgICBpZiAobURhdGFTb3VyY2UtPmdldFNpemUoJmZpbGVTaXplKSA9PSBPSykgewotICAgICAgICAgICAgb2ZmNjRfdCBkYXRhTGVuZ3RoID0gZmlsZVNpemUgLSBtRmlyc3RGcmFtZVBvczsKLSAgICAgICAgICAgIGlmIChkYXRhTGVuZ3RoID4gSU5UNjRfTUFYIC8gODAwMExMKSB7Ci0gICAgICAgICAgICAgICAgLy8gZHVyYXRpb24gd291bGQgb3ZlcmZsb3cKLSAgICAgICAgICAgICAgICBkdXJhdGlvblVzID0gSU5UNjRfTUFYOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkdXJhdGlvblVzID0gODAwMExMICogZGF0YUxlbmd0aCAvIGJpdHJhdGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkdXJhdGlvblVzID0gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoZHVyYXRpb25VcyA+PSAwKSB7Ci0gICAgICAgIG1NZXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uVXMpOwotICAgIH0KLQotICAgIG1Jbml0Q2hlY2sgPSBPSzsKLQotICAgIC8vIEdldCBpVHVuZXMtc3R5bGUgZ2FwbGVzcyBpbmZvIGlmIHByZXNlbnQuCi0gICAgLy8gV2hlbiBnZXR0aW5nIHRoZSBpZDMgdGFnLCBza2lwIHRoZSBWMSB0YWdzIHRvIHByZXZlbnQgdGhlIHNvdXJjZSBjYWNoZQotICAgIC8vIGZyb20gYmVpbmcgaXRlcmF0ZWQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZS4KLSAgICBJRDMgaWQzKG1EYXRhU291cmNlLCB0cnVlKTsKLSAgICBpZiAoaWQzLmlzVmFsaWQoKSkgewotICAgICAgICBJRDM6Okl0ZXJhdG9yICpjb20gPSBuZXcgSUQzOjpJdGVyYXRvcihpZDMsICJDT00iKTsKLSAgICAgICAgaWYgKGNvbS0+ZG9uZSgpKSB7Ci0gICAgICAgICAgICBkZWxldGUgY29tOwotICAgICAgICAgICAgY29tID0gbmV3IElEMzo6SXRlcmF0b3IoaWQzLCAiQ09NTSIpOwotICAgICAgICB9Ci0gICAgICAgIHdoaWxlKCFjb20tPmRvbmUoKSkgewotICAgICAgICAgICAgU3RyaW5nOCBjb21tZW50ZGVzYzsKLSAgICAgICAgICAgIFN0cmluZzggY29tbWVudHZhbHVlOwotICAgICAgICAgICAgY29tLT5nZXRTdHJpbmcoJmNvbW1lbnRkZXNjLCAmY29tbWVudHZhbHVlKTsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBkZXNjID0gY29tbWVudGRlc2Muc3RyaW5nKCk7Ci0gICAgICAgICAgICBjb25zdCBjaGFyICogdmFsdWUgPSBjb21tZW50dmFsdWUuc3RyaW5nKCk7Ci0KLSAgICAgICAgICAgIC8vIGZpcnN0IDMgY2hhcmFjdGVycyBhcmUgdGhlIGxhbmd1YWdlLCB3aGljaCB3ZSBkb24ndCBjYXJlIGFib3V0Ci0gICAgICAgICAgICBpZihzdHJsZW4oZGVzYykgPiAzICYmIHN0cmNtcChkZXNjICsgMywgImlUdW5TTVBCIikgPT0gMCkgewotCi0gICAgICAgICAgICAgICAgaW50MzJfdCBkZWxheSwgcGFkZGluZzsKLSAgICAgICAgICAgICAgICBpZiAoc3NjYW5mKHZhbHVlLCAiICUqeCAleCAleCAlKngiLCAmZGVsYXksICZwYWRkaW5nKSA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5RW5jb2RlckRlbGF5LCBkZWxheSk7Ci0gICAgICAgICAgICAgICAgICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5RW5jb2RlclBhZGRpbmcsIHBhZGRpbmcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbS0+bmV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIGRlbGV0ZSBjb207Ci0gICAgICAgIGNvbSA9IE5VTEw7Ci0gICAgfQotfQotCi1zaXplX3QgTVAzRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpIHsKLSAgICByZXR1cm4gbUluaXRDaGVjayAhPSBPSyA/IDAgOiAxOwotfQotCi1zcDxJTWVkaWFTb3VyY2U+IE1QM0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7Ci0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggIT0gMCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gbmV3IE1QM1NvdXJjZSgKLSAgICAgICAgICAgIG1NZXRhLCBtRGF0YVNvdXJjZSwgbUZpcnN0RnJhbWVQb3MsIG1GaXhlZEhlYWRlciwKLSAgICAgICAgICAgIG1TZWVrZXIpOwotfQotCi1zcDxNZXRhRGF0YT4gTVAzRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAotICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7Ci0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggIT0gMCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gbU1ldGE7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLS8vIFRoZSB0aGVvcmV0aWNhbCBtYXhpbXVtIGZyYW1lIHNpemUgZm9yIGFuIE1QRUcgYXVkaW8gc3RyZWFtIHNob3VsZCBvY2N1cgotLy8gd2hpbGUgcGxheWluZyBhIExheWVyIDIsIE1QRUd2Mi41IGF1ZGlvIHN0cmVhbSBhdCAxNjBrYnBzICh3aXRoIHBhZGRpbmcpLgotLy8gVGhlIHNpemUgb2YgdGhpcyBmcmFtZSBzaG91bGQgYmUuLi4KLS8vICgoMTE1MiBzYW1wbGVzL2ZyYW1lICogMTYwMDAwIGJpdHMvc2VjKSAvCi0vLyAgKDgwMDAgc2FtcGxlcy9zZWMgKiA4IGJpdHMvYnl0ZSkpICsgMSBwYWRkaW5nIGJ5dGUvZnJhbWUgPSAyODgxIGJ5dGVzL2ZyYW1lLgotLy8gU2V0IG91ciBtYXggZnJhbWUgc2l6ZSB0byB0aGUgbmVhcmVzdCBwb3dlciBvZiAyIGFib3ZlIHRoaXMgc2l6ZSAoYWthLCA0a0IpCi1jb25zdCBzaXplX3QgTVAzU291cmNlOjprTWF4RnJhbWVTaXplID0gKDEgPDwgMTIpOyAvKiA0MDk2IGJ5dGVzICovCi1NUDNTb3VyY2U6Ok1QM1NvdXJjZSgKLSAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhLCBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLAotICAgICAgICBvZmY2NF90IGZpcnN0X2ZyYW1lX3BvcywgdWludDMyX3QgZml4ZWRfaGVhZGVyLAotICAgICAgICBjb25zdCBzcDxNUDNTZWVrZXI+ICZzZWVrZXIpCi0gICAgOiBtTWV0YShtZXRhKSwKLSAgICAgIG1EYXRhU291cmNlKHNvdXJjZSksCi0gICAgICBtRmlyc3RGcmFtZVBvcyhmaXJzdF9mcmFtZV9wb3MpLAotICAgICAgbUZpeGVkSGVhZGVyKGZpeGVkX2hlYWRlciksCi0gICAgICBtQ3VycmVudFBvcygwKSwKLSAgICAgIG1DdXJyZW50VGltZVVzKDApLAotICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAotICAgICAgbVNlZWtlcihzZWVrZXIpLAotICAgICAgbUdyb3VwKE5VTEwpLAotICAgICAgbUJhc2lzVGltZVVzKDApLAotICAgICAgbVNhbXBsZXNSZWFkKDApIHsKLX0KLQotTVAzU291cmNlOjp+TVAzU291cmNlKCkgewotICAgIGlmIChtU3RhcnRlZCkgewotICAgICAgICBzdG9wKCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBNUDNTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICopIHsKLSAgICBDSEVDSyghbVN0YXJ0ZWQpOwotCi0gICAgbUdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXA7Ci0KLSAgICBtR3JvdXAtPmFkZF9idWZmZXIobmV3IE1lZGlhQnVmZmVyKGtNYXhGcmFtZVNpemUpKTsKLQotICAgIG1DdXJyZW50UG9zID0gbUZpcnN0RnJhbWVQb3M7Ci0gICAgbUN1cnJlbnRUaW1lVXMgPSAwOwotCi0gICAgbUJhc2lzVGltZVVzID0gbUN1cnJlbnRUaW1lVXM7Ci0gICAgbVNhbXBsZXNSZWFkID0gMDsKLQotICAgIG1TdGFydGVkID0gdHJ1ZTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTVAzU291cmNlOjpzdG9wKCkgewotICAgIENIRUNLKG1TdGFydGVkKTsKLQotICAgIGRlbGV0ZSBtR3JvdXA7Ci0gICAgbUdyb3VwID0gTlVMTDsKLQotICAgIG1TdGFydGVkID0gZmFsc2U7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXNwPE1ldGFEYXRhPiBNUDNTb3VyY2U6OmdldEZvcm1hdCgpIHsKLSAgICByZXR1cm4gbU1ldGE7Ci19Ci0KLXN0YXR1c190IE1QM1NvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7Ci0gICAgKm91dCA9IE5VTEw7Ci0KLSAgICBpbnQ2NF90IHNlZWtUaW1lVXM7Ci0gICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7Ci0gICAgYm9vbCBzZWVrQ0JSID0gZmFsc2U7Ci0KLSAgICBpZiAob3B0aW9ucyAhPSBOVUxMICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7Ci0gICAgICAgIGludDY0X3QgYWN0dWFsU2Vla1RpbWVVcyA9IHNlZWtUaW1lVXM7Ci0gICAgICAgIGlmIChtU2Vla2VyID09IE5VTEwKLSAgICAgICAgICAgICAgICB8fCAhbVNlZWtlci0+Z2V0T2Zmc2V0Rm9yVGltZSgmYWN0dWFsU2Vla1RpbWVVcywgJm1DdXJyZW50UG9zKSkgewotICAgICAgICAgICAgaW50MzJfdCBiaXRyYXRlOwotICAgICAgICAgICAgaWYgKCFtTWV0YS0+ZmluZEludDMyKGtLZXlCaXRSYXRlLCAmYml0cmF0ZSkpIHsKLSAgICAgICAgICAgICAgICAvLyBiaXRyYXRlIGlzIGluIGJpdHMvc2VjLgotICAgICAgICAgICAgICAgIEFMT0dJKCJubyBiaXRyYXRlIik7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1DdXJyZW50VGltZVVzID0gc2Vla1RpbWVVczsKLSAgICAgICAgICAgIG1DdXJyZW50UG9zID0gbUZpcnN0RnJhbWVQb3MgKyBzZWVrVGltZVVzICogYml0cmF0ZSAvIDgwMDAwMDA7Ci0gICAgICAgICAgICBzZWVrQ0JSID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1DdXJyZW50VGltZVVzID0gYWN0dWFsU2Vla1RpbWVVczsKLSAgICAgICAgfQotCi0gICAgICAgIG1CYXNpc1RpbWVVcyA9IG1DdXJyZW50VGltZVVzOwotICAgICAgICBtU2FtcGxlc1JlYWQgPSAwOwotICAgIH0KLQotICAgIE1lZGlhQnVmZmVyICpidWZmZXI7Ci0gICAgc3RhdHVzX3QgZXJyID0gbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgc2l6ZV90IGZyYW1lX3NpemU7Ci0gICAgaW50IGJpdHJhdGU7Ci0gICAgaW50IG51bV9zYW1wbGVzOwotICAgIGludCBzYW1wbGVfcmF0ZTsKLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIHNzaXplX3QgbiA9IG1EYXRhU291cmNlLT5yZWFkQXQobUN1cnJlbnRQb3MsIGJ1ZmZlci0+ZGF0YSgpLCA0KTsKLSAgICAgICAgaWYgKG4gPCA0KSB7Ci0gICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIGJ1ZmZlciA9IE5VTEw7Ci0KLSAgICAgICAgICAgIHJldHVybiAobiA8IDAgPyBuIDogRVJST1JfRU5EX09GX1NUUkVBTSk7Ci0gICAgICAgIH0KLQotICAgICAgICB1aW50MzJfdCBoZWFkZXIgPSBVMzJfQVQoKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSk7Ci0KLSAgICAgICAgaWYgKChoZWFkZXIgJiBrTWFzaykgPT0gKG1GaXhlZEhlYWRlciAmIGtNYXNrKQotICAgICAgICAgICAgJiYgR2V0TVBFR0F1ZGlvRnJhbWVTaXplKAotICAgICAgICAgICAgICAgIGhlYWRlciwgJmZyYW1lX3NpemUsICZzYW1wbGVfcmF0ZSwgTlVMTCwKLSAgICAgICAgICAgICAgICAmYml0cmF0ZSwgJm51bV9zYW1wbGVzKSkgewotCi0gICAgICAgICAgICAvLyByZS1jYWxjdWxhdGUgbUN1cnJlbnRUaW1lVXMgYmVjYXVzZSB3ZSBtaWdodCBoYXZlIGNhbGxlZCBSZXN5bmMoKQotICAgICAgICAgICAgaWYgKHNlZWtDQlIpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudFRpbWVVcyA9IChtQ3VycmVudFBvcyAtIG1GaXJzdEZyYW1lUG9zKSAqIDgwMDAgLyBiaXRyYXRlOwotICAgICAgICAgICAgICAgIG1CYXNpc1RpbWVVcyA9IG1DdXJyZW50VGltZVVzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIExvc3Qgc3luYy4KLSAgICAgICAgQUxPR1YoImxvc3Qgc3luYyEgaGVhZGVyID0gMHglMDh4LCBvbGQgaGVhZGVyID0gMHglMDh4XG4iLCBoZWFkZXIsIG1GaXhlZEhlYWRlcik7Ci0KLSAgICAgICAgb2ZmNjRfdCBwb3MgPSBtQ3VycmVudFBvczsKLSAgICAgICAgaWYgKCFSZXN5bmMobURhdGFTb3VyY2UsIG1GaXhlZEhlYWRlciwgJnBvcywgTlVMTCwgTlVMTCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gcmVzeW5jLiBTaWduYWxsaW5nIGVuZCBvZiBzdHJlYW0uIik7Ci0KLSAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKLQotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07Ci0gICAgICAgIH0KLQotICAgICAgICBtQ3VycmVudFBvcyA9IHBvczsKLQotICAgICAgICAvLyBUcnkgYWdhaW4gd2l0aCB0aGUgbmV3IHBvc2l0aW9uLgotICAgIH0KLQotICAgIENIRUNLKGZyYW1lX3NpemUgPD0gYnVmZmVyLT5zaXplKCkpOwotCi0gICAgc3NpemVfdCBuID0gbURhdGFTb3VyY2UtPnJlYWRBdChtQ3VycmVudFBvcywgYnVmZmVyLT5kYXRhKCksIGZyYW1lX3NpemUpOwotICAgIGlmIChuIDwgKHNzaXplX3QpZnJhbWVfc2l6ZSkgewotICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgYnVmZmVyID0gTlVMTDsKLQotICAgICAgICByZXR1cm4gKG4gPCAwID8gbiA6IEVSUk9SX0VORF9PRl9TVFJFQU0pOwotICAgIH0KLQotICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIGZyYW1lX3NpemUpOwotCi0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIG1DdXJyZW50VGltZVVzKTsKLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOwotCi0gICAgbUN1cnJlbnRQb3MgKz0gZnJhbWVfc2l6ZTsKLQotICAgIG1TYW1wbGVzUmVhZCArPSBudW1fc2FtcGxlczsKLSAgICBtQ3VycmVudFRpbWVVcyA9IG1CYXNpc1RpbWVVcyArICgobVNhbXBsZXNSZWFkICogMTAwMDAwMCkgLyBzYW1wbGVfcmF0ZSk7Ci0KLSAgICAqb3V0ID0gYnVmZmVyOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zcDxNZXRhRGF0YT4gTVAzRXh0cmFjdG9yOjpnZXRNZXRhRGF0YSgpIHsKLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKLQotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBtZXRhOwotICAgIH0KLQotICAgIG1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCAiYXVkaW8vbXBlZyIpOwotCi0gICAgSUQzIGlkMyhtRGF0YVNvdXJjZSk7Ci0KLSAgICBpZiAoIWlkMy5pc1ZhbGlkKCkpIHsKLSAgICAgICAgcmV0dXJuIG1ldGE7Ci0gICAgfQotCi0gICAgc3RydWN0IE1hcCB7Ci0gICAgICAgIGludCBrZXk7Ci0gICAgICAgIGNvbnN0IGNoYXIgKnRhZzE7Ci0gICAgICAgIGNvbnN0IGNoYXIgKnRhZzI7Ci0gICAgfTsKLSAgICBzdGF0aWMgY29uc3QgTWFwIGtNYXBbXSA9IHsKLSAgICAgICAgeyBrS2V5QWxidW0sICJUQUxCIiwgIlRBTCIgfSwKLSAgICAgICAgeyBrS2V5QXJ0aXN0LCAiVFBFMSIsICJUUDEiIH0sCi0gICAgICAgIHsga0tleUFsYnVtQXJ0aXN0LCAiVFBFMiIsICJUUDIiIH0sCi0gICAgICAgIHsga0tleUNvbXBvc2VyLCAiVENPTSIsICJUQ00iIH0sCi0gICAgICAgIHsga0tleUdlbnJlLCAiVENPTiIsICJUQ08iIH0sCi0gICAgICAgIHsga0tleVRpdGxlLCAiVElUMiIsICJUVDIiIH0sCi0gICAgICAgIHsga0tleVllYXIsICJUWUUiLCAiVFlFUiIgfSwKLSAgICAgICAgeyBrS2V5QXV0aG9yLCAiVFhUIiwgIlRFWFQiIH0sCi0gICAgICAgIHsga0tleUNEVHJhY2tOdW1iZXIsICJUUksiLCAiVFJDSyIgfSwKLSAgICAgICAgeyBrS2V5RGlzY051bWJlciwgIlRQQSIsICJUUE9TIiB9LAotICAgICAgICB7IGtLZXlDb21waWxhdGlvbiwgIlRDUCIsICJUQ01QIiB9LAotICAgIH07Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTnVtTWFwRW50cmllcyA9IHNpemVvZihrTWFwKSAvIHNpemVvZihrTWFwWzBdKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bU1hcEVudHJpZXM7ICsraSkgewotICAgICAgICBJRDM6Okl0ZXJhdG9yICppdCA9IG5ldyBJRDM6Okl0ZXJhdG9yKGlkMywga01hcFtpXS50YWcxKTsKLSAgICAgICAgaWYgKGl0LT5kb25lKCkpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBpdDsKLSAgICAgICAgICAgIGl0ID0gbmV3IElEMzo6SXRlcmF0b3IoaWQzLCBrTWFwW2ldLnRhZzIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGl0LT5kb25lKCkpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBpdDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nOCBzOwotICAgICAgICBpdC0+Z2V0U3RyaW5nKCZzKTsKLSAgICAgICAgZGVsZXRlIGl0OwotCi0gICAgICAgIG1ldGEtPnNldENTdHJpbmcoa01hcFtpXS5rZXksIHMpOwotICAgIH0KLQotICAgIHNpemVfdCBkYXRhU2l6ZTsKLSAgICBTdHJpbmc4IG1pbWU7Ci0gICAgY29uc3Qgdm9pZCAqZGF0YSA9IGlkMy5nZXRBbGJ1bUFydCgmZGF0YVNpemUsICZtaW1lKTsKLQotICAgIGlmIChkYXRhKSB7Ci0gICAgICAgIG1ldGEtPnNldERhdGEoa0tleUFsYnVtQXJ0LCBNZXRhRGF0YTo6VFlQRV9OT05FLCBkYXRhLCBkYXRhU2l6ZSk7Ci0gICAgICAgIG1ldGEtPnNldENTdHJpbmcoa0tleUFsYnVtQXJ0TUlNRSwgbWltZS5zdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1ldGE7Ci19Ci0KLWJvb2wgU25pZmZNUDMoCi0gICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLAotICAgICAgICBmbG9hdCAqY29uZmlkZW5jZSwgc3A8QU1lc3NhZ2U+ICptZXRhKSB7Ci0gICAgb2ZmNjRfdCBwb3MgPSAwOwotICAgIG9mZjY0X3QgcG9zdF9pZDNfcG9zOwotICAgIHVpbnQzMl90IGhlYWRlcjsKLSAgICBpZiAoIVJlc3luYyhzb3VyY2UsIDAsICZwb3MsICZwb3N0X2lkM19wb3MsICZoZWFkZXIpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAqbWV0YSA9IG5ldyBBTWVzc2FnZTsKLSAgICAoKm1ldGEpLT5zZXRJbnQ2NCgib2Zmc2V0IiwgcG9zKTsKLSAgICAoKm1ldGEpLT5zZXRJbnQzMigiaGVhZGVyIiwgaGVhZGVyKTsKLSAgICAoKm1ldGEpLT5zZXRJbnQ2NCgicG9zdC1pZDMtb2Zmc2V0IiwgcG9zdF9pZDNfcG9zKTsKLQotICAgICptaW1lVHlwZSA9IE1FRElBX01JTUVUWVBFX0FVRElPX01QRUc7Ci0gICAgKmNvbmZpZGVuY2UgPSAwLjJmOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHMlRTV3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUcyVFNXcml0ZXIuY3BwCmluZGV4IDAzZWE5NTkuLjc3MDUzNWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUcyVFNXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUcyVFNXcml0ZXIuY3BwCkBAIC0xNiwxOCArMTYsMTggQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJNUEVHMlRTV3JpdGVyIgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzJUU1dyaXRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KIAogI2luY2x1ZGUgImluY2x1ZGUvRVNEUy5oIgpAQCAtMzUsNyArMzUsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgTVBFRzJUU1dyaXRlcjo6U291cmNlSW5mbyA6IHB1YmxpYyBBSGFuZGxlciB7Ci0gICAgZXhwbGljaXQgU291cmNlSW5mbyhjb25zdCBzcDxJTWVkaWFTb3VyY2U+ICZzb3VyY2UpOworICAgIGV4cGxpY2l0IFNvdXJjZUluZm8oY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpOwogCiAgICAgdm9pZCBzdGFydChjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgY29uc3Qgc3A8TWV0YURhdGE+ICZwYXJhbXMpOwogICAgIHZvaWQgc3RvcCgpOwpAQCAtNjksNyArNjksNyBAQAogICAgICAgICBrV2hhdFJlYWQgID0gJ3JlYWQnLAogICAgIH07CiAKLSAgICBzcDxJTWVkaWFTb3VyY2U+IG1Tb3VyY2U7CisgICAgc3A8TWVkaWFTb3VyY2U+IG1Tb3VyY2U7CiAgICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKICAgICBzcDxBTWVzc2FnZT4gbU5vdGlmeTsKIApAQCAtODUsMTMgKzg1LDEzIEBACiAKICAgICB2b2lkIGV4dHJhY3RDb2RlY1NwZWNpZmljRGF0YSgpOwogCi0gICAgdm9pZCBhcHBlbmRBQUNGcmFtZXMoTWVkaWFCdWZmZXIgKmJ1ZmZlcik7Ci0gICAgdm9pZCBhcHBlbmRBVkNGcmFtZShNZWRpYUJ1ZmZlciAqYnVmZmVyKTsKKyAgICB2b2lkIGFwcGVuZEFBQ0ZyYW1lcyhNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcik7CisgICAgdm9pZCBhcHBlbmRBVkNGcmFtZShNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcik7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTb3VyY2VJbmZvKTsKIH07CiAKLU1QRUcyVFNXcml0ZXI6OlNvdXJjZUluZm86OlNvdXJjZUluZm8oY29uc3Qgc3A8SU1lZGlhU291cmNlPiAmc291cmNlKQorTVBFRzJUU1dyaXRlcjo6U291cmNlSW5mbzo6U291cmNlSW5mbyhjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSkKICAgICA6IG1Tb3VyY2Uoc291cmNlKSwKICAgICAgIG1Mb29wZXIobmV3IEFMb29wZXIpLAogICAgICAgbUVPU1JlY2VpdmVkKGZhbHNlKSwKQEAgLTI0OSw3ICsyNDksNyBAQAogICAgIG5vdGlmeS0+cG9zdCgpOwogfQogCi12b2lkIE1QRUcyVFNXcml0ZXI6OlNvdXJjZUluZm86OmFwcGVuZEFWQ0ZyYW1lKE1lZGlhQnVmZmVyICpidWZmZXIpIHsKK3ZvaWQgTVBFRzJUU1dyaXRlcjo6U291cmNlSW5mbzo6YXBwZW5kQVZDRnJhbWUoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpIHsKICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CiAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtOb3RpZnlCdWZmZXIpOwogCkBAIC0yNjQsMTEgKzI2NCwxMSBAQAogICAgICAgICAgICBidWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKIAogICAgIGludDY0X3QgdGltZVVzOwotICAgIENIRUNLKGJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOworICAgIENIRUNLKGJ1ZmZlci0+bWV0YV9kYXRhKCkuZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7CiAgICAgbUJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKIAogICAgIGludDMyX3QgaXNTeW5jOwotICAgIGlmIChidWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50MzIoa0tleUlzU3luY0ZyYW1lLCAmaXNTeW5jKQorICAgIGlmIChidWZmZXItPm1ldGFfZGF0YSgpLmZpbmRJbnQzMihrS2V5SXNTeW5jRnJhbWUsICZpc1N5bmMpCiAgICAgICAgICAgICAmJiBpc1N5bmMgIT0gMCkgewogICAgICAgICBtQnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJpc1N5bmMiLCB0cnVlKTsKICAgICB9CkBAIC0yNzksNyArMjc5LDcgQEAKICAgICBub3RpZnktPnBvc3QoKTsKIH0KIAotdm9pZCBNUEVHMlRTV3JpdGVyOjpTb3VyY2VJbmZvOjphcHBlbmRBQUNGcmFtZXMoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgewordm9pZCBNUEVHMlRTV3JpdGVyOjpTb3VyY2VJbmZvOjphcHBlbmRBQUNGcmFtZXMoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpIHsKICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CiAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtOb3RpZnlCdWZmZXIpOwogCkBAIC0yODgsNyArMjg4LDcgQEAKICAgICB9CiAKICAgICBpbnQ2NF90IHRpbWVVczsKLSAgICBDSEVDSyhidWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKKyAgICBDSEVDSyhidWZmZXItPm1ldGFfZGF0YSgpLmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOwogCiAgICAgbUJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKICAgICBtQnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJpc1N5bmMiLCB0cnVlKTsKQEAgLTM2OCw3ICszNjgsNyBAQAogCiAgICAgICAgIGNhc2Uga1doYXRSZWFkOgogICAgICAgICB7Ci0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyOworICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXI7CiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5yZWFkKCZidWZmZXIpOwogCiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LICYmIGVyciAhPSBJTkZPX0ZPUk1BVF9DSEFOR0VEKSB7CkBAIC00OTksNyArNDk5LDcgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IE1QRUcyVFNXcml0ZXI6OmFkZFNvdXJjZShjb25zdCBzcDxJTWVkaWFTb3VyY2U+ICZzb3VyY2UpIHsKK3N0YXR1c190IE1QRUcyVFNXcml0ZXI6OmFkZFNvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSkgewogICAgIENIRUNLKCFtU3RhcnRlZCk7CiAKICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IHNvdXJjZS0+Z2V0Rm9ybWF0KCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNEV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNEV4dHJhY3Rvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNzc3YjMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRFeHRyYWN0b3IuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTQ0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJNUEVHNEV4dHJhY3RvciIKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgImluY2x1ZGUvTVBFRzRFeHRyYWN0b3IuaCIKLSNpbmNsdWRlICJpbmNsdWRlL1NhbXBsZVRhYmxlLmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9JdGVtVGFibGUuaCIKLSNpbmNsdWRlICJpbmNsdWRlL0VTRFMuaCIKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotI2luY2x1ZGUgPGJ5dGVzd2FwLmg+Ci0jaW5jbHVkZSAiaW5jbHVkZS9JRDMuaCIKLSNpbmNsdWRlICJpbmNsdWRlL2F2Y191dGlscy5oIgotCi0jaWZuZGVmIFVJTlQzMl9NQVgKLSNkZWZpbmUgVUlOVDMyX01BWCAgICAgICAoNDI5NDk2NzI5NVUpCi0jZW5kaWYKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1lbnVtIHsKLSAgICAvLyBtYXggdHJhY2sgaGVhZGVyIGNodW5rIHRvIHJldHVybgotICAgIGtNYXhUcmFja0hlYWRlclNpemUgPSAzMiwKLQotICAgIC8vIG1heGltdW0gc2l6ZSBvZiBhbiBhdG9tLiBTb21lIGF0b21zIGNhbiBiZSBiaWdnZXIgYWNjb3JkaW5nIHRvIHRoZSBzcGVjLAotICAgIC8vIGJ1dCB3ZSBvbmx5IGFsbG93IHVwIHRvIHRoaXMgc2l6ZS4KLSAgICBrTWF4QXRvbVNpemUgPSA2NCAqIDEwMjQgKiAxMDI0LAotfTsKLQotY2xhc3MgTVBFRzRTb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UgewotcHVibGljOgotICAgIC8vIENhbGxlciByZXRhaW5zIG93bmVyc2hpcCBvZiBib3RoICJkYXRhU291cmNlIiBhbmQgInNhbXBsZVRhYmxlIi4KLSAgICBNUEVHNFNvdXJjZShjb25zdCBzcDxNUEVHNEV4dHJhY3Rvcj4gJm93bmVyLAotICAgICAgICAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmZm9ybWF0LAotICAgICAgICAgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZkYXRhU291cmNlLAotICAgICAgICAgICAgICAgIGludDMyX3QgdGltZVNjYWxlLAotICAgICAgICAgICAgICAgIGNvbnN0IHNwPFNhbXBsZVRhYmxlPiAmc2FtcGxlVGFibGUsCi0gICAgICAgICAgICAgICAgVmVjdG9yPFNpZHhFbnRyeT4gJnNpZHgsCi0gICAgICAgICAgICAgICAgY29uc3QgVHJleCAqdHJleCwKLSAgICAgICAgICAgICAgICBvZmY2NF90IGZpcnN0TW9vZk9mZnNldCwKLSAgICAgICAgICAgICAgICBjb25zdCBzcDxJdGVtVGFibGU+ICZpdGVtVGFibGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdCgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0KLSAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZChNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKLSAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydE5vbmJsb2NraW5nUmVhZCgpIHsgcmV0dXJuIHRydWU7IH0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGZyYWdtZW50ZWRSZWFkKE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+TVBFRzRTb3VyY2UoKTsKLQotcHJpdmF0ZToKLSAgICBNdXRleCBtTG9jazsKLQotICAgIC8vIGtlZXAgdGhlIE1QRUc0RXh0cmFjdG9yIGFyb3VuZCwgc2luY2Ugd2UncmUgcmVmZXJlbmNpbmcgaXRzIGRhdGEKLSAgICBzcDxNUEVHNEV4dHJhY3Rvcj4gbU93bmVyOwotICAgIHNwPE1ldGFEYXRhPiBtRm9ybWF0OwotICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOwotICAgIGludDMyX3QgbVRpbWVzY2FsZTsKLSAgICBzcDxTYW1wbGVUYWJsZT4gbVNhbXBsZVRhYmxlOwotICAgIHVpbnQzMl90IG1DdXJyZW50U2FtcGxlSW5kZXg7Ci0gICAgdWludDMyX3QgbUN1cnJlbnRGcmFnbWVudEluZGV4OwotICAgIFZlY3RvcjxTaWR4RW50cnk+ICZtU2VnbWVudHM7Ci0gICAgY29uc3QgVHJleCAqbVRyZXg7Ci0gICAgb2ZmNjRfdCBtRmlyc3RNb29mT2Zmc2V0OwotICAgIG9mZjY0X3QgbUN1cnJlbnRNb29mT2Zmc2V0OwotICAgIG9mZjY0X3QgbU5leHRNb29mT2Zmc2V0OwotICAgIHVpbnQzMl90IG1DdXJyZW50VGltZTsKLSAgICBpbnQzMl90IG1MYXN0UGFyc2VkVHJhY2tJZDsKLSAgICBpbnQzMl90IG1UcmFja0lkOwotCi0gICAgaW50MzJfdCBtQ3J5cHRvTW9kZTsgICAgLy8gcGFzc2VkIGluIGZyb20gZXh0cmFjdG9yCi0gICAgaW50MzJfdCBtRGVmYXVsdElWU2l6ZTsgLy8gcGFzc2VkIGluIGZyb20gZXh0cmFjdG9yCi0gICAgdWludDhfdCBtQ3J5cHRvS2V5WzE2XTsgLy8gcGFzc2VkIGluIGZyb20gZXh0cmFjdG9yCi0gICAgdWludDMyX3QgbUN1cnJlbnRBdXhJbmZvVHlwZTsKLSAgICB1aW50MzJfdCBtQ3VycmVudEF1eEluZm9UeXBlUGFyYW1ldGVyOwotICAgIGludDMyX3QgbUN1cnJlbnREZWZhdWx0U2FtcGxlSW5mb1NpemU7Ci0gICAgdWludDMyX3QgbUN1cnJlbnRTYW1wbGVJbmZvQ291bnQ7Ci0gICAgdWludDMyX3QgbUN1cnJlbnRTYW1wbGVJbmZvQWxsb2NTaXplOwotICAgIHVpbnQ4X3QqIG1DdXJyZW50U2FtcGxlSW5mb1NpemVzOwotICAgIHVpbnQzMl90IG1DdXJyZW50U2FtcGxlSW5mb09mZnNldENvdW50OwotICAgIHVpbnQzMl90IG1DdXJyZW50U2FtcGxlSW5mb09mZnNldHNBbGxvY1NpemU7Ci0gICAgdWludDY0X3QqIG1DdXJyZW50U2FtcGxlSW5mb09mZnNldHM7Ci0KLSAgICBib29sIG1Jc0FWQzsKLSAgICBib29sIG1Jc0hFVkM7Ci0gICAgc2l6ZV90IG1OQUxMZW5ndGhTaXplOwotCi0gICAgYm9vbCBtU3RhcnRlZDsKLQotICAgIE1lZGlhQnVmZmVyR3JvdXAgKm1Hcm91cDsKLQotICAgIE1lZGlhQnVmZmVyICptQnVmZmVyOwotCi0gICAgYm9vbCBtV2FudHNOQUxGcmFnbWVudHM7Ci0KLSAgICB1aW50OF90ICptU3JjQnVmZmVyOwotCi0gICAgYm9vbCBtSXNIRUlGOwotICAgIHNwPEl0ZW1UYWJsZT4gbUl0ZW1UYWJsZTsKLQotICAgIHNpemVfdCBwYXJzZU5BTFNpemUoY29uc3QgdWludDhfdCAqZGF0YSkgY29uc3Q7Ci0gICAgc3RhdHVzX3QgcGFyc2VDaHVuayhvZmY2NF90ICpvZmZzZXQpOwotICAgIHN0YXR1c190IHBhcnNlVHJhY2tGcmFnbWVudEhlYWRlcihvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBzaXplKTsKLSAgICBzdGF0dXNfdCBwYXJzZVRyYWNrRnJhZ21lbnRSdW4ob2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3Qgc2l6ZSk7Ci0gICAgc3RhdHVzX3QgcGFyc2VTYW1wbGVBdXhpbGlhcnlJbmZvcm1hdGlvblNpemVzKG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IHNpemUpOwotICAgIHN0YXR1c190IHBhcnNlU2FtcGxlQXV4aWxpYXJ5SW5mb3JtYXRpb25PZmZzZXRzKG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IHNpemUpOwotCi0gICAgc3RydWN0IFRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvIHsKLSAgICAgICAgZW51bSBGbGFncyB7Ci0gICAgICAgICAgICBrQmFzZURhdGFPZmZzZXRQcmVzZW50ICAgICAgICAgPSAweDAxLAotICAgICAgICAgICAga1NhbXBsZURlc2NyaXB0aW9uSW5kZXhQcmVzZW50ID0gMHgwMiwKLSAgICAgICAgICAgIGtEZWZhdWx0U2FtcGxlRHVyYXRpb25QcmVzZW50ICA9IDB4MDgsCi0gICAgICAgICAgICBrRGVmYXVsdFNhbXBsZVNpemVQcmVzZW50ICAgICAgPSAweDEwLAotICAgICAgICAgICAga0RlZmF1bHRTYW1wbGVGbGFnc1ByZXNlbnQgICAgID0gMHgyMCwKLSAgICAgICAgICAgIGtEdXJhdGlvbklzRW1wdHkgICAgICAgICAgICAgICA9IDB4MTAwMDAsCi0gICAgICAgIH07Ci0KLSAgICAgICAgdWludDMyX3QgbVRyYWNrSUQ7Ci0gICAgICAgIHVpbnQzMl90IG1GbGFnczsKLSAgICAgICAgdWludDY0X3QgbUJhc2VEYXRhT2Zmc2V0OwotICAgICAgICB1aW50MzJfdCBtU2FtcGxlRGVzY3JpcHRpb25JbmRleDsKLSAgICAgICAgdWludDMyX3QgbURlZmF1bHRTYW1wbGVEdXJhdGlvbjsKLSAgICAgICAgdWludDMyX3QgbURlZmF1bHRTYW1wbGVTaXplOwotICAgICAgICB1aW50MzJfdCBtRGVmYXVsdFNhbXBsZUZsYWdzOwotCi0gICAgICAgIHVpbnQ2NF90IG1EYXRhT2Zmc2V0OwotICAgIH07Ci0gICAgVHJhY2tGcmFnbWVudEhlYWRlckluZm8gbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvOwotCi0gICAgc3RydWN0IFNhbXBsZSB7Ci0gICAgICAgIG9mZjY0X3Qgb2Zmc2V0OwotICAgICAgICBzaXplX3Qgc2l6ZTsKLSAgICAgICAgdWludDMyX3QgZHVyYXRpb247Ci0gICAgICAgIGludDMyX3QgY29tcG9zaXRpb25PZmZzZXQ7Ci0gICAgICAgIHVpbnQ4X3QgaXZbMTZdOwotICAgICAgICBWZWN0b3I8c2l6ZV90PiBjbGVhcnNpemVzOwotICAgICAgICBWZWN0b3I8c2l6ZV90PiBlbmNyeXB0ZWRzaXplczsKLSAgICB9OwotICAgIFZlY3RvcjxTYW1wbGU+IG1DdXJyZW50U2FtcGxlczsKLQotICAgIE1QRUc0U291cmNlKGNvbnN0IE1QRUc0U291cmNlICYpOwotICAgIE1QRUc0U291cmNlICZvcGVyYXRvcj0oY29uc3QgTVBFRzRTb3VyY2UgJik7Ci19OwotCi0vLyBUaGlzIGN1c3RvbSBkYXRhIHNvdXJjZSB3cmFwcyBhbiBleGlzdGluZyBvbmUgYW5kIHNhdGlzZmllcyByZXF1ZXN0cwotLy8gZmFsbGluZyBlbnRpcmVseSB3aXRoaW4gYSBjYWNoZWQgcmFuZ2UgZnJvbSB0aGUgY2FjaGUgd2hpbGUgZm9yd2FyZGluZwotLy8gYWxsIHJlbWFpbmluZyByZXF1ZXN0cyB0byB0aGUgd3JhcHBlZCBkYXRhc291cmNlLgotLy8gVGhpcyBpcyB1c2VkIHRvIGNhY2hlIHRoZSBmdWxsIHNhbXBsZXRhYmxlIG1ldGFkYXRhIGZvciBhIHNpbmdsZSB0cmFjaywKLS8vIHBvc3NpYmx5IHdyYXBwaW5nIG11bHRpcGxlIHRpbWVzIHRvIGNvdmVyIGFsbCB0cmFja3MsIGkuZS4KLS8vIEVhY2ggTVBFRzREYXRhU291cmNlIGNhY2hlcyB0aGUgc2FtcGxldGFibGUgbWV0YWRhdGEgZm9yIGEgc2luZ2xlIHRyYWNrLgotCi1zdHJ1Y3QgTVBFRzREYXRhU291cmNlIDogcHVibGljIERhdGFTb3VyY2UgewotICAgIGV4cGxpY2l0IE1QRUc0RGF0YVNvdXJjZShjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKTsKLSAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCk7Ci0KLSAgICBzdGF0dXNfdCBzZXRDYWNoZWRSYW5nZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+TVBFRzREYXRhU291cmNlKCk7Ci0KLXByaXZhdGU6Ci0gICAgTXV0ZXggbUxvY2s7Ci0KLSAgICBzcDxEYXRhU291cmNlPiBtU291cmNlOwotICAgIG9mZjY0X3QgbUNhY2hlZE9mZnNldDsKLSAgICBzaXplX3QgbUNhY2hlZFNpemU7Ci0gICAgdWludDhfdCAqbUNhY2hlOwotCi0gICAgdm9pZCBjbGVhckNhY2hlKCk7Ci0KLSAgICBNUEVHNERhdGFTb3VyY2UoY29uc3QgTVBFRzREYXRhU291cmNlICYpOwotICAgIE1QRUc0RGF0YVNvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IE1QRUc0RGF0YVNvdXJjZSAmKTsKLX07Ci0KLU1QRUc0RGF0YVNvdXJjZTo6TVBFRzREYXRhU291cmNlKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UpCi0gICAgOiBtU291cmNlKHNvdXJjZSksCi0gICAgICBtQ2FjaGVkT2Zmc2V0KDApLAotICAgICAgbUNhY2hlZFNpemUoMCksCi0gICAgICBtQ2FjaGUoTlVMTCkgewotfQotCi1NUEVHNERhdGFTb3VyY2U6On5NUEVHNERhdGFTb3VyY2UoKSB7Ci0gICAgY2xlYXJDYWNoZSgpOwotfQotCi12b2lkIE1QRUc0RGF0YVNvdXJjZTo6Y2xlYXJDYWNoZSgpIHsKLSAgICBpZiAobUNhY2hlKSB7Ci0gICAgICAgIGZyZWUobUNhY2hlKTsKLSAgICAgICAgbUNhY2hlID0gTlVMTDsKLSAgICB9Ci0KLSAgICBtQ2FjaGVkT2Zmc2V0ID0gMDsKLSAgICBtQ2FjaGVkU2l6ZSA9IDA7Ci19Ci0KLXN0YXR1c190IE1QRUc0RGF0YVNvdXJjZTo6aW5pdENoZWNrKCkgY29uc3QgewotICAgIHJldHVybiBtU291cmNlLT5pbml0Q2hlY2soKTsKLX0KLQotc3NpemVfdCBNUEVHNERhdGFTb3VyY2U6OnJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKGlzSW5SYW5nZShtQ2FjaGVkT2Zmc2V0LCBtQ2FjaGVkU2l6ZSwgb2Zmc2V0LCBzaXplKSkgewotICAgICAgICBtZW1jcHkoZGF0YSwgJm1DYWNoZVtvZmZzZXQgLSBtQ2FjaGVkT2Zmc2V0XSwgc2l6ZSk7Ci0gICAgICAgIHJldHVybiBzaXplOwotICAgIH0KLQotICAgIHJldHVybiBtU291cmNlLT5yZWFkQXQob2Zmc2V0LCBkYXRhLCBzaXplKTsKLX0KLQotc3RhdHVzX3QgTVBFRzREYXRhU291cmNlOjpnZXRTaXplKG9mZjY0X3QgKnNpemUpIHsKLSAgICByZXR1cm4gbVNvdXJjZS0+Z2V0U2l6ZShzaXplKTsKLX0KLQotdWludDMyX3QgTVBFRzREYXRhU291cmNlOjpmbGFncygpIHsKLSAgICByZXR1cm4gbVNvdXJjZS0+ZmxhZ3MoKTsKLX0KLQotc3RhdHVzX3QgTVBFRzREYXRhU291cmNlOjpzZXRDYWNoZWRSYW5nZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgY2xlYXJDYWNoZSgpOwotCi0gICAgbUNhY2hlID0gKHVpbnQ4X3QgKiltYWxsb2Moc2l6ZSk7Ci0KLSAgICBpZiAobUNhY2hlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9NRU07Ci0gICAgfQotCi0gICAgbUNhY2hlZE9mZnNldCA9IG9mZnNldDsKLSAgICBtQ2FjaGVkU2l6ZSA9IHNpemU7Ci0KLSAgICBzc2l6ZV90IGVyciA9IG1Tb3VyY2UtPnJlYWRBdChtQ2FjaGVkT2Zmc2V0LCBtQ2FjaGUsIG1DYWNoZWRTaXplKTsKLQotICAgIGlmIChlcnIgPCAoc3NpemVfdClzaXplKSB7Ci0gICAgICAgIGNsZWFyQ2FjaGUoKTsKLQotICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1zdGF0aWMgY29uc3QgYm9vbCBrVXNlSGV4RHVtcCA9IGZhbHNlOwotCi1zdGF0aWMgY29uc3QgY2hhciAqRm91ckNDMk1JTUUodWludDMyX3QgZm91cmNjKSB7Ci0gICAgc3dpdGNoIChmb3VyY2MpIHsKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAncCcsICc0JywgJ2EnKToKLSAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9BVURJT19BQUM7Ci0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAnYScsICdtJywgJ3InKToKLSAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkI7Ci0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAnYScsICd3JywgJ2InKToKLSAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0I7Ci0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAncCcsICc0JywgJ3YnKToKLSAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNDsKLQotICAgICAgICBjYXNlIEZPVVJDQygncycsICcyJywgJzYnLCAnMycpOgotICAgICAgICBjYXNlIEZPVVJDQygnaCcsICcyJywgJzYnLCAnMycpOgotICAgICAgICBjYXNlIEZPVVJDQygnSCcsICcyJywgJzYnLCAnMycpOgotICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjM7Ci0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2EnLCAndicsICdjJywgJzEnKToKLSAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9WSURFT19BVkM7Ci0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2gnLCAndicsICdjJywgJzEnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2gnLCAnZScsICd2JywgJzEnKToKLSAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQ0hFQ0soISJzaG91bGQgbm90IGJlIGhlcmUuIik7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci19Ci0KLXN0YXRpYyBib29sIEFkanVzdENoYW5uZWxzQW5kUmF0ZSh1aW50MzJfdCBmb3VyY2MsIHVpbnQzMl90ICpjaGFubmVscywgdWludDMyX3QgKnJhdGUpIHsKLSAgICBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CLCBGb3VyQ0MyTUlNRShmb3VyY2MpKSkgewotICAgICAgICAvLyBBTVIgTkIgYXVkaW8gaXMgYWx3YXlzIG1vbm8sIDhrSHoKLSAgICAgICAgKmNoYW5uZWxzID0gMTsKLSAgICAgICAgKnJhdGUgPSA4MDAwOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQiwgRm91ckNDMk1JTUUoZm91cmNjKSkpIHsKLSAgICAgICAgLy8gQU1SIFdCIGF1ZGlvIGlzIGFsd2F5cyBtb25vLCAxNmtIegotICAgICAgICAqY2hhbm5lbHMgPSAxOwotICAgICAgICAqcmF0ZSA9IDE2MDAwOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1NUEVHNEV4dHJhY3Rvcjo6TVBFRzRFeHRyYWN0b3IoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSkKLSAgICA6IG1Nb29mT2Zmc2V0KDApLAotICAgICAgbU1vb2ZGb3VuZChmYWxzZSksCi0gICAgICBtTWRhdEZvdW5kKGZhbHNlKSwKLSAgICAgIG1EYXRhU291cmNlKHNvdXJjZSksCi0gICAgICBtSW5pdENoZWNrKE5PX0lOSVQpLAotICAgICAgbUhlYWRlclRpbWVzY2FsZSgwKSwKLSAgICAgIG1Jc1FUKGZhbHNlKSwKLSAgICAgIG1Jc0hFSUYoZmFsc2UpLAotICAgICAgbUZpcnN0VHJhY2soTlVMTCksCi0gICAgICBtTGFzdFRyYWNrKE5VTEwpLAotICAgICAgbUZpbGVNZXRhRGF0YShuZXcgTWV0YURhdGEpLAotICAgICAgbUZpcnN0U0lORihOVUxMKSwKLSAgICAgIG1Jc0RybShmYWxzZSkgewotfQotCi1NUEVHNEV4dHJhY3Rvcjo6fk1QRUc0RXh0cmFjdG9yKCkgewotICAgIHJlbGVhc2UoKTsKLX0KLQotdm9pZCBNUEVHNEV4dHJhY3Rvcjo6cmVsZWFzZSgpIHsKLSAgICBUcmFjayAqdHJhY2sgPSBtRmlyc3RUcmFjazsKLSAgICB3aGlsZSAodHJhY2spIHsKLSAgICAgICAgVHJhY2sgKm5leHQgPSB0cmFjay0+bmV4dDsKLQotICAgICAgICBkZWxldGUgdHJhY2s7Ci0gICAgICAgIHRyYWNrID0gbmV4dDsKLSAgICB9Ci0gICAgbUZpcnN0VHJhY2sgPSBtTGFzdFRyYWNrID0gTlVMTDsKLQotICAgIFNJTkYgKnNpbmYgPSBtRmlyc3RTSU5GOwotICAgIHdoaWxlIChzaW5mKSB7Ci0gICAgICAgIFNJTkYgKm5leHQgPSBzaW5mLT5uZXh0OwotICAgICAgICBkZWxldGVbXSBzaW5mLT5JUE1QRGF0YTsKLSAgICAgICAgZGVsZXRlIHNpbmY7Ci0gICAgICAgIHNpbmYgPSBuZXh0OwotICAgIH0KLSAgICBtRmlyc3RTSU5GID0gTlVMTDsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBzc2guc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgZGVsZXRlIFtdIG1Qc3NoW2ldLmRhdGE7Ci0gICAgfQotICAgIG1Qc3NoLmNsZWFyKCk7Ci0KLSAgICBpZiAobURhdGFTb3VyY2UgIT0gTlVMTCkgewotICAgICAgICBtRGF0YVNvdXJjZS0+Y2xvc2UoKTsKLSAgICAgICAgbURhdGFTb3VyY2UuY2xlYXIoKTsKLSAgICB9Ci19Ci0KLXVpbnQzMl90IE1QRUc0RXh0cmFjdG9yOjpmbGFncygpIGNvbnN0IHsKLSAgICByZXR1cm4gQ0FOX1BBVVNFIHwKLSAgICAgICAgICAgICgobU1vb2ZPZmZzZXQgPT0gMCB8fCBtU2lkeEVudHJpZXMuc2l6ZSgpICE9IDApID8KLSAgICAgICAgICAgICAgICAgICAgKENBTl9TRUVLX0JBQ0tXQVJEIHwgQ0FOX1NFRUtfRk9SV0FSRCB8IENBTl9TRUVLKSA6IDApOwotfQotCi1zcDxNZXRhRGF0YT4gTVBFRzRFeHRyYWN0b3I6OmdldE1ldGFEYXRhKCkgewotICAgIHN0YXR1c190IGVycjsKLSAgICBpZiAoKGVyciA9IHJlYWRNZXRhRGF0YSgpKSAhPSBPSykgewotICAgICAgICByZXR1cm4gbmV3IE1ldGFEYXRhOwotICAgIH0KLQotICAgIHJldHVybiBtRmlsZU1ldGFEYXRhOwotfQotCi1zaXplX3QgTVBFRzRFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewotICAgIHN0YXR1c190IGVycjsKLSAgICBpZiAoKGVyciA9IHJlYWRNZXRhRGF0YSgpKSAhPSBPSykgewotICAgICAgICBBTE9HVigiTVBFRzRFeHRyYWN0b3I6OmNvdW50VHJhY2tzOiBubyB0cmFja3MiKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgc2l6ZV90IG4gPSAwOwotICAgIFRyYWNrICp0cmFjayA9IG1GaXJzdFRyYWNrOwotICAgIHdoaWxlICh0cmFjaykgewotICAgICAgICArK247Ci0gICAgICAgIHRyYWNrID0gdHJhY2stPm5leHQ7Ci0gICAgfQotCi0gICAgQUxPR1YoIk1QRUc0RXh0cmFjdG9yOjpjb3VudFRyYWNrczogJXp1IHRyYWNrcyIsIG4pOwotICAgIHJldHVybiBuOwotfQotCi1zcDxNZXRhRGF0YT4gTVBFRzRFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpIHsKLSAgICBzdGF0dXNfdCBlcnI7Ci0gICAgaWYgKChlcnIgPSByZWFkTWV0YURhdGEoKSkgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgVHJhY2sgKnRyYWNrID0gbUZpcnN0VHJhY2s7Ci0gICAgd2hpbGUgKGluZGV4ID4gMCkgewotICAgICAgICBpZiAodHJhY2sgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICB0cmFjayA9IHRyYWNrLT5uZXh0OwotICAgICAgICAtLWluZGV4OwotICAgIH0KLQotICAgIGlmICh0cmFjayA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGlmICgoZmxhZ3MgJiBrSW5jbHVkZUV4dGVuc2l2ZU1ldGFEYXRhKQotICAgICAgICAgICAgJiYgIXRyYWNrLT5pbmNsdWRlc19leHBlbnNpdmVfbWV0YWRhdGEpIHsKLSAgICAgICAgdHJhY2stPmluY2x1ZGVzX2V4cGVuc2l2ZV9tZXRhZGF0YSA9IHRydWU7Ci0KLSAgICAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICAgICAgQ0hFQ0sodHJhY2stPm1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKLSAgICAgICAgaWYgKCFzdHJuY2FzZWNtcCgidmlkZW8vIiwgbWltZSwgNikpIHsKLSAgICAgICAgICAgIC8vIE1QRUcyIHRyYWNrcyBkbyBub3QgcHJvdmlkZSBDU0QsIHNvIHJlYWQgdGhlIHN0cmVhbSBoZWFkZXIKLSAgICAgICAgICAgIGlmICghc3RyY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyKSkgewotICAgICAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0OwotICAgICAgICAgICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICAgICAgICAgIGlmICh0cmFjay0+c2FtcGxlVGFibGUtPmdldE1ldGFEYXRhRm9yU2FtcGxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogc2FtcGxlSW5kZXggKi8sICZvZmZzZXQsICZzaXplLCBOVUxMIC8qIHNhbXBsZVRpbWUgKi8pID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzaXplID4ga01heFRyYWNrSGVhZGVyU2l6ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGtNYXhUcmFja0hlYWRlclNpemU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdWludDhfdCBoZWFkZXJba01heFRyYWNrSGVhZGVyU2l6ZV07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgJmhlYWRlciwgc2l6ZSkgPT0gKHNzaXplX3Qpc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1ldGEtPnNldERhdGEoa0tleVN0cmVhbUhlYWRlciwgJ21kYXQnLCBoZWFkZXIsIHNpemUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobU1vb2ZPZmZzZXQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvbjsKLSAgICAgICAgICAgICAgICBpZiAodHJhY2stPm1ldGEtPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZyBmYW5jeSwganVzdCBwaWNrIGEgZnJhbWUgbmVhciAxLzR0aCBvZiB0aGUgZHVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1ldGEtPnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlUaHVtYm5haWxUaW1lLCBkdXJhdGlvbiAvIDQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlSW5kZXg7Ci0gICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlVGltZTsKLSAgICAgICAgICAgICAgICBpZiAodHJhY2stPnRpbWVzY2FsZSAhPSAwICYmCi0gICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+c2FtcGxlVGFibGUtPmZpbmRUaHVtYm5haWxTYW1wbGUoJnNhbXBsZUluZGV4KSA9PSBPSwotICAgICAgICAgICAgICAgICAgICAgICAgJiYgdHJhY2stPnNhbXBsZVRhYmxlLT5nZXRNZXRhRGF0YUZvclNhbXBsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVJbmRleCwgTlVMTCAvKiBvZmZzZXQgKi8sIE5VTEwgLyogc2l6ZSAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlVGltZSkgPT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1ldGEtPnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlUaHVtYm5haWxUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW50NjRfdClzYW1wbGVUaW1lICogMTAwMDAwMCkgLyB0cmFjay0+dGltZXNjYWxlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gdHJhY2stPm1ldGE7Ci19Ci0KLXN0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpyZWFkTWV0YURhdGEoKSB7Ci0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gTk9fSU5JVCkgewotICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKLSAgICB9Ci0KLSAgICBvZmY2NF90IG9mZnNldCA9IDA7Ci0gICAgc3RhdHVzX3QgZXJyOwotICAgIGJvb2wgc2F3TW9vdk9yU2lkeCA9IGZhbHNlOwotCi0gICAgd2hpbGUgKCEoKHNhd01vb3ZPclNpZHggJiYgKG1NZGF0Rm91bmQgfHwgbU1vb2ZGb3VuZCkpIHx8Ci0gICAgICAgICAgICAobUlzSEVJRiAmJiAobUl0ZW1UYWJsZSAhPSBOVUxMKSAmJiBtSXRlbVRhYmxlLT5pc1ZhbGlkKCkpKSkgewotICAgICAgICBvZmY2NF90IG9yaWdfb2Zmc2V0ID0gb2Zmc2V0OwotICAgICAgICBlcnIgPSBwYXJzZUNodW5rKCZvZmZzZXQsIDApOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0sgJiYgZXJyICE9IFVOS05PV05fRVJST1IpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9IGVsc2UgaWYgKG9mZnNldCA8PSBvcmlnX29mZnNldCkgewotICAgICAgICAgICAgLy8gb25seSBjb250aW51ZSBwYXJzaW5nIGlmIHRoZSBvZmZzZXQgd2FzIGFkdmFuY2VkLAotICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIHdlIG1pZ2h0IGVuZCB1cCBpbiBhbiBpbmZpbml0ZSBsb29wCi0gICAgICAgICAgICBBTE9HRSgiZGlkIG5vdCBhZHZhbmNlOiAlbGxkLT4lbGxkIiwgKGxvbmcgbG9uZylvcmlnX29mZnNldCwgKGxvbmcgbG9uZylvZmZzZXQpOwotICAgICAgICAgICAgZXJyID0gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gZWxzZSBpZiAoZXJyID09IFVOS05PV05fRVJST1IpIHsKLSAgICAgICAgICAgIHNhd01vb3ZPclNpZHggPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG1Jbml0Q2hlY2sgPT0gT0spIHsKLSAgICAgICAgaWYgKGZpbmRUcmFja0J5TWltZVByZWZpeCgidmlkZW8vIikgIT0gTlVMTCkgewotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS0+c2V0Q1N0cmluZygKLSAgICAgICAgICAgICAgICAgICAga0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzQpOwotICAgICAgICB9IGVsc2UgaWYgKGZpbmRUcmFja0J5TWltZVByZWZpeCgiYXVkaW8vIikgIT0gTlVMTCkgewotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsICJhdWRpby9tcDQiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBtSW5pdENoZWNrID0gZXJyOwotICAgIH0KLQotICAgIENIRUNLX05FKGVyciwgKHN0YXR1c190KU5PX0lOSVQpOwotCi0gICAgLy8gY29weSBwc3NoIGRhdGEgaW50byBmaWxlIG1ldGFkYXRhCi0gICAgdWludDY0X3QgcHNzaHNpemUgPSAwOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBzc2guc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgcHNzaHNpemUgKz0gMjAgKyBtUHNzaFtpXS5kYXRhbGVuOwotICAgIH0KLSAgICBpZiAocHNzaHNpemUgPiAwICYmIHBzc2hzaXplIDw9IFVJTlQzMl9NQVgpIHsKLSAgICAgICAgY2hhciAqYnVmID0gKGNoYXIqKW1hbGxvYyhwc3Noc2l6ZSk7Ci0gICAgICAgIGlmICghYnVmKSB7Ci0gICAgICAgICAgICBBTE9HRSgiYi8yODQ3MTIwNiIpOwotICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgfQotICAgICAgICBjaGFyICpwdHIgPSBidWY7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBzc2guc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIG1lbWNweShwdHIsIG1Qc3NoW2ldLnV1aWQsIDIwKTsgLy8gdXVpZCArIGxlbmd0aAotICAgICAgICAgICAgbWVtY3B5KHB0ciArIDIwLCBtUHNzaFtpXS5kYXRhLCBtUHNzaFtpXS5kYXRhbGVuKTsKLSAgICAgICAgICAgIHB0ciArPSAoMjAgKyBtUHNzaFtpXS5kYXRhbGVuKTsKLSAgICAgICAgfQotICAgICAgICBtRmlsZU1ldGFEYXRhLT5zZXREYXRhKGtLZXlQc3NoLCAncHNzaCcsIGJ1ZiwgcHNzaHNpemUpOwotICAgICAgICBmcmVlKGJ1Zik7Ci0gICAgfQotCi0gICAgaWYgKG1Jc0hFSUYpIHsKLSAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtSXRlbVRhYmxlLT5nZXRJbWFnZU1ldGEoKTsKLSAgICAgICAgaWYgKG1ldGEgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIFRyYWNrICp0cmFjayA9IG1MYXN0VHJhY2s7Ci0gICAgICAgIGlmICh0cmFjayAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HVygidHJhY2sgaXMgc2V0IGJlZm9yZSBtZXRhZGF0YSBpcyBmdWxseSBwcm9jZXNzZWQiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRyYWNrID0gbmV3IFRyYWNrOwotICAgICAgICAgICAgdHJhY2stPm5leHQgPSBOVUxMOwotICAgICAgICAgICAgbUZpcnN0VHJhY2sgPSBtTGFzdFRyYWNrID0gdHJhY2s7Ci0gICAgICAgIH0KLQotICAgICAgICB0cmFjay0+bWV0YSA9IG1ldGE7Ci0gICAgICAgIHRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5VHJhY2tJRCwgMCk7Ci0gICAgICAgIHRyYWNrLT5pbmNsdWRlc19leHBlbnNpdmVfbWV0YWRhdGEgPSBmYWxzZTsKLSAgICAgICAgdHJhY2stPnNraXBUcmFjayA9IGZhbHNlOwotICAgICAgICB0cmFjay0+dGltZXNjYWxlID0gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gbUluaXRDaGVjazsKLX0KLQotY2hhciogTVBFRzRFeHRyYWN0b3I6OmdldERybVRyYWNrSW5mbyhzaXplX3QgdHJhY2tJRCwgaW50ICpsZW4pIHsKLSAgICBpZiAobUZpcnN0U0lORiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIFNJTkYgKnNpbmYgPSBtRmlyc3RTSU5GOwotICAgIHdoaWxlIChzaW5mICYmICh0cmFja0lEICE9IHNpbmYtPnRyYWNrSUQpKSB7Ci0gICAgICAgIHNpbmYgPSBzaW5mLT5uZXh0OwotICAgIH0KLQotICAgIGlmIChzaW5mID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgKmxlbiA9IHNpbmYtPmxlbjsKLSAgICByZXR1cm4gc2luZi0+SVBNUERhdGE7Ci19Ci0KLS8vIFJlYWRzIGFuIGVuY29kZWQgaW50ZWdlciA3IGJpdHMgYXQgYSB0aW1lIHVudGlsIGl0IGVuY291bnRlcnMgdGhlIGhpZ2ggYml0IGNsZWFyLgotc3RhdGljIGludDMyX3QgcmVhZFNpemUob2ZmNjRfdCBvZmZzZXQsCi0gICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZEYXRhU291cmNlLCB1aW50OF90ICpudW1PZkJ5dGVzKSB7Ci0gICAgdWludDMyX3Qgc2l6ZSA9IDA7Ci0gICAgdWludDhfdCBkYXRhOwotICAgIGJvb2wgbW9yZURhdGEgPSB0cnVlOwotICAgICpudW1PZkJ5dGVzID0gMDsKLQotICAgIHdoaWxlIChtb3JlRGF0YSkgewotICAgICAgICBpZiAoRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgJmRhdGEsIDEpIDwgMSkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIG9mZnNldCArKzsKLSAgICAgICAgbW9yZURhdGEgPSAoZGF0YSA+PSAxMjgpID8gdHJ1ZSA6IGZhbHNlOwotICAgICAgICBzaXplID0gKHNpemUgPDwgNykgfCAoZGF0YSAmIDB4N2YpOyAvLyBUYWtlIGxhc3QgNyBiaXRzCi0gICAgICAgICgqbnVtT2ZCeXRlcykgKys7Ci0gICAgfQotCi0gICAgcmV0dXJuIHNpemU7Ci19Ci0KLXN0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZURybVNJTkYoCi0gICAgICAgIG9mZjY0X3QgKiAvKiBvZmZzZXQgKi8sIG9mZjY0X3QgZGF0YV9vZmZzZXQpIHsKLSAgICB1aW50OF90IHVwZGF0ZUlkVGFnOwotICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0LCAmdXBkYXRlSWRUYWcsIDEpIDwgMSkgewotICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgfQotICAgIGRhdGFfb2Zmc2V0ICsrOwotCi0gICAgaWYgKDB4MDEvKk9CSkVDVF9ERVNDUklQVE9SX1VQREFURV9JRF9UQUcqLyAhPSB1cGRhdGVJZFRhZykgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHVpbnQ4X3QgbnVtT2ZCeXRlczsKLSAgICBpbnQzMl90IHNpemUgPSByZWFkU2l6ZShkYXRhX29mZnNldCwgbURhdGFTb3VyY2UsICZudW1PZkJ5dGVzKTsKLSAgICBpZiAoc2l6ZSA8IDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgIH0KLSAgICBkYXRhX29mZnNldCArPSBudW1PZkJ5dGVzOwotCi0gICAgd2hpbGUoc2l6ZSA+PSAxMSApIHsKLSAgICAgICAgdWludDhfdCBkZXNjcmlwdG9yVGFnOwotICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChkYXRhX29mZnNldCwgJmRlc2NyaXB0b3JUYWcsIDEpIDwgMSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICB9Ci0gICAgICAgIGRhdGFfb2Zmc2V0ICsrOwotCi0gICAgICAgIGlmICgweDExLypPQkpFQ1RfREVTQ1JJUFRPUl9JRF9UQUcqLyAhPSBkZXNjcmlwdG9yVGFnKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgdWludDhfdCBidWZmZXJbOF07Ci0gICAgICAgIC8vT2JqZWN0RGVzY3JpcHRvcklEIGFuZCBPYmplY3REZXNjcmlwdG9yIHVybCBmbGFnCi0gICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0LCBidWZmZXIsIDIpIDwgMikgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICB9Ci0gICAgICAgIGRhdGFfb2Zmc2V0ICs9IDI7Ci0KLSAgICAgICAgaWYgKChidWZmZXJbMV0gPj4gNSkgJiAweDAwMDEpIHsgLy91cmwgZmxhZyBpcyBzZXQKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChkYXRhX29mZnNldCwgYnVmZmVyLCA4KSA8IDgpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgfQotICAgICAgICBkYXRhX29mZnNldCArPSA4OwotCi0gICAgICAgIGlmICgoMHgwRi8qRVNfSURfUkVGX1RBRyovICE9IGJ1ZmZlclsxXSkKLSAgICAgICAgICAgICAgICB8fCAoIDB4MEEvKklQTVBfREVTQ1JJUFRPUl9QT0lOVEVSX0lEX1RBRyovICE9IGJ1ZmZlcls1XSkpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBTSU5GICpzaW5mID0gbmV3IFNJTkY7Ci0gICAgICAgIHNpbmYtPnRyYWNrSUQgPSBVMTZfQVQoJmJ1ZmZlclszXSk7Ci0gICAgICAgIHNpbmYtPklQTVBEZXNjcmlwdG9ySUQgPSBidWZmZXJbN107Ci0gICAgICAgIHNpbmYtPm5leHQgPSBtRmlyc3RTSU5GOwotICAgICAgICBtRmlyc3RTSU5GID0gc2luZjsKLQotICAgICAgICBzaXplIC09ICg4ICsgMiArIDEpOwotICAgIH0KLQotICAgIGlmIChzaXplICE9IDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChkYXRhX29mZnNldCwgJnVwZGF0ZUlkVGFnLCAxKSA8IDEpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgIH0KLSAgICBkYXRhX29mZnNldCArKzsKLQotICAgIGlmKDB4MDUvKklQTVBfREVTQ1JJUFRPUl9VUERBVEVfSURfVEFHKi8gIT0gdXBkYXRlSWRUYWcpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBzaXplID0gcmVhZFNpemUoZGF0YV9vZmZzZXQsIG1EYXRhU291cmNlLCAmbnVtT2ZCeXRlcyk7Ci0gICAgaWYgKHNpemUgPCAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICB9Ci0gICAgZGF0YV9vZmZzZXQgKz0gbnVtT2ZCeXRlczsKLQotICAgIHdoaWxlIChzaXplID4gMCkgewotICAgICAgICB1aW50OF90IHRhZzsKLSAgICAgICAgaW50MzJfdCBkYXRhTGVuOwotICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChkYXRhX29mZnNldCwgJnRhZywgMSkgPCAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgIH0KLSAgICAgICAgZGF0YV9vZmZzZXQgKys7Ci0KLSAgICAgICAgaWYgKDB4MEIvKklQTVBfREVTQ1JJUFRPUl9JRF9UQUcqLyA9PSB0YWcpIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgaWQ7Ci0gICAgICAgICAgICBkYXRhTGVuID0gcmVhZFNpemUoZGF0YV9vZmZzZXQsIG1EYXRhU291cmNlLCAmbnVtT2ZCeXRlcyk7Ci0gICAgICAgICAgICBpZiAoZGF0YUxlbiA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGFMZW4gPCA0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRhdGFfb2Zmc2V0ICs9IG51bU9mQnl0ZXM7Ci0KLSAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0LCAmaWQsIDEpIDwgMSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRhdGFfb2Zmc2V0ICsrOwotCi0gICAgICAgICAgICBTSU5GICpzaW5mID0gbUZpcnN0U0lORjsKLSAgICAgICAgICAgIHdoaWxlIChzaW5mICYmIChzaW5mLT5JUE1QRGVzY3JpcHRvcklEICE9IGlkKSkgewotICAgICAgICAgICAgICAgIHNpbmYgPSBzaW5mLT5uZXh0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNpbmYgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzaW5mLT5sZW4gPSBkYXRhTGVuIC0gMzsKLSAgICAgICAgICAgIHNpbmYtPklQTVBEYXRhID0gbmV3IChzdGQ6Om5vdGhyb3cpIGNoYXJbc2luZi0+bGVuXTsKLSAgICAgICAgICAgIGlmIChzaW5mLT5JUE1QRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRhdGFfb2Zmc2V0ICs9IDI7Ci0KLSAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0LCBzaW5mLT5JUE1QRGF0YSwgc2luZi0+bGVuKSA8IHNpbmYtPmxlbikgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRhdGFfb2Zmc2V0ICs9IHNpbmYtPmxlbjsKLQotICAgICAgICAgICAgc2l6ZSAtPSAoZGF0YUxlbiArIG51bU9mQnl0ZXMgKyAxKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChzaXplICE9IDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsgIC8vIFJldHVybiBhIGR1bW15IGVycm9yLgotfQotCi1zdHJ1Y3QgUGF0aEFkZGVyIHsKLSAgICBQYXRoQWRkZXIoVmVjdG9yPHVpbnQzMl90PiAqcGF0aCwgdWludDMyX3QgY2h1bmtUeXBlKQotICAgICAgICA6IG1QYXRoKHBhdGgpIHsKLSAgICAgICAgbVBhdGgtPnB1c2goY2h1bmtUeXBlKTsKLSAgICB9Ci0KLSAgICB+UGF0aEFkZGVyKCkgewotICAgICAgICBtUGF0aC0+cG9wKCk7Ci0gICAgfQotCi1wcml2YXRlOgotICAgIFZlY3Rvcjx1aW50MzJfdD4gKm1QYXRoOwotCi0gICAgUGF0aEFkZGVyKGNvbnN0IFBhdGhBZGRlciAmKTsKLSAgICBQYXRoQWRkZXIgJm9wZXJhdG9yPShjb25zdCBQYXRoQWRkZXIgJik7Ci19OwotCi1zdGF0aWMgYm9vbCB1bmRlck1ldGFEYXRhUGF0aChjb25zdCBWZWN0b3I8dWludDMyX3Q+ICZwYXRoKSB7Ci0gICAgcmV0dXJuIHBhdGguc2l6ZSgpID49IDUKLSAgICAgICAgJiYgcGF0aFswXSA9PSBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ3YnKQotICAgICAgICAmJiBwYXRoWzFdID09IEZPVVJDQygndScsICdkJywgJ3QnLCAnYScpCi0gICAgICAgICYmIHBhdGhbMl0gPT0gRk9VUkNDKCdtJywgJ2UnLCAndCcsICdhJykKLSAgICAgICAgJiYgcGF0aFszXSA9PSBGT1VSQ0MoJ2knLCAnbCcsICdzJywgJ3QnKTsKLX0KLQotc3RhdGljIGJvb2wgdW5kZXJRVE1ldGFQYXRoKGNvbnN0IFZlY3Rvcjx1aW50MzJfdD4gJnBhdGgsIGludDMyX3QgZGVwdGgpIHsKLSAgICByZXR1cm4gcGF0aC5zaXplKCkgPj0gMgotICAgICAgICAgICAgJiYgcGF0aFswXSA9PSBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ3YnKQotICAgICAgICAgICAgJiYgcGF0aFsxXSA9PSBGT1VSQ0MoJ20nLCAnZScsICd0JywgJ2EnKQotICAgICAgICAgICAgJiYgKGRlcHRoID09IDIKLSAgICAgICAgICAgIHx8IChkZXB0aCA9PSAzCi0gICAgICAgICAgICAgICAgICAgICYmIChwYXRoWzJdID09IEZPVVJDQygnaCcsICdkJywgJ2wnLCAncicpCi0gICAgICAgICAgICAgICAgICAgIHx8ICBwYXRoWzJdID09IEZPVVJDQygnaScsICdsJywgJ3MnLCAndCcpCi0gICAgICAgICAgICAgICAgICAgIHx8ICBwYXRoWzJdID09IEZPVVJDQygnaycsICdlJywgJ3knLCAncycpKSkpOwotfQotCi0vLyBHaXZlbiBhIHRpbWUgaW4gc2Vjb25kcyBzaW5jZSBKYW4gMSAxOTA0LCBwcm9kdWNlIGEgaHVtYW4tcmVhZGFibGUgc3RyaW5nLgotc3RhdGljIGJvb2wgY29udmVydFRpbWVUb0RhdGUoaW50NjRfdCB0aW1lXzE5MDQsIFN0cmluZzggKnMpIHsKLSAgICAvLyBkZWx0YSBiZXR3ZWVuIG1wZWc0IHRpbWUgYW5kIHVuaXggZXBvY2ggdGltZQotICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGRlbHRhID0gKCgoNjYgKiAzNjUgKyAxNykgKiAyNCkgKiAzNjAwKTsKLSAgICBpZiAodGltZV8xOTA0IDwgSU5UNjRfTUlOICsgZGVsdGEpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICB0aW1lX3QgdGltZV8xOTcwID0gdGltZV8xOTA0IC0gZGVsdGE7Ci0KLSAgICBjaGFyIHRtcFszMl07Ci0gICAgc3RydWN0IHRtKiB0bSA9IGdtdGltZSgmdGltZV8xOTcwKTsKLSAgICBpZiAodG0gIT0gTlVMTCAmJgotICAgICAgICAgICAgc3RyZnRpbWUodG1wLCBzaXplb2YodG1wKSwgIiVZJW0lZFQlSCVNJVMuMDAwWiIsIHRtKSA+IDApIHsKLSAgICAgICAgcy0+c2V0VG8odG1wKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlQ2h1bmsob2ZmNjRfdCAqb2Zmc2V0LCBpbnQgZGVwdGgpIHsKLSAgICBBTE9HVigiZW50ZXJpbmcgcGFyc2VDaHVuayAlbGxkLyVkIiwgKGxvbmcgbG9uZykqb2Zmc2V0LCBkZXB0aCk7Ci0KLSAgICBpZiAoKm9mZnNldCA8IDApIHsKLSAgICAgICAgQUxPR0UoImIvMjM1NDA5MTQiKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0gICAgaWYgKGRlcHRoID4gMTAwKSB7Ci0gICAgICAgIEFMT0dFKCJiLzI3NDU2Mjk5Iik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotICAgIHVpbnQzMl90IGhkclsyXTsKLSAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgqb2Zmc2V0LCBoZHIsIDgpIDwgOCkgewotICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgfQotICAgIHVpbnQ2NF90IGNodW5rX3NpemUgPSBudG9obChoZHJbMF0pOwotICAgIGludDMyX3QgY2h1bmtfdHlwZSA9IG50b2hsKGhkclsxXSk7Ci0gICAgb2ZmNjRfdCBkYXRhX29mZnNldCA9ICpvZmZzZXQgKyA4OwotCi0gICAgaWYgKGNodW5rX3NpemUgPT0gMSkgewotICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgqb2Zmc2V0ICsgOCwgJmNodW5rX3NpemUsIDgpIDwgOCkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICB9Ci0gICAgICAgIGNodW5rX3NpemUgPSBudG9oNjQoY2h1bmtfc2l6ZSk7Ci0gICAgICAgIGRhdGFfb2Zmc2V0ICs9IDg7Ci0KLSAgICAgICAgaWYgKGNodW5rX3NpemUgPCAxNikgewotICAgICAgICAgICAgLy8gVGhlIHNtYWxsZXN0IHZhbGlkIGNodW5rIGlzIDE2IGJ5dGVzIGxvbmcgaW4gdGhpcyBjYXNlLgotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoY2h1bmtfc2l6ZSA9PSAwKSB7Ci0gICAgICAgIGlmIChkZXB0aCA9PSAwKSB7Ci0gICAgICAgICAgICAvLyBhdG9tIGV4dGVuZHMgdG8gZW5kIG9mIGZpbGUKLSAgICAgICAgICAgIG9mZjY0X3Qgc291cmNlU2l6ZTsKLSAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+Z2V0U2l6ZSgmc291cmNlU2l6ZSkgPT0gT0spIHsKLSAgICAgICAgICAgICAgICBjaHVua19zaXplID0gKHNvdXJjZVNpemUgLSAqb2Zmc2V0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gWFhYIGNvdWxkIHdlIGp1c3QgcGljayBhICJzdWZmaWNpZW50bHkgbGFyZ2UiIHZhbHVlIGhlcmU/Ci0gICAgICAgICAgICAgICAgQUxPR0UoImF0b20gc2l6ZSBpcyAwLCBhbmQgZGF0YSBzb3VyY2UgaGFzIG5vIHNpemUiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gbm90IGFsbG93ZWQgZm9yIG5vbi10b3BsZXZlbCBhdG9tcywgc2tpcCBpdAotICAgICAgICAgICAgKm9mZnNldCArPSA0OwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChjaHVua19zaXplIDwgOCkgewotICAgICAgICAvLyBUaGUgc21hbGxlc3QgdmFsaWQgY2h1bmsgaXMgOCBieXRlcyBsb25nLgotICAgICAgICBBTE9HRSgiaW52YWxpZCBjaHVuayBzaXplOiAlIiBQUkl1NjQsIGNodW5rX3NpemUpOwotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGNoYXIgY2h1bmtbNV07Ci0gICAgTWFrZUZvdXJDQ1N0cmluZyhjaHVua190eXBlLCBjaHVuayk7Ci0gICAgQUxPR1YoImNodW5rOiAlcyBAICVsbGQsICVkIiwgY2h1bmssIChsb25nIGxvbmcpKm9mZnNldCwgZGVwdGgpOwotCi0gICAgaWYgKGtVc2VIZXhEdW1wKSB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGtXaGl0ZXNwYWNlW10gPSAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI7Ci0gICAgICAgIGNvbnN0IGNoYXIgKmluZGVudCA9ICZrV2hpdGVzcGFjZVtzaXplb2Yoa1doaXRlc3BhY2UpIC0gMSAtIDIgKiBkZXB0aF07Ci0gICAgICAgIHByaW50ZigiJXNmb3VuZCBjaHVuayAnJXMnIG9mIHNpemUgJSIgUFJJdTY0ICJcbiIsIGluZGVudCwgY2h1bmssIGNodW5rX3NpemUpOwotCi0gICAgICAgIGNoYXIgYnVmZmVyWzI1Nl07Ci0gICAgICAgIHNpemVfdCBuID0gY2h1bmtfc2l6ZTsKLSAgICAgICAgaWYgKG4gPiBzaXplb2YoYnVmZmVyKSkgewotICAgICAgICAgICAgbiA9IHNpemVvZihidWZmZXIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KCpvZmZzZXQsIGJ1ZmZlciwgbikKLSAgICAgICAgICAgICAgICA8IChzc2l6ZV90KW4pIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgfQotCi0gICAgICAgIGhleGR1bXAoYnVmZmVyLCBuKTsKLSAgICB9Ci0KLSAgICBQYXRoQWRkZXIgYXV0b0FkZGVyKCZtUGF0aCwgY2h1bmtfdHlwZSk7Ci0KLSAgICAvLyAoZGF0YV9vZmZzZXQgLSAqb2Zmc2V0KSBpcyBlaXRoZXIgOCBvciAxNgotICAgIG9mZjY0X3QgY2h1bmtfZGF0YV9zaXplID0gY2h1bmtfc2l6ZSAtIChkYXRhX29mZnNldCAtICpvZmZzZXQpOwotICAgIGlmIChjaHVua19kYXRhX3NpemUgPCAwKSB7Ci0gICAgICAgIEFMT0dFKCJiLzIzNTQwOTE0Iik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotICAgIGlmIChjaHVua190eXBlICE9IEZPVVJDQygnbScsICdkJywgJ2EnLCAndCcpICYmIGNodW5rX2RhdGFfc2l6ZSA+IGtNYXhBdG9tU2l6ZSkgewotICAgICAgICBjaGFyIGVyck1zZ1sxMDBdOwotICAgICAgICBzcHJpbnRmKGVyck1zZywgIiVzIGF0b20gaGFzIHNpemUgJSIgUFJJZDY0LCBjaHVuaywgY2h1bmtfZGF0YV9zaXplKTsKLSAgICAgICAgQUxPR0UoIiVzIChiLzI4NjE1NDQ4KSIsIGVyck1zZyk7Ci0gICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZVdpdGhJbmZvTG9nKDB4NTM0ZTQ1NTQsICIyODYxNTQ0OCIsIC0xLCBlcnJNc2csIHN0cmxlbihlcnJNc2cpKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBpZiAoY2h1bmtfdHlwZSAhPSBGT1VSQ0MoJ2MnLCAncCcsICdyJywgJ3QnKQotICAgICAgICAgICAgJiYgY2h1bmtfdHlwZSAhPSBGT1VSQ0MoJ2MnLCAnbycsICd2JywgJ3InKQotICAgICAgICAgICAgJiYgbVBhdGguc2l6ZSgpID09IDUgJiYgdW5kZXJNZXRhRGF0YVBhdGgobVBhdGgpKSB7Ci0gICAgICAgIG9mZjY0X3Qgc3RvcF9vZmZzZXQgPSAqb2Zmc2V0ICsgY2h1bmtfc2l6ZTsKLSAgICAgICAgKm9mZnNldCA9IGRhdGFfb2Zmc2V0OwotICAgICAgICB3aGlsZSAoKm9mZnNldCA8IHN0b3Bfb2Zmc2V0KSB7Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUNodW5rKG9mZnNldCwgZGVwdGggKyAxKTsKLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCpvZmZzZXQgIT0gc3RvcF9vZmZzZXQpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgc3dpdGNoKGNodW5rX3R5cGUpIHsKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ3YnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAncicsICdhJywgJ2snKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnZCcsICdpJywgJ2EnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnaScsICduJywgJ2YnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2QnLCAnaScsICduJywgJ2YnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAndCcsICdiJywgJ2wnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAndicsICdlJywgJ3gnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ2YnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAncicsICdhJywgJ2YnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnZicsICdyJywgJ2EnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3UnLCAnZCcsICd0JywgJ2EnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAnbCcsICdzJywgJ3QnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAnaScsICduJywgJ2YnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAnYycsICdoJywgJ2knKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2UnLCAnZCcsICd0JywgJ3MnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3cnLCAnYScsICd2JywgJ2UnKToKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCdtJywgJ28nLCAnbycsICd2JykgJiYgZGVwdGggIT0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJtb292OiBkZXB0aCAlZCIsIGRlcHRoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ3YnKSAmJiBtSW5pdENoZWNrID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImR1cGxpY2F0ZSBtb292Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCdtJywgJ28nLCAnbycsICdmJykgJiYgIW1Nb29mRm91bmQpIHsKLSAgICAgICAgICAgICAgICAvLyBzdG9yZSB0aGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBzZWdtZW50Ci0gICAgICAgICAgICAgICAgbU1vb2ZGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbU1vb2ZPZmZzZXQgPSAqb2Zmc2V0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoJ3MnLCAndCcsICdiJywgJ2wnKSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJzYW1wbGVUYWJsZSBjaHVuayBpcyAlIiBQUkl1NjQgIiBieXRlcyBsb25nLiIsIGNodW5rX3NpemUpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5mbGFncygpCi0gICAgICAgICAgICAgICAgICAgICAgICAmIChEYXRhU291cmNlOjprV2FudHNQcmVmZXRjaGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRGF0YVNvdXJjZTo6a0lzQ2FjaGluZ0RhdGFTb3VyY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNwPE1QRUc0RGF0YVNvdXJjZT4gY2FjaGVkU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNUEVHNERhdGFTb3VyY2UobURhdGFTb3VyY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZWRTb3VyY2UtPnNldENhY2hlZFJhbmdlKCpvZmZzZXQsIGNodW5rX3NpemUpID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRGF0YVNvdXJjZSA9IGNhY2hlZFNvdXJjZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZSA9IG5ldyBTYW1wbGVUYWJsZShtRGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJvb2wgaXNUcmFjayA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCd0JywgJ3InLCAnYScsICdrJykpIHsKLSAgICAgICAgICAgICAgICBpZiAoZGVwdGggIT0gMSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgidHJhazogZGVwdGggJWQiLCBkZXB0aCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlzVHJhY2sgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgVHJhY2sgKnRyYWNrID0gbmV3IFRyYWNrOwotICAgICAgICAgICAgICAgIHRyYWNrLT5uZXh0ID0gTlVMTDsKLSAgICAgICAgICAgICAgICBpZiAobUxhc3RUcmFjaykgewotICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5uZXh0ID0gdHJhY2s7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbUZpcnN0VHJhY2sgPSB0cmFjazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjayA9IHRyYWNrOwotCi0gICAgICAgICAgICAgICAgdHJhY2stPm1ldGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgICAgICAgICAgICAgdHJhY2stPmluY2x1ZGVzX2V4cGVuc2l2ZV9tZXRhZGF0YSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHRyYWNrLT5za2lwVHJhY2sgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB0cmFjay0+dGltZXNjYWxlID0gMDsKLSAgICAgICAgICAgICAgICB0cmFjay0+bWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgb2ZmNjRfdCBzdG9wX29mZnNldCA9ICpvZmZzZXQgKyBjaHVua19zaXplOwotICAgICAgICAgICAgKm9mZnNldCA9IGRhdGFfb2Zmc2V0OwotICAgICAgICAgICAgd2hpbGUgKCpvZmZzZXQgPCBzdG9wX29mZnNldCkgewotICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlQ2h1bmsob2Zmc2V0LCBkZXB0aCArIDEpOwotICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzVHJhY2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnNraXBUcmFjayA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCpvZmZzZXQgIT0gc3RvcF9vZmZzZXQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaXNUcmFjaykgewotICAgICAgICAgICAgICAgIGludDMyX3QgdHJhY2tJZDsKLSAgICAgICAgICAgICAgICAvLyBUaGVyZSBtdXN0IGJlIGV4YWN0IG9uZSB0cmFjayBoZWFkZXIgcGVyIHRyYWNrLgotICAgICAgICAgICAgICAgIGlmICghbUxhc3RUcmFjay0+bWV0YS0+ZmluZEludDMyKGtLZXlUcmFja0lELCAmdHJhY2tJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2tpcFRyYWNrID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSB2ZXJpZnlUcmFjayhtTGFzdFRyYWNrKTsKLSAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnNraXBUcmFjayA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2stPnNraXBUcmFjaykgewotICAgICAgICAgICAgICAgICAgICBUcmFjayAqY3VyID0gbUZpcnN0VHJhY2s7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGN1ciA9PSBtTGFzdFRyYWNrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgY3VyOwotICAgICAgICAgICAgICAgICAgICAgICAgbUZpcnN0VHJhY2sgPSBtTGFzdFRyYWNrID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjdXIgJiYgY3VyLT5uZXh0ICE9IG1MYXN0VHJhY2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXIgPSBjdXItPm5leHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyLT5uZXh0ID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBtTGFzdFRyYWNrOwotICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjayA9IGN1cjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCdtJywgJ28nLCAnbycsICd2JykpIHsKLSAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gT0s7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIW1Jc0RybSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsgIC8vIFJldHVybiBhIGR1bW15IGVycm9yLgotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgRk9VUkNDKCdlJywgJ2wnLCAncycsICd0Jyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKLQotICAgICAgICAgICAgLy8gU2VlIDE0NDk2LTEyIDguNi42Ci0gICAgICAgICAgICB1aW50OF90IHZlcnNpb247Ci0gICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChkYXRhX29mZnNldCwgJnZlcnNpb24sIDEpIDwgMSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdWludDMyX3QgZW50cnlfY291bnQ7Ci0gICAgICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIoZGF0YV9vZmZzZXQgKyA0LCAmZW50cnlfY291bnQpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZW50cnlfY291bnQgIT0gMSkgewotICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgc3VwcG9ydCBhIHNpbmdsZSBlbnRyeSBhdCB0aGUgbW9tZW50LCBmb3IgZ2FwbGVzcyBwbGF5YmFjawotICAgICAgICAgICAgICAgIEFMT0dXKCJpZ25vcmluZyBlZGl0IGxpc3Qgd2l0aCAlZCBlbnRyaWVzIiwgZW50cnlfY291bnQpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtSGVhZGVyVGltZXNjYWxlID09IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiaWdub3JpbmcgZWRpdCBsaXN0IGJlY2F1c2UgdGltZXNjYWxlIGlzIDAiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgb2ZmNjRfdCBlbnRyaWVzb2Zmc2V0ID0gZGF0YV9vZmZzZXQgKyA4OwotICAgICAgICAgICAgICAgIHVpbnQ2NF90IHNlZ21lbnRfZHVyYXRpb247Ci0gICAgICAgICAgICAgICAgaW50NjRfdCBtZWRpYV90aW1lOwotCi0gICAgICAgICAgICAgICAgaWYgKHZlcnNpb24gPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50NjQoZW50cmllc29mZnNldCwgJnNlZ21lbnRfZHVyYXRpb24pIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIW1EYXRhU291cmNlLT5nZXRVSW50NjQoZW50cmllc29mZnNldCArIDgsICh1aW50NjRfdCopJm1lZGlhX3RpbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb24gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzZDsKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtdDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKGVudHJpZXNvZmZzZXQsICZzZCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbURhdGFTb3VyY2UtPmdldFVJbnQzMihlbnRyaWVzb2Zmc2V0ICsgNCwgKHVpbnQzMl90KikmbXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2VnbWVudF9kdXJhdGlvbiA9IHNkOwotICAgICAgICAgICAgICAgICAgICBtZWRpYV90aW1lID0gbXQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHVpbnQ2NF90IGhhbGZzY2FsZSA9IG1IZWFkZXJUaW1lc2NhbGUgLyAyOwotICAgICAgICAgICAgICAgIHNlZ21lbnRfZHVyYXRpb24gPSAoc2VnbWVudF9kdXJhdGlvbiAqIDEwMDAwMDAgKyBoYWxmc2NhbGUpLyBtSGVhZGVyVGltZXNjYWxlOwotICAgICAgICAgICAgICAgIG1lZGlhX3RpbWUgPSAobWVkaWFfdGltZSAqIDEwMDAwMDAgKyBoYWxmc2NhbGUpIC8gbUhlYWRlclRpbWVzY2FsZTsKLQotICAgICAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb247Ci0gICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVyYXRlOwotICAgICAgICAgICAgICAgIGlmICghbUxhc3RUcmFjaykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobUxhc3RUcmFjay0+bWV0YS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlcmF0ZSkpIHsKLQotICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGRlbGF5ID0gKG1lZGlhX3RpbWUgICogc2FtcGxlcmF0ZSArIDUwMDAwMCkgLyAxMDAwMDAwOwotICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5RW5jb2RlckRlbGF5LCBkZWxheSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwYWRkaW5ndXMgPSBkdXJhdGlvbiAtIChpbnQ2NF90KShzZWdtZW50X2R1cmF0aW9uICsgbWVkaWFfdGltZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYWRkaW5ndXMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0cmFjayBkdXJhdGlvbiBmcm9tIG1lZGlhIGhlYWRlciAod2hpY2ggaXMgd2hhdCBrS2V5RHVyYXRpb24gaXMpIG1pZ2h0Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBiZSBzbGlnaHRseSBzaG9ydGVyIHRoYW4gdGhlIHNlZ21lbnQgZHVyYXRpb24sIHdoaWNoIHdvdWxkIG1ha2UgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBwYWRkaW5nIG5lZ2F0aXZlLiBDbGFtcCB0byB6ZXJvLgotICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZ3VzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHBhZGRpbmdzYW1wbGVzID0gKHBhZGRpbmd1cyAqIHNhbXBsZXJhdGUgKyA1MDAwMDApIC8gMTAwMDAwMDsKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleUVuY29kZXJQYWRkaW5nLCBwYWRkaW5nc2FtcGxlcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIEZPVVJDQygnZicsICdyJywgJ20nLCAnYScpOgotICAgICAgICB7Ci0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IG9yaWdpbmFsX2ZvdXJjYzsKLSAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0LCAmb3JpZ2luYWxfZm91cmNjLCA0KSA8IDQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvcmlnaW5hbF9mb3VyY2MgPSBudG9obChvcmlnaW5hbF9mb3VyY2MpOwotICAgICAgICAgICAgQUxPR1YoInJlYWQgb3JpZ2luYWwgZm9ybWF0OiAlZCIsIG9yaWdpbmFsX2ZvdXJjYyk7Ci0KLSAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgRm91ckNDMk1JTUUob3JpZ2luYWxfZm91cmNjKSk7Ci0gICAgICAgICAgICB1aW50MzJfdCBudW1fY2hhbm5lbHMgPSAwOwotICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlX3JhdGUgPSAwOwotICAgICAgICAgICAgaWYgKEFkanVzdENoYW5uZWxzQW5kUmF0ZShvcmlnaW5hbF9mb3VyY2MsICZudW1fY2hhbm5lbHMsICZzYW1wbGVfcmF0ZSkpIHsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBudW1fY2hhbm5lbHMpOwotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVfcmF0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgRk9VUkNDKCd0JywgJ2UnLCAnbicsICdjJyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKLQotICAgICAgICAgICAgaWYgKGNodW5rX3NpemUgPCAzMikgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHRlbmMgYm94IGNvbnRhaW5zIDEgYnl0ZSB2ZXJzaW9uLCAzIGJ5dGUgZmxhZ3MsIDMgYnl0ZSBkZWZhdWx0IGFsZ29yaXRobSBpZCwgb25lIGJ5dGUKLSAgICAgICAgICAgIC8vIGRlZmF1bHQgSVYgc2l6ZSwgMTYgYnl0ZXMgZGVmYXVsdCBLZXlJRAotICAgICAgICAgICAgLy8gKElTTyAyMzAwMS03KQotICAgICAgICAgICAgY2hhciBidWZbNF07Ci0gICAgICAgICAgICBtZW1zZXQoYnVmLCAwLCA0KTsKLSAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0ICsgNCwgYnVmICsgMSwgMykgPCAzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdWludDMyX3QgZGVmYXVsdEFsZ29yaXRobUlkID0gbnRvaGwoKigoaW50MzJfdCopYnVmKSk7Ci0gICAgICAgICAgICBpZiAoZGVmYXVsdEFsZ29yaXRobUlkID4gMSkgewotICAgICAgICAgICAgICAgIC8vIG9ubHkgMCAoY2xlYXIpIGFuZCAxIChBRVMtMTI4KSBhcmUgdmFsaWQKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtZW1zZXQoYnVmLCAwLCA0KTsKLSAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0ICsgNywgYnVmICsgMywgMSkgPCAxKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdWludDMyX3QgZGVmYXVsdElWU2l6ZSA9IG50b2hsKCooKGludDMyX3QqKWJ1ZikpOwotCi0gICAgICAgICAgICBpZiAoKGRlZmF1bHRBbGdvcml0aG1JZCA9PSAwICYmIGRlZmF1bHRJVlNpemUgIT0gMCkgfHwKLSAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHRBbGdvcml0aG1JZCAhPSAwICYmIGRlZmF1bHRJVlNpemUgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAvLyBvbmx5IHVuZW5jcnlwdGVkIGRhdGEgbXVzdCBoYXZlIDAgSVYgc2l6ZQotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGRlZmF1bHRJVlNpemUgIT0gMCAmJgotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0SVZTaXplICE9IDggJiYKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdElWU2l6ZSAhPSAxNikgewotICAgICAgICAgICAgICAgIC8vIG9ubHkgc3VwcG9ydGVkIHNpemVzIGFyZSAwLCA4IGFuZCAxNgotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHVpbnQ4X3QgZGVmYXVsdEtleUlkWzE2XTsKLQotICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQgKyA4LCAmZGVmYXVsdEtleUlkLCAxNikgPCAxNikgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotCi0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5Q3J5cHRvTW9kZSwgZGVmYXVsdEFsZ29yaXRobUlkKTsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDMyKGtLZXlDcnlwdG9EZWZhdWx0SVZTaXplLCBkZWZhdWx0SVZTaXplKTsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldERhdGEoa0tleUNyeXB0b0tleSwgJ3RlbmMnLCBkZWZhdWx0S2V5SWQsIDE2KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAnaycsICdoJywgJ2QnKToKLSAgICAgICAgewotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBlcnI7Ci0gICAgICAgICAgICBpZiAoKGVyciA9IHBhcnNlVHJhY2tIZWFkZXIoZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSkpICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIEZPVVJDQygncCcsICdzJywgJ3MnLCAnaCcpOgotICAgICAgICB7Ci0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7Ci0KLSAgICAgICAgICAgIFBzc2hJbmZvIHBzc2g7Ci0KLSAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0ICsgNCwgJnBzc2gudXVpZCwgMTYpIDwgMTYpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IHBzc2hkYXRhbGVuID0gMDsKLSAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0ICsgMjAsICZwc3NoZGF0YWxlbiwgNCkgPCA0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHNzaC5kYXRhbGVuID0gbnRvaGwocHNzaGRhdGFsZW4pOwotICAgICAgICAgICAgQUxPR1YoInBzc2ggZGF0YSBzaXplOiAlZCIsIHBzc2guZGF0YWxlbik7Ci0gICAgICAgICAgICBpZiAoY2h1bmtfc2l6ZSA8IDIwIHx8IHBzc2guZGF0YWxlbiA+IGNodW5rX3NpemUgLSAyMCkgewotICAgICAgICAgICAgICAgIC8vIHBzc2ggZGF0YSBsZW5ndGggZXhjZWVkcyBzaXplIG9mIGNvbnRhaW5pbmcgYm94Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHNzaC5kYXRhID0gbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQ4X3RbcHNzaC5kYXRhbGVuXTsKLSAgICAgICAgICAgIGlmIChwc3NoLmRhdGEgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigiYWxsb2NhdGVkIHBzc2ggQCAlcCIsIHBzc2guZGF0YSk7Ci0gICAgICAgICAgICBzc2l6ZV90IHJlcXVlc3RlZCA9IChzc2l6ZV90KSBwc3NoLmRhdGFsZW47Ci0gICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChkYXRhX29mZnNldCArIDI0LCBwc3NoLmRhdGEsIHJlcXVlc3RlZCkgPCByZXF1ZXN0ZWQpIHsKLSAgICAgICAgICAgICAgICBkZWxldGVbXSBwc3NoLmRhdGE7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVBzc2gucHVzaF9iYWNrKHBzc2gpOwotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ2QnLCAnaCcsICdkJyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKLQotICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IDQgfHwgbUxhc3RUcmFjayA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdWludDhfdCB2ZXJzaW9uOwotICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgJnZlcnNpb24sIHNpemVvZih2ZXJzaW9uKSkKLSAgICAgICAgICAgICAgICAgICAgPCAoc3NpemVfdClzaXplb2YodmVyc2lvbikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG9mZjY0X3QgdGltZXNjYWxlX29mZnNldDsKLQotICAgICAgICAgICAgaWYgKHZlcnNpb24gPT0gMSkgewotICAgICAgICAgICAgICAgIHRpbWVzY2FsZV9vZmZzZXQgPSBkYXRhX29mZnNldCArIDQgKyAxNjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodmVyc2lvbiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgdGltZXNjYWxlX29mZnNldCA9IGRhdGFfb2Zmc2V0ICsgNCArIDg7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdWludDMyX3QgdGltZXNjYWxlOwotICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCi0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lc2NhbGVfb2Zmc2V0LCAmdGltZXNjYWxlLCBzaXplb2YodGltZXNjYWxlKSkKLSAgICAgICAgICAgICAgICAgICAgPCAoc3NpemVfdClzaXplb2YodGltZXNjYWxlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCF0aW1lc2NhbGUpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgidGltZXNjYWxlIHNob3VsZCBub3QgYmUgWkVSTy4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtTGFzdFRyYWNrLT50aW1lc2NhbGUgPSBudG9obCh0aW1lc2NhbGUpOwotCi0gICAgICAgICAgICAvLyAxNDQ5Ni0xMiBzYXlzIGFsbCBvbmVzIG1lYW5zIGluZGV0ZXJtaW5hdGUsIGJ1dCBzb21lIGZpbGVzIHNlZW0gdG8gdXNlCi0gICAgICAgICAgICAvLyAwIGluc3RlYWQuIFdlIHRyZWF0IGJvdGggdGhlIHNhbWUuCi0gICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uID0gMDsKLSAgICAgICAgICAgIGlmICh2ZXJzaW9uID09IDEpIHsKLSAgICAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc2NhbGVfb2Zmc2V0ICsgNCwgJmR1cmF0aW9uLCBzaXplb2YoZHVyYXRpb24pKQotICAgICAgICAgICAgICAgICAgICAgICAgPCAoc3NpemVfdClzaXplb2YoZHVyYXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGR1cmF0aW9uICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gbnRvaDY0KGR1cmF0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHVpbnQzMl90IGR1cmF0aW9uMzI7Ci0gICAgICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXNjYWxlX29mZnNldCArIDQsICZkdXJhdGlvbjMyLCBzaXplb2YoZHVyYXRpb24zMikpCi0gICAgICAgICAgICAgICAgICAgICAgICA8IChzc2l6ZV90KXNpemVvZihkdXJhdGlvbjMyKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChkdXJhdGlvbjMyICE9IDB4ZmZmZmZmZmYpIHsKLSAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24gPSBudG9obChkdXJhdGlvbjMyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZHVyYXRpb24gIT0gMCAmJiBtTGFzdFRyYWNrLT50aW1lc2NhbGUgIT0gMCkgewotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICAgICAga0tleUR1cmF0aW9uLCAoZHVyYXRpb24gKiAxMDAwMDAwKSAvIG1MYXN0VHJhY2stPnRpbWVzY2FsZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHVpbnQ4X3QgbGFuZ1syXTsKLSAgICAgICAgICAgIG9mZjY0X3QgbGFuZ19vZmZzZXQ7Ci0gICAgICAgICAgICBpZiAodmVyc2lvbiA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgbGFuZ19vZmZzZXQgPSB0aW1lc2NhbGVfb2Zmc2V0ICsgNCArIDg7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb24gPT0gMCkgewotICAgICAgICAgICAgICAgIGxhbmdfb2Zmc2V0ID0gdGltZXNjYWxlX29mZnNldCArIDQgKyA0OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGxhbmdfb2Zmc2V0LCAmbGFuZywgc2l6ZW9mKGxhbmcpKQotICAgICAgICAgICAgICAgICAgICA8IChzc2l6ZV90KXNpemVvZihsYW5nKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVG8gZ2V0IHRoZSBJU08tNjM5LTIvVCB0aHJlZSBjaGFyYWN0ZXIgbGFuZ3VhZ2UgY29kZQotICAgICAgICAgICAgLy8gMSBiaXQgcGFkIGZvbGxvd2VkIGJ5IDMgNS1iaXRzIGNoYXJhY3RlcnMuIEVhY2ggY2hhcmFjdGVyCi0gICAgICAgICAgICAvLyBpcyBwYWNrZWQgYXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBpdHMgQVNDSUkgdmFsdWUgYW5kIDB4NjAuCi0gICAgICAgICAgICBjaGFyIGxhbmdfY29kZVs0XTsKLSAgICAgICAgICAgIGxhbmdfY29kZVswXSA9ICgobGFuZ1swXSA+PiAyKSAmIDB4MWYpICsgMHg2MDsKLSAgICAgICAgICAgIGxhbmdfY29kZVsxXSA9ICgobGFuZ1swXSAmIDB4MykgPDwgMyB8IChsYW5nWzFdID4+IDUpKSArIDB4NjA7Ci0gICAgICAgICAgICBsYW5nX2NvZGVbMl0gPSAobGFuZ1sxXSAmIDB4MWYpICsgMHg2MDsKLSAgICAgICAgICAgIGxhbmdfY29kZVszXSA9ICdcMCc7Ci0KLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldENTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlNZWRpYUxhbmd1YWdlLCBsYW5nX2NvZGUpOwotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ3QnLCAncycsICdkJyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgYnVmZmVyWzhdOwotICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IChvZmY2NF90KXNpemVvZihidWZmZXIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgYnVmZmVyLCA4KSA8IDgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChVMzJfQVQoYnVmZmVyKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gU2hvdWxkIGJlIHZlcnNpb24gMCwgZmxhZ3MgMC4KLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1aW50MzJfdCBlbnRyeV9jb3VudCA9IFUzMl9BVCgmYnVmZmVyWzRdKTsKLQotICAgICAgICAgICAgaWYgKGVudHJ5X2NvdW50ID4gMSkgewotICAgICAgICAgICAgICAgIC8vIEZvciAzR1BQIHRpbWVkIHRleHQsIHRoZXJlIGNvdWxkIGJlIG11bHRpcGxlIHR4M2cgYm94ZXMgY29udGFpbgotICAgICAgICAgICAgICAgIC8vIG11bHRpcGxlIHRleHQgZGlzcGxheSBmb3JtYXRzLiBUaGVzZSBmb3JtYXRzIHdpbGwgYmUgdXNlZCB0bwotICAgICAgICAgICAgICAgIC8vIGRpc3BsYXkgdGhlIHRpbWVkIHRleHQuCi0gICAgICAgICAgICAgICAgLy8gRm9yIGVuY3J5cHRlZCBmaWxlcywgdGhlcmUgbWF5IGFsc28gYmUgbW9yZSB0aGFuIG9uZSBlbnRyeS4KLSAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lOwotCi0gICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLQotICAgICAgICAgICAgICAgIENIRUNLKG1MYXN0VHJhY2stPm1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9URVhUXzNHUFApICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJjYXNlY21wKG1pbWUsICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBGb3Igbm93IHdlIG9ubHkgc3VwcG9ydCBhIHNpbmdsZSB0eXBlIG9mIG1lZGlhIHBlciB0cmFjay4KLSAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2tpcFRyYWNrID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvZmY2NF90IHN0b3Bfb2Zmc2V0ID0gKm9mZnNldCArIGNodW5rX3NpemU7Ci0gICAgICAgICAgICAqb2Zmc2V0ID0gZGF0YV9vZmZzZXQgKyA4OwotICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGVudHJ5X2NvdW50OyArK2kpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUNodW5rKG9mZnNldCwgZGVwdGggKyAxKTsKLSAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoKm9mZnNldCAhPSBzdG9wX29mZnNldCkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZPVVJDQygnbScsICdlJywgJ3QnLCAndCcpOgotICAgICAgICB7Ci0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7Ci0KLSAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLQotICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoY2h1bmtfZGF0YV9zaXplKTsKLSAgICAgICAgICAgIGlmIChidWZmZXItPmRhdGEoKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgYnVmZmVyLT5kYXRhKCksIGNodW5rX2RhdGFfc2l6ZSkgPCBjaHVua19kYXRhX3NpemUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZzggbWltZUZvcm1hdCgoY29uc3QgY2hhciAqKShidWZmZXItPmRhdGEoKSksIGNodW5rX2RhdGFfc2l6ZSk7Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgbWltZUZvcm1hdC5zdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAncCcsICc0JywgJ2EnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2UnLCAnbicsICdjJywgJ2EnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAnYScsICdtJywgJ3InKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAnYScsICd3JywgJ2InKToKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG1Jc1FUICYmIGNodW5rX3R5cGUgPT0gRk9VUkNDKCdtJywgJ3AnLCAnNCcsICdhJykKLSAgICAgICAgICAgICAgICAgICAgJiYgZGVwdGggPj0gMSAmJiBtUGF0aFtkZXB0aCAtIDFdID09IEZPVVJDQygndycsICdhJywgJ3YnLCAnZScpKSB7Ci0gICAgICAgICAgICAgICAgLy8gSWdub3JlIG1wNGEgZW1iZWRkZWQgaW4gUVQgd2F2ZSBhdG9tCi0gICAgICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1aW50OF90IGJ1ZmZlcls4ICsgMjBdOwotICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IChzc2l6ZV90KXNpemVvZihidWZmZXIpKSB7Ci0gICAgICAgICAgICAgICAgLy8gQmFzaWMgQXVkaW9TYW1wbGVFbnRyeSBzaXplLgotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpIDwgKHNzaXplX3Qpc2l6ZW9mKGJ1ZmZlcikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHVpbnQxNl90IGRhdGFfcmVmX2luZGV4IF9fdW51c2VkID0gVTE2X0FUKCZidWZmZXJbNl0pOwotICAgICAgICAgICAgdWludDE2X3QgdmVyc2lvbiA9IFUxNl9BVCgmYnVmZmVyWzhdKTsKLSAgICAgICAgICAgIHVpbnQzMl90IG51bV9jaGFubmVscyA9IFUxNl9BVCgmYnVmZmVyWzE2XSk7Ci0KLSAgICAgICAgICAgIHVpbnQxNl90IHNhbXBsZV9zaXplID0gVTE2X0FUKCZidWZmZXJbMThdKTsKLSAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZV9yYXRlID0gVTMyX0FUKCZidWZmZXJbMjRdKSA+PiAxNjsKLQotICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotCi0gICAgICAgICAgICBvZmY2NF90IHN0b3Bfb2Zmc2V0ID0gKm9mZnNldCArIGNodW5rX3NpemU7Ci0gICAgICAgICAgICAqb2Zmc2V0ID0gZGF0YV9vZmZzZXQgKyBzaXplb2YoYnVmZmVyKTsKLQotICAgICAgICAgICAgaWYgKG1Jc1FUICYmIGNodW5rX3R5cGUgPT0gRk9VUkNDKCdtJywgJ3AnLCAnNCcsICdhJykpIHsKLSAgICAgICAgICAgICAgICBpZiAodmVyc2lvbiA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KCpvZmZzZXQsIGJ1ZmZlciwgMTYpIDwgMTYpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0jaWYgMAotICAgICAgICAgICAgICAgICAgICBVMzJfQVQoYnVmZmVyKTsgIC8vIHNhbXBsZXMgcGVyIHBhY2tldAotICAgICAgICAgICAgICAgICAgICBVMzJfQVQoJmJ1ZmZlcls0XSk7ICAvLyBieXRlcyBwZXIgcGFja2V0Ci0gICAgICAgICAgICAgICAgICAgIFUzMl9BVCgmYnVmZmVyWzhdKTsgIC8vIGJ5dGVzIHBlciBmcmFtZQotICAgICAgICAgICAgICAgICAgICBVMzJfQVQoJmJ1ZmZlclsxMl0pOyAgLy8gYnl0ZXMgcGVyIHNhbXBsZQotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICpvZmZzZXQgKz0gMTY7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uID09IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgdWludDhfdCB2MmJ1ZmZlclszNl07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KCpvZmZzZXQsIHYyYnVmZmVyLCAzNikgPCAzNikgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSNpZiAwCi0gICAgICAgICAgICAgICAgICAgIFUzMl9BVCh2MmJ1ZmZlcik7ICAvLyBzaXplIG9mIHN0cnVjdCBvbmx5Ci0gICAgICAgICAgICAgICAgICAgIHNhbXBsZV9yYXRlID0gKHVpbnQzMl90KVU2NF9BVCgmdjJidWZmZXJbNF0pOyAgLy8gYXVkaW8gc2FtcGxlIHJhdGUKLSAgICAgICAgICAgICAgICAgICAgbnVtX2NoYW5uZWxzID0gVTMyX0FUKCZ2MmJ1ZmZlclsxMl0pOyAgLy8gbnVtIGF1ZGlvIGNoYW5uZWxzCi0gICAgICAgICAgICAgICAgICAgIFUzMl9BVCgmdjJidWZmZXJbMTZdKTsgIC8vIGFsd2F5cyAweDdmMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgIHNhbXBsZV9zaXplID0gKHVpbnQxNl90KVUzMl9BVCgmdjJidWZmZXJbMjBdKTsgIC8vIGNvbnN0IGJpdHMgcGVyIGNoYW5uZWwKLSAgICAgICAgICAgICAgICAgICAgVTMyX0FUKCZ2MmJ1ZmZlclsyNF0pOyAgLy8gZm9ybWF0IHNwZWNpZmMgZmxhZ3MKLSAgICAgICAgICAgICAgICAgICAgVTMyX0FUKCZ2MmJ1ZmZlclsyOF0pOyAgLy8gY29uc3QgYnl0ZXMgcGVyIGF1ZGlvIHBhY2tldAotICAgICAgICAgICAgICAgICAgICBVMzJfQVQoJnYyYnVmZmVyWzMyXSk7ICAvLyBjb25zdCBMUENNIGZyYW1lcyBwZXIgYXVkaW8gcGFja2V0Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgKm9mZnNldCArPSAzNjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjaHVua190eXBlICE9IEZPVVJDQygnZScsICduJywgJ2MnLCAnYScpKSB7Ci0gICAgICAgICAgICAgICAgLy8gaWYgdGhlIGNodW5rIHR5cGUgaXMgZW5jYSwgd2UnbGwgZ2V0IHRoZSB0eXBlIGZyb20gdGhlIHNpbmYvZnJtYSBib3ggbGF0ZXIKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgRm91ckNDMk1JTUUoY2h1bmtfdHlwZSkpOwotICAgICAgICAgICAgICAgIEFkanVzdENoYW5uZWxzQW5kUmF0ZShjaHVua190eXBlLCAmbnVtX2NoYW5uZWxzLCAmc2FtcGxlX3JhdGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxPR1YoIioqKiBjb2Rpbmc9JyVzJyAlZCBjaGFubmVscywgc2l6ZSAlZCwgcmF0ZSAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICBjaHVuaywgbnVtX2NoYW5uZWxzLCBzYW1wbGVfc2l6ZSwgc2FtcGxlX3JhdGUpOwotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbnVtX2NoYW5uZWxzKTsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVfcmF0ZSk7Ci0KLSAgICAgICAgICAgIHdoaWxlICgqb2Zmc2V0IDwgc3RvcF9vZmZzZXQpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUNodW5rKG9mZnNldCwgZGVwdGggKyAxKTsKLSAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoKm9mZnNldCAhPSBzdG9wX29mZnNldCkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ3AnLCAnNCcsICd2Jyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdlJywgJ24nLCAnYycsICd2Jyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJzInLCAnNicsICczJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdIJywgJzInLCAnNicsICczJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdoJywgJzInLCAnNicsICczJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdhJywgJ3YnLCAnYycsICcxJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdoJywgJ3YnLCAnYycsICcxJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdoJywgJ2UnLCAndicsICcxJyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgYnVmZmVyWzc4XTsKLSAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPCAoc3NpemVfdClzaXplb2YoYnVmZmVyKSkgewotICAgICAgICAgICAgICAgIC8vIEJhc2ljIFZpZGVvU2FtcGxlRW50cnkgc2l6ZS4KLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBidWZmZXIsIHNpemVvZihidWZmZXIpKSA8IChzc2l6ZV90KXNpemVvZihidWZmZXIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1aW50MTZfdCBkYXRhX3JlZl9pbmRleCBfX3VudXNlZCA9IFUxNl9BVCgmYnVmZmVyWzZdKTsKLSAgICAgICAgICAgIHVpbnQxNl90IHdpZHRoID0gVTE2X0FUKCZidWZmZXJbNiArIDE4XSk7Ci0gICAgICAgICAgICB1aW50MTZfdCBoZWlnaHQgPSBVMTZfQVQoJmJ1ZmZlcls2ICsgMjBdKTsKLQotICAgICAgICAgICAgLy8gVGhlIHZpZGVvIHNhbXBsZSBpcyBub3Qgc3RhbmRhcmQtY29tcGxpYW50IGlmIGl0IGhhcyBpbnZhbGlkIGRpbWVuc2lvbi4KLSAgICAgICAgICAgIC8vIFVzZSBzb21lIGRlZmF1bHQgd2lkdGggYW5kIGhlaWdodCB2YWx1ZSwgYW5kCi0gICAgICAgICAgICAvLyBsZXQgdGhlIGRlY29kZXIgZmlndXJlIG91dCB0aGUgYWN0dWFsIHdpZHRoIGFuZCBoZWlnaHQgKGFuZCB0aHVzCi0gICAgICAgICAgICAvLyBiZSBwcmVwYXJlZCBmb3IgSU5GT19GT01SQVRfQ0hBTkdFRCBldmVudCkuCi0gICAgICAgICAgICBpZiAod2lkdGggPT0gMCkgIHdpZHRoICA9IDM1MjsKLSAgICAgICAgICAgIGlmIChoZWlnaHQgPT0gMCkgaGVpZ2h0ID0gMjg4OwotCi0gICAgICAgICAgICAvLyBwcmludGYoIioqKiBjb2Rpbmc9JyVzJyB3aWR0aD0lZCBoZWlnaHQ9JWRcbiIsCi0gICAgICAgICAgICAvLyAgICAgICAgY2h1bmssIHdpZHRoLCBoZWlnaHQpOwotCi0gICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0KLSAgICAgICAgICAgIGlmIChjaHVua190eXBlICE9IEZPVVJDQygnZScsICduJywgJ2MnLCAndicpKSB7Ci0gICAgICAgICAgICAgICAgLy8gaWYgdGhlIGNodW5rIHR5cGUgaXMgZW5jdiwgd2UnbGwgZ2V0IHRoZSB0eXBlIGZyb20gdGhlIHNpbmYvZnJtYSBib3ggbGF0ZXIKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgRm91ckNDMk1JTUUoY2h1bmtfdHlwZSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleVdpZHRoLCB3aWR0aCk7Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBoZWlnaHQpOwotCi0gICAgICAgICAgICBvZmY2NF90IHN0b3Bfb2Zmc2V0ID0gKm9mZnNldCArIGNodW5rX3NpemU7Ci0gICAgICAgICAgICAqb2Zmc2V0ID0gZGF0YV9vZmZzZXQgKyBzaXplb2YoYnVmZmVyKTsKLSAgICAgICAgICAgIHdoaWxlICgqb2Zmc2V0IDwgc3RvcF9vZmZzZXQpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUNodW5rKG9mZnNldCwgZGVwdGggKyAxKTsKLSAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoKm9mZnNldCAhPSBzdG9wX29mZnNldCkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ3QnLCAnYycsICdvJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdjJywgJ28nLCAnNicsICc0Jyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgobUxhc3RUcmFjayA9PSBOVUxMKSB8fCAobUxhc3RUcmFjay0+c2FtcGxlVGFibGUgPT0gTlVMTCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPQotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlLT5zZXRDaHVua09mZnNldFBhcmFtcygKLSAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rX3R5cGUsIGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOwotCi0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ3QnLCAncycsICdjJyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgobUxhc3RUcmFjayA9PSBOVUxMKSB8fCAobUxhc3RUcmFjay0+c2FtcGxlVGFibGUgPT0gTlVMTCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLQotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0KLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZS0+c2V0U2FtcGxlVG9DaHVua1BhcmFtcygKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOwotCi0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ3QnLCAncycsICd6Jyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ3QnLCAneicsICcyJyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgobUxhc3RUcmFjayA9PSBOVUxMKSB8fCAobUxhc3RUcmFjay0+c2FtcGxlVGFibGUgPT0gTlVMTCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPQotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlLT5zZXRTYW1wbGVTaXplUGFyYW1zKAotICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtfdHlwZSwgZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7Ci0KLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKLQotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNpemVfdCBtYXhfc2l6ZTsKLSAgICAgICAgICAgIGVyciA9IG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlLT5nZXRNYXhTYW1wbGVTaXplKCZtYXhfc2l6ZSk7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobWF4X3NpemUgIT0gMCkgewotICAgICAgICAgICAgICAgIC8vIEFzc3VtZSB0aGF0IGEgZ2l2ZW4gYnVmZmVyIG9ubHkgY29udGFpbnMgYXQgbW9zdCAxMCBjaHVua3MsCi0gICAgICAgICAgICAgICAgLy8gZWFjaCBjaHVuayBvcmlnaW5hbGx5IHByZWZpeGVkIHdpdGggYSAyIGJ5dGUgbGVuZ3RoIHdpbGwKLSAgICAgICAgICAgICAgICAvLyBoYXZlIGEgNCBieXRlIGhlYWRlciAoMHgwMCAweDAwIDB4MDAgMHgwMSkgYWZ0ZXIgY29udmVyc2lvbiwKLSAgICAgICAgICAgICAgICAvLyBhbmQgdGh1cyB3aWxsIGdyb3cgYnkgMiBieXRlcyBwZXIgY2h1bmsuCi0gICAgICAgICAgICAgICAgaWYgKG1heF9zaXplID4gU0laRV9NQVggLSAxMCAqIDIpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIm1heCBzYW1wbGUgc2l6ZSB0b28gYmlnOiAlenUiLCBtYXhfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIG1heF9zaXplICsgMTAgKiAyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gTm8gc2l6ZSB3YXMgc3BlY2lmaWVkLiBQaWNrIGEgY29uc2VydmF0aXZlbHkgbGFyZ2Ugc2l6ZS4KLSAgICAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgaGVpZ2h0OwotICAgICAgICAgICAgICAgIGlmICghbUxhc3RUcmFjay0+bWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgKGludDMyX3QqKSZ3aWR0aCkgfHwKLSAgICAgICAgICAgICAgICAgICAgIW1MYXN0VHJhY2stPm1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LChpbnQzMl90KikgJmhlaWdodCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk5vIHdpZHRoIG9yIGhlaWdodCwgYXNzdW1pbmcgd29yc3QgY2FzZSAxMDgwcCIpOwotICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IDE5MjA7Ci0gICAgICAgICAgICAgICAgICAgIGhlaWdodCA9IDEwODA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQSByZXNvbHV0aW9uIHdhcyBzcGVjaWZpZWQsIGNoZWNrIHRoYXQgaXQncyBub3QgdG9vIGJpZy4gVGhlIHZhbHVlcyBiZWxvdwotICAgICAgICAgICAgICAgICAgICAvLyB3ZXJlIGNob3NlbiBzbyB0aGF0IHRoZSBjYWxjdWxhdGlvbnMgYmVsb3cgZG9uJ3QgY2F1c2Ugb3ZlcmZsb3dzLCB0aGV5J3JlCi0gICAgICAgICAgICAgICAgICAgIC8vIG5vdCBpbmRpY2F0aW5nIHRoYXQgcmVzb2x1dGlvbnMgdXAgdG8gMzJreDMyayBhcmUgYWN0dWFsbHkgc3VwcG9ydGVkLgotICAgICAgICAgICAgICAgICAgICBpZiAod2lkdGggPiAzMjc2OCB8fCBoZWlnaHQgPiAzMjc2OCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoImNhbid0IHN1cHBvcnQgJXUgeCAldSB2aWRlbyIsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobUxhc3RUcmFjay0+bWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOwotICAgICAgICAgICAgICAgIGlmICghc3RyY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQykKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFzdHJjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQykpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQVZDICYgSEVWQyByZXF1aXJlcyBjb21wcmVzc2lvbiByYXRpbyBvZiBhdCBsZWFzdCAyLCBhbmQgdXNlcwotICAgICAgICAgICAgICAgICAgICAvLyBtYWNyb2Jsb2NrcwotICAgICAgICAgICAgICAgICAgICBtYXhfc2l6ZSA9ICgod2lkdGggKyAxNSkgLyAxNikgKiAoKGhlaWdodCArIDE1KSAvIDE2KSAqIDE5MjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBGb3IgYWxsIG90aGVyIGZvcm1hdHMgdGhlcmUgaXMgbm8gbWluaW11bSBjb21wcmVzc2lvbgotICAgICAgICAgICAgICAgICAgICAvLyByYXRpby4gVXNlIGNvbXByZXNzaW9uIHJhdGlvIG9mIDEuCi0gICAgICAgICAgICAgICAgICAgIG1heF9zaXplID0gd2lkdGggKiBoZWlnaHQgKiAzIC8gMjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gSEFDSzogYWxsb3cgMTAlIG92ZXJoZWFkCi0gICAgICAgICAgICAgICAgLy8gVE9ETzogcmVhZCBzYW1wbGUgc2l6ZSBmcm9tIHRyYWYgYXRvbSBmb3IgZnJhZ21lbnRlZCBNUEVHNC4KLSAgICAgICAgICAgICAgICBtYXhfc2l6ZSArPSBtYXhfc2l6ZSAvIDEwOwotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIG1heF9zaXplKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gTk9URTogc2V0dGluZyBhbm90aGVyIHBpZWNlIG9mIG1ldGFkYXRhIGludmFsaWRhdGVzIGFueSBwb2ludGVycyAoc3VjaCBhcyB0aGUKLSAgICAgICAgICAgIC8vIG1pbWV0eXBlKSBwcmV2aW91c2x5IG9idGFpbmVkLCBzbyBkb24ndCBjYWNoZSB0aGVtLgotICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICAgICAgICAgIENIRUNLKG1MYXN0VHJhY2stPm1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKLSAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBhdmVyYWdlIGZyYW1lIHJhdGUuCi0gICAgICAgICAgICBpZiAoIXN0cm5jYXNlY21wKCJ2aWRlby8iLCBtaW1lLCA2KSkgewotICAgICAgICAgICAgICAgIHNpemVfdCBuU2FtcGxlcyA9IG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlLT5jb3VudFNhbXBsZXMoKTsKLSAgICAgICAgICAgICAgICBpZiAoblNhbXBsZXMgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRyYWNrSWQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrLT5tZXRhLT5maW5kSW50MzIoa0tleVRyYWNrSUQsICZ0cmFja0lkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJleC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyZXggKnQgPSAmbVRyZXguZWRpdEl0ZW1BdChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC0+dHJhY2tfSUQgPT0gKHVpbnQzMl90KSB0cmFja0lkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LT5kZWZhdWx0X3NhbXBsZV9kdXJhdGlvbiA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVSYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+dGltZXNjYWxlIC8gdC0+ZGVmYXVsdF9zYW1wbGVfZHVyYXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5RnJhbWVSYXRlLCBmcmFtZVJhdGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2stPm1ldGEtPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvblVzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR1cmF0aW9uVXMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZVJhdGUgPSAoblNhbXBsZXMgKiAxMDAwMDAwTEwgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkdXJhdGlvblVzID4+IDEpKSAvIGR1cmF0aW9uVXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleUZyYW1lUmF0ZSwgZnJhbWVSYXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIEZPVVJDQygncycsICd0JywgJ3QnLCAncycpOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKG1MYXN0VHJhY2sgPT0gTlVMTCkgfHwgKG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlID09IE5VTEwpKQotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0KLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKLQotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0KLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZS0+c2V0VGltZVRvU2FtcGxlUGFyYW1zKAotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgRk9VUkNDKCdjJywgJ3QnLCAndCcsICdzJyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgobUxhc3RUcmFjayA9PSBOVUxMKSB8fCAobUxhc3RUcmFjay0+c2FtcGxlVGFibGUgPT0gTlVMTCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLQotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPQotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlLT5zZXRDb21wb3NpdGlvblRpbWVUb1NhbXBsZVBhcmFtcygKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOwotCi0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIEZPVVJDQygncycsICd0JywgJ3MnLCAncycpOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKG1MYXN0VHJhY2sgPT0gTlVMTCkgfHwgKG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlID09IE5VTEwpKQotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0KLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKLQotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0KLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZS0+c2V0U3luY1NhbXBsZVBhcmFtcygKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOwotCi0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBceEE5eHl6Ci0gICAgICAgIGNhc2UgRk9VUkNDKDB4QTksICd4JywgJ3knLCAneicpOgotICAgICAgICB7Ci0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7Ci0KLSAgICAgICAgICAgIC8vIEJlc3QgY2FzZSB0aGUgdG90YWwgZGF0YSBsZW5ndGggaW5zaWRlICJceEE5eHl6IiBib3ggd291bGQKLSAgICAgICAgICAgIC8vIGJlIDksIGZvciBpbnN0YW5jZSAiXHhBOXh5eiIgKyAiXHgwMFx4MDVceDE1XHhjNyIgKyAiKzArMC8iLAotICAgICAgICAgICAgLy8gd2hlcmUgIlx4MDBceDA1IiBpcyB0aGUgdGV4dCBzdHJpbmcgbGVuZ3RoIHdpdGggdmFsdWUgPSA1LAotICAgICAgICAgICAgLy8gIlwweDE1XHhjNyIgaXMgdGhlIGxhbmd1YWdlIGNvZGUgPSBlbiwgYW5kICIrMCswLyIgaXMgYQotICAgICAgICAgICAgLy8gbG9jYXRpb24gKHN0cmluZykgdmFsdWUgd2l0aCBsb25naXR1ZGUgPSAwIGFuZCBsYXRpdHVkZSA9IDAuCi0gICAgICAgICAgICAvLyBTaW5jZSBzb21lIGRldmljZXMgZW5jb3VudGVyZWQgaW4gdGhlIHdpbGQgb21pdCB0aGUgdHJhaWxpbmcKLSAgICAgICAgICAgIC8vIHNsYXNoLCB3ZSdsbCBhbGxvdyB0aGF0LgotICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IDgpIHsgLy8gOCBpbnN0ZWFkIG9mIDkgdG8gYWxsb3cgZm9yIG1pc3NpbmcgLwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHVpbnQxNl90IGxlbjsKLSAgICAgICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQxNihkYXRhX29mZnNldCwgJmxlbikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGFsbG93ICIrMCswIiB3aXRob3V0IHRyYWlsaW5nIHNsYXNoCi0gICAgICAgICAgICBpZiAobGVuIDwgNCB8fCBsZW4gPiBjaHVua19kYXRhX3NpemUgLSA0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFRoZSBsb2NhdGlvbiBzdHJpbmcgZm9sbG93aW5nIHRoZSBsYW5ndWFnZSBjb2RlIGlzIGZvcm1hdHRlZAotICAgICAgICAgICAgLy8gYWNjb3JkaW5nIHRvIElTTyA2NzA5OjIwMDggKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT182NzA5KS4KLSAgICAgICAgICAgIC8vIEFsbG9jYXRlIDIgZXh0cmEgYnl0ZXMsIGluIGNhc2Ugd2UgbmVlZCB0byBhZGQgYSB0cmFpbGluZyBzbGFzaCwKLSAgICAgICAgICAgIC8vIGFuZCB0byBhZGQgYSB0ZXJtaW5hdGluZyAwLgotICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGNoYXJbXT4gYnVmZmVyKG5ldyAoc3RkOjpub3Rocm93KSBjaGFyW2xlbisyXSgpKTsKLSAgICAgICAgICAgIGlmICghYnVmZmVyKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCArIDQsICZidWZmZXJbMF0sIGxlbikgPCBsZW4pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGxlbiA9IHN0cmxlbigmYnVmZmVyWzBdKTsKLSAgICAgICAgICAgIGlmIChsZW4gPCA0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEFkZCBhIHRyYWlsaW5nIHNsYXNoIGlmIHRoZXJlIHdhc24ndCBvbmUuCi0gICAgICAgICAgICBpZiAoYnVmZmVyW2xlbiAtIDFdICE9ICcvJykgewotICAgICAgICAgICAgICAgIGJ1ZmZlcltsZW5dID0gJy8nOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS0+c2V0Q1N0cmluZyhrS2V5TG9jYXRpb24sICZidWZmZXJbMF0pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIEZPVVJDQygnZScsICdzJywgJ2QnLCAncycpOgotICAgICAgICB7Ci0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7Ci0KLSAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPCA0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdWludDhfdCBidWZmZXJbMjU2XTsKLSAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPiAob2ZmNjRfdClzaXplb2YoYnVmZmVyKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9CVUZGRVJfVE9PX1NNQUxMOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBidWZmZXIsIGNodW5rX2RhdGFfc2l6ZSkgPCBjaHVua19kYXRhX3NpemUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChVMzJfQVQoYnVmZmVyKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gU2hvdWxkIGJlIHZlcnNpb24gMCwgZmxhZ3MgMC4KLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0KLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldERhdGEoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlFU0RTLCBrVHlwZUVTRFMsICZidWZmZXJbNF0sIGNodW5rX2RhdGFfc2l6ZSAtIDQpOwotCi0gICAgICAgICAgICBpZiAobVBhdGguc2l6ZSgpID49IDIKLSAgICAgICAgICAgICAgICAgICAgJiYgbVBhdGhbbVBhdGguc2l6ZSgpIC0gMl0gPT0gRk9VUkNDKCdtJywgJ3AnLCAnNCcsICdhJykpIHsKLSAgICAgICAgICAgICAgICAvLyBJbmZvcm1hdGlvbiBmcm9tIHRoZSBFU0RTIG11c3QgYmUgcmVsaWVkIG9uIGZvciBwcm9wZXIKLSAgICAgICAgICAgICAgICAvLyBzZXR1cCBvZiBzYW1wbGUgcmF0ZSBhbmQgY2hhbm5lbCBjb3VudCBmb3IgTVBFRzQgQXVkaW8uCi0gICAgICAgICAgICAgICAgLy8gVGhlIGdlbmVyaWMgaGVhZGVyIGFwcGVhcnMgdG8gb25seSBjb250YWluIGdlbmVyaWMKLSAgICAgICAgICAgICAgICAvLyBpbmZvcm1hdGlvbi4uLgotCi0gICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gdXBkYXRlQXVkaW9UcmFja0luZm9Gcm9tRVNEU19NUEVHNEF1ZGlvKAotICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlcls0XSwgY2h1bmtfZGF0YV9zaXplIC0gNCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1QYXRoLnNpemUoKSA+PSAyCi0gICAgICAgICAgICAgICAgICAgICYmIG1QYXRoW21QYXRoLnNpemUoKSAtIDJdID09IEZPVVJDQygnbScsICdwJywgJzQnLCAndicpKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHZpZGVvIGlzIE1QRUcyCi0gICAgICAgICAgICAgICAgRVNEUyBlc2RzKCZidWZmZXJbNF0sIGNodW5rX2RhdGFfc2l6ZSAtIDQpOwotCi0gICAgICAgICAgICAgICAgdWludDhfdCBvYmplY3RUeXBlSW5kaWNhdGlvbjsKLSAgICAgICAgICAgICAgICBpZiAoZXNkcy5nZXRPYmplY3RUeXBlSW5kaWNhdGlvbigmb2JqZWN0VHlwZUluZGljYXRpb24pID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3RUeXBlSW5kaWNhdGlvbiA+PSAweDYwICYmIG9iamVjdFR5cGVJbmRpY2F0aW9uIDw9IDB4NjUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgRk9VUkNDKCdiJywgJ3QnLCAncicsICd0Jyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKLSAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1aW50OF90IGJ1ZmZlclsxMl07Ci0gICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplICE9IHNpemVvZihidWZmZXIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCi0gICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBidWZmZXIsIGNodW5rX2RhdGFfc2l6ZSkgPCBjaHVua19kYXRhX3NpemUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IG1heEJpdHJhdGUgPSBVMzJfQVQoJmJ1ZmZlcls0XSk7Ci0gICAgICAgICAgICB1aW50MzJfdCBhdmdCaXRyYXRlID0gVTMyX0FUKCZidWZmZXJbOF0pOwotICAgICAgICAgICAgaWYgKG1heEJpdHJhdGUgPiAwICYmIG1heEJpdHJhdGUgPCBJTlQzMl9NQVgpIHsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5TWF4Qml0UmF0ZSwgKGludDMyX3QpbWF4Qml0cmF0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYXZnQml0cmF0ZSA+IDAgJiYgYXZnQml0cmF0ZSA8IElOVDMyX01BWCkgewotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDMyKGtLZXlCaXRSYXRlLCAoaW50MzJfdClhdmdCaXRyYXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2EnLCAndicsICdjJywgJ0MnKToKLSAgICAgICAgewotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwotCi0gICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcihjaHVua19kYXRhX3NpemUpOwotCi0gICAgICAgICAgICBpZiAoYnVmZmVyLT5kYXRhKCkgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJiLzI4NDcxMjA2Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgYnVmZmVyLT5kYXRhKCksIGNodW5rX2RhdGFfc2l6ZSkgPCBjaHVua19kYXRhX3NpemUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLQotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0RGF0YSgKLSAgICAgICAgICAgICAgICAgICAga0tleUFWQ0MsIGtUeXBlQVZDQywgYnVmZmVyLT5kYXRhKCksIGNodW5rX2RhdGFfc2l6ZSk7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdoJywgJ3YnLCAnYycsICdDJyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKGNodW5rX2RhdGFfc2l6ZSk7Ci0KLSAgICAgICAgICAgIGlmIChidWZmZXItPmRhdGEoKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImIvMjg0NzEyMDYiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBidWZmZXItPmRhdGEoKSwgY2h1bmtfZGF0YV9zaXplKSA8IGNodW5rX2RhdGFfc2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotCi0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXREYXRhKAotICAgICAgICAgICAgICAgICAgICBrS2V5SFZDQywga1R5cGVIVkNDLCBidWZmZXItPmRhdGEoKSwgY2h1bmtfZGF0YV9zaXplKTsKLQotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIEZPVVJDQygnZCcsICcyJywgJzYnLCAnMycpOgotICAgICAgICB7Ci0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogZDI2MyBjb250YWlucyBhIGZpeGVkIDcgYnl0ZXMgcGFydDoKLSAgICAgICAgICAgICAqICAgdmVuZG9yIC0gNCBieXRlcwotICAgICAgICAgICAgICogICB2ZXJzaW9uIC0gMSBieXRlCi0gICAgICAgICAgICAgKiAgIGxldmVsIC0gMSBieXRlCi0gICAgICAgICAgICAgKiAgIHByb2ZpbGUgLSAxIGJ5dGUKLSAgICAgICAgICAgICAqIG9wdGlvbmFsbHksICJkMjYzIiBib3ggaXRzZWxmIG1heSBjb250YWluIGEgMTYtYnl0ZQotICAgICAgICAgICAgICogYml0IHJhdGUgYm94IChiaXRyKQotICAgICAgICAgICAgICogICBhdmVyYWdlIGJpdCByYXRlIC0gNCBieXRlcwotICAgICAgICAgICAgICogICBtYXggYml0IHJhdGUgLSA0IGJ5dGVzCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGNoYXIgYnVmZmVyWzIzXTsKLSAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgIT0gNyAmJgotICAgICAgICAgICAgICAgIGNodW5rX2RhdGFfc2l6ZSAhPSAyMykgewotICAgICAgICAgICAgICAgIEFMT0dFKCJJbmNvcnJlY3QgRDI2MyBib3ggc2l6ZSAlbGxkIiwgKGxvbmcgbG9uZyljaHVua19kYXRhX3NpemUpOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAotICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgYnVmZmVyLCBjaHVua19kYXRhX3NpemUpIDwgY2h1bmtfZGF0YV9zaXplKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0KLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldERhdGEoa0tleUQyNjMsIGtUeXBlRDI2MywgYnVmZmVyLCBjaHVua19kYXRhX3NpemUpOwotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ2UnLCAndCcsICdhJyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG9mZjY0X3Qgc3RvcF9vZmZzZXQgPSAqb2Zmc2V0ICsgY2h1bmtfc2l6ZTsKLSAgICAgICAgICAgICpvZmZzZXQgPSBkYXRhX29mZnNldDsKLSAgICAgICAgICAgIGJvb2wgaXNQYXJzaW5nTWV0YUtleXMgPSB1bmRlclFUTWV0YVBhdGgobVBhdGgsIDIpOwotICAgICAgICAgICAgaWYgKCFpc1BhcnNpbmdNZXRhS2V5cykgewotICAgICAgICAgICAgICAgIHVpbnQ4X3QgYnVmZmVyWzRdOwotICAgICAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPCAob2ZmNjRfdClzaXplb2YoYnVmZmVyKSkgewotICAgICAgICAgICAgICAgICAgICAqb2Zmc2V0ID0gc3RvcF9vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGJ1ZmZlciwgNCkgPCA0KSB7Ci0gICAgICAgICAgICAgICAgICAgICpvZmZzZXQgPSBzdG9wX29mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChVMzJfQVQoYnVmZmVyKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNob3VsZCBiZSB2ZXJzaW9uIDAsIGZsYWdzIDAuCi0KLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgaXQncyBub3QsIGxldCdzIGFzc3VtZSB0aGlzIGlzIG9uZSBvZiB0aG9zZQotICAgICAgICAgICAgICAgICAgICAvLyBhcHBhcmVudGx5IG1hbGZvcm1lZCBjaHVua3MgdGhhdCBkb24ndCBoYXZlIGZsYWdzCi0gICAgICAgICAgICAgICAgICAgIC8vIGFuZCBjb21wbGV0ZWx5IGRpZmZlcmVudCBzZW1hbnRpY3MgdGhhbiB3aGF0J3MKLSAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIE1QRUc0IHNwZWNzIGFuZCBza2lwIGl0LgotICAgICAgICAgICAgICAgICAgICAqb2Zmc2V0ID0gc3RvcF9vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKm9mZnNldCArPSAgc2l6ZW9mKGJ1ZmZlcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHdoaWxlICgqb2Zmc2V0IDwgc3RvcF9vZmZzZXQpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUNodW5rKG9mZnNldCwgZGVwdGggKyAxKTsKLSAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoKm9mZnNldCAhPSBzdG9wX29mZnNldCkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgRk9VUkNDKCdpJywgJ2wnLCAnbycsICdjJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdpJywgJ2knLCAnbicsICdmJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdpJywgJ3AnLCAncicsICdwJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdwJywgJ2knLCAndCcsICdtJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdpJywgJ2QnLCAnYScsICd0Jyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdpJywgJ3InLCAnZScsICdmJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdpJywgJ3AnLCAncicsICdvJyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChtSXNIRUlGKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1JdGVtVGFibGUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBtSXRlbVRhYmxlID0gbmV3IEl0ZW1UYWJsZShtRGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1JdGVtVGFibGUtPnBhcnNlKAotICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtfdHlwZSwgZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnZScsICdhJywgJ24nKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ24nLCAnYScsICdtJywgJ2UnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2QnLCAnYScsICd0JywgJ2EnKToKLSAgICAgICAgewotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwotCi0gICAgICAgICAgICBpZiAobVBhdGguc2l6ZSgpID09IDYgJiYgdW5kZXJNZXRhRGF0YVBhdGgobVBhdGgpKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VJVHVuZXNNZXRhRGF0YShkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKLQotICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAndicsICdoJywgJ2QnKToKLSAgICAgICAgewotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwotCi0gICAgICAgICAgICBpZiAoZGVwdGggIT0gMSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJtdmhkOiBkZXB0aCAlZCIsIGRlcHRoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IDMyKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdWludDhfdCBoZWFkZXJbMzJdOwotICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkKLSAgICAgICAgICAgICAgICAgICAgPCAoc3NpemVfdClzaXplb2YoaGVhZGVyKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdWludDY0X3QgY3JlYXRpb25UaW1lOwotICAgICAgICAgICAgdWludDY0X3QgZHVyYXRpb24gPSAwOwotICAgICAgICAgICAgaWYgKGhlYWRlclswXSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgY3JlYXRpb25UaW1lID0gVTY0X0FUKCZoZWFkZXJbNF0pOwotICAgICAgICAgICAgICAgIG1IZWFkZXJUaW1lc2NhbGUgPSBVMzJfQVQoJmhlYWRlclsyMF0pOwotICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gVTY0X0FUKCZoZWFkZXJbMjRdKTsKLSAgICAgICAgICAgICAgICBpZiAoZHVyYXRpb24gPT0gMHhmZmZmZmZmZmZmZmZmZmZmKSB7Ci0gICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGhlYWRlclswXSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY3JlYXRpb25UaW1lID0gVTMyX0FUKCZoZWFkZXJbNF0pOwotICAgICAgICAgICAgICAgIG1IZWFkZXJUaW1lc2NhbGUgPSBVMzJfQVQoJmhlYWRlclsxMl0pOwotICAgICAgICAgICAgICAgIHVpbnQzMl90IGQzMiA9IFUzMl9BVCgmaGVhZGVyWzE2XSk7Ci0gICAgICAgICAgICAgICAgaWYgKGQzMiA9PSAweGZmZmZmZmZmKSB7Ci0gICAgICAgICAgICAgICAgICAgIGQzMiA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gZDMyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGR1cmF0aW9uICE9IDAgJiYgbUhlYWRlclRpbWVzY2FsZSAhPSAwICYmIGR1cmF0aW9uIDwgVUlOVDY0X01BWCAvIDEwMDAwMDApIHsKLSAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uICogMTAwMDAwMCAvIG1IZWFkZXJUaW1lc2NhbGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmc4IHM7Ci0gICAgICAgICAgICBpZiAoY29udmVydFRpbWVUb0RhdGUoY3JlYXRpb25UaW1lLCAmcykpIHsKLSAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLT5zZXRDU3RyaW5nKGtLZXlEYXRlLCBzLnN0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ2UnLCAnaCcsICdkJyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKLQotICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IDgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1aW50OF90IGZsYWdzWzRdOwotICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgZmxhZ3MsIHNpemVvZihmbGFncykpCi0gICAgICAgICAgICAgICAgICAgIDwgKHNzaXplX3Qpc2l6ZW9mKGZsYWdzKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdWludDY0X3QgZHVyYXRpb24gPSAwOwotICAgICAgICAgICAgaWYgKGZsYWdzWzBdID09IDEpIHsKLSAgICAgICAgICAgICAgICAvLyA2NCBiaXQKLSAgICAgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgMTIpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbURhdGFTb3VyY2UtPmdldFVJbnQ2NChkYXRhX29mZnNldCArIDQsICZkdXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgaWYgKGR1cmF0aW9uID09IDB4ZmZmZmZmZmZmZmZmZmZmZikgewotICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChmbGFnc1swXSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gMzIgYml0Ci0gICAgICAgICAgICAgICAgdWludDMyX3QgZDMyOwotICAgICAgICAgICAgICAgIG1EYXRhU291cmNlLT5nZXRVSW50MzIoZGF0YV9vZmZzZXQgKyA0LCAmZDMyKTsKLSAgICAgICAgICAgICAgICBpZiAoZDMyID09IDB4ZmZmZmZmZmYpIHsKLSAgICAgICAgICAgICAgICAgICAgZDMyID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZHVyYXRpb24gPSBkMzI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChkdXJhdGlvbiAhPSAwICYmIG1IZWFkZXJUaW1lc2NhbGUgIT0gMCkgewotICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb24gKiAxMDAwMDAwIC8gbUhlYWRlclRpbWVzY2FsZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnZCcsICdhJywgJ3QnKToKLSAgICAgICAgewotICAgICAgICAgICAgQUxPR1YoIm1kYXQgY2h1bmssIGRybTogJWQiLCBtSXNEcm0pOwotCi0gICAgICAgICAgICBtTWRhdEZvdW5kID0gdHJ1ZTsKLQotICAgICAgICAgICAgaWYgKCFtSXNEcm0pIHsKLSAgICAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjaHVua19zaXplIDwgOCkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBwYXJzZURybVNJTkYob2Zmc2V0LCBkYXRhX29mZnNldCk7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIEZPVVJDQygnaCcsICdkJywgJ2wnLCAncicpOgotICAgICAgICB7Ci0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7Ci0KLSAgICAgICAgICAgIGlmICh1bmRlclFUTWV0YVBhdGgobVBhdGgsIDMpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IGJ1ZmZlcjsKLSAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQgKyA4LCAmYnVmZmVyLCA0KSA8IDQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IHR5cGUgPSBudG9obChidWZmZXIpOwotICAgICAgICAgICAgLy8gRm9yIHRoZSAzR1BQIGZpbGUgZm9ybWF0LCB0aGUgaGFuZGxlci10eXBlIHdpdGhpbiB0aGUgJ2hkbHInIGJveAotICAgICAgICAgICAgLy8gc2hhbGwgYmUgJ3RleHQnLiBXZSBhbHNvIHdhbnQgdG8gc3VwcG9ydCAnc2J0bCcgaGFuZGxlciB0eXBlCi0gICAgICAgICAgICAvLyBmb3IgYSBwcmFjdGljYWwgcmVhc29uIGFzIHZhcmlvdXMgTVBFRzQgY29udGFpbmVycyB1c2UgaXQuCi0gICAgICAgICAgICBpZiAodHlwZSA9PSBGT1VSQ0MoJ3QnLCAnZScsICd4JywgJ3QnKSB8fCB0eXBlID09IEZPVVJDQygncycsICdiJywgJ3QnLCAnbCcpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVEVYVF8zR1BQKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2snLCAnZScsICd5JywgJ3MnKToKLSAgICAgICAgewotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwotCi0gICAgICAgICAgICBpZiAodW5kZXJRVE1ldGFQYXRoKG1QYXRoLCAzKSkgewotICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlUVRNZXRhS2V5KGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOwotICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgRk9VUkNDKCd0JywgJ3InLCAnZScsICd4Jyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKLQotICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IDI0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgVHJleCB0cmV4OwotICAgICAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKGRhdGFfb2Zmc2V0ICsgNCwgJnRyZXgudHJhY2tfSUQpIHx8Ci0gICAgICAgICAgICAgICAgIW1EYXRhU291cmNlLT5nZXRVSW50MzIoZGF0YV9vZmZzZXQgKyA4LCAmdHJleC5kZWZhdWx0X3NhbXBsZV9kZXNjcmlwdGlvbl9pbmRleCkgfHwKLSAgICAgICAgICAgICAgICAhbURhdGFTb3VyY2UtPmdldFVJbnQzMihkYXRhX29mZnNldCArIDEyLCAmdHJleC5kZWZhdWx0X3NhbXBsZV9kdXJhdGlvbikgfHwKLSAgICAgICAgICAgICAgICAhbURhdGFTb3VyY2UtPmdldFVJbnQzMihkYXRhX29mZnNldCArIDE2LCAmdHJleC5kZWZhdWx0X3NhbXBsZV9zaXplKSB8fAotICAgICAgICAgICAgICAgICFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKGRhdGFfb2Zmc2V0ICsgMjAsICZ0cmV4LmRlZmF1bHRfc2FtcGxlX2ZsYWdzKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1UcmV4LmFkZCh0cmV4KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAneCcsICczJywgJ2cnKToKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotCi0gICAgICAgICAgICB1aW50MzJfdCB0eXBlOwotICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YTsKLSAgICAgICAgICAgIHNpemVfdCBzaXplID0gMDsKLSAgICAgICAgICAgIGlmICghbUxhc3RUcmFjay0+bWV0YS0+ZmluZERhdGEoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlUZXh0Rm9ybWF0RGF0YSwgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKLSAgICAgICAgICAgICAgICBzaXplID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKChjaHVua19zaXplID4gU0laRV9NQVgpIHx8IChTSVpFX01BWCAtIGNodW5rX3NpemUgPD0gc2l6ZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1aW50OF90ICpidWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgdWludDhfdFtzaXplICsgY2h1bmtfc2l6ZV07Ci0gICAgICAgICAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc2l6ZSA+IDApIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoYnVmZmVyLCBkYXRhLCBzaXplKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKChzaXplX3QpKG1EYXRhU291cmNlLT5yZWFkQXQoKm9mZnNldCwgYnVmZmVyICsgc2l6ZSwgY2h1bmtfc2l6ZSkpCi0gICAgICAgICAgICAgICAgICAgIDwgY2h1bmtfc2l6ZSkgewotICAgICAgICAgICAgICAgIGRlbGV0ZVtdIGJ1ZmZlcjsKLSAgICAgICAgICAgICAgICBidWZmZXIgPSBOVUxMOwotCi0gICAgICAgICAgICAgICAgLy8gYWR2YW5jZSByZWFkIHBvaW50ZXIgc28gd2UgZG9uJ3QgZW5kIHVwIHJlYWRpbmcgdGhpcyBhZ2FpbgotICAgICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldERhdGEoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlUZXh0Rm9ybWF0RGF0YSwgMCwgYnVmZmVyLCBzaXplICsgY2h1bmtfc2l6ZSk7Ci0KLSAgICAgICAgICAgIGRlbGV0ZVtdIGJ1ZmZlcjsKLQotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIEZPVVJDQygnYycsICdvJywgJ3YnLCAncicpOgotICAgICAgICB7Ci0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7Ci0KLSAgICAgICAgICAgIGlmIChtRmlsZU1ldGFEYXRhICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiY2h1bmtfZGF0YV9zaXplID0gJSIgUFJJZDY0ICIgYW5kIGRhdGFfb2Zmc2V0ID0gJSIgUFJJZDY0LAotICAgICAgICAgICAgICAgICAgICAgIGNodW5rX2RhdGFfc2l6ZSwgZGF0YV9vZmZzZXQpOwotCi0gICAgICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IDAgfHwgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGNodW5rX2RhdGFfc2l6ZSkgPj0gU0laRV9NQVggLSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKGNodW5rX2RhdGFfc2l6ZSArIDEpOwotICAgICAgICAgICAgICAgIGlmIChidWZmZXItPmRhdGEoKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJiLzI4NDcxMjA2Iik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAotICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgYnVmZmVyLT5kYXRhKCksIGNodW5rX2RhdGFfc2l6ZSkgIT0gKHNzaXplX3QpY2h1bmtfZGF0YV9zaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50IGtTa2lwQnl0ZXNPZkRhdGFCb3ggPSAxNjsKLSAgICAgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDw9IGtTa2lwQnl0ZXNPZkRhdGFCb3gpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLT5zZXREYXRhKAotICAgICAgICAgICAgICAgICAgICBrS2V5QWxidW1BcnQsIE1ldGFEYXRhOjpUWVBFX05PTkUsCi0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpICsga1NraXBCeXRlc09mRGF0YUJveCwgY2h1bmtfZGF0YV9zaXplIC0ga1NraXBCeXRlc09mRGF0YUJveCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2MnLCAnbycsICdsJywgJ3InKToKLSAgICAgICAgewotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwotICAgICAgICAgICAgLy8gdGhpcyBtdXN0IGJlIGluIGEgVmlzdWFsU2FtcGxlRW50cnkgYm94IHVuZGVyIHRoZSBTYW1wbGUgRGVzY3JpcHRpb24gQm94ICgnc3RzZCcpCi0gICAgICAgICAgICAvLyBpZ25vcmUgb3RoZXJ3aXNlCi0gICAgICAgICAgICBpZiAoZGVwdGggPj0gMiAmJiBtUGF0aFtkZXB0aCAtIDJdID09IEZPVVJDQygncycsICd0JywgJ3MnLCAnZCcpKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VDb2xvckluZm8oZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIEZPVVJDQygndCcsICdpJywgJ3QnLCAnbCcpOgotICAgICAgICBjYXNlIEZPVVJDQygncCcsICdlJywgJ3InLCAnZicpOgotICAgICAgICBjYXNlIEZPVVJDQygnYScsICd1JywgJ3QnLCAnaCcpOgotICAgICAgICBjYXNlIEZPVVJDQygnZycsICduJywgJ3InLCAnZScpOgotICAgICAgICBjYXNlIEZPVVJDQygnYScsICdsJywgJ2InLCAnbScpOgotICAgICAgICBjYXNlIEZPVVJDQygneScsICdyJywgJ3InLCAnYycpOgotICAgICAgICB7Ci0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlM0dQUE1ldGFEYXRhKGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUsIGRlcHRoKTsKLQotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ0knLCAnRCcsICczJywgJzInKToKLSAgICAgICAgewotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwotCi0gICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgNikgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBhcnNlSUQzdjJNZXRhRGF0YShkYXRhX29mZnNldCArIDYpOwotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgRk9VUkNDKCctJywgJy0nLCAnLScsICctJyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1MYXN0Q29tbWVudE1lYW4uY2xlYXIoKTsKLSAgICAgICAgICAgIG1MYXN0Q29tbWVudE5hbWUuY2xlYXIoKTsKLSAgICAgICAgICAgIG1MYXN0Q29tbWVudERhdGEuY2xlYXIoKTsKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAnaScsICdkJywgJ3gnKToKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VTZWdtZW50SW5kZXgoZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7Ci0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKLSAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOyAvLyBzdG9wIHBhcnNpbmcgYWZ0ZXIgc2lkeAotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2EnLCAnYycsICctJywgJzMnKToKLSAgICAgICAgewotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwotICAgICAgICAgICAgcmV0dXJuIHBhcnNlQUMzU2FtcGxlRW50cnkoZGF0YV9vZmZzZXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2YnLCAndCcsICd5JywgJ3AnKToKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IDggfHwgZGVwdGggIT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG9mZjY0X3Qgc3RvcF9vZmZzZXQgPSAqb2Zmc2V0ICsgY2h1bmtfc2l6ZTsKLSAgICAgICAgICAgIHVpbnQzMl90IG51bUNvbXBhdGlibGVCcmFuZHMgPSAoY2h1bmtfZGF0YV9zaXplIC0gOCkgLyA0OwotICAgICAgICAgICAgc3RkOjpzZXQ8dWludDMyX3Q+IGJyYW5kU2V0OwotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1Db21wYXRpYmxlQnJhbmRzICsgMjsgKytpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGkgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIHRoaXMgaW5kZXgsIGl0IHJlZmVycyB0byB0aGUgbWlub3JWZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAvLyBub3QgYSBicmFuZC4KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdWludDMyX3QgYnJhbmQ7Ci0gICAgICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQgKyA0ICogaSwgJmJyYW5kLCA0KSA8IDQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBicmFuZCA9IG50b2hsKGJyYW5kKTsKLSAgICAgICAgICAgICAgICBicmFuZFNldC5pbnNlcnQoYnJhbmQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoYnJhbmRTZXQuY291bnQoRk9VUkNDKCdxJywgJ3QnLCAnICcsICcgJykpID4gMCkgewotICAgICAgICAgICAgICAgIG1Jc1FUID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYnJhbmRTZXQuY291bnQoRk9VUkNDKCdtJywgJ2knLCAnZicsICcxJykpID4gMAotICAgICAgICAgICAgICAgICAgICAmJiBicmFuZFNldC5jb3VudChGT1VSQ0MoJ2gnLCAnZScsICdpJywgJ2MnKSkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgbUlzSEVJRiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImlkZW50aWZpZWQgSEVJRiBpbWFnZSIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAqb2Zmc2V0ID0gc3RvcF9vZmZzZXQ7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgewotICAgICAgICAgICAgLy8gY2hlY2sgaWYgd2UncmUgcGFyc2luZyAnaWxzdCcgZm9yIG1ldGEga2V5cwotICAgICAgICAgICAgLy8gaWYgc28sIHRyZWF0IHR5cGUgYXMgYSBudW1iZXIgKGtleS1pZCkuCi0gICAgICAgICAgICBpZiAodW5kZXJRVE1ldGFQYXRoKG1QYXRoLCAzKSkgewotICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlUVRNZXRhVmFsKGNodW5rX3R5cGUsIGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOwotICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6cGFyc2VBQzNTYW1wbGVFbnRyeShvZmY2NF90IG9mZnNldCkgewotICAgIC8vIHNraXAgMTYgYnl0ZXM6Ci0gICAgLy8gICsgNi1ieXRlIHJlc2VydmVkLAotICAgIC8vICArIDItYnl0ZSBkYXRhIHJlZmVyZW5jZSBpbmRleCwKLSAgICAvLyAgKyA4LWJ5dGUgcmVzZXJ2ZWQKLSAgICBvZmZzZXQgKz0gMTY7Ci0gICAgdWludDE2X3QgY2hhbm5lbENvdW50OwotICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQxNihvZmZzZXQsICZjaGFubmVsQ291bnQpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotICAgIC8vIHNraXAgOCBieXRlczoKLSAgICAvLyAgKyAyLWJ5dGUgY2hhbm5lbENvdW50LAotICAgIC8vICArIDItYnl0ZSBzYW1wbGUgc2l6ZSwKLSAgICAvLyAgKyA0LWJ5dGUgcmVzZXJ2ZWQKLSAgICBvZmZzZXQgKz0gODsKLSAgICB1aW50MTZfdCBzYW1wbGVSYXRlOwotICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQxNihvZmZzZXQsICZzYW1wbGVSYXRlKSkgewotICAgICAgICBBTE9HRSgiTVBFRzRFeHRyYWN0b3I6IGVycm9yIHdoaWxlIHJlYWRpbmcgYWMtMyBibG9jazogY2Fubm90IHJlYWQgc2FtcGxlIHJhdGUiKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICAvLyBza2lwIDQgYnl0ZXM6Ci0gICAgLy8gICsgMi1ieXRlIHNhbXBsZVJhdGUsCi0gICAgLy8gICsgMi1ieXRlIHJlc2VydmVkCi0gICAgb2Zmc2V0ICs9IDQ7Ci0gICAgcmV0dXJuIHBhcnNlQUMzU3BlY2lmaWNCb3gob2Zmc2V0LCBzYW1wbGVSYXRlKTsKLX0KLQotc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlQUMzU3BlY2lmaWNCb3goCi0gICAgICAgIG9mZjY0X3Qgb2Zmc2V0LCB1aW50MTZfdCBzYW1wbGVSYXRlKSB7Ci0gICAgdWludDMyX3Qgc2l6ZTsKLSAgICAvLyArIDQtYnl0ZSBzaXplCi0gICAgLy8gKyA0LWJ5dGUgdHlwZQotICAgIC8vICsgMy1ieXRlIHBheWxvYWQKLSAgICBjb25zdCB1aW50MzJfdCBrQUMzU3BlY2lmaWNCb3hTaXplID0gMTE7Ci0gICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJnNpemUpIHx8IHNpemUgPCBrQUMzU3BlY2lmaWNCb3hTaXplKSB7Ci0gICAgICAgIEFMT0dFKCJNUEVHNEV4dHJhY3RvcjogZXJyb3Igd2hpbGUgcmVhZGluZyBhYy0zIGJsb2NrOiBjYW5ub3QgcmVhZCBzcGVjaWZpYyBib3ggc2l6ZSIpOwotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIG9mZnNldCArPSA0OwotICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJnR5cGUpIHx8IHR5cGUgIT0gRk9VUkNDKCdkJywgJ2EnLCAnYycsICczJykpIHsKLSAgICAgICAgQUxPR0UoIk1QRUc0RXh0cmFjdG9yOiBlcnJvciB3aGlsZSByZWFkaW5nIGFjLTMgc3BlY2lmaWMgYmxvY2s6IGhlYWRlciBub3QgZGFjMyIpOwotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIG9mZnNldCArPSA0OwotICAgIGNvbnN0IHVpbnQzMl90IGtBQzNTcGVjaWZpY0JveFBheWxvYWRTaXplID0gMzsKLSAgICB1aW50OF90IGNodW5rW2tBQzNTcGVjaWZpY0JveFBheWxvYWRTaXplXTsKLSAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIGNodW5rLCBzaXplb2YoY2h1bmspKSAhPSBzaXplb2YoY2h1bmspKSB7Ci0gICAgICAgIEFMT0dFKCJNUEVHNEV4dHJhY3RvcjogZXJyb3Igd2hpbGUgcmVhZGluZyBhYy0zIHNwZWNpZmljIGJsb2NrOiBiaXRzdHJlYW0gZmllbGRzIik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgQUJpdFJlYWRlciBicihjaHVuaywgc2l6ZW9mKGNodW5rKSk7Ci0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYW5uZWxDb3VudFRhYmxlW10gPSB7MiwgMSwgMiwgMywgMywgNCwgNCwgNX07Ci0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNhbXBsZVJhdGVUYWJsZVtdID0gezQ4MDAwLCA0NDEwMCwgMzIwMDB9OwotCi0gICAgdW5zaWduZWQgZnNjb2QgPSBici5nZXRCaXRzKDIpOwotICAgIGlmIChmc2NvZCA9PSAzKSB7Ci0gICAgICAgIEFMT0dFKCJJbmNvcnJlY3QgZnNjb2QgKDMpIGluIEFDMyBoZWFkZXIiKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0gICAgdW5zaWduZWQgYm94U2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGVUYWJsZVtmc2NvZF07Ci0gICAgaWYgKGJveFNhbXBsZVJhdGUgIT0gc2FtcGxlUmF0ZSkgewotICAgICAgICBBTE9HRSgic2FtcGxlIHJhdGUgbWlzbWF0Y2g6IGJveFNhbXBsZVJhdGUgPSAlZCwgc2FtcGxlUmF0ZSA9ICVkIiwKLSAgICAgICAgICAgIGJveFNhbXBsZVJhdGUsIHNhbXBsZVJhdGUpOwotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHVuc2lnbmVkIGJzaWQgPSBici5nZXRCaXRzKDUpOwotICAgIGlmIChic2lkID4gOCkgewotICAgICAgICBBTE9HVygiSW5jb3JyZWN0IGJzaWQgaW4gQUMzIGhlYWRlci4gUG9zc2libHkgRS1BQy0zPyIpOwotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIC8vIHNraXAKLSAgICB1bnNpZ25lZCBic21vZCBfX3VudXNlZCA9IGJyLmdldEJpdHMoMyk7Ci0KLSAgICB1bnNpZ25lZCBhY21vZCA9IGJyLmdldEJpdHMoMyk7Ci0gICAgdW5zaWduZWQgbGZlb24gPSBici5nZXRCaXRzKDEpOwotICAgIHVuc2lnbmVkIGNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudFRhYmxlW2FjbW9kXSArIGxmZW9uOwotCi0gICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLSAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUMzKTsKLSAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBjaGFubmVsQ291bnQpOwotICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVSYXRlKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZVNlZ21lbnRJbmRleChvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKLSAgQUxPR1YoIk1QRUc0RXh0cmFjdG9yOjpwYXJzZVNlZ21lbnRJbmRleCIpOwotCi0gICAgaWYgKHNpemUgPCAxMikgewotICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgdWludDMyX3QgZmxhZ3M7Ci0gICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJmZsYWdzKSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHVpbnQzMl90IHZlcnNpb24gPSBmbGFncyA+PiAyNDsKLSAgICBmbGFncyAmPSAweGZmZmZmZjsKLQotICAgIEFMT0dWKCJzaWR4IHZlcnNpb24gJWQiLCB2ZXJzaW9uKTsKLQotICAgIHVpbnQzMl90IHJlZmVyZW5jZUlkOwotICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQgKyA0LCAmcmVmZXJlbmNlSWQpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgdWludDMyX3QgdGltZVNjYWxlOwotICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQgKyA4LCAmdGltZVNjYWxlKSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLSAgICBBTE9HVigic2lkeCByZWZpZC90aW1lc2NhbGU6ICVkLyVkIiwgcmVmZXJlbmNlSWQsIHRpbWVTY2FsZSk7Ci0gICAgaWYgKHRpbWVTY2FsZSA9PSAwKQotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotCi0gICAgdWludDY0X3QgZWFybGllc3RQcmVzZW50YXRpb25UaW1lOwotICAgIHVpbnQ2NF90IGZpcnN0T2Zmc2V0OwotCi0gICAgb2Zmc2V0ICs9IDEyOwotICAgIHNpemUgLT0gMTI7Ci0KLSAgICBpZiAodmVyc2lvbiA9PSAwKSB7Ci0gICAgICAgIGlmIChzaXplIDwgOCkgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLSAgICAgICAgdWludDMyX3QgdG1wOwotICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmdG1wKSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotICAgICAgICBlYXJsaWVzdFByZXNlbnRhdGlvblRpbWUgPSB0bXA7Ci0gICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQgKyA0LCAmdG1wKSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotICAgICAgICBmaXJzdE9mZnNldCA9IHRtcDsKLSAgICAgICAgb2Zmc2V0ICs9IDg7Ci0gICAgICAgIHNpemUgLT0gODsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoc2l6ZSA8IDE2KSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50NjQob2Zmc2V0LCAmZWFybGllc3RQcmVzZW50YXRpb25UaW1lKSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50NjQob2Zmc2V0ICsgOCwgJmZpcnN0T2Zmc2V0KSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotICAgICAgICBvZmZzZXQgKz0gMTY7Ci0gICAgICAgIHNpemUgLT0gMTY7Ci0gICAgfQotICAgIEFMT0dWKCJzaWR4IHByZXMvb2ZmOiAlIiBQUkl1NjQgIi8lIiBQUkl1NjQsIGVhcmxpZXN0UHJlc2VudGF0aW9uVGltZSwgZmlyc3RPZmZzZXQpOwotCi0gICAgaWYgKHNpemUgPCA0KSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIHVpbnQxNl90IHJlZmVyZW5jZUNvdW50OwotICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQxNihvZmZzZXQgKyAyLCAmcmVmZXJlbmNlQ291bnQpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotICAgIG9mZnNldCArPSA0OwotICAgIHNpemUgLT0gNDsKLSAgICBBTE9HVigicmVmY291bnQ6ICVkIiwgcmVmZXJlbmNlQ291bnQpOwotCi0gICAgaWYgKHNpemUgPCByZWZlcmVuY2VDb3VudCAqIDEyKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIHVpbnQ2NF90IHRvdGFsX2R1cmF0aW9uID0gMDsKLSAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHJlZmVyZW5jZUNvdW50OyBpKyspIHsKLSAgICAgICAgdWludDMyX3QgZDEsIGQyLCBkMzsKLQotICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmZDEpIHx8ICAgICAvLyBzaXplCi0gICAgICAgICAgICAhbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQgKyA0LCAmZDIpIHx8IC8vIGR1cmF0aW9uCi0gICAgICAgICAgICAhbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQgKyA4LCAmZDMpKSB7IC8vIGZsYWdzCi0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGQxICYgMHg4MDAwMDAwMCkgewotICAgICAgICAgICAgQUxPR1coInN1Yi1zaWR4IGJveGVzIG5vdCBzdXBwb3J0ZWQgeWV0Iik7Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbCBzYXAgPSBkMyAmIDB4ODAwMDAwMDA7Ci0gICAgICAgIHVpbnQzMl90IHNhcHR5cGUgPSAoZDMgPj4gMjgpICYgNzsKLSAgICAgICAgaWYgKCFzYXAgfHwgKHNhcHR5cGUgIT0gMSAmJiBzYXB0eXBlICE9IDIpKSB7Ci0gICAgICAgICAgICAvLyB0eXBlIDEgYW5kIDIgYXJlIHN5bmMgc2FtcGxlcwotICAgICAgICAgICAgQUxPR1coIm5vdCBhIHN0cmVhbSBhY2Nlc3MgcG9pbnQsIG9yIHVuc3VwcG9ydGVkIHR5cGU6ICUwOHgiLCBkMyk7Ci0gICAgICAgIH0KLSAgICAgICAgdG90YWxfZHVyYXRpb24gKz0gZDI7Ci0gICAgICAgIG9mZnNldCArPSAxMjsKLSAgICAgICAgQUxPR1YoIiBpdGVtICVkLCAlMDh4ICUwOHggJTA4eCIsIGksIGQxLCBkMiwgZDMpOwotICAgICAgICBTaWR4RW50cnkgc2U7Ci0gICAgICAgIHNlLm1TaXplID0gZDEgJiAweDdmZmZmZmZmOwotICAgICAgICBzZS5tRHVyYXRpb25VcyA9IDEwMDAwMDBMTCAqIGQyIC8gdGltZVNjYWxlOwotICAgICAgICBtU2lkeEVudHJpZXMuYWRkKHNlKTsKLSAgICB9Ci0KLSAgICB1aW50NjRfdCBzaWR4RHVyYXRpb24gPSB0b3RhbF9kdXJhdGlvbiAqIDEwMDAwMDAgLyB0aW1lU2NhbGU7Ci0KLSAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotCi0gICAgaW50NjRfdCBtZXRhRHVyYXRpb247Ci0gICAgaWYgKCFtTGFzdFRyYWNrLT5tZXRhLT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmbWV0YUR1cmF0aW9uKSB8fCBtZXRhRHVyYXRpb24gPT0gMCkgewotICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIHNpZHhEdXJhdGlvbik7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlUVRNZXRhS2V5KG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgewotICAgIGlmIChzaXplIDwgOCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHVpbnQzMl90IGNvdW50OwotICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQgKyA0LCAmY291bnQpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgaWYgKG1NZXRhS2V5TWFwLnNpemUoKSA+IDApIHsKLSAgICAgICAgQUxPR1coIidrZXlzJyBhdG9tIHNlZW4gYWdhaW4sIGRpc2NhcmRpbmcgZXhpc3RpbmcgZW50cmllcyIpOwotICAgICAgICBtTWV0YUtleU1hcC5jbGVhcigpOwotICAgIH0KLQotICAgIG9mZjY0X3Qga2V5T2Zmc2V0ID0gb2Zmc2V0ICsgODsKLSAgICBvZmY2NF90IHN0b3BPZmZzZXQgPSBvZmZzZXQgKyBzaXplOwotICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDw9IGNvdW50OyBpKyspIHsKLSAgICAgICAgaWYgKGtleU9mZnNldCArIDggPiBzdG9wT2Zmc2V0KSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgdWludDMyX3Qga2V5U2l6ZTsKLSAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKGtleU9mZnNldCwgJmtleVNpemUpCi0gICAgICAgICAgICAgICAgfHwga2V5U2l6ZSA8IDgKLSAgICAgICAgICAgICAgICB8fCBrZXlPZmZzZXQgKyBrZXlTaXplID4gc3RvcE9mZnNldCkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihrZXlPZmZzZXQgKyA0LCAmdHlwZSkKLSAgICAgICAgICAgICAgICB8fCB0eXBlICE9IEZPVVJDQygnbScsICdkJywgJ3QnLCAnYScpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAga2V5U2l6ZSAtPSA4OwotICAgICAgICBrZXlPZmZzZXQgKz0gODsKLQotICAgICAgICBzcDxBQnVmZmVyPiBrZXlEYXRhID0gbmV3IEFCdWZmZXIoa2V5U2l6ZSk7Ci0gICAgICAgIGlmIChrZXlEYXRhLT5kYXRhKCkgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKLSAgICAgICAgICAgICAgICBrZXlPZmZzZXQsIGtleURhdGEtPmRhdGEoKSwga2V5U2l6ZSkgPCAoc3NpemVfdCkga2V5U2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIEFTdHJpbmcga2V5KChjb25zdCBjaGFyICopa2V5RGF0YS0+ZGF0YSgpLCBrZXlTaXplKTsKLSAgICAgICAgbU1ldGFLZXlNYXAuYWRkKGksIGtleSk7Ci0KLSAgICAgICAga2V5T2Zmc2V0ICs9IGtleVNpemU7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlUVRNZXRhVmFsKAotICAgICAgICBpbnQzMl90IGtleUlkLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKLSAgICBzc2l6ZV90IGluZGV4ID0gbU1ldGFLZXlNYXAuaW5kZXhPZktleShrZXlJZCk7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAvLyBjb3JyZXNwb25kaW5nIGtleSBpcyBub3QgcHJlc2VudCwgaWdub3JlCi0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgaWYgKHNpemUgPD0gMTYpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0gICAgdWludDMyX3QgZGF0YVNpemU7Ci0gICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJmRhdGFTaXplKQotICAgICAgICAgICAgfHwgZGF0YVNpemUgPiBzaXplIHx8IGRhdGFTaXplIDw9IDE2KSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotICAgIHVpbnQzMl90IGF0b21Gb3VyQ0M7Ci0gICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCArIDQsICZhdG9tRm91ckNDKQotICAgICAgICAgICAgfHwgYXRvbUZvdXJDQyAhPSBGT1VSQ0MoJ2QnLCAnYScsICd0JywgJ2EnKSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLSAgICB1aW50MzJfdCBkYXRhVHlwZTsKLSAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0ICsgOCwgJmRhdGFUeXBlKQotICAgICAgICAgICAgfHwgKChkYXRhVHlwZSAmIDB4ZmYwMDAwMDApICE9IDApKSB7Ci0gICAgICAgIC8vIG5vdCB3ZWxsLWtub3duIHR5cGUKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBkYXRhU2l6ZSAtPSAxNjsKLSAgICBvZmZzZXQgKz0gMTY7Ci0KLSAgICBpZiAoZGF0YVR5cGUgPT0gMjMgJiYgZGF0YVNpemUgPj0gNCkgewotICAgICAgICAvLyBCRSBGbG9hdDMyCi0gICAgICAgIHVpbnQzMl90IHZhbDsKLSAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJnZhbCkpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFzdHJjYXNlY21wKG1NZXRhS2V5TWFwW2luZGV4XS5jX3N0cigpLCAiY29tLmFuZHJvaWQuY2FwdHVyZS5mcHMiKSkgewotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS0+c2V0RmxvYXQoa0tleUNhcHR1cmVGcmFtZXJhdGUsICooZmxvYXQgKikmdmFsKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoZGF0YVR5cGUgPT0gNjcgJiYgZGF0YVNpemUgPj0gNCkgewotICAgICAgICAvLyBCRSBzaWduZWQgaW50MzIKLSAgICAgICAgdWludDMyX3QgdmFsOwotICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmdmFsKSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXN0cmNhc2VjbXAobU1ldGFLZXlNYXBbaW5kZXhdLmNfc3RyKCksICJjb20uYW5kcm9pZC52aWRlby50ZW1wb3JhbF9sYXllcnNfY291bnQiKSkgewotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS0+c2V0SW50MzIoa0tleVRlbXBvcmFsTGF5ZXJDb3VudCwgdmFsKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIGFkZCBtb3JlIGtleXMgaWYgbmVlZGVkCi0gICAgICAgIEFMT0dWKCJpZ25vcmluZyBrZXk6IHR5cGUgJWQsIHNpemUgJWQiLCBkYXRhVHlwZSwgZGF0YVNpemUpOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlVHJhY2tIZWFkZXIoCi0gICAgICAgIG9mZjY0X3QgZGF0YV9vZmZzZXQsIG9mZjY0X3QgZGF0YV9zaXplKSB7Ci0gICAgaWYgKGRhdGFfc2l6ZSA8IDQpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICB1aW50OF90IHZlcnNpb247Ci0gICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQsICZ2ZXJzaW9uLCAxKSA8IDEpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgIH0KLQotICAgIHNpemVfdCBkeW5TaXplID0gKHZlcnNpb24gPT0gMSkgPyAzNiA6IDI0OwotCi0gICAgdWludDhfdCBidWZmZXJbMzYgKyA2MF07Ci0KLSAgICBpZiAoZGF0YV9zaXplICE9IChvZmY2NF90KWR5blNpemUgKyA2MCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAotICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBidWZmZXIsIGRhdGFfc2l6ZSkgPCAoc3NpemVfdClkYXRhX3NpemUpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgIH0KLQotICAgIHVpbnQ2NF90IGN0aW1lIF9fdW51c2VkLCBtdGltZSBfX3VudXNlZCwgZHVyYXRpb24gX191bnVzZWQ7Ci0gICAgaW50MzJfdCBpZDsKLQotICAgIGlmICh2ZXJzaW9uID09IDEpIHsKLSAgICAgICAgY3RpbWUgPSBVNjRfQVQoJmJ1ZmZlcls0XSk7Ci0gICAgICAgIG10aW1lID0gVTY0X0FUKCZidWZmZXJbMTJdKTsKLSAgICAgICAgaWQgPSBVMzJfQVQoJmJ1ZmZlclsyMF0pOwotICAgICAgICBkdXJhdGlvbiA9IFU2NF9BVCgmYnVmZmVyWzI4XSk7Ci0gICAgfSBlbHNlIGlmICh2ZXJzaW9uID09IDApIHsKLSAgICAgICAgY3RpbWUgPSBVMzJfQVQoJmJ1ZmZlcls0XSk7Ci0gICAgICAgIG10aW1lID0gVTMyX0FUKCZidWZmZXJbOF0pOwotICAgICAgICBpZCA9IFUzMl9BVCgmYnVmZmVyWzEyXSk7Ci0gICAgICAgIGR1cmF0aW9uID0gVTMyX0FUKCZidWZmZXJbMjBdKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLQotICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDMyKGtLZXlUcmFja0lELCBpZCk7Ci0KLSAgICBzaXplX3QgbWF0cml4T2Zmc2V0ID0gZHluU2l6ZSArIDE2OwotICAgIGludDMyX3QgYTAwID0gVTMyX0FUKCZidWZmZXJbbWF0cml4T2Zmc2V0XSk7Ci0gICAgaW50MzJfdCBhMDEgPSBVMzJfQVQoJmJ1ZmZlclttYXRyaXhPZmZzZXQgKyA0XSk7Ci0gICAgaW50MzJfdCBhMTAgPSBVMzJfQVQoJmJ1ZmZlclttYXRyaXhPZmZzZXQgKyAxMl0pOwotICAgIGludDMyX3QgYTExID0gVTMyX0FUKCZidWZmZXJbbWF0cml4T2Zmc2V0ICsgMTZdKTsKLQotI2lmIDAKLSAgICBpbnQzMl90IGR4ID0gVTMyX0FUKCZidWZmZXJbbWF0cml4T2Zmc2V0ICsgOF0pOwotICAgIGludDMyX3QgZHkgPSBVMzJfQVQoJmJ1ZmZlclttYXRyaXhPZmZzZXQgKyAyMF0pOwotCi0gICAgQUxPR0koIngnID0gJS4yZiAqIHggKyAlLjJmICogeSArICUuMmYiLAotICAgICAgICAgYTAwIC8gNjU1MzYuMGYsIGEwMSAvIDY1NTM2LjBmLCBkeCAvIDY1NTM2LjBmKTsKLSAgICBBTE9HSSgieScgPSAlLjJmICogeCArICUuMmYgKiB5ICsgJS4yZiIsCi0gICAgICAgICBhMTAgLyA2NTUzNi4wZiwgYTExIC8gNjU1MzYuMGYsIGR5IC8gNjU1MzYuMGYpOwotI2VuZGlmCi0KLSAgICB1aW50MzJfdCByb3RhdGlvbkRlZ3JlZXM7Ci0KLSAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrRml4ZWRPbmUgPSAweDEwMDAwOwotICAgIGlmIChhMDAgPT0ga0ZpeGVkT25lICYmIGEwMSA9PSAwICYmIGExMCA9PSAwICYmIGExMSA9PSBrRml4ZWRPbmUpIHsKLSAgICAgICAgLy8gSWRlbnRpdHksIG5vIHJvdGF0aW9uCi0gICAgICAgIHJvdGF0aW9uRGVncmVlcyA9IDA7Ci0gICAgfSBlbHNlIGlmIChhMDAgPT0gMCAmJiBhMDEgPT0ga0ZpeGVkT25lICYmIGExMCA9PSAta0ZpeGVkT25lICYmIGExMSA9PSAwKSB7Ci0gICAgICAgIHJvdGF0aW9uRGVncmVlcyA9IDkwOwotICAgIH0gZWxzZSBpZiAoYTAwID09IDAgJiYgYTAxID09IC1rRml4ZWRPbmUgJiYgYTEwID09IGtGaXhlZE9uZSAmJiBhMTEgPT0gMCkgewotICAgICAgICByb3RhdGlvbkRlZ3JlZXMgPSAyNzA7Ci0gICAgfSBlbHNlIGlmIChhMDAgPT0gLWtGaXhlZE9uZSAmJiBhMDEgPT0gMCAmJiBhMTAgPT0gMCAmJiBhMTEgPT0gLWtGaXhlZE9uZSkgewotICAgICAgICByb3RhdGlvbkRlZ3JlZXMgPSAxODA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1coIldlIG9ubHkgc3VwcG9ydCAwLDkwLDE4MCwyNzAgZGVncmVlIHJvdGF0aW9uIG1hdHJpY2VzIik7Ci0gICAgICAgIHJvdGF0aW9uRGVncmVlcyA9IDA7Ci0gICAgfQotCi0gICAgaWYgKHJvdGF0aW9uRGVncmVlcyAhPSAwKSB7Ci0gICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDMyKGtLZXlSb3RhdGlvbiwgcm90YXRpb25EZWdyZWVzKTsKLSAgICB9Ci0KLSAgICAvLyBIYW5kbGUgcHJlc2VudGF0aW9uIGRpc3BsYXkgc2l6ZSwgd2hpY2ggY291bGQgYmUgZGlmZmVyZW50Ci0gICAgLy8gZnJvbSB0aGUgaW1hZ2Ugc2l6ZSBpbmRpY2F0ZWQgYnkga0tleVdpZHRoIGFuZCBrS2V5SGVpZ2h0LgotICAgIHVpbnQzMl90IHdpZHRoID0gVTMyX0FUKCZidWZmZXJbZHluU2l6ZSArIDUyXSk7Ci0gICAgdWludDMyX3QgaGVpZ2h0ID0gVTMyX0FUKCZidWZmZXJbZHluU2l6ZSArIDU2XSk7Ci0gICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleURpc3BsYXlXaWR0aCwgd2lkdGggPj4gMTYpOwotICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDMyKGtLZXlEaXNwbGF5SGVpZ2h0LCBoZWlnaHQgPj4gMTYpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6cGFyc2VJVHVuZXNNZXRhRGF0YShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKLSAgICBpZiAoc2l6ZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBpZiAoc2l6ZSA8IDQgfHwgc2l6ZSA9PSBTSVpFX01BWCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHVpbnQ4X3QgKmJ1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSB1aW50OF90W3NpemUgKyAxXTsKLSAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0gICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCi0gICAgICAgICAgICAgICAgb2Zmc2V0LCBidWZmZXIsIHNpemUpICE9IChzc2l6ZV90KXNpemUpIHsKLSAgICAgICAgZGVsZXRlW10gYnVmZmVyOwotICAgICAgICBidWZmZXIgPSBOVUxMOwotCi0gICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBmbGFncyA9IFUzMl9BVChidWZmZXIpOwotCi0gICAgdWludDMyX3QgbWV0YWRhdGFLZXkgPSAwOwotICAgIGNoYXIgY2h1bmtbNV07Ci0gICAgTWFrZUZvdXJDQ1N0cmluZyhtUGF0aFs0XSwgY2h1bmspOwotICAgIEFMT0dWKCJtZXRhOiAlcyBAICVsbGQiLCBjaHVuaywgKGxvbmcgbG9uZylvZmZzZXQpOwotICAgIHN3aXRjaCAoKGludDMyX3QpbVBhdGhbNF0pIHsKLSAgICAgICAgY2FzZSBGT1VSQ0MoMHhhOSwgJ2EnLCAnbCcsICdiJyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleUFsYnVtOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBGT1VSQ0MoMHhhOSwgJ0EnLCAnUicsICdUJyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleUFydGlzdDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdhJywgJ0EnLCAnUicsICdUJyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleUFsYnVtQXJ0aXN0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBGT1VSQ0MoMHhhOSwgJ2QnLCAnYScsICd5Jyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleVllYXI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZPVVJDQygweGE5LCAnbicsICdhJywgJ20nKToKLSAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5VGl0bGU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZPVVJDQygweGE5LCAndycsICdyJywgJ3QnKToKLSAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5V3JpdGVyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2MnLCAnbycsICd2JywgJ3InKToKLSAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5QWxidW1BcnQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZPVVJDQygnZycsICduJywgJ3InLCAnZScpOgotICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlHZW5yZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRk9VUkNDKDB4YTksICdnJywgJ2UnLCAnbicpOgotICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlHZW5yZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdjJywgJ3AnLCAnaScsICdsJyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzaXplID09IDkgJiYgZmxhZ3MgPT0gMjEpIHsKLSAgICAgICAgICAgICAgICBjaGFyIHRtcFsxNl07Ci0gICAgICAgICAgICAgICAgc3ByaW50Zih0bXAsICIlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW50KWJ1ZmZlcltzaXplIC0gMV0pOwotCi0gICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS0+c2V0Q1N0cmluZyhrS2V5Q29tcGlsYXRpb24sIHRtcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZPVVJDQygndCcsICdyJywgJ2snLCAnbicpOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc2l6ZSA9PSAxNiAmJiBmbGFncyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgY2hhciB0bXBbMTZdOwotICAgICAgICAgICAgICAgIHVpbnQxNl90KiBwVHJhY2sgPSAodWludDE2X3QqKSZidWZmZXJbMTBdOwotICAgICAgICAgICAgICAgIHVpbnQxNl90KiBwVG90YWxUcmFja3MgPSAodWludDE2X3QqKSZidWZmZXJbMTJdOwotICAgICAgICAgICAgICAgIHNwcmludGYodG1wLCAiJWQvJWQiLCBudG9ocygqcFRyYWNrKSwgbnRvaHMoKnBUb3RhbFRyYWNrcykpOwotCi0gICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS0+c2V0Q1N0cmluZyhrS2V5Q0RUcmFja051bWJlciwgdG1wKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdkJywgJ2knLCAncycsICdrJyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoc2l6ZSA9PSAxNCB8fCBzaXplID09IDE2KSAmJiBmbGFncyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgY2hhciB0bXBbMTZdOwotICAgICAgICAgICAgICAgIHVpbnQxNl90KiBwRGlzYyA9ICh1aW50MTZfdCopJmJ1ZmZlclsxMF07Ci0gICAgICAgICAgICAgICAgdWludDE2X3QqIHBUb3RhbERpc2NzID0gKHVpbnQxNl90KikmYnVmZmVyWzEyXTsKLSAgICAgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIiVkLyVkIiwgbnRvaHMoKnBEaXNjKSwgbnRvaHMoKnBUb3RhbERpc2NzKSk7Ci0KLSAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLT5zZXRDU3RyaW5nKGtLZXlEaXNjTnVtYmVyLCB0bXApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJy0nLCAnLScsICctJywgJy0nKToKLSAgICAgICAgewotICAgICAgICAgICAgYnVmZmVyW3NpemVdID0gJ1wwJzsKLSAgICAgICAgICAgIHN3aXRjaCAobVBhdGhbNV0pIHsKLSAgICAgICAgICAgICAgICBjYXNlIEZPVVJDQygnbScsICdlJywgJ2EnLCAnbicpOgotICAgICAgICAgICAgICAgICAgICBtTGFzdENvbW1lbnRNZWFuLnNldFRvKChjb25zdCBjaGFyICopYnVmZmVyICsgNCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgRk9VUkNDKCduJywgJ2EnLCAnbScsICdlJyk6Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0Q29tbWVudE5hbWUuc2V0VG8oKGNvbnN0IGNoYXIgKilidWZmZXIgKyA0KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBGT1VSQ0MoJ2QnLCAnYScsICd0JywgJ2EnKToKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPCA4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVbXSBidWZmZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoImIvMjQzNDY0MzAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUxhc3RDb21tZW50RGF0YS5zZXRUbygoY29uc3QgY2hhciAqKWJ1ZmZlciArIDgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gT25jZSB3ZSBoYXZlIGEgc2V0IG9mIG1lYW4vbmFtZS9kYXRhIGluZm8sIGdvIGFoZWFkIGFuZCBwcm9jZXNzCi0gICAgICAgICAgICAvLyBpdCB0byBzZWUgaWYgaXRzIHNvbWV0aGluZyB3ZSBhcmUgaW50ZXJlc3RlZCBpbi4gIFdoZXRoZXIgb3Igbm90Ci0gICAgICAgICAgICAvLyB3ZXJlIGFyZSBpbnRlcmVzdGVkIGluIHRoZSBzcGVjaWZpYyB0YWcsIG1ha2Ugc3VyZSB0byBjbGVhciBvdXQKLSAgICAgICAgICAgIC8vIHRoZSBzZXQgc28gd2UgY2FuIGJlIHJlYWR5IHRvIHByb2Nlc3MgYW5vdGhlciB0dXBsZSBzaG91bGQgb25lCi0gICAgICAgICAgICAvLyBzaG93IHVwIGxhdGVyIGluIHRoZSBmaWxlLgotICAgICAgICAgICAgaWYgKChtTGFzdENvbW1lbnRNZWFuLmxlbmd0aCgpICE9IDApICYmCi0gICAgICAgICAgICAgICAgKG1MYXN0Q29tbWVudE5hbWUubGVuZ3RoKCkgIT0gMCkgJiYKLSAgICAgICAgICAgICAgICAobUxhc3RDb21tZW50RGF0YS5sZW5ndGgoKSAhPSAwKSkgewotCi0gICAgICAgICAgICAgICAgaWYgKG1MYXN0Q29tbWVudE1lYW4gPT0gImNvbS5hcHBsZS5pVHVuZXMiCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBtTGFzdENvbW1lbnROYW1lID09ICJpVHVuU01QQiIpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkZWxheSwgcGFkZGluZzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNzY2FuZihtTGFzdENvbW1lbnREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgJSp4ICV4ICV4ICUqeCIsICZkZWxheSwgJnBhZGRpbmcpID09IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVbXSBidWZmZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleUVuY29kZXJEZWxheSwgZGVsYXkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleUVuY29kZXJQYWRkaW5nLCBwYWRkaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1MYXN0Q29tbWVudE1lYW4uY2xlYXIoKTsKLSAgICAgICAgICAgICAgICBtTGFzdENvbW1lbnROYW1lLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgbUxhc3RDb21tZW50RGF0YS5jbGVhcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKHNpemUgPj0gOCAmJiBtZXRhZGF0YUtleSAmJiAhbUZpbGVNZXRhRGF0YS0+aGFzRGF0YShtZXRhZGF0YUtleSkpIHsKLSAgICAgICAgaWYgKG1ldGFkYXRhS2V5ID09IGtLZXlBbGJ1bUFydCkgewotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS0+c2V0RGF0YSgKLSAgICAgICAgICAgICAgICAgICAga0tleUFsYnVtQXJ0LCBNZXRhRGF0YTo6VFlQRV9OT05FLAotICAgICAgICAgICAgICAgICAgICBidWZmZXIgKyA4LCBzaXplIC0gOCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobWV0YWRhdGFLZXkgPT0ga0tleUdlbnJlKSB7Ci0gICAgICAgICAgICBpZiAoZmxhZ3MgPT0gMCkgewotICAgICAgICAgICAgICAgIC8vIHVpbnQ4X3QgZ2VucmUgY29kZSwgaVR1bmVzIGdlbnJlIGNvZGVzIGFyZQotICAgICAgICAgICAgICAgIC8vIHRoZSBzdGFuZGFyZCBpZDMgY29kZXMsIGV4Y2VwdCB0aGV5IHN0YXJ0Ci0gICAgICAgICAgICAgICAgLy8gYXQgMSBpbnN0ZWFkIG9mIDAgKGUuZy4gUG9wIGlzIDE0LCBub3QgMTMpCi0gICAgICAgICAgICAgICAgLy8gV2UgdXNlIHN0YW5kYXJkIGlkMyBudW1iZXJpbmcsIHNvIHN1YnRyYWN0IDEuCi0gICAgICAgICAgICAgICAgaW50IGdlbnJlY29kZSA9IChpbnQpYnVmZmVyW3NpemUgLSAxXTsKLSAgICAgICAgICAgICAgICBnZW5yZWNvZGUtLTsKLSAgICAgICAgICAgICAgICBpZiAoZ2VucmVjb2RlIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBnZW5yZWNvZGUgPSAyNTU7IC8vIHJlc2VydmVkIGZvciAndW5rbm93biBnZW5yZScKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2hhciBnZW5yZVsxMF07Ci0gICAgICAgICAgICAgICAgc3ByaW50ZihnZW5yZSwgIiVkIiwgZ2VucmVjb2RlKTsKLQotICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEtPnNldENTdHJpbmcobWV0YWRhdGFLZXksIGdlbnJlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZmxhZ3MgPT0gMSkgewotICAgICAgICAgICAgICAgIC8vIGN1c3RvbSBnZW5yZSBzdHJpbmcKLSAgICAgICAgICAgICAgICBidWZmZXJbc2l6ZV0gPSAnXDAnOwotCi0gICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS0+c2V0Q1N0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhS2V5LCAoY29uc3QgY2hhciAqKWJ1ZmZlciArIDgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnVmZmVyW3NpemVdID0gJ1wwJzsKLQotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS0+c2V0Q1N0cmluZygKLSAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFLZXksIChjb25zdCBjaGFyICopYnVmZmVyICsgOCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBkZWxldGVbXSBidWZmZXI7Ci0gICAgYnVmZmVyID0gTlVMTDsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlQ29sb3JJbmZvKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgewotICAgIGlmIChzaXplIDwgNCB8fCBzaXplID09IFNJWkVfTUFYIHx8IG1MYXN0VHJhY2sgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHVpbnQ4X3QgKmJ1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSB1aW50OF90W3NpemUgKyAxXTsKLSAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0gICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBidWZmZXIsIHNpemUpICE9IChzc2l6ZV90KXNpemUpIHsKLSAgICAgICAgZGVsZXRlW10gYnVmZmVyOwotICAgICAgICBidWZmZXIgPSBOVUxMOwotCi0gICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICB9Ci0KLSAgICBpbnQzMl90IHR5cGUgPSBVMzJfQVQoJmJ1ZmZlclswXSk7Ci0gICAgaWYgKCh0eXBlID09IEZPVVJDQygnbicsICdjJywgJ2wnLCAneCcpICYmIHNpemUgPj0gMTEpCi0gICAgICAgICAgICB8fCAodHlwZSA9PSBGT1VSQ0MoJ24nLCAnYycsICdsJywgJ2MnKSAmJiBzaXplID49IDEwKSkgewotICAgICAgICBpbnQzMl90IHByaW1hcmllcyA9IFUxNl9BVCgmYnVmZmVyWzRdKTsKLSAgICAgICAgaW50MzJfdCB0cmFuc2ZlciA9IFUxNl9BVCgmYnVmZmVyWzZdKTsKLSAgICAgICAgaW50MzJfdCBjb2VmZnMgPSBVMTZfQVQoJmJ1ZmZlcls4XSk7Ci0gICAgICAgIGJvb2wgZnVsbFJhbmdlID0gKHR5cGUgPT0gRk9VUkNDKCduJywgJ2MnLCAnbCcsICd4JykpICYmIChidWZmZXJbMTBdICYgMTI4KTsKLQotICAgICAgICBDb2xvckFzcGVjdHMgYXNwZWN0czsKLSAgICAgICAgQ29sb3JVdGlsczo6Y29udmVydElzb0NvbG9yQXNwZWN0c1RvQ29kZWNBc3BlY3RzKAotICAgICAgICAgICAgICAgIHByaW1hcmllcywgdHJhbnNmZXIsIGNvZWZmcywgZnVsbFJhbmdlLCBhc3BlY3RzKTsKLQotICAgICAgICAvLyBvbmx5IHN0b3JlIHRoZSBmaXJzdCBjb2xvciBzcGVjaWZpY2F0aW9uCi0gICAgICAgIGlmICghbUxhc3RUcmFjay0+bWV0YS0+aGFzRGF0YShrS2V5Q29sb3JQcmltYXJpZXMpKSB7Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5Q29sb3JQcmltYXJpZXMsIGFzcGVjdHMubVByaW1hcmllcyk7Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5VHJhbnNmZXJGdW5jdGlvbiwgYXNwZWN0cy5tVHJhbnNmZXIpOwotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleUNvbG9yTWF0cml4LCBhc3BlY3RzLm1NYXRyaXhDb2VmZnMpOwotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleUNvbG9yUmFuZ2UsIGFzcGVjdHMubVJhbmdlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGRlbGV0ZVtdIGJ1ZmZlcjsKLSAgICBidWZmZXIgPSBOVUxMOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6cGFyc2UzR1BQTWV0YURhdGEob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplLCBpbnQgZGVwdGgpIHsKLSAgICBpZiAoc2l6ZSA8IDQgfHwgc2l6ZSA9PSBTSVpFX01BWCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHVpbnQ4X3QgKmJ1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSB1aW50OF90W3NpemUgKyAxXTsKLSAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0gICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCi0gICAgICAgICAgICAgICAgb2Zmc2V0LCBidWZmZXIsIHNpemUpICE9IChzc2l6ZV90KXNpemUpIHsKLSAgICAgICAgZGVsZXRlW10gYnVmZmVyOwotICAgICAgICBidWZmZXIgPSBOVUxMOwotCi0gICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBtZXRhZGF0YUtleSA9IDA7Ci0gICAgc3dpdGNoIChtUGF0aFtkZXB0aF0pIHsKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAnaScsICd0JywgJ2wnKToKLSAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5VGl0bGU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZPVVJDQygncCcsICdlJywgJ3InLCAnZicpOgotICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlBcnRpc3Q7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZPVVJDQygnYScsICd1JywgJ3QnLCAnaCcpOgotICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlXcml0ZXI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZPVVJDQygnZycsICduJywgJ3InLCAnZScpOgotICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlHZW5yZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdhJywgJ2wnLCAnYicsICdtJyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChidWZmZXJbc2l6ZSAtIDFdICE9ICdcMCcpIHsKLSAgICAgICAgICAgICAgY2hhciB0bXBbNF07Ci0gICAgICAgICAgICAgIHNwcmludGYodG1wLCAiJXUiLCBidWZmZXJbc2l6ZSAtIDFdKTsKLQotICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLT5zZXRDU3RyaW5nKGtLZXlDRFRyYWNrTnVtYmVyLCB0bXApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlBbGJ1bTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRk9VUkNDKCd5JywgJ3InLCAncicsICdjJyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzaXplIDwgNikgewotICAgICAgICAgICAgICAgIGRlbGV0ZVtdIGJ1ZmZlcjsKLSAgICAgICAgICAgICAgICBidWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgIEFMT0dFKCJiLzYyMTMzMjI3Iik7Ci0gICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI2MjEzMzIyNyIpOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaGFyIHRtcFs1XTsKLSAgICAgICAgICAgIHVpbnQxNl90IHllYXIgPSBVMTZfQVQoJmJ1ZmZlcls0XSk7Ci0KLSAgICAgICAgICAgIGlmICh5ZWFyIDwgMTAwMDApIHsKLSAgICAgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIiV1IiwgeWVhcik7Ci0KLSAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLT5zZXRDU3RyaW5nKGtLZXlZZWFyLCB0bXApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKG1ldGFkYXRhS2V5ID4gMCkgewotICAgICAgICBib29sIGlzVVRGOCA9IHRydWU7IC8vIENvbW1vbiBjYXNlCi0gICAgICAgIGNoYXIxNl90ICpmcmFtZWRhdGEgPSBOVUxMOwotICAgICAgICBpbnQgbGVuMTYgPSAwOyAvLyBOdW1iZXIgb2YgVVRGLTE2IGNoYXJhY3RlcnMKLQotICAgICAgICAvLyBzbWFsbGVzdCBwb3NzaWJsZSB2YWxpZCBVVEYtMTYgc3RyaW5nIHcgQk9NOiAweGZlIDB4ZmYgMHgwMCAweDAwCi0gICAgICAgIGlmIChzaXplIDwgNikgewotICAgICAgICAgICAgZGVsZXRlW10gYnVmZmVyOwotICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2l6ZSAtIDYgPj0gNCkgewotICAgICAgICAgICAgbGVuMTYgPSAoKHNpemUgLSA2KSAvIDIpIC0gMTsgLy8gZG9uJ3QgaW5jbHVkZSAweDAwMDAgdGVybWluYXRvcgotICAgICAgICAgICAgZnJhbWVkYXRhID0gKGNoYXIxNl90ICopKGJ1ZmZlciArIDYpOwotICAgICAgICAgICAgaWYgKDB4ZmZmZSA9PSAqZnJhbWVkYXRhKSB7Ci0gICAgICAgICAgICAgICAgLy8gZW5kaWFubmVzcyBtYXJrZXIgKEJPTSkgZG9lc24ndCBtYXRjaCBob3N0IGVuZGlhbm5lc3MKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjE2OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZnJhbWVkYXRhW2ldID0gYnN3YXBfMTYoZnJhbWVkYXRhW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gQk9NIGlzIG5vdyBzd2FwcGVkIHRvIDB4ZmVmZiwgd2Ugd2lsbCBleGVjdXRlIG5leHQgYmxvY2sgdG9vCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICgweGZlZmYgPT0gKmZyYW1lZGF0YSkgewotICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgQk9NCi0gICAgICAgICAgICAgICAgZnJhbWVkYXRhKys7Ci0gICAgICAgICAgICAgICAgbGVuMTYtLTsKLSAgICAgICAgICAgICAgICBpc1VURjggPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGVsc2Ugbm9ybWFsIG5vbi16ZXJvLWxlbmd0aCBVVEYtOCBzdHJpbmcKLSAgICAgICAgICAgIC8vIHdlIGNhbid0IGhhbmRsZSBVVEYtMTYgd2l0aG91dCBCT00gYXMgdGhlcmUgaXMgbm8gb3RoZXIKLSAgICAgICAgICAgIC8vIGluZGljYXRpb24gb2YgZW5jb2RpbmcuCi0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXNVVEY4KSB7Ci0gICAgICAgICAgICBidWZmZXJbc2l6ZV0gPSAwOwotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS0+c2V0Q1N0cmluZyhtZXRhZGF0YUtleSwgKGNvbnN0IGNoYXIgKilidWZmZXIgKyA2KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIENvbnZlcnQgZnJvbSBVVEYtMTYgc3RyaW5nIHRvIFVURi04IHN0cmluZy4KLSAgICAgICAgICAgIFN0cmluZzggdG1wVVRGOHN0cihmcmFtZWRhdGEsIGxlbjE2KTsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEtPnNldENTdHJpbmcobWV0YWRhdGFLZXksIHRtcFVURjhzdHIuc3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZGVsZXRlW10gYnVmZmVyOwotICAgIGJ1ZmZlciA9IE5VTEw7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgTVBFRzRFeHRyYWN0b3I6OnBhcnNlSUQzdjJNZXRhRGF0YShvZmY2NF90IG9mZnNldCkgewotICAgIElEMyBpZDMobURhdGFTb3VyY2UsIHRydWUgLyogaWdub3JldjEgKi8sIG9mZnNldCk7Ci0KLSAgICBpZiAoaWQzLmlzVmFsaWQoKSkgewotICAgICAgICBzdHJ1Y3QgTWFwIHsKLSAgICAgICAgICAgIGludCBrZXk7Ci0gICAgICAgICAgICBjb25zdCBjaGFyICp0YWcxOwotICAgICAgICAgICAgY29uc3QgY2hhciAqdGFnMjsKLSAgICAgICAgfTsKLSAgICAgICAgc3RhdGljIGNvbnN0IE1hcCBrTWFwW10gPSB7Ci0gICAgICAgICAgICB7IGtLZXlBbGJ1bSwgIlRBTEIiLCAiVEFMIiB9LAotICAgICAgICAgICAgeyBrS2V5QXJ0aXN0LCAiVFBFMSIsICJUUDEiIH0sCi0gICAgICAgICAgICB7IGtLZXlBbGJ1bUFydGlzdCwgIlRQRTIiLCAiVFAyIiB9LAotICAgICAgICAgICAgeyBrS2V5Q29tcG9zZXIsICJUQ09NIiwgIlRDTSIgfSwKLSAgICAgICAgICAgIHsga0tleUdlbnJlLCAiVENPTiIsICJUQ08iIH0sCi0gICAgICAgICAgICB7IGtLZXlUaXRsZSwgIlRJVDIiLCAiVFQyIiB9LAotICAgICAgICAgICAgeyBrS2V5WWVhciwgIlRZRSIsICJUWUVSIiB9LAotICAgICAgICAgICAgeyBrS2V5QXV0aG9yLCAiVFhUIiwgIlRFWFQiIH0sCi0gICAgICAgICAgICB7IGtLZXlDRFRyYWNrTnVtYmVyLCAiVFJLIiwgIlRSQ0siIH0sCi0gICAgICAgICAgICB7IGtLZXlEaXNjTnVtYmVyLCAiVFBBIiwgIlRQT1MiIH0sCi0gICAgICAgICAgICB7IGtLZXlDb21waWxhdGlvbiwgIlRDUCIsICJUQ01QIiB9LAotICAgICAgICB9OwotICAgICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtOdW1NYXBFbnRyaWVzID0gc2l6ZW9mKGtNYXApIC8gc2l6ZW9mKGtNYXBbMF0pOwotCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bU1hcEVudHJpZXM7ICsraSkgewotICAgICAgICAgICAgaWYgKCFtRmlsZU1ldGFEYXRhLT5oYXNEYXRhKGtNYXBbaV0ua2V5KSkgewotICAgICAgICAgICAgICAgIElEMzo6SXRlcmF0b3IgKml0ID0gbmV3IElEMzo6SXRlcmF0b3IoaWQzLCBrTWFwW2ldLnRhZzEpOwotICAgICAgICAgICAgICAgIGlmIChpdC0+ZG9uZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBpdDsKLSAgICAgICAgICAgICAgICAgICAgaXQgPSBuZXcgSUQzOjpJdGVyYXRvcihpZDMsIGtNYXBbaV0udGFnMik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGl0LT5kb25lKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGl0OwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmc4IHM7Ci0gICAgICAgICAgICAgICAgaXQtPmdldFN0cmluZygmcyk7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIGl0OwotCi0gICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS0+c2V0Q1N0cmluZyhrTWFwW2ldLmtleSwgcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzaXplX3QgZGF0YVNpemU7Ci0gICAgICAgIFN0cmluZzggbWltZTsKLSAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSA9IGlkMy5nZXRBbGJ1bUFydCgmZGF0YVNpemUsICZtaW1lKTsKLQotICAgICAgICBpZiAoZGF0YSkgewotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS0+c2V0RGF0YShrS2V5QWxidW1BcnQsIE1ldGFEYXRhOjpUWVBFX05PTkUsIGRhdGEsIGRhdGFTaXplKTsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEtPnNldENTdHJpbmcoa0tleUFsYnVtQXJ0TUlNRSwgbWltZS5zdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXNwPElNZWRpYVNvdXJjZT4gTVBFRzRFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgewotICAgIHN0YXR1c190IGVycjsKLSAgICBpZiAoKGVyciA9IHJlYWRNZXRhRGF0YSgpKSAhPSBPSykgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBUcmFjayAqdHJhY2sgPSBtRmlyc3RUcmFjazsKLSAgICB3aGlsZSAoaW5kZXggPiAwKSB7Ci0gICAgICAgIGlmICh0cmFjayA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIHRyYWNrID0gdHJhY2stPm5leHQ7Ci0gICAgICAgIC0taW5kZXg7Ci0gICAgfQotCi0gICAgaWYgKHRyYWNrID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0KLSAgICBUcmV4ICp0cmV4ID0gTlVMTDsKLSAgICBpbnQzMl90IHRyYWNrSWQ7Ci0gICAgaWYgKHRyYWNrLT5tZXRhLT5maW5kSW50MzIoa0tleVRyYWNrSUQsICZ0cmFja0lkKSkgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmV4LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBUcmV4ICp0ID0gJm1UcmV4LmVkaXRJdGVtQXQoaSk7Ci0gICAgICAgICAgICBpZiAodC0+dHJhY2tfSUQgPT0gKHVpbnQzMl90KSB0cmFja0lkKSB7Ci0gICAgICAgICAgICAgICAgdHJleCA9IHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiYi8yMTY1Nzk1NyIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBBTE9HVigiZ2V0VHJhY2sgY2FsbGVkLCBwc3NoOiAlenUiLCBtUHNzaC5zaXplKCkpOwotCi0gICAgY29uc3QgY2hhciAqbWltZTsKLSAgICBpZiAoIXRyYWNrLT5tZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKSkgewotICAgICAgICB1aW50MzJfdCB0eXBlOwotICAgICAgICBjb25zdCB2b2lkICpkYXRhOwotICAgICAgICBzaXplX3Qgc2l6ZTsKLSAgICAgICAgaWYgKCF0cmFjay0+bWV0YS0+ZmluZERhdGEoa0tleUFWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9IChjb25zdCB1aW50OF90ICopZGF0YTsKLQotICAgICAgICBpZiAoc2l6ZSA8IDcgfHwgcHRyWzBdICE9IDEpIHsgIC8vIGNvbmZpZ3VyYXRpb25WZXJzaW9uID09IDEKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKSkgewotICAgICAgICB1aW50MzJfdCB0eXBlOwotICAgICAgICBjb25zdCB2b2lkICpkYXRhOwotICAgICAgICBzaXplX3Qgc2l6ZTsKLSAgICAgICAgaWYgKCF0cmFjay0+bWV0YS0+ZmluZERhdGEoa0tleUhWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9IChjb25zdCB1aW50OF90ICopZGF0YTsKLQotICAgICAgICBpZiAoc2l6ZSA8IDIyIHx8IHB0clswXSAhPSAxKSB7ICAvLyBjb25maWd1cmF0aW9uVmVyc2lvbiA9PSAxCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHNwPE1QRUc0U291cmNlPiBzb3VyY2UgPSAgbmV3IE1QRUc0U291cmNlKHRoaXMsCi0gICAgICAgICAgICB0cmFjay0+bWV0YSwgbURhdGFTb3VyY2UsIHRyYWNrLT50aW1lc2NhbGUsIHRyYWNrLT5zYW1wbGVUYWJsZSwKLSAgICAgICAgICAgIG1TaWR4RW50cmllcywgdHJleCwgbU1vb2ZPZmZzZXQsIG1JdGVtVGFibGUpOwotICAgIGlmIChzb3VyY2UtPmluaXQoKSAhPSBPSykgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIHNvdXJjZTsKLX0KLQotLy8gc3RhdGljCi1zdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6dmVyaWZ5VHJhY2soVHJhY2sgKnRyYWNrKSB7Ci0gICAgY29uc3QgY2hhciAqbWltZTsKLSAgICBDSEVDSyh0cmFjay0+bWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOwotCi0gICAgdWludDMyX3QgdHlwZTsKLSAgICBjb25zdCB2b2lkICpkYXRhOwotICAgIHNpemVfdCBzaXplOwotICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpKSB7Ci0gICAgICAgIGlmICghdHJhY2stPm1ldGEtPmZpbmREYXRhKGtLZXlBVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKQotICAgICAgICAgICAgICAgIHx8IHR5cGUgIT0ga1R5cGVBVkNDKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKSkgewotICAgICAgICBpZiAoIXRyYWNrLT5tZXRhLT5maW5kRGF0YShrS2V5SFZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgdHlwZSAhPSBrVHlwZUhWQ0MpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KQotICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzIpCi0gICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpKSB7Ci0gICAgICAgIGlmICghdHJhY2stPm1ldGEtPmZpbmREYXRhKGtLZXlFU0RTLCAmdHlwZSwgJmRhdGEsICZzaXplKQotICAgICAgICAgICAgICAgIHx8IHR5cGUgIT0ga1R5cGVFU0RTKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHRyYWNrLT5zYW1wbGVUYWJsZSA9PSBOVUxMIHx8ICF0cmFjay0+c2FtcGxlVGFibGUtPmlzVmFsaWQoKSkgewotICAgICAgICAvLyBNYWtlIHN1cmUgd2UgaGF2ZSBhbGwgdGhlIG1ldGFkYXRhIHdlIG5lZWQuCi0gICAgICAgIEFMT0dFKCJzdGJsIGF0b20gbWlzc2luZy9pbnZhbGlkLiIpOwotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGlmICh0cmFjay0+dGltZXNjYWxlID09IDApIHsKLSAgICAgICAgQUxPR0UoInRpbWVzY2FsZSBpbnZhbGlkLiIpOwotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotdHlwZWRlZiBlbnVtIHsKLSAgICAvL0FPVF9OT05FICAgICAgICAgICAgID0gLTEsCi0gICAgLy9BT1RfTlVMTF9PQkpFQ1QgICAgICA9IDAsCi0gICAgLy9BT1RfQUFDX01BSU4gICAgICAgICA9IDEsIC8qKjwgTWFpbiBwcm9maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBBT1RfQUFDX0xDICAgICAgICAgICA9IDIsICAgLyoqPCBMb3cgQ29tcGxleGl0eSBvYmplY3QgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8vQU9UX0FBQ19TU1IgICAgICAgICAgPSAzLAotICAgIC8vQU9UX0FBQ19MVFAgICAgICAgICAgPSA0LAotICAgIEFPVF9TQlIgICAgICAgICAgICAgID0gNSwKLSAgICAvL0FPVF9BQUNfU0NBTCAgICAgICAgID0gNiwKLSAgICAvL0FPVF9UV0lOX1ZRICAgICAgICAgID0gNywKLSAgICAvL0FPVF9DRUxQICAgICAgICAgICAgID0gOCwKLSAgICAvL0FPVF9IVlhDICAgICAgICAgICAgID0gOSwKLSAgICAvL0FPVF9SU1ZEXzEwICAgICAgICAgID0gMTAsIC8qKjwgKHJlc2VydmVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvL0FPVF9SU1ZEXzExICAgICAgICAgID0gMTEsIC8qKjwgKHJlc2VydmVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvL0FPVF9UVFNJICAgICAgICAgICAgID0gMTIsIC8qKjwgVFRTSSBPYmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvL0FPVF9NQUlOX1NZTlRIICAgICAgID0gMTMsIC8qKjwgTWFpbiBTeW50aGV0aWMgb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvL0FPVF9XQVZfVEFCX1NZTlRIICAgID0gMTQsIC8qKjwgV2F2ZXRhYmxlIFN5bnRoZXNpcyBvYmplY3QgICAgICAgICAgICAgICAgKi8KLSAgICAvL0FPVF9HRU5fTUlESSAgICAgICAgID0gMTUsIC8qKjwgR2VuZXJhbCBNSURJIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvL0FPVF9BTEdfU1lOVEhfQVVEX0ZYID0gMTYsIC8qKjwgQWxnb3JpdGhtaWMgU3ludGhlc2lzIGFuZCBBdWRpbyBGWCBvYmplY3QgKi8KLSAgICBBT1RfRVJfQUFDX0xDICAgICAgICA9IDE3LCAgIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBBQUMgTG93IENvbXBsZXhpdHkgICAgKi8KLSAgICAvL0FPVF9SU1ZEXzE4ICAgICAgICAgID0gMTgsIC8qKjwgKHJlc2VydmVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvL0FPVF9FUl9BQUNfTFRQICAgICAgID0gMTksIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBBQUMgTFRQIG9iamVjdCAgICAgICAgKi8KLSAgICBBT1RfRVJfQUFDX1NDQUwgICAgICA9IDIwLCAgIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBBQUMgU2NhbGFibGUgb2JqZWN0ICAgKi8KLSAgICAvL0FPVF9FUl9UV0lOX1ZRICAgICAgID0gMjEsIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBUd2luVlEgb2JqZWN0ICAgICAgICAgKi8KLSAgICBBT1RfRVJfQlNBQyAgICAgICAgICA9IDIyLCAgIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBCU0FDIG9iamVjdCAgICAgICAgICAgKi8KLSAgICBBT1RfRVJfQUFDX0xEICAgICAgICA9IDIzLCAgIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBBQUMgTG93RGVsYXkgb2JqZWN0ICAgKi8KLSAgICAvL0FPVF9FUl9DRUxQICAgICAgICAgID0gMjQsIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBDRUxQIG9iamVjdCAgICAgICAgICAgKi8KLSAgICAvL0FPVF9FUl9IVlhDICAgICAgICAgID0gMjUsIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBIVlhDIG9iamVjdCAgICAgICAgICAgKi8KLSAgICAvL0FPVF9FUl9ISUxOICAgICAgICAgID0gMjYsIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBISUxOIG9iamVjdCAgICAgICAgICAgKi8KLSAgICAvL0FPVF9FUl9QQVJBICAgICAgICAgID0gMjcsIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBQYXJhbWV0cmljIG9iamVjdCAgICAgKi8KLSAgICAvL0FPVF9SU1ZEXzI4ICAgICAgICAgID0gMjgsIC8qKjwgbWlnaHQgYmVjb21lIFNTQyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBBT1RfUFMgICAgICAgICAgICAgICA9IDI5LCAgIC8qKjwgUFMsIFBhcmFtZXRyaWMgU3RlcmVvIChpbmNsdWRlcyBTQlIpICAgICAgKi8KLSAgICAvL0FPVF9NUEVHUyAgICAgICAgICAgID0gMzAsIC8qKjwgTVBFRyBTdXJyb3VuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIEFPVF9FU0NBUEUgICAgICAgICAgID0gMzEsICAgLyoqPCBTaWduYWwgQU9UIHVzZXMgbW9yZSB0aGFuIDUgYml0cyAgICAgICAgICAqLwotCi0gICAgLy9BT1RfTVAzT05NUDRfTDEgICAgICA9IDMyLCAvKio8IE1QRUctTGF5ZXIxIGluIG1wNCAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLy9BT1RfTVAzT05NUDRfTDIgICAgICA9IDMzLCAvKio8IE1QRUctTGF5ZXIyIGluIG1wNCAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLy9BT1RfTVAzT05NUDRfTDMgICAgICA9IDM0LCAvKio8IE1QRUctTGF5ZXIzIGluIG1wNCAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLy9BT1RfUlNWRF8zNSAgICAgICAgICA9IDM1LCAvKio8IG1pZ2h0IGJlY29tZSBEU1QgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLy9BT1RfUlNWRF8zNiAgICAgICAgICA9IDM2LCAvKio8IG1pZ2h0IGJlY29tZSBBTFMgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLy9BT1RfQUFDX1NMUyAgICAgICAgICA9IDM3LCAvKio8IEFBQyArIFNMUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLy9BT1RfU0xTICAgICAgICAgICAgICA9IDM4LCAvKio8IFNMUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLy9BT1RfRVJfQUFDX0VMRCAgICAgICA9IDM5LCAvKio8IEFBQyBFbmhhbmNlZCBMb3cgRGVsYXkgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAvL0FPVF9VU0FDICAgICAgICAgICAgID0gNDIsIC8qKjwgVVNBQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvL0FPVF9TQU9DICAgICAgICAgICAgID0gNDMsIC8qKjwgU0FPQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvL0FPVF9MRF9NUEVHUyAgICAgICAgID0gNDQsIC8qKjwgTG93IERlbGF5IE1QRUcgU3Vycm91bmQgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIC8vQU9UX1JTVkQ1MCAgICAgICAgICAgPSA1MCwgIC8qKjwgSW50ZXJpbSBBT1QgZm9yIFJzdmQ1MCAgICAgICAgICAgICAgICAgICAqLwotfSBBVURJT19PQkpFQ1RfVFlQRTsKLQotc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnVwZGF0ZUF1ZGlvVHJhY2tJbmZvRnJvbUVTRFNfTVBFRzRBdWRpbygKLSAgICAgICAgY29uc3Qgdm9pZCAqZXNkc19kYXRhLCBzaXplX3QgZXNkc19zaXplKSB7Ci0gICAgRVNEUyBlc2RzKGVzZHNfZGF0YSwgZXNkc19zaXplKTsKLQotICAgIHVpbnQ4X3Qgb2JqZWN0VHlwZUluZGljYXRpb247Ci0gICAgaWYgKGVzZHMuZ2V0T2JqZWN0VHlwZUluZGljYXRpb24oJm9iamVjdFR5cGVJbmRpY2F0aW9uKSAhPSBPSykgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGlmIChvYmplY3RUeXBlSW5kaWNhdGlvbiA9PSAweGUxKSB7Ci0gICAgICAgIC8vIFRoaXMgaXNuJ3QgTVBFRzQgYXVkaW8gYXQgYWxsLCBpdCdzIFFDRUxQIDE0ay4uLgotICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLQotICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUUNFTFApOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgaWYgKG9iamVjdFR5cGVJbmRpY2F0aW9uICA9PSAweDZiKSB7Ci0gICAgICAgIC8vIFRoZSBtZWRpYSBzdWJ0eXBlIGlzIE1QMyBhdWRpbwotICAgICAgICAvLyBPdXIgc29mdHdhcmUgTVAzIGF1ZGlvIGRlY29kZXIgbWF5IG5vdCBiZSBhYmxlIHRvIGhhbmRsZQotICAgICAgICAvLyBwYWNrZXRpemVkIE1QMyBhdWRpbzsgZm9yIG5vdywgbGV0cyBqdXN0IHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRAotICAgICAgICBBTE9HRSgiTVAzIHRyYWNrIGluIE1QNC8zR1BQIGZpbGUgaXMgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgY29uc3QgdWludDhfdCAqY3NkOwotICAgIHNpemVfdCBjc2Rfc2l6ZTsKLSAgICBpZiAoZXNkcy5nZXRDb2RlY1NwZWNpZmljSW5mbygKLSAgICAgICAgICAgICAgICAoY29uc3Qgdm9pZCAqKikmY3NkLCAmY3NkX3NpemUpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgaWYgKGtVc2VIZXhEdW1wKSB7Ci0gICAgICAgIHByaW50ZigiRVNEIG9mIHNpemUgJXp1XG4iLCBjc2Rfc2l6ZSk7Ci0gICAgICAgIGhleGR1bXAoY3NkLCBjc2Rfc2l6ZSk7Ci0gICAgfQotCi0gICAgaWYgKGNzZF9zaXplID09IDApIHsKLSAgICAgICAgLy8gVGhlcmUncyBubyBmdXJ0aGVyIGluZm9ybWF0aW9uLCBpLmUuIG5vIGNvZGVjIHNwZWNpZmljIGRhdGEKLSAgICAgICAgLy8gTGV0J3MgYXNzdW1lIHRoYXQgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGluIHRoZSBtcGVnNCBoZWFkZXJzCi0gICAgICAgIC8vIGlzIGFjY3VyYXRlIGFuZCBob3BlIGZvciB0aGUgYmVzdC4KLQotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgaWYgKGNzZF9zaXplIDwgMikgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHN0YXRpYyB1aW50MzJfdCBrU2FtcGxpbmdSYXRlW10gPSB7Ci0gICAgICAgIDk2MDAwLCA4ODIwMCwgNjQwMDAsIDQ4MDAwLCA0NDEwMCwgMzIwMDAsIDI0MDAwLCAyMjA1MCwKLSAgICAgICAgMTYwMDAsIDEyMDAwLCAxMTAyNSwgODAwMCwgNzM1MAotICAgIH07Ci0KLSAgICBBQml0UmVhZGVyIGJyKGNzZCwgY3NkX3NpemUpOwotICAgIHVpbnQzMl90IG9iamVjdFR5cGUgPSBici5nZXRCaXRzKDUpOwotCi0gICAgaWYgKG9iamVjdFR5cGUgPT0gMzEpIHsgIC8vIEFBQy1FTEQgPT4gYWRkaXRpb25hbCA2IGJpdHMKLSAgICAgICAgb2JqZWN0VHlwZSA9IDMyICsgYnIuZ2V0Qml0cyg2KTsKLSAgICB9Ci0KLSAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotCi0gICAgLy9rZWVwIEFPVCB0eXBlCi0gICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleUFBQ0FPVCwgb2JqZWN0VHlwZSk7Ci0KLSAgICB1aW50MzJfdCBmcmVxSW5kZXggPSBici5nZXRCaXRzKDQpOwotCi0gICAgaW50MzJfdCBzYW1wbGVSYXRlID0gMDsKLSAgICBpbnQzMl90IG51bUNoYW5uZWxzID0gMDsKLSAgICBpZiAoZnJlcUluZGV4ID09IDE1KSB7Ci0gICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgMjgpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIHNhbXBsZVJhdGUgPSBici5nZXRCaXRzKDI0KTsKLSAgICAgICAgbnVtQ2hhbm5lbHMgPSBici5nZXRCaXRzKDQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgNCkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgbnVtQ2hhbm5lbHMgPSBici5nZXRCaXRzKDQpOwotCi0gICAgICAgIGlmIChmcmVxSW5kZXggPT0gMTMgfHwgZnJlcUluZGV4ID09IDE0KSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgc2FtcGxlUmF0ZSA9IGtTYW1wbGluZ1JhdGVbZnJlcUluZGV4XTsKLSAgICB9Ci0KLSAgICBpZiAob2JqZWN0VHlwZSA9PSBBT1RfU0JSIHx8IG9iamVjdFR5cGUgPT0gQU9UX1BTKSB7Ly9TQlIgc3BlY2lmaWMgY29uZmlnIHBlciAxNDQ5Ni0zIHRhYmxlIDEuMTMKLSAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA0KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB1aW50MzJfdCBleHRGcmVxSW5kZXggPSBici5nZXRCaXRzKDQpOwotICAgICAgICBpbnQzMl90IGV4dFNhbXBsZVJhdGUgX191bnVzZWQ7Ci0gICAgICAgIGlmIChleHRGcmVxSW5kZXggPT0gMTUpIHsKLSAgICAgICAgICAgIGlmIChjc2Rfc2l6ZSA8IDgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCAyNCkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIGV4dFNhbXBsZVJhdGUgPSBici5nZXRCaXRzKDI0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChleHRGcmVxSW5kZXggPT0gMTMgfHwgZXh0RnJlcUluZGV4ID09IDE0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGV4dFNhbXBsZVJhdGUgPSBrU2FtcGxpbmdSYXRlW2V4dEZyZXFJbmRleF07Ci0gICAgICAgIH0KLSAgICAgICAgLy9UT0RPOiBzYXZlIHRoZSBleHRlbnNpb24gc2FtcGxpbmcgcmF0ZSB2YWx1ZSBpbiBtZXRhIGRhdGEgPT4KLSAgICAgICAgLy8gICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5RXh0U2FtcGxlUmF0ZSwgZXh0U2FtcGxlUmF0ZSk7Ci0gICAgfQotCi0gICAgc3dpdGNoIChudW1DaGFubmVscykgewotICAgICAgICAvLyB2YWx1ZXMgZGVmaW5lZCBpbiAxNDQ5Ni0zXzIwMDkgYW1lbmRtZW50LTQgVGFibGUgMS4xOSAtIENoYW5uZWwgQ29uZmlndXJhdGlvbgotICAgICAgICBjYXNlIDA6Ci0gICAgICAgIGNhc2UgMTovLyBGQwotICAgICAgICBjYXNlIDI6Ly8gRkwgRlIKLSAgICAgICAgY2FzZSAzOi8vIEZDLCBGTCBGUgotICAgICAgICBjYXNlIDQ6Ly8gRkMsIEZMIEZSLCBSQwotICAgICAgICBjYXNlIDU6Ly8gRkMsIEZMIEZSLCBTTCBTUgotICAgICAgICBjYXNlIDY6Ly8gRkMsIEZMIEZSLCBTTCBTUiwgTEZFCi0gICAgICAgICAgICAvL251bUNoYW5uZWxzIGFscmVhZHkgY29udGFpbnMgdGhlIHJpZ2h0IHZhbHVlCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMTovLyBGQywgRkwgRlIsIFNMIFNSLCBSQywgTEZFCi0gICAgICAgICAgICBudW1DaGFubmVscyA9IDc7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA3OiAvLyBGQywgRkNMIEZDUiwgRkwgRlIsIFNMIFNSLCBMRkUKLSAgICAgICAgY2FzZSAxMjovLyBGQywgRkwgIEZSLCAgU0wgU1IsIFJMIFJSLCBMRkUKLSAgICAgICAgY2FzZSAxNDovLyBGQywgRkwgIEZSLCAgU0wgU1IsIExGRSwgRkhMIEZIUgotICAgICAgICAgICAgbnVtQ2hhbm5lbHMgPSA4OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgewotICAgICAgICBpZiAob2JqZWN0VHlwZSA9PSBBT1RfU0JSIHx8IG9iamVjdFR5cGUgPT0gQU9UX1BTKSB7Ci0gICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDUpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICBvYmplY3RUeXBlID0gYnIuZ2V0Qml0cyg1KTsKLQotICAgICAgICAgICAgaWYgKG9iamVjdFR5cGUgPT0gQU9UX0VTQ0FQRSkgewotICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgNikgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICBvYmplY3RUeXBlID0gMzIgKyBici5nZXRCaXRzKDYpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChvYmplY3RUeXBlID09IEFPVF9BQUNfTEMgfHwgb2JqZWN0VHlwZSA9PSBBT1RfRVJfQUFDX0xDIHx8Ci0gICAgICAgICAgICAgICAgb2JqZWN0VHlwZSA9PSBBT1RfRVJfQUFDX0xEIHx8IG9iamVjdFR5cGUgPT0gQU9UX0VSX0FBQ19TQ0FMIHx8Ci0gICAgICAgICAgICAgICAgb2JqZWN0VHlwZSA9PSBBT1RfRVJfQlNBQykgewotICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCAyKSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgY29uc3QgaW50MzJfdCBmcmFtZUxlbmd0aEZsYWcgX191bnVzZWQgPSBici5nZXRCaXRzKDEpOwotCi0gICAgICAgICAgICBjb25zdCBpbnQzMl90IGRlcGVuZHNPbkNvcmVDb2RlciA9IGJyLmdldEJpdHMoMSk7Ci0KLSAgICAgICAgICAgIGlmIChkZXBlbmRzT25Db3JlQ29kZXIgKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCAxNCkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGNvcmVDb2RlckRlbGF5IF9fdW51c2VkID0gYnIuZ2V0Qml0cygxNCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludDMyX3QgZXh0ZW5zaW9uRmxhZyA9IC0xOwotICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgZXh0ZW5zaW9uRmxhZyA9IGJyLmdldEJpdHMoMSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN3aXRjaCAob2JqZWN0VHlwZSkgewotICAgICAgICAgICAgICAgIC8vIDE0NDk2LTMgNC41LjEuMSBleHRlbnNpb25GbGFnCi0gICAgICAgICAgICAgICAgY2FzZSBBT1RfQUFDX0xDOgotICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25GbGFnID0gMDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBBT1RfRVJfQUFDX0xDOgotICAgICAgICAgICAgICAgIGNhc2UgQU9UX0VSX0FBQ19TQ0FMOgotICAgICAgICAgICAgICAgIGNhc2UgQU9UX0VSX0JTQUM6Ci0gICAgICAgICAgICAgICAgY2FzZSBBT1RfRVJfQUFDX0xEOgotICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25GbGFnID0gMTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFMT0dXKCJjc2QgbWlzc2luZyBleHRlbnNpb24gZmxhZzsgYXNzdW1pbmcgJWQgZm9yIG9iamVjdCB0eXBlICV1LiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25GbGFnLCBvYmplY3RUeXBlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG51bUNoYW5uZWxzID09IDApIHsKLSAgICAgICAgICAgICAgICBpbnQzMl90IGNoYW5uZWxzRWZmZWN0aXZlTnVtID0gMDsKLSAgICAgICAgICAgICAgICBpbnQzMl90IGNoYW5uZWxzTnVtID0gMDsKLSAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDMyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgRWxlbWVudEluc3RhbmNlVGFnIF9fdW51c2VkID0gYnIuZ2V0Qml0cyg0KTsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFByb2ZpbGUgX191bnVzZWQgPSBici5nZXRCaXRzKDIpOwotICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgU2FtcGxpbmdGcmVxdWVuY3lJbmRleCBfX3VudXNlZCA9IGJyLmdldEJpdHMoNCk7Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBOdW1Gcm9udENoYW5uZWxFbGVtZW50cyA9IGJyLmdldEJpdHMoNCk7Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBOdW1TaWRlQ2hhbm5lbEVsZW1lbnRzID0gYnIuZ2V0Qml0cyg0KTsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE51bUJhY2tDaGFubmVsRWxlbWVudHMgPSBici5nZXRCaXRzKDQpOwotICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTnVtTGZlQ2hhbm5lbEVsZW1lbnRzID0gYnIuZ2V0Qml0cygyKTsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE51bUFzc29jRGF0YUVsZW1lbnRzIF9fdW51c2VkID0gYnIuZ2V0Qml0cygzKTsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE51bVZhbGlkQ2NFbGVtZW50cyBfX3VudXNlZCA9IGJyLmdldEJpdHMoNCk7Ci0KLSAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE1vbm9NaXhkb3duUHJlc2VudCA9IGJyLmdldEJpdHMoMSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoTW9ub01peGRvd25QcmVzZW50ICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA0KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE1vbm9NaXhkb3duRWxlbWVudE51bWJlciBfX3VudXNlZCA9IGJyLmdldEJpdHMoNCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCAxKSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgU3RlcmVvTWl4ZG93blByZXNlbnQgPSBici5nZXRCaXRzKDEpOwotICAgICAgICAgICAgICAgIGlmIChTdGVyZW9NaXhkb3duUHJlc2VudCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgNCkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBTdGVyZW9NaXhkb3duRWxlbWVudE51bWJlciBfX3VudXNlZCA9IGJyLmdldEJpdHMoNCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCAxKSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTWF0cml4TWl4ZG93bkluZGV4UHJlc2VudCA9IGJyLmdldEJpdHMoMSk7Ci0gICAgICAgICAgICAgICAgaWYgKE1hdHJpeE1peGRvd25JbmRleFByZXNlbnQgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDMpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTWF0cml4TWl4ZG93bkluZGV4IF9fdW51c2VkID0gYnIuZ2V0Qml0cygyKTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBQc2V1ZG9TdXJyb3VuZEVuYWJsZSBfX3VudXNlZCA9IGJyLmdldEJpdHMoMSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaW50IGk7Ci0gICAgICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBOdW1Gcm9udENoYW5uZWxFbGVtZW50czsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgNSkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBGcm9udEVsZW1lbnRJc0NwZSA9IGJyLmdldEJpdHMoMSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgRnJvbnRFbGVtZW50VGFnU2VsZWN0IF9fdW51c2VkID0gYnIuZ2V0Qml0cyg0KTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHNOdW0gKz0gRnJvbnRFbGVtZW50SXNDcGUgPyAyIDogMTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IE51bVNpZGVDaGFubmVsRWxlbWVudHM7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDUpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgU2lkZUVsZW1lbnRJc0NwZSA9IGJyLmdldEJpdHMoMSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgU2lkZUVsZW1lbnRUYWdTZWxlY3QgX191bnVzZWQgPSBici5nZXRCaXRzKDQpOwotICAgICAgICAgICAgICAgICAgICBjaGFubmVsc051bSArPSBTaWRlRWxlbWVudElzQ3BlID8gMiA6IDE7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBOdW1CYWNrQ2hhbm5lbEVsZW1lbnRzOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA1KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IEJhY2tFbGVtZW50SXNDcGUgPSBici5nZXRCaXRzKDEpOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IEJhY2tFbGVtZW50VGFnU2VsZWN0IF9fdW51c2VkID0gYnIuZ2V0Qml0cyg0KTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHNOdW0gKz0gQmFja0VsZW1lbnRJc0NwZSA/IDIgOiAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjaGFubmVsc0VmZmVjdGl2ZU51bSA9IGNoYW5uZWxzTnVtOwotCi0gICAgICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBOdW1MZmVDaGFubmVsRWxlbWVudHM7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDQpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTGZlRWxlbWVudFRhZ1NlbGVjdCBfX3VudXNlZCA9IGJyLmdldEJpdHMoNCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzTnVtICs9IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFMT0dWKCJtcGVnNCBhdWRpbyBjaGFubmVsc051bSA9ICVkIiwgY2hhbm5lbHNOdW0pOwotICAgICAgICAgICAgICAgIEFMT0dWKCJtcGVnNCBhdWRpbyBjaGFubmVsc0VmZmVjdGl2ZU51bSA9ICVkIiwgY2hhbm5lbHNFZmZlY3RpdmVOdW0pOwotICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzID0gY2hhbm5lbHNOdW07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobnVtQ2hhbm5lbHMgPT0gMCkgewotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLQotICAgIGludDMyX3QgcHJldlNhbXBsZVJhdGU7Ci0gICAgQ0hFQ0sobUxhc3RUcmFjay0+bWV0YS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmcHJldlNhbXBsZVJhdGUpKTsKLQotICAgIGlmIChwcmV2U2FtcGxlUmF0ZSAhPSBzYW1wbGVSYXRlKSB7Ci0gICAgICAgIEFMT0dWKCJtcGVnNCBhdWRpbyBzYW1wbGUgcmF0ZSBkaWZmZXJlbnQgZnJvbSBwcmV2aW91cyBzZXR0aW5nLiAiCi0gICAgICAgICAgICAgIndhczogJWQsIG5vdzogJWQiLCBwcmV2U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7Ci0gICAgfQotCi0gICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsZVJhdGUpOwotCi0gICAgaW50MzJfdCBwcmV2Q2hhbm5lbENvdW50OwotICAgIENIRUNLKG1MYXN0VHJhY2stPm1ldGEtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAmcHJldkNoYW5uZWxDb3VudCkpOwotCi0gICAgaWYgKHByZXZDaGFubmVsQ291bnQgIT0gbnVtQ2hhbm5lbHMpIHsKLSAgICAgICAgQUxPR1YoIm1wZWc0IGF1ZGlvIGNoYW5uZWwgY291bnQgZGlmZmVyZW50IGZyb20gcHJldmlvdXMgc2V0dGluZy4gIgotICAgICAgICAgICAgICJ3YXM6ICVkLCBub3c6ICVkIiwgcHJldkNoYW5uZWxDb3VudCwgbnVtQ2hhbm5lbHMpOwotICAgIH0KLQotICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG51bUNoYW5uZWxzKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotTVBFRzRTb3VyY2U6Ok1QRUc0U291cmNlKAotICAgICAgICBjb25zdCBzcDxNUEVHNEV4dHJhY3Rvcj4gJm93bmVyLAotICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJmZvcm1hdCwKLSAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJmRhdGFTb3VyY2UsCi0gICAgICAgIGludDMyX3QgdGltZVNjYWxlLAotICAgICAgICBjb25zdCBzcDxTYW1wbGVUYWJsZT4gJnNhbXBsZVRhYmxlLAotICAgICAgICBWZWN0b3I8U2lkeEVudHJ5PiAmc2lkeCwKLSAgICAgICAgY29uc3QgVHJleCAqdHJleCwKLSAgICAgICAgb2ZmNjRfdCBmaXJzdE1vb2ZPZmZzZXQsCi0gICAgICAgIGNvbnN0IHNwPEl0ZW1UYWJsZT4gJml0ZW1UYWJsZSkKLSAgICA6IG1Pd25lcihvd25lciksCi0gICAgICBtRm9ybWF0KGZvcm1hdCksCi0gICAgICBtRGF0YVNvdXJjZShkYXRhU291cmNlKSwKLSAgICAgIG1UaW1lc2NhbGUodGltZVNjYWxlKSwKLSAgICAgIG1TYW1wbGVUYWJsZShzYW1wbGVUYWJsZSksCi0gICAgICBtQ3VycmVudFNhbXBsZUluZGV4KDApLAotICAgICAgbUN1cnJlbnRGcmFnbWVudEluZGV4KDApLAotICAgICAgbVNlZ21lbnRzKHNpZHgpLAotICAgICAgbVRyZXgodHJleCksCi0gICAgICBtRmlyc3RNb29mT2Zmc2V0KGZpcnN0TW9vZk9mZnNldCksCi0gICAgICBtQ3VycmVudE1vb2ZPZmZzZXQoZmlyc3RNb29mT2Zmc2V0KSwKLSAgICAgIG1OZXh0TW9vZk9mZnNldCgtMSksCi0gICAgICBtQ3VycmVudFRpbWUoMCksCi0gICAgICBtQ3VycmVudFNhbXBsZUluZm9BbGxvY1NpemUoMCksCi0gICAgICBtQ3VycmVudFNhbXBsZUluZm9TaXplcyhOVUxMKSwKLSAgICAgIG1DdXJyZW50U2FtcGxlSW5mb09mZnNldHNBbGxvY1NpemUoMCksCi0gICAgICBtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRzKE5VTEwpLAotICAgICAgbUlzQVZDKGZhbHNlKSwKLSAgICAgIG1Jc0hFVkMoZmFsc2UpLAotICAgICAgbU5BTExlbmd0aFNpemUoMCksCi0gICAgICBtU3RhcnRlZChmYWxzZSksCi0gICAgICBtR3JvdXAoTlVMTCksCi0gICAgICBtQnVmZmVyKE5VTEwpLAotICAgICAgbVdhbnRzTkFMRnJhZ21lbnRzKGZhbHNlKSwKLSAgICAgIG1TcmNCdWZmZXIoTlVMTCksCi0gICAgICBtSXNIRUlGKGl0ZW1UYWJsZSAhPSBOVUxMKSwKLSAgICAgIG1JdGVtVGFibGUoaXRlbVRhYmxlKSB7Ci0KLSAgICBtZW1zZXQoJm1UcmFja0ZyYWdtZW50SGVhZGVySW5mbywgMCwgc2l6ZW9mKG1UcmFja0ZyYWdtZW50SGVhZGVySW5mbykpOwotCi0gICAgbUZvcm1hdC0+ZmluZEludDMyKGtLZXlDcnlwdG9Nb2RlLCAmbUNyeXB0b01vZGUpOwotICAgIG1EZWZhdWx0SVZTaXplID0gMDsKLSAgICBtRm9ybWF0LT5maW5kSW50MzIoa0tleUNyeXB0b0RlZmF1bHRJVlNpemUsICZtRGVmYXVsdElWU2l6ZSk7Ci0gICAgdWludDMyX3Qga2V5dHlwZTsKLSAgICBjb25zdCB2b2lkICprZXk7Ci0gICAgc2l6ZV90IGtleXNpemU7Ci0gICAgaWYgKG1Gb3JtYXQtPmZpbmREYXRhKGtLZXlDcnlwdG9LZXksICZrZXl0eXBlLCAma2V5LCAma2V5c2l6ZSkpIHsKLSAgICAgICAgQ0hFQ0soa2V5c2l6ZSA8PSAxNik7Ci0gICAgICAgIG1lbXNldChtQ3J5cHRvS2V5LCAwLCAxNik7Ci0gICAgICAgIG1lbWNweShtQ3J5cHRvS2V5LCBrZXksIGtleXNpemUpOwotICAgIH0KLQotICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgYm9vbCBzdWNjZXNzID0gbUZvcm1hdC0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSk7Ci0gICAgQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgICBtSXNBVkMgPSAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOwotICAgIG1Jc0hFVkMgPSAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKTsKLQotICAgIGlmIChtSXNBVkMpIHsKLSAgICAgICAgdWludDMyX3QgdHlwZTsKLSAgICAgICAgY29uc3Qgdm9pZCAqZGF0YTsKLSAgICAgICAgc2l6ZV90IHNpemU7Ci0gICAgICAgIENIRUNLKGZvcm1hdC0+ZmluZERhdGEoa0tleUFWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpKTsKLQotICAgICAgICBjb25zdCB1aW50OF90ICpwdHIgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7Ci0KLSAgICAgICAgQ0hFQ0soc2l6ZSA+PSA3KTsKLSAgICAgICAgQ0hFQ0tfRVEoKHVuc2lnbmVkKXB0clswXSwgMXUpOyAgLy8gY29uZmlndXJhdGlvblZlcnNpb24gPT0gMQotCi0gICAgICAgIC8vIFRoZSBudW1iZXIgb2YgYnl0ZXMgdXNlZCB0byBlbmNvZGUgdGhlIGxlbmd0aCBvZiBhIE5BTCB1bml0LgotICAgICAgICBtTkFMTGVuZ3RoU2l6ZSA9IDEgKyAocHRyWzRdICYgMyk7Ci0gICAgfSBlbHNlIGlmIChtSXNIRVZDKSB7Ci0gICAgICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgICAgIGNvbnN0IHZvaWQgKmRhdGE7Ci0gICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICBDSEVDSyhmb3JtYXQtPmZpbmREYXRhKGtLZXlIVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSk7Ci0KLSAgICAgICAgY29uc3QgdWludDhfdCAqcHRyID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhOwotCi0gICAgICAgIENIRUNLKHNpemUgPj0gMjIpOwotICAgICAgICBDSEVDS19FUSgodW5zaWduZWQpcHRyWzBdLCAxdSk7ICAvLyBjb25maWd1cmF0aW9uVmVyc2lvbiA9PSAxCi0KLSAgICAgICAgbU5BTExlbmd0aFNpemUgPSAxICsgKHB0clsxNCArIDddICYgMyk7Ci0gICAgfQotCi0gICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoa0tleVRyYWNrSUQsICZtVHJhY2tJZCkpOwotCi19Ci0KLXN0YXR1c190IE1QRUc0U291cmNlOjppbml0KCkgewotICAgIGlmIChtRmlyc3RNb29mT2Zmc2V0ICE9IDApIHsKLSAgICAgICAgb2ZmNjRfdCBvZmZzZXQgPSBtRmlyc3RNb29mT2Zmc2V0OwotICAgICAgICByZXR1cm4gcGFyc2VDaHVuaygmb2Zmc2V0KTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1NUEVHNFNvdXJjZTo6fk1QRUc0U291cmNlKCkgewotICAgIGlmIChtU3RhcnRlZCkgewotICAgICAgICBzdG9wKCk7Ci0gICAgfQotICAgIGZyZWUobUN1cnJlbnRTYW1wbGVJbmZvU2l6ZXMpOwotICAgIGZyZWUobUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0cyk7Ci19Ci0KLXN0YXR1c190IE1QRUc0U291cmNlOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIENIRUNLKCFtU3RhcnRlZCk7Ci0KLSAgICBpbnQzMl90IHZhbDsKLSAgICBpZiAocGFyYW1zICYmIHBhcmFtcy0+ZmluZEludDMyKGtLZXlXYW50c05BTEZyYWdtZW50cywgJnZhbCkKLSAgICAgICAgJiYgdmFsICE9IDApIHsKLSAgICAgICAgbVdhbnRzTkFMRnJhZ21lbnRzID0gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBtV2FudHNOQUxGcmFnbWVudHMgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBpbnQzMl90IHRtcDsKLSAgICBDSEVDSyhtRm9ybWF0LT5maW5kSW50MzIoa0tleU1heElucHV0U2l6ZSwgJnRtcCkpOwotICAgIHNpemVfdCBtYXhfc2l6ZSA9IHRtcDsKLQotICAgIC8vIEEgc29tZXdoYXQgYXJiaXRyYXJ5IGxpbWl0IHRoYXQgc2hvdWxkIGJlIHN1ZmZpY2llbnQgZm9yIDhrIHZpZGVvIGZyYW1lcwotICAgIC8vIElmIHlvdSBzZWUgdGhlIG1lc3NhZ2UgYmVsb3cgZm9yIGEgdmFsaWQgaW5wdXQgc3RyZWFtOiBpbmNyZWFzZSB0aGUgbGltaXQKLSAgICBjb25zdCBzaXplX3Qga01heEJ1ZmZlclNpemUgPSA2NCAqIDEwMjQgKiAxMDI0OwotICAgIGlmIChtYXhfc2l6ZSA+IGtNYXhCdWZmZXJTaXplKSB7Ci0gICAgICAgIEFMT0dFKCJib2d1cyBtYXggaW5wdXQgc2l6ZTogJXp1ID4gJXp1IiwgbWF4X3NpemUsIGtNYXhCdWZmZXJTaXplKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0gICAgaWYgKG1heF9zaXplID09IDApIHsKLSAgICAgICAgQUxPR0UoInplcm8gbWF4IGlucHV0IHNpemUiKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICAvLyBBbGxvdyB1cCB0byBrTWF4QnVmZmVycywgYnV0IG5vdCBpZiB0aGUgdG90YWwgZXhjZWVkcyBrTWF4QnVmZmVyU2l6ZS4KLSAgICBjb25zdCBzaXplX3Qga01heEJ1ZmZlcnMgPSA4OwotICAgIGNvbnN0IHNpemVfdCBidWZmZXJzID0gbWluKGtNYXhCdWZmZXJTaXplIC8gbWF4X3NpemUsIGtNYXhCdWZmZXJzKTsKLSAgICBtR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cChidWZmZXJzLCBtYXhfc2l6ZSk7Ci0gICAgbVNyY0J1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSB1aW50OF90W21heF9zaXplXTsKLSAgICBpZiAobVNyY0J1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgIC8vIGZpbGUgcHJvYmFibHkgc3BlY2lmaWVkIGEgYmFkIG1heCBzaXplCi0gICAgICAgIGRlbGV0ZSBtR3JvdXA7Ci0gICAgICAgIG1Hcm91cCA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgbVN0YXJ0ZWQgPSB0cnVlOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBNUEVHNFNvdXJjZTo6c3RvcCgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgQ0hFQ0sobVN0YXJ0ZWQpOwotCi0gICAgaWYgKG1CdWZmZXIgIT0gTlVMTCkgewotICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgIH0KLQotICAgIGRlbGV0ZVtdIG1TcmNCdWZmZXI7Ci0gICAgbVNyY0J1ZmZlciA9IE5VTEw7Ci0KLSAgICBkZWxldGUgbUdyb3VwOwotICAgIG1Hcm91cCA9IE5VTEw7Ci0KLSAgICBtU3RhcnRlZCA9IGZhbHNlOwotICAgIG1DdXJyZW50U2FtcGxlSW5kZXggPSAwOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBNUEVHNFNvdXJjZTo6cGFyc2VDaHVuayhvZmY2NF90ICpvZmZzZXQpIHsKLSAgICB1aW50MzJfdCBoZHJbMl07Ci0gICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoKm9mZnNldCwgaGRyLCA4KSA8IDgpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgIH0KLSAgICB1aW50NjRfdCBjaHVua19zaXplID0gbnRvaGwoaGRyWzBdKTsKLSAgICB1aW50MzJfdCBjaHVua190eXBlID0gbnRvaGwoaGRyWzFdKTsKLSAgICBvZmY2NF90IGRhdGFfb2Zmc2V0ID0gKm9mZnNldCArIDg7Ci0KLSAgICBpZiAoY2h1bmtfc2l6ZSA9PSAxKSB7Ci0gICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KCpvZmZzZXQgKyA4LCAmY2h1bmtfc2l6ZSwgOCkgPCA4KSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgIH0KLSAgICAgICAgY2h1bmtfc2l6ZSA9IG50b2g2NChjaHVua19zaXplKTsKLSAgICAgICAgZGF0YV9vZmZzZXQgKz0gODsKLQotICAgICAgICBpZiAoY2h1bmtfc2l6ZSA8IDE2KSB7Ci0gICAgICAgICAgICAvLyBUaGUgc21hbGxlc3QgdmFsaWQgY2h1bmsgaXMgMTYgYnl0ZXMgbG9uZyBpbiB0aGlzIGNhc2UuCi0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChjaHVua19zaXplIDwgOCkgewotICAgICAgICAvLyBUaGUgc21hbGxlc3QgdmFsaWQgY2h1bmsgaXMgOCBieXRlcyBsb25nLgotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGNoYXIgY2h1bmtbNV07Ci0gICAgTWFrZUZvdXJDQ1N0cmluZyhjaHVua190eXBlLCBjaHVuayk7Ci0gICAgQUxPR1YoIk1QRUc0U291cmNlIGNodW5rICVzIEAgJSNsbHgiLCBjaHVuaywgKGxvbmcgbG9uZykqb2Zmc2V0KTsKLQotICAgIG9mZjY0X3QgY2h1bmtfZGF0YV9zaXplID0gKm9mZnNldCArIGNodW5rX3NpemUgLSBkYXRhX29mZnNldDsKLQotICAgIHN3aXRjaChjaHVua190eXBlKSB7Ci0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAncicsICdhJywgJ2YnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ2YnKTogewotICAgICAgICAgICAgb2ZmNjRfdCBzdG9wX29mZnNldCA9ICpvZmZzZXQgKyBjaHVua19zaXplOwotICAgICAgICAgICAgKm9mZnNldCA9IGRhdGFfb2Zmc2V0OwotICAgICAgICAgICAgd2hpbGUgKCpvZmZzZXQgPCBzdG9wX29mZnNldCkgewotICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlQ2h1bmsob2Zmc2V0KTsKLSAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCdtJywgJ28nLCAnbycsICdmJykpIHsKLSAgICAgICAgICAgICAgICAvLyAqb2Zmc2V0IHBvaW50cyB0byB0aGUgYm94IGZvbGxvd2luZyB0aGlzIG1vb2YuIEZpbmQgdGhlIG5leHQgbW9vZiBmcm9tIHRoZXJlLgotCi0gICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoKm9mZnNldCwgaGRyLCA4KSA8IDgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIG1vcmUgYm94IHRvIHRoZSBlbmQgb2YgZmlsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNodW5rX3NpemUgPSBudG9obChoZHJbMF0pOwotICAgICAgICAgICAgICAgICAgICBjaHVua190eXBlID0gbnRvaGwoaGRyWzFdKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNodW5rX3NpemUgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSVNPL0lFQyAxNDQ5Ni0xMjoyMDEyLCA4LjguNCBNb3ZpZSBGcmFnbWVudCBCb3gsIG1vb2YgaXMgYSBCb3gKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGlzIGRlZmluZWQgaW4gNC4yIE9iamVjdCBTdHJ1Y3R1cmUuCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIGNodW5rX3NpemU9PTEsIDggYnl0ZXMgZm9sbG93cyBhcyAibGFyZ2VzaXplIi4KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KCpvZmZzZXQgKyA4LCAmY2h1bmtfc2l6ZSwgOCkgPCA4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtfc2l6ZSA9IG50b2g2NChjaHVua19zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaHVua19zaXplIDwgMTYpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgc21hbGxlc3QgdmFsaWQgY2h1bmsgaXMgMTYgYnl0ZXMgbG9uZyBpbiB0aGlzIGNhc2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaHVua19zaXplID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5leHQgYm94IGV4dGVuZHMgdG8gZW5kIG9mIGZpbGUuCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2h1bmtfc2l6ZSA8IDgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBzbWFsbGVzdCB2YWxpZCBjaHVuayBpcyA4IGJ5dGVzIGxvbmcgaW4gdGhpcyBjYXNlLgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChjaHVua190eXBlID09IEZPVVJDQygnbScsICdvJywgJ28nLCAnZicpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTmV4dE1vb2ZPZmZzZXQgPSAqb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2h1bmtfc2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIEZPVVJDQygndCcsICdmJywgJ2gnLCAnZCcpOiB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyOwotICAgICAgICAgICAgICAgIGlmICgoZXJyID0gcGFyc2VUcmFja0ZyYWdtZW50SGVhZGVyKGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpKSAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIEZPVVJDQygndCcsICdyJywgJ3UnLCAnbicpOiB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyOwotICAgICAgICAgICAgICAgIGlmIChtTGFzdFBhcnNlZFRyYWNrSWQgPT0gbVRyYWNrSWQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChlcnIgPSBwYXJzZVRyYWNrRnJhZ21lbnRSdW4oZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSkpICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAnYScsICdpJywgJ3onKTogewotICAgICAgICAgICAgc3RhdHVzX3QgZXJyOwotICAgICAgICAgICAgaWYgKChlcnIgPSBwYXJzZVNhbXBsZUF1eGlsaWFyeUluZm9ybWF0aW9uU2l6ZXMoZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSkpICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ2EnLCAnaScsICdvJyk6IHsKLSAgICAgICAgICAgIHN0YXR1c190IGVycjsKLSAgICAgICAgICAgIGlmICgoZXJyID0gcGFyc2VTYW1wbGVBdXhpbGlhcnlJbmZvcm1hdGlvbk9mZnNldHMoZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSkpICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnZCcsICdhJywgJ3QnKTogewotICAgICAgICAgICAgLy8gcGFyc2UgRFJNIGluZm8gaWYgcHJlc2VudAotICAgICAgICAgICAgQUxPR1YoIk1QRUc0U291cmNlOjpwYXJzZUNodW5rIG1kYXQiKTsKLSAgICAgICAgICAgIC8vIGlmIHNhaXovc2FvaSB3YXMgcHJldmlvdXNseSBvYnNlcnZlZCwgZG8gc29tZXRoaW5nIHdpdGggdGhlIHNhbXBsZWluZm9zCi0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnBhcnNlU2FtcGxlQXV4aWxpYXJ5SW5mb3JtYXRpb25TaXplcygKLSAgICAgICAgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgLyogc2l6ZSAqLykgewotICAgIEFMT0dWKCJwYXJzZVNhbXBsZUF1eGlsaWFyeUluZm9ybWF0aW9uU2l6ZXMiKTsKLSAgICAvLyAxNDQ5Ni0xMiA4LjcuMTIKLSAgICB1aW50OF90IHZlcnNpb247Ci0gICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCi0gICAgICAgICAgICBvZmZzZXQsICZ2ZXJzaW9uLCBzaXplb2YodmVyc2lvbikpCi0gICAgICAgICAgICA8IChzc2l6ZV90KXNpemVvZih2ZXJzaW9uKSkgewotICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgfQotCi0gICAgaWYgKHZlcnNpb24gIT0gMCkgewotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQotICAgIG9mZnNldCsrOwotCi0gICAgdWludDMyX3QgZmxhZ3M7Ci0gICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDI0KG9mZnNldCwgJmZsYWdzKSkgewotICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgfQotICAgIG9mZnNldCArPSAzOwotCi0gICAgaWYgKGZsYWdzICYgMSkgewotICAgICAgICB1aW50MzJfdCB0bXA7Ci0gICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQsICZ0bXApKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0gICAgICAgIG1DdXJyZW50QXV4SW5mb1R5cGUgPSB0bXA7Ci0gICAgICAgIG9mZnNldCArPSA0OwotICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmdG1wKSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotICAgICAgICBtQ3VycmVudEF1eEluZm9UeXBlUGFyYW1ldGVyID0gdG1wOwotICAgICAgICBvZmZzZXQgKz0gNDsKLSAgICB9Ci0KLSAgICB1aW50OF90IGRlZnNpemU7Ci0gICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCAmZGVmc2l6ZSwgMSkgIT0gMSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLSAgICBtQ3VycmVudERlZmF1bHRTYW1wbGVJbmZvU2l6ZSA9IGRlZnNpemU7Ci0gICAgb2Zmc2V0Kys7Ci0KLSAgICB1aW50MzJfdCBzbXBsY250OwotICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQsICZzbXBsY250KSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLSAgICBtQ3VycmVudFNhbXBsZUluZm9Db3VudCA9IHNtcGxjbnQ7Ci0gICAgb2Zmc2V0ICs9IDQ7Ci0KLSAgICBpZiAobUN1cnJlbnREZWZhdWx0U2FtcGxlSW5mb1NpemUgIT0gMCkgewotICAgICAgICBBTE9HVigiQEBAQCB1c2luZyBkZWZhdWx0IHNhbXBsZSBpbmZvIHNpemUgb2YgJWQiLCBtQ3VycmVudERlZmF1bHRTYW1wbGVJbmZvU2l6ZSk7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0gICAgaWYgKHNtcGxjbnQgPiBtQ3VycmVudFNhbXBsZUluZm9BbGxvY1NpemUpIHsKLSAgICAgICAgdWludDhfdCAqIG5ld1B0ciA9ICAodWludDhfdCopIHJlYWxsb2MobUN1cnJlbnRTYW1wbGVJbmZvU2l6ZXMsIHNtcGxjbnQpOwotICAgICAgICBpZiAobmV3UHRyID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gcmVhbGxvYyAldSAtPiAldSIsIG1DdXJyZW50U2FtcGxlSW5mb0FsbG9jU2l6ZSwgc21wbGNudCk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgICAgICB9Ci0gICAgICAgIG1DdXJyZW50U2FtcGxlSW5mb1NpemVzID0gbmV3UHRyOwotICAgICAgICBtQ3VycmVudFNhbXBsZUluZm9BbGxvY1NpemUgPSBzbXBsY250OwotICAgIH0KLQotICAgIG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBtQ3VycmVudFNhbXBsZUluZm9TaXplcywgc21wbGNudCk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBNUEVHNFNvdXJjZTo6cGFyc2VTYW1wbGVBdXhpbGlhcnlJbmZvcm1hdGlvbk9mZnNldHMoCi0gICAgICAgIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IC8qIHNpemUgKi8pIHsKLSAgICBBTE9HVigicGFyc2VTYW1wbGVBdXhpbGlhcnlJbmZvcm1hdGlvbk9mZnNldHMiKTsKLSAgICAvLyAxNDQ5Ni0xMiA4LjcuMTMKLSAgICB1aW50OF90IHZlcnNpb247Ci0gICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCAmdmVyc2lvbiwgc2l6ZW9mKHZlcnNpb24pKSAhPSAxKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICB9Ci0gICAgb2Zmc2V0Kys7Ci0KLSAgICB1aW50MzJfdCBmbGFnczsKLSAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MjQob2Zmc2V0LCAmZmxhZ3MpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICB9Ci0gICAgb2Zmc2V0ICs9IDM7Ci0KLSAgICB1aW50MzJfdCBlbnRyeWNvdW50OwotICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQsICZlbnRyeWNvdW50KSkgewotICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgfQotICAgIG9mZnNldCArPSA0OwotICAgIGlmIChlbnRyeWNvdW50ID09IDApIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICBpZiAoZW50cnljb3VudCA+IFVJTlQzMl9NQVggLyA4KSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgaWYgKGVudHJ5Y291bnQgPiBtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRzQWxsb2NTaXplKSB7Ci0gICAgICAgIHVpbnQ2NF90ICpuZXdQdHIgPSAodWludDY0X3QgKilyZWFsbG9jKG1DdXJyZW50U2FtcGxlSW5mb09mZnNldHMsIGVudHJ5Y291bnQgKiA4KTsKLSAgICAgICAgaWYgKG5ld1B0ciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHJlYWxsb2MgJXUgLT4gJXUiLCBtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRzQWxsb2NTaXplLCBlbnRyeWNvdW50ICogOCk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgICAgICB9Ci0gICAgICAgIG1DdXJyZW50U2FtcGxlSW5mb09mZnNldHMgPSBuZXdQdHI7Ci0gICAgICAgIG1DdXJyZW50U2FtcGxlSW5mb09mZnNldHNBbGxvY1NpemUgPSBlbnRyeWNvdW50OwotICAgIH0KLSAgICBtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRDb3VudCA9IGVudHJ5Y291bnQ7Ci0KLSAgICBpZiAobUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0cyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5Y291bnQ7IGkrKykgewotICAgICAgICBpZiAodmVyc2lvbiA9PSAwKSB7Ci0gICAgICAgICAgICB1aW50MzJfdCB0bXA7Ci0gICAgICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmdG1wKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlSW5mb09mZnNldHNbaV0gPSB0bXA7Ci0gICAgICAgICAgICBvZmZzZXQgKz0gNDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHVpbnQ2NF90IHRtcDsKLSAgICAgICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQ2NChvZmZzZXQsICZ0bXApKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0c1tpXSA9IHRtcDsKLSAgICAgICAgICAgIG9mZnNldCArPSA4OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gcGFyc2UgY2xlYXIvZW5jcnlwdGVkIGRhdGEKLQotICAgIG9mZjY0X3QgZHJtb2Zmc2V0ID0gbUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0c1swXTsgLy8gZnJvbSBtb29mCi0KLSAgICBkcm1vZmZzZXQgKz0gbUN1cnJlbnRNb29mT2Zmc2V0OwotICAgIGludCBpdmxlbmd0aDsKLSAgICBDSEVDSyhtRm9ybWF0LT5maW5kSW50MzIoa0tleUNyeXB0b0RlZmF1bHRJVlNpemUsICZpdmxlbmd0aCkpOwotCi0gICAgLy8gb25seSAwLCA4IGFuZCAxNiBieXRlIGluaXRpYWxpemF0aW9uIHZlY3RvcnMgYXJlIHN1cHBvcnRlZAotICAgIGlmIChpdmxlbmd0aCAhPSAwICYmIGl2bGVuZ3RoICE9IDggJiYgaXZsZW5ndGggIT0gMTYpIHsKLSAgICAgICAgQUxPR1coInVuc3VwcG9ydGVkIElWIGxlbmd0aDogJWQiLCBpdmxlbmd0aCk7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotICAgIC8vIHJlYWQgQ2VuY1NhbXBsZUF1eGlsaWFyeURhdGFGb3JtYXRzCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ3VycmVudFNhbXBsZUluZm9Db3VudDsgaSsrKSB7Ci0gICAgICAgIGlmIChpID49IG1DdXJyZW50U2FtcGxlcy5zaXplKCkpIHsKLSAgICAgICAgICAgIEFMT0dXKCJ0b28gZmV3IHNhbXBsZXMiKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIFNhbXBsZSAqc21wbCA9ICZtQ3VycmVudFNhbXBsZXMuZWRpdEl0ZW1BdChpKTsKLQotICAgICAgICBtZW1zZXQoc21wbC0+aXYsIDAsIDE2KTsKLSAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZHJtb2Zmc2V0LCBzbXBsLT5pdiwgaXZsZW5ndGgpICE9IGl2bGVuZ3RoKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgIH0KLQotICAgICAgICBkcm1vZmZzZXQgKz0gaXZsZW5ndGg7Ci0KLSAgICAgICAgaW50MzJfdCBzbXBsaW5mb3NpemUgPSBtQ3VycmVudERlZmF1bHRTYW1wbGVJbmZvU2l6ZTsKLSAgICAgICAgaWYgKHNtcGxpbmZvc2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICBzbXBsaW5mb3NpemUgPSBtQ3VycmVudFNhbXBsZUluZm9TaXplc1tpXTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc21wbGluZm9zaXplID4gaXZsZW5ndGgpIHsKLSAgICAgICAgICAgIHVpbnQxNl90IG51bXN1YnNhbXBsZXM7Ci0gICAgICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MTYoZHJtb2Zmc2V0LCAmbnVtc3Vic2FtcGxlcykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkcm1vZmZzZXQgKz0gMjsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbnVtc3Vic2FtcGxlczsgaisrKSB7Ci0gICAgICAgICAgICAgICAgdWludDE2X3QgbnVtY2xlYXI7Ci0gICAgICAgICAgICAgICAgdWludDMyX3QgbnVtZW5jcnlwdGVkOwotICAgICAgICAgICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQxNihkcm1vZmZzZXQsICZudW1jbGVhcikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkcm1vZmZzZXQgKz0gMjsKLSAgICAgICAgICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIoZHJtb2Zmc2V0LCAmbnVtZW5jcnlwdGVkKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRybW9mZnNldCArPSA0OwotICAgICAgICAgICAgICAgIHNtcGwtPmNsZWFyc2l6ZXMuYWRkKG51bWNsZWFyKTsKLSAgICAgICAgICAgICAgICBzbXBsLT5lbmNyeXB0ZWRzaXplcy5hZGQobnVtZW5jcnlwdGVkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNtcGwtPmNsZWFyc2l6ZXMuYWRkKDApOwotICAgICAgICAgICAgc21wbC0+ZW5jcnlwdGVkc2l6ZXMuYWRkKHNtcGwtPnNpemUpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IE1QRUc0U291cmNlOjpwYXJzZVRyYWNrRnJhZ21lbnRIZWFkZXIob2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3Qgc2l6ZSkgewotCi0gICAgaWYgKHNpemUgPCA4KSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIHVpbnQzMl90IGZsYWdzOwotICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQsICZmbGFncykpIHsgLy8gYWN0dWFsbHkgdmVyc2lvbiArIGZsYWdzCi0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgaWYgKGZsYWdzICYgMHhmZjAwMDAwMCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0ICsgNCwgKHVpbnQzMl90KikmbUxhc3RQYXJzZWRUcmFja0lkKSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGlmIChtTGFzdFBhcnNlZFRyYWNrSWQgIT0gbVRyYWNrSWQpIHsKLSAgICAgICAgLy8gdGhpcyBpcyBub3QgdGhlIHJpZ2h0IHRyYWNrLCBza2lwIGl0Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubUZsYWdzID0gZmxhZ3M7Ci0gICAgbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1UcmFja0lEID0gbUxhc3RQYXJzZWRUcmFja0lkOwotICAgIG9mZnNldCArPSA4OwotICAgIHNpemUgLT0gODsKLQotICAgIEFMT0dWKCJmcmFnbWVudCBoZWFkZXI6ICUwOHggJTA4eCIsIGZsYWdzLCBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubVRyYWNrSUQpOwotCi0gICAgaWYgKGZsYWdzICYgVHJhY2tGcmFnbWVudEhlYWRlckluZm86OmtCYXNlRGF0YU9mZnNldFByZXNlbnQpIHsKLSAgICAgICAgaWYgKHNpemUgPCA4KSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQ2NChvZmZzZXQsICZtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubUJhc2VEYXRhT2Zmc2V0KSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotICAgICAgICBvZmZzZXQgKz0gODsKLSAgICAgICAgc2l6ZSAtPSA4OwotICAgIH0KLQotICAgIGlmIChmbGFncyAmIFRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvOjprU2FtcGxlRGVzY3JpcHRpb25JbmRleFByZXNlbnQpIHsKLSAgICAgICAgaWYgKHNpemUgPCA0KSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQsICZtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubVNhbXBsZURlc2NyaXB0aW9uSW5kZXgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0gICAgICAgIG9mZnNldCArPSA0OwotICAgICAgICBzaXplIC09IDQ7Ci0gICAgfQotCi0gICAgaWYgKGZsYWdzICYgVHJhY2tGcmFnbWVudEhlYWRlckluZm86OmtEZWZhdWx0U2FtcGxlRHVyYXRpb25QcmVzZW50KSB7Ci0gICAgICAgIGlmIChzaXplIDwgNCkgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1EZWZhdWx0U2FtcGxlRHVyYXRpb24pKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0gICAgICAgIG9mZnNldCArPSA0OwotICAgICAgICBzaXplIC09IDQ7Ci0gICAgfQotCi0gICAgaWYgKGZsYWdzICYgVHJhY2tGcmFnbWVudEhlYWRlckluZm86OmtEZWZhdWx0U2FtcGxlU2l6ZVByZXNlbnQpIHsKLSAgICAgICAgaWYgKHNpemUgPCA0KSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQsICZtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubURlZmF1bHRTYW1wbGVTaXplKSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotICAgICAgICBvZmZzZXQgKz0gNDsKLSAgICAgICAgc2l6ZSAtPSA0OwotICAgIH0KLQotICAgIGlmIChmbGFncyAmIFRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvOjprRGVmYXVsdFNhbXBsZUZsYWdzUHJlc2VudCkgewotICAgICAgICBpZiAoc2l6ZSA8IDQpIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJm1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRGVmYXVsdFNhbXBsZUZsYWdzKSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotICAgICAgICBvZmZzZXQgKz0gNDsKLSAgICAgICAgc2l6ZSAtPSA0OwotICAgIH0KLQotICAgIGlmICghKGZsYWdzICYgVHJhY2tGcmFnbWVudEhlYWRlckluZm86OmtCYXNlRGF0YU9mZnNldFByZXNlbnQpKSB7Ci0gICAgICAgIG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tQmFzZURhdGFPZmZzZXQgPSBtQ3VycmVudE1vb2ZPZmZzZXQ7Ci0gICAgfQotCi0gICAgbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1EYXRhT2Zmc2V0ID0gMDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IE1QRUc0U291cmNlOjpwYXJzZVRyYWNrRnJhZ21lbnRSdW4ob2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3Qgc2l6ZSkgewotCi0gICAgQUxPR1YoIk1QRUc0RXh0cmFjdG9yOjpwYXJzZVRyYWNrRnJhZ21lbnRSdW4iKTsKLSAgICBpZiAoc2l6ZSA8IDgpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgZW51bSB7Ci0gICAgICAgIGtEYXRhT2Zmc2V0UHJlc2VudCAgICAgICAgICAgICAgICAgID0gMHgwMSwKLSAgICAgICAga0ZpcnN0U2FtcGxlRmxhZ3NQcmVzZW50ICAgICAgICAgICAgPSAweDA0LAotICAgICAgICBrU2FtcGxlRHVyYXRpb25QcmVzZW50ICAgICAgICAgICAgICA9IDB4MTAwLAotICAgICAgICBrU2FtcGxlU2l6ZVByZXNlbnQgICAgICAgICAgICAgICAgICA9IDB4MjAwLAotICAgICAgICBrU2FtcGxlRmxhZ3NQcmVzZW50ICAgICAgICAgICAgICAgICA9IDB4NDAwLAotICAgICAgICBrU2FtcGxlQ29tcG9zaXRpb25UaW1lT2Zmc2V0UHJlc2VudCA9IDB4ODAwLAotICAgIH07Ci0KLSAgICB1aW50MzJfdCBmbGFnczsKLSAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmZmxhZ3MpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotICAgIC8vIHx2ZXJzaW9ufCBvbmx5IGFmZmVjdHMgU2FtcGxlQ29tcG9zaXRpb25UaW1lT2Zmc2V0IGZpZWxkLgotICAgIC8vIElmIHZlcnNpb24gPT0gMCwgU2FtcGxlQ29tcG9zaXRpb25UaW1lT2Zmc2V0IGlzIHVpbnQzMl90OwotICAgIC8vIE90aGVyd2lzZSwgU2FtcGxlQ29tcG9zaXRpb25UaW1lT2Zmc2V0IGlzIGludDMyX3QuCi0gICAgLy8gU2FtcGxlLmNvbXBvc2l0aW9uT2Zmc2V0IGlzIGRlZmluZWQgYXMgaW50MzJfdC4KLSAgICB1aW50OF90IHZlcnNpb24gPSBmbGFncyA+PiAyNDsKLSAgICBmbGFncyAmPSAweGZmZmZmZjsKLSAgICBBTE9HVigiZnJhZ21lbnQgcnVuIHZlcnNpb246IDB4JTAyeCwgZmxhZ3M6IDB4JTA2eCIsIHZlcnNpb24sIGZsYWdzKTsKLQotICAgIGlmICgoZmxhZ3MgJiBrRmlyc3RTYW1wbGVGbGFnc1ByZXNlbnQpICYmIChmbGFncyAmIGtTYW1wbGVGbGFnc1ByZXNlbnQpKSB7Ci0gICAgICAgIC8vIFRoZXNlIHR3byBzaGFsbCBub3QgYmUgdXNlZCB0b2dldGhlci4KLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgdWludDMyX3Qgc2FtcGxlQ291bnQ7Ci0gICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCArIDQsICZzYW1wbGVDb3VudCkpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0gICAgb2Zmc2V0ICs9IDg7Ci0gICAgc2l6ZSAtPSA4OwotCi0gICAgdWludDY0X3QgZGF0YU9mZnNldCA9IG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRGF0YU9mZnNldDsKLQotICAgIHVpbnQzMl90IGZpcnN0U2FtcGxlRmxhZ3MgPSAwOwotCi0gICAgaWYgKGZsYWdzICYga0RhdGFPZmZzZXRQcmVzZW50KSB7Ci0gICAgICAgIGlmIChzaXplIDwgNCkgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQzMl90IGRhdGFPZmZzZXREZWx0YTsKLSAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgKHVpbnQzMl90KikmZGF0YU9mZnNldERlbHRhKSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIGRhdGFPZmZzZXQgPSBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubUJhc2VEYXRhT2Zmc2V0ICsgZGF0YU9mZnNldERlbHRhOwotCi0gICAgICAgIG9mZnNldCArPSA0OwotICAgICAgICBzaXplIC09IDQ7Ci0gICAgfQotCi0gICAgaWYgKGZsYWdzICYga0ZpcnN0U2FtcGxlRmxhZ3NQcmVzZW50KSB7Ci0gICAgICAgIGlmIChzaXplIDwgNCkgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmZmlyc3RTYW1wbGVGbGFncykpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLSAgICAgICAgb2Zmc2V0ICs9IDQ7Ci0gICAgICAgIHNpemUgLT0gNDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBzYW1wbGVEdXJhdGlvbiA9IDAsIHNhbXBsZVNpemUgPSAwLCBzYW1wbGVGbGFncyA9IDAsCi0gICAgICAgICAgICAgc2FtcGxlQ3RzT2Zmc2V0ID0gMDsKLQotICAgIHNpemVfdCBieXRlc1BlclNhbXBsZSA9IDA7Ci0gICAgaWYgKGZsYWdzICYga1NhbXBsZUR1cmF0aW9uUHJlc2VudCkgewotICAgICAgICBieXRlc1BlclNhbXBsZSArPSA0OwotICAgIH0gZWxzZSBpZiAobVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1GbGFncwotICAgICAgICAgICAgJiBUcmFja0ZyYWdtZW50SGVhZGVySW5mbzo6a0RlZmF1bHRTYW1wbGVEdXJhdGlvblByZXNlbnQpIHsKLSAgICAgICAgc2FtcGxlRHVyYXRpb24gPSBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubURlZmF1bHRTYW1wbGVEdXJhdGlvbjsKLSAgICB9IGVsc2UgaWYgKG1UcmV4KSB7Ci0gICAgICAgIHNhbXBsZUR1cmF0aW9uID0gbVRyZXgtPmRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uOwotICAgIH0KLQotICAgIGlmIChmbGFncyAmIGtTYW1wbGVTaXplUHJlc2VudCkgewotICAgICAgICBieXRlc1BlclNhbXBsZSArPSA0OwotICAgIH0gZWxzZSBpZiAobVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1GbGFncwotICAgICAgICAgICAgJiBUcmFja0ZyYWdtZW50SGVhZGVySW5mbzo6a0RlZmF1bHRTYW1wbGVTaXplUHJlc2VudCkgewotICAgICAgICBzYW1wbGVTaXplID0gbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1EZWZhdWx0U2FtcGxlU2l6ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBzYW1wbGVTaXplID0gbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1EZWZhdWx0U2FtcGxlU2l6ZTsKLSAgICB9Ci0KLSAgICBpZiAoZmxhZ3MgJiBrU2FtcGxlRmxhZ3NQcmVzZW50KSB7Ci0gICAgICAgIGJ5dGVzUGVyU2FtcGxlICs9IDQ7Ci0gICAgfSBlbHNlIGlmIChtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubUZsYWdzCi0gICAgICAgICAgICAmIFRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvOjprRGVmYXVsdFNhbXBsZUZsYWdzUHJlc2VudCkgewotICAgICAgICBzYW1wbGVGbGFncyA9IG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRGVmYXVsdFNhbXBsZUZsYWdzOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNhbXBsZUZsYWdzID0gbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1EZWZhdWx0U2FtcGxlRmxhZ3M7Ci0gICAgfQotCi0gICAgaWYgKGZsYWdzICYga1NhbXBsZUNvbXBvc2l0aW9uVGltZU9mZnNldFByZXNlbnQpIHsKLSAgICAgICAgYnl0ZXNQZXJTYW1wbGUgKz0gNDsKLSAgICB9IGVsc2UgewotICAgICAgICBzYW1wbGVDdHNPZmZzZXQgPSAwOwotICAgIH0KLQotICAgIGlmIChzaXplIDwgKG9mZjY0X3QpKHNhbXBsZUNvdW50ICogYnl0ZXNQZXJTYW1wbGUpKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIFNhbXBsZSB0bXA7Ci0gICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHNhbXBsZUNvdW50OyArK2kpIHsKLSAgICAgICAgaWYgKGZsYWdzICYga1NhbXBsZUR1cmF0aW9uUHJlc2VudCkgewotICAgICAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJnNhbXBsZUR1cmF0aW9uKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvZmZzZXQgKz0gNDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmbGFncyAmIGtTYW1wbGVTaXplUHJlc2VudCkgewotICAgICAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJnNhbXBsZVNpemUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9mZnNldCArPSA0OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZsYWdzICYga1NhbXBsZUZsYWdzUHJlc2VudCkgewotICAgICAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJnNhbXBsZUZsYWdzKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvZmZzZXQgKz0gNDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmbGFncyAmIGtTYW1wbGVDb21wb3NpdGlvblRpbWVPZmZzZXRQcmVzZW50KSB7Ci0gICAgICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmc2FtcGxlQ3RzT2Zmc2V0KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvZmZzZXQgKz0gNDsKLSAgICAgICAgfQotCi0gICAgICAgIEFMT0dWKCJhZGRpbmcgc2FtcGxlICVkIGF0IG9mZnNldCAweCUwOCIgUFJJeDY0ICIsIHNpemUgJXUsIGR1cmF0aW9uICV1LCAiCi0gICAgICAgICAgICAgICIgZmxhZ3MgMHglMDh4IiwgaSArIDEsCi0gICAgICAgICAgICAgICAgZGF0YU9mZnNldCwgc2FtcGxlU2l6ZSwgc2FtcGxlRHVyYXRpb24sCi0gICAgICAgICAgICAgICAgKGZsYWdzICYga0ZpcnN0U2FtcGxlRmxhZ3NQcmVzZW50KSAmJiBpID09IDAKLSAgICAgICAgICAgICAgICAgICAgPyBmaXJzdFNhbXBsZUZsYWdzIDogc2FtcGxlRmxhZ3MpOwotICAgICAgICB0bXAub2Zmc2V0ID0gZGF0YU9mZnNldDsKLSAgICAgICAgdG1wLnNpemUgPSBzYW1wbGVTaXplOwotICAgICAgICB0bXAuZHVyYXRpb24gPSBzYW1wbGVEdXJhdGlvbjsKLSAgICAgICAgdG1wLmNvbXBvc2l0aW9uT2Zmc2V0ID0gc2FtcGxlQ3RzT2Zmc2V0OwotICAgICAgICBtQ3VycmVudFNhbXBsZXMuYWRkKHRtcCk7Ci0KLSAgICAgICAgZGF0YU9mZnNldCArPSBzYW1wbGVTaXplOwotICAgIH0KLQotICAgIG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRGF0YU9mZnNldCA9IGRhdGFPZmZzZXQ7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXNwPE1ldGFEYXRhPiBNUEVHNFNvdXJjZTo6Z2V0Rm9ybWF0KCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICByZXR1cm4gbUZvcm1hdDsKLX0KLQotc2l6ZV90IE1QRUc0U291cmNlOjpwYXJzZU5BTFNpemUoY29uc3QgdWludDhfdCAqZGF0YSkgY29uc3QgewotICAgIHN3aXRjaCAobU5BTExlbmd0aFNpemUpIHsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgcmV0dXJuICpkYXRhOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICByZXR1cm4gVTE2X0FUKGRhdGEpOwotICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICByZXR1cm4gKChzaXplX3QpZGF0YVswXSA8PCAxNikgfCBVMTZfQVQoJmRhdGFbMV0pOwotICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICByZXR1cm4gVTMyX0FUKGRhdGEpOwotICAgIH0KLQotICAgIC8vIFRoaXMgY2Fubm90IGhhcHBlbiwgbU5BTExlbmd0aFNpemUgc3ByaW5ncyB0byBsaWZlIGJ5IGFkZGluZyAxIHRvCi0gICAgLy8gYSAyLWJpdCBpbnRlZ2VyLgotICAgIENIRUNLKCEiU2hvdWxkIG5vdCBiZSBoZXJlLiIpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXR1c190IE1QRUc0U291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgQ0hFQ0sobVN0YXJ0ZWQpOwotCi0gICAgaWYgKG9wdGlvbnMgIT0gbnVsbHB0ciAmJiBvcHRpb25zLT5nZXROb25CbG9ja2luZygpICYmICFtR3JvdXAtPmhhc19idWZmZXJzKCkpIHsKLSAgICAgICAgKm91dCA9IG51bGxwdHI7Ci0gICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKLSAgICB9Ci0KLSAgICBpZiAobUZpcnN0TW9vZk9mZnNldCA+IDApIHsKLSAgICAgICAgcmV0dXJuIGZyYWdtZW50ZWRSZWFkKG91dCwgb3B0aW9ucyk7Ci0gICAgfQotCi0gICAgKm91dCA9IE5VTEw7Ci0KLSAgICBpbnQ2NF90IHRhcmdldFNhbXBsZVRpbWVVcyA9IC0xOwotCi0gICAgaW50NjRfdCBzZWVrVGltZVVzOwotICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOwotICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7Ci0gICAgICAgIGlmIChtSXNIRUlGKSB7Ci0gICAgICAgICAgICBDSEVDSyhtU2FtcGxlVGFibGUgPT0gTlVMTCk7Ci0gICAgICAgICAgICBDSEVDSyhtSXRlbVRhYmxlICE9IE5VTEwpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBlcnI7Ci0gICAgICAgICAgICBpZiAoc2Vla1RpbWVVcyA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gbUl0ZW1UYWJsZS0+ZmluZFByaW1hcnlJbWFnZSgmbUN1cnJlbnRTYW1wbGVJbmRleCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVyciA9IG1JdGVtVGFibGUtPmZpbmRUaHVtYm5haWwoJm1DdXJyZW50U2FtcGxlSW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB1aW50MzJfdCBmaW5kRmxhZ3MgPSAwOwotICAgICAgICAgICAgc3dpdGNoIChtb2RlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DOgotICAgICAgICAgICAgICAgICAgICBmaW5kRmxhZ3MgPSBTYW1wbGVUYWJsZTo6a0ZsYWdCZWZvcmU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgUmVhZE9wdGlvbnM6OlNFRUtfTkVYVF9TWU5DOgotICAgICAgICAgICAgICAgICAgICBmaW5kRmxhZ3MgPSBTYW1wbGVUYWJsZTo6a0ZsYWdBZnRlcjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUX1NZTkM6Ci0gICAgICAgICAgICAgICAgY2FzZSBSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUOgotICAgICAgICAgICAgICAgICAgICBmaW5kRmxhZ3MgPSBTYW1wbGVUYWJsZTo6a0ZsYWdDbG9zZXN0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBDSEVDSyghIlNob3VsZCBub3QgYmUgaGVyZS4iKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZUluZGV4OwotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNhbXBsZVRhYmxlLT5maW5kU2FtcGxlQXRUaW1lKAotICAgICAgICAgICAgICAgICAgICBzZWVrVGltZVVzLCAxMDAwMDAwLCBtVGltZXNjYWxlLAotICAgICAgICAgICAgICAgICAgICAmc2FtcGxlSW5kZXgsIGZpbmRGbGFncyk7Ci0KLSAgICAgICAgICAgIGlmIChtb2RlID09IFJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1QpIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBmb3VuZCB0aGUgY2xvc2VzdCBzYW1wbGUgYWxyZWFkeSwgbm93IHdlIHdhbnQgdGhlIHN5bmMKLSAgICAgICAgICAgICAgICAvLyBzYW1wbGUgcHJlY2VkaW5nIGl0IChvciB0aGUgc2FtcGxlIGl0c2VsZiBvZiBjb3Vyc2UpLCBldmVuCi0gICAgICAgICAgICAgICAgLy8gaWYgdGhlIHN1YnNlcXVlbnQgc3luYyBzYW1wbGUgaXMgY2xvc2VyLgotICAgICAgICAgICAgICAgIGZpbmRGbGFncyA9IFNhbXBsZVRhYmxlOjprRmxhZ0JlZm9yZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdWludDMyX3Qgc3luY1NhbXBsZUluZGV4OwotICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgICAgIGVyciA9IG1TYW1wbGVUYWJsZS0+ZmluZFN5bmNTYW1wbGVOZWFyKAotICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlSW5kZXgsICZzeW5jU2FtcGxlSW5kZXgsIGZpbmRGbGFncyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVRpbWU7Ci0gICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gbVNhbXBsZVRhYmxlLT5nZXRNZXRhRGF0YUZvclNhbXBsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUluZGV4LCBOVUxMLCBOVUxMLCAmc2FtcGxlVGltZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBpZiAoZXJyID09IEVSUk9SX09VVF9PRl9SQU5HRSkgewotICAgICAgICAgICAgICAgICAgICAvLyBBbiBhdHRlbXB0IHRvIHNlZWsgcGFzdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gd291bGQKLSAgICAgICAgICAgICAgICAgICAgLy8gbm9ybWFsbHkgY2F1c2UgdGhpcyBFUlJPUl9PVVRfT0ZfUkFOR0UgZXJyb3IuIFByb3BhZ2F0aW5nCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgYWxsIHRoZSB3YXkgdG8gdGhlIE1lZGlhUGxheWVyIHdvdWxkIGNhdXNlIGFibm9ybWFsCi0gICAgICAgICAgICAgICAgICAgIC8vIHRlcm1pbmF0aW9uLiBMZWdhY3kgYmVoYXZpb3VyIGFwcGVhcnMgdG8gYmUgdG8gYmVoYXZlIGFzIGlmCi0gICAgICAgICAgICAgICAgICAgIC8vIHdlIGhhZCBzZWVrZWQgdG8gdGhlIGVuZCBvZiBzdHJlYW0sIGVuZGluZyBub3JtYWxseS4KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQUxPR1YoImVuZCBvZiBzdHJlYW0iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobW9kZSA9PSBSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUKSB7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0U2FtcGxlVGltZVVzID0gKHNhbXBsZVRpbWUgKiAxMDAwMDAwbGwpIC8gbVRpbWVzY2FsZTsKLSAgICAgICAgICAgIH0KLQotI2lmIDAKLSAgICAgICAgICAgIHVpbnQzMl90IHN5bmNTYW1wbGVUaW1lOwotICAgICAgICAgICAgQ0hFQ0tfRVEoT0ssIG1TYW1wbGVUYWJsZS0+Z2V0TWV0YURhdGFGb3JTYW1wbGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBzeW5jU2FtcGxlSW5kZXgsIE5VTEwsIE5VTEwsICZzeW5jU2FtcGxlVGltZSkpOwotCi0gICAgICAgICAgICBBTE9HSSgic2VlayB0byB0aW1lICVsbGQgdXMgPT4gc2FtcGxlIGF0IHRpbWUgJWxsZCB1cywgIgotICAgICAgICAgICAgICAgICAic3luYyBzYW1wbGUgYXQgdGltZSAlbGxkIHVzIiwKLSAgICAgICAgICAgICAgICAgc2Vla1RpbWVVcywKLSAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSAqIDEwMDAwMDBsbCAvIG1UaW1lc2NhbGUsCi0gICAgICAgICAgICAgICAgIHN5bmNTYW1wbGVUaW1lICogMTAwMDAwMGxsIC8gbVRpbWVzY2FsZSk7Ci0jZW5kaWYKLQotICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCA9IHN5bmNTYW1wbGVJbmRleDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZmFsbCB0aHJvdWdoCi0gICAgfQotCi0gICAgb2ZmNjRfdCBvZmZzZXQgPSAwOwotICAgIHNpemVfdCBzaXplID0gMDsKLSAgICB1aW50MzJfdCBjdHMsIHN0dHM7Ci0gICAgYm9vbCBpc1N5bmNTYW1wbGU7Ci0gICAgYm9vbCBuZXdCdWZmZXIgPSBmYWxzZTsKLSAgICBpZiAobUJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgIG5ld0J1ZmZlciA9IHRydWU7Ci0KLSAgICAgICAgc3RhdHVzX3QgZXJyOwotICAgICAgICBpZiAoIW1Jc0hFSUYpIHsKLSAgICAgICAgICAgIGVyciA9IG1TYW1wbGVUYWJsZS0+Z2V0TWV0YURhdGFGb3JTYW1wbGUoCi0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlSW5kZXgsICZvZmZzZXQsICZzaXplLCAmY3RzLCAmaXNTeW5jU2FtcGxlLCAmc3R0cyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlcnIgPSBtSXRlbVRhYmxlLT5nZXRJbWFnZU9mZnNldEFuZFNpemUoCi0gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtQ3VycmVudFNhbXBsZUluZGV4IDogTlVMTCwgJm9mZnNldCwgJnNpemUpOwotCi0gICAgICAgICAgICBjdHMgPSBzdHRzID0gMDsKLSAgICAgICAgICAgIGlzU3luY1NhbXBsZSA9IDA7Ci0gICAgICAgICAgICBBTE9HVigiaW1hZ2Ugb2Zmc2V0ICVsbGQsIHNpemUgJXp1IiwgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJm1CdWZmZXIpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIENIRUNLKG1CdWZmZXIgPT0gTlVMTCk7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzaXplID4gbUJ1ZmZlci0+c2l6ZSgpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiYnVmZmVyIHRvbyBzbWFsbDogJXp1ID4gJXp1Iiwgc2l6ZSwgbUJ1ZmZlci0+c2l6ZSgpKTsKLSAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0JVRkZFUl9UT09fU01BTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoKCFtSXNBVkMgJiYgIW1Jc0hFVkMpIHx8IG1XYW50c05BTEZyYWdtZW50cykgewotICAgICAgICBpZiAobmV3QnVmZmVyKSB7Ci0gICAgICAgICAgICBzc2l6ZV90IG51bV9ieXRlc19yZWFkID0KLSAgICAgICAgICAgICAgICBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgKHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCksIHNpemUpOwotCi0gICAgICAgICAgICBpZiAobnVtX2J5dGVzX3JlYWQgPCAoc3NpemVfdClzaXplKSB7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOwotICAgICAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIHNpemUpOwotICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPmNsZWFyKCk7Ci0gICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlUaW1lLCAoKGludDY0X3QpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKLSAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAga0tleUR1cmF0aW9uLCAoKGludDY0X3Qpc3R0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7Ci0KLSAgICAgICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMCkgewotICAgICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlUYXJnZXRUaW1lLCB0YXJnZXRTYW1wbGVUaW1lVXMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaXNTeW5jU2FtcGxlKSB7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICsrbUN1cnJlbnRTYW1wbGVJbmRleDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbUlzQVZDICYmICFtSXNIRVZDKSB7Ci0gICAgICAgICAgICAqb3V0ID0gbUJ1ZmZlcjsKLSAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotCi0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBFYWNoIE5BTCB1bml0IGlzIHNwbGl0IHVwIGludG8gaXRzIGNvbnN0aXR1ZW50IGZyYWdtZW50cyBhbmQKLSAgICAgICAgLy8gZWFjaCBvbmUgb2YgdGhlbSByZXR1cm5lZCBpbiBpdHMgb3duIGJ1ZmZlci4KLQotICAgICAgICBDSEVDSyhtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA+PSBtTkFMTGVuZ3RoU2l6ZSk7Ci0KLSAgICAgICAgY29uc3QgdWludDhfdCAqc3JjID0KLSAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpICsgbUJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7Ci0KLSAgICAgICAgc2l6ZV90IG5hbF9zaXplID0gcGFyc2VOQUxTaXplKHNyYyk7Ci0gICAgICAgIGlmIChtTkFMTGVuZ3RoU2l6ZSA+IFNJWkVfTUFYIC0gbmFsX3NpemUpIHsKLSAgICAgICAgICAgIEFMT0dFKCJiLzI0NDQxNTUzLCBiLzI0NDQ1MTIyIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpIC0gbU5BTExlbmd0aFNpemUgPCBuYWxfc2l6ZSkgewotICAgICAgICAgICAgQUxPR0UoImluY29tcGxldGUgTkFMIHVuaXQuIik7Ci0KLSAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotCi0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgTWVkaWFCdWZmZXIgKmNsb25lID0gbUJ1ZmZlci0+Y2xvbmUoKTsKLSAgICAgICAgQ0hFQ0soY2xvbmUgIT0gTlVMTCk7Ci0gICAgICAgIGNsb25lLT5zZXRfcmFuZ2UobUJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkgKyBtTkFMTGVuZ3RoU2l6ZSwgbmFsX3NpemUpOwotCi0gICAgICAgIENIRUNLKG1CdWZmZXIgIT0gTlVMTCk7Ci0gICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5yYW5nZV9vZmZzZXQoKSArIG1OQUxMZW5ndGhTaXplICsgbmFsX3NpemUsCi0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgLSBtTkFMTGVuZ3RoU2l6ZSAtIG5hbF9zaXplKTsKLQotICAgICAgICBpZiAobUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICAqb3V0ID0gY2xvbmU7Ci0KLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFdob2xlIE5BTCB1bml0cyBhcmUgcmV0dXJuZWQgYnV0IGVhY2ggZnJhZ21lbnQgaXMgcHJlZml4ZWQgYnkKLSAgICAgICAgLy8gdGhlIHN0YXJ0IGNvZGUgKDB4MDAgMDAgMDAgMDEpLgotICAgICAgICBzc2l6ZV90IG51bV9ieXRlc19yZWFkID0gMDsKLSAgICAgICAgaW50MzJfdCBkcm0gPSAwOwotICAgICAgICBib29sIHVzZXNEUk0gPSAobUZvcm1hdC0+ZmluZEludDMyKGtLZXlJc0RSTSwgJmRybSkgJiYgZHJtICE9IDApOwotICAgICAgICBpZiAodXNlc0RSTSkgewotICAgICAgICAgICAgbnVtX2J5dGVzX3JlYWQgPQotICAgICAgICAgICAgICAgIG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCAodWludDhfdCopbUJ1ZmZlci0+ZGF0YSgpLCBzaXplKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG51bV9ieXRlc19yZWFkID0gbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIG1TcmNCdWZmZXIsIHNpemUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG51bV9ieXRlc19yZWFkIDwgKHNzaXplX3Qpc2l6ZSkgewotICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0KLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh1c2VzRFJNKSB7Ci0gICAgICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOwotICAgICAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIHNpemUpOwotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB1aW50OF90ICpkc3REYXRhID0gKHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCk7Ci0gICAgICAgICAgICBzaXplX3Qgc3JjT2Zmc2V0ID0gMDsKLSAgICAgICAgICAgIHNpemVfdCBkc3RPZmZzZXQgPSAwOwotCi0gICAgICAgICAgICB3aGlsZSAoc3JjT2Zmc2V0IDwgc2l6ZSkgewotICAgICAgICAgICAgICAgIGJvb2wgaXNNYWxGb3JtZWQgPSAhaXNJblJhbmdlKChzaXplX3QpMHUsIHNpemUsIHNyY09mZnNldCwgbU5BTExlbmd0aFNpemUpOwotICAgICAgICAgICAgICAgIHNpemVfdCBuYWxMZW5ndGggPSAwOwotICAgICAgICAgICAgICAgIGlmICghaXNNYWxGb3JtZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgbmFsTGVuZ3RoID0gcGFyc2VOQUxTaXplKCZtU3JjQnVmZmVyW3NyY09mZnNldF0pOwotICAgICAgICAgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbU5BTExlbmd0aFNpemU7Ci0gICAgICAgICAgICAgICAgICAgIGlzTWFsRm9ybWVkID0gIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBzaXplLCBzcmNPZmZzZXQsIG5hbExlbmd0aCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzTWFsRm9ybWVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJWaWRlbyBpcyBtYWxmb3JtZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFsTGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGRzdE9mZnNldCA+IFNJWkVfTUFYIC0gNCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICsgNCA+IFNJWkVfTUFYIC0gbmFsTGVuZ3RoIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQgKyA0ICsgbmFsTGVuZ3RoID4gbUJ1ZmZlci0+c2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJiLzI3MjA4NjIxIDogJXp1ICV6dSIsIGRzdE9mZnNldCwgbUJ1ZmZlci0+c2l6ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNzIwODYyMSIpOwotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKLSAgICAgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7Ci0gICAgICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOwotICAgICAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoJmRzdERhdGFbZHN0T2Zmc2V0XSwgJm1TcmNCdWZmZXJbc3JjT2Zmc2V0XSwgbmFsTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbmFsTGVuZ3RoOwotICAgICAgICAgICAgICAgIGRzdE9mZnNldCArPSBuYWxMZW5ndGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDSEVDS19FUShzcmNPZmZzZXQsIHNpemUpOwotICAgICAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKLSAgICAgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBkc3RPZmZzZXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPmNsZWFyKCk7Ci0gICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICBrS2V5VGltZSwgKChpbnQ2NF90KWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7Ci0gICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sICgoaW50NjRfdClzdHRzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKLQotICAgICAgICBpZiAodGFyZ2V0U2FtcGxlVGltZVVzID49IDApIHsKLSAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAga0tleVRhcmdldFRpbWUsIHRhcmdldFNhbXBsZVRpbWVVcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUlzQVZDKSB7Ci0gICAgICAgICAgICB1aW50MzJfdCBsYXllcklkID0gRmluZEFWQ0xheWVySWQoCi0gICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7Ci0gICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoa0tleVRlbXBvcmFsTGF5ZXJJZCwgbGF5ZXJJZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXNTeW5jU2FtcGxlKSB7Ci0gICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKLSAgICAgICAgfQotCi0gICAgICAgICsrbUN1cnJlbnRTYW1wbGVJbmRleDsKLQotICAgICAgICAqb3V0ID0gbUJ1ZmZlcjsKLSAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0KLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLX0KLQotc3RhdHVzX3QgTVBFRzRTb3VyY2U6OmZyYWdtZW50ZWRSZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKLQotICAgIEFMT0dWKCJNUEVHNFNvdXJjZTo6ZnJhZ21lbnRlZFJlYWQiKTsKLQotICAgIENIRUNLKG1TdGFydGVkKTsKLQotICAgICpvdXQgPSBOVUxMOwotCi0gICAgaW50NjRfdCB0YXJnZXRTYW1wbGVUaW1lVXMgPSAtMTsKLQotICAgIGludDY0X3Qgc2Vla1RpbWVVczsKLSAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKLSAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSkgewotCi0gICAgICAgIGludCBudW1TaWR4RW50cmllcyA9IG1TZWdtZW50cy5zaXplKCk7Ci0gICAgICAgIGlmIChudW1TaWR4RW50cmllcyAhPSAwKSB7Ci0gICAgICAgICAgICBpbnQ2NF90IHRvdGFsVGltZSA9IDA7Ci0gICAgICAgICAgICBvZmY2NF90IHRvdGFsT2Zmc2V0ID0gbUZpcnN0TW9vZk9mZnNldDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU2lkeEVudHJpZXM7IGkrKykgewotICAgICAgICAgICAgICAgIGNvbnN0IFNpZHhFbnRyeSAqc2UgPSAmbVNlZ21lbnRzW2ldOwotICAgICAgICAgICAgICAgIGlmICh0b3RhbFRpbWUgKyBzZS0+bUR1cmF0aW9uVXMgPiBzZWVrVGltZVVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSByZXF1ZXN0ZWQgdGltZSBpcyBzb21ld2hlcmUgaW4gdGhpcyBzZWdtZW50Ci0gICAgICAgICAgICAgICAgICAgIGlmICgobW9kZSA9PSBSZWFkT3B0aW9uczo6U0VFS19ORVhUX1NZTkMgJiYgc2Vla1RpbWVVcyA+IHRvdGFsVGltZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIChtb2RlID09IFJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1RfU1lOQyAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKHNlZWtUaW1lVXMgLSB0b3RhbFRpbWUpID4gKHRvdGFsVGltZSArIHNlLT5tRHVyYXRpb25VcyAtIHNlZWtUaW1lVXMpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWVzdGVkIG5leHQgc3luYywgb3IgY2xvc2VzdCBzeW5jIGFuZCBpdCB3YXMgY2xvc2VyIHRvIHRoZSBlbmQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgc2VnbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxUaW1lICs9IHNlLT5tRHVyYXRpb25VczsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsT2Zmc2V0ICs9IHNlLT5tU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdG90YWxUaW1lICs9IHNlLT5tRHVyYXRpb25VczsKLSAgICAgICAgICAgICAgICB0b3RhbE9mZnNldCArPSBzZS0+bVNpemU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ3VycmVudE1vb2ZPZmZzZXQgPSB0b3RhbE9mZnNldDsKLSAgICAgICAgICAgIG1OZXh0TW9vZk9mZnNldCA9IC0xOwotICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVzLmNsZWFyKCk7Ci0gICAgICAgICAgICBtQ3VycmVudFNhbXBsZUluZGV4ID0gMDsKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlQ2h1bmsoJnRvdGFsT2Zmc2V0KTsKLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUN1cnJlbnRUaW1lID0gdG90YWxUaW1lICogbVRpbWVzY2FsZSAvIDEwMDAwMDBsbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHdpdGhvdXQgc2lkeCBib3hlcywgd2UgY2FuIG9ubHkgc2VlayB0byAwCi0gICAgICAgICAgICBtQ3VycmVudE1vb2ZPZmZzZXQgPSBtRmlyc3RNb29mT2Zmc2V0OwotICAgICAgICAgICAgbU5leHRNb29mT2Zmc2V0ID0gLTE7Ci0gICAgICAgICAgICBtQ3VycmVudFNhbXBsZXMuY2xlYXIoKTsKLSAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlSW5kZXggPSAwOwotICAgICAgICAgICAgb2ZmNjRfdCB0bXAgPSBtQ3VycmVudE1vb2ZPZmZzZXQ7Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUNodW5rKCZ0bXApOwotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ3VycmVudFRpbWUgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1CdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmYWxsIHRocm91Z2gKLSAgICB9Ci0KLSAgICBvZmY2NF90IG9mZnNldCA9IDA7Ci0gICAgc2l6ZV90IHNpemUgPSAwOwotICAgIHVpbnQzMl90IGN0cyA9IDA7Ci0gICAgYm9vbCBpc1N5bmNTYW1wbGUgPSBmYWxzZTsKLSAgICBib29sIG5ld0J1ZmZlciA9IGZhbHNlOwotICAgIGlmIChtQnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgbmV3QnVmZmVyID0gdHJ1ZTsKLQotICAgICAgICBpZiAobUN1cnJlbnRTYW1wbGVJbmRleCA+PSBtQ3VycmVudFNhbXBsZXMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAvLyBtb3ZlIHRvIG5leHQgZnJhZ21lbnQgaWYgdGhlcmUgaXMgb25lCi0gICAgICAgICAgICBpZiAobU5leHRNb29mT2Zmc2V0IDw9IG1DdXJyZW50TW9vZk9mZnNldCkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb2ZmNjRfdCBuZXh0TW9vZiA9IG1OZXh0TW9vZk9mZnNldDsKLSAgICAgICAgICAgIG1DdXJyZW50TW9vZk9mZnNldCA9IG5leHRNb29mOwotICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVzLmNsZWFyKCk7Ci0gICAgICAgICAgICBtQ3VycmVudFNhbXBsZUluZGV4ID0gMDsKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlQ2h1bmsoJm5leHRNb29mKTsKLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1DdXJyZW50U2FtcGxlSW5kZXggPj0gbUN1cnJlbnRTYW1wbGVzLnNpemUoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3QgU2FtcGxlICpzbXBsID0gJm1DdXJyZW50U2FtcGxlc1ttQ3VycmVudFNhbXBsZUluZGV4XTsKLSAgICAgICAgb2Zmc2V0ID0gc21wbC0+b2Zmc2V0OwotICAgICAgICBzaXplID0gc21wbC0+c2l6ZTsKLSAgICAgICAgY3RzID0gbUN1cnJlbnRUaW1lICsgc21wbC0+Y29tcG9zaXRpb25PZmZzZXQ7Ci0gICAgICAgIG1DdXJyZW50VGltZSArPSBzbXBsLT5kdXJhdGlvbjsKLSAgICAgICAgaXNTeW5jU2FtcGxlID0gKG1DdXJyZW50U2FtcGxlSW5kZXggPT0gMCk7IC8vIFhYWAotCi0gICAgICAgIHN0YXR1c190IGVyciA9IG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJm1CdWZmZXIpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIENIRUNLKG1CdWZmZXIgPT0gTlVMTCk7Ci0gICAgICAgICAgICBBTE9HVigiYWNxdWlyZV9idWZmZXIgcmV0dXJuZWQgJWQiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2l6ZSA+IG1CdWZmZXItPnNpemUoKSkgewotICAgICAgICAgICAgQUxPR0UoImJ1ZmZlciB0b28gc21hbGw6ICV6dSA+ICV6dSIsIHNpemUsIG1CdWZmZXItPnNpemUoKSk7Ci0gICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9CVUZGRVJfVE9PX1NNQUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgY29uc3QgU2FtcGxlICpzbXBsID0gJm1DdXJyZW50U2FtcGxlc1ttQ3VycmVudFNhbXBsZUluZGV4XTsKLSAgICBjb25zdCBzcDxNZXRhRGF0YT4gYnVmbWV0YSA9IG1CdWZmZXItPm1ldGFfZGF0YSgpOwotICAgIGJ1Zm1ldGEtPmNsZWFyKCk7Ci0gICAgaWYgKHNtcGwtPmVuY3J5cHRlZHNpemVzLnNpemUoKSkgewotICAgICAgICAvLyBzdG9yZSBjbGVhci9lbmNyeXB0ZWQgbGVuZ3RocyBpbiBtZXRhZGF0YQotICAgICAgICBidWZtZXRhLT5zZXREYXRhKGtLZXlQbGFpblNpemVzLCAwLAotICAgICAgICAgICAgICAgIHNtcGwtPmNsZWFyc2l6ZXMuYXJyYXkoKSwgc21wbC0+Y2xlYXJzaXplcy5zaXplKCkgKiA0KTsKLSAgICAgICAgYnVmbWV0YS0+c2V0RGF0YShrS2V5RW5jcnlwdGVkU2l6ZXMsIDAsCi0gICAgICAgICAgICAgICAgc21wbC0+ZW5jcnlwdGVkc2l6ZXMuYXJyYXkoKSwgc21wbC0+ZW5jcnlwdGVkc2l6ZXMuc2l6ZSgpICogNCk7Ci0gICAgICAgIGJ1Zm1ldGEtPnNldERhdGEoa0tleUNyeXB0b0lWLCAwLCBzbXBsLT5pdiwgMTYpOyAvLyB1c2UgMTYgb3IgdGhlIGFjdHVhbCBzaXplPwotICAgICAgICBidWZtZXRhLT5zZXRJbnQzMihrS2V5Q3J5cHRvRGVmYXVsdElWU2l6ZSwgbURlZmF1bHRJVlNpemUpOwotICAgICAgICBidWZtZXRhLT5zZXRJbnQzMihrS2V5Q3J5cHRvTW9kZSwgbUNyeXB0b01vZGUpOwotICAgICAgICBidWZtZXRhLT5zZXREYXRhKGtLZXlDcnlwdG9LZXksIDAsIG1DcnlwdG9LZXksIDE2KTsKLSAgICB9Ci0KLSAgICBpZiAoKCFtSXNBVkMgJiYgIW1Jc0hFVkMpfHwgbVdhbnRzTkFMRnJhZ21lbnRzKSB7Ci0gICAgICAgIGlmIChuZXdCdWZmZXIpIHsKLSAgICAgICAgICAgIGlmICghaXNJblJhbmdlKChzaXplX3QpMHUsIG1CdWZmZXItPnNpemUoKSwgc2l6ZSkpIHsKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0KLSAgICAgICAgICAgICAgICBBTE9HRSgiZnJhZ21lbnRlZFJlYWQgRVJST1JfTUFMRk9STUVEIHNpemUgJXp1Iiwgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3NpemVfdCBudW1fYnl0ZXNfcmVhZCA9Ci0gICAgICAgICAgICAgICAgbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsICh1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpLCBzaXplKTsKLQotICAgICAgICAgICAgaWYgKG51bV9ieXRlc19yZWFkIDwgKHNzaXplX3Qpc2l6ZSkgewotICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLQotICAgICAgICAgICAgICAgIEFMT0dFKCJpL28gZXJyb3IiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENIRUNLKG1CdWZmZXIgIT0gTlVMTCk7Ci0gICAgICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UoMCwgc2l6ZSk7Ci0gICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlUaW1lLCAoKGludDY0X3QpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKLSAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAga0tleUR1cmF0aW9uLCAoKGludDY0X3Qpc21wbC0+ZHVyYXRpb24gKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOwotCi0gICAgICAgICAgICBpZiAodGFyZ2V0U2FtcGxlVGltZVVzID49IDApIHsKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgICAgICBrS2V5VGFyZ2V0VGltZSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1Jc0FWQykgewotICAgICAgICAgICAgICAgIHVpbnQzMl90IGxheWVySWQgPSBGaW5kQVZDTGF5ZXJJZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlUZW1wb3JhbExheWVySWQsIGxheWVySWQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaXNTeW5jU2FtcGxlKSB7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICsrbUN1cnJlbnRTYW1wbGVJbmRleDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbUlzQVZDICYmICFtSXNIRVZDKSB7Ci0gICAgICAgICAgICAqb3V0ID0gbUJ1ZmZlcjsKLSAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotCi0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBFYWNoIE5BTCB1bml0IGlzIHNwbGl0IHVwIGludG8gaXRzIGNvbnN0aXR1ZW50IGZyYWdtZW50cyBhbmQKLSAgICAgICAgLy8gZWFjaCBvbmUgb2YgdGhlbSByZXR1cm5lZCBpbiBpdHMgb3duIGJ1ZmZlci4KLQotICAgICAgICBDSEVDSyhtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA+PSBtTkFMTGVuZ3RoU2l6ZSk7Ci0KLSAgICAgICAgY29uc3QgdWludDhfdCAqc3JjID0KLSAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpICsgbUJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7Ci0KLSAgICAgICAgc2l6ZV90IG5hbF9zaXplID0gcGFyc2VOQUxTaXplKHNyYyk7Ci0gICAgICAgIGlmIChtTkFMTGVuZ3RoU2l6ZSA+IFNJWkVfTUFYIC0gbmFsX3NpemUpIHsKLSAgICAgICAgICAgIEFMT0dFKCJiLzI0NDQxNTUzLCBiLzI0NDQ1MTIyIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgLSBtTkFMTGVuZ3RoU2l6ZSA8IG5hbF9zaXplKSB7Ci0gICAgICAgICAgICBBTE9HRSgiaW5jb21wbGV0ZSBOQUwgdW5pdC4iKTsKLQotICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0KLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBNZWRpYUJ1ZmZlciAqY2xvbmUgPSBtQnVmZmVyLT5jbG9uZSgpOwotICAgICAgICBDSEVDSyhjbG9uZSAhPSBOVUxMKTsKLSAgICAgICAgY2xvbmUtPnNldF9yYW5nZShtQnVmZmVyLT5yYW5nZV9vZmZzZXQoKSArIG1OQUxMZW5ndGhTaXplLCBuYWxfc2l6ZSk7Ci0KLSAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKLSAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKAotICAgICAgICAgICAgICAgIG1CdWZmZXItPnJhbmdlX29mZnNldCgpICsgbU5BTExlbmd0aFNpemUgKyBuYWxfc2l6ZSwKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSAtIG1OQUxMZW5ndGhTaXplIC0gbmFsX3NpemUpOwotCi0gICAgICAgIGlmIChtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgICpvdXQgPSBjbG9uZTsKLQotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIndob2xlIE5BTCIpOwotICAgICAgICAvLyBXaG9sZSBOQUwgdW5pdHMgYXJlIHJldHVybmVkIGJ1dCBlYWNoIGZyYWdtZW50IGlzIHByZWZpeGVkIGJ5Ci0gICAgICAgIC8vIHRoZSBzdGFydCBjb2RlICgweDAwIDAwIDAwIDAxKS4KLSAgICAgICAgc3NpemVfdCBudW1fYnl0ZXNfcmVhZCA9IDA7Ci0gICAgICAgIGludDMyX3QgZHJtID0gMDsKLSAgICAgICAgYm9vbCB1c2VzRFJNID0gKG1Gb3JtYXQtPmZpbmRJbnQzMihrS2V5SXNEUk0sICZkcm0pICYmIGRybSAhPSAwKTsKLSAgICAgICAgdm9pZCAqZGF0YSA9IE5VTEw7Ci0gICAgICAgIGJvb2wgaXNNYWxGb3JtZWQgPSBmYWxzZTsKLSAgICAgICAgaWYgKHVzZXNEUk0pIHsKLSAgICAgICAgICAgIGlmIChtQnVmZmVyID09IE5VTEwgfHwgIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBtQnVmZmVyLT5zaXplKCksIHNpemUpKSB7Ci0gICAgICAgICAgICAgICAgaXNNYWxGb3JtZWQgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkYXRhID0gbUJ1ZmZlci0+ZGF0YSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50MzJfdCBtYXhfc2l6ZTsKLSAgICAgICAgICAgIGlmIChtRm9ybWF0ID09IE5VTEwKLSAgICAgICAgICAgICAgICAgICAgfHwgIW1Gb3JtYXQtPmZpbmRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCAmbWF4X3NpemUpCi0gICAgICAgICAgICAgICAgICAgIHx8ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgKHNpemVfdCltYXhfc2l6ZSwgc2l6ZSkpIHsKLSAgICAgICAgICAgICAgICBpc01hbEZvcm1lZCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRhdGEgPSBtU3JjQnVmZmVyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzTWFsRm9ybWVkIHx8IGRhdGEgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoImlzTWFsRm9ybWVkIHNpemUgJXp1Iiwgc2l6ZSk7Ci0gICAgICAgICAgICBpZiAobUJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotICAgICAgICBudW1fYnl0ZXNfcmVhZCA9IG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBkYXRhLCBzaXplKTsKLQotICAgICAgICBpZiAobnVtX2J5dGVzX3JlYWQgPCAoc3NpemVfdClzaXplKSB7Ci0gICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLQotICAgICAgICAgICAgQUxPR0UoImkvbyBlcnJvciIpOwotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHVzZXNEUk0pIHsKLSAgICAgICAgICAgIENIRUNLKG1CdWZmZXIgIT0gTlVMTCk7Ci0gICAgICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UoMCwgc2l6ZSk7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgKmRzdERhdGEgPSAodWludDhfdCAqKW1CdWZmZXItPmRhdGEoKTsKLSAgICAgICAgICAgIHNpemVfdCBzcmNPZmZzZXQgPSAwOwotICAgICAgICAgICAgc2l6ZV90IGRzdE9mZnNldCA9IDA7Ci0KLSAgICAgICAgICAgIHdoaWxlIChzcmNPZmZzZXQgPCBzaXplKSB7Ci0gICAgICAgICAgICAgICAgaXNNYWxGb3JtZWQgPSAhaXNJblJhbmdlKChzaXplX3QpMHUsIHNpemUsIHNyY09mZnNldCwgbU5BTExlbmd0aFNpemUpOwotICAgICAgICAgICAgICAgIHNpemVfdCBuYWxMZW5ndGggPSAwOwotICAgICAgICAgICAgICAgIGlmICghaXNNYWxGb3JtZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgbmFsTGVuZ3RoID0gcGFyc2VOQUxTaXplKCZtU3JjQnVmZmVyW3NyY09mZnNldF0pOwotICAgICAgICAgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbU5BTExlbmd0aFNpemU7Ci0gICAgICAgICAgICAgICAgICAgIGlzTWFsRm9ybWVkID0gIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBzaXplLCBzcmNPZmZzZXQsIG5hbExlbmd0aCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhaXNJblJhbmdlKChzaXplX3QpMHUsIG1CdWZmZXItPnNpemUoKSwgZHN0T2Zmc2V0LCAoc2l6ZV90KTR1KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgbUJ1ZmZlci0+c2l6ZSgpLCBkc3RPZmZzZXQgKyA0LCBuYWxMZW5ndGgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc01hbEZvcm1lZCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiVmlkZW8gaXMgbWFsZm9ybWVkOyBuYWxMZW5ndGggJXp1IiwgbmFsTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFsTGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGRzdE9mZnNldCA+IFNJWkVfTUFYIC0gNCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICsgNCA+IFNJWkVfTUFYIC0gbmFsTGVuZ3RoIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQgKyA0ICsgbmFsTGVuZ3RoID4gbUJ1ZmZlci0+c2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJiLzI2MzY1MzQ5IDogJXp1ICV6dSIsIGRzdE9mZnNldCwgbUJ1ZmZlci0+c2l6ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNjM2NTM0OSIpOwotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKLSAgICAgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7Ci0gICAgICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOwotICAgICAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoJmRzdERhdGFbZHN0T2Zmc2V0XSwgJm1TcmNCdWZmZXJbc3JjT2Zmc2V0XSwgbmFsTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbmFsTGVuZ3RoOwotICAgICAgICAgICAgICAgIGRzdE9mZnNldCArPSBuYWxMZW5ndGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDSEVDS19FUShzcmNPZmZzZXQsIHNpemUpOwotICAgICAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKLSAgICAgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBkc3RPZmZzZXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KAotICAgICAgICAgICAgICAgIGtLZXlUaW1lLCAoKGludDY0X3QpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKLSAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KAotICAgICAgICAgICAgICAgIGtLZXlEdXJhdGlvbiwgKChpbnQ2NF90KXNtcGwtPmR1cmF0aW9uICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKLQotICAgICAgICBpZiAodGFyZ2V0U2FtcGxlVGltZVVzID49IDApIHsKLSAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAga0tleVRhcmdldFRpbWUsIHRhcmdldFNhbXBsZVRpbWVVcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXNTeW5jU2FtcGxlKSB7Ci0gICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKLSAgICAgICAgfQotCi0gICAgICAgICsrbUN1cnJlbnRTYW1wbGVJbmRleDsKLQotICAgICAgICAqb3V0ID0gbUJ1ZmZlcjsKLSAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0KLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLX0KLQotTVBFRzRFeHRyYWN0b3I6OlRyYWNrICpNUEVHNEV4dHJhY3Rvcjo6ZmluZFRyYWNrQnlNaW1lUHJlZml4KAotICAgICAgICBjb25zdCBjaGFyICptaW1lUHJlZml4KSB7Ci0gICAgZm9yIChUcmFjayAqdHJhY2sgPSBtRmlyc3RUcmFjazsgdHJhY2sgIT0gTlVMTDsgdHJhY2sgPSB0cmFjay0+bmV4dCkgewotICAgICAgICBjb25zdCBjaGFyICptaW1lOwotICAgICAgICBpZiAodHJhY2stPm1ldGEgIT0gTlVMTAotICAgICAgICAgICAgICAgICYmIHRyYWNrLT5tZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKQotICAgICAgICAgICAgICAgICYmICFzdHJuY2FzZWNtcChtaW1lLCBtaW1lUHJlZml4LCBzdHJsZW4obWltZVByZWZpeCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJhY2s7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBNUEVHNEV4dHJhY3Rvcjo6cG9wdWxhdGVNZXRyaWNzKCkgewotICAgIEFMT0dWKCJNUEVHNEV4dHJhY3Rvcjo6cG9wdWxhdGVNZXRyaWNzIik7Ci0gICAgLy8gd3JpdGUgaW50byBtQW5hbHl0aWNzSXRlbQotfQotCi1zdGF0aWMgYm9vbCBMZWdhY3lTbmlmZk1QRUc0KAotICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UpIHsKLSAgICB1aW50OF90IGhlYWRlcls4XTsKLQotICAgIHNzaXplX3QgbiA9IHNvdXJjZS0+cmVhZEF0KDQsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpOwotICAgIGlmIChuIDwgKHNzaXplX3Qpc2l6ZW9mKGhlYWRlcikpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmICghbWVtY21wKGhlYWRlciwgImZ0eXAzZ3AiLCA3KSB8fCAhbWVtY21wKGhlYWRlciwgImZ0eXBtcDQyIiwgOCkKLSAgICAgICAgfHwgIW1lbWNtcChoZWFkZXIsICJmdHlwM2dyNiIsIDgpIHx8ICFtZW1jbXAoaGVhZGVyLCAiZnR5cDNnczYiLCA4KQotICAgICAgICB8fCAhbWVtY21wKGhlYWRlciwgImZ0eXAzZ2U2IiwgOCkgfHwgIW1lbWNtcChoZWFkZXIsICJmdHlwM2dnNiIsIDgpCi0gICAgICAgIHx8ICFtZW1jbXAoaGVhZGVyLCAiZnR5cGlzb20iLCA4KSB8fCAhbWVtY21wKGhlYWRlciwgImZ0eXBNNFYgIiwgOCkKLSAgICAgICAgfHwgIW1lbWNtcChoZWFkZXIsICJmdHlwTTRBICIsIDgpIHx8ICFtZW1jbXAoaGVhZGVyLCAiZnR5cGY0diAiLCA4KQotICAgICAgICB8fCAhbWVtY21wKGhlYWRlciwgImZ0eXBrZGRpIiwgOCkgfHwgIW1lbWNtcChoZWFkZXIsICJmdHlwTTRWUCIsIDgpCi0gICAgICAgIHx8ICFtZW1jbXAoaGVhZGVyLCAiZnR5cG1pZjEiLCA4KSB8fCAhbWVtY21wKGhlYWRlciwgImZ0eXBoZWljIiwgOCkpIHsKLSAgICAgICAgKm1pbWVUeXBlID0gTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUc0OwotICAgICAgICAqY29uZmlkZW5jZSA9IDAuNDsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBib29sIGlzQ29tcGF0aWJsZUJyYW5kKHVpbnQzMl90IGZvdXJjYykgewotICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrQ29tcGF0aWJsZUJyYW5kc1tdID0gewotICAgICAgICBGT1VSQ0MoJ2knLCAncycsICdvJywgJ20nKSwKLSAgICAgICAgRk9VUkNDKCdpJywgJ3MnLCAnbycsICcyJyksCi0gICAgICAgIEZPVVJDQygnYScsICd2JywgJ2MnLCAnMScpLAotICAgICAgICBGT1VSQ0MoJ2gnLCAndicsICdjJywgJzEnKSwKLSAgICAgICAgRk9VUkNDKCdoJywgJ2UnLCAndicsICcxJyksCi0gICAgICAgIEZPVVJDQygnMycsICdnJywgJ3AnLCAnNCcpLAotICAgICAgICBGT1VSQ0MoJ20nLCAncCcsICc0JywgJzEnKSwKLSAgICAgICAgRk9VUkNDKCdtJywgJ3AnLCAnNCcsICcyJyksCi0gICAgICAgIEZPVVJDQygnZCcsICdhJywgJ3MnLCAnaCcpLAotCi0gICAgICAgIC8vIFdvbid0IHByb21pc2UgdGhhdCB0aGUgZm9sbG93aW5nIGZpbGUgdHlwZXMgY2FuIGJlIHBsYXllZC4KLSAgICAgICAgLy8gSnVzdCBnaXZlIHRoZXNlIGZpbGUgdHlwZXMgYSBjaGFuY2UuCi0gICAgICAgIEZPVVJDQygncScsICd0JywgJyAnLCAnICcpLCAgLy8gQXBwbGUncyBRdWlja1RpbWUKLSAgICAgICAgRk9VUkNDKCdNJywgJ1MnLCAnTicsICdWJyksICAvLyBTb255J3MgUFNQCi0KLSAgICAgICAgRk9VUkNDKCczJywgJ2cnLCAnMicsICdhJyksICAvLyAzR1BQMgotICAgICAgICBGT1VSQ0MoJzMnLCAnZycsICcyJywgJ2InKSwKLSAgICAgICAgRk9VUkNDKCdtJywgJ2knLCAnZicsICcxJyksICAvLyBIRUlGIGltYWdlCi0gICAgICAgIEZPVVJDQygnaCcsICdlJywgJ2knLCAnYycpLCAgLy8gSEVJRiBpbWFnZQotICAgIH07Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsKLSAgICAgICAgIGkgPCBzaXplb2Yoa0NvbXBhdGlibGVCcmFuZHMpIC8gc2l6ZW9mKGtDb21wYXRpYmxlQnJhbmRzWzBdKTsKLSAgICAgICAgICsraSkgewotICAgICAgICBpZiAoa0NvbXBhdGlibGVCcmFuZHNbaV0gPT0gZm91cmNjKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLy8gQXR0ZW1wdCB0byBhY3R1YWxseSBwYXJzZSB0aGUgJ2Z0eXAnIGF0b20gYW5kIGRldGVybWluZSBpZiBhIHN1aXRhYmxlCi0vLyBjb21wYXRpYmxlIGJyYW5kIGlzIHByZXNlbnQuCi0vLyBBbHNvIHRyeSB0byBpZGVudGlmeSB3aGVyZSB0aGlzIGZpbGUncyBtZXRhZGF0YSBlbmRzCi0vLyAoZW5kIG9mIHRoZSAnbW9vdicgYXRvbSkgYW5kIHJlcG9ydCBpdCB0byB0aGUgY2FsbGVyIGFzIHBhcnQgb2YKLS8vIHRoZSBtZXRhZGF0YS4KLXN0YXRpYyBib29sIEJldHRlclNuaWZmTVBFRzQoCi0gICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSwKLSAgICAgICAgc3A8QU1lc3NhZ2U+ICptZXRhKSB7Ci0gICAgLy8gV2Ugc2NhbiB1cCB0byAxMjggYnl0ZXMgdG8gaWRlbnRpZnkgdGhpcyBmaWxlIGFzIGFuIE1QNC4KLSAgICBzdGF0aWMgY29uc3Qgb2ZmNjRfdCBrTWF4U2Nhbk9mZnNldCA9IDEyOGxsOwotCi0gICAgb2ZmNjRfdCBvZmZzZXQgPSAwbGw7Ci0gICAgYm9vbCBmb3VuZEdvb2RGaWxlVHlwZSA9IGZhbHNlOwotICAgIG9mZjY0X3QgbW9vdkF0b21FbmRPZmZzZXQgPSAtMWxsOwotICAgIGJvb2wgZG9uZSA9IGZhbHNlOwotCi0gICAgd2hpbGUgKCFkb25lICYmIG9mZnNldCA8IGtNYXhTY2FuT2Zmc2V0KSB7Ci0gICAgICAgIHVpbnQzMl90IGhkclsyXTsKLSAgICAgICAgaWYgKHNvdXJjZS0+cmVhZEF0KG9mZnNldCwgaGRyLCA4KSA8IDgpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHVpbnQ2NF90IGNodW5rU2l6ZSA9IG50b2hsKGhkclswXSk7Ci0gICAgICAgIHVpbnQzMl90IGNodW5rVHlwZSA9IG50b2hsKGhkclsxXSk7Ci0gICAgICAgIG9mZjY0X3QgY2h1bmtEYXRhT2Zmc2V0ID0gb2Zmc2V0ICsgODsKLQotICAgICAgICBpZiAoY2h1bmtTaXplID09IDEpIHsKLSAgICAgICAgICAgIGlmIChzb3VyY2UtPnJlYWRBdChvZmZzZXQgKyA4LCAmY2h1bmtTaXplLCA4KSA8IDgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNodW5rU2l6ZSA9IG50b2g2NChjaHVua1NpemUpOwotICAgICAgICAgICAgY2h1bmtEYXRhT2Zmc2V0ICs9IDg7Ci0KLSAgICAgICAgICAgIGlmIChjaHVua1NpemUgPCAxNikgewotICAgICAgICAgICAgICAgIC8vIFRoZSBzbWFsbGVzdCB2YWxpZCBjaHVuayBpcyAxNiBieXRlcyBsb25nIGluIHRoaXMgY2FzZS4KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIGlmIChjaHVua1NpemUgPCA4KSB7Ci0gICAgICAgICAgICAvLyBUaGUgc21hbGxlc3QgdmFsaWQgY2h1bmsgaXMgOCBieXRlcyBsb25nLgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gKGRhdGFfb2Zmc2V0IC0gb2Zmc2V0KSBpcyBlaXRoZXIgOCBvciAxNgotICAgICAgICBvZmY2NF90IGNodW5rRGF0YVNpemUgPSBjaHVua1NpemUgLSAoY2h1bmtEYXRhT2Zmc2V0IC0gb2Zmc2V0KTsKLSAgICAgICAgaWYgKGNodW5rRGF0YVNpemUgPCAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiYi8yMzU0MDkxNCIpOwotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIGNoYXIgY2h1bmtzdHJpbmdbNV07Ci0gICAgICAgIE1ha2VGb3VyQ0NTdHJpbmcoY2h1bmtUeXBlLCBjaHVua3N0cmluZyk7Ci0gICAgICAgIEFMT0dWKCJzYXcgY2h1bmsgdHlwZSAlcywgc2l6ZSAlIiBQUkl1NjQgIiBAICVsbGQiLCBjaHVua3N0cmluZywgY2h1bmtTaXplLCAobG9uZyBsb25nKW9mZnNldCk7Ci0gICAgICAgIHN3aXRjaCAoY2h1bmtUeXBlKSB7Ci0gICAgICAgICAgICBjYXNlIEZPVVJDQygnZicsICd0JywgJ3knLCAncCcpOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChjaHVua0RhdGFTaXplIDwgOCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdWludDMyX3QgbnVtQ29tcGF0aWJsZUJyYW5kcyA9IChjaHVua0RhdGFTaXplIC0gOCkgLyA0OwotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtQ29tcGF0aWJsZUJyYW5kcyArIDI7ICsraSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIHRoaXMgaW5kZXgsIGl0IHJlZmVycyB0byB0aGUgbWlub3JWZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90IGEgYnJhbmQuCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJyYW5kOwotICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlLT5yZWFkQXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rRGF0YU9mZnNldCArIDQgKiBpLCAmYnJhbmQsIDQpIDwgNCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgYnJhbmQgPSBudG9obChicmFuZCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ29tcGF0aWJsZUJyYW5kKGJyYW5kKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRHb29kRmlsZVR5cGUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoIWZvdW5kR29vZEZpbGVUeXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ3YnKToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtb292QXRvbUVuZE9mZnNldCA9IG9mZnNldCArIGNodW5rU2l6ZTsKLQotICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgb2Zmc2V0ICs9IGNodW5rU2l6ZTsKLSAgICB9Ci0KLSAgICBpZiAoIWZvdW5kR29vZEZpbGVUeXBlKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAqbWltZVR5cGUgPSBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzQ7Ci0gICAgKmNvbmZpZGVuY2UgPSAwLjRmOwotCi0gICAgaWYgKG1vb3ZBdG9tRW5kT2Zmc2V0ID49IDApIHsKLSAgICAgICAgKm1ldGEgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICgqbWV0YSktPnNldEludDY0KCJtZXRhLWRhdGEtc2l6ZSIsIG1vb3ZBdG9tRW5kT2Zmc2V0KTsKLQotICAgICAgICBBTE9HVigiZm91bmQgbWV0YWRhdGEgc2l6ZTogJWxsZCIsIChsb25nIGxvbmcpbW9vdkF0b21FbmRPZmZzZXQpOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFNuaWZmTVBFRzQoCi0gICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSwKLSAgICAgICAgc3A8QU1lc3NhZ2U+ICptZXRhKSB7Ci0gICAgaWYgKEJldHRlclNuaWZmTVBFRzQoc291cmNlLCBtaW1lVHlwZSwgY29uZmlkZW5jZSwgbWV0YSkpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgaWYgKExlZ2FjeVNuaWZmTVBFRzQoc291cmNlLCBtaW1lVHlwZSwgY29uZmlkZW5jZSkpIHsKLSAgICAgICAgQUxPR1coIklkZW50aWZpZWQgc3VwcG9ydGVkIG1wZWc0IHRocm91Z2ggTGVnYWN5U25pZmZNUEVHNC4iKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwCmluZGV4IDc3ODZjNGQuLjZmZjNkNzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAKQEAgLTMyLDIzICszMiwyNCBAQAogCiAjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KIAorI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYXZjX3V0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFyZWNvcmRlci5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAKICNpbmNsdWRlICJpbmNsdWRlL0VTRFMuaCIKICNpbmNsdWRlICJpbmNsdWRlL0hldmNVdGlscy5oIgotI2luY2x1ZGUgImluY2x1ZGUvYXZjX3V0aWxzLmgiCiAKICNpZm5kZWYgX19wcmVkaWN0X2ZhbHNlCiAjZGVmaW5lIF9fcHJlZGljdF9mYWxzZShleHApIF9fYnVpbHRpbl9leHBlY3QoKGV4cCkgIT0gMCwgMCkKQEAgLTgyLDYgKzgzLDkgQEAKIHN0YXRpYyBjb25zdCBjaGFyIGtNZXRhS2V5X1RlbXBvcmFsTGF5ZXJDb3VudFtdID0gImNvbS5hbmRyb2lkLnZpZGVvLnRlbXBvcmFsX2xheWVyc19jb3VudCI7CiAKIHN0YXRpYyBjb25zdCBpbnQga1RpbWVzdGFtcERlYnVnQ291bnQgPSAxMDsKK3N0YXRpYyBjb25zdCBpbnQga0l0ZW1JZEJhc2UgPSAxMDAwMDsKK3N0YXRpYyBjb25zdCBjaGFyIGtFeGlmSGVhZGVyW10gPSB7J0UnLCAneCcsICdpJywgJ2YnLCAnXDAnLCAnXDAnfTsKK3N0YXRpYyBjb25zdCBpbnQzMl90IGtUaWZmSGVhZGVyT2Zmc2V0ID0gaHRvbmwoc2l6ZW9mKGtFeGlmSGVhZGVyKSk7CiAKIHN0YXRpYyBjb25zdCB1aW50OF90IGtNYW5kYXRvcnlIZXZjTmFsVW5pdFR5cGVzWzNdID0gewogICAgIGtIZXZjTmFsVW5pdFR5cGVWcHMsCkBAIC0xMDAsNyArMTA0LDcgQEAKIAogY2xhc3MgTVBFRzRXcml0ZXI6OlRyYWNrIHsKIHB1YmxpYzoKLSAgICBUcmFjayhNUEVHNFdyaXRlciAqb3duZXIsIGNvbnN0IHNwPElNZWRpYVNvdXJjZT4gJnNvdXJjZSwgc2l6ZV90IHRyYWNrSWQpOworICAgIFRyYWNrKE1QRUc0V3JpdGVyICpvd25lciwgY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UsIHNpemVfdCB0cmFja0lkKTsKIAogICAgIH5UcmFjaygpOwogCkBAIC0xMTEsMTQgKzExNSwyMCBAQAogCiAgICAgaW50NjRfdCBnZXREdXJhdGlvblVzKCkgY29uc3Q7CiAgICAgaW50NjRfdCBnZXRFc3RpbWF0ZWRUcmFja1NpemVCeXRlcygpIGNvbnN0OworICAgIGludDMyX3QgZ2V0TWV0YVNpemVJbmNyZWFzZShpbnQzMl90IGFuZ2xlLCBpbnQzMl90IHRyYWNrQ291bnQpIGNvbnN0OwogICAgIHZvaWQgd3JpdGVUcmFja0hlYWRlcihib29sIHVzZTMyQml0T2Zmc2V0ID0gdHJ1ZSk7CiAgICAgaW50NjRfdCBnZXRNaW5DdHRzT2Zmc2V0VGltZVVzKCk7CiAgICAgdm9pZCBidWZmZXJDaHVuayhpbnQ2NF90IHRpbWVzdGFtcFVzKTsKICAgICBib29sIGlzQXZjKCkgY29uc3QgeyByZXR1cm4gbUlzQXZjOyB9CiAgICAgYm9vbCBpc0hldmMoKSBjb25zdCB7IHJldHVybiBtSXNIZXZjOyB9CisgICAgYm9vbCBpc0hlaWMoKSBjb25zdCB7IHJldHVybiBtSXNIZWljOyB9CiAgICAgYm9vbCBpc0F1ZGlvKCkgY29uc3QgeyByZXR1cm4gbUlzQXVkaW87IH0KICAgICBib29sIGlzTVBFRzQoKSBjb25zdCB7IHJldHVybiBtSXNNUEVHNDsgfQorICAgIGJvb2wgdXNlUHJlZml4KCkgY29uc3QgeyByZXR1cm4gbUlzQXZjIHx8IG1Jc0hldmMgfHwgbUlzSGVpYzsgfQorICAgIGJvb2wgaXNFeGlmRGF0YShjb25zdCBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcikgY29uc3Q7CiAgICAgdm9pZCBhZGRDaHVua09mZnNldChvZmY2NF90IG9mZnNldCk7CisgICAgdm9pZCBhZGRJdGVtT2Zmc2V0QW5kU2l6ZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUsIGJvb2wgaXNFeGlmKTsKKyAgICB2b2lkIGZsdXNoSXRlbVJlZnMoKTsKICAgICBpbnQzMl90IGdldFRyYWNrSWQoKSBjb25zdCB7IHJldHVybiBtVHJhY2tJZDsgfQogICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdDsKICAgICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0Rm91ckNDRm9yTWltZShjb25zdCBjaGFyICptaW1lKTsKQEAgLTI3MSw3ICsyODEsNyBAQAogCiAgICAgTVBFRzRXcml0ZXIgKm1Pd25lcjsKICAgICBzcDxNZXRhRGF0YT4gbU1ldGE7Ci0gICAgc3A8SU1lZGlhU291cmNlPiBtU291cmNlOworICAgIHNwPE1lZGlhU291cmNlPiBtU291cmNlOwogICAgIHZvbGF0aWxlIGJvb2wgbURvbmU7CiAgICAgdm9sYXRpbGUgYm9vbCBtUGF1c2VkOwogICAgIHZvbGF0aWxlIGJvb2wgbVJlc3VtZWQ7CkBAIC0yODAsNiArMjkwLDcgQEAKICAgICBib29sIG1Jc0hldmM7CiAgICAgYm9vbCBtSXNBdWRpbzsKICAgICBib29sIG1Jc1ZpZGVvOworICAgIGJvb2wgbUlzSGVpYzsKICAgICBib29sIG1Jc01QRUc0OwogICAgIGJvb2wgbUdvdFN0YXJ0S2V5RnJhbWU7CiAgICAgYm9vbCBtSXNNYWxmb3JtZWQ7CkBAIC0zNDYsNiArMzU3LDE4IEBACiAgICAgaW50NjRfdCBtUHJldmlvdXNUcmFja1RpbWVVczsKICAgICBpbnQ2NF90IG1UcmFja0V2ZXJ5VGltZUR1cmF0aW9uVXM7CiAKKyAgICBpbnQzMl90IG1Sb3RhdGlvbjsKKworICAgIFZlY3Rvcjx1aW50MTZfdD4gbVByb3BlcnRpZXM7CisgICAgSXRlbVJlZnMgbURpbWdSZWZzOworICAgIEl0ZW1SZWZzIG1DZHNjUmVmczsKKyAgICB1aW50MTZfdCBtSW1hZ2VJdGVtSWQ7CisgICAgaW50MzJfdCBtSXNQcmltYXJ5OworICAgIGludDMyX3QgbVdpZHRoLCBtSGVpZ2h0OworICAgIGludDMyX3QgbVRpbGVXaWR0aCwgbVRpbGVIZWlnaHQ7CisgICAgaW50MzJfdCBtR3JpZFJvd3MsIG1HcmlkQ29sczsKKyAgICBzaXplX3QgbU51bVRpbGVzLCBtVGlsZUluZGV4OworCiAgICAgLy8gVXBkYXRlIHRoZSBhdWRpbyB0cmFjaydzIGRyaWZ0IGluZm9ybWF0aW9uLgogICAgIHZvaWQgdXBkYXRlRHJpZnRUaW1lKGNvbnN0IHNwPE1ldGFEYXRhPiYgbWV0YSk7CiAKQEAgLTM4NSw3ICs0MDgsNiBAQAogCiAgICAgLy8gU2ltcGxlIHZhbGlkYXRpb24gb24gdGhlIGNvZGVjIHNwZWNpZmljIGRhdGEKICAgICBzdGF0dXNfdCBjaGVja0NvZGVjU3BlY2lmaWNEYXRhKCkgY29uc3Q7Ci0gICAgaW50MzJfdCBtUm90YXRpb247CiAKICAgICB2b2lkIHVwZGF0ZVRyYWNrU2l6ZUVzdGltYXRlKCk7CiAgICAgdm9pZCBhZGRPbmVTdHNjVGFibGVFbnRyeShzaXplX3QgY2h1bmtJZCwgc2l6ZV90IHNhbXBsZUlkKTsKQEAgLTQ3MywxOCArNDk1LDI0IEBACiAgICAgbVVzZTMyQml0T2Zmc2V0ID0gdHJ1ZTsKICAgICBtT2Zmc2V0ID0gMDsKICAgICBtTWRhdE9mZnNldCA9IDA7Ci0gICAgbU1vb3ZCb3hCdWZmZXIgPSBOVUxMOwotICAgIG1Nb292Qm94QnVmZmVyT2Zmc2V0ID0gMDsKLSAgICBtV3JpdGVNb292Qm94VG9NZW1vcnkgPSBmYWxzZTsKKyAgICBtSW5NZW1vcnlDYWNoZSA9IE5VTEw7CisgICAgbUluTWVtb3J5Q2FjaGVPZmZzZXQgPSAwOworICAgIG1Jbk1lbW9yeUNhY2hlU2l6ZSA9IDA7CisgICAgbVdyaXRlQm94VG9NZW1vcnkgPSBmYWxzZTsKICAgICBtRnJlZUJveE9mZnNldCA9IDA7CiAgICAgbVN0cmVhbWFibGVGaWxlID0gZmFsc2U7Ci0gICAgbUVzdGltYXRlZE1vb3ZCb3hTaXplID0gMDsKICAgICBtVGltZVNjYWxlID0gLTE7CisgICAgbUhhc0ZpbGVMZXZlbE1ldGEgPSBmYWxzZTsKKyAgICBtUHJpbWFyeUl0ZW1JZCA9IDA7CisgICAgbUFzc29jaWF0aW9uRW50cnlDb3VudCA9IDA7CisgICAgbU51bUdyaWRzID0gMDsKKyAgICBtSGFzUmVmcyA9IGZhbHNlOwogCiAgICAgLy8gRm9sbG93aW5nIHZhcmlhYmxlcyBvbmx5IG5lZWQgdG8gYmUgc2V0IGZvciB0aGUgZmlyc3QgcmVjb3JkaW5nIHNlc3Npb24uCiAgICAgLy8gQW5kIHRoZXkgd2lsbCBzdGF5IHRoZSBzYW1lIGZvciBhbGwgdGhlIHJlY29yZGluZyBzZXNzaW9ucy4KICAgICBpZiAoaXNGaXJzdFNlc3Npb24pIHsKICAgICAgICAgbU1vb3ZFeHRyYVNpemUgPSAwOworICAgICAgICBtSGFzTW9vdkJveCA9IGZhbHNlOwogICAgICAgICBtTWV0YUtleXMgPSBuZXcgQU1lc3NhZ2UoKTsKICAgICAgICAgYWRkRGV2aWNlTWV0YSgpOwogICAgICAgICBtTGF0aXR1ZGV4MTAwMDAgPSAwOwpAQCAtNTY2LDEzICs1OTQsMTUgQEAKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKG1pbWUsICJhcHBsaWNhdGlvbi8iLCAxMikpIHsKICAgICAgICAgcmV0dXJuICJtZXR0IjsKKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQywgbWltZSkpIHsKKyAgICAgICAgcmV0dXJuICJoZWljIjsKICAgICB9IGVsc2UgewogICAgICAgICBBTE9HRSgiVHJhY2sgKCVzKSBvdGhlciB0aGFuIHZpZGVvL2F1ZGlvL21ldGFkYXRhIGlzIG5vdCBzdXBwb3J0ZWQiLCBtaW1lKTsKICAgICB9CiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXR1c190IE1QRUc0V3JpdGVyOjphZGRTb3VyY2UoY29uc3Qgc3A8SU1lZGlhU291cmNlPiAmc291cmNlKSB7CitzdGF0dXNfdCBNUEVHNFdyaXRlcjo6YWRkU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogICAgIGlmIChtU3RhcnRlZCkgewogICAgICAgICBBTE9HRSgiQXR0ZW1wdCB0byBhZGQgc291cmNlIEFGVEVSIHJlY29yZGluZyBpcyBzdGFydGVkIik7CkBAIC01OTQsNiArNjI0LDkgQEAKICAgICBUcmFjayAqdHJhY2sgPSBuZXcgVHJhY2sodGhpcywgc291cmNlLCAxICsgbVRyYWNrcy5zaXplKCkpOwogICAgIG1UcmFja3MucHVzaF9iYWNrKHRyYWNrKTsKIAorICAgIG1IYXNNb292Qm94IHw9ICF0cmFjay0+aXNIZWljKCk7CisgICAgbUhhc0ZpbGVMZXZlbE1ldGEgfD0gdHJhY2stPmlzSGVpYygpOworCiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC02NTUsNiArNjg4LDM3IEBACiAjZW5kaWYKIH0KIAoraW50NjRfdCBNUEVHNFdyaXRlcjo6ZXN0aW1hdGVGaWxlTGV2ZWxNZXRhU2l6ZShNZXRhRGF0YSAqcGFyYW1zKSB7CisgICAgaW50MzJfdCByb3RhdGlvbjsKKyAgICBpZiAoIXBhcmFtcyB8fCAhcGFyYW1zLT5maW5kSW50MzIoa0tleVJvdGF0aW9uLCAmcm90YXRpb24pKSB7CisgICAgICAgIHJvdGF0aW9uID0gMDsKKyAgICB9CisKKyAgICAvLyBiYXNlIG1ldGEgc2l6ZQorICAgIGludDY0X3QgbWV0YVNpemUgPSAgICAgMTIgIC8vIG1ldGEgZnVsbGJveCBoZWFkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICArIDMzICAvLyBoZGxyIGJveAorICAgICAgICAgICAgICAgICAgICAgICAgICsgMTQgIC8vIHBpdG0gYm94CisgICAgICAgICAgICAgICAgICAgICAgICAgKyAxNiAgLy8gaWxvYyBib3ggKGZpeGVkIHNpemUgcG9ydGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICArIDE0ICAvLyBpaW5mIGJveCAoZml4ZWQgc2l6ZSBwb3J0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICsgMzIgIC8vIGlwcnAgYm94IChmaXhlZCBzaXplIHByb3Rpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgKyA4ICAgLy8gaWRhdCBib3ggKHdoZW4gZW1wdHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgKyAxMiAgLy8gaXJlZiBib3ggKHdoZW4gZW1wdHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgOworCisgICAgZm9yIChMaXN0PFRyYWNrICo+OjppdGVyYXRvciBpdCA9IG1UcmFja3MuYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IG1UcmFja3MuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgaWYgKCgqaXQpLT5pc0hlaWMoKSkgeworICAgICAgICAgICAgbWV0YVNpemUgKz0gKCppdCktPmdldE1ldGFTaXplSW5jcmVhc2Uocm90YXRpb24sIG1UcmFja3Muc2l6ZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCJlc3RpbWF0ZWQgbWV0YSBzaXplOiAlbGxkIiwgKGxvbmcgbG9uZykgbWV0YVNpemUpOworCisgICAgLy8gTmVlZCBhdCBsZWFzdCA4LWJ5dGUgcGFkZGluZyBhdCB0aGUgZW5kLCBvdGhlcndpc2UgdGhlIGxlZnQtb3ZlcgorICAgIC8vIGZyZWVib3ggbWF5IGJlY29tZSBtYWxmb3JtZWQKKyAgICByZXR1cm4gbWV0YVNpemUgKyA4OworfQorCiBpbnQ2NF90IE1QRUc0V3JpdGVyOjplc3RpbWF0ZU1vb3ZCb3hTaXplKGludDMyX3QgYml0UmF0ZSkgewogICAgIC8vIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgaGlnaGx5IGV4cGVyaW1lbnRhbC9oZXVyaXNpdGljLgogICAgIC8vCkBAIC03MTQsNyArNzc4LDExIEBACiAgICAgQUxPR0koImxpbWl0czogJSIgUFJJZDY0ICIvJSIgUFJJZDY0ICIgYnl0ZXMvdXMsIGJpdCByYXRlOiAlZCBicHMgYW5kIHRoZSIKICAgICAgICAgICIgZXN0aW1hdGVkIG1vb3Ygc2l6ZSAlIiBQUklkNjQgIiBieXRlcyIsCiAgICAgICAgICBtTWF4RmlsZVNpemVMaW1pdEJ5dGVzLCBtTWF4RmlsZUR1cmF0aW9uTGltaXRVcywgYml0UmF0ZSwgc2l6ZSk7Ci0gICAgcmV0dXJuIGZhY3RvciAqIHNpemU7CisKKyAgICBpbnQ2NF90IGVzdGltYXRlZFNpemUgPSBmYWN0b3IgKiBzaXplOworICAgIENIRUNLX0dFKGVzdGltYXRlZFNpemUsIDgpOworCisgICAgcmV0dXJuIGVzdGltYXRlZFNpemU7CiB9CiAKIHN0YXR1c190IE1QRUc0V3JpdGVyOjpzdGFydChNZXRhRGF0YSAqcGFyYW0pIHsKQEAgLTc5Niw2MyArODY0LDcwIEBACiAgICAgICAgICBtTWF4RmlsZVNpemVMaW1pdEJ5dGVzID49IGtNaW5TdHJlYW1hYmxlRmlsZVNpemVJbkJ5dGVzKTsKIAogICAgIC8qCi0gICAgICogbVdyaXRlTW9vdkJveFRvTWVtb3J5IGlzIHRydWUgaWYgdGhlIGFtb3VudCBvZiBkYXRhIGluIG1vb3YgYm94IGlzCi0gICAgICogc21hbGxlciB0aGFuIHRoZSByZXNlcnZlZCBmcmVlIHNwYWNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBmaWxlLCBBTkQKLSAgICAgKiB3aGVuIHRoZSBjb250ZW50IG9mIG1vb3YgYm94IGlzIGNvbnN0cnVjdGVkLiBOb3RlIHRoYXQgdmlkZW8vYXVkaW8KLSAgICAgKiBmcmFtZSBkYXRhIGlzIGFsd2F5cyB3cml0dGVuIHRvIHRoZSBmaWxlIGJ1dCBub3QgaW4gdGhlIG1lbW9yeS4KKyAgICAgKiBtV3JpdGVCb3hUb01lbW9yeSBpcyB0cnVlIGlmIHRoZSBhbW91bnQgb2YgZGF0YSBpbiBhIGZpbGUtbGV2ZWwgbWV0YSBvcgorICAgICAqIG1vb3YgYm94IGlzIHNtYWxsZXIgdGhhbiB0aGUgcmVzZXJ2ZWQgZnJlZSBzcGFjZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEKKyAgICAgKiBmaWxlLCBBTkQgd2hlbiB0aGUgY29udGVudCBvZiB0aGUgYm94IGlzIGNvbnN0cnVjdGVkLiBOb3RlIHRoYXQgdmlkZW8vCisgICAgICogYXVkaW8gZnJhbWUgZGF0YSBpcyBhbHdheXMgd3JpdHRlbiB0byB0aGUgZmlsZSBidXQgbm90IGluIHRoZSBtZW1vcnkuCiAgICAgICoKLSAgICAgKiBCZWZvcmUgc3RvcCgpL3Jlc2V0KCkgaXMgY2FsbGVkLCBtV3JpdGVNb292Qm94VG9NZW1vcnkgaXMgYWx3YXlzCisgICAgICogQmVmb3JlIHN0b3AoKS9yZXNldCgpIGlzIGNhbGxlZCwgbVdyaXRlQm94VG9NZW1vcnkgaXMgYWx3YXlzCiAgICAgICogZmFsc2UuIFdoZW4gcmVzZXQoKSBpcyBjYWxsZWQgYXQgdGhlIGVuZCBvZiBhIHJlY29yZGluZyBzZXNzaW9uLAotICAgICAqIE1vb3YgYm94IG5lZWRzIHRvIGJlIGNvbnN0cnVjdGVkLgorICAgICAqIGZpbGUtbGV2ZWwgbWV0YSBhbmQvb3IgbW9vdiBib3ggbmVlZHMgdG8gYmUgY29uc3RydWN0ZWQuCiAgICAgICoKLSAgICAgKiAxKSBSaWdodCBiZWZvcmUgYSBtb292IGJveCBpcyBjb25zdHJ1Y3RlZCwgbVdyaXRlTW9vdkJveFRvTWVtb3J5Ci0gICAgICogdG8gc2V0IHRvIG1TdHJlYW1hYmxlRmlsZSBzbyB0aGF0IGlmCi0gICAgICogdGhlIGZpbGUgaXMgaW50ZW5kZWQgdG8gYmUgc3RyZWFtYWJsZSwgaXQgaXMgc2V0IHRvIHRydWU7Ci0gICAgICogb3RoZXJ3aXNlLCBpdCBpcyBzZXQgdG8gZmFsc2UuIFdoZW4gdGhlIHZhbHVlIGlzIHNldCB0byBmYWxzZSwKLSAgICAgKiBhbGwgdGhlIGNvbnRlbnQgb2YgdGhlIG1vb3YgYm94IGlzIHdyaXR0ZW4gaW1tZWRpYXRlbHkgdG8KKyAgICAgKiAxKSBSaWdodCBiZWZvcmUgdGhlIGJveCBpcyBjb25zdHJ1Y3RlZCwgbVdyaXRlQm94VG9NZW1vcnkgdG8gc2V0IHRvCisgICAgICogbVN0cmVhbWFibGVGaWxlIHNvIHRoYXQgaWYgdGhlIGZpbGUgaXMgaW50ZW5kZWQgdG8gYmUgc3RyZWFtYWJsZSwgaXQKKyAgICAgKiBpcyBzZXQgdG8gdHJ1ZTsgb3RoZXJ3aXNlLCBpdCBpcyBzZXQgdG8gZmFsc2UuIFdoZW4gdGhlIHZhbHVlIGlzIHNldAorICAgICAqIHRvIGZhbHNlLCBhbGwgdGhlIGNvbnRlbnQgb2YgdGhhdCBib3ggaXMgd3JpdHRlbiBpbW1lZGlhdGVseSB0bwogICAgICAqIHRoZSBlbmQgb2YgdGhlIGZpbGUuIFdoZW4gdGhlIHZhbHVlIGlzIHNldCB0byB0cnVlLCBhbGwgdGhlCi0gICAgICogY29udGVudCBvZiB0aGUgbW9vdiBib3ggaXMgd3JpdHRlbiB0byBhbiBpbi1tZW1vcnkgY2FjaGUsCi0gICAgICogbU1vb3ZCb3hCdWZmZXIsIHV0aWwgdGhlIGZvbGxvd2luZyBjb25kaXRpb24gaGFwcGVucy4gTm90ZQorICAgICAqIGNvbnRlbnQgb2YgdGhhdCBib3ggaXMgd3JpdHRlbiB0byBhbiBpbi1tZW1vcnkgY2FjaGUsCisgICAgICogbUluTWVtb3J5Q2FjaGUsIHV0aWwgdGhlIGZvbGxvd2luZyBjb25kaXRpb24gaGFwcGVucy4gTm90ZQogICAgICAqIHRoYXQgdGhlIHNpemUgb2YgdGhlIGluLW1lbW9yeSBjYWNoZSBpcyB0aGUgc2FtZSBhcyB0aGUKICAgICAgKiByZXNlcnZlZCBmcmVlIHNwYWNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCiAgICAgICoKLSAgICAgKiAyKSBXaGlsZSB0aGUgZGF0YSBvZiB0aGUgbW9vdiBib3ggaXMgd3JpdHRlbiB0byBhbiBpbi1tZW1vcnkKKyAgICAgKiAyKSBXaGlsZSB0aGUgZGF0YSBvZiB0aGUgYm94IGlzIHdyaXR0ZW4gdG8gYW4gaW4tbWVtb3J5CiAgICAgICogY2FjaGUsIHRoZSBkYXRhIHNpemUgaXMgY2hlY2tlZCBhZ2FpbnN0IHRoZSByZXNlcnZlZCBzcGFjZS4KLSAgICAgKiBJZiB0aGUgZGF0YSBzaXplIHN1cnBhc3NlcyB0aGUgcmVzZXJ2ZWQgc3BhY2UsIHN1YnNlcXVlbnQgbW9vdgotICAgICAqIGRhdGEgY291bGQgbm8gbG9uZ2VyIGJlIGhvbGQgaW4gdGhlIGluLW1lbW9yeSBjYWNoZS4gVGhpcyBhbHNvCisgICAgICogSWYgdGhlIGRhdGEgc2l6ZSBzdXJwYXNzZXMgdGhlIHJlc2VydmVkIHNwYWNlLCBzdWJzZXF1ZW50IGJveCBkYXRhCisgICAgICogY291bGQgbm8gbG9uZ2VyIGJlIGhvbGQgaW4gdGhlIGluLW1lbW9yeSBjYWNoZS4gVGhpcyBhbHNvCiAgICAgICogaW5kaWNhdGVzIHRoYXQgdGhlIHJlc2VydmVkIHNwYWNlIHdhcyB0b28gc21hbGwuIEF0IHRoaXMgcG9pbnQsCi0gICAgICogX2FsbF8gbW9vdiBkYXRhIG11c3QgYmUgd3JpdHRlbiB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLgotICAgICAqIG1Xcml0ZU1vb3ZCb3hUb01lbW9yeSBtdXN0IGJlIHNldCB0byBmYWxzZSB0byBkaXJlY3QgdGhlIHdyaXRlCisgICAgICogX2FsbF8gc3Vic2VxdWVudCBib3ggZGF0YSBtdXN0IGJlIHdyaXR0ZW4gdG8gdGhlIGVuZCBvZiB0aGUgZmlsZS4KKyAgICAgKiBtV3JpdGVCb3hUb01lbW9yeSBtdXN0IGJlIHNldCB0byBmYWxzZSB0byBkaXJlY3QgdGhlIHdyaXRlCiAgICAgICogdG8gdGhlIGZpbGUuCiAgICAgICoKLSAgICAgKiAzKSBJZiB0aGUgZGF0YSBzaXplIGluIG1vb3YgYm94IGlzIHNtYWxsZXIgdGhhbiB0aGUgcmVzZXJ2ZWQKLSAgICAgKiBzcGFjZSBhZnRlciBtb292IGJveCBpcyBjb21wbGV0ZWx5IGNvbnN0cnVjdGVkLCB0aGUgaW4tbWVtb3J5Ci0gICAgICogY2FjaGUgY29weSBvZiB0aGUgbW9vdiBib3ggaXMgd3JpdHRlbiB0byB0aGUgcmVzZXJ2ZWQgZnJlZQotICAgICAqIHNwYWNlLiBUaHVzLCBpbW1lZGlhdGVseSBhZnRlciB0aGUgbW9vdiBpcyBjb21wbGV0ZWRseQotICAgICAqIGNvbnN0cnVjdGVkLCBtV3JpdGVNb292Qm94VG9NZW1vcnkgaXMgYWx3YXlzIHNldCB0byBmYWxzZS4KKyAgICAgKiAzKSBJZiB0aGUgZGF0YSBzaXplIGluIHRoZSBib3ggaXMgc21hbGxlciB0aGFuIHRoZSByZXNlcnZlZAorICAgICAqIHNwYWNlIGFmdGVyIHRoZSBib3ggaXMgY29tcGxldGVseSBjb25zdHJ1Y3RlZCwgdGhlIGluLW1lbW9yeQorICAgICAqIGNhY2hlIGNvcHkgb2YgdGhlIGJveCBpcyB3cml0dGVuIHRvIHRoZSByZXNlcnZlZCBmcmVlIHNwYWNlLgorICAgICAqIG1Xcml0ZUJveFRvTWVtb3J5IGlzIGFsd2F5cyBzZXQgdG8gZmFsc2UgYWZ0ZXIgYWxsIGJveGVzIHRoYXQKKyAgICAgKiB1c2luZyB0aGUgaW4tbWVtb3J5IGNhY2hlIGhhdmUgYmVlbiBjb25zdHJ1Y3RlZC4KICAgICAgKi8KLSAgICBtV3JpdGVNb292Qm94VG9NZW1vcnkgPSBmYWxzZTsKLSAgICBtTW9vdkJveEJ1ZmZlciA9IE5VTEw7Ci0gICAgbU1vb3ZCb3hCdWZmZXJPZmZzZXQgPSAwOworICAgIG1Xcml0ZUJveFRvTWVtb3J5ID0gZmFsc2U7CisgICAgbUluTWVtb3J5Q2FjaGUgPSBOVUxMOworICAgIG1Jbk1lbW9yeUNhY2hlT2Zmc2V0ID0gMDsKKworCisgICAgQUxPR1YoIm11eGVyIHN0YXJ0aW5nOiBtSGFzTW9vdkJveCAlZCwgbUhhc0ZpbGVMZXZlbE1ldGEgJWQiLAorICAgICAgICAgICAgbUhhc01vb3ZCb3gsIG1IYXNGaWxlTGV2ZWxNZXRhKTsKIAogICAgIHdyaXRlRnR5cEJveChwYXJhbSk7CiAKICAgICBtRnJlZUJveE9mZnNldCA9IG1PZmZzZXQ7CiAKLSAgICBpZiAobUVzdGltYXRlZE1vb3ZCb3hTaXplID09IDApIHsKKyAgICBpZiAobUluTWVtb3J5Q2FjaGVTaXplID09IDApIHsKICAgICAgICAgaW50MzJfdCBiaXRSYXRlID0gLTE7Ci0gICAgICAgIGlmIChwYXJhbSkgewotICAgICAgICAgICAgcGFyYW0tPmZpbmRJbnQzMihrS2V5Qml0UmF0ZSwgJmJpdFJhdGUpOworICAgICAgICBpZiAobUhhc0ZpbGVMZXZlbE1ldGEpIHsKKyAgICAgICAgICAgIG1Jbk1lbW9yeUNhY2hlU2l6ZSArPSBlc3RpbWF0ZUZpbGVMZXZlbE1ldGFTaXplKHBhcmFtKTsKICAgICAgICAgfQotICAgICAgICBtRXN0aW1hdGVkTW9vdkJveFNpemUgPSBlc3RpbWF0ZU1vb3ZCb3hTaXplKGJpdFJhdGUpOworICAgICAgICBpZiAobUhhc01vb3ZCb3gpIHsKKyAgICAgICAgICAgIGlmIChwYXJhbSkgeworICAgICAgICAgICAgICAgIHBhcmFtLT5maW5kSW50MzIoa0tleUJpdFJhdGUsICZiaXRSYXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Jbk1lbW9yeUNhY2hlU2l6ZSArPSBlc3RpbWF0ZU1vb3ZCb3hTaXplKGJpdFJhdGUpOworICAgICAgICB9CiAgICAgfQotICAgIENIRUNLX0dFKG1Fc3RpbWF0ZWRNb292Qm94U2l6ZSwgOCk7CiAgICAgaWYgKG1TdHJlYW1hYmxlRmlsZSkgewogICAgICAgICAvLyBSZXNlcnZlIGEgJ2ZyZWUnIGJveCBvbmx5IGZvciBzdHJlYW1hYmxlIGZpbGUKICAgICAgICAgbHNlZWs2NChtRmQsIG1GcmVlQm94T2Zmc2V0LCBTRUVLX1NFVCk7Ci0gICAgICAgIHdyaXRlSW50MzIobUVzdGltYXRlZE1vb3ZCb3hTaXplKTsKKyAgICAgICAgd3JpdGVJbnQzMihtSW5NZW1vcnlDYWNoZVNpemUpOwogICAgICAgICB3cml0ZSgiZnJlZSIsIDQpOwotICAgICAgICBtTWRhdE9mZnNldCA9IG1GcmVlQm94T2Zmc2V0ICsgbUVzdGltYXRlZE1vb3ZCb3hTaXplOworICAgICAgICBtTWRhdE9mZnNldCA9IG1GcmVlQm94T2Zmc2V0ICsgbUluTWVtb3J5Q2FjaGVTaXplOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1NZGF0T2Zmc2V0ID0gbU9mZnNldDsKICAgICB9CkBAIC05NjQsOCArMTAzOSw4IEBACiAgICAgbUZkID0gLTE7CiAgICAgbUluaXRDaGVjayA9IE5PX0lOSVQ7CiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICBmcmVlKG1Nb292Qm94QnVmZmVyKTsKLSAgICBtTW9vdkJveEJ1ZmZlciA9IE5VTEw7CisgICAgZnJlZShtSW5NZW1vcnlDYWNoZSk7CisgICAgbUluTWVtb3J5Q2FjaGUgPSBOVUxMOwogfQogCiB2b2lkIE1QRUc0V3JpdGVyOjpmaW5pc2hDdXJyZW50U2Vzc2lvbigpIHsKQEAgLTEwMDgsMTMgKzEwODMsMTggQEAKICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKICAgICBpbnQ2NF90IG1heER1cmF0aW9uVXMgPSAwOwogICAgIGludDY0X3QgbWluRHVyYXRpb25VcyA9IDB4N2ZmZmZmZmZmZmZmZmZmZkxMOworICAgIGludDMyX3Qgbm9uSW1hZ2VUcmFja0NvdW50ID0gMDsKICAgICBmb3IgKExpc3Q8VHJhY2sgKj46Oml0ZXJhdG9yIGl0ID0gbVRyYWNrcy5iZWdpbigpOwotICAgICAgICAgaXQgIT0gbVRyYWNrcy5lbmQoKTsgKytpdCkgeworICAgICAgICBpdCAhPSBtVHJhY2tzLmVuZCgpOyArK2l0KSB7CiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9ICgqaXQpLT5zdG9wKHN0b3BTb3VyY2UpOwogICAgICAgICBpZiAoZXJyID09IE9LICYmIHN0YXR1cyAhPSBPSykgewogICAgICAgICAgICAgZXJyID0gc3RhdHVzOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gc2tpcCBpbWFnZSB0cmFja3MKKyAgICAgICAgaWYgKCgqaXQpLT5pc0hlaWMoKSkgY29udGludWU7CisgICAgICAgIG5vbkltYWdlVHJhY2tDb3VudCsrOworCiAgICAgICAgIGludDY0X3QgZHVyYXRpb25VcyA9ICgqaXQpLT5nZXREdXJhdGlvblVzKCk7CiAgICAgICAgIGlmIChkdXJhdGlvblVzID4gbWF4RHVyYXRpb25VcykgewogICAgICAgICAgICAgbWF4RHVyYXRpb25VcyA9IGR1cmF0aW9uVXM7CkBAIC0xMDI0LDcgKzExMDQsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKG1UcmFja3Muc2l6ZSgpID4gMSkgeworICAgIGlmIChub25JbWFnZVRyYWNrQ291bnQgPiAxKSB7CiAgICAgICAgIEFMT0dEKCJEdXJhdGlvbiBmcm9tIHRyYWNrcyByYW5nZSBpcyBbJSIgUFJJZDY0ICIsICUiIFBSSWQ2NCAiXSB1cyIsCiAgICAgICAgICAgICBtaW5EdXJhdGlvblVzLCBtYXhEdXJhdGlvblVzKTsKICAgICB9CkBAIC0xMDUwLDQ1ICsxMTMwLDQzIEBACiAgICAgfQogICAgIGxzZWVrNjQobUZkLCBtT2Zmc2V0LCBTRUVLX1NFVCk7CiAKLSAgICAvLyBDb25zdHJ1Y3QgbW9vdiBib3ggbm93Ci0gICAgbU1vb3ZCb3hCdWZmZXJPZmZzZXQgPSAwOwotICAgIG1Xcml0ZU1vb3ZCb3hUb01lbW9yeSA9IG1TdHJlYW1hYmxlRmlsZTsKLSAgICBpZiAobVdyaXRlTW9vdkJveFRvTWVtb3J5KSB7CisgICAgLy8gQ29uc3RydWN0IGZpbGUtbGV2ZWwgbWV0YSBhbmQgbW9vdiBib3ggbm93CisgICAgbUluTWVtb3J5Q2FjaGVPZmZzZXQgPSAwOworICAgIG1Xcml0ZUJveFRvTWVtb3J5ID0gbVN0cmVhbWFibGVGaWxlOworICAgIGlmIChtV3JpdGVCb3hUb01lbW9yeSkgewogICAgICAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIGFsbG9jYXRlIGluLW1lbW9yeSBjYWNoZQotICAgICAgICAvLyBmb3IgbW9vdiBib3ggaWYgdGhlIGZpbGUgaXMgbm90IHN0cmVhbWFibGUuCisgICAgICAgIC8vIGlmIHRoZSBmaWxlIGlzIG5vdCBzdHJlYW1hYmxlLgogCi0gICAgICAgIG1Nb292Qm94QnVmZmVyID0gKHVpbnQ4X3QgKikgbWFsbG9jKG1Fc3RpbWF0ZWRNb292Qm94U2l6ZSk7Ci0gICAgICAgIENIRUNLKG1Nb292Qm94QnVmZmVyICE9IE5VTEwpOwotICAgIH0KLSAgICB3cml0ZU1vb3ZCb3gobWF4RHVyYXRpb25Vcyk7Ci0KLSAgICAvLyBtV3JpdGVNb292Qm94VG9NZW1vcnkgY291bGQgYmUgc2V0IHRvIGZhbHNlIGluCi0gICAgLy8gTVBFRzRXcml0ZXI6OndyaXRlKCkgbWV0aG9kCi0gICAgaWYgKG1Xcml0ZU1vb3ZCb3hUb01lbW9yeSkgewotICAgICAgICBtV3JpdGVNb292Qm94VG9NZW1vcnkgPSBmYWxzZTsKLSAgICAgICAgLy8gQ29udGVudCBvZiB0aGUgbW9vdiBib3ggaXMgc2F2ZWQgaW4gdGhlIGNhY2hlLCBhbmQgdGhlIGluLW1lbW9yeQotICAgICAgICAvLyBtb292IGJveCBuZWVkcyB0byBiZSB3cml0dGVuIHRvIHRoZSBmaWxlIGluIGEgc2luZ2xlIHNob3QuCi0KLSAgICAgICAgQ0hFQ0tfTEUobU1vb3ZCb3hCdWZmZXJPZmZzZXQgKyA4LCBtRXN0aW1hdGVkTW9vdkJveFNpemUpOwotCi0gICAgICAgIC8vIE1vb3YgYm94Ci0gICAgICAgIGxzZWVrNjQobUZkLCBtRnJlZUJveE9mZnNldCwgU0VFS19TRVQpOwotICAgICAgICBtT2Zmc2V0ID0gbUZyZWVCb3hPZmZzZXQ7Ci0gICAgICAgIHdyaXRlKG1Nb292Qm94QnVmZmVyLCAxLCBtTW9vdkJveEJ1ZmZlck9mZnNldCk7Ci0KLSAgICAgICAgLy8gRnJlZSBib3gKLSAgICAgICAgbHNlZWs2NChtRmQsIG1PZmZzZXQsIFNFRUtfU0VUKTsKLSAgICAgICAgd3JpdGVJbnQzMihtRXN0aW1hdGVkTW9vdkJveFNpemUgLSBtTW9vdkJveEJ1ZmZlck9mZnNldCk7Ci0gICAgICAgIHdyaXRlKCJmcmVlIiwgNCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0koIlRoZSBtcDQgZmlsZSB3aWxsIG5vdCBiZSBzdHJlYW1hYmxlLiIpOworICAgICAgICBtSW5NZW1vcnlDYWNoZSA9ICh1aW50OF90ICopIG1hbGxvYyhtSW5NZW1vcnlDYWNoZVNpemUpOworICAgICAgICBDSEVDSyhtSW5NZW1vcnlDYWNoZSAhPSBOVUxMKTsKICAgICB9CiAKLSAgICAvLyBGcmVlIGluLW1lbW9yeSBjYWNoZSBmb3IgbW9vdiBib3gKLSAgICBpZiAobU1vb3ZCb3hCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICBmcmVlKG1Nb292Qm94QnVmZmVyKTsKLSAgICAgICAgbU1vb3ZCb3hCdWZmZXIgPSBOVUxMOwotICAgICAgICBtTW9vdkJveEJ1ZmZlck9mZnNldCA9IDA7CisgICAgaWYgKG1IYXNGaWxlTGV2ZWxNZXRhKSB7CisgICAgICAgIHdyaXRlRmlsZUxldmVsTWV0YUJveCgpOworICAgICAgICBpZiAobVdyaXRlQm94VG9NZW1vcnkpIHsKKyAgICAgICAgICAgIHdyaXRlQ2FjaGVkQm94VG9GaWxlKCJtZXRhIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HSSgiVGhlIGZpbGUgbWV0YSBib3ggaXMgd3JpdHRlbiBhdCB0aGUgZW5kLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1IYXNNb292Qm94KSB7CisgICAgICAgIHdyaXRlTW9vdkJveChtYXhEdXJhdGlvblVzKTsKKyAgICAgICAgLy8gbVdyaXRlQm94VG9NZW1vcnkgY291bGQgYmUgc2V0IHRvIGZhbHNlIGluCisgICAgICAgIC8vIE1QRUc0V3JpdGVyOjp3cml0ZSgpIG1ldGhvZAorICAgICAgICBpZiAobVdyaXRlQm94VG9NZW1vcnkpIHsKKyAgICAgICAgICAgIHdyaXRlQ2FjaGVkQm94VG9GaWxlKCJtb292Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HSSgiVGhlIG1wNCBmaWxlIHdpbGwgbm90IGJlIHN0cmVhbWFibGUuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgbVdyaXRlQm94VG9NZW1vcnkgPSBmYWxzZTsKKworICAgIC8vIEZyZWUgaW4tbWVtb3J5IGNhY2hlIGZvciBib3ggd3JpdGluZworICAgIGlmIChtSW5NZW1vcnlDYWNoZSAhPSBOVUxMKSB7CisgICAgICAgIGZyZWUobUluTWVtb3J5Q2FjaGUpOworICAgICAgICBtSW5NZW1vcnlDYWNoZSA9IE5VTEw7CisgICAgICAgIG1Jbk1lbW9yeUNhY2hlT2Zmc2V0ID0gMDsKICAgICB9CiAKICAgICBDSEVDSyhtQm94ZXMuZW1wdHkoKSk7CkBAIC0xMDk3LDYgKzExNzUsNDIgQEAKICAgICByZXR1cm4gZXJyOwogfQogCisvKgorICogV3JpdGVzIGN1cnJlbnRseSBjYWNoZWQgYm94IGludG8gZmlsZS4KKyAqCisgKiBNdXN0IGJlIGNhbGxlZCB3aGlsZSBtV3JpdGVCb3hUb01lbW9yeSBpcyB0cnVlLCBhbmQgd2lsbCBub3QgbW9kaWZ5CisgKiBtV3JpdGVCb3hUb01lbW9yeS4gQWZ0ZXIgdGhlIGNhbGwsIHJlbWFpbmluZyBjYWNoZSBzaXplIHdpbGwgYmUKKyAqIHJlZHVjZWQgYW5kIGJ1ZmZlciBvZmZzZXQgd2lsbCBiZSBzZXQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgY2FjaGUuCisgKi8KK3ZvaWQgTVBFRzRXcml0ZXI6OndyaXRlQ2FjaGVkQm94VG9GaWxlKGNvbnN0IGNoYXIgKnR5cGUpIHsKKyAgICBDSEVDSyhtV3JpdGVCb3hUb01lbW9yeSk7CisKKyAgICBtV3JpdGVCb3hUb01lbW9yeSA9IGZhbHNlOworICAgIC8vIENvbnRlbnQgb2YgdGhlIGJveCBpcyBzYXZlZCBpbiB0aGUgY2FjaGUsIGFuZCB0aGUgaW4tbWVtb3J5CisgICAgLy8gYm94IG5lZWRzIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGZpbGUgaW4gYSBzaW5nbGUgc2hvdC4KKworICAgIENIRUNLX0xFKG1Jbk1lbW9yeUNhY2hlT2Zmc2V0ICsgOCwgbUluTWVtb3J5Q2FjaGVTaXplKTsKKworICAgIC8vIENhY2hlZCBib3gKKyAgICBsc2VlazY0KG1GZCwgbUZyZWVCb3hPZmZzZXQsIFNFRUtfU0VUKTsKKyAgICBtT2Zmc2V0ID0gbUZyZWVCb3hPZmZzZXQ7CisgICAgd3JpdGUobUluTWVtb3J5Q2FjaGUsIDEsIG1Jbk1lbW9yeUNhY2hlT2Zmc2V0KTsKKworICAgIC8vIEZyZWUgYm94CisgICAgbHNlZWs2NChtRmQsIG1PZmZzZXQsIFNFRUtfU0VUKTsKKyAgICBtRnJlZUJveE9mZnNldCA9IG1PZmZzZXQ7CisgICAgd3JpdGVJbnQzMihtSW5NZW1vcnlDYWNoZVNpemUgLSBtSW5NZW1vcnlDYWNoZU9mZnNldCk7CisgICAgd3JpdGUoImZyZWUiLCA0KTsKKworICAgIC8vIFJld2luZCBidWZmZXJpbmcgdG8gdGhlIGJlZ2lubmluZywgYW5kIHJlc3RvcmUgbVdyaXRlQm94VG9NZW1vcnkgZmxhZworICAgIG1Jbk1lbW9yeUNhY2hlU2l6ZSAtPSBtSW5NZW1vcnlDYWNoZU9mZnNldDsKKyAgICBtSW5NZW1vcnlDYWNoZU9mZnNldCA9IDA7CisgICAgbVdyaXRlQm94VG9NZW1vcnkgPSB0cnVlOworCisgICAgQUxPR1YoImR1bXBlZCBvdXQgJXMgYm94LCBlc3RpbWF0ZWQgc2l6ZSByZW1haW5pbmcgJWxsZCIsCisgICAgICAgICAgICB0eXBlLCAobG9uZyBsb25nKW1Jbk1lbW9yeUNhY2hlU2l6ZSk7Cit9CisKIHVpbnQzMl90IE1QRUc0V3JpdGVyOjpnZXRNcGVnNFRpbWUoKSB7CiAgICAgdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7CiAgICAgLy8gTVA0IGZpbGUgdXNlcyB0aW1lIGNvdW50aW5nIHNlY29uZHMgc2luY2UgbWlkbmlnaHQsIEphbi4gMSwgMTkwNApAQCAtMTE0MSwxNCArMTI1NSwxNiBAQAogICAgIGlmIChtQXJlR2VvVGFnc0F2YWlsYWJsZSkgewogICAgICAgICB3cml0ZVVkdGFCb3goKTsKICAgICB9Ci0gICAgd3JpdGVNZXRhQm94KCk7CisgICAgd3JpdGVNb292TGV2ZWxNZXRhQm94KCk7CiAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgdHJhY2tzIHRvIGdldCB0aGUgZ2xvYmFsIHRpbWUgb2Zmc2V0IGlmIHRoZXJlIGlzCiAgICAgLy8gYW55IGN0dHMgdGFibGUgYXBwZWFycyBpbiBhIHZpZGVvIHRyYWNrLgogICAgIGludDY0X3QgbWluQ3R0c09mZnNldFRpbWVVcyA9IGtNYXhDdHRzT2Zmc2V0VGltZVVzOwogICAgIGZvciAoTGlzdDxUcmFjayAqPjo6aXRlcmF0b3IgaXQgPSBtVHJhY2tzLmJlZ2luKCk7CiAgICAgICAgIGl0ICE9IG1UcmFja3MuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgbWluQ3R0c09mZnNldFRpbWVVcyA9Ci0gICAgICAgICAgICBzdGQ6Om1pbihtaW5DdHRzT2Zmc2V0VGltZVVzLCAoKml0KS0+Z2V0TWluQ3R0c09mZnNldFRpbWVVcygpKTsKKyAgICAgICAgaWYgKCEoKml0KS0+aXNIZWljKCkpIHsKKyAgICAgICAgICAgIG1pbkN0dHNPZmZzZXRUaW1lVXMgPQorICAgICAgICAgICAgICAgIHN0ZDo6bWluKG1pbkN0dHNPZmZzZXRUaW1lVXMsICgqaXQpLT5nZXRNaW5DdHRzT2Zmc2V0VGltZVVzKCkpOworICAgICAgICB9CiAgICAgfQogICAgIEFMT0dJKCJBanVzdCB0aGUgbW9vdiBzdGFydCB0aW1lIGZyb20gJWxsZCB1cyAtPiAlbGxkIHVzIiwKICAgICAgICAgICAgIChsb25nIGxvbmcpbVN0YXJ0VGltZXN0YW1wVXMsCkBAIC0xMTU4LDcgKzEyNzQsOSBAQAogCiAgICAgZm9yIChMaXN0PFRyYWNrICo+OjppdGVyYXRvciBpdCA9IG1UcmFja3MuYmVnaW4oKTsKICAgICAgICAgaXQgIT0gbVRyYWNrcy5lbmQoKTsgKytpdCkgewotICAgICAgICAoKml0KS0+d3JpdGVUcmFja0hlYWRlcihtVXNlMzJCaXRPZmZzZXQpOworICAgICAgICBpZiAoISgqaXQpLT5pc0hlaWMoKSkgeworICAgICAgICAgICAgKCppdCktPndyaXRlVHJhY2tIZWFkZXIobVVzZTMyQml0T2Zmc2V0KTsKKyAgICAgICAgfQogICAgIH0KICAgICBlbmRCb3goKTsgIC8vIG1vb3YKIH0KQEAgLTExNjcsMTcgKzEyODUsMzEgQEAKICAgICBiZWdpbkJveCgiZnR5cCIpOwogCiAgICAgaW50MzJfdCBmaWxlVHlwZTsKLSAgICBpZiAocGFyYW0gJiYgcGFyYW0tPmZpbmRJbnQzMihrS2V5RmlsZVR5cGUsICZmaWxlVHlwZSkgJiYKLSAgICAgICAgZmlsZVR5cGUgIT0gT1VUUFVUX0ZPUk1BVF9NUEVHXzQpIHsKKyAgICBpZiAoIXBhcmFtIHx8ICFwYXJhbS0+ZmluZEludDMyKGtLZXlGaWxlVHlwZSwgJmZpbGVUeXBlKSkgeworICAgICAgICBmaWxlVHlwZSA9IE9VVFBVVF9GT1JNQVRfTVBFR180OworICAgIH0KKyAgICBpZiAoZmlsZVR5cGUgIT0gT1VUUFVUX0ZPUk1BVF9NUEVHXzQgJiYgZmlsZVR5cGUgIT0gT1VUUFVUX0ZPUk1BVF9IRUlGKSB7CiAgICAgICAgIHdyaXRlRm91cmNjKCIzZ3A0Iik7CiAgICAgICAgIHdyaXRlSW50MzIoMCk7CiAgICAgICAgIHdyaXRlRm91cmNjKCJpc29tIik7CiAgICAgICAgIHdyaXRlRm91cmNjKCIzZ3A0Iik7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgd3JpdGVGb3VyY2MoIm1wNDIiKTsKKyAgICAgICAgLy8gT25seSB3cml0ZSAiaGVpYyIgYXMgbWFqb3IgYnJhbmQgaWYgdGhlIGNsaWVudCBzcGVjaWZpZWQgSEVJRgorICAgICAgICAvLyBBTkQgd2UgaW5kZWVkIHJlY2VpdmUgc29tZSBpbWFnZSBoZWljIHRyYWNrcy4KKyAgICAgICAgaWYgKGZpbGVUeXBlID09IE9VVFBVVF9GT1JNQVRfSEVJRiAmJiBtSGFzRmlsZUxldmVsTWV0YSkgeworICAgICAgICAgICAgd3JpdGVGb3VyY2MoImhlaWMiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdyaXRlRm91cmNjKCJtcDQyIik7CisgICAgICAgIH0KICAgICAgICAgd3JpdGVJbnQzMigwKTsKLSAgICAgICAgd3JpdGVGb3VyY2MoImlzb20iKTsKLSAgICAgICAgd3JpdGVGb3VyY2MoIm1wNDIiKTsKKyAgICAgICAgaWYgKG1IYXNGaWxlTGV2ZWxNZXRhKSB7CisgICAgICAgICAgICB3cml0ZUZvdXJjYygibWlmMSIpOworICAgICAgICAgICAgd3JpdGVGb3VyY2MoImhlaWMiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUhhc01vb3ZCb3gpIHsKKyAgICAgICAgICAgIHdyaXRlRm91cmNjKCJpc29tIik7CisgICAgICAgICAgICB3cml0ZUZvdXJjYygibXA0MiIpOworICAgICAgICB9CiAgICAgfQogCiAgICAgZW5kQm94KCk7CkBAIC0xMjI0LDE1ICsxMzU2LDI2IEBACiAgICAgbUxvY2sudW5sb2NrKCk7CiB9CiAKLW9mZjY0X3QgTVBFRzRXcml0ZXI6OmFkZFNhbXBsZV9sKE1lZGlhQnVmZmVyICpidWZmZXIpIHsKK29mZjY0X3QgTVBFRzRXcml0ZXI6OmFkZFNhbXBsZV9sKAorICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyLCBib29sIHVzZVByZWZpeCwgYm9vbCBpc0V4aWYsIHNpemVfdCAqYnl0ZXNXcml0dGVuKSB7CiAgICAgb2ZmNjRfdCBvbGRfb2Zmc2V0ID0gbU9mZnNldDsKIAotICAgIDo6d3JpdGUobUZkLAotICAgICAgICAgIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpLAotICAgICAgICAgIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOworICAgIGlmICh1c2VQcmVmaXgpIHsKKyAgICAgICAgYWRkTXVsdGlwbGVMZW5ndGhQcmVmaXhlZFNhbXBsZXNfbChidWZmZXIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChpc0V4aWYpIHsKKyAgICAgICAgICAgIDo6d3JpdGUobUZkLCAma1RpZmZIZWFkZXJPZmZzZXQsIDQpOyAvLyBleGlmX3RpZmZfaGVhZGVyX29mZnNldCBmaWVsZAorICAgICAgICAgICAgbU9mZnNldCArPSA0OworICAgICAgICB9CiAKLSAgICBtT2Zmc2V0ICs9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7CisgICAgICAgIDo6d3JpdGUobUZkLAorICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKKyAgICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CiAKKyAgICAgICAgbU9mZnNldCArPSBidWZmZXItPnJhbmdlX2xlbmd0aCgpOworICAgIH0KKworICAgICpieXRlc1dyaXR0ZW4gPSBtT2Zmc2V0IC0gb2xkX29mZnNldDsKICAgICByZXR1cm4gb2xkX29mZnNldDsKIH0KIApAQCAtMTI1MCwxOCArMTM5MywxMyBAQAogICAgIH0KIH0KIAotb2ZmNjRfdCBNUEVHNFdyaXRlcjo6YWRkTXVsdGlwbGVMZW5ndGhQcmVmaXhlZFNhbXBsZXNfbChNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7Ci0gICAgb2ZmNjRfdCBvbGRfb2Zmc2V0ID0gbU9mZnNldDsKLQotICAgIGNvbnN0IHNpemVfdCBrRXh0ZW5zaW9uTkFMU2VhcmNoUmFuZ2UgPSA2NDsgLy8gYnl0ZXMgdG8gbG9vayBmb3Igbm9uLVZDTCBOQUxVcwotCit2b2lkIE1QRUc0V3JpdGVyOjphZGRNdWx0aXBsZUxlbmd0aFByZWZpeGVkU2FtcGxlc19sKE1lZGlhQnVmZmVyICpidWZmZXIpIHsKICAgICBjb25zdCB1aW50OF90ICpkYXRhU3RhcnQgPSAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKICAgICBjb25zdCB1aW50OF90ICpjdXJyZW50TmFsU3RhcnQgPSBkYXRhU3RhcnQ7CiAgICAgY29uc3QgdWludDhfdCAqbmV4dE5hbFN0YXJ0OwogICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBkYXRhU3RhcnQ7CiAgICAgc2l6ZV90IG5leHROYWxTaXplOwotICAgIHNpemVfdCBzZWFyY2hTaXplID0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA+IGtFeHRlbnNpb25OQUxTZWFyY2hSYW5nZSA/Ci0gICAgICAgICAgICAgICAgICAga0V4dGVuc2lvbk5BTFNlYXJjaFJhbmdlIDogYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKKyAgICBzaXplX3Qgc2VhcmNoU2l6ZSA9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7CiAKICAgICB3aGlsZSAoZ2V0TmV4dE5BTFVuaXQoJmRhdGEsICZzZWFyY2hTaXplLCAmbmV4dE5hbFN0YXJ0LAogICAgICAgICAgICAgJm5leHROYWxTaXplLCB0cnVlKSA9PSBPSykgewpAQCAtMTI3NywxMyArMTQxNSw5IEBACiAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSArIGN1cnJlbnROYWxPZmZzZXQsCiAgICAgICAgICAgICBidWZmZXItPnJhbmdlX2xlbmd0aCgpIC0gY3VycmVudE5hbE9mZnNldCk7CiAgICAgYWRkTGVuZ3RoUHJlZml4ZWRTYW1wbGVfbChidWZmZXIpOwotCi0gICAgcmV0dXJuIG9sZF9vZmZzZXQ7CiB9CiAKLW9mZjY0X3QgTVBFRzRXcml0ZXI6OmFkZExlbmd0aFByZWZpeGVkU2FtcGxlX2woTWVkaWFCdWZmZXIgKmJ1ZmZlcikgewotICAgIG9mZjY0X3Qgb2xkX29mZnNldCA9IG1PZmZzZXQ7Ci0KK3ZvaWQgTVBFRzRXcml0ZXI6OmFkZExlbmd0aFByZWZpeGVkU2FtcGxlX2woTWVkaWFCdWZmZXIgKmJ1ZmZlcikgewogICAgIHNpemVfdCBsZW5ndGggPSBidWZmZXItPnJhbmdlX2xlbmd0aCgpOwogCiAgICAgaWYgKG1Vc2U0Qnl0ZU5hbExlbmd0aCkgewpAQCAtMTMxMSw0MCArMTQ0NSwzNSBAQAogICAgICAgICA6OndyaXRlKG1GZCwgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksIGxlbmd0aCk7CiAgICAgICAgIG1PZmZzZXQgKz0gbGVuZ3RoICsgMjsKICAgICB9Ci0KLSAgICByZXR1cm4gb2xkX29mZnNldDsKIH0KIAogc2l6ZV90IE1QRUc0V3JpdGVyOjp3cml0ZSgKICAgICAgICAgY29uc3Qgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IG5tZW1iKSB7CiAKICAgICBjb25zdCBzaXplX3QgYnl0ZXMgPSBzaXplICogbm1lbWI7Ci0gICAgaWYgKG1Xcml0ZU1vb3ZCb3hUb01lbW9yeSkgeworICAgIGlmIChtV3JpdGVCb3hUb01lbW9yeSkgewogCi0gICAgICAgIG9mZjY0X3QgbW9vdkJveFNpemUgPSA4ICsgbU1vb3ZCb3hCdWZmZXJPZmZzZXQgKyBieXRlczsKLSAgICAgICAgaWYgKG1vb3ZCb3hTaXplID4gbUVzdGltYXRlZE1vb3ZCb3hTaXplKSB7Ci0gICAgICAgICAgICAvLyBUaGUgcmVzZXJ2ZWQgbW9vdiBib3ggYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZQotICAgICAgICAgICAgLy8gaXMgbm90IGJpZyBlbm91Z2guIE1vb3YgYm94IHNob3VsZCBiZSB3cml0dGVuIHRvCi0gICAgICAgICAgICAvLyB0aGUgZW5kIG9mIHRoZSBmaWxlIGZyb20gbm93IG9uLCBidXQgbm90IHRvIHRoZQotICAgICAgICAgICAgLy8gaW4tbWVtb3J5IGNhY2hlLgorICAgICAgICBvZmY2NF90IGJveFNpemUgPSA4ICsgbUluTWVtb3J5Q2FjaGVPZmZzZXQgKyBieXRlczsKKyAgICAgICAgaWYgKGJveFNpemUgPiBtSW5NZW1vcnlDYWNoZVNpemUpIHsKKyAgICAgICAgICAgIC8vIFRoZSByZXNlcnZlZCBmcmVlIHNwYWNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUgaXMgbm90IGJpZworICAgICAgICAgICAgLy8gZW5vdWdoLiBCb3hlcyBzaG91bGQgYmUgd3JpdHRlbiB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGZyb20gbm93CisgICAgICAgICAgICAvLyBvbiwgYnV0IG5vdCB0byB0aGUgaW4tbWVtb3J5IGNhY2hlLgogCi0gICAgICAgICAgICAvLyBXZSB3cml0ZSBwYXJ0aWFsIG1vb3YgYm94IHRoYXQgaXMgaW4gdGhlIG1lbW9yeSB0bwotICAgICAgICAgICAgLy8gdGhlIGZpbGUgZmlyc3QuCisgICAgICAgICAgICAvLyBXZSB3cml0ZSBwYXJ0aWFsIGJveCB0aGF0IGlzIGluIHRoZSBtZW1vcnkgdG8gdGhlIGZpbGUgZmlyc3QuCiAgICAgICAgICAgICBmb3IgKExpc3Q8b2ZmNjRfdD46Oml0ZXJhdG9yIGl0ID0gbUJveGVzLmJlZ2luKCk7CiAgICAgICAgICAgICAgICAgIGl0ICE9IG1Cb3hlcy5lbmQoKTsgKytpdCkgewogICAgICAgICAgICAgICAgICgqaXQpICs9IG1PZmZzZXQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBsc2VlazY0KG1GZCwgbU9mZnNldCwgU0VFS19TRVQpOwotICAgICAgICAgICAgOjp3cml0ZShtRmQsIG1Nb292Qm94QnVmZmVyLCBtTW9vdkJveEJ1ZmZlck9mZnNldCk7CisgICAgICAgICAgICA6OndyaXRlKG1GZCwgbUluTWVtb3J5Q2FjaGUsIG1Jbk1lbW9yeUNhY2hlT2Zmc2V0KTsKICAgICAgICAgICAgIDo6d3JpdGUobUZkLCBwdHIsIGJ5dGVzKTsKLSAgICAgICAgICAgIG1PZmZzZXQgKz0gKGJ5dGVzICsgbU1vb3ZCb3hCdWZmZXJPZmZzZXQpOworICAgICAgICAgICAgbU9mZnNldCArPSAoYnl0ZXMgKyBtSW5NZW1vcnlDYWNoZU9mZnNldCk7CiAKLSAgICAgICAgICAgIC8vIEFsbCBzdWJzZXF1ZW50IG1vb3YgYm94IGNvbnRlbnQgd2lsbCBiZSB3cml0dGVuCi0gICAgICAgICAgICAvLyB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLgotICAgICAgICAgICAgbVdyaXRlTW9vdkJveFRvTWVtb3J5ID0gZmFsc2U7CisgICAgICAgICAgICAvLyBBbGwgc3Vic2VxdWVudCBib3hlcyB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIGVuZCBvZiB0aGUgZmlsZS4KKyAgICAgICAgICAgIG1Xcml0ZUJveFRvTWVtb3J5ID0gZmFsc2U7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtZW1jcHkobU1vb3ZCb3hCdWZmZXIgKyBtTW9vdkJveEJ1ZmZlck9mZnNldCwgcHRyLCBieXRlcyk7Ci0gICAgICAgICAgICBtTW9vdkJveEJ1ZmZlck9mZnNldCArPSBieXRlczsKKyAgICAgICAgICAgIG1lbWNweShtSW5NZW1vcnlDYWNoZSArIG1Jbk1lbW9yeUNhY2hlT2Zmc2V0LCBwdHIsIGJ5dGVzKTsKKyAgICAgICAgICAgIG1Jbk1lbW9yeUNhY2hlT2Zmc2V0ICs9IGJ5dGVzOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgOjp3cml0ZShtRmQsIHB0ciwgc2l6ZSAqIG5tZW1iKTsKQEAgLTEzNTQsOCArMTQ4Myw4IEBACiB9CiAKIHZvaWQgTVBFRzRXcml0ZXI6OmJlZ2luQm94KHVpbnQzMl90IGlkKSB7Ci0gICAgbUJveGVzLnB1c2hfYmFjayhtV3JpdGVNb292Qm94VG9NZW1vcnk/Ci0gICAgICAgICAgICBtTW9vdkJveEJ1ZmZlck9mZnNldDogbU9mZnNldCk7CisgICAgbUJveGVzLnB1c2hfYmFjayhtV3JpdGVCb3hUb01lbW9yeT8KKyAgICAgICAgICAgIG1Jbk1lbW9yeUNhY2hlT2Zmc2V0OiBtT2Zmc2V0KTsKIAogICAgIHdyaXRlSW50MzIoMCk7CiAgICAgd3JpdGVJbnQzMihpZCk7CkBAIC0xMzY0LDggKzE0OTMsOCBAQAogdm9pZCBNUEVHNFdyaXRlcjo6YmVnaW5Cb3goY29uc3QgY2hhciAqZm91cmNjKSB7CiAgICAgQ0hFQ0tfRVEoc3RybGVuKGZvdXJjYyksIDR1KTsKIAotICAgIG1Cb3hlcy5wdXNoX2JhY2sobVdyaXRlTW9vdkJveFRvTWVtb3J5PwotICAgICAgICAgICAgbU1vb3ZCb3hCdWZmZXJPZmZzZXQ6IG1PZmZzZXQpOworICAgIG1Cb3hlcy5wdXNoX2JhY2sobVdyaXRlQm94VG9NZW1vcnk/CisgICAgICAgICAgICBtSW5NZW1vcnlDYWNoZU9mZnNldDogbU9mZnNldCk7CiAKICAgICB3cml0ZUludDMyKDApOwogICAgIHdyaXRlRm91cmNjKGZvdXJjYyk7CkBAIC0xMzc3LDkgKzE1MDYsOSBAQAogICAgIG9mZjY0X3Qgb2Zmc2V0ID0gKi0tbUJveGVzLmVuZCgpOwogICAgIG1Cb3hlcy5lcmFzZSgtLW1Cb3hlcy5lbmQoKSk7CiAKLSAgICBpZiAobVdyaXRlTW9vdkJveFRvTWVtb3J5KSB7Ci0gICAgICAgaW50MzJfdCB4ID0gaHRvbmwobU1vb3ZCb3hCdWZmZXJPZmZzZXQgLSBvZmZzZXQpOwotICAgICAgIG1lbWNweShtTW9vdkJveEJ1ZmZlciArIG9mZnNldCwgJngsIDQpOworICAgIGlmIChtV3JpdGVCb3hUb01lbW9yeSkgeworICAgICAgICBpbnQzMl90IHggPSBodG9ubChtSW5NZW1vcnlDYWNoZU9mZnNldCAtIG9mZnNldCk7CisgICAgICAgIG1lbWNweShtSW5NZW1vcnlDYWNoZSArIG9mZnNldCwgJngsIDQpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGxzZWVrNjQobUZkLCBvZmZzZXQsIFNFRUtfU0VUKTsKICAgICAgICAgd3JpdGVJbnQzMihtT2Zmc2V0IC0gb2Zmc2V0KTsKQEAgLTE1MzgsNyArMTY2Nyw3IEBACiAgICAgaWYgKG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMgPT0gMCkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIGludDY0X3QgblRvdGFsQnl0ZXNFc3RpbWF0ZSA9IHN0YXRpY19jYXN0PGludDY0X3Q+KG1Fc3RpbWF0ZWRNb292Qm94U2l6ZSk7CisgICAgaW50NjRfdCBuVG90YWxCeXRlc0VzdGltYXRlID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4obUluTWVtb3J5Q2FjaGVTaXplKTsKICAgICBmb3IgKExpc3Q8VHJhY2sgKj46Oml0ZXJhdG9yIGl0ID0gbVRyYWNrcy5iZWdpbigpOwogICAgICAgICAgaXQgIT0gbVRyYWNrcy5lbmQoKTsgKytpdCkgewogICAgICAgICBuVG90YWxCeXRlc0VzdGltYXRlICs9ICgqaXQpLT5nZXRFc3RpbWF0ZWRUcmFja1NpemVCeXRlcygpOwpAQCAtMTU2MSw3ICsxNjkwLDcgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGludDY0X3QgblRvdGFsQnl0ZXNFc3RpbWF0ZSA9IHN0YXRpY19jYXN0PGludDY0X3Q+KG1Fc3RpbWF0ZWRNb292Qm94U2l6ZSk7CisgICAgaW50NjRfdCBuVG90YWxCeXRlc0VzdGltYXRlID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4obUluTWVtb3J5Q2FjaGVTaXplKTsKICAgICBmb3IgKExpc3Q8VHJhY2sgKj46Oml0ZXJhdG9yIGl0ID0gbVRyYWNrcy5iZWdpbigpOwogICAgICAgICAgaXQgIT0gbVRyYWNrcy5lbmQoKTsgKytpdCkgewogICAgICAgICBuVG90YWxCeXRlc0VzdGltYXRlICs9ICgqaXQpLT5nZXRFc3RpbWF0ZWRUcmFja1NpemVCeXRlcygpOwpAQCAtMTU4Myw3ICsxNzEyLDcgQEAKIAogICAgIGZvciAoTGlzdDxUcmFjayAqPjo6aXRlcmF0b3IgaXQgPSBtVHJhY2tzLmJlZ2luKCk7CiAgICAgICAgICBpdCAhPSBtVHJhY2tzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIGlmICgoKml0KS0+Z2V0RHVyYXRpb25VcygpID49IG1NYXhGaWxlRHVyYXRpb25MaW1pdFVzKSB7CisgICAgICAgIGlmICghKCppdCktPmlzSGVpYygpICYmICgqaXQpLT5nZXREdXJhdGlvblVzKCkgPj0gbU1heEZpbGVEdXJhdGlvbkxpbWl0VXMpIHsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQpAQCAtMTYyNiw3ICsxNzU1LDcgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIE1QRUc0V3JpdGVyOjpUcmFjazo6VHJhY2soCi0gICAgICAgIE1QRUc0V3JpdGVyICpvd25lciwgY29uc3Qgc3A8SU1lZGlhU291cmNlPiAmc291cmNlLCBzaXplX3QgdHJhY2tJZCkKKyAgICAgICAgTVBFRzRXcml0ZXIgKm93bmVyLCBjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSwgc2l6ZV90IHRyYWNrSWQpCiAgICAgOiBtT3duZXIob3duZXIpLAogICAgICAgbU1ldGEoc291cmNlLT5nZXRGb3JtYXQoKSksCiAgICAgICBtU291cmNlKHNvdXJjZSksCkBAIC0xNjU1LDcgKzE3ODQsMTkgQEAKICAgICAgIG1Hb3RBbGxDb2RlY1NwZWNpZmljRGF0YShmYWxzZSksCiAgICAgICBtUmVhY2hlZEVPUyhmYWxzZSksCiAgICAgICBtU3RhcnRUaW1lc3RhbXBVcygtMSksCi0gICAgICBtUm90YXRpb24oMCkgeworICAgICAgbVJvdGF0aW9uKDApLAorICAgICAgbURpbWdSZWZzKCJkaW1nIiksCisgICAgICBtQ2RzY1JlZnMoImNkc2MiKSwKKyAgICAgIG1JbWFnZUl0ZW1JZCgwKSwKKyAgICAgIG1Jc1ByaW1hcnkoMCksCisgICAgICBtV2lkdGgoMCksCisgICAgICBtSGVpZ2h0KDApLAorICAgICAgbVRpbGVXaWR0aCgwKSwKKyAgICAgIG1UaWxlSGVpZ2h0KDApLAorICAgICAgbUdyaWRSb3dzKDApLAorICAgICAgbUdyaWRDb2xzKDApLAorICAgICAgbU51bVRpbGVzKDEpLAorICAgICAgbVRpbGVJbmRleCgwKSB7CiAgICAgZ2V0Q29kZWNTcGVjaWZpY0RhdGFGcm9tSW5wdXRGb3JtYXRJZlBvc3NpYmxlKCk7CiAKICAgICBjb25zdCBjaGFyICptaW1lOwpAQCAtMTY2NCw2ICsxODA1LDcgQEAKICAgICBtSXNIZXZjID0gIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQyk7CiAgICAgbUlzQXVkaW8gPSAhc3RybmNhc2VjbXAobWltZSwgImF1ZGlvLyIsIDYpOwogICAgIG1Jc1ZpZGVvID0gIXN0cm5jYXNlY21wKG1pbWUsICJ2aWRlby8iLCA2KTsKKyAgICBtSXNIZWljID0gIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDKTsKICAgICBtSXNNUEVHNCA9ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KSB8fAogICAgICAgICAgICAgICAgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKTsKIApAQCAtMTY3NSw3ICsxODE3LDI3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBzZXRUaW1lU2NhbGUoKTsKKyAgICBpZiAoIW1Jc0hlaWMpIHsKKyAgICAgICAgc2V0VGltZVNjYWxlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQ0hFQ0sobU1ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZtV2lkdGgpICYmIChtV2lkdGggPiAwKSk7CisgICAgICAgIENIRUNLKG1NZXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgJm1IZWlnaHQpICYmIChtSGVpZ2h0ID4gMCkpOworCisgICAgICAgIGludDMyX3QgdGlsZVdpZHRoLCB0aWxlSGVpZ2h0LCBncmlkUm93cywgZ3JpZENvbHM7CisgICAgICAgIGlmIChtTWV0YS0+ZmluZEludDMyKGtLZXlUaWxlV2lkdGgsICZ0aWxlV2lkdGgpICYmICh0aWxlV2lkdGggPiAwKSAmJgorICAgICAgICAgICAgbU1ldGEtPmZpbmRJbnQzMihrS2V5VGlsZUhlaWdodCwgJnRpbGVIZWlnaHQpICYmICh0aWxlSGVpZ2h0ID4gMCkgJiYKKyAgICAgICAgICAgIG1NZXRhLT5maW5kSW50MzIoa0tleUdyaWRSb3dzLCAmZ3JpZFJvd3MpICYmIChncmlkUm93cyA+IDApICYmCisgICAgICAgICAgICBtTWV0YS0+ZmluZEludDMyKGtLZXlHcmlkQ29scywgJmdyaWRDb2xzKSAmJiAoZ3JpZENvbHMgPiAwKSkgeworICAgICAgICAgICAgbVRpbGVXaWR0aCA9IHRpbGVXaWR0aDsKKyAgICAgICAgICAgIG1UaWxlSGVpZ2h0ID0gdGlsZUhlaWdodDsKKyAgICAgICAgICAgIG1HcmlkUm93cyA9IGdyaWRSb3dzOworICAgICAgICAgICAgbUdyaWRDb2xzID0gZ3JpZENvbHM7CisgICAgICAgICAgICBtTnVtVGlsZXMgPSBncmlkUm93cyAqIGdyaWRDb2xzOworICAgICAgICB9CisgICAgICAgIGlmICghbU1ldGEtPmZpbmRJbnQzMihrS2V5VHJhY2tJc0RlZmF1bHQsICZtSXNQcmltYXJ5KSkgeworICAgICAgICAgICAgbUlzUHJpbWFyeSA9IGZhbHNlOworICAgICAgICB9CisgICAgfQogfQogCiAvLyBDbGVhciBhbGwgdGhlIGludGVybmFsIHN0YXRlcyBleGNlcHQgdGhlIENTRCBkYXRhLgpAQCAtMTcyMywxNSArMTg4NSwxNSBAQAogfQogCiB2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6dXBkYXRlVHJhY2tTaXplRXN0aW1hdGUoKSB7Ci0KLSAgICB1aW50MzJfdCBzdGNvQm94Q291bnQgPSAobU93bmVyLT51c2UzMkJpdEZpbGVPZmZzZXQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbVN0Y29UYWJsZUVudHJpZXMtPmNvdW50KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1DbzY0VGFibGVFbnRyaWVzLT5jb3VudCgpKTsKLSAgICBpbnQ2NF90IHN0Y29Cb3hTaXplQnl0ZXMgPSBzdGNvQm94Q291bnQgKiA0OwotICAgIGludDY0X3Qgc3RzekJveFNpemVCeXRlcyA9IG1TYW1wbGVzSGF2ZVNhbWVTaXplPyA0OiAobVN0c3pUYWJsZUVudHJpZXMtPmNvdW50KCkgKiA0KTsKLQogICAgIG1Fc3RpbWF0ZWRUcmFja1NpemVCeXRlcyA9IG1NZGF0U2l6ZUJ5dGVzOyAgLy8gbWVkaWEgZGF0YSBzaXplCi0gICAgaWYgKCFtT3duZXItPmlzRmlsZVN0cmVhbWFibGUoKSkgeworCisgICAgaWYgKCFpc0hlaWMoKSAmJiAhbU93bmVyLT5pc0ZpbGVTdHJlYW1hYmxlKCkpIHsKKyAgICAgICAgdWludDMyX3Qgc3Rjb0JveENvdW50ID0gKG1Pd25lci0+dXNlMzJCaXRGaWxlT2Zmc2V0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBtU3Rjb1RhYmxlRW50cmllcy0+Y291bnQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1DbzY0VGFibGVFbnRyaWVzLT5jb3VudCgpKTsKKyAgICAgICAgaW50NjRfdCBzdGNvQm94U2l6ZUJ5dGVzID0gc3Rjb0JveENvdW50ICogNDsKKyAgICAgICAgaW50NjRfdCBzdHN6Qm94U2l6ZUJ5dGVzID0gbVNhbXBsZXNIYXZlU2FtZVNpemU/IDQ6IChtU3RzelRhYmxlRW50cmllcy0+Y291bnQoKSAqIDQpOworCiAgICAgICAgIC8vIFJlc2VydmVkIGZyZWUgc3BhY2UgaXMgbm90IGxhcmdlIGVub3VnaCB0byBob2xkCiAgICAgICAgIC8vIGFsbCBtZXRhIGRhdGEgYW5kIHRodXMgd2FzdGVkLgogICAgICAgICBtRXN0aW1hdGVkVHJhY2tTaXplQnl0ZXMgKz0gbVN0c2NUYWJsZUVudHJpZXMtPmNvdW50KCkgKiAxMiArICAvLyBzdHNjIGJveCBzaXplCkBAIC0xNzQ1LDEwICsxOTA3LDkgQEAKIAogdm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OmFkZE9uZVN0c2NUYWJsZUVudHJ5KAogICAgICAgICBzaXplX3QgY2h1bmtJZCwgc2l6ZV90IHNhbXBsZUlkKSB7Ci0KLSAgICAgICAgbVN0c2NUYWJsZUVudHJpZXMtPmFkZChodG9ubChjaHVua0lkKSk7Ci0gICAgICAgIG1TdHNjVGFibGVFbnRyaWVzLT5hZGQoaHRvbmwoc2FtcGxlSWQpKTsKLSAgICAgICAgbVN0c2NUYWJsZUVudHJpZXMtPmFkZChodG9ubCgxKSk7CisgICAgbVN0c2NUYWJsZUVudHJpZXMtPmFkZChodG9ubChjaHVua0lkKSk7CisgICAgbVN0c2NUYWJsZUVudHJpZXMtPmFkZChodG9ubChzYW1wbGVJZCkpOworICAgIG1TdHNjVGFibGVFbnRyaWVzLT5hZGQoaHRvbmwoMSkpOwogfQogCiB2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6YWRkT25lU3Rzc1RhYmxlRW50cnkoc2l6ZV90IHNhbXBsZUlkKSB7CkBAIC0xNzkzLDcgKzE5NTQsMTUgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK2Jvb2wgTVBFRzRXcml0ZXI6OlRyYWNrOjppc0V4aWZEYXRhKGNvbnN0IE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKSBjb25zdCB7CisgICAgcmV0dXJuIG1Jc0hlaWMKKyAgICAgICAgICAgICYmIChidWZmZXItPnJhbmdlX2xlbmd0aCgpID4gc2l6ZW9mKGtFeGlmSGVhZGVyKSkKKyAgICAgICAgICAgICYmICFtZW1jbXAoKHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgIGtFeGlmSGVhZGVyLCBzaXplb2Yoa0V4aWZIZWFkZXIpKTsKK30KKwogdm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OmFkZENodW5rT2Zmc2V0KG9mZjY0X3Qgb2Zmc2V0KSB7CisgICAgQ0hFQ0soIW1Jc0hlaWMpOwogICAgIGlmIChtT3duZXItPnVzZTMyQml0RmlsZU9mZnNldCgpKSB7CiAgICAgICAgIHVpbnQzMl90IHZhbHVlID0gb2Zmc2V0OwogICAgICAgICBtU3Rjb1RhYmxlRW50cmllcy0+YWRkKGh0b25sKHZhbHVlKSk7CkBAIC0xODAyLDYgKzE5NzEsMTI2IEBACiAgICAgfQogfQogCit2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6YWRkSXRlbU9mZnNldEFuZFNpemUob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplLCBib29sIGlzRXhpZikgeworICAgIENIRUNLKG1Jc0hlaWMpOworCisgICAgaWYgKG9mZnNldCA+IFVJTlQzMl9NQVggfHwgc2l6ZSA+IFVJTlQzMl9NQVgpIHsKKyAgICAgICAgQUxPR0UoIm9mZnNldCBvciBzaXplIGlzIG91dCBvZiByYW5nZTogJWxsZCwgJWxsZCIsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgb2Zmc2V0LCAobG9uZyBsb25nKSBzaXplKTsKKyAgICAgICAgbUlzTWFsZm9ybWVkID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKG1Jc01hbGZvcm1lZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGlzRXhpZikgeworICAgICAgICAgbUNkc2NSZWZzLnZhbHVlLnB1c2hfYmFjayhtT3duZXItPmFkZEl0ZW1fbCh7CisgICAgICAgICAgICAuaXRlbVR5cGUgPSAiRXhpZiIsCisgICAgICAgICAgICAuaXNQcmltYXJ5ID0gZmFsc2UsCisgICAgICAgICAgICAuaXNIaWRkZW4gPSBmYWxzZSwKKyAgICAgICAgICAgIC5vZmZzZXQgPSAodWludDMyX3Qpb2Zmc2V0LAorICAgICAgICAgICAgLnNpemUgPSAodWludDMyX3Qpc2l6ZSwKKyAgICAgICAgfSkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1UaWxlSW5kZXggPj0gbU51bVRpbGVzKSB7CisgICAgICAgIEFMT0dXKCJJZ25vcmluZyBleGNlc3MgdGlsZXMhIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBSb3RhdGlvbiBhbmdsZSBpbiBIRUlGIGlzIENDVywgZnJhbWV3b3JrIGFuZ2xlIGlzIENXLgorICAgIGludDMyX3QgaGVpZlJvdGF0aW9uID0gMDsKKyAgICBzd2l0Y2gobVJvdGF0aW9uKSB7CisgICAgICAgIGNhc2UgOTA6IGhlaWZSb3RhdGlvbiA9IDM7IGJyZWFrOworICAgICAgICBjYXNlIDE4MDogaGVpZlJvdGF0aW9uID0gMjsgYnJlYWs7CisgICAgICAgIGNhc2UgMjcwOiBoZWlmUm90YXRpb24gPSAxOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDogYnJlYWs7IC8vIGRvbid0IHNldCBpZiBpbnZhbGlkCisgICAgfQorCisgICAgYm9vbCBoYXNHcmlkID0gKG1UaWxlV2lkdGggPiAwKTsKKworICAgIGlmIChtUHJvcGVydGllcy5lbXB0eSgpKSB7CisgICAgICAgIG1Qcm9wZXJ0aWVzLnB1c2hfYmFjayhtT3duZXItPmFkZFByb3BlcnR5X2woeworICAgICAgICAgICAgLnR5cGUgPSBGT1VSQ0MoJ2gnLCAndicsICdjJywgJ0MnKSwKKyAgICAgICAgICAgIC5odmNjID0gQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KG1Db2RlY1NwZWNpZmljRGF0YSwgbUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSkKKyAgICAgICAgfSkpOworCisgICAgICAgIG1Qcm9wZXJ0aWVzLnB1c2hfYmFjayhtT3duZXItPmFkZFByb3BlcnR5X2woeworICAgICAgICAgICAgLnR5cGUgPSBGT1VSQ0MoJ2knLCAncycsICdwJywgJ2UnKSwKKyAgICAgICAgICAgIC53aWR0aCA9IGhhc0dyaWQgPyBtVGlsZVdpZHRoIDogbVdpZHRoLAorICAgICAgICAgICAgLmhlaWdodCA9IGhhc0dyaWQgPyBtVGlsZUhlaWdodCA6IG1IZWlnaHQsCisgICAgICAgIH0pKTsKKworICAgICAgICBpZiAoIWhhc0dyaWQgJiYgaGVpZlJvdGF0aW9uID4gMCkgeworICAgICAgICAgICAgbVByb3BlcnRpZXMucHVzaF9iYWNrKG1Pd25lci0+YWRkUHJvcGVydHlfbCh7CisgICAgICAgICAgICAgICAgLnR5cGUgPSBGT1VSQ0MoJ2knLCAncicsICdvJywgJ3QnKSwKKyAgICAgICAgICAgICAgICAucm90YXRpb24gPSBoZWlmUm90YXRpb24sCisgICAgICAgICAgICB9KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtVGlsZUluZGV4Kys7CisgICAgaWYgKGhhc0dyaWQpIHsKKyAgICAgICAgbURpbWdSZWZzLnZhbHVlLnB1c2hfYmFjayhtT3duZXItPmFkZEl0ZW1fbCh7CisgICAgICAgICAgICAuaXRlbVR5cGUgPSAiaHZjMSIsCisgICAgICAgICAgICAuaXNQcmltYXJ5ID0gZmFsc2UsCisgICAgICAgICAgICAuaXNIaWRkZW4gPSB0cnVlLAorICAgICAgICAgICAgLm9mZnNldCA9ICh1aW50MzJfdClvZmZzZXQsCisgICAgICAgICAgICAuc2l6ZSA9ICh1aW50MzJfdClzaXplLAorICAgICAgICAgICAgLnByb3BlcnRpZXMgPSBtUHJvcGVydGllcywKKyAgICAgICAgfSkpOworCisgICAgICAgIGlmIChtVGlsZUluZGV4ID09IG1OdW1UaWxlcykgeworICAgICAgICAgICAgbVByb3BlcnRpZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIG1Qcm9wZXJ0aWVzLnB1c2hfYmFjayhtT3duZXItPmFkZFByb3BlcnR5X2woeworICAgICAgICAgICAgICAgIC50eXBlID0gRk9VUkNDKCdpJywgJ3MnLCAncCcsICdlJyksCisgICAgICAgICAgICAgICAgLndpZHRoID0gbVdpZHRoLAorICAgICAgICAgICAgICAgIC5oZWlnaHQgPSBtSGVpZ2h0LAorICAgICAgICAgICAgfSkpOworICAgICAgICAgICAgaWYgKGhlaWZSb3RhdGlvbiA+IDApIHsKKyAgICAgICAgICAgICAgICBtUHJvcGVydGllcy5wdXNoX2JhY2sobU93bmVyLT5hZGRQcm9wZXJ0eV9sKHsKKyAgICAgICAgICAgICAgICAgICAgLnR5cGUgPSBGT1VSQ0MoJ2knLCAncicsICdvJywgJ3QnKSwKKyAgICAgICAgICAgICAgICAgICAgLnJvdGF0aW9uID0gaGVpZlJvdGF0aW9uLAorICAgICAgICAgICAgICAgIH0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1JbWFnZUl0ZW1JZCA9IG1Pd25lci0+YWRkSXRlbV9sKHsKKyAgICAgICAgICAgICAgICAuaXRlbVR5cGUgPSAiZ3JpZCIsCisgICAgICAgICAgICAgICAgLmlzUHJpbWFyeSA9IChtSXNQcmltYXJ5ICE9IDApLAorICAgICAgICAgICAgICAgIC5pc0hpZGRlbiA9IGZhbHNlLAorICAgICAgICAgICAgICAgIC5yb3dzID0gKHVpbnQzMl90KW1HcmlkUm93cywKKyAgICAgICAgICAgICAgICAuY29scyA9ICh1aW50MzJfdCltR3JpZENvbHMsCisgICAgICAgICAgICAgICAgLndpZHRoID0gKHVpbnQzMl90KW1XaWR0aCwKKyAgICAgICAgICAgICAgICAuaGVpZ2h0ID0gKHVpbnQzMl90KW1IZWlnaHQsCisgICAgICAgICAgICAgICAgLnByb3BlcnRpZXMgPSBtUHJvcGVydGllcywKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUltYWdlSXRlbUlkID0gbU93bmVyLT5hZGRJdGVtX2woeworICAgICAgICAgICAgLml0ZW1UeXBlID0gImh2YzEiLAorICAgICAgICAgICAgLmlzUHJpbWFyeSA9IChtSXNQcmltYXJ5ICE9IDApLAorICAgICAgICAgICAgLmlzSGlkZGVuID0gZmFsc2UsCisgICAgICAgICAgICAub2Zmc2V0ID0gKHVpbnQzMl90KW9mZnNldCwKKyAgICAgICAgICAgIC5zaXplID0gKHVpbnQzMl90KXNpemUsCisgICAgICAgICAgICAucHJvcGVydGllcyA9IG1Qcm9wZXJ0aWVzLAorICAgICAgICB9KTsKKyAgICB9Cit9CisKKy8vIEZsdXNoIG91dCB0aGUgaXRlbSByZWZzIGZvciB0aGlzIHRyYWNrLiBOb3RlIHRoYXQgaXQgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlCisvLyB3cml0ZXIgdGhyZWFkIGhhcyBzdG9wcGVkLCBiZWNhdXNlIHRoZXJlIG1pZ2h0IGJlIHBlbmRpbmcgaXRlbXMgaW4gdGhlIGxhc3QKKy8vIGZldyBjaHVua3Mgd3JpdHRlbiBieSB0aGUgd3JpdGVyIHRocmVhZCAoYXMgb3Bwb3NlZCB0byB0aGUgdHJhY2spLiBJbiBwYXJ0aWN1bGFyLAorLy8gaXQgYWZmZWN0cyB0aGUgJ2RpbWcnIHJlZnMgZm9yIHRpbGVkIGltYWdlLCBhcyB3ZSBvbmx5IGhhdmUgdGhlIHJlZnMgYWZ0ZXIgdGhlCisvLyBsYXN0IHRpbGUgc2FtcGxlIGlzIHdyaXR0ZW4uCit2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6Zmx1c2hJdGVtUmVmcygpIHsKKyAgICBDSEVDSyhtSXNIZWljKTsKKworICAgIGlmIChtSW1hZ2VJdGVtSWQgPiAwKSB7CisgICAgICAgIG1Pd25lci0+YWRkUmVmc19sKG1JbWFnZUl0ZW1JZCwgbURpbWdSZWZzKTsKKyAgICAgICAgbU93bmVyLT5hZGRSZWZzX2wobUltYWdlSXRlbUlkLCBtQ2RzY1JlZnMpOworICAgIH0KK30KKwogdm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OnNldFRpbWVTY2FsZSgpIHsKICAgICBBTE9HVigic2V0VGltZVNjYWxlIik7CiAgICAgLy8gRGVmYXVsdCB0aW1lIHNjYWxlCkBAIC0xODU0LDcgKzIxNDMsOCBAQAogICAgIHNpemVfdCBzaXplID0gMDsKICAgICBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKSkgewogICAgICAgICBtTWV0YS0+ZmluZERhdGEoa0tleUFWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpOwotICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQykpIHsKKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpIHx8CisgICAgICAgICAgICAgICAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpKSB7CiAgICAgICAgIG1NZXRhLT5maW5kRGF0YShrS2V5SFZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSk7CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCkKICAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQykpIHsKQEAgLTE5NDcsMTEgKzIyMzcsMTggQEAKICAgICB3aGlsZSAoIWNodW5rLT5tU2FtcGxlcy5lbXB0eSgpKSB7CiAgICAgICAgIExpc3Q8TWVkaWFCdWZmZXIgKj46Oml0ZXJhdG9yIGl0ID0gY2h1bmstPm1TYW1wbGVzLmJlZ2luKCk7CiAKLSAgICAgICAgb2ZmNjRfdCBvZmZzZXQgPSAoY2h1bmstPm1UcmFjay0+aXNBdmMoKSB8fCBjaHVuay0+bVRyYWNrLT5pc0hldmMoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBhZGRNdWx0aXBsZUxlbmd0aFByZWZpeGVkU2FtcGxlc19sKCppdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhZGRTYW1wbGVfbCgqaXQpOworICAgICAgICBpbnQzMl90IGlzRXhpZjsKKyAgICAgICAgaWYgKCEoKml0KS0+bWV0YV9kYXRhKCkuZmluZEludDMyKGtLZXlJc0V4aWYsICZpc0V4aWYpKSB7CisgICAgICAgICAgICBpc0V4aWYgPSAwOworICAgICAgICB9CisgICAgICAgIGJvb2wgdXNlUHJlZml4ID0gY2h1bmstPm1UcmFjay0+dXNlUHJlZml4KCkgJiYgIWlzRXhpZjsKIAotICAgICAgICBpZiAoaXNGaXJzdFNhbXBsZSkgeworICAgICAgICBzaXplX3QgYnl0ZXNXcml0dGVuOworICAgICAgICBvZmY2NF90IG9mZnNldCA9IGFkZFNhbXBsZV9sKCppdCwgdXNlUHJlZml4LCBpc0V4aWYsICZieXRlc1dyaXR0ZW4pOworCisgICAgICAgIGlmIChjaHVuay0+bVRyYWNrLT5pc0hlaWMoKSkgeworICAgICAgICAgICAgY2h1bmstPm1UcmFjay0+YWRkSXRlbU9mZnNldEFuZFNpemUob2Zmc2V0LCBieXRlc1dyaXR0ZW4sIGlzRXhpZik7CisgICAgICAgIH0gZWxzZSBpZiAoaXNGaXJzdFNhbXBsZSkgewogICAgICAgICAgICAgY2h1bmstPm1UcmFjay0+YWRkQ2h1bmtPZmZzZXQob2Zmc2V0KTsKICAgICAgICAgICAgIGlzRmlyc3RTYW1wbGUgPSBmYWxzZTsKICAgICAgICAgfQpAQCAtMjA5NCw3ICsyMzkxLDggQEAKICAgICBtU3RhcnRUaW1lUmVhbFVzID0gc3RhcnRUaW1lVXM7CiAKICAgICBpbnQzMl90IHJvdGF0aW9uRGVncmVlczsKLSAgICBpZiAobUlzVmlkZW8gJiYgcGFyYW1zICYmIHBhcmFtcy0+ZmluZEludDMyKGtLZXlSb3RhdGlvbiwgJnJvdGF0aW9uRGVncmVlcykpIHsKKyAgICBpZiAoKG1Jc1ZpZGVvIHx8IG1Jc0hlaWMpICYmIHBhcmFtcyAmJgorICAgICAgICAgICAgcGFyYW1zLT5maW5kSW50MzIoa0tleVJvdGF0aW9uLCAmcm90YXRpb25EZWdyZWVzKSkgewogICAgICAgICBtUm90YXRpb24gPSByb3RhdGlvbkRlZ3JlZXM7CiAgICAgfQogCkBAIC0yNTk4LDcgKzI4OTYsNyBAQAogICAgIHNwPE1ldGFEYXRhPiBtZXRhX2RhdGE7CiAKICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLSAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyOworICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyOwogICAgIGNvbnN0IGNoYXIgKnRyYWNrTmFtZSA9IGdldFRyYWNrVHlwZSgpOwogICAgIHdoaWxlICghbURvbmUgJiYgKGVyciA9IG1Tb3VyY2UtPnJlYWQoJmJ1ZmZlcikpID09IE9LKSB7CiAgICAgICAgIGlmIChidWZmZXItPnJhbmdlX2xlbmd0aCgpID09IDApIHsKQEAgLTI2MjAsNyArMjkxOCw3IEBACiAgICAgICAgICsrY291bnQ7CiAKICAgICAgICAgaW50MzJfdCBpc0NvZGVjQ29uZmlnOwotICAgICAgICBpZiAoYnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDMyKGtLZXlJc0NvZGVjQ29uZmlnLCAmaXNDb2RlY0NvbmZpZykKKyAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YV9kYXRhKCkuZmluZEludDMyKGtLZXlJc0NvZGVjQ29uZmlnLCAmaXNDb2RlY0NvbmZpZykKICAgICAgICAgICAgICAgICAmJiBpc0NvZGVjQ29uZmlnKSB7CiAgICAgICAgICAgICAvLyBpZiBjb25maWcgZm9ybWF0IChhdCB0cmFjayBhZGRpdGlvbikgYWxyZWFkeSBoYWQgQ1NELCBrZWVwIHRoYXQKICAgICAgICAgICAgIC8vIFVOTEVTUyB3ZSBoYXZlIG5vdCByZWNlaXZlZCBhbnkgZnJhbWVzIHlldC4KQEAgLTI2MzYsNyArMjkzNCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtSXNIZXZjKSB7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtSXNIZXZjIHx8IG1Jc0hlaWMpIHsKICAgICAgICAgICAgICAgICAgICAgZXJyID0gbWFrZUhFVkNDb2RlY1NwZWNpZmljRGF0YSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKQEAgLTI2NjEsNyArMjk1OSw4IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBQZXItZnJhbWUgbWV0YWRhdGEgc2FtcGxlJ3Mgc2l6ZSBtdXN0IGJlIHNtYWxsZXIgdGhhbiBtYXggYWxsb3dlZC4KLSAgICAgICAgaWYgKCFtSXNWaWRlbyAmJiAhbUlzQXVkaW8gJiYgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA+PSBrTWF4TWV0YWRhdGFTaXplKSB7CisgICAgICAgIGlmICghbUlzVmlkZW8gJiYgIW1Jc0F1ZGlvICYmICFtSXNIZWljICYmCisgICAgICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA+PSBrTWF4TWV0YWRhdGFTaXplKSB7CiAgICAgICAgICAgICBBTE9HVygiQnVmZmVyIHNpemUgaXMgJXp1LiBNYXhpbXVtIG1ldGFkYXRhIGJ1ZmZlciBzaXplIGlzICVsbGQgZm9yICVzIHRyYWNrIiwKICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSwgKGxvbmcgbG9uZylrTWF4TWV0YWRhdGFTaXplLCB0cmFja05hbWUpOwogICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CkBAIC0yNjcwLDYgKzI5NjksMTkgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgYm9vbCBpc0V4aWYgPSBmYWxzZTsKKyAgICAgICAgaW50MzJfdCBpc011eGVyRGF0YTsKKyAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YV9kYXRhKCkuZmluZEludDMyKGtLZXlJc011eGVyRGF0YSwgJmlzTXV4ZXJEYXRhKSAmJiBpc011eGVyRGF0YSkgeworICAgICAgICAgICAgLy8gV2Ugb25seSBzdXBwb3J0IG9uZSB0eXBlIG9mIG11eGVyIGRhdGEsIHdoaWNoIGlzIEV4aWYgZGF0YSBibG9jay4KKyAgICAgICAgICAgIGlzRXhpZiA9IGlzRXhpZkRhdGEoYnVmZmVyKTsKKyAgICAgICAgICAgIGlmICghaXNFeGlmKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIklnbm9yaW5nIGJhZCBFeGlmIGRhdGEgYmxvY2siKTsKKyAgICAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICBidWZmZXIgPSBOVUxMOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgKytuQWN0dWFsRnJhbWVzOwogCiAgICAgICAgIC8vIE1ha2UgYSBkZWVwIGNvcHkgb2YgdGhlIE1lZGlhQnVmZmVyIGFuZCBNZXRhZGF0YSBhbmQgcmVsZWFzZQpAQCAtMjY3OCwxNCArMjk5MCwxOSBAQAogICAgICAgICBtZW1jcHkoY29weS0+ZGF0YSgpLCAodWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKICAgICAgICAgICAgICAgICBidWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKICAgICAgICAgY29weS0+c2V0X3JhbmdlKDAsIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOwotICAgICAgICBtZXRhX2RhdGEgPSBuZXcgTWV0YURhdGEoKmJ1ZmZlci0+bWV0YV9kYXRhKCkuZ2V0KCkpOworICAgICAgICBtZXRhX2RhdGEgPSBuZXcgTWV0YURhdGEoYnVmZmVyLT5tZXRhX2RhdGEoKSk7CiAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICBidWZmZXIgPSBOVUxMOwogCi0gICAgICAgIGlmIChtSXNBdmMgfHwgbUlzSGV2YykgU3RyaXBTdGFydGNvZGUoY29weSk7CisgICAgICAgIGlmIChpc0V4aWYpIHsKKyAgICAgICAgICAgIGNvcHktPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc0V4aWYsIDEpOworICAgICAgICB9CisgICAgICAgIGJvb2wgdXNlUHJlZml4ID0gdGhpcy0+dXNlUHJlZml4KCkgJiYgIWlzRXhpZjsKKworICAgICAgICBpZiAodXNlUHJlZml4KSBTdHJpcFN0YXJ0Y29kZShjb3B5KTsKIAogICAgICAgICBzaXplX3Qgc2FtcGxlU2l6ZSA9IGNvcHktPnJhbmdlX2xlbmd0aCgpOwotICAgICAgICBpZiAobUlzQXZjIHx8IG1Jc0hldmMpIHsKKyAgICAgICAgaWYgKHVzZVByZWZpeCkgewogICAgICAgICAgICAgaWYgKG1Pd25lci0+dXNlTmFsTGVuZ3RoRm91cigpKSB7CiAgICAgICAgICAgICAgICAgc2FtcGxlU2l6ZSArPSA0OwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTI3MzksMjIzICszMDU2LDIzMCBAQAogICAgICAgICAgICAgbUdvdFN0YXJ0S2V5RnJhbWUgPSB0cnVlOwogICAgICAgICB9CiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgICAgICBpZiAobVN0c3pUYWJsZUVudHJpZXMtPmNvdW50KCkgPT0gMCkgewotICAgICAgICAgICAgbUZpcnN0U2FtcGxlVGltZVJlYWxVcyA9IHN5c3RlbVRpbWUoKSAvIDEwMDA7Ci0gICAgICAgICAgICBtU3RhcnRUaW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOwotICAgICAgICAgICAgbU93bmVyLT5zZXRTdGFydFRpbWVzdGFtcFVzKG1TdGFydFRpbWVzdGFtcFVzKTsKLSAgICAgICAgICAgIHByZXZpb3VzUGF1c2VkRHVyYXRpb25VcyA9IG1TdGFydFRpbWVzdGFtcFVzOwotICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1SZXN1bWVkKSB7Ci0gICAgICAgICAgICBpbnQ2NF90IGR1ckV4Y2x1ZGluZ0VhcmxpZXJQYXVzZXNVcyA9IHRpbWVzdGFtcFVzIC0gcHJldmlvdXNQYXVzZWREdXJhdGlvblVzOwotICAgICAgICAgICAgaWYgKFdBUk5fVU5MRVNTKGR1ckV4Y2x1ZGluZ0VhcmxpZXJQYXVzZXNVcyA+PSAwbGwsICJmb3IgJXMgdHJhY2siLCB0cmFja05hbWUpKSB7Ci0gICAgICAgICAgICAgICAgY29weS0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKLSAgICAgICAgICAgICAgICBtSXNNYWxmb3JtZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQ2NF90IHBhdXNlZER1cmF0aW9uVXMgPSBkdXJFeGNsdWRpbmdFYXJsaWVyUGF1c2VzVXMgLSBtVHJhY2tEdXJhdGlvblVzOwotICAgICAgICAgICAgaWYgKFdBUk5fVU5MRVNTKHBhdXNlZER1cmF0aW9uVXMgPj0gbGFzdER1cmF0aW9uVXMsICJmb3IgJXMgdHJhY2siLCB0cmFja05hbWUpKSB7Ci0gICAgICAgICAgICAgICAgY29weS0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKLSAgICAgICAgICAgICAgICBtSXNNYWxmb3JtZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXMgKz0gcGF1c2VkRHVyYXRpb25VcyAtIGxhc3REdXJhdGlvblVzOwotICAgICAgICAgICAgbVJlc3VtZWQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBUaW1lc3RhbXBEZWJ1Z0hlbHBlckVudHJ5IHRpbWVzdGFtcERlYnVnRW50cnk7Ci0gICAgICAgIHRpbWVzdGFtcFVzIC09IHByZXZpb3VzUGF1c2VkRHVyYXRpb25VczsKLSAgICAgICAgdGltZXN0YW1wRGVidWdFbnRyeS5wdHMgPSB0aW1lc3RhbXBVczsKLSAgICAgICAgaWYgKFdBUk5fVU5MRVNTKHRpbWVzdGFtcFVzID49IDBsbCwgImZvciAlcyB0cmFjayIsIHRyYWNrTmFtZSkpIHsKLSAgICAgICAgICAgIGNvcHktPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKLSAgICAgICAgICAgIG1Jc01hbGZvcm1lZCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtSXNWaWRlbykgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIENvbXBvc2l0aW9uIHRpbWU6IHRpbWVzdGFtcFVzCi0gICAgICAgICAgICAgKiBEZWNvZGluZyB0aW1lOiBkZWNvZGluZ1RpbWVVcwotICAgICAgICAgICAgICogQ29tcG9zaXRpb24gdGltZSBvZmZzZXQgPSBjb21wb3NpdGlvbiB0aW1lIC0gZGVjb2RpbmcgdGltZQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpbnQ2NF90IGRlY29kaW5nVGltZVVzOwotICAgICAgICAgICAgQ0hFQ0sobWV0YV9kYXRhLT5maW5kSW50NjQoa0tleURlY29kaW5nVGltZSwgJmRlY29kaW5nVGltZVVzKSk7Ci0gICAgICAgICAgICBkZWNvZGluZ1RpbWVVcyAtPSBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXM7Ci0KLSAgICAgICAgICAgIC8vIGVuc3VyZSBub24tbmVnYXRpdmUsIG1vbm90b25pYyBkZWNvZGluZyB0aW1lCi0gICAgICAgICAgICBpZiAobUxhc3REZWNvZGluZ1RpbWVVcyA8IDApIHsKLSAgICAgICAgICAgICAgICBkZWNvZGluZ1RpbWVVcyA9IHN0ZDo6bWF4KChpbnQ2NF90KTAsIGRlY29kaW5nVGltZVVzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gaW5jcmVhc2UgZGVjb2RpbmcgdGltZSBieSBhdCBsZWFzdCB0aGUgbGFyZ2VyIHZhdWxlIG9mIDEgdGljayBhbmQKLSAgICAgICAgICAgICAgICAvLyAwLjEgbWlsbGlzZWNvbmRzLiBUaGlzIG5lZWRzIHRvIHRha2UgaW50byBhY2NvdW50IHRoZSBwb3NzaWJsZQotICAgICAgICAgICAgICAgIC8vIGRlbHRhIGFkanVzdG1lbnQgaW4gRHVyYXRpb25UaWNrcyBpbiBiZWxvdy4KLSAgICAgICAgICAgICAgICBkZWNvZGluZ1RpbWVVcyA9IHN0ZDo6bWF4KG1MYXN0RGVjb2RpbmdUaW1lVXMgKwotICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXgoMTAwLCBkaXZVcCgxMDAwMDAwLCBtVGltZVNjYWxlKSksIGRlY29kaW5nVGltZVVzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUxhc3REZWNvZGluZ1RpbWVVcyA9IGRlY29kaW5nVGltZVVzOwotICAgICAgICAgICAgdGltZXN0YW1wRGVidWdFbnRyeS5kdHMgPSBkZWNvZGluZ1RpbWVVczsKLSAgICAgICAgICAgIHRpbWVzdGFtcERlYnVnRW50cnkuZnJhbWVUeXBlID0gaXNTeW5jID8gIktleSBmcmFtZSIgOiAiTm9uLUtleSBmcmFtZSI7Ci0gICAgICAgICAgICAvLyBJbnNlcnQgdGhlIHRpbWVzdGFtcCBpbnRvIHRoZSBtVGltZXN0YW1wRGVidWdIZWxwZXIKLSAgICAgICAgICAgIGlmIChtVGltZXN0YW1wRGVidWdIZWxwZXIuc2l6ZSgpID49IGtUaW1lc3RhbXBEZWJ1Z0NvdW50KSB7Ci0gICAgICAgICAgICAgICAgbVRpbWVzdGFtcERlYnVnSGVscGVyLnBvcF9mcm9udCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVRpbWVzdGFtcERlYnVnSGVscGVyLnB1c2hfYmFjayh0aW1lc3RhbXBEZWJ1Z0VudHJ5KTsKLQotICAgICAgICAgICAgY3R0c09mZnNldFRpbWVVcyA9Ci0gICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcFVzICsga01heEN0dHNPZmZzZXRUaW1lVXMgLSBkZWNvZGluZ1RpbWVVczsKLSAgICAgICAgICAgIGlmIChXQVJOX1VOTEVTUyhjdHRzT2Zmc2V0VGltZVVzID49IDBsbCwgImZvciAlcyB0cmFjayIsIHRyYWNrTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBjb3B5LT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgbVNvdXJjZS0+c3RvcCgpOwotICAgICAgICAgICAgICAgIG1Jc01hbGZvcm1lZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRpbWVzdGFtcFVzID0gZGVjb2RpbmdUaW1lVXM7Ci0gICAgICAgICAgICBBTE9HVigiZGVjb2RpbmcgdGltZTogJSIgUFJJZDY0ICIgYW5kIGN0dHMgb2Zmc2V0IHRpbWU6ICUiIFBSSWQ2NCwKLSAgICAgICAgICAgICAgICB0aW1lc3RhbXBVcywgY3R0c09mZnNldFRpbWVVcyk7Ci0KLSAgICAgICAgICAgIC8vIFVwZGF0ZSBjdHRzIGJveCB0YWJsZSBpZiBuZWNlc3NhcnkKLSAgICAgICAgICAgIGN1cnJDdHRzT2Zmc2V0VGltZVRpY2tzID0KLSAgICAgICAgICAgICAgICAgICAgKGN0dHNPZmZzZXRUaW1lVXMgKiBtVGltZVNjYWxlICsgNTAwMDAwTEwpIC8gMTAwMDAwMExMOwotICAgICAgICAgICAgaWYgKFdBUk5fVU5MRVNTKGN1cnJDdHRzT2Zmc2V0VGltZVRpY2tzIDw9IDB4MEZGRkZGRkZGTEwsICJmb3IgJXMgdHJhY2siLCB0cmFja05hbWUpKSB7Ci0gICAgICAgICAgICAgICAgY29weS0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKLSAgICAgICAgICAgICAgICBtSXNNYWxmb3JtZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCisgICAgICAgIGlmICghbUlzSGVpYykgewogICAgICAgICAgICAgaWYgKG1TdHN6VGFibGVFbnRyaWVzLT5jb3VudCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAvLyBGb3JjZSB0aGUgZmlyc3QgY3R0cyB0YWJsZSBlbnRyeSB0byBoYXZlIG9uZSBzaW5nbGUgZW50cnkKLSAgICAgICAgICAgICAgICAvLyBzbyB0aGF0IHdlIGNhbiBkbyBhZGp1c3RtZW50IGZvciB0aGUgaW5pdGlhbCB0cmFjayBzdGFydAotICAgICAgICAgICAgICAgIC8vIHRpbWUgb2Zmc2V0IGVhc2lseSBpbiB3cml0ZUN0dHNCb3goKS4KLSAgICAgICAgICAgICAgICBsYXN0Q3R0c09mZnNldFRpbWVUaWNrcyA9IGN1cnJDdHRzT2Zmc2V0VGltZVRpY2tzOwotICAgICAgICAgICAgICAgIGFkZE9uZUN0dHNUYWJsZUVudHJ5KDEsIGN1cnJDdHRzT2Zmc2V0VGltZVRpY2tzKTsKLSAgICAgICAgICAgICAgICBjdHRzU2FtcGxlQ291bnQgPSAwOyAgICAgIC8vIE5vIHNhbXBsZSBpbiBjdHRzIGJveCBpcyBwZW5kaW5nCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChjdXJyQ3R0c09mZnNldFRpbWVUaWNrcyAhPSBsYXN0Q3R0c09mZnNldFRpbWVUaWNrcykgewotICAgICAgICAgICAgICAgICAgICBhZGRPbmVDdHRzVGFibGVFbnRyeShjdHRzU2FtcGxlQ291bnQsIGxhc3RDdHRzT2Zmc2V0VGltZVRpY2tzKTsKLSAgICAgICAgICAgICAgICAgICAgbGFzdEN0dHNPZmZzZXRUaW1lVGlja3MgPSBjdXJyQ3R0c09mZnNldFRpbWVUaWNrczsKLSAgICAgICAgICAgICAgICAgICAgY3R0c1NhbXBsZUNvdW50ID0gMTsgIC8vIE9uZSBzYW1wbGUgaW4gY3R0cyBib3ggaXMgcGVuZGluZworICAgICAgICAgICAgICAgIG1GaXJzdFNhbXBsZVRpbWVSZWFsVXMgPSBzeXN0ZW1UaW1lKCkgLyAxMDAwOworICAgICAgICAgICAgICAgIG1TdGFydFRpbWVzdGFtcFVzID0gdGltZXN0YW1wVXM7CisgICAgICAgICAgICAgICAgbU93bmVyLT5zZXRTdGFydFRpbWVzdGFtcFVzKG1TdGFydFRpbWVzdGFtcFVzKTsKKyAgICAgICAgICAgICAgICBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXMgPSBtU3RhcnRUaW1lc3RhbXBVczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1SZXN1bWVkKSB7CisgICAgICAgICAgICAgICAgaW50NjRfdCBkdXJFeGNsdWRpbmdFYXJsaWVyUGF1c2VzVXMgPSB0aW1lc3RhbXBVcyAtIHByZXZpb3VzUGF1c2VkRHVyYXRpb25VczsKKyAgICAgICAgICAgICAgICBpZiAoV0FSTl9VTkxFU1MoZHVyRXhjbHVkaW5nRWFybGllclBhdXNlc1VzID49IDBsbCwgImZvciAlcyB0cmFjayIsIHRyYWNrTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29weS0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgICAgICBtU291cmNlLT5zdG9wKCk7CisgICAgICAgICAgICAgICAgICAgIG1Jc01hbGZvcm1lZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludDY0X3QgcGF1c2VkRHVyYXRpb25VcyA9IGR1ckV4Y2x1ZGluZ0VhcmxpZXJQYXVzZXNVcyAtIG1UcmFja0R1cmF0aW9uVXM7CisgICAgICAgICAgICAgICAgaWYgKFdBUk5fVU5MRVNTKHBhdXNlZER1cmF0aW9uVXMgPj0gbGFzdER1cmF0aW9uVXMsICJmb3IgJXMgdHJhY2siLCB0cmFja05hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvcHktPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgbVNvdXJjZS0+c3RvcCgpOworICAgICAgICAgICAgICAgICAgICBtSXNNYWxmb3JtZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXMgKz0gcGF1c2VkRHVyYXRpb25VcyAtIGxhc3REdXJhdGlvblVzOworICAgICAgICAgICAgICAgIG1SZXN1bWVkID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUaW1lc3RhbXBEZWJ1Z0hlbHBlckVudHJ5IHRpbWVzdGFtcERlYnVnRW50cnk7CisgICAgICAgICAgICB0aW1lc3RhbXBVcyAtPSBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXM7CisgICAgICAgICAgICB0aW1lc3RhbXBEZWJ1Z0VudHJ5LnB0cyA9IHRpbWVzdGFtcFVzOworICAgICAgICAgICAgaWYgKFdBUk5fVU5MRVNTKHRpbWVzdGFtcFVzID49IDBsbCwgImZvciAlcyB0cmFjayIsIHRyYWNrTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBjb3B5LT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgbVNvdXJjZS0+c3RvcCgpOworICAgICAgICAgICAgICAgIG1Jc01hbGZvcm1lZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtSXNWaWRlbykgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogQ29tcG9zaXRpb24gdGltZTogdGltZXN0YW1wVXMKKyAgICAgICAgICAgICAgICAgKiBEZWNvZGluZyB0aW1lOiBkZWNvZGluZ1RpbWVVcworICAgICAgICAgICAgICAgICAqIENvbXBvc2l0aW9uIHRpbWUgb2Zmc2V0ID0gY29tcG9zaXRpb24gdGltZSAtIGRlY29kaW5nIHRpbWUKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpbnQ2NF90IGRlY29kaW5nVGltZVVzOworICAgICAgICAgICAgICAgIENIRUNLKG1ldGFfZGF0YS0+ZmluZEludDY0KGtLZXlEZWNvZGluZ1RpbWUsICZkZWNvZGluZ1RpbWVVcykpOworICAgICAgICAgICAgICAgIGRlY29kaW5nVGltZVVzIC09IHByZXZpb3VzUGF1c2VkRHVyYXRpb25VczsKKworICAgICAgICAgICAgICAgIC8vIGVuc3VyZSBub24tbmVnYXRpdmUsIG1vbm90b25pYyBkZWNvZGluZyB0aW1lCisgICAgICAgICAgICAgICAgaWYgKG1MYXN0RGVjb2RpbmdUaW1lVXMgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGRlY29kaW5nVGltZVVzID0gc3RkOjptYXgoKGludDY0X3QpMCwgZGVjb2RpbmdUaW1lVXMpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICsrY3R0c1NhbXBsZUNvdW50OworICAgICAgICAgICAgICAgICAgICAvLyBpbmNyZWFzZSBkZWNvZGluZyB0aW1lIGJ5IGF0IGxlYXN0IHRoZSBsYXJnZXIgdmF1bGUgb2YgMSB0aWNrIGFuZAorICAgICAgICAgICAgICAgICAgICAvLyAwLjEgbWlsbGlzZWNvbmRzLiBUaGlzIG5lZWRzIHRvIHRha2UgaW50byBhY2NvdW50IHRoZSBwb3NzaWJsZQorICAgICAgICAgICAgICAgICAgICAvLyBkZWx0YSBhZGp1c3RtZW50IGluIER1cmF0aW9uVGlja3MgaW4gYmVsb3cuCisgICAgICAgICAgICAgICAgICAgIGRlY29kaW5nVGltZVVzID0gc3RkOjptYXgobUxhc3REZWNvZGluZ1RpbWVVcyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXgoMTAwLCBkaXZVcCgxMDAwMDAwLCBtVGltZVNjYWxlKSksIGRlY29kaW5nVGltZVVzKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIFVwZGF0ZSBjdHRzIHRpbWUgb2Zmc2V0IHJhbmdlCi0gICAgICAgICAgICBpZiAobVN0c3pUYWJsZUVudHJpZXMtPmNvdW50KCkgPT0gMCkgewotICAgICAgICAgICAgICAgIG1NaW5DdHRzT2Zmc2V0VGlja3MgPSBjdXJyQ3R0c09mZnNldFRpbWVUaWNrczsKLSAgICAgICAgICAgICAgICBtTWF4Q3R0c09mZnNldFRpY2tzID0gY3VyckN0dHNPZmZzZXRUaW1lVGlja3M7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChjdXJyQ3R0c09mZnNldFRpbWVUaWNrcyA+IG1NYXhDdHRzT2Zmc2V0VGlja3MpIHsKLSAgICAgICAgICAgICAgICAgICAgbU1heEN0dHNPZmZzZXRUaWNrcyA9IGN1cnJDdHRzT2Zmc2V0VGltZVRpY2tzOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VyckN0dHNPZmZzZXRUaW1lVGlja3MgPCBtTWluQ3R0c09mZnNldFRpY2tzKSB7CisgICAgICAgICAgICAgICAgbUxhc3REZWNvZGluZ1RpbWVVcyA9IGRlY29kaW5nVGltZVVzOworICAgICAgICAgICAgICAgIHRpbWVzdGFtcERlYnVnRW50cnkuZHRzID0gZGVjb2RpbmdUaW1lVXM7CisgICAgICAgICAgICAgICAgdGltZXN0YW1wRGVidWdFbnRyeS5mcmFtZVR5cGUgPSBpc1N5bmMgPyAiS2V5IGZyYW1lIiA6ICJOb24tS2V5IGZyYW1lIjsKKyAgICAgICAgICAgICAgICAvLyBJbnNlcnQgdGhlIHRpbWVzdGFtcCBpbnRvIHRoZSBtVGltZXN0YW1wRGVidWdIZWxwZXIKKyAgICAgICAgICAgICAgICBpZiAobVRpbWVzdGFtcERlYnVnSGVscGVyLnNpemUoKSA+PSBrVGltZXN0YW1wRGVidWdDb3VudCkgeworICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wRGVidWdIZWxwZXIucG9wX2Zyb250KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBEZWJ1Z0hlbHBlci5wdXNoX2JhY2sodGltZXN0YW1wRGVidWdFbnRyeSk7CisKKyAgICAgICAgICAgICAgICBjdHRzT2Zmc2V0VGltZVVzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcFVzICsga01heEN0dHNPZmZzZXRUaW1lVXMgLSBkZWNvZGluZ1RpbWVVczsKKyAgICAgICAgICAgICAgICBpZiAoV0FSTl9VTkxFU1MoY3R0c09mZnNldFRpbWVVcyA+PSAwbGwsICJmb3IgJXMgdHJhY2siLCB0cmFja05hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvcHktPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgbVNvdXJjZS0+c3RvcCgpOworICAgICAgICAgICAgICAgICAgICBtSXNNYWxmb3JtZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXBVcyA9IGRlY29kaW5nVGltZVVzOworICAgICAgICAgICAgICAgIEFMT0dWKCJkZWNvZGluZyB0aW1lOiAlIiBQUklkNjQgIiBhbmQgY3R0cyBvZmZzZXQgdGltZTogJSIgUFJJZDY0LAorICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBVcywgY3R0c09mZnNldFRpbWVVcyk7CisKKyAgICAgICAgICAgICAgICAvLyBVcGRhdGUgY3R0cyBib3ggdGFibGUgaWYgbmVjZXNzYXJ5CisgICAgICAgICAgICAgICAgY3VyckN0dHNPZmZzZXRUaW1lVGlja3MgPQorICAgICAgICAgICAgICAgICAgICAgICAgKGN0dHNPZmZzZXRUaW1lVXMgKiBtVGltZVNjYWxlICsgNTAwMDAwTEwpIC8gMTAwMDAwMExMOworICAgICAgICAgICAgICAgIGlmIChXQVJOX1VOTEVTUyhjdXJyQ3R0c09mZnNldFRpbWVUaWNrcyA8PSAweDBGRkZGRkZGRkxMLCAiZm9yICVzIHRyYWNrIiwgdHJhY2tOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBjb3B5LT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgICAgICAgICAgICAgbUlzTWFsZm9ybWVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG1TdHN6VGFibGVFbnRyaWVzLT5jb3VudCgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRm9yY2UgdGhlIGZpcnN0IGN0dHMgdGFibGUgZW50cnkgdG8gaGF2ZSBvbmUgc2luZ2xlIGVudHJ5CisgICAgICAgICAgICAgICAgICAgIC8vIHNvIHRoYXQgd2UgY2FuIGRvIGFkanVzdG1lbnQgZm9yIHRoZSBpbml0aWFsIHRyYWNrIHN0YXJ0CisgICAgICAgICAgICAgICAgICAgIC8vIHRpbWUgb2Zmc2V0IGVhc2lseSBpbiB3cml0ZUN0dHNCb3goKS4KKyAgICAgICAgICAgICAgICAgICAgbGFzdEN0dHNPZmZzZXRUaW1lVGlja3MgPSBjdXJyQ3R0c09mZnNldFRpbWVUaWNrczsKKyAgICAgICAgICAgICAgICAgICAgYWRkT25lQ3R0c1RhYmxlRW50cnkoMSwgY3VyckN0dHNPZmZzZXRUaW1lVGlja3MpOworICAgICAgICAgICAgICAgICAgICBjdHRzU2FtcGxlQ291bnQgPSAwOyAgICAgIC8vIE5vIHNhbXBsZSBpbiBjdHRzIGJveCBpcyBwZW5kaW5nCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJDdHRzT2Zmc2V0VGltZVRpY2tzICE9IGxhc3RDdHRzT2Zmc2V0VGltZVRpY2tzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRPbmVDdHRzVGFibGVFbnRyeShjdHRzU2FtcGxlQ291bnQsIGxhc3RDdHRzT2Zmc2V0VGltZVRpY2tzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RDdHRzT2Zmc2V0VGltZVRpY2tzID0gY3VyckN0dHNPZmZzZXRUaW1lVGlja3M7CisgICAgICAgICAgICAgICAgICAgICAgICBjdHRzU2FtcGxlQ291bnQgPSAxOyAgLy8gT25lIHNhbXBsZSBpbiBjdHRzIGJveCBpcyBwZW5kaW5nCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICArK2N0dHNTYW1wbGVDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBjdHRzIHRpbWUgb2Zmc2V0IHJhbmdlCisgICAgICAgICAgICAgICAgaWYgKG1TdHN6VGFibGVFbnRyaWVzLT5jb3VudCgpID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgbU1pbkN0dHNPZmZzZXRUaWNrcyA9IGN1cnJDdHRzT2Zmc2V0VGltZVRpY2tzOwotICAgICAgICAgICAgICAgICAgICBtTWluQ3R0c09mZnNldFRpbWVVcyA9IGN0dHNPZmZzZXRUaW1lVXM7CisgICAgICAgICAgICAgICAgICAgIG1NYXhDdHRzT2Zmc2V0VGlja3MgPSBjdXJyQ3R0c09mZnNldFRpbWVUaWNrczsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoY3VyckN0dHNPZmZzZXRUaW1lVGlja3MgPiBtTWF4Q3R0c09mZnNldFRpY2tzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtTWF4Q3R0c09mZnNldFRpY2tzID0gY3VyckN0dHNPZmZzZXRUaW1lVGlja3M7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VyckN0dHNPZmZzZXRUaW1lVGlja3MgPCBtTWluQ3R0c09mZnNldFRpY2tzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtTWluQ3R0c09mZnNldFRpY2tzID0gY3VyckN0dHNPZmZzZXRUaW1lVGlja3M7CisgICAgICAgICAgICAgICAgICAgICAgICBtTWluQ3R0c09mZnNldFRpbWVVcyA9IGN0dHNPZmZzZXRUaW1lVXM7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KIAotICAgICAgICBpZiAobU93bmVyLT5pc1JlYWxUaW1lUmVjb3JkaW5nKCkpIHsKLSAgICAgICAgICAgIGlmIChtSXNBdWRpbykgewotICAgICAgICAgICAgICAgIHVwZGF0ZURyaWZ0VGltZShtZXRhX2RhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKFdBUk5fVU5MRVNTKHRpbWVzdGFtcFVzID49IDBsbCwgImZvciAlcyB0cmFjayIsIHRyYWNrTmFtZSkpIHsKLSAgICAgICAgICAgIGNvcHktPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKLSAgICAgICAgICAgIG1Jc01hbGZvcm1lZCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIEFMT0dWKCIlcyBtZWRpYSB0aW1lIHN0YW1wOiAlIiBQUklkNjQgIiBhbmQgcHJldmlvdXMgcGF1c2VkIGR1cmF0aW9uICUiIFBSSWQ2NCwKLSAgICAgICAgICAgICAgICB0cmFja05hbWUsIHRpbWVzdGFtcFVzLCBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXMpOwotICAgICAgICBpZiAodGltZXN0YW1wVXMgPiBtVHJhY2tEdXJhdGlvblVzKSB7Ci0gICAgICAgICAgICBtVHJhY2tEdXJhdGlvblVzID0gdGltZXN0YW1wVXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXZSBuZWVkIHRvIHVzZSB0aGUgdGltZSBzY2FsZSBiYXNlZCB0aWNrcywgcmF0aGVyIHRoYW4gdGhlCi0gICAgICAgIC8vIHRpbWVzdGFtcCBpdHNlbGYgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgd2UgaGF2ZSB0byB1c2UgYSBuZXcKLSAgICAgICAgLy8gc3R0cyBlbnRyeSwgc2luY2Ugd2UgbWF5IGhhdmUgcm91bmRpbmcgZXJyb3JzLgotICAgICAgICAvLyBUaGUgY2FsY3VsYXRpb24gaXMgaW50ZW5kZWQgdG8gcmVkdWNlIHRoZSBhY2N1bXVsYXRlZAotICAgICAgICAvLyByb3VuZGluZyBlcnJvcnMuCi0gICAgICAgIGN1cnJEdXJhdGlvblRpY2tzID0KLSAgICAgICAgICAgICgodGltZXN0YW1wVXMgKiBtVGltZVNjYWxlICsgNTAwMDAwTEwpIC8gMTAwMDAwMExMIC0KLSAgICAgICAgICAgICAgICAobGFzdFRpbWVzdGFtcFVzICogbVRpbWVTY2FsZSArIDUwMDAwMExMKSAvIDEwMDAwMDBMTCk7Ci0gICAgICAgIGlmIChjdXJyRHVyYXRpb25UaWNrcyA8IDBsbCkgewotICAgICAgICAgICAgQUxPR0UoImRvIG5vdCBzdXBwb3J0IG91dCBvZiBvcmRlciBmcmFtZXMgKHRpbWVzdGFtcDogJWxsZCA8IGxhc3Q6ICVsbGQgZm9yICVzIHRyYWNrIiwKLSAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lc3RhbXBVcywgKGxvbmcgbG9uZylsYXN0VGltZXN0YW1wVXMsIHRyYWNrTmFtZSk7Ci0gICAgICAgICAgICBjb3B5LT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBtU291cmNlLT5zdG9wKCk7Ci0gICAgICAgICAgICBtSXNNYWxmb3JtZWQgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpZiB0aGUgZHVyYXRpb24gaXMgZGlmZmVyZW50IGZvciB0aGlzIHNhbXBsZSwgc2VlIGlmIGl0IGlzIGNsb3NlIGVub3VnaCB0byB0aGUgcHJldmlvdXMKLSAgICAgICAgLy8gZHVyYXRpb24gdGhhdCB3ZSBjYW4gZnVkZ2UgaXQgYW5kIHVzZSB0aGUgc2FtZSB2YWx1ZSwgdG8gYXZvaWQgZmlsbGluZyB0aGUgc3R0cyB0YWJsZQotICAgICAgICAvLyB3aXRoIGxvdHMgb2YgbmVhci1pZGVudGljYWwgZW50cmllcy4KLSAgICAgICAgLy8gImNsb3NlIGVub3VnaCIgaGVyZSBtZWFucyB0aGF0IHRoZSBjdXJyZW50IGR1cmF0aW9uIG5lZWRzIHRvIGJlIGFkanVzdGVkIGJ5IGxlc3MKLSAgICAgICAgLy8gdGhhbiAwLjEgbWlsbGlzZWNvbmRzCi0gICAgICAgIGlmIChsYXN0RHVyYXRpb25UaWNrcyAmJiAoY3VyckR1cmF0aW9uVGlja3MgIT0gbGFzdER1cmF0aW9uVGlja3MpKSB7Ci0gICAgICAgICAgICBpbnQ2NF90IGRlbHRhVXMgPSAoKGxhc3REdXJhdGlvblRpY2tzIC0gY3VyckR1cmF0aW9uVGlja3MpICogMTAwMDAwMExMCi0gICAgICAgICAgICAgICAgICAgICsgKG1UaW1lU2NhbGUgLyAyKSkgLyBtVGltZVNjYWxlOwotICAgICAgICAgICAgaWYgKGRlbHRhVXMgPiAtMTAwICYmIGRlbHRhVXMgPCAxMDApIHsKLSAgICAgICAgICAgICAgICAvLyB1c2UgcHJldmlvdXMgdGlja3MsIGFuZCBhZGp1c3QgdGltZXN0YW1wIGFzIGlmIGl0IHdhcyBhY3R1YWxseSB0aGF0IG51bWJlcgotICAgICAgICAgICAgICAgIC8vIG9mIHRpY2tzCi0gICAgICAgICAgICAgICAgY3VyckR1cmF0aW9uVGlja3MgPSBsYXN0RHVyYXRpb25UaWNrczsKLSAgICAgICAgICAgICAgICB0aW1lc3RhbXBVcyArPSBkZWx0YVVzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1TdHN6VGFibGVFbnRyaWVzLT5hZGQoaHRvbmwoc2FtcGxlU2l6ZSkpOwotICAgICAgICBpZiAobVN0c3pUYWJsZUVudHJpZXMtPmNvdW50KCkgPiAyKSB7Ci0KLSAgICAgICAgICAgIC8vIEZvcmNlIHRoZSBmaXJzdCBzYW1wbGUgdG8gaGF2ZSBpdHMgb3duIHN0dHMgZW50cnkgc28gdGhhdAotICAgICAgICAgICAgLy8gd2UgY2FuIGFkanVzdCBpdHMgdmFsdWUgbGF0ZXIgdG8gbWFpbnRhaW4gdGhlIEEvViBzeW5jLgotICAgICAgICAgICAgaWYgKG1TdHN6VGFibGVFbnRyaWVzLT5jb3VudCgpID09IDMgfHwgY3VyckR1cmF0aW9uVGlja3MgIT0gbGFzdER1cmF0aW9uVGlja3MpIHsKLSAgICAgICAgICAgICAgICBhZGRPbmVTdHRzVGFibGVFbnRyeShzYW1wbGVDb3VudCwgbGFzdER1cmF0aW9uVGlja3MpOwotICAgICAgICAgICAgICAgIHNhbXBsZUNvdW50ID0gMTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgKytzYW1wbGVDb3VudDsKKyAgICAgICAgICAgIGlmIChtT3duZXItPmlzUmVhbFRpbWVSZWNvcmRpbmcoKSkgeworICAgICAgICAgICAgICAgIGlmIChtSXNBdWRpbykgeworICAgICAgICAgICAgICAgICAgICB1cGRhdGVEcmlmdFRpbWUobWV0YV9kYXRhKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgfQotICAgICAgICBpZiAobVNhbXBsZXNIYXZlU2FtZVNpemUpIHsKLSAgICAgICAgICAgIGlmIChtU3RzelRhYmxlRW50cmllcy0+Y291bnQoKSA+PSAyICYmIHByZXZpb3VzU2FtcGxlU2l6ZSAhPSBzYW1wbGVTaXplKSB7Ci0gICAgICAgICAgICAgICAgbVNhbXBsZXNIYXZlU2FtZVNpemUgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChXQVJOX1VOTEVTUyh0aW1lc3RhbXBVcyA+PSAwbGwsICJmb3IgJXMgdHJhY2siLCB0cmFja05hbWUpKSB7CisgICAgICAgICAgICAgICAgY29weS0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgICAgICAgICBtSXNNYWxmb3JtZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJldmlvdXNTYW1wbGVTaXplID0gc2FtcGxlU2l6ZTsKLSAgICAgICAgfQotICAgICAgICBBTE9HVigiJXMgdGltZXN0YW1wVXMvbGFzdFRpbWVzdGFtcFVzOiAlIiBQUklkNjQgIi8lIiBQUklkNjQsCi0gICAgICAgICAgICAgICAgdHJhY2tOYW1lLCB0aW1lc3RhbXBVcywgbGFzdFRpbWVzdGFtcFVzKTsKLSAgICAgICAgbGFzdER1cmF0aW9uVXMgPSB0aW1lc3RhbXBVcyAtIGxhc3RUaW1lc3RhbXBVczsKLSAgICAgICAgbGFzdER1cmF0aW9uVGlja3MgPSBjdXJyRHVyYXRpb25UaWNrczsKLSAgICAgICAgbGFzdFRpbWVzdGFtcFVzID0gdGltZXN0YW1wVXM7CiAKLSAgICAgICAgaWYgKGlzU3luYyAhPSAwKSB7Ci0gICAgICAgICAgICBhZGRPbmVTdHNzVGFibGVFbnRyeShtU3RzelRhYmxlRW50cmllcy0+Y291bnQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVRyYWNraW5nUHJvZ3Jlc3NTdGF0dXMpIHsKLSAgICAgICAgICAgIGlmIChtUHJldmlvdXNUcmFja1RpbWVVcyA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgbVByZXZpb3VzVHJhY2tUaW1lVXMgPSBtU3RhcnRUaW1lc3RhbXBVczsKKyAgICAgICAgICAgIEFMT0dWKCIlcyBtZWRpYSB0aW1lIHN0YW1wOiAlIiBQUklkNjQgIiBhbmQgcHJldmlvdXMgcGF1c2VkIGR1cmF0aW9uICUiIFBSSWQ2NCwKKyAgICAgICAgICAgICAgICAgICAgdHJhY2tOYW1lLCB0aW1lc3RhbXBVcywgcHJldmlvdXNQYXVzZWREdXJhdGlvblVzKTsKKyAgICAgICAgICAgIGlmICh0aW1lc3RhbXBVcyA+IG1UcmFja0R1cmF0aW9uVXMpIHsKKyAgICAgICAgICAgICAgICBtVHJhY2tEdXJhdGlvblVzID0gdGltZXN0YW1wVXM7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cmFja1Byb2dyZXNzU3RhdHVzKHRpbWVzdGFtcFVzKTsKKworICAgICAgICAgICAgLy8gV2UgbmVlZCB0byB1c2UgdGhlIHRpbWUgc2NhbGUgYmFzZWQgdGlja3MsIHJhdGhlciB0aGFuIHRoZQorICAgICAgICAgICAgLy8gdGltZXN0YW1wIGl0c2VsZiB0byBkZXRlcm1pbmUgd2hldGhlciB3ZSBoYXZlIHRvIHVzZSBhIG5ldworICAgICAgICAgICAgLy8gc3R0cyBlbnRyeSwgc2luY2Ugd2UgbWF5IGhhdmUgcm91bmRpbmcgZXJyb3JzLgorICAgICAgICAgICAgLy8gVGhlIGNhbGN1bGF0aW9uIGlzIGludGVuZGVkIHRvIHJlZHVjZSB0aGUgYWNjdW11bGF0ZWQKKyAgICAgICAgICAgIC8vIHJvdW5kaW5nIGVycm9ycy4KKyAgICAgICAgICAgIGN1cnJEdXJhdGlvblRpY2tzID0KKyAgICAgICAgICAgICAgICAoKHRpbWVzdGFtcFVzICogbVRpbWVTY2FsZSArIDUwMDAwMExMKSAvIDEwMDAwMDBMTCAtCisgICAgICAgICAgICAgICAgICAgIChsYXN0VGltZXN0YW1wVXMgKiBtVGltZVNjYWxlICsgNTAwMDAwTEwpIC8gMTAwMDAwMExMKTsKKyAgICAgICAgICAgIGlmIChjdXJyRHVyYXRpb25UaWNrcyA8IDBsbCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJkbyBub3Qgc3VwcG9ydCBvdXQgb2Ygb3JkZXIgZnJhbWVzICh0aW1lc3RhbXA6ICVsbGQgPCBsYXN0OiAlbGxkIGZvciAlcyB0cmFjayIsCisgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXRpbWVzdGFtcFVzLCAobG9uZyBsb25nKWxhc3RUaW1lc3RhbXBVcywgdHJhY2tOYW1lKTsKKyAgICAgICAgICAgICAgICBjb3B5LT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgbVNvdXJjZS0+c3RvcCgpOworICAgICAgICAgICAgICAgIG1Jc01hbGZvcm1lZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGlmIHRoZSBkdXJhdGlvbiBpcyBkaWZmZXJlbnQgZm9yIHRoaXMgc2FtcGxlLCBzZWUgaWYgaXQgaXMgY2xvc2UgZW5vdWdoIHRvIHRoZSBwcmV2aW91cworICAgICAgICAgICAgLy8gZHVyYXRpb24gdGhhdCB3ZSBjYW4gZnVkZ2UgaXQgYW5kIHVzZSB0aGUgc2FtZSB2YWx1ZSwgdG8gYXZvaWQgZmlsbGluZyB0aGUgc3R0cyB0YWJsZQorICAgICAgICAgICAgLy8gd2l0aCBsb3RzIG9mIG5lYXItaWRlbnRpY2FsIGVudHJpZXMuCisgICAgICAgICAgICAvLyAiY2xvc2UgZW5vdWdoIiBoZXJlIG1lYW5zIHRoYXQgdGhlIGN1cnJlbnQgZHVyYXRpb24gbmVlZHMgdG8gYmUgYWRqdXN0ZWQgYnkgbGVzcworICAgICAgICAgICAgLy8gdGhhbiAwLjEgbWlsbGlzZWNvbmRzCisgICAgICAgICAgICBpZiAobGFzdER1cmF0aW9uVGlja3MgJiYgKGN1cnJEdXJhdGlvblRpY2tzICE9IGxhc3REdXJhdGlvblRpY2tzKSkgeworICAgICAgICAgICAgICAgIGludDY0X3QgZGVsdGFVcyA9ICgobGFzdER1cmF0aW9uVGlja3MgLSBjdXJyRHVyYXRpb25UaWNrcykgKiAxMDAwMDAwTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICsgKG1UaW1lU2NhbGUgLyAyKSkgLyBtVGltZVNjYWxlOworICAgICAgICAgICAgICAgIGlmIChkZWx0YVVzID4gLTEwMCAmJiBkZWx0YVVzIDwgMTAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBwcmV2aW91cyB0aWNrcywgYW5kIGFkanVzdCB0aW1lc3RhbXAgYXMgaWYgaXQgd2FzIGFjdHVhbGx5IHRoYXQgbnVtYmVyCisgICAgICAgICAgICAgICAgICAgIC8vIG9mIHRpY2tzCisgICAgICAgICAgICAgICAgICAgIGN1cnJEdXJhdGlvblRpY2tzID0gbGFzdER1cmF0aW9uVGlja3M7CisgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcFVzICs9IGRlbHRhVXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbVN0c3pUYWJsZUVudHJpZXMtPmFkZChodG9ubChzYW1wbGVTaXplKSk7CisgICAgICAgICAgICBpZiAobVN0c3pUYWJsZUVudHJpZXMtPmNvdW50KCkgPiAyKSB7CisKKyAgICAgICAgICAgICAgICAvLyBGb3JjZSB0aGUgZmlyc3Qgc2FtcGxlIHRvIGhhdmUgaXRzIG93biBzdHRzIGVudHJ5IHNvIHRoYXQKKyAgICAgICAgICAgICAgICAvLyB3ZSBjYW4gYWRqdXN0IGl0cyB2YWx1ZSBsYXRlciB0byBtYWludGFpbiB0aGUgQS9WIHN5bmMuCisgICAgICAgICAgICAgICAgaWYgKG1TdHN6VGFibGVFbnRyaWVzLT5jb3VudCgpID09IDMgfHwgY3VyckR1cmF0aW9uVGlja3MgIT0gbGFzdER1cmF0aW9uVGlja3MpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkT25lU3R0c1RhYmxlRW50cnkoc2FtcGxlQ291bnQsIGxhc3REdXJhdGlvblRpY2tzKTsKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxlQ291bnQgPSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICsrc2FtcGxlQ291bnQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVNhbXBsZXNIYXZlU2FtZVNpemUpIHsKKyAgICAgICAgICAgICAgICBpZiAobVN0c3pUYWJsZUVudHJpZXMtPmNvdW50KCkgPj0gMiAmJiBwcmV2aW91c1NhbXBsZVNpemUgIT0gc2FtcGxlU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBtU2FtcGxlc0hhdmVTYW1lU2l6ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcmV2aW91c1NhbXBsZVNpemUgPSBzYW1wbGVTaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoIiVzIHRpbWVzdGFtcFVzL2xhc3RUaW1lc3RhbXBVczogJSIgUFJJZDY0ICIvJSIgUFJJZDY0LAorICAgICAgICAgICAgICAgICAgICB0cmFja05hbWUsIHRpbWVzdGFtcFVzLCBsYXN0VGltZXN0YW1wVXMpOworICAgICAgICAgICAgbGFzdER1cmF0aW9uVXMgPSB0aW1lc3RhbXBVcyAtIGxhc3RUaW1lc3RhbXBVczsKKyAgICAgICAgICAgIGxhc3REdXJhdGlvblRpY2tzID0gY3VyckR1cmF0aW9uVGlja3M7CisgICAgICAgICAgICBsYXN0VGltZXN0YW1wVXMgPSB0aW1lc3RhbXBVczsKKworICAgICAgICAgICAgaWYgKGlzU3luYyAhPSAwKSB7CisgICAgICAgICAgICAgICAgYWRkT25lU3Rzc1RhYmxlRW50cnkobVN0c3pUYWJsZUVudHJpZXMtPmNvdW50KCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobVRyYWNraW5nUHJvZ3Jlc3NTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICBpZiAobVByZXZpb3VzVHJhY2tUaW1lVXMgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICBtUHJldmlvdXNUcmFja1RpbWVVcyA9IG1TdGFydFRpbWVzdGFtcFVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cmFja1Byb2dyZXNzU3RhdHVzKHRpbWVzdGFtcFVzKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAoIWhhc011bHRpcGxlVHJhY2tzKSB7Ci0gICAgICAgICAgICBvZmY2NF90IG9mZnNldCA9IChtSXNBdmMgfHwgbUlzSGV2YykgPyBtT3duZXItPmFkZE11bHRpcGxlTGVuZ3RoUHJlZml4ZWRTYW1wbGVzX2woY29weSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbU93bmVyLT5hZGRTYW1wbGVfbChjb3B5KTsKKyAgICAgICAgICAgIHNpemVfdCBieXRlc1dyaXR0ZW47CisgICAgICAgICAgICBvZmY2NF90IG9mZnNldCA9IG1Pd25lci0+YWRkU2FtcGxlX2woY29weSwgdXNlUHJlZml4LCBpc0V4aWYsICZieXRlc1dyaXR0ZW4pOwogCi0gICAgICAgICAgICB1aW50MzJfdCBjb3VudCA9IChtT3duZXItPnVzZTMyQml0RmlsZU9mZnNldCgpCi0gICAgICAgICAgICAgICAgICAgICAgICA/IG1TdGNvVGFibGVFbnRyaWVzLT5jb3VudCgpCi0gICAgICAgICAgICAgICAgICAgICAgICA6IG1DbzY0VGFibGVFbnRyaWVzLT5jb3VudCgpKTsKKyAgICAgICAgICAgIGlmIChtSXNIZWljKSB7CisgICAgICAgICAgICAgICAgYWRkSXRlbU9mZnNldEFuZFNpemUob2Zmc2V0LCBieXRlc1dyaXR0ZW4sIGlzRXhpZik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvdW50ID0gKG1Pd25lci0+dXNlMzJCaXRGaWxlT2Zmc2V0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG1TdGNvVGFibGVFbnRyaWVzLT5jb3VudCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtQ282NFRhYmxlRW50cmllcy0+Y291bnQoKSk7CiAKLSAgICAgICAgICAgIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgYWRkQ2h1bmtPZmZzZXQob2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBpZiAoY291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBhZGRDaHVua09mZnNldChvZmZzZXQpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNvcHktPnJlbGVhc2UoKTsKICAgICAgICAgICAgIGNvcHkgPSBOVUxMOwpAQCAtMjk2Myw3ICszMjg3LDEwIEBACiAgICAgICAgIH0KIAogICAgICAgICBtQ2h1bmtTYW1wbGVzLnB1c2hfYmFjayhjb3B5KTsKLSAgICAgICAgaWYgKGludGVybGVhdmVEdXJhdGlvblVzID09IDApIHsKKyAgICAgICAgaWYgKG1Jc0hlaWMpIHsKKyAgICAgICAgICAgIGJ1ZmZlckNodW5rKDAgLyp0aW1lc3RhbXBVcyovKTsKKyAgICAgICAgICAgICsrbkNodW5rczsKKyAgICAgICAgfSBlbHNlIGlmIChpbnRlcmxlYXZlRHVyYXRpb25VcyA9PSAwKSB7CiAgICAgICAgICAgICBhZGRPbmVTdHNjVGFibGVFbnRyeSgrK25DaHVua3MsIDEpOwogICAgICAgICAgICAgYnVmZmVyQ2h1bmsodGltZXN0YW1wVXMpOwogICAgICAgICB9IGVsc2UgewpAQCAtMjk5Niw0MiArMzMyMyw0OSBAQAogCiAgICAgbU93bmVyLT50cmFja1Byb2dyZXNzU3RhdHVzKG1UcmFja0lkLCAtMSwgZXJyKTsKIAotICAgIC8vIExhc3QgY2h1bmsKLSAgICBpZiAoIWhhc011bHRpcGxlVHJhY2tzKSB7Ci0gICAgICAgIGFkZE9uZVN0c2NUYWJsZUVudHJ5KDEsIG1TdHN6VGFibGVFbnRyaWVzLT5jb3VudCgpKTsKLSAgICB9IGVsc2UgaWYgKCFtQ2h1bmtTYW1wbGVzLmVtcHR5KCkpIHsKLSAgICAgICAgYWRkT25lU3RzY1RhYmxlRW50cnkoKytuQ2h1bmtzLCBtQ2h1bmtTYW1wbGVzLnNpemUoKSk7Ci0gICAgICAgIGJ1ZmZlckNodW5rKHRpbWVzdGFtcFVzKTsKLSAgICB9Ci0KLSAgICAvLyBXZSBkb24ndCByZWFsbHkga25vdyBob3cgbG9uZyB0aGUgbGFzdCBmcmFtZSBsYXN0cywgc2luY2UKLSAgICAvLyB0aGVyZSBpcyBubyBmcmFtZSB0aW1lIGFmdGVyIGl0LCBqdXN0IHJlcGVhdCB0aGUgcHJldmlvdXMKLSAgICAvLyBmcmFtZSdzIGR1cmF0aW9uLgotICAgIGlmIChtU3RzelRhYmxlRW50cmllcy0+Y291bnQoKSA9PSAxKSB7Ci0gICAgICAgIGxhc3REdXJhdGlvblVzID0gMDsgIC8vIEEgc2luZ2xlIHNhbXBsZSdzIGR1cmF0aW9uCi0gICAgICAgIGxhc3REdXJhdGlvblRpY2tzID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgICArK3NhbXBsZUNvdW50OyAgLy8gQ291bnQgZm9yIHRoZSBsYXN0IHNhbXBsZQotICAgIH0KLQotICAgIGlmIChtU3RzelRhYmxlRW50cmllcy0+Y291bnQoKSA8PSAyKSB7Ci0gICAgICAgIGFkZE9uZVN0dHNUYWJsZUVudHJ5KDEsIGxhc3REdXJhdGlvblRpY2tzKTsKLSAgICAgICAgaWYgKHNhbXBsZUNvdW50IC0gMSA+IDApIHsKLSAgICAgICAgICAgIGFkZE9uZVN0dHNUYWJsZUVudHJ5KHNhbXBsZUNvdW50IC0gMSwgbGFzdER1cmF0aW9uVGlja3MpOworICAgIGlmIChtSXNIZWljKSB7CisgICAgICAgIGlmICghbUNodW5rU2FtcGxlcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBidWZmZXJDaHVuaygwKTsKKyAgICAgICAgICAgICsrbkNodW5rczsKICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIGFkZE9uZVN0dHNUYWJsZUVudHJ5KHNhbXBsZUNvdW50LCBsYXN0RHVyYXRpb25UaWNrcyk7Ci0gICAgfQotCi0gICAgLy8gVGhlIGxhc3QgY3R0cyBib3ggbWF5IG5vdCBoYXZlIGJlZW4gd3JpdHRlbiB5ZXQsIGFuZCB0aGlzCi0gICAgLy8gaXMgdG8gbWFrZSBzdXJlIHRoYXQgd2Ugd3JpdGUgb3V0IHRoZSBsYXN0IGN0dHMgYm94LgotICAgIGlmIChjdXJyQ3R0c09mZnNldFRpbWVUaWNrcyA9PSBsYXN0Q3R0c09mZnNldFRpbWVUaWNrcykgewotICAgICAgICBpZiAoY3R0c1NhbXBsZUNvdW50ID4gMCkgewotICAgICAgICAgICAgYWRkT25lQ3R0c1RhYmxlRW50cnkoY3R0c1NhbXBsZUNvdW50LCBsYXN0Q3R0c09mZnNldFRpbWVUaWNrcyk7CisgICAgICAgIC8vIExhc3QgY2h1bmsKKyAgICAgICAgaWYgKCFoYXNNdWx0aXBsZVRyYWNrcykgeworICAgICAgICAgICAgYWRkT25lU3RzY1RhYmxlRW50cnkoMSwgbVN0c3pUYWJsZUVudHJpZXMtPmNvdW50KCkpOworICAgICAgICB9IGVsc2UgaWYgKCFtQ2h1bmtTYW1wbGVzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGFkZE9uZVN0c2NUYWJsZUVudHJ5KCsrbkNodW5rcywgbUNodW5rU2FtcGxlcy5zaXplKCkpOworICAgICAgICAgICAgYnVmZmVyQ2h1bmsodGltZXN0YW1wVXMpOwogICAgICAgICB9Ci0gICAgfQogCi0gICAgbVRyYWNrRHVyYXRpb25VcyArPSBsYXN0RHVyYXRpb25VczsKKyAgICAgICAgLy8gV2UgZG9uJ3QgcmVhbGx5IGtub3cgaG93IGxvbmcgdGhlIGxhc3QgZnJhbWUgbGFzdHMsIHNpbmNlCisgICAgICAgIC8vIHRoZXJlIGlzIG5vIGZyYW1lIHRpbWUgYWZ0ZXIgaXQsIGp1c3QgcmVwZWF0IHRoZSBwcmV2aW91cworICAgICAgICAvLyBmcmFtZSdzIGR1cmF0aW9uLgorICAgICAgICBpZiAobVN0c3pUYWJsZUVudHJpZXMtPmNvdW50KCkgPT0gMSkgeworICAgICAgICAgICAgbGFzdER1cmF0aW9uVXMgPSAwOyAgLy8gQSBzaW5nbGUgc2FtcGxlJ3MgZHVyYXRpb24KKyAgICAgICAgICAgIGxhc3REdXJhdGlvblRpY2tzID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICsrc2FtcGxlQ291bnQ7ICAvLyBDb3VudCBmb3IgdGhlIGxhc3Qgc2FtcGxlCisgICAgICAgIH0KKworICAgICAgICBpZiAobVN0c3pUYWJsZUVudHJpZXMtPmNvdW50KCkgPD0gMikgeworICAgICAgICAgICAgYWRkT25lU3R0c1RhYmxlRW50cnkoMSwgbGFzdER1cmF0aW9uVGlja3MpOworICAgICAgICAgICAgaWYgKHNhbXBsZUNvdW50IC0gMSA+IDApIHsKKyAgICAgICAgICAgICAgICBhZGRPbmVTdHRzVGFibGVFbnRyeShzYW1wbGVDb3VudCAtIDEsIGxhc3REdXJhdGlvblRpY2tzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFkZE9uZVN0dHNUYWJsZUVudHJ5KHNhbXBsZUNvdW50LCBsYXN0RHVyYXRpb25UaWNrcyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGUgbGFzdCBjdHRzIGJveCBtYXkgbm90IGhhdmUgYmVlbiB3cml0dGVuIHlldCwgYW5kIHRoaXMKKyAgICAgICAgLy8gaXMgdG8gbWFrZSBzdXJlIHRoYXQgd2Ugd3JpdGUgb3V0IHRoZSBsYXN0IGN0dHMgYm94LgorICAgICAgICBpZiAoY3VyckN0dHNPZmZzZXRUaW1lVGlja3MgPT0gbGFzdEN0dHNPZmZzZXRUaW1lVGlja3MpIHsKKyAgICAgICAgICAgIGlmIChjdHRzU2FtcGxlQ291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgYWRkT25lQ3R0c1RhYmxlRW50cnkoY3R0c1NhbXBsZUNvdW50LCBsYXN0Q3R0c09mZnNldFRpbWVUaWNrcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtVHJhY2tEdXJhdGlvblVzICs9IGxhc3REdXJhdGlvblVzOworICAgIH0KICAgICBtUmVhY2hlZEVPUyA9IHRydWU7CiAKICAgICBzZW5kVHJhY2tTdW1tYXJ5KGhhc011bHRpcGxlVHJhY2tzKTsKQEAgLTMwNTMsNyArMzM4Nyw3IEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIGlmIChtU3RzelRhYmxlRW50cmllcy0+Y291bnQoKSA9PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHNhbXBsZXMgd3JpdHRlbgorICAgIGlmICghbUlzSGVpYyAmJiBtU3RzelRhYmxlRW50cmllcy0+Y291bnQoKSA9PSAwKSB7ICAvLyBubyBzYW1wbGVzIHdyaXR0ZW4KICAgICAgICAgQUxPR0UoIlRoZSBudW1iZXIgb2YgcmVjb3JkZWQgc2FtcGxlcyBpcyAwIik7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KQEAgLTMxOTksMTMgKzM1MzMsNTkgQEAKICAgICByZXR1cm4gbUVzdGltYXRlZFRyYWNrU2l6ZUJ5dGVzOwogfQogCitpbnQzMl90IE1QRUc0V3JpdGVyOjpUcmFjazo6Z2V0TWV0YVNpemVJbmNyZWFzZSgKKyAgICAgICAgaW50MzJfdCBhbmdsZSwgaW50MzJfdCB0cmFja0NvdW50KSBjb25zdCB7CisgICAgQ0hFQ0sobUlzSGVpYyk7CisKKyAgICBpbnQzMl90IGdyaWQgPSAobVRpbGVXaWR0aCA+IDApOworICAgIGludDMyX3Qgcm90YXRlID0gKGFuZ2xlID4gMCk7CisKKyAgICAvLyBOb3RlIHRoYXQgdGhlIHJvdGF0aW9uIGFuZ2xlIGlzIGluIHRoZSBmaWxlIG1ldGEsIGFuZCB3ZSBkb24ndCBoYXZlCisgICAgLy8gaXQgdW50aWwgc3RhcnQsIHNvIGhlcmUgdGhlIGNhbGN1bGF0aW9uIGhhcyB0byBhc3N1bWUgcm90YXRpb24uCisKKyAgICAvLyBpbmNyZWFzZSB0byBpcGNvCisgICAgaW50MzJfdCBpbmNyZWFzZSA9IDIwICogKGdyaWQgKyAxKSAgICAgICAgICAgICAgLy8gJ2lzcGUnIHByb3BlcnR5CisgICAgICAgICAgICAgICAgICAgICArICg4ICsgbUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSkgLy8gJ2h2Y0MnIHByb3BlcnR5CisgICAgICAgICAgICAgICAgICAgICA7CisKKyAgICBpZiAocm90YXRlKSB7CisgICAgICAgIGluY3JlYXNlICs9IDk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gJ2lyb3QnIHByb3BlcnR5ICh3b3JzdCBjYXNlKQorICAgIH0KKworICAgIC8vIGluY3JlYXNlIHRvIGlyZWYgYW5kIGlkYXQKKyAgICBpZiAoZ3JpZCkgeworICAgICAgICBpbmNyZWFzZSArPSAoMTIgKyBtTnVtVGlsZXMgKiAyKSAgICAgICAgICAgIC8vICdkaW1nJyBpbiBpcmVmCisgICAgICAgICAgICAgICAgICArIDEyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW1hZ2VHcmlkIGluICdpZGF0JyAod29yc3QgY2FzZSkKKyAgICB9CisKKyAgICBpbmNyZWFzZSArPSAoMTIgKyAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAnY2RzYycgaW4gaXJlZgorCisgICAgLy8gaW5jcmVhc2UgdG8gaWxvYywgaWluZgorICAgIGluY3JlYXNlICs9ICgxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluY3JlYXNlIHRvICdpbG9jJworICAgICAgICAgICAgICArIDIxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluY3JlYXNlIHRvICdpaW5mJworICAgICAgICAgICAgICAqIChtTnVtVGlsZXMgKyBncmlkICsgMSk7ICAgICAgICAgICAgIC8vICIrMSIgaXMgZm9yICdFeGlmJworCisgICAgLy8gV2hlbiB0b3RhbCAjIG9mIHByb3BlcnRpZXMgaXMgPiAxMjcsIHRoZSBwcm9wZXJ0aWVzIGlkIGJlY29tZXMgMi1ieXRlLgorICAgIC8vIFdlIHdyaXRlIDQgcHJvcGVydGllcyBhdCBtb3N0IGZvciBlYWNoIGltYWdlICgyeCdpc3BlJywgMXgnaHZjQycsIDF4J2lyb3QnKS4KKyAgICAvLyBTZXQgdGhlIHRocmVzaG9sZCB0byBiZSAzMC4KKyAgICBpbnQzMl90IHByb3BCeXRlcyA9IHRyYWNrQ291bnQgPiAzMCA/IDIgOiAxOworCisgICAgLy8gaW5jcmVhc2UgdG8gaXBtYQorICAgIGluY3JlYXNlICs9ICgzICsgMiAqIHByb3BCeXRlcykgKiBtTnVtVGlsZXMgICAgIC8vICdpc3BlJyArICdodmNDJworICAgICAgICAgICAgICsgZ3JpZCAqICgzICsgcHJvcEJ5dGVzKSAgICAgICAgICAgICAgIC8vICdpc3BlJyBmb3IgZ3JpZAorICAgICAgICAgICAgICsgcm90YXRlICogcHJvcEJ5dGVzOyAgICAgICAgICAgICAgICAgIC8vICdpcm90JyAoZWl0aGVyIG9uIGdyaWQgb3IgdGlsZSkKKworICAgIHJldHVybiBpbmNyZWFzZTsKK30KKwogc3RhdHVzX3QgTVBFRzRXcml0ZXI6OlRyYWNrOjpjaGVja0NvZGVjU3BlY2lmaWNEYXRhKCkgY29uc3QgewogICAgIGNvbnN0IGNoYXIgKm1pbWU7CiAgICAgQ0hFQ0sobU1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKICAgICBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDLCBtaW1lKSB8fAogICAgICAgICAhc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgbWltZSkgfHwKICAgICAgICAgIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCBtaW1lKSB8fAotICAgICAgICAhc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDLCBtaW1lKSkgeworICAgICAgICAhc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDLCBtaW1lKSB8fAorICAgICAgICAhc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMsIG1pbWUpKSB7CiAgICAgICAgIGlmICghbUNvZGVjU3BlY2lmaWNEYXRhIHx8CiAgICAgICAgICAgICBtQ29kZWNTcGVjaWZpY0RhdGFTaXplIDw9IDApIHsKICAgICAgICAgICAgIEFMT0dFKCJNaXNzaW5nIGNvZGVjIHNwZWNpZmljIGRhdGEiKTsKQEAgLTMyMjIsNyArMzYwMiwxMCBAQAogfQogCiBjb25zdCBjaGFyICpNUEVHNFdyaXRlcjo6VHJhY2s6OmdldFRyYWNrVHlwZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbUlzQXVkaW8gPyAiQXVkaW8iIDogKG1Jc1ZpZGVvID8gIlZpZGVvIiA6ICJNZXRhZGF0YSIpOworICAgIHJldHVybiBtSXNBdWRpbyA/ICJBdWRpbyIgOgorICAgICAgICAgICBtSXNWaWRlbyA/ICJWaWRlbyIgOgorICAgICAgICAgICBtSXNIZWljICA/ICJJbWFnZSIgOgorICAgICAgICAgICAgICAgICAgICAgICJNZXRhZGF0YSI7CiB9CiAKIHZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjp3cml0ZVRyYWNrSGVhZGVyKGJvb2wgdXNlMzJCaXRPZmZzZXQpIHsKQEAgLTM3OTIsMTEgKzQxNzUsMTEgQEAKICAgICBlbmRCb3goKTsKIH0KIAotdm9pZCBNUEVHNFdyaXRlcjo6d3JpdGVIZGxyKCkgewordm9pZCBNUEVHNFdyaXRlcjo6d3JpdGVIZGxyKGNvbnN0IGNoYXIgKmhhbmRsZXJUeXBlKSB7CiAgICAgYmVnaW5Cb3goImhkbHIiKTsKICAgICB3cml0ZUludDMyKDApOyAvLyBWZXJzaW9uLCBGbGFncwogICAgIHdyaXRlSW50MzIoMCk7IC8vIFByZWRlZmluZWQKLSAgICB3cml0ZUZvdXJjYygibWR0YSIpOworICAgIHdyaXRlRm91cmNjKGhhbmRsZXJUeXBlKTsKICAgICB3cml0ZUludDMyKDApOyAvLyBSZXNlcnZlZFswXQogICAgIHdyaXRlSW50MzIoMCk7IC8vIFJlc2VydmVkWzFdCiAgICAgd3JpdGVJbnQzMigwKTsgLy8gUmVzZXJ2ZWRbMl0KQEAgLTM4NzYsMTkgKzQyNTksMzM0IEBACiAgICAgZW5kQm94KCk7IC8vIGlsc3QKIH0KIAotdm9pZCBNUEVHNFdyaXRlcjo6d3JpdGVNZXRhQm94KCkgewordm9pZCBNUEVHNFdyaXRlcjo6d3JpdGVNb292TGV2ZWxNZXRhQm94KCkgewogICAgIHNpemVfdCBjb3VudCA9IG1NZXRhS2V5cy0+Y291bnRFbnRyaWVzKCk7CiAgICAgaWYgKGNvdW50ID09IDApIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIGJlZ2luQm94KCJtZXRhIik7Ci0gICAgd3JpdGVIZGxyKCk7CisgICAgd3JpdGVIZGxyKCJtZHRhIik7CiAgICAgd3JpdGVLZXlzKCk7CiAgICAgd3JpdGVJbHN0KCk7CiAgICAgZW5kQm94KCk7CiB9CiAKK3ZvaWQgTVBFRzRXcml0ZXI6OndyaXRlSWxvY0JveCgpIHsKKyAgICBiZWdpbkJveCgiaWxvYyIpOworICAgIC8vIFVzZSB2ZXJzaW9uIDEgdG8gYWxsb3cgY29uc3RydWN0aW9uIG1ldGhvZCAxIHRoYXQgcmVmZXJzIHRvCisgICAgLy8gZGF0YSBpbiBpZGF0IGJveCBpbnNpZGUgbWV0YSBib3guCisgICAgd3JpdGVJbnQzMigweDAxMDAwMDAwKTsgLy8gVmVyc2lvbiA9IDEsIEZsYWdzID0gMAorICAgIHdyaXRlSW50MTYoMHg0NDAwKTsgICAgIC8vIG9mZnNldF9zaXplID0gbGVuZ3RoX3NpemUgPSA0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFzZV9vZmZzZXRfc2l6ZSA9IGluZGV4X3NpemUgPSAwCisKKyAgICAvLyAxNi1iaXQgaXRlbV9jb3VudAorICAgIHNpemVfdCBpdGVtQ291bnQgPSBtSXRlbXMuc2l6ZSgpOworICAgIGlmIChpdGVtQ291bnQgPiA2NTUzNSkgeworICAgICAgICBBTE9HVygiRHJvcHBpbmcgZXhjZXNzIGl0ZW1zOiBpdGVtQ291bnQgJXp1IiwgaXRlbUNvdW50KTsKKyAgICAgICAgaXRlbUNvdW50ID0gNjU1MzU7CisgICAgfQorICAgIHdyaXRlSW50MTYoKHVpbnQxNl90KWl0ZW1Db3VudCk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGl0ZW1Db3VudDsgaSsrKSB7CisgICAgICAgIHdyaXRlSW50MTYobUl0ZW1zW2ldLml0ZW1JZCk7CisgICAgICAgIGJvb2wgaXNHcmlkID0gbUl0ZW1zW2ldLmlzR3JpZCgpOworCisgICAgICAgIHdyaXRlSW50MTYoaXNHcmlkID8gMSA6IDApOyAvLyBjb25zdHJ1Y3Rpb25fbWV0aG9kCisgICAgICAgIHdyaXRlSW50MTYoMCk7IC8vIGRhdGFfcmVmZXJlbmNlX2luZGV4ID0gMAorICAgICAgICB3cml0ZUludDE2KDEpOyAvLyBleHRlbnRfY291bnQgPSAxCisKKyAgICAgICAgaWYgKGlzR3JpZCkgeworICAgICAgICAgICAgLy8gb2Zmc2V0IGludG8gdGhlICdpZGF0JyBib3gKKyAgICAgICAgICAgIHdyaXRlSW50MzIobU51bUdyaWRzKysgKiA4KTsKKyAgICAgICAgICAgIHdyaXRlSW50MzIoOCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3cml0ZUludDMyKG1JdGVtc1tpXS5vZmZzZXQpOworICAgICAgICAgICAgd3JpdGVJbnQzMihtSXRlbXNbaV0uc2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZW5kQm94KCk7Cit9CisKK3ZvaWQgTVBFRzRXcml0ZXI6OndyaXRlSW5mZUJveCgKKyAgICAgICAgdWludDE2X3QgaXRlbUlkLCBjb25zdCBjaGFyICppdGVtVHlwZSwgdWludDMyX3QgZmxhZ3MpIHsKKyAgICBiZWdpbkJveCgiaW5mZSIpOworICAgIHdyaXRlSW50MzIoMHgwMjAwMDAwMCB8IGZsYWdzKTsgLy8gVmVyc2lvbiA9IDIsIEZsYWdzID0gMAorICAgIHdyaXRlSW50MTYoaXRlbUlkKTsKKyAgICB3cml0ZUludDE2KDApOyAgICAgICAgICAvL2l0ZW1fcHJvdGVjdGlvbl9pbmRleCA9IDAKKyAgICB3cml0ZUZvdXJjYyhpdGVtVHlwZSk7CisgICAgd3JpdGVDU3RyaW5nKCIiKTsgICAgICAgLy8gaXRlbV9uYW1lCisgICAgZW5kQm94KCk7Cit9CisKK3ZvaWQgTVBFRzRXcml0ZXI6OndyaXRlSWluZkJveCgpIHsKKyAgICBiZWdpbkJveCgiaWluZiIpOworICAgIHdyaXRlSW50MzIoMCk7ICAgICAgICAgIC8vIFZlcnNpb24gPSAwLCBGbGFncyA9IDAKKworICAgIC8vIDE2LWJpdCBpdGVtX2NvdW50CisgICAgc2l6ZV90IGl0ZW1Db3VudCA9IG1JdGVtcy5zaXplKCk7CisgICAgaWYgKGl0ZW1Db3VudCA+IDY1NTM1KSB7CisgICAgICAgIEFMT0dXKCJEcm9wcGluZyBleGNlc3MgaXRlbXM6IGl0ZW1Db3VudCAlenUiLCBpdGVtQ291bnQpOworICAgICAgICBpdGVtQ291bnQgPSA2NTUzNTsKKyAgICB9CisKKyAgICB3cml0ZUludDE2KCh1aW50MTZfdClpdGVtQ291bnQpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaXRlbUNvdW50OyBpKyspIHsKKyAgICAgICAgd3JpdGVJbmZlQm94KG1JdGVtc1tpXS5pdGVtSWQsIG1JdGVtc1tpXS5pdGVtVHlwZSwKKyAgICAgICAgICAgICAgICAobUl0ZW1zW2ldLmlzSW1hZ2UoKSAmJiBtSXRlbXNbaV0uaXNIaWRkZW4pID8gMSA6IDApOworICAgIH0KKworICAgIGVuZEJveCgpOworfQorCit2b2lkIE1QRUc0V3JpdGVyOjp3cml0ZUlkYXRCb3goKSB7CisgICAgYmVnaW5Cb3goImlkYXQiKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUl0ZW1zLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtSXRlbXNbaV0uaXNHcmlkKCkpIHsKKyAgICAgICAgICAgIHdyaXRlSW50OCgwKTsgLy8gdmVyc2lvbgorICAgICAgICAgICAgLy8gZmxhZ3MgPT0gMSBtZWFucyAzMi1iaXQgd2lkdGgsaGVpZ2h0CisgICAgICAgICAgICBpbnQ4X3QgZmxhZ3MgPSAobUl0ZW1zW2ldLndpZHRoID4gNjU1MzUgfHwgbUl0ZW1zW2ldLmhlaWdodCA+IDY1NTM1KTsKKyAgICAgICAgICAgIHdyaXRlSW50OChmbGFncyk7CisgICAgICAgICAgICB3cml0ZUludDgobUl0ZW1zW2ldLnJvd3MgLSAxKTsKKyAgICAgICAgICAgIHdyaXRlSW50OChtSXRlbXNbaV0uY29scyAtIDEpOworICAgICAgICAgICAgaWYgKGZsYWdzKSB7CisgICAgICAgICAgICAgICAgd3JpdGVJbnQzMihtSXRlbXNbaV0ud2lkdGgpOworICAgICAgICAgICAgICAgIHdyaXRlSW50MzIobUl0ZW1zW2ldLmhlaWdodCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHdyaXRlSW50MTYoKHVpbnQxNl90KW1JdGVtc1tpXS53aWR0aCk7CisgICAgICAgICAgICAgICAgd3JpdGVJbnQxNigodWludDE2X3QpbUl0ZW1zW2ldLmhlaWdodCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlbmRCb3goKTsKK30KKwordm9pZCBNUEVHNFdyaXRlcjo6d3JpdGVJcmVmQm94KCkgeworICAgIGJlZ2luQm94KCJpcmVmIik7CisgICAgd3JpdGVJbnQzMigwKTsgICAgICAgICAgLy8gVmVyc2lvbiA9IDAsIEZsYWdzID0gMAorICAgIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSXRlbXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IHIgPSAwOyByIDwgbUl0ZW1zW2ldLnJlZnNMaXN0LnNpemUoKTsgcisrKSB7CisgICAgICAgICAgICAgICAgY29uc3QgSXRlbVJlZnMgJnJlZnMgPSBtSXRlbXNbaV0ucmVmc0xpc3Rbcl07CisgICAgICAgICAgICAgICAgYmVnaW5Cb3gocmVmcy5rZXkpOworICAgICAgICAgICAgICAgIHdyaXRlSW50MTYobUl0ZW1zW2ldLml0ZW1JZCk7CisgICAgICAgICAgICAgICAgc2l6ZV90IHJlZkNvdW50ID0gcmVmcy52YWx1ZS5zaXplKCk7CisgICAgICAgICAgICAgICAgaWYgKHJlZkNvdW50ID4gNjU1MzUpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coInRvbyBtYW55IGVudHJpZXMgaW4gJXMiLCByZWZzLmtleSk7CisgICAgICAgICAgICAgICAgICAgIHJlZkNvdW50ID0gNjU1MzU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdyaXRlSW50MTYoKHVpbnQxNl90KXJlZkNvdW50KTsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCByZWZJbmRleCA9IDA7IHJlZkluZGV4IDwgcmVmQ291bnQ7IHJlZkluZGV4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVJbnQxNihyZWZzLnZhbHVlW3JlZkluZGV4XSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVuZEJveCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVuZEJveCgpOworfQorCit2b2lkIE1QRUc0V3JpdGVyOjp3cml0ZVBpdG1Cb3goKSB7CisgICAgYmVnaW5Cb3goInBpdG0iKTsKKyAgICB3cml0ZUludDMyKDApOyAgICAgICAgICAvLyBWZXJzaW9uID0gMCwgRmxhZ3MgPSAwCisgICAgd3JpdGVJbnQxNihtUHJpbWFyeUl0ZW1JZCk7CisgICAgZW5kQm94KCk7Cit9CisKK3ZvaWQgTVBFRzRXcml0ZXI6OndyaXRlSXBjb0JveCgpIHsKKyAgICBiZWdpbkJveCgiaXBjbyIpOworICAgIHNpemVfdCBudW1Qcm9wZXJ0aWVzID0gbVByb3BlcnRpZXMuc2l6ZSgpOworICAgIGlmIChudW1Qcm9wZXJ0aWVzID4gMzI3NjcpIHsKKyAgICAgICAgQUxPR1coIkRyb3BwaW5nIGV4Y2VzcyBwcm9wZXJ0aWVzOiBudW1Qcm9wZXJ0aWVzICV6dSIsIG51bVByb3BlcnRpZXMpOworICAgICAgICBudW1Qcm9wZXJ0aWVzID0gMzI3Njc7CisgICAgfQorICAgIGZvciAoc2l6ZV90IHByb3BJbmRleCA9IDA7IHByb3BJbmRleCA8IG51bVByb3BlcnRpZXM7IHByb3BJbmRleCsrKSB7CisgICAgICAgIHN3aXRjaCAobVByb3BlcnRpZXNbcHJvcEluZGV4XS50eXBlKSB7CisgICAgICAgICAgICBjYXNlIEZPVVJDQygnaCcsICd2JywgJ2MnLCAnQycpOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJlZ2luQm94KCJodmNDIik7CisgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gaHZjYyA9IG1Qcm9wZXJ0aWVzW3Byb3BJbmRleF0uaHZjYzsKKyAgICAgICAgICAgICAgICAvLyBQYXRjaCBhdmNjJ3MgbGVuZ3RoU2l6ZSBmaWVsZCB0byBtYXRjaCB0aGUgbnVtYmVyCisgICAgICAgICAgICAgICAgLy8gb2YgYnl0ZXMgd2UgdXNlIHRvIGluZGljYXRlIHRoZSBzaXplIG9mIGEgbmFsIHVuaXQuCisgICAgICAgICAgICAgICAgdWludDhfdCAqcHRyID0gKHVpbnQ4X3QgKilodmNjLT5kYXRhKCk7CisgICAgICAgICAgICAgICAgcHRyWzIxXSA9IChwdHJbMjFdICYgMHhmYykgfCAodXNlTmFsTGVuZ3RoRm91cigpID8gMyA6IDEpOworICAgICAgICAgICAgICAgIHdyaXRlKGh2Y2MtPmRhdGEoKSwgaHZjYy0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBlbmRCb3goKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgRk9VUkNDKCdpJywgJ3MnLCAncCcsICdlJyk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmVnaW5Cb3goImlzcGUiKTsKKyAgICAgICAgICAgICAgICB3cml0ZUludDMyKDApOyAvLyBWZXJzaW9uID0gMCwgRmxhZ3MgPSAwCisgICAgICAgICAgICAgICAgd3JpdGVJbnQzMihtUHJvcGVydGllc1twcm9wSW5kZXhdLndpZHRoKTsKKyAgICAgICAgICAgICAgICB3cml0ZUludDMyKG1Qcm9wZXJ0aWVzW3Byb3BJbmRleF0uaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBlbmRCb3goKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgRk9VUkNDKCdpJywgJ3InLCAnbycsICd0Jyk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmVnaW5Cb3goImlyb3QiKTsKKyAgICAgICAgICAgICAgICB3cml0ZUludDgobVByb3BlcnRpZXNbcHJvcEluZGV4XS5yb3RhdGlvbik7CisgICAgICAgICAgICAgICAgZW5kQm94KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dXKCJTa2lwcGluZyB1bnJlY29nbml6ZWQgcHJvcGVydHk6IHR5cGUgMHglMDh4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Qcm9wZXJ0aWVzW3Byb3BJbmRleF0udHlwZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZW5kQm94KCk7Cit9CisKK3ZvaWQgTVBFRzRXcml0ZXI6OndyaXRlSXBtYUJveCgpIHsKKyAgICBiZWdpbkJveCgiaXBtYSIpOworICAgIHVpbnQzMl90IGZsYWdzID0gKG1Qcm9wZXJ0aWVzLnNpemUoKSA+IDEyNykgPyAxIDogMDsKKyAgICB3cml0ZUludDMyKGZsYWdzKTsgLy8gVmVyc2lvbiA9IDAKKworICAgIHdyaXRlSW50MzIobUFzc29jaWF0aW9uRW50cnlDb3VudCk7CisgICAgZm9yIChzaXplX3QgaXRlbUluZGV4ID0gMDsgaXRlbUluZGV4IDwgbUl0ZW1zLnNpemUoKTsgaXRlbUluZGV4KyspIHsKKyAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQxNl90PiAmcHJvcGVydGllcyA9IG1JdGVtc1tpdGVtSW5kZXhdLnByb3BlcnRpZXM7CisgICAgICAgIGlmIChwcm9wZXJ0aWVzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHdyaXRlSW50MTYobUl0ZW1zW2l0ZW1JbmRleF0uaXRlbUlkKTsKKworICAgICAgICBzaXplX3QgZW50cnlDb3VudCA9IHByb3BlcnRpZXMuc2l6ZSgpOworICAgICAgICBpZiAoZW50cnlDb3VudCA+IDI1NSkgeworICAgICAgICAgICAgQUxPR1coIkRyb3BwaW5nIGV4Y2VzcyBhc3NvY2lhdGlvbnM6IGVudHJ5Q291bnQgJXp1IiwgZW50cnlDb3VudCk7CisgICAgICAgICAgICBlbnRyeUNvdW50ID0gMjU1OworICAgICAgICB9CisgICAgICAgIHdyaXRlSW50OCgodWludDhfdCllbnRyeUNvdW50KTsKKyAgICAgICAgZm9yIChzaXplX3QgcHJvcEluZGV4ID0gMDsgcHJvcEluZGV4IDwgZW50cnlDb3VudDsgcHJvcEluZGV4KyspIHsKKyAgICAgICAgICAgIGlmIChmbGFncyAmIDEpIHsKKyAgICAgICAgICAgICAgICB3cml0ZUludDE2KCgxIDw8IDE1KSB8IHByb3BlcnRpZXNbcHJvcEluZGV4XSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHdyaXRlSW50OCgoMSA8PCA3KSB8IHByb3BlcnRpZXNbcHJvcEluZGV4XSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZW5kQm94KCk7Cit9CisKK3ZvaWQgTVBFRzRXcml0ZXI6OndyaXRlSXBycEJveCgpIHsKKyAgICBiZWdpbkJveCgiaXBycCIpOworICAgIHdyaXRlSXBjb0JveCgpOworICAgIHdyaXRlSXBtYUJveCgpOworICAgIGVuZEJveCgpOworfQorCit2b2lkIE1QRUc0V3JpdGVyOjp3cml0ZUZpbGVMZXZlbE1ldGFCb3goKSB7CisgICAgLy8gcGF0Y2ggdXAgdGhlIG1QcmltYXJ5SXRlbUlkIGFuZCBjb3VudCBpdGVtcyB3aXRoIHByb3AgYXNzb2NpYXRpb25zCisgICAgdWludDE2X3QgZmlyc3RWaXNpYmxlSXRlbUlkID0gMDsKKyAgICB1aW50MTZfdCBmaXJzdEltYWdlSXRlbUlkID0gMDsKKyAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgbUl0ZW1zLnNpemUoKTsgaW5kZXgrKykgeworICAgICAgICBpZiAoIW1JdGVtc1tpbmRleF0uaXNJbWFnZSgpKSBjb250aW51ZTsKKworICAgICAgICBpZiAobUl0ZW1zW2luZGV4XS5pc1ByaW1hcnkpIHsKKyAgICAgICAgICAgIG1QcmltYXJ5SXRlbUlkID0gbUl0ZW1zW2luZGV4XS5pdGVtSWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmaXJzdEltYWdlSXRlbUlkKSB7CisgICAgICAgICAgICBmaXJzdEltYWdlSXRlbUlkID0gbUl0ZW1zW2luZGV4XS5pdGVtSWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmaXJzdFZpc2libGVJdGVtSWQgJiYgIW1JdGVtc1tpbmRleF0uaXNIaWRkZW4pIHsKKyAgICAgICAgICAgIGZpcnN0VmlzaWJsZUl0ZW1JZCA9IG1JdGVtc1tpbmRleF0uaXRlbUlkOworICAgICAgICB9CisgICAgICAgIGlmICghbUl0ZW1zW2luZGV4XS5wcm9wZXJ0aWVzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIG1Bc3NvY2lhdGlvbkVudHJ5Q291bnQrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghZmlyc3RJbWFnZUl0ZW1JZCkgeworICAgICAgICBBTE9HRSgibm8gdmFsaWQgaW1hZ2Ugd2FzIGZvdW5kIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobVByaW1hcnlJdGVtSWQgPT0gMCkgeworICAgICAgICBpZiAoZmlyc3RWaXNpYmxlSXRlbUlkID4gMCkgeworICAgICAgICAgICAgQUxPR1coImRpZG4ndCBmaW5kIHByaW1hcnksIHVzaW5nIGZpcnN0IHZpc2libGUgaW1hZ2UiKTsKKyAgICAgICAgICAgIG1QcmltYXJ5SXRlbUlkID0gZmlyc3RWaXNpYmxlSXRlbUlkOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coIm5vIHByaW1hcnkgYW5kIG5vIHZpc2libGUgaXRlbSwgdXNpbmcgZmlyc3QgaW1hZ2UiKTsKKyAgICAgICAgICAgIG1QcmltYXJ5SXRlbUlkID0gZmlyc3RJbWFnZUl0ZW1JZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoTGlzdDxUcmFjayAqPjo6aXRlcmF0b3IgaXQgPSBtVHJhY2tzLmJlZ2luKCk7CisgICAgICAgIGl0ICE9IG1UcmFja3MuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgaWYgKCgqaXQpLT5pc0hlaWMoKSkgeworICAgICAgICAgICAgKCppdCktPmZsdXNoSXRlbVJlZnMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJlZ2luQm94KCJtZXRhIik7CisgICAgd3JpdGVJbnQzMigwKTsgLy8gVmVyc2lvbiA9IDAsIEZsYWdzID0gMAorICAgIHdyaXRlSGRscigicGljdCIpOworICAgIHdyaXRlSWxvY0JveCgpOworICAgIHdyaXRlSWluZkJveCgpOworICAgIHdyaXRlUGl0bUJveCgpOworICAgIHdyaXRlSXBycEJveCgpOworICAgIGlmIChtTnVtR3JpZHMgPiAwKSB7CisgICAgICAgIHdyaXRlSWRhdEJveCgpOworICAgIH0KKyAgICBpZiAobUhhc1JlZnMpIHsKKyAgICAgICAgd3JpdGVJcmVmQm94KCk7CisgICAgfQorICAgIGVuZEJveCgpOworfQorCit1aW50MTZfdCBNUEVHNFdyaXRlcjo6YWRkUHJvcGVydHlfbChjb25zdCBJdGVtUHJvcGVydHkgJnByb3ApIHsKKyAgICBjaGFyIHR5cGVTdHJbNV07CisgICAgTWFrZUZvdXJDQ1N0cmluZyhwcm9wLnR5cGUsIHR5cGVTdHIpOworICAgIEFMT0dWKCJhZGRQcm9wZXJ0eV9sOiAlcyIsIHR5cGVTdHIpOworCisgICAgbVByb3BlcnRpZXMucHVzaF9iYWNrKHByb3ApOworCisgICAgLy8gcmV0dXJuaW5nIDEtYmFzZWQgcHJvcGVydHkgaW5kZXgKKyAgICByZXR1cm4gbVByb3BlcnRpZXMuc2l6ZSgpOworfQorCit1aW50MTZfdCBNUEVHNFdyaXRlcjo6YWRkSXRlbV9sKGNvbnN0IEl0ZW1JbmZvICZpbmZvKSB7CisgICAgQUxPR1YoImFkZEl0ZW1fbDogdHlwZSAlcywgb2Zmc2V0ICV1LCBzaXplICV1IiwKKyAgICAgICAgICAgIGluZm8uaXRlbVR5cGUsIGluZm8ub2Zmc2V0LCBpbmZvLnNpemUpOworCisgICAgc2l6ZV90IGluZGV4ID0gbUl0ZW1zLnNpemUoKTsKKyAgICBtSXRlbXMucHVzaF9iYWNrKGluZm8pOworCisgICAgLy8gbWFrZSB0aGUgaXRlbSBpZCBzdGFydCBhdCBrSXRlbUlkQmFzZQorICAgIG1JdGVtcy5lZGl0SXRlbUF0KGluZGV4KS5pdGVtSWQgPSBpbmRleCArIGtJdGVtSWRCYXNlOworCisjaWYgKExPR19OREVCVUc9PTApCisgICAgaWYgKCFpbmZvLnByb3BlcnRpZXMuZW1wdHkoKSkgeworICAgICAgICBBU3RyaW5nIHN0cjsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmZvLnByb3BlcnRpZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpID4gMCkgeworICAgICAgICAgICAgICAgIHN0ci5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHIuYXBwZW5kKGluZm8ucHJvcGVydGllc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoImFkZEl0ZW1fbDogaWQgJWQsIHByb3BlcnRpZXM6ICVzIiwgbUl0ZW1zW2luZGV4XS5pdGVtSWQsIHN0ci5jX3N0cigpKTsKKyAgICB9CisjZW5kaWYgLy8gKExPR19OREVCVUc9PTApCisKKyAgICByZXR1cm4gbUl0ZW1zW2luZGV4XS5pdGVtSWQ7Cit9CisKK3ZvaWQgTVBFRzRXcml0ZXI6OmFkZFJlZnNfbCh1aW50MTZfdCBpdGVtSWQsIGNvbnN0IEl0ZW1SZWZzICZyZWZzKSB7CisgICAgaWYgKHJlZnMudmFsdWUuZW1wdHkoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChpdGVtSWQgPCBrSXRlbUlkQmFzZSkgeworICAgICAgICBBTE9HVygiaXRlbUlkIHNob3VsZG4ndCBiZSBzbWFsbGVyIHRoYW4ga0l0ZW1JZEJhc2UiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNpemVfdCBpbmRleCA9IGl0ZW1JZCAtIGtJdGVtSWRCYXNlOworICAgIG1JdGVtcy5lZGl0SXRlbUF0KGluZGV4KS5yZWZzTGlzdC5wdXNoX2JhY2socmVmcyk7CisgICAgbUhhc1JlZnMgPSB0cnVlOworfQorCiAvKgogICogR2VvZGF0YSBpcyBzdG9yZWQgYWNjb3JkaW5nIHRvIElTTy02NzA5IHN0YW5kYXJkLgogICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUFkYXB0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFBZGFwdGVyLmNwcAppbmRleCBkNjgwZTBjLi5mMWI2ZThjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUFkYXB0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQWRhcHRlci5jcHAKQEAgLTQ1LDE3ICs0NSwyNCBAQAogfQogCiBzdGF0dXNfdCBNZWRpYUFkYXB0ZXI6OnN0b3AoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1BZGFwdGVyTG9jayk7Ci0gICAgaWYgKG1TdGFydGVkKSB7Ci0gICAgICAgIG1TdGFydGVkID0gZmFsc2U7Ci0gICAgICAgIC8vIElmIHN0b3AoKSBoYXBwZW5zIGltbWVkaWF0ZWx5IGFmdGVyIGEgcHVzaEJ1ZmZlcigpLCB3ZSBzaG91bGQKLSAgICAgICAgLy8gY2xlYW4gdXAgdGhlIG1DdXJyZW50TWVkaWFCdWZmZXIKLSAgICAgICAgaWYgKG1DdXJyZW50TWVkaWFCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgbUN1cnJlbnRNZWRpYUJ1ZmZlci0+cmVsZWFzZSgpOworICAgIE1lZGlhQnVmZmVyICpjdXJyZW50QnVmZmVyID0gTlVMTDsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtQWRhcHRlckxvY2spOworICAgICAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgICAgICAgICAvLyBJZiBzdG9wKCkgaGFwcGVucyBpbW1lZGlhdGVseSBhZnRlciBhIHB1c2hCdWZmZXIoKSwgd2Ugc2hvdWxkCisgICAgICAgICAgICAvLyBjbGVhbiB1cCB0aGUgbUN1cnJlbnRNZWRpYUJ1ZmZlci4gQnV0IG5lZWQgdG8gcmVsZWFzZSB3aXRob3V0CisgICAgICAgICAgICAvLyB0aGUgbG9jayBhcyBzaWduYWxCdWZmZXJSZXR1cm5lZCgpIHdpbGwgYWNxdWlyZSB0aGUgbG9jay4KKyAgICAgICAgICAgIGN1cnJlbnRCdWZmZXIgPSBtQ3VycmVudE1lZGlhQnVmZmVyOwogICAgICAgICAgICAgbUN1cnJlbnRNZWRpYUJ1ZmZlciA9IE5VTEw7CisKKyAgICAgICAgICAgIC8vIFdoaWxlIHJlYWQoKSBpcyBzdGlsbCB3YWl0aW5nLCB3ZSBzaG91bGQgc2lnbmFsIGl0IHRvIGZpbmlzaC4KKyAgICAgICAgICAgIG1CdWZmZXJSZWFkQ29uZC5zaWduYWwoKTsKICAgICAgICAgfQotICAgICAgICAvLyBXaGlsZSByZWFkKCkgaXMgc3RpbGwgd2FpdGluZywgd2Ugc2hvdWxkIHNpZ25hbCBpdCB0byBmaW5pc2guCi0gICAgICAgIG1CdWZmZXJSZWFkQ29uZC5zaWduYWwoKTsKKyAgICB9CisgICAgaWYgKGN1cnJlbnRCdWZmZXIgIT0gTlVMTCkgeworICAgICAgICBjdXJyZW50QnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgIGN1cnJlbnRCdWZmZXIgPSBOVUxMOwogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CkBAIC02NSw3ICs3Miw3IEBACiAgICAgcmV0dXJuIG1PdXRwdXRGb3JtYXQ7CiB9CiAKLXZvaWQgTWVkaWFBZGFwdGVyOjpzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7Cit2b2lkIE1lZGlhQWRhcHRlcjo6c2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUFkYXB0ZXJMb2NrKTsKICAgICBDSEVDSyhidWZmZXIgIT0gTlVMTCk7CiAgICAgYnVmZmVyLT5zZXRPYnNlcnZlcigwKTsKQEAgLTc1LDcgKzgyLDcgQEAKIH0KIAogc3RhdHVzX3QgTWVkaWFBZGFwdGVyOjpyZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICogLyogb3B0aW9ucyAqLykgeworICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqIC8qIG9wdGlvbnMgKi8pIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUFkYXB0ZXJMb2NrKTsKICAgICBpZiAoIW1TdGFydGVkKSB7CiAgICAgICAgIEFMT0dWKCJSZWFkIGJlZm9yZSBldmVuIHN0YXJ0ZWQhIik7CkBAIC05Nyw3ICsxMDQsNiBAQAogCiAgICAgKmJ1ZmZlciA9IG1DdXJyZW50TWVkaWFCdWZmZXI7CiAgICAgbUN1cnJlbnRNZWRpYUJ1ZmZlciA9IE5VTEw7Ci0gICAgKCpidWZmZXIpLT5zZXRPYnNlcnZlcih0aGlzKTsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTExNCw2ICsxMjAsNyBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogICAgIG1DdXJyZW50TWVkaWFCdWZmZXIgPSBidWZmZXI7CisgICAgbUN1cnJlbnRNZWRpYUJ1ZmZlci0+c2V0T2JzZXJ2ZXIodGhpcyk7CiAgICAgbUJ1ZmZlclJlYWRDb25kLnNpZ25hbCgpOwogCiAgICAgQUxPR1YoIndhaXQgZm9yIHRoZSBidWZmZXIgcmV0dXJuZWQgQCBwdXNoQnVmZmVyISAlcCIsIGJ1ZmZlcik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNsb2NrLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ2xvY2suY3BwCmluZGV4IDNhYTAwNjEuLjQxZGJmZDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ2xvY2suY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ2xvY2suY3BwCkBAIC0xNywxMSArMTcsMTIgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiTWVkaWFDbG9jayIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxtYXA+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNsb2NrLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0yOSwxNSArMzAsNTAgQEAKIC8vIElmIGxhcmdlciB0aGFuIHRoaXMgdGhyZXNob2xkLCBpdCdzIHRyZWF0ZWQgYXMgZGlzY29udGludWl0eS4KIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtBbmNob3JGbHVjdHVhdGlvbkFsbG93ZWRVcyA9IDEwMDAwbGw7CiAKK01lZGlhQ2xvY2s6OlRpbWVyOjpUaW1lcihjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgaW50NjRfdCBtZWRpYVRpbWVVcywgaW50NjRfdCBhZGp1c3RSZWFsVXMpCisgICAgOiBtTm90aWZ5KG5vdGlmeSksCisgICAgICBtTWVkaWFUaW1lVXMobWVkaWFUaW1lVXMpLAorICAgICAgbUFkanVzdFJlYWxVcyhhZGp1c3RSZWFsVXMpIHsKK30KKwogTWVkaWFDbG9jazo6TWVkaWFDbG9jaygpCiAgICAgOiBtQW5jaG9yVGltZU1lZGlhVXMoLTEpLAogICAgICAgbUFuY2hvclRpbWVSZWFsVXMoLTEpLAogICAgICAgbU1heFRpbWVNZWRpYVVzKElOVDY0X01BWCksCiAgICAgICBtU3RhcnRpbmdUaW1lTWVkaWFVcygtMSksCi0gICAgICBtUGxheWJhY2tSYXRlKDEuMCkgeworICAgICAgbVBsYXliYWNrUmF0ZSgxLjApLAorICAgICAgbUdlbmVyYXRpb24oMCkgeworICAgIG1Mb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICBtTG9vcGVyLT5zZXROYW1lKCJNZWRpYUNsb2NrIik7CisgICAgbUxvb3Blci0+c3RhcnQoZmFsc2UgLyogcnVuT25DYWxsaW5nVGhyZWFkICovLAorICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGNhbkNhbGxKYXZhICovLAorICAgICAgICAgICAgICAgICAgIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOworfQorCit2b2lkIE1lZGlhQ2xvY2s6OmluaXQoKSB7CisgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKHRoaXMpOwogfQogCiBNZWRpYUNsb2NrOjp+TWVkaWFDbG9jaygpIHsKKyAgICByZXNldCgpOworICAgIGlmIChtTG9vcGVyICE9IE5VTEwpIHsKKyAgICAgICAgbUxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIoaWQoKSk7CisgICAgICAgIG1Mb29wZXItPnN0b3AoKTsKKyAgICB9Cit9CisKK3ZvaWQgTWVkaWFDbG9jazo6cmVzZXQoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBhdXRvIGl0ID0gbVRpbWVycy5iZWdpbigpOworICAgIHdoaWxlIChpdCAhPSBtVGltZXJzLmVuZCgpKSB7CisgICAgICAgIGl0LT5tTm90aWZ5LT5zZXRJbnQzMigicmVhc29uIiwgVElNRVJfUkVBU09OX1JFU0VUKTsKKyAgICAgICAgaXQtPm1Ob3RpZnktPnBvc3QoKTsKKyAgICAgICAgaXQgPSBtVGltZXJzLmVyYXNlKGl0KTsKKyAgICB9CisgICAgbU1heFRpbWVNZWRpYVVzID0gSU5UNjRfTUFYOworICAgIG1TdGFydGluZ1RpbWVNZWRpYVVzID0gLTE7CisgICAgdXBkYXRlQW5jaG9yVGltZXNBbmRQbGF5YmFja1JhdGVfbCgtMSwgLTEsIDEuMCk7CisgICAgKyttR2VuZXJhdGlvbjsKIH0KIAogdm9pZCBNZWRpYUNsb2NrOjpzZXRTdGFydGluZ1RpbWVNZWRpYShpbnQ2NF90IHN0YXJ0aW5nVGltZU1lZGlhVXMpIHsKQEAgLTQ3LDggKzgzLDcgQEAKIAogdm9pZCBNZWRpYUNsb2NrOjpjbGVhckFuY2hvcigpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIG1BbmNob3JUaW1lTWVkaWFVcyA9IC0xOwotICAgIG1BbmNob3JUaW1lUmVhbFVzID0gLTE7CisgICAgdXBkYXRlQW5jaG9yVGltZXNBbmRQbGF5YmFja1JhdGVfbCgtMSwgLTEsIG1QbGF5YmFja1JhdGUpOwogfQogCiB2b2lkIE1lZGlhQ2xvY2s6OnVwZGF0ZUFuY2hvcigKQEAgLTgwLDggKzExNSwxMCBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgfQotICAgIG1BbmNob3JUaW1lUmVhbFVzID0gbm93VXM7Ci0gICAgbUFuY2hvclRpbWVNZWRpYVVzID0gbm93TWVkaWFVczsKKyAgICB1cGRhdGVBbmNob3JUaW1lc0FuZFBsYXliYWNrUmF0ZV9sKG5vd01lZGlhVXMsIG5vd1VzLCBtUGxheWJhY2tSYXRlKTsKKworICAgICsrbUdlbmVyYXRpb247CisgICAgcHJvY2Vzc1RpbWVyc19sKCk7CiB9CiAKIHZvaWQgTWVkaWFDbG9jazo6dXBkYXRlTWF4VGltZU1lZGlhKGludDY0X3QgbWF4VGltZU1lZGlhVXMpIHsKQEAgLTk4LDEzICsxMzUsMTcgQEAKICAgICB9CiAKICAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLSAgICBtQW5jaG9yVGltZU1lZGlhVXMgKz0gKG5vd1VzIC0gbUFuY2hvclRpbWVSZWFsVXMpICogKGRvdWJsZSltUGxheWJhY2tSYXRlOwotICAgIGlmIChtQW5jaG9yVGltZU1lZGlhVXMgPCAwKSB7CisgICAgaW50NjRfdCBub3dNZWRpYVVzID0gbUFuY2hvclRpbWVNZWRpYVVzICsgKG5vd1VzIC0gbUFuY2hvclRpbWVSZWFsVXMpICogKGRvdWJsZSltUGxheWJhY2tSYXRlOworICAgIGlmIChub3dNZWRpYVVzIDwgMCkgewogICAgICAgICBBTE9HVygic2V0UmF0ZTogYW5jaG9yIHRpbWUgc2hvdWxkIG5vdCBiZSBuZWdhdGl2ZSwgc2V0IHRvIDAuIik7Ci0gICAgICAgIG1BbmNob3JUaW1lTWVkaWFVcyA9IDA7CisgICAgICAgIG5vd01lZGlhVXMgPSAwOwogICAgIH0KLSAgICBtQW5jaG9yVGltZVJlYWxVcyA9IG5vd1VzOwotICAgIG1QbGF5YmFja1JhdGUgPSByYXRlOworICAgIHVwZGF0ZUFuY2hvclRpbWVzQW5kUGxheWJhY2tSYXRlX2wobm93TWVkaWFVcywgbm93VXMsIHJhdGUpOworCisgICAgaWYgKHJhdGUgPiAwLjApIHsKKyAgICAgICAgKyttR2VuZXJhdGlvbjsKKyAgICAgICAgcHJvY2Vzc1RpbWVyc19sKCk7CisgICAgfQogfQogCiBmbG9hdCBNZWRpYUNsb2NrOjpnZXRQbGF5YmFja1JhdGUoKSBjb25zdCB7CkBAIC0xNjUsNCArMjA2LDEzMyBAQAogICAgIHJldHVybiBPSzsKIH0KIAordm9pZCBNZWRpYUNsb2NrOjphZGRUaW1lcihjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgaW50NjRfdCBtZWRpYVRpbWVVcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBhZGp1c3RSZWFsVXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgYm9vbCB1cGRhdGVUaW1lciA9IChtUGxheWJhY2tSYXRlICE9IDAuMCk7CisgICAgaWYgKHVwZGF0ZVRpbWVyKSB7CisgICAgICAgIGF1dG8gaXQgPSBtVGltZXJzLmJlZ2luKCk7CisgICAgICAgIHdoaWxlIChpdCAhPSBtVGltZXJzLmVuZCgpKSB7CisgICAgICAgICAgICBpZiAoKChpdC0+bUFkanVzdFJlYWxVcyAtIChkb3VibGUpYWRqdXN0UmVhbFVzKSAqIChkb3VibGUpbVBsYXliYWNrUmF0ZQorICAgICAgICAgICAgICAgICsgKGl0LT5tTWVkaWFUaW1lVXMgLSBtZWRpYVRpbWVVcykpIDw9IDApIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVUaW1lciA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKytpdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1UaW1lcnMuZW1wbGFjZV9iYWNrKG5vdGlmeSwgbWVkaWFUaW1lVXMsIGFkanVzdFJlYWxVcyk7CisKKyAgICBpZiAodXBkYXRlVGltZXIpIHsKKyAgICAgICAgKyttR2VuZXJhdGlvbjsKKyAgICAgICAgcHJvY2Vzc1RpbWVyc19sKCk7CisgICAgfQorfQorCit2b2lkIE1lZGlhQ2xvY2s6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0VGltZUlzVXA6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKKworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9IG1HZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcm9jZXNzVGltZXJzX2woKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgTWVkaWFDbG9jazo6cHJvY2Vzc1RpbWVyc19sKCkgeworICAgIGludDY0X3Qgbm93TWVkaWFUaW1lVXM7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0TWVkaWFUaW1lX2woCisgICAgICAgICAgICBBTG9vcGVyOjpHZXROb3dVcygpLCAmbm93TWVkaWFUaW1lVXMsIGZhbHNlIC8qIGFsbG93UGFzdE1heFRpbWUgKi8pOworCisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50NjRfdCBuZXh0TGFwc2VSZWFsVXMgPSBJTlQ2NF9NQVg7CisgICAgc3RkOjptdWx0aW1hcDxpbnQ2NF90LCBUaW1lcj4gbm90aWZ5TGlzdDsKKyAgICBhdXRvIGl0ID0gbVRpbWVycy5iZWdpbigpOworICAgIHdoaWxlIChpdCAhPSBtVGltZXJzLmVuZCgpKSB7CisgICAgICAgIGRvdWJsZSBkaWZmID0gaXQtPm1BZGp1c3RSZWFsVXMgKiAoZG91YmxlKW1QbGF5YmFja1JhdGUKKyAgICAgICAgICAgICsgaXQtPm1NZWRpYVRpbWVVcyAtIG5vd01lZGlhVGltZVVzOworICAgICAgICBpbnQ2NF90IGRpZmZNZWRpYVVzOworICAgICAgICBpZiAoZGlmZiA+IChkb3VibGUpSU5UNjRfTUFYKSB7CisgICAgICAgICAgICBkaWZmTWVkaWFVcyA9IElOVDY0X01BWDsKKyAgICAgICAgfSBlbHNlIGlmIChkaWZmIDwgKGRvdWJsZSlJTlQ2NF9NSU4pIHsKKyAgICAgICAgICAgIGRpZmZNZWRpYVVzID0gSU5UNjRfTUlOOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGlmZk1lZGlhVXMgPSBkaWZmOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRpZmZNZWRpYVVzIDw9IDApIHsKKyAgICAgICAgICAgIG5vdGlmeUxpc3QuZW1wbGFjZShkaWZmTWVkaWFVcywgKml0KTsKKyAgICAgICAgICAgIGl0ID0gbVRpbWVycy5lcmFzZShpdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobVBsYXliYWNrUmF0ZSAhPSAwLjAKKyAgICAgICAgICAgICAgICAmJiAoZG91YmxlKWRpZmZNZWRpYVVzIDwgSU5UNjRfTUFYICogKGRvdWJsZSltUGxheWJhY2tSYXRlKSB7CisgICAgICAgICAgICAgICAgaW50NjRfdCB0YXJnZXRSZWFsVXMgPSBkaWZmTWVkaWFVcyAvIChkb3VibGUpbVBsYXliYWNrUmF0ZTsKKyAgICAgICAgICAgICAgICBpZiAodGFyZ2V0UmVhbFVzIDwgbmV4dExhcHNlUmVhbFVzKSB7CisgICAgICAgICAgICAgICAgICAgIG5leHRMYXBzZVJlYWxVcyA9IHRhcmdldFJlYWxVczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK2l0OworICAgICAgICB9CisgICAgfQorCisgICAgYXV0byBpdE5vdGlmeSA9IG5vdGlmeUxpc3QuYmVnaW4oKTsKKyAgICB3aGlsZSAoaXROb3RpZnkgIT0gbm90aWZ5TGlzdC5lbmQoKSkgeworICAgICAgICBpdE5vdGlmeS0+c2Vjb25kLm1Ob3RpZnktPnNldEludDMyKCJyZWFzb24iLCBUSU1FUl9SRUFTT05fUkVBQ0hFRCk7CisgICAgICAgIGl0Tm90aWZ5LT5zZWNvbmQubU5vdGlmeS0+cG9zdCgpOworICAgICAgICBpdE5vdGlmeSA9IG5vdGlmeUxpc3QuZXJhc2UoaXROb3RpZnkpOworICAgIH0KKworICAgIGlmIChtVGltZXJzLmVtcHR5KCkgfHwgbVBsYXliYWNrUmF0ZSA9PSAwLjAgfHwgbUFuY2hvclRpbWVNZWRpYVVzIDwgMAorICAgICAgICB8fCBuZXh0TGFwc2VSZWFsVXMgPT0gSU5UNjRfTUFYKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0VGltZUlzVXAsIHRoaXMpOworICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtR2VuZXJhdGlvbik7CisgICAgbXNnLT5wb3N0KG5leHRMYXBzZVJlYWxVcyk7Cit9CisKK3ZvaWQgTWVkaWFDbG9jazo6dXBkYXRlQW5jaG9yVGltZXNBbmRQbGF5YmFja1JhdGVfbChpbnQ2NF90IGFuY2hvclRpbWVNZWRpYVVzLAorICAgICAgICBpbnQ2NF90IGFuY2hvclRpbWVSZWFsVXMsIGZsb2F0IHBsYXliYWNrUmF0ZSkgeworICAgIGlmIChtQW5jaG9yVGltZU1lZGlhVXMgIT0gYW5jaG9yVGltZU1lZGlhVXMKKyAgICAgICAgICAgIHx8IG1BbmNob3JUaW1lUmVhbFVzICE9IGFuY2hvclRpbWVSZWFsVXMKKyAgICAgICAgICAgIHx8IG1QbGF5YmFja1JhdGUgIT0gcGxheWJhY2tSYXRlKSB7CisgICAgICAgIG1BbmNob3JUaW1lTWVkaWFVcyA9IGFuY2hvclRpbWVNZWRpYVVzOworICAgICAgICBtQW5jaG9yVGltZVJlYWxVcyA9IGFuY2hvclRpbWVSZWFsVXM7CisgICAgICAgIG1QbGF5YmFja1JhdGUgPSBwbGF5YmFja1JhdGU7CisgICAgICAgIG5vdGlmeURpc2NvbnRpbnVpdHlfbCgpOworICAgIH0KK30KKwordm9pZCBNZWRpYUNsb2NrOjpzZXROb3RpZmljYXRpb25NZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBtTm90aWZ5ID0gbXNnOworfQorCit2b2lkIE1lZGlhQ2xvY2s6Om5vdGlmeURpc2NvbnRpbnVpdHlfbCgpIHsKKyAgICBpZiAobU5vdGlmeSAhPSBudWxscHRyKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICAgICAgbXNnLT5zZXRJbnQ2NCgiYW5jaG9yLW1lZGlhLXVzIiwgbUFuY2hvclRpbWVNZWRpYVVzKTsKKyAgICAgICAgbXNnLT5zZXRJbnQ2NCgiYW5jaG9yLXJlYWwtdXMiLCBtQW5jaG9yVGltZVJlYWxVcyk7CisgICAgICAgIG1zZy0+c2V0RmxvYXQoInBsYXliYWNrLXJhdGUiLCBtUGxheWJhY2tSYXRlKTsKKyAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgfQorfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcAppbmRleCA3NTllNDJkLi43MmVmZjk0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcApAQCAtMTYsMTIgKzE2LDE1IEBACiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiTWVkaWFDb2RlYyIKLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSAiaW5jbHVkZS9hdmNfdXRpbHMuaCIKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCiAjaW5jbHVkZSAiaW5jbHVkZS9TZWN1cmVCdWZmZXIuaCIKICNpbmNsdWRlICJpbmNsdWRlL1NoYXJlZE1lbW9yeUJ1ZmZlci5oIgogI2luY2x1ZGUgImluY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oIgorI2luY2x1ZGUgIlN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyLmgiCiAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Nhcy9uYXRpdmUvMS4wL0lEZXNjcmFtYmxlci5oPgogCkBAIC0yOSw2ICszMiw3IEBACiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGd1aS9CdWZmZXJRdWV1ZS5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgpAQCAtNDEsNiArNDUsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYXZjX3V0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQnVmZmVyUHJvZHVjZXJXcmFwcGVyLmg+CkBAIC00OSwxMyArNTQsMTEgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRmlsdGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDbGllbnQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9QZXJzaXN0ZW50U3VyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhdXRpbHMvQmF0dGVyeU5vdGlmaWVyLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvU2luZ2xldG9uLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTYzLDIzICs2Niw0NCBAQAogLy8ga2V5IGZvciBtZWRpYSBzdGF0aXN0aWNzCiBzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjS2V5TmFtZSA9ICJjb2RlYyI7CiAvLyBhdHRycyBmb3IgbWVkaWEgc3RhdGlzdGljcworLy8gTkI6IHRoZXNlIGFyZSBtYXRjaGVkIHdpdGggcHVibGljIEphdmEgQVBJIGNvbnN0YW50cyBkZWZpbmVkCisvLyBpbiBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhQ29kZWMuamF2YQorLy8gVGhlc2UgbXVzdCBiZSBrZXB0IHN5bmNocm9uaXplZCB3aXRoIHRoZSBjb25zdGFudHMgdGhlcmUuCiBzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjQ29kZWMgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmNvZGVjIjsgIC8qIGUuZy4gT01YLmdvb2dsZS5hYWMuZGVjb2RlciAqLwogc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY01pbWUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLm1pbWUiOyAgICAvKiBlLmcuIGF1ZGlvL21pbWUgKi8KIHN0YXRpYyBjb25zdCBjaGFyICprQ29kZWNNb2RlID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5tb2RlIjsgICAgLyogYXVkaW8sIHZpZGVvICovCi1zdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjU2VjdXJlID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5zZWN1cmUiOyAgIC8qIDAsIDEgKi8KLXN0YXRpYyBjb25zdCBjaGFyICprQ29kZWNIZWlnaHQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmhlaWdodCI7ICAgLyogMC4ubiAqLwotc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY1dpZHRoID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy53aWR0aCI7ICAgICAvKiAwLi5uICovCi1zdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjUm90YXRpb24gPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLnJvdGF0aW9uLWRlZ3JlZXMiOyAgLyogMC85MC8xODAvMjcwICovCi1zdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjQ3J5cHRvID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5jcnlwdG8iOyAgIC8qIDAsMSAqLworc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY01vZGVWaWRlbyA9ICJ2aWRlbyI7ICAgICAgICAgICAgLyogdmFsdWVzIHJldHVybmVkIGZvciBrQ29kZWNNb2RlICovCitzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjTW9kZUF1ZGlvID0gImF1ZGlvIjsKIHN0YXRpYyBjb25zdCBjaGFyICprQ29kZWNFbmNvZGVyID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5lbmNvZGVyIjsgLyogMCwxICovCitzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjU2VjdXJlID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5zZWN1cmUiOyAgIC8qIDAsIDEgKi8KK3N0YXRpYyBjb25zdCBjaGFyICprQ29kZWNXaWR0aCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMud2lkdGgiOyAgICAgLyogMC4ubiAqLworc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY0hlaWdodCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuaGVpZ2h0IjsgICAvKiAwLi5uICovCitzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjUm90YXRpb24gPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLnJvdGF0aW9uLWRlZ3JlZXMiOyAgLyogMC85MC8xODAvMjcwICovCiAKLXN0YXRpYyBjb25zdCBjaGFyICprQ29kZWNCeXRlc0luID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5ieXRlc2luIjsgIC8qIDAuLm4gKi8KKy8vIE5COiBUaGVzZSBhcmUgbm90IHlldCBleHBvc2VkIGFzIHB1YmxpYyBKYXZhIEFQSSBjb25zdGFudHMuCitzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjQ3J5cHRvID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5jcnlwdG8iOyAgIC8qIDAsMSAqLwogc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY1Byb2ZpbGUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLnByb2ZpbGUiOyAgLyogMC4ubiAqLwogc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY0xldmVsID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5sZXZlbCI7ICAvKiAwLi5uICovCiBzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjTWF4V2lkdGggPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLm1heHdpZHRoIjsgIC8qIDAuLm4gKi8KIHN0YXRpYyBjb25zdCBjaGFyICprQ29kZWNNYXhIZWlnaHQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLm1heGhlaWdodCI7ICAvKiAwLi5uICovCiBzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjRXJyb3IgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmVycmNvZGUiOwogc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY0Vycm9yU3RhdGUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmVycnN0YXRlIjsKK3N0YXRpYyBjb25zdCBjaGFyICprQ29kZWNMYXRlbmN5TWF4ID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5sYXRlbmN5Lm1heCI7ICAgLyogaW4gdXMgKi8KK3N0YXRpYyBjb25zdCBjaGFyICprQ29kZWNMYXRlbmN5TWluID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5sYXRlbmN5Lm1pbiI7ICAgLyogaW4gdXMgKi8KK3N0YXRpYyBjb25zdCBjaGFyICprQ29kZWNMYXRlbmN5QXZnID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5sYXRlbmN5LmF2ZyI7ICAgLyogaW4gdXMgKi8KK3N0YXRpYyBjb25zdCBjaGFyICprQ29kZWNMYXRlbmN5Q291bnQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmxhdGVuY3kubiI7CitzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjTGF0ZW5jeUhpc3QgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmxhdGVuY3kuaGlzdCI7IC8qIGluIHVzICovCitzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjTGF0ZW5jeVVua25vd24gPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmxhdGVuY3kudW5rbm93biI7CisKKy8vIHRoZSBrQ29kZWNSZWNlbnQqIGZpZWxkcyBhcHBlYXIgb25seSBpbiBnZXRNZXRyaWNzKCkgcmVzdWx0cworc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY1JlY2VudExhdGVuY3lNYXggPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLnJlY2VudC5tYXgiOyAgICAgIC8qIGluIHVzICovCitzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjUmVjZW50TGF0ZW5jeU1pbiA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMucmVjZW50Lm1pbiI7ICAgICAgLyogaW4gdXMgKi8KK3N0YXRpYyBjb25zdCBjaGFyICprQ29kZWNSZWNlbnRMYXRlbmN5QXZnID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5yZWNlbnQuYXZnIjsgICAgICAvKiBpbiB1cyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY1JlY2VudExhdGVuY3lDb3VudCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMucmVjZW50Lm4iOworc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY1JlY2VudExhdGVuY3lIaXN0ID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5yZWNlbnQuaGlzdCI7ICAgIC8qIGluIHVzICovCisKKy8vIFhYWCBzdXBwcmVzcyB1bnRpbCB3ZSBnZXQgb3VyIHJlcHJlc2VudGF0aW9uIHJpZ2h0CitzdGF0aWMgYm9vbCBrRW1pdEhpc3RvZ3JhbSA9IGZhbHNlOwogCiAKIHN0YXRpYyBpbnQ2NF90IGdldElkKGNvbnN0IHNwPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+ICZjbGllbnQpIHsKQEAgLTQxNCwxMyArNDM4LDMxIEBACiBzcDxNZWRpYUNvZGVjPiBNZWRpYUNvZGVjOjpDcmVhdGVCeVR5cGUoCiAgICAgICAgIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsIGNvbnN0IEFTdHJpbmcgJm1pbWUsIGJvb2wgZW5jb2Rlciwgc3RhdHVzX3QgKmVyciwgcGlkX3QgcGlkLAogICAgICAgICB1aWRfdCB1aWQpIHsKLSAgICBzcDxNZWRpYUNvZGVjPiBjb2RlYyA9IG5ldyBNZWRpYUNvZGVjKGxvb3BlciwgcGlkLCB1aWQpOworICAgIFZlY3RvcjxBU3RyaW5nPiBtYXRjaGluZ0NvZGVjczsKIAotICAgIGNvbnN0IHN0YXR1c190IHJldCA9IGNvZGVjLT5pbml0KG1pbWUsIHRydWUgLyogbmFtZUlzVHlwZSAqLywgZW5jb2Rlcik7CisgICAgTWVkaWFDb2RlY0xpc3Q6OmZpbmRNYXRjaGluZ0NvZGVjcygKKyAgICAgICAgICAgIG1pbWUuY19zdHIoKSwKKyAgICAgICAgICAgIGVuY29kZXIsCisgICAgICAgICAgICAwLAorICAgICAgICAgICAgJm1hdGNoaW5nQ29kZWNzKTsKKwogICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICAqZXJyID0gcmV0OworICAgICAgICAqZXJyID0gTkFNRV9OT1RfRk9VTkQ7CiAgICAgfQotICAgIHJldHVybiByZXQgPT0gT0sgPyBjb2RlYyA6IE5VTEw7IC8vIE5VTEwgZGVhbGxvY2F0ZXMgY29kZWMuCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtYXRjaGluZ0NvZGVjcy5zaXplKCk7ICsraSkgeworICAgICAgICBzcDxNZWRpYUNvZGVjPiBjb2RlYyA9IG5ldyBNZWRpYUNvZGVjKGxvb3BlciwgcGlkLCB1aWQpOworICAgICAgICBBU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBtYXRjaGluZ0NvZGVjc1tpXTsKKyAgICAgICAgc3RhdHVzX3QgcmV0ID0gY29kZWMtPmluaXQoY29tcG9uZW50TmFtZSk7CisgICAgICAgIGlmIChlcnIgIT0gTlVMTCkgeworICAgICAgICAgICAgKmVyciA9IHJldDsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV0ID09IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gY29kZWM7CisgICAgICAgIH0KKyAgICAgICAgQUxPR0QoIkFsbG9jYXRpbmcgY29tcG9uZW50ICclcycgZmFpbGVkICglZCksIHRyeSBuZXh0IG9uZS4iLAorICAgICAgICAgICAgICAgIGNvbXBvbmVudE5hbWUuY19zdHIoKSwgcmV0KTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIC8vIHN0YXRpYwpAQCAtNDI4LDcgKzQ3MCw3IEBACiAgICAgICAgIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsIGNvbnN0IEFTdHJpbmcgJm5hbWUsIHN0YXR1c190ICplcnIsIHBpZF90IHBpZCwgdWlkX3QgdWlkKSB7CiAgICAgc3A8TWVkaWFDb2RlYz4gY29kZWMgPSBuZXcgTWVkaWFDb2RlYyhsb29wZXIsIHBpZCwgdWlkKTsKIAotICAgIGNvbnN0IHN0YXR1c190IHJldCA9IGNvZGVjLT5pbml0KG5hbWUsIGZhbHNlIC8qIG5hbWVJc1R5cGUgKi8sIGZhbHNlIC8qIGVuY29kZXIgKi8pOworICAgIGNvbnN0IHN0YXR1c190IHJldCA9IGNvZGVjLT5pbml0KG5hbWUpOwogICAgIGlmIChlcnIgIT0gTlVMTCkgewogICAgICAgICAqZXJyID0gcmV0OwogICAgIH0KQEAgLTQzNyw2ICs0NzksMTMgQEAKIAogLy8gc3RhdGljCiBzcDxQZXJzaXN0ZW50U3VyZmFjZT4gTWVkaWFDb2RlYzo6Q3JlYXRlUGVyc2lzdGVudElucHV0U3VyZmFjZSgpIHsKKyAgICAvLyBhbGxvdyBwbHVnaW4gdG8gY3JlYXRlIHN1cmZhY2UKKyAgICBzcDxQZXJzaXN0ZW50U3VyZmFjZT4gcGx1Z2luU3VyZmFjZSA9CisgICAgICAgIFN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyOjpHZXRDQ29kZWNJbnN0YW5jZSgpLT5jcmVhdGVJbnB1dFN1cmZhY2UoKTsKKyAgICBpZiAocGx1Z2luU3VyZmFjZSAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBwbHVnaW5TdXJmYWNlOworICAgIH0KKwogICAgIE9NWENsaWVudCBjbGllbnQ7CiAgICAgaWYgKGNsaWVudC5jb25uZWN0KCkgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjb25uZWN0IHRvIE9NWCB0byBjcmVhdGUgcGVyc2lzdGVudCBpbnB1dCBzdXJmYWNlLiIpOwpAQCAtNDgwLDEyICs1MjksMTUgQEAKICAgICAgIG1EZXF1ZXVlT3V0cHV0VGltZW91dEdlbmVyYXRpb24oMCksCiAgICAgICBtRGVxdWV1ZU91dHB1dFJlcGx5SUQoMCksCiAgICAgICBtSGF2ZUlucHV0U3VyZmFjZShmYWxzZSksCi0gICAgICBtSGF2ZVBlbmRpbmdJbnB1dEJ1ZmZlcnMoZmFsc2UpIHsKKyAgICAgIG1IYXZlUGVuZGluZ0lucHV0QnVmZmVycyhmYWxzZSksCisgICAgICBtQ3B1Qm9vc3RSZXF1ZXN0ZWQoZmFsc2UpLAorICAgICAgbUxhdGVuY3lVbmtub3duKDApIHsKICAgICBpZiAodWlkID09IGtOb1VpZCkgewogICAgICAgICBtVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1VaWQgPSB1aWQ7CiAgICAgfQorCiAgICAgaW5pdEFuYWx5dGljc0l0ZW0oKTsKIH0KIApAQCAtNDk3LDIxICs1NDksOTMgQEAKIH0KIAogdm9pZCBNZWRpYUNvZGVjOjppbml0QW5hbHl0aWNzSXRlbSgpIHsKLSAgICBDSEVDSyhtQW5hbHl0aWNzSXRlbSA9PSBOVUxMKTsKLSAgICAvLyBzZXQgdXAgb3VyIG5ldyByZWNvcmQsIGdldCBhIHNlc3Npb25JRCwgcHV0IGl0IGludG8gdGhlIGluLXByb2dyZXNzIGxpc3QKLSAgICBtQW5hbHl0aWNzSXRlbSA9IG5ldyBNZWRpYUFuYWx5dGljc0l0ZW0oa0NvZGVjS2V5TmFtZSk7Ci0gICAgaWYgKG1BbmFseXRpY3NJdGVtICE9IE5VTEwpIHsKLSAgICAgICAgKHZvaWQpIG1BbmFseXRpY3NJdGVtLT5nZW5lcmF0ZVNlc3Npb25JRCgpOwotICAgICAgICAvLyBkb24ndCByZWNvcmQgaXQgeWV0OyBvbmx5IGF0IHRoZSBlbmQsIHdoZW4gd2UgaGF2ZSBkZWNpZGVkIHRoYXQgd2UgaGF2ZQotICAgICAgICAvLyBkYXRhIHdvcnRoIHdyaXRpbmcgKGUuZy4gLmNvdW50KCkgPiAwKQorICAgIGlmIChtQW5hbHl0aWNzSXRlbSA9PSBOVUxMKSB7CisgICAgICAgIG1BbmFseXRpY3NJdGVtID0gbmV3IE1lZGlhQW5hbHl0aWNzSXRlbShrQ29kZWNLZXlOYW1lKTsKKyAgICB9CisKKyAgICBtTGF0ZW5jeUhpc3Quc2V0dXAoa0xhdGVuY3lIaXN0QnVja2V0cywga0xhdGVuY3lIaXN0V2lkdGgsIGtMYXRlbmN5SGlzdEZsb29yKTsKKworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1SZWNlbnRMb2NrKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGk8a1JlY2VudExhdGVuY3lGcmFtZXM7IGkrKykgeworICAgICAgICAgICAgbVJlY2VudFNhbXBsZXNbaV0gPSBrUmVjZW50U2FtcGxlSW52YWxpZDsKKyAgICAgICAgfQorICAgICAgICBtUmVjZW50SGVhZCA9IDA7CisgICAgfQorfQorCit2b2lkIE1lZGlhQ29kZWM6OnVwZGF0ZUFuYWx5dGljc0l0ZW0oKSB7CisgICAgQUxPR1YoIk1lZGlhQ29kZWM6OnVwZGF0ZUFuYWx5dGljc0l0ZW0iKTsKKyAgICBpZiAobUFuYWx5dGljc0l0ZW0gPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1MYXRlbmN5SGlzdC5nZXRDb3VudCgpICE9IDAgKSB7CisgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChrQ29kZWNMYXRlbmN5TWF4LCBtTGF0ZW5jeUhpc3QuZ2V0TWF4KCkpOworICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50NjQoa0NvZGVjTGF0ZW5jeU1pbiwgbUxhdGVuY3lIaXN0LmdldE1pbigpKTsKKyAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDY0KGtDb2RlY0xhdGVuY3lBdmcsIG1MYXRlbmN5SGlzdC5nZXRBdmcoKSk7CisgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChrQ29kZWNMYXRlbmN5Q291bnQsIG1MYXRlbmN5SGlzdC5nZXRDb3VudCgpKTsKKworICAgICAgICBpZiAoa0VtaXRIaXN0b2dyYW0pIHsKKyAgICAgICAgICAgIC8vIGFuZCB0aGUgaGlzdG9ncmFtIGl0c2VsZgorICAgICAgICAgICAgc3RkOjpzdHJpbmcgaGlzdCA9IG1MYXRlbmN5SGlzdC5lbWl0KCk7CisgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrQ29kZWNMYXRlbmN5SGlzdCwgaGlzdC5jX3N0cigpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobUxhdGVuY3lVbmtub3duID4gMCkgeworICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50NjQoa0NvZGVjTGF0ZW5jeVVua25vd24sIG1MYXRlbmN5VW5rbm93bik7CisgICAgfQorCisjaWYgMAorICAgIC8vIGVuYWJsZSBmb3Igc2hvcnQgdGVybSwgb25seSB3aGlsZSBkZWJ1Z2dpbmcKKyAgICB1cGRhdGVFcGhlbWVyYWxBbmFseXRpY3MobUFuYWx5dGljc0l0ZW0pOworI2VuZGlmCit9CisKK3ZvaWQgTWVkaWFDb2RlYzo6dXBkYXRlRXBoZW1lcmFsQW5hbHl0aWNzKE1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSkgeworICAgIEFMT0dEKCJNZWRpYUNvZGVjOjp1cGRhdGVFcGhlbWVyYWxBbmFseXRpY3MoKSIpOworCisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgSGlzdG9ncmFtIHJlY2VudEhpc3Q7CisKKyAgICAvLyBidWlsZCBhbiBlbXB0eSBoaXN0b2dyYW0KKyAgICByZWNlbnRIaXN0LnNldHVwKGtMYXRlbmN5SGlzdEJ1Y2tldHMsIGtMYXRlbmN5SGlzdFdpZHRoLCBrTGF0ZW5jeUhpc3RGbG9vcik7CisKKyAgICAvLyBzdHVmZiBpdCB3aXRoIHRoZSBzYW1wbGVzIGluIHRoZSByaW5nIGJ1ZmZlcgorICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1SZWNlbnRMb2NrKTsKKworICAgICAgICBmb3IgKGludCBpPTA7IGk8a1JlY2VudExhdGVuY3lGcmFtZXM7IGkrKykgeworICAgICAgICAgICAgaWYgKG1SZWNlbnRTYW1wbGVzW2ldICE9IGtSZWNlbnRTYW1wbGVJbnZhbGlkKSB7CisgICAgICAgICAgICAgICAgcmVjZW50SGlzdC5pbnNlcnQobVJlY2VudFNhbXBsZXNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvLyBzcGl0IHRoZSBkYXRhIChpZiBhbnkpIGludG8gdGhlIHN1cHBsaWVkIGFuYWx5dGljcyByZWNvcmQKKyAgICBpZiAocmVjZW50SGlzdC5nZXRDb3VudCgpIT0gMCApIHsKKyAgICAgICAgaXRlbS0+c2V0SW50NjQoa0NvZGVjUmVjZW50TGF0ZW5jeU1heCwgcmVjZW50SGlzdC5nZXRNYXgoKSk7CisgICAgICAgIGl0ZW0tPnNldEludDY0KGtDb2RlY1JlY2VudExhdGVuY3lNaW4sIHJlY2VudEhpc3QuZ2V0TWluKCkpOworICAgICAgICBpdGVtLT5zZXRJbnQ2NChrQ29kZWNSZWNlbnRMYXRlbmN5QXZnLCByZWNlbnRIaXN0LmdldEF2ZygpKTsKKyAgICAgICAgaXRlbS0+c2V0SW50NjQoa0NvZGVjUmVjZW50TGF0ZW5jeUNvdW50LCByZWNlbnRIaXN0LmdldENvdW50KCkpOworCisgICAgICAgIGlmIChrRW1pdEhpc3RvZ3JhbSkgeworICAgICAgICAgICAgLy8gYW5kIHRoZSBoaXN0b2dyYW0gaXRzZWxmCisgICAgICAgICAgICBzdGQ6OnN0cmluZyBoaXN0ID0gcmVjZW50SGlzdC5lbWl0KCk7CisgICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtDb2RlY1JlY2VudExhdGVuY3lIaXN0LCBoaXN0LmNfc3RyKCkpOworICAgICAgICB9CiAgICAgfQogfQogCiB2b2lkIE1lZGlhQ29kZWM6OmZsdXNoQW5hbHl0aWNzSXRlbSgpIHsKKyAgICB1cGRhdGVBbmFseXRpY3NJdGVtKCk7CiAgICAgaWYgKG1BbmFseXRpY3NJdGVtICE9IE5VTEwpIHsKICAgICAgICAgLy8gZG9uJ3QgbG9nIGVtcHR5IHJlY29yZHMKICAgICAgICAgaWYgKG1BbmFseXRpY3NJdGVtLT5jb3VudCgpID4gMCkgewotICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEZpbmFsaXplZCh0cnVlKTsKICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZWxmcmVjb3JkKCk7CiAgICAgICAgIH0KICAgICAgICAgZGVsZXRlIG1BbmFseXRpY3NJdGVtOwpAQCAtNTE5LDYgKzY0MywxOTAgQEAKICAgICB9CiB9CiAKK2Jvb2wgTWVkaWFDb2RlYzo6SGlzdG9ncmFtOjpzZXR1cChpbnQgbmJ1Y2tldHMsIGludDY0X3Qgd2lkdGgsIGludDY0X3QgZmxvb3IpCit7CisgICAgaWYgKG5idWNrZXRzIDw9IDAgfHwgd2lkdGggPD0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gZ2V0IGhpc3RvZ3JhbSBidWNrZXRzCisgICAgaWYgKG5idWNrZXRzID09IG1CdWNrZXRDb3VudCAmJiBtQnVja2V0cyAhPSBOVUxMKSB7CisgICAgICAgIC8vIHJldXNlIG91ciBleGlzdGluZyBidWZmZXIKKyAgICAgICAgbWVtc2V0KG1CdWNrZXRzLCAwLCBzaXplb2YoKm1CdWNrZXRzKSAqIG1CdWNrZXRDb3VudCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gZ2V0IGEgbmV3IHByZS16ZXJvZWQgYnVmZmVyCisgICAgICAgIGludDY0X3QgKm5ld2J1Y2tldHMgPSAoaW50NjRfdCAqKWNhbGxvYyhuYnVja2V0cywgc2l6ZW9mICgqbUJ1Y2tldHMpKTsKKyAgICAgICAgaWYgKG5ld2J1Y2tldHMgPT0gTlVMTCkgeworICAgICAgICAgICAgZ290byBiYWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1CdWNrZXRzICE9IE5VTEwpCisgICAgICAgICAgICBmcmVlKG1CdWNrZXRzKTsKKyAgICAgICAgbUJ1Y2tldHMgPSBuZXdidWNrZXRzOworICAgIH0KKworICAgIG1XaWR0aCA9IHdpZHRoOworICAgIG1GbG9vciA9IGZsb29yOworICAgIG1DZWlsaW5nID0gZmxvb3IgKyBuYnVja2V0cyAqIHdpZHRoOworICAgIG1CdWNrZXRDb3VudCA9IG5idWNrZXRzOworCisgICAgbU1pbiA9IElOVDY0X01BWDsKKyAgICBtTWF4ID0gSU5UNjRfTUlOOworICAgIG1TdW0gPSAwOworICAgIG1Db3VudCA9IDA7CisgICAgbUJlbG93ID0gbUFib3ZlID0gMDsKKworICAgIHJldHVybiB0cnVlOworCisgIGJhZDoKKyAgICBpZiAobUJ1Y2tldHMgIT0gTlVMTCkgeworICAgICAgICBmcmVlKG1CdWNrZXRzKTsKKyAgICAgICAgbUJ1Y2tldHMgPSBOVUxMOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBNZWRpYUNvZGVjOjpIaXN0b2dyYW06Omluc2VydChpbnQ2NF90IHNhbXBsZSkKK3sKKyAgICAvLyBoaXN0b2dyYW0gaXMgbm90IHNldCB1cAorICAgIGlmIChtQnVja2V0cyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtQ291bnQrKzsKKyAgICBtU3VtICs9IHNhbXBsZTsKKyAgICBpZiAobU1pbiA+IHNhbXBsZSkgbU1pbiA9IHNhbXBsZTsKKyAgICBpZiAobU1heCA8IHNhbXBsZSkgbU1heCA9IHNhbXBsZTsKKworICAgIGlmIChzYW1wbGUgPCBtRmxvb3IpIHsKKyAgICAgICAgbUJlbG93Kys7CisgICAgfSBlbHNlIGlmIChzYW1wbGUgPj0gbUNlaWxpbmcpIHsKKyAgICAgICAgbUFib3ZlKys7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50NjRfdCBzbG90ID0gKHNhbXBsZSAtIG1GbG9vcikgLyBtV2lkdGg7CisgICAgICAgIENIRUNLKHNsb3QgPCBtQnVja2V0Q291bnQpOworICAgICAgICBtQnVja2V0c1tzbG90XSsrOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3N0ZDo6c3RyaW5nIE1lZGlhQ29kZWM6Okhpc3RvZ3JhbTo6ZW1pdCgpCit7CisgICAgc3RkOjpzdHJpbmcgdmFsdWU7CisgICAgY2hhciBidWZmZXJbNjRdOworCisgICAgLy8gZW1pdHM6ICB3aWR0aCxCZWxvd3tidWNrZXQwLGJ1Y2tldDEsLi4uLiwgYnVja2V0Tn1hYm92ZQorICAgIC8vIHVuY29uZmlndXJlZCB3aWxsIGVtaXQ6IDAsMHt9MAorICAgIC8vIFhYWDogaXMgdGhpcyBiZXN0IHJlcHJlc2VudGF0aW9uPworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIlIiBQUklkNjQgIiwlIiBQUklkNjQgIiwlIiBQUklkNjQgInsiLAorICAgICAgICAgICAgIG1GbG9vciwgbVdpZHRoLCBtQmVsb3cpOworICAgIHZhbHVlID0gYnVmZmVyOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUJ1Y2tldENvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKGkgIT0gMCkgeworICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSArICIsIjsKKyAgICAgICAgfQorICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiJSIgUFJJZDY0LCBtQnVja2V0c1tpXSk7CisgICAgICAgIHZhbHVlID0gdmFsdWUgKyBidWZmZXI7CisgICAgfQorICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICJ9JSIgUFJJZDY0ICwgbUFib3ZlKTsKKyAgICB2YWx1ZSA9IHZhbHVlICsgYnVmZmVyOworICAgIHJldHVybiB2YWx1ZTsKK30KKworLy8gd2hlbiB3ZSBzZW5kIGEgYnVmZmVyIHRvIHRoZSBjb2RlYzsKK3ZvaWQgTWVkaWFDb2RlYzo6c3RhdHNCdWZmZXJTZW50KGludDY0X3QgcHJlc2VudGF0aW9uVXMpIHsKKworICAgIC8vIG9ubHkgZW5xdWV1ZSBpZiB3ZSBoYXZlIGEgbGVnaXRpbWF0ZSB0aW1lCisgICAgaWYgKHByZXNlbnRhdGlvblVzIDw9IDApIHsKKyAgICAgICAgQUxPR1YoInByZXNlbnRhdGlvbiB0aW1lOiAlIiBQUklkNjQsIHByZXNlbnRhdGlvblVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IGludDY0X3Qgbm93TnMgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7CisgICAgQnVmZmVyRmxpZ2h0VGltaW5nX3Qgc3RhcnRkYXRhID0geyBwcmVzZW50YXRpb25Vcywgbm93TnMgfTsKKworICAgIHsKKyAgICAgICAgLy8gbXV0ZXggYWNjZXNzIHRvIG1CdWZmZXJzSW5GbGlnaHQgYW5kIG90aGVyIHN0YXRzCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhbChtTGF0ZW5jeUxvY2spOworCisKKyAgICAgICAgLy8gWFhYOiB3ZSAqY291bGQqIG1ha2Ugc3VyZSB0aGF0IHRoZSB0aW1lIGlzIGxhdGVyIHRoYW4gdGhlIGVuZCBvZiBxdWV1ZQorICAgICAgICAvLyBhcyBwYXJ0IG9mIGEgY29uc2lzdGVuY3kgY2hlY2suLi4KKyAgICAgICAgbUJ1ZmZlcnNJbkZsaWdodC5wdXNoX2JhY2soc3RhcnRkYXRhKTsKKyAgICB9Cit9CisKKy8vIHdoZW4gd2UgZ2V0IGEgYnVmZmVyIGJhY2sgZnJvbSB0aGUgY29kZWMKK3ZvaWQgTWVkaWFDb2RlYzo6c3RhdHNCdWZmZXJSZWNlaXZlZChpbnQ2NF90IHByZXNlbnRhdGlvblVzKSB7CisKKyAgICBDSEVDS19ORShtU3RhdGUsIFVOSU5JVElBTElaRUQpOworCisgICAgLy8gbXV0ZXggYWNjZXNzIHRvIG1CdWZmZXJzSW5GbGlnaHQgYW5kIG90aGVyIHN0YXRzCisgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1MYXRlbmN5TG9jayk7CisKKyAgICAvLyBob3cgbG9uZyB0aGlzIGJ1ZmZlciB0b29rIGZvciB0aGUgcm91bmQgdHJpcCB0aHJvdWdoIHRoZSBjb2RlYworICAgIC8vIE5COiBwaXBlbGluaW5nIGNhbi93aWxsIG1ha2UgdGhlc2UgdGltZXMgbGFyZ2VyLiBlLmcuLCBpZiBlYWNoIHBhY2tldAorICAgIC8vIGlzIGFsd2F5cyAyIG1zZWMgYW5kIHdlIGhhdmUgMyBpbiBmbGlnaHQgYXQgYW55IGdpdmVuIHRpbWUsIHdlJ3JlIGdvaW5nIHRvCisgICAgLy8gc2VlICI2IG1zZWMiIGFzIGFuIGFuc3dlci4KKworICAgIC8vIGlnbm9yZSBzdHVmZiB3aXRoIG5vIHByZXNlbnRhdGlvbiB0aW1lCisgICAgaWYgKHByZXNlbnRhdGlvblVzIDw9IDApIHsKKyAgICAgICAgQUxPR1YoIi0tIHJldHVybmVkIGJ1ZmZlciB0aW1lc3RhbXAgJSIgUFJJZDY0ICIgPD0gMCwgaWdub3JlIGl0IiwgcHJlc2VudGF0aW9uVXMpOworICAgICAgICBtTGF0ZW5jeVVua25vd24rKzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEJ1ZmZlckZsaWdodFRpbWluZ190IHN0YXJ0ZGF0YTsKKyAgICBib29sIHZhbGlkID0gZmFsc2U7CisgICAgd2hpbGUgKG1CdWZmZXJzSW5GbGlnaHQuc2l6ZSgpID4gMCkgeworICAgICAgICBzdGFydGRhdGEgPSAqbUJ1ZmZlcnNJbkZsaWdodC5iZWdpbigpOworICAgICAgICBBTE9HVigiLS0gTG9va2luZyBhdCBzdGFydGRhdGEuIHByZXNlbnRhdGlvbiAlIiBQUklkNjQgIiwgc3RhcnQgJSIgUFJJZDY0LAorICAgICAgICAgICAgICBzdGFydGRhdGEucHJlc2VudGF0aW9uVXMsIHN0YXJ0ZGF0YS5zdGFydGVkTnMpOworICAgICAgICBpZiAoc3RhcnRkYXRhLnByZXNlbnRhdGlvblVzID09IHByZXNlbnRhdGlvblVzKSB7CisgICAgICAgICAgICAvLyBhIG1hdGNoCisgICAgICAgICAgICBBTE9HVigiLS0gbWF0Y2ggZW50cnkgZm9yICUiIFBSSWQ2NCAiLCBoaXRzIG91ciBmcmFtZSBvZiAlIiBQUklkNjQsCisgICAgICAgICAgICAgICAgICBzdGFydGRhdGEucHJlc2VudGF0aW9uVXMsIHByZXNlbnRhdGlvblVzKTsKKyAgICAgICAgICAgIG1CdWZmZXJzSW5GbGlnaHQucG9wX2Zyb250KCk7CisgICAgICAgICAgICB2YWxpZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmIChzdGFydGRhdGEucHJlc2VudGF0aW9uVXMgPCBwcmVzZW50YXRpb25VcykgeworICAgICAgICAgICAgLy8gd2UgbXVzdCBoYXZlIG1pc3NlZCB0aGUgbWF0Y2ggZm9yIHRoaXMsIGRyb3AgaXQgYW5kIGtlZXAgbG9va2luZworICAgICAgICAgICAgQUxPR1YoIi0tICBkcm9wIGVudHJ5IGZvciAlIiBQUklkNjQgIiwgYmVmb3JlIG91ciBmcmFtZSBvZiAlIiBQUklkNjQsCisgICAgICAgICAgICAgICAgICBzdGFydGRhdGEucHJlc2VudGF0aW9uVXMsIHByZXNlbnRhdGlvblVzKTsKKyAgICAgICAgICAgIG1CdWZmZXJzSW5GbGlnaHQucG9wX2Zyb250KCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGhlYWQgaXMgYWZ0ZXIsIHNvIHdlIGRvbid0IGhhdmUgYSBmcmFtZSBmb3Igb3Vyc2VsdmVzCisgICAgICAgICAgICBBTE9HVigiLS0gIGZvdW5kIGVudHJ5IGZvciAlIiBQUklkNjQgIiwgQUZURVIgb3VyIGZyYW1lIG9mICUiIFBSSWQ2NAorICAgICAgICAgICAgICAgICAgIiB3ZSBoYXZlIG5vdGhpbmcgdG8gcGFpciB3aXRoIiwKKyAgICAgICAgICAgICAgICAgIHN0YXJ0ZGF0YS5wcmVzZW50YXRpb25VcywgcHJlc2VudGF0aW9uVXMpOworICAgICAgICAgICAgbUxhdGVuY3lVbmtub3duKys7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCF2YWxpZCkgeworICAgICAgICBBTE9HVigiLS0gZW1wdHkgcXVldWUsIHNvIGlnbm9yZSB0aGF0LiIpOworICAgICAgICBtTGF0ZW5jeVVua25vd24rKzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIG5vd05zIHN0YXJ0IG91ciBjYWxjdWxhdGlvbnMKKyAgICBjb25zdCBpbnQ2NF90IG5vd05zID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOworICAgIGludDY0X3QgbGF0ZW5jeVVzID0gKG5vd05zIC0gc3RhcnRkYXRhLnN0YXJ0ZWROcyArIDUwMCkgLyAxMDAwOworCisgICAgbUxhdGVuY3lIaXN0Lmluc2VydChsYXRlbmN5VXMpOworCisgICAgLy8gcHVzaCBpbnRvIHRoZSByZWNlbnQgc2FtcGxlcworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1SZWNlbnRMb2NrKTsKKworICAgICAgICBpZiAobVJlY2VudEhlYWQgPj0ga1JlY2VudExhdGVuY3lGcmFtZXMpIHsKKyAgICAgICAgICAgIG1SZWNlbnRIZWFkID0gMDsKKyAgICAgICAgfQorICAgICAgICBtUmVjZW50U2FtcGxlc1ttUmVjZW50SGVhZCsrXSA9IGxhdGVuY3lVczsKKyAgICB9Cit9CisKIC8vIHN0YXRpYwogc3RhdHVzX3QgTWVkaWFDb2RlYzo6UG9zdEFuZEF3YWl0UmVzcG9uc2UoCiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBzcDxBTWVzc2FnZT4gKnJlc3BvbnNlKSB7CkBAIC01NDcsMTAgKzg1NSwxNiBAQAogICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CiB9CiAKK3N0YXRpYyBDb2RlY0Jhc2UgKkNyZWF0ZUNDb2RlYygpIHsKKyAgICByZXR1cm4gU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXI6OkdldENDb2RlY0luc3RhbmNlKCktPmNyZWF0ZUNvZGVjKCk7Cit9CisKIC8vc3RhdGljCi1zcDxDb2RlY0Jhc2U+IE1lZGlhQ29kZWM6OkdldENvZGVjQmFzZShjb25zdCBBU3RyaW5nICZuYW1lLCBib29sIG5hbWVJc1R5cGUpIHsKLSAgICAvLyBhdCB0aGlzIHRpbWUgb25seSBBQ29kZWMgc3BlY2lmaWVzIGEgbWltZSB0eXBlLgotICAgIGlmIChuYW1lSXNUeXBlIHx8IG5hbWUuc3RhcnRzV2l0aElnbm9yZUNhc2UoIm9teC4iKSkgeworc3A8Q29kZWNCYXNlPiBNZWRpYUNvZGVjOjpHZXRDb2RlY0Jhc2UoY29uc3QgQVN0cmluZyAmbmFtZSkgeworICAgIGlmIChuYW1lLnN0YXJ0c1dpdGhJZ25vcmVDYXNlKCJjMi4iKSkgeworICAgICAgICByZXR1cm4gQ3JlYXRlQ0NvZGVjKCk7CisgICAgfSBlbHNlIGlmIChuYW1lLnN0YXJ0c1dpdGhJZ25vcmVDYXNlKCJvbXguIikpIHsKKyAgICAgICAgLy8gYXQgdGhpcyB0aW1lIG9ubHkgQUNvZGVjIHNwZWNpZmllcyBhIG1pbWUgdHlwZS4KICAgICAgICAgcmV0dXJuIG5ldyBBQ29kZWM7CiAgICAgfSBlbHNlIGlmIChuYW1lLnN0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhbmRyb2lkLmZpbHRlci4iKSkgewogICAgICAgICByZXR1cm4gbmV3IE1lZGlhRmlsdGVyOwpAQCAtNTU5LDUwICs4NzMsNTMgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IE1lZGlhQ29kZWM6OmluaXQoY29uc3QgQVN0cmluZyAmbmFtZSwgYm9vbCBuYW1lSXNUeXBlLCBib29sIGVuY29kZXIpIHsKK3N0YXR1c190IE1lZGlhQ29kZWM6OmluaXQoY29uc3QgQVN0cmluZyAmbmFtZSkgewogICAgIG1SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLT5pbml0KCk7CiAKICAgICAvLyBzYXZlIGluaXQgcGFyYW1ldGVycyBmb3IgcmVzZXQKICAgICBtSW5pdE5hbWUgPSBuYW1lOwotICAgIG1Jbml0TmFtZUlzVHlwZSA9IG5hbWVJc1R5cGU7Ci0gICAgbUluaXRJc0VuY29kZXIgPSBlbmNvZGVyOwogCiAgICAgLy8gQ3VycmVudCB2aWRlbyBkZWNvZGVycyBkbyBub3QgcmV0dXJuIGZyb20gT01YX0ZpbGxUaGlzQnVmZmVyCiAgICAgLy8gcXVpY2tseSwgdmlvbGF0aW5nIHRoZSBPcGVuTUFYIHNwZWNzLCB1bnRpbCB0aGF0IGlzIHJlbWVkaWVkCiAgICAgLy8gd2UgbmVlZCB0byBpbnZlc3QgaW4gYW4gZXh0cmEgbG9vcGVyIHRvIGZyZWUgdGhlIG1haW4gZXZlbnQKICAgICAvLyBxdWV1ZS4KIAotICAgIG1Db2RlYyA9IEdldENvZGVjQmFzZShuYW1lLCBuYW1lSXNUeXBlKTsKKyAgICBtQ29kZWMgPSBHZXRDb2RlY0Jhc2UobmFtZSk7CiAgICAgaWYgKG1Db2RlYyA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKICAgICB9CiAKKyAgICBtQ29kZWNJbmZvLmNsZWFyKCk7CisKICAgICBib29sIHNlY3VyZUNvZGVjID0gZmFsc2U7Ci0gICAgaWYgKG5hbWVJc1R5cGUgJiYgIXN0cm5jYXNlY21wKG5hbWUuY19zdHIoKSwgInZpZGVvLyIsIDYpKSB7Ci0gICAgICAgIG1Jc1ZpZGVvID0gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBBU3RyaW5nIHRtcCA9IG5hbWU7Ci0gICAgICAgIGlmICh0bXAuZW5kc1dpdGgoIi5zZWN1cmUiKSkgewotICAgICAgICAgICAgc2VjdXJlQ29kZWMgPSB0cnVlOwotICAgICAgICAgICAgdG1wLmVyYXNlKHRtcC5zaXplKCkgLSA3LCA3KTsKKyAgICBBU3RyaW5nIHRtcCA9IG5hbWU7CisgICAgaWYgKHRtcC5lbmRzV2l0aCgiLnNlY3VyZSIpKSB7CisgICAgICAgIHNlY3VyZUNvZGVjID0gdHJ1ZTsKKyAgICAgICAgdG1wLmVyYXNlKHRtcC5zaXplKCkgLSA3LCA3KTsKKyAgICB9CisgICAgY29uc3Qgc3A8SU1lZGlhQ29kZWNMaXN0PiBtY2wgPSBNZWRpYUNvZGVjTGlzdDo6Z2V0SW5zdGFuY2UoKTsKKyAgICBpZiAobWNsID09IE5VTEwpIHsKKyAgICAgICAgbUNvZGVjID0gTlVMTDsgIC8vIHJlbW92ZSB0aGUgY29kZWMuCisgICAgICAgIHJldHVybiBOT19JTklUOyAvLyBpZiBjYWxsZWQgZnJvbSBKYXZhIHNob3VsZCByYWlzZSBJT0V4Y2VwdGlvbgorICAgIH0KKyAgICBmb3IgKGNvbnN0IEFTdHJpbmcgJmNvZGVjTmFtZSA6IHsgbmFtZSwgdG1wIH0pIHsKKyAgICAgICAgc3NpemVfdCBjb2RlY0lkeCA9IG1jbC0+ZmluZENvZGVjQnlOYW1lKGNvZGVjTmFtZS5jX3N0cigpKTsKKyAgICAgICAgaWYgKGNvZGVjSWR4IDwgMCkgeworICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3A8SU1lZGlhQ29kZWNMaXN0PiBtY2wgPSBNZWRpYUNvZGVjTGlzdDo6Z2V0SW5zdGFuY2UoKTsKLSAgICAgICAgaWYgKG1jbCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBtQ29kZWMgPSBOVUxMOyAgLy8gcmVtb3ZlIHRoZSBjb2RlYy4KLSAgICAgICAgICAgIHJldHVybiBOT19JTklUOyAvLyBpZiBjYWxsZWQgZnJvbSBKYXZhIHNob3VsZCByYWlzZSBJT0V4Y2VwdGlvbgotICAgICAgICB9Ci0gICAgICAgIHNzaXplX3QgY29kZWNJZHggPSBtY2wtPmZpbmRDb2RlY0J5TmFtZSh0bXAuY19zdHIoKSk7Ci0gICAgICAgIGlmIChjb2RlY0lkeCA+PSAwKSB7Ci0gICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjSW5mbz4gaW5mbyA9IG1jbC0+Z2V0Q29kZWNJbmZvKGNvZGVjSWR4KTsKLSAgICAgICAgICAgIFZlY3RvcjxBU3RyaW5nPiBtaW1lczsKLSAgICAgICAgICAgIGluZm8tPmdldFN1cHBvcnRlZE1pbWVzKCZtaW1lcyk7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1pbWVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1pbWVzW2ldLnN0YXJ0c1dpdGgoInZpZGVvLyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Jc1ZpZGVvID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICBtQ29kZWNJbmZvID0gbWNsLT5nZXRDb2RlY0luZm8oY29kZWNJZHgpOworICAgICAgICBWZWN0b3I8QVN0cmluZz4gbWltZXM7CisgICAgICAgIG1Db2RlY0luZm8tPmdldFN1cHBvcnRlZE1pbWVzKCZtaW1lcyk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWltZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChtaW1lc1tpXS5zdGFydHNXaXRoKCJ2aWRlby8iKSkgeworICAgICAgICAgICAgICAgIG1Jc1ZpZGVvID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKG1Db2RlY0luZm8gPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CiAgICAgfQogCiAgICAgaWYgKG1Jc1ZpZGVvKSB7CkBAIC02MjksMjMgKzk0NiwxNCBAQAogICAgICAgICAgICAgICAgICAgICBuZXcgQnVmZmVyQ2FsbGJhY2sobmV3IEFNZXNzYWdlKGtXaGF0Q29kZWNOb3RpZnksIHRoaXMpKSkpOwogCiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEluaXQsIHRoaXMpOworICAgIG1zZy0+c2V0T2JqZWN0KCJjb2RlY0luZm8iLCBtQ29kZWNJbmZvKTsKKyAgICAvLyBuYW1lIG1heSBiZSBkaWZmZXJlbnQgZnJvbSBtQ29kZWNJbmZvLT5nZXRDb2RlY05hbWUoKSBpZiB3ZSBzdHJpcHBlZAorICAgIC8vICIuc2VjdXJlIgogICAgIG1zZy0+c2V0U3RyaW5nKCJuYW1lIiwgbmFtZSk7Ci0gICAgbXNnLT5zZXRJbnQzMigibmFtZUlzVHlwZSIsIG5hbWVJc1R5cGUpOwotCi0gICAgaWYgKG5hbWVJc1R5cGUpIHsKLSAgICAgICAgbXNnLT5zZXRJbnQzMigiZW5jb2RlciIsIGVuY29kZXIpOwotICAgIH0KIAogICAgIGlmIChtQW5hbHl0aWNzSXRlbSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChuYW1lSXNUeXBlKSB7Ci0gICAgICAgICAgICAvLyBuYW1lIGlzIHRoZSBtaW1lIHR5cGUKLSAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtDb2RlY01pbWUsIG5hbWUuY19zdHIoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrQ29kZWNDb2RlYywgbmFtZS5jX3N0cigpKTsKLSAgICAgICAgfQotICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrQ29kZWNNb2RlLCBtSXNWaWRlbyA/ICJ2aWRlbyIgOiAiYXVkaW8iKTsKLSAgICAgICAgaWYgKG5hbWVJc1R5cGUpCi0gICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0NvZGVjRW5jb2RlciwgZW5jb2Rlcik7CisgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtDb2RlY0NvZGVjLCBuYW1lLmNfc3RyKCkpOworICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrQ29kZWNNb2RlLCBtSXNWaWRlbyA/IGtDb2RlY01vZGVWaWRlbyA6IGtDb2RlY01vZGVBdWRpbyk7CiAgICAgfQogCiAgICAgc3RhdHVzX3QgZXJyOwpAQCAtNzExLDYgKzEwMTksNyBAQAogICAgICAgICBpZiAoZm9ybWF0LT5maW5kSW50MzIoImxldmVsIiwgJmxldmVsKSkgewogICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtDb2RlY0xldmVsLCBsZXZlbCk7CiAgICAgICAgIH0KKyAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtDb2RlY0VuY29kZXIsIChmbGFncyAmIENPTkZJR1VSRV9GTEFHX0VOQ09ERSkgPyAxIDogMCk7CiAgICAgfQogCiAgICAgaWYgKG1Jc1ZpZGVvKSB7CkBAIC03MzUsOCArMTA0NCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBQcmV2ZW50IHBvc3NpYmxlIGludGVnZXIgb3ZlcmZsb3cgaW4gZG93bnN0cmVhbSBjb2RlLgotICAgICAgICBpZiAobUluaXRJc0VuY29kZXIKLSAgICAgICAgICAgICAgICAmJiAodWludDY0X3QpbVZpZGVvV2lkdGggKiBtVmlkZW9IZWlnaHQgPiAodWludDY0X3QpSU5UMzJfTUFYIC8gNCkgeworICAgICAgICBpZiAoKHVpbnQ2NF90KW1WaWRlb1dpZHRoICogbVZpZGVvSGVpZ2h0ID4gKHVpbnQ2NF90KUlOVDMyX01BWCAvIDQpIHsKICAgICAgICAgICAgIEFMT0dFKCJidWZmZXIgc2l6ZSBpcyB0b28gYmlnLCB3aWR0aD0lZCwgaGVpZ2h0PSVkIiwgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CkBAIC03NTMsNyArMTA2MSw2IEBACiAgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoImRlc2NyYW1ibGVyIiwgZGVzY3JhbWJsZXIuZ2V0KCkpOwogICAgICAgICB9CiAgICAgICAgIGlmIChtQW5hbHl0aWNzSXRlbSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAvLyBYWFg6IHNhdmUgaW5kaWNhdGlvbiB0aGF0IGl0J3MgY3J5cHRvIGluIHNvbWUgd2F5Li4uCiAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0NvZGVjQ3J5cHRvLCAxKTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAobUZsYWdzICYga0ZsYWdJc1NlY3VyZSkgewpAQCAtMTAxNSw3ICsxMzIyLDcgQEAKICAgICBtSGF2ZUlucHV0U3VyZmFjZSA9IGZhbHNlOwogCiAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICBlcnIgPSBpbml0KG1Jbml0TmFtZSwgbUluaXROYW1lSXNUeXBlLCBtSW5pdElzRW5jb2Rlcik7CisgICAgICAgIGVyciA9IGluaXQobUluaXROYW1lKTsKICAgICB9CiAgICAgcmV0dXJuIGVycjsKIH0KQEAgLTExOTUsNiArMTUwMiwyMiBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgTWVkaWFDb2RlYzo6Z2V0Q29kZWNJbmZvKHNwPE1lZGlhQ29kZWNJbmZvPiAqY29kZWNJbmZvKSBjb25zdCB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEdldENvZGVjSW5mbywgdGhpcyk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3QgZXJyOworICAgIGlmICgoZXJyID0gUG9zdEFuZEF3YWl0UmVzcG9uc2UobXNnLCAmcmVzcG9uc2UpKSAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICBDSEVDSyhyZXNwb25zZS0+ZmluZE9iamVjdCgiY29kZWNJbmZvIiwgJm9iaikpOworICAgICpjb2RlY0luZm8gPSBzdGF0aWNfY2FzdDxNZWRpYUNvZGVjSW5mbyAqPihvYmouZ2V0KCkpOworCisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBNZWRpYUNvZGVjOjpnZXRNZXRyaWNzKE1lZGlhQW5hbHl0aWNzSXRlbSAqICZyZXBseSkgewogCiAgICAgcmVwbHkgPSBOVUxMOwpAQCAtMTIwNCwxMSArMTUyNywxNCBAQAogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CiAKLSAgICAvLyBYWFg6IGdvIGdldCBjdXJyZW50IHZhbHVlcyBmb3Igd2hhdGV2ZXIgaW4tZmxpZ2h0IGRhdGEgd2Ugd2FudAorICAgIC8vIHVwZGF0ZSBhbnkgaW4tZmxpZ2h0IGRhdGEgdGhhdCdzIG5vdCBjYXJyaWVkIHdpdGhpbiB0aGUgcmVjb3JkCisgICAgdXBkYXRlQW5hbHl0aWNzSXRlbSgpOwogCiAgICAgLy8gc2VuZCBpdCBiYWNrIHRvIHRoZSBjYWxsZXIuCiAgICAgcmVwbHkgPSBtQW5hbHl0aWNzSXRlbS0+ZHVwKCk7CiAKKyAgICB1cGRhdGVFcGhlbWVyYWxBbmFseXRpY3MocmVwbHkpOworCiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0xMzE5LDYgKzE2NDUsMzEgQEAKICAgICBtc2ctPnBvc3QoKTsKIH0KIAordm9pZCBNZWRpYUNvZGVjOjpyZXF1ZXN0Q3B1Qm9vc3RJZk5lZWRlZCgpIHsKKyAgICBpZiAobUNwdUJvb3N0UmVxdWVzdGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW50MzJfdCBjb2xvckZvcm1hdDsKKyAgICBpZiAobVNvZnRSZW5kZXJlciAhPSBOVUxMCisgICAgICAgICAgICAmJiBtT3V0cHV0Rm9ybWF0LT5jb250YWlucygiaGRyLXN0YXRpYy1pbmZvIikKKyAgICAgICAgICAgICYmIG1PdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJmNvbG9yRm9ybWF0KQorICAgICAgICAgICAgJiYgKGNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIxNikpIHsKKyAgICAgICAgaW50MzJfdCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIHdpZHRoLCBoZWlnaHQ7CisgICAgICAgIGludDY0X3QgdG90YWxQaXhlbCA9IDA7CisgICAgICAgIGlmIChtT3V0cHV0Rm9ybWF0LT5maW5kUmVjdCgiY3JvcCIsICZsZWZ0LCAmdG9wLCAmcmlnaHQsICZib3R0b20pKSB7CisgICAgICAgICAgICB0b3RhbFBpeGVsID0gKHJpZ2h0IC0gbGVmdCArIDEpICogKGJvdHRvbSAtIHRvcCArIDEpOworICAgICAgICB9IGVsc2UgaWYgKG1PdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpCisgICAgICAgICAgICAgICAgJiYgbU91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSkgeworICAgICAgICAgICAgdG90YWxQaXhlbCA9IHdpZHRoICogaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIGlmICh0b3RhbFBpeGVsID49IDE5MjAgKiAxMDgwKSB7CisgICAgICAgICAgICBhZGRSZXNvdXJjZShNZWRpYVJlc291cmNlOjprQ3B1Qm9vc3QsCisgICAgICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OmtVbnNwZWNpZmllZFN1YlR5cGUsIDEpOworICAgICAgICAgICAgbUNwdUJvb3N0UmVxdWVzdGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KKwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogdm9pZCBNZWRpYUNvZGVjOjpjYW5jZWxQZW5kaW5nRGVxdWV1ZU9wZXJhdGlvbnMoKSB7CkBAIC0xMzk0LDYgKzE3NDUsOCBAQAogICAgICAgICBpbnQ2NF90IHRpbWVVczsKICAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwogCisgICAgICAgIHN0YXRzQnVmZmVyUmVjZWl2ZWQodGltZVVzKTsKKwogICAgICAgICByZXNwb25zZS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CiAKICAgICAgICAgaW50MzJfdCBmbGFnczsKQEAgLTE0NDAsNyArMTc5Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbkNvZGUgPT0gQUNUSU9OX0NPREVfRkFUQUwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtDb2RlY0Vycm9yLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0NvZGVjRXJyb3JTdGF0ZSwgbVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoa0NvZGVjRXJyb3JTdGF0ZSwgc3RhdGVTdHJpbmcobVN0YXRlKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmx1c2hBbmFseXRpY3NJdGVtKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRBbmFseXRpY3NJdGVtKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTQ1Myw3ICsxODA2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uQ29kZSA9PSBBQ1RJT05fQ09ERV9GQVRBTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0NvZGVjRXJyb3IsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQ29kZWNFcnJvclN0YXRlLCBtU3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrQ29kZWNFcnJvclN0YXRlLCBzdGF0ZVN0cmluZyhtU3RhdGUpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbHVzaEFuYWx5dGljc0l0ZW0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdEFuYWx5dGljc0l0ZW0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC0xNDk0LDcgKzE4NDcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb25Db2RlID09IEFDVElPTl9DT0RFX0ZBVEFMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQ29kZWNFcnJvciwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtDb2RlY0Vycm9yU3RhdGUsIG1TdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtDb2RlY0Vycm9yU3RhdGUsIHN0YXRlU3RyaW5nKG1TdGF0ZSkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoQW5hbHl0aWNzSXRlbSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0QW5hbHl0aWNzSXRlbSgpOwogCkBAIC0xNTI3LDcgKzE4ODAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0NvZGVjRXJyb3IsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQ29kZWNFcnJvclN0YXRlLCBtU3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrQ29kZWNFcnJvclN0YXRlLCBzdGF0ZVN0cmluZyhtU3RhdGUpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbHVzaEFuYWx5dGljc0l0ZW0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdEFuYWx5dGljc0l0ZW0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoVU5JTklUSUFMSVpFRCk7CkBAIC0xODI3LDEyICsyMTgwLDIwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1cmZhY2UuZ2V0KCksIChhbmRyb2lkX2RhdGFzcGFjZSlkYXRhU3BhY2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HV19JRihlcnIgIT0gMCwgImZhaWxlZCB0byBzZXQgZGF0YXNwYWNlIG9uIHN1cmZhY2UgKCVkKSIsIGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtT3V0cHV0Rm9ybWF0LT5jb250YWlucygiaGRyLXN0YXRpYy1pbmZvIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSERSU3RhdGljSW5mbyBpbmZvOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ29sb3JVdGlsczo6Z2V0SERSU3RhdGljSW5mb0Zyb21Gb3JtYXQobU91dHB1dEZvcm1hdCwgJmluZm8pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXROYXRpdmVXaW5kb3dIZHJNZXRhZGF0YShtU3VyZmFjZS5nZXQoKSwgJmluZm8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1pbWUuc3RhcnRzV2l0aElnbm9yZUNhc2UoInZpZGVvLyIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Tb2Z0UmVuZGVyZXIgPSBuZXcgU29mdHdhcmVSZW5kZXJlcihtU3VyZmFjZSwgbVJvdGF0aW9uRGVncmVlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Q3B1Qm9vc3RJZk5lZWRlZCgpOworCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUZsYWdzICYga0ZsYWdJc0VuY29kZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCZWZvcmUgd2UgYW5ub3VuY2UgdGhlIGZvcm1hdCBjaGFuZ2Ugd2Ugc2hvdWxkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCBjb2RlYyBzcGVjaWZpYyBkYXRhIGFuZCBhbWVuZCB0aGUgb3V0cHV0CkBAIC0xODQ5LDcgKzIyMTAsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQotCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUZsYWdzICYga0ZsYWdJc0FzeW5jKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25PdXRwdXRGb3JtYXRDaGFuZ2VkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMTk1NywyNCArMjMxNywxNCBAQAogICAgICAgICAgICAgbVJlcGx5SUQgPSByZXBseUlEOwogICAgICAgICAgICAgc2V0U3RhdGUoSU5JVElBTElaSU5HKTsKIAorICAgICAgICAgICAgc3A8UmVmQmFzZT4gY29kZWNJbmZvOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJjb2RlY0luZm8iLCAmY29kZWNJbmZvKSk7CiAgICAgICAgICAgICBBU3RyaW5nIG5hbWU7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTdHJpbmcoIm5hbWUiLCAmbmFtZSkpOwogCi0gICAgICAgICAgICBpbnQzMl90IG5hbWVJc1R5cGU7Ci0gICAgICAgICAgICBpbnQzMl90IGVuY29kZXIgPSBmYWxzZTsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJuYW1lSXNUeXBlIiwgJm5hbWVJc1R5cGUpKTsKLSAgICAgICAgICAgIGlmIChuYW1lSXNUeXBlKSB7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImVuY29kZXIiLCAmZW5jb2RlcikpOwotICAgICAgICAgICAgfQotCiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbmV3IEFNZXNzYWdlOwotCi0gICAgICAgICAgICBpZiAobmFtZUlzVHlwZSkgewotICAgICAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgbmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJlbmNvZGVyIiwgZW5jb2Rlcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJjb21wb25lbnROYW1lIiwgbmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvcm1hdC0+c2V0T2JqZWN0KCJjb2RlY0luZm8iLCBjb2RlY0luZm8pOworICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoImNvbXBvbmVudE5hbWUiLCBuYW1lKTsKIAogICAgICAgICAgICAgbUNvZGVjLT5pbml0aWF0ZUFsbG9jYXRlQ29tcG9uZW50KGZvcm1hdCk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTI1OTMsNiArMjk0MywxNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0R2V0Q29kZWNJbmZvOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgcmVzcG9uc2UtPnNldE9iamVjdCgiY29kZWNJbmZvIiwgbUNvZGVjSW5mbyk7CisgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIGtXaGF0U2V0UGFyYW1ldGVyczoKICAgICAgICAgewogICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CkBAIC0yODcyLDkgKzMyMzMsOCBAQAogICAgICAgICBNdXRleDo6QXV0b2xvY2sgYWwobUJ1ZmZlckxvY2spOwogICAgICAgICBpbmZvLT5tT3duZWRCeUNsaWVudCA9IGZhbHNlOwogICAgICAgICBpbmZvLT5tRGF0YS5jbGVhcigpOwotICAgICAgICBpZiAobUFuYWx5dGljc0l0ZW0gIT0gTlVMTCkgewotICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPmFkZEludDY0KGtDb2RlY0J5dGVzSW4sIHNpemUpOwotICAgICAgICB9CisKKyAgICAgICAgc3RhdHNCdWZmZXJTZW50KHRpbWVVcyk7CiAgICAgfQogCiAgICAgcmV0dXJuIGVycjsKQEAgLTI5NDIsOCArMzMwMiw4IEBACiAKICAgICAgICAgaWYgKG1Tb2Z0UmVuZGVyZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgc3RkOjpsaXN0PEZyYW1lUmVuZGVyVHJhY2tlcjo6SW5mbz4gZG9uZUZyYW1lcyA9IG1Tb2Z0UmVuZGVyZXItPnJlbmRlcigKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICBtZWRpYVRpbWVVcywgcmVuZGVyVGltZU5zLCBOVUxMLCBidWZmZXItPmZvcm1hdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpLCBtZWRpYVRpbWVVcywgcmVuZGVyVGltZU5zLAorICAgICAgICAgICAgICAgICAgICBtUG9ydEJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF0uc2l6ZSgpLCBidWZmZXItPmZvcm1hdCgpKTsKIAogICAgICAgICAgICAgLy8gaWYgd2UgYXJlIHJ1bm5pbmcsIG5vdGlmeSByZW5kZXJlZCBmcmFtZXMKICAgICAgICAgICAgIGlmICghZG9uZUZyYW1lcy5lbXB0eSgpICYmIG1TdGF0ZSA9PSBTVEFSVEVEICYmIG1PbkZyYW1lUmVuZGVyZWROb3RpZmljYXRpb24gIT0gTlVMTCkgewpAQCAtMzA5MSw2ICszNDUxLDggQEAKIAogICAgICAgICBtc2ctPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwogCisgICAgICAgIHN0YXRzQnVmZmVyUmVjZWl2ZWQodGltZVVzKTsKKwogICAgICAgICBpbnQzMl90IGZsYWdzOwogICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJmbGFncyIsICZmbGFncykpOwogCkBAIC0zMjI0LDQgKzM1ODYsMjggQEAKICAgICB9CiB9CiAKK3N0ZDo6c3RyaW5nIE1lZGlhQ29kZWM6OnN0YXRlU3RyaW5nKFN0YXRlIHN0YXRlKSB7CisgICAgY29uc3QgY2hhciAqcnZhbCA9IE5VTEw7CisgICAgY2hhciByYXdidWZmZXJbMTZdOyAvLyByb29tIGZvciAiJWQiCisKKyAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgIGNhc2UgVU5JTklUSUFMSVpFRDogcnZhbCA9ICJVTklOSVRJQUxJWkVEIjsgYnJlYWs7CisgICAgICAgIGNhc2UgSU5JVElBTElaSU5HOiBydmFsID0gIklOSVRJQUxJWklORyI7IGJyZWFrOworICAgICAgICBjYXNlIElOSVRJQUxJWkVEOiBydmFsID0gIklOSVRJQUxJWkVEIjsgYnJlYWs7CisgICAgICAgIGNhc2UgQ09ORklHVVJJTkc6IHJ2YWwgPSAiQ09ORklHVVJJTkciOyBicmVhazsKKyAgICAgICAgY2FzZSBDT05GSUdVUkVEOiBydmFsID0gIkNPTkZJR1VSRUQiOyBicmVhazsKKyAgICAgICAgY2FzZSBTVEFSVElORzogcnZhbCA9ICJTVEFSVElORyI7IGJyZWFrOworICAgICAgICBjYXNlIFNUQVJURUQ6IHJ2YWwgPSAiU1RBUlRFRCI7IGJyZWFrOworICAgICAgICBjYXNlIEZMVVNISU5HOiBydmFsID0gIkZMVVNISU5HIjsgYnJlYWs7CisgICAgICAgIGNhc2UgRkxVU0hFRDogcnZhbCA9ICJGTFVTSEVEIjsgYnJlYWs7CisgICAgICAgIGNhc2UgU1RPUFBJTkc6IHJ2YWwgPSAiU1RPUFBJTkciOyBicmVhazsKKyAgICAgICAgY2FzZSBSRUxFQVNJTkc6IHJ2YWwgPSAiUkVMRUFTSU5HIjsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBzbnByaW50ZihyYXdidWZmZXIsIHNpemVvZihyYXdidWZmZXIpLCAiJWQiLCBzdGF0ZSk7CisgICAgICAgICAgICBydmFsID0gcmF3YnVmZmVyOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBydmFsOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuY3BwCmluZGV4IDQ2NTI1OTQuLmVhZmYyODMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5jcHAKQEAgLTE5LDI4ICsxOSwyNyBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiTWVkaWFDb2RlY0xpc3RPdmVycmlkZXMuaCIKKyNpbmNsdWRlICJTdGFnZWZyaWdodFBsdWdpbkxvYWRlci5oIgogCiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogCiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhQ29kZWNMaXN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUNvZGVjU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNJbmZvLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFEZWZzLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PbXhJbmZvQnVpbGRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5oPgorI2luY2x1ZGUgPHhtbHBhcnNlci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5oPgogCiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPGV4cGF0Lmg+CiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAKQEAgLTgwLDYgKzc5LDMxIEBACiAKIE9teEluZm9CdWlsZGVyIHNPbXhJbmZvQnVpbGRlcjsKIAorTXV0ZXggc0NvZGVjMkluZm9CdWlsZGVyTXV0ZXg7CitzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0xpc3RCdWlsZGVyQmFzZT4gc0NvZGVjMkluZm9CdWlsZGVyOworCitNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlICpHZXRDb2RlYzJJbmZvQnVpbGRlcigpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2woc0NvZGVjMkluZm9CdWlsZGVyTXV0ZXgpOworICAgIGlmICghc0NvZGVjMkluZm9CdWlsZGVyKSB7CisgICAgICAgIHNDb2RlYzJJbmZvQnVpbGRlci5yZXNldCgKKyAgICAgICAgICAgICAgICBTdGFnZWZyaWdodFBsdWdpbkxvYWRlcjo6R2V0Q0NvZGVjSW5zdGFuY2UoKS0+Y3JlYXRlQnVpbGRlcigpKTsKKyAgICB9CisgICAgcmV0dXJuIHNDb2RlYzJJbmZvQnVpbGRlci5nZXQoKTsKK30KKworc3RkOjp2ZWN0b3I8TWVkaWFDb2RlY0xpc3RCdWlsZGVyQmFzZSAqPiBHZXRCdWlsZGVycygpIHsKKyAgICBzdGQ6OnZlY3RvcjxNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlICo+IGJ1aWxkZXJzOworICAgIC8vIGlmIHBsdWdpbiBwcm92aWRlcyB0aGUgaW5wdXQgc3VyZmFjZSwgd2UgY2Fubm90IHVzZSBPTVggdmlkZW8gZW5jb2RlcnMuCisgICAgLy8gSW4gdGhpcyBjYXNlLCByZWx5IG9uIHBsdWdpbiB0byBwcm92aWRlIGxpc3Qgb2YgT01YIGNvZGVjcyB0aGF0IGFyZSB1c2FibGUuCisgICAgc3A8UGVyc2lzdGVudFN1cmZhY2U+IHN1cmZhY2VUZXN0ID0KKyAgICAgICAgU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXI6OkdldENDb2RlY0luc3RhbmNlKCktPmNyZWF0ZUlucHV0U3VyZmFjZSgpOworICAgIGlmIChzdXJmYWNlVGVzdCA9PSBudWxscHRyKSB7CisgICAgICAgIGJ1aWxkZXJzLnB1c2hfYmFjaygmc09teEluZm9CdWlsZGVyKTsKKyAgICB9CisgICAgYnVpbGRlcnMucHVzaF9iYWNrKEdldENvZGVjMkluZm9CdWlsZGVyKCkpOworICAgIHJldHVybiBidWlsZGVyczsKK30KKwogfSAgLy8gdW5uYW1lZCBuYW1lc3BhY2UKIAogLy8gc3RhdGljCkBAIC05MCw3ICsxMTQsNyBAQAogICAgIEFMT0dWKCJFbnRlciBwcm9maWxlclRocmVhZFdyYXBwZXIuIik7CiAgICAgcmVtb3ZlKGtQcm9maWxpbmdSZXN1bHRzKTsgIC8vIHJlbW92ZSBwcmV2aW91cyByZXN1bHQgc28gdGhhdCBpdCB3b24ndCBiZSBsb2FkZWQgdG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG5ldyBNZWRpYUNvZGVjTGlzdAotICAgIHNwPE1lZGlhQ29kZWNMaXN0PiBjb2RlY0xpc3QobmV3IE1lZGlhQ29kZWNMaXN0KCZzT214SW5mb0J1aWxkZXIpKTsKKyAgICBzcDxNZWRpYUNvZGVjTGlzdD4gY29kZWNMaXN0KG5ldyBNZWRpYUNvZGVjTGlzdChHZXRCdWlsZGVycygpKSk7CiAgICAgaWYgKGNvZGVjTGlzdC0+aW5pdENoZWNrKCkgIT0gT0spIHsKICAgICAgICAgQUxPR1coIkZhaWxlZCB0byBjcmVhdGUgYSBuZXcgTWVkaWFDb2RlY0xpc3QsIHNraXBwaW5nIGNvZGVjIHByb2ZpbGluZy4iKTsKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CkBAIC0xMDAsNyArMTI0LDcgQEAKICAgICBBTE9HVigiQ29kZWMgcHJvZmlsaW5nIHN0YXJ0ZWQuIik7CiAgICAgcHJvZmlsZUNvZGVjcyhpbmZvcywga1Byb2ZpbGluZ1Jlc3VsdHMpOwogICAgIEFMT0dWKCJDb2RlYyBwcm9maWxpbmcgY29tcGxldGVkLiIpOwotICAgIGNvZGVjTGlzdCA9IG5ldyBNZWRpYUNvZGVjTGlzdCgmc09teEluZm9CdWlsZGVyKTsKKyAgICBjb2RlY0xpc3QgPSBuZXcgTWVkaWFDb2RlY0xpc3QoR2V0QnVpbGRlcnMoKSk7CiAgICAgaWYgKGNvZGVjTGlzdC0+aW5pdENoZWNrKCkgIT0gT0spIHsKICAgICAgICAgQUxPR1coIkZhaWxlZCB0byBwYXJzZSBwcm9maWxpbmcgcmVzdWx0cy4iKTsKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CkBAIC0xMTgsNyArMTQyLDcgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2soc0luaXRNdXRleCk7CiAKICAgICBpZiAoc0NvZGVjTGlzdCA9PSBudWxscHRyKSB7Ci0gICAgICAgIE1lZGlhQ29kZWNMaXN0ICpjb2RlY0xpc3QgPSBuZXcgTWVkaWFDb2RlY0xpc3QoJnNPbXhJbmZvQnVpbGRlcik7CisgICAgICAgIE1lZGlhQ29kZWNMaXN0ICpjb2RlY0xpc3QgPSBuZXcgTWVkaWFDb2RlY0xpc3QoR2V0QnVpbGRlcnMoKSk7CiAgICAgICAgIGlmIChjb2RlY0xpc3QtPmluaXRDaGVjaygpID09IE9LKSB7CiAgICAgICAgICAgICBzQ29kZWNMaXN0ID0gY29kZWNMaXN0OwogCkBAIC0xNzEsMTEgKzE5NSwzNCBAQAogICAgIHJldHVybiBzUmVtb3RlTGlzdDsKIH0KIAotTWVkaWFDb2RlY0xpc3Q6Ok1lZGlhQ29kZWNMaXN0KE1lZGlhQ29kZWNMaXN0QnVpbGRlckJhc2UqIGJ1aWxkZXIpIHsKK01lZGlhQ29kZWNMaXN0OjpNZWRpYUNvZGVjTGlzdChzdGQ6OnZlY3RvcjxNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlKj4gYnVpbGRlcnMpIHsKICAgICBtR2xvYmFsU2V0dGluZ3MgPSBuZXcgQU1lc3NhZ2UoKTsKICAgICBtQ29kZWNJbmZvcy5jbGVhcigpOwotICAgIE1lZGlhQ29kZWNMaXN0V3JpdGVyIHdyaXRlcih0aGlzKTsKLSAgICBtSW5pdENoZWNrID0gYnVpbGRlci0+YnVpbGRNZWRpYUNvZGVjTGlzdCgmd3JpdGVyKTsKKyAgICBNZWRpYUNvZGVjTGlzdFdyaXRlciB3cml0ZXI7CisgICAgZm9yIChNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlICpidWlsZGVyIDogYnVpbGRlcnMpIHsKKyAgICAgICAgaWYgKGJ1aWxkZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0QoImlnbm9yZWQgYSBudWxsIGJ1aWxkZXIiKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIG1Jbml0Q2hlY2sgPSBidWlsZGVyLT5idWlsZE1lZGlhQ29kZWNMaXN0KCZ3cml0ZXIpOworICAgICAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgd3JpdGVyLndyaXRlR2xvYmFsU2V0dGluZ3MobUdsb2JhbFNldHRpbmdzKTsKKyAgICB3cml0ZXIud3JpdGVDb2RlY0luZm9zKCZtQ29kZWNJbmZvcyk7CisgICAgc3RkOjpzdGFibGVfc29ydCgKKyAgICAgICAgICAgIG1Db2RlY0luZm9zLmJlZ2luKCksCisgICAgICAgICAgICBtQ29kZWNJbmZvcy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiAmaW5mbzEsIGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiAmaW5mbzIpIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5mbzIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbmZvMSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmZvMS0+cmFuaygpIDwgaW5mbzItPnJhbmsoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKIH0KIAogTWVkaWFDb2RlY0xpc3Q6On5NZWRpYUNvZGVjTGlzdCgpIHsKQEAgLTE4NSwyMyArMjMyLDYgQEAKICAgICByZXR1cm4gbUluaXRDaGVjazsKIH0KIAotTWVkaWFDb2RlY0xpc3RXcml0ZXI6Ok1lZGlhQ29kZWNMaXN0V3JpdGVyKE1lZGlhQ29kZWNMaXN0KiBsaXN0KSA6Ci0gICAgbUxpc3QobGlzdCkgewotfQotCi12b2lkIE1lZGlhQ29kZWNMaXN0V3JpdGVyOjphZGRHbG9iYWxTZXR0aW5nKAotICAgICAgICBjb25zdCBjaGFyKiBrZXksIGNvbnN0IGNoYXIqIHZhbHVlKSB7Ci0gICAgbUxpc3QtPm1HbG9iYWxTZXR0aW5ncy0+c2V0U3RyaW5nKGtleSwgdmFsdWUpOwotfQotCi1zdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm9Xcml0ZXI+Ci0gICAgICAgIE1lZGlhQ29kZWNMaXN0V3JpdGVyOjphZGRNZWRpYUNvZGVjSW5mbygpIHsKLSAgICBzcDxNZWRpYUNvZGVjSW5mbz4gaW5mbyA9IG5ldyBNZWRpYUNvZGVjSW5mbygpOwotICAgIG1MaXN0LT5tQ29kZWNJbmZvcy5wdXNoX2JhY2soaW5mbyk7Ci0gICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mb1dyaXRlcj4oCi0gICAgICAgICAgICBuZXcgTWVkaWFDb2RlY0luZm9Xcml0ZXIoaW5mby5nZXQoKSkpOwotfQotCiAvLyBsZWdhY3kgbWV0aG9kIGZvciBub24tYWR2YW5jZWQgY29kZWNzCiBzc2l6ZV90IE1lZGlhQ29kZWNMaXN0OjpmaW5kQ29kZWNCeVR5cGUoCiAgICAgICAgIGNvbnN0IGNoYXIgKnR5cGUsIGJvb2wgZW5jb2Rlciwgc2l6ZV90IHN0YXJ0SW5kZXgpIGNvbnN0IHsKQEAgLTI2Miw3ICsyOTIsOSBAQAogLy9zdGF0aWMKIGJvb2wgTWVkaWFDb2RlY0xpc3Q6OmlzU29mdHdhcmVDb2RlYyhjb25zdCBBU3RyaW5nICZjb21wb25lbnROYW1lKSB7CiAgICAgcmV0dXJuIGNvbXBvbmVudE5hbWUuc3RhcnRzV2l0aElnbm9yZUNhc2UoIk9NWC5nb29nbGUuIikKLSAgICAgICAgfHwgIWNvbXBvbmVudE5hbWUuc3RhcnRzV2l0aElnbm9yZUNhc2UoIk9NWC4iKTsKKyAgICAgICAgICAgIHx8IGNvbXBvbmVudE5hbWUuc3RhcnRzV2l0aElnbm9yZUNhc2UoImMyLmFuZHJvaWQuIikKKyAgICAgICAgICAgIHx8ICghY29tcG9uZW50TmFtZS5zdGFydHNXaXRoSWdub3JlQ2FzZSgiT01YLiIpCisgICAgICAgICAgICAgICAgICAgICYmICFjb21wb25lbnROYW1lLnN0YXJ0c1dpdGhJZ25vcmVDYXNlKCJjMi4iKSk7CiB9CiAKIHN0YXRpYyBpbnQgY29tcGFyZVNvZnR3YXJlQ29kZWNzRmlyc3QoY29uc3QgQVN0cmluZyAqbmFtZTEsIGNvbnN0IEFTdHJpbmcgKm5hbWUyKSB7CkBAIC0yNzMsNyArMzA1LDE0IEBACiAgICAgICAgIHJldHVybiBpc1NvZnR3YXJlQ29kZWMyIC0gaXNTb2Z0d2FyZUNvZGVjMTsKICAgICB9CiAKLSAgICAvLyBzb3J0IG9yZGVyIDI6IE9NWCBjb2RlY3MgYXJlIGZpcnN0IChsb3dlcikKKyAgICAvLyBzb3J0IG9yZGVyIDI6IENvZGVjIDIuMCBjb2RlY3MgYXJlIGZpcnN0IChsb3dlcikKKyAgICBib29sIGlzQzJfMSA9IG5hbWUxLT5zdGFydHNXaXRoSWdub3JlQ2FzZSgiYzIuIik7CisgICAgYm9vbCBpc0MyXzIgPSBuYW1lMi0+c3RhcnRzV2l0aElnbm9yZUNhc2UoImMyLiIpOworICAgIGlmIChpc0MyXzEgIT0gaXNDMl8yKSB7CisgICAgICAgIHJldHVybiBpc0MyXzIgLSBpc0MyXzE7CisgICAgfQorCisgICAgLy8gc29ydCBvcmRlciAzOiBPTVggY29kZWNzIGFyZSBmaXJzdCAobG93ZXIpCiAgICAgYm9vbCBpc09NWDEgPSBuYW1lMS0+c3RhcnRzV2l0aElnbm9yZUNhc2UoIk9NWC4iKTsKICAgICBib29sIGlzT01YMiA9IG5hbWUyLT5zdGFydHNXaXRoSWdub3JlQ2FzZSgiT01YLiIpOwogICAgIHJldHVybiBpc09NWDIgLSBpc09NWDE7CkBAIC0yODIsMTEgKzMyMSw4IEBACiAvL3N0YXRpYwogdm9pZCBNZWRpYUNvZGVjTGlzdDo6ZmluZE1hdGNoaW5nQ29kZWNzKAogICAgICAgICBjb25zdCBjaGFyICptaW1lLCBib29sIGVuY29kZXIsIHVpbnQzMl90IGZsYWdzLAotICAgICAgICBWZWN0b3I8QVN0cmluZz4gKm1hdGNoZXMsIFZlY3RvcjxBU3RyaW5nPiAqb3duZXJzKSB7CisgICAgICAgIFZlY3RvcjxBU3RyaW5nPiAqbWF0Y2hlcykgewogICAgIG1hdGNoZXMtPmNsZWFyKCk7Ci0gICAgaWYgKG93bmVycyAhPSBudWxscHRyKSB7Ci0gICAgICAgIG93bmVycy0+Y2xlYXIoKTsKLSAgICB9CiAKICAgICBjb25zdCBzcDxJTWVkaWFDb2RlY0xpc3Q+IGxpc3QgPSBnZXRJbnN0YW5jZSgpOwogICAgIGlmIChsaXN0ID09IG51bGxwdHIpIHsKQEAgLTMxMiw5ICszNDgsNiBAQAogICAgICAgICAgICAgQUxPR1YoInNraXBwaW5nIFNXIGNvZGVjICclcyciLCBjb21wb25lbnROYW1lLmNfc3RyKCkpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbWF0Y2hlcy0+cHVzaChjb21wb25lbnROYW1lKTsKLSAgICAgICAgICAgIGlmIChvd25lcnMgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIG93bmVycy0+cHVzaChBU3RyaW5nKGluZm8tPmdldE93bmVyTmFtZSgpKSk7Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICBBTE9HVigibWF0Y2hpbmcgJyVzJyIsIGNvbXBvbmVudE5hbWUuY19zdHIoKSk7CiAgICAgICAgIH0KICAgICB9CkBAIC0zMjUsNyArMzU4LDQgQEAKICAgICB9CiB9CiAKLU1lZGlhQ29kZWNMaXN0QnVpbGRlckJhc2U6On5NZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlKCkgewotfQotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RPdmVycmlkZXMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RPdmVycmlkZXMuY3BwCmluZGV4IDY5MjBlNTEuLmNhYzUzZjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5jcHAKQEAgLTIyMiw3ICsyMjIsNyBAQAogICAgIEFTdHJpbmcgc3VwcG9ydE11bHRpcGxlU2VjdXJlQ29kZWNzID0gInRydWUiOwogICAgIGZvciAoY29uc3QgYXV0byYgaW5mbyA6IGluZm9zKSB7CiAgICAgICAgIEFTdHJpbmcgbmFtZSA9IGluZm8tPmdldENvZGVjTmFtZSgpOwotICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKCJPTVguZ29vZ2xlLiIpIHx8CisgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoIk9NWC5nb29nbGUuIikgfHwgbmFtZS5zdGFydHNXaXRoKCJjMi5hbmRyb2lkLiIpIHx8CiAgICAgICAgICAgICAgICAgLy8gVE9ETzogcmVlbmFibGUgYmVsb3cgY29kZWNzIG9uY2UgZml4ZWQKICAgICAgICAgICAgICAgICBuYW1lID09ICJPTVguSW50ZWwuVmlkZW9EZWNvZGVyLlZQOS5oeWJyaWQiKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0V3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0V3JpdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzJlNDcwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RXcml0ZXIuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFDb2RlY0xpc3RXcml0ZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RXcml0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjSW5mby5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3ZvaWQgTWVkaWFDb2RlY0xpc3RXcml0ZXI6OmFkZEdsb2JhbFNldHRpbmcoCisgICAgICAgIGNvbnN0IGNoYXIqIGtleSwgY29uc3QgY2hhciogdmFsdWUpIHsKKyAgICBtR2xvYmFsU2V0dGluZ3MuZW1wbGFjZV9iYWNrKGtleSwgdmFsdWUpOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm9Xcml0ZXI+CisgICAgICAgIE1lZGlhQ29kZWNMaXN0V3JpdGVyOjphZGRNZWRpYUNvZGVjSW5mbygpIHsKKyAgICBzcDxNZWRpYUNvZGVjSW5mbz4gaW5mbyA9IG5ldyBNZWRpYUNvZGVjSW5mbygpOworICAgIG1Db2RlY0luZm9zLnB1c2hfYmFjayhpbmZvKTsKKyAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvV3JpdGVyPigKKyAgICAgICAgICAgIG5ldyBNZWRpYUNvZGVjSW5mb1dyaXRlcihpbmZvLmdldCgpKSk7Cit9CisKK3ZvaWQgTWVkaWFDb2RlY0xpc3RXcml0ZXI6OndyaXRlR2xvYmFsU2V0dGluZ3MoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZ2xvYmFsU2V0dGluZ3MpIGNvbnN0IHsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+ICZrdiA6IG1HbG9iYWxTZXR0aW5ncykgeworICAgICAgICBnbG9iYWxTZXR0aW5ncy0+c2V0U3RyaW5nKGt2LmZpcnN0LmNfc3RyKCksIGt2LnNlY29uZC5jX3N0cigpKTsKKyAgICB9Cit9CisKK3ZvaWQgTWVkaWFDb2RlY0xpc3RXcml0ZXI6OndyaXRlQ29kZWNJbmZvcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3A8TWVkaWFDb2RlY0luZm8+PiAqY29kZWNJbmZvcykgY29uc3QgeworICAgIGZvciAoY29uc3Qgc3A8TWVkaWFDb2RlY0luZm8+ICZpbmZvIDogbUNvZGVjSW5mb3MpIHsKKyAgICAgICAgY29kZWNJbmZvcy0+cHVzaF9iYWNrKGluZm8pOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5jcHAKaW5kZXggZDgwOGU1Yi4uMjA4ODFhNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5jcHAKQEAgLTIzLDcgKzIzLDkgQEAKICNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhQnVmZmVySG9sZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KQEAgLTMzLDcgKzM1LDYgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogCkBAIC01OCw3ICs1OSw3IEBACiAgICAgdm9pZCBwYXVzZSgpOwogICAgIHZvaWQgcmVzdW1lKCk7CiAgICAgc3RhdHVzX3Qgc2V0U3RvcFRpbWVVcyhpbnQ2NF90IHN0b3BUaW1lVXMpOwotICAgIGJvb2wgcmVhZEJ1ZmZlcihNZWRpYUJ1ZmZlciAqKmJ1ZmZlcik7CisgICAgYm9vbCByZWFkQnVmZmVyKE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlcik7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwpAQCAtODUsMTQgKzg2LDE0IEBACiAgICAgICAgIGludDY0X3QgbVJlYWRQZW5kaW5nU2luY2U7CiAgICAgICAgIGJvb2wgbVBhdXNlZDsKICAgICAgICAgYm9vbCBtUHVsbGluZzsKLSAgICAgICAgVmVjdG9yPE1lZGlhQnVmZmVyICo+IG1SZWFkQnVmZmVyczsKKyAgICAgICAgVmVjdG9yPE1lZGlhQnVmZmVyQmFzZSAqPiBtUmVhZEJ1ZmZlcnM7CiAKICAgICAgICAgdm9pZCBmbHVzaCgpOwogICAgICAgICAvLyBpZiBxdWV1ZSBpcyBlbXB0eSwgcmV0dXJuIGZhbHNlIGFuZCBzZXQgKnxidWZmZXJ8IHRvIE5VTEwgLiBPdGhlcndpc2UsIHBvcAogICAgICAgICAvLyBidWZmZXIgZnJvbSBmcm9udCBvZiB0aGUgcXVldWUsIHBsYWNlIGl0IGludG8gKnxidWZmZXJ8IGFuZCByZXR1cm4gdHJ1ZS4KLSAgICAgICAgYm9vbCByZWFkQnVmZmVyKE1lZGlhQnVmZmVyICoqYnVmZmVyKTsKKyAgICAgICAgYm9vbCByZWFkQnVmZmVyKE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlcik7CiAgICAgICAgIC8vIGFkZCBhIGJ1ZmZlciB0byB0aGUgYmFjayBvZiB0aGUgcXVldWUKLSAgICAgICAgdm9pZCBwdXNoQnVmZmVyKE1lZGlhQnVmZmVyICptYnVmKTsKKyAgICAgICAgdm9pZCBwdXNoQnVmZmVyKE1lZGlhQnVmZmVyQmFzZSAqbWJ1Zik7CiAgICAgfTsKICAgICBNdXRleGVkPFF1ZXVlPiBtUXVldWU7CiAKQEAgLTEyMiwxMSArMTIzLDExIEBACiAgICAgbUxvb3Blci0+c3RvcCgpOwogfQogCi12b2lkIE1lZGlhQ29kZWNTb3VyY2U6OlB1bGxlcjo6UXVldWU6OnB1c2hCdWZmZXIoTWVkaWFCdWZmZXIgKm1idWYpIHsKK3ZvaWQgTWVkaWFDb2RlY1NvdXJjZTo6UHVsbGVyOjpRdWV1ZTo6cHVzaEJ1ZmZlcihNZWRpYUJ1ZmZlckJhc2UgKm1idWYpIHsKICAgICBtUmVhZEJ1ZmZlcnMucHVzaF9iYWNrKG1idWYpOwogfQogCi1ib29sIE1lZGlhQ29kZWNTb3VyY2U6OlB1bGxlcjo6UXVldWU6OnJlYWRCdWZmZXIoTWVkaWFCdWZmZXIgKiptYnVmKSB7Citib29sIE1lZGlhQ29kZWNTb3VyY2U6OlB1bGxlcjo6UXVldWU6OnJlYWRCdWZmZXIoTWVkaWFCdWZmZXJCYXNlICoqbWJ1ZikgewogICAgIGlmIChtUmVhZEJ1ZmZlcnMuZW1wdHkoKSkgewogICAgICAgICAqbWJ1ZiA9IE5VTEw7CiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTEzNywxNCArMTM4LDE0IEBACiB9CiAKIHZvaWQgTWVkaWFDb2RlY1NvdXJjZTo6UHVsbGVyOjpRdWV1ZTo6Zmx1c2goKSB7Ci0gICAgTWVkaWFCdWZmZXIgKm1idWY7CisgICAgTWVkaWFCdWZmZXJCYXNlICptYnVmOwogICAgIHdoaWxlIChyZWFkQnVmZmVyKCZtYnVmKSkgewogICAgICAgICAvLyB0aGVyZSBhcmUgbm8gbnVsbCBidWZmZXJzIGluIHRoZSBxdWV1ZQogICAgICAgICBtYnVmLT5yZWxlYXNlKCk7CiAgICAgfQogfQogCi1ib29sIE1lZGlhQ29kZWNTb3VyY2U6OlB1bGxlcjo6cmVhZEJ1ZmZlcihNZWRpYUJ1ZmZlciAqKm1idWYpIHsKK2Jvb2wgTWVkaWFDb2RlY1NvdXJjZTo6UHVsbGVyOjpyZWFkQnVmZmVyKE1lZGlhQnVmZmVyQmFzZSAqKm1idWYpIHsKICAgICBNdXRleGVkPFF1ZXVlPjo6TG9ja2VkIHF1ZXVlKG1RdWV1ZSk7CiAgICAgcmV0dXJuIHF1ZXVlLT5yZWFkQnVmZmVyKG1idWYpOwogfQpAQCAtMjk3LDcgKzI5OCw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHF1ZXVlLnVubG9jaygpOwotICAgICAgICAgICAgTWVkaWFCdWZmZXIgKm1idWYgPSBOVUxMOworICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICptYnVmID0gTlVMTDsKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1Tb3VyY2UtPnJlYWQoJm1idWYpOwogICAgICAgICAgICAgcXVldWUubG9jaygpOwogCkBAIC00MTIsNyArNDEzLDcgQEAKIH0KIAogc3RhdHVzX3QgTWVkaWFDb2RlY1NvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXIqKiBidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zKiAvKiBvcHRpb25zICovKSB7CisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSoqIGJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMqIC8qIG9wdGlvbnMgKi8pIHsKICAgICBNdXRleGVkPE91dHB1dD46OkxvY2tlZCBvdXRwdXQobU91dHB1dCk7CiAKICAgICAqYnVmZmVyID0gTlVMTDsKQEAgLTQyNyw3ICs0MjgsNyBAQAogICAgIHJldHVybiBvdXRwdXQtPm1FcnJvckNvZGU7CiB9CiAKLXZvaWQgTWVkaWFDb2RlY1NvdXJjZTo6c2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgewordm9pZCBNZWRpYUNvZGVjU291cmNlOjpzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcikgewogICAgIGJ1ZmZlci0+c2V0T2JzZXJ2ZXIoMCk7CiAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiB9CkBAIC00NTcsMTMgKzQ1OCw2IEBACiAgICAgICBtR2VuZXJhdGlvbigwKSB7CiAgICAgQ0hFQ0sobUxvb3BlciAhPSBOVUxMKTsKIAotICAgIEFTdHJpbmcgbWltZTsKLSAgICBDSEVDSyhtT3V0cHV0Rm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKLQotICAgIGlmICghc3RybmNhc2VjbXAoInZpZGVvLyIsIG1pbWUuY19zdHIoKSwgNikpIHsKLSAgICAgICAgbUlzVmlkZW8gPSB0cnVlOwotICAgIH0KLQogICAgIGlmICghKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpKSB7CiAgICAgICAgIG1QdWxsZXIgPSBuZXcgUHVsbGVyKHNvdXJjZSk7CiAgICAgfQpAQCAtNDg3LDYgKzQ4MSw3IEBACiB9CiAKIHN0YXR1c190IE1lZGlhQ29kZWNTb3VyY2U6OmluaXRFbmNvZGVyKCkgeworCiAgICAgbVJlZmxlY3RvciA9IG5ldyBBSGFuZGxlclJlZmxlY3RvcjxNZWRpYUNvZGVjU291cmNlPih0aGlzKTsKICAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobVJlZmxlY3Rvcik7CiAKQEAgLTUwMCwyMyArNDk1LDEyIEBACiAKICAgICBBU3RyaW5nIG91dHB1dE1JTUU7CiAgICAgQ0hFQ0sobU91dHB1dEZvcm1hdC0+ZmluZFN0cmluZygibWltZSIsICZvdXRwdXRNSU1FKSk7CisgICAgbUlzVmlkZW8gPSBvdXRwdXRNSU1FLnN0YXJ0c1dpdGhJZ25vcmVDYXNlKCJ2aWRlby8iKTsKIAotICAgIFZlY3RvcjxBU3RyaW5nPiBtYXRjaGluZ0NvZGVjczsKLSAgICBNZWRpYUNvZGVjTGlzdDo6ZmluZE1hdGNoaW5nQ29kZWNzKAotICAgICAgICAgICAgb3V0cHV0TUlNRS5jX3N0cigpLCB0cnVlIC8qIGVuY29kZXIgKi8sCi0gICAgICAgICAgICAoKG1GbGFncyAmIEZMQUdfUFJFRkVSX1NPRlRXQVJFX0NPREVDKSA/IE1lZGlhQ29kZWNMaXN0OjprUHJlZmVyU29mdHdhcmVDb2RlY3MgOiAwKSwKLSAgICAgICAgICAgICZtYXRjaGluZ0NvZGVjcyk7Ci0KKyAgICBBU3RyaW5nIG5hbWU7CiAgICAgc3RhdHVzX3QgZXJyID0gTk9fSU5JVDsKLSAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgbWF0Y2hpbmdDb2RlY3Muc2l6ZSgpOyArK2l4KSB7Ci0gICAgICAgIG1FbmNvZGVyID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lKAotICAgICAgICAgICAgICAgIG1Db2RlY0xvb3BlciwgbWF0Y2hpbmdDb2RlY3NbaXhdKTsKLQotICAgICAgICBpZiAobUVuY29kZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBBTE9HVigib3V0cHV0IGZvcm1hdCBpcyAnJXMnIiwgbU91dHB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoMCkuY19zdHIoKSk7CisgICAgaWYgKG1PdXRwdXRGb3JtYXQtPmZpbmRTdHJpbmcoInRlc3RpbmctbmFtZSIsICZuYW1lKSkgeworICAgICAgICBtRW5jb2RlciA9IE1lZGlhQ29kZWM6OkNyZWF0ZUJ5Q29tcG9uZW50TmFtZShtQ29kZWNMb29wZXIsIG5hbWUpOwogCiAgICAgICAgIG1FbmNvZGVyQWN0aXZpdHlOb3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRFbmNvZGVyQWN0aXZpdHksIG1SZWZsZWN0b3IpOwogICAgICAgICBtRW5jb2Rlci0+c2V0Q2FsbGJhY2sobUVuY29kZXJBY3Rpdml0eU5vdGlmeSk7CkBAIC01MjYsMTIgKzUxMCwzOCBAQAogICAgICAgICAgICAgICAgICAgICBOVUxMIC8qIG5hdGl2ZVdpbmRvdyAqLywKICAgICAgICAgICAgICAgICAgICAgTlVMTCAvKiBjcnlwdG8gKi8sCiAgICAgICAgICAgICAgICAgICAgIE1lZGlhQ29kZWM6OkNPTkZJR1VSRV9GTEFHX0VOQ09ERSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgVmVjdG9yPEFTdHJpbmc+IG1hdGNoaW5nQ29kZWNzOworICAgICAgICBNZWRpYUNvZGVjTGlzdDo6ZmluZE1hdGNoaW5nQ29kZWNzKAorICAgICAgICAgICAgICAgIG91dHB1dE1JTUUuY19zdHIoKSwgdHJ1ZSAvKiBlbmNvZGVyICovLAorICAgICAgICAgICAgICAgICgobUZsYWdzICYgRkxBR19QUkVGRVJfU09GVFdBUkVfQ09ERUMpID8gTWVkaWFDb2RlY0xpc3Q6OmtQcmVmZXJTb2Z0d2FyZUNvZGVjcyA6IDApLAorICAgICAgICAgICAgICAgICZtYXRjaGluZ0NvZGVjcyk7CiAKLSAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBtYXRjaGluZ0NvZGVjcy5zaXplKCk7ICsraXgpIHsKKyAgICAgICAgICAgIG1FbmNvZGVyID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lKAorICAgICAgICAgICAgICAgICAgICBtQ29kZWNMb29wZXIsIG1hdGNoaW5nQ29kZWNzW2l4XSk7CisKKyAgICAgICAgICAgIGlmIChtRW5jb2RlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFMT0dWKCJvdXRwdXQgZm9ybWF0IGlzICclcyciLCBtT3V0cHV0Rm9ybWF0LT5kZWJ1Z1N0cmluZygwKS5jX3N0cigpKTsKKworICAgICAgICAgICAgbUVuY29kZXJBY3Rpdml0eU5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdEVuY29kZXJBY3Rpdml0eSwgbVJlZmxlY3Rvcik7CisgICAgICAgICAgICBtRW5jb2Rlci0+c2V0Q2FsbGJhY2sobUVuY29kZXJBY3Rpdml0eU5vdGlmeSk7CisKKyAgICAgICAgICAgIGVyciA9IG1FbmNvZGVyLT5jb25maWd1cmUoCisgICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0Rm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAvKiBuYXRpdmVXaW5kb3cgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIC8qIGNyeXB0byAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhQ29kZWM6OkNPTkZJR1VSRV9GTEFHX0VOQ09ERSk7CisKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1FbmNvZGVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtRW5jb2RlciA9IE5VTEw7CiAgICAgICAgIH0KLSAgICAgICAgbUVuY29kZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbUVuY29kZXIgPSBOVUxMOwogICAgIH0KIAogICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTYyNiw3ICs2MzYsNyBAQAogICAgICAgICBpZiAoIXJlYWNoZWRFT1MpIHsKICAgICAgICAgICAgIEFMT0dWKCJlbmNvZGVyICglcykgcmVhY2hlZCBFT1MiLCBtSXNWaWRlbyA/ICJ2aWRlbyIgOiAiYXVkaW8iKTsKICAgICAgICAgICAgIC8vIHJlbGVhc2UgYWxsIHVucmVhZCBtZWRpYSBidWZmZXJzCi0gICAgICAgICAgICBmb3IgKExpc3Q8TWVkaWFCdWZmZXIqPjo6aXRlcmF0b3IgaXQgPSBvdXRwdXQtPm1CdWZmZXJRdWV1ZS5iZWdpbigpOworICAgICAgICAgICAgZm9yIChMaXN0PE1lZGlhQnVmZmVyQmFzZSo+OjppdGVyYXRvciBpdCA9IG91dHB1dC0+bUJ1ZmZlclF1ZXVlLmJlZ2luKCk7CiAgICAgICAgICAgICAgICAgICAgIGl0ICE9IG91dHB1dC0+bUJ1ZmZlclF1ZXVlLmVuZCgpOyBpdCsrKSB7CiAgICAgICAgICAgICAgICAgKCppdCktPnJlbGVhc2UoKTsKICAgICAgICAgICAgIH0KQEAgLTY0Myw3ICs2NTMsOSBAQAogCiAgICAgaWYgKG1TdG9wcGluZyAmJiByZWFjaGVkRU9TKSB7CiAgICAgICAgIEFMT0dJKCJlbmNvZGVyICglcykgc3RvcHBlZCIsIG1Jc1ZpZGVvID8gInZpZGVvIiA6ICJhdWRpbyIpOwotICAgICAgICBtUHVsbGVyLT5zdG9wU291cmNlKCk7CisgICAgICAgIGlmIChtUHVsbGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1QdWxsZXItPnN0b3BTb3VyY2UoKTsKKyAgICAgICAgfQogICAgICAgICBBTE9HVigic291cmNlICglcykgc3RvcHBlZCIsIG1Jc1ZpZGVvID8gInZpZGVvIiA6ICJhdWRpbyIpOwogICAgICAgICAvLyBwb3N0aW5nIHJlcGx5IHRvIGV2ZXJ5b25lIHRoYXQncyB3YWl0aW5nCiAgICAgICAgIExpc3Q8c3A8QVJlcGx5VG9rZW4+Pjo6aXRlcmF0b3IgaXQ7CkBAIC02NzAsNyArNjgyLDcgQEAKIH0KIAogc3RhdHVzX3QgTWVkaWFDb2RlY1NvdXJjZTo6ZmVlZEVuY29kZXJJbnB1dEJ1ZmZlcnMoKSB7Ci0gICAgTWVkaWFCdWZmZXIqIG1idWYgPSBOVUxMOworICAgIE1lZGlhQnVmZmVyQmFzZSogbWJ1ZiA9IE5VTEw7CiAgICAgd2hpbGUgKCFtQXZhaWxFbmNvZGVySW5wdXRJbmRpY2VzLmVtcHR5KCkgJiYgbVB1bGxlci0+cmVhZEJ1ZmZlcigmbWJ1ZikpIHsKICAgICAgICAgc2l6ZV90IGJ1ZmZlckluZGV4ID0gKm1BdmFpbEVuY29kZXJJbnB1dEluZGljZXMuYmVnaW4oKTsKICAgICAgICAgbUF2YWlsRW5jb2RlcklucHV0SW5kaWNlcy5lcmFzZShtQXZhaWxFbmNvZGVySW5wdXRJbmRpY2VzLmJlZ2luKCkpOwpAQCAtNjgwLDcgKzY5Miw3IEBACiAgICAgICAgIHNpemVfdCBzaXplID0gMDsKIAogICAgICAgICBpZiAobWJ1ZiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBDSEVDSyhtYnVmLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7CisgICAgICAgICAgICBDSEVDSyhtYnVmLT5tZXRhX2RhdGEoKS5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKICAgICAgICAgICAgIGlmIChtRmlyc3RTYW1wbGVTeXN0ZW1UaW1lVXMgPCAwbGwpIHsKICAgICAgICAgICAgICAgICBtRmlyc3RTYW1wbGVTeXN0ZW1UaW1lVXMgPSBzeXN0ZW1UaW1lKCkgLyAxMDAwOwogICAgICAgICAgICAgICAgIGlmIChtUGF1c2VQZW5kaW5nKSB7CkBAIC03MDMsNyArNzE1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgbUZpcnN0U2FtcGxlVGltZVVzID0gdGltZVVzOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpbnQ2NF90IGRyaWZ0VGltZVVzID0gMDsKLSAgICAgICAgICAgICAgICBpZiAobWJ1Zi0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5RHJpZnRUaW1lLCAmZHJpZnRUaW1lVXMpCisgICAgICAgICAgICAgICAgaWYgKG1idWYtPm1ldGFfZGF0YSgpLmZpbmRJbnQ2NChrS2V5RHJpZnRUaW1lLCAmZHJpZnRUaW1lVXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAmJiBkcmlmdFRpbWVVcykgewogICAgICAgICAgICAgICAgICAgICBkcmlmdFRpbWVVcyA9IHRpbWVVcyAtIG1GaXJzdFNhbXBsZVRpbWVVcyAtIGRyaWZ0VGltZVVzOwogICAgICAgICAgICAgICAgIH0KQEAgLTcyOCw3ICs3NDAsOCBAQAogICAgICAgICAgICAgaWYgKG1Jc1ZpZGVvKSB7CiAgICAgICAgICAgICAgICAgLy8gdmlkZW8gZW5jb2RlciB3aWxsIHJlbGVhc2UgTWVkaWFCdWZmZXIgd2hlbiBkb25lCiAgICAgICAgICAgICAgICAgLy8gd2l0aCB1bmRlcmx5aW5nIGRhdGEuCi0gICAgICAgICAgICAgICAgaW5idWYtPnNldE1lZGlhQnVmZmVyQmFzZShtYnVmKTsKKyAgICAgICAgICAgICAgICBpbmJ1Zi0+bWV0YSgpLT5zZXRPYmplY3QoIm1lZGlhQnVmZmVySG9sZGVyIiwgbmV3IE1lZGlhQnVmZmVySG9sZGVyKG1idWYpKTsKKyAgICAgICAgICAgICAgICBtYnVmLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIG1idWYtPnJlbGVhc2UoKTsKICAgICAgICAgICAgIH0KQEAgLTg5Myw3ICs5MDYsNyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqbWJ1ZiA9IG5ldyBNZWRpYUJ1ZmZlcihvdXRidWYtPnNpemUoKSk7CisgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKm1idWYgPSBuZXcgTWVkaWFCdWZmZXIob3V0YnVmLT5zaXplKCkpOwogICAgICAgICAgICAgbWJ1Zi0+c2V0T2JzZXJ2ZXIodGhpcyk7CiAgICAgICAgICAgICBtYnVmLT5hZGRfcmVmKCk7CiAKQEAgLTkyNCw3ICs5MzcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RpbmdUaW1lVXMgPSAqKG1EZWNvZGluZ1RpbWVRdWV1ZS5iZWdpbigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1EZWNvZGluZ1RpbWVRdWV1ZS5lcmFzZShtRGVjb2RpbmdUaW1lUXVldWUuYmVnaW4oKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbWJ1Zi0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlEZWNvZGluZ1RpbWUsIGRlY29kaW5nVGltZVVzKTsKKyAgICAgICAgICAgICAgICAgICAgbWJ1Zi0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleURlY29kaW5nVGltZSwgZGVjb2RpbmdUaW1lVXMpOwogCiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJbdmlkZW9dIHRpbWUgJSIgUFJJZDY0ICIgdXMgKCUuMmYgc2VjcyksIGR0cy9wdHMgZGlmZiAlIiBQUklkNjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZVVzLCB0aW1lVXMgLyAxRTYsIGRlY29kaW5nVGltZVVzIC0gdGltZVVzKTsKQEAgLTkzNCwxOCArOTQ3LDE4IEBACiAgICAgICAgICAgICAgICAgICAgIENIRUNLKCFtRHJpZnRUaW1lUXVldWUuZW1wdHkoKSk7CiAgICAgICAgICAgICAgICAgICAgIGRyaWZ0VGltZVVzID0gKihtRHJpZnRUaW1lUXVldWUuYmVnaW4oKSk7CiAgICAgICAgICAgICAgICAgICAgIG1EcmlmdFRpbWVRdWV1ZS5lcmFzZShtRHJpZnRUaW1lUXVldWUuYmVnaW4oKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1idWYtPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5RHJpZnRUaW1lLCBkcmlmdFRpbWVVcyk7CisgICAgICAgICAgICAgICAgICAgIG1idWYtPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlEcmlmdFRpbWUsIGRyaWZ0VGltZVVzKTsKICNlbmRpZiAvLyBERUJVR19EUklGVF9USU1FCiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJbYXVkaW9dIHRpbWUgJSIgUFJJZDY0ICIgdXMgKCUuMmYgc2VjcyksIGRyaWZ0ICUiIFBSSWQ2NCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lVXMsIHRpbWVVcyAvIDFFNiwgZHJpZnRUaW1lVXMpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtYnVmLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7CisgICAgICAgICAgICAgICAgbWJ1Zi0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1idWYtPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgMGxsKTsKLSAgICAgICAgICAgICAgICBtYnVmLT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoa0tleUlzQ29kZWNDb25maWcsIHRydWUpOworICAgICAgICAgICAgICAgIG1idWYtPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCAwbGwpOworICAgICAgICAgICAgICAgIG1idWYtPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc0NvZGVjQ29uZmlnLCB0cnVlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChmbGFncyAmIE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX1NZTkNGUkFNRSkgewotICAgICAgICAgICAgICAgIG1idWYtPm1ldGFfZGF0YSgpLT5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIHRydWUpOworICAgICAgICAgICAgICAgIG1idWYtPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgdHJ1ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtZW1jcHkobWJ1Zi0+ZGF0YSgpLCBvdXRidWYtPmRhdGEoKSwgb3V0YnVmLT5zaXplKCkpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MWM4MmIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjk1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIk1lZGlhRXh0cmFjdG9yIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8cHdkLmg+Ci0KLSNpbmNsdWRlICJpbmNsdWRlL0FNUkV4dHJhY3Rvci5oIgotI2luY2x1ZGUgImluY2x1ZGUvTVAzRXh0cmFjdG9yLmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9NUEVHNEV4dHJhY3Rvci5oIgotI2luY2x1ZGUgImluY2x1ZGUvV0FWRXh0cmFjdG9yLmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9PZ2dFeHRyYWN0b3IuaCIKLSNpbmNsdWRlICJpbmNsdWRlL01QRUcyUFNFeHRyYWN0b3IuaCIKLSNpbmNsdWRlICJpbmNsdWRlL01QRUcyVFNFeHRyYWN0b3IuaCIKLSNpbmNsdWRlICJpbmNsdWRlL0ZMQUNFeHRyYWN0b3IuaCIKLSNpbmNsdWRlICJpbmNsdWRlL0FBQ0V4dHJhY3Rvci5oIgotI2luY2x1ZGUgImluY2x1ZGUvTWlkaUV4dHJhY3Rvci5oIgotCi0jaW5jbHVkZSAibWF0cm9za2EvTWF0cm9za2FFeHRyYWN0b3IuaCIKLQotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuaD4KLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KLQotLy8gc3RpbGwgZG9pbmcgc29tZSBvbi9vZmYgdG9nZ2xpbmcgaGVyZS4KLSNkZWZpbmUgTUVESUFfTE9HICAgICAgIDEKLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIGtleSBmb3IgbWVkaWEgc3RhdGlzdGljcwotc3RhdGljIGNvbnN0IGNoYXIgKmtLZXlFeHRyYWN0b3IgPSAiZXh0cmFjdG9yIjsKLS8vIGF0dHJzIGZvciBtZWRpYSBzdGF0aXN0aWNzCi1zdGF0aWMgY29uc3QgY2hhciAqa0V4dHJhY3Rvck1pbWUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWV4dHJhY3Rvci5taW1lIjsKLXN0YXRpYyBjb25zdCBjaGFyICprRXh0cmFjdG9yVHJhY2tzID0gImFuZHJvaWQubWVkaWEubWVkaWFleHRyYWN0b3IubnRyayI7Ci1zdGF0aWMgY29uc3QgY2hhciAqa0V4dHJhY3RvckZvcm1hdCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhZXh0cmFjdG9yLmZtdCI7Ci0KLU1lZGlhRXh0cmFjdG9yOjpNZWRpYUV4dHJhY3RvcigpIHsKLSAgICBpZiAoIUxPR19OREVCVUcpIHsKLSAgICAgICAgdWlkX3QgdWlkID0gZ2V0dWlkKCk7Ci0gICAgICAgIHN0cnVjdCBwYXNzd2QgKnB3ID0gZ2V0cHd1aWQodWlkKTsKLSAgICAgICAgQUxPR0koImV4dHJhY3RvciBjcmVhdGVkIGluIHVpZDogJWQgKCVzKSIsIGdldHVpZCgpLCBwdy0+cHdfbmFtZSk7Ci0gICAgfQotCi0gICAgbUFuYWx5dGljc0l0ZW0gPSBOVUxMOwotICAgIGlmIChNRURJQV9MT0cpIHsKLSAgICAgICAgbUFuYWx5dGljc0l0ZW0gPSBuZXcgTWVkaWFBbmFseXRpY3NJdGVtKGtLZXlFeHRyYWN0b3IpOwotICAgICAgICAodm9pZCkgbUFuYWx5dGljc0l0ZW0tPmdlbmVyYXRlU2Vzc2lvbklEKCk7Ci0gICAgfQotfQotCi1NZWRpYUV4dHJhY3Rvcjo6fk1lZGlhRXh0cmFjdG9yKCkgewotCi0gICAgLy8gbG9nIHRoZSBjdXJyZW50IHJlY29yZCwgcHJvdmlkZWQgaXQgaGFzIHNvbWUgaW5mb3JtYXRpb24gd29ydGggcmVjb3JkaW5nCi0gICAgaWYgKE1FRElBX0xPRykgewotICAgICAgICBpZiAobUFuYWx5dGljc0l0ZW0gIT0gTlVMTCkgewotICAgICAgICAgICAgaWYgKG1BbmFseXRpY3NJdGVtLT5jb3VudCgpID4gMCkgewotICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRGaW5hbGl6ZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNlbGZyZWNvcmQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobUFuYWx5dGljc0l0ZW0gIT0gTlVMTCkgewotICAgICAgICBkZWxldGUgbUFuYWx5dGljc0l0ZW07Ci0gICAgICAgIG1BbmFseXRpY3NJdGVtID0gTlVMTDsKLSAgICB9Ci19Ci0KLXNwPE1ldGFEYXRhPiBNZWRpYUV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoKSB7Ci0gICAgcmV0dXJuIG5ldyBNZXRhRGF0YTsKLX0KLQotc3RhdHVzX3QgTWVkaWFFeHRyYWN0b3I6OmdldE1ldHJpY3MoUGFyY2VsICpyZXBseSkgewotCi0gICAgaWYgKG1BbmFseXRpY3NJdGVtID09IE5VTEwgfHwgcmVwbHkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICBwb3B1bGF0ZU1ldHJpY3MoKTsKLSAgICBtQW5hbHl0aWNzSXRlbS0+d3JpdGVUb1BhcmNlbChyZXBseSk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgTWVkaWFFeHRyYWN0b3I6OnBvcHVsYXRlTWV0cmljcygpIHsKLSAgICBBTE9HVigiTWVkaWFFeHRyYWN0b3I6OnBvcHVsYXRlTWV0cmljcyIpOwotICAgIC8vIG5vcm1hbGx5IG92ZXJyaWRkZW4gaW4gc3ViY2xhc3NlcwotfQotCi11aW50MzJfdCBNZWRpYUV4dHJhY3Rvcjo6ZmxhZ3MoKSBjb25zdCB7Ci0gICAgcmV0dXJuIENBTl9TRUVLX0JBQ0tXQVJEIHwgQ0FOX1NFRUtfRk9SV0FSRCB8IENBTl9QQVVTRSB8IENBTl9TRUVLOwotfQotCi0vLyBzdGF0aWMKLXNwPElNZWRpYUV4dHJhY3Rvcj4gTWVkaWFFeHRyYWN0b3I6OkNyZWF0ZSgKLSAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgY29uc3QgY2hhciAqbWltZSkgewotICAgIEFMT0dWKCJNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRlICVzIiwgbWltZSk7Ci0KLSAgICBpZiAoIXByb3BlcnR5X2dldF9ib29sKCJtZWRpYS5zdGFnZWZyaWdodC5leHRyYWN0cmVtb3RlIiwgdHJ1ZSkpIHsKLSAgICAgICAgLy8gbG9jYWwgZXh0cmFjdG9yCi0gICAgICAgIEFMT0dXKCJjcmVhdGluZyBtZWRpYSBleHRyYWN0b3IgaW4gY2FsbGluZyBwcm9jZXNzIik7Ci0gICAgICAgIHJldHVybiBDcmVhdGVGcm9tU2VydmljZShzb3VyY2UsIG1pbWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIHJlbW90ZSBleHRyYWN0b3IKLSAgICAgICAgQUxPR1YoImdldCBzZXJ2aWNlIG1hbmFnZXIiKTsKLSAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmdldFNlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLmV4dHJhY3RvciIpKTsKLQotICAgICAgICBpZiAoYmluZGVyICE9IDApIHsKLSAgICAgICAgICAgIHNwPElNZWRpYUV4dHJhY3RvclNlcnZpY2U+IG1lZGlhRXhTZXJ2aWNlKGludGVyZmFjZV9jYXN0PElNZWRpYUV4dHJhY3RvclNlcnZpY2U+KGJpbmRlcikpOwotICAgICAgICAgICAgc3A8SU1lZGlhRXh0cmFjdG9yPiBleCA9IG1lZGlhRXhTZXJ2aWNlLT5tYWtlRXh0cmFjdG9yKHNvdXJjZS0+YXNJRGF0YVNvdXJjZSgpLCBtaW1lKTsKLSAgICAgICAgICAgIHJldHVybiBleDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJleHRyYWN0b3Igc2VydmljZSBub3QgcnVubmluZyIpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXNwPE1lZGlhRXh0cmFjdG9yPiBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRlRnJvbVNlcnZpY2UoCi0gICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUpIHsKLQotICAgIEFMT0dWKCJNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRlRnJvbVNlcnZpY2UgJXMiLCBtaW1lKTsKLSAgICBSZWdpc3RlckRlZmF1bHRTbmlmZmVycygpOwotCi0gICAgLy8gaW5pdGlhbGl6ZSBzb3VyY2UgZGVjcnlwdGlvbiBpZiBuZWVkZWQKLSAgICBzb3VyY2UtPkRybUluaXRpYWxpemF0aW9uKG51bGxwdHIgLyogbWltZSAqLyk7Ci0KLSAgICBzcDxBTWVzc2FnZT4gbWV0YTsKLQotICAgIFN0cmluZzggdG1wOwotICAgIGlmIChtaW1lID09IE5VTEwpIHsKLSAgICAgICAgZmxvYXQgY29uZmlkZW5jZTsKLSAgICAgICAgaWYgKCFzbmlmZihzb3VyY2UsICZ0bXAsICZjb25maWRlbmNlLCAmbWV0YSkpIHsKLSAgICAgICAgICAgIEFMT0dXKCJGQUlMRUQgdG8gYXV0b2RldGVjdCBtZWRpYSBjb250ZW50LiIpOwotCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIG1pbWUgPSB0bXAuc3RyaW5nKCk7Ci0gICAgICAgIEFMT0dWKCJBdXRvZGV0ZWN0ZWQgbWVkaWEgY29udGVudCBhcyAnJXMnIHdpdGggY29uZmlkZW5jZSAlLjJmIiwKLSAgICAgICAgICAgICBtaW1lLCBjb25maWRlbmNlKTsKLSAgICB9Ci0KLSAgICBNZWRpYUV4dHJhY3RvciAqcmV0ID0gTlVMTDsKLSAgICBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUc0KQotICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAobWltZSwgImF1ZGlvL21wNCIpKSB7Ci0gICAgICAgIHJldCA9IG5ldyBNUEVHNEV4dHJhY3Rvcihzb3VyY2UpOwotICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRykpIHsKLSAgICAgICAgcmV0ID0gbmV3IE1QM0V4dHJhY3Rvcihzb3VyY2UsIG1ldGEpOwotICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CKQotICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCKSkgewotICAgICAgICByZXQgPSBuZXcgQU1SRXh0cmFjdG9yKHNvdXJjZSk7Ci0gICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDKSkgewotICAgICAgICByZXQgPSBuZXcgRkxBQ0V4dHJhY3Rvcihzb3VyY2UpOwotICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX1dBVikpIHsKLSAgICAgICAgcmV0ID0gbmV3IFdBVkV4dHJhY3Rvcihzb3VyY2UpOwotICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX09HRykpIHsKLSAgICAgICAgcmV0ID0gbmV3IE9nZ0V4dHJhY3Rvcihzb3VyY2UpOwotICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01BVFJPU0tBKSkgewotICAgICAgICByZXQgPSBuZXcgTWF0cm9za2FFeHRyYWN0b3Ioc291cmNlKTsKLSAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHMlRTKSkgewotICAgICAgICByZXQgPSBuZXcgTVBFRzJUU0V4dHJhY3Rvcihzb3VyY2UpOwotICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFMpKSB7Ci0gICAgICAgIHJldCA9IG5ldyBBQUNFeHRyYWN0b3Ioc291cmNlLCBtZXRhKTsKLSAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHMlBTKSkgewotICAgICAgICByZXQgPSBuZXcgTVBFRzJQU0V4dHJhY3Rvcihzb3VyY2UpOwotICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTUlESSkpIHsKLSAgICAgICAgcmV0ID0gbmV3IE1pZGlFeHRyYWN0b3Ioc291cmNlKTsKLSAgICB9Ci0KLSAgICBpZiAocmV0ICE9IE5VTEwpIHsKLSAgICAgICAvLyB0cmFjayB0aGUgY29udGFpbmVyIGZvcm1hdCAobXBlZywgYWFjLCB3dm0sIGV0YykKLSAgICAgICBpZiAoTUVESUFfTE9HKSB7Ci0gICAgICAgICAgaWYgKHJldC0+bUFuYWx5dGljc0l0ZW0gIT0gTlVMTCkgewotICAgICAgICAgICAgICBzaXplX3QgbnRyYWNrcyA9IHJldC0+Y291bnRUcmFja3MoKTsKLSAgICAgICAgICAgICAgcmV0LT5tQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrRXh0cmFjdG9yRm9ybWF0LCAgcmV0LT5uYW1lKCkpOwotICAgICAgICAgICAgICAvLyB0cmFja3MgKHNpemVfdCkKLSAgICAgICAgICAgICAgcmV0LT5tQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0V4dHJhY3RvclRyYWNrcywgIG50cmFja3MpOwotICAgICAgICAgICAgICAvLyBtZXRhZGF0YQotICAgICAgICAgICAgICBzcDxNZXRhRGF0YT4gcE1ldGFEYXRhID0gcmV0LT5nZXRNZXRhRGF0YSgpOwotICAgICAgICAgICAgICBpZiAocE1ldGFEYXRhICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmc4IHh4ID0gcE1ldGFEYXRhLT50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIC8vICd0aXRsJyAtLSBidXQgdGhpcyB2ZXJnZXMgaW50byBQSUkKLSAgICAgICAgICAgICAgICAvLyAnbWltZScKLSAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lID0gTlVMTDsKLSAgICAgICAgICAgICAgICBpZiAocE1ldGFEYXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZXQtPm1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtFeHRyYWN0b3JNaW1lLCAgbWltZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIHdoYXQgZWxzZSBpcyBpbnRlcmVzdGluZyBhbmQgbm90IGFscmVhZHkgYXZhaWxhYmxlPwotICAgICAgICAgICAgICB9Ci0JICB9Ci0gICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXQ7Ci19Ci0KLU11dGV4IE1lZGlhRXh0cmFjdG9yOjpnU25pZmZlck11dGV4OwotTGlzdDxNZWRpYUV4dHJhY3Rvcjo6U25pZmZlckZ1bmM+IE1lZGlhRXh0cmFjdG9yOjpnU25pZmZlcnM7Ci1ib29sIE1lZGlhRXh0cmFjdG9yOjpnU25pZmZlcnNSZWdpc3RlcmVkID0gZmFsc2U7Ci0KLS8vIHN0YXRpYwotYm9vbCBNZWRpYUV4dHJhY3Rvcjo6c25pZmYoCi0gICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSwgc3A8QU1lc3NhZ2U+ICptZXRhKSB7Ci0gICAgKm1pbWVUeXBlID0gIiI7Ci0gICAgKmNvbmZpZGVuY2UgPSAwLjBmOwotICAgIG1ldGEtPmNsZWFyKCk7Ci0KLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhnU25pZmZlck11dGV4KTsKLSAgICAgICAgaWYgKCFnU25pZmZlcnNSZWdpc3RlcmVkKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKExpc3Q8U25pZmZlckZ1bmM+OjppdGVyYXRvciBpdCA9IGdTbmlmZmVycy5iZWdpbigpOwotICAgICAgICAgaXQgIT0gZ1NuaWZmZXJzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIFN0cmluZzggbmV3TWltZVR5cGU7Ci0gICAgICAgIGZsb2F0IG5ld0NvbmZpZGVuY2U7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBuZXdNZXRhOwotICAgICAgICBpZiAoKCppdCkoc291cmNlLCAmbmV3TWltZVR5cGUsICZuZXdDb25maWRlbmNlLCAmbmV3TWV0YSkpIHsKLSAgICAgICAgICAgIGlmIChuZXdDb25maWRlbmNlID4gKmNvbmZpZGVuY2UpIHsKLSAgICAgICAgICAgICAgICAqbWltZVR5cGUgPSBuZXdNaW1lVHlwZTsKLSAgICAgICAgICAgICAgICAqY29uZmlkZW5jZSA9IG5ld0NvbmZpZGVuY2U7Ci0gICAgICAgICAgICAgICAgKm1ldGEgPSBuZXdNZXRhOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuICpjb25maWRlbmNlID4gMC4wOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgTWVkaWFFeHRyYWN0b3I6OlJlZ2lzdGVyU25pZmZlcl9sKFNuaWZmZXJGdW5jIGZ1bmMpIHsKLSAgICBmb3IgKExpc3Q8U25pZmZlckZ1bmM+OjppdGVyYXRvciBpdCA9IGdTbmlmZmVycy5iZWdpbigpOwotICAgICAgICAgaXQgIT0gZ1NuaWZmZXJzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIGlmICgqaXQgPT0gZnVuYykgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZ1NuaWZmZXJzLnB1c2hfYmFjayhmdW5jKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIE1lZGlhRXh0cmFjdG9yOjpSZWdpc3RlckRlZmF1bHRTbmlmZmVycygpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2soZ1NuaWZmZXJNdXRleCk7Ci0gICAgaWYgKGdTbmlmZmVyc1JlZ2lzdGVyZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIFJlZ2lzdGVyU25pZmZlcl9sKFNuaWZmTVBFRzQpOwotICAgIFJlZ2lzdGVyU25pZmZlcl9sKFNuaWZmTWF0cm9za2EpOwotICAgIFJlZ2lzdGVyU25pZmZlcl9sKFNuaWZmT2dnKTsKLSAgICBSZWdpc3RlclNuaWZmZXJfbChTbmlmZldBVik7Ci0gICAgUmVnaXN0ZXJTbmlmZmVyX2woU25pZmZGTEFDKTsKLSAgICBSZWdpc3RlclNuaWZmZXJfbChTbmlmZkFNUik7Ci0gICAgUmVnaXN0ZXJTbmlmZmVyX2woU25pZmZNUEVHMlRTKTsKLSAgICBSZWdpc3RlclNuaWZmZXJfbChTbmlmZk1QMyk7Ci0gICAgUmVnaXN0ZXJTbmlmZmVyX2woU25pZmZBQUMpOwotICAgIFJlZ2lzdGVyU25pZmZlcl9sKFNuaWZmTVBFRzJQUyk7Ci0gICAgUmVnaXN0ZXJTbmlmZmVyX2woU25pZmZNaWRpKTsKLQotICAgIGdTbmlmZmVyc1JlZ2lzdGVyZWQgPSB0cnVlOwotfQotCi0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmM2MWEwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmNwcApAQCAtMCwwICsxLDM0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFFeHRyYWN0b3JGYWN0b3J5IgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx6aXBhcmNoaXZlL3ppcF9hcmNoaXZlLmg+CisKKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxkbGZjbi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIHN0YXRpYworc3A8SU1lZGlhRXh0cmFjdG9yPiBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OkNyZWF0ZSgKKyAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgY29uc3QgY2hhciAqbWltZSkgeworICAgIEFMT0dWKCJNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OkNyZWF0ZSAlcyIsIG1pbWUpOworCisgICAgaWYgKCFwcm9wZXJ0eV9nZXRfYm9vbCgibWVkaWEuc3RhZ2VmcmlnaHQuZXh0cmFjdHJlbW90ZSIsIHRydWUpKSB7CisgICAgICAgIC8vIGxvY2FsIGV4dHJhY3RvcgorICAgICAgICBBTE9HVygiY3JlYXRpbmcgbWVkaWEgZXh0cmFjdG9yIGluIGNhbGxpbmcgcHJvY2VzcyIpOworICAgICAgICByZXR1cm4gQ3JlYXRlRnJvbVNlcnZpY2Uoc291cmNlLCBtaW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyByZW1vdGUgZXh0cmFjdG9yCisgICAgICAgIEFMT0dWKCJnZXQgc2VydmljZSBtYW5hZ2VyIik7CisgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5leHRyYWN0b3IiKSk7CisKKyAgICAgICAgaWYgKGJpbmRlciAhPSAwKSB7CisgICAgICAgICAgICBzcDxJTWVkaWFFeHRyYWN0b3JTZXJ2aWNlPiBtZWRpYUV4U2VydmljZShpbnRlcmZhY2VfY2FzdDxJTWVkaWFFeHRyYWN0b3JTZXJ2aWNlPihiaW5kZXIpKTsKKyAgICAgICAgICAgIHNwPElNZWRpYUV4dHJhY3Rvcj4gZXggPSBtZWRpYUV4U2VydmljZS0+bWFrZUV4dHJhY3RvcigKKyAgICAgICAgICAgICAgICAgICAgQ3JlYXRlSURhdGFTb3VyY2VGcm9tRGF0YVNvdXJjZShzb3VyY2UpLCBtaW1lKTsKKyAgICAgICAgICAgIHJldHVybiBleDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJleHRyYWN0b3Igc2VydmljZSBub3QgcnVubmluZyIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3NwPElNZWRpYUV4dHJhY3Rvcj4gTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpDcmVhdGVGcm9tU2VydmljZSgKKyAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgY29uc3QgY2hhciAqbWltZSkgeworCisgICAgQUxPR1YoIk1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Q3JlYXRlRnJvbVNlcnZpY2UgJXMiLCBtaW1lKTsKKworICAgIFVwZGF0ZUV4dHJhY3RvcnMobnVsbHB0cik7CisKKyAgICAvLyBpbml0aWFsaXplIHNvdXJjZSBkZWNyeXB0aW9uIGlmIG5lZWRlZAorICAgIHNvdXJjZS0+RHJtSW5pdGlhbGl6YXRpb24obnVsbHB0ciAvKiBtaW1lICovKTsKKworICAgIHZvaWQgKm1ldGEgPSBudWxscHRyOworICAgIE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyBjcmVhdG9yID0gTlVMTDsKKyAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jIGZyZWVNZXRhID0gbnVsbHB0cjsKKyAgICBmbG9hdCBjb25maWRlbmNlOworICAgIHNwPEV4dHJhY3RvclBsdWdpbj4gcGx1Z2luOworICAgIGNyZWF0b3IgPSBzbmlmZihzb3VyY2UuZ2V0KCksICZjb25maWRlbmNlLCAmbWV0YSwgJmZyZWVNZXRhLCBwbHVnaW4pOworICAgIGlmICghY3JlYXRvcikgeworICAgICAgICBBTE9HVigiRkFJTEVEIHRvIGF1dG9kZXRlY3QgbWVkaWEgY29udGVudC4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgTWVkaWFFeHRyYWN0b3IgKnJldCA9IGNyZWF0b3Ioc291cmNlLmdldCgpLCBtZXRhKTsKKyAgICBpZiAobWV0YSAhPSBudWxscHRyICYmIGZyZWVNZXRhICE9IG51bGxwdHIpIHsKKyAgICAgICAgZnJlZU1ldGEobWV0YSk7CisgICAgfQorCisgICAgQUxPR1YoIkNyZWF0ZWQgYW4gZXh0cmFjdG9yICclcycgd2l0aCBjb25maWRlbmNlICUuMmYiLAorICAgICAgICAgcmV0ICE9IG51bGxwdHIgPyByZXQtPm5hbWUoKSA6ICI8bnVsbD4iLCBjb25maWRlbmNlKTsKKworICAgIHJldHVybiBDcmVhdGVJTWVkaWFFeHRyYWN0b3JGcm9tTWVkaWFFeHRyYWN0b3IocmV0LCBzb3VyY2UsIHBsdWdpbik7Cit9CisKKy8vc3RhdGljCit2b2lkIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6TG9hZFBsdWdpbnMoY29uc3QgOjpzdGQ6OnN0cmluZyYgYXBrUGF0aCkgeworICAgIC8vIFRPRE86IFZlcmlmeSBhcGsgcGF0aCB3aXRoIHBhY2thZ2UgbWFuYWdlciBpbiBleHRyYWN0b3IgcHJvY2Vzcy4KKyAgICBBTE9HVigiTG9hZCBwbHVnaW5zIGZyb206ICVzIiwgYXBrUGF0aC5jX3N0cigpKTsKKyAgICBVcGRhdGVFeHRyYWN0b3JzKGFwa1BhdGguZW1wdHkoKSA/IG51bGxwdHIgOiBhcGtQYXRoLmNfc3RyKCkpOworfQorCitzdHJ1Y3QgRXh0cmFjdG9yUGx1Z2luIDogcHVibGljIFJlZkJhc2UgeworICAgIE1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgZGVmOworICAgIHZvaWQgKmxpYkhhbmRsZTsKKyAgICBTdHJpbmc4IGxpYlBhdGg7CisgICAgU3RyaW5nOCB1dWlkU3RyaW5nOworCisgICAgRXh0cmFjdG9yUGx1Z2luKE1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgZGVmaW5pdGlvbiwgdm9pZCAqaGFuZGxlLCBTdHJpbmc4ICZwYXRoKQorICAgICAgICA6IGRlZihkZWZpbml0aW9uKSwgbGliSGFuZGxlKGhhbmRsZSksIGxpYlBhdGgocGF0aCkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZiBNZWRpYUV4dHJhY3Rvcjo6RXh0cmFjdG9yRGVmOjpleHRyYWN0b3JfdXVpZDsgaSsrKSB7CisgICAgICAgICAgICB1dWlkU3RyaW5nLmFwcGVuZEZvcm1hdCgiJTAyeCIsIGRlZi5leHRyYWN0b3JfdXVpZC5iW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB+RXh0cmFjdG9yUGx1Z2luKCkgeworICAgICAgICBpZiAobGliSGFuZGxlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dWKCJjbG9zaW5nIGhhbmRsZSBmb3IgJXMgJWQiLCBsaWJQYXRoLmNfc3RyKCksIGRlZi5leHRyYWN0b3JfdmVyc2lvbik7CisgICAgICAgICAgICBkbGNsb3NlKGxpYkhhbmRsZSk7CisgICAgICAgIH0KKyAgICB9Cit9OworCitNdXRleCBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OmdQbHVnaW5NdXRleDsKK3N0ZDo6c2hhcmVkX3B0cjxMaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+PiBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OmdQbHVnaW5zOworYm9vbCBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OmdQbHVnaW5zUmVnaXN0ZXJlZCA9IGZhbHNlOworCisvLyBzdGF0aWMKK01lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OnNuaWZmKAorICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSwgdm9pZCAqKm1ldGEsCisgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKmZyZWVNZXRhLCBzcDxFeHRyYWN0b3JQbHVnaW4+ICZwbHVnaW4pIHsKKyAgICAqY29uZmlkZW5jZSA9IDAuMGY7CisgICAgKm1ldGEgPSBudWxscHRyOworCisgICAgc3RkOjpzaGFyZWRfcHRyPExpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4+IHBsdWdpbnM7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2soZ1BsdWdpbk11dGV4KTsKKyAgICAgICAgaWYgKCFnUGx1Z2luc1JlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHBsdWdpbnMgPSBnUGx1Z2luczsKKyAgICB9CisKKyAgICBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgY3VyQ3JlYXRvciA9IE5VTEw7CisgICAgTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIGJlc3RDcmVhdG9yID0gTlVMTDsKKyAgICBmb3IgKGF1dG8gaXQgPSBwbHVnaW5zLT5iZWdpbigpOyBpdCAhPSBwbHVnaW5zLT5lbmQoKTsgKytpdCkgeworICAgICAgICBmbG9hdCBuZXdDb25maWRlbmNlOworICAgICAgICB2b2lkICpuZXdNZXRhID0gbnVsbHB0cjsKKyAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyBuZXdGcmVlTWV0YSA9IG51bGxwdHI7CisgICAgICAgIGlmICgoY3VyQ3JlYXRvciA9ICgqaXQpLT5kZWYuc25pZmYoc291cmNlLCAmbmV3Q29uZmlkZW5jZSwgJm5ld01ldGEsICZuZXdGcmVlTWV0YSkpKSB7CisgICAgICAgICAgICBpZiAobmV3Q29uZmlkZW5jZSA+ICpjb25maWRlbmNlKSB7CisgICAgICAgICAgICAgICAgKmNvbmZpZGVuY2UgPSBuZXdDb25maWRlbmNlOworICAgICAgICAgICAgICAgIGlmICgqbWV0YSAhPSBudWxscHRyICYmICpmcmVlTWV0YSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICgqZnJlZU1ldGEpKCptZXRhKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKm1ldGEgPSBuZXdNZXRhOworICAgICAgICAgICAgICAgICpmcmVlTWV0YSA9IG5ld0ZyZWVNZXRhOworICAgICAgICAgICAgICAgIHBsdWdpbiA9ICppdDsKKyAgICAgICAgICAgICAgICBiZXN0Q3JlYXRvciA9IGN1ckNyZWF0b3I7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChuZXdNZXRhICE9IG51bGxwdHIgJiYgbmV3RnJlZU1ldGEgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBuZXdGcmVlTWV0YShuZXdNZXRhKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gYmVzdENyZWF0b3I7Cit9CisKKy8vIHN0YXRpYwordm9pZCBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OlJlZ2lzdGVyRXh0cmFjdG9yKGNvbnN0IHNwPEV4dHJhY3RvclBsdWdpbj4gJnBsdWdpbiwKKyAgICAgICAgTGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+PiAmcGx1Z2luTGlzdCkgeworICAgIC8vIHNhbml0eSBjaGVjayBjaGVjayBzdHJ1Y3QgdmVyc2lvbiwgdXVpZCwgbmFtZQorICAgIGlmIChwbHVnaW4tPmRlZi5kZWZfdmVyc2lvbiA9PSAwCisgICAgICAgICAgICB8fCBwbHVnaW4tPmRlZi5kZWZfdmVyc2lvbiA+IE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTikgeworICAgICAgICBBTE9HRSgiZG9uJ3QgdW5kZXJzdGFuZCBleHRyYWN0b3IgZm9ybWF0ICV1LCBpZ25vcmluZy4iLCBwbHVnaW4tPmRlZi5kZWZfdmVyc2lvbik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKG1lbWNtcCgmcGx1Z2luLT5kZWYuZXh0cmFjdG9yX3V1aWQsICJcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMCIsIDE2KSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJpbnZhbGlkIFVVSUQsIGlnbm9yaW5nIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHBsdWdpbi0+ZGVmLmV4dHJhY3Rvcl9uYW1lID09IE5VTEwgfHwgc3RybGVuKHBsdWdpbi0+ZGVmLmV4dHJhY3Rvcl9uYW1lKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJleHRyYWN0b3JzIHNob3VsZCBoYXZlIGEgbmFtZSwgaWdub3JpbmciKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAoYXV0byBpdCA9IHBsdWdpbkxpc3QuYmVnaW4oKTsgaXQgIT0gcGx1Z2luTGlzdC5lbmQoKTsgKytpdCkgeworICAgICAgICBpZiAobWVtY21wKCYoKCppdCktPmRlZi5leHRyYWN0b3JfdXVpZCksICZwbHVnaW4tPmRlZi5leHRyYWN0b3JfdXVpZCwgMTYpID09IDApIHsKKyAgICAgICAgICAgIC8vIHRoZXJlJ3MgYWxyZWFkeSBhbiBleHRyYWN0b3Igd2l0aCB0aGUgc2FtZSB1dWlkCisgICAgICAgICAgICBpZiAoKCppdCktPmRlZi5leHRyYWN0b3JfdmVyc2lvbiA8IHBsdWdpbi0+ZGVmLmV4dHJhY3Rvcl92ZXJzaW9uKSB7CisgICAgICAgICAgICAgICAgLy8gdGhpcyBvbmUgaXMgbmV3ZXIsIHJlcGxhY2UgdGhlIG9sZCBvbmUKKyAgICAgICAgICAgICAgICBBTE9HVygicmVwbGFjaW5nIGV4dHJhY3RvciAnJXMnIHZlcnNpb24gJXUgd2l0aCB2ZXJzaW9uICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi0+ZGVmLmV4dHJhY3Rvcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgKCppdCktPmRlZi5leHRyYWN0b3JfdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi0+ZGVmLmV4dHJhY3Rvcl92ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICBwbHVnaW5MaXN0LmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coImlnbm9yaW5nIGV4dHJhY3RvciAnJXMnIHZlcnNpb24gJXUgaW4gZmF2b3Igb2YgdmVyc2lvbiAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4tPmRlZi5leHRyYWN0b3JfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi0+ZGVmLmV4dHJhY3Rvcl92ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgKCppdCktPmRlZi5leHRyYWN0b3JfdmVyc2lvbik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCJyZWdpc3RlcmluZyBleHRyYWN0b3IgZm9yICVzIiwgcGx1Z2luLT5kZWYuZXh0cmFjdG9yX25hbWUpOworICAgIHBsdWdpbkxpc3QucHVzaF9iYWNrKHBsdWdpbik7Cit9CisKKy8vc3RhdGljCit2b2lkIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6UmVnaXN0ZXJFeHRyYWN0b3JzSW5BcGsoCisgICAgICAgIGNvbnN0IGNoYXIgKmFwa1BhdGgsIExpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpIHsKKyAgICBBTE9HVigic2VhcmNoIGZvciBwbHVnaW5zIGF0ICVzIiwgYXBrUGF0aCk7CisgICAgWmlwQXJjaGl2ZUhhbmRsZSB6aXBIYW5kbGU7CisgICAgaW50MzJfdCByZXQgPSBPcGVuQXJjaGl2ZShhcGtQYXRoLCAmemlwSGFuZGxlKTsKKyAgICBpZiAocmV0ID09IDApIHsKKyAgICAgICAgY2hhciBhYmlbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICAgICAgcHJvcGVydHlfZ2V0KCJyby5wcm9kdWN0LmNwdS5hYmkiLCBhYmksICJhcm02NC12OGEiKTsKKyAgICAgICAgU3RyaW5nOCBwcmVmaXg4ID0gU3RyaW5nODo6Zm9ybWF0KCJsaWIvJXMvIiwgYWJpKTsKKyAgICAgICAgWmlwU3RyaW5nIHByZWZpeChwcmVmaXg4LmNfc3RyKCkpOworICAgICAgICBaaXBTdHJpbmcgc3VmZml4KCJleHRyYWN0b3Iuc28iKTsKKyAgICAgICAgdm9pZCogY29va2llOworICAgICAgICByZXQgPSBTdGFydEl0ZXJhdGlvbih6aXBIYW5kbGUsICZjb29raWUsICZwcmVmaXgsICZzdWZmaXgpOworICAgICAgICBpZiAocmV0ID09IDApIHsKKyAgICAgICAgICAgIFppcEVudHJ5IGVudHJ5OworICAgICAgICAgICAgWmlwU3RyaW5nIG5hbWU7CisgICAgICAgICAgICB3aGlsZSAoTmV4dChjb29raWUsICZlbnRyeSwgJm5hbWUpID09IDApIHsKKyAgICAgICAgICAgICAgICBTdHJpbmc4IGxpYlBhdGggPSBTdHJpbmc4KGFwa1BhdGgpICsgIiEvIiArCisgICAgICAgICAgICAgICAgICAgIFN0cmluZzgocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4obmFtZS5uYW1lKSwgbmFtZS5uYW1lX2xlbmd0aCk7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogT3BlbiB3aXRoIGEgbGlua2VyIG5hbWVzcGFjZSBzbyB0aGF0IGl0IGNhbiBiZSBsaW5rZWQgd2l0aCBzdWItbGlicmFyaWVzCisgICAgICAgICAgICAgICAgLy8gd2l0aGluIHRoZSBhcGsgaW5zdGVhZCBvZiBzeXN0ZW0gbGlicmFyaWVzIGFscmVhZHkgbG9hZGVkLgorICAgICAgICAgICAgICAgIHZvaWQgKmxpYkhhbmRsZSA9IGRsb3BlbihsaWJQYXRoLnN0cmluZygpLCBSVExEX05PVyB8IFJUTERfTE9DQUwpOworICAgICAgICAgICAgICAgIGlmIChsaWJIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkdldEV4dHJhY3RvckRlZiBnZXREZWYgPQorICAgICAgICAgICAgICAgICAgICAgICAgKE1lZGlhRXh0cmFjdG9yOjpHZXRFeHRyYWN0b3JEZWYpIGRsc3ltKGxpYkhhbmRsZSwgIkdFVEVYVFJBQ1RPUkRFRiIpOworICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0RGVmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigicmVnaXN0ZXJpbmcgc25pZmZlciBmb3IgJXMiLCBsaWJQYXRoLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyRXh0cmFjdG9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRXh0cmFjdG9yUGx1Z2luKGdldERlZigpLCBsaWJIYW5kbGUsIGxpYlBhdGgpLCBwbHVnaW5MaXN0KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBkb2VzIG5vdCBjb250YWluIHNuaWZmZXIiLCBsaWJQYXRoLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRsY2xvc2UobGliSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjb3VsZG4ndCBkbG9wZW4oJXMpICVzIiwgbGliUGF0aC5zdHJpbmcoKSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFbmRJdGVyYXRpb24oY29va2llKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCJjb3VsZG4ndCBmaW5kIHBsdWdpbnMgZnJvbSAlcywgJWQiLCBhcGtQYXRoLCByZXQpOworICAgICAgICB9CisgICAgICAgIENsb3NlQXJjaGl2ZSh6aXBIYW5kbGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dXKCJjb3VsZG4ndCBvcGVuKCVzKSAlZCIsIGFwa1BhdGgsIHJldCk7CisgICAgfQorfQorCisvL3N0YXRpYwordm9pZCBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OlJlZ2lzdGVyRXh0cmFjdG9yc0luU3lzdGVtKAorICAgICAgICBjb25zdCBjaGFyICpsaWJEaXJQYXRoLCBMaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+ICZwbHVnaW5MaXN0KSB7CisgICAgQUxPR1YoInNlYXJjaCBmb3IgcGx1Z2lucyBhdCAlcyIsIGxpYkRpclBhdGgpOworICAgIERJUiAqbGliRGlyID0gb3BlbmRpcihsaWJEaXJQYXRoKTsKKyAgICBpZiAobGliRGlyKSB7CisgICAgICAgIHN0cnVjdCBkaXJlbnQqIGxpYkVudHJ5OworICAgICAgICB3aGlsZSAoKGxpYkVudHJ5ID0gcmVhZGRpcihsaWJEaXIpKSkgeworICAgICAgICAgICAgU3RyaW5nOCBsaWJQYXRoID0gU3RyaW5nOChsaWJEaXJQYXRoKSArICIvIiArIGxpYkVudHJ5LT5kX25hbWU7CisgICAgICAgICAgICB2b2lkICpsaWJIYW5kbGUgPSBkbG9wZW4obGliUGF0aC5zdHJpbmcoKSwgUlRMRF9OT1cgfCBSVExEX0xPQ0FMKTsKKyAgICAgICAgICAgIGlmIChsaWJIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6R2V0RXh0cmFjdG9yRGVmIGdldERlZiA9CisgICAgICAgICAgICAgICAgICAgIChNZWRpYUV4dHJhY3Rvcjo6R2V0RXh0cmFjdG9yRGVmKSBkbHN5bShsaWJIYW5kbGUsICJHRVRFWFRSQUNUT1JERUYiKTsKKyAgICAgICAgICAgICAgICBpZiAoZ2V0RGVmKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJyZWdpc3RlcmluZyBzbmlmZmVyIGZvciAlcyIsIGxpYlBhdGguc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBSZWdpc3RlckV4dHJhY3RvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRXh0cmFjdG9yUGx1Z2luKGdldERlZigpLCBsaWJIYW5kbGUsIGxpYlBhdGgpLCBwbHVnaW5MaXN0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMgZG9lcyBub3QgY29udGFpbiBzbmlmZmVyIiwgbGliUGF0aC5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIGRsY2xvc2UobGliSGFuZGxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCJjb3VsZG4ndCBkbG9wZW4oJXMpICVzIiwgbGliUGF0aC5zdHJpbmcoKSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsb3NlZGlyKGxpYkRpcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoImNvdWxkbid0IG9wZW5kaXIoJXMpIiwgbGliRGlyUGF0aCk7CisgICAgfQorfQorCisvLyBzdGF0aWMKK3ZvaWQgTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpVcGRhdGVFeHRyYWN0b3JzKGNvbnN0IGNoYXIgKm5ld1VwZGF0ZUFwa1BhdGgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2soZ1BsdWdpbk11dGV4KTsKKyAgICBpZiAobmV3VXBkYXRlQXBrUGF0aCAhPSBudWxscHRyKSB7CisgICAgICAgIGdQbHVnaW5zUmVnaXN0ZXJlZCA9IGZhbHNlOworICAgIH0KKyAgICBpZiAoZ1BsdWdpbnNSZWdpc3RlcmVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+Pj4gbmV3TGlzdChuZXcgTGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+PigpKTsKKworICAgIFJlZ2lzdGVyRXh0cmFjdG9yc0luU3lzdGVtKCIvc3lzdGVtL2xpYiIKKyNpZmRlZiBfX0xQNjRfXworICAgICAgICAgICAgIjY0IgorI2VuZGlmCisgICAgICAgICAgICAiL2V4dHJhY3RvcnMiLCAqbmV3TGlzdCk7CisKKyAgICBSZWdpc3RlckV4dHJhY3RvcnNJblN5c3RlbSgiL3ZlbmRvci9saWIiCisjaWZkZWYgX19MUDY0X18KKyAgICAgICAgICAgICI2NCIKKyNlbmRpZgorICAgICAgICAgICAgIi9leHRyYWN0b3JzIiwgKm5ld0xpc3QpOworCisgICAgaWYgKG5ld1VwZGF0ZUFwa1BhdGggIT0gbnVsbHB0cikgeworICAgICAgICBSZWdpc3RlckV4dHJhY3RvcnNJbkFwayhuZXdVcGRhdGVBcGtQYXRoLCAqbmV3TGlzdCk7CisgICAgfQorCisgICAgZ1BsdWdpbnMgPSBuZXdMaXN0OworICAgIGdQbHVnaW5zUmVnaXN0ZXJlZCA9IHRydWU7Cit9CisKK3N0YXR1c190IE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKGdQbHVnaW5NdXRleCk7CisgICAgU3RyaW5nOCBvdXQ7CisgICAgb3V0LmFwcGVuZCgiQXZhaWxhYmxlIGV4dHJhY3RvcnM6XG4iKTsKKyAgICBpZiAoZ1BsdWdpbnNSZWdpc3RlcmVkKSB7CisgICAgICAgIGZvciAoYXV0byBpdCA9IGdQbHVnaW5zLT5iZWdpbigpOyBpdCAhPSBnUGx1Z2lucy0+ZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIG91dC5hcHBlbmRGb3JtYXQoIiAgJTI1czogdXVpZCglcyksIHZlcnNpb24oJXUpLCBwYXRoKCVzKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgKCppdCktPmRlZi5leHRyYWN0b3JfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgKCppdCktPnV1aWRTdHJpbmcuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgKCppdCktPmRlZi5leHRyYWN0b3JfdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgKCppdCktPmxpYlBhdGguY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBvdXQuYXBwZW5kKCIgIChubyBwbHVnaW5zIHJlZ2lzdGVyZWQpXG4iKTsKKyAgICB9CisgICAgd3JpdGUoZmQsIG91dC5zdHJpbmcoKSwgb3V0LnNpemUoKSk7CisgICAgcmV0dXJuIE9LOworfQorCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYU11eGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuY3BwCmluZGV4IGM3Yjg4ODguLjk4ZjU5YjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuY3BwCkBAIC0yMyw2ICsyMyw4IEBACiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9tZWRpYXJlY29yZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KQEAgLTMxLDE3ICszMywyMiBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorc3RhdGljIGJvb2wgaXNNcDRGb3JtYXQoTWVkaWFNdXhlcjo6T3V0cHV0Rm9ybWF0IGZvcm1hdCkgeworICAgIHJldHVybiBmb3JtYXQgPT0gTWVkaWFNdXhlcjo6T1VUUFVUX0ZPUk1BVF9NUEVHXzQgfHwKKyAgICAgICAgICAgZm9ybWF0ID09IE1lZGlhTXV4ZXI6Ok9VVFBVVF9GT1JNQVRfVEhSRUVfR1BQIHx8CisgICAgICAgICAgIGZvcm1hdCA9PSBNZWRpYU11eGVyOjpPVVRQVVRfRk9STUFUX0hFSUY7Cit9CisKIE1lZGlhTXV4ZXI6Ok1lZGlhTXV4ZXIoaW50IGZkLCBPdXRwdXRGb3JtYXQgZm9ybWF0KQogICAgIDogbUZvcm1hdChmb3JtYXQpLAogICAgICAgbVN0YXRlKFVOSU5JVElBTElaRUQpIHsKLSAgICBpZiAoZm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfTVBFR180IHx8IGZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX1RIUkVFX0dQUCkgeworICAgIGlmIChpc01wNEZvcm1hdChmb3JtYXQpKSB7CiAgICAgICAgIG1Xcml0ZXIgPSBuZXcgTVBFRzRXcml0ZXIoZmQpOwogICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfV0VCTSkgewogICAgICAgICBtV3JpdGVyID0gbmV3IFdlYm1Xcml0ZXIoZmQpOwpAQCAtNDksNiArNTYsMTAgQEAKIAogICAgIGlmIChtV3JpdGVyICE9IE5VTEwpIHsKICAgICAgICAgbUZpbGVNZXRhID0gbmV3IE1ldGFEYXRhOworICAgICAgICBpZiAoZm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfSEVJRikgeworICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBrZXkgdXNlcyByZWNvcmRlciBmaWxlIHR5cGVzLgorICAgICAgICAgICAgbUZpbGVNZXRhLT5zZXRJbnQzMihrS2V5RmlsZVR5cGUsIG91dHB1dF9mb3JtYXQ6Ok9VVFBVVF9GT1JNQVRfSEVJRik7CisgICAgICAgIH0KICAgICAgICAgbVN0YXRlID0gSU5JVElBTElaRUQ7CiAgICAgfQogfQpAQCAtMTA4LDggKzExOSw4IEBACiAgICAgICAgIEFMT0dFKCJzZXRMb2NhdGlvbigpIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBzdGFydCgpLiIpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotICAgIGlmIChtRm9ybWF0ICE9IE9VVFBVVF9GT1JNQVRfTVBFR180ICYmIG1Gb3JtYXQgIT0gT1VUUFVUX0ZPUk1BVF9USFJFRV9HUFApIHsKLSAgICAgICAgQUxPR0UoInNldExvY2F0aW9uKCkgaXMgb25seSBzdXBwb3J0ZWQgZm9yIC5tcDQgcHIgLjNncCBvdXRwdXQuIik7CisgICAgaWYgKCFpc01wNEZvcm1hdChtRm9ybWF0KSkgeworICAgICAgICBBTE9HRSgic2V0TG9jYXRpb24oKSBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgLm1wNCwgLjNncCBvciAuaGVpYyBvdXRwdXQuIik7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKQEAgLTE3MCwxMyArMTgxLDE3IEBACiAgICAgbWVkaWFCdWZmZXItPmFkZF9yZWYoKTsgLy8gUmVsZWFzZWQgaW4gTWVkaWFBZGFwdGVyOjpzaWduYWxCdWZmZXJSZXR1cm5lZCgpLgogICAgIG1lZGlhQnVmZmVyLT5zZXRfcmFuZ2UoYnVmZmVyLT5vZmZzZXQoKSwgYnVmZmVyLT5zaXplKCkpOwogCi0gICAgc3A8TWV0YURhdGE+IHNhbXBsZU1ldGFEYXRhID0gbWVkaWFCdWZmZXItPm1ldGFfZGF0YSgpOwotICAgIHNhbXBsZU1ldGFEYXRhLT5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKKyAgICBNZXRhRGF0YUJhc2UgJnNhbXBsZU1ldGFEYXRhID0gbWVkaWFCdWZmZXItPm1ldGFfZGF0YSgpOworICAgIHNhbXBsZU1ldGFEYXRhLnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOwogICAgIC8vIEp1c3Qgc2V0IHRoZSBrS2V5RGVjb2RpbmdUaW1lIGFzIHRoZSBwcmVzZW50YXRpb24gdGltZSBmb3Igbm93LgotICAgIHNhbXBsZU1ldGFEYXRhLT5zZXRJbnQ2NChrS2V5RGVjb2RpbmdUaW1lLCB0aW1lVXMpOworICAgIHNhbXBsZU1ldGFEYXRhLnNldEludDY0KGtLZXlEZWNvZGluZ1RpbWUsIHRpbWVVcyk7CiAKICAgICBpZiAoZmxhZ3MgJiBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19TWU5DRlJBTUUpIHsKLSAgICAgICAgc2FtcGxlTWV0YURhdGEtPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgdHJ1ZSk7CisgICAgICAgIHNhbXBsZU1ldGFEYXRhLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgdHJ1ZSk7CisgICAgfQorCisgICAgaWYgKGZsYWdzICYgTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfTVVYRVJfREFUQSkgeworICAgICAgICBzYW1wbGVNZXRhRGF0YS5zZXRJbnQzMihrS2V5SXNNdXhlckRhdGEsIDEpOwogICAgIH0KIAogICAgIHNwPE1lZGlhQWRhcHRlcj4gY3VycmVudFRyYWNrID0gbVRyYWNrTGlzdFt0cmFja0luZGV4XTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhU291cmNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE3NzU3YS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotTWVkaWFTb3VyY2U6Ok1lZGlhU291cmNlKCkge30KLQotTWVkaWFTb3VyY2U6On5NZWRpYVNvdXJjZSgpIHt9Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYVN5bmMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFTeW5jLmNwcAppbmRleCA5Mjc4MzgxLi5iYTE0ZTVkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYVN5bmMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhU3luYy5jcHAKQEAgLTYxLDYgKzYxLDcgQEAKICAgICAgICAgbU5leHRCdWZmZXJJdGVtTWVkaWFVcygtMSksCiAgICAgICAgIG1QbGF5YmFja1JhdGUoMC4wKSB7CiAgICAgbU1lZGlhQ2xvY2sgPSBuZXcgTWVkaWFDbG9jazsKKyAgICBtTWVkaWFDbG9jay0+aW5pdCgpOwogCiAgICAgLy8gaW5pdGlhbGl6ZSBzZXR0aW5ncwogICAgIG1QbGF5YmFja1NldHRpbmdzID0gQVVESU9fUExBWUJBQ0tfUkFURV9ERUZBVUxUOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGY2YWRlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5jcHAKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWV0YURhdGFVdGlscyIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYXZjX3V0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2Jvb2wgTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSwgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBpbnQzMl90IHdpZHRoOworICAgIGludDMyX3QgaGVpZ2h0OworICAgIGludDMyX3Qgc2FyV2lkdGg7CisgICAgaW50MzJfdCBzYXJIZWlnaHQ7CisgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdCA9IG5ldyBBQnVmZmVyKCh2b2lkKilkYXRhLCAgc2l6ZSk7CisgICAgc3A8QUJ1ZmZlcj4gY3NkID0gTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKGFjY2Vzc1VuaXQsICZ3aWR0aCwgJmhlaWdodCwgJnNhcldpZHRoLCAmc2FySGVpZ2h0KTsKKyAgICBpZiAoY3NkID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOworCisgICAgbWV0YS5zZXREYXRhKGtLZXlBVkNDLCBrVHlwZUFWQ0MsIGNzZC0+ZGF0YSgpLCBjc2QtPnNpemUoKSk7CisgICAgbWV0YS5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKKyAgICBtZXRhLnNldEludDMyKGtLZXlIZWlnaHQsIGhlaWdodCk7CisgICAgaWYgKHNhcldpZHRoID4gMCAmJiBzYXJIZWlnaHQgPiAwKSB7CisgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleVNBUldpZHRoLCBzYXJXaWR0aCk7CisgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleVNBUkhlaWdodCwgc2FySGVpZ2h0KTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKAorICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgIHVuc2lnbmVkIHByb2ZpbGUsIHVuc2lnbmVkIHNhbXBsaW5nX2ZyZXFfaW5kZXgsCisgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxfY29uZmlndXJhdGlvbikgeworICAgIGlmKHNhbXBsaW5nX2ZyZXFfaW5kZXggPiAxMXUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpbnQzMl90IHNhbXBsZVJhdGU7CisgICAgaW50MzJfdCBjaGFubmVsQ291bnQ7CisgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga1NhbXBsaW5nRnJlcVtdID0geworICAgICAgICA5NjAwMCwgODgyMDAsIDY0MDAwLCA0ODAwMCwgNDQxMDAsIDMyMDAwLCAyNDAwMCwgMjIwNTAsCisgICAgICAgIDE2MDAwLCAxMjAwMCwgMTEwMjUsIDgwMDAKKyAgICB9OworICAgIHNhbXBsZVJhdGUgPSBrU2FtcGxpbmdGcmVxW3NhbXBsaW5nX2ZyZXFfaW5kZXhdOworICAgIGNoYW5uZWxDb3VudCA9IGNoYW5uZWxfY29uZmlndXJhdGlvbjsKKworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtTdGF0aWNFU0RTW10gPSB7CisgICAgICAgIDB4MDMsIDIyLAorICAgICAgICAweDAwLCAweDAwLCAgICAgLy8gRVNfSUQKKyAgICAgICAgMHgwMCwgICAgICAgICAgIC8vIHN0cmVhbURlcGVuZGVuY2VGbGFnLCBVUkxfRmxhZywgT0NSc3RyZWFtRmxhZworCisgICAgICAgIDB4MDQsIDE3LAorICAgICAgICAweDQwLCAgICAgICAgICAgICAgICAgICAgICAgLy8gQXVkaW8gSVNPL0lFQyAxNDQ5Ni0zCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisKKyAgICAgICAgMHgwNSwgMiwKKyAgICAgICAgLy8gQXVkaW9TcGVjaWZpY0luZm8gZm9sbG93cworCisgICAgICAgIC8vIG9vb28gb2ZmZiBmY2NjIGMwMDAKKyAgICAgICAgLy8gbyAtIGF1ZGlvT2JqZWN0VHlwZQorICAgICAgICAvLyBmIC0gc2FtcGxpbmdGcmVxSW5kZXgKKyAgICAgICAgLy8gYyAtIGNoYW5uZWxDb25maWcKKyAgICB9OworCisgICAgc2l6ZV90IGNzZFNpemUgPSBzaXplb2Yoa1N0YXRpY0VTRFMpICsgMjsKKyAgICB1aW50OF90ICpjc2QgPSBuZXcgdWludDhfdFtjc2RTaXplXTsKKyAgICBtZW1jcHkoY3NkLCBrU3RhdGljRVNEUywgc2l6ZW9mKGtTdGF0aWNFU0RTKSk7CisKKyAgICBjc2Rbc2l6ZW9mKGtTdGF0aWNFU0RTKV0gPQorICAgICAgICAoKHByb2ZpbGUgKyAxKSA8PCAzKSB8IChzYW1wbGluZ19mcmVxX2luZGV4ID4+IDEpOworCisgICAgY3NkW3NpemVvZihrU3RhdGljRVNEUykgKyAxXSA9CisgICAgICAgICgoc2FtcGxpbmdfZnJlcV9pbmRleCA8PCA3KSAmIDB4ODApIHwgKGNoYW5uZWxfY29uZmlndXJhdGlvbiA8PCAzKTsKKworICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyk7CisKKyAgICBtZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVSYXRlKTsKKyAgICBtZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIGNoYW5uZWxDb3VudCk7CisKKyAgICBtZXRhLnNldERhdGEoa0tleUVTRFMsIDAsIGNzZCwgY3NkU2l6ZSk7CisgICAgZGVsZXRlIFtdIGNzZDsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01pZGlFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWlkaUV4dHJhY3Rvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MzBiYmIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWlkaUV4dHJhY3Rvci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiTWlkaUV4dHJhY3RvciIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgImluY2x1ZGUvTWlkaUV4dHJhY3Rvci5oIgotCi0jaW5jbHVkZSA8bWVkaWEvTWlkaUlvV3JhcHBlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlIDxsaWJzb25pdm94L2Vhc19yZXZlcmIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBob3cgbWFueSBTb25pdm94IG91dHB1dCBidWZmZXJzIHRvIGFnZ3JlZ2F0ZSBpbnRvIG9uZSBNZWRpYUJ1ZmZlcgotc3RhdGljIGNvbnN0IGludCBOVU1fQ09NQklORV9CVUZGRVJTID0gNDsKLQotY2xhc3MgTWlkaVNvdXJjZSA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7Ci0KLXB1YmxpYzoKLSAgICBNaWRpU291cmNlKAotICAgICAgICAgICAgY29uc3Qgc3A8TWlkaUVuZ2luZT4gJmVuZ2luZSwKLSAgICAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmdHJhY2tNZXRhZGF0YSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5NaWRpU291cmNlKCk7Ci0KLXByaXZhdGU6Ci0gICAgc3A8TWlkaUVuZ2luZT4gbUVuZ2luZTsKLSAgICBzcDxNZXRhRGF0YT4gbVRyYWNrTWV0YWRhdGE7Ci0gICAgYm9vbCBtSW5pdENoZWNrOwotICAgIGJvb2wgbVN0YXJ0ZWQ7Ci0KLSAgICBzdGF0dXNfdCBpbml0KCk7Ci0KLSAgICAvLyBubyBjb3B5IGNvbnN0cnVjdG9yIG9yIGFzc2lnbm1lbnQKLSAgICBNaWRpU291cmNlKGNvbnN0IE1pZGlTb3VyY2UgJik7Ci0gICAgTWlkaVNvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IE1pZGlTb3VyY2UgJik7Ci0KLX07Ci0KLQotLy8gTWlkaXNvdXJjZQotCi1NaWRpU291cmNlOjpNaWRpU291cmNlKAotICAgICAgICBjb25zdCBzcDxNaWRpRW5naW5lPiAmZW5naW5lLAotICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJnRyYWNrTWV0YWRhdGEpCi0gICAgOiBtRW5naW5lKGVuZ2luZSksCi0gICAgICBtVHJhY2tNZXRhZGF0YSh0cmFja01ldGFkYXRhKSwKLSAgICAgIG1Jbml0Q2hlY2soZmFsc2UpLAotICAgICAgbVN0YXJ0ZWQoZmFsc2UpCi17Ci0gICAgQUxPR1YoIk1pZGlTb3VyY2UgY3RvciIpOwotICAgIG1Jbml0Q2hlY2sgPSBpbml0KCk7Ci19Ci0KLU1pZGlTb3VyY2U6On5NaWRpU291cmNlKCkKLXsKLSAgICBBTE9HVigiTWlkaVNvdXJjZSBkdG9yIik7Ci0gICAgaWYgKG1TdGFydGVkKSB7Ci0gICAgICAgIHN0b3AoKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IE1pZGlTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICogLyogcGFyYW1zICovKQotewotICAgIEFMT0dWKCJNaWRpU291cmNlOjpzdGFydCIpOwotCi0gICAgQ0hFQ0soIW1TdGFydGVkKTsKLSAgICBtU3RhcnRlZCA9IHRydWU7Ci0gICAgbUVuZ2luZS0+YWxsb2NhdGVCdWZmZXJzKCk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBNaWRpU291cmNlOjpzdG9wKCkKLXsKLSAgICBBTE9HVigiTWlkaVNvdXJjZTo6c3RvcCIpOwotCi0gICAgQ0hFQ0sobVN0YXJ0ZWQpOwotICAgIG1TdGFydGVkID0gZmFsc2U7Ci0gICAgbUVuZ2luZS0+cmVsZWFzZUJ1ZmZlcnMoKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3A8TWV0YURhdGE+IE1pZGlTb3VyY2U6OmdldEZvcm1hdCgpCi17Ci0gICAgcmV0dXJuIG1UcmFja01ldGFkYXRhOwotfQotCi1zdGF0dXNfdCBNaWRpU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dEJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpCi17Ci0gICAgQUxPR1YoIk1pZGlTb3VyY2U6OnJlYWQiKTsKLSAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyOwotICAgIC8vIHByb2Nlc3MgYW4gb3B0aW9uYWwgc2VlayByZXF1ZXN0Ci0gICAgaW50NjRfdCBzZWVrVGltZVVzOwotICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOwotICAgIGlmICgoTlVMTCAhPSBvcHRpb25zKSAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSkgewotICAgICAgICBpZiAoc2Vla1RpbWVVcyA8PSAwTEwpIHsKLSAgICAgICAgICAgIHNlZWtUaW1lVXMgPSAwTEw7Ci0gICAgICAgIH0KLSAgICAgICAgbUVuZ2luZS0+c2Vla1RvKHNlZWtUaW1lVXMpOwotICAgIH0KLSAgICBidWZmZXIgPSBtRW5naW5lLT5yZWFkQnVmZmVyKCk7Ci0gICAgKm91dEJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICBBTE9HVigiTWlkaVNvdXJjZTo6cmVhZCAlcCBkb25lIiwgdGhpcyk7Ci0gICAgcmV0dXJuIGJ1ZmZlciAhPSBOVUxMID8gKHN0YXR1c190KSBPSyA6IChzdGF0dXNfdCkgRVJST1JfRU5EX09GX1NUUkVBTTsKLX0KLQotc3RhdHVzX3QgTWlkaVNvdXJjZTo6aW5pdCgpCi17Ci0gICAgQUxPR1YoIk1pZGlTb3VyY2U6OmluaXQiKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8vIE1pZGlFbmdpbmUKLQotTWlkaUVuZ2luZTo6TWlkaUVuZ2luZShjb25zdCBzcDxEYXRhU291cmNlPiAmZGF0YVNvdXJjZSwKLSAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZmaWxlTWV0YWRhdGEsCi0gICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmdHJhY2tNZXRhZGF0YSkgOgotICAgICAgICAgICAgbUdyb3VwKE5VTEwpLAotICAgICAgICAgICAgbUVhc0RhdGEoTlVMTCksCi0gICAgICAgICAgICBtRWFzSGFuZGxlKE5VTEwpLAotICAgICAgICAgICAgbUVhc0NvbmZpZyhOVUxMKSwKLSAgICAgICAgICAgIG1Jc0luaXRpYWxpemVkKGZhbHNlKSB7Ci0gICAgbUlvV3JhcHBlciA9IG5ldyBNaWRpSW9XcmFwcGVyKGRhdGFTb3VyY2UpOwotICAgIC8vIHNwaW4gdXAgYSBuZXcgRUFTIGVuZ2luZQotICAgIEVBU19JMzIgdGVtcDsKLSAgICBFQVNfUkVTVUxUIHJlc3VsdCA9IEVBU19Jbml0KCZtRWFzRGF0YSk7Ci0KLSAgICBpZiAocmVzdWx0ID09IEVBU19TVUNDRVNTKSB7Ci0gICAgICAgIHJlc3VsdCA9IEVBU19PcGVuRmlsZShtRWFzRGF0YSwgbUlvV3JhcHBlci0+Z2V0TG9jYXRvcigpLCAmbUVhc0hhbmRsZSk7Ci0gICAgfQotICAgIGlmIChyZXN1bHQgPT0gRUFTX1NVQ0NFU1MpIHsKLSAgICAgICAgcmVzdWx0ID0gRUFTX1ByZXBhcmUobUVhc0RhdGEsIG1FYXNIYW5kbGUpOwotICAgIH0KLSAgICBpZiAocmVzdWx0ID09IEVBU19TVUNDRVNTKSB7Ci0gICAgICAgIHJlc3VsdCA9IEVBU19QYXJzZU1ldGFEYXRhKG1FYXNEYXRhLCBtRWFzSGFuZGxlLCAmdGVtcCk7Ci0gICAgfQotCi0gICAgaWYgKHJlc3VsdCAhPSBFQVNfU1VDQ0VTUykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGZpbGVNZXRhZGF0YSAhPSBOVUxMKSB7Ci0gICAgICAgIGZpbGVNZXRhZGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX01JREkpOwotICAgIH0KLQotICAgIGlmICh0cmFja01ldGFkYXRhICE9IE5VTEwpIHsKLSAgICAgICAgdHJhY2tNZXRhZGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyk7Ci0gICAgICAgIHRyYWNrTWV0YWRhdGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgMTAwMGxsICogdGVtcCk7IC8vIG1pbGxpLT5taWNybwotICAgICAgICBtRWFzQ29uZmlnID0gRUFTX0NvbmZpZygpOwotICAgICAgICB0cmFja01ldGFkYXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgbUVhc0NvbmZpZy0+c2FtcGxlUmF0ZSk7Ci0gICAgICAgIHRyYWNrTWV0YWRhdGEtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG1FYXNDb25maWctPm51bUNoYW5uZWxzKTsKLSAgICAgICAgdHJhY2tNZXRhZGF0YS0+c2V0SW50MzIoa0tleVBjbUVuY29kaW5nLCBrQXVkaW9FbmNvZGluZ1BjbTE2Yml0KTsKLSAgICB9Ci0gICAgbUlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotfQotCi1NaWRpRW5naW5lOjp+TWlkaUVuZ2luZSgpIHsKLSAgICBpZiAobUVhc0hhbmRsZSkgewotICAgICAgICBFQVNfQ2xvc2VGaWxlKG1FYXNEYXRhLCBtRWFzSGFuZGxlKTsKLSAgICB9Ci0gICAgaWYgKG1FYXNEYXRhKSB7Ci0gICAgICAgIEVBU19TaHV0ZG93bihtRWFzRGF0YSk7Ci0gICAgfQotICAgIGRlbGV0ZSBtR3JvdXA7Ci0KLX0KLQotc3RhdHVzX3QgTWlkaUVuZ2luZTo6aW5pdENoZWNrKCkgewotICAgIHJldHVybiBtSXNJbml0aWFsaXplZCA/IE9LIDogVU5LTk9XTl9FUlJPUjsKLX0KLQotc3RhdHVzX3QgTWlkaUVuZ2luZTo6YWxsb2NhdGVCdWZmZXJzKCkgewotICAgIC8vIHNlbGVjdCByZXZlcmIgcHJlc2V0IGFuZCBlbmFibGUKLSAgICBFQVNfU2V0UGFyYW1ldGVyKG1FYXNEYXRhLCBFQVNfTU9EVUxFX1JFVkVSQiwgRUFTX1BBUkFNX1JFVkVSQl9QUkVTRVQsIEVBU19QQVJBTV9SRVZFUkJfQ0hBTUJFUik7Ci0gICAgRUFTX1NldFBhcmFtZXRlcihtRWFzRGF0YSwgRUFTX01PRFVMRV9SRVZFUkIsIEVBU19QQVJBTV9SRVZFUkJfQllQQVNTLCBFQVNfRkFMU0UpOwotCi0gICAgbUdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXA7Ci0gICAgaW50IGJ1ZnNpemUgPSBzaXplb2YoRUFTX1BDTSkKLSAgICAgICAgICAgICogbUVhc0NvbmZpZy0+bWl4QnVmZmVyU2l6ZSAqIG1FYXNDb25maWctPm51bUNoYW5uZWxzICogTlVNX0NPTUJJTkVfQlVGRkVSUzsKLSAgICBBTE9HVigidXNpbmcgJWQgYnl0ZSBidWZmZXIiLCBidWZzaXplKTsKLSAgICBtR3JvdXAtPmFkZF9idWZmZXIobmV3IE1lZGlhQnVmZmVyKGJ1ZnNpemUpKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IE1pZGlFbmdpbmU6OnJlbGVhc2VCdWZmZXJzKCkgewotICAgIGRlbGV0ZSBtR3JvdXA7Ci0gICAgbUdyb3VwID0gTlVMTDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IE1pZGlFbmdpbmU6OnNlZWtUbyhpbnQ2NF90IHBvc2l0aW9uVXMpIHsKLSAgICBBTE9HVigic2Vla1RvICVsbGQiLCAobG9uZyBsb25nKXBvc2l0aW9uVXMpOwotICAgIEVBU19SRVNVTFQgcmVzdWx0ID0gRUFTX0xvY2F0ZShtRWFzRGF0YSwgbUVhc0hhbmRsZSwgcG9zaXRpb25VcyAvIDEwMDAsIGZhbHNlKTsKLSAgICByZXR1cm4gcmVzdWx0ID09IEVBU19TVUNDRVNTID8gT0sgOiBVTktOT1dOX0VSUk9SOwotfQotCi1NZWRpYUJ1ZmZlciogTWlkaUVuZ2luZTo6cmVhZEJ1ZmZlcigpIHsKLSAgICBFQVNfU1RBVEUgc3RhdGU7Ci0gICAgRUFTX1N0YXRlKG1FYXNEYXRhLCBtRWFzSGFuZGxlLCAmc3RhdGUpOwotICAgIGlmICgoc3RhdGUgPT0gRUFTX1NUQVRFX1NUT1BQRUQpIHx8IChzdGF0ZSA9PSBFQVNfU1RBVEVfRVJST1IpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyOwotICAgIHN0YXR1c190IGVyciA9IG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJmJ1ZmZlcik7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBBTE9HRSgicmVhZEJ1ZmZlcjogbm8gYnVmZmVyIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBFQVNfSTMyIHRpbWVNczsKLSAgICBFQVNfR2V0TG9jYXRpb24obUVhc0RhdGEsIG1FYXNIYW5kbGUsICZ0aW1lTXMpOwotICAgIGludDY0X3QgdGltZVVzID0gMTAwMGxsICogdGltZU1zOwotICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOwotCi0gICAgRUFTX1BDTSogcCA9IChFQVNfUENNKikgYnVmZmVyLT5kYXRhKCk7Ci0gICAgaW50IG51bUJ5dGVzT3V0cHV0ID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9DT01CSU5FX0JVRkZFUlM7IGkrKykgewotICAgICAgICBFQVNfSTMyIG51bVJlbmRlcmVkOwotICAgICAgICBFQVNfUkVTVUxUIHJlc3VsdCA9IEVBU19SZW5kZXIobUVhc0RhdGEsIHAsIG1FYXNDb25maWctPm1peEJ1ZmZlclNpemUsICZudW1SZW5kZXJlZCk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gRUFTX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIEFMT0dFKCJFQVNfUmVuZGVyIHJldHVybmVkICVsZCIsIHJlc3VsdCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBwICs9IG51bVJlbmRlcmVkICogbUVhc0NvbmZpZy0+bnVtQ2hhbm5lbHM7Ci0gICAgICAgIG51bUJ5dGVzT3V0cHV0ICs9IG51bVJlbmRlcmVkICogbUVhc0NvbmZpZy0+bnVtQ2hhbm5lbHMgKiBzaXplb2YoRUFTX1BDTSk7Ci0gICAgfQotICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIG51bUJ5dGVzT3V0cHV0KTsKLSAgICBBTE9HVigicmVhZEJ1ZmZlcjogcmV0dXJuaW5nICV6ZCBpbiBidWZmZXIgJXAiLCBidWZmZXItPnJhbmdlX2xlbmd0aCgpLCBidWZmZXIpOwotICAgIHJldHVybiBidWZmZXI7Ci19Ci0KLQotLy8gTWlkaUV4dHJhY3RvcgotCi1NaWRpRXh0cmFjdG9yOjpNaWRpRXh0cmFjdG9yKAotICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmZGF0YVNvdXJjZSkKLSAgICA6IG1EYXRhU291cmNlKGRhdGFTb3VyY2UpLAotICAgICAgbUluaXRDaGVjayhmYWxzZSkKLXsKLSAgICBBTE9HVigiTWlkaUV4dHJhY3RvciBjdG9yIik7Ci0gICAgbUZpbGVNZXRhZGF0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICBtVHJhY2tNZXRhZGF0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICBtRW5naW5lID0gbmV3IE1pZGlFbmdpbmUobURhdGFTb3VyY2UsIG1GaWxlTWV0YWRhdGEsIG1UcmFja01ldGFkYXRhKTsKLSAgICBtSW5pdENoZWNrID0gbUVuZ2luZS0+aW5pdENoZWNrKCk7Ci19Ci0KLU1pZGlFeHRyYWN0b3I6On5NaWRpRXh0cmFjdG9yKCkKLXsKLSAgICBBTE9HVigiTWlkaUV4dHJhY3RvciBkdG9yIik7Ci19Ci0KLXNpemVfdCBNaWRpRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpCi17Ci0gICAgcmV0dXJuIG1Jbml0Q2hlY2sgPT0gT0sgPyAxIDogMDsKLX0KLQotc3A8SU1lZGlhU291cmNlPiBNaWRpRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpCi17Ci0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggPiAwKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gbmV3IE1pZGlTb3VyY2UobUVuZ2luZSwgbVRyYWNrTWV0YWRhdGEpOwotfQotCi1zcDxNZXRhRGF0YT4gTWlkaUV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgewotICAgIEFMT0dWKCJNaWRpRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhIik7Ci0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggPiAwKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gbVRyYWNrTWV0YWRhdGE7Ci19Ci0KLXNwPE1ldGFEYXRhPiBNaWRpRXh0cmFjdG9yOjpnZXRNZXRhRGF0YSgpCi17Ci0gICAgQUxPR1YoIk1pZGlFeHRyYWN0b3I6OmdldE1ldGFEYXRhIik7Ci0gICAgcmV0dXJuIG1GaWxlTWV0YWRhdGE7Ci19Ci0KLS8vIFNuaWZmZXIKLQotYm9vbCBTbmlmZk1pZGkoCi0gICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSwKLSAgICAgICAgc3A8QU1lc3NhZ2U+ICopCi17Ci0gICAgc3A8TWlkaUVuZ2luZT4gcCA9IG5ldyBNaWRpRW5naW5lKHNvdXJjZSwgTlVMTCwgTlVMTCk7Ci0gICAgaWYgKHAtPmluaXRDaGVjaygpID09IE9LKSB7Ci0gICAgICAgICptaW1lVHlwZSA9IE1FRElBX01JTUVUWVBFX0FVRElPX01JREk7Ci0gICAgICAgICpjb25maWRlbmNlID0gMC44OwotICAgICAgICBBTE9HVigiU25pZmZNaWRpOiB5ZXMiKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIEFMT0dWKCJTbmlmZk1pZGk6IG5vIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotCi19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OZGtVdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OZGtVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA0ZmU3MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L05ka1V0aWxzLmNwcApAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTmRrVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzcDxNZXRhRGF0YT4gY29udmVydE1lZGlhRm9ybWF0V3JhcHBlclRvTWV0YURhdGEoY29uc3Qgc3A8QU1lZGlhRm9ybWF0V3JhcHBlcj4gJmZtdCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBmbXQtPnRvQU1lc3NhZ2UoKTsKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKKyAgICBjb252ZXJ0TWVzc2FnZVRvTWV0YURhdGEobXNnLCBtZXRhKTsKKyAgICByZXR1cm4gbWV0YTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVDYWNoZWRTb3VyY2UyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051Q2FjaGVkU291cmNlMi5jcHAKaW5kZXggYWZkNmZmYi4uMThmNGIxMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVDYWNoZWRTb3VyY2UyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUNhY2hlZFNvdXJjZTIuY3BwCkBAIC02ODEsMTAgKzY4MSw2IEBACiAgICAgcmV0dXJuIG1Tb3VyY2UtPkRybUluaXRpYWxpemF0aW9uKG1pbWUpOwogfQogCi12b2lkIE51Q2FjaGVkU291cmNlMjo6Z2V0RHJtSW5mbyhzcDxEZWNyeXB0SGFuZGxlPiAmaGFuZGxlLCBEcm1NYW5hZ2VyQ2xpZW50ICoqY2xpZW50KSB7Ci0gICAgbVNvdXJjZS0+Z2V0RHJtSW5mbyhoYW5kbGUsIGNsaWVudCk7Ci19Ci0KIFN0cmluZzggTnVDYWNoZWRTb3VyY2UyOjpnZXRVcmkoKSB7CiAgICAgcmV0dXJuIG1Tb3VyY2UtPmdldFVyaSgpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmNwcAppbmRleCA2NDBjYjgyLi40YTdkNmNhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmNwcApAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2RlZmluZSBMT0dfTkRFQlVHIDAKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiTnVNZWRpYUV4dHJhY3RvciIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIApAQCAtMjMsMjggKzIzLDQwIEBACiAjaW5jbHVkZSAiaW5jbHVkZS9FU0RTLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaCIKIAorI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2VGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK051TWVkaWFFeHRyYWN0b3I6OlNhbXBsZTo6U2FtcGxlKCkKKyAgICA6IG1CdWZmZXIoTlVMTCksCisgICAgICBtU2FtcGxlVGltZVVzKC0xbGwpIHsKK30KKworTnVNZWRpYUV4dHJhY3Rvcjo6U2FtcGxlOjpTYW1wbGUoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIsIGludDY0X3QgdGltZVVzKQorICAgIDogbUJ1ZmZlcihidWZmZXIpLAorICAgICAgbVNhbXBsZVRpbWVVcyh0aW1lVXMpIHsKK30KKwogTnVNZWRpYUV4dHJhY3Rvcjo6TnVNZWRpYUV4dHJhY3RvcigpCiAgICAgOiBtVG90YWxCaXRyYXRlKC0xbGwpLAogICAgICAgbUR1cmF0aW9uVXMoLTFsbCkgewogfQogCiBOdU1lZGlhRXh0cmFjdG9yOjp+TnVNZWRpYUV4dHJhY3RvcigpIHsKLSAgICByZWxlYXNlVHJhY2tTYW1wbGVzKCk7CisgICAgcmVsZWFzZUFsbFRyYWNrU2FtcGxlcygpOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2VsZWN0ZWRUcmFja3Muc2l6ZSgpOyArK2kpIHsKICAgICAgICAgVHJhY2tJbmZvICppbmZvID0gJm1TZWxlY3RlZFRyYWNrcy5lZGl0SXRlbUF0KGkpOwpAQCAtNjAsNyArNzIsNyBAQAogfQogCiBzdGF0dXNfdCBOdU1lZGlhRXh0cmFjdG9yOjpzZXREYXRhU291cmNlKAotICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICBjb25zdCBzcDxNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCiAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsCiAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKQEAgLTcwLDEzICs4MiwxMyBAQAogICAgIH0KIAogICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UgPQotICAgICAgICBEYXRhU291cmNlOjpDcmVhdGVGcm9tVVJJKGh0dHBTZXJ2aWNlLCBwYXRoLCBoZWFkZXJzKTsKKyAgICAgICAgRGF0YVNvdXJjZUZhY3Rvcnk6OkNyZWF0ZUZyb21VUkkoaHR0cFNlcnZpY2UsIHBhdGgsIGhlYWRlcnMpOwogCiAgICAgaWYgKGRhdGFTb3VyY2UgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gLUVOT0VOVDsKICAgICB9CiAKLSAgICBtSW1wbCA9IE1lZGlhRXh0cmFjdG9yOjpDcmVhdGUoZGF0YVNvdXJjZSk7CisgICAgbUltcGwgPSBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OkNyZWF0ZShkYXRhU291cmNlKTsKIAogICAgIGlmIChtSW1wbCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKQEAgLTExMiw3ICsxMjQsNyBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAotICAgIG1JbXBsID0gTWVkaWFFeHRyYWN0b3I6OkNyZWF0ZShmaWxlU291cmNlKTsKKyAgICBtSW1wbCA9IE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Q3JlYXRlKGZpbGVTb3VyY2UpOwogCiAgICAgaWYgKG1JbXBsID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwpAQCAtMTQyLDcgKzE1NCw3IEBACiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCi0gICAgbUltcGwgPSBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRlKHNvdXJjZSk7CisgICAgbUltcGwgPSBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OkNyZWF0ZShzb3VyY2UpOwogCiAgICAgaWYgKG1JbXBsID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwpAQCAtMTkzLDYgKzIwNSwxNSBAQAogICAgIHJldHVybiBPSzsKIH0KIAordm9pZCBOdU1lZGlhRXh0cmFjdG9yOjpkaXNjb25uZWN0KCkgeworICAgIGlmIChtRGF0YVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIC8vIGRpc2Nvbm5lY3QgZGF0YSBzb3VyY2UKKyAgICAgICAgaWYgKG1EYXRhU291cmNlLT5mbGFncygpICYgRGF0YVNvdXJjZTo6a0lzQ2FjaGluZ0RhdGFTb3VyY2UpIHsKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PE51Q2FjaGVkU291cmNlMiAqPihtRGF0YVNvdXJjZS5nZXQoKSktPmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgfQorICAgIH0KK30KKwogc3RhdHVzX3QgTnVNZWRpYUV4dHJhY3Rvcjo6dXBkYXRlRHVyYXRpb25BbmRCaXRyYXRlKCkgewogICAgIGlmIChtSW1wbC0+Y291bnRUcmFja3MoKSA+IGtNYXhUcmFja0NvdW50KSB7CiAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKQEAgLTI4Niw3ICszMDcsMjggQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE51TWVkaWFFeHRyYWN0b3I6OnNlbGVjdFRyYWNrKHNpemVfdCBpbmRleCkgeworc3RhdHVzX3QgTnVNZWRpYUV4dHJhY3Rvcjo6Z2V0RXhpZk9mZnNldFNpemUob2ZmNjRfdCAqb2Zmc2V0LCBzaXplX3QgKnNpemUpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1JbXBsID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtSW1wbC0+Z2V0TWV0YURhdGEoKTsKKworICAgIGludDY0X3QgZXhpZk9mZnNldCwgZXhpZlNpemU7CisgICAgaWYgKG1ldGEtPmZpbmRJbnQ2NChrS2V5RXhpZk9mZnNldCwgJmV4aWZPZmZzZXQpCisgICAgICYmIG1ldGEtPmZpbmRJbnQ2NChrS2V5RXhpZlNpemUsICZleGlmU2l6ZSkpIHsKKyAgICAgICAgKm9mZnNldCA9IChvZmY2NF90KSBleGlmT2Zmc2V0OworICAgICAgICAqc2l6ZSA9IChzaXplX3QpIGV4aWZTaXplOworCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBOdU1lZGlhRXh0cmFjdG9yOjpzZWxlY3RUcmFjayhzaXplX3QgaW5kZXgsCisgICAgICAgIGludDY0X3Qgc3RhcnRUaW1lVXMsIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBpZiAobUltcGwgPT0gTlVMTCkgewpAQCAtMzA5LDMxICszNTEsNTYgQEAKICAgICBzcDxJTWVkaWFTb3VyY2U+IHNvdXJjZSA9IG1JbXBsLT5nZXRUcmFjayhpbmRleCk7CiAKICAgICBpZiAoc291cmNlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoInRyYWNrICV6dSBpcyBlbXB0eSIsIGluZGV4KTsKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKICAgICBzdGF0dXNfdCByZXQgPSBzb3VyY2UtPnN0YXJ0KCk7CiAgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICBBTE9HRSgidHJhY2sgJXp1IGZhaWxlZCB0byBzdGFydCIsIGluZGV4KTsKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IHNvdXJjZS0+Z2V0Rm9ybWF0KCk7CisgICAgaWYgKG1ldGEgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgidHJhY2sgJXp1IGhhcyBubyBtZXRhIGRhdGEiLCBpbmRleCk7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICBpZiAoIW1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKSB7CisgICAgICAgIEFMT0dFKCJ0cmFjayAlenUgaGFzIG5vIG1pbWUgdHlwZSBpbiBtZXRhIGRhdGEiLCBpbmRleCk7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIEFMT0dWKCJzZWxlY3RUcmFjaywgdHJhY2tbJXp1XTogJXMiLCBpbmRleCwgbWltZSk7CisKICAgICBtU2VsZWN0ZWRUcmFja3MucHVzaCgpOwogICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtU2VsZWN0ZWRUcmFja3MuZWRpdEl0ZW1BdChtU2VsZWN0ZWRUcmFja3Muc2l6ZSgpIC0gMSk7CiAKICAgICBpbmZvLT5tU291cmNlID0gc291cmNlOwogICAgIGluZm8tPm1UcmFja0luZGV4ID0gaW5kZXg7CisgICAgaWYgKCFzdHJuY2FzZWNtcChtaW1lLCAiYXVkaW8vIiwgNikpIHsKKyAgICAgICAgaW5mby0+bVRyYWNrVHlwZSA9IE1FRElBX1RSQUNLX1RZUEVfQVVESU87CisgICAgICAgIGluZm8tPm1NYXhGZXRjaENvdW50ID0gNjQ7CisgICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAobWltZSwgInZpZGVvLyIsIDYpKSB7CisgICAgICAgIGluZm8tPm1UcmFja1R5cGUgPSBNRURJQV9UUkFDS19UWVBFX1ZJREVPOworICAgICAgICBpbmZvLT5tTWF4RmV0Y2hDb3VudCA9IDg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW5mby0+bVRyYWNrVHlwZSA9IE1FRElBX1RSQUNLX1RZUEVfVU5LTk9XTjsKKyAgICAgICAgaW5mby0+bU1heEZldGNoQ291bnQgPSAxOworICAgIH0KICAgICBpbmZvLT5tRmluYWxSZXN1bHQgPSBPSzsKLSAgICBpbmZvLT5tU2FtcGxlID0gTlVMTDsKLSAgICBpbmZvLT5tU2FtcGxlVGltZVVzID0gLTFsbDsKKyAgICByZWxlYXNlVHJhY2tTYW1wbGVzKGluZm8pOwogICAgIGluZm8tPm1UcmFja0ZsYWdzID0gMDsKIAotICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgQ0hFQ0soc291cmNlLT5nZXRGb3JtYXQoKS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOwotCiAgICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUykpIHsKICAgICAgICAgaW5mby0+bVRyYWNrRmxhZ3MgfD0ga0lzVm9yYmlzOwogICAgIH0KIAorICAgIGlmIChzdGFydFRpbWVVcyA+PSAwKSB7CisgICAgICAgIGZldGNoVHJhY2tTYW1wbGVzKGluZm8sIHN0YXJ0VGltZVVzLCBtb2RlKTsKKyAgICB9CisKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTM2NCwxMiArNDMxLDcgQEAKIAogICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtU2VsZWN0ZWRUcmFja3MuZWRpdEl0ZW1BdChpKTsKIAotICAgIGlmIChpbmZvLT5tU2FtcGxlICE9IE5VTEwpIHsKLSAgICAgICAgaW5mby0+bVNhbXBsZS0+cmVsZWFzZSgpOwotICAgICAgICBpbmZvLT5tU2FtcGxlID0gTlVMTDsKLQotICAgICAgICBpbmZvLT5tU2FtcGxlVGltZVVzID0gLTFsbDsKLSAgICB9CisgICAgcmVsZWFzZVRyYWNrU2FtcGxlcyhpbmZvKTsKIAogICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywgaW5mby0+bVNvdXJjZS0+c3RvcCgpKTsKIApAQCAtMzc4LDc5ICs0NDAsMTQxIEBACiAgICAgcmV0dXJuIE9LOwogfQogCi12b2lkIE51TWVkaWFFeHRyYWN0b3I6OnJlbGVhc2VUcmFja1NhbXBsZXMoKSB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2VsZWN0ZWRUcmFja3Muc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgVHJhY2tJbmZvICppbmZvID0gJm1TZWxlY3RlZFRyYWNrcy5lZGl0SXRlbUF0KGkpOwordm9pZCBOdU1lZGlhRXh0cmFjdG9yOjpyZWxlYXNlT25lU2FtcGxlKFRyYWNrSW5mbyAqaW5mbykgeworICAgIGlmIChpbmZvID09IE5VTEwgfHwgaW5mby0+bVNhbXBsZXMuZW1wdHkoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQogCi0gICAgICAgIGlmIChpbmZvLT5tU2FtcGxlICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGluZm8tPm1TYW1wbGUtPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIGluZm8tPm1TYW1wbGUgPSBOVUxMOworICAgIGF1dG8gaXQgPSBpbmZvLT5tU2FtcGxlcy5iZWdpbigpOworICAgIGlmIChpdC0+bUJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgIGl0LT5tQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgfQorICAgIGluZm8tPm1TYW1wbGVzLmVyYXNlKGl0KTsKK30KIAotICAgICAgICAgICAgaW5mby0+bVNhbXBsZVRpbWVVcyA9IC0xbGw7Cit2b2lkIE51TWVkaWFFeHRyYWN0b3I6OnJlbGVhc2VUcmFja1NhbXBsZXMoVHJhY2tJbmZvICppbmZvKSB7CisgICAgaWYgKGluZm8gPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXV0byBpdCA9IGluZm8tPm1TYW1wbGVzLmJlZ2luKCk7CisgICAgd2hpbGUgKGl0ICE9IGluZm8tPm1TYW1wbGVzLmVuZCgpKSB7CisgICAgICAgIGlmIChpdC0+bUJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBpdC0+bUJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICB9CisgICAgICAgIGl0ID0gaW5mby0+bVNhbXBsZXMuZXJhc2UoaXQpOwogICAgIH0KIH0KIAotc3NpemVfdCBOdU1lZGlhRXh0cmFjdG9yOjpmZXRjaFRyYWNrU2FtcGxlcygKK3ZvaWQgTnVNZWRpYUV4dHJhY3Rvcjo6cmVsZWFzZUFsbFRyYWNrU2FtcGxlcygpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TZWxlY3RlZFRyYWNrcy5zaXplKCk7ICsraSkgeworICAgICAgICByZWxlYXNlVHJhY2tTYW1wbGVzKCZtU2VsZWN0ZWRUcmFja3MuZWRpdEl0ZW1BdChpKSk7CisgICAgfQorfQorCitzc2l6ZV90IE51TWVkaWFFeHRyYWN0b3I6OmZldGNoQWxsVHJhY2tTYW1wbGVzKAogICAgICAgICBpbnQ2NF90IHNlZWtUaW1lVXMsIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZSkgewogICAgIFRyYWNrSW5mbyAqbWluSW5mbyA9IE5VTEw7Ci0gICAgc3NpemVfdCBtaW5JbmRleCA9IC0xOworICAgIHNzaXplX3QgbWluSW5kZXggPSBFUlJPUl9FTkRfT0ZfU1RSRUFNOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2VsZWN0ZWRUcmFja3Muc2l6ZSgpOyArK2kpIHsKICAgICAgICAgVHJhY2tJbmZvICppbmZvID0gJm1TZWxlY3RlZFRyYWNrcy5lZGl0SXRlbUF0KGkpOworICAgICAgICBmZXRjaFRyYWNrU2FtcGxlcyhpbmZvLCBzZWVrVGltZVVzLCBtb2RlKTsKIAotICAgICAgICBpZiAoc2Vla1RpbWVVcyA+PSAwbGwpIHsKLSAgICAgICAgICAgIGluZm8tPm1GaW5hbFJlc3VsdCA9IE9LOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBpbmZvLT5tRmluYWxSZXN1bHQ7CisgICAgICAgIGlmIChlcnIgIT0gT0sgJiYgZXJyICE9IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGluZm8tPm1TYW1wbGUgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGluZm8tPm1TYW1wbGUtPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICBpbmZvLT5tU2FtcGxlID0gTlVMTDsKLSAgICAgICAgICAgICAgICBpbmZvLT5tU2FtcGxlVGltZVVzID0gLTFsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChpbmZvLT5tRmluYWxSZXN1bHQgIT0gT0spIHsKKyAgICAgICAgaWYgKGluZm8tPm1TYW1wbGVzLmVtcHR5KCkpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGluZm8tPm1TYW1wbGUgPT0gTlVMTCkgewotICAgICAgICAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zIG9wdGlvbnM7Ci0gICAgICAgICAgICBpZiAoc2Vla1RpbWVVcyA+PSAwbGwpIHsKLSAgICAgICAgICAgICAgICBvcHRpb25zLnNldFNlZWtUbyhzZWVrVGltZVVzLCBtb2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGluZm8tPm1Tb3VyY2UtPnJlYWQoJmluZm8tPm1TYW1wbGUsICZvcHRpb25zKTsKLQotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIENIRUNLKGluZm8tPm1TYW1wbGUgPT0gTlVMTCk7Ci0KLSAgICAgICAgICAgICAgICBpbmZvLT5tRmluYWxSZXN1bHQgPSBlcnI7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaW5mby0+bUZpbmFsUmVzdWx0ICE9IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coInJlYWQgb24gdHJhY2sgJXp1IGZhaWxlZCB3aXRoIGVycm9yICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+bVRyYWNrSW5kZXgsIGVycik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaW5mby0+bVNhbXBsZVRpbWVVcyA9IC0xbGw7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIENIRUNLKGluZm8tPm1TYW1wbGUgIT0gTlVMTCk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0soaW5mby0+bVNhbXBsZS0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5VGltZSwgJmluZm8tPm1TYW1wbGVUaW1lVXMpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtaW5JbmZvID09IE5VTEwgIHx8IGluZm8tPm1TYW1wbGVUaW1lVXMgPCBtaW5JbmZvLT5tU2FtcGxlVGltZVVzKSB7CisgICAgICAgIGlmIChtaW5JbmZvID09IE5VTEwpIHsKICAgICAgICAgICAgIG1pbkluZm8gPSBpbmZvOwogICAgICAgICAgICAgbWluSW5kZXggPSBpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXV0byBpdCA9IGluZm8tPm1TYW1wbGVzLmJlZ2luKCk7CisgICAgICAgICAgICBhdXRvIGl0TWluID0gbWluSW5mby0+bVNhbXBsZXMuYmVnaW4oKTsKKyAgICAgICAgICAgIGlmIChpdC0+bVNhbXBsZVRpbWVVcyA8IGl0TWluLT5tU2FtcGxlVGltZVVzKSB7CisgICAgICAgICAgICAgICAgbWluSW5mbyA9IGluZm87CisgICAgICAgICAgICAgICAgbWluSW5kZXggPSBpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIG1pbkluZGV4OwogfQogCit2b2lkIE51TWVkaWFFeHRyYWN0b3I6OmZldGNoVHJhY2tTYW1wbGVzKFRyYWNrSW5mbyAqaW5mbywKKyAgICAgICAgaW50NjRfdCBzZWVrVGltZVVzLCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGUpIHsKKyAgICBpZiAoaW5mbyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgb3B0aW9uczsKKyAgICBpZiAoc2Vla1RpbWVVcyA+PSAwbGwpIHsKKyAgICAgICAgb3B0aW9ucy5zZXRTZWVrVG8oc2Vla1RpbWVVcywgbW9kZSk7CisgICAgICAgIGluZm8tPm1GaW5hbFJlc3VsdCA9IE9LOworICAgICAgICByZWxlYXNlVHJhY2tTYW1wbGVzKGluZm8pOworICAgIH0gZWxzZSBpZiAoaW5mby0+bUZpbmFsUmVzdWx0ICE9IE9LIHx8ICFpbmZvLT5tU2FtcGxlcy5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICBWZWN0b3I8TWVkaWFCdWZmZXJCYXNlICo+IG1lZGlhQnVmZmVyczsKKyAgICBpZiAoaW5mby0+bVNvdXJjZS0+c3VwcG9ydFJlYWRNdWx0aXBsZSgpKSB7CisgICAgICAgIG9wdGlvbnMuc2V0Tm9uQmxvY2tpbmcoKTsKKyAgICAgICAgZXJyID0gaW5mby0+bVNvdXJjZS0+cmVhZE11bHRpcGxlKCZtZWRpYUJ1ZmZlcnMsIGluZm8tPm1NYXhGZXRjaENvdW50LCAmb3B0aW9ucyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICptYnVmID0gTlVMTDsKKyAgICAgICAgZXJyID0gaW5mby0+bVNvdXJjZS0+cmVhZCgmbWJ1ZiwgJm9wdGlvbnMpOworICAgICAgICBpZiAoZXJyID09IE9LICYmIG1idWYgIT0gTlVMTCkgeworICAgICAgICAgICAgbWVkaWFCdWZmZXJzLnB1c2hfYmFjayhtYnVmKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGluZm8tPm1GaW5hbFJlc3VsdCA9IGVycjsKKyAgICBpZiAoZXJyICE9IE9LICYmIGVyciAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIEFMT0dXKCJyZWFkIG9uIHRyYWNrICV6dSBmYWlsZWQgd2l0aCBlcnJvciAlZCIsIGluZm8tPm1UcmFja0luZGV4LCBlcnIpOworICAgICAgICBzaXplX3QgY291bnQgPSBtZWRpYUJ1ZmZlcnMuc2l6ZSgpOworICAgICAgICBmb3IgKHNpemVfdCBpZCA9IDA7IGlkIDwgY291bnQ7ICsraWQpIHsKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqbWJ1ZiA9IG1lZGlhQnVmZmVyc1tpZF07CisgICAgICAgICAgICBpZiAobWJ1ZiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbWJ1Zi0+cmVsZWFzZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzaXplX3QgY291bnQgPSBtZWRpYUJ1ZmZlcnMuc2l6ZSgpOworICAgIGJvb2wgcmVsZWFzZVJlbWFpbmluZyA9IGZhbHNlOworICAgIGZvciAoc2l6ZV90IGlkID0gMDsgaWQgPCBjb3VudDsgKytpZCkgeworICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICptYnVmID0gbWVkaWFCdWZmZXJzW2lkXTsKKyAgICAgICAgaWYgKG1idWYgPT0gTlVMTCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlbGVhc2VSZW1haW5pbmcpIHsKKyAgICAgICAgICAgIG1idWYtPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChtYnVmLT5tZXRhX2RhdGEoKS5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKSB7CisgICAgICAgICAgICBpbmZvLT5tU2FtcGxlcy5lbXBsYWNlX2JhY2sobWJ1ZiwgdGltZVVzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1idWYtPm1ldGFfZGF0YSgpLmR1bXBUb0xvZygpOworICAgICAgICAgICAgaW5mby0+bUZpbmFsUmVzdWx0ID0gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgbWJ1Zi0+cmVsZWFzZSgpOworICAgICAgICAgICAgcmVsZWFzZVJlbWFpbmluZyA9IHRydWU7CisgICAgICAgIH0KKyAgICB9Cit9CisKIHN0YXR1c190IE51TWVkaWFFeHRyYWN0b3I6OnNlZWtUbygKICAgICAgICAgaW50NjRfdCB0aW1lVXMsIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKLSAgICBzc2l6ZV90IG1pbkluZGV4ID0gZmV0Y2hUcmFja1NhbXBsZXModGltZVVzLCBtb2RlKTsKKyAgICBzc2l6ZV90IG1pbkluZGV4ID0gZmV0Y2hBbGxUcmFja1NhbXBsZXModGltZVVzLCBtb2RlKTsKIAogICAgIGlmIChtaW5JbmRleCA8IDApIHsKICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CkBAIC00NjIsNyArNTg2LDcgQEAKIHN0YXR1c190IE51TWVkaWFFeHRyYWN0b3I6OmFkdmFuY2UoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAotICAgIHNzaXplX3QgbWluSW5kZXggPSBmZXRjaFRyYWNrU2FtcGxlcygpOworICAgIHNzaXplX3QgbWluSW5kZXggPSBmZXRjaEFsbFRyYWNrU2FtcGxlcygpOwogCiAgICAgaWYgKG1pbkluZGV4IDwgMCkgewogICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKQEAgLTQ3MCwyOCArNTk0LDI3IEBACiAKICAgICBUcmFja0luZm8gKmluZm8gPSAmbVNlbGVjdGVkVHJhY2tzLmVkaXRJdGVtQXQobWluSW5kZXgpOwogCi0gICAgaW5mby0+bVNhbXBsZS0+cmVsZWFzZSgpOwotICAgIGluZm8tPm1TYW1wbGUgPSBOVUxMOwotICAgIGluZm8tPm1TYW1wbGVUaW1lVXMgPSAtMWxsOworICAgIHJlbGVhc2VPbmVTYW1wbGUoaW5mbyk7CiAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE51TWVkaWFFeHRyYWN0b3I6OmFwcGVuZFZvcmJpc051bVBhZ2VTYW1wbGVzKFRyYWNrSW5mbyAqaW5mbywgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgeworc3RhdHVzX3QgTnVNZWRpYUV4dHJhY3Rvcjo6YXBwZW5kVm9yYmlzTnVtUGFnZVNhbXBsZXMoCisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqbWJ1ZiwgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgewogICAgIGludDMyX3QgbnVtUGFnZVNhbXBsZXM7Ci0gICAgaWYgKCFpbmZvLT5tU2FtcGxlLT5tZXRhX2RhdGEoKS0+ZmluZEludDMyKAorICAgIGlmICghbWJ1Zi0+bWV0YV9kYXRhKCkuZmluZEludDMyKAogICAgICAgICAgICAga0tleVZhbGlkU2FtcGxlcywgJm51bVBhZ2VTYW1wbGVzKSkgewogICAgICAgICBudW1QYWdlU2FtcGxlcyA9IC0xOwogICAgIH0KIAotICAgIG1lbWNweSgodWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgaW5mby0+bVNhbXBsZS0+cmFuZ2VfbGVuZ3RoKCksCisgICAgbWVtY3B5KCh1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBtYnVmLT5yYW5nZV9sZW5ndGgoKSwKICAgICAgICAgICAgJm51bVBhZ2VTYW1wbGVzLAogICAgICAgICAgICBzaXplb2YobnVtUGFnZVNhbXBsZXMpKTsKIAogICAgIHVpbnQzMl90IHR5cGU7CiAgICAgY29uc3Qgdm9pZCAqZGF0YTsKICAgICBzaXplX3Qgc2l6ZSwgc2l6ZTI7Ci0gICAgaWYgKGluZm8tPm1TYW1wbGUtPm1ldGFfZGF0YSgpLT5maW5kRGF0YShrS2V5RW5jcnlwdGVkU2l6ZXMsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CisgICAgaWYgKG1idWYtPm1ldGFfZGF0YSgpLmZpbmREYXRhKGtLZXlFbmNyeXB0ZWRTaXplcywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKICAgICAgICAgLy8gU2lnbmFsIG51bVBhZ2VTYW1wbGVzIChhIHBsYWluIGludDMyX3QpIGlzIGFwcGVuZGVkIGF0IHRoZSBlbmQsCiAgICAgICAgIC8vIGkuZS4gc2l6ZW9mKG51bVBhZ2VTYW1wbGVzKSBwbGFpbiBieXRlcyArIDAgZW5jcnlwdGVkIGJ5dGVzCiAgICAgICAgIGlmIChTSVpFX01BWCAtIHNpemUgPCBzaXplb2YoaW50MzJfdCkpIHsKQEAgLTUwOSw5ICs2MzIsOSBAQAogICAgICAgICBpbnQzMl90IHplcm8gPSAwOwogICAgICAgICBtZW1jcHkoYWRhdGEsIGRhdGEsIHNpemUpOwogICAgICAgICBtZW1jcHkoYWRhdGEgKyBzaXplLCAmemVybywgc2l6ZW9mKHplcm8pKTsKLSAgICAgICAgaW5mby0+bVNhbXBsZS0+bWV0YV9kYXRhKCktPnNldERhdGEoa0tleUVuY3J5cHRlZFNpemVzLCB0eXBlLCBhZGF0YSwgbmV3U2l6ZSk7CisgICAgICAgIG1idWYtPm1ldGFfZGF0YSgpLnNldERhdGEoa0tleUVuY3J5cHRlZFNpemVzLCB0eXBlLCBhZGF0YSwgbmV3U2l6ZSk7CiAKLSAgICAgICAgaWYgKGluZm8tPm1TYW1wbGUtPm1ldGFfZGF0YSgpLT5maW5kRGF0YShrS2V5UGxhaW5TaXplcywgJnR5cGUsICZkYXRhLCAmc2l6ZTIpKSB7CisgICAgICAgIGlmIChtYnVmLT5tZXRhX2RhdGEoKS5maW5kRGF0YShrS2V5UGxhaW5TaXplcywgJnR5cGUsICZkYXRhLCAmc2l6ZTIpKSB7CiAgICAgICAgICAgICBpZiAoc2l6ZTIgIT0gc2l6ZSkgewogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CkBAIC01MjQsNyArNjQ3LDcgQEAKICAgICAgICAgLy8gYXBwZW5kIHNpemVvZihudW1QYWdlU2FtcGxlcykgdG8gcGxhaW4gc2l6ZXMuCiAgICAgICAgIGludDMyX3QgaW50MzJTaXplID0gc2l6ZW9mKG51bVBhZ2VTYW1wbGVzKTsKICAgICAgICAgbWVtY3B5KGFkYXRhICsgc2l6ZSwgJmludDMyU2l6ZSwgc2l6ZW9mKGludDMyU2l6ZSkpOwotICAgICAgICBpbmZvLT5tU2FtcGxlLT5tZXRhX2RhdGEoKS0+c2V0RGF0YShrS2V5UGxhaW5TaXplcywgdHlwZSwgYWRhdGEsIG5ld1NpemUpOworICAgICAgICBtYnVmLT5tZXRhX2RhdGEoKS5zZXREYXRhKGtLZXlQbGFpblNpemVzLCB0eXBlLCBhZGF0YSwgbmV3U2l6ZSk7CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwpAQCAtNTMzLDcgKzY1Niw3IEBACiBzdGF0dXNfdCBOdU1lZGlhRXh0cmFjdG9yOjpyZWFkU2FtcGxlRGF0YShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAotICAgIHNzaXplX3QgbWluSW5kZXggPSBmZXRjaFRyYWNrU2FtcGxlcygpOworICAgIHNzaXplX3QgbWluSW5kZXggPSBmZXRjaEFsbFRyYWNrU2FtcGxlcygpOwogCiAgICAgaWYgKG1pbkluZGV4IDwgMCkgewogICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKQEAgLTU0MSw3ICs2NjQsOCBAQAogCiAgICAgVHJhY2tJbmZvICppbmZvID0gJm1TZWxlY3RlZFRyYWNrcy5lZGl0SXRlbUF0KG1pbkluZGV4KTsKIAotICAgIHNpemVfdCBzYW1wbGVTaXplID0gaW5mby0+bVNhbXBsZS0+cmFuZ2VfbGVuZ3RoKCk7CisgICAgYXV0byBpdCA9IGluZm8tPm1TYW1wbGVzLmJlZ2luKCk7CisgICAgc2l6ZV90IHNhbXBsZVNpemUgPSBpdC0+bUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7CiAKICAgICBpZiAoaW5mby0+bVRyYWNrRmxhZ3MgJiBrSXNWb3JiaXMpIHsKICAgICAgICAgLy8gRWFjaCBzYW1wbGUncyBkYXRhIGlzIHN1ZmZpeGVkIGJ5IHRoZSBudW1iZXIgb2YgcGFnZSBzYW1wbGVzCkBAIC01NTQsMTQgKzY3OCwxNCBAQAogICAgIH0KIAogICAgIGNvbnN0IHVpbnQ4X3QgKnNyYyA9Ci0gICAgICAgIChjb25zdCB1aW50OF90ICopaW5mby0+bVNhbXBsZS0+ZGF0YSgpCi0gICAgICAgICAgICArIGluZm8tPm1TYW1wbGUtPnJhbmdlX29mZnNldCgpOworICAgICAgICAoY29uc3QgdWludDhfdCAqKWl0LT5tQnVmZmVyLT5kYXRhKCkKKyAgICAgICAgICAgICsgaXQtPm1CdWZmZXItPnJhbmdlX29mZnNldCgpOwogCi0gICAgbWVtY3B5KCh1aW50OF90ICopYnVmZmVyLT5kYXRhKCksIHNyYywgaW5mby0+bVNhbXBsZS0+cmFuZ2VfbGVuZ3RoKCkpOworICAgIG1lbWNweSgodWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpLCBzcmMsIGl0LT5tQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CiAKICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKICAgICBpZiAoaW5mby0+bVRyYWNrRmxhZ3MgJiBrSXNWb3JiaXMpIHsKLSAgICAgICAgZXJyID0gYXBwZW5kVm9yYmlzTnVtUGFnZVNhbXBsZXMoaW5mbywgYnVmZmVyKTsKKyAgICAgICAgZXJyID0gYXBwZW5kVm9yYmlzTnVtUGFnZVNhbXBsZXMoaXQtPm1CdWZmZXIsIGJ1ZmZlcik7CiAgICAgfQogCiAgICAgaWYgKGVyciA9PSBPSykgewpAQCAtNTcxLDEwICs2OTUsMzIgQEAKICAgICByZXR1cm4gZXJyOwogfQogCitzdGF0dXNfdCBOdU1lZGlhRXh0cmFjdG9yOjpnZXRTYW1wbGVTaXplKHNpemVfdCAqc2FtcGxlU2l6ZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBzc2l6ZV90IG1pbkluZGV4ID0gZmV0Y2hBbGxUcmFja1NhbXBsZXMoKTsKKworICAgIGlmIChtaW5JbmRleCA8IDApIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgfQorCisgICAgVHJhY2tJbmZvICppbmZvID0gJm1TZWxlY3RlZFRyYWNrcy5lZGl0SXRlbUF0KG1pbkluZGV4KTsKKyAgICBhdXRvIGl0ID0gaW5mby0+bVNhbXBsZXMuYmVnaW4oKTsKKyAgICAqc2FtcGxlU2l6ZSA9IGl0LT5tQnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKKworICAgIGlmIChpbmZvLT5tVHJhY2tGbGFncyAmIGtJc1ZvcmJpcykgeworICAgICAgICAvLyBFYWNoIHNhbXBsZSdzIGRhdGEgaXMgc3VmZml4ZWQgYnkgdGhlIG51bWJlciBvZiBwYWdlIHNhbXBsZXMKKyAgICAgICAgLy8gb3IgLTEgaWYgbm90IGF2YWlsYWJsZS4KKyAgICAgICAgKnNhbXBsZVNpemUgKz0gc2l6ZW9mKGludDMyX3QpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKwogc3RhdHVzX3QgTnVNZWRpYUV4dHJhY3Rvcjo6Z2V0U2FtcGxlVHJhY2tJbmRleChzaXplX3QgKnRyYWNrSW5kZXgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCi0gICAgc3NpemVfdCBtaW5JbmRleCA9IGZldGNoVHJhY2tTYW1wbGVzKCk7CisgICAgc3NpemVfdCBtaW5JbmRleCA9IGZldGNoQWxsVHJhY2tTYW1wbGVzKCk7CiAKICAgICBpZiAobWluSW5kZXggPCAwKSB7CiAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwpAQCAtNTg5LDE0ICs3MzUsMTQgQEAKIHN0YXR1c190IE51TWVkaWFFeHRyYWN0b3I6OmdldFNhbXBsZVRpbWUoaW50NjRfdCAqc2FtcGxlVGltZVVzKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAotICAgIHNzaXplX3QgbWluSW5kZXggPSBmZXRjaFRyYWNrU2FtcGxlcygpOworICAgIHNzaXplX3QgbWluSW5kZXggPSBmZXRjaEFsbFRyYWNrU2FtcGxlcygpOwogCiAgICAgaWYgKG1pbkluZGV4IDwgMCkgewogICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICB9CiAKICAgICBUcmFja0luZm8gKmluZm8gPSAmbVNlbGVjdGVkVHJhY2tzLmVkaXRJdGVtQXQobWluSW5kZXgpOwotICAgICpzYW1wbGVUaW1lVXMgPSBpbmZvLT5tU2FtcGxlVGltZVVzOworICAgICpzYW1wbGVUaW1lVXMgPSBpbmZvLT5tU2FtcGxlcy5iZWdpbigpLT5tU2FtcGxlVGltZVVzOwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtNjA2LDE0ICs3NTIsMTUgQEAKIAogICAgICpzYW1wbGVNZXRhID0gTlVMTDsKIAotICAgIHNzaXplX3QgbWluSW5kZXggPSBmZXRjaFRyYWNrU2FtcGxlcygpOworICAgIHNzaXplX3QgbWluSW5kZXggPSBmZXRjaEFsbFRyYWNrU2FtcGxlcygpOwogCiAgICAgaWYgKG1pbkluZGV4IDwgMCkgewotICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbWluSW5kZXg7CisgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCiAgICAgVHJhY2tJbmZvICppbmZvID0gJm1TZWxlY3RlZFRyYWNrcy5lZGl0SXRlbUF0KG1pbkluZGV4KTsKLSAgICAqc2FtcGxlTWV0YSA9IGluZm8tPm1TYW1wbGUtPm1ldGFfZGF0YSgpOworICAgICpzYW1wbGVNZXRhID0gbmV3IE1ldGFEYXRhKGluZm8tPm1TYW1wbGVzLmJlZ2luKCktPm1CdWZmZXItPm1ldGFfZGF0YSgpKTsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTYyNCw3ICs3NzEsNyBAQAogfQogCiBib29sIE51TWVkaWFFeHRyYWN0b3I6OmdldFRvdGFsQml0cmF0ZShpbnQ2NF90ICpiaXRyYXRlKSBjb25zdCB7Ci0gICAgaWYgKG1Ub3RhbEJpdHJhdGUgPj0gMCkgeworICAgIGlmIChtVG90YWxCaXRyYXRlID4gMCkgewogICAgICAgICAqYml0cmF0ZSA9IG1Ub3RhbEJpdHJhdGU7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENsaWVudC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDbGllbnQuY3BwCmluZGV4IDVmNTBlNDYuLjkzNzVkZTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENsaWVudC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ2xpZW50LmNwcApAQCAtMjUsNyArMjUsNiBAQAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAKICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSU1lZGlhQ29kZWNTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ2xpZW50Lmg+CiAKICNpbmNsdWRlIDxtZWRpYS9JT01YLmg+CkBAIC0zOCw3MCArMzcsMjUgQEAKIH0KIAogc3RhdHVzX3QgT01YQ2xpZW50Ojpjb25uZWN0KCkgewotICAgIHJldHVybiBjb25uZWN0KCJkZWZhdWx0IiwgbnVsbHB0cik7CisgICAgcmV0dXJuIGNvbm5lY3QoImRlZmF1bHQiKTsKIH0KIAotc3RhdHVzX3QgT01YQ2xpZW50Ojpjb25uZWN0KGJvb2wqIHRyZWJsZUZsYWcpIHsKLSAgICBpZiAocHJvcGVydHlfZ2V0X2Jvb2woInBlcnNpc3QubWVkaWEudHJlYmxlX29teCIsIHRydWUpKSB7Ci0gICAgICAgIGlmICh0cmVibGVGbGFnICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICp0cmVibGVGbGFnID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29ubmVjdFRyZWJsZSgpOwotICAgIH0KLSAgICBpZiAodHJlYmxlRmxhZyAhPSBudWxscHRyKSB7Ci0gICAgICAgICp0cmVibGVGbGFnID0gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBjb25uZWN0TGVnYWN5KCk7Ci19Ci0KLXN0YXR1c190IE9NWENsaWVudDo6Y29ubmVjdChjb25zdCBjaGFyKiBuYW1lLCBib29sKiB0cmVibGVGbGFnKSB7Ci0gICAgaWYgKHByb3BlcnR5X2dldF9ib29sKCJwZXJzaXN0Lm1lZGlhLnRyZWJsZV9vbXgiLCB0cnVlKSkgewotICAgICAgICBpZiAodHJlYmxlRmxhZyAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAqdHJlYmxlRmxhZyA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbm5lY3RUcmVibGUobmFtZSk7Ci0gICAgfQotICAgIGlmICh0cmVibGVGbGFnICE9IG51bGxwdHIpIHsKLSAgICAgICAgKnRyZWJsZUZsYWcgPSBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIGNvbm5lY3RMZWdhY3koKTsKLX0KLQotc3RhdHVzX3QgT01YQ2xpZW50Ojpjb25uZWN0TGVnYWN5KCkgewotICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKLSAgICBzcDxJQmluZGVyPiBjb2RlY2JpbmRlciA9IHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5jb2RlYyIpKTsKLSAgICBzcDxJTWVkaWFDb2RlY1NlcnZpY2U+IGNvZGVjc2VydmljZSA9IGludGVyZmFjZV9jYXN0PElNZWRpYUNvZGVjU2VydmljZT4oY29kZWNiaW5kZXIpOwotCi0gICAgaWYgKGNvZGVjc2VydmljZS5nZXQoKSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJDYW5ub3Qgb2J0YWluIElNZWRpYUNvZGVjU2VydmljZSIpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0KLSAgICBtT01YID0gY29kZWNzZXJ2aWNlLT5nZXRPTVgoKTsKLSAgICBpZiAobU9NWC5nZXQoKSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJDYW5ub3Qgb2J0YWluIG1lZGlhY29kZWMgSU9NWCIpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IE9NWENsaWVudDo6Y29ubmVjdFRyZWJsZShjb25zdCBjaGFyKiBuYW1lKSB7CitzdGF0dXNfdCBPTVhDbGllbnQ6OmNvbm5lY3QoY29uc3QgY2hhciogbmFtZSkgewogICAgIHVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOwogICAgIGlmIChuYW1lID09IG51bGxwdHIpIHsKICAgICAgICAgbmFtZSA9ICJkZWZhdWx0IjsKICAgICB9CiAgICAgc3A8SU9teD4gdE9teCA9IElPbXg6OmdldFNlcnZpY2UobmFtZSk7CiAgICAgaWYgKHRPbXguZ2V0KCkgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiQ2Fubm90IG9idGFpbiBUcmVibGUgSU9teC4iKTsKKyAgICAgICAgQUxPR0UoIkNhbm5vdCBvYnRhaW4gSU9teCBzZXJ2aWNlLiIpOwogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgaWYgKCF0T214LT5pc1JlbW90ZSgpKSB7Ci0gICAgICAgIEFMT0dFKCJUcmVibGUgSU9teCBpcyBpbiBwYXNzdGhyb3VnaCBtb2RlLiIpOworICAgICAgICBBTE9HRSgiSU9teCBzZXJ2aWNlIHJ1bm5pbmcgaW4gcGFzc3Rocm91Z2ggbW9kZS4iKTsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogICAgIG1PTVggPSBuZXcgdXRpbHM6OkxXT214KHRPbXgpOwotICAgIEFMT0dJKCJUcmVibGUgSU9teCBvYnRhaW5lZCIpOworICAgIEFMT0dJKCJJT214IHNlcnZpY2Ugb2J0YWluZWQiKTsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTEwOSw0ICs2Myw4IEBACiAgICAgbU9NWC5jbGVhcigpOwogfQogCitzcDxJT01YPiBPTVhDbGllbnQ6OmludGVyZmFjZSgpIHsKKyAgICByZXR1cm4gbU9NWDsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09nZ0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PZ2dFeHRyYWN0b3IuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTBiMGQ2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09nZ0V4dHJhY3Rvci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMzgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIk9nZ0V4dHJhY3RvciIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgImluY2x1ZGUvT2dnRXh0cmFjdG9yLmgiCi0KLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0KLWV4dGVybiAiQyIgewotICAgICNpbmNsdWRlIDxUcmVtb2xvL2NvZGVjX2ludGVybmFsLmg+Ci0KLSAgICBpbnQgX3ZvcmJpc191bnBhY2tfYm9va3Modm9yYmlzX2luZm8gKnZpLG9nZ3BhY2tfYnVmZmVyICpvcGIpOwotICAgIGludCBfdm9yYmlzX3VucGFja19pbmZvKHZvcmJpc19pbmZvICp2aSxvZ2dwYWNrX2J1ZmZlciAqb3BiKTsKLSAgICBpbnQgX3ZvcmJpc191bnBhY2tfY29tbWVudCh2b3JiaXNfY29tbWVudCAqdmMsb2dncGFja19idWZmZXIgKm9wYik7Ci0gICAgbG9uZyB2b3JiaXNfcGFja2V0X2Jsb2Nrc2l6ZSh2b3JiaXNfaW5mbyAqdmksb2dnX3BhY2tldCAqb3ApOwotfQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBPZ2dTb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UgewotICAgIGV4cGxpY2l0IE9nZ1NvdXJjZShjb25zdCBzcDxPZ2dFeHRyYWN0b3I+ICZleHRyYWN0b3IpOwotCi0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMgPSBOVUxMKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+T2dnU291cmNlKCk7Ci0KLXByaXZhdGU6Ci0gICAgc3A8T2dnRXh0cmFjdG9yPiBtRXh0cmFjdG9yOwotICAgIGJvb2wgbVN0YXJ0ZWQ7Ci0KLSAgICBPZ2dTb3VyY2UoY29uc3QgT2dnU291cmNlICYpOwotICAgIE9nZ1NvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IE9nZ1NvdXJjZSAmKTsKLX07Ci0KLXN0cnVjdCBNeU9nZ0V4dHJhY3RvciB7Ci0gICAgTXlPZ2dFeHRyYWN0b3IoCi0gICAgICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLAotICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZVR5cGUsCi0gICAgICAgICAgICBzaXplX3QgbnVtSGVhZGVycywKLSAgICAgICAgICAgIGludDY0X3Qgc2Vla1ByZVJvbGxVcyk7Ci0gICAgdmlydHVhbCB+TXlPZ2dFeHRyYWN0b3IoKTsKLQotICAgIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKSBjb25zdDsKLQotICAgIC8vIFJldHVybnMgYW4gYXBwcm94aW1hdGUgYml0cmF0ZSBpbiBiaXRzIHBlciBzZWNvbmQuCi0gICAgdmlydHVhbCB1aW50NjRfdCBhcHByb3hCaXRyYXRlKCkgY29uc3QgPSAwOwotCi0gICAgc3RhdHVzX3Qgc2Vla1RvVGltZShpbnQ2NF90IHRpbWVVcyk7Ci0gICAgc3RhdHVzX3Qgc2Vla1RvT2Zmc2V0KG9mZjY0X3Qgb2Zmc2V0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVyICoqYnVmZmVyKSA9IDA7Ci0KLSAgICBzdGF0dXNfdCBpbml0KCk7Ci0KLSAgICBzcDxNZXRhRGF0YT4gZ2V0RmlsZU1ldGFEYXRhKCkgeyByZXR1cm4gbUZpbGVNZXRhOyB9Ci0KLXByb3RlY3RlZDoKLSAgICBzdHJ1Y3QgUGFnZSB7Ci0gICAgICAgIHVpbnQ2NF90IG1HcmFudWxlUG9zaXRpb247Ci0gICAgICAgIGludDMyX3QgbVByZXZQYWNrZXRTaXplOwotICAgICAgICB1aW50NjRfdCBtUHJldlBhY2tldFBvczsKLSAgICAgICAgdWludDMyX3QgbVNlcmlhbE5vOwotICAgICAgICB1aW50MzJfdCBtUGFnZU5vOwotICAgICAgICB1aW50OF90IG1GbGFnczsKLSAgICAgICAgdWludDhfdCBtTnVtU2VnbWVudHM7Ci0gICAgICAgIHVpbnQ4X3QgbUxhY2VbMjU1XTsKLSAgICB9OwotCi0gICAgc3RydWN0IFRPQ0VudHJ5IHsKLSAgICAgICAgb2ZmNjRfdCBtUGFnZU9mZnNldDsKLSAgICAgICAgaW50NjRfdCBtVGltZVVzOwotICAgIH07Ci0KLSAgICBzcDxEYXRhU291cmNlPiBtU291cmNlOwotICAgIG9mZjY0X3QgbU9mZnNldDsKLSAgICBQYWdlIG1DdXJyZW50UGFnZTsKLSAgICB1aW50NjRfdCBtQ3VyR3JhbnVsZVBvc2l0aW9uOwotICAgIHVpbnQ2NF90IG1QcmV2R3JhbnVsZVBvc2l0aW9uOwotICAgIHNpemVfdCBtQ3VycmVudFBhZ2VTaXplOwotICAgIGJvb2wgbUZpcnN0UGFja2V0SW5QYWdlOwotICAgIHVpbnQ2NF90IG1DdXJyZW50UGFnZVNhbXBsZXM7Ci0gICAgc2l6ZV90IG1OZXh0TGFjZUluZGV4OwotCi0gICAgY29uc3QgY2hhciAqbU1pbWVUeXBlOwotICAgIHNpemVfdCBtTnVtSGVhZGVyczsKLSAgICBpbnQ2NF90IG1TZWVrUHJlUm9sbFVzOwotCi0gICAgb2ZmNjRfdCBtRmlyc3REYXRhT2Zmc2V0OwotCi0gICAgdm9yYmlzX2luZm8gbVZpOwotICAgIHZvcmJpc19jb21tZW50IG1WYzsKLQotICAgIHNwPE1ldGFEYXRhPiBtTWV0YTsKLSAgICBzcDxNZXRhRGF0YT4gbUZpbGVNZXRhOwotCi0gICAgVmVjdG9yPFRPQ0VudHJ5PiBtVGFibGVPZkNvbnRlbnRzOwotCi0gICAgc3NpemVfdCByZWFkUGFnZShvZmY2NF90IG9mZnNldCwgUGFnZSAqcGFnZSk7Ci0gICAgc3RhdHVzX3QgZmluZE5leHRQYWdlKG9mZjY0X3Qgc3RhcnRPZmZzZXQsIG9mZjY0X3QgKnBhZ2VPZmZzZXQpOwotCi0gICAgdmlydHVhbCBpbnQ2NF90IGdldFRpbWVVc09mR3JhbnVsZSh1aW50NjRfdCBncmFudWxlUG9zKSBjb25zdCA9IDA7Ci0KLSAgICAvLyBFeHRyYWN0IGNvZGVjIGZvcm1hdCwgbWV0YWRhdGEgdGFncywgYW5kIHZhcmlvdXMgY29kZWMgc3BlY2lmaWMgZGF0YTsKLSAgICAvLyB0aGUgZm9ybWF0IGFuZCBDU0QncyBhcmUgcmVxdWlyZWQgdG8gc2V0dXAgdGhlIGRlY29kZXJzIGZvciB0aGUgZW5jbG9zZWQgbWVkaWEgY29udGVudC4KLSAgICAvLwotICAgIC8vIFZhbGlkIHZhbHVlcyBmb3IgYHR5cGVgIGFyZToKLSAgICAvLyAxIC0gYml0c3RyZWFtIGlkZW50aWZpY2F0aW9uIGhlYWRlcgotICAgIC8vIDMgLSBjb21tZW50IGhlYWRlcgotICAgIC8vIDUgLSBjb2RlYyBzZXR1cCBoZWFkZXIgKFZvcmJpcyBvbmx5KQotICAgIHZpcnR1YWwgc3RhdHVzX3QgdmVyaWZ5SGVhZGVyKE1lZGlhQnVmZmVyICpidWZmZXIsIHVpbnQ4X3QgdHlwZSkgPSAwOwotCi0gICAgLy8gUmVhZCB0aGUgbmV4dCBvZ2cgcGFja2V0IGZyb20gdGhlIHVuZGVybHlpbmcgZGF0YSBzb3VyY2U7IG9wdGlvbmFsbHkKLSAgICAvLyBjYWxjdWxhdGUgdGhlIHRpbWVzdGFtcCBmb3IgdGhlIG91dHB1dCBwYWNrZXQgd2hpbHN0IHByZXRlbmRpbmcKLSAgICAvLyB0aGF0IHdlIGFyZSBwYXJzaW5nIGFuIE9nZyBWb3JiaXMgc3RyZWFtLgotICAgIC8vCi0gICAgLy8gKmJ1ZmZlciBpcyBOVUxMJ2VkIG91dCBpbW1lZGlhdGVseSB1cG9uIGVudHJ5LCBhbmQgaWYgc3VjY2Vzc2Z1bCBhIG5ldyBidWZmZXIgaXMgYWxsb2NhdGVkOwotICAgIC8vIGNsaWVudHMgYXJlIHJlc3BvbnNpYmxlIGZvciByZWxlYXNpbmcgdGhlIG9yaWdpbmFsIGJ1ZmZlci4KLSAgICBzdGF0dXNfdCBfcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXIgKipidWZmZXIsIGJvb2wgY2FsY1ZvcmJpc1RpbWVzdGFtcCk7Ci0KLSAgICBpbnQzMl90IGdldFBhY2tldEJsb2NrU2l6ZShNZWRpYUJ1ZmZlciAqYnVmZmVyKTsKLQotICAgIHZvaWQgcGFyc2VGaWxlTWV0YURhdGEoKTsKLQotICAgIHN0YXR1c190IGZpbmRQcmV2R3JhbnVsZVBvc2l0aW9uKG9mZjY0X3QgcGFnZU9mZnNldCwgdWludDY0X3QgKmdyYW51bGVQb3MpOwotCi0gICAgdm9pZCBidWlsZFRhYmxlT2ZDb250ZW50cygpOwotCi0gICAgTXlPZ2dFeHRyYWN0b3IoY29uc3QgTXlPZ2dFeHRyYWN0b3IgJik7Ci0gICAgTXlPZ2dFeHRyYWN0b3IgJm9wZXJhdG9yPShjb25zdCBNeU9nZ0V4dHJhY3RvciAmKTsKLX07Ci0KLXN0cnVjdCBNeVZvcmJpc0V4dHJhY3RvciA6IHB1YmxpYyBNeU9nZ0V4dHJhY3RvciB7Ci0gICAgZXhwbGljaXQgTXlWb3JiaXNFeHRyYWN0b3IoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSkKLSAgICAgICAgOiBNeU9nZ0V4dHJhY3Rvcihzb3VyY2UsCi0gICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTLAotICAgICAgICAgICAgICAgIC8qIG51bUhlYWRlcnMgKi8gMywKLSAgICAgICAgICAgICAgICAvKiBzZWVrUHJlUm9sbFVzICovIDApIHsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHVpbnQ2NF90IGFwcHJveEJpdHJhdGUoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXIgKipidWZmZXIpIHsKLSAgICAgICAgcmV0dXJuIF9yZWFkTmV4dFBhY2tldChidWZmZXIsIC8qIGNhbGNWb3JiaXNUaW1lc3RhbXAgPSAqLyB0cnVlKTsKLSAgICB9Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIGludDY0X3QgZ2V0VGltZVVzT2ZHcmFudWxlKHVpbnQ2NF90IGdyYW51bGVQb3MpIGNvbnN0IHsKLSAgICAgICAgaWYgKGdyYW51bGVQb3MgPiBJTlQ2NF9NQVggLyAxMDAwMDAwbGwpIHsKLSAgICAgICAgICAgIHJldHVybiBJTlQ2NF9NQVg7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdyYW51bGVQb3MgKiAxMDAwMDAwbGwgLyBtVmkucmF0ZTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHZlcmlmeUhlYWRlcihNZWRpYUJ1ZmZlciAqYnVmZmVyLCB1aW50OF90IHR5cGUpOwotfTsKLQotc3RydWN0IE15T3B1c0V4dHJhY3RvciA6IHB1YmxpYyBNeU9nZ0V4dHJhY3RvciB7Ci0gICAgc3RhdGljIGNvbnN0IGludDMyX3Qga09wdXNTYW1wbGVSYXRlID0gNDgwMDA7Ci0gICAgc3RhdGljIGNvbnN0IGludDY0X3Qga09wdXNTZWVrUHJlUm9sbFVzID0gODAwMDA7IC8vIDgwIG1zCi0KLSAgICBleHBsaWNpdCBNeU9wdXNFeHRyYWN0b3IoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSkKLSAgICAgICAgOiBNeU9nZ0V4dHJhY3Rvcihzb3VyY2UsIE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMsIC8qbnVtSGVhZGVycyovIDIsIGtPcHVzU2Vla1ByZVJvbGxVcyksCi0gICAgICAgICAgbUNoYW5uZWxDb3VudCgwKSwKLSAgICAgICAgICBtQ29kZWNEZWxheSgwKSwKLSAgICAgICAgICBtU3RhcnRHcmFudWxlUG9zaXRpb24oLTEpIHsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHVpbnQ2NF90IGFwcHJveEJpdHJhdGUoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXIgKipidWZmZXIpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCBpbnQ2NF90IGdldFRpbWVVc09mR3JhbnVsZSh1aW50NjRfdCBncmFudWxlUG9zKSBjb25zdDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHZlcmlmeUhlYWRlcihNZWRpYUJ1ZmZlciAqYnVmZmVyLCB1aW50OF90IHR5cGUpOwotCi1wcml2YXRlOgotICAgIHN0YXR1c190IHZlcmlmeU9wdXNIZWFkZXIoTWVkaWFCdWZmZXIgKmJ1ZmZlcik7Ci0gICAgc3RhdHVzX3QgdmVyaWZ5T3B1c0NvbW1lbnRzKE1lZGlhQnVmZmVyICpidWZmZXIpOwotICAgIHVpbnQzMl90IGdldE51bVNhbXBsZXNJblBhY2tldChNZWRpYUJ1ZmZlciAqYnVmZmVyKSBjb25zdDsKLQotICAgIHVpbnQ4X3QgbUNoYW5uZWxDb3VudDsKLSAgICB1aW50MTZfdCBtQ29kZWNEZWxheTsKLSAgICBpbnQ2NF90IG1TdGFydEdyYW51bGVQb3NpdGlvbjsKLX07Ci0KLXN0YXRpYyB2b2lkIGV4dHJhY3RBbGJ1bUFydCgKLSAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZmaWxlTWV0YSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1PZ2dTb3VyY2U6Ok9nZ1NvdXJjZShjb25zdCBzcDxPZ2dFeHRyYWN0b3I+ICZleHRyYWN0b3IpCi0gICAgOiBtRXh0cmFjdG9yKGV4dHJhY3RvciksCi0gICAgICBtU3RhcnRlZChmYWxzZSkgewotfQotCi1PZ2dTb3VyY2U6On5PZ2dTb3VyY2UoKSB7Ci0gICAgaWYgKG1TdGFydGVkKSB7Ci0gICAgICAgIHN0b3AoKTsKLSAgICB9Ci19Ci0KLXNwPE1ldGFEYXRhPiBPZ2dTb3VyY2U6OmdldEZvcm1hdCgpIHsKLSAgICByZXR1cm4gbUV4dHJhY3Rvci0+bUltcGwtPmdldEZvcm1hdCgpOwotfQotCi1zdGF0dXNfdCBPZ2dTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICogLyogcGFyYW1zICovKSB7Ci0gICAgaWYgKG1TdGFydGVkKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBtU3RhcnRlZCA9IHRydWU7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IE9nZ1NvdXJjZTo6c3RvcCgpIHsKLSAgICBtU3RhcnRlZCA9IGZhbHNlOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBPZ2dTb3VyY2U6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewotICAgICpvdXQgPSBOVUxMOwotCi0gICAgaW50NjRfdCBzZWVrVGltZVVzOwotICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOwotICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IG1FeHRyYWN0b3ItPm1JbXBsLT5zZWVrVG9UaW1lKHNlZWtUaW1lVXMpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgTWVkaWFCdWZmZXIgKnBhY2tldDsKLSAgICBzdGF0dXNfdCBlcnIgPSBtRXh0cmFjdG9yLT5tSW1wbC0+cmVhZE5leHRQYWNrZXQoJnBhY2tldCk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0jaWYgMAotICAgIGludDY0X3QgdGltZVVzOwotICAgIGlmIChwYWNrZXQtPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKSB7Ci0gICAgICAgIEFMT0dJKCJmb3VuZCB0aW1lID0gJWxsZCB1cyIsIHRpbWVVcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0koIk5PIHRpbWUiKTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIHBhY2tldC0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7Ci0KLSAgICAqb3V0ID0gcGFja2V0OwotCi0gICAgcmV0dXJuIE9LOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1NeU9nZ0V4dHJhY3Rvcjo6TXlPZ2dFeHRyYWN0b3IoCi0gICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsCi0gICAgICAgIGNvbnN0IGNoYXIgKm1pbWVUeXBlLAotICAgICAgICBzaXplX3QgbnVtSGVhZGVycywKLSAgICAgICAgaW50NjRfdCBzZWVrUHJlUm9sbFVzKQotICAgIDogbVNvdXJjZShzb3VyY2UpLAotICAgICAgbU9mZnNldCgwKSwKLSAgICAgIG1DdXJHcmFudWxlUG9zaXRpb24oMCksCi0gICAgICBtUHJldkdyYW51bGVQb3NpdGlvbigwKSwKLSAgICAgIG1DdXJyZW50UGFnZVNpemUoMCksCi0gICAgICBtRmlyc3RQYWNrZXRJblBhZ2UodHJ1ZSksCi0gICAgICBtQ3VycmVudFBhZ2VTYW1wbGVzKDApLAotICAgICAgbU5leHRMYWNlSW5kZXgoMCksCi0gICAgICBtTWltZVR5cGUobWltZVR5cGUpLAotICAgICAgbU51bUhlYWRlcnMobnVtSGVhZGVycyksCi0gICAgICBtU2Vla1ByZVJvbGxVcyhzZWVrUHJlUm9sbFVzKSwKLSAgICAgIG1GaXJzdERhdGFPZmZzZXQoLTEpIHsKLSAgICBtQ3VycmVudFBhZ2UubU51bVNlZ21lbnRzID0gMDsKLQotICAgIHZvcmJpc19pbmZvX2luaXQoJm1WaSk7Ci0gICAgdm9yYmlzX2NvbW1lbnRfaW5pdCgmbVZjKTsKLX0KLQotTXlPZ2dFeHRyYWN0b3I6On5NeU9nZ0V4dHJhY3RvcigpIHsKLSAgICB2b3JiaXNfY29tbWVudF9jbGVhcigmbVZjKTsKLSAgICB2b3JiaXNfaW5mb19jbGVhcigmbVZpKTsKLX0KLQotc3A8TWV0YURhdGE+IE15T2dnRXh0cmFjdG9yOjpnZXRGb3JtYXQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1NZXRhOwotfQotCi1zdGF0dXNfdCBNeU9nZ0V4dHJhY3Rvcjo6ZmluZE5leHRQYWdlKAotICAgICAgICBvZmY2NF90IHN0YXJ0T2Zmc2V0LCBvZmY2NF90ICpwYWdlT2Zmc2V0KSB7Ci0gICAgKnBhZ2VPZmZzZXQgPSBzdGFydE9mZnNldDsKLQotICAgIGZvciAoOzspIHsKLSAgICAgICAgY2hhciBzaWduYXR1cmVbNF07Ci0gICAgICAgIHNzaXplX3QgbiA9IG1Tb3VyY2UtPnJlYWRBdCgqcGFnZU9mZnNldCwgJnNpZ25hdHVyZSwgNCk7Ci0KLSAgICAgICAgaWYgKG4gPCA0KSB7Ci0gICAgICAgICAgICAqcGFnZU9mZnNldCA9IDA7Ci0KLSAgICAgICAgICAgIHJldHVybiAobiA8IDApID8gbiA6IChzdGF0dXNfdClFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFtZW1jbXAoc2lnbmF0dXJlLCAiT2dnUyIsIDQpKSB7Ci0gICAgICAgICAgICBpZiAoKnBhZ2VPZmZzZXQgPiBzdGFydE9mZnNldCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJza2lwcGVkICVsbGQgYnl0ZXMgb2YganVuayB0byByZWFjaCBuZXh0IGZyYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpKCpwYWdlT2Zmc2V0IC0gc3RhcnRPZmZzZXQpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0KLSAgICAgICAgKysqcGFnZU9mZnNldDsKLSAgICB9Ci19Ci0KLS8vIEdpdmVuIHRoZSBvZmZzZXQgb2YgdGhlICJjdXJyZW50IiBwYWdlLCBmaW5kIHRoZSBwYWdlIGltbWVkaWF0ZWx5IHByZWNlZGluZwotLy8gaXQgKGlmIGFueSkgYW5kIHJldHVybiBpdHMgZ3JhbnVsZSBwb3NpdGlvbi4KLS8vIFRvIGRvIHRoaXMgd2UgYmFjayB1cCBmcm9tIHRoZSAiY3VycmVudCIgcGFnZSdzIG9mZnNldCB1bnRpbCB3ZSBmaW5kIGFueQotLy8gcGFnZSBwcmVjZWRpbmcgaXQgYW5kIHRoZW4gc2NhbiBmb3J3YXJkIHRvIGp1c3QgYmVmb3JlIHRoZSBjdXJyZW50IHBhZ2UuCi1zdGF0dXNfdCBNeU9nZ0V4dHJhY3Rvcjo6ZmluZFByZXZHcmFudWxlUG9zaXRpb24oCi0gICAgICAgIG9mZjY0X3QgcGFnZU9mZnNldCwgdWludDY0X3QgKmdyYW51bGVQb3MpIHsKLSAgICAqZ3JhbnVsZVBvcyA9IDA7Ci0KLSAgICBvZmY2NF90IHByZXZQYWdlT2Zmc2V0ID0gMDsKLSAgICBvZmY2NF90IHByZXZHdWVzcyA9IHBhZ2VPZmZzZXQ7Ci0gICAgZm9yICg7OykgewotICAgICAgICBpZiAocHJldkd1ZXNzID49IDUwMDApIHsKLSAgICAgICAgICAgIHByZXZHdWVzcyAtPSA1MDAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHJldkd1ZXNzID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIEFMT0dWKCJiYWNraW5nIHVwICVsbGQgYnl0ZXMiLCAobG9uZyBsb25nKShwYWdlT2Zmc2V0IC0gcHJldkd1ZXNzKSk7Ci0KLSAgICAgICAgc3RhdHVzX3QgZXJyID0gZmluZE5leHRQYWdlKHByZXZHdWVzcywgJnByZXZQYWdlT2Zmc2V0KTsKLSAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7Ci0gICAgICAgICAgICAvLyBXZSBhcmUgYXQgdGhlIGxhc3QgcGFnZSBhbmQgZGlkbid0IGJhY2sgb2ZmIGVub3VnaDsKLSAgICAgICAgICAgIC8vIGJhY2sgb2ZmIDUwMDAgYnl0ZXMgbW9yZSBhbmQgdHJ5IGFnYWluLgotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByZXZQYWdlT2Zmc2V0IDwgcGFnZU9mZnNldCB8fCBwcmV2R3Vlc3MgPT0gMCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocHJldlBhZ2VPZmZzZXQgPT0gcGFnZU9mZnNldCkgewotICAgICAgICAvLyBXZSBkaWQgbm90IGZpbmQgYSBwYWdlIHByZWNlZGluZyB0aGlzIG9uZS4KLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgQUxPR1YoInByZXZQYWdlT2Zmc2V0IGF0ICVsbGQsIHBhZ2VPZmZzZXQgYXQgJWxsZCIsCi0gICAgICAgICAgICAobG9uZyBsb25nKXByZXZQYWdlT2Zmc2V0LCAobG9uZyBsb25nKXBhZ2VPZmZzZXQpOwotCi0gICAgZm9yICg7OykgewotICAgICAgICBQYWdlIHByZXZQYWdlOwotICAgICAgICBzc2l6ZV90IG4gPSByZWFkUGFnZShwcmV2UGFnZU9mZnNldCwgJnByZXZQYWdlKTsKLQotICAgICAgICBpZiAobiA8PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gKHN0YXR1c190KW47Ci0gICAgICAgIH0KLQotICAgICAgICBwcmV2UGFnZU9mZnNldCArPSBuOwotCi0gICAgICAgIGlmIChwcmV2UGFnZU9mZnNldCA9PSBwYWdlT2Zmc2V0KSB7Ci0gICAgICAgICAgICAqZ3JhbnVsZVBvcyA9IHByZXZQYWdlLm1HcmFudWxlUG9zaXRpb247Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXR1c190IE15T2dnRXh0cmFjdG9yOjpzZWVrVG9UaW1lKGludDY0X3QgdGltZVVzKSB7Ci0gICAgdGltZVVzIC09IG1TZWVrUHJlUm9sbFVzOwotICAgIGlmICh0aW1lVXMgPCAwKSB7Ci0gICAgICAgIHRpbWVVcyA9IDA7Ci0gICAgfQotCi0gICAgaWYgKG1UYWJsZU9mQ29udGVudHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIC8vIFBlcmZvcm0gYXBwcm94aW1hdGUgc2Vla2luZyBiYXNlZCBvbiBhdmcuIGJpdHJhdGUuCi0gICAgICAgIHVpbnQ2NF90IGJwcyA9IGFwcHJveEJpdHJhdGUoKTsKLSAgICAgICAgaWYgKGJwcyA8PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIH0KLQotICAgICAgICBvZmY2NF90IHBvcyA9IHRpbWVVcyAqIGJwcyAvIDgwMDAwMDBsbDsKLQotICAgICAgICBBTE9HVigic2Vla2luZyB0byBvZmZzZXQgJWxsZCIsIChsb25nIGxvbmcpcG9zKTsKLSAgICAgICAgcmV0dXJuIHNlZWtUb09mZnNldChwb3MpOwotICAgIH0KLQotICAgIHNpemVfdCBsZWZ0ID0gMDsKLSAgICBzaXplX3QgcmlnaHRfcGx1c19vbmUgPSBtVGFibGVPZkNvbnRlbnRzLnNpemUoKTsKLSAgICB3aGlsZSAobGVmdCA8IHJpZ2h0X3BsdXNfb25lKSB7Ci0gICAgICAgIHNpemVfdCBjZW50ZXIgPSBsZWZ0ICsgKHJpZ2h0X3BsdXNfb25lIC0gbGVmdCkgLyAyOwotCi0gICAgICAgIGNvbnN0IFRPQ0VudHJ5ICZlbnRyeSA9IG1UYWJsZU9mQ29udGVudHMuaXRlbUF0KGNlbnRlcik7Ci0KLSAgICAgICAgaWYgKHRpbWVVcyA8IGVudHJ5Lm1UaW1lVXMpIHsKLSAgICAgICAgICAgIHJpZ2h0X3BsdXNfb25lID0gY2VudGVyOwotICAgICAgICB9IGVsc2UgaWYgKHRpbWVVcyA+IGVudHJ5Lm1UaW1lVXMpIHsKLSAgICAgICAgICAgIGxlZnQgPSBjZW50ZXIgKyAxOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGVmdCA9IGNlbnRlcjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGxlZnQgPT0gbVRhYmxlT2ZDb250ZW50cy5zaXplKCkpIHsKLSAgICAgICAgLS1sZWZ0OwotICAgIH0KLQotICAgIGNvbnN0IFRPQ0VudHJ5ICZlbnRyeSA9IG1UYWJsZU9mQ29udGVudHMuaXRlbUF0KGxlZnQpOwotCi0gICAgQUxPR1YoInNlZWtpbmcgdG8gZW50cnkgJXp1IC8gJXp1IGF0IG9mZnNldCAlbGxkIiwKLSAgICAgICAgIGxlZnQsIG1UYWJsZU9mQ29udGVudHMuc2l6ZSgpLCAobG9uZyBsb25nKWVudHJ5Lm1QYWdlT2Zmc2V0KTsKLQotICAgIHJldHVybiBzZWVrVG9PZmZzZXQoZW50cnkubVBhZ2VPZmZzZXQpOwotfQotCi1zdGF0dXNfdCBNeU9nZ0V4dHJhY3Rvcjo6c2Vla1RvT2Zmc2V0KG9mZjY0X3Qgb2Zmc2V0KSB7Ci0gICAgaWYgKG1GaXJzdERhdGFPZmZzZXQgPj0gMCAmJiBvZmZzZXQgPCBtRmlyc3REYXRhT2Zmc2V0KSB7Ci0gICAgICAgIC8vIE9uY2Ugd2Uga25vdyB3aGVyZSB0aGUgYWN0dWFsIGF1ZGlvIGRhdGEgc3RhcnRzIChwYXN0IHRoZSBoZWFkZXJzKQotICAgICAgICAvLyBkb24ndCBldmVyIHNlZWsgdG8gYW55d2hlcmUgYmVmb3JlIHRoYXQuCi0gICAgICAgIG9mZnNldCA9IG1GaXJzdERhdGFPZmZzZXQ7Ci0gICAgfQotCi0gICAgb2ZmNjRfdCBwYWdlT2Zmc2V0OwotICAgIHN0YXR1c190IGVyciA9IGZpbmROZXh0UGFnZShvZmZzZXQsICZwYWdlT2Zmc2V0KTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvLyBXZSBmb3VuZCB0aGUgcGFnZSB3ZSB3YW50ZWQgdG8gc2VlayB0bywgYnV0IHdlJ2xsIGFsc28gbmVlZAotICAgIC8vIHRoZSBwYWdlIHByZWNlZGluZyBpdCB0byBkZXRlcm1pbmUgaG93IG1hbnkgdmFsaWQgc2FtcGxlcyBhcmUgb24KLSAgICAvLyB0aGlzIHBhZ2UuCi0gICAgZmluZFByZXZHcmFudWxlUG9zaXRpb24ocGFnZU9mZnNldCwgJm1QcmV2R3JhbnVsZVBvc2l0aW9uKTsKLQotICAgIG1PZmZzZXQgPSBwYWdlT2Zmc2V0OwotCi0gICAgbUN1cnJlbnRQYWdlU2l6ZSA9IDA7Ci0gICAgbUZpcnN0UGFja2V0SW5QYWdlID0gdHJ1ZTsKLSAgICBtQ3VycmVudFBhZ2VTYW1wbGVzID0gMDsKLSAgICBtQ3VycmVudFBhZ2UubU51bVNlZ21lbnRzID0gMDsKLSAgICBtQ3VycmVudFBhZ2UubVByZXZQYWNrZXRTaXplID0gLTE7Ci0gICAgbU5leHRMYWNlSW5kZXggPSAwOwotCi0gICAgLy8gWFhYIHdoYXQgaWYgbmV3IHBhZ2UgY29udGludWVzIHBhY2tldCBmcm9tIGxhc3Q/Pz8KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3NpemVfdCBNeU9nZ0V4dHJhY3Rvcjo6cmVhZFBhZ2Uob2ZmNjRfdCBvZmZzZXQsIFBhZ2UgKnBhZ2UpIHsKLSAgICB1aW50OF90IGhlYWRlclsyN107Ci0gICAgc3NpemVfdCBuOwotICAgIGlmICgobiA9IG1Tb3VyY2UtPnJlYWRBdChvZmZzZXQsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpKQotICAgICAgICAgICAgPCAoc3NpemVfdClzaXplb2YoaGVhZGVyKSkgewotICAgICAgICBBTE9HVigiZmFpbGVkIHRvIHJlYWQgJXp1IGJ5dGVzIGF0IG9mZnNldCAlIzAxNmxseCwgZ290ICV6ZCBieXRlcyIsCi0gICAgICAgICAgICAgICAgc2l6ZW9mKGhlYWRlciksIChsb25nIGxvbmcpb2Zmc2V0LCBuKTsKLQotICAgICAgICBpZiAobiA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBuOwotICAgICAgICB9IGVsc2UgaWYgKG4gPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobWVtY21wKGhlYWRlciwgIk9nZ1MiLCA0KSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGlmIChoZWFkZXJbNF0gIT0gMCkgewotICAgICAgICAvLyBXcm9uZyB2ZXJzaW9uLgotCi0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBwYWdlLT5tRmxhZ3MgPSBoZWFkZXJbNV07Ci0KLSAgICBpZiAocGFnZS0+bUZsYWdzICYgfjcpIHsKLSAgICAgICAgLy8gT25seSBiaXRzIDAtMiBhcmUgZGVmaW5lZCBpbiB2ZXJzaW9uIDAuCi0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgcGFnZS0+bUdyYW51bGVQb3NpdGlvbiA9IFU2NExFX0FUKCZoZWFkZXJbNl0pOwotCi0jaWYgMAotICAgIHByaW50ZigiZ3JhbnVsZVBvc2l0aW9uID0gJWxsdSAoMHglbGx4KVxuIiwKLSAgICAgICAgICAgcGFnZS0+bUdyYW51bGVQb3NpdGlvbiwgcGFnZS0+bUdyYW51bGVQb3NpdGlvbik7Ci0jZW5kaWYKLQotICAgIHBhZ2UtPm1TZXJpYWxObyA9IFUzMkxFX0FUKCZoZWFkZXJbMTRdKTsKLSAgICBwYWdlLT5tUGFnZU5vID0gVTMyTEVfQVQoJmhlYWRlclsxOF0pOwotCi0gICAgcGFnZS0+bU51bVNlZ21lbnRzID0gaGVhZGVyWzI2XTsKLSAgICBpZiAobVNvdXJjZS0+cmVhZEF0KAotICAgICAgICAgICAgICAgIG9mZnNldCArIHNpemVvZihoZWFkZXIpLCBwYWdlLT5tTGFjZSwgcGFnZS0+bU51bVNlZ21lbnRzKQotICAgICAgICAgICAgPCAoc3NpemVfdClwYWdlLT5tTnVtU2VnbWVudHMpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgIH0KLQotICAgIHNpemVfdCB0b3RhbFNpemUgPSAwOzsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhZ2UtPm1OdW1TZWdtZW50czsgKytpKSB7Ci0gICAgICAgIHRvdGFsU2l6ZSArPSBwYWdlLT5tTGFjZVtpXTsKLSAgICB9Ci0KLSNpZiAwCi0gICAgU3RyaW5nOCB0bXA7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYWdlLT5tTnVtU2VnbWVudHM7ICsraSkgewotICAgICAgICBjaGFyIHhbMzJdOwotICAgICAgICBzcHJpbnRmKHgsICIlcyV1IiwgaSA+IDAgPyAiLCAiIDogIiIsICh1bnNpZ25lZClwYWdlLT5tTGFjZVtpXSk7Ci0KLSAgICAgICAgdG1wLmFwcGVuZCh4KTsKLSAgICB9Ci0KLSAgICBBTE9HVigiJWMgJXMiLCBwYWdlLT5tRmxhZ3MgJiAxID8gJysnIDogJyAnLCB0bXAuc3RyaW5nKCkpOwotI2VuZGlmCi0KLSAgICByZXR1cm4gc2l6ZW9mKGhlYWRlcikgKyBwYWdlLT5tTnVtU2VnbWVudHMgKyB0b3RhbFNpemU7Ci19Ci0KLXN0YXR1c190IE15T3B1c0V4dHJhY3Rvcjo6cmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXIgKipvdXQpIHsKLSAgICBpZiAobU9mZnNldCA8PSBtRmlyc3REYXRhT2Zmc2V0ICYmIG1TdGFydEdyYW51bGVQb3NpdGlvbiA8IDApIHsKLSAgICAgICAgLy8gVGhlIGZpcnN0IHNhbXBsZSBtaWdodCBub3Qgc3RhcnQgYXQgdGltZSAwOyBmaW5kIG91dCB3aGVyZSBieSBzdWJ0cmFjdGluZwotICAgICAgICAvLyB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgb24gdGhlIGZpcnN0IHBhZ2UgZnJvbSB0aGUgZ3JhbnVsZSBwb3NpdGlvbgotICAgICAgICAvLyAocG9zaXRpb24gb2YgbGFzdCBjb21wbGV0ZSBzYW1wbGUpIG9mIHRoZSBmaXJzdCBwYWdlLiBUaGlzIGhhcHBlbnMKLSAgICAgICAgLy8gdGhlIGZpcnN0IHRpbWUgYmVmb3JlIHdlIGF0dGVtcHQgdG8gcmVhZCBhIHBhY2tldCBmcm9tIHRoZSBmaXJzdCBwYWdlLgotICAgICAgICBNZWRpYUJ1ZmZlciAqbUJ1ZjsKLSAgICAgICAgdWludDMyX3QgbnVtU2FtcGxlcyA9IDA7Ci0gICAgICAgIHVpbnQ2NF90IGN1ckdyYW51bGVQb3NpdGlvbiA9IDA7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBfcmVhZE5leHRQYWNrZXQoJm1CdWYsIC8qIGNhbGNWb3JiaXNUaW1lc3RhbXAgPSAqL2ZhbHNlKTsKLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0sgJiYgZXJyICE9IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gRmlyc3QgdHdvIHBhZ2VzIGFyZSBoZWFkZXIgcGFnZXMuCi0gICAgICAgICAgICBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0gfHwgbUN1cnJlbnRQYWdlLm1QYWdlTm8gPiAyKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1CdWYgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBtQnVmLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWYgPSBOVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGN1ckdyYW51bGVQb3NpdGlvbiA9IG1DdXJyZW50UGFnZS5tR3JhbnVsZVBvc2l0aW9uOwotICAgICAgICAgICAgbnVtU2FtcGxlcyArPSBnZXROdW1TYW1wbGVzSW5QYWNrZXQobUJ1Zik7Ci0gICAgICAgICAgICBtQnVmLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBtQnVmID0gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjdXJHcmFudWxlUG9zaXRpb24gPiBudW1TYW1wbGVzKSB7Ci0gICAgICAgICAgICBtU3RhcnRHcmFudWxlUG9zaXRpb24gPSBjdXJHcmFudWxlUG9zaXRpb24gLSBudW1TYW1wbGVzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVN0YXJ0R3JhbnVsZVBvc2l0aW9uID0gMDsKLSAgICAgICAgfQotICAgICAgICBzZWVrVG9PZmZzZXQoMCk7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZXJyID0gX3JlYWROZXh0UGFja2V0KG91dCwgLyogY2FsY1ZvcmJpc1RpbWVzdGFtcCA9ICovZmFsc2UpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpbnQzMl90IGN1cnJlbnRQYWdlU2FtcGxlczsKLSAgICAvLyBDYWxjdWxhdGUgdGltZXN0YW1wcyBieSBhY2N1bXVsYXRpbmcgZHVyYXRpb25zIHN0YXJ0aW5nIGZyb20gdGhlIGZpcnN0IHNhbXBsZSBvZiBhIHBhZ2U7Ci0gICAgLy8gV2UgYXNzdW1lIHRoYXQgd2Ugb25seSBzZWVrIHRvIHBhZ2UgYm91bmRhcmllcy4KLSAgICBpZiAoKCpvdXQpLT5tZXRhX2RhdGEoKS0+ZmluZEludDMyKGtLZXlWYWxpZFNhbXBsZXMsICZjdXJyZW50UGFnZVNhbXBsZXMpKSB7Ci0gICAgICAgIC8vIGZpcnN0IHBhY2tldCBpbiBwYWdlCi0gICAgICAgIGlmIChtT2Zmc2V0ID09IG1GaXJzdERhdGFPZmZzZXQpIHsKLSAgICAgICAgICAgIGN1cnJlbnRQYWdlU2FtcGxlcyAtPSBtU3RhcnRHcmFudWxlUG9zaXRpb247Ci0gICAgICAgICAgICAoKm91dCktPm1ldGFfZGF0YSgpLT5zZXRJbnQzMihrS2V5VmFsaWRTYW1wbGVzLCBjdXJyZW50UGFnZVNhbXBsZXMpOwotICAgICAgICB9Ci0gICAgICAgIG1DdXJHcmFudWxlUG9zaXRpb24gPSBtQ3VycmVudFBhZ2UubUdyYW51bGVQb3NpdGlvbiAtIGN1cnJlbnRQYWdlU2FtcGxlczsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IHRpbWVVcyA9IGdldFRpbWVVc09mR3JhbnVsZShtQ3VyR3JhbnVsZVBvc2l0aW9uKTsKLSAgICAoKm91dCktPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKLQotICAgIHVpbnQzMl90IGZyYW1lcyA9IGdldE51bVNhbXBsZXNJblBhY2tldCgqb3V0KTsKLSAgICBtQ3VyR3JhbnVsZVBvc2l0aW9uICs9IGZyYW1lczsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXVpbnQzMl90IE15T3B1c0V4dHJhY3Rvcjo6Z2V0TnVtU2FtcGxlc0luUGFja2V0KE1lZGlhQnVmZmVyICpidWZmZXIpIGNvbnN0IHsKLSAgICBpZiAoYnVmZmVyID09IE5VTEwgfHwgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA8IDEpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgdWludDhfdCAqZGF0YSA9ICh1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpOwotICAgIHVpbnQ4X3QgdG9jID0gZGF0YVswXTsKLSAgICB1aW50OF90IGNvbmZpZyA9ICh0b2MgPj4gMykgJiAweDFmOwotICAgIHVpbnQzMl90IGZyYW1lU2l6ZXNVc1tdID0gewotICAgICAgICAxMDAwMCwgMjAwMDAsIDQwMDAwLCA2MDAwMCwgLy8gMC4uLjMKLSAgICAgICAgMTAwMDAsIDIwMDAwLCA0MDAwMCwgNjAwMDAsIC8vIDQuLi43Ci0gICAgICAgIDEwMDAwLCAyMDAwMCwgNDAwMDAsIDYwMDAwLCAvLyA4Li4uMTEKLSAgICAgICAgMTAwMDAsIDIwMDAwLCAgICAgICAgICAgICAgIC8vIDEyLi4uMTMKLSAgICAgICAgMTAwMDAsIDIwMDAwLCAgICAgICAgICAgICAgIC8vIDE0Li4uMTUKLSAgICAgICAgMjUwMCwgNTAwMCwgMTAwMDAsIDIwMDAwLCAgIC8vIDE2Li4uMTkKLSAgICAgICAgMjUwMCwgNTAwMCwgMTAwMDAsIDIwMDAwLCAgIC8vIDIwLi4uMjMKLSAgICAgICAgMjUwMCwgNTAwMCwgMTAwMDAsIDIwMDAwLCAgIC8vIDI0Li4uMjcKLSAgICAgICAgMjUwMCwgNTAwMCwgMTAwMDAsIDIwMDAwICAgIC8vIDI4Li4uMzEKLSAgICB9OwotICAgIHVpbnQzMl90IGZyYW1lU2l6ZVVzID0gZnJhbWVTaXplc1VzW2NvbmZpZ107Ci0KLSAgICB1aW50MzJfdCBudW1GcmFtZXM7Ci0gICAgdWludDhfdCBjID0gdG9jICYgMzsKLSAgICBzd2l0Y2ggKGMpIHsKLSAgICBjYXNlIDA6Ci0gICAgICAgIG51bUZyYW1lcyA9IDE7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMToKLSAgICBjYXNlIDI6Ci0gICAgICAgIG51bUZyYW1lcyA9IDI7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMzoKLSAgICAgICAgaWYgKGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPCAzKSB7Ci0gICAgICAgICAgICBudW1GcmFtZXMgPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbnVtRnJhbWVzID0gZGF0YVsyXSAmIDB4M2Y7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgVFJFU1BBU1MoKTsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBudW1TYW1wbGVzID0gZnJhbWVTaXplVXMgKiBudW1GcmFtZXMgKiBrT3B1c1NhbXBsZVJhdGUgLyAxMDAwMDAwOwotICAgIHJldHVybiBudW1TYW1wbGVzOwotfQotCi1zdGF0dXNfdCBNeU9nZ0V4dHJhY3Rvcjo6X3JlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVyICoqb3V0LCBib29sIGNhbGNWb3JiaXNUaW1lc3RhbXApIHsKLSAgICAqb3V0ID0gTlVMTDsKLQotICAgIE1lZGlhQnVmZmVyICpidWZmZXIgPSBOVUxMOwotICAgIGludDY0X3QgdGltZVVzID0gLTE7Ci0KLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIHNpemVfdCBpOwotICAgICAgICBzaXplX3QgcGFja2V0U2l6ZSA9IDA7Ci0gICAgICAgIGJvb2wgZ290RnVsbFBhY2tldCA9IGZhbHNlOwotICAgICAgICBmb3IgKGkgPSBtTmV4dExhY2VJbmRleDsgaSA8IG1DdXJyZW50UGFnZS5tTnVtU2VnbWVudHM7ICsraSkgewotICAgICAgICAgICAgdWludDhfdCBsYWNlID0gbUN1cnJlbnRQYWdlLm1MYWNlW2ldOwotCi0gICAgICAgICAgICBwYWNrZXRTaXplICs9IGxhY2U7Ci0KLSAgICAgICAgICAgIGlmIChsYWNlIDwgMjU1KSB7Ci0gICAgICAgICAgICAgICAgZ290RnVsbFBhY2tldCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgKytpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1OZXh0TGFjZUluZGV4IDwgbUN1cnJlbnRQYWdlLm1OdW1TZWdtZW50cykgewotICAgICAgICAgICAgb2ZmNjRfdCBkYXRhT2Zmc2V0ID0gbU9mZnNldCArIDI3ICsgbUN1cnJlbnRQYWdlLm1OdW1TZWdtZW50czsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbU5leHRMYWNlSW5kZXg7ICsraikgewotICAgICAgICAgICAgICAgIGRhdGFPZmZzZXQgKz0gbUN1cnJlbnRQYWdlLm1MYWNlW2pdOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzaXplX3QgZnVsbFNpemUgPSBwYWNrZXRTaXplOwotICAgICAgICAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZnVsbFNpemUgKz0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChmdWxsU2l6ZSA+IDE2ICogMTAyNCAqIDEwMjQpIHsgLy8gYXJiaXRyYXJ5IGxpbWl0IG9mIDE2IE1CIHBhY2tldCBzaXplCi0gICAgICAgICAgICAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBTE9HRSgiYi8zNjU5MjIwMiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqdG1wID0gbmV3IChzdGQ6Om5vdGhyb3cpIE1lZGlhQnVmZmVyKGZ1bGxTaXplKTsKLSAgICAgICAgICAgIGlmICh0bXAgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGlmIChidWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQUxPR0UoImIvMzY1OTIyMDIiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KHRtcC0+ZGF0YSgpLCBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgdG1wLT5zZXRfcmFuZ2UoMCwgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRtcC0+c2V0X3JhbmdlKDAsIDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVmZmVyID0gdG1wOwotCi0gICAgICAgICAgICBzc2l6ZV90IG4gPSBtU291cmNlLT5yZWFkQXQoCi0gICAgICAgICAgICAgICAgICAgIGRhdGFPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICh1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX2xlbmd0aCgpLAotICAgICAgICAgICAgICAgICAgICBwYWNrZXRTaXplKTsKLQotICAgICAgICAgICAgaWYgKG4gPCAoc3NpemVfdClwYWNrZXRTaXplKSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImZhaWxlZCB0byByZWFkICV6dSBieXRlcyBhdCAlIzAxNmxseCwgZ290ICV6ZCBieXRlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwYWNrZXRTaXplLCAobG9uZyBsb25nKWRhdGFPZmZzZXQsIG4pOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgZnVsbFNpemUpOwotCi0gICAgICAgICAgICBtTmV4dExhY2VJbmRleCA9IGk7Ci0KLSAgICAgICAgICAgIGlmIChnb3RGdWxsUGFja2V0KSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UndmUganVzdCByZWFkIHRoZSBlbnRpcmUgcGFja2V0LgotCi0gICAgICAgICAgICAgICAgaWYgKG1GaXJzdFBhY2tldEluUGFnZSkgewotICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQzMigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5VmFsaWRTYW1wbGVzLCBtQ3VycmVudFBhZ2VTYW1wbGVzKTsKLSAgICAgICAgICAgICAgICAgICAgbUZpcnN0UGFja2V0SW5QYWdlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGNhbGNWb3JiaXNUaW1lc3RhbXApIHsKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjdXJCbG9ja1NpemUgPSBnZXRQYWNrZXRCbG9ja1NpemUoYnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50UGFnZS5tUHJldlBhY2tldFNpemUgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFBhZ2UubVByZXZQYWNrZXRTaXplID0gY3VyQmxvY2tTaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRQYWdlLm1QcmV2UGFja2V0UG9zID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRQYWdlLm1HcmFudWxlUG9zaXRpb24gLSBtQ3VycmVudFBhZ2VTYW1wbGVzOwotICAgICAgICAgICAgICAgICAgICAgICAgdGltZVVzID0gbUN1cnJlbnRQYWdlLm1QcmV2UGFja2V0UG9zICogMTAwMDAwMGxsIC8gbVZpLnJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZWZmZWN0aXZlIGJsb2NrIHNpemUgaXMgdGhlIGF2ZXJhZ2Ugb2YgdGhlIHR3byBvdmVybGFwcGVkIGJsb2NrcwotICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBhY3R1YWxCbG9ja1NpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3VyQmxvY2tTaXplICsgbUN1cnJlbnRQYWdlLm1QcmV2UGFja2V0U2l6ZSkgLyAyOwotICAgICAgICAgICAgICAgICAgICAgICAgdGltZVVzID0gbUN1cnJlbnRQYWdlLm1QcmV2UGFja2V0UG9zICogMTAwMDAwMGxsIC8gbVZpLnJhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgYWN0dWFsIHNpemUgb3V0cHV0IGJ5IHRoZSBkZWNvZGVyIHdpbGwgYmUgaGFsZiB0aGUgZWZmZWN0aXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzaXplLCBkdWUgdG8gdGhlIG92ZXJsYXAKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50UGFnZS5tUHJldlBhY2tldFBvcyArPSBhY3R1YWxCbG9ja1NpemUgLyAyOwotICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRQYWdlLm1QcmV2UGFja2V0U2l6ZSA9IGN1ckJsb2NrU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKm91dCA9IGJ1ZmZlcjsKLQotICAgICAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoLCB0aGUgYnVmZmVyIG5vdyBjb250YWlucyB0aGUgc3RhcnQgb2YgdGhlIHBhY2tldC4KLSAgICAgICAgfQotCi0gICAgICAgIENIRUNLX0VRKG1OZXh0TGFjZUluZGV4LCBtQ3VycmVudFBhZ2UubU51bVNlZ21lbnRzKTsKLQotICAgICAgICBtT2Zmc2V0ICs9IG1DdXJyZW50UGFnZVNpemU7Ci0gICAgICAgIHNzaXplX3QgbiA9IHJlYWRQYWdlKG1PZmZzZXQsICZtQ3VycmVudFBhZ2UpOwotCi0gICAgICAgIGlmIChuIDw9IDApIHsKLSAgICAgICAgICAgIGlmIChidWZmZXIpIHsKLSAgICAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICBidWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBTE9HVigicmVhZFBhZ2UgcmV0dXJuZWQgJXpkIiwgbik7Ci0KLSAgICAgICAgICAgIHJldHVybiBuIDwgMCA/IG4gOiAoc3RhdHVzX3QpRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFByZXZlbnQgYSBoYXJtbGVzcyB1bnNpZ25lZCBpbnRlZ2VyIG92ZXJmbG93IGJ5IGNsYW1waW5nIHRvIDAKLSAgICAgICAgaWYgKG1DdXJyZW50UGFnZS5tR3JhbnVsZVBvc2l0aW9uID49IG1QcmV2R3JhbnVsZVBvc2l0aW9uKSB7Ci0gICAgICAgICAgICBtQ3VycmVudFBhZ2VTYW1wbGVzID0KLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRQYWdlLm1HcmFudWxlUG9zaXRpb24gLSBtUHJldkdyYW51bGVQb3NpdGlvbjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1DdXJyZW50UGFnZVNhbXBsZXMgPSAwOwotICAgICAgICB9Ci0gICAgICAgIG1GaXJzdFBhY2tldEluUGFnZSA9IHRydWU7Ci0KLSAgICAgICAgbVByZXZHcmFudWxlUG9zaXRpb24gPSBtQ3VycmVudFBhZ2UubUdyYW51bGVQb3NpdGlvbjsKLQotICAgICAgICBtQ3VycmVudFBhZ2VTaXplID0gbjsKLSAgICAgICAgbU5leHRMYWNlSW5kZXggPSAwOwotCi0gICAgICAgIGlmIChidWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgaWYgKChtQ3VycmVudFBhZ2UubUZsYWdzICYgMSkgPT0gMCkgewotICAgICAgICAgICAgICAgIC8vIFRoaXMgcGFnZSBkb2VzIG5vdCBjb250aW51ZSB0aGUgcGFja2V0LCBpLmUuIHRoZSBwYWNrZXQKLSAgICAgICAgICAgICAgICAvLyBpcyBhbHJlYWR5IGNvbXBsZXRlLgotCi0gICAgICAgICAgICAgICAgaWYgKHRpbWVVcyA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDMyKAotICAgICAgICAgICAgICAgICAgICAgICAga0tleVZhbGlkU2FtcGxlcywgbUN1cnJlbnRQYWdlU2FtcGxlcyk7Ci0gICAgICAgICAgICAgICAgbUZpcnN0UGFja2V0SW5QYWdlID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAqb3V0ID0gYnVmZmVyOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0dXNfdCBNeU9nZ0V4dHJhY3Rvcjo6aW5pdCgpIHsKLSAgICBtTWV0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICBtTWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIG1NaW1lVHlwZSk7Ci0KLSAgICBzdGF0dXNfdCBlcnI7Ci0gICAgTWVkaWFCdWZmZXIgKnBhY2tldDsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OdW1IZWFkZXJzOyArK2kpIHsKLSAgICAgICAgLy8gaWdub3JlIHRpbWVzdGFtcCBmb3IgY29uZmlndXJhdGlvbiBwYWNrZXRzCi0gICAgICAgIGlmICgoZXJyID0gX3JlYWROZXh0UGFja2V0KCZwYWNrZXQsIC8qIGNhbGNWb3JiaXNUaW1lc3RhbXAgPSAqLyBmYWxzZSkpICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJyZWFkIHBhY2tldCBvZiBzaXplICV6dVxuIiwgcGFja2V0LT5yYW5nZV9sZW5ndGgoKSk7Ci0gICAgICAgIGVyciA9IHZlcmlmeUhlYWRlcihwYWNrZXQsIC8qIHR5cGUgPSAqLyBpICogMiArIDEpOwotICAgICAgICBwYWNrZXQtPnJlbGVhc2UoKTsKLSAgICAgICAgcGFja2V0ID0gTlVMTDsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG1GaXJzdERhdGFPZmZzZXQgPSBtT2Zmc2V0ICsgbUN1cnJlbnRQYWdlU2l6ZTsKLQotICAgIG9mZjY0X3Qgc2l6ZTsKLSAgICB1aW50NjRfdCBsYXN0R3JhbnVsZVBvc2l0aW9uOwotICAgIGlmICghKG1Tb3VyY2UtPmZsYWdzKCkgJiBEYXRhU291cmNlOjprSXNDYWNoaW5nRGF0YVNvdXJjZSkKLSAgICAgICAgICAgICYmIG1Tb3VyY2UtPmdldFNpemUoJnNpemUpID09IE9LCi0gICAgICAgICAgICAmJiBmaW5kUHJldkdyYW51bGVQb3NpdGlvbihzaXplLCAmbGFzdEdyYW51bGVQb3NpdGlvbikgPT0gT0spIHsKLSAgICAgICAgLy8gTGV0J3MgYXNzdW1lIGl0J3MgY2hlYXAgdG8gc2VlayB0byB0aGUgZW5kLgotICAgICAgICAvLyBUaGUgZ3JhbnVsZSBwb3NpdGlvbiBvZiB0aGUgZmluYWwgcGFnZSBpbiB0aGUgc3RyZWFtIHdpbGwKLSAgICAgICAgLy8gZ2l2ZSB1cyB0aGUgZXhhY3QgZHVyYXRpb24gb2YgdGhlIGNvbnRlbnQsIHNvbWV0aGluZyB0aGF0Ci0gICAgICAgIC8vIHdlIGNhbiBvbmx5IGFwcHJveGltYXRlIHVzaW5nIGF2Zy4gYml0cmF0ZSBpZiBzZWVraW5nIHRvCi0gICAgICAgIC8vIHRoZSBlbmQgaXMgdG9vIGV4cGVuc2l2ZSBvciBpbXBvc3NpYmxlIChsaXZlIHN0cmVhbWluZykuCi0KLSAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzID0gZ2V0VGltZVVzT2ZHcmFudWxlKGxhc3RHcmFudWxlUG9zaXRpb24pOwotCi0gICAgICAgIG1NZXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uVXMpOwotCi0gICAgICAgIGJ1aWxkVGFibGVPZkNvbnRlbnRzKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIE15T2dnRXh0cmFjdG9yOjpidWlsZFRhYmxlT2ZDb250ZW50cygpIHsKLSAgICBvZmY2NF90IG9mZnNldCA9IG1GaXJzdERhdGFPZmZzZXQ7Ci0gICAgUGFnZSBwYWdlOwotICAgIHNzaXplX3QgcGFnZVNpemU7Ci0gICAgd2hpbGUgKChwYWdlU2l6ZSA9IHJlYWRQYWdlKG9mZnNldCwgJnBhZ2UpKSA+IDApIHsKLSAgICAgICAgbVRhYmxlT2ZDb250ZW50cy5wdXNoKCk7Ci0KLSAgICAgICAgVE9DRW50cnkgJmVudHJ5ID0KLSAgICAgICAgICAgIG1UYWJsZU9mQ29udGVudHMuZWRpdEl0ZW1BdChtVGFibGVPZkNvbnRlbnRzLnNpemUoKSAtIDEpOwotCi0gICAgICAgIGVudHJ5Lm1QYWdlT2Zmc2V0ID0gb2Zmc2V0OwotICAgICAgICBlbnRyeS5tVGltZVVzID0gZ2V0VGltZVVzT2ZHcmFudWxlKHBhZ2UubUdyYW51bGVQb3NpdGlvbik7Ci0KLSAgICAgICAgb2Zmc2V0ICs9IChzaXplX3QpcGFnZVNpemU7Ci0gICAgfQotCi0gICAgLy8gTGltaXQgdGhlIG1heGltdW0gYW1vdW50IG9mIFJBTSB3ZSBzcGVuZCBvbiB0aGUgdGFibGUgb2YgY29udGVudHMsCi0gICAgLy8gaWYgbmVjZXNzYXJ5IHRoaW4gb3V0IHRoZSB0YWJsZSBldmVubHkgdG8gdHJpbSBpdCBkb3duIHRvIG1heGltdW0KLSAgICAvLyBzaXplLgotCi0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4VE9DU2l6ZSA9IDgxOTI7Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4TnVtVE9DRW50cmllcyA9IGtNYXhUT0NTaXplIC8gc2l6ZW9mKFRPQ0VudHJ5KTsKLQotICAgIHNpemVfdCBudW1lcmF0b3IgPSBtVGFibGVPZkNvbnRlbnRzLnNpemUoKTsKLQotICAgIGlmIChudW1lcmF0b3IgPiBrTWF4TnVtVE9DRW50cmllcykgewotICAgICAgICBzaXplX3QgZGVub20gPSBudW1lcmF0b3IgLSBrTWF4TnVtVE9DRW50cmllczsKLQotICAgICAgICBzaXplX3QgYWNjdW0gPSAwOwotICAgICAgICBmb3IgKHNzaXplX3QgaSA9IG1UYWJsZU9mQ29udGVudHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyAtLWkpIHsKLSAgICAgICAgICAgIGFjY3VtICs9IGRlbm9tOwotICAgICAgICAgICAgaWYgKGFjY3VtID49IG51bWVyYXRvcikgewotICAgICAgICAgICAgICAgIG1UYWJsZU9mQ29udGVudHMucmVtb3ZlQXQoaSk7Ci0gICAgICAgICAgICAgICAgYWNjdW0gLT0gbnVtZXJhdG9yOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi1pbnQzMl90IE15T2dnRXh0cmFjdG9yOjpnZXRQYWNrZXRCbG9ja1NpemUoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgewotICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPQotICAgICAgICAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKLQotICAgIHNpemVfdCBzaXplID0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKLQotICAgIG9nZ19idWZmZXIgYnVmOwotICAgIGJ1Zi5kYXRhID0gKHVpbnQ4X3QgKilkYXRhOwotICAgIGJ1Zi5zaXplID0gc2l6ZTsKLSAgICBidWYucmVmY291bnQgPSAxOwotICAgIGJ1Zi5wdHIub3duZXIgPSBOVUxMOwotCi0gICAgb2dnX3JlZmVyZW5jZSByZWY7Ci0gICAgcmVmLmJ1ZmZlciA9ICZidWY7Ci0gICAgcmVmLmJlZ2luID0gMDsKLSAgICByZWYubGVuZ3RoID0gc2l6ZTsKLSAgICByZWYubmV4dCA9IE5VTEw7Ci0KLSAgICBvZ2dfcGFja2V0IHBhY2s7Ci0gICAgcGFjay5wYWNrZXQgPSAmcmVmOwotICAgIHBhY2suYnl0ZXMgPSByZWYubGVuZ3RoOwotICAgIHBhY2suYl9vX3MgPSAwOwotICAgIHBhY2suZV9vX3MgPSAwOwotICAgIHBhY2suZ3JhbnVsZXBvcyA9IDA7Ci0gICAgcGFjay5wYWNrZXRubyA9IDA7Ci0KLSAgICByZXR1cm4gdm9yYmlzX3BhY2tldF9ibG9ja3NpemUoJm1WaSwgJnBhY2spOwotfQotCi1pbnQ2NF90IE15T3B1c0V4dHJhY3Rvcjo6Z2V0VGltZVVzT2ZHcmFudWxlKHVpbnQ2NF90IGdyYW51bGVQb3MpIGNvbnN0IHsKLSAgICB1aW50NjRfdCBwY21TYW1wbGVQb3NpdGlvbiA9IDA7Ci0gICAgaWYgKGdyYW51bGVQb3MgPiBtQ29kZWNEZWxheSkgewotICAgICAgICBwY21TYW1wbGVQb3NpdGlvbiA9IGdyYW51bGVQb3MgLSBtQ29kZWNEZWxheTsKLSAgICB9Ci0gICAgaWYgKHBjbVNhbXBsZVBvc2l0aW9uID4gSU5UNjRfTUFYIC8gMTAwMDAwMGxsKSB7Ci0gICAgICAgIHJldHVybiBJTlQ2NF9NQVg7Ci0gICAgfQotICAgIHJldHVybiBwY21TYW1wbGVQb3NpdGlvbiAqIDEwMDAwMDBsbCAvIGtPcHVzU2FtcGxlUmF0ZTsKLX0KLQotc3RhdHVzX3QgTXlPcHVzRXh0cmFjdG9yOjp2ZXJpZnlIZWFkZXIoTWVkaWFCdWZmZXIgKmJ1ZmZlciwgdWludDhfdCB0eXBlKSB7Ci0gICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgIC8vIHRoZXJlIGFyZSBhY3R1YWxseSBubyBoZWFkZXIgdHlwZXMgZGVmaW5lZCBpbiB0aGUgT3B1cyBzcGVjOyB3ZSBjaG9vc2UgMSBhbmQgMyB0byBtZWFuCi0gICAgICAgIC8vIGhlYWRlciBhbmQgY29tbWVudHMgc3VjaCB0aGF0IHdlIGNhbiBzaGFyZSBjb2RlIHdpdGggTXlWb3JiaXNFeHRyYWN0b3IuCi0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIHJldHVybiB2ZXJpZnlPcHVzSGVhZGVyKGJ1ZmZlcik7Ci0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIHJldHVybiB2ZXJpZnlPcHVzQ29tbWVudHMoYnVmZmVyKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci19Ci0KLXN0YXR1c190IE15T3B1c0V4dHJhY3Rvcjo6dmVyaWZ5T3B1c0hlYWRlcihNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7Ci0gICAgY29uc3Qgc2l6ZV90IGtPcHVzSGVhZGVyU2l6ZSA9IDE5OwotICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPQotICAgICAgICAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKLQotICAgIHNpemVfdCBzaXplID0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKLQotICAgIGlmIChzaXplIDwga09wdXNIZWFkZXJTaXplCi0gICAgICAgICAgICB8fCBtZW1jbXAoZGF0YSwgIk9wdXNIZWFkIiwgOCkKLSAgICAgICAgICAgIHx8IC8qIHZlcnNpb24gPSAqLyBkYXRhWzhdICE9IDEpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBtQ2hhbm5lbENvdW50ID0gZGF0YVs5XTsKLSAgICBtQ29kZWNEZWxheSA9IFUxNkxFX0FUKCZkYXRhWzEwXSk7Ci0KLSAgICBtTWV0YS0+c2V0RGF0YShrS2V5T3B1c0hlYWRlciwgMCwgZGF0YSwgc2l6ZSk7Ci0gICAgbU1ldGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBrT3B1c1NhbXBsZVJhdGUpOwotICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBtQ2hhbm5lbENvdW50KTsKLSAgICBtTWV0YS0+c2V0SW50NjQoa0tleU9wdXNTZWVrUHJlUm9sbCAvKiBucyAqLywga09wdXNTZWVrUHJlUm9sbFVzICogMTAwMCAvKiA9IDgwIG1zKi8pOwotICAgIG1NZXRhLT5zZXRJbnQ2NChrS2V5T3B1c0NvZGVjRGVsYXkgLyogbnMgKi8sCi0gICAgICAgICAgICBtQ29kZWNEZWxheSAvKiBzYW1wbGUvcyAqLyAqIDEwMDAwMDAwMDBsbCAvIGtPcHVzU2FtcGxlUmF0ZSk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IE15T3B1c0V4dHJhY3Rvcjo6dmVyaWZ5T3B1c0NvbW1lbnRzKE1lZGlhQnVmZmVyICpidWZmZXIpIHsKLSAgICAvLyBhZGQgYXJ0aWZpY2lhbCBmcmFtaW5nIGJpdCBzbyB3ZSBjYW4gcmV1c2UgX3ZvcmJpc191bnBhY2tfY29tbWVudAotICAgIGludDMyX3QgY29tbWVudFNpemUgPSBidWZmZXItPnJhbmdlX2xlbmd0aCgpICsgMTsKLSAgICBzcDxBQnVmZmVyPiBhQnVmID0gbmV3IEFCdWZmZXIoY29tbWVudFNpemUpOwotICAgIGlmIChhQnVmLT5jYXBhY2l0eSgpIDw9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICB1aW50OF90KiBjb21tZW50RGF0YSA9IGFCdWYtPmRhdGEoKTsKLSAgICBtZW1jcHkoY29tbWVudERhdGEsCi0gICAgICAgICAgICAodWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKLSAgICAgICAgICAgIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOwotCi0gICAgb2dnX2J1ZmZlciBidWY7Ci0gICAgYnVmLmRhdGEgPSBjb21tZW50RGF0YTsKLSAgICBidWYuc2l6ZSA9IGNvbW1lbnRTaXplOwotICAgIGJ1Zi5yZWZjb3VudCA9IDE7Ci0gICAgYnVmLnB0ci5vd25lciA9IE5VTEw7Ci0KLSAgICBvZ2dfcmVmZXJlbmNlIHJlZjsKLSAgICByZWYuYnVmZmVyID0gJmJ1ZjsKLSAgICByZWYuYmVnaW4gPSAwOwotICAgIHJlZi5sZW5ndGggPSBjb21tZW50U2l6ZTsKLSAgICByZWYubmV4dCA9IE5VTEw7Ci0KLSAgICBvZ2dwYWNrX2J1ZmZlciBiaXRzOwotICAgIG9nZ3BhY2tfcmVhZGluaXQoJmJpdHMsICZyZWYpOwotCi0gICAgLy8gc2tpcCAnT3B1c1RhZ3MnCi0gICAgY29uc3QgY2hhciAqT3B1c1RhZ3MgPSAiT3B1c1RhZ3MiOwotICAgIGNvbnN0IGludDMyX3QgaGVhZGVyTGVuID0gc3RybGVuKE9wdXNUYWdzKTsKLSAgICBpbnQzMl90IGZyYW1pbmdCaXRPZmZzZXQgPSBoZWFkZXJMZW47Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoZWFkZXJMZW47ICsraSkgewotICAgICAgICBjaGFyIGNociA9IG9nZ3BhY2tfcmVhZCgmYml0cywgOCk7Ci0gICAgICAgIGlmIChjaHIgIT0gT3B1c1RhZ3NbaV0pIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnQzMl90IHZlbmRvckxlbiA9IG9nZ3BhY2tfcmVhZCgmYml0cywgMzIpOwotICAgIGZyYW1pbmdCaXRPZmZzZXQgKz0gNDsKLSAgICBpZiAodmVuZG9yTGVuIDwgMCB8fCB2ZW5kb3JMZW4gPiBjb21tZW50U2l6ZSAtIDgpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0gICAgLy8gc2tpcCB2ZW5kb3Igc3RyaW5nCi0gICAgZnJhbWluZ0JpdE9mZnNldCArPSB2ZW5kb3JMZW47Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2ZW5kb3JMZW47ICsraSkgewotICAgICAgICBvZ2dwYWNrX3JlYWQoJmJpdHMsIDgpOwotICAgIH0KLQotICAgIGludDMyX3QgbiA9IG9nZ3BhY2tfcmVhZCgmYml0cywgMzIpOwotICAgIGZyYW1pbmdCaXRPZmZzZXQgKz0gNDsKLSAgICBpZiAobiA8IDAgfHwgbiA+ICgoY29tbWVudFNpemUgLSBvZ2dwYWNrX2J5dGVzKCZiaXRzKSkgPj4gMikpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKLSAgICAgICAgaW50MzJfdCBsZW4gPSBvZ2dwYWNrX3JlYWQoJmJpdHMsIDMyKTsKLSAgICAgICAgZnJhbWluZ0JpdE9mZnNldCArPSA0OwotICAgICAgICBpZiAobGVuICA8IDAgfHwgbGVuICA+IChjb21tZW50U2l6ZSAtIG9nZ3BhY2tfYnl0ZXMoJmJpdHMpKSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotICAgICAgICBmcmFtaW5nQml0T2Zmc2V0ICs9IGxlbjsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBsZW47ICsraikgewotICAgICAgICAgICAgb2dncGFja19yZWFkKCZiaXRzLCA4KTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoZnJhbWluZ0JpdE9mZnNldCA8IDAgfHwgZnJhbWluZ0JpdE9mZnNldCA+PSBjb21tZW50U2l6ZSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLSAgICBjb21tZW50RGF0YVtmcmFtaW5nQml0T2Zmc2V0XSA9IDE7Ci0KLSAgICBidWYuZGF0YSA9IGNvbW1lbnREYXRhICsgaGVhZGVyTGVuOwotICAgIGJ1Zi5zaXplID0gY29tbWVudFNpemUgLSBoZWFkZXJMZW47Ci0gICAgYnVmLnJlZmNvdW50ID0gMTsKLSAgICBidWYucHRyLm93bmVyID0gTlVMTDsKLQotICAgIHJlZi5idWZmZXIgPSAmYnVmOwotICAgIHJlZi5iZWdpbiA9IDA7Ci0gICAgcmVmLmxlbmd0aCA9IGNvbW1lbnRTaXplIC0gaGVhZGVyTGVuOwotICAgIHJlZi5uZXh0ID0gTlVMTDsKLQotICAgIG9nZ3BhY2tfcmVhZGluaXQoJmJpdHMsICZyZWYpOwotICAgIGludCBlcnIgPSBfdm9yYmlzX3VucGFja19jb21tZW50KCZtVmMsICZiaXRzKTsKLSAgICBpZiAoMCAhPSBlcnIpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBwYXJzZUZpbGVNZXRhRGF0YSgpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTXlWb3JiaXNFeHRyYWN0b3I6OnZlcmlmeUhlYWRlcigKLSAgICAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlciwgdWludDhfdCB0eXBlKSB7Ci0gICAgY29uc3QgdWludDhfdCAqZGF0YSA9Ci0gICAgICAgIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpOwotCi0gICAgc2l6ZV90IHNpemUgPSBidWZmZXItPnJhbmdlX2xlbmd0aCgpOwotCi0gICAgaWYgKHNpemUgPCA3IHx8IGRhdGFbMF0gIT0gdHlwZSB8fCBtZW1jbXAoJmRhdGFbMV0sICJ2b3JiaXMiLCA2KSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIG9nZ19idWZmZXIgYnVmOwotICAgIGJ1Zi5kYXRhID0gKHVpbnQ4X3QgKilkYXRhOwotICAgIGJ1Zi5zaXplID0gc2l6ZTsKLSAgICBidWYucmVmY291bnQgPSAxOwotICAgIGJ1Zi5wdHIub3duZXIgPSBOVUxMOwotCi0gICAgb2dnX3JlZmVyZW5jZSByZWY7Ci0gICAgcmVmLmJ1ZmZlciA9ICZidWY7Ci0gICAgcmVmLmJlZ2luID0gMDsKLSAgICByZWYubGVuZ3RoID0gc2l6ZTsKLSAgICByZWYubmV4dCA9IE5VTEw7Ci0KLSAgICBvZ2dwYWNrX2J1ZmZlciBiaXRzOwotICAgIG9nZ3BhY2tfcmVhZGluaXQoJmJpdHMsICZyZWYpOwotCi0gICAgaWYgKG9nZ3BhY2tfcmVhZCgmYml0cywgOCkgIT0gdHlwZSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDY7ICsraSkgewotICAgICAgICBvZ2dwYWNrX3JlYWQoJmJpdHMsIDgpOyAgLy8gc2tpcCAndm9yYmlzJwotICAgIH0KLQotICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICBjYXNlIDE6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgwICE9IF92b3JiaXNfdW5wYWNrX2luZm8oJm1WaSwgJmJpdHMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbU1ldGEtPnNldERhdGEoa0tleVZvcmJpc0luZm8sIDAsIGRhdGEsIHNpemUpOwotICAgICAgICAgICAgbU1ldGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBtVmkucmF0ZSk7Ci0gICAgICAgICAgICBtTWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbVZpLmNoYW5uZWxzKTsKLQotICAgICAgICAgICAgQUxPR1YoImxvd2VyLWJpdHJhdGUgPSAlbGQiLCBtVmkuYml0cmF0ZV9sb3dlcik7Ci0gICAgICAgICAgICBBTE9HVigidXBwZXItYml0cmF0ZSA9ICVsZCIsIG1WaS5iaXRyYXRlX3VwcGVyKTsKLSAgICAgICAgICAgIEFMT0dWKCJub21pbmFsLWJpdHJhdGUgPSAlbGQiLCBtVmkuYml0cmF0ZV9ub21pbmFsKTsKLSAgICAgICAgICAgIEFMT0dWKCJ3aW5kb3ctYml0cmF0ZSA9ICVsZCIsIG1WaS5iaXRyYXRlX3dpbmRvdyk7Ci0gICAgICAgICAgICBBTE9HVigiYmxvY2tzaXplczogJWQvJWQiLAotICAgICAgICAgICAgICAgICAgICB2b3JiaXNfaW5mb19ibG9ja3NpemUoJm1WaSwgMCksCi0gICAgICAgICAgICAgICAgICAgIHZvcmJpc19pbmZvX2Jsb2Nrc2l6ZSgmbVZpLCAxKQotICAgICAgICAgICAgICAgICAgICApOwotCi0gICAgICAgICAgICBvZmY2NF90IHNpemU7Ci0gICAgICAgICAgICBpZiAobVNvdXJjZS0+Z2V0U2l6ZSgmc2l6ZSkgPT0gT0spIHsKLSAgICAgICAgICAgICAgICB1aW50NjRfdCBicHMgPSBhcHByb3hCaXRyYXRlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGJwcyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1NZXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIHNpemUgKiA4MDAwMDAwbGwgLyBicHMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSAzOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoMCAhPSBfdm9yYmlzX3VucGFja19jb21tZW50KCZtVmMsICZiaXRzKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBhcnNlRmlsZU1ldGFEYXRhKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgNToKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKDAgIT0gX3ZvcmJpc191bnBhY2tfYm9va3MoJm1WaSwgJmJpdHMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbU1ldGEtPnNldERhdGEoa0tleVZvcmJpc0Jvb2tzLCAwLCBkYXRhLCBzaXplKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi11aW50NjRfdCBNeVZvcmJpc0V4dHJhY3Rvcjo6YXBwcm94Qml0cmF0ZSgpIGNvbnN0IHsKLSAgICBpZiAobVZpLmJpdHJhdGVfbm9taW5hbCAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBtVmkuYml0cmF0ZV9ub21pbmFsOwotICAgIH0KLQotICAgIHJldHVybiAobVZpLmJpdHJhdGVfbG93ZXIgKyBtVmkuYml0cmF0ZV91cHBlcikgLyAyOwotfQotCi12b2lkIE15T2dnRXh0cmFjdG9yOjpwYXJzZUZpbGVNZXRhRGF0YSgpIHsKLSAgICBtRmlsZU1ldGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgbUZpbGVNZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX09HRyk7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1WYy5jb21tZW50czsgKytpKSB7Ci0gICAgICAgIGNvbnN0IGNoYXIgKmNvbW1lbnQgPSBtVmMudXNlcl9jb21tZW50c1tpXTsKLSAgICAgICAgc2l6ZV90IGNvbW1lbnRMZW5ndGggPSBtVmMuY29tbWVudF9sZW5ndGhzW2ldOwotICAgICAgICBwYXJzZVZvcmJpc0NvbW1lbnQobUZpbGVNZXRhLCBjb21tZW50LCBjb21tZW50TGVuZ3RoKTsKLSAgICAgICAgLy9BTE9HSSgiY29tbWVudCAjJWQ6ICclcyciLCBpICsgMSwgbVZjLnVzZXJfY29tbWVudHNbaV0pOwotICAgIH0KLX0KLQotdm9pZCBwYXJzZVZvcmJpc0NvbW1lbnQoCi0gICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmZmlsZU1ldGEsIGNvbnN0IGNoYXIgKmNvbW1lbnQsIHNpemVfdCBjb21tZW50TGVuZ3RoKQotewotICAgIHN0cnVjdCB7Ci0gICAgICAgIGNvbnN0IGNoYXIgKmNvbnN0IG1UYWc7Ci0gICAgICAgIHVpbnQzMl90IG1LZXk7Ci0gICAgfSBrTWFwW10gPSB7Ci0gICAgICAgIHsgIlRJVExFIiwga0tleVRpdGxlIH0sCi0gICAgICAgIHsgIkFSVElTVCIsIGtLZXlBcnRpc3QgfSwKLSAgICAgICAgeyAiQUxCVU1BUlRJU1QiLCBrS2V5QWxidW1BcnRpc3QgfSwKLSAgICAgICAgeyAiQUxCVU0gQVJUSVNUIiwga0tleUFsYnVtQXJ0aXN0IH0sCi0gICAgICAgIHsgIkNPTVBJTEFUSU9OIiwga0tleUNvbXBpbGF0aW9uIH0sCi0gICAgICAgIHsgIkFMQlVNIiwga0tleUFsYnVtIH0sCi0gICAgICAgIHsgIkNPTVBPU0VSIiwga0tleUNvbXBvc2VyIH0sCi0gICAgICAgIHsgIkdFTlJFIiwga0tleUdlbnJlIH0sCi0gICAgICAgIHsgIkFVVEhPUiIsIGtLZXlBdXRob3IgfSwKLSAgICAgICAgeyAiVFJBQ0tOVU1CRVIiLCBrS2V5Q0RUcmFja051bWJlciB9LAotICAgICAgICB7ICJESVNDTlVNQkVSIiwga0tleURpc2NOdW1iZXIgfSwKLSAgICAgICAgeyAiREFURSIsIGtLZXlEYXRlIH0sCi0gICAgICAgIHsgIllFQVIiLCBrS2V5WWVhciB9LAotICAgICAgICB7ICJMWVJJQ0lTVCIsIGtLZXlXcml0ZXIgfSwKLSAgICAgICAgeyAiTUVUQURBVEFfQkxPQ0tfUElDVFVSRSIsIGtLZXlBbGJ1bUFydCB9LAotICAgICAgICB7ICJBTkRST0lEX0xPT1AiLCBrS2V5QXV0b0xvb3AgfSwKLSAgICB9OwotCi0gICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgc2l6ZW9mKGtNYXApIC8gc2l6ZW9mKGtNYXBbMF0pOyArK2opIHsKLSAgICAgICAgICAgIHNpemVfdCB0YWdMZW4gPSBzdHJsZW4oa01hcFtqXS5tVGFnKTsKLSAgICAgICAgICAgIGlmICghc3RybmNhc2VjbXAoa01hcFtqXS5tVGFnLCBjb21tZW50LCB0YWdMZW4pCi0gICAgICAgICAgICAgICAgICAgICYmIGNvbW1lbnRbdGFnTGVuXSA9PSAnPScpIHsKLSAgICAgICAgICAgICAgICBpZiAoa01hcFtqXS5tS2V5ID09IGtLZXlBbGJ1bUFydCkgewotICAgICAgICAgICAgICAgICAgICBleHRyYWN0QWxidW1BcnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU1ldGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbW1lbnRbdGFnTGVuICsgMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudExlbmd0aCAtIHRhZ0xlbiAtIDEpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa01hcFtqXS5tS2V5ID09IGtLZXlBdXRvTG9vcCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmNhc2VjbXAoJmNvbW1lbnRbdGFnTGVuICsgMV0sICJ0cnVlIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVNZXRhLT5zZXRJbnQzMihrS2V5QXV0b0xvb3AsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZmlsZU1ldGEtPnNldENTdHJpbmcoa01hcFtqXS5tS2V5LCAmY29tbWVudFt0YWdMZW4gKyAxXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLX0KLQotc3RhdGljIHZvaWQgZXh0cmFjdEFsYnVtQXJ0KAotICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJmZpbGVNZXRhLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIEFMT0dWKCJleHRyYWN0QWxidW1BcnQgZnJvbSAnJXMnIiwgKGNvbnN0IGNoYXIgKilkYXRhKTsKLQotICAgIHNwPEFCdWZmZXI+IGZsYWNCdWZmZXIgPSBkZWNvZGVCYXNlNjQoQVN0cmluZygoY29uc3QgY2hhciAqKWRhdGEsIHNpemUpKTsKLSAgICBpZiAoZmxhY0J1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJtYWxmb3JtZWQgYmFzZTY0IGVuY29kZWQgZGF0YS4iKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHNpemVfdCBmbGFjU2l6ZSA9IGZsYWNCdWZmZXItPnNpemUoKTsKLSAgICB1aW50OF90ICpmbGFjID0gZmxhY0J1ZmZlci0+ZGF0YSgpOwotICAgIEFMT0dWKCJnb3QgZmxhYyBvZiBzaXplICV6dSIsIGZsYWNTaXplKTsKLQotICAgIHVpbnQzMl90IHBpY1R5cGU7Ci0gICAgdWludDMyX3QgdHlwZUxlbjsKLSAgICB1aW50MzJfdCBkZXNjTGVuOwotICAgIHVpbnQzMl90IGRhdGFMZW47Ci0gICAgY2hhciB0eXBlWzEyOF07Ci0KLSAgICBpZiAoZmxhY1NpemUgPCA4KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBwaWNUeXBlID0gVTMyX0FUKGZsYWMpOwotCi0gICAgaWYgKHBpY1R5cGUgIT0gMykgewotICAgICAgICAvLyBUaGlzIGlzIG5vdCBhIGZyb250IGNvdmVyLgotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgdHlwZUxlbiA9IFUzMl9BVCgmZmxhY1s0XSk7Ci0gICAgaWYgKHR5cGVMZW4gPiBzaXplb2YodHlwZSkgLSAxKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyB3ZSd2ZSBhbHJlYWR5IGNoZWNrZWQgYWJvdmUgdGhhdCBmbGFjU2l6ZSA+PSA4Ci0gICAgaWYgKGZsYWNTaXplIC0gOCA8IHR5cGVMZW4pIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1lbWNweSh0eXBlLCAmZmxhY1s4XSwgdHlwZUxlbik7Ci0gICAgdHlwZVt0eXBlTGVuXSA9ICdcMCc7Ci0KLSAgICBBTE9HVigicGljVHlwZSA9ICVkLCB0eXBlID0gJyVzJyIsIHBpY1R5cGUsIHR5cGUpOwotCi0gICAgaWYgKCFzdHJjbXAodHlwZSwgIi0tPiIpKSB7Ci0gICAgICAgIC8vIFRoaXMgaXMgbm90IGlubGluZSBjb3ZlciBhcnQsIGJ1dCBhbiBleHRlcm5hbCB1cmwgaW5zdGVhZC4KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChmbGFjU2l6ZSA8IDMyIHx8IGZsYWNTaXplIC0gMzIgPCB0eXBlTGVuKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBkZXNjTGVuID0gVTMyX0FUKCZmbGFjWzggKyB0eXBlTGVuXSk7Ci0gICAgaWYgKGZsYWNTaXplIC0gMzIgLSB0eXBlTGVuIDwgZGVzY0xlbikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZGF0YUxlbiA9IFUzMl9BVCgmZmxhY1s4ICsgdHlwZUxlbiArIDQgKyBkZXNjTGVuICsgMTZdKTsKLQotICAgIC8vIHdlJ3ZlIGFscmVhZHkgY2hlY2tlZCBhYm92ZSB0aGF0IChmbGFjU2l6ZSAtIDMyIC0gdHlwZUxlbiAtIGRlc2NMZW4pID49IDAKLSAgICBpZiAoZmxhY1NpemUgLSAzMiAtIHR5cGVMZW4gLSBkZXNjTGVuIDwgZGF0YUxlbikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQUxPR1YoImdvdCBpbWFnZSBkYXRhLCAlenUgdHJhaWxpbmcgYnl0ZXMiLAotICAgICAgICAgZmxhY1NpemUgLSAzMiAtIHR5cGVMZW4gLSBkZXNjTGVuIC0gZGF0YUxlbik7Ci0KLSAgICBmaWxlTWV0YS0+c2V0RGF0YSgKLSAgICAgICAgICAgIGtLZXlBbGJ1bUFydCwgMCwgJmZsYWNbOCArIHR5cGVMZW4gKyA0ICsgZGVzY0xlbiArIDIwXSwgZGF0YUxlbik7Ci0KLSAgICBmaWxlTWV0YS0+c2V0Q1N0cmluZyhrS2V5QWxidW1BcnRNSU1FLCB0eXBlKTsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotT2dnRXh0cmFjdG9yOjpPZ2dFeHRyYWN0b3IoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSkKLSAgICA6IG1EYXRhU291cmNlKHNvdXJjZSksCi0gICAgICBtSW5pdENoZWNrKE5PX0lOSVQpLAotICAgICAgbUltcGwoTlVMTCkgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7Ci0gICAgICAgIGlmIChtSW1wbCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBkZWxldGUgbUltcGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGkgPT0gMCkgewotICAgICAgICAgICAgbUltcGwgPSBuZXcgTXlWb3JiaXNFeHRyYWN0b3IobURhdGFTb3VyY2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUltcGwgPSBuZXcgTXlPcHVzRXh0cmFjdG9yKG1EYXRhU291cmNlKTsKLSAgICAgICAgfQotICAgICAgICBtSW5pdENoZWNrID0gbUltcGwtPnNlZWtUb09mZnNldCgwKTsKLQotICAgICAgICBpZiAobUluaXRDaGVjayA9PSBPSykgewotICAgICAgICAgICAgbUluaXRDaGVjayA9IG1JbXBsLT5pbml0KCk7Ci0gICAgICAgICAgICBpZiAobUluaXRDaGVjayA9PSBPSykgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi1PZ2dFeHRyYWN0b3I6On5PZ2dFeHRyYWN0b3IoKSB7Ci0gICAgZGVsZXRlIG1JbXBsOwotICAgIG1JbXBsID0gTlVMTDsKLX0KLQotc2l6ZV90IE9nZ0V4dHJhY3Rvcjo6Y291bnRUcmFja3MoKSB7Ci0gICAgcmV0dXJuIG1Jbml0Q2hlY2sgIT0gT0sgPyAwIDogMTsKLX0KLQotc3A8SU1lZGlhU291cmNlPiBPZ2dFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgewotICAgIGlmIChpbmRleCA+PSAxKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBuZXcgT2dnU291cmNlKHRoaXMpOwotfQotCi1zcDxNZXRhRGF0YT4gT2dnRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAotICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7Ci0gICAgaWYgKGluZGV4ID49IDEpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1JbXBsLT5nZXRGb3JtYXQoKTsKLX0KLQotc3A8TWV0YURhdGE+IE9nZ0V4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoKSB7Ci0gICAgcmV0dXJuIG1JbXBsLT5nZXRGaWxlTWV0YURhdGEoKTsKLX0KLQotYm9vbCBTbmlmZk9nZygKLSAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlLAotICAgICAgICBzcDxBTWVzc2FnZT4gKikgewotICAgIGNoYXIgdG1wWzRdOwotICAgIGlmIChzb3VyY2UtPnJlYWRBdCgwLCB0bXAsIDQpIDwgNCB8fCBtZW1jbXAodG1wLCAiT2dnUyIsIDQpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBtaW1lVHlwZS0+c2V0VG8oTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX09HRyk7Ci0gICAgKmNvbmZpZGVuY2UgPSAwLjJmOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9PbXhJbmZvQnVpbGRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PbXhJbmZvQnVpbGRlci5jcHAKaW5kZXggODcxN2E3OS4uOTZiODk2YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT214SW5mb0J1aWxkZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09teEluZm9CdWlsZGVyLmNwcApAQCAtMjQsOCArMjQsNyBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAKLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSU1lZGlhQ29kZWNTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PbXhJbmZvQnVpbGRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oPgogCkBAIC0zNCwxMCArMzMsOSBAQAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214Tm9kZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5oPgogCi0jaW5jbHVkZSA8bWVkaWEvSU9NWFN0b3JlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL29teC8xLjAvV09teC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuaD4KIAogI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0luZGV4Lmg+CiAjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfSW5kZXhFeHQuaD4KQEAgLTQ4LDEwICs0NiwxOCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDsKKwogbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8gewogCitib29sIGhhc1ByZWZpeChjb25zdCBoaWRsX3N0cmluZyYgcywgY29uc3QgY2hhciogcHJlZml4KSB7CisgICAgcmV0dXJuIHN0cm5jbXAocy5jX3N0cigpLCBwcmVmaXgsIHN0cmxlbihwcmVmaXgpKSA9PSAwOworfQorCiBzdGF0dXNfdCBxdWVyeUNhcGFiaWxpdGllcygKLSAgICAgICAgY29uc3QgSU9NWFN0b3JlOjpOb2RlSW5mbyYgbm9kZSwgY29uc3QgY2hhciogbWltZSwgYm9vbCBpc0VuY29kZXIsCisgICAgICAgIGNvbnN0IElPbXhTdG9yZTo6Tm9kZUluZm8mIG5vZGUsIGNvbnN0IGNoYXIqIG1pbWUsIGJvb2wgaXNFbmNvZGVyLAogICAgICAgICBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyKiBjYXBzKSB7CiAgICAgc3A8QUNvZGVjPiBjb2RlYyA9IG5ldyBBQ29kZWMoKTsKICAgICBzdGF0dXNfdCBlcnIgPSBjb2RlYy0+cXVlcnlDYXBhYmlsaXRpZXMoCkBAIC02MiwxNCArNjgsMTMgQEAKICAgICBmb3IgKGNvbnN0IGF1dG8mIGF0dHJpYnV0ZSA6IG5vZGUuYXR0cmlidXRlcykgewogICAgICAgICAvLyBBbGwgZmVhdHVyZXMgaGF2ZSBhbiBpbnQzMiB2YWx1ZSBleGNlcHQKICAgICAgICAgLy8gImZlYXR1cmUtYml0cmF0ZS1tb2RlcyIsIHdoaWNoIGhhcyBhIHN0cmluZyB2YWx1ZS4KLSAgICAgICAgaWYgKChhdHRyaWJ1dGUua2V5LmNvbXBhcmUoMCwgOCwgImZlYXR1cmUtIikgPT0gMCkgJiYKLSAgICAgICAgICAgICAgICAoYXR0cmlidXRlLmtleS5jb21wYXJlKDgsIDE1LCAiYml0cmF0ZS1tb2RlcyIpCi0gICAgICAgICAgICAgICAgICE9IDApKSB7Ci0gICAgICAgICAgICAvLyBJZiB0aGlzIGF0dHJpYnV0ZS5rZXkgaXMgYSBmZWF0dXJlIHRoYXQgaXMgbm90IGEgYml0cmF0ZQotICAgICAgICAgICAgLy8gY29udHJvbCwgYWRkIGFuIGludDMyIHZhbHVlLgorICAgICAgICBpZiAoaGFzUHJlZml4KGF0dHJpYnV0ZS5rZXksICJmZWF0dXJlLSIpICYmCisgICAgICAgICAgICAgICAgIWhhc1ByZWZpeChhdHRyaWJ1dGUua2V5LCAiZmVhdHVyZS1iaXRyYXRlLW1vZGVzIikpIHsKKyAgICAgICAgICAgIC8vIElmIHRoaXMgYXR0cmlidXRlLmtleSBpcyBhIGZlYXR1cmUgdGhhdCBpcyBub3QgYml0cmF0ZSBtb2RlcywKKyAgICAgICAgICAgIC8vIGFkZCBhbiBpbnQzMiB2YWx1ZS4KICAgICAgICAgICAgIGNhcHMtPmFkZERldGFpbCgKICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlLmtleS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUudmFsdWUgPT0gIjEiID8gMSA6IDApOworICAgICAgICAgICAgICAgICAgICBoYXNQcmVmaXgoYXR0cmlidXRlLnZhbHVlLCAiMSIpID8gMSA6IDApOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gTm9uLWZlYXR1cmUgYXR0cmlidXRlcwogICAgICAgICAgICAgY2Fwcy0+YWRkRGV0YWlsKApAQCAtODUsMTU1ICs5MCw2OSBAQAogfQogCiBzdGF0dXNfdCBPbXhJbmZvQnVpbGRlcjo6YnVpbGRNZWRpYUNvZGVjTGlzdChNZWRpYUNvZGVjTGlzdFdyaXRlciogd3JpdGVyKSB7Ci0gICAgYm9vbCB0cmVibGU7Ci0gICAgc3A8SU9NWD4gb214OwotICAgIHN0ZDo6dmVjdG9yPElPTVhTdG9yZTo6Um9sZUluZm8+IHJvbGVzOworICAgIC8vIE9idGFpbiBJT214U3RvcmUKKyAgICBzcDxJT214U3RvcmU+IG9teFN0b3JlID0gSU9teFN0b3JlOjpnZXRTZXJ2aWNlKCk7CisgICAgaWYgKG9teFN0b3JlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkNhbm5vdCBmaW5kIGFuIElPbXhTdG9yZSBzZXJ2aWNlLiIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CiAKLSAgICB0cmVibGUgPSBwcm9wZXJ0eV9nZXRfYm9vbCgicGVyc2lzdC5tZWRpYS50cmVibGVfb214IiwgdHJ1ZSk7Ci0gICAgaWYgKHRyZWJsZSkgewotICAgICAgICB1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDsKLSAgICAgICAgdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci0gICAgICAgIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOworICAgIC8vIExpc3Qgc2VydmljZSBhdHRyaWJ1dGVzIChnbG9iYWwgc2V0dGluZ3MpCisgICAgU3RhdHVzIHN0YXR1czsKKyAgICBoaWRsX3ZlYzxJT214U3RvcmU6OlJvbGVJbmZvPiByb2xlczsKKyAgICBhdXRvIHRyYW5zU3RhdHVzID0gb214U3RvcmUtPmxpc3RSb2xlcygKKyAgICAgICAgICAgIFsmcm9sZXNdICgKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPElPbXhTdG9yZTo6Um9sZUluZm8+JiBpblJvbGVMaXN0KSB7CisgICAgICAgICAgICAgICAgcm9sZXMgPSBpblJvbGVMaXN0OworICAgICAgICAgICAgfSk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWwgdG8gb2J0YWluIGNvZGVjIHJvbGVzIGZyb20gSU9teFN0b3JlLiIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CiAKLSAgICAgICAgLy8gT2J0YWluIElPbXhTdG9yZQotICAgICAgICBzcDxJT214U3RvcmU+IG9teFN0b3JlID0gSU9teFN0b3JlOjpnZXRTZXJ2aWNlKCk7Ci0gICAgICAgIGlmIChvbXhTdG9yZSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQ2Fubm90IGNvbm5lY3QgdG8gYW4gSU9teFN0b3JlIGluc3RhbmNlLiIpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBMaXN0IHNlcnZpY2UgYXR0cmlidXRlcyAoZ2xvYmFsIHNldHRpbmdzKQotICAgICAgICBTdGF0dXMgc3RhdHVzOwotICAgICAgICBoaWRsX3ZlYzxJT214U3RvcmU6OlNlcnZpY2VBdHRyaWJ1dGU+IHNlcnZpY2VBdHRyaWJ1dGVzOwotICAgICAgICBhdXRvIHRyYW5zU3RhdHVzID0gb214U3RvcmUtPmxpc3RTZXJ2aWNlQXR0cmlidXRlcygKLSAgICAgICAgICAgICAgICBbJnN0YXR1cywgJnNlcnZpY2VBdHRyaWJ1dGVzXQotICAgICAgICAgICAgICAgIChTdGF0dXMgaW5TdGF0dXMsIGNvbnN0IGhpZGxfdmVjPElPbXhTdG9yZTo6U2VydmljZUF0dHJpYnV0ZT4mCi0gICAgICAgICAgICAgICAgICAgICAgICBpbkF0dHJpYnV0ZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gaW5TdGF0dXM7Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VBdHRyaWJ1dGVzID0gaW5BdHRyaWJ1dGVzOwotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgewotICAgICAgICAgICAgQUxPR0UoIkZhaWwgdG8gb2J0YWluIGdsb2JhbCBzZXR0aW5ncyBmcm9tIElPbXhTdG9yZS4iKTsKLSAgICAgICAgICAgIHJldHVybiBOT19JTklUOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgQUxPR0UoIklPbXhTdG9yZSByZXBvcnRzIHBhcnNpbmcgZXJyb3IuIik7Ci0gICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHAgOiBzZXJ2aWNlQXR0cmlidXRlcykgewotICAgICAgICAgICAgd3JpdGVyLT5hZGRHbG9iYWxTZXR0aW5nKAotICAgICAgICAgICAgICAgICAgICBwLmtleS5jX3N0cigpLCBwLnZhbHVlLmNfc3RyKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTGlzdCByb2xlcyBhbmQgY29udmVydCB0byBJT01YU3RvcmUncyBmb3JtYXQKLSAgICAgICAgdHJhbnNTdGF0dXMgPSBvbXhTdG9yZS0+bGlzdFJvbGVzKAotICAgICAgICAgICAgICAgIFsmcm9sZXNdCi0gICAgICAgICAgICAgICAgKGNvbnN0IGhpZGxfdmVjPElPbXhTdG9yZTo6Um9sZUluZm8+JiBpblJvbGVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJvbGVzLnJlc2VydmUoaW5Sb2xlTGlzdC5zaXplKCkpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGluUm9sZSA6IGluUm9sZUxpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIElPTVhTdG9yZTo6Um9sZUluZm8gcm9sZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvbGUucm9sZSA9IGluUm9sZS5yb2xlOwotICAgICAgICAgICAgICAgICAgICAgICAgcm9sZS50eXBlID0gaW5Sb2xlLnR5cGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICByb2xlLmlzRW5jb2RlciA9IGluUm9sZS5pc0VuY29kZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICByb2xlLnByZWZlclBsYXRmb3JtTm9kZXMgPSBpblJvbGUucHJlZmVyUGxhdGZvcm1Ob2RlczsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPElPTVhTdG9yZTo6Tm9kZUluZm8+JiBub2RlcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGUubm9kZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBub2Rlcy5yZXNlcnZlKGluUm9sZS5ub2Rlcy5zaXplKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBpbk5vZGUgOiBpblJvbGUubm9kZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJT01YU3RvcmU6Ok5vZGVJbmZvIG5vZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5uYW1lID0gaW5Ob2RlLm5hbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5vd25lciA9IGluTm9kZS5vd25lcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxJT01YU3RvcmU6OkF0dHJpYnV0ZT4mIGF0dHJpYnV0ZXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5hdHRyaWJ1dGVzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMucmVzZXJ2ZShpbk5vZGUuYXR0cmlidXRlcy5zaXplKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgaW5BdHRyIDogaW5Ob2RlLmF0dHJpYnV0ZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU9NWFN0b3JlOjpBdHRyaWJ1dGUgYXR0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5rZXkgPSBpbkF0dHIua2V5OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLnZhbHVlID0gaW5BdHRyLnZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLnB1c2hfYmFjayhzdGQ6Om1vdmUoYXR0cikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2Rlcy5wdXNoX2JhY2soc3RkOjptb3ZlKG5vZGUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJvbGVzLnB1c2hfYmFjayhzdGQ6Om1vdmUocm9sZSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRmFpbCB0byBvYnRhaW4gY29kZWMgcm9sZXMgZnJvbSBJT214U3RvcmUuIik7Ci0gICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIE9idGFpbiBJT01YU3RvcmUKLSAgICAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwotICAgICAgICBpZiAoc20gPT0gbnVsbHB0cikgewotICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBvYnRhaW4gdGhlIGRlZmF1bHQgc2VydmljZSBtYW5hZ2VyLiIpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgIH0KLSAgICAgICAgc3A8SUJpbmRlcj4gY29kZWNCaW5kZXIgPSBzbS0+Z2V0U2VydmljZShTdHJpbmcxNigibWVkaWEuY29kZWMiKSk7Ci0gICAgICAgIGlmIChjb2RlY0JpbmRlciA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQ2Fubm90IG9idGFpbiB0aGUgbWVkaWEgY29kZWMgc2VydmljZS4iKTsKLSAgICAgICAgICAgIHJldHVybiBOT19JTklUOwotICAgICAgICB9Ci0gICAgICAgIHNwPElNZWRpYUNvZGVjU2VydmljZT4gY29kZWNTZXJ2aWNlID0KLSAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJTWVkaWFDb2RlY1NlcnZpY2U+KGNvZGVjQmluZGVyKTsKLSAgICAgICAgaWYgKGNvZGVjU2VydmljZSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBBTE9HRSgiV3JvbmcgdHlwZSBvZiBtZWRpYSBjb2RlYyBzZXJ2aWNlIG9idGFpbmVkLiIpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgIH0KLSAgICAgICAgb214ID0gY29kZWNTZXJ2aWNlLT5nZXRPTVgoKTsKLSAgICAgICAgaWYgKG9teCA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQ2Fubm90IGNvbm5lY3QgdG8gYW4gSU9NWCBpbnN0YW5jZS4iKTsKLSAgICAgICAgfQotICAgICAgICBzcDxJT01YU3RvcmU+IG9teFN0b3JlID0gY29kZWNTZXJ2aWNlLT5nZXRPTVhTdG9yZSgpOwotICAgICAgICBpZiAob214U3RvcmUgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBjb25uZWN0IHRvIGFuIElPTVhTdG9yZSBpbnN0YW5jZS4iKTsKLSAgICAgICAgICAgIHJldHVybiBOT19JTklUOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTGlzdCBzZXJ2aWNlIGF0dHJpYnV0ZXMgKGdsb2JhbCBzZXR0aW5ncykKLSAgICAgICAgc3RkOjp2ZWN0b3I8SU9NWFN0b3JlOjpBdHRyaWJ1dGU+IHNlcnZpY2VBdHRyaWJ1dGVzOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBvbXhTdG9yZS0+bGlzdFNlcnZpY2VBdHRyaWJ1dGVzKCZzZXJ2aWNlQXR0cmlidXRlcyk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJGYWlsIHRvIG9idGFpbiBnbG9iYWwgc2V0dGluZ3MgZnJvbSBJT01YU3RvcmUuIik7Ci0gICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHAgOiBzZXJ2aWNlQXR0cmlidXRlcykgewotICAgICAgICAgICAgd3JpdGVyLT5hZGRHbG9iYWxTZXR0aW5nKAotICAgICAgICAgICAgICAgICAgICBwLmtleS5jX3N0cigpLCBwLnZhbHVlLmNfc3RyKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTGlzdCByb2xlcwotICAgICAgICBzdGF0dXMgPSBvbXhTdG9yZS0+bGlzdFJvbGVzKCZyb2xlcyk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJGYWlsIHRvIG9idGFpbiBjb2RlYyByb2xlcyBmcm9tIElPTVhTdG9yZS4iKTsKLSAgICAgICAgICAgIHJldHVybiBOT19JTklUOwotICAgICAgICB9CisgICAgaGlkbF92ZWM8SU9teFN0b3JlOjpTZXJ2aWNlQXR0cmlidXRlPiBzZXJ2aWNlQXR0cmlidXRlczsKKyAgICB0cmFuc1N0YXR1cyA9IG9teFN0b3JlLT5saXN0U2VydmljZUF0dHJpYnV0ZXMoCisgICAgICAgICAgICBbJnN0YXR1cywgJnNlcnZpY2VBdHRyaWJ1dGVzXSAoCisgICAgICAgICAgICBTdGF0dXMgaW5TdGF0dXMsCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxJT214U3RvcmU6OlNlcnZpY2VBdHRyaWJ1dGU+JiBpbkF0dHJpYnV0ZXMpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBpblN0YXR1czsKKyAgICAgICAgICAgICAgICBzZXJ2aWNlQXR0cmlidXRlcyA9IGluQXR0cmlidXRlczsKKyAgICAgICAgICAgIH0pOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsIHRvIG9idGFpbiBnbG9iYWwgc2V0dGluZ3MgZnJvbSBJT214U3RvcmUuIik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgQUxPR0UoIklPbXhTdG9yZSByZXBvcnRzIHBhcnNpbmcgZXJyb3IuIik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8mIHAgOiBzZXJ2aWNlQXR0cmlidXRlcykgeworICAgICAgICB3cml0ZXItPmFkZEdsb2JhbFNldHRpbmcoCisgICAgICAgICAgICAgICAgcC5rZXkuY19zdHIoKSwgcC52YWx1ZS5jX3N0cigpKTsKICAgICB9CiAKICAgICAvLyBDb252ZXJ0IHJvbGVzIHRvIGxpc3RzIG9mIGNvZGVjcwogCi0gICAgLy8gY29kZWMgbmFtZSAtPiBpbmRleCBpbnRvIHN3Q29kZWNzCi0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mb1dyaXRlcj4gPgotICAgICAgICAgICAgc3dDb2RlY05hbWUySW5mbzsKLSAgICAvLyBjb2RlYyBuYW1lIC0+IGluZGV4IGludG8gaHdDb2RlY3MKLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvV3JpdGVyPiA+Ci0gICAgICAgICAgICBod0NvZGVjTmFtZTJJbmZvOwotICAgIC8vIG93bmVyIG5hbWUgLT4gTWVkaWFDb2RlY0luZm8KLSAgICAvLyBUaGlzIG1hcCB3aWxsIGJlIHVzZWQgdG8gb2J0YWluIHRoZSBjb3JyZWN0IElPbXggc2VydmljZShzKSBuZWVkZWQgZm9yCi0gICAgLy8gY3JlYXRpbmcgSU9teE5vZGUgaW5zdGFuY2VzIGFuZCBxdWVyeWluZyBjYXBhYmlsaXRpZXMuCi0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yPHNwPE1lZGlhQ29kZWNJbmZvPiA+ID4KLSAgICAgICAgICAgIG93bmVyMkNvZGVjSW5mbzsKKyAgICAvLyBjb2RlYyBuYW1lIC0+IGluZGV4IGludG8gc3dDb2RlY3MvaHdDb2RlY3MKKyAgICBzdGQ6Om1hcDxoaWRsX3N0cmluZywgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvV3JpdGVyPj4KKyAgICAgICAgICAgIHN3Q29kZWNOYW1lMkluZm8sIGh3Q29kZWNOYW1lMkluZm87CiAKLSAgICBmb3IgKGNvbnN0IGF1dG8mIHJvbGUgOiByb2xlcykgewotICAgICAgICBjb25zdCBhdXRvJiB0eXBlTmFtZSA9IHJvbGUudHlwZTsKKyAgICBjaGFyIHJhbmtbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICB1aW50MzJfdCBkZWZhdWx0UmFuayA9IDB4MTAwOworICAgIGlmIChwcm9wZXJ0eV9nZXQoImRlYnVnLnN0YWdlZnJpZ2h0Lm9teF9kZWZhdWx0X3JhbmsiLCByYW5rLCBudWxscHRyKSkgeworICAgICAgICBkZWZhdWx0UmFuayA9IHN0ZDo6c3RydG91bChyYW5rLCBudWxscHRyLCAxMCk7CisgICAgfQorICAgIGZvciAoY29uc3QgSU9teFN0b3JlOjpSb2xlSW5mbyYgcm9sZSA6IHJvbGVzKSB7CisgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiB0eXBlTmFtZSA9IHJvbGUudHlwZTsKICAgICAgICAgYm9vbCBpc0VuY29kZXIgPSByb2xlLmlzRW5jb2RlcjsKICAgICAgICAgYm9vbCBwcmVmZXJQbGF0Zm9ybU5vZGVzID0gcm9sZS5wcmVmZXJQbGF0Zm9ybU5vZGVzOwogICAgICAgICAvLyBJZiBwcmVmZXJQbGF0Zm9ybU5vZGVzIGlzIHRydWUsIGhhcmR3YXJlIG5vZGVzIG11c3QgYmUgYWRkZWQgYWZ0ZXIKICAgICAgICAgLy8gcGxhdGZvcm0gKHNvZnR3YXJlKSBub2Rlcy4gaHdDb2RlY3MgaXMgdXNlZCB0byBob2xkIGhhcmR3YXJlIG5vZGVzCiAgICAgICAgIC8vIHRoYXQgbmVlZCB0byBiZSBhZGRlZCBhZnRlciBzb2Z0d2FyZSBub2RlcyBmb3IgdGhlIHNhbWUgcm9sZS4KLSAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgSU9NWFN0b3JlOjpOb2RlSW5mbyo+IGh3Q29kZWNzOwotICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIG5vZGUgOiByb2xlLm5vZGVzKSB7Ci0gICAgICAgICAgICBjb25zdCBhdXRvJiBub2RlTmFtZSA9IG5vZGUubmFtZTsKLSAgICAgICAgICAgIGJvb2wgaXNTb2Z0d2FyZSA9IG5vZGVOYW1lLmNvbXBhcmUoMCwgMTAsICJPTVguZ29vZ2xlIikgPT0gMDsKKyAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgSU9teFN0b3JlOjpOb2RlSW5mbyo+IGh3Q29kZWNzOworICAgICAgICBmb3IgKGNvbnN0IElPbXhTdG9yZTo6Tm9kZUluZm8mIG5vZGUgOiByb2xlLm5vZGVzKSB7CisgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbm9kZU5hbWUgPSBub2RlLm5hbWU7CisgICAgICAgICAgICBib29sIGlzU29mdHdhcmUgPSBoYXNQcmVmaXgobm9kZU5hbWUsICJPTVguZ29vZ2xlIik7CiAgICAgICAgICAgICBNZWRpYUNvZGVjSW5mb1dyaXRlciogaW5mbzsKICAgICAgICAgICAgIGlmIChpc1NvZnR3YXJlKSB7CiAgICAgICAgICAgICAgICAgYXV0byBjMmkgPSBzd0NvZGVjTmFtZTJJbmZvLmZpbmQobm9kZU5hbWUpOwpAQCAtMjQ1LDYgKzE2NCw3IEBACiAgICAgICAgICAgICAgICAgICAgIGluZm8tPnNldE5hbWUobm9kZU5hbWUuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgICAgIGluZm8tPnNldE93bmVyKG5vZGUub3duZXIuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgICAgIGluZm8tPnNldEVuY29kZXIoaXNFbmNvZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0UmFuayhkZWZhdWx0UmFuayk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG5vZGUgaGFzIGJlZW4gc2VlbiBiZWZvcmUuIFNpbXBseSByZXRyaWV2ZSB0aGUKICAgICAgICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcgTWVkaWFDb2RlY0luZm9Xcml0ZXIuCkBAIC0yNjEsNiArMTgxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnNldE5hbWUobm9kZU5hbWUuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zZXRPd25lcihub2RlLm93bmVyLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0RW5jb2Rlcihpc0VuY29kZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0UmFuayhkZWZhdWx0UmFuayk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBwcmVmZXJQbGF0Zm9ybU5vZGVzIGlzIHRydWUsIHRoaXMgbm9kZSBtdXN0IGJlCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGRlZCBhZnRlciBhbGwgc29mdHdhcmUgbm9kZXMuCkBAIC0yODcsOSArMjA4LDkgQEAKICAgICAgICAgLy8gYWRkZWQgaW4gdGhlIGxvb3AgYWJvdmUsIGJ1dCByYXRoZXIgc2F2ZWQgaW4gaHdDb2RlY3MuIFRoZXkgYXJlCiAgICAgICAgIC8vIGdvaW5nIHRvIGJlIGFkZGVkIGhlcmUuCiAgICAgICAgIGlmIChwcmVmZXJQbGF0Zm9ybU5vZGVzKSB7Ci0gICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIG5vZGUgOiBod0NvZGVjcykgeworICAgICAgICAgICAgZm9yIChjb25zdCBJT214U3RvcmU6Ok5vZGVJbmZvICpub2RlIDogaHdDb2RlY3MpIHsKICAgICAgICAgICAgICAgICBNZWRpYUNvZGVjSW5mb1dyaXRlciogaW5mbzsKLSAgICAgICAgICAgICAgICBjb25zdCBhdXRvJiBub2RlTmFtZSA9IG5vZGUtPm5hbWU7CisgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG5vZGVOYW1lID0gbm9kZS0+bmFtZTsKICAgICAgICAgICAgICAgICBhdXRvIGMyaSA9IGh3Q29kZWNOYW1lMkluZm8uZmluZChub2RlTmFtZSk7CiAgICAgICAgICAgICAgICAgaWYgKGMyaSA9PSBod0NvZGVjTmFtZTJJbmZvLmVuZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBNZWRpYUNvZGVjSW5mbyBmb3IgYSBuZXcgbm9kZS4KQEAgLTI5OSw2ICsyMjAsNyBAQAogICAgICAgICAgICAgICAgICAgICBpbmZvLT5zZXROYW1lKG5vZGVOYW1lLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgICAgICBpbmZvLT5zZXRPd25lcihub2RlLT5vd25lci5jX3N0cigpKTsKICAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0RW5jb2Rlcihpc0VuY29kZXIpOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5zZXRSYW5rKGRlZmF1bHRSYW5rKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAvLyBUaGUgbm9kZSBoYXMgYmVlbiBzZWVuIGJlZm9yZS4gU2ltcGx5IHJldHJpZXZlIHRoZQogICAgICAgICAgICAgICAgICAgICAvLyBleGlzdGluZyBNZWRpYUNvZGVjSW5mb1dyaXRlci4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhRXh0cmFjdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDJjNDJiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFFeHRyYWN0b3IuY3BwCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlJlbW90ZU1lZGlhRXh0cmFjdG9yIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvSW50ZXJmYWNlVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhRXh0cmFjdG9yLmg+CisKKy8vIHN0aWxsIGRvaW5nIHNvbWUgb24vb2ZmIHRvZ2dsaW5nIGhlcmUuCisjZGVmaW5lIE1FRElBX0xPRyAgICAgICAxCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8ga2V5IGZvciBtZWRpYSBzdGF0aXN0aWNzCitzdGF0aWMgY29uc3QgY2hhciAqa0tleUV4dHJhY3RvciA9ICJleHRyYWN0b3IiOworCisvLyBhdHRycyBmb3IgbWVkaWEgc3RhdGlzdGljcworLy8gTkI6IHRoZXNlIGFyZSBtYXRjaGVkIHdpdGggcHVibGljIEphdmEgQVBJIGNvbnN0YW50cyBkZWZpbmVkCisvLyBpbiBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhRXh0cmFjdG9yLmphdmEKKy8vIFRoZXNlIG11c3QgYmUga2VwdCBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgY29uc3RhbnRzIHRoZXJlLgorc3RhdGljIGNvbnN0IGNoYXIgKmtFeHRyYWN0b3JGb3JtYXQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWV4dHJhY3Rvci5mbXQiOworc3RhdGljIGNvbnN0IGNoYXIgKmtFeHRyYWN0b3JNaW1lID0gImFuZHJvaWQubWVkaWEubWVkaWFleHRyYWN0b3IubWltZSI7CitzdGF0aWMgY29uc3QgY2hhciAqa0V4dHJhY3RvclRyYWNrcyA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhZXh0cmFjdG9yLm50cmsiOworCitSZW1vdGVNZWRpYUV4dHJhY3Rvcjo6UmVtb3RlTWVkaWFFeHRyYWN0b3IoCisgICAgICAgIE1lZGlhRXh0cmFjdG9yICpleHRyYWN0b3IsCisgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsCisgICAgICAgIGNvbnN0IHNwPFJlZkJhc2U+ICZwbHVnaW4pCisgICAgOm1FeHRyYWN0b3IoZXh0cmFjdG9yKSwKKyAgICAgbVNvdXJjZShzb3VyY2UpLAorICAgICBtRXh0cmFjdG9yUGx1Z2luKHBsdWdpbikgeworCisgICAgbUFuYWx5dGljc0l0ZW0gPSBudWxscHRyOworICAgIGlmIChNRURJQV9MT0cpIHsKKyAgICAgICAgbUFuYWx5dGljc0l0ZW0gPSBuZXcgTWVkaWFBbmFseXRpY3NJdGVtKGtLZXlFeHRyYWN0b3IpOworCisgICAgICAgIC8vIHRyYWNrIHRoZSBjb250YWluZXIgZm9ybWF0IChtcGVnLCBhYWMsIHd2bSwgZXRjKQorICAgICAgICBzaXplX3QgbnRyYWNrcyA9IGV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKKyAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoa0V4dHJhY3RvckZvcm1hdCwgZXh0cmFjdG9yLT5uYW1lKCkpOworICAgICAgICAvLyB0cmFja3MgKHNpemVfdCkKKyAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtFeHRyYWN0b3JUcmFja3MsIG50cmFja3MpOworICAgICAgICAvLyBtZXRhZGF0YQorICAgICAgICBNZXRhRGF0YUJhc2UgcE1ldGFEYXRhOworICAgICAgICBpZiAoZXh0cmFjdG9yLT5nZXRNZXRhRGF0YShwTWV0YURhdGEpID09IE9LKSB7CisgICAgICAgICAgICBTdHJpbmc4IHh4ID0gcE1ldGFEYXRhLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAvLyAndGl0bCcgLS0gYnV0IHRoaXMgdmVyZ2VzIGludG8gUElJCisgICAgICAgICAgICAvLyAnbWltZScKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWUgPSBudWxscHRyOworICAgICAgICAgICAgaWYgKHBNZXRhRGF0YS5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSkgeworICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtFeHRyYWN0b3JNaW1lLCAgbWltZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyB3aGF0IGVsc2UgaXMgaW50ZXJlc3RpbmcgYW5kIG5vdCBhbHJlYWR5IGF2YWlsYWJsZT8KKyAgICAgICAgfQorICAgIH0KK30KKworUmVtb3RlTWVkaWFFeHRyYWN0b3I6On5SZW1vdGVNZWRpYUV4dHJhY3RvcigpIHsKKyAgICBkZWxldGUgbUV4dHJhY3RvcjsKKyAgICBtU291cmNlLT5jbG9zZSgpOworICAgIG1Tb3VyY2UuY2xlYXIoKTsKKyAgICBtRXh0cmFjdG9yUGx1Z2luID0gbnVsbHB0cjsKKyAgICAvLyBsb2cgdGhlIGN1cnJlbnQgcmVjb3JkLCBwcm92aWRlZCBpdCBoYXMgc29tZSBpbmZvcm1hdGlvbiB3b3J0aCByZWNvcmRpbmcKKyAgICBpZiAoTUVESUFfTE9HKSB7CisgICAgICAgIGlmIChtQW5hbHl0aWNzSXRlbSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBpZiAobUFuYWx5dGljc0l0ZW0tPmNvdW50KCkgPiAwKSB7CisgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNlbGZyZWNvcmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobUFuYWx5dGljc0l0ZW0gIT0gbnVsbHB0cikgeworICAgICAgICBkZWxldGUgbUFuYWx5dGljc0l0ZW07CisgICAgICAgIG1BbmFseXRpY3NJdGVtID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK3NpemVfdCBSZW1vdGVNZWRpYUV4dHJhY3Rvcjo6Y291bnRUcmFja3MoKSB7CisgICAgcmV0dXJuIG1FeHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7Cit9CisKK3NwPElNZWRpYVNvdXJjZT4gUmVtb3RlTWVkaWFFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgeworICAgIE1lZGlhVHJhY2sgKnNvdXJjZSA9IG1FeHRyYWN0b3ItPmdldFRyYWNrKGluZGV4KTsKKyAgICByZXR1cm4gKHNvdXJjZSA9PSBudWxscHRyKQorICAgICAgICAgICAgPyBudWxscHRyIDogQ3JlYXRlSU1lZGlhU291cmNlRnJvbU1lZGlhU291cmNlQmFzZSh0aGlzLCBzb3VyY2UsIG1FeHRyYWN0b3JQbHVnaW4pOworfQorCitzcDxNZXRhRGF0YT4gUmVtb3RlTWVkaWFFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncykgeworICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhKCk7CisgICAgaWYgKG1FeHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEoKm1ldGEuZ2V0KCksIGluZGV4LCBmbGFncykgPT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1ldGE7CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCitzcDxNZXRhRGF0YT4gUmVtb3RlTWVkaWFFeHRyYWN0b3I6OmdldE1ldGFEYXRhKCkgeworICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhKCk7CisgICAgaWYgKG1FeHRyYWN0b3ItPmdldE1ldGFEYXRhKCptZXRhLmdldCgpKSA9PSBPSykgeworICAgICAgICByZXR1cm4gbWV0YTsKKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK3N0YXR1c190IFJlbW90ZU1lZGlhRXh0cmFjdG9yOjpnZXRNZXRyaWNzKFBhcmNlbCAqcmVwbHkpIHsKKyAgICBpZiAobUFuYWx5dGljc0l0ZW0gPT0gbnVsbHB0ciB8fCByZXBseSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIG1BbmFseXRpY3NJdGVtLT53cml0ZVRvUGFyY2VsKHJlcGx5KTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3VpbnQzMl90IFJlbW90ZU1lZGlhRXh0cmFjdG9yOjpmbGFncygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUV4dHJhY3Rvci0+ZmxhZ3MoKTsKK30KKworc3RhdHVzX3QgUmVtb3RlTWVkaWFFeHRyYWN0b3I6OnNldE1lZGlhQ2FzKGNvbnN0IEhJbnRlcmZhY2VUb2tlbiAmY2FzVG9rZW4pIHsKKyAgICByZXR1cm4gbUV4dHJhY3Rvci0+c2V0TWVkaWFDYXMoKHVpbnQ4X3QqKWNhc1Rva2VuLmRhdGEoKSwgY2FzVG9rZW4uc2l6ZSgpKTsKK30KKworY29uc3QgY2hhciAqIFJlbW90ZU1lZGlhRXh0cmFjdG9yOjpuYW1lKCkgeworICAgIHJldHVybiBtRXh0cmFjdG9yLT5uYW1lKCk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIHN0YXRpYworc3A8SU1lZGlhRXh0cmFjdG9yPiBSZW1vdGVNZWRpYUV4dHJhY3Rvcjo6d3JhcCgKKyAgICAgICAgTWVkaWFFeHRyYWN0b3IgKmV4dHJhY3RvciwKKyAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwKKyAgICAgICAgY29uc3Qgc3A8UmVmQmFzZT4gJnBsdWdpbikgeworICAgIGlmIChleHRyYWN0b3IgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBSZW1vdGVNZWRpYUV4dHJhY3RvcihleHRyYWN0b3IsIHNvdXJjZSwgcGx1Z2luKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhU291cmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDdhZmVjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFTb3VyY2UuY3BwCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVNZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhU291cmNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworUmVtb3RlTWVkaWFTb3VyY2U6OlJlbW90ZU1lZGlhU291cmNlKAorICAgICAgICBjb25zdCBzcDxSZW1vdGVNZWRpYUV4dHJhY3Rvcj4gJmV4dHJhY3RvciwKKyAgICAgICAgTWVkaWFUcmFjayAqc291cmNlLAorICAgICAgICBjb25zdCBzcDxSZWZCYXNlPiAmcGx1Z2luKQorICAgIDogbUV4dHJhY3RvcihleHRyYWN0b3IpLAorICAgICAgbVNvdXJjZShzb3VyY2UpLAorICAgICAgbUV4dHJhY3RvclBsdWdpbihwbHVnaW4pIHt9CisKK1JlbW90ZU1lZGlhU291cmNlOjp+UmVtb3RlTWVkaWFTb3VyY2UoKSB7CisgICAgZGVsZXRlIG1Tb3VyY2U7CisgICAgbUV4dHJhY3RvclBsdWdpbiA9IG51bGxwdHI7Cit9CisKK3N0YXR1c190IFJlbW90ZU1lZGlhU291cmNlOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7CisgICAgcmV0dXJuIG1Tb3VyY2UtPnN0YXJ0KHBhcmFtcyk7Cit9CisKK3N0YXR1c190IFJlbW90ZU1lZGlhU291cmNlOjpzdG9wKCkgeworICAgIHJldHVybiBtU291cmNlLT5zdG9wKCk7Cit9CisKK3NwPE1ldGFEYXRhPiBSZW1vdGVNZWRpYVNvdXJjZTo6Z2V0Rm9ybWF0KCkgeworICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhKCk7CisgICAgaWYgKG1Tb3VyY2UtPmdldEZvcm1hdCgqbWV0YS5nZXQoKSkgPT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1ldGE7CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCitzdGF0dXNfdCBSZW1vdGVNZWRpYVNvdXJjZTo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKyAgICByZXR1cm4gbVNvdXJjZS0+cmVhZChidWZmZXIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zKj4ob3B0aW9ucykpOworfQorCitzdGF0dXNfdCBSZW1vdGVNZWRpYVNvdXJjZTo6cGF1c2UoKSB7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBSZW1vdGVNZWRpYVNvdXJjZTo6c2V0U3RvcFRpbWVVcyhpbnQ2NF90IC8qIHN0b3BUaW1lVXMgKi8pIHsKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIHN0YXRpYworc3A8SU1lZGlhU291cmNlPiBSZW1vdGVNZWRpYVNvdXJjZTo6d3JhcCgKKyAgICAgICAgY29uc3Qgc3A8UmVtb3RlTWVkaWFFeHRyYWN0b3I+ICZleHRyYWN0b3IsCisgICAgICAgIE1lZGlhVHJhY2sgKnNvdXJjZSwgY29uc3Qgc3A8UmVmQmFzZT4gJnBsdWdpbikgeworICAgIGlmIChzb3VyY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBSZW1vdGVNZWRpYVNvdXJjZShleHRyYWN0b3IsIHNvdXJjZSwgcGx1Z2luKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NhbXBsZUl0ZXJhdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NhbXBsZUl0ZXJhdG9yLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYzMWM1Zi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TYW1wbGVJdGVyYXRvci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiU2FtcGxlSXRlcmF0b3IiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJpbmNsdWRlL1NhbXBsZUl0ZXJhdG9yLmgiCi0KLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+Ci0KLSNpbmNsdWRlICJpbmNsdWRlL1NhbXBsZVRhYmxlLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotU2FtcGxlSXRlcmF0b3I6OlNhbXBsZUl0ZXJhdG9yKFNhbXBsZVRhYmxlICp0YWJsZSkKLSAgICA6IG1UYWJsZSh0YWJsZSksCi0gICAgICBtSW5pdGlhbGl6ZWQoZmFsc2UpLAotICAgICAgbVRpbWVUb1NhbXBsZUluZGV4KDApLAotICAgICAgbVRUU1NhbXBsZUluZGV4KDApLAotICAgICAgbVRUU1NhbXBsZVRpbWUoMCksCi0gICAgICBtVFRTQ291bnQoMCksCi0gICAgICBtVFRTRHVyYXRpb24oMCkgewotICAgIHJlc2V0KCk7Ci19Ci0KLXZvaWQgU2FtcGxlSXRlcmF0b3I6OnJlc2V0KCkgewotICAgIG1TYW1wbGVUb0NodW5rSW5kZXggPSAwOwotICAgIG1GaXJzdENodW5rID0gMDsKLSAgICBtRmlyc3RDaHVua1NhbXBsZUluZGV4ID0gMDsKLSAgICBtU3RvcENodW5rID0gMDsKLSAgICBtU3RvcENodW5rU2FtcGxlSW5kZXggPSAwOwotICAgIG1TYW1wbGVzUGVyQ2h1bmsgPSAwOwotICAgIG1DaHVua0Rlc2MgPSAwOwotfQotCi1zdGF0dXNfdCBTYW1wbGVJdGVyYXRvcjo6c2Vla1RvKHVpbnQzMl90IHNhbXBsZUluZGV4KSB7Ci0gICAgQUxPR1YoInNlZWtUbyglZCkiLCBzYW1wbGVJbmRleCk7Ci0KLSAgICBpZiAoc2FtcGxlSW5kZXggPj0gbVRhYmxlLT5tTnVtU2FtcGxlU2l6ZXMpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07Ci0gICAgfQotCi0gICAgaWYgKG1UYWJsZS0+bVNhbXBsZVRvQ2h1bmtPZmZzZXQgPCAwCi0gICAgICAgICAgICB8fCBtVGFibGUtPm1DaHVua09mZnNldE9mZnNldCA8IDAKLSAgICAgICAgICAgIHx8IG1UYWJsZS0+bVNhbXBsZVNpemVPZmZzZXQgPCAwCi0gICAgICAgICAgICB8fCBtVGFibGUtPm1UaW1lVG9TYW1wbGVDb3VudCA9PSAwKSB7Ci0KLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBpZiAobUluaXRpYWxpemVkICYmIG1DdXJyZW50U2FtcGxlSW5kZXggPT0gc2FtcGxlSW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIGlmICghbUluaXRpYWxpemVkIHx8IHNhbXBsZUluZGV4IDwgbUZpcnN0Q2h1bmtTYW1wbGVJbmRleCkgewotICAgICAgICByZXNldCgpOwotICAgIH0KLQotICAgIGlmIChzYW1wbGVJbmRleCA+PSBtU3RvcENodW5rU2FtcGxlSW5kZXgpIHsKLSAgICAgICAgc3RhdHVzX3QgZXJyOwotICAgICAgICBpZiAoKGVyciA9IGZpbmRDaHVua1JhbmdlKHNhbXBsZUluZGV4KSkgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJmaW5kQ2h1bmtSYW5nZSBmYWlsZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBDSEVDSyhzYW1wbGVJbmRleCA8IG1TdG9wQ2h1bmtTYW1wbGVJbmRleCk7Ci0KLSAgICBpZiAobVNhbXBsZXNQZXJDaHVuayA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJiLzIyODAyMzQ0Iik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgdWludDMyX3QgY2h1bmsgPQotICAgICAgICAoc2FtcGxlSW5kZXggLSBtRmlyc3RDaHVua1NhbXBsZUluZGV4KSAvIG1TYW1wbGVzUGVyQ2h1bmsKLSAgICAgICAgKyBtRmlyc3RDaHVuazsKLQotICAgIGlmICghbUluaXRpYWxpemVkIHx8IGNodW5rICE9IG1DdXJyZW50Q2h1bmtJbmRleCkgewotICAgICAgICBzdGF0dXNfdCBlcnI7Ci0gICAgICAgIGlmICgoZXJyID0gZ2V0Q2h1bmtPZmZzZXQoY2h1bmssICZtQ3VycmVudENodW5rT2Zmc2V0KSkgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJnZXRDaHVua09mZnNldCByZXR1cm4gZXJyb3IiKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBtQ3VycmVudENodW5rU2FtcGxlU2l6ZXMuY2xlYXIoKTsKLQotICAgICAgICB1aW50MzJfdCBmaXJzdENodW5rU2FtcGxlSW5kZXggPQotICAgICAgICAgICAgbUZpcnN0Q2h1bmtTYW1wbGVJbmRleAotICAgICAgICAgICAgICAgICsgbVNhbXBsZXNQZXJDaHVuayAqIChjaHVuayAtIG1GaXJzdENodW5rKTsKLQotICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbVNhbXBsZXNQZXJDaHVuazsgKytpKSB7Ci0gICAgICAgICAgICBzaXplX3Qgc2FtcGxlU2l6ZTsKLSAgICAgICAgICAgIGlmICgoZXJyID0gZ2V0U2FtcGxlU2l6ZURpcmVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdENodW5rU2FtcGxlSW5kZXggKyBpLCAmc2FtcGxlU2l6ZSkpICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImdldFNhbXBsZVNpemVEaXJlY3QgcmV0dXJuIGVycm9yIik7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRDaHVua1NhbXBsZVNpemVzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUN1cnJlbnRDaHVua1NhbXBsZVNpemVzLnB1c2goc2FtcGxlU2l6ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtQ3VycmVudENodW5rSW5kZXggPSBjaHVuazsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBjaHVua1JlbGF0aXZlU2FtcGxlSW5kZXggPQotICAgICAgICAoc2FtcGxlSW5kZXggLSBtRmlyc3RDaHVua1NhbXBsZUluZGV4KSAlIG1TYW1wbGVzUGVyQ2h1bms7Ci0KLSAgICBtQ3VycmVudFNhbXBsZU9mZnNldCA9IG1DdXJyZW50Q2h1bmtPZmZzZXQ7Ci0gICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNodW5rUmVsYXRpdmVTYW1wbGVJbmRleDsgKytpKSB7Ci0gICAgICAgIG1DdXJyZW50U2FtcGxlT2Zmc2V0ICs9IG1DdXJyZW50Q2h1bmtTYW1wbGVTaXplc1tpXTsKLSAgICB9Ci0KLSAgICBtQ3VycmVudFNhbXBsZVNpemUgPSBtQ3VycmVudENodW5rU2FtcGxlU2l6ZXNbY2h1bmtSZWxhdGl2ZVNhbXBsZUluZGV4XTsKLSAgICBpZiAoc2FtcGxlSW5kZXggPCBtVFRTU2FtcGxlSW5kZXgpIHsKLSAgICAgICAgbVRpbWVUb1NhbXBsZUluZGV4ID0gMDsKLSAgICAgICAgbVRUU1NhbXBsZUluZGV4ID0gMDsKLSAgICAgICAgbVRUU1NhbXBsZVRpbWUgPSAwOwotICAgICAgICBtVFRTQ291bnQgPSAwOwotICAgICAgICBtVFRTRHVyYXRpb24gPSAwOwotICAgIH0KLQotICAgIHN0YXR1c190IGVycjsKLSAgICBpZiAoKGVyciA9IGZpbmRTYW1wbGVUaW1lQW5kRHVyYXRpb24oCi0gICAgICAgICAgICBzYW1wbGVJbmRleCwgJm1DdXJyZW50U2FtcGxlVGltZSwgJm1DdXJyZW50U2FtcGxlRHVyYXRpb24pKSAhPSBPSykgewotICAgICAgICBBTE9HRSgiZmluZFNhbXBsZVRpbWUgcmV0dXJuIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgbUN1cnJlbnRTYW1wbGVJbmRleCA9IHNhbXBsZUluZGV4OwotCi0gICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU2FtcGxlSXRlcmF0b3I6OmZpbmRDaHVua1JhbmdlKHVpbnQzMl90IHNhbXBsZUluZGV4KSB7Ci0gICAgQ0hFQ0soc2FtcGxlSW5kZXggPj0gbUZpcnN0Q2h1bmtTYW1wbGVJbmRleCk7Ci0KLSAgICB3aGlsZSAoc2FtcGxlSW5kZXggPj0gbVN0b3BDaHVua1NhbXBsZUluZGV4KSB7Ci0gICAgICAgIGlmIChtU2FtcGxlVG9DaHVua0luZGV4ID09IG1UYWJsZS0+bU51bVNhbXBsZVRvQ2h1bmtPZmZzZXRzKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOwotICAgICAgICB9Ci0KLSAgICAgICAgbUZpcnN0Q2h1bmtTYW1wbGVJbmRleCA9IG1TdG9wQ2h1bmtTYW1wbGVJbmRleDsKLQotICAgICAgICBjb25zdCBTYW1wbGVUYWJsZTo6U2FtcGxlVG9DaHVua0VudHJ5ICplbnRyeSA9Ci0gICAgICAgICAgICAmbVRhYmxlLT5tU2FtcGxlVG9DaHVua0VudHJpZXNbbVNhbXBsZVRvQ2h1bmtJbmRleF07Ci0KLSAgICAgICAgbUZpcnN0Q2h1bmsgPSBlbnRyeS0+c3RhcnRDaHVuazsKLSAgICAgICAgbVNhbXBsZXNQZXJDaHVuayA9IGVudHJ5LT5zYW1wbGVzUGVyQ2h1bms7Ci0gICAgICAgIG1DaHVua0Rlc2MgPSBlbnRyeS0+Y2h1bmtEZXNjOwotCi0gICAgICAgIGlmIChtU2FtcGxlVG9DaHVua0luZGV4ICsgMSA8IG1UYWJsZS0+bU51bVNhbXBsZVRvQ2h1bmtPZmZzZXRzKSB7Ci0gICAgICAgICAgICBtU3RvcENodW5rID0gZW50cnlbMV0uc3RhcnRDaHVuazsKLQotICAgICAgICAgICAgaWYgKG1TdG9wQ2h1bmsgPCBtRmlyc3RDaHVuayB8fAotICAgICAgICAgICAgICAgIChtU3RvcENodW5rIC0gbUZpcnN0Q2h1bmspID4gVUlOVDMyX01BWCAvIG1TYW1wbGVzUGVyQ2h1bmsgfHwKLSAgICAgICAgICAgICAgICAoKG1TdG9wQ2h1bmsgLSBtRmlyc3RDaHVuaykgKiBtU2FtcGxlc1BlckNodW5rID4KLSAgICAgICAgICAgICAgICAgVUlOVDMyX01BWCAtIG1GaXJzdENodW5rU2FtcGxlSW5kZXgpKSB7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVN0b3BDaHVua1NhbXBsZUluZGV4ID0KLSAgICAgICAgICAgICAgICBtRmlyc3RDaHVua1NhbXBsZUluZGV4Ci0gICAgICAgICAgICAgICAgICAgICsgKG1TdG9wQ2h1bmsgLSBtRmlyc3RDaHVuaykgKiBtU2FtcGxlc1BlckNodW5rOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVN0b3BDaHVuayA9IDB4ZmZmZmZmZmY7Ci0gICAgICAgICAgICBtU3RvcENodW5rU2FtcGxlSW5kZXggPSAweGZmZmZmZmZmOwotICAgICAgICB9Ci0KLSAgICAgICAgKyttU2FtcGxlVG9DaHVua0luZGV4OwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU2FtcGxlSXRlcmF0b3I6OmdldENodW5rT2Zmc2V0KHVpbnQzMl90IGNodW5rLCBvZmY2NF90ICpvZmZzZXQpIHsKLSAgICAqb2Zmc2V0ID0gMDsKLQotICAgIGlmIChjaHVuayA+PSBtVGFibGUtPm1OdW1DaHVua09mZnNldHMpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKLSAgICB9Ci0KLSAgICBpZiAobVRhYmxlLT5tQ2h1bmtPZmZzZXRUeXBlID09IFNhbXBsZVRhYmxlOjprQ2h1bmtPZmZzZXRUeXBlMzIpIHsKLSAgICAgICAgdWludDMyX3Qgb2Zmc2V0MzI7Ci0KLSAgICAgICAgaWYgKG1UYWJsZS0+bURhdGFTb3VyY2UtPnJlYWRBdCgKLSAgICAgICAgICAgICAgICAgICAgbVRhYmxlLT5tQ2h1bmtPZmZzZXRPZmZzZXQgKyA4ICsgNCAqIGNodW5rLAotICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0MzIsCi0gICAgICAgICAgICAgICAgICAgIHNpemVvZihvZmZzZXQzMikpIDwgKHNzaXplX3Qpc2l6ZW9mKG9mZnNldDMyKSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICB9Ci0KLSAgICAgICAgKm9mZnNldCA9IG50b2hsKG9mZnNldDMyKTsKLSAgICB9IGVsc2UgewotICAgICAgICBDSEVDS19FUShtVGFibGUtPm1DaHVua09mZnNldFR5cGUsIFNhbXBsZVRhYmxlOjprQ2h1bmtPZmZzZXRUeXBlNjQpOwotCi0gICAgICAgIHVpbnQ2NF90IG9mZnNldDY0OwotICAgICAgICBpZiAobVRhYmxlLT5tRGF0YVNvdXJjZS0+cmVhZEF0KAotICAgICAgICAgICAgICAgICAgICBtVGFibGUtPm1DaHVua09mZnNldE9mZnNldCArIDggKyA4ICogY2h1bmssCi0gICAgICAgICAgICAgICAgICAgICZvZmZzZXQ2NCwKLSAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9mZnNldDY0KSkgPCAoc3NpemVfdClzaXplb2Yob2Zmc2V0NjQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgIH0KLQotICAgICAgICAqb2Zmc2V0ID0gbnRvaDY0KG9mZnNldDY0KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFNhbXBsZUl0ZXJhdG9yOjpnZXRTYW1wbGVTaXplRGlyZWN0KAotICAgICAgICB1aW50MzJfdCBzYW1wbGVJbmRleCwgc2l6ZV90ICpzaXplKSB7Ci0gICAgKnNpemUgPSAwOwotCi0gICAgaWYgKHNhbXBsZUluZGV4ID49IG1UYWJsZS0+bU51bVNhbXBsZVNpemVzKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7Ci0gICAgfQotCi0gICAgaWYgKG1UYWJsZS0+bURlZmF1bHRTYW1wbGVTaXplID4gMCkgewotICAgICAgICAqc2l6ZSA9IG1UYWJsZS0+bURlZmF1bHRTYW1wbGVTaXplOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgc3dpdGNoIChtVGFibGUtPm1TYW1wbGVTaXplRmllbGRTaXplKSB7Ci0gICAgICAgIGNhc2UgMzI6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChtVGFibGUtPm1EYXRhU291cmNlLT5yZWFkQXQoCi0gICAgICAgICAgICAgICAgICAgICAgICBtVGFibGUtPm1TYW1wbGVTaXplT2Zmc2V0ICsgMTIgKyA0ICogc2FtcGxlSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBzaXplb2YoKnNpemUpKSA8IChzc2l6ZV90KXNpemVvZigqc2l6ZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICpzaXplID0gbnRvaGwoKnNpemUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIDE2OgotICAgICAgICB7Ci0gICAgICAgICAgICB1aW50MTZfdCB4OwotICAgICAgICAgICAgaWYgKG1UYWJsZS0+bURhdGFTb3VyY2UtPnJlYWRBdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UYWJsZS0+bVNhbXBsZVNpemVPZmZzZXQgKyAxMiArIDIgKiBzYW1wbGVJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZ4LCBzaXplb2YoeCkpIDwgKHNzaXplX3Qpc2l6ZW9mKHgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAqc2l6ZSA9IG50b2hzKHgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIDg6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgeDsKLSAgICAgICAgICAgIGlmIChtVGFibGUtPm1EYXRhU291cmNlLT5yZWFkQXQoCi0gICAgICAgICAgICAgICAgICAgICAgICBtVGFibGUtPm1TYW1wbGVTaXplT2Zmc2V0ICsgMTIgKyBzYW1wbGVJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZ4LCBzaXplb2YoeCkpIDwgKHNzaXplX3Qpc2l6ZW9mKHgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAqc2l6ZSA9IHg7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIENIRUNLX0VRKG1UYWJsZS0+bVNhbXBsZVNpemVGaWVsZFNpemUsIDR1KTsKLQotICAgICAgICAgICAgdWludDhfdCB4OwotICAgICAgICAgICAgaWYgKG1UYWJsZS0+bURhdGFTb3VyY2UtPnJlYWRBdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UYWJsZS0+bVNhbXBsZVNpemVPZmZzZXQgKyAxMiArIHNhbXBsZUluZGV4IC8gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICZ4LCBzaXplb2YoeCkpIDwgKHNzaXplX3Qpc2l6ZW9mKHgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAqc2l6ZSA9IChzYW1wbGVJbmRleCAmIDEpID8geCAmIDB4MGYgOiB4ID4+IDQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU2FtcGxlSXRlcmF0b3I6OmZpbmRTYW1wbGVUaW1lQW5kRHVyYXRpb24oCi0gICAgICAgIHVpbnQzMl90IHNhbXBsZUluZGV4LCB1aW50MzJfdCAqdGltZSwgdWludDMyX3QgKmR1cmF0aW9uKSB7Ci0gICAgaWYgKHNhbXBsZUluZGV4ID49IG1UYWJsZS0+bU51bVNhbXBsZVNpemVzKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7Ci0gICAgfQotCi0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgaWYgKG1UVFNTYW1wbGVJbmRleCA+IFVJTlQzMl9NQVggLSBtVFRTQ291bnQpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoc2FtcGxlSW5kZXggPCBtVFRTU2FtcGxlSW5kZXggKyBtVFRTQ291bnQpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtVGltZVRvU2FtcGxlSW5kZXggPT0gbVRhYmxlLT5tVGltZVRvU2FtcGxlQ291bnQgfHwKLSAgICAgICAgICAgIChtVFRTRHVyYXRpb24gIT0gMCAmJiBtVFRTQ291bnQgPiBVSU5UMzJfTUFYIC8gbVRUU0R1cmF0aW9uKSB8fAotICAgICAgICAgICAgbVRUU1NhbXBsZVRpbWUgPiBVSU5UMzJfTUFYIC0gKG1UVFNDb3VudCAqIG1UVFNEdXJhdGlvbikpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7Ci0gICAgICAgIH0KLQotICAgICAgICBtVFRTU2FtcGxlSW5kZXggKz0gbVRUU0NvdW50OwotICAgICAgICBtVFRTU2FtcGxlVGltZSArPSBtVFRTQ291bnQgKiBtVFRTRHVyYXRpb247Ci0KLSAgICAgICAgbVRUU0NvdW50ID0gbVRhYmxlLT5tVGltZVRvU2FtcGxlWzIgKiBtVGltZVRvU2FtcGxlSW5kZXhdOwotICAgICAgICBtVFRTRHVyYXRpb24gPSBtVGFibGUtPm1UaW1lVG9TYW1wbGVbMiAqIG1UaW1lVG9TYW1wbGVJbmRleCArIDFdOwotCi0gICAgICAgICsrbVRpbWVUb1NhbXBsZUluZGV4OwotICAgIH0KLQotICAgICp0aW1lID0gbVRUU1NhbXBsZVRpbWUgKyBtVFRTRHVyYXRpb24gKiAoc2FtcGxlSW5kZXggLSBtVFRTU2FtcGxlSW5kZXgpOwotCi0gICAgaW50MzJfdCBvZmZzZXQgPSBtVGFibGUtPmdldENvbXBvc2l0aW9uVGltZU9mZnNldChzYW1wbGVJbmRleCk7Ci0gICAgaWYgKChvZmZzZXQgPCAwICYmICp0aW1lIDwgKG9mZnNldCA9PSBJTlQzMl9NSU4gPwotICAgICAgICAgICAgSU5UMzJfTUFYIDogdWludDMyX3QoLW9mZnNldCkpKSB8fAotICAgICAgICAgICAgKG9mZnNldCA+IDAgJiYgKnRpbWUgPiBVSU5UMzJfTUFYIC0gb2Zmc2V0KSkgewotICAgICAgICBBTE9HRSgiJXUgKyAlZCB3b3VsZCBvdmVyZmxvdyIsICp0aW1lLCBvZmZzZXQpOwotICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOwotICAgIH0KLSAgICBpZiAob2Zmc2V0ID4gMCkgewotICAgICAgICAqdGltZSArPSBvZmZzZXQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKnRpbWUgLT0gKG9mZnNldCA9PSBJTlQzMl9NSU4gPyBJTlQzMl9NQVggOiAoLW9mZnNldCkpOwotICAgIH0KLQotICAgICpkdXJhdGlvbiA9IG1UVFNEdXJhdGlvbjsKLQotICAgIHJldHVybiBPSzsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2FtcGxlVGFibGUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2FtcGxlVGFibGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDJhOTMxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NhbXBsZVRhYmxlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwMDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiU2FtcGxlVGFibGUiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxsaW1pdHM+Ci0KLSNpbmNsdWRlICJpbmNsdWRlL1NhbXBsZVRhYmxlLmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9TYW1wbGVJdGVyYXRvci5oIgotCi0jaW5jbHVkZSA8YXJwYS9pbmV0Lmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgotCi0vKiBUT0RPOiByZW1vdmUgYWZ0ZXIgYmVpbmcgbWVyZ2VkIGludG8gb3RoZXIgYnJhbmNoZXMgKi8KLSNpZm5kZWYgVUlOVDMyX01BWAotI2RlZmluZSBVSU5UMzJfTUFYICAgICAgICg0Mjk0OTY3Mjk1VSkKLSNlbmRpZgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIHN0YXRpYwotY29uc3QgdWludDMyX3QgU2FtcGxlVGFibGU6OmtDaHVua09mZnNldFR5cGUzMiA9IEZPVVJDQygncycsICd0JywgJ2MnLCAnbycpOwotLy8gc3RhdGljCi1jb25zdCB1aW50MzJfdCBTYW1wbGVUYWJsZTo6a0NodW5rT2Zmc2V0VHlwZTY0ID0gRk9VUkNDKCdjJywgJ28nLCAnNicsICc0Jyk7Ci0vLyBzdGF0aWMKLWNvbnN0IHVpbnQzMl90IFNhbXBsZVRhYmxlOjprU2FtcGxlU2l6ZVR5cGUzMiA9IEZPVVJDQygncycsICd0JywgJ3MnLCAneicpOwotLy8gc3RhdGljCi1jb25zdCB1aW50MzJfdCBTYW1wbGVUYWJsZTo6a1NhbXBsZVNpemVUeXBlQ29tcGFjdCA9IEZPVVJDQygncycsICd0JywgJ3onLCAnMicpOwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1jb25zdCBvZmY2NF90IGtNYXhPZmZzZXQgPSBzdGQ6Om51bWVyaWNfbGltaXRzPG9mZjY0X3Q+OjptYXgoKTsKLQotc3RydWN0IFNhbXBsZVRhYmxlOjpDb21wb3NpdGlvbkRlbHRhTG9va3VwIHsKLSAgICBDb21wb3NpdGlvbkRlbHRhTG9va3VwKCk7Ci0KLSAgICB2b2lkIHNldEVudHJpZXMoCi0gICAgICAgICAgICBjb25zdCBpbnQzMl90ICpkZWx0YUVudHJpZXMsIHNpemVfdCBudW1EZWx0YUVudHJpZXMpOwotCi0gICAgaW50MzJfdCBnZXRDb21wb3NpdGlvblRpbWVPZmZzZXQodWludDMyX3Qgc2FtcGxlSW5kZXgpOwotCi1wcml2YXRlOgotICAgIE11dGV4IG1Mb2NrOwotCi0gICAgY29uc3QgaW50MzJfdCAqbURlbHRhRW50cmllczsKLSAgICBzaXplX3QgbU51bURlbHRhRW50cmllczsKLQotICAgIHNpemVfdCBtQ3VycmVudERlbHRhRW50cnk7Ci0gICAgc2l6ZV90IG1DdXJyZW50RW50cnlTYW1wbGVJbmRleDsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENvbXBvc2l0aW9uRGVsdGFMb29rdXApOwotfTsKLQotU2FtcGxlVGFibGU6OkNvbXBvc2l0aW9uRGVsdGFMb29rdXA6OkNvbXBvc2l0aW9uRGVsdGFMb29rdXAoKQotICAgIDogbURlbHRhRW50cmllcyhOVUxMKSwKLSAgICAgIG1OdW1EZWx0YUVudHJpZXMoMCksCi0gICAgICBtQ3VycmVudERlbHRhRW50cnkoMCksCi0gICAgICBtQ3VycmVudEVudHJ5U2FtcGxlSW5kZXgoMCkgewotfQotCi12b2lkIFNhbXBsZVRhYmxlOjpDb21wb3NpdGlvbkRlbHRhTG9va3VwOjpzZXRFbnRyaWVzKAotICAgICAgICBjb25zdCBpbnQzMl90ICpkZWx0YUVudHJpZXMsIHNpemVfdCBudW1EZWx0YUVudHJpZXMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOwotCi0gICAgbURlbHRhRW50cmllcyA9IGRlbHRhRW50cmllczsKLSAgICBtTnVtRGVsdGFFbnRyaWVzID0gbnVtRGVsdGFFbnRyaWVzOwotICAgIG1DdXJyZW50RGVsdGFFbnRyeSA9IDA7Ci0gICAgbUN1cnJlbnRFbnRyeVNhbXBsZUluZGV4ID0gMDsKLX0KLQotaW50MzJfdCBTYW1wbGVUYWJsZTo6Q29tcG9zaXRpb25EZWx0YUxvb2t1cDo6Z2V0Q29tcG9zaXRpb25UaW1lT2Zmc2V0KAotICAgICAgICB1aW50MzJfdCBzYW1wbGVJbmRleCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7Ci0KLSAgICBpZiAobURlbHRhRW50cmllcyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGlmIChzYW1wbGVJbmRleCA8IG1DdXJyZW50RW50cnlTYW1wbGVJbmRleCkgewotICAgICAgICBtQ3VycmVudERlbHRhRW50cnkgPSAwOwotICAgICAgICBtQ3VycmVudEVudHJ5U2FtcGxlSW5kZXggPSAwOwotICAgIH0KLQotICAgIHdoaWxlIChtQ3VycmVudERlbHRhRW50cnkgPCBtTnVtRGVsdGFFbnRyaWVzKSB7Ci0gICAgICAgIHVpbnQzMl90IHNhbXBsZUNvdW50ID0gbURlbHRhRW50cmllc1syICogbUN1cnJlbnREZWx0YUVudHJ5XTsKLSAgICAgICAgaWYgKHNhbXBsZUluZGV4IDwgbUN1cnJlbnRFbnRyeVNhbXBsZUluZGV4ICsgc2FtcGxlQ291bnQpIHsKLSAgICAgICAgICAgIHJldHVybiBtRGVsdGFFbnRyaWVzWzIgKiBtQ3VycmVudERlbHRhRW50cnkgKyAxXTsKLSAgICAgICAgfQotCi0gICAgICAgIG1DdXJyZW50RW50cnlTYW1wbGVJbmRleCArPSBzYW1wbGVDb3VudDsKLSAgICAgICAgKyttQ3VycmVudERlbHRhRW50cnk7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLVNhbXBsZVRhYmxlOjpTYW1wbGVUYWJsZShjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKQotICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKLSAgICAgIG1DaHVua09mZnNldE9mZnNldCgtMSksCi0gICAgICBtQ2h1bmtPZmZzZXRUeXBlKDApLAotICAgICAgbU51bUNodW5rT2Zmc2V0cygwKSwKLSAgICAgIG1TYW1wbGVUb0NodW5rT2Zmc2V0KC0xKSwKLSAgICAgIG1OdW1TYW1wbGVUb0NodW5rT2Zmc2V0cygwKSwKLSAgICAgIG1TYW1wbGVTaXplT2Zmc2V0KC0xKSwKLSAgICAgIG1TYW1wbGVTaXplRmllbGRTaXplKDApLAotICAgICAgbURlZmF1bHRTYW1wbGVTaXplKDApLAotICAgICAgbU51bVNhbXBsZVNpemVzKDApLAotICAgICAgbUhhc1RpbWVUb1NhbXBsZShmYWxzZSksCi0gICAgICBtVGltZVRvU2FtcGxlQ291bnQoMCksCi0gICAgICBtVGltZVRvU2FtcGxlKE5VTEwpLAotICAgICAgbVNhbXBsZVRpbWVFbnRyaWVzKE5VTEwpLAotICAgICAgbUNvbXBvc2l0aW9uVGltZURlbHRhRW50cmllcyhOVUxMKSwKLSAgICAgIG1OdW1Db21wb3NpdGlvblRpbWVEZWx0YUVudHJpZXMoMCksCi0gICAgICBtQ29tcG9zaXRpb25EZWx0YUxvb2t1cChuZXcgQ29tcG9zaXRpb25EZWx0YUxvb2t1cCksCi0gICAgICBtU3luY1NhbXBsZU9mZnNldCgtMSksCi0gICAgICBtTnVtU3luY1NhbXBsZXMoMCksCi0gICAgICBtU3luY1NhbXBsZXMoTlVMTCksCi0gICAgICBtTGFzdFN5bmNTYW1wbGVJbmRleCgwKSwKLSAgICAgIG1TYW1wbGVUb0NodW5rRW50cmllcyhOVUxMKSwKLSAgICAgIG1Ub3RhbFNpemUoMCkgewotICAgIG1TYW1wbGVJdGVyYXRvciA9IG5ldyBTYW1wbGVJdGVyYXRvcih0aGlzKTsKLX0KLQotU2FtcGxlVGFibGU6On5TYW1wbGVUYWJsZSgpIHsKLSAgICBkZWxldGVbXSBtU2FtcGxlVG9DaHVua0VudHJpZXM7Ci0gICAgbVNhbXBsZVRvQ2h1bmtFbnRyaWVzID0gTlVMTDsKLQotICAgIGRlbGV0ZVtdIG1TeW5jU2FtcGxlczsKLSAgICBtU3luY1NhbXBsZXMgPSBOVUxMOwotCi0gICAgZGVsZXRlW10gbVRpbWVUb1NhbXBsZTsKLSAgICBtVGltZVRvU2FtcGxlID0gTlVMTDsKLQotICAgIGRlbGV0ZSBtQ29tcG9zaXRpb25EZWx0YUxvb2t1cDsKLSAgICBtQ29tcG9zaXRpb25EZWx0YUxvb2t1cCA9IE5VTEw7Ci0KLSAgICBkZWxldGVbXSBtQ29tcG9zaXRpb25UaW1lRGVsdGFFbnRyaWVzOwotICAgIG1Db21wb3NpdGlvblRpbWVEZWx0YUVudHJpZXMgPSBOVUxMOwotCi0gICAgZGVsZXRlW10gbVNhbXBsZVRpbWVFbnRyaWVzOwotICAgIG1TYW1wbGVUaW1lRW50cmllcyA9IE5VTEw7Ci0KLSAgICBkZWxldGUgbVNhbXBsZUl0ZXJhdG9yOwotICAgIG1TYW1wbGVJdGVyYXRvciA9IE5VTEw7Ci19Ci0KLWJvb2wgU2FtcGxlVGFibGU6OmlzVmFsaWQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1DaHVua09mZnNldE9mZnNldCA+PSAwCi0gICAgICAgICYmIG1TYW1wbGVUb0NodW5rT2Zmc2V0ID49IDAKLSAgICAgICAgJiYgbVNhbXBsZVNpemVPZmZzZXQgPj0gMAotICAgICAgICAmJiBtSGFzVGltZVRvU2FtcGxlOwotfQotCi1zdGF0dXNfdCBTYW1wbGVUYWJsZTo6c2V0Q2h1bmtPZmZzZXRQYXJhbXMoCi0gICAgICAgIHVpbnQzMl90IHR5cGUsIG9mZjY0X3QgZGF0YV9vZmZzZXQsIHNpemVfdCBkYXRhX3NpemUpIHsKLSAgICBpZiAobUNodW5rT2Zmc2V0T2Zmc2V0ID49IDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBDSEVDSyh0eXBlID09IGtDaHVua09mZnNldFR5cGUzMiB8fCB0eXBlID09IGtDaHVua09mZnNldFR5cGU2NCk7Ci0KLSAgICBtQ2h1bmtPZmZzZXRPZmZzZXQgPSBkYXRhX29mZnNldDsKLSAgICBtQ2h1bmtPZmZzZXRUeXBlID0gdHlwZTsKLQotICAgIGlmIChkYXRhX3NpemUgPCA4KSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgdWludDhfdCBoZWFkZXJbOF07Ci0gICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCi0gICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpIDwgKHNzaXplX3Qpc2l6ZW9mKGhlYWRlcikpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgIH0KLQotICAgIGlmIChVMzJfQVQoaGVhZGVyKSAhPSAwKSB7Ci0gICAgICAgIC8vIEV4cGVjdGVkIHZlcnNpb24gPSAwLCBmbGFncyA9IDAuCi0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgbU51bUNodW5rT2Zmc2V0cyA9IFUzMl9BVCgmaGVhZGVyWzRdKTsKLQotICAgIGlmIChtQ2h1bmtPZmZzZXRUeXBlID09IGtDaHVua09mZnNldFR5cGUzMikgewotICAgICAgaWYgKChkYXRhX3NpemUgLSA4KSAvIDQgPCBtTnVtQ2h1bmtPZmZzZXRzKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmICgoZGF0YV9zaXplIC0gOCkgLyA4IDwgbU51bUNodW5rT2Zmc2V0cykgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU2FtcGxlVGFibGU6OnNldFNhbXBsZVRvQ2h1bmtQYXJhbXMoCi0gICAgICAgIG9mZjY0X3QgZGF0YV9vZmZzZXQsIHNpemVfdCBkYXRhX3NpemUpIHsKLSAgICBpZiAobVNhbXBsZVRvQ2h1bmtPZmZzZXQgPj0gMCkgewotICAgICAgICAvLyBhbHJlYWR5IHNldAotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGlmIChkYXRhX29mZnNldCA8IDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBtU2FtcGxlVG9DaHVua09mZnNldCA9IGRhdGFfb2Zmc2V0OwotCi0gICAgaWYgKGRhdGFfc2l6ZSA8IDgpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICB1aW50OF90IGhlYWRlcls4XTsKLSAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKLSAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkgPCAoc3NpemVfdClzaXplb2YoaGVhZGVyKSkgewotICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgfQotCi0gICAgaWYgKFUzMl9BVChoZWFkZXIpICE9IDApIHsKLSAgICAgICAgLy8gRXhwZWN0ZWQgdmVyc2lvbiA9IDAsIGZsYWdzID0gMC4KLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBtTnVtU2FtcGxlVG9DaHVua09mZnNldHMgPSBVMzJfQVQoJmhlYWRlcls0XSk7Ci0KLSAgICBpZiAoKGRhdGFfc2l6ZSAtIDgpIC8gc2l6ZW9mKFNhbXBsZVRvQ2h1bmtFbnRyeSkgPCBtTnVtU2FtcGxlVG9DaHVua09mZnNldHMpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBpZiAoKHVpbnQ2NF90KWtNYXhUb3RhbFNpemUgLyBzaXplb2YoU2FtcGxlVG9DaHVua0VudHJ5KSA8PQotICAgICAgICAgICAgKHVpbnQ2NF90KW1OdW1TYW1wbGVUb0NodW5rT2Zmc2V0cykgewotICAgICAgICBBTE9HRSgiU2FtcGxlLXRvLWNodW5rIHRhYmxlIHNpemUgdG9vIGxhcmdlLiIpOwotICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOwotICAgIH0KLQotICAgIG1Ub3RhbFNpemUgKz0gKHVpbnQ2NF90KW1OdW1TYW1wbGVUb0NodW5rT2Zmc2V0cyAqCi0gICAgICAgICAgICBzaXplb2YoU2FtcGxlVG9DaHVua0VudHJ5KTsKLSAgICBpZiAobVRvdGFsU2l6ZSA+IGtNYXhUb3RhbFNpemUpIHsKLSAgICAgICAgQUxPR0UoIlNhbXBsZS10by1jaHVuayB0YWJsZSBzaXplIHdvdWxkIG1ha2Ugc2FtcGxlIHRhYmxlIHRvbyBsYXJnZS5cbiIKLSAgICAgICAgICAgICAgIiAgICBSZXF1ZXN0ZWQgc2FtcGxlLXRvLWNodW5rIHRhYmxlIHNpemUgPSAlbGx1XG4iCi0gICAgICAgICAgICAgICIgICAgRXZlbnR1YWwgc2FtcGxlIHRhYmxlIHNpemUgPj0gJWxsdVxuIgotICAgICAgICAgICAgICAiICAgIEFsbG93ZWQgc2FtcGxlIHRhYmxlIHNpemUgPSAlbGx1XG4iLAotICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKW1OdW1TYW1wbGVUb0NodW5rT2Zmc2V0cyAqCi0gICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFNhbXBsZVRvQ2h1bmtFbnRyeSksCi0gICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbVRvdGFsU2l6ZSwKLSAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylrTWF4VG90YWxTaXplKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKLSAgICB9Ci0KLSAgICBtU2FtcGxlVG9DaHVua0VudHJpZXMgPQotICAgICAgICBuZXcgKHN0ZDo6bm90aHJvdykgU2FtcGxlVG9DaHVua0VudHJ5W21OdW1TYW1wbGVUb0NodW5rT2Zmc2V0c107Ci0gICAgaWYgKCFtU2FtcGxlVG9DaHVua0VudHJpZXMpIHsKLSAgICAgICAgQUxPR0UoIkNhbm5vdCBhbGxvY2F0ZSBzYW1wbGUtdG8tY2h1bmsgdGFibGUgd2l0aCAlbGx1IGVudHJpZXMuIiwKLSAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKW1OdW1TYW1wbGVUb0NodW5rT2Zmc2V0cyk7Ci0gICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7Ci0gICAgfQotCi0gICAgaWYgKG1OdW1TYW1wbGVUb0NodW5rT2Zmc2V0cyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBpZiAoKG9mZjY0X3QpKGtNYXhPZmZzZXQgLSA4IC0KLSAgICAgICAgICAgICgobU51bVNhbXBsZVRvQ2h1bmtPZmZzZXRzIC0gMSkgKiBzaXplb2YoU2FtcGxlVG9DaHVua0VudHJ5KSkpCi0gICAgICAgICAgICA8IG1TYW1wbGVUb0NodW5rT2Zmc2V0KSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1OdW1TYW1wbGVUb0NodW5rT2Zmc2V0czsgKytpKSB7Ci0gICAgICAgIHVpbnQ4X3QgYnVmZmVyW3NpemVvZihTYW1wbGVUb0NodW5rRW50cnkpXTsKLQotICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKLSAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVRvQ2h1bmtPZmZzZXQgKyA4ICsgaSAqIHNpemVvZihTYW1wbGVUb0NodW5rRW50cnkpLAotICAgICAgICAgICAgICAgICAgICBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIHNpemVvZihidWZmZXIpKQotICAgICAgICAgICAgICAgICE9IChzc2l6ZV90KXNpemVvZihidWZmZXIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgIH0KLSAgICAgICAgLy8gY2h1bmsgaW5kZXggaXMgMSBiYXNlZCBpbiB0aGUgc3BlYy4KLSAgICAgICAgaWYgKFUzMl9BVChidWZmZXIpIDwgMSkgewotICAgICAgICAgICAgQUxPR0UoImIvMjM1MzQxNjAiKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXZSB3YW50IHRoZSBjaHVuayBpbmRleCB0byBiZSAwLWJhc2VkLgotICAgICAgICBtU2FtcGxlVG9DaHVua0VudHJpZXNbaV0uc3RhcnRDaHVuayA9IFUzMl9BVChidWZmZXIpIC0gMTsKLSAgICAgICAgbVNhbXBsZVRvQ2h1bmtFbnRyaWVzW2ldLnNhbXBsZXNQZXJDaHVuayA9IFUzMl9BVCgmYnVmZmVyWzRdKTsKLSAgICAgICAgbVNhbXBsZVRvQ2h1bmtFbnRyaWVzW2ldLmNodW5rRGVzYyA9IFUzMl9BVCgmYnVmZmVyWzhdKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFNhbXBsZVRhYmxlOjpzZXRTYW1wbGVTaXplUGFyYW1zKAotICAgICAgICB1aW50MzJfdCB0eXBlLCBvZmY2NF90IGRhdGFfb2Zmc2V0LCBzaXplX3QgZGF0YV9zaXplKSB7Ci0gICAgaWYgKG1TYW1wbGVTaXplT2Zmc2V0ID49IDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBDSEVDSyh0eXBlID09IGtTYW1wbGVTaXplVHlwZTMyIHx8IHR5cGUgPT0ga1NhbXBsZVNpemVUeXBlQ29tcGFjdCk7Ci0KLSAgICBtU2FtcGxlU2l6ZU9mZnNldCA9IGRhdGFfb2Zmc2V0OwotCi0gICAgaWYgKGRhdGFfc2l6ZSA8IDEyKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgdWludDhfdCBoZWFkZXJbMTJdOwotICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAotICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKSA8IChzc2l6ZV90KXNpemVvZihoZWFkZXIpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICB9Ci0KLSAgICBpZiAoVTMyX0FUKGhlYWRlcikgIT0gMCkgewotICAgICAgICAvLyBFeHBlY3RlZCB2ZXJzaW9uID0gMCwgZmxhZ3MgPSAwLgotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIG1EZWZhdWx0U2FtcGxlU2l6ZSA9IFUzMl9BVCgmaGVhZGVyWzRdKTsKLSAgICBtTnVtU2FtcGxlU2l6ZXMgPSBVMzJfQVQoJmhlYWRlcls4XSk7Ci0gICAgaWYgKG1OdW1TYW1wbGVTaXplcyA+IChVSU5UMzJfTUFYIC0gMTIpIC8gMTYpIHsKLSAgICAgICAgQUxPR0UoImIvMjMyNDcwNTUsIG1OdW1TYW1wbGVTaXplcygldSkiLCBtTnVtU2FtcGxlU2l6ZXMpOwotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGlmICh0eXBlID09IGtTYW1wbGVTaXplVHlwZTMyKSB7Ci0gICAgICAgIG1TYW1wbGVTaXplRmllbGRTaXplID0gMzI7Ci0KLSAgICAgICAgaWYgKG1EZWZhdWx0U2FtcGxlU2l6ZSAhPSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGF0YV9zaXplIDwgMTIgKyBtTnVtU2FtcGxlU2l6ZXMgKiA0KSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKChtRGVmYXVsdFNhbXBsZVNpemUgJiAweGZmZmZmZjAwKSAhPSAwKSB7Ci0gICAgICAgICAgICAvLyBUaGUgaGlnaCAyNCBiaXRzIGFyZSByZXNlcnZlZCBhbmQgbXVzdCBiZSAwLgotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIG1TYW1wbGVTaXplRmllbGRTaXplID0gbURlZmF1bHRTYW1wbGVTaXplICYgMHhmZjsKLSAgICAgICAgbURlZmF1bHRTYW1wbGVTaXplID0gMDsKLQotICAgICAgICBpZiAobVNhbXBsZVNpemVGaWVsZFNpemUgIT0gNCAmJiBtU2FtcGxlU2l6ZUZpZWxkU2l6ZSAhPSA4Ci0gICAgICAgICAgICAmJiBtU2FtcGxlU2l6ZUZpZWxkU2l6ZSAhPSAxNikgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkYXRhX3NpemUgPCAxMiArIChtTnVtU2FtcGxlU2l6ZXMgKiBtU2FtcGxlU2l6ZUZpZWxkU2l6ZSArIDQpIC8gOCkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU2FtcGxlVGFibGU6OnNldFRpbWVUb1NhbXBsZVBhcmFtcygKLSAgICAgICAgb2ZmNjRfdCBkYXRhX29mZnNldCwgc2l6ZV90IGRhdGFfc2l6ZSkgewotICAgIGlmIChtSGFzVGltZVRvU2FtcGxlIHx8IGRhdGFfc2l6ZSA8IDgpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICB1aW50OF90IGhlYWRlcls4XTsKLSAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKLSAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkgPCAoc3NpemVfdClzaXplb2YoaGVhZGVyKSkgewotICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgfQotCi0gICAgaWYgKFUzMl9BVChoZWFkZXIpICE9IDApIHsKLSAgICAgICAgLy8gRXhwZWN0ZWQgdmVyc2lvbiA9IDAsIGZsYWdzID0gMC4KLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBtVGltZVRvU2FtcGxlQ291bnQgPSBVMzJfQVQoJmhlYWRlcls0XSk7Ci0gICAgaWYgKG1UaW1lVG9TYW1wbGVDb3VudCA+IFVJTlQzMl9NQVggLyAoMiAqIHNpemVvZih1aW50MzJfdCkpKSB7Ci0gICAgICAgIC8vIENob29zZSB0aGlzIGJvdW5kIGJlY2F1c2UKLSAgICAgICAgLy8gMSkgMiAqIHNpemVvZih1aW50MzJfdCkgaXMgdGhlIGFtb3VudCBvZiBtZW1vcnkgbmVlZGVkIGZvciBvbmUKLSAgICAgICAgLy8gICAgdGltZS10by1zYW1wbGUgZW50cnkgaW4gdGhlIHRpbWUtdG8tc2FtcGxlIHRhYmxlLgotICAgICAgICAvLyAyKSBtVGltZVRvU2FtcGxlQ291bnQgaXMgdGhlIG51bWJlciBvZiBlbnRyaWVzIG9mIHRoZSB0aW1lLXRvLXNhbXBsZQotICAgICAgICAvLyAgICB0YWJsZS4KLSAgICAgICAgLy8gMykgV2UgaG9wZSB0aGF0IHRoZSB0YWJsZSBzaXplIGRvZXMgbm90IGV4Y2VlZCBVSU5UMzJfTUFYLgotICAgICAgICBBTE9HRSgiVGltZS10by1zYW1wbGUgdGFibGUgc2l6ZSB0b28gbGFyZ2UuIik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7Ci0gICAgfQotCi0gICAgLy8gTm90ZTogQXQgdGhpcyBwb2ludCwgd2Uga25vdyB0aGF0IG1UaW1lVG9TYW1wbGVDb3VudCAqIDIgd2lsbCBub3QKLSAgICAvLyBvdmVyZmxvdyBiZWNhdXNlIG9mIHRoZSBhYm92ZSBjb25kaXRpb24uCi0KLSAgICB1aW50NjRfdCBhbGxvY1NpemUgPSAodWludDY0X3QpbVRpbWVUb1NhbXBsZUNvdW50ICogMiAqIHNpemVvZih1aW50MzJfdCk7Ci0gICAgbVRvdGFsU2l6ZSArPSBhbGxvY1NpemU7Ci0gICAgaWYgKG1Ub3RhbFNpemUgPiBrTWF4VG90YWxTaXplKSB7Ci0gICAgICAgIEFMT0dFKCJUaW1lLXRvLXNhbXBsZSB0YWJsZSBzaXplIHdvdWxkIG1ha2Ugc2FtcGxlIHRhYmxlIHRvbyBsYXJnZS5cbiIKLSAgICAgICAgICAgICAgIiAgICBSZXF1ZXN0ZWQgdGltZS10by1zYW1wbGUgdGFibGUgc2l6ZSA9ICVsbHVcbiIKLSAgICAgICAgICAgICAgIiAgICBFdmVudHVhbCBzYW1wbGUgdGFibGUgc2l6ZSA+PSAlbGx1XG4iCi0gICAgICAgICAgICAgICIgICAgQWxsb3dlZCBzYW1wbGUgdGFibGUgc2l6ZSA9ICVsbHVcbiIsCi0gICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYWxsb2NTaXplLAotICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKW1Ub3RhbFNpemUsCi0gICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpa01heFRvdGFsU2l6ZSk7Ci0gICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7Ci0gICAgfQotCi0gICAgbVRpbWVUb1NhbXBsZSA9IG5ldyAoc3RkOjpub3Rocm93KSB1aW50MzJfdFttVGltZVRvU2FtcGxlQ291bnQgKiAyXTsKLSAgICBpZiAoIW1UaW1lVG9TYW1wbGUpIHsKLSAgICAgICAgQUxPR0UoIkNhbm5vdCBhbGxvY2F0ZSB0aW1lLXRvLXNhbXBsZSB0YWJsZSB3aXRoICVsbHUgZW50cmllcy4iLAotICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbVRpbWVUb1NhbXBsZUNvdW50KTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKLSAgICB9Ci0KLSAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChkYXRhX29mZnNldCArIDgsIG1UaW1lVG9TYW1wbGUsCi0gICAgICAgICAgICAoc2l6ZV90KWFsbG9jU2l6ZSkgPCAoc3NpemVfdClhbGxvY1NpemUpIHsKLSAgICAgICAgQUxPR0UoIkluY29tcGxldGUgZGF0YSByZWFkIGZvciB0aW1lLXRvLXNhbXBsZSB0YWJsZS4iKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRpbWVUb1NhbXBsZUNvdW50ICogMjsgKytpKSB7Ci0gICAgICAgIG1UaW1lVG9TYW1wbGVbaV0gPSBudG9obChtVGltZVRvU2FtcGxlW2ldKTsKLSAgICB9Ci0KLSAgICBtSGFzVGltZVRvU2FtcGxlID0gdHJ1ZTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8vIE5PVEU6IHBlciAxNDk5Ni0xMiwgdmVyc2lvbiAwIGN0dHMgY29udGFpbnMgdW5zaWduZWQgdmFsdWVzLCB3aGlsZSB2ZXJzaW9uIDEKLS8vIGNvbnRhaW5zIHNpZ25lZCB2YWx1ZXMsIGhvd2V2ZXIgc29tZSBzb2Z0d2FyZSBjcmVhdGVzIHZlcnNpb24gMCBmaWxlcyB0aGF0Ci0vLyBjb250YWluIHNpZ25lZCB2YWx1ZXMsIHNvIHdlJ3JlIGFsd2F5cyB0cmVhdGluZyB0aGUgdmFsdWVzIGFzIHNpZ25lZCwKLS8vIHJlZ2FyZGxlc3Mgb2YgdmVyc2lvbi4KLXN0YXR1c190IFNhbXBsZVRhYmxlOjpzZXRDb21wb3NpdGlvblRpbWVUb1NhbXBsZVBhcmFtcygKLSAgICAgICAgb2ZmNjRfdCBkYXRhX29mZnNldCwgc2l6ZV90IGRhdGFfc2l6ZSkgewotICAgIEFMT0dJKCJUaGVyZSBhcmUgcmVvcmRlcmVkIGZyYW1lcyBwcmVzZW50LiIpOwotCi0gICAgaWYgKG1Db21wb3NpdGlvblRpbWVEZWx0YUVudHJpZXMgIT0gTlVMTCB8fCBkYXRhX3NpemUgPCA4KSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgdWludDhfdCBoZWFkZXJbOF07Ci0gICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCi0gICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpCi0gICAgICAgICAgICA8IChzc2l6ZV90KXNpemVvZihoZWFkZXIpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBmbGFncyA9IFUzMl9BVChoZWFkZXIpOwotICAgIHVpbnQzMl90IHZlcnNpb24gPSBmbGFncyA+PiAyNDsKLSAgICBmbGFncyAmPSAweGZmZmZmZjsKLQotICAgIGlmICgodmVyc2lvbiAhPSAwICYmIHZlcnNpb24gIT0gMSkgfHwgZmxhZ3MgIT0gMCkgewotICAgICAgICAvLyBFeHBlY3RlZCB2ZXJzaW9uID0gMCBvciAxLCBmbGFncyA9IDAuCi0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgc2l6ZV90IG51bUVudHJpZXMgPSBVMzJfQVQoJmhlYWRlcls0XSk7Ci0KLSAgICBpZiAoKChTSVpFX01BWCAvIDgpIC0gMSA8IG51bUVudHJpZXMpIHx8IChkYXRhX3NpemUgIT0gKG51bUVudHJpZXMgKyAxKSAqIDgpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgbU51bUNvbXBvc2l0aW9uVGltZURlbHRhRW50cmllcyA9IG51bUVudHJpZXM7Ci0gICAgdWludDY0X3QgYWxsb2NTaXplID0gKHVpbnQ2NF90KW51bUVudHJpZXMgKiAyICogc2l6ZW9mKGludDMyX3QpOwotICAgIGlmIChhbGxvY1NpemUgPiBrTWF4VG90YWxTaXplKSB7Ci0gICAgICAgIEFMT0dFKCJDb21wb3NpdGlvbi10aW1lLXRvLXNhbXBsZSB0YWJsZSBzaXplIHRvbyBsYXJnZS4iKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKLSAgICB9Ci0KLSAgICBtVG90YWxTaXplICs9IGFsbG9jU2l6ZTsKLSAgICBpZiAobVRvdGFsU2l6ZSA+IGtNYXhUb3RhbFNpemUpIHsKLSAgICAgICAgQUxPR0UoIkNvbXBvc2l0aW9uLXRpbWUtdG8tc2FtcGxlIHRhYmxlIHdvdWxkIG1ha2Ugc2FtcGxlIHRhYmxlIHRvbyBsYXJnZS5cbiIKLSAgICAgICAgICAgICAgIiAgICBSZXF1ZXN0ZWQgY29tcG9zaXRpb24tdGltZS10by1zYW1wbGUgdGFibGUgc2l6ZSA9ICVsbHVcbiIKLSAgICAgICAgICAgICAgIiAgICBFdmVudHVhbCBzYW1wbGUgdGFibGUgc2l6ZSA+PSAlbGx1XG4iCi0gICAgICAgICAgICAgICIgICAgQWxsb3dlZCBzYW1wbGUgdGFibGUgc2l6ZSA9ICVsbHVcbiIsCi0gICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYWxsb2NTaXplLAotICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKW1Ub3RhbFNpemUsCi0gICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpa01heFRvdGFsU2l6ZSk7Ci0gICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7Ci0gICAgfQotCi0gICAgbUNvbXBvc2l0aW9uVGltZURlbHRhRW50cmllcyA9IG5ldyAoc3RkOjpub3Rocm93KSBpbnQzMl90WzIgKiBudW1FbnRyaWVzXTsKLSAgICBpZiAoIW1Db21wb3NpdGlvblRpbWVEZWx0YUVudHJpZXMpIHsKLSAgICAgICAgQUxPR0UoIkNhbm5vdCBhbGxvY2F0ZSBjb21wb3NpdGlvbi10aW1lLXRvLXNhbXBsZSB0YWJsZSB3aXRoICVsbHUgIgotICAgICAgICAgICAgICAgICJlbnRyaWVzLiIsICh1bnNpZ25lZCBsb25nIGxvbmcpbnVtRW50cmllcyk7Ci0gICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7Ci0gICAgfQotCi0gICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQgKyA4LCBtQ29tcG9zaXRpb25UaW1lRGVsdGFFbnRyaWVzLAotICAgICAgICAgICAgKHNpemVfdClhbGxvY1NpemUpIDwgKHNzaXplX3QpYWxsb2NTaXplKSB7Ci0gICAgICAgIGRlbGV0ZVtdIG1Db21wb3NpdGlvblRpbWVEZWx0YUVudHJpZXM7Ci0gICAgICAgIG1Db21wb3NpdGlvblRpbWVEZWx0YUVudHJpZXMgPSBOVUxMOwotCi0gICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDIgKiBudW1FbnRyaWVzOyArK2kpIHsKLSAgICAgICAgbUNvbXBvc2l0aW9uVGltZURlbHRhRW50cmllc1tpXSA9IG50b2hsKG1Db21wb3NpdGlvblRpbWVEZWx0YUVudHJpZXNbaV0pOwotICAgIH0KLQotICAgIG1Db21wb3NpdGlvbkRlbHRhTG9va3VwLT5zZXRFbnRyaWVzKAotICAgICAgICAgICAgbUNvbXBvc2l0aW9uVGltZURlbHRhRW50cmllcywgbU51bUNvbXBvc2l0aW9uVGltZURlbHRhRW50cmllcyk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFNhbXBsZVRhYmxlOjpzZXRTeW5jU2FtcGxlUGFyYW1zKG9mZjY0X3QgZGF0YV9vZmZzZXQsIHNpemVfdCBkYXRhX3NpemUpIHsKLSAgICBpZiAobVN5bmNTYW1wbGVPZmZzZXQgPj0gMCB8fCBkYXRhX3NpemUgPCA4KSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgdWludDhfdCBoZWFkZXJbOF07Ci0gICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCi0gICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpIDwgKHNzaXplX3Qpc2l6ZW9mKGhlYWRlcikpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgIH0KLQotICAgIGlmIChVMzJfQVQoaGVhZGVyKSAhPSAwKSB7Ci0gICAgICAgIC8vIEV4cGVjdGVkIHZlcnNpb24gPSAwLCBmbGFncyA9IDAuCi0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgdWludDMyX3QgbnVtU3luY1NhbXBsZXMgPSBVMzJfQVQoJmhlYWRlcls0XSk7Ci0KLSAgICBpZiAobnVtU3luY1NhbXBsZXMgPCAyKSB7Ci0gICAgICAgIEFMT0dWKCJUYWJsZSBvZiBzeW5jIHNhbXBsZXMgaXMgZW1wdHkgb3IgaGFzIG9ubHkgYSBzaW5nbGUgZW50cnkhIik7Ci0gICAgfQotCi0gICAgdWludDY0X3QgYWxsb2NTaXplID0gKHVpbnQ2NF90KW51bVN5bmNTYW1wbGVzICogc2l6ZW9mKHVpbnQzMl90KTsKLSAgICBpZiAoYWxsb2NTaXplID4ga01heFRvdGFsU2l6ZSkgewotICAgICAgICBBTE9HRSgiU3luYyBzYW1wbGUgdGFibGUgc2l6ZSB0b28gbGFyZ2UuIik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7Ci0gICAgfQotCi0gICAgbVRvdGFsU2l6ZSArPSBhbGxvY1NpemU7Ci0gICAgaWYgKG1Ub3RhbFNpemUgPiBrTWF4VG90YWxTaXplKSB7Ci0gICAgICAgIEFMT0dFKCJTeW5jIHNhbXBsZSB0YWJsZSBzaXplIHdvdWxkIG1ha2Ugc2FtcGxlIHRhYmxlIHRvbyBsYXJnZS5cbiIKLSAgICAgICAgICAgICAgIiAgICBSZXF1ZXN0ZWQgc3luYyBzYW1wbGUgdGFibGUgc2l6ZSA9ICVsbHVcbiIKLSAgICAgICAgICAgICAgIiAgICBFdmVudHVhbCBzYW1wbGUgdGFibGUgc2l6ZSA+PSAlbGx1XG4iCi0gICAgICAgICAgICAgICIgICAgQWxsb3dlZCBzYW1wbGUgdGFibGUgc2l6ZSA9ICVsbHVcbiIsCi0gICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYWxsb2NTaXplLAotICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKW1Ub3RhbFNpemUsCi0gICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpa01heFRvdGFsU2l6ZSk7Ci0gICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7Ci0gICAgfQotCi0gICAgbVN5bmNTYW1wbGVzID0gbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQzMl90W251bVN5bmNTYW1wbGVzXTsKLSAgICBpZiAoIW1TeW5jU2FtcGxlcykgewotICAgICAgICBBTE9HRSgiQ2Fubm90IGFsbG9jYXRlIHN5bmMgc2FtcGxlIHRhYmxlIHdpdGggJWxsdSBlbnRyaWVzLiIsCi0gICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyludW1TeW5jU2FtcGxlcyk7Ci0gICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7Ci0gICAgfQotCi0gICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQgKyA4LCBtU3luY1NhbXBsZXMsCi0gICAgICAgICAgICAoc2l6ZV90KWFsbG9jU2l6ZSkgIT0gKHNzaXplX3QpYWxsb2NTaXplKSB7Ci0gICAgICAgIGRlbGV0ZVtdIG1TeW5jU2FtcGxlczsKLSAgICAgICAgbVN5bmNTYW1wbGVzID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU3luY1NhbXBsZXM7ICsraSkgewotICAgICAgICBpZiAobVN5bmNTYW1wbGVzW2ldID09IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJiLzMyNDIzODYyLCB1bmV4cGVjdGVkIHplcm8gdmFsdWUgaW4gc3RzcyIpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgbVN5bmNTYW1wbGVzW2ldID0gbnRvaGwobVN5bmNTYW1wbGVzW2ldKSAtIDE7Ci0gICAgfQotCi0gICAgbVN5bmNTYW1wbGVPZmZzZXQgPSBkYXRhX29mZnNldDsKLSAgICBtTnVtU3luY1NhbXBsZXMgPSBudW1TeW5jU2FtcGxlczsKLQotICAgIHJldHVybiBPSzsKLX0KLQotdWludDMyX3QgU2FtcGxlVGFibGU6OmNvdW50Q2h1bmtPZmZzZXRzKCkgY29uc3QgewotICAgIHJldHVybiBtTnVtQ2h1bmtPZmZzZXRzOwotfQotCi11aW50MzJfdCBTYW1wbGVUYWJsZTo6Y291bnRTYW1wbGVzKCkgY29uc3QgewotICAgIHJldHVybiBtTnVtU2FtcGxlU2l6ZXM7Ci19Ci0KLXN0YXR1c190IFNhbXBsZVRhYmxlOjpnZXRNYXhTYW1wbGVTaXplKHNpemVfdCAqbWF4X3NpemUpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgKm1heF9zaXplID0gMDsKLQotICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtTnVtU2FtcGxlU2l6ZXM7ICsraSkgewotICAgICAgICBzaXplX3Qgc2FtcGxlX3NpemU7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IGdldFNhbXBsZVNpemVfbChpLCAmc2FtcGxlX3NpemUpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2FtcGxlX3NpemUgPiAqbWF4X3NpemUpIHsKLSAgICAgICAgICAgICptYXhfc2l6ZSA9IHNhbXBsZV9zaXplOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi11aW50MzJfdCBhYnNfZGlmZmVyZW5jZSh1aW50MzJfdCB0aW1lMSwgdWludDMyX3QgdGltZTIpIHsKLSAgICByZXR1cm4gdGltZTEgPiB0aW1lMiA/IHRpbWUxIC0gdGltZTIgOiB0aW1lMiAtIHRpbWUxOwotfQotCi0vLyBzdGF0aWMKLWludCBTYW1wbGVUYWJsZTo6Q29tcGFyZUluY3JlYXNpbmdUaW1lKGNvbnN0IHZvaWQgKl9hLCBjb25zdCB2b2lkICpfYikgewotICAgIGNvbnN0IFNhbXBsZVRpbWVFbnRyeSAqYSA9IChjb25zdCBTYW1wbGVUaW1lRW50cnkgKilfYTsKLSAgICBjb25zdCBTYW1wbGVUaW1lRW50cnkgKmIgPSAoY29uc3QgU2FtcGxlVGltZUVudHJ5ICopX2I7Ci0KLSAgICBpZiAoYS0+bUNvbXBvc2l0aW9uVGltZSA8IGItPm1Db21wb3NpdGlvblRpbWUpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0gZWxzZSBpZiAoYS0+bUNvbXBvc2l0aW9uVGltZSA+IGItPm1Db21wb3NpdGlvblRpbWUpIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgU2FtcGxlVGFibGU6OmJ1aWxkU2FtcGxlRW50cmllc1RhYmxlKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobVNhbXBsZVRpbWVFbnRyaWVzICE9IE5VTEwgfHwgbU51bVNhbXBsZVNpemVzID09IDApIHsKLSAgICAgICAgaWYgKG1OdW1TYW1wbGVTaXplcyA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiYi8yMzI0NzA1NSwgbU51bVNhbXBsZVNpemVzKCV1KSIsIG1OdW1TYW1wbGVTaXplcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1Ub3RhbFNpemUgKz0gKHVpbnQ2NF90KW1OdW1TYW1wbGVTaXplcyAqIHNpemVvZihTYW1wbGVUaW1lRW50cnkpOwotICAgIGlmIChtVG90YWxTaXplID4ga01heFRvdGFsU2l6ZSkgewotICAgICAgICBBTE9HRSgiU2FtcGxlIGVudHJ5IHRhYmxlIHNpemUgd291bGQgbWFrZSBzYW1wbGUgdGFibGUgdG9vIGxhcmdlLlxuIgotICAgICAgICAgICAgICAiICAgIFJlcXVlc3RlZCBzYW1wbGUgZW50cnkgdGFibGUgc2l6ZSA9ICVsbHVcbiIKLSAgICAgICAgICAgICAgIiAgICBFdmVudHVhbCBzYW1wbGUgdGFibGUgc2l6ZSA+PSAlbGx1XG4iCi0gICAgICAgICAgICAgICIgICAgQWxsb3dlZCBzYW1wbGUgdGFibGUgc2l6ZSA9ICVsbHVcbiIsCi0gICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbU51bVNhbXBsZVNpemVzICogc2l6ZW9mKFNhbXBsZVRpbWVFbnRyeSksCi0gICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbVRvdGFsU2l6ZSwKLSAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylrTWF4VG90YWxTaXplKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1TYW1wbGVUaW1lRW50cmllcyA9IG5ldyAoc3RkOjpub3Rocm93KSBTYW1wbGVUaW1lRW50cnlbbU51bVNhbXBsZVNpemVzXTsKLSAgICBpZiAoIW1TYW1wbGVUaW1lRW50cmllcykgewotICAgICAgICBBTE9HRSgiQ2Fubm90IGFsbG9jYXRlIHNhbXBsZSBlbnRyeSB0YWJsZSB3aXRoICVsbHUgZW50cmllcy4iLAotICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbU51bVNhbXBsZVNpemVzKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHVpbnQzMl90IHNhbXBsZUluZGV4ID0gMDsKLSAgICB1aW50MzJfdCBzYW1wbGVUaW1lID0gMDsKLQotICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtVGltZVRvU2FtcGxlQ291bnQ7ICsraSkgewotICAgICAgICB1aW50MzJfdCBuID0gbVRpbWVUb1NhbXBsZVsyICogaV07Ci0gICAgICAgIHVpbnQzMl90IGRlbHRhID0gbVRpbWVUb1NhbXBsZVsyICogaSArIDFdOwotCi0gICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBuOyArK2opIHsKLSAgICAgICAgICAgIGlmIChzYW1wbGVJbmRleCA8IG1OdW1TYW1wbGVTaXplcykgewotICAgICAgICAgICAgICAgIC8vIFRlY2huaWNhbGx5IHRoaXMgc2hvdWxkIGFsd2F5cyBiZSB0aGUgY2FzZSBpZiB0aGUgZmlsZQotICAgICAgICAgICAgICAgIC8vIGlzIHdlbGwtZm9ybWVkLCBidXQgeW91IGtub3cuLi4gdGhlcmUncyAoZ2FzcCkgbWFsZm9ybWVkCi0gICAgICAgICAgICAgICAgLy8gY29udGVudCBvdXQgdGhlcmUuCi0KLSAgICAgICAgICAgICAgICBtU2FtcGxlVGltZUVudHJpZXNbc2FtcGxlSW5kZXhdLm1TYW1wbGVJbmRleCA9IHNhbXBsZUluZGV4OwotCi0gICAgICAgICAgICAgICAgaW50MzJfdCBjb21wVGltZURlbHRhID0KLSAgICAgICAgICAgICAgICAgICAgbUNvbXBvc2l0aW9uRGVsdGFMb29rdXAtPmdldENvbXBvc2l0aW9uVGltZU9mZnNldCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVJbmRleCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoKGNvbXBUaW1lRGVsdGEgPCAwICYmIHNhbXBsZVRpbWUgPAotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbXBUaW1lRGVsdGEgPT0gSU5UMzJfTUlOID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzJfTUFYIDogdWludDMyX3QoLWNvbXBUaW1lRGVsdGEpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IChjb21wVGltZURlbHRhID4gMCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lID4gVUlOVDMyX01BWCAtIGNvbXBUaW1lRGVsdGEpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCIldSArICVkIHdvdWxkIG92ZXJmbG93LCBjbGFtcGluZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSwgY29tcFRpbWVEZWx0YSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb21wVGltZURlbHRhIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lID0gVUlOVDMyX01BWDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjb21wVGltZURlbHRhID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtU2FtcGxlVGltZUVudHJpZXNbc2FtcGxlSW5kZXhdLm1Db21wb3NpdGlvblRpbWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgY29tcFRpbWVEZWx0YSA+IDAgPyBzYW1wbGVUaW1lICsgY29tcFRpbWVEZWx0YToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSAtICgtY29tcFRpbWVEZWx0YSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICsrc2FtcGxlSW5kZXg7Ci0gICAgICAgICAgICBpZiAoc2FtcGxlVGltZSA+IFVJTlQzMl9NQVggLSBkZWx0YSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCIldSArICV1IHdvdWxkIG92ZXJmbG93LCBjbGFtcGluZyIsCi0gICAgICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUsIGRlbHRhKTsKLSAgICAgICAgICAgICAgICBzYW1wbGVUaW1lID0gVUlOVDMyX01BWDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2FtcGxlVGltZSArPSBkZWx0YTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHFzb3J0KG1TYW1wbGVUaW1lRW50cmllcywgbU51bVNhbXBsZVNpemVzLCBzaXplb2YoU2FtcGxlVGltZUVudHJ5KSwKLSAgICAgICAgICBDb21wYXJlSW5jcmVhc2luZ1RpbWUpOwotfQotCi1zdGF0dXNfdCBTYW1wbGVUYWJsZTo6ZmluZFNhbXBsZUF0VGltZSgKLSAgICAgICAgdWludDY0X3QgcmVxX3RpbWUsIHVpbnQ2NF90IHNjYWxlX251bSwgdWludDY0X3Qgc2NhbGVfZGVuLAotICAgICAgICB1aW50MzJfdCAqc2FtcGxlX2luZGV4LCB1aW50MzJfdCBmbGFncykgewotICAgIGJ1aWxkU2FtcGxlRW50cmllc1RhYmxlKCk7Ci0KLSAgICBpZiAobVNhbXBsZVRpbWVFbnRyaWVzID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBsZWZ0ID0gMDsKLSAgICB1aW50MzJfdCByaWdodF9wbHVzX29uZSA9IG1OdW1TYW1wbGVTaXplczsKLSAgICB3aGlsZSAobGVmdCA8IHJpZ2h0X3BsdXNfb25lKSB7Ci0gICAgICAgIHVpbnQzMl90IGNlbnRlciA9IGxlZnQgKyAocmlnaHRfcGx1c19vbmUgLSBsZWZ0KSAvIDI7Ci0gICAgICAgIHVpbnQ2NF90IGNlbnRlclRpbWUgPQotICAgICAgICAgICAgZ2V0U2FtcGxlVGltZShjZW50ZXIsIHNjYWxlX251bSwgc2NhbGVfZGVuKTsKLQotICAgICAgICBpZiAocmVxX3RpbWUgPCBjZW50ZXJUaW1lKSB7Ci0gICAgICAgICAgICByaWdodF9wbHVzX29uZSA9IGNlbnRlcjsKLSAgICAgICAgfSBlbHNlIGlmIChyZXFfdGltZSA+IGNlbnRlclRpbWUpIHsKLSAgICAgICAgICAgIGxlZnQgPSBjZW50ZXIgKyAxOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKnNhbXBsZV9pbmRleCA9IG1TYW1wbGVUaW1lRW50cmllc1tjZW50ZXJdLm1TYW1wbGVJbmRleDsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHVpbnQzMl90IGNsb3Nlc3RJbmRleCA9IGxlZnQ7Ci0KLSAgICBpZiAoY2xvc2VzdEluZGV4ID09IG1OdW1TYW1wbGVTaXplcykgewotICAgICAgICBpZiAoZmxhZ3MgPT0ga0ZsYWdBZnRlcikgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKLSAgICAgICAgfQotICAgICAgICBmbGFncyA9IGtGbGFnQmVmb3JlOwotICAgIH0gZWxzZSBpZiAoY2xvc2VzdEluZGV4ID09IDApIHsKLSAgICAgICAgaWYgKGZsYWdzID09IGtGbGFnQmVmb3JlKSB7Ci0gICAgICAgICAgICAvLyBub3JtYWxseSB3ZSBzaG91bGQgcmV0dXJuIG91dCBvZiByYW5nZSwgYnV0IHRoYXQgaXMKLSAgICAgICAgICAgIC8vIHRyZWF0ZWQgYXMgZW5kLW9mLXN0cmVhbS4gIGluc3RlYWQgcmV0dXJuIGZpcnN0IHNhbXBsZQotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7Ci0gICAgICAgIH0KLSAgICAgICAgZmxhZ3MgPSBrRmxhZ0FmdGVyOwotICAgIH0KLQotICAgIHN3aXRjaCAoZmxhZ3MpIHsKLSAgICAgICAgY2FzZSBrRmxhZ0JlZm9yZToKLSAgICAgICAgewotICAgICAgICAgICAgLS1jbG9zZXN0SW5kZXg7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga0ZsYWdBZnRlcjoKLSAgICAgICAgewotICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICBDSEVDSyhmbGFncyA9PSBrRmxhZ0Nsb3Nlc3QpOwotICAgICAgICAgICAgLy8gcGljayBjbG9zZXN0IGJhc2VkIG9uIHRpbWVzdGFtcC4gdXNlIGFic19kaWZmZXJlbmNlIGZvciBzYWZldHkKLSAgICAgICAgICAgIGlmIChhYnNfZGlmZmVyZW5jZSgKLSAgICAgICAgICAgICAgICAgICAgZ2V0U2FtcGxlVGltZShjbG9zZXN0SW5kZXgsIHNjYWxlX251bSwgc2NhbGVfZGVuKSwgcmVxX3RpbWUpID4KLSAgICAgICAgICAgICAgICBhYnNfZGlmZmVyZW5jZSgKLSAgICAgICAgICAgICAgICAgICAgcmVxX3RpbWUsIGdldFNhbXBsZVRpbWUoY2xvc2VzdEluZGV4IC0gMSwgc2NhbGVfbnVtLCBzY2FsZV9kZW4pKSkgewotICAgICAgICAgICAgICAgIC0tY2xvc2VzdEluZGV4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAqc2FtcGxlX2luZGV4ID0gbVNhbXBsZVRpbWVFbnRyaWVzW2Nsb3Nlc3RJbmRleF0ubVNhbXBsZUluZGV4OwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU2FtcGxlVGFibGU6OmZpbmRTeW5jU2FtcGxlTmVhcigKLSAgICAgICAgdWludDMyX3Qgc3RhcnRfc2FtcGxlX2luZGV4LCB1aW50MzJfdCAqc2FtcGxlX2luZGV4LCB1aW50MzJfdCBmbGFncykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICAqc2FtcGxlX2luZGV4ID0gMDsKLQotICAgIGlmIChtU3luY1NhbXBsZU9mZnNldCA8IDApIHsKLSAgICAgICAgLy8gQWxsIHNhbXBsZXMgYXJlIHN5bmMtc2FtcGxlcy4KLSAgICAgICAgKnNhbXBsZV9pbmRleCA9IHN0YXJ0X3NhbXBsZV9pbmRleDsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIGlmIChtTnVtU3luY1NhbXBsZXMgPT0gMCkgewotICAgICAgICAqc2FtcGxlX2luZGV4ID0gMDsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIHVpbnQzMl90IGxlZnQgPSAwOwotICAgIHVpbnQzMl90IHJpZ2h0X3BsdXNfb25lID0gbU51bVN5bmNTYW1wbGVzOwotICAgIHdoaWxlIChsZWZ0IDwgcmlnaHRfcGx1c19vbmUpIHsKLSAgICAgICAgdWludDMyX3QgY2VudGVyID0gbGVmdCArIChyaWdodF9wbHVzX29uZSAtIGxlZnQpIC8gMjsKLSAgICAgICAgdWludDMyX3QgeCA9IG1TeW5jU2FtcGxlc1tjZW50ZXJdOwotCi0gICAgICAgIGlmIChzdGFydF9zYW1wbGVfaW5kZXggPCB4KSB7Ci0gICAgICAgICAgICByaWdodF9wbHVzX29uZSA9IGNlbnRlcjsKLSAgICAgICAgfSBlbHNlIGlmIChzdGFydF9zYW1wbGVfaW5kZXggPiB4KSB7Ci0gICAgICAgICAgICBsZWZ0ID0gY2VudGVyICsgMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICpzYW1wbGVfaW5kZXggPSB4OwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGxlZnQgPT0gbU51bVN5bmNTYW1wbGVzKSB7Ci0gICAgICAgIGlmIChmbGFncyA9PSBrRmxhZ0FmdGVyKSB7Ci0gICAgICAgICAgICBBTE9HRSgidHJpZWQgdG8gZmluZCBhIHN5bmMgZnJhbWUgYWZ0ZXIgdGhlIGxhc3Qgb25lOiAlZCIsIGxlZnQpOwotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKLSAgICAgICAgfQotICAgICAgICBmbGFncyA9IGtGbGFnQmVmb3JlOwotICAgIH0KLSAgICBlbHNlIGlmIChsZWZ0ID09IDApIHsKLSAgICAgICAgaWYgKGZsYWdzID09IGtGbGFnQmVmb3JlKSB7Ci0gICAgICAgICAgICBBTE9HRSgidHJpZWQgdG8gZmluZCBhIHN5bmMgZnJhbWUgYmVmb3JlIHRoZSBmaXJzdCBvbmU6ICVkIiwgbGVmdCk7Ci0KLSAgICAgICAgICAgIC8vIG5vcm1hbGx5IHdlIHNob3VsZCByZXR1cm4gb3V0IG9mIHJhbmdlLCBidXQgdGhhdCBpcwotICAgICAgICAgICAgLy8gdHJlYXRlZCBhcyBlbmQtb2Ytc3RyZWFtLiAgaW5zdGVhZCBzZWVrIHRvIGZpcnN0IHN5bmMKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOwotICAgICAgICB9Ci0gICAgICAgIGZsYWdzID0ga0ZsYWdBZnRlcjsKLSAgICB9Ci0KLSAgICAvLyBOb3cgc3NpW2xlZnQgLSAxXSA8KD0pIHN0YXJ0X3NhbXBsZV9pbmRleCA8PSBzc2lbbGVmdF0KLSAgICBzd2l0Y2ggKGZsYWdzKSB7Ci0gICAgICAgIGNhc2Uga0ZsYWdCZWZvcmU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIC0tbGVmdDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2Uga0ZsYWdBZnRlcjoKLSAgICAgICAgewotICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgewotICAgICAgICAgICAgLy8gdGhpcyByb3V0ZSBpcyBub3QgdXNlZCwgYnV0IGltcGxlbWVudCBpdCBub25ldGhlbGVzcwotICAgICAgICAgICAgQ0hFQ0soZmxhZ3MgPT0ga0ZsYWdDbG9zZXN0KTsKLQotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNhbXBsZUl0ZXJhdG9yLT5zZWVrVG8oc3RhcnRfc2FtcGxlX2luZGV4KTsKLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlX3RpbWUgPSBtU2FtcGxlSXRlcmF0b3ItPmdldFNhbXBsZVRpbWUoKTsKLQotICAgICAgICAgICAgZXJyID0gbVNhbXBsZUl0ZXJhdG9yLT5zZWVrVG8obVN5bmNTYW1wbGVzW2xlZnRdKTsKLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdWludDMyX3QgdXBwZXJfdGltZSA9IG1TYW1wbGVJdGVyYXRvci0+Z2V0U2FtcGxlVGltZSgpOwotCi0gICAgICAgICAgICBlcnIgPSBtU2FtcGxlSXRlcmF0b3ItPnNlZWtUbyhtU3luY1NhbXBsZXNbbGVmdCAtIDFdKTsKLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdWludDMyX3QgbG93ZXJfdGltZSA9IG1TYW1wbGVJdGVyYXRvci0+Z2V0U2FtcGxlVGltZSgpOwotCi0gICAgICAgICAgICAvLyB1c2UgYWJzX2RpZmZlcmVuY2UgZm9yIHNhZmV0eQotICAgICAgICAgICAgaWYgKGFic19kaWZmZXJlbmNlKHVwcGVyX3RpbWUsIHNhbXBsZV90aW1lKSA+Ci0gICAgICAgICAgICAgICAgYWJzX2RpZmZlcmVuY2Uoc2FtcGxlX3RpbWUsIGxvd2VyX3RpbWUpKSB7Ci0gICAgICAgICAgICAgICAgLS1sZWZ0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAqc2FtcGxlX2luZGV4ID0gbVN5bmNTYW1wbGVzW2xlZnRdOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU2FtcGxlVGFibGU6OmZpbmRUaHVtYm5haWxTYW1wbGUodWludDMyX3QgKnNhbXBsZV9pbmRleCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobVN5bmNTYW1wbGVPZmZzZXQgPCAwKSB7Ci0gICAgICAgIC8vIEFsbCBzYW1wbGVzIGFyZSBzeW5jLXNhbXBsZXMuCi0gICAgICAgICpzYW1wbGVfaW5kZXggPSAwOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgdWludDMyX3QgYmVzdFNhbXBsZUluZGV4ID0gMDsKLSAgICBzaXplX3QgbWF4U2FtcGxlU2l6ZSA9IDA7Ci0KLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhOdW1TeW5jU2FtcGxlc1RvU2NhbiA9IDIwOwotCi0gICAgLy8gQ29uc2lkZXIgdGhlIGZpcnN0IGtNYXhOdW1TeW5jU2FtcGxlc1RvU2NhbiBzeW5jIHNhbXBsZXMgYW5kCi0gICAgLy8gcGljayB0aGUgb25lIHdpdGggdGhlIGxhcmdlc3QgKGNvbXByZXNzZWQpIHNpemUgYXMgdGhlIHRodW1ibmFpbC4KLQotICAgIHNpemVfdCBudW1TYW1wbGVzVG9TY2FuID0gbU51bVN5bmNTYW1wbGVzOwotICAgIGlmIChudW1TYW1wbGVzVG9TY2FuID4ga01heE51bVN5bmNTYW1wbGVzVG9TY2FuKSB7Ci0gICAgICAgIG51bVNhbXBsZXNUb1NjYW4gPSBrTWF4TnVtU3luY1NhbXBsZXNUb1NjYW47Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TYW1wbGVzVG9TY2FuOyArK2kpIHsKLSAgICAgICAgdWludDMyX3QgeCA9IG1TeW5jU2FtcGxlc1tpXTsKLQotICAgICAgICAvLyBOb3cgeCBpcyBhIHNhbXBsZSBpbmRleC4KLSAgICAgICAgc2l6ZV90IHNhbXBsZVNpemU7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IGdldFNhbXBsZVNpemVfbCh4LCAmc2FtcGxlU2l6ZSk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaSA9PSAwIHx8IHNhbXBsZVNpemUgPiBtYXhTYW1wbGVTaXplKSB7Ci0gICAgICAgICAgICBiZXN0U2FtcGxlSW5kZXggPSB4OwotICAgICAgICAgICAgbWF4U2FtcGxlU2l6ZSA9IHNhbXBsZVNpemU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAqc2FtcGxlX2luZGV4ID0gYmVzdFNhbXBsZUluZGV4OwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTYW1wbGVUYWJsZTo6Z2V0U2FtcGxlU2l6ZV9sKAotICAgICAgICB1aW50MzJfdCBzYW1wbGVJbmRleCwgc2l6ZV90ICpzYW1wbGVTaXplKSB7Ci0gICAgcmV0dXJuIG1TYW1wbGVJdGVyYXRvci0+Z2V0U2FtcGxlU2l6ZURpcmVjdCgKLSAgICAgICAgICAgIHNhbXBsZUluZGV4LCBzYW1wbGVTaXplKTsKLX0KLQotc3RhdHVzX3QgU2FtcGxlVGFibGU6OmdldE1ldGFEYXRhRm9yU2FtcGxlKAotICAgICAgICB1aW50MzJfdCBzYW1wbGVJbmRleCwKLSAgICAgICAgb2ZmNjRfdCAqb2Zmc2V0LAotICAgICAgICBzaXplX3QgKnNpemUsCi0gICAgICAgIHVpbnQzMl90ICpjb21wb3NpdGlvblRpbWUsCi0gICAgICAgIGJvb2wgKmlzU3luY1NhbXBsZSwKLSAgICAgICAgdWludDMyX3QgKnNhbXBsZUR1cmF0aW9uKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIHN0YXR1c190IGVycjsKLSAgICBpZiAoKGVyciA9IG1TYW1wbGVJdGVyYXRvci0+c2Vla1RvKHNhbXBsZUluZGV4KSkgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiAob2Zmc2V0KSB7Ci0gICAgICAgICpvZmZzZXQgPSBtU2FtcGxlSXRlcmF0b3ItPmdldFNhbXBsZU9mZnNldCgpOwotICAgIH0KLQotICAgIGlmIChzaXplKSB7Ci0gICAgICAgICpzaXplID0gbVNhbXBsZUl0ZXJhdG9yLT5nZXRTYW1wbGVTaXplKCk7Ci0gICAgfQotCi0gICAgaWYgKGNvbXBvc2l0aW9uVGltZSkgewotICAgICAgICAqY29tcG9zaXRpb25UaW1lID0gbVNhbXBsZUl0ZXJhdG9yLT5nZXRTYW1wbGVUaW1lKCk7Ci0gICAgfQotCi0gICAgaWYgKGlzU3luY1NhbXBsZSkgewotICAgICAgICAqaXNTeW5jU2FtcGxlID0gZmFsc2U7Ci0gICAgICAgIGlmIChtU3luY1NhbXBsZU9mZnNldCA8IDApIHsKLSAgICAgICAgICAgIC8vIEV2ZXJ5IHNhbXBsZSBpcyBhIHN5bmMgc2FtcGxlLgotICAgICAgICAgICAgKmlzU3luY1NhbXBsZSA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzaXplX3QgaSA9IChtTGFzdFN5bmNTYW1wbGVJbmRleCA8IG1OdW1TeW5jU2FtcGxlcykKLSAgICAgICAgICAgICAgICAgICAgJiYgKG1TeW5jU2FtcGxlc1ttTGFzdFN5bmNTYW1wbGVJbmRleF0gPD0gc2FtcGxlSW5kZXgpCi0gICAgICAgICAgICAgICAgPyBtTGFzdFN5bmNTYW1wbGVJbmRleCA6IDA7Ci0KLSAgICAgICAgICAgIHdoaWxlIChpIDwgbU51bVN5bmNTYW1wbGVzICYmIG1TeW5jU2FtcGxlc1tpXSA8IHNhbXBsZUluZGV4KSB7Ci0gICAgICAgICAgICAgICAgKytpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaSA8IG1OdW1TeW5jU2FtcGxlcyAmJiBtU3luY1NhbXBsZXNbaV0gPT0gc2FtcGxlSW5kZXgpIHsKLSAgICAgICAgICAgICAgICAqaXNTeW5jU2FtcGxlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUxhc3RTeW5jU2FtcGxlSW5kZXggPSBpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHNhbXBsZUR1cmF0aW9uKSB7Ci0gICAgICAgICpzYW1wbGVEdXJhdGlvbiA9IG1TYW1wbGVJdGVyYXRvci0+Z2V0U2FtcGxlRHVyYXRpb24oKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLWludDMyX3QgU2FtcGxlVGFibGU6OmdldENvbXBvc2l0aW9uVGltZU9mZnNldCh1aW50MzJfdCBzYW1wbGVJbmRleCkgewotICAgIHJldHVybiBtQ29tcG9zaXRpb25EZWx0YUxvb2t1cC0+Z2V0Q29tcG9zaXRpb25UaW1lT2Zmc2V0KHNhbXBsZUluZGV4KTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NpbXBsZURlY29kaW5nU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NpbXBsZURlY29kaW5nU291cmNlLmNwcAppbmRleCA5MGI4NjAzLi40MDRjNTM3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TaW1wbGVEZWNvZGluZ1NvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2ltcGxlRGVjb2RpbmdTb3VyY2UuY3BwCkBAIC0xNCw2ICsxNCwxMCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJTaW1wbGVEZWNvZGluZ1NvdXJjZSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKwogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CkBAIC0zNiwxNCArNDAsMTQgQEAKIAogLy9zdGF0aWMKIHNwPFNpbXBsZURlY29kaW5nU291cmNlPiBTaW1wbGVEZWNvZGluZ1NvdXJjZTo6Q3JlYXRlKAotICAgICAgICBjb25zdCBzcDxJTWVkaWFTb3VyY2U+ICZzb3VyY2UsIHVpbnQzMl90IGZsYWdzKSB7CisgICAgICAgIGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlLCB1aW50MzJfdCBmbGFncykgewogICAgIHJldHVybiBTaW1wbGVEZWNvZGluZ1NvdXJjZTo6Q3JlYXRlKHNvdXJjZSwgZmxhZ3MsIG51bGxwdHIsIG51bGxwdHIpOwogfQogCiAvL3N0YXRpYwogc3A8U2ltcGxlRGVjb2RpbmdTb3VyY2U+IFNpbXBsZURlY29kaW5nU291cmNlOjpDcmVhdGUoCi0gICAgICAgIGNvbnN0IHNwPElNZWRpYVNvdXJjZT4gJnNvdXJjZSwgdWludDMyX3QgZmxhZ3MsIGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+ICZuYXRpdmVXaW5kb3csCi0gICAgICAgIGNvbnN0IGNoYXIgKmRlc2lyZWRDb2RlYykgeworICAgICAgICBjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSwgdWludDMyX3QgZmxhZ3MsIGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+ICZuYXRpdmVXaW5kb3csCisgICAgICAgIGNvbnN0IGNoYXIgKmRlc2lyZWRDb2RlYywgYm9vbCBza2lwTWVkaWFDb2RlY0xpc3QpIHsKICAgICBzcDxTdXJmYWNlPiBzdXJmYWNlID0gc3RhdGljX2Nhc3Q8U3VyZmFjZSo+KG5hdGl2ZVdpbmRvdy5nZXQoKSk7CiAgICAgY29uc3QgY2hhciAqbWltZSA9IE5VTEw7CiAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBzb3VyY2UtPmdldEZvcm1hdCgpOwpAQCAtNjMsNiArNjcsMzMgQEAKICAgICBsb29wZXItPnN0YXJ0KCk7CiAKICAgICBzcDxNZWRpYUNvZGVjPiBjb2RlYzsKKyAgICBhdXRvIGNvbmZpZ3VyZSA9IFs9XShjb25zdCBzcDxNZWRpYUNvZGVjPiAmY29kZWMsIGNvbnN0IEFTdHJpbmcgJmNvbXBvbmVudE5hbWUpCisgICAgICAgICAgICAtPiBzcDxTaW1wbGVEZWNvZGluZ1NvdXJjZT4geworICAgICAgICBpZiAoY29kZWMgIT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0koIlN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQgY29kZWMgJyVzJyIsIGNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGNvZGVjLT5jb25maWd1cmUoZm9ybWF0LCBzdXJmYWNlLCBOVUxMIC8qIGNyeXB0byAqLywgMCAvKiBmbGFncyAqLyk7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gb3V0Rm9ybWF0OworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIGVyciA9IGNvZGVjLT5nZXRPdXRwdXRGb3JtYXQoJm91dEZvcm1hdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVEZWNvZGluZ1NvdXJjZShjb2RlYywgc291cmNlLCBsb29wZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlICE9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTKSA9PSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0Rm9ybWF0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQUxPR0QoIkZhaWxlZCB0byBjb25maWd1cmUgY29kZWMgJyVzJyIsIGNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBjb2RlYy0+cmVsZWFzZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH07CisKKyAgICBpZiAoc2tpcE1lZGlhQ29kZWNMaXN0KSB7CisgICAgICAgIGNvZGVjID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lKGxvb3BlciwgZGVzaXJlZENvZGVjKTsKKyAgICAgICAgcmV0dXJuIGNvbmZpZ3VyZShjb2RlYywgZGVzaXJlZENvZGVjKTsKKyAgICB9CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1hdGNoaW5nQ29kZWNzLnNpemUoKTsgKytpKSB7CiAgICAgICAgIGNvbnN0IEFTdHJpbmcgJmNvbXBvbmVudE5hbWUgPSBtYXRjaGluZ0NvZGVjc1tpXTsKQEAgLTczLDIyICsxMDQsMTAgQEAKICAgICAgICAgQUxPR1YoIkF0dGVtcHRpbmcgdG8gYWxsb2NhdGUgY29kZWMgJyVzJyIsIGNvbXBvbmVudE5hbWUuY19zdHIoKSk7CiAKICAgICAgICAgY29kZWMgPSBNZWRpYUNvZGVjOjpDcmVhdGVCeUNvbXBvbmVudE5hbWUobG9vcGVyLCBjb21wb25lbnROYW1lKTsKLSAgICAgICAgaWYgKGNvZGVjICE9IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dJKCJTdWNjZXNzZnVsbHkgYWxsb2NhdGVkIGNvZGVjICclcyciLCBjb21wb25lbnROYW1lLmNfc3RyKCkpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBjb2RlYy0+Y29uZmlndXJlKGZvcm1hdCwgc3VyZmFjZSwgTlVMTCAvKiBjcnlwdG8gKi8sIDAgLyogZmxhZ3MgKi8pOwotICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgICAgIGVyciA9IGNvZGVjLT5nZXRPdXRwdXRGb3JtYXQoJmZvcm1hdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVEZWNvZGluZ1NvdXJjZShjb2RlYywgc291cmNlLCBsb29wZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlICE9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTKSA9PSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQUxPR0QoIkZhaWxlZCB0byBjb25maWd1cmUgY29kZWMgJyVzJyIsIGNvbXBvbmVudE5hbWUuY19zdHIoKSk7Ci0gICAgICAgICAgICBjb2RlYy0+cmVsZWFzZSgpOworICAgICAgICBzcDxTaW1wbGVEZWNvZGluZ1NvdXJjZT4gcmVzID0gY29uZmlndXJlKGNvZGVjLCBjb21wb25lbnROYW1lKTsKKyAgICAgICAgaWYgKHJlcyAhPSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgY29kZWMgPSBOVUxMOwogICAgICAgICB9CiAgICAgfQpAQCAtOTksNyArMTE4LDcgQEAKIH0KIAogU2ltcGxlRGVjb2RpbmdTb3VyY2U6OlNpbXBsZURlY29kaW5nU291cmNlKAotICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjPiAmY29kZWMsIGNvbnN0IHNwPElNZWRpYVNvdXJjZT4gJnNvdXJjZSwgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlciwKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlYz4gJmNvZGVjLCBjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSwgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlciwKICAgICAgICAgYm9vbCB1c2luZ1N1cmZhY2UsIGJvb2wgaXNWb3JiaXMsIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KQogICAgIDogbUNvZGVjKGNvZGVjKSwKICAgICAgIG1Tb3VyY2Uoc291cmNlKSwKQEAgLTE4MSw3ICsyMDAsNyBAQAogfQogCiBzdGF0dXNfdCBTaW1wbGVEZWNvZGluZ1NvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKICAgICAqYnVmZmVyID0gTlVMTDsKIAogICAgIE11dGV4ZWQ8UHJvdGVjdGVkU3RhdGU+OjpMb2NrZWQgbWUobVByb3RlY3RlZFN0YXRlKTsKQEAgLTIwMiw3ICsyMjEsNyBAQAogfQogCiBzdGF0dXNfdCBTaW1wbGVEZWNvZGluZ1NvdXJjZTo6ZG9SZWFkKAotICAgICAgICBNdXRleGVkPFByb3RlY3RlZFN0YXRlPjo6TG9ja2VkICZtZSwgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CisgICAgICAgIE11dGV4ZWQ8UHJvdGVjdGVkU3RhdGU+OjpMb2NrZWQgJm1lLCBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CiAgICAgLy8gfG1lfCBpcyBhbHdheXMgbG9ja2VkIG9uIGVudHJ5LCBidXQgaXMgYWxsb3dlZCB0byBiZSB1bmxvY2tlZCBvbiBleGl0CiAgICAgQ0hFQ0tfRVEobWUtPm1TdGF0ZSwgU1RBUlRFRCk7CiAKQEAgLTIxMiw3ICsyMzEsNyBAQAogICAgIHN0YXR1c190IHJlczsKIAogICAgIC8vIGZsdXNoIGNvZGVjIG9uIHNlZWsKLSAgICBJTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOworICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKICAgICBpZiAob3B0aW9ucyAhPSBOVUxMICYmIG9wdGlvbnMtPmdldFNlZWtUbygmb3V0X3B0cywgJm1vZGUpKSB7CiAgICAgICAgIG1lLT5tUXVldWVkSW5wdXRFT1MgPSBmYWxzZTsKICAgICAgICAgbWUtPm1Hb3RPdXRwdXRFT1MgPSBmYWxzZTsKQEAgLTI0OCw3ICsyNjcsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqaW5fYnVmOworICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICppbl9idWY7CiAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgICAgICAgIGluX2J1ZiA9IE5VTEw7CiAgICAgICAgICAgICAgICAgbWUudW5sb2NrKCk7CkBAIC0yOTAsNyArMzA5LDcgQEAKIAogICAgICAgICAgICAgaWYgKGluX2J1ZiAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBVcyA9IDA7Ci0gICAgICAgICAgICAgICAgQ0hFQ0soaW5fYnVmLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZXN0YW1wVXMpKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhpbl9idWYtPm1ldGFfZGF0YSgpLmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVzdGFtcFVzKSk7CiAgICAgICAgICAgICAgICAgaWYgKGluX2J1Zi0+cmFuZ2VfbGVuZ3RoKCkgKyAobUlzVm9yYmlzID8gNCA6IDApID4gaW5fYnVmZmVyLT5jYXBhY2l0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCInJXMnIHJlY2VpdmVkICV6dSBpbnB1dCBieXRlcyBmb3IgYnVmZmVyIG9mIHNpemUgJXp1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLApAQCAtMzAyLDcgKzMyMSw3IEBACiAKICAgICAgICAgICAgICAgICBpZiAobUlzVm9yYmlzKSB7CiAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtUGFnZVNhbXBsZXM7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaW5fYnVmLT5tZXRhX2RhdGEoKS0+ZmluZEludDMyKGtLZXlWYWxpZFNhbXBsZXMsICZudW1QYWdlU2FtcGxlcykpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpbl9idWYtPm1ldGFfZGF0YSgpLmZpbmRJbnQzMihrS2V5VmFsaWRTYW1wbGVzLCAmbnVtUGFnZVNhbXBsZXMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBudW1QYWdlU2FtcGxlcyA9IC0xOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIG1lbWNweShpbl9idWZmZXItPmJhc2UoKSArIGNwTGVuLCAmbnVtUGFnZVNhbXBsZXMsIHNpemVvZihudW1QYWdlU2FtcGxlcykpOwpAQCAtMzc0LDcgKzM5Myw3IEBACiAgICAgICAgICAgICAqYnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKG91dF9zaXplKTsKICAgICAgICAgICAgIENIRUNLX0xFKG91dF9idWZmZXItPnNpemUoKSwgKCpidWZmZXIpLT5zaXplKCkpOwogICAgICAgICAgICAgbWVtY3B5KCgqYnVmZmVyKS0+ZGF0YSgpLCBvdXRfYnVmZmVyLT5kYXRhKCksIG91dF9idWZmZXItPnNpemUoKSk7Ci0gICAgICAgICAgICAoKmJ1ZmZlciktPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgb3V0X3B0cyk7CisgICAgICAgICAgICAoKmJ1ZmZlciktPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCBvdXRfcHRzKTsKICAgICAgICAgICAgIG1Db2RlYy0+cmVsZWFzZU91dHB1dEJ1ZmZlcihvdXRfaXgpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBPSzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmNwcAppbmRleCA0ZmYyYmZlLi5lMDEwYjNlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuY3BwCkBAIC00MCw3ICs0MCw4IEBACiAgICAgICAgICIubXBlZyIsICIub2dnIiwgIi5taWQiLCAiLnNtZiIsICIuaW15IiwgIi53bWEiLCAiLmFhYyIsCiAgICAgICAgICIud2F2IiwgIi5hbXIiLCAiLm1pZGkiLCAiLnhtZiIsICIucnR0dGwiLCAiLnJ0eCIsICIub3RhIiwKICAgICAgICAgIi5ta3YiLCAiLm1rYSIsICIud2VibSIsICIudHMiLCAiLmZsIiwgIi5mbGFjIiwgIi5teG1mIiwKLSAgICAgICAgIi5hdmkiLCAiLm1wZWciLCAiLm1wZyIsICIuYXdiIiwgIi5tcGdhIiwgIi5tb3YiCisgICAgICAgICIuYXZpIiwgIi5tcGVnIiwgIi5tcGciLCAiLmF3YiIsICIubXBnYSIsICIubW92IiwKKyAgICAgICAgIi5tNHYiLCAiLm9nYSIKICAgICB9OwogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga051bVZhbGlkRXh0ZW5zaW9ucyA9CiAgICAgICAgIHNpemVvZihrVmFsaWRFeHRlbnNpb25zKSAvIHNpemVvZihrVmFsaWRFeHRlbnNpb25zWzBdKTsKQEAgLTYyLDYgKzYzLDExIEBACiAgICAgY2xpZW50LnNldExvY2FsZShsb2NhbGUoKSk7CiAgICAgY2xpZW50LmJlZ2luRmlsZSgpOwogICAgIE1lZGlhU2NhblJlc3VsdCByZXN1bHQgPSBwcm9jZXNzRmlsZUludGVybmFsKHBhdGgsIG1pbWVUeXBlLCBjbGllbnQpOworICAgIEFMT0dWKCJyZXN1bHQ6ICVkIiwgcmVzdWx0KTsKKyAgICBpZiAobWltZVR5cGUgPT0gTlVMTCAmJiByZXN1bHQgIT0gTUVESUFfU0NBTl9SRVNVTFRfT0spIHsKKyAgICAgICAgQUxPR1coIm1lZGlhIHNjYW4gZmFpbGVkIGZvciAlcyIsIHBhdGgpOworICAgICAgICBjbGllbnQuc2V0TWltZVR5cGUoImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOworICAgIH0KICAgICBjbGllbnQuZW5kRmlsZSgpOwogICAgIHJldHVybiByZXN1bHQ7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCmluZGV4IGU4YzNkZDMuLmU4MGVjM2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCkBAIC0yMCw1MiArMjAsMzQgQEAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KIAotI2luY2x1ZGUgImluY2x1ZGUvYXZjX3V0aWxzLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9GcmFtZURlY29kZXIuaCIKICNpbmNsdWRlICJpbmNsdWRlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuaCIKIAotI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNCdWZmZXIuaD4KLQogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NvbG9yQ29udmVydGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2VGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgotCiAjaW5jbHVkZSA8bWVkaWEvQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0YXRpYyBjb25zdCBpbnQ2NF90IGtCdWZmZXJUaW1lT3V0VXMgPSAzMDAwMGxsOyAvLyAzMCBtc2VjCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGtSZXRyeUNvdW50ID0gMjA7IC8vIG11c3QgYmUgPjAKLQogU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcjo6U3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcigpCiAgICAgOiBtUGFyc2VkTWV0YURhdGEoZmFsc2UpLAotICAgICAgbUFsYnVtQXJ0KE5VTEwpIHsKKyAgICAgIG1BbGJ1bUFydChOVUxMKSwKKyAgICAgIG1MYXN0SW1hZ2VJbmRleCgtMSkgewogICAgIEFMT0dWKCJTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyKCkiKTsKIH0KIAogU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcjo6flN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIoKSB7CiAgICAgQUxPR1YoIn5TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyKCkiKTsKICAgICBjbGVhck1ldGFkYXRhKCk7Ci0gICAgLy8gRXhwbGljaXRseSByZWxlYXNlIGV4dHJhY3RvciBiZWZvcmUgY29udGludWluZyB3aXRoIHRoZSBkZXN0cnVjdG9yLAotICAgIC8vIHNvbWUgZXh0cmFjdG9ycyBtaWdodCBuZWVkIHRvIGNhbGxiYWNrIHRvIGNsb3NlIG9mZiB0aGUgRGF0YVNvdXJjZQotICAgIC8vIGFuZCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSBpdCdzIHN0aWxsIHRoZXJlLgotICAgIGlmIChtRXh0cmFjdG9yICE9IE5VTEwpIHsKLSAgICAgICAgbUV4dHJhY3Rvci0+cmVsZWFzZSgpOwotICAgIH0KICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7CiAgICAgICAgIG1Tb3VyY2UtPmNsb3NlKCk7CiAgICAgfQpAQCAtNzgsMTQgKzYwLDE0IEBACiAgICAgQUxPR1YoInNldERhdGFTb3VyY2UoJXMpIiwgdXJpKTsKIAogICAgIGNsZWFyTWV0YWRhdGEoKTsKLSAgICBtU291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSShodHRwU2VydmljZSwgdXJpLCBoZWFkZXJzKTsKKyAgICBtU291cmNlID0gRGF0YVNvdXJjZUZhY3Rvcnk6OkNyZWF0ZUZyb21VUkkoaHR0cFNlcnZpY2UsIHVyaSwgaGVhZGVycyk7CiAKICAgICBpZiAobVNvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gY3JlYXRlIGRhdGEgc291cmNlIGZvciAnJXMnLiIsIHVyaSk7CiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KIAotICAgIG1FeHRyYWN0b3IgPSBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRlKG1Tb3VyY2UpOworICAgIG1FeHRyYWN0b3IgPSBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OkNyZWF0ZShtU291cmNlKTsKIAogICAgIGlmIChtRXh0cmFjdG9yID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBpbnN0YW50aWF0ZSBhbiBleHRyYWN0b3IgZm9yICclcycuIiwgdXJpKTsKQEAgLTExNSw3ICs5Nyw3IEBACiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCi0gICAgbUV4dHJhY3RvciA9IE1lZGlhRXh0cmFjdG9yOjpDcmVhdGUobVNvdXJjZSk7CisgICAgbUV4dHJhY3RvciA9IE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Q3JlYXRlKG1Tb3VyY2UpOwogCiAgICAgaWYgKG1FeHRyYWN0b3IgPT0gTlVMTCkgewogICAgICAgICBtU291cmNlLmNsZWFyKCk7CkBAIC0xMzIsNyArMTE0LDcgQEAKIAogICAgIGNsZWFyTWV0YWRhdGEoKTsKICAgICBtU291cmNlID0gc291cmNlOwotICAgIG1FeHRyYWN0b3IgPSBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRlKG1Tb3VyY2UsIG1pbWUpOworICAgIG1FeHRyYWN0b3IgPSBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OkNyZWF0ZShtU291cmNlLCBtaW1lKTsKIAogICAgIGlmIChtRXh0cmFjdG9yID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbnN0YW50aWF0ZSBhIE1lZGlhRXh0cmFjdG9yLiIpOwpAQCAtMTQzLDQ3NCArMTI1LDE1NSBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdGljIFZpZGVvRnJhbWUgKmFsbG9jVmlkZW9GcmFtZSgKLSAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZ0cmFja01ldGEsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LCBpbnQzMl90IGJwcCwgYm9vbCBtZXRhT25seSkgewotICAgIGludDMyX3Qgcm90YXRpb25BbmdsZTsKLSAgICBpZiAoIXRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlSb3RhdGlvbiwgJnJvdGF0aW9uQW5nbGUpKSB7Ci0gICAgICAgIHJvdGF0aW9uQW5nbGUgPSAwOyAgLy8gQnkgZGVmYXVsdCwgbm8gcm90YXRpb24KLSAgICB9CitzcDxJTWVtb3J5PiBTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyOjpnZXRJbWFnZUF0SW5kZXgoCisgICAgICAgIGludCBpbmRleCwgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5LCBib29sIHRodW1ibmFpbCkgeworICAgIEFMT0dWKCJnZXRJbWFnZUF0SW5kZXg6IGluZGV4KCVkKSBjb2xvckZvcm1hdCglZCkgbWV0YU9ubHkoJWQpIHRodW1ibmFpbCglZCkiLAorICAgICAgICAgICAgaW5kZXgsIGNvbG9yRm9ybWF0LCBtZXRhT25seSwgdGh1bWJuYWlsKTsKIAotICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgY29uc3Qgdm9pZCAqaWNjRGF0YTsKLSAgICBzaXplX3QgaWNjU2l6ZTsKLSAgICBpZiAoIXRyYWNrTWV0YS0+ZmluZERhdGEoa0tleUljY1Byb2ZpbGUsICZ0eXBlLCAmaWNjRGF0YSwgJmljY1NpemUpKXsKLSAgICAgICAgaWNjRGF0YSA9IE5VTEw7Ci0gICAgICAgIGljY1NpemUgPSAwOwotICAgIH0KLQotICAgIGludDMyX3Qgc2FyV2lkdGgsIHNhckhlaWdodDsKLSAgICBpbnQzMl90IGRpc3BsYXlXaWR0aCwgZGlzcGxheUhlaWdodDsKLSAgICBpZiAodHJhY2tNZXRhLT5maW5kSW50MzIoa0tleVNBUldpZHRoLCAmc2FyV2lkdGgpCi0gICAgICAgICAgICAmJiB0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5U0FSSGVpZ2h0LCAmc2FySGVpZ2h0KQotICAgICAgICAgICAgJiYgc2FySGVpZ2h0ICE9IDApIHsKLSAgICAgICAgZGlzcGxheVdpZHRoID0gKHdpZHRoICogc2FyV2lkdGgpIC8gc2FySGVpZ2h0OwotICAgICAgICBkaXNwbGF5SGVpZ2h0ID0gaGVpZ2h0OwotICAgIH0gZWxzZSBpZiAodHJhY2tNZXRhLT5maW5kSW50MzIoa0tleURpc3BsYXlXaWR0aCwgJmRpc3BsYXlXaWR0aCkKLSAgICAgICAgICAgICAgICAmJiB0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5RGlzcGxheUhlaWdodCwgJmRpc3BsYXlIZWlnaHQpCi0gICAgICAgICAgICAgICAgJiYgZGlzcGxheVdpZHRoID4gMCAmJiBkaXNwbGF5SGVpZ2h0ID4gMAotICAgICAgICAgICAgICAgICYmIHdpZHRoID4gMCAmJiBoZWlnaHQgPiAwKSB7Ci0gICAgICAgIEFMT0dWKCJmb3VuZCBkaXNwbGF5IHNpemUgJWR4JWQiLCBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRpc3BsYXlXaWR0aCA9IHdpZHRoOwotICAgICAgICBkaXNwbGF5SGVpZ2h0ID0gaGVpZ2h0OwotICAgIH0KLQotICAgIHJldHVybiBuZXcgVmlkZW9GcmFtZSh3aWR0aCwgaGVpZ2h0LCBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQsCi0gICAgICAgICAgICByb3RhdGlvbkFuZ2xlLCBicHAsICFtZXRhT25seSwgaWNjRGF0YSwgaWNjU2l6ZSk7CisgICAgcmV0dXJuIGdldEltYWdlSW50ZXJuYWwoaW5kZXgsIGNvbG9yRm9ybWF0LCBtZXRhT25seSwgdGh1bWJuYWlsLCBOVUxMKTsKIH0KIAotc3RhdGljIGJvb2wgZ2V0RHN0Q29sb3JGb3JtYXQoYW5kcm9pZF9waXhlbF9mb3JtYXRfdCBjb2xvckZvcm1hdCwKLSAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgKm9teENvbG9yRm9ybWF0LCBpbnQzMl90ICpicHApIHsKLSAgICBzd2l0Y2ggKGNvbG9yRm9ybWF0KSB7Ci0gICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1OgotICAgICAgICB7Ci0gICAgICAgICAgICAqb214Q29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjU7Ci0gICAgICAgICAgICAqYnBwID0gMjsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODg6Ci0gICAgICAgIHsKLSAgICAgICAgICAgICpvbXhDb2xvckZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXQzMkJpdFJHQkE4ODg4OwotICAgICAgICAgICAgKmJwcCA9IDQ7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfQkdSQV84ODg4OgotICAgICAgICB7Ci0gICAgICAgICAgICAqb214Q29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0MzJiaXRCR1JBODg4ODsKLSAgICAgICAgICAgICpicHAgPSA0OwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgewotICAgICAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIGNvbG9yIGZvcm1hdDogJWQiLCBjb2xvckZvcm1hdCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQorc3A8SU1lbW9yeT4gU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcjo6Z2V0SW1hZ2VSZWN0QXRJbmRleCgKKyAgICAgICAgaW50IGluZGV4LCBpbnQgY29sb3JGb3JtYXQsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20pIHsKKyAgICBBTE9HVigiZ2V0SW1hZ2VSZWN0QXRJbmRleDogaW5kZXgoJWQpIGNvbG9yRm9ybWF0KCVkKSByZWN0IHslZCwgJWQsICVkLCAlZH0iLAorICAgICAgICAgICAgaW5kZXgsIGNvbG9yRm9ybWF0LCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOworCisgICAgRnJhbWVSZWN0IHJlY3QgPSB7bGVmdCwgdG9wLCByaWdodCwgYm90dG9tfTsKKworICAgIGlmIChtSW1hZ2VEZWNvZGVyICE9IE5VTEwgJiYgaW5kZXggPT0gbUxhc3RJbWFnZUluZGV4KSB7CisgICAgICAgIHJldHVybiBtSW1hZ2VEZWNvZGVyLT5leHRyYWN0RnJhbWUoJnJlY3QpOwogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gZ2V0SW1hZ2VJbnRlcm5hbCgKKyAgICAgICAgICAgIGluZGV4LCBjb2xvckZvcm1hdCwgZmFsc2UgLyptZXRhT25seSovLCBmYWxzZSAvKnRodW1ibmFpbCovLCAmcmVjdCk7CiB9CiAKLXN0YXRpYyBWaWRlb0ZyYW1lICpleHRyYWN0VmlkZW9GcmFtZSgKLSAgICAgICAgY29uc3QgQVN0cmluZyAmY29tcG9uZW50TmFtZSwKLSAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZ0cmFja01ldGEsCi0gICAgICAgIGNvbnN0IHNwPElNZWRpYVNvdXJjZT4gJnNvdXJjZSwKLSAgICAgICAgaW50NjRfdCBmcmFtZVRpbWVVcywKLSAgICAgICAgaW50IHNlZWtNb2RlLAotICAgICAgICBpbnQgY29sb3JGb3JtYXQsCi0gICAgICAgIGJvb2wgbWV0YU9ubHkpIHsKLSAgICBzcDxNZXRhRGF0YT4gZm9ybWF0ID0gc291cmNlLT5nZXRGb3JtYXQoKTsKK3NwPElNZW1vcnk+IFN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXI6OmdldEltYWdlSW50ZXJuYWwoCisgICAgICAgIGludCBpbmRleCwgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5LCBib29sIHRodW1ibmFpbCwgRnJhbWVSZWN0KiByZWN0KSB7CiAKLSAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGUgPQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZT4oc2Vla01vZGUpOwotICAgIGlmIChzZWVrTW9kZSA8IE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DIHx8Ci0gICAgICAgIHNlZWtNb2RlID4gTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1QpIHsKLSAgICAgICAgQUxPR0UoIlVua25vd24gc2VlayBtb2RlOiAlZCIsIHNlZWtNb2RlKTsKKyAgICBpZiAobUV4dHJhY3Rvci5nZXQoKSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJubyBleHRyYWN0b3IuIik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIGludDMyX3QgZHN0QnBwOwotICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGRzdEZvcm1hdDsKLSAgICBpZiAoIWdldERzdENvbG9yRm9ybWF0KAotICAgICAgICAgICAgKGFuZHJvaWRfcGl4ZWxfZm9ybWF0X3QpY29sb3JGb3JtYXQsICZkc3RGb3JtYXQsICZkc3RCcHApKSB7CisgICAgc2l6ZV90IG4gPSBtRXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOworICAgIHNpemVfdCBpOworICAgIGludCBpbWFnZUNvdW50ID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKKyAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtRXh0cmFjdG9yLT5nZXRUcmFja01ldGFEYXRhKGkpOworICAgICAgICBBTE9HVigiZ2V0dGluZyB0cmFjayAlenUgb2YgJXp1LCBtZXRhPSVzIiwgaSwgbiwgbWV0YS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKKworICAgICAgICBjb25zdCBjaGFyICptaW1lOworICAgICAgICBDSEVDSyhtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisKKyAgICAgICAgaWYgKCFzdHJuY2FzZWNtcChtaW1lLCAiaW1hZ2UvIiwgNikpIHsKKyAgICAgICAgICAgIGludDMyX3QgaXNQcmltYXJ5OworICAgICAgICAgICAgaWYgKChpbmRleCA8IDAgJiYgbWV0YS0+ZmluZEludDMyKAorICAgICAgICAgICAgICAgICAgICBrS2V5VHJhY2tJc0RlZmF1bHQsICZpc1ByaW1hcnkpICYmIGlzUHJpbWFyeSkKKyAgICAgICAgICAgICAgICAgICAgfHwgKGluZGV4ID09IGltYWdlQ291bnQrKykpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpID09IG4pIHsKKyAgICAgICAgQUxPR0UoImltYWdlIHRyYWNrIG5vdCBmb3VuZC4iKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCisgICAgc3A8TWV0YURhdGE+IHRyYWNrTWV0YSA9IG1FeHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEoaSk7CisKICAgICBpZiAobWV0YU9ubHkpIHsKLSAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OwotICAgICAgICBDSEVDSyh0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZ3aWR0aCkpOwotICAgICAgICBDSEVDSyh0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmaGVpZ2h0KSk7Ci0gICAgICAgIHJldHVybiBhbGxvY1ZpZGVvRnJhbWUodHJhY2tNZXRhLCB3aWR0aCwgaGVpZ2h0LCBkc3RCcHAsIHRydWUpOworICAgICAgICByZXR1cm4gRnJhbWVEZWNvZGVyOjpnZXRNZXRhZGF0YU9ubHkodHJhY2tNZXRhLCBjb2xvckZvcm1hdCwgdGh1bWJuYWlsKTsKICAgICB9CiAKLSAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgb3B0aW9uczsKLSAgICBzcDxNZXRhRGF0YT4gb3ZlcnJpZGVNZXRhOwotICAgIGlmIChmcmFtZVRpbWVVcyA8IDApIHsKLSAgICAgICAgdWludDMyX3QgdHlwZTsKLSAgICAgICAgY29uc3Qgdm9pZCAqZGF0YTsKLSAgICAgICAgc2l6ZV90IHNpemU7Ci0gICAgICAgIGludDY0X3QgdGh1bWJOYWlsVGltZTsKLSAgICAgICAgaW50MzJfdCB0aHVtYm5haWxXaWR0aCwgdGh1bWJuYWlsSGVpZ2h0OworICAgIHNwPElNZWRpYVNvdXJjZT4gc291cmNlID0gbUV4dHJhY3Rvci0+Z2V0VHJhY2soaSk7CiAKLSAgICAgICAgLy8gaWYgd2UgaGF2ZSBhIHN0YW5kLWFsb25lIHRodW1ibmFpbCwgc2V0IHVwIHRoZSBvdmVycmlkZSBtZXRhLAotICAgICAgICAvLyBhbmQgc2V0IHNlZWtUbyB0aW1lIHRvIC0xLgotICAgICAgICBpZiAodHJhY2tNZXRhLT5maW5kSW50MzIoa0tleVRodW1ibmFpbFdpZHRoLCAmdGh1bWJuYWlsV2lkdGgpCi0gICAgICAgICAmJiB0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5VGh1bWJuYWlsSGVpZ2h0LCAmdGh1bWJuYWlsSGVpZ2h0KQotICAgICAgICAgJiYgdHJhY2tNZXRhLT5maW5kRGF0YShrS2V5VGh1bWJuYWlsSFZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpewotICAgICAgICAgICAgb3ZlcnJpZGVNZXRhID0gbmV3IE1ldGFEYXRhKCp0cmFja01ldGEpOwotICAgICAgICAgICAgb3ZlcnJpZGVNZXRhLT5yZW1vdmUoa0tleURpc3BsYXlXaWR0aCk7Ci0gICAgICAgICAgICBvdmVycmlkZU1ldGEtPnJlbW92ZShrS2V5RGlzcGxheUhlaWdodCk7Ci0gICAgICAgICAgICBvdmVycmlkZU1ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgdGh1bWJuYWlsV2lkdGgpOwotICAgICAgICAgICAgb3ZlcnJpZGVNZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCB0aHVtYm5haWxIZWlnaHQpOwotICAgICAgICAgICAgb3ZlcnJpZGVNZXRhLT5zZXREYXRhKGtLZXlIVkNDLCB0eXBlLCBkYXRhLCBzaXplKTsKLSAgICAgICAgICAgIHRodW1iTmFpbFRpbWUgPSAtMWxsOwotICAgICAgICAgICAgQUxPR1YoInRodW1ibmFpbDogJWR4JWQiLCB0aHVtYm5haWxXaWR0aCwgdGh1bWJuYWlsSGVpZ2h0KTsKLSAgICAgICAgfSBlbHNlIGlmICghdHJhY2tNZXRhLT5maW5kSW50NjQoa0tleVRodW1ibmFpbFRpbWUsICZ0aHVtYk5haWxUaW1lKQotICAgICAgICAgICAgICAgIHx8IHRodW1iTmFpbFRpbWUgPCAwKSB7Ci0gICAgICAgICAgICB0aHVtYk5haWxUaW1lID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKHRodW1iTmFpbFRpbWUsIG1vZGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKGZyYW1lVGltZVVzLCBtb2RlKTsKLSAgICB9Ci0KLSAgICBpbnQzMl90IGdyaWRSb3dzID0gMSwgZ3JpZENvbHMgPSAxOwotICAgIGlmIChvdmVycmlkZU1ldGEgPT0gTlVMTCkgewotICAgICAgICAvLyBjaGVjayBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSB0aWxlZCBoZWlmCi0gICAgICAgIGludDMyX3QgZ3JpZFdpZHRoLCBncmlkSGVpZ2h0LCB0bXBSb3dzLCB0bXBDb2xzOwotICAgICAgICBpZiAodHJhY2tNZXRhLT5maW5kSW50MzIoa0tleUdyaWRXaWR0aCwgJmdyaWRXaWR0aCkgJiYgZ3JpZFdpZHRoID4gMAotICAgICAgICAgJiYgdHJhY2tNZXRhLT5maW5kSW50MzIoa0tleUdyaWRIZWlnaHQsICZncmlkSGVpZ2h0KSAmJiBncmlkSGVpZ2h0ID4gMAotICAgICAgICAgJiYgdHJhY2tNZXRhLT5maW5kSW50MzIoa0tleUdyaWRSb3dzLCAmdG1wUm93cykgJiYgdG1wUm93cyA+IDAKLSAgICAgICAgICYmIHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlHcmlkQ29scywgJnRtcENvbHMpICYmIHRtcENvbHMgPiAwKSB7Ci0gICAgICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7Ci0gICAgICAgICAgICBDSEVDSyh0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZ3aWR0aCkpOwotICAgICAgICAgICAgQ0hFQ0sodHJhY2tNZXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgJmhlaWdodCkpOwotCi0gICAgICAgICAgICBpZiAod2lkdGggPD0gZ3JpZFdpZHRoICogdG1wQ29scyAmJiBoZWlnaHQgPD0gZ3JpZEhlaWdodCAqIHRtcFJvd3MpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiZ3JpZDogJWR4JWQsIHNpemU6ICVkeCVkLCBwaWN0dXJlIHNpemU6ICVkeCVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcENvbHMsIHRtcFJvd3MsIGdyaWRXaWR0aCwgZ3JpZEhlaWdodCwgd2lkdGgsIGhlaWdodCk7Ci0KLSAgICAgICAgICAgICAgICBvdmVycmlkZU1ldGEgPSBuZXcgTWV0YURhdGEoKnRyYWNrTWV0YSk7Ci0gICAgICAgICAgICAgICAgb3ZlcnJpZGVNZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIGdyaWRXaWR0aCk7Ci0gICAgICAgICAgICAgICAgb3ZlcnJpZGVNZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBncmlkSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICBncmlkQ29scyA9IHRtcENvbHM7Ci0gICAgICAgICAgICAgICAgZ3JpZFJvd3MgPSB0bXBSb3dzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYmFkIGdyaWQ6ICVkeCVkLCBzaXplOiAlZHglZCwgcGljdHVyZSBzaXplOiAlZHglZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICB0bXBDb2xzLCB0bXBSb3dzLCBncmlkV2lkdGgsIGdyaWRIZWlnaHQsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChvdmVycmlkZU1ldGEgPT0gTlVMTCkgewotICAgICAgICAgICAgb3ZlcnJpZGVNZXRhID0gdHJhY2tNZXRhOwotICAgICAgICB9Ci0gICAgfQotICAgIGludDMyX3QgbnVtVGlsZXMgPSBncmlkUm93cyAqIGdyaWRDb2xzOwotCi0gICAgc3A8QU1lc3NhZ2U+IHZpZGVvRm9ybWF0OwotICAgIGlmIChjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2Uob3ZlcnJpZGVNZXRhLCAmdmlkZW9Gb3JtYXQpICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCJiLzIzNjgwNzgwIik7Ci0gICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gY29udmVydCBtZXRhIGRhdGEgdG8gbWVzc2FnZSIpOworICAgIGlmIChzb3VyY2UuZ2V0KCkgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgidW5hYmxlIHRvIGluc3RhbnRpYXRlIGltYWdlIHRyYWNrLiIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICAvLyBUT0RPOiBVc2UgRmxleGlibGUgY29sb3IgaW5zdGVhZAotICAgIHZpZGVvRm9ybWF0LT5zZXRJbnQzMigiY29sb3ItZm9ybWF0IiwgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcik7Ci0KLSAgICAvLyBGb3IgdGhlIHRodW1ibmFpbCBleHRyYWN0aW9uIGNhc2UsIHRyeSB0byBhbGxvY2F0ZSBzaW5nbGUgYnVmZmVyIGluIGJvdGgKLSAgICAvLyBpbnB1dCBhbmQgb3V0cHV0IHBvcnRzLCBpZiBzZWVraW5nIHRvIGEgc3luYyBmcmFtZS4gTk9URTogVGhpcyByZXF1ZXN0IG1heQotICAgIC8vIGZhaWwgaWYgY29tcG9uZW50IHJlcXVpcmVzIG1vcmUgdGhhbiB0aGF0IGZvciBkZWNvZGluZy4KLSAgICBib29sIGlzU2Vla2luZ0Nsb3Nlc3QgPSAoc2Vla01vZGUgPT0gTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1QpOwotICAgIGJvb2wgZGVjb2RlU2luZ2xlRnJhbWUgPSAhaXNTZWVraW5nQ2xvc2VzdCAmJiAobnVtVGlsZXMgPT0gMSk7Ci0gICAgaWYgKGRlY29kZVNpbmdsZUZyYW1lKSB7Ci0gICAgICAgIHZpZGVvRm9ybWF0LT5zZXRJbnQzMigiYW5kcm9pZC5fbnVtLWlucHV0LWJ1ZmZlcnMiLCAxKTsKLSAgICAgICAgdmlkZW9Gb3JtYXQtPnNldEludDMyKCJhbmRyb2lkLl9udW0tb3V0cHV0LWJ1ZmZlcnMiLCAxKTsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBlcnI7Ci0gICAgc3A8QUxvb3Blcj4gbG9vcGVyID0gbmV3IEFMb29wZXI7Ci0gICAgbG9vcGVyLT5zdGFydCgpOwotICAgIHNwPE1lZGlhQ29kZWM+IGRlY29kZXIgPSBNZWRpYUNvZGVjOjpDcmVhdGVCeUNvbXBvbmVudE5hbWUoCi0gICAgICAgICAgICBsb29wZXIsIGNvbXBvbmVudE5hbWUsICZlcnIpOwotCi0gICAgaWYgKGRlY29kZXIuZ2V0KCkgPT0gTlVMTCB8fCBlcnIgIT0gT0spIHsKLSAgICAgICAgQUxPR1coIkZhaWxlZCB0byBpbnN0YW50aWF0ZSBkZWNvZGVyIFslc10iLCBjb21wb25lbnROYW1lLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBlcnIgPSBkZWNvZGVyLT5jb25maWd1cmUodmlkZW9Gb3JtYXQsIE5VTEwgLyogc3VyZmFjZSAqLywgTlVMTCAvKiBjcnlwdG8gKi8sIDAgLyogZmxhZ3MgKi8pOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgQUxPR1coImNvbmZpZ3VyZSByZXR1cm5lZCBlcnJvciAlZCAoJXMpIiwgZXJyLCBhc1N0cmluZyhlcnIpKTsKLSAgICAgICAgZGVjb2Rlci0+cmVsZWFzZSgpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBlcnIgPSBkZWNvZGVyLT5zdGFydCgpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgQUxPR1coInN0YXJ0IHJldHVybmVkIGVycm9yICVkICglcykiLCBlcnIsIGFzU3RyaW5nKGVycikpOwotICAgICAgICBkZWNvZGVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGVyciA9IHNvdXJjZS0+c3RhcnQoKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIEFMT0dXKCJzb3VyY2UgZmFpbGVkIHRvIHN0YXJ0OiAlZCAoJXMpIiwgZXJyLCBhc1N0cmluZyhlcnIpKTsKLSAgICAgICAgZGVjb2Rlci0+cmVsZWFzZSgpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBWZWN0b3I8c3A8TWVkaWFDb2RlY0J1ZmZlcj4gPiBpbnB1dEJ1ZmZlcnM7Ci0gICAgZXJyID0gZGVjb2Rlci0+Z2V0SW5wdXRCdWZmZXJzKCZpbnB1dEJ1ZmZlcnMpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgQUxPR1coImZhaWxlZCB0byBnZXQgaW5wdXQgYnVmZmVyczogJWQgKCVzKSIsIGVyciwgYXNTdHJpbmcoZXJyKSk7Ci0gICAgICAgIGRlY29kZXItPnJlbGVhc2UoKTsKLSAgICAgICAgc291cmNlLT5zdG9wKCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIFZlY3RvcjxzcDxNZWRpYUNvZGVjQnVmZmVyPiA+IG91dHB1dEJ1ZmZlcnM7Ci0gICAgZXJyID0gZGVjb2Rlci0+Z2V0T3V0cHV0QnVmZmVycygmb3V0cHV0QnVmZmVycyk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBBTE9HVygiZmFpbGVkIHRvIGdldCBvdXRwdXQgYnVmZmVyczogJWQgKCVzKSIsIGVyciwgYXNTdHJpbmcoZXJyKSk7Ci0gICAgICAgIGRlY29kZXItPnJlbGVhc2UoKTsKLSAgICAgICAgc291cmNlLT5zdG9wKCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHNwPEFNZXNzYWdlPiBvdXRwdXRGb3JtYXQgPSBOVUxMOwotICAgIGJvb2wgaGF2ZU1vcmVJbnB1dHMgPSB0cnVlOwotICAgIHNpemVfdCBpbmRleCwgb2Zmc2V0LCBzaXplOwotICAgIGludDY0X3QgdGltZVVzOwotICAgIHNpemVfdCByZXRyaWVzTGVmdCA9IGtSZXRyeUNvdW50OwotICAgIGJvb2wgZG9uZSA9IGZhbHNlOwogICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgYm9vbCBzdWNjZXNzID0gZm9ybWF0LT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKTsKLSAgICBpZiAoIXN1Y2Nlc3MpIHsKLSAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBmaW5kIG1pbWUgdHlwZSIpOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDSEVDSyh0cmFja01ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKyAgICBBTE9HVigiZXh0cmFjdGluZyBmcm9tICVzIHRyYWNrIiwgbWltZSk7CisgICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQykpIHsKKyAgICAgICAgbWltZSA9IE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkM7CisgICAgICAgIHRyYWNrTWV0YSA9IG5ldyBNZXRhRGF0YSgqdHJhY2tNZXRhKTsKKyAgICAgICAgdHJhY2tNZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgbWltZSk7CiAgICAgfQogCi0gICAgYm9vbCBpc0F2Y09ySGV2YyA9ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQykKLSAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpOworICAgIFZlY3RvcjxBU3RyaW5nPiBtYXRjaGluZ0NvZGVjczsKKyAgICBNZWRpYUNvZGVjTGlzdDo6ZmluZE1hdGNoaW5nQ29kZWNzKAorICAgICAgICAgICAgbWltZSwKKyAgICAgICAgICAgIGZhbHNlLCAvKiBlbmNvZGVyICovCisgICAgICAgICAgICBNZWRpYUNvZGVjTGlzdDo6a1ByZWZlclNvZnR3YXJlQ29kZWNzLAorICAgICAgICAgICAgJm1hdGNoaW5nQ29kZWNzKTsKIAotICAgIGJvb2wgZmlyc3RTYW1wbGUgPSB0cnVlOwotICAgIGludDY0X3QgdGFyZ2V0VGltZVVzID0gLTFsbDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1hdGNoaW5nQ29kZWNzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGNvbnN0IEFTdHJpbmcgJmNvbXBvbmVudE5hbWUgPSBtYXRjaGluZ0NvZGVjc1tpXTsKKyAgICAgICAgc3A8SW1hZ2VEZWNvZGVyPiBkZWNvZGVyID0gbmV3IEltYWdlRGVjb2Rlcihjb21wb25lbnROYW1lLCB0cmFja01ldGEsIHNvdXJjZSk7CisgICAgICAgIGludDY0X3QgZnJhbWVUaW1lVXMgPSB0aHVtYm5haWwgPyAtMSA6IDA7CisgICAgICAgIGlmIChkZWNvZGVyLT5pbml0KGZyYW1lVGltZVVzLCAxIC8qbnVtRnJhbWVzKi8sIDAgLypvcHRpb24qLywgY29sb3JGb3JtYXQpID09IE9LKSB7CisgICAgICAgICAgICBzcDxJTWVtb3J5PiBmcmFtZSA9IGRlY29kZXItPmV4dHJhY3RGcmFtZShyZWN0KTsKIAotICAgIFZpZGVvRnJhbWUgKmZyYW1lID0gTlVMTDsKLSAgICBpbnQzMl90IHRpbGVzRGVjb2RlZCA9IDA7Ci0KLSAgICBkbyB7Ci0gICAgICAgIHNpemVfdCBpbnB1dEluZGV4ID0gLTE7Ci0gICAgICAgIGludDY0X3QgcHRzVXMgPSAwbGw7Ci0gICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKLSAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gY29kZWNCdWZmZXIgPSBOVUxMOwotCi0gICAgICAgIHdoaWxlIChoYXZlTW9yZUlucHV0cykgewotICAgICAgICAgICAgZXJyID0gZGVjb2Rlci0+ZGVxdWV1ZUlucHV0QnVmZmVyKCZpbnB1dEluZGV4LCBrQnVmZmVyVGltZU91dFVzKTsKLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiVGltZWQgb3V0IHdhaXRpbmcgZm9yIGlucHV0Iik7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHJpZXNMZWZ0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE9LOworICAgICAgICAgICAgaWYgKGZyYW1lICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAocmVjdCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGtlZXAgdGhlIGRlY29kZXIgaWYgc2xpY2UgZGVjb2RpbmcKKyAgICAgICAgICAgICAgICAgICAgbUltYWdlRGVjb2RlciA9IGRlY29kZXI7CisgICAgICAgICAgICAgICAgICAgIG1MYXN0SW1hZ2VJbmRleCA9IGluZGV4OwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvZGVjQnVmZmVyID0gaW5wdXRCdWZmZXJzW2lucHV0SW5kZXhdOwotCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqbWVkaWFCdWZmZXIgPSBOVUxMOwotCi0gICAgICAgICAgICBlcnIgPSBzb3VyY2UtPnJlYWQoJm1lZGlhQnVmZmVyLCAmb3B0aW9ucyk7Ci0gICAgICAgICAgICBvcHRpb25zLmNsZWFyU2Vla1RvKCk7Ci0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIklucHV0IEVycm9yIG9yIEVPUyIpOwotICAgICAgICAgICAgICAgIGhhdmVNb3JlSW5wdXRzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE9LOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChmaXJzdFNhbXBsZSAmJiBpc1NlZWtpbmdDbG9zZXN0KSB7Ci0gICAgICAgICAgICAgICAgbWVkaWFCdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRhcmdldFRpbWUsICZ0YXJnZXRUaW1lVXMpOwotICAgICAgICAgICAgICAgIEFMT0dWKCJTZWVraW5nIGNsb3Nlc3Q6IHRhcmdldFRpbWVVcz0lbGxkIiwgKGxvbmcgbG9uZyl0YXJnZXRUaW1lVXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmlyc3RTYW1wbGUgPSBmYWxzZTsKLQotICAgICAgICAgICAgaWYgKG1lZGlhQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA+IGNvZGVjQnVmZmVyLT5jYXBhY2l0eSgpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImJ1ZmZlciBzaXplICglenUpIHRvbyBsYXJnZSBmb3IgY29kZWMgaW5wdXQgc2l6ZSAoJXp1KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCksIGNvZGVjQnVmZmVyLT5jYXBhY2l0eSgpKTsKLSAgICAgICAgICAgICAgICBoYXZlTW9yZUlucHV0cyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGVyciA9IEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY29kZWNCdWZmZXItPnNldFJhbmdlKDAsIG1lZGlhQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7Ci0KLSAgICAgICAgICAgICAgICBDSEVDSyhtZWRpYUJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnB0c1VzKSk7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KGNvZGVjQnVmZmVyLT5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCopbWVkaWFCdWZmZXItPmRhdGEoKSArIG1lZGlhQnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1lZGlhQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoYXZlTW9yZUlucHV0cyAmJiBpbnB1dEluZGV4IDwgaW5wdXRCdWZmZXJzLnNpemUoKSkgewotICAgICAgICAgICAgaWYgKGlzQXZjT3JIZXZjICYmIElzSURSKGNvZGVjQnVmZmVyKSAmJiBkZWNvZGVTaW5nbGVGcmFtZSkgewotICAgICAgICAgICAgICAgIC8vIE9ubHkgbmVlZCB0byBkZWNvZGUgb25lIElEUiBmcmFtZSwgdW5sZXNzIHdlJ3JlIHNlZWtpbmcgd2l0aCBDTE9TRVNUCi0gICAgICAgICAgICAgICAgLy8gb3B0aW9uLCBpbiB3aGljaCBjYXNlIHdlIG5lZWQgdG8gYWN0dWFsbHkgZGVjb2RlIHRvIHRhcmdldFRpbWVVcy4KLSAgICAgICAgICAgICAgICBoYXZlTW9yZUlucHV0cyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGZsYWdzIHw9IE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0VPUzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQUxPR1YoIlF1ZXVlSW5wdXQ6IHNpemU9JXp1IHRzPSUiIFBSSWQ2NCAiIHVzIGZsYWdzPSV4IiwKLSAgICAgICAgICAgICAgICAgICAgY29kZWNCdWZmZXItPnNpemUoKSwgcHRzVXMsIGZsYWdzKTsKLSAgICAgICAgICAgIGVyciA9IGRlY29kZXItPnF1ZXVlSW5wdXRCdWZmZXIoCi0gICAgICAgICAgICAgICAgICAgIGlucHV0SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgIGNvZGVjQnVmZmVyLT5vZmZzZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgY29kZWNCdWZmZXItPnNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgcHRzVXMsCi0gICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQotICAgICAgICAgICAgLy8gd2UgZG9uJ3QgZXhwZWN0IGFuIG91dHB1dCBmcm9tIGNvZGVjIGNvbmZpZyBidWZmZXIKLSAgICAgICAgICAgIGlmIChmbGFncyAmIE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0NPREVDQ09ORklHKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZyYW1lOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKGVyciA9PSBPSykgewotICAgICAgICAgICAgLy8gd2FpdCBmb3IgYSBkZWNvZGVkIGJ1ZmZlcgotICAgICAgICAgICAgZXJyID0gZGVjb2Rlci0+ZGVxdWV1ZU91dHB1dEJ1ZmZlcigKLSAgICAgICAgICAgICAgICAgICAgJmluZGV4LAotICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgJnRpbWVVcywKLSAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAotICAgICAgICAgICAgICAgICAgICBrQnVmZmVyVGltZU91dFVzKTsKLQotICAgICAgICAgICAgaWYgKGVyciA9PSBJTkZPX0ZPUk1BVF9DSEFOR0VEKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlJlY2VpdmVkIGZvcm1hdCBjaGFuZ2UiKTsKLSAgICAgICAgICAgICAgICBlcnIgPSBkZWNvZGVyLT5nZXRPdXRwdXRGb3JtYXQoJm91dHB1dEZvcm1hdCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBJTkZPX09VVFBVVF9CVUZGRVJTX0NIQU5HRUQpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiT3V0cHV0IGJ1ZmZlcnMgY2hhbmdlZCIpOwotICAgICAgICAgICAgICAgIGVyciA9IGRlY29kZXItPmdldE91dHB1dEJ1ZmZlcnMoJm91dHB1dEJ1ZmZlcnMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoZXJyID09IC1FQUdBSU4gLyogSU5GT19UUllfQUdBSU5fTEFURVIgKi8gJiYgLS1yZXRyaWVzTGVmdCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlRpbWVkLW91dCB3YWl0aW5nIGZvciBvdXRwdXQuLiByZXRyaWVzIGxlZnQgPSAlenUiLCByZXRyaWVzTGVmdCk7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE9LOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyID09IE9LKSB7Ci0JICAgICAgICAgICAgaWYgKG91dHB1dEZvcm1hdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyLT5yZWxlYXNlT3V0cHV0QnVmZmVyKGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UncmUgc2Vla2luZyB3aXRoIENMT1NFU1Qgb3B0aW9uIGFuZCBvYnRhaW5lZCBhIHZhbGlkIHRhcmdldFRpbWVVcwotICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSBleHRyYWN0b3IsIGRlY29kZSB0byB0aGUgc3BlY2lmaWVkIGZyYW1lLiBPdGhlcndpc2Ugd2UncmUgZG9uZS4KLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlJlY2VpdmVkIGFuIG91dHB1dCBidWZmZXIsIHRpbWVVcz0lbGxkIiwgKGxvbmcgbG9uZyl0aW1lVXMpOwotICAgICAgICAgICAgICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiB2aWRlb0ZyYW1lQnVmZmVyID0gb3V0cHV0QnVmZmVycy5pdGVtQXQoaW5kZXgpOwotCi0gICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKSk7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjcm9wX2xlZnQsIGNyb3BfdG9wLCBjcm9wX3JpZ2h0LCBjcm9wX2JvdHRvbTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFvdXRwdXRGb3JtYXQtPmZpbmRSZWN0KCJjcm9wIiwgJmNyb3BfbGVmdCwgJmNyb3BfdG9wLCAmY3JvcF9yaWdodCwgJmNyb3BfYm90dG9tKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY3JvcF9sZWZ0ID0gY3JvcF90b3AgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgY3JvcF9yaWdodCA9IHdpZHRoIC0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNyb3BfYm90dG9tID0gaGVpZ2h0IC0gMTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtZSA9IGFsbG9jVmlkZW9GcmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tNZXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3JvcF9yaWdodCAtIGNyb3BfbGVmdCArIDEpICogZ3JpZENvbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjcm9wX2JvdHRvbSAtIGNyb3BfdG9wICsgMSkgKiBncmlkUm93cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0QnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKm1ldGFPbmx5Ki8pOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzcmNGb3JtYXQ7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJjb2xvci1mb3JtYXQiLCAmc3JjRm9ybWF0KSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgQ29sb3JDb252ZXJ0ZXIgY29udmVydGVyKChPTVhfQ09MT1JfRk9STUFUVFlQRSlzcmNGb3JtYXQsIGRzdEZvcm1hdCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkc3RMZWZ0LCBkc3RUb3AsIGRzdFJpZ2h0LCBkc3RCb3R0b207Ci0gICAgICAgICAgICAgICAgICAgIGlmIChudW1UaWxlcyA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkc3RMZWZ0ID0gY3JvcF9sZWZ0OwotICAgICAgICAgICAgICAgICAgICAgICAgZHN0VG9wID0gY3JvcF90b3A7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkc3RSaWdodCA9IGNyb3BfcmlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkc3RCb3R0b20gPSBjcm9wX2JvdHRvbTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdExlZnQgPSB0aWxlc0RlY29kZWQgJSBncmlkQ29scyAqIHdpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgZHN0VG9wID0gdGlsZXNEZWNvZGVkIC8gZ3JpZENvbHMgKiBoZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkc3RSaWdodCA9IGRzdExlZnQgKyB3aWR0aCAtIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkc3RCb3R0b20gPSBkc3RUb3AgKyBoZWlnaHQgLSAxOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZG9uZSA9ICh0YXJnZXRUaW1lVXMgPCAwbGwpIHx8ICh0aW1lVXMgPj0gdGFyZ2V0VGltZVVzKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoZG9uZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnZlcnRlci5pc1ZhbGlkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBjb252ZXJ0ZXIuY29udmVydCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopdmlkZW9GcmFtZUJ1ZmZlci0+ZGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyb3BfbGVmdCwgY3JvcF90b3AsIGNyb3BfcmlnaHQsIGNyb3BfYm90dG9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPm1EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPm1XaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5tSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0TGVmdCwgZHN0VG9wLCBkc3RSaWdodCwgZHN0Qm90dG9tKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBjb252ZXJ0IGZyb20gZm9ybWF0IDB4JTA4eCB0byAweCUwOHgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjRm9ybWF0LCBkc3RGb3JtYXQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVtVGlsZXMgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsZXNEZWNvZGVkKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSAmPSAodGlsZXNEZWNvZGVkID49IG51bVRpbGVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlY29kZXItPnJlbGVhc2VPdXRwdXRCdWZmZXIoaW5kZXgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJSZWNlaXZlZCBlcnJvciAlZCAoJXMpIGluc3RlYWQgb2Ygb3V0cHV0IiwgZXJyLCBhc1N0cmluZyhlcnIpKTsKLSAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSB3aGlsZSAoZXJyID09IE9LICYmICFkb25lKTsKLQotICAgIHNvdXJjZS0+c3RvcCgpOwotICAgIGRlY29kZXItPnJlbGVhc2UoKTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoImZhaWxlZCB0byBnZXQgdmlkZW8gZnJhbWUgKGVyciAlZCkiLCBlcnIpOwotICAgICAgICBkZWxldGUgZnJhbWU7Ci0gICAgICAgIGZyYW1lID0gTlVMTDsKKyAgICAgICAgQUxPR1YoIiVzIGZhaWxlZCB0byBleHRyYWN0IHRodW1ibmFpbCwgdHJ5aW5nIG5leHQgZGVjb2Rlci4iLCBjb21wb25lbnROYW1lLmNfc3RyKCkpOwogICAgIH0KIAotICAgIHJldHVybiBmcmFtZTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAotVmlkZW9GcmFtZSAqU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcjo6Z2V0RnJhbWVBdFRpbWUoCitzcDxJTWVtb3J5PiBTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyOjpnZXRGcmFtZUF0VGltZSgKICAgICAgICAgaW50NjRfdCB0aW1lVXMsIGludCBvcHRpb24sIGludCBjb2xvckZvcm1hdCwgYm9vbCBtZXRhT25seSkgewotCiAgICAgQUxPR1YoImdldEZyYW1lQXRUaW1lOiAlIiBQUklkNjQgIiB1cyBvcHRpb246ICVkIGNvbG9yRm9ybWF0OiAlZCwgbWV0YU9ubHk6ICVkIiwKICAgICAgICAgICAgIHRpbWVVcywgb3B0aW9uLCBjb2xvckZvcm1hdCwgbWV0YU9ubHkpOwogCisgICAgc3A8SU1lbW9yeT4gZnJhbWU7CisgICAgc3RhdHVzX3QgZXJyID0gZ2V0RnJhbWVJbnRlcm5hbCgKKyAgICAgICAgICAgIHRpbWVVcywgMSwgb3B0aW9uLCBjb2xvckZvcm1hdCwgbWV0YU9ubHksICZmcmFtZSwgTlVMTCAvKm91dEZyYW1lcyovKTsKKyAgICByZXR1cm4gKGVyciA9PSBPSykgPyBmcmFtZSA6IE5VTEw7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXI6OmdldEZyYW1lQXRJbmRleCgKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3A8SU1lbW9yeT4gPiogZnJhbWVzLAorICAgICAgICBpbnQgZnJhbWVJbmRleCwgaW50IG51bUZyYW1lcywgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5KSB7CisgICAgQUxPR1YoImdldEZyYW1lQXRJbmRleDogZnJhbWVJbmRleCAlZCwgbnVtRnJhbWVzICVkLCBjb2xvckZvcm1hdDogJWQsIG1ldGFPbmx5OiAlZCIsCisgICAgICAgICAgICBmcmFtZUluZGV4LCBudW1GcmFtZXMsIGNvbG9yRm9ybWF0LCBtZXRhT25seSk7CisKKyAgICByZXR1cm4gZ2V0RnJhbWVJbnRlcm5hbCgKKyAgICAgICAgICAgIGZyYW1lSW5kZXgsIG51bUZyYW1lcywgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX0ZSQU1FX0lOREVYLAorICAgICAgICAgICAgY29sb3JGb3JtYXQsIG1ldGFPbmx5LCBOVUxMIC8qb3V0RnJhbWUqLywgZnJhbWVzKTsKK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcjo6Z2V0RnJhbWVJbnRlcm5hbCgKKyAgICAgICAgaW50NjRfdCB0aW1lVXMsIGludCBudW1GcmFtZXMsIGludCBvcHRpb24sIGludCBjb2xvckZvcm1hdCwgYm9vbCBtZXRhT25seSwKKyAgICAgICAgc3A8SU1lbW9yeT4qIG91dEZyYW1lLCBzdGQ6OnZlY3RvcjxzcDxJTWVtb3J5PiA+KiBvdXRGcmFtZXMpIHsKICAgICBpZiAobUV4dHJhY3Rvci5nZXQoKSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dWKCJubyBleHRyYWN0b3IuIik7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBBTE9HRSgibm8gZXh0cmFjdG9yLiIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAKICAgICBzcDxNZXRhRGF0YT4gZmlsZU1ldGEgPSBtRXh0cmFjdG9yLT5nZXRNZXRhRGF0YSgpOwogCiAgICAgaWYgKGZpbGVNZXRhID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoImV4dHJhY3RvciBkb2Vzbid0IHB1Ymxpc2ggbWV0YWRhdGEsIGZhaWxlZCB0byBpbml0aWFsaXplPyIpOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgQUxPR0UoImV4dHJhY3RvciBkb2Vzbid0IHB1Ymxpc2ggbWV0YWRhdGEsIGZhaWxlZCB0byBpbml0aWFsaXplPyIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAKICAgICBpbnQzMl90IGRybSA9IDA7CiAgICAgaWYgKGZpbGVNZXRhLT5maW5kSW50MzIoa0tleUlzRFJNLCAmZHJtKSAmJiBkcm0gIT0gMCkgewogICAgICAgICBBTE9HRSgiZnJhbWUgZ3JhYiBub3QgYWxsb3dlZC4iKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fVU5LTk9XTjsKICAgICB9CiAKICAgICBzaXplX3QgbiA9IG1FeHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7CkBAIC02MjcsMTggKzI5MCwyOCBAQAogICAgIH0KIAogICAgIGlmIChpID09IG4pIHsKLSAgICAgICAgQUxPR1YoIm5vIHZpZGVvIHRyYWNrIGZvdW5kLiIpOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgQUxPR0UoIm5vIHZpZGVvIHRyYWNrIGZvdW5kLiIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCiAgICAgc3A8TWV0YURhdGE+IHRyYWNrTWV0YSA9IG1FeHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEoCiAgICAgICAgICAgICBpLCBNZWRpYUV4dHJhY3Rvcjo6a0luY2x1ZGVFeHRlbnNpdmVNZXRhRGF0YSk7CiAKKyAgICBpZiAobWV0YU9ubHkpIHsKKyAgICAgICAgaWYgKG91dEZyYW1lICE9IE5VTEwpIHsKKyAgICAgICAgICAgICpvdXRGcmFtZSA9IEZyYW1lRGVjb2Rlcjo6Z2V0TWV0YWRhdGFPbmx5KHRyYWNrTWV0YSwgY29sb3JGb3JtYXQpOworICAgICAgICAgICAgaWYgKCpvdXRGcmFtZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKwogICAgIHNwPElNZWRpYVNvdXJjZT4gc291cmNlID0gbUV4dHJhY3Rvci0+Z2V0VHJhY2soaSk7CiAKICAgICBpZiAoc291cmNlLmdldCgpID09IE5VTEwpIHsKICAgICAgICAgQUxPR1YoInVuYWJsZSB0byBpbnN0YW50aWF0ZSB2aWRlbyB0cmFjay4iKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KIAogICAgIGNvbnN0IHZvaWQgKmRhdGE7CkBAIC02NjEsMTYgKzMzNCwyNSBAQAogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtYXRjaGluZ0NvZGVjcy5zaXplKCk7ICsraSkgewogICAgICAgICBjb25zdCBBU3RyaW5nICZjb21wb25lbnROYW1lID0gbWF0Y2hpbmdDb2RlY3NbaV07Ci0gICAgICAgIFZpZGVvRnJhbWUgKmZyYW1lID0gZXh0cmFjdFZpZGVvRnJhbWUoCi0gICAgICAgICAgICAgICAgY29tcG9uZW50TmFtZSwgdHJhY2tNZXRhLCBzb3VyY2UsIHRpbWVVcywgb3B0aW9uLCBjb2xvckZvcm1hdCwgbWV0YU9ubHkpOwotCi0gICAgICAgIGlmIChmcmFtZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gZnJhbWU7CisgICAgICAgIFZpZGVvRnJhbWVEZWNvZGVyIGRlY29kZXIoY29tcG9uZW50TmFtZSwgdHJhY2tNZXRhLCBzb3VyY2UpOworICAgICAgICBpZiAoZGVjb2Rlci5pbml0KHRpbWVVcywgbnVtRnJhbWVzLCBvcHRpb24sIGNvbG9yRm9ybWF0KSA9PSBPSykgeworICAgICAgICAgICAgaWYgKG91dEZyYW1lICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAqb3V0RnJhbWUgPSBkZWNvZGVyLmV4dHJhY3RGcmFtZSgpOworICAgICAgICAgICAgICAgIGlmICgqb3V0RnJhbWUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChvdXRGcmFtZXMgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGRlY29kZXIuZXh0cmFjdEZyYW1lcyhvdXRGcmFtZXMpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBBTE9HVigiJXMgZmFpbGVkIHRvIGV4dHJhY3QgdGh1bWJuYWlsLCB0cnlpbmcgbmV4dCBkZWNvZGVyLiIsIGNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgIEFMT0dWKCIlcyBmYWlsZWQgdG8gZXh0cmFjdCBmcmFtZSwgdHJ5aW5nIG5leHQgZGVjb2Rlci4iLCBjb21wb25lbnROYW1lLmNfc3RyKCkpOwogICAgIH0KIAotICAgIHJldHVybiBOVUxMOworICAgIEFMT0dFKCJhbGwgY29kZWNzIGZhaWxlZCB0byBleHRyYWN0IGZyYW1lLiIpOworICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogfQogCiBNZWRpYUFsYnVtQXJ0ICpTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyOjpleHRyYWN0QWxidW1BcnQoKSB7CkBAIC03OTgsMTIgKzQ4MCwyNyBAQAogICAgICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9DQVBUVVJFX0ZSQU1FUkFURSwgU3RyaW5nOCh0bXApKTsKICAgICB9CiAKKyAgICBpbnQ2NF90IGV4aWZPZmZzZXQsIGV4aWZTaXplOworICAgIGlmIChtZXRhLT5maW5kSW50NjQoa0tleUV4aWZPZmZzZXQsICZleGlmT2Zmc2V0KQorICAgICAmJiBtZXRhLT5maW5kSW50NjQoa0tleUV4aWZTaXplLCAmZXhpZlNpemUpKSB7CisgICAgICAgIHNwcmludGYodG1wLCAiJWxsZCIsIChsb25nIGxvbmcpZXhpZk9mZnNldCk7CisgICAgICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX0VYSUZfT0ZGU0VULCBTdHJpbmc4KHRtcCkpOworICAgICAgICBzcHJpbnRmKHRtcCwgIiVsbGQiLCAobG9uZyBsb25nKWV4aWZTaXplKTsKKyAgICAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfRVhJRl9MRU5HVEgsIFN0cmluZzgodG1wKSk7CisgICAgfQorCiAgICAgYm9vbCBoYXNBdWRpbyA9IGZhbHNlOwogICAgIGJvb2wgaGFzVmlkZW8gPSBmYWxzZTsKICAgICBpbnQzMl90IHZpZGVvV2lkdGggPSAtMTsKICAgICBpbnQzMl90IHZpZGVvSGVpZ2h0ID0gLTE7CisgICAgaW50MzJfdCB2aWRlb0ZyYW1lQ291bnQgPSAwOwogICAgIGludDMyX3QgYXVkaW9CaXRyYXRlID0gLTE7CiAgICAgaW50MzJfdCByb3RhdGlvbkFuZ2xlID0gLTE7CisgICAgaW50MzJfdCBpbWFnZUNvdW50ID0gMDsKKyAgICBpbnQzMl90IGltYWdlUHJpbWFyeSA9IDA7CisgICAgaW50MzJfdCBpbWFnZVdpZHRoID0gLTE7CisgICAgaW50MzJfdCBpbWFnZUhlaWdodCA9IC0xOworICAgIGludDMyX3QgaW1hZ2VSb3RhdGlvbiA9IC0xOwogCiAgICAgLy8gVGhlIG92ZXJhbGwgZHVyYXRpb24gaXMgdGhlIGR1cmF0aW9uIG9mIHRoZSBsb25nZXN0IHRyYWNrLgogICAgIGludDY0X3QgbWF4RHVyYXRpb25VcyA9IDA7CkBAIC04MzQsNiArNTMxLDIxIEBACiAgICAgICAgICAgICAgICAgaWYgKCF0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5Um90YXRpb24sICZyb3RhdGlvbkFuZ2xlKSkgewogICAgICAgICAgICAgICAgICAgICByb3RhdGlvbkFuZ2xlID0gMDsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCF0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5RnJhbWVDb3VudCwgJnZpZGVvRnJhbWVDb3VudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdmlkZW9GcmFtZUNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcCgiaW1hZ2UvIiwgbWltZSwgNikpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGlzUHJpbWFyeTsKKyAgICAgICAgICAgICAgICBpZiAodHJhY2tNZXRhLT5maW5kSW50MzIoCisgICAgICAgICAgICAgICAgICAgICAgICBrS2V5VHJhY2tJc0RlZmF1bHQsICZpc1ByaW1hcnkpICYmIGlzUHJpbWFyeSkgeworICAgICAgICAgICAgICAgICAgICBpbWFnZVByaW1hcnkgPSBpbWFnZUNvdW50OworICAgICAgICAgICAgICAgICAgICBDSEVDSyh0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZpbWFnZVdpZHRoKSk7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZpbWFnZUhlaWdodCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlSb3RhdGlvbiwgJmltYWdlUm90YXRpb24pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZVJvdGF0aW9uID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbWFnZUNvdW50Kys7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1RFWFRfM0dQUCkpIHsKICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpsYW5nOwogICAgICAgICAgICAgICAgIGlmICh0cmFja01ldGEtPmZpbmRDU3RyaW5nKGtLZXlNZWRpYUxhbmd1YWdlLCAmbGFuZykpIHsKQEAgLTg3Miw2ICs1ODQsMzAgQEAKIAogICAgICAgICBzcHJpbnRmKHRtcCwgIiVkIiwgcm90YXRpb25BbmdsZSk7CiAgICAgICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX1ZJREVPX1JPVEFUSU9OLCBTdHJpbmc4KHRtcCkpOworCisgICAgICAgIGlmICh2aWRlb0ZyYW1lQ291bnQgPiAwKSB7CisgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIiVkIiwgdmlkZW9GcmFtZUNvdW50KTsKKyAgICAgICAgICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX1ZJREVPX0ZSQU1FX0NPVU5ULCBTdHJpbmc4KHRtcCkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGltYWdlQ291bnQgPiAwKSB7CisgICAgICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX0hBU19JTUFHRSwgU3RyaW5nOCgieWVzIikpOworCisgICAgICAgIHNwcmludGYodG1wLCAiJWQiLCBpbWFnZUNvdW50KTsKKyAgICAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfSU1BR0VfQ09VTlQsIFN0cmluZzgodG1wKSk7CisKKyAgICAgICAgc3ByaW50Zih0bXAsICIlZCIsIGltYWdlUHJpbWFyeSk7CisgICAgICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX0lNQUdFX1BSSU1BUlksIFN0cmluZzgodG1wKSk7CisKKyAgICAgICAgc3ByaW50Zih0bXAsICIlZCIsIGltYWdlV2lkdGgpOworICAgICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9JTUFHRV9XSURUSCwgU3RyaW5nOCh0bXApKTsKKworICAgICAgICBzcHJpbnRmKHRtcCwgIiVkIiwgaW1hZ2VIZWlnaHQpOworICAgICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9JTUFHRV9IRUlHSFQsIFN0cmluZzgodG1wKSk7CisKKyAgICAgICAgc3ByaW50Zih0bXAsICIlZCIsIGltYWdlUm90YXRpb24pOworICAgICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9JTUFHRV9ST1RBVElPTiwgU3RyaW5nOCh0bXApKTsKICAgICB9CiAKICAgICBpZiAobnVtVHJhY2tzID09IDEgJiYgaGFzQXVkaW8gJiYgYXVkaW9CaXRyYXRlID49IDApIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTllODcwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIuY3BwCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxkbGZjbi5oPgorCisjaW5jbHVkZSAiU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKiBzdGF0aWMgKi8gTXV0ZXggU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXI6OnNNdXRleDsKKy8qIHN0YXRpYyAqLyBzdGQ6OnVuaXF1ZV9wdHI8U3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXI+IFN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyOjpzSW5zdGFuY2U7CisKK1N0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyOjpTdGFnZWZyaWdodFBsdWdpbkxvYWRlcihjb25zdCBjaGFyICpsaWJQYXRoKQorICAgIDogbUNyZWF0ZUNvZGVjKG51bGxwdHIpLAorICAgICAgbUNyZWF0ZUJ1aWxkZXIobnVsbHB0cikgeworICAgIG1MaWJIYW5kbGUgPSBkbG9wZW4obGliUGF0aCwgUlRMRF9OT1cgfCBSVExEX05PREVMRVRFKTsKKyAgICBpZiAobUxpYkhhbmRsZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJGYWlsZWQgdG8gbG9hZCBsaWJyYXJ5OiAlcyAoJXMpIiwgbGliUGF0aCwgZGxlcnJvcigpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtQ3JlYXRlQ29kZWMgPSAoQ29kZWNCYXNlOjpDcmVhdGVDb2RlY0Z1bmMpZGxzeW0obUxpYkhhbmRsZSwgIkNyZWF0ZUNvZGVjIik7CisgICAgaWYgKG1DcmVhdGVDb2RlYyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJGYWlsZWQgdG8gZmluZCBzeW1ib2w6IENyZWF0ZUNvZGVjICglcykiLCBkbGVycm9yKCkpOworICAgIH0KKyAgICBtQ3JlYXRlQnVpbGRlciA9IChNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlOjpDcmVhdGVCdWlsZGVyRnVuYylkbHN5bSgKKyAgICAgICAgICAgIG1MaWJIYW5kbGUsICJDcmVhdGVCdWlsZGVyIik7CisgICAgaWYgKG1DcmVhdGVCdWlsZGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0QoIkZhaWxlZCB0byBmaW5kIHN5bWJvbDogQ3JlYXRlQnVpbGRlciAoJXMpIiwgZGxlcnJvcigpKTsKKyAgICB9CisgICAgbUNyZWF0ZUlucHV0U3VyZmFjZSA9IChDb2RlY0Jhc2U6OkNyZWF0ZUlucHV0U3VyZmFjZUZ1bmMpZGxzeW0oCisgICAgICAgICAgICBtTGliSGFuZGxlLCAiQ3JlYXRlSW5wdXRTdXJmYWNlIik7CisgICAgaWYgKG1DcmVhdGVCdWlsZGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0QoIkZhaWxlZCB0byBmaW5kIHN5bWJvbDogQ3JlYXRlSW5wdXRTdXJmYWNlICglcykiLCBkbGVycm9yKCkpOworICAgIH0KK30KKworU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXI6On5TdGFnZWZyaWdodFBsdWdpbkxvYWRlcigpIHsKKyAgICBpZiAobUxpYkhhbmRsZSAhPSBudWxscHRyKSB7CisgICAgICAgIEFMT0dWKCJDbG9zaW5nIGhhbmRsZSIpOworICAgICAgICBkbGNsb3NlKG1MaWJIYW5kbGUpOworICAgIH0KK30KKworQ29kZWNCYXNlICpTdGFnZWZyaWdodFBsdWdpbkxvYWRlcjo6Y3JlYXRlQ29kZWMoKSB7CisgICAgaWYgKG1MaWJIYW5kbGUgPT0gbnVsbHB0ciB8fCBtQ3JlYXRlQ29kZWMgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRCgiSGFuZGxlIG9yIENyZWF0ZUNvZGVjIHN5bWJvbCBpcyBudWxsIik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gbUNyZWF0ZUNvZGVjKCk7Cit9CisKK01lZGlhQ29kZWNMaXN0QnVpbGRlckJhc2UgKlN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyOjpjcmVhdGVCdWlsZGVyKCkgeworICAgIGlmIChtTGliSGFuZGxlID09IG51bGxwdHIgfHwgbUNyZWF0ZUJ1aWxkZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRCgiSGFuZGxlIG9yIENyZWF0ZUJ1aWxkZXIgc3ltYm9sIGlzIG51bGwiKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBtQ3JlYXRlQnVpbGRlcigpOworfQorCitQZXJzaXN0ZW50U3VyZmFjZSAqU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXI6OmNyZWF0ZUlucHV0U3VyZmFjZSgpIHsKKyAgICBpZiAobUxpYkhhbmRsZSA9PSBudWxscHRyIHx8IG1DcmVhdGVJbnB1dFN1cmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRCgiSGFuZGxlIG9yIENyZWF0ZUlucHV0U3VyZmFjZSBzeW1ib2wgaXMgbnVsbCIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIG1DcmVhdGVJbnB1dFN1cmZhY2UoKTsKK30KKworLy9zdGF0aWMKK2NvbnN0IHN0ZDo6dW5pcXVlX3B0cjxTdGFnZWZyaWdodFBsdWdpbkxvYWRlcj4gJlN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyOjpHZXRDQ29kZWNJbnN0YW5jZSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2woc011dGV4KTsKKyAgICBpZiAoIXNJbnN0YW5jZSkgeworICAgICAgICBBTE9HVigiTG9hZGluZyBsaWJyYXJ5Iik7CisgICAgICAgIHNJbnN0YW5jZS5yZXNldChuZXcgU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIoImxpYnN0YWdlZnJpZ2h0X2Njb2RlYy5zbyIpKTsKKyAgICB9CisgICAgcmV0dXJuIHNJbnN0YW5jZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodFBsdWdpbkxvYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5OWQzMGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodFBsdWdpbkxvYWRlci5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1RBR0VGUklHSFRfUExVR0lOX0xPQURFUl9IXworCisjZGVmaW5lIFNUQUdFRlJJR0hUX1BMVUdJTl9MT0FERVJfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0V3JpdGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvUGVyc2lzdGVudFN1cmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyPiAmR2V0Q0NvZGVjSW5zdGFuY2UoKTsKKyAgICB+U3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIoKTsKKworICAgIENvZGVjQmFzZSAqY3JlYXRlQ29kZWMoKTsKKyAgICBNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlICpjcmVhdGVCdWlsZGVyKCk7CisgICAgUGVyc2lzdGVudFN1cmZhY2UgKmNyZWF0ZUlucHV0U3VyZmFjZSgpOworCitwcml2YXRlOgorICAgIGV4cGxpY2l0IFN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyKGNvbnN0IGNoYXIgKmxpYlBhdGgpOworCisgICAgc3RhdGljIE11dGV4IHNNdXRleDsKKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyPiBzSW5zdGFuY2U7CisKKyAgICB2b2lkICptTGliSGFuZGxlOworICAgIENvZGVjQmFzZTo6Q3JlYXRlQ29kZWNGdW5jIG1DcmVhdGVDb2RlYzsKKyAgICBNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlOjpDcmVhdGVCdWlsZGVyRnVuYyBtQ3JlYXRlQnVpbGRlcjsKKyAgICBDb2RlY0Jhc2U6OkNyZWF0ZUlucHV0U3VyZmFjZUZ1bmMgbUNyZWF0ZUlucHV0U3VyZmFjZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gU1RBR0VGUklHSFRfUExVR0lOX0xPQURFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N1cmZhY2VNZWRpYVNvdXJjZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNGU4NmIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ3NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiU3VyZmFjZU1lZGlhU291cmNlIgotCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxPTVhfSVZDb21tb24uaD4KLSNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgotI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL01ldGFkYXRhQnVmZmVyVHlwZS5oPgotCi0jaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgotI2luY2x1ZGUgPGd1aS9CdWZmZXJJdGVtLmg+Ci0jaW5jbHVkZSA8Z3VpL0lTdXJmYWNlQ29tcG9zZXIuaD4KLSNpbmNsdWRlIDxPTVhfQ29tcG9uZW50Lmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0KLSNpbmNsdWRlIDxwcml2YXRlL2d1aS9Db21wb3NlclNlcnZpY2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1TdXJmYWNlTWVkaWFTb3VyY2U6OlN1cmZhY2VNZWRpYVNvdXJjZSh1aW50MzJfdCBidWZmZXJXaWR0aCwgdWludDMyX3QgYnVmZmVySGVpZ2h0KSA6Ci0gICAgbVdpZHRoKGJ1ZmZlcldpZHRoKSwKLSAgICBtSGVpZ2h0KGJ1ZmZlckhlaWdodCksCi0gICAgbUN1cnJlbnRTbG90KEJ1ZmZlclF1ZXVlOjpJTlZBTElEX0JVRkZFUl9TTE9UKSwKLSAgICBtTnVtUGVuZGluZ0J1ZmZlcnMoMCksCi0gICAgbUN1cnJlbnRUaW1lc3RhbXAoMCksCi0gICAgbUZyYW1lUmF0ZSgzMCksCi0gICAgbVN0YXJ0ZWQoZmFsc2UpLAotICAgIG1OdW1GcmFtZXNSZWNlaXZlZCgwKSwKLSAgICBtTnVtRnJhbWVzRW5jb2RlZCgwKSwKLSAgICBtRmlyc3RGcmFtZVRpbWVzdGFtcCgwKSwKLSAgICBtTWF4QWNxdWlyZWRCdWZmZXJDb3VudCg0KSwgIC8vIFhYWCBkb3VibGUtY2hlY2sgdGhlIGRlZmF1bHQKLSAgICBtVXNlQWJzb2x1dGVUaW1lc3RhbXBzKGZhbHNlKSB7Ci0gICAgQUxPR1YoIlN1cmZhY2VNZWRpYVNvdXJjZSIpOwotCi0gICAgaWYgKGJ1ZmZlcldpZHRoID09IDAgfHwgYnVmZmVySGVpZ2h0ID09IDApIHsKLSAgICAgICAgQUxPR0UoIkludmFsaWQgZGltZW5zaW9ucyAlZHglZCIsIGJ1ZmZlcldpZHRoLCBidWZmZXJIZWlnaHQpOwotICAgIH0KLQotICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmbVByb2R1Y2VyLCAmbUNvbnN1bWVyKTsKLSAgICBtQ29uc3VtZXItPnNldERlZmF1bHRCdWZmZXJTaXplKGJ1ZmZlcldpZHRoLCBidWZmZXJIZWlnaHQpOwotICAgIG1Db25zdW1lci0+c2V0Q29uc3VtZXJVc2FnZUJpdHMoR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSIHwKLSAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfSFdfVEVYVFVSRSk7Ci0KLSAgICBzcDxJU3VyZmFjZUNvbXBvc2VyPiBjb21wb3NlcihDb21wb3NlclNlcnZpY2U6OmdldENvbXBvc2VyU2VydmljZSgpKTsKLQotICAgIC8vIE5vdGUgdGhhdCB3ZSBjYW4ndCBjcmVhdGUgYW4gc3A8Li4uPih0aGlzKSBpbiBhIGN0b3IgdGhhdCB3aWxsIG5vdCBrZWVwIGEKLSAgICAvLyByZWZlcmVuY2Ugb25jZSB0aGUgY3RvciBlbmRzLCBhcyB0aGF0IHdvdWxkIGNhdXNlIHRoZSByZWZjb3VudCBvZiAndGhpcycKLSAgICAvLyBkcm9wcGluZyB0byAwIGF0IHRoZSBlbmQgb2YgdGhlIGN0b3IuICBTaW5jZSBhbGwgd2UgbmVlZCBpcyBhIHdwPC4uLj4KLSAgICAvLyB0aGF0J3Mgd2hhdCB3ZSBjcmVhdGUuCi0gICAgd3A8Q29uc3VtZXJMaXN0ZW5lcj4gbGlzdGVuZXIgPSBzdGF0aWNfY2FzdDxDb25zdW1lckxpc3RlbmVyKj4odGhpcyk7Ci0gICAgc3A8QnVmZmVyUXVldWU6OlByb3h5Q29uc3VtZXJMaXN0ZW5lcj4gcHJveHkgPSBuZXcgQnVmZmVyUXVldWU6OlByb3h5Q29uc3VtZXJMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBtQ29uc3VtZXItPmNvbnN1bWVyQ29ubmVjdChwcm94eSwgZmFsc2UpOwotICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoIlN1cmZhY2VNZWRpYVNvdXJjZTogZXJyb3IgY29ubmVjdGluZyB0byBCdWZmZXJRdWV1ZTogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIGVycik7Ci0gICAgfQotfQotCi1TdXJmYWNlTWVkaWFTb3VyY2U6On5TdXJmYWNlTWVkaWFTb3VyY2UoKSB7Ci0gICAgQUxPR1YoIn5TdXJmYWNlTWVkaWFTb3VyY2UiKTsKLSAgICBDSEVDSyghbVN0YXJ0ZWQpOwotfQotCi1uc2Vjc190IFN1cmZhY2VNZWRpYVNvdXJjZTo6Z2V0VGltZXN0YW1wKCkgewotICAgIEFMT0dWKCJnZXRUaW1lc3RhbXAiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotICAgIHJldHVybiBtQ3VycmVudFRpbWVzdGFtcDsKLX0KLQotdm9pZCBTdXJmYWNlTWVkaWFTb3VyY2U6OnNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIoCi0gICAgICAgIGNvbnN0IHNwPEZyYW1lQXZhaWxhYmxlTGlzdGVuZXI+JiBsaXN0ZW5lcikgewotICAgIEFMT0dWKCJzZXRGcmFtZUF2YWlsYWJsZUxpc3RlbmVyIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLSAgICBtRnJhbWVBdmFpbGFibGVMaXN0ZW5lciA9IGxpc3RlbmVyOwotfQotCi12b2lkIFN1cmZhY2VNZWRpYVNvdXJjZTo6ZHVtcFN0YXRlKFN0cmluZzgmIHJlc3VsdCkgY29uc3QKLXsKLSAgICBjaGFyIGJ1ZmZlclsxMDI0XTsKLSAgICBkdW1wU3RhdGUocmVzdWx0LCAiIiwgYnVmZmVyLCAxMDI0KTsKLX0KLQotdm9pZCBTdXJmYWNlTWVkaWFTb3VyY2U6OmR1bXBTdGF0ZSgKLSAgICAgICAgU3RyaW5nOCYgcmVzdWx0LAotICAgICAgICBjb25zdCBjaGFyKiAvKiBwcmVmaXggKi8sCi0gICAgICAgIGNoYXIqIGJ1ZmZlciwKLSAgICAgICAgc2l6ZV90IC8qIFNJWkUgKi8pIGNvbnN0Ci17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLQotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBtQ29uc3VtZXItPmR1bXBTdGF0ZShyZXN1bHQsICIiKTsKLX0KLQotc3RhdHVzX3QgU3VyZmFjZU1lZGlhU291cmNlOjpzZXRGcmFtZVJhdGUoaW50MzJfdCBmcHMpCi17Ci0gICAgQUxPR1YoInNldEZyYW1lUmF0ZSIpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0gICAgY29uc3QgaW50IE1BWF9GUkFNRV9SQVRFID0gNjA7Ci0gICAgaWYgKGZwcyA8IDAgfHwgZnBzID4gTUFYX0ZSQU1FX1JBVEUpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgbUZyYW1lUmF0ZSA9IGZwczsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLU1ldGFkYXRhQnVmZmVyVHlwZSBTdXJmYWNlTWVkaWFTb3VyY2U6Om1ldGFEYXRhU3RvcmVkSW5WaWRlb0J1ZmZlcnMoKSBjb25zdCB7Ci0gICAgQUxPR1YoImlzTWV0YURhdGFTdG9yZWRJblZpZGVvQnVmZmVycyIpOwotICAgIHJldHVybiBrTWV0YWRhdGFCdWZmZXJUeXBlQU5XQnVmZmVyOwotfQotCi1pbnQzMl90IFN1cmZhY2VNZWRpYVNvdXJjZTo6Z2V0RnJhbWVSYXRlKCApIGNvbnN0IHsKLSAgICBBTE9HVigiZ2V0RnJhbWVSYXRlIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLSAgICByZXR1cm4gbUZyYW1lUmF0ZTsKLX0KLQotc3RhdHVzX3QgU3VyZmFjZU1lZGlhU291cmNlOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKQotewotICAgIEFMT0dWKCJzdGFydCIpOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLQotICAgIENIRUNLKCFtU3RhcnRlZCk7Ci0KLSAgICBtU3RhcnRUaW1lTnMgPSAwOwotICAgIGludDY0X3Qgc3RhcnRUaW1lVXM7Ci0gICAgaW50MzJfdCBidWZmZXJDb3VudCA9IDA7Ci0gICAgaWYgKHBhcmFtcykgewotICAgICAgICBpZiAocGFyYW1zLT5maW5kSW50NjQoa0tleVRpbWUsICZzdGFydFRpbWVVcykpIHsKLSAgICAgICAgICAgIG1TdGFydFRpbWVOcyA9IHN0YXJ0VGltZVVzICogMTAwMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghcGFyYW1zLT5maW5kSW50MzIoa0tleU51bUJ1ZmZlcnMsICZidWZmZXJDb3VudCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZmluZCB0aGUgYWR2ZXJ0aXNlZCBidWZmZXIgY291bnQiKTsKLSAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJ1ZmZlckNvdW50IDw9IDEpIHsKLSAgICAgICAgICAgIEFMT0dFKCJidWZmZXJDb3VudCAlZCBpcyB0b28gc21hbGwiLCBidWZmZXJDb3VudCk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0KLSAgICAgICAgbU1heEFjcXVpcmVkQnVmZmVyQ291bnQgPSBidWZmZXJDb3VudDsKLSAgICB9Ci0KLSAgICBDSEVDS19HVChtTWF4QWNxdWlyZWRCdWZmZXJDb3VudCwgMXUpOwotCi0gICAgc3RhdHVzX3QgZXJyID0KLSAgICAgICAgbUNvbnN1bWVyLT5zZXRNYXhBY3F1aXJlZEJ1ZmZlckNvdW50KG1NYXhBY3F1aXJlZEJ1ZmZlckNvdW50KTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBtTnVtUGVuZGluZ0J1ZmZlcnMgPSAwOwotICAgIG1TdGFydGVkID0gdHJ1ZTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3VyZmFjZU1lZGlhU291cmNlOjpzZXRNYXhBY3F1aXJlZEJ1ZmZlckNvdW50KHNpemVfdCBjb3VudCkgewotICAgIEFMT0dWKCJzZXRNYXhBY3F1aXJlZEJ1ZmZlckNvdW50KCV6dSkiLCBjb3VudCk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLQotICAgIENIRUNLX0dUKGNvdW50LCAxdSk7Ci0gICAgbU1heEFjcXVpcmVkQnVmZmVyQ291bnQgPSBjb3VudDsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3VyZmFjZU1lZGlhU291cmNlOjpzZXRVc2VBYnNvbHV0ZVRpbWVzdGFtcHMoKSB7Ci0gICAgQUxPR1YoInNldFVzZUFic29sdXRlVGltZXN0YW1wcyIpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0gICAgbVVzZUFic29sdXRlVGltZXN0YW1wcyA9IHRydWU7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN1cmZhY2VNZWRpYVNvdXJjZTo6c3RvcCgpCi17Ci0gICAgQUxPR1YoInN0b3AiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotCi0gICAgaWYgKCFtU3RhcnRlZCkgewotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICBtRnJhbWVBdmFpbGFibGVDb25kaXRpb24uc2lnbmFsKCk7Ci0KLSAgICB3aGlsZSAobU51bVBlbmRpbmdCdWZmZXJzID4gMCkgewotICAgICAgICBBTE9HSSgiU3RpbGwgd2FpdGluZyBmb3IgJXp1IGJ1ZmZlcnMgdG8gYmUgcmV0dXJuZWQuIiwKLSAgICAgICAgICAgICAgICBtTnVtUGVuZGluZ0J1ZmZlcnMpOwotCi0jaWYgREVCVUdfUEVORElOR19CVUZGRVJTCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBlbmRpbmdCdWZmZXJzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICBBTE9HSSgiJWQ6ICVwIiwgaSwgbVBlbmRpbmdCdWZmZXJzLml0ZW1BdChpKSk7Ci0gICAgICAgIH0KLSNlbmRpZgotCi0gICAgICAgIG1NZWRpYUJ1ZmZlcnNBdmFpbGFibGVDb25kaXRpb24ud2FpdChtTXV0ZXgpOwotICAgIH0KLQotICAgIG1NZWRpYUJ1ZmZlcnNBdmFpbGFibGVDb25kaXRpb24uc2lnbmFsKCk7Ci0KLSAgICByZXR1cm4gbUNvbnN1bWVyLT5jb25zdW1lckRpc2Nvbm5lY3QoKTsKLX0KLQotc3A8TWV0YURhdGE+IFN1cmZhY2VNZWRpYVNvdXJjZTo6Z2V0Rm9ybWF0KCkKLXsKLSAgICBBTE9HVigiZ2V0Rm9ybWF0Iik7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOwotCi0gICAgbWV0YS0+c2V0SW50MzIoa0tleVdpZHRoLCBtV2lkdGgpOwotICAgIG1ldGEtPnNldEludDMyKGtLZXlIZWlnaHQsIG1IZWlnaHQpOwotICAgIC8vIFRoZSBlbmNvZGVyIGZvcm1hdCBpcyBzZXQgYXMgYW4gb3BhcXVlIGNvbG9yZm9ybWF0Ci0gICAgLy8gVGhlIGVuY29kZXIgd2lsbCBsYXRlciBmaW5kIG91dCB0aGUgYWN0dWFsIGNvbG9yZm9ybWF0Ci0gICAgLy8gZnJvbSB0aGUgR0wgRnJhbWVzIGl0c2VsZi4KLSAgICBtZXRhLT5zZXRJbnQzMihrS2V5Q29sb3JGb3JtYXQsIE9NWF9DT0xPUl9Gb3JtYXRBbmRyb2lkT3BhcXVlKTsKLSAgICBtZXRhLT5zZXRJbnQzMihrS2V5U3RyaWRlLCBtV2lkdGgpOwotICAgIG1ldGEtPnNldEludDMyKGtLZXlTbGljZUhlaWdodCwgbUhlaWdodCk7Ci0gICAgbWV0YS0+c2V0SW50MzIoa0tleUZyYW1lUmF0ZSwgbUZyYW1lUmF0ZSk7Ci0gICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX1JBVyk7Ci0gICAgcmV0dXJuIG1ldGE7Ci19Ci0KLS8vIFBhc3MgdGhlIGRhdGEgdG8gdGhlIE1lZGlhQnVmZmVyLiBQYXNzIGluIG9ubHkgdGhlIG1ldGFkYXRhCi0vLyBOb3RlOiBDYWxsIG9ubHkgd2hlbiB5b3UgaGF2ZSB0aGUgbG9jawotdm9pZCBTdXJmYWNlTWVkaWFTb3VyY2U6OnBhc3NNZXRhZGF0YUJ1ZmZlcl9sKE1lZGlhQnVmZmVyICoqYnVmZmVyLAotICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyICpidWZmZXJIYW5kbGUpIGNvbnN0IHsKLSAgICAqYnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKHNpemVvZihWaWRlb05hdGl2ZU1ldGFkYXRhKSk7Ci0gICAgVmlkZW9OYXRpdmVNZXRhZGF0YSAqZGF0YSA9IChWaWRlb05hdGl2ZU1ldGFkYXRhICopKCpidWZmZXIpLT5kYXRhKCk7Ci0gICAgaWYgKGRhdGEgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgbWV0YWRhdGEgYnVmZmVyISIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGRhdGEtPmVUeXBlID0gbWV0YURhdGFTdG9yZWRJblZpZGVvQnVmZmVycygpOwotICAgIGRhdGEtPnBCdWZmZXIgPSBidWZmZXJIYW5kbGU7Ci0gICAgZGF0YS0+bkZlbmNlRmQgPSAtMTsKLSAgICBBTE9HVigiaGFuZGxlID0gJXAsIG9mZnNldCA9ICV6dSwgbGVuZ3RoID0gJXp1IiwKLSAgICAgICAgICAgIGJ1ZmZlckhhbmRsZSwgKCpidWZmZXIpLT5yYW5nZV9sZW5ndGgoKSwgKCpidWZmZXIpLT5yYW5nZV9vZmZzZXQoKSk7Ci19Ci0KLXN0YXR1c190IFN1cmZhY2VNZWRpYVNvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICogLyogb3B0aW9ucyAqLykgewotICAgIEFMT0dWKCJyZWFkIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLQotICAgICpidWZmZXIgPSBOVUxMOwotCi0gICAgd2hpbGUgKG1TdGFydGVkICYmIG1OdW1QZW5kaW5nQnVmZmVycyA9PSBtTWF4QWNxdWlyZWRCdWZmZXJDb3VudCkgewotICAgICAgICBtTWVkaWFCdWZmZXJzQXZhaWxhYmxlQ29uZGl0aW9uLndhaXQobU11dGV4KTsKLSAgICB9Ci0KLSAgICAvLyBVcGRhdGUgdGhlIGN1cnJlbnQgYnVmZmVyIGluZm8KLSAgICAvLyBUT0RPOiBtQ3VycmVudFNsb3QgY2FuIGJlIG1hZGUgYSBidWZmZXJzdGF0ZSBzaW5jZSB0aGVyZQotICAgIC8vIGNhbiBiZSBtb3JlIHRoYW4gb25lICJjdXJyZW50IiBzbG90cy4KLQotICAgIEJ1ZmZlckl0ZW0gaXRlbTsKLSAgICAvLyBJZiB0aGUgcmVjb3JkaW5nIGhhcyBzdGFydGVkIGFuZCB0aGUgcXVldWUgaXMgZW1wdHksIHRoZW4ganVzdAotICAgIC8vIHdhaXQgaGVyZSB0aWxsIHRoZSBmcmFtZXMgY29tZSBpbiBmcm9tIHRoZSBjbGllbnQgc2lkZQotICAgIHdoaWxlIChtU3RhcnRlZCkgewotCi0gICAgICAgIHN0YXR1c190IGVyciA9IG1Db25zdW1lci0+YWNxdWlyZUJ1ZmZlcigmaXRlbSwgMCk7Ci0gICAgICAgIGlmIChlcnIgPT0gQnVmZmVyUXVldWU6Ok5PX0JVRkZFUl9BVkFJTEFCTEUpIHsKLSAgICAgICAgICAgIC8vIHdhaXQgZm9yIGEgYnVmZmVyIHRvIGJlIHF1ZXVlZAotICAgICAgICAgICAgbUZyYW1lQXZhaWxhYmxlQ29uZGl0aW9uLndhaXQobU11dGV4KTsKLSAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgIGVyciA9IGl0ZW0ubUZlbmNlLT53YWl0Rm9yZXZlcigiU3VyZmFjZU1lZGlhU291cmNlOjpyZWFkIik7Ci0gICAgICAgICAgICBpZiAoZXJyKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coInJlYWQ6IGZhaWxlZCB0byB3YWl0IGZvciBidWZmZXIgZmVuY2U6ICVkIiwgZXJyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gRmlyc3QgdGltZSBzZWVpbmcgdGhlIGJ1ZmZlcj8gIEFkZGVkIGl0IHRvIHRoZSBTTVMgc2xvdAotICAgICAgICAgICAgaWYgKGl0ZW0ubUdyYXBoaWNCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIG1TbG90c1tpdGVtLm1TbG90XS5tR3JhcGhpY0J1ZmZlciA9IGl0ZW0ubUdyYXBoaWNCdWZmZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtU2xvdHNbaXRlbS5tU2xvdF0ubUZyYW1lTnVtYmVyID0gaXRlbS5tRnJhbWVOdW1iZXI7Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIGZvciB0aGUgdGltaW5nIG9mIHRoaXMgYnVmZmVyCi0gICAgICAgICAgICBpZiAobU51bUZyYW1lc1JlY2VpdmVkID09IDAgJiYgIW1Vc2VBYnNvbHV0ZVRpbWVzdGFtcHMpIHsKLSAgICAgICAgICAgICAgICBtRmlyc3RGcmFtZVRpbWVzdGFtcCA9IGl0ZW0ubVRpbWVzdGFtcDsKLSAgICAgICAgICAgICAgICAvLyBJbml0aWFsIGRlbGF5Ci0gICAgICAgICAgICAgICAgaWYgKG1TdGFydFRpbWVOcyA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0ubVRpbWVzdGFtcCA8IG1TdGFydFRpbWVOcykgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBmcmFtZSBwcmVkYXRlcyBzdGFydCBvZiByZWNvcmQsIGRpc2NhcmQKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db25zdW1lci0+cmVsZWFzZUJ1ZmZlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5tU2xvdCwgaXRlbS5tRnJhbWVOdW1iZXIsIEVHTF9OT19ESVNQTEFZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xfTk9fU1lOQ19LSFIsIEZlbmNlOjpOT19GRU5DRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lTnMgPSBpdGVtLm1UaW1lc3RhbXAgLSBtU3RhcnRUaW1lTnM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaXRlbS5tVGltZXN0YW1wID0gbVN0YXJ0VGltZU5zICsgKGl0ZW0ubVRpbWVzdGFtcCAtIG1GaXJzdEZyYW1lVGltZXN0YW1wKTsKLQotICAgICAgICAgICAgbU51bUZyYW1lc1JlY2VpdmVkKys7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoInJlYWQ6IGFjcXVpcmUgZmFpbGVkIHdpdGggZXJyb3IgY29kZSAlZCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLy8gSWYgdGhlIGxvb3Agd2FzIGV4aXRlZCBhcyBhIHJlc3VsdCBvZiBzdG9wcGluZyB0aGUgcmVjb3JkaW5nLAotICAgIC8vIGl0IGlzIE9LCi0gICAgaWYgKCFtU3RhcnRlZCkgewotICAgICAgICBBTE9HVigiUmVhZDogU3VyZmFjZU1lZGlhU291cmNlIGlzIHN0b3BwZWQuIFJldHVybmluZyBFUlJPUl9FTkRfT0ZfU1RSRUFNLiIpOwotICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICB9Ci0KLSAgICBtQ3VycmVudFNsb3QgPSBpdGVtLm1TbG90OwotCi0gICAgLy8gRmlyc3QgdGltZSBzZWVpbmcgdGhlIGJ1ZmZlcj8gIEFkZGVkIGl0IHRvIHRoZSBTTVMgc2xvdAotICAgIGlmIChpdGVtLm1HcmFwaGljQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgbVNsb3RzW2l0ZW0ubVNsb3RdLm1HcmFwaGljQnVmZmVyID0gaXRlbS5tR3JhcGhpY0J1ZmZlcjsKLSAgICB9Ci0gICAgbVNsb3RzW2l0ZW0ubVNsb3RdLm1GcmFtZU51bWJlciA9IGl0ZW0ubUZyYW1lTnVtYmVyOwotCi0gICAgbUN1cnJlbnRCdWZmZXJzLnB1c2hfYmFjayhtU2xvdHNbbUN1cnJlbnRTbG90XS5tR3JhcGhpY0J1ZmZlcik7Ci0gICAgaW50NjRfdCBwcmV2VGltZVN0YW1wID0gbUN1cnJlbnRUaW1lc3RhbXA7Ci0gICAgbUN1cnJlbnRUaW1lc3RhbXAgPSBpdGVtLm1UaW1lc3RhbXA7Ci0KLSAgICBtTnVtRnJhbWVzRW5jb2RlZCsrOwotICAgIC8vIFBhc3MgdGhlIGRhdGEgdG8gdGhlIE1lZGlhQnVmZmVyLiBQYXNzIGluIG9ubHkgdGhlIG1ldGFkYXRhCi0KLSAgICBwYXNzTWV0YWRhdGFCdWZmZXJfbChidWZmZXIsIG1TbG90c1ttQ3VycmVudFNsb3RdLm1HcmFwaGljQnVmZmVyLT5nZXROYXRpdmVCdWZmZXIoKSk7Ci0KLSAgICAoKmJ1ZmZlciktPnNldE9ic2VydmVyKHRoaXMpOwotICAgICgqYnVmZmVyKS0+YWRkX3JlZigpOwotICAgICgqYnVmZmVyKS0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCBtQ3VycmVudFRpbWVzdGFtcCAvIDEwMDApOwotICAgIEFMT0dWKCJGcmFtZXMgZW5jb2RlZCA9ICVkLCB0aW1lc3RhbXAgPSAlIiBQUklkNjQgIiwgdGltZSBkaWZmID0gJSIgUFJJZDY0LAotICAgICAgICAgICAgbU51bUZyYW1lc0VuY29kZWQsIG1DdXJyZW50VGltZXN0YW1wIC8gMTAwMCwKLSAgICAgICAgICAgIG1DdXJyZW50VGltZXN0YW1wIC8gMTAwMCAtIHByZXZUaW1lU3RhbXAgLyAxMDAwKTsKLQotICAgICsrbU51bVBlbmRpbmdCdWZmZXJzOwotCi0jaWYgREVCVUdfUEVORElOR19CVUZGRVJTCi0gICAgbVBlbmRpbmdCdWZmZXJzLnB1c2hfYmFjaygqYnVmZmVyKTsKLSNlbmRpZgotCi0gICAgQUxPR1YoInJldHVybmluZyBtYnVmICVwIiwgKmJ1ZmZlcik7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXRpYyBidWZmZXJfaGFuZGxlX3QgZ2V0TWVkaWFCdWZmZXJIYW5kbGUoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgewotICAgIC8vIG5lZWQgdG8gY29udmVydCB0byBjaGFyKiBmb3IgcG9pbnRlciBhcml0aG1ldGljIGFuZCB0aGVuCi0gICAgLy8gY29weSB0aGUgYnl0ZSBzdHJlYW0gaW50byBvdXIgaGFuZGxlCi0gICAgYnVmZmVyX2hhbmRsZV90IGJ1ZmZlckhhbmRsZTsKLSAgICBtZW1jcHkoJmJ1ZmZlckhhbmRsZSwgKGNoYXIqKShidWZmZXItPmRhdGEoKSkgKyA0LCBzaXplb2YoYnVmZmVyX2hhbmRsZV90KSk7Ci0gICAgcmV0dXJuIGJ1ZmZlckhhbmRsZTsKLX0KLQotdm9pZCBTdXJmYWNlTWVkaWFTb3VyY2U6OnNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyICpidWZmZXIpIHsKLSAgICBBTE9HVigic2lnbmFsQnVmZmVyUmV0dXJuZWQiKTsKLQotICAgIGJvb2wgZm91bmRCdWZmZXIgPSBmYWxzZTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0KLSAgICBidWZmZXJfaGFuZGxlX3QgYnVmZmVySGFuZGxlID0gZ2V0TWVkaWFCdWZmZXJIYW5kbGUoYnVmZmVyKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUN1cnJlbnRCdWZmZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChtQ3VycmVudEJ1ZmZlcnNbaV0tPmhhbmRsZSA9PSBidWZmZXJIYW5kbGUpIHsKLSAgICAgICAgICAgIG1DdXJyZW50QnVmZmVycy5yZW1vdmVBdChpKTsKLSAgICAgICAgICAgIGZvdW5kQnVmZmVyID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFmb3VuZEJ1ZmZlcikgewotICAgICAgICBBTE9HVygicmV0dXJuZWQgYnVmZmVyIHdhcyBub3QgZm91bmQgaW4gdGhlIGN1cnJlbnQgYnVmZmVyIGxpc3QiKTsKLSAgICB9Ci0KLSAgICBmb3IgKGludCBpZCA9IDA7IGlkIDwgQnVmZmVyUXVldWU6Ok5VTV9CVUZGRVJfU0xPVFM7IGlkKyspIHsKLSAgICAgICAgaWYgKG1TbG90c1tpZF0ubUdyYXBoaWNCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYnVmZmVySGFuZGxlID09IG1TbG90c1tpZF0ubUdyYXBoaWNCdWZmZXItPmhhbmRsZSkgewotICAgICAgICAgICAgQUxPR1YoIlNsb3QgJWQgcmV0dXJuZWQsIG1hdGNoZXMgaGFuZGxlID0gJXAiLCBpZCwKLSAgICAgICAgICAgICAgICAgICAgbVNsb3RzW2lkXS5tR3JhcGhpY0J1ZmZlci0+aGFuZGxlKTsKLQotICAgICAgICAgICAgbUNvbnN1bWVyLT5yZWxlYXNlQnVmZmVyKGlkLCBtU2xvdHNbaWRdLm1GcmFtZU51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xfTk9fRElTUExBWSwgRUdMX05PX1NZTkNfS0hSLAotICAgICAgICAgICAgICAgICAgICBGZW5jZTo6Tk9fRkVOQ0UpOwotCi0gICAgICAgICAgICBidWZmZXItPnNldE9ic2VydmVyKDApOwotICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7Ci0KLSAgICAgICAgICAgIGZvdW5kQnVmZmVyID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFmb3VuZEJ1ZmZlcikgewotICAgICAgICBDSEVDSyghInNpZ25hbEJ1ZmZlclJldHVybmVkOiBib2d1cyBidWZmZXIiKTsKLSAgICB9Ci0KLSNpZiBERUJVR19QRU5ESU5HX0JVRkZFUlMKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QZW5kaW5nQnVmZmVycy5zaXplKCk7ICsraSkgewotICAgICAgICBpZiAobVBlbmRpbmdCdWZmZXJzLml0ZW1BdChpKSA9PSBidWZmZXIpIHsKLSAgICAgICAgICAgIG1QZW5kaW5nQnVmZmVycy5yZW1vdmVBdChpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotI2VuZGlmCi0KLSAgICAtLW1OdW1QZW5kaW5nQnVmZmVyczsKLSAgICBtTWVkaWFCdWZmZXJzQXZhaWxhYmxlQ29uZGl0aW9uLmJyb2FkY2FzdCgpOwotfQotCi0vLyBQYXJ0IG9mIHRoZSBCdWZmZXJRdWV1ZTo6Q29uc3VtZXJMaXN0ZW5lcgotdm9pZCBTdXJmYWNlTWVkaWFTb3VyY2U6Om9uRnJhbWVBdmFpbGFibGUoY29uc3QgQnVmZmVySXRlbSYgLyogaXRlbSAqLykgewotICAgIEFMT0dWKCJvbkZyYW1lQXZhaWxhYmxlIik7Ci0KLSAgICBzcDxGcmFtZUF2YWlsYWJsZUxpc3RlbmVyPiBsaXN0ZW5lcjsKLSAgICB7IC8vIHNjb3BlIGZvciB0aGUgbG9jawotICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotICAgICAgICBtRnJhbWVBdmFpbGFibGVDb25kaXRpb24uYnJvYWRjYXN0KCk7Ci0gICAgICAgIGxpc3RlbmVyID0gbUZyYW1lQXZhaWxhYmxlTGlzdGVuZXI7Ci0gICAgfQotCi0gICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoImFjdHVhbGx5IGNhbGxpbmcgb25GcmFtZUF2YWlsYWJsZSIpOwotICAgICAgICBsaXN0ZW5lci0+b25GcmFtZUF2YWlsYWJsZSgpOwotICAgIH0KLX0KLQotLy8gU3VyZmFjZU1lZGlhU291cmNlIGhpamFja3MgdGhpcyBldmVudCB0byBhc3N1bWUKLS8vIHRoZSBwcm9kY3VlciBpcyBkaXNjb25uZWN0aW5nIGZyb20gdGhlIEJ1ZmZlclF1ZXVlCi0vLyBhbmQgdGhhdCBpdCBzaG91bGQgc3RvcCB0aGUgcmVjb3JkaW5nCi12b2lkIFN1cmZhY2VNZWRpYVNvdXJjZTo6b25CdWZmZXJzUmVsZWFzZWQoKSB7Ci0gICAgQUxPR1YoIm9uQnVmZmVyc1JlbGVhc2VkIik7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotCi0gICAgbUZyYW1lQXZhaWxhYmxlQ29uZGl0aW9uLnNpZ25hbCgpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBCdWZmZXJRdWV1ZTo6TlVNX0JVRkZFUl9TTE9UUzsgaSsrKSB7Ci0gICAgICAgbVNsb3RzW2ldLm1HcmFwaGljQnVmZmVyID0gMDsKLSAgICB9Ci19Ci0KLXZvaWQgU3VyZmFjZU1lZGlhU291cmNlOjpvblNpZGViYW5kU3RyZWFtQ2hhbmdlZCgpIHsKLSAgICBBTE9HX0FTU0VSVChmYWxzZSwgIlN1cmZhY2VNZWRpYVNvdXJjZSBjYW4ndCBjb25zdW1lIHNpZGViYW5kIHN0cmVhbXMiKTsKLX0KLQotfSAvLyBlbmQgb2YgbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdXJmYWNlVXRpbHMuY3BwCmluZGV4IGI3YzE1OTguLjllMTFhOTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3VyZmFjZVV0aWxzLmNwcApAQCAtMTgsOCArMTgsOCBAQAogI2RlZmluZSBMT0dfVEFHICJTdXJmYWNlVXRpbHMiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9WaWRlb0FQSS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5oPgotCiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMTI4LDYgKzEyOCw0MCBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAordm9pZCBzZXROYXRpdmVXaW5kb3dIZHJNZXRhZGF0YShBTmF0aXZlV2luZG93ICpuYXRpdmVXaW5kb3csIEhEUlN0YXRpY0luZm8gKmluZm8pIHsKKyAgICBzdHJ1Y3QgYW5kcm9pZF9zbXB0ZTIwODZfbWV0YWRhdGEgc21wdGUyMDg2X21ldGEgPSB7CisgICAgICAgICAgICAuZGlzcGxheVByaW1hcnlSZWQgPSB7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPnNUeXBlMS5tUi54ICogMC4wMDAwMmYsCisgICAgICAgICAgICAgICAgICAgIGluZm8tPnNUeXBlMS5tUi55ICogMC4wMDAwMmYKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAuZGlzcGxheVByaW1hcnlHcmVlbiA9IHsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+c1R5cGUxLm1HLnggKiAwLjAwMDAyZiwKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+c1R5cGUxLm1HLnkgKiAwLjAwMDAyZgorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIC5kaXNwbGF5UHJpbWFyeUJsdWUgPSB7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPnNUeXBlMS5tQi54ICogMC4wMDAwMmYsCisgICAgICAgICAgICAgICAgICAgIGluZm8tPnNUeXBlMS5tQi55ICogMC4wMDAwMmYKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAud2hpdGVQb2ludCA9IHsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+c1R5cGUxLm1XLnggKiAwLjAwMDAyZiwKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+c1R5cGUxLm1XLnkgKiAwLjAwMDAyZgorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIC5tYXhMdW1pbmFuY2UgPSAoZmxvYXQpIGluZm8tPnNUeXBlMS5tTWF4RGlzcGxheUx1bWluYW5jZSwKKyAgICAgICAgICAgIC5taW5MdW1pbmFuY2UgPSBpbmZvLT5zVHlwZTEubU1pbkRpc3BsYXlMdW1pbmFuY2UgKiAwLjAwMDFmCisgICAgfTsKKworICAgIGludCBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3NtcHRlMjA4Nl9tZXRhZGF0YShuYXRpdmVXaW5kb3csICZzbXB0ZTIwODZfbWV0YSk7CisgICAgQUxPR1dfSUYoZXJyICE9IDAsICJmYWlsZWQgdG8gc2V0IHNtcHRlMjA4NiBtZXRhZGF0YSBvbiBzdXJmYWNlICglZCkiLCBlcnIpOworCisgICAgc3RydWN0IGFuZHJvaWRfY3RhODYxXzNfbWV0YWRhdGEgY3RhODYxX21ldGEgPSB7CisgICAgICAgICAgICAubWF4Q29udGVudExpZ2h0TGV2ZWwgPSAoZmxvYXQpIGluZm8tPnNUeXBlMS5tTWF4Q29udGVudExpZ2h0TGV2ZWwsCisgICAgICAgICAgICAubWF4RnJhbWVBdmVyYWdlTGlnaHRMZXZlbCA9IChmbG9hdCkgaW5mby0+c1R5cGUxLm1NYXhGcmFtZUF2ZXJhZ2VMaWdodExldmVsCisgICAgfTsKKworICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfY3RhODYxXzNfbWV0YWRhdGEobmF0aXZlV2luZG93LCAmY3RhODYxX21ldGEpOworICAgIEFMT0dXX0lGKGVyciAhPSAwLCAiZmFpbGVkIHRvIHNldCBjdGE4NjFfMyBtZXRhZGF0YSBvbiBzdXJmYWNlICglZCkiLCBlcnIpOworfQorCiBzdGF0dXNfdCBwdXNoQmxhbmtCdWZmZXJzVG9OYXRpdmVXaW5kb3coQU5hdGl2ZVdpbmRvdyAqbmF0aXZlV2luZG93IC8qIG5vbm51bGwgKi8pIHsKICAgICBzdGF0dXNfdCBlcnIgPSBOT19FUlJPUjsKICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBhbmIgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVXRpbHMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVXRpbHMuY3BwCmluZGV4IDNlZjhmMmEuLmNmNWU5MWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAKQEAgLTI3LDcgKzI3LDYgQEAKICNpbmNsdWRlICJpbmNsdWRlL0VTRFMuaCIKICNpbmNsdWRlICJpbmNsdWRlL0hldmNVdGlscy5oIgogCi0jaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9BdWRpby5oPgogI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX1ZpZGVvLmg+CkBAIC0zNyw2ICszNiw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29rdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CkBAIC00NywzOSArNDcsNiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXVpbnQxNl90IFUxNl9BVChjb25zdCB1aW50OF90ICpwdHIpIHsKLSAgICByZXR1cm4gcHRyWzBdIDw8IDggfCBwdHJbMV07Ci19Ci0KLXVpbnQzMl90IFUzMl9BVChjb25zdCB1aW50OF90ICpwdHIpIHsKLSAgICByZXR1cm4gcHRyWzBdIDw8IDI0IHwgcHRyWzFdIDw8IDE2IHwgcHRyWzJdIDw8IDggfCBwdHJbM107Ci19Ci0KLXVpbnQ2NF90IFU2NF9BVChjb25zdCB1aW50OF90ICpwdHIpIHsKLSAgICByZXR1cm4gKCh1aW50NjRfdClVMzJfQVQocHRyKSkgPDwgMzIgfCBVMzJfQVQocHRyICsgNCk7Ci19Ci0KLXVpbnQxNl90IFUxNkxFX0FUKGNvbnN0IHVpbnQ4X3QgKnB0cikgewotICAgIHJldHVybiBwdHJbMF0gfCAocHRyWzFdIDw8IDgpOwotfQotCi11aW50MzJfdCBVMzJMRV9BVChjb25zdCB1aW50OF90ICpwdHIpIHsKLSAgICByZXR1cm4gcHRyWzNdIDw8IDI0IHwgcHRyWzJdIDw8IDE2IHwgcHRyWzFdIDw8IDggfCBwdHJbMF07Ci19Ci0KLXVpbnQ2NF90IFU2NExFX0FUKGNvbnN0IHVpbnQ4X3QgKnB0cikgewotICAgIHJldHVybiAoKHVpbnQ2NF90KVUzMkxFX0FUKHB0ciArIDQpKSA8PCAzMiB8IFUzMkxFX0FUKHB0cik7Ci19Ci0KLS8vIFhYWCB3YXJuaW5nOiB0aGVzZSB3b24ndCB3b3JrIG9uIGJpZy1lbmRpYW4gaG9zdC4KLXVpbnQ2NF90IG50b2g2NCh1aW50NjRfdCB4KSB7Ci0gICAgcmV0dXJuICgodWludDY0X3QpbnRvaGwoeCAmIDB4ZmZmZmZmZmYpIDw8IDMyKSB8IG50b2hsKHggPj4gMzIpOwotfQotCi11aW50NjRfdCBodG9uNjQodWludDY0X3QgeCkgewotICAgIHJldHVybiAoKHVpbnQ2NF90KWh0b25sKHggJiAweGZmZmZmZmZmKSA8PCAzMikgfCBodG9ubCh4ID4+IDMyKTsKLX0KLQogc3RhdGljIHN0YXR1c190IGNvcHlOQUxVVG9BQnVmZmVyKHNwPEFCdWZmZXI+ICpidWZmZXIsIGNvbnN0IHVpbnQ4X3QgKnB0ciwgc2l6ZV90IGxlbmd0aCkgewogICAgIGlmICgoKCpidWZmZXIpLT5zaXplKCkgKyA0ICsgbGVuZ3RoKSA+ICgoKmJ1ZmZlciktPmNhcGFjaXR5KCkgLSAoKmJ1ZmZlciktPm9mZnNldCgpKSkgewogICAgICAgICBzcDxBQnVmZmVyPiB0bXBCdWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgQUJ1ZmZlcigoKmJ1ZmZlciktPnNpemUoKSArIDQgKyBsZW5ndGggKyAxMDI0KTsKQEAgLTE4Nyw2ICsxNTQsNyBAQAogICAgICAgICB7IDIzLCBPTVhfQVVESU9fQUFDT2JqZWN0TEQgICAgICAgfSwKICAgICAgICAgeyAyOSwgT01YX0FVRElPX0FBQ09iamVjdEhFX1BTICAgIH0sCiAgICAgICAgIHsgMzksIE9NWF9BVURJT19BQUNPYmplY3RFTEQgICAgICB9LAorICAgICAgICB7IDQyLCBPTVhfQVVESU9fQUFDT2JqZWN0WEhFICAgICAgfSwKICAgICB9OwogCiAgICAgT01YX0FVRElPX0FBQ1BST0ZJTEVUWVBFIHByb2ZpbGU7CkBAIC0zMzYsNiArMzA0LDggQEAKICAgICBjb25zdCBzdGF0aWMgQUxvb2t1cDx1aW50OF90LCBPTVhfVklERU9fSEVWQ1BST0ZJTEVUWVBFPiBwcm9maWxlcyB7CiAgICAgICAgIHsgMSwgT01YX1ZJREVPX0hFVkNQcm9maWxlTWFpbiAgIH0sCiAgICAgICAgIHsgMiwgT01YX1ZJREVPX0hFVkNQcm9maWxlTWFpbjEwIH0sCisgICAgICAgIC8vIHVzZSBNYWluIGZvciBNYWluIFN0aWxsIFBpY3R1cmUgZGVjb2RpbmcKKyAgICAgICAgeyAzLCBPTVhfVklERU9fSEVWQ1Byb2ZpbGVNYWluIH0sCiAgICAgfTsKIAogICAgIC8vIHNldCBwcm9maWxlICYgbGV2ZWwgaWYgdGhleSBhcmUgcmVjb2duaXplZApAQCAtMzQzLDYgKzMxMyw3IEBACiAgICAgT01YX1ZJREVPX0hFVkNMRVZFTFRZUEUgY29kZWNMZXZlbDsKICAgICBpZiAoIXByb2ZpbGVzLm1hcChwcm9maWxlLCAmY29kZWNQcm9maWxlKSkgewogICAgICAgICBpZiAocHRyWzJdICYgMHg0MCAvKiBnZW5lcmFsIGNvbXBhdGliaWxpdHkgZmxhZyAxICovKSB7CisgICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBjYXNlIGNvdmVycyBNYWluIFN0aWxsIFBpY3R1cmUgdG9vCiAgICAgICAgICAgICBjb2RlY1Byb2ZpbGUgPSBPTVhfVklERU9fSEVWQ1Byb2ZpbGVNYWluOwogICAgICAgICB9IGVsc2UgaWYgKHB0clsyXSAmIDB4MjAgLyogZ2VuZXJhbCBjb21wYXRpYmlsaXR5IGZsYWcgMiAqLykgewogICAgICAgICAgICAgY29kZWNQcm9maWxlID0gT01YX1ZJREVPX0hFVkNQcm9maWxlTWFpbjEwOwpAQCAtNjcyLDcgKzY0Myw4IEBACiAgICAgICAgIG1zZy0+c2V0U3RyaW5nKCJsYW5ndWFnZSIsIGxhbmcpOwogICAgIH0KIAotICAgIGlmICghc3RybmNhc2VjbXAoInZpZGVvLyIsIG1pbWUsIDYpKSB7CisgICAgaWYgKCFzdHJuY2FzZWNtcCgidmlkZW8vIiwgbWltZSwgNikgfHwKKyAgICAgICAgICAgICFzdHJuY2FzZWNtcCgiaW1hZ2UvIiwgbWltZSwgNikpIHsKICAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OwogICAgICAgICBpZiAoIW1ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZ3aWR0aCkKICAgICAgICAgICAgICAgICB8fCAhbWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZoZWlnaHQpKSB7CkBAIC02OTYsNiArNjY4LDIzIEBACiAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJzYXItaGVpZ2h0Iiwgc2FySGVpZ2h0KTsKICAgICAgICAgfQogCisgICAgICAgIGlmICghc3RybmNhc2VjbXAoImltYWdlLyIsIG1pbWUsIDYpKSB7CisgICAgICAgICAgICBpbnQzMl90IHRpbGVXaWR0aCwgdGlsZUhlaWdodCwgZ3JpZFJvd3MsIGdyaWRDb2xzOworICAgICAgICAgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5VGlsZVdpZHRoLCAmdGlsZVdpZHRoKQorICAgICAgICAgICAgICAgICAgICAmJiBtZXRhLT5maW5kSW50MzIoa0tleVRpbGVIZWlnaHQsICZ0aWxlSGVpZ2h0KQorICAgICAgICAgICAgICAgICAgICAmJiBtZXRhLT5maW5kSW50MzIoa0tleUdyaWRSb3dzLCAmZ3JpZFJvd3MpCisgICAgICAgICAgICAgICAgICAgICYmIG1ldGEtPmZpbmRJbnQzMihrS2V5R3JpZENvbHMsICZncmlkQ29scykpIHsKKyAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJ0aWxlLXdpZHRoIiwgdGlsZVdpZHRoKTsKKyAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJ0aWxlLWhlaWdodCIsIHRpbGVIZWlnaHQpOworICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImdyaWQtcm93cyIsIGdyaWRSb3dzKTsKKyAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJncmlkLWNvbHMiLCBncmlkQ29scyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQzMl90IGlzUHJpbWFyeTsKKyAgICAgICAgICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleVRyYWNrSXNEZWZhdWx0LCAmaXNQcmltYXJ5KSAmJiBpc1ByaW1hcnkpIHsKKyAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJpcy1kZWZhdWx0IiwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBpbnQzMl90IGNvbG9yRm9ybWF0OwogICAgICAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlDb2xvckZvcm1hdCwgJmNvbG9yRm9ybWF0KSkgewogICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiY29sb3ItZm9ybWF0IiwgY29sb3JGb3JtYXQpOwpAQCAtMTMyNyw3ICsxMzE2LDcgQEAKICAgICAgICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5TWVkaWFMYW5ndWFnZSwgbGFuZy5jX3N0cigpKTsKICAgICB9CiAKLSAgICBpZiAobWltZS5zdGFydHNXaXRoKCJ2aWRlby8iKSkgeworICAgIGlmIChtaW1lLnN0YXJ0c1dpdGgoInZpZGVvLyIpIHx8IG1pbWUuc3RhcnRzV2l0aCgiaW1hZ2UvIikpIHsKICAgICAgICAgaW50MzJfdCB3aWR0aDsKICAgICAgICAgaW50MzJfdCBoZWlnaHQ7CiAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpICYmIG1zZy0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSkgewpAQCAtMTM1MSw2ICsxMzQwLDI2IEBACiAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5RGlzcGxheUhlaWdodCwgZGlzcGxheUhlaWdodCk7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAobWltZS5zdGFydHNXaXRoKCJpbWFnZS8iKSl7CisgICAgICAgICAgICBpbnQzMl90IGlzUHJpbWFyeTsKKyAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiaXMtZGVmYXVsdCIsICZpc1ByaW1hcnkpICYmIGlzUHJpbWFyeSkgeworICAgICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlUcmFja0lzRGVmYXVsdCwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQzMl90IHRpbGVXaWR0aCwgdGlsZUhlaWdodCwgZ3JpZFJvd3MsIGdyaWRDb2xzOworICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJ0aWxlLXdpZHRoIiwgJnRpbGVXaWR0aCkpIHsKKyAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5VGlsZVdpZHRoLCB0aWxlV2lkdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJ0aWxlLWhlaWdodCIsICZ0aWxlSGVpZ2h0KSkgeworICAgICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlUaWxlSGVpZ2h0LCB0aWxlSGVpZ2h0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiZ3JpZC1yb3dzIiwgJmdyaWRSb3dzKSkgeworICAgICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlHcmlkUm93cywgZ3JpZFJvd3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJncmlkLWNvbHMiLCAmZ3JpZENvbHMpKSB7CisgICAgICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUdyaWRDb2xzLCBncmlkQ29scyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBpbnQzMl90IGNvbG9yRm9ybWF0OwogICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZjb2xvckZvcm1hdCkpIHsKICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlDb2xvckZvcm1hdCwgY29sb3JGb3JtYXQpOwpAQCAtMTQ2Nyw3ICsxNDc2LDggQEAKICAgICAgICAgICAgIC8vIGZvciB0cmFuc3BvcnRpbmcgdGhlIENTRCB0byBtdXhlcnMuCiAgICAgICAgICAgICByZWFzc2VtYmxlRVNEUyhjc2QwLCBlc2RzLmRhdGEoKSk7CiAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlFU0RTLCBrS2V5RVNEUywgZXNkcy5kYXRhKCksIGVzZHMuc2l6ZSgpKTsKLSAgICAgICAgfSBlbHNlIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpIHsKKyAgICAgICAgfSBlbHNlIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMgfHwKKyAgICAgICAgICAgICAgICAgICBtaW1lID09IE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQykgewogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gaHZjYyhjc2Qwc2l6ZSArIDEwMjQpOwogICAgICAgICAgICAgc2l6ZV90IG91dHNpemUgPSByZWFzc2VtYmxlSFZDQyhjc2QwLCBodmNjLmRhdGEoKSwgaHZjYy5zaXplKCksIDQpOwogICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5SFZDQywga0tleUhWQ0MsIGh2Y2MuZGF0YSgpLCBvdXRzaXplKTsKQEAgLTE2MDEsNiArMTYxMSw3IEBACiAgICAgeyBPTVhfQVVESU9fQUFDT2JqZWN0TEQsICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfTER9LAogICAgIHsgT01YX0FVRElPX0FBQ09iamVjdEhFX1BTLCAgICAgICBBVURJT19GT1JNQVRfQUFDX0hFX1YyfSwKICAgICB7IE9NWF9BVURJT19BQUNPYmplY3RFTEQsICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19FTER9LAorICAgIHsgT01YX0FVRElPX0FBQ09iamVjdFhIRSwgICAgICAgICBBVURJT19GT1JNQVRfQUFDX1hIRX0sCiAgICAgeyBPTVhfQVVESU9fQUFDT2JqZWN0TnVsbCwgICAgICAgIEFVRElPX0ZPUk1BVF9BQUN9LAogfTsKIApAQCAtMTgwOSw0MSArMTgyMCwxNyBAQAogfQogCiB2b2lkIHdyaXRlVG9BTWVzc2FnZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MgJmJ1ZmZlcmluZykgewotICAgIG1zZy0+c2V0SW50MzIoImluaXQtbW9kZSIsIGJ1ZmZlcmluZy5tSW5pdGlhbEJ1ZmZlcmluZ01vZGUpOwotICAgIG1zZy0+c2V0SW50MzIoInJlYnVmZmVyLW1vZGUiLCBidWZmZXJpbmcubVJlYnVmZmVyaW5nTW9kZSk7Ci0gICAgbXNnLT5zZXRJbnQzMigiaW5pdC1tcyIsIGJ1ZmZlcmluZy5tSW5pdGlhbFdhdGVybWFya01zKTsKLSAgICBtc2ctPnNldEludDMyKCJpbml0LWtiIiwgYnVmZmVyaW5nLm1Jbml0aWFsV2F0ZXJtYXJrS0IpOwotICAgIG1zZy0+c2V0SW50MzIoInJlYnVmZmVyLWxvdy1tcyIsIGJ1ZmZlcmluZy5tUmVidWZmZXJpbmdXYXRlcm1hcmtMb3dNcyk7Ci0gICAgbXNnLT5zZXRJbnQzMigicmVidWZmZXItaGlnaC1tcyIsIGJ1ZmZlcmluZy5tUmVidWZmZXJpbmdXYXRlcm1hcmtIaWdoTXMpOwotICAgIG1zZy0+c2V0SW50MzIoInJlYnVmZmVyLWxvdy1rYiIsIGJ1ZmZlcmluZy5tUmVidWZmZXJpbmdXYXRlcm1hcmtMb3dLQik7Ci0gICAgbXNnLT5zZXRJbnQzMigicmVidWZmZXItaGlnaC1rYiIsIGJ1ZmZlcmluZy5tUmVidWZmZXJpbmdXYXRlcm1hcmtIaWdoS0IpOworICAgIG1zZy0+c2V0SW50MzIoImluaXQtbXMiLCBidWZmZXJpbmcubUluaXRpYWxNYXJrTXMpOworICAgIG1zZy0+c2V0SW50MzIoInJlc3VtZS1wbGF5YmFjay1tcyIsIGJ1ZmZlcmluZy5tUmVzdW1lUGxheWJhY2tNYXJrTXMpOwogfQogCiB2b2lkIHJlYWRGcm9tQU1lc3NhZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIEJ1ZmZlcmluZ1NldHRpbmdzICpidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgewogICAgIGludDMyX3QgdmFsdWU7Ci0gICAgaWYgKG1zZy0+ZmluZEludDMyKCJpbml0LW1vZGUiLCAmdmFsdWUpKSB7Ci0gICAgICAgIGJ1ZmZlcmluZy0+bUluaXRpYWxCdWZmZXJpbmdNb2RlID0gKEJ1ZmZlcmluZ01vZGUpdmFsdWU7Ci0gICAgfQotICAgIGlmIChtc2ctPmZpbmRJbnQzMigicmVidWZmZXItbW9kZSIsICZ2YWx1ZSkpIHsKLSAgICAgICAgYnVmZmVyaW5nLT5tUmVidWZmZXJpbmdNb2RlID0gKEJ1ZmZlcmluZ01vZGUpdmFsdWU7Ci0gICAgfQogICAgIGlmIChtc2ctPmZpbmRJbnQzMigiaW5pdC1tcyIsICZ2YWx1ZSkpIHsKLSAgICAgICAgYnVmZmVyaW5nLT5tSW5pdGlhbFdhdGVybWFya01zID0gdmFsdWU7CisgICAgICAgIGJ1ZmZlcmluZy0+bUluaXRpYWxNYXJrTXMgPSB2YWx1ZTsKICAgICB9Ci0gICAgaWYgKG1zZy0+ZmluZEludDMyKCJpbml0LWtiIiwgJnZhbHVlKSkgewotICAgICAgICBidWZmZXJpbmctPm1Jbml0aWFsV2F0ZXJtYXJrS0IgPSB2YWx1ZTsKLSAgICB9Ci0gICAgaWYgKG1zZy0+ZmluZEludDMyKCJyZWJ1ZmZlci1sb3ctbXMiLCAmdmFsdWUpKSB7Ci0gICAgICAgIGJ1ZmZlcmluZy0+bVJlYnVmZmVyaW5nV2F0ZXJtYXJrTG93TXMgPSB2YWx1ZTsKLSAgICB9Ci0gICAgaWYgKG1zZy0+ZmluZEludDMyKCJyZWJ1ZmZlci1oaWdoLW1zIiwgJnZhbHVlKSkgewotICAgICAgICBidWZmZXJpbmctPm1SZWJ1ZmZlcmluZ1dhdGVybWFya0hpZ2hNcyA9IHZhbHVlOwotICAgIH0KLSAgICBpZiAobXNnLT5maW5kSW50MzIoInJlYnVmZmVyLWxvdy1rYiIsICZ2YWx1ZSkpIHsKLSAgICAgICAgYnVmZmVyaW5nLT5tUmVidWZmZXJpbmdXYXRlcm1hcmtMb3dLQiA9IHZhbHVlOwotICAgIH0KLSAgICBpZiAobXNnLT5maW5kSW50MzIoInJlYnVmZmVyLWhpZ2gta2IiLCAmdmFsdWUpKSB7Ci0gICAgICAgIGJ1ZmZlcmluZy0+bVJlYnVmZmVyaW5nV2F0ZXJtYXJrSGlnaEtCID0gdmFsdWU7CisgICAgaWYgKG1zZy0+ZmluZEludDMyKCJyZXN1bWUtcGxheWJhY2stbXMiLCAmdmFsdWUpKSB7CisgICAgICAgIGJ1ZmZlcmluZy0+bVJlc3VtZVBsYXliYWNrTWFya01zID0gdmFsdWU7CiAgICAgfQogfQogCkBAIC0xODc5LDEzICsxODY2LDUgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi12b2lkIE1ha2VGb3VyQ0NTdHJpbmcodWludDMyX3QgeCwgY2hhciAqcykgewotICAgIHNbMF0gPSB4ID4+IDI0OwotICAgIHNbMV0gPSAoeCA+PiAxNikgJiAweGZmOwotICAgIHNbMl0gPSAoeCA+PiA4KSAmIDB4ZmY7Ci0gICAgc1szXSA9IHggJiAweGZmOwotICAgIHNbNF0gPSAnXDAnOwotfQotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9WQlJJU2Vla2VyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZCUklTZWVrZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjhmMjNhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZCUklTZWVrZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIlZCUklTZWVrZXIiCi0KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJpbmNsdWRlL1ZCUklTZWVrZXIuaCIKLQotI2luY2x1ZGUgImluY2x1ZGUvYXZjX3V0aWxzLmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9NUDNFeHRyYWN0b3IuaCIKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RhdGljIHVpbnQzMl90IFUyNF9BVChjb25zdCB1aW50OF90ICpwdHIpIHsKLSAgICByZXR1cm4gcHRyWzBdIDw8IDE2IHwgcHRyWzFdIDw8IDggfCBwdHJbMl07Ci19Ci0KLS8vIHN0YXRpYwotc3A8VkJSSVNlZWtlcj4gVkJSSVNlZWtlcjo6Q3JlYXRlRnJvbVNvdXJjZSgKLSAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgb2ZmNjRfdCBwb3N0X2lkM19wb3MpIHsKLSAgICBvZmY2NF90IHBvcyA9IHBvc3RfaWQzX3BvczsKLQotICAgIHVpbnQ4X3QgaGVhZGVyWzRdOwotICAgIHNzaXplX3QgbiA9IHNvdXJjZS0+cmVhZEF0KHBvcywgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSk7Ci0gICAgaWYgKG4gPCAoc3NpemVfdClzaXplb2YoaGVhZGVyKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCB0bXAgPSBVMzJfQVQoJmhlYWRlclswXSk7Ci0gICAgc2l6ZV90IGZyYW1lU2l6ZTsKLSAgICBpbnQgc2FtcGxlUmF0ZTsKLSAgICBpZiAoIUdldE1QRUdBdWRpb0ZyYW1lU2l6ZSh0bXAsICZmcmFtZVNpemUsICZzYW1wbGVSYXRlKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICAvLyBWQlJJIGhlYWRlciBmb2xsb3dzIDMyIGJ5dGVzIGFmdGVyIHRoZSBoZWFkZXIgX2VuZHNfLgotICAgIHBvcyArPSBzaXplb2YoaGVhZGVyKSArIDMyOwotCi0gICAgdWludDhfdCB2YnJpSGVhZGVyWzI2XTsKLSAgICBuID0gc291cmNlLT5yZWFkQXQocG9zLCB2YnJpSGVhZGVyLCBzaXplb2YodmJyaUhlYWRlcikpOwotICAgIGlmIChuIDwgKHNzaXplX3Qpc2l6ZW9mKHZicmlIZWFkZXIpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGlmIChtZW1jbXAodmJyaUhlYWRlciwgIlZCUkkiLCA0KSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBzaXplX3QgbnVtRnJhbWVzID0gVTMyX0FUKCZ2YnJpSGVhZGVyWzE0XSk7Ci0KLSAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPQotICAgICAgICBudW1GcmFtZXMgKiAxMDAwMDAwbGwgKiAoc2FtcGxlUmF0ZSA+PSAzMjAwMCA/IDExNTIgOiA1NzYpIC8gc2FtcGxlUmF0ZTsKLQotICAgIEFMT0dWKCJkdXJhdGlvbiA9ICUuMmYgc2VjcyIsIGR1cmF0aW9uVXMgLyAxRTYpOwotCi0gICAgc2l6ZV90IG51bUVudHJpZXMgPSBVMTZfQVQoJnZicmlIZWFkZXJbMThdKTsKLSAgICBzaXplX3QgZW50cnlTaXplID0gVTE2X0FUKCZ2YnJpSGVhZGVyWzIyXSk7Ci0gICAgc2l6ZV90IHNjYWxlID0gVTE2X0FUKCZ2YnJpSGVhZGVyWzIwXSk7Ci0KLSAgICBBTE9HVigiJXp1IGVudHJpZXMsIHNjYWxlPSV6dSwgc2l6ZV9wZXJfZW50cnk9JXp1IiwKLSAgICAgICAgIG51bUVudHJpZXMsCi0gICAgICAgICBzY2FsZSwKLSAgICAgICAgIGVudHJ5U2l6ZSk7Ci0KLSAgICBpZiAoZW50cnlTaXplID4gNCkgewotICAgICAgICBBTE9HRSgiaW52YWxpZCBWQlJJIGVudHJ5IHNpemU6ICV6dSIsIGVudHJ5U2l6ZSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHNwPFZCUklTZWVrZXI+IHNlZWtlciA9IG5ldyAoc3RkOjpub3Rocm93KSBWQlJJU2Vla2VyOwotICAgIGlmIChzZWVrZXIgPT0gTlVMTCkgewotICAgICAgICBBTE9HVygiQ291bGRuJ3QgYWxsb2NhdGUgVkJSSVNlZWtlciIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBzaXplX3QgdG90YWxFbnRyeVNpemUgPSBudW1FbnRyaWVzICogZW50cnlTaXplOwotICAgIHVpbnQ4X3QgKmJ1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSB1aW50OF90W3RvdGFsRW50cnlTaXplXTsKLSAgICBpZiAoIWJ1ZmZlcikgewotICAgICAgICBBTE9HVygiQ291bGRuJ3QgYWxsb2NhdGUgJXp1IGJ5dGVzIiwgdG90YWxFbnRyeVNpemUpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBuID0gc291cmNlLT5yZWFkQXQocG9zICsgc2l6ZW9mKHZicmlIZWFkZXIpLCBidWZmZXIsIHRvdGFsRW50cnlTaXplKTsKLSAgICBpZiAobiA8IChzc2l6ZV90KXRvdGFsRW50cnlTaXplKSB7Ci0gICAgICAgIGRlbGV0ZVtdIGJ1ZmZlcjsKLSAgICAgICAgYnVmZmVyID0gTlVMTDsKLQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBzZWVrZXItPm1CYXNlUG9zID0gcG9zdF9pZDNfcG9zICsgZnJhbWVTaXplOwotICAgIC8vIG9ubHkgdXBkYXRlIG1EdXJhdGlvblVzIGlmIHRoZSBjYWxjdWxhdGVkIGR1cmF0aW9uIGlzIHZhbGlkIChub24gemVybykKLSAgICAvLyBvdGhlcndpc2UsIGxlYXZlIGR1cmF0aW9uIGF0IC0xIHNvIHRoYXQgZ2V0RHVyYXRpb24oKSBhbmQgZ2V0T2Zmc2V0Rm9yVGltZSgpCi0gICAgLy8gcmV0dXJuIGZhbHNlIHdoZW4gY2FsbGVkLCB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgdmJyaSB0YWcgZG9lcyBub3QgaGF2ZSB0aGUKLSAgICAvLyByZXF1ZXN0ZWQgaW5mb3JtYXRpb24KLSAgICBpZiAoZHVyYXRpb25VcykgewotICAgICAgICBzZWVrZXItPm1EdXJhdGlvblVzID0gZHVyYXRpb25VczsKLSAgICB9Ci0KLSAgICBvZmY2NF90IG9mZnNldCA9IHBvc3RfaWQzX3BvczsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUVudHJpZXM7ICsraSkgewotICAgICAgICB1aW50MzJfdCBudW1CeXRlczsKLSAgICAgICAgc3dpdGNoIChlbnRyeVNpemUpIHsKLSAgICAgICAgICAgIGNhc2UgMTogbnVtQnl0ZXMgPSBidWZmZXJbaV07IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyOiBudW1CeXRlcyA9IFUxNl9BVChidWZmZXIgKyAyICogaSk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAzOiBudW1CeXRlcyA9IFUyNF9BVChidWZmZXIgKyAzICogaSk7IGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDSEVDS19FUShlbnRyeVNpemUsIDR1KTsKLSAgICAgICAgICAgICAgICBudW1CeXRlcyA9IFUzMl9BVChidWZmZXIgKyA0ICogaSk7IGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbnVtQnl0ZXMgKj0gc2NhbGU7Ci0KLSAgICAgICAgc2Vla2VyLT5tU2VnbWVudHMucHVzaChudW1CeXRlcyk7Ci0KLSAgICAgICAgQUxPR1YoImVudHJ5ICMlenU6ICV1IG9mZnNldCAlIzAxNmxseCIsIGksIG51bUJ5dGVzLCAobG9uZyBsb25nKW9mZnNldCk7Ci0gICAgICAgIG9mZnNldCArPSBudW1CeXRlczsKLSAgICB9Ci0KLSAgICBkZWxldGVbXSBidWZmZXI7Ci0gICAgYnVmZmVyID0gTlVMTDsKLQotICAgIEFMT0dJKCJGb3VuZCBWQlJJIGhlYWRlci4iKTsKLQotICAgIHJldHVybiBzZWVrZXI7Ci19Ci0KLVZCUklTZWVrZXI6OlZCUklTZWVrZXIoKQotICAgIDogbUR1cmF0aW9uVXMoLTEpIHsKLX0KLQotYm9vbCBWQlJJU2Vla2VyOjpnZXREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzKSB7Ci0gICAgaWYgKG1EdXJhdGlvblVzIDwgMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgKmR1cmF0aW9uVXMgPSBtRHVyYXRpb25VczsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFZCUklTZWVrZXI6OmdldE9mZnNldEZvclRpbWUoaW50NjRfdCAqdGltZVVzLCBvZmY2NF90ICpwb3MpIHsKLSAgICBpZiAobUR1cmF0aW9uVXMgPCAwIHx8IG1TZWdtZW50cy5zaXplKCkgPT0gMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaW50NjRfdCBzZWdtZW50RHVyYXRpb25VcyA9IG1EdXJhdGlvblVzIC8gbVNlZ21lbnRzLnNpemUoKTsKLQotICAgIGludDY0X3Qgbm93VXMgPSAwOwotICAgICpwb3MgPSBtQmFzZVBvczsKLSAgICBzaXplX3Qgc2VnbWVudEluZGV4ID0gMDsKLSAgICB3aGlsZSAoc2VnbWVudEluZGV4IDwgbVNlZ21lbnRzLnNpemUoKSAmJiBub3dVcyA8ICp0aW1lVXMpIHsKLSAgICAgICAgbm93VXMgKz0gc2VnbWVudER1cmF0aW9uVXM7Ci0gICAgICAgICpwb3MgKz0gbVNlZ21lbnRzLml0ZW1BdChzZWdtZW50SW5kZXgrKyk7Ci0gICAgfQotCi0gICAgQUxPR1YoImdldE9mZnNldEZvclRpbWUgJWxsZCB1cyA9PiAweCUwMTZsbHgiLCAobG9uZyBsb25nKSp0aW1lVXMsIChsb25nIGxvbmcpKnBvcyk7Ci0KLSAgICAqdGltZVVzID0gbm93VXM7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvV0FWRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1dBVkV4dHJhY3Rvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MGI3NDYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvV0FWRXh0cmFjdG9yLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU3MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJXQVZFeHRyYWN0b3IiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJpbmNsdWRlL1dBVkV4dHJhY3Rvci5oIgotCi0jaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL2JpdG9wcy5oPgotCi0jZGVmaW5lIENIQU5ORUxfTUFTS19VU0VfQ0hBTk5FTF9PUkRFUiAwCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotZW51bSB7Ci0gICAgV0FWRV9GT1JNQVRfUENNICAgICAgICA9IDB4MDAwMSwKLSAgICBXQVZFX0ZPUk1BVF9JRUVFX0ZMT0FUID0gMHgwMDAzLAotICAgIFdBVkVfRk9STUFUX0FMQVcgICAgICAgPSAweDAwMDYsCi0gICAgV0FWRV9GT1JNQVRfTVVMQVcgICAgICA9IDB4MDAwNywKLSAgICBXQVZFX0ZPUk1BVF9NU0dTTSAgICAgID0gMHgwMDMxLAotICAgIFdBVkVfRk9STUFUX0VYVEVOU0lCTEUgPSAweEZGRkUKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyKiBXQVZFRVhUX1NVQkZPUk1BVCA9ICJceDAwXHgwMFx4MDBceDAwXHgxMFx4MDBceDgwXHgwMFx4MDBceEFBXHgwMFx4MzhceDlCXHg3MSI7Ci1zdGF0aWMgY29uc3QgY2hhciogQU1CSVNPTklDX1NVQkZPUk1BVCA9ICJceDAwXHgwMFx4MjFceDA3XHhEM1x4MTFceDg2XHg0NFx4QzhceEMxXHhDQVx4MDBceDAwXHgwMCI7Ci0KLXN0YXRpYyB1aW50MzJfdCBVMzJfTEVfQVQoY29uc3QgdWludDhfdCAqcHRyKSB7Ci0gICAgcmV0dXJuIHB0clszXSA8PCAyNCB8IHB0clsyXSA8PCAxNiB8IHB0clsxXSA8PCA4IHwgcHRyWzBdOwotfQotCi1zdGF0aWMgdWludDE2X3QgVTE2X0xFX0FUKGNvbnN0IHVpbnQ4X3QgKnB0cikgewotICAgIHJldHVybiBwdHJbMV0gPDwgOCB8IHB0clswXTsKLX0KLQotc3RydWN0IFdBVlNvdXJjZSA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7Ci0gICAgV0FWU291cmNlKAotICAgICAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJmRhdGFTb3VyY2UsCi0gICAgICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEsCi0gICAgICAgICAgICB1aW50MTZfdCB3YXZlRm9ybWF0LAotICAgICAgICAgICAgaW50MzJfdCBiaXRzUGVyU2FtcGxlLAotICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydE5vbmJsb2NraW5nUmVhZCgpIHsgcmV0dXJuIHRydWU7IH0KLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfldBVlNvdXJjZSgpOwotCi1wcml2YXRlOgotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heEZyYW1lU2l6ZTsKLQotICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOwotICAgIHNwPE1ldGFEYXRhPiBtTWV0YTsKLSAgICB1aW50MTZfdCBtV2F2ZUZvcm1hdDsKLSAgICBpbnQzMl90IG1TYW1wbGVSYXRlOwotICAgIGludDMyX3QgbU51bUNoYW5uZWxzOwotICAgIGludDMyX3QgbUJpdHNQZXJTYW1wbGU7Ci0gICAgb2ZmNjRfdCBtT2Zmc2V0OwotICAgIHNpemVfdCBtU2l6ZTsKLSAgICBib29sIG1TdGFydGVkOwotICAgIE1lZGlhQnVmZmVyR3JvdXAgKm1Hcm91cDsKLSAgICBvZmY2NF90IG1DdXJyZW50UG9zOwotCi0gICAgV0FWU291cmNlKGNvbnN0IFdBVlNvdXJjZSAmKTsKLSAgICBXQVZTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBXQVZTb3VyY2UgJik7Ci19OwotCi1XQVZFeHRyYWN0b3I6OldBVkV4dHJhY3Rvcihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKQotICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKLSAgICAgIG1WYWxpZEZvcm1hdChmYWxzZSksCi0gICAgICBtQ2hhbm5lbE1hc2soQ0hBTk5FTF9NQVNLX1VTRV9DSEFOTkVMX09SREVSKSB7Ci0gICAgbUluaXRDaGVjayA9IGluaXQoKTsKLX0KLQotV0FWRXh0cmFjdG9yOjp+V0FWRXh0cmFjdG9yKCkgewotfQotCi1zcDxNZXRhRGF0YT4gV0FWRXh0cmFjdG9yOjpnZXRNZXRhRGF0YSgpIHsKLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKLQotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBtZXRhOwotICAgIH0KLQotICAgIG1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfV0FWKTsKLQotICAgIHJldHVybiBtZXRhOwotfQotCi1zaXplX3QgV0FWRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpIHsKLSAgICByZXR1cm4gbUluaXRDaGVjayA9PSBPSyA/IDEgOiAwOwotfQotCi1zcDxJTWVkaWFTb3VyY2U+IFdBVkV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7Ci0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggPiAwKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBuZXcgV0FWU291cmNlKAotICAgICAgICAgICAgbURhdGFTb3VyY2UsIG1UcmFja01ldGEsCi0gICAgICAgICAgICBtV2F2ZUZvcm1hdCwgbUJpdHNQZXJTYW1wbGUsIG1EYXRhT2Zmc2V0LCBtRGF0YVNpemUpOwotfQotCi1zcDxNZXRhRGF0YT4gV0FWRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAotICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7Ci0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggPiAwKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBtVHJhY2tNZXRhOwotfQotCi1zdGF0dXNfdCBXQVZFeHRyYWN0b3I6OmluaXQoKSB7Ci0gICAgdWludDhfdCBoZWFkZXJbMTJdOwotICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAotICAgICAgICAgICAgICAgIDAsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpIDwgKHNzaXplX3Qpc2l6ZW9mKGhlYWRlcikpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotCi0gICAgaWYgKG1lbWNtcChoZWFkZXIsICJSSUZGIiwgNCkgfHwgbWVtY21wKCZoZWFkZXJbOF0sICJXQVZFIiwgNCkpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotCi0gICAgc2l6ZV90IHRvdGFsU2l6ZSA9IFUzMl9MRV9BVCgmaGVhZGVyWzRdKTsKLQotICAgIG9mZjY0X3Qgb2Zmc2V0ID0gMTI7Ci0gICAgc2l6ZV90IHJlbWFpbmluZ1NpemUgPSB0b3RhbFNpemU7Ci0gICAgd2hpbGUgKHJlbWFpbmluZ1NpemUgPj0gOCkgewotICAgICAgICB1aW50OF90IGNodW5rSGVhZGVyWzhdOwotICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIGNodW5rSGVhZGVyLCA4KSA8IDgpIHsKLSAgICAgICAgICAgIHJldHVybiBOT19JTklUOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVtYWluaW5nU2l6ZSAtPSA4OwotICAgICAgICBvZmZzZXQgKz0gODsKLQotICAgICAgICB1aW50MzJfdCBjaHVua1NpemUgPSBVMzJfTEVfQVQoJmNodW5rSGVhZGVyWzRdKTsKLQotICAgICAgICBpZiAoY2h1bmtTaXplID4gcmVtYWluaW5nU2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIW1lbWNtcChjaHVua0hlYWRlciwgImZtdCAiLCA0KSkgewotICAgICAgICAgICAgaWYgKGNodW5rU2l6ZSA8IDE2KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHVpbnQ4X3QgZm9ybWF0U3BlY1s0MF07Ci0gICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIGZvcm1hdFNwZWMsIDIpIDwgMikgewotICAgICAgICAgICAgICAgIHJldHVybiBOT19JTklUOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtV2F2ZUZvcm1hdCA9IFUxNl9MRV9BVChmb3JtYXRTcGVjKTsKLSAgICAgICAgICAgIGlmIChtV2F2ZUZvcm1hdCAhPSBXQVZFX0ZPUk1BVF9QQ00KLSAgICAgICAgICAgICAgICAgICAgJiYgbVdhdmVGb3JtYXQgIT0gV0FWRV9GT1JNQVRfSUVFRV9GTE9BVAotICAgICAgICAgICAgICAgICAgICAmJiBtV2F2ZUZvcm1hdCAhPSBXQVZFX0ZPUk1BVF9BTEFXCi0gICAgICAgICAgICAgICAgICAgICYmIG1XYXZlRm9ybWF0ICE9IFdBVkVfRk9STUFUX01VTEFXCi0gICAgICAgICAgICAgICAgICAgICYmIG1XYXZlRm9ybWF0ICE9IFdBVkVfRk9STUFUX01TR1NNCi0gICAgICAgICAgICAgICAgICAgICYmIG1XYXZlRm9ybWF0ICE9IFdBVkVfRk9STUFUX0VYVEVOU0lCTEUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHVpbnQ4X3QgZm10U2l6ZSA9IDE2OwotICAgICAgICAgICAgaWYgKG1XYXZlRm9ybWF0ID09IFdBVkVfRk9STUFUX0VYVEVOU0lCTEUpIHsKLSAgICAgICAgICAgICAgICBmbXRTaXplID0gNDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIGZvcm1hdFNwZWMsIGZtdFNpemUpIDwgZm10U2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBOT19JTklUOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtTnVtQ2hhbm5lbHMgPSBVMTZfTEVfQVQoJmZvcm1hdFNwZWNbMl0pOwotCi0gICAgICAgICAgICBpZiAobU51bUNoYW5uZWxzIDwgMSB8fCBtTnVtQ2hhbm5lbHMgPiA4KSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIG51bWJlciBvZiBjaGFubmVscyAoJWQpIiwgbU51bUNoYW5uZWxzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtV2F2ZUZvcm1hdCAhPSBXQVZFX0ZPUk1BVF9FWFRFTlNJQkxFKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1OdW1DaGFubmVscyAhPSAxICYmIG1OdW1DaGFubmVscyAhPSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJNb3JlIHRoYW4gMiBjaGFubmVscyAoJWQpIGluIG5vbi1XQVZFX0VYVCwgdW5rbm93biBjaGFubmVsIG1hc2siLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1DaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtU2FtcGxlUmF0ZSA9IFUzMl9MRV9BVCgmZm9ybWF0U3BlY1s0XSk7Ci0KLSAgICAgICAgICAgIGlmIChtU2FtcGxlUmF0ZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUJpdHNQZXJTYW1wbGUgPSBVMTZfTEVfQVQoJmZvcm1hdFNwZWNbMTRdKTsKLQotICAgICAgICAgICAgaWYgKG1XYXZlRm9ybWF0ID09IFdBVkVfRk9STUFUX0VYVEVOU0lCTEUpIHsKLSAgICAgICAgICAgICAgICB1aW50MTZfdCB2YWxpZEJpdHNQZXJTYW1wbGUgPSBVMTZfTEVfQVQoJmZvcm1hdFNwZWNbMThdKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsaWRCaXRzUGVyU2FtcGxlICE9IG1CaXRzUGVyU2FtcGxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZEJpdHNQZXJTYW1wbGUgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoInZhbGlkQml0cyglZCkgIT0gYml0c1BlclNhbXBsZSglZCkgYXJlIG5vdCBzdXBwb3J0ZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZEJpdHNQZXJTYW1wbGUsIG1CaXRzUGVyU2FtcGxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgc3VwcG9ydCB2YWxpdEJpdHNQZXJTYW1wbGUgPT0gYml0c1BlclNhbXBsZSBidXQgc29tZSBXQVZfRVhUCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZXJzIGRvbid0IGNvcnJlY3RseSBzZXQgdGhlIHZhbGlkIGJpdHMgdmFsdWUsIGFuZCBsZWF2ZSBpdCBhdCAwLgotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIldBVkVfRVhUIGhhcyAwIHZhbGlkIGJpdHMgcGVyIHNhbXBsZSwgaWdub3JpbmciKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1DaGFubmVsTWFzayA9IFUzMl9MRV9BVCgmZm9ybWF0U3BlY1syMF0pOwotICAgICAgICAgICAgICAgIEFMT0dWKCJudW1DaGFubmVscz0lZCBjaGFubmVsTWFzaz0weCV4IiwgbU51bUNoYW5uZWxzLCBtQ2hhbm5lbE1hc2spOwotICAgICAgICAgICAgICAgIGlmICgobUNoYW5uZWxNYXNrID4+IDE4KSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJpbnZhbGlkIGNoYW5uZWwgbWFzayAweCV4IiwgbUNoYW5uZWxNYXNrKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoKG1DaGFubmVsTWFzayAhPSBDSEFOTkVMX01BU0tfVVNFX0NIQU5ORUxfT1JERVIpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAocG9wY291bnQobUNoYW5uZWxNYXNrKSAhPSBtTnVtQ2hhbm5lbHMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJpbnZhbGlkIG51bWJlciBvZiBjaGFubmVscyAoJWQpIGluIGNoYW5uZWwgbWFzayAoMHgleCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcGNvdW50KG1DaGFubmVsTWFzayksIG1DaGFubmVsTWFzayk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gSW4gYSBXQVZFX0VYVCBoZWFkZXIsIHRoZSBmaXJzdCB0d28gYnl0ZXMgb2YgdGhlIEdVSUQgc3RvcmVkIGF0IGJ5dGUgMjQgY29udGFpbgotICAgICAgICAgICAgICAgIC8vIHRoZSBzYW1wbGUgZm9ybWF0LCB1c2luZyB0aGUgc2FtZSBkZWZpbml0aW9ucyBhcyBhIHJlZ3VsYXIgV0FWIGhlYWRlcgotICAgICAgICAgICAgICAgIG1XYXZlRm9ybWF0ID0gVTE2X0xFX0FUKCZmb3JtYXRTcGVjWzI0XSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1lbWNtcCgmZm9ybWF0U3BlY1syNl0sIFdBVkVFWFRfU1VCRk9STUFULCAxNCkgJiYKLSAgICAgICAgICAgICAgICAgICAgbWVtY21wKCZmb3JtYXRTcGVjWzI2XSwgQU1CSVNPTklDX1NVQkZPUk1BVCwgMTQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJ1bnN1cHBvcnRlZCBHVUlEIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtV2F2ZUZvcm1hdCA9PSBXQVZFX0ZPUk1BVF9QQ00pIHsKLSAgICAgICAgICAgICAgICBpZiAobUJpdHNQZXJTYW1wbGUgIT0gOCAmJiBtQml0c1BlclNhbXBsZSAhPSAxNgotICAgICAgICAgICAgICAgICAgICAmJiBtQml0c1BlclNhbXBsZSAhPSAyNCAmJiBtQml0c1BlclNhbXBsZSAhPSAzMikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChtV2F2ZUZvcm1hdCA9PSBXQVZFX0ZPUk1BVF9JRUVFX0ZMT0FUKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1CaXRzUGVyU2FtcGxlICE9IDMyKSB7ICAvLyBUT0RPIHdlIGRvbid0IHN1cHBvcnQgZG91YmxlCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChtV2F2ZUZvcm1hdCA9PSBXQVZFX0ZPUk1BVF9NU0dTTSkgewotICAgICAgICAgICAgICAgIGlmIChtQml0c1BlclNhbXBsZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1XYXZlRm9ybWF0ID09IFdBVkVfRk9STUFUX01VTEFXIHx8IG1XYXZlRm9ybWF0ID09IFdBVkVfRk9STUFUX0FMQVcpIHsKLSAgICAgICAgICAgICAgICBpZiAobUJpdHNQZXJTYW1wbGUgIT0gOCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1WYWxpZEZvcm1hdCA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoIW1lbWNtcChjaHVua0hlYWRlciwgImRhdGEiLCA0KSkgewotICAgICAgICAgICAgaWYgKG1WYWxpZEZvcm1hdCkgewotICAgICAgICAgICAgICAgIG1EYXRhT2Zmc2V0ID0gb2Zmc2V0OwotICAgICAgICAgICAgICAgIG1EYXRhU2l6ZSA9IGNodW5rU2l6ZTsKLQotICAgICAgICAgICAgICAgIG1UcmFja01ldGEgPSBuZXcgTWV0YURhdGE7Ci0KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKG1XYXZlRm9ybWF0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgV0FWRV9GT1JNQVRfUENNOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFdBVkVfRk9STUFUX0lFRUVfRkxPQVQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLT5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBXQVZFX0ZPUk1BVF9BTEFXOgotICAgICAgICAgICAgICAgICAgICAgICAgbVRyYWNrTWV0YS0+c2V0Q1N0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVcpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgV0FWRV9GT1JNQVRfTVNHU006Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLT5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX01TR1NNKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobVdhdmVGb3JtYXQsICh1aW50MTZfdClXQVZFX0ZPUk1BVF9NVUxBVyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLT5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfTUxBVyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBtTnVtQ2hhbm5lbHMpOwotICAgICAgICAgICAgICAgIG1UcmFja01ldGEtPnNldEludDMyKGtLZXlDaGFubmVsTWFzaywgbUNoYW5uZWxNYXNrKTsKLSAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgbVNhbXBsZVJhdGUpOwotICAgICAgICAgICAgICAgIG1UcmFja01ldGEtPnNldEludDMyKGtLZXlQY21FbmNvZGluZywga0F1ZGlvRW5jb2RpbmdQY20xNmJpdCk7Ci0KLSAgICAgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPSAwOwotICAgICAgICAgICAgICAgIGlmIChtV2F2ZUZvcm1hdCA9PSBXQVZFX0ZPUk1BVF9NU0dTTSkgewotICAgICAgICAgICAgICAgICAgICAvLyA2NSBieXRlcyBkZWNvZGUgdG8gMzIwIDhrSHogc2FtcGxlcwotICAgICAgICAgICAgICAgICAgICBkdXJhdGlvblVzID0KLSAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMDBMTCAqIChtRGF0YVNpemUgLyA2NSAqIDMyMCkgLyA4MDAwOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNpemVfdCBieXRlc1BlclNhbXBsZSA9IG1CaXRzUGVyU2FtcGxlID4+IDM7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFieXRlc1BlclNhbXBsZSB8fCAhbU51bUNoYW5uZWxzKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLQotICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtX3NhbXBsZXMgPSBtRGF0YVNpemUgLyAobU51bUNoYW5uZWxzICogYnl0ZXNQZXJTYW1wbGUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICghbVNhbXBsZVJhdGUpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotCi0gICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uVXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMExMICogbnVtX3NhbXBsZXMgLyBtU2FtcGxlUmF0ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uVXMpOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgb2Zmc2V0ICs9IGNodW5rU2l6ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTk9fSU5JVDsKLX0KLQotY29uc3Qgc2l6ZV90IFdBVlNvdXJjZTo6a01heEZyYW1lU2l6ZSA9IDMyNzY4OwotCi1XQVZTb3VyY2U6OldBVlNvdXJjZSgKLSAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJmRhdGFTb3VyY2UsCi0gICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSwKLSAgICAgICAgdWludDE2X3Qgd2F2ZUZvcm1hdCwKLSAgICAgICAgaW50MzJfdCBiaXRzUGVyU2FtcGxlLAotICAgICAgICBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpCi0gICAgOiBtRGF0YVNvdXJjZShkYXRhU291cmNlKSwKLSAgICAgIG1NZXRhKG1ldGEpLAotICAgICAgbVdhdmVGb3JtYXQod2F2ZUZvcm1hdCksCi0gICAgICBtU2FtcGxlUmF0ZSgwKSwKLSAgICAgIG1OdW1DaGFubmVscygwKSwKLSAgICAgIG1CaXRzUGVyU2FtcGxlKGJpdHNQZXJTYW1wbGUpLAotICAgICAgbU9mZnNldChvZmZzZXQpLAotICAgICAgbVNpemUoc2l6ZSksCi0gICAgICBtU3RhcnRlZChmYWxzZSksCi0gICAgICBtR3JvdXAoTlVMTCkgewotICAgIENIRUNLKG1NZXRhLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZtU2FtcGxlUmF0ZSkpOwotICAgIENIRUNLKG1NZXRhLT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm1OdW1DaGFubmVscykpOwotCi0gICAgbU1ldGEtPnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIGtNYXhGcmFtZVNpemUpOwotfQotCi1XQVZTb3VyY2U6On5XQVZTb3VyY2UoKSB7Ci0gICAgaWYgKG1TdGFydGVkKSB7Ci0gICAgICAgIHN0b3AoKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFdBVlNvdXJjZTo6c3RhcnQoTWV0YURhdGEgKiAvKiBwYXJhbXMgKi8pIHsKLSAgICBBTE9HVigiV0FWU291cmNlOjpzdGFydCIpOwotCi0gICAgQ0hFQ0soIW1TdGFydGVkKTsKLQotICAgIC8vIHNvbWUgV0FWIGZpbGVzIG1heSBoYXZlIGxhcmdlIGF1ZGlvIGJ1ZmZlcnMgdGhhdCB1c2Ugc2hhcmVkIG1lbW9yeSB0cmFuc2Zlci4KLSAgICBtR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cCg0IC8qIGJ1ZmZlcnMgKi8sIGtNYXhGcmFtZVNpemUpOwotCi0gICAgaWYgKG1CaXRzUGVyU2FtcGxlID09IDgpIHsKLSAgICAgICAgLy8gQXMgYSB0ZW1wb3JhcnkgYnVmZmVyIGZvciA4LT4xNiBiaXQgY29udmVyc2lvbi4KLSAgICAgICAgbUdyb3VwLT5hZGRfYnVmZmVyKG5ldyBNZWRpYUJ1ZmZlcihrTWF4RnJhbWVTaXplKSk7Ci0gICAgfQotCi0gICAgbUN1cnJlbnRQb3MgPSBtT2Zmc2V0OwotCi0gICAgbVN0YXJ0ZWQgPSB0cnVlOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBXQVZTb3VyY2U6OnN0b3AoKSB7Ci0gICAgQUxPR1YoIldBVlNvdXJjZTo6c3RvcCIpOwotCi0gICAgQ0hFQ0sobVN0YXJ0ZWQpOwotCi0gICAgZGVsZXRlIG1Hcm91cDsKLSAgICBtR3JvdXAgPSBOVUxMOwotCi0gICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3A8TWV0YURhdGE+IFdBVlNvdXJjZTo6Z2V0Rm9ybWF0KCkgewotICAgIEFMT0dWKCJXQVZTb3VyY2U6OmdldEZvcm1hdCIpOwotCi0gICAgcmV0dXJuIG1NZXRhOwotfQotCi1zdGF0dXNfdCBXQVZTb3VyY2U6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewotICAgICpvdXQgPSBOVUxMOwotCi0gICAgaWYgKG9wdGlvbnMgIT0gbnVsbHB0ciAmJiBvcHRpb25zLT5nZXROb25CbG9ja2luZygpICYmICFtR3JvdXAtPmhhc19idWZmZXJzKCkpIHsKLSAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOwotICAgIH0KLQotICAgIGludDY0X3Qgc2Vla1RpbWVVczsKLSAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKLSAgICBpZiAob3B0aW9ucyAhPSBOVUxMICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7Ci0gICAgICAgIGludDY0X3QgcG9zID0gMDsKLQotICAgICAgICBpZiAobVdhdmVGb3JtYXQgPT0gV0FWRV9GT1JNQVRfTVNHU00pIHsKLSAgICAgICAgICAgIC8vIDY1IGJ5dGVzIGRlY29kZSB0byAzMjAgOGtIeiBzYW1wbGVzCi0gICAgICAgICAgICBpbnQ2NF90IHNhbXBsZW51bWJlciA9IChzZWVrVGltZVVzICogbVNhbXBsZVJhdGUpIC8gMTAwMDAwMDsKLSAgICAgICAgICAgIGludDY0X3QgZnJhbWVudW1iZXIgPSBzYW1wbGVudW1iZXIgLyAzMjA7Ci0gICAgICAgICAgICBwb3MgPSBmcmFtZW51bWJlciAqIDY1OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcG9zID0gKHNlZWtUaW1lVXMgKiBtU2FtcGxlUmF0ZSkgLyAxMDAwMDAwICogbU51bUNoYW5uZWxzICogKG1CaXRzUGVyU2FtcGxlID4+IDMpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwb3MgPiAob2ZmNjRfdCltU2l6ZSkgewotICAgICAgICAgICAgcG9zID0gbVNpemU7Ci0gICAgICAgIH0KLSAgICAgICAgbUN1cnJlbnRQb3MgPSBwb3MgKyBtT2Zmc2V0OwotICAgIH0KLQotICAgIE1lZGlhQnVmZmVyICpidWZmZXI7Ci0gICAgc3RhdHVzX3QgZXJyID0gbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLy8gbWFrZSBzdXJlIHRoYXQgbWF4Qnl0ZXNUb1JlYWQgaXMgbXVsdGlwbGUgb2YgMywgaW4gMjQtYml0IGNhc2UKLSAgICBzaXplX3QgbWF4Qnl0ZXNUb1JlYWQgPQotICAgICAgICBtQml0c1BlclNhbXBsZSA9PSA4ID8ga01heEZyYW1lU2l6ZSAvIDIgOiAKLSAgICAgICAgKG1CaXRzUGVyU2FtcGxlID09IDI0ID8gMyooa01heEZyYW1lU2l6ZS8zKToga01heEZyYW1lU2l6ZSk7Ci0KLSAgICBzaXplX3QgbWF4Qnl0ZXNBdmFpbGFibGUgPQotICAgICAgICAobUN1cnJlbnRQb3MgLSBtT2Zmc2V0ID49IChvZmY2NF90KW1TaXplKQotICAgICAgICAgICAgPyAwIDogbVNpemUgLSAobUN1cnJlbnRQb3MgLSBtT2Zmc2V0KTsKLQotICAgIGlmIChtYXhCeXRlc1RvUmVhZCA+IG1heEJ5dGVzQXZhaWxhYmxlKSB7Ci0gICAgICAgIG1heEJ5dGVzVG9SZWFkID0gbWF4Qnl0ZXNBdmFpbGFibGU7Ci0gICAgfQotCi0gICAgaWYgKG1XYXZlRm9ybWF0ID09IFdBVkVfRk9STUFUX01TR1NNKSB7Ci0gICAgICAgIC8vIE1pY3Jvc29mdCBwYWNrcyAyIGZyYW1lcyBpbnRvIDY1IGJ5dGVzLCByYXRoZXIgdGhhbiB1c2luZyBzZXBhcmF0ZSAzMy1ieXRlIGZyYW1lcywKLSAgICAgICAgLy8gc28gcmVhZCBtdWx0aXBsZXMgb2YgNjUsIGFuZCB1c2Ugc21hbGxlciBidWZmZXJzIHRvIGFjY291bnQgZm9yIH4xMDoxIGV4cGFuc2lvbiByYXRpbwotICAgICAgICBpZiAobWF4Qnl0ZXNUb1JlYWQgPiAxMDI0KSB7Ci0gICAgICAgICAgICBtYXhCeXRlc1RvUmVhZCA9IDEwMjQ7Ci0gICAgICAgIH0KLSAgICAgICAgbWF4Qnl0ZXNUb1JlYWQgPSAobWF4Qnl0ZXNUb1JlYWQgLyA2NSkgKiA2NTsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyByZWFkIG9ubHkgaW50ZWdyYWwgYW1vdW50cyBvZiBhdWRpbyB1bml0IGZyYW1lcy4KLSAgICAgICAgY29uc3Qgc2l6ZV90IGlucHV0VW5pdEZyYW1lU2l6ZSA9IG1OdW1DaGFubmVscyAqIG1CaXRzUGVyU2FtcGxlIC8gODsKLSAgICAgICAgbWF4Qnl0ZXNUb1JlYWQgLT0gbWF4Qnl0ZXNUb1JlYWQgJSBpbnB1dFVuaXRGcmFtZVNpemU7Ci0gICAgfQotCi0gICAgc3NpemVfdCBuID0gbURhdGFTb3VyY2UtPnJlYWRBdCgKLSAgICAgICAgICAgIG1DdXJyZW50UG9zLCBidWZmZXItPmRhdGEoKSwKLSAgICAgICAgICAgIG1heEJ5dGVzVG9SZWFkKTsKLQotICAgIGlmIChuIDw9IDApIHsKLSAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIGJ1ZmZlciA9IE5VTEw7Ci0KLSAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07Ci0gICAgfQotCi0gICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgbik7Ci0KLSAgICAvLyBUT0RPOiBhZGQgY2FwYWJpbGl0eSB0byByZXR1cm4gZGF0YSBhcyBmbG9hdCBQQ00gaW5zdGVhZCBvZiAxNiBiaXQgUENNLgotICAgIGlmIChtV2F2ZUZvcm1hdCA9PSBXQVZFX0ZPUk1BVF9QQ00pIHsKLSAgICAgICAgaWYgKG1CaXRzUGVyU2FtcGxlID09IDgpIHsKLSAgICAgICAgICAgIC8vIENvbnZlcnQgOC1iaXQgdW5zaWduZWQgc2FtcGxlcyB0byAxNi1iaXQgc2lnbmVkLgotCi0gICAgICAgICAgICAvLyBDcmVhdGUgbmV3IGJ1ZmZlciB3aXRoIDIgYnl0ZSB3aWRlIHNhbXBsZXMKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyICp0bXA7Ci0gICAgICAgICAgICBDSEVDS19FUShtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZ0bXApLCAoc3RhdHVzX3QpT0spOwotICAgICAgICAgICAgdG1wLT5zZXRfcmFuZ2UoMCwgMiAqIG4pOwotCi0gICAgICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fdTgoKGludDE2X3QgKil0bXAtPmRhdGEoKSwgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSwgbik7Ci0gICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIGJ1ZmZlciA9IHRtcDsKLSAgICAgICAgfSBlbHNlIGlmIChtQml0c1BlclNhbXBsZSA9PSAyNCkgewotICAgICAgICAgICAgLy8gQ29udmVydCAyNC1iaXQgc2lnbmVkIHNhbXBsZXMgdG8gMTYtYml0IHNpZ25lZCBpbiBwbGFjZQotICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG51bVNhbXBsZXMgPSBuIC8gMzsKLQotICAgICAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX3AyNCgoaW50MTZfdCAqKWJ1ZmZlci0+ZGF0YSgpLCAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpLCBudW1TYW1wbGVzKTsKLSAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIDIgKiBudW1TYW1wbGVzKTsKLSAgICAgICAgfSAgZWxzZSBpZiAobUJpdHNQZXJTYW1wbGUgPT0gMzIpIHsKLSAgICAgICAgICAgIC8vIENvbnZlcnQgMzItYml0IHNpZ25lZCBzYW1wbGVzIHRvIDE2LWJpdCBzaWduZWQgaW4gcGxhY2UKLSAgICAgICAgICAgIGNvbnN0IHNpemVfdCBudW1TYW1wbGVzID0gbiAvIDQ7Ci0KLSAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9pMzIoKGludDE2X3QgKilidWZmZXItPmRhdGEoKSwgKGNvbnN0IGludDMyX3QgKilidWZmZXItPmRhdGEoKSwgbnVtU2FtcGxlcyk7Ci0gICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZSgwLCAyICogbnVtU2FtcGxlcyk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKG1XYXZlRm9ybWF0ID09IFdBVkVfRk9STUFUX0lFRUVfRkxPQVQpIHsKLSAgICAgICAgaWYgKG1CaXRzUGVyU2FtcGxlID09IDMyKSB7Ci0gICAgICAgICAgICAvLyBDb252ZXJ0IDMyLWJpdCBmbG9hdCBzYW1wbGVzIHRvIDE2LWJpdCBzaWduZWQgaW4gcGxhY2UKLSAgICAgICAgICAgIGNvbnN0IHNpemVfdCBudW1TYW1wbGVzID0gbiAvIDQ7Ci0KLSAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9mbG9hdCgoaW50MTZfdCAqKWJ1ZmZlci0+ZGF0YSgpLCAoY29uc3QgZmxvYXQgKilidWZmZXItPmRhdGEoKSwgbnVtU2FtcGxlcyk7Ci0gICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZSgwLCAyICogbnVtU2FtcGxlcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnQ2NF90IHRpbWVTdGFtcFVzID0gMDsKLQotICAgIGlmIChtV2F2ZUZvcm1hdCA9PSBXQVZFX0ZPUk1BVF9NU0dTTSkgewotICAgICAgICB0aW1lU3RhbXBVcyA9IDEwMDAwMDBMTCAqIChtQ3VycmVudFBvcyAtIG1PZmZzZXQpICogMzIwIC8gNjUgLyBtU2FtcGxlUmF0ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBzaXplX3QgYnl0ZXNQZXJTYW1wbGUgPSBtQml0c1BlclNhbXBsZSA+PiAzOwotICAgICAgICB0aW1lU3RhbXBVcyA9IDEwMDAwMDBMTCAqIChtQ3VycmVudFBvcyAtIG1PZmZzZXQpCi0gICAgICAgICAgICAgICAgLyAobU51bUNoYW5uZWxzICogYnl0ZXNQZXJTYW1wbGUpIC8gbVNhbXBsZVJhdGU7Ci0gICAgfQotCi0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIHRpbWVTdGFtcFVzKTsKLQotICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7Ci0gICAgbUN1cnJlbnRQb3MgKz0gbjsKLQotICAgICpvdXQgPSBidWZmZXI7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLWJvb2wgU25pZmZXQVYoCi0gICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSwKLSAgICAgICAgc3A8QU1lc3NhZ2U+ICopIHsKLSAgICBjaGFyIGhlYWRlclsxMl07Ci0gICAgaWYgKHNvdXJjZS0+cmVhZEF0KDAsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpIDwgKHNzaXplX3Qpc2l6ZW9mKGhlYWRlcikpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmIChtZW1jbXAoaGVhZGVyLCAiUklGRiIsIDQpIHx8IG1lbWNtcCgmaGVhZGVyWzhdLCAiV0FWRSIsIDQpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBzcDxNZWRpYUV4dHJhY3Rvcj4gZXh0cmFjdG9yID0gbmV3IFdBVkV4dHJhY3Rvcihzb3VyY2UpOwotICAgIGlmIChleHRyYWN0b3ItPmNvdW50VHJhY2tzKCkgPT0gMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgKm1pbWVUeXBlID0gTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX1dBVjsKLSAgICAqY29uZmlkZW5jZSA9IDAuM2Y7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1hJTkdTZWVrZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvWElOR1NlZWtlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZWQ5YzYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvWElOR1NlZWtlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiWElOR1NFRUtFUiIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgImluY2x1ZGUvWElOR1NlZWtlci5oIgotI2luY2x1ZGUgImluY2x1ZGUvYXZjX3V0aWxzLmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1YSU5HU2Vla2VyOjpYSU5HU2Vla2VyKCkKLSAgICA6IG1EdXJhdGlvblVzKC0xKSwKLSAgICAgIG1TaXplQnl0ZXMoMCksCi0gICAgICBtRW5jb2RlckRlbGF5KDApLAotICAgICAgbUVuY29kZXJQYWRkaW5nKDApLAotICAgICAgbVRPQ1ZhbGlkKGZhbHNlKSB7Ci19Ci0KLWJvb2wgWElOR1NlZWtlcjo6Z2V0RHVyYXRpb24oaW50NjRfdCAqZHVyYXRpb25VcykgewotICAgIGlmIChtRHVyYXRpb25VcyA8IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgICpkdXJhdGlvblVzID0gbUR1cmF0aW9uVXM7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBYSU5HU2Vla2VyOjpnZXRPZmZzZXRGb3JUaW1lKGludDY0X3QgKnRpbWVVcywgb2ZmNjRfdCAqcG9zKSB7Ci0gICAgaWYgKG1TaXplQnl0ZXMgPT0gMCB8fCAhbVRPQ1ZhbGlkIHx8IG1EdXJhdGlvblVzIDwgMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgZmxvYXQgcGVyY2VudCA9IChmbG9hdCkoKnRpbWVVcykgKiAxMDAgLyBtRHVyYXRpb25VczsKLSAgICBmbG9hdCBmeDsKLSAgICBpZiggcGVyY2VudCA8PSAwLjBmICkgewotICAgICAgICBmeCA9IDAuMGY7Ci0gICAgfSBlbHNlIGlmKCBwZXJjZW50ID49IDEwMC4wZiApIHsKLSAgICAgICAgZnggPSAyNTYuMGY7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW50IGEgPSAoaW50KXBlcmNlbnQ7Ci0gICAgICAgIGZsb2F0IGZhLCBmYjsKLSAgICAgICAgaWYgKCBhID09IDAgKSB7Ci0gICAgICAgICAgICBmYSA9IDAuMGY7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmYSA9IChmbG9hdCltVE9DW2EtMV07Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCBhIDwgOTkgKSB7Ci0gICAgICAgICAgICBmYiA9IChmbG9hdCltVE9DW2FdOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmIgPSAyNTYuMGY7Ci0gICAgICAgIH0KLSAgICAgICAgZnggPSBmYSArIChmYi1mYSkqKHBlcmNlbnQtYSk7Ci0gICAgfQotCi0gICAgKnBvcyA9IChpbnQpKCgxLjBmLzI1Ni4wZikqZngqbVNpemVCeXRlcykgKyBtRmlyc3RGcmFtZVBvczsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi0vLyBzdGF0aWMKLXNwPFhJTkdTZWVrZXI+IFhJTkdTZWVrZXI6OkNyZWF0ZUZyb21Tb3VyY2UoCi0gICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIG9mZjY0X3QgZmlyc3RfZnJhbWVfcG9zKSB7Ci0gICAgc3A8WElOR1NlZWtlcj4gc2Vla2VyID0gbmV3IFhJTkdTZWVrZXI7Ci0KLSAgICBzZWVrZXItPm1GaXJzdEZyYW1lUG9zID0gZmlyc3RfZnJhbWVfcG9zOwotCi0gICAgdWludDhfdCBidWZmZXJbNF07Ci0gICAgaW50IG9mZnNldCA9IGZpcnN0X2ZyYW1lX3BvczsKLSAgICBpZiAoc291cmNlLT5yZWFkQXQob2Zmc2V0LCAmYnVmZmVyLCA0KSA8IDQpIHsgLy8gZ2V0IGhlYWRlcgotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgb2Zmc2V0ICs9IDQ7Ci0KLSAgICBpbnQgaGVhZGVyID0gVTMyX0FUKGJ1ZmZlcik7OwotICAgIHNpemVfdCB4aW5nZnJhbWVzaXplID0gMDsKLSAgICBpbnQgc2FtcGxpbmdfcmF0ZSA9IDA7Ci0gICAgaW50IG51bV9jaGFubmVsczsKLSAgICBpbnQgc2FtcGxlc19wZXJfZnJhbWUgPSAwOwotICAgIGlmICghR2V0TVBFR0F1ZGlvRnJhbWVTaXplKGhlYWRlciwgJnhpbmdmcmFtZXNpemUsICZzYW1wbGluZ19yYXRlLCAmbnVtX2NoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICZzYW1wbGVzX3Blcl9mcmFtZSkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHNlZWtlci0+bUZpcnN0RnJhbWVQb3MgKz0geGluZ2ZyYW1lc2l6ZTsKLQotICAgIHVpbnQ4X3QgdmVyc2lvbiA9IChidWZmZXJbMV0gPj4gMykgJiAzOwotCi0gICAgLy8gZGV0ZXJtaW5lIG9mZnNldCBvZiBYSU5HIGhlYWRlcgotICAgIGlmKHZlcnNpb24gJiAxKSB7IC8vIG1wZWcxCi0gICAgICAgIGlmIChudW1fY2hhbm5lbHMgIT0gMSkgb2Zmc2V0ICs9IDMyOwotICAgICAgICBlbHNlIG9mZnNldCArPSAxNzsKLSAgICB9IGVsc2UgeyAvLyBtcGVnIDIgb3IgMi41Ci0gICAgICAgIGlmIChudW1fY2hhbm5lbHMgIT0gMSkgb2Zmc2V0ICs9IDE3OwotICAgICAgICBlbHNlIG9mZnNldCArPSA5OwotICAgIH0KLQotICAgIGludCB4aW5nYmFzZSA9IG9mZnNldDsKLQotICAgIGlmIChzb3VyY2UtPnJlYWRBdChvZmZzZXQsICZidWZmZXIsIDQpIDwgNCkgeyAvLyBYSU5HIGhlYWRlciBJRAotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgb2Zmc2V0ICs9IDQ7Ci0gICAgLy8gQ2hlY2sgWElORyBJRAotICAgIGlmICgoYnVmZmVyWzBdICE9ICdYJykgfHwgKGJ1ZmZlclsxXSAhPSAnaScpCi0gICAgICAgICAgICAgICAgfHwgKGJ1ZmZlclsyXSAhPSAnbicpIHx8IChidWZmZXJbM10gIT0gJ2cnKSkgewotICAgICAgICBpZiAoKGJ1ZmZlclswXSAhPSAnSScpIHx8IChidWZmZXJbMV0gIT0gJ24nKQotICAgICAgICAgICAgICAgICAgICB8fCAoYnVmZmVyWzJdICE9ICdmJykgfHwgKGJ1ZmZlclszXSAhPSAnbycpKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChzb3VyY2UtPnJlYWRBdChvZmZzZXQsICZidWZmZXIsIDQpIDwgNCkgeyAvLyBmbGFncwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgb2Zmc2V0ICs9IDQ7Ci0gICAgdWludDMyX3QgZmxhZ3MgPSBVMzJfQVQoYnVmZmVyKTsKLQotICAgIGlmIChmbGFncyAmIDB4MDAwMSkgeyAgLy8gRnJhbWVzIGZpZWxkIGlzIHByZXNlbnQKLSAgICAgICAgaWYgKHNvdXJjZS0+cmVhZEF0KG9mZnNldCwgYnVmZmVyLCA0KSA8IDQpIHsKLSAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBpbnQzMl90IGZyYW1lcyA9IFUzMl9BVChidWZmZXIpOwotICAgICAgICAvLyBvbmx5IHVwZGF0ZSBtRHVyYXRpb25VcyBpZiB0aGUgY2FsY3VsYXRlZCBkdXJhdGlvbiBpcyB2YWxpZCAobm9uIHplcm8pCi0gICAgICAgIC8vIG90aGVyd2lzZSwgbGVhdmUgZHVyYXRpb24gYXQgLTEgc28gdGhhdCBnZXREdXJhdGlvbigpIGFuZCBnZXRPZmZzZXRGb3JUaW1lKCkKLSAgICAgICAgLy8gcmV0dXJuIGZhbHNlIHdoZW4gY2FsbGVkLCB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgeGluZyB0YWcgZG9lcyBub3QgaGF2ZSB0aGUKLSAgICAgICAgLy8gcmVxdWVzdGVkIGluZm9ybWF0aW9uCi0gICAgICAgIGlmIChmcmFtZXMpIHsKLSAgICAgICAgICAgIHNlZWtlci0+bUR1cmF0aW9uVXMgPSAoaW50NjRfdClmcmFtZXMgKiBzYW1wbGVzX3Blcl9mcmFtZSAqIDEwMDAwMDBMTCAvIHNhbXBsaW5nX3JhdGU7Ci0gICAgICAgIH0KLSAgICAgICAgb2Zmc2V0ICs9IDQ7Ci0gICAgfQotICAgIGlmIChmbGFncyAmIDB4MDAwMikgeyAgLy8gQnl0ZXMgZmllbGQgaXMgcHJlc2VudAotICAgICAgICBpZiAoc291cmNlLT5yZWFkQXQob2Zmc2V0LCBidWZmZXIsIDQpIDwgNCkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgc2Vla2VyLT5tU2l6ZUJ5dGVzID0gVTMyX0FUKGJ1ZmZlcik7Ci0gICAgICAgIG9mZnNldCArPSA0OwotICAgIH0KLSAgICBpZiAoZmxhZ3MgJiAweDAwMDQpIHsgIC8vIFRPQyBmaWVsZCBpcyBwcmVzZW50Ci0gICAgICAgIGlmIChzb3VyY2UtPnJlYWRBdChvZmZzZXQgKyAxLCBzZWVrZXItPm1UT0MsIDk5KSA8IDk5KSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBzZWVrZXItPm1UT0NWYWxpZCA9IHRydWU7Ci0gICAgICAgIG9mZnNldCArPSAxMDA7Ci0gICAgfQotCi0jaWYgMAotICAgIGlmIChmbGFncyAmIDB4MDAwOCkgeyAgLy8gUXVhbGl0eSBpbmRpY2F0b3IgZmllbGQgaXMgcHJlc2VudAotICAgICAgICBpZiAoc291cmNlLT5yZWFkQXQob2Zmc2V0LCBidWZmZXIsIDQpIDwgNCkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZG8gc29tZXRoaW5nIHdpdGggdGhlIHF1YWxpdHkgaW5kaWNhdG9yCi0gICAgICAgIG9mZnNldCArPSA0OwotICAgIH0KLQotICAgIGlmIChzb3VyY2UtPnJlYWRBdCh4aW5nYmFzZSArIDB4YWYgLSAweDI0LCAmYnVmZmVyLCAxKSA8IDEpIHsgLy8gZW5jb2RpbmcgZmxhZ3MKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEFMT0dWKCJub2dhcCBwcmVjZWRpbmc6ICVzLCBub2dhcCBjb250aW51ZWQgaW4gbmV4dDogJXMiLAotICAgICAgICAgICAgICAoYnVmZmVyWzBdICYgMHg4MCkgPyAidHJ1ZSIgOiAiZmFsc2UiLAotICAgICAgICAgICAgICAoYnVmZmVyWzBdICYgMHg0MCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSNlbmRpZgotCi0gICAgaWYgKHNvdXJjZS0+cmVhZEF0KHhpbmdiYXNlICsgMHhiMSAtIDB4MjQsICZidWZmZXIsIDMpID09IDMpIHsKLSAgICAgICAgc2Vla2VyLT5tRW5jb2RlckRlbGF5ID0gKGJ1ZmZlclswXSA8PCA0KSArIChidWZmZXJbMV0gPj4gNCk7Ci0gICAgICAgIHNlZWtlci0+bUVuY29kZXJQYWRkaW5nID0gKChidWZmZXJbMV0gJiAweGYpIDw8IDgpICsgYnVmZmVyWzJdOwotICAgIH0KLQotICAgIHJldHVybiBzZWVrZXI7Ci19Ci0KLWludDMyX3QgWElOR1NlZWtlcjo6Z2V0RW5jb2RlckRlbGF5KCkgewotICAgIHJldHVybiBtRW5jb2RlckRlbGF5OwotfQotCi1pbnQzMl90IFhJTkdTZWVrZXI6OmdldEVuY29kZXJQYWRkaW5nKCkgewotICAgIHJldHVybiBtRW5jb2RlclBhZGRpbmc7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2F2Y191dGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9hdmNfdXRpbHMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTI0MzNhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2F2Y191dGlscy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4MjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiYXZjX3V0aWxzIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiaW5jbHVkZS9hdmNfdXRpbHMuaCIKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi11bnNpZ25lZCBwYXJzZVVFKEFCaXRSZWFkZXIgKmJyKSB7Ci0gICAgdW5zaWduZWQgbnVtWmVyb2VzID0gMDsKLSAgICB3aGlsZSAoYnItPmdldEJpdHMoMSkgPT0gMCkgewotICAgICAgICArK251bVplcm9lczsKLSAgICB9Ci0KLSAgICB1bnNpZ25lZCB4ID0gYnItPmdldEJpdHMobnVtWmVyb2VzKTsKLQotICAgIHJldHVybiB4ICsgKDF1IDw8IG51bVplcm9lcykgLSAxOwotfQotCi11bnNpZ25lZCBwYXJzZVVFV2l0aEZhbGxiYWNrKEFCaXRSZWFkZXIgKmJyLCB1bnNpZ25lZCBmYWxsYmFjaykgewotICAgIHVuc2lnbmVkIG51bVplcm9lcyA9IDA7Ci0gICAgd2hpbGUgKGJyLT5nZXRCaXRzV2l0aEZhbGxiYWNrKDEsIDEpID09IDApIHsKLSAgICAgICAgKytudW1aZXJvZXM7Ci0gICAgfQotICAgIHVpbnQzMl90IHg7Ci0gICAgaWYgKG51bVplcm9lcyA8IDMyKSB7Ci0gICAgICAgIGlmIChici0+Z2V0Qml0c0dyYWNlZnVsKG51bVplcm9lcywgJngpKSB7Ci0gICAgICAgICAgICByZXR1cm4geCArICgxdSA8PCBudW1aZXJvZXMpIC0gMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxsYmFjazsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGJyLT5za2lwQml0cyhudW1aZXJvZXMpOwotICAgICAgICByZXR1cm4gZmFsbGJhY2s7Ci0gICAgfQotfQotCi1zaWduZWQgcGFyc2VTRShBQml0UmVhZGVyICpicikgewotICAgIHVuc2lnbmVkIGNvZGVOdW0gPSBwYXJzZVVFKGJyKTsKLQotICAgIHJldHVybiAoY29kZU51bSAmIDEpID8gKGNvZGVOdW0gKyAxKSAvIDIgOiAtc2lnbmVkKGNvZGVOdW0gLyAyKTsKLX0KLQotc2lnbmVkIHBhcnNlU0VXaXRoRmFsbGJhY2soQUJpdFJlYWRlciAqYnIsIHNpZ25lZCBmYWxsYmFjaykgewotICAgIC8vIE5PVEU6IHBhcnNlVUUgY2Fubm90IG5vcm1hbGx5IHJldHVybiB+MCBhcyB0aGUgbWF4IHN1cHBvcnRlZCB2YWx1ZSBpcyAweEZGRkUKLSAgICB1bnNpZ25lZCBjb2RlTnVtID0gcGFyc2VVRVdpdGhGYWxsYmFjayhiciwgfjBVKTsKLSAgICBpZiAoY29kZU51bSA9PSB+MFUpIHsKLSAgICAgICAgcmV0dXJuIGZhbGxiYWNrOwotICAgIH0KLSAgICByZXR1cm4gKGNvZGVOdW0gJiAxKSA/IChjb2RlTnVtICsgMSkgLyAyIDogLXNpZ25lZChjb2RlTnVtIC8gMik7Ci19Ci0KLXN0YXRpYyB2b2lkIHNraXBTY2FsaW5nTGlzdChBQml0UmVhZGVyICpiciwgc2l6ZV90IHNpemVPZlNjYWxpbmdMaXN0KSB7Ci0gICAgc2l6ZV90IGxhc3RTY2FsZSA9IDg7Ci0gICAgc2l6ZV90IG5leHRTY2FsZSA9IDg7Ci0gICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzaXplT2ZTY2FsaW5nTGlzdDsgKytqKSB7Ci0gICAgICAgIGlmIChuZXh0U2NhbGUgIT0gMCkgewotICAgICAgICAgICAgc2lnbmVkIGRlbHRhX3NjYWxlID0gcGFyc2VTRShicik7Ci0gICAgICAgICAgICAvLyBJU09fSUVDXzE0NDk2LTEwXzIwMTQwMi1JVFUsIDcuNC4yLjEuMS4xLCBUaGUgdmFsdWUgb2YgZGVsdGFfc2NhbGUKLSAgICAgICAgICAgIC8vIHNoYWxsIGJlIGluIHRoZSByYW5nZSBvZiDiiJIxMjggdG8gKzEyNywgaW5jbHVzaXZlLgotICAgICAgICAgICAgaWYgKGRlbHRhX3NjYWxlIDwgLTEyOCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJkZWx0YV9zY2FsZSAoJWQpIGlzIGJlbG93IHJhbmdlLCBjYXBwZWQgdG8gLTEyOCIsIGRlbHRhX3NjYWxlKTsKLSAgICAgICAgICAgICAgICBkZWx0YV9zY2FsZSA9IC0xMjg7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGRlbHRhX3NjYWxlID4gMTI3KSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImRlbHRhX3NjYWxlICglZCkgaXMgYWJvdmUgcmFuZ2UsIGNhcHBlZCB0byAxMjciLCBkZWx0YV9zY2FsZSk7Ci0gICAgICAgICAgICAgICAgZGVsdGFfc2NhbGUgPSAxMjc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuZXh0U2NhbGUgPSAobGFzdFNjYWxlICsgKGRlbHRhX3NjYWxlICsgMjU2KSkgJSAyNTY7Ci0gICAgICAgIH0KLQotICAgICAgICBsYXN0U2NhbGUgPSAobmV4dFNjYWxlID09IDApID8gbGFzdFNjYWxlIDogbmV4dFNjYWxlOwotICAgIH0KLX0KLQotLy8gRGV0ZXJtaW5lIHZpZGVvIGRpbWVuc2lvbnMgZnJvbSB0aGUgc2VxdWVuY2UgcGFyYW1ldGVyc2V0Lgotdm9pZCBGaW5kQVZDRGltZW5zaW9ucygKLSAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJnNlcVBhcmFtU2V0LAotICAgICAgICBpbnQzMl90ICp3aWR0aCwgaW50MzJfdCAqaGVpZ2h0LAotICAgICAgICBpbnQzMl90ICpzYXJXaWR0aCwgaW50MzJfdCAqc2FySGVpZ2h0KSB7Ci0gICAgQUJpdFJlYWRlciBicihzZXFQYXJhbVNldC0+ZGF0YSgpICsgMSwgc2VxUGFyYW1TZXQtPnNpemUoKSAtIDEpOwotCi0gICAgdW5zaWduZWQgcHJvZmlsZV9pZGMgPSBici5nZXRCaXRzKDgpOwotICAgIGJyLnNraXBCaXRzKDE2KTsKLSAgICBwYXJzZVVFKCZicik7ICAvLyBzZXFfcGFyYW1ldGVyX3NldF9pZAotCi0gICAgdW5zaWduZWQgY2hyb21hX2Zvcm1hdF9pZGMgPSAxOyAgLy8gNDoyOjAgY2hyb21hIGZvcm1hdAotCi0gICAgaWYgKHByb2ZpbGVfaWRjID09IDEwMCB8fCBwcm9maWxlX2lkYyA9PSAxMTAKLSAgICAgICAgICAgIHx8IHByb2ZpbGVfaWRjID09IDEyMiB8fCBwcm9maWxlX2lkYyA9PSAyNDQKLSAgICAgICAgICAgIHx8IHByb2ZpbGVfaWRjID09IDQ0IHx8IHByb2ZpbGVfaWRjID09IDgzIHx8IHByb2ZpbGVfaWRjID09IDg2KSB7Ci0gICAgICAgIGNocm9tYV9mb3JtYXRfaWRjID0gcGFyc2VVRSgmYnIpOwotICAgICAgICBpZiAoY2hyb21hX2Zvcm1hdF9pZGMgPT0gMykgewotICAgICAgICAgICAgYnIuc2tpcEJpdHMoMSk7ICAvLyByZXNpZHVhbF9jb2xvdXJfdHJhbnNmb3JtX2ZsYWcKLSAgICAgICAgfQotICAgICAgICBwYXJzZVVFKCZicik7ICAvLyBiaXRfZGVwdGhfbHVtYV9taW51czgKLSAgICAgICAgcGFyc2VVRSgmYnIpOyAgLy8gYml0X2RlcHRoX2Nocm9tYV9taW51czgKLSAgICAgICAgYnIuc2tpcEJpdHMoMSk7ICAvLyBxcHByaW1lX3lfemVyb190cmFuc2Zvcm1fYnlwYXNzX2ZsYWcKLQotICAgICAgICBpZiAoYnIuZ2V0Qml0cygxKSkgeyAgLy8gc2VxX3NjYWxpbmdfbWF0cml4X3ByZXNlbnRfZmxhZwotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCA4OyArK2kpIHsKLSAgICAgICAgICAgICAgICBpZiAoYnIuZ2V0Qml0cygxKSkgeyAgLy8gc2VxX3NjYWxpbmdfbGlzdF9wcmVzZW50X2ZsYWdbaV0KLQotICAgICAgICAgICAgICAgICAgICAvLyBXQVJOSU5HOiB0aGUgY29kZSBiZWxvdyBoYXMgbm90IGV2ZXIgYmVlbiBleGVyY2lzZWQuLi4KLSAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCBhIHJlYWwtd29ybGQgZXhhbXBsZS4KLQotICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IDYpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNjYWxpbmdMaXN0NHg0W2ldLDE2LC4uLgotICAgICAgICAgICAgICAgICAgICAgICAgc2tpcFNjYWxpbmdMaXN0KCZiciwgMTYpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2NhbGluZ0xpc3Q4eDhbaS02XSw2NCwuLi4KLSAgICAgICAgICAgICAgICAgICAgICAgIHNraXBTY2FsaW5nTGlzdCgmYnIsIDY0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHBhcnNlVUUoJmJyKTsgIC8vIGxvZzJfbWF4X2ZyYW1lX251bV9taW51czQKLSAgICB1bnNpZ25lZCBwaWNfb3JkZXJfY250X3R5cGUgPSBwYXJzZVVFKCZicik7Ci0KLSAgICBpZiAocGljX29yZGVyX2NudF90eXBlID09IDApIHsKLSAgICAgICAgcGFyc2VVRSgmYnIpOyAgLy8gbG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0Ci0gICAgfSBlbHNlIGlmIChwaWNfb3JkZXJfY250X3R5cGUgPT0gMSkgewotICAgICAgICAvLyBvZmZzZXRfZm9yX25vbl9yZWZfcGljLCBvZmZzZXRfZm9yX3RvcF90b19ib3R0b21fZmllbGQgYW5kCi0gICAgICAgIC8vIG9mZnNldF9mb3JfcmVmX2ZyYW1lIGFyZSB0ZWNobmljYWxseSBzZSh2KSwgYnV0IHNpbmNlIHdlIGFyZQotICAgICAgICAvLyBqdXN0IHNraXBwaW5nIG92ZXIgdGhlbSB0aGUgbWlkcG9pbnQgZG9lcyBub3QgbWF0dGVyLgotCi0gICAgICAgIGJyLmdldEJpdHMoMSk7ICAvLyBkZWx0YV9waWNfb3JkZXJfYWx3YXlzX3plcm9fZmxhZwotICAgICAgICBwYXJzZVVFKCZicik7ICAvLyBvZmZzZXRfZm9yX25vbl9yZWZfcGljCi0gICAgICAgIHBhcnNlVUUoJmJyKTsgIC8vIG9mZnNldF9mb3JfdG9wX3RvX2JvdHRvbV9maWVsZAotCi0gICAgICAgIHVuc2lnbmVkIG51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGUgPSBwYXJzZVVFKCZicik7Ci0gICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlOyArK2kpIHsKLSAgICAgICAgICAgIHBhcnNlVUUoJmJyKTsgIC8vIG9mZnNldF9mb3JfcmVmX2ZyYW1lCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwYXJzZVVFKCZicik7ICAvLyBudW1fcmVmX2ZyYW1lcwotICAgIGJyLmdldEJpdHMoMSk7ICAvLyBnYXBzX2luX2ZyYW1lX251bV92YWx1ZV9hbGxvd2VkX2ZsYWcKLQotICAgIHVuc2lnbmVkIHBpY193aWR0aF9pbl9tYnNfbWludXMxID0gcGFyc2VVRSgmYnIpOwotICAgIHVuc2lnbmVkIHBpY19oZWlnaHRfaW5fbWFwX3VuaXRzX21pbnVzMSA9IHBhcnNlVUUoJmJyKTsKLSAgICB1bnNpZ25lZCBmcmFtZV9tYnNfb25seV9mbGFnID0gYnIuZ2V0Qml0cygxKTsKLQotICAgICp3aWR0aCA9IHBpY193aWR0aF9pbl9tYnNfbWludXMxICogMTYgKyAxNjsKLQotICAgICpoZWlnaHQgPSAoMiAtIGZyYW1lX21ic19vbmx5X2ZsYWcpCi0gICAgICAgICogKHBpY19oZWlnaHRfaW5fbWFwX3VuaXRzX21pbnVzMSAqIDE2ICsgMTYpOwotCi0gICAgaWYgKCFmcmFtZV9tYnNfb25seV9mbGFnKSB7Ci0gICAgICAgIGJyLmdldEJpdHMoMSk7ICAvLyBtYl9hZGFwdGl2ZV9mcmFtZV9maWVsZF9mbGFnCi0gICAgfQotCi0gICAgYnIuZ2V0Qml0cygxKTsgIC8vIGRpcmVjdF84eDhfaW5mZXJlbmNlX2ZsYWcKLQotICAgIGlmIChici5nZXRCaXRzKDEpKSB7ICAvLyBmcmFtZV9jcm9wcGluZ19mbGFnCi0gICAgICAgIHVuc2lnbmVkIGZyYW1lX2Nyb3BfbGVmdF9vZmZzZXQgPSBwYXJzZVVFKCZicik7Ci0gICAgICAgIHVuc2lnbmVkIGZyYW1lX2Nyb3BfcmlnaHRfb2Zmc2V0ID0gcGFyc2VVRSgmYnIpOwotICAgICAgICB1bnNpZ25lZCBmcmFtZV9jcm9wX3RvcF9vZmZzZXQgPSBwYXJzZVVFKCZicik7Ci0gICAgICAgIHVuc2lnbmVkIGZyYW1lX2Nyb3BfYm90dG9tX29mZnNldCA9IHBhcnNlVUUoJmJyKTsKLQotICAgICAgICB1bnNpZ25lZCBjcm9wVW5pdFgsIGNyb3BVbml0WTsKLSAgICAgICAgaWYgKGNocm9tYV9mb3JtYXRfaWRjID09IDAgIC8qIG1vbm9jaHJvbWUgKi8pIHsKLSAgICAgICAgICAgIGNyb3BVbml0WCA9IDE7Ci0gICAgICAgICAgICBjcm9wVW5pdFkgPSAyIC0gZnJhbWVfbWJzX29ubHlfZmxhZzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIHN1YldpZHRoQyA9IChjaHJvbWFfZm9ybWF0X2lkYyA9PSAzKSA/IDEgOiAyOwotICAgICAgICAgICAgdW5zaWduZWQgc3ViSGVpZ2h0QyA9IChjaHJvbWFfZm9ybWF0X2lkYyA9PSAxKSA/IDIgOiAxOwotCi0gICAgICAgICAgICBjcm9wVW5pdFggPSBzdWJXaWR0aEM7Ci0gICAgICAgICAgICBjcm9wVW5pdFkgPSBzdWJIZWlnaHRDICogKDIgLSBmcmFtZV9tYnNfb25seV9mbGFnKTsKLSAgICAgICAgfQotCi0gICAgICAgIEFMT0dWKCJmcmFtZV9jcm9wID0gKCV1LCAldSwgJXUsICV1KSwgY3JvcFVuaXRYID0gJXUsIGNyb3BVbml0WSA9ICV1IiwKLSAgICAgICAgICAgICBmcmFtZV9jcm9wX2xlZnRfb2Zmc2V0LCBmcmFtZV9jcm9wX3JpZ2h0X29mZnNldCwKLSAgICAgICAgICAgICBmcmFtZV9jcm9wX3RvcF9vZmZzZXQsIGZyYW1lX2Nyb3BfYm90dG9tX29mZnNldCwKLSAgICAgICAgICAgICBjcm9wVW5pdFgsIGNyb3BVbml0WSk7Ci0KLSAgICAgICAgKndpZHRoIC09Ci0gICAgICAgICAgICAoZnJhbWVfY3JvcF9sZWZ0X29mZnNldCArIGZyYW1lX2Nyb3BfcmlnaHRfb2Zmc2V0KSAqIGNyb3BVbml0WDsKLSAgICAgICAgKmhlaWdodCAtPQotICAgICAgICAgICAgKGZyYW1lX2Nyb3BfdG9wX29mZnNldCArIGZyYW1lX2Nyb3BfYm90dG9tX29mZnNldCkgKiBjcm9wVW5pdFk7Ci0gICAgfQotCi0gICAgaWYgKHNhcldpZHRoICE9IE5VTEwpIHsKLSAgICAgICAgKnNhcldpZHRoID0gMDsKLSAgICB9Ci0KLSAgICBpZiAoc2FySGVpZ2h0ICE9IE5VTEwpIHsKLSAgICAgICAgKnNhckhlaWdodCA9IDA7Ci0gICAgfQotCi0gICAgaWYgKGJyLmdldEJpdHMoMSkpIHsgIC8vIHZ1aV9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZwotICAgICAgICB1bnNpZ25lZCBzYXJfd2lkdGggPSAwLCBzYXJfaGVpZ2h0ID0gMDsKLQotICAgICAgICBpZiAoYnIuZ2V0Qml0cygxKSkgeyAgLy8gYXNwZWN0X3JhdGlvX2luZm9fcHJlc2VudF9mbGFnCi0gICAgICAgICAgICB1bnNpZ25lZCBhc3BlY3RfcmF0aW9faWRjID0gYnIuZ2V0Qml0cyg4KTsKLQotICAgICAgICAgICAgaWYgKGFzcGVjdF9yYXRpb19pZGMgPT0gMjU1IC8qIGV4dGVuZGVkU0FSICovKSB7Ci0gICAgICAgICAgICAgICAgc2FyX3dpZHRoID0gYnIuZ2V0Qml0cygxNik7Ci0gICAgICAgICAgICAgICAgc2FyX2hlaWdodCA9IGJyLmdldEJpdHMoMTYpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsgdW5zaWduZWQgd2lkdGgsIGhlaWdodDsgfSBrRml4ZWRTQVJzW10gPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB7ICAgMCwgIDAgfSwgLy8gSW52YWxpZAotICAgICAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICB7ICAxMiwgMTEgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHsgIDEwLCAxMSB9LAotICAgICAgICAgICAgICAgICAgICAgICAgeyAgMTYsIDExIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICB7ICA0MCwgMzMgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHsgIDI0LCAxMSB9LAotICAgICAgICAgICAgICAgICAgICAgICAgeyAgMjAsIDExIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICB7ICAzMiwgMTEgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHsgIDgwLCAzMyB9LAotICAgICAgICAgICAgICAgICAgICAgICAgeyAgMTgsIDExIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICB7ICAxNSwgMTEgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHsgIDY0LCAzMyB9LAotICAgICAgICAgICAgICAgICAgICAgICAgeyAxNjAsIDk5IH0sCi0gICAgICAgICAgICAgICAgICAgICAgICB7ICAgNCwgIDMgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHsgICAzLCAgMiB9LAotICAgICAgICAgICAgICAgICAgICAgICAgeyAgIDIsICAxIH0sCi0gICAgICAgICAgICAgICAgfTsKLQotICAgICAgICAgICAgICAgIGlmIChhc3BlY3RfcmF0aW9faWRjID4gMCAmJiBhc3BlY3RfcmF0aW9faWRjIDwgTkVMRU0oa0ZpeGVkU0FScykpIHsKLSAgICAgICAgICAgICAgICAgICAgc2FyX3dpZHRoID0ga0ZpeGVkU0FSc1thc3BlY3RfcmF0aW9faWRjXS53aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgc2FyX2hlaWdodCA9IGtGaXhlZFNBUnNbYXNwZWN0X3JhdGlvX2lkY10uaGVpZ2h0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEFMT0dWKCJzYW1wbGUgYXNwZWN0IHJhdGlvID0gJXUgOiAldSIsIHNhcl93aWR0aCwgc2FyX2hlaWdodCk7Ci0KLSAgICAgICAgaWYgKHNhcldpZHRoICE9IE5VTEwpIHsKLSAgICAgICAgICAgICpzYXJXaWR0aCA9IHNhcl93aWR0aDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzYXJIZWlnaHQgIT0gTlVMTCkgewotICAgICAgICAgICAgKnNhckhlaWdodCA9IHNhcl9oZWlnaHQ7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXR1c190IGdldE5leHROQUxVbml0KAotICAgICAgICBjb25zdCB1aW50OF90ICoqX2RhdGEsIHNpemVfdCAqX3NpemUsCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKipuYWxTdGFydCwgc2l6ZV90ICpuYWxTaXplLAotICAgICAgICBib29sIHN0YXJ0Q29kZUZvbGxvd3MpIHsKLSAgICBjb25zdCB1aW50OF90ICpkYXRhID0gKl9kYXRhOwotICAgIHNpemVfdCBzaXplID0gKl9zaXplOwotCi0gICAgKm5hbFN0YXJ0ID0gTlVMTDsKLSAgICAqbmFsU2l6ZSA9IDA7Ci0KLSAgICBpZiAoc2l6ZSA8IDMpIHsKLSAgICAgICAgcmV0dXJuIC1FQUdBSU47Ci0gICAgfQotCi0gICAgc2l6ZV90IG9mZnNldCA9IDA7Ci0KLSAgICAvLyBBIHZhbGlkIHN0YXJ0Y29kZSBjb25zaXN0cyBvZiBhdCBsZWFzdCB0d28gMHgwMCBieXRlcyBmb2xsb3dlZCBieSAweDAxLgotICAgIGZvciAoOyBvZmZzZXQgKyAyIDwgc2l6ZTsgKytvZmZzZXQpIHsKLSAgICAgICAgaWYgKGRhdGFbb2Zmc2V0ICsgMl0gPT0gMHgwMSAmJiBkYXRhW29mZnNldF0gPT0gMHgwMAotICAgICAgICAgICAgICAgICYmIGRhdGFbb2Zmc2V0ICsgMV0gPT0gMHgwMCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG9mZnNldCArIDIgPj0gc2l6ZSkgewotICAgICAgICAqX2RhdGEgPSAmZGF0YVtvZmZzZXRdOwotICAgICAgICAqX3NpemUgPSAyOwotICAgICAgICByZXR1cm4gLUVBR0FJTjsKLSAgICB9Ci0gICAgb2Zmc2V0ICs9IDM7Ci0KLSAgICBzaXplX3Qgc3RhcnRPZmZzZXQgPSBvZmZzZXQ7Ci0KLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIHdoaWxlIChvZmZzZXQgPCBzaXplICYmIGRhdGFbb2Zmc2V0XSAhPSAweDAxKSB7Ci0gICAgICAgICAgICArK29mZnNldDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvZmZzZXQgPT0gc2l6ZSkgewotICAgICAgICAgICAgaWYgKHN0YXJ0Q29kZUZvbGxvd3MpIHsKLSAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplICsgMjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIC1FQUdBSU47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGF0YVtvZmZzZXQgLSAxXSA9PSAweDAwICYmIGRhdGFbb2Zmc2V0IC0gMl0gPT0gMHgwMCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICArK29mZnNldDsKLSAgICB9Ci0KLSAgICBzaXplX3QgZW5kT2Zmc2V0ID0gb2Zmc2V0IC0gMjsKLSAgICB3aGlsZSAoZW5kT2Zmc2V0ID4gc3RhcnRPZmZzZXQgKyAxICYmIGRhdGFbZW5kT2Zmc2V0IC0gMV0gPT0gMHgwMCkgewotICAgICAgICAtLWVuZE9mZnNldDsKLSAgICB9Ci0KLSAgICAqbmFsU3RhcnQgPSAmZGF0YVtzdGFydE9mZnNldF07Ci0gICAgKm5hbFNpemUgPSBlbmRPZmZzZXQgLSBzdGFydE9mZnNldDsKLQotICAgIGlmIChvZmZzZXQgKyAyIDwgc2l6ZSkgewotICAgICAgICAqX2RhdGEgPSAmZGF0YVtvZmZzZXQgLSAyXTsKLSAgICAgICAgKl9zaXplID0gc2l6ZSAtIG9mZnNldCArIDI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKl9kYXRhID0gTlVMTDsKLSAgICAgICAgKl9zaXplID0gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXRpYyBzcDxBQnVmZmVyPiBGaW5kTkFMKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplLCB1bnNpZ25lZCBuYWxUeXBlKSB7Ci0gICAgY29uc3QgdWludDhfdCAqbmFsU3RhcnQ7Ci0gICAgc2l6ZV90IG5hbFNpemU7Ci0gICAgd2hpbGUgKGdldE5leHROQUxVbml0KCZkYXRhLCAmc2l6ZSwgJm5hbFN0YXJ0LCAmbmFsU2l6ZSwgdHJ1ZSkgPT0gT0spIHsKLSAgICAgICAgaWYgKG5hbFNpemUgPiAwICYmIChuYWxTdGFydFswXSAmIDB4MWYpID09IG5hbFR5cGUpIHsKLSAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKG5hbFNpemUpOwotICAgICAgICAgICAgbWVtY3B5KGJ1ZmZlci0+ZGF0YSgpLCBuYWxTdGFydCwgbmFsU2l6ZSk7Ci0gICAgICAgICAgICByZXR1cm4gYnVmZmVyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLWNvbnN0IGNoYXIgKkFWQ1Byb2ZpbGVUb1N0cmluZyh1aW50OF90IHByb2ZpbGUpIHsKLSAgICBzd2l0Y2ggKHByb2ZpbGUpIHsKLSAgICAgICAgY2FzZSBrQVZDUHJvZmlsZUJhc2VsaW5lOgotICAgICAgICAgICAgcmV0dXJuICJCYXNlbGluZSI7Ci0gICAgICAgIGNhc2Uga0FWQ1Byb2ZpbGVNYWluOgotICAgICAgICAgICAgcmV0dXJuICJNYWluIjsKLSAgICAgICAgY2FzZSBrQVZDUHJvZmlsZUV4dGVuZGVkOgotICAgICAgICAgICAgcmV0dXJuICJFeHRlbmRlZCI7Ci0gICAgICAgIGNhc2Uga0FWQ1Byb2ZpbGVIaWdoOgotICAgICAgICAgICAgcmV0dXJuICJIaWdoIjsKLSAgICAgICAgY2FzZSBrQVZDUHJvZmlsZUhpZ2gxMDoKLSAgICAgICAgICAgIHJldHVybiAiSGlnaCAxMCI7Ci0gICAgICAgIGNhc2Uga0FWQ1Byb2ZpbGVIaWdoNDIyOgotICAgICAgICAgICAgcmV0dXJuICJIaWdoIDQyMiI7Ci0gICAgICAgIGNhc2Uga0FWQ1Byb2ZpbGVIaWdoNDQ0OgotICAgICAgICAgICAgcmV0dXJuICJIaWdoIDQ0NCI7Ci0gICAgICAgIGNhc2Uga0FWQ1Byb2ZpbGVDQVZMQzQ0NEludHJhOgotICAgICAgICAgICAgcmV0dXJuICJDQVZMQyA0NDQgSW50cmEiOwotICAgICAgICBkZWZhdWx0OiAgIHJldHVybiAiVW5rbm93biI7Ci0gICAgfQotfQotCi1zcDxNZXRhRGF0YT4gTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KSB7Ci0gICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGFjY2Vzc1VuaXQtPmRhdGEoKTsKLSAgICBzaXplX3Qgc2l6ZSA9IGFjY2Vzc1VuaXQtPnNpemUoKTsKLQotICAgIHNwPEFCdWZmZXI+IHNlcVBhcmFtU2V0ID0gRmluZE5BTChkYXRhLCBzaXplLCA3KTsKLSAgICBpZiAoc2VxUGFyYW1TZXQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7Ci0gICAgaW50MzJfdCBzYXJXaWR0aCwgc2FySGVpZ2h0OwotICAgIEZpbmRBVkNEaW1lbnNpb25zKAotICAgICAgICAgICAgc2VxUGFyYW1TZXQsICZ3aWR0aCwgJmhlaWdodCwgJnNhcldpZHRoLCAmc2FySGVpZ2h0KTsKLQotICAgIHNwPEFCdWZmZXI+IHBpY1BhcmFtU2V0ID0gRmluZE5BTChkYXRhLCBzaXplLCA4KTsKLSAgICBDSEVDSyhwaWNQYXJhbVNldCAhPSBOVUxMKTsKLQotICAgIHNpemVfdCBjc2RTaXplID0KLSAgICAgICAgMSArIDMgKyAxICsgMQotICAgICAgICArIDIgKiAxICsgc2VxUGFyYW1TZXQtPnNpemUoKQotICAgICAgICArIDEgKyAyICogMSArIHBpY1BhcmFtU2V0LT5zaXplKCk7Ci0KLSAgICBzcDxBQnVmZmVyPiBjc2QgPSBuZXcgQUJ1ZmZlcihjc2RTaXplKTsKLSAgICB1aW50OF90ICpvdXQgPSBjc2QtPmRhdGEoKTsKLQotICAgICpvdXQrKyA9IDB4MDE7ICAvLyBjb25maWd1cmF0aW9uVmVyc2lvbgotICAgIG1lbWNweShvdXQsIHNlcVBhcmFtU2V0LT5kYXRhKCkgKyAxLCAzKTsgIC8vIHByb2ZpbGUvbGV2ZWwuLi4KLQotICAgIHVpbnQ4X3QgcHJvZmlsZSA9IG91dFswXTsKLSAgICB1aW50OF90IGxldmVsID0gb3V0WzJdOwotCi0gICAgb3V0ICs9IDM7Ci0gICAgKm91dCsrID0gKDB4M2YgPDwgMikgfCAxOyAgLy8gbGVuZ3RoU2l6ZSA9PSAyIGJ5dGVzCi0gICAgKm91dCsrID0gMHhlMCB8IDE7Ci0KLSAgICAqb3V0KysgPSBzZXFQYXJhbVNldC0+c2l6ZSgpID4+IDg7Ci0gICAgKm91dCsrID0gc2VxUGFyYW1TZXQtPnNpemUoKSAmIDB4ZmY7Ci0gICAgbWVtY3B5KG91dCwgc2VxUGFyYW1TZXQtPmRhdGEoKSwgc2VxUGFyYW1TZXQtPnNpemUoKSk7Ci0gICAgb3V0ICs9IHNlcVBhcmFtU2V0LT5zaXplKCk7Ci0KLSAgICAqb3V0KysgPSAxOwotCi0gICAgKm91dCsrID0gcGljUGFyYW1TZXQtPnNpemUoKSA+PiA4OwotICAgICpvdXQrKyA9IHBpY1BhcmFtU2V0LT5zaXplKCkgJiAweGZmOwotICAgIG1lbWNweShvdXQsIHBpY1BhcmFtU2V0LT5kYXRhKCksIHBpY1BhcmFtU2V0LT5zaXplKCkpOwotCi0jaWYgMAotICAgIEFMT0dJKCJBVkMgc2VxIHBhcmFtIHNldCIpOwotICAgIGhleGR1bXAoc2VxUGFyYW1TZXQtPmRhdGEoKSwgc2VxUGFyYW1TZXQtPnNpemUoKSk7Ci0jZW5kaWYKLQotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOwotICAgIG1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOwotCi0gICAgbWV0YS0+c2V0RGF0YShrS2V5QVZDQywga1R5cGVBVkNDLCBjc2QtPmRhdGEoKSwgY3NkLT5zaXplKCkpOwotICAgIG1ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgd2lkdGgpOwotICAgIG1ldGEtPnNldEludDMyKGtLZXlIZWlnaHQsIGhlaWdodCk7Ci0KLSAgICBpZiAoKHNhcldpZHRoID4gMCAmJiBzYXJIZWlnaHQgPiAwKSAmJiAoc2FyV2lkdGggIT0gMSB8fCBzYXJIZWlnaHQgIT0gMSkpIHsKLSAgICAgICAgLy8gV2UgdHJlYXQgKjowIGFuZCAwOiogKHVuc3BlY2lmaWVkKSBhcyAxOjEuCi0KLSAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVNBUldpZHRoLCBzYXJXaWR0aCk7Ci0gICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlTQVJIZWlnaHQsIHNhckhlaWdodCk7Ci0KLSAgICAgICAgQUxPR0koImZvdW5kIEFWQyBjb2RlYyBjb25maWcgKCVkIHggJWQsICVzLXByb2ZpbGUgbGV2ZWwgJWQuJWQpICIKLSAgICAgICAgICAgICAgIlNBUiAlZCA6ICVkIiwKLSAgICAgICAgICAgICB3aWR0aCwKLSAgICAgICAgICAgICBoZWlnaHQsCi0gICAgICAgICAgICAgQVZDUHJvZmlsZVRvU3RyaW5nKHByb2ZpbGUpLAotICAgICAgICAgICAgIGxldmVsIC8gMTAsCi0gICAgICAgICAgICAgbGV2ZWwgJSAxMCwKLSAgICAgICAgICAgICBzYXJXaWR0aCwKLSAgICAgICAgICAgICBzYXJIZWlnaHQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dJKCJmb3VuZCBBVkMgY29kZWMgY29uZmlnICglZCB4ICVkLCAlcy1wcm9maWxlIGxldmVsICVkLiVkKSIsCi0gICAgICAgICAgICAgd2lkdGgsCi0gICAgICAgICAgICAgaGVpZ2h0LAotICAgICAgICAgICAgIEFWQ1Byb2ZpbGVUb1N0cmluZyhwcm9maWxlKSwKLSAgICAgICAgICAgICBsZXZlbCAvIDEwLAotICAgICAgICAgICAgIGxldmVsICUgMTApOwotICAgIH0KLQotICAgIHJldHVybiBtZXRhOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWJvb2wgSXNJRFJJbnRlcm5hbChjb25zdCBzcDxUPiAmYnVmZmVyKSB7Ci0gICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpOwotICAgIHNpemVfdCBzaXplID0gYnVmZmVyLT5zaXplKCk7Ci0KLSAgICBib29sIGZvdW5kSURSID0gZmFsc2U7Ci0KLSAgICBjb25zdCB1aW50OF90ICpuYWxTdGFydDsKLSAgICBzaXplX3QgbmFsU2l6ZTsKLSAgICB3aGlsZSAoZ2V0TmV4dE5BTFVuaXQoJmRhdGEsICZzaXplLCAmbmFsU3RhcnQsICZuYWxTaXplLCB0cnVlKSA9PSBPSykgewotICAgICAgICBpZiAobmFsU2l6ZSA9PSAwdSkgewotICAgICAgICAgICAgQUxPR1coInNraXBwaW5nIGVtcHR5IG5hbCB1bml0IGZyb20gcG90ZW50aWFsbHkgbWFsZm9ybWVkIGJpdHN0cmVhbSIpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICB1bnNpZ25lZCBuYWxUeXBlID0gbmFsU3RhcnRbMF0gJiAweDFmOwotCi0gICAgICAgIGlmIChuYWxUeXBlID09IDUpIHsKLSAgICAgICAgICAgIGZvdW5kSURSID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGZvdW5kSURSOwotfQotCi1ib29sIElzSURSKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKLSAgICByZXR1cm4gSXNJRFJJbnRlcm5hbChidWZmZXIpOwotfQotCi1ib29sIElzSURSKGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIpIHsKLSAgICByZXR1cm4gSXNJRFJJbnRlcm5hbChidWZmZXIpOwotfQotCi1ib29sIElzQVZDUmVmZXJlbmNlRnJhbWUoY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpIHsKLSAgICBjb25zdCB1aW50OF90ICpkYXRhID0gYWNjZXNzVW5pdC0+ZGF0YSgpOwotICAgIHNpemVfdCBzaXplID0gYWNjZXNzVW5pdC0+c2l6ZSgpOwotICAgIGlmIChkYXRhID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIklzQVZDUmVmZXJlbmNlRnJhbWU6IGNhbGxlZCBvbiBOVUxMIGRhdGEgKCVwLCAlenUpIiwgYWNjZXNzVW5pdC5nZXQoKSwgc2l6ZSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBjb25zdCB1aW50OF90ICpuYWxTdGFydDsKLSAgICBzaXplX3QgbmFsU2l6ZTsKLSAgICB3aGlsZSAoZ2V0TmV4dE5BTFVuaXQoJmRhdGEsICZzaXplLCAmbmFsU3RhcnQsICZuYWxTaXplLCB0cnVlKSA9PSBPSykgewotICAgICAgICBpZiAobmFsU2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiSXNBVkNSZWZlcmVuY2VGcmFtZTogaW52YWxpZCBuYWxTaXplOiAwICglcCwgJXp1KSIsIGFjY2Vzc1VuaXQuZ2V0KCksIHNpemUpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgdW5zaWduZWQgbmFsVHlwZSA9IG5hbFN0YXJ0WzBdICYgMHgxZjsKLQotICAgICAgICBpZiAobmFsVHlwZSA9PSA1KSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChuYWxUeXBlID09IDEpIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIG5hbF9yZWZfaWRjID0gKG5hbFN0YXJ0WzBdID4+IDUpICYgMzsKLSAgICAgICAgICAgIHJldHVybiBuYWxfcmVmX2lkYyAhPSAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXVpbnQzMl90IEZpbmRBVkNMYXllcklkKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgQ0hFQ0soZGF0YSAhPSBOVUxMKTsKLQotICAgIGNvbnN0IHVuc2lnbmVkIGtTdmNOYWxUeXBlID0gMHhFOwotICAgIGNvbnN0IHVuc2lnbmVkIGtTdmNOYWxTZWFyY2hSYW5nZSA9IDMyOwotICAgIC8vIFNWQyBOQUwKLSAgICAvLyB8LS0tMCAxMTEwfDEtLS0gLS0tLXwtLS0tIC0tLS18aWlpLSAtLS18Ci0gICAgLy8gICAgICAgXiAgICAgICAgICAgICAgICAgICAgICAgIF4KLSAgICAvLyAgIE5BTC10eXBlID0gMHhFICAgICAgICAgICAgICAgbGF5ZXItSWQKLSAgICAvLwotICAgIC8vIGxheWVyX2lkIDAgaXMgZm9yIGJhc2UgbGF5ZXIsIHdoaWxlIDEsIDIsIC4uLiBhcmUgZW5oYW5jZW1lbnQgbGF5ZXJzLgotICAgIC8vIExheWVyIG4gdXNlcyByZWZlcmVuY2UgZnJhbWVzIGZyb20gbGF5ZXIgMCwgMSwgLi4uLCBuLTEuCi0KLSAgICB1aW50MzJfdCBsYXllcklkID0gMDsKLSAgICBzcDxBQnVmZmVyPiBzdmNOQUwgPSBGaW5kTkFMKAotICAgICAgICAgICAgZGF0YSwgc2l6ZSA+IGtTdmNOYWxTZWFyY2hSYW5nZSA/IGtTdmNOYWxTZWFyY2hSYW5nZSA6IHNpemUsIGtTdmNOYWxUeXBlKTsKLSAgICBpZiAoc3ZjTkFMICE9IE5VTEwgJiYgc3ZjTkFMLT5zaXplKCkgPj0gNCkgewotICAgICAgICBsYXllcklkID0gKCooc3ZjTkFMLT5kYXRhKCkgKyAzKSA+PiA1KSAmIDB4NzsKLSAgICB9Ci0gICAgcmV0dXJuIGxheWVySWQ7Ci19Ci0KLXNwPE1ldGFEYXRhPiBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoCi0gICAgICAgIHVuc2lnbmVkIHByb2ZpbGUsIHVuc2lnbmVkIHNhbXBsaW5nX2ZyZXFfaW5kZXgsCi0gICAgICAgIHVuc2lnbmVkIGNoYW5uZWxfY29uZmlndXJhdGlvbikgewotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOwotICAgIG1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpOwotCi0gICAgQ0hFQ0tfTEUoc2FtcGxpbmdfZnJlcV9pbmRleCwgMTF1KTsKLSAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrU2FtcGxpbmdGcmVxW10gPSB7Ci0gICAgICAgIDk2MDAwLCA4ODIwMCwgNjQwMDAsIDQ4MDAwLCA0NDEwMCwgMzIwMDAsIDI0MDAwLCAyMjA1MCwKLSAgICAgICAgMTYwMDAsIDEyMDAwLCAxMTAyNSwgODAwMAotICAgIH07Ci0gICAgbWV0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIGtTYW1wbGluZ0ZyZXFbc2FtcGxpbmdfZnJlcV9pbmRleF0pOwotICAgIG1ldGEtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIGNoYW5uZWxfY29uZmlndXJhdGlvbik7Ci0KLSAgICBzdGF0aWMgY29uc3QgdWludDhfdCBrU3RhdGljRVNEU1tdID0gewotICAgICAgICAweDAzLCAyMiwKLSAgICAgICAgMHgwMCwgMHgwMCwgICAgIC8vIEVTX0lECi0gICAgICAgIDB4MDAsICAgICAgICAgICAvLyBzdHJlYW1EZXBlbmRlbmNlRmxhZywgVVJMX0ZsYWcsIE9DUnN0cmVhbUZsYWcKLQotICAgICAgICAweDA0LCAxNywKLSAgICAgICAgMHg0MCwgICAgICAgICAgICAgICAgICAgICAgIC8vIEF1ZGlvIElTTy9JRUMgMTQ0OTYtMwotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCi0gICAgICAgIDB4MDUsIDIsCi0gICAgICAgIC8vIEF1ZGlvU3BlY2lmaWNJbmZvIGZvbGxvd3MKLQotICAgICAgICAvLyBvb29vIG9mZmYgZmNjYyBjMDAwCi0gICAgICAgIC8vIG8gLSBhdWRpb09iamVjdFR5cGUKLSAgICAgICAgLy8gZiAtIHNhbXBsaW5nRnJlcUluZGV4Ci0gICAgICAgIC8vIGMgLSBjaGFubmVsQ29uZmlnCi0gICAgfTsKLSAgICBzcDxBQnVmZmVyPiBjc2QgPSBuZXcgQUJ1ZmZlcihzaXplb2Yoa1N0YXRpY0VTRFMpICsgMik7Ci0gICAgbWVtY3B5KGNzZC0+ZGF0YSgpLCBrU3RhdGljRVNEUywgc2l6ZW9mKGtTdGF0aWNFU0RTKSk7Ci0KLSAgICBjc2QtPmRhdGEoKVtzaXplb2Yoa1N0YXRpY0VTRFMpXSA9Ci0gICAgICAgICgocHJvZmlsZSArIDEpIDw8IDMpIHwgKHNhbXBsaW5nX2ZyZXFfaW5kZXggPj4gMSk7Ci0KLSAgICBjc2QtPmRhdGEoKVtzaXplb2Yoa1N0YXRpY0VTRFMpICsgMV0gPQotICAgICAgICAoKHNhbXBsaW5nX2ZyZXFfaW5kZXggPDwgNykgJiAweDgwKSB8IChjaGFubmVsX2NvbmZpZ3VyYXRpb24gPDwgMyk7Ci0KLSAgICBtZXRhLT5zZXREYXRhKGtLZXlFU0RTLCAwLCBjc2QtPmRhdGEoKSwgY3NkLT5zaXplKCkpOwotCi0gICAgcmV0dXJuIG1ldGE7Ci19Ci0KLWJvb2wgRXh0cmFjdERpbWVuc2lvbnNGcm9tVk9MSGVhZGVyKAotICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSwgaW50MzJfdCAqd2lkdGgsIGludDMyX3QgKmhlaWdodCkgewotICAgIEFCaXRSZWFkZXIgYnIoJmRhdGFbNF0sIHNpemUgLSA0KTsKLSAgICBici5za2lwQml0cygxKTsgIC8vIHJhbmRvbV9hY2Nlc3NpYmxlX3ZvbAotICAgIHVuc2lnbmVkIHZpZGVvX29iamVjdF90eXBlX2luZGljYXRpb24gPSBici5nZXRCaXRzKDgpOwotCi0gICAgQ0hFQ0tfTkUodmlkZW9fb2JqZWN0X3R5cGVfaW5kaWNhdGlvbiwKLSAgICAgICAgICAgICAweDIxdSAvKiBGaW5lIEdyYW51bGFyaXR5IFNjYWxhYmxlICovKTsKLQotICAgIHVuc2lnbmVkIHZpZGVvX29iamVjdF9sYXllcl92ZXJpZCBfX3VudXNlZDsKLSAgICB1bnNpZ25lZCB2aWRlb19vYmplY3RfbGF5ZXJfcHJpb3JpdHkgX191bnVzZWQ7Ci0gICAgaWYgKGJyLmdldEJpdHMoMSkpIHsKLSAgICAgICAgdmlkZW9fb2JqZWN0X2xheWVyX3ZlcmlkID0gYnIuZ2V0Qml0cyg0KTsKLSAgICAgICAgdmlkZW9fb2JqZWN0X2xheWVyX3ByaW9yaXR5ID0gYnIuZ2V0Qml0cygzKTsKLSAgICB9Ci0gICAgdW5zaWduZWQgYXNwZWN0X3JhdGlvX2luZm8gPSBici5nZXRCaXRzKDQpOwotICAgIGlmIChhc3BlY3RfcmF0aW9faW5mbyA9PSAweDBmIC8qIGV4dGVuZGVkIFBBUiAqLykgewotICAgICAgICBici5za2lwQml0cyg4KTsgIC8vIHBhcl93aWR0aAotICAgICAgICBici5za2lwQml0cyg4KTsgIC8vIHBhcl9oZWlnaHQKLSAgICB9Ci0gICAgaWYgKGJyLmdldEJpdHMoMSkpIHsgIC8vIHZvbF9jb250cm9sX3BhcmFtZXRlcnMKLSAgICAgICAgYnIuc2tpcEJpdHMoMik7ICAvLyBjaHJvbWFfZm9ybWF0Ci0gICAgICAgIGJyLnNraXBCaXRzKDEpOyAgLy8gbG93X2RlbGF5Ci0gICAgICAgIGlmIChici5nZXRCaXRzKDEpKSB7ICAvLyB2YnZfcGFyYW1ldGVycwotICAgICAgICAgICAgYnIuc2tpcEJpdHMoMTUpOyAgLy8gZmlyc3RfaGFsZl9iaXRfcmF0ZQotICAgICAgICAgICAgQ0hFQ0soYnIuZ2V0Qml0cygxKSk7ICAvLyBtYXJrZXJfYml0Ci0gICAgICAgICAgICBici5za2lwQml0cygxNSk7ICAvLyBsYXR0ZXJfaGFsZl9iaXRfcmF0ZQotICAgICAgICAgICAgQ0hFQ0soYnIuZ2V0Qml0cygxKSk7ICAvLyBtYXJrZXJfYml0Ci0gICAgICAgICAgICBici5za2lwQml0cygxNSk7ICAvLyBmaXJzdF9oYWxmX3Zidl9idWZmZXJfc2l6ZQotICAgICAgICAgICAgQ0hFQ0soYnIuZ2V0Qml0cygxKSk7ICAvLyBtYXJrZXJfYml0Ci0gICAgICAgICAgICBici5za2lwQml0cygzKTsgIC8vIGxhdHRlcl9oYWxmX3Zidl9idWZmZXJfc2l6ZQotICAgICAgICAgICAgYnIuc2tpcEJpdHMoMTEpOyAgLy8gZmlyc3RfaGFsZl92YnZfb2NjdXBhbmN5Ci0gICAgICAgICAgICBDSEVDSyhici5nZXRCaXRzKDEpKTsgIC8vIG1hcmtlcl9iaXQKLSAgICAgICAgICAgIGJyLnNraXBCaXRzKDE1KTsgIC8vIGxhdHRlcl9oYWxmX3Zidl9vY2N1cGFuY3kKLSAgICAgICAgICAgIENIRUNLKGJyLmdldEJpdHMoMSkpOyAgLy8gbWFya2VyX2JpdAotICAgICAgICB9Ci0gICAgfQotICAgIHVuc2lnbmVkIHZpZGVvX29iamVjdF9sYXllcl9zaGFwZSA9IGJyLmdldEJpdHMoMik7Ci0gICAgQ0hFQ0tfRVEodmlkZW9fb2JqZWN0X2xheWVyX3NoYXBlLCAweDAwdSAvKiByZWN0YW5ndWxhciAqLyk7Ci0KLSAgICBDSEVDSyhici5nZXRCaXRzKDEpKTsgIC8vIG1hcmtlcl9iaXQKLSAgICB1bnNpZ25lZCB2b3BfdGltZV9pbmNyZW1lbnRfcmVzb2x1dGlvbiA9IGJyLmdldEJpdHMoMTYpOwotICAgIENIRUNLKGJyLmdldEJpdHMoMSkpOyAgLy8gbWFya2VyX2JpdAotCi0gICAgaWYgKGJyLmdldEJpdHMoMSkpIHsgIC8vIGZpeGVkX3ZvcF9yYXRlCi0gICAgICAgIC8vIHJhbmdlIFswLi52b3BfdGltZV9pbmNyZW1lbnRfcmVzb2x1dGlvbikKLQotICAgICAgICAvLyB2b3BfdGltZV9pbmNyZW1lbnRfcmVzb2x1dGlvbgotICAgICAgICAvLyAyID0+IDAuLjEsIDEgYml0Ci0gICAgICAgIC8vIDMgPT4gMC4uMiwgMiBiaXRzCi0gICAgICAgIC8vIDQgPT4gMC4uMywgMiBiaXRzCi0gICAgICAgIC8vIDUgPT4gMC4uNCwgMyBiaXRzCi0gICAgICAgIC8vIC4uLgotCi0gICAgICAgIENIRUNLX0dUKHZvcF90aW1lX2luY3JlbWVudF9yZXNvbHV0aW9uLCAwdSk7Ci0gICAgICAgIC0tdm9wX3RpbWVfaW5jcmVtZW50X3Jlc29sdXRpb247Ci0KLSAgICAgICAgdW5zaWduZWQgbnVtQml0cyA9IDA7Ci0gICAgICAgIHdoaWxlICh2b3BfdGltZV9pbmNyZW1lbnRfcmVzb2x1dGlvbiA+IDApIHsKLSAgICAgICAgICAgICsrbnVtQml0czsKLSAgICAgICAgICAgIHZvcF90aW1lX2luY3JlbWVudF9yZXNvbHV0aW9uID4+PSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgYnIuc2tpcEJpdHMobnVtQml0cyk7ICAvLyBmaXhlZF92b3BfdGltZV9pbmNyZW1lbnQKLSAgICB9Ci0KLSAgICBDSEVDSyhici5nZXRCaXRzKDEpKTsgIC8vIG1hcmtlcl9iaXQKLSAgICB1bnNpZ25lZCB2aWRlb19vYmplY3RfbGF5ZXJfd2lkdGggPSBici5nZXRCaXRzKDEzKTsKLSAgICBDSEVDSyhici5nZXRCaXRzKDEpKTsgIC8vIG1hcmtlcl9iaXQKLSAgICB1bnNpZ25lZCB2aWRlb19vYmplY3RfbGF5ZXJfaGVpZ2h0ID0gYnIuZ2V0Qml0cygxMyk7Ci0gICAgQ0hFQ0soYnIuZ2V0Qml0cygxKSk7ICAvLyBtYXJrZXJfYml0Ci0KLSAgICB1bnNpZ25lZCBpbnRlcmxhY2VkIF9fdW51c2VkID0gYnIuZ2V0Qml0cygxKTsKLQotICAgICp3aWR0aCA9IHZpZGVvX29iamVjdF9sYXllcl93aWR0aDsKLSAgICAqaGVpZ2h0ID0gdmlkZW9fb2JqZWN0X2xheWVyX2hlaWdodDsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIEdldE1QRUdBdWRpb0ZyYW1lU2l6ZSgKLSAgICAgICAgdWludDMyX3QgaGVhZGVyLCBzaXplX3QgKmZyYW1lX3NpemUsCi0gICAgICAgIGludCAqb3V0X3NhbXBsaW5nX3JhdGUsIGludCAqb3V0X2NoYW5uZWxzLAotICAgICAgICBpbnQgKm91dF9iaXRyYXRlLCBpbnQgKm91dF9udW1fc2FtcGxlcykgewotICAgICpmcmFtZV9zaXplID0gMDsKLQotICAgIGlmIChvdXRfc2FtcGxpbmdfcmF0ZSkgewotICAgICAgICAqb3V0X3NhbXBsaW5nX3JhdGUgPSAwOwotICAgIH0KLQotICAgIGlmIChvdXRfY2hhbm5lbHMpIHsKLSAgICAgICAgKm91dF9jaGFubmVscyA9IDA7Ci0gICAgfQotCi0gICAgaWYgKG91dF9iaXRyYXRlKSB7Ci0gICAgICAgICpvdXRfYml0cmF0ZSA9IDA7Ci0gICAgfQotCi0gICAgaWYgKG91dF9udW1fc2FtcGxlcykgewotICAgICAgICAqb3V0X251bV9zYW1wbGVzID0gMTE1MjsKLSAgICB9Ci0KLSAgICBpZiAoKGhlYWRlciAmIDB4ZmZlMDAwMDApICE9IDB4ZmZlMDAwMDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHVuc2lnbmVkIHZlcnNpb24gPSAoaGVhZGVyID4+IDE5KSAmIDM7Ci0KLSAgICBpZiAodmVyc2lvbiA9PSAweDAxKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB1bnNpZ25lZCBsYXllciA9IChoZWFkZXIgPj4gMTcpICYgMzsKLQotICAgIGlmIChsYXllciA9PSAweDAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB1bnNpZ25lZCBwcm90ZWN0aW9uIF9fdW51c2VkID0gKGhlYWRlciA+PiAxNikgJiAxOwotCi0gICAgdW5zaWduZWQgYml0cmF0ZV9pbmRleCA9IChoZWFkZXIgPj4gMTIpICYgMHgwZjsKLQotICAgIGlmIChiaXRyYXRlX2luZGV4ID09IDAgfHwgYml0cmF0ZV9pbmRleCA9PSAweDBmKSB7Ci0gICAgICAgIC8vIERpc2FsbG93ICJmcmVlIiBiaXRyYXRlLgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdW5zaWduZWQgc2FtcGxpbmdfcmF0ZV9pbmRleCA9IChoZWFkZXIgPj4gMTApICYgMzsKLQotICAgIGlmIChzYW1wbGluZ19yYXRlX2luZGV4ID09IDMpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHN0YXRpYyBjb25zdCBpbnQga1NhbXBsaW5nUmF0ZVYxW10gPSB7IDQ0MTAwLCA0ODAwMCwgMzIwMDAgfTsKLSAgICBpbnQgc2FtcGxpbmdfcmF0ZSA9IGtTYW1wbGluZ1JhdGVWMVtzYW1wbGluZ19yYXRlX2luZGV4XTsKLSAgICBpZiAodmVyc2lvbiA9PSAyIC8qIFYyICovKSB7Ci0gICAgICAgIHNhbXBsaW5nX3JhdGUgLz0gMjsKLSAgICB9IGVsc2UgaWYgKHZlcnNpb24gPT0gMCAvKiBWMi41ICovKSB7Ci0gICAgICAgIHNhbXBsaW5nX3JhdGUgLz0gNDsKLSAgICB9Ci0KLSAgICB1bnNpZ25lZCBwYWRkaW5nID0gKGhlYWRlciA+PiA5KSAmIDE7Ci0KLSAgICBpZiAobGF5ZXIgPT0gMykgewotICAgICAgICAvLyBsYXllciBJCi0KLSAgICAgICAgc3RhdGljIGNvbnN0IGludCBrQml0cmF0ZVYxW10gPSB7Ci0gICAgICAgICAgICAzMiwgNjQsIDk2LCAxMjgsIDE2MCwgMTkyLCAyMjQsIDI1NiwKLSAgICAgICAgICAgIDI4OCwgMzIwLCAzNTIsIDM4NCwgNDE2LCA0NDgKLSAgICAgICAgfTsKLQotICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtCaXRyYXRlVjJbXSA9IHsKLSAgICAgICAgICAgIDMyLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwgMTI4LAotICAgICAgICAgICAgMTQ0LCAxNjAsIDE3NiwgMTkyLCAyMjQsIDI1NgotICAgICAgICB9OwotCi0gICAgICAgIGludCBiaXRyYXRlID0KLSAgICAgICAgICAgICh2ZXJzaW9uID09IDMgLyogVjEgKi8pCi0gICAgICAgICAgICAgICAgPyBrQml0cmF0ZVYxW2JpdHJhdGVfaW5kZXggLSAxXQotICAgICAgICAgICAgICAgIDoga0JpdHJhdGVWMltiaXRyYXRlX2luZGV4IC0gMV07Ci0KLSAgICAgICAgaWYgKG91dF9iaXRyYXRlKSB7Ci0gICAgICAgICAgICAqb3V0X2JpdHJhdGUgPSBiaXRyYXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgKmZyYW1lX3NpemUgPSAoMTIwMDAgKiBiaXRyYXRlIC8gc2FtcGxpbmdfcmF0ZSArIHBhZGRpbmcpICogNDsKLQotICAgICAgICBpZiAob3V0X251bV9zYW1wbGVzKSB7Ci0gICAgICAgICAgICAqb3V0X251bV9zYW1wbGVzID0gMzg0OwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gbGF5ZXIgSUkgb3IgSUlJCi0KLSAgICAgICAgc3RhdGljIGNvbnN0IGludCBrQml0cmF0ZVYxTDJbXSA9IHsKLSAgICAgICAgICAgIDMyLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwgMTI4LAotICAgICAgICAgICAgMTYwLCAxOTIsIDIyNCwgMjU2LCAzMjAsIDM4NAotICAgICAgICB9OwotCi0gICAgICAgIHN0YXRpYyBjb25zdCBpbnQga0JpdHJhdGVWMUwzW10gPSB7Ci0gICAgICAgICAgICAzMiwgNDAsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLAotICAgICAgICAgICAgMTI4LCAxNjAsIDE5MiwgMjI0LCAyNTYsIDMyMAotICAgICAgICB9OwotCi0gICAgICAgIHN0YXRpYyBjb25zdCBpbnQga0JpdHJhdGVWMltdID0gewotICAgICAgICAgICAgOCwgMTYsIDI0LCAzMiwgNDAsIDQ4LCA1NiwgNjQsCi0gICAgICAgICAgICA4MCwgOTYsIDExMiwgMTI4LCAxNDQsIDE2MAotICAgICAgICB9OwotCi0gICAgICAgIGludCBiaXRyYXRlOwotICAgICAgICBpZiAodmVyc2lvbiA9PSAzIC8qIFYxICovKSB7Ci0gICAgICAgICAgICBiaXRyYXRlID0gKGxheWVyID09IDIgLyogTDIgKi8pCi0gICAgICAgICAgICAgICAgPyBrQml0cmF0ZVYxTDJbYml0cmF0ZV9pbmRleCAtIDFdCi0gICAgICAgICAgICAgICAgOiBrQml0cmF0ZVYxTDNbYml0cmF0ZV9pbmRleCAtIDFdOwotCi0gICAgICAgICAgICBpZiAob3V0X251bV9zYW1wbGVzKSB7Ci0gICAgICAgICAgICAgICAgKm91dF9udW1fc2FtcGxlcyA9IDExNTI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBWMiAob3IgMi41KQotCi0gICAgICAgICAgICBiaXRyYXRlID0ga0JpdHJhdGVWMltiaXRyYXRlX2luZGV4IC0gMV07Ci0gICAgICAgICAgICBpZiAob3V0X251bV9zYW1wbGVzKSB7Ci0gICAgICAgICAgICAgICAgKm91dF9udW1fc2FtcGxlcyA9IChsYXllciA9PSAxIC8qIEwzICovKSA/IDU3NiA6IDExNTI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob3V0X2JpdHJhdGUpIHsKLSAgICAgICAgICAgICpvdXRfYml0cmF0ZSA9IGJpdHJhdGU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodmVyc2lvbiA9PSAzIC8qIFYxICovKSB7Ci0gICAgICAgICAgICAqZnJhbWVfc2l6ZSA9IDE0NDAwMCAqIGJpdHJhdGUgLyBzYW1wbGluZ19yYXRlICsgcGFkZGluZzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFYyIG9yIFYyLjUKLSAgICAgICAgICAgIHNpemVfdCB0bXAgPSAobGF5ZXIgPT0gMSAvKiBMMyAqLykgPyA3MjAwMCA6IDE0NDAwMDsKLSAgICAgICAgICAgICpmcmFtZV9zaXplID0gdG1wICogYml0cmF0ZSAvIHNhbXBsaW5nX3JhdGUgKyBwYWRkaW5nOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG91dF9zYW1wbGluZ19yYXRlKSB7Ci0gICAgICAgICpvdXRfc2FtcGxpbmdfcmF0ZSA9IHNhbXBsaW5nX3JhdGU7Ci0gICAgfQotCi0gICAgaWYgKG91dF9jaGFubmVscykgewotICAgICAgICBpbnQgY2hhbm5lbF9tb2RlID0gKGhlYWRlciA+PiA2KSAmIDM7Ci0KLSAgICAgICAgKm91dF9jaGFubmVscyA9IChjaGFubmVsX21vZGUgPT0gMykgPyAxIDogMjsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY0NmJlNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw2OCBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9idWZmZXJxdWV1ZV9oZWxwZXIiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgdm5kazogeworICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgIH0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDb252ZXJzaW9uLmNwcCIsCisgICAgICAgICJGcmFtZURyb3BwZXIuY3BwIiwKKyAgICAgICAgIkdyYXBoaWNCdWZmZXJTb3VyY2UuY3BwIiwKKyAgICAgICAgIldQcm9kdWNlckxpc3RlbmVyLmNwcCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmhpZGxtZW1vcnkiLAorICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJ1dGlscyIsCisKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYnVmZmVycXVldWVAMS4wIiwKKworICAgICAgICAibGlibmF0aXZld2luZG93IiwgLy8gVE9ETyhiLzYyOTIzNDc5KTogdXNlIGhlYWRlciBsaWJyYXJ5CisgICAgXSwKKworICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJoaWRsbWVtb3J5IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVduby11bnVzZWQtcGFyYW1ldGVyIiwKKyAgICAgICAgIi1Xbm8tZG9jdW1lbnRhdGlvbiIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIGRpYWc6IHsKKyAgICAgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvQ29udmVyc2lvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9Db252ZXJzaW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmVkMDA1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvQ29udmVyc2lvbi5jcHAKQEAgLTAsMCArMSwxNTQyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL0NvbnZlcnNpb24uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGNvbnZlcnNpb24geworCisvLyBuYXRpdmVfaGFuZGxlX3QgaGVscGVyIGZ1bmN0aW9ucy4KKworLyoqCisgKiBcYnJpZWYgVGFrZSBhbiBmZCBhbmQgY3JlYXRlIGEgbmF0aXZlIGhhbmRsZSBjb250YWluaW5nIG9ubHkgdGhlIGdpdmVuIGZkLgorICogVGhlIGNyZWF0ZWQgaGFuZGxlIHdpbGwgbmVlZCB0byBiZSBkZWxldGVkIG1hbnVhbGx5IHdpdGgKKyAqIGBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpYC4KKyAqCisgKiBccGFyYW1baW5dIGZkIFRoZSBzb3VyY2UgZmlsZSBkZXNjcmlwdG9yIChvZiB0eXBlIGBpbnRgKS4KKyAqIFxyZXR1cm4gVGhlIGNyZWF0ZSBgbmF0aXZlX2hhbmRsZV90KmAgdGhhdCBjb250YWlucyB0aGUgZ2l2ZW4gXHAgZmQuIElmIHRoZQorICogc3VwcGxpZWQgXHAgZmQgaXMgbmVnYXRpdmUsIHRoZSBjcmVhdGVkIG5hdGl2ZSBoYW5kbGUgd2lsbCBjb250YWluIG5vIGZpbGUKKyAqIGRlc2NyaXB0b3JzLgorICoKKyAqIElmIHRoZSBuYXRpdmUgaGFuZGxlIGNhbm5vdCBiZSBjcmVhdGVkLCB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUKKyAqIGBudWxscHRyYC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGR1cGxpY2F0ZSB0aGUgZmlsZSBkZXNjcmlwdG9yLgorICovCituYXRpdmVfaGFuZGxlX3QqIG5hdGl2ZV9oYW5kbGVfY3JlYXRlX2Zyb21fZmQoaW50IGZkKSB7CisgICAgaWYgKGZkIDwgMikgeworICAgICAgICByZXR1cm4gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMCwgMCk7CisgICAgfQorICAgIG5hdGl2ZV9oYW5kbGVfdCogbmggPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKKyAgICBpZiAobmggPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgbmgtPmRhdGFbMF0gPSBmZDsKKyAgICByZXR1cm4gbmg7Cit9CisKKy8qKgorICogXGJyaWVmIEV4dHJhY3QgYSBmaWxlIGRlc2NyaXB0b3IgZnJvbSBhIG5hdGl2ZSBoYW5kbGUuCisgKgorICogXHBhcmFtW2luXSBuaCBUaGUgc291cmNlIGBuYXRpdmVfaGFuZGxlX3QqYC4KKyAqIFxwYXJhbVtpbl0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBmaWxlIGRlc2NyaXB0b3IgaW4gXHAgbmggdG8gcmVhZCBmcm9tLiBUaGlzCisgKiBpbnB1dCBoYXMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYDBgLgorICogXHJldHVybiBUaGUgYGluZGV4YC10aCBmaWxlIGRlc2NyaXB0b3IgaW4gXHAgbmguIElmIFxwIG5oIGRvZXMgbm90IGhhdmUKKyAqIGVub3VnaCBmaWxlIGRlc2NyaXB0b3JzLCB0aGUgcmV0dXJuZWQgdmFsdWUgd2lsbCBiZSBgLTFgLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgZHVwbGljYXRlIHRoZSBmaWxlIGRlc2NyaXB0b3IuCisgKi8KK2ludCBuYXRpdmVfaGFuZGxlX3JlYWRfZmQobmF0aXZlX2hhbmRsZV90IGNvbnN0KiBuaCwgaW50IGluZGV4KSB7CisgICAgcmV0dXJuICgobmggPT0gbnVsbHB0cikgfHwgKG5oLT5udW1GZHMgPT0gMCkgfHwKKyAgICAgICAgICAgIChuaC0+bnVtRmRzIDw9IGluZGV4KSB8fCAoaW5kZXggPCAwKSkgPworICAgICAgICAgICAgLTEgOiBuaC0+ZGF0YVtpbmRleF07Cit9CisKKy8qKgorICogQ29udmVyc2lvbiBmdW5jdGlvbnMKKyAqID09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhlcmUgYXJlIHR3byBtYWluIGRpcmVjdGlvbnMgb2YgY29udmVyc2lvbjoKKyAqIC0gYGluVGFyZ2V0VHlwZSguLi4pYDogQ3JlYXRlIGEgd3JhcHBlciB3aG9zZSBsaWZldGltZSBkZXBlbmRzIG9uIHRoZQorICogICBpbnB1dC4gVGhlIHdyYXBwZXIgaGFzIHR5cGUgYFRhcmdldFR5cGVgLgorICogLSBgdG9UYXJnZXRUeXBlKC4uLilgOiBDcmVhdGUgYSBzdGFuZGFsb25lIG9iamVjdCBvZiB0eXBlIGBUYXJnZXRUeXBlYCB0aGF0CisgKiAgIGNvcnJlc3BvbmRzIHRvIHRoZSBpbnB1dC4gVGhlIGxpZmV0aW1lIG9mIHRoZSBvdXRwdXQgZG9lcyBub3QgZGVwZW5kIG9uIHRoZQorICogICBsaWZldGltZSBvZiB0aGUgaW5wdXQuCisgKiAtIGB3cmFwSW4oVGFyZ2V0VHlwZSosIC4uLilgOiBTYW1lIGFzIGBpblRhcmdldFR5cGUoKWAsIGJ1dCBmb3IgYFRhcmdldFR5cGVgCisgKiAgIHRoYXQgY2Fubm90IGJlIGNvcGllZCBhbmQvb3IgbW92ZWQgZWZmaWNpZW50bHksIG9yIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlCisgKiAgIG91dHB1dCBhcmd1bWVudHMuCisgKiAtIGBjb252ZXJ0VG8oVGFyZ2V0VHlwZSosIC4uLilgOiBTYW1lIGFzIGB0b1RhcmdldFR5cGUoKWAsIGJ1dCBmb3IKKyAqICAgYFRhcmdldFR5cGVgIHRoYXQgY2Fubm90IGJlIGNvcGllZCBhbmQvb3IgbW92ZWQgZWZmaWNpZW50bHksIG9yIHdoZW4gdGhlcmUKKyAqICAgYXJlIG11bHRpcGxlIG91dHB1dCBhcmd1bWVudHMuCisgKgorICogYHdyYXBJbigpYCBhbmQgYGNvbnZlcnRUbygpYCBmdW5jdGlvbnMgd2lsbCB0YWtlIG91dHB1dCBhcmd1bWVudHMgYmVmb3JlCisgKiBpbnB1dCBhcmd1bWVudHMuIFNvbWUgb2YgdGhlc2UgZnVuY3Rpb25zIG1pZ2h0IHJldHVybiBhIHZhbHVlIHRvIGluZGljYXRlCisgKiBzdWNjZXNzIG9yIGVycm9yLgorICoKKyAqIEluIGNvbnZlcnRpbmcgb3Igd3JhcHBpbmcgc29tZXRoaW5nIGFzIGEgVHJlYmxlIHR5cGUgdGhhdCBjb250YWlucyBhCisgKiBgaGlkbF9oYW5kbGVgLCBgbmF0aXZlX2hhbmRsZV90KmAgd2lsbCBuZWVkIHRvIGJlIGNyZWF0ZWQgYW5kIHJldHVybmVkIGFzCisgKiBhbiBhZGRpdGlvbmFsIG91dHB1dCBhcmd1bWVudCwgaGVuY2Ugb25seSBgd3JhcEluKClgIG9yIGBjb252ZXJ0VG8oKWAgd291bGQKKyAqIGJlIGF2YWlsYWJsZS4gVGhlIGNhbGxlciBtdXN0IGNhbGwgYG5hdGl2ZV9oYW5kbGVfZGVsZXRlKClgIHRvIGRlYWxsb2NhdGUgdGhlCisgKiByZXR1cm5lZCBuYXRpdmUgaGFuZGxlIHdoZW4gaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KKyAqCisgKiBGb3IgdHlwZXMgdGhhdCBjb250YWluIGZpbGUgZGVzY3JpcHRvcnMsIGBpblRhcmdldFR5cGUoKWAgYW5kIGB3cmFwQXMoKWAgZG8KKyAqIG5vdCBwZXJmb3JtIGR1cGxpY2F0aW9uIG9mIGZpbGUgZGVzY3JpcHRvcnMsIHdoaWxlIGB0b1RhcmdldFR5cGUoKWAgYW5kCisgKiBgY29udmVydFRvKClgIGRvLgorICovCisKKy8qKgorICogXGJyaWVmIENvbnZlcnQgYFJldHVybjx2b2lkPmAgdG8gYGJpbmRlcjo6U3RhdHVzYC4KKyAqCisgKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgUmV0dXJuPHZvaWQ+YC4KKyAqIFxyZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcgYGJpbmRlcjo6U3RhdHVzYC4KKyAqLworLy8gY29udmVydDogUmV0dXJuPHZvaWQ+IC0+IDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMKKzo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgdG9CaW5kZXJTdGF0dXMoCisgICAgICAgIFJldHVybjx2b2lkPiBjb25zdCYgdCkgeworICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZSgKKyAgICAgICAgICAgIHQuaXNPaygpID8gT0sgOiBVTktOT1dOX0VSUk9SLAorICAgICAgICAgICAgdC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworfQorCisvKioKKyAqIFxicmllZiBDb252ZXJ0IGBSZXR1cm48dm9pZD5gIHRvIGBzdGF0dXNfdGAuIFRoaXMgaXMgZm9yIGxlZ2FjeSBiaW5kZXIgY2FsbHMuCisgKgorICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYFJldHVybjx2b2lkPmAuCisgKiBccmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIGBzdGF0dXNfdGAuCisgKi8KKy8vIGNvbnZlcnQ6IFJldHVybjx2b2lkPiAtPiBzdGF0dXNfdAorc3RhdHVzX3QgdG9TdGF0dXNUKFJldHVybjx2b2lkPiBjb25zdCYgdCkgeworICAgIHJldHVybiB0LmlzT2soKSA/IE9LIDogVU5LTk9XTl9FUlJPUjsKK30KKworLyoqCisgKiBcYnJpZWYgV3JhcCBgbmF0aXZlX2hhbmRsZV90KmAgaW4gYGhpZGxfaGFuZGxlYC4KKyAqCisgKiBccGFyYW1baW5dIG5oIFRoZSBzb3VyY2UgYG5hdGl2ZV9oYW5kbGVfdCpgLgorICogXHJldHVybiBUaGUgYGhpZGxfaGFuZGxlYCB0aGF0IHBvaW50cyB0byBccCBuaC4KKyAqLworLy8gd3JhcDogbmF0aXZlX2hhbmRsZV90KiAtPiBoaWRsX2hhbmRsZQoraGlkbF9oYW5kbGUgaW5IaWRsSGFuZGxlKG5hdGl2ZV9oYW5kbGVfdCBjb25zdCogbmgpIHsKKyAgICByZXR1cm4gaGlkbF9oYW5kbGUobmgpOworfQorCisvKioKKyAqIFxicmllZiBDb252ZXJ0IGBpbnQzMl90YCB0byBgRGF0YXNwYWNlYC4KKyAqCisgKiBccGFyYW1baW5dIGwgVGhlIHNvdXJjZSBgaW50MzJfdGAuCisgKiBccmVzdWx0IFRoZSBjb3JyZXNwb25kaW5nIGBEYXRhc3BhY2VgLgorICovCisvLyBjb252ZXJ0OiBpbnQzMl90IC0+IERhdGFzcGFjZQorRGF0YXNwYWNlIHRvSGFyZHdhcmVEYXRhc3BhY2UoaW50MzJfdCBsKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PERhdGFzcGFjZT4obCk7Cit9CisKKy8qKgorICogXGJyaWVmIENvbnZlcnQgYERhdGFzcGFjZWAgdG8gYGludDMyX3RgLgorICoKKyAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBEYXRhc3BhY2VgLgorICogXHJlc3VsdCBUaGUgY29ycmVzcG9uZGluZyBgaW50MzJfdGAuCisgKi8KKy8vIGNvbnZlcnQ6IERhdGFzcGFjZSAtPiBpbnQzMl90CitpbnQzMl90IHRvUmF3RGF0YXNwYWNlKERhdGFzcGFjZSBjb25zdCYgdCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90Pih0KTsKK30KKworLyoqCisgKiBcYnJpZWYgV3JhcCBhbiBvcGFxdWUgYnVmZmVyIGluc2lkZSBhIGBoaWRsX3ZlYzx1aW50OF90PmAuCisgKgorICogXHBhcmFtW2luXSBsIFRoZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG9wYXF1ZSBidWZmZXIuCisgKiBccGFyYW1baW5dIHNpemUgVGhlIHNpemUgb2YgdGhlIGJ1ZmZlci4KKyAqIFxyZXR1cm4gQSBgaGlkbF92ZWM8dWludDhfdD5gIHRoYXQgcG9pbnRzIHRvIHRoZSBidWZmZXIuCisgKi8KKy8vIHdyYXA6IHZvaWQqLCBzaXplX3QgLT4gaGlkbF92ZWM8dWludDhfdD4KK2hpZGxfdmVjPHVpbnQ4X3Q+IGluSGlkbEJ5dGVzKHZvaWQgY29uc3QqIGwsIHNpemVfdCBzaXplKSB7CisgICAgaGlkbF92ZWM8dWludDhfdD4gdDsKKyAgICB0LnNldFRvRXh0ZXJuYWwoc3RhdGljX2Nhc3Q8dWludDhfdCo+KGNvbnN0X2Nhc3Q8dm9pZCo+KGwpKSwgc2l6ZSwgZmFsc2UpOworICAgIHJldHVybiB0OworfQorCisvKioKKyAqIFxicmllZiBDcmVhdGUgYSBgaGlkbF92ZWM8dWludDhfdD5gIHRoYXQgaXMgYSBjb3B5IG9mIGFuIG9wYXF1ZSBidWZmZXIuCisgKgorICogXHBhcmFtW2luXSBsIFRoZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG9wYXF1ZSBidWZmZXIuCisgKiBccGFyYW1baW5dIHNpemUgVGhlIHNpemUgb2YgdGhlIGJ1ZmZlci4KKyAqIFxyZXR1cm4gQSBgaGlkbF92ZWM8dWludDhfdD5gIHRoYXQgaXMgYSBjb3B5IG9mIHRoZSBpbnB1dCBidWZmZXIuCisgKi8KKy8vIGNvbnZlcnQ6IHZvaWQqLCBzaXplX3QgLT4gaGlkbF92ZWM8dWludDhfdD4KK2hpZGxfdmVjPHVpbnQ4X3Q+IHRvSGlkbEJ5dGVzKHZvaWQgY29uc3QqIGwsIHNpemVfdCBzaXplKSB7CisgICAgaGlkbF92ZWM8dWludDhfdD4gdDsKKyAgICB0LnJlc2l6ZShzaXplKTsKKyAgICB1aW50OF90IGNvbnN0KiBzcmMgPSBzdGF0aWNfY2FzdDx1aW50OF90IGNvbnN0Kj4obCk7CisgICAgc3RkOjpjb3B5KHNyYywgc3JjICsgc2l6ZSwgdC5kYXRhKCkpOworICAgIHJldHVybiB0OworfQorCisvKioKKyAqIFxicmllZiBXcmFwIGBHcmFwaGljQnVmZmVyYCBpbiBgQW53QnVmZmVyYC4KKyAqCisgKiBccGFyYW1bb3V0XSB0IFRoZSB3cmFwcGVyIG9mIHR5cGUgYEFud0J1ZmZlcmAuCisgKiBccGFyYW1baW5dIGwgVGhlIHNvdXJjZSBgR3JhcGhpY0J1ZmZlcmAuCisgKi8KKy8vIHdyYXA6IEdyYXBoaWNCdWZmZXIgLT4gQW53QnVmZmVyCit2b2lkIHdyYXBBcyhBbndCdWZmZXIqIHQsIEdyYXBoaWNCdWZmZXIgY29uc3QmIGwpIHsKKyAgICB0LT5hdHRyLndpZHRoID0gbC5nZXRXaWR0aCgpOworICAgIHQtPmF0dHIuaGVpZ2h0ID0gbC5nZXRIZWlnaHQoKTsKKyAgICB0LT5hdHRyLnN0cmlkZSA9IGwuZ2V0U3RyaWRlKCk7CisgICAgdC0+YXR0ci5mb3JtYXQgPSBzdGF0aWNfY2FzdDxQaXhlbEZvcm1hdD4obC5nZXRQaXhlbEZvcm1hdCgpKTsKKyAgICB0LT5hdHRyLmxheWVyQ291bnQgPSBsLmdldExheWVyQ291bnQoKTsKKyAgICB0LT5hdHRyLnVzYWdlID0gbC5nZXRVc2FnZSgpOworICAgIHQtPmF0dHIuaWQgPSBsLmdldElkKCk7CisgICAgdC0+YXR0ci5nZW5lcmF0aW9uTnVtYmVyID0gbC5nZXRHZW5lcmF0aW9uTnVtYmVyKCk7CisgICAgdC0+bmF0aXZlSGFuZGxlID0gaGlkbF9oYW5kbGUobC5oYW5kbGUpOworfQorCisvKioKKyAqIFxicmllZiBDb252ZXJ0IGBBbndCdWZmZXJgIHRvIGBHcmFwaGljQnVmZmVyYC4KKyAqCisgKiBccGFyYW1bb3V0XSBsIFRoZSBkZXN0aW5hdGlvbiBgR3JhcGhpY0J1ZmZlcmAuCisgKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgQW53QnVmZmVyYC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZHVwbGljYXRlIGFsbCBmaWxlIGRlc2NyaXB0b3JzIGluIFxwIHQuCisgKi8KKy8vIGNvbnZlcnQ6IEFud0J1ZmZlciAtPiBHcmFwaGljQnVmZmVyCisvLyBSZWY6IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvdWkvR3JhcGhpY0J1ZmZlci5jcHA6IEdyYXBoaWNCdWZmZXI6OmZsYXR0ZW4KK2Jvb2wgY29udmVydFRvKEdyYXBoaWNCdWZmZXIqIGwsIEFud0J1ZmZlciBjb25zdCYgdCkgeworICAgIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlID0gdC5uYXRpdmVIYW5kbGUgPT0gbnVsbHB0ciA/CisgICAgICAgICAgICBudWxscHRyIDogbmF0aXZlX2hhbmRsZV9jbG9uZSh0Lm5hdGl2ZUhhbmRsZSk7CisKKyAgICBzaXplX3QgY29uc3QgbnVtSW50cyA9IDEyICsgKGhhbmRsZSA/IGhhbmRsZS0+bnVtSW50cyA6IDApOworICAgIGludDMyX3QqIGludHMgPSBuZXcgaW50MzJfdFtudW1JbnRzXTsKKworICAgIHNpemVfdCBudW1GZHMgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGhhbmRsZSA/IGhhbmRsZS0+bnVtRmRzIDogMCk7CisgICAgaW50KiBmZHMgPSBuZXcgaW50W251bUZkc107CisKKyAgICBpbnRzWzBdID0gJ0dCRlInOworICAgIGludHNbMV0gPSBzdGF0aWNfY2FzdDxpbnQzMl90Pih0LmF0dHIud2lkdGgpOworICAgIGludHNbMl0gPSBzdGF0aWNfY2FzdDxpbnQzMl90Pih0LmF0dHIuaGVpZ2h0KTsKKyAgICBpbnRzWzNdID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4odC5hdHRyLnN0cmlkZSk7CisgICAgaW50c1s0XSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHQuYXR0ci5mb3JtYXQpOworICAgIGludHNbNV0gPSBzdGF0aWNfY2FzdDxpbnQzMl90Pih0LmF0dHIubGF5ZXJDb3VudCk7CisgICAgaW50c1s2XSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHQuYXR0ci51c2FnZSk7CisgICAgaW50c1s3XSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHQuYXR0ci5pZCA+PiAzMik7CisgICAgaW50c1s4XSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHQuYXR0ci5pZCAmIDB4RkZGRkZGRkYpOworICAgIGludHNbOV0gPSBzdGF0aWNfY2FzdDxpbnQzMl90Pih0LmF0dHIuZ2VuZXJhdGlvbk51bWJlcik7CisgICAgaW50c1sxMF0gPSAwOworICAgIGludHNbMTFdID0gMDsKKyAgICBpZiAoaGFuZGxlKSB7CisgICAgICAgIGludHNbMTBdID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oaGFuZGxlLT5udW1GZHMpOworICAgICAgICBpbnRzWzExXSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGhhbmRsZS0+bnVtSW50cyk7CisgICAgICAgIGludCogaW50c1N0YXJ0ID0gaGFuZGxlLT5kYXRhICsgaGFuZGxlLT5udW1GZHM7CisgICAgICAgIHN0ZDo6Y29weShoYW5kbGUtPmRhdGEsIGludHNTdGFydCwgZmRzKTsKKyAgICAgICAgc3RkOjpjb3B5KGludHNTdGFydCwgaW50c1N0YXJ0ICsgaGFuZGxlLT5udW1JbnRzLCAmaW50c1sxMl0pOworICAgIH0KKworICAgIHZvaWQgY29uc3QqIGNvbnN0QnVmZmVyID0gc3RhdGljX2Nhc3Q8dm9pZCBjb25zdCo+KGludHMpOworICAgIHNpemVfdCBzaXplID0gbnVtSW50cyAqIHNpemVvZihpbnQzMl90KTsKKyAgICBpbnQgY29uc3QqIGNvbnN0RmRzID0gc3RhdGljX2Nhc3Q8aW50IGNvbnN0Kj4oZmRzKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBsLT51bmZsYXR0ZW4oY29uc3RCdWZmZXIsIHNpemUsIGNvbnN0RmRzLCBudW1GZHMpOworCisgICAgZGVsZXRlIFtdIGZkczsKKyAgICBkZWxldGUgW10gaW50czsKKyAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoYW5kbGUpOworICAgIHJldHVybiBzdGF0dXMgPT0gTk9fRVJST1I7Cit9CisKKy8qKgorICogQ29udmVyc2lvbiBmdW5jdGlvbnMgZm9yIHR5cGVzIG91dHNpZGUgbWVkaWEKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogU29tZSBvYmplY3RzIGluIGxpYnVpIGFuZCBsaWJndWkgdGhhdCB3ZXJlIG1hZGUgdG8gZ28gdGhyb3VnaCBiaW5kZXIgY2FsbHMgZG8KKyAqIG5vdCBleHBvc2Ugd2F5cyB0byByZWFkIG9yIHdyaXRlIHRoZWlyIGZpZWxkcyB0byB0aGUgcHVibGljLiBUbyBwYXNzIGFuCisgKiBvYmplY3Qgb2YgdGhpcyBraW5kIHRocm91Z2ggdGhlIEhJREwgYm91bmRhcnksIHRyYW5zbGF0aW9uIGZ1bmN0aW9ucyBuZWVkIHRvCisgKiB3b3JrIGFyb3VuZCB0aGUgYWNjZXNzIHJlc3RyaWN0aW9uIGJ5IHVzaW5nIHRoZSBwdWJsaWNseSBhdmFpbGFibGUKKyAqIGBmbGF0dGVuKClgIGFuZCBgdW5mbGF0dGVuKClgIGZ1bmN0aW9ucy4KKyAqCisgKiBBbGwgYGZsYXR0ZW4oKWAgYW5kIGB1bmZsYXR0ZW4oKWAgb3ZlcmxvYWRzIGZvbGxvdyB0aGUgc2FtZSBjb252ZW50aW9uIGFzCisgKiBmb2xsb3dzOgorICoKKyAqICAgICBzdGF0dXNfdCBmbGF0dGVuKE9iamVjdFR5cGUgY29uc3QmIG9iamVjdCwKKyAqICAgICAgICAgICAgICAgICAgICAgIFtPdGhlclR5cGUgY29uc3QmIG90aGVyLCAuLi5dCisgKiAgICAgICAgICAgICAgICAgICAgICB2b2lkKiYgYnVmZmVyLCBzaXplX3QmIHNpemUsCisgKiAgICAgICAgICAgICAgICAgICAgICBpbnQqJiBmZHMsIHNpemVfdCYgbnVtRmRzKQorICoKKyAqICAgICBzdGF0dXNfdCB1bmZsYXR0ZW4oT2JqZWN0VHlwZSogb2JqZWN0LAorICogICAgICAgICAgICAgICAgICAgICAgICBbT3RoZXJUeXBlKiBvdGhlciwgLi4uLF0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgdm9pZComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLAorICogICAgICAgICAgICAgICAgICAgICAgICBpbnQqJiBmZHMsIHNpemVfdCYgbnVtRmRzKQorICoKKyAqIFRoZSBudW1iZXIgb2YgYG90aGVyYCBwYXJhbWV0ZXJzIHZhcmllcyBkZXBlbmRpbmcgb24gdGhlIGBPYmplY3RUeXBlYC4gRm9yCisgKiBleGFtcGxlLCBpbiB0aGUgcHJvY2VzcyBvZiB1bmZsYXR0ZW5pbmcgYW4gb2JqZWN0IHRoYXQgY29udGFpbnMKKyAqIGBoaWRsX2hhbmRsZWAsIGBvdGhlcmAgaXMgbmVlZGVkIHRvIGhvbGQgYG5hdGl2ZV9oYW5kbGVfdGAgb2JqZWN0cyB0aGF0IHdpbGwKKyAqIGJlIGNyZWF0ZWQuCisgKgorICogVGhlIGxhc3QgZm91ciBwYXJhbWV0ZXJzIGFsd2F5cyB3b3JrIHRoZSBzYW1lIHdheSBpbiBhbGwgb3ZlcmxvYWRzIG9mCisgKiBgZmxhdHRlbigpYCBhbmQgYHVuZmxhdHRlbigpYDoKKyAqIC0gRm9yIGBmbGF0dGVuKClgLCBgYnVmZmVyYCBpcyB0aGUgcG9pbnRlciB0byB0aGUgbm9uLWZkIGJ1ZmZlciB0byBiZSBmaWxsZWQsCisgKiAgIGBzaXplYCBpcyB0aGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIHRoZSBub24tZmQgYnVmZmVyIHBvaW50ZWQgdG8gYnkgYGJ1ZmZlcmAsCisgKiAgIGBmZHNgIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBmZCBidWZmZXIgdG8gYmUgZmlsbGVkLCBhbmQgYG51bUZkc2AgaXMgdGhlCisgKiAgIHNpemUgKGluIGludHMpIG9mIHRoZSBmZCBidWZmZXIgcG9pbnRlZCB0byBieSBgZmRzYC4KKyAqIC0gRm9yIGB1bmZsYXR0ZW4oKWAsIGBidWZmZXJgIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBub24tZmQgYnVmZmVyIHRvIGJlIHJlYWQKKyAqICAgZnJvbSwgYHNpemVgIGlzIHRoZSBzaXplIChpbiBieXRlcykgb2YgdGhlIG5vbi1mZCBidWZmZXIgcG9pbnRlZCB0byBieQorICogICBgYnVmZmVyYCwgYGZkc2AgaXMgdGhlIHBvaW50ZXIgdG8gdGhlIGZkIGJ1ZmZlciB0byBiZSByZWFkIGZyb20sIGFuZAorICogICBgbnVtRmRzYCBpcyB0aGUgc2l6ZSAoaW4gaW50cykgb2YgdGhlIGZkIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IGBmZHNgLgorICogLSBBZnRlciBhIHN1Y2Nlc3NmdWwgY2FsbCB0byBgZmxhdHRlbigpYCBvciBgdW5mbGF0dGVuKClgLCBgYnVmZmVyYCBhbmQgYGZkc2AKKyAqICAgd2lsbCBiZSBhZHZhbmNlZCwgd2hpbGUgYHNpemVgIGFuZCBgbnVtRmRzYCB3aWxsIGJlIGRlY3JlYXNlZCB0byByZWZsZWN0CisgKiAgIGhvdyBtdWNoIHN0b3JhZ2UvZGF0YSBvZiB0aGUgdHdvIGJ1ZmZlcnMgKGZkIGFuZCBub24tZmQpIGhhdmUgYmVlbiB1c2VkLgorICogLSBBZnRlciBhbiB1bnN1Y2Nlc3NmdWwgY2FsbCwgdGhlIHZhbHVlcyBvZiBgYnVmZmVyYCwgYHNpemVgLCBgZmRzYCBhbmQKKyAqICAgYG51bUZkc2AgYXJlIGludmFsaWQuCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBvZiBhIHN1Y2Nlc3NmdWwgYGZsYXR0ZW4oKWAgb3IgYHVuZmxhdHRlbigpYCBjYWxsIHdpbGwgYmUKKyAqIGBPS2AgKGFsc28gYWxpYXNlZCBhcyBgTk9fRVJST1JgKS4gQW55IG90aGVyIHZhbHVlcyBpbmRpY2F0ZSBhIGZhaWx1cmUuCisgKgorICogRm9yIGVhY2ggb2JqZWN0IHR5cGUgdGhhdCBzdXBwb3J0cyBmbGF0dGVuaW5nLCB0aGVyZSB3aWxsIGJlIHR3byBhY2NvbXBhbnlpbmcKKyAqIGZ1bmN0aW9uczogYGdldEZsYXR0ZW5lZFNpemUoKWAgYW5kIGBnZXRGZENvdW50KClgLiBgZ2V0RmxhdHRlbmVkU2l6ZSgpYCB3aWxsCisgKiByZXR1cm4gdGhlIHNpemUgb2YgdGhlIG5vbi1mZCBidWZmZXIgdGhhdCB0aGUgb2JqZWN0IHdpbGwgbmVlZCBmb3IKKyAqIGZsYXR0ZW5pbmcuIGBnZXRGZENvdW50KClgIHdpbGwgcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBmZCBidWZmZXIgdGhhdCB0aGUKKyAqIG9iamVjdCB3aWxsIG5lZWQgZm9yIGZsYXR0ZW5pbmcuCisgKgorICogVGhlIHNldCBvZiB0aGVzZSBmb3VyIGZ1bmN0aW9ucywgYGdldEZsYXR0ZW5lZFNpemUoKWAsIGBnZXRGZENvdW50KClgLAorICogYGZsYXR0ZW4oKWAgYW5kIGB1bmZsYXR0ZW4oKWAsIGFyZSBzaW1pbGFyIHRvIGZ1bmN0aW9ucyBvZiB0aGUgc2FtZSBuYW1lIGluCisgKiB0aGUgYWJzdHJhY3QgY2xhc3MgYEZsYXR0ZW5hYmxlYC4gVGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB0aGF0IGZ1bmN0aW9ucyBpbgorICogdGhpcyBmaWxlIGFyZSBub3QgbWVtYmVyIGZ1bmN0aW9ucyBvZiB0aGUgb2JqZWN0IHR5cGUuIEZvciBleGFtcGxlLCB3ZSB3cml0ZQorICoKKyAqICAgICBmbGF0dGVuKHgsIGJ1ZmZlciwgc2l6ZSwgZmRzLCBudW1GZHMpCisgKgorICogaW5zdGVhZCBvZgorICoKKyAqICAgICB4LmZsYXR0ZW4oYnVmZmVyLCBzaXplLCBmZHMsIG51bUZkcykKKyAqCisgKiBiZWNhdXNlIHdlIGNhbm5vdCBtb2RpZnkgdGhlIHR5cGUgb2YgYHhgLgorICoKKyAqIFRoZXJlIGlzIG9uZSBleGNlcHRpb24gdG8gdGhlIG5hbWluZyBjb252ZW50aW9uOiBgaGlkbF9oYW5kbGVgIHRoYXQKKyAqIHJlcHJlc2VudHMgYSBmZW5jZS4gVGhlIGZvdXIgZnVuY3Rpb25zIGZvciB0aGlzICJGZW5jZSIgdHlwZSBoYXZlIHRoZSB3b3JkCisgKiAiRmVuY2UiIGF0dGNoZWQgdG8gdGhlaXIgbmFtZXMgYmVjYXVzZSB0aGUgb2JqZWN0IHR5cGUsIHdoaWNoIGlzCisgKiBgaGlkbF9oYW5kbGVgLCBkb2VzIG5vdCBjYXJyeSB0aGUgc3BlY2lhbCBtZWFuaW5nIHRoYXQgdGhlIG9iamVjdCBpdHNlbGYgY2FuCisgKiBvbmx5IGNvbnRhaW4gemVybyBvciBvbmUgZmlsZSBkZXNjcmlwdG9yLgorICovCisKKy8vIFJlZjogZnJhbWV3b3Jrcy9uYXRpdmUvbGlicy91aS9GZW5jZS5jcHAKKworLyoqCisgKiBcYnJpZWYgUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBub24tZmQgYnVmZmVyIHJlcXVpcmVkIHRvIGZsYXR0ZW4gYSBmZW5jZS4KKyAqCisgKiBccGFyYW1baW5dIGZlbmNlIFRoZSBpbnB1dCBmZW5jZSBvZiB0eXBlIGBoaWRsX2hhbmRsZWAuCisgKiBccmV0dXJuIFRoZSByZXF1aXJlZCBzaXplIG9mIHRoZSBmbGF0IGJ1ZmZlci4KKyAqCisgKiBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoaXMgZnVuY3Rpb24gYWx3YXlzIHJldHVybnMgNCwgd2hpY2ggaXMgdGhlIG51bWJlciBvZgorICogYnl0ZXMgcmVxdWlyZWQgdG8gc3RvcmUgdGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbiB0aGUgZmQKKyAqIHBhcnQgb2YgdGhlIGZsYXQgYnVmZmVyLgorICovCitzaXplX3QgZ2V0RmVuY2VGbGF0dGVuZWRTaXplKGhpZGxfaGFuZGxlIGNvbnN0JiAvKiBmZW5jZSAqLykgeworICAgIHJldHVybiA0OworfTsKKworLyoqCisgKiBcYnJpZWYgUmV0dXJuIHRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4gYSBmZW5jZS4KKyAqCisgKiBccGFyYW1baW5dIGZlbmNlIFRoZSBpbnB1dCBmZW5jZSBvZiB0eXBlIGBoaWRsX2hhbmRsZWAuCisgKiBccmV0dXJuIGAwYCBpZiBccCBmZW5jZSBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgZmlsZSBkZXNjcmlwdG9yLCBvciBgMWAKKyAqIG90aGVyd2lzZS4KKyAqLworc2l6ZV90IGdldEZlbmNlRmRDb3VudChoaWRsX2hhbmRsZSBjb25zdCYgZmVuY2UpIHsKKyAgICByZXR1cm4gbmF0aXZlX2hhbmRsZV9yZWFkX2ZkKGZlbmNlKSA9PSAtMSA/IDAgOiAxOworfQorCisvKioKKyAqIFxicmllZiBVbmZsYXR0ZW4gYEZlbmNlYCB0byBgaGlkbF9oYW5kbGVgLgorICoKKyAqIFxwYXJhbVtvdXRdIGZlbmNlIFRoZSBkZXN0aW5hdGlvbiBgaGlkbF9oYW5kbGVgLgorICogXHBhcmFtW291dF0gbmggVGhlIHVuZGVybHlpbmcgbmF0aXZlIGhhbmRsZS4KKyAqIFxwYXJhbVtpbixvdXRdIGJ1ZmZlciBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgorICogXHBhcmFtW2luLG91dF0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgorICogXHBhcmFtW2luLG91dF0gZmRzIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IGZkIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbixvdXRdIG51bUZkcyBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBmZCBidWZmZXIuCisgKiBccmV0dXJuIGBOT19FUlJPUmAgb24gc3VjY2Vzczsgb3RoZXIgdmFsdWUgb24gZmFpbHVyZS4KKyAqCisgKiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIGBOT19FUlJPUmAsIFxwIG5oIHdpbGwgcG9pbnQgdG8gYSBuZXdseSBjcmVhdGVkCisgKiBuYXRpdmUgaGFuZGxlLCB3aGljaCBuZWVkcyB0byBiZSBkZWxldGVkIHdpdGggYG5hdGl2ZV9oYW5kbGVfZGVsZXRlKClgCisgKiBhZnRlcndhcmRzLgorICovCitzdGF0dXNfdCB1bmZsYXR0ZW5GZW5jZShoaWRsX2hhbmRsZSogZmVuY2UsIG5hdGl2ZV9oYW5kbGVfdCoqIG5oLAorICAgICAgICB2b2lkIGNvbnN0KiYgYnVmZmVyLCBzaXplX3QmIHNpemUsIGludCBjb25zdComIGZkcywgc2l6ZV90JiBudW1GZHMpIHsKKyAgICBpZiAoc2l6ZSA8IDQpIHsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBudW1GZHNJbkhhbmRsZTsKKyAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgbnVtRmRzSW5IYW5kbGUpOworCisgICAgaWYgKG51bUZkc0luSGFuZGxlID4gMSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmIChudW1GZHMgPCBudW1GZHNJbkhhbmRsZSkgeworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIGlmIChudW1GZHNJbkhhbmRsZSkgeworICAgICAgICAqbmggPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZV9mcm9tX2ZkKCpmZHMpOworICAgICAgICBpZiAoKm5oID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIH0KKyAgICAgICAgKmZlbmNlID0gKm5oOworICAgICAgICArK2ZkczsKKyAgICAgICAgLS1udW1GZHM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKm5oID0gbnVsbHB0cjsKKyAgICAgICAgKmZlbmNlID0gaGlkbF9oYW5kbGUoKTsKKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qKgorICogXGJyaWVmIEZsYXR0ZW4gYGhpZGxfaGFuZGxlYCBhcyBgRmVuY2VgLgorICoKKyAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBoaWRsX2hhbmRsZWAuCisgKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbixvdXRdIGZkcyBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBmZCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBudW1GZHMgVGhlIHNpemUgb2YgdGhlIGZsYXQgZmQgYnVmZmVyLgorICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCisgKi8KK3N0YXR1c190IGZsYXR0ZW5GZW5jZShoaWRsX2hhbmRsZSBjb25zdCYgZmVuY2UsCisgICAgICAgIHZvaWQqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwgaW50KiYgZmRzLCBzaXplX3QmIG51bUZkcykgeworICAgIGlmIChzaXplIDwgZ2V0RmVuY2VGbGF0dGVuZWRTaXplKGZlbmNlKSB8fAorICAgICAgICAgICAgbnVtRmRzIDwgZ2V0RmVuY2VGZENvdW50KGZlbmNlKSkgeworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKyAgICAvLyBDYXN0IHRvIHVpbnQzMl90IHNpbmNlIHRoZSBzaXplIG9mIGEgc2l6ZV90IGNhbiB2YXJ5IGJldHdlZW4gMzItIGFuZAorICAgIC8vIDY0LWJpdCBwcm9jZXNzZXMKKyAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZ2V0RmVuY2VGZENvdW50KGZlbmNlKSkpOworICAgIGludCBmZCA9IG5hdGl2ZV9oYW5kbGVfcmVhZF9mZChmZW5jZSk7CisgICAgaWYgKGZkICE9IC0xKSB7CisgICAgICAgICpmZHMgPSBmZDsKKyAgICAgICAgKytmZHM7CisgICAgICAgIC0tbnVtRmRzOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qKgorICogXGJyaWVmIFdyYXAgYEZlbmNlYCBpbiBgaGlkbF9oYW5kbGVgLgorICoKKyAqIFxwYXJhbVtvdXRdIHQgVGhlIHdyYXBwZXIgb2YgdHlwZSBgaGlkbF9oYW5kbGVgLgorICogXHBhcmFtW291dF0gbmggVGhlIG5hdGl2ZSBoYW5kbGUgcG9pbnRlZCB0byBieSBccCB0LgorICogXHBhcmFtW2luXSBsIFRoZSBzb3VyY2UgYEZlbmNlYC4KKyAqCisgKiBPbiBzdWNjZXNzLCBccCBuaCB3aWxsIGhvbGQgYSBuZXdseSBjcmVhdGVkIG5hdGl2ZSBoYW5kbGUsIHdoaWNoIG11c3QgYmUKKyAqIGRlbGV0ZWQgbWFudWFsbHkgd2l0aCBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAgYWZ0ZXJ3YXJkcy4KKyAqLworLy8gd3JhcDogRmVuY2UgLT4gaGlkbF9oYW5kbGUKK2Jvb2wgd3JhcEFzKGhpZGxfaGFuZGxlKiB0LCBuYXRpdmVfaGFuZGxlX3QqKiBuaCwgRmVuY2UgY29uc3QmIGwpIHsKKyAgICBzaXplX3QgY29uc3QgYmFzZVNpemUgPSBsLmdldEZsYXR0ZW5lZFNpemUoKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBiYXNlQnVmZmVyKAorICAgICAgICAgICAgbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQ4X3RbYmFzZVNpemVdKTsKKyAgICBpZiAoIWJhc2VCdWZmZXIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHNpemVfdCBjb25zdCBiYXNlTnVtRmRzID0gbC5nZXRGZENvdW50KCk7CisgICAgc3RkOjp1bmlxdWVfcHRyPGludFtdPiBiYXNlRmRzKAorICAgICAgICAgICAgbmV3IChzdGQ6Om5vdGhyb3cpIGludFtiYXNlTnVtRmRzXSk7CisgICAgaWYgKCFiYXNlRmRzKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2b2lkKiBidWZmZXIgPSBzdGF0aWNfY2FzdDx2b2lkKj4oYmFzZUJ1ZmZlci5nZXQoKSk7CisgICAgc2l6ZV90IHNpemUgPSBiYXNlU2l6ZTsKKyAgICBpbnQqIGZkcyA9IHN0YXRpY19jYXN0PGludCo+KGJhc2VGZHMuZ2V0KCkpOworICAgIHNpemVfdCBudW1GZHMgPSBiYXNlTnVtRmRzOworICAgIGlmIChsLmZsYXR0ZW4oYnVmZmVyLCBzaXplLCBmZHMsIG51bUZkcykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZvaWQgY29uc3QqIGNvbnN0QnVmZmVyID0gc3RhdGljX2Nhc3Q8dm9pZCBjb25zdCo+KGJhc2VCdWZmZXIuZ2V0KCkpOworICAgIHNpemUgPSBiYXNlU2l6ZTsKKyAgICBpbnQgY29uc3QqIGNvbnN0RmRzID0gc3RhdGljX2Nhc3Q8aW50IGNvbnN0Kj4oYmFzZUZkcy5nZXQoKSk7CisgICAgbnVtRmRzID0gYmFzZU51bUZkczsKKyAgICBpZiAodW5mbGF0dGVuRmVuY2UodCwgbmgsIGNvbnN0QnVmZmVyLCBzaXplLCBjb25zdEZkcywgbnVtRmRzKQorICAgICAgICAgICAgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCisvKioKKyAqIFxicmllZiBDb252ZXJ0IGBoaWRsX2hhbmRsZWAgdG8gYEZlbmNlYC4KKyAqCisgKiBccGFyYW1bb3V0XSBsIFRoZSBkZXN0aW5hdGlvbiBgRmVuY2VgLiBgbGAgbXVzdCBub3QgaGF2ZSBiZWVuIHVzZWQKKyAqIChgbC0+aXNWYWxpZCgpYCBtdXN0IHJldHVybiBgZmFsc2VgKSBiZWZvcmUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuCisgKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgaGlkbF9oYW5kbGVgLgorICoKKyAqIElmIFxwIHQgY29udGFpbnMgYSB2YWxpZCBmaWxlIGRlc2NyaXB0b3IsIGl0IHdpbGwgYmUgZHVwbGljYXRlZC4KKyAqLworLy8gY29udmVydDogaGlkbF9oYW5kbGUgLT4gRmVuY2UKK2Jvb2wgY29udmVydFRvKEZlbmNlKiBsLCBoaWRsX2hhbmRsZSBjb25zdCYgdCkgeworICAgIGludCBmZCA9IG5hdGl2ZV9oYW5kbGVfcmVhZF9mZCh0KTsKKyAgICBpZiAoZmQgIT0gLTEpIHsKKyAgICAgICAgZmQgPSBkdXAoZmQpOworICAgICAgICBpZiAoZmQgPT0gLTEpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBuYXRpdmVfaGFuZGxlX3QqIG5oID0gbmF0aXZlX2hhbmRsZV9jcmVhdGVfZnJvbV9mZChmZCk7CisgICAgaWYgKG5oID09IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKGZkICE9IC0xKSB7CisgICAgICAgICAgICBjbG9zZShmZCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHNpemVfdCBjb25zdCBiYXNlU2l6ZSA9IGdldEZlbmNlRmxhdHRlbmVkU2l6ZSh0KTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBiYXNlQnVmZmVyKAorICAgICAgICAgICAgbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQ4X3RbYmFzZVNpemVdKTsKKyAgICBpZiAoIWJhc2VCdWZmZXIpIHsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobmgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc2l6ZV90IGNvbnN0IGJhc2VOdW1GZHMgPSBnZXRGZW5jZUZkQ291bnQodCk7CisgICAgc3RkOjp1bmlxdWVfcHRyPGludFtdPiBiYXNlRmRzKAorICAgICAgICAgICAgbmV3IChzdGQ6Om5vdGhyb3cpIGludFtiYXNlTnVtRmRzXSk7CisgICAgaWYgKCFiYXNlRmRzKSB7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG5oKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZvaWQqIGJ1ZmZlciA9IHN0YXRpY19jYXN0PHZvaWQqPihiYXNlQnVmZmVyLmdldCgpKTsKKyAgICBzaXplX3Qgc2l6ZSA9IGJhc2VTaXplOworICAgIGludCogZmRzID0gc3RhdGljX2Nhc3Q8aW50Kj4oYmFzZUZkcy5nZXQoKSk7CisgICAgc2l6ZV90IG51bUZkcyA9IGJhc2VOdW1GZHM7CisgICAgaWYgKGZsYXR0ZW5GZW5jZShoaWRsX2hhbmRsZShuaCksIGJ1ZmZlciwgc2l6ZSwgZmRzLCBudW1GZHMpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG5oKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShuaCk7CisKKyAgICB2b2lkIGNvbnN0KiBjb25zdEJ1ZmZlciA9IHN0YXRpY19jYXN0PHZvaWQgY29uc3QqPihiYXNlQnVmZmVyLmdldCgpKTsKKyAgICBzaXplID0gYmFzZVNpemU7CisgICAgaW50IGNvbnN0KiBjb25zdEZkcyA9IHN0YXRpY19jYXN0PGludCBjb25zdCo+KGJhc2VGZHMuZ2V0KCkpOworICAgIG51bUZkcyA9IGJhc2VOdW1GZHM7CisgICAgaWYgKGwtPnVuZmxhdHRlbihjb25zdEJ1ZmZlciwgc2l6ZSwgY29uc3RGZHMsIG51bUZkcykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCisvLyBSZWY6IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvdWkvRmVuY2VUaW1lLmNwcDogRmVuY2VUaW1lOjpTbmFwc2hvdAorCisvKioKKyAqIFxicmllZiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIG5vbi1mZCBidWZmZXIgcmVxdWlyZWQgdG8gZmxhdHRlbgorICogYEZlbmNlVGltZVNuYXBzaG90YC4KKyAqCisgKiBccGFyYW1baW5dIHQgVGhlIGlucHV0IGBGZW5jZVRpbWVTbmFwc2hvdGAuCisgKiBccmV0dXJuIFRoZSByZXF1aXJlZCBzaXplIG9mIHRoZSBmbGF0IGJ1ZmZlci4KKyAqLworc2l6ZV90IGdldEZsYXR0ZW5lZFNpemUoCisgICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZlbmNlVGltZVNuYXBzaG90IGNvbnN0JiB0KSB7CisgICAgY29uc3RleHByIHNpemVfdCBtaW4gPSBzaXplb2YodC5zdGF0ZSk7CisgICAgc3dpdGNoICh0LnN0YXRlKSB7CisgICAgICAgIGNhc2UgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RmVuY2VUaW1lU25hcHNob3Q6OlN0YXRlOjpFTVBUWToKKyAgICAgICAgICAgIHJldHVybiBtaW47CisgICAgICAgIGNhc2UgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RmVuY2VUaW1lU25hcHNob3Q6OlN0YXRlOjpGRU5DRToKKyAgICAgICAgICAgIHJldHVybiBtaW4gKyBnZXRGZW5jZUZsYXR0ZW5lZFNpemUodC5mZW5jZSk7CisgICAgICAgIGNhc2UgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RmVuY2VUaW1lU25hcHNob3Q6OlN0YXRlOjpTSUdOQUxfVElNRToKKyAgICAgICAgICAgIHJldHVybiBtaW4gKyBzaXplb2YoCisgICAgICAgICAgICAgICAgICAgIDo6YW5kcm9pZDo6RmVuY2VUaW1lOjpTbmFwc2hvdDo6c2lnbmFsVGltZSk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKioKKyAqIFxicmllZiBSZXR1cm4gdGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbgorICogYEZlbmNlVGltZVNuYXBzaG90YC4KKyAqCisgKiBccGFyYW1baW5dIHQgVGhlIGlucHV0IGBGZW5jZVRpbWVTbmFwc2hvdGAuCisgKiBccmV0dXJuIFRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4gXHAgc25hcHNob3QuCisgKi8KK3NpemVfdCBnZXRGZENvdW50KAorICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdCBjb25zdCYgdCkgeworICAgIHJldHVybiB0LnN0YXRlID09CisgICAgICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdDo6U3RhdGU6OkZFTkNFID8KKyAgICAgICAgICAgIGdldEZlbmNlRmRDb3VudCh0LmZlbmNlKSA6IDA7Cit9CisKKy8qKgorICogXGJyaWVmIEZsYXR0ZW4gYEZlbmNlVGltZVNuYXBzaG90YC4KKyAqCisgKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgRmVuY2VUaW1lU25hcHNob3RgLgorICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBmZHMgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgZmQgYnVmZmVyLgorICogXHBhcmFtW2luLG91dF0gbnVtRmRzIFRoZSBzaXplIG9mIHRoZSBmbGF0IGZkIGJ1ZmZlci4KKyAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBkdXBsaWNhdGUgdGhlIGZpbGUgZGVzY3JpcHRvciBpbiBgdC5mZW5jZWAgaWYgYHQuc3RhdGUgPT0KKyAqIEZFTkNFYC4KKyAqLworc3RhdHVzX3QgZmxhdHRlbihIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdCBjb25zdCYgdCwKKyAgICAgICAgdm9pZComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLCBpbnQqJiBmZHMsIHNpemVfdCYgbnVtRmRzKSB7CisgICAgaWYgKHNpemUgPCBnZXRGbGF0dGVuZWRTaXplKHQpKSB7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgc3dpdGNoICh0LnN0YXRlKSB7CisgICAgICAgIGNhc2UgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RmVuY2VUaW1lU25hcHNob3Q6OlN0YXRlOjpFTVBUWToKKyAgICAgICAgICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgOjphbmRyb2lkOjpGZW5jZVRpbWU6OlNuYXBzaG90OjpTdGF0ZTo6RU1QVFkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICBjYXNlIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZlbmNlVGltZVNuYXBzaG90OjpTdGF0ZTo6RkVOQ0U6CisgICAgICAgICAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsCisgICAgICAgICAgICAgICAgICAgIDo6YW5kcm9pZDo6RmVuY2VUaW1lOjpTbmFwc2hvdDo6U3RhdGU6OkZFTkNFKTsKKyAgICAgICAgICAgIHJldHVybiBmbGF0dGVuRmVuY2UodC5mZW5jZSwgYnVmZmVyLCBzaXplLCBmZHMsIG51bUZkcyk7CisgICAgICAgIGNhc2UgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RmVuY2VUaW1lU25hcHNob3Q6OlN0YXRlOjpTSUdOQUxfVElNRToKKyAgICAgICAgICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgOjphbmRyb2lkOjpGZW5jZVRpbWU6OlNuYXBzaG90OjpTdGF0ZTo6U0lHTkFMX1RJTUUpOworICAgICAgICAgICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCB0LnNpZ25hbFRpbWVOcyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyoqCisgKiBcYnJpZWYgVW5mbGF0dGVuIGBGZW5jZVRpbWVTbmFwc2hvdGAuCisgKgorICogXHBhcmFtW291dF0gdCBUaGUgZGVzdGluYXRpb24gYEZlbmNlVGltZVNuYXBzaG90YC4KKyAqIFxwYXJhbVtvdXRdIG5oIFRoZSB1bmRlcmx5aW5nIG5hdGl2ZSBoYW5kbGUuCisgKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbixvdXRdIGZkcyBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBmZCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBudW1GZHMgVGhlIHNpemUgb2YgdGhlIGZsYXQgZmQgYnVmZmVyLgorICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCisgKgorICogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBgTk9fRVJST1JgIGFuZCB0aGUgY29uc3RydWN0ZWQgc25hcHNob3QgY29udGFpbnMgYQorICogZmlsZSBkZXNjcmlwdG9yLCBccCBuaCB3aWxsIGJlIGNyZWF0ZWQgdG8gaG9sZCB0aGF0IGZpbGUgZGVzY3JpcHRvci4gSW4gdGhpcworICogY2FzZSwgXHAgbmggbmVlZHMgdG8gYmUgZGVsZXRlZCB3aXRoIGBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpYCBhZnRlcndhcmRzLgorICovCitzdGF0dXNfdCB1bmZsYXR0ZW4oCisgICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZlbmNlVGltZVNuYXBzaG90KiB0LCBuYXRpdmVfaGFuZGxlX3QqKiBuaCwKKyAgICAgICAgdm9pZCBjb25zdComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLCBpbnQgY29uc3QqJiBmZHMsIHNpemVfdCYgbnVtRmRzKSB7CisgICAgaWYgKHNpemUgPCBzaXplb2YodC0+c3RhdGUpKSB7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgKm5oID0gbnVsbHB0cjsKKyAgICA6OmFuZHJvaWQ6OkZlbmNlVGltZTo6U25hcHNob3Q6OlN0YXRlIHN0YXRlOworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCBzdGF0ZSk7CisgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICBjYXNlIDo6YW5kcm9pZDo6RmVuY2VUaW1lOjpTbmFwc2hvdDo6U3RhdGU6OkVNUFRZOgorICAgICAgICAgICAgdC0+c3RhdGUgPSBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdDo6U3RhdGU6OkVNUFRZOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICBjYXNlIDo6YW5kcm9pZDo6RmVuY2VUaW1lOjpTbmFwc2hvdDo6U3RhdGU6OkZFTkNFOgorICAgICAgICAgICAgdC0+c3RhdGUgPSBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdDo6U3RhdGU6OkZFTkNFOworICAgICAgICAgICAgcmV0dXJuIHVuZmxhdHRlbkZlbmNlKCZ0LT5mZW5jZSwgbmgsIGJ1ZmZlciwgc2l6ZSwgZmRzLCBudW1GZHMpOworICAgICAgICBjYXNlIDo6YW5kcm9pZDo6RmVuY2VUaW1lOjpTbmFwc2hvdDo6U3RhdGU6OlNJR05BTF9USU1FOgorICAgICAgICAgICAgdC0+c3RhdGUgPSBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdDo6U3RhdGU6OlNJR05BTF9USU1FOworICAgICAgICAgICAgaWYgKHNpemUgPCBzaXplb2YodC0+c2lnbmFsVGltZU5zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgdC0+c2lnbmFsVGltZU5zKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvLyBSZWY6IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvZ3VpL0ZyYW1lVGltZXN0YW1wcy5jcHA6IEZyYW1lRXZlbnRzRGVsdGEKKworLyoqCisgKiBcYnJpZWYgUmV0dXJuIGEgbG93ZXIgYm91bmQgb24gdGhlIHNpemUgb2YgdGhlIG5vbi1mZCBidWZmZXIgcmVxdWlyZWQgdG8KKyAqIGZsYXR0ZW4gYEZyYW1lRXZlbnRzRGVsdGFgLgorICoKKyAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYEZyYW1lRXZlbnRzRGVsdGFgLgorICogXHJldHVybiBBIGxvd2VyIGJvdW5kIG9uIHRoZSBzaXplIG9mIHRoZSBmbGF0IGJ1ZmZlci4KKyAqLworY29uc3RleHByIHNpemVfdCBtaW5GbGF0dGVuZWRTaXplKAorICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50c0RlbHRhIGNvbnN0JiAvKiB0ICovKSB7CisgICAgcmV0dXJuIHNpemVvZih1aW50NjRfdCkgKyAvLyBtRnJhbWVOdW1iZXIKKyAgICAgICAgICAgIHNpemVvZih1aW50OF90KSArIC8vIG1JbmRleAorICAgICAgICAgICAgc2l6ZW9mKHVpbnQ4X3QpICsgLy8gbUFkZFBvc3RDb21wb3NpdGVDYWxsZWQKKyAgICAgICAgICAgIHNpemVvZih1aW50OF90KSArIC8vIG1BZGRSZXRpcmVDYWxsZWQKKyAgICAgICAgICAgIHNpemVvZih1aW50OF90KSArIC8vIG1BZGRSZWxlYXNlQ2FsbGVkCisgICAgICAgICAgICBzaXplb2YobnNlY3NfdCkgKyAvLyBtUG9zdGVkVGltZQorICAgICAgICAgICAgc2l6ZW9mKG5zZWNzX3QpICsgLy8gbVJlcXVlc3RlZFByZXNlbnRUaW1lCisgICAgICAgICAgICBzaXplb2YobnNlY3NfdCkgKyAvLyBtTGF0Y2hUaW1lCisgICAgICAgICAgICBzaXplb2YobnNlY3NfdCkgKyAvLyBtRmlyc3RSZWZyZXNoU3RhcnRUaW1lCisgICAgICAgICAgICBzaXplb2YobnNlY3NfdCk7IC8vIG1MYXN0UmVmcmVzaFN0YXJ0VGltZQorfQorCisvKioKKyAqIFxicmllZiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIG5vbi1mZCBidWZmZXIgcmVxdWlyZWQgdG8gZmxhdHRlbgorICogYEZyYW1lRXZlbnRzRGVsdGFgLgorICoKKyAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYEZyYW1lRXZlbnRzRGVsdGFgLgorICogXHJldHVybiBUaGUgcmVxdWlyZWQgc2l6ZSBvZiB0aGUgZmxhdCBidWZmZXIuCisgKi8KK3NpemVfdCBnZXRGbGF0dGVuZWRTaXplKAorICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50c0RlbHRhIGNvbnN0JiB0KSB7CisgICAgcmV0dXJuIG1pbkZsYXR0ZW5lZFNpemUodCkgKworICAgICAgICAgICAgZ2V0RmxhdHRlbmVkU2l6ZSh0LmdwdUNvbXBvc2l0aW9uRG9uZUZlbmNlKSArCisgICAgICAgICAgICBnZXRGbGF0dGVuZWRTaXplKHQuZGlzcGxheVByZXNlbnRGZW5jZSkgKworICAgICAgICAgICAgZ2V0RmxhdHRlbmVkU2l6ZSh0LmRpc3BsYXlSZXRpcmVGZW5jZSkgKworICAgICAgICAgICAgZ2V0RmxhdHRlbmVkU2l6ZSh0LnJlbGVhc2VGZW5jZSk7Cit9OworCisvKioKKyAqIFxicmllZiBSZXR1cm4gdGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbgorICogYEZyYW1lRXZlbnRzRGVsdGFgLgorICoKKyAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYEZyYW1lRXZlbnRzRGVsdGFgLgorICogXHJldHVybiBUaGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluIFxwIHQuCisgKi8KK3NpemVfdCBnZXRGZENvdW50KAorICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50c0RlbHRhIGNvbnN0JiB0KSB7CisgICAgcmV0dXJuIGdldEZkQ291bnQodC5ncHVDb21wb3NpdGlvbkRvbmVGZW5jZSkgKworICAgICAgICAgICAgZ2V0RmRDb3VudCh0LmRpc3BsYXlQcmVzZW50RmVuY2UpICsKKyAgICAgICAgICAgIGdldEZkQ291bnQodC5kaXNwbGF5UmV0aXJlRmVuY2UpICsKKyAgICAgICAgICAgIGdldEZkQ291bnQodC5yZWxlYXNlRmVuY2UpOworfTsKKworLyoqCisgKiBcYnJpZWYgVW5mbGF0dGVuIGBGcmFtZUV2ZW50c0RlbHRhYC4KKyAqCisgKiBccGFyYW1bb3V0XSB0IFRoZSBkZXN0aW5hdGlvbiBgRnJhbWVFdmVudHNEZWx0YWAuCisgKiBccGFyYW1bb3V0XSBuaCBUaGUgdW5kZXJseWluZyBhcnJheSBvZiBuYXRpdmUgaGFuZGxlcy4KKyAqIFxwYXJhbVtpbixvdXRdIGJ1ZmZlciBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgorICogXHBhcmFtW2luLG91dF0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgorICogXHBhcmFtW2luLG91dF0gZmRzIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IGZkIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbixvdXRdIG51bUZkcyBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBmZCBidWZmZXIuCisgKiBccmV0dXJuIGBOT19FUlJPUmAgb24gc3VjY2Vzczsgb3RoZXIgdmFsdWUgb24gZmFpbHVyZS4KKyAqCisgKiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIGBOT19FUlJPUmAsIFxwIG5oIHdpbGwgaGF2ZSBsZW5ndGggNCwgYW5kIGl0IHdpbGwgYmUKKyAqIHBvcHVsYXRlZCB3aXRoIGBudWxscHRyYCBvciBuZXdseSBjcmVhdGVkIGhhbmRsZXMuIEVhY2ggbm9uLW51bGwgc2xvdCBpbiBccAorICogbmggd2lsbCBuZWVkIHRvIGJlIGRlbGV0ZWQgbWFudWFsbHkgd2l0aCBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAuCisgKi8KK3N0YXR1c190IHVuZmxhdHRlbihIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50c0RlbHRhKiB0LAorICAgICAgICBzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiogbmgsCisgICAgICAgIHZvaWQgY29uc3QqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwgaW50IGNvbnN0KiYgZmRzLCBzaXplX3QmIG51bUZkcykgeworICAgIGlmIChzaXplIDwgbWluRmxhdHRlbmVkU2l6ZSgqdCkpIHsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisgICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIHQtPmZyYW1lTnVtYmVyKTsKKworICAgIC8vIFRoZXNlIHdlcmUgd3JpdHRlbiBhcyB1aW50OF90IGZvciBhbGlnbm1lbnQuCisgICAgdWludDhfdCB0ZW1wID0gMDsKKyAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgdGVtcCk7CisgICAgc2l6ZV90IGluZGV4ID0gc3RhdGljX2Nhc3Q8c2l6ZV90Pih0ZW1wKTsKKyAgICBpZiAoaW5kZXggPj0gOjphbmRyb2lkOjpGcmFtZUV2ZW50SGlzdG9yeTo6TUFYX0ZSQU1FX0hJU1RPUlkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgdC0+aW5kZXggPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oaW5kZXgpOworCisgICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIHRlbXApOworICAgIHQtPmFkZFBvc3RDb21wb3NpdGVDYWxsZWQgPSBzdGF0aWNfY2FzdDxib29sPih0ZW1wKTsKKyAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgdGVtcCk7CisgICAgdC0+YWRkUmV0aXJlQ2FsbGVkID0gc3RhdGljX2Nhc3Q8Ym9vbD4odGVtcCk7CisgICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIHRlbXApOworICAgIHQtPmFkZFJlbGVhc2VDYWxsZWQgPSBzdGF0aWNfY2FzdDxib29sPih0ZW1wKTsKKworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCB0LT5wb3N0ZWRUaW1lTnMpOworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCB0LT5yZXF1ZXN0ZWRQcmVzZW50VGltZU5zKTsKKyAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgdC0+bGF0Y2hUaW1lTnMpOworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCB0LT5maXJzdFJlZnJlc2hTdGFydFRpbWVOcyk7CisgICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIHQtPmxhc3RSZWZyZXNoU3RhcnRUaW1lTnMpOworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCB0LT5kZXF1ZXVlUmVhZHlUaW1lKTsKKworICAgIC8vIEZlbmNlcworICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZlbmNlVGltZVNuYXBzaG90KiB0U25hcHNob3RbNF07CisgICAgdFNuYXBzaG90WzBdID0gJnQtPmdwdUNvbXBvc2l0aW9uRG9uZUZlbmNlOworICAgIHRTbmFwc2hvdFsxXSA9ICZ0LT5kaXNwbGF5UHJlc2VudEZlbmNlOworICAgIHRTbmFwc2hvdFsyXSA9ICZ0LT5kaXNwbGF5UmV0aXJlRmVuY2U7CisgICAgdFNuYXBzaG90WzNdID0gJnQtPnJlbGVhc2VGZW5jZTsKKyAgICBuaC0+cmVzaXplKDQpOworICAgIGZvciAoc2l6ZV90IHNuYXBzaG90SW5kZXggPSAwOyBzbmFwc2hvdEluZGV4IDwgNDsgKytzbmFwc2hvdEluZGV4KSB7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHVuZmxhdHRlbigKKyAgICAgICAgICAgICAgICB0U25hcHNob3Rbc25hcHNob3RJbmRleF0sICYoKCpuaClbc25hcHNob3RJbmRleF0pLAorICAgICAgICAgICAgICAgIGJ1ZmZlciwgc2l6ZSwgZmRzLCBudW1GZHMpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICB3aGlsZSAoc25hcHNob3RJbmRleCA+IDApIHsKKyAgICAgICAgICAgICAgICAtLXNuYXBzaG90SW5kZXg7CisgICAgICAgICAgICAgICAgaWYgKCgqbmgpW3NuYXBzaG90SW5kZXhdICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoKCpuaClbc25hcHNob3RJbmRleF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKioKKyAqIFxicmllZiBGbGF0dGVuIGBGcmFtZUV2ZW50c0RlbHRhYC4KKyAqCisgKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgRnJhbWVFdmVudHNEZWx0YWAuCisgKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbixvdXRdIGZkcyBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBmZCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBudW1GZHMgVGhlIHNpemUgb2YgdGhlIGZsYXQgZmQgYnVmZmVyLgorICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGR1cGxpY2F0ZSBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbiBccCB0LgorICovCisvLyBSZWY6IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvZ3VpL0ZyYW1lVGltZXN0YW1wLmNwcDoKKy8vICAgICAgRnJhbWVFdmVudHNEZWx0YTo6ZmxhdHRlbgorc3RhdHVzX3QgZmxhdHRlbihIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50c0RlbHRhIGNvbnN0JiB0LAorICAgICAgICB2b2lkKiYgYnVmZmVyLCBzaXplX3QmIHNpemUsIGludComIGZkcywgc2l6ZV90IG51bUZkcykgeworICAgIC8vIENoZWNrIHRoYXQgdC5pbmRleCBpcyB3aXRoaW4gYSB2YWxpZCByYW5nZS4KKyAgICBpZiAodC5pbmRleCA+PSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oRnJhbWVFdmVudEhpc3Rvcnk6Ok1BWF9GUkFNRV9ISVNUT1JZKQorICAgICAgICAgICAgfHwgdC5pbmRleCA+IHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDhfdD46Om1heCgpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCB0LmZyYW1lTnVtYmVyKTsKKworICAgIC8vIFRoZXNlIGFyZSBzdGF0aWNfY2FzdCB0byB1aW50OF90IGZvciBhbGlnbm1lbnQuCisgICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCBzdGF0aWNfY2FzdDx1aW50OF90Pih0LmluZGV4KSk7CisgICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoCisgICAgICAgICAgICBidWZmZXIsIHNpemUsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHQuYWRkUG9zdENvbXBvc2l0ZUNhbGxlZCkpOworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKAorICAgICAgICAgICAgYnVmZmVyLCBzaXplLCBzdGF0aWNfY2FzdDx1aW50OF90Pih0LmFkZFJldGlyZUNhbGxlZCkpOworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKAorICAgICAgICAgICAgYnVmZmVyLCBzaXplLCBzdGF0aWNfY2FzdDx1aW50OF90Pih0LmFkZFJlbGVhc2VDYWxsZWQpKTsKKworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgdC5wb3N0ZWRUaW1lTnMpOworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgdC5yZXF1ZXN0ZWRQcmVzZW50VGltZU5zKTsKKyAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsIHQubGF0Y2hUaW1lTnMpOworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgdC5maXJzdFJlZnJlc2hTdGFydFRpbWVOcyk7CisgICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCB0Lmxhc3RSZWZyZXNoU3RhcnRUaW1lTnMpOworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgdC5kZXF1ZXVlUmVhZHlUaW1lKTsKKworICAgIC8vIEZlbmNlcworICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZlbmNlVGltZVNuYXBzaG90IGNvbnN0KiB0U25hcHNob3RbNF07CisgICAgdFNuYXBzaG90WzBdID0gJnQuZ3B1Q29tcG9zaXRpb25Eb25lRmVuY2U7CisgICAgdFNuYXBzaG90WzFdID0gJnQuZGlzcGxheVByZXNlbnRGZW5jZTsKKyAgICB0U25hcHNob3RbMl0gPSAmdC5kaXNwbGF5UmV0aXJlRmVuY2U7CisgICAgdFNuYXBzaG90WzNdID0gJnQucmVsZWFzZUZlbmNlOworICAgIGZvciAoc2l6ZV90IHNuYXBzaG90SW5kZXggPSAwOyBzbmFwc2hvdEluZGV4IDwgNDsgKytzbmFwc2hvdEluZGV4KSB7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGZsYXR0ZW4oCisgICAgICAgICAgICAgICAgKih0U25hcHNob3Rbc25hcHNob3RJbmRleF0pLCBidWZmZXIsIHNpemUsIGZkcywgbnVtRmRzKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8vIFJlZjogZnJhbWV3b3Jrcy9uYXRpdmUvbGlicy9ndWkvRnJhbWVUaW1lc3RhbXBzLmNwcDogRnJhbWVFdmVudEhpc3RvcnlEZWx0YQorCisvKioKKyAqIFxicmllZiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIG5vbi1mZCBidWZmZXIgcmVxdWlyZWQgdG8gZmxhdHRlbgorICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgorICoKKyAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgorICogXHJldHVybiBUaGUgcmVxdWlyZWQgc2l6ZSBvZiB0aGUgZmxhdCBidWZmZXIuCisgKi8KK3NpemVfdCBnZXRGbGF0dGVuZWRTaXplKAorICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhIGNvbnN0JiB0KSB7CisgICAgc2l6ZV90IHNpemUgPSA0ICsgLy8gbURlbHRhcy5zaXplKCkKKyAgICAgICAgICAgIHNpemVvZih0LmNvbXBvc2l0b3JUaW1pbmcpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdC5kZWx0YXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgc2l6ZSArPSBnZXRGbGF0dGVuZWRTaXplKHQuZGVsdGFzW2ldKTsKKyAgICB9CisgICAgcmV0dXJuIHNpemU7Cit9CisKKy8qKgorICogXGJyaWVmIFJldHVybiB0aGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluCisgKiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCisgKgorICogXHBhcmFtW2luXSB0IFRoZSBpbnB1dCBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCisgKiBccmV0dXJuIFRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4gXHAgdC4KKyAqLworc2l6ZV90IGdldEZkQ291bnQoCisgICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGEgY29uc3QmIHQpIHsKKyAgICBzaXplX3QgbnVtRmRzID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHQuZGVsdGFzLnNpemUoKTsgKytpKSB7CisgICAgICAgIG51bUZkcyArPSBnZXRGZENvdW50KHQuZGVsdGFzW2ldKTsKKyAgICB9CisgICAgcmV0dXJuIG51bUZkczsKK30KKworLyoqCisgKiBcYnJpZWYgVW5mbGF0dGVuIGBGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KKyAqCisgKiBccGFyYW1bb3V0XSB0IFRoZSBkZXN0aW5hdGlvbiBgRnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCisgKiBccGFyYW1bb3V0XSBuaCBUaGUgdW5kZXJseWluZyBhcnJheSBvZiBhcnJheXMgb2YgbmF0aXZlIGhhbmRsZXMuCisgKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbixvdXRdIGZkcyBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBmZCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBudW1GZHMgVGhlIHNpemUgb2YgdGhlIGZsYXQgZmQgYnVmZmVyLgorICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCisgKgorICogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBgTk9fRVJST1JgLCBccCBuaCB3aWxsIGJlIHBvcHVsYXRlZCB3aXRoIGBudWxscHRyYCBvcgorICogbmV3bHkgY3JlYXRlZCBoYW5kbGVzLiBUaGUgc2Vjb25kIGRpbWVuc2lvbiBvZiBccCBuaCB3aWxsIGJlIDQuIEVhY2ggbm9uLW51bGwKKyAqIHNsb3QgaW4gXHAgbmggd2lsbCBuZWVkIHRvIGJlIGRlbGV0ZWQgbWFudWFsbHkgd2l0aCBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAuCisgKi8KK3N0YXR1c190IHVuZmxhdHRlbigKKyAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YSogdCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4gPiogbmgsCisgICAgICAgIHZvaWQgY29uc3QqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwgaW50IGNvbnN0KiYgZmRzLCBzaXplX3QmIG51bUZkcykgeworICAgIGlmIChzaXplIDwgNCkgeworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCB0LT5jb21wb3NpdG9yVGltaW5nKTsKKworICAgIHVpbnQzMl90IGRlbHRhQ291bnQgPSAwOworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCBkZWx0YUNvdW50KTsKKyAgICBpZiAoc3RhdGljX2Nhc3Q8c2l6ZV90PihkZWx0YUNvdW50KSA+CisgICAgICAgICAgICA6OmFuZHJvaWQ6OkZyYW1lRXZlbnRIaXN0b3J5OjpNQVhfRlJBTUVfSElTVE9SWSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICB0LT5kZWx0YXMucmVzaXplKGRlbHRhQ291bnQpOworICAgIG5oLT5yZXNpemUoZGVsdGFDb3VudCk7CisgICAgZm9yIChzaXplX3QgZGVsdGFJbmRleCA9IDA7IGRlbHRhSW5kZXggPCBkZWx0YUNvdW50OyArK2RlbHRhSW5kZXgpIHsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gdW5mbGF0dGVuKAorICAgICAgICAgICAgICAgICYodC0+ZGVsdGFzW2RlbHRhSW5kZXhdKSwgJigoKm5oKVtkZWx0YUluZGV4XSksCisgICAgICAgICAgICAgICAgYnVmZmVyLCBzaXplLCBmZHMsIG51bUZkcyk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKioKKyAqIFxicmllZiBGbGF0dGVuIGBGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KKyAqCisgKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgRnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCisgKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbixvdXRdIGZkcyBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBmZCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBudW1GZHMgVGhlIHNpemUgb2YgdGhlIGZsYXQgZmQgYnVmZmVyLgorICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGR1cGxpY2F0ZSBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbiBccCB0LgorICovCitzdGF0dXNfdCBmbGF0dGVuKAorICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhIGNvbnN0JiB0LAorICAgICAgICB2b2lkKiYgYnVmZmVyLCBzaXplX3QmIHNpemUsIGludComIGZkcywgc2l6ZV90JiBudW1GZHMpIHsKKyAgICBpZiAodC5kZWx0YXMuc2l6ZSgpID4gOjphbmRyb2lkOjpGcmFtZUV2ZW50SGlzdG9yeTo6TUFYX0ZSQU1FX0hJU1RPUlkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKHNpemUgPCBnZXRGbGF0dGVuZWRTaXplKHQpKSB7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCB0LmNvbXBvc2l0b3JUaW1pbmcpOworCisgICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4odC5kZWx0YXMuc2l6ZSgpKSk7CisgICAgZm9yIChzaXplX3QgZGVsdGFJbmRleCA9IDA7IGRlbHRhSW5kZXggPCB0LmRlbHRhcy5zaXplKCk7ICsrZGVsdGFJbmRleCkgeworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBmbGF0dGVuKHQuZGVsdGFzW2RlbHRhSW5kZXhdLCBidWZmZXIsIHNpemUsIGZkcywgbnVtRmRzKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qKgorICogXGJyaWVmIFdyYXAgYDo6YW5kcm9pZDo6RnJhbWVFdmVudEhpc3RvcnlEYXRhYCBpbgorICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgorICoKKyAqIFxwYXJhbVtvdXRdIHQgVGhlIHdyYXBwZXIgb2YgdHlwZQorICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgorICogXHBhcmFtW291dF0gbmggVGhlIGFycmF5IG9mIGFycmF5IG9mIG5hdGl2ZSBoYW5kbGVzIHRoYXQgYXJlIHJlZmVycmVkIHRvIGJ5CisgKiBtZW1iZXJzIG9mIFxwIHQuCisgKiBccGFyYW1baW5dIGwgVGhlIHNvdXJjZSBgOjphbmRyb2lkOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KKyAqCisgKiBPbiBzdWNjZXNzLCBlYWNoIG1lbWJlciBvZiBccCBuaCB3aWxsIGJlIGVpdGhlciBgbnVsbHB0cmAgb3IgYSBuZXdseSBjcmVhdGVkCisgKiBuYXRpdmUgaGFuZGxlLiBBbGwgdGhlIG5vbi1gbnVsbHB0cmAgZWxlbWVudHMgbXVzdCBiZSBkZWxldGVkIGluZGl2aWR1YWxseQorICogd2l0aCBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAuCisgKi8KK2Jvb2wgd3JhcEFzKEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGEqIHQsCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+ID4qIG5oLAorICAgICAgICA6OmFuZHJvaWQ6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGEgY29uc3QmIGwpIHsKKworICAgIHNpemVfdCBjb25zdCBiYXNlU2l6ZSA9IGwuZ2V0RmxhdHRlbmVkU2l6ZSgpOworICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IGJhc2VCdWZmZXIoCisgICAgICAgICAgICBuZXcgKHN0ZDo6bm90aHJvdykgdWludDhfdFtiYXNlU2l6ZV0pOworICAgIGlmICghYmFzZUJ1ZmZlcikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc2l6ZV90IGNvbnN0IGJhc2VOdW1GZHMgPSBsLmdldEZkQ291bnQoKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8aW50W10+IGJhc2VGZHMoCisgICAgICAgICAgICBuZXcgKHN0ZDo6bm90aHJvdykgaW50W2Jhc2VOdW1GZHNdKTsKKyAgICBpZiAoIWJhc2VGZHMpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZvaWQqIGJ1ZmZlciA9IHN0YXRpY19jYXN0PHZvaWQqPihiYXNlQnVmZmVyLmdldCgpKTsKKyAgICBzaXplX3Qgc2l6ZSA9IGJhc2VTaXplOworICAgIGludCogZmRzID0gYmFzZUZkcy5nZXQoKTsKKyAgICBzaXplX3QgbnVtRmRzID0gYmFzZU51bUZkczsKKyAgICBpZiAobC5mbGF0dGVuKGJ1ZmZlciwgc2l6ZSwgZmRzLCBudW1GZHMpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2b2lkIGNvbnN0KiBjb25zdEJ1ZmZlciA9IHN0YXRpY19jYXN0PHZvaWQgY29uc3QqPihiYXNlQnVmZmVyLmdldCgpKTsKKyAgICBzaXplID0gYmFzZVNpemU7CisgICAgaW50IGNvbnN0KiBjb25zdEZkcyA9IHN0YXRpY19jYXN0PGludCBjb25zdCo+KGJhc2VGZHMuZ2V0KCkpOworICAgIG51bUZkcyA9IGJhc2VOdW1GZHM7CisgICAgaWYgKHVuZmxhdHRlbih0LCBuaCwgY29uc3RCdWZmZXIsIHNpemUsIGNvbnN0RmRzLCBudW1GZHMpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBcYnJpZWYgQ29udmVydCBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YWAgdG8KKyAqIGA6OmFuZHJvaWQ6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgorICoKKyAqIFxwYXJhbVtvdXRdIGwgVGhlIGRlc3RpbmF0aW9uIGA6OmFuZHJvaWQ6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgorICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBkdXBsaWNhdGUgYWxsIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluIFxwIHQuCisgKi8KK2Jvb2wgY29udmVydFRvKAorICAgICAgICA6OmFuZHJvaWQ6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGEqIGwsCisgICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGEgY29uc3QmIHQpIHsKKworICAgIHNpemVfdCBjb25zdCBiYXNlU2l6ZSA9IGdldEZsYXR0ZW5lZFNpemUodCk7CisgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gYmFzZUJ1ZmZlcigKKyAgICAgICAgICAgIG5ldyAoc3RkOjpub3Rocm93KSB1aW50OF90W2Jhc2VTaXplXSk7CisgICAgaWYgKCFiYXNlQnVmZmVyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzaXplX3QgY29uc3QgYmFzZU51bUZkcyA9IGdldEZkQ291bnQodCk7CisgICAgc3RkOjp1bmlxdWVfcHRyPGludFtdPiBiYXNlRmRzKAorICAgICAgICAgICAgbmV3IChzdGQ6Om5vdGhyb3cpIGludFtiYXNlTnVtRmRzXSk7CisgICAgaWYgKCFiYXNlRmRzKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2b2lkKiBidWZmZXIgPSBzdGF0aWNfY2FzdDx2b2lkKj4oYmFzZUJ1ZmZlci5nZXQoKSk7CisgICAgc2l6ZV90IHNpemUgPSBiYXNlU2l6ZTsKKyAgICBpbnQqIGZkcyA9IHN0YXRpY19jYXN0PGludCo+KGJhc2VGZHMuZ2V0KCkpOworICAgIHNpemVfdCBudW1GZHMgPSBiYXNlTnVtRmRzOworICAgIGlmIChmbGF0dGVuKHQsIGJ1ZmZlciwgc2l6ZSwgZmRzLCBudW1GZHMpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2b2lkIGNvbnN0KiBjb25zdEJ1ZmZlciA9IHN0YXRpY19jYXN0PHZvaWQgY29uc3QqPihiYXNlQnVmZmVyLmdldCgpKTsKKyAgICBzaXplID0gYmFzZVNpemU7CisgICAgaW50IGNvbnN0KiBjb25zdEZkcyA9IHN0YXRpY19jYXN0PGludCBjb25zdCo+KGJhc2VGZHMuZ2V0KCkpOworICAgIG51bUZkcyA9IGJhc2VOdW1GZHM7CisgICAgaWYgKGwtPnVuZmxhdHRlbihjb25zdEJ1ZmZlciwgc2l6ZSwgY29uc3RGZHMsIG51bUZkcykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCisvLyBSZWY6IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvdWkvUmVnaW9uLmNwcAorCisvKioKKyAqIFxicmllZiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciByZXF1aXJlZCB0byBmbGF0dGVuIGBSZWdpb25gLgorICoKKyAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYFJlZ2lvbmAuCisgKiBccmV0dXJuIFRoZSByZXF1aXJlZCBzaXplIG9mIHRoZSBmbGF0IGJ1ZmZlci4KKyAqLworc2l6ZV90IGdldEZsYXR0ZW5lZFNpemUoUmVnaW9uIGNvbnN0JiB0KSB7CisgICAgcmV0dXJuIHNpemVvZih1aW50MzJfdCkgKyB0LnNpemUoKSAqIHNpemVvZig6OmFuZHJvaWQ6OlJlY3QpOworfQorCisvKioKKyAqIFxicmllZiBVbmZsYXR0ZW4gYFJlZ2lvbmAuCisgKgorICogXHBhcmFtW291dF0gdCBUaGUgZGVzdGluYXRpb24gYFJlZ2lvbmAuCisgKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgYnVmZmVyLgorICogXHBhcmFtW2luLG91dF0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBidWZmZXIuCisgKiBccmV0dXJuIGBOT19FUlJPUmAgb24gc3VjY2Vzczsgb3RoZXIgdmFsdWUgb24gZmFpbHVyZS4KKyAqLworc3RhdHVzX3QgdW5mbGF0dGVuKFJlZ2lvbiogdCwgdm9pZCBjb25zdComIGJ1ZmZlciwgc2l6ZV90JiBzaXplKSB7CisgICAgaWYgKHNpemUgPCBzaXplb2YodWludDMyX3QpKSB7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgdWludDMyX3QgbnVtUmVjdHMgPSAwOworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCBudW1SZWN0cyk7CisgICAgaWYgKHNpemUgPCBudW1SZWN0cyAqIHNpemVvZihSZWN0KSkgeworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKyAgICBpZiAobnVtUmVjdHMgPiAoVUlOVDMyX01BWCAvIHNpemVvZihSZWN0KSkpIHsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICB0LT5yZXNpemUobnVtUmVjdHMpOworICAgIGZvciAoc2l6ZV90IHIgPSAwOyByIDwgbnVtUmVjdHM7ICsrcikgeworICAgICAgICA6OmFuZHJvaWQ6OlJlY3QgcmVjdCg6OmFuZHJvaWQ6OlJlY3Q6OkVNUFRZX1JFQ1QpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZWN0LnVuZmxhdHRlbihidWZmZXIsIHNpemUpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIEZsYXR0ZW5hYmxlVXRpbHM6OmFkdmFuY2UoYnVmZmVyLCBzaXplLCBzaXplb2YocmVjdCkpOworICAgICAgICAoKnQpW3JdID0gUmVjdHsKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihyZWN0LmxlZnQpLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHJlY3QudG9wKSwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihyZWN0LnJpZ2h0KSwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihyZWN0LmJvdHRvbSl9OworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qKgorICogXGJyaWVmIEZsYXR0ZW4gYFJlZ2lvbmAuCisgKgorICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYFJlZ2lvbmAuCisgKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgYnVmZmVyLgorICogXHBhcmFtW2luLG91dF0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBidWZmZXIuCisgKiBccmV0dXJuIGBOT19FUlJPUmAgb24gc3VjY2Vzczsgb3RoZXIgdmFsdWUgb24gZmFpbHVyZS4KKyAqLworc3RhdHVzX3QgZmxhdHRlbihSZWdpb24gY29uc3QmIHQsIHZvaWQqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSkgeworICAgIGlmIChzaXplIDwgZ2V0RmxhdHRlbmVkU2l6ZSh0KSkgeworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHQuc2l6ZSgpKSk7CisgICAgZm9yIChzaXplX3QgciA9IDA7IHIgPCB0LnNpemUoKTsgKytyKSB7CisgICAgICAgIDo6YW5kcm9pZDo6UmVjdCByZWN0KAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHRbcl0ubGVmdCksCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4odFtyXS50b3ApLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHRbcl0ucmlnaHQpLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHRbcl0uYm90dG9tKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlY3QuZmxhdHRlbihidWZmZXIsIHNpemUpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIEZsYXR0ZW5hYmxlVXRpbHM6OmFkdmFuY2UoYnVmZmVyLCBzaXplLCBzaXplb2YocmVjdCkpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qKgorICogXGJyaWVmIENvbnZlcnQgYDo6YW5kcm9pZDo6UmVnaW9uYCB0byBgUmVnaW9uYC4KKyAqCisgKiBccGFyYW1bb3V0XSB0IFRoZSBkZXN0aW5hdGlvbiBgUmVnaW9uYC4KKyAqIFxwYXJhbVtpbl0gbCBUaGUgc291cmNlIGA6OmFuZHJvaWQ6OlJlZ2lvbmAuCisgKi8KKy8vIGNvbnZlcnQ6IDo6YW5kcm9pZDo6UmVnaW9uIC0+IFJlZ2lvbgorYm9vbCBjb252ZXJ0VG8oUmVnaW9uKiB0LCA6OmFuZHJvaWQ6OlJlZ2lvbiBjb25zdCYgbCkgeworICAgIHNpemVfdCBjb25zdCBiYXNlU2l6ZSA9IGwuZ2V0RmxhdHRlbmVkU2l6ZSgpOworICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IGJhc2VCdWZmZXIoCisgICAgICAgICAgICBuZXcgKHN0ZDo6bm90aHJvdykgdWludDhfdFtiYXNlU2l6ZV0pOworICAgIGlmICghYmFzZUJ1ZmZlcikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdm9pZCogYnVmZmVyID0gc3RhdGljX2Nhc3Q8dm9pZCo+KGJhc2VCdWZmZXIuZ2V0KCkpOworICAgIHNpemVfdCBzaXplID0gYmFzZVNpemU7CisgICAgaWYgKGwuZmxhdHRlbihidWZmZXIsIHNpemUpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2b2lkIGNvbnN0KiBjb25zdEJ1ZmZlciA9IHN0YXRpY19jYXN0PHZvaWQgY29uc3QqPihiYXNlQnVmZmVyLmdldCgpKTsKKyAgICBzaXplID0gYmFzZVNpemU7CisgICAgaWYgKHVuZmxhdHRlbih0LCBjb25zdEJ1ZmZlciwgc2l6ZSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCisvKioKKyAqIFxicmllZiBDb252ZXJ0IGBSZWdpb25gIHRvIGA6OmFuZHJvaWQ6OlJlZ2lvbmAuCisgKgorICogXHBhcmFtW291dF0gbCBUaGUgZGVzdGluYXRpb24gYDo6YW5kcm9pZDo6UmVnaW9uYC4KKyAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBSZWdpb25gLgorICovCisvLyBjb252ZXJ0OiBSZWdpb24gLT4gOjphbmRyb2lkOjpSZWdpb24KK2Jvb2wgY29udmVydFRvKDo6YW5kcm9pZDo6UmVnaW9uKiBsLCBSZWdpb24gY29uc3QmIHQpIHsKKyAgICBzaXplX3QgY29uc3QgYmFzZVNpemUgPSBnZXRGbGF0dGVuZWRTaXplKHQpOworICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IGJhc2VCdWZmZXIoCisgICAgICAgICAgICBuZXcgKHN0ZDo6bm90aHJvdykgdWludDhfdFtiYXNlU2l6ZV0pOworICAgIGlmICghYmFzZUJ1ZmZlcikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdm9pZCogYnVmZmVyID0gc3RhdGljX2Nhc3Q8dm9pZCo+KGJhc2VCdWZmZXIuZ2V0KCkpOworICAgIHNpemVfdCBzaXplID0gYmFzZVNpemU7CisgICAgaWYgKGZsYXR0ZW4odCwgYnVmZmVyLCBzaXplKSAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdm9pZCBjb25zdCogY29uc3RCdWZmZXIgPSBzdGF0aWNfY2FzdDx2b2lkIGNvbnN0Kj4oYmFzZUJ1ZmZlci5nZXQoKSk7CisgICAgc2l6ZSA9IGJhc2VTaXplOworICAgIGlmIChsLT51bmZsYXR0ZW4oY29uc3RCdWZmZXIsIHNpemUpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gUmVmOiBmcmFtZXdvcmtzL25hdGl2ZS9saWJzL2d1aS9CR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmNwcDoKKy8vICAgICAgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dAorCisvKioKKyAqIFxicmllZiBSZXR1cm4gYSBsb3dlciBib3VuZCBvbiB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIHJlcXVpcmVkIHRvIGZsYXR0ZW4KKyAqIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KKyAqCisgKiBccGFyYW1baW5dIHQgVGhlIGlucHV0IGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KKyAqIFxyZXR1cm4gQSBsb3dlciBib3VuZCBvbiB0aGUgc2l6ZSBvZiB0aGUgZmxhdCBidWZmZXIuCisgKi8KK2NvbnN0ZXhwciBzaXplX3QgbWluRmxhdHRlbmVkU2l6ZSgKKyAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCBjb25zdCYgLyogdCAqLykgeworICAgIHJldHVybiBzaXplb2YoaW50NjRfdCkgKyAvLyB0aW1lc3RhbXAKKyAgICAgICAgICAgIHNpemVvZihpbnQpICsgLy8gaXNBdXRvVGltZXN0YW1wCisgICAgICAgICAgICBzaXplb2YoYW5kcm9pZF9kYXRhc3BhY2UpICsgLy8gZGF0YVNwYWNlCisgICAgICAgICAgICBzaXplb2YoOjphbmRyb2lkOjpSZWN0KSArIC8vIGNyb3AKKyAgICAgICAgICAgIHNpemVvZihpbnQpICsgLy8gc2NhbGluZ01vZGUKKyAgICAgICAgICAgIHNpemVvZih1aW50MzJfdCkgKyAvLyB0cmFuc2Zvcm0KKyAgICAgICAgICAgIHNpemVvZih1aW50MzJfdCkgKyAvLyBzdGlja3lUcmFuc2Zvcm0KKyAgICAgICAgICAgIHNpemVvZihib29sKTsgLy8gZ2V0RnJhbWVUaW1lc3RhbXBzCit9CisKKy8qKgorICogXGJyaWVmIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIHJlcXVpcmVkIHRvIGZsYXR0ZW4KKyAqIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KKyAqCisgKiBccGFyYW1baW5dIHQgVGhlIGlucHV0IGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KKyAqIFxyZXR1cm4gVGhlIHJlcXVpcmVkIHNpemUgb2YgdGhlIGZsYXQgYnVmZmVyLgorICovCitzaXplX3QgZ2V0RmxhdHRlbmVkU2l6ZShIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0IGNvbnN0JiB0KSB7CisgICAgcmV0dXJuIG1pbkZsYXR0ZW5lZFNpemUodCkgKworICAgICAgICAgICAgZ2V0RmVuY2VGbGF0dGVuZWRTaXplKHQuZmVuY2UpICsKKyAgICAgICAgICAgIGdldEZsYXR0ZW5lZFNpemUodC5zdXJmYWNlRGFtYWdlKSArCisgICAgICAgICAgICBzaXplb2YoSGRyTWV0YWRhdGE6OnZhbGlkVHlwZXMpOworfQorCisvKioKKyAqIFxicmllZiBSZXR1cm4gdGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbgorICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgorICoKKyAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgorICogXHJldHVybiBUaGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluIFxwIHQuCisgKi8KK3NpemVfdCBnZXRGZENvdW50KAorICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0IGNvbnN0JiB0KSB7CisgICAgcmV0dXJuIGdldEZlbmNlRmRDb3VudCh0LmZlbmNlKTsKK30KKworLyoqCisgKiBcYnJpZWYgRmxhdHRlbiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCisgKgorICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgorICogXHBhcmFtW291dF0gbmggVGhlIG5hdGl2ZSBoYW5kbGUgY2xvbmVkIGZyb20gYHQuZmVuY2VgLgorICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBmZHMgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgZmQgYnVmZmVyLgorICogXHBhcmFtW2luLG91dF0gbnVtRmRzIFRoZSBzaXplIG9mIHRoZSBmbGF0IGZkIGJ1ZmZlci4KKyAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBkdXBsaWNhdGUgdGhlIGZpbGUgZGVzY3JpcHRvciBpbiBgdC5mZW5jZWAuICovCitzdGF0dXNfdCBmbGF0dGVuKEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQgY29uc3QmIHQsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCoqIG5oLAorICAgICAgICB2b2lkKiYgYnVmZmVyLCBzaXplX3QmIHNpemUsIGludComIGZkcywgc2l6ZV90JiBudW1GZHMpIHsKKyAgICBpZiAoc2l6ZSA8IGdldEZsYXR0ZW5lZFNpemUodCkpIHsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsIHQudGltZXN0YW1wKTsKKyAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsIHN0YXRpY19jYXN0PGludD4odC5pc0F1dG9UaW1lc3RhbXApKTsKKyAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxhbmRyb2lkX2RhdGFzcGFjZV90Pih0LmRhdGFTcGFjZSkpOworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgOjphbmRyb2lkOjpSZWN0KAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4odC5jcm9wLmxlZnQpLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4odC5jcm9wLnRvcCksCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90Pih0LmNyb3AucmlnaHQpLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4odC5jcm9wLmJvdHRvbSkpKTsKKyAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsIHN0YXRpY19jYXN0PGludD4odC5zY2FsaW5nTW9kZSkpOworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgdC50cmFuc2Zvcm0pOworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgdC5zdGlja3lUcmFuc2Zvcm0pOworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgdC5nZXRGcmFtZVRpbWVzdGFtcHMpOworCisgICAgKm5oID0gdC5mZW5jZS5nZXROYXRpdmVIYW5kbGUoKSA9PSBudWxscHRyID8KKyAgICAgICAgICAgIG51bGxwdHIgOiBuYXRpdmVfaGFuZGxlX2Nsb25lKHQuZmVuY2UpOworICAgIHN0YXR1c190IHN0YXR1cyA9IGZsYXR0ZW5GZW5jZShoaWRsX2hhbmRsZSgqbmgpLCBidWZmZXIsIHNpemUsIGZkcywgbnVtRmRzKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHN0YXR1cyA9IGZsYXR0ZW4odC5zdXJmYWNlRGFtYWdlLCBidWZmZXIsIHNpemUpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCBkZWNsdHlwZShIZHJNZXRhZGF0YTo6dmFsaWRUeXBlcykoMCkpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyoqCisgKiBcYnJpZWYgVW5mbGF0dGVuIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KKyAqCisgKiBccGFyYW1bb3V0XSB0IFRoZSBkZXN0aW5hdGlvbiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCisgKiBccGFyYW1bb3V0XSBuaCBUaGUgdW5kZXJseWluZyBuYXRpdmUgaGFuZGxlIGZvciBgdC0+ZmVuY2VgLgorICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBmZHMgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgZmQgYnVmZmVyLgorICogXHBhcmFtW2luLG91dF0gbnVtRmRzIFRoZSBzaXplIG9mIHRoZSBmbGF0IGZkIGJ1ZmZlci4KKyAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgorICoKKyAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgYE5PX0VSUk9SYCBhbmQgYHQtPmZlbmNlYCBjb250YWlucyBhIHZhbGlkIGZpbGUKKyAqIGRlc2NyaXB0b3IsIFxwIG5oIHdpbGwgYmUgYSBuZXdseSBjcmVhdGVkIG5hdGl2ZSBoYW5kbGUgaG9sZGluZyB0aGF0IGZpbGUKKyAqIGRlc2NyaXB0b3IuIFxwIG5oIG5lZWRzIHRvIGJlIGRlbGV0ZWQgd2l0aCBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAKKyAqIGFmdGVyd2FyZHMuCisgKi8KK3N0YXR1c190IHVuZmxhdHRlbigKKyAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCogdCwgbmF0aXZlX2hhbmRsZV90KiogbmgsCisgICAgICAgIHZvaWQgY29uc3QqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwgaW50IGNvbnN0KiYgZmRzLCBzaXplX3QmIG51bUZkcykgeworICAgIGlmIChzaXplIDwgbWluRmxhdHRlbmVkU2l6ZSgqdCkpIHsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgdC0+dGltZXN0YW1wKTsKKyAgICBpbnQgbElzQXV0b1RpbWVzdGFtcDsKKyAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgbElzQXV0b1RpbWVzdGFtcCk7CisgICAgdC0+aXNBdXRvVGltZXN0YW1wID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4obElzQXV0b1RpbWVzdGFtcCk7CisgICAgYW5kcm9pZF9kYXRhc3BhY2VfdCBsRGF0YVNwYWNlOworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCBsRGF0YVNwYWNlKTsKKyAgICB0LT5kYXRhU3BhY2UgPSBzdGF0aWNfY2FzdDxEYXRhc3BhY2U+KGxEYXRhU3BhY2UpOworICAgIFJlY3QgbENyb3A7CisgICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIGxDcm9wKTsKKyAgICB0LT5jcm9wID0gUmVjdHsKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGxDcm9wLmxlZnQpLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4obENyb3AudG9wKSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGxDcm9wLnJpZ2h0KSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGxDcm9wLmJvdHRvbSl9OworICAgIGludCBsU2NhbGluZ01vZGU7CisgICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIGxTY2FsaW5nTW9kZSk7CisgICAgdC0+c2NhbGluZ01vZGUgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihsU2NhbGluZ01vZGUpOworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCB0LT50cmFuc2Zvcm0pOworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCB0LT5zdGlja3lUcmFuc2Zvcm0pOworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCB0LT5nZXRGcmFtZVRpbWVzdGFtcHMpOworCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gdW5mbGF0dGVuRmVuY2UoJih0LT5mZW5jZSksIG5oLAorICAgICAgICAgICAgYnVmZmVyLCBzaXplLCBmZHMsIG51bUZkcyk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICAvLyBIZHJNZXRhZGF0YSBpZ25vcmVkCisgICAgcmV0dXJuIHVuZmxhdHRlbigmKHQtPnN1cmZhY2VEYW1hZ2UpLCBidWZmZXIsIHNpemUpOworfQorCisvKioKKyAqIFxicmllZiBXcmFwIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YCBpbgorICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgorICoKKyAqIFxwYXJhbVtvdXRdIHQgVGhlIHdyYXBwZXIgb2YgdHlwZQorICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgorICogXHBhcmFtW291dF0gbmggVGhlIHVuZGVybHlpbmcgbmF0aXZlIGhhbmRsZSBmb3IgYHQtPmZlbmNlYC4KKyAqIFxwYXJhbVtpbl0gbCBUaGUgc291cmNlIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KKyAqCisgKiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIGB0cnVlYCBhbmQgYHQtPmZlbmNlYCBjb250YWlucyBhIHZhbGlkIGZpbGUKKyAqIGRlc2NyaXB0b3IsIFxwIG5oIHdpbGwgYmUgYSBuZXdseSBjcmVhdGVkIG5hdGl2ZSBoYW5kbGUgaG9sZGluZyB0aGF0IGZpbGUKKyAqIGRlc2NyaXB0b3IuIFxwIG5oIG5lZWRzIHRvIGJlIGRlbGV0ZWQgd2l0aCBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAKKyAqIGFmdGVyd2FyZHMuCisgKi8KK2Jvb2wgd3JhcEFzKAorICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0KiB0LAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QqKiBuaCwKKyAgICAgICAgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCBjb25zdCYgbCkgeworCisgICAgc2l6ZV90IGNvbnN0IGJhc2VTaXplID0gbC5nZXRGbGF0dGVuZWRTaXplKCk7CisgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gYmFzZUJ1ZmZlcigKKyAgICAgICAgICAgIG5ldyAoc3RkOjpub3Rocm93KSB1aW50OF90W2Jhc2VTaXplXSk7CisgICAgaWYgKCFiYXNlQnVmZmVyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzaXplX3QgY29uc3QgYmFzZU51bUZkcyA9IGwuZ2V0RmRDb3VudCgpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxpbnRbXT4gYmFzZUZkcygKKyAgICAgICAgICAgIG5ldyAoc3RkOjpub3Rocm93KSBpbnRbYmFzZU51bUZkc10pOworICAgIGlmICghYmFzZUZkcykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdm9pZCogYnVmZmVyID0gc3RhdGljX2Nhc3Q8dm9pZCo+KGJhc2VCdWZmZXIuZ2V0KCkpOworICAgIHNpemVfdCBzaXplID0gYmFzZVNpemU7CisgICAgaW50KiBmZHMgPSBiYXNlRmRzLmdldCgpOworICAgIHNpemVfdCBudW1GZHMgPSBiYXNlTnVtRmRzOworICAgIGlmIChsLmZsYXR0ZW4oYnVmZmVyLCBzaXplLCBmZHMsIG51bUZkcykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZvaWQgY29uc3QqIGNvbnN0QnVmZmVyID0gc3RhdGljX2Nhc3Q8dm9pZCBjb25zdCo+KGJhc2VCdWZmZXIuZ2V0KCkpOworICAgIHNpemUgPSBiYXNlU2l6ZTsKKyAgICBpbnQgY29uc3QqIGNvbnN0RmRzID0gc3RhdGljX2Nhc3Q8aW50IGNvbnN0Kj4oYmFzZUZkcy5nZXQoKSk7CisgICAgbnVtRmRzID0gYmFzZU51bUZkczsKKyAgICBpZiAodW5mbGF0dGVuKHQsIG5oLCBjb25zdEJ1ZmZlciwgc2l6ZSwgY29uc3RGZHMsIG51bUZkcykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCisvKioKKyAqIFxicmllZiBDb252ZXJ0IGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YCB0bworICogYEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgorICoKKyAqIFxwYXJhbVtvdXRdIGwgVGhlIGRlc3RpbmF0aW9uIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KKyAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KKyAqCisgKiBJZiBgdC5mZW5jZWAgaGFzIGEgdmFsaWQgZmlsZSBkZXNjcmlwdG9yLCBpdCB3aWxsIGJlIGR1cGxpY2F0ZWQuCisgKi8KK2Jvb2wgY29udmVydFRvKAorICAgICAgICBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0KiBsLAorICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0IGNvbnN0JiB0KSB7CisKKyAgICBzaXplX3QgY29uc3QgYmFzZVNpemUgPSBnZXRGbGF0dGVuZWRTaXplKHQpOworICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IGJhc2VCdWZmZXIoCisgICAgICAgICAgICBuZXcgKHN0ZDo6bm90aHJvdykgdWludDhfdFtiYXNlU2l6ZV0pOworICAgIGlmICghYmFzZUJ1ZmZlcikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc2l6ZV90IGNvbnN0IGJhc2VOdW1GZHMgPSBnZXRGZENvdW50KHQpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxpbnRbXT4gYmFzZUZkcygKKyAgICAgICAgICAgIG5ldyAoc3RkOjpub3Rocm93KSBpbnRbYmFzZU51bUZkc10pOworICAgIGlmICghYmFzZUZkcykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdm9pZCogYnVmZmVyID0gc3RhdGljX2Nhc3Q8dm9pZCo+KGJhc2VCdWZmZXIuZ2V0KCkpOworICAgIHNpemVfdCBzaXplID0gYmFzZVNpemU7CisgICAgaW50KiBmZHMgPSBiYXNlRmRzLmdldCgpOworICAgIHNpemVfdCBudW1GZHMgPSBiYXNlTnVtRmRzOworICAgIG5hdGl2ZV9oYW5kbGVfdCogbmg7CisgICAgaWYgKGZsYXR0ZW4odCwgJm5oLCBidWZmZXIsIHNpemUsIGZkcywgbnVtRmRzKSAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdm9pZCBjb25zdCogY29uc3RCdWZmZXIgPSBzdGF0aWNfY2FzdDx2b2lkIGNvbnN0Kj4oYmFzZUJ1ZmZlci5nZXQoKSk7CisgICAgc2l6ZSA9IGJhc2VTaXplOworICAgIGludCBjb25zdCogY29uc3RGZHMgPSBzdGF0aWNfY2FzdDxpbnQgY29uc3QqPihiYXNlRmRzLmdldCgpKTsKKyAgICBudW1GZHMgPSBiYXNlTnVtRmRzOworICAgIGlmIChsLT51bmZsYXR0ZW4oY29uc3RCdWZmZXIsIHNpemUsIGNvbnN0RmRzLCBudW1GZHMpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIGlmIChuaCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKG5oKTsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG5oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobmgpOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBSZWY6IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvZ3VpL0JHcmFwaGljQnVmZmVyUHJvZHVjZXIuY3BwOgorLy8gICAgICBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dAorCisvKioKKyAqIFxicmllZiBXcmFwIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dGAgaW4KKyAqIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dGAuCisgKgorICogXHBhcmFtW291dF0gdCBUaGUgd3JhcHBlciBvZiB0eXBlCisgKiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXRgLgorICogXHBhcmFtW291dF0gbmggVGhlIGFycmF5IG9mIGFycmF5IG9mIG5hdGl2ZSBoYW5kbGVzIHRoYXQgYXJlIHJlZmVycmVkIHRvIGJ5CisgKiBtZW1iZXJzIG9mIFxwIHQuCisgKiBccGFyYW1baW5dIGwgVGhlIHNvdXJjZSBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXRgLgorICoKKyAqIE9uIHN1Y2Nlc3MsIGVhY2ggbWVtYmVyIG9mIFxwIG5oIHdpbGwgYmUgZWl0aGVyIGBudWxscHRyYCBvciBhIG5ld2x5IGNyZWF0ZWQKKyAqIG5hdGl2ZSBoYW5kbGUuIEFsbCB0aGUgbm9uLWBudWxscHRyYCBlbGVtZW50cyBtdXN0IGJlIGRlbGV0ZWQgaW5kaXZpZHVhbGx5CisgKiB3aXRoIGBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpYC4KKyAqLworLy8gd3JhcDogQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQgLT4KKy8vIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0Citib29sIHdyYXBBcyhIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dCogdCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4gPiogbmgsCisgICAgICAgIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0IGNvbnN0JiBsKSB7CisgICAgaWYgKCF3cmFwQXMoJih0LT5mcmFtZVRpbWVzdGFtcHMpLCBuaCwgbC5mcmFtZVRpbWVzdGFtcHMpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdC0+d2lkdGggPSBsLndpZHRoOworICAgIHQtPmhlaWdodCA9IGwuaGVpZ2h0OworICAgIHQtPnRyYW5zZm9ybUhpbnQgPSBsLnRyYW5zZm9ybUhpbnQ7CisgICAgdC0+bnVtUGVuZGluZ0J1ZmZlcnMgPSBsLm51bVBlbmRpbmdCdWZmZXJzOworICAgIHQtPm5leHRGcmFtZU51bWJlciA9IGwubmV4dEZyYW1lTnVtYmVyOworICAgIHQtPmJ1ZmZlclJlcGxhY2VkID0gbC5idWZmZXJSZXBsYWNlZDsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBcYnJpZWYgQ29udmVydCBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXRgIHRvCisgKiBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXRgLgorICoKKyAqIFxwYXJhbVtvdXRdIGwgVGhlIGRlc3RpbmF0aW9uIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dGAuCisgKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXRgLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBkdXBsaWNhdGUgYWxsIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluIFxwIHQuCisgKi8KKy8vIGNvbnZlcnQ6IEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0IC0+CisvLyBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dAorYm9vbCBjb252ZXJ0VG8oCisgICAgICAgIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0KiBsLAorICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dCBjb25zdCYgdCkgeworICAgIGlmICghY29udmVydFRvKCYobC0+ZnJhbWVUaW1lc3RhbXBzKSwgdC5mcmFtZVRpbWVzdGFtcHMpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbC0+d2lkdGggPSB0LndpZHRoOworICAgIGwtPmhlaWdodCA9IHQuaGVpZ2h0OworICAgIGwtPnRyYW5zZm9ybUhpbnQgPSB0LnRyYW5zZm9ybUhpbnQ7CisgICAgbC0+bnVtUGVuZGluZ0J1ZmZlcnMgPSB0Lm51bVBlbmRpbmdCdWZmZXJzOworICAgIGwtPm5leHRGcmFtZU51bWJlciA9IHQubmV4dEZyYW1lTnVtYmVyOworICAgIGwtPmJ1ZmZlclJlcGxhY2VkID0gdC5idWZmZXJSZXBsYWNlZDsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBcYnJpZWYgQ29udmVydCBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGVgIHRvCisgKiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGVgLgorICoKKyAqIFxwYXJhbVtpbl0gbCBUaGUgc291cmNlIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZWAuCisgKiBccmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZWAuCisgKi8KK0hHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlIHRvSGlkbERpc2Nvbm5lY3RNb2RlKAorICAgICAgICBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZSBsKSB7CisgICAgc3dpdGNoIChsKSB7CisgICAgICAgIGNhc2UgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGU6OkFwaToKKyAgICAgICAgICAgIHJldHVybiBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZTo6QVBJOworICAgICAgICBjYXNlIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlOjpBbGxMb2NhbDoKKyAgICAgICAgICAgIHJldHVybiBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZTo6QUxMX0xPQ0FMOworICAgIH0KKyAgICByZXR1cm4gSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGU6OkFQSTsKK30KKworLyoqCisgKiBcYnJpZWYgQ29udmVydCBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGVgIHRvCisgKiBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGVgLgorICoKKyAqIFxwYXJhbVtpbl0gbCBUaGUgc291cmNlIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZWAuCisgKiBccmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZWAuCisgKi8KK0JHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlIHRvR3VpRGlzY29ubmVjdE1vZGUoCisgICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlIHQpIHsKKyAgICBzd2l0Y2ggKHQpIHsKKyAgICAgICAgY2FzZSBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZTo6QVBJOgorICAgICAgICAgICAgcmV0dXJuIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlOjpBcGk7CisgICAgICAgIGNhc2UgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGU6OkFMTF9MT0NBTDoKKyAgICAgICAgICAgIHJldHVybiBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZTo6QWxsTG9jYWw7CisgICAgfQorICAgIHJldHVybiBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZTo6QXBpOworfQorCit9ICAvLyBuYW1lc3BhY2UgY29udmVyc2lvbgorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvRnJhbWVEcm9wcGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0ZyYW1lRHJvcHBlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJhMjQ3MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0ZyYW1lRHJvcHBlci5jcHAKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiRnJhbWVEcm9wcGVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvRnJhbWVEcm9wcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgY29uc3QgaW50NjRfdCBrTWF4Sml0dGVyVXMgPSAyMDAwOworCitGcmFtZURyb3BwZXI6OkZyYW1lRHJvcHBlcigpCisgICAgOiBtRGVzaXJlZE1pblRpbWVVcygtMSksCisgICAgICBtTWluSW50ZXJ2YWxVcygwKSB7Cit9CisKK0ZyYW1lRHJvcHBlcjo6fkZyYW1lRHJvcHBlcigpIHsKK30KKworc3RhdHVzX3QgRnJhbWVEcm9wcGVyOjpzZXRNYXhGcmFtZVJhdGUoZmxvYXQgbWF4RnJhbWVSYXRlKSB7CisgICAgaWYgKG1heEZyYW1lUmF0ZSA8IDApIHsKKyAgICAgICAgbU1pbkludGVydmFsVXMgPSAtMWxsOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgaWYgKG1heEZyYW1lUmF0ZSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJmcmFtZXJhdGUgc2hvdWxkIGJlIHBvc2l0aXZlIGJ1dCBnb3QgJWYuIiwgbWF4RnJhbWVSYXRlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgbU1pbkludGVydmFsVXMgPSAoaW50NjRfdCkgKDEwMDAwMDAuMGYgLyBtYXhGcmFtZVJhdGUpOworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBGcmFtZURyb3BwZXI6OnNob3VsZERyb3AoaW50NjRfdCB0aW1lVXMpIHsKKyAgICBpZiAobU1pbkludGVydmFsVXMgPD0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKG1EZXNpcmVkTWluVGltZVVzIDwgMCkgeworICAgICAgICBtRGVzaXJlZE1pblRpbWVVcyA9IHRpbWVVcyArIG1NaW5JbnRlcnZhbFVzOworICAgICAgICBBTE9HVigiZmlyc3QgZnJhbWUgJWxsZCwgbmV4dCBkZXNpcmVkIGZyYW1lICVsbGQiLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpdGltZVVzLCAobG9uZyBsb25nKW1EZXNpcmVkTWluVGltZVVzKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICh0aW1lVXMgPCAobURlc2lyZWRNaW5UaW1lVXMgLSBrTWF4Sml0dGVyVXMpKSB7CisgICAgICAgIEFMT0dWKCJkcm9wIGZyYW1lICVsbGQsIGRlc2lyZWQgZnJhbWUgJWxsZCwgZGlmZiAlbGxkIiwKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKXRpbWVVcywgKGxvbmcgbG9uZyltRGVzaXJlZE1pblRpbWVVcywKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKShtRGVzaXJlZE1pblRpbWVVcyAtIHRpbWVVcykpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpbnQ2NF90IG4gPSAodGltZVVzIC0gbURlc2lyZWRNaW5UaW1lVXMgKyBrTWF4Sml0dGVyVXMpIC8gbU1pbkludGVydmFsVXM7CisgICAgbURlc2lyZWRNaW5UaW1lVXMgKz0gKG4gKyAxKSAqIG1NaW5JbnRlcnZhbFVzOworICAgIEFMT0dWKCJrZWVwIGZyYW1lICVsbGQsIG5leHQgZGVzaXJlZCBmcmFtZSAlbGxkLCBkaWZmICVsbGQiLAorICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lVXMsIChsb25nIGxvbmcpbURlc2lyZWRNaW5UaW1lVXMsCisgICAgICAgICAgICAobG9uZyBsb25nKShtRGVzaXJlZE1pblRpbWVVcyAtIHRpbWVVcykpOworICAgIHJldHVybiBmYWxzZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQwM2QzOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCkBAIC0wLDAgKzEsMTM3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjZGVmaW5lIExPR19UQUcgIkdyYXBoaWNCdWZmZXJTb3VyY2UiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNkZWZpbmUgU1RSSU5HSUZZX0VOVU1TIC8vIGZvciBhc1N0cmluZyBpbiBIYXJkd2FyZUFQSS5oL1ZpZGVvQVBJLmgKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL0dyYXBoaWNCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9GcmFtZURyb3BwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0ZpbGVEZXNjcmlwdG9yLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9NZXRhZGF0YUJ1ZmZlclR5cGUuaD4KKyNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+CisjaW5jbHVkZSA8Z3VpL0J1ZmZlckl0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPGNtYXRoPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisvLyBrVGltZXN0YW1wRmx1Y3R1YXRpb24gaXMgYW4gdXBwZXIgYm91bmQgb2YgdGltZXN0YW1wIGZsdWN0dWF0aW9uIGZyb20gdGhlCisvLyBzb3VyY2UgdGhhdCBHcmFwaGljQnVmZmVyU291cmNlIGFsbG93cy4gVGhlIHVuaXQgb2Yga1RpbWVzdGFtcEZsdWN0dWF0aW9uIGlzCisvLyBmcmFtZXMuIE1vcmUgc3BlY2lmaWNhbGx5LCBHcmFwaGljQnVmZmVyU291cmNlIHdpbGwgZHJvcCBhIGZyYW1lIGlmCisvLworLy8gZXhwZWN0ZWROZXdGcmFtZXRpbWVzdGFtcCAtIGFjdHVhbE5ld0ZyYW1lVGltZXN0YW1wIDwKKy8vICAgICAoMC41IC0ga1RpbWVzdGFtcEZsdWN0dWF0aW9uKSAqIGV4cGVjdGVkdGltZVBlcmlvZEJldHdlZW5GcmFtZXMKKy8vCisvLyB3aGVyZQorLy8gLSBleHBlY3RlZE5ld0ZyYW1lVGltZXN0YW1wIGlzIHRoZSBjYWxjdWxhdGVkIGlkZWFsIHRpbWVzdGFtcCBvZiB0aGUgbmV3CisvLyAgIGluY29taW5nIGZyYW1lCisvLyAtIGFjdHVhbE5ld0ZyYW1lVGltZXN0YW1wIGlzIHRoZSB0aW1lc3RhbXAgcmVjZWl2ZWQgZnJvbSB0aGUgc291cmNlCisvLyAtIGV4cGVjdGVkVGltZVBlcmlvZEJldHdlZW5GcmFtZXMgaXMgdGhlIGlkZWFsIGRpZmZlcmVuY2Ugb2YgdGhlIHRpbWVzdGFtcHMKKy8vICAgb2YgdHdvIGFkamFjZW50IGZyYW1lcworLy8KKy8vIFNlZSBHcmFwaGljQnVmZmVyU291cmNlOjpjYWxjdWxhdGVDb2RlY1RpbWVzdGFtcF9sKCkgZm9yIG1vcmUgZGV0YWlsIGFib3V0CisvLyBob3cga1RpbWVzdGFtcEZsdWN0dWF0aW9uIGlzIHVzZWQuCisvLworLy8ga1RpbWVzdGFtcEZsdWN0dWF0aW9uIHNob3VsZCBiZSBub24tbmVnYXRpdmUuIEEgaGlnaGVyIHZhbHVlIGNhdXNlcyBhIHNtYWxsZXIKKy8vIGNoYW5jZSBvZiBkcm9wcGluZyBmcmFtZXMsIGJ1dCBhdCB0aGUgc2FtZSB0aW1lIGEgaGlnaGVyIGJvdW5kIG9uIHRoZQorLy8gZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzb3VyY2UgdGltZXN0YW1wIGFuZCB0aGUgaW50ZXJwcmV0ZWQgKHNuYXBwZWQpCisvLyB0aW1lc3RhbXAuCisvLworLy8gVGhlIHZhbHVlIG9mIDAuMDUgbWVhbnMgdGhhdCBHcmFwaGljQnVmZmVyU291cmNlIGV4cGVjdHMgdGhlIGlucHV0IHRpbWVzdGFtcHMKKy8vIHRvIGZsdWN0dWF0ZSBubyBtb3JlIHRoYW4gNSUgZnJvbSB0aGUgcmVndWxhciB0aW1lIHBlcmlvZC4KKy8vCisvLyBUT0RPOiBKdXN0aWZ5IHRoZSBjaG9pY2Ugb2YgdGhpcyB2YWx1ZSwgb3IgbWFrZSBpdCBjb25maWd1cmFibGUuCitjb25zdGV4cHIgZG91YmxlIGtUaW1lc3RhbXBGbHVjdHVhdGlvbiA9IDAuMDU7Cit9CisKKy8qKgorICogQSBjb3BpYWJsZSBvYmplY3QgbWFuYWdpbmcgYSBidWZmZXIgaW4gdGhlIGJ1ZmZlciBjYWNoZSBtYW5hZ2VkIGJ5IHRoZSBwcm9kdWNlci4gVGhpcyBvYmplY3QKKyAqIGhvbGRzIGEgcmVmZXJlbmNlIHRvIHRoZSBidWZmZXIsIGFuZCBtYWludGFpbnMgd2hpY2ggYnVmZmVyIHNsb3QgaXQgYmVsb25ncyB0byAoaWYgYW55KSwgYW5kCisgKiB3aGV0aGVyIGl0IGlzIHN0aWxsIGluIGEgYnVmZmVyIHNsb3QuIEl0IGFsc28gbWFpbnRhaW5zIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBvdXRzdGFuZ2luZyBhY3F1aXJlCisgKiByZWZlcmVuY2VzIHRvIGl0IChieSBidWZmZXJzIGFjcXVpcmVkIGZyb20gdGhlIHNsb3QpIG1haW5seSBzbyB0aGF0IHdlIGNhbiBrZWVwIGEgZGVidWcKKyAqIGNvdW50IG9mIGhvdyBtYW55IGJ1ZmZlcnMgd2UgbmVlZCB0byBzdGlsbCByZWxlYXNlIGJhY2sgdG8gdGhlIHByb2R1Y2VyLgorICovCitzdHJ1Y3QgR3JhcGhpY0J1ZmZlclNvdXJjZTo6Q2FjaGVkQnVmZmVyIHsKKyAgICAvKioKKyAgICAgKiBUb2tlbiB0aGF0IGlzIHVzZWQgdG8gdHJhY2sgYWNxdWlyZSBjb3VudHMgKGFzIG9wcG9zZWQgdG8gYWxsIHJlZmVyZW5jZXMgdG8gdGhpcyBvYmplY3QpLgorICAgICAqLworICAgIHN0cnVjdCBBY3F1aXJhYmxlIHsgfTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSB1c2luZyBhIGJ1ZmZlciBjYWNoZWQgaW4gYSBzbG90LgorICAgICAqLworICAgIENhY2hlZEJ1ZmZlcihzbG90X2lkIHNsb3QsIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+ICZncmFwaGljQnVmZmVyKQorICAgICAgICA6IG1Jc0NhY2hlZCh0cnVlKSwKKyAgICAgICAgICBtU2xvdChzbG90KSwKKyAgICAgICAgICBtR3JhcGhpY0J1ZmZlcihncmFwaGljQnVmZmVyKSwKKyAgICAgICAgICBtQWNxdWlyYWJsZShzdGQ6Om1ha2Vfc2hhcmVkPEFjcXVpcmFibGU+KCkpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjYWNoZSBzbG90IHRoYXQgdGhpcyBidWZmZXIgaXMgY2FjaGVkIGluLCBvciAtMSBpZiBpdCBpcyBubyBsb25nZXIgY2FjaGVkLgorICAgICAqCisgICAgICogVGhpcyBhc3N1bWVzIHRoYXQgLTEgc2xvdCBpZCBpcyBpbnZhbGlkOyB0aG91Z2gsIGl0IGlzIGp1c3QgYSBiZW5pZ24gY29sbGlzaW9uIHVzZWQgZm9yCisgICAgICogZGVidWdnaW5nLiBUaGlzIG9iamVjdCBleHBsaWNpdGx5IG1hbmFnZXMgd2hldGhlciBpdCBpcyBzdGlsbCBjYWNoZWQuCisgICAgICovCisgICAgc2xvdF9pZCBnZXRTbG90KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUlzQ2FjaGVkID8gbVNsb3QgOiAtMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjYWNoZWQgYnVmZmVyLgorICAgICAqLworICAgIHNwPEdyYXBoaWNCdWZmZXI+IGdldEdyYXBoaWNCdWZmZXIoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtR3JhcGhpY0J1ZmZlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3Mgd2hldGhlciB0aGlzIGJ1ZmZlciBpcyBzdGlsbCBpbiB0aGUgYnVmZmVyIGNhY2hlLgorICAgICAqLworICAgIGJvb2wgaXNDYWNoZWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtSXNDYWNoZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhpcyBidWZmZXIgaGFzIGFuIGFjcXVpcmVkIHJlZmVyZW5jZS4KKyAgICAgKi8KKyAgICBib29sIGlzQWNxdWlyZWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQWNxdWlyYWJsZS51c2VfY291bnQoKSA+IDE7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBhbmQgcmV0dXJucyBhIHNoYXJlZCBhY3F1aXJlZCByZWZlcmVuY2UuCisgICAgICovCisgICAgc3RkOjpzaGFyZWRfcHRyPEFjcXVpcmFibGU+IGdldEFjcXVpcmFibGUoKSB7CisgICAgICAgIHJldHVybiBtQWNxdWlyYWJsZTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6ZGlzY2FyZEJ1ZmZlckF0U2xvdEluZGV4X2woc3NpemVfdCk7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCB0byBiZSBjYWxsZWQgd2hlbiB0aGUgYnVmZmVyIGlzIG5vIGxvbmdlciBpbiB0aGUgYnVmZmVyIGNhY2hlLgorICAgICAqIENhbGxlZCBmcm9tIGRpc2NhcmRCdWZmZXJBdFNsb3RJbmRleF9sLgorICAgICAqLworICAgIHZvaWQgb25Ecm9wcGVkRnJvbUNhY2hlKCkgeworICAgICAgICBDSEVDS19EQkcobUlzQ2FjaGVkKTsKKyAgICAgICAgbUlzQ2FjaGVkID0gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCBtSXNDYWNoZWQ7CisgICAgc2xvdF9pZCBtU2xvdDsKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBtR3JhcGhpY0J1ZmZlcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QWNxdWlyYWJsZT4gbUFjcXVpcmFibGU7Cit9OworCisvKioKKyAqIEEgY29waWFibGUgb2JqZWN0IG1hbmFnaW5nIGEgYnVmZmVyIGFjcXVpcmVkIGZyb20gdGhlIHByb2R1Y2VyLiBUaGlzIG11c3QgYWx3YXlzIGJlIGEgY2FjaGVkCisgKiBidWZmZXIuIFRoaXMgb2JqZWN0cyBhbHNvIG1hbmFnZXMgaXRzIGFjcXVpcmUgZmVuY2UgYW5kIGFueSByZWxlYXNlIGZlbmNlcyB0aGF0IG1heSBiZSByZXR1cm5lZAorICogYnkgdGhlIGVuY29kZXIgZm9yIHRoaXMgYnVmZmVyICh0aGlzIGJ1ZmZlciBtYXkgYmUgcXVldWVkIHRvIHRoZSBlbmNvZGVyIG11bHRpcGxlIHRpbWVzKS4KKyAqIElmIG5vIHJlbGVhc2UgZmVuY2VzIGFyZSBhZGRlZCBieSB0aGUgZW5jb2RlciwgdGhlIGFjcXVpcmUgZmVuY2UgaXMgcmV0dXJuZWQgYXMgdGhlIHJlbGVhc2UKKyAqIGZlbmNlIGZvciB0aGlzIC0gYXMgaXQgaXMgYXNzdW1lZCB0aGF0IG5vb25lIHdhaXRlZCBmb3IgdGhlIGFjcXVpcmUgZmVuY2UuIE90aGVyd2lzZSwgaXQgaXMKKyAqIGFzc3VtZWQgdGhhdCB0aGUgZW5jb2RlciBoYXMgd2FpdGVkIGZvciB0aGUgYWNxdWlyZSBmZW5jZSAob3IgcmV0dXJuZWQgaXQgYXMgdGhlIHJlbGVhc2UKKyAqIGZlbmNlKS4KKyAqLworc3RydWN0IEdyYXBoaWNCdWZmZXJTb3VyY2U6OkFjcXVpcmVkQnVmZmVyIHsKKyAgICBBY3F1aXJlZEJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDYWNoZWRCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQWNxdWlyZWRCdWZmZXIgKik+IG9uUmVsZWFzZWQsCisgICAgICAgICAgICBjb25zdCBzcDxGZW5jZT4gJmFjcXVpcmVGZW5jZSkKKyAgICAgICAgOiBtQnVmZmVyKGJ1ZmZlciksCisgICAgICAgICAgbUFjcXVpcmFibGUoYnVmZmVyLT5nZXRBY3F1aXJhYmxlKCkpLAorICAgICAgICAgIG1BY3F1aXJlRmVuY2UoYWNxdWlyZUZlbmNlKSwKKyAgICAgICAgICBtR290UmVsZWFzZUZlbmNlcyhmYWxzZSksCisgICAgICAgICAgbU9uUmVsZWFzZWQob25SZWxlYXNlZCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSByZWxlYXNlIGZlbmNlIHJldHVybmVkIGJ5IHRoZSBlbmNvZGVyIHRvIHRoaXMgb2JqZWN0LiBJZiB0aGlzIGlzIGNhbGxlZCB3aXRoIGFuCisgICAgICogdmFsaWQgZmlsZSBkZXNjcmlwdG9yLCBpdCBpcyBhZGRlZCB0byB0aGUgbGlzdCBvZiByZWxlYXNlIGZlbmNlcy4gVGhlc2UgYXJlIHJldHVybmVkIHRvIHRoZQorICAgICAqIHByb2R1Y2VyIG9uIHJlbGVhc2UoKSBhcyBhIG1lcmdlZCBmZW5jZS4gUmVnYXJkbGVzcyBvZiB0aGUgdmFsaWRpdHkgb2YgdGhlIGZpbGUgZGVzY3JpcHRvciwKKyAgICAgKiB3ZSB0YWtlIG5vdGUgdGhhdCBhIHJlbGVhc2UgZmVuY2Ugd2FzIGF0dGVtcHRlZCB0byBiZSBhZGRlZCBhbmQgdGhlIGFjcXVpcmUgZmVuY2UgY2FuIG5vdyBiZQorICAgICAqIGFzc3VtZWQgYXMgYWNxdWlyZWQuCisgICAgICovCisgICAgdm9pZCBhZGRSZWxlYXNlRmVuY2VGZChpbnQgZmVuY2VGZCkgeworICAgICAgICAvLyBzYXZlIGFsbCByZWxlYXNlIGZlbmNlcyAtIHRoZXNlIHdpbGwgYmUgcHJvcGFnYXRlZCB0byB0aGUgcHJvZHVjZXIgaWYgdGhpcyBidWZmZXIgaXMKKyAgICAgICAgLy8gZXZlciByZWxlYXNlZCB0byBpdAorICAgICAgICBpZiAoZmVuY2VGZCA+PSAwKSB7CisgICAgICAgICAgICBtUmVsZWFzZUZlbmNlRmRzLnB1c2hfYmFjayhmZW5jZUZkKTsKKyAgICAgICAgfQorICAgICAgICBtR290UmVsZWFzZUZlbmNlcyA9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYWNxdWlyZSBmZW5jZSBmaWxlIGRlc2NyaXB0b3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIGludCBnZXRBY3F1aXJlRmVuY2VGZCgpIHsKKyAgICAgICAgaWYgKG1BY3F1aXJlRmVuY2UgPT0gbnVsbHB0ciB8fCAhbUFjcXVpcmVGZW5jZS0+aXNWYWxpZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1BY3F1aXJlRmVuY2UtPmR1cCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgYnVmZmVyIGlzIHN0aWxsIGluIHRoZSBidWZmZXIgY2FjaGUuCisgICAgICovCisgICAgYm9vbCBpc0NhY2hlZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1CdWZmZXItPmlzQ2FjaGVkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYWNxdWlyZWQgYnVmZmVyLgorICAgICAqLworICAgIHNwPEdyYXBoaWNCdWZmZXI+IGdldEdyYXBoaWNCdWZmZXIoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQnVmZmVyLT5nZXRHcmFwaGljQnVmZmVyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2xvdCB0aGF0IHRoaXMgYnVmZmVyIGlzIGNhY2hlZCBhdCwgb3IgLTEgb3RoZXJ3aXNlLgorICAgICAqCisgICAgICogVGhpcyBhc3N1bWVzIHRoYXQgLTEgc2xvdCBpZCBpcyBpbnZhbGlkOyB0aG91Z2gsIGl0IGlzIGp1c3QgYSBiZW5pZ24gY29sbGlzaW9uIHVzZWQgZm9yCisgICAgICogZGVidWdnaW5nLiBUaGlzIG9iamVjdCBleHBsaWNpdGx5IG1hbmFnZXMgd2hldGhlciBpdCBpcyBzdGlsbCBjYWNoZWQuCisgICAgICovCisgICAgc2xvdF9pZCBnZXRTbG90KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUJ1ZmZlci0+Z2V0U2xvdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSByZWxlYXNlIGZlbmNlIG9iamVjdCBmcm9tIHRoZSBhY3F1aXJlIGZlbmNlIGFuZC9vciBhbnkgcmVsZWFzZSBmZW5jZXMKKyAgICAgKiBhZGRlZC4gSWYgbm8gcmVsZWFzZSBmZW5jZXMgd2VyZSBhZGRlZCAoZXZlbiBpZiBpbnZhbGlkKSwgcmV0dXJucyB0aGUgYWNxdWlyZSBmZW5jZS4KKyAgICAgKiBPdGhlcndpc2UsIGl0IHJldHVybnMgYSBtZXJnZWQgZmVuY2UgZnJvbSBhbGwgdGhlIHZhbGlkIHJlbGVhc2UgZmVuY2VzIGFkZGVkLgorICAgICAqLworICAgIHNwPEZlbmNlPiBnZXRSZWxlYXNlRmVuY2UoKSB7CisgICAgICAgIC8vIElmIGRpZCBub3QgcmVjZWl2ZSByZWxlYXNlIGZlbmNlcywgd2UgYXNzdW1lIHRoaXMgYnVmZmVyIHdhcyBub3QgY29uc3VtZWQgKGl0IHdhcworICAgICAgICAvLyBkaXNjYXJkZWQgb3IgZHJvcHBlZCkuIEluIHRoaXMgY2FzZSByZWxlYXNlIHRoZSBhY3F1aXJlIGZlbmNlIGFzIHRoZSByZWxlYXNlIGZlbmNlLgorICAgICAgICAvLyBXZSBkbyB0aGlzIGhlcmUgdG8gYXZvaWQgYSBkdXAsIGNsb3NlIGFuZCByZWNyZWF0aW9uIG9mIHRoZSBGZW5jZSBvYmplY3QuCisgICAgICAgIGlmICghbUdvdFJlbGVhc2VGZW5jZXMpIHsKKyAgICAgICAgICAgIHJldHVybiBtQWNxdWlyZUZlbmNlOworICAgICAgICB9CisgICAgICAgIHNwPEZlbmNlPiByZXQgPSBnZXRSZWxlYXNlRmVuY2UoMCwgbVJlbGVhc2VGZW5jZUZkcy5zaXplKCkpOworICAgICAgICAvLyBjbGVhciBmZHMgYXMgZmVuY2UgdG9vayBvd25lcnNoaXAgb2YgdGhlbQorICAgICAgICBtUmVsZWFzZUZlbmNlRmRzLmNsZWFyKCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLy8gdGhpcyB2aWRlbyBidWZmZXIgaXMgbm8gbG9uZ2VyIHJlZmVyZW5jZWQgYnkgdGhlIGNvZGVjIChvciBrZXB0IGZvciBsYXRlciBlbmNvZGluZykKKyAgICAvLyBpdCBpcyBub3cgc2FmZSB0byByZWxlYXNlIHRvIHRoZSBwcm9kdWNlcgorICAgIH5BY3F1aXJlZEJ1ZmZlcigpIHsKKyAgICAgICAgLy9tQWNxdWlyYWJsZS5jbGVhcigpOworICAgICAgICBtT25SZWxlYXNlZCh0aGlzKTsKKyAgICAgICAgLy8gbU9uUmVsZWFzZSBtZXRob2Qgc2hvdWxkIGNhbGwgZ2V0UmVsZWFzZUZlbmNlKCkgdGhhdCByZWxlYXNlcyBhbGwgZmRzIGJ1dCBqdXN0IGluIGNhc2UKKyAgICAgICAgQUxPR1dfSUYoIW1SZWxlYXNlRmVuY2VGZHMuZW1wdHkoKSwgInJlbGVhc2UgZmVuY2VzIHdlcmUgbm90IG9idGFpbmVkLCBjbG9zaW5nIGZkcyIpOworICAgICAgICBmb3IgKGludCBmaWxkZXMgOiBtUmVsZWFzZUZlbmNlRmRzKSB7CisgICAgICAgICAgICA6OmNsb3NlKGZpbGRlcyk7CisgICAgICAgICAgICBUUkVTUEFTU19EQkcoKTsKKyAgICAgICAgfQorICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8R3JhcGhpY0J1ZmZlclNvdXJjZTo6Q2FjaGVkQnVmZmVyPiBtQnVmZmVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxHcmFwaGljQnVmZmVyU291cmNlOjpDYWNoZWRCdWZmZXI6OkFjcXVpcmFibGU+IG1BY3F1aXJhYmxlOworICAgIHNwPEZlbmNlPiBtQWNxdWlyZUZlbmNlOworICAgIFZlY3RvcjxpbnQ+IG1SZWxlYXNlRmVuY2VGZHM7CisgICAgYm9vbCBtR290UmVsZWFzZUZlbmNlczsKKyAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQWNxdWlyZWRCdWZmZXIgKik+IG1PblJlbGVhc2VkOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIHJlbGVhc2UgZmVuY2UgZnJvbSAwIG9yIG1vcmUgcmVsZWFzZSBmZW5jZSBmaWxlIGRlc2NyaXB0b3JzIGluIGZyb20KKyAgICAgKiB0aGUgc3BlY2lmaWVkIHJhbmdlIGluIHRoZSBhcnJheS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGFydCBzdGFydCBpbmRleAorICAgICAqIEBwYXJhbSBudW0gICBudW1iZXIgb2YgcmVsZWFzZSBmZHMgdG8gbWVyZ2UKKyAgICAgKi8KKyAgICBzcDxGZW5jZT4gZ2V0UmVsZWFzZUZlbmNlKHNpemVfdCBzdGFydCwgc2l6ZV90IG51bSkgY29uc3QgeworICAgICAgICBpZiAobnVtID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBGZW5jZTo6Tk9fRkVOQ0U7CisgICAgICAgIH0gZWxzZSBpZiAobnVtID09IDEpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRmVuY2UobVJlbGVhc2VGZW5jZUZkc1tzdGFydF0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIEZlbmNlOjptZXJnZSgiR0JTOjpBQiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlbGVhc2VGZW5jZShzdGFydCwgbnVtID4+IDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRSZWxlYXNlRmVuY2Uoc3RhcnQgKyAobnVtID4+IDEpLCBudW0gLSAobnVtID4+IDEpKSk7CisgICAgICAgIH0KKyAgICB9Cit9OworCitHcmFwaGljQnVmZmVyU291cmNlOjpHcmFwaGljQnVmZmVyU291cmNlKCkgOgorICAgIG1Jbml0Q2hlY2soVU5LTk9XTl9FUlJPUiksCisgICAgbU51bUF2YWlsYWJsZVVuYWNxdWlyZWRCdWZmZXJzKDApLAorICAgIG1OdW1PdXRzdGFuZGluZ0FjcXVpcmVzKDApLAorICAgIG1FbmRPZlN0cmVhbShmYWxzZSksCisgICAgbUVuZE9mU3RyZWFtU2VudChmYWxzZSksCisgICAgbUxhc3REYXRhc3BhY2UoSEFMX0RBVEFTUEFDRV9VTktOT1dOKSwKKyAgICBtRXhlY3V0aW5nKGZhbHNlKSwKKyAgICBtU3VzcGVuZGVkKGZhbHNlKSwKKyAgICBtTGFzdEZyYW1lVGltZXN0YW1wVXMoLTEpLAorICAgIG1TdG9wVGltZVVzKC0xKSwKKyAgICBtTGFzdEFjdGlvblRpbWVVcygtMWxsKSwKKyAgICBtU2tpcEZyYW1lc0JlZm9yZU5zKC0xbGwpLAorICAgIG1GcmFtZVJlcGVhdEludGVydmFsVXMoLTFsbCksCisgICAgbVJlcGVhdExhc3RGcmFtZUdlbmVyYXRpb24oMCksCisgICAgbU91dHN0YW5kaW5nRnJhbWVSZXBlYXRDb3VudCgwKSwKKyAgICBtRnJhbWVSZXBlYXRCbG9ja2VkT25Db2RlY0J1ZmZlcihmYWxzZSksCisgICAgbUZwcygtMS4wKSwKKyAgICBtQ2FwdHVyZUZwcygtMS4wKSwKKyAgICBtQmFzZUNhcHR1cmVVcygtMWxsKSwKKyAgICBtQmFzZUZyYW1lVXMoLTFsbCksCisgICAgbUZyYW1lQ291bnQoMCksCisgICAgbVByZXZDYXB0dXJlVXMoLTFsbCksCisgICAgbVByZXZGcmFtZVVzKC0xbGwpLAorICAgIG1JbnB1dEJ1ZmZlclRpbWVPZmZzZXRVcygwbGwpIHsKKyAgICBBTE9HVigiR3JhcGhpY0J1ZmZlclNvdXJjZSIpOworCisgICAgU3RyaW5nOCBuYW1lKCJHcmFwaGljQnVmZmVyU291cmNlIik7CisKKyAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJm1Qcm9kdWNlciwgJm1Db25zdW1lcik7CisgICAgbUNvbnN1bWVyLT5zZXRDb25zdW1lck5hbWUobmFtZSk7CisKKyAgICAvLyBOb3RlIHRoYXQgd2UgY2FuJ3QgY3JlYXRlIGFuIHNwPC4uLj4odGhpcykgaW4gYSBjdG9yIHRoYXQgd2lsbCBub3Qga2VlcCBhCisgICAgLy8gcmVmZXJlbmNlIG9uY2UgdGhlIGN0b3IgZW5kcywgYXMgdGhhdCB3b3VsZCBjYXVzZSB0aGUgcmVmY291bnQgb2YgJ3RoaXMnCisgICAgLy8gZHJvcHBpbmcgdG8gMCBhdCB0aGUgZW5kIG9mIHRoZSBjdG9yLiAgU2luY2UgYWxsIHdlIG5lZWQgaXMgYSB3cDwuLi4+CisgICAgLy8gdGhhdCdzIHdoYXQgd2UgY3JlYXRlLgorICAgIHdwPEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyPiBsaXN0ZW5lciA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxCdWZmZXJRdWV1ZTo6Q29uc3VtZXJMaXN0ZW5lcio+KHRoaXMpOworICAgIHNwPElDb25zdW1lckxpc3RlbmVyPiBwcm94eSA9CisgICAgICAgICAgICBuZXcgQnVmZmVyUXVldWU6OlByb3h5Q29uc3VtZXJMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICBtSW5pdENoZWNrID0gbUNvbnN1bWVyLT5jb25zdW1lckNvbm5lY3QocHJveHksIGZhbHNlKTsKKyAgICBpZiAobUluaXRDaGVjayAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRSgiRXJyb3IgY29ubmVjdGluZyB0byBCdWZmZXJRdWV1ZTogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgc3RyZXJyb3IoLW1Jbml0Q2hlY2spLCBtSW5pdENoZWNrKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1lbXNldCgmbURlZmF1bHRDb2xvckFzcGVjdHNQYWNrZWQsIDAsIHNpemVvZihtRGVmYXVsdENvbG9yQXNwZWN0c1BhY2tlZCkpOworCisgICAgQ0hFQ0sobUluaXRDaGVjayA9PSBOT19FUlJPUik7Cit9CisKK0dyYXBoaWNCdWZmZXJTb3VyY2U6On5HcmFwaGljQnVmZmVyU291cmNlKCkgeworICAgIEFMT0dWKCJ+R3JhcGhpY0J1ZmZlclNvdXJjZSIpOworICAgIHsKKyAgICAgICAgLy8gYWxsIGFjcXVpcmVkIGJ1ZmZlcnMgbXVzdCBiZSBmcmVlZCB3aXRoIHRoZSBtdXRleCBsb2NrZWQgb3RoZXJ3aXNlIG91ciBkZWJ1ZyBhc3NlcnRpb24KKyAgICAgICAgLy8gbWF5IHRyaWdnZXIKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisgICAgICAgIG1BdmFpbGFibGVCdWZmZXJzLmNsZWFyKCk7CisgICAgICAgIG1TdWJtaXR0ZWRDb2RlY0J1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgbUxhdGVzdEJ1ZmZlci5tQnVmZmVyLnJlc2V0KCk7CisgICAgfQorCisgICAgaWYgKG1OdW1PdXRzdGFuZGluZ0FjcXVpcmVzICE9IDApIHsKKyAgICAgICAgQUxPR1coInBvdGVudGlhbCBidWZmZXIgbGVhazogYWNxdWlyZWQ9JWQiLCBtTnVtT3V0c3RhbmRpbmdBY3F1aXJlcyk7CisgICAgICAgIFRSRVNQQVNTX0RCRygpOworICAgIH0KKyAgICBpZiAobUNvbnN1bWVyICE9IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUNvbnN1bWVyLT5jb25zdW1lckRpc2Nvbm5lY3QoKTsKKyAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR1coImNvbnN1bWVyRGlzY29ubmVjdCBmYWlsZWQ6ICVkIiwgZXJyKTsKKyAgICAgICAgfQorICAgIH0KK30KKworU3RhdHVzIEdyYXBoaWNCdWZmZXJTb3VyY2U6OnN0YXJ0KCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworICAgIEFMT0dWKCItLT4gc3RhcnQ7IGF2YWlsYWJsZT0lenUsIHN1Ym1pdHRhYmxlPSV6ZCIsCisgICAgICAgICAgICBtQXZhaWxhYmxlQnVmZmVycy5zaXplKCksIG1GcmVlQ29kZWNCdWZmZXJzLnNpemUoKSk7CisgICAgQ0hFQ0soIW1FeGVjdXRpbmcpOworICAgIG1FeGVjdXRpbmcgPSB0cnVlOworICAgIG1MYXN0RGF0YXNwYWNlID0gSEFMX0RBVEFTUEFDRV9VTktOT1dOOworICAgIEFMT0dWKCJjbGVhcmluZyBsYXN0IGRhdGFTcGFjZSIpOworCisgICAgLy8gU3RhcnQgYnkgbG9hZGluZyB1cCBhcyBtYW55IGJ1ZmZlcnMgYXMgcG9zc2libGUuICBXZSB3YW50IHRvIGRvIHRoaXMsCisgICAgLy8gcmF0aGVyIHRoYW4ganVzdCBzdWJtaXQgdGhlIGZpcnN0IGJ1ZmZlciwgdG8gYXZvaWQgYSBkZWdlbmVyYXRlIGNhc2U6CisgICAgLy8gaWYgYWxsIEJRIGJ1ZmZlcnMgYXJyaXZlIGJlZm9yZSB3ZSBzdGFydCBleGVjdXRpbmcsIGFuZCB3ZSBvbmx5IHN1Ym1pdAorICAgIC8vIG9uZSBoZXJlLCB0aGUgb3RoZXIgQlEgYnVmZmVycyB3aWxsIGp1c3Qgc2l0IHVudGlsIHdlIGdldCBub3RpZmllZAorICAgIC8vIHRoYXQgdGhlIGNvZGVjIGJ1ZmZlciBoYXMgYmVlbiByZWxlYXNlZC4gIFdlJ2QgdGhlbiBhY3F1aXJlIGFuZAorICAgIC8vIHN1Ym1pdCBhIHNpbmdsZSBhZGRpdGlvbmFsIGJ1ZmZlciwgcmVwZWF0ZWRseSwgbmV2ZXIgdXNpbmcgbW9yZSB0aGFuCisgICAgLy8gb25lIGNvZGVjIGJ1ZmZlciBzaW11bHRhbmVvdXNseS4gIChXZSBjb3VsZCBpbnN0ZWFkIHRyeSB0byBzdWJtaXQKKyAgICAvLyBhbGwgQlEgYnVmZmVycyB3aGVuZXZlciBhbnkgY29kZWMgYnVmZmVyIGlzIGZyZWVkLCBidXQgaWYgd2UgZ2V0IHRoZQorICAgIC8vIGluaXRpYWwgY29uZGl0aW9ucyByaWdodCB0aGF0IHdpbGwgbmV2ZXIgYmUgdXNlZnVsLikKKyAgICB3aGlsZSAoaGF2ZUF2YWlsYWJsZUJ1ZmZlcnNfbCgpKSB7CisgICAgICAgIGlmICghZmlsbENvZGVjQnVmZmVyX2woKSkgeworICAgICAgICAgICAgQUxPR1YoInN0b3AgbG9hZCB3aXRoIGF2YWlsYWJsZT0lenUrJWQiLAorICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlQnVmZmVycy5zaXplKCksIG1OdW1BdmFpbGFibGVVbmFjcXVpcmVkQnVmZmVycyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCJkb25lIGxvYWRpbmcgaW5pdGlhbCBmcmFtZXMsIGF2YWlsYWJsZT0lenUrJWQiLAorICAgICAgICAgICAgbUF2YWlsYWJsZUJ1ZmZlcnMuc2l6ZSgpLCBtTnVtQXZhaWxhYmxlVW5hY3F1aXJlZEJ1ZmZlcnMpOworCisgICAgLy8gSWYgRU9TIGhhcyBhbHJlYWR5IGJlZW4gc2lnbmFsZWQsIGFuZCB0aGVyZSBhcmUgbm8gbW9yZSBmcmFtZXMgdG8KKyAgICAvLyBzdWJtaXQsIHRyeSB0byBzZW5kIEVPUyBub3cgYXMgd2VsbC4KKyAgICBpZiAobVN0b3BUaW1lVXMgPT0gLTEgJiYgbUVuZE9mU3RyZWFtICYmICFoYXZlQXZhaWxhYmxlQnVmZmVyc19sKCkpIHsKKyAgICAgICAgc3VibWl0RW5kT2ZJbnB1dFN0cmVhbV9sKCk7CisgICAgfQorCisgICAgaWYgKG1GcmFtZVJlcGVhdEludGVydmFsVXMgPiAwbGwgJiYgbUxvb3BlciA9PSBOVUxMKSB7CisgICAgICAgIG1SZWZsZWN0b3IgPSBuZXcgQUhhbmRsZXJSZWZsZWN0b3I8R3JhcGhpY0J1ZmZlclNvdXJjZT4odGhpcyk7CisKKyAgICAgICAgbUxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgICAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobVJlZmxlY3Rvcik7CisgICAgICAgIG1Mb29wZXItPnN0YXJ0KCk7CisKKyAgICAgICAgaWYgKG1MYXRlc3RCdWZmZXIubUJ1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBxdWV1ZUZyYW1lUmVwZWF0X2woKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBHcmFwaGljQnVmZmVyU291cmNlOjpzdG9wKCkgeworICAgIEFMT0dWKCJzdG9wIik7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKworICAgIGlmIChtRXhlY3V0aW5nKSB7CisgICAgICAgIC8vIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlIHRyYW5zaXRpb24gZnJvbSBleGVjdXRpbmctPmlkbGUsCisgICAgICAgIC8vIG5vdCBsb2FkZWQtPmlkbGUuCisgICAgICAgIG1FeGVjdXRpbmcgPSBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIEdyYXBoaWNCdWZmZXJTb3VyY2U6OnJlbGVhc2UoKXsKKyAgICBzcDxBTG9vcGVyPiBsb29wZXI7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKyAgICAgICAgbG9vcGVyID0gbUxvb3BlcjsKKyAgICAgICAgaWYgKG1Mb29wZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgbUxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIobVJlZmxlY3Rvci0+aWQoKSk7CisgICAgICAgICAgICBtUmVmbGVjdG9yLmNsZWFyKCk7CisKKyAgICAgICAgICAgIG1Mb29wZXIuY2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCItLT4gcmVsZWFzZTsgYXZhaWxhYmxlPSV6dSslZCBlb3M9JWQgZW9zU2VudD0lZCBhY3F1aXJlZD0lZCIsCisgICAgICAgICAgICAgICAgbUF2YWlsYWJsZUJ1ZmZlcnMuc2l6ZSgpLCBtTnVtQXZhaWxhYmxlVW5hY3F1aXJlZEJ1ZmZlcnMsCisgICAgICAgICAgICAgICAgbUVuZE9mU3RyZWFtLCBtRW5kT2ZTdHJlYW1TZW50LCBtTnVtT3V0c3RhbmRpbmdBY3F1aXJlcyk7CisKKyAgICAgICAgLy8gQ29kZWMgaXMgbm8gbG9uZ2VyIGV4ZWN1dGluZy4gIFJlbGVhc2luZyBhbGwgYnVmZmVycyB0byBicS4KKyAgICAgICAgbUZyZWVDb2RlY0J1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgbVN1Ym1pdHRlZENvZGVjQnVmZmVycy5jbGVhcigpOworICAgICAgICBtTGF0ZXN0QnVmZmVyLm1CdWZmZXIucmVzZXQoKTsKKyAgICAgICAgbUNvbXBvbmVudC5jbGVhcigpOworICAgICAgICBtRXhlY3V0aW5nID0gZmFsc2U7CisgICAgfQorICAgIGlmIChsb29wZXIgIT0gTlVMTCkgeworICAgICAgICBsb29wZXItPnN0b3AoKTsKKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIEdyYXBoaWNCdWZmZXJTb3VyY2U6Om9uSW5wdXRCdWZmZXJBZGRlZChjb2RlY19idWZmZXJfaWQgYnVmZmVySWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKworICAgIGlmIChtRXhlY3V0aW5nKSB7CisgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiAtLSBidWZmZXJzIGNhbiBvbmx5IGJlIGFsbG9jYXRlZCB3aGVuCisgICAgICAgIC8vIHRyYW5zaXRpb25pbmcgZnJvbSAibG9hZGVkIiB0byAiaWRsZSIuCisgICAgICAgIEFMT0dFKCJhZGRDb2RlY0J1ZmZlcjogYnVmZmVyIGFkZGVkIHdoaWxlIGV4ZWN1dGluZyIpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoSU5WQUxJRF9PUEVSQVRJT04pOworICAgIH0KKworICAgIEFMT0dWKCJhZGRDb2RlY0J1ZmZlcjogYnVmZmVySWQ9JXUiLCBidWZmZXJJZCk7CisKKyAgICBtRnJlZUNvZGVjQnVmZmVycy5wdXNoX2JhY2soYnVmZmVySWQpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBHcmFwaGljQnVmZmVyU291cmNlOjpvbklucHV0QnVmZmVyRW1wdGllZChjb2RlY19idWZmZXJfaWQgYnVmZmVySWQsIGludCBmZW5jZUZkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisgICAgRmlsZURlc2NyaXB0b3I6OkF1dG9jbG9zZSBmZW5jZShmZW5jZUZkKTsKKworICAgIHNzaXplX3QgY2JpID0gbVN1Ym1pdHRlZENvZGVjQnVmZmVycy5pbmRleE9mS2V5KGJ1ZmZlcklkKTsKKyAgICBpZiAoY2JpIDwgMCkgeworICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uCisgICAgICAgIEFMT0dFKCJvbklucHV0QnVmZmVyRW1wdGllZDogYnVmZmVyIG5vdCByZWNvZ25pemVkIChidWZmZXJJZD0ldSkiLCBidWZmZXJJZCk7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihCQURfVkFMVUUpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxBY3F1aXJlZEJ1ZmZlcj4gYnVmZmVyID0gbVN1Ym1pdHRlZENvZGVjQnVmZmVycy52YWx1ZUF0KGNiaSk7CisKKyAgICAvLyBNb3ZlIGJ1ZmZlciB0byBhdmFpbGFibGUgYnVmZmVycworICAgIG1TdWJtaXR0ZWRDb2RlY0J1ZmZlcnMucmVtb3ZlSXRlbXNBdChjYmkpOworICAgIG1GcmVlQ29kZWNCdWZmZXJzLnB1c2hfYmFjayhidWZmZXJJZCk7CisKKyAgICAvLyBoZWFkZXItPm5GaWxsZWRMZW4gbWF5IG5vdCBiZSB0aGUgb3JpZ2luYWwgdmFsdWUsIHNvIHdlIGNhbid0IGNvbXBhcmUKKyAgICAvLyB0aGF0IHRvIHplcm8gdG8gc2VlIG9mIHRoaXMgd2FzIHRoZSBFT1MgYnVmZmVyLiAgSW5zdGVhZCB3ZSBqdXN0CisgICAgLy8gc2VlIGlmIHRoZXJlIGlzIGEgbnVsbCBBY3F1aXJlZEJ1ZmZlciwgd2hpY2ggc2hvdWxkIG9ubHkgZXZlciBoYXBwZW4gZm9yIEVPUy4KKyAgICBpZiAoYnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKCEobUVuZE9mU3RyZWFtICYmIG1FbmRPZlN0cmVhbVNlbnQpKSB7CisgICAgICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gd2hlbiBicm9rZW4gY29kZSBzZW5kcyB1cyB0aGUgc2FtZSBidWZmZXIgdHdpY2UgaW4gYSByb3cuCisgICAgICAgICAgICBBTE9HRSgib25JbnB1dEJ1ZmZlckVtcHRpZWQ6IG5vbi1FT1MgbnVsbCBidWZmZXIgKGJ1ZmZlcklkPSV1KSIsIGJ1ZmZlcklkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dWKCJvbklucHV0QnVmZmVyRW1wdGllZDogRU9TIG51bGwgYnVmZmVyIChidWZmZXJJZD0ldUAlemQpIiwgYnVmZmVySWQsIGNiaSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gTm8gR3JhcGhpY0J1ZmZlciB0byBkZWFsIHdpdGgsIG5vIGFkZGl0aW9uYWwgaW5wdXQgb3Igb3V0cHV0IGlzIGV4cGVjdGVkLCBzbyBqdXN0IHJldHVybi4KKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKEJBRF9WQUxVRSk7CisgICAgfQorCisgICAgaWYgKCFtRXhlY3V0aW5nKSB7CisgICAgICAgIC8vIHRoaXMgaXMgZmluZSBzaW5jZSB0aGlzIGNvdWxkIGhhcHBlbiB3aGVuIGdvaW5nIGZyb20gSWRsZSB0byBMb2FkZWQKKyAgICAgICAgQUxPR1YoIm9uSW5wdXRCdWZmZXJFbXB0aWVkOiBubyBsb25nZXIgZXhlY3V0aW5nIChidWZmZXJJZD0ldUAlemQpIiwgYnVmZmVySWQsIGNiaSk7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihPSyk7CisgICAgfQorCisgICAgQUxPR1YoIm9uSW5wdXRCdWZmZXJFbXB0aWVkOiBidWZmZXJJZD0lZEAlemQgW3Nsb3Q9JWQsIHVzZUNvdW50PSVsZCwgaGFuZGxlPSVwXSBhY3F1aXJlZD0lZCIsCisgICAgICAgICAgICBidWZmZXJJZCwgY2JpLCBidWZmZXItPmdldFNsb3QoKSwgYnVmZmVyLnVzZV9jb3VudCgpLCBidWZmZXItPmdldEdyYXBoaWNCdWZmZXIoKS0+aGFuZGxlLAorICAgICAgICAgICAgbU51bU91dHN0YW5kaW5nQWNxdWlyZXMpOworCisgICAgYnVmZmVyLT5hZGRSZWxlYXNlRmVuY2VGZChmZW5jZS5yZWxlYXNlKCkpOworICAgIC8vIHJlbGVhc2UgY29kZWMgcmVmZXJlbmNlIGZvciB2aWRlbyBidWZmZXIganVzdCBpbiBjYXNlIHJlbW92ZSBkb2VzIG5vdCBpdAorICAgIGJ1ZmZlci5yZXNldCgpOworCisgICAgaWYgKGhhdmVBdmFpbGFibGVCdWZmZXJzX2woKSkgeworICAgICAgICAvLyBGaWxsIHRoaXMgY29kZWMgYnVmZmVyLgorICAgICAgICBDSEVDSyghbUVuZE9mU3RyZWFtU2VudCk7CisgICAgICAgIEFMT0dWKCJvbklucHV0QnVmZmVyRW1wdGllZDogYnVmZmVyIGZyZWVkLCBmZWVkaW5nIGNvZGVjIChhdmFpbGFibGU9JXp1KyVkLCBlb3M9JWQpIiwKKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlQnVmZmVycy5zaXplKCksIG1OdW1BdmFpbGFibGVVbmFjcXVpcmVkQnVmZmVycywgbUVuZE9mU3RyZWFtKTsKKyAgICAgICAgZmlsbENvZGVjQnVmZmVyX2woKTsKKyAgICB9IGVsc2UgaWYgKG1FbmRPZlN0cmVhbSAmJiBtU3RvcFRpbWVVcyA9PSAtMSkgeworICAgICAgICAvLyBObyBmcmFtZXMgYXZhaWxhYmxlLCBidXQgRU9TIGlzIHBlbmRpbmcgYW5kIG5vIHN0b3AgdGltZSwgc28gdXNlIHRoaXMgYnVmZmVyIHRvCisgICAgICAgIC8vIHNlbmQgdGhhdC4KKyAgICAgICAgQUxPR1YoIm9uSW5wdXRCdWZmZXJFbXB0aWVkOiBidWZmZXIgZnJlZWQsIHN1Ym1pdHRpbmcgRU9TIik7CisgICAgICAgIHN1Ym1pdEVuZE9mSW5wdXRTdHJlYW1fbCgpOworICAgIH0gZWxzZSBpZiAobUZyYW1lUmVwZWF0QmxvY2tlZE9uQ29kZWNCdWZmZXIpIHsKKyAgICAgICAgYm9vbCBzdWNjZXNzID0gcmVwZWF0TGF0ZXN0QnVmZmVyX2woKTsKKyAgICAgICAgQUxPR1YoIm9uSW5wdXRCdWZmZXJFbXB0aWVkOiBjb21wbGV0aW5nIGRlZmVycmVkIHJlcGVhdExhdGVzdEJ1ZmZlcl9sICVzIiwKKyAgICAgICAgICAgICAgICBzdWNjZXNzID8gIlNVQ0NFU1MiIDogIkZBSUxVUkUiKTsKKyAgICAgICAgbUZyYW1lUmVwZWF0QmxvY2tlZE9uQ29kZWNCdWZmZXIgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvLyByZWxlYXNlUmVsZWFzYWJsZUJ1ZmZlcnNfbCgpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK3ZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6b25EYXRhc3BhY2VDaGFuZ2VkX2woCisgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFzcGFjZSwgYW5kcm9pZF9waXhlbF9mb3JtYXQgcGl4ZWxGb3JtYXQpIHsKKyAgICBBTE9HRCgiZ290IGJ1ZmZlciB3aXRoIG5ldyBkYXRhU3BhY2UgIyV4IiwgZGF0YXNwYWNlKTsKKyAgICBtTGFzdERhdGFzcGFjZSA9IGRhdGFzcGFjZTsKKworICAgIGlmIChDb2xvclV0aWxzOjpjb252ZXJ0RGF0YVNwYWNlVG9WMChkYXRhc3BhY2UpKSB7CisgICAgICAgIG1Db21wb25lbnQtPmRpc3BhdGNoRGF0YVNwYWNlQ2hhbmdlZCgKKyAgICAgICAgICAgICAgICBtTGFzdERhdGFzcGFjZSwgbURlZmF1bHRDb2xvckFzcGVjdHNQYWNrZWQsIHBpeGVsRm9ybWF0KTsKKyAgICB9Cit9CisKK2Jvb2wgR3JhcGhpY0J1ZmZlclNvdXJjZTo6ZmlsbENvZGVjQnVmZmVyX2woKSB7CisgICAgQ0hFQ0sobUV4ZWN1dGluZyAmJiBoYXZlQXZhaWxhYmxlQnVmZmVyc19sKCkpOworCisgICAgaWYgKG1GcmVlQ29kZWNCdWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgLy8gTm8gYnVmZmVycyBhdmFpbGFibGUsIGJhaWwuCisgICAgICAgIEFMT0dWKCJmaWxsQ29kZWNCdWZmZXJfbDogbm8gY29kZWMgYnVmZmVycywgYXZhaWxhYmxlPSV6dSslZCIsCisgICAgICAgICAgICAgICAgbUF2YWlsYWJsZUJ1ZmZlcnMuc2l6ZSgpLCBtTnVtQXZhaWxhYmxlVW5hY3F1aXJlZEJ1ZmZlcnMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgVmlkZW9CdWZmZXIgaXRlbTsKKyAgICBpZiAobUF2YWlsYWJsZUJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICBBTE9HVigiZmlsbENvZGVjQnVmZmVyX2w6IGFjcXVpcmluZyBhdmFpbGFibGUgYnVmZmVyLCBhdmFpbGFibGU9JXp1KyVkIiwKKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlQnVmZmVycy5zaXplKCksIG1OdW1BdmFpbGFibGVVbmFjcXVpcmVkQnVmZmVycyk7CisgICAgICAgIGlmIChhY3F1aXJlQnVmZmVyX2woJml0ZW0pICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiZmlsbENvZGVjQnVmZmVyX2w6IGZhaWxlZCB0byBhY3F1aXJlIGF2YWlsYWJsZSBidWZmZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJmaWxsQ29kZWNCdWZmZXJfbDogZ2V0dGluZyBhdmFpbGFibGUgYnVmZmVyLCBhdmFpbGFibGU9JXp1KyVkIiwKKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlQnVmZmVycy5zaXplKCksIG1OdW1BdmFpbGFibGVVbmFjcXVpcmVkQnVmZmVycyk7CisgICAgICAgIGl0ZW0gPSAqbUF2YWlsYWJsZUJ1ZmZlcnMuYmVnaW4oKTsKKyAgICAgICAgbUF2YWlsYWJsZUJ1ZmZlcnMuZXJhc2UobUF2YWlsYWJsZUJ1ZmZlcnMuYmVnaW4oKSk7CisgICAgfQorCisgICAgaW50NjRfdCBpdGVtVGltZVVzID0gaXRlbS5tVGltZXN0YW1wTnMgLyAxMDAwOworCisgICAgLy8gUHJvY2VzcyBBY3Rpb25JdGVtIGluIHRoZSBRdWV1ZSBpZiB0aGVyZSBpcyBhbnkuIElmIGEgYnVmZmVyJ3MgdGltZXN0YW1wCisgICAgLy8gaXMgc21hbGxlciB0aGFuIHRoZSBmaXJzdCBhY3Rpb24ncyB0aW1lc3RhbXAsIG5vIGFjdGlvbiBuZWVkIHRvIGJlIHBlcmZvcm1lZC4KKyAgICAvLyBJZiBidWZmZXIncyB0aW1lc3RhbXAgaXMgbGFyZ2VyIG9yIGVxdWFsIHRoYW4gdGhlIGxhc3QgYWN0aW9uJ3MgdGltZXN0YW1wLAorICAgIC8vIG9ubHkgdGhlIGxhc3QgYWN0aW9uIG5lZWRzIHRvIGJlIHBlcmZvcm1lZCBhcyBhbGwgdGhlIGFjaXRpb25zIGJlZm9yZSB0aGUKKyAgICAvLyB0aGUgYWN0aW9uIGFyZSBvdmVycmlkZGVuIGJ5IHRoZSBsYXN0IGFjdGlvbi4gRm9yIHRoZSBvdGhlciBjYXNlcywgdHJhdmVyc2UKKyAgICAvLyB0aGUgUXVldWUgdG8gZmluZCB0aGUgbmV3ZXN0IGFjdGlvbiB0aGF0IHdpdGggdGltZXN0YW1wIHNtYWxsZXIgb3IgZXF1YWwgdG8KKyAgICAvLyB0aGUgYnVmZmVyJ3MgdGltZXN0YW1wLiBGb3IgZXhhbXBsZSwgYW4gYWN0aW9uIHF1ZXVlIGxpa2UKKyAgICAvLyBbcGF1c2UgMXVzXSwgW3Jlc3VtZSAydXNdLCBbcGF1c2UgM3VzXSwgW3Jlc3VtZSA0dXNdLCBbcGF1c2UgNXVzXS4uLi4gVXBvbgorICAgIC8vIHJlY2VpdmluZyBhIGJ1ZmZlciB3aXRoIHRpbWVzdGFtcCAzLjV1cywgb25seSB0aGUgYWN0aW9uIFtwYXVzZSwgM3VzXSBuZWVkcworICAgIC8vIHRvIGJlIGhhbmRsZWQgYW5kIFtwYXVzZSwgMXVzXSwgW3Jlc3VtZSAydXNdIHdpbGwgYmUgZGlzY2FyZGVkLgorICAgIGJvb2wgZG9uZSA9IGZhbHNlOworICAgIGJvb2wgc2VlU3RvcEFjdGlvbiA9IGZhbHNlOworICAgIGlmICghbUFjdGlvblF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgLy8gRmlyc3Qgc2NhbiB0byBjaGVjayBpZiBidWZmZXJUaW1lc3RhbXAgaXMgc21hbGxlciB0aGFuIGZpcnN0IGFjdGlvbidzIHRpbWVzdGFtcC4KKyAgICAgICAgQWN0aW9uSXRlbSBuZXh0QWN0aW9uID0gKihtQWN0aW9uUXVldWUuYmVnaW4oKSk7CisgICAgICAgIGlmIChpdGVtVGltZVVzIDwgbmV4dEFjdGlvbi5tQWN0aW9uVGltZVVzKSB7CisgICAgICAgICAgICBBTE9HVigiTm8gYWN0aW9uLiBidWZmZXIgdGltZXN0YW1wICVsbGQgdXMgPCBhY3Rpb24gdGltZXN0YW1wOiAlbGxkIHVzIiwKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKWl0ZW1UaW1lVXMsIChsb25nIGxvbmcpbmV4dEFjdGlvbi5tQWN0aW9uVGltZVVzKTsKKyAgICAgICAgICAgIC8vIEFsbCB0aGUgYWN0aW9ucyBhcmUgYWhlYWQuIE5vIGFjdGlvbiBuZWVkIHRvIHBlcmZvcm0gbm93LgorICAgICAgICAgICAgLy8gUmVsZWFzZSB0aGUgYnVmZmVyIGlmIGlzIGluIHN1c3BlbmRlZCBzdGF0ZSwgb3IgcHJvY2VzcyB0aGUgYnVmZmVyCisgICAgICAgICAgICAvLyBpZiBub3QgaW4gc3VzcGVuZGVkIHN0YXRlLgorICAgICAgICAgICAgZG9uZSA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWRvbmUpIHsKKyAgICAgICAgICAgIC8vIEZpbmQgdGhlIG5ld2VzdCBhY3Rpb24gdGhhdCB3aXRoIHRpbWVzdGFtcCBzbWFsbGVyIHRoYW4gaXRlbVRpbWVVcy4gVGhlbgorICAgICAgICAgICAgLy8gcmVtb3ZlIGFsbCB0aGUgYWN0aW9ucyBiZWZvcmUgYW5kIGluY2x1ZGUgdGhlIG5ld2VzdCBhY3Rpb24uCisgICAgICAgICAgICBMaXN0PEFjdGlvbkl0ZW0+OjppdGVyYXRvciBpdCA9IG1BY3Rpb25RdWV1ZS5iZWdpbigpOworICAgICAgICAgICAgd2hpbGUgKGl0ICE9IG1BY3Rpb25RdWV1ZS5lbmQoKSAmJiBpdC0+bUFjdGlvblRpbWVVcyA8PSBpdGVtVGltZVVzCisgICAgICAgICAgICAgICAgICAgICYmIG5leHRBY3Rpb24ubUFjdGlvbiAhPSBBY3Rpb25JdGVtOjpTVE9QKSB7CisgICAgICAgICAgICAgICAgbmV4dEFjdGlvbiA9ICppdDsKKyAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUFjdGlvblF1ZXVlLmVyYXNlKG1BY3Rpb25RdWV1ZS5iZWdpbigpLCBpdCk7CisKKyAgICAgICAgICAgIENIRUNLKGl0ZW1UaW1lVXMgPj0gbmV4dEFjdGlvbi5tQWN0aW9uVGltZVVzKTsKKyAgICAgICAgICAgIHN3aXRjaCAobmV4dEFjdGlvbi5tQWN0aW9uKSB7CisgICAgICAgICAgICAgICAgY2FzZSBBY3Rpb25JdGVtOjpQQVVTRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1TdXNwZW5kZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiUlVOTklORy9QQVVTRSAtPiBQQVVTRSBhdCBidWZmZXIgJWxsZCB1cyAgUEFVU0UgVGltZTogJWxsZCB1cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylpdGVtVGltZVVzLCAobG9uZyBsb25nKW5leHRBY3Rpb24ubUFjdGlvblRpbWVVcyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIEFjdGlvbkl0ZW06OlJFU1VNRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1TdXNwZW5kZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlBBVVNFL1JVTk5JTkcgLT4gUlVOTklORyBhdCBidWZmZXIgJWxsZCB1cyAgUkVTVU1FIFRpbWU6ICVsbGQgdXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpaXRlbVRpbWVVcywgKGxvbmcgbG9uZyluZXh0QWN0aW9uLm1BY3Rpb25UaW1lVXMpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBBY3Rpb25JdGVtOjpTVE9QOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlJVTk5JTkcvUEFVU0UgLT4gU1RPUCBhdCBidWZmZXIgJWxsZCB1cyAgU1RPUCBUaW1lOiAlbGxkIHVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWl0ZW1UaW1lVXMsIChsb25nIGxvbmcpbmV4dEFjdGlvbi5tQWN0aW9uVGltZVVzKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIHdob2xlIEFjdGlvblF1ZXVlIGFzIHJlY29yZGluZyBpcyBkb25lCisgICAgICAgICAgICAgICAgICAgIG1BY3Rpb25RdWV1ZS5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICBzZWVTdG9wQWN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIFRSRVNQQVNTX0RCRygiVW5rbm93biBhY3Rpb24gdHlwZSIpOworICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gdHJ1ZSBoZXJlIGJlY2F1c2Ugd2UgZGlkIGNvbnN1bWUgYW4gYXZhaWxhYmxlIGJ1ZmZlciwgc28gdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIGxvb3AgaW4gc3RhcnQgd2lsbCBldmVudHVhbGx5IHRlcm1pbmF0ZSBldmVuIGlmIHdlIGhpdCB0aGlzLgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc2VlU3RvcEFjdGlvbikgeworICAgICAgICAvLyBDbGVhciBhbGwgdGhlIGJ1ZmZlcnMgYmVmb3JlIHNldHRpbmcgbUVuZE9mU3RyZWFtIGFuZCBzaWduYWwgRW5kT2ZJbnB1dFN0cmVhbS4KKyAgICAgICAgcmVsZWFzZUFsbEF2YWlsYWJsZUJ1ZmZlcnNfbCgpOworICAgICAgICBtRW5kT2ZTdHJlYW0gPSB0cnVlOworICAgICAgICBzdWJtaXRFbmRPZklucHV0U3RyZWFtX2woKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKG1TdXNwZW5kZWQpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaW50IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICAvLyBvbmx5IHN1Ym1pdCBzYW1wbGUgaWYgc3RhcnQgdGltZSBpcyB1bnNwZWNpZmllZCwgb3Igc2FtcGxlCisgICAgLy8gaXMgcXVldWVkIGFmdGVyIHRoZSBzcGVjaWZpZWQgc3RhcnQgdGltZQorICAgIGlmIChtU2tpcEZyYW1lc0JlZm9yZU5zIDwgMGxsIHx8IGl0ZW0ubVRpbWVzdGFtcE5zID49IG1Ta2lwRnJhbWVzQmVmb3JlTnMpIHsKKyAgICAgICAgLy8gaWYgc3RhcnQgdGltZSBpcyBzZXQsIG9mZnNldCB0aW1lIHN0YW1wIGJ5IHN0YXJ0IHRpbWUKKyAgICAgICAgaWYgKG1Ta2lwRnJhbWVzQmVmb3JlTnMgPiAwKSB7CisgICAgICAgICAgICBpdGVtLm1UaW1lc3RhbXBOcyAtPSBtU2tpcEZyYW1lc0JlZm9yZU5zOworICAgICAgICB9CisKKyAgICAgICAgaW50NjRfdCB0aW1lVXMgPSBpdGVtLm1UaW1lc3RhbXBOcyAvIDEwMDA7CisgICAgICAgIGlmIChtRnJhbWVEcm9wcGVyICE9IE5VTEwgJiYgbUZyYW1lRHJvcHBlci0+c2hvdWxkRHJvcCh0aW1lVXMpKSB7CisgICAgICAgICAgICBBTE9HVigic2tpcHBpbmcgZnJhbWUgKCVsbGQpIHRvIG1lZXQgbWF4IGZyYW1lcmF0ZSIsIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4odGltZVVzKSk7CisgICAgICAgICAgICAvLyBzZXQgZXJyIHRvIE9LIHNvIHRoYXQgdGhlIHNraXBwZWQgZnJhbWUgY2FuIHN0aWxsIGJlIHNhdmVkIGFzIHRoZSBsYXN0ZXN0IGZyYW1lCisgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVyciA9IHN1Ym1pdEJ1ZmZlcl9sKGl0ZW0pOyAvLyB0aGlzIHRha2VzIHNoYXJlZCBvd25lcnNoaXAgb2YgdGhlIGFjcXVpcmVkIGJ1ZmZlciBvbiBzdWNjZWVzcworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HVigic3VibWl0QnVmZmVyX2wgZmFpbGVkLCB3aWxsIHJlbGVhc2UgYnEgc2xvdCAlZCIsIGl0ZW0ubUJ1ZmZlci0+Z2V0U2xvdCgpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRG9uJ3Qgc2V0IHRoZSBsYXN0IGJ1ZmZlciBpZCBpZiB3ZSdyZSBub3QgcmVwZWF0aW5nLAorICAgICAgICAvLyB3ZSdsbCBiZSBob2xkaW5nIG9uIHRvIHRoZSBsYXN0IGJ1ZmZlciBmb3Igbm90aGluZy4KKyAgICAgICAgaWYgKG1GcmFtZVJlcGVhdEludGVydmFsVXMgPiAwbGwpIHsKKyAgICAgICAgICAgIHNldExhdGVzdEJ1ZmZlcl9sKGl0ZW0pOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJidWZmZXIgc3VibWl0dGVkIFtzbG90PSVkLCB1c2VDb3VudD0lbGRdIGFjcXVpcmVkPSVkIiwKKyAgICAgICAgICAgICAgICBpdGVtLm1CdWZmZXItPmdldFNsb3QoKSwgaXRlbS5tQnVmZmVyLnVzZV9jb3VudCgpLCBtTnVtT3V0c3RhbmRpbmdBY3F1aXJlcyk7CisgICAgICAgIG1MYXN0RnJhbWVUaW1lc3RhbXBVcyA9IGl0ZW1UaW1lVXM7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgR3JhcGhpY0J1ZmZlclNvdXJjZTo6cmVwZWF0TGF0ZXN0QnVmZmVyX2woKSB7CisgICAgQ0hFQ0sobUV4ZWN1dGluZyAmJiAhaGF2ZUF2YWlsYWJsZUJ1ZmZlcnNfbCgpKTsKKworICAgIGlmIChtTGF0ZXN0QnVmZmVyLm1CdWZmZXIgPT0gbnVsbHB0ciB8fCBtU3VzcGVuZGVkKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAobUZyZWVDb2RlY0J1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICAvLyBObyBidWZmZXJzIGF2YWlsYWJsZSwgYmFpbC4KKyAgICAgICAgQUxPR1YoInJlcGVhdExhdGVzdEJ1ZmZlcl9sOiBubyBjb2RlYyBidWZmZXJzLiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFtTGF0ZXN0QnVmZmVyLm1CdWZmZXItPmlzQ2FjaGVkKCkpIHsKKyAgICAgICAgQUxPR1YoInJlcGVhdExhdGVzdEJ1ZmZlcl9sOiBzbG90IHdhcyBkaXNjYXJkZWQsIGJ1dCByZXBlYXRpbmcgb3VyIG93biByZWZlcmVuY2UiKTsKKyAgICB9CisKKyAgICAvLyBpdCBpcyBvayB0byB1cGRhdGUgdGhlIHRpbWVzdGFtcCBvZiBsYXRlc3QgYnVmZmVyIGFzIGl0IGlzIG9ubHkgdXNlZCBmb3Igc3VibWlzc2lvbgorICAgIHN0YXR1c190IGVyciA9IHN1Ym1pdEJ1ZmZlcl9sKG1MYXRlc3RCdWZmZXIpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qIHJlcGVhdCBsYXN0IGZyYW1lIHVwIHRvIGtSZXBlYXRMYXN0RnJhbWVDb3VudCB0aW1lcy4KKyAgICAgKiBpbiBjYXNlIG9mIHN0YXRpYyBzY2VuZSwgYSBzaW5nbGUgcmVwZWF0IG1pZ2h0IG5vdCBnZXQgcmlkIG9mIGVuY29kZXIKKyAgICAgKiBnaG9zdGluZyBjb21wbGV0ZWx5LCByZWZyZXNoIGEgY291cGxlIG1vcmUgdGltZXMgdG8gZ2V0IGJldHRlciBxdWFsaXR5CisgICAgICovCisgICAgaWYgKC0tbU91dHN0YW5kaW5nRnJhbWVSZXBlYXRDb3VudCA+IDApIHsKKyAgICAgICAgLy8gc2V0IHVwIHRpbWVzdGFtcCBmb3IgcmVwZWF0IGZyYW1lCisgICAgICAgIG1MYXRlc3RCdWZmZXIubVRpbWVzdGFtcE5zICs9IG1GcmFtZVJlcGVhdEludGVydmFsVXMgKiAxMDAwOworICAgICAgICBxdWV1ZUZyYW1lUmVwZWF0X2woKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBHcmFwaGljQnVmZmVyU291cmNlOjpzZXRMYXRlc3RCdWZmZXJfbChjb25zdCBWaWRlb0J1ZmZlciAmaXRlbSkgeworICAgIG1MYXRlc3RCdWZmZXIgPSBpdGVtOworCisgICAgQUxPR1YoInNldExhdGVzdEJ1ZmZlcl9sOiBbc2xvdD0lZCwgdXNlQ291bnQ9JWxkXSIsCisgICAgICAgICAgICBtTGF0ZXN0QnVmZmVyLm1CdWZmZXItPmdldFNsb3QoKSwgbUxhdGVzdEJ1ZmZlci5tQnVmZmVyLnVzZV9jb3VudCgpKTsKKworICAgIG1PdXRzdGFuZGluZ0ZyYW1lUmVwZWF0Q291bnQgPSBrUmVwZWF0TGFzdEZyYW1lQ291bnQ7CisgICAgLy8gc2V0IHVwIHRpbWVzdGFtcCBmb3IgcmVwZWF0IGZyYW1lCisgICAgbUxhdGVzdEJ1ZmZlci5tVGltZXN0YW1wTnMgKz0gbUZyYW1lUmVwZWF0SW50ZXJ2YWxVcyAqIDEwMDA7CisgICAgcXVldWVGcmFtZVJlcGVhdF9sKCk7Cit9CisKK3ZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6cXVldWVGcmFtZVJlcGVhdF9sKCkgeworICAgIG1GcmFtZVJlcGVhdEJsb2NrZWRPbkNvZGVjQnVmZmVyID0gZmFsc2U7CisKKyAgICBpZiAobVJlZmxlY3RvciAhPSBOVUxMKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZXBlYXRMYXN0RnJhbWUsIG1SZWZsZWN0b3IpOworICAgICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgKyttUmVwZWF0TGFzdEZyYW1lR2VuZXJhdGlvbik7CisgICAgICAgIG1zZy0+cG9zdChtRnJhbWVSZXBlYXRJbnRlcnZhbFVzKTsKKyAgICB9Cit9CisKK2Jvb2wgR3JhcGhpY0J1ZmZlclNvdXJjZTo6Y2FsY3VsYXRlQ29kZWNUaW1lc3RhbXBfbCgKKyAgICAgICAgbnNlY3NfdCBidWZmZXJUaW1lTnMsIGludDY0X3QgKmNvZGVjVGltZVVzKSB7CisgICAgaW50NjRfdCB0aW1lVXMgPSBidWZmZXJUaW1lTnMgLyAxMDAwOworICAgIHRpbWVVcyArPSBtSW5wdXRCdWZmZXJUaW1lT2Zmc2V0VXM7CisKKyAgICBpZiAobUNhcHR1cmVGcHMgPiAwLgorICAgICAgICAgICAgJiYgKG1GcHMgPiAyICogbUNhcHR1cmVGcHMKKyAgICAgICAgICAgIHx8IG1DYXB0dXJlRnBzID4gMiAqIG1GcHMpKSB7CisgICAgICAgIC8vIFRpbWUgbGFwc2Ugb3Igc2xvdyBtb3Rpb24gbW9kZQorICAgICAgICBpZiAobVByZXZDYXB0dXJlVXMgPCAwbGwpIHsKKyAgICAgICAgICAgIC8vIGZpcnN0IGNhcHR1cmUKKyAgICAgICAgICAgIG1QcmV2Q2FwdHVyZVVzID0gbUJhc2VDYXB0dXJlVXMgPSB0aW1lVXM7CisgICAgICAgICAgICAvLyBhZGp1c3QgdGhlIGZpcnN0IHNhbXBsZSB0aW1lc3RhbXAuCisgICAgICAgICAgICBtUHJldkZyYW1lVXMgPSBtQmFzZUZyYW1lVXMgPQorICAgICAgICAgICAgICAgICAgICBzdGQ6Omxscm91bmQoKHRpbWVVcyAqIG1DYXB0dXJlRnBzKSAvIG1GcHMpOworICAgICAgICAgICAgbUZyYW1lQ291bnQgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gc25hcCB0byBuZWFyZXN0IGNhcHR1cmUgcG9pbnQKKyAgICAgICAgICAgIGRvdWJsZSBuRnJhbWVzID0gKHRpbWVVcyAtIG1QcmV2Q2FwdHVyZVVzKSAqIG1DYXB0dXJlRnBzIC8gMTAwMDAwMDsKKyAgICAgICAgICAgIGlmIChuRnJhbWVzIDwgMC41IC0ga1RpbWVzdGFtcEZsdWN0dWF0aW9uKSB7CisgICAgICAgICAgICAgICAgLy8gc2tpcCB0aGlzIGZyYW1lIGFzIGl0J3MgdG9vIGNsb3NlIHRvIHByZXZpb3VzIGNhcHR1cmUKKyAgICAgICAgICAgICAgICBBTE9HVigic2tpcHBpbmcgZnJhbWUsIHRpbWVVcyAlbGxkIiwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPih0aW1lVXMpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobkZyYW1lcyA8PSAxLjApIHsKKyAgICAgICAgICAgICAgICBuRnJhbWVzID0gMS4wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUZyYW1lQ291bnQgKz0gc3RkOjpsbHJvdW5kKG5GcmFtZXMpOworICAgICAgICAgICAgbVByZXZDYXB0dXJlVXMgPSBtQmFzZUNhcHR1cmVVcyArIHN0ZDo6bGxyb3VuZCgKKyAgICAgICAgICAgICAgICAgICAgbUZyYW1lQ291bnQgKiAxMDAwMDAwIC8gbUNhcHR1cmVGcHMpOworICAgICAgICAgICAgbVByZXZGcmFtZVVzID0gbUJhc2VGcmFtZVVzICsgc3RkOjpsbHJvdW5kKAorICAgICAgICAgICAgICAgICAgICBtRnJhbWVDb3VudCAqIDEwMDAwMDAgLyBtRnBzKTsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCJ0aW1lVXMgJWxsZCwgY2FwdHVyZVVzICVsbGQsIGZyYW1lVXMgJWxsZCIsCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPih0aW1lVXMpLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4obVByZXZDYXB0dXJlVXMpLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4obVByZXZGcmFtZVVzKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHRpbWVVcyA8PSBtUHJldkZyYW1lVXMpIHsKKyAgICAgICAgICAgIGlmIChtRnJhbWVEcm9wcGVyICE9IE5VTEwgJiYgbUZyYW1lRHJvcHBlci0+ZGlzYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIC8vIFdhcm4gb25seSwgY2xpZW50IGhhcyBkaXNhYmxlZCBmcmFtZSBkcm9wIGxvZ2ljIHBvc3NpYmx5IGZvciBpbWFnZQorICAgICAgICAgICAgICAgIC8vIGVuY29kaW5nIGNhc2VzIHdoZXJlIGNhbWVyYSdzIFpTTCBtb2RlIGNvdWxkIHNlbmQgb3V0IG9mIG9yZGVyIGZyYW1lcy4KKyAgICAgICAgICAgICAgICBBTE9HVygiUmVjZWl2ZWQgZnJhbWUgdGhhdCdzIGdvaW5nIGJhY2t3YXJkIGluIHRpbWUiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gRHJvcCB0aGUgZnJhbWUgaWYgaXQncyBnb2luZyBiYWNrd2FyZCBpbiB0aW1lLiBCYWQgdGltZXN0YW1wCisgICAgICAgICAgICAgICAgLy8gY291bGQgZGlzcnVwdCBlbmNvZGVyJ3MgcmF0ZSBjb250cm9sIGNvbXBsZXRlbHkuCisgICAgICAgICAgICAgICAgQUxPR1coIkRyb3BwaW5nIGZyYW1lIHRoYXQncyBnb2luZyBiYWNrd2FyZCBpbiB0aW1lIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbVByZXZGcmFtZVVzID0gdGltZVVzOworICAgIH0KKworICAgICpjb2RlY1RpbWVVcyA9IG1QcmV2RnJhbWVVczsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdHVzX3QgR3JhcGhpY0J1ZmZlclNvdXJjZTo6c3VibWl0QnVmZmVyX2woY29uc3QgVmlkZW9CdWZmZXIgJml0ZW0pIHsKKyAgICBDSEVDSyghbUZyZWVDb2RlY0J1ZmZlcnMuZW1wdHkoKSk7CisgICAgdWludDMyX3QgY29kZWNCdWZmZXJJZCA9ICptRnJlZUNvZGVjQnVmZmVycy5iZWdpbigpOworCisgICAgQUxPR1YoInN1Ym1pdEJ1ZmZlcl9sIFtzbG90PSVkLCBidWZmZXJJZD0lZF0iLCBpdGVtLm1CdWZmZXItPmdldFNsb3QoKSwgY29kZWNCdWZmZXJJZCk7CisKKyAgICBpbnQ2NF90IGNvZGVjVGltZVVzOworICAgIGlmICghY2FsY3VsYXRlQ29kZWNUaW1lc3RhbXBfbChpdGVtLm1UaW1lc3RhbXBOcywgJmNvZGVjVGltZVVzKSkgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAoKGFuZHJvaWRfZGF0YXNwYWNlKWl0ZW0ubURhdGFzcGFjZSAhPSBtTGFzdERhdGFzcGFjZSkgeworICAgICAgICBvbkRhdGFzcGFjZUNoYW5nZWRfbCgKKyAgICAgICAgICAgICAgICBpdGVtLm1EYXRhc3BhY2UsCisgICAgICAgICAgICAgICAgKGFuZHJvaWRfcGl4ZWxfZm9ybWF0KWl0ZW0ubUJ1ZmZlci0+Z2V0R3JhcGhpY0J1ZmZlcigpLT5mb3JtYXQpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxBY3F1aXJlZEJ1ZmZlcj4gYnVmZmVyID0gaXRlbS5tQnVmZmVyOworICAgIC8vIHVzZSBhIEdyYXBoaWNCdWZmZXIgZm9yIG5vdyBhcyBjb21wb25lbnQgaXMgdXNpbmcgR3JhcGhpY0J1ZmZlcnMgdG8gaG9sZCByZWZlcmVuY2VzCisgICAgLy8gYW5kIGl0IHJlcXVpcmVzIHRoaXMgZ3JhcGhpYyBidWZmZXIgdG8gYmUgYWJsZSB0byBob2xkIGl0cyByZWZlcmVuY2UKKyAgICAvLyBhbmQgdGh1cyB3ZSB3b3VsZCBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBHcmFwaGljQnVmZmVyIGZyb20gYW4gQU5XQnVmZmVyIHNlcGFyYXRlIGZyb20gdGhlCisgICAgLy8gYWNxdWlyZWQgR3JhcGhpY0J1ZmZlci4KKyAgICAvLyBUT0RPOiB0aGlzIGNhbiBiZSByZXdvcmtlZCBnbG9iYWxseSB0byB1c2UgQU5XQnVmZmVyIHJlZmVyZW5jZXMKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBncmFwaGljQnVmZmVyID0gYnVmZmVyLT5nZXRHcmFwaGljQnVmZmVyKCk7CisgICAgc3RhdHVzX3QgZXJyID0gbUNvbXBvbmVudC0+c3VibWl0QnVmZmVyKAorICAgICAgICAgICAgY29kZWNCdWZmZXJJZCwgZ3JhcGhpY0J1ZmZlciwgY29kZWNUaW1lVXMsIGJ1ZmZlci0+Z2V0QWNxdWlyZUZlbmNlRmQoKSk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dXKCJXQVJOSU5HOiBlbXB0eUdyYXBoaWNCdWZmZXIgZmFpbGVkOiAweCV4IiwgZXJyKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBtRnJlZUNvZGVjQnVmZmVycy5lcmFzZShtRnJlZUNvZGVjQnVmZmVycy5iZWdpbigpKTsKKworICAgIHNzaXplX3QgY2JpeCA9IG1TdWJtaXR0ZWRDb2RlY0J1ZmZlcnMuYWRkKGNvZGVjQnVmZmVySWQsIGJ1ZmZlcik7CisgICAgQUxPR1YoImVtcHR5R3JhcGhpY0J1ZmZlciBzdWNjZWVkZWQsIGJ1ZmZlcklkPSV1QCV6ZCBidWZoYW5kbGU9JXAiLAorICAgICAgICAgICAgY29kZWNCdWZmZXJJZCwgY2JpeCwgZ3JhcGhpY0J1ZmZlci0+aGFuZGxlKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6c3VibWl0RW5kT2ZJbnB1dFN0cmVhbV9sKCkgeworICAgIENIRUNLKG1FbmRPZlN0cmVhbSk7CisgICAgaWYgKG1FbmRPZlN0cmVhbVNlbnQpIHsKKyAgICAgICAgQUxPR1YoIkVPUyBhbHJlYWR5IHNlbnQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtRnJlZUNvZGVjQnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dWKCJzdWJtaXRFbmRPZklucHV0U3RyZWFtX2w6IG5vIGNvZGVjIGJ1ZmZlcnMgYXZhaWxhYmxlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdWludDMyX3QgY29kZWNCdWZmZXJJZCA9ICptRnJlZUNvZGVjQnVmZmVycy5iZWdpbigpOworCisgICAgLy8gV2UgcmVqZWN0IGFueSBhZGRpdGlvbmFsIGluY29taW5nIGdyYXBoaWMgYnVmZmVycy4gVGhlcmUgaXMgbm8gYWNxdWlyZWQgYnVmZmVyIHVzZWQgZm9yIEVPUworICAgIHN0YXR1c190IGVyciA9IG1Db21wb25lbnQtPnN1Ym1pdEVvcyhjb2RlY0J1ZmZlcklkKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dXKCJlbXB0eURpcmVjdEJ1ZmZlciBFT1MgZmFpbGVkOiAweCV4IiwgZXJyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtRnJlZUNvZGVjQnVmZmVycy5lcmFzZShtRnJlZUNvZGVjQnVmZmVycy5iZWdpbigpKTsKKyAgICAgICAgc3NpemVfdCBjYml4ID0gbVN1Ym1pdHRlZENvZGVjQnVmZmVycy5hZGQoY29kZWNCdWZmZXJJZCwgbnVsbHB0cik7CisgICAgICAgIEFMT0dWKCJzdWJtaXRFbmRPZklucHV0U3RyZWFtX2w6IGJ1ZmZlciBzdWJtaXR0ZWQsIGJ1ZmZlcklkPSV1QCV6ZCIsIGNvZGVjQnVmZmVySWQsIGNiaXgpOworICAgICAgICBtRW5kT2ZTdHJlYW1TZW50ID0gdHJ1ZTsKKworICAgICAgICAvLyBubyBuZWVkIHRvIGhvbGQgb250byBhbnkgYnVmZmVycyBmb3IgZnJhbWUgcmVwZWF0aW5nCisgICAgICAgICsrbVJlcGVhdExhc3RGcmFtZUdlbmVyYXRpb247CisgICAgICAgIG1MYXRlc3RCdWZmZXIubUJ1ZmZlci5yZXNldCgpOworICAgIH0KK30KKworc3RhdHVzX3QgR3JhcGhpY0J1ZmZlclNvdXJjZTo6YWNxdWlyZUJ1ZmZlcl9sKFZpZGVvQnVmZmVyICphYikgeworICAgIEJ1ZmZlckl0ZW0gYmk7CisgICAgc3RhdHVzX3QgZXJyID0gbUNvbnN1bWVyLT5hY3F1aXJlQnVmZmVyKCZiaSwgMCk7CisgICAgaWYgKGVyciA9PSBCdWZmZXJRdWV1ZTo6Tk9fQlVGRkVSX0FWQUlMQUJMRSkgeworICAgICAgICAvLyBzaG91bGRuJ3QgaGFwcGVuCisgICAgICAgIEFMT0dXKCJhY3F1aXJlQnVmZmVyX2w6IGZyYW1lIHdhcyBub3QgYXZhaWxhYmxlIik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfSBlbHNlIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR1coImFjcXVpcmVCdWZmZXJfbDogZmFpbGVkIHdpdGggZXJyPSVkIiwgZXJyKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgLS1tTnVtQXZhaWxhYmxlVW5hY3F1aXJlZEJ1ZmZlcnM7CisKKyAgICAvLyBNYW5hZ2Ugb3VyIGJ1ZmZlciBjYWNoZS4KKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q2FjaGVkQnVmZmVyPiBidWZmZXI7CisgICAgc3NpemVfdCBic2kgPSBtQnVmZmVyU2xvdHMuaW5kZXhPZktleShiaS5tU2xvdCk7CisgICAgaWYgKGJpLm1HcmFwaGljQnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgLy8gcmVwbGFjZS9pbml0aWFsaXplIHNsb3Qgd2l0aCBuZXcgYnVmZmVyCisgICAgICAgIEFMT0dWKCJhY3F1aXJlQnVmZmVyX2w6ICVzIGJ1ZmZlciBzbG90ICVkIiwgYnNpIDwgMCA/ICJzZXR0aW5nIiA6ICJVUERBVElORyIsIGJpLm1TbG90KTsKKyAgICAgICAgaWYgKGJzaSA+PSAwKSB7CisgICAgICAgICAgICBkaXNjYXJkQnVmZmVyQXRTbG90SW5kZXhfbChic2kpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnNpID0gbUJ1ZmZlclNsb3RzLmFkZChiaS5tU2xvdCwgbnVsbHB0cik7CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyID0gc3RkOjptYWtlX3NoYXJlZDxDYWNoZWRCdWZmZXI+KGJpLm1TbG90LCBiaS5tR3JhcGhpY0J1ZmZlcik7CisgICAgICAgIG1CdWZmZXJTbG90cy5yZXBsYWNlVmFsdWVBdChic2ksIGJ1ZmZlcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYnVmZmVyID0gbUJ1ZmZlclNsb3RzLnZhbHVlQXQoYnNpKTsKKyAgICB9CisgICAgaW50NjRfdCBmcmFtZU51bSA9IGJpLm1GcmFtZU51bWJlcjsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxBY3F1aXJlZEJ1ZmZlcj4gYWNxdWlyZWRCdWZmZXIgPQorICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEFjcXVpcmVkQnVmZmVyPigKKyAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgW2ZyYW1lTnVtLCB0aGlzXShBY3F1aXJlZEJ1ZmZlciAqYnVmZmVyKXsKKyAgICAgICAgICAgICAgICAgICAgLy8gQWNxdWlyZWRCdWZmZXIncyBkZXN0cnVjdG9yIHNob3VsZCBhbHdheXMgYmUgY2FsbGVkIHdoZW4gbU11dGV4IGlzIGxvY2tlZC4KKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgaGFkIGEgcmVlbnRyYW50IG11dGV4LCB3ZSBjb3VsZCBqdXN0IGxvY2sgaXQgYWdhaW4gdG8gZW5zdXJlIHRoaXMuCisgICAgICAgICAgICAgICAgICAgIGlmIChtTXV0ZXgudHJ5TG9jaygpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRSRVNQQVNTX0RCRygpOworICAgICAgICAgICAgICAgICAgICAgICAgbU11dGV4LnVubG9jaygpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2FuIHJlbGVhc2UgYnVmZmVycyBpbW1lZGlhdGVseSBpZiBub3QgdXNpbmcgYWRhcHRlcnMKKyAgICAgICAgICAgICAgICAgICAgLy8gYWx0ZXJuYXRlbHksIHdlIGNvdWxkIGFkZCB0aGVtIHRvIG1TbG90c1RvUmVsZWFzZSwgYnV0IHdlIHdvdWxkCisgICAgICAgICAgICAgICAgICAgIC8vIHNvbWVob3cgbmVlZCB0byBwcm9wYWdhdGUgZnJhbWUgbnVtYmVyIHRvIHRoYXQgcXVldWUKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlci0+aXNDYWNoZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLS1tTnVtT3V0c3RhbmRpbmdBY3F1aXJlczsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db25zdW1lci0+cmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5nZXRTbG90KCksIGZyYW1lTnVtLCBFR0xfTk9fRElTUExBWSwgRUdMX05PX1NZTkNfS0hSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXItPmdldFJlbGVhc2VGZW5jZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgYmkubUZlbmNlKTsKKyAgICBWaWRlb0J1ZmZlciB2aWRlb0J1ZmZlcnthY3F1aXJlZEJ1ZmZlciwgYmkubVRpbWVzdGFtcCwgYmkubURhdGFTcGFjZX07CisgICAgKmFiID0gdmlkZW9CdWZmZXI7CisgICAgKyttTnVtT3V0c3RhbmRpbmdBY3F1aXJlczsKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vIEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyIGNhbGxiYWNrCit2b2lkIEdyYXBoaWNCdWZmZXJTb3VyY2U6Om9uRnJhbWVBdmFpbGFibGUoY29uc3QgQnVmZmVySXRlbSYgaXRlbSBfX3VudXNlZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworCisgICAgQUxPR1YoIm9uRnJhbWVBdmFpbGFibGU6IGV4ZWN1dGluZz0lZCBhdmFpbGFibGU9JXp1KyVkIiwKKyAgICAgICAgICAgIG1FeGVjdXRpbmcsIG1BdmFpbGFibGVCdWZmZXJzLnNpemUoKSwgbU51bUF2YWlsYWJsZVVuYWNxdWlyZWRCdWZmZXJzKTsKKyAgICArK21OdW1BdmFpbGFibGVVbmFjcXVpcmVkQnVmZmVyczsKKworICAgIC8vIEZvciBCdWZmZXJRdWV1ZSB3ZSBjYW5ub3QgYWNxdWlyZSBhIGJ1ZmZlciBpZiB3ZSBjYW5ub3QgaW1tZWRpYXRlbHkgZmVlZCBpdCB0byB0aGUgY29kZWMKKyAgICAvLyBVTkxFU1Mgd2UgYXJlIGRpc2NhcmRpbmcgdGhpcyBidWZmZXIgKGFjcXVpcmluZyBhbmQgaW1tZWRpYXRlbHkgcmVsZWFzaW5nIGl0KSwgd2hpY2ggbWFrZXMKKyAgICAvLyB0aGlzIGFuIHVnbHkgbG9naWMuCisgICAgLy8gTk9URTogV2UgY291bGQgYWxzbyByZWx5IG9uIG91ciBkZWJ1ZyBjb3VudGVyIGJ1dCB0aGF0IGlzIG1lYW50IG9ubHkgYXMgYSBkZWJ1ZyBjb3VudGVyLgorICAgIGlmICghYXJlV2VEaXNjYXJkaW5nQXZhaWxhYmxlQnVmZmVyc19sKCkgJiYgbUZyZWVDb2RlY0J1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICAvLyB3ZSBtYXkgbm90IGJlIGFsbG93ZWQgdG8gYWNxdWlyZSBhIHBvc3NpYmx5IGVuY29kYWJsZSBidWZmZXIsIHNvIGp1c3Qgbm90ZSB0aGF0CisgICAgICAgIC8vIGl0IGlzIGF2YWlsYWJsZQorICAgICAgICBBTE9HVigib25GcmFtZUF2YWlsYWJsZTogY2Fubm90IGFjcXVpcmUgYnVmZmVyIHJpZ2h0IG5vdywgZG8gaXQgbGF0ZXIiKTsKKworICAgICAgICArK21SZXBlYXRMYXN0RnJhbWVHZW5lcmF0aW9uOyAvLyBjYW5jZWwgYW55IHBlbmRpbmcgZnJhbWUgcmVwZWF0CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBWaWRlb0J1ZmZlciBidWZmZXI7CisgICAgc3RhdHVzX3QgZXJyID0gYWNxdWlyZUJ1ZmZlcl9sKCZidWZmZXIpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIm9uRnJhbWVBdmFpbGFibGU6IGFjcXVpcmVCdWZmZXIgcmV0dXJuZWQgZXJyPSVkIiwgZXJyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBvbkJ1ZmZlckFjcXVpcmVkX2woYnVmZmVyKTsKKyAgICB9Cit9CisKK2Jvb2wgR3JhcGhpY0J1ZmZlclNvdXJjZTo6YXJlV2VEaXNjYXJkaW5nQXZhaWxhYmxlQnVmZmVyc19sKCkgeworICAgIHJldHVybiBtRW5kT2ZTdHJlYW1TZW50IC8vIGFscmVhZHkgc2VudCBFT1MgdG8gY29kZWMKKyAgICAgICAgICAgIHx8IG1Db21wb25lbnQgPT0gbnVsbHB0ciAvLyB0aGVyZSBpcyBubyBjb2RlYyBjb25uZWN0ZWQKKyAgICAgICAgICAgIHx8IChtU3VzcGVuZGVkICYmIG1BY3Rpb25RdWV1ZS5lbXB0eSgpKSAvLyB3ZSBhcmUgc3VzcGVuZGVkIGFuZCBub3Qgd2FpdGluZyBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbnkgZnVydGhlciBhY3Rpb24KKyAgICAgICAgICAgIHx8ICFtRXhlY3V0aW5nOworfQorCit2b2lkIEdyYXBoaWNCdWZmZXJTb3VyY2U6Om9uQnVmZmVyQWNxdWlyZWRfbChjb25zdCBWaWRlb0J1ZmZlciAmYnVmZmVyKSB7CisgICAgaWYgKG1FbmRPZlN0cmVhbVNlbnQpIHsKKyAgICAgICAgLy8gVGhpcyBzaG91bGQgb25seSBiZSBwb3NzaWJsZSBpZiBhIG5ldyBidWZmZXIgd2FzIHF1ZXVlZCBhZnRlcgorICAgICAgICAvLyBFT1Mgd2FzIHNpZ25hbGVkLCBpLmUuIHRoZSBhcHAgaXMgbWlzYmVoYXZpbmcuCisgICAgICAgIEFMT0dXKCJvbkZyYW1lQXZhaWxhYmxlOiBFT1MgaXMgc2VudCwgaWdub3JpbmcgZnJhbWUiKTsKKyAgICB9IGVsc2UgaWYgKG1Db21wb25lbnQgPT0gTlVMTCB8fCAobVN1c3BlbmRlZCAmJiBtQWN0aW9uUXVldWUuZW1wdHkoKSkpIHsKKyAgICAgICAgLy8gRklYTUU6IGlmIHdlIGFyZSBzdXNwZW5kZWQgYnV0IGhhdmUgYSByZXN1bWUgcXVldWVkIHdlIHdpbGwgc3RvcCByZXBlYXRpbmcgdGhlIGxhc3QKKyAgICAgICAgLy8gZnJhbWUuIElzIHRoYXQgdGhlIGRlc2lyZWQgYmVoYXZpb3I/CisgICAgICAgIEFMT0dWKCJvbkZyYW1lQXZhaWxhYmxlOiBzdXNwZW5kZWQsIGlnbm9yaW5nIGZyYW1lIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKyttUmVwZWF0TGFzdEZyYW1lR2VuZXJhdGlvbjsgLy8gY2FuY2VsIGFueSBwZW5kaW5nIGZyYW1lIHJlcGVhdAorICAgICAgICBtQXZhaWxhYmxlQnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICAgICAgaWYgKG1FeGVjdXRpbmcpIHsKKyAgICAgICAgICAgIGZpbGxDb2RlY0J1ZmZlcl9sKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyIGNhbGxiYWNrCit2b2lkIEdyYXBoaWNCdWZmZXJTb3VyY2U6Om9uQnVmZmVyc1JlbGVhc2VkKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7CisKKyAgICB1aW50NjRfdCBzbG90TWFzazsKKyAgICB1aW50NjRfdCByZWxlYXNlTWFzazsKKyAgICBpZiAobUNvbnN1bWVyLT5nZXRSZWxlYXNlZEJ1ZmZlcnMoJnJlbGVhc2VNYXNrKSAhPSBOT19FUlJPUikgeworICAgICAgICBzbG90TWFzayA9IDB4ZmZmZmZmZmZmZmZmZmZmZlVMTDsKKyAgICAgICAgQUxPR1coIm9uQnVmZmVyc1JlbGVhc2VkOiB1bmFibGUgdG8gZ2V0IHJlbGVhc2VkIGJ1ZmZlciBzZXQiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzbG90TWFzayA9IHJlbGVhc2VNYXNrOworICAgICAgICBBTE9HVigib25CdWZmZXJzUmVsZWFzZWQ6IDB4JTAxNiIgUFJJeDY0LCBzbG90TWFzayk7CisgICAgfQorCisgICAgQVN0cmluZyB1bnBvcHVsYXRlZDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IEJ1ZmZlclF1ZXVlOjpOVU1fQlVGRkVSX1NMT1RTOyBpKyspIHsKKyAgICAgICAgaWYgKChzbG90TWFzayAmIDB4MDEpICE9IDApIHsKKyAgICAgICAgICAgIGlmICghZGlzY2FyZEJ1ZmZlckluU2xvdF9sKGkpKSB7CisgICAgICAgICAgICAgICAgaWYgKCF1bnBvcHVsYXRlZC5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHVucG9wdWxhdGVkLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdW5wb3B1bGF0ZWQuYXBwZW5kKGkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNsb3RNYXNrID4+PSAxOworICAgIH0KKyAgICBpZiAoIXVucG9wdWxhdGVkLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR1coInJlbGVhc2VkIHVucG9wdWxhdGVkIHNsb3RzOiBbJXNdIiwgdW5wb3B1bGF0ZWQuY19zdHIoKSk7CisgICAgfQorfQorCitib29sIEdyYXBoaWNCdWZmZXJTb3VyY2U6OmRpc2NhcmRCdWZmZXJJblNsb3RfbChHcmFwaGljQnVmZmVyU291cmNlOjpzbG90X2lkIGkpIHsKKyAgICBzc2l6ZV90IGJzaSA9IG1CdWZmZXJTbG90cy5pbmRleE9mS2V5KGkpOworICAgIGlmIChic2kgPCAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgICBkaXNjYXJkQnVmZmVyQXRTbG90SW5kZXhfbChic2kpOworICAgICAgICBtQnVmZmVyU2xvdHMucmVtb3ZlSXRlbXNBdChic2kpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CisKK3ZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6ZGlzY2FyZEJ1ZmZlckF0U2xvdEluZGV4X2woc3NpemVfdCBic2kpIHsKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q2FjaGVkQnVmZmVyPiYgYnVmZmVyID0gbUJ1ZmZlclNsb3RzLnZhbHVlQXQoYnNpKTsKKyAgICAvLyB1c2UgLTIgaWYgdGhlcmUgaXMgbm8gbGF0ZXN0IGJ1ZmZlciwgYW5kIC0xIGlmIGl0IGlzIG5vIGxvbmdlciBjYWNoZWQKKyAgICBzbG90X2lkIGxhdGVzdEJ1ZmZlclNsb3QgPQorICAgICAgICBtTGF0ZXN0QnVmZmVyLm1CdWZmZXIgPT0gbnVsbHB0ciA/IC0yIDogbUxhdGVzdEJ1ZmZlci5tQnVmZmVyLT5nZXRTbG90KCk7CisgICAgQUxPR1YoInJlbGVhc2luZyBhY3F1aXJlZCBidWZmZXI6IFtzbG90PSVkLCB1c2VDb3VudD0lbGRdLCBsYXRlc3Q6IFtzbG90PSVkXSIsCisgICAgICAgICAgICBtQnVmZmVyU2xvdHMua2V5QXQoYnNpKSwgYnVmZmVyLnVzZV9jb3VudCgpLCBsYXRlc3RCdWZmZXJTbG90KTsKKyAgICBtQnVmZmVyU2xvdHMudmFsdWVBdChic2kpLT5vbkRyb3BwZWRGcm9tQ2FjaGUoKTsKKworICAgIC8vIElmIHRoZSBzbG90IG9mIGFuIGFjcXVpcmVkIGJ1ZmZlciBpcyBkaXNjYXJkZWQsIHRoYXQgYnVmZmVyIHdpbGwgbm90IGhhdmUgdG8gYmUKKyAgICAvLyByZWxlYXNlZCB0byB0aGUgcHJvZHVjZXIsIHNvIGFjY291bnQgaXQgaGVyZS4gSG93ZXZlciwgaXQgaXMgcG9zc2libGUgdGhhdCB0aGUKKyAgICAvLyBhY3F1aXJlZCBidWZmZXIgaGFzIGFscmVhZHkgYmVlbiBkaXNjYXJkZWQgc28gY2hlY2sgaWYgaXQgc3RpbGwgaXMuCisgICAgaWYgKGJ1ZmZlci0+aXNBY3F1aXJlZCgpKSB7CisgICAgICAgIC0tbU51bU91dHN0YW5kaW5nQWNxdWlyZXM7CisgICAgfQorCisgICAgLy8gY2xlYXIgdGhlIGJ1ZmZlciByZWZlcmVuY2UgKG5vdCB0ZWNobmljYWxseSBuZWVkZWQgYXMgY2FsbGVyIGVpdGhlciByZXBsYWNlcyBvciBkZWxldGVzCisgICAgLy8gaXQ7IGRvbmUgaGVyZSBmb3Igc2FmZXR5KS4KKyAgICBtQnVmZmVyU2xvdHMuZWRpdFZhbHVlQXQoYnNpKS5yZXNldCgpOworICAgIENIRUNLX0RCRyhidWZmZXIgPT0gbnVsbHB0cik7Cit9CisKK3ZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6cmVsZWFzZUFsbEF2YWlsYWJsZUJ1ZmZlcnNfbCgpIHsKKyAgICBtQXZhaWxhYmxlQnVmZmVycy5jbGVhcigpOworICAgIHdoaWxlIChtTnVtQXZhaWxhYmxlVW5hY3F1aXJlZEJ1ZmZlcnMgPiAwKSB7CisgICAgICAgIFZpZGVvQnVmZmVyIGl0ZW07CisgICAgICAgIGlmIChhY3F1aXJlQnVmZmVyX2woJml0ZW0pICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HVygicmVsZWFzZUFsbEF2YWlsYWJsZUJ1ZmZlcnM6IGZhaWxlZCB0byBhY3F1aXJlIGF2YWlsYWJsZSB1bmFjcXVpcmVkIGJ1ZmZlciIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyIGNhbGxiYWNrCit2b2lkIEdyYXBoaWNCdWZmZXJTb3VyY2U6Om9uU2lkZWJhbmRTdHJlYW1DaGFuZ2VkKCkgeworICAgIEFMT0dfQVNTRVJUKGZhbHNlLCAiR3JhcGhpY0J1ZmZlclNvdXJjZSBjYW4ndCBjb25zdW1lIHNpZGViYW5kIHN0cmVhbXMiKTsKK30KKworc3RhdHVzX3QgR3JhcGhpY0J1ZmZlclNvdXJjZTo6Y29uZmlndXJlKAorICAgICAgICBjb25zdCBzcDxDb21wb25lbnRXcmFwcGVyPiYgY29tcG9uZW50LAorICAgICAgICBpbnQzMl90IGRhdGFTcGFjZSwKKyAgICAgICAgaW50MzJfdCBidWZmZXJDb3VudCwKKyAgICAgICAgdWludDMyX3QgZnJhbWVXaWR0aCwKKyAgICAgICAgdWludDMyX3QgZnJhbWVIZWlnaHQsCisgICAgICAgIHVpbnQzMl90IGNvbnN1bWVyVXNhZ2UpIHsKKyAgICBpZiAoY29tcG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKworICAgIC8vIENhbGwgc2V0TWF4QWNxdWlyZWRCdWZmZXJDb3VudCB3aXRob3V0IGxvY2suCisgICAgLy8gc2V0TWF4QWNxdWlyZWRCdWZmZXJDb3VudCBjb3VsZCBjYWxsIGJhY2sgdG8gb25CdWZmZXJzUmVsZWFzZWQKKyAgICAvLyBpZiB0aGUgYnVmZmVyIGNvdW50IGNoYW5nZSByZXN1bHRzIGluIHJlbGVhc2luZyBvZiBleGlzdGluZyBidWZmZXJzLAorICAgIC8vIHdoaWNoIHdvdWxkIGxlYWQgdG8gZGVhZGxvY2suCisgICAgc3RhdHVzX3QgZXJyID0gbUNvbnN1bWVyLT5zZXRNYXhBY3F1aXJlZEJ1ZmZlckNvdW50KGJ1ZmZlckNvdW50KTsKKyAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IEJRIG1heCBhY3F1aXJlZCBidWZmZXIgY291bnQgdG8gJXU6ICVkIiwKKyAgICAgICAgICAgICAgICBidWZmZXJDb3VudCwgZXJyKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworICAgICAgICBtQ29tcG9uZW50ID0gY29tcG9uZW50OworCisgICAgICAgIGVyciA9IG1Db25zdW1lci0+c2V0RGVmYXVsdEJ1ZmZlclNpemUoZnJhbWVXaWR0aCwgZnJhbWVIZWlnaHQpOworICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBCUSBkZWZhdWx0IGJ1ZmZlciBzaXplIHRvICV1eCV1OiAlZCIsCisgICAgICAgICAgICAgICAgICAgIGZyYW1lV2lkdGgsIGZyYW1lSGVpZ2h0LCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN1bWVyVXNhZ2UgfD0gR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSOworICAgICAgICBtQ29uc3VtZXItPnNldENvbnN1bWVyVXNhZ2VCaXRzKGNvbnN1bWVyVXNhZ2UpOworCisgICAgICAgIC8vIFNldHMgdGhlIGRlZmF1bHQgYnVmZmVyIGRhdGEgc3BhY2UKKyAgICAgICAgQUxPR0QoInNldHRpbmcgZGF0YXNwYWNlOiAlI3gsIGFjcXVpcmVkPSVkIiwgZGF0YVNwYWNlLCBtTnVtT3V0c3RhbmRpbmdBY3F1aXJlcyk7CisgICAgICAgIG1Db25zdW1lci0+c2V0RGVmYXVsdEJ1ZmZlckRhdGFTcGFjZSgoYW5kcm9pZF9kYXRhc3BhY2UpZGF0YVNwYWNlKTsKKyAgICAgICAgbUxhc3REYXRhc3BhY2UgPSAoYW5kcm9pZF9kYXRhc3BhY2UpZGF0YVNwYWNlOworCisgICAgICAgIG1FeGVjdXRpbmcgPSBmYWxzZTsKKyAgICAgICAgbVN1c3BlbmRlZCA9IGZhbHNlOworICAgICAgICBtRW5kT2ZTdHJlYW0gPSBmYWxzZTsKKyAgICAgICAgbUVuZE9mU3RyZWFtU2VudCA9IGZhbHNlOworICAgICAgICBtU2tpcEZyYW1lc0JlZm9yZU5zID0gLTFsbDsKKyAgICAgICAgbUZyYW1lRHJvcHBlci5jbGVhcigpOworICAgICAgICBtRnJhbWVSZXBlYXRJbnRlcnZhbFVzID0gLTFsbDsKKyAgICAgICAgbVJlcGVhdExhc3RGcmFtZUdlbmVyYXRpb24gPSAwOworICAgICAgICBtT3V0c3RhbmRpbmdGcmFtZVJlcGVhdENvdW50ID0gMDsKKyAgICAgICAgbUxhdGVzdEJ1ZmZlci5tQnVmZmVyLnJlc2V0KCk7CisgICAgICAgIG1GcmFtZVJlcGVhdEJsb2NrZWRPbkNvZGVjQnVmZmVyID0gZmFsc2U7CisgICAgICAgIG1GcHMgPSAtMS4wOworICAgICAgICBtQ2FwdHVyZUZwcyA9IC0xLjA7CisgICAgICAgIG1CYXNlQ2FwdHVyZVVzID0gLTFsbDsKKyAgICAgICAgbUJhc2VGcmFtZVVzID0gLTFsbDsKKyAgICAgICAgbVByZXZDYXB0dXJlVXMgPSAtMWxsOworICAgICAgICBtUHJldkZyYW1lVXMgPSAtMWxsOworICAgICAgICBtRnJhbWVDb3VudCA9IDA7CisgICAgICAgIG1JbnB1dEJ1ZmZlclRpbWVPZmZzZXRVcyA9IDA7CisgICAgICAgIG1TdG9wVGltZVVzID0gLTE7CisgICAgICAgIG1BY3Rpb25RdWV1ZS5jbGVhcigpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2V0U3VzcGVuZChib29sIHN1c3BlbmQsIGludDY0X3Qgc3VzcGVuZFN0YXJ0VGltZVVzKSB7CisgICAgQUxPR1YoInNldFN1c3BlbmQ9JWQgYXQgdGltZSAlbGxkIHVzIiwgc3VzcGVuZCwgKGxvbmcgbG9uZylzdXNwZW5kU3RhcnRUaW1lVXMpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisKKyAgICBpZiAobVN0b3BUaW1lVXMgIT0gLTEpIHsKKyAgICAgICAgQUxPR0UoInNldFN1c3BlbmQgZmFpbGVkIGFzIFNUT1AgYWN0aW9uIGlzIHBlbmRpbmciKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIC8vIFB1c2ggdGhlIGFjdGlvbiB0byB0aGUgcXVldWUuCisgICAgaWYgKHN1c3BlbmRTdGFydFRpbWVVcyAhPSAtMSkgeworICAgICAgICAvLyBzdXNwZW5kU3RhcnRUaW1lVXMgbXVzdCBiZSBzbWFsbGVyIG9yIGVxdWFsIHRvIGN1cnJlbnQgc3lzdGVtVGltZS4KKyAgICAgICAgaW50NjRfdCBjdXJyZW50U3lzdGVtVGltZVVzID0gc3lzdGVtVGltZSgpIC8gMTAwMDsKKyAgICAgICAgaWYgKHN1c3BlbmRTdGFydFRpbWVVcyA+IGN1cnJlbnRTeXN0ZW1UaW1lVXMpIHsKKyAgICAgICAgICAgIEFMT0dFKCJzZXRTdXNwZW5kIGZhaWxlZC4gJWxsZCBpcyBsYXJnZXIgdGhhbiBjdXJyZW50IHN5c3RlbSB0aW1lICVsbGQgdXMiLAorICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXN1c3BlbmRTdGFydFRpbWVVcywgKGxvbmcgbG9uZyljdXJyZW50U3lzdGVtVGltZVVzKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICBpZiAobUxhc3RBY3Rpb25UaW1lVXMgIT0gLTEgJiYgc3VzcGVuZFN0YXJ0VGltZVVzIDwgbUxhc3RBY3Rpb25UaW1lVXMpIHsKKyAgICAgICAgICAgIEFMT0dFKCJzZXRTdXNwZW5kIGZhaWxlZC4gJWxsZCBpcyBzbWFsbGVyIHRoYW4gbGFzdCBhY3Rpb24gdGltZSAlbGxkIHVzIiwKKyAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylzdXNwZW5kU3RhcnRUaW1lVXMsIChsb25nIGxvbmcpbUxhc3RBY3Rpb25UaW1lVXMpOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgICAgIG1MYXN0QWN0aW9uVGltZVVzID0gc3VzcGVuZFN0YXJ0VGltZVVzOworICAgICAgICBBY3Rpb25JdGVtIGFjdGlvbjsKKyAgICAgICAgYWN0aW9uLm1BY3Rpb24gPSBzdXNwZW5kID8gQWN0aW9uSXRlbTo6UEFVU0UgOiBBY3Rpb25JdGVtOjpSRVNVTUU7CisgICAgICAgIGFjdGlvbi5tQWN0aW9uVGltZVVzID0gc3VzcGVuZFN0YXJ0VGltZVVzOworICAgICAgICBBTE9HVigiUHVzaCAlcyBhY3Rpb24gaW50byBhY3Rpb25RdWV1ZSIsIHN1c3BlbmQgPyAiUEFVU0UiIDogIlJFU1VNRSIpOworICAgICAgICBtQWN0aW9uUXVldWUucHVzaF9iYWNrKGFjdGlvbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHN1c3BlbmQpIHsKKyAgICAgICAgICAgIG1TdXNwZW5kZWQgPSB0cnVlOworICAgICAgICAgICAgcmVsZWFzZUFsbEF2YWlsYWJsZUJ1ZmZlcnNfbCgpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVN1c3BlbmRlZCA9IGZhbHNlOworICAgICAgICAgICAgaWYgKG1FeGVjdXRpbmcgJiYgIWhhdmVBdmFpbGFibGVCdWZmZXJzX2woKQorICAgICAgICAgICAgICAgICAgICAmJiBtRnJhbWVSZXBlYXRCbG9ja2VkT25Db2RlY0J1ZmZlcikgeworICAgICAgICAgICAgICAgIGlmIChyZXBlYXRMYXRlc3RCdWZmZXJfbCgpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJzdXNwZW5kL2RlZmVycmVkIHJlcGVhdExhdGVzdEJ1ZmZlcl9sIFNVQ0NFU1MiKTsKKyAgICAgICAgICAgICAgICAgICAgbUZyYW1lUmVwZWF0QmxvY2tlZE9uQ29kZWNCdWZmZXIgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigic3VzcGVuZC9kZWZlcnJlZCByZXBlYXRMYXRlc3RCdWZmZXJfbCBGQUlMVVJFIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2V0UmVwZWF0UHJldmlvdXNGcmFtZURlbGF5VXMoaW50NjRfdCByZXBlYXRBZnRlclVzKSB7CisgICAgQUxPR1YoInNldFJlcGVhdFByZXZpb3VzRnJhbWVEZWxheVVzOiBkZWxheVVzPSVsbGQiLCAobG9uZyBsb25nKXJlcGVhdEFmdGVyVXMpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisKKyAgICBpZiAobUV4ZWN1dGluZyB8fCByZXBlYXRBZnRlclVzIDw9IDBsbCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgbUZyYW1lUmVwZWF0SW50ZXJ2YWxVcyA9IHJlcGVhdEFmdGVyVXM7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBHcmFwaGljQnVmZmVyU291cmNlOjpzZXRUaW1lT2Zmc2V0VXMoaW50NjRfdCB0aW1lT2Zmc2V0VXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKworICAgIC8vIHRpbWVPZmZzZXRVcyBtdXN0IGJlIG5lZ2F0aXZlIGZvciBhZGp1c3RtZW50LgorICAgIGlmICh0aW1lT2Zmc2V0VXMgPj0gMGxsKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBtSW5wdXRCdWZmZXJUaW1lT2Zmc2V0VXMgPSB0aW1lT2Zmc2V0VXM7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBHcmFwaGljQnVmZmVyU291cmNlOjpzZXRNYXhGcHMoZmxvYXQgbWF4RnBzKSB7CisgICAgQUxPR1YoInNldE1heEZwczogbWF4RnBzPSVsbGQiLCAobG9uZyBsb25nKW1heEZwcyk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKworICAgIGlmIChtRXhlY3V0aW5nKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBtRnJhbWVEcm9wcGVyID0gbmV3IEZyYW1lRHJvcHBlcigpOworICAgIHN0YXR1c190IGVyciA9IG1GcmFtZURyb3BwZXItPnNldE1heEZyYW1lUmF0ZShtYXhGcHMpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgbUZyYW1lRHJvcHBlci5jbGVhcigpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2V0U3RhcnRUaW1lVXMoaW50NjRfdCBza2lwRnJhbWVzQmVmb3JlVXMpIHsKKyAgICBBTE9HVigic2V0U3RhcnRUaW1lVXM6IHNraXBGcmFtZXNCZWZvcmVVcz0lbGxkIiwgKGxvbmcgbG9uZylza2lwRnJhbWVzQmVmb3JlVXMpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisKKyAgICBtU2tpcEZyYW1lc0JlZm9yZU5zID0KKyAgICAgICAgICAgIChza2lwRnJhbWVzQmVmb3JlVXMgPiAwICYmIHNraXBGcmFtZXNCZWZvcmVVcyA8PSBJTlQ2NF9NQVggLyAxMDAwKSA/CisgICAgICAgICAgICAoc2tpcEZyYW1lc0JlZm9yZVVzICogMTAwMCkgOiAtMWxsOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBHcmFwaGljQnVmZmVyU291cmNlOjpzZXRTdG9wVGltZVVzKGludDY0X3Qgc3RvcFRpbWVVcykgeworICAgIEFMT0dWKCJzZXRTdG9wVGltZVVzOiAlbGxkIHVzIiwgKGxvbmcgbG9uZylzdG9wVGltZVVzKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKworICAgIGlmIChtU3RvcFRpbWVVcyAhPSAtMSkgeworICAgICAgICAvLyBJZ25vcmUgaWYgc3RvcCB0aW1lIGhhcyBhbHJlYWR5IGJlZW4gc2V0CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICAvLyBzdG9wVGltZVVzIG11c3QgYmUgc21hbGxlciBvciBlcXVhbCB0byBjdXJyZW50IHN5c3RlbVRpbWUuCisgICAgaW50NjRfdCBjdXJyZW50U3lzdGVtVGltZVVzID0gc3lzdGVtVGltZSgpIC8gMTAwMDsKKyAgICBpZiAoc3RvcFRpbWVVcyA+IGN1cnJlbnRTeXN0ZW1UaW1lVXMpIHsKKyAgICAgICAgQUxPR0UoInNldFN0b3BUaW1lVXMgZmFpbGVkLiAlbGxkIGlzIGxhcmdlciB0aGFuIGN1cnJlbnQgc3lzdGVtIHRpbWUgJWxsZCB1cyIsCisgICAgICAgICAgICAobG9uZyBsb25nKXN0b3BUaW1lVXMsIChsb25nIGxvbmcpY3VycmVudFN5c3RlbVRpbWVVcyk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgaWYgKG1MYXN0QWN0aW9uVGltZVVzICE9IC0xICYmIHN0b3BUaW1lVXMgPCBtTGFzdEFjdGlvblRpbWVVcykgeworICAgICAgICBBTE9HRSgic2V0U3VzcGVuZCBmYWlsZWQuICVsbGQgaXMgc21hbGxlciB0aGFuIGxhc3QgYWN0aW9uIHRpbWUgJWxsZCB1cyIsCisgICAgICAgICAgICAobG9uZyBsb25nKXN0b3BUaW1lVXMsIChsb25nIGxvbmcpbUxhc3RBY3Rpb25UaW1lVXMpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIG1MYXN0QWN0aW9uVGltZVVzID0gc3RvcFRpbWVVczsKKyAgICBBY3Rpb25JdGVtIGFjdGlvbjsKKyAgICBhY3Rpb24ubUFjdGlvbiA9IEFjdGlvbkl0ZW06OlNUT1A7CisgICAgYWN0aW9uLm1BY3Rpb25UaW1lVXMgPSBzdG9wVGltZVVzOworICAgIG1BY3Rpb25RdWV1ZS5wdXNoX2JhY2soYWN0aW9uKTsKKyAgICBtU3RvcFRpbWVVcyA9IHN0b3BUaW1lVXM7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBHcmFwaGljQnVmZmVyU291cmNlOjpnZXRTdG9wVGltZU9mZnNldFVzKGludDY0X3QgKnN0b3BUaW1lT2Zmc2V0VXMpIHsKKyAgICBBTE9HVigiZ2V0U3RvcFRpbWVPZmZzZXRVcyIpOworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworICAgIGlmIChtU3RvcFRpbWVVcyA9PSAtMSkgeworICAgICAgICBBTE9HVygiRmFpbCB0byByZXR1cm4gc3RvcFRpbWVPZmZzZXRVcyBhcyBzdG9wIHRpbWUgaXMgbm90IHNldCIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgICpzdG9wVGltZU9mZnNldFVzID0KKyAgICAgICAgbUxhc3RGcmFtZVRpbWVzdGFtcFVzID09IC0xID8gMCA6IG1TdG9wVGltZVVzIC0gbUxhc3RGcmFtZVRpbWVzdGFtcFVzOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2V0VGltZUxhcHNlQ29uZmlnKGRvdWJsZSBmcHMsIGRvdWJsZSBjYXB0dXJlRnBzKSB7CisgICAgQUxPR1YoInNldFRpbWVMYXBzZUNvbmZpZzogZnBzPSVsZywgY2FwdHVyZUZwcz0lbGciLAorICAgICAgICAgICAgZnBzLCBjYXB0dXJlRnBzKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKworICAgIGlmIChtRXhlY3V0aW5nIHx8ICEoZnBzID4gMCkgfHwgIShjYXB0dXJlRnBzID4gMCkpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIG1GcHMgPSBmcHM7CisgICAgbUNhcHR1cmVGcHMgPSBjYXB0dXJlRnBzOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBHcmFwaGljQnVmZmVyU291cmNlOjpzZXRDb2xvckFzcGVjdHMoaW50MzJfdCBhc3BlY3RzUGFja2VkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisgICAgbURlZmF1bHRDb2xvckFzcGVjdHNQYWNrZWQgPSBhc3BlY3RzUGFja2VkOworICAgIENvbG9yQXNwZWN0cyBjb2xvckFzcGVjdHMgPSBDb2xvclV0aWxzOjp1bnBhY2tUb0NvbG9yQXNwZWN0cyhhc3BlY3RzUGFja2VkKTsKKyAgICBBTE9HRCgicmVxdWVzdGluZyBjb2xvciBhc3BlY3RzIChSOiVkKCVzKSwgUDolZCglcyksIE06JWQoJXMpLCBUOiVkKCVzKSkiLAorICAgICAgICAgICAgY29sb3JBc3BlY3RzLm1SYW5nZSwgYXNTdHJpbmcoY29sb3JBc3BlY3RzLm1SYW5nZSksCisgICAgICAgICAgICBjb2xvckFzcGVjdHMubVByaW1hcmllcywgYXNTdHJpbmcoY29sb3JBc3BlY3RzLm1QcmltYXJpZXMpLAorICAgICAgICAgICAgY29sb3JBc3BlY3RzLm1NYXRyaXhDb2VmZnMsIGFzU3RyaW5nKGNvbG9yQXNwZWN0cy5tTWF0cml4Q29lZmZzKSwKKyAgICAgICAgICAgIGNvbG9yQXNwZWN0cy5tVHJhbnNmZXIsIGFzU3RyaW5nKGNvbG9yQXNwZWN0cy5tVHJhbnNmZXIpKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKyAgICBBTE9HVigic2lnbmFsRW5kT2ZJbnB1dFN0cmVhbTogZXhlY3V0aW5nPSVkIGF2YWlsYWJsZT0lenUrJWQgZW9zPSVkIiwKKyAgICAgICAgICAgIG1FeGVjdXRpbmcsIG1BdmFpbGFibGVCdWZmZXJzLnNpemUoKSwgbU51bUF2YWlsYWJsZVVuYWNxdWlyZWRCdWZmZXJzLCBtRW5kT2ZTdHJlYW0pOworCisgICAgaWYgKG1FbmRPZlN0cmVhbSkgeworICAgICAgICBBTE9HRSgiRU9TIHdhcyBhbHJlYWR5IHNpZ25hbGVkIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICAvLyBTZXQgdGhlIGVuZC1vZi1zdHJlYW0gZmxhZy4gIElmIG5vIGZyYW1lcyBhcmUgcGVuZGluZyBmcm9tIHRoZQorICAgIC8vIEJ1ZmZlclF1ZXVlLCBhbmQgYSBjb2RlYyBidWZmZXIgaXMgYXZhaWxhYmxlLCBhbmQgd2UncmUgZXhlY3V0aW5nLAorICAgIC8vIGFuZCB0aGVyZSBpcyBubyBzdG9wIHRpbWVzdGFtcCwgd2UgaW5pdGlhdGUgdGhlIEVPUyBmcm9tIGhlcmUuCisgICAgLy8gT3RoZXJ3aXNlLCB3ZSdsbCBsZXQgY29kZWNCdWZmZXJFbXB0aWVkKCkgKG9yIHN0YXJ0KSBkbyBpdC4KKyAgICAvLworICAgIC8vIE5vdGU6IGlmIHRoZXJlIGFyZSBubyBwZW5kaW5nIGZyYW1lcyBhbmQgYWxsIGNvZGVjIGJ1ZmZlcnMgYXJlCisgICAgLy8gYXZhaWxhYmxlLCB3ZSAqbXVzdCogc3VibWl0IHRoZSBFT1MgZnJvbSBoZXJlIG9yIHdlJ2xsIGp1c3QKKyAgICAvLyBzdGFsbCBzaW5jZSBubyBmdXR1cmUgZXZlbnRzIGFyZSBleHBlY3RlZC4KKyAgICBtRW5kT2ZTdHJlYW0gPSB0cnVlOworCisgICAgaWYgKG1TdG9wVGltZVVzID09IC0xICYmIG1FeGVjdXRpbmcgJiYgIWhhdmVBdmFpbGFibGVCdWZmZXJzX2woKSkgeworICAgICAgICBzdWJtaXRFbmRPZklucHV0U3RyZWFtX2woKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRSZXBlYXRMYXN0RnJhbWU6CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworCisgICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb247CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7CisKKyAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9IG1SZXBlYXRMYXN0RnJhbWVHZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgLy8gc3RhbGUKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFtRXhlY3V0aW5nIHx8IGhhdmVBdmFpbGFibGVCdWZmZXJzX2woKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sIHN1Y2Nlc3MgPSByZXBlYXRMYXRlc3RCdWZmZXJfbCgpOworICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigicmVwZWF0TGF0ZXN0QnVmZmVyX2wgU1VDQ0VTUyIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVigicmVwZWF0TGF0ZXN0QnVmZmVyX2wgRkFJTFVSRSIpOworICAgICAgICAgICAgICAgIG1GcmFtZVJlcGVhdEJsb2NrZWRPbkNvZGVjQnVmZmVyID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvV1Byb2R1Y2VyTGlzdGVuZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvV1Byb2R1Y2VyTGlzdGVuZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjYTEzYmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9XUHJvZHVjZXJMaXN0ZW5lci5jcHAKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9XUHJvZHVjZXJMaXN0ZW5lci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIFRXUHJvZHVjZXJMaXN0ZW5lcgorVFdQcm9kdWNlckxpc3RlbmVyOjpUV1Byb2R1Y2VyTGlzdGVuZXIoCisgICAgICAgIHNwPEJQcm9kdWNlckxpc3RlbmVyPiBjb25zdCYgYmFzZSk6CisgICAgbUJhc2UoYmFzZSkgeworfQorCitSZXR1cm48dm9pZD4gVFdQcm9kdWNlckxpc3RlbmVyOjpvbkJ1ZmZlclJlbGVhc2VkKCkgeworICAgIG1CYXNlLT5vbkJ1ZmZlclJlbGVhc2VkKCk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPGJvb2w+IFRXUHJvZHVjZXJMaXN0ZW5lcjo6bmVlZHNSZWxlYXNlTm90aWZ5KCkgeworICAgIHJldHVybiBtQmFzZS0+bmVlZHNSZWxlYXNlTm90aWZ5KCk7Cit9CisKKy8vIExXUHJvZHVjZXJMaXN0ZW5lcgorTFdQcm9kdWNlckxpc3RlbmVyOjpMV1Byb2R1Y2VyTGlzdGVuZXIoCisgICAgICAgIHNwPEhQcm9kdWNlckxpc3RlbmVyPiBjb25zdCYgYmFzZSk6CisgICAgbUJhc2UoYmFzZSkgeworfQorCit2b2lkIExXUHJvZHVjZXJMaXN0ZW5lcjo6b25CdWZmZXJSZWxlYXNlZCgpIHsKKyAgICBtQmFzZS0+b25CdWZmZXJSZWxlYXNlZCgpOworfQorCitib29sIExXUHJvZHVjZXJMaXN0ZW5lcjo6bmVlZHNSZWxlYXNlTm90aWZ5KCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxib29sPihtQmFzZS0+bmVlZHNSZWxlYXNlTm90aWZ5KCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9Db21wb25lbnRXcmFwcGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL0NvbXBvbmVudFdyYXBwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjc4MjliCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9Db21wb25lbnRXcmFwcGVyLmgKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09NUE9ORU5UX1dSQVBQRVJfSF8KKyNkZWZpbmUgQ09NUE9ORU5UX1dSQVBQRVJfSF8KKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IENvbXBvbmVudFdyYXBwZXIgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdWJtaXRCdWZmZXIoCisgICAgICAgICAgICBpbnQzMl90IGJ1ZmZlcklkLCBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiAmYnVmZmVyID0gbnVsbHB0ciwKKyAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wID0gMCwgaW50IGZlbmNlRmQgPSAtMSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VibWl0RW9zKGludDMyX3QgYnVmZmVySWQpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hEYXRhU3BhY2VDaGFuZ2VkKAorICAgICAgICAgICAgaW50MzJfdCBkYXRhU3BhY2UsIGludDMyX3QgYXNwZWN0cywgaW50MzJfdCBwaXhlbEZvcm1hdCkgPSAwOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDT01QT05FTlRfV1JBUFBFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9Db252ZXJzaW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL0NvbnZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGQ4YzFlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9Db252ZXJzaW9uLmgKQEAgLTAsMCArMSw3NjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX1NUQUdFRlJJR0hUX0JRSEVMUEVSX0NPTlZFUlNJT05fSF8KKyNkZWZpbmUgTUVESUFfU1RBR0VGUklHSFRfQlFIRUxQRVJfQ09OVkVSU0lPTl9IXworCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGxpc3Q+CisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlIDxoaWRsbWVtb3J5L21hcHBpbmcuaD4KKworI2luY2x1ZGUgPGJpbmRlci9CaW5kZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvU3RhdHVzLmg+CisjaW5jbHVkZSA8dWkvRmVuY2VUaW1lLmg+CisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorCisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvVmlkZW9BUEkuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9tZW1vcnkvMS4wL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2dyYXBoaWNzL2J1ZmZlcnF1ZXVlLzEuMC9JUHJvZHVjZXJMaXN0ZW5lci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY29udmVyc2lvbiB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9oYW5kbGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpzcDsKK3VzaW5nIDo6YW5kcm9pZDo6c3RhdHVzX3Q7CisKK3VzaW5nIDo6YW5kcm9pZDo6U3RyaW5nODsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OlYxXzA6OlJlY3Q7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6VjFfMDo6UmVnaW9uOworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpEYXRhc3BhY2U7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OlBpeGVsRm9ybWF0OworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6VjFfMDo6QW53QnVmZmVyOwordXNpbmcgOjphbmRyb2lkOjpHcmFwaGljQnVmZmVyOworCit0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcgorICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwordHlwZWRlZiA6OmFuZHJvaWQ6OklHcmFwaGljQnVmZmVyUHJvZHVjZXIKKyAgICAgICAgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKKworLy8gbmF0aXZlX2hhbmRsZV90IGhlbHBlciBmdW5jdGlvbnMuCisKKy8qKgorICogXGJyaWVmIFRha2UgYW4gZmQgYW5kIGNyZWF0ZSBhIG5hdGl2ZSBoYW5kbGUgY29udGFpbmluZyBvbmx5IHRoZSBnaXZlbiBmZC4KKyAqIFRoZSBjcmVhdGVkIGhhbmRsZSB3aWxsIG5lZWQgdG8gYmUgZGVsZXRlZCBtYW51YWxseSB3aXRoCisgKiBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAuCisgKgorICogXHBhcmFtW2luXSBmZCBUaGUgc291cmNlIGZpbGUgZGVzY3JpcHRvciAob2YgdHlwZSBgaW50YCkuCisgKiBccmV0dXJuIFRoZSBjcmVhdGUgYG5hdGl2ZV9oYW5kbGVfdCpgIHRoYXQgY29udGFpbnMgdGhlIGdpdmVuIFxwIGZkLiBJZiB0aGUKKyAqIHN1cHBsaWVkIFxwIGZkIGlzIG5lZ2F0aXZlLCB0aGUgY3JlYXRlZCBuYXRpdmUgaGFuZGxlIHdpbGwgY29udGFpbiBubyBmaWxlCisgKiBkZXNjcmlwdG9ycy4KKyAqCisgKiBJZiB0aGUgbmF0aXZlIGhhbmRsZSBjYW5ub3QgYmUgY3JlYXRlZCwgdGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlCisgKiBgbnVsbHB0cmAuCisgKgorICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBkdXBsaWNhdGUgdGhlIGZpbGUgZGVzY3JpcHRvci4KKyAqLworbmF0aXZlX2hhbmRsZV90KiBuYXRpdmVfaGFuZGxlX2NyZWF0ZV9mcm9tX2ZkKGludCBmZCk7CisKKy8qKgorICogXGJyaWVmIEV4dHJhY3QgYSBmaWxlIGRlc2NyaXB0b3IgZnJvbSBhIG5hdGl2ZSBoYW5kbGUuCisgKgorICogXHBhcmFtW2luXSBuaCBUaGUgc291cmNlIGBuYXRpdmVfaGFuZGxlX3QqYC4KKyAqIFxwYXJhbVtpbl0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBmaWxlIGRlc2NyaXB0b3IgaW4gXHAgbmggdG8gcmVhZCBmcm9tLiBUaGlzCisgKiBpbnB1dCBoYXMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYDBgLgorICogXHJldHVybiBUaGUgYGluZGV4YC10aCBmaWxlIGRlc2NyaXB0b3IgaW4gXHAgbmguIElmIFxwIG5oIGRvZXMgbm90IGhhdmUKKyAqIGVub3VnaCBmaWxlIGRlc2NyaXB0b3JzLCB0aGUgcmV0dXJuZWQgdmFsdWUgd2lsbCBiZSBgLTFgLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgZHVwbGljYXRlIHRoZSBmaWxlIGRlc2NyaXB0b3IuCisgKi8KK2ludCBuYXRpdmVfaGFuZGxlX3JlYWRfZmQobmF0aXZlX2hhbmRsZV90IGNvbnN0KiBuaCwgaW50IGluZGV4ID0gMCk7CisKKy8qKgorICogQ29udmVyc2lvbiBmdW5jdGlvbnMKKyAqID09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhlcmUgYXJlIHR3byBtYWluIGRpcmVjdGlvbnMgb2YgY29udmVyc2lvbjoKKyAqIC0gYGluVGFyZ2V0VHlwZSguLi4pYDogQ3JlYXRlIGEgd3JhcHBlciB3aG9zZSBsaWZldGltZSBkZXBlbmRzIG9uIHRoZQorICogICBpbnB1dC4gVGhlIHdyYXBwZXIgaGFzIHR5cGUgYFRhcmdldFR5cGVgLgorICogLSBgdG9UYXJnZXRUeXBlKC4uLilgOiBDcmVhdGUgYSBzdGFuZGFsb25lIG9iamVjdCBvZiB0eXBlIGBUYXJnZXRUeXBlYCB0aGF0CisgKiAgIGNvcnJlc3BvbmRzIHRvIHRoZSBpbnB1dC4gVGhlIGxpZmV0aW1lIG9mIHRoZSBvdXRwdXQgZG9lcyBub3QgZGVwZW5kIG9uIHRoZQorICogICBsaWZldGltZSBvZiB0aGUgaW5wdXQuCisgKiAtIGB3cmFwSW4oVGFyZ2V0VHlwZSosIC4uLilgOiBTYW1lIGFzIGBpblRhcmdldFR5cGUoKWAsIGJ1dCBmb3IgYFRhcmdldFR5cGVgCisgKiAgIHRoYXQgY2Fubm90IGJlIGNvcGllZCBhbmQvb3IgbW92ZWQgZWZmaWNpZW50bHksIG9yIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlCisgKiAgIG91dHB1dCBhcmd1bWVudHMuCisgKiAtIGBjb252ZXJ0VG8oVGFyZ2V0VHlwZSosIC4uLilgOiBTYW1lIGFzIGB0b1RhcmdldFR5cGUoKWAsIGJ1dCBmb3IKKyAqICAgYFRhcmdldFR5cGVgIHRoYXQgY2Fubm90IGJlIGNvcGllZCBhbmQvb3IgbW92ZWQgZWZmaWNpZW50bHksIG9yIHdoZW4gdGhlcmUKKyAqICAgYXJlIG11bHRpcGxlIG91dHB1dCBhcmd1bWVudHMuCisgKgorICogYHdyYXBJbigpYCBhbmQgYGNvbnZlcnRUbygpYCBmdW5jdGlvbnMgd2lsbCB0YWtlIG91dHB1dCBhcmd1bWVudHMgYmVmb3JlCisgKiBpbnB1dCBhcmd1bWVudHMuIFNvbWUgb2YgdGhlc2UgZnVuY3Rpb25zIG1pZ2h0IHJldHVybiBhIHZhbHVlIHRvIGluZGljYXRlCisgKiBzdWNjZXNzIG9yIGVycm9yLgorICoKKyAqIEluIGNvbnZlcnRpbmcgb3Igd3JhcHBpbmcgc29tZXRoaW5nIGFzIGEgVHJlYmxlIHR5cGUgdGhhdCBjb250YWlucyBhCisgKiBgaGlkbF9oYW5kbGVgLCBgbmF0aXZlX2hhbmRsZV90KmAgd2lsbCBuZWVkIHRvIGJlIGNyZWF0ZWQgYW5kIHJldHVybmVkIGFzCisgKiBhbiBhZGRpdGlvbmFsIG91dHB1dCBhcmd1bWVudCwgaGVuY2Ugb25seSBgd3JhcEluKClgIG9yIGBjb252ZXJ0VG8oKWAgd291bGQKKyAqIGJlIGF2YWlsYWJsZS4gVGhlIGNhbGxlciBtdXN0IGNhbGwgYG5hdGl2ZV9oYW5kbGVfZGVsZXRlKClgIHRvIGRlYWxsb2NhdGUgdGhlCisgKiByZXR1cm5lZCBuYXRpdmUgaGFuZGxlIHdoZW4gaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KKyAqCisgKiBGb3IgdHlwZXMgdGhhdCBjb250YWluIGZpbGUgZGVzY3JpcHRvcnMsIGBpblRhcmdldFR5cGUoKWAgYW5kIGB3cmFwQXMoKWAgZG8KKyAqIG5vdCBwZXJmb3JtIGR1cGxpY2F0aW9uIG9mIGZpbGUgZGVzY3JpcHRvcnMsIHdoaWxlIGB0b1RhcmdldFR5cGUoKWAgYW5kCisgKiBgY29udmVydFRvKClgIGRvLgorICovCisKKy8qKgorICogXGJyaWVmIENvbnZlcnQgYFJldHVybjx2b2lkPmAgdG8gYGJpbmRlcjo6U3RhdHVzYC4KKyAqCisgKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgUmV0dXJuPHZvaWQ+YC4KKyAqIFxyZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcgYGJpbmRlcjo6U3RhdHVzYC4KKyAqLworLy8gY29udmVydDogUmV0dXJuPHZvaWQ+IC0+IDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMKKzo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgdG9CaW5kZXJTdGF0dXMoUmV0dXJuPHZvaWQ+IGNvbnN0JiB0KTsKKworLyoqCisgKiBcYnJpZWYgQ29udmVydCBgUmV0dXJuPHZvaWQ+YCB0byBgc3RhdHVzX3RgLiBUaGlzIGlzIGZvciBsZWdhY3kgYmluZGVyIGNhbGxzLgorICoKKyAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBSZXR1cm48dm9pZD5gLgorICogXHJldHVybiBUaGUgY29ycmVzcG9uZGluZyBgc3RhdHVzX3RgLgorICovCisvLyBjb252ZXJ0OiBSZXR1cm48dm9pZD4gLT4gc3RhdHVzX3QKK3N0YXR1c190IHRvU3RhdHVzVChSZXR1cm48dm9pZD4gY29uc3QmIHQpOworCisvKioKKyAqIFxicmllZiBXcmFwIGBuYXRpdmVfaGFuZGxlX3QqYCBpbiBgaGlkbF9oYW5kbGVgLgorICoKKyAqIFxwYXJhbVtpbl0gbmggVGhlIHNvdXJjZSBgbmF0aXZlX2hhbmRsZV90KmAuCisgKiBccmV0dXJuIFRoZSBgaGlkbF9oYW5kbGVgIHRoYXQgcG9pbnRzIHRvIFxwIG5oLgorICovCisvLyB3cmFwOiBuYXRpdmVfaGFuZGxlX3QqIC0+IGhpZGxfaGFuZGxlCitoaWRsX2hhbmRsZSBpbkhpZGxIYW5kbGUobmF0aXZlX2hhbmRsZV90IGNvbnN0KiBuaCk7CisKKy8qKgorICogXGJyaWVmIENvbnZlcnQgYGludDMyX3RgIHRvIGBEYXRhc3BhY2VgLgorICoKKyAqIFxwYXJhbVtpbl0gbCBUaGUgc291cmNlIGBpbnQzMl90YC4KKyAqIFxyZXN1bHQgVGhlIGNvcnJlc3BvbmRpbmcgYERhdGFzcGFjZWAuCisgKi8KKy8vIGNvbnZlcnQ6IGludDMyX3QgLT4gRGF0YXNwYWNlCitEYXRhc3BhY2UgdG9IYXJkd2FyZURhdGFzcGFjZShpbnQzMl90IGwpOworCisvKioKKyAqIFxicmllZiBDb252ZXJ0IGBEYXRhc3BhY2VgIHRvIGBpbnQzMl90YC4KKyAqCisgKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgRGF0YXNwYWNlYC4KKyAqIFxyZXN1bHQgVGhlIGNvcnJlc3BvbmRpbmcgYGludDMyX3RgLgorICovCisvLyBjb252ZXJ0OiBEYXRhc3BhY2UgLT4gaW50MzJfdAoraW50MzJfdCB0b1Jhd0RhdGFzcGFjZShEYXRhc3BhY2UgY29uc3QmIHQpOworCisvKioKKyAqIFxicmllZiBXcmFwIGFuIG9wYXF1ZSBidWZmZXIgaW5zaWRlIGEgYGhpZGxfdmVjPHVpbnQ4X3Q+YC4KKyAqCisgKiBccGFyYW1baW5dIGwgVGhlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgb3BhcXVlIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbl0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgYnVmZmVyLgorICogXHJldHVybiBBIGBoaWRsX3ZlYzx1aW50OF90PmAgdGhhdCBwb2ludHMgdG8gdGhlIGJ1ZmZlci4KKyAqLworLy8gd3JhcDogdm9pZCosIHNpemVfdCAtPiBoaWRsX3ZlYzx1aW50OF90PgoraGlkbF92ZWM8dWludDhfdD4gaW5IaWRsQnl0ZXModm9pZCBjb25zdCogbCwgc2l6ZV90IHNpemUpOworCisvKioKKyAqIFxicmllZiBDcmVhdGUgYSBgaGlkbF92ZWM8dWludDhfdD5gIHRoYXQgaXMgYSBjb3B5IG9mIGFuIG9wYXF1ZSBidWZmZXIuCisgKgorICogXHBhcmFtW2luXSBsIFRoZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG9wYXF1ZSBidWZmZXIuCisgKiBccGFyYW1baW5dIHNpemUgVGhlIHNpemUgb2YgdGhlIGJ1ZmZlci4KKyAqIFxyZXR1cm4gQSBgaGlkbF92ZWM8dWludDhfdD5gIHRoYXQgaXMgYSBjb3B5IG9mIHRoZSBpbnB1dCBidWZmZXIuCisgKi8KKy8vIGNvbnZlcnQ6IHZvaWQqLCBzaXplX3QgLT4gaGlkbF92ZWM8dWludDhfdD4KK2hpZGxfdmVjPHVpbnQ4X3Q+IHRvSGlkbEJ5dGVzKHZvaWQgY29uc3QqIGwsIHNpemVfdCBzaXplKTsKKworLyoqCisgKiBcYnJpZWYgV3JhcCBgR3JhcGhpY0J1ZmZlcmAgaW4gYEFud0J1ZmZlcmAuCisgKgorICogXHBhcmFtW291dF0gdCBUaGUgd3JhcHBlciBvZiB0eXBlIGBBbndCdWZmZXJgLgorICogXHBhcmFtW2luXSBsIFRoZSBzb3VyY2UgYEdyYXBoaWNCdWZmZXJgLgorICovCisvLyB3cmFwOiBHcmFwaGljQnVmZmVyIC0+IEFud0J1ZmZlcgordm9pZCB3cmFwQXMoQW53QnVmZmVyKiB0LCBHcmFwaGljQnVmZmVyIGNvbnN0JiBsKTsKKworLyoqCisgKiBcYnJpZWYgQ29udmVydCBgQW53QnVmZmVyYCB0byBgR3JhcGhpY0J1ZmZlcmAuCisgKgorICogXHBhcmFtW291dF0gbCBUaGUgZGVzdGluYXRpb24gYEdyYXBoaWNCdWZmZXJgLgorICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYEFud0J1ZmZlcmAuCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGR1cGxpY2F0ZSBhbGwgZmlsZSBkZXNjcmlwdG9ycyBpbiBccCB0LgorICovCisvLyBjb252ZXJ0OiBBbndCdWZmZXIgLT4gR3JhcGhpY0J1ZmZlcgorLy8gUmVmOiBmcmFtZXdvcmtzL25hdGl2ZS9saWJzL3VpL0dyYXBoaWNCdWZmZXIuY3BwOiBHcmFwaGljQnVmZmVyOjpmbGF0dGVuCitib29sIGNvbnZlcnRUbyhHcmFwaGljQnVmZmVyKiBsLCBBbndCdWZmZXIgY29uc3QmIHQpOworCisvKioKKyAqIENvbnZlcnNpb24gZnVuY3Rpb25zIGZvciB0eXBlcyBvdXRzaWRlIG1lZGlhCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFNvbWUgb2JqZWN0cyBpbiBsaWJ1aSBhbmQgbGliZ3VpIHRoYXQgd2VyZSBtYWRlIHRvIGdvIHRocm91Z2ggYmluZGVyIGNhbGxzIGRvCisgKiBub3QgZXhwb3NlIHdheXMgdG8gcmVhZCBvciB3cml0ZSB0aGVpciBmaWVsZHMgdG8gdGhlIHB1YmxpYy4gVG8gcGFzcyBhbgorICogb2JqZWN0IG9mIHRoaXMga2luZCB0aHJvdWdoIHRoZSBISURMIGJvdW5kYXJ5LCB0cmFuc2xhdGlvbiBmdW5jdGlvbnMgbmVlZCB0bworICogd29yayBhcm91bmQgdGhlIGFjY2VzcyByZXN0cmljdGlvbiBieSB1c2luZyB0aGUgcHVibGljbHkgYXZhaWxhYmxlCisgKiBgZmxhdHRlbigpYCBhbmQgYHVuZmxhdHRlbigpYCBmdW5jdGlvbnMuCisgKgorICogQWxsIGBmbGF0dGVuKClgIGFuZCBgdW5mbGF0dGVuKClgIG92ZXJsb2FkcyBmb2xsb3cgdGhlIHNhbWUgY29udmVudGlvbiBhcworICogZm9sbG93czoKKyAqCisgKiAgICAgc3RhdHVzX3QgZmxhdHRlbihPYmplY3RUeXBlIGNvbnN0JiBvYmplY3QsCisgKiAgICAgICAgICAgICAgICAgICAgICBbT3RoZXJUeXBlIGNvbnN0JiBvdGhlciwgLi4uXQorICogICAgICAgICAgICAgICAgICAgICAgdm9pZComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLAorICogICAgICAgICAgICAgICAgICAgICAgaW50KiYgZmRzLCBzaXplX3QmIG51bUZkcykKKyAqCisgKiAgICAgc3RhdHVzX3QgdW5mbGF0dGVuKE9iamVjdFR5cGUqIG9iamVjdCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgW090aGVyVHlwZSogb3RoZXIsIC4uLixdCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgaW50KiYgZmRzLCBzaXplX3QmIG51bUZkcykKKyAqCisgKiBUaGUgbnVtYmVyIG9mIGBvdGhlcmAgcGFyYW1ldGVycyB2YXJpZXMgZGVwZW5kaW5nIG9uIHRoZSBgT2JqZWN0VHlwZWAuIEZvcgorICogZXhhbXBsZSwgaW4gdGhlIHByb2Nlc3Mgb2YgdW5mbGF0dGVuaW5nIGFuIG9iamVjdCB0aGF0IGNvbnRhaW5zCisgKiBgaGlkbF9oYW5kbGVgLCBgb3RoZXJgIGlzIG5lZWRlZCB0byBob2xkIGBuYXRpdmVfaGFuZGxlX3RgIG9iamVjdHMgdGhhdCB3aWxsCisgKiBiZSBjcmVhdGVkLgorICoKKyAqIFRoZSBsYXN0IGZvdXIgcGFyYW1ldGVycyBhbHdheXMgd29yayB0aGUgc2FtZSB3YXkgaW4gYWxsIG92ZXJsb2FkcyBvZgorICogYGZsYXR0ZW4oKWAgYW5kIGB1bmZsYXR0ZW4oKWA6CisgKiAtIEZvciBgZmxhdHRlbigpYCwgYGJ1ZmZlcmAgaXMgdGhlIHBvaW50ZXIgdG8gdGhlIG5vbi1mZCBidWZmZXIgdG8gYmUgZmlsbGVkLAorICogICBgc2l6ZWAgaXMgdGhlIHNpemUgKGluIGJ5dGVzKSBvZiB0aGUgbm9uLWZkIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IGBidWZmZXJgLAorICogICBgZmRzYCBpcyB0aGUgcG9pbnRlciB0byB0aGUgZmQgYnVmZmVyIHRvIGJlIGZpbGxlZCwgYW5kIGBudW1GZHNgIGlzIHRoZQorICogICBzaXplIChpbiBpbnRzKSBvZiB0aGUgZmQgYnVmZmVyIHBvaW50ZWQgdG8gYnkgYGZkc2AuCisgKiAtIEZvciBgdW5mbGF0dGVuKClgLCBgYnVmZmVyYCBpcyB0aGUgcG9pbnRlciB0byB0aGUgbm9uLWZkIGJ1ZmZlciB0byBiZSByZWFkCisgKiAgIGZyb20sIGBzaXplYCBpcyB0aGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIHRoZSBub24tZmQgYnVmZmVyIHBvaW50ZWQgdG8gYnkKKyAqICAgYGJ1ZmZlcmAsIGBmZHNgIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBmZCBidWZmZXIgdG8gYmUgcmVhZCBmcm9tLCBhbmQKKyAqICAgYG51bUZkc2AgaXMgdGhlIHNpemUgKGluIGludHMpIG9mIHRoZSBmZCBidWZmZXIgcG9pbnRlZCB0byBieSBgZmRzYC4KKyAqIC0gQWZ0ZXIgYSBzdWNjZXNzZnVsIGNhbGwgdG8gYGZsYXR0ZW4oKWAgb3IgYHVuZmxhdHRlbigpYCwgYGJ1ZmZlcmAgYW5kIGBmZHNgCisgKiAgIHdpbGwgYmUgYWR2YW5jZWQsIHdoaWxlIGBzaXplYCBhbmQgYG51bUZkc2Agd2lsbCBiZSBkZWNyZWFzZWQgdG8gcmVmbGVjdAorICogICBob3cgbXVjaCBzdG9yYWdlL2RhdGEgb2YgdGhlIHR3byBidWZmZXJzIChmZCBhbmQgbm9uLWZkKSBoYXZlIGJlZW4gdXNlZC4KKyAqIC0gQWZ0ZXIgYW4gdW5zdWNjZXNzZnVsIGNhbGwsIHRoZSB2YWx1ZXMgb2YgYGJ1ZmZlcmAsIGBzaXplYCwgYGZkc2AgYW5kCisgKiAgIGBudW1GZHNgIGFyZSBpbnZhbGlkLgorICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgb2YgYSBzdWNjZXNzZnVsIGBmbGF0dGVuKClgIG9yIGB1bmZsYXR0ZW4oKWAgY2FsbCB3aWxsIGJlCisgKiBgT0tgIChhbHNvIGFsaWFzZWQgYXMgYE5PX0VSUk9SYCkuIEFueSBvdGhlciB2YWx1ZXMgaW5kaWNhdGUgYSBmYWlsdXJlLgorICoKKyAqIEZvciBlYWNoIG9iamVjdCB0eXBlIHRoYXQgc3VwcG9ydHMgZmxhdHRlbmluZywgdGhlcmUgd2lsbCBiZSB0d28gYWNjb21wYW55aW5nCisgKiBmdW5jdGlvbnM6IGBnZXRGbGF0dGVuZWRTaXplKClgIGFuZCBgZ2V0RmRDb3VudCgpYC4gYGdldEZsYXR0ZW5lZFNpemUoKWAgd2lsbAorICogcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBub24tZmQgYnVmZmVyIHRoYXQgdGhlIG9iamVjdCB3aWxsIG5lZWQgZm9yCisgKiBmbGF0dGVuaW5nLiBgZ2V0RmRDb3VudCgpYCB3aWxsIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgZmQgYnVmZmVyIHRoYXQgdGhlCisgKiBvYmplY3Qgd2lsbCBuZWVkIGZvciBmbGF0dGVuaW5nLgorICoKKyAqIFRoZSBzZXQgb2YgdGhlc2UgZm91ciBmdW5jdGlvbnMsIGBnZXRGbGF0dGVuZWRTaXplKClgLCBgZ2V0RmRDb3VudCgpYCwKKyAqIGBmbGF0dGVuKClgIGFuZCBgdW5mbGF0dGVuKClgLCBhcmUgc2ltaWxhciB0byBmdW5jdGlvbnMgb2YgdGhlIHNhbWUgbmFtZSBpbgorICogdGhlIGFic3RyYWN0IGNsYXNzIGBGbGF0dGVuYWJsZWAuIFRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgdGhhdCBmdW5jdGlvbnMgaW4KKyAqIHRoaXMgZmlsZSBhcmUgbm90IG1lbWJlciBmdW5jdGlvbnMgb2YgdGhlIG9iamVjdCB0eXBlLiBGb3IgZXhhbXBsZSwgd2Ugd3JpdGUKKyAqCisgKiAgICAgZmxhdHRlbih4LCBidWZmZXIsIHNpemUsIGZkcywgbnVtRmRzKQorICoKKyAqIGluc3RlYWQgb2YKKyAqCisgKiAgICAgeC5mbGF0dGVuKGJ1ZmZlciwgc2l6ZSwgZmRzLCBudW1GZHMpCisgKgorICogYmVjYXVzZSB3ZSBjYW5ub3QgbW9kaWZ5IHRoZSB0eXBlIG9mIGB4YC4KKyAqCisgKiBUaGVyZSBpcyBvbmUgZXhjZXB0aW9uIHRvIHRoZSBuYW1pbmcgY29udmVudGlvbjogYGhpZGxfaGFuZGxlYCB0aGF0CisgKiByZXByZXNlbnRzIGEgZmVuY2UuIFRoZSBmb3VyIGZ1bmN0aW9ucyBmb3IgdGhpcyAiRmVuY2UiIHR5cGUgaGF2ZSB0aGUgd29yZAorICogIkZlbmNlIiBhdHRjaGVkIHRvIHRoZWlyIG5hbWVzIGJlY2F1c2UgdGhlIG9iamVjdCB0eXBlLCB3aGljaCBpcworICogYGhpZGxfaGFuZGxlYCwgZG9lcyBub3QgY2FycnkgdGhlIHNwZWNpYWwgbWVhbmluZyB0aGF0IHRoZSBvYmplY3QgaXRzZWxmIGNhbgorICogb25seSBjb250YWluIHplcm8gb3Igb25lIGZpbGUgZGVzY3JpcHRvci4KKyAqLworCisvLyBSZWY6IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvdWkvRmVuY2UuY3BwCisKKy8qKgorICogXGJyaWVmIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgbm9uLWZkIGJ1ZmZlciByZXF1aXJlZCB0byBmbGF0dGVuIGEgZmVuY2UuCisgKgorICogXHBhcmFtW2luXSBmZW5jZSBUaGUgaW5wdXQgZmVuY2Ugb2YgdHlwZSBgaGlkbF9oYW5kbGVgLgorICogXHJldHVybiBUaGUgcmVxdWlyZWQgc2l6ZSBvZiB0aGUgZmxhdCBidWZmZXIuCisgKgorICogVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGlzIGZ1bmN0aW9uIGFsd2F5cyByZXR1cm5zIDQsIHdoaWNoIGlzIHRoZSBudW1iZXIgb2YKKyAqIGJ5dGVzIHJlcXVpcmVkIHRvIHN0b3JlIHRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4gdGhlIGZkCisgKiBwYXJ0IG9mIHRoZSBmbGF0IGJ1ZmZlci4KKyAqLworc2l6ZV90IGdldEZlbmNlRmxhdHRlbmVkU2l6ZShoaWRsX2hhbmRsZSBjb25zdCYgZmVuY2UpOworCisvKioKKyAqIFxicmllZiBSZXR1cm4gdGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbiBhIGZlbmNlLgorICoKKyAqIFxwYXJhbVtpbl0gZmVuY2UgVGhlIGlucHV0IGZlbmNlIG9mIHR5cGUgYGhpZGxfaGFuZGxlYC4KKyAqIFxyZXR1cm4gYDBgIGlmIFxwIGZlbmNlIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBmaWxlIGRlc2NyaXB0b3IsIG9yIGAxYAorICogb3RoZXJ3aXNlLgorICovCitzaXplX3QgZ2V0RmVuY2VGZENvdW50KGhpZGxfaGFuZGxlIGNvbnN0JiBmZW5jZSk7CisKKy8qKgorICogXGJyaWVmIFVuZmxhdHRlbiBgRmVuY2VgIHRvIGBoaWRsX2hhbmRsZWAuCisgKgorICogXHBhcmFtW291dF0gZmVuY2UgVGhlIGRlc3RpbmF0aW9uIGBoaWRsX2hhbmRsZWAuCisgKiBccGFyYW1bb3V0XSBuaCBUaGUgdW5kZXJseWluZyBuYXRpdmUgaGFuZGxlLgorICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBmZHMgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgZmQgYnVmZmVyLgorICogXHBhcmFtW2luLG91dF0gbnVtRmRzIFRoZSBzaXplIG9mIHRoZSBmbGF0IGZkIGJ1ZmZlci4KKyAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgorICoKKyAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgYE5PX0VSUk9SYCwgXHAgbmggd2lsbCBwb2ludCB0byBhIG5ld2x5IGNyZWF0ZWQKKyAqIG5hdGl2ZSBoYW5kbGUsIHdoaWNoIG5lZWRzIHRvIGJlIGRlbGV0ZWQgd2l0aCBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAKKyAqIGFmdGVyd2FyZHMuCisgKi8KK3N0YXR1c190IHVuZmxhdHRlbkZlbmNlKGhpZGxfaGFuZGxlKiBmZW5jZSwgbmF0aXZlX2hhbmRsZV90KiogbmgsCisgICAgICAgIHZvaWQgY29uc3QqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwgaW50IGNvbnN0KiYgZmRzLCBzaXplX3QmIG51bUZkcyk7CisKKy8qKgorICogXGJyaWVmIEZsYXR0ZW4gYGhpZGxfaGFuZGxlYCBhcyBgRmVuY2VgLgorICoKKyAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBoaWRsX2hhbmRsZWAuCisgKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbixvdXRdIGZkcyBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBmZCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBudW1GZHMgVGhlIHNpemUgb2YgdGhlIGZsYXQgZmQgYnVmZmVyLgorICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCisgKi8KK3N0YXR1c190IGZsYXR0ZW5GZW5jZShoaWRsX2hhbmRsZSBjb25zdCYgZmVuY2UsCisgICAgICAgIHZvaWQqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwgaW50KiYgZmRzLCBzaXplX3QmIG51bUZkcyk7CisKKy8qKgorICogXGJyaWVmIFdyYXAgYEZlbmNlYCBpbiBgaGlkbF9oYW5kbGVgLgorICoKKyAqIFxwYXJhbVtvdXRdIHQgVGhlIHdyYXBwZXIgb2YgdHlwZSBgaGlkbF9oYW5kbGVgLgorICogXHBhcmFtW291dF0gbmggVGhlIG5hdGl2ZSBoYW5kbGUgcG9pbnRlZCB0byBieSBccCB0LgorICogXHBhcmFtW2luXSBsIFRoZSBzb3VyY2UgYEZlbmNlYC4KKyAqCisgKiBPbiBzdWNjZXNzLCBccCBuaCB3aWxsIGhvbGQgYSBuZXdseSBjcmVhdGVkIG5hdGl2ZSBoYW5kbGUsIHdoaWNoIG11c3QgYmUKKyAqIGRlbGV0ZWQgbWFudWFsbHkgd2l0aCBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAgYWZ0ZXJ3YXJkcy4KKyAqLworLy8gd3JhcDogRmVuY2UgLT4gaGlkbF9oYW5kbGUKK2Jvb2wgd3JhcEFzKGhpZGxfaGFuZGxlKiB0LCBuYXRpdmVfaGFuZGxlX3QqKiBuaCwgRmVuY2UgY29uc3QmIGwpOworCisvKioKKyAqIFxicmllZiBDb252ZXJ0IGBoaWRsX2hhbmRsZWAgdG8gYEZlbmNlYC4KKyAqCisgKiBccGFyYW1bb3V0XSBsIFRoZSBkZXN0aW5hdGlvbiBgRmVuY2VgLiBgbGAgbXVzdCBub3QgaGF2ZSBiZWVuIHVzZWQKKyAqIChgbC0+aXNWYWxpZCgpYCBtdXN0IHJldHVybiBgZmFsc2VgKSBiZWZvcmUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuCisgKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgaGlkbF9oYW5kbGVgLgorICoKKyAqIElmIFxwIHQgY29udGFpbnMgYSB2YWxpZCBmaWxlIGRlc2NyaXB0b3IsIGl0IHdpbGwgYmUgZHVwbGljYXRlZC4KKyAqLworLy8gY29udmVydDogaGlkbF9oYW5kbGUgLT4gRmVuY2UKK2Jvb2wgY29udmVydFRvKEZlbmNlKiBsLCBoaWRsX2hhbmRsZSBjb25zdCYgdCk7CisKKy8vIFJlZjogZnJhbWV3b3Jrcy9uYXRpdmUvbGlicy91aS9GZW5jZVRpbWUuY3BwOiBGZW5jZVRpbWU6OlNuYXBzaG90CisKKy8qKgorICogXGJyaWVmIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgbm9uLWZkIGJ1ZmZlciByZXF1aXJlZCB0byBmbGF0dGVuCisgKiBgRmVuY2VUaW1lU25hcHNob3RgLgorICoKKyAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYEZlbmNlVGltZVNuYXBzaG90YC4KKyAqIFxyZXR1cm4gVGhlIHJlcXVpcmVkIHNpemUgb2YgdGhlIGZsYXQgYnVmZmVyLgorICovCitzaXplX3QgZ2V0RmxhdHRlbmVkU2l6ZShIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdCBjb25zdCYgdCk7CisKKy8qKgorICogXGJyaWVmIFJldHVybiB0aGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluCisgKiBgRmVuY2VUaW1lU25hcHNob3RgLgorICoKKyAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYEZlbmNlVGltZVNuYXBzaG90YC4KKyAqIFxyZXR1cm4gVGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbiBccCBzbmFwc2hvdC4KKyAqLworc2l6ZV90IGdldEZkQ291bnQoSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RmVuY2VUaW1lU25hcHNob3QgY29uc3QmIHQpOworCisvKioKKyAqIFxicmllZiBGbGF0dGVuIGBGZW5jZVRpbWVTbmFwc2hvdGAuCisgKgorICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYEZlbmNlVGltZVNuYXBzaG90YC4KKyAqIFxwYXJhbVtpbixvdXRdIGJ1ZmZlciBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgorICogXHBhcmFtW2luLG91dF0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgorICogXHBhcmFtW2luLG91dF0gZmRzIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IGZkIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbixvdXRdIG51bUZkcyBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBmZCBidWZmZXIuCisgKiBccmV0dXJuIGBOT19FUlJPUmAgb24gc3VjY2Vzczsgb3RoZXIgdmFsdWUgb24gZmFpbHVyZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZHVwbGljYXRlIHRoZSBmaWxlIGRlc2NyaXB0b3IgaW4gYHQuZmVuY2VgIGlmIGB0LnN0YXRlID09CisgKiBGRU5DRWAuCisgKi8KK3N0YXR1c190IGZsYXR0ZW4oSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RmVuY2VUaW1lU25hcHNob3QgY29uc3QmIHQsCisgICAgICAgIHZvaWQqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwgaW50KiYgZmRzLCBzaXplX3QmIG51bUZkcyk7CisKKy8qKgorICogXGJyaWVmIFVuZmxhdHRlbiBgRmVuY2VUaW1lU25hcHNob3RgLgorICoKKyAqIFxwYXJhbVtvdXRdIHQgVGhlIGRlc3RpbmF0aW9uIGBGZW5jZVRpbWVTbmFwc2hvdGAuCisgKiBccGFyYW1bb3V0XSBuaCBUaGUgdW5kZXJseWluZyBuYXRpdmUgaGFuZGxlLgorICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBmZHMgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgZmQgYnVmZmVyLgorICogXHBhcmFtW2luLG91dF0gbnVtRmRzIFRoZSBzaXplIG9mIHRoZSBmbGF0IGZkIGJ1ZmZlci4KKyAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgorICoKKyAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgYE5PX0VSUk9SYCBhbmQgdGhlIGNvbnN0cnVjdGVkIHNuYXBzaG90IGNvbnRhaW5zIGEKKyAqIGZpbGUgZGVzY3JpcHRvciwgXHAgbmggd2lsbCBiZSBjcmVhdGVkIHRvIGhvbGQgdGhhdCBmaWxlIGRlc2NyaXB0b3IuIEluIHRoaXMKKyAqIGNhc2UsIFxwIG5oIG5lZWRzIHRvIGJlIGRlbGV0ZWQgd2l0aCBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAgYWZ0ZXJ3YXJkcy4KKyAqLworc3RhdHVzX3QgdW5mbGF0dGVuKAorICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdCogdCwgbmF0aXZlX2hhbmRsZV90KiogbmgsCisgICAgICAgIHZvaWQgY29uc3QqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwgaW50IGNvbnN0KiYgZmRzLCBzaXplX3QmIG51bUZkcyk7CisKKy8vIFJlZjogZnJhbWV3b3Jrcy9uYXRpdmUvbGlicy9ndWkvRnJhbWVUaW1lc3RhbXBzLmNwcDogRnJhbWVFdmVudHNEZWx0YQorCisvKioKKyAqIFxicmllZiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIG5vbi1mZCBidWZmZXIgcmVxdWlyZWQgdG8gZmxhdHRlbgorICogYEZyYW1lRXZlbnRzRGVsdGFgLgorICoKKyAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYEZyYW1lRXZlbnRzRGVsdGFgLgorICogXHJldHVybiBUaGUgcmVxdWlyZWQgc2l6ZSBvZiB0aGUgZmxhdCBidWZmZXIuCisgKi8KK3NpemVfdCBnZXRGbGF0dGVuZWRTaXplKEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRzRGVsdGEgY29uc3QmIHQpOworCisvKioKKyAqIFxicmllZiBSZXR1cm4gdGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbgorICogYEZyYW1lRXZlbnRzRGVsdGFgLgorICoKKyAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYEZyYW1lRXZlbnRzRGVsdGFgLgorICogXHJldHVybiBUaGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluIFxwIHQuCisgKi8KK3NpemVfdCBnZXRGZENvdW50KEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRzRGVsdGEgY29uc3QmIHQpOworCisvKioKKyAqIFxicmllZiBVbmZsYXR0ZW4gYEZyYW1lRXZlbnRzRGVsdGFgLgorICoKKyAqIFxwYXJhbVtvdXRdIHQgVGhlIGRlc3RpbmF0aW9uIGBGcmFtZUV2ZW50c0RlbHRhYC4KKyAqIFxwYXJhbVtvdXRdIG5oIFRoZSB1bmRlcmx5aW5nIGFycmF5IG9mIG5hdGl2ZSBoYW5kbGVzLgorICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBmZHMgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgZmQgYnVmZmVyLgorICogXHBhcmFtW2luLG91dF0gbnVtRmRzIFRoZSBzaXplIG9mIHRoZSBmbGF0IGZkIGJ1ZmZlci4KKyAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgorICoKKyAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgYE5PX0VSUk9SYCwgXHAgbmggd2lsbCBoYXZlIGxlbmd0aCA0LCBhbmQgaXQgd2lsbCBiZQorICogcG9wdWxhdGVkIHdpdGggYG51bGxwdHJgIG9yIG5ld2x5IGNyZWF0ZWQgaGFuZGxlcy4gRWFjaCBub24tbnVsbCBzbG90IGluIFxwCisgKiBuaCB3aWxsIG5lZWQgdG8gYmUgZGVsZXRlZCBtYW51YWxseSB3aXRoIGBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpYC4KKyAqLworc3RhdHVzX3QgdW5mbGF0dGVuKEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRzRGVsdGEqIHQsCisgICAgICAgIHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+KiBuaCwKKyAgICAgICAgdm9pZCBjb25zdComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLCBpbnQgY29uc3QqJiBmZHMsIHNpemVfdCYgbnVtRmRzKTsKKworLyoqCisgKiBcYnJpZWYgRmxhdHRlbiBgRnJhbWVFdmVudHNEZWx0YWAuCisgKgorICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYEZyYW1lRXZlbnRzRGVsdGFgLgorICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBmZHMgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgZmQgYnVmZmVyLgorICogXHBhcmFtW2luLG91dF0gbnVtRmRzIFRoZSBzaXplIG9mIHRoZSBmbGF0IGZkIGJ1ZmZlci4KKyAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBkdXBsaWNhdGUgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4gXHAgdC4KKyAqLworLy8gUmVmOiBmcmFtZXdvcmtzL25hdGl2ZS9saWJzL2d1aS9GcmFtZVRpbWVzdGFtcC5jcHA6CisvLyAgICAgIEZyYW1lRXZlbnRzRGVsdGE6OmZsYXR0ZW4KK3N0YXR1c190IGZsYXR0ZW4oSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudHNEZWx0YSBjb25zdCYgdCwKKyAgICAgICAgdm9pZComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLCBpbnQqJiBmZHMsIHNpemVfdCBudW1GZHMpOworCisvLyBSZWY6IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvZ3VpL0ZyYW1lVGltZXN0YW1wcy5jcHA6IEZyYW1lRXZlbnRIaXN0b3J5RGVsdGEKKworLyoqCisgKiBcYnJpZWYgUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBub24tZmQgYnVmZmVyIHJlcXVpcmVkIHRvIGZsYXR0ZW4KKyAqIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KKyAqCisgKiBccGFyYW1baW5dIHQgVGhlIGlucHV0IGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KKyAqIFxyZXR1cm4gVGhlIHJlcXVpcmVkIHNpemUgb2YgdGhlIGZsYXQgYnVmZmVyLgorICovCitzaXplX3QgZ2V0RmxhdHRlbmVkU2l6ZSgKKyAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YSBjb25zdCYgdCk7CisKKy8qKgorICogXGJyaWVmIFJldHVybiB0aGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluCisgKiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCisgKgorICogXHBhcmFtW2luXSB0IFRoZSBpbnB1dCBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCisgKiBccmV0dXJuIFRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4gXHAgdC4KKyAqLworc2l6ZV90IGdldEZkQ291bnQoCisgICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGEgY29uc3QmIHQpOworCisvKioKKyAqIFxicmllZiBVbmZsYXR0ZW4gYEZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgorICoKKyAqIFxwYXJhbVtvdXRdIHQgVGhlIGRlc3RpbmF0aW9uIGBGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KKyAqIFxwYXJhbVtvdXRdIG5oIFRoZSB1bmRlcmx5aW5nIGFycmF5IG9mIGFycmF5cyBvZiBuYXRpdmUgaGFuZGxlcy4KKyAqIFxwYXJhbVtpbixvdXRdIGJ1ZmZlciBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgorICogXHBhcmFtW2luLG91dF0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgorICogXHBhcmFtW2luLG91dF0gZmRzIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IGZkIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbixvdXRdIG51bUZkcyBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBmZCBidWZmZXIuCisgKiBccmV0dXJuIGBOT19FUlJPUmAgb24gc3VjY2Vzczsgb3RoZXIgdmFsdWUgb24gZmFpbHVyZS4KKyAqCisgKiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIGBOT19FUlJPUmAsIFxwIG5oIHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggYG51bGxwdHJgIG9yCisgKiBuZXdseSBjcmVhdGVkIGhhbmRsZXMuIFRoZSBzZWNvbmQgZGltZW5zaW9uIG9mIFxwIG5oIHdpbGwgYmUgNC4gRWFjaCBub24tbnVsbAorICogc2xvdCBpbiBccCBuaCB3aWxsIG5lZWQgdG8gYmUgZGVsZXRlZCBtYW51YWxseSB3aXRoIGBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpYC4KKyAqLworc3RhdHVzX3QgdW5mbGF0dGVuKAorICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhKiB0LAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiA+KiBuaCwKKyAgICAgICAgdm9pZCBjb25zdComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLCBpbnQgY29uc3QqJiBmZHMsIHNpemVfdCYgbnVtRmRzKTsKKworLyoqCisgKiBcYnJpZWYgRmxhdHRlbiBgRnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCisgKgorICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYEZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgorICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBmZHMgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgZmQgYnVmZmVyLgorICogXHBhcmFtW2luLG91dF0gbnVtRmRzIFRoZSBzaXplIG9mIHRoZSBmbGF0IGZkIGJ1ZmZlci4KKyAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBkdXBsaWNhdGUgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4gXHAgdC4KKyAqLworc3RhdHVzX3QgZmxhdHRlbigKKyAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YSBjb25zdCYgdCwKKyAgICAgICAgdm9pZComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLCBpbnQqJiBmZHMsIHNpemVfdCYgbnVtRmRzKTsKKworLyoqCisgKiBcYnJpZWYgV3JhcCBgOjphbmRyb2lkOjpGcmFtZUV2ZW50SGlzdG9yeURhdGFgIGluCisgKiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCisgKgorICogXHBhcmFtW291dF0gdCBUaGUgd3JhcHBlciBvZiB0eXBlCisgKiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCisgKiBccGFyYW1bb3V0XSBuaCBUaGUgYXJyYXkgb2YgYXJyYXkgb2YgbmF0aXZlIGhhbmRsZXMgdGhhdCBhcmUgcmVmZXJyZWQgdG8gYnkKKyAqIG1lbWJlcnMgb2YgXHAgdC4KKyAqIFxwYXJhbVtpbl0gbCBUaGUgc291cmNlIGA6OmFuZHJvaWQ6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgorICoKKyAqIE9uIHN1Y2Nlc3MsIGVhY2ggbWVtYmVyIG9mIFxwIG5oIHdpbGwgYmUgZWl0aGVyIGBudWxscHRyYCBvciBhIG5ld2x5IGNyZWF0ZWQKKyAqIG5hdGl2ZSBoYW5kbGUuIEFsbCB0aGUgbm9uLWBudWxscHRyYCBlbGVtZW50cyBtdXN0IGJlIGRlbGV0ZWQgaW5kaXZpZHVhbGx5CisgKiB3aXRoIGBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpYC4KKyAqLworYm9vbCB3cmFwQXMoSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YSogdCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4gPiogbmgsCisgICAgICAgIDo6YW5kcm9pZDo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YSBjb25zdCYgbCk7CisKKy8qKgorICogXGJyaWVmIENvbnZlcnQgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgIHRvCisgKiBgOjphbmRyb2lkOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KKyAqCisgKiBccGFyYW1bb3V0XSBsIFRoZSBkZXN0aW5hdGlvbiBgOjphbmRyb2lkOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KKyAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZHVwbGljYXRlIGFsbCBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbiBccCB0LgorICovCitib29sIGNvbnZlcnRUbygKKyAgICAgICAgOjphbmRyb2lkOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhKiBsLAorICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhIGNvbnN0JiB0KTsKKworLy8gUmVmOiBmcmFtZXdvcmtzL25hdGl2ZS9saWJzL3VpL1JlZ2lvbi5jcHAKKworLyoqCisgKiBcYnJpZWYgUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgcmVxdWlyZWQgdG8gZmxhdHRlbiBgUmVnaW9uYC4KKyAqCisgKiBccGFyYW1baW5dIHQgVGhlIGlucHV0IGBSZWdpb25gLgorICogXHJldHVybiBUaGUgcmVxdWlyZWQgc2l6ZSBvZiB0aGUgZmxhdCBidWZmZXIuCisgKi8KK3NpemVfdCBnZXRGbGF0dGVuZWRTaXplKFJlZ2lvbiBjb25zdCYgdCk7CisKKy8qKgorICogXGJyaWVmIFVuZmxhdHRlbiBgUmVnaW9uYC4KKyAqCisgKiBccGFyYW1bb3V0XSB0IFRoZSBkZXN0aW5hdGlvbiBgUmVnaW9uYC4KKyAqIFxwYXJhbVtpbixvdXRdIGJ1ZmZlciBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IGJ1ZmZlci4KKyAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgorICovCitzdGF0dXNfdCB1bmZsYXR0ZW4oUmVnaW9uKiB0LCB2b2lkIGNvbnN0KiYgYnVmZmVyLCBzaXplX3QmIHNpemUpOworCisvKioKKyAqIFxicmllZiBGbGF0dGVuIGBSZWdpb25gLgorICoKKyAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBSZWdpb25gLgorICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IGJ1ZmZlci4KKyAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgYnVmZmVyLgorICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCisgKi8KK3N0YXR1c190IGZsYXR0ZW4oUmVnaW9uIGNvbnN0JiB0LCB2b2lkKiYgYnVmZmVyLCBzaXplX3QmIHNpemUpOworCisvKioKKyAqIFxicmllZiBDb252ZXJ0IGA6OmFuZHJvaWQ6OlJlZ2lvbmAgdG8gYFJlZ2lvbmAuCisgKgorICogXHBhcmFtW291dF0gdCBUaGUgZGVzdGluYXRpb24gYFJlZ2lvbmAuCisgKiBccGFyYW1baW5dIGwgVGhlIHNvdXJjZSBgOjphbmRyb2lkOjpSZWdpb25gLgorICovCisvLyBjb252ZXJ0OiA6OmFuZHJvaWQ6OlJlZ2lvbiAtPiBSZWdpb24KK2Jvb2wgY29udmVydFRvKFJlZ2lvbiogdCwgOjphbmRyb2lkOjpSZWdpb24gY29uc3QmIGwpOworCisvKioKKyAqIFxicmllZiBDb252ZXJ0IGBSZWdpb25gIHRvIGA6OmFuZHJvaWQ6OlJlZ2lvbmAuCisgKgorICogXHBhcmFtW291dF0gbCBUaGUgZGVzdGluYXRpb24gYDo6YW5kcm9pZDo6UmVnaW9uYC4KKyAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBSZWdpb25gLgorICovCisvLyBjb252ZXJ0OiBSZWdpb24gLT4gOjphbmRyb2lkOjpSZWdpb24KK2Jvb2wgY29udmVydFRvKDo6YW5kcm9pZDo6UmVnaW9uKiBsLCBSZWdpb24gY29uc3QmIHQpOworCisvLyBSZWY6IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvZ3VpL0JHcmFwaGljQnVmZmVyUHJvZHVjZXIuY3BwOgorLy8gICAgICBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0CisKKy8qKgorICogXGJyaWVmIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIHJlcXVpcmVkIHRvIGZsYXR0ZW4KKyAqIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KKyAqCisgKiBccGFyYW1baW5dIHQgVGhlIGlucHV0IGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KKyAqIFxyZXR1cm4gVGhlIHJlcXVpcmVkIHNpemUgb2YgdGhlIGZsYXQgYnVmZmVyLgorICovCitzaXplX3QgZ2V0RmxhdHRlbmVkU2l6ZShIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0IGNvbnN0JiB0KTsKKworLyoqCisgKiBcYnJpZWYgUmV0dXJuIHRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4KKyAqIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KKyAqCisgKiBccGFyYW1baW5dIHQgVGhlIGlucHV0IGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KKyAqIFxyZXR1cm4gVGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbiBccCB0LgorICovCitzaXplX3QgZ2V0RmRDb3VudCgKKyAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCBjb25zdCYgdCk7CisvKioKKyAqIFxicmllZiBGbGF0dGVuIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KKyAqCisgKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCisgKiBccGFyYW1bb3V0XSBuaCBUaGUgbmF0aXZlIGhhbmRsZSBjbG9uZWQgZnJvbSBgdC5mZW5jZWAuCisgKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbixvdXRdIGZkcyBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBmZCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBudW1GZHMgVGhlIHNpemUgb2YgdGhlIGZsYXQgZmQgYnVmZmVyLgorICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGR1cGxpY2F0ZSB0aGUgZmlsZSBkZXNjcmlwdG9yIGluIGB0LmZlbmNlYC4gKi8KK3N0YXR1c190IGZsYXR0ZW4oSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCBjb25zdCYgdCwKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90KiogbmgsCisgICAgICAgIHZvaWQqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwgaW50KiYgZmRzLCBzaXplX3QmIG51bUZkcyk7CisKKy8qKgorICogXGJyaWVmIFVuZmxhdHRlbiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCisgKgorICogXHBhcmFtW291dF0gdCBUaGUgZGVzdGluYXRpb24gYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgorICogXHBhcmFtW291dF0gbmggVGhlIHVuZGVybHlpbmcgbmF0aXZlIGhhbmRsZSBmb3IgYHQtPmZlbmNlYC4KKyAqIFxwYXJhbVtpbixvdXRdIGJ1ZmZlciBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgorICogXHBhcmFtW2luLG91dF0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgorICogXHBhcmFtW2luLG91dF0gZmRzIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IGZkIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbixvdXRdIG51bUZkcyBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBmZCBidWZmZXIuCisgKiBccmV0dXJuIGBOT19FUlJPUmAgb24gc3VjY2Vzczsgb3RoZXIgdmFsdWUgb24gZmFpbHVyZS4KKyAqCisgKiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIGBOT19FUlJPUmAgYW5kIGB0LT5mZW5jZWAgY29udGFpbnMgYSB2YWxpZCBmaWxlCisgKiBkZXNjcmlwdG9yLCBccCBuaCB3aWxsIGJlIGEgbmV3bHkgY3JlYXRlZCBuYXRpdmUgaGFuZGxlIGhvbGRpbmcgdGhhdCBmaWxlCisgKiBkZXNjcmlwdG9yLiBccCBuaCBuZWVkcyB0byBiZSBkZWxldGVkIHdpdGggYG5hdGl2ZV9oYW5kbGVfZGVsZXRlKClgCisgKiBhZnRlcndhcmRzLgorICovCitzdGF0dXNfdCB1bmZsYXR0ZW4oCisgICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQqIHQsIG5hdGl2ZV9oYW5kbGVfdCoqIG5oLAorICAgICAgICB2b2lkIGNvbnN0KiYgYnVmZmVyLCBzaXplX3QmIHNpemUsIGludCBjb25zdComIGZkcywgc2l6ZV90JiBudW1GZHMpOworCisvKioKKyAqIFxicmllZiBXcmFwIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YCBpbgorICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgorICoKKyAqIFxwYXJhbVtvdXRdIHQgVGhlIHdyYXBwZXIgb2YgdHlwZQorICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgorICogXHBhcmFtW291dF0gbmggVGhlIHVuZGVybHlpbmcgbmF0aXZlIGhhbmRsZSBmb3IgYHQtPmZlbmNlYC4KKyAqIFxwYXJhbVtpbl0gbCBUaGUgc291cmNlIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KKyAqCisgKiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIGB0cnVlYCBhbmQgYHQtPmZlbmNlYCBjb250YWlucyBhIHZhbGlkIGZpbGUKKyAqIGRlc2NyaXB0b3IsIFxwIG5oIHdpbGwgYmUgYSBuZXdseSBjcmVhdGVkIG5hdGl2ZSBoYW5kbGUgaG9sZGluZyB0aGF0IGZpbGUKKyAqIGRlc2NyaXB0b3IuIFxwIG5oIG5lZWRzIHRvIGJlIGRlbGV0ZWQgd2l0aCBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAKKyAqIGFmdGVyd2FyZHMuCisgKi8KK2Jvb2wgd3JhcEFzKAorICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0KiB0LAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QqKiBuaCwKKyAgICAgICAgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCBjb25zdCYgbCk7CisKKy8qKgorICogXGJyaWVmIENvbnZlcnQgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgIHRvCisgKiBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCisgKgorICogXHBhcmFtW291dF0gbCBUaGUgZGVzdGluYXRpb24gYEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgorICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgorICoKKyAqIElmIGB0LmZlbmNlYCBoYXMgYSB2YWxpZCBmaWxlIGRlc2NyaXB0b3IsIGl0IHdpbGwgYmUgZHVwbGljYXRlZC4KKyAqLworYm9vbCBjb252ZXJ0VG8oCisgICAgICAgIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQqIGwsCisgICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQgY29uc3QmIHQpOworCisvLyBSZWY6IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvZ3VpL0JHcmFwaGljQnVmZmVyUHJvZHVjZXIuY3BwOgorLy8gICAgICBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dAorCisvKioKKyAqIFxicmllZiBXcmFwIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dGAgaW4KKyAqIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dGAuCisgKgorICogXHBhcmFtW291dF0gdCBUaGUgd3JhcHBlciBvZiB0eXBlCisgKiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXRgLgorICogXHBhcmFtW291dF0gbmggVGhlIGFycmF5IG9mIGFycmF5IG9mIG5hdGl2ZSBoYW5kbGVzIHRoYXQgYXJlIHJlZmVycmVkIHRvIGJ5CisgKiBtZW1iZXJzIG9mIFxwIHQuCisgKiBccGFyYW1baW5dIGwgVGhlIHNvdXJjZSBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXRgLgorICoKKyAqIE9uIHN1Y2Nlc3MsIGVhY2ggbWVtYmVyIG9mIFxwIG5oIHdpbGwgYmUgZWl0aGVyIGBudWxscHRyYCBvciBhIG5ld2x5IGNyZWF0ZWQKKyAqIG5hdGl2ZSBoYW5kbGUuIEFsbCB0aGUgbm9uLWBudWxscHRyYCBlbGVtZW50cyBtdXN0IGJlIGRlbGV0ZWQgaW5kaXZpZHVhbGx5CisgKiB3aXRoIGBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpYC4KKyAqLworLy8gd3JhcDogQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQgLT4KKy8vIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0Citib29sIHdyYXBBcyhIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dCogdCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4gPiogbmgsCisgICAgICAgIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0IGNvbnN0JiBsKTsKKworLyoqCisgKiBcYnJpZWYgQ29udmVydCBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXRgIHRvCisgKiBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXRgLgorICoKKyAqIFxwYXJhbVtvdXRdIGwgVGhlIGRlc3RpbmF0aW9uIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dGAuCisgKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXRgLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBkdXBsaWNhdGUgYWxsIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluIFxwIHQuCisgKi8KKy8vIGNvbnZlcnQ6IEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0IC0+CisvLyBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dAorYm9vbCBjb252ZXJ0VG8oCisgICAgICAgIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0KiBsLAorICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dCBjb25zdCYgdCk7CisKKy8qKgorICogXGJyaWVmIENvbnZlcnQgYEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlYCB0bworICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlYC4KKyAqCisgKiBccGFyYW1baW5dIGwgVGhlIHNvdXJjZSBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGVgLgorICogXHJldHVybiBUaGUgY29ycmVzcG9uZGluZyBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGVgLgorICovCitIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZSB0b0hpZGxEaXNjb25uZWN0TW9kZSgKKyAgICAgICAgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGUgbCk7CisKKy8qKgorICogXGJyaWVmIENvbnZlcnQgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlYCB0bworICogYEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlYC4KKyAqCisgKiBccGFyYW1baW5dIGwgVGhlIHNvdXJjZSBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGVgLgorICogXHJldHVybiBUaGUgY29ycmVzcG9uZGluZyBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGVgLgorICovCitCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZSB0b0d1aURpc2Nvbm5lY3RNb2RlKAorICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZSB0KTsKKworfSAgLy8gbmFtZXNwYWNlIGNvbnZlcnNpb24KK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfU1RBR0VGUklHSFRfQlFIRUxQRVJfQ09OVkVSU0lPTl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9GcmFtZURyb3BwZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvRnJhbWVEcm9wcGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU4MzA1OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvRnJhbWVEcm9wcGVyLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgRlJBTUVfRFJPUFBFUl9IXworCisjZGVmaW5lIEZSQU1FX0RST1BQRVJfSF8KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgRnJhbWVEcm9wcGVyIDogcHVibGljIFJlZkJhc2UgeworICAgIC8vIE5vIGZyYW1lcyB3aWxsIGJlIGRyb3BwZWQgdW50aWwgYSB2YWxpZCBtYXggZnJhbWUgcmF0ZSBpcyBzZXQuCisgICAgRnJhbWVEcm9wcGVyKCk7CisKKyAgICAvLyBtYXhGcmFtZVJhdGUgcmVxdWlyZWQgdG8gYmUgcG9zaXRpdmUuCisgICAgc3RhdHVzX3Qgc2V0TWF4RnJhbWVSYXRlKGZsb2F0IG1heEZyYW1lUmF0ZSk7CisKKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1heCBmcmFtZSByYXRlIGhhcyBub3QgYmVlbiBzZXQgdmlhIHNldE1heEZyYW1lUmF0ZS4KKyAgICBib29sIHNob3VsZERyb3AoaW50NjRfdCB0aW1lVXMpOworCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIGFsbCBmcmFtZSBkcm9wIGxvZ2ljIHNob3VsZCBiZSBkaXNhYmxlZC4KKyAgICBib29sIGRpc2FibGVkKCkgeyByZXR1cm4gKG1NaW5JbnRlcnZhbFVzID09IC0xbGwpOyB9CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5GcmFtZURyb3BwZXIoKTsKKworcHJpdmF0ZToKKyAgICBpbnQ2NF90IG1EZXNpcmVkTWluVGltZVVzOworICAgIGludDY0X3QgbU1pbkludGVydmFsVXM7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhGcmFtZURyb3BwZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBGUkFNRV9EUk9QUEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL0dyYXBoaWNCdWZmZXJTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvR3JhcGhpY0J1ZmZlclNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiYzg5MTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL0dyYXBoaWNCdWZmZXJTb3VyY2UuaApAQCAtMCwwICsxLDQ5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgR1JBUEhJQ19CVUZGRVJfU09VUkNFX0hfCisKKyNkZWZpbmUgR1JBUEhJQ19CVUZGRVJfU09VUkNFX0hfCisKKyNpbmNsdWRlIDxiaW5kZXIvU3RhdHVzLmg+CisjaW5jbHVkZSA8Z3VpL0J1ZmZlclF1ZXVlLmg+CisjaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9WaWRlb0FQSS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyUmVmbGVjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvQ29tcG9uZW50V3JhcHBlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM7CisKK3N0cnVjdCBGcmFtZURyb3BwZXI7CisKKy8qCisgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gZmVlZCBjb2RlY3MgZnJvbSBhIFN1cmZhY2UgdmlhIEJ1ZmZlclF1ZXVlIG9yCisgKiBIVyBwcm9kdWNlci4KKyAqCisgKiBJbnN0YW5jZXMgb2YgdGhlIGNsYXNzIGRvbid0IHJ1biBvbiBhIGRlZGljYXRlZCB0aHJlYWQuICBJbnN0ZWFkLAorICogdmFyaW91cyBldmVudHMgdHJpZ2dlciBkYXRhIG1vdmVtZW50OgorICoKKyAqICAtIEF2YWlsYWJpbGl0eSBvZiBhIG5ldyBmcmFtZSBvZiBkYXRhIGZyb20gdGhlIEJ1ZmZlclF1ZXVlIChub3RpZmllZAorICogICAgdmlhIHRoZSBvbkZyYW1lQXZhaWxhYmxlIGNhbGxiYWNrKS4KKyAqICAtIFRoZSByZXR1cm4gb2YgYSBjb2RlYyBidWZmZXIuCisgKiAgLSBBcHBsaWNhdGlvbiBzaWduYWxpbmcgZW5kLW9mLXN0cmVhbS4KKyAqICAtIFRyYW5zaXRpb24gdG8gb3IgZnJvbSAiZXhlY3V0aW5nIiBzdGF0ZS4KKyAqCisgKiBGcmFtZXMgb2YgZGF0YSAoYW5kLCBwZXJoYXBzLCB0aGUgZW5kLW9mLXN0cmVhbSBpbmRpY2F0aW9uKSBjYW4gYXJyaXZlCisgKiBiZWZvcmUgdGhlIGNvZGVjIGlzIGluIHRoZSAiZXhlY3V0aW5nIiBzdGF0ZSwgc28gd2UgbmVlZCB0byBxdWV1ZQorICogdGhpbmdzIHVwIHVudGlsIHdlJ3JlIHJlYWR5IHRvIGdvLgorICoKKyAqIFRoZSBHcmFwaGljQnVmZmVyU291cmNlIGNhbiBiZSBjb25maWd1cmUgZHluYW1pY2FsbHkgdG8gZGlzY2FyZCBmcmFtZXMKKyAqIGZyb20gdGhlIHNvdXJjZToKKyAqCisgKiAtIGlmIHRoZWlyIHRpbWVzdGFtcCBpcyBsZXNzIHRoYW4gYSBzdGFydCB0aW1lCisgKiAtIGlmIHRoZSBzb3VyY2UgaXMgc3VzcGVuZGVkIG9yIHN0b3BwZWQgYW5kIHRoZSBzdXNwZW5kL3N0b3AtdGltZSBpcyByZWFjaGVkCisgKiAtIGlmIEVPUyB3YXMgc2lnbmFsZWQKKyAqIC0gaWYgdGhlcmUgaXMgbm8gZW5jb2RlciBjb25uZWN0ZWQgdG8gaXQKKyAqCisgKiBUaGUgc291cmNlLCBmdXJ0aGVybW9yZSwgbWF5IGNob29zZSB0byBub3QgZW5jb2RlIChkcm9wKSBmcmFtZXMgaWY6CisgKgorICogLSB0byB0aHJvdHRsZSB0aGUgZnJhbWUgcmF0ZSAoa2VlcCBpdCB1bmRlciBhIGNlcnRhaW4gbGltaXQpCisgKgorICogRmluYWxseSB0aGUgc291cmNlIG1heSBvcHRpb25hbGx5IGhvbGQgb250byB0aGUgbGFzdCBub24tZGlzY2FyZGVkIGZyYW1lCisgKiAoZXZlbiBpZiBpdCB3YXMgZHJvcHBlZCkgdG8gcmVlbmNvZGUgaXQgYWZ0ZXIgYW4gaW50ZXJ2YWwgaWYgbm8gZnVydGhlcgorICogZnJhbWVzIGFyZSBzZW50IGJ5IHRoZSBwcm9kdWNlci4KKyAqLworY2xhc3MgR3JhcGhpY0J1ZmZlclNvdXJjZSA6IHB1YmxpYyBCdWZmZXJRdWV1ZTo6Q29uc3VtZXJMaXN0ZW5lciB7CitwdWJsaWM6CisgICAgR3JhcGhpY0J1ZmZlclNvdXJjZSgpOworCisgICAgdmlydHVhbCB+R3JhcGhpY0J1ZmZlclNvdXJjZSgpOworCisgICAgLy8gV2UgY2FuJ3QgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBjb25zdHJ1Y3RvciBmYWlscywgc28gd2UganVzdCBzZXQKKyAgICAvLyB0aGlzIGFuZCByZXF1aXJlIHRoYXQgdGhlIGNhbGxlciB0ZXN0IHRoZSB2YWx1ZS4KKyAgICBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIC8vIFJldHVybnMgdGhlIGhhbmRsZSB0byB0aGUgcHJvZHVjZXIgc2lkZSBvZiB0aGUgQnVmZmVyUXVldWUuICBCdWZmZXJzCisgICAgLy8gcXVldWVkIG9uIHRoaXMgd2lsbCBiZSByZWNlaXZlZCBieSBHcmFwaGljQnVmZmVyU291cmNlLgorICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUHJvZHVjZXI7CisgICAgfQorCisgICAgLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiBjb21wb25lbnQgdHJhbnNpdGlvbnMgdG8gcnVubmluZyBzdGF0ZSwgd2hpY2ggbWVhbnMKKyAgICAvLyB3ZSBjYW4gc3RhcnQgaGFuZGluZyBpdCBidWZmZXJzLiAgSWYgd2UgYWxyZWFkeSBoYXZlIGJ1ZmZlcnMgb2YgZGF0YQorICAgIC8vIHNpdHRpbmcgaW4gdGhlIEJ1ZmZlclF1ZXVlLCB0aGlzIHdpbGwgc2VuZCB0aGVtIHRvIHRoZSBjb2RlYy4KKyAgICBTdGF0dXMgc3RhcnQoKTsKKworICAgIC8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gY29tcG9uZW50IHRyYW5zaXRpb25zIHRvIHN0b3BwZWQsIGluZGljYXRpbmcgdGhhdAorICAgIC8vIHRoZSBjb2RlYyBpcyBtZWFudCB0byByZXR1cm4gYWxsIGJ1ZmZlcnMgYmFjayB0byB0aGUgY2xpZW50IGZvciB0aGVtCisgICAgLy8gdG8gYmUgZnJlZWQuIERvIE5PVCBzdWJtaXQgYW55IG1vcmUgYnVmZmVycyB0byB0aGUgY29tcG9uZW50LgorICAgIFN0YXR1cyBzdG9wKCk7CisKKyAgICAvLyBUaGlzIGlzIGNhbGxlZCB3aGVuIGNvbXBvbmVudCB0cmFuc2l0aW9ucyB0byByZWxlYXNlZCwgaW5kaWNhdGluZyB0aGF0CisgICAgLy8gd2UgYXJlIHNodXR0aW5nIGRvd24uCisgICAgU3RhdHVzIHJlbGVhc2UoKTsKKworICAgIC8vIEEgImNvZGVjIGJ1ZmZlciIsIGkuZS4gYSBidWZmZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBwYXNzIGRhdGEgaW50bworICAgIC8vIHRoZSBlbmNvZGVyLCBoYXMgYmVlbiBhbGxvY2F0ZWQuICAoVGhpcyBjYWxsIGRvZXMgbm90IGNhbGwgYmFjayBpbnRvCisgICAgLy8gY29tcG9uZW50LikKKyAgICBTdGF0dXMgb25JbnB1dEJ1ZmZlckFkZGVkKGludDMyX3QgYnVmZmVySWQpOworCisgICAgLy8gQ2FsbGVkIHdoZW4gZW5jb2RlciBpcyBubyBsb25nZXIgdXNpbmcgdGhlIGJ1ZmZlci4gIElmIHdlIGhhdmUgYSBCUQorICAgIC8vIGJ1ZmZlciBhdmFpbGFibGUsIGZpbGwgaXQgd2l0aCBhIG5ldyBmcmFtZSBvZiBkYXRhOyBvdGhlcndpc2UsIGp1c3QgbWFyaworICAgIC8vIGl0IGFzIGF2YWlsYWJsZS4KKyAgICBTdGF0dXMgb25JbnB1dEJ1ZmZlckVtcHRpZWQoaW50MzJfdCBidWZmZXJJZCwgaW50IGZlbmNlRmQpOworCisgICAgLy8gSUdyYXBoaWNCdWZmZXJTb3VyY2UgaW50ZXJmYWNlCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvLyBDb25maWd1cmUgdGhlIGJ1ZmZlciBzb3VyY2UgdG8gYmUgdXNlZCB3aXRoIGEgY29tcG9uZW50IHdpdGggdGhlIGRlZmF1bHQKKyAgICAvLyBkYXRhIHNwYWNlLgorICAgIHN0YXR1c190IGNvbmZpZ3VyZSgKKyAgICAgICAgY29uc3Qgc3A8Q29tcG9uZW50V3JhcHBlcj4gJmNvbXBvbmVudCwKKyAgICAgICAgaW50MzJfdCBkYXRhU3BhY2UsCisgICAgICAgIGludDMyX3QgYnVmZmVyQ291bnQsCisgICAgICAgIHVpbnQzMl90IGZyYW1lV2lkdGgsCisgICAgICAgIHVpbnQzMl90IGZyYW1lSGVpZ2h0LAorICAgICAgICB1aW50MzJfdCBjb25zdW1lclVzYWdlKTsKKworICAgIC8vIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHRoZSBsYXN0IGlucHV0IGZyYW1lIGhhcyBiZWVuIHN1Ym1pdHRlZCBvciBidWZmZXIKKyAgICAvLyB0aW1lc3RhbXAgaXMgZ3JlYXRlciBvciBlcXVhbCB0aGFuIHN0b3BUaW1lVXMuIFdlIG5lZWQgdG8gc3VibWl0IGFuIGVtcHR5CisgICAgLy8gYnVmZmVyIHdpdGggdGhlIEVPUyBmbGFnIHNldC4gIElmIHdlIGRvbid0IGhhdmUgYSBjb2RlYyBidWZmZXIgcmVhZHksCisgICAgLy8gd2UganVzdCBzZXQgdGhlIG1FbmRPZlN0cmVhbSBmbGFnLgorICAgIHN0YXR1c190IHNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKTsKKworICAgIC8vIElmIHN1c3BlbmQgaXMgdHJ1ZSwgYWxsIGluY29taW5nIGJ1ZmZlcnMgKGluY2x1ZGluZyB0aG9zZSBjdXJyZW50bHkKKyAgICAvLyBpbiB0aGUgQnVmZmVyUXVldWUpIHdpdGggdGltZXN0YW1wIGxhcmdlciB0aGFuIHRpbWVVcyB3aWxsIGJlIGRpc2NhcmRlZAorICAgIC8vIHVudGlsIHRoZSBzdXNwZW5zaW9uIGlzIGxpZnRlZC4gSWYgc3VzcGVuZCBpcyBmYWxzZSwgYWxsIGluY29taW5nIGJ1ZmZlcnMKKyAgICAvLyBpbmNsdWRpbmcgdGhvc2UgY3VycmVudGx5IGluIHRoZSBCdWZmZXJRdWV1ZSkgd2l0aCB0aW1lc3RhbXAgbGFyZ2VyIHRoYW4KKyAgICAvLyB0aW1lVXMgd2lsbCBiZSBwcm9jZXNzZWQuIHRpbWVVcyB1c2VzIFNZU1RFTV9USU1FX01PTk9UT05JQyB0aW1lIGJhc2UuCisgICAgc3RhdHVzX3Qgc2V0U3VzcGVuZChib29sIHN1c3BlbmQsIGludDY0X3QgdGltZVVzKTsKKworICAgIC8vIFNwZWNpZmllcyB0aGUgaW50ZXJ2YWwgYWZ0ZXIgd2hpY2ggd2UgcmVxdWV1ZSB0aGUgYnVmZmVyIHByZXZpb3VzbHkKKyAgICAvLyBxdWV1ZWQgdG8gdGhlIGVuY29kZXIuIFRoaXMgaXMgdXNlZnVsIGluIHRoZSBjYXNlIG9mIHN1cmZhY2UgZmxpbmdlcgorICAgIC8vIHByb3ZpZGluZyB0aGUgaW5wdXQgc3VyZmFjZSBpZiB0aGUgcmVzdWx0aW5nIGVuY29kZWQgc3RyZWFtIGlzIHRvCisgICAgLy8gYmUgZGlzcGxheWVkICJsaXZlIi4gSWYgd2Ugd2VyZSBub3QgdG8gcHVzaCB0aHJvdWdoIHRoZSBleHRyYSBmcmFtZQorICAgIC8vIHRoZSBkZWNvZGVyIG9uIHRoZSByZW1vdGUgZW5kIHdvdWxkIGJlIHVuYWJsZSB0byBkZWNvZGUgdGhlIGxhdGVzdCBmcmFtZS4KKyAgICAvLyBUaGlzIEFQSSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgdHJhbnNpdGlvbmluZyB0aGUgZW5jb2RlciB0byAiZXhlY3V0aW5nIgorICAgIC8vIHN0YXRlIGFuZCBvbmNlIHRoaXMgYmVoYXZpb3VyIGlzIHNwZWNpZmllZCBpdCBjYW5ub3QgYmUgcmVzZXQuCisgICAgc3RhdHVzX3Qgc2V0UmVwZWF0UHJldmlvdXNGcmFtZURlbGF5VXMoaW50NjRfdCByZXBlYXRBZnRlclVzKTsKKworICAgIC8vIFNldHMgdGhlIGlucHV0IGJ1ZmZlciB0aW1lc3RhbXAgb2Zmc2V0LgorICAgIC8vIFdoZW4gc2V0LCB0aGUgc2FtcGxlJ3MgdGltZXN0YW1wIHdpbGwgYmUgYWRqdXN0ZWQgd2l0aCB0aGUgdGltZU9mZnNldFVzLgorICAgIHN0YXR1c190IHNldFRpbWVPZmZzZXRVcyhpbnQ2NF90IHRpbWVPZmZzZXRVcyk7CisKKyAgICAvKgorICAgICAqIFNldCB0aGUgbWF4aW11bSBmcmFtZSByYXRlIG9uIHRoZSBzb3VyY2UuCisgICAgICoKKyAgICAgKiBXaGVuIG1heEZwcyBpcyBhIHBvc2l0aXZlIG51bWJlciwgaXQgaW5kaWNhdGVzIHRoZSBtYXhpbXVtIHJhdGUgYXQgd2hpY2gKKyAgICAgKiB0aGUgYnVmZmVycyBmcm9tIHRoaXMgc291cmNlIHdpbGwgYmUgc2VudCB0byB0aGUgZW5jb2Rlci4gRXhjZXNzaXZlCisgICAgICogZnJhbWVzIHdpbGwgYmUgZHJvcHBlZCB0byBtZWV0IHRoZSBmcmFtZSByYXRlIHJlcXVpcmVtZW50LgorICAgICAqCisgICAgICogV2hlbiBtYXhGcHMgaXMgYSBuZWdhdGl2ZSBudW1iZXIsIGFueSBmcmFtZSBkcm9wIGxvZ2ljIHdpbGwgYmUgZGlzYWJsZWQKKyAgICAgKiBhbmQgYWxsIGZyYW1lcyBmcm9tIHRoaXMgc291cmNlIHdpbGwgYmUgc2VudCB0byB0aGUgZW5jb2RlciwgZXZlbiB3aGVuCisgICAgICogdGhlIHRpbWVzdGFtcCBnb2VzIGJhY2t3YXJkcy4gTm90ZSB0aGF0IHNvbWUgY29tcG9uZW50cyBtYXkgc3RpbGwgZHJvcAorICAgICAqIG91dC1vZi1vcmRlciBmcmFtZXMgc2lsZW50bHksIHNvIHRoaXMgdXN1YWxseSBoYXMgdG8gYmUgdXNlZCBpbgorICAgICAqIGNvbmp1bmN0aW9uIHdpdGggT01YTm9kZUluc3RhbmNlOjpzZXRNYXhQdHNHYXBVcygpIHdvcmthcm91bmQuCisgICAgICoKKyAgICAgKiBXaGVuIG1heEZwcyBpcyAwLCB0aGlzIGNhbGwgd2lsbCBmYWlsIHdpdGggQkFEX1ZBTFVFLgorICAgICAqLworICAgIHN0YXR1c190IHNldE1heEZwcyhmbG9hdCBtYXhGcHMpOworCisgICAgLy8gU2V0cyB0aGUgdGltZSBsYXBzZSAob3Igc2xvdyBtb3Rpb24pIHBhcmFtZXRlcnMuCisgICAgLy8gV2hlbiBzZXQsIHRoZSBzYW1wbGUncyB0aW1lc3RhbXAgd2lsbCBiZSBtb2RpZmllZCB0byBwbGF5YmFjayBmcmFtZXJhdGUsCisgICAgLy8gYW5kIGNhcHR1cmUgdGltZXN0YW1wIHdpbGwgYmUgbW9kaWZpZWQgdG8gY2FwdHVyZSByYXRlLgorICAgIHN0YXR1c190IHNldFRpbWVMYXBzZUNvbmZpZyhkb3VibGUgZnBzLCBkb3VibGUgY2FwdHVyZUZwcyk7CisKKyAgICAvLyBTZXRzIHRoZSBzdGFydCB0aW1lIHVzIChpbiBzeXN0ZW0gdGltZSksIHNhbXBsZXMgYmVmb3JlIHdoaWNoIHNob3VsZAorICAgIC8vIGJlIGRyb3BwZWQgYW5kIG5vdCBzdWJtaXR0ZWQgdG8gZW5jb2RlcgorICAgIHN0YXR1c190IHNldFN0YXJ0VGltZVVzKGludDY0X3Qgc3RhcnRUaW1lVXMpOworCisgICAgLy8gU2V0cyB0aGUgc3RvcCB0aW1lIHVzIChpbiBzeXN0ZW0gdGltZSksIHNhbXBsZXMgYWZ0ZXIgd2hpY2ggc2hvdWxkIGJlIGRyb3BwZWQKKyAgICAvLyBhbmQgbm90IHN1Ym1pdHRlZCB0byBlbmNvZGVyLiB0aW1lVXMgdXNlcyBTWVNURU1fVElNRV9NT05PVE9OSUMgdGltZSBiYXNlLgorICAgIHN0YXR1c190IHNldFN0b3BUaW1lVXMoaW50NjRfdCBzdG9wVGltZVVzKTsKKworICAgIC8vIEdldHMgdGhlIHN0b3AgdGltZSBvZmZzZXQgaW4gdXMuIFRoaXMgaXMgdGhlIHRpbWUgb2Zmc2V0IGJldHdlZW4gbGF0ZXN0IGJ1ZmZlcgorICAgIC8vIHRpbWUgYW5kIHRoZSBzdG9wVGltZVVzLiBJZiBzdG9wIHRpbWUgaXMgbm90IHNldCwgSU5WQUxJRF9PUEVSQVRJT04gd2lsbCBiZSByZXR1cm5lZC4KKyAgICAvLyBJZiByZXR1cm4gaXMgT0ssICpzdG9wVGltZU9mZnNldFVzIHdpbGwgY29udGFpbiB0aGUgdmFsaWQgb2Zmc2V0LiBPdGhlcndpc2UsCisgICAgLy8gKnN0b3BUaW1lT2Zmc2V0VXMgd2lsbCBub3QgYmUgbW9kaWZpZWQuIFBvc2l0aXZlIHN0b3BUaW1lT2Zmc2V0VXMgbWVhbnMgYnVmZmVyIHRpbWUKKyAgICAvLyBsYXJnZXIgdGhhbiBzdG9wVGltZVVzLgorICAgIHN0YXR1c190IGdldFN0b3BUaW1lT2Zmc2V0VXMoaW50NjRfdCAqc3RvcFRpbWVPZmZzZXRVcyk7CisKKyAgICAvLyBTZXRzIHRoZSBkZXNpcmVkIGNvbG9yIGFzcGVjdHMsIGUuZy4gdG8gYmUgdXNlZCB3aGVuIHByb2R1Y2VyIGRvZXMgbm90IHNwZWNpZnkgYSBkYXRhc3BhY2UuCisgICAgc3RhdHVzX3Qgc2V0Q29sb3JBc3BlY3RzKGludDMyX3QgYXNwZWN0c1BhY2tlZCk7CisKK3Byb3RlY3RlZDoKKyAgICAvLyBCUTo6Q29uc3VtZXJMaXN0ZW5lciBpbnRlcmZhY2UKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8vIEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyIGludGVyZmFjZSwgY2FsbGVkIHdoZW4gYSBuZXcgZnJhbWUgb2YKKyAgICAvLyBkYXRhIGlzIGF2YWlsYWJsZS4gIElmIHdlJ3JlIGV4ZWN1dGluZyBhbmQgYSBjb2RlYyBidWZmZXIgaXMKKyAgICAvLyBhdmFpbGFibGUsIHdlIGFjcXVpcmUgdGhlIGJ1ZmZlciwgY29weSB0aGUgR3JhcGhpY0J1ZmZlciByZWZlcmVuY2UKKyAgICAvLyBpbnRvIHRoZSBjb2RlYyBidWZmZXIsIGFuZCBjYWxsIEVtcHR5W1RoaXNdQnVmZmVyLiAgSWYgd2UncmUgbm90IHlldAorICAgIC8vIGV4ZWN1dGluZyBvciB0aGVyZSdzIG5vIGNvZGVjIGJ1ZmZlciBhdmFpbGFibGUsIHdlIGp1c3QgaW5jcmVtZW50CisgICAgLy8gbU51bUZyYW1lc0F2YWlsYWJsZSBhbmQgcmV0dXJuLgorICAgIHZvaWQgb25GcmFtZUF2YWlsYWJsZShjb25zdCBCdWZmZXJJdGVtJiBpdGVtKSBvdmVycmlkZTsKKworICAgIC8vIEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyIGludGVyZmFjZSwgY2FsbGVkIHdoZW4gdGhlIGNsaWVudCBoYXMKKyAgICAvLyByZWxlYXNlZCBvbmUgb3IgbW9yZSBHcmFwaGljQnVmZmVycy4gIFdlIGNsZWFyIG91dCB0aGUgYXBwcm9wcmlhdGUKKyAgICAvLyBzZXQgb2YgbUJ1ZmZlclNsb3QgZW50cmllcy4KKyAgICB2b2lkIG9uQnVmZmVyc1JlbGVhc2VkKCkgb3ZlcnJpZGU7CisKKyAgICAvLyBCdWZmZXJRdWV1ZTo6Q29uc3VtZXJMaXN0ZW5lciBpbnRlcmZhY2UsIGNhbGxlZCB3aGVuIHRoZSBjbGllbnQgaGFzCisgICAgLy8gY2hhbmdlZCB0aGUgc2lkZWJhbmQgc3RyZWFtLiBHcmFwaGljQnVmZmVyU291cmNlIGRvZXNuJ3QgaGFuZGxlIHNpZGViYW5kCisgICAgLy8gc3RyZWFtcyBzbyB0aGlzIGlzIGEgbm8tb3AgKGFuZCBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkKS4KKyAgICB2b2lkIG9uU2lkZWJhbmRTdHJlYW1DaGFuZ2VkKCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgLy8gTG9jaywgY292ZXJzIGFsbCBtZW1iZXIgdmFyaWFibGVzLgorICAgIG11dGFibGUgTXV0ZXggbU11dGV4OworCisgICAgLy8gVXNlZCB0byByZXBvcnQgY29uc3RydWN0b3IgZmFpbHVyZS4KKyAgICBzdGF0dXNfdCBtSW5pdENoZWNrOworCisgICAgLy8gR3JhcGhpYyBidWZmZXIgcmVmZXJlbmNlIG9iamVjdHMKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLy8gVGhlc2UgYXJlIHVzZWQgdG8ga2VlcCBhIHNoYXJlZCByZWZlcmVuY2UgdG8gR3JhcGhpY0J1ZmZlcnMgYW5kIGdyYWxsb2MgaGFuZGxlcyBvd25lZCBieSB0aGUKKyAgICAvLyBHcmFwaGljQnVmZmVyU291cmNlIGFzIHdlbGwgYXMgdG8gbWFuYWdlIHRoZSBjYWNoZSBzbG90cy4gU2VwYXJhdGUgcmVmZXJlbmNlcyBhcmUgb3duZWQgYnkKKyAgICAvLyB0aGUgYnVmZmVyIGNhY2hlIChjb250cm9sbGVkIGJ5IHRoZSBidWZmZXIgcXVldWUvYnVmZmVyIHByb2R1Y2VyKSBhbmQgdGhlIGNvZGVjLgorCisgICAgLy8gV2hlbiB3ZSBnZXQgYSBidWZmZXIgZnJvbSB0aGUgcHJvZHVjZXIgKEJRKSBpdCBkZXNpZ25hdGVzIHRoZW0gdG8gYmUgY2FjaGVkIGludG8gc3BlY2lmaWMKKyAgICAvLyBzbG90cy4gRWFjaCBzbG90IG93bnMgYSBzaGFyZWQgcmVmZXJlbmNlIHRvIHRoZSBncmFwaGljIGJ1ZmZlciAod2UgdHJhY2sgdGhlc2UgdXNpbmcKKyAgICAvLyBDYWNoZWRCdWZmZXIpIHRoYXQgaXMgaW4gdGhhdCBzbG90LCBidXQgdGhlIHByb2R1Y2VyIGNvbnRyb2xzIHRoZSBzbG90cy4KKyAgICBzdHJ1Y3QgQ2FjaGVkQnVmZmVyOworCisgICAgLy8gV2hlbiB3ZSBhY3F1aXJlIGEgYnVmZmVyLCB3ZSBtdXN0IHJlbGVhc2UgaXQgYmFjayB0byB0aGUgcHJvZHVjZXIgb25jZSB3ZSAob3IgdGhlIGNvZGVjKQorICAgIC8vIG5vIGxvbmdlciB1c2VzIGl0IChhcyBsb25nIGFzIHRoZSBidWZmZXIgaXMgc3RpbGwgaW4gdGhlIGNhY2hlIHNsb3QpLiBXZSB1c2Ugc2hhcmVkCisgICAgLy8gQWNxdWlyZWRCdWZmZXIgaW5zdGFuY2VzIGZvciB0aGlzIHB1cnBvc2UgLSBhbmQgd2UgY2FsbCByZWxlYXNlIGJ1ZmZlciB3aGVuIHRoZSBsYXN0CisgICAgLy8gcmVmZXJlbmNlIGlzIHJlbGlucXVpc2hlZC4KKyAgICBzdHJ1Y3QgQWNxdWlyZWRCdWZmZXI7CisKKyAgICAvLyBXZSBhbHNvIG5lZWQgdG8ga2VlcCBzb21lIGV4dHJhIG1ldGFkYXRhIChvdGhlciB0aGFuIHRoZSBidWZmZXIgcmVmZXJlbmNlKSBmb3IgYWNxdWlyZWQKKyAgICAvLyBidWZmZXJzLiBUaGVzZSBhcmUgdHJhY2tlZCBpbiBWaWRlb0J1ZmZlciBzdHJ1Y3QuCisgICAgc3RydWN0IFZpZGVvQnVmZmVyIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEFjcXVpcmVkQnVmZmVyPiBtQnVmZmVyOworICAgICAgICBuc2Vjc190IG1UaW1lc3RhbXBOczsKKyAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2VfdCBtRGF0YXNwYWNlOworICAgIH07CisKKyAgICAvLyBDYWNoZWQgYW5kIGFxdWlyZWQgYnVmZmVycworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICB0eXBlZGVmIGludCBzbG90X2lkOworCisgICAgLy8gTWFwcyBhIHNsb3QgdG8gdGhlIGNhY2hlZCBidWZmZXIgaW4gdGhhdCBzbG90CisgICAgS2V5ZWRWZWN0b3I8c2xvdF9pZCwgc3RkOjpzaGFyZWRfcHRyPENhY2hlZEJ1ZmZlcj4+IG1CdWZmZXJTbG90czsKKworICAgIC8vIFF1ZXVlIG9mIGJ1ZmZlcnMgYWNxdWlyZWQgaW4gY2hyb25vbG9naWNhbCBvcmRlciB0aGF0IGFyZSBub3QgeWV0IHN1Ym1pdHRlZCB0byB0aGUgY29kZWMKKyAgICBMaXN0PFZpZGVvQnVmZmVyPiBtQXZhaWxhYmxlQnVmZmVyczsKKworICAgIC8vIE51bWJlciBvZiBidWZmZXJzIHRoYXQgaGF2ZSBiZWVuIHNpZ25hbGVkIGJ5IHRoZSBwcm9kdWNlciB0aGF0IHRoZXkgYXJlIGF2YWlsYWJsZSwgYnV0CisgICAgLy8gd2UndmUgYmVlbiB1bmFibGUgdG8gYWNxdWlyZSB0aGVtIGR1ZSB0byBvdXIgbWF4IGFjcXVpcmUgY291bnQKKyAgICBpbnQzMl90IG1OdW1BdmFpbGFibGVVbmFjcXVpcmVkQnVmZmVyczsKKworICAgIC8vIE51bWJlciBvZiBmcmFtZXMgYWNxdWlyZWQgZnJvbSBjb25zdW1lciAoZGVidWcgb25seSkKKyAgICAvLyAoYXMgaW4gYXF1aXJlQnVmZmVyIGNhbGxlZCwgYW5kIHJlbGVhc2UgbmVlZHMgdG8gYmUgY2FsbGVkKQorICAgIGludDMyX3QgbU51bU91dHN0YW5kaW5nQWNxdWlyZXM7CisKKyAgICAvLyBBY3F1aXJlIGEgYnVmZmVyIGZyb20gdGhlIEJRIGFuZCBzdG9yZSBpdCBpbiB8aXRlbXwgaWYgc3VjY2Vzc2Z1bAorICAgIC8vIFxyZXR1cm4gT0sgb24gc3VjY2Vzcywgb3IgZXJyb3Igb24gZmFpbHVyZS4KKyAgICBzdGF0dXNfdCBhY3F1aXJlQnVmZmVyX2woVmlkZW9CdWZmZXIgKml0ZW0pOworCisgICAgLy8gQ2FsbGVkIHdoZW4gYSBidWZmZXIgd2FzIGFjcXVpcmVkIGZyb20gdGhlIHByb2R1Y2VyCisgICAgdm9pZCBvbkJ1ZmZlckFjcXVpcmVkX2woY29uc3QgVmlkZW9CdWZmZXIgJmJ1ZmZlcik7CisKKyAgICAvLyBtYXJrcyB0aGUgYnVmZmVyIGF0IHRoZSBzbG90IG5vIGxvbmdlciBjYWNoZWQsIGFuZCBhY2NvdW50cyBmb3IgdGhlIG91dHN0YW5kaW5nCisgICAgLy8gYWNxdWlyZSBjb3VudC4gUmV0dXJucyB0cnVlIGlmIHRoZSBzbG90IHdhcyBwb3B1bGF0ZWQ7IG90aGVyd2lzZSwgZmFsc2UuCisgICAgYm9vbCBkaXNjYXJkQnVmZmVySW5TbG90X2woc2xvdF9pZCBpKTsKKworICAgIC8vIG1hcmtzIHRoZSBidWZmZXIgYXQgdGhlIHNsb3QgaW5kZXggbm8gbG9uZ2VyIGNhY2hlZCwgYW5kIGFjY291bnRzIGZvciB0aGUgb3V0c3RhbmRpbmcKKyAgICAvLyBhY3F1aXJlIGNvdW50CisgICAgdm9pZCBkaXNjYXJkQnVmZmVyQXRTbG90SW5kZXhfbChzc2l6ZV90IGJzaSk7CisKKyAgICAvLyByZWxlYXNlIGFsbCBhY3F1aXJlZCBhbmQgdW5hY3F1aXJlZCBhdmFpbGFibGUgYnVmZmVycworICAgIC8vIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGlmIGl0IGZhaWxzIHRvIGFjcXVpcmUgYW4gdW5hY3F1aXJlZCBhdmFpbGFibGUgYnVmZmVyLCB3aGljaCB3aWxsCisgICAgLy8gbGVhdmUgbU51bUF2YWlsYWJsZVVuYWNxdWlyZWRCdWZmZXJzIHBvc2l0aXZlIG9uIHJldHVybi4KKyAgICB2b2lkIHJlbGVhc2VBbGxBdmFpbGFibGVCdWZmZXJzX2woKTsKKworICAgIC8vIHJldHVybnMgd2hldGhlciB3ZSBoYXZlIGFueSBhdmFpbGFibGUgYnVmZmVycyAoYWNxdWlyZWQgb3Igbm90LXlldC1hY3F1aXJlZCkKKyAgICBib29sIGhhdmVBdmFpbGFibGVCdWZmZXJzX2woKSBjb25zdCB7CisgICAgICAgIHJldHVybiAhbUF2YWlsYWJsZUJ1ZmZlcnMuZW1wdHkoKSB8fCBtTnVtQXZhaWxhYmxlVW5hY3F1aXJlZEJ1ZmZlcnMgPiAwOworICAgIH0KKworICAgIC8vIENvZGVjIGJ1ZmZlcnMKKyAgICAvLyAtLS0tLS0tLS0tLS0tCisKKyAgICAvLyBXaGVuIHdlIHF1ZXVlIGJ1ZmZlcnMgdG8gdGhlIGVuY29kZXIsIHdlIG11c3QgaG9sZCB0aGUgcmVmZXJlbmNlcyB0byB0aGUgZ3JhcGhpYyBidWZmZXJzCisgICAgLy8gaW4gdGhvc2UgYnVmZmVycyAtIGFzIHRoZSBwcm9kdWNlciBtYXkgZnJlZSB0aGUgc2xvdHMuCisKKyAgICB0eXBlZGVmIGludDMyX3QgY29kZWNfYnVmZmVyX2lkOworCisgICAgLy8gc2V0IG9mIGNvZGVjIGJ1ZmZlciBJRC1zIG9mIGJ1ZmZlcnMgYXZhaWxhYmxlIHRvIGZpbGwKKyAgICBMaXN0PGNvZGVjX2J1ZmZlcl9pZD4gbUZyZWVDb2RlY0J1ZmZlcnM7CisKKyAgICAvLyBtYXBzIGNvZGVjIGJ1ZmZlciBJRC1zIHRvIGJ1ZmZlciBpbmZvIHN1Ym1pdHRlZCB0byB0aGUgY29kZWMuIFVzZWQgdG8ga2VlcCBhIHJlZmVyZW5jZSBmb3IKKyAgICAvLyB0aGUgZ3JhcGhpY3MgYnVmZmVyLgorICAgIEtleWVkVmVjdG9yPGNvZGVjX2J1ZmZlcl9pZCwgc3RkOjpzaGFyZWRfcHRyPEFjcXVpcmVkQnVmZmVyPj4gbVN1Ym1pdHRlZENvZGVjQnVmZmVyczsKKworICAgIC8vIFByb2Nlc3NlcyB0aGUgbmV4dCBhY3F1aXJlZCBmcmFtZS4gSWYgdGhlcmUgaXMgbm8gYXZhaWxhYmxlIGNvZGVjIGJ1ZmZlciwgaXQgcmV0dXJucyBmYWxzZQorICAgIC8vIHdpdGhvdXQgYW55IGZ1cnRoZXIgYWN0aW9uLgorICAgIC8vCisgICAgLy8gT3RoZXJ3aXNlLCBpdCBjb25zdW1lcyB0aGUgbmV4dCBhY3F1aXJlZCBmcmFtZSBhbmQgZGV0ZXJtaW5lcyBpZiBpdCBuZWVkcyB0byBiZSBkaXNjYXJkZWQgb3IKKyAgICAvLyBkcm9wcGVkLiBJZiBuZWl0aGVyIGFyZSBuZWVkZWQsIGl0IHN1Ym1pdHMgaXQgdG8gdGhlIGNvZGVjLiBJdCBhbHNvIHNhdmVzIHRoZSBsYXRlc3QKKyAgICAvLyBub24tZHJvcHBlZCBmcmFtZSBhbmQgc3VibWl0cyBpdCBmb3IgcmVwZWF0IGVuY29kaW5nIChpZiB0aGlzIGlzIGVuYWJsZWQpLgorICAgIC8vCisgICAgLy8gXHJlcXVpcmUgdGhlcmUgbXVzdCBiZSBhbiBhY3F1aXJlZCBmcmFtZSAoaS5lLiB3ZSdyZSBpbiB0aGUgb25GcmFtZUF2YWlsYWJsZSBjYWxsYmFjaywKKyAgICAvLyBvciBpZiB3ZSdyZSBpbiBjb2RlY0J1ZmZlckVtcHRpZWQgYW5kIG1OdW1GcmFtZXNBdmFpbGFibGUgaXMgbm9uemVybykuCisgICAgLy8gXHJlcXVpcmUgY29kZWMgbXVzdCBiZSBleGVjdXRpbmcKKyAgICAvLyBccmV0dXJucyB0cnVlIGlmIGFjcXVpcmVkIChhbmQgaGFuZGxlZCkgdGhlIG5leHQgZnJhbWUuIE90aGVyd2lzZSwgZmFsc2UuCisgICAgYm9vbCBmaWxsQ29kZWNCdWZmZXJfbCgpOworCisgICAgLy8gQ2FsY3VsYXRlcyB0aGUgbWVkaWEgdGltZXN0YW1wIGZvciB8aXRlbXwgYW5kIG9uIHN1Y2Nlc3MgaXQgc3VibWl0cyB0aGUgYnVmZmVyIHRvIHRoZSBjb2RlYywKKyAgICAvLyB3aGlsZSBhbHNvIGtlZXBpbmcgYSByZWZlcmVuY2UgZm9yIGl0IGluIG1TdWJtaXR0ZWRDb2RlY0J1ZmZlcnMuCisgICAgLy8gUmV0dXJucyBVTktOT1dOX0VSUk9SIGlmIHRoZSBidWZmZXIgd2FzIG5vdCBzdWJtaXR0ZWQgZHVlIHRvIGJ1ZmZlciB0aW1lc3RhbXAuIE90aGVyd2lzZSwKKyAgICAvLyBpdCByZXR1cm5zIGFueSBzdWJtaXQgc3VjY2VzcyBvciBlcnJvciB2YWx1ZSByZXR1cm5lZCBieSB0aGUgY29kZWMuCisgICAgc3RhdHVzX3Qgc3VibWl0QnVmZmVyX2woY29uc3QgVmlkZW9CdWZmZXIgJml0ZW0pOworCisgICAgLy8gU3VibWl0cyBhbiBlbXB0eSBidWZmZXIsIHdpdGggdGhlIEVPUyBmbGFnIHNldCBpZiB0aGVyZSBpcyBhbiBhdmFpbGFibGUgY29kZWMgYnVmZmVyIGFuZAorICAgIC8vIHNldHMgbUVuZE9mU3RyZWFtU2VudCBmbGFnLiBEb2VzIG5vdGhpbmcgaWYgdGhlcmUgaXMgbm8gY29kZWMgYnVmZmVyIGF2YWlsYWJsZS4KKyAgICB2b2lkIHN1Ym1pdEVuZE9mSW5wdXRTdHJlYW1fbCgpOworCisgICAgLy8gU2V0IHRvIHRydWUgaWYgd2Ugd2FudCB0byBzZW5kIGVuZC1vZi1zdHJlYW0gYWZ0ZXIgd2UgcnVuIG91dCBvZiBhdmFpbGFibGUgZnJhbWVzIGZyb20gdGhlCisgICAgLy8gcHJvZHVjZXIKKyAgICBib29sIG1FbmRPZlN0cmVhbTsKKworICAgIC8vIEZsYWcgdGhhdCB0aGUgRU9TIHdhcyBzdWJtaXR0ZWQgdG8gdGhlIGVuY29kZXIKKyAgICBib29sIG1FbmRPZlN0cmVhbVNlbnQ7CisKKyAgICAvLyBEYXRhc3BhY2UgZm9yIHRoZSBsYXN0IGZyYW1lIHN1Ym1pdHRlZCB0byB0aGUgY29kZWMKKyAgICBhbmRyb2lkX2RhdGFzcGFjZSBtTGFzdERhdGFzcGFjZTsKKworICAgIC8vIERlZmF1bHQgY29sb3IgYXNwZWN0cyBmb3IgdGhpcyBzb3VyY2UKKyAgICBpbnQzMl90IG1EZWZhdWx0Q29sb3JBc3BlY3RzUGFja2VkOworCisgICAgLy8gY2FsbGVkIHdoZW4gdGhlIGRhdGEgc3BhY2Ugb2YgdGhlIGlucHV0IGJ1ZmZlciBjaGFuZ2VzCisgICAgdm9pZCBvbkRhdGFzcGFjZUNoYW5nZWRfbChhbmRyb2lkX2RhdGFzcGFjZSBkYXRhc3BhY2UsIGFuZHJvaWRfcGl4ZWxfZm9ybWF0IHBpeGVsRm9ybWF0KTsKKworICAgIC8vIFBvaW50ZXIgYmFjayB0byB0aGUgY29tcG9uZW50IHRoYXQgY3JlYXRlZCB1cy4gIFdlIHNlbmQgYnVmZmVycyBoZXJlLgorICAgIHNwPENvbXBvbmVudFdyYXBwZXI+IG1Db21wb25lbnQ7CisKKyAgICAvLyBTZXQgYnkgc3RhcnQoKSAvIHN0b3AoKS4KKyAgICBib29sIG1FeGVjdXRpbmc7CisKKyAgICBib29sIG1TdXNwZW5kZWQ7CisKKyAgICAvLyByZXR1cm5zIHRydWUgaWYgdGhpcyBzb3VyY2UgaXMgdW5jb25kaXRpb25hbGx5IGRpc2NhcmRpbmcgYWNxdWlyZWQgYnVmZmVycyBhdCB0aGUgbW9tZW50CisgICAgLy8gcmVnYXJkbGVzcyBvZiB0aGUgbWV0YWRhdGEgb2YgdGhvc2UgYnVmZmVycworICAgIGJvb2wgYXJlV2VEaXNjYXJkaW5nQXZhaWxhYmxlQnVmZmVyc19sKCk7CisKKyAgICBpbnQ2NF90IG1MYXN0RnJhbWVUaW1lc3RhbXBVczsKKworICAgIC8vIE91ciBCdWZmZXJRdWV1ZSBpbnRlcmZhY2VzLiBtUHJvZHVjZXIgaXMgcGFzc2VkIHRvIHRoZSBwcm9kdWNlciB0aHJvdWdoCisgICAgLy8gZ2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlciwgYW5kIG1Db25zdW1lciBpcyB1c2VkIGludGVybmFsbHkgdG8gcmV0cmlldmUKKyAgICAvLyB0aGUgYnVmZmVycyBxdWV1ZWQgYnkgdGhlIHByb2R1Y2VyLgorICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG1Qcm9kdWNlcjsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBtQ29uc3VtZXI7CisKKyAgICAvLyBUaGUgdGltZSB0byBzdG9wIHNlbmRpbmcgYnVmZmVycy4KKyAgICBpbnQ2NF90IG1TdG9wVGltZVVzOworCisgICAgc3RydWN0IEFjdGlvbkl0ZW0geworICAgICAgICB0eXBlZGVmIGVudW0geworICAgICAgICAgICAgUEFVU0UsCisgICAgICAgICAgICBSRVNVTUUsCisgICAgICAgICAgICBTVE9QCisgICAgICAgIH0gQWN0aW9uVHlwZTsKKyAgICAgICAgQWN0aW9uVHlwZSBtQWN0aW9uOworICAgICAgICBpbnQ2NF90IG1BY3Rpb25UaW1lVXM7CisgICAgfTsKKworICAgIC8vIE1haW50YWluIGxhc3QgYWN0aW9uIHRpbWVzdGFtcCB0byBlbnN1cmUgYWxsIHRoZSBhY3Rpb24gdGltZXN0YW1wcyBhcmUKKyAgICAvLyBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcuCisgICAgaW50NjRfdCBtTGFzdEFjdGlvblRpbWVVczsKKworICAgIC8vIEFuIGFjdGlvbiBxdWV1ZSB0aGF0IHF1ZXVlIHVwIGFsbCB0aGUgYWN0aW9ucyBzZW50IHRvIEdyYXBoaWNCdWZmZXJTb3VyY2UuCisgICAgLy8gU1RPUCBhY3Rpb24gc2hvdWxkIG9ubHkgc2hvdyB1cCBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0IGFzIGFsbCB0aGUgYWN0aW9ucworICAgIC8vIGFmdGVyIGEgU1RPUCBhY3Rpb24gd2lsbCBiZSBkaXNjYXJkZWQuIG1BY3Rpb25RdWV1ZSBpcyBwcm90ZWN0ZWQgYnkgbU11dGV4LgorICAgIExpc3Q8QWN0aW9uSXRlbT4gbUFjdGlvblF1ZXVlOworCisgICAgLy8vLworICAgIGZyaWVuZCBzdHJ1Y3QgQUhhbmRsZXJSZWZsZWN0b3I8R3JhcGhpY0J1ZmZlclNvdXJjZT47CisKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRSZXBlYXRMYXN0RnJhbWUsICAgLy8vPCBxdWV1ZSBsYXN0IGZyYW1lIGZvciByZWVuY29kaW5nCisgICAgfTsKKyAgICBlbnVtIHsKKyAgICAgICAga1JlcGVhdExhc3RGcmFtZUNvdW50ID0gMTAsCisgICAgfTsKKworICAgIGludDY0X3QgbVNraXBGcmFtZXNCZWZvcmVOczsKKworICAgIHNwPEZyYW1lRHJvcHBlcj4gbUZyYW1lRHJvcHBlcjsKKworICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CisgICAgc3A8QUhhbmRsZXJSZWZsZWN0b3I8R3JhcGhpY0J1ZmZlclNvdXJjZT4gPiBtUmVmbGVjdG9yOworCisgICAgLy8gUmVwZWF0IGxhc3QgZnJhbWUgZmVhdHVyZQorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBjb25maWd1cmF0aW9uIHBhcmFtZXRlcjogcmVwZWF0IGludGVydmFsIGZvciBmcmFtZSByZXBlYXRpbmcgKDwwIGlmIHJlcGVhdGluZyBpcyBkaXNhYmxlZCkKKyAgICBpbnQ2NF90IG1GcmFtZVJlcGVhdEludGVydmFsVXM7CisKKyAgICAvLyBjdXJyZW50IGZyYW1lIHJlcGVhdCBnZW5lcmF0aW9uIC0gdXNlZCB0byBjYW5jZWwgYSBwZW5kaW5nIGZyYW1lIHJlcGVhdAorICAgIGludDMyX3QgbVJlcGVhdExhc3RGcmFtZUdlbmVyYXRpb247CisKKyAgICAvLyBudW1iZXIgb2YgdGltZXMgdG8gcmVwZWF0IGxhdGVzdCBmcmFtZSAoMCA9IG5vbmUpCisgICAgaW50MzJfdCBtT3V0c3RhbmRpbmdGcmFtZVJlcGVhdENvdW50OworCisgICAgLy8gVGhlIHByZXZpb3VzIGJ1ZmZlciBzaG91bGQndmUgYmVlbiByZXBlYXRlZCBidXQKKyAgICAvLyBubyBjb2RlYyBidWZmZXIgd2FzIGF2YWlsYWJsZSBhdCB0aGUgdGltZS4KKyAgICBib29sIG1GcmFtZVJlcGVhdEJsb2NrZWRPbkNvZGVjQnVmZmVyOworCisgICAgLy8gaG9sZCBhIHJlZmVyZW5jZSB0byB0aGUgbGFzdCBhY3F1aXJlZCAoYW5kIG5vdCBkaXNjYXJkZWQpIGZyYW1lIGZvciBmcmFtZSByZXBlYXRpbmcKKyAgICBWaWRlb0J1ZmZlciBtTGF0ZXN0QnVmZmVyOworCisgICAgLy8gcXVldWUgbGFzdCBmcmFtZSBmb3IgcmVlbmNvZGUgYWZ0ZXIgdGhlIHJlcGVhdCBpbnRlcnZhbC4KKyAgICB2b2lkIHF1ZXVlRnJhbWVSZXBlYXRfbCgpOworCisgICAgLy8gc2F2ZSB8aXRlbXwgYXMgdGhlIGxhdGVzdCBidWZmZXIgYW5kIHF1ZXVlIGl0IGZvciByZWVuY29kZSAocmVwZWF0KQorICAgIHZvaWQgc2V0TGF0ZXN0QnVmZmVyX2woY29uc3QgVmlkZW9CdWZmZXIgJml0ZW0pOworCisgICAgLy8gc3VibWl0IGxhc3QgZnJhbWUgdG8gZW5jb2RlciBhbmQgcXVldWUgaXQgZm9yIHJlZW5jb2RlCisgICAgLy8gXHJldHVybiB0cnVlIGlmIGJ1ZmZlciB3YXMgc3VibWl0dGVkLCBmYWxzZSBpZiBpdCB3YXNuJ3QgKGUuZy4gc291cmNlIGlzIHN1c3BlbmRlZCwgdGhlcmUKKyAgICAvLyBpcyBubyBhdmFpbGFibGUgY29kZWMgYnVmZmVyKQorICAgIGJvb2wgcmVwZWF0TGF0ZXN0QnVmZmVyX2woKTsKKworICAgIC8vIFRpbWUgbGFwc2UgLyBzbG93IG1vdGlvbiBjb25maWd1cmF0aW9uCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8vIGRlc2lyZWQgZnJhbWUgcmF0ZSBmb3IgZW5jb2RpbmcgLSB2YWx1ZSA8PSAwIGlmIHVuZGVmaW5lZAorICAgIGRvdWJsZSBtRnBzOworCisgICAgLy8gZGVzaXJlZCBmcmFtZSByYXRlIGZvciBjYXB0dXJlIC0gdmFsdWUgPD0gMCBpZiB1bmRlZmluZWQKKyAgICBkb3VibGUgbUNhcHR1cmVGcHM7CisKKyAgICAvLyBUaW1lIGxhcHNlIG1vZGUgaXMgZW5hYmxlZCBpZiB0aGUgY2FwdHVyZSBmcmFtZSByYXRlIGlzIGRlZmluZWQgYW5kIGl0IGlzCisgICAgLy8gc21hbGxlciB0aGFuIGhhbGYgdGhlIGVuY29kaW5nIGZyYW1lIHJhdGUgKGlmIGRlZmluZWQpLiBJbiB0aGlzIG1vZGUsCisgICAgLy8gZnJhbWVzIHRoYXQgY29tZSBpbiBiZXR3ZWVuIHRoZSBjYXB0dXJlIGludGVydmFsICh0aGUgcmVjaXByb2NhbCBvZiB0aGUKKyAgICAvLyBjYXB0dXJlIGZyYW1lIHJhdGUpIGFyZSBkcm9wcGVkIGFuZCB0aGUgZW5jb2RpbmcgdGltZXN0YW1wIGlzIGFkanVzdGVkIHRvCisgICAgLy8gbWF0Y2ggdGhlIGRlc2lyZWQgZW5jb2RpbmcgZnJhbWUgcmF0ZS4KKyAgICAvLworICAgIC8vIFNsb3cgbW90aW9uIG1vZGUgaXMgZW5hYmxlZCBpZiBib3RoIGVuY29kaW5nIGFuZCBjYXB0dXJlIGZyYW1lIHJhdGVzIGFyZQorICAgIC8vIGRlZmluZWQgYW5kIHRoZSBlbmNvZGluZyBmcmFtZSByYXRlIGlzIGxlc3MgdGhhbiBoYWxmIHRoZSBjYXB0dXJlIGZyYW1lCisgICAgLy8gcmF0ZS4gSW4gdGhpcyBtb2RlLCB0aGUgc291cmNlIGlzIGV4cGVjdGVkIHRvIHByb2R1Y2UgZnJhbWVzIHdpdGggYW4gZXZlbgorICAgIC8vIHRpbWVzdGFtcCBpbnRlcnZhbCAoYWZ0ZXIgcm91bmRpbmcpIHdpdGggdGhlIGNvbmZpZ3VyZWQgY2FwdHVyZSBmcHMuIFRoZQorICAgIC8vIGZpcnN0IHNvdXJjZSB0aW1lc3RhbXAgaXMgdXNlZCBhcyB0aGUgc291cmNlIGJhc2UgdGltZS4gQWZ0ZXJ3YXJkcywgdGhlCisgICAgLy8gdGltZXN0YW1wIG9mIGVhY2ggc291cmNlIGZyYW1lIGlzIHNuYXBwZWQgdG8gdGhlIG5lYXJlc3QgZXhwZWN0ZWQgY2FwdHVyZQorICAgIC8vIHRpbWVzdGFtcCBhbmQgc2NhbGVkIHRvIG1hdGNoIHRoZSBjb25maWd1cmVkIGVuY29kaW5nIGZyYW1lIHJhdGUuCisKKyAgICAvLyBUaGVzZSBtb2RlcyBtdXN0IGJlIGVuYWJsZWQgYmVmb3JlIHVzaW5nIHRoaXMgc291cmNlLgorCisgICAgLy8gYWRqdXN0ZWQgY2FwdHVyZSB0aW1lc3RhbXAgb2YgdGhlIGJhc2UgZnJhbWUKKyAgICBpbnQ2NF90IG1CYXNlQ2FwdHVyZVVzOworCisgICAgLy8gYWRqdXN0ZWQgZW5jb2RpbmcgdGltZXN0YW1wIG9mIHRoZSBiYXNlIGZyYW1lCisgICAgaW50NjRfdCBtQmFzZUZyYW1lVXM7CisKKyAgICAvLyBudW1iZXIgb2YgZnJhbWVzIGZyb20gdGhlIGJhc2UgdGltZQorICAgIGludDY0X3QgbUZyYW1lQ291bnQ7CisKKyAgICAvLyBhZGp1c3RlZCBjYXB0dXJlIHRpbWVzdGFtcCBmb3IgcHJldmlvdXMgZnJhbWUgKG5lZ2F0aXZlIGlmIHRoZXJlIHdlcmUKKyAgICAvLyBub25lKQorICAgIGludDY0X3QgbVByZXZDYXB0dXJlVXM7CisKKyAgICAvLyBhZGp1c3RlZCBtZWRpYSB0aW1lc3RhbXAgZm9yIHByZXZpb3VzIGZyYW1lIChuZWdhdGl2ZSBpZiB0aGVyZSB3ZXJlIG5vbmUpCisgICAgaW50NjRfdCBtUHJldkZyYW1lVXM7CisKKyAgICAvLyBkZXNpcmVkIG9mZnNldCBiZXR3ZWVuIG1lZGlhIHRpbWUgYW5kIGNhcHR1cmUgdGltZQorICAgIGludDY0X3QgbUlucHV0QnVmZmVyVGltZU9mZnNldFVzOworCisgICAgLy8gQ2FsY3VsYXRlcyBhbmQgb3V0cHV0cyB0aGUgdGltZXN0YW1wIHRvIHVzZSBmb3IgYSBidWZmZXIgd2l0aCBhIHNwZWNpZmljIGJ1ZmZlciB0aW1lc3RhbXAKKyAgICAvLyB8YnVmZmVyVGltZXN0YW1wTnN8LiBSZXR1cm5zIGZhbHNlIG9uIGZhaWx1cmUgKGJ1ZmZlciB0b28gY2xvc2Ugb3IgdGltZXN0YW1wIGlzIG1vdmluZworICAgIC8vIGJhY2t3YXJkcykuIE90aGVyd2lzZSwgc3RvcmVzIHRoZSBtZWRpYSB0aW1lc3RhbXAgaW4gfCpjb2RlY1RpbWVVc3wgYW5kIHJldHVybnMgdHJ1ZS4KKyAgICAvLworICAgIC8vIFRoaXMgbWV0aG9kIHRha2VzIGludG8gYWNjb3VudCB0aGUgc3RhcnQgdGltZSBvZmZzZXQgYW5kIGFueSB0aW1lIGxhcHNlIG9yIHNsb3cgbW90aW9uIHRpbWUKKyAgICAvLyBhZGp1c3RtZW50IHJlcXVlc3RzLgorICAgIGJvb2wgY2FsY3VsYXRlQ29kZWNUaW1lc3RhbXBfbChuc2Vjc190IGJ1ZmZlclRpbWVOcywgaW50NjRfdCAqY29kZWNUaW1lVXMpOworCisgICAgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhHcmFwaGljQnVmZmVyU291cmNlKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gR1JBUEhJQ19CVUZGRVJfU09VUkNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZGYyMGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaApAQCAtMCwwICsxLDM4MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfU1RBR0VGUklHSFRfV0dSQVBISUNCVUZGRVJQUk9EVUNFUl9IXworI2RlZmluZSBNRURJQV9TVEFHRUZSSUdIVF9XR1JBUEhJQ0JVRkZFUlBST0RVQ0VSX0hfCisKKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvQmluZGVyLmg+CisjaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxndWkvSVByb2R1Y2VyTGlzdGVuZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9Db252ZXJzaW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvV1Byb2R1Y2VyTGlzdGVuZXIuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vd2luZG93Lmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2dyYXBoaWNzL2J1ZmZlcnF1ZXVlLzEuMC9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OlYxXzA6OkFud0J1ZmZlcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2U7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9oYW5kbGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKwordHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OgorICAgICAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI7Cit0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6CisgICAgICAgIElQcm9kdWNlckxpc3RlbmVyIEhQcm9kdWNlckxpc3RlbmVyOworCit0eXBlZGVmIDo6YW5kcm9pZDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlciBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwordHlwZWRlZiA6OmFuZHJvaWQ6OklQcm9kdWNlckxpc3RlbmVyIEJQcm9kdWNlckxpc3RlbmVyOwordXNpbmcgOjphbmRyb2lkOjpCbkdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKKworI2lmbmRlZiBMT0cKK3N0cnVjdCBMT0dfZHVtbXkgeworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgIExPR19kdW1teSYgb3BlcmF0b3I8PCAoY29uc3QgVCYpIHsgcmV0dXJuICp0aGlzOyB9Cit9OworCisjZGVmaW5lIExPRyh4KSAgTE9HX2R1bW15KCkKKyNlbmRpZgorCisvLyBJbnN0YW50aWF0ZSBvbmx5IGlmIEhHcmFwaGljQnVmZmVyUHJvZHVjZXIgaXMgYmFzZSBvZiBCQVNFLgordGVtcGxhdGUgPHR5cGVuYW1lIEJBU0UsCisgICAgICAgICAgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2Jhc2Vfb2Y8SEdyYXBoaWNCdWZmZXJQcm9kdWNlciwgQkFTRT46OnZhbHVlPjo6dHlwZT4KK3N0cnVjdCBUV0dyYXBoaWNCdWZmZXJQcm9kdWNlciA6IHB1YmxpYyBCQVNFIHsKKyAgICBUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcihzcDxCR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBjb25zdCYgYmFzZSkgOiBtQmFzZShiYXNlKSB7fQorICAgIFJldHVybjx2b2lkPiByZXF1ZXN0QnVmZmVyKGludDMyX3Qgc2xvdCwgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6cmVxdWVzdEJ1ZmZlcl9jYiBfaGlkbF9jYikgb3ZlcnJpZGUgeworICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBidWY7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1CYXNlLT5yZXF1ZXN0QnVmZmVyKHNsb3QsICZidWYpOworICAgICAgICBBbndCdWZmZXIgYW53QnVmZmVyOworICAgICAgICBpZiAoYnVmICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIDo6YW5kcm9pZDo6Y29udmVyc2lvbjo6d3JhcEFzKCZhbndCdWZmZXIsICpidWYpOworICAgICAgICB9CisgICAgICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cyksIGFud0J1ZmZlcik7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgUmV0dXJuPGludDMyX3Q+IHNldE1heERlcXVldWVkQnVmZmVyQ291bnQoaW50MzJfdCBtYXhEZXF1ZXVlZEJ1ZmZlcnMpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KG1CYXNlLT5zZXRNYXhEZXF1ZXVlZEJ1ZmZlckNvdW50KAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4obWF4RGVxdWV1ZWRCdWZmZXJzKSkpOworICAgIH0KKworICAgIFJldHVybjxpbnQzMl90PiBzZXRBc3luY01vZGUoYm9vbCBhc3luYykgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4obUJhc2UtPnNldEFzeW5jTW9kZShhc3luYykpOworICAgIH0KKworICAgIFJldHVybjx2b2lkPiBkZXF1ZXVlQnVmZmVyKAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OlBpeGVsRm9ybWF0IGZvcm1hdCwgdWludDMyX3QgdXNhZ2UsCisgICAgICAgICAgICBib29sIGdldEZyYW1lVGltZXN0YW1wcywgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6ZGVxdWV1ZUJ1ZmZlcl9jYiBfaGlkbF9jYikgb3ZlcnJpZGUgeworICAgICAgICBpbnQgc2xvdDsKKyAgICAgICAgc3A8RmVuY2U+IGZlbmNlOworICAgICAgICA6OmFuZHJvaWQ6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGEgb3V0VGltZXN0YW1wczsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUJhc2UtPmRlcXVldWVCdWZmZXIoCisgICAgICAgICAgICAmc2xvdCwgJmZlbmNlLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8OjphbmRyb2lkOjpQaXhlbEZvcm1hdD4oZm9ybWF0KSwgdXNhZ2UsIG51bGxwdHIsCisgICAgICAgICAgICBnZXRGcmFtZVRpbWVzdGFtcHMgPyAmb3V0VGltZXN0YW1wcyA6IG51bGxwdHIpOworICAgICAgICBoaWRsX2hhbmRsZSB0RmVuY2U7CisgICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGEgdE91dFRpbWVzdGFtcHM7CisKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBuaCA9IG51bGxwdHI7CisgICAgICAgIGlmICgoZmVuY2UgPT0gbnVsbHB0cikgfHwgITo6YW5kcm9pZDo6Y29udmVyc2lvbjo6d3JhcEFzKCZ0RmVuY2UsICZuaCwgKmZlbmNlKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmRlcXVldWVCdWZmZXIgLSAiCisgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIG91dHB1dCBmZW5jZSI7CisgICAgICAgICAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpLAorICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oc2xvdCksCisgICAgICAgICAgICAgICAgICAgICB0RmVuY2UsCisgICAgICAgICAgICAgICAgICAgICB0T3V0VGltZXN0YW1wcyk7CisgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICB9CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+ID4gbmhBQTsKKyAgICAgICAgaWYgKGdldEZyYW1lVGltZXN0YW1wcyAmJiAhOjphbmRyb2lkOjpjb252ZXJzaW9uOjp3cmFwQXMoJnRPdXRUaW1lc3RhbXBzLCAmbmhBQSwgb3V0VGltZXN0YW1wcykpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpkZXF1ZXVlQnVmZmVyIC0gIgorICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBvdXRwdXQgdGltZXN0YW1wcyI7CisgICAgICAgICAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpLAorICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oc2xvdCksCisgICAgICAgICAgICAgICAgICAgICB0RmVuY2UsCisgICAgICAgICAgICAgICAgICAgICB0T3V0VGltZXN0YW1wcyk7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShuaCk7CisgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICB9CisKKyAgICAgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihzbG90KSwKKyAgICAgICAgICAgICAgICB0RmVuY2UsCisgICAgICAgICAgICAgICAgdE91dFRpbWVzdGFtcHMpOworICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShuaCk7CisgICAgICAgIGlmIChnZXRGcmFtZVRpbWVzdGFtcHMpIHsKKyAgICAgICAgICAgIGZvciAoYXV0byYgbmhBIDogbmhBQSkgeworICAgICAgICAgICAgICAgIGZvciAoYXV0byYgaGFuZGxlIDogbmhBKSB7CisgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhhbmRsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgUmV0dXJuPGludDMyX3Q+IGRldGFjaEJ1ZmZlcihpbnQzMl90IHNsb3QpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KG1CYXNlLT5kZXRhY2hCdWZmZXIoc2xvdCkpOworICAgIH0KKworICAgIFJldHVybjx2b2lkPiBkZXRhY2hOZXh0QnVmZmVyKEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmRldGFjaE5leHRCdWZmZXJfY2IgX2hpZGxfY2IpIG92ZXJyaWRlIHsKKyAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gb3V0QnVmZmVyOworICAgICAgICBzcDxGZW5jZT4gb3V0RmVuY2U7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1CYXNlLT5kZXRhY2hOZXh0QnVmZmVyKCZvdXRCdWZmZXIsICZvdXRGZW5jZSk7CisgICAgICAgIEFud0J1ZmZlciB0QnVmZmVyOworICAgICAgICBoaWRsX2hhbmRsZSB0RmVuY2U7CisKKyAgICAgICAgaWYgKG91dEJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjo6ZGV0YWNoTmV4dEJ1ZmZlciAtICIKKyAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgb3V0cHV0IGJ1ZmZlciI7CisgICAgICAgICAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpLCB0QnVmZmVyLCB0RmVuY2UpOworICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICAgICAgfQorICAgICAgICA6OmFuZHJvaWQ6OmNvbnZlcnNpb246OndyYXBBcygmdEJ1ZmZlciwgKm91dEJ1ZmZlcik7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogbmggPSBudWxscHRyOworICAgICAgICBpZiAoKG91dEZlbmNlICE9IG51bGxwdHIpICYmICE6OmFuZHJvaWQ6OmNvbnZlcnNpb246OndyYXBBcygmdEZlbmNlLCAmbmgsICpvdXRGZW5jZSkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpkZXRhY2hOZXh0QnVmZmVyIC0gIgorICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBvdXRwdXQgZmVuY2UiOworICAgICAgICAgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSwgdEJ1ZmZlciwgdEZlbmNlKTsKKyAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgICAgIH0KKworICAgICAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpLCB0QnVmZmVyLCB0RmVuY2UpOworICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShuaCk7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgUmV0dXJuPHZvaWQ+IGF0dGFjaEJ1ZmZlcihjb25zdCBBbndCdWZmZXImIGJ1ZmZlciwgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6YXR0YWNoQnVmZmVyX2NiIF9oaWRsX2NiKSBvdmVycmlkZSB7CisgICAgICAgIGludCBvdXRTbG90OworICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBsQnVmZmVyID0gbmV3IEdyYXBoaWNCdWZmZXIoKTsKKyAgICAgICAgaWYgKCE6OmFuZHJvaWQ6OmNvbnZlcnNpb246OmNvbnZlcnRUbyhsQnVmZmVyLmdldCgpLCBidWZmZXIpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjo6YXR0YWNoQnVmZmVyIC0gIgorICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBpbnB1dCBuYXRpdmUgd2luZG93IGJ1ZmZlciI7CisgICAgICAgICAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxpbnQzMl90PihCQURfVkFMVUUpLCAtMSk7CisgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICB9CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1CYXNlLT5hdHRhY2hCdWZmZXIoJm91dFNsb3QsIGxCdWZmZXIpOworCisgICAgICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cyksIHN0YXRpY19jYXN0PGludDMyX3Q+KG91dFNsb3QpKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICBSZXR1cm48dm9pZD4gcXVldWVCdWZmZXIoCisgICAgICAgICAgICBpbnQzMl90IHNsb3QsIGNvbnN0IEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQmIGlucHV0LAorICAgICAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6cXVldWVCdWZmZXJfY2IgX2hpZGxfY2IpIG92ZXJyaWRlIHsKKyAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQgdE91dHB1dDsKKyAgICAgICAgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCBsSW5wdXQoCisgICAgICAgICAgICAgICAgMCwgZmFsc2UsIEhBTF9EQVRBU1BBQ0VfVU5LTk9XTiwKKyAgICAgICAgICAgICAgICA6OmFuZHJvaWQ6OlJlY3QoMCwgMCwgMSwgMSksCisgICAgICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19TQ0FMSU5HX01PREVfRlJFRVpFLAorICAgICAgICAgICAgICAgIDAsIDo6YW5kcm9pZDo6RmVuY2U6Ok5PX0ZFTkNFKTsKKyAgICAgICAgaWYgKCE6OmFuZHJvaWQ6OmNvbnZlcnNpb246OmNvbnZlcnRUbygmbElucHV0LCBpbnB1dCkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpxdWV1ZUJ1ZmZlciAtICIKKyAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgaW5wdXQiOworICAgICAgICAgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oQkFEX1ZBTFVFKSwgdE91dHB1dCk7CisgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICB9CisgICAgICAgIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0IGxPdXRwdXQ7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1CYXNlLT5xdWV1ZUJ1ZmZlcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHNsb3QpLCBsSW5wdXQsICZsT3V0cHV0KTsKKworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiA+IG5oQUE7CisgICAgICAgIGlmICghOjphbmRyb2lkOjpjb252ZXJzaW9uOjp3cmFwQXMoJnRPdXRwdXQsICZuaEFBLCBsT3V0cHV0KSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI6OnF1ZXVlQnVmZmVyIC0gIgorICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBvdXRwdXQiOworICAgICAgICAgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oQkFEX1ZBTFVFKSwgdE91dHB1dCk7CisgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICB9CisKKyAgICAgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSwgdE91dHB1dCk7CisgICAgICAgIGZvciAoYXV0byYgbmhBIDogbmhBQSkgeworICAgICAgICAgICAgZm9yIChhdXRvJiBuaCA6IG5oQSkgeworICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG5oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIFJldHVybjxpbnQzMl90PiBjYW5jZWxCdWZmZXIoaW50MzJfdCBzbG90LCBjb25zdCBoaWRsX2hhbmRsZSYgZmVuY2UpIG92ZXJyaWRlIHsKKyAgICAgICAgc3A8RmVuY2U+IGxGZW5jZSA9IG5ldyBGZW5jZSgpOworICAgICAgICBpZiAoITo6YW5kcm9pZDo6Y29udmVyc2lvbjo6Y29udmVydFRvKGxGZW5jZS5nZXQoKSwgZmVuY2UpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjo6Y2FuY2VsQnVmZmVyIC0gIgorICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBpbnB1dCBmZW5jZSI7CisgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4oQkFEX1ZBTFVFKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4obUJhc2UtPmNhbmNlbEJ1ZmZlcihzdGF0aWNfY2FzdDxpbnQ+KHNsb3QpLCBsRmVuY2UpKTsKKyAgICB9CisKKyAgICBSZXR1cm48dm9pZD4gcXVlcnkoaW50MzJfdCB3aGF0LCBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpxdWVyeV9jYiBfaGlkbF9jYikgb3ZlcnJpZGUgeworICAgICAgICBpbnQgbFZhbHVlOworICAgICAgICBpbnQgbFJldHVybiA9IG1CYXNlLT5xdWVyeShzdGF0aWNfY2FzdDxpbnQ+KHdoYXQpLCAmbFZhbHVlKTsKKyAgICAgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4obFJldHVybiksIHN0YXRpY19jYXN0PGludDMyX3Q+KGxWYWx1ZSkpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIFJldHVybjx2b2lkPiBjb25uZWN0KGNvbnN0IHNwPEhQcm9kdWNlckxpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgICAgICBpbnQzMl90IGFwaSwgYm9vbCBwcm9kdWNlckNvbnRyb2xsZWRCeUFwcCwKKyAgICAgICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmNvbm5lY3RfY2IgX2hpZGxfY2IpIG92ZXJyaWRlIHsKKyAgICAgICAgc3A8QlByb2R1Y2VyTGlzdGVuZXI+IGxMaXN0ZW5lciA9IGxpc3RlbmVyID09IG51bGxwdHIgPworICAgICAgICAgICAgICAgIG51bGxwdHIgOiBuZXcgTFdQcm9kdWNlckxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQgbE91dHB1dDsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUJhc2UtPmNvbm5lY3QobExpc3RlbmVyLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oYXBpKSwKKyAgICAgICAgICAgICAgICBwcm9kdWNlckNvbnRyb2xsZWRCeUFwcCwKKyAgICAgICAgICAgICAgICAmbE91dHB1dCk7CisKKyAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQgdE91dHB1dDsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4gPiBuaEFBOworICAgICAgICBpZiAoITo6YW5kcm9pZDo6Y29udmVyc2lvbjo6d3JhcEFzKCZ0T3V0cHV0LCAmbmhBQSwgbE91dHB1dCkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpjb25uZWN0IC0gIgorICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBvdXRwdXQiOworICAgICAgICAgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSwgdE91dHB1dCk7CisgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICB9CisKKyAgICAgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSwgdE91dHB1dCk7CisgICAgICAgIGZvciAoYXV0byYgbmhBIDogbmhBQSkgeworICAgICAgICAgICAgZm9yIChhdXRvJiBuaCA6IG5oQSkgeworICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG5oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIFJldHVybjxpbnQzMl90PiBkaXNjb25uZWN0KAorICAgICAgICAgICAgaW50MzJfdCBhcGksCisgICAgICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZSBtb2RlKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PihtQmFzZS0+ZGlzY29ubmVjdCgKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGFwaSksCisgICAgICAgICAgICAgICAgOjphbmRyb2lkOjpjb252ZXJzaW9uOjp0b0d1aURpc2Nvbm5lY3RNb2RlKG1vZGUpKSk7CisgICAgfQorCisgICAgUmV0dXJuPGludDMyX3Q+IHNldFNpZGViYW5kU3RyZWFtKGNvbnN0IGhpZGxfaGFuZGxlJiBzdHJlYW0pIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KG1CYXNlLT5zZXRTaWRlYmFuZFN0cmVhbShOYXRpdmVIYW5kbGU6OmNyZWF0ZSgKKyAgICAgICAgICAgICAgICBzdHJlYW0gPyBuYXRpdmVfaGFuZGxlX2Nsb25lKHN0cmVhbSkgOiBOVUxMLCB0cnVlKSkpOworICAgIH0KKworICAgIFJldHVybjx2b2lkPiBhbGxvY2F0ZUJ1ZmZlcnMoCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6UGl4ZWxGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgdWludDMyX3QgdXNhZ2UpIG92ZXJyaWRlIHsKKyAgICAgICAgbUJhc2UtPmFsbG9jYXRlQnVmZmVycygKKyAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PDo6YW5kcm9pZDo6UGl4ZWxGb3JtYXQ+KGZvcm1hdCksCisgICAgICAgICAgICAgICAgdXNhZ2UpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIFJldHVybjxpbnQzMl90PiBhbGxvd0FsbG9jYXRpb24oYm9vbCBhbGxvdykgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4obUJhc2UtPmFsbG93QWxsb2NhdGlvbihhbGxvdykpOworICAgIH0KKworICAgIFJldHVybjxpbnQzMl90PiBzZXRHZW5lcmF0aW9uTnVtYmVyKHVpbnQzMl90IGdlbmVyYXRpb25OdW1iZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KG1CYXNlLT5zZXRHZW5lcmF0aW9uTnVtYmVyKGdlbmVyYXRpb25OdW1iZXIpKTsKKyAgICB9CisKKyAgICBSZXR1cm48dm9pZD4gZ2V0Q29uc3VtZXJOYW1lKEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmdldENvbnN1bWVyTmFtZV9jYiBfaGlkbF9jYikgb3ZlcnJpZGUgeworICAgICAgICBfaGlkbF9jYihtQmFzZS0+Z2V0Q29uc3VtZXJOYW1lKCkuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIFJldHVybjxpbnQzMl90PiBzZXRTaGFyZWRCdWZmZXJNb2RlKGJvb2wgc2hhcmVkQnVmZmVyTW9kZSkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4obUJhc2UtPnNldFNoYXJlZEJ1ZmZlck1vZGUoc2hhcmVkQnVmZmVyTW9kZSkpOworICAgIH0KKworICAgIFJldHVybjxpbnQzMl90PiBzZXRBdXRvUmVmcmVzaChib29sIGF1dG9SZWZyZXNoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PihtQmFzZS0+c2V0QXV0b1JlZnJlc2goYXV0b1JlZnJlc2gpKTsKKyAgICB9CisKKyAgICBSZXR1cm48aW50MzJfdD4gc2V0RGVxdWV1ZVRpbWVvdXQoaW50NjRfdCB0aW1lb3V0TnMpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KG1CYXNlLT5zZXREZXF1ZXVlVGltZW91dCh0aW1lb3V0TnMpKTsKKyAgICB9CisKKyAgICBSZXR1cm48dm9pZD4gZ2V0TGFzdFF1ZXVlZEJ1ZmZlcihIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpnZXRMYXN0UXVldWVkQnVmZmVyX2NiIF9oaWRsX2NiKSBvdmVycmlkZSB7CisgICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IGxPdXRCdWZmZXIgPSBuZXcgR3JhcGhpY0J1ZmZlcigpOworICAgICAgICBzcDxGZW5jZT4gbE91dEZlbmNlID0gbmV3IEZlbmNlKCk7CisgICAgICAgIGZsb2F0IGxPdXRUcmFuc2Zvcm1NYXRyaXhbMTZdOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQmFzZS0+Z2V0TGFzdFF1ZXVlZEJ1ZmZlcigKKyAgICAgICAgICAgICAgICAmbE91dEJ1ZmZlciwgJmxPdXRGZW5jZSwgbE91dFRyYW5zZm9ybU1hdHJpeCk7CisKKyAgICAgICAgQW53QnVmZmVyIHRPdXRCdWZmZXI7CisgICAgICAgIGlmIChsT3V0QnVmZmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIDo6YW5kcm9pZDo6Y29udmVyc2lvbjo6d3JhcEFzKCZ0T3V0QnVmZmVyLCAqbE91dEJ1ZmZlcik7CisgICAgICAgIH0KKyAgICAgICAgaGlkbF9oYW5kbGUgdE91dEZlbmNlOworICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIG5oID0gbnVsbHB0cjsKKyAgICAgICAgaWYgKChsT3V0RmVuY2UgPT0gbnVsbHB0cikgfHwgITo6YW5kcm9pZDo6Y29udmVyc2lvbjo6d3JhcEFzKCZ0T3V0RmVuY2UsICZuaCwgKmxPdXRGZW5jZSkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpnZXRMYXN0UXVldWVkQnVmZmVyIC0gIgorICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBvdXRwdXQgZmVuY2UiOworICAgICAgICAgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSwKKyAgICAgICAgICAgICAgICAgICAgdE91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgdE91dEZlbmNlLAorICAgICAgICAgICAgICAgICAgICBoaWRsX2FycmF5PGZsb2F0LCAxNj4oKSk7CisgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICB9CisgICAgICAgIGhpZGxfYXJyYXk8ZmxvYXQsIDE2PiB0T3V0VHJhbnNmb3JtTWF0cml4KGxPdXRUcmFuc2Zvcm1NYXRyaXgpOworCisgICAgICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cyksIHRPdXRCdWZmZXIsIHRPdXRGZW5jZSwgdE91dFRyYW5zZm9ybU1hdHJpeCk7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG5oKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICBSZXR1cm48dm9pZD4gZ2V0RnJhbWVUaW1lc3RhbXBzKEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmdldEZyYW1lVGltZXN0YW1wc19jYiBfaGlkbF9jYikgb3ZlcnJpZGUgeworICAgICAgICA6OmFuZHJvaWQ6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGEgbERlbHRhOworICAgICAgICBtQmFzZS0+Z2V0RnJhbWVUaW1lc3RhbXBzKCZsRGVsdGEpOworCisgICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGEgdERlbHRhOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiA+IG5oQUE7CisgICAgICAgIGlmICghOjphbmRyb2lkOjpjb252ZXJzaW9uOjp3cmFwQXMoJnREZWx0YSwgJm5oQUEsIGxEZWx0YSkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpnZXRGcmFtZVRpbWVzdGFtcHMgLSAiCisgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIG91dHB1dCBmcmFtZSB0aW1lc3RhbXBzIjsKKyAgICAgICAgICAgIF9oaWRsX2NiKHREZWx0YSk7CisgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICB9CisKKyAgICAgICAgX2hpZGxfY2IodERlbHRhKTsKKyAgICAgICAgZm9yIChhdXRvJiBuaEEgOiBuaEFBKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8mIG5oIDogbmhBKSB7CisgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobmgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgUmV0dXJuPHZvaWQ+IGdldFVuaXF1ZUlkKEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmdldFVuaXF1ZUlkX2NiIF9oaWRsX2NiKSBvdmVycmlkZSB7CisgICAgICAgIHVpbnQ2NF90IG91dElkOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQmFzZS0+Z2V0VW5pcXVlSWQoJm91dElkKTsKKyAgICAgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSwgb3V0SWQpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzcDxCR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtQmFzZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfU1RBR0VGUklHSFRfV0dSQVBISUNCVUZGRVJQUk9EVUNFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9XUHJvZHVjZXJMaXN0ZW5lci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9XUHJvZHVjZXJMaXN0ZW5lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlYmJhODcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL1dQcm9kdWNlckxpc3RlbmVyLmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfU1RBR0VGUklHSFRfV1BST0RVQ0VSTElTVEVORVJfSF8KKyNkZWZpbmUgTUVESUFfU1RBR0VGUklHSFRfV1BST0RVQ0VSTElTVEVORVJfSF8KKworI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKworI2luY2x1ZGUgPGJpbmRlci9JQmluZGVyLmg+CisjaW5jbHVkZSA8Z3VpL0lQcm9kdWNlckxpc3RlbmVyLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2dyYXBoaWNzL2J1ZmZlcnF1ZXVlLzEuMC9JUHJvZHVjZXJMaXN0ZW5lci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2U7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3R5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjpJUHJvZHVjZXJMaXN0ZW5lcgorICAgICAgICBIUHJvZHVjZXJMaXN0ZW5lcjsKK3R5cGVkZWYgOjphbmRyb2lkOjpJUHJvZHVjZXJMaXN0ZW5lcgorICAgICAgICBCUHJvZHVjZXJMaXN0ZW5lcjsKK3VzaW5nIDo6YW5kcm9pZDo6Qm5Qcm9kdWNlckxpc3RlbmVyOworCitzdHJ1Y3QgVFdQcm9kdWNlckxpc3RlbmVyIDogcHVibGljIEhQcm9kdWNlckxpc3RlbmVyIHsKKyAgICBzcDxCUHJvZHVjZXJMaXN0ZW5lcj4gbUJhc2U7CisgICAgVFdQcm9kdWNlckxpc3RlbmVyKHNwPEJQcm9kdWNlckxpc3RlbmVyPiBjb25zdCYgYmFzZSk7CisgICAgUmV0dXJuPHZvaWQ+IG9uQnVmZmVyUmVsZWFzZWQoKSBvdmVycmlkZTsKKyAgICBSZXR1cm48Ym9vbD4gbmVlZHNSZWxlYXNlTm90aWZ5KCkgb3ZlcnJpZGU7Cit9OworCitjbGFzcyBMV1Byb2R1Y2VyTGlzdGVuZXIgOiBwdWJsaWMgQm5Qcm9kdWNlckxpc3RlbmVyIHsKK3B1YmxpYzoKKyAgICBzcDxIUHJvZHVjZXJMaXN0ZW5lcj4gbUJhc2U7CisgICAgTFdQcm9kdWNlckxpc3RlbmVyKHNwPEhQcm9kdWNlckxpc3RlbmVyPiBjb25zdCYgYmFzZSk7CisgICAgdm9pZCBvbkJ1ZmZlclJlbGVhc2VkKCkgb3ZlcnJpZGU7CisgICAgYm9vbCBuZWVkc1JlbGVhc2VOb3RpZnkoKSBvdmVycmlkZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfU1RBR0VGUklHSFRfV1BST0RVQ0VSTElTVEVORVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci90ZXN0cy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmYmMzZDYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci90ZXN0cy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTUgQEAKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJGcmFtZURyb3BwZXJfdGVzdCIsCisKKyAgICBzcmNzOiBbIkZyYW1lRHJvcHBlcl90ZXN0LmNwcCJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnF1ZXVlX2hlbHBlciIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL3Rlc3RzL0ZyYW1lRHJvcHBlcl90ZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL3Rlc3RzL0ZyYW1lRHJvcHBlcl90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWFlNzdjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvdGVzdHMvRnJhbWVEcm9wcGVyX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMTM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJGcmFtZURyb3BwZXJfdGVzdCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9GcmFtZURyb3BwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBUZXN0RnJhbWUgeworICBpbnQ2NF90IHRpbWVVczsKKyAgYm9vbCBzaG91bGREcm9wOworfTsKKworc3RhdGljIGNvbnN0IFRlc3RGcmFtZSB0ZXN0RnJhbWVzMjBGcHNbXSA9IHsKKyAgICB7MTAwMDAwMCwgZmFsc2V9LCB7MTA1MDAwMCwgZmFsc2V9LCB7MTEwMDAwMCwgZmFsc2V9LCB7MTE1MDAwMCwgZmFsc2V9LAorICAgIHsxMjAwMDAwLCBmYWxzZX0sIHsxMjUwMDAwLCBmYWxzZX0sIHsxMzAwMDAwLCBmYWxzZX0sIHsxMzUwMDAwLCBmYWxzZX0sCisgICAgezE0MDAwMDAsIGZhbHNlfSwgezE0NTAwMDAsIGZhbHNlfSwgezE1MDAwMDAsIGZhbHNlfSwgezE1NTAwMDAsIGZhbHNlfSwKKyAgICB7MTYwMDAwMCwgZmFsc2V9LCB7MTY1MDAwMCwgZmFsc2V9LCB7MTcwMDAwMCwgZmFsc2V9LCB7MTc1MDAwMCwgZmFsc2V9LAorICAgIHsxODAwMDAwLCBmYWxzZX0sIHsxODUwMDAwLCBmYWxzZX0sIHsxOTAwMDAwLCBmYWxzZX0sIHsxOTUwMDAwLCBmYWxzZX0sCit9OworCitzdGF0aWMgY29uc3QgVGVzdEZyYW1lIHRlc3RGcmFtZXMzMEZwc1tdID0geworICAgIHsxMDAwMDAwLCBmYWxzZX0sIHsxMDMzMzMzLCBmYWxzZX0sIHsxMDY2NjY3LCBmYWxzZX0sIHsxMTAwMDAwLCBmYWxzZX0sCisgICAgezExMzMzMzMsIGZhbHNlfSwgezExNjY2NjcsIGZhbHNlfSwgezEyMDAwMDAsIGZhbHNlfSwgezEyMzMzMzMsIGZhbHNlfSwKKyAgICB7MTI2NjY2NywgZmFsc2V9LCB7MTMwMDAwMCwgZmFsc2V9LCB7MTMzMzMzMywgZmFsc2V9LCB7MTM2NjY2NywgZmFsc2V9LAorICAgIHsxNDAwMDAwLCBmYWxzZX0sIHsxNDMzMzMzLCBmYWxzZX0sIHsxNDY2NjY3LCBmYWxzZX0sIHsxNTAwMDAwLCBmYWxzZX0sCisgICAgezE1MzMzMzMsIGZhbHNlfSwgezE1NjY2NjcsIGZhbHNlfSwgezE2MDAwMDAsIGZhbHNlfSwgezE2MzMzMzMsIGZhbHNlfSwKK307CisKK3N0YXRpYyBjb25zdCBUZXN0RnJhbWUgdGVzdEZyYW1lczQwRnBzW10gPSB7CisgICAgezEwMDAwMDAsIGZhbHNlfSwgezEwMjUwMDAsIHRydWV9LCB7MTA1MDAwMCwgZmFsc2V9LCB7MTA3NTAwMCwgZmFsc2V9LAorICAgIHsxMTAwMDAwLCBmYWxzZX0sIHsxMTI1MDAwLCB0cnVlfSwgezExNTAwMDAsIGZhbHNlfSwgezExNzUwMDAsIGZhbHNlfSwKKyAgICB7MTIwMDAwMCwgZmFsc2V9LCB7MTIyNTAwMCwgdHJ1ZX0sIHsxMjUwMDAwLCBmYWxzZX0sIHsxMjc1MDAwLCBmYWxzZX0sCisgICAgezEzMDAwMDAsIGZhbHNlfSwgezEzMjUwMDAsIHRydWV9LCB7MTM1MDAwMCwgZmFsc2V9LCB7MTM3NTAwMCwgZmFsc2V9LAorICAgIHsxNDAwMDAwLCBmYWxzZX0sIHsxNDI1MDAwLCB0cnVlfSwgezE0NTAwMDAsIGZhbHNlfSwgezE0NzUwMDAsIGZhbHNlfSwKK307CisKK3N0YXRpYyBjb25zdCBUZXN0RnJhbWUgdGVzdEZyYW1lczYwRnBzW10gPSB7CisgICAgezEwMDAwMDAsIGZhbHNlfSwgezEwMTY2NjcsIHRydWV9LCB7MTAzMzMzMywgZmFsc2V9LCB7MTA1MDAwMCwgdHJ1ZX0sCisgICAgezEwNjY2NjcsIGZhbHNlfSwgezEwODMzMzMsIHRydWV9LCB7MTEwMDAwMCwgZmFsc2V9LCB7MTExNjY2NywgdHJ1ZX0sCisgICAgezExMzMzMzMsIGZhbHNlfSwgezExNTAwMDAsIHRydWV9LCB7MTE2NjY2NywgZmFsc2V9LCB7MTE4MzMzMywgdHJ1ZX0sCisgICAgezEyMDAwMDAsIGZhbHNlfSwgezEyMTY2NjcsIHRydWV9LCB7MTIzMzMzMywgZmFsc2V9LCB7MTI1MDAwMCwgdHJ1ZX0sCisgICAgezEyNjY2NjcsIGZhbHNlfSwgezEyODMzMzMsIHRydWV9LCB7MTMwMDAwMCwgZmFsc2V9LCB7MTMxNjY2NywgdHJ1ZX0sCit9OworCitzdGF0aWMgY29uc3QgVGVzdEZyYW1lIHRlc3RGcmFtZXNWYXJpYWJsZUZwc1tdID0geworICAgIC8vIDQwZnBzCisgICAgezEwMDAwMDAsIGZhbHNlfSwgezEwMjUwMDAsIHRydWV9LCB7MTA1MDAwMCwgZmFsc2V9LCB7MTA3NTAwMCwgZmFsc2V9LAorICAgIHsxMTAwMDAwLCBmYWxzZX0sIHsxMTI1MDAwLCB0cnVlfSwgezExNTAwMDAsIGZhbHNlfSwgezExNzUwMDAsIGZhbHNlfSwKKyAgICB7MTIwMDAwMCwgZmFsc2V9LCB7MTIyNTAwMCwgdHJ1ZX0sIHsxMjUwMDAwLCBmYWxzZX0sIHsxMjc1MDAwLCBmYWxzZX0sCisgICAgezEzMDAwMDAsIGZhbHNlfSwgezEzMjUwMDAsIHRydWV9LCB7MTM1MDAwMCwgZmFsc2V9LCB7MTM3NTAwMCwgZmFsc2V9LAorICAgIHsxNDAwMDAwLCBmYWxzZX0sIHsxNDI1MDAwLCB0cnVlfSwgezE0NTAwMDAsIGZhbHNlfSwgezE0NzUwMDAsIGZhbHNlfSwKKyAgICAvLyBhIHRpbWVzdGFtcCBqdW1wIHBsdXMgc3dpdGNoIHRvIDIwZnBzCisgICAgezIwMDAwMDAsIGZhbHNlfSwgezIwNTAwMDAsIGZhbHNlfSwgezIxMDAwMDAsIGZhbHNlfSwgezIxNTAwMDAsIGZhbHNlfSwKKyAgICB7MjIwMDAwMCwgZmFsc2V9LCB7MjI1MDAwMCwgZmFsc2V9LCB7MjMwMDAwMCwgZmFsc2V9LCB7MjM1MDAwMCwgZmFsc2V9LAorICAgIHsyNDAwMDAwLCBmYWxzZX0sIHsyNDUwMDAwLCBmYWxzZX0sIHsyNTAwMDAwLCBmYWxzZX0sIHsyNTUwMDAwLCBmYWxzZX0sCisgICAgezI2MDAwMDAsIGZhbHNlfSwgezI2NTAwMDAsIGZhbHNlfSwgezI3MDAwMDAsIGZhbHNlfSwgezI3NTAwMDAsIGZhbHNlfSwKKyAgICB7MjgwMDAwMCwgZmFsc2V9LCB7Mjg1MDAwMCwgZmFsc2V9LCB7MjkwMDAwMCwgZmFsc2V9LCB7Mjk1MDAwMCwgZmFsc2V9LAorICAgIC8vIDYwZnBzCisgICAgezI5NjY2NjcsIGZhbHNlfSwgezI5ODMzMzMsIHRydWV9LCB7MzAwMDAwMCwgZmFsc2V9LCB7MzAxNjY2NywgdHJ1ZX0sCisgICAgezMwMzMzMzMsIGZhbHNlfSwgezMwNTAwMDAsIHRydWV9LCB7MzA2NjY2NywgZmFsc2V9LCB7MzA4MzMzMywgdHJ1ZX0sCisgICAgezMxMDAwMDAsIGZhbHNlfSwgezMxMTY2NjcsIHRydWV9LCB7MzEzMzMzMywgZmFsc2V9LCB7MzE1MDAwMCwgdHJ1ZX0sCisgICAgezMxNjY2NjcsIGZhbHNlfSwgezMxODMzMzMsIHRydWV9LCB7MzIwMDAwMCwgZmFsc2V9LCB7MzIxNjY2NywgdHJ1ZX0sCisgICAgezMyMzMzMzMsIGZhbHNlfSwgezMyNTAwMDAsIHRydWV9LCB7MzI2NjY2NywgZmFsc2V9LCB7MzI4MzMzMywgdHJ1ZX0sCit9OworCitzdGF0aWMgY29uc3QgaW50IGtNYXhUZXN0Sml0dGVyVXMgPSAyMDAwOworLy8gcmV0dXJuIG9uZSBvZiAxMDAwLCAwLCAtMTAwMCBhcyBqaXR0ZXIuCitzdGF0aWMgaW50IEdldEppdHRlcihzaXplX3QgaSkgeworICAgIHJldHVybiAoMSAtIChpICUgMykpICogKGtNYXhUZXN0Sml0dGVyVXMgLyAyKTsKK30KKworY2xhc3MgRnJhbWVEcm9wcGVyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHVibGljOgorICAgIEZyYW1lRHJvcHBlclRlc3QoKSA6IG1GcmFtZURyb3BwZXIobmV3IEZyYW1lRHJvcHBlcigpKSB7CisgICAgICAgIEVYUEVDVF9FUShPSywgbUZyYW1lRHJvcHBlci0+c2V0TWF4RnJhbWVSYXRlKDMwLjApKTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIFJ1blRlc3QoY29uc3QgVGVzdEZyYW1lKiBmcmFtZXMsIHNpemVfdCBzaXplKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgICAgICAgICBpbnQgaml0dGVyID0gR2V0Sml0dGVyKGkpOworICAgICAgICAgICAgaW50NjRfdCB0ZXN0VGltZVVzID0gZnJhbWVzW2ldLnRpbWVVcyArIGppdHRlcjsKKyAgICAgICAgICAgIHByaW50ZigidGltZSAlbGxkLCB0ZXN0VGltZSAlbGxkLCBqaXR0ZXIgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpZnJhbWVzW2ldLnRpbWVVcywgKGxvbmcgbG9uZyl0ZXN0VGltZVVzLCBqaXR0ZXIpOworICAgICAgICAgICAgRVhQRUNUX0VRKGZyYW1lc1tpXS5zaG91bGREcm9wLCBtRnJhbWVEcm9wcGVyLT5zaG91bGREcm9wKHRlc3RUaW1lVXMpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNwPEZyYW1lRHJvcHBlcj4gbUZyYW1lRHJvcHBlcjsKK307CisKK1RFU1RfRihGcmFtZURyb3BwZXJUZXN0LCBUZXN0SW52YWxpZE1heEZyYW1lUmF0ZSkgeworICAgIEVYUEVDVF9ORShPSywgbUZyYW1lRHJvcHBlci0+c2V0TWF4RnJhbWVSYXRlKC0xLjApKTsKKyAgICBFWFBFQ1RfTkUoT0ssIG1GcmFtZURyb3BwZXItPnNldE1heEZyYW1lUmF0ZSgwKSk7Cit9CisKK1RFU1RfRihGcmFtZURyb3BwZXJUZXN0LCBUZXN0MjBGcHMpIHsKKyAgICBSdW5UZXN0KHRlc3RGcmFtZXMyMEZwcywgQVJSQVlfU0laRSh0ZXN0RnJhbWVzMjBGcHMpKTsKK30KKworVEVTVF9GKEZyYW1lRHJvcHBlclRlc3QsIFRlc3QzMEZwcykgeworICAgIFJ1blRlc3QodGVzdEZyYW1lczMwRnBzLCBBUlJBWV9TSVpFKHRlc3RGcmFtZXMzMEZwcykpOworfQorCitURVNUX0YoRnJhbWVEcm9wcGVyVGVzdCwgVGVzdDQwRnBzKSB7CisgICAgUnVuVGVzdCh0ZXN0RnJhbWVzNDBGcHMsIEFSUkFZX1NJWkUodGVzdEZyYW1lczQwRnBzKSk7Cit9CisKK1RFU1RfRihGcmFtZURyb3BwZXJUZXN0LCBUZXN0NjBGcHMpIHsKKyAgICBSdW5UZXN0KHRlc3RGcmFtZXM2MEZwcywgQVJSQVlfU0laRSh0ZXN0RnJhbWVzNjBGcHMpKTsKK30KKworVEVTVF9GKEZyYW1lRHJvcHBlclRlc3QsIFRlc3RWYXJpYWJsZUZwcykgeworICAgIFJ1blRlc3QodGVzdEZyYW1lc1ZhcmlhYmxlRnBzLCBBUlJBWV9TSVpFKHRlc3RGcmFtZXNWYXJpYWJsZUZwcykpOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjA2ZWQ3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotICAgICAgICBDMi5jcHAgICAgXAotCi1MT0NBTF9DX0lOQ0xVREVTICs9IFwKLSAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL2luY2x1ZGUgXAotICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9oYXJkd2FyZSBcCi0KLUxPQ0FMX01PRFVMRTo9IGxpYnN0YWdlZnJpZ2h0X2NvZGVjMgotTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IgLVdhbGwKLUxPQ0FMX0NMQU5HIDo9IHRydWUKLUxPQ0FMX1NBTklUSVpFIDo9IHVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3cgc2lnbmVkLWludGVnZXItb3ZlcmZsb3cgY2ZpCi1MT0NBTF9TQU5JVElaRV9ESUFHIDo9IGNmaQotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWluY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi9DMi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvQzIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTFiMDczLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi9DMi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPEMyLmg+Ci0jaW5jbHVkZSA8QzJCdWZmZXIuaD4KLSNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgotI2luY2x1ZGUgPEMyQ29uZmlnLmg+Ci0jaW5jbHVkZSA8QzJQYXJhbS5oPgotI2luY2x1ZGUgPEMyUGFyYW1EZWYuaD4KLSNpbmNsdWRlIDxDMldvcmsuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vKioKLSAqIFRoZXJlIGlzIG5vdGhpbmcgaGVyZSB5ZXQuIFRoaXMgbGlicmFyeSBpcyBidWlsdCB0byBzZWUgd2hhdCBzeW1ib2xzIGFuZCBtZXRob2RzIGdldAotICogZGVmaW5lZCBhcyBwYXJ0IG9mIHRoZSBBUEkgaW5jbHVkZSBmaWxlcy4KLSAqCi0gKiBHb2luZyBmb3J3YXJkLCB0aGUgQ29kZWMyIGxpYnJhcnkgd2lsbCBjb250YWluIHV0aWxpdHkgbWV0aG9kcyB0aGF0IGFyZSB1c2VmdWwgZm9yCi0gKiBDb2RlYzIgY2xpZW50cy4KLSAqLwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi9pbmNsdWRlL0MyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvaW5jbHVkZS9DMi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDAwYTAzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi9pbmNsdWRlL0MyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyODcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQzJfSF8KLSNkZWZpbmUgQzJfSF8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8bGlzdD4KLQotI2lmZGVmIF9fQU5EUk9JRF9fCi0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4gICAgICAgLy8gZm9yIHN0YXR1c190Ci0jaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+ICAgICAgIC8vIGZvciBuc2Vjc190Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotI2Vsc2UKLQotI2luY2x1ZGUgPGVycm5vLmg+Ci10eXBlZGVmIGludDY0X3QgbnNlY3NfdDsKLQotZW51bSB7Ci0gICAgR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOLAotICAgIEdSQUxMT0NfVVNBR0VfUkVOREVSU0NSSVBULAotICAgIEdSQUxMT0NfVVNBR0VfSFdfVEVYVFVSRSwKLSAgICBHUkFMTE9DX1VTQUdFX0hXX0NPTVBPU0VSLAotICAgIEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUiwKLSAgICBHUkFMTE9DX1VTQUdFX1BST1RFQ1RFRCwKLSAgICBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOLAotICAgIEdSQUxMT0NfVVNBR0VfSFdfUkVOREVSLAotfTsKLQotI2VuZGlmCi0KLS8qKiBcbWFpbnBhZ2UgQ29kZWMyCi0gKgotICogQ29kZWMyIGlzIGEgZnJhbWUtYmFzZWQgZGF0YSBwcm9jZXNzaW5nIEFQSSB1c2VkIGJ5IGFuZHJvaWQuCi0gKgotICogVGhlIGZyYW1ld29yayBhY2Nlc3NlcyBjb21wb25lbnRzIHZpYSB0aGUgXHJlZiBBUEkuCi0gKi8KLQotLyoqIFxpbmdyb3VwIEFQSQotICoKLSAqIFRoZSBDb2RlYzIgQVBJIGRlZmluZXMgdGhlIG9wZXJhdGlvbiBvZiBkYXRhIHByb2Nlc3NpbmcgY29tcG9uZW50cyBhbmQgdGhlaXIgaW50ZXJhY3Rpb24gd2l0aAotICogdGhlIHJlc3Qgb2YgdGhlIHN5c3RlbS4KLSAqCi0gKiBDb2RpbmcgQ29udmVudGlvbnMKLSAqCi0gKiBNaXRpZ2F0aW5nIEJpbmFyeSBDb21wYXRpYmlsaXR5LgotICoKLSAqIFdoaWxlIGZ1bGwgYmluYXJ5IGNvbXBhdGliaWxpdHkgaXMgbm90IGEgZ29hbCBvZiB0aGUgQVBJIChkdWUgdG8gb3VyIHVzZSBvZiBTVEwpLCB3ZSB0cnkgdG8KLSAqIG1pdGlnYXRlIGJpbmFyeSBicmVha3MgYnkgYWRoZXJpbmcgdG8gdGhlIGZvbGxvd2luZyBjb252ZW50aW9uczoKLSAqCi0gKiAtIGF0IG1vc3Qgb25lIHZ0YWJsZSB3aXRoIHBsYWNlaG9sZGVyIHZpcnR1YWwgbWV0aG9kcwotICogLSBhbGwgb3B0aW9uYWwvcGxhY2Vob2xkZXIgdmlydHVhbCBtZXRob2RzIHJldHVybmluZyBhIHN0YXR1c190LCB3aXRoIEMyX05PVF9JTVBMRU1FTlRFRCBub3QKLSAqICAgcmVxdWlyaW5nIGFueSB1cGRhdGUgdG8gaW5wdXQvb3V0cHV0IGFyZ3VtZW50cy4KLSAqIC0gbGltaXRpbmcgc3ltYm9sIGV4cG9ydCBvZiBpbmxpbmUgbWV0aG9kcwotICogLSB1c2Ugb2YgcGltcGwgKG9yIHNoYXJlZC1waW1wbCkKLSAqCi0gKiBOYW1pbmcKLSAqCi0gKiAtIGFsbCBjbGFzc2VzIGFuZCB0eXBlcyBwcmVmaXggd2l0aCBDMgotICogLSBjbGFzc2VzIGZvciBpbnRlcm5hbCB1c2UgcHJlZml4IHdpdGggX0MyCi0gKiAtIGVudW0gdmFsdWVzIGluIGdsb2JhbCBuYW1lc3BhY2UgcHJlZml4IHdpdGggQzJfIGFsbCBjYXBzCi0gKiAtIGVudW0gdmFsdWVzIGluc2lkZSBjbGFzc2VzIGhhdmUgbm8gQzJfIHByZWZpeCBhcyBjbGFzcyBhbHJlYWR5IGhhcyBpdAotICogLSBzdXBwb3J0aW5nIHR3byBraW5kcyBvZiBlbnVtIG5hbWluZzogYWxsLWNhcHMgYW5kIGtDYW1lbENhc2UKLSAqIFx0b2RvIHJldmlzaXQga0NhbWVsQ2FzZSBmb3IgcGFyYW0tdHlwZQotICoKLSAqIEFzcGVjdHMKLSAqCi0gKiBBc3BlY3RzIGRlZmluZSBjZXJ0YWluIGNvbW1vbiBiZWhhdmlvciBhY3Jvc3MgYSBncm91cCBvZiBvYmplY3RzLgotICogLSBjbGFzc2VzIHdob3NlIG5hbWUgbWF0Y2hlcyBfQzIuKkFzcGVjdAotICogLSBvbmx5IHByb3RlY3RlZCBjb25zdHJ1Y3RvcnMKLSAqIC0gbm8gZGVzY3RydWN0b3IgYW5kIGNvcGlhYmxlCi0gKiAtIGFsbCBtZXRob2RzIGFyZSBpbmxpbmUgb3Igc3RhdGljICh0aGlzIGlzIG9wcG9zaXRlIG9mIHRoZSBpbnRlcmZhY2UgcGFyYWRpZ20gd2hlcmUgYWxsIG1ldGhvZHMKLSAqICAgYXJlIHZpcnR1YWwsIHdoaWNoIHdvdWxkIG5vdCB3b3JrIGR1ZSB0byB0aGUgYXQgbW9zdCBvbmUgdnRhYmxlIHJ1bGUuKQotICogLSBvbmx5IHByaXZhdGUgdmFyaWFibGVzICh0aGlzIHByZXZlbnRzIHN1YmNsYXNzZXMgaW50ZXJmZXJpbmcgd2l0aCB0aGUgYXNwZWN0cy4pCi0gKi8KLQotLy8vIFxkZWZncm91cCB0eXBlcyBDb21tb24gVHlwZXMKLS8vLyBAewotCi0vKioKLSAqIEMyU3RyaW5nOiBiYXNpYyBzdHJpbmcgaW1wbGVtZW50YXRpb24KLSAqLwotdHlwZWRlZiBzdGQ6OnN0cmluZyBDMlN0cmluZzsKLXR5cGVkZWYgY29uc3QgY2hhciAqQzJTdHJpbmdMaXRlcmFsOwotCi0vKioKLSAqIEMyRXJyb3I6IHN0YXR1cyBjb2RlcyB1c2VkLgotICovCi10eXBlZGVmIGludDMyX3QgQzJFcnJvcjsKLWVudW0gewotI2lmbmRlZiBfX0FORFJPSURfXwotICAgIE9LICAgICAgICAgICAgICAgICAgPSAwLAotICAgIEJBRF9WQUxVRSAgICAgICAgICAgPSAtRUlOVkFMLAotICAgIEJBRF9JTkRFWCAgICAgICAgICAgPSAtRU9WRVJGTE9XLAotICAgIFVOS05PV05fVFJBTlNBQ1RJT04gPSAtRUJBRE1TRywKLSAgICBBTFJFQURZX0VYSVNUUyAgICAgID0gLUVFWElTVCwKLSAgICBOQU1FX05PVF9GT1VORCAgICAgID0gLUVOT0VOVCwKLSAgICBJTlZBTElEX09QRVJBVElPTiAgID0gLUVOT1NZUywKLSAgICBOT19NRU1PUlkgICAgICAgICAgID0gLUVOT01FTSwKLSAgICBQRVJNSVNTSU9OX0RFTklFRCAgID0gLUVQRVJNLAotICAgIFRJTUVEX09VVCAgICAgICAgICAgPSAtRVRJTUVET1VULAotICAgIFVOS05PV05fRVJST1IgICAgICAgPSAtRUlOVkFMLAotI2VuZGlmCi0KLSAgICBDMl9PSyAgICAgICAgICAgICAgID0gT0ssICAgICAgICAgICAgICAgICAgIC8vLzwgb3BlcmF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkKLQotICAgIC8vIGJhZCBpbnB1dAotICAgIEMyX0JBRF9WQUxVRSAgICAgICAgPSBCQURfVkFMVUUsICAgICAgICAgICAgLy8vPCBhcmd1bWVudCBoYXMgaW52YWxpZCB2YWx1ZSAodXNlciBlcnJvcikKLSAgICBDMl9CQURfSU5ERVggICAgICAgID0gQkFEX0lOREVYLCAgICAgICAgICAgIC8vLzwgYXJndW1lbnQgdXNlcyBpbnZhbGlkIGluZGV4ICh1c2VyIGVycm9yKQotICAgIEMyX1VOU1VQUE9SVEVEICAgICAgPSBVTktOT1dOX1RSQU5TQUNUSU9OLCAgLy8vPCBhcmd1bWVudC9pbmRleCBpcyB2YWx1ZSBidXQgbm90IHN1cHBvcnRlZCBcdG9kbyBpcyB0aGlzIHJlYWxseSBCQURfSU5ERVgvVkFMVUU/Ci0KLSAgICAvLyBiYWQgc2VxdWVuY2luZyBvZiBldmVudHMKLSAgICBDMl9EVVBMSUNBVEUgICAgICAgID0gQUxSRUFEWV9FWElTVFMsICAgICAgIC8vLzwgb2JqZWN0IGFscmVhZHkgZXhpc3RzCi0gICAgQzJfTk9UX0ZPVU5EICAgICAgICA9IE5BTUVfTk9UX0ZPVU5ELCAgICAgICAvLy88IG9iamVjdCBub3QgZm91bmQKLSAgICBDMl9CQURfU1RBVEUgICAgICAgID0gSU5WQUxJRF9PUEVSQVRJT04sICAgIC8vLzwgb3BlcmF0aW9uIGlzIG5vdCBwZXJtaXR0ZWQgaW4gdGhlIGN1cnJlbnQgc3RhdGUKLQotICAgIC8vIGJhZCBlbnZpcm9ubWVudAotICAgIEMyX05PX01FTU9SWSAgICAgICAgPSBOT19NRU1PUlksICAgICAgICAgICAgLy8vPCBub3QgZW5vdWdoIG1lbW9yeSB0byBjb21wbGV0ZSBvcGVyYXRpb24KLSAgICBDMl9OT19QRVJNSVNTSU9OICAgID0gUEVSTUlTU0lPTl9ERU5JRUQsICAgIC8vLzwgbWlzc2luZyBwZXJtaXNzaW9uIHRvIGNvbXBsZXRlIG9wZXJhdGlvbgotICAgIEMyX1RJTUVEX09VVCAgICAgICAgPSBUSU1FRF9PVVQsICAgICAgICAgICAgLy8vPCBvcGVyYXRpb24gZGlkIG5vdCBjb21wbGV0ZSB3aXRoaW4gdGltZW91dAotCi0gICAgLy8gYmFkIHZlcnNpb25pbmcKLSAgICBDMl9OT1RfSU1QTEVNRU5URUQgID0gVU5LTk9XTl9UUkFOU0FDVElPTiwgIC8vLzwgb3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCAob3B0aW9uYWwgb25seSkgXHRvZG8gZm9yIG5vdyByZXVzZSBlcnJvciBjb2RlCi0KLSAgICAvLyB1bmtub3duIGZhdGFsCi0gICAgQzJfQ09SUlVQVEVEICAgICAgICA9IFVOS05PV05fRVJST1IsICAgICAgICAvLy88IHNvbWUgdW5leHBlY3RlZCBlcnJvciBwcmV2ZW50ZWQgdGhlIG9wZXJhdGlvbgotfTsKLQotLy8vIEB9Ci0KLS8vLyBcZGVmZ3JvdXAgdXRpbHMgVXRpbGl0aWVzCi0vLy8gQHsKLQotI2RlZmluZSBDMl9ET19OT1RfQ09QWSh0eXBlLCBhcmdzLi4uKSBcCi0gICAgdHlwZSBhcmdzJiBvcGVyYXRvcj0oY29uc3QgdHlwZSBhcmdzJikgPSBkZWxldGU7IFwKLSAgICB0eXBlKGNvbnN0IHR5cGUgYXJncyYpID0gZGVsZXRlOyBcCi0KLSNkZWZpbmUgQzJfUFVSRSBfX2F0dHJpYnV0ZV9fKChwdXJlKSkKLSNkZWZpbmUgQzJfQ09OU1QgX19hdHRyaWJ1dGVfXygoY29uc3QpKQotI2RlZmluZSBDMl9ISURFIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImhpZGRlbiIpKSkKLSNkZWZpbmUgQzJfSU5URVJOQUwgX19hdHRyaWJ1dGVfXygoaW50ZXJuYWxfbGlua2FnZSkpCi0KLSNkZWZpbmUgREVGSU5FX09USEVSX0NPTVBBUklTT05fT1BFUkFUT1JTKHR5cGUpIFwKLSAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHR5cGUgJm90aGVyKSB7IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsgfSBcCi0gICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCB0eXBlICZvdGhlcikgeyByZXR1cm4gKCp0aGlzID09IG90aGVyKSB8fCAoKnRoaXMgPCBvdGhlcik7IH0gXAotICAgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgdHlwZSAmb3RoZXIpIHsgcmV0dXJuICEoKnRoaXMgPCBvdGhlcik7IH0gXAotICAgIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCB0eXBlICZvdGhlcikgeyByZXR1cm4gISgqdGhpcyA8IG90aGVyKSAmJiAhKCp0aGlzID09IG90aGVyKTsgfQotCi0jZGVmaW5lIERFRklORV9GSUVMRF9CQVNFRF9DT01QQVJJU09OX09QRVJBVE9SUyh0eXBlLCBmaWVsZCkgXAotICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCB0eXBlICZvdGhlcikgY29uc3QgeyByZXR1cm4gZmllbGQgPCBvdGhlci5maWVsZDsgfSBcCi0gICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCB0eXBlICZvdGhlcikgY29uc3QgeyByZXR1cm4gZmllbGQgPT0gb3RoZXIuZmllbGQ7IH0gXAotICAgIERFRklORV9PVEhFUl9DT01QQVJJU09OX09QRVJBVE9SUyh0eXBlKQotCi0vLy8gXGNvbmQgSU5URVJOQUwKLQotLy8vIFxkZWZncm91cCB1dGlsc19pbnRlcm5hbAotLy8vIEB7Ci0KLXRlbXBsYXRlPHR5cGVuYW1lLi4uIFQ+IHN0cnVjdCBjMl90eXBlczsKLQotLyoqIHNwZWNpYWxpemF0aW9uIGZvciBhIHNpbmdsZSB0eXBlICovCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotc3RydWN0IGMyX3R5cGVzPFQ+IHsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6ZGVjYXk8VD46OnR5cGUgd2lkZV90eXBlOwotICAgIHR5cGVkZWYgd2lkZV90eXBlIG5hcnJvd190eXBlOwotICAgIHR5cGVkZWYgd2lkZV90eXBlIG1pbnR5cGU7Ci19OwotCi0vKiogc3BlY2lhbGl6YXRpb24gZm9yIHR3byB0eXBlcyAqLwotdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KLXN0cnVjdCBjMl90eXBlczxULCBVPiB7Ci0gICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PFQ+Ojp2YWx1ZSA9PSBzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PFU+Ojp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICJtaXhpbmcgZmxvYXRpbmcgcG9pbnQgYW5kIG5vbi1mbG9hdGluZyBwb2ludCB0eXBlcyBpcyBkaXNhbGxvd2VkIik7Ci0gICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NpZ25lZDxUPjo6dmFsdWUgPT0gc3RkOjppc19zaWduZWQ8VT46OnZhbHVlLAotICAgICAgICAgICAgICAgICAgIm1peGluZyBzaWduZWQgYW5kIHVuc2lnbmVkIHR5cGVzIGlzIGRpc2FsbG93ZWQiKTsKLQotICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpkZWNheTwKLSAgICAgICAgICAgIGRlY2x0eXBlKHRydWUgPyBzdGQ6OmRlY2x2YWw8VD4oKSA6IHN0ZDo6ZGVjbHZhbDxVPigpKT46OnR5cGUgd2lkZV90eXBlOwotICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpkZWNheTwKLSAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8c2l6ZW9mKFQpIDwgc2l6ZW9mKFUpLCBULCBVPjo6dHlwZT46OnR5cGUgbmFycm93X3R5cGU7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPAotICAgICAgICAgICAgc3RkOjppc19zaWduZWQ8VD46OnZhbHVlLCB3aWRlX3R5cGUsIG5hcnJvd190eXBlPjo6dHlwZSBtaW50eXBlOwotfTsKLQotLy8vIEB9Ci0KLS8vLyBcZW5kY29uZAotCi0vKioKLSAqIFR5cGUgc3VwcG9ydCB1dGlsaXR5IGNsYXNzLiBPbmx5IHN1cHBvcnRzIHNpbWlsYXIgY2xhc3Nlcywgc3VjaCBhczoKLSAqIC0gYWxsIGZsb2F0aW5nIHBvaW50Ci0gKiAtIGFsbCB1bnNpZ25lZC9hbGwgc2lnbmVkCi0gKiAtIGFsbCBwb2ludGVyCi0gKi8KLXRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHR5cGVuYW1lLi4uIFY+Ci1zdHJ1Y3QgYzJfdHlwZXM8VCwgVSwgVi4uLj4gewotICAgIC8qKiBDb21tb24gdHlwZSB0aGF0IGFjY29tbW9kYXRlcyBhbGwgdGVtcGxhdGUgcGFyYW1ldGVyIHR5cGVzLiAqLwotICAgIHR5cGVkZWYgdHlwZW5hbWUgYzJfdHlwZXM8dHlwZW5hbWUgYzJfdHlwZXM8VCwgVT46OndpZGVfdHlwZSwgVi4uLj46OndpZGVfdHlwZSB3aWRlX3R5cGU7Ci0gICAgLyoqIE5hcnJvd2VzdCB0eXBlIG9mIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgdHlwZXMuICovCi0gICAgdHlwZWRlZiB0eXBlbmFtZSBjMl90eXBlczx0eXBlbmFtZSBjMl90eXBlczxULCBVPjo6bmFycm93X3R5cGUsIFYuLi4+OjpuYXJyb3dfdHlwZSBuYXJyb3dfdHlwZTsKLSAgICAvKiogVHlwZSB0aGF0IGFjY29tbW9kYXRlcyB0aGUgbWluaW11bSB2YWx1ZSBmb3IgYW55IGlucHV0IGZvciB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyIHR5cGVzLiAqLwotICAgIHR5cGVkZWYgdHlwZW5hbWUgYzJfdHlwZXM8dHlwZW5hbWUgYzJfdHlwZXM8VCwgVT46Om1pbnR5cGUsIFYuLi4+OjptaW50eXBlIG1pbnR5cGU7Ci19OwotCi0vKioKLSAqICBcaW5ncm91cCB1dGlsc19pbnRlcm5hbAotICogc3BlY2lhbGl6YXRpb24gZm9yIHR3byB2YWx1ZXMgKi8KLXRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+Ci1pbmxpbmUgY29uc3RleHByIHR5cGVuYW1lIGMyX3R5cGVzPFQsIFU+Ojp3aWRlX3R5cGUgYzJfbWF4KGNvbnN0IFQgYSwgY29uc3QgVSBiKSB7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBjMl90eXBlczxULCBVPjo6d2lkZV90eXBlIHdpZGVfdHlwZTsKLSAgICByZXR1cm4gKHsgd2lkZV90eXBlIGFfKGEpLCBiXyhiKTsgYV8gPiBiXyA/IGFfIDogYl87IH0pOwotfQotCi0vKioKLSAqIEZpbmRzIHRoZSBtYXhpbXVtIHZhbHVlIG9mIGEgbGlzdCBvZiAic2ltaWxhcmx5IHR5cGVkIiB2YWx1ZXMuCi0gKgotICogVGhpcyBpcyBhbiBleHRlbnNpb24gdG8gc3RkOjptYXggd2hlcmUgdGhlIHR5cGVzIGRvIG5vdCBoYXZlIHRvIGJlIGlkZW50aWNhbCwgYW5kIHRoZSBzbWFsbGVzdAotICogcmVzdWx0aW5nIHR5cGUgaXMgdXNlZCB0aGF0IGFjY29tbW9kYXRlcyB0aGUgYXJndW1lbnQgdHlwZXMuCi0gKgotICogXG5vdGUgVmFsdWUgdHlwZXMgbXVzdCBiZSBzaW1pbGFyLCBlLmcuIGFsbCBmbG9hdGluZyBwb2ludCwgYWxsIHBvaW50ZXJzLCBhbGwgc2lnbmVkLCBvciBhbGwKLSAqIHVuc2lnbmVkLgotICoKLSAqIEByZXR1cm4gdGhlIGxhcmdlc3Qgb2YgdGhlIGlucHV0IGFyZ3VtZW50cy4KLSAqLwotdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVSwgdHlwZW5hbWUuLi4gVj4KLWNvbnN0ZXhwciB0eXBlbmFtZSBjMl90eXBlczxULCBVLCBWLi4uPjo6d2lkZV90eXBlIGMyX21heChjb25zdCBUIGEsIGNvbnN0IFUgYiwgY29uc3QgViAuLi4gYykgewotICAgIHR5cGVkZWYgdHlwZW5hbWUgYzJfdHlwZXM8VCwgVSwgVi4uLj46OndpZGVfdHlwZSB3aWRlX3R5cGU7Ci0gICAgcmV0dXJuICh7IHdpZGVfdHlwZSBhXyhhKSwgYl8oYzJfbWF4KGIsIGMuLi4pKTsgYV8gPiBiXyA/IGFfIDogYl87IH0pOwotfQotCi0vKioKLSAqICBcaW5ncm91cCB1dGlsc19pbnRlcm5hbAotICogc3BlY2lhbGl6YXRpb24gZm9yIHR3byB2YWx1ZXMgKi8KLXRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+Ci1pbmxpbmUgY29uc3RleHByIHR5cGVuYW1lIGMyX3R5cGVzPFQsIFU+OjptaW50eXBlIGMyX21pbihjb25zdCBUIGEsIGNvbnN0IFUgYikgewotICAgIHR5cGVkZWYgdHlwZW5hbWUgYzJfdHlwZXM8VCwgVT46OndpZGVfdHlwZSB3aWRlX3R5cGU7Ci0gICAgcmV0dXJuICh7Ci0gICAgICAgIHdpZGVfdHlwZSBhXyhhKSwgYl8oYik7Ci0gICAgICAgIHN0YXRpY19jYXN0PHR5cGVuYW1lIGMyX3R5cGVzPFQsIFU+OjptaW50eXBlPihhXyA8IGJfID8gYV8gOiBiXyk7Ci0gICAgfSk7Ci19Ci0KLS8qKgotICogRmluZHMgdGhlIG1pbmltdW0gdmFsdWUgb2YgYSBsaXN0IG9mICJzaW1pbGFybHkgdHlwZWQiIHZhbHVlcy4KLSAqCi0gKiBUaGlzIGlzIGFuIGV4dGVuc2lvbiB0byBzdGQ6Om1pbiB3aGVyZSB0aGUgdHlwZXMgZG8gbm90IGhhdmUgdG8gYmUgaWRlbnRpY2FsLCBhbmQgdGhlIHNtYWxsZXN0Ci0gKiByZXN1bHRpbmcgdHlwZSBpcyB1c2VkIHRoYXQgYWNjb21tb2RhdGVzIHRoZSBhcmd1bWVudCB0eXBlcy4KLSAqCi0gKiBcbm90ZSBWYWx1ZSB0eXBlcyBtdXN0IGJlIHNpbWlsYXIsIGUuZy4gYWxsIGZsb2F0aW5nIHBvaW50LCBhbGwgcG9pbnRlcnMsIGFsbCBzaWduZWQsIG9yIGFsbAotICogdW5zaWduZWQuCi0gKgotICogQHJldHVybiB0aGUgc21hbGxlc3Qgb2YgdGhlIGlucHV0IGFyZ3VtZW50cy4KLSAqLwotdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVSwgdHlwZW5hbWUuLi4gVj4KLWNvbnN0ZXhwciB0eXBlbmFtZSBjMl90eXBlczxULCBVLCBWLi4uPjo6bWludHlwZSBjMl9taW4oY29uc3QgVCBhLCBjb25zdCBVIGIsIGNvbnN0IFYgLi4uIGMpIHsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIGMyX3R5cGVzPFUsIFYuLi4+OjptaW50eXBlIHJlc3RfdHlwZTsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIGMyX3R5cGVzPFQsIHJlc3RfdHlwZT46OndpZGVfdHlwZSB3aWRlX3R5cGU7Ci0gICAgcmV0dXJuICh7Ci0gICAgICAgIHdpZGVfdHlwZSBhXyhhKSwgYl8oYzJfbWluKGIsIGMuLi4pKTsKLSAgICAgICAgc3RhdGljX2Nhc3Q8dHlwZW5hbWUgYzJfdHlwZXM8VCwgcmVzdF90eXBlPjo6bWludHlwZT4oYV8gPCBiXyA/IGFfIDogYl8pOwotICAgIH0pOwotfQotCi0vLy8gQH0KLQotI2lmZGVmIF9fQU5EUk9JRF9fCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0jZW5kaWYKLQotI2VuZGlmICAvLyBDMl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL2luY2x1ZGUvQzJCdWZmZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi9pbmNsdWRlL0MyQnVmZmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNmI0ODcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL2luY2x1ZGUvQzJCdWZmZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3NzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQzJCVUZGRVJfSF8KLSNkZWZpbmUgQzJCVUZGRVJfSF8KLQotI2luY2x1ZGUgPEMyLmg+Ci0jaW5jbHVkZSA8QzJQYXJhbS5oPiAvLyBmb3IgQzJJbmZvCi0KLSNpbmNsdWRlIDxsaXN0PgotI2luY2x1ZGUgPG1lbW9yeT4KLQotdHlwZWRlZiBpbnQgQzJGZW5jZTsKLQotI2lmZGVmIF9fQU5EUk9JRF9fCi0KLS8vICNpbmNsdWRlIDxzeXN0ZW0vd2luZG93Lmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9ncmFsbG9jLmg+IC8vIFRPRE86IHJlbW92ZQotCi10eXBlZGVmIG5hdGl2ZV9oYW5kbGVfdCBDMkhhbmRsZTsKLQotI2Vsc2UKLQotdHlwZWRlZiB2b2lkKiBDMkhhbmRsZTsKLQotI2VuZGlmCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8vIFxkZWZncm91cCBidWZmZXIgQnVmZmVycwotLy8vIEB7Ci0KLS8vLyBcZGVmZ3JvdXAgYnVmZmVyX3N5bmMgU3luY2hyb25pemF0aW9uCi0vLy8gQHsKLQotLyoqCi0gKiBTeW5jaHJvbml6YXRpb24gaXMgYWNjb21wbGlzaGVkIHVzaW5nIGV2ZW50IGFuZCBmZW5jZSBvYmplY3RzLgotICoKLSAqIFRoZXNlIGFyZSBjcm9zcy1wcm9jZXNzIGV4dGVuc2lvbnMgb2YgcHJvbWlzZS9mdXR1cmUgaW5mcmFzdHJ1Y3R1cmUuCi0gKiBFdmVudHMgYXJlIGFuYWxvZ291cyB0byBzdGQ6OnByb21pc2U8dm9pZD4sIHdoZXJlYXMgZmVuY2VzIGFyZSB0byBzdGQ6OnNoYXJlZF9mdXR1cmU8dm9pZD4uCi0gKgotICogRmVuY2VzIGFuZCBldmVudHMgYXJlIHNoYXJlYWJsZS9jb3B5YWJsZS4KLSAqCi0gKiBGZW5jZXMgYXJlIHVzZWQgaW4gdHdvIHNjZW5hcmlvcywgYW5kIGFsbCBjb3BpZWQgaW5zdGFuY2VzIHJlZmVyIHRvIHRoZSBzYW1lIGV2ZW50LgotICogXHRvZG8gZG8gZXZlbnRzIG5lZWQgdG8gYmUgY29weWFibGUgb3Igc2hvdWxkIHRoZXkgYmUgdW5pcXVlPwotICoKLSAqIGFjcXVpcmUgc3luYyBmZW5jZSBvYmplY3Q6IHNpZ25hbGVkIHdoZW4gaXQgaXMgc2FmZSBmb3IgdGhlIGNvbXBvbmVudCBvciBjbGllbnQgdG8gYWNjZXNzCi0gKiAodGhlIGNvbnRlbnRzIG9mKSBhbiBvYmplY3QuCi0gKgotICogcmVsZWFzZSBzeW5jIGZlbmNlIG9iamVjdDogXHRvZG8KLSAqCi0gKiBGZW5jZXMgY2FuIGJlIGJhY2tlZCBieSBoYXJkd2FyZS4gSGFyZHdhcmUgZmVuY2VzIGFyZSBndWFyYW50ZWVkIHRvIHNpZ25hbCBOTyBNQVRURVIgV0hBVCB3aXRoaW4KLSAqIGEgc2hvcnQgKHBsYXRmb3JtIHNwZWNpZmljKSBhbW91bnQgb2YgdGltZTsgdGhpcyBndWFyYW50ZWUgaXMgdXN1YWxseSBsZXNzIHRoYW4gMTUgbXNlY3MuCi0gKi8KLQotLyoqCi0gKiBGZW5jZSBvYmplY3QgdXNlZCBieSBjb21wb25lbnRzIGFuZCB0aGUgZnJhbWV3b3JrLgotICoKLSAqIEltcGxlbWVudHMgdGhlIHdhaXRpbmcgZm9yIGFuIGV2ZW50LCBhbmFsb2dvdXMgdG8gYSAnZnV0dXJlJy4KLSAqCi0gKiBUbyBiZSBpbXBsZW1lbnRlZCBieSB2ZW5kb3JzIGlmIHVzaW5nIEhXIGZlbmNlcy4KLSAqLwotY2xhc3MgQzJGZW5jZSB7Ci1wdWJsaWM6Ci0gICAgLyoqCi0gICAgICogV2FpdHMgZm9yIGEgZmVuY2UgdG8gYmUgc2lnbmFsZWQgd2l0aCBhIHRpbWVvdXQuCi0gICAgICoKLSAgICAgKiBcdG9kbyBhIG1lY2hhbmlzbSB0byBjYW5jZWwgYSB3YWl0IC0gZm9yIG5vdyB0aGUgb25seSB3YXkgdG8gZG8gdGhpcyBpcyB0byBhYmFuZG9uIHRoZQotICAgICAqIGV2ZW50LCBidXQgZmVuY2VzIGFyZSBzaGFyZWQgc28gY2FuY2VsaW5nIGEgd2FpdCB3aWxsIGNhbmNlbCBhbGwgd2FpdHMuCi0gICAgICoKLSAgICAgKiBccGFyYW0gdGltZW91dE5zICAgICAgICAgICB0aGUgbWF4aW11bSB0aW1lIHRvIHdhaXQgaW4gbnNlY3MKLSAgICAgKgotICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgICAgICB0aGUgZmVuY2UgaGFzIGJlZW4gc2lnbmFsZWQKLSAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCAgICAgdGhlIGZlbmNlIGhhcyBub3QgYmVlbiBzaWduYWxlZCB3aXRoaW4gdGhlIHRpbWVvdXQKLSAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSAgICAgdGhlIGZlbmNlIGhhcyBiZWVuIGFiYW5kb25lZCB3aXRob3V0IGJlaW5nIHNpZ25hbGVkIChpdCB3aWxsIG5ldmVyCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHNpZ25hbGVkKQotICAgICAqIFxyZXR2YWwgQzJfTk9fUEVSTUlTU0lPTiBubyBwZXJtaXNzaW9uIHRvIHdhaXQgZm9yIHRoZSBmZW5jZSAodW5leHBlY3RlZCAtIHN5c3RlbSkKLSAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCAgICAgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB3YWl0aW5nIGZvciB0aGUgZmVuY2UgKHVuZXhwZWN0ZWQpCi0gICAgICovCi0gICAgQzJFcnJvciB3YWl0KG5zZWNzX3QgdGltZW91dE5zKTsKLQotICAgIC8qKgotICAgICAqIFVzZWQgdG8gY2hlY2sgaWYgdGhpcyBmZW5jZSBpcyB2YWxpZCAoaWYgdGhlcmUgaXMgYSBjaGFuY2UgZm9yIGl0IHRvIGJlIHNpZ25hbGVkLikKLSAgICAgKiBBIGZlbmNlIGJlY29tZXMgaW52YWxpZCBpZiB0aGUgY29udHJvbGluZyBldmVudCBpcyBkZXN0cm95ZWQgd2l0aG91dCBpdCBzaWduYWxpbmcgdGhlIGZlbmNlLgotICAgICAqCi0gICAgICogXHJldHVybiB3aGV0aGVyIHRoaXMgZmVuY2UgaXMgdmFsaWQKLSAgICAgKi8KLSAgICBib29sIHZhbGlkKCkgY29uc3Q7Ci0KLSAgICAvKioKLSAgICAgKiBVc2VkIHRvIGNoZWNrIGlmIHRoaXMgZmVuY2UgaGFzIGJlZW4gc2lnbmFsZWQgKGlzIHJlYWR5KS4KLSAgICAgKgotICAgICAqIFxyZXR1cm4gd2hldGhlciB0aGlzIGZlbmNlIGhhcyBiZWVuIHNpZ25hbGVkCi0gICAgICovCi0gICAgYm9vbCByZWFkeSgpIGNvbnN0OwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGZpbGUgZGVzY3JpcHRvciB0aGF0IGNhbiBiZSB1c2VkIHRvIHdhaXQgZm9yIHRoaXMgZmVuY2UgaW4gYSBzZWxlY3Qgc3lzdGVtIGNhbGwuCi0gICAgICogXG5vdGUgVGhlIHJldHVybmVkIGZpbGUgZGVzY3JpcHRvciwgaWYgdmFsaWQsIG11c3QgYmUgY2xvc2VkIGJ5IHRoZSBjYWxsZXIuCi0gICAgICoKLSAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIGluIGUuZy4gcG9sbCgpIHN5c3RlbSBjYWxscy4gVGhpcyBmaWxlIGJlY29tZXMgcmVhZGFibGUgKFBPTExJTikgd2hlbiB0aGUKLSAgICAgKiBmZW5jZSBpcyBzaWduYWxlZCwgYW5kIGJhZCAoUE9MTEVSUikgaWYgdGhlIGZlbmNlIGlzIGFiYW5kb25lZC4KLSAgICAgKgotICAgICAqIFxyZXR1cm4gYSBmaWxlIGRlc2NyaXB0b3IgcmVwcmVzZW50aW5nIHRoaXMgZmVuY2UgKHdpdGggb3duZXJzaGlwKSwgb3IgLTEgaWYgdGhlIGZlbmNlCi0gICAgICogaGFzIGFscmVhZHkgYmVlbiBzaWduYWxlZCAoXHRvZG8gb3IgYWJhbmRvbmVkKS4KLSAgICAgKgotICAgICAqIFx0b2RvIHRoaXMgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggZmVuY2VzIHVzZWQgYnkgZ3JhbGxvYwotICAgICAqLwotICAgIGludCBmZCgpIGNvbnN0OwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmVuY2UgaXMgYSBoYXJkd2FyZS1iYWNrZWQgZmVuY2UuCi0gICAgICogXHJldHVybiB3aGV0aGVyIHRoaXMgaXMgYSBoYXJkd2FyZSBmZW5jZQotICAgICAqLwotICAgIGJvb2wgaXNIVygpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIGNsYXNzIEltcGw7Ci0gICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IG1JbXBsOwotfTsKLQotLyoqCi0gKiBFdmVudCBvYmplY3QgdXNlZCBieSBjb21wb25lbnRzIGFuZCB0aGUgZnJhbWV3b3JrLgotICoKLSAqIEltcGxlbWVudHMgdGhlIHNpZ25hbGluZyBvZiBhbiBldmVudCwgYW5hbG9nb3VzIHRvIGEgJ3Byb21pc2UnLgotICoKLSAqIEhhcmR3YXJlIGJhY2tlZCBldmVudHMgZG8gbm90IGdvIHRocm91Z2ggdGhpcyBvYmplY3QsIGFuZCBtdXN0IGJlIGV4cG9zZWQgZGlyZWN0bHkgYXMgZmVuY2VzCi0gKiBieSB2ZW5kb3JzLgotICovCi1jbGFzcyBDMkV2ZW50IHsKLXB1YmxpYzoKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgZmVuY2UgZm9yIHRoaXMgZXZlbnQuCi0gICAgICovCi0gICAgQzJGZW5jZSBmZW5jZSgpIGNvbnN0OwotCi0gICAgLyoqCi0gICAgICogU2lnbmFscyAoYWxsKSBhc3NvY2lhdGVkIGZlbmNlKHMpLgotICAgICAqIFRoaXMgaGFzIG5vIGVmZmVjdCBubyBlZmZlY3QgaWYgdGhlIGV2ZW50IHdhcyBhbHJlYWR5IHNpZ25hbGVkIG9yIGFiYW5kb25lZC4KLSAgICAgKgotICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgICAgICB0aGUgZmVuY2Uocykgd2VyZSBzdWNjZXNzZnVsbHkgc2lnbmFsZWQKLSAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSAgICAgdGhlIGZlbmNlKHMpIGhhdmUgYWxyZWFkeSBiZWVuIGFiYW5kb25lZCBvciBtZXJnZWQgKGNhbGxlciBlcnJvcikKLSAgICAgKiBccmV0dmFsIEMyX0FMUkVBRFlfRVhJU1RTIHRoZSBmZW5jZShzKSBoYXZlIGFscmVhZHkgYmVlbiBzaWduYWxlZCAoY2FsbGVyIGVycm9yKQotICAgICAqIFxyZXR2YWwgQzJfTk9fUEVSTUlTU0lPTiBubyBwZXJtaXNzaW9uIHRvIHNpZ25hbCB0aGUgZmVuY2UgKHVuZXhwZWN0ZWQgLSBzeXN0ZW0pCi0gICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgICAgIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgc2lnbmFsaW5nIHRoZSBmZW5jZShzKSAodW5leHBlY3RlZCkKLSAgICAgKi8KLSAgICBDMkVycm9yIGZpcmUoKTsKLQotICAgIC8qKgotICAgICAqIFRyaWdnZXIgdGhpcyBldmVudCBmcm9tIHRoZSBtZXJnaW5nIG9mIHRoZSBzdXBwbGllZCBmZW5jZXMuIFRoaXMgbWVhbnMgdGhhdCBpdCB3aWxsIGJlCi0gICAgICogYWJhbmRvbmVkIGlmIGFueSBvZiB0aGVzZSBmZW5jZXMgaGF2ZSBiZWVuIGFiYW5kb25lZCwgYW5kIGl0IHdpbGwgYmUgZmlyZWQgaWYgYWxsIG9mIHRoZXNlCi0gICAgICogZmVuY2VzIGhhdmUgYmVlbiBzaWduYWxlZC4KLSAgICAgKgotICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgICAgICB0aGUgbWVyZ2luZyB3YXMgc3VjY2Vzc2Z1bGx5IGRvbmUKLSAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSAgICAgbm90IGVub3VnaCBtZW1vcnkgdG8gcGVyZm9ybSB0aGUgbWVyZ2luZwotICAgICAqIFxyZXR2YWwgQzJfQUxSRUFEWV9FWElTVFMgICAgdGhlIGZlbmNlIGhhdmUgYWxyZWFkeSBiZWVuIG1lcmdlZCAoY2FsbGVyIGVycm9yKQotICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFICAgICB0aGUgZmVuY2UgaGF2ZSBhbHJlYWR5IGJlZW4gc2lnbmFsZWQgb3IgYWJhbmRvbmVkIChjYWxsZXIgZXJyb3IpCi0gICAgICogXHJldHZhbCBDMl9OT19QRVJNSVNTSU9OIG5vIHBlcm1pc3Npb24gdG8gbWVyZ2UgdGhlIGZlbmNlICh1bmV4cGVjdGVkIC0gc3lzdGVtKQotICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEICAgICBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIG1lcmdpbmcgdGhlIGZlbmNlKHMpICh1bmV4cGVjdGVkKQotICAgICAqLwotICAgIEMyRXJyb3IgbWVyZ2Uoc3RkOjp2ZWN0b3I8QzJGZW5jZT4gZmVuY2VzKTsKLQotICAgIC8qKgotICAgICAqIEFiYW5kb25zIHRoZSBldmVudCBhbmQgYW55IGFzc29jaWF0ZWQgZmVuY2UocykuCi0gICAgICogXG5vdGUgQ2FsbCB0aGlzIHRvIGV4cGxpY2l0bHkgYWJhbmRvbiBhbiBldmVudCBiZWZvcmUgaXQgaXMgZGVzdHJ1Y3RlZCB0byBhdm9pZCBhIHdhcm5pbmcuCi0gICAgICoKLSAgICAgKiBUaGlzIGhhcyBubyBlZmZlY3Qgbm8gZWZmZWN0IGlmIHRoZSBldmVudCB3YXMgYWxyZWFkeSBzaWduYWxlZCBvciBhYmFuZG9uZWQuCi0gICAgICoKLSAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICAgICAgdGhlIGZlbmNlKHMpIHdlcmUgc3VjY2Vzc2Z1bGx5IHNpZ25hbGVkCi0gICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgICAgIHRoZSBmZW5jZShzKSBoYXZlIGFscmVhZHkgYmVlbiBzaWduYWxlZCBvciBtZXJnZWQgKGNhbGxlciBlcnJvcikKLSAgICAgKiBccmV0dmFsIEMyX0FMUkVBRFlfRVhJU1RTICAgIHRoZSBmZW5jZShzKSBoYXZlIGFscmVhZHkgYmVlbiBhYmFuZG9uZWQgKGNhbGxlciBlcnJvcikKLSAgICAgKiBccmV0dmFsIEMyX05PX1BFUk1JU1NJT04gbm8gcGVybWlzc2lvbiB0byBhYmFuZG9uIHRoZSBmZW5jZSAodW5leHBlY3RlZCAtIHN5c3RlbSkKLSAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCAgICAgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCBzaWduYWxpbmcgdGhlIGZlbmNlKHMpICh1bmV4cGVjdGVkKQotICAgICAqLwotICAgIEMyRXJyb3IgYWJhbmRvbigpOwotCi1wcml2YXRlOgotICAgIGNsYXNzIEltcGw7Ci0gICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IG1JbXBsOwotfTsKLQotLy8vIFxhZGR0b2dyb3VwIGJ1Zl9pbnRlcm5hbCBJbnRlcm5hbAotLy8vIEB7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBvYmplY3RzIHRoYXQgZW5jYXBzdWxhdGUgYW4gdXBkYXRhYmxlIGVycm9yIHZhbHVlLgotICovCi1zdHJ1Y3QgX0MySW5uYXRlRXJyb3IgewotICAgIGlubGluZSBDMkVycm9yIGVycm9yKCkgY29uc3QgeyByZXR1cm4gbUVycm9yOyB9Ci0KLXByb3RlY3RlZDoKLSAgICBfQzJJbm5hdGVFcnJvcihDMkVycm9yIGVycm9yKSA6IG1FcnJvcihlcnJvcikgeyB9Ci0KLSAgICBDMkVycm9yIG1FcnJvcjsgLy8gdGhpcyBlcnJvciBpcyB1cGRhdGFibGUgYnkgdGhlIG9iamVjdAotfTsKLQotLy8vIEB9Ci0KLS8qKgotICogVGhpcyBpcyBhIHV0aWxpdHkgdGVtcGxhdGUgZm9yIG9iamVjdHMgcHJvdGVjdGVkIGJ5IGFuIGFjcXVpcmUgZmVuY2UsIHNvIHRoYXQgZXJyb3JzIGR1cmluZwotICogYWNxdWlyaW5nIHRoZSBvYmplY3QgYXJlIHByb3BhZ2F0ZWQgdG8gdGhlIG9iamVjdCBpdHNlbGYuCi0gKi8KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1jbGFzcyBDMkFjcXVpcmFibGUgOiBwdWJsaWMgQzJGZW5jZSB7Ci1wdWJsaWM6Ci0gICAgLyoqCi0gICAgICogQWNxdWlyZXMgdGhlIG9iamVjdCBwcm90ZWN0ZWQgYnkgYW4gYWNxdWlyZSBmZW5jZS4gQW55IGVycm9ycyBkdXJpbmcgdGhlIG1hcHBpbmcgd2lsbCBiZQotICAgICAqIHBhc3NlZCB0byB0aGUgb2JqZWN0LgotICAgICAqCi0gICAgICogXHJldHVybiBhY3F1aXJlZCBvYmplY3QgcG90ZW50aWFsbHkgaW52YWxpZGF0ZWQgaWYgd2FpdGluZyBmb3IgdGhlIGZlbmNlIGZhaWxlZC4KLSAgICAgKi8KLSAgICBUIGdldCgpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgQzJBY3F1aXJhYmxlKEMyRXJyb3IgZXJyb3IsIEMyRmVuY2UgZmVuY2UsIFQgdCkgOiBDMkZlbmNlKGZlbmNlKSwgbUluaXRpYWxFcnJvcihlcnJvciksIG1UKHQpIHsgfQotCi1wcml2YXRlOgotICAgIEMyRXJyb3IgbUluaXRpYWxFcnJvcjsKLSAgICBUIG1UOyAvLyBUT0RPOiBtb3ZlIGluc3RlYWQgb2YgY29weQotfTsKLQotLy8vIEB9Ci0KLS8vLyBcZGVmZ3JvdXAgbGluZWFyIExpbmVhciBEYXRhIEJsb2NrcwotLy8vIEB7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICBMSU5FQVIgQVNQRUNUUywgQkxPQ0tTIEFORCBWSUVXUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogQ29tbW9uIGFzcGVjdCBmb3IgYWxsIG9iamVjdHMgdGhhdCBoYXZlIGEgbGluZWFyIGNhcGFjaXR5LgotICovCi1jbGFzcyBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCB7Ci0vLy8gXG5hbWUgTGluZWFyIGNhcGFjaXR5IGludGVyZmFjZQotLy8vIEB7Ci1wdWJsaWM6Ci0gICAgaW5saW5lIHVpbnQzMl90IGNhcGFjaXR5KCkgY29uc3QgeyByZXR1cm4gbUNhcGFjaXR5OyB9Ci0KLXByb3RlY3RlZDoKLQotI2lmIFVJTlRQVFJfTUFYID09IDB4ZmZmZmZmZmYKLSAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihzaXplX3QpID09IHNpemVvZih1aW50MzJfdCksICJzaXplX3QgaXMgdG9vIGJpZyIpOwotI2Vsc2UKLSAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihzaXplX3QpID4gc2l6ZW9mKHVpbnQzMl90KSwgInNpemVfdCBpcyB0b28gc21hbGwiKTsKLSAgICAvLyBleHBsaWNpdGx5IGRpc2FibGUgY29uc3RydWN0aW9uIGZyb20gc2l6ZV90Ci0gICAgaW5saW5lIGV4cGxpY2l0IF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0KHNpemVfdCBjYXBhY2l0eSkgPSBkZWxldGU7Ci0jZW5kaWYKLQotICAgIGlubGluZSBleHBsaWNpdCBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCh1aW50MzJfdCBjYXBhY2l0eSkKLSAgICAgIDogbUNhcGFjaXR5KGNhcGFjaXR5KSB7IH0KLQotICAgIGlubGluZSBleHBsaWNpdCBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdChjb25zdCBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCAqcGFyZW50KQotICAgICAgICA6IG1DYXBhY2l0eShwYXJlbnQgPT0gbnVsbHB0ciA/IDAgOiBwYXJlbnQtPmNhcGFjaXR5KCkpIHsgfQotCi1wcml2YXRlOgotICAgIGNvbnN0IHVpbnQzMl90IG1DYXBhY2l0eTsKLS8vLyBAfQotfTsKLQotLyoqCi0gKiBBc3BlY3QgZm9yIG9iamVjdHMgdGhhdCBoYXZlIGEgbGluZWFyIHJhbmdlLgotICoKLSAqIFRoaXMgY2xhc3MgaXMgY29waWFibGUuCi0gKi8KLWNsYXNzIF9DMkxpbmVhclJhbmdlQXNwZWN0IDogcHVibGljIF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0IHsKLS8vLyBcbmFtZSBMaW5lYXIgcmFuZ2UgaW50ZXJmYWNlCi0vLy8gQHsKLXB1YmxpYzoKLSAgICBpbmxpbmUgdWludDMyX3Qgb2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbU9mZnNldDsgfQotICAgIGlubGluZSB1aW50MzJfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gbVNpemU7IH0KLQotcHJvdGVjdGVkOgotICAgIGlubGluZSBleHBsaWNpdCBfQzJMaW5lYXJSYW5nZUFzcGVjdChjb25zdCBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCAqcGFyZW50KQotICAgICAgICA6IF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0KHBhcmVudCksCi0gICAgICAgICAgbU9mZnNldCgwKSwKLSAgICAgICAgICBtU2l6ZShjYXBhY2l0eSgpKSB7IH0KLQotICAgIGlubGluZSBfQzJMaW5lYXJSYW5nZUFzcGVjdChjb25zdCBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCAqcGFyZW50LCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKLSAgICAgICAgOiBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdChwYXJlbnQpLAotICAgICAgICAgIG1PZmZzZXQoYzJfbWluKG9mZnNldCwgY2FwYWNpdHkoKSkpLAotICAgICAgICAgIG1TaXplKGMyX21pbihzaXplLCBjYXBhY2l0eSgpIC0gbU9mZnNldCkpIHsgfQotCi0gICAgLy8gc3Vic2VjdGlvbiBvZiB0aGUgdHdvIFtvZmZzZXQsIG9mZnNldCArIHNpemVdIHJhbmdlcwotICAgIGlubGluZSBfQzJMaW5lYXJSYW5nZUFzcGVjdChjb25zdCBfQzJMaW5lYXJSYW5nZUFzcGVjdCAqcGFyZW50LCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKLSAgICAgICAgOiBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdChwYXJlbnQgPT0gbnVsbHB0ciA/IDAgOiBwYXJlbnQtPmNhcGFjaXR5KCkpLAotICAgICAgICAgIG1PZmZzZXQoYzJfbWluKGMyX21heChvZmZzZXQsIHBhcmVudCA9PSBudWxscHRyID8gMCA6IHBhcmVudC0+b2Zmc2V0KCkpLCBjYXBhY2l0eSgpKSksCi0gICAgICAgICAgbVNpemUoYzJfbWluKGMyX21pbihzaXplLCBwYXJlbnQgPT0gbnVsbHB0ciA/IDAgOiBwYXJlbnQtPnNpemUoKSksIGNhcGFjaXR5KCkgLSBtT2Zmc2V0KSkgeyB9Ci0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIF9DMkVkaXRhYmxlTGluZWFyUmFuZ2U7Ci0gICAgLy8gaW52YXJpYW50cyAwIDw9IG1PZmZzZXQgPD0gbU9mZnNldCArIG1TaXplIDw9IGNhcGFjaXR5KCkKLSAgICB1aW50MzJfdCBtT2Zmc2V0OwotICAgIHVpbnQzMl90IG1TaXplOwotLy8vIEB9Ci19OwotCi0vKioKLSAqIEFzcGVjdCBmb3Igb2JqZWN0cyB0aGF0IGhhdmUgYW4gZWRpdGFibGUgbGluZWFyIHJhbmdlLgotICoKLSAqIFRoaXMgY2xhc3MgaXMgY29waWFibGUuCi0gKi8KLWNsYXNzIF9DMkVkaXRhYmxlTGluZWFyUmFuZ2UgOiBwdWJsaWMgX0MyTGluZWFyUmFuZ2VBc3BlY3QgewotcHJvdGVjdGVkOgotICAgIGlubGluZSBleHBsaWNpdCBfQzJFZGl0YWJsZUxpbmVhclJhbmdlKGNvbnN0IF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0ICpwYXJlbnQpCi0gICAgICAgIDogX0MyTGluZWFyUmFuZ2VBc3BlY3QocGFyZW50KSB7IH0KLQotICAgIGlubGluZSBfQzJFZGl0YWJsZUxpbmVhclJhbmdlKGNvbnN0IF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0ICpwYXJlbnQsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKQotICAgICAgICA6IF9DMkxpbmVhclJhbmdlQXNwZWN0KHBhcmVudCwgb2Zmc2V0LCBzaXplKSB7IH0KLQotICAgIC8vIHN1YnNlY3Rpb24gb2YgdGhlIHR3byBbb2Zmc2V0LCBvZmZzZXQgKyBzaXplXSByYW5nZXMKLSAgICBpbmxpbmUgX0MyRWRpdGFibGVMaW5lYXJSYW5nZShjb25zdCBfQzJMaW5lYXJSYW5nZUFzcGVjdCAqcGFyZW50LCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKLSAgICAgICAgOiBfQzJMaW5lYXJSYW5nZUFzcGVjdChwYXJlbnQsIG9mZnNldCwgc2l6ZSkgeyB9Ci0KLS8vLyBcbmFtZSBFZGl0YWJsZSBsaW5lYXIgcmFuZ2UgaW50ZXJmYWNlCi0vLy8gQHsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG9mZnNldCB0byB8b2Zmc2V0fCwgd2hpbGUgdHJ5aW5nIHRvIGtlZXAgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIHVuY2hhbmdlZCAoZS5nLgotICAgICAqIHNpemUgd2lsbCBncm93IGlmIG9mZnNldCBpcyBkZWNyZWFzZWQsIGFuZCBtYXkgc2hyaW5rIGlmIG9mZnNldCBpcyBpbmNyZWFzZWQuKSBSZXR1cm5zCi0gICAgICogdHJ1ZSBpZiBzdWNjZXNzZnVsLCB3aGljaCBpcyBlcXVpdmFsZW50IHRvIGlmIDAgPD0gfG9mZnNldHwgPD0gY2FwYWNpdHkoKS4KLSAgICAgKgotICAgICAqIE5vdGU6IHNldHRpbmcgb2Zmc2V0IGFuZCBzaXplIHdpbGwgeWllbGQgZGlmZmVyZW50IHJlc3VsdCBkZXBlbmRpbmcgb24gdGhlIG9yZGVyIG9mIHRoZQotICAgICAqIG9wZXJhdGlvbnMuIEFsd2F5cyBzZXQgb2Zmc2V0IGZpcnN0IHRvIGVuc3VyZSBwcm9wZXIgc2l6ZS4KLSAgICAgKi8KLSAgICBpbmxpbmUgYm9vbCBzZXRPZmZzZXQodWludDMyX3Qgb2Zmc2V0KSB7Ci0gICAgICAgIGlmIChvZmZzZXQgPiBjYXBhY2l0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob2Zmc2V0ID4gbU9mZnNldCArIG1TaXplKSB7Ci0gICAgICAgICAgICBtU2l6ZSA9IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU2l6ZSA9IG1PZmZzZXQgKyBtU2l6ZSAtIG9mZnNldDsKLSAgICAgICAgfQotICAgICAgICBtT2Zmc2V0ID0gb2Zmc2V0OwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgc2l6ZSB0byB8c2l6ZXwuIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsLCB3aGljaCBpcyBlcXVpdmFsZW50IHRvCi0gICAgICogaWYgMCA8PSB8c2l6ZXwgPD0gY2FwYWNpdHkoKSAtIG9mZnNldCgpLgotICAgICAqCi0gICAgICogTm90ZTogc2V0dGluZyBvZmZzZXQgYW5kIHNpemUgd2lsbCB5aWVsZCBkaWZmZXJlbnQgcmVzdWx0IGRlcGVuZGluZyBvbiB0aGUgb3JkZXIgb2YgdGhlCi0gICAgICogb3BlcmF0aW9ucy4gQWx3YXlzIHNldCBvZmZzZXQgZmlyc3QgdG8gZW5zdXJlIHByb3BlciBzaXplLgotICAgICAqLwotICAgIGlubGluZSBib29sIHNldFNpemUodWludDMyX3Qgc2l6ZSkgewotICAgICAgICBpZiAoc2l6ZSA+IGNhcGFjaXR5KCkgLSBtT2Zmc2V0KSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU2l6ZSA9IHNpemU7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBvZmZzZXQgdG8gfG9mZnNldHwgd2l0aCBiZXN0IGVmZm9ydC4gU2FtZSBhcyBzZXRPZmZzZXQoKSBleGNlcHQgdGhhdCBvZmZzZXQgd2lsbAotICAgICAqIGJlIGNsYW1wZWQgdG8gdGhlIGJ1ZmZlciBjYXBhY2l0eS4KLSAgICAgKgotICAgICAqIE5vdGU6IHNldHRpbmcgb2Zmc2V0IGFuZCBzaXplIChldmVuIHVzaW5nIGJlc3QgZWZmb3J0KSB3aWxsIHlpZWxkIGRpZmZlcmVudCByZXN1bHQgZGVwZW5kaW5nCi0gICAgICogb24gdGhlIG9yZGVyIG9mIHRoZSBvcGVyYXRpb25zLiBBbHdheXMgc2V0IG9mZnNldCBmaXJzdCB0byBlbnN1cmUgcHJvcGVyIHNpemUuCi0gICAgICovCi0gICAgaW5saW5lIHZvaWQgc2V0T2Zmc2V0X2JlKHVpbnQzMl90IG9mZnNldCkgewotICAgICAgICBpZiAob2Zmc2V0ID4gY2FwYWNpdHkoKSkgewotICAgICAgICAgICAgb2Zmc2V0ID0gY2FwYWNpdHkoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAob2Zmc2V0ID4gbU9mZnNldCArIG1TaXplKSB7Ci0gICAgICAgICAgICBtU2l6ZSA9IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU2l6ZSA9IG1PZmZzZXQgKyBtU2l6ZSAtIG9mZnNldDsKLSAgICAgICAgfQotICAgICAgICBtT2Zmc2V0ID0gb2Zmc2V0OwotICAgIH0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzaXplIHRvIHxzaXplfCB3aXRoIGJlc3QgZWZmb3J0LiBTYW1lIGFzIHNldFNpemUoKSBleGNlcHQgdGhhdCB0aGUgc2VsZWN0ZWQgcmVnaW9uCi0gICAgICogd2lsbCBiZSBjbGFtcGVkIHRvIHRoZSBidWZmZXIgY2FwYWNpdHkgKGUuZy4gc2l6ZSBpcyBjbGFtcGVkIHRvIFswLCBjYXBhY2l0eSgpIC0gb2Zmc2V0KCldKS4KLSAgICAgKgotICAgICAqIE5vdGU6IHNldHRpbmcgb2Zmc2V0IGFuZCBzaXplIChldmVuIHVzaW5nIGJlc3QgZWZmb3J0KSB3aWxsIHlpZWxkIGRpZmZlcmVudCByZXN1bHQgZGVwZW5kaW5nCi0gICAgICogb24gdGhlIG9yZGVyIG9mIHRoZSBvcGVyYXRpb25zLiBBbHdheXMgc2V0IG9mZnNldCBmaXJzdCB0byBlbnN1cmUgcHJvcGVyIHNpemUuCi0gICAgICovCi0gICAgaW5saW5lIHZvaWQgc2V0U2l6ZV9iZSh1aW50MzJfdCBzaXplKSB7Ci0gICAgICAgIG1TaXplID0gc3RkOjptaW4oc2l6ZSwgY2FwYWNpdHkoKSAtIG1PZmZzZXQpOwotICAgIH0KLS8vLyBAfQotfTsKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyAgQkxPQ0tTCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotLyoqCi0gKiBCbG9ja3MgYXJlIHNlY3Rpb25zIG9mIGFsbG9jYXRpb25zLiBUaGV5IGNhbiBiZSBlaXRoZXIgMUQgb3IgMkQuCi0gKi8KLQotY2xhc3MgQzJMaW5lYXJBbGxvY2F0aW9uOwotCi1jbGFzcyBDMkJsb2NrMUQgOiBwdWJsaWMgX0MyTGluZWFyUmFuZ2VBc3BlY3QgewotcHVibGljOgotICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUoKSBjb25zdDsKLQotcHJvdGVjdGVkOgotICAgIEMyQmxvY2sxRChzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiBhbGxvYyk7Ci0gICAgQzJCbG9jazFEKHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+IGFsbG9jLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7Ci0KLXByaXZhdGU6Ci0gICAgY2xhc3MgSW1wbDsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7Ci19OwotCi0vKioKLSAqIFJlYWQgdmlldyBwcm92aWRlcyByZWFkLW9ubHkgYWNjZXNzIGZvciBhIGxpbmVhciBtZW1vcnkgc2VnbWVudC4KLSAqCi0gKiBUaGlzIGNsYXNzIGlzIGNvcGlhYmxlLgotICovCi1jbGFzcyBDMlJlYWRWaWV3IDogcHVibGljIF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0IHsKLXB1YmxpYzoKLSAgICAvKioKLSAgICAgKiBccmV0dXJuIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBibG9jayBvciBudWxscHRyIG9uIGVycm9yLgotICAgICAqLwotICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBwb3J0aW9uIG9mIHRoaXMgdmlldy4KLSAgICAgKgotICAgICAqIFxwYXJhbSBvZmZzZXQgIHRoZSBzdGFydCBvZmZzZXQgb2YgdGhlIHBvcnRpb24uIFxub3RlIFRoaXMgaXMgY2xhbXBlZCB0byB0aGUgY2FwYWNpdHkgb2YgdGhpcwotICAgICAqICAgICAgICAgICAgICB2aWV3LgotICAgICAqIFxwYXJhbSBzaXplICAgIHRoZSBzaXplIG9mIHRoZSBwb3J0aW9uLiBcbm90ZSBUaGlzIGlzIGNsYW1wZWQgdG8gdGhlIHJlbWFpbmluZyBkYXRhIGZyb20gb2Zmc2V0LgotICAgICAqCi0gICAgICogXHJldHVybiBhIHJlYWQgdmlldyBjb250YWluaW5nIGEgcG9ydGlvbiBvZiB0aGlzIHZpZXcKLSAgICAgKi8KLSAgICBDMlJlYWRWaWV3IHN1YlZpZXcoc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpIGNvbnN0OwotCi0gICAgLyoqCi0gICAgICogXHJldHVybiBlcnJvciBkdXJpbmcgdGhlIGNyZWF0aW9uL21hcHBpbmcgb2YgdGhpcyB2aWV3LgotICAgICAqLwotICAgIEMyRXJyb3IgZXJyb3IoKTsKLQotcHJpdmF0ZToKLSAgICBjbGFzcyBJbXBsOwotICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKLX07Ci0KLS8qKgotICogV3JpdGUgdmlldyBwcm92aWRlcyByZWFkL3dyaXRlIGFjY2VzcyBmb3IgYSBsaW5lYXIgbWVtb3J5IHNlZ21lbnQuCi0gKgotICogVGhpcyBjbGFzcyBpcyBjb3BpYWJsZS4gXHRvZG8gbW92YWJsZSBvbmx5PwotICovCi1jbGFzcyBDMldyaXRlVmlldyA6IHB1YmxpYyBfQzJFZGl0YWJsZUxpbmVhclJhbmdlIHsKLXB1YmxpYzoKLSAgICAvKioKLSAgICAgKiBTdGFydCBvZiB0aGUgYmxvY2suCi0gICAgICoKLSAgICAgKiBccmV0dXJuIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBibG9jayBvciBudWxscHRyIG9uIGVycm9yLgotICAgICAqLwotICAgIHVpbnQ4X3QgKmJhc2UoKTsKLQotICAgIC8qKgotICAgICAqIFxyZXR1cm4gcG9pbnRlciB0byB0aGUgYmxvY2sgYXQgdGhlIGN1cnJlbnQgb2Zmc2V0IG9yIG51bGxwdHIgb24gZXJyb3IuCi0gICAgICovCi0gICAgdWludDhfdCAqZGF0YSgpOwotCi0gICAgLyoqCi0gICAgICogXHJldHVybiBlcnJvciBkdXJpbmcgdGhlIGNyZWF0aW9uL21hcHBpbmcgb2YgdGhpcyB2aWV3LgotICAgICAqLwotICAgIEMyRXJyb3IgZXJyb3IoKTsKLQotcHJpdmF0ZToKLSAgICBjbGFzcyBJbXBsOwotICAgIC8vLyBcdG9kbyBzaG91bGQgdGhpcyBiZSB1bmlxdWVfcHRyIHRvIG1ha2UgdGhpcyBtb3ZhYmxlIG9ubHkgLSB0byBhdm9pZCBpbmNvbnNpc3RlbnQgcmVnaW9ucwotICAgIC8vLyBiZXR3ZWVuIGNvcGllcy4KLSAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7Ci19OwotCi0vKioKLSAqIEEgY29uc3RhbnQgKHJlYWQtb25seSkgbGluZWFyIGJsb2NrIChwb3J0aW9uIG9mIGFuIGFsbG9jYXRpb24pIHdpdGggYW4gYWNxdWlyZSBmZW5jZS4KLSAqIEJsb2NrcyBhcmUgdW5tYXBwZWQgd2hlbiBjcmVhdGVkLCBhbmQgY2FuIGJlIG1hcHBlZCBpbnRvIGEgcmVhZCB2aWV3IG9uIGRlbWFuZC4KLSAqCi0gKiBUaGlzIGNsYXNzIGlzIGNvcGlhYmxlIGFuZCBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgYWxsb2NhdGlvbiB0aGF0IGl0IGlzIGJhc2VkIG9uLgotICovCi1jbGFzcyBDMkNvbnN0TGluZWFyQmxvY2sgOiBwdWJsaWMgQzJCbG9jazFEIHsKLXB1YmxpYzoKLSAgICAvKioKLSAgICAgKiBNYXBzIHRoaXMgYmxvY2sgaW50byBtZW1vcnkgYW5kIHJldHVybnMgYSByZWFkIHZpZXcgZm9yIGl0LgotICAgICAqCi0gICAgICogXHJldHVybiBhIHJlYWQgdmlldyBmb3IgdGhpcyBibG9jay4KLSAgICAgKi8KLSAgICBDMkFjcXVpcmFibGU8QzJSZWFkVmlldz4gbWFwKCkgY29uc3Q7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgcG9ydGlvbiBvZiB0aGlzIGJsb2NrLgotICAgICAqCi0gICAgICogXHBhcmFtIG9mZnNldCAgdGhlIHN0YXJ0IG9mZnNldCBvZiB0aGUgcG9ydGlvbi4gXG5vdGUgVGhpcyBpcyBjbGFtcGVkIHRvIHRoZSBjYXBhY2l0eSBvZiB0aGlzCi0gICAgICogICAgICAgICAgICAgIGJsb2NrLgotICAgICAqIFxwYXJhbSBzaXplICAgIHRoZSBzaXplIG9mIHRoZSBwb3J0aW9uLiBcbm90ZSBUaGlzIGlzIGNsYW1wZWQgdG8gdGhlIHJlbWFpbmluZyBkYXRhIGZyb20gb2Zmc2V0LgotICAgICAqCi0gICAgICogXHJldHVybiBhIGNvbnN0YW50IGxpbmVhciBibG9jayBjb250YWluaW5nIGEgcG9ydGlvbiBvZiB0aGlzIGJsb2NrCi0gICAgICovCi0gICAgQzJDb25zdExpbmVhckJsb2NrIHN1YkJsb2NrKHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBjb25zdDsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFjcXVpcmUgZmVuY2UgZm9yIHRoaXMgYmxvY2suCi0gICAgICoKLSAgICAgKiBccmV0dXJuIGEgZmVuY2UgdGhhdCBtdXN0IGJlIHdhaXRlZCBvbiBiZWZvcmUgcmVhZGluZyB0aGUgYmxvY2suCi0gICAgICovCi0gICAgQzJGZW5jZSBmZW5jZSgpIGNvbnN0IHsgcmV0dXJuIG1GZW5jZTsgfQotCi1wcml2YXRlOgotICAgIEMyRmVuY2UgbUZlbmNlOwotfTsKLQotLyoqCi0gKiBMaW5lYXIgYmxvY2sgaXMgYSB3cml0ZWFibGUgMUQgYmxvY2suIE9uY2Ugd3JpdHRlbiwgaXQgY2FuIGJlIHNoYXJlZCBpbiB3aG9sZSBvciBpbiBwYXJ0cyB3aXRoCi0gKiBjb25zdW1lcnMvcmVhZGVycyBhcyByZWFkLW9ubHkgY29uc3QgbGluZWFyIGJsb2NrKHMpLgotICovCi1jbGFzcyBDMkxpbmVhckJsb2NrIDogcHVibGljIEMyQmxvY2sxRCB7Ci1wdWJsaWM6Ci0gICAgLyoqCi0gICAgICogTWFwcyB0aGlzIGJsb2NrIGludG8gbWVtb3J5IGFuZCByZXR1cm5zIGEgd3JpdGUgdmlldyBmb3IgaXQuCi0gICAgICoKLSAgICAgKiBccmV0dXJuIGEgd3JpdGUgdmlldyBmb3IgdGhpcyBibG9jay4KLSAgICAgKi8KLSAgICBDMkFjcXVpcmFibGU8QzJXcml0ZVZpZXc+IG1hcCgpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHJlYWQtb25seSBjb25zdCBsaW5lYXIgYmxvY2sgZm9yIGEgcG9ydGlvbiBvZiB0aGlzIGJsb2NrOyBvcHRpb25hbGx5IHByb3RlY3RlZAotICAgICAqIGJ5IGFuIGFjcXVpcmUgZmVuY2UuIFRoZXJlIGFyZSB0d28gd2F5cyB0byB1c2UgdGhpczoKLSAgICAgKgotICAgICAqIDEpIHNoYXJlIHJlYWR5IGJsb2NrIGFmdGVyIHdyaXRpbmcgZGF0YSBpbnRvIHRoZSBibG9jay4gSW4gdGhpcyBjYXNlIG5vIGZlbmNlIHNoYWxsIGJlCi0gICAgICogICAgc3VwcGxpZWQsIGFuZCB0aGUgYmxvY2sgc2hhbGwgbm90IGJlIG1vZGlmaWVkIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QuCi0gICAgICogMikgc2hhcmUgYmxvY2sgbWV0YWRhdGEgYmVmb3JlIGFjdHVhbGx5IChmaW5pc2hpbmcpIHdyaXRpbmcgdGhlIGRhdGEgaW50byB0aGUgYmxvY2suIEluCi0gICAgICogICAgdGhpcyBjYXNlIGEgZmVuY2UgbXVzdCBiZSBzdXBwbGllZCB0aGF0IHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gdGhlIGRhdGEgaXMgd3JpdHRlbi4KLSAgICAgKiAgICBUaGUgYmxvY2sgc2hhbGwgYmUgbW9kaWZpZWQgb25seSB1bnRpbCBmaXJpbmcgdGhlIGV2ZW50IGZvciB0aGUgZmVuY2UuCi0gICAgICovCi0gICAgQzJDb25zdExpbmVhckJsb2NrIHNoYXJlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplLCBDMkZlbmNlIGZlbmNlKTsKLX07Ci0KLS8vLyBAfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgQ0lSQ1VMQVIgQkxPQ0tTIEFORCBWSUVXUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8vLyBcZGVmZ3JvdXAgY2lyY3VsYXIgQ2lyY3VsYXIgYnVmZmVyIHN1cHBvcnQKLS8vLyBAewotCi0vKioKLSAqIENpcmN1bGFyIGJsb2NrcyBjYW4gYmUgdXNlZCB0byBzaGFyZSBkYXRhIGJldHdlZW4gYSB3cml0ZXIgYW5kIGEgcmVhZGVyIChhbmQvb3Igb3RoZXIgY29uc3VtZXJzKS0KLSAqIGluIGEgbWVtb3J5LWVmZmljaWVudCB3YXkgYnkgcmV1c2luZyBhIHNlY3Rpb24gb2YgbWVtb3J5LiBDaXJjdWxhciBibG9ja3MgYXJlIGEgYml0IG1vcmUgY29tcGxleAotICogdGhhbiBzaW5nbGUgcmVhZGVyL3NpbmdsZSB3cml0ZXIgc2NoZW1lcyB0byBmYWNpbGl0YXRlIGJsb2NrLWJhc2VkIGNvbnN1bWluZyBvZiBkYXRhLgotICoKLSAqIFRoZXkgY2FuIG9wZXJhdGUgaW4gdHdvIG1vZGVzOgotICoKLSAqIDEpIG9uZSB3cml0ZXIgdGhhdCBjcmVhdGVzIGJsb2NrcyB0byBiZSBjb25zdW1lZCAodGhpcyBtb2RlbCBjYW4gYmUgdXNlZCBieSBjb21wb25lbnRzKQotICoKLSAqIDIpIG9uZSB3cml0ZXIgdGhhdCB3cml0ZXMgY29udGludW91c2x5LCBhbmQgb25lIHJlYWRlciB0aGF0IGNhbiBjcmVhdGVzIGJsb2NrcyB0byBiZSBjb25zdW1lZAotICogICAgYnkgZnVydGhlciByZWNpcGllbnRzICh0aGlzIG1vZGVsIGlzIHVzZWQgYnkgdGhlIGZyYW1ld29yaywgYW5kIGNhbm5vdCBiZSB1c2VkIGJ5IGNvbXBvbmVudHMuKQotICoKLSAqIENpcmN1bGFyIGJsb2NrcyBoYXZlIGZvdXIgc2VnbWVudHMgd2l0aCBydW5uaW5nIHBvaW50ZXJzOgotICogIC0gcmVzZXJ2ZWQ6IGRhdGEgcmVzZXJ2ZWQgYW5kIGF2YWlsYWJsZSBmb3IgdGhlIHdyaXRlcgotICogIC0gY29tbWl0dGVkOiBkYXRhIGNvbW1pdHRlZCBieSB0aGUgd3JpdGVyIGFuZCBhdmFpbGFibGUgdG8gdGhlIHJlYWRlciAoaWYgcHJlc2VudCkKLSAqICAtIHVzZWQ6IGRhdGEgdXNlZCBieSBjb25zdW1lcnMgKGlmIHByZXNlbnQpCi0gKiAgLSBhdmFpbGFibGU6IHVudXNlZCBkYXRhIGF2YWlsYWJsZSB0byBiZSByZXNlcnZlZAotICovCi1jbGFzcyBDMkNpcmN1bGFyQmxvY2sgOiBwdWJsaWMgQzJCbG9jazFEIHsKLSAgICAvLyBUT0RPOiBhZGQgbWV0aG9kcwotCi1wcml2YXRlOgotICAgIHNpemVfdCBtUmVzZXJ2ZWQgX191bnVzZWQ7ICAgLy8gZW5kIG9mIHJlc2VydmVkIHNlY3Rpb24KLSAgICBzaXplX3QgbUNvbW1pdHRlZCBfX3VudXNlZDsgIC8vIGVuZCBvZiBjb21taXR0ZWQgc2VjdGlvbgotICAgIHNpemVfdCBtVXNlZCBfX3VudXNlZDsgICAgICAgLy8gZW5kIG9mIHVzZWQgc2VjdGlvbgotICAgIHNpemVfdCBtRnJlZSBfX3VudXNlZDsgICAgICAgLy8gZW5kIG9mIGZyZWUgc2VjdGlvbgotfTsKLQotY2xhc3MgX0MyQ2lyY3VsYXJCbG9ja1NlZ21lbnQgOiBwdWJsaWMgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QgewotcHVibGljOgotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGF2YWlsYWJsZSBzaXplIGZvciB0aGlzIHNlZ21lbnQuCi0gICAgICoKLSAgICAgKiBccmV0dXJuIGN1cnJlbnRseSBhdmFpbGFibGUgc2l6ZSBmb3IgdGhpcyBzZWdtZW50Ci0gICAgICovCi0gICAgc2l6ZV90IGF2YWlsYWJsZSgpIGNvbnN0OwotCi0gICAgLyoqCi0gICAgICogUmVzZXJ2ZSBzb21lIHNwYWNlIGZvciB0aGlzIHNlZ21lbnQgZnJvbSBpdHMgY3VycmVudCBzdGFydC4KLSAgICAgKgotICAgICAqIFxwYXJhbSBzaXplICAgIGRlc2lyZWQgc3BhY2UgaW4gYnl0ZXMKLSAgICAgKiBccGFyYW0gZmVuY2UgICBhIHBvaW50ZXIgdG8gYW4gYWNxdWlyZSBmZW5jZS4gSWYgbm9uLW51bGwsIHRoZSByZXNlcnZhdGlvbiBpcyBhc3luY2hyb25vdXMgYW5kCi0gICAgICogICAgICAgICAgICAgIGEgZmVuY2Ugd2lsbCBiZSBzdG9yZWQgaGVyZSB0aGF0IHdpbGwgYmUgc2lnbmFsZWQgd2hlbiB0aGUgcmVzZXJ2YXRpb24gaXMKLSAgICAgKiAgICAgICAgICAgICAgY29tcGxldGUuIElmIG51bGwsIHRoZSByZXNlcnZhdGlvbiBpcyBzeW5jaHJvbm91cy4KLSAgICAgKgotICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgICAgICB0aGUgc3BhY2Ugd2FzIHN1Y2Nlc3NmdWxseSByZXNlcnZlZAotICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZICAgICB0aGUgc3BhY2UgcmVxdWVzdGVkIGNhbm5vdCBiZSByZXNlcnZlZAotICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUICAgICB0aGUgcmVzZXJ2YXRpb24gdGltZWQgb3V0IFx0b2RvIHdoZW4/Ci0gICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgICAgIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgcmVzZXJ2aW5nIHNwYWNlLiAodW5leHBlY3RlZCkKLSAgICAgKi8KLSAgICBDMkVycm9yIHJlc2VydmUoc2l6ZV90IHNpemUsIEMyRmVuY2UgKmZlbmNlIC8qIG51bGxhYmxlICovKTsKLQotICAgIC8qKgotICAgICAqIEFiYW5kb25zIGEgcG9ydGlvbiBvZiB0aGlzIHNlZ21lbnQuIFRoaXMgd2lsbCBtb3ZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBzZWdtZW50LgotICAgICAqCi0gICAgICogXG5vdGUgVGhpcyBtZXRob2RzIGlzIG9ubHkgYWxsb3dlZCBpZiB0aGlzIHNlZ21lbnQgaXMgcHJvZHVjaW5nIGJsb2Nrcy4KLSAgICAgKgotICAgICAqIFxwYXJhbSBzaXplICAgIG51bWJlciBvZiBieXRlcyB0byBhYmFuZG9uCi0gICAgICoKLSAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICAgICAgdGhlIGRhdGEgd2FzIHN1Y2Nlc3NmdWxseSBhYmFuZG9uZWQKLSAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCAgICAgdGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQgKHVuZXhwZWN0ZWQpCi0gICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgICAgIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgYWJhbmRvbmluZyB0aGUgZGF0YSAodW5leHBlY3RlZCkKLSAgICAgKi8KLSAgICBDMkVycm9yIGFiYW5kb24oc2l6ZV90IHNpemUpOwotCi0gICAgLyoqCi0gICAgICogU2hhcmUgYSBwb3J0aW9uIGFzIGJsb2NrKHMpIHdpdGggY29uc3VtZXJzICh0aGVzZSBhcmUgbW92ZWQgdG8gdGhlIHVzZWQgc2VjdGlvbikuCi0gICAgICoKLSAgICAgKiBcbm90ZSBUaGlzIG1ldGhvZHMgaXMgb25seSBhbGxvd2VkIGlmIHRoaXMgc2VnbWVudCBpcyBwcm9kdWNpbmcgYmxvY2tzLgotICAgICAqIFxub3RlIFNoYXJlIGRvZXMgbm90IG1vdmUgdGhlIGJlZ2lubmluZyBvZiB0aGUgc2VnbWVudC4gKFx0b2RvIGFkZCBhYmFuZG9uL29mZnNldD8pCi0gICAgICoKLSAgICAgKiBccGFyYW0gc2l6ZSAgICBudW1iZXIgb2YgYnl0ZXMgdG8gc2hhcmUKLSAgICAgKiBccGFyYW0gZmVuY2UgICBmZW5jZSB0byBiZSB1c2VkIGZvciB0aGUgc2VjdGlvbgotICAgICAqIFxwYXJhbSBibG9ja3MgIGxpc3Qgd2hlcmUgdGhlIGJsb2NrcyBvZiB0aGUgc2VjdGlvbiBhcmUgYXBwZW5kZWQgdG8KLSAgICAgKgotICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgICAgICB0aGUgcG9ydGlvbiB3YXMgc3VjY2Vzc2Z1bGx5IHNoYXJlZAotICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZICAgICBub3QgZW5vdWdoIG1lbW9yeSB0byBzaGFyZSB0aGUgcG9ydGlvbgotICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUICAgICB0aGUgb3BlcmF0aW9uIHRpbWVkIG91dCAodW5leHBlY3RlZCkKLSAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCAgICAgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCBzaGFyaW5nIHRoZSBkYXRhICh1bmV4cGVjdGVkKQotICAgICAqLwotICAgIEMyRXJyb3Igc2hhcmUoc2l6ZV90IHNpemUsIEMyRmVuY2UgZmVuY2UsIHN0ZDo6bGlzdDxDMkNvbnN0TGluZWFyQmxvY2s+ICZibG9ja3MpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYmVnaW5uaW5nIG9mZnNldCBvZiB0aGlzIHNlZ21lbnQgZnJvbSB0aGUgc3RhcnQgb2YgdGhpcyBjaXJjdWxhciBibG9jay4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYmVnaW5uaW5nIG9mZnNldAotICAgICAqLwotICAgIHNpemVfdCBiZWdpbigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZW5kIG9mZnNldCBvZiB0aGlzIHNlZ21lbnQgZnJvbSB0aGUgc3RhcnQgb2YgdGhpcyBjaXJjdWxhciBibG9jay4KLSAgICAgKgotICAgICAqIEByZXR1cm4gZW5kIG9mZnNldAotICAgICAqLwotICAgIHNpemVfdCBlbmQoKTsKLX07Ci0KLS8qKgotICogQSBjaXJjdWxhciB3cml0ZS12aWV3IGlzIGEgZHluYW1pYyBtYXBwZWQgdmlldyBmb3IgYSBzZWdtZW50IG9mIGEgY2lyY3VsYXIgYmxvY2suIENhcmUgbXVzdCBiZQotICogdGFrZW4gd2hlbiB1c2luZyB0aGlzIHZpZXcgc28gdGhhdCBvbmx5IHRoZSBzZWN0aW9uIG93bmVkIGJ5IHRoZSBzZWdtZW50IGlzIG1vZGlmaWVkLgotICovCi1jbGFzcyBDMkNpcmN1bGFyV3JpdGVWaWV3IDogcHVibGljIF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0IHsKLXB1YmxpYzoKLSAgICAvKioKLSAgICAgKiBTdGFydCBvZiB0aGUgY2lyY3VsYXIgYmxvY2suCi0gICAgICogXG5vdGUgdGhlIHNlZ21lbnQgZG9lcyBub3Qgb3duIHRoaXMgcG9pbnRlci4KLSAgICAgKgotICAgICAqIFxyZXR1cm4gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGNpcmN1bGFyIGJsb2NrIG9yIG51bGxwdHIgb24gZXJyb3IuCi0gICAgICovCi0gICAgdWludDhfdCAqYmFzZSgpOwotCi0gICAgLyoqCi0gICAgICogXHJldHVybiBlcnJvciBkdXJpbmcgdGhlIGNyZWF0aW9uL21hcHBpbmcgb2YgdGhpcyB2aWV3LgotICAgICAqLwotICAgIEMyRXJyb3IgZXJyb3IoKTsKLX07Ci0KLS8qKgotICogVGhlIHdyaXRlciBvZiBhIGNpcmN1bGFyIGJ1ZmZlci4KLSAqCi0gKiBDYW4gY29tbWl0IGRhdGEgdG8gYSByZWFkZXIgKG5vdCBzdXBwb3J0ZWQgZm9yIGNvbXBvbmVudHMpIE9SIHNoYXJlIGRhdGEgYmxvY2tzIGRpcmVjdGx5IHdpdGggYQotICogY29uc3VtZXIuCi0gKgotICogSWYgYSBjb21wb25lbnQgc3VwcG9ydHMgb3V0cHV0dGluZyBkYXRhIGludG8gY2lyY3VsYXIgYnVmZmVycywgaXQgbXVzdCBhbGxvY2F0ZSBhIGNpcmN1bGFyCi0gKiBibG9jayBhbmQgdXNlIGEgY2lyY3VsYXIgd3JpdGVyLgotICovCi1jbGFzcyBDMkNpcmN1bGFyV3JpdGVyIDogcHVibGljIF9DMkNpcmN1bGFyQmxvY2tTZWdtZW50IHsKLXB1YmxpYzoKLSAgICAvKioKLSAgICAgKiBDb21taXRzIGEgcG9ydGlvbiBvZiB0aGlzIHNlZ21lbnQgdG8gdGhlIG5leHQgc2VnbWVudC4gVGhpcyBtb3ZlcyB0aGUgYmVnaW5uaW5nIG9mIHRoZQotICAgICAqIHNlZ21lbnQuCi0gICAgICoKLSAgICAgKiBccGFyYW0gc2l6ZSAgICBudW1iZXIgb2YgYnl0ZXMgdG8gY29tbWl0IHRvIHRoZSBuZXh0IHNlZ21lbnQKLSAgICAgKiBccGFyYW0gZmVuY2UgICBmZW5jZSB1c2VkIGZvciB0aGUgY29tbWl0ICh0aGUgZmVuY2UgbXVzdCBzaWduYWwgYmVmb3JlIHRoZSBkYXRhIGlzIGNvbW1pdHRlZCkKLSAgICAgKi8KLSAgICBDMkVycm9yIGNvbW1pdChzaXplX3Qgc2l6ZSwgQzJGZW5jZSBmZW5jZSk7Ci0KLSAgICAvKioKLSAgICAgKiBNYXBzIHRoaXMgYmxvY2sgaW50byBtZW1vcnkgYW5kIHJldHVybnMgYSB3cml0ZSB2aWV3IGZvciBpdC4KLSAgICAgKgotICAgICAqIFxyZXR1cm4gYSB3cml0ZSB2aWV3IGZvciB0aGlzIGJsb2NrLgotICAgICAqLwotICAgIEMyQWNxdWlyYWJsZTxDMkNpcmN1bGFyV3JpdGVWaWV3PiBtYXAoKTsKLX07Ci0KLS8vLyBAfQotCi0vLy8gXGRlZmdyb3VwIGdyYXBoaWMgR3JhcGhpYyBEYXRhIEJsb2NrcwotLy8vIEB7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBvYmplY3RzIHRoYXQgaGF2ZSBhIHdpZHRoIGFuZCBoZWlnaHQgKHBsYW5hciBjYXBhY2l0eSkuCi0gKi8KLWNsYXNzIF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0IHsKLS8vLyBcbmFtZSBQbGFuYXIgY2FwYWNpdHkgaW50ZXJmYWNlCi0vLy8gQHsKLXB1YmxpYzoKLSAgICBpbmxpbmUgdWludDMyX3Qgd2lkdGgoKSBjb25zdCB7IHJldHVybiBtV2lkdGg7IH0KLSAgICBpbmxpbmUgdWludDMyX3QgaGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gbUhlaWdodDsgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgaW5saW5lIF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0KHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpCi0gICAgICA6IG1XaWR0aCh3aWR0aCksIG1IZWlnaHQoaGVpZ2h0KSB7IH0KLQotICAgIGlubGluZSBfQzJQbGFuYXJDYXBhY2l0eUFzcGVjdChjb25zdCBfQzJQbGFuYXJDYXBhY2l0eUFzcGVjdCAqcGFyZW50KQotICAgICAgICA6IG1XaWR0aChwYXJlbnQgPT0gbnVsbHB0ciA/IDAgOiBwYXJlbnQtPndpZHRoKCkpLAotICAgICAgICAgIG1IZWlnaHQocGFyZW50ID09IG51bGxwdHIgPyAwIDogcGFyZW50LT5oZWlnaHQoKSkgeyB9Ci0KLXByaXZhdGU6Ci0gICAgY29uc3QgdWludDMyX3QgbVdpZHRoOwotICAgIGNvbnN0IHVpbnQzMl90IG1IZWlnaHQ7Ci0vLy8gQH0KLX07Ci0KLS8qKgotICogQzJSZWN0OiByZWN0YW5nbGUgdHlwZSB3aXRoIG5vbi1uZWdhdGl2ZSBjb29yZGluYXRlcy4KLSAqCi0gKiBcbm90ZSBUaGlzIHN0cnVjdCBoYXMgcHVibGljIGZpZWxkcyB3aXRob3V0IGdldHRlcnMvc2V0dGVycy4gQWxsIG1ldGhvZHMgYXJlIGlubGluZS4KLSAqLwotc3RydWN0IEMyUmVjdCB7Ci0vLyBwdWJsaWM6Ci0gICAgdWludDMyX3QgbUxlZnQ7Ci0gICAgdWludDMyX3QgbVRvcDsKLSAgICB1aW50MzJfdCBtV2lkdGg7Ci0gICAgdWludDMyX3QgbUhlaWdodDsKLQotICAgIGlubGluZSBDMlJlY3QodWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkKLSAgICAgICAgOiBDMlJlY3Qod2lkdGgsIGhlaWdodCwgMCwgMCkgeyB9Ci0KLSAgICBpbmxpbmUgQzJSZWN0KHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGxlZnQsIHVpbnQzMl90IHRvcCkKLSAgICAgICAgOiBtTGVmdChsZWZ0KSwgbVRvcCh0b3ApLCBtV2lkdGgod2lkdGgpLCBtSGVpZ2h0KGhlaWdodCkgeyB9Ci0KLSAgICAvLyB1dGlsaXR5IG1ldGhvZHMKLQotICAgIGlubGluZSBib29sIGlzRW1wdHkoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtV2lkdGggPT0gMCB8fCBtSGVpZ2h0ID09IDA7Ci0gICAgfQotCi0gICAgaW5saW5lIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1MZWZ0IDw9IH5tV2lkdGggJiYgbVRvcCA8PSB+bUhlaWdodDsKLSAgICB9Ci0KLSAgICBpbmxpbmUgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIGlzVmFsaWQoKSAmJiAhaXNFbXB0eSgpOwotICAgIH0KLQotICAgIGlubGluZSBib29sIG9wZXJhdG9yISgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuICFib29sKCp0aGlzKTsKLSAgICB9Ci0KLSAgICBpbmxpbmUgYm9vbCBjb250YWlucyhjb25zdCBDMlJlY3QgJm90aGVyKSBjb25zdCB7Ci0gICAgICAgIGlmICghaXNWYWxpZCgpIHx8ICFvdGhlci5pc1ZhbGlkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIGlmIChvdGhlci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG1MZWZ0IDw9IG90aGVyLm1MZWZ0ICYmIG1Ub3AgPD0gb3RoZXIubVRvcAotICAgICAgICAgICAgICAgICAgICAmJiBtTGVmdCArIG1XaWR0aCA+PSBvdGhlci5tTGVmdCArIG90aGVyLm1XaWR0aAotICAgICAgICAgICAgICAgICAgICAmJiBtVG9wICsgbUhlaWdodCA+PSBvdGhlci5tVG9wICsgb3RoZXIubUhlaWdodDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgQzJSZWN0ICZvdGhlcikgY29uc3QgewotICAgICAgICBpZiAoIWlzVmFsaWQoKSkgewotICAgICAgICAgICAgcmV0dXJuICFvdGhlci5pc1ZhbGlkKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gb3RoZXIuaXNFbXB0eSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG1MZWZ0ID09IG90aGVyLm1MZWZ0ICYmIG1Ub3AgPT0gb3RoZXIubVRvcAotICAgICAgICAgICAgICAgICAgICAmJiBtV2lkdGggPT0gb3RoZXIubVdpZHRoICYmIG1IZWlnaHQgPT0gb3RoZXIubUhlaWdodDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgQzJSZWN0ICZvdGhlcikgY29uc3QgewotICAgICAgICByZXR1cm4gIW9wZXJhdG9yPT0ob3RoZXIpOwotICAgIH0KLQotICAgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgQzJSZWN0ICZvdGhlcikgY29uc3QgewotICAgICAgICByZXR1cm4gY29udGFpbnMob3RoZXIpOwotICAgIH0KLQotICAgIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBDMlJlY3QgJm90aGVyKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBjb250YWlucyhvdGhlcikgJiYgIW9wZXJhdG9yPT0ob3RoZXIpOwotICAgIH0KLQotICAgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgQzJSZWN0ICZvdGhlcikgY29uc3QgewotICAgICAgICByZXR1cm4gb3RoZXIuY29udGFpbnMoKnRoaXMpOwotICAgIH0KLQotICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBDMlJlY3QgJm90aGVyKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBvdGhlci5jb250YWlucygqdGhpcykgJiYgIW9wZXJhdG9yPT0ob3RoZXIpOwotICAgIH0KLX07Ci0KLS8qKgotICogQzJQbGFuZUluZm86IGluZm9ybWF0aW9uIG9uIHRoZSBsYXlvdXQgb2YgZmxleGlibGUgcGxhbmVzLgotICoKLSAqIFB1YmxpYyBmaWVsZHMgd2l0aG91dCBnZXR0ZXJzL3NldHRlcnMuCi0gKi8KLXN0cnVjdCBDMlBsYW5lSW5mbyB7Ci0vLyBwdWJsaWM6Ci0gICAgZW51bSBDaGFubmVsIDogdWludDMyX3QgewotICAgICAgICBZLAotICAgICAgICBSLAotICAgICAgICBHLAotICAgICAgICBCLAotICAgICAgICBBLAotICAgICAgICBDciwKLSAgICAgICAgQ2IsCi0gICAgfSBtQ2hhbm5lbDsKLQotICAgIGludDMyX3QgbUNvbEluYzsgICAgICAgICAgICAgICAvLyBjb2x1bW4gaW5jcmVtZW50IGluIGJ5dGVzLiBtYXkgYmUgbmVnYXRpdmUKLSAgICBpbnQzMl90IG1Sb3dJbmM7ICAgICAgICAgICAgICAgLy8gcm93IGluY3JlbWVudCBpbiBieXRlcy4gbWF5IGJlIG5lZ2F0aXZlCi0gICAgdWludDMyX3QgbUhvcml6U3Vic2FtcGxpbmc7ICAgIC8vIHN1YnNhbXBsaW5nIGNvbXBhcmVkIHRvIHdpZHRoCi0gICAgdWludDMyX3QgbVZlcnRTdWJzYW1wbGluZzsgICAgIC8vIHN1YnNhbXBsaW5nIGNvbXBhcmVkIHRvIGhlaWdodAotCi0gICAgdWludDMyX3QgbUJpdERlcHRoOwotICAgIHVpbnQzMl90IG1BbGxvY2F0ZWREZXB0aDsKLQotICAgIGlubGluZSBzc2l6ZV90IG1pbk9mZnNldCh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSB7Ci0gICAgICAgIHNzaXplX3Qgb2ZmcyA9IDA7Ci0gICAgICAgIGlmICh3aWR0aCA+IDAgJiYgbUNvbEluYyA8IDApIHsKLSAgICAgICAgICAgIG9mZnMgKz0gbUNvbEluYyAqIChzc2l6ZV90KSh3aWR0aCAtIDEpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChoZWlnaHQgPiAwICYmIG1Sb3dJbmMgPCAwKSB7Ci0gICAgICAgICAgICBvZmZzICs9IG1Sb3dJbmMgKiAoc3NpemVfdCkoaGVpZ2h0IC0gMSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG9mZnM7Ci0gICAgfQotCi0gICAgaW5saW5lIHNzaXplX3QgbWF4T2Zmc2V0KHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGFsbG9jYXRlZERlcHRoKSB7Ci0gICAgICAgIHNzaXplX3Qgb2ZmcyA9IChhbGxvY2F0ZWREZXB0aCArIDcpID4+IDM7Ci0gICAgICAgIGlmICh3aWR0aCA+IDAgJiYgbUNvbEluYyA+IDApIHsKLSAgICAgICAgICAgIG9mZnMgKz0gbUNvbEluYyAqIChzc2l6ZV90KSh3aWR0aCAtIDEpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChoZWlnaHQgPiAwICYmIG1Sb3dJbmMgPiAwKSB7Ci0gICAgICAgICAgICBvZmZzICs9IG1Sb3dJbmMgKiAoc3NpemVfdCkoaGVpZ2h0IC0gMSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG9mZnM7Ci0gICAgfQotfTsKLQotc3RydWN0IEMyUGxhbmVMYXlvdXQgewotcHVibGljOgotICAgIGVudW0gVHlwZSA6IHVpbnQzMl90IHsKLSAgICAgICAgTUVESUFfSU1BR0VfVFlQRV9VTktOT1dOID0gMCwKLSAgICAgICAgTUVESUFfSU1BR0VfVFlQRV9ZVVYgPSAweDEwMCwKLSAgICAgICAgTUVESUFfSU1BR0VfVFlQRV9ZVVZBLAotICAgICAgICBNRURJQV9JTUFHRV9UWVBFX1JHQiwKLSAgICAgICAgTUVESUFfSU1BR0VfVFlQRV9SR0JBLAotICAgIH07Ci0KLSAgICBUeXBlIG1UeXBlOwotICAgIHVpbnQzMl90IG1OdW1QbGFuZXM7ICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIHBsYW5lcwotCi0gICAgZW51bSBQbGFuZUluZGV4IDogdWludDMyX3QgewotICAgICAgICBZID0gMCwKLSAgICAgICAgVSA9IDEsCi0gICAgICAgIFYgPSAyLAotICAgICAgICBSID0gMCwKLSAgICAgICAgRyA9IDEsCi0gICAgICAgIEIgPSAyLAotICAgICAgICBBID0gMywKLSAgICAgICAgTUFYX05VTV9QTEFORVMgPSA0LAotICAgIH07Ci0KLSAgICBDMlBsYW5lSW5mbyBtUGxhbmVzW01BWF9OVU1fUExBTkVTXTsKLX07Ci0KLS8qKgotICogQXNwZWN0IGZvciBvYmplY3RzIHRoYXQgaGF2ZSBhIHBsYW5hciBzZWN0aW9uIChjcm9wIHJlY3RhbmdsZSkuCi0gKgotICogVGhpcyBjbGFzcyBpcyBjb3BpYWJsZS4KLSAqLwotY2xhc3MgX0MyUGxhbmFyU2VjdGlvbiA6IHB1YmxpYyBfQzJQbGFuYXJDYXBhY2l0eUFzcGVjdCB7Ci0vLy8gXG5hbWUgUGxhbmFyIHNlY3Rpb24gaW50ZXJmYWNlCi0vLy8gQHsKLXB1YmxpYzoKLSAgICAvLyBjcm9wIGNhbiBiZSBhbiBlbXB0eSByZWN0LCBkb2VzIG5vdCBoYXZlIHRvIGxpbmUgdXAgd2l0aCBzdWJzYW1wbGluZwotICAgIC8vIE5PVEU6IHdlIGRvIG5vdCBzdXBwb3J0IGZsb2F0aW5nLXBvaW50IGNyb3AKLSAgICBpbmxpbmUgY29uc3QgQzJSZWN0IGNyb3AoKSB7IHJldHVybiBtQ3JvcDsgfQotCi0gICAgLyoqCi0gICAgICogIFNldHMgY3JvcCB0byBjcm9wIGludGVyc2VjdGVkIHdpdGggWygwLDApIC4uICh3aWR0aCwgaGVpZ2h0KV0KLSAgICAgKi8KLSAgICBpbmxpbmUgdm9pZCBzZXRDcm9wX2JlKGNvbnN0IEMyUmVjdCAmY3JvcCk7Ci0KLSAgICAvKioKLSAgICAgKiBJZiBjcm9wIGlzIHdpdGhpbiB0aGUgZGltZW5zaW9ucyBvZiB0aGlzIG9iamVjdCwgaXQgc2V0cyBjcm9wIHRvIGl0LgotICAgICAqCi0gICAgICogXHJldHVybiB0cnVlIGlmZiBjcm9wIGlzIHdpdGhpbiB0aGUgZGltZW5zaW9ucyBvZiB0aGlzIG9iamVjdAotICAgICAqLwotICAgIGlubGluZSBib29sIHNldENyb3AoY29uc3QgQzJSZWN0ICZjcm9wKTsKLQotcHJpdmF0ZToKLSAgICBDMlJlY3QgbUNyb3A7Ci0vLy8gQH0KLX07Ci0KLWNsYXNzIEMyQmxvY2syRCA6IHB1YmxpYyBfQzJQbGFuYXJTZWN0aW9uIHsKLXB1YmxpYzoKLSAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKCkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgY2xhc3MgSW1wbDsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7Ci19OwotCi0vKioKLSAqIEdyYXBoaWMgdmlldyBwcm92aWRlcyByZWFkIG9yIHJlYWQtd3JpdGUgYWNjZXNzIGZvciBhIGdyYXBoaWMgYmxvY2suCi0gKgotICogVGhpcyBjbGFzcyBpcyBjb3BpYWJsZS4KLSAqCi0gKiBcbm90ZSBEdWUgdG8gdGhlIHN1YnNhbXBsaW5nIG9mIGdyYXBoaWMgYnVmZmVycywgYSByZWFkIHZpZXcgbXVzdCBzdGlsbCBjb250YWluIGEgY3JvcCByZWN0YW5nbGUKLSAqIHRvIGVuc3VyZSBzdWJzYW1wbGluZyBpcyBmb2xsb3dlZC4gVGhpcyByZXN1bHRzIGluIG5lYXJseSBpZGVudGljYWwgaW50ZXJmYWNlIGJldHdlZW4gcmVhZCBhbmQKLSAqIHdyaXRlIHZpZXdzLCBzbyBDMkdyYXBoaWNWaWV3IGNhbiBlbmNvbXBhc3MgYm90aCBvZiB0aGVtLgotICovCi1jbGFzcyBDMkdyYXBoaWNWaWV3IDogcHVibGljIF9DMlBsYW5hclNlY3Rpb24gewotcHVibGljOgotICAgIC8qKgotICAgICAqIFxyZXR1cm4gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrIG9yIG51bGxwdHIgb24gZXJyb3IuCi0gICAgICovCi0gICAgY29uc3QgdWludDhfdCAqZGF0YSgpIGNvbnN0OwotCi0gICAgLyoqCi0gICAgICogXHJldHVybiBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgYmxvY2sgb3IgbnVsbHB0ciBvbiBlcnJvci4KLSAgICAgKi8KLSAgICB1aW50OF90ICpkYXRhKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc2VjdGlvbiBvZiB0aGlzIHZpZXcuCi0gICAgICoKLSAgICAgKiBccGFyYW0gcmVjdCAgICB0aGUgZGltZW5zaW9uIG9mIHRoZSBzZWN0aW9uLiBcbm90ZSBUaGlzIGlzIGNsYW1wZWQgdG8gdGhlIGNyb3Agb2YgdGhpcyB2aWV3LgotICAgICAqCi0gICAgICogXHJldHVybiBhIHJlYWQgdmlldyBjb250YWluaW5nIHRoZSByZXF1ZXN0ZWQgc2VjdGlvbiBvZiB0aGlzIHZpZXcKLSAgICAgKi8KLSAgICBjb25zdCBDMkdyYXBoaWNWaWV3IHN1YlZpZXcoY29uc3QgQzJSZWN0ICZyZWN0KSBjb25zdDsKLSAgICBDMkdyYXBoaWNWaWV3IHN1YlZpZXcoY29uc3QgQzJSZWN0ICZyZWN0KTsKLQotICAgIC8qKgotICAgICAqIFxyZXR1cm4gZXJyb3IgZHVyaW5nIHRoZSBjcmVhdGlvbi9tYXBwaW5nIG9mIHRoaXMgdmlldy4KLSAgICAgKi8KLSAgICBDMkVycm9yIGVycm9yKCkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgY2xhc3MgSW1wbDsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7Ci19OwotCi0vKioKLSAqIEEgY29uc3RhbnQgKHJlYWQtb25seSkgZ3JhcGhpYyBibG9jayAocG9ydGlvbiBvZiBhbiBhbGxvY2F0aW9uKSB3aXRoIGFuIGFjcXVpcmUgZmVuY2UuCi0gKiBCbG9ja3MgYXJlIHVubWFwcGVkIHdoZW4gY3JlYXRlZCwgYW5kIGNhbiBiZSBtYXBwZWQgaW50byBhIHJlYWQgdmlldyBvbiBkZW1hbmQuCi0gKgotICogVGhpcyBjbGFzcyBpcyBjb3BpYWJsZSBhbmQgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIGFsbG9jYXRpb24gdGhhdCBpdCBpcyBiYXNlZCBvbi4KLSAqLwotY2xhc3MgQzJDb25zdEdyYXBoaWNCbG9jayA6IHB1YmxpYyBDMkJsb2NrMkQgewotcHVibGljOgotICAgIC8qKgotICAgICAqIE1hcHMgdGhpcyBibG9jayBpbnRvIG1lbW9yeSBhbmQgcmV0dXJucyBhIHJlYWQgdmlldyBmb3IgaXQuCi0gICAgICoKLSAgICAgKiBccmV0dXJuIGEgcmVhZCB2aWV3IGZvciB0aGlzIGJsb2NrLgotICAgICAqLwotICAgIEMyQWNxdWlyYWJsZTxjb25zdCBDMkdyYXBoaWNWaWV3PiBtYXAoKSBjb25zdDsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzZWN0aW9uIG9mIHRoaXMgYmxvY2suCi0gICAgICoKLSAgICAgKiBccGFyYW0gcmVjdCAgICB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHNlY3Rpb24uIFxub3RlIFRoaXMgaXMgY2xhbXBlZCB0byB0aGUgY3JvcCByZWN0YW5nbGUgb2YKLSAgICAgKiAgICAgICAgICAgICAgdGhpcyBibG9jay4KLSAgICAgKgotICAgICAqIFxyZXR1cm4gYSBjb25zdGFudCBncmFwaGljIGJsb2NrIGNvbnRhaW5pbmcgYSBwb3J0aW9uIG9mIHRoaXMgYmxvY2sKLSAgICAgKi8KLSAgICBDMkNvbnN0R3JhcGhpY0Jsb2NrIHN1YkJsb2NrKGNvbnN0IEMyUmVjdCAmcmVjdCkgY29uc3Q7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhY3F1aXJlIGZlbmNlIGZvciB0aGlzIGJsb2NrLgotICAgICAqCi0gICAgICogXHJldHVybiBhIGZlbmNlIHRoYXQgbXVzdCBiZSB3YWl0ZWQgb24gYmVmb3JlIHJlYWRpbmcgdGhlIGJsb2NrLgotICAgICAqLwotICAgIEMyRmVuY2UgZmVuY2UoKSBjb25zdCB7IHJldHVybiBtRmVuY2U7IH0KLQotcHJpdmF0ZToKLSAgICBDMkZlbmNlIG1GZW5jZTsKLX07Ci0KLS8qKgotICogR3JhcGhpYyBibG9jayBpcyBhIHdyaXRlYWJsZSAyRCBibG9jay4gT25jZSB3cml0dGVuLCBpdCBjYW4gYmUgc2hhcmVkIGluIHdob2xlIG9yIGluIHBhcnQgd2l0aAotICogY29uc3VtZXJzL3JlYWRlcnMgYXMgcmVhZC1vbmx5IGNvbnN0IGdyYXBoaWMgYmxvY2suCi0gKi8KLWNsYXNzIEMyR3JhcGhpY0Jsb2NrIDogcHVibGljIEMyQmxvY2syRCB7Ci1wdWJsaWM6Ci0gICAgLyoqCi0gICAgICogTWFwcyB0aGlzIGJsb2NrIGludG8gbWVtb3J5IGFuZCByZXR1cm5zIGEgd3JpdGUgdmlldyBmb3IgaXQuCi0gICAgICoKLSAgICAgKiBccmV0dXJuIGEgd3JpdGUgdmlldyBmb3IgdGhpcyBibG9jay4KLSAgICAgKi8KLSAgICBDMkFjcXVpcmFibGU8QzJHcmFwaGljVmlldz4gbWFwKCk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgcmVhZC1vbmx5IGNvbnN0IGxpbmVhciBibG9jayBmb3IgYSBwb3J0aW9uIG9mIHRoaXMgYmxvY2s7IG9wdGlvbmFsbHkgcHJvdGVjdGVkCi0gICAgICogYnkgYW4gYWNxdWlyZSBmZW5jZS4gVGhlcmUgYXJlIHR3byB3YXlzIHRvIHVzZSB0aGlzOgotICAgICAqCi0gICAgICogMSkgc2hhcmUgcmVhZHkgYmxvY2sgYWZ0ZXIgd3JpdGluZyBkYXRhIGludG8gdGhlIGJsb2NrLiBJbiB0aGlzIGNhc2Ugbm8gZmVuY2Ugc2hhbGwgYmUKLSAgICAgKiAgICBzdXBwbGllZCwgYW5kIHRoZSBibG9jayBzaGFsbCBub3QgYmUgbW9kaWZpZWQgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZC4KLSAgICAgKiAyKSBzaGFyZSBibG9jayBtZXRhZGF0YSBiZWZvcmUgYWN0dWFsbHkgKGZpbmlzaGluZykgd3JpdGluZyB0aGUgZGF0YSBpbnRvIHRoZSBibG9jay4gSW4KLSAgICAgKiAgICB0aGlzIGNhc2UgYSBmZW5jZSBtdXN0IGJlIHN1cHBsaWVkIHRoYXQgd2lsbCBiZSB0cmlnZ2VyZWQgd2hlbiB0aGUgZGF0YSBpcyB3cml0dGVuLgotICAgICAqICAgIFRoZSBibG9jayBzaGFsbCBiZSBtb2RpZmllZCBvbmx5IHVudGlsIGZpcmluZyB0aGUgZXZlbnQgZm9yIHRoZSBmZW5jZS4KLSAgICAgKi8KLSAgICBDMkNvbnN0R3JhcGhpY0Jsb2NrIHNoYXJlKGNvbnN0IEMyUmVjdCAmY3JvcCwgQzJGZW5jZSBmZW5jZSk7Ci19OwotCi0vLy8gQH0KLQotLy8vIFxkZWZncm91cCBidWZmZXJfb25qIEJ1ZmZlciBvYmplY3RzCi0vLy8gQHsKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyAgQlVGRkVSUwotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8vLyBcdG9kbzogRG8gd2Ugc3RpbGwgbmVlZCB0aGlzPwotLy8vCi0vLyBUaGVyZSBhcmUgMiBraW5kcyBvZiBidWZmZXJzOiBsaW5lYXIgb3IgZ3JhcGhpYy4gTGluZWFyIGJ1ZmZlcnMgY2FuIGNvbnRhaW4gYSBzaW5nbGUgYmxvY2ssIG9yCi0vLyBhIGxpc3Qgb2YgYmxvY2tzIChMSU5FQVJfQ0hVTktTKS4gU3VwcG9ydCBmb3IgbGlzdCBvZiBibG9ja3MgaXMgb3B0aW9uYWwsIGFuZCBjYW4gYWxsb3cgY29uc3VtaW5nCi0vLyBkYXRhIGZyb20gY2lyY3VsYXIgYnVmZmVycyBvciBzY2F0dGVyZWQgZGF0YSBzb3VyY2VzIHdpdGhvdXQgZXh0cmEgbWVtY3B5LiBDdXJyZW50bHksIGxpc3Qgb2YKLS8vIGdyYXBoaWMgYmxvY2tzIGlzIG5vdCBzdXBwb3J0ZWQuCi0KLWNsYXNzIEMyTGluZWFyQnVmZmVyOyAgIC8vIHJlYWQtd3JpdGUgYnVmZmVyCi1jbGFzcyBDMkdyYXBoaWNCdWZmZXI7ICAvLyByZWFkLXdyaXRlIGJ1ZmZlcgotY2xhc3MgQzJMaW5lYXJDaHVua3NCdWZmZXI7Ci0KLS8qKgotICogQzJCdWZmZXJEYXRhOiB0aGUgbWFpbiwgbm9uLW1ldGEgZGF0YSBvZiBhIGJ1ZmZlci4gQSBidWZmZXIgY2FuIGNvbnRhaW4gZWl0aGVyIGxpbmVhciBibG9ja3MKLSAqIG9yIGdyYXBoaWMgYmxvY2tzLCBhbmQgY2FuIGNvbnRhaW4gZWl0aGVyIGEgc2luZ2xlIGJsb2NrIG9yIG11bHRpcGxlIGJsb2Nrcy4gVGhpcyBpcyBkZXRlcm1pbmVkCi0gKiBieSBpdHMgdHlwZS4KLSAqLwotY2xhc3MgQzJCdWZmZXJEYXRhIHsKLXB1YmxpYzoKLSAgICAvKioKLSAgICAgKiAgVGhlIHR5cGUgb2YgYnVmZmVyIGRhdGEuCi0gICAgICovCi0gICAgZW51bSBUeXBlIDogdWludDMyX3QgewotICAgICAgICBMSU5FQVIsICAgICAgICAgICAgIC8vLzwgdGhlIGJ1ZmZlciBjb250YWlucyBhIHNpbmdsZSBsaW5lYXIgYmxvY2sKLSAgICAgICAgTElORUFSX0NIVU5LUywgICAgICAvLy88IHRoZSBidWZmZXIgY29udGFpbnMgb25lIG9yIG1vcmUgbGluZWFyIGJsb2NrcwotICAgICAgICBHUkFQSElDLCAgICAgICAgICAgIC8vLzwgdGhlIGJ1ZmZlciBjb250YWlucyBhIHNpbmdsZSBncmFwaGljIGJsb2NrCi0gICAgICAgIEdSQVBISUNfQ0hVTktTLCAgICAgLy8vPCB0aGUgYnVmZmVyIGNvbnRhaW5zIG9uZSBvZiBtb3JlIGdyYXBoaWMgYmxvY2tzCi0gICAgfTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHR5cGUgb2YgdGhpcyBidWZmZXIgKGRhdGEpLgotICAgICAqIFxyZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyBidWZmZXIgZGF0YS4KLSAgICAgKi8KLSAgICBUeXBlIHR5cGUoKSBjb25zdDsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGxpbmVhciBibG9ja3Mgb2YgdGhpcyBidWZmZXIuCi0gICAgICogXHJldHVybiBhIGNvbnN0YW50IGxpc3Qgb2YgY29uc3QgbGluZWFyIGJsb2NrcyBvZiB0aGlzIGJ1ZmZlci4KLSAgICAgKiBccmV0dmFsIGVtcHR5IGxpc3QgaWYgdGhpcyBidWZmZXIgZG9lcyBub3QgY29udGFpbiBsaW5lYXIgYmxvY2socykuCi0gICAgICovCi0gICAgY29uc3Qgc3RkOjpsaXN0PEMyQ29uc3RMaW5lYXJCbG9jaz4gbGluZWFyQmxvY2tzKCkgY29uc3Q7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBncmFwaGljIGJsb2NrcyBvZiB0aGlzIGJ1ZmZlci4KLSAgICAgKiBccmV0dXJuIGEgY29uc3RhbnQgbGlzdCBvZiBjb25zdCBncmFwaGljIGJsb2NrcyBvZiB0aGlzIGJ1ZmZlci4KLSAgICAgKiBccmV0dmFsIGVtcHR5IGxpc3QgaWYgdGhpcyBidWZmZXIgZG9lcyBub3QgY29udGFpbiBncmFwaGljIGJsb2NrKHMpLgotICAgICAqLwotICAgIGNvbnN0IHN0ZDo6bGlzdDxDMkNvbnN0R3JhcGhpY0Jsb2NrPiBncmFwaGljQmxvY2tzKCkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgY2xhc3MgSW1wbDsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7Ci0KLXByb3RlY3RlZDoKLSAgICAvLyBubyBwdWJsaWMgY29uc3RydWN0b3IKLSAgICAvLyBDMkJ1ZmZlckRhdGEoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEltcGw+ICZpbXBsKSA6IG1JbXBsKGltcGwpIHt9Ci19OwotCi0vKioKLSAqIEMyQnVmZmVyOiBidWZmZXIgYmFzZSBjbGFzcy4gVGhlc2UgYXJlIGFsd2F5cyB1c2VkIGFzIHNoYXJlZF9wdHJzLiBUaG91Z2ggdGhlIHVuZGVybHlpbmcgYnVmZmVyCi0gKiBvYmplY3RzIChuYXRpdmUgYnVmZmVycywgaW9uIGJ1ZmZlcnMsIG9yIGRtYWJ1ZnMpIGFyZSByZWZlcmVuY2UtY291bnRlZCBieSB0aGUgc3lzdGVtLAotICogQzJCdWZmZXJzIGhvbGQgb25seSBhIHNpbmdsZSByZWZlcmVuY2UuCi0gKgotICogVGhlc2Ugb2JqZWN0cyBjYW5ub3QgYmUgdXNlZCBvbiB0aGUgc3RhY2suCi0gKi8KLWNsYXNzIEMyQnVmZmVyIHsKLXB1YmxpYzoKLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBidWZmZXIncyBkYXRhLgotICAgICAqCi0gICAgICogXHJldHVybiB0aGUgYnVmZmVyJ3MgZGF0YS4KLSAgICAgKi8KLSAgICBjb25zdCBDMkJ1ZmZlckRhdGEgZGF0YSgpIGNvbnN0OwotCi0gICAgLyoqCi0gICAgICogVGhlc2Ugd2lsbCBzdGlsbCB3b3JrIGlmIHVzZWQgaW4gb25EZWF0aE5vdGlmeS4KLSAgICAgKi8KLSNpZiAwCi0gICAgaW5saW5lIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJ1ZmZlcj4gYXNMaW5lYXJCdWZmZXIoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtVHlwZSA9PSBMSU5FQVIgPyBzdGQ6OnNoYXJlZF9wdHI6OnJlaW50ZXJwcmV0X2Nhc3Q8QzJMaW5lYXJCdWZmZXI+KHRoaXMpIDogbnVsbHB0cjsKLSAgICB9Ci0KLSAgICBpbmxpbmUgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0J1ZmZlcj4gYXNHcmFwaGljQnVmZmVyKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVR5cGUgPT0gR1JBUEhJQyA/IHN0ZDo6c2hhcmVkX3B0cjo6cmVpbnRlcnByZXRfY2FzdDxDMkdyYXBoaWNCdWZmZXI+KHRoaXMpIDogbnVsbHB0cjsKLSAgICB9Ci0KLSAgICBpbmxpbmUgc3RkOjpzaGFyZWRfcHRyPEMyQ2lyY3VsYXJCdWZmZXI+IGFzQ2lyY3VsYXJCdWZmZXIoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtVHlwZSA9PSBDSVJDVUxBUiA/IHN0ZDo6c2hhcmVkX3B0cjo6cmVpbnRlcnByZXRfY2FzdDxDMkNpcmN1bGFyQnVmZmVyPih0aGlzKSA6IG51bGxwdHI7Ci0gICAgfQotI2VuZGlmCi0KLSAgICAvLy9AbmFtZSBQcmUtZGVzdHJveSBub3RpZmljYXRpb24gaGFuZGxpbmcKLSAgICAvLy9AewotCi0gICAgLyoqCi0gICAgICogUmVnaXN0ZXIgZm9yIG5vdGlmaWNhdGlvbiBqdXN0IHByaW9yIHRvIHRoZSBkZXN0cnVjdGlvbiBvZiB0aGlzIG9iamVjdC4KLSAgICAgKi8KLSAgICB0eXBlZGVmIHZvaWQgKCpPbkRlc3Ryb3lOb3RpZnkpIChjb25zdCBDMkJ1ZmZlciAqYnVmLCB2b2lkICphcmcpOwotCi0gICAgLyoqCi0gICAgICogUmVnaXN0ZXJzIGZvciBhIHByZS1kZXN0cm95IG5vdGlmaWNhdGlvbi4gVGhpcyBpcyBjYWxsZWQganVzdCBwcmlvciB0byB0aGUgZGVzdHJ1Y3Rpb24gb2YKLSAgICAgKiB0aGlzIGJ1ZmZlciAod2hlbiB0aGlzIGJ1ZmZlciBpcyBubyBsb25nZXIgdmFsaWQuKQotICAgICAqCi0gICAgICogXHBhcmFtIG9uRGVzdHJveU5vdGlmeSAgIHRoZSBub3RpZmljYXRpb24gY2FsbGJhY2sKLSAgICAgKiBccGFyYW0gYXJnICAgICAgICAgICAgICAgYW4gYXJiaXRyYXJ5IHBhcmFtZXRlciBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrCi0gICAgICoKLSAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgcmVnaXN0cmF0aW9uIHdhcyBzdWNjZXNzZnVsLgotICAgICAqIFxyZXR2YWwgQzJfRFVQTElDQVRFIGEgbm90aWZpY2F0aW9uIHdhcyBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIHRoaXMgY2FsbGJhY2sgYW5kIGFyZ3VtZW50Ci0gICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gcmVnaXN0ZXIgZm9yIHRoaXMgY2FsbGJhY2sKLSAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBhbiB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgcmVnaXN0cmF0aW9uICh1bmV4cGVjdGVkKQotICAgICAqLwotICAgIEMyRXJyb3IgcmVnaXN0ZXJPbkRlc3Ryb3lOb3RpZnkoT25EZXN0cm95Tm90aWZ5ICpvbkRlc3Ryb3lOb3RpZnksIHZvaWQgKmFyZyA9IG51bGxwdHIpOwotCi0gICAgLyoqCi0gICAgICogVW5yZWdpc3RlcnMgYSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgcHJlLWRlc3Ryb3kgbm90aWZpY2F0aW9uLgotICAgICAqCi0gICAgICogXHBhcmFtIG9uRGVzdHJveU5vdGlmeSAgIHRoZSBub3RpZmljYXRpb24gY2FsbGJhY2sKLSAgICAgKiBccGFyYW0gYXJnICAgICAgICAgICAgICAgYW4gYXJiaXRyYXJ5IHBhcmFtZXRlciBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrCi0gICAgICoKLSAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgdW5yZWdpc3RyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuCi0gICAgICogXHJldHZhbCBDMl9OT1RfRk9VTkQgdGhlIG5vdGlmaWNhdGlvbiB3YXMgbm90IGZvdW5kCi0gICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgYW4gdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIHJlZ2lzdHJhdGlvbiAodW5leHBlY3RlZCkKLSAgICAgKi8KLSAgICBDMkVycm9yIHVucmVnaXN0ZXJPbkRlc3Ryb3lOb3RpZnkoT25EZXN0cm95Tm90aWZ5ICpvbkRlc3Ryb3lOb3RpZnksIHZvaWQgKmFyZyA9IG51bGxwdHIpOwotCi0gICAgLy8vQH0KLQotICAgIHZpcnR1YWwgfkMyQnVmZmVyKCkgPSBkZWZhdWx0OwotCi0gICAgLy8vQG5hbWUgQnVmZmVyLXNwZWNpZmljIGFyYml0cmFyeSBtZXRhZGF0YSBoYW5kbGluZwotICAgIC8vL0B7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJ1ZmZlci4KLSAgICAgKgotICAgICAqIFxyZXR1cm4gYSBjb25zdGFudCBsaXN0IG9mIGluZm8gb2JqZWN0cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBidWZmZXIuCi0gICAgICovCi0gICAgY29uc3Qgc3RkOjpsaXN0PHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkluZm8+PiBpbmZvcygpIGNvbnN0OwotCi0gICAgLyoqCi0gICAgICogQXR0YWNoZXMgKG9yIHVwZGF0ZXMpIGFuIChleGlzdGluZykgbWV0YWRhdGEgZm9yIHRoaXMgYnVmZmVyLgotICAgICAqIElmIHRoZSBtZXRhZGF0YSBpcyBzdHJlYW0gc3BlY2lmaWMsIHRoZSBzdHJlYW0gaW5mb3JtYXRpb24gd2lsbCBiZSByZXNldC4KLSAgICAgKgotICAgICAqIFxwYXJhbSBpbmZvIE1ldGFkYXRhIHRvIHVwZGF0ZQotICAgICAqCi0gICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIG1ldGFkYXRhIHdhcyBzdWNjZXNzZnVsbHkgYXR0YWNoZWQvdXBkYXRlZC4KLSAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBhdHRhY2ggdGhlIG1ldGFkYXRhICh0aGlzIHJldHVybiB2YWx1ZSBpcyBub3QKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICB1c2VkIGlmIHRoZSBzYW1lIGtpbmQgb2YgbWV0YWRhdGEgaXMgYWxyZWFkeSBhdHRhY2hlZCB0byB0aGUgYnVmZmVyKS4KLSAgICAgKi8KLSAgICBDMkVycm9yIHNldEluZm8oY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMySW5mbz4gJmluZm8pOwotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIHRoZXJlIGlzIGEgY2VydGFpbiB0eXBlIG9mIG1ldGFkYXRhIGF0dGFjaGVkIHRvIHRoaXMgYnVmZmVyLgotICAgICAqCi0gICAgICogXHBhcmFtIGluZGV4IHRoZSBwYXJhbWV0ZXIgdHlwZSBvZiB0aGUgbWV0YWRhdGEKLSAgICAgKgotICAgICAqIFxyZXR1cm4gdHJ1ZSBpZmYgdGhlcmUgaXMgYSBtZXRhZGF0YSB3aXRoIHRoZSBwYXJhbWV0ZXIgdHlwZSBhdHRhY2hlZCB0byB0aGlzIGJ1ZmZlci4KLSAgICAgKi8KLSAgICBib29sIGhhc0luZm8oQzJQYXJhbTo6VHlwZSBpbmRleCkgY29uc3Q7Ci0gICAgc3RkOjpzaGFyZWRfcHRyPEMySW5mbz4gcmVtb3ZlSW5mbyhDMlBhcmFtOjpUeXBlIGluZGV4KSBjb25zdDsKLSAgICAvLy9AfQotCi1wcm90ZWN0ZWQ6Ci0gICAgLy8gbm8gcHVibGljIGNvbnN0cnVjdG9yCi0gICAgaW5saW5lIEMyQnVmZmVyKCkgPSBkZWZhdWx0OwotCi1wcml2YXRlOgotLy8gICAgVHlwZSBfbVR5cGU7Ci19OwotCi0vKioKLSAqIEFuIGV4dGVuc2lvbiBvZiBDMkluZm8gb2JqZWN0cyB0aGF0IGNhbiBjb250YWluIGFyYml0cmFyeSBidWZmZXIgZGF0YS4KLSAqCi0gKiBcbm90ZSBUaGlzIG9iamVjdCBpcyBub3QgZGVzY3JpYmFibGUgYW5kIGNvbnRhaW5zIG9wYXF1ZSBkYXRhLgotICovCi1jbGFzcyBDMkluZm9CdWZmZXIgewotcHVibGljOgotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGluZGV4IG9mIHRoaXMgaW5mbyBvYmplY3QuCi0gICAgICoKLSAgICAgKiBccmV0dXJuIHRoZSBwYXJhbWV0ZXIgaW5kZXguCi0gICAgICovCi0gICAgY29uc3QgQzJQYXJhbTo6SW5kZXggaW5kZXgoKSBjb25zdDsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGJ1ZmZlcidzIGRhdGEuCi0gICAgICoKLSAgICAgKiBccmV0dXJuIHRoZSBidWZmZXIncyBkYXRhLgotICAgICAqLwotICAgIGNvbnN0IEMyQnVmZmVyRGF0YSBkYXRhKCkgY29uc3Q7Ci19OwotCi0vLy8gQH0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gIEFMTE9DQVRJT05TCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLy8vIFxkZWZncm91cCBhbGxvY2F0b3IgQWxsb2NhdGlvbiBhbmQgbWVtb3J5IHBsYWNlbWVudAotLy8vIEB7Ci0KLS8qKgotICogQnVmZmVyL21lbW9yeSB1c2FnZSBiaXRzLiBUaGVzZSBhcmUgdXNlZCBieSB0aGUgYWxsb2NhdG9ycyB0byBzZWxlY3Qgb3B0aW1hbCBtZW1vcnkgdHlwZS9wb29sIGFuZAotICogYnVmZmVyIGxheW91dC4KLSAqCi0gKiBcbm90ZSBUaGlzIHN0cnVjdCBoYXMgcHVibGljIGZpZWxkcyB3aXRob3V0IGdldHRlcnMvc2V0dGVycy4gQWxsIG1ldGhvZHMgYXJlIGlubGluZS4KLSAqLwotc3RydWN0IEMyTWVtb3J5VXNhZ2UgewotLy8gcHVibGljOgotICAgIC8vIFRPRE86IG1hdGNoIHRoZXNlIHRvIGdyYWxsb2MxLmgKLSAgICBlbnVtIENvbnN1bWVyIDogdWludDY0X3QgewotICAgICAgICBrU29mdHdhcmVSZWFkICAgICAgICA9IEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTiwKLSAgICAgICAga1JlbmRlclNjcmlwdFJlYWQgICAgPSBHUkFMTE9DX1VTQUdFX1JFTkRFUlNDUklQVCwKLSAgICAgICAga1RleHR1cmVSZWFkICAgICAgICAgPSBHUkFMTE9DX1VTQUdFX0hXX1RFWFRVUkUsCi0gICAgICAgIGtIYXJkd2FyZUNvbXBvc2VyICAgID0gR1JBTExPQ19VU0FHRV9IV19DT01QT1NFUiwKLSAgICAgICAga0hhcmR3YXJlRW5jb2RlciAgICAgPSBHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVIsCi0gICAgICAgIGtQcm90ZWN0ZWRSZWFkICAgICAgID0gR1JBTExPQ19VU0FHRV9QUk9URUNURUQsCi0gICAgfTsKLQotICAgIGVudW0gUHJvZHVjZXIgOiB1aW50NjRfdCB7Ci0gICAgICAgIGtTb2Z0d2FyZVdyaXRlICAgICAgID0gR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwKLSAgICAgICAga1JlbmRlclNjcmlwdFdyaXRlICAgPSBHUkFMTE9DX1VTQUdFX1JFTkRFUlNDUklQVCwKLSAgICAgICAga1RleHR1cmVXcml0ZSAgICAgICAgPSBHUkFMTE9DX1VTQUdFX0hXX1JFTkRFUiwKLSAgICAgICAga0NvbXBvc2l0aW9uVGFyZ2V0ICAgPSBHUkFMTE9DX1VTQUdFX0hXX0NPTVBPU0VSIHwgR1JBTExPQ19VU0FHRV9IV19SRU5ERVIsCi0gICAgICAgIGtIYXJkd2FyZURlY29kZXIgICAgID0gR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSLAotICAgICAgICBrUHJvdGVjdGVkV3JpdGUgICAgICA9IEdSQUxMT0NfVVNBR0VfUFJPVEVDVEVELAotICAgIH07Ci0KLSAgICB1aW50NjRfdCBtQ29uc3VtZXI7IC8vIGUuZy4gaW5wdXQKLSAgICB1aW50NjRfdCBtUHJvZHVjZXI7IC8vIGUuZy4gb3V0cHV0Ci19OwotCi0vKioKLSAqIFxpbmdyb3VwIGxpbmVhciBhbGxvY2F0b3IKLSAqIDFEIGFsbG9jYXRpb24gaW50ZXJmYWNlLgotICovCi1jbGFzcyBDMkxpbmVhckFsbG9jYXRpb24gOiBwdWJsaWMgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QgewotcHVibGljOgotICAgIC8qKgotICAgICAqIE1hcHMgYSBwb3J0aW9uIG9mIGFuIGFsbG9jYXRpb24gc3RhcnRpbmcgZnJvbSB8b2Zmc2V0fCB3aXRoIHxzaXplfCBpbnRvIGxvY2FsIHByb2Nlc3MgbWVtb3J5LgotICAgICAqIFN0b3JlcyB0aGUgc3RhcnRpbmcgYWRkcmVzcyBpbnRvIHxhZGRyfCwgb3IgTlVMTCBpZiB0aGUgb3BlcmF0aW9uIHdhcyB1bnN1Y2Nlc3NmdWwuCi0gICAgICogfGZlbmNlRmR8IGlzIGEgZmlsZSBkZXNjcmlwdG9yIHJlZmVycmluZyB0byBhbiBhY3F1aXJlIHN5bmMgZmVuY2Ugb2JqZWN0LiBJZiBpdCBpcyBhbHJlYWR5Ci0gICAgICogc2FmZSB0byBhY2Nlc3MgdGhlIGJ1ZmZlciBjb250ZW50cywgdGhlbiAtMS4KLSAgICAgKgotICAgICAqIFxwYXJhbSBvZmZzZXQgICAgICAgICAgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlIHBvcnRpb24gdG8gYmUgbWFwcGVkICh0aGlzIGRvZXMgbm90IGhhdmUgdG8KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBiZSBwYWdlIGFsaWduZWQpCi0gICAgICogXHBhcmFtIHNpemUgICAgICAgICAgICBzaXplIG9mIHRoZSBwb3J0aW9uIHRvIGJlIG1hcHBlZCAodGhpcyBkb2VzIG5vdCBoYXZlIHRvIGJlIHBhZ2UKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhbGlnbmVkKQotICAgICAqIFxwYXJhbSB1c2FnZSAgICAgICAgICAgdGhlIGRlc2lyZWQgdXNhZ2UuIFx0b2RvIHRoaXMgbXVzdCBiZSBrU29mdHdhcmVSZWFkIGFuZC9vcgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGtTb2Z0d2FyZVdyaXRlLgotICAgICAqIFxwYXJhbSBmZW5jZUZkICAgICAgICAgYSBwb2ludGVyIHRvIGEgZmlsZSBkZXNjcmlwdG9yIGlmIGFuIGFzeW5jIG1hcHBpbmcgaXMgcmVxdWVzdGVkLiBJZgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIG5vdC1udWxsLCBhbmQgYWNxdWlyZSBmZW5jZSBGRCB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIHN1Y2Nlc3MsIG9yIC0xCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgb24gZmFpbHVyZS4gSWYgbnVsbCwgdGhlIG1hcHBpbmcgd2lsbCBiZSBzeW5jaHJvbm91cy4KLSAgICAgKiBccGFyYW0gYWRkciAgICAgICAgICAgIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgc3RhcnRpbmcgYWRkcmVzcyBvZiB0aGUgbWFwcGVkIHBvcnRpb24gd2lsbCBiZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHN0b3JlZC4gT24gZmFpbHVyZSwgbnVsbHB0ciB3aWxsIGJlIHN0b3JlZCBoZXJlLgotICAgICAqCi0gICAgICogXHRvZG8gT25seSBvbmUgcG9ydGlvbiBjYW4gYmUgbWFwcGVkIGF0IHRoZSBzYW1lIHRpbWUgLSB0aGlzIGlzIHRydWUgZm9yIGdyYWxsb2MsIGJ1dCB0aGVyZQotICAgICAqICAgICAgIGlzIG5vIG5lZWQgZm9yIHRoaXMgZm9yIDFEIGJ1ZmZlcnMuCi0gICAgICogXHRvZG8gRG8gd2UgbmVlZCB0byBzdXBwb3J0IHN5bmMgb3BlcmF0aW9uIGFzIHdlIGNvdWxkIGp1c3Qgd2FpdCBmb3IgdGhlIGZlbmNlPwotICAgICAqCi0gICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bAotICAgICAqIFxyZXR2YWwgQzJfTk9fUEVSTUlTU0lPTiBubyBwZXJtaXNzaW9uIHRvIG1hcCB0aGUgcG9ydGlvbgotICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSBvcGVyYXRpb24gdGltZWQgb3V0Ci0gICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY29tcGxldGUgdGhlIG9wZXJhdGlvbgotICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIHRoZSBwYXJhbWV0ZXJzIChvZmZzZXQvc2l6ZSkgYXJlIGludmFsaWQgb3Igb3V0c2lkZSB0aGUgYWxsb2NhdGlvbiwgb3IKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0aGUgdXNhZ2UgZmxhZ3MgYXJlIGludmFsaWQgKGNhbGxlciBlcnJvcikKLSAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBvcGVyYXRpb24gZnJvbSBjb21wbGV0aW5nICh1bmV4cGVjdGVkKQotICAgICAqLwotICAgIHZpcnR1YWwgQzJFcnJvciBtYXAoCi0gICAgICAgICAgICBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgQzJNZW1vcnlVc2FnZSB1c2FnZSwgaW50ICpmZW5jZUZkIC8qIG51bGxhYmxlICovLAotICAgICAgICAgICAgdm9pZCAqKmFkZHIgLyogbm9ubnVsbCAqLykgPSAwOwotCi0gICAgLyoqCi0gICAgICogVW5tYXBzIGEgcG9ydGlvbiBvZiBhbiBhbGxvY2F0aW9uIGF0IHxhZGRyfCB3aXRoIHxzaXplfC4gVGhlc2UgbXVzdCBiZSBwYXJhbWV0ZXJzIHByZXZpb3VzbHkKLSAgICAgKiBwYXNzZWQgdG8gfG1hcHw7IG90aGVyd2lzZSwgdGhpcyBvcGVyYXRpb24gaXMgYSBuby1vcC4KLSAgICAgKgotICAgICAqIFxwYXJhbSBhZGRyICAgICAgICAgICAgc3RhcnRpbmcgYWRkcmVzcyBvZiB0aGUgbWFwcGVkIHJlZ2lvbgotICAgICAqIFxwYXJhbSBzaXplICAgICAgICAgICAgc2l6ZSBvZiB0aGUgbWFwcGVkIHJlZ2lvbgotICAgICAqIFxwYXJhbSBmZW5jZUZkICAgICAgICAgYSBwb2ludGVyIHRvIGEgZmlsZSBkZXNjcmlwdG9yIGlmIGFuIGFzeW5jIHVubWFwcGluZyBpcyByZXF1ZXN0ZWQuIElmCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgbm90LW51bGwsIGEgcmVsZWFzZSBmZW5jZSBGRCB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIHN1Y2Nlc3MsIG9yIC0xCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgb24gZmFpbHVyZS4gVGhpcyBmZW5jZSBzaWduYWxzIHdoZW4gdGhlIG9yaWdpbmFsIGFsbG9jYXRpb24gY29udGFpbnMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhbnkgY2hhbmdlcyB0aGF0IGhhcHBlbmVkIHRvIHRoZSBtYXBwZWQgcmVnaW9uLiBJZiBudWxsLCB0aGUgdW5tYXBwaW5nCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzeW5jaHJvbm91cy4KLSAgICAgKgotICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwKLSAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgb3BlcmF0aW9uIHRpbWVkIG91dAotICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIHRoZSBwYXJhbWV0ZXJzIChhZGRyL3NpemUpIGRvIG5vdCBjb3JyZXNwb25kIHRvIHByZXZpb3VzbHkgbWFwcGVkCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgcmVnaW9ucyAoY2FsbGVyIGVycm9yKQotICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIG9wZXJhdGlvbiBmcm9tIGNvbXBsZXRpbmcgKHVuZXhwZWN0ZWQpCi0gICAgICogXHJldHZhbCBDMl9OT19QRVJNSVNTSU9OIG5vIHBlcm1pc3Npb24gdG8gdW5tYXAgdGhlIHBvcnRpb24gKHVuZXhwZWN0ZWQgLSBzeXN0ZW0pCi0gICAgICovCi0gICAgdmlydHVhbCBDMkVycm9yIHVubWFwKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplLCBpbnQgKmZlbmNlRmQgLyogbnVsbGFibGUgKi8pID0gMDsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGEgdmFsaWQgYWxsb2NhdGlvbi4KLSAgICAgKgotICAgICAqIFx0b2RvIHJlbW92ZT8KLSAgICAgKi8KLSAgICB2aXJ0dWFsIGJvb2wgaXNWYWxpZCgpIGNvbnN0ID0gMDsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBhbGxvY2F0aW9uIGhhbmRsZS4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIGNvbnN0IEMySGFuZGxlICpoYW5kbGUoKSBjb25zdCA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBpcyB0aGUgc2FtZSBhbGxvY2F0aW9uIGFzIHxvdGhlcnwuCi0gICAgICovCi0gICAgdmlydHVhbCBib29sIGVxdWFscyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiAmb3RoZXIpIGNvbnN0ID0gMDsKLQotcHJvdGVjdGVkOgotICAgIC8vIFx0b2RvIHNob3VsZCB3ZSBsaW1pdCBhbGxvY2F0aW9uIGRpcmVjdGx5PwotICAgIEMyTGluZWFyQWxsb2NhdGlvbihzaXplX3QgY2FwYWNpdHkpIDogX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QoYzJfbWluKGNhcGFjaXR5LCBVSU5UMzJfTUFYKSkge30KLSAgICB2aXJ0dWFsIH5DMkxpbmVhckFsbG9jYXRpb24oKSA9IGRlZmF1bHQ7Ci19OwotCi0vKioKLSAqIFxpbmdyb3VwIGdyYXBoaWMgYWxsb2NhdG9yCi0gKiAyRCBhbGxvY2F0aW9uIGludGVyZmFjZS4KLSAqLwotY2xhc3MgQzJHcmFwaGljQWxsb2NhdGlvbiA6IHB1YmxpYyBfQzJQbGFuYXJDYXBhY2l0eUFzcGVjdCB7Ci1wdWJsaWM6Ci0gICAgLyoqCi0gICAgICogTWFwcyBhIHJlY3Rhbmd1bGFyIHNlY3Rpb24gKGFzIGRlZmluZWQgYnkgfHJlY3R8KSBvZiBhIDJEIGFsbG9jYXRpb24gaW50byBsb2NhbCBwcm9jZXNzCi0gICAgICogbWVtb3J5IGZvciBmbGV4aWJsZSBhY2Nlc3MuIE9uIHN1Y2Nlc3MsIGl0IGZpbGxzIG91dCB8bGF5b3V0fCB3aXRoIHRoZSBwbGFuZSBzcGVjaWZpY2F0aW9ucwotICAgICAqIGFuZCBmaWxscyB0aGUgfGFkZHJ8IGFycmF5IHdpdGggcG9pbnRlcnMgdG8gdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHRvcC1sZWZ0IHBpeGVsIG9mIGVhY2gKLSAgICAgKiBwbGFuZSB1c2VkLiBPdGhlcndpc2UsIGl0IGxlYXZlcyB8bGF5b3V0fCBhbmQgfGFkZHJ8IHVudG91Y2hlZC4gfGZlbmNlRmR8IGlzIGEgZmlsZQotICAgICAqIGRlc2NyaXB0b3IgcmVmZXJyaW5nIHRvIGFuIGFjcXVpcmUgc3luYyBmZW5jZSBvYmplY3QuIElmIGl0IGlzIGFscmVhZHkgc2FmZSB0byBhY2Nlc3MgdGhlCi0gICAgICogYnVmZmVyIGNvbnRlbnRzLCB0aGVuIC0xLgotICAgICAqCi0gICAgICogXG5vdGUgT25seSBvbmUgcG9ydGlvbiBvZiB0aGUgZ3JhcGhpYyBhbGxvY2F0aW9uIGNhbiBiZSBtYXBwZWQgYXQgdGhlIHNhbWUgdGltZS4gKFRoaXMgaXMKLSAgICAgKiBmcm9tIGdyYWxsb2MxIGxpbWl0YXRpb24uKQotICAgICAqCi0gICAgICogXHBhcmFtIHJlY3QgICAgICAgICAgICBzZWN0aW9uIHRvIGJlIG1hcHBlZCAodGhpcyBkb2VzIG5vdCBoYXZlIHRvIGJlIGFsaWduZWQpCi0gICAgICogXHBhcmFtIHVzYWdlICAgICAgICAgICB0aGUgZGVzaXJlZCB1c2FnZS4gXHRvZG8gdGhpcyBtdXN0IGJlIGtTb2Z0d2FyZVJlYWQgYW5kL29yCi0gICAgICogICAgICAgICAgICAgICAgICAgICAga1NvZnR3YXJlV3JpdGUuCi0gICAgICogXHBhcmFtIGZlbmNlRmQgICAgICAgICBhIHBvaW50ZXIgdG8gYSBmaWxlIGRlc2NyaXB0b3IgaWYgYW4gYXN5bmMgbWFwcGluZyBpcyByZXF1ZXN0ZWQuIElmCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgbm90LW51bGwsIGFuZCBhY3F1aXJlIGZlbmNlIEZEIHdpbGwgYmUgc3RvcmVkIGhlcmUgb24gc3VjY2Vzcywgb3IgLTEKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvbiBmYWlsdXJlLiBJZiBudWxsLCB0aGUgbWFwcGluZyB3aWxsIGJlIHN5bmNocm9ub3VzLgotICAgICAqIFxwYXJhbSBsYXlvdXQgICAgICAgICAgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBtYXBwZWQgcGxhbmVzJyBkZXNjcmlwdG9ycyB3aWxsIGJlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgc3RvcmVkLiBPbiBmYWlsdXJlLCBudWxscHRyIHdpbGwgYmUgc3RvcmVkIGhlcmUuCi0gICAgICoKLSAgICAgKiBcdG9kbyBEbyB3ZSBuZWVkIHRvIHN1cHBvcnQgc3luYyBvcGVyYXRpb24gYXMgd2UgY291bGQganVzdCB3YWl0IGZvciB0aGUgZmVuY2U/Ci0gICAgICoKLSAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsCi0gICAgICogXHJldHZhbCBDMl9OT19QRVJNSVNTSU9OIG5vIHBlcm1pc3Npb24gdG8gbWFwIHRoZSBzZWN0aW9uCi0gICAgICogXHJldHZhbCBDMl9BTFJFQURZX0VYSVNUUyB0aGVyZSBpcyBhbHJlYWR5IGEgbWFwcGVkIHJlZ2lvbiAoY2FsbGVyIGVycm9yKQotICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSBvcGVyYXRpb24gdGltZWQgb3V0Ci0gICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY29tcGxldGUgdGhlIG9wZXJhdGlvbgotICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIHRoZSBwYXJhbWV0ZXJzIChyZWN0KSBhcmUgaW52YWxpZCBvciBvdXRzaWRlIHRoZSBhbGxvY2F0aW9uLCBvciB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICB1c2FnZSBmbGFncyBhcmUgaW52YWxpZCAoY2FsbGVyIGVycm9yKQotICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIG9wZXJhdGlvbiBmcm9tIGNvbXBsZXRpbmcgKHVuZXhwZWN0ZWQpCi0KLSAgICAgKi8KLSAgICB2aXJ0dWFsIEMyRXJyb3IgbWFwKAotICAgICAgICAgICAgQzJSZWN0IHJlY3QsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIGludCAqZmVuY2VGZCwKLSAgICAgICAgICAgIC8vIFRPRE86IHJldHVybiA8YWRkciwgc2l6ZT4gYnVmZmVycyB3aXRoIHBsYW5lIHNpemVzCi0gICAgICAgICAgICBDMlBsYW5lTGF5b3V0ICpsYXlvdXQgLyogbm9ubnVsbCAqLywgdWludDhfdCAqKmFkZHIgLyogbm9ubnVsbCAqLykgPSAwOwotCi0gICAgLyoqCi0gICAgICogVW5tYXBzIHRoZSBsYXN0IG1hcHBlZCByZWN0YW5ndWxhciBzZWN0aW9uLgotICAgICAqCi0gICAgICogXHBhcmFtIGZlbmNlRmQgICAgICAgICBhIHBvaW50ZXIgdG8gYSBmaWxlIGRlc2NyaXB0b3IgaWYgYW4gYXN5bmMgdW5tYXBwaW5nIGlzIHJlcXVlc3RlZC4gSWYKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBub3QtbnVsbCwgYSByZWxlYXNlIGZlbmNlIEZEIHdpbGwgYmUgc3RvcmVkIGhlcmUgb24gc3VjY2Vzcywgb3IgLTEKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvbiBmYWlsdXJlLiBUaGlzIGZlbmNlIHNpZ25hbHMgd2hlbiB0aGUgb3JpZ2luYWwgYWxsb2NhdGlvbiBjb250YWlucwotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFueSBjaGFuZ2VzIHRoYXQgaGFwcGVuZWQgdG8gdGhlIG1hcHBlZCBzZWN0aW9uLiBJZiBudWxsLCB0aGUgdW5tYXBwaW5nCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzeW5jaHJvbm91cy4KLSAgICAgKgotICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwKLSAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgb3BlcmF0aW9uIHRpbWVkIG91dAotICAgICAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIHRoZXJlIGlzIG5vIG1hcHBlZCByZWdpb24gKGNhbGxlciBlcnJvcikKLSAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBvcGVyYXRpb24gZnJvbSBjb21wbGV0aW5nICh1bmV4cGVjdGVkKQotICAgICAqIFxyZXR2YWwgQzJfTk9fUEVSTUlTU0lPTiBubyBwZXJtaXNzaW9uIHRvIHVubWFwIHRoZSBzZWN0aW9uICh1bmV4cGVjdGVkIC0gc3lzdGVtKQotICAgICAqLwotICAgIHZpcnR1YWwgQzJFcnJvciB1bm1hcChDMkZlbmNlICpmZW5jZUZkIC8qIG51bGxhYmxlICovKSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhIHZhbGlkIGFsbG9jYXRpb24uCi0gICAgICoKLSAgICAgKiBcdG9kbyByZW1vdmU/Ci0gICAgICovCi0gICAgdmlydHVhbCBib29sIGlzVmFsaWQoKSBjb25zdCA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgYWxsb2NhdGlvbiBoYW5kbGUuCi0gICAgICovCi0gICAgdmlydHVhbCBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKCkgY29uc3QgPSAwOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgdGhlIHNhbWUgYWxsb2NhdGlvbiBhcyB8b3RoZXJ8LgotICAgICAqLwotICAgIHZpcnR1YWwgYm9vbCBlcXVhbHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyR3JhcGhpY0FsbG9jYXRpb24+ICZvdGhlcikgPSAwOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+QzJHcmFwaGljQWxsb2NhdGlvbigpOwotfTsKLQotLyoqCi0gKiAgQWxsb2NhdG9ycyBhcmUgdXNlZCBieSB0aGUgZnJhbWV3b3JrIHRvIGFsbG9jYXRlIG1lbW9yeSAoYWxsb2NhdGlvbnMpIGZvciBidWZmZXJzLiBUaGV5IGNhbgotICogIHN1cHBvcnQgZWl0aGVyIDFEIG9yIDJEIGFsbG9jYXRpb25zLgotICoKLSAqICBcbm90ZSBJbiB0aGVvcnkgdGhleSBjb3VsZCBzdXBwb3J0IGJvdGgsIGJ1dCBpbiBwcmFjdGljZSwgd2Ugd2lsbCB1c2Ugb25seSBvbmUgb3IgdGhlIG90aGVyLgotICoKLSAqICBOZXZlciBjb25zdHJ1Y3RlZCBvbiBzdGFjay4KLSAqCi0gKiAgQWxsb2NhdG9ycyBhcmUgcHJvdmlkZWQgYnkgdmVuZG9ycy4KLSAqLwotY2xhc3MgQzJBbGxvY2F0b3IgewotcHVibGljOgotICAgIC8qKgotICAgICAqIEFsbG9jYXRlcyBhIDFEIGFsbG9jYXRpb24gb2YgZ2l2ZW4gfGNhcGFjaXR5fCBhbmQgfHVzYWdlfC4gSWYgc3VjY2Vzc2Z1bCwgdGhlIGFsbG9jYXRpb24gaXMKLSAgICAgKiBzdG9yZWQgaW4gfGFsbG9jYXRpb258LiBPdGhlcndpc2UsIHxhbGxvY2F0aW9ufCBpcyBzZXQgdG8gJ251bGxwdHInLgotICAgICAqCi0gICAgICogXHBhcmFtIGNhcGFjaXR5ICAgICAgICB0aGUgc2l6ZSBvZiByZXF1ZXN0ZWQgYWxsb2NhdGlvbiAodGhlIGFsbG9jYXRpb24gY291bGQgYmUgc2xpZ2h0bHkKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBsYXJnZXIsIGUuZy4gdG8gYWNjb3VudCBmb3IgYW55IHN5c3RlbS1yZXF1aXJlZCBhbGlnbm1lbnQpCi0gICAgICogXHBhcmFtIHVzYWdlICAgICAgICAgICB0aGUgbWVtb3J5IHVzYWdlIGluZm8gZm9yIHRoZSByZXF1ZXN0ZWQgYWxsb2NhdGlvbi4gXG5vdGUgdGhhdCB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZCBhbGxvY2F0aW9uIG1heSBiZSBsYXRlciB1c2VkL21hcHBlZCB3aXRoIGRpZmZlcmVudCB1c2FnZS4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgYWxsb2NhdG9yIHNob3VsZCBsYXlvdXQgdGhlIGJ1ZmZlciB0byBiZSBvcHRpbWl6ZWQgZm9yIHRoaXMgdXNhZ2UsCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgYnV0IG11c3Qgc3VwcG9ydCBhbnkgdXNhZ2UuIE9uZSBleGNlcHRpb246IHByb3RlY3RlZCBidWZmZXJzIGNhbgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIG9ubHkgYmUgdXNlZCBpbiBhIHByb3RlY3RlZCBzY2VuYXJpby4KLSAgICAgKiBccGFyYW0gYWxsb2NhdGlvbiAgICAgIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGFsbG9jYXRpb24gc2hhbGwgYmUgc3RvcmVkIG9uIHN1Y2Nlc3MuIG51bGxwdHIKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIGZhaWx1cmUKLSAgICAgKgotICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBhbGxvY2F0aW9uIHdhcyBzdWNjZXNzZnVsCi0gICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY29tcGxldGUgdGhlIGFsbG9jYXRpb24KLSAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgYWxsb2NhdGlvbiB0aW1lZCBvdXQKLSAgICAgKiBccmV0dmFsIEMyX05PX1BFUk1JU1NJT04gICAgIG5vIHBlcm1pc3Npb24gdG8gY29tcGxldGUgdGhlIGFsbG9jYXRpb24KLSAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBjYXBhY2l0eSBvciB1c2FnZSBhcmUgbm90IHN1cHBvcnRlZCAoaW52YWxpZCkgKGNhbGxlciBlcnJvcikKLSAgICAgKiBccmV0dmFsIEMyX1VOU1VQUE9SVEVEICAgICAgIHRoaXMgYWxsb2NhdG9yIGRvZXMgbm90IHN1cHBvcnQgMUQgYWxsb2NhdGlvbnMKLSAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24sIHVucmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJlZCBkdXJpbmcgYWxsb2NhdGlvbiAodW5leHBlY3RlZCkKLSAgICAgKi8KLSAgICB2aXJ0dWFsIEMyRXJyb3IgYWxsb2NhdGVMaW5lYXJCdWZmZXIoCi0gICAgICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSBfX3VudXNlZCwgQzJNZW1vcnlVc2FnZSB1c2FnZSBfX3VudXNlZCwKLSAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+ICphbGxvY2F0aW9uIC8qIG5vbm51bGwgKi8pIHsKLSAgICAgICAgKmFsbG9jYXRpb24gPSBudWxscHRyOwotICAgICAgICByZXR1cm4gQzJfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogKFJlKWNyZWF0ZXMgYSAxRCBhbGxvY2F0aW9uIGZyb20gYSBuYXRpdmUgfGhhbmRsZXwuIElmIHN1Y2Nlc3NmdWwsIHRoZSBhbGxvY2F0aW9uIGlzIHN0b3JlZAotICAgICAqIGluIHxhbGxvY2F0aW9ufC4gT3RoZXJ3aXNlLCB8YWxsb2NhdGlvbnwgaXMgc2V0IHRvICdudWxscHRyJy4KLSAgICAgKgotICAgICAqIFxwYXJhbSBoYW5kbGUgICAgICB0aGUgaGFuZGxlIGZvciB0aGUgZXhpc3RpbmcgYWxsb2NhdGlvbgotICAgICAqIFxwYXJhbSBhbGxvY2F0aW9uICBwb2ludGVyIHRvIHdoZXJlIHRoZSBhbGxvY2F0aW9uIHNoYWxsIGJlIHN0b3JlZCBvbiBzdWNjZXNzLiBudWxscHRyCi0gICAgICogICAgICAgICAgICAgICAgICB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIGZhaWx1cmUKLSAgICAgKgotICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBhbGxvY2F0aW9uIHdhcyByZWNyZWF0ZWQgc3VjY2Vzc2Z1bGx5Ci0gICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gcmVjcmVhdGUgdGhlIGFsbG9jYXRpb24KLSAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgcmVjcmVhdGlvbiB0aW1lZCBvdXQgKHVuZXhwZWN0ZWQpCi0gICAgICogXHJldHZhbCBDMl9OT19QRVJNSVNTSU9OICAgICBubyBwZXJtaXNzaW9uIHRvIHJlY3JlYXRlIHRoZSBhbGxvY2F0aW9uCi0gICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgaW52YWxpZCBoYW5kbGUgKGNhbGxlciBlcnJvcikKLSAgICAgKiBccmV0dmFsIEMyX1VOU1VQUE9SVEVEICAgICAgIHRoaXMgYWxsb2NhdG9yIGRvZXMgbm90IHN1cHBvcnQgMUQgYWxsb2NhdGlvbnMKLSAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24sIHVucmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJlZCBkdXJpbmcgYWxsb2NhdGlvbiAodW5leHBlY3RlZCkKLSAgICAgKi8KLSAgICB2aXJ0dWFsIEMyRXJyb3IgcmVjcmVhdGVMaW5lYXJCdWZmZXIoCi0gICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlIF9fdW51c2VkLAotICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24gLyogbm9ubnVsbCAqLykgewotICAgICAgICAqYWxsb2NhdGlvbiA9IG51bGxwdHI7Ci0gICAgICAgIHJldHVybiBDMl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbGxvY2F0ZXMgYSAyRCBhbGxvY2F0aW9uIG9mIGdpdmVuIHx3aWR0aHwsIHxoZWlnaHR8LCB8Zm9ybWF0fCBhbmQgfHVzYWdlfC4gSWYgc3VjY2Vzc2Z1bCwKLSAgICAgKiB0aGUgYWxsb2NhdGlvbiBpcyBzdG9yZWQgaW4gfGFsbG9jYXRpb258LiBPdGhlcndpc2UsIHxhbGxvY2F0aW9ufCBpcyBzZXQgdG8gJ251bGxwdHInLgotICAgICAqCi0gICAgICogXHBhcmFtIHdpZHRoICAgICAgICAgICB0aGUgd2lkdGggb2YgcmVxdWVzdGVkIGFsbG9jYXRpb24gKHRoZSBhbGxvY2F0aW9uIGNvdWxkIGJlIHNsaWdodGx5Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgbGFyZ2VyLCBlLmcuIHRvIGFjY291bnQgZm9yIGFueSBzeXN0ZW0tcmVxdWlyZWQgYWxpZ25tZW50KQotICAgICAqIFxwYXJhbSBoZWlnaHQgICAgICAgICAgdGhlIGhlaWdodCBvZiByZXF1ZXN0ZWQgYWxsb2NhdGlvbiAodGhlIGFsbG9jYXRpb24gY291bGQgYmUgc2xpZ2h0bHkKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBsYXJnZXIsIGUuZy4gdG8gYWNjb3VudCBmb3IgYW55IHN5c3RlbS1yZXF1aXJlZCBhbGlnbm1lbnQpCi0gICAgICogXHBhcmFtIGZvcm1hdCAgICAgICAgICB0aGUgcGl4ZWwgZm9ybWF0IG9mIHJlcXVlc3RlZCBhbGxvY2F0aW9uLiBUaGlzIGNvdWxkIGJlIGEgdmVuZG9yCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWMgZm9ybWF0LgotICAgICAqIFxwYXJhbSB1c2FnZSAgICAgICAgICAgdGhlIG1lbW9yeSB1c2FnZSBpbmZvIGZvciB0aGUgcmVxdWVzdGVkIGFsbG9jYXRpb24uIFxub3RlIHRoYXQgdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQgYWxsb2NhdGlvbiBtYXkgYmUgbGF0ZXIgdXNlZC9tYXBwZWQgd2l0aCBkaWZmZXJlbnQgdXNhZ2UuCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgVGhlIGFsbG9jYXRvciBzaG91bGQgbGF5b3V0IHRoZSBidWZmZXIgdG8gYmUgb3B0aW1pemVkIGZvciB0aGlzIHVzYWdlLAotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGJ1dCBtdXN0IHN1cHBvcnQgYW55IHVzYWdlLiBPbmUgZXhjZXB0aW9uOiBwcm90ZWN0ZWQgYnVmZmVycyBjYW4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvbmx5IGJlIHVzZWQgaW4gYSBwcm90ZWN0ZWQgc2NlbmFyaW8uCi0gICAgICogXHBhcmFtIGFsbG9jYXRpb24gICAgICBwb2ludGVyIHRvIHdoZXJlIHRoZSBhbGxvY2F0aW9uIHNoYWxsIGJlIHN0b3JlZCBvbiBzdWNjZXNzLiBudWxscHRyCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzdG9yZWQgaGVyZSBvbiBmYWlsdXJlCi0gICAgICoKLSAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgYWxsb2NhdGlvbiB3YXMgc3VjY2Vzc2Z1bAotICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIHRoZSBhbGxvY2F0aW9uCi0gICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIGFsbG9jYXRpb24gdGltZWQgb3V0Ci0gICAgICogXHJldHZhbCBDMl9OT19QRVJNSVNTSU9OICAgICBubyBwZXJtaXNzaW9uIHRvIGNvbXBsZXRlIHRoZSBhbGxvY2F0aW9uCi0gICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgd2lkdGgsIGhlaWdodCwgZm9ybWF0IG9yIHVzYWdlIGFyZSBub3Qgc3VwcG9ydGVkIChpbnZhbGlkKSAoY2FsbGVyIGVycm9yKQotICAgICAqIFxyZXR2YWwgQzJfVU5TVVBQT1JURUQgICAgICAgdGhpcyBhbGxvY2F0b3IgZG9lcyBub3Qgc3VwcG9ydCAyRCBhbGxvY2F0aW9ucwotICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biwgdW5yZWNvdmVyYWJsZSBlcnJvciBvY2N1cmVkIGR1cmluZyBhbGxvY2F0aW9uICh1bmV4cGVjdGVkKQotICAgICAqLwotICAgIHZpcnR1YWwgQzJFcnJvciBhbGxvY2F0ZUdyYXBoaWNCdWZmZXIoCi0gICAgICAgICAgICB1aW50MzJfdCB3aWR0aCBfX3VudXNlZCwgdWludDMyX3QgaGVpZ2h0IF9fdW51c2VkLCB1aW50MzJfdCBmb3JtYXQgX191bnVzZWQsCi0gICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlIF9fdW51c2VkLAotICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICphbGxvY2F0aW9uIC8qIG5vbm51bGwgKi8pIHsKLSAgICAgICAgKmFsbG9jYXRpb24gPSBudWxscHRyOwotICAgICAgICByZXR1cm4gQzJfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogKFJlKWNyZWF0ZXMgYSAyRCBhbGxvY2F0aW9uIGZyb20gYSBuYXRpdmUgaGFuZGxlLiAgSWYgc3VjY2Vzc2Z1bCwgdGhlIGFsbG9jYXRpb24gaXMgc3RvcmVkCi0gICAgICogaW4gfGFsbG9jYXRpb258LiBPdGhlcndpc2UsIHxhbGxvY2F0aW9ufCBpcyBzZXQgdG8gJ251bGxwdHInLgotICAgICAqCi0gICAgICogXHBhcmFtIGhhbmRsZSAgICAgIHRoZSBoYW5kbGUgZm9yIHRoZSBleGlzdGluZyBhbGxvY2F0aW9uCi0gICAgICogXHBhcmFtIGFsbG9jYXRpb24gIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGFsbG9jYXRpb24gc2hhbGwgYmUgc3RvcmVkIG9uIHN1Y2Nlc3MuIG51bGxwdHIKLSAgICAgKiAgICAgICAgICAgICAgICAgIHdpbGwgYmUgc3RvcmVkIGhlcmUgb24gZmFpbHVyZQotICAgICAqCi0gICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGFsbG9jYXRpb24gd2FzIHJlY3JlYXRlZCBzdWNjZXNzZnVsbHkKLSAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byByZWNyZWF0ZSB0aGUgYWxsb2NhdGlvbgotICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSByZWNyZWF0aW9uIHRpbWVkIG91dCAodW5leHBlY3RlZCkKLSAgICAgKiBccmV0dmFsIEMyX05PX1BFUk1JU1NJT04gICAgIG5vIHBlcm1pc3Npb24gdG8gcmVjcmVhdGUgdGhlIGFsbG9jYXRpb24KLSAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBpbnZhbGlkIGhhbmRsZSAoY2FsbGVyIGVycm9yKQotICAgICAqIFxyZXR2YWwgQzJfVU5TVVBQT1JURUQgICAgICAgdGhpcyBhbGxvY2F0b3IgZG9lcyBub3Qgc3VwcG9ydCAyRCBhbGxvY2F0aW9ucwotICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biwgdW5yZWNvdmVyYWJsZSBlcnJvciBvY2N1cmVkIGR1cmluZyByZWNyZWF0aW9uICh1bmV4cGVjdGVkKQotICAgICAqLwotICAgIHZpcnR1YWwgQzJFcnJvciByZWNyZWF0ZUdyYXBoaWNCdWZmZXIoCi0gICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlIF9fdW51c2VkLAotICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICphbGxvY2F0aW9uIC8qIG5vbm51bGwgKi8pIHsKLSAgICAgICAgKmFsbG9jYXRpb24gPSBudWxscHRyOwotICAgICAgICByZXR1cm4gQzJfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgQzJBbGxvY2F0b3IoKSA9IGRlZmF1bHQ7Ci0KLSAgICB2aXJ0dWFsIH5DMkFsbG9jYXRvcigpID0gZGVmYXVsdDsKLX07Ci0KLS8qKgotICogIEJsb2NrIGFsbG9jYXRvcnMgYXJlIHVzZWQgYnkgY29tcG9uZW50cyB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIG91dHB1dCBidWZmZXJzLiBUaGV5IGNhbgotICogIHN1cHBvcnQgZWl0aGVyIGxpbmVhciAoMUQpLCBjaXJjdWxhciAoMUQpIG9yIGdyYXBoaWMgKDJEKSBhbGxvY2F0aW9ucy4KLSAqCi0gKiAgTmV2ZXIgY29uc3RydWN0ZWQgb24gc3RhY2suCi0gKgotICogIEJsb2NrIGFsbG9jYXRvcnMgYXJlIHByb3ZpZGVkIGJ5IHRoZSBmcmFtZXdvcmsuCi0gKi8KLWNsYXNzIEMyQmxvY2tBbGxvY2F0b3IgewotcHVibGljOgotICAgIC8qKgotICAgICAqIEFsbG9jYXRlcyBhIGxpbmVhciB3cml0ZWFibGUgYmxvY2sgb2YgZ2l2ZW4gfGNhcGFjaXR5fCBhbmQgfHVzYWdlfC4gSWYgc3VjY2Vzc2Z1bCwgdGhlCi0gICAgICogYmxvY2sgaXMgc3RvcmVkIGluIHxibG9ja3wuIE90aGVyd2lzZSwgfGJsb2NrfCBpcyBzZXQgdG8gJ251bGxwdHInLgotICAgICAqCi0gICAgICogXHBhcmFtIGNhcGFjaXR5ICAgICAgICB0aGUgc2l6ZSBvZiByZXF1ZXN0ZWQgYmxvY2suCi0gICAgICogXHBhcmFtIHVzYWdlICAgICAgICAgICB0aGUgbWVtb3J5IHVzYWdlIGluZm8gZm9yIHRoZSByZXF1ZXN0ZWQgYWxsb2NhdGlvbi4gXG5vdGUgdGhhdCB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZCBhbGxvY2F0aW9uIG1heSBiZSBsYXRlciB1c2VkL21hcHBlZCB3aXRoIGRpZmZlcmVudCB1c2FnZS4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgYWxsb2NhdG9yIHNoYWxsIGxheSBvdXQgdGhlIGJ1ZmZlciB0byBiZSBvcHRpbWl6ZWQgZm9yIHRoaXMgdXNhZ2UsCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgYnV0IG11c3Qgc3VwcG9ydCBhbnkgdXNhZ2UuIE9uZSBleGNlcHRpb246IHByb3RlY3RlZCBidWZmZXJzIGNhbgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIG9ubHkgYmUgdXNlZCBpbiBhIHByb3RlY3RlZCBzY2VuYXJpby4KLSAgICAgKiBccGFyYW0gYmxvY2sgICAgICBwb2ludGVyIHRvIHdoZXJlIHRoZSBhbGxvY2F0ZWQgYmxvY2sgc2hhbGwgYmUgc3RvcmVkIG9uIHN1Y2Nlc3MuIG51bGxwdHIKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIGZhaWx1cmUKLSAgICAgKgotICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBhbGxvY2F0aW9uIHdhcyBzdWNjZXNzZnVsCi0gICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY29tcGxldGUgdGhlIGFsbG9jYXRpb24KLSAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgYWxsb2NhdGlvbiB0aW1lZCBvdXQKLSAgICAgKiBccmV0dmFsIEMyX05PX1BFUk1JU1NJT04gICAgIG5vIHBlcm1pc3Npb24gdG8gY29tcGxldGUgdGhlIGFsbG9jYXRpb24KLSAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBjYXBhY2l0eSBvciB1c2FnZSBhcmUgbm90IHN1cHBvcnRlZCAoaW52YWxpZCkgKGNhbGxlciBlcnJvcikKLSAgICAgKiBccmV0dmFsIEMyX1VOU1VQUE9SVEVEICAgICAgIHRoaXMgYWxsb2NhdG9yIGRvZXMgbm90IHN1cHBvcnQgbGluZWFyIGFsbG9jYXRpb25zCi0gICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duLCB1bnJlY292ZXJhYmxlIGVycm9yIG9jY3VyZWQgZHVyaW5nIGFsbG9jYXRpb24gKHVuZXhwZWN0ZWQpCi0gICAgICovCi0gICAgdmlydHVhbCBDMkVycm9yIGFsbG9jYXRlTGluZWFyQmxvY2soCi0gICAgICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSBfX3VudXNlZCwgQzJNZW1vcnlVc2FnZSB1c2FnZSBfX3VudXNlZCwKLSAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAqYmxvY2sgLyogbm9ubnVsbCAqLykgewotICAgICAgICAqYmxvY2sgPSBudWxscHRyOwotICAgICAgICByZXR1cm4gQzJfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWxsb2NhdGVzIGEgY2lyY3VsYXIgd3JpdGVhYmxlIGJsb2NrIG9mIGdpdmVuIHxjYXBhY2l0eXwgYW5kIHx1c2FnZXwuIElmIHN1Y2Nlc3NmdWwsIHRoZQotICAgICAqIGJsb2NrIGlzIHN0b3JlZCBpbiB8YmxvY2t8LiBPdGhlcndpc2UsIHxibG9ja3wgaXMgc2V0IHRvICdudWxscHRyJy4KLSAgICAgKgotICAgICAqIFxwYXJhbSBjYXBhY2l0eSAgICAgICAgdGhlIHNpemUgb2YgcmVxdWVzdGVkIGNpcmN1bGFyIGJsb2NrLiAodGhlIGFsbG9jYXRpb24gY291bGQgYmUgc2xpZ2h0bHkKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBsYXJnZXIsIGUuZy4gdG8gYWNjb3VudCBmb3IgYW55IHN5c3RlbS1yZXF1aXJlZCBhbGlnbm1lbnQpCi0gICAgICogXHBhcmFtIHVzYWdlICAgICAgICAgICB0aGUgbWVtb3J5IHVzYWdlIGluZm8gZm9yIHRoZSByZXF1ZXN0ZWQgYWxsb2NhdGlvbi4gXG5vdGUgdGhhdCB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZCBhbGxvY2F0aW9uIG1heSBiZSBsYXRlciB1c2VkL21hcHBlZCB3aXRoIGRpZmZlcmVudCB1c2FnZS4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgYWxsb2NhdG9yIHNoYWxsIGxheSBvdXQgdGhlIGJ1ZmZlciB0byBiZSBvcHRpbWl6ZWQgZm9yIHRoaXMgdXNhZ2UsCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgYnV0IG11c3Qgc3VwcG9ydCBhbnkgdXNhZ2UuIE9uZSBleGNlcHRpb246IHByb3RlY3RlZCBidWZmZXJzIGNhbgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIG9ubHkgYmUgdXNlZCBpbiBhIHByb3RlY3RlZCBzY2VuYXJpby4KLSAgICAgKiBccGFyYW0gYmxvY2sgICAgICBwb2ludGVyIHRvIHdoZXJlIHRoZSBhbGxvY2F0ZWQgYmxvY2sgc2hhbGwgYmUgc3RvcmVkIG9uIHN1Y2Nlc3MuIG51bGxwdHIKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIGZhaWx1cmUKLSAgICAgKgotICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgICAgICB0aGUgYWxsb2NhdGlvbiB3YXMgc3VjY2Vzc2Z1bAotICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZICAgICBub3QgZW5vdWdoIG1lbW9yeSB0byBjb21wbGV0ZSB0aGUgYWxsb2NhdGlvbgotICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUICAgICB0aGUgYWxsb2NhdGlvbiB0aW1lZCBvdXQKLSAgICAgKiBccmV0dmFsIEMyX05PX1BFUk1JU1NJT04gICAgIG5vIHBlcm1pc3Npb24gdG8gY29tcGxldGUgdGhlIGFsbG9jYXRpb24KLSAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSAgICAgY2FwYWNpdHkgb3IgdXNhZ2UgYXJlIG5vdCBzdXBwb3J0ZWQgKGludmFsaWQpIChjYWxsZXIgZXJyb3IpCi0gICAgICogXHJldHZhbCBDMl9VTlNVUFBPUlRFRCAgIHRoaXMgYWxsb2NhdG9yIGRvZXMgbm90IHN1cHBvcnQgY2lyY3VsYXIgYWxsb2NhdGlvbnMKLSAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCAgICAgc29tZSB1bmtub3duLCB1bnJlY292ZXJhYmxlIGVycm9yIG9jY3VyZWQgZHVyaW5nIGFsbG9jYXRpb24gKHVuZXhwZWN0ZWQpCi0gICAgICovCi0gICAgdmlydHVhbCBDMkVycm9yIGFsbG9jYXRlQ2lyY3VsYXJCbG9jaygKLSAgICAgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5IF9fdW51c2VkLCBDMk1lbW9yeVVzYWdlIHVzYWdlIF9fdW51c2VkLAotICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ2lyY3VsYXJCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIHsKLSAgICAgICAgKmJsb2NrID0gbnVsbHB0cjsKLSAgICAgICAgcmV0dXJuIEMyX1VOU1VQUE9SVEVEOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFsbG9jYXRlcyBhIDJEIGdyYXBoaWMgYmxvY2sgb2YgZ2l2ZW4gfHdpZHRofCwgfGhlaWdodHwsIHxmb3JtYXR8IGFuZCB8dXNhZ2V8LiBJZiBzdWNjZXNzZnVsLAotICAgICAqIHRoZSBhbGxvY2F0aW9uIGlzIHN0b3JlZCBpbiB8YmxvY2t8LiBPdGhlcndpc2UsIHxibG9ja3wgaXMgc2V0IHRvICdudWxscHRyJy4KLSAgICAgKgotICAgICAqIFxwYXJhbSB3aWR0aCAgICAgICAgICAgdGhlIHdpZHRoIG9mIHJlcXVlc3RlZCBhbGxvY2F0aW9uICh0aGUgYWxsb2NhdGlvbiBjb3VsZCBiZSBzbGlnaHRseQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGxhcmdlciwgZS5nLiB0byBhY2NvdW50IGZvciBhbnkgc3lzdGVtLXJlcXVpcmVkIGFsaWdubWVudCkKLSAgICAgKiBccGFyYW0gaGVpZ2h0ICAgICAgICAgIHRoZSBoZWlnaHQgb2YgcmVxdWVzdGVkIGFsbG9jYXRpb24gKHRoZSBhbGxvY2F0aW9uIGNvdWxkIGJlIHNsaWdodGx5Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgbGFyZ2VyLCBlLmcuIHRvIGFjY291bnQgZm9yIGFueSBzeXN0ZW0tcmVxdWlyZWQgYWxpZ25tZW50KQotICAgICAqIFxwYXJhbSBmb3JtYXQgICAgICAgICAgdGhlIHBpeGVsIGZvcm1hdCBvZiByZXF1ZXN0ZWQgYWxsb2NhdGlvbi4gVGhpcyBjb3VsZCBiZSBhIHZlbmRvcgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmljIGZvcm1hdC4KLSAgICAgKiBccGFyYW0gdXNhZ2UgICAgICAgICAgIHRoZSBtZW1vcnkgdXNhZ2UgaW5mbyBmb3IgdGhlIHJlcXVlc3RlZCBhbGxvY2F0aW9uLiBcbm90ZSB0aGF0IHRoZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHJldHVybmVkIGFsbG9jYXRpb24gbWF5IGJlIGxhdGVyIHVzZWQvbWFwcGVkIHdpdGggZGlmZmVyZW50IHVzYWdlLgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBhbGxvY2F0b3Igc2hvdWxkIGxheW91dCB0aGUgYnVmZmVyIHRvIGJlIG9wdGltaXplZCBmb3IgdGhpcyB1c2FnZSwKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBidXQgbXVzdCBzdXBwb3J0IGFueSB1c2FnZS4gT25lIGV4Y2VwdGlvbjogcHJvdGVjdGVkIGJ1ZmZlcnMgY2FuCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgb25seSBiZSB1c2VkIGluIGEgcHJvdGVjdGVkIHNjZW5hcmlvLgotICAgICAqIFxwYXJhbSBibG9jayAgICAgIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGFsbG9jYXRpb24gc2hhbGwgYmUgc3RvcmVkIG9uIHN1Y2Nlc3MuIG51bGxwdHIKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIGZhaWx1cmUKLSAgICAgKgotICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgICAgICB0aGUgYWxsb2NhdGlvbiB3YXMgc3VjY2Vzc2Z1bAotICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZICAgICBub3QgZW5vdWdoIG1lbW9yeSB0byBjb21wbGV0ZSB0aGUgYWxsb2NhdGlvbgotICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUICAgICB0aGUgYWxsb2NhdGlvbiB0aW1lZCBvdXQKLSAgICAgKiBccmV0dmFsIEMyX05PX1BFUk1JU1NJT04gICAgIG5vIHBlcm1pc3Npb24gdG8gY29tcGxldGUgdGhlIGFsbG9jYXRpb24KLSAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSAgICAgd2lkdGgsIGhlaWdodCwgZm9ybWF0IG9yIHVzYWdlIGFyZSBub3Qgc3VwcG9ydGVkIChpbnZhbGlkKSAoY2FsbGVyIGVycm9yKQotICAgICAqIFxyZXR2YWwgQzJfVU5TVVBQT1JURUQgICB0aGlzIGFsbG9jYXRvciBkb2VzIG5vdCBzdXBwb3J0IDJEIGFsbG9jYXRpb25zCi0gICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgICAgIHNvbWUgdW5rbm93biwgdW5yZWNvdmVyYWJsZSBlcnJvciBvY2N1cmVkIGR1cmluZyBhbGxvY2F0aW9uICh1bmV4cGVjdGVkKQotICAgICAqLwotICAgIHZpcnR1YWwgQzJFcnJvciBhbGxvY2F0ZUdyYXBoaWNCbG9jaygKLSAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoIF9fdW51c2VkLCB1aW50MzJfdCBoZWlnaHQgX191bnVzZWQsIHVpbnQzMl90IGZvcm1hdCBfX3VudXNlZCwKLSAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgX191bnVzZWQsCi0gICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSB7Ci0gICAgICAgICpibG9jayA9IG51bGxwdHI7Ci0gICAgICAgIHJldHVybiBDMl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLXByb3RlY3RlZDoKLSAgICBDMkJsb2NrQWxsb2NhdG9yKCkgPSBkZWZhdWx0OwotCi0gICAgdmlydHVhbCB+QzJCbG9ja0FsbG9jYXRvcigpID0gZGVmYXVsdDsKLX07Ci0KLS8vLyBAfQotCi0vLy8gXGNvbmQgSU5URVJOQUwKLQotLy8vIFx0b2RvIFRoZXNlIGFyZSBubyBsb25nZXIgdXNlZAotCi0vLy8gXGFkZHRvZ3JvdXAgbGluZWFyCi0vLy8gQHsKLQotLyoqIFxkZXByZWNhdGVkICovCi1jbGFzcyBDMkxpbmVhckJ1ZmZlcgotICAgIDogcHVibGljIEMyQnVmZmVyLCBwdWJsaWMgX0MyTGluZWFyUmFuZ2VBc3BlY3QsCi0gICAgICBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxDMkxpbmVhckJ1ZmZlcj4gewotcHVibGljOgotICAgIC8qKiBcdG9kbyB3aGF0IGlzIHRoaXM/ICovCi0gICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSgpIGNvbnN0OwotCi1wcm90ZWN0ZWQ6Ci0gICAgaW5saW5lIEMyTGluZWFyQnVmZmVyKGNvbnN0IEMyQ29uc3RMaW5lYXJCbG9jayAmYmxvY2spOwotCi1wcml2YXRlOgotICAgIGNsYXNzIEltcGw7Ci0gICAgSW1wbCAqbUltcGw7Ci19OwotCi1jbGFzcyBDMlJlYWRDdXJzb3I7Ci0KLWNsYXNzIEMyV3JpdGVDdXJzb3IgewotcHVibGljOgotICAgIHVpbnQzMl90IHJlbWFpbmluZygpIGNvbnN0OyAvLyByZW1haW5pbmcgZGF0YSB0byBiZSByZWFkCi0gICAgdm9pZCBjb21taXQoKTsgLy8gY29tbWl0cyB0aGUgY3VycmVudCBwb3NpdGlvbi4gZGlzY2FyZCBkYXRhIGJlZm9yZSBjdXJyZW50IHBvc2l0aW9uCi0gICAgdm9pZCByZXNldCgpIGNvbnN0OyAgLy8gcmVzZXRzIHBvc2l0aW9uIHRvIHRoZSBsYXN0IGNvbW1pdHRlZCBwb3NpdGlvbgotICAgIC8vIHNsaWNlcyBvZmYgYXQgbW9zdCB8c2l6ZXwgYnl0ZXMsIGFuZCBtb3ZlcyBjdXJzb3IgYWhlYWQgYnkgdGhlIG51bWJlciBvZiBieXRlcwotICAgIC8vIHNsaWNlZCBvZmYuCi0gICAgQzJSZWFkQ3Vyc29yIHNsaWNlKHVpbnQzMl90IHNpemUpIGNvbnN0OwotICAgIC8vIHNsaWNlcyBvZmYgYXQgbW9zdCB8c2l6ZXwgYnl0ZXMsIGFuZCBtb3ZlcyBjdXJzb3IgYWhlYWQgYnkgdGhlIG51bWJlciBvZiBieXRlcwotICAgIC8vIHNsaWNlZCBvZmYuCi0gICAgQzJXcml0ZUN1cnNvciByZXNlcnZlKHVpbnQzMl90IHNpemUpOwotICAgIC8vIGJvb2wgcmVhZChUJik7Ci0gICAgLy8gYm9vbCB3cml0ZShUJik7Ci0gICAgQzJGZW5jZSB3YWl0Rm9yU3BhY2UodWludDMyX3Qgc2l6ZSk7Ci19OwotCi0vLy8gQH0KLQotLy8vIFxhZGR0b2dyb3VwIGdyYXBoaWMKLS8vLyBAewotCi1zdHJ1Y3QgQzJDb2xvclNwYWNlIHsKLS8vcHVibGljOgotICAgIGVudW0gU3RhbmRhcmQgewotICAgICAgICBCVDYwMSwKLSAgICAgICAgQlQ3MDksCi0gICAgICAgIEJUMjAyMCwKLSAgICAgICAgLy8gVE9ETwotICAgIH07Ci0KLSAgICBlbnVtIFJhbmdlIHsKLSAgICAgICAgTElNSVRFRCwKLSAgICAgICAgRlVMTCwKLSAgICAgICAgLy8gVE9ETwotICAgIH07Ci0KLSAgICBlbnVtIFRyYW5zZmVyRnVuY3Rpb24gewotICAgICAgICBCVDcwOVRyYW5zZmVyLAotICAgICAgICBCVDIwMjBUcmFuc2ZlciwKLSAgICAgICAgSHlicmlkTG9nR2FtbWEyLAotICAgICAgICBIeWJyaWRMb2dHYW1tYTQsCi0gICAgICAgIC8vIFRPRE8KLSAgICB9OwotfTsKLQotLyoqIFxkZXByZWNhdGVkICovCi1jbGFzcyBDMkdyYXBoaWNCdWZmZXIgOiBwdWJsaWMgQzJCdWZmZXIgewotcHVibGljOgotICAgIC8vIGNvbnN0YW50IGF0dHJpYnV0ZXMKLSAgICBpbmxpbmUgdWludDMyX3Qgd2lkdGgoKSBjb25zdCAgeyByZXR1cm4gbVdpZHRoOyB9Ci0gICAgaW5saW5lIHVpbnQzMl90IGhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1IZWlnaHQ7IH0KLSAgICBpbmxpbmUgdWludDMyX3QgZm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbUZvcm1hdDsgfQotICAgIGlubGluZSBjb25zdCBDMk1lbW9yeVVzYWdlIHVzYWdlKCkgY29uc3QgeyByZXR1cm4gbVVzYWdlOyB9Ci0KLSAgICAvLyBtb2RpZmlhYmxlIGF0dHJpYnV0ZXMKLQotCi0gICAgdmlydHVhbCBjb25zdCBDMkNvbG9yU3BhY2UgY29sb3JTcGFjZSgpIGNvbnN0ID0gMDsKLSAgICAvLyBiZXN0IGVmZm9ydAotICAgIHZpcnR1YWwgdm9pZCBzZXRDb2xvclNwYWNlX2JlKGNvbnN0IEMyQ29sb3JTcGFjZSAmY29sb3JTcGFjZSkgPSAwOwotICAgIHZpcnR1YWwgYm9vbCBzZXRDb2xvclNwYWNlKGNvbnN0IEMyQ29sb3JTcGFjZSAmY29sb3JTcGFjZSkgPSAwOwotCi0gICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSgpIGNvbnN0OwotCi1wcm90ZWN0ZWQ6Ci0gICAgdWludDMyX3QgbVdpZHRoOwotICAgIHVpbnQzMl90IG1IZWlnaHQ7Ci0gICAgdWludDMyX3QgbUZvcm1hdDsKLSAgICBDMk1lbW9yeVVzYWdlIG1Vc2FnZTsKLQotICAgIGNsYXNzIEltcGw7Ci0gICAgSW1wbCAqbUltcGw7Ci19OwotCi0vLy8gQH0KLQotLy8vIFxlbmRjb25kCi0KLS8vLyBAfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIEMyQlVGRkVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvaW5jbHVkZS9DMkNvbXBvbmVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL2luY2x1ZGUvQzJDb21wb25lbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVlOTMwMi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvaW5jbHVkZS9DMkNvbXBvbmVudC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEMyQ09NUE9ORU5UX0hfCi0KLSNkZWZpbmUgQzJDT01QT05FTlRfSF8KLQotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPGxpc3Q+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotCi0jaW5jbHVkZSA8QzJQYXJhbS5oPgotI2luY2x1ZGUgPEMyV29yay5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vLyBcZGVmZ3JvdXAgY29tcG9uZW50cyBDb21wb25lbnRzCi0vLy8gQHsKLQotY2xhc3MgQzJDb21wb25lbnQ7Ci0KLWNsYXNzIEMyQ29tcG9uZW50TGlzdGVuZXIgewotcHVibGljOgotICAgIHZpcnR1YWwgdm9pZCBvbldvcmtEb25lKHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gd29ya0l0ZW1zKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgb25UcmlwcGVkKHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBzZXR0aW5nUmVzdWx0KSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgb25FcnJvcihzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZXJyb3JDb2RlKSA9IDA7Ci0KLSAgICAvLyB2aXJ0dWFsIHZvaWQgb25UdW5uZWxSZWxlYXNlZCg8ZnJvbT4sIDx0bz4pID0gMDsKLQotICAgIC8vIHZpcnR1YWwgdm9pZCBvbkNvbXBvbmVudFJlbGVhc2VkKDxpZD4pID0gMDsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkMyQ29tcG9uZW50TGlzdGVuZXIoKTsKLX07Ci0KLS8qKgotICogQ29tcG9uZW50IGludGVyZmFjZSBvYmplY3QuIFRoaXMgb2JqZWN0IGNvbnRhaW5zIGFsbCBvZiB0aGUgY29uZmlndXJhdGlvbiBvZiBhIHBvdGVudGlhbCBvcgotICogYWN0dWFsIGNvbXBvbmVudC4gSXQgY2FuIGJlIGNyZWF0ZWQgYW5kIHVzZWQgaW5kZXBlbmRlbnRseSBvZiBhbiBhY3R1YWwgQzJDb21wb25lbnQgaW5zdGFuY2UgdG8KLSAqIHF1ZXJ5IHN1cHBvcnQgYW5kIHBhcmFtZXRlcnMgZm9yIHZhcmlvdXMgY29tcG9uZW50IHNldHRpbmdzIGFuZCBjb25maWd1cmF0aW9ucyBmb3IgYSBwb3RlbnRpYWwKLSAqIGNvbXBvbmVudC4gQWN0dWFsIGNvbXBvbmVudHMgYWxzbyBleHBvc2UgdGhpcyBpbnRlcmZhY2UuCi0gKi8KLQotY2xhc3MgQzJDb21wb25lbnRJbnRlcmZhY2UgewotcHVibGljOgotICAgIC8vIEFMV0FZUyBBVkFJTEFCTEUgTUVUSE9EUwotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIGNvbXBvbmVudCBvciBjb21wb25lbnQgaW50ZXJmYWNlIG9iamVjdC4KLSAgICAgKiBUaGlzIGlzIGEgdW5pcXVlIG5hbWUgZm9yIHRoaXMgY29tcG9uZW50IG9yIGNvbXBvbmVudCBpbnRlcmZhY2UgJ2NsYXNzJzsgaG93ZXZlciwgbXVsdGlwbGUKLSAgICAgKiBpbnN0YW5jZXMgb2YgdGhpcyBjb21wb25lbnQgU0hBTEwgaGF2ZSB0aGUgc2FtZSBuYW1lLgotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gYW55IHN0YXRlLiBUaGlzIGNhbGwgZG9lcyBub3QgY2hhbmdlIHRoZSBzdGF0ZSBub3IgdGhlCi0gICAgICogaW50ZXJuYWwgc3RhdGVzIG9mIHRoZSBjb21wb25lbnQuCi0gICAgICoKLSAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KLSAgICAgKgotICAgICAqIFxyZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBjb21wb25lbnQgb3IgY29tcG9uZW50IGludGVyZmFjZSBvYmplY3QuCi0gICAgICogXHJldHZhbCBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIHRoZSBhY3R1YWwgbmFtZS4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIEMyU3RyaW5nIGdldE5hbWUoKSBjb25zdCA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgdW5pcXVlIElEIGZvciB0aGlzIGNvbXBvbmVudCBvciBpbnRlcmZhY2Ugb2JqZWN0LgotICAgICAqIFRoaXMgSUQgaXMgdXNlZCBhcyB3b3JrIHRhcmdldHMsIHVuaXF1ZSB3b3JrIElEcywgYW5kIHdoZW4gY29uZmlndXJpbmcgdHVubmVsaW5nLgotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gYW55IHN0YXRlLiBUaGlzIGNhbGwgZG9lcyBub3QgY2hhbmdlIHRoZSBzdGF0ZSBub3IgdGhlCi0gICAgICogaW50ZXJuYWwgc3RhdGVzIG9mIHRoZSBjb21wb25lbnQuCi0gICAgICoKLSAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KLSAgICAgKgotICAgICAqIFxyZXR1cm4gYSB1bmlxdWUgbm9kZSBJRCBmb3IgdGhpcyBjb21wb25lbnQgb3IgY29tcG9uZW50IGludGVyZmFjZSBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIG5vZGVfaWQgZ2V0SWQoKSBjb25zdCA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBRdWVyaWVzIGEgc2V0IG9mIHBhcmFtZXRlcnMgZnJvbSB0aGUgY29tcG9uZW50IG9yIGludGVyZmFjZSBvYmplY3QuCi0gICAgICogUXVlcnlpbmcgaXMgcGVyZm9ybWVkIGF0IGJlc3QgZWZmb3J0OiB0aGUgY29tcG9uZW50IFNIQUxMIHF1ZXJ5IGFsbCBzdXBwb3J0ZWQgcGFyYW1ldGVycyBhbmQKLSAgICAgKiBza2lwIHVuc3VwcG9ydGVkIG9uZXMsIG9yIGhlYXAgYWxsb2NhdGVkIHBhcmFtZXRlcnMgdGhhdCBjb3VsZCBub3QgYmUgYWxsb2NhdGVkLiBBbnkgZXJyb3JzCi0gICAgICogYXJlIGNvbW11bmljYXRlZCBpbiB0aGUgcmV0dXJuIHZhbHVlLiBBZGRpdGlvbmFsbHksIHByZWFsbG9jYXRlZCAoZS5nLiBzdGFjaykgcGFyYW1ldGVycyB0aGF0Ci0gICAgICogY291bGQgbm90IGJlIHF1ZXJpZWQgYXJlIGludmFsaWRhdGVkLiBQYXJhbWV0ZXJzIHRvIGJlIGFsbG9jYXRlZCBvbiB0aGUgaGVhcCBhcmUgb21pdHRlZCBmcm9tCi0gICAgICogdGhlIHJlc3VsdC4KLSAgICAgKgotICAgICAqIFxub3RlIFBhcmFtZXRlciB2YWx1ZXMgZG8gbm90IGRlcGVuZCBvbiB0aGUgb3JkZXIgb2YgcXVlcnkuCi0gICAgICoKLSAgICAgKiBcdG9kbyBUaGlzIG1ldGhvZCBjYW5ub3QgYmUgdXNlZCB0byBxdWVyeSBpbmZvLWJ1ZmZlcnMuIElzIHRoYXQgYSBwcm9ibGVtPwotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gYW55IHN0YXRlLiBUaGlzIGNhbGwgZG9lcyBub3QgY2hhbmdlIHRoZSBzdGF0ZSBub3IgdGhlCi0gICAgICogaW50ZXJuYWwgc3RhdGVzIG9mIHRoZSBjb21wb25lbnQuCi0gICAgICoKLSAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KLSAgICAgKgotICAgICAqIFxwYXJhbVtpbixvdXRdIHN0YWNrUGFyYW1zICAgYSBsaXN0IG9mIHBhcmFtcyBxdWVyaWVkLiBUaGVzZSBhcmUgaW5pdGlhbGl6ZWQgc3BlY2lmaWMgdG8gZWFjaAotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmc7IGUuZy4gc2l6ZSBhbmQgaW5kZXggYXJlIHNldCBhbmQgcmVzdCBvZiB0aGUgbWVtYmVycyBhcmUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBjbGVhcmVkLgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIFxub3RlIEZsZXhpYmxlIHNldHRpbmdzIHRoYXQgYXJlIG9mIGluY29ycmVjdCBzaXplIHdpbGwgYmUgaW52YWxpZGF0ZWQuCi0gICAgICogXHBhcmFtW2luXSBoZWFwUGFyYW1JbmRpY2VzIGEgdmVjdG9yIG9mIHBhcmFtIGluZGljZXMgZm9yIHBhcmFtcyB0byBiZSBxdWVyaWVkIGFuZCByZXR1cm5lZCBvbiB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBoZWFwLiBUaGVzZSBwYXJhbWV0ZXJzIHdpbGwgYmUgcmV0dXJuZWQgaW4gaGVhcFBhcmFtcy4gVW5zdXBwb3J0ZWQgcGFyYW0KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzIHdpbGwgYmUgaWdub3JlZC4KLSAgICAgKiBccGFyYW1bb3V0XSBoZWFwUGFyYW1zICAgIGEgbGlzdCBvZiBwYXJhbXMgd2hlcmUgdG8gd2hpY2ggdGhlIHN1cHBvcnRlZCBoZWFwIHBhcmFtZXRlcnMgd2lsbCBiZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZGVkIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiBoZWFwUGFyYW1JbmRpY2VzLgotICAgICAqCi0gICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgYWxsIHBhcmFtZXRlcnMgY291bGQgYmUgcXVlcmllZAotICAgICAqIFxyZXR2YWwgQzJfQkFEX0lOREVYIGFsbCBzdXBwb3J0ZWQgcGFyYW1ldGVycyBjb3VsZCBiZSBxdWVyaWVkLCBidXQgc29tZSBwYXJhbWV0ZXJzIHdlcmUgbm90Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkCi0gICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgY291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgYSBzdXBwb3J0ZWQgcGFyYW1ldGVyCi0gICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgcXVlcnlpbmcgb2YgdGhlIHBhcmFtZXRlcnMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodW5leHBlY3RlZCkKLSAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5X25iKAotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKiBjb25zdD4gJnN0YWNrUGFyYW1zLAotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCi0gICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIGNvbnN0IGhlYXBQYXJhbXMpIGNvbnN0ID0gMDsKLQotICAgIC8qKgotICAgICAqIFNldHMgYSBzZXQgb2YgcGFyYW1ldGVycyBmb3IgdGhlIGNvbXBvbmVudCBvciBpbnRlcmZhY2Ugb2JqZWN0LgotICAgICAqIFR1bmluZyBpcyBwZXJmb3JtZWQgYXQgYmVzdCBlZmZvcnQ6IHRoZSBjb21wb25lbnQgU0hBTEwgdXBkYXRlIGFsbCBzdXBwb3J0ZWQgY29uZmlndXJhdGlvbiBhdAotICAgICAqIGJlc3QgZWZmb3J0ICh1bmxlc3MgY29uZmlndXJlZCBvdGhlcndpc2UpIGFuZCBza2lwIHVuc3VwcG9ydGVkIG9uZXMuIEFueSBlcnJvcnMgYXJlCi0gICAgICogY29tbXVuaWNhdGVkIGluIHRoZSByZXR1cm4gdmFsdWUgYW5kIGluIHxmYWlsdXJlc3wuCi0gICAgICoKLSAgICAgKiBcbm90ZSBQYXJhbWV0ZXIgdHVuaW5nIERPRVMgZGVwZW5kIG9uIHRoZSBvcmRlciBvZiB0aGUgdHVuaW5nIHBhcmFtZXRlcnMuIEUuZy4gc29tZSBwYXJhbWV0ZXIKLSAgICAgKiB1cGRhdGUgbWF5IGFsbG93IHNvbWUgc3Vic2VxdWVudCBwYXJhbWV0ZXIgdXBkYXRlLgotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gYW55IHN0YXRlLgotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCi0gICAgICoKLSAgICAgKiBccGFyYW1baW4sb3V0XSBwYXJhbXMgICAgICAgICAgYSBsaXN0IG9mIHBhcmFtZXRlciB1cGRhdGVzLiBUaGVzZSB3aWxsIGJlIHVwZGF0ZWQgdG8gdGhlIGFjdHVhbAotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciB2YWx1ZXMgYWZ0ZXIgdGhlIHVwZGF0ZXMgKHRoaXMgaXMgYmVjYXVzZSB0dW5pbmcgaXMgcGVyZm9ybWVkCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgYXQgYmVzdCBlZmZvcnQpLgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIFx0b2RvIHBhcmFtcyB0aGF0IGNvdWxkIG5vdCBiZSB1cGRhdGVkIGFyZSBub3QgbWFya2VkIGhlcmUsIHNvIGFyZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGNvbmZ1c2luZyAtIGFyZSB0aGV5ICJleGlzdGluZyIgdmFsdWVzIG9yIGludGVuZGVkIHRvIGJlIGNvbmZpZ3VyZWQKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM/Ci0gICAgICogXHBhcmFtW291dF0gZmFpbHVyZXMgICAgICAgIGEgbGlzdCBvZiBwYXJhbWV0ZXIgZmFpbHVyZXMKLSAgICAgKgotICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIGFsbCBwYXJhbWV0ZXJzIGNvdWxkIGJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5Ci0gICAgICogXHJldHZhbCBDMl9CQURfSU5ERVggYWxsIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGNvdWxkIGJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LCBidXQgc29tZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgd2VyZSBub3Qgc3VwcG9ydGVkCi0gICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgc29tZSBzdXBwb3J0ZWQgcGFyYW1ldGVycyBjb3VsZCBub3QgYmUgdXBkYXRlZCBzdWNjZXNzZnVsbHkgYmVjYXVzZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoZXkgY29udGFpbmVkIHVuc3VwcG9ydGVkIHZhbHVlcy4gVGhlc2UgYXJlIHJldHVybmVkIGluIHxmYWlsdXJlc3wuCi0gICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgc29tZSBzdXBwb3J0ZWQgcGFyYW1ldGVycyBjb3VsZCBub3QgYmUgdXBkYXRlZCBzdWNjZXNzZnVsbHkgYmVjYXVzZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoZXkgY29udGFpbmVkIHVuc3VwcG9ydGVkIHZhbHVlcywgYnV0IGNvdWxkIG5vdCBhbGxvY2F0ZSBhIGZhaWx1cmUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgZm9yIHRoZW0uCi0gICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgdXBkYXRlIG9mIHRoZSBwYXJhbWV0ZXJzCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgKHVuZXhwZWN0ZWQpCi0gICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWdfbmIoCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKiBjb25zdD4gJnBhcmFtcywKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMpID0gMDsKLQotICAgIC8qKgotICAgICAqIEF0b21pY2FsbHkgc2V0cyBhIHNldCBvZiBwYXJhbWV0ZXJzIGZvciB0aGUgY29tcG9uZW50IG9yIGludGVyZmFjZSBvYmplY3QuCi0gICAgICoKLSAgICAgKiBcbm90ZSBUaGlzIG1ldGhvZCBpcyB1c2VkIG1haW5seSBmb3IgcmVzZXJ2aW5nIHJlc291cmNlcyBmb3IgYSBjb21wb25lbnQuCi0gICAgICoKLSAgICAgKiBUaGUgY29tcG9uZW50IFNIQUxMIHVwZGF0ZSBhbGwgc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb24gYXQKLSAgICAgKiBiZXN0IGVmZm9ydChUQkQpICh1bmxlc3MgY29uZmlndXJlZCBvdGhlcndpc2UpIGFuZCBza2lwIHVuc3VwcG9ydGVkIG9uZXMuIEFueSBlcnJvcnMgYXJlCi0gICAgICogY29tbXVuaWNhdGVkIGluIHRoZSByZXR1cm4gdmFsdWUgYW5kIGluIHxmYWlsdXJlc3wuCi0gICAgICoKLSAgICAgKiBcbm90ZSBQYXJhbWV0ZXIgdHVuaW5nIERPRVMgZGVwZW5kIG9uIHRoZSBvcmRlciBvZiB0aGUgdHVuaW5nIHBhcmFtZXRlcnMuIEUuZy4gc29tZSBwYXJhbWV0ZXIKLSAgICAgKiB1cGRhdGUgbWF5IGFsbG93IHNvbWUgc3Vic2VxdWVudCBwYXJhbWV0ZXIgdXBkYXRlLgotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gYW55IHN0YXRlLgotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgbWF5IGJlIG1vbWVudGFyaWx5IGJsb2NraW5nLCBidXQgTVVTVCByZXR1cm4gd2l0aGluIDVtcy4KLSAgICAgKgotICAgICAqIFxwYXJhbSBwYXJhbXNbaW4sb3V0XSAgICAgICAgICBhIGxpc3Qgb2YgcGFyYW1ldGVyIHVwZGF0ZXMuIFRoZXNlIHdpbGwgYmUgdXBkYXRlZCB0byB0aGUgYWN0dWFsCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIHZhbHVlcyBhZnRlciB0aGUgdXBkYXRlcyAodGhpcyBpcyBiZWNhdXNlIHR1bmluZyBpcyBwZXJmb3JtZWQKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhdCBiZXN0IGVmZm9ydCkuCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgXHRvZG8gcGFyYW1zIHRoYXQgY291bGQgbm90IGJlIHVwZGF0ZWQgYXJlIG5vdCBtYXJrZWQgaGVyZSwgc28gYXJlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgY29uZnVzaW5nIC0gYXJlIHRoZXkgImV4aXN0aW5nIiB2YWx1ZXMgb3IgaW50ZW5kZWQgdG8gYmUgY29uZmlndXJlZAotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz8KLSAgICAgKiBccGFyYW0gZmFpbHVyZXNbb3V0XSAgICAgICAgYSBsaXN0IG9mIHBhcmFtZXRlciBmYWlsdXJlcwotICAgICAqCi0gICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgYWxsIHBhcmFtZXRlcnMgY291bGQgYmUgdXBkYXRlZCBzdWNjZXNzZnVsbHkKLSAgICAgKiBccmV0dmFsIEMyX0JBRF9JTkRFWCBhbGwgc3VwcG9ydGVkIHBhcmFtZXRlcnMgY291bGQgYmUgdXBkYXRlZCBzdWNjZXNzZnVsbHksIGJ1dCBzb21lCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyB3ZXJlIG5vdCBzdXBwb3J0ZWQKLSAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBzb21lIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGNvdWxkIG5vdCBiZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseSBiZWNhdXNlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgdGhleSBjb250YWluZWQgdW5zdXBwb3J0ZWQgdmFsdWVzLiBUaGVzZSBhcmUgcmV0dXJuZWQgaW4gfGZhaWx1cmVzfC4KLSAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBzb21lIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGNvdWxkIG5vdCBiZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseSBiZWNhdXNlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgdGhleSBjb250YWluZWQgdW5zdXBwb3J0ZWQgdmFsdWVzLCBidXQgY291bGQgbm90IGFsbG9jYXRlIGEgZmFpbHVyZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCBmb3IgdGhlbS4KLSAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSB1cGRhdGUgb2YgdGhlIHBhcmFtZXRlcnMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodW5leHBlY3RlZCkKLSAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNvbW1pdF9zbSgKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qIGNvbnN0PiAmcGFyYW1zLAotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcykgPSAwOwotCi0gICAgLy8gVFVOTkVMSU5HCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgdHVubmVsIGZyb20gdGhpcyBjb21wb25lbnQgdG8gdGhlIHRhcmdldCBjb21wb25lbnQuCi0gICAgICoKLSAgICAgKiBJZiB0aGUgY29tcG9uZW50IGlzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLCBzdWJzZXF1ZW50IHdvcmsgaXRlbXMgcXVldWVkIG1heSBpbmNsdWRlIGEKLSAgICAgKiB0dW5uZWxlZCBwYXRoIGJldHdlZW4gdGhlc2UgY29tcG9uZW50cy4KLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFueSBzdGF0ZS4KLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIG1heSBiZSBtb21lbnRhcmlseSBibG9ja2luZywgYnV0IE1VU1QgcmV0dXJuIHdpdGhpbiA1bXMuCi0gICAgICoKLSAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgdHVubmVsIHdhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZAotICAgICAqIFxyZXR2YWwgQzJfQkFEX0lOREVYIHRoZSB0YXJnZXQgY29tcG9uZW50IGRvZXMgbm90IGV4aXN0Ci0gICAgICogXHJldHZhbCBDMl9BTFJFQURZX0VYSVNUIHRoZSB0dW5uZWwgYWxyZWFkeSBleGlzdHMKLSAgICAgKiBccmV0dmFsIEMyX1VOU1VQUE9SVEVEICB0aGUgdHVubmVsIGlzIG5vdCBzdXBwb3J0ZWQKLSAgICAgKgotICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIGNvdWxkIG5vdCBjcmVhdGUgdGhlIHR1bm5lbCB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCi0gICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgY3JlYXRpb24gb2YgdGhlIHR1bm5lbCAodW5leHBlY3RlZCkKLSAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVR1bm5lbF9zbShub2RlX2lkIHRhcmdldENvbXBvbmVudCkgPSAwOwotCi0gICAgLyoqCi0gICAgICogUmVsZWFzZXMgYSB0dW5uZWwgZnJvbSB0aGlzIGNvbXBvbmVudCB0byB0aGUgdGFyZ2V0IGNvbXBvbmVudC4KLSAgICAgKgotICAgICAqIFRoZSByZWxlYXNlIG9mIGEgdHVubmVsIGlzIGRlbGF5ZWQgd2hpbGUgdGhlcmUgYXJlIHBlbmRpbmcgd29yayBpdGVtcyBmb3IgdGhlIHR1bm5lbC4KLSAgICAgKiBBZnRlciByZWxlYXNpbmcgYSB0dW5uZWwsIHN1YnNlcXVlbnQgd29yayBpdGVtcyBxdWV1ZWQgTVVTVCBOT1QgaW5jbHVkZSBhIHR1bm5lbGVkCi0gICAgICogcGF0aCBiZXR3ZWVuIHRoZXNlIGNvbXBvbmVudHMuCi0gICAgICoKLSAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBhbnkgc3RhdGUuCi0gICAgICoKLSAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgbW9tZW50YXJpbHkgYmxvY2tpbmcsIGJ1dCBNVVNUIHJldHVybiB3aXRoaW4gNW1zLgotICAgICAqCi0gICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIHR1bm5lbCB3YXMgbWFya2VkIGZvciByZWxlYXNlIHN1Y2Nlc3NmdWxseQotICAgICAqIFxyZXR2YWwgQzJfQkFEX0lOREVYIHRoZSB0YXJnZXQgY29tcG9uZW50IGRvZXMgbm90IGV4aXN0Ci0gICAgICogXHJldHZhbCBDMl9OT1RfRk9VTkQgdGhlIHR1bm5lbCBkb2VzIG5vdCBleGlzdAotICAgICAqCi0gICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IG1hcmsgdGhlIHR1bm5lbCBmb3IgcmVsZWFzZSB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCi0gICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgcmVsZWFzZSBvZiB0aGUgdHVubmVsICh1bmV4cGVjdGVkKQotICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZVR1bm5lbF9zbShub2RlX2lkIHRhcmdldENvbXBvbmVudCkgPSAwOwotCi0KLSAgICAvLyBSRUZMRUNUSU9OIE1FQ0hBTklTTSAoVVNFRCBGT1IgRVhURU5TSU9OKQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcGFyYW1ldGVyIHJlZmxlY3Rvci4KLSAgICAgKgotICAgICAqIFRoaXMgaXMgdXNlZCB0byBkZXNjcmliZSBwYXJhbWV0ZXIgZmllbGRzLgotICAgICAqCi0gICAgICogXHJldHVybiBhIHNoYXJlZCBwYXJhbWV0ZXIgcmVmbGVjdG9yIG9iamVjdC4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBnZXRQYXJhbVJlZmxlY3RvcigpIGNvbnN0ID0gMDsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNldCBvZiBzdXBwb3J0ZWQgcGFyYW1ldGVycy4KLSAgICAgKgotICAgICAqIFxwYXJhbVtvdXRdIHBhcmFtcyBhIHZlY3RvciBvZiBzdXBwb3J0ZWQgcGFyYW1ldGVycyB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoaXMgdmVjdG9yLgotICAgICAqCi0gICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgotICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIHRoaXMgbWV0aG9kLgotICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3VwcG9ydGVkUGFyYW1zKAotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKiBjb25zdCBwYXJhbXMpIGNvbnN0ID0gMDsKLQotICAgIC8qKgotICAgICAqCi0gICAgICogXHRvZG8gc2hvdWxkIHRoaXMgdGFrZSBhIGxpc3QgY29uc2lkZXJpbmcgdGhhdCBzZXR0aW5nIHNvbWUgZmllbGRzIG1heSBmdXJ0aGVyIGxpbWl0IG90aGVyCi0gICAgICogZmllbGRzIGluIHRoZSBzYW1lIGxpc3Q/Ci0gICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdXBwb3J0ZWRWYWx1ZXMoCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBDMlBhcmFtRmllbGQ+IGZpZWxkcywKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+KiBjb25zdCB2YWx1ZXMpIGNvbnN0ID0gMDsKLQotICAgIHZpcnR1YWwgfkMyQ29tcG9uZW50SW50ZXJmYWNlKCkgPSBkZWZhdWx0OwotfTsKLQotY2xhc3MgQzJDb21wb25lbnQgewotcHVibGljOgotICAgIC8vIE1FVEhPRFMgQVZBSUxBQkxFIFdIRU4gUlVOTklORwotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgLyoqCi0gICAgICogUXVldWVzIHVwIHdvcmsgZm9yIHRoZSBjb21wb25lbnQuCi0gICAgICoKLSAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBydW5uaW5nIChpbmNsdWRpbmcgdHJpcHBlZCkgc3RhdGVzLgotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMKLSAgICAgKgotICAgICAqIEl0IGlzIGFjY2VwdGFibGUgZm9yIHRoaXMgbWV0aG9kIHRvIHJldHVybiBPSyBhbmQgcmV0dXJuIGFuIGVycm9yIHZhbHVlIHVzaW5nIHRoZQotICAgICAqIG9uV29ya0RvbmUoKSBjYWxsYmFjay4KLSAgICAgKgotICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSB3b3JrIHdhcyBzdWNjZXNzZnVsbHkgcXVldWVkCi0gICAgICogXHJldHZhbCBDMl9CQURfSU5ERVggc29tZSBjb21wb25lbnQocykgaW4gdGhlIHdvcmsgZG8oZXMpIG5vdCBleGlzdAotICAgICAqIFxyZXR2YWwgQzJfVU5TVVBQT1JURUQgIHRoZSBjb21wb25lbnRzIGFyZSBub3QgdHVubmVsZWQKLSAgICAgKgotICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIHF1ZXVlIHRoZSB3b3JrCi0gICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCBxdWV1aW5nIHRoZSB3b3JrICh1bmV4cGVjdGVkKQotICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVldWVfbmIoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgaXRlbXMpID0gMDsKLQotICAgIC8qKgotICAgICAqIEFubm91bmNlcyBhIHdvcmsgdG8gYmUgcXVldWVkIGxhdGVyIGZvciB0aGUgY29tcG9uZW50LiBUaGlzIHJlc2VydmVzIGEgc2xvdCBmb3IgdGhlIHF1ZXVlCi0gICAgICogdG8gZW5zdXJlIGNvcnJlY3Qgd29yayBvcmRlcmluZyBldmVuIGlmIHRoZSB3b3JrIGlzIHF1ZXVlZCBsYXRlci4KLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIHJ1bm5pbmcgKGluY2x1ZGluZyB0cmlwcGVkKSBzdGF0ZXMuCi0gICAgICoKLSAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDEgbXMKLSAgICAgKgotICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSB3b3JrIGFubm91bmNlbWVudCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgcmVjb3JkZWQKLSAgICAgKiBccmV0dmFsIEMyX0JBRF9JTkRFWCBzb21lIGNvbXBvbmVudChzKSBpbiB0aGUgd29yayBvdXRsaW5lIGRvKGVzKSBub3QgZXhpc3QKLSAgICAgKiBccmV0dmFsIEMyX1VOU1VQUE9SVEVEICB0aGUgY29tcG9uZW50ZXMgYXJlIG5vdCB0dW5uZWxlZAotICAgICAqCi0gICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gcmVjb3JkIHRoZSB3b3JrIGFubm91bmNlbWVudAotICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgcmVjb3JkaW5nIHRoZSBhbm5vdW5jZW1lbnQgKHVuZXhwZWN0ZWQpCi0gICAgICoKLSAgICAgKiBcdG9kbyBDYW4gdGhpcyBiZSByb2xsZWQgaW50byBxdWV1ZV9uYj8KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IGFubm91bmNlX25iKGNvbnN0IHN0ZDo6dmVjdG9yPEMyV29ya091dGxpbmU+ICZpdGVtcykgPSAwOwotCi0gICAgLyoqCi0gICAgICogRGlzY2FyZHMgYW5kIGFiYW5kb25zIGFueSBwZW5kaW5nIHdvcmsgZm9yIHRoZSBjb21wb25lbnQsIGFuZCBvcHRpb25hbGx5IGFueSBjb21wb25lbnQKLSAgICAgKiBkb3duc3RyZWFtLgotICAgICAqCi0gICAgICogXHRvZG8gZGVmaW5lIHRoaXM6IHdlIGNvdWxkIGZsdXNoIGFsbCB3b3JrIGJlZm9yZSBsYXN0IGl0ZW0gcXVldWVkIGZvciBjb21wb25lbnQgYWNyb3NzIGFsbAotICAgICAqICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzIGxpbmtlZCB0byB0aGlzOyBmbHVzaCBvbmx5IHdvcmsgaXRlbXMgdGhhdCBhcmUgcXVldWVkIHRvIHRoaXMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50Ci0gICAgICogXHRvZG8gcmV0dXJuIHdvcmsgIyBvZiBsYXN0IGZsdXNoZWQgaXRlbTsgb3IgYWxsIGZsdXNoZWQgKGJ1dCBub3QgcmV0dXJuZWQgaXRlbXMpCi0gICAgICogXHRvZG8gd2UgY291bGQgbWFrZSBmbHVzaCB0YWtlIGEgd29yayBpdGVtIGFuZCBmbHVzaCBhbGwgd29yayBiZWZvcmUvYWZ0ZXIgdGhhdCBpdGVtIHRvIGFsbG93Ci0gICAgICogICAgICAgVEJEIChzbGljaW5nL3NlZWs/KQotICAgICAqIFx0b2RvIHdlIGNvdWxkIHNpbXBseSB0YWtlIGEgbGlzdCBvZiBudW1iZXJzIGFuZCBmbHVzaCB0aG9zZS4uLiB0aGlzIGlzIGJhZCBmb3IgZGVjb2RlcnMKLSAgICAgKiAgICAgICBhbHNvLCB3aGF0IHdvdWxkIGhhcHBlbiB0byBmaW5lIGdyYWRlIHJlZmVyZW5jZXM/Ci0gICAgICoKLSAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBydW5uaW5nIChpbmNsdWRpbmcgdHJpcHBlZCkgc3RhdGVzLgotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgbWF5IGJlIG1vbWVudGFyaWx5IGJsb2NraW5nLCBidXQgbXVzdCByZXR1cm4gd2l0aGluIDVtcy4KLSAgICAgKgotICAgICAqIFdvcmsgdGhhdCBjb3VsZCBiZSBpbW1lZGlhdGVseSBhYmFuZG9uZWQvZGlzY2FyZGVkIFNIQUxMIGJlIHJldHVybmVkIGluIHxmbHVzaGVkV29ya3w7IHRoaXMKLSAgICAgKiBjYW4gYmUgZG9uZSBpbiBhbiBhcmJpdHJhcnkgb3JkZXIuCi0gICAgICoKLSAgICAgKiBXb3JrIHRoYXQgY291bGQgbm90IGJlIGFiYW5kb25lZCBvciBkaXNjYXJkZWQgaW1tZWRpYXRlbHkgU0hBTEwgYmUgbWFya2VkIHRvIGJlCi0gICAgICogZGlzY2FyZGVkIGF0IHRoZSBlYXJsaWVzdCBvcHBvcnR1bml0eSwgYW5kIFNIQUxMIGJlIHJldHVybmVkIHZpYSB0aGUgb25Xb3JrRG9uZSgpIGNhbGxiYWNrLgotICAgICAqCi0gICAgICogXHBhcmFtIGZsdXNoVGhyb3VnaCAgICBmbHVzaCB3b3JrIGZyb20gdGhpcyBjb21wb25lbnQgYW5kIGFsbCBjb21wb25lbnRzIGNvbm5lY3RlZCBkb3duc3RyZWFtCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgZnJvbSBpdCB2aWEgdHVubmVsaW5nLgotICAgICAqCi0gICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIHdvcmsgYW5ub3VuY2VtZW50IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSByZWNvcmRlZAotICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSBmbHVzaCBjb3VsZCBub3QgYmUgY29tcGxldGVkIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKLSAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIGZsdXNoaW5nIGZyb20gY29tcGxldGlvbiAodW5leHBlY3RlZCkKLSAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoX3NtKGJvb2wgZmx1c2hUaHJvdWdoLCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBjb25zdCBmbHVzaGVkV29yaykgPSAwOwotCi0gICAgLyoqCi0gICAgICogRHJhaW5zIHRoZSBjb21wb25lbnQsIGFuZCBvcHRpb25hbGx5IGRvd25zdHJlYW0gY29tcG9uZW50cwotICAgICAqCi0gICAgICogXHRvZG8gZGVmaW5lIHRoaXM7IHdlIGNvdWxkIHBsYWNlIEVPUyB0byBhbGwgdXBzdHJlYW0gY29tcG9uZW50cywganVzdCB0aGlzIGNvbXBvbmVudCwgb3IKLSAgICAgKiAgICAgICBhbGwgdXBzdHJlYW0gYW5kIGRvd25zdHJlYW0gY29tcG9uZW50LgotICAgICAqIFx0b2RvIHNob3VsZCBFT1MgY2Fycnkgb3ZlciB0byBkb3duc3RyZWFtIGNvbXBvbmVudHM/Ci0gICAgICoKLSAgICAgKiBNYXJrcyBsYXN0IHdvcmsgaXRlbSBhcyAiZW5kLW9mLXN0cmVhbSIsIHNvIGNvbXBvbmVudCBpcyBub3RpZmllZCBub3QgdG8gd2FpdCBmb3IgZnVydGhlcgotICAgICAqIHdvcmsgYmVmb3JlIGl0IHByb2Nlc3NlcyB3b3JrIGFscmVhZHkgcXVldWVkLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdG8gc2V0IHRoZSBlbmQtb2Ytc3RyZWFtCi0gICAgICogZmxhZyBhZnRlciB3b3JrIGhhcyBiZWVuIHF1ZXVlZC4gQ2xpZW50IGNhbiBjb250aW51ZSB0byBxdWV1ZSBmdXJ0aGVyIHdvcmsgaW1tZWRpYXRlbHkgYWZ0ZXIKLSAgICAgKiB0aGlzIG1ldGhvZCByZXR1cm5zLgotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gcnVubmluZyAoaW5jbHVkaW5nIHRyaXBwZWQpIHN0YXRlcy4KLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgotICAgICAqCi0gICAgICogV29yayB0aGF0IGlzIGNvbXBsZXRlZCBTSEFMTCBiZSByZXR1cm5lZCB2aWEgdGhlIG9uV29ya0RvbmUoKSBjYWxsYmFjay4KLSAgICAgKgotICAgICAqIFxwYXJhbSBkcmFpblRocm91Z2ggICAgbWFya3MgdGhlIGxhc3Qgd29yayBpdGVtIHdpdGggYSBwZXJzaXN0ZW50ICJlbmQtb2Ytc3RyZWFtIiBtYXJrZXIgdGhhdAotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdpbGwgZHJhaW4gZG93bnN0cmVhbSBjb21wb25lbnRzLgotICAgICAqCi0gICAgICogXHRvZG8gdGhpcyBtYXkgY29uZnVzZSB3b3JrLW9yZGVyaW5nIGRvd25zdHJlYW07IGNvdWxkIGJlIGFuIG1vZGUgZW51bQotICAgICAqCi0gICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIHdvcmsgYW5ub3VuY2VtZW50IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSByZWNvcmRlZAotICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSBmbHVzaCBjb3VsZCBub3QgYmUgY29tcGxldGVkIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKLSAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIGZsdXNoaW5nIGZyb20gY29tcGxldGlvbiAodW5leHBlY3RlZCkKLSAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IGRyYWluX25iKGJvb2wgZHJhaW5UaHJvdWdoKSA9IDA7Ci0KLSAgICAvLyBTVEFURSBDSEFOR0UgTUVUSE9EUwotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgLyoqCi0gICAgICogU3RhcnRzIHRoZSBjb21wb25lbnQuCi0gICAgICoKLSAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBzdG9wcGVkIHN0YXRlLgotICAgICAqCi0gICAgICogXHRvZG8gVGhpcyBtZXRob2QgTVVTVCByZXR1cm4gd2l0aGluIDUwMG1zLiBTZWVtcyB0aGlzIHNob3VsZCBiZSBhYmxlIHRvIHJldHVybiBxdWlja2x5LCBhcwotICAgICAqIHRoZXJlIGFyZSBubyBpbW1lZGlhdGUgZ3VhcmFudGVlcy4gVGhvdWdoIHRoZXJlIGFyZSBndWFyYW50ZWVzIGZvciByZXNwb25zaXZlbmVzcyBpbW1lZGlhdGVseQotICAgICAqIGFmdGVyIHN0YXJ0IHJldHVybnMuCi0gICAgICoKLSAgICAgKiBcdG9kbyBDb3VsZCB3ZSBqdXN0IHN0YXJ0IGEgQ29tcG9uZW50SW50ZXJmYWNlIHRvIGdldCBhIENvbXBvbmVudD8KLSAgICAgKgotICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSB3b3JrIGFubm91bmNlbWVudCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgcmVjb3JkZWQKLSAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBzdGFydCB0aGUgY29tcG9uZW50Ci0gICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIGNvbXBvbmVudCBjb3VsZCBub3QgYmUgc3RhcnRlZCB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCi0gICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCBzdGFydGluZyB0aGUgY29tcG9uZW50ICh1bmV4cGVjdGVkKQotICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBTdG9wcyB0aGUgY29tcG9uZW50LgotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gcnVubmluZyAoaW5jbHVkaW5nIHRyaXBwZWQpIHN0YXRlLgotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgTVVTVCByZXR1cm4gd2l0aGluZyA1MDBtcy4KLSAgICAgKgotICAgICAqIFVwb24gdGhpcyBjYWxsLCBhbGwgcGVuZGluZyB3b3JrIFNIQUxMIGJlIGFiYW5kb25lZC4KLSAgICAgKgotICAgICAqIFx0b2RvIHNob3VsZCB0aGlzIHJldHVybiBjb21wbGV0ZWQgd29yaywgc2luY2UgY2xpZW50IHdpbGwganVzdCBmcmVlIGl0PyBQZXJoYXBzIGp1c3QgdG8KLSAgICAgKiB2ZXJpZnkgYWNjb3VudGluZy4KLSAgICAgKgotICAgICAqIFRoaXMgZG9lcyBub3QgYWx0ZXIgYW55IHNldHRpbmdzIGFuZCB0dW5pbmdzIHRoYXQgbWF5IGhhdmUgcmVzdWx0ZWQgaW4gYSB0cmlwcGVkIHN0YXRlLgotICAgICAqIChJcyB0aGlzIG1hdGVyaWFsIGdpdmVuIHRoZSBkZWZpbml0aW9uPyBQZXJoYXBzIGluIGNhc2Ugd2Ugd2FudCB0byBzdGFydCBhZ2Fpbi4pCi0gICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCkgPSAwOwotCi0gICAgLyoqCi0gICAgICogUmVzZXRzIHRoZSBjb21wb25lbnQuCi0gICAgICoKLSAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBydW5uaW5nIChpbmNsdWRpbmcgdHJpcHBlZCkgc3RhdGUuCi0gICAgICoKLSAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBkdXJpbmcgYW55IG90aGVyIGNhbGwgKFx0b2RvIG9yIGp1c3QgYmxvY2tpbmcgb25lcz8pCi0gICAgICoKLSAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIHJldHVybiB3aXRoaW5nIDUwMG1zLgotICAgICAqCi0gICAgICogQWZ0ZXIgdGhpcyBjYWxsIHJldHVybnMgYWxsIHdvcmsgaXMvbXVzdCBiZSBhYmFuZG9uZWQsIGFsbCByZWZlcmVuY2VzIHNob3VsZCBiZSByZWxlYXNlZC4KLSAgICAgKgotICAgICAqIFx0b2RvIHNob3VsZCB0aGlzIHJldHVybiBjb21wbGV0ZWQgd29yaywgc2luY2UgY2xpZW50IHdpbGwganVzdCBmcmVlIGl0PyBBbHNvLCBpZiBpdCB1bmJsb2NrcwotICAgICAqIGEgc3RvcCwgd2hlcmUgc2hvdWxkIGNvbXBsZXRlZCB3b3JrIGJlIHJldHVybmVkPwotICAgICAqCi0gICAgICogVGhpcyBicmluZ3Mgc2V0dGluZ3MgYmFjayB0byB0aGVpciBkZWZhdWx0IC0gImd1YXJhbnRlZWluZyIgbm8gdHJpcHBlZCBzcGFjZS4KLSAgICAgKgotICAgICAqIFx0b2RvIHJlY2xhaW0gc3VwcG9ydCAtIGl0IHNlZW1zIHRoYXQgc2luY2Ugb3duZXJzaGlwIGlzIHBhc3NlZCwgdGhpcyB3aWxsIGFsbG93IHJlY2xhaW1pbmcgc3R1ZmYuCi0gICAgICovCi0gICAgdmlydHVhbCB2b2lkIHJlc2V0KCkgPSAwOwotCi0gICAgLyoqCi0gICAgICogUmVsZWFzZXMgdGhlIGNvbXBvbmVudC4KLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFueSBzdGF0ZS4gKFx0b2RvIE9yIHNoYWxsIHdlIGZvcmNlIHJlc2V0KCkgZmlyc3QgdG8gYnJpbmcKLSAgICAgKiB0byBhIGtub3duIHN0YXRlPykKLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgcmV0dXJuIHdpdGhpbmcgNTAwbXMuCi0gICAgICoKLSAgICAgKiBcdG9kbyBzaG91bGQgdGhpcyByZXR1cm4gY29tcGxldGVkIHdvcmssIHNpbmNlIGNsaWVudCB3aWxsIGp1c3QgZnJlZSBpdD8gQWxzbywgaWYgaXQgdW5ibG9ja3MKLSAgICAgKiBhIHN0b3AsIHdoZXJlIHNob3VsZCBjb21wbGV0ZWQgd29yayBiZSByZXR1cm5lZD8KLSAgICAgKgotICAgICAqIFRPRE86IGRvZXMgaXQgbWF0dGVyIGlmIHRoaXMgY2FsbCBoYXMgYSBzaG9ydCB0aW1lIGxpbWl0PyBZZXMsIGFzIHVwb24gcmV0dXJuIGFsbCByZWZlcmVuY2VzCi0gICAgICogc2hhbGwgYmUgYWJhbmRvbmVkLgotICAgICAqLwotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlKCkgPSAwOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaW50ZXJmYWNlIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICAgKgotICAgICAqIFxyZXR1cm4gdGhlIGNvbXBvbmVudCBpbnRlcmZhY2UKLSAgICAgKi8KLSAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gaW50ZigpID0gMDsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkMyQ29tcG9uZW50KCkgPSBkZWZhdWx0OwotfTsKLQotY2xhc3MgQzJGcmFtZUluZm9QYXJzZXIgewotcHVibGljOgotICAgIC8qKgotICAgICAqIFxyZXR1cm4gdGhlIGNvbnRlbnQgdHlwZSBzdXBwb3J0ZWQgYnkgdGhpcyBpbmZvIHBhcnNlci4KLSAgICAgKgotICAgICAqIFx0b2RvIHRoaXMgbWF5IGJlIHJlZHVuZGFudAotICAgICAqLwotICAgIHZpcnR1YWwgQzJTdHJpbmdMaXRlcmFsIGdldFR5cGUoKSBjb25zdCA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBccmV0dXJuIGEgdmVjdG9yIG9mIHN1cHBvcnRlZCBwYXJhbWV0ZXIgaW5kaWNlcyBwYXJzZWQgYnkgdGhpcyBpbmZvIHBhcnNlci4KLSAgICAgKgotICAgICAqIFx0b2RvIHN0aWNreSB2cy4gbm9uLXN0aWNreSBwYXJhbXM/IHRoaXMgbWF5IGJlIGNvbW11bmljYXRlZCBieSBwYXJhbS1yZWZsZWN0b3IuCi0gICAgICovCi0gICAgdmlydHVhbCBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gZ2V0UGFyc2VkUGFyYW1zKCkgY29uc3QgPSAwOwotCi0gICAgLyoqCi0gICAgICogUmVzZXRzIHRoaXMgaW5mbyBwYXJzZXIuIFRoaXMgYnJpbmdzIHRoaXMgcGFyc2VyIHRvIGl0cyBpbml0aWFsIHN0YXRlIGFmdGVyIGNyZWF0aW9uLgotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgU0hBTEwgcmV0dXJuIHdpdGhpbiA1bXMuCi0gICAgICoKLSAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgaW5mbyBwYXJzZXIgd2FzIHJlc2V0Ci0gICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IHJlc2V0IHRoZSBwYXJzZXIgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQotICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIHJlc2V0dGluZyBvZiB0aGUgcGFyc2VyICh1bmV4cGVjdGVkKQotICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzZXQoKSB7IHJldHVybiBDMl9PSzsgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBwYXJzZUZyYW1lKEMyQnVmZmVyUGFjayAmZnJhbWUpOwotCi0gICAgdmlydHVhbCB+QzJGcmFtZUluZm9QYXJzZXIoKSA9IGRlZmF1bHQ7Ci19OwotCi1zdHJ1Y3QgQzJDb21wb25lbnRJbmZvIHsKLSAgICAvLyBUQkQKLQotfTsKLQotY2xhc3MgQzJBbGxvY2F0b3JTdG9yZSB7Ci1wdWJsaWM6Ci0gICAgLy8gVEJECi0KLSAgICBlbnVtIFR5cGUgewotICAgICAgICBMSU5FQVIsICAgICAvLy88IGJhc2ljIGxpbmVhciBhbGxvY2F0b3IgdHlwZQotICAgICAgICBHUkFMTE9DLCAgICAvLy88IGJhc2ljIGdyYWxsb2MgYWxsb2NhdG9yIHR5cGUKLSAgICB9OwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBhbGxvY2F0b3IuCi0gICAgICoKLSAgICAgKiBccGFyYW0gdHlwZSAgICAgIHRoZSB0eXBlIG9mIGFsbG9jYXRvciB0byBjcmVhdGUKLSAgICAgKiBccGFyYW0gYWxsb2NhdG9yIHNoYXJlZCBwb2ludGVyIHdoZXJlIHRoZSBjcmVhdGVkIGFsbG9jYXRvciBpcyBzdG9yZWQuIENsZWFyZWQgb24gZmFpbHVyZQotICAgICAqICAgICAgICAgICAgICAgICAgYW5kIHVwZGF0ZWQgb24gc3VjY2Vzcy4KLSAgICAgKgotICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBhbGxvY2F0b3Igd2FzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5Ci0gICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IGNyZWF0ZSB0aGUgYWxsb2NhdG9yIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKLSAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBjcmVhdGlvbiBvZiB0aGUgYWxsb2NhdG9yICh1bmV4cGVjdGVkKQotICAgICAqCi0gICAgICogXHJldHZhbCBDMl9OT1RfRk9VTkQgbm8gc3VjaCBhbGxvY2F0b3IKLSAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgdGhlIGFsbG9jYXRvcgotICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQWxsb2NhdG9yKFR5cGUgdHlwZSwgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiogY29uc3QgYWxsb2NhdG9yKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIH5DMkFsbG9jYXRvclN0b3JlKCkgPSBkZWZhdWx0OwotfTsKLQotY2xhc3MgQzJDb21wb25lbnRTdG9yZSB7Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGNvbXBvbmVudC4KLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIFNIQUxMIHJldHVybiB3aXRoaW4gMTAwbXMuCi0gICAgICoKLSAgICAgKiBccGFyYW0gbmFtZSAgICAgICAgICBuYW1lIG9mIHRoZSBjb21wb25lbnQgdG8gY3JlYXRlCi0gICAgICogXHBhcmFtIGNvbXBvbmVudCAgICAgc2hhcmVkIHBvaW50ZXIgd2hlcmUgdGhlIGNyZWF0ZWQgY29tcG9uZW50IGlzIHN0b3JlZC4gQ2xlYXJlZCBvbgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUgYW5kIHVwZGF0ZWQgb24gc3VjY2Vzcy4KLSAgICAgKgotICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBjb21wb25lbnQgd2FzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5Ci0gICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IGNyZWF0ZSB0aGUgY29tcG9uZW50IHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKLSAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBjcmVhdGlvbiBvZiB0aGUgY29tcG9uZW50ICh1bmV4cGVjdGVkKQotICAgICAqCi0gICAgICogXHJldHZhbCBDMl9OT1RfRk9VTkQgbm8gc3VjaCBjb21wb25lbnQKLSAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgdGhlIGNvbXBvbmVudAotICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KEMyU3RyaW5nIG5hbWUsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgY29tcG9uZW50IGludGVyZmFjZS4KLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIFNIQUxMIHJldHVybiB3aXRoaW4gMTAwbXMuCi0gICAgICoKLSAgICAgKiBccGFyYW0gbmFtZSAgICAgICAgICBuYW1lIG9mIHRoZSBjb21wb25lbnQgaW50ZXJmYWNlIHRvIGNyZWF0ZQotICAgICAqIFxwYXJhbSBpbnRlcmZhY2UgICAgIHNoYXJlZCBwb2ludGVyIHdoZXJlIHRoZSBjcmVhdGVkIGludGVyZmFjZSBpcyBzdG9yZWQKLSAgICAgKgotICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBjb21wb25lbnQgaW50ZXJmYWNlIHdhcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseQotICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIGNvdWxkIG5vdCBjcmVhdGUgdGhlIGNvbXBvbmVudCBpbnRlcmZhY2Ugd2l0aGluIHRoZSB0aW1lIGxpbWl0Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgKHVuZXhwZWN0ZWQpCi0gICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgY3JlYXRpb24gb2YgdGhlIGNvbXBvbmVudCBpbnRlcmZhY2UKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodW5leHBlY3RlZCkKLSAgICAgKgotICAgICAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIG5vIHN1Y2ggY29tcG9uZW50IGludGVyZmFjZQotICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNyZWF0ZSB0aGUgY29tcG9uZW50IGludGVyZmFjZQotICAgICAqCi0gICAgICogXHRvZG8gRG8gd2UgbmVlZCBhbiBpbnRlcmZhY2UsIG9yIGNvdWxkIHRoaXMganVzdCBiZSBhIGNvbXBvbmVudCB0aGF0IGlzIG5ldmVyIHN0YXJ0ZWQ/Ci0gICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoQzJTdHJpbmcgbmFtZSwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgY29tcG9uZW50cyBzdXBwb3J0ZWQgYnkgdGhpcyBjb21wb25lbnQgc3RvcmUuCi0gICAgICoKLSAgICAgKiBUaGlzIG1ldGhvZCBTSEFMTCByZXR1cm4gd2l0aGluIDFtcy4KLSAgICAgKgotICAgICAqIFxyZXR2YWwgdmVjdG9yIG9mIGNvbXBvbmVudCBpbmZvcm1hdGlvbi4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMkNvbXBvbmVudEluZm8+PiBnZXRDb21wb25lbnRzKCk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVVElMSVRZIE1FVEhPRFMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8vIG9uLWRlbWFuZCBidWZmZXIgbGF5b3V0IGNvbnZlcnNpb24gKHN3aXp6bGluZykKLSAgICB2aXJ0dWFsIHN0YXR1c190IGNvcHlCdWZmZXIoc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0J1ZmZlcj4gc3JjLCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQnVmZmVyPiBkc3QpOwotCi0gICAgLy8gc3RhdHVzX3Qgc2VsZWN0UHJlZmVycmVkQ29sb3IoZm9ybWF0czxBPiwgZm9ybWF0czxCPik7Ci0KLSAgICAvLyBHTE9CQUwgU0VUVElOR1MKLSAgICAvLyBzeXN0ZW0td2lkZSBzdHJpZGUgJiBzbGljZS1oZWlnaHQgKD8/PykKLQotICAgIC8qKgotICAgICAqIFF1ZXJpZXMgYSBzZXQgb2Ygc3lzdGVtLXdpZGUgcGFyYW1ldGVycy4KLSAgICAgKiBRdWVyeWluZyBpcyBwZXJmb3JtZWQgYXQgYmVzdCBlZmZvcnQ6IHRoZSBzdG9yZSBTSEFMTCBxdWVyeSBhbGwgc3VwcG9ydGVkIHBhcmFtZXRlcnMgYW5kCi0gICAgICogc2tpcCB1bnN1cHBvcnRlZCBvbmVzLCBvciBoZWFwIGFsbG9jYXRlZCBwYXJhbWV0ZXJzIHRoYXQgY291bGQgbm90IGJlIGFsbG9jYXRlZC4gQW55IGVycm9ycwotICAgICAqIGFyZSBjb21tdW5pY2F0ZWQgaW4gdGhlIHJldHVybiB2YWx1ZS4gQWRkaXRpb25hbGx5LCBwcmVhbGxvY2F0ZWQgKGUuZy4gc3RhY2spIHBhcmFtZXRlcnMgdGhhdAotICAgICAqIGNvdWxkIG5vdCBiZSBxdWVyaWVkIGFyZSBpbnZhbGlkYXRlZC4gUGFyYW1ldGVycyB0byBiZSBhbGxvY2F0ZWQgb24gdGhlIGhlYXAgYXJlIG9taXR0ZWQgZnJvbQotICAgICAqIHRoZSByZXN1bHQuCi0gICAgICoKLSAgICAgKiBcbm90ZSBQYXJhbWV0ZXIgdmFsdWVzIGRvIG5vdCBkZXBlbmQgb24gdGhlIG9yZGVyIG9mIHF1ZXJ5LgotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCi0gICAgICoKLSAgICAgKiBccGFyYW0gc3RhY2tQYXJhbXMgICAgIGEgbGlzdCBvZiBwYXJhbXMgcXVlcmllZC4gVGhlc2UgYXJlIGluaXRpYWxpemVkIHNwZWNpZmljIHRvIGVhY2gKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nOyBlLmcuIHNpemUgYW5kIGluZGV4IGFyZSBzZXQgYW5kIHJlc3Qgb2YgdGhlIG1lbWJlcnMgYXJlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgY2xlYXJlZC4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBOT1RFOiBGbGV4aWJsZSBzZXR0aW5ncyB0aGF0IGFyZSBvZiBpbmNvcnJlY3Qgc2l6ZSB3aWxsIGJlIGludmFsaWRhdGVkLgotICAgICAqIFxwYXJhbSBoZWFwUGFyYW1JbmRpY2VzIGEgdmVjdG9yIG9mIHBhcmFtIGluZGljZXMgZm9yIHBhcmFtcyB0byBiZSBxdWVyaWVkIGFuZCByZXR1cm5lZCBvbiB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBoZWFwLiBUaGVzZSBwYXJhbWV0ZXJzIHdpbGwgYmUgcmV0dXJuZWQgaW4gaGVhcFBhcmFtcy4gVW5zdXBwb3J0ZWQgcGFyYW0KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzIHdpbGwgYmUgaWdub3JlZC4KLSAgICAgKiBccGFyYW0gaGVhcFBhcmFtcyAgICAgIGEgbGlzdCBvZiBwYXJhbXMgd2hlcmUgdG8gd2hpY2ggdGhlIHN1cHBvcnRlZCBoZWFwIHBhcmFtZXRlcnMgd2lsbCBiZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZGVkIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiBoZWFwUGFyYW1JbmRpY2VzLgotICAgICAqCi0gICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgYWxsIHBhcmFtZXRlcnMgY291bGQgYmUgcXVlcmllZAotICAgICAqIFxyZXR2YWwgQzJfQkFEX0lOREVYIGFsbCBzdXBwb3J0ZWQgcGFyYW1ldGVycyBjb3VsZCBiZSBxdWVyaWVkLCBidXQgc29tZSBwYXJhbWV0ZXJzIHdlcmUgbm90Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkCi0gICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgY291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgYSBzdXBwb3J0ZWQgcGFyYW1ldGVyCi0gICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgcXVlcnlpbmcgb2YgdGhlIHBhcmFtZXRlcnMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodW5leHBlY3RlZCkKLSAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5X25iKAotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKiBjb25zdD4gJnN0YWNrUGFyYW1zLAotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCi0gICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIGNvbnN0IGhlYXBQYXJhbXMpID0gMDsKLQotICAgIC8qKgotICAgICAqIFNldHMgYSBzZXQgb2Ygc3lzdGVtLXdpZGUgcGFyYW1ldGVycy4KLSAgICAgKgotICAgICAqIFxub3RlIFRoZXJlIGFyZSBubyBzZXR0YWJsZSBzeXN0ZW0td2lkZSBwYXJhbWV0ZXJzIGRlZmluZWQgdGh1cyBmYXIsIGJ1dCBtYXkgYmUgYWRkZWQgaW4gdGhlCi0gICAgICogZnV0dXJlLgotICAgICAqCi0gICAgICogVHVuaW5nIGlzIHBlcmZvcm1lZCBhdCBiZXN0IGVmZm9ydDogdGhlIHN0b3JlIFNIQUxMIHVwZGF0ZSBhbGwgc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb24gYXQKLSAgICAgKiBiZXN0IGVmZm9ydCAodW5sZXNzIGNvbmZpZ3VyZWQgb3RoZXJ3aXNlKSBhbmQgc2tpcCB1bnN1cHBvcnRlZCBvbmVzLiBBbnkgZXJyb3JzIGFyZQotICAgICAqIGNvbW11bmljYXRlZCBpbiB0aGUgcmV0dXJuIHZhbHVlIGFuZCBpbiB8ZmFpbHVyZXN8LgotICAgICAqCi0gICAgICogXG5vdGUgUGFyYW1ldGVyIHR1bmluZyBET0VTIGRlcGVuZCBvbiB0aGUgb3JkZXIgb2YgdGhlIHR1bmluZyBwYXJhbWV0ZXJzLiBFLmcuIHNvbWUgcGFyYW1ldGVyCi0gICAgICogdXBkYXRlIG1heSBhbGxvdyBzb21lIHN1YnNlcXVlbnQgcGFyYW1ldGVyIHVwZGF0ZS4KLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgotICAgICAqCi0gICAgICogXHBhcmFtIHBhcmFtcyAgICAgICAgICBhIGxpc3Qgb2YgcGFyYW1ldGVyIHVwZGF0ZXMuIFRoZXNlIHdpbGwgYmUgdXBkYXRlZCB0byB0aGUgYWN0dWFsCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIHZhbHVlcyBhZnRlciB0aGUgdXBkYXRlcyAodGhpcyBpcyBiZWNhdXNlIHR1bmluZyBpcyBwZXJmb3JtZWQKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhdCBiZXN0IGVmZm9ydCkuCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgXHRvZG8gcGFyYW1zIHRoYXQgY291bGQgbm90IGJlIHVwZGF0ZWQgYXJlIG5vdCBtYXJrZWQgaGVyZSwgc28gYXJlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgY29uZnVzaW5nIC0gYXJlIHRoZXkgImV4aXN0aW5nIiB2YWx1ZXMgb3IgaW50ZW5kZWQgdG8gYmUgY29uZmlndXJlZAotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz8KLSAgICAgKiBccGFyYW0gZmFpbHVyZXMgICAgICAgIGEgbGlzdCBvZiBwYXJhbWV0ZXIgZmFpbHVyZXMKLSAgICAgKgotICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIGFsbCBwYXJhbWV0ZXJzIGNvdWxkIGJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5Ci0gICAgICogXHJldHZhbCBDMl9CQURfSU5ERVggYWxsIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGNvdWxkIGJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LCBidXQgc29tZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgd2VyZSBub3Qgc3VwcG9ydGVkCi0gICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgc29tZSBzdXBwb3J0ZWQgcGFyYW1ldGVycyBjb3VsZCBub3QgYmUgdXBkYXRlZCBzdWNjZXNzZnVsbHkgYmVjYXVzZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoZXkgY29udGFpbmVkIHVuc3VwcG9ydGVkIHZhbHVlcy4gVGhlc2UgYXJlIHJldHVybmVkIGluIHxmYWlsdXJlc3wuCi0gICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgc29tZSBzdXBwb3J0ZWQgcGFyYW1ldGVycyBjb3VsZCBub3QgYmUgdXBkYXRlZCBzdWNjZXNzZnVsbHkgYmVjYXVzZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoZXkgY29udGFpbmVkIHVuc3VwcG9ydGVkIHZhbHVlcywgYnV0IGNvdWxkIG5vdCBhbGxvY2F0ZSBhIGZhaWx1cmUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgZm9yIHRoZW0uCi0gICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgdXBkYXRlIG9mIHRoZSBwYXJhbWV0ZXJzCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgKHVuZXhwZWN0ZWQpCi0gICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWdfbmIoCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKiBjb25zdD4gJnBhcmFtcywKLSAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIH5DMkNvbXBvbmVudFN0b3JlKCkgPSBkZWZhdWx0OwotfTsKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8vLyBAfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIEMyQ09NUE9ORU5UX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvaW5jbHVkZS9DMkNvbmZpZy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL2luY2x1ZGUvQzJDb25maWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBlOTE5My4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvaW5jbHVkZS9DMkNvbmZpZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEMyQ09ORklHX0hfCi0jZGVmaW5lIEMyQ09ORklHX0hfCi0KLSNpbmNsdWRlIDxDMlBhcmFtRGVmLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8vIFxkZWZncm91cCBjb25maWcgQ29tcG9uZW50IGNvbmZpZ3VyYXRpb24KLS8vLyBAewotCi0jaWZuZGVmIERFRklORV9DMl9FTlVNX1ZBTFVFX0FVVE9fSEVMUEVSCi0jZGVmaW5lIERFRklORV9DMl9FTlVNX1ZBTFVFX0FVVE9fSEVMUEVSKG5hbWUsIHR5cGUsIHByZWZpeCwgLi4uKQotI2RlZmluZSBERUZJTkVfQzJfRU5VTV9WQUxVRV9DVVNUT01fSEVMUEVSKG5hbWUsIHR5cGUsIG5hbWVzLCAuLi4pCi0jZW5kaWYKLQotI2RlZmluZSBDMkVOVU0obmFtZSwgdHlwZSwgLi4uKSBcCi1lbnVtIG5hbWUgOiB0eXBlIHsgX19WQV9BUkdTX18gfTsgXAotREVGSU5FX0MyX0VOVU1fVkFMVUVfQVVUT19IRUxQRVIobmFtZSwgdHlwZSwgTlVMTCwgX19WQV9BUkdTX18pCi0KLSNkZWZpbmUgQzJFTlVNX0NVU1RPTV9QUkVGSVgobmFtZSwgdHlwZSwgcHJlZml4LCAuLi4pIFwKLWVudW0gbmFtZSA6IHR5cGUgeyBfX1ZBX0FSR1NfXyB9OyBcCi1ERUZJTkVfQzJfRU5VTV9WQUxVRV9BVVRPX0hFTFBFUihuYW1lLCB0eXBlLCBwcmVmaXgsIF9fVkFfQVJHU19fKQotCi0jZGVmaW5lIEMyRU5VTV9DVVNUT01fTkFNRVMobmFtZSwgdHlwZSwgbmFtZXMsIC4uLikgXAotZW51bSBuYW1lIDogdHlwZSB7IF9fVkFfQVJHU19fIH07IFwKLURFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVIobmFtZSwgdHlwZSwgbmFtZXMsIF9fVkFfQVJHU19fKQotCi1lbnVtIEMyUGFyYW1JbmRleEtpbmQgOiB1aW50MzJfdCB7Ci0gICAgLy8vIGRvbWFpbgotICAgIGtQYXJhbUluZGV4RG9tYWluLAotCi0gICAgLy8vIGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRvcnMKLSAgICBrUGFyYW1JbmRleFN1cHBvcnRlZFBhcmFtcywKLSAgICBrUGFyYW1JbmRleFJlcXVpcmVkUGFyYW1zLAotICAgIGtQYXJhbUluZGV4UmVhZE9ubHlQYXJhbXMsCi0gICAga1BhcmFtSW5kZXhSZXF1ZXN0ZWRJbmZvcywKLQotICAgIC8vLyBsYXRlbmN5Ci0gICAga1BhcmFtSW5kZXhMYXRlbmN5LAotCi0gICAgLy8gZ2VuZXJpYyB0aW1lIGJlaGF2aW9yCi0gICAga1BhcmFtSW5kZXhUZW1wb3JhbCwKLQotICAgIC8vLyBwb3J0IGNvbmZpZ3VyYXRpb24KLSAgICBrUGFyYW1JbmRleE1pbWUsCi0gICAga1BhcmFtSW5kZXhTdHJlYW1Db3VudCwKLSAgICBrUGFyYW1JbmRleEZvcm1hdCwKLQotICAgIC8vIHZpZGVvIGluZm8KLQotICAgIGtQYXJhbUluZGV4U3RydWN0U3RhcnQgPSAweDEsCi0gICAga1BhcmFtSW5kZXhWaWRlb1NpemUsCi0gICAga1BhcmFtSW5kZXhNYXhWaWRlb1NpemVIaW50LAotCi0gICAga1BhcmFtSW5kZXhQYXJhbVN0YXJ0ID0gMHg4MDAsCi19OwotCi1DMkVOVU0oQzJEb21haW5LaW5kLCBpbnQzMl90LAotICAgIEMyRG9tYWluVmlkZW8sCi0gICAgQzJEb21haW5BdWRpbywKLSAgICBDMkRvbWFpbk90aGVyID0gQzJEb21haW5BdWRpbyArIDEKLSk7Ci0KLS8vIHJlYWQtb25seQotCi10eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyRG9tYWluS2luZD4sIGtQYXJhbUluZGV4RG9tYWluPiBDMkNvbXBvbmVudERvbWFpbkluZm87Ci0vLyB0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleERvbWFpbj4gQzJDb21wb25lbnREb21haW5JbmZvOwotLy9ERVNDUklCRV9URU1QTEFURURfQzJTVFJVQ1QoQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkRvbWFpbktpbmQ+LCB7IEMyRklFTEQobVZhbHVlLCAidmFsdWUiKSB9KTsKLQotLy8gcmVhZC1vbmx5Ci10eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMlVpbnQzMkFycmF5LCBrUGFyYW1JbmRleFN1cHBvcnRlZFBhcmFtcz4gQzJTdXBwb3J0ZWRQYXJhbXNJbmZvOwotCi0vLy8gXHRvZG8gZG8gd2UgZGVmaW5lIGl0IGFzIGEgcGFyYW0/Ci0vLyByZWFkLW9ubHkKLXR5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMyVWludDMyQXJyYXksIGtQYXJhbUluZGV4UmVxdWlyZWRQYXJhbXM+IEMyUmVxdWlyZWRQYXJhbXNJbmZvOwotCi0vLyByZWFkLW9ubHkKLXR5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMyVWludDMyQXJyYXksIGtQYXJhbUluZGV4UmVhZE9ubHlQYXJhbXM+IEMyUmVhZE9ubHlQYXJhbXNJbmZvOwotCi0vLyByZWFkLW9ubHkKLXR5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMyVWludDMyQXJyYXksIGtQYXJhbUluZGV4UmVxdWVzdGVkSW5mb3M+IEMyUmVxdWVzdGVkSW5mb3NJbmZvOwotCi0vLyByZWFkLW9ubHkKLS8vdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhSZXF1ZXN0ZWRJbmZvcz4gQzJSZXF1ZXN0ZWRJbmZvc0luZm87Ci0KLS8vLyBsYXRlbmN5Ci0KLXR5cGVkZWYgQzJQb3J0UGFyYW08QzJJbmZvLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleExhdGVuY3k+IEMyUG9ydExhdGVuY3lJbmZvOwotCi10eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleExhdGVuY3k+IEMyQ29tcG9uZW50TGF0ZW5jeUluZm87Ci0KLS8vLyBcdG9kbwotdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhUZW1wb3JhbD4gQzJDb21wb25lbnRUZW1wb3JhbEluZm87Ci0KLS8vLyBwb3J0IGNvbmZpZ3VyYXRpb24KLQotdHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJTdHJpbmdWYWx1ZSwga1BhcmFtSW5kZXhNaW1lPiBDMlBvcnRNaW1lQ29uZmlnOwotCi10eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleFN0cmVhbUNvdW50PiBDMlBvcnRTdHJlYW1Db3VudENvbmZpZzsKLQotdHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlN0cmluZ1ZhbHVlLCBrUGFyYW1JbmRleE1pbWU+IEMyU3RyZWFtTWltZUNvbmZpZzsKLQotQzJFTlVNKEMyRm9ybWF0S2luZCwgdWludDMyX3QsCi0gICAgQzJGb3JtYXRDb21wcmVzc2VkLAotICAgIEMyRm9ybWF0QXVkaW8gPSAxLAotICAgIEMyRm9ybWF0VmlkZW8gPSA0LAotKQotCi10eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4Rm9ybWF0PiBDMlN0cmVhbUZvcm1hdENvbmZpZzsKLQotLyoKLSAgIENvbXBvbmVudCBkZXNjcmlwdGlvbiBmaWVsZHM6Ci0KLS8vIGZvcm1hdCAodmlkZW8vY29tcHJlc3NlZC9hdWRpby9vdGhlci1kbyB3ZSBuZWVkIG90aGVyPykgcGVyIHN0cmVhbQotCi0vLyBsaWtlbHkgc29tZSBvZiB0aGVzZSBhcmUgZXhwb3NlZCBhcyBzZXBhcmF0ZSBzZXR0aW5nczoKLQotc3RydWN0IEMyQmFzZVR1bmluZyB7Ci0gICAgLy8gbGF0ZW5jeSBjaGFyYWN0ZXJpc3RpY3MKLSAgICB1aW50MzJfdCBsYXRlbmN5OwotICAgIGJvb2wgdGVtcG9yYWw7ICAgICAgICAgICAgICAgLy8gc2VlbXMgdGhpcyBvbmx5IG1ha2VzIHNlbnNlIGlmIGxhdGVuY3kgaXMgMS4uLiwgc28gdGhpcyBjb3VsZCBiZSBjYXB0dXJlZCBhcyBsYXRlbmN5ID0gMAotICAgIHVpbnQzMl90IGRlbGF5OwotCi0gICAgdWludDMyX3QgbnVtSW5wdXRTdHJlYW1zOyAgICAvLyBSVz8gLSBvciBzdWdnZXN0aW9uIG9ubHk6IFJPCi0gICAgdWludDMyX3QgbnVtT3V0cHV0U3RyZWFtczsgICAvLyBSVwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAvLyByZWZzIGNoYXJhY3RlcmlzdGljcyAocGVyIHN0cmVhbT8pCi0gICAgdWludDMyX3QgbWF4SW5wdXRSZWZzOyAgICAgICAvLyBSTwotICAgIHVpbnQzMl90IG1heE91dHB1dFJlZnM7ICAgICAgLy8gUk8KLSAgICB1aW50MzJfdCBtYXhJbnB1dE1lbW9yeTsgICAgIC8vIFJPIC0gbWF4IHRpbWUgcmVmcyBhcmUgaGVsZCBmb3IKLSAgICB1aW50MzJfdCBtYXhPdXRwdXRNZW1vcnk7ICAgIC8vIFJPCi0KLSAgICAvLyBwZXIgc3RyZWFtCi0gICAgYm9vbCBjb21wcmVzc2VkOwotICAgIC8vIGZvcm1hdC4uLiB2aWRlby9jb21wcmVzc2VkL2F1ZGlvL290aGVyPwotICAgIC8vIGFjdHVhbCAiYXVkaW8vdmlkZW8iIGZvcm1hdCB0eXBlCi0gICAgdWludDMyX3Qgd2lkdGgvaGVpZ2h0PyBpcyB0aGlzIG5lZWRlZCwgb3IganVzdCBxdWV1ZS4uLgotICAgIC8vIG1pbWUuLi4KLX07Ci0qLwotCi0KLQotCi0KLQotLy8gb3ZlcmFsbCBjb21wb25lbnQKLS8vICAgPT4gQzogZG9tYWluOiBhdWRpbyBvciB2aWRlbwotLy8gICA9PiBDOiBraW5kOiBkZWNvZGVyLCBlbmNvZGVyIG9yIGZpbHRlcgotLy8gICA9PiAibWltZSIgY2xhc3MKLQotLy8gICA9PiBDOiB0ZW1wb3JhbCAoYm9vbCkgPT4gZG9lcyB0aGlzIGRlcGVuZCBvbiBvcmRlcmluZz8KLS8vICAgPT4gSTogbGF0ZW5jeQotLy8gICA9PiBJOiBoaXN0b3J5IG1heCBkdXJhdGlvbi4uLgotLy8gICA9PiBJOiBoaXN0b3J5IG1heCBmcmFtZXMga2VwdC4uLgotLy8gICA9PiBJOiByZW9yZGVyaW5nIGRlcHRoCi0vLyAgID0+IEk6IGZyYyAoYm9vbCkgKHBlcmhhcHMgcmF0aW8/KQotLy8gICA9PiBJOiBjdXJyZW50IGZyYwotCi0vLyAgIC0gcGF1c2UKLS8vICAgPT4gbGFzdCBmcmFtZSAnbnVtYmVyJyBwcm9jZXNzZWQKLS8vICAgPT4gY3VycmVudCBmcmFtZSAnbnVtYmVyJyBwcm9jZXNzZWQKLS8vICAgPT4gaW52YWxpZCBzZXR0aW5ncyA9PltdCi0KLS8vIHZpZGVvIGRlY29kZXIgY29uZmlndXJhdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdWRpbwotLy8gICAtIGVuY29kaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC1lbmNvZGluZwotLy8gICAtIGhpbnQ6IG1heCB3aWR0aC9oZWlnaHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC1oaW50OiBzYW1wbGUgcmF0ZSwgY2hhbm5lbHMKLS8vICAgLSBoaW50OiBwcm9maWxlL2xldmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAtaGludDogdG9vbHMgdXNlZAotLy8gICAtIGhpbnQ6IGZyYW1lcmF0ZSAoYml0cmF0ZT8pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC1oaW50OiBiaXRyYXRlCi0vLyAgIC0gZGVmYXVsdDogY29sb3Igc3BhY2UgKGZyb20gY29udGFpbmVyKQotLy8gICAtIGhpbnQ6IGNvbG9yIGZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC1oaW50OiBwY20tZW5jb2RpbmcKLS8vICAgLSBoaW50OiAjIG9mIHZpZXdzIChlLmcuIE1WQykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAtaGludD86IGNoYW5uZWwgZ3JvdXBzCi0vLyAgIC0gZGVmYXVsdDogSERSIHN0YXRpYyBpbmZvIChmcm9tIGNvbnRhaW5lcikgICAgICAgICAgICAgICAgLy8gLWhpbnQ/OiBjaGFubmVsIG1hcHBpbmdzCi0vLyAgIC0gaGludDogcm90YXRpb24gKGUuZy4gZm9yIGFsbG9jYXRvcikKLQotLy8gPT4gIyBvZiBzdHJlYW1zIHJlcXVpcmVkIGFuZCB0aGVpciBmb3JtYXRzPyAoc2V0dGluZz8pCi0vLyA9PiAjIG9mIHN0cmVhbXMgcHJvZHVjZWQgYW5kIHRoZWlyIGZvcm1hdHM/ICh0dW5pbmcpCi0KLS8vID0+IG91dHB1dAotLy8gICAtICMgb2Ygdmlld3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC1jaGFubmVsIGdyb3VwcyAmJiBjaGFubmVsIG1hcHBpbmdzCi0vLyAgIC0gd2lkdGgvaGVpZ2h0L2Nyb3AvY29sb3IgZm9ybWF0L2NvbG9yIHNwYWNlL0hEUiBzdGF0aWMgaW5mbyAoZnJvbSBidWZmZXJzKQotLy8gICAgIChhcyByZXF1aXJlZCBieSB0aGUgYWxsb2NhdG9yICYgZnJhbWV3b3JrKQotLy8gICAtIFNFSSAob3IgZXF1aXZhbGVudCkgPD0gW3BvcnRdCi0vLyAgICAgLSBDQwotLy8gICAtIHJlZmVyZW5jZSBpbmZvCi0KLS8vIHZpZGVvIGVuY29kZXIgY29uZmlndXJhdGlvbnMKLS8vICAgLSBlbmNvZGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAtIGVuY29kaW5nCi0vLyAgIC0gaGludDogd2lkdGgvaGVpZ2h0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLSBoaW50OiBzYW1wbGUgcmF0ZSwgY2hhbm5lbHMKLS8vICAgLSBoaW50OiBmcmFtZSByYXRlCi0vLyAgIC0gaGludDogbWF4IHdpZHRoL2hlaWdodCAoPyBkb2VzIHRoaXMgZGlmZmVyIGZyb20gd2lkdGgvaGVpZ2h0PykKLS8vICAgLSAjIG9mIGlucHV0IChlLmcuIE1WQykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAtIGhpbnQ6ICMgZ3JvdXBzIGFuZCBtYXBwaW5ncwotLy8gICAtICMgb2Ygb3V0cHV0IChlLmcuIFNWQykgPT4gYml0cmF0ZXMvd2lkdGgvaGVpZ2h0L2ZyYW1lcmF0ZXM/IHBlciBzdHJlYW0KLS8vICAgLSBoaW50OiBwcm9maWxlL2xldmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAtIGhpbnQ6IHByb2ZpbGUvbGV2ZWwKLS8vICAgLSBIRFIgc3RhdGljIGluZm8gKyAoaW5mbzogSERSKQotLy8gICAtIGNvbG9yIHNwYWNlCi0vLyAgIC0gaGludDogY29sb3IgZm9ybWF0PyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLSBoaW50OiBwY20gZW5jb2RpbmcKLS8vICAgLSBTRUkKLS8vICAgICAtIENDCi0vLyAgIC0gcmVmZXJlbmNlIGRpcmVjdGl2ZQotLy8gICAtIGhpbnQ6IGJpdHJhdGUgKG9yIHF1YWxpdHkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC0gaGludDogYml0cmF0ZS9xdWFsaXR5Ci0vLyAgIC0gb3B0aW9uYWw6IGNvZGVjLXNwZWNpZmljIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgLy8gLSBvcHRpb25hbDogY3NkCi0KLS8vID0+IG91dHB1dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA9PiBvdXRwdXQKLS8vICAgLSBsYXllcnMgcGVyIHN0cmVhbT8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFLUFDMz8uLi4gRFRTPy4uLkRvbGJ5LVZpc2lvbj8KLS8vICAgLSByZWZlcmVuY2UgaW5mbwotCi0KLS8vIFJNOgotLy8gICAtIG5lZWQgU1BTIGZvciBmdWxsIGtub3dsZWRnZSA9PiBjb21wb25lbnQgc2hvdWxkIHJldHVybiBtYXguIChjb21wb25lbnQgY2FuIHVzZSBsZXNzKQotLy8gICAtIGNyaXRpY2FsIHBhcmFtZXRlcnM/IChpbnRlcmxhY2VkPyBwcm9maWxlPyBsZXZlbD8pCi0KLXN0cnVjdCBDMlZpZGVvU2l6ZVN0cnVjdCB7Ci0gICAgaW50MzJfdCBtV2lkdGg7ICAgICAvLy88IHZpZGVvIHdpZHRoCi0gICAgaW50MzJfdCBtSGVpZ2h0OyAgICAvLy88IHZpZGVvIGhlaWdodAotCi0gICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChWaWRlb1NpemUpCi0gICAgQzJGSUVMRChtV2lkdGgsICJ3aWR0aCIpCi0gICAgQzJGSUVMRChtSGVpZ2h0LCAiaGVpZ2h0IikKLX07Ci0KLS8vIHZpZGVvIHNpemUgZm9yIHZpZGVvIGRlY29kZXIgW09VVF0KLXR5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyVmlkZW9TaXplU3RydWN0PiBDMlZpZGVvU2l6ZVN0cmVhbUluZm87Ci0KLS8vIG1heCB2aWRlbyBzaXplIGZvciB2aWRlbyBkZWNvZGVyIFtJTl0KLXR5cGVkZWYgQzJQb3J0UGFyYW08QzJTZXR0aW5nLCBDMlZpZGVvU2l6ZVN0cnVjdCwga1BhcmFtSW5kZXhNYXhWaWRlb1NpemVIaW50PiBDMk1heFZpZGVvU2l6ZUhpbnRQb3J0U2V0dGluZzsKLQotLy8gdmlkZW8gZW5jb2RlciBzaXplIFtJTl0KLXR5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJWaWRlb1NpemVTdHJ1Y3Q+IEMyVmlkZW9TaXplU3RyZWFtVHVuaW5nOwotCi0vLy8gQH0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi9pbmNsdWRlL0MyUGFyYW0uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi9pbmNsdWRlL0MyUGFyYW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ0MzA2MS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvaW5jbHVkZS9DMlBhcmFtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEMyUEFSQU1fSF8KLSNkZWZpbmUgQzJQQVJBTV9IXwotCi0jaW5jbHVkZSA8QzIuaD4KLQotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxsaXN0PgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KLQotI2RlZmluZSBDMl9QQUNLIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8vIFxhZGR0b2dyb3VwIFBhcmFtZXRlcnMKLS8vLyBAewotCi0vLy8gXGRlZmdyb3VwIGludGVybmFsIEludGVybmFsIGhlbHBlcnMuCi0KLS8qIQotICogXGZpbGUKLSAqIFBBUkFNRVRFUlM6IFNFVFRJTkdzLCBUVU5JTkdzLCBhbmQgSU5GT3MKLSAqID09PQotICoKLSAqIFRoZXNlIHJlcHJlc2VudCBtaXNjZWxsYW5lb3VzIGNvbnRyb2wgYW5kIG1ldGFkYXRhIGluZm9ybWF0aW9uIGFuZCBhcmUgbGlrZWx5IGNvcGllZCBpbnRvCi0gKiBrZXJuZWwgc3BhY2UuIFRoZXJlZm9yZSwgdGhlc2UgYXJlIEMtbGlrZSBzdHJ1Y3R1cmVzIGRlc2lnbmVkIHRvIGNhcnJ5IGp1c3QgYSBzbWFsbCBhbW91bnQgb2YKLSAqIGluZm9ybWF0aW9uLiBXZSBhcmUgdXNpbmcgQysrIHRvIGJlIGFibGUgdG8gYWRkIGNvbnN0cnVjdG9ycywgYXMgd2VsbCBhcyBub24tdmlydHVhbCBhbmQgY2xhc3MKLSAqIG1ldGhvZHMuCi0gKgotICogPT1TcGVjaWZpY2F0aW9uIGRldGFpbHM6Ci0gKgotICogUmVzdHJpY3Rpb25zOgotICogICAtIG11c3QgYmUgUE9EIHN0cnVjdCwgZS5nLiBubyB2dGFibGUgKG5vIHZpcnR1YWwgZGVzdHJ1Y3RvcikKLSAqICAgLSBtdXN0IGhhdmUgdGhlIHNhbWUgc2l6ZSBpbiA2NC1iaXQgYW5kIDMyLWJpdCBtb2RlIChubyBzaXplX3QpCi0gKiAgIC0gYXMgc3VjaCwgbm8gcG9pbnRlciBtZW1iZXJzCi0gKgotICogQmVoYXZpb3I6Ci0gKiAtIFBhcmFtcyBjYW4gYmUgZ2xvYmFsIChub3QgcmVsYXRlZCB0byBpbnB1dCBvciBvdXRwdXQpLCByZWxhdGVkIHRvIGlucHV0IG9yIG91dHB1dCwKLSAqICAgb3IgcmVsYXRlZCB0byBhbiBpbnB1dC9vdXRwdXQgc3RyZWFtLgotICogLSBBbGwgcGFyYW1zIGFyZSBxdWVyaWVkL3NldCB1c2luZyBhIHVuaXF1ZSBwYXJhbSBpbmRleCwgd2hpY2ggaW5jb3Jwb3JhdGVzIGEgcG90ZW50aWFsIHN0cmVhbQotICogICBpbmRleCBhbmQvb3IgcG9ydC4KLSAqIC0gUXVlcnlpbmcgKHN1cHBvcnRlZCkgcGFyYW1zIE1VU1QgbmV2ZXIgZmFpbC4KLSAqIC0gQWxsIHBhcmFtcyBNVVNUIGhhdmUgZGVmYXVsdCB2YWx1ZXMuCi0gKiAtIElmIHNvbWUgZmllbGRzIGhhdmUgInVuc3VwcG9ydGVkIiBvciAiaW52YWxpZCIgdmFsdWVzIGR1cmluZyBzZXR0aW5nLCB0aGlzIFNIT1VMRCBiZQotICogICBjb21tdW5pY2F0ZWQgdG8gdGhlIGFwcC4KLSAqICAgYSkgSWRlYWxseSwgdGhpcyBzaG91bGQgYmUgYXZvaWRlZC4gIFdoZW4gc2V0dGluZyBwYXJhbWV0ZXJzLCBpbiBnZW5lcmFsLCBjb21wb25lbnQgc2hvdWxkIGRvCi0gKiAgICAgImJlc3QgZWZmb3J0IiB0byBhcHBseSBhbGwgc2V0dGluZ3MuIEl0IHNob3VsZCBjaGFuZ2UgImludmFsaWQvdW5zdXBwb3J0ZWQiIHZhbHVlcyB0byB0aGUKLSAqICAgICBuZWFyZXN0IHN1cHBvcnRlZCB2YWx1ZXMuCi0gKiAgIC0gVGhpcyBpcyBjb21tdW5pY2F0ZWQgdG8gdGhlIGNsaWVudCBieSBjaGFuZ2luZyB0aGUgc291cmNlIHZhbHVlcyBpbiB0dW5lKCkvCi0gKiAgICAgY29uZmlndXJlKCkuCi0gKiAgIGIpIElmIGZhbGxpbmcgYmFjayB0byBhIHN1cHBvcnRlZCB2YWx1ZSBpcyBhYnNvbHV0ZWx5IGltcG9zc2libGUsIHRoZSBjb21wb25lbnQgU0hBTEwgcmV0dXJuCi0gKiAgICAgYW4gZXJyb3IgZm9yIHRoZSBzcGVjaWZpYyBzZXR0aW5nLCBidXQgc2hvdWxkIGNvbnRpbnVlIHRvIGFwcGx5IG90aGVyIHNldHRpbmdzLgotICogICAgIFRPRE86IHRoaXMgY3VycmVudGx5IG1heSByZXN1bHQgaW4gdW5pbnRlbmRlZCByZXN1bHRzLgotICoKLSAqICoqTk9URToqKiB1bmxpa2UgT01YLCBwYXJhbXMgYXJlIG5vdCB2ZXJzaW9uZWQuIEluc3RlYWQsIGEgbmV3IHN0cnVjdCB3aXRoIG5ldyBiYXNlIGluZGV4Ci0gKiBTSEFMTCBiZSBhZGRlZCBhcyBuZXcgdmVyc2lvbnMgYXJlIHJlcXVpcmVkLgotICoKLSAqIFRoZSBwcm9wZXIgc3VidHlwZSAoU2V0dGluZywgSW5mbyBvciBQYXJhbSkgaXMgaW5jb3Jwb3JhdGVkIGludG8gdGhlIGNsYXNzIHR5cGUuIERlZmluZSBzdHJ1Y3RzCi0gKiB0byBkZWZpbmUgbXVsdGlwbGUgc3VidHlwZWQgdmVyc2lvbnMgb2YgcmVsYXRlZCBwYXJhbWV0ZXJzLgotICoKLSAqID09SW1wbGVtZW50YXRpb24gZGV0YWlsczoKLSAqCi0gKiAtIFVzZSBtYWNyb3MgdG8gZGVmaW5lIHBhcmFtZXRlcnMKLSAqIC0gQWxsIHBhcmFtZXRlcnMgbXVzdCBoYXZlIGEgZGVmYXVsdCBjb25zdHJ1Y3RvcgotICogICAtIFRoaXMgaXMgb25seSB1c2VkIGZvciBpbnN0YW50aWF0aW5nIHRoZSBjbGFzcyBpbiBzb3VyY2UgKGUuZy4gd2lsbCBub3QgYmUgdXNlZAotICogICAgIHdoZW4gYnVpbGRpbmcgYSBwYXJhbWV0ZXIgYnkgdGhlIGZyYW1ld29yayBmcm9tIGtleS92YWx1ZSBwYWlycy4pCi0gKi8KLQotLy8vIFxpbmdyb3VwIGludGVybmFsCi1zdHJ1Y3QgX0MyUGFyYW1NYW5pcHVsYXRvcjsKLQotLyoqCi0gKiBQYXJhbWV0ZXIgYmFzZSBjbGFzcy4KLSAqLwotc3RydWN0IEMyUGFyYW0gewotICAgIC8vIHBhcmFtIGluZGV4IGVuY29tcGFzc2VzIHRoZSBmb2xsb3dpbmc6Ci0gICAgLy8KLSAgICAvLyAtIHR5cGUgKHNldHRpbmcsIHR1bmluZywgaW5mbywgc3RydWN0KQotICAgIC8vIC0gdmVuZG9yIGV4dGVuc2lvbiBmbGFnCi0gICAgLy8gLSBmbGV4aWJsZSBwYXJhbWV0ZXIgZmxhZwotICAgIC8vIC0gZGlyZWN0aW9uIChnbG9iYWwsIGlucHV0LCBvdXRwdXQpCi0gICAgLy8gLSBzdHJlYW0gZmxhZwotICAgIC8vIC0gc3RyZWFtIElEICh1c3VhbGx5IDApCi0gICAgLy8KLSAgICAvLyBsYXlvdXQ6Ci0gICAgLy8KLSAgICAvLyAgICAgICstLS0tLS0rLS0tLS0rLS0tKy0tLS0tLSstLS0tLS0tLSstLS0tfC0tLS0tLSstLS0tLS0tLS0tLS0tLSsKLSAgICAvLyAgICAgIHwga2luZCB8IGRpciB8IC0gfHN0cmVhbXxzdHJlYW1JRHxmbGV4fHZlbmRvcnwgIGJhc2UgaW5kZXggIHwKLSAgICAvLyAgICAgICstLS0tLS0rLS0tLS0rLS0tKy0tLS0tLSstLS0tLS0tLSstLS0tKy0tLS0tLSstLS0tLS0tLS0tLS0tLSsKLSAgICAvLyAgYml0OiAzMS4uMzAgMjkuMjggICAgICAgMjUgICAyNCAuLiAxNyAgMTYgICAgMTUgICAxNCAgICAuLiAgICAgMAotICAgIC8vCi1wdWJsaWM6Ci0gICAgLyoqCi0gICAgICogQzJQYXJhbSBraW5kcywgdXNhYmxlIGFzIGJpdG1hcHMuCi0gICAgICovCi0gICAgZW51bSBLaW5kIDogdWludDMyX3QgewotICAgICAgICBOT05FICAgID0gMCwKLSAgICAgICAgU1RSVUNUICA9ICgxIDw8IDApLAotICAgICAgICBJTkZPICAgID0gKDEgPDwgMSksCi0gICAgICAgIFNFVFRJTkcgPSAoMSA8PCAyKSwKLSAgICAgICAgVFVOSU5HICA9ICgxIDw8IDMpIHwgU0VUVElORywgLy8gdHVuaW5ncyBhcmUgc2V0dGluZ3MKLSAgICB9OwotCi0gICAgLyoqCi0gICAgICogYmFzZSBpbmRleCAoaW5jbHVkaW5nIHRoZSB2ZW5kb3IgZXh0ZW5zaW9uIGJpdCkgaXMgYSBnbG9iYWwgaW5kZXggZm9yCi0gICAgICogQzIgcGFyYW1ldGVyIHN0cnVjdHMuIChlLmcuIHRoZSBzYW1lIGluZGljZXMgY2Fubm90IGJlIHJldXNlZCBmb3IgZGlmZmVyZW50Ci0gICAgICogc3RydWN0cyBmb3IgZGlmZmVyZW50IGNvbXBvbmVudHMpLgotICAgICAqLwotICAgIHN0cnVjdCBCYXNlSW5kZXggewotICAgIHByb3RlY3RlZDoKLSAgICAgICAgZW51bSA6IHVpbnQzMl90IHsKLSAgICAgICAgICAgIGtUeXBlTWFzayAgICAgID0gMHhDMDAwMDAwMCwKLSAgICAgICAgICAgIGtUeXBlU3RydWN0ICAgID0gMHgwMDAwMDAwMCwKLSAgICAgICAgICAgIGtUeXBlVHVuaW5nICAgID0gMHg0MDAwMDAwMCwKLSAgICAgICAgICAgIGtUeXBlU2V0dGluZyAgID0gMHg4MDAwMDAwMCwKLSAgICAgICAgICAgIGtUeXBlSW5mbyAgICAgID0gMHhDMDAwMDAwMCwKLQotICAgICAgICAgICAga0Rpck1hc2sgICAgICAgPSAweDMwMDAwMDAwLAotICAgICAgICAgICAga0Rpckdsb2JhbCAgICAgPSAweDIwMDAwMDAwLAotICAgICAgICAgICAga0RpclVuZGVmaW5lZCAgPSAweDMwMDAwMDAwLCAvLyBNVVNUIGhhdmUgYWxsIGJpdHMgc2V0Ci0gICAgICAgICAgICBrRGlySW5wdXQgICAgICA9IDB4MDAwMDAwMDAsCi0gICAgICAgICAgICBrRGlyT3V0cHV0ICAgICA9IDB4MTAwMDAwMDAsCi0KLSAgICAgICAgICAgIGtTdHJlYW1GbGFnICAgID0gMHgwMjAwMDAwMCwKLSAgICAgICAgICAgIGtTdHJlYW1JZE1hc2sgID0gMHgwMUZFMDAwMCwKLSAgICAgICAgICAgIGtTdHJlYW1JZFNoaWZ0ID0gMTcsCi0gICAgICAgICAgICBrU3RyZWFtSWRNYXggICA9IGtTdHJlYW1JZE1hc2sgPj4ga1N0cmVhbUlkU2hpZnQsCi0gICAgICAgICAgICBrU3RyZWFtTWFzayAgICA9IGtTdHJlYW1GbGFnIHwga1N0cmVhbUlkTWFzaywKLQotICAgICAgICAgICAga0ZsZXhpYmxlRmxhZyAgPSAweDAwMDEwMDAwLAotICAgICAgICAgICAga1ZlbmRvckZsYWcgICAgPSAweDAwMDA4MDAwLAotICAgICAgICAgICAga1BhcmFtTWFzayAgICAgPSAweDAwMDBGRkZGLAotICAgICAgICAgICAga0Jhc2VNYXNrICAgICAgPSBrUGFyYW1NYXNrIHwga0ZsZXhpYmxlRmxhZywKLSAgICAgICAgfTsKLQotICAgIHB1YmxpYzoKLSAgICAgICAgZW51bSA6IHVpbnQzMl90IHsKLSAgICAgICAgICAgIGtWZW5kb3JTdGFydCA9IGtWZW5kb3JGbGFnLCAvLy88IHZlbmRvciBzdHJ1Y3RzIFNIQUxMIHN0YXJ0IGFmdGVyIHRoaXMKLSAgICAgICAgICAgIF9rRmxleGlibGVGbGFnID0ga0ZsZXhpYmxlRmxhZywgLy8gVE9ETzogdGhpcyBpcyBvbmx5IG5lZWRlZCBmb3IgdGVzdGluZwotICAgICAgICB9OwotCi0gICAgICAgIC8vLyBjb25zdHJ1Y3Rvci9jb252ZXJzaW9uIGZyb20gdWludDMyX3QKLSAgICAgICAgaW5saW5lIEJhc2VJbmRleCh1aW50MzJfdCBpbmRleCkgOiBtSW5kZXgoaW5kZXgpIHsgfQotCi0gICAgICAgIC8vIG5vIGNvbnZlcnNpb24gZnJvbSB1aW50NjRfdAotICAgICAgICBpbmxpbmUgQmFzZUluZGV4KHVpbnQ2NF90IGluZGV4KSA9IGRlbGV0ZTsKLQotICAgICAgICAvLy8gcmV0dXJucyB0cnVlIGlmZiB0aGlzIGlzIGEgdmVuZG9yIGV4dGVuc2lvbiBwYXJhbWV0ZXIKLSAgICAgICAgaW5saW5lIGJvb2wgaXNWZW5kb3IoKSBjb25zdCB7IHJldHVybiBtSW5kZXggJiBrVmVuZG9yRmxhZzsgfQotCi0gICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSBmbGV4aWJsZSBwYXJhbWV0ZXIgKHdpdGggdmFyaWFibGUgc2l6ZSkKLSAgICAgICAgaW5saW5lIGJvb2wgaXNGbGV4aWJsZSgpIGNvbnN0IHsgcmV0dXJuIG1JbmRleCAmIGtGbGV4aWJsZUZsYWc7IH0KLQotICAgICAgICAvLy8gcmV0dXJucyB0aGUgYmFzZSB0eXBlOiB0aGUgaW5kZXggZm9yIHRoZSB1bmRlcmx5aW5nIHN0cnVjdAotICAgICAgICBpbmxpbmUgdW5zaWduZWQgaW50IGJhc2VJbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1JbmRleCAmIGtCYXNlTWFzazsgfQotCi0gICAgICAgIC8vLyByZXR1cm5zIHRoZSBwYXJhbSBpbmRleCBmb3IgdGhlIHVuZGVybHlpbmcgc3RydWN0Ci0gICAgICAgIGlubGluZSB1bnNpZ25lZCBpbnQgcGFyYW1JbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1JbmRleCAmIGtQYXJhbU1hc2s7IH0KLQotICAgICAgICBERUZJTkVfRklFTERfQkFTRURfQ09NUEFSSVNPTl9PUEVSQVRPUlMoQmFzZUluZGV4LCBtSW5kZXgpCi0KLSAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIHVpbnQzMl90IG1JbmRleDsKLSAgICB9OwotCi0gICAgLyoqCi0gICAgICogdHlwZSBlbmNvbXBhc3NlcyB0aGUgcGFyYW1ldGVyIGtpbmQgKHR1bmluZywgc2V0dGluZywgaW5mbyksIHdoZXRoZXIgdGhlCi0gICAgICogcGFyYW1ldGVyIGlzIGdsb2JhbCwgaW5wdXQgb3Igb3V0cHV0LCBhbmQgd2hldGhlciBpdCBpcyBmb3IgYSBzdHJlYW0uCi0gICAgICovCi0gICAgc3RydWN0IFR5cGUgOiBwdWJsaWMgQmFzZUluZGV4IHsKLSAgICAgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhIGdsb2JhbCBwYXJhbWV0ZXIgKG5vdCBmb3IgaW5wdXQgbm9yIG91dHB1dCkKLSAgICAgICAgaW5saW5lIGJvb2wgaXNHbG9iYWwoKSBjb25zdCB7IHJldHVybiAobUluZGV4ICYga0Rpck1hc2spID09IGtEaXJHbG9iYWw7IH0KLSAgICAgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhbiBpbnB1dCBvciBpbnB1dCBzdHJlYW0gcGFyYW1ldGVyCi0gICAgICAgIGlubGluZSBib29sIGZvcklucHV0KCkgY29uc3QgeyByZXR1cm4gKG1JbmRleCAmIGtEaXJNYXNrKSA9PSBrRGlySW5wdXQ7IH0KLSAgICAgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhbiBvdXRwdXQgb3Igb3V0cHV0IHN0cmVhbSBwYXJhbWV0ZXIKLSAgICAgICAgaW5saW5lIGJvb2wgZm9yT3V0cHV0KCkgY29uc3QgeyByZXR1cm4gKG1JbmRleCAmIGtEaXJNYXNrKSA9PSBrRGlyT3V0cHV0OyB9Ci0KLSAgICAgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhIHN0cmVhbSBwYXJhbWV0ZXIKLSAgICAgICAgaW5saW5lIGJvb2wgZm9yU3RyZWFtKCkgY29uc3QgeyByZXR1cm4gbUluZGV4ICYga1N0cmVhbUZsYWc7IH0KLSAgICAgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhIHBvcnQgKGlucHV0IG9yIG91dHB1dCkgcGFyYW1ldGVyCi0gICAgICAgIGlubGluZSBib29sIGZvclBvcnQoKSBjb25zdCAgIHsgcmV0dXJuICFmb3JTdHJlYW0oKSAmJiAhaXNHbG9iYWwoKTsgfQotCi0gICAgICAgIC8vLyByZXR1cm5zIHRoZSBwYXJhbWV0ZXIgdHlwZTogdGhlIHBhcmFtZXRlciBpbmRleCB3aXRob3V0IHRoZSBzdHJlYW0gSUQKLSAgICAgICAgaW5saW5lIHVpbnQzMl90IHR5cGUoKSBjb25zdCB7IHJldHVybiBtSW5kZXggJiAofmtTdHJlYW1JZE1hc2spOyB9Ci0KLSAgICAgICAgLy8vIHJldHVybiB0aGUga2luZCBvZiB0aGlzIHBhcmFtCi0gICAgICAgIGlubGluZSBLaW5kIGtpbmQoKSBjb25zdCB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1JbmRleCAmIGtUeXBlTWFzaykgewotICAgICAgICAgICAgICAgIGNhc2Uga1R5cGVTdHJ1Y3Q6IHJldHVybiBTVFJVQ1Q7Ci0gICAgICAgICAgICAgICAgY2FzZSBrVHlwZUluZm86IHJldHVybiBJTkZPOwotICAgICAgICAgICAgICAgIGNhc2Uga1R5cGVTZXR0aW5nOiByZXR1cm4gU0VUVElORzsKLSAgICAgICAgICAgICAgICBjYXNlIGtUeXBlVHVuaW5nOiByZXR1cm4gVFVOSU5HOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiBOT05FOyAvLyBzaG91bGQgbm90IGhhcHBlbgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIGNvbnN0cnVjdG9yL2NvbnZlcnNpb24gZnJvbSB1aW50MzJfdAotICAgICAgICBpbmxpbmUgVHlwZSh1aW50MzJfdCBpbmRleCkgOiBCYXNlSW5kZXgoaW5kZXgpIHsgfQotCi0gICAgICAgIC8vIG5vIGNvbnZlcnNpb24gZnJvbSB1aW50NjRfdAotICAgICAgICBpbmxpbmUgVHlwZSh1aW50NjRfdCBpbmRleCkgPSBkZWxldGU7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBmcmllbmQgc3RydWN0IEMyUGFyYW07ICAgLy8gZm9yIHNldFBvcnQoKQotICAgICAgICBmcmllbmQgc3RydWN0IEMyVHVuaW5nOyAgLy8gZm9yIGtUeXBlVHVuaW5nCi0gICAgICAgIGZyaWVuZCBzdHJ1Y3QgQzJTZXR0aW5nOyAvLyBmb3Iga1R5cGVTZXR0aW5nCi0gICAgICAgIGZyaWVuZCBzdHJ1Y3QgQzJJbmZvOyAgICAvLyBmb3Iga1R5cGVJbmZvCi0gICAgICAgIC8vIGZvciBrRGlyR2xvYmFsCi0gICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFMsIGludCBJLCBjbGFzcyBGPiBmcmllbmQgc3RydWN0IEMyR2xvYmFsUGFyYW07Ci0gICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFMsIGludCBJLCBjbGFzcyBGPiBmcmllbmQgc3RydWN0IEMyUG9ydFBhcmFtOyAgIC8vIGZvciBrRGlyKgotICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTLCBpbnQgSSwgY2xhc3MgRj4gZnJpZW5kIHN0cnVjdCBDMlN0cmVhbVBhcmFtOyAvLyBmb3Iga0RpcioKLSAgICAgICAgZnJpZW5kIHN0cnVjdCBfQzJQYXJhbUluc3BlY3RvcjsgLy8gZm9yIHRlc3RpbmcKLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgcG9ydC9zdHJlYW0gZGlyZWN0aW9uLgotICAgICAgICAgKiBAcmV0dXJuIHRydWUgb24gc3VjY2VzcywgZmFsc2UgaWYgY291bGQgbm90IHNldCBkaXJlY3Rpb24gKGUuZy4gaXQgaXMgZ2xvYmFsIHBhcmFtKS4KLSAgICAgICAgICovCi0gICAgICAgIGlubGluZSBib29sIHNldFBvcnQoYm9vbCBvdXRwdXQpIHsKLSAgICAgICAgICAgIGlmIChpc0dsb2JhbCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtSW5kZXggPSAobUluZGV4ICYgfmtEaXJNYXNrKSB8IChvdXRwdXQgPyBrRGlyT3V0cHV0IDoga0RpcklucHV0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBpbmRleCBlbmNvbXBhc3NlcyBhbGwgcmVtYWluaW5nIGluZm9ybWF0aW9uOiBiYXNpY2FsbHkgdGhlIHN0cmVhbSBJRC4KLSAgICAgKi8KLSAgICBzdHJ1Y3QgSW5kZXggOiBwdWJsaWMgVHlwZSB7Ci0gICAgICAgIC8vLyByZXR1cm5zIHRoZSBpbmRleCBhcyB1aW50MzJfdAotICAgICAgICBpbmxpbmUgb3BlcmF0b3IgdWludDMyX3QoKSBjb25zdCB7IHJldHVybiBtSW5kZXg7IH0KLQotICAgICAgICAvLy8gY29uc3RydWN0b3IvY29udmVyc2lvbiBmcm9tIHVpbnQzMl90Ci0gICAgICAgIGlubGluZSBJbmRleCh1aW50MzJfdCBpbmRleCkgOiBUeXBlKGluZGV4KSB7IH0KLQotICAgICAgICAvLyBubyBjb252ZXJzaW9uIGZyb20gdWludDY0X3QKLSAgICAgICAgaW5saW5lIEluZGV4KHVpbnQ2NF90IGluZGV4KSA9IGRlbGV0ZTsKLQotICAgICAgICAvLy8gcmV0dXJucyB0aGUgc3RyZWFtIElEIG9yIH4wIGlmIG5vdCBhIHN0cmVhbQotICAgICAgICBpbmxpbmUgdW5zaWduZWQgc3RyZWFtKCkgY29uc3QgewotICAgICAgICAgICAgcmV0dXJuIGZvclN0cmVhbSgpID8gcmF3U3RyZWFtKCkgOiB+MFU7Ci0gICAgICAgIH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGZyaWVuZCBzdHJ1Y3QgQzJQYXJhbTsgICAgICAgICAgIC8vIGZvciBzZXRTdHJlYW0sIG1ha2VTdHJlYW1JZCwgaXNWYWxpZAotICAgICAgICBmcmllbmQgc3RydWN0IF9DMlBhcmFtSW5zcGVjdG9yOyAvLyBmb3IgdGVzdGluZwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHR5cGUgaXMgdmFsaWQsIGUuZy4gZGlyZWN0aW9uIGlzIG5vdCB1bmRlZmluZWQgQU5ECi0gICAgICAgICAqIHN0cmVhbSBpcyAwIGlmIG5vdCBhIHN0cmVhbSBwYXJhbS4KLSAgICAgICAgICovCi0gICAgICAgIGlubGluZSBib29sIGlzVmFsaWQoKSBjb25zdCB7Ci0gICAgICAgICAgICAvLyB0aGVyZSBpcyBubyBUeXBlOjppc1ZhbGlkIChldmVuIHRob3VnaCBzb21lIG9mIHRoaXMgY2hlY2sgY291bGQgYmUKLSAgICAgICAgICAgIC8vIHBlcmZvcm1lZCBvbiB0eXBlcykgYXMgdGhpcyBpcyBvbmx5IHVzZWQgb24gaW5kZXguLi4KLSAgICAgICAgICAgIHJldHVybiAoZm9yU3RyZWFtKCkgPyByYXdTdHJlYW0oKSA8IGtTdHJlYW1JZE1heCA6IHJhd1N0cmVhbSgpID09IDApCi0gICAgICAgICAgICAgICAgICAgICYmIChtSW5kZXggJiBrRGlyTWFzaykgIT0ga0RpclVuZGVmaW5lZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyByZXR1cm5zIHRoZSByYXcgc3RyZWFtIElEIGZpZWxkCi0gICAgICAgIGlubGluZSB1bnNpZ25lZCByYXdTdHJlYW0oKSBjb25zdCB7Ci0gICAgICAgICAgICByZXR1cm4gKG1JbmRleCAmIGtTdHJlYW1JZE1hc2spID4+IGtTdHJlYW1JZFNoaWZ0OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIHJldHVybnMgdGhlIHN0cmVhbUlkIGJpdGZpZWxkIGZvciBhIGdpdmVuIHxzdHJlYW18LiBJZiBzdHJlYW0gaXMgaW52YWxpZCwKLSAgICAgICAgLy8vIHJldHVybnMgYW4gaW52YWxpZCBiaXRmaWVsZC4KLSAgICAgICAgaW5saW5lIHN0YXRpYyB1aW50MzJfdCBtYWtlU3RyZWFtSWQodW5zaWduZWQgc3RyZWFtKSB7Ci0gICAgICAgICAgICAvLyBzYXR1cmF0ZSBzdHJlYW0gSUQgKG1heCB2YWx1ZSBpcyBpbnZhbGlkKQotICAgICAgICAgICAgaWYgKHN0cmVhbSA+IGtTdHJlYW1JZE1heCkgewotICAgICAgICAgICAgICAgIHN0cmVhbSA9IGtTdHJlYW1JZE1heDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAoc3RyZWFtIDw8IGtTdHJlYW1JZFNoaWZ0KSAmIGtTdHJlYW1JZE1hc2s7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgc3RyZWFtIGluZGV4LgotICAgICAgICAgKiBccmV0dXJuIHRydWUgb24gc3VjY2VzcywgZmFsc2UgaWYgY291bGQgbm90IHNldCBpbmRleCAoZS5nLiBub3QgYSBzdHJlYW0gcGFyYW0pLgotICAgICAgICAgKi8KLSAgICAgICAgaW5saW5lIGJvb2wgc2V0U3RyZWFtKHVuc2lnbmVkIHN0cmVhbSkgewotICAgICAgICAgICAgaWYgKGZvclN0cmVhbSgpKSB7Ci0gICAgICAgICAgICAgICAgbUluZGV4ID0gKG1JbmRleCAmIH5rU3RyZWFtSWRNYXNrKSB8IG1ha2VTdHJlYW1JZChzdHJlYW0pOwotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLT5zdHJlYW0oKSA8IGtTdHJlYW1JZE1heDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH07Ci0KLXB1YmxpYzoKLSAgICAvLyBwdWJsaWMgZ2V0dGVycyBmb3IgSW5kZXggbWV0aG9kcwotCi0gICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhIHZlbmRvciBleHRlbnNpb24gcGFyYW1ldGVyCi0gICAgaW5saW5lIGJvb2wgaXNWZW5kb3IoKSBjb25zdCB7IHJldHVybiBfbUluZGV4LmlzVmVuZG9yKCk7IH0KLSAgICAvLy8gcmV0dXJucyB0cnVlIGlmZiB0aGlzIGlzIGEgZmxleGlibGUgcGFyYW1ldGVyCi0gICAgaW5saW5lIGJvb2wgaXNGbGV4aWJsZSgpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXguaXNGbGV4aWJsZSgpOyB9Ci0gICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhIGdsb2JhbCBwYXJhbWV0ZXIgKG5vdCBmb3IgaW5wdXQgbm9yIG91dHB1dCkKLSAgICBpbmxpbmUgYm9vbCBpc0dsb2JhbCgpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXguaXNHbG9iYWwoKTsgfQotICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYW4gaW5wdXQgb3IgaW5wdXQgc3RyZWFtIHBhcmFtZXRlcgotICAgIGlubGluZSBib29sIGZvcklucHV0KCkgY29uc3QgeyByZXR1cm4gX21JbmRleC5mb3JJbnB1dCgpOyB9Ci0gICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhbiBvdXRwdXQgb3Igb3V0cHV0IHN0cmVhbSBwYXJhbWV0ZXIKLSAgICBpbmxpbmUgYm9vbCBmb3JPdXRwdXQoKSBjb25zdCB7IHJldHVybiBfbUluZGV4LmZvck91dHB1dCgpOyB9Ci0KLSAgICAvLy8gcmV0dXJucyB0cnVlIGlmZiB0aGlzIGlzIGEgc3RyZWFtIHBhcmFtZXRlcgotICAgIGlubGluZSBib29sIGZvclN0cmVhbSgpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXguZm9yU3RyZWFtKCk7IH0KLSAgICAvLy8gcmV0dXJucyB0cnVlIGlmZiB0aGlzIGlzIGEgcG9ydCAoaW5wdXQgb3Igb3V0cHV0KSBwYXJhbWV0ZXIKLSAgICBpbmxpbmUgYm9vbCBmb3JQb3J0KCkgY29uc3QgICB7IHJldHVybiBfbUluZGV4LmZvclBvcnQoKTsgfQotCi0gICAgLy8vIHJldHVybnMgdGhlIHN0cmVhbSBJRCBvciB+MCBpZiBub3QgYSBzdHJlYW0KLSAgICBpbmxpbmUgdW5zaWduZWQgc3RyZWFtKCkgY29uc3QgeyByZXR1cm4gX21JbmRleC5zdHJlYW0oKTsgfQotCi0gICAgLy8vIHJldHVybnMgdGhlIHBhcmFtZXRlciB0eXBlOiB0aGUgcGFyYW1ldGVyIGluZGV4IHdpdGhvdXQgdGhlIHN0cmVhbSBJRAotICAgIGlubGluZSB1aW50MzJfdCB0eXBlKCkgY29uc3QgeyByZXR1cm4gX21JbmRleC50eXBlKCk7IH0KLQotICAgIC8vLyByZXR1cm5zIHRoZSBraW5kIG9mIHRoaXMgcGFyYW1ldGVyCi0gICAgaW5saW5lIEtpbmQga2luZCgpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXgua2luZCgpOyB9Ci0KLSAgICAvLy8gcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgcGFyYW1ldGVyIG9yIDAgaWYgdGhlIHBhcmFtZXRlciBpcyBpbnZhbGlkCi0gICAgaW5saW5lIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gX21TaXplOyB9Ci0KLSAgICAvLy8gcmV0dXJucyB0cnVlIGlmZiB0aGUgcGFyYW1ldGVyIGlzIHZhbGlkCi0gICAgaW5saW5lIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBfbUluZGV4LmlzVmFsaWQoKSAmJiBfbVNpemUgPiAwOyB9Ci0KLSAgICAvLy8gcmV0dXJucyB0cnVlIGlmZiB0aGUgcGFyYW1ldGVyIGlzIGludmFsaWQKLSAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciEoKSBjb25zdCB7IHJldHVybiAhb3BlcmF0b3IgYm9vbCgpOyB9Ci0KLSAgICAvLyBlcXVhbGl0eSBpcyBkb25lIGJ5IG1lbWNtcCAodXNlIGVxdWFscygpIHRvIHByZXZlbnQgYW55IG92ZXJyZWFkKQotICAgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgQzJQYXJhbSAmbykgY29uc3QgewotICAgICAgICByZXR1cm4gZXF1YWxzKG8pICYmIG1lbWNtcCh0aGlzLCAmbywgX21TaXplKSA9PSAwOwotICAgIH0KLSAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEMyUGFyYW0gJm8pIGNvbnN0IHsgcmV0dXJuICFvcGVyYXRvcj09KG8pOyB9Ci0KLSAgICAvLy8gc2FmZShyKSB0eXBlIGNhc3QgZnJvbSBwb2ludGVyIGFuZCBzaXplCi0gICAgaW5saW5lIHN0YXRpYyBDMlBhcmFtKiBGcm9tKHZvaWQgKmFkZHIsIHNpemVfdCBsZW4pIHsKLSAgICAgICAgLy8gX21TaXplIG11c3QgZml0IGludG8gc2l6ZQotICAgICAgICBpZiAobGVuIDwgc2l6ZW9mKF9tU2l6ZSkgKyBvZmZzZXRvZihDMlBhcmFtLCBfbVNpemUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICAgICAgfQotICAgICAgICAvLyBfbVNpemUgbXVzdCBtYXRjaCBsZW5ndGgKLSAgICAgICAgQzJQYXJhbSAqcGFyYW0gPSAoQzJQYXJhbSopYWRkcjsKLSAgICAgICAgaWYgKHBhcmFtLT5fbVNpemUgIT0gbGVuKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcGFyYW07Ci0gICAgfQotCi0jaWYgMAotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFAsIGNsYXNzPWRlY2x0eXBlKEMyUGFyYW0oUCgpKSk+Ci0gICAgUCAqQXMoKSB7IHJldHVybiBQOjpGcm9tKHRoaXMpOyB9Ci0gICAgdGVtcGxhdGU8dHlwZW5hbWUgUD4KLSAgICBjb25zdCBQICpBcygpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2Nhc3Q8Y29uc3QgUCo+KFA6OkZyb20oY29uc3RfY2FzdDxDMlBhcmFtKj4odGhpcykpKTsgfQotI2VuZGlmCi0KLXByb3RlY3RlZDoKLSAgICAvLy8gc2V0cyB0aGUgc3RyZWFtIGZpZWxkLiBSZXR1cm5zIHRydWUgaWZmIHN1Y2Nlc3NmdWwuCi0gICAgaW5saW5lIGJvb2wgc2V0U3RyZWFtKHVuc2lnbmVkIHN0cmVhbSkgewotICAgICAgICByZXR1cm4gX21JbmRleC5zZXRTdHJlYW0oc3RyZWFtKTsKLSAgICB9Ci0KLSAgICAvLy8gc2V0cyB0aGUgcG9ydCAoZGlyZWN0aW9uKS4gUmV0dXJucyB0cnVlIGlmZiBzdWNjZXNzZnVsLgotICAgIGlubGluZSBib29sIHNldFBvcnQoYm9vbCBvdXRwdXQpIHsKLSAgICAgICAgcmV0dXJuIF9tSW5kZXguc2V0UG9ydChvdXRwdXQpOwotICAgIH0KLQotcHVibGljOgotICAgIC8vLyBpbnZhbGlkYXRlIHRoaXMgcGFyYW1ldGVyLiBUaGVyZSBpcyBubyByZWNvdmVyeSBmcm9tIHRoaXMgY2FsbDsgZS5nLiBwYXJhbWV0ZXIKLSAgICAvLy8gY2Fubm90IGJlICdjb3JyZWN0ZWQnIHRvIGJlIHZhbGlkLgotICAgIGlubGluZSB2b2lkIGludmFsaWRhdGUoKSB7IF9tU2l6ZSA9IDA7IH0KLQotICAgIC8vIGlmIG90aGVyIGlzIHRoZSBzYW1lIGtpbmQgb2YgKHZhbGlkKSBwYXJhbSBhcyB0aGlzLCBjb3B5IGl0IGludG8gdGhpcyBhbmQgcmV0dXJuIHRydWUuCi0gICAgLy8gb3RoZXJ3aXNlLCBkbyBub3QgY29weSBhbnl0aGluZywgYW5kIHJldHVybiBmYWxzZS4KLSAgICBpbmxpbmUgYm9vbCB1cGRhdGVGcm9tKGNvbnN0IEMyUGFyYW0gJm90aGVyKSB7Ci0gICAgICAgIGlmIChvdGhlci5fbVNpemUgPT0gX21TaXplICYmIG90aGVyLl9tSW5kZXggPT0gX21JbmRleCAmJiBfbVNpemUgPiAwKSB7Ci0gICAgICAgICAgICBtZW1jcHkodGhpcywgJm90aGVyLCBfbVNpemUpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotcHJvdGVjdGVkOgotICAgIC8vIHJldHVybnMgfG98IGlmIGl0IGlzIGEgbnVsbCBwdHIsIG9yIGlmIGNhbiBzdWl0YWJseSBiZSBhIHBhcmFtIG9mIGdpdmVuIHx0eXBlfCAoZS5nLiBoYXMKLSAgICAvLyBzYW1lIHR5cGUgKGlnbm9yaW5nIHN0cmVhbSBJRCksIGFuZCBzaXplKS4gT3RoZXJ3aXNlLCByZXR1cm5zIG51bGwuIElmIHxjaGVja0RpcnwgaXMgZmFsc2UsCi0gICAgLy8gYWxsb3cgdW5kZWZpbmVkIG9yIGRpZmZlcmVudCBkaXJlY3Rpb24gKGUuZy4gYXMgY29uc3RydWN0ZWQgZnJvbSBDMlBvcnRQYXJhbSgpIHZzLgotICAgIC8vIEMyUG9ydFBhcmFtOjppbnB1dCksIGJ1dCBzdGlsbCByZXF1aXJlIGVxdWl2YWxlbnQgdHlwZSAoc3RyZWFtLCBwb3J0IG9yIGdsb2JhbCk7IG90aGVyd2lzZSwKLSAgICAvLyByZXR1cm4gbnVsbC4KLSAgICBpbmxpbmUgc3RhdGljIGNvbnN0IEMyUGFyYW0qIGlmU3VpdGFibGUoCi0gICAgICAgICAgICBjb25zdCBDMlBhcmFtKiBvLCBzaXplX3Qgc2l6ZSwgVHlwZSB0eXBlLCBzaXplX3QgZmxleFNpemUgPSAwLCBib29sIGNoZWNrRGlyID0gdHJ1ZSkgewotICAgICAgICBpZiAobyA9PSBudWxscHRyIHx8IG8tPl9tU2l6ZSA8IHNpemUgfHwgKGZsZXhTaXplICYmICgoby0+X21TaXplIC0gc2l6ZSkgJSBmbGV4U2l6ZSkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICAgICAgfSBlbHNlIGlmIChjaGVja0RpcikgewotICAgICAgICAgICAgcmV0dXJuIG8tPl9tSW5kZXgudHlwZSgpID09IHR5cGUubUluZGV4ID8gbyA6IG51bGxwdHI7Ci0gICAgICAgIH0gZWxzZSBpZiAoby0+X21JbmRleC5pc0dsb2JhbCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAoKG8tPl9tSW5kZXgudHlwZSgpIF4gdHlwZS5tSW5kZXgpICYgflR5cGU6OmtEaXJNYXNrKSA/IG51bGxwdHIgOiBvOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8vIGJhc2UgY29uc3RydWN0b3IKLSAgICBpbmxpbmUgQzJQYXJhbSh1aW50MzJfdCBwYXJhbVNpemUsIEluZGV4IHBhcmFtSW5kZXgpCi0gICAgICAgIDogX21TaXplKHBhcmFtU2l6ZSksCi0gICAgICAgICAgX21JbmRleChwYXJhbUluZGV4KSB7Ci0gICAgICAgIGlmIChwYXJhbVNpemUgPiBzaXplb2YoQzJQYXJhbSkpIHsKLSAgICAgICAgICAgIG1lbXNldCh0aGlzICsgMSwgMCwgcGFyYW1TaXplIC0gc2l6ZW9mKEMyUGFyYW0pKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vLyBiYXNlIGNvbnN0cnVjdG9yIHdpdGggc3RyZWFtIHNldAotICAgIGlubGluZSBDMlBhcmFtKHVpbnQzMl90IHBhcmFtU2l6ZSwgSW5kZXggcGFyYW1JbmRleCwgdW5zaWduZWQgc3RyZWFtKQotICAgICAgICA6IF9tU2l6ZShwYXJhbVNpemUpLAotICAgICAgICAgIF9tSW5kZXgocGFyYW1JbmRleCB8IEluZGV4OjptYWtlU3RyZWFtSWQoc3RyZWFtKSkgewotICAgICAgICBpZiAocGFyYW1TaXplID4gc2l6ZW9mKEMyUGFyYW0pKSB7Ci0gICAgICAgICAgICBtZW1zZXQodGhpcyArIDEsIDAsIHBhcmFtU2l6ZSAtIHNpemVvZihDMlBhcmFtKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFmb3JTdHJlYW0oKSkgewotICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi1wcml2YXRlOgotICAgIGZyaWVuZCBzdHJ1Y3QgX0MyUGFyYW1JbnNwZWN0b3I7IC8vIGZvciB0ZXN0aW5nCi0KLSAgICAvLy8gcmV0dXJucyB0aGUgYmFzZSB0eXBlOiB0aGUgaW5kZXggZm9yIHRoZSB1bmRlcmx5aW5nIHN0cnVjdCAoZm9yIHRlc3RpbmcKLSAgICAvLy8gYXMgdGhpcyBjYW4gYmUgZ290dGVuIGJ5IHRoZSBiYXNlSW5kZXggZW51bSkKLSAgICBpbmxpbmUgdWludDMyX3QgX2Jhc2VJbmRleCgpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXguYmFzZUluZGV4KCk7IH0KLQotICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHxvfCBoYXMgdGhlIHNhbWUgc2l6ZSBhbmQgaW5kZXggYXMgdGhpcy4gVGhpcyBwZXJmb3JtcyB0aGUKLSAgICAvLy8gYmFzaWMgY2hlY2sgZm9yIGVxdWFsaXR5LgotICAgIGlubGluZSBib29sIGVxdWFscyhjb25zdCBDMlBhcmFtICZvKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBfbVNpemUgPT0gby5fbVNpemUgJiYgX21JbmRleCA9PSBvLl9tSW5kZXg7Ci0gICAgfQotCi0gICAgdWludDMyX3QgX21TaXplOwotICAgIEluZGV4IF9tSW5kZXg7Ci19OwotCi0vLy8gXGluZ3JvdXAgaW50ZXJuYWwKLS8vLyBhbGxvdyBDMlBhcmFtcyBhY2Nlc3MgdG8gcHJpdmF0ZSBtZXRob2RzLCBlLmcuIGNvbnN0cnVjdG9ycwotI2RlZmluZSBDMlBBUkFNX01BS0VfRlJJRU5EUyBcCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgUywgaW50IEksIGNsYXNzIEY+IGZyaWVuZCBzdHJ1Y3QgQzJHbG9iYWxQYXJhbTsgXAotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIFMsIGludCBJLCBjbGFzcyBGPiBmcmllbmQgc3RydWN0IEMyUG9ydFBhcmFtOyBcCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgUywgaW50IEksIGNsYXNzIEY+IGZyaWVuZCBzdHJ1Y3QgQzJTdHJlYW1QYXJhbTsgXAotCi0vKioKLSAqIFNldHRpbmcgYmFzZSBzdHJ1Y3R1cmUgZm9yIGNvbXBvbmVudCBtZXRob2Qgc2lnbmF0dXJlcy4gV3JhcCBjb25zdHJ1Y3RvcnMuCi0gKi8KLXN0cnVjdCBDMlNldHRpbmcgOiBwdWJsaWMgQzJQYXJhbSB7Ci1wcm90ZWN0ZWQ6Ci0gICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KLSAgICBpbmxpbmUgQzJTZXR0aW5nKGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkgOiBDMlBhcmFtKGFyZ3MuLi4pIHsgfQotcHVibGljOiAvLyBUT0RPCi0gICAgZW51bSA6IHVpbnQzMl90IHsgaW5kZXhGbGFncyA9IFR5cGU6OmtUeXBlU2V0dGluZyB9OwotfTsKLQotLyoqCi0gKiBUdW5pbmcgYmFzZSBzdHJ1Y3R1cmUgZm9yIGNvbXBvbmVudCBtZXRob2Qgc2lnbmF0dXJlcy4gV3JhcCBjb25zdHJ1Y3RvcnMuCi0gKi8KLXN0cnVjdCBDMlR1bmluZyA6IHB1YmxpYyBDMlNldHRpbmcgewotcHJvdGVjdGVkOgotICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+Ci0gICAgaW5saW5lIEMyVHVuaW5nKGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkgOiBDMlNldHRpbmcoYXJncy4uLikgeyB9Ci1wdWJsaWM6IC8vIFRPRE8KLSAgICBlbnVtIDogdWludDMyX3QgeyBpbmRleEZsYWdzID0gVHlwZTo6a1R5cGVUdW5pbmcgfTsKLX07Ci0KLS8qKgotICogSW5mbyBiYXNlIHN0cnVjdHVyZSBmb3IgY29tcG9uZW50IG1ldGhvZCBzaWduYXR1cmVzLiBXcmFwIGNvbnN0cnVjdG9ycy4KLSAqLwotc3RydWN0IEMySW5mbyA6IHB1YmxpYyBDMlBhcmFtIHsKLXByb3RlY3RlZDoKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgotICAgIGlubGluZSBDMkluZm8oY29uc3QgQXJncygmLi4uIGFyZ3MpKSA6IEMyUGFyYW0oYXJncy4uLikgeyB9Ci1wdWJsaWM6IC8vIFRPRE8KLSAgICBlbnVtIDogdWludDMyX3QgeyBpbmRleEZsYWdzID0gVHlwZTo6a1R5cGVJbmZvIH07Ci19OwotCi0vKioKLSAqIFN0cnVjdHVyZSB1bmlxdWVseSBzcGVjaWZ5aW5nIGEgZmllbGQgaW4gYW4gYXJiaXRyYXJ5IHN0cnVjdHVyZS4KLSAqCi0gKiBcbm90ZSBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGRpZmZlcmVudGx5IGluIEMyRmllbGREZXNjcmlwdG9yIHRvCi0gKiBpZGVudGlmeSBhcnJheSBmaWVsZHMsIHN1Y2ggdGhhdCBfbVNpemUgaXMgdGhlIHNpemUgb2YgZWFjaCBlbGVtZW50LiBUaGlzIGlzCi0gKiBiZWNhdXNlIHRoZSBmaWVsZCBkZXNjcmlwdG9yIGNvbnRhaW5zIHRoZSBhcnJheS1sZW5ndGgsIGFuZCB3ZSB3YW50IHRvIGtlZXAKLSAqIGEgcmVsZXZhbnQgZWxlbWVudCBzaXplIGZvciB2YXJpYWJsZSBsZW5ndGggYXJyYXlzLgotICovCi1zdHJ1Y3QgX0MyRmllbGRJZCB7Ci0vL3B1YmxpYzoKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB1c2VkIGZvciBDMkZpZWxkRGVzY3JpcHRvciB0aGF0IHJlbW92ZXMgdGhlIGFycmF5IGV4dGVudC4KLSAgICAgKgotICAgICAqIFxwYXJhbVtpbl0gb2Zmc2V0IHBvaW50ZXIgdG8gdGhlIGZpZWxkIGluIGFuIG9iamVjdCBhdCBhZGRyZXNzIDAuCi0gICAgICovCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgY2xhc3MgQj10eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8VD46OnR5cGU+Ci0gICAgaW5saW5lIF9DMkZpZWxkSWQoVCogb2Zmc2V0KQotICAgICAgICA6IC8vIG9mZnNldCBpcyBmcm9tICIwIiBzbyB3aWxsIGZpdCBvbiAzMi1iaXRzCi0gICAgICAgICAgX21PZmZzZXQoKHVpbnQzMl90KSh1aW50cHRyX3QpKG9mZnNldCkpLAotICAgICAgICAgIF9tU2l6ZShzaXplb2YoQikpIHsgfQotCi0gICAgLyoqCi0gICAgICogRGlyZWN0IGNvbnN0cnVjdG9yIGZyb20gb2Zmc2V0IGFuZCBzaXplLgotICAgICAqCi0gICAgICogXHBhcmFtW2luXSBvZmZzZXQgb2Zmc2V0IG9mIHRoZSBmaWVsZC4KLSAgICAgKiBccGFyYW1baW5dIHNpemUgc2l6ZSBvZiB0aGUgZmllbGQuCi0gICAgICovCi0gICAgaW5saW5lIF9DMkZpZWxkSWQoc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpCi0gICAgICAgIDogX21PZmZzZXQob2Zmc2V0KSwgX21TaXplKHNpemUpIHt9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB1c2VkIHRvIGlkZW50aWZ5IGEgZmllbGQgaW4gYW4gb2JqZWN0LgotICAgICAqCi0gICAgICogXHBhcmFtIFVbdHlwZV0gcG9pbnRlciB0byB0aGUgb2JqZWN0IHRoYXQgY29udGFpbnMgdGhpcyBmaWVsZC4gVGhpcyBpcyBuZWVkZWQgaW4gY2FzZSB0aGUKLSAgICAgKiAgICAgICAgZmllbGQgaXMgaW4gYW4gKGluaGVyaXRlZCkgYmFzZSBjbGFzcywgaW4gd2hpY2ggY2FzZSBUIHdpbGwgYmUgdGhhdCBiYXNlIGNsYXNzLgotICAgICAqIFxwYXJhbSBwbVtpbV0gbWVtYmVyIHBvaW50ZXIgdG8gdGhlIGZpZWxkCi0gICAgICovCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgVCwgdHlwZW5hbWUgVSwgdHlwZW5hbWUgQj10eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8Uj46OnR5cGU+Ci0gICAgaW5saW5lIF9DMkZpZWxkSWQoVSAqLCBSIFQ6OiogcG0pCi0gICAgICAgIDogX21PZmZzZXQoKHVpbnQzMl90KSh1aW50cHRyX3QpKCYoKChVKikyNTYpLT4qcG0pKSAtIDI1NnUpLAotICAgICAgICAgIF9tU2l6ZShzaXplb2YoQikpIHsgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdXNlZCB0byBpZGVudGlmeSBhIGZpZWxkIGluIGFuIG9iamVjdC4KLSAgICAgKgotICAgICAqIFxwYXJhbSBVW3R5cGVdIHBvaW50ZXIgdG8gdGhlIG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoaXMgZmllbGQKLSAgICAgKiBccGFyYW0gcG1baW1dIG1lbWJlciBwb2ludGVyIHRvIHRoZSBmaWVsZAotICAgICAqLwotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIFQsIHR5cGVuYW1lIEI9dHlwZW5hbWUgc3RkOjpyZW1vdmVfZXh0ZW50PFI+Ojp0eXBlPgotICAgIGlubGluZSBfQzJGaWVsZElkKFIgVDo6KiBwbSkKLSAgICAgICAgOiBfbU9mZnNldCgodWludDMyX3QpKHVpbnRwdHJfdCkoJigoKFQqKTApLT4qcG0pKSksCi0gICAgICAgICAgX21TaXplKHNpemVvZihCKSkgeyB9Ci0KLSAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IF9DMkZpZWxkSWQgJm90aGVyKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBfbU9mZnNldCA9PSBvdGhlci5fbU9mZnNldCAmJiBfbVNpemUgPT0gb3RoZXIuX21TaXplOwotICAgIH0KLQotICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBfQzJGaWVsZElkICZvdGhlcikgY29uc3QgewotICAgICAgICByZXR1cm4gX21PZmZzZXQgPCBvdGhlci5fbU9mZnNldCB8fAotICAgICAgICAgICAgLy8gTk9URTogb3JkZXIgcGFyZW50IHN0cnVjdHVyZSBiZWZvcmUgc3ViIGZpZWxkCi0gICAgICAgICAgICAoX21PZmZzZXQgPT0gb3RoZXIuX21PZmZzZXQgJiYgX21TaXplID4gb3RoZXIuX21TaXplKTsKLSAgICB9Ci0KLSAgICBERUZJTkVfT1RIRVJfQ09NUEFSSVNPTl9PUEVSQVRPUlMoX0MyRmllbGRJZCkKLQotI2lmIDAKLSAgICBpbmxpbmUgdWludDMyX3Qgb2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gX21PZmZzZXQ7IH0KLSAgICBpbmxpbmUgdWludDMyX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9tU2l6ZTsgfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKEZSSUVORF9URVNUKQotICAgIGZyaWVuZCB2b2lkIFByaW50VG8oY29uc3QgX0MyRmllbGRJZCAmZCwgOjpzdGQ6Om9zdHJlYW0qKTsKLSNlbmRpZgotCi1wcml2YXRlOgotICAgIHVpbnQzMl90IF9tT2Zmc2V0OyAvLyBvZmZzZXQgb2YgZmllbGQKLSAgICB1aW50MzJfdCBfbVNpemU7ICAgLy8gc2l6ZSBvZiBmaWVsZAotfTsKLQotLyoqCi0gKiBTdHJ1Y3R1cmUgdW5pcXVlbHkgc3BlY2lmeWluZyBhIGZpZWxkIGluIGEgY29uZmlndXJhdGlvbgotICovCi1zdHJ1Y3QgQzJQYXJhbUZpZWxkIHsKLS8vcHVibGljOgotICAgIC8vIFRPRE86IGZpeCB3aGF0IHRoaXMgaXMgZm9yIFRbXSAoZm9yIG5vdyBzaXplIGJlY29tZXMgVFsxXSkKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTLCB0eXBlbmFtZSBUPgotICAgIGlubGluZSBDMlBhcmFtRmllbGQoUyogcGFyYW0sIFQqIG9mZnNldCkKLSAgICAgICAgOiBfbUluZGV4KHBhcmFtLT5pbmRleCgpKSwKLSAgICAgICAgICBfbUZpZWxkSWQob2Zmc2V0KSB7fQotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KLSAgICBpbmxpbmUgQzJQYXJhbUZpZWxkKFUgKnAsIFIgVDo6KiBwbSkgOiBfbUluZGV4KHAtPnR5cGUoKSksIF9tRmllbGRJZChwLCBwbSkgeyB9Ci0KLSAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEMyUGFyYW1GaWVsZCAmb3RoZXIpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIF9tSW5kZXggPT0gb3RoZXIuX21JbmRleCAmJiBfbUZpZWxkSWQgPT0gb3RoZXIuX21GaWVsZElkOwotICAgIH0KLQotICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBDMlBhcmFtRmllbGQgJm90aGVyKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBfbUluZGV4IDwgb3RoZXIuX21JbmRleCB8fAotICAgICAgICAgICAgKF9tSW5kZXggPT0gb3RoZXIuX21JbmRleCAmJiBfbUZpZWxkSWQgPCBvdGhlci5fbUZpZWxkSWQpOwotICAgIH0KLQotICAgIERFRklORV9PVEhFUl9DT01QQVJJU09OX09QRVJBVE9SUyhDMlBhcmFtRmllbGQpCi0KLXByaXZhdGU6Ci0gICAgQzJQYXJhbTo6SW5kZXggX21JbmRleDsKLSAgICBfQzJGaWVsZElkIF9tRmllbGRJZDsKLX07Ci0KLS8qKgotICogQSBzaGFyZWQgKHVuaW9uKSByZXByZXNlbnRhdGlvbiBvZiBudW1lcmljIHZhbHVlcwotICovCi1jbGFzcyBDMlZhbHVlIHsKLXB1YmxpYzoKLSAgICAvLy8gQSB1bmlvbiBvZiBzdXBwb3J0ZWQgcHJpbWl0aXZlIHR5cGVzLgotICAgIHVuaW9uIFByaW1pdGl2ZSB7Ci0gICAgICAgIGludDMyX3QgIGkzMjsgICAvLy88IGludDMyX3QgdmFsdWUKLSAgICAgICAgdWludDMyX3QgdTMyOyAgIC8vLzwgdWludDMyX3QgdmFsdWUKLSAgICAgICAgaW50NjRfdCAgaTY0OyAgIC8vLzwgaW50NjRfdCB2YWx1ZQotICAgICAgICB1aW50NjRfdCB1NjQ7ICAgLy8vPCB1aW50NjRfdCB2YWx1ZQotICAgICAgICBmbG9hdCAgICBmcDsgICAgLy8vPCBmbG9hdCB2YWx1ZQotCi0gICAgICAgIC8vIGNvbnN0cnVjdG9ycyAtIGltcGxpY2l0Ci0gICAgICAgIFByaW1pdGl2ZShpbnQzMl90IHZhbHVlKSAgOiBpMzIodmFsdWUpIHsgfQotICAgICAgICBQcmltaXRpdmUodWludDMyX3QgdmFsdWUpIDogdTMyKHZhbHVlKSB7IH0KLSAgICAgICAgUHJpbWl0aXZlKGludDY0X3QgdmFsdWUpICA6IGk2NCh2YWx1ZSkgeyB9Ci0gICAgICAgIFByaW1pdGl2ZSh1aW50NjRfdCB2YWx1ZSkgOiB1NjQodmFsdWUpIHsgfQotICAgICAgICBQcmltaXRpdmUoZmxvYXQgdmFsdWUpICAgIDogZnAodmFsdWUpICB7IH0KLQotICAgICAgICBQcmltaXRpdmUoKSA6IHU2NCgwKSB7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGZyaWVuZCBjbGFzcyBDMlZhbHVlOwotICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjb25zdCBUICZyZWYoKSBjb25zdDsKLSAgICB9OwotCi0gICAgZW51bSBUeXBlIHsKLSAgICAgICAgTk9fSU5JVCwKLSAgICAgICAgSU5UMzIsCi0gICAgICAgIFVJTlQzMiwKLSAgICAgICAgSU5UNjQsCi0gICAgICAgIFVJTlQ2NCwKLSAgICAgICAgRkxPQVQsCi0gICAgfTsKLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0YXRpYyBjb25zdGV4cHIgVHlwZSB0eXBlRm9yKCk7Ci0KLSAgICAvLyBjb25zdHJ1Y3RvcnMgLSBpbXBsaWNpdAotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgQzJWYWx1ZShUIHZhbHVlKSAgOiBtVHlwZSh0eXBlRm9yPFQ+KCkpLCAgbVZhbHVlKHZhbHVlKSB7IH0KLQotICAgIEMyVmFsdWUoKSA6IG1UeXBlKE5PX0lOSVQpIHsgfQotCi0gICAgaW5saW5lIFR5cGUgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1UeXBlOyB9Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgIGlubGluZSBib29sIGdldChUICp2YWx1ZSkgY29uc3QgewotICAgICAgICBpZiAobVR5cGUgPT0gdHlwZUZvcjxUPigpKSB7Ci0gICAgICAgICAgICAqdmFsdWUgPSBtVmFsdWUucmVmPFQ+KCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi1wcml2YXRlOgotICAgIFR5cGUgbVR5cGU7Ci0gICAgUHJpbWl0aXZlIG1WYWx1ZTsKLX07Ci0KLXRlbXBsYXRlPD4gY29uc3QgaW50MzJfdCAmQzJWYWx1ZTo6UHJpbWl0aXZlOjpyZWY8aW50MzJfdD4oKSBjb25zdCB7IHJldHVybiBpMzI7IH0KLXRlbXBsYXRlPD4gY29uc3QgaW50NjRfdCAmQzJWYWx1ZTo6UHJpbWl0aXZlOjpyZWY8aW50NjRfdD4oKSBjb25zdCB7IHJldHVybiBpNjQ7IH0KLXRlbXBsYXRlPD4gY29uc3QgdWludDMyX3QgJkMyVmFsdWU6OlByaW1pdGl2ZTo6cmVmPHVpbnQzMl90PigpIGNvbnN0IHsgcmV0dXJuIHUzMjsgfQotdGVtcGxhdGU8PiBjb25zdCB1aW50NjRfdCAmQzJWYWx1ZTo6UHJpbWl0aXZlOjpyZWY8dWludDY0X3Q+KCkgY29uc3QgeyByZXR1cm4gdTY0OyB9Ci10ZW1wbGF0ZTw+IGNvbnN0IGZsb2F0ICZDMlZhbHVlOjpQcmltaXRpdmU6OnJlZjxmbG9hdD4oKSBjb25zdCB7IHJldHVybiBmcDsgfQotCi10ZW1wbGF0ZTw+IGNvbnN0ZXhwciBDMlZhbHVlOjpUeXBlIEMyVmFsdWU6OnR5cGVGb3I8aW50MzJfdD4oKSB7IHJldHVybiBJTlQzMjsgfQotdGVtcGxhdGU8PiBjb25zdGV4cHIgQzJWYWx1ZTo6VHlwZSBDMlZhbHVlOjp0eXBlRm9yPGludDY0X3Q+KCkgeyByZXR1cm4gSU5UNjQ7IH0KLXRlbXBsYXRlPD4gY29uc3RleHByIEMyVmFsdWU6OlR5cGUgQzJWYWx1ZTo6dHlwZUZvcjx1aW50MzJfdD4oKSB7IHJldHVybiBVSU5UMzI7IH0KLXRlbXBsYXRlPD4gY29uc3RleHByIEMyVmFsdWU6OlR5cGUgQzJWYWx1ZTo6dHlwZUZvcjx1aW50NjRfdD4oKSB7IHJldHVybiBVSU5UNjQ7IH0KLXRlbXBsYXRlPD4gY29uc3RleHByIEMyVmFsdWU6OlR5cGUgQzJWYWx1ZTo6dHlwZUZvcjxmbG9hdD4oKSB7IHJldHVybiBGTE9BVDsgfQotCi0vKioKLSAqIGZpZWxkIGRlc2NyaXB0b3IuIEEgZmllbGQgaXMgdW5pcXVlbHkgZGVmaW5lZCBieSBhbiBpbmRleCBpbnRvIGEgcGFyYW1ldGVyLgotICogKE5vdGU6IFN0cmVhbS1pZCBpcyBub3QgY2FwdHVyZWQgYXMgYSBmaWVsZC4pCi0gKgotICogT3JkZXJpbmcgb2YgZmllbGRzIGlzIGJ5IG9mZnNldC4gSW4gY2FzZSBvZiBzdHJ1Y3R1cmVzLCBpdCBpcyBkZXB0aCBmaXJzdCwKLSAqIHdpdGggYSBzdHJ1Y3R1cmUgdGFraW5nIGFuIGluZGV4IGp1c3QgYmVmb3JlIGFuZCBpbiBhZGRpdGlvbiB0byBpdHMgbWVtYmVycy4KLSAqLwotc3RydWN0IEMyRmllbGREZXNjcmlwdG9yIHsKLS8vcHVibGljOgotICAgIC8qKiBmaWVsZCB0eXBlcyBhbmQgZmxhZ3MKLSAgICAgKiBcbm90ZTogb25seSAzMi1iaXQgYW5kIDY0LWJpdCBmaWVsZHMgYXJlIHN1cHBvcnRlZCAoZS5nLiBubyBib29sZWFuLCBhcyB0aGF0Ci0gICAgICogaXMgcmVwcmVzZW50ZWQgdXNpbmcgSU5UMzIpLgotICAgICAqLwotICAgIGVudW0gVHlwZSA6IHVpbnQzMl90IHsKLSAgICAgICAgLy8gcHJpbWl0aXZlIHR5cGVzCi0gICAgICAgIElOVDMyICAgPSBDMlZhbHVlOjpJTlQzMiwgIC8vLzwgMzItYml0IHNpZ25lZCBpbnRlZ2VyCi0gICAgICAgIFVJTlQzMiAgPSBDMlZhbHVlOjpVSU5UMzIsIC8vLzwgMzItYml0IHVuc2lnbmVkIGludGVnZXIKLSAgICAgICAgSU5UNjQgICA9IEMyVmFsdWU6OklOVDY0LCAgLy8vPCA2NC1iaXQgc2lnbmVkIGludGVnZXIKLSAgICAgICAgVUlOVDY0ICA9IEMyVmFsdWU6OlVJTlQ2NCwgLy8vPCA2NC1iaXQgc2lnbmVkIGludGVnZXIKLSAgICAgICAgRkxPQVQgICA9IEMyVmFsdWU6OkZMT0FULCAgLy8vPCAzMi1iaXQgZmxvYXRpbmcgcG9pbnQKLQotICAgICAgICAvLyBhcnJheSB0eXBlcwotICAgICAgICBTVFJJTkcgPSAweDEwMCwgLy8vPCBmaXhlZC1zaXplIHN0cmluZyAoUE9EKQotICAgICAgICBCTE9CLCAgICAgICAgICAgLy8vPCBibG9iLiBCbG9icyBoYXZlIG5vIHN1Yi1lbGVtZW50cyBhbmQgY2FuIGJlIHRob3VnaHQgb2YgYXMgYnl0ZSBhcnJheXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLy88IGhvd2V2ZXIsIGJ5dGVzIGNhbm5vdCBiZSBpbmRpdmlkdWFsbHkgYWRkcmVzc2VkIGJ5IGNsaWVudHMuCi0KLSAgICAgICAgLy8gY29tcGxleCB0eXBlcwotICAgICAgICBTVFJVQ1RfRkxBRyA9IDB4MTAwMDAsIC8vLzwgc3RydWN0cy4gTWFya2VkIHdpdGggdGhpcyBmbGFnIGluIGFkZGl0aW9uIHRvIHRoZWlyIGJhc2VJbmRleC4KLSAgICB9OwotCi0gICAgdHlwZWRlZiBzdGQ6OnBhaXI8QzJTdHJpbmcsIEMyVmFsdWU6OlByaW1pdGl2ZT4gbmFtZWRfdmFsdWVfdHlwZTsKLSAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPGNvbnN0IG5hbWVkX3ZhbHVlX3R5cGU+IG5hbWVkX3ZhbHVlc190eXBlOwotICAgIC8vdHlwZWRlZiBzdGQ6OnBhaXI8c3RkOjp2ZWN0b3I8QzJTdHJpbmc+LCBzdGQ6OnZlY3RvcjxDMlZhbHVlOjpQcmltaXRpdmU+PiBuYW1lZF92YWx1ZXNfdHlwZTsKLQotICAgIC8qKgotICAgICAqIFRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIHRoYXQgcmV0dXJucyB0aGUgbmFtZWQgdmFsdWVzIGZvciBhIHR5cGUuCi0gICAgICoKLSAgICAgKiBcdG9kbyBoaWRlIGZyb20gY2xpZW50LgotICAgICAqCi0gICAgICogXHJldHVybiBhIHZlY3RvciBvZiBuYW1lLXZhbHVlIHBhaXJzLgotICAgICAqLwotICAgIHRlbXBsYXRlPHR5cGVuYW1lIEI+Ci0gICAgc3RhdGljIG5hbWVkX3ZhbHVlc190eXBlIG5hbWVkVmFsdWVzRm9yKGNvbnN0IEIgJik7Ci0KLSAgICBpbmxpbmUgQzJGaWVsZERlc2NyaXB0b3IodWludDMyX3QgdHlwZSwgdWludDMyX3QgbGVuZ3RoLCBDMlN0cmluZ0xpdGVyYWwgbmFtZSwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpCi0gICAgICAgIDogX21UeXBlKChUeXBlKXR5cGUpLCBfbUxlbmd0aChsZW5ndGgpLCBfbU5hbWUobmFtZSksIF9tRmllbGRJZChvZmZzZXQsIHNpemUpIHsgfQotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgY2xhc3MgQj10eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8VD46OnR5cGU+Ci0gICAgaW5saW5lIEMyRmllbGREZXNjcmlwdG9yKGNvbnN0IFQqIG9mZnNldCwgY29uc3QgY2hhciAqbmFtZSkKLSAgICAgICAgOiBfbVR5cGUodGhpcy0+Z2V0VHlwZSgoQiopbnVsbHB0cikpLAotICAgICAgICAgIF9tTGVuZ3RoKHN0ZDo6aXNfYXJyYXk8VD46OnZhbHVlID8gc3RkOjpleHRlbnQ8VD46OnZhbHVlIDogMSksCi0gICAgICAgICAgX21OYW1lKG5hbWUpLAotICAgICAgICAgIF9tTmFtZWRWYWx1ZXMobmFtZWRWYWx1ZXNGb3IoKihCKikwKSksCi0gICAgICAgICAgX21GaWVsZElkKG9mZnNldCkge30KLQotLyoKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBCPXR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2V4dGVudDxUPjo6dHlwZT4KLSAgICBpbmxpbmUgQzJGaWVsZERlc2NyaXB0b3I8VCwgQiwgZmFsc2U+KFQqIG9mZnNldCwgY29uc3QgY2hhciAqbmFtZSkKLSAgICAgICAgOiBfbVR5cGUodGhpcy0+Z2V0VHlwZSgoQiopbnVsbHB0cikpLAotICAgICAgICAgIF9tTGVuZ3RoKHN0ZDo6aXNfYXJyYXk8VD46OnZhbHVlID8gc3RkOjpleHRlbnQ8VD46OnZhbHVlIDogMSksCi0gICAgICAgICAgX21OYW1lKG5hbWUpLAotICAgICAgICAgIF9tRmllbGRJZChvZmZzZXQpIHt9Ci0qLwotCi0gICAgLy8vIFxkZXByZWNhdGVkCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUywgY2xhc3MgQj10eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8VD46OnR5cGU+Ci0gICAgY29uc3RleHByIGlubGluZSBDMkZpZWxkRGVzY3JpcHRvcihTKiwgVCBTOjoqIGZpZWxkLCBjb25zdCBjaGFyICpuYW1lKQotICAgICAgICA6IF9tVHlwZSh0aGlzLT5nZXRUeXBlKChCKiludWxscHRyKSksCi0gICAgICAgICAgX21MZW5ndGgoc3RkOjppc19hcnJheTxUPjo6dmFsdWUgPyBzdGQ6OmV4dGVudDxUPjo6dmFsdWUgOiAxKSwKLSAgICAgICAgICBfbU5hbWUobmFtZSksCi0gICAgICAgICAgX21GaWVsZElkKCYoKChTKikwKS0+KmZpZWxkKSkge30KLQotICAgIC8vLyByZXR1cm5zIHRoZSB0eXBlIG9mIHRoaXMgZmllbGQKLSAgICBpbmxpbmUgVHlwZSB0eXBlKCkgY29uc3QgeyByZXR1cm4gX21UeXBlOyB9Ci0gICAgLy8vIHJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgZmllbGQgaW4gY2FzZSBpdCBpcyBhbiBhcnJheS4gUmV0dXJucyAwIGZvcgotICAgIC8vLyBUW10gYXJyYXlzLCByZXR1cm5zIDEgZm9yIFRbMV0gYXJyYXlzIGFzIHdlbGwgYXMgaWYgdGhlIGZpZWxkIGlzIG5vdCBhbiBhcnJheS4KLSAgICBpbmxpbmUgc2l6ZV90IGxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIF9tTGVuZ3RoOyB9Ci0gICAgLy8vIHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGZpZWxkCi0gICAgaW5saW5lIEMyU3RyaW5nTGl0ZXJhbCBuYW1lKCkgY29uc3QgeyByZXR1cm4gX21OYW1lOyB9Ci0KLSAgICBjb25zdCBuYW1lZF92YWx1ZXNfdHlwZSAmbmFtZWRWYWx1ZXMoKSBjb25zdCB7IHJldHVybiBfbU5hbWVkVmFsdWVzOyB9Ci0KLSNpZiBkZWZpbmVkKEZSSUVORF9URVNUKQotICAgIGZyaWVuZCB2b2lkIFByaW50VG8oY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJiwgOjpzdGQ6Om9zdHJlYW0qKTsKLSAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICYsIGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICYpOwotICAgIEZSSUVORF9URVNUKEMyUGFyYW1UZXN0X1BhcmFtRmllbGRMaXN0LCBWZXJpZnlTdHJ1Y3QpOwotI2VuZGlmCi0KLXByaXZhdGU6Ci0gICAgY29uc3QgVHlwZSBfbVR5cGU7Ci0gICAgY29uc3QgdWludDMyX3QgX21MZW5ndGg7IC8vIHRoZSBsYXN0IG1lbWJlciBjYW4gYmUgYXJiaXRyYXJ5IGxlbmd0aCBpZiBpdCBpcyBUW10gYXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgIC8vIGV4dGVuZGluZyB0byB0aGUgZW5kIG9mIHRoZSBwYXJhbWV0ZXIgKHRoaXMgaXMgbWFya2VkIHdpdGgKLSAgICAgICAgICAgICAgICAgICAgICAgLy8gMCkuIFRbMF0tcyBhcmUgbm90IGZpZWxkcy4KLSAgICBjb25zdCBDMlN0cmluZ0xpdGVyYWwgX21OYW1lOwotICAgIGNvbnN0IG5hbWVkX3ZhbHVlc190eXBlIF9tTmFtZWRWYWx1ZXM7Ci0KLSAgICBjb25zdCBfQzJGaWVsZElkIF9tRmllbGRJZDsgICAvLyBmaWVsZCBpZGVudGlmaWVyIChvZmZzZXQgYW5kIHNpemUpCi0KLSAgICAvLyBOT1RFOiBXZSBkbyBub3QgY2FwdHVyZSBkZWZhdWx0IHZhbHVlKHMpIGhlcmUgYXMgdGhhdCBtYXkgZGVwZW5kIG9uIHRoZSBjb21wb25lbnQuCi0gICAgLy8gTk9URTogV2UgYWxzbyBkbyBub3QgY2FwdHVyZSBiZXN0RWZmb3J0LCBhcyAxKSB0aGlzIHNob3VsZCBiZSB0cnVlIGZvciBtb3N0IGZpZWxkcywKLSAgICAvLyAyKSB0aGlzIGlzIGF0IHBhcmFtZXRlciBncmFudWxhcml0eS4KLQotICAgIC8vIHR5cGUgcmVzb2x1dGlvbgotICAgIGlubGluZSBzdGF0aWMgVHlwZSBnZXRUeXBlKGludDMyX3QqKSAgeyByZXR1cm4gSU5UMzI7IH0KLSAgICBpbmxpbmUgc3RhdGljIFR5cGUgZ2V0VHlwZSh1aW50MzJfdCopIHsgcmV0dXJuIFVJTlQzMjsgfQotICAgIGlubGluZSBzdGF0aWMgVHlwZSBnZXRUeXBlKGludDY0X3QqKSAgeyByZXR1cm4gSU5UNjQ7IH0KLSAgICBpbmxpbmUgc3RhdGljIFR5cGUgZ2V0VHlwZSh1aW50NjRfdCopIHsgcmV0dXJuIFVJTlQ2NDsgfQotICAgIGlubGluZSBzdGF0aWMgVHlwZSBnZXRUeXBlKGZsb2F0KikgICAgeyByZXR1cm4gRkxPQVQ7IH0KLSAgICBpbmxpbmUgc3RhdGljIFR5cGUgZ2V0VHlwZShjaGFyKikgICAgIHsgcmV0dXJuIFNUUklORzsgfQotICAgIGlubGluZSBzdGF0aWMgVHlwZSBnZXRUeXBlKHVpbnQ4X3QqKSAgeyByZXR1cm4gQkxPQjsgfQotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwKLSAgICAgICAgICAgICBjbGFzcz10eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2VudW08VD46OnZhbHVlPjo6dHlwZT4KLSAgICBpbmxpbmUgc3RhdGljIFR5cGUgZ2V0VHlwZShUKikgewotICAgICAgICB0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxUPjo6dHlwZSB1bmRlcmx5aW5nKDApOwotICAgICAgICByZXR1cm4gZ2V0VHlwZSgmdW5kZXJseWluZyk7Ci0gICAgfQotCi0gICAgLy8gdmVyaWZ5IEMyU3RydWN0IGJ5IGhhdmluZyBhIGZpZWxkTGlzdCBhbmQgYSBiYXNlSW5kZXguCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwKLSAgICAgICAgICAgICBjbGFzcz1kZWNsdHlwZShUOjpiYXNlSW5kZXggKyAxKSwgY2xhc3M9ZGVjbHR5cGUoVDo6ZmllbGRMaXN0KT4KLSAgICBpbmxpbmUgc3RhdGljIFR5cGUgZ2V0VHlwZShUKikgewotICAgICAgICBzdGF0aWNfYXNzZXJ0KCFzdGQ6OmlzX2Jhc2Vfb2Y8QzJQYXJhbSwgVD46OnZhbHVlLCAiY2Fubm90IHVzZSBDMlBhcmFtcyBhcyBmaWVsZHMiKTsKLSAgICAgICAgcmV0dXJuIChUeXBlKShUOjpiYXNlSW5kZXggfCBTVFJVQ1RfRkxBRyk7Ci0gICAgfQotfTsKLQotI2RlZmluZSBERUZJTkVfTk9fTkFNRURfVkFMVUVTX0ZPUih0eXBlKSBcCi10ZW1wbGF0ZTw+IGlubGluZSBDMkZpZWxkRGVzY3JpcHRvcjo6bmFtZWRfdmFsdWVzX3R5cGUgQzJGaWVsZERlc2NyaXB0b3I6Om5hbWVkVmFsdWVzRm9yKGNvbnN0IHR5cGUgJikgeyBcCi0gICAgcmV0dXJuIG5hbWVkX3ZhbHVlc190eXBlKCk7IFwKLX0KLQotLy8gV2UgY2Fubm90IHN1YnR5cGUgY29uc3RydWN0b3IgZm9yIGVudW1lcmF0ZWQgdHlwZXMgc28gaW5zdGVkIGRlZmluZSBubyBuYW1lZCB2YWx1ZXMgZm9yCi0vLyBub24tZW51bWVyYXRlZCBpbnRlZ3JhbCB0eXBlcy4KLURFRklORV9OT19OQU1FRF9WQUxVRVNfRk9SKGludDMyX3QpCi1ERUZJTkVfTk9fTkFNRURfVkFMVUVTX0ZPUih1aW50MzJfdCkKLURFRklORV9OT19OQU1FRF9WQUxVRVNfRk9SKGludDY0X3QpCi1ERUZJTkVfTk9fTkFNRURfVkFMVUVTX0ZPUih1aW50NjRfdCkKLURFRklORV9OT19OQU1FRF9WQUxVRVNfRk9SKHVpbnQ4X3QpCi1ERUZJTkVfTk9fTkFNRURfVkFMVUVTX0ZPUihjaGFyKQotREVGSU5FX05PX05BTUVEX1ZBTFVFU19GT1IoZmxvYXQpCi0KLS8qKgotICogRGVzY3JpYmVzIHRoZSBmaWVsZHMgb2YgYSBzdHJ1Y3R1cmUuCi0gKi8KLXN0cnVjdCBDMlN0cnVjdERlc2NyaXB0b3IgewotcHVibGljOgotICAgIC8vLyBSZXR1cm5zIHRoZSBwYXJhbWV0ZXIgdHlwZQotICAgIGlubGluZSBDMlBhcmFtOjpCYXNlSW5kZXggYmFzZUluZGV4KCkgY29uc3QgeyByZXR1cm4gX21UeXBlLmJhc2VJbmRleCgpOyB9Ci0KLSAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZmllbGRzIGluIHRoaXMgcGFyYW0gKG5vdCBjb3VudGluZyBhbnkgcmVjdXJzaXZlIGZpZWxkcykuCi0gICAgLy8gTXVzdCBiZSBhdCBsZWFzdCAxIGZvciB2YWxpZCBwYXJhbXMuCi0gICAgaW5saW5lIHNpemVfdCBudW1GaWVsZHMoKSBjb25zdCB7IHJldHVybiBfbUZpZWxkcy5zaXplKCk7IH0KLQotICAgIC8vIFJldHVybnMgdGhlIGxpc3Qgb2YgaW1tZWRpYXRlIGZpZWxkcyAobm90IGNvdW50aW5nIGFueSByZWN1cnNpdmUgZmllbGRzKS4KLSAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPGNvbnN0IEMyRmllbGREZXNjcmlwdG9yPjo6Y29uc3RfaXRlcmF0b3IgZmllbGRfaXRlcmF0b3I7Ci0gICAgaW5saW5lIGZpZWxkX2l0ZXJhdG9yIGNiZWdpbigpIGNvbnN0IHsgcmV0dXJuIF9tRmllbGRzLmNiZWdpbigpOyB9Ci0gICAgaW5saW5lIGZpZWxkX2l0ZXJhdG9yIGNlbmQoKSBjb25zdCB7IHJldHVybiBfbUZpZWxkcy5jZW5kKCk7IH0KLQotICAgIC8vIG9ubHkgc3VwcGx5aW5nIGNvbnN0IGl0ZXJhdG9yIC0gYnV0IHRoZXNlIGFyZSBuZWVkZWQgZm9yIHJhbmdlIGJhc2VkIGxvb3BzCi0gICAgaW5saW5lIGZpZWxkX2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gX21GaWVsZHMuY2JlZ2luKCk7IH0KLSAgICBpbmxpbmUgZmllbGRfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gX21GaWVsZHMuY2VuZCgpOyB9Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgIGlubGluZSBDMlN0cnVjdERlc2NyaXB0b3IoVCopCi0gICAgICAgIDogQzJTdHJ1Y3REZXNjcmlwdG9yKFQ6OmJhc2VJbmRleCwgVDo6ZmllbGRMaXN0KSB7IH0KLQotICAgIGlubGluZSBDMlN0cnVjdERlc2NyaXB0b3IoCi0gICAgICAgICAgICBDMlBhcmFtOjpCYXNlSW5kZXggdHlwZSwKLSAgICAgICAgICAgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxjb25zdCBDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRzKQotICAgICAgICA6IF9tVHlwZSh0eXBlKSwgX21GaWVsZHMoZmllbGRzKSB7IH0KLQotcHJpdmF0ZToKLSAgICBjb25zdCBDMlBhcmFtOjpCYXNlSW5kZXggX21UeXBlOwotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IEMyRmllbGREZXNjcmlwdG9yPiBfbUZpZWxkczsKLX07Ci0KLS8qKgotICogRGVzY3JpYmVzIHBhcmFtZXRlcnMgZm9yIGEgY29tcG9uZW50LgotICovCi1zdHJ1Y3QgQzJQYXJhbURlc2NyaXB0b3IgewotcHVibGljOgotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciBzZXR0aW5nIHRoaXMgcGFyYW0gaXMgcmVxdWlyZWQgdG8gY29uZmlndXJlIHRoaXMgY29tcG9uZW50LgotICAgICAqIFRoaXMgY2FuIG9ubHkgYmUgdHJ1ZSBmb3IgYnVpbHRpbiBwYXJhbXMgZm9yIHBsYXRmb3JtLWRlZmluZWQgY29tcG9uZW50cyAoZS5nLiB2aWRlbyBhbmQKLSAgICAgKiBhdWRpbyBlbmNvZGVycy9kZWNvZGVycywgdmlkZW8vYXVkaW8gZmlsdGVycykuCi0gICAgICogRm9yIHZlbmRvci1kZWZpbmVkIGNvbXBvbmVudHMsIGl0IGNhbiBiZSB0cnVlIGV2ZW4gZm9yIHZlbmRvci1kZWZpbmVkIHBhcmFtcywKLSAgICAgKiBidXQgaXQgaXMgbm90IHJlY29tbWVuZGVkLCBpbiBjYXNlIHRoZSBjb21wb25lbnQgYmVjb21lcyBwbGF0Zm9ybS1kZWZpbmVkLgotICAgICAqLwotICAgIGlubGluZSBib29sIGlzUmVxdWlyZWQoKSBjb25zdCB7IHJldHVybiBfbUlzUmVxdWlyZWQ7IH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIHBhcmFtZXRlciBpcyBwZXJzaXN0ZW50LiBUaGlzIGlzIGFsd2F5cyB0cnVlIGZvciBDMlR1bmluZyBhbmQgQzJTZXR0aW5nLAotICAgICAqIGJ1dCBtYXkgYmUgZmFsc2UgZm9yIEMySW5mby4gSWYgdHJ1ZSwgdGhpcyBwYXJhbWV0ZXIgcGVyc2lzdHMgYWNyb3NzIGZyYW1lcyBhbmQgYXBwbGllcyB0bwotICAgICAqIHRoZSBjdXJyZW50IGFuZCBzdWJzZXF1ZW50IGZyYW1lcy4gSWYgZmFsc2UsIHRoaXMgQzJJbmZvIHBhcmFtZXRlciBvbmx5IGFwcGxpZXMgdG8gdGhlCi0gICAgICogY3VycmVudCBmcmFtZSBhbmQgaXMgbm90IGFzc3VtZWQgdG8gaGF2ZSB0aGUgc2FtZSB2YWx1ZSAob3IgZXZlbiBiZSBwcmVzZW50KSBvbiBzdWJzZXF1ZW50Ci0gICAgICogZnJhbWVzLCB1bmxlc3MgaXQgaXMgc3BlY2lmaWVkIGZvciB0aG9zZSBmcmFtZXMuCi0gICAgICovCi0gICAgaW5saW5lIGJvb2wgaXNQZXJzaXN0ZW50KCkgY29uc3QgeyByZXR1cm4gX21Jc1BlcnNpc3RlbnQ7IH0KLQotICAgIC8vLyBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgcGFyYW0uCi0gICAgLy8vIFRoaXMgZGVmYXVsdHMgdG8gdGhlIHVuZGVybHlpbmcgQzJTdHJ1Y3QncyBuYW1lLCBidXQgY291bGQgYmUgYWx0ZXJlZCBmb3IgYSBjb21wb25lbnQuCi0gICAgaW5saW5lIEMyU3RyaW5nIG5hbWUoKSBjb25zdCB7IHJldHVybiBfbU5hbWU7IH0KLQotICAgIC8vLyBSZXR1cm5zIHRoZSBwYXJhbWV0ZXIgdHlwZQotICAgIC8vLyBcdG9kbyBmaXggdGhpcwotICAgIGlubGluZSBDMlBhcmFtOjpUeXBlIHR5cGUoKSBjb25zdCB7IHJldHVybiBfbVR5cGU7IH0KLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgaW5saW5lIEMyUGFyYW1EZXNjcmlwdG9yKGJvb2wgaXNSZXF1aXJlZCwgQzJTdHJpbmdMaXRlcmFsIG5hbWUsIGNvbnN0IFQqKQotICAgICAgICA6IF9tSXNSZXF1aXJlZChpc1JlcXVpcmVkKSwKLSAgICAgICAgICBfbUlzUGVyc2lzdGVudCh0cnVlKSwKLSAgICAgICAgICBfbU5hbWUobmFtZSksCi0gICAgICAgICAgX21UeXBlKFQ6OnR5cGVJbmRleCkgeyB9Ci0KLSAgICBpbmxpbmUgQzJQYXJhbURlc2NyaXB0b3IoCi0gICAgICAgICAgICBib29sIGlzUmVxdWlyZWQsIEMyU3RyaW5nTGl0ZXJhbCBuYW1lLCBDMlBhcmFtOjpUeXBlIHR5cGUpCi0gICAgICAgIDogX21Jc1JlcXVpcmVkKGlzUmVxdWlyZWQpLAotICAgICAgICAgIF9tSXNQZXJzaXN0ZW50KHRydWUpLAotICAgICAgICAgIF9tTmFtZShuYW1lKSwKLSAgICAgICAgICBfbVR5cGUodHlwZSkgeyB9Ci0KLXByaXZhdGU6Ci0gICAgY29uc3QgYm9vbCBfbUlzUmVxdWlyZWQ7Ci0gICAgY29uc3QgYm9vbCBfbUlzUGVyc2lzdGVudDsKLSAgICBjb25zdCBDMlN0cmluZyBfbU5hbWU7Ci0gICAgY29uc3QgQzJQYXJhbTo6VHlwZSBfbVR5cGU7Ci19OwotCi0vLy8gXGluZ3JvdXAgaW50ZXJuYWwKLS8vLyBEZWZpbmUgYSBzdHJ1Y3R1cmUgd2l0aG91dCBiYXNlSW5kZXguCi0jZGVmaW5lIERFRklORV9DMlNUUlVDVF9OT19CQVNFKG5hbWUpIFwKLXB1YmxpYzogXAotICAgIHR5cGVkZWYgQzIjI25hbWUjI1N0cnVjdCBfdHlwZTsgLyoqPCB0eXBlIG5hbWUgc2hvcnRoYW5kICovIFwKLSAgICBjb25zdCBzdGF0aWMgc3RkOjppbml0aWFsaXplcl9saXN0PGNvbnN0IEMyRmllbGREZXNjcmlwdG9yPiBmaWVsZExpc3Q7IC8qKjwgc3RydWN0dXJlIGZpZWxkcyAqLwotCi0vLy8gRGVmaW5lIGEgc3RydWN0dXJlIHdpdGggbWF0Y2hpbmcgYmFzZUluZGV4LgotI2RlZmluZSBERUZJTkVfQzJTVFJVQ1QobmFtZSkgXAotcHVibGljOiBcCi0gICAgZW51bSA6IHVpbnQzMl90IHsgYmFzZUluZGV4ID0ga1BhcmFtSW5kZXgjI25hbWUgfTsgXAotICAgIERFRklORV9DMlNUUlVDVF9OT19CQVNFKG5hbWUpCi0KLS8vLyBEZWZpbmUgYSBmbGV4aWJsZSBzdHJ1Y3R1cmUgd2l0aCBtYXRjaGluZyBiYXNlSW5kZXguCi0jZGVmaW5lIERFRklORV9GTEVYX0MyU1RSVUNUKG5hbWUsIGZsZXhNZW1iZXIpIFwKLXB1YmxpYzogXAotICAgIEZMRVgoQzIjI25hbWUjI1N0cnVjdCwgZmxleE1lbWJlcikgXAotICAgIGVudW0gOiB1aW50MzJfdCB7IGJhc2VJbmRleCA9IGtQYXJhbUluZGV4IyNuYW1lIHwgQzJQYXJhbTo6QmFzZUluZGV4Ojpfa0ZsZXhpYmxlRmxhZyB9OyBcCi0gICAgREVGSU5FX0MyU1RSVUNUX05PX0JBU0UobmFtZSkKLQotLy8vIFxpbmdyb3VwIGludGVybmFsCi0vLy8gRGVzY3JpYmUgYSBzdHJ1Y3R1cmUgb2YgYSB0ZW1wbGF0ZWQgc3RydWN0dXJlLgotI2RlZmluZSBERVNDUklCRV9URU1QTEFURURfQzJTVFJVQ1Qoc3RydWt0LCBsaXN0KSBcCi0gICAgdGVtcGxhdGU8PiBcCi0gICAgY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PGNvbnN0IEMyRmllbGREZXNjcmlwdG9yPiBzdHJ1a3Q6OmZpZWxkTGlzdCA9IGxpc3Q7Ci0KLS8vLyBcZGVwcmVjYXRlZAotLy8vIERlc2NyaWJlIHRoZSBmaWVsZHMgb2YgYSBzdHJ1Y3R1cmUgdXNpbmcgYW4gaW5pdGlhbGl6ZXIgbGlzdC4KLSNkZWZpbmUgREVTQ1JJQkVfQzJTVFJVQ1QobmFtZSwgbGlzdCkgXAotICAgIGNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxjb25zdCBDMkZpZWxkRGVzY3JpcHRvcj4gQzIjI25hbWUjI1N0cnVjdDo6ZmllbGRMaXN0ID0gbGlzdDsKLQotLyoqCi0gKiBEZXNjcmliZSBhIGZpZWxkIG9mIGEgc3RydWN0dXJlLgotICogVGhlc2UgbXVzdCBiZSBpbiBvcmRlci4KLSAqCi0gKiBUaGVyZSBhcmUgdHdvIHdheXMgdG8gdXNlIHRoaXMgbWFjcm86Ci0gKgotICogIH5+fn5+fn5+fn5+fn4gKC5jcHApCi0gKiAgc3RydWN0IEMyVmlkZW9XaWR0aFN0cnVjdCB7Ci0gKiAgICAgIGludDMyX3QgbVdpZHRoOwotICogICAgICBDMlZpZGVvV2lkdGhTdHJ1Y3QoKSB7fSAvLyBvcHRpb25hbCBkZWZhdWx0IGNvbnN0cnVjdG9yCi0gKiAgICAgIEMyVmlkZW9XaWR0aFN0cnVjdChpbnQzMl90IF93aWR0aCkgOiBtV2lkdGgoX3dpZHRoKSB7fQotICoKLSAqICAgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChWaWRlb1dpZHRoKQotICogICAgICBDMkZJRUxEKG1XaWR0aCwgIndpZHRoIikKLSAqICB9OwotICogIH5+fn5+fn5+fn5+fn4KLSAqCi0gKiAgfn5+fn5+fn5+fn5+fiAoLmNwcCkKLSAqICBzdHJ1Y3QgQzJWaWRlb1dpZHRoU3RydWN0IHsKLSAqICAgICAgaW50MzJfdCBtV2lkdGg7Ci0gKiAgICAgIEMyVmlkZW9XaWR0aFN0cnVjdCgpID0gZGVmYXVsdDsgLy8gb3B0aW9uYWwgZGVmYXVsdCBjb25zdHJ1Y3RvcgotICogICAgICBDMlZpZGVvV2lkdGhTdHJ1Y3QoaW50MzJfdCBfd2lkdGgpIDogbVdpZHRoKF93aWR0aCkge30KLSAqCi0gKiAgICAgIERFRklORV9DMlNUUlVDVChWaWRlb1dpZHRoKQotICogIH0gQzJfUEFDSzsKLSAqCi0gKiAgREVTQ1JJQkVfQzJTVFJVQ1QoVmlkZW9XaWR0aCwgewotICogICAgICBDMkZJRUxEKG1XaWR0aCwgIndpZHRoIikKLSAqICB9KQotICogIH5+fn5+fn5+fn5+fn4KLSAqCi0gKiAgRm9yIGZsZXhpYmxlIHN0cnVjdHVyZXMgKHRob3NlIGVuZGluZyBpbiBUW10pLCB1c2UgdGhlIGZsZXhpYmxlIG1hY3JvczoKLSAqCi0gKiAgfn5+fn5+fn5+fn5+fiAoLmNwcCkKLSAqICBzdHJ1Y3QgQzJWaWRlb0ZsZXhXaWR0aHNTdHJ1Y3QgewotICogICAgICBpbnQzMl90IG1XaWR0aHNbXTsKLSAqICAgICAgQzJWaWRlb0ZsZXhXaWR0aHNTdHJ1Y3QoKTsgLy8gbXVzdCBoYXZlIGEgZGVmYXVsdCBjb25zdHJ1Y3RvcgotICoKLSAqICBwcml2YXRlOgotICogICAgICAvLyBtYXkgaGF2ZSBwcml2YXRlIGNvbnN0cnVjdG9ycyB0YWtpbmcgbnVtYmVyIG9mIHdpZHRocyBhcyB0aGUgZmlyc3QgYXJndW1lbnQKLSAqICAgICAgLy8gVGhpcyBpcyB1c2VkIGJ5IHRoZSBDMlBhcmFtIGZhY3RvcnkgbWV0aG9kcywgZS5nLgotICogICAgICAvLyAgIEMyVmlkZW9GbGV4V2lkdGhzR2xvYmFsUGFyYW06OmFsbG9jX3VuaXF1ZShzaXplX3QsIGludDMyX3QpOwotICogICAgICBDMlZpZGVvRmxleFdpZHRoc1N0cnVjdChzaXplX3QgZmxleENvdW50LCBpbnQzMl90IHZhbHVlKSB7Ci0gKiAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZsZXhDb3VudDsgKytpKSB7Ci0gKiAgICAgICAgICAgICAgbVdpZHRoc1tpXSA9IHZhbHVlOwotICogICAgICAgICAgfQotICogICAgICB9Ci0gKgotICogICAgICAvLyBJZiB0aGUgbGFzdCBhcmd1bWVudCBpcyBUW05dIG9yIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiwgdGhlIGZsZXhDb3VudCB3aWxsCi0gKiAgICAgIC8vIGJlIGF1dG9tYXRpY2FsbHkgY2FsY3VsYXRlZCBhbmQgcGFzc2VkIGJ5IHRoZSBDMlBhcmFtIGZhY3RvcnkgbWV0aG9kcywgZS5nLgotICogICAgICAvLyAgIGludCB3aWR0aHNbXSA9IHsgMSwgMiwgMyB9OwotICogICAgICAvLyAgIEMyVmlkZW9GbGV4V2lkdGhzR2xvYmFsUGFyYW06OmFsbG9jX3VuaXF1ZSh3aWR0aHMpOwotICogICAgICB0ZW1wbGF0ZTx1bnNpZ25lZCBOPgotICogICAgICBDMlZpZGVvRmxleFdpZHRoc1N0cnVjdChzaXplX3QgZmxleENvdW50LCBjb25zdCBpbnQzMl90KCZpbml0KVtOXSkgewotICogICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmbGV4Q291bnQ7ICsraSkgewotICogICAgICAgICAgICAgIG1XaWR0aHNbaV0gPSBpbml0W2ldOwotICogICAgICAgICAgfQotICogICAgICB9Ci0gKgotICogICAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QoVmlkZW9GbGV4V2lkdGhzLCBtV2lkdGhzKQotICogICAgICBDMkZJRUxEKG1XaWR0aHMsICJ3aWR0aHMiKQotICogIH07Ci0gKiAgfn5+fn5+fn5+fn5+fgotICoKLSAqICB+fn5+fn5+fn5+fn5+ICguY3BwKQotICogIHN0cnVjdCBDMlZpZGVvRmxleFdpZHRoc1N0cnVjdCB7Ci0gKiAgICAgIGludDMyX3QgbVdpZHRoc1tdOwotICogICAgICBDMlZpZGVvRmxleFdpZHRoc1N0cnVjdCgpOyAvLyBtdXN0IGhhdmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yCi0gKgotICogICAgICBERUZJTkVfRkxFWF9DMlNUUlVDVChWaWRlb0ZsZXhXaWR0aHMsIG1XaWR0aHMpCi0gKiAgfSBDMl9QQUNLOwotICoKLSAqICBERVNDUklCRV9DMlNUUlVDVChWaWRlb0ZsZXhXaWR0aHMsIHsKLSAqICAgICAgQzJGSUVMRChtV2lkdGhzLCAid2lkdGhzIikKLSAqICB9KQotICogIH5+fn5+fn5+fn5+fn4KLSAqCi0gKi8KLSNkZWZpbmUgQzJGSUVMRChtZW1iZXIsIG5hbWUpIFwKLSAgQzJGaWVsZERlc2NyaXB0b3IoJigoX3R5cGUqKShudWxscHRyKSktPm1lbWJlciwgbmFtZSksCi0KLS8vLyBcZGVwcmVjYXRlZAotI2RlZmluZSBDMlNPTEVfRklFTEQobWVtYmVyLCBuYW1lKSBcCi0gIEMyRmllbGREZXNjcmlwdG9yKCZfdHlwZTo6bWVtYmVyLCBuYW1lLCAwKQotCi0vLy8gRGVmaW5lIGEgc3RydWN0dXJlIHdpdGggbWF0Y2hpbmcgYmFzZUluZGV4IGFuZCBzdGFydCBkZXNjcmliaW5nIGl0cyBmaWVsZHMuCi0vLy8gVGhpcyBtdXN0IGJlIGF0IHRoZSBlbmQgb2YgdGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uLgotI2RlZmluZSBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKG5hbWUpIFwKLSAgICBERUZJTkVfQzJTVFJVQ1QobmFtZSkgfSAgQzJfUEFDSzsgXAotICAgIGNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxjb25zdCBDMkZpZWxkRGVzY3JpcHRvcj4gQzIjI25hbWUjI1N0cnVjdDo6ZmllbGRMaXN0ID0gewotCi0vLy8gRGVmaW5lIGEgZmxleGlibGUgc3RydWN0dXJlIHdpdGggbWF0Y2hpbmcgYmFzZUluZGV4IGFuZCBzdGFydCBkZXNjcmliaW5nIGl0cyBmaWVsZHMuCi0vLy8gVGhpcyBtdXN0IGJlIGF0IHRoZSBlbmQgb2YgdGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uLgotI2RlZmluZSBERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QobmFtZSwgZmxleE1lbWJlcikgXAotICAgIERFRklORV9GTEVYX0MyU1RSVUNUKG5hbWUsIGZsZXhNZW1iZXIpIH0gQzJfUEFDSzsgXAotICAgIGNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxjb25zdCBDMkZpZWxkRGVzY3JpcHRvcj4gQzIjI25hbWUjI1N0cnVjdDo6ZmllbGRMaXN0ID0gewotCi0vKioKLSAqIFBhcmFtZXRlciByZWZsZWN0b3IgY2xhc3MuCi0gKgotICogVGhpcyBjbGFzcyBjZW50cmFsaXplcyB0aGUgZGVzY3JpcHRpb24gb2YgcGFyYW1ldGVyIHN0cnVjdHVyZXMuIFRoaXMgY2FuIGJlIHNoYXJlZAotICogYnkgbXVsdGlwbGUgY29tcG9uZW50cyBhcyBkZXNjcmliaW5nIGEgcGFyYW1ldGVyIGRvZXMgbm90IGltcGx5IHN1cHBvcnQgb2YgdGhhdAotICogcGFyYW1ldGVyLiBIb3dldmVyLCBlYWNoIHN1cHBvcnRlZCBwYXJhbWV0ZXIgYW5kIGFueSBkZXBlbmRlbnQgc3RydWN0dXJlcyB3aXRoaW4KLSAqIG11c3QgYmUgZGVzY3JpYmVkIGJ5IHRoZSBwYXJhbWV0ZXIgcmVmbGVjdG9yIHByb3ZpZGVkIGJ5IGEgY29tcG9uZW50LgotICovCi1jbGFzcyBDMlBhcmFtUmVmbGVjdG9yIHsKLXB1YmxpYzoKLSAgICAvKioKLSAgICAgKiAgRGVzY3JpYmVzIGEgcGFyYW1ldGVyIHN0cnVjdHVyZS4KLSAgICAgKgotICAgICAqICBccGFyYW1baW5dIHBhcmFtSW5kZXggdGhlIGJhc2UgaW5kZXggb2YgdGhlIHBhcmFtZXRlciBzdHJ1Y3R1cmUKLSAgICAgKgotICAgICAqICBccmV0dXJuIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgcGFyYW1ldGVyIHN0cnVjdHVyZQotICAgICAqICBccmV0dmFsIG51bGxwdHIgaWYgdGhlIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgcmVmbGVjdG9yCi0gICAgICoKLSAgICAgKiAgVGhpcyBtZXRob2RzIHNoYWxsIG5vdCBibG9jayBhbmQgcmV0dXJuIGltbWVkaWF0ZWx5LgotICAgICAqCi0gICAgICogIFxub3RlIHRoaXMgY2xhc3MgZG9lcyBub3QgdGFrZSBhIHNldCBvZiBpbmRpY2VzIGJlY2F1c2Ugd2Ugd291bGQgdGhlbiBwcmVmZXIKLSAgICAgKiAgdG8gYWxzbyByZXR1cm4gYW55IGRlcGVuZGVudCBzdHJ1Y3R1cmVzLCBhbmQgd2UgZG9uJ3Qgd2FudCB0aGlzIGxvZ2ljIHRvIGJlCi0gICAgICogIHJlcGVhdGVkIGluIGVhY2ggcmVmbGVjdG9yLiBBbHRlcm5hdGVseSwgdGhpcyBjb3VsZCBqdXN0IHJldHVybiBhIG1hcCBvZiBhbGwKLSAgICAgKiAgZGVzY3JpcHRpb25zLCBidXQgd2Ugd2FudCB0byBjb25zZXJ2ZSBtZW1vcnkgaWYgY2xpZW50IG9ubHkgd2FudHMgdGhlIGRlc2NyaXB0aW9uCi0gICAgICogIG9mIGEgZmV3IGluZGljZXMuCi0gICAgICovCi0gICAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjcmliZShDMlBhcmFtOjpCYXNlSW5kZXggcGFyYW1JbmRleCkgPSAwOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+QzJQYXJhbVJlZmxlY3RvcigpID0gZGVmYXVsdDsKLX07Ci0KLS8qKgotICogQSB1c2VhYmxlIHN1cHBvcnRlZCB2YWx1ZXMgZm9yIGEgZmllbGQuCi0gKgotICogVGhpcyBjYW4gYmUgZWl0aGVyIGEgcmFuZ2Ugb3IgYSBzZXQgb2YgdmFsdWVzLiBUaGUgcmFuZ2UgY2FuIGJlIGxpbmVhciBvciBnZW9tZXRyaWMgd2l0aCBhCi0gKiBjbGVhciBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlLCBhbmQgY2FuIGhhdmUgYW4gb3B0aW9uYWwgc3RlcCBzaXplIG9yIGdlb21ldHJpYyByYXRpby4gVmFsdWVzCi0gKiBjYW4gb3B0aW9uYWxseSByZXByZXNlbnQgZmxhZ3MuCi0gKgotICogXG5vdGUgRG8gbm90IHVzZSBmbGFncyB0byByZXByZXNlbnQgYml0ZmllbGRzLiBVc2UgaW5kaXZpZHVhbCB2YWx1ZXMgb3Igc2VwYXJhdGUgZmllbGRzIGluc3RlYWQuCi0gKi8KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgQzJUeXBlZEZpZWxkU3VwcG9ydGVkVmFsdWVzIHsKLS8vcHVibGljOgotICAgIGVudW0gVHlwZSB7Ci0gICAgICAgIFJBTkdFLCAgICAgIC8vLzwgYSBudW1lcmljIHJhbmdlIHRoYXQgY2FuIGJlIGNvbnRpbnVvdXMgb3IgZGlzY3JldGUKLSAgICAgICAgVkFMVUVTLCAgICAgLy8vPCBhIGxpc3Qgb2YgdmFsdWVzCi0gICAgICAgIEZMQUdTICAgICAgIC8vLzwgYSBsaXN0IG9mIGZsYWdzIHRoYXQgY2FuIGJlIE9SLWVkCi0gICAgfTsKLQotICAgIFR5cGUgdHlwZTsKLQotICAgIHN0cnVjdCB7Ci0gICAgICAgIFQgbWluOwotICAgICAgICBUIG1heDsKLSAgICAgICAgVCBzdGVwOwotICAgICAgICBUIG5vbTsKLSAgICAgICAgVCBkZW5vbTsKLSAgICB9IHJhbmdlOwotICAgIHN0ZDo6dmVjdG9yPFQ+IHZhbHVlczsKLQotICAgIEMyVHlwZWRGaWVsZFN1cHBvcnRlZFZhbHVlcyhUIG1pbiwgVCBtYXgsIFQgc3RlcCA9IFQoc3RkOjppc19mbG9hdGluZ19wb2ludDxUPjo6dmFsdWUgPyAwIDogMSkpCi0gICAgICAgIDogdHlwZShSQU5HRSksCi0gICAgICAgICAgcmFuZ2V7bWluLCBtYXgsIHN0ZXAsIChUKTEsIChUKTF9IHsgfQotCi0gICAgQzJUeXBlZEZpZWxkU3VwcG9ydGVkVmFsdWVzKFQgbWluLCBUIG1heCwgVCBub20sIFQgZGVuKSA6Ci0gICAgICAgIHR5cGUoUkFOR0UpLAotICAgICAgICByYW5nZXttaW4sIG1heCwgKFQpMCwgbm9tLCBkZW59IHsgfQotCi0gICAgQzJUeXBlZEZpZWxkU3VwcG9ydGVkVmFsdWVzKGJvb2wgZmxhZ3MsIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiBsaXN0KSA6Ci0gICAgICAgIHR5cGUoZmxhZ3MgPyBGTEFHUyA6IFZBTFVFUyksCi0gICAgICAgIHZhbHVlcyhsaXN0KSB7fQotfTsKLQotLyoqCi0gKiBHZW5lcmljIHN1cHBvcnRlZCB2YWx1ZXMgZm9yIGEgZmllbGQuCi0gKgotICogVGhpcyBjYW4gYmUgZWl0aGVyIGEgcmFuZ2Ugb3IgYSBzZXQgb2YgdmFsdWVzLiBUaGUgcmFuZ2UgY2FuIGJlIGxpbmVhciBvciBnZW9tZXRyaWMgd2l0aCBhCi0gKiBjbGVhciBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlLCBhbmQgY2FuIGhhdmUgYW4gb3B0aW9uYWwgc3RlcCBzaXplIG9yIGdlb21ldHJpYyByYXRpby4gVmFsdWVzCi0gKiBjYW4gb3B0aW9uYWxseSByZXByZXNlbnQgZmxhZ3MuCi0gKgotICogXG5vdGUgRG8gbm90IHVzZSBmbGFncyB0byByZXByZXNlbnQgYml0ZmllbGRzLiBVc2UgaW5kaXZpZHVhbCB2YWx1ZXMgb3Igc2VwYXJhdGUgZmllbGRzIGluc3RlYWQuCi0gKi8KLXN0cnVjdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzIHsKLS8vcHVibGljOgotICAgIGVudW0gVHlwZSB7Ci0gICAgICAgIFJBTkdFLCAgICAgIC8vLzwgYSBudW1lcmljIHJhbmdlIHRoYXQgY2FuIGJlIGNvbnRpbnVvdXMgb3IgZGlzY3JldGUKLSAgICAgICAgVkFMVUVTLCAgICAgLy8vPCBhIGxpc3Qgb2YgdmFsdWVzCi0gICAgICAgIEZMQUdTICAgICAgIC8vLzwgYSBsaXN0IG9mIGZsYWdzIHRoYXQgY2FuIGJlIE9SLWVkCi0gICAgfTsKLQotICAgIFR5cGUgdHlwZTsKLQotICAgIHR5cGVkZWYgQzJWYWx1ZTo6UHJpbWl0aXZlIFByaW1pdGl2ZTsKLQotICAgIHN0cnVjdCB7Ci0gICAgICAgIFByaW1pdGl2ZSBtaW47Ci0gICAgICAgIFByaW1pdGl2ZSBtYXg7Ci0gICAgICAgIFByaW1pdGl2ZSBzdGVwOwotICAgICAgICBQcmltaXRpdmUgbm9tOwotICAgICAgICBQcmltaXRpdmUgZGVub207Ci0gICAgfSByYW5nZTsKLSAgICBzdGQ6OnZlY3RvcjxQcmltaXRpdmU+IHZhbHVlczsKLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyhUIG1pbiwgVCBtYXgsIFQgc3RlcCA9IFQoc3RkOjppc19mbG9hdGluZ19wb2ludDxUPjo6dmFsdWUgPyAwIDogMSkpCi0gICAgICAgIDogdHlwZShSQU5HRSksCi0gICAgICAgICAgcmFuZ2V7bWluLCBtYXgsIHN0ZXAsIChUKTEsIChUKTF9IHsgfQotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKFQgbWluLCBUIG1heCwgVCBub20sIFQgZGVuKSA6Ci0gICAgICAgIHR5cGUoUkFOR0UpLAotICAgICAgICByYW5nZXttaW4sIG1heCwgKFQpMCwgbm9tLCBkZW59IHsgfQotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKGJvb2wgZmxhZ3MsIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiBsaXN0KQotICAgICAgICA6IHR5cGUoZmxhZ3MgPyBGTEFHUyA6IFZBTFVFUyksCi0gICAgICAgICAgcmFuZ2V7KFQpMCwgKFQpMCwgKFQpMCwgKFQpMCwgKFQpMH0gewotICAgICAgICBmb3IoVCB2YWx1ZSA6IGxpc3QpIHsKLSAgICAgICAgICAgIHZhbHVlcy5lbXBsYWNlX2JhY2sodmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgRT1kZWNsdHlwZShDMkZpZWxkRGVzY3JpcHRvcjo6bmFtZWRWYWx1ZXNGb3IoKihUKikwKSk+Ci0gICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyhib29sIGZsYWdzLCBjb25zdCBUKikKLSAgICAgICAgOiB0eXBlKGZsYWdzID8gRkxBR1MgOiBWQUxVRVMpLAotICAgICAgICAgIHJhbmdleyhUKTAsIChUKTAsIChUKTAsIChUKTAsIChUKTB9IHsKLSAgICAgICAgICAgICAgQzJGaWVsZERlc2NyaXB0b3I6Om5hbWVkX3ZhbHVlc190eXBlIG5hbWVkID0gQzJGaWVsZERlc2NyaXB0b3I6Om5hbWVkVmFsdWVzRm9yKCooVCopMCk7Ci0gICAgICAgIGZvciAoY29uc3QgQzJGaWVsZERlc2NyaXB0b3I6Om5hbWVkX3ZhbHVlX3R5cGUgJml0ZW0gOiBuYW1lZCkgewotICAgICAgICAgICAgdmFsdWVzLmVtcGxhY2VfYmFjayhpdGVtLnNlY29uZCk7Ci0gICAgICAgIH0KLSAgICB9Ci19OwotCi0vLy8gQH0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBDMlBBUkFNX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvaW5jbHVkZS9DMlBhcmFtRGVmLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvaW5jbHVkZS9DMlBhcmFtRGVmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNjk2MTcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL2luY2x1ZGUvQzJQYXJhbURlZi5oCisrKyAvZGV2L251bGwKQEAgLTEsOTAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKiogXGZpbGUKLSAqIFRlbXBsYXRlcyB1c2VkIHRvIGRlY2xhcmUgcGFyYW1ldGVycy4KLSAqLwotI2lmbmRlZiBDMlBBUkFNX0RFRl9IXwotI2RlZmluZSBDMlBBUkFNX0RFRl9IXwotCi0jaW5jbHVkZSA8dHlwZV90cmFpdHM+Ci0KLSNpbmNsdWRlIDxDMlBhcmFtLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8vIFxhZGR0b2dyb3VwIFBhcmFtZXRlcnMKLS8vLyBAewotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT0gVVRJTElUWSBURU1QTEFURVMgRk9SIFBBUkFNRVRFUiBERUZJTklUSU9OUyA9PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotLy8vIFxhZGR0b2dyb3VwIGludGVybmFsCi0vLy8gQHsKLQotLy8vIEhlbHBlciBjbGFzcyB0aGF0IGNoZWNrcyBpZiBhIHR5cGUgaGFzIGVxdWFsaXR5IGFuZCBpbmVxdWFsaXR5IG9wZXJhdG9ycy4KLXN0cnVjdCBDMl9ISURFIF9DMkNvbXBhcmFibGVfaW1wbAotewotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFMsIHR5cGVuYW1lPWRlY2x0eXBlKFMoKSA9PSBTKCkpPgotICAgIHN0YXRpYyBzdGQ6OnRydWVfdHlwZSBfX3Rlc3RFUShpbnQpOwotICAgIHRlbXBsYXRlPHR5cGVuYW1lPgotICAgIHN0YXRpYyBzdGQ6OmZhbHNlX3R5cGUgX190ZXN0RVEoLi4uKTsKLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFMsIHR5cGVuYW1lPWRlY2x0eXBlKFMoKSAhPSBTKCkpPgotICAgIHN0YXRpYyBzdGQ6OnRydWVfdHlwZSBfX3Rlc3RORShpbnQpOwotICAgIHRlbXBsYXRlPHR5cGVuYW1lPgotICAgIHN0YXRpYyBzdGQ6OmZhbHNlX3R5cGUgX190ZXN0TkUoLi4uKTsKLX07Ci0KLS8qKgotICogSGVscGVyIHRlbXBsYXRlIHRoYXQgcmV0dXJucyBpZiBhIHR5cGUgaGFzIGVxdWFsaXR5IGFuZCBpbmVxdWFsaXR5IG9wZXJhdG9ycy4KLSAqCi0gKiBVc2UgYXMgX0MyQ29tcGFyYWJsZTx0eXBlbmFtZSBTPjo6dmFsdWUuCi0gKi8KLXRlbXBsYXRlPHR5cGVuYW1lIFM+Ci1zdHJ1Y3QgQzJfSElERSBfQzJDb21wYXJhYmxlCi0gICAgOiBwdWJsaWMgc3RkOjppbnRlZ3JhbF9jb25zdGFudDxib29sLCBkZWNsdHlwZShfQzJDb21wYXJhYmxlX2ltcGw6Ol9fdGVzdEVRPFM+KDApKTo6dmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRlY2x0eXBlKF9DMkNvbXBhcmFibGVfaW1wbDo6X190ZXN0TkU8Uz4oMCkpOjp2YWx1ZT4gewotfTsKLQotLy8vICBIZWxwZXIgY2xhc3MgdGhhdCBjaGVja3MgaWYgYSB0eXBlIGhhcyBhIGJhc2VJbmRleCBjb25zdGFudC4KLXN0cnVjdCBDMl9ISURFIF9DMkJhc2VJbmRleEhlbHBlcl9pbXBsCi17Ci0gICAgdGVtcGxhdGU8dHlwZW5hbWUgUywgaW50PVM6OmJhc2VJbmRleD4KLSAgICBzdGF0aWMgc3RkOjp0cnVlX3R5cGUgX190ZXN0QmFzZUluZGV4KGludCk7Ci0gICAgdGVtcGxhdGU8dHlwZW5hbWU+Ci0gICAgc3RhdGljIHN0ZDo6ZmFsc2VfdHlwZSBfX3Rlc3RCYXNlSW5kZXgoLi4uKTsKLX07Ci0KLS8vLyBIZWxwZXIgdGVtcGxhdGUgdGhhdCB2ZXJpZmllcyBhIHR5cGUncyBiYXNlSW5kZXggYW5kIGNyZWF0ZXMgaXQgaWYgdGhlIHR5cGUgZG9lcyBub3QgaGF2ZSBvbmUuCi10ZW1wbGF0ZTx0eXBlbmFtZSBTLCBpbnQgQmFzZUluZGV4LAotICAgICAgICBib29sIEhhc0Jhc2U9ZGVjbHR5cGUoX0MyQmFzZUluZGV4SGVscGVyX2ltcGw6Ol9fdGVzdEJhc2VJbmRleDxTPigwKSk6OnZhbHVlPgotc3RydWN0IEMyX0hJREUgQzJCYXNlSW5kZXhPdmVycmlkZSB7Ci0gICAgLy8gVE9ETzogd2hhdCBpZiB3ZSBhbGxvdyBzdHJ1Y3RzIHdpdGhvdXQgYmFzZUluZGV4PwotICAgIHN0YXRpY19hc3NlcnQoQmFzZUluZGV4ID09IFM6OmJhc2VJbmRleCwgImJhc2VJbmRleCBkaWZmZXJzIGZyb20gc3RydWN0dXJlIik7Ci19OwotCi0vLy8gU3BlY2lhbGl6YXRpb24gZm9yIHR5cGVzIHdpdGhvdXQgYSBiYXNlSW5kZXguCi10ZW1wbGF0ZTx0eXBlbmFtZSBTLCBpbnQgQmFzZUluZGV4Pgotc3RydWN0IEMyX0hJREUgQzJCYXNlSW5kZXhPdmVycmlkZTxTLCBCYXNlSW5kZXgsIGZhbHNlPiB7Ci1wdWJsaWM6Ci0gICAgZW51bSA6IHVpbnQzMl90IHsKLSAgICAgICAgYmFzZUluZGV4ID0gQmFzZUluZGV4LCAvLy88IGJhc2VJbmRleCBvdmVycmlkZS4KLSAgICB9OwotfTsKLQotLy8vIEhlbHBlciB0ZW1wbGF0ZSB0aGF0IGFkZHMgYSBiYXNlSW5kZXggdG8gYSB0eXBlIGlmIGl0IGRvZXMgbm90IGhhdmUgb25lLgotdGVtcGxhdGU8dHlwZW5hbWUgUywgaW50IEJhc2VJbmRleD4KLXN0cnVjdCBDMl9ISURFIEMyQWRkQmFzZUluZGV4IDogcHVibGljIFMsIHB1YmxpYyBDMkJhc2VJbmRleE92ZXJyaWRlPFMsIEJhc2VJbmRleD4ge307Ci0KLS8qKgotICogXGJyaWVmIEhlbHBlciBjbGFzcyB0byBjaGVjayBzdHJ1Y3QgcmVxdWlyZW1lbnRzIGZvciBwYXJhbWV0ZXJzLgotICoKLSAqIEZlYXR1cmVzOgotICogIC0gdmVyaWZ5IGRlZmF1bHQgY29uc3RydWN0b3IsIG5vIHZpcnR1YWwgbWV0aG9kcywgYW5kIG5vIGVxdWFsaXR5IG9wZXJhdG9ycy4KLSAqICAtIGV4cG9zZSB0eXBlSW5kZXgsIGFuZCBub24tZmxleCBmbGV4U2l6ZS4KLSAqLwotdGVtcGxhdGU8dHlwZW5hbWUgUywgaW50IEJhc2VJbmRleCwgdW5zaWduZWQgVHlwZUluZGV4Pgotc3RydWN0IEMyX0hJREUgQzJTdHJ1Y3RDaGVjayB7Ci0gICAgc3RhdGljX2Fzc2VydCgKLSAgICAgICAgICAgIHN0ZDo6aXNfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPFM+Ojp2YWx1ZSwgIkMyIHN0cnVjdHVyZSBtdXN0IGhhdmUgZGVmYXVsdCBjb25zdHJ1Y3RvciIpOwotICAgIHN0YXRpY19hc3NlcnQoIXN0ZDo6aXNfcG9seW1vcnBoaWM8Uz46OnZhbHVlLCAiQzIgc3RydWN0dXJlIG11c3Qgbm90IGhhdmUgdmlydHVhbCBtZXRob2RzIik7Ci0gICAgc3RhdGljX2Fzc2VydCghX0MyQ29tcGFyYWJsZTxTPjo6dmFsdWUsICJDMiBzdHJ1Y3R1cmUgbXVzdCBub3QgaGF2ZSBvcGVyYXRvcj09IG9yICE9Iik7Ci0KLXB1YmxpYzoKLSAgICBlbnVtIDogdWludDMyX3QgewotICAgICAgICB0eXBlSW5kZXggPSBCYXNlSW5kZXggfCBUeXBlSW5kZXgKLSAgICB9OwotCi1wcm90ZWN0ZWQ6Ci0gICAgZW51bSA6IHVpbnQzMl90IHsKLSAgICAgICAgZmxleFNpemUgPSAwLCAvLyBUT0RPOiBpcyB0aGlzIHN0aWxsIG5lZWRlZD8gdGhpcyBtYXkgYmUgY29uZnVzaW5nLgotICAgIH07Ci19OwotCi0vLy8gSGVscGVyIGNsYXNzIHRoYXQgY2hlY2tzIGlmIGEgdHlwZSBoYXMgYW4gaW50ZWdlciBmbGV4U2l6ZSBtZW1iZXIuCi1zdHJ1Y3QgQzJfSElERSBfQzJGbGV4aWJsZV9pbXBsIHsKLSAgICAvLy8gc3BlY2lhbGl6YXRpb24gZm9yIHR5cGVzIHRoYXQgaGF2ZSBhIGZsZXhTaXplIG1lbWJlcgotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFMsIHVuc2lnbmVkPVM6OmZsZXhTaXplPgotICAgIHN0YXRpYyBzdGQ6OnRydWVfdHlwZSBfX3Rlc3RGbGV4U2l6ZShpbnQpOwotICAgIHRlbXBsYXRlPHR5cGVuYW1lPgotICAgIHN0YXRpYyBzdGQ6OmZhbHNlX3R5cGUgX190ZXN0RmxleFNpemUoLi4uKTsKLX07Ci0KLS8vLyBIZWxwZXIgdGVtcGxhdGUgdGhhdCByZXR1cm5zIGlmIGEgdHlwZSBoYXMgYW4gaW50ZWdlciBmbGV4U2l6ZSBtZW1iZXIuCi10ZW1wbGF0ZTx0eXBlbmFtZSBTPgotc3RydWN0IEMyX0hJREUgX0MyRmxleGlibGUKLSAgICA6IHB1YmxpYyBzdGQ6OmludGVncmFsX2NvbnN0YW50PGJvb2wsIGRlY2x0eXBlKF9DMkZsZXhpYmxlX2ltcGw6Ol9fdGVzdEZsZXhTaXplPFM+KDApKTo6dmFsdWU+IHsKLX07Ci0KLS8vLyBNYWNybyB0byB0ZXN0IGlmIGEgdHlwZSBpcyBmbGV4aWJsZSAoaGFzIGEgZmxleFNpemUgbWVtYmVyKS4KLSNkZWZpbmUgSUZfRkxFWElCTEUoUykgRU5BQkxFX0lGKF9DMkZsZXhpYmxlPFM+Ojp2YWx1ZSkKLS8vLyBTaG9ydGhhbmQgZm9yIHN0ZDo6ZW5hYmxlX2lmCi0jZGVmaW5lIEVOQUJMRV9JRihjb25kKSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxjb25kPjo6dHlwZQotCi0vLy8gSGVscGVyIHRlbXBsYXRlIHRoYXQgZXhwb3NlcyB0aGUgZmxleGlibGUgc3VidHlwZSBvZiBhIHN0cnVjdC4KLXRlbXBsYXRlPHR5cGVuYW1lIFMsIHR5cGVuYW1lIEU9dm9pZD4KLXN0cnVjdCBDMl9ISURFIF9DMkZsZXhIZWxwZXIgewotICAgIHR5cGVkZWYgdm9pZCBmbGV4VHlwZTsKLSAgICBlbnVtIDogdWludDMyX3QgeyBmbGV4U2l6ZSA9IDAgfTsKLX07Ci0KLS8vLyBTcGVjaWFsaXphdGlvbiBmb3IgZmxleGlibGUgdHlwZXMuCi10ZW1wbGF0ZTx0eXBlbmFtZSBTPgotc3RydWN0IEMyX0hJREUgX0MyRmxleEhlbHBlcjxTLAotICAgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwhc3RkOjppc192b2lkPHR5cGVuYW1lIFM6OmZsZXhNZW1iZXJUeXBlPjo6dmFsdWU+Ojp0eXBlPiB7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBfQzJGbGV4SGVscGVyPHR5cGVuYW1lIFM6OmZsZXhNZW1iZXJUeXBlPjo6ZmxleFR5cGUgZmxleFR5cGU7Ci0gICAgZW51bSA6IHVpbnQzMl90IHsgZmxleFNpemUgPSBfQzJGbGV4SGVscGVyPHR5cGVuYW1lIFM6OmZsZXhNZW1iZXJUeXBlPjo6ZmxleFNpemUgfTsKLX07Ci0KLS8vLyBTcGVjaWFsaXphdGlvbiBmb3IgZmxleCBhcnJheXMuCi10ZW1wbGF0ZTx0eXBlbmFtZSBTPgotc3RydWN0IEMyX0hJREUgX0MyRmxleEhlbHBlcjxTW10sCi0gICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfdm9pZDx0eXBlbmFtZSBfQzJGbGV4SGVscGVyPFM+OjpmbGV4VHlwZT46OnZhbHVlPjo6dHlwZT4gewotICAgIHR5cGVkZWYgUyBmbGV4VHlwZTsKLSAgICBlbnVtIDogdWludDMyX3QgeyBmbGV4U2l6ZSA9IHNpemVvZihTKSB9OwotfTsKLQotLyoqCi0gKiBcYnJpZWYgSGVscGVyIGNsYXNzIHRvIGNoZWNrIGZsZXhpYmxlIHN0cnVjdCByZXF1aXJlbWVudHMgYW5kIGFkZCBjb21tb24gb3BlcmF0aW9ucy4KLSAqCi0gKiBGZWF0dXJlczoKLSAqICAtIGV4cG9zZSBiYXNlSW5kZXggYW5kIGZpZWxkTGlzdCAodGhpcyBpcyBub3JtYWxseSBpbmhlcml0ZWQgZnJvbSB0aGUgc3RydWN0LCBidXQgZmxleGlibGUKLSAqICAgIHN0cnVjdHMgY2Fubm90IGJlIGJhc2UgY2xhc3NlcyBhbmQgdGh1cyBpbmhlcml0ZWQgZnJvbSkKLSAqICAtIGRpc2FibGUgY29weSBhc3NpZ25tZW50IGFuZCBjb25zdHJ1Y3Rpb24gKFRPRE86IHRoaXMgaXMgYWxyZWFkeSBkb25lIGluIHRoZSBGTEVYIG1hY3JvIGZvciB0aGUKLSAqICAgIGZsZXhpYmxlIHN0cnVjdCwgc28gbWF5IG5vdCBiZSBuZWVkZWQgaGVyZSkKLSAqLwotdGVtcGxhdGU8dHlwZW5hbWUgUywgaW50IEJhc2VJbmRleCwgdW5zaWduZWQgVHlwZUluZGV4Pgotc3RydWN0IEMyX0hJREUgQzJGbGV4U3RydWN0Q2hlY2sgOiBwdWJsaWMgQzJTdHJ1Y3RDaGVjazxTLCBCYXNlSW5kZXgsIFR5cGVJbmRleD4gewotcHVibGljOgotICAgIGVudW0gOiB1aW50MzJfdCB7Ci0gICAgICAgIC8vLyBcaGlkZWluaXRpYWxpemVyCi0gICAgICAgIGJhc2VJbmRleCA9IEJhc2VJbmRleCB8IEMyUGFyYW06OkJhc2VJbmRleDo6X2tGbGV4aWJsZUZsYWcsIC8vLzwgZmxleGlibGUgc3RydWN0IGJhc2UtaW5kZXgKLSAgICB9OwotCi0gICAgY29uc3Qgc3RhdGljIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxjb25zdCBDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRMaXN0OyAvLyBUT0RPIGFzc2lnbiBoZXJlCi0KLSAgICAvLyBkZWZhdWx0IGNvbnN0cnVjdG9yIG5lZWRlZCBiZWNhdXNlIG9mIHRoZSBkaXNhYmxlZCBjb3B5IGNvbnN0cnVjdG9yCi0gICAgaW5saW5lIEMyRmxleFN0cnVjdENoZWNrKCkgPSBkZWZhdWx0OwotCi1wcm90ZWN0ZWQ6Ci0gICAgLy8gY2Fubm90IGNvcHkgZmxleGlibGUgcGFyYW1zCi0gICAgQzJGbGV4U3RydWN0Q2hlY2soY29uc3QgQzJGbGV4U3RydWN0Q2hlY2s8UywgQmFzZUluZGV4LCBUeXBlSW5kZXg+ICYpID0gZGVsZXRlOwotICAgIEMyRmxleFN0cnVjdENoZWNrJiBvcGVyYXRvcj0gKGNvbnN0IEMyRmxleFN0cnVjdENoZWNrPFMsIEJhc2VJbmRleCwgVHlwZUluZGV4PiAmKSA9IGRlbGV0ZTsKLQotICAgIC8vIGNvbnN0YW50cyB1c2VkIGZvciBoZWxwZXIgbWV0aG9kcwotICAgIGVudW0gOiB1aW50MzJfdCB7Ci0gICAgICAgIC8vLyBcaGlkZWluaXRpYWxpemVyCi0gICAgICAgIGZsZXhTaXplID0gX0MyRmxleEhlbHBlcjxTPjo6ZmxleFNpemUsIC8vLzwgc2l6ZSBvZiBmbGV4aWJsZSB0eXBlCi0gICAgICAgIC8vLyBcaGlkZWluaXRpYWxpemVyCi0gICAgICAgIG1heFNpemUgPSAodWludDMyX3Qpc3RkOjptaW4oKHNpemVfdClVSU5UMzJfTUFYLCBTSVpFX01BWCksIC8vIFRPRE86IGlzIHRoaXMgYWx3YXlzIHUzMiBtYXg/Ci0gICAgICAgIC8vLyBcaGlkZWluaXRpYWxpemVyCi0gICAgICAgIGJhc2VTaXplID0gc2l6ZW9mKFMpICsgc2l6ZW9mKEMyUGFyYW0pLCAvLy88IHNpemUgb2YgdGhlIGJhc2UgcGFyYW0KLSAgICB9OwotCi0gICAgLy8vIHJldHVybnMgdGhlIGFsbG9jYXRlZCBzaXplIG9mIHRoaXMgcGFyYW0gd2l0aCBmbGV4Q291bnQsIG9yIDAgaWYgaXQgd291bGQgb3ZlcmZsb3cuCi0gICAgaW5saW5lIHN0YXRpYyBzaXplX3QgY2FsY1NpemUoc2l6ZV90IGZsZXhDb3VudCwgc2l6ZV90IHNpemUgPSBiYXNlU2l6ZSkgewotICAgICAgICBpZiAoZmxleENvdW50IDw9IChtYXhTaXplIC0gc2l6ZSkgLyBTOjpmbGV4U2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIHNpemUgKyBTOjpmbGV4U2l6ZSAqIGZsZXhDb3VudDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvLy8gZHluYW1pYyBuZXcgb3BlcmF0b3IgdXNhYmxlIGZvciBwYXJhbXMgb2YgdHlwZSBTCi0gICAgaW5saW5lIHZvaWQqIG9wZXJhdG9yIG5ldyhzaXplX3Qgc2l6ZSwgc2l6ZV90IGZsZXhDb3VudCkgbm9leGNlcHQgewotICAgICAgICAvLyBUT0RPOiBhc3NlcnQoc2l6ZSA9PSBiYXNlU2l6ZSk7Ci0gICAgICAgIHNpemUgPSBjYWxjU2l6ZShmbGV4Q291bnQsIHNpemUpOwotICAgICAgICBpZiAoc2l6ZSA+IDApIHsKLSAgICAgICAgICAgIHJldHVybiA6Om9wZXJhdG9yIG5ldyhzaXplKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci19OwotCi0vLyBUT0RPOiB0aGlzIHByb2JhYmx5IGRvZXMgbm90IHdvcmsuCi0vLy8gRXhwb3NlIGZpZWxkTGlzdCBmcm9tIHN1YkNsYXNzOwotdGVtcGxhdGU8dHlwZW5hbWUgUywgaW50IEJhc2VJbmRleCwgdW5zaWduZWQgVHlwZUluZGV4PgotY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PGNvbnN0IEMyRmllbGREZXNjcmlwdG9yPiBDMkZsZXhTdHJ1Y3RDaGVjazxTLCBCYXNlSW5kZXgsIFR5cGVJbmRleD46OmZpZWxkTGlzdCA9IFM6OmZpZWxkTGlzdDsKLQotLy8vIERlZmluZSBGcm9tKCkgY2FzdCBvcGVyYXRvcnMgZm9yIHBhcmFtcy4KLSNkZWZpbmUgREVGSU5FX0NBU1RfT1BFUkFUT1JTKF90eXBlKSBcCi0gICAgaW5saW5lIHN0YXRpYyBfdHlwZSogRnJvbShDMlBhcmFtICpvdGhlcikgeyBcCi0gICAgICAgIHJldHVybiAoX3R5cGUqKUMyUGFyYW06OmlmU3VpdGFibGUoIFwKLSAgICAgICAgICAgICAgICBvdGhlciwgc2l6ZW9mKF90eXBlKSxfdHlwZTo6dHlwZUluZGV4LCBfdHlwZTo6ZmxleFNpemUsIFwKLSAgICAgICAgICAgICAgICAoX3R5cGU6OnR5cGVJbmRleCAmIFQ6OkluZGV4OjprRGlyVW5kZWZpbmVkKSAhPSBUOjpJbmRleDo6a0RpclVuZGVmaW5lZCk7IFwKLSAgICB9IFwKLSAgICBpbmxpbmUgc3RhdGljIGNvbnN0IF90eXBlKiBGcm9tKGNvbnN0IEMyUGFyYW0gKm90aGVyKSB7IFwKLSAgICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8Y29uc3QgX3R5cGUqPihGcm9tKGNvbnN0X2Nhc3Q8QzJQYXJhbSAqPihvdGhlcikpKTsgXAotICAgIH0gXAotICAgIGlubGluZSBzdGF0aWMgX3R5cGUqIEZyb20oc3RkOjpudWxscHRyX3QpIHsgcmV0dXJuIG51bGxwdHI7IH0gXAotCi0vKioKLSAqIERlZmluZSBmbGV4aWJsZSBhbGxvY2F0b3JzIChhbGxvY19zaGFyZWQgb3IgYWxsb2NfdW5pcXVlKSBmb3IgZmxleGlibGUgcGFyYW1zLgotICogIC0gUDo6YWxsb2NfeHl6KGZsZXhDb3VudCwgYXJncy4uLik6IGFsbG9jYXRlIGZvciBnaXZlbiBmbGV4LWNvdW50LgotICogIC0gUDo6YWxsb2NfeHl6KGFyZ3MuLi4sIFRbXSk6IGFsbG9jYXRlIGZvciBzaXplIG9mIChhbmQgd2l0aCkgaW5pdCBhcnJheS4KLSAqICAtIFA6OmFsbG9jX3h5eihUW10pOiBhbGxvY2F0ZSBmb3Igc2l6ZSBvZiAoYW5kIHdpdGgpIGluaXQgYXJyYXkgd2l0aCBubyBvdGhlciBhcmdzLgotICogIC0gUDo6YWxsb2NfeHl6KGFyZ3MuLi4sIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPik6IGFsbG9jYXRlIGZvciBzaXplIG9mIChhbmQgd2l0aCkgaW5pdGlhbGl6ZXIKLSAqICAgIGxpc3QuCi0gKi8KLSNkZWZpbmUgREVGSU5FX0ZMRVhJQkxFX0FMTE9DKF90eXBlLCBTLCBwdHIpIFwKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPiBcCi0gICAgaW5saW5lIHN0YXRpYyBzdGQ6OnB0ciMjX3B0cjxfdHlwZT4gYWxsb2NfIyNwdHIoc2l6ZV90IGZsZXhDb3VudCwgY29uc3QgQXJncygmLi4uIGFyZ3MpKSB7IFwKLSAgICAgICAgcmV0dXJuIHN0ZDo6cHRyIyNfcHRyPF90eXBlPihuZXcoZmxleENvdW50KSBfdHlwZShmbGV4Q291bnQsIGFyZ3MuLi4pKTsgXAotICAgIH0gXAotICAgIC8qIE5PVEU6IHVuZm9ydHVuYXRlbHkgdGhpcyBpcyBub3Qgc3VwcG9ydGVkIGJ5IGNsYW5nIHlldCAqLyBcCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncywgdHlwZW5hbWUgVT10eXBlbmFtZSBTOjpmbGV4VHlwZSwgdW5zaWduZWQgTj4gXAotICAgIGlubGluZSBzdGF0aWMgc3RkOjpwdHIjI19wdHI8X3R5cGU+IGFsbG9jXyMjcHRyKGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSwgY29uc3QgVSgmaW5pdClbTl0pIHsgXAotICAgICAgICByZXR1cm4gc3RkOjpwdHIjI19wdHI8X3R5cGU+KG5ldyhOKSBfdHlwZShOLCBhcmdzLi4uLCBpbml0KSk7IFwKLSAgICB9IFwKLSAgICAvKiBzbyBmb3Igbm93LCBzcGVjaWFsaXplIGZvciBubyBhcmdzICovIFwKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPXR5cGVuYW1lIFM6OmZsZXhUeXBlLCB1bnNpZ25lZCBOPiBcCi0gICAgaW5saW5lIHN0YXRpYyBzdGQ6OnB0ciMjX3B0cjxfdHlwZT4gYWxsb2NfIyNwdHIoY29uc3QgVSgmaW5pdClbTl0pIHsgXAotICAgICAgICByZXR1cm4gc3RkOjpwdHIjI19wdHI8X3R5cGU+KG5ldyhOKSBfdHlwZShOLCBpbml0KSk7IFwKLSAgICB9IFwKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzLCB0eXBlbmFtZSBVPXR5cGVuYW1lIFM6OmZsZXhUeXBlPiBcCi0gICAgaW5saW5lIHN0YXRpYyBzdGQ6OnB0ciMjX3B0cjxfdHlwZT4gYWxsb2NfIyNwdHIoIFwKLSAgICAgICAgICAgIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSwgY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PFU+ICZpbml0KSB7IFwKLSAgICAgICAgcmV0dXJuIHN0ZDo6cHRyIyNfcHRyPF90eXBlPihuZXcoaW5pdC5zaXplKCkpIF90eXBlKGluaXQuc2l6ZSgpLCBhcmdzLi4uLCBpbml0KSk7IFwKLSAgICB9IFwKLQotLyoqCi0gKiBEZWZpbmUgZmxleGlibGUgbWV0aG9kcyBhbGxvY19zaGFyZWQsIGFsbG9jX3VuaXF1ZSBhbmQgZmxleENvdW50LgotICovCi0jZGVmaW5lIERFRklORV9GTEVYSUJMRV9NRVRIT0RTKF90eXBlLCBTKSBcCi0gICAgREVGSU5FX0ZMRVhJQkxFX0FMTE9DKF90eXBlLCBTLCBzaGFyZWQpIFwKLSAgICBERUZJTkVfRkxFWElCTEVfQUxMT0MoX3R5cGUsIFMsIHVuaXF1ZSkgXAotICAgIGlubGluZSBzaXplX3QgZmxleENvdW50KCkgY29uc3QgeyBcCi0gICAgICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKF90eXBlKSA9PSBfdHlwZTo6YmFzZVNpemUsICJpbmNvcnJlY3QgYmFzZVNpemUiKTsgXAotICAgICAgICBzaXplX3Qgc3ogPSB0aGlzLT5zaXplKCk7IFwKLSAgICAgICAgaWYgKHN6ID49IHNpemVvZihfdHlwZSkpIHsgXAotICAgICAgICAgICAgcmV0dXJuIChzeiAtIHNpemVvZihfdHlwZSkpIC8gX3R5cGU6OmZsZXhTaXplOyBcCi0gICAgICAgIH0gXAotICAgICAgICByZXR1cm4gMDsgXAotICAgIH0gXAotCi0vLy8gTWFyayBmbGV4aWJsZSBtZW1iZXIgdmFyaWFibGUgYW5kIG1ha2Ugc3RydWN0dXJlIGZsZXhpYmxlLgotI2RlZmluZSBGTEVYKGNscywgbSkgXAotICAgIEMyX0RPX05PVF9DT1BZKGNscykgXAotcHJpdmF0ZTogXAotICAgIEMyUEFSQU1fTUFLRV9GUklFTkRTIFwKLSAgICAvKiBkZWZhdWx0IGNvbnN0cnVjdG9yIHdpdGggZmxleENvdW50ICovIFwKLSAgICBpbmxpbmUgY2xzKHNpemVfdCkgOiBjbHMoKSB7fSBcCi0gICAgLyoqIFxpZiAwICovIFwKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+IGZyaWVuZCBzdHJ1Y3QgX0MyRmxleEhlbHBlcjsgXAotICAgIHR5cGVkZWYgZGVjbHR5cGUobSkgZmxleE1lbWJlclR5cGU7IFwKLXB1YmxpYzogXAotICAgIC8qIGNvbnN0ZXhwciBzdGF0aWMgZmxleE1lbWJlclR5cGUgY2xzOjoqIGZsZXhNZW1iZXIgPSAmY2xzOjptOyAqLyBcCi0gICAgdHlwZWRlZiB0eXBlbmFtZSBfQzJGbGV4SGVscGVyPGZsZXhNZW1iZXJUeXBlPjo6ZmxleFR5cGUgZmxleFR5cGU7IFwKLSAgICBzdGF0aWNfYXNzZXJ0KFwKLSAgICAgICAgICAgICFzdGQ6OmlzX3ZvaWQ8ZmxleFR5cGU+Ojp2YWx1ZSwgXAotICAgICAgICAgICAgIm1lbWJlciBpcyBub3QgZmxleGlibGUsIG9yIGEgZmxleGlibGUgYXJyYXkgb2YgYSBmbGV4aWJsZSB0eXBlIik7IFwKLSAgICBlbnVtIDogdWludDMyX3QgeyBmbGV4U2l6ZSA9IF9DMkZsZXhIZWxwZXI8ZmxleE1lbWJlclR5cGU+OjpmbGV4U2l6ZSB9OyBcCi0gICAgLyoqIFxlbmRpZiAqLyBcCi0KLS8vLyBAfQotCi0vKioKLSAqIEdsb2JhbC1wYXJhbWV0ZXIgdGVtcGxhdGUuCi0gKgotICogQmFzZSB0ZW1wbGF0ZSB0byBkZWZpbmUgYSBnbG9iYWwgc2V0dGluZy90dW5pbmcgb3IgaW5mbyBiYXNlZCBvbiBhIHN0cnVjdHVyZSBhbmQKLSAqIGFuIG9wdGlvbmFsIEJhc2VJbmRleC4gR2xvYmFsIHBhcmFtZXRlcnMgYXJlIG5vdCB0aWVkIHRvIGEgcG9ydCAoaW5wdXQgb3Igb3V0cHV0KS4KLSAqCi0gKiBQYXJhbWV0ZXJzIHdyYXAgc3RydWN0dXJlcyBieSBwcmVwZW5kaW5nIGEgKHBhcmFtZXRlcikgaGVhZGVyLiBUaGUgZmllbGRzIG9mIHRoZSB3cmFwcGVkCi0gKiBzdHJ1Y3R1cmUgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5LCBhbmQgY29uc3RydWN0b3JzIGFuZCBwb3RlbnRpYWwgcHVibGljIG1ldGhvZHMgYXJlIGFsc28KLSAqIHdyYXBwZWQuCi0gKgotICogXHRwYXJhbSBUIHBhcmFtIHR5cGUgQzJTZXR0aW5nLCBDMlR1bmluZyBvciBDMkluZm8KLSAqIFx0cGFyYW0gUyB3cmFwcGVkIHN0cnVjdHVyZQotICogXHRwYXJhbSBCYXNlSW5kZXggb3B0aW9uYWwgYmFzZS1pbmRleCBvdmVycmlkZS4gTXVzdCBiZSBzcGVjaWZpZWQgZm9yIGNvbW1vbi9yZXVzZWQgc3RydWN0dXJlcy4KLSAqLwotdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUywgaW50IEJhc2VJbmRleD1TOjpiYXNlSW5kZXgsIGNsYXNzIEZsZXg9dm9pZD4KLXN0cnVjdCBDMl9ISURFIEMyR2xvYmFsUGFyYW0gOiBwdWJsaWMgVCwgcHVibGljIFMsIHB1YmxpYyBDMkJhc2VJbmRleE92ZXJyaWRlPFMsIEJhc2VJbmRleD4sCi0gICAgICAgIHB1YmxpYyBDMlN0cnVjdENoZWNrPFMsIEJhc2VJbmRleCwgVDo6aW5kZXhGbGFncyB8IFQ6OlR5cGU6OmtEaXJHbG9iYWw+IHsKLXByaXZhdGU6Ci0gICAgdHlwZWRlZiBDMkdsb2JhbFBhcmFtPFQsIFMsIEJhc2VJbmRleD4gX3R5cGU7Ci0KLXB1YmxpYzoKLSAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3Rvci4KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgotICAgIGlubGluZSBDMkdsb2JhbFBhcmFtKGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkgOiBUKHNpemVvZihfdHlwZSksIF90eXBlOjp0eXBlSW5kZXgpLCBTKGFyZ3MuLi4pIHsgfQotCi0gICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKF90eXBlKQotfTsKLQotLyoqCi0gKiBHbG9iYWwtcGFyYW1ldGVyIHRlbXBsYXRlIGZvciBmbGV4aWJsZSBzdHJ1Y3R1cmVzLgotICoKLSAqIEJhc2UgdGVtcGxhdGUgdG8gZGVmaW5lIGEgZ2xvYmFsIHNldHRpbmcvdHVuaW5nIG9yIGluZm8gYmFzZWQgb24gYSBmbGV4aWJsZSBzdHJ1Y3R1cmUgYW5kCi0gKiBhbiBvcHRpb25hbCBCYXNlSW5kZXguIEdsb2JhbCBwYXJhbWV0ZXJzIGFyZSBub3QgdGllZCB0byBhIHBvcnQgKGlucHV0IG9yIG91dHB1dCkuCi0gKgotICogXHRwYXJhbSBUIHBhcmFtIHR5cGUgQzJTZXR0aW5nLCBDMlR1bmluZyBvciBDMkluZm8KLSAqIFx0cGFyYW0gUyB3cmFwcGVkIGZsZXhpYmxlIHN0cnVjdHVyZQotICogXHRwYXJhbSBCYXNlSW5kZXggb3B0aW9uYWwgYmFzZS1pbmRleCBvdmVycmlkZS4gTXVzdCBiZSBzcGVjaWZpZWQgZm9yIGNvbW1vbi9yZXVzZWQgc3RydWN0dXJlcy4KLSAqCi0gKiBQYXJhbWV0ZXJzIHdyYXAgc3RydWN0dXJlcyBieSBwcmVwZW5kaW5nIGEgKHBhcmFtZXRlcikgaGVhZGVyLiBUaGUgZmllbGRzIGFuZCBtZXRob2RzIG9mIGZsZXhpYmxlCi0gKiBzdHJ1Y3R1cmVzIGNhbiBiZSBhY2Nlc3NlZCB2aWEgdGhlIG0gbWVtYmVyIHZhcmlhYmxlOyBob3dldmVyLCB0aGUgY29uc3RydWN0b3JzIG9mIHRoZSBzdHJ1Y3R1cmUKLSAqIGFyZSB3cmFwcGVkIGRpcmVjdGx5LiAoVGhpcyBpcyBiZWNhdXNlIGZsZXhpYmxlIHR5cGVzIGNhbm5vdCBiZSBzdWJjbGFzc2VkLikKLSAqLwotdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUywgaW50IEJhc2VJbmRleD4KLXN0cnVjdCBDMl9ISURFIEMyR2xvYmFsUGFyYW08VCwgUywgQmFzZUluZGV4LCBJRl9GTEVYSUJMRShTKT4KLSAgICA6IHB1YmxpYyBULCBwdWJsaWMgQzJGbGV4U3RydWN0Q2hlY2s8UywgQmFzZUluZGV4LCBUOjppbmRleEZsYWdzIHwgVDo6VHlwZTo6a0Rpckdsb2JhbD4gewotcHJpdmF0ZToKLSAgICB0eXBlZGVmIEMyR2xvYmFsUGFyYW08VCwgUywgQmFzZUluZGV4PiBfdHlwZTsKLQotICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yLgotICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+Ci0gICAgaW5saW5lIEMyR2xvYmFsUGFyYW0oc2l6ZV90IGZsZXhDb3VudCwgY29uc3QgQXJncygmLi4uIGFyZ3MpKQotICAgICAgICA6IFQoX3R5cGU6OmNhbGNTaXplKGZsZXhDb3VudCksIF90eXBlOjp0eXBlSW5kZXgpLCBtKGZsZXhDb3VudCwgYXJncy4uLikgeyB9Ci0KLXB1YmxpYzoKLSAgICBTIG07IC8vLzwgd3JhcHBlZCBmbGV4aWJsZSBzdHJ1Y3R1cmUKLQotICAgIERFRklORV9GTEVYSUJMRV9NRVRIT0RTKF90eXBlLCBTKQotICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhfdHlwZSkKLX07Ci0KLS8qKgotICogUG9ydC1wYXJhbWV0ZXIgdGVtcGxhdGUuCi0gKgotICogQmFzZSB0ZW1wbGF0ZSB0byBkZWZpbmUgYSBwb3J0IHNldHRpbmcvdHVuaW5nIG9yIGluZm8gYmFzZWQgb24gYSBzdHJ1Y3R1cmUgYW5kCi0gKiBhbiBvcHRpb25hbCBCYXNlSW5kZXguIFBvcnQgcGFyYW1ldGVycyBhcmUgdGllZCB0byBhIHBvcnQgKGlucHV0IG9yIG91dHB1dCksIGJ1dCBub3QgdG8gYQotICogc3BlY2lmaWMgc3RyZWFtLgotICoKLSAqIFx0cGFyYW0gVCBwYXJhbSB0eXBlIEMyU2V0dGluZywgQzJUdW5pbmcgb3IgQzJJbmZvCi0gKiBcdHBhcmFtIFMgd3JhcHBlZCBzdHJ1Y3R1cmUKLSAqIFx0cGFyYW0gQmFzZUluZGV4IG9wdGlvbmFsIGJhc2UtaW5kZXggb3ZlcnJpZGUuIE11c3QgYmUgc3BlY2lmaWVkIGZvciBjb21tb24vcmV1c2VkIHN0cnVjdHVyZXMuCi0gKgotICogUGFyYW1ldGVycyB3cmFwIHN0cnVjdHVyZXMgYnkgcHJlcGVuZGluZyBhIChwYXJhbWV0ZXIpIGhlYWRlci4gVGhlIGZpZWxkcyBvZiB0aGUgd3JhcHBlZAotICogc3RydWN0dXJlIGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSwgYW5kIGNvbnN0cnVjdG9ycyBhbmQgcG90ZW50aWFsIHB1YmxpYyBtZXRob2RzIGFyZSBhbHNvCi0gKiB3cmFwcGVkLgotICoKLSAqIFRoZXJlIGFyZSAzIGZsYXZvcnMgb2YgcG9ydCBwYXJhbWV0ZXJzOiB1bnNwZWNpZmllZCwgaW5wdXQgYW5kIG91dHB1dC4gUGFyYW1ldGVycyB3aXRoCi0gKiB1bnNwZWNpZmllZCBwb3J0IGV4cG9zZSBhIHNldFBvcnQgbWV0aG9kLCBhbmQgYWRkIGFuIGluaXRpYWwgcG9ydCBwYXJhbWV0ZXIgdG8gdGhlIGNvbnN0cnVjdG9yLgotICovCi10ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTLCBpbnQgQmFzZUluZGV4PVM6OmJhc2VJbmRleCwgY2xhc3MgRmxleD12b2lkPgotc3RydWN0IEMyX0hJREUgQzJQb3J0UGFyYW0gOiBwdWJsaWMgVCwgcHVibGljIFMsIHB1YmxpYyBDMkJhc2VJbmRleE92ZXJyaWRlPFMsIEJhc2VJbmRleD4sCi0gICAgICAgIHByaXZhdGUgQzJTdHJ1Y3RDaGVjazxTLCBCYXNlSW5kZXgsIFQ6OmluZGV4RmxhZ3MgfCBUOjpJbmRleDo6a0RpclVuZGVmaW5lZD4gewotcHJpdmF0ZToKLSAgICB0eXBlZGVmIEMyUG9ydFBhcmFtPFQsIFMsIEJhc2VJbmRleD4gX3R5cGU7Ci0KLXB1YmxpYzoKLSAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICBpbmxpbmUgQzJQb3J0UGFyYW0oKSA6IFQoc2l6ZW9mKF90eXBlKSwgX3R5cGU6OnR5cGVJbmRleCkgeyB9Ci0gICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KLSAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3RvciB3aGlsZSBzcGVjaWZ5aW5nIHBvcnQvZGlyZWN0aW9uLgotICAgIGlubGluZSBDMlBvcnRQYXJhbShib29sIF9vdXRwdXQsIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkKLSAgICAgICAgOiBUKHNpemVvZihfdHlwZSksIF9vdXRwdXQgPyBvdXRwdXQ6OnR5cGVJbmRleCA6IGlucHV0Ojp0eXBlSW5kZXgpLCBTKGFyZ3MuLi4pIHsgfQotICAgIC8vLyBTZXQgcG9ydC9kaXJlY3Rpb24uCi0gICAgaW5saW5lIHZvaWQgc2V0UG9ydChib29sIG91dHB1dCkgeyBDMlBhcmFtOjpzZXRQb3J0KG91dHB1dCk7IH0KLQotICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhfdHlwZSkKLQotICAgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgYW4gaW5wdXQgcG9ydCBwYXJhbWV0ZXIuCi0gICAgc3RydWN0IGlucHV0IDogcHVibGljIFQsIHB1YmxpYyBTLCBwdWJsaWMgQzJCYXNlSW5kZXhPdmVycmlkZTxTLCBCYXNlSW5kZXg+LAotICAgICAgICAgICAgcHVibGljIEMyU3RydWN0Q2hlY2s8UywgQmFzZUluZGV4LCBUOjppbmRleEZsYWdzIHwgVDo6SW5kZXg6OmtEaXJJbnB1dD4gewotICAgICAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3Rvci4KLSAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KLSAgICAgICAgaW5saW5lIGlucHV0KGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkgOiBUKHNpemVvZihfdHlwZSksIGlucHV0Ojp0eXBlSW5kZXgpLCBTKGFyZ3MuLi4pIHsgfQotCi0gICAgICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhpbnB1dCkKLQotICAgIH07Ci0KLSAgICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGFuIG91dHB1dCBwb3J0IHBhcmFtZXRlci4KLSAgICBzdHJ1Y3Qgb3V0cHV0IDogcHVibGljIFQsIHB1YmxpYyBTLCBwdWJsaWMgQzJCYXNlSW5kZXhPdmVycmlkZTxTLCBCYXNlSW5kZXg+LAotICAgICAgICAgICAgcHVibGljIEMyU3RydWN0Q2hlY2s8UywgQmFzZUluZGV4LCBUOjppbmRleEZsYWdzIHwgVDo6SW5kZXg6OmtEaXJPdXRwdXQ+IHsKLSAgICAgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3IuCi0gICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+Ci0gICAgICAgIGlubGluZSBvdXRwdXQoY29uc3QgQXJncygmLi4uIGFyZ3MpKSA6IFQoc2l6ZW9mKF90eXBlKSwgb3V0cHV0Ojp0eXBlSW5kZXgpLCBTKGFyZ3MuLi4pIHsgfQotCi0gICAgICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhvdXRwdXQpCi0gICAgfTsKLX07Ci0KLS8qKgotICogUG9ydC1wYXJhbWV0ZXIgdGVtcGxhdGUgZm9yIGZsZXhpYmxlIHN0cnVjdHVyZXMuCi0gKgotICogQmFzZSB0ZW1wbGF0ZSB0byBkZWZpbmUgYSBwb3J0IHNldHRpbmcvdHVuaW5nIG9yIGluZm8gYmFzZWQgb24gYSBmbGV4aWJsZSBzdHJ1Y3R1cmUgYW5kCi0gKiBhbiBvcHRpb25hbCBCYXNlSW5kZXguIFBvcnQgcGFyYW1ldGVycyBhcmUgdGllZCB0byBhIHBvcnQgKGlucHV0IG9yIG91dHB1dCksIGJ1dCBub3QgdG8gYQotICogc3BlY2lmaWMgc3RyZWFtLgotICoKLSAqIFx0cGFyYW0gVCBwYXJhbSB0eXBlIEMyU2V0dGluZywgQzJUdW5pbmcgb3IgQzJJbmZvCi0gKiBcdHBhcmFtIFMgd3JhcHBlZCBmbGV4aWJsZSBzdHJ1Y3R1cmUKLSAqIFx0cGFyYW0gQmFzZUluZGV4IG9wdGlvbmFsIGJhc2UtaW5kZXggb3ZlcnJpZGUuIE11c3QgYmUgc3BlY2lmaWVkIGZvciBjb21tb24vcmV1c2VkIHN0cnVjdHVyZXMuCi0gKgotICogUGFyYW1ldGVycyB3cmFwIHN0cnVjdHVyZXMgYnkgcHJlcGVuZGluZyBhIChwYXJhbWV0ZXIpIGhlYWRlci4gVGhlIGZpZWxkcyBhbmQgbWV0aG9kcyBvZiBmbGV4aWJsZQotICogc3RydWN0dXJlcyBjYW4gYmUgYWNjZXNzZWQgdmlhIHRoZSBtIG1lbWJlciB2YXJpYWJsZTsgaG93ZXZlciwgdGhlIGNvbnN0cnVjdG9ycyBvZiB0aGUgc3RydWN0dXJlCi0gKiBhcmUgd3JhcHBlZCBkaXJlY3RseS4gKFRoaXMgaXMgYmVjYXVzZSBmbGV4aWJsZSB0eXBlcyBjYW5ub3QgYmUgc3ViY2xhc3NlZC4pCi0gKgotICogVGhlcmUgYXJlIDMgZmxhdm9ycyBvZiBwb3J0IHBhcmFtZXRlcnM6IHVuc3BlY2lmaWVkLCBpbnB1dCBhbmQgb3V0cHV0LiBQYXJhbWV0ZXJzIHdpdGgKLSAqIHVuc3BlY2lmaWVkIHBvcnQgZXhwb3NlIGEgc2V0UG9ydCBtZXRob2QsIGFuZCBhZGQgYW4gaW5pdGlhbCBwb3J0IHBhcmFtZXRlciB0byB0aGUgY29uc3RydWN0b3IuCi0gKi8KLXRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFMsIGludCBCYXNlSW5kZXg+Ci1zdHJ1Y3QgQzJfSElERSBDMlBvcnRQYXJhbTxULCBTLCBCYXNlSW5kZXgsIElGX0ZMRVhJQkxFKFMpPgotICAgIDogcHVibGljIFQsIHB1YmxpYyBDMkZsZXhTdHJ1Y3RDaGVjazxTLCBCYXNlSW5kZXgsIFQ6OmluZGV4RmxhZ3MgfCBUOjpUeXBlOjprRGlyVW5kZWZpbmVkPiB7Ci1wcml2YXRlOgotICAgIHR5cGVkZWYgQzJQb3J0UGFyYW08VCwgUywgQmFzZUluZGV4PiBfdHlwZTsKLQotICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yIGZvciBiYXNpYyBhbGxvY2F0aW9uOiBuZXcoZmxleENvdW50KSBQLgotICAgIGlubGluZSBDMlBvcnRQYXJhbShzaXplX3QgZmxleENvdW50KSA6IFQoX3R5cGU6OmNhbGNTaXplKGZsZXhDb3VudCksIF90eXBlOjp0eXBlSW5kZXgpIHsgfQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+Ci0gICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3Igd2hpbGUgYWxzbyBzcGVjaWZ5aW5nIHBvcnQvZGlyZWN0aW9uLgotICAgIGlubGluZSBDMlBvcnRQYXJhbShzaXplX3QgZmxleENvdW50LCBib29sIF9vdXRwdXQsIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkKLSAgICAgICAgOiBUKF90eXBlOjpjYWxjU2l6ZShmbGV4Q291bnQpLCBfb3V0cHV0ID8gb3V0cHV0Ojp0eXBlSW5kZXggOiBpbnB1dDo6dHlwZUluZGV4KSwKLSAgICAgICAgICBtKGZsZXhDb3VudCwgYXJncy4uLikgeyB9Ci0KLXB1YmxpYzoKLSAgICAvLy8gU2V0IHBvcnQvZGlyZWN0aW9uLgotICAgIGlubGluZSB2b2lkIHNldFBvcnQoYm9vbCBvdXRwdXQpIHsgQzJQYXJhbTo6c2V0UG9ydChvdXRwdXQpOyB9Ci0KLSAgICBTIG07IC8vLzwgd3JhcHBlZCBmbGV4aWJsZSBzdHJ1Y3R1cmUKLQotICAgIERFRklORV9GTEVYSUJMRV9NRVRIT0RTKF90eXBlLCBTKQotICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhfdHlwZSkKLQotICAgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgYW4gaW5wdXQgcG9ydCBwYXJhbWV0ZXIuCi0gICAgc3RydWN0IGlucHV0IDogcHVibGljIFQsIHB1YmxpYyBDMkJhc2VJbmRleE92ZXJyaWRlPFMsIEJhc2VJbmRleD4sCi0gICAgICAgICAgICBwdWJsaWMgQzJGbGV4U3RydWN0Q2hlY2s8UywgQmFzZUluZGV4LCBUOjppbmRleEZsYWdzIHwgVDo6SW5kZXg6OmtEaXJJbnB1dD4gewotICAgIHByaXZhdGU6Ci0gICAgICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yIHdoaWxlIGFsc28gc3BlY2lmeWluZyBwb3J0L2RpcmVjdGlvbi4KLSAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KLSAgICAgICAgaW5saW5lIGlucHV0KHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkKLSAgICAgICAgICAgIDogVChfdHlwZTo6Y2FsY1NpemUoZmxleENvdW50KSwgaW5wdXQ6OnR5cGVJbmRleCksIG0oZmxleENvdW50LCBhcmdzLi4uKSB7IH0KLQotICAgIHB1YmxpYzoKLSAgICAgICAgUyBtOyAvLy88IHdyYXBwZWQgZmxleGlibGUgc3RydWN0dXJlCi0KLSAgICAgICAgREVGSU5FX0ZMRVhJQkxFX01FVEhPRFMoaW5wdXQsIFMpCi0gICAgICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhpbnB1dCkKLSAgICB9OwotCi0gICAgLy8vIFNwZWNpYWxpemF0aW9uIGZvciBhbiBvdXRwdXQgcG9ydCBwYXJhbWV0ZXIuCi0gICAgc3RydWN0IG91dHB1dCA6IHB1YmxpYyBULCBwdWJsaWMgQzJCYXNlSW5kZXhPdmVycmlkZTxTLCBCYXNlSW5kZXg+LAotICAgICAgICAgICAgcHVibGljIEMyRmxleFN0cnVjdENoZWNrPFMsIEJhc2VJbmRleCwgVDo6aW5kZXhGbGFncyB8IFQ6OkluZGV4OjprRGlyT3V0cHV0PiB7Ci0gICAgcHJpdmF0ZToKLSAgICAgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3Igd2hpbGUgYWxzbyBzcGVjaWZ5aW5nIHBvcnQvZGlyZWN0aW9uLgotICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgotICAgICAgICBpbmxpbmUgb3V0cHV0KHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkKLSAgICAgICAgICAgIDogVChfdHlwZTo6Y2FsY1NpemUoZmxleENvdW50KSwgb3V0cHV0Ojp0eXBlSW5kZXgpLCBtKGZsZXhDb3VudCwgYXJncy4uLikgeyB9Ci0KLSAgICBwdWJsaWM6Ci0gICAgICAgIFMgbTsgLy8vPCB3cmFwcGVkIGZsZXhpYmxlIHN0cnVjdHVyZQotCi0gICAgICAgIERFRklORV9GTEVYSUJMRV9NRVRIT0RTKG91dHB1dCwgUykKLSAgICAgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKG91dHB1dCkKLSAgICB9OwotfTsKLQotLyoqCi0gKiBTdHJlYW0tcGFyYW1ldGVyIHRlbXBsYXRlLgotICoKLSAqIEJhc2UgdGVtcGxhdGUgdG8gZGVmaW5lIGEgc3RyZWFtIHNldHRpbmcvdHVuaW5nIG9yIGluZm8gYmFzZWQgb24gYSBzdHJ1Y3R1cmUgYW5kCi0gKiBhbiBvcHRpb25hbCBCYXNlSW5kZXguIFN0cmVhbSBwYXJhbWV0ZXJzIGFyZSB0aWVkIHRvIGEgc3BlY2lmaWMgc3RyZWFtIG9uIGEgcG9ydCAoaW5wdXQgb3IKLSAqIG91dHB1dCkuCi0gKgotICogXHRwYXJhbSBUIHBhcmFtIHR5cGUgQzJTZXR0aW5nLCBDMlR1bmluZyBvciBDMkluZm8KLSAqIFx0cGFyYW0gUyB3cmFwcGVkIHN0cnVjdHVyZQotICogXHRwYXJhbSBCYXNlSW5kZXggb3B0aW9uYWwgYmFzZS1pbmRleCBvdmVycmlkZS4gTXVzdCBiZSBzcGVjaWZpZWQgZm9yIGNvbW1vbi9yZXVzZWQgc3RydWN0dXJlcy4KLSAqCi0gKiBQYXJhbWV0ZXJzIHdyYXAgc3RydWN0dXJlcyBieSBwcmVwZW5kaW5nIGEgKHBhcmFtZXRlcikgaGVhZGVyLiBUaGUgZmllbGRzIG9mIHRoZSB3cmFwcGVkCi0gKiBzdHJ1Y3R1cmUgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5LCBhbmQgY29uc3RydWN0b3JzIGFuZCBwb3RlbnRpYWwgcHVibGljIG1ldGhvZHMgYXJlIGFsc28KLSAqIHdyYXBwZWQuCi0gKgotICogVGhlcmUgYXJlIDMgZmxhdm9ycyBvZiBzdHJlYW0gcGFyYW1ldGVyczogdW5zcGVjaWZpZWQgcG9ydCwgaW5wdXQgYW5kIG91dHB1dC4gQWxsIG9mIHRoZXNlIGV4cG9zZQotICogYSBzZXRTdHJlYW0gbWV0aG9kIGFuZCBhbiBleHRyYSBpbml0aWFsIHN0cmVhbUlEIHBhcmFtZXRlciBmb3IgdGhlIGNvbnN0cnVjdG9yLiBNb3Jlb3ZlciwKLSAqIHBhcmFtZXRlcnMgd2l0aCB1bnNwZWNpZmllZCBwb3J0IGV4cG9zZSBhIHNldFBvcnQgbWV0aG9kLCBhbmQgYWRkIGFuIGFkZGl0aW9uYWwgaW5pdGlhbCBwb3J0Ci0gKiBwYXJhbWV0ZXIgdG8gdGhlIGNvbnN0cnVjdG9yLgotICovCi10ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTLCBpbnQgQmFzZUluZGV4PVM6OmJhc2VJbmRleCwgY2xhc3MgRmxleD12b2lkPgotc3RydWN0IEMyX0hJREUgQzJTdHJlYW1QYXJhbSA6IHB1YmxpYyBULCBwdWJsaWMgUywgcHVibGljIEMyQmFzZUluZGV4T3ZlcnJpZGU8UywgQmFzZUluZGV4PiwKLSAgICAgICAgcHJpdmF0ZSBDMlN0cnVjdENoZWNrPFMsIEJhc2VJbmRleCwKLSAgICAgICAgICAgICAgICBUOjppbmRleEZsYWdzIHwgVDo6SW5kZXg6OmtTdHJlYW1GbGFnIHwgVDo6SW5kZXg6OmtEaXJVbmRlZmluZWQ+IHsKLXByaXZhdGU6Ci0gICAgdHlwZWRlZiBDMlN0cmVhbVBhcmFtPFQsIFMsIEJhc2VJbmRleD4gX3R5cGU7Ci0KLXB1YmxpYzoKLSAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4gUG9ydC9kaXJlY3Rpb24gYW5kIHN0cmVhbS1JRCBpcyB1bmRlZmluZWQuCi0gICAgaW5saW5lIEMyU3RyZWFtUGFyYW0oKSA6IFQoc2l6ZW9mKF90eXBlKSwgX3R5cGU6OnR5cGVJbmRleCkgeyB9Ci0gICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3Igd2hpbGUgYWxzbyBzcGVjaWZ5aW5nIHBvcnQvZGlyZWN0aW9uIGFuZAotICAgIC8vLyBzdHJlYW0tSUQuCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KLSAgICBpbmxpbmUgQzJTdHJlYW1QYXJhbShib29sIF9vdXRwdXQsIHVuc2lnbmVkIHN0cmVhbSwgY29uc3QgQXJncygmLi4uIGFyZ3MpKQotICAgICAgICA6IFQoc2l6ZW9mKF90eXBlKSwgX291dHB1dCA/IG91dHB1dDo6dHlwZUluZGV4IDogaW5wdXQ6OnR5cGVJbmRleCwgc3RyZWFtKSwKLSAgICAgICAgICBTKGFyZ3MuLi4pIHsgfQotICAgIC8vLyBTZXQgcG9ydC9kaXJlY3Rpb24uCi0gICAgaW5saW5lIHZvaWQgc2V0UG9ydChib29sIG91dHB1dCkgeyBDMlBhcmFtOjpzZXRQb3J0KG91dHB1dCk7IH0KLSAgICAvLy8gU2V0IHN0cmVhbS1pZC4gXHJldHZhbCB0cnVlIGlmIHRoZSBzdHJlYW0taWQgd2FzIHN1Y2Nlc3NmdWxseSBzZXQuCi0gICAgaW5saW5lIGJvb2wgc2V0U3RyZWFtKHVuc2lnbmVkIHN0cmVhbSkgeyByZXR1cm4gQzJQYXJhbTo6c2V0U3RyZWFtKHN0cmVhbSk7IH0KLQotICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhfdHlwZSkKLQotICAgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgYW4gaW5wdXQgc3RyZWFtIHBhcmFtZXRlci4KLSAgICBzdHJ1Y3QgaW5wdXQgOiBwdWJsaWMgVCwgcHVibGljIFMsIHB1YmxpYyBDMkJhc2VJbmRleE92ZXJyaWRlPFMsIEJhc2VJbmRleD4sCi0gICAgICAgICAgICBwdWJsaWMgQzJTdHJ1Y3RDaGVjazxTLCBCYXNlSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgIFQ6OmluZGV4RmxhZ3MgfCBUOjpJbmRleDo6a1N0cmVhbUZsYWcgfCBUOjpUeXBlOjprRGlySW5wdXQ+IHsKLSAgICAgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IuIFN0cmVhbS1JRCBpcyB1bmRlZmluZWQuCi0gICAgICAgIGlubGluZSBpbnB1dCgpIDogVChzaXplb2YoX3R5cGUpLCBpbnB1dDo6dHlwZUluZGV4KSB7IH0KLSAgICAgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3Igd2hpbGUgYWxzbyBzcGVjaWZ5aW5nIHN0cmVhbS1JRC4KLSAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KLSAgICAgICAgaW5saW5lIGlucHV0KHVuc2lnbmVkIHN0cmVhbSwgY29uc3QgQXJncygmLi4uIGFyZ3MpKQotICAgICAgICAgICAgOiBUKHNpemVvZihfdHlwZSksIGlucHV0Ojp0eXBlSW5kZXgsIHN0cmVhbSksIFMoYXJncy4uLikgeyB9Ci0gICAgICAgIC8vLyBTZXQgc3RyZWFtLWlkLiBccmV0dmFsIHRydWUgaWYgdGhlIHN0cmVhbS1pZCB3YXMgc3VjY2Vzc2Z1bGx5IHNldC4KLSAgICAgICAgaW5saW5lIGJvb2wgc2V0U3RyZWFtKHVuc2lnbmVkIHN0cmVhbSkgeyByZXR1cm4gQzJQYXJhbTo6c2V0U3RyZWFtKHN0cmVhbSk7IH0KLQotICAgICAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMoaW5wdXQpCi0gICAgfTsKLQotICAgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgYW4gb3V0cHV0IHN0cmVhbSBwYXJhbWV0ZXIuCi0gICAgc3RydWN0IG91dHB1dCA6IHB1YmxpYyBULCBwdWJsaWMgUywgcHVibGljIEMyQmFzZUluZGV4T3ZlcnJpZGU8UywgQmFzZUluZGV4PiwKLSAgICAgICAgICAgIHB1YmxpYyBDMlN0cnVjdENoZWNrPFMsIEJhc2VJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgVDo6aW5kZXhGbGFncyB8IFQ6OkluZGV4OjprU3RyZWFtRmxhZyB8IFQ6OlR5cGU6OmtEaXJPdXRwdXQ+IHsKLSAgICAgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IuIFN0cmVhbS1JRCBpcyB1bmRlZmluZWQuCi0gICAgICAgIGlubGluZSBvdXRwdXQoKSA6IFQoc2l6ZW9mKF90eXBlKSwgb3V0cHV0Ojp0eXBlSW5kZXgpIHsgfQotICAgICAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3RvciB3aGlsZSBhbHNvIHNwZWNpZnlpbmcgc3RyZWFtLUlELgotICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgotICAgICAgICBpbmxpbmUgb3V0cHV0KHVuc2lnbmVkIHN0cmVhbSwgY29uc3QgQXJncygmLi4uIGFyZ3MpKQotICAgICAgICAgICAgOiBUKHNpemVvZihfdHlwZSksIG91dHB1dDo6dHlwZUluZGV4LCBzdHJlYW0pLCBTKGFyZ3MuLi4pIHsgfQotICAgICAgICAvLy8gU2V0IHN0cmVhbS1pZC4gXHJldHZhbCB0cnVlIGlmIHRoZSBzdHJlYW0taWQgd2FzIHN1Y2Nlc3NmdWxseSBzZXQuCi0gICAgICAgIGlubGluZSBib29sIHNldFN0cmVhbSh1bnNpZ25lZCBzdHJlYW0pIHsgcmV0dXJuIEMyUGFyYW06OnNldFN0cmVhbShzdHJlYW0pOyB9Ci0KLSAgICAgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKG91dHB1dCkKLSAgICB9OwotfTsKLQotLyoqCi0gKiBTdHJlYW0tcGFyYW1ldGVyIHRlbXBsYXRlIGZvciBmbGV4aWJsZSBzdHJ1Y3R1cmVzLgotICoKLSAqIEJhc2UgdGVtcGxhdGUgdG8gZGVmaW5lIGEgc3RyZWFtIHNldHRpbmcvdHVuaW5nIG9yIGluZm8gYmFzZWQgb24gYSBmbGV4aWJsZSBzdHJ1Y3R1cmUgYW5kCi0gKiBhbiBvcHRpb25hbCBCYXNlSW5kZXguIFN0cmVhbSBwYXJhbWV0ZXJzIGFyZSB0aWVkIHRvIGEgc3BlY2lmaWMgc3RyZWFtIG9uIGEgcG9ydCAoaW5wdXQgb3IKLSAqIG91dHB1dCkuCi0gKgotICogXHRwYXJhbSBUIHBhcmFtIHR5cGUgQzJTZXR0aW5nLCBDMlR1bmluZyBvciBDMkluZm8KLSAqIFx0cGFyYW0gUyB3cmFwcGVkIGZsZXhpYmxlIHN0cnVjdHVyZQotICogXHRwYXJhbSBCYXNlSW5kZXggb3B0aW9uYWwgYmFzZS1pbmRleCBvdmVycmlkZS4gTXVzdCBiZSBzcGVjaWZpZWQgZm9yIGNvbW1vbi9yZXVzZWQgc3RydWN0dXJlcy4KLSAqCi0gKiBQYXJhbWV0ZXJzIHdyYXAgc3RydWN0dXJlcyBieSBwcmVwZW5kaW5nIGEgKHBhcmFtZXRlcikgaGVhZGVyLiBUaGUgZmllbGRzIGFuZCBtZXRob2RzIG9mIGZsZXhpYmxlCi0gKiBzdHJ1Y3R1cmVzIGNhbiBiZSBhY2Nlc3NlZCB2aWEgdGhlIG0gbWVtYmVyIHZhcmlhYmxlOyBob3dldmVyLCB0aGUgY29uc3RydWN0b3JzIG9mIHRoZSBzdHJ1Y3R1cmUKLSAqIGFyZSB3cmFwcGVkIGRpcmVjdGx5LiAoVGhpcyBpcyBiZWNhdXNlIGZsZXhpYmxlIHR5cGVzIGNhbm5vdCBiZSBzdWJjbGFzc2VkLikKLSAqCi0gKiBUaGVyZSBhcmUgMyBmbGF2b3JzIG9mIHN0cmVhbSBwYXJhbWV0ZXJzOiB1bnNwZWNpZmllZCBwb3J0LCBpbnB1dCBhbmQgb3V0cHV0LiBBbGwgb2YgdGhlc2UgZXhwb3NlCi0gKiBhIHNldFN0cmVhbSBtZXRob2QgYW5kIGFuIGV4dHJhIGluaXRpYWwgc3RyZWFtSUQgcGFyYW1ldGVyIGZvciB0aGUgY29uc3RydWN0b3IuIE1vcmVvdmVyLAotICogcGFyYW1ldGVycyB3aXRoIHVuc3BlY2lmaWVkIHBvcnQgZXhwb3NlIGEgc2V0UG9ydCBtZXRob2QsIGFuZCBhZGQgYW4gYWRkaXRpb25hbCBpbml0aWFsIHBvcnQKLSAqIHBhcmFtZXRlciB0byB0aGUgY29uc3RydWN0b3IuCi0gKi8KLXRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFMsIGludCBCYXNlSW5kZXg+Ci1zdHJ1Y3QgQzJfSElERSBDMlN0cmVhbVBhcmFtPFQsIFMsIEJhc2VJbmRleCwgSUZfRkxFWElCTEUoUyk+Ci0gICAgOiBwdWJsaWMgVCwgcHVibGljIEMyQmFzZUluZGV4T3ZlcnJpZGU8UywgQmFzZUluZGV4PiwKLSAgICAgIHByaXZhdGUgQzJGbGV4U3RydWN0Q2hlY2s8UywgQmFzZUluZGV4LAotICAgICAgICAgICAgICBUOjppbmRleEZsYWdzIHwgVDo6SW5kZXg6OmtTdHJlYW1GbGFnIHwgVDo6SW5kZXg6OmtEaXJVbmRlZmluZWQ+IHsKLXByaXZhdGU6Ci0gICAgdHlwZWRlZiBDMlN0cmVhbVBhcmFtPFQsIFM+IF90eXBlOwotICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLiBQb3J0L2RpcmVjdGlvbiBhbmQgc3RyZWFtLUlEIGlzIHVuZGVmaW5lZC4KLSAgICBpbmxpbmUgQzJTdHJlYW1QYXJhbShzaXplX3QgZmxleENvdW50KSA6IFQoX3R5cGU6OmNhbGNTaXplKGZsZXhDb3VudCksIF90eXBlOjp0eXBlSW5kZXgsIDB1KSB7IH0KLSAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3RvciB3aGlsZSBhbHNvIHNwZWNpZnlpbmcgcG9ydC9kaXJlY3Rpb24gYW5kCi0gICAgLy8vIHN0cmVhbS1JRC4KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgotICAgIGlubGluZSBDMlN0cmVhbVBhcmFtKHNpemVfdCBmbGV4Q291bnQsIGJvb2wgX291dHB1dCwgdW5zaWduZWQgc3RyZWFtLCBjb25zdCBBcmdzKCYuLi4gYXJncykpCi0gICAgICAgIDogVChfdHlwZTo6Y2FsY1NpemUoZmxleENvdW50KSwgX291dHB1dCA/IG91dHB1dDo6dHlwZUluZGV4IDogaW5wdXQ6OnR5cGVJbmRleCwgc3RyZWFtKSwKLSAgICAgICAgICBtKGZsZXhDb3VudCwgYXJncy4uLikgeyB9Ci0KLXB1YmxpYzoKLSAgICBTIG07IC8vLzwgd3JhcHBlZCBmbGV4aWJsZSBzdHJ1Y3R1cmUKLQotICAgIC8vLyBTZXQgcG9ydC9kaXJlY3Rpb24uCi0gICAgaW5saW5lIHZvaWQgc2V0UG9ydChib29sIG91dHB1dCkgeyBDMlBhcmFtOjpzZXRQb3J0KG91dHB1dCk7IH0KLSAgICAvLy8gU2V0IHN0cmVhbS1pZC4gXHJldHZhbCB0cnVlIGlmIHRoZSBzdHJlYW0taWQgd2FzIHN1Y2Nlc3NmdWxseSBzZXQuCi0gICAgaW5saW5lIGJvb2wgc2V0U3RyZWFtKHVuc2lnbmVkIHN0cmVhbSkgeyByZXR1cm4gQzJQYXJhbTo6c2V0U3RyZWFtKHN0cmVhbSk7IH0KLQotICAgIERFRklORV9GTEVYSUJMRV9NRVRIT0RTKF90eXBlLCBTKQotICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhfdHlwZSkKLQotICAgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgYW4gaW5wdXQgc3RyZWFtIHBhcmFtZXRlci4KLSAgICBzdHJ1Y3QgaW5wdXQgOiBwdWJsaWMgVCwgcHVibGljIEMyQmFzZUluZGV4T3ZlcnJpZGU8UywgQmFzZUluZGV4PiwKLSAgICAgICAgICAgIHB1YmxpYyBDMkZsZXhTdHJ1Y3RDaGVjazxTLCBCYXNlSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgIFQ6OmluZGV4RmxhZ3MgfCBUOjpJbmRleDo6a1N0cmVhbUZsYWcgfCBUOjpUeXBlOjprRGlySW5wdXQ+IHsKLSAgICBwcml2YXRlOgotICAgICAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4gU3RyZWFtLUlEIGlzIHVuZGVmaW5lZC4KLSAgICAgICAgaW5saW5lIGlucHV0KHNpemVfdCBmbGV4Q291bnQpIDogVChfdHlwZTo6Y2FsY1NpemUoZmxleENvdW50KSwgaW5wdXQ6OnR5cGVJbmRleCkgeyB9Ci0gICAgICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yIHdoaWxlIGFsc28gc3BlY2lmeWluZyBzdHJlYW0tSUQuCi0gICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+Ci0gICAgICAgIGlubGluZSBpbnB1dChzaXplX3QgZmxleENvdW50LCB1bnNpZ25lZCBzdHJlYW0sIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkKLSAgICAgICAgICAgIDogVChfdHlwZTo6Y2FsY1NpemUoZmxleENvdW50KSwgaW5wdXQ6OnR5cGVJbmRleCwgc3RyZWFtKSwgbShmbGV4Q291bnQsIGFyZ3MuLi4pIHsgfQotCi0gICAgcHVibGljOgotICAgICAgICBTIG07IC8vLzwgd3JhcHBlZCBmbGV4aWJsZSBzdHJ1Y3R1cmUKLQotICAgICAgICAvLy8gU2V0IHN0cmVhbS1pZC4gXHJldHZhbCB0cnVlIGlmIHRoZSBzdHJlYW0taWQgd2FzIHN1Y2Nlc3NmdWxseSBzZXQuCi0gICAgICAgIGlubGluZSBib29sIHNldFN0cmVhbSh1bnNpZ25lZCBzdHJlYW0pIHsgcmV0dXJuIEMyUGFyYW06OnNldFN0cmVhbShzdHJlYW0pOyB9Ci0KLSAgICAgICAgREVGSU5FX0ZMRVhJQkxFX01FVEhPRFMoaW5wdXQsIFMpCi0gICAgICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhpbnB1dCkKLSAgICB9OwotCi0gICAgLy8vIFNwZWNpYWxpemF0aW9uIGZvciBhbiBvdXRwdXQgc3RyZWFtIHBhcmFtZXRlci4KLSAgICBzdHJ1Y3Qgb3V0cHV0IDogcHVibGljIFQsIHB1YmxpYyBDMkJhc2VJbmRleE92ZXJyaWRlPFMsIEJhc2VJbmRleD4sCi0gICAgICAgICAgICBwdWJsaWMgQzJGbGV4U3RydWN0Q2hlY2s8UywgQmFzZUluZGV4LAotICAgICAgICAgICAgICAgICAgICBUOjppbmRleEZsYWdzIHwgVDo6SW5kZXg6OmtTdHJlYW1GbGFnIHwgVDo6VHlwZTo6a0Rpck91dHB1dD4gewotICAgIHByaXZhdGU6Ci0gICAgICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLiBTdHJlYW0tSUQgaXMgdW5kZWZpbmVkLgotICAgICAgICBpbmxpbmUgb3V0cHV0KHNpemVfdCBmbGV4Q291bnQpIDogVChfdHlwZTo6Y2FsY1NpemUoZmxleENvdW50KSwgb3V0cHV0Ojp0eXBlSW5kZXgpIHsgfQotICAgICAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3RvciB3aGlsZSBhbHNvIHNwZWNpZnlpbmcgc3RyZWFtLUlELgotICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgotICAgICAgICBpbmxpbmUgb3V0cHV0KHNpemVfdCBmbGV4Q291bnQsIHVuc2lnbmVkIHN0cmVhbSwgY29uc3QgQXJncygmLi4uIGFyZ3MpKQotICAgICAgICAgICAgOiBUKF90eXBlOjpjYWxjU2l6ZShmbGV4Q291bnQpLCBvdXRwdXQ6OnR5cGVJbmRleCwgc3RyZWFtKSwgbShmbGV4Q291bnQsIGFyZ3MuLi4pIHsgfQotCi0gICAgcHVibGljOgotICAgICAgICBTIG07IC8vLzwgd3JhcHBlZCBmbGV4aWJsZSBzdHJ1Y3R1cmUKLQotICAgICAgICAvLy8gU2V0IHN0cmVhbS1pZC4gXHJldHZhbCB0cnVlIGlmIHRoZSBzdHJlYW0taWQgd2FzIHN1Y2Nlc3NmdWxseSBzZXQuCi0gICAgICAgIGlubGluZSBib29sIHNldFN0cmVhbSh1bnNpZ25lZCBzdHJlYW0pIHsgcmV0dXJuIEMyUGFyYW06OnNldFN0cmVhbShzdHJlYW0pOyB9Ci0KLSAgICAgICAgREVGSU5FX0ZMRVhJQkxFX01FVEhPRFMob3V0cHV0LCBTKQotICAgICAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMob3V0cHV0KQotICAgIH07Ci19OwotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT0gU0lNUExFIFZBTFVFIFBBUkFNRVRFUlMgPT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLS8qKgotICogXGluZ3JvdXAgaW50ZXJuYWwKLSAqIEEgc3RydWN0dXJlIHRlbXBsYXRlIGVuY2Fwc3VsYXRpbmcgYSBzaW5nbGUgZWxlbWVudCB3aXRoIGRlZmF1bHQgY29uc3RydWN0b3JzIGFuZCBubyBiYXNlLWluZGV4LgotICovCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotc3RydWN0IEMyU2ltcGxlVmFsdWVTdHJ1Y3QgewotICAgIFQgbVZhbHVlOyAvLy88IHNpbXBsZSB2YWx1ZSBvZiB0aGUgc3RydWN0dXJlCi0gICAgLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICBpbmxpbmUgQzJTaW1wbGVWYWx1ZVN0cnVjdCgpID0gZGVmYXVsdDsKLSAgICAvLyBDb25zdHJ1Y3RvciB3aXRoIGFuIGluaXRpYWwgdmFsdWUuCi0gICAgaW5saW5lIEMyU2ltcGxlVmFsdWVTdHJ1Y3QoVCB2YWx1ZSkgOiBtVmFsdWUodmFsdWUpIHt9Ci0gICAgREVGSU5FX0MyU1RSVUNUX05PX0JBU0UoU2ltcGxlVmFsdWUpCi19OwotCi0vLyBUT0RPOiBtb3ZlIHRoaXMgYW5kIG5leHQgdG8gc29tZSBnZW5lcmljIHBsYWNlCi0vKioKLSAqIEludGVyZmFjZSB0byBhIGJsb2NrIG9mIChtYXBwZWQpIG1lbW9yeSBjb250YWluaW5nIGFuIGFycmF5IG9mIHNvbWUgdHlwZSAoVCkuCi0gKi8KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgQzJNZW1vcnlCbG9jayB7Ci0gICAgLy8vIFxyZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBibG9jay4KLSAgICB2aXJ0dWFsIHNpemVfdCBzaXplKCkgY29uc3QgPSAwOwotICAgIC8vLyBccmV0dXJucyBhIGNvbnN0IHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoaXMgYmxvY2suIENhcmUgbXVzdCBiZSB0YWtlbiB0byBub3QgcmVhZCBvdXRzaWRlCi0gICAgLy8vIHRoZSBibG9jay4KLSAgICB2aXJ0dWFsIGNvbnN0IFQgKmRhdGEoKSBjb25zdCA9IDA7IC8vIFRPRE86IHNob3VsZCB0aGlzIGJlIGZyaWVuZCBhY2Nlc3Mgb25seSBpbiBzb21lIEMyTWVtb3J5IG1vZHVsZT8KLSAgICAvLy8gXHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGlzIGJsb2NrLiBDYXJlIG11c3QgYmUgdGFrZW4gdG8gbm90IHJlYWQgb3Igd3JpdGUKLSAgICAvLy8gb3V0c2lkZSB0aGUgYmxvY2suCi0gICAgaW5saW5lIFQgKmRhdGEoKSB7IHJldHVybiBjb25zdF9jYXN0PFQqPihkYXRhKCkpOyB9Ci1wcm90ZWN0ZWQ6Ci0gICAgLy8gVE9ETzogZm9yIG5vdyBpdCBzaG91bGQgbmV2ZXIgYmUgZGVsZXRlZCBhcyBDMk1lbW9yeUJsb2NrCi0gICAgdmlydHVhbCB+QzJNZW1vcnlCbG9jaygpID0gZGVmYXVsdDsKLX07Ci0KLS8qKgotICogSW50ZXJmYWNlIHRvIGEgYmxvY2sgb2YgbWVtb3J5IGNvbnRhaW5pbmcgYSBjb25zdGFudCAoY29uc3RleHByKSBhcnJheSBvZiBzb21lIHR5cGUgKFQpLgotICovCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotc3RydWN0IEMyQ29uc3RNZW1vcnlCbG9jayA6IHB1YmxpYyBDMk1lbW9yeUJsb2NrPFQ+IHsKLSAgICB2aXJ0dWFsIGNvbnN0IFQgKiBkYXRhKCkgY29uc3QgeyByZXR1cm4gbURhdGE7IH0KLSAgICB2aXJ0dWFsIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gbVNpemU7IH0KLQotICAgIC8vLyBDb25zdHJ1Y3Rvci4KLSAgICB0ZW1wbGF0ZTx1bnNpZ25lZCBOPgotICAgIGlubGluZSBjb25zdGV4cHIgQzJDb25zdE1lbW9yeUJsb2NrKGNvbnN0IFQoJmluaXQpW05dKSA6IG1EYXRhKGluaXQpLCBtU2l6ZShOKSB7fQotCi1wcml2YXRlOgotICAgIGNvbnN0IFQgKm1EYXRhOwotICAgIGNvbnN0IHNpemVfdCBtU2l6ZTsKLX07Ci0KLS8vLyBcYWRkdG9ncm91cCBpbnRlcm5hbAotLy8vIEB7Ci0KLS8vLyBIZWxwZXIgY2xhc3MgdG8gaW5pdGlhbGl6ZSBmbGV4aWJsZSBhcnJheXMgd2l0aCB2YXJpb3VzIGluaXRhbGl6ZXJzLgotc3RydWN0IF9DMlZhbHVlQXJyYXlIZWxwZXIgewotICAgIC8vIGNoYXJbXS1zIGFyZSB1c2VkIGFzIG51bGwgdGVybWluYXRlZCBzdHJpbmdzLCBzbyB0aGUgbGFzdCBlbGVtZW50IGlzIG5ldmVyIGluaXRlZC4KLQotICAgIC8vLyBJbml0aWFsaXplIGEgZmxleGlibGUgYXJyYXkgdXNpbmcgYSBjb25zdGV4cHIgbWVtb3J5IGJsb2NrLgotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgc3RhdGljIHZvaWQgaW5pdChUKCZhcnJheSlbXSwgc2l6ZV90IGFycmF5TGVuLCBjb25zdCBDMk1lbW9yeUJsb2NrPFQ+ICZibG9jaykgewotICAgICAgICAvLyByZXNlcnZlIGxhc3QgZWxlbWVudCBmb3IgdGVybWluYWwgMCBmb3Igc3RyaW5ncwotICAgICAgICBpZiAoYXJyYXlMZW4gJiYgc3RkOjppc19zYW1lPFQsIGNoYXI+Ojp2YWx1ZSkgewotICAgICAgICAgICAgLS1hcnJheUxlbjsKLSAgICAgICAgfQotICAgICAgICBpZiAoYmxvY2suZGF0YSgpKSB7Ci0gICAgICAgICAgICBtZW1jcHkoYXJyYXksIGJsb2NrLmRhdGEoKSwgc3RkOjptaW4oYXJyYXlMZW4sIGJsb2NrLnNpemUoKSkgKiBzaXplb2YoVCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8vIEluaXRpYWxpemUgYSBmbGV4aWJsZSBhcnJheSB1c2luZyBhbiBpbml0aWFsaXplciBsaXN0LgotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgc3RhdGljIHZvaWQgaW5pdChUKCZhcnJheSlbXSwgc2l6ZV90IGFycmF5TGVuLCBjb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gJmluaXQpIHsKLSAgICAgICAgc2l6ZV90IGl4ID0gMDsKLSAgICAgICAgLy8gcmVzZXJ2ZSBsYXN0IGVsZW1lbnQgZm9yIHRlcm1pbmFsIDAgZm9yIHN0cmluZ3MKLSAgICAgICAgaWYgKGFycmF5TGVuICYmIHN0ZDo6aXNfc2FtZTxULCBjaGFyPjo6dmFsdWUpIHsKLSAgICAgICAgICAgIC0tYXJyYXlMZW47Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChjb25zdCBUICZpdGVtIDogaW5pdCkgewotICAgICAgICAgICAgaWYgKGl4ID09IGFycmF5TGVuKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhcnJheVtpeCsrXSA9IGl0ZW07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gSW5pdGlhbGl6ZSBhIGZsZXhpYmxlIGFycmF5IHVzaW5nIGFub3RoZXIgZmxleGlibGUgYXJyYXkuCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdW5zaWduZWQgTj4KLSAgICBzdGF0aWMgdm9pZCBpbml0KFQoJmFycmF5KVtdLCBzaXplX3QgYXJyYXlMZW4sIGNvbnN0IFQoJnN0cilbTl0pIHsKLSAgICAgICAgLy8gcmVzZXJ2ZSBsYXN0IGVsZW1lbnQgZm9yIHRlcm1pbmFsIDAgZm9yIHN0cmluZ3MKLSAgICAgICAgaWYgKGFycmF5TGVuICYmIHN0ZDo6aXNfc2FtZTxULCBjaGFyPjo6dmFsdWUpIHsKLSAgICAgICAgICAgIC0tYXJyYXlMZW47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFycmF5TGVuKSB7Ci0gICAgICAgICAgICBzdHJuY3B5KGFycmF5LCBzdHIsIHN0ZDo6bWluKGFycmF5TGVuLCAoc2l6ZV90KU4pKTsKLSAgICAgICAgfQotICAgIH0KLX07Ci0KLS8qKgotICogU3BlY2lhbGl6YXRpb24gZm9yIGEgZmxleGlibGUgYmxvYiBhbmQgc3RyaW5nIGFycmF5cy4gQSBzdHJ1Y3R1cmUgdGVtcGxhdGUgZW5jYXBzdWxhdGluZyBhIHNpbmdsZQotICogZmxleGlibGUgYXJyYXkgbWVtYmVyIHdpdGggZGVmYXVsdCBmbGV4aWJsZSBjb25zdHJ1Y3RvcnMgYW5kIG5vIGJhc2UtaW5kZXguIFRoaXMgdHlwZSBjYW5ub3QgYmUKLSAqIGNvbnN0cnVjdGVkIG9uIGl0cyBvd24gYXMgaXQncyBzaXplIGlzIDAuCi0gKgotICogXGludGVybmFsIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gQzJTaW1wbGVBcnJheVN0cnVjdDxUW10+IHNpbXBseSBiZWNhdXNlIGl0cyBtZW1iZXIgaGFzIHRoZSBuYW1lCi0gKiBhcyBtVmFsdWUgdG8gcmVmbGVjdCB0aGlzIGlzIGEgc2luZ2xlIHZhbHVlLgotICovCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotc3RydWN0IEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8VFtdPiB7Ci0gICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8VCwgY2hhcj46OnZhbHVlIHx8IHN0ZDo6aXNfc2FtZTxULCB1aW50OF90Pjo6dmFsdWUsCi0gICAgICAgICAgICAgICAgICAiQzJTaW1wbGVWYWx1ZVN0cnVjdDxUW10+IGlzIG9ubHkgZm9yIEJMT0Igb3IgU1RSSU5HIik7Ci0gICAgVCBtVmFsdWVbXTsKLQotICAgIGlubGluZSBDMlNpbXBsZVZhbHVlU3RydWN0KCkgPSBkZWZhdWx0OwotICAgIERFRklORV9DMlNUUlVDVF9OT19CQVNFKFNpbXBsZVZhbHVlKQotICAgIEZMRVgoQzJTaW1wbGVWYWx1ZVN0cnVjdCwgbVZhbHVlKQotCi1wcml2YXRlOgotICAgIGlubGluZSBDMlNpbXBsZVZhbHVlU3RydWN0KHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IEMyTWVtb3J5QmxvY2s8VD4gJmJsb2NrKSB7Ci0gICAgICAgIF9DMlZhbHVlQXJyYXlIZWxwZXI6OmluaXQobVZhbHVlLCBmbGV4Q291bnQsIGJsb2NrKTsKLSAgICB9Ci0KLSAgICBpbmxpbmUgQzJTaW1wbGVWYWx1ZVN0cnVjdChzaXplX3QgZmxleENvdW50LCBjb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gJmluaXQpIHsKLSAgICAgICAgX0MyVmFsdWVBcnJheUhlbHBlcjo6aW5pdChtVmFsdWUsIGZsZXhDb3VudCwgaW5pdCk7Ci0gICAgfQotCi0gICAgdGVtcGxhdGU8dW5zaWduZWQgTj4KLSAgICBpbmxpbmUgQzJTaW1wbGVWYWx1ZVN0cnVjdChzaXplX3QgZmxleENvdW50LCBjb25zdCBUKCZpbml0KVtOXSkgewotICAgICAgICBfQzJWYWx1ZUFycmF5SGVscGVyOjppbml0KG1WYWx1ZSwgZmxleENvdW50LCBpbml0KTsKLSAgICB9Ci19OwotCi0vLy8gQH0KLQotLyoqCi0gKiBBIHN0cnVjdHVyZSB0ZW1wbGF0ZSBlbmNhcHN1bGF0aW5nIGEgc2luZ2xlIGZsZXhpYmxlIGFycmF5IGVsZW1lbnQgb2YgYSBzcGVjaWZpYyB0eXBlIChUKSB3aXRoCi0gKiBkZWZhdWx0IGNvbnN0cnVjdG9ycyBhbmQgbm8gYmFzZS1pbmRleC4gVGhpcyB0eXBlIGNhbm5vdCBiZSBjb25zdHJ1Y3RlZCBvbiBpdHMgb3duIGFzIGl0J3Mgc2l6ZQotICogaXMgMC4gSW5zdGVhZCwgaXQgaXMgbWVhbnQgdG8gYmUgdXNlZCBhcyBhIHBhcmFtZXRlciwgZS5nLgotICoKLSAqICAgdHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJTaW1wbGVBcnJheVN0cnVjdDxDMk15RmFuY3lTdHJ1Y3Q+LAotICogICAgICAgICAgIGtQYXJhbUluZGV4TXlGYW5jeUFycmF5U3RyZWFtUGFyYW0+IEMyTXlGYW5jeUFycmF5U3RyZWFtSW5mbzsKLSAqLwotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXN0cnVjdCBDMlNpbXBsZUFycmF5U3RydWN0IHsKLSAgICBzdGF0aWNfYXNzZXJ0KCFzdGQ6OmlzX3NhbWU8VCwgY2hhcj46OnZhbHVlICYmICFzdGQ6OmlzX3NhbWU8VCwgdWludDhfdD46OnZhbHVlLAotICAgICAgICAgICAgICAgICAgInVzZSBDMlNpbXBsZVZhbHVlU3RydWN0PFRbXT4gaXMgZm9yIEJMT0Igb3IgU1RSSU5HIik7Ci0KLSAgICBUIG1WYWx1ZXNbXTsgLy8vPCBhcnJheSBtZW1iZXIKLSAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgIGlubGluZSBDMlNpbXBsZUFycmF5U3RydWN0KCkgPSBkZWZhdWx0OwotICAgIERFRklORV9DMlNUUlVDVF9OT19CQVNFKFNpbXBsZUFycmF5KQotICAgIEZMRVgoQzJTaW1wbGVBcnJheVN0cnVjdCwgbVZhbHVlcykKLQotcHJpdmF0ZToKLSAgICAvLy8gQ29uc3RydWN0IGZyb20gYSBDMk1lbW9yeUJsb2NrLgotICAgIC8vLyBVc2VkIG9ubHkgYnkgdGhlIGZsZXhpYmxlIHBhcmFtZXRlciBhbGxvY2F0b3JzIChhbGxvY191bmlxdWUgJiBhbGxvY19zaGFyZWQpLgotICAgIGlubGluZSBDMlNpbXBsZUFycmF5U3RydWN0KHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IEMyTWVtb3J5QmxvY2s8VD4gJmJsb2NrKSB7Ci0gICAgICAgIF9DMlZhbHVlQXJyYXlIZWxwZXI6OmluaXQobVZhbHVlcywgZmxleENvdW50LCBibG9jayk7Ci0gICAgfQotCi0gICAgLy8vIENvbnN0cnVjdCBmcm9tIGFuIGluaXRpYWxpemVyIGxpc3QuCi0gICAgLy8vIFVzZWQgb25seSBieSB0aGUgZmxleGlibGUgcGFyYW1ldGVyIGFsbG9jYXRvcnMgKGFsbG9jX3VuaXF1ZSAmIGFsbG9jX3NoYXJlZCkuCi0gICAgaW5saW5lIEMyU2ltcGxlQXJyYXlTdHJ1Y3Qoc2l6ZV90IGZsZXhDb3VudCwgY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+ICZpbml0KSB7Ci0gICAgICAgIF9DMlZhbHVlQXJyYXlIZWxwZXI6OmluaXQobVZhbHVlcywgZmxleENvdW50LCBpbml0KTsKLSAgICB9Ci0KLSAgICAvLy8gQ29uc3RydWN0IGZyb20gYW5vdGhlciBmbGV4aWJsZSBhcnJheS4KLSAgICAvLy8gVXNlZCBvbmx5IGJ5IHRoZSBmbGV4aWJsZSBwYXJhbWV0ZXIgYWxsb2NhdG9ycyAoYWxsb2NfdW5pcXVlICYgYWxsb2Nfc2hhcmVkKS4KLSAgICB0ZW1wbGF0ZTx1bnNpZ25lZCBOPgotICAgIGlubGluZSBDMlNpbXBsZUFycmF5U3RydWN0KHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IFQoJmluaXQpW05dKSB7Ci0gICAgICAgIF9DMlZhbHVlQXJyYXlIZWxwZXI6OmluaXQobVZhbHVlcywgZmxleENvdW50LCBpbml0KTsKLSAgICB9Ci19OwotCi0vKioKLSAqIFxhZGR0b2dyb3VwIHNpbXBsZXZhbHVlIFNpbXBsZSB2YWx1ZSBhbmQgYXJyYXkgc3RydWN0dXJlcy4KLSAqIEB7Ci0gKgotICogU2ltcGxlIHZhbHVlIHN0cnVjdHVyZXMuCi0gKgotICogU3RydWN0dXJlcyBjb250YWluaW5nIGEgc2luZ2xlIHNpbXBsZSB2YWx1ZS4gVGhlc2UgY2FuIGJlIHJldXNlZCB0byBlYXNpbHkgZGVmaW5lIHNpbXBsZQotICogcGFyYW1ldGVycyBvZiB2YXJpb3VzIHR5cGVzOgotICoKLSAqICAgdHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJJbnQzMlZhbHVlLCBrUGFyYW1JbmRleE15SW50ZWdlclBvcnRQYXJhbT4KLSAqICAgICAgICAgICBDMk15SW50ZWdlclBvcnRQYXJhbVR1bmluZzsKLSAqCi0gKiBUaGV5IGNvbnRhaW4gYSBzaW5nbGUgbWVtYmVyIChtVmFsdWUgb3IgbVZhbHVlcykgdGhhdCBpcyBkZXNjcmliZWQgYXMgInZhbHVlIiBvciAidmFsdWVzIi4KLSAqLwotLy8vIEEgMzItYml0IHNpZ25lZCBpbnRlZ2VyIHBhcmFtZXRlciBpbiBtVmFsdWUsIGRlc2NyaWJlZCBhcyAidmFsdWUiCi10eXBlZGVmIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8aW50MzJfdD4gQzJJbnQzMlZhbHVlOwotLy8vIEEgMzItYml0IHNpZ25lZCBpbnRlZ2VyIGFycmF5IHBhcmFtZXRlciBpbiBtVmFsdWVzLCBkZXNjcmliZWQgYXMgInZhbHVlcyIKLXR5cGVkZWYgQzJTaW1wbGVBcnJheVN0cnVjdDxpbnQzMl90PiBDMkludDMyQXJyYXk7Ci0vLy8gQSAzMi1iaXQgdW5zaWduZWQgaW50ZWdlciBwYXJhbWV0ZXIgaW4gbVZhbHVlLCBkZXNjcmliZWQgYXMgInZhbHVlIgotdHlwZWRlZiBDMlNpbXBsZVZhbHVlU3RydWN0PHVpbnQzMl90PiBDMlVpbnQzMlZhbHVlOwotLy8vIEEgMzItYml0IHVuc2lnbmVkIGludGVnZXIgYXJyYXkgcGFyYW1ldGVyIGluIG1WYWx1ZXMsIGRlc2NyaWJlZCBhcyAidmFsdWVzIgotdHlwZWRlZiBDMlNpbXBsZUFycmF5U3RydWN0PHVpbnQzMl90PiBDMlVpbnQzMkFycmF5OwotLy8vIEEgNjQtYml0IHNpZ25lZCBpbnRlZ2VyIHBhcmFtZXRlciBpbiBtVmFsdWUsIGRlc2NyaWJlZCBhcyAidmFsdWUiCi10eXBlZGVmIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8aW50NjRfdD4gQzJJbnQ2NFZhbHVlOwotLy8vIEEgNjQtYml0IHNpZ25lZCBpbnRlZ2VyIGFycmF5IHBhcmFtZXRlciBpbiBtVmFsdWVzLCBkZXNjcmliZWQgYXMgInZhbHVlcyIKLXR5cGVkZWYgQzJTaW1wbGVBcnJheVN0cnVjdDxpbnQ2NF90PiBDMkludDY0QXJyYXk7Ci0vLy8gQSA2NC1iaXQgdW5zaWduZWQgaW50ZWdlciBwYXJhbWV0ZXIgaW4gbVZhbHVlLCBkZXNjcmliZWQgYXMgInZhbHVlIgotdHlwZWRlZiBDMlNpbXBsZVZhbHVlU3RydWN0PHVpbnQ2NF90PiBDMlVpbnQ2NFZhbHVlOwotLy8vIEEgNjQtYml0IHVuc2lnbmVkIGludGVnZXIgYXJyYXkgcGFyYW1ldGVyIGluIG1WYWx1ZXMsIGRlc2NyaWJlZCBhcyAidmFsdWVzIgotdHlwZWRlZiBDMlNpbXBsZUFycmF5U3RydWN0PHVpbnQ2NF90PiBDMlVpbnQ2NEFycmF5OwotLy8vIEEgZmxvYXQgcGFyYW1ldGVyIGluIG1WYWx1ZSwgZGVzY3JpYmVkIGFzICJ2YWx1ZSIKLXR5cGVkZWYgQzJTaW1wbGVWYWx1ZVN0cnVjdDxmbG9hdD4gQzJGbG9hdFZhbHVlOwotLy8vIEEgZmxvYXQgYXJyYXkgcGFyYW1ldGVyIGluIG1WYWx1ZXMsIGRlc2NyaWJlZCBhcyAidmFsdWVzIgotdHlwZWRlZiBDMlNpbXBsZUFycmF5U3RydWN0PGZsb2F0PiBDMkZsb2F0QXJyYXk7Ci0vLy8gQSBibG9iIGZsZXhpYmxlIHBhcmFtZXRlciBpbiBtVmFsdWUsIGRlc2NyaWJlZCBhcyAidmFsdWUiCi10eXBlZGVmIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8dWludDhfdFtdPiBDMkJsb2JWYWx1ZTsKLS8vLyBBIHN0cmluZyBmbGV4aWJsZSBwYXJhbWV0ZXIgaW4gbVZhbHVlLCBkZXNjcmliZWQgYXMgInZhbHVlIgotdHlwZWRlZiBDMlNpbXBsZVZhbHVlU3RydWN0PGNoYXJbXT4gQzJTdHJpbmdWYWx1ZTsKLQotI2lmIDEKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1jb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8Y29uc3QgQzJGaWVsZERlc2NyaXB0b3I+IEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8VD46OmZpZWxkTGlzdCA9IHsgQzJGSUVMRChtVmFsdWUsICJ2YWx1ZSIpIH07Ci10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PGNvbnN0IEMyRmllbGREZXNjcmlwdG9yPiBDMlNpbXBsZVZhbHVlU3RydWN0PFRbXT46OmZpZWxkTGlzdCA9IHsgQzJGSUVMRChtVmFsdWUsICJ2YWx1ZSIpIH07Ci10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PGNvbnN0IEMyRmllbGREZXNjcmlwdG9yPiBDMlNpbXBsZUFycmF5U3RydWN0PFQ+OjpmaWVsZExpc3QgPSB7IEMyRklFTEQobVZhbHVlcywgInZhbHVlcyIpIH07Ci0jZWxzZQotLy8gVGhpcyBzZWVtIHRvIGJlIGFibGUgdG8gYmUgaGFuZGxlZCBieSB0aGUgdGVtcGxhdGUgYWJvdmUKLURFU0NSSUJFX1RFTVBMQVRFRF9DMlNUUlVDVChDMlNpbXBsZVZhbHVlU3RydWN0PGludDMyX3Q+LCB7IEMyRklFTEQobVZhbHVlLCAidmFsdWUiKSB9KTsKLURFU0NSSUJFX1RFTVBMQVRFRF9DMlNUUlVDVChDMlNpbXBsZVZhbHVlU3RydWN0PHVpbnQzMl90PiwgeyBDMkZJRUxEKG1WYWx1ZSwgInZhbHVlIikgfSk7Ci1ERVNDUklCRV9URU1QTEFURURfQzJTVFJVQ1QoQzJTaW1wbGVWYWx1ZVN0cnVjdDxpbnQ2NF90PiwgeyBDMkZJRUxEKG1WYWx1ZSwgInZhbHVlIikgfSk7Ci1ERVNDUklCRV9URU1QTEFURURfQzJTVFJVQ1QoQzJTaW1wbGVWYWx1ZVN0cnVjdDx1aW50NjRfdD4sIHsgQzJGSUVMRChtVmFsdWUsICJ2YWx1ZSIpIH0pOwotREVTQ1JJQkVfVEVNUExBVEVEX0MyU1RSVUNUKEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8ZmxvYXQ+LCB7IEMyRklFTEQobVZhbHVlLCAidmFsdWUiKSB9KTsKLURFU0NSSUJFX1RFTVBMQVRFRF9DMlNUUlVDVChDMlNpbXBsZVZhbHVlU3RydWN0PHVpbnQ4X3RbXT4sIHsgQzJGSUVMRChtVmFsdWUsICJ2YWx1ZSIpIH0pOwotREVTQ1JJQkVfVEVNUExBVEVEX0MyU1RSVUNUKEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8Y2hhcltdPiwgeyBDMkZJRUxEKG1WYWx1ZSwgInZhbHVlIikgfSk7Ci1ERVNDUklCRV9URU1QTEFURURfQzJTVFJVQ1QoQzJTaW1wbGVBcnJheVN0cnVjdDxpbnQzMl90PiwgeyBDMkZJRUxEKG1WYWx1ZXMsICJ2YWx1ZXMiKSB9KTsKLURFU0NSSUJFX1RFTVBMQVRFRF9DMlNUUlVDVChDMlNpbXBsZUFycmF5U3RydWN0PHVpbnQzMl90PiwgeyBDMkZJRUxEKG1WYWx1ZXMsICJ2YWx1ZXMiKSB9KTsKLURFU0NSSUJFX1RFTVBMQVRFRF9DMlNUUlVDVChDMlNpbXBsZUFycmF5U3RydWN0PGludDY0X3Q+LCB7IEMyRklFTEQobVZhbHVlcywgInZhbHVlcyIpIH0pOwotREVTQ1JJQkVfVEVNUExBVEVEX0MyU1RSVUNUKEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8dWludDY0X3Q+LCB7IEMyRklFTEQobVZhbHVlcywgInZhbHVlcyIpIH0pOwotREVTQ1JJQkVfVEVNUExBVEVEX0MyU1RSVUNUKEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8ZmxvYXQ+LCB7IEMyRklFTEQobVZhbHVlcywgInZhbHVlcyIpIH0pOwotI2VuZGlmCi0KLS8vLyBAfQotCi0vLy8gQH0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBDMlBBUkFNX0RFRl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL2luY2x1ZGUvQzJXb3JrLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvaW5jbHVkZS9DMldvcmsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQyZDExYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvaW5jbHVkZS9DMldvcmsuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBDMldPUktfSF8KLQotI2RlZmluZSBDMldPUktfSF8KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSNpbmNsdWRlIDxDMlBhcmFtLmg+Ci0jaW5jbHVkZSA8QzJCdWZmZXIuaD4KLSNpbmNsdWRlIDxDMkNvbmZpZy5oPgotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPGxpc3Q+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi10eXBlZGVmIGludCBzdGF0dXNfdDsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLy8gXGRlZmdyb3VwIHdvcmsgV29yayBhbmQgZGF0YSBwcm9jZXNzaW5nCi0vLy8gQHsKLQotc3RydWN0IEMyU2V0dGluZ1Jlc3VsdCB7Ci0gICAgZW51bSBGYWlsdXJlIHsKLSAgICAgICAgUkVBRF9PTkxZLCAgLy8vPCBwYXJhbWV0ZXIgaXMgcmVhZC1vbmx5IGFuZCBjYW5ub3QgYmUgc2V0Ci0gICAgICAgIE1JU01BVENILCAgIC8vLzwgcGFyYW1ldGVyIG1pc21hdGNoZXMgaW5wdXQgZGF0YQotICAgICAgICBCQURfVkFMVUUsICAvLy88IHBhcmFtZXRlciBkb2VzIG5vdCBhY2NlcHQgdmFsdWUKLSAgICAgICAgQkFEX1RZUEUsICAgLy8vPCBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZAotICAgICAgICBCQURfUE9SVCwgICAvLy88IHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoZSBzcGVjaWZpYyBwb3J0Ci0gICAgICAgIEJBRF9JTkRFWCwgIC8vLzwgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlIHNwZWNpZmljIHN0cmVhbQotICAgICAgICBDT05GTElDVCwgICAvLy88IHBhcmFtZXRlciBpcyBpbiBjb25mbGljdCB3aXRoIGFub3RoZXIgc2V0dGluZwotICAgIH07Ci0KLSAgICBDMlBhcmFtRmllbGQgZmllbGQ7Ci0gICAgRmFpbHVyZSBmYWlsdXJlOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzPiBzdXBwb3J0ZWRWYWx1ZXM7IC8vPCBpZiBkaWZmZXJlbnQgZnJvbSBub3JtYWwgKGUuZy4gaW4gY29uZmxpY3Qgdy9hbm90aGVyIHBhcmFtIG9yIGlucHV0IGRhdGEpCi0gICAgc3RkOjpsaXN0PEMyUGFyYW1GaWVsZD4gY29uZmxpY3RpbmdGaWVsZHM7Ci19OwotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vICBXT1JLCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotLy8gbm9kZV9pZC1zCi10eXBlZGVmIHVpbnQzMl90IG5vZGVfaWQ7Ci0KLWVudW0gZmxhZ3NfdCA6IHVpbnQzMl90IHsKLSAgICBCVUZGRVJGTEFHX0NPREVDX0NPTkZJRywKLSAgICBCVUZGRVJGTEFHX0RST1BfRlJBTUUsCi0gICAgQlVGRkVSRkxBR19FTkRfT0ZfU1RSRUFNLAotfTsKLQotZW51bSB7Ci0gICAga1BhcmFtSW5kZXhXb3JrT3JkaW5hbCwKLX07Ci0KLXN0cnVjdCBDMldvcmtPcmRpbmFsU3RydWN0IHsKLSAgICB1aW50NjRfdCB0aW1lc3RhbXA7Ci0gICAgdWludDY0X3QgZnJhbWVfaW5kZXg7ICAgIC8vIHN1Ym1pc3Npb24gb3JkaW5hbCBvbiB0aGUgaW5pdGlhbCBjb21wb25lbnQKLSAgICB1aW50NjRfdCBjdXN0b21fb3JkaW5hbDsgLy8gY2FuIGJlIGdpdmVuIGJ5IHRoZSBjb21wb25lbnQsIGUuZy4gZGVjb2RlIG9yZGVyCi0KLSAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKFdvcmtPcmRpbmFsKQotICAgIEMyRklFTEQodGltZXN0YW1wLCAidGltZXN0YW1wIikKLSAgICBDMkZJRUxEKGZyYW1lX2luZGV4LCAiZnJhbWUtaW5kZXgiKQotICAgIEMyRklFTEQoY3VzdG9tX29yZGluYWwsICJjdXN0b20tb3JkaW5hbCIpCi19OwotCi1zdHJ1Y3QgQzJCdWZmZXJQYWNrIHsKLS8vcHVibGljOgotICAgIGZsYWdzX3QgIGZsYWdzOwotICAgIEMyV29ya09yZGluYWxTdHJ1Y3Qgb3JkaW5hbDsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+PiBidWZmZXJzOwotICAgIC8vPCBmb3IgaW5pdGlhbCB3b3JrIGl0ZW0sIHRoZXNlIG1heSBhbHNvIGNvbWUgZnJvbSB0aGUgcGFyc2VyIC0gaWYgcHJvdmlkZWQKLSAgICAvLzwgZm9yIG91dHB1dCBidWZmZXJzLCB0aGVzZSBhcmUgdGhlIHJlc3BvbnNlcyB0byByZXF1ZXN0ZWRJbmZvcwotICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJJbmZvPj4gICAgICAgaW5mb3M7Ci0gICAgc3RkOjpsaXN0PHN0ZDo6c2hhcmVkX3B0cjxDMkluZm9CdWZmZXI+PiBpbmZvQnVmZmVyczsKLX07Ci0KLXN0cnVjdCBDMldvcmtsZXQgewotLy9wdWJsaWM6Ci0gICAgLy8gSU4KLSAgICBub2RlX2lkIGNvbXBvbmVudDsKLQotICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHR1bmluZ3M7IC8vPCB0dW5pbmdzIHRvIGJlIGFwcGxpZWQgYmVmb3JlIHByb2Nlc3NpbmcgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvcmtsZXQKLSAgICBzdGQ6Omxpc3Q8QzJQYXJhbTo6VHlwZT4gcmVxdWVzdGVkSW5mb3M7Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tBbGxvY2F0b3I+PiBhbGxvY2F0b3JzOyAvLzwgVGhpcyB2ZWN0b3Igc2hhbGwgYmUgdGhlIHNhbWUgc2l6ZSBhcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vPCBvdXRwdXQuYnVmZmVycy4KLQotICAgIC8vIE9VVAotICAgIEMyQnVmZmVyUGFjayBvdXRwdXQ7Ci0gICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKLX07Ci0KLS8qKgotICogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgYWxsIGEgc2luZ2xlIHdvcmsgaXRlbS4KLSAqCi0gKiBUaGlzIHN0cnVjdHVyZSBzaGFsbCBiZSBwYXNzZWQgYnkgdGhlIGNsaWVudCB0byB0aGUgY29tcG9uZW50IGZvciB0aGUgZmlyc3Qgd29ya2xldC4gQXMgc3VjaCwKLSAqIHdvcmtsZXRzIG11c3Qgbm90IGJlIGVtcHR5LiBUaGUgb3duZXJzaGlwIG9mIHRoaXMgb2JqZWN0IGlzIHBhc3NlZC4KLSAqCi0gKiBpbnB1dDoKLSAqICAgICAgVGhlIGlucHV0IGRhdGEgdG8gYmUgcHJvY2Vzc2VkLiBUaGlzIGlzIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQgd2l0aCBvd25lcnNoaXAuIFdoZW4gdGhlIHdvcmsKLSAqICAgICAgaXMgcmV0dXJuZWQsIHRoZSBpbnB1dCBidWZmZXItcGFjaydzIGJ1ZmZlciB2ZWN0b3Igc2hhbGwgY29udGFpbiBudWxscHRycy4KLSAqCi0gKiB3b3JrbGV0czoKLSAqICAgICAgVGhlIGNoYWluIG9mIGNvbXBvbmVudHMgYW5kIGFzc29jaWF0ZWQgYWxsb2NhdG9ycywgdHVuaW5ncyBhbmQgaW5mbyByZXF1ZXN0cyB0aGF0IHRoZSBkYXRhCi0gKiAgICAgIG11c3QgcGFzcyB0aHJvdWdoLiBJZiB0aGlzIGhhcyBtb3JlIHRoYW4gYSBzaW5nbGUgZWxlbWVudCwgdGhlIHR1bm5lbHMgYmV0d2VlbiBzdWNjZXNzaXZlCi0gKiAgICAgIGNvbXBvbmVudHMgb2YgdGhlIHdvcmtsZXQgY2hhaW4gbXVzdCBoYXZlIGJlZW4gKHN1Y2Nlc3NmdWxseSkgcHJlLXJlZ2lzdGVyZWQgYXQgdGhlIHRpbWUKLSAqICAgICAgdGhlIHdvcmsgaXMgc3VibWl0dGVkLiBBbGxvY2F0aW5nIHRoZSBvdXRwdXQgYnVmZmVycyBpbiB0aGUgd29ya2xldHMgaXMgdGhlIHJlc3BvbnNpYmlsaXR5Ci0gKiAgICAgIG9mIGVhY2ggY29tcG9uZW50LiBVcG9uIHdvcmsgc3VibWlzc2lvbiwgZWFjaCBvdXRwdXQgYnVmZmVyLXBhY2sgc2hhbGwgYmUgYW4gYXBwcm9wcmlhdGVseQotICogICAgICBzaXplZCB2ZWN0b3IgY29udGFpbmluZyBudWxscHRycy4gV2hlbiB0aGUgd29yayBpcyBjb21wbGV0ZWQvcmV0dXJuZWQgdG8gdGhlIGNsaWVudCwKLSAqCi0gKiB3b3JrbGV0c19wcm9jZXNzZWQ6Ci0gKiAgICAgIEl0IHNoYWxsIGJlIGluaXRpYWxpemVkIHRvIDAgYnkgdGhlIGNsaWVudCB3aGVuIHRoZSB3b3JrIGlzIHN1Ym1pdHRlZC4KLSAqICAgICAgSXQgc2hhbGwgY29udGFpbiB0aGUgbnVtYmVyIG9mIHdvcmtsZXRzIHRoYXQgd2VyZSBzdWNjZXNzZnVsbHkgcHJvY2Vzc2VkIHdoZW4gdGhlIHdvcmsgaXMKLSAqICAgICAgcmV0dXJuZWQuIElmIHRoaXMgaXMgbGVzcyB0aGVuIHRoZSBudW1iZXIgb2Ygd29ya2xldHMsIHJlc3VsdCBtdXN0IG5vdCBiZSBzdWNjZXNzLgotICogICAgICBJdCBtdXN0IGJlIGluIHRoZSByYW5nZSBvZiBbMCwgd29ya2xldHMuc2l6ZSgpXS4KLSAqCi0gKiByZXN1bHQ6Ci0gKiAgICAgIFRoZSBmaW5hbCBvdXRjb21lIG9mIHRoZSB3b3JrLiBJZiAwIHdoZW4gd29yayBpcyByZXR1cm5lZCwgaXQgaXMgYXNzdW1lZCB0aGF0IGFsbCB3b3JrbGV0cwotICogICAgICBoYXZlIGJlZW4gcHJvY2Vzc2VkLgotICovCi1zdHJ1Y3QgQzJXb3JrIHsKLS8vcHVibGljOgotICAgIC8vIHByZS1jaGFpbiBpbmZvcyAoZm9yIHBvcnRpb25zIG9mIGEgdHVubmVsaW5nIGNoYWluIHRoYXQgaGFwcGVuZCBiZWZvcmUgdGhpcyB3b3JrLWNoYWluIGZvcgotICAgIC8vIHRoaXMgd29yayBpdGVtIC0gZHVlIHRvIGZyYW1ld29yayBmYWNpbGl0YXRlZCAobm9uLXR1bm5lbGVkKSB3b3JrLWNoYWluaW5nKQotICAgIHN0ZDo6bGlzdDxzdGQ6OnBhaXI8c3RkOjp1bmlxdWVfcHRyPEMyUG9ydE1pbWVDb25maWc+LCBzdGQ6OnVuaXF1ZV9wdHI8QzJJbmZvPj4+IHByZUNoYWluSW5mb3M7Ci0gICAgc3RkOjpsaXN0PHN0ZDo6cGFpcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQb3J0TWltZUNvbmZpZz4sIHN0ZDo6dW5pcXVlX3B0cjxDMkJ1ZmZlcj4+PiBwcmVDaGFpbkluZm9CbG9iczsKLQotICAgIEMyQnVmZmVyUGFjayBpbnB1dDsKLSAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29ya2xldD4+IHdvcmtsZXRzOwotCi0gICAgdWludDMyX3Qgd29ya2xldHNfcHJvY2Vzc2VkOwotICAgIHN0YXR1c190IHJlc3VsdDsKLX07Ci0KLXN0cnVjdCBDMldvcmtPdXRsaW5lIHsKLS8vcHVibGljOgotICAgIEMyV29ya09yZGluYWxTdHJ1Y3Qgb3JkaW5hbDsKLSAgICBzdGQ6Omxpc3Q8bm9kZV9pZD4gY2hhaW47Ci19OwotCi0vLy8gQH0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBDMldPUktfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi90ZXN0cy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL3Rlc3RzL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5YzQyNTMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL3Rlc3RzL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jIEJ1aWxkIHRoZSB1bml0IHRlc3RzLgotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTIDo9ICQoTE9DQUxfUEFUSCkvQW5kcm9pZC5tawotCi1MT0NBTF9NT0RVTEUgOj0gY29kZWMyX3Rlc3QKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLQotTE9DQUxfU1JDX0ZJTEVTIDo9IFwKLQl2bmRrL0MyVXRpbFRlc3QuY3BwIFwKLQlDMl90ZXN0LmNwcCBcCi0JQzJQYXJhbV90ZXN0LmNwcCBcCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotCWxpYmN1dGlscyBcCi0JbGlic3RhZ2VmcmlnaHRfY29kZWMyIFwKLQlsaWJsb2cKLQotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0JZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvaW5jbHVkZSBcCi0JZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvdm5kay9pbmNsdWRlIFwKLQkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKLQotTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IgLVdhbGwgLXN0ZD1jKysxNAotTE9DQUxfQ0xBTkcgOj0gdHJ1ZQotCi1pbmNsdWRlICQoQlVJTERfTkFUSVZFX1RFU1QpCi0KLSMgSW5jbHVkZSBzdWJkaXJlY3RvcnkgbWFrZWZpbGVzCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIElmIHdlJ3JlIGJ1aWxkaW5nIHdpdGggT05FX1NIT1RfTUFLRUZJTEUgKG1tLCBtbW0pLCB0aGVuIHdoYXQgdGhlIGZyYW1ld29yawotIyB0ZWFtIHJlYWxseSB3YW50cyBpcyB0byBidWlsZCB0aGUgc3R1ZmYgZGVmaW5lZCBieSB0aGlzIG1ha2VmaWxlLgotaWZlcSAoLCQoT05FX1NIT1RfTUFLRUZJTEUpKQotaW5jbHVkZSAkKGNhbGwgZmlyc3QtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCi1lbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL3Rlc3RzL0MyUGFyYW1fdGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvdGVzdHMvQzJQYXJhbV90ZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM4MmM4NC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvdGVzdHMvQzJQYXJhbV90ZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI2ODcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJDMlBhcmFtX3Rlc3QiCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSA8dXRpbC9DMlBhcmFtVXRpbHMuaD4KLSNpbmNsdWRlIDxDMlBhcmFtRGVmLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotdm9pZCBQcmludFRvKGNvbnN0IF9DMkZpZWxkSWQgJmlkLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKLSAgICAqb3MgPDwgIkAiIDw8IGlkLl9tT2Zmc2V0IDw8ICIrIiA8PCBpZC5fbVNpemU7Ci19Ci0KLXZvaWQgUHJpbnRUbyhjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmZmQsIDo6c3RkOjpvc3RyZWFtICpvcykgewotICAgIHVzaW5nIEZEPUMyRmllbGREZXNjcmlwdG9yOwotICAgIHN3aXRjaCAoZmQudHlwZSgpKSB7Ci0gICAgY2FzZSBGRDo6SU5UMzI6ICpvcyA8PCAiaTMyIjsgYnJlYWs7Ci0gICAgY2FzZSBGRDo6SU5UNjQ6ICpvcyA8PCAiaTY0IjsgYnJlYWs7Ci0gICAgY2FzZSBGRDo6VUlOVDMyOiAqb3MgPDwgInUzMiI7IGJyZWFrOwotICAgIGNhc2UgRkQ6OlVJTlQ2NDogKm9zIDw8ICJ1NjQiOyBicmVhazsKLSAgICBjYXNlIEZEOjpGTE9BVDogKm9zIDw8ICJmbG9hdCI7IGJyZWFrOwotICAgIGNhc2UgRkQ6OlNUUklORzogKm9zIDw8ICJjaGFyIjsgYnJlYWs7Ci0gICAgY2FzZSBGRDo6QkxPQjogKm9zIDw8ICJ1OCI7IGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGlmIChmZC50eXBlKCkgJiBGRDo6U1RSVUNUX0ZMQUcpIHsKLSAgICAgICAgICAgICpvcyA8PCAic3RydWN0LSIgPDwgKGZkLnR5cGUoKSAmIH5GRDo6U1RSVUNUX0ZMQUcpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKm9zIDw8ICJ0eXBlLSIgPDwgZmQudHlwZSgpOwotICAgICAgICB9Ci0gICAgfQotICAgICpvcyA8PCAiICIgPDwgZmQubmFtZSgpOwotICAgIGlmIChmZC5sZW5ndGgoKSA+IDEpIHsKLSAgICAgICAgKm9zIDw8ICJbIiA8PCBmZC5sZW5ndGgoKSA8PCAiXSI7Ci0gICAgfSBlbHNlIGlmIChmZC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICpvcyA8PCAiW10iOwotICAgIH0KLSAgICAqb3MgPDwgIiAoIjsKLSAgICBQcmludFRvKGZkLl9tRmllbGRJZCwgb3MpOwotICAgICpvcyA8PCAiKiIgPDwgZmQubGVuZ3RoKCkgPDwgIikiOwotfQotCi1lbnVtIEMyUGFyYW1JbmRleFR5cGUgewotICAgIGtQYXJhbUluZGV4TnVtYmVyLAotICAgIGtQYXJhbUluZGV4TnVtYmVycywKLSAgICBrUGFyYW1JbmRleE51bWJlcjIsCi0gICAga1BhcmFtSW5kZXhWZW5kb3JTdGFydCA9IEMyUGFyYW06OkJhc2VJbmRleDo6a1ZlbmRvclN0YXJ0LAotICAgIGtQYXJhbUluZGV4VmVuZG9yTnVtYmVycywKLX07Ci0KLXZvaWQgZmZmZihpbnQoKikoaW50KSkge30KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU1RSVUNUIERFQ0xBUkFUSU9OIEFORCBERVNDUklQVElPTiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi10eXBlZGVmIEMyRmllbGREZXNjcmlwdG9yIEZEOwotCi1jbGFzcyBDMlBhcmFtVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotfTsKLQotY2xhc3MgQzJQYXJhbVRlc3RfUGFyYW1GaWVsZExpc3QKLSAgICAgICAgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxjb25zdCBDMkZpZWxkRGVzY3JpcHRvcj4+IHsKLX07Ci0KLWVudW0gewotICAgIGtQYXJhbUluZGV4U2l6ZSwKLSAgICBrUGFyYW1JbmRleFRlc3RBLAotICAgIGtQYXJhbUluZGV4VGVzdEIsCi0gICAga1BhcmFtSW5kZXhUZXN0RmxleFMzMiwKLSAgICBrUGFyYW1JbmRleFRlc3RGbGV4RW5kUzMyLAotICAgIGtQYXJhbUluZGV4VGVzdEZsZXhTNjQsCi0gICAga1BhcmFtSW5kZXhUZXN0RmxleEVuZFM2NCwKLSAgICBrUGFyYW1JbmRleFRlc3RGbGV4U2l6ZSwKLSAgICBrUGFyYW1JbmRleFRlc3RGbGV4RW5kU2l6ZSwKLX07Ci0KLXN0cnVjdCBDMlNpemVTdHJ1Y3QgewotICAgIGludDMyX3QgbU51bWJlcjsKLSAgICBpbnQzMl90IG1IZWlnaHQ7Ci0gICAgZW51bSA6IHVpbnQzMl90IHsgYmFzZUluZGV4ID0ga1BhcmFtSW5kZXhTaXplIH07ICAgICAgICAgICAgICAgICAgICAgICAgLy8gPD0gbmVlZGVkIGZvciBDMkZpZWxkRGVzY3JpcHRvcgotICAgIGNvbnN0IHN0YXRpYyBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8Y29uc3QgQzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkTGlzdDsgIC8vIDw9IG5lZWRlZCBmb3IgQzJGaWVsZERlc2NyaXB0b3IKLSAgICBjb25zdCBzdGF0aWMgRkQ6OlR5cGUgVFlQRSA9IChGRDo6VHlwZSkoYmFzZUluZGV4IHwgRkQ6OlNUUlVDVF9GTEFHKTsKLX07Ci0KLURFRklORV9OT19OQU1FRF9WQUxVRVNfRk9SKEMyU2l6ZVN0cnVjdCkKLQotLy8gVGVzdCAxLiBkZWZpbmUgYSBzdHJ1Y3R1cmUgd2l0aG91dCBhbnkgaGVscGVyIG1ldGhvZHMKLQotYm9vbCBvcGVyYXRvcj09KGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZhLCBjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmYikgewotICAgIHJldHVybiBhLnR5cGUoKSA9PSBiLnR5cGUoKQotICAgICAgICAgICAgJiYgYS5sZW5ndGgoKSA9PSBiLmxlbmd0aCgpCi0gICAgICAgICAgICAmJiBzdHJjbXAoYS5uYW1lKCksIGIubmFtZSgpKSA9PSAwCi0gICAgICAgICAgICAmJiBhLl9tRmllbGRJZCA9PSBiLl9tRmllbGRJZDsKLX0KLQotc3RydWN0IEMyVGVzdFN0cnVjdF9BIHsKLSAgICBpbnQzMl90IG1TaWduZWQzMjsKLSAgICBpbnQ2NF90IG1TaWduZWQ2NFsyXTsKLSAgICB1aW50MzJfdCBtVW5zaWduZWQzMlsxXTsKLSAgICB1aW50NjRfdCBtVW5zaWduZWQ2NDsKLSAgICBmbG9hdCBtRmxvYXQ7Ci0gICAgQzJTaXplU3RydWN0IG1TaXplWzNdOwotICAgIHVpbnQ4X3QgbUJsb2JbMTAwXTsKLSAgICBjaGFyIG1TdHJpbmdbMTAwXTsKLSAgICBib29sIG1ZZXNOb1sxMDBdOwotCi0gICAgY29uc3Qgc3RhdGljIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxjb25zdCBDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRMaXN0OwotICAgIC8vIGVudW0gOiB1aW50MzJfdCB7IGJhc2VJbmRleCA9IGtQYXJhbUluZGV4VGVzdCB9OwotICAgIC8vIHR5cGVkZWYgQzJUZXN0U3RydWN0X0EgX3R5cGU7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1jb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8Y29uc3QgQzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9BOjpmaWVsZExpc3QgPQotICAgIHsgeyBGRDo6SU5UMzIsICAgIDEsICJzMzIiLCAgIDAsIDQgfSwKLSAgICAgIHsgRkQ6OklOVDY0LCAgICAyLCAiczY0IiwgICA0LCA4IH0sCi0gICAgICB7IEZEOjpVSU5UMzIsICAgMSwgInUzMiIsICAyMCwgNCB9LAotICAgICAgeyBGRDo6VUlOVDY0LCAgIDEsICJ1NjQiLCAgMjQsIDggfSwKLSAgICAgIHsgRkQ6OkZMT0FULCAgICAxLCAiZnAiLCAgIDMyLCA0IH0sCi0gICAgICB7IEMyU2l6ZVN0cnVjdDo6VFlQRSwgMywgInNpemUiLCAzNiwgOCB9LAotICAgICAgeyBGRDo6QkxPQiwgICAxMDAsICJibG9iIiwgNjAsIDEgfSwKLSAgICAgIHsgRkQ6OlNUUklORywgMTAwLCAic3RyIiwgMTYwLCAxIH0sCi0gICAgICB7IEZEOjpCTE9CLCAgIDEwMCwgInktbiIsIDI2MCwgMSB9IH07Ci0KLVRFU1RfUChDMlBhcmFtVGVzdF9QYXJhbUZpZWxkTGlzdCwgVmVyaWZ5U3RydWN0KSB7Ci0gICAgc3RkOjp2ZWN0b3I8Y29uc3QgQzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkcyA9IEdldFBhcmFtKCksIGV4cGVjdGVkID0gQzJUZXN0U3RydWN0X0E6OmZpZWxkTGlzdDsKLQotICAgIC8vIHZlcmlmeSBmaXJzdCBmaWVsZCBkZXNjcmlwdG9yCi0gICAgRVhQRUNUX0VRKEZEOjpJTlQzMiwgZmllbGRzWzBdLnR5cGUoKSk7Ci0gICAgRVhQRUNUX1NUUkVRKCJzMzIiLCBmaWVsZHNbMF0ubmFtZSgpKTsKLSAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkc1swXS5sZW5ndGgoKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMCwgNCksIGZpZWxkc1swXS5fbUZpZWxkSWQpOwotCi0gICAgRVhQRUNUX0VRKGV4cGVjdGVkWzBdLCBmaWVsZHNbMF0pOwotICAgIEVYUEVDVF9FUShleHBlY3RlZFsxXSwgZmllbGRzWzFdKTsKLSAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbMl0sIGZpZWxkc1syXSk7Ci0gICAgRVhQRUNUX0VRKGV4cGVjdGVkWzNdLCBmaWVsZHNbM10pOwotICAgIEVYUEVDVF9FUShleHBlY3RlZFs0XSwgZmllbGRzWzRdKTsKLSAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbNV0sIGZpZWxkc1s1XSk7Ci0gICAgRVhQRUNUX0VRKGV4cGVjdGVkWzZdLCBmaWVsZHNbNl0pOwotICAgIEVYUEVDVF9FUShleHBlY3RlZFs3XSwgZmllbGRzWzddKTsKLSAgICBmb3IgKHNpemVfdCBpID0gODsgaSA8IGZpZWxkcy5zaXplKCkgJiYgaSA8IGV4cGVjdGVkLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIEVYUEVDVF9FUShleHBlY3RlZFtpXSwgZmllbGRzW2ldKTsKLSAgICB9Ci19Ci0KLUlOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEluaXRpYWxpemVyTGlzdCwgQzJQYXJhbVRlc3RfUGFyYW1GaWVsZExpc3QsIDo6dGVzdGluZzo6VmFsdWVzKEMyVGVzdFN0cnVjdF9BOjpmaWVsZExpc3QpKTsKLQotLy8gZGVmaW5lIGZpZWxkcyB1c2luZyBDMkZpZWxkRGVzY3JpcHRvciBwb2ludGVyIGNvbnN0cnVjdG9yCi1jb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8Y29uc3QgQzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9BX0ZEX1BUUl9maWVsZExpc3QgPQotICAgIHsgQzJGaWVsZERlc2NyaXB0b3IoJigoQzJUZXN0U3RydWN0X0EqKShudWxscHRyKSktPm1TaWduZWQzMiwgICAiczMyIiksCi0gICAgICBDMkZpZWxkRGVzY3JpcHRvcigmKChDMlRlc3RTdHJ1Y3RfQSopKG51bGxwdHIpKS0+bVNpZ25lZDY0LCAgICJzNjQiKSwKLSAgICAgIEMyRmllbGREZXNjcmlwdG9yKCYoKEMyVGVzdFN0cnVjdF9BKikobnVsbHB0cikpLT5tVW5zaWduZWQzMiwgInUzMiIpLAotICAgICAgQzJGaWVsZERlc2NyaXB0b3IoJigoQzJUZXN0U3RydWN0X0EqKShudWxscHRyKSktPm1VbnNpZ25lZDY0LCAidTY0IiksCi0gICAgICBDMkZpZWxkRGVzY3JpcHRvcigmKChDMlRlc3RTdHJ1Y3RfQSopKG51bGxwdHIpKS0+bUZsb2F0LCAgICAgICJmcCIpLAotICAgICAgQzJGaWVsZERlc2NyaXB0b3IoJigoQzJUZXN0U3RydWN0X0EqKShudWxscHRyKSktPm1TaXplLCAgICAgICAic2l6ZSIpLAotICAgICAgQzJGaWVsZERlc2NyaXB0b3IoJigoQzJUZXN0U3RydWN0X0EqKShudWxscHRyKSktPm1CbG9iLCAgICAgICAiYmxvYiIpLAotICAgICAgQzJGaWVsZERlc2NyaXB0b3IoJigoQzJUZXN0U3RydWN0X0EqKShudWxscHRyKSktPm1TdHJpbmcsICAgICAic3RyIiksCi0gICAgLy8gIEMyRmllbGREZXNjcmlwdG9yKCYoKEMyVGVzdFN0cnVjdF9BKikobnVsbHB0cikpLT5tWWVzTm8sICAgICAgInktbiIpCi0gICAgfTsKLQotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoUG9pbnRlckNvbnN0cnVjdG9yLCBDMlBhcmFtVGVzdF9QYXJhbUZpZWxkTGlzdCwgOjp0ZXN0aW5nOjpWYWx1ZXMoQzJUZXN0U3RydWN0X0FfRkRfUFRSX2ZpZWxkTGlzdCkpOwotCi0vLyBkZWZpbmUgZmllbGRzIHVzaW5nIEMyRmllbGREZXNjcmlwdG9yIG1lbWJlci1wb2ludGVyIGNvbnN0cnVjdG9yCi1jb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8Y29uc3QgQzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9BX0ZEX01FTV9QVFJfZmllbGRMaXN0ID0KLSAgICB7IEMyRmllbGREZXNjcmlwdG9yKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjptU2lnbmVkMzIsICAgInMzMiIpLAotICAgICAgQzJGaWVsZERlc2NyaXB0b3IoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6Om1TaWduZWQ2NCwgICAiczY0IiksCi0gICAgICBDMkZpZWxkRGVzY3JpcHRvcigoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6bVVuc2lnbmVkMzIsICJ1MzIiKSwKLSAgICAgIEMyRmllbGREZXNjcmlwdG9yKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjptVW5zaWduZWQ2NCwgInU2NCIpLAotICAgICAgQzJGaWVsZERlc2NyaXB0b3IoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6Om1GbG9hdCwgICAgICAiZnAiKSwKLSAgICAgIEMyRmllbGREZXNjcmlwdG9yKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjptU2l6ZSwgICAgICAgInNpemUiKSwKLSAgICAgIEMyRmllbGREZXNjcmlwdG9yKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjptQmxvYiwgICAgICAgImJsb2IiKSwKLSAgICAgIEMyRmllbGREZXNjcmlwdG9yKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjptU3RyaW5nLCAgICAgInN0ciIpLAotICAgIC8vICBDMkZpZWxkRGVzY3JpcHRvcigoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6bVllc05vLCAgICAgICJ5LW4iKQotICAgIH07Ci0KLUlOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKE1lbWJlclBvaW50ZXJDb25zdHJ1Y3RvciwgQzJQYXJhbVRlc3RfUGFyYW1GaWVsZExpc3QsIDo6dGVzdGluZzo6VmFsdWVzKEMyVGVzdFN0cnVjdF9BX0ZEX01FTV9QVFJfZmllbGRMaXN0KSk7Ci0KLS8vIFRlc3QgMi4gZGVmaW5lIGEgc3RydWN0dXJlIHdpdGggdHdvLXN0ZXAgaGVscGVyIG1ldGhvZHMKLQotc3RydWN0IEMyVGVzdEFTdHJ1Y3QgewotICAgIGludDMyX3QgbVNpZ25lZDMyOwotICAgIGludDY0X3QgbVNpZ25lZDY0WzJdOwotICAgIHVpbnQzMl90IG1VbnNpZ25lZDMyWzFdOwotICAgIHVpbnQ2NF90IG1VbnNpZ25lZDY0OwotICAgIGZsb2F0IG1GbG9hdDsKLSAgICBDMlNpemVTdHJ1Y3QgbVNpemVbM107Ci0gICAgdWludDhfdCBtQmxvYlsxMDBdOwotICAgIGNoYXIgbVN0cmluZ1sxMDBdOwotICAgIGJvb2wgbVllc05vWzEwMF07Ci0KLXByaXZhdGU6IC8vIHRlc3QgYWNjZXNzIGxldmVsCi0gICAgREVGSU5FX0MyU1RSVUNUKFRlc3RBKQotfSBDMl9QQUNLOwotCi1ERVNDUklCRV9DMlNUUlVDVChUZXN0QSwgewotICAgIEMyRklFTEQobVNpZ25lZDMyLCAiczMyIikKLSAgICBDMkZJRUxEKG1TaWduZWQ2NCwgInM2NCIpCi0gICAgQzJGSUVMRChtVW5zaWduZWQzMiwgInUzMiIpCi0gICAgQzJGSUVMRChtVW5zaWduZWQ2NCwgInU2NCIpCi0gICAgQzJGSUVMRChtRmxvYXQsICJmcCIpCi0gICAgQzJGSUVMRChtU2l6ZSwgInNpemUiKQotICAgIEMyRklFTEQobUJsb2IsICJibG9iIikKLSAgICBDMkZJRUxEKG1TdHJpbmcsICJzdHIiKQotICAgIC8vIEMyRklFTEQobVllc05vLCAieS1uIikKLX0pIC8vIDsgb3B0aW9uYWwKLQotSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoRGVzY3JpYmVTdHJ1Y3QyU3RlcCwgQzJQYXJhbVRlc3RfUGFyYW1GaWVsZExpc3QsIDo6dGVzdGluZzo6VmFsdWVzKEMyVGVzdEFTdHJ1Y3Q6OmZpZWxkTGlzdCkpOwotCi0vLyBUZXN0IDMuIGRlZmluZSBhIHN0cnVjdHVyZSB3aXRoIG9uZS1zdGVwIGhlbHBlciBtZXRob2QKLQotc3RydWN0IEMyVGVzdEJTdHJ1Y3QgewotICAgIGludDMyX3QgbVNpZ25lZDMyOwotICAgIGludDY0X3QgbVNpZ25lZDY0WzJdOwotICAgIHVpbnQzMl90IG1VbnNpZ25lZDMyWzFdOwotICAgIHVpbnQ2NF90IG1VbnNpZ25lZDY0OwotICAgIGZsb2F0IG1GbG9hdDsKLSAgICBDMlNpemVTdHJ1Y3QgbVNpemVbM107Ci0gICAgdWludDhfdCBtQmxvYlsxMDBdOwotICAgIGNoYXIgbVN0cmluZ1sxMDBdOwotICAgIGJvb2wgbVllc05vWzEwMF07Ci0KLXByaXZhdGU6IC8vIHRlc3QgYWNjZXNzIGxldmVsCi0gICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChUZXN0QikKLQotICAgIEMyRklFTEQobVNpZ25lZDMyLCAiczMyIikKLSAgICBDMkZJRUxEKG1TaWduZWQ2NCwgInM2NCIpCi0gICAgQzJGSUVMRChtVW5zaWduZWQzMiwgInUzMiIpCi0gICAgQzJGSUVMRChtVW5zaWduZWQ2NCwgInU2NCIpCi0gICAgQzJGSUVMRChtRmxvYXQsICJmcCIpCi0gICAgQzJGSUVMRChtU2l6ZSwgInNpemUiKQotICAgIEMyRklFTEQobUJsb2IsICJibG9iIikKLSAgICBDMkZJRUxEKG1TdHJpbmcsICJzdHIiKQotICAgIC8vIEMyRklFTEQobVllc05vLCAieS1uIikKLX07Ci0KLUlOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKERlc2NyaWJlU3RydWN0MVN0ZXAsIEMyUGFyYW1UZXN0X1BhcmFtRmllbGRMaXN0LCA6OnRlc3Rpbmc6OlZhbHVlcyhDMlRlc3RCU3RydWN0OjpmaWVsZExpc3QpKTsKLQotLy8gVGVzdCA0LiBmbGV4aWJsZSBtZW1iZXJzCi0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1jbGFzcyBDMlBhcmFtVGVzdF9GbGV4UGFyYW1GaWVsZExpc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLXByb3RlY3RlZDoKLSAgICB1c2luZyBUeXBlPUZEOjpUeXBlOwotCi0gICAgLy8gc3RhdGljIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxzdGQ6OmluaXRpYWxpemVyX2xpc3Q8Y29uc3QgQzJGaWVsZERlc2NyaXB0b3I+PgotICAgIHN0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3Rvcjxjb25zdCBDMkZpZWxkRGVzY3JpcHRvcj4+Ci0gICAgICAgICAgICBHZXRMaXN0cygpOwotCi0gICAgY29uc3RleHByIHN0YXRpYyBUeXBlIGZsZXhUeXBlID0KLSAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxULCBpbnQzMl90Pjo6dmFsdWUgPyBGRDo6SU5UMzIgOgotICAgICAgICAgICAgc3RkOjppc19zYW1lPFQsIGludDY0X3Q+Ojp2YWx1ZSA/IEZEOjpJTlQ2NCA6Ci0gICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VCwgdWludDMyX3Q+Ojp2YWx1ZSA/IEZEOjpVSU5UMzIgOgotICAgICAgICAgICAgc3RkOjppc19zYW1lPFQsIHVpbnQ2NF90Pjo6dmFsdWUgPyBGRDo6VUlOVDY0IDoKLSAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxULCBmbG9hdD46OnZhbHVlID8gRkQ6OkZMT0FUIDoKLSAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxULCB1aW50OF90Pjo6dmFsdWUgPyBGRDo6QkxPQiA6Ci0gICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VCwgY2hhcj46OnZhbHVlID8gRkQ6OlNUUklORyA6Ci0gICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VCwgQzJTaXplU3RydWN0Pjo6dmFsdWUgPyBDMlNpemVTdHJ1Y3Q6OlRZUEUgOiAoVHlwZSkwOwotICAgIGNvbnN0ZXhwciBzdGF0aWMgc2l6ZV90IGZsZXhTaXplID0gc2l6ZW9mKFQpOwotfTsKLQotdHlwZWRlZiA6OnRlc3Rpbmc6OlR5cGVzPGludDMyX3QsIGludDY0X3QsIEMyU2l6ZVN0cnVjdD4gRmxleFR5cGVzOwotVFlQRURfVEVTVF9DQVNFKEMyUGFyYW1UZXN0X0ZsZXhQYXJhbUZpZWxkTGlzdCwgRmxleFR5cGVzKTsKLQotVFlQRURfVEVTVChDMlBhcmFtVGVzdF9GbGV4UGFyYW1GaWVsZExpc3QsIFZlcmlmeVN0cnVjdCkgewotICAgIGZvciAoYXV0byBhIDogdGhpcy0+R2V0TGlzdHMoKSkgewotICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRzID0gYTsKLSAgICAgICAgaWYgKGZpZWxkcy5zaXplKCkgPiAxKSB7Ci0gICAgICAgICAgICBFWFBFQ1RfRVEoMnUsIGZpZWxkcy5zaXplKCkpOwotICAgICAgICAgICAgRVhQRUNUX0VRKEMyRmllbGREZXNjcmlwdG9yKEZEOjpJTlQzMiwgMSwgInMzMiIsIDAsIDQpLCBmaWVsZHNbMF0pOwotICAgICAgICAgICAgRVhQRUNUX0VRKEMyRmllbGREZXNjcmlwdG9yKHRoaXMtPmZsZXhUeXBlLCAwLCAiZmxleCIsIDQsIHRoaXMtPmZsZXhTaXplKSwKLSAgICAgICAgICAgICAgICAgICAgICBmaWVsZHNbMV0pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRVhQRUNUX0VRKDF1LCBmaWVsZHMuc2l6ZSgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9FUShDMkZpZWxkRGVzY3JpcHRvcih0aGlzLT5mbGV4VHlwZSwgMCwgImZsZXgiLCAwLCB0aGlzLT5mbGV4U2l6ZSksCi0gICAgICAgICAgICAgICAgICAgICAgZmllbGRzWzBdKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RydWN0IEMyVGVzdFN0cnVjdF9GbGV4UzMyIHsKLSAgICBpbnQzMl90IG1GbGV4W107Ci0KLSAgICBjb25zdCBzdGF0aWMgc3RkOjppbml0aWFsaXplcl9saXN0PGNvbnN0IEMyRmllbGREZXNjcmlwdG9yPiBmaWVsZExpc3Q7Ci0gICAgLy8gZW51bSA6IHVpbnQzMl90IHsgYmFzZUluZGV4ID0ga1BhcmFtSW5kZXhUZXN0RmxleCwgZmxleFNpemUgPSA0IH07Ci0gICAgLy8gdHlwZWRlZiBDMlRlc3RTdHJ1Y3RfRmxleFMzMiBfdHlwZTsKLSAgICAvLyB0eXBlZGVmIGludDMyX3QgZmxleFR5cGU7Ci19OwotCi1jb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8Y29uc3QgQzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9GbGV4UzMyOjpmaWVsZExpc3QgPSB7Ci0gICAgeyBGRDo6SU5UMzIsIDAsICJmbGV4IiwgMCwgNCB9Ci19OwotCi1zdHJ1Y3QgQzJUZXN0U3RydWN0X0ZsZXhFbmRTMzIgewotICAgIGludDMyX3QgbVNpZ25lZDMyOwotICAgIGludDMyX3QgbUZsZXhbXTsKLQotICAgIGNvbnN0IHN0YXRpYyBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8Y29uc3QgQzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkTGlzdDsKLSAgICAvLyBlbnVtIDogdWludDMyX3QgeyBiYXNlSW5kZXggPSBrUGFyYW1JbmRleFRlc3RGbGV4RW5kLCBmbGV4U2l6ZSA9IDQgfTsKLSAgICAvLyB0eXBlZGVmIEMyVGVzdFN0cnVjdF9GbGV4RW5kIF90eXBlOwotICAgIC8vIHR5cGVkZWYgaW50MzJfdCBmbGV4VHlwZTsKLX07Ci0KLWNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxjb25zdCBDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0ZsZXhFbmRTMzI6OmZpZWxkTGlzdCA9IHsKLSAgICB7IEZEOjpJTlQzMiwgMSwgInMzMiIsIDAsIDQgfSwKLSAgICB7IEZEOjpJTlQzMiwgMCwgImZsZXgiLCA0LCA0IH0sCi19OwotCi1jb25zdCBzdGF0aWMgc3RkOjppbml0aWFsaXplcl9saXN0PGNvbnN0IEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfRmxleEVuZFMzMl9wdHJfZmllbGRMaXN0ID0gewotICAgIEMyRmllbGREZXNjcmlwdG9yKCYoKEMyVGVzdFN0cnVjdF9GbGV4RW5kUzMyKikwKS0+bVNpZ25lZDMyLCAiczMyIiksCi0gICAgQzJGaWVsZERlc2NyaXB0b3IoJigoQzJUZXN0U3RydWN0X0ZsZXhFbmRTMzIqKTApLT5tRmxleCwgImZsZXgiKSwKLX07Ci0KLXN0cnVjdCBDMlRlc3RGbGV4UzMyU3RydWN0IHsKLSAgICBpbnQzMl90IG1GbGV4U2lnbmVkMzJbXTsKLXByaXZhdGU6IC8vIHRlc3QgYWNjZXNzIGxldmVsCi0gICAgQzJUZXN0RmxleFMzMlN0cnVjdCgpIHt9Ci0KLSAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QoVGVzdEZsZXhTMzIsIG1GbGV4U2lnbmVkMzIpCi0gICAgQzJGSUVMRChtRmxleFNpZ25lZDMyLCAiZmxleCIpCi19OwotCi1zdHJ1Y3QgQzJUZXN0RmxleEVuZFMzMlN0cnVjdCB7Ci0gICAgaW50MzJfdCBtU2lnbmVkMzI7Ci0gICAgaW50MzJfdCBtRmxleFNpZ25lZDMyW107Ci1wcml2YXRlOiAvLyB0ZXN0IGFjY2VzcyBsZXZlbAotICAgIEMyVGVzdEZsZXhFbmRTMzJTdHJ1Y3QoKSB7fQotCi0gICAgREVGSU5FX0ZMRVhfQzJTVFJVQ1QoVGVzdEZsZXhFbmRTMzIsIG1GbGV4U2lnbmVkMzIpCi19IEMyX1BBQ0s7Ci0KLURFU0NSSUJFX0MyU1RSVUNUKFRlc3RGbGV4RW5kUzMyLCB7Ci0gICAgQzJGSUVMRChtU2lnbmVkMzIsICJzMzIiKQotICAgIEMyRklFTEQobUZsZXhTaWduZWQzMiwgImZsZXgiKQotfSkgLy8gOyBvcHRpb25hbAotCi10ZW1wbGF0ZTw+Ci1zdGQ6OnZlY3RvcjxzdGQ6OnZlY3Rvcjxjb25zdCBDMkZpZWxkRGVzY3JpcHRvcj4+Ci0vL3N0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxzdGQ6OmluaXRpYWxpemVyX2xpc3Q8Y29uc3QgQzJGaWVsZERlc2NyaXB0b3I+PgotQzJQYXJhbVRlc3RfRmxleFBhcmFtRmllbGRMaXN0PGludDMyX3Q+OjpHZXRMaXN0cygpIHsKLSAgICByZXR1cm4gewotICAgICAgICBDMlRlc3RTdHJ1Y3RfRmxleFMzMjo6ZmllbGRMaXN0LAotICAgICAgICBDMlRlc3RTdHJ1Y3RfRmxleEVuZFMzMjo6ZmllbGRMaXN0LAotICAgICAgICBDMlRlc3RTdHJ1Y3RfRmxleEVuZFMzMl9wdHJfZmllbGRMaXN0LAotICAgICAgICBDMlRlc3RGbGV4UzMyU3RydWN0OjpmaWVsZExpc3QsCi0gICAgICAgIEMyVGVzdEZsZXhFbmRTMzJTdHJ1Y3Q6OmZpZWxkTGlzdCwKLSAgICB9OwotfQotCi1zdHJ1Y3QgQzJUZXN0U3RydWN0X0ZsZXhTNjQgewotICAgIGludDY0X3QgbUZsZXhTaWduZWQ2NFtdOwotCi0gICAgY29uc3Qgc3RhdGljIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxjb25zdCBDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRMaXN0OwotICAgIC8vIGVudW0gOiB1aW50MzJfdCB7IGJhc2VJbmRleCA9IGtQYXJhbUluZGV4VGVzdEZsZXhTNjQsIGZsZXhTaXplID0gOCB9OwotICAgIC8vIHR5cGVkZWYgQzJUZXN0U3RydWN0X0ZsZXhTNjQgX3R5cGU7Ci0gICAgLy8gdHlwZWRlZiBpbnQ2NF90IGZsZXhUeXBlOwotfTsKLQotY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PGNvbnN0IEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfRmxleFM2NDo6ZmllbGRMaXN0ID0gewotICAgIHsgRkQ6OklOVDY0LCAwLCAiZmxleCIsIDAsIDggfQotfTsKLQotc3RydWN0IEMyVGVzdFN0cnVjdF9GbGV4RW5kUzY0IHsKLSAgICBpbnQzMl90IG1TaWduZWQzMjsKLSAgICBpbnQ2NF90IG1TaWduZWQ2NEZsZXhbXTsKLQotICAgIGNvbnN0IHN0YXRpYyBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8Y29uc3QgQzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkTGlzdDsKLSAgICAvLyBlbnVtIDogdWludDMyX3QgeyBiYXNlSW5kZXggPSBDMlRlc3RTdHJ1Y3RfRmxleEVuZFM2NCwgZmxleFNpemUgPSA4IH07Ci0gICAgLy8gdHlwZWRlZiBDMlRlc3RTdHJ1Y3RfRmxleEVuZFM2NCBfdHlwZTsKLSAgICAvLyB0eXBlZGVmIGludDY0X3QgZmxleFR5cGU7Ci19OwotCi1jb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8Y29uc3QgQzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9GbGV4RW5kUzY0OjpmaWVsZExpc3QgPSB7Ci0gICAgeyBGRDo6SU5UMzIsIDEsICJzMzIiLCAwLCA0IH0sCi0gICAgeyBGRDo6SU5UNjQsIDAsICJmbGV4IiwgNCwgOCB9LAotfTsKLQotc3RydWN0IEMyVGVzdEZsZXhTNjRTdHJ1Y3QgewotICAgIGludDY0X3QgbUZsZXhTaWduZWQ2NFtdOwotICAgIEMyVGVzdEZsZXhTNjRTdHJ1Y3QoKSB7fQotCi0gICAgREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKFRlc3RGbGV4UzY0LCBtRmxleFNpZ25lZDY0KQotICAgIEMyRklFTEQobUZsZXhTaWduZWQ2NCwgImZsZXgiKQotfTsKLQotc3RydWN0IEMyVGVzdEZsZXhFbmRTNjRTdHJ1Y3QgewotICAgIGludDMyX3QgbVNpZ25lZDMyOwotICAgIGludDY0X3QgbUZsZXhTaWduZWQ2NFtdOwotICAgIEMyVGVzdEZsZXhFbmRTNjRTdHJ1Y3QoKSB7fQotCi0gICAgREVGSU5FX0ZMRVhfQzJTVFJVQ1QoVGVzdEZsZXhFbmRTNjQsIG1GbGV4U2lnbmVkNjQpCi19IEMyX1BBQ0s7Ci0KLURFU0NSSUJFX0MyU1RSVUNUKFRlc3RGbGV4RW5kUzY0LCB7Ci0gICAgQzJGSUVMRChtU2lnbmVkMzIsICJzMzIiKQotICAgIEMyRklFTEQobUZsZXhTaWduZWQ2NCwgImZsZXgiKQotfSkgLy8gOyBvcHRpb25hbAotCi10ZW1wbGF0ZTw+Ci1zdGQ6OnZlY3RvcjxzdGQ6OnZlY3Rvcjxjb25zdCBDMkZpZWxkRGVzY3JpcHRvcj4+Ci0vL3N0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxzdGQ6OmluaXRpYWxpemVyX2xpc3Q8Y29uc3QgQzJGaWVsZERlc2NyaXB0b3I+PgotQzJQYXJhbVRlc3RfRmxleFBhcmFtRmllbGRMaXN0PGludDY0X3Q+OjpHZXRMaXN0cygpIHsKLSAgICByZXR1cm4gewotICAgICAgICBDMlRlc3RTdHJ1Y3RfRmxleFM2NDo6ZmllbGRMaXN0LAotICAgICAgICBDMlRlc3RTdHJ1Y3RfRmxleEVuZFM2NDo6ZmllbGRMaXN0LAotICAgICAgICBDMlRlc3RGbGV4UzY0U3RydWN0OjpmaWVsZExpc3QsCi0gICAgICAgIEMyVGVzdEZsZXhFbmRTNjRTdHJ1Y3Q6OmZpZWxkTGlzdCwKLSAgICB9OwotfQotCi1zdHJ1Y3QgQzJUZXN0U3RydWN0X0ZsZXhTaXplIHsKLSAgICBDMlNpemVTdHJ1Y3QgbUZsZXhTaXplW107Ci0KLSAgICBjb25zdCBzdGF0aWMgc3RkOjppbml0aWFsaXplcl9saXN0PGNvbnN0IEMyRmllbGREZXNjcmlwdG9yPiBmaWVsZExpc3Q7Ci0gICAgLy8gZW51bSA6IHVpbnQzMl90IHsgYmFzZUluZGV4ID0ga1BhcmFtSW5kZXhUZXN0RmxleFNpemUsIGZsZXhTaXplID0gOCB9OwotICAgIC8vIHR5cGVkZWYgQzJUZXN0U3RydWN0X0ZsZXhTaXplIF90eXBlOwotICAgIC8vIHR5cGVkZWYgQzJTaXplU3RydWN0IGZsZXhUeXBlOwotfTsKLQotY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PGNvbnN0IEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfRmxleFNpemU6OmZpZWxkTGlzdCA9IHsKLSAgICB7IEMyU2l6ZVN0cnVjdDo6VFlQRSwgMCwgImZsZXgiLCAwLCBzaXplb2YoQzJTaXplU3RydWN0KSB9Ci19OwotCi1zdHJ1Y3QgQzJUZXN0U3RydWN0X0ZsZXhFbmRTaXplIHsKLSAgICBpbnQzMl90IG1TaWduZWQzMjsKLSAgICBDMlNpemVTdHJ1Y3QgbVNpemVGbGV4W107Ci0KLSAgICBjb25zdCBzdGF0aWMgc3RkOjppbml0aWFsaXplcl9saXN0PGNvbnN0IEMyRmllbGREZXNjcmlwdG9yPiBmaWVsZExpc3Q7Ci0gICAgLy8gZW51bSA6IHVpbnQzMl90IHsgYmFzZUluZGV4ID0gQzJUZXN0U3RydWN0X0ZsZXhFbmRTaXplLCBmbGV4U2l6ZSA9IDggfTsKLSAgICAvLyB0eXBlZGVmIEMyVGVzdFN0cnVjdF9GbGV4RW5kU2l6ZSBfdHlwZTsKLSAgICAvLyB0eXBlZGVmIEMyU2l6ZVN0cnVjdCBmbGV4VHlwZTsKLX07Ci0KLWNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxjb25zdCBDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0ZsZXhFbmRTaXplOjpmaWVsZExpc3QgPSB7Ci0gICAgeyBGRDo6SU5UMzIsIDEsICJzMzIiLCAwLCA0IH0sCi0gICAgeyBDMlNpemVTdHJ1Y3Q6OlRZUEUsIDAsICJmbGV4IiwgNCwgc2l6ZW9mKEMyU2l6ZVN0cnVjdCkgfSwKLX07Ci0KLXN0cnVjdCBDMlRlc3RGbGV4U2l6ZVN0cnVjdCB7Ci0gICAgQzJTaXplU3RydWN0IG1GbGV4U2l6ZVtdOwotICAgIEMyVGVzdEZsZXhTaXplU3RydWN0KCkge30KLQotICAgIERFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVChUZXN0RmxleFNpemUsIG1GbGV4U2l6ZSkKLSAgICBDMkZJRUxEKG1GbGV4U2l6ZSwgImZsZXgiKQotfTsKLQotc3RydWN0IEMyVGVzdEZsZXhFbmRTaXplU3RydWN0IHsKLSAgICBpbnQzMl90IG1TaWduZWQzMjsKLSAgICBDMlNpemVTdHJ1Y3QgbUZsZXhTaXplW107Ci0gICAgQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3QoKSB7fQotCi0gICAgREVGSU5FX0ZMRVhfQzJTVFJVQ1QoVGVzdEZsZXhFbmRTaXplLCBtRmxleFNpemUpCi19IEMyX1BBQ0s7Ci0KLURFU0NSSUJFX0MyU1RSVUNUKFRlc3RGbGV4RW5kU2l6ZSwgewotICAgIEMyRklFTEQobVNpZ25lZDMyLCAiczMyIikKLSAgICBDMkZJRUxEKG1GbGV4U2l6ZSwgImZsZXgiKQotfSkgLy8gOyBvcHRpb25hbAotCi10ZW1wbGF0ZTw+Ci1zdGQ6OnZlY3RvcjxzdGQ6OnZlY3Rvcjxjb25zdCBDMkZpZWxkRGVzY3JpcHRvcj4+Ci0vL3N0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxzdGQ6OmluaXRpYWxpemVyX2xpc3Q8Y29uc3QgQzJGaWVsZERlc2NyaXB0b3I+PgotQzJQYXJhbVRlc3RfRmxleFBhcmFtRmllbGRMaXN0PEMyU2l6ZVN0cnVjdD46OkdldExpc3RzKCkgewotICAgIHJldHVybiB7Ci0gICAgICAgIEMyVGVzdFN0cnVjdF9GbGV4U2l6ZTo6ZmllbGRMaXN0LAotICAgICAgICBDMlRlc3RTdHJ1Y3RfRmxleEVuZFNpemU6OmZpZWxkTGlzdCwKLSAgICAgICAgQzJUZXN0RmxleFNpemVTdHJ1Y3Q6OmZpZWxkTGlzdCwKLSAgICAgICAgQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3Q6OmZpZWxkTGlzdCwKLSAgICB9OwotfQotCi1URVNUX0YoQzJQYXJhbVRlc3QsIEZpZWxkSWQpIHsKLSAgICAvLyBwb2ludGVyIGNvbnN0cnVjdG9yCi0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMCwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT5tU2lnbmVkMzIpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0LCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPm1TaWduZWQ2NCkpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDIwLCA0KSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPm1VbnNpZ25lZDMyKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjQsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+bVVuc2lnbmVkNjQpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgzMiwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT5tRmxvYXQpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgzNiwgOCksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT5tU2l6ZSkpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDYwLCAxKSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPm1CbG9iKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTYwLCAxKSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPm1TdHJpbmcpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyNjAsIDEpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+bVllc05vKSk7Ci0KLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgwLCA0KSwgX0MyRmllbGRJZCgmKChDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdCopMCktPm1TaWduZWQzMikpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEZsZXhFbmRTaXplU3RydWN0KikwKS0+bUZsZXhTaXplKSk7Ci0KLSAgICAvLyBtZW1iZXIgcG9pbnRlciBjb25zdHJ1Y3RvcgotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDAsIDQpLCBfQzJGaWVsZElkKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjptU2lnbmVkMzIpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0LCA4KSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6bVNpZ25lZDY0KSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjAsIDQpLCBfQzJGaWVsZElkKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjptVW5zaWduZWQzMikpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI0LCA4KSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6bVVuc2lnbmVkNjQpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgzMiwgNCksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6Om1GbG9hdCkpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDM2LCA4KSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6bVNpemUpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg2MCwgMSksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6Om1CbG9iKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTYwLCAxKSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6bVN0cmluZykpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI2MCwgMSksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6Om1ZZXNObykpOwotCi0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMCwgNCksIF9DMkZpZWxkSWQoKEMyVGVzdEZsZXhFbmRTaXplU3RydWN0KikwLCAmQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3Q6Om1TaWduZWQzMikpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQsIDgpLCBfQzJGaWVsZElkKChDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdCopMCwgJkMyVGVzdEZsZXhFbmRTaXplU3RydWN0OjptRmxleFNpemUpKTsKLQotICAgIC8vIG1lbWJlciBwb2ludGVyIHNhbnMgdHlwZSBwb2ludGVyCi0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMCwgNCksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjptU2lnbmVkMzIpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0LCA4KSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6Om1TaWduZWQ2NCkpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDIwLCA0KSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6Om1VbnNpZ25lZDMyKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjQsIDgpLCBfQzJGaWVsZElkKCZDMlRlc3RTdHJ1Y3RfQTo6bVVuc2lnbmVkNjQpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgzMiwgNCksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjptRmxvYXQpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgzNiwgOCksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjptU2l6ZSkpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDYwLCAxKSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6Om1CbG9iKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTYwLCAxKSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6Om1TdHJpbmcpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyNjAsIDEpLCBfQzJGaWVsZElkKCZDMlRlc3RTdHJ1Y3RfQTo6bVllc05vKSk7Ci0KLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgwLCA0KSwgX0MyRmllbGRJZCgmQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3Q6Om1TaWduZWQzMikpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQsIDgpLCBfQzJGaWVsZElkKCZDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdDo6bUZsZXhTaXplKSk7Ci0KLSAgICB0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMlRlc3RBU3RydWN0PiBDMlRlc3RBSW5mbzsKLSAgICB0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdD4gQzJUZXN0RmxleEVuZFNpemVJbmZvOwotCi0gICAgLy8gcG9pbnRlciBjb25zdHJ1Y3RvciBpbiBDMlBhcmFtCi0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoOCwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT5tU2lnbmVkMzIpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxMiwgOCksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT5tU2lnbmVkNjQpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyOCwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT5tVW5zaWduZWQzMikpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDMyLCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RBSW5mbyopMCktPm1VbnNpZ25lZDY0KSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNDAsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+bUZsb2F0KSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNDQsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+bVNpemUpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg2OCwgMSksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT5tQmxvYikpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDE2OCwgMSksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT5tU3RyaW5nKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjY4LCAxKSwgX0MyRmllbGRJZCgmKChDMlRlc3RBSW5mbyopMCktPm1ZZXNObykpOwotCi0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoOCwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0RmxleEVuZFNpemVJbmZvKikwKS0+bS5tU2lnbmVkMzIpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxMiwgOCksIF9DMkZpZWxkSWQoJigoQzJUZXN0RmxleEVuZFNpemVJbmZvKikwKS0+bS5tRmxleFNpemUpKTsKLQotICAgIC8vIG1lbWJlciBwb2ludGVyIGluIEMyUGFyYW0KLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg4LCA0KSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6bVNpZ25lZDMyKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTIsIDgpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjptU2lnbmVkNjQpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyOCwgNCksIF9DMkZpZWxkSWQoKEMyVGVzdEFJbmZvKikwLCAmQzJUZXN0QUluZm86Om1VbnNpZ25lZDMyKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMzIsIDgpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjptVW5zaWduZWQ2NCkpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQwLCA0KSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6bUZsb2F0KSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNDQsIDgpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjptU2l6ZSkpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDY4LCAxKSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6bUJsb2IpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxNjgsIDEpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjptU3RyaW5nKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjY4LCAxKSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6bVllc05vKSk7Ci0KLSAgICAvLyBOT1RFOiBjYW5ub3QgdXNlIGEgbWVtYmVyIHBvaW50ZXIgZm9yIGZsZXggcGFyYW1zIGR1ZSB0byBpbnRyb2R1Y3Rpb24gb2YgJ20nCi0gICAgLy8gRVhQRUNUX0VRKF9DMkZpZWxkSWQoOCwgNCksIF9DMkZpZWxkSWQoJkMyVGVzdEZsZXhFbmRTaXplSW5mbzo6bS5tU2lnbmVkMzIpKTsKLSAgICAvLyBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxMiwgOCksIF9DMkZpZWxkSWQoJkMyVGVzdEZsZXhFbmRTaXplSW5mbzo6bS5tRmxleFNpemUpKTsKLQotCi0KLX0KLQotc3RydWN0IFMzMiB7Ci0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgY2xhc3MgQj10eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8VD46OnR5cGU+Ci0gICAgaW5saW5lIFMzMihjb25zdCBUKikgewotICAgICAgICBzdGF0aWNfYXNzZXJ0KCFzdGQ6OmlzX2FycmF5PFQ+Ojp2YWx1ZSwgInNob3VsZCBub3QgYmUgYW4gYXJyYXkiKTsKLSAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8QiwgaW50MzJfdD46OnZhbHVlLCAic2hvdWxkIGJlIGludDMyX3QiKTsKLSAgICB9Ci19OwotCi1zdHJ1Y3QgRkxYIHsKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBULCBjbGFzcyBCPXR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2V4dGVudDxUPjo6dHlwZT4KLSAgICBpbmxpbmUgRkxYKGNvbnN0IFQqLCBjb25zdCBVKikgewotICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfYXJyYXk8VD46OnZhbHVlLCAic2hvdWxkIGJlIGFuIGFycmF5Iik7Ci0gICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjpleHRlbnQ8VD46OnZhbHVlID09IDAsICJzaG91bGQgYmUgYW4gYXJyYXkgb2YgMCBleHRlbnQiKTsKLSAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8QiwgVT46OnZhbHVlLCAic2hvdWxkIGJlIHR5cGUgVSIpOwotICAgIH0KLX07Ci0KLXN0cnVjdCBNUCB7Ci0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgVCwgdHlwZW5hbWUgRXhwZWN0ZWRVLCB0eXBlbmFtZSBVbmV4cGVjdGVkVT4KLSAgICBpbmxpbmUgTVAoVCBVOjoqLCBjb25zdCBFeHBlY3RlZFUqLCBjb25zdCBVbmV4cGVjdGVkVSopIHsKLSAgICAgICAgc3RhdGljX2Fzc2VydCghc3RkOjppc19zYW1lPFUsIFVuZXhwZWN0ZWRVPjo6dmFsdWUsICJzaG91bGQgbm90IGJlIG1lbWJlciBwb2ludGVyIG9mIHRoZSBiYXNlIHR5cGUiKTsKLSAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8VSwgRXhwZWN0ZWRVPjo6dmFsdWUsICJzaG91bGQgYmUgbWVtYmVyIHBvaW50ZXIgb2YgdGhlIGRlcml2ZWQgdHlwZSIpOwotICAgIH0KLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIFQsIHR5cGVuYW1lIEIsIHR5cGVuYW1lIEQ+Ci0gICAgaW5saW5lIE1QKFQgRDo6KiwgY29uc3QgRCopIHsgfQotfTsKLQotdm9pZCBjb21waWxlZFN0YXRpY19hcnJheVR5cGVQcm9wYWdhdGlvblRlc3QoKSB7Ci0gICAgKHZvaWQpUzMyKCYoKEMyVGVzdEZsZXhFbmRTMzJTdHJ1Y3QgKikwKS0+bVNpZ25lZDMyKTsKLSAgICAodm9pZClGTFgoJigoQzJUZXN0RmxleEVuZFMzMlN0cnVjdCAqKTApLT5tRmxleFNpZ25lZDMyLCAoaW50MzJfdCopMCk7Ci0gICAgKHZvaWQpRkxYKCYoKEMyVGVzdEZsZXhTMzJTdHJ1Y3QgKikwKS0+bUZsZXhTaWduZWQzMiwgKGludDMyX3QqKTApOwotCi0gICAgdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJUZXN0QVN0cnVjdD4gQzJUZXN0QUluZm87Ci0KLSAgICAvLyBUUklDS1k6ICZkZXJpdmVkQ2xhc3M6OmJhc2VNZW1iZXIgaGFzIHR5cGUgb2YgYmFzZUNsYXNzOjoqCi0gICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUoJkMyVGVzdEFJbmZvOjptU2lnbmVkMzIpLCBpbnQzMl90IEMyVGVzdEFTdHJ1Y3Q6Oio+Ojp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICJiYXNlIG1lbWJlciBwb2ludGVyIHNob3VsZCBoYXZlIGJhc2UgY2xhc3MgaW4gdHlwZSIpOwotCi0gICAgLy8gdGhlcmVmb3JlLCBtZW1iZXIgcG9pbnRlciBleHBhbmRzIHRvIGJhc2VDbGFzczo6KiBpbiB0ZW1wbGF0ZXMKLSAgICAodm9pZClNUCgmQzJUZXN0QUluZm86Om1TaWduZWQzMiwKLSAgICAgICAgICAgICAoQzJUZXN0QVN0cnVjdCopMCAvKiBleHBlY3RlZCAqLywgKEMyVGVzdEFJbmZvKikwIC8qIHVuZXhwZWN0ZWQgKi8pOwotICAgIC8vIGJ1dCBjYW4gYmUgY2FzdCB0byBkZXJpdmVkQ2xhc3M6OioKLSAgICAodm9pZClNUCgoaW50MzJfdCBDMlRlc3RBSW5mbzo6KikmQzJUZXN0QUluZm86Om1TaWduZWQzMiwKLSAgICAgICAgICAgICAoQzJUZXN0QUluZm8qKTAgLyogZXhwZWN0ZWQgKi8sIChDMlRlc3RBU3RydWN0KikwIC8qIHVuZXhwZWN0ZWQgKi8pOwotCi0gICAgLy8gVFJJQ0tZOiBiYXNlQ2xhc3M6OiogZG9lcyBub3QgYXV0b2NvbnZlcnQgdG8gZGVyaXZlZENsYXNzOjoqIGV2ZW4gaW4gdGVtcGxhdGVzCi0gICAgLy8gKHZvaWQpTVAoJkMyVGVzdEFJbmZvOjptU2lnbmVkMzIsIChDMlRlc3RBSW5mbyopMCk7Ci19Ci0KLVRFU1RfRihDMlBhcmFtVGVzdCwgTWVtYmVyUG9pbnRlckNhc3QpIHsKLSAgICB0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMlRlc3RBU3RydWN0PiBDMlRlc3RBSW5mbzsKLQotICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJUZXN0QUluZm8sIG1TaWduZWQzMikgPT0gOCwgIm9mZnNldCBzaG91bGQgYmUgOCIpOwotICAgIGNvbnN0ZXhwciBpbnQzMl90IEMyVGVzdEFTdHJ1Y3Q6OiogczMycHRyID0gJkMyVGVzdEFJbmZvOjptU2lnbmVkMzI7Ci0gICAgY29uc3RleHByIGludDMyX3QgQzJUZXN0QUluZm86OiogczMycHRyX2Rlcml2ZWQgPSAoaW50MzJfdCBDMlRlc3RBU3RydWN0OjoqKSZDMlRlc3RBSW5mbzo6bVNpZ25lZDMyOwotICAgIGNvbnN0ZXhwciBpbnQzMl90IEMyVGVzdEFJbmZvOjoqIHMzMnB0cl9jYXN0MmRlcml2ZWQgPSAoaW50MzJfdCBDMlRlc3RBSW5mbzo6KilzMzJwdHI7Ci0gICAgQzJUZXN0QUluZm8gKmluZm8gPSAoQzJUZXN0QUluZm8gKikyNTY7Ci0gICAgQzJUZXN0QVN0cnVjdCAqc3RydWt0ID0gKEMyVGVzdEFTdHJ1Y3QgKilpbmZvOwotICAgIGludDMyX3QgKmluZm9fczMyX2Rlcml2ZWQgPSAmKGluZm8tPipzMzJwdHJfZGVyaXZlZCk7Ci0gICAgaW50MzJfdCAqaW5mb19zMzJfY2FzdDJkZXJpdmVkID0gJihpbmZvLT4qczMycHRyX2Nhc3QyZGVyaXZlZCk7Ci0gICAgaW50MzJfdCAqaW5mb19zMzIgPSAmKGluZm8tPipzMzJwdHIpOwotICAgIGludDMyX3QgKnN0cnVrdF9zMzIgPSAmKHN0cnVrdC0+KnMzMnB0cik7Ci0KLSAgICBFWFBFQ1RfRVEoMjU2dSwgKHVpbnRwdHJfdClpbmZvKTsKLSAgICBFWFBFQ1RfRVEoMjY0dSwgKHVpbnRwdHJfdClzdHJ1a3QpOwotICAgIEVYUEVDVF9FUSgyNjR1LCAodWludHB0cl90KWluZm9fczMyX2Rlcml2ZWQpOwotICAgIEVYUEVDVF9FUSgyNjR1LCAodWludHB0cl90KWluZm9fczMyX2Nhc3QyZGVyaXZlZCk7Ci0gICAgRVhQRUNUX0VRKDI2NHUsICh1aW50cHRyX3QpaW5mb19zMzIpOwotICAgIEVYUEVDVF9FUSgyNjR1LCAodWludHB0cl90KXN0cnVrdF9zMzIpOwotCi0gICAgdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3Q+IEMyVGVzdEZsZXhFbmRTaXplSW5mbzsKLSAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyVGVzdEZsZXhFbmRTaXplSW5mbywgbS5tU2lnbmVkMzIpID09IDgsICJvZmZzZXQgc2hvdWxkIGJlIDgiKTsKLSAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyVGVzdEZsZXhFbmRTaXplSW5mbywgbS5tRmxleFNpemUpID09IDEyLCAib2Zmc2V0IHNob3VsZCBiZSAxMiIpOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFBBUkFNIFVTQUdFIFRFU1RTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotc3RydWN0IEMyTnVtYmVyU3RydWN0IHsKLSAgICBpbnQzMl90IG1OdW1iZXI7Ci0gICAgQzJOdW1iZXJTdHJ1Y3QoKSB7fQotICAgIEMyTnVtYmVyU3RydWN0KGludDMyX3QgX251bWJlcikgOiBtTnVtYmVyKF9udW1iZXIpIHt9Ci0KLSAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKE51bWJlcikKLSAgICBDMkZJRUxEKG1OdW1iZXIsICJudW1iZXIiKQotfTsKLQotc3RydWN0IEMyTnVtYmVyc1N0cnVjdCB7Ci0gICAgaW50MzJfdCBtTnVtYmVyc1tdOwotICAgIEMyTnVtYmVyc1N0cnVjdCgpIHt9Ci0KLSAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QoTnVtYmVycywgbU51bWJlcnMpCi0gICAgQzJGSUVMRChtTnVtYmVycywgIm51bWJlcnMiKQotfTsKLXN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyc1N0cnVjdCkgPT0gMCwgIkMyTnVtYmVyc1N0cnVjdCBoYXMgaW5jb3JyZWN0IHNpemUiKTsKLQotdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMk51bWJlclN0cnVjdD4gQzJOdW1iZXJUdW5pbmc7Ci10eXBlZGVmICAgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyTnVtYmVyU3RydWN0PiBDMk51bWJlclBvcnRUdW5pbmc7Ci10eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyTnVtYmVyU3RydWN0PiBDMk51bWJlclN0cmVhbVR1bmluZzsKLQotdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMk51bWJlcnNTdHJ1Y3Q+IEMyTnVtYmVyc1R1bmluZzsKLXR5cGVkZWYgICBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJOdW1iZXJzU3RydWN0PiBDMk51bWJlcnNQb3J0VHVuaW5nOwotdHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMk51bWJlcnNTdHJ1Y3Q+IEMyTnVtYmVyc1N0cmVhbVR1bmluZzsKLQotLy8KLSNpZiAwCi0KLXZvaWQgdGVzdCgpIHsKLSAgICBDMk51bWJlclN0cnVjdCBzKDEwKTsKLSAgICAodm9pZClDMk51bWJlclN0cnVjdDo6ZmllbGRMaXN0OwotfTsKLQotdHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMkludDY0VmFsdWUsIGtQYXJhbUluZGV4TnVtYmVyQj4gQzJOdW1iZXJDb25maWc0OwotdHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJJbnQzMlZhbHVlLCBrUGFyYW1JbmRleE51bWJlcj4gQzJOdW1iZXJDb25maWczOwotdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMlN0cmluZ1ZhbHVlLCBrUGFyYW1JbmRleE51bWJlcj4gQzJWaWRlb05hbWVDb25maWc7Ci0KLXZvaWQgdGVzdDMoKSB7Ci0gICAgQzJOdW1iZXJDb25maWczIHMoMTApOwotICAgIHMubVZhbHVlID0gMTE7Ci0gICAgcyA9IDEyOwotICAgICh2b2lkKUMyTnVtYmVyQ29uZmlnMzo6ZmllbGRMaXN0OwotICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlZpZGVvTmFtZUNvbmZpZz4gbiA9IEMyVmlkZW9OYW1lQ29uZmlnOjphbGxvY19zaGFyZWQoMjUpOwotICAgIHN0cmNweShuLT5tLm1WYWx1ZSwgImxham9zIik7Ci0gICAgQzJOdW1iZXJDb25maWc0IHQoZmFsc2UsIDAsIDExKTsKLSAgICB0Lm1WYWx1ZSA9IDE1OwotfTsKLQotc3RydWN0IEMyTnVtYmVyc1N0cnVjdCB7Ci0gICAgaW50MzJfdCBtTnVtYmVyc1tdOwotICAgIGVudW0geyBiYXNlSW5kZXggPSBrUGFyYW1JbmRleE51bWJlciB9OwotICAgIGNvbnN0IHN0YXRpYyBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8Y29uc3QgQzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkTGlzdDsKLSAgICBDMk51bWJlcnNTdHJ1Y3QoKSB7fQotCi0gICAgRkxFWChDMk51bWJlcnNTdHJ1Y3QsIG1OdW1iZXJzKTsKLX07Ci0KLXN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyc1N0cnVjdCkgPT0gMCwgInllcyIpOwotCi0KLXR5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMyTnVtYmVyc1N0cnVjdD4gQzJOdW1iZXJzSW5mbzsKLQotY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PGNvbnN0IEMyRmllbGREZXNjcmlwdG9yPiBDMk51bWJlcnNTdHJ1Y3Q6OmZpZWxkTGlzdCA9Ci0vLyAgICB7IHsgRkQ6OklOVDMyLCAwLCAid2lkdGhzIiB9IH07Ci0gICAgeyBDMkZpZWxkRGVzY3JpcHRvcigmKChDMk51bWJlcnNTdHJ1Y3QqKShudWxscHRyKSktPm1OdW1iZXJzLCAibnVtYmVyIikgfTsKLQotdHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJOdW1iZXJTdHJ1Y3Q+IEMyTnVtYmVyQ29uZmlnOwotCi1zdGQ6Omxpc3Q8Y29uc3QgQzJGaWVsZERlc2NyaXB0b3I+IG15TGlzdCA9IEMyTnVtYmVyQ29uZmlnOjpmaWVsZExpc3Q7Ci0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8YW5kcm9pZDo6QzJQYXJhbURlc2NyaXB0b3I+IF9fdGVzdF9kZXNjcmliZSh1aW50MzJfdCBwYXJhbVR5cGUpIHsKLSAgICAgICAgc3RkOjpsaXN0PGNvbnN0IEMyRmllbGREZXNjcmlwdG9yPiBmaWVsZHMgPSBkZXNjcmliZUMyUGFyYW1zPEMyTnVtYmVyQ29uZmlnPigpOwotCi0gICAgICAgIGF1dG8gd2lkdGhzID0gQzJOdW1iZXJzSW5mbzo6YWxsb2Nfc2hhcmVkKDUpOwotICAgICAgICB3aWR0aHMtPmZsZXhDb3VudCgpOwotICAgICAgICB3aWR0aHMtPm0ubU51bWJlcnNbNF0gPSAxOwotCi0gICAgICAgIHRlc3QoKTsKLSAgICAgICAgdGVzdDMoKTsKLQotICAgICAgICBDMk51bWJlckNvbmZpZyBvdXRwdXRXaWR0aChmYWxzZSwgMTIzKTsKLQotICAgICAgICBDMlBhcmFtOjpJbmRleCBpbmRleChwYXJhbVR5cGUpOwotICAgICAgICBzd2l0Y2ggKHBhcmFtVHlwZSkgewotICAgICAgICBjYXNlIEMyTnVtYmVyQ29uZmlnOjpiYXNlSW5kZXg6Ci0gICAgICAgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPihuZXcgQzJQYXJhbURlc2NyaXB0b3J7Ci0gICAgICAgICAgICAgICAgdHJ1ZSAvKiBpc1JlcXVpcmVkICovLAotICAgICAgICAgICAgICAgICJudW1iZXIiLAotICAgICAgICAgICAgICAgIGluZGV4LAotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotCi0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmCi0vLwotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotYm9vbCBjYW5TZXRQb3J0KFQgJm8sIGJvb2wgb3V0cHV0KSB7IHJldHVybiBvLnNldFBvcnQob3V0cHV0KTsgfQotYm9vbCBjYW5TZXRQb3J0KC4uLikgeyByZXR1cm4gZmFsc2U7IH0KLQotdGVtcGxhdGU8dHlwZW5hbWUgUywgdHlwZW5hbWU9ZGVjbHR5cGUoKChTKikwKS0+c2V0UG9ydCh0cnVlKSk+Ci1zdGF0aWMgc3RkOjp0cnVlX3R5cGUgX2NhbkNhbGxTZXRQb3J0KGludCk7Ci10ZW1wbGF0ZTx0eXBlbmFtZT4KLXN0YXRpYyBzdGQ6OmZhbHNlX3R5cGUgX2NhbkNhbGxTZXRQb3J0KC4uLik7Ci0jZGVmaW5lIGNhbkNhbGxTZXRQb3J0KHgpIGRlY2x0eXBlKF9jYW5DYWxsU2V0UG9ydDxzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8ZGVjbHR5cGUoeCk+Ojp0eXBlPigwKSk6OnZhbHVlCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTVEFUSUMgVEVTVFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLXN0YXRpY19hc3NlcnQoX0MyQ29tcGFyYWJsZTxpbnQ+Ojp2YWx1ZSwgImludCBpcyBub3QgY29tcGFyYWJsZSIpOwotc3RhdGljX2Fzc2VydCghX0MyQ29tcGFyYWJsZTx2b2lkPjo6dmFsdWUsICJ2b2lkIGlzIGNvbXBhcmFibGUiKTsKLQotc3RydWN0IEMyX0hJREUgX3Rlc3QwIHsKLSAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgX3Rlc3QwJik7Ci0gICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IF90ZXN0MCYpOwotfTsKLXN0cnVjdCBDMl9ISURFIF90ZXN0MSB7Ci0gICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IF90ZXN0MSYpOwotfTsKLXN0cnVjdCBDMl9ISURFIF90ZXN0MiB7Ci0gICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IF90ZXN0MiYpOwotfTsKLXN0YXRpY19hc3NlcnQoX0MyQ29tcGFyYWJsZTxfdGVzdDA+Ojp2YWx1ZSwgImNsYXNzIHdpdGggPT0gYW5kICE9IGlzIG5vdCBjb21wYXJhYmxlIik7Ci1zdGF0aWNfYXNzZXJ0KF9DMkNvbXBhcmFibGU8X3Rlc3QxPjo6dmFsdWUsICJjbGFzcyB3aXRoID09IGlzIG5vdCBjb21wYXJhYmxlIik7Ci1zdGF0aWNfYXNzZXJ0KF9DMkNvbXBhcmFibGU8X3Rlc3QyPjo6dmFsdWUsICJjbGFzcyB3aXRoICE9IGlzIG5vdCBjb21wYXJhYmxlIik7Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDMlBBUkFNIFRFU1RTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi1zdHJ1Y3QgX0MyUGFyYW1JbnNwZWN0b3IgewotICAgIHN0YXRpYyB2b2lkIFN0YXRpY1Rlc3QoKTsKLSAgICBzdGF0aWMgdm9pZCBTdGF0aWNGbGV4VGVzdCgpOwotfTsKLQotLy8gVEVTVF9GKF9DMlBhcmFtSW5zcGVjdG9yLCBTdGF0aWNUZXN0KSB7Ci12b2lkIF9DMlBhcmFtSW5zcGVjdG9yOjpTdGF0aWNUZXN0KCkgewotICAgIHR5cGVkZWYgQzJQYXJhbTo6SW5kZXggSTsKLQotICAgIC8vIEMyTnVtYmVyU3RydWN0OiBiYXNlSW5kZXggPSBrSW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgIChhcmdzKQotICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJTdHJ1Y3Q6OmJhc2VJbmRleCA9PSBrUGFyYW1JbmRleE51bWJlciwgImJhZCBpbmRleCIpOwotICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyU3RydWN0KSA9PSA0LCAiYmFkIHNpemUiKTsKLQotICAgIC8vIEMyTnVtYmVyVHVuaW5nOiAgICAgICAgICAgICBrSW5kZXggfCB0dW4gfCBnbG9iYWwgICAgICAgICAgIChhcmdzKQotICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJUdW5pbmc6OmJhc2VJbmRleCA9PSBrUGFyYW1JbmRleE51bWJlciwgImJhZCBpbmRleCIpOwotICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJUdW5pbmc6OnR5cGVJbmRleCA9PSAoa1BhcmFtSW5kZXhOdW1iZXIgfCBJOjprVHlwZVR1bmluZyB8IEk6OmtEaXJHbG9iYWwpLCAiYmFkIGluZGV4Iik7Ci0gICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJUdW5pbmcpID09IDEyLCAiYmFkIHNpemUiKTsKLQotICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJUdW5pbmcsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7Ci0gICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclR1bmluZywgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKLSAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyVHVuaW5nLCBtTnVtYmVyKSA9PSA4LCAiYmFkIG9mZnNldCIpOwotCi0gICAgLy8gQzJOdW1iZXJQb3J0VHVuaW5nOiAgICAgICAgIGtJbmRleCB8IHR1biB8IHBvcnQgICAgICAgICAgICAgKGJvb2wsIGFyZ3MpCi0gICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJQb3J0VHVuaW5nKSA9PSAxMiwgImJhZCBzaXplIik7Ci0gICAgLy8gQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDogIGtJbmRleCB8IHR1biB8IHBvcnQgfCBpbnB1dCAgICAgKGFyZ3MpCi0gICAgLy8gQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6IGtJbmRleCB8IHR1biB8IHBvcnQgfCBvdXRwdXQgICAgKGFyZ3MpCi0gICAgc3RhdGljX2Fzc2VydChDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpiYXNlSW5kZXggPT0KLSAgICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4TnVtYmVyLCAiYmFkIGluZGV4Iik7Ci0gICAgc3RhdGljX2Fzc2VydChDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0Ojp0eXBlSW5kZXggPT0KLSAgICAgICAgICAgICAgICAgIChrUGFyYW1JbmRleE51bWJlciB8IEk6OmtUeXBlVHVuaW5nIHwgSTo6a0RpcklucHV0KSwgImJhZCBpbmRleCIpOwotICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OmJhc2VJbmRleCA9PQotICAgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhOdW1iZXIsICJiYWQgaW5kZXgiKTsKLSAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0Ojp0eXBlSW5kZXggPT0KLSAgICAgICAgICAgICAgICAgIChrUGFyYW1JbmRleE51bWJlciB8IEk6OmtUeXBlVHVuaW5nIHwgSTo6a0Rpck91dHB1dCksICJiYWQgaW5kZXgiKTsKLSAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0KSA9PSAxMiwgImJhZCBzaXplIik7Ci0gICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQpID09IDEyLCAiYmFkIHNpemUiKTsKLSAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7Ci0gICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOwotICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dCwgbU51bWJlcikgPT0gOCwgImJhZCBvZmZzZXQiKTsKLSAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOwotICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7Ci0gICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dCwgbU51bWJlcikgPT0gOCwgImJhZCBvZmZzZXQiKTsKLQotICAgIC8vIEMyTnVtYmVyU3RyZWFtVHVuaW5nOiAgICAgICBrSW5kZXggfCB0dW4gfCBzdHIgICAgICAgICAgICAgIChib29sLCB1aW50LCBhcmdzKQotICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyU3RyZWFtVHVuaW5nKSA9PSAxMnUsICJiYWQgc2l6ZSIpOwotICAgIC8vIEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dCBrSW5kZXggfCB0dW4gfCBzdHIgfCBpbnB1dCAgICAgIChpbnQsIGFyZ3MpCi0gICAgLy8gQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dCBrSXggICB8IHR1biB8IHN0ciB8IG91dHB1dCAgICAgKGludCwgYXJncykKLSAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6YmFzZUluZGV4ID09Ci0gICAgICAgICAgICAgICAgICBrUGFyYW1JbmRleE51bWJlciwgImJhZCBpbmRleCIpOwotICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0Ojp0eXBlSW5kZXggPT0KLSAgICAgICAgICAgICAgICAgIChrUGFyYW1JbmRleE51bWJlciB8IEk6OmtUeXBlVHVuaW5nIHwgSTo6a0RpcklucHV0IHwgSTo6a1N0cmVhbUZsYWcpLCAiYmFkIGluZGV4Iik7Ci0gICAgc3RhdGljX2Fzc2VydChDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpiYXNlSW5kZXggPT0KLSAgICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4TnVtYmVyLCAiYmFkIGluZGV4Iik7Ci0gICAgc3RhdGljX2Fzc2VydChDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0Ojp0eXBlSW5kZXggPT0KLSAgICAgICAgICAgICAgICAgIChrUGFyYW1JbmRleE51bWJlciB8IEk6OmtUeXBlVHVuaW5nIHwgSTo6a0Rpck91dHB1dCB8IEk6OmtTdHJlYW1GbGFnKSwgImJhZCBpbmRleCIpOwotICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dCkgPT0gMTJ1LCAiYmFkIHNpemUiKTsKLSAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0KSA9PSAxMnUsICJiYWQgc2l6ZSIpOwotICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOwotICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOwotICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0LCBtTnVtYmVyKSA9PSA4LCAiYmFkIG9mZnNldCIpOwotICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKLSAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7Ci0gICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0LCBtTnVtYmVyKSA9PSA4LCAiYmFkIG9mZnNldCIpOwotfQotCi12b2lkIF9DMlBhcmFtSW5zcGVjdG9yOjpTdGF0aWNGbGV4VGVzdCgpIHsKLSAgICB0eXBlZGVmIEMyUGFyYW06OkluZGV4IEk7Ci0KLSAgICAvLyBDMk51bWJlcnNTdHJ1Y3Q6IGJhc2VJbmRleCA9IGtJbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgKGFyZ3MpCi0gICAgc3RhdGljX2Fzc2VydChDMk51bWJlcnNTdHJ1Y3Q6OmJhc2VJbmRleCA9PSAoSTo6a0ZsZXhpYmxlRmxhZyB8IGtQYXJhbUluZGV4TnVtYmVycyksICJiYWQgaW5kZXgiKTsKLSAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlcnNTdHJ1Y3QpID09IDAsICJiYWQgc2l6ZSIpOwotCi0gICAgLy8gQzJOdW1iZXJzVHVuaW5nOiAgICAgICAgICAgICBrSW5kZXggfCB0dW4gfCBnbG9iYWwgICAgICAgICAgIChhcmdzKQotICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJzVHVuaW5nOjpiYXNlSW5kZXggPT0gKEk6OmtGbGV4aWJsZUZsYWcgfCBrUGFyYW1JbmRleE51bWJlcnMpLCAiYmFkIGluZGV4Iik7Ci0gICAgc3RhdGljX2Fzc2VydChDMk51bWJlcnNUdW5pbmc6OnR5cGVJbmRleCA9PSAoSTo6a0ZsZXhpYmxlRmxhZyB8IGtQYXJhbUluZGV4TnVtYmVycyB8IEk6OmtUeXBlVHVuaW5nIHwgSTo6a0Rpckdsb2JhbCksICJiYWQgaW5kZXgiKTsKLSAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlcnNUdW5pbmcpID09IDgsICJiYWQgc2l6ZSIpOwotCi0gICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNUdW5pbmcsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7Ci0gICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNUdW5pbmcsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7Ci0gICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNUdW5pbmcsIG0ubU51bWJlcnMpID09IDgsICJiYWQgb2Zmc2V0Iik7Ci0KLSAgICAvLyBDMk51bWJlcnNQb3J0VHVuaW5nOiAgICAgICAgIGtJbmRleCB8IHR1biB8IHBvcnQgICAgICAgICAgICAgKGJvb2wsIGFyZ3MpCi0gICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJzUG9ydFR1bmluZykgPT0gOCwgImJhZCBzaXplIik7Ci0gICAgLy8gQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6ICBrSW5kZXggfCB0dW4gfCBwb3J0IHwgaW5wdXQgICAgIChhcmdzKQotICAgIC8vIEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDoga0luZGV4IHwgdHVuIHwgcG9ydCB8IG91dHB1dCAgICAoYXJncykKLSAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpiYXNlSW5kZXggPT0KLSAgICAgICAgICAgICAgICAgIChJOjprRmxleGlibGVGbGFnIHwga1BhcmFtSW5kZXhOdW1iZXJzKSwgImJhZCBpbmRleCIpOwotICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OnR5cGVJbmRleCA9PQotICAgICAgICAgICAgICAgICAgKEk6OmtGbGV4aWJsZUZsYWcgfCBrUGFyYW1JbmRleE51bWJlcnMgfCBJOjprVHlwZVR1bmluZyB8IEk6OmtEaXJJbnB1dCksICJiYWQgaW5kZXgiKTsKLSAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6YmFzZUluZGV4ID09Ci0gICAgICAgICAgICAgICAgICAoSTo6a0ZsZXhpYmxlRmxhZyB8IGtQYXJhbUluZGV4TnVtYmVycyksICJiYWQgaW5kZXgiKTsKLSAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6dHlwZUluZGV4ID09Ci0gICAgICAgICAgICAgICAgICAoSTo6a0ZsZXhpYmxlRmxhZyB8IGtQYXJhbUluZGV4TnVtYmVycyB8IEk6OmtUeXBlVHVuaW5nIHwgSTo6a0Rpck91dHB1dCksICJiYWQgaW5kZXgiKTsKLSAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dCkgPT0gOCwgImJhZCBzaXplIik7Ci0gICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0KSA9PSA4LCAiYmFkIHNpemUiKTsKLSAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOwotICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7Ci0gICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dCwgbS5tTnVtYmVycykgPT0gOCwgImJhZCBvZmZzZXQiKTsKLSAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKLSAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dCwgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKLSAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dCwgbS5tTnVtYmVycykgPT0gOCwgImJhZCBvZmZzZXQiKTsKLQotICAgIC8vIEMyTnVtYmVyc1N0cmVhbVR1bmluZzogICAgICAga0luZGV4IHwgdHVuIHwgc3RyICAgICAgICAgICAgICAoYm9vbCwgdWludCwgYXJncykKLSAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlcnNTdHJlYW1UdW5pbmcpID09IDgsICJiYWQgc2l6ZSIpOwotICAgIC8vIEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQga0luZGV4IHwgdHVuIHwgc3RyIHwgaW5wdXQgICAgICAoaW50LCBhcmdzKQotICAgIC8vIEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0IGtJeCAgIHwgdHVuIHwgc3RyIHwgb3V0cHV0ICAgICAoaW50LCBhcmdzKQotICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6YmFzZUluZGV4ID09Ci0gICAgICAgICAgICAgICAgICAoSTo6a0ZsZXhpYmxlRmxhZyB8IGtQYXJhbUluZGV4TnVtYmVycyksICJiYWQgaW5kZXgiKTsKLSAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OnR5cGVJbmRleCA9PQotICAgICAgICAgICAgICAgICAgKEk6OmtGbGV4aWJsZUZsYWcgfCBrUGFyYW1JbmRleE51bWJlcnMgfCBJOjprVHlwZVR1bmluZyB8IEk6OmtEaXJJbnB1dCB8IEk6OmtTdHJlYW1GbGFnKSwgImJhZCBpbmRleCIpOwotICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OmJhc2VJbmRleCA9PQotICAgICAgICAgICAgICAgICAgKEk6OmtGbGV4aWJsZUZsYWcgfCBrUGFyYW1JbmRleE51bWJlcnMpLCAiYmFkIGluZGV4Iik7Ci0gICAgc3RhdGljX2Fzc2VydChDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6dHlwZUluZGV4ID09Ci0gICAgICAgICAgICAgICAgICAoSTo6a0ZsZXhpYmxlRmxhZyB8IGtQYXJhbUluZGV4TnVtYmVycyB8IEk6OmtUeXBlVHVuaW5nIHwgSTo6a0Rpck91dHB1dCB8IEk6OmtTdHJlYW1GbGFnKSwgImJhZCBpbmRleCIpOwotICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQpID09IDgsICJiYWQgc2l6ZSIpOwotICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0KSA9PSA4LCAiYmFkIHNpemUiKTsKLSAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7Ci0gICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOwotICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dCwgbS5tTnVtYmVycykgPT0gOCwgImJhZCBvZmZzZXQiKTsKLSAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOwotICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7Ci0gICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dCwgbS5tTnVtYmVycykgPT0gOCwgImJhZCBvZmZzZXQiKTsKLX0KLQotVEVTVF9GKEMyUGFyYW1UZXN0LCBQYXJhbU9wc1Rlc3QpIHsKLSAgICBjb25zdCBDMk51bWJlclN0cnVjdCBzdHIoMTAwKTsKLSAgICBDMk51bWJlclN0cnVjdCBic3RyOwotCi0gICAgewotICAgICAgICBFWFBFQ1RfRVEoMTAwLCBzdHIubU51bWJlcik7Ci0gICAgICAgIGJzdHIubU51bWJlciA9IDEwMDsKLQotICAgICAgICBDMlBhcmFtOjpCYXNlSW5kZXggaW5kZXggPSBDMk51bWJlclN0cnVjdDo6YmFzZUluZGV4OwotICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNWZW5kb3IoKSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc0ZsZXhpYmxlKCkpOwotICAgICAgICBFWFBFQ1RfRVEoaW5kZXguYmFzZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKLSAgICAgICAgRVhQRUNUX0VRKGluZGV4LnBhcmFtSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOwotICAgIH0KLQotICAgIGNvbnN0IEMyTnVtYmVyVHVuaW5nIHR1bigxMDApOwotICAgIEMyTnVtYmVyVHVuaW5nIGJ0dW47Ci0KLSAgICB7Ci0gICAgICAgIC8vIGZsYWdzICYgaW52YXJpYWJsZXMKLSAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyB0dW4sIGJ0dW4gfSkgewotICAgICAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpcCk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UoIXApOwotICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC5zaXplKCkpOwotCi0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc1ZlbmRvcigpKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzRmxleGlibGUoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfVFJVRShwLmlzR2xvYmFsKCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9ySW5wdXQoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JPdXRwdXQoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JTdHJlYW0oKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JQb3J0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdmFsdWUKLSAgICAgICAgRVhQRUNUX0VRKDEwMCwgdHVuLm1OdW1iZXIpOwotICAgICAgICBFWFBFQ1RfRVEoMCwgYnR1bi5tTnVtYmVyKTsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKHR1biA9PSBidHVuKTsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKHR1bi5vcGVyYXRvcj09KGJ0dW4pKTsKLSAgICAgICAgRVhQRUNUX1RSVUUodHVuICE9IGJ0dW4pOwotICAgICAgICBFWFBFQ1RfVFJVRSh0dW4ub3BlcmF0b3IhPShidHVuKSk7Ci0gICAgICAgIGJ0dW4ubU51bWJlciA9IDEwMDsKLSAgICAgICAgRVhQRUNUX0VRKHR1biwgYnR1bik7Ci0KLSAgICAgICAgLy8gaW5kZXgKLSAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUodHVuLnR5cGUoKSkuYmFzZUluZGV4KCksIEMyTnVtYmVyU3RydWN0OjpiYXNlSW5kZXgpOwotICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZSh0dW4udHlwZSgpKS5wYXJhbUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKLSAgICAgICAgRVhQRUNUX0VRKHR1bi50eXBlKCksIEMyTnVtYmVyVHVuaW5nOjp0eXBlSW5kZXgpOwotICAgICAgICBFWFBFQ1RfRVEodHVuLnN0cmVhbSgpLCB+MHUpOwotCi0gICAgICAgIEMyUGFyYW06OkJhc2VJbmRleCBpbmRleCA9IEMyTnVtYmVyVHVuaW5nOjpiYXNlSW5kZXg7Ci0gICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc1ZlbmRvcigpKTsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzRmxleGlibGUoKSk7Ci0gICAgICAgIEVYUEVDVF9FUShpbmRleC5iYXNlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOwotICAgICAgICBFWFBFQ1RfRVEoaW5kZXgucGFyYW1JbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7Ci0KLSAgICAgICAgQzJQYXJhbTo6VHlwZSB0eXBlID0gQzJOdW1iZXJUdW5pbmc6OnR5cGVJbmRleDsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNWZW5kb3IoKSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzRmxleGlibGUoKSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuaXNHbG9iYWwoKSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvcklucHV0KCkpOwotICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JPdXRwdXQoKSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvclN0cmVhbSgpKTsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yUG9ydCgpKTsKLQotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJUdW5pbmc6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJUdW5pbmc6OkZyb20oJnR1biksICZ0dW4pOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpGcm9tKCZ0dW4pLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oJnR1biksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20oJnR1biksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OkZyb20oJnR1biksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKCZ0dW4pLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oJnR1biksIG51bGxwdHIpOwotICAgIH0KLQotICAgIGNvbnN0IEMyTnVtYmVyUG9ydFR1bmluZyBvdXRwMSh0cnVlLCAxMDApLCBpbnAxKGZhbHNlLCAxMDApOwotICAgIEMyTnVtYmVyUG9ydFR1bmluZyBib3V0cDEsIGJpbnAxLCBiaW5wMyhmYWxzZSwgMTAwKTsKLSAgICBjb25zdCBDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0IGlucDIoMTAwKTsKLSAgICBDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0IGJpbnAyOwotICAgIGNvbnN0IEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0IG91dHAyKDEwMCk7Ci0gICAgQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQgYm91dHAyOwotCi0gICAgewotICAgICAgICBzdGF0aWNfYXNzZXJ0KGNhbkNhbGxTZXRQb3J0KGJpbnAzKSwgInNob3VsZCBiZSBhYmxlIHRvIik7Ci0gICAgICAgIHN0YXRpY19hc3NlcnQoY2FuQ2FsbFNldFBvcnQoYmlucDEpLCAic2hvdWxkIGJlIGFibGUgdG8iKTsKLSAgICAgICAgc3RhdGljX2Fzc2VydCghY2FuQ2FsbFNldFBvcnQoaW5wMSksICJzaG91bGQgbm90IGJlIGFibGUgdG8gKGNvbnN0KSIpOwotICAgICAgICBzdGF0aWNfYXNzZXJ0KCFjYW5DYWxsU2V0UG9ydChpbnAyKSwgInNob3VsZCBub3QgYmUgYWJsZSB0byAoY29uc3QgJiB0eXBlKSIpOwotICAgICAgICBzdGF0aWNfYXNzZXJ0KCFjYW5DYWxsU2V0UG9ydChiaW5wMiksICJzaG91bGQgbm90IGJlIGFibGUgdG8gKHR5cGUpIik7Ci0KLSAgICAgICAgLy8gZmxhZ3MgJiBpbnZhcmlhYmxlcwotICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IG91dHAxLCBpbnAxLCBib3V0cDEgfSkgewotICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC5zaXplKCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNWZW5kb3IoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc0ZsZXhpYmxlKCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNHbG9iYWwoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JTdHJlYW0oKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfVFJVRShwLmZvclBvcnQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBpbnAyLCBiaW5wMiB9KSB7Ci0gICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLnNpemUoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc1ZlbmRvcigpKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzRmxleGlibGUoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc0dsb2JhbCgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvclN0cmVhbSgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAuZm9yUG9ydCgpKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IG91dHAyLCBib3V0cDIgfSkgewotICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC5zaXplKCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNWZW5kb3IoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc0ZsZXhpYmxlKCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNHbG9iYWwoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JTdHJlYW0oKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfVFJVRShwLmZvclBvcnQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBwb3J0IHNwZWNpZmljIGZsYWdzICYgaW52YXJpYWJsZXMKLSAgICAgICAgRVhQRUNUX0ZBTFNFKG91dHAxLmZvcklucHV0KCkpOwotICAgICAgICBFWFBFQ1RfVFJVRShvdXRwMS5mb3JPdXRwdXQoKSk7Ci0KLSAgICAgICAgRVhQRUNUX1RSVUUoaW5wMS5mb3JJbnB1dCgpKTsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKGlucDEuZm9yT3V0cHV0KCkpOwotCi0gICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgb3V0cDEsIGlucDEgfSkgewotICAgICAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpcCk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UoIXApOwotICAgICAgICAgICAgRVhQRUNUX0VRKDEwMCwgcC5tTnVtYmVyKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IG91dHAyLCBib3V0cDIgfSkgewotICAgICAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpcCk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UoIXApOwotCi0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JJbnB1dCgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAuZm9yT3V0cHV0KCkpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgaW5wMiwgYmlucDIgfSkgewotICAgICAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpcCk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UoIXApOwotCi0gICAgICAgICAgICBFWFBFQ1RfVFJVRShwLmZvcklucHV0KCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yT3V0cHV0KCkpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgYm91dHAxIH0gKSB7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UoKGJvb2wpcCk7Ci0gICAgICAgICAgICBFWFBFQ1RfVFJVRSghcCk7Ci0KLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvcklucHV0KCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yT3V0cHV0KCkpOwotICAgICAgICAgICAgRVhQRUNUX0VRKDAsIHAubU51bWJlcik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB2YWx1ZXMKLSAgICAgICAgRVhQRUNUX0VRKDEwMCwgaW5wMi5tTnVtYmVyKTsKLSAgICAgICAgRVhQRUNUX0VRKDEwMCwgb3V0cDIubU51bWJlcik7Ci0gICAgICAgIEVYUEVDVF9FUSgwLCBiaW5wMS5tTnVtYmVyKTsKLSAgICAgICAgRVhQRUNUX0VRKDAsIGJpbnAyLm1OdW1iZXIpOwotICAgICAgICBFWFBFQ1RfRVEoMCwgYm91dHAxLm1OdW1iZXIpOwotICAgICAgICBFWFBFQ1RfRVEoMCwgYm91dHAyLm1OdW1iZXIpOwotCi0gICAgICAgIEVYUEVDVF9UUlVFKGlucDEgIT0gb3V0cDEpOwotICAgICAgICBFWFBFQ1RfVFJVRShpbnAxID09IGlucDIpOwotICAgICAgICBFWFBFQ1RfVFJVRShvdXRwMSA9PSBvdXRwMik7Ci0gICAgICAgIEVYUEVDVF9UUlVFKGJpbnAxID09IGJvdXRwMSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKGJpbnAyICE9IGJvdXRwMik7Ci0KLSAgICAgICAgRVhQRUNUX1RSVUUoaW5wMSAhPSBiaW5wMSk7Ci0gICAgICAgIGJpbnAxLm1OdW1iZXIgPSAxMDA7Ci0gICAgICAgIEVYUEVDVF9UUlVFKGlucDEgIT0gYmlucDEpOwotICAgICAgICBiaW5wMS5zZXRQb3J0KGZhbHNlIC8qIG91dHB1dCAqLyk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKChib29sKWJpbnAxKTsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKCFiaW5wMSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKGlucDEgPT0gYmlucDEpOwotCi0gICAgICAgIEVYUEVDVF9UUlVFKGlucDIgIT0gYmlucDIpOwotICAgICAgICBiaW5wMi5tTnVtYmVyID0gMTAwOwotICAgICAgICBFWFBFQ1RfVFJVRShpbnAyID09IGJpbnAyKTsKLQotICAgICAgICBiaW5wMS5zZXRQb3J0KHRydWUgLyogb3V0cHV0ICovKTsKLSAgICAgICAgRVhQRUNUX1RSVUUob3V0cDEgPT0gYmlucDEpOwotCi0gICAgICAgIEVYUEVDVF9UUlVFKG91dHAxICE9IGJvdXRwMSk7Ci0gICAgICAgIGJvdXRwMS5tTnVtYmVyID0gMTAwOwotICAgICAgICBFWFBFQ1RfVFJVRShvdXRwMSAhPSBib3V0cDEpOwotICAgICAgICBib3V0cDEuc2V0UG9ydCh0cnVlIC8qIG91dHB1dCAqLyk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKChib29sKWJvdXRwMSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRSghYm91dHAxKTsKLSAgICAgICAgRVhQRUNUX1RSVUUob3V0cDEgPT0gYm91dHAxKTsKLQotICAgICAgICBFWFBFQ1RfVFJVRShvdXRwMiAhPSBib3V0cDIpOwotICAgICAgICBib3V0cDIubU51bWJlciA9IDEwMDsKLSAgICAgICAgRVhQRUNUX1RSVUUob3V0cDIgPT0gYm91dHAyKTsKLQotICAgICAgICBib3V0cDEuc2V0UG9ydChmYWxzZSAvKiBvdXRwdXQgKi8pOwotICAgICAgICBFWFBFQ1RfVFJVRShpbnAxID09IGJvdXRwMSk7Ci0KLSAgICAgICAgLy8gaW5kZXgKLSAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5wMS50eXBlKCkpLmJhc2VJbmRleCgpLCBDMk51bWJlclN0cnVjdDo6YmFzZUluZGV4KTsKLSAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5wMS50eXBlKCkpLnBhcmFtSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOwotICAgICAgICBFWFBFQ1RfRVEoaW5wMS50eXBlKCksIEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OnR5cGVJbmRleCk7Ci0gICAgICAgIEVYUEVDVF9FUShpbnAxLnN0cmVhbSgpLCB+MHUpOwotCi0gICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGlucDIudHlwZSgpKS5iYXNlSW5kZXgoKSwgQzJOdW1iZXJTdHJ1Y3Q6OmJhc2VJbmRleCk7Ci0gICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGlucDIudHlwZSgpKS5wYXJhbUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKLSAgICAgICAgRVhQRUNUX0VRKGlucDIudHlwZSgpLCBDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0Ojp0eXBlSW5kZXgpOwotICAgICAgICBFWFBFQ1RfRVEoaW5wMi5zdHJlYW0oKSwgfjB1KTsKLQotICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRwMS50eXBlKCkpLmJhc2VJbmRleCgpLCBDMk51bWJlclN0cnVjdDo6YmFzZUluZGV4KTsKLSAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0cDEudHlwZSgpKS5wYXJhbUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKLSAgICAgICAgRVhQRUNUX0VRKG91dHAxLnR5cGUoKSwgQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OnR5cGVJbmRleCk7Ci0gICAgICAgIEVYUEVDVF9FUShvdXRwMS5zdHJlYW0oKSwgfjB1KTsKLQotICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRwMi50eXBlKCkpLmJhc2VJbmRleCgpLCBDMk51bWJlclN0cnVjdDo6YmFzZUluZGV4KTsKLSAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0cDIudHlwZSgpKS5wYXJhbUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKLSAgICAgICAgRVhQRUNUX0VRKG91dHAyLnR5cGUoKSwgQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OnR5cGVJbmRleCk7Ci0gICAgICAgIEVYUEVDVF9FUShvdXRwMi5zdHJlYW0oKSwgfjB1KTsKLQotICAgICAgICBDMlBhcmFtOjpCYXNlSW5kZXggaW5kZXggPSBDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0Ojp0eXBlSW5kZXg7Ci0gICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc1ZlbmRvcigpKTsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzRmxleGlibGUoKSk7Ci0gICAgICAgIEVYUEVDVF9FUShpbmRleC5iYXNlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOwotICAgICAgICBFWFBFQ1RfRVEoaW5kZXgucGFyYW1JbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7Ci0KLSAgICAgICAgaW5kZXggPSBDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6dHlwZUluZGV4OwotICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNWZW5kb3IoKSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc0ZsZXhpYmxlKCkpOwotICAgICAgICBFWFBFQ1RfRVEoaW5kZXguYmFzZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKLSAgICAgICAgRVhQRUNUX0VRKGluZGV4LnBhcmFtSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOwotCi0gICAgICAgIEMyUGFyYW06OlR5cGUgdHlwZSA9IEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OnR5cGVJbmRleDsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNWZW5kb3IoKSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzRmxleGlibGUoKSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzR2xvYmFsKCkpOwotICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvcklucHV0KCkpOwotICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JPdXRwdXQoKSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvclN0cmVhbSgpKTsKLSAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JQb3J0KCkpOwotCi0gICAgICAgIHR5cGUgPSBDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6dHlwZUluZGV4OwotICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc1ZlbmRvcigpKTsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNGbGV4aWJsZSgpKTsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNHbG9iYWwoKSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvcklucHV0KCkpOwotICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvck91dHB1dCgpKTsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yU3RyZWFtKCkpOwotICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvclBvcnQoKSk7Ci0KLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6RnJvbShudWxscHRyKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyVHVuaW5nOjpGcm9tKCZpbnAxKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlclR1bmluZzo6RnJvbSgmaW5wMiksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJUdW5pbmc6OkZyb20oJm91dHAxKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlclR1bmluZzo6RnJvbSgmb3V0cDIpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6RnJvbSgmaW5wMSksICZpbnAxKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6RnJvbSgmaW5wMiksIChDMk51bWJlclBvcnRUdW5pbmcqKSZpbnAyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6RnJvbSgmb3V0cDEpLCAmb3V0cDEpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpGcm9tKCZvdXRwMiksIChDMk51bWJlclBvcnRUdW5pbmcqKSZvdXRwMik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpGcm9tKCZpbnAxKSwgKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQqKSZpbnAxKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oJmlucDIpLCAmaW5wMik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpGcm9tKCZvdXRwMSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6RnJvbSgmb3V0cDIpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKCZpbnAxKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6RnJvbSgmaW5wMiksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20oJm91dHAxKSwgKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0Kikmb3V0cDEpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20oJm91dHAyKSwgJm91dHAyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpGcm9tKCZpbnAxKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6RnJvbSgmaW5wMiksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OkZyb20oJm91dHAxKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6RnJvbSgmb3V0cDIpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbSgmaW5wMSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKCZpbnAyKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20oJm91dHAxKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20oJm91dHAyKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKCZpbnAxKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKCZpbnAyKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKCZvdXRwMSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbSgmb3V0cDIpLCBudWxscHRyKTsKLSAgICB9Ci0KLSAgICBjb25zdCBDMk51bWJlclN0cmVhbVR1bmluZyBvdXRzMSh0cnVlLCAxdSwgMTAwKSwgaW5zMShmYWxzZSwgMXUsIDEwMCk7Ci0gICAgQzJOdW1iZXJTdHJlYW1UdW5pbmcgYm91dHMxLCBiaW5zMSwgYmluczMoZmFsc2UsIDF1LCAxMDApOwotICAgIGNvbnN0IEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dCBpbnMyKDF1LCAxMDApOwotICAgIEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dCBiaW5zMjsKLSAgICBjb25zdCBDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0IG91dHMyKDF1LCAxMDApOwotICAgIEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQgYm91dHMyOwotCi0gICAgewotICAgICAgICBzdGF0aWNfYXNzZXJ0KGNhbkNhbGxTZXRQb3J0KGJpbnMzKSwgInNob3VsZCBiZSBhYmxlIHRvIik7Ci0gICAgICAgIHN0YXRpY19hc3NlcnQoY2FuQ2FsbFNldFBvcnQoYmluczEpLCAic2hvdWxkIGJlIGFibGUgdG8iKTsKLSAgICAgICAgc3RhdGljX2Fzc2VydCghY2FuQ2FsbFNldFBvcnQoaW5zMSksICJzaG91bGQgbm90IGJlIGFibGUgdG8gKGNvbnN0KSIpOwotICAgICAgICBzdGF0aWNfYXNzZXJ0KCFjYW5DYWxsU2V0UG9ydChpbnMyKSwgInNob3VsZCBub3QgYmUgYWJsZSB0byAoY29uc3QgJiB0eXBlKSIpOwotICAgICAgICBzdGF0aWNfYXNzZXJ0KCFjYW5DYWxsU2V0UG9ydChiaW5zMiksICJzaG91bGQgbm90IGJlIGFibGUgdG8gKHR5cGUpIik7Ci0KLSAgICAgICAgLy8gZmxhZ3MgJiBpbnZhcmlhYmxlcwotICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IG91dHMxLCBpbnMxLCBib3V0czEgfSkgewotICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC5zaXplKCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNWZW5kb3IoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc0ZsZXhpYmxlKCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNHbG9iYWwoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfVFJVRShwLmZvclN0cmVhbSgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvclBvcnQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBpbnMyLCBiaW5zMiB9KSB7Ci0gICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLnNpemUoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc1ZlbmRvcigpKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzRmxleGlibGUoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc0dsb2JhbCgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAuZm9yU3RyZWFtKCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yUG9ydCgpKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IG91dHMyLCBib3V0czIgfSkgewotICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC5zaXplKCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNWZW5kb3IoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc0ZsZXhpYmxlKCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNHbG9iYWwoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfVFJVRShwLmZvclN0cmVhbSgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvclBvcnQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBwb3J0IHNwZWNpZmljIGZsYWdzICYgaW52YXJpYWJsZXMKLSAgICAgICAgRVhQRUNUX0ZBTFNFKG91dHMxLmZvcklucHV0KCkpOwotICAgICAgICBFWFBFQ1RfVFJVRShvdXRzMS5mb3JPdXRwdXQoKSk7Ci0KLSAgICAgICAgRVhQRUNUX1RSVUUoaW5zMS5mb3JJbnB1dCgpKTsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKGluczEuZm9yT3V0cHV0KCkpOwotCi0gICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgb3V0czEsIGluczEgfSkgewotICAgICAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpcCk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UoIXApOwotICAgICAgICAgICAgRVhQRUNUX0VRKDEwMCwgcC5tTnVtYmVyKTsKLSAgICAgICAgICAgIEVYUEVDVF9FUSgxdSwgcC5zdHJlYW0oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBvdXRzMiwgYm91dHMyIH0pIHsKLSAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKXApOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCFwKTsKLQotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9ySW5wdXQoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfVFJVRShwLmZvck91dHB1dCgpKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IGluczIsIGJpbnMyIH0pIHsKLSAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKXApOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCFwKTsKLQotICAgICAgICAgICAgRVhQRUNUX1RSVUUocC5mb3JJbnB1dCgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvck91dHB1dCgpKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IGJvdXRzMSB9ICkgewotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKChib29sKXApOwotICAgICAgICAgICAgRVhQRUNUX1RSVUUoIXApOwotCi0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JJbnB1dCgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvck91dHB1dCgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9FUSgwLCBwLm1OdW1iZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdmFsdWVzCi0gICAgICAgIEVYUEVDVF9FUSgxMDAsIGluczIubU51bWJlcik7Ci0gICAgICAgIEVYUEVDVF9FUSgxMDAsIG91dHMyLm1OdW1iZXIpOwotICAgICAgICBFWFBFQ1RfRVEoMCwgYmluczEubU51bWJlcik7Ci0gICAgICAgIEVYUEVDVF9FUSgwLCBiaW5zMi5tTnVtYmVyKTsKLSAgICAgICAgRVhQRUNUX0VRKDAsIGJvdXRzMS5tTnVtYmVyKTsKLSAgICAgICAgRVhQRUNUX0VRKDAsIGJvdXRzMi5tTnVtYmVyKTsKLQotICAgICAgICBFWFBFQ1RfRVEoMXUsIGluczIuc3RyZWFtKCkpOwotICAgICAgICBFWFBFQ1RfRVEoMXUsIG91dHMyLnN0cmVhbSgpKTsKLSAgICAgICAgRVhQRUNUX0VRKDB1LCBiaW5zMS5zdHJlYW0oKSk7Ci0gICAgICAgIEVYUEVDVF9FUSgwdSwgYmluczIuc3RyZWFtKCkpOwotICAgICAgICBFWFBFQ1RfRVEoMHUsIGJvdXRzMS5zdHJlYW0oKSk7Ci0gICAgICAgIEVYUEVDVF9FUSgwdSwgYm91dHMyLnN0cmVhbSgpKTsKLQotICAgICAgICBFWFBFQ1RfVFJVRShpbnMxICE9IG91dHMxKTsKLSAgICAgICAgRVhQRUNUX1RSVUUoaW5zMSA9PSBpbnMyKTsKLSAgICAgICAgRVhQRUNUX1RSVUUob3V0czEgPT0gb3V0czIpOwotICAgICAgICBFWFBFQ1RfVFJVRShiaW5zMSA9PSBib3V0czEpOwotICAgICAgICBFWFBFQ1RfVFJVRShiaW5zMiAhPSBib3V0czIpOwotCi0gICAgICAgIEVYUEVDVF9UUlVFKGluczEgIT0gYmluczEpOwotICAgICAgICBiaW5zMS5tTnVtYmVyID0gMTAwOwotICAgICAgICBFWFBFQ1RfVFJVRShpbnMxICE9IGJpbnMxKTsKLSAgICAgICAgYmluczEuc2V0UG9ydChmYWxzZSAvKiBvdXRwdXQgKi8pOwotICAgICAgICBFWFBFQ1RfVFJVRShpbnMxICE9IGJpbnMxKTsKLSAgICAgICAgYmluczEuc2V0U3RyZWFtKDF1KTsKLSAgICAgICAgRVhQRUNUX1RSVUUoaW5zMSA9PSBiaW5zMSk7Ci0KLSAgICAgICAgRVhQRUNUX1RSVUUoaW5zMiAhPSBiaW5zMik7Ci0gICAgICAgIGJpbnMyLm1OdW1iZXIgPSAxMDA7Ci0gICAgICAgIEVYUEVDVF9UUlVFKGluczIgIT0gYmluczIpOwotICAgICAgICBiaW5zMi5zZXRTdHJlYW0oMXUpOwotICAgICAgICBFWFBFQ1RfVFJVRShpbnMyID09IGJpbnMyKTsKLQotICAgICAgICBiaW5zMS5zZXRQb3J0KHRydWUgLyogb3V0cHV0ICovKTsKLSAgICAgICAgRVhQRUNUX1RSVUUob3V0czEgPT0gYmluczEpOwotCi0gICAgICAgIEVYUEVDVF9UUlVFKG91dHMxICE9IGJvdXRzMSk7Ci0gICAgICAgIGJvdXRzMS5tTnVtYmVyID0gMTAwOwotICAgICAgICBFWFBFQ1RfVFJVRShvdXRzMSAhPSBib3V0czEpOwotICAgICAgICBib3V0czEuc2V0UG9ydCh0cnVlIC8qIG91dHB1dCAqLyk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKG91dHMxICE9IGJvdXRzMSk7Ci0gICAgICAgIGJvdXRzMS5zZXRTdHJlYW0oMXUpOwotICAgICAgICBFWFBFQ1RfVFJVRShvdXRzMSA9PSBib3V0czEpOwotCi0gICAgICAgIEVYUEVDVF9UUlVFKG91dHMyICE9IGJvdXRzMik7Ci0gICAgICAgIGJvdXRzMi5tTnVtYmVyID0gMTAwOwotICAgICAgICBFWFBFQ1RfVFJVRShvdXRzMiAhPSBib3V0czIpOwotICAgICAgICBib3V0czIuc2V0U3RyZWFtKDF1KTsKLSAgICAgICAgRVhQRUNUX1RSVUUob3V0czIgPT0gYm91dHMyKTsKLQotICAgICAgICBib3V0czEuc2V0UG9ydChmYWxzZSAvKiBvdXRwdXQgKi8pOwotICAgICAgICBFWFBFQ1RfVFJVRShpbnMxID09IGJvdXRzMSk7Ci0KLSAgICAgICAgLy8gaW5kZXgKLSAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5zMS50eXBlKCkpLmJhc2VJbmRleCgpLCBDMk51bWJlclN0cnVjdDo6YmFzZUluZGV4KTsKLSAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5zMS50eXBlKCkpLnBhcmFtSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOwotICAgICAgICBFWFBFQ1RfRVEoaW5zMS50eXBlKCksIEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6dHlwZUluZGV4KTsKLQotICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShpbnMyLnR5cGUoKSkuYmFzZUluZGV4KCksIEMyTnVtYmVyU3RydWN0OjpiYXNlSW5kZXgpOwotICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShpbnMyLnR5cGUoKSkucGFyYW1JbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7Ci0gICAgICAgIEVYUEVDVF9FUShpbnMyLnR5cGUoKSwgQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0Ojp0eXBlSW5kZXgpOwotCi0gICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHMxLnR5cGUoKSkuYmFzZUluZGV4KCksIEMyTnVtYmVyU3RydWN0OjpiYXNlSW5kZXgpOwotICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRzMS50eXBlKCkpLnBhcmFtSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOwotICAgICAgICBFWFBFQ1RfRVEob3V0czEudHlwZSgpLCBDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0Ojp0eXBlSW5kZXgpOwotCi0gICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHMyLnR5cGUoKSkuYmFzZUluZGV4KCksIEMyTnVtYmVyU3RydWN0OjpiYXNlSW5kZXgpOwotICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRzMi50eXBlKCkpLnBhcmFtSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOwotICAgICAgICBFWFBFQ1RfRVEob3V0czIudHlwZSgpLCBDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0Ojp0eXBlSW5kZXgpOwotCi0gICAgICAgIEMyUGFyYW06OkJhc2VJbmRleCBpbmRleCA9IEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6dHlwZUluZGV4OwotICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNWZW5kb3IoKSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc0ZsZXhpYmxlKCkpOwotICAgICAgICBFWFBFQ1RfRVEoaW5kZXguYmFzZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKLSAgICAgICAgRVhQRUNUX0VRKGluZGV4LnBhcmFtSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOwotCi0gICAgICAgIGluZGV4ID0gQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6dHlwZUluZGV4OwotICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNWZW5kb3IoKSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc0ZsZXhpYmxlKCkpOwotICAgICAgICBFWFBFQ1RfRVEoaW5kZXguYmFzZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKLSAgICAgICAgRVhQRUNUX0VRKGluZGV4LnBhcmFtSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOwotCi0gICAgICAgIEMyUGFyYW06OlR5cGUgdHlwZSA9IEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6dHlwZUluZGV4OwotICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc1ZlbmRvcigpKTsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNGbGV4aWJsZSgpKTsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNHbG9iYWwoKSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9ySW5wdXQoKSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvck91dHB1dCgpKTsKLSAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JTdHJlYW0oKSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvclBvcnQoKSk7Ci0KLSAgICAgICAgdHlwZSA9IEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OnR5cGVJbmRleDsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNWZW5kb3IoKSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzRmxleGlibGUoKSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzR2xvYmFsKCkpOwotICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JJbnB1dCgpKTsKLSAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JPdXRwdXQoKSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9yU3RyZWFtKCkpOwotICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JQb3J0KCkpOwotCi0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6RnJvbShudWxscHRyKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6RnJvbShudWxscHRyKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlclR1bmluZzo6RnJvbSgmaW5zMSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJUdW5pbmc6OkZyb20oJmluczIpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyVHVuaW5nOjpGcm9tKCZvdXRzMSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJUdW5pbmc6OkZyb20oJm91dHMyKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OkZyb20oJmluczEpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6RnJvbSgmaW5zMiksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpGcm9tKCZvdXRzMSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpGcm9tKCZvdXRzMiksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6RnJvbSgmaW5zMSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6RnJvbSgmaW5zMiksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6RnJvbSgmb3V0czEpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oJm91dHMyKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6RnJvbSgmaW5zMSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20oJmluczIpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKCZvdXRzMSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20oJm91dHMyKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6RnJvbSgmaW5zMSksICZpbnMxKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpGcm9tKCZpbnMyKSwgKEMyTnVtYmVyU3RyZWFtVHVuaW5nKikmaW5zMik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6RnJvbSgmb3V0czEpLCAmb3V0czEpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OkZyb20oJm91dHMyKSwgKEMyTnVtYmVyU3RyZWFtVHVuaW5nKikmb3V0czIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKCZpbnMxKSwgKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dCopJmluczEpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKCZpbnMyKSwgJmluczIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKCZvdXRzMSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKCZvdXRzMiksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbSgmaW5zMSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbSgmaW5zMiksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbSgmb3V0czEpLCAoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dCopJm91dHMxKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oJm91dHMyKSwgJm91dHMyKTsKLQotICAgIH0KLQotICAgIHsKLSAgICAgICAgdWludDMyX3QgdmlkZW9XaWR0aFtdID0geyAxMnUsIEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OnR5cGVJbmRleCwgMTAwIH07Ci0gICAgICAgIEMyUGFyYW0gKnAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCBzaXplb2YodmlkZW9XaWR0aCkpOwotICAgICAgICBFWFBFQ1RfTkUocDEsIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwMS0+c2l6ZSgpKTsKLSAgICAgICAgRVhQRUNUX0VRKHAxLT50eXBlKCksIEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OnR5cGVJbmRleCk7Ci0KLSAgICAgICAgcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIHNpemVvZih2aWRlb1dpZHRoKSArIDIpOwotICAgICAgICBFWFBFQ1RfRVEocDEsIG51bGxwdHIpOwotCi0gICAgICAgIHAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCBzaXplb2YodmlkZW9XaWR0aCkgLSAyKTsKLSAgICAgICAgRVhQRUNUX0VRKHAxLCBudWxscHRyKTsKLQotICAgICAgICBwMSA9IEMyUGFyYW06OkZyb20odmlkZW9XaWR0aCwgMyk7Ci0gICAgICAgIEVYUEVDVF9FUShwMSwgbnVsbHB0cik7Ci0KLSAgICAgICAgcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIDApOwotICAgICAgICBFWFBFQ1RfRVEocDEsIG51bGxwdHIpOwotICAgIH0KLX0KLQotdm9pZCBTdGF0aWNUZXN0QWRkQmFzZUluZGV4KCkgewotICAgIHN0cnVjdCBub2Jhc2Uge307Ci0gICAgc3RydWN0IGJhc2UgeyBlbnVtIDogdWludDMyX3QgeyBiYXNlSW5kZXggPSAxIH07IH07Ci0gICAgc3RhdGljX2Fzc2VydChDMkFkZEJhc2VJbmRleDxub2Jhc2UsIDI+OjpiYXNlSW5kZXggPT0gMiwgInNob3VsZCBiZSAyIik7Ci0gICAgc3RhdGljX2Fzc2VydChDMkFkZEJhc2VJbmRleDxiYXNlLCAxPjo6YmFzZUluZGV4ID09IDEsICJzaG91bGQgYmUgMSIpOwotfQotCi1jbGFzcyBUZXN0RmxleEhlbHBlciB7Ci0gICAgc3RydWN0IF9GbGV4IHsKLSAgICAgICAgaW50MzJfdCBhOwotICAgICAgICBjaGFyIGJbXTsKLSAgICAgICAgX0ZsZXgoKSB7fQotICAgICAgICBGTEVYKF9GbGV4LCBiKTsKLSAgICB9OwotCi0gICAgc3RydWN0IF9Cb0ZsZXggewotICAgICAgICBfRmxleCBhOwotICAgICAgICBfQm9GbGV4KCkge30KLSAgICAgICAgRkxFWChfQm9GbGV4LCBhKTsKLSAgICB9OwotCi0gICAgc3RydWN0IF9Ob25GbGV4IHsKLSAgICB9OwotCi0KLSAgICBzdGF0aWMgdm9pZCBTdGF0aWNUZXN0KCkgewotICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxfQzJGbGV4SGVscGVyPGNoYXI+OjpmbGV4VHlwZSwgdm9pZD46OnZhbHVlLCAic2hvdWxkIGJlIHZvaWQiKTsKLSAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8X0MyRmxleEhlbHBlcjxjaGFyW10+OjpmbGV4VHlwZSwgY2hhcj46OnZhbHVlLCAic2hvdWxkIGJlIGNoYXIiKTsKLSAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8X0MyRmxleEhlbHBlcjxfRmxleD46OmZsZXhUeXBlLCBjaGFyPjo6dmFsdWUsICJzaG91bGQgYmUgY2hhciIpOwotCi0gICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPF9DMkZsZXhIZWxwZXI8X0JvRmxleD46OmZsZXhUeXBlLCBjaGFyPjo6dmFsdWUsICJzaG91bGQgYmUgdm9pZCIpOwotCi0gICAgICAgIHN0YXRpY19hc3NlcnQoX0MyRmxleGlibGU8X0ZsZXg+Ojp2YWx1ZSwgInNob3VsZCBiZSBmbGV4aWJsZSIpOwotICAgICAgICBzdGF0aWNfYXNzZXJ0KCFfQzJGbGV4aWJsZTxfTm9uRmxleD46OnZhbHVlLCAic2hvdWxkIG5vdCBiZSBmbGV4aWJsZSIpOwotICAgIH0KLX07Ci0KLVRFU1RfRihDMlBhcmFtVGVzdCwgRmxleFBhcmFtT3BzVGVzdCkgewotLy8gICAgY29uc3QgQzJOdW1iZXJzU3RydWN0IHN0cnsxMDB9OwotICAgIEMyTnVtYmVyc1N0cnVjdCBic3RyOwotICAgIHsKLS8vICAgICAgICBFWFBFQ1RfRVEoMTAwLCBzdHItPm0ubU51bWJlcnNbMF0pOwotICAgICAgICAodm9pZCkmYnN0ci5tTnVtYmVyc1swXTsKLQotICAgICAgICBDMlBhcmFtOjpCYXNlSW5kZXggaW5kZXggPSBDMk51bWJlcnNTdHJ1Y3Q6OmJhc2VJbmRleDsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzVmVuZG9yKCkpOwotICAgICAgICBFWFBFQ1RfVFJVRShpbmRleC5pc0ZsZXhpYmxlKCkpOwotICAgICAgICBFWFBFQ1RfRVEoaW5kZXguYmFzZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyB8IEMyUGFyYW06OkJhc2VJbmRleDo6X2tGbGV4aWJsZUZsYWcpOwotICAgICAgICBFWFBFQ1RfRVEoaW5kZXgucGFyYW1JbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOwotICAgIH0KLQotICAgIHN0ZDo6dW5pcXVlX3B0cjxDMk51bWJlcnNUdW5pbmc+IHR1bl8gPSBDMk51bWJlcnNUdW5pbmc6OmFsbG9jX3VuaXF1ZSgxKTsKLSAgICB0dW5fLT5tLm1OdW1iZXJzWzBdID0gMTAwOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMk51bWJlcnNUdW5pbmc+IHR1biA9IHN0ZDo6bW92ZSh0dW5fKTsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8QzJOdW1iZXJzVHVuaW5nPiBidHVuID0gQzJOdW1iZXJzVHVuaW5nOjphbGxvY19zaGFyZWQoMSk7Ci0KLSAgICB7Ci0gICAgICAgIC8vIGZsYWdzICYgaW52YXJpYWJsZXMKLSAgICAgICAgY29uc3QgQzJOdW1iZXJzVHVuaW5nICpUW10gPSB7IHR1bi5nZXQoKSwgYnR1bi5nZXQoKSB9OwotICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcCA6IFQpIHsKLSAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKSgqcCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCEoKnApKTsKLSAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAtPnNpemUoKSk7Ci0KLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc1ZlbmRvcigpKTsKLSAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmlzRmxleGlibGUoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5pc0dsb2JhbCgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JJbnB1dCgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JPdXRwdXQoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yU3RyZWFtKCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvclBvcnQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB2YWx1ZQotICAgICAgICBFWFBFQ1RfRVEoMTAwLCB0dW4tPm0ubU51bWJlcnNbMF0pOwotICAgICAgICBFWFBFQ1RfRVEoMCwgYnR1bi0+bS5tTnVtYmVyc1swXSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRSgqdHVuID09ICpidHVuKTsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKHR1bi0+b3BlcmF0b3I9PSgqYnR1bikpOwotICAgICAgICBFWFBFQ1RfVFJVRSgqdHVuICE9ICpidHVuKTsKLSAgICAgICAgRVhQRUNUX1RSVUUodHVuLT5vcGVyYXRvciE9KCpidHVuKSk7Ci0gICAgICAgIGJ0dW4tPm0ubU51bWJlcnNbMF0gPSAxMDA7Ci0gICAgICAgIEVYUEVDVF9FUSgqdHVuLCAqYnR1bik7Ci0KLSAgICAgICAgLy8gaW5kZXgKLSAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUodHVuLT50eXBlKCkpLmJhc2VJbmRleCgpLCBDMk51bWJlcnNTdHJ1Y3Q6OmJhc2VJbmRleCk7Ci0gICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKHR1bi0+dHlwZSgpKS5wYXJhbUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7Ci0gICAgICAgIEVYUEVDVF9FUSh0dW4tPnR5cGUoKSwgQzJOdW1iZXJzVHVuaW5nOjp0eXBlSW5kZXgpOwotICAgICAgICBFWFBFQ1RfRVEodHVuLT5zdHJlYW0oKSwgfjB1KTsKLQotICAgICAgICBDMlBhcmFtOjpCYXNlSW5kZXggaW5kZXggPSBDMk51bWJlcnNUdW5pbmc6OmJhc2VJbmRleDsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzVmVuZG9yKCkpOwotICAgICAgICBFWFBFQ1RfVFJVRShpbmRleC5pc0ZsZXhpYmxlKCkpOwotICAgICAgICBFWFBFQ1RfRVEoaW5kZXguYmFzZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyB8IEMyUGFyYW06OkJhc2VJbmRleDo6X2tGbGV4aWJsZUZsYWcpOwotICAgICAgICBFWFBFQ1RfRVEoaW5kZXgucGFyYW1JbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOwotCi0gICAgICAgIEMyUGFyYW06OlR5cGUgdHlwZSA9IEMyTnVtYmVyc1R1bmluZzo6dHlwZUluZGV4OwotICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc1ZlbmRvcigpKTsKLSAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5pc0ZsZXhpYmxlKCkpOwotICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmlzR2xvYmFsKCkpOwotICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JJbnB1dCgpKTsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yT3V0cHV0KCkpOwotICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JTdHJlYW0oKSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvclBvcnQoKSk7Ci0KLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1R1bmluZzo6RnJvbShudWxscHRyKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNUdW5pbmc6OkZyb20odHVuLmdldCgpKSwgdHVuLmdldCgpKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OkZyb20odHVuLmdldCgpKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6RnJvbSh0dW4uZ2V0KCkpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6RnJvbSh0dW4uZ2V0KCkpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6RnJvbSh0dW4uZ2V0KCkpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20odHVuLmdldCgpKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbSh0dW4uZ2V0KCkpLCBudWxscHRyKTsKLSAgICB9Ci0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJOdW1iZXJzUG9ydFR1bmluZz4gb3V0cDFfKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmFsbG9jX3VuaXF1ZSgxLCB0cnVlKSksCi0gICAgICAgICAgICBpbnAxXyA9IEMyTnVtYmVyc1BvcnRUdW5pbmc6OmFsbG9jX3VuaXF1ZSgxLCBmYWxzZSk7Ci0gICAgb3V0cDFfLT5tLm1OdW1iZXJzWzBdID0gMTAwOwotICAgIGlucDFfLT5tLm1OdW1iZXJzWzBdID0gMTAwOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMk51bWJlcnNQb3J0VHVuaW5nPiBvdXRwMSA9IHN0ZDo6bW92ZShvdXRwMV8pOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMk51bWJlcnNQb3J0VHVuaW5nPiBpbnAxID0gc3RkOjptb3ZlKGlucDFfKTsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8QzJOdW1iZXJzUG9ydFR1bmluZz4gYm91dHAxKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmFsbG9jX3NoYXJlZCgxKSksCi0gICAgICAgICAgICBiaW5wMSA9IEMyTnVtYmVyc1BvcnRUdW5pbmc6OmFsbG9jX3NoYXJlZCgxKSwKLSAgICAgICAgICAgIGJpbnAzID0gQzJOdW1iZXJzUG9ydFR1bmluZzo6YWxsb2Nfc2hhcmVkKDEsIGZhbHNlKTsKLSAgICBiaW5wMy0+bS5tTnVtYmVyc1swXSA9IDEwMDsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ+IGlucDJfKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjphbGxvY191bmlxdWUoMSkpOwotICAgIGlucDJfLT5tLm1OdW1iZXJzWzBdID0gMTAwOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dD4gaW5wMiA9IHN0ZDo6bW92ZShpbnAyXyk7Ci0gICAgc3RkOjpzaGFyZWRfcHRyPEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0PiBiaW5wMihDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6YWxsb2Nfc2hhcmVkKDEpKTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0PiBvdXRwMl8oQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjphbGxvY191bmlxdWUoMSkpOwotICAgIG91dHAyXy0+bS5tTnVtYmVyc1swXSA9IDEwMDsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0PiBvdXRwMiA9IHN0ZDo6bW92ZShvdXRwMl8pOwotICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ+IGJvdXRwMihDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OmFsbG9jX3NoYXJlZCgxKSk7Ci0KLSAgICB7Ci0gICAgICAgIHN0YXRpY19hc3NlcnQoY2FuQ2FsbFNldFBvcnQoKmJpbnAzKSwgInNob3VsZCBiZSBhYmxlIHRvIik7Ci0gICAgICAgIHN0YXRpY19hc3NlcnQoY2FuQ2FsbFNldFBvcnQoKmJpbnAxKSwgInNob3VsZCBiZSBhYmxlIHRvIik7Ci0gICAgICAgIHN0YXRpY19hc3NlcnQoIWNhbkNhbGxTZXRQb3J0KCppbnAxKSwgInNob3VsZCBub3QgYmUgYWJsZSB0byAoY29uc3QpIik7Ci0gICAgICAgIHN0YXRpY19hc3NlcnQoIWNhbkNhbGxTZXRQb3J0KCppbnAyKSwgInNob3VsZCBub3QgYmUgYWJsZSB0byAoY29uc3QgJiB0eXBlKSIpOwotICAgICAgICBzdGF0aWNfYXNzZXJ0KCFjYW5DYWxsU2V0UG9ydCgqYmlucDIpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvICh0eXBlKSIpOwotCi0gICAgICAgIC8vIGZsYWdzICYgaW52YXJpYWJsZXMKLSAgICAgICAgY29uc3QgQzJOdW1iZXJzUG9ydFR1bmluZyAqUFtdID0geyBvdXRwMS5nZXQoKSwgaW5wMS5nZXQoKSwgYm91dHAxLmdldCgpIH07Ci0gICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogUCkgewotICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC0+c2l6ZSgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc1ZlbmRvcigpKTsKLSAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmlzRmxleGlibGUoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+aXNHbG9iYWwoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yU3RyZWFtKCkpOwotICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+Zm9yUG9ydCgpKTsKLSAgICAgICAgfQotICAgICAgICBjb25zdCBDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dCAqUElbXSA9IHsgaW5wMi5nZXQoKSwgYmlucDIuZ2V0KCkgfTsKLSAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBQSSkgewotICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC0+c2l6ZSgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc1ZlbmRvcigpKTsKLSAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmlzRmxleGlibGUoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+aXNHbG9iYWwoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yU3RyZWFtKCkpOwotICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+Zm9yUG9ydCgpKTsKLSAgICAgICAgfQotICAgICAgICBjb25zdCBDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQgKlBPW10gPSB7IG91dHAyLmdldCgpLCBib3V0cDIuZ2V0KCkgfTsKLSAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBQTykgewotICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC0+c2l6ZSgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc1ZlbmRvcigpKTsKLSAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmlzRmxleGlibGUoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+aXNHbG9iYWwoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yU3RyZWFtKCkpOwotICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+Zm9yUG9ydCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHBvcnQgc3BlY2lmaWMgZmxhZ3MgJiBpbnZhcmlhYmxlcwotICAgICAgICBFWFBFQ1RfRkFMU0Uob3V0cDEtPmZvcklucHV0KCkpOwotICAgICAgICBFWFBFQ1RfVFJVRShvdXRwMS0+Zm9yT3V0cHV0KCkpOwotCi0gICAgICAgIEVYUEVDVF9UUlVFKGlucDEtPmZvcklucHV0KCkpOwotICAgICAgICBFWFBFQ1RfRkFMU0UoaW5wMS0+Zm9yT3V0cHV0KCkpOwotCi0gICAgICAgIGNvbnN0IEMyTnVtYmVyc1BvcnRUdW5pbmcgKlAyW10gPSB7IG91dHAxLmdldCgpLCBpbnAxLmdldCgpIH07Ci0gICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogUDIpIHsKLSAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKSgqcCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCEoKnApKTsKLSAgICAgICAgICAgIEVYUEVDVF9FUSgxMDAsIHAtPm0ubU51bWJlcnNbMF0pOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogUE8pIHsKLSAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKSgqcCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCEoKnApKTsKLQotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvcklucHV0KCkpOwotICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+Zm9yT3V0cHV0KCkpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogUEkpIHsKLSAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKSgqcCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCEoKnApKTsKLQotICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+Zm9ySW5wdXQoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yT3V0cHV0KCkpOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IEMyTnVtYmVyc1BvcnRUdW5pbmcgKlAzW10gPSB7IGJvdXRwMS5nZXQoKSB9OwotICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcCA6IFAzKSB7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UoKGJvb2wpKCpwKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfVFJVRSghKCpwKSk7Ci0KLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JJbnB1dCgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JPdXRwdXQoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRVEoMCwgcC0+bS5tTnVtYmVyc1swXSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB2YWx1ZXMKLSAgICAgICAgRVhQRUNUX0VRKDEwMCwgaW5wMi0+bS5tTnVtYmVyc1swXSk7Ci0gICAgICAgIEVYUEVDVF9FUSgxMDAsIG91dHAyLT5tLm1OdW1iZXJzWzBdKTsKLSAgICAgICAgRVhQRUNUX0VRKDAsIGJpbnAxLT5tLm1OdW1iZXJzWzBdKTsKLSAgICAgICAgRVhQRUNUX0VRKDAsIGJpbnAyLT5tLm1OdW1iZXJzWzBdKTsKLSAgICAgICAgRVhQRUNUX0VRKDAsIGJvdXRwMS0+bS5tTnVtYmVyc1swXSk7Ci0gICAgICAgIEVYUEVDVF9FUSgwLCBib3V0cDItPm0ubU51bWJlcnNbMF0pOwotCi0gICAgICAgIEVYUEVDVF9UUlVFKCppbnAxICE9ICpvdXRwMSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKCppbnAxID09ICppbnAyKTsKLSAgICAgICAgRVhQRUNUX1RSVUUoKm91dHAxID09ICpvdXRwMik7Ci0gICAgICAgIEVYUEVDVF9UUlVFKCpiaW5wMSA9PSAqYm91dHAxKTsKLSAgICAgICAgRVhQRUNUX1RSVUUoKmJpbnAyICE9ICpib3V0cDIpOwotCi0gICAgICAgIEVYUEVDVF9UUlVFKCppbnAxICE9ICpiaW5wMSk7Ci0gICAgICAgIGJpbnAxLT5tLm1OdW1iZXJzWzBdID0gMTAwOwotICAgICAgICBFWFBFQ1RfVFJVRSgqaW5wMSAhPSAqYmlucDEpOwotICAgICAgICBiaW5wMS0+c2V0UG9ydChmYWxzZSAvKiBvdXRwdXQgKi8pOwotICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbCkqYmlucDEpOwotICAgICAgICBFWFBFQ1RfRkFMU0UoISpiaW5wMSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKCppbnAxID09ICpiaW5wMSk7Ci0KLSAgICAgICAgRVhQRUNUX1RSVUUoKmlucDIgIT0gKmJpbnAyKTsKLSAgICAgICAgYmlucDItPm0ubU51bWJlcnNbMF0gPSAxMDA7Ci0gICAgICAgIEVYUEVDVF9UUlVFKCppbnAyID09ICpiaW5wMik7Ci0KLSAgICAgICAgYmlucDEtPnNldFBvcnQodHJ1ZSAvKiBvdXRwdXQgKi8pOwotICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0cDEgPT0gKmJpbnAxKTsKLQotICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0cDEgIT0gKmJvdXRwMSk7Ci0gICAgICAgIGJvdXRwMS0+bS5tTnVtYmVyc1swXSA9IDEwMDsKLSAgICAgICAgRVhQRUNUX1RSVUUoKm91dHAxICE9ICpib3V0cDEpOwotICAgICAgICBib3V0cDEtPnNldFBvcnQodHJ1ZSAvKiBvdXRwdXQgKi8pOwotICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbCkqYm91dHAxKTsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKCEqYm91dHAxKTsKLSAgICAgICAgRVhQRUNUX1RSVUUoKm91dHAxID09ICpib3V0cDEpOwotCi0gICAgICAgIEVYUEVDVF9UUlVFKCpvdXRwMiAhPSAqYm91dHAyKTsKLSAgICAgICAgYm91dHAyLT5tLm1OdW1iZXJzWzBdID0gMTAwOwotICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0cDIgPT0gKmJvdXRwMik7Ci0KLSAgICAgICAgYm91dHAxLT5zZXRQb3J0KGZhbHNlIC8qIG91dHB1dCAqLyk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKCppbnAxID09ICpib3V0cDEpOwotCi0gICAgICAgIC8vIGluZGV4Ci0gICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGlucDEtPnR5cGUoKSkuYmFzZUluZGV4KCksIEMyTnVtYmVyc1N0cnVjdDo6YmFzZUluZGV4KTsKLSAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5wMS0+dHlwZSgpKS5wYXJhbUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7Ci0gICAgICAgIEVYUEVDVF9FUShpbnAxLT50eXBlKCksIEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0Ojp0eXBlSW5kZXgpOwotICAgICAgICBFWFBFQ1RfRVEoaW5wMS0+c3RyZWFtKCksIH4wdSk7Ci0KLSAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5wMi0+dHlwZSgpKS5iYXNlSW5kZXgoKSwgQzJOdW1iZXJzU3RydWN0OjpiYXNlSW5kZXgpOwotICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShpbnAyLT50eXBlKCkpLnBhcmFtSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKLSAgICAgICAgRVhQRUNUX0VRKGlucDItPnR5cGUoKSwgQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OnR5cGVJbmRleCk7Ci0gICAgICAgIEVYUEVDVF9FUShpbnAyLT5zdHJlYW0oKSwgfjB1KTsKLQotICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRwMS0+dHlwZSgpKS5iYXNlSW5kZXgoKSwgQzJOdW1iZXJzU3RydWN0OjpiYXNlSW5kZXgpOwotICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRwMS0+dHlwZSgpKS5wYXJhbUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7Ci0gICAgICAgIEVYUEVDVF9FUShvdXRwMS0+dHlwZSgpLCBDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OnR5cGVJbmRleCk7Ci0gICAgICAgIEVYUEVDVF9FUShvdXRwMS0+c3RyZWFtKCksIH4wdSk7Ci0KLSAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0cDItPnR5cGUoKSkuYmFzZUluZGV4KCksIEMyTnVtYmVyc1N0cnVjdDo6YmFzZUluZGV4KTsKLSAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0cDItPnR5cGUoKSkucGFyYW1JbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOwotICAgICAgICBFWFBFQ1RfRVEob3V0cDItPnR5cGUoKSwgQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0Ojp0eXBlSW5kZXgpOwotICAgICAgICBFWFBFQ1RfRVEob3V0cDItPnN0cmVhbSgpLCB+MHUpOwotCi0gICAgICAgIEMyUGFyYW06OkJhc2VJbmRleCBpbmRleCA9IEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0Ojp0eXBlSW5kZXg7Ci0gICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc1ZlbmRvcigpKTsKLSAgICAgICAgRVhQRUNUX1RSVUUoaW5kZXguaXNGbGV4aWJsZSgpKTsKLSAgICAgICAgRVhQRUNUX0VRKGluZGV4LmJhc2VJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMgfCBDMlBhcmFtOjpCYXNlSW5kZXg6Ol9rRmxleGlibGVGbGFnKTsKLSAgICAgICAgRVhQRUNUX0VRKGluZGV4LnBhcmFtSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKLQotICAgICAgICBpbmRleCA9IEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6dHlwZUluZGV4OwotICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNWZW5kb3IoKSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKGluZGV4LmlzRmxleGlibGUoKSk7Ci0gICAgICAgIEVYUEVDVF9FUShpbmRleC5iYXNlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzIHwgQzJQYXJhbTo6QmFzZUluZGV4Ojpfa0ZsZXhpYmxlRmxhZyk7Ci0gICAgICAgIEVYUEVDVF9FUShpbmRleC5wYXJhbUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7Ci0KLSAgICAgICAgQzJQYXJhbTo6VHlwZSB0eXBlID0gQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OnR5cGVJbmRleDsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNWZW5kb3IoKSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuaXNGbGV4aWJsZSgpKTsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNHbG9iYWwoKSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9ySW5wdXQoKSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvck91dHB1dCgpKTsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yU3RyZWFtKCkpOwotICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvclBvcnQoKSk7Ci0KLSAgICAgICAgdHlwZSA9IEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6dHlwZUluZGV4OwotICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc1ZlbmRvcigpKTsKLSAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5pc0ZsZXhpYmxlKCkpOwotICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc0dsb2JhbCgpKTsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9ySW5wdXQoKSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9yT3V0cHV0KCkpOwotICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JTdHJlYW0oKSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9yUG9ydCgpKTsKLQotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6RnJvbShudWxscHRyKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6RnJvbShudWxscHRyKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzVHVuaW5nOjpGcm9tKGlucDEuZ2V0KCkpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1R1bmluZzo6RnJvbShpbnAyLmdldCgpKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNUdW5pbmc6OkZyb20ob3V0cDEuZ2V0KCkpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1R1bmluZzo6RnJvbShvdXRwMi5nZXQoKSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6RnJvbShpbnAxLmdldCgpKSwgaW5wMS5nZXQoKSk7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpGcm9tKGlucDIuZ2V0KCkpLCAoQzJOdW1iZXJzUG9ydFR1bmluZyopaW5wMi5nZXQoKSk7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpGcm9tKG91dHAxLmdldCgpKSwgb3V0cDEuZ2V0KCkpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6RnJvbShvdXRwMi5nZXQoKSksIChDMk51bWJlcnNQb3J0VHVuaW5nKilvdXRwMi5nZXQoKSk7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6RnJvbShpbnAxLmdldCgpKSwgKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0KilpbnAxLmdldCgpKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpGcm9tKGlucDIuZ2V0KCkpLCBpbnAyLmdldCgpKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpGcm9tKG91dHAxLmdldCgpKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6RnJvbShvdXRwMi5nZXQoKSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKGlucDEuZ2V0KCkpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6RnJvbShpbnAyLmdldCgpKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20ob3V0cDEuZ2V0KCkpLCAoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0KilvdXRwMS5nZXQoKSk7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20ob3V0cDIuZ2V0KCkpLCBvdXRwMi5nZXQoKSk7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkZyb20oaW5wMS5nZXQoKSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpGcm9tKGlucDIuZ2V0KCkpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6RnJvbShvdXRwMS5nZXQoKSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpGcm9tKG91dHAyLmdldCgpKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKGlucDEuZ2V0KCkpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20oaW5wMi5nZXQoKSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbShvdXRwMS5nZXQoKSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbShvdXRwMi5nZXQoKSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oaW5wMS5nZXQoKSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oaW5wMi5nZXQoKSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20ob3V0cDEuZ2V0KCkpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKG91dHAyLmdldCgpKSwgbnVsbHB0cik7Ci0KLSAgICB9Ci0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJOdW1iZXJzU3RyZWFtVHVuaW5nPiBvdXRzMV8oQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjphbGxvY191bmlxdWUoMSwgdHJ1ZSwgMXUpKTsKLSAgICBvdXRzMV8tPm0ubU51bWJlcnNbMF0gPSAxMDA7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyTnVtYmVyc1N0cmVhbVR1bmluZz4gb3V0czEgPSBzdGQ6Om1vdmUob3V0czFfKTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJOdW1iZXJzU3RyZWFtVHVuaW5nPiBpbnMxXyhDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmFsbG9jX3VuaXF1ZSgxLCBmYWxzZSwgMXUpKTsKLSAgICBpbnMxXy0+bS5tTnVtYmVyc1swXSA9IDEwMDsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJOdW1iZXJzU3RyZWFtVHVuaW5nPiBpbnMxID0gc3RkOjptb3ZlKGluczFfKTsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8QzJOdW1iZXJzU3RyZWFtVHVuaW5nPiBib3V0czEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjphbGxvY19zaGFyZWQoMSkpOwotICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk51bWJlcnNTdHJlYW1UdW5pbmc+IGJpbnMxKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6YWxsb2Nfc2hhcmVkKDEpKTsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8QzJOdW1iZXJzU3RyZWFtVHVuaW5nPiBiaW5zMyhDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmFsbG9jX3NoYXJlZCgxLCBmYWxzZSwgMXUpKTsKLSAgICBiaW5zMy0+bS5tTnVtYmVyc1swXSA9IDEwMDsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dD4gaW5zMl8oQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6YWxsb2NfdW5pcXVlKDEsIDF1KSk7Ci0gICAgaW5zMl8tPm0ubU51bWJlcnNbMF0gPSAxMDA7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ+IGluczIgPSBzdGQ6Om1vdmUoaW5zMl8pOwotICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0PiBiaW5zMihDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjphbGxvY19zaGFyZWQoMSkpOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dD4gb3V0czJfKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjphbGxvY191bmlxdWUoMSwgMXUpKTsKLSAgICBvdXRzMl8tPm0ubU51bWJlcnNbMF0gPSAxMDA7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0PiBvdXRzMiA9IHN0ZDo6bW92ZShvdXRzMl8pOwotICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dD4gYm91dHMyKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjphbGxvY19zaGFyZWQoMSkpOwotCi0gICAgewotICAgICAgICBzdGF0aWNfYXNzZXJ0KGNhbkNhbGxTZXRQb3J0KCpiaW5zMyksICJzaG91bGQgYmUgYWJsZSB0byIpOwotICAgICAgICBzdGF0aWNfYXNzZXJ0KGNhbkNhbGxTZXRQb3J0KCpiaW5zMSksICJzaG91bGQgYmUgYWJsZSB0byIpOwotICAgICAgICBzdGF0aWNfYXNzZXJ0KCFjYW5DYWxsU2V0UG9ydCgqaW5zMSksICJzaG91bGQgbm90IGJlIGFibGUgdG8gKGNvbnN0KSIpOwotICAgICAgICBzdGF0aWNfYXNzZXJ0KCFjYW5DYWxsU2V0UG9ydCgqaW5zMiksICJzaG91bGQgbm90IGJlIGFibGUgdG8gKGNvbnN0ICYgdHlwZSkiKTsKLSAgICAgICAgc3RhdGljX2Fzc2VydCghY2FuQ2FsbFNldFBvcnQoKmJpbnMyKSwgInNob3VsZCBub3QgYmUgYWJsZSB0byAodHlwZSkiKTsKLQotICAgICAgICAvLyBmbGFncyAmIGludmFyaWFibGVzCi0gICAgICAgIGNvbnN0IEMyTnVtYmVyc1N0cmVhbVR1bmluZyAqU1tdID0geyBvdXRzMS5nZXQoKSwgaW5zMS5nZXQoKSwgYm91dHMxLmdldCgpIH07Ci0gICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogUykgewotICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC0+c2l6ZSgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc1ZlbmRvcigpKTsKLSAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmlzRmxleGlibGUoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+aXNHbG9iYWwoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5mb3JTdHJlYW0oKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yUG9ydCgpKTsKLSAgICAgICAgfQotICAgICAgICBjb25zdCBDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0ICpTSVtdID0geyBpbnMyLmdldCgpLCBiaW5zMi5nZXQoKSB9OwotICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcCA6IFNJKSB7Ci0gICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLT5zaXplKCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmlzVmVuZG9yKCkpOwotICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+aXNGbGV4aWJsZSgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc0dsb2JhbCgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmZvclN0cmVhbSgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JQb3J0KCkpOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0ICpTT1tdID0geyBvdXRzMi5nZXQoKSwgYm91dHMyLmdldCgpIH07Ci0gICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogU08pIHsKLSAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAtPnNpemUoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+aXNWZW5kb3IoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5pc0ZsZXhpYmxlKCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmlzR2xvYmFsKCkpOwotICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+Zm9yU3RyZWFtKCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvclBvcnQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBwb3J0IHNwZWNpZmljIGZsYWdzICYgaW52YXJpYWJsZXMKLSAgICAgICAgRVhQRUNUX0ZBTFNFKG91dHMxLT5mb3JJbnB1dCgpKTsKLSAgICAgICAgRVhQRUNUX1RSVUUob3V0czEtPmZvck91dHB1dCgpKTsKLQotICAgICAgICBFWFBFQ1RfVFJVRShpbnMxLT5mb3JJbnB1dCgpKTsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKGluczEtPmZvck91dHB1dCgpKTsKLQotICAgICAgICBjb25zdCBDMk51bWJlcnNTdHJlYW1UdW5pbmcgKlMyW10gPSB7IG91dHMxLmdldCgpLCBpbnMxLmdldCgpIH07Ci0gICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogUzIpIHsKLSAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKSgqcCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCEoKnApKTsKLSAgICAgICAgICAgIEVYUEVDVF9FUSgxMDAsIHAtPm0ubU51bWJlcnNbMF0pOwotICAgICAgICAgICAgRVhQRUNUX0VRKDF1LCBwLT5zdHJlYW0oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBTTykgewotICAgICAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpKCpwKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UoISgqcCkpOwotCi0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9ySW5wdXQoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5mb3JPdXRwdXQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBTSSkgewotICAgICAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpKCpwKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UoISgqcCkpOwotCi0gICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5mb3JJbnB1dCgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JPdXRwdXQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3QgQzJOdW1iZXJzU3RyZWFtVHVuaW5nICpTM1tdID0geyBib3V0czEuZ2V0KCkgfTsKLSAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBTMykgewotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKChib29sKSgqcCkpOwotICAgICAgICAgICAgRVhQRUNUX1RSVUUoISgqcCkpOwotCi0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9ySW5wdXQoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yT3V0cHV0KCkpOwotICAgICAgICAgICAgRVhQRUNUX0VRKDAsIHAtPm0ubU51bWJlcnNbMF0pOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdmFsdWVzCi0gICAgICAgIEVYUEVDVF9FUSgxMDAsIGluczItPm0ubU51bWJlcnNbMF0pOwotICAgICAgICBFWFBFQ1RfRVEoMTAwLCBvdXRzMi0+bS5tTnVtYmVyc1swXSk7Ci0gICAgICAgIEVYUEVDVF9FUSgwLCBiaW5zMS0+bS5tTnVtYmVyc1swXSk7Ci0gICAgICAgIEVYUEVDVF9FUSgwLCBiaW5zMi0+bS5tTnVtYmVyc1swXSk7Ci0gICAgICAgIEVYUEVDVF9FUSgwLCBib3V0czEtPm0ubU51bWJlcnNbMF0pOwotICAgICAgICBFWFBFQ1RfRVEoMCwgYm91dHMyLT5tLm1OdW1iZXJzWzBdKTsKLQotICAgICAgICBFWFBFQ1RfRVEoMXUsIGluczItPnN0cmVhbSgpKTsKLSAgICAgICAgRVhQRUNUX0VRKDF1LCBvdXRzMi0+c3RyZWFtKCkpOwotICAgICAgICBFWFBFQ1RfRVEoMHUsIGJpbnMxLT5zdHJlYW0oKSk7Ci0gICAgICAgIEVYUEVDVF9FUSgwdSwgYmluczItPnN0cmVhbSgpKTsKLSAgICAgICAgRVhQRUNUX0VRKDB1LCBib3V0czEtPnN0cmVhbSgpKTsKLSAgICAgICAgRVhQRUNUX0VRKDB1LCBib3V0czItPnN0cmVhbSgpKTsKLQotICAgICAgICBFWFBFQ1RfVFJVRSgqaW5zMSAhPSAqb3V0czEpOwotICAgICAgICBFWFBFQ1RfVFJVRSgqaW5zMSA9PSAqaW5zMik7Ci0gICAgICAgIEVYUEVDVF9UUlVFKCpvdXRzMSA9PSAqb3V0czIpOwotICAgICAgICBFWFBFQ1RfVFJVRSgqYmluczEgPT0gKmJvdXRzMSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKCpiaW5zMiAhPSAqYm91dHMyKTsKLQotICAgICAgICBFWFBFQ1RfVFJVRSgqaW5zMSAhPSAqYmluczEpOwotICAgICAgICBiaW5zMS0+bS5tTnVtYmVyc1swXSA9IDEwMDsKLSAgICAgICAgRVhQRUNUX1RSVUUoKmluczEgIT0gKmJpbnMxKTsKLSAgICAgICAgYmluczEtPnNldFBvcnQoZmFsc2UgLyogb3V0cHV0ICovKTsKLSAgICAgICAgRVhQRUNUX1RSVUUoKmluczEgIT0gKmJpbnMxKTsKLSAgICAgICAgYmluczEtPnNldFN0cmVhbSgxdSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKCppbnMxID09ICpiaW5zMSk7Ci0KLSAgICAgICAgRVhQRUNUX1RSVUUoKmluczIgIT0gKmJpbnMyKTsKLSAgICAgICAgYmluczItPm0ubU51bWJlcnNbMF0gPSAxMDA7Ci0gICAgICAgIEVYUEVDVF9UUlVFKCppbnMyICE9ICpiaW5zMik7Ci0gICAgICAgIGJpbnMyLT5zZXRTdHJlYW0oMXUpOwotICAgICAgICBFWFBFQ1RfVFJVRSgqaW5zMiA9PSAqYmluczIpOwotCi0gICAgICAgIGJpbnMxLT5zZXRQb3J0KHRydWUgLyogb3V0cHV0ICovKTsKLSAgICAgICAgRVhQRUNUX1RSVUUoKm91dHMxID09ICpiaW5zMSk7Ci0KLSAgICAgICAgRVhQRUNUX1RSVUUoKm91dHMxICE9ICpib3V0czEpOwotICAgICAgICBib3V0czEtPm0ubU51bWJlcnNbMF0gPSAxMDA7Ci0gICAgICAgIEVYUEVDVF9UUlVFKCpvdXRzMSAhPSAqYm91dHMxKTsKLSAgICAgICAgYm91dHMxLT5zZXRQb3J0KHRydWUgLyogb3V0cHV0ICovKTsKLSAgICAgICAgRVhQRUNUX1RSVUUoKm91dHMxICE9ICpib3V0czEpOwotICAgICAgICBib3V0czEtPnNldFN0cmVhbSgxdSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKCpvdXRzMSA9PSAqYm91dHMxKTsKLQotICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0czIgIT0gKmJvdXRzMik7Ci0gICAgICAgIGJvdXRzMi0+bS5tTnVtYmVyc1swXSA9IDEwMDsKLSAgICAgICAgRVhQRUNUX1RSVUUoKm91dHMyICE9ICpib3V0czIpOwotICAgICAgICBib3V0czItPnNldFN0cmVhbSgxdSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKCpvdXRzMiA9PSAqYm91dHMyKTsKLQotICAgICAgICBib3V0czEtPnNldFBvcnQoZmFsc2UgLyogb3V0cHV0ICovKTsKLSAgICAgICAgRVhQRUNUX1RSVUUoKmluczEgPT0gKmJvdXRzMSk7Ci0KLSAgICAgICAgLy8gaW5kZXgKLSAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5zMS0+dHlwZSgpKS5iYXNlSW5kZXgoKSwgQzJOdW1iZXJzU3RydWN0OjpiYXNlSW5kZXgpOwotICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShpbnMxLT50eXBlKCkpLnBhcmFtSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKLSAgICAgICAgRVhQRUNUX0VRKGluczEtPnR5cGUoKSwgQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6dHlwZUluZGV4KTsKLQotICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShpbnMyLT50eXBlKCkpLmJhc2VJbmRleCgpLCBDMk51bWJlcnNTdHJ1Y3Q6OmJhc2VJbmRleCk7Ci0gICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGluczItPnR5cGUoKSkucGFyYW1JbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOwotICAgICAgICBFWFBFQ1RfRVEoaW5zMi0+dHlwZSgpLCBDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0Ojp0eXBlSW5kZXgpOwotCi0gICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHMxLT50eXBlKCkpLmJhc2VJbmRleCgpLCBDMk51bWJlcnNTdHJ1Y3Q6OmJhc2VJbmRleCk7Ci0gICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHMxLT50eXBlKCkpLnBhcmFtSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKLSAgICAgICAgRVhQRUNUX0VRKG91dHMxLT50eXBlKCksIEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0Ojp0eXBlSW5kZXgpOwotCi0gICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHMyLT50eXBlKCkpLmJhc2VJbmRleCgpLCBDMk51bWJlcnNTdHJ1Y3Q6OmJhc2VJbmRleCk7Ci0gICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHMyLT50eXBlKCkpLnBhcmFtSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKLSAgICAgICAgRVhQRUNUX0VRKG91dHMyLT50eXBlKCksIEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0Ojp0eXBlSW5kZXgpOwotCi0gICAgICAgIEMyUGFyYW06OkJhc2VJbmRleCBpbmRleCA9IEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OnR5cGVJbmRleDsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzVmVuZG9yKCkpOwotICAgICAgICBFWFBFQ1RfVFJVRShpbmRleC5pc0ZsZXhpYmxlKCkpOwotICAgICAgICBFWFBFQ1RfRVEoaW5kZXguYmFzZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyB8IEMyUGFyYW06OkJhc2VJbmRleDo6X2tGbGV4aWJsZUZsYWcpOwotICAgICAgICBFWFBFQ1RfRVEoaW5kZXgucGFyYW1JbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOwotCi0gICAgICAgIGluZGV4ID0gQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OnR5cGVJbmRleDsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzVmVuZG9yKCkpOwotICAgICAgICBFWFBFQ1RfVFJVRShpbmRleC5pc0ZsZXhpYmxlKCkpOwotICAgICAgICBFWFBFQ1RfRVEoaW5kZXguYmFzZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyB8IEMyUGFyYW06OkJhc2VJbmRleDo6X2tGbGV4aWJsZUZsYWcpOwotICAgICAgICBFWFBFQ1RfRVEoaW5kZXgucGFyYW1JbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOwotCi0gICAgICAgIEMyUGFyYW06OlR5cGUgdHlwZSA9IEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OnR5cGVJbmRleDsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNWZW5kb3IoKSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuaXNGbGV4aWJsZSgpKTsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNHbG9iYWwoKSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9ySW5wdXQoKSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvck91dHB1dCgpKTsKLSAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JTdHJlYW0oKSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvclBvcnQoKSk7Ci0KLSAgICAgICAgdHlwZSA9IEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0Ojp0eXBlSW5kZXg7Ci0gICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzVmVuZG9yKCkpOwotICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmlzRmxleGlibGUoKSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzR2xvYmFsKCkpOwotICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JJbnB1dCgpKTsKLSAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JPdXRwdXQoKSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9yU3RyZWFtKCkpOwotICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JQb3J0KCkpOwotCi0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6RnJvbShudWxscHRyKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNUdW5pbmc6OkZyb20oaW5zMS5nZXQoKSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzVHVuaW5nOjpGcm9tKGluczIuZ2V0KCkpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1R1bmluZzo6RnJvbShvdXRzMS5nZXQoKSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzVHVuaW5nOjpGcm9tKG91dHMyLmdldCgpKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpGcm9tKGluczEuZ2V0KCkpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OkZyb20oaW5zMi5nZXQoKSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6RnJvbShvdXRzMS5nZXQoKSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6RnJvbShvdXRzMi5nZXQoKSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oaW5zMS5nZXQoKSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oaW5zMi5nZXQoKSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20ob3V0czEuZ2V0KCkpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpGcm9tKG91dHMyLmdldCgpKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20oaW5zMS5nZXQoKSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKGluczIuZ2V0KCkpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6RnJvbShvdXRzMS5nZXQoKSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKG91dHMyLmdldCgpKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkZyb20oaW5zMS5nZXQoKSksIGluczEuZ2V0KCkpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpGcm9tKGluczIuZ2V0KCkpLCAoQzJOdW1iZXJzU3RyZWFtVHVuaW5nKilpbnMyLmdldCgpKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6RnJvbShvdXRzMS5nZXQoKSksIG91dHMxLmdldCgpKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6RnJvbShvdXRzMi5nZXQoKSksIChDMk51bWJlcnNTdHJlYW1UdW5pbmcqKW91dHMyLmdldCgpKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20oaW5zMS5nZXQoKSksIChDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0KilpbnMxLmdldCgpKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20oaW5zMi5nZXQoKSksIGluczIuZ2V0KCkpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbShvdXRzMS5nZXQoKSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbShvdXRzMi5nZXQoKSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oaW5zMS5nZXQoKSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oaW5zMi5nZXQoKSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20ob3V0czEuZ2V0KCkpLCAoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQqKW91dHMxLmdldCgpKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKG91dHMyLmdldCgpKSwgb3V0czIuZ2V0KCkpOwotCi0gICAgfQotCi0gICAgewotICAgICAgICBDMkludDMyVmFsdWUgaW50MzJWYWx1ZShJTlQzMl9NSU4pOwotICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShpbnQzMlZhbHVlLm1WYWx1ZSksIGludDMyX3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSBpbnQzMl90Iik7Ci0gICAgICAgIEVYUEVDVF9FUShJTlQzMl9NSU4sIGludDMyVmFsdWUubVZhbHVlKTsKLSAgICAgICAgc3RkOjpsaXN0PGNvbnN0IEMyRmllbGREZXNjcmlwdG9yPiBmaWVsZHMgPSBpbnQzMlZhbHVlLmZpZWxkTGlzdDsKLSAgICAgICAgRVhQRUNUX0VRKDF1LCBmaWVsZHMuc2l6ZSgpKTsKLSAgICAgICAgRVhQRUNUX0VRKEZEOjpJTlQzMiwgZmllbGRzLmNiZWdpbigpLT50eXBlKCkpOwotICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5jYmVnaW4oKS0+bGVuZ3RoKCkpOwotICAgICAgICBFWFBFQ1RfRVEoQzJTdHJpbmcoInZhbHVlIiksIGZpZWxkcy5jYmVnaW4oKS0+bmFtZSgpKTsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICAgIEMyVWludDMyVmFsdWUgdWludDMyVmFsdWUoVUlOVDMyX01BWCk7Ci0gICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKHVpbnQzMlZhbHVlLm1WYWx1ZSksIHVpbnQzMl90Pjo6dmFsdWUsICJzaG91bGQgYmUgdWludDMyX3QiKTsKLSAgICAgICAgRVhQRUNUX0VRKFVJTlQzMl9NQVgsIHVpbnQzMlZhbHVlLm1WYWx1ZSk7Ci0gICAgICAgIHN0ZDo6bGlzdDxjb25zdCBDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRzID0gdWludDMyVmFsdWUuZmllbGRMaXN0OwotICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5zaXplKCkpOwotICAgICAgICBFWFBFQ1RfRVEoRkQ6OlVJTlQzMiwgZmllbGRzLmNiZWdpbigpLT50eXBlKCkpOwotICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5jYmVnaW4oKS0+bGVuZ3RoKCkpOwotICAgICAgICBFWFBFQ1RfRVEoQzJTdHJpbmcoInZhbHVlIiksIGZpZWxkcy5jYmVnaW4oKS0+bmFtZSgpKTsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICAgIEMySW50NjRWYWx1ZSBpbnQ2NFZhbHVlKElOVDY0X01JTik7Ci0gICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKGludDY0VmFsdWUubVZhbHVlKSwgaW50NjRfdD46OnZhbHVlLCAic2hvdWxkIGJlIGludDY0X3QiKTsKLSAgICAgICAgRVhQRUNUX0VRKElOVDY0X01JTiwgaW50NjRWYWx1ZS5tVmFsdWUpOwotICAgICAgICBzdGQ6Omxpc3Q8Y29uc3QgQzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkcyA9IGludDY0VmFsdWUuZmllbGRMaXN0OwotICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5zaXplKCkpOwotICAgICAgICBFWFBFQ1RfRVEoRkQ6OklOVDY0LCBmaWVsZHMuY2JlZ2luKCktPnR5cGUoKSk7Ci0gICAgICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzLmNiZWdpbigpLT5sZW5ndGgoKSk7Ci0gICAgICAgIEVYUEVDVF9FUShDMlN0cmluZygidmFsdWUiKSwgZmllbGRzLmNiZWdpbigpLT5uYW1lKCkpOwotICAgIH0KLQotICAgIHsKLSAgICAgICAgQzJVaW50NjRWYWx1ZSB1aW50NjRWYWx1ZShVSU5UNjRfTUFYKTsKLSAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUodWludDY0VmFsdWUubVZhbHVlKSwgdWludDY0X3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSB1aW50NjRfdCIpOwotICAgICAgICBFWFBFQ1RfRVEoVUlOVDY0X01BWCwgdWludDY0VmFsdWUubVZhbHVlKTsKLSAgICAgICAgc3RkOjpsaXN0PGNvbnN0IEMyRmllbGREZXNjcmlwdG9yPiBmaWVsZHMgPSB1aW50NjRWYWx1ZS5maWVsZExpc3Q7Ci0gICAgICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzLnNpemUoKSk7Ci0gICAgICAgIEVYUEVDVF9FUShGRDo6VUlOVDY0LCBmaWVsZHMuY2JlZ2luKCktPnR5cGUoKSk7Ci0gICAgICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzLmNiZWdpbigpLT5sZW5ndGgoKSk7Ci0gICAgICAgIEVYUEVDVF9FUShDMlN0cmluZygidmFsdWUiKSwgZmllbGRzLmNiZWdpbigpLT5uYW1lKCkpOwotICAgIH0KLQotICAgIHsKLSAgICAgICAgQzJGbG9hdFZhbHVlIGZsb2F0VmFsdWUoMTIzLjRmKTsKLSAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUoZmxvYXRWYWx1ZS5tVmFsdWUpLCBmbG9hdD46OnZhbHVlLCAic2hvdWxkIGJlIGZsb2F0Iik7Ci0gICAgICAgIEVYUEVDVF9FUSgxMjMuNGYsIGZsb2F0VmFsdWUubVZhbHVlKTsKLSAgICAgICAgc3RkOjpsaXN0PGNvbnN0IEMyRmllbGREZXNjcmlwdG9yPiBmaWVsZHMgPSBmbG9hdFZhbHVlLmZpZWxkTGlzdDsKLSAgICAgICAgRVhQRUNUX0VRKDF1LCBmaWVsZHMuc2l6ZSgpKTsKLSAgICAgICAgRVhQRUNUX0VRKEZEOjpGTE9BVCwgZmllbGRzLmNiZWdpbigpLT50eXBlKCkpOwotICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5jYmVnaW4oKS0+bGVuZ3RoKCkpOwotICAgICAgICBFWFBFQ1RfRVEoQzJTdHJpbmcoInZhbHVlIiksIGZpZWxkcy5jYmVnaW4oKS0+bmFtZSgpKTsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICAgIHVpbnQ4X3QgaW5pdFZhbHVlW10gPSAiQUJDRCI7Ci0gICAgICAgIHR5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlNldHRpbmcsIEMyQmxvYlZhbHVlLCAwPiBCbG9iU2V0dGluZzsKLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEJsb2JTZXR0aW5nPiBibG9iVmFsdWUgPSBCbG9iU2V0dGluZzo6YWxsb2NfdW5pcXVlKDYsIEMyQ29uc3RNZW1vcnlCbG9jazx1aW50OF90Pihpbml0VmFsdWUpKTsKLSAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUoYmxvYlZhbHVlLT5tLm1WYWx1ZSksIHVpbnQ4X3RbXT46OnZhbHVlLCAic2hvdWxkIGJlIHVpbnQ4X3RbXSIpOwotICAgICAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKGJsb2JWYWx1ZS0+bS5tVmFsdWUsICJBQkNEXDAiLCA2KSk7Ci0gICAgICAgIEVYUEVDVF9FUSg2dSwgYmxvYlZhbHVlLT5mbGV4Q291bnQoKSk7Ci0gICAgICAgIHN0ZDo6bGlzdDxjb25zdCBDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRzID0gYmxvYlZhbHVlLT5maWVsZExpc3Q7Ci0gICAgICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzLnNpemUoKSk7Ci0gICAgICAgIEVYUEVDVF9FUShGRDo6QkxPQiwgZmllbGRzLmNiZWdpbigpLT50eXBlKCkpOwotICAgICAgICBFWFBFQ1RfRVEoMHUsIGZpZWxkcy5jYmVnaW4oKS0+bGVuZ3RoKCkpOwotICAgICAgICBFWFBFQ1RfRVEoQzJTdHJpbmcoInZhbHVlIiksIGZpZWxkcy5jYmVnaW4oKS0+bmFtZSgpKTsKLQotICAgICAgICBibG9iVmFsdWUgPSBCbG9iU2V0dGluZzo6YWxsb2NfdW5pcXVlKDMsIEMyQ29uc3RNZW1vcnlCbG9jazx1aW50OF90Pihpbml0VmFsdWUpKTsKLSAgICAgICAgRVhQRUNUX0VRKDAsIG1lbWNtcChibG9iVmFsdWUtPm0ubVZhbHVlLCAiQUJDIiwgMykpOwotICAgICAgICBFWFBFQ1RfRVEoM3UsIGJsb2JWYWx1ZS0+ZmxleENvdW50KCkpOwotICAgIH0KLQotICAgIHsKLSAgICAgICAgY29uc3RleHByIGNoYXIgaW5pdFZhbHVlW10gPSAiQUJDRCI7Ci0gICAgICAgIHR5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlNldHRpbmcsIEMyU3RyaW5nVmFsdWUsIDA+IFN0cmluZ1NldHRpbmc7Ci0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmdTZXR0aW5nPiBzdHJpbmdWYWx1ZSA9IFN0cmluZ1NldHRpbmc6OmFsbG9jX3VuaXF1ZSg2LCBDMkNvbnN0TWVtb3J5QmxvY2s8Y2hhcj4oaW5pdFZhbHVlKSk7Ci0gICAgICAgIHN0cmluZ1ZhbHVlID0gU3RyaW5nU2V0dGluZzo6YWxsb2NfdW5pcXVlKDYsIGluaXRWYWx1ZSk7Ci0gICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKHN0cmluZ1ZhbHVlLT5tLm1WYWx1ZSksIGNoYXJbXT46OnZhbHVlLCAic2hvdWxkIGJlIGNoYXJbXSIpOwotICAgICAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKHN0cmluZ1ZhbHVlLT5tLm1WYWx1ZSwgIkFCQ0RcMCIsIDYpKTsKLSAgICAgICAgRVhQRUNUX0VRKDZ1LCBzdHJpbmdWYWx1ZS0+ZmxleENvdW50KCkpOwotICAgICAgICBzdGQ6Omxpc3Q8Y29uc3QgQzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkcyA9IHN0cmluZ1ZhbHVlLT5maWVsZExpc3Q7Ci0gICAgICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzLnNpemUoKSk7Ci0gICAgICAgIEVYUEVDVF9FUShGRDo6U1RSSU5HLCBmaWVsZHMuY2JlZ2luKCktPnR5cGUoKSk7Ci0gICAgICAgIEVYUEVDVF9FUSgwdSwgZmllbGRzLmNiZWdpbigpLT5sZW5ndGgoKSk7Ci0gICAgICAgIEVYUEVDVF9FUShDMlN0cmluZygidmFsdWUiKSwgZmllbGRzLmNiZWdpbigpLT5uYW1lKCkpOwotCi0gICAgICAgIHN0cmluZ1ZhbHVlID0gU3RyaW5nU2V0dGluZzo6YWxsb2NfdW5pcXVlKDMsIEMyQ29uc3RNZW1vcnlCbG9jazxjaGFyPihpbml0VmFsdWUpKTsKLSAgICAgICAgRVhQRUNUX0VRKDAsIG1lbWNtcChzdHJpbmdWYWx1ZS0+bS5tVmFsdWUsICJBQiIsIDMpKTsKLSAgICAgICAgRVhQRUNUX0VRKDN1LCBzdHJpbmdWYWx1ZS0+ZmxleENvdW50KCkpOwotCi0gICAgICAgIHN0cmluZ1ZhbHVlID0gU3RyaW5nU2V0dGluZzo6YWxsb2NfdW5pcXVlKDExLCAiaW5pdFZhbHVlIik7Ci0gICAgICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoc3RyaW5nVmFsdWUtPm0ubVZhbHVlLCAiaW5pdFZhbHVlXDAiLCAxMSkpOwotICAgICAgICBFWFBFQ1RfRVEoMTF1LCBzdHJpbmdWYWx1ZS0+ZmxleENvdW50KCkpOwotCi0gICAgICAgIHN0cmluZ1ZhbHVlID0gU3RyaW5nU2V0dGluZzo6YWxsb2NfdW5pcXVlKGluaXRWYWx1ZSk7Ci0gICAgICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoc3RyaW5nVmFsdWUtPm0ubVZhbHVlLCAiQUJDRCIsIDUpKTsKLSAgICAgICAgRVhQRUNUX0VRKDV1LCBzdHJpbmdWYWx1ZS0+ZmxleENvdW50KCkpOwotCi0gICAgICAgIHN0cmluZ1ZhbHVlID0gU3RyaW5nU2V0dGluZzo6YWxsb2NfdW5pcXVlKHsgJ0EnLCAnQicsICdDJywgJ0QnIH0pOwotICAgICAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKHN0cmluZ1ZhbHVlLT5tLm1WYWx1ZSwgIkFCQyIsIDQpKTsKLSAgICAgICAgRVhQRUNUX0VRKDR1LCBzdHJpbmdWYWx1ZS0+ZmxleENvdW50KCkpOwotICAgIH0KLQotICAgIHsKLSAgICAgICAgdWludDMyX3QgdmlkZW9XaWR0aFtdID0geyAxMnUsIEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0Ojp0eXBlSW5kZXgsIDEwMCB9OwotICAgICAgICBDMlBhcmFtICpwMSA9IEMyUGFyYW06OkZyb20odmlkZW9XaWR0aCwgc2l6ZW9mKHZpZGVvV2lkdGgpKTsKLSAgICAgICAgRVhQRUNUX05FKG51bGxwdHIsIHAxKTsKLSAgICAgICAgRVhQRUNUX0VRKDEydSwgcDEtPnNpemUoKSk7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6dHlwZUluZGV4LCBwMS0+dHlwZSgpKTsKLQotICAgICAgICBDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dCAqdnN0ID0gQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20ocDEpOwotICAgICAgICBFWFBFQ1RfTkUobnVsbHB0ciwgdnN0KTsKLSAgICAgICAgaWYgKHZzdCkgewotICAgICAgICAgICAgRVhQRUNUX0VRKDF1LCB2c3QtPmZsZXhDb3VudCgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9FUSgxMDAsIHZzdC0+bS5tTnVtYmVyc1swXSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwMSA9IEMyUGFyYW06OkZyb20odmlkZW9XaWR0aCwgc2l6ZW9mKHZpZGVvV2lkdGgpICsgMik7Ci0gICAgICAgIEVYUEVDVF9FUShudWxscHRyLCBwMSk7Ci0KLSAgICAgICAgcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIHNpemVvZih2aWRlb1dpZHRoKSAtIDIpOwotICAgICAgICBFWFBFQ1RfRVEobnVsbHB0ciwgcDEpOwotCi0gICAgICAgIHAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCAzKTsKLSAgICAgICAgRVhQRUNUX0VRKG51bGxwdHIsIHAxKTsKLQotICAgICAgICBwMSA9IEMyUGFyYW06OkZyb20odmlkZW9XaWR0aCwgMCk7Ci0gICAgICAgIEVYUEVDVF9FUShudWxscHRyLCBwMSk7Ci0gICAgfQotCi0gICAgewotICAgICAgICB1aW50MzJfdCB2aWRlb1dpZHRoW10gPSB7IDE2dSwgQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OnR5cGVJbmRleCwgMTAxLCAxMDIgfTsKLQotICAgICAgICBDMlBhcmFtICpwMSA9IEMyUGFyYW06OkZyb20odmlkZW9XaWR0aCwgc2l6ZW9mKHZpZGVvV2lkdGgpKTsKLSAgICAgICAgRVhQRUNUX05FKG51bGxwdHIsIHAxKTsKLSAgICAgICAgRVhQRUNUX0VRKDE2dSwgcDEtPnNpemUoKSk7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6dHlwZUluZGV4LCBwMS0+dHlwZSgpKTsKLQotICAgICAgICBDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dCAqdnB0ID0gQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20ocDEpOwotICAgICAgICBFWFBFQ1RfTkUobnVsbHB0ciwgdnB0KTsKLSAgICAgICAgaWYgKHZwdCkgewotICAgICAgICAgICAgRVhQRUNUX0VRKDJ1LCB2cHQtPmZsZXhDb3VudCgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9FUSgxMDEsIHZwdC0+bS5tTnVtYmVyc1swXSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRVEoMTAyLCB2cHQtPm0ubU51bWJlcnNbMV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIHNpemVvZih2aWRlb1dpZHRoKSArIDIpOwotICAgICAgICBFWFBFQ1RfRVEobnVsbHB0ciwgcDEpOwotCi0gICAgICAgIHAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCBzaXplb2YodmlkZW9XaWR0aCkgLSAyKTsKLSAgICAgICAgRVhQRUNUX0VRKG51bGxwdHIsIHAxKTsKLQotICAgICAgICBwMSA9IEMyUGFyYW06OkZyb20odmlkZW9XaWR0aCwgMyk7Ci0gICAgICAgIEVYUEVDVF9FUShudWxscHRyLCBwMSk7Ci0KLSAgICAgICAgcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIDApOwotICAgICAgICBFWFBFQ1RfRVEobnVsbHB0ciwgcDEpOwotICAgIH0KLX0KLQotLy8gKioqKioqKioqKioqKioqKioqKioqKioKLQotfQotCi0jaW5jbHVkZSA8dXRpbC9DMlBhcmFtVXRpbHMuaD4KLSNpbmNsdWRlIDxDMkNvbmZpZy5oPgotI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1DMkVOVU0oCi0gICAgTWV0YWRhdGFUeXBlLCBpbnQzMl90LAotICAgIGtJbnZhbGlkID0gLTEsCi0gICAga05vbmUgPSAwLAotICAgIGtHcmFsbG9jLAotICAgIGtOYXRpdmVIYW5kbGUsCi0gICAga0FOYXRpdmVXaW5kb3csCi0gICAga0NhbWVyYSwKLSkKLQotZW51bSB7Ci0gICAga1BhcmFtSW5kZXhWaWRlb0NvbmZpZyA9IDB4MTIzNCwKLX07Ci0KLXN0cnVjdCBDMlZpZGVvQ29uZmlnU3RydWN0IHsKLSAgICBpbnQzMl90IG1XaWR0aDsKLSAgICB1aW50MzJfdCBtSGVpZ2h0OwotICAgIE1ldGFkYXRhVHlwZSBtTWV0YWRhdGFUeXBlOwotICAgIGludDMyX3QgbVN1cHBvcnRlZEZvcm1hdHNbXTsKLQotICAgIEMyVmlkZW9Db25maWdTdHJ1Y3QoKSB7fQotCi0gICAgREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKFZpZGVvQ29uZmlnLCBtU3VwcG9ydGVkRm9ybWF0cykKLSAgICBDMkZJRUxEKG1XaWR0aCwgIndpZHRoIikKLSAgICBDMkZJRUxEKG1IZWlnaHQsICJoZWlnaHQiKQotICAgIEMyRklFTEQobU1ldGFkYXRhVHlwZSwgIm1ldGFkYXRhLXR5cGUiKQotICAgIEMyRklFTEQobVN1cHBvcnRlZEZvcm1hdHMsICJmb3JtYXRzIikKLX07Ci0KLXR5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVmlkZW9Db25maWdTdHJ1Y3Q+IEMyVmlkZW9Db25maWdQb3J0VHVuaW5nOwotCi1jbGFzcyBNeVJlZmxlY3RvciA6IHB1YmxpYyBDMlBhcmFtUmVmbGVjdG9yIHsKLXByaXZhdGU6Ci0gICAgc3RkOjp1bmlxdWVfcHRyPEMyVmlkZW9Db25maWdQb3J0VHVuaW5nOjppbnB1dD4gaW5wdXRWaWRlb0NvbmZpZ1R1bmluZzsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJWaWRlb0NvbmZpZ1BvcnRUdW5pbmc6Om91dHB1dD4gb3V0cHV0VmlkZW9Db25maWdUdW5pbmc7Ci0KLXB1YmxpYzoKLSAgICB2b2lkIGRlc2NyaWJlU3VwcG9ydGVkVmFsdWVzKCkgewotICAgICAgICBDMlR5cGVkRmllbGRTdXBwb3J0ZWRWYWx1ZXM8aW50MzJfdD4gc3VwcG9ydGVkV2lkdGhzKDE2LCAxOTIwLCA4KTsKLSAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyBzdXBwb3J0ZWRXaWR0aHMyKDE2LCAxOTIwLCA4KTsKLQotCi0gICAgICAgIHN0ZDo6bGlzdDxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzPiBzdXBwb3J0ZWQ7Ci0gICAgICAgIC8vc3VwcG9ydGVkLmVtcGxhY2VfcHVzaChpbnB1dFZpZGVvQ29uZmlnVHVuaW5nLT5tTnVtYmVyLCByYW5nZSgxNiwgMTkyMCwgOCkpOwotICAgICAgICAvL3N1cHBvcnRlZC5lbXBsYWNlX3B1c2goaW5wdXRWaWRlb0NvbmZpZ1R1bmluZy0+bUhlaWdodCwgcmFuZ2UoMTYsIDEwODgsIDgpKTsKLSAgICAgICAgLy9zdXBwb3J0ZWQuZW1wbGFjZV9wdXNoKGlucHV0VmlkZW9Db25maWdUdW5pbmctPm1NZXRhZGF0YVR5cGUsIGFsbF9lbnVtcyk7Ci0gICAgICAgIC8vc3VwcG9ydGVkLmVtcGxhY2VfcHVzaChpbnB1dFZpZGVvQ29uZmlnVHVuaW5nLT5tU3VwcG9ydGVkRm9ybWF0cywgeyAwLCAxLCA1LCA3IH0pOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPGFuZHJvaWQ6OkMyU3RydWN0RGVzY3JpcHRvcj4gZGVzY3JpYmUoQzJQYXJhbTo6QmFzZUluZGV4IHBhcmFtVHlwZSkgewotICAgICAgICBzd2l0Y2ggKHBhcmFtVHlwZS5iYXNlSW5kZXgoKSkgewotICAgICAgICBjYXNlIEMyVmlkZW9Db25maWdQb3J0VHVuaW5nOjpiYXNlSW5kZXg6Ci0gICAgICAgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4obmV3IEMyU3RydWN0RGVzY3JpcHRvcnsKLSAgICAgICAgICAgICAgICBwYXJhbVR5cGUuYmFzZUluZGV4KCksCi0gICAgICAgICAgICAgICAgQzJWaWRlb0NvbmZpZ1BvcnRUdW5pbmc6OmZpZWxkTGlzdCwKLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLX07Ci0KLWNsYXNzIE15Q29tcG9uZW50SW5zdGFuY2UgOiBwdWJsaWMgQzJDb21wb25lbnRJbnRlcmZhY2UgewotcHVibGljOgotICAgIHZpcnR1YWwgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IHsKLSAgICAgICAgLy8vIFx0b2RvIHRoaXMgc2VlbXMgdG9vIHNwZWNpZmljCi0gICAgICAgIHJldHVybiAic2FtcGxlLmludGVyZmFjZSI7Ci0gICAgfTsKLQotICAgIHZpcnR1YWwgbm9kZV9pZCBnZXRJZCgpIGNvbnN0IHsKLSAgICAgICAgLy8vIFx0b2RvIGhvdyBhcmUgdGhlc2Ugc2hhcmVkPwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNvbW1pdF9zbSgKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qIGNvbnN0PiAmcGFyYW1zLAotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcykgewotICAgICAgICAodm9pZClwYXJhbXM7Ci0gICAgICAgICh2b2lkKWZhaWx1cmVzOwotICAgICAgICByZXR1cm4gQzJfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWdfbmIoCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKiBjb25zdD4gJnBhcmFtcywKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMpIHsKLSAgICAgICAgKHZvaWQpcGFyYW1zOwotICAgICAgICAodm9pZClmYWlsdXJlczsKLSAgICAgICAgcmV0dXJuIEMyX1VOU1VQUE9SVEVEOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlVHVubmVsX3NtKG5vZGVfaWQgdGFyZ2V0Q29tcG9uZW50KSB7Ci0gICAgICAgICh2b2lkKXRhcmdldENvbXBvbmVudDsKLSAgICAgICAgcmV0dXJuIEMyX1VOU1VQUE9SVEVEOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlfbmIoCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKiBjb25zdD4gJnN0YWNrUGFyYW1zLAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZoZWFwUGFyYW1JbmRpY2VzLAotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogY29uc3QgaGVhcFBhcmFtcykgY29uc3QgewotICAgICAgICBmb3IgKEMyUGFyYW0qIGNvbnN0IHBhcmFtIDogc3RhY2tQYXJhbXMpIHsKLSAgICAgICAgICAgIGlmICghKnBhcmFtKSB7IC8vIHBhcmFtIGlzIGFscmVhZHkgaW52YWxpZCAtIHJlbWVtYmVyIGl0Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIG5vdGU6IHRoaXMgZG9lcyBub3QgaGFuZGxlIHN0cmVhbSBwYXJhbXMgKHNob3VsZCB1c2UgaW5kZXguLi4pCi0gICAgICAgICAgICBpZiAoIW1NeVBhcmFtcy5jb3VudChwYXJhbS0+dHlwZSgpKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBub3QgbXkgcGFyYW0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQzJQYXJhbSAmIG15UGFyYW0gPSBtTXlQYXJhbXMuZmluZChwYXJhbS0+dHlwZSgpKS0+c2Vjb25kOwotICAgICAgICAgICAgaWYgKG15UGFyYW0uc2l6ZSgpICE9IHBhcmFtLT5zaXplKCkpIHsgLy8gaW5jb3JyZWN0IHNpemUKLSAgICAgICAgICAgICAgICBwYXJhbS0+aW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwYXJhbS0+dXBkYXRlRnJvbShteVBhcmFtKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoY29uc3QgQzJQYXJhbTo6SW5kZXggaW5kZXggOiBoZWFwUGFyYW1JbmRpY2VzKSB7Ci0gICAgICAgICAgICBpZiAobU15UGFyYW1zLmNvdW50KGluZGV4KSkgewotICAgICAgICAgICAgICAgIEMyUGFyYW0gJiBteVBhcmFtID0gbU15UGFyYW1zLmZpbmQoaW5kZXgpLT5zZWNvbmQ7Ci0gICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+IHBhcmFtQ29weShDMlBhcmFtOjpGcm9tKCZteVBhcmFtLCBteVBhcmFtLnNpemUoKSkpOwotICAgICAgICAgICAgICAgIGhlYXBQYXJhbXMtPnB1c2hfYmFjayhzdGQ6Om1vdmUocGFyYW1Db3B5KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gQzJfT0s7Ci0gICAgfQotCi0gICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQzMl90LCBDMlBhcmFtICY+IG1NeVBhcmFtczsKLQotICAgIEMyQ29tcG9uZW50RG9tYWluSW5mbyBtRG9tYWluSW5mbzsKLQotICAgIE15Q29tcG9uZW50SW5zdGFuY2UoKSB7Ci0gICAgICAgIG1NeVBhcmFtcy5pbnNlcnQoe21Eb21haW5JbmZvLnR5cGUoKSwgbURvbWFpbkluZm99KTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VUdW5uZWxfc20obm9kZV9pZCB0YXJnZXRDb21wb25lbnQpIHsKLSAgICAgICAgKHZvaWQpdGFyZ2V0Q29tcG9uZW50OwotICAgICAgICByZXR1cm4gQzJfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgY2xhc3MgTXlQYXJhbVJlZmxlY3RvciA6IHB1YmxpYyBDMlBhcmFtUmVmbGVjdG9yIHsKLSAgICAgICAgY29uc3QgTXlDb21wb25lbnRJbnN0YW5jZSAqaW5zdGFuY2U7Ci0KLSAgICBwdWJsaWM6Ci0gICAgICAgIE15UGFyYW1SZWZsZWN0b3IoY29uc3QgTXlDb21wb25lbnRJbnN0YW5jZSAqaSkgOiBpbnN0YW5jZShpKSB7IH0KLQotICAgICAgICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IGRlc2NyaWJlKEMyUGFyYW06OkJhc2VJbmRleCBwYXJhbUluZGV4KSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHBhcmFtSW5kZXguYmFzZUluZGV4KCkpIHsKLSAgICAgICAgICAgIGNhc2UgZGVjbHR5cGUoaW5zdGFuY2UtPm1Eb21haW5JbmZvKTo6YmFzZUluZGV4OgotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4obmV3IEMyU3RydWN0RGVzY3JpcHRvcnsKLSAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UtPm1Eb21haW5JbmZvLnR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgZGVjbHR5cGUoaW5zdGFuY2UtPm1Eb21haW5JbmZvKTo6ZmllbGRMaXN0LAotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdXBwb3J0ZWRWYWx1ZXMoCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBDMlBhcmFtRmllbGQ+IGZpZWxkcywKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+KiBjb25zdCB2YWx1ZXMpIGNvbnN0IHsKLSAgICAgICAgZm9yIChjb25zdCBDMlBhcmFtRmllbGQgJmZpZWxkIDogZmllbGRzKSB7Ci0gICAgICAgICAgICBpZiAoZmllbGQgPT0gQzJQYXJhbUZpZWxkKCZtRG9tYWluSW5mbywgJkMyQ29tcG9uZW50RG9tYWluSW5mbzo6bVZhbHVlKSkgewotICAgICAgICAgICAgICAgIHZhbHVlcy0+cHVzaF9iYWNrKEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoCi0gICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGZsYWcgKi8sCi0gICAgICAgICAgICAgICAgICAgICZtRG9tYWluSW5mby5tVmFsdWUKLSAgICAgICAgICAgICAgICAgICAgLy8sCi0gICAgICAgICAgICAgICAgICAgIC8veyhpbnQzMl90KUMyRG9tYWluVmlkZW99Ci0gICAgICAgICAgICAgICAgKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEMyX09LOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IGdldFBhcmFtUmVmbGVjdG9yKCkgY29uc3QgewotICAgICAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+KG5ldyBNeVBhcmFtUmVmbGVjdG9yKHRoaXMpKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN1cHBvcnRlZFBhcmFtcyhzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqIGNvbnN0IHBhcmFtcykgY29uc3QgewotICAgICAgICBwYXJhbXMtPnB1c2hfYmFjayhzdGQ6Om1ha2Vfc2hhcmVkPEMyUGFyYW1EZXNjcmlwdG9yPigKLSAgICAgICAgICAgICAgICB0cnVlIC8qIHJlcXVpcmVkICovLCAiX2RvbWFpbiIsICZtRG9tYWluSW5mbykpOwotICAgICAgICByZXR1cm4gQzJfT0s7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZ2V0U3VwcG9ydGVkUGFyYW1zMihzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqIGNvbnN0IHBhcmFtcykgewotICAgICAgICBwYXJhbXMtPnB1c2hfYmFjayhzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+KAotICAgICAgICAgICAgICAgIG5ldyBDMlBhcmFtRGVzY3JpcHRvcih0cnVlIC8qIHJlcXVpcmVkICovLCAiX2RvbWFpbiIsICZtRG9tYWluSW5mbykpKTsKLSAgICAgICAgcmV0dXJuIEMyX09LOwotICAgIH0KLQotfTsKLQotdGVtcGxhdGU8dHlwZW5hbWUgRSwgYm9vbCBTPXN0ZDo6aXNfZW51bTxFPjo6dmFsdWU+Ci1zdHJ1Y3QgZ2V0dGVyIHsKLSAgICBpbnQzMl90IGdldChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpQcmltaXRpdmUgJnAsIGludDMyX3QqKSB7Ci0gICAgICAgIHJldHVybiBwLmkzMjsKLSAgICB9Ci0gICAgaW50NjRfdCBnZXQoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UHJpbWl0aXZlICZwLCBpbnQ2NF90KikgewotICAgICAgICByZXR1cm4gcC5pNjQ7Ci0gICAgfQotICAgIHVpbnQzMl90IGdldChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpQcmltaXRpdmUgJnAsIHVpbnQzMl90KikgewotICAgICAgICByZXR1cm4gcC51MzI7Ci0gICAgfQotICAgIHVpbnQ2NF90IGdldChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpQcmltaXRpdmUgJnAsIHVpbnQ2NF90KikgewotICAgICAgICByZXR1cm4gcC51NjQ7Ci0gICAgfQotICAgIGZsb2F0IGdldChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpQcmltaXRpdmUgJnAsIGZsb2F0KikgewotICAgICAgICByZXR1cm4gcC5mcDsKLSAgICB9Ci19OwotCi10ZW1wbGF0ZTx0eXBlbmFtZSBFPgotc3RydWN0IGdldHRlcjxFLCB0cnVlPiB7Ci0gICAgIHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPEU+Ojp0eXBlIGdldChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpQcmltaXRpdmUgJnAsIEUqKSB7Ci0gICAgICAgICB1c2luZyB1PXR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPEU+Ojp0eXBlOwotICAgICAgICAgcmV0dXJuIGdldHRlcjx1PigpLmdldChwLCAodSopMCk7Ci0gICAgIH0KLX07Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFQsIGJvb2wgRT1zdGQ6OmlzX2VudW08VD46OnZhbHVlPgotc3RydWN0IGxheF91bmRlcmx5aW5nX3R5cGUgewotICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjp1bmRlcmx5aW5nX3R5cGU8VD46OnR5cGUgdHlwZTsKLX07Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgbGF4X3VuZGVybHlpbmdfdHlwZTxULCBmYWxzZT4gewotICAgIHR5cGVkZWYgVCB0eXBlOwotfTsKLQotdGVtcGxhdGU8dHlwZW5hbWUgRT4KLXR5cGVuYW1lIGxheF91bmRlcmx5aW5nX3R5cGU8RT46OnR5cGUgZ2V0KAotICAgICAgICBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpQcmltaXRpdmUgJnAsIEUqKSB7Ci0gICAgcmV0dXJuIGdldHRlcjxFPigpLmdldChwLCAoRSopMCk7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci12b2lkIGR1bXBGU1YoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmc3YsIFQqdCkgewotICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0gICAgY291dCA8PCAoc3RkOjppc19lbnVtPFQ+Ojp2YWx1ZSA/IChzdGQ6OmlzX3NpZ25lZDx0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxUPjo6dHlwZT46OnZhbHVlID8gImkiIDogInUiKQotICAgICAgICAgICAgIDogc3RkOjppc19pbnRlZ3JhbDxUPjo6dmFsdWUgPyBzdGQ6OmlzX3NpZ25lZDxUPjo6dmFsdWUgPyAiaSIgOiAidSIgOiAiZiIpCi0gICAgICAgIDw8ICg4ICogc2l6ZW9mKFQpKTsKLSAgICBpZiAoc3YudHlwZSA9PSBzdi5SQU5HRSkgewotICAgICAgICBjb3V0IDw8ICIucmFuZ2UoIiA8PCBnZXQoc3YucmFuZ2UubWluLCB0KTsKLSAgICAgICAgaWYgKGdldChzdi5yYW5nZS5zdGVwLCB0KSAhPSBzdGQ6OmlzX2ludGVncmFsPFQ+Ojp2YWx1ZSkgewotICAgICAgICAgICAgY291dCA8PCAiOiIgPDwgZ2V0KHN2LnJhbmdlLnN0ZXAsIHQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChnZXQoc3YucmFuZ2Uubm9tLCB0KSAhPSAxIHx8IGdldChzdi5yYW5nZS5kZW5vbSwgdCkgIT0gMSkgewotICAgICAgICAgICAgY291dCA8PCAiOiIgPDwgZ2V0KHN2LnJhbmdlLm5vbSwgdCkgPDwgIi8iIDw8IGdldChzdi5yYW5nZS5kZW5vbSwgdCk7Ci0gICAgICAgIH0KLSAgICAgICAgY291dCA8PCBnZXQoc3YucmFuZ2UubWF4LCB0KSA8PCAiKSI7Ci0gICAgfQotICAgIGlmIChzdi52YWx1ZXMuc2l6ZSgpKSB7Ci0gICAgICAgIGNvdXQgPDwgKHN2LnR5cGUgPT0gc3YuRkxBR1MgPyAiLmZsYWdzKCIgOiAiLmxpc3QoIik7Ci0gICAgICAgIGNvbnN0IGNoYXIgKnNlcCA9ICIiOwotICAgICAgICBmb3IgKGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlByaW1pdGl2ZSAmcCA6IHN2LnZhbHVlcykgewotICAgICAgICAgICAgY291dCA8PCBzZXAgPDwgZ2V0KHAsIHQpOwotICAgICAgICAgICAgc2VwID0gIiwiOwotICAgICAgICB9Ci0gICAgICAgIGNvdXQgPDwgIikiOwotICAgIH0KLSAgICBjb3V0IDw8IGVuZGw7Ci19Ci0KLXZvaWQgZHVtcFR5cGUoQzJQYXJhbTo6VHlwZSB0eXBlKSB7Ci0gICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLSAgICBjb3V0IDw8ICh0eXBlLmlzVmVuZG9yKCkgPyAiVmVuZG9yIiA6ICJDMiIpOwotICAgIGlmICh0eXBlLmZvcklucHV0KCkpIHsKLSAgICAgICAgY291dCA8PCAiSW5wdXQiOwotICAgIH0gZWxzZSBpZiAodHlwZS5mb3JPdXRwdXQoKSkgewotICAgICAgICBjb3V0IDw8ICJPdXRwdXQiOwotICAgIH0gZWxzZSBpZiAodHlwZS5mb3JQb3J0KCkgJiYgIXR5cGUuZm9yU3RyZWFtKCkpIHsKLSAgICAgICAgY291dCA8PCAiUG9ydCI7Ci0gICAgfQotICAgIGlmICh0eXBlLmZvclN0cmVhbSgpKSB7Ci0gICAgICAgIGNvdXQgPDwgIlN0cmVhbSI7Ci0gICAgfQotCi0gICAgaWYgKHR5cGUuaXNGbGV4aWJsZSgpKSB7Ci0gICAgICAgIGNvdXQgPDwgIkZsZXgiOwotICAgIH0KLQotICAgIGNvdXQgPDwgdHlwZS5wYXJhbUluZGV4KCk7Ci0KLSAgICBzd2l0Y2ggKHR5cGUua2luZCgpKSB7Ci0gICAgY2FzZSBDMlBhcmFtOjpJTkZPOiBjb3V0IDw8ICJJbmZvIjsgYnJlYWs7Ci0gICAgY2FzZSBDMlBhcmFtOjpTRVRUSU5HOiBjb3V0IDw8ICJTZXR0aW5nIjsgYnJlYWs7Ci0gICAgY2FzZSBDMlBhcmFtOjpUVU5JTkc6IGNvdXQgPDwgIlR1bmluZyI7IGJyZWFrOwotICAgIGNhc2UgQzJQYXJhbTo6U1RSVUNUOiBjb3V0IDw8ICJTdHJ1Y3QiOyBicmVhazsKLSAgICBkZWZhdWx0OiBjb3V0IDw8ICJLaW5kIiA8PCAoaW50MzJfdCl0eXBlLmtpbmQoKTsgYnJlYWs7Ci0gICAgfQotfQotCi12b2lkIGR1bXBUeXBlKEMyUGFyYW06OkJhc2VJbmRleCB0eXBlKSB7Ci0gICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLSAgICBjb3V0IDw8ICh0eXBlLmlzVmVuZG9yKCkgPyAiVmVuZG9yIiA6ICJDMiIpOwotICAgIGlmICh0eXBlLmlzRmxleGlibGUoKSkgewotICAgICAgICBjb3V0IDw8ICJGbGV4IjsKLSAgICB9Ci0KLSAgICBjb3V0IDw8IHR5cGUucGFyYW1JbmRleCgpIDw8ICJTdHJ1Y3QiOwotfQotCi12b2lkIGR1bXBUeXBlKEZEOjpUeXBlIHR5cGUpIHsKLSAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOwotICAgIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgRkQ6OkJMT0I6IGNvdXQgPDwgImJsb2IgIjsgYnJlYWs7Ci0gICAgY2FzZSBGRDo6RkxPQVQ6IGNvdXQgPDwgImZsb2F0ICI7IGJyZWFrOwotICAgIGNhc2UgRkQ6OklOVDMyOiBjb3V0IDw8ICJpbnQzMl90ICI7IGJyZWFrOwotICAgIGNhc2UgRkQ6OklOVDY0OiBjb3V0IDw8ICJpbnQ2NF90ICI7IGJyZWFrOwotICAgIGNhc2UgRkQ6OlVJTlQzMjogY291dCA8PCAidWludDMyX3QgIjsgYnJlYWs7Ci0gICAgY2FzZSBGRDo6VUlOVDY0OiBjb3V0IDw8ICJ1aW50NjRfdCAiOyBicmVhazsKLSAgICBjYXNlIEZEOjpTVFJJTkc6IGNvdXQgPDwgImNoYXIgIjsgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgY291dCA8PCAic3RydWN0ICI7Ci0gICAgICAgIGR1bXBUeXBlKChDMlBhcmFtOjpUeXBlKXR5cGUpOwotICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXZvaWQgZHVtcFN0cnVjdChjb25zdCBDMlN0cnVjdERlc2NyaXB0b3IgJnNkKSB7Ci0gICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLSAgICBjb3V0IDw8ICJzdHJ1Y3QgIjsKLSAgICBkdW1wVHlwZShzZC5iYXNlSW5kZXgoKSk7Ci0gICAgY291dCA8PCAiIHsiIDw8IGVuZGw7Ci0gICAgLy9DMkZpZWxkRGVzY3JpcHRvciAmZjsKLSAgICBmb3IgKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZmIDogc2QpIHsKLSAgICAgICAgUHJpbnRUbyhmLCAmY291dCk7Ci0gICAgICAgIGNvdXQgPDwgZW5kbDsKLQotICAgICAgICBpZiAoZi5uYW1lZFZhbHVlcygpLnNpemUoKSkgewotICAgICAgICAgICAgY291dCA8PCAiLm5hbWVkKCI7Ci0gICAgICAgICAgICBjb25zdCBjaGFyICpzZXAgPSAiIjsKLSAgICAgICAgICAgIGZvciAoY29uc3QgRkQ6Om5hbWVkX3ZhbHVlX3R5cGUgJnAgOiBmLm5hbWVkVmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBjb3V0IDw8IHNlcCA8PCBwLmZpcnN0IDw8ICI9IjsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGYudHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBDMlZhbHVlOjpJTlQzMjogY291dCA8PCBnZXQocC5zZWNvbmQsIChpbnQzMl90ICopMCk7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgQzJWYWx1ZTo6SU5UNjQ6IGNvdXQgPDwgZ2V0KHAuc2Vjb25kLCAoaW50NjRfdCAqKTApOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEMyVmFsdWU6OlVJTlQzMjogY291dCA8PCBnZXQocC5zZWNvbmQsICh1aW50MzJfdCAqKTApOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEMyVmFsdWU6OlVJTlQ2NDogY291dCA8PCBnZXQocC5zZWNvbmQsICh1aW50NjRfdCAqKTApOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEMyVmFsdWU6OkZMT0FUOiBjb3V0IDw8IGdldChwLnNlY29uZCwgKGZsb2F0ICopMCk7IGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGNvdXQgPDwgIj8/PyI7IGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZXAgPSAiLCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb3V0IDw8ICIpIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGNvdXQgPDwgIn07IiA8PCBlbmRsOwotfQotCi12b2lkIGR1bXBEZXNjKGNvbnN0IEMyUGFyYW1EZXNjcmlwdG9yICZwZCkgewotICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0gICAgaWYgKHBkLmlzUmVxdWlyZWQoKSkgewotICAgICAgICBjb3V0IDw8ICJyZXF1aXJlZCAiOwotICAgIH0KLSAgICBpZiAocGQuaXNQZXJzaXN0ZW50KCkpIHsKLSAgICAgICAgY291dCA8PCAicGVyc2lzdGVudCAiOwotICAgIH0KLSAgICBjb3V0IDw8ICJzdHJ1Y3QgIjsKLSAgICBkdW1wVHlwZShwZC50eXBlKCkpOwotICAgIGNvdXQgPDwgIiAiIDw8IHBkLm5hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLX0KLQotVEVTVF9GKEMyUGFyYW1UZXN0LCBSZWZsZWN0b3JUZXN0KSB7Ci0gICAgQzJDb21wb25lbnREb21haW5JbmZvIGRvbWFpbkluZm87Ci0gICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBjb21wKG5ldyBNeUNvbXBvbmVudEluc3RhbmNlKTsKLSAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzPiB2YWx1ZXM7Ci0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjewotICAgICAgICBjb21wLT5nZXRQYXJhbVJlZmxlY3RvcigpLT5kZXNjcmliZShDMkNvbXBvbmVudERvbWFpbkluZm86OmluZGV4RmxhZ3MpfTsKLSAgICBkdW1wU3RydWN0KCpkZXNjKTsKLQotICAgIEVYUEVDVF9FUSgKLSAgICAgICAgQzJfT0ssCi0gICAgICAgIGNvbXAtPmdldFN1cHBvcnRlZFZhbHVlcygKLSAgICAgICAgICAgIHsgQzJQYXJhbUZpZWxkKCZkb21haW5JbmZvLCAmQzJDb21wb25lbnREb21haW5JbmZvOjptVmFsdWUpIH0sCi0gICAgICAgICAgICAmdmFsdWVzKQotICAgICk7Ci0KLSAgICBmb3IgKGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnN2IDogdmFsdWVzKSB7Ci0gICAgICAgIGR1bXBGU1Yoc3YsICZkb21haW5JbmZvLm1WYWx1ZSk7Ci0gICAgfQotfQotCi1DMkVOVU0oRW51bTEsIHVpbnQzMl90LAotICAgIEVudW0xVmFsdWUxLAotICAgIEVudW0xVmFsdWUyLAotICAgIEVudW0xVmFsdWU0ID0gRW51bTFWYWx1ZTIgKyAyLAotKTsKLQotQzJFTlVNX0NVU1RPTV9QUkVGSVgoRW51bTIsIHVpbnQzMl90LCAiRW51bSIsCi0gICAgRW51bTJWYWx1ZTEsCi0gICAgRW51bTJWYWx1ZTIsCi0gICAgRW51bTJWYWx1ZTQgPSBFbnVtMVZhbHVlMiArIDIsCi0pOwotCi1DMkVOVU1fQ1VTVE9NX05BTUVTKEVudW0zLCB1aW50OF90LAotICAgICh7IHsgInZhbHVlMSIsIEVudW0zVmFsdWUxIH0sCi0gICAgICAgeyAidmFsdWUyIiwgRW51bTNWYWx1ZTIgfSwKLSAgICAgICB7ICJ2YWx1ZTQiLCBFbnVtM1ZhbHVlNCB9LAotICAgICAgIHsgImludmFsaWQiLCBJbnZhbGlkIH0gfSksCi0gICAgRW51bTNWYWx1ZTEsCi0gICAgRW51bTNWYWx1ZTIsCi0gICAgRW51bTNWYWx1ZTQgPSBFbnVtM1ZhbHVlMiArIDIsCi0gICAgSW52YWxpZCwKLSk7Ci0KLVRFU1RfRihDMlBhcmFtVGVzdCwgRW51bVV0aWxzVGVzdCkgewotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxDMlN0cmluZywgRW51bTM+PiBwYWlycyAoIHsgeyAidmFsdWUxIiwgRW51bTNWYWx1ZTEgfSwKLSAgICAgIHsgInZhbHVlMiIsIEVudW0zVmFsdWUyIH0sCi0gICAgICB7ICJ2YWx1ZTQiLCBFbnVtM1ZhbHVlNCB9LAotICAgICAgeyAiaW52YWxpZCIsIEludmFsaWQgfSB9KTsKLSAgICBFbnVtMyBlMzsKLSAgICBGRDo6bmFtZWRWYWx1ZXNGb3IoZTMpOwotfQotCi1URVNUX0YoQzJQYXJhbVRlc3QsIFBhcmFtVXRpbHNUZXN0KSB7Ci0gICAgLy8gdXBwZXIgY2FzZQotICAgIEVYUEVDVF9FUSgieWVzIiwgQzJQYXJhbVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiWUVTIikpOwotICAgIEVYUEVDVF9FUSgibm8iLCBDMlBhcmFtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJOTyIpKTsKLSAgICBFWFBFQ1RfRVEoInllcy1ubyIsIEMyUGFyYW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIllFU19OTyIpKTsKLSAgICBFWFBFQ1RfRVEoInllcy1ubyIsIEMyUGFyYW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIllFU19fTk8iKSk7Ci0gICAgRVhQRUNUX0VRKCJhMmRwIiwgQzJQYXJhbVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiQTJEUCIpKTsKLSAgICBFWFBFQ1RfRVEoIm1wMi10cyIsIEMyUGFyYW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIk1QMl9UUyIpKTsKLSAgICBFWFBFQ1RfRVEoImJsb2NrLTJkIiwgQzJQYXJhbVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiQkxPQ0tfMkQiKSk7Ci0gICAgRVhQRUNUX0VRKCJtcGVnLTItdHMiLCBDMlBhcmFtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJNUEVHXzJfVFMiKSk7Ci0gICAgRVhQRUNUX0VRKCJfaGlkZGVuLXZhbHVlIiwgQzJQYXJhbVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiX0hJRERFTl9WQUxVRSIpKTsKLSAgICBFWFBFQ1RfRVEoIl9faGlkZGVuLXZhbHVlMiIsIEMyUGFyYW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIl9fSElEREVOX1ZBTFVFMiIpKTsKLSAgICBFWFBFQ1RfRVEoIl9faGlkZGVuLXZhbHVlLTIiLCBDMlBhcmFtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJfX0hJRERFTl9WQUxVRV8yIikpOwotCi0gICAgLy8gY2FtZWwgY2FzZQotICAgIEVYUEVDVF9FUSgieWVzIiwgQzJQYXJhbVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiWWVzIikpOwotICAgIEVYUEVDVF9FUSgibm8iLCBDMlBhcmFtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJObyIpKTsKLSAgICBFWFBFQ1RfRVEoInllcy1ubyIsIEMyUGFyYW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIlllc05vIikpOwotICAgIEVYUEVDVF9FUSgieWVzLW5vIiwgQzJQYXJhbVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiWWVzX05vIikpOwotICAgIEVYUEVDVF9FUSgibXAyLXRzIiwgQzJQYXJhbVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiTVAyVHMiKSk7Ci0gICAgRVhQRUNUX0VRKCJibG9jay0yZCIsIEMyUGFyYW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIkJsb2NrMkQiKSk7Ci0gICAgRVhQRUNUX0VRKCJtcGVnLTItdHMiLCBDMlBhcmFtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJNcGVnMnRzIikpOwotICAgIEVYUEVDVF9FUSgiX2hpZGRlbi12YWx1ZSIsIEMyUGFyYW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIl9IaWRkZW5WYWx1ZSIpKTsKLSAgICBFWFBFQ1RfRVEoIl9faGlkZGVuLXZhbHVlLTIiLCBDMlBhcmFtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJfX0hpZGRlblZhbHVlMiIpKTsKLQotICAgIC8vIG1peGVkIGNhc2UKLSAgICBFWFBFQ1RfRVEoIm1wMnQtcyIsIEMyUGFyYW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIk1QMlRfcyIpKTsKLSAgICBFWFBFQ1RfRVEoImJsb2NrLTJkIiwgQzJQYXJhbVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiQmxvY2tfMkQiKSk7Ci0gICAgRVhQRUNUX0VRKCJibG9jay0yLWQiLCBDMlBhcmFtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJCbG9jazJfRCIpKTsKLSAgICBFWFBFQ1RfRVEoIm1wZWctMi10cyIsIEMyUGFyYW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIk1wZWdfMnRzIikpOwotICAgIEVYUEVDVF9FUSgibXBlZy0yLXRzIiwgQzJQYXJhbVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiTXBlZ18yX1RTIikpOwotICAgIEVYUEVDVF9FUSgiX2hpZGRlbi12YWx1ZSIsIEMyUGFyYW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIl9IaWRkZW5fX1ZBTFVFIikpOwotICAgIEVYUEVDVF9FUSgiX19oaWRkZW4tdmFsdWUtMiIsIEMyUGFyYW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIl9fSGlkZGVuVmFsdWVfMiIpKTsKLSAgICBFWFBFQ1RfRVEoIl8yIiwgQzJQYXJhbVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiXzIiKSk7Ci0gICAgRVhQRUNUX0VRKCJfXzIzIiwgQzJQYXJhbVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiX18yMyIpKTsKLX0KLQotVEVTVF9GKEMyUGFyYW1UZXN0LCBDMlZhbHVlVGVzdCkgewotICAgIEMyVmFsdWUgdmFsOwotICAgIGludDMyX3QgaTMyID0gLTMyOwotICAgIGludDY0X3QgaTY0ID0gLTY0OwotICAgIHVpbnQzMl90IHUzMiA9IDMyOwotICAgIHVpbnQ2NF90IHU2NCA9IDY0OwotICAgIGZsb2F0IGZwID0gMS41ZjsKLQotICAgIEVYUEVDVF9FUShDMlZhbHVlOjpOT19JTklULCB2YWwudHlwZSgpKTsKLSAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJmkzMikpOwotICAgIEVYUEVDVF9FUSgtMzIsIGkzMik7Ci0gICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZpNjQpKTsKLSAgICBFWFBFQ1RfRVEoLTY0LCBpNjQpOwotICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmdTMyKSk7Ci0gICAgRVhQRUNUX0VRKDMydSwgdTMyKTsKLSAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJnU2NCkpOwotICAgIEVYUEVDVF9FUSg2NHUsIHU2NCk7Ci0gICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZmcCkpOwotICAgIEVYUEVDVF9FUSgxLjVmLCBmcCk7Ci0KLSAgICB2YWwgPSBpbnQzMl90KC0zMjE2KTsKLSAgICBFWFBFQ1RfRVEoQzJWYWx1ZTo6SU5UMzIsIHZhbC50eXBlKCkpOwotICAgIEVYUEVDVF9FUSh0cnVlLCB2YWwuZ2V0KCZpMzIpKTsKLSAgICBFWFBFQ1RfRVEoLTMyMTYsIGkzMik7Ci0gICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZpNjQpKTsKLSAgICBFWFBFQ1RfRVEoLTY0LCBpNjQpOwotICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmdTMyKSk7Ci0gICAgRVhQRUNUX0VRKDMydSwgdTMyKTsKLSAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJnU2NCkpOwotICAgIEVYUEVDVF9FUSg2NHUsIHU2NCk7Ci0gICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZmcCkpOwotICAgIEVYUEVDVF9FUSgxLjVmLCBmcCk7Ci0KLSAgICB2YWwgPSB1aW50MzJfdCgzMjE2KTsKLSAgICBFWFBFQ1RfRVEoQzJWYWx1ZTo6VUlOVDMyLCB2YWwudHlwZSgpKTsKLSAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJmkzMikpOwotICAgIEVYUEVDVF9FUSgtMzIxNiwgaTMyKTsKLSAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJmk2NCkpOwotICAgIEVYUEVDVF9FUSgtNjQsIGk2NCk7Ci0gICAgRVhQRUNUX0VRKHRydWUsIHZhbC5nZXQoJnUzMikpOwotICAgIEVYUEVDVF9FUSgzMjE2dSwgdTMyKTsKLSAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJnU2NCkpOwotICAgIEVYUEVDVF9FUSg2NHUsIHU2NCk7Ci0gICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZmcCkpOwotICAgIEVYUEVDVF9FUSgxLjVmLCBmcCk7Ci0KLSAgICB2YWwgPSBpbnQ2NF90KC02NDMyKTsKLSAgICBFWFBFQ1RfRVEoQzJWYWx1ZTo6SU5UNjQsIHZhbC50eXBlKCkpOwotICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmaTMyKSk7Ci0gICAgRVhQRUNUX0VRKC0zMjE2LCBpMzIpOwotICAgIEVYUEVDVF9FUSh0cnVlLCB2YWwuZ2V0KCZpNjQpKTsKLSAgICBFWFBFQ1RfRVEoLTY0MzIsIGk2NCk7Ci0gICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZ1MzIpKTsKLSAgICBFWFBFQ1RfRVEoMzIxNnUsIHUzMik7Ci0gICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZ1NjQpKTsKLSAgICBFWFBFQ1RfRVEoNjR1LCB1NjQpOwotICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmZnApKTsKLSAgICBFWFBFQ1RfRVEoMS41ZiwgZnApOwotCi0gICAgdmFsID0gdWludDY0X3QoNjQzMik7Ci0gICAgRVhQRUNUX0VRKEMyVmFsdWU6OlVJTlQ2NCwgdmFsLnR5cGUoKSk7Ci0gICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZpMzIpKTsKLSAgICBFWFBFQ1RfRVEoLTMyMTYsIGkzMik7Ci0gICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZpNjQpKTsKLSAgICBFWFBFQ1RfRVEoLTY0MzIsIGk2NCk7Ci0gICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZ1MzIpKTsKLSAgICBFWFBFQ1RfRVEoMzIxNnUsIHUzMik7Ci0gICAgRVhQRUNUX0VRKHRydWUsIHZhbC5nZXQoJnU2NCkpOwotICAgIEVYUEVDVF9FUSg2NDMydSwgdTY0KTsKLSAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJmZwKSk7Ci0gICAgRVhQRUNUX0VRKDEuNWYsIGZwKTsKLQotICAgIHZhbCA9IDE1LjI1ZjsKLSAgICBFWFBFQ1RfRVEoQzJWYWx1ZTo6RkxPQVQsIHZhbC50eXBlKCkpOwotICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmaTMyKSk7Ci0gICAgRVhQRUNUX0VRKC0zMjE2LCBpMzIpOwotICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmaTY0KSk7Ci0gICAgRVhQRUNUX0VRKC02NDMyLCBpNjQpOwotICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmdTMyKSk7Ci0gICAgRVhQRUNUX0VRKDMyMTZ1LCB1MzIpOwotICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmdTY0KSk7Ci0gICAgRVhQRUNUX0VRKDY0MzJ1LCB1NjQpOwotICAgIEVYUEVDVF9FUSh0cnVlLCB2YWwuZ2V0KCZmcCkpOwotICAgIEVYUEVDVF9FUSgxNS4yNWYsIGZwKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL3Rlc3RzL0MyX3Rlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL3Rlc3RzL0MyX3Rlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmEzZDkxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi90ZXN0cy9DMl90ZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiQzJfdGVzdCIKLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlIDxDMi5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTVEFUSUMgVEVTVFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLXRlbXBsYXRlPGludCBOPgotc3RydWN0IGMyX2NvbnN0X2NoZWNrZXIKLXsKLSAgICBpbmxpbmUgY29uc3RleHByIHN0YXRpYyBpbnQgbnVtKCkgeyByZXR1cm4gTjsgfQotfTsKLQotY29uc3RleHByIGF1dG8gbWluX2kzMl9pMzIgPSBjMl9taW4oaW50MzJfdCgxKSwgaW50MzJfdCgyKSk7Ci1zdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShtaW5faTMyX2kzMiksIGNvbnN0IGludDMyX3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSBpbnQzMl90Iik7Ci1jb25zdGV4cHIgYXV0byBtaW5faTMyX2k2NCA9IGMyX21pbihpbnQzMl90KDMpLCBpbnQ2NF90KDIpKTsKLXN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKG1pbl9pMzJfaTY0KSwgY29uc3QgaW50NjRfdD46OnZhbHVlLCAic2hvdWxkIGJlIGludDY0X3QiKTsKLWNvbnN0ZXhwciBhdXRvIG1pbl9pOF9pMzIgPSBjMl9taW4oaW50OF90KDB4ZmYpLCBpbnQzMl90KDB4ZmZmZmZmZmYpKTsKLXN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKG1pbl9pOF9pMzIpLCBjb25zdCBpbnQzMl90Pjo6dmFsdWUsICJzaG91bGQgYmUgaW50MzJfdCIpOwotCi1zdGF0aWNfYXNzZXJ0KGMyX2NvbnN0X2NoZWNrZXI8bWluX2kzMl9pMzI+OjpudW0oKSA9PSAxLCAic2hvdWxkIGJlIDEiKTsKLXN0YXRpY19hc3NlcnQoYzJfY29uc3RfY2hlY2tlcjxtaW5faTMyX2k2ND46Om51bSgpID09IDIsICJzaG91bGQgYmUgMiIpOwotc3RhdGljX2Fzc2VydChjMl9jb25zdF9jaGVja2VyPG1pbl9pOF9pMzI+OjpudW0oKSA9PSAweGZmZmZmZmZmLCAic2hvdWxkIGJlIDB4ZmZmZmZmZmYiKTsKLQotY29uc3RleHByIGF1dG8gbWluX3UzMl91MzIgPSBjMl9taW4odWludDMyX3QoMSksIHVpbnQzMl90KDIpKTsKLXN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKG1pbl91MzJfdTMyKSwgY29uc3QgdWludDMyX3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSB1aW50MzJfdCIpOwotY29uc3RleHByIGF1dG8gbWluX3UzMl91NjQgPSBjMl9taW4odWludDMyX3QoMyksIHVpbnQ2NF90KDIpKTsKLXN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKG1pbl91MzJfdTY0KSwgY29uc3QgdWludDMyX3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSB1aW50MzJfdCIpOwotY29uc3RleHByIGF1dG8gbWluX3UzMl91OCA9IGMyX21pbih1aW50MzJfdCgweGZmZmZmZmZmKSwgdWludDhfdCgweGZmKSk7Ci1zdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShtaW5fdTMyX3U4KSwgY29uc3QgdWludDhfdD46OnZhbHVlLCAic2hvdWxkIGJlIHVpbnQ4X3QiKTsKLQotc3RhdGljX2Fzc2VydChjMl9jb25zdF9jaGVja2VyPG1pbl91MzJfdTMyPjo6bnVtKCkgPT0gMSwgInNob3VsZCBiZSAxIik7Ci1zdGF0aWNfYXNzZXJ0KGMyX2NvbnN0X2NoZWNrZXI8bWluX3UzMl91NjQ+OjpudW0oKSA9PSAyLCAic2hvdWxkIGJlIDIiKTsKLXN0YXRpY19hc3NlcnQoYzJfY29uc3RfY2hlY2tlcjxtaW5fdTMyX3U4Pjo6bnVtKCkgPT0gMHhmZiwgInNob3VsZCBiZSAweGZmIik7Ci0KLWNvbnN0ZXhwciBhdXRvIG1heF9pMzJfaTMyID0gYzJfbWF4KGludDMyX3QoMSksIGludDMyX3QoMikpOwotc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUobWF4X2kzMl9pMzIpLCBjb25zdCBpbnQzMl90Pjo6dmFsdWUsICJzaG91bGQgYmUgaW50MzJfdCIpOwotY29uc3RleHByIGF1dG8gbWF4X2kzMl9pNjQgPSBjMl9tYXgoaW50MzJfdCgzKSwgaW50NjRfdCgyKSk7Ci1zdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShtYXhfaTMyX2k2NCksIGNvbnN0IGludDY0X3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSBpbnQ2NF90Iik7Ci1jb25zdGV4cHIgYXV0byBtYXhfaThfaTMyID0gYzJfbWF4KGludDhfdCgweGZmKSwgaW50MzJfdCgweGZmZmZmZmZmKSk7Ci1zdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShtYXhfaThfaTMyKSwgY29uc3QgaW50MzJfdD46OnZhbHVlLCAic2hvdWxkIGJlIGludDMyX3QiKTsKLQotc3RhdGljX2Fzc2VydChjMl9jb25zdF9jaGVja2VyPG1heF9pMzJfaTMyPjo6bnVtKCkgPT0gMiwgInNob3VsZCBiZSAyIik7Ci1zdGF0aWNfYXNzZXJ0KGMyX2NvbnN0X2NoZWNrZXI8bWF4X2kzMl9pNjQ+OjpudW0oKSA9PSAzLCAic2hvdWxkIGJlIDMiKTsKLXN0YXRpY19hc3NlcnQoYzJfY29uc3RfY2hlY2tlcjxtYXhfaThfaTMyPjo6bnVtKCkgPT0gMHhmZmZmZmZmZiwgInNob3VsZCBiZSAweGZmZmZmZmZmIik7Ci0KLWNvbnN0ZXhwciBhdXRvIG1heF91MzJfdTMyID0gYzJfbWF4KHVpbnQzMl90KDEpLCB1aW50MzJfdCgyKSk7Ci1zdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShtYXhfdTMyX3UzMiksIGNvbnN0IHVpbnQzMl90Pjo6dmFsdWUsICJzaG91bGQgYmUgdWludDMyX3QiKTsKLWNvbnN0ZXhwciBhdXRvIG1heF91MzJfdTY0ID0gYzJfbWF4KHVpbnQzMl90KDMpLCB1aW50NjRfdCgyKSk7Ci1zdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShtYXhfdTMyX3U2NCksIGNvbnN0IHVpbnQ2NF90Pjo6dmFsdWUsICJzaG91bGQgYmUgdWludDY0X3QiKTsKLWNvbnN0ZXhwciBhdXRvIG1heF91MzJfdTggPSBjMl9tYXgodWludDMyX3QoMHg3ZmZmZmZmZiksIHVpbnQ4X3QoMHhmZikpOwotc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUobWF4X3UzMl91OCksIGNvbnN0IHVpbnQzMl90Pjo6dmFsdWUsICJzaG91bGQgYmUgdWludDMyX3QiKTsKLQotc3RhdGljX2Fzc2VydChjMl9jb25zdF9jaGVja2VyPG1heF91MzJfdTMyPjo6bnVtKCkgPT0gMiwgInNob3VsZCBiZSAyIik7Ci1zdGF0aWNfYXNzZXJ0KGMyX2NvbnN0X2NoZWNrZXI8bWF4X3UzMl91NjQ+OjpudW0oKSA9PSAzLCAic2hvdWxkIGJlIDMiKTsKLXN0YXRpY19hc3NlcnQoYzJfY29uc3RfY2hlY2tlcjxtYXhfdTMyX3U4Pjo6bnVtKCkgPT0gMHg3ZmZmZmZmZiwgInNob3VsZCBiZSAweDdmZmZmZmZmIik7Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi90ZXN0cy92bmRrL0MyVXRpbFRlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL3Rlc3RzL3ZuZGsvQzJVdGlsVGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMTM3NGIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL3Rlc3RzL3ZuZGsvQzJVdGlsVGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHV0aWwvX0MyTWFjcm9VdGlscy5oPgotCi0vKiogXGZpbGUKLSAqIFRlc3RzIGZvciB2bmRrL3V0aWwuCi0gKi8KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIF9DMk1hY3JvVXRpbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXN0YXRpY19hc3NlcnQoMCA9PSBfQzJfQVJHQygpLCAic2hvdWxkIGJlIDAiKTsKLXN0YXRpY19hc3NlcnQoMSA9PSBfQzJfQVJHQygxKSwgInNob3VsZCBiZSAxIik7Ci1zdGF0aWNfYXNzZXJ0KDIgPT0gX0MyX0FSR0MoMSwgMiksICJzaG91bGQgYmUgMiIpOwotc3RhdGljX2Fzc2VydCg2NCA9PSBfQzJfQVJHQygKLSAgICAgICAgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsCi0gICAgICAgIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0OCwKLSAgICAgICAgNDksIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LCA2MCwgNjEsIDYyLCA2MywgNjQpLCAic2hvdWxkIGJlIDY0Iik7Ci0KLXN0YXRpY19hc3NlcnQoMCA9PSBfQzJfQVJHQygsKSwgInNob3VsZCBiZSAwIik7Ci1zdGF0aWNfYXNzZXJ0KDEgPT0gX0MyX0FSR0MoMSwpLCAic2hvdWxkIGJlIDEiKTsKLXN0YXRpY19hc3NlcnQoMiA9PSBfQzJfQVJHQygxLCAyLCksICJzaG91bGQgYmUgMiIpOwotc3RhdGljX2Fzc2VydCg2NCA9PSBfQzJfQVJHQygKLSAgICAgICAgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsCi0gICAgICAgIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0OCwKLSAgICAgICAgNDksIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LCA2MCwgNjEsIDYyLCA2MywgNjQsKSwgInNob3VsZCBiZSA2NCIpOwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJQYXJhbVV0aWxzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJQYXJhbVV0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkYWUzMDMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyUGFyYW1VdGlscy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEMyVVRJTFNfUEFSQU1fVVRJTFNfSF8KLSNkZWZpbmUgQzJVVElMU19QQVJBTV9VVElMU19IXwotCi0jaW5jbHVkZSA8QzJQYXJhbS5oPgotI2luY2x1ZGUgPHV0aWwvX0MyTWFjcm9VdGlscy5oPgotCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0KLS8qKiBcZmlsZQotICogVXRpbGl0aWVzIGZvciBwYXJhbWV0ZXIgaGFuZGxpbmcgdG8gYmUgdXNlZCBieSBDb2RlYzIgaW1wbGVtZW50YXRpb25zLgotICovCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8vIFxjb25kIElOVEVSTkFMCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVRJTElUSUVTIEZPUiBFTlVNRVJBVElPTiBSRUZMRUNUSU9OIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHRoYXQgYWxsb3dzIGlnbm9yaW5nIGVudW0gdmFsdWUgYXNzaWdubWVudCAoZS5nLiBib3RoICcoX0MyRW51bUNvbnN0KWtWYWx1ZSA9IHgnCi0gKiBhbmQgJyhfQzJFbnVtQ29uc3Qpa1ZhbHVlJyB3aWxsIGV2YWwgdG8ga1ZhbHVlLgotICovCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotY2xhc3MgX0MyRW51bUNvbnN0IHsKLXB1YmxpYzoKLSAgICAvLyBpbXBsaWNpdCBjb252ZXJzaW9uIGZyb20gVAotICAgIGlubGluZSBfQzJFbnVtQ29uc3QoVCB2YWx1ZSkgOiBfbVZhbHVlKHZhbHVlKSB7fQotICAgIC8vIGltcGxpY2l0IGNvbnZlcnNpb24gdG8gVAotICAgIGlubGluZSBvcGVyYXRvciBUKCkgeyByZXR1cm4gX21WYWx1ZTsgfQotICAgIC8vIGltcGxpY2l0IGNvbnZlcnNpb24gdG8gQzJWYWx1ZTo6UHJpbWl0aXZlCi0gICAgaW5saW5lIG9wZXJhdG9yIEMyVmFsdWU6OlByaW1pdGl2ZSgpIHsgcmV0dXJuIChUKV9tVmFsdWU7IH0KLSAgICAvLyBpZ25vcmUgYXNzaWdubWVudCBhbmQgcmV0dXJuIFQgaGVyZSB0byBhdm9pZCBpbXBsaWNpdCBjb252ZXJzaW9uIHRvIFQgbGF0ZXIKLSAgICBpbmxpbmUgVCAmb3BlcmF0b3IgPShUIHZhbHVlIF9fdW51c2VkKSB7IHJldHVybiBfbVZhbHVlOyB9Ci1wcml2YXRlOgotICAgIFQgX21WYWx1ZTsKLX07Ci0KLS8vLyBtYXBwZXIgdG8gZ2V0IG5hbWUgb2YgZW51bQotLy8vIFxub3RlIHRoaXMgd2lsbCBjb250YWluIGFueSBpbml0aWFsaXphdGlvbiwgd2hpY2ggd2Ugd2lsbCByZW1vdmUgd2hlbiBjb252ZXJ0aW5nIHRvIGxvd2VyLWNhc2UKLSNkZWZpbmUgX0MyX0dFVF9FTlVNX05BTUUoeCwgeSkgI3gKLS8vLyBtYXBwZXIgdG8gZ2V0IHZhbHVlIG9mIGVudW0KLSNkZWZpbmUgX0MyX0dFVF9FTlVNX1ZBTFVFKHgsIHR5cGUpIChfQzJFbnVtQ29uc3Q8dHlwZT4peAotCi0vLy8gXGVuZGNvbmQKLQotI2RlZmluZSBERUZJTkVfQzJfRU5VTV9WQUxVRV9BVVRPX0hFTFBFUihuYW1lLCB0eXBlLCBwcmVmaXgsIC4uLikgXAotdGVtcGxhdGU8PiBDMkZpZWxkRGVzY3JpcHRvcjo6bmFtZWRfdmFsdWVzX3R5cGUgQzJGaWVsZERlc2NyaXB0b3I6Om5hbWVkVmFsdWVzRm9yKGNvbnN0IG5hbWUgJnIgX191bnVzZWQpIHsgXAotICAgIHJldHVybiBDMlBhcmFtVXRpbHM6OnNhbml0aXplRW51bVZhbHVlcyggXAotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJWYWx1ZTo6UHJpbWl0aXZlPiB7IF9DMl9NQVAoX0MyX0dFVF9FTlVNX1ZBTFVFLCB0eXBlLCBfX1ZBX0FSR1NfXykgfSwgXAotICAgICAgICAgICAgeyBfQzJfTUFQKF9DMl9HRVRfRU5VTV9OQU1FLCB0eXBlLCBfX1ZBX0FSR1NfXykgfSwgXAotICAgICAgICAgICAgcHJlZml4KTsgXAotfQotCi0jZGVmaW5lIERFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVIobmFtZSwgdHlwZSwgbmFtZXMsIC4uLikgXAotdGVtcGxhdGU8PiBDMkZpZWxkRGVzY3JpcHRvcjo6bmFtZWRfdmFsdWVzX3R5cGUgQzJGaWVsZERlc2NyaXB0b3I6Om5hbWVkVmFsdWVzRm9yKGNvbnN0IG5hbWUgJnIgX191bnVzZWQpIHsgXAotICAgIHJldHVybiBDMlBhcmFtVXRpbHM6OmN1c3RvbUVudW1WYWx1ZXMoIFwKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxDMlN0cmluZ0xpdGVyYWwsIG5hbWU+PiBuYW1lcyk7IFwKLX0KLQotCi1jbGFzcyBDMlBhcmFtVXRpbHMgewotcHJpdmF0ZToKLSAgICBzdGF0aWMgc2l6ZV90IGNvdW50TGVhZGluZ1VuZGVyc2NvcmVzKEMyU3RyaW5nTGl0ZXJhbCBhKSB7Ci0gICAgICAgIHNpemVfdCBpID0gMDsKLSAgICAgICAgd2hpbGUgKGFbaV0gPT0gJ18nKSB7Ci0gICAgICAgICAgICArK2k7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGk7Ci0gICAgfQotCi0gICAgc3RhdGljIHNpemVfdCBjb3VudE1hdGNoaW5nKEMyU3RyaW5nTGl0ZXJhbCBhLCBjb25zdCBDMlN0cmluZyAmYikgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGIuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIGlmICghYVtpXSB8fCBhW2ldICE9IGJbaV0pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYi5zaXplKCk7Ci0gICAgfQotCi0gICAgLy8gQUJDRGVmID0+IGFiYy1kZWYKLSAgICAvLyBBQkNEMmVmID0+IGFiY2QyLWVmIC8vIDAKLSAgICAvLyBBQkNEMkVmID0+IGFuY2QyLWVmIC8vIC0xCi0gICAgLy8gQWJjRGVmID0+IGFiYy1kZWYgLy8gLTEKLSAgICAvLyBBYmMyRGVmID0+IGFiYy0yZGVmCi0gICAgLy8gQWJjMmRlZiA9PiBhYmMtMi1kZWYKLSAgICAvLyBfWW8gPT4gX3lvCi0gICAgLy8gX3lvID0+IF95bwotICAgIC8vIEMyX3lvID0+IGMyLXlvCi0gICAgLy8gQzJfX3lvID0+IGMyLXlvCi0KLSAgICBzdGF0aWMgQzJTdHJpbmcgY2FtZWxDYXNlVG9EYXNoZWQoQzJTdHJpbmcgbmFtZSkgewotICAgICAgICBlbnVtIHsKLSAgICAgICAgICAgIGtOb25lID0gJy4nLAotICAgICAgICAgICAga0xvd2VyID0gJ2EnLAotICAgICAgICAgICAga1VwcGVyID0gJ0EnLAotICAgICAgICAgICAga0RpZ2l0ID0gJzEnLAotICAgICAgICAgICAga0Rhc2ggPSAnLScsCi0gICAgICAgICAgICBrVW5kZXJzY29yZSA9ICdfJywKLSAgICAgICAgfSB0eXBlID0ga05vbmU7Ci0gICAgICAgIHNpemVfdCB3b3JkX3N0YXJ0ID0gMDsKLSAgICAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IG5hbWUuc2l6ZSgpOyArK2l4KSB7Ci0gICAgICAgICAgICAvKiBzdGQ6OmNvdXQgPDwgbmFtZS5zdWJzdHIoMCwgd29yZF9zdGFydCkgPDwgInwiCi0gICAgICAgICAgICAgICAgICAgIDw8IG5hbWUuc3Vic3RyKHdvcmRfc3RhcnQsIGl4IC0gd29yZF9zdGFydCkgPDwgIlsiCi0gICAgICAgICAgICAgICAgICAgIDw8IG5hbWUuc3Vic3RyKGl4LCAxKSA8PCAiXSIgPDwgbmFtZS5zdWJzdHIoaXggKyAxKQotICAgICAgICAgICAgICAgICAgICA8PCAiOiAiIDw8IChjaGFyKXR5cGUgPDwgc3RkOjplbmRsOyAqLwotICAgICAgICAgICAgaWYgKGlzdXBwZXIobmFtZVtpeF0pKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0ga0xvd2VyKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWUuaW5zZXJ0KGl4KyssIDEsICctJyk7Ci0gICAgICAgICAgICAgICAgICAgIHdvcmRfc3RhcnQgPSBpeDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbmFtZVtpeF0gPSB0b2xvd2VyKG5hbWVbaXhdKTsKLSAgICAgICAgICAgICAgICB0eXBlID0ga1VwcGVyOwotICAgICAgICAgICAgfSBlbHNlIGlmIChpc2xvd2VyKG5hbWVbaXhdKSkgewotICAgICAgICAgICAgICAgIGlmICh0eXBlID09IGtEaWdpdCAmJiBpeCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbmFtZS5pbnNlcnQoaXgrKywgMSwgJy0nKTsKLSAgICAgICAgICAgICAgICAgICAgd29yZF9zdGFydCA9IGl4OwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBrVXBwZXIgJiYgaXggPiB3b3JkX3N0YXJ0ICsgMSkgewotICAgICAgICAgICAgICAgICAgICBuYW1lLmluc2VydChpeCsrIC0gMSwgMSwgJy0nKTsKLSAgICAgICAgICAgICAgICAgICAgd29yZF9zdGFydCA9IGl4IC0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdHlwZSA9IGtMb3dlcjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNkaWdpdChuYW1lW2l4XSkpIHsKLSAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBrTG93ZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgbmFtZS5pbnNlcnQoaXgrKywgMSwgJy0nKTsKLSAgICAgICAgICAgICAgICAgICAgd29yZF9zdGFydCA9IGl4OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0eXBlID0ga0RpZ2l0OwotICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lW2l4XSA9PSAnXycpIHsKLSAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBrRGFzaCkgewotICAgICAgICAgICAgICAgICAgICBuYW1lLmVyYXNlKGl4LS0sIDEpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSAhPSBrTm9uZSAmJiB0eXBlICE9IGtVbmRlcnNjb3JlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVbaXhdID0gJy0nOwotICAgICAgICAgICAgICAgICAgICB0eXBlID0ga0Rhc2g7Ci0gICAgICAgICAgICAgICAgICAgIHdvcmRfc3RhcnQgPSBpeCArIDE7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdHlwZSA9IGtVbmRlcnNjb3JlOwotICAgICAgICAgICAgICAgICAgICB3b3JkX3N0YXJ0ID0gaXggKyAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbmFtZS5yZXNpemUoaXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIHN0ZDo6Y291dCA8PCAiPT4gIiA8PCBuYW1lIDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgc3RhdGljIHN0ZDo6dmVjdG9yPEMyU3RyaW5nPiBzYW5pdGl6ZUVudW1WYWx1ZU5hbWVzKAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJTdHJpbmdMaXRlcmFsPiBuYW1lcywKLSAgICAgICAgICAgIEMyU3RyaW5nTGl0ZXJhbCBfcHJlZml4ID0gTlVMTCkgewotICAgICAgICBzdGQ6OnZlY3RvcjxDMlN0cmluZz4gc2FuaXRpemVkTmFtZXM7Ci0gICAgICAgIEMyU3RyaW5nIHByZWZpeDsKLSAgICAgICAgc2l6ZV90IGV4dHJhVW5kZXJzY29yZXMgPSAwOwotICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgaWYgKF9wcmVmaXgpIHsKLSAgICAgICAgICAgIGV4dHJhVW5kZXJzY29yZXMgPSBjb3VudExlYWRpbmdVbmRlcnNjb3JlcyhfcHJlZml4KTsKLSAgICAgICAgICAgIHByZWZpeCA9IF9wcmVmaXggKyBleHRyYVVuZGVyc2NvcmVzOwotICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgIC8vIHN0ZDo6Y291dCA8PCAicHJlZml4OiIgPDwgcHJlZml4IDw8ICIsIHVuZGVyc2NvcmVzOiIgPDwgZXh0cmFVbmRlcnNjb3JlcyA8PCBzdGQ6OmVuZGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjYWxjdWxhdGUgcHJlZml4IGFuZCBtaW5pbXVtIGxlYWRpbmcgdW5kZXJzY29yZXMKLSAgICAgICAgZm9yIChDMlN0cmluZ0xpdGVyYWwgcyA6IG5hbWVzKSB7Ci0gICAgICAgICAgICAvLyBzdGQ6OmNvdXQgPDwgcyA8PCBzdGQ6OmVuZGw7Ci0gICAgICAgICAgICBzaXplX3QgdW5kZXJzY29yZXMgPSBjb3VudExlYWRpbmdVbmRlcnNjb3JlcyhzKTsKLSAgICAgICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgICAgICAgIGV4dHJhVW5kZXJzY29yZXMgPSB1bmRlcnNjb3JlczsKLSAgICAgICAgICAgICAgICBwcmVmaXggPSBzICsgdW5kZXJzY29yZXM7Ci0gICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IG1hdGNoaW5nID0gY291bnRNYXRjaGluZygKLSAgICAgICAgICAgICAgICAgICAgcyArIHVuZGVyc2NvcmVzLAotICAgICAgICAgICAgICAgICAgICBwcmVmaXgpOwotICAgICAgICAgICAgICAgIHByZWZpeC5yZXNpemUobWF0Y2hpbmcpOwotICAgICAgICAgICAgICAgIGV4dHJhVW5kZXJzY29yZXMgPSBzdGQ6Om1pbih1bmRlcnNjb3JlcywgZXh0cmFVbmRlcnNjb3Jlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBzdGQ6OmNvdXQgPDwgInByZWZpeDoiIDw8IHByZWZpeCA8PCAiLCB1bmRlcnNjb3JlczoiIDw8IGV4dHJhVW5kZXJzY29yZXMgPDwgc3RkOjplbmRsOwotICAgICAgICAgICAgaWYgKHByZWZpeC5zaXplKCkgPT0gMCAmJiBleHRyYVVuZGVyc2NvcmVzID09IDApIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHdlIHN3YWxsb3cgdGhlIGZpcnN0IHVuZGVyc2NvcmUgYWZ0ZXIgdXBwZXIgY2FzZSBwcmVmaXhlcwotICAgICAgICBib29sIHVwcGVyQ2FzZVByZWZpeCA9IHRydWU7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcHJlZml4LnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICBpZiAoaXNsb3dlcihwcmVmaXhbaV0pKSB7Ci0gICAgICAgICAgICAgICAgdXBwZXJDYXNlUHJlZml4ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKEMyU3RyaW5nTGl0ZXJhbCBzIDogbmFtZXMpIHsKLSAgICAgICAgICAgIHNpemVfdCB1bmRlcnNjb3JlcyA9IGNvdW50TGVhZGluZ1VuZGVyc2NvcmVzKHMpOwotICAgICAgICAgICAgQzJTdHJpbmcgc2FuaXRpemVkID0gQzJTdHJpbmcocywgdW5kZXJzY29yZXMgLSBleHRyYVVuZGVyc2NvcmVzKTsKLSAgICAgICAgICAgIHNhbml0aXplZC5hcHBlbmQocyArIHByZWZpeC5zaXplKCkgKyB1bmRlcnNjb3JlcyArCi0gICAgICAgICAgICAgICAgICAgICAgICAodXBwZXJDYXNlUHJlZml4ICYmIHNbcHJlZml4LnNpemUoKSArIHVuZGVyc2NvcmVzXSA9PSAnXycpKTsKLSAgICAgICAgICAgIHNhbml0aXplZE5hbWVzLnB1c2hfYmFjayhjYW1lbENhc2VUb0Rhc2hlZChzYW5pdGl6ZWQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoQzJTdHJpbmcgcyA6IHNhbml0aXplZE5hbWVzKSB7Ci0gICAgICAgICAgICBzdGQ6OmNvdXQgPDwgcyA8PCBzdGQ6OmVuZGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc2FuaXRpemVkTmFtZXM7Ci0gICAgfQotCi0gICAgZnJpZW5kIGNsYXNzIEMyUGFyYW1UZXN0X1BhcmFtVXRpbHNUZXN0X1Rlc3Q7Ci0KLXB1YmxpYzoKLSAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8QzJTdHJpbmc+IGdldEVudW1WYWx1ZXNGcm9tU3RyaW5nKEMyU3RyaW5nTGl0ZXJhbCB2YWx1ZSkgewotICAgICAgICBzdGQ6OnZlY3RvcjxDMlN0cmluZz4gZm91bmROYW1lczsKLSAgICAgICAgc2l6ZV90IHBvcyA9IDAsIGxlbiA9IHN0cmxlbih2YWx1ZSk7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIHNpemVfdCBlbmRQb3MgPSBzdHJjc3BuKHZhbHVlICsgcG9zLCAiICw9IikgKyBwb3M7Ci0gICAgICAgICAgICBpZiAoZW5kUG9zID4gcG9zKSB7Ci0gICAgICAgICAgICAgICAgZm91bmROYW1lcy5lbXBsYWNlX2JhY2sodmFsdWUgKyBwb3MsIGVuZFBvcyAtIHBvcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodmFsdWVbZW5kUG9zXSAmJiB2YWx1ZVtlbmRQb3NdICE9ICcsJykgewotICAgICAgICAgICAgICAgIGVuZFBvcyArPSBzdHJjc3BuKHZhbHVlICsgZW5kUG9zLCAiLCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcG9zID0gc3Ryc3BuKHZhbHVlICsgZW5kUG9zLCAiICwiKSArIGVuZFBvczsKLSAgICAgICAgfSB3aGlsZSAocG9zIDwgbGVuKTsKLSAgICAgICAgcmV0dXJuIGZvdW5kTmFtZXM7Ci0gICAgfQotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgICBzdGF0aWMgQzJGaWVsZERlc2NyaXB0b3I6Om5hbWVkX3ZhbHVlc190eXBlIHNhbml0aXplRW51bVZhbHVlcygKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFQ+IHZhbHVlcywKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyU3RyaW5nTGl0ZXJhbD4gbmFtZXMsCi0gICAgICAgICAgICBDMlN0cmluZ0xpdGVyYWwgcHJlZml4ID0gTlVMTCkgewotICAgICAgICBDMkZpZWxkRGVzY3JpcHRvcjo6bmFtZWRfdmFsdWVzX3R5cGUgbmFtZWRWYWx1ZXM7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPEMyU3RyaW5nPiBzYW5pdGl6ZWROYW1lcyA9IHNhbml0aXplRW51bVZhbHVlTmFtZXMobmFtZXMsIHByZWZpeCk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdmFsdWVzLnNpemUoKSAmJiBpIDwgc2FuaXRpemVkTmFtZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIG5hbWVkVmFsdWVzLmVtcGxhY2VfYmFjayhzYW5pdGl6ZWROYW1lc1tpXSwgdmFsdWVzW2ldKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmFtZWRWYWx1ZXM7Ci0gICAgfQotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgRT4KLSAgICBzdGF0aWMgQzJGaWVsZERlc2NyaXB0b3I6Om5hbWVkX3ZhbHVlc190eXBlIGN1c3RvbUVudW1WYWx1ZXMoCi0gICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8QzJTdHJpbmdMaXRlcmFsLCBFPj4gaXRlbXMpIHsKLSAgICAgICAgQzJGaWVsZERlc2NyaXB0b3I6Om5hbWVkX3ZhbHVlc190eXBlIG5hbWVkVmFsdWVzOwotICAgICAgICBmb3IgKGF1dG8gJml0ZW0gOiBpdGVtcykgewotICAgICAgICAgICAgbmFtZWRWYWx1ZXMuZW1wbGFjZV9iYWNrKGl0ZW0uZmlyc3QsIGl0ZW0uc2Vjb25kKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmFtZWRWYWx1ZXM7Ci0gICAgfQotfTsKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVVElMSVRJRVMgRk9SIFBBUkFNRVRFUiBSRUZMRUNUSU9OIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09IFVUSUxJVFkgVEVNUExBVEVTIEZPUiBQQVJBTUVURVIgUkVGTEVDVElPTiA9PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotI2lmIDEKLXRlbXBsYXRlPHR5cGVuYW1lLi4uIFBhcmFtcz4KLWNsYXNzIEMyX0hJREUgX0MyVHVwbGUgeyB9OwotCi1DMl9ISURFCi12b2lkIGFkZEMyUGFyYW1zKHN0ZDo6bGlzdDxjb25zdCBDMkZpZWxkRGVzY3JpcHRvcj4gJiwgX0MyVHVwbGU8PiAqKSB7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIFBhcmFtcz4KLUMyX0hJREUKLXZvaWQgYWRkQzJQYXJhbXMoc3RkOjpsaXN0PGNvbnN0IEMyRmllbGREZXNjcmlwdG9yPiAmZmllbGRzLCBfQzJUdXBsZTxULCBQYXJhbXMuLi4+ICopCi17Ci0gICAgLy9DMlBhcmFtOjppbmRleF90IGluZGV4ID0gVDo6YmFzZUluZGV4OwotICAgIC8vKHZvaWQpaW5kZXg7Ci0gICAgZmllbGRzLmluc2VydChmaWVsZHMuZW5kKCksIFQ6OmZpZWxkTGlzdCk7Ci0gICAgYWRkQzJQYXJhbXMoZmllbGRzLCAoX0MyVHVwbGU8UGFyYW1zLi4uPiAqKW51bGxwdHIpOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZS4uLiBQYXJhbXM+Ci1DMl9ISURFCi1zdGQ6Omxpc3Q8Y29uc3QgQzJGaWVsZERlc2NyaXB0b3I+IGRlc2NyaWJlQzJQYXJhbXMoKSB7Ci0gICAgc3RkOjpsaXN0PGNvbnN0IEMyRmllbGREZXNjcmlwdG9yPiBmaWVsZHM7Ci0gICAgYWRkQzJQYXJhbXMoZmllbGRzLCAoX0MyVHVwbGU8UGFyYW1zLi4uPiAqKW51bGxwdHIpOwotICAgIHJldHVybiBmaWVsZHM7Ci19Ci0KLSNlbmRpZgotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVUSUxJVElFUyBGT1IgRU5VTUVSQVRJT04gUkVGTEVDVElPTiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gQzJVVElMU19QQVJBTV9VVElMU19IXwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvX0MyTWFjcm9VdGlscy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL19DMk1hY3JvVXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRlOWJhNS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvX0MyTWFjcm9VdGlscy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEMyVVRJTFNfTUFDUk9fVVRJTFNfSF8KLSNkZWZpbmUgQzJVVElMU19NQUNST19VVElMU19IXwotCi0vKiogXGZpbGUKLSAqIE1hY3JvIHV0aWxpdGllcyBmb3IgdGhlIHV0aWxzIGxpYnJhcnkgdXNlZCBieSBDb2RlYzIgaW1wbGVtZW50YXRpb25zLgotICovCi0KLS8vLyBcaWYgMAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVkFSSUFCTEUgQVJHVU1FTlQgQ09VTlRJTkcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8vIHJlbW92ZSBlbXB0eSBhcmd1bWVudHMgLSBfQzJfQVJHKCkgZXhwYW5kcyB0byAnJywgd2hpbGUgX0MyX0FSRyh4KSBleHBhbmRzIHRvICcsIHgnCi0vLyBfQzJfQVJHbiguLi4pIGRvZXMgdGhlIHNhbWUgZm9yIG4gYXJndW1lbnRzCi0jZGVmaW5lIF9DMl9BUkcoLi4uKSAsICMjX19WQV9BUkdTX18KLSNkZWZpbmUgX0MyX0FSRzIoXzEsIF8yKSBfQzJfQVJHKF8xKSBfQzJfQVJHKF8yKQotI2RlZmluZSBfQzJfQVJHNChfMSwgXzIsIF8zLCBfNCkgX0MyX0FSRzIoXzEsIF8yKSBfQzJfQVJHMihfMywgXzQpCi0jZGVmaW5lIF9DMl9BUkc4KF8xLCBfMiwgXzMsIF80LCBfNSwgXzYsIF83LCBfOCkgX0MyX0FSRzQoXzEsIF8yLCBfMywgXzQpIF9DMl9BUkc0KF81LCBfNiwgXzcsIF84KQotI2RlZmluZSBfQzJfQVJHMTYoXzEsIF8yLCBfMywgXzQsIF81LCBfNiwgXzcsIF84LCBfOSwgXzEwLCBfMTEsIF8xMiwgXzEzLCBfMTQsIF8xNSwgXzE2KSBcCi0gICAgICAgIF9DMl9BUkc4KF8xLCBfMiwgXzMsIF80LCBfNSwgXzYsIF83LCBfOCkgX0MyX0FSRzgoXzksIF8xMCwgXzExLCBfMTIsIF8xMywgXzE0LCBfMTUsIF8xNikKLQotLy8gcmV0dXJuIHRoZSA2NXRoIGFyZ3VtZW50Ci0jZGVmaW5lIF9DMl9BUkdDXzMoXywgXzAsIF8xLCBfMiwgXzMsIF80LCBfNSwgXzYsIF83LCBfOCwgXzksIF8xMCwgXzExLCBfMTIsIF8xMywgXzE0LCBfMTUsIF8xNiwgXAotICAgICAgICBfMTcsIF8xOCwgXzE5LCBfMjAsIF8yMSwgXzIyLCBfMjMsIF8yNCwgXzI1LCBfMjYsIF8yNywgXzI4LCBfMjksIF8zMCwgXzMxLCBfMzIsIFwKLSAgICAgICAgXzMzLCBfMzQsIF8zNSwgXzM2LCBfMzcsIF8zOCwgXzM5LCBfNDAsIF80MSwgXzQyLCBfNDMsIF80NCwgXzQ1LCBfNDYsIF80NywgXzQ4LCBcCi0gICAgICAgIF80OSwgXzUwLCBfNTEsIF81MiwgXzUzLCBfNTQsIF81NSwgXzU2LCBfNTcsIF81OCwgXzU5LCBfNjAsIF82MSwgXzYyLCBfNjMsIF82NCwgLi4uKSBfNjQKLQotLy8vIFxlbmRpZgotCi0vKioKLSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBhcmd1bWVudHMuCi0gKi8KLS8vIFdlIGRvIHRoaXMgYnkgcHJlcGVuZGluZyAxIGFuZCBhcHBlbmRpbmcgNjUgZGVzaWduZWQgdmFsdWVzIHN1Y2ggdGhhdCB0aGUgNjV0aCBlbGVtZW50Ci0vLyB3aWxsIGJlIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzLgotI2RlZmluZSBfQzJfQVJHQyguLi4pIF9DMl9BUkdDXzEoMCwgIyNfX1ZBX0FSR1NfXywgXAotICAgICAgICA2NCwgNjMsIDYyLCA2MSwgNjAsIDU5LCA1OCwgNTcsIDU2LCA1NSwgNTQsIDUzLCA1MiwgNTEsIDUwLCA0OSwgNDgsIDQ3LCA0NiwgNDUsIDQ0LCA0MywgXAotICAgICAgICA0MiwgNDEsIDQwLCAzOSwgMzgsIDM3LCAzNiwgMzUsIDM0LCAzMywgMzIsIDMxLCAzMCwgMjksIDI4LCAyNywgMjYsIDI1LCAyNCwgMjMsIDIyLCAyMSwgXAotICAgICAgICAyMCwgMTksIDE4LCAxNywgMTYsIDE1LCAxNCwgMTMsIDEyLCAxMSwgMTAsIDksIDgsIDcsIDYsIDUsIDQsIDMsIDIsIDEsIDApCi0KLS8vLyBcaWYgMAotCi0vLyBzdGVwIDEuIHJlbW92ZSBlbXB0eSBhcmd1bWVudHMgLSB0aGlzIGlzIG5lZWRlZCB0byBhbGxvdyB0cmFpbGluZyBjb21tYSBpbiBlbnVtIGRlZmluaXRpb25zCi0vLyAoTk9URTogd2UgZG9uJ3Qga25vdyB3aGljaCBhcmd1bWVudCB3aWxsIGhhdmUgdGhpcyB0cmFpbGluZyBjb21tYSBzbyB3ZSBoYXZlIHRvIHRyeSBhbGwpCi0jZGVmaW5lIF9DMl9BUkdDXzEoXywgXzAsIF8xLCBfMiwgXzMsIF80LCBfNSwgXzYsIF83LCBfOCwgXzksIF8xMCwgXzExLCBfMTIsIF8xMywgXzE0LCBfMTUsIF8xNiwgXAotICAgICAgICBfMTcsIF8xOCwgXzE5LCBfMjAsIF8yMSwgXzIyLCBfMjMsIF8yNCwgXzI1LCBfMjYsIF8yNywgXzI4LCBfMjksIF8zMCwgXzMxLCBfMzIsIFwKLSAgICAgICAgXzMzLCBfMzQsIF8zNSwgXzM2LCBfMzcsIF8zOCwgXzM5LCBfNDAsIF80MSwgXzQyLCBfNDMsIF80NCwgXzQ1LCBfNDYsIF80NywgXzQ4LCBcCi0gICAgICAgIF80OSwgXzUwLCBfNTEsIF81MiwgXzUzLCBfNTQsIF81NSwgXzU2LCBfNTcsIF81OCwgXzU5LCBfNjAsIF82MSwgXzYyLCBfNjMsIF82NCwgLi4uKSBcCi0gICAgX0MyX0FSR0NfMihfIF9DMl9BUkcoXzApIFwKLSAgICBfQzJfQVJHMTYoXzEsIF8yLCBfMywgXzQsIF81LCBfNiwgXzcsIF84LCBfOSwgXzEwLCBfMTEsIF8xMiwgXzEzLCBfMTQsIF8xNSwgXzE2KSBcCi0gICAgX0MyX0FSRzE2KF8xNywgXzE4LCBfMTksIF8yMCwgXzIxLCBfMjIsIF8yMywgXzI0LCBfMjUsIF8yNiwgXzI3LCBfMjgsIF8yOSwgXzMwLCBfMzEsIF8zMikgXAotICAgIF9DMl9BUkcxNihfMzMsIF8zNCwgXzM1LCBfMzYsIF8zNywgXzM4LCBfMzksIF80MCwgXzQxLCBfNDIsIF80MywgXzQ0LCBfNDUsIF80NiwgXzQ3LCBfNDgpIFwKLSAgICBfQzJfQVJHMTYoXzQ5LCBfNTAsIF81MSwgXzUyLCBfNTMsIF81NCwgXzU1LCBfNTYsIF81NywgXzU4LCBfNTksIF82MCwgXzYxLCBfNjIsIF82MywgXzY0KSwgXAotICAgICMjX19WQV9BUkdTX18pCi0KLS8vIHN0ZXAgMi4gdGhpcyBpcyBuZWVkZWQgYXMgcmVtb3ZlZCBhcmd1bWVudHMgY2Fubm90IGJlIHBhc3NlZCBkaXJlY3RseSBhcyBlbXB0eSBpbnRvIGEgbWFjcm8KLSNkZWZpbmUgX0MyX0FSR0NfMiguLi4pIF9DMl9BUkdDXzMoX19WQV9BUkdTX18pCi0KLS8vLyBcZW5kaWYKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVkFSSUFCTEUgQVJHVU1FTlQgQ09OVkVSU0lPTiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vLy8gXGlmIDAKLQotLy8gbWFjcm9zIHRoYXQgY29udmVydCBfMSwgXzIsIF8zLCAuLi4gdG8gZm4oXzEsIGFyZyksIGZuKF8yLCBhcmcpLCBmbihfMywgYXJnKSwgLi4uCi0jZGVmaW5lIF9DMl9NQVBfNjQoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzYzKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfNjMoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzYyKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfNjIoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzYxKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfNjEoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzYwKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfNjAoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzU5KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfNTkoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzU4KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfNTgoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzU3KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfNTcoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzU2KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfNTYoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzU1KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfNTUoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzU0KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfNTQoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzUzKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfNTMoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzUyKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfNTIoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzUxKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfNTEoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzUwKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfNTAoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzQ5KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfNDkoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzQ4KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfNDgoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzQ3KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfNDcoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzQ2KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfNDYoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzQ1KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfNDUoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzQ0KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfNDQoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzQzKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfNDMoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzQyKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfNDIoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzQxKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfNDEoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzQwKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfNDAoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzM5KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfMzkoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzM4KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfMzgoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzM3KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfMzcoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzM2KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfMzYoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzM1KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfMzUoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzM0KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfMzQoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzMzKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfMzMoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzMyKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfMzIoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzMxKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfMzEoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzMwKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfMzAoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzI5KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfMjkoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzI4KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfMjgoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzI3KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfMjcoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzI2KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfMjYoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzI1KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfMjUoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzI0KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfMjQoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzIzKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfMjMoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzIyKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfMjIoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzIxKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfMjEoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzIwKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfMjAoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzE5KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfMTkoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzE4KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfMTgoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzE3KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfMTcoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzE2KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfMTYoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzE1KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfMTUoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzE0KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfMTQoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzEzKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfMTMoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzEyKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfMTIoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzExKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfMTEoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzEwKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfMTAoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzkoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKLSNkZWZpbmUgX0MyX01BUF85KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF84KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfOChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzcoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzYoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKLSNkZWZpbmUgX0MyX01BUF82KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfNShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzQoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzMoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKLSNkZWZpbmUgX0MyX01BUF8zKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfMihmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzEoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpCi0KLS8vLyBcZW5kaWYKLQotLyoqCi0gKiBNYXBzIGVhY2ggYXJndW1lbnQgdXNpbmcgYW5vdGhlciBtYWNybyB4IC0+IGZuKHgsIGFyZykKLSAqLwotLy8gdXNlIHdyYXBwZXIgdG8gY2FsbCB0aGUgcHJvcGVyIG1hcHBlciBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cwotI2RlZmluZSBfQzJfTUFQKGZuLCBhcmcsIC4uLikgX0MyX01BUF9fKF9DMl9BUkdDKF9fVkFfQVJHU19fKSwgZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKLQotLy8vIFxpZiAwCi0KLS8vIGV2YWx1YXRlIF9uIHNvIGl0IGJlY29tZXMgYSBudW1iZXIKLSNkZWZpbmUgX0MyX01BUF9fKF9uLCBmbiwgYXJnLCAuLi4pIF9DMl9NQVBfKF9uLCBmbiwgYXJnLCBfX1ZBX0FSR1NfXykKLS8vIGNhbGwgdGhlIHByb3BlciBtYXBwZXIKLSNkZWZpbmUgX0MyX01BUF8oX24sIGZuLCBhcmcsIC4uLikgX0MyX01BUF8jI19uIChmbiwgYXJnLCBfX1ZBX0FSR1NfXykKLQotLy8vIFxlbmRpZgotCi0jZW5kaWYgIC8vIEMyVVRJTFNfTUFDUk9fVVRJTFNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvQW5kcm9pZC5icAppbmRleCAyMWMwMGExLi43MzUyODU0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9BbmRyb2lkLmJwCkBAIC0xNyw2ICsxNyw4IEBACiAKICAgICBjZmxhZ3M6IFsiLVdlcnJvciJdLAogCisgICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCisKICAgICBzYW5pdGl6ZTogewogICAgICAgICBtaXNjX3VuZGVmaW5lZDogWwogICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvRHJjUHJlc01vZGVXcmFwLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvRHJjUHJlc01vZGVXcmFwLmNwcAppbmRleCAxMjlhZDY1Li45NWQzNzI0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0RyY1ByZXNNb2RlV3JhcC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9EcmNQcmVzTW9kZVdyYXAuY3BwCkBAIC0yNCw3ICsyNCw3IEBACiAvLyNkZWZpbmUgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCiAKICNkZWZpbmUgR1BNX0VOQ09ERVJfVEFSR0VUX0xFVkVMIDY0Ci0jZGVmaW5lIE1BWF9UQVJHRVRfTEVWRUwgNjQKKyNkZWZpbmUgTUFYX1RBUkdFVF9MRVZFTCA0MAogCiBDRHJjUHJlc01vZGVXcmFwcGVyOjpDRHJjUHJlc01vZGVXcmFwcGVyKCkKIHsKQEAgLTE2NCw3ICsxNjQsNyBAQAogICAgIGlmIChtRGF0YVVwZGF0ZSkgewogICAgICAgICAvLyBzYW5pdHkgY2hlY2sKICAgICAgICAgaWYgKG1EZXNUYXJnZXQgPCBNQVhfVEFSR0VUX0xFVkVMKXsKLSAgICAgICAgICAgIG1EZXNUYXJnZXQgPSBNQVhfVEFSR0VUX0xFVkVMOyAgLy8gbGltaXQgdGFyZ2V0IGxldmVsIHRvIC0xNiBkQiBvciBiZWxvdworICAgICAgICAgICAgbURlc1RhcmdldCA9IE1BWF9UQVJHRVRfTEVWRUw7ICAvLyBsaW1pdCB0YXJnZXQgbGV2ZWwgdG8gLTEwIGRCIG9yIGJlbG93CiAgICAgICAgICAgICBuZXdUYXJnZXQgPSBNQVhfVEFSR0VUX0xFVkVMOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5jcHAKaW5kZXggZTBjMGMzMi4uYmMwYTY5ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5jcHAKQEAgLTM2LDYgKzM2LDcgQEAKICNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19DVVQgICAxMjcgLyogbWF4aW11bSBjb21wcmVzc2lvbiBvZiBkeW5hbWljIHJhbmdlIGZvciBtb2JpbGUgY29uZiAqLwogI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0JPT1NUIDEyNyAvKiBtYXhpbXVtIGNvbXByZXNzaW9uIG9mIGR5bmFtaWMgcmFuZ2UgZm9yIG1vYmlsZSBjb25mICovCiAjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfSEVBVlkgMSAgIC8qIHN3aXRjaCBmb3IgaGVhdnkgY29tcHJlc3Npb24gZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfRUZGRUNUIDMgIC8qIE1QRUctRCBEUkMgZWZmZWN0IHR5cGU7IDMgPT4gTGltaXRlZCBwbGF5YmFjayByYW5nZSAqLwogI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRU5DX0xFVkVMICgtMSkgLyogZW5jb2RlciB0YXJnZXQgbGV2ZWw7IC0xID0+IHRoZSB2YWx1ZSBpcyB1bmtub3duLCBvdGhlcndpc2UgZEIgc3RlcCB2YWx1ZSAoZS5nLiA2NCBmb3IgLTE2IGRCKSAqLwogI2RlZmluZSBNQVhfQ0hBTk5FTF9DT1VOVCAgICAgICAgICAgIDggIC8qIG1heGltdW0gbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzIHRoYXQgY2FuIGJlIGRlY29kZWQgKi8KIC8vIG5hbWVzIG9mIHByb3BlcnRpZXMgdGhhdCBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBEUkMgc2V0dGluZ3MKQEAgLTQ0LDYgKzQ1LDcgQEAKICNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfQk9PU1QgICAgICAiYWFjX2RyY19ib29zdCIKICNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfSEVBVlkgICAgICAiYWFjX2RyY19oZWF2eSIKICNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfRU5DX0xFVkVMICJhYWNfZHJjX2VuY190YXJnZXRfbGV2ZWwiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0VGRkVDVCAgICAgInJvLmFhY19kcmNfZWZmZWN0X3R5cGUiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNjMsNiArNjUsNyBAQAogICAgIE9NWF9BVURJT19BQUNPYmplY3RMRCwKICAgICBPTVhfQVVESU9fQUFDT2JqZWN0RUxELAogICAgIE9NWF9BVURJT19BQUNPYmplY3RFUl9TY2FsYWJsZSwKKyAgICBPTVhfQVVESU9fQUFDT2JqZWN0WEhFLAogfTsKIAogU29mdEFBQzI6OlNvZnRBQUMyKApAQCAtMjA3LDYgKzIxMCwxNSBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIG1EcmNXcmFwLnNldFBhcmFtKERSQ19QUkVTX01PREVfV1JBUF9FTkNPREVSX1RBUkdFVCwgRFJDX0RFRkFVTFRfTU9CSUxFX0VOQ19MRVZFTCk7CiAgICAgfQorICAgIC8vIEFBQ19VTklEUkNfU0VUX0VGRkVDVAorICAgIGludDMyX3QgZWZmZWN0VHlwZSA9CisgICAgICAgICAgICBwcm9wZXJ0eV9nZXRfaW50MzIoUFJPUF9EUkNfT1ZFUlJJREVfRUZGRUNULCBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0VGRkVDVCk7CisgICAgaWYgKGVmZmVjdFR5cGUgPCAtMSB8fCBlZmZlY3RUeXBlID4gOCkgeworICAgICAgICBlZmZlY3RUeXBlID0gRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19FRkZFQ1Q7CisgICAgfQorICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBNUEVHLUQgRFJDIGVmZmVjdCB0eXBlICVkIChkZWZhdWx0PSVkKSIsCisgICAgICAgICAgICBlZmZlY3RUeXBlLCBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0VGRkVDVCk7CisgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtQUFDRGVjb2RlciwgQUFDX1VOSURSQ19TRVRfRUZGRUNULCBlZmZlY3RUeXBlKTsKIAogICAgIC8vIEJ5IGRlZmF1bHQsIHRoZSBkZWNvZGVyIGNyZWF0ZXMgYSA1LjEgY2hhbm5lbCBkb3dubWl4IHNpZ25hbC4KICAgICAvLyBGb3Igc2V2ZW4gYW5kIGVpZ2h0IGNoYW5uZWwgaW5wdXQgc3RyZWFtcywgZW5hYmxlIDYuMSBhbmQgNy4xIGNoYW5uZWwgb3V0cHV0CkBAIC00MTQsMTAgKzQyNiwxMCBAQAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkQWFjUHJlc2VudGF0aW9uOgorICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkQWFjRHJjUHJlc2VudGF0aW9uOgogICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9BQUNQUkVTRU5UQVRJT05UWVBFICphYWNQcmVzUGFyYW1zID0KLSAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9BVURJT19QQVJBTV9BTkRST0lEX0FBQ1BSRVNFTlRBVElPTlRZUEUgKilwYXJhbXM7CisgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9BQUNEUkNQUkVTRU5UQVRJT05UWVBFICphYWNQcmVzUGFyYW1zID0KKyAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9BVURJT19QQVJBTV9BTkRST0lEX0FBQ0RSQ1BSRVNFTlRBVElPTlRZUEUgKilwYXJhbXM7CiAKICAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGFhY1ByZXNQYXJhbXMpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKQEAgLTQ0Myw2ICs0NTUsMTAgQEAKICAgICAgICAgICAgICAgICBBTE9HVigic2V0IG5NYXhPdXRwdXRDaGFubmVscz0lZCIsIG1heCk7CiAgICAgICAgICAgICAgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtQUFDRGVjb2RlciwgQUFDX1BDTV9NQVhfT1VUUFVUX0NIQU5ORUxTLCBtYXgpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFhY1ByZXNQYXJhbXMtPm5EcmNFZmZlY3RUeXBlID49IC0xKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoInNldCBuRHJjRWZmZWN0VHlwZT0lZCIsIGFhY1ByZXNQYXJhbXMtPm5EcmNFZmZlY3RUeXBlKTsKKyAgICAgICAgICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1BQUNEZWNvZGVyLCBBQUNfVU5JRFJDX1NFVF9FRkZFQ1QsIGFhY1ByZXNQYXJhbXMtPm5EcmNFZmZlY3RUeXBlKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJvb2wgdXBkYXRlRHJjV3JhcHBlciA9IGZhbHNlOwogICAgICAgICAgICAgaWYgKGFhY1ByZXNQYXJhbXMtPm5EcmNCb29zdCA+PSAwKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoInNldCBuRHJjQm9vc3Q9JWQiLCBhYWNQcmVzUGFyYW1zLT5uRHJjQm9vc3QpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9leHBvcnRzLmxkcyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvZXhwb3J0cy5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI0ZjNmYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvZXhwb3J0cy5sZHMKQEAgLTAsMCArMSw1IEBACit7CisgICAgZ2xvYmFsOgorICAgICAgICBfWjIyY3JlYXRlU29mdE9NWENvbXBvbmVudFBLY1BLMTZPTVhfQ0FMTEJBQ0tUWVBFUHZQUDE3T01YX0NPTVBPTkVOVFRZUEU7CisgICAgbG9jYWw6ICo7Cit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9BQUNFbmNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvQUFDRW5jb2Rlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NTYxMzkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9BQUNFbmNvZGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJBQUNFbmNvZGVyIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiQUFDRW5jb2Rlci5oIgotI2luY2x1ZGUgInZvQUFDLmgiCi0jaW5jbHVkZSAiY21uTWVtb3J5LmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotQUFDRW5jb2Rlcjo6QUFDRW5jb2Rlcihjb25zdCBzcDxJTWVkaWFTb3VyY2U+ICZzb3VyY2UsIGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSkKLSAgICA6IG1Tb3VyY2Uoc291cmNlKSwKLSAgICAgIG1NZXRhKG1ldGEpLAotICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAotICAgICAgbUJ1ZmZlckdyb3VwKE5VTEwpLAotICAgICAgbUlucHV0QnVmZmVyKE5VTEwpLAotICAgICAgbUlucHV0RnJhbWUoTlVMTCksCi0gICAgICBtRW5jb2RlckhhbmRsZShOVUxMKSwKLSAgICAgIG1BcGlIYW5kbGUoTlVMTCksCi0gICAgICBtTWVtT3BlcmF0b3IoTlVMTCkgewotfQotCi1zdGF0dXNfdCBBQUNFbmNvZGVyOjppbml0Q2hlY2soKSB7Ci0gICAgQ0hFQ0sobUFwaUhhbmRsZSA9PSBOVUxMICYmIG1FbmNvZGVySGFuZGxlID09IE5VTEwpOwotICAgIENIRUNLKG1NZXRhLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZtU2FtcGxlUmF0ZSkpOwotICAgIENIRUNLKG1NZXRhLT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm1DaGFubmVscykpOwotICAgIENIRUNLKG1DaGFubmVscyA8PSAyICYmIG1DaGFubmVscyA+PSAxKTsKLSAgICBDSEVDSyhtTWV0YS0+ZmluZEludDMyKGtLZXlCaXRSYXRlLCAmbUJpdFJhdGUpKTsKLQotICAgIG1BcGlIYW5kbGUgPSBuZXcgVk9fQVVESU9fQ09ERUNBUEk7Ci0gICAgQ0hFQ0sobUFwaUhhbmRsZSk7Ci0KLSAgICBpZiAoVk9fRVJSX05PTkUgIT0gdm9HZXRBQUNFbmNBUEkobUFwaUhhbmRsZSkpIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgYXBpIGhhbmRsZSIpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICBtTWVtT3BlcmF0b3IgPSBuZXcgVk9fTUVNX09QRVJBVE9SOwotICAgIENIRUNLKG1NZW1PcGVyYXRvciAhPSBOVUxMKTsKLSAgICBtTWVtT3BlcmF0b3ItPkFsbG9jID0gY21uTWVtQWxsb2M7Ci0gICAgbU1lbU9wZXJhdG9yLT5Db3B5ID0gY21uTWVtQ29weTsKLSAgICBtTWVtT3BlcmF0b3ItPkZyZWUgPSBjbW5NZW1GcmVlOwotICAgIG1NZW1PcGVyYXRvci0+U2V0ID0gY21uTWVtU2V0OwotICAgIG1NZW1PcGVyYXRvci0+Q2hlY2sgPSBjbW5NZW1DaGVjazsKLQotICAgIFZPX0NPREVDX0lOSVRfVVNFUkRBVEEgdXNlckRhdGE7Ci0gICAgbWVtc2V0KCZ1c2VyRGF0YSwgMCwgc2l6ZW9mKHVzZXJEYXRhKSk7Ci0gICAgdXNlckRhdGEubWVtZmxhZyA9IFZPX0lNRl9VU0VSTUVNT1BFUkFUT1I7Ci0gICAgdXNlckRhdGEubWVtRGF0YSA9IChWT19QVFIpIG1NZW1PcGVyYXRvcjsKLSAgICBpZiAoVk9fRVJSX05PTkUgIT0gbUFwaUhhbmRsZS0+SW5pdCgmbUVuY29kZXJIYW5kbGUsIFZPX0FVRElPX0NvZGluZ0FBQywgJnVzZXJEYXRhKSkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXQgQUFDIGVuY29kZXIiKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotICAgIGlmIChPSyAhPSBzZXRBdWRpb1NwZWNpZmljQ29uZmlnRGF0YSgpKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY29uZmlndXJlIEFBQyBlbmNvZGVyIik7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIC8vIENvbmZpZ3VyZSBBQUMgZW5jb2RlciQKLSAgICBBQUNFTkNfUEFSQU0gcGFyYW1zOwotICAgIG1lbXNldCgmcGFyYW1zLCAwLCBzaXplb2YocGFyYW1zKSk7Ci0gICAgcGFyYW1zLnNhbXBsZVJhdGUgPSBtU2FtcGxlUmF0ZTsKLSAgICBwYXJhbXMuYml0UmF0ZSA9IG1CaXRSYXRlOwotICAgIHBhcmFtcy5uQ2hhbm5lbHMgPSBtQ2hhbm5lbHM7Ci0gICAgcGFyYW1zLmFkdHNVc2VkID0gMDsgIC8vIFdlIGFkZCBhZHRzIGhlYWRlciBpbiB0aGUgZmlsZSB3cml0ZXIgaWYgbmVlZGVkLgotICAgIGlmIChWT19FUlJfTk9ORSAhPSBtQXBpSGFuZGxlLT5TZXRQYXJhbShtRW5jb2RlckhhbmRsZSwgVk9fUElEX0FBQ19FTkNQQVJBTSwgICZwYXJhbXMpKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IEFBQyBlbmNvZGVyIHBhcmFtZXRlcnMiKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0aWMgc3RhdHVzX3QgZ2V0U2FtcGxlUmF0ZVRhYmxlSW5kZXgoaW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90ICZpbmRleCkgewotICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtTYW1wbGVSYXRlVGFibGVbXSA9IHsKLSAgICAgICAgOTYwMDAsIDg4MjAwLCA2NDAwMCwgNDgwMDAsIDQ0MTAwLCAzMjAwMCwKLSAgICAgICAgMjQwMDAsIDIyMDUwLCAxNjAwMCwgMTIwMDAsIDExMDI1LCA4MDAwCi0gICAgfTsKLSAgICBjb25zdCBpbnQzMl90IHRhYmxlU2l6ZSA9IHNpemVvZihrU2FtcGxlUmF0ZVRhYmxlKSAvIHNpemVvZihrU2FtcGxlUmF0ZVRhYmxlWzBdKTsKLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCB0YWJsZVNpemU7ICsraSkgewotICAgICAgICBpZiAoc2FtcGxlUmF0ZSA9PSBrU2FtcGxlUmF0ZVRhYmxlW2ldKSB7Ci0gICAgICAgICAgICBpbmRleCA9IGk7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBBTE9HRSgiU2FtcGxpbmcgcmF0ZSAlZCBicHMgaXMgbm90IHN1cHBvcnRlZCIsIHNhbXBsZVJhdGUpOwotICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBQUNFbmNvZGVyOjpzZXRBdWRpb1NwZWNpZmljQ29uZmlnRGF0YSgpIHsKLSAgICBBTE9HVigic2V0QXVkaW9TcGVjaWZpY0NvbmZpZ0RhdGE6ICVkIGh6LCAlZCBicHMsIGFuZCAlZCBjaGFubmVscyIsCi0gICAgICAgICBtU2FtcGxlUmF0ZSwgbUJpdFJhdGUsIG1DaGFubmVscyk7Ci0KLSAgICBpbnQzMl90IGluZGV4ID0gMDsKLSAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIGdldFNhbXBsZVJhdGVUYWJsZUluZGV4KG1TYW1wbGVSYXRlLCBpbmRleCkpOwotICAgIGlmIChtQ2hhbm5lbHMgPiAyIHx8IG1DaGFubmVscyA8PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBudW1iZXIgb2YgY2hhbm5lbHMoJWQpIiwgbUNoYW5uZWxzKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgLy8gT01YX0FVRElPX0FBQ09iamVjdExDCi0gICAgbUF1ZGlvU3BlY2lmaWNDb25maWdEYXRhWzBdID0gKCgweDAyIDw8IDMpIHwgKGluZGV4ID4+IDEpKTsKLSAgICBtQXVkaW9TcGVjaWZpY0NvbmZpZ0RhdGFbMV0gPSAoKGluZGV4ICYgMHgwMSkgPDwgNykgfCAobUNoYW5uZWxzIDw8IDMpOwotICAgIHJldHVybiBPSzsKLX0KLQotQUFDRW5jb2Rlcjo6fkFBQ0VuY29kZXIoKSB7Ci0gICAgaWYgKG1TdGFydGVkKSB7Ci0gICAgICAgIHN0b3AoKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEFBQ0VuY29kZXI6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKLSAgICBpZiAobVN0YXJ0ZWQpIHsKLSAgICAgICAgQUxPR1coIkNhbGwgc3RhcnQoKSB3aGVuIGVuY29kZXIgYWxyZWFkeSBzdGFydGVkIik7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBtQnVmZmVyR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cDsKLSAgICBtQnVmZmVyR3JvdXAtPmFkZF9idWZmZXIobmV3IE1lZGlhQnVmZmVyKDIwNDgpKTsKLQotICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywgaW5pdENoZWNrKCkpOwotCi0gICAgbU51bUlucHV0U2FtcGxlcyA9IDA7Ci0gICAgbUFuY2hvclRpbWVVcyA9IDA7Ci0gICAgbUZyYW1lQ291bnQgPSAwOwotCi0gICAgbUlucHV0RnJhbWUgPSBuZXcgaW50MTZfdFttQ2hhbm5lbHMgKiBrTnVtU2FtcGxlc1BlckZyYW1lXTsKLSAgICBDSEVDSyhtSW5wdXRGcmFtZSAhPSBOVUxMKTsKLQotICAgIHN0YXR1c190IGVyciA9IG1Tb3VyY2UtPnN0YXJ0KHBhcmFtcyk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgQUxPR0UoIkF1ZGlvU291cmNlIGlzIG5vdCBhdmFpbGFibGUiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBtU3RhcnRlZCA9IHRydWU7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEFBQ0VuY29kZXI6OnN0b3AoKSB7Ci0gICAgaWYgKG1JbnB1dEJ1ZmZlcikgewotICAgICAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICBkZWxldGUgbUJ1ZmZlckdyb3VwOwotICAgIG1CdWZmZXJHcm91cCA9IE5VTEw7Ci0KLSAgICBpZiAobUlucHV0RnJhbWUpIHsKLSAgICAgICAgZGVsZXRlW10gbUlucHV0RnJhbWU7Ci0gICAgICAgIG1JbnB1dEZyYW1lID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoIW1TdGFydGVkKSB7Ci0gICAgICAgIEFMT0dXKCJDYWxsIHN0b3AoKSB3aGVuIGVuY29kZXIgaGFzIG5vdCBzdGFydGVkIik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgIH0KLQotICAgIG1Tb3VyY2UtPnN0b3AoKTsKLSAgICBpZiAobUVuY29kZXJIYW5kbGUpIHsKLSAgICAgICAgQ0hFQ0tfRVEoKFZPX1UzMilWT19FUlJfTk9ORSwgbUFwaUhhbmRsZS0+VW5pbml0KG1FbmNvZGVySGFuZGxlKSk7Ci0gICAgICAgIG1FbmNvZGVySGFuZGxlID0gTlVMTDsKLSAgICB9Ci0gICAgZGVsZXRlIG1BcGlIYW5kbGU7Ci0gICAgbUFwaUhhbmRsZSA9IE5VTEw7Ci0KLSAgICBkZWxldGUgbU1lbU9wZXJhdG9yOwotICAgIG1NZW1PcGVyYXRvciA9IE5VTEw7Ci0KLSAgICBtU3RhcnRlZCA9IGZhbHNlOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zcDxNZXRhRGF0YT4gQUFDRW5jb2Rlcjo6Z2V0Rm9ybWF0KCkgewotICAgIHNwPE1ldGFEYXRhPiBzcmNGb3JtYXQgPSBtU291cmNlLT5nZXRGb3JtYXQoKTsKLQotICAgIG1NZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKTsKLQotICAgIGludDY0X3QgZHVyYXRpb25VczsKLSAgICBpZiAoc3JjRm9ybWF0LT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb25VcykpIHsKLSAgICAgICAgbU1ldGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb25Vcyk7Ci0gICAgfQotCi0gICAgbU1ldGEtPnNldENTdHJpbmcoa0tleURlY29kZXJDb21wb25lbnQsICJBQUNFbmNvZGVyIik7Ci0KLSAgICByZXR1cm4gbU1ldGE7Ci19Ci0KLXN0YXR1c190IEFBQ0VuY29kZXI6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewotICAgICpvdXQgPSBOVUxMOwotCi0gICAgaW50NjRfdCBzZWVrVGltZVVzOwotICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOwotICAgIENIRUNLKG9wdGlvbnMgPT0gTlVMTCB8fCAhb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpOwotCi0gICAgTWVkaWFCdWZmZXIgKmJ1ZmZlcjsKLSAgICBDSEVDS19FUShtQnVmZmVyR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpLCAoc3RhdHVzX3QpT0spOwotICAgIHVpbnQ4X3QgKm91dFB0ciA9ICh1aW50OF90ICopYnVmZmVyLT5kYXRhKCk7Ci0gICAgYm9vbCByZWFkRnJvbVNvdXJjZSA9IGZhbHNlOwotICAgIGludDY0X3Qgd2FsbENsb2NrVGltZVVzID0gLTE7Ci0KLSAgICBpZiAobUZyYW1lQ291bnQgPT0gMCkgewotICAgICAgICBtZW1jcHkob3V0UHRyLCBtQXVkaW9TcGVjaWZpY0NvbmZpZ0RhdGEsIDIpOwotICAgICAgICBidWZmZXItPnNldF9yYW5nZSgwLCAyKTsKLSAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoa0tleUlzQ29kZWNDb25maWcsIHRydWUpOwotICAgICAgICAqb3V0ID0gYnVmZmVyOwotICAgICAgICArK21GcmFtZUNvdW50OwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfSBlbHNlIGlmIChtRnJhbWVDb3VudCA9PSAxKSB7Ci0gICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc0NvZGVjQ29uZmlnLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgY29uc3QgaW50MzJfdCBuU2FtcGxlcyA9IG1DaGFubmVscyAqIGtOdW1TYW1wbGVzUGVyRnJhbWU7Ci0gICAgd2hpbGUgKG1OdW1JbnB1dFNhbXBsZXMgPCBuU2FtcGxlcykgewotICAgICAgICBpZiAobUlucHV0QnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIGlmIChtU291cmNlLT5yZWFkKCZtSW5wdXRCdWZmZXIsIG9wdGlvbnMpICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1OdW1JbnB1dFNhbXBsZXMgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1lbXNldCgmbUlucHV0RnJhbWVbbU51bUlucHV0U2FtcGxlc10sCi0gICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnQxNl90KSAqIChuU2FtcGxlcyAtIG1OdW1JbnB1dFNhbXBsZXMpKTsKLSAgICAgICAgICAgICAgICBtTnVtSW5wdXRTYW1wbGVzID0gMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2l6ZV90IGFsaWduID0gbUlucHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKSAlIHNpemVvZihpbnQxNl90KTsKLSAgICAgICAgICAgIENIRUNLX0VRKGFsaWduLCAoc2l6ZV90KTApOwotCi0gICAgICAgICAgICBpbnQ2NF90IHRpbWVVczsKLSAgICAgICAgICAgIGlmIChtSW5wdXRCdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleURyaWZ0VGltZSwgJnRpbWVVcykpIHsKLSAgICAgICAgICAgICAgICB3YWxsQ2xvY2tUaW1lVXMgPSB0aW1lVXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUlucHV0QnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlBbmNob3JUaW1lLCAmdGltZVVzKSkgewotICAgICAgICAgICAgICAgIG1BbmNob3JUaW1lVXMgPSB0aW1lVXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZWFkRnJvbVNvdXJjZSA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZWFkRnJvbVNvdXJjZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHNpemVfdCBjb3B5ID0gKG5TYW1wbGVzIC0gbU51bUlucHV0U2FtcGxlcykgKiBzaXplb2YoaW50MTZfdCk7Ci0KLSAgICAgICAgaWYgKGNvcHkgPiBtSW5wdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpKSB7Ci0gICAgICAgICAgICBjb3B5ID0gbUlucHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1lbWNweSgmbUlucHV0RnJhbWVbbU51bUlucHV0U2FtcGxlc10sCi0gICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKSBtSW5wdXRCdWZmZXItPmRhdGEoKQotICAgICAgICAgICAgICAgICAgICArIG1JbnB1dEJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCi0gICAgICAgICAgICAgICBjb3B5KTsKLQotICAgICAgICBtSW5wdXRCdWZmZXItPnNldF9yYW5nZSgKLSAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkgKyBjb3B5LAotICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKSAtIGNvcHkpOwotCi0gICAgICAgIGlmIChtSW5wdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBtTnVtSW5wdXRTYW1wbGVzICs9IGNvcHkgLyBzaXplb2YoaW50MTZfdCk7Ci0gICAgICAgIGlmIChtTnVtSW5wdXRTYW1wbGVzID49IG5TYW1wbGVzKSB7Ci0gICAgICAgICAgICBtTnVtSW5wdXRTYW1wbGVzICU9IG5TYW1wbGVzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBWT19DT0RFQ0JVRkZFUiBpbnB1dERhdGE7Ci0gICAgbWVtc2V0KCZpbnB1dERhdGEsIDAsIHNpemVvZihpbnB1dERhdGEpKTsKLSAgICBpbnB1dERhdGEuQnVmZmVyID0gKHVuc2lnbmVkIGNoYXIqKSBtSW5wdXRGcmFtZTsKLSAgICBpbnB1dERhdGEuTGVuZ3RoID0gblNhbXBsZXMgKiBzaXplb2YoaW50MTZfdCk7Ci0gICAgQ0hFQ0soKFZPX1UzMilWT19FUlJfTk9ORSA9PSBtQXBpSGFuZGxlLT5TZXRJbnB1dERhdGEobUVuY29kZXJIYW5kbGUsJmlucHV0RGF0YSkpOwotCi0gICAgVk9fQ09ERUNCVUZGRVIgb3V0cHV0RGF0YTsKLSAgICBtZW1zZXQoJm91dHB1dERhdGEsIDAsIHNpemVvZihvdXRwdXREYXRhKSk7Ci0gICAgVk9fQVVESU9fT1VUUFVUSU5GTyBvdXRwdXRJbmZvOwotICAgIG1lbXNldCgmb3V0cHV0SW5mbywgMCwgc2l6ZW9mKG91dHB1dEluZm8pKTsKLQotICAgIFZPX1UzMiByZXQgPSBWT19FUlJfTk9ORTsKLSAgICBzaXplX3Qgbk91dHB1dEJ5dGVzID0gMDsKLSAgICBkbyB7Ci0gICAgICAgIG91dHB1dERhdGEuQnVmZmVyID0gb3V0UHRyOwotICAgICAgICBvdXRwdXREYXRhLkxlbmd0aCA9IGJ1ZmZlci0+c2l6ZSgpIC0gbk91dHB1dEJ5dGVzOwotICAgICAgICByZXQgPSBtQXBpSGFuZGxlLT5HZXRPdXRwdXREYXRhKG1FbmNvZGVySGFuZGxlLCAmb3V0cHV0RGF0YSwgJm91dHB1dEluZm8pOwotICAgICAgICBpZiAocmV0ID09IFZPX0VSUl9OT05FKSB7Ci0gICAgICAgICAgICBvdXRQdHIgKz0gb3V0cHV0RGF0YS5MZW5ndGg7Ci0gICAgICAgICAgICBuT3V0cHV0Qnl0ZXMgKz0gb3V0cHV0RGF0YS5MZW5ndGg7Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlIChyZXQgIT0gVk9fRVJSX0lOUFVUX0JVRkZFUl9TTUFMTCk7Ci0gICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgbk91dHB1dEJ5dGVzKTsKLQotICAgIGludDY0X3QgbWVkaWFUaW1lVXMgPQotICAgICAgICAoKG1GcmFtZUNvdW50IC0gMSkgKiAxMDAwMDAwTEwgKiBrTnVtU2FtcGxlc1BlckZyYW1lKSAvIG1TYW1wbGVSYXRlOwotCi0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIG1BbmNob3JUaW1lVXMgKyBtZWRpYVRpbWVVcyk7Ci0gICAgaWYgKHJlYWRGcm9tU291cmNlICYmIHdhbGxDbG9ja1RpbWVVcyAhPSAtMSkgewotICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5RHJpZnRUaW1lLCBtZWRpYVRpbWVVcyAtIHdhbGxDbG9ja1RpbWVVcyk7Ci0gICAgfQotICAgICsrbUZyYW1lQ291bnQ7Ci0KLSAgICAqb3V0ID0gYnVmZmVyOwotICAgIHJldHVybiBPSzsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvQW5kcm9pZC5icAppbmRleCBmYjM2OGMyLi45MzQyMzUxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9BbmRyb2lkLmJwCkBAIC0xLDExNSArMSwzIEBACi1jY19saWJyYXJ5X3N0YXRpYyB7Ci0gICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2FhY2VuYyIsCi0gICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKLQotICAgIHNyY3M6IFsKLSAgICAgICAgImJhc2ljX29wL2Jhc2ljb3AyLmMiLAotICAgICAgICAiYmFzaWNfb3Avb3Blcl8zMmIuYyIsCi0KLSAgICAgICAgIkFBQ0VuY29kZXIuY3BwIiwKLSAgICAgICAgInNyYy9hYWNfcm9tLmMiLAotICAgICAgICAic3JjL2FhY2VuYy5jIiwKLSAgICAgICAgInNyYy9hYWNlbmNfY29yZS5jIiwKLSAgICAgICAgInNyYy9hZGpfdGhyLmMiLAotICAgICAgICAic3JjL2JhbmRfbnJnLmMiLAotICAgICAgICAic3JjL2JpdF9jbnQuYyIsCi0gICAgICAgICJzcmMvYml0YnVmZmVyLmMiLAotICAgICAgICAic3JjL2JpdGVuYy5jIiwKLSAgICAgICAgInNyYy9ibG9ja19zd2l0Y2guYyIsCi0gICAgICAgICJzcmMvY2hhbm5lbF9tYXAuYyIsCi0gICAgICAgICJzcmMvZHluX2JpdHMuYyIsCi0gICAgICAgICJzcmMvZ3JwX2RhdGEuYyIsCi0gICAgICAgICJzcmMvaW50ZXJmYWNlLmMiLAotICAgICAgICAic3JjL2xpbmVfcGUuYyIsCi0gICAgICAgICJzcmMvbXNfc3RlcmVvLmMiLAotICAgICAgICAic3JjL3ByZV9lY2hvX2NvbnRyb2wuYyIsCi0gICAgICAgICJzcmMvcHN5X2NvbmZpZ3VyYXRpb24uYyIsCi0gICAgICAgICJzcmMvcHN5X21haW4uYyIsCi0gICAgICAgICJzcmMvcWNfbWFpbi5jIiwKLSAgICAgICAgInNyYy9xdWFudGl6ZS5jIiwKLSAgICAgICAgInNyYy9zZl9lc3RpbS5jIiwKLSAgICAgICAgInNyYy9zcHJlYWRpbmcuYyIsCi0gICAgICAgICJzcmMvc3RhdF9iaXRzLmMiLAotICAgICAgICAic3JjL3Rucy5jIiwKLSAgICAgICAgInNyYy90cmFuc2Zvcm0uYyIsCi0gICAgICAgICJzcmMvbWVtYWxpZ24uYyIsCi0gICAgXSwKLQotICAgIGFyY2g6IHsKLSAgICAgICAgYXJtOiB7Ci0gICAgICAgICAgICBzcmNzOiBbCi0gICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL0F1dG9Db3JyZWxhdGlvbl92NS5zIiwKLSAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvYmFuZF9ucmdfdjUucyIsCi0gICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL0NhbGNXaW5kb3dFbmVyZ3lfdjUucyIsCi0gICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL1ByZVBvc3RNRENUX3Y1LnMiLAotICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9SNFI4Rmlyc3RfdjUucyIsCi0gICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL1JhZGl4NEZGVF92NS5zIiwKLSAgICAgICAgICAgIF0sCi0KLSAgICAgICAgICAgIGNmbGFnczogWwotICAgICAgICAgICAgICAgICItREFSTVY1RSIsCi0gICAgICAgICAgICAgICAgIi1EQVJNX0lOQVNNIiwKLSAgICAgICAgICAgICAgICAiLURBUk1WNV9JTkFTTSIsCi0gICAgICAgICAgICBdLAotCi0gICAgICAgICAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsic3JjL2FzbS9BUk1WNUUiXSwKLQotICAgICAgICAgICAgaW5zdHJ1Y3Rpb25fc2V0OiAiYXJtIiwKLQotICAgICAgICAgICAgYXJtdjdfYV9uZW9uOiB7Ci0gICAgICAgICAgICAgICAgZXhjbHVkZV9zcmNzOiBbCi0gICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9QcmVQb3N0TURDVF92NS5zIiwKLSAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL1I0UjhGaXJzdF92NS5zIiwKLSAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL1JhZGl4NEZGVF92NS5zIiwKLSAgICAgICAgICAgICAgICBdLAotICAgICAgICAgICAgICAgIHNyY3M6IFsKLSAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjcvUHJlUG9zdE1EQ1RfdjcucyIsCi0gICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY3L1I0UjhGaXJzdF92Ny5zIiwKLSAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjcvUmFkaXg0RkZUX3Y3LnMiLAotICAgICAgICAgICAgICAgIF0sCi0KLSAgICAgICAgICAgICAgICBjZmxhZ3M6IFsKLSAgICAgICAgICAgICAgICAgICAgIi1EQVJNVjdOZW9uIiwKLSAgICAgICAgICAgICAgICAgICAgIi1EQVJNVjZfSU5BU00iLAotICAgICAgICAgICAgICAgIF0sCi0KLSAgICAgICAgICAgICAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsic3JjL2FzbS9BUk1WNyJdLAotICAgICAgICAgICAgfSwKLSAgICAgICAgfSwKLSAgICB9LAotCi0gICAgLy8gbGlic3RhZ2VmcmlnaHQgbGlua3MgdGhpcyBzdGF0aWMgbGlicmFyeSwgc28gaXQgcHJvYmFibHkgaXNuJ3QgYXBwcm9wcmlhdGUgdG8KLSAgICAvLyBsaW5rIGxpYnN0YWdlZnJpZ2h0LiAgSG93ZXZlciwgdGhpcyBsaWJyYXJ5IGluY2x1ZGVzIGxpYnN0YWdlZnJpZ2h0IGhlYWRlcnMsCi0gICAgLy8gYW5kIG5lZWRzIGxpYmJpbmRlciB0byBiZSBhYmxlIHRvIGRvIHNvIGNvcnJlY3RseS4KLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliYmluZGVyIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2VuY19jb21tb24iLAotICAgIF0sCi0KLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvaW5jbHVkZSIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgIF0sCi0KLSAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgInNyYyIsCi0gICAgICAgICJpbmMiLAotICAgICAgICAiYmFzaWNfb3AiLAotICAgIF0sCi0KLSAgICBjZmxhZ3M6IFsiLVdlcnJvciJdLAotCi0gICAgc2FuaXRpemU6IHsKLSAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKLSAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCi0gICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCi0gICAgICAgIF0sCi0gICAgfSwKLQotfQotCi0vLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X2FhY2VuYyIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKQEAgLTEyNiw2ICsxNCw4IEBACiAKICAgICBjZmxhZ3M6IFsiLVdlcnJvciJdLAogCisgICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCisKICAgICBzYW5pdGl6ZTogewogICAgICAgICBtaXNjX3VuZGVmaW5lZDogWwogICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKQEAgLTE0NywzNiArMzcsMyBAQAogICAgIF0sCiAgICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KLQotY2NfbGlicmFyeV9zaGFyZWQgewotICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X2FhY2VuY192aXN1YWxvbiIsCi0KLSAgICBzcmNzOiBbIlNvZnRBQUNFbmNvZGVyLmNwcCJdLAotCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICBdLAotCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItRE9TQ0xfSU1QT1JUX1JFRj0iLAotICAgICAgICAiLVdlcnJvciIsCi0gICAgXSwKLQotICAgIHNhbml0aXplOiB7Ci0gICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCi0gICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAotICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAotICAgICAgICBdLAotICAgIH0sCi0KLSAgICBzdGF0aWNfbGliczogWyJsaWJzdGFnZWZyaWdodF9hYWNlbmMiXSwKLQotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZW5jX2NvbW1vbiIsCi0gICAgXSwKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU2FtcGxlQ29kZS9BQUNfRV9TQU1QTEVTLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NhbXBsZUNvZGUvQUFDX0VfU0FNUExFUy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjMxZGU0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU2FtcGxlQ29kZS9BQUNfRV9TQU1QTEVTLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODMgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQlBQUNfRV9TQU1QTEVTLmgKLQotCUNvbnRlbnQ6CXNhbXBsZSBjb2RlIGZvciBBQUMgZW5jb2RlcgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZQkJPGRsZmNuLmg+Ci0jaW5jbHVkZQkJPHN0ZGlvLmg+Ci0jaW5jbHVkZQkJPHN0ZGxpYi5oPgotI2luY2x1ZGUJCTxzdHJpbmcuaD4KLSNpbmNsdWRlCQk8dGltZS5oPgotI2luY2x1ZGUJCSJ2b0FBQy5oIgotI2luY2x1ZGUJCSJjbW5NZW1vcnkuaCIKLQotI2RlZmluZSAgVk9fQUFDX0VfT1VUUFVUCSAgMQotI2RlZmluZSBSRUFEX1NJWkUJKDEwMjQqOCkKLXVuc2lnbmVkIGNoYXIgb3V0QnVmWzEwMjQqOF07Ci11bnNpZ25lZCBjaGFyIGluQnVmW1JFQURfU0laRV07Ci0KLWNvbnN0IGNoYXIqIEhlbHBTdHJpbmcgPQotIlZpc3VhbE9uIEFBQyBlbmNvZGVyIFVzYWdlOlxuIgotInZvQUFDRW5jVGVzdCAtaWYgPGlucHV0ZmlsZS5wY20+IC1vZiA8b3V0cHV0ZmlsZS5hYWM+IC1zciA8c2FtcGxlcmF0ZT4gLWNoIDxjaGFubmVsPiAtYnIgPGJpdHJhdGU+IC1hZHRzIDxhZHRzPiBcbiIKLSItaWYgaW5wdXQgZmlsZSBuYW1lIFxuIgotIi1vZiBvdXRwdXQgZmlsZSBuYW1lIFxuIgotIi1zciBpbnB1dCBwY20gc2FtcGxlcmF0ZSwgZGVmYXVsdCA0NDEwMCBcbiIKLSItY2ggaW5wdXQgcGNtIGNoYW5uZWwsIGRlZmF1bHQgMiBjaGFubmVsIFxuIgotIi1iciBlbmNvZGVkIGFhYyBiaXRyYXRlLCBkZWZhdWx0IDY0MDAwICogKHNhbXBsZXJhdGUvMTAwKSpjaGFubmVsLzQ0MSg0ODApXG4iCi0iLWFkdHMgYWRkIG9yIG5vIGFkdHMgaGVhZGVyLCBkZWZhdWx0IGFkZCBhZHRzIGhlYWRlclxuIgotIkZvciBleGFtcGxlOiBcbiIKLSIuL3ZvQUFDRW5jVGVzdCAtaWYgcmF3LnBjbSAtb2YgcmF3LmFhYyAtc3IgNDQxMDAgLWNoIDIgLWJyIDEyODAwMFxuIjsKLQotc3RhdGljIGludCBwYXJzZWNtZGxpbmUoaW50IGFyZ2MsIGNoYXIgKiphcmd2LGNoYXIgICoqaW5wdXRfZmlsZW5hbWUsIGNoYXIgICoqb3V0cHV0X2ZpbGVuYW1lLCBBQUNFTkNfUEFSQU0gKnBhcmFtKQotewotCS8vIG5vdGljZSB0aGF0OgotCS8vIGJpdFJhdGUvbkNoYW5uZWxzID4gODAwMAotCS8vIGJpdFJhdGUvbkNoYW5uZWxzIDwgMTYwMDAwCi0JLy8gYml0UmF0ZS9uQ2hhbm5lbHMgPCBzYW1wbGVSYXRlKjYKLQlwYXJhbS0+YWR0c1VzZWQgPSAxOwotCXBhcmFtLT5iaXRSYXRlID0gMDsKLQlwYXJhbS0+bkNoYW5uZWxzID0gMjsKLQlwYXJhbS0+c2FtcGxlUmF0ZSA9IDQ0MTAwOwotCi0JaWYoYXJnYyA8IDUgfHwgYXJnYyA+IDEzKQotCXsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWFyZ2MtLTsKLQlhcmd2Kys7Ci0Jd2hpbGUgKGFyZ2MgPiAwKQotCXsKLQkJaWYgKCFzdHJjbXAoKmFyZ3YsICItaWYiKSkKLQkJewotCQkJYXJndisrOwotCQkJYXJnYy0tOwotCQkJKmlucHV0X2ZpbGVuYW1lID0gKmFyZ3Y7Ci0JCX0KLQkJZWxzZSBpZiAoIXN0cmNtcCgqYXJndiwgIi1vZiIpKQotCQl7Ci0JCQlhcmd2Kys7Ci0JCQlhcmdjLS07Ci0JCQkqb3V0cHV0X2ZpbGVuYW1lID0gKmFyZ3Y7Ci0JCX0KLQkJZWxzZSBpZiAoIXN0cmNtcCgqYXJndiwgIi1zciIpKQotCQl7Ci0JCQlhcmd2Kys7Ci0JCQlhcmdjLS07Ci0JCQlwYXJhbS0+c2FtcGxlUmF0ZSA9IGF0b2koKmFyZ3YpOwotCQl9Ci0JCWVsc2UgaWYgKCFzdHJjbXAoKmFyZ3YsICItY2giKSkKLQkJewotCQkJYXJndisrOwotCQkJYXJnYy0tOwotCQkJcGFyYW0tPm5DaGFubmVscyA9IGF0b2koKmFyZ3YpOwotCQl9Ci0JCWVsc2UgaWYgKCFzdHJjbXAoKmFyZ3YsICItYnIiKSkKLQkJewotCQkJYXJndisrOwotCQkJYXJnYy0tOwotCQkJcGFyYW0tPmJpdFJhdGUgPSBhdG9pKCphcmd2KTsKLQkJfQotCQllbHNlIGlmKCFzdHJjbXAoKmFyZ3YsICItYWR0cyIpKQotCQl7Ci0JCQlhcmd2Kys7Ci0JCQlhcmdjLS07Ci0JCQlwYXJhbS0+YWR0c1VzZWQgPSBhdG9pKCphcmd2KTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXJldHVybiAtMTsKLQkJfQotCi0JCWFyZ3YrKzsKLQkJYXJnYy0tOwotCX0KLQotCWlmKHBhcmFtLT5iaXRSYXRlID09IDApCi0JewotCQlpbnQgc2NhbGUgPSA0NDE7Ci0JCWlmKHBhcmFtLT5zYW1wbGVSYXRlJTgwMDAgPT0gMCkKLQkJCXNjYWxlID0gNDgwOwotCQlwYXJhbS0+Yml0UmF0ZSA9IDY0MCpwYXJhbS0+bkNoYW5uZWxzKnBhcmFtLT5zYW1wbGVSYXRlL3NjYWxlOwotCX0KLQotCXJldHVybiAwOwotfQotCi1pbnQgUmVhZEZpbGUyQnVmKEZJTEUqIGluZmlsZSx1bnNpZ25lZCBjaGFyKiBkZXN0LGludCByZWFkU2l6ZSkKLXsKLQlpbnQgcmVhZEJ5dGVzID0gMDsKLQlyZWFkQnl0ZXMgPSBmcmVhZChkZXN0LCAxLCByZWFkU2l6ZSwgaW5maWxlKTsKLQlyZXR1cm4gcmVhZEJ5dGVzOwotfQotCi10eXBlZGVmIGludCAoVk9fQVBJICogVk9HRVRBVURJT0RFQ0FQSSkgKFZPX0FVRElPX0NPREVDQVBJICogcERlY0hhbmRsZSk7Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLQlGSUxFCQkJCQkJKmluZmlsZSwgKm91dGZpbGU7Ci0JaW50CQkJCQkJCXQxLCB0MjsKLQlWT19BVURJT19DT0RFQ0FQSQkJCUF1ZGlvQVBJOwotCVZPX01FTV9PUEVSQVRPUgkJCQltb3BlcjsKLQlWT19DT0RFQ19JTklUX1VTRVJEQVRBCQl1c2VEYXRhOwotCVZPX0hBTkRMRQkJCQkJaENvZGVjOwotCVZPX0NPREVDQlVGRkVSCQkJCWluRGF0YTsKLQlWT19DT0RFQ0JVRkZFUgkJCQlvdXREYXRhOwotCVZPX0FVRElPX09VVFBVVElORk8JCQlvdXRJbmZvOwotICAgIGludAkJCQkJCQlmaXJzdFdyaXRlID0gMTsKLQlpbnQJCQkJCQkJZW9mRmlsZSA9IDA7Ci0JaW50CQkJCQkJCSppbmZvPShpbnQqKWluQnVmOwotCWludAkJCQkJCQlieXRlc0xlZnQsIG5SZWFkOwotCWludAkJCQkJCQlFbmNvZGVyZEZyYW1lID0gMDsKLQlpbnQJCQkJCQkJdG90YWwgPSAwOwotCWludAkJCQkJCQlpc091dHB1dCA9IDE7Ci0JaW50CQkJCQkJCXJldHVybkNvZGU7Ci0JQUFDRU5DX1BBUkFNCQkJCWFhY3BhcmE7Ci0Jdm9pZAkJCQkJCSpoYW5kbGU7Ci0Jdm9pZAkJCQkJCSpwZnVuYzsKLQlWT0dFVEFVRElPREVDQVBJCQkJcEdldEFQSTsKLQljb25zdCBjaGFyCQkJCQkqaW5maWxlTmFtZSA9IE5VTEw7Ci0gICAgY29uc3QgY2hhcgkJCQkJKm91dGZpbGVOYW1lID0gTlVMTDsKLQotCXJldHVybkNvZGUgPSBwYXJzZWNtZGxpbmUoYXJnYyxhcmd2LCAmaW5maWxlTmFtZSwgJm91dGZpbGVOYW1lLCAmYWFjcGFyYSk7Ci0JaWYocmV0dXJuQ29kZSkKLQl7Ci0JCXByaW50ZigiJXMiLCBIZWxwU3RyaW5nKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogb3BlbiBpbnB1dCBmaWxlICovCi0JaW5maWxlID0gZm9wZW4oaW5maWxlTmFtZSwgInJiIik7Ci0JaWYgKCFpbmZpbGUpIHsKLQkJcHJpbnRmKCJPcGVuIGlucHV0IGZpbGUgZmFpbC4uLiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyogb3BlbiBvdXRwdXQgZmlsZSAqLwotCWlmKGlzT3V0cHV0KQotCXsKLQkJb3V0ZmlsZSA9IGZvcGVuKG91dGZpbGVOYW1lLCAid2IiKTsKLQkJaWYgKCFvdXRmaWxlKSB7Ci0JCQlwcmludGYoIk9wZW4gb3V0cHV0IGZpbGUgZmFpbC4uLiIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCS8vIHNldCBtZW1vcnkgb3BlcmF0b3JzOwotCW1vcGVyLkFsbG9jID0gY21uTWVtQWxsb2M7Ci0JbW9wZXIuQ29weSA9IGNtbk1lbUNvcHk7Ci0JbW9wZXIuRnJlZSA9IGNtbk1lbUZyZWU7Ci0JbW9wZXIuU2V0ID0gY21uTWVtU2V0OwotCW1vcGVyLkNoZWNrID0gY21uTWVtQ2hlY2s7Ci0JdXNlRGF0YS5tZW1mbGFnID0gVk9fSU1GX1VTRVJNRU1PUEVSQVRPUjsKLQl1c2VEYXRhLm1lbURhdGEgPSAoVk9fUFRSKSgmbW9wZXIpOwotCS8vIG9wZW4gZW5jb2RlciBkbGw7Ci0JaGFuZGxlID0gZGxvcGVuKCJsaWJzdGFnZWZyaWdodC5zbyIsIFJUTERfTk9XKTsKLQlpZihoYW5kbGUgPT0gMCkKLQl7Ci0JCXByaW50Zigib3BlbiBkbGwgZXJyb3IuLi4uLi4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQkvLyBHZXQgQVBJOwotCXBmdW5jID0gZGxzeW0oaGFuZGxlLCAidm9HZXRBQUNFbmNBUEkiKTsKLQlpZihwZnVuYyA9PSAwKQotCXsKLQkJcHJpbnRmKCJvcGVuIGZ1bmN0aW9uIGVycm9yLi4uLi4uIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcEdldEFQSSA9IChWT0dFVEFVRElPREVDQVBJKXBmdW5jOwotCXJldHVybkNvZGUgID0gcEdldEFQSSgmQXVkaW9BUEkpOwotCWlmKHJldHVybkNvZGUpCi0JCXJldHVybiAtMTsKLQotCi0vLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgIEluaXQgRW5jb2RpbmcgU2VjdGlvbiAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0JcmV0dXJuQ29kZSA9IEF1ZGlvQVBJLkluaXQoJmhDb2RlYywgVk9fQVVESU9fQ29kaW5nQUFDLCAmdXNlRGF0YSk7Ci0JaWYocmV0dXJuQ29kZSA8IDApCi0JewotCQlwcmludGYoIiMjIyMgVk9JX0Vycm9yMjpmYWlsIHRvIGluaXRpYWxpemUgdGhlIEVuY29kZXJyIyMjXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJldHVybkNvZGUgPSBBdWRpb0FQSS5TZXRQYXJhbShoQ29kZWMsIFZPX1BJRF9BQUNfRU5DUEFSQU0sICZhYWNwYXJhKTsKLQotCWluRGF0YS5CdWZmZXIgPSBpbkJ1ZjsKLQlieXRlc0xlZnQgPSBSZWFkRmlsZTJCdWYoaW5maWxlLGluRGF0YS5CdWZmZXIsUkVBRF9TSVpFKTsKLQotLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgICAgRW5jb2RpbmcgU2VjdGlvbiAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLQlkbyB7Ci0KLQkJaW5EYXRhLkxlbmd0aCAgICA9IGJ5dGVzTGVmdDsKLQkJb3V0RGF0YS5CdWZmZXIgICA9IG91dEJ1ZjsKLQkJb3V0RGF0YS5MZW5ndGggPSAxMDI0Kjg7Ci0KLQkJdDEgPSBjbG9jaygpOwotCi0JCXJldHVybkNvZGUgPSBBdWRpb0FQSS5TZXRJbnB1dERhdGEoaENvZGVjLCZpbkRhdGEpOwotCi0JCWRvIHsKLQkJCW91dERhdGEuQnVmZmVyICAgPSBvdXRCdWY7Ci0JCQlvdXREYXRhLkxlbmd0aCA9IDEwMjQqODsKLQotCQkJcmV0dXJuQ29kZSA9IEF1ZGlvQVBJLkdldE91dHB1dERhdGEoaENvZGVjLCZvdXREYXRhLCAmb3V0SW5mbyk7Ci0KLQkJCWlmKHJldHVybkNvZGUgPT0gMCkKLQkJCQlFbmNvZGVyZEZyYW1lKys7Ci0JCQlpZihyZXR1cm5Db2RlID09IFZPX0VSUl9MSUNFTlNFX0VSUk9SKQotCQkJCWJyZWFrOwotCi0jaWYgVk9fQUFDX0VfT1VUUFVUCi0JCQlpZiAoaXNPdXRwdXQgJiYgcmV0dXJuQ29kZSA9PSAwKQotCQkJewotCQkJCWZ3cml0ZShvdXREYXRhLkJ1ZmZlciwgMSwgb3V0RGF0YS5MZW5ndGgsIG91dGZpbGUpOwotCQkJfQotI2VuZGlmCi0JCX0gd2hpbGUocmV0dXJuQ29kZSAhPSAoVk9fRVJSX0lOUFVUX0JVRkZFUl9TTUFMTCkpOwotCi0JCWlmKHJldHVybkNvZGUgPT0gVk9fRVJSX0xJQ0VOU0VfRVJST1IpCi0JCQlicmVhazsKLQotCQl0MiA9IGNsb2NrKCk7Ci0JCXRvdGFsICs9IHQyIC0gdDE7Ci0KLQkJaWYgKCFlb2ZGaWxlKSB7Ci0JCQluUmVhZCA9IFJlYWRGaWxlMkJ1ZihpbmZpbGUsIGluQnVmLFJFQURfU0laRSk7Ci0JCQlieXRlc0xlZnQgPSBuUmVhZDsKLQkJCWluRGF0YS5CdWZmZXIgPSBpbkJ1ZjsKLQkJCWlmIChmZW9mKGluZmlsZSkpCi0JCQkJZW9mRmlsZSA9IDE7Ci0JCX0KLQotCX0gd2hpbGUgKCFlb2ZGaWxlICYmIHJldHVybkNvZGUpOwotCi0KLS8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICBFbmQgRW5jb2RpbmcgU2VjdGlvbiAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCXJldHVybkNvZGUgPSBBdWRpb0FQSS5VbmluaXQoaENvZGVjKTsKLQotCWZjbG9zZShpbmZpbGUpOwotCWlmIChvdXRmaWxlKQotICAgIHsKLSAgICAgICAgZmNsb3NlKG91dGZpbGUpOwotICAgIH0KLQlkbGNsb3NlKGhhbmRsZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9TYW1wbGVDb2RlL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NhbXBsZUNvZGUvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZiYTRmMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NhbXBsZUNvZGUvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLWNjX2JpbmFyeSB7Ci0gICAgbmFtZTogIkFBQ0VuY1Rlc3QiLAotCi0gICAgc3JjczogWyJBQUNfRV9TQU1QTEVTLmMiXSwKLQotICAgIGFyY2g6IHsKLSAgICAgICAgYXJtOiB7Ci0gICAgICAgICAgICBpbnN0cnVjdGlvbl9zZXQ6ICJhcm0iLAotICAgICAgICB9LAotICAgIH0sCi0KLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAotICAgICAgICAibGliZGwiLAotICAgIF0sCi0KLSAgICBzdGF0aWNfbGliczogWyJsaWJzdGFnZWZyaWdodF9lbmNfY29tbW9uIl0sCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NhbXBsZUNvZGUvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU2FtcGxlQ29kZS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU2FtcGxlQ29kZS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU2FtcGxlQ29kZS9OT1RJQ0UgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NhbXBsZUNvZGUvTk9USUNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWIxZWZhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU2FtcGxlQ29kZS9OT1RJQ0UKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotCi0gICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU29mdEFBQ0VuY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9Tb2Z0QUFDRW5jb2Rlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MDQyOTQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9Tb2Z0QUFDRW5jb2Rlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1OTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiU29mdEFBQ0VuY29kZXIiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJTb2Z0QUFDRW5jb2Rlci5oIgotCi0jaW5jbHVkZSAidm9BQUMuaCIKLSNpbmNsdWRlICJjbW5NZW1vcnkuaCIKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotdGVtcGxhdGU8Y2xhc3MgVD4KLXN0YXRpYyB2b2lkIEluaXRPTVhQYXJhbXMoVCAqcGFyYW1zKSB7Ci0gICAgcGFyYW1zLT5uU2l6ZSA9IHNpemVvZihUKTsKLSAgICBwYXJhbXMtPm5WZXJzaW9uLnMublZlcnNpb25NYWpvciA9IDE7Ci0gICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5WZXJzaW9uTWlub3IgPSAwOwotICAgIHBhcmFtcy0+blZlcnNpb24ucy5uUmV2aXNpb24gPSAwOwotICAgIHBhcmFtcy0+blZlcnNpb24ucy5uU3RlcCA9IDA7Ci19Ci0KLVNvZnRBQUNFbmNvZGVyOjpTb2Z0QUFDRW5jb2RlcigKLSAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAotICAgICAgICBPTVhfUFRSIGFwcERhdGEsCi0gICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KQotICAgIDogU2ltcGxlU29mdE9NWENvbXBvbmVudChuYW1lLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCksCi0gICAgICBtRW5jb2RlckhhbmRsZShOVUxMKSwKLSAgICAgIG1BcGlIYW5kbGUoTlVMTCksCi0gICAgICBtTWVtT3BlcmF0b3IoTlVMTCksCi0gICAgICBtTnVtQ2hhbm5lbHMoMSksCi0gICAgICBtU2FtcGxlUmF0ZSg0NDEwMCksCi0gICAgICBtQml0UmF0ZSgwKSwKLSAgICAgIG1TZW50Q29kZWNTcGVjaWZpY0RhdGEoZmFsc2UpLAotICAgICAgbUlucHV0U2l6ZSgwKSwKLSAgICAgIG1JbnB1dEZyYW1lKE5VTEwpLAotICAgICAgbUlucHV0VGltZVVzKC0xbGwpLAotICAgICAgbVNhd0lucHV0RU9TKGZhbHNlKSwKLSAgICAgIG1TaWduYWxsZWRFcnJvcihmYWxzZSkgewotICAgIGluaXRQb3J0cygpOwotICAgIENIRUNLX0VRKGluaXRFbmNvZGVyKCksIChzdGF0dXNfdClPSyk7Ci0KLSAgICBzZXRBdWRpb1BhcmFtcygpOwotfQotCi1Tb2Z0QUFDRW5jb2Rlcjo6flNvZnRBQUNFbmNvZGVyKCkgewotICAgIG9uUmVzZXQoKTsKLQotICAgIGlmIChtRW5jb2RlckhhbmRsZSkgewotICAgICAgICBDSEVDS19FUSgoVk9fVTMyKVZPX0VSUl9OT05FLCBtQXBpSGFuZGxlLT5VbmluaXQobUVuY29kZXJIYW5kbGUpKTsKLSAgICAgICAgbUVuY29kZXJIYW5kbGUgPSBOVUxMOwotICAgIH0KLQotICAgIGRlbGV0ZSBtQXBpSGFuZGxlOwotICAgIG1BcGlIYW5kbGUgPSBOVUxMOwotCi0gICAgZGVsZXRlIG1NZW1PcGVyYXRvcjsKLSAgICBtTWVtT3BlcmF0b3IgPSBOVUxMOwotfQotCi12b2lkIFNvZnRBQUNFbmNvZGVyOjppbml0UG9ydHMoKSB7Ci0gICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSBkZWY7Ci0gICAgSW5pdE9NWFBhcmFtcygmZGVmKTsKLQotICAgIGRlZi5uUG9ydEluZGV4ID0gMDsKLSAgICBkZWYuZURpciA9IE9NWF9EaXJJbnB1dDsKLSAgICBkZWYubkJ1ZmZlckNvdW50TWluID0ga051bUJ1ZmZlcnM7Ci0gICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA9IGRlZi5uQnVmZmVyQ291bnRNaW47Ci0gICAgZGVmLm5CdWZmZXJTaXplID0ga051bVNhbXBsZXNQZXJGcmFtZSAqIHNpemVvZihpbnQxNl90KSAqIDI7Ci0gICAgZGVmLmJFbmFibGVkID0gT01YX1RSVUU7Ci0gICAgZGVmLmJQb3B1bGF0ZWQgPSBPTVhfRkFMU0U7Ci0gICAgZGVmLmVEb21haW4gPSBPTVhfUG9ydERvbWFpbkF1ZGlvOwotICAgIGRlZi5iQnVmZmVyc0NvbnRpZ3VvdXMgPSBPTVhfRkFMU0U7Ci0gICAgZGVmLm5CdWZmZXJBbGlnbm1lbnQgPSAxOwotCi0gICAgZGVmLmZvcm1hdC5hdWRpby5jTUlNRVR5cGUgPSBjb25zdF9jYXN0PGNoYXIgKj4oImF1ZGlvL3JhdyIpOwotICAgIGRlZi5mb3JtYXQuYXVkaW8ucE5hdGl2ZVJlbmRlciA9IE5VTEw7Ci0gICAgZGVmLmZvcm1hdC5hdWRpby5iRmxhZ0Vycm9yQ29uY2VhbG1lbnQgPSBPTVhfRkFMU0U7Ci0gICAgZGVmLmZvcm1hdC5hdWRpby5lRW5jb2RpbmcgPSBPTVhfQVVESU9fQ29kaW5nUENNOwotCi0gICAgYWRkUG9ydChkZWYpOwotCi0gICAgZGVmLm5Qb3J0SW5kZXggPSAxOwotICAgIGRlZi5lRGlyID0gT01YX0Rpck91dHB1dDsKLSAgICBkZWYubkJ1ZmZlckNvdW50TWluID0ga051bUJ1ZmZlcnM7Ci0gICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA9IGRlZi5uQnVmZmVyQ291bnRNaW47Ci0gICAgZGVmLm5CdWZmZXJTaXplID0gODE5MjsKLSAgICBkZWYuYkVuYWJsZWQgPSBPTVhfVFJVRTsKLSAgICBkZWYuYlBvcHVsYXRlZCA9IE9NWF9GQUxTRTsKLSAgICBkZWYuZURvbWFpbiA9IE9NWF9Qb3J0RG9tYWluQXVkaW87Ci0gICAgZGVmLmJCdWZmZXJzQ29udGlndW91cyA9IE9NWF9GQUxTRTsKLSAgICBkZWYubkJ1ZmZlckFsaWdubWVudCA9IDI7Ci0KLSAgICBkZWYuZm9ybWF0LmF1ZGlvLmNNSU1FVHlwZSA9IGNvbnN0X2Nhc3Q8Y2hhciAqPigiYXVkaW8vYWFjIik7Ci0gICAgZGVmLmZvcm1hdC5hdWRpby5wTmF0aXZlUmVuZGVyID0gTlVMTDsKLSAgICBkZWYuZm9ybWF0LmF1ZGlvLmJGbGFnRXJyb3JDb25jZWFsbWVudCA9IE9NWF9GQUxTRTsKLSAgICBkZWYuZm9ybWF0LmF1ZGlvLmVFbmNvZGluZyA9IE9NWF9BVURJT19Db2RpbmdBQUM7Ci0KLSAgICBhZGRQb3J0KGRlZik7Ci19Ci0KLXN0YXR1c190IFNvZnRBQUNFbmNvZGVyOjppbml0RW5jb2RlcigpIHsKLSAgICBtQXBpSGFuZGxlID0gbmV3IFZPX0FVRElPX0NPREVDQVBJOwotCi0gICAgaWYgKFZPX0VSUl9OT05FICE9IHZvR2V0QUFDRW5jQVBJKG1BcGlIYW5kbGUpKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IGFwaSBoYW5kbGUiKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgbU1lbU9wZXJhdG9yID0gbmV3IFZPX01FTV9PUEVSQVRPUjsKLSAgICBtTWVtT3BlcmF0b3ItPkFsbG9jID0gY21uTWVtQWxsb2M7Ci0gICAgbU1lbU9wZXJhdG9yLT5Db3B5ID0gY21uTWVtQ29weTsKLSAgICBtTWVtT3BlcmF0b3ItPkZyZWUgPSBjbW5NZW1GcmVlOwotICAgIG1NZW1PcGVyYXRvci0+U2V0ID0gY21uTWVtU2V0OwotICAgIG1NZW1PcGVyYXRvci0+Q2hlY2sgPSBjbW5NZW1DaGVjazsKLQotICAgIFZPX0NPREVDX0lOSVRfVVNFUkRBVEEgdXNlckRhdGE7Ci0gICAgbWVtc2V0KCZ1c2VyRGF0YSwgMCwgc2l6ZW9mKHVzZXJEYXRhKSk7Ci0gICAgdXNlckRhdGEubWVtZmxhZyA9IFZPX0lNRl9VU0VSTUVNT1BFUkFUT1I7Ci0gICAgdXNlckRhdGEubWVtRGF0YSA9IChWT19QVFIpIG1NZW1PcGVyYXRvcjsKLSAgICBpZiAoVk9fRVJSX05PTkUgIT0KLSAgICAgICAgICAgIG1BcGlIYW5kbGUtPkluaXQoJm1FbmNvZGVySGFuZGxlLCBWT19BVURJT19Db2RpbmdBQUMsICZ1c2VyRGF0YSkpIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0IEFBQyBlbmNvZGVyIik7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotT01YX0VSUk9SVFlQRSBTb2Z0QUFDRW5jb2Rlcjo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoCi0gICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKSB7Ci0gICAgc3dpdGNoIChpbmRleCkgewotICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgotICAgICAgICB7Ci0gICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9Ci0gICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKLQotICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+bkluZGV4ID4gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb01vcmU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nID0KLSAgICAgICAgICAgICAgICAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDApCi0gICAgICAgICAgICAgICAgICAgID8gT01YX0FVRElPX0NvZGluZ1BDTSA6IE9NWF9BVURJT19Db2RpbmdBQUM7Ci0KLSAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvQWFjOgotICAgICAgICB7Ci0gICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fQUFDUFJPRklMRVRZUEUgKmFhY1BhcmFtcyA9Ci0gICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9BQUNQUk9GSUxFVFlQRSAqKXBhcmFtczsKLQotICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oYWFjUGFyYW1zKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChhYWNQYXJhbXMtPm5Qb3J0SW5kZXggIT0gMSkgewotICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFhY1BhcmFtcy0+bkJpdFJhdGUgPSBtQml0UmF0ZTsKLSAgICAgICAgICAgIGFhY1BhcmFtcy0+bkF1ZGlvQmFuZFdpZHRoID0gMDsKLSAgICAgICAgICAgIGFhY1BhcmFtcy0+bkFBQ3Rvb2xzID0gMDsKLSAgICAgICAgICAgIGFhY1BhcmFtcy0+bkFBQ0VSdG9vbHMgPSAwOwotICAgICAgICAgICAgYWFjUGFyYW1zLT5lQUFDUHJvZmlsZSA9IE9NWF9BVURJT19BQUNPYmplY3RNYWluOwotICAgICAgICAgICAgYWFjUGFyYW1zLT5lQUFDU3RyZWFtRm9ybWF0ID0gT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdE1QNEZGOwotICAgICAgICAgICAgYWFjUGFyYW1zLT5lQ2hhbm5lbE1vZGUgPSBPTVhfQVVESU9fQ2hhbm5lbE1vZGVTdGVyZW87Ci0KLSAgICAgICAgICAgIGFhY1BhcmFtcy0+bkNoYW5uZWxzID0gbU51bUNoYW5uZWxzOwotICAgICAgICAgICAgYWFjUGFyYW1zLT5uU2FtcGxlUmF0ZSA9IG1TYW1wbGVSYXRlOwotICAgICAgICAgICAgYWFjUGFyYW1zLT5uRnJhbWVMZW5ndGggPSAwOwotCi0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BjbToKLSAgICAgICAgewotICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICpwY21QYXJhbXMgPQotICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKilwYXJhbXM7Ci0KLSAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKHBjbVBhcmFtcykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocGNtUGFyYW1zLT5uUG9ydEluZGV4ICE9IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwY21QYXJhbXMtPmVOdW1EYXRhID0gT01YX051bWVyaWNhbERhdGFTaWduZWQ7Ci0gICAgICAgICAgICBwY21QYXJhbXMtPmVFbmRpYW4gPSBPTVhfRW5kaWFuQmlnOwotICAgICAgICAgICAgcGNtUGFyYW1zLT5iSW50ZXJsZWF2ZWQgPSBPTVhfVFJVRTsKLSAgICAgICAgICAgIHBjbVBhcmFtcy0+bkJpdFBlclNhbXBsZSA9IDE2OwotICAgICAgICAgICAgcGNtUGFyYW1zLT5lUENNTW9kZSA9IE9NWF9BVURJT19QQ01Nb2RlTGluZWFyOwotICAgICAgICAgICAgcGNtUGFyYW1zLT5lQ2hhbm5lbE1hcHBpbmdbMF0gPSBPTVhfQVVESU9fQ2hhbm5lbExGOwotICAgICAgICAgICAgcGNtUGFyYW1zLT5lQ2hhbm5lbE1hcHBpbmdbMV0gPSBPTVhfQVVESU9fQ2hhbm5lbFJGOwotCi0gICAgICAgICAgICBwY21QYXJhbXMtPm5DaGFubmVscyA9IG1OdW1DaGFubmVsczsKLSAgICAgICAgICAgIHBjbVBhcmFtcy0+blNhbXBsaW5nUmF0ZSA9IG1TYW1wbGVSYXRlOwotCi0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoaW5kZXgsIHBhcmFtcyk7Ci0gICAgfQotfQotCi1PTVhfRVJST1JUWVBFIFNvZnRBQUNFbmNvZGVyOjppbnRlcm5hbFNldFBhcmFtZXRlcigKLSAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpIHsKLSAgICBzd2l0Y2ggKGluZGV4KSB7Ci0gICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1TdGFuZGFyZENvbXBvbmVudFJvbGU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnN0IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqcm9sZVBhcmFtcyA9Ci0gICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqKXBhcmFtczsKLQotICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0ocm9sZVBhcmFtcykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc3RybmNtcCgoY29uc3QgY2hhciAqKXJvbGVQYXJhbXMtPmNSb2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvX2VuY29kZXIuYWFjIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFIC0gMSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KLSAgICAgICAgICAgICAgICAoY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOwotCi0gICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmb3JtYXRQYXJhbXMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAwCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyAhPSBPTVhfQVVESU9fQ29kaW5nUENNKQotICAgICAgICAgICAgICAgIHx8IChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgIT0gT01YX0FVRElPX0NvZGluZ0FBQykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb0FhYzoKLSAgICAgICAgewotICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX0FBQ1BST0ZJTEVUWVBFICphYWNQYXJhbXMgPQotICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fQUFDUFJPRklMRVRZUEUgKilwYXJhbXM7Ci0KLSAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGFhY1BhcmFtcykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoYWFjUGFyYW1zLT5uUG9ydEluZGV4ICE9IDEpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtQml0UmF0ZSA9IGFhY1BhcmFtcy0+bkJpdFJhdGU7Ci0gICAgICAgICAgICBtTnVtQ2hhbm5lbHMgPSBhYWNQYXJhbXMtPm5DaGFubmVsczsKLSAgICAgICAgICAgIG1TYW1wbGVSYXRlID0gYWFjUGFyYW1zLT5uU2FtcGxlUmF0ZTsKLQotICAgICAgICAgICAgaWYgKHNldEF1ZGlvUGFyYW1zKCkgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BjbToKLSAgICAgICAgewotICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICpwY21QYXJhbXMgPQotICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKilwYXJhbXM7Ci0KLSAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKHBjbVBhcmFtcykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocGNtUGFyYW1zLT5uUG9ydEluZGV4ICE9IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtTnVtQ2hhbm5lbHMgPSBwY21QYXJhbXMtPm5DaGFubmVsczsKLSAgICAgICAgICAgIG1TYW1wbGVSYXRlID0gcGNtUGFyYW1zLT5uU2FtcGxpbmdSYXRlOwotCi0gICAgICAgICAgICBpZiAoc2V0QXVkaW9QYXJhbXMoKSAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwotICAgICAgICB9Ci0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmludGVybmFsU2V0UGFyYW1ldGVyKGluZGV4LCBwYXJhbXMpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgU29mdEFBQ0VuY29kZXI6OnNldEF1ZGlvUGFyYW1zKCkgewotICAgIC8vIFdlIGNhbGwgdGhpcyB3aGVuZXZlciBzYW1wbGUgcmF0ZSwgbnVtYmVyIG9mIGNoYW5uZWxzIG9yIGJpdHJhdGUgY2hhbmdlCi0gICAgLy8gaW4gcmVwb25zZSB0byBzZXRQYXJhbWV0ZXIgY2FsbHMuCi0KLSAgICBBTE9HVigic2V0QXVkaW9QYXJhbXM6ICV1IEh6LCAldSBjaGFubmVscywgJXUgYnBzIiwKLSAgICAgICAgIG1TYW1wbGVSYXRlLCBtTnVtQ2hhbm5lbHMsIG1CaXRSYXRlKTsKLQotICAgIHN0YXR1c190IGVyciA9IHNldEF1ZGlvU3BlY2lmaWNDb25maWdEYXRhKCk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgQUFDRU5DX1BBUkFNIHBhcmFtczsKLSAgICBtZW1zZXQoJnBhcmFtcywgMCwgc2l6ZW9mKHBhcmFtcykpOwotICAgIHBhcmFtcy5zYW1wbGVSYXRlID0gbVNhbXBsZVJhdGU7Ci0gICAgcGFyYW1zLmJpdFJhdGUgPSBtQml0UmF0ZTsKLSAgICBwYXJhbXMubkNoYW5uZWxzID0gbU51bUNoYW5uZWxzOwotICAgIHBhcmFtcy5hZHRzVXNlZCA9IDA7ICAvLyBXZSBhZGQgYWR0cyBoZWFkZXIgaW4gdGhlIGZpbGUgd3JpdGVyIGlmIG5lZWRlZC4KLSAgICBpZiAoVk9fRVJSX05PTkUgIT0gbUFwaUhhbmRsZS0+U2V0UGFyYW0oCi0gICAgICAgICAgICAgICAgbUVuY29kZXJIYW5kbGUsIFZPX1BJRF9BQUNfRU5DUEFSQU0sICAmcGFyYW1zKSkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBBQUMgZW5jb2RlciBwYXJhbWV0ZXJzIik7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdGljIHN0YXR1c190IGdldFNhbXBsZVJhdGVUYWJsZUluZGV4KGludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCAmaW5kZXgpIHsKLSAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrU2FtcGxlUmF0ZVRhYmxlW10gPSB7Ci0gICAgICAgIDk2MDAwLCA4ODIwMCwgNjQwMDAsIDQ4MDAwLCA0NDEwMCwgMzIwMDAsCi0gICAgICAgIDI0MDAwLCAyMjA1MCwgMTYwMDAsIDEyMDAwLCAxMTAyNSwgODAwMAotICAgIH07Ci0gICAgY29uc3QgaW50MzJfdCB0YWJsZVNpemUgPQotICAgICAgICBzaXplb2Yoa1NhbXBsZVJhdGVUYWJsZSkgLyBzaXplb2Yoa1NhbXBsZVJhdGVUYWJsZVswXSk7Ci0KLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCB0YWJsZVNpemU7ICsraSkgewotICAgICAgICBpZiAoc2FtcGxlUmF0ZSA9PSBrU2FtcGxlUmF0ZVRhYmxlW2ldKSB7Ci0gICAgICAgICAgICBpbmRleCA9IGk7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLX0KLQotc3RhdHVzX3QgU29mdEFBQ0VuY29kZXI6OnNldEF1ZGlvU3BlY2lmaWNDb25maWdEYXRhKCkgewotICAgIC8vIFRoZSBBQUMgZW5jb2RlcidzIGF1ZGlvIHNwZWNpZmljIGNvbmZpZyByZWFsbHkgb25seSBlbmNvZGVzCi0gICAgLy8gbnVtYmVyIG9mIGNoYW5uZWxzIGFuZCB0aGUgc2FtcGxlIHJhdGUgKG1hcHBlZCB0byBhbiBpbmRleCBpbnRvCi0gICAgLy8gYSBmaXhlZCBzYW1wbGUgcmF0ZSB0YWJsZSkuCi0KLSAgICBpbnQzMl90IGluZGV4OwotICAgIHN0YXR1c190IGVyciA9IGdldFNhbXBsZVJhdGVUYWJsZUluZGV4KG1TYW1wbGVSYXRlLCBpbmRleCk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgc2FtcGxlIHJhdGUgKCV1IEh6KSIsIG1TYW1wbGVSYXRlKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiAobU51bUNoYW5uZWxzID4gMiB8fCBtTnVtQ2hhbm5lbHMgPD0gMCkgewotICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGNoYW5uZWxzKCV1KSIsIG1OdW1DaGFubmVscyk7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIC8vIE9NWF9BVURJT19BQUNPYmplY3RMQwotICAgIG1BdWRpb1NwZWNpZmljQ29uZmlnRGF0YVswXSA9ICgoMHgwMiA8PCAzKSB8IChpbmRleCA+PiAxKSk7Ci0gICAgbUF1ZGlvU3BlY2lmaWNDb25maWdEYXRhWzFdID0gKChpbmRleCAmIDB4MDEpIDw8IDcpIHwgKG1OdW1DaGFubmVscyA8PCAzKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBTb2Z0QUFDRW5jb2Rlcjo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIC8qcG9ydEluZGV4Ki8pIHsKLSAgICBpZiAobVNpZ25hbGxlZEVycm9yKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJmluUXVldWUgPSBnZXRQb3J0UXVldWUoMCk7Ci0gICAgTGlzdDxCdWZmZXJJbmZvICo+ICZvdXRRdWV1ZSA9IGdldFBvcnRRdWV1ZSgxKTsKLQotICAgIGlmICghbVNlbnRDb2RlY1NwZWNpZmljRGF0YSkgewotICAgICAgICAvLyBUaGUgdmVyeSBmaXJzdCB0aGluZyB3ZSB3YW50IHRvIG91dHB1dCBpcyB0aGUgY29kZWMgc3BlY2lmaWMKLSAgICAgICAgLy8gZGF0YS4gSXQgZG9lcyBub3QgcmVxdWlyZSBhbnkgaW5wdXQgZGF0YSBidXQgd2Ugd2lsbCBuZWVkIGFuCi0gICAgICAgIC8vIG91dHB1dCBidWZmZXIgdG8gc3RvcmUgaXQgaW4uCi0KLSAgICAgICAgaWYgKG91dFF1ZXVlLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIEJ1ZmZlckluZm8gKm91dEluZm8gPSAqb3V0UXVldWUuYmVnaW4oKTsKLSAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7Ci0gICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IHNpemVvZihtQXVkaW9TcGVjaWZpY0NvbmZpZ0RhdGEpOwotICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHOwotCi0gICAgICAgIHVpbnQ4X3QgKm91dCA9IG91dEhlYWRlci0+cEJ1ZmZlciArIG91dEhlYWRlci0+bk9mZnNldDsKLSAgICAgICAgbWVtY3B5KG91dCwgbUF1ZGlvU3BlY2lmaWNDb25maWdEYXRhLCBzaXplb2YobUF1ZGlvU3BlY2lmaWNDb25maWdEYXRhKSk7Ci0KLSNpZiAwCi0gICAgICAgIEFMT0dJKCJzZW5kaW5nIGNvZGVjIHNwZWNpZmljIGRhdGEuIik7Ci0gICAgICAgIGhleGR1bXAob3V0LCBzaXplb2YobUF1ZGlvU3BlY2lmaWNDb25maWdEYXRhKSk7Ci0jZW5kaWYKLQotICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKLSAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwotICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOwotCi0gICAgICAgIG1TZW50Q29kZWNTcGVjaWZpY0RhdGEgPSB0cnVlOwotICAgIH0KLQotICAgIHNpemVfdCBudW1CeXRlc1BlcklucHV0RnJhbWUgPQotICAgICAgICBtTnVtQ2hhbm5lbHMgKiBrTnVtU2FtcGxlc1BlckZyYW1lICogc2l6ZW9mKGludDE2X3QpOwotCi0gICAgZm9yICg7OykgewotICAgICAgICAvLyBXZSBkbyB0aGUgZm9sbG93aW5nIHVudGlsIHdlIHJ1biBvdXQgb2YgYnVmZmVycy4KLQotICAgICAgICB3aGlsZSAobUlucHV0U2l6ZSA8IG51bUJ5dGVzUGVySW5wdXRGcmFtZSkgewotICAgICAgICAgICAgLy8gQXMgbG9uZyBhcyB0aGVyZSdzIHN0aWxsIGlucHV0IGRhdGEgdG8gYmUgcmVhZCB3ZQotICAgICAgICAgICAgLy8gd2lsbCBkcmFpbiAia051bVNhbXBsZXNQZXJGcmFtZSAqIG1OdW1DaGFubmVscyIgc2FtcGxlcwotICAgICAgICAgICAgLy8gaW50byB0aGUgIm1JbnB1dEZyYW1lIiBidWZmZXIgYW5kIHRoZW4gZW5jb2RlIHRob3NlCi0gICAgICAgICAgICAvLyBhcyBhIHVuaXQgaW50byBhbiBvdXRwdXQgYnVmZmVyLgotCi0gICAgICAgICAgICBpZiAobVNhd0lucHV0RU9TIHx8IGluUXVldWUuZW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQnVmZmVySW5mbyAqaW5JbmZvID0gKmluUXVldWUuYmVnaW4oKTsKLSAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciA9IGluSW5mby0+bUhlYWRlcjsKLQotICAgICAgICAgICAgY29uc3Qgdm9pZCAqaW5EYXRhID0gaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKLQotICAgICAgICAgICAgc2l6ZV90IGNvcHkgPSBudW1CeXRlc1BlcklucHV0RnJhbWUgLSBtSW5wdXRTaXplOwotICAgICAgICAgICAgaWYgKGNvcHkgPiBpbkhlYWRlci0+bkZpbGxlZExlbikgewotICAgICAgICAgICAgICAgIGNvcHkgPSBpbkhlYWRlci0+bkZpbGxlZExlbjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1JbnB1dEZyYW1lID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtSW5wdXRGcmFtZSA9IG5ldyBpbnQxNl90W2tOdW1TYW1wbGVzUGVyRnJhbWUgKiBtTnVtQ2hhbm5lbHNdOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobUlucHV0U2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgbUlucHV0VGltZVVzID0gaW5IZWFkZXItPm5UaW1lU3RhbXA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1lbWNweSgodWludDhfdCAqKW1JbnB1dEZyYW1lICsgbUlucHV0U2l6ZSwgaW5EYXRhLCBjb3B5KTsKLSAgICAgICAgICAgIG1JbnB1dFNpemUgKz0gY29weTsKLQotICAgICAgICAgICAgaW5IZWFkZXItPm5PZmZzZXQgKz0gY29weTsKLSAgICAgICAgICAgIGluSGVhZGVyLT5uRmlsbGVkTGVuIC09IGNvcHk7Ci0KLSAgICAgICAgICAgIC8vICJUaW1lIiBvbiB0aGUgaW5wdXQgYnVmZmVyIGhhcyBpbiBlZmZlY3QgYWR2YW5jZWQgYnkgdGhlCi0gICAgICAgICAgICAvLyBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHdlIGp1c3QgYWR2YW5jZWQgbk9mZnNldCBieS4KLSAgICAgICAgICAgIGluSGVhZGVyLT5uVGltZVN0YW1wICs9Ci0gICAgICAgICAgICAgICAgKGNvcHkgKiAxMDAwMDAwbGwgLyBtU2FtcGxlUmF0ZSkKLSAgICAgICAgICAgICAgICAgICAgLyAobU51bUNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpKTsKLQotICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuID09IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigic2F3IGlucHV0IEVPUyIpOwotICAgICAgICAgICAgICAgICAgICBtU2F3SW5wdXRFT1MgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIFBhZCBhbnkgcmVtYWluaW5nIGRhdGEgd2l0aCB6ZXJvZXMuCi0gICAgICAgICAgICAgICAgICAgIG1lbXNldCgodWludDhfdCAqKW1JbnB1dEZyYW1lICsgbUlucHV0U2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBudW1CeXRlc1BlcklucHV0RnJhbWUgLSBtSW5wdXRTaXplKTsKLQotICAgICAgICAgICAgICAgICAgICBtSW5wdXRTaXplID0gbnVtQnl0ZXNQZXJJbnB1dEZyYW1lOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKLSAgICAgICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOwotCi0gICAgICAgICAgICAgICAgaW5EYXRhID0gTlVMTDsKLSAgICAgICAgICAgICAgICBpbkhlYWRlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgaW5JbmZvID0gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEF0IHRoaXMgIHBvaW50IHdlIGhhdmUgYWxsIHRoZSBpbnB1dCBkYXRhIG5lY2Vzc2FyeSB0byBlbmNvZGUKLSAgICAgICAgLy8gYSBzaW5nbGUgZnJhbWUsIGFsbCB3ZSBuZWVkIGlzIGFuIG91dHB1dCBidWZmZXIgdG8gc3RvcmUgdGhlIHJlc3VsdAotICAgICAgICAvLyBpbi4KLQotICAgICAgICBpZiAob3V0UXVldWUuZW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgQnVmZmVySW5mbyAqb3V0SW5mbyA9ICpvdXRRdWV1ZS5iZWdpbigpOwotICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyID0gb3V0SW5mby0+bUhlYWRlcjsKLQotICAgICAgICBWT19DT0RFQ0JVRkZFUiBpbnB1dERhdGE7Ci0gICAgICAgIG1lbXNldCgmaW5wdXREYXRhLCAwLCBzaXplb2YoaW5wdXREYXRhKSk7Ci0gICAgICAgIGlucHV0RGF0YS5CdWZmZXIgPSAodW5zaWduZWQgY2hhciAqKW1JbnB1dEZyYW1lOwotICAgICAgICBpbnB1dERhdGEuTGVuZ3RoID0gbnVtQnl0ZXNQZXJJbnB1dEZyYW1lOwotICAgICAgICBDSEVDSygoVk9fVTMyKVZPX0VSUl9OT05FID09Ci0gICAgICAgICAgICAgICAgbUFwaUhhbmRsZS0+U2V0SW5wdXREYXRhKG1FbmNvZGVySGFuZGxlLCAmaW5wdXREYXRhKSk7Ci0KLSAgICAgICAgVk9fQ09ERUNCVUZGRVIgb3V0cHV0RGF0YTsKLSAgICAgICAgbWVtc2V0KCZvdXRwdXREYXRhLCAwLCBzaXplb2Yob3V0cHV0RGF0YSkpOwotICAgICAgICBWT19BVURJT19PVVRQVVRJTkZPIG91dHB1dEluZm87Ci0gICAgICAgIG1lbXNldCgmb3V0cHV0SW5mbywgMCwgc2l6ZW9mKG91dHB1dEluZm8pKTsKLQotICAgICAgICB1aW50OF90ICpvdXRQdHIgPSAodWludDhfdCAqKW91dEhlYWRlci0+cEJ1ZmZlciArIG91dEhlYWRlci0+bk9mZnNldDsKLSAgICAgICAgc2l6ZV90IG91dEF2YWlsYWJsZSA9IG91dEhlYWRlci0+bkFsbG9jTGVuIC0gb3V0SGVhZGVyLT5uT2Zmc2V0OwotCi0gICAgICAgIFZPX1UzMiByZXQgPSBWT19FUlJfTk9ORTsKLSAgICAgICAgc2l6ZV90IG5PdXRwdXRCeXRlcyA9IDA7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIG91dHB1dERhdGEuQnVmZmVyID0gb3V0UHRyOwotICAgICAgICAgICAgb3V0cHV0RGF0YS5MZW5ndGggPSBvdXRBdmFpbGFibGUgLSBuT3V0cHV0Qnl0ZXM7Ci0gICAgICAgICAgICByZXQgPSBtQXBpSGFuZGxlLT5HZXRPdXRwdXREYXRhKAotICAgICAgICAgICAgICAgICAgICBtRW5jb2RlckhhbmRsZSwgJm91dHB1dERhdGEsICZvdXRwdXRJbmZvKTsKLSAgICAgICAgICAgIGlmIChyZXQgPT0gVk9fRVJSX05PTkUpIHsKLSAgICAgICAgICAgICAgICBvdXRQdHIgKz0gb3V0cHV0RGF0YS5MZW5ndGg7Ci0gICAgICAgICAgICAgICAgbk91dHB1dEJ5dGVzICs9IG91dHB1dERhdGEuTGVuZ3RoOwotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlIChyZXQgIT0gVk9fRVJSX0lOUFVUX0JVRkZFUl9TTUFMTCk7Ci0KLSAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gbk91dHB1dEJ5dGVzOwotCi0gICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gT01YX0JVRkZFUkZMQUdfRU5ET0ZGUkFNRTsKLQotICAgICAgICBpZiAobVNhd0lucHV0RU9TKSB7Ci0gICAgICAgICAgICAvLyBXZSBhbHNvIHRhZyB0aGlzIG91dHB1dCBidWZmZXIgd2l0aCBFT1MgaWYgaXQgY29ycmVzcG9uZHMKLSAgICAgICAgICAgIC8vIHRvIHRoZSBmaW5hbCBpbnB1dCBidWZmZXIuCi0gICAgICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IE9NWF9CVUZGRVJGTEFHX0VPUzsKLSAgICAgICAgfQotCi0gICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9IG1JbnB1dFRpbWVVczsKLQotI2lmIDAKLSAgICAgICAgQUxPR0koInNlbmRpbmcgJWQgYnl0ZXMgb2YgZGF0YSAodGltZSA9ICVsbGQgdXMsIGZsYWdzID0gMHglMDhseCkiLAotICAgICAgICAgICAgICBuT3V0cHV0Qnl0ZXMsIG1JbnB1dFRpbWVVcywgb3V0SGVhZGVyLT5uRmxhZ3MpOwotCi0gICAgICAgIGhleGR1bXAob3V0SGVhZGVyLT5wQnVmZmVyICsgb3V0SGVhZGVyLT5uT2Zmc2V0LCBvdXRIZWFkZXItPm5GaWxsZWRMZW4pOwotI2VuZGlmCi0KLSAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7Ci0gICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKLSAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKLQotICAgICAgICBvdXRIZWFkZXIgPSBOVUxMOwotICAgICAgICBvdXRJbmZvID0gTlVMTDsKLQotICAgICAgICBtSW5wdXRTaXplID0gMDsKLSAgICB9Ci19Ci0KLXZvaWQgU29mdEFBQ0VuY29kZXI6Om9uUmVzZXQoKSB7Ci0gICAgZGVsZXRlW10gbUlucHV0RnJhbWU7Ci0gICAgbUlucHV0RnJhbWUgPSBOVUxMOwotICAgIG1JbnB1dFNpemUgPSAwOwotCi0gICAgbVNlbnRDb2RlY1NwZWNpZmljRGF0YSA9IGZhbHNlOwotICAgIG1JbnB1dFRpbWVVcyA9IC0xbGw7Ci0gICAgbVNhd0lucHV0RU9TID0gZmFsc2U7Ci0gICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLWFuZHJvaWQ6OlNvZnRPTVhDb21wb25lbnQgKmNyZWF0ZVNvZnRPTVhDb21wb25lbnQoCi0gICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKLSAgICAgICAgT01YX1BUUiBhcHBEYXRhLCBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkgewotICAgIHJldHVybiBuZXcgYW5kcm9pZDo6U29mdEFBQ0VuY29kZXIobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9Tb2Z0QUFDRW5jb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9Tb2Z0QUFDRW5jb2Rlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjRjMWI3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU29mdEFBQ0VuY29kZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFNPRlRfQUFDX0VOQ09ERVJfSF8KLQotI2RlZmluZSBTT0ZUX0FBQ19FTkNPREVSX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oPgotCi1zdHJ1Y3QgVk9fQVVESU9fQ09ERUNBUEk7Ci1zdHJ1Y3QgVk9fTUVNX09QRVJBVE9SOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBTb2Z0QUFDRW5jb2RlciA6IHB1YmxpYyBTaW1wbGVTb2Z0T01YQ29tcG9uZW50IHsKLSAgICBTb2Z0QUFDRW5jb2RlcigKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCi0gICAgICAgICAgICBPTVhfUFRSIGFwcERhdGEsCi0gICAgICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5Tb2Z0QUFDRW5jb2RlcigpOwotCi0gICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGludGVybmFsR2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpOwotCi0gICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpOwotCi0gICAgdmlydHVhbCB2b2lkIG9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpOwotCi0gICAgdmlydHVhbCB2b2lkIG9uUmVzZXQoKTsKLQotcHJpdmF0ZToKLSAgICBlbnVtIHsKLSAgICAgICAga051bUJ1ZmZlcnMgICAgICAgICAgICAgPSA0LAotICAgICAgICBrTnVtU2FtcGxlc1BlckZyYW1lICAgICA9IDEwMjQsCi0gICAgfTsKLQotICAgIHZvaWQgKm1FbmNvZGVySGFuZGxlOwotICAgIFZPX0FVRElPX0NPREVDQVBJICptQXBpSGFuZGxlOwotICAgIFZPX01FTV9PUEVSQVRPUiAgKm1NZW1PcGVyYXRvcjsKLQotICAgIE9NWF9VMzIgbU51bUNoYW5uZWxzOwotICAgIE9NWF9VMzIgbVNhbXBsZVJhdGU7Ci0gICAgT01YX1UzMiBtQml0UmF0ZTsKLQotICAgIGJvb2wgbVNlbnRDb2RlY1NwZWNpZmljRGF0YTsKLSAgICBzaXplX3QgbUlucHV0U2l6ZTsKLSAgICBpbnQxNl90ICptSW5wdXRGcmFtZTsKLSAgICBpbnQ2NF90IG1JbnB1dFRpbWVVczsKLQotICAgIGJvb2wgbVNhd0lucHV0RU9TOwotCi0gICAgdWludDhfdCBtQXVkaW9TcGVjaWZpY0NvbmZpZ0RhdGFbMl07Ci0KLSAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKLQotICAgIHZvaWQgaW5pdFBvcnRzKCk7Ci0gICAgc3RhdHVzX3QgaW5pdEVuY29kZXIoKTsKLQotICAgIHN0YXR1c190IHNldEF1ZGlvU3BlY2lmaWNDb25maWdEYXRhKCk7Ci0gICAgc3RhdHVzX3Qgc2V0QXVkaW9QYXJhbXMoKTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNvZnRBQUNFbmNvZGVyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gU09GVF9BQUNfRU5DT0RFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC9iYXNpY19vcC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC9iYXNpY19vcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmM3NTNiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3AvYmFzaWNfb3AuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNjggKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQliYXNpY29wMi5oCi0KLQlDb250ZW50OglDb25zdGFudHMgLCBHbG9iYWxzIGFuZCBCYXNpYyBhcml0aG1ldGljIG9wZXJhdG9ycy4KLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX0JBU0lDX09QX0gKLSNkZWZpbmUgX19CQVNJQ19PUF9ICi0KLSNpbmNsdWRlICJ0eXBlZGVmLmgiCi0KLSNkZWZpbmUgTUFYXzMyIChXb3JkMzIpMHg3ZmZmZmZmZkwKLSNkZWZpbmUgTUlOXzMyIChXb3JkMzIpMHg4MDAwMDAwMEwKLQotI2RlZmluZSBNQVhfMTYgKFdvcmQxNikweDdmZmYKLSNkZWZpbmUgTUlOXzE2IChXb3JkMTYpMHg4MDAwCi0jZGVmaW5lIEFCUyhhKQkoKGEpID49IDApID8gKGEpIDogKC0oYSkpCi0KLS8qIFNob3J0IGFicywgICAgICAgICAgIDEgICAqLwotI2RlZmluZSBhYnNfcyh4KSAgICAgICAoKFdvcmQxNikoKCh4KSAhPSBNSU5fMTYpID8gKCgoeCkgPj0gMCkgPyAoeCkgOiAoLSh4KSkpIDogTUFYXzE2KSkKLQotLyogMTYgYml0IHZhcjEgLT4gTVNCLCAgICAgMiAqLwotI2RlZmluZSBMX2RlcG9zaXRfaCh4KSAoKChXb3JkMzIpKHgpKSA8PCAxNikKLQotCi0vKiAxNiBiaXQgdmFyMSAtPiBMU0IsICAgICAyICovCi0jZGVmaW5lIExfZGVwb3NpdF9sKHgpICgoV29yZDMyKSh4KSkKLQotCi0vKiBMb25nIGFicywgICAgICAgICAgICAgIDMgICovCi0jZGVmaW5lIExfYWJzKHgpICgoKHgpICE9IE1JTl8zMikgPyAoKCh4KSA+PSAwKSA/ICh4KSA6ICgtKHgpKSkgOiBNQVhfMzIpCi0KLQotLyogU2hvcnQgbmVnYXRlLCAgICAgICAgMSAgICovCi0jZGVmaW5lIG5lZ2F0ZSh2YXIxKSAoKFdvcmQxNikoKCh2YXIxKSA9PSBNSU5fMTYpID8gTUFYXzE2IDogKC0odmFyMSkpKSkKLQotCi0vKiBMb25nIG5lZ2F0ZSwgICAgIDIgKi8KLSNkZWZpbmUgTF9uZWdhdGUoTF92YXIxKSAoKChMX3ZhcjEpID09IChNSU5fMzIpKSA/IChNQVhfMzIpIDogKC0oTF92YXIxKSkpCi0KLQotI2RlZmluZSBNVUxISUdIKEEsQikgKGludCkoKChXb3JkNjQpKEEpKihXb3JkNjQpKEIpKSA+PiAzMikKLSNkZWZpbmUgZml4bXVsKGEsIGIpIChpbnQpKCgoKFdvcmQ2NCkoYSkqKFdvcmQ2NCkoYikpID4+IDMyKSA8PCAxKQotCi0KLSNpZiAgKFNBVFJVQVRFX0lTX0lOTElORSkKLV9faW5saW5lIFdvcmQxNiBzYXR1cmF0ZShXb3JkMzIgTF92YXIxKTsKLSNlbHNlCi1Xb3JkMTYgc2F0dXJhdGUoV29yZDMyIExfdmFyMSk7Ci0jZW5kaWYKLQotLyogU2hvcnQgc2hpZnQgbGVmdCwgICAgMSAgICovCi0jaWYgKFNITF9JU19JTkxJTkUpCi1fX2lubGluZSBXb3JkMTYgc2hsIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOwotI2Vsc2UKLVdvcmQxNiBzaGwgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMik7Ci0jZW5kaWYKLQotLyogU2hvcnQgc2hpZnQgcmlnaHQsICAgMSAgICovCi0jaWYgKFNIUl9JU19JTkxJTkUpCi1fX2lubGluZSBXb3JkMTYgc2hyIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOwotI2Vsc2UKLVdvcmQxNiBzaHIgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMik7Ci0jZW5kaWYKLQotI2lmIChMX01VTFRfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDMyIExfbXVsdChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOwotI2Vsc2UKLVdvcmQzMiBMX211bHQoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsKLSNlbmRpZgotCi0vKiBNc3UsICAxICAqLwotI2lmIChMX01TVV9JU19JTkxJTkUpCi1fX2lubGluZSBXb3JkMzIgTF9tc3UgKFdvcmQzMiBMX3ZhcjMsIFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMik7Ci0jZWxzZQotV29yZDMyIExfbXN1IChXb3JkMzIgTF92YXIzLCBXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOwotI2VuZGlmCi0KLS8qIExvbmcgc3ViLCAgICAgICAgMiAqLwotI2lmIChMX1NVQl9JU19JTkxJTkUpCi1fX2lubGluZSBXb3JkMzIgTF9zdWIoV29yZDMyIExfdmFyMSwgV29yZDMyIExfdmFyMik7Ci0jZWxzZQotV29yZDMyIExfc3ViKFdvcmQzMiBMX3ZhcjEsIFdvcmQzMiBMX3ZhcjIpOwotI2VuZGlmCi0KLS8qIExvbmcgc2hpZnQgbGVmdCwgMiAqLwotI2lmIChMX1NITF9JU19JTkxJTkUpCi1fX2lubGluZSBXb3JkMzIgTF9zaGwgKFdvcmQzMiBMX3ZhcjEsIFdvcmQxNiB2YXIyKTsKLSNlbHNlCi1Xb3JkMzIgTF9zaGwgKFdvcmQzMiBMX3ZhcjEsIFdvcmQxNiB2YXIyKTsKLSNlbmRpZgotCi0vKiBMb25nIHNoaWZ0IHJpZ2h0LCAyKi8KLSNpZiAoTF9TSFJfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDMyIExfc2hyIChXb3JkMzIgTF92YXIxLCBXb3JkMTYgdmFyMik7Ci0jZWxzZQotV29yZDMyIExfc2hyIChXb3JkMzIgTF92YXIxLCBXb3JkMTYgdmFyMik7Ci0jZW5kaWYKLQotLyogU2hvcnQgYWRkLCAgICAgICAgICAgMSAgICovCi0jaWYgKEFERF9JU19JTkxJTkUpCi1fX2lubGluZSBXb3JkMTYgYWRkIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOwotI2Vsc2UKLVdvcmQxNiBhZGQgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMik7Ci0jZW5kaWYKLQotLyogU2hvcnQgc3ViLCAgICAgICAgICAgMSAgICovCi0jaWYgKFNVQl9JU19JTkxJTkUpCi1fX2lubGluZSBXb3JkMTYgc3ViKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMik7Ci0jZWxzZQotV29yZDE2IHN1YihXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOwotI2VuZGlmCi0KLS8qIFNob3J0IGRpdmlzaW9uLCAgICAgICAxOCAgKi8KLSNpZiAoRElWX1NfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDE2IGRpdl9zIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOwotI2Vsc2UKLVdvcmQxNiBkaXZfcyAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsKLSNlbmRpZgotCi0vKiBTaG9ydCBtdWx0LCAgICAgICAgICAxICAgKi8KLSNpZiAoTVVMVF9JU19JTkxJTkUpCi1fX2lubGluZSBXb3JkMTYgbXVsdCAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsKLSNlbHNlCi1Xb3JkMTYgbXVsdCAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsKLSNlbmRpZgotCi0vKiBTaG9ydCBub3JtLCAgICAgICAgICAgMTUgICovCi0jaWYgKE5PUk1fU19JU19JTkxJTkUpCi1fX2lubGluZSBXb3JkMTYgbm9ybV9zIChXb3JkMTYgdmFyMSk7Ci0jZWxzZQotV29yZDE2IG5vcm1fcyAoV29yZDE2IHZhcjEpOwotI2VuZGlmCi0KLS8qIExvbmcgbm9ybSwgICAgICAgICAgICAzMCAgKi8KLSNpZiAoTk9STV9MX0lTX0lOTElORSkKLV9faW5saW5lIFdvcmQxNiBub3JtX2wgKFdvcmQzMiBMX3ZhcjEpOwotI2Vsc2UKLVdvcmQxNiBub3JtX2wgKFdvcmQzMiBMX3ZhcjEpOwotI2VuZGlmCi0KLS8qIFJvdW5kLCAgICAgICAgICAgICAgIDEgICAqLwotI2lmIChST1VORF9JU19JTkxJTkUpCi1fX2lubGluZSBXb3JkMTYgcm91bmQxNihXb3JkMzIgTF92YXIxKTsKLSNlbHNlCi1Xb3JkMTYgcm91bmQxNihXb3JkMzIgTF92YXIxKTsKLSNlbmRpZgotCi0vKiBNYWMsICAxICAqLwotI2lmIChMX01BQ19JU19JTkxJTkUpCi1fX2lubGluZSBXb3JkMzIgTF9tYWMgKFdvcmQzMiBMX3ZhcjMsIFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMik7Ci0jZWxzZQotV29yZDMyIExfbWFjIChXb3JkMzIgTF92YXIzLCBXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOwotI2VuZGlmCi0KLSNpZiAoTF9BRERfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDMyIExfYWRkIChXb3JkMzIgTF92YXIxLCBXb3JkMzIgTF92YXIyKTsKLSNlbHNlCi1Xb3JkMzIgTF9hZGQgKFdvcmQzMiBMX3ZhcjEsIFdvcmQzMiBMX3ZhcjIpOwotI2VuZGlmCi0KLS8qIEV4dHJhY3QgaGlnaCwgICAgICAgIDEgICAqLwotI2lmIChFWFRSQUNUX0hfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDE2IGV4dHJhY3RfaCAoV29yZDMyIExfdmFyMSk7Ci0jZWxzZQotV29yZDE2IGV4dHJhY3RfaCAoV29yZDMyIExfdmFyMSk7Ci0jZW5kaWYKLQotLyogRXh0cmFjdCBsb3csICAgICAgICAgMSAgICovCi0jaWYgKEVYVFJBQ1RfTF9JU19JTkxJTkUpCi1fX2lubGluZSBXb3JkMTYgZXh0cmFjdF9sKFdvcmQzMiBMX3ZhcjEpOwotI2Vsc2UKLVdvcmQxNiBleHRyYWN0X2woV29yZDMyIExfdmFyMSk7Ci0jZW5kaWYKLQotLyogTXVsdCB3aXRoIHJvdW5kLCAyICovCi0jaWYgKE1VTFRfUl9JU19JTkxJTkUpCi1fX2lubGluZSBXb3JkMTYgbXVsdF9yKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMik7Ci0jZWxzZQotV29yZDE2IG11bHRfcihXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOwotI2VuZGlmCi0KLS8qIFNoaWZ0IHJpZ2h0IHdpdGggcm91bmQsIDIgICAgICAgICAgICovCi0jaWYgKFNIUl9SX0lTX0lOTElORSkKLV9faW5saW5lIFdvcmQxNiBzaHJfciAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsKLSNlbHNlCi1Xb3JkMTYgc2hyX3IgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMik7Ci0jZW5kaWYKLQotLyogTWFjIHdpdGggcm91bmRpbmcsMiAqLwotI2lmIChNQUNfUl9JU19JTkxJTkUpCi1fX2lubGluZSBXb3JkMTYgbWFjX3IgKFdvcmQzMiBMX3ZhcjMsIFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMik7Ci0jZWxzZQotV29yZDE2IG1hY19yIChXb3JkMzIgTF92YXIzLCBXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOwotI2VuZGlmCi0KLS8qIE1zdSB3aXRoIHJvdW5kaW5nLDIgKi8KLSNpZiAoTVNVX1JfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDE2IG1zdV9yIChXb3JkMzIgTF92YXIzLCBXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOwotI2Vsc2UKLVdvcmQxNiBtc3VfciAoV29yZDMyIExfdmFyMywgV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsKLSNlbmRpZgotCi0vKiBMb25nIHNoaWZ0IHJpZ2h0IHdpdGggcm91bmQsICAzICAgICAgICAgICAgICovCi0jaWYgKExfU0hSX1JfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDMyIExfc2hyX3IgKFdvcmQzMiBMX3ZhcjEsIFdvcmQxNiB2YXIyKTsKLSNlbHNlCi1Xb3JkMzIgTF9zaHJfciAoV29yZDMyIExfdmFyMSwgV29yZDE2IHZhcjIpOwotI2VuZGlmCi0KLSNpZiBBUk1WNF9JTkFTTQotX19pbmxpbmUgV29yZDMyIEFTTV9MX3NocihXb3JkMzIgTF92YXIxLCBXb3JkMTYgdmFyMikKLXsKLQlyZXR1cm4gTF92YXIxID4+IHZhcjI7Ci19Ci0KLV9faW5saW5lIFdvcmQzMiBBU01fTF9zaGwoV29yZDMyIExfdmFyMSwgV29yZDE2IHZhcjIpCi17Ci0JV29yZDMyIHJlc3VsdDsKLQlhc20gKAotCQkiTU9WCSVbcmVzdWx0XSwgJVtMX3ZhcjFdLCBBU0wgJVt2YXIyXSBcbiIKLQkJIlRFUQklW0xfdmFyMV0sICVbcmVzdWx0XSwgQVNSICVbdmFyMl1cbiIKLQkJIkVPUk5FICAlW3Jlc3VsdF0sICVbbWFza10sICVbTF92YXIxXSwgQVNSICMzMVxuIgotCQk6W3Jlc3VsdF0iPSZyIihyZXN1bHQpCi0JCTpbTF92YXIxXSJyIihMX3ZhcjEpLCBbdmFyMl0iciIodmFyMiksIFttYXNrXSJyIigweDdmZmZmZmZmKQotCQkpOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLV9faW5saW5lIFdvcmQzMiBBU01fc2hyKFdvcmQzMiBMX3ZhcjEsIFdvcmQxNiB2YXIyKQotewotCVdvcmQzMiByZXN1bHQ7Ci0JYXNtICgKLQkJIkNNUAklW3ZhcjJdLCAjMTVcbiIKLQkJIk1PVkxUCSVbcmVzdWx0XSwgJVtMX3ZhcjFdLCBBU1IgJVt2YXIyXVxuIgotCQkiTU9WR0UJJVtyZXN1bHRdLCAlW0xfdmFyMV0sIEFTUiAjMTVcbiIKLQkJOltyZXN1bHRdIj1yIihyZXN1bHQpCi0JCTpbTF92YXIxXSJyIihMX3ZhcjEpLCBbdmFyMl0iciIodmFyMikKLQkJKTsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi1fX2lubGluZSBXb3JkMzIgQVNNX3NobChXb3JkMzIgTF92YXIxLCBXb3JkMTYgdmFyMikKLXsKLSNpZiBBUk1WNl9TQVQKLQlXb3JkMzIgcmVzdWx0OwotCWFzbSAoCi0JCSJDTVAJJVt2YXIyXSwgIzE2XG4iCi0JCSJNT1ZMVCAgJVtyZXN1bHRdLCAlW0xfdmFyMV0sIEFTTCAlW3ZhcjJdXG4iCi0JCSJNT1ZHRSAgJVtyZXN1bHRdLCAlW0xfdmFyMV0sIEFTTCAjMTZcbiIKLQkJIlNTQVQgICAlW3Jlc3VsdF0sICMxNiwgJVtyZXN1bHRdXG4iCi0JCTpbcmVzdWx0XSI9ciIocmVzdWx0KQotCQk6W0xfdmFyMV0iciIoTF92YXIxKSwgW3ZhcjJdInIiKHZhcjIpCi0JCSk7Ci0JcmV0dXJuIHJlc3VsdDsKLSNlbHNlCi0JV29yZDMyIHJlc3VsdDsKLQlXb3JkMzIgdG1wOwotCWFzbSAoCi0JCSJDTVAJJVt2YXIyXSwgIzE2XG4iCi0JCSJNT1ZMVCAgJVtyZXN1bHRdLCAlW0xfdmFyMV0sIEFTTCAlW3ZhcjJdXG4iCi0JCSJNT1ZHRSAgJVtyZXN1bHRdLCAlW0xfdmFyMV0sIEFTTCAjMTZcbiIKLSAgICAgICAgIk1PViAgICAlW3RtcF0sICVbcmVzdWx0XSwgQVNSICMxNVxuIgotICAgICAgICAiVEVRICAgICVbdG1wXSwgJVtyZXN1bHRdLCBBU1IgIzMxIFxuIgotICAgICAgICAiRU9STkUgICVbcmVzdWx0XSwgJVttYXNrXSwgJVtyZXN1bHRdLEFTUiAjMzEiCi0JCTpbcmVzdWx0XSI9JnIiKHJlc3VsdCksIFt0bXBdIj0mciIodG1wKQotCQk6W0xfdmFyMV0iciIoTF92YXIxKSwgW3ZhcjJdInIiKHZhcjIpLCBbbWFza10iciIoMHg3ZmZmKQotCQkpOwotCXJldHVybiByZXN1bHQ7Ci0jZW5kaWYKLX0KLSNlbmRpZgotCi0vKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIGRlZmluaXRpb25zIGZvciBpbmxpbmUgYmFzaWMgYXJpdGhtZXRpYyBvcGVyYXRvcnMgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAotKi8KLSNpZiAoU0FUUlVBVEVfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDE2IHNhdHVyYXRlKFdvcmQzMiBMX3ZhcjEpCi17Ci0jaWYgQVJNVjZfU0FUCi0gICAgV29yZDE2IHJlc3VsdDsKLQlhc20gKAotCQkiU1NBVCAlW3Jlc3VsdF0sICMxNiwgJVtMX3ZhcjFdIgotCQk6IFtyZXN1bHRdIj1yIihyZXN1bHQpCi0JCTogW0xfdmFyMV0iciIoTF92YXIxKQotCQkpOwotCXJldHVybiByZXN1bHQ7Ci0jZWxpZiBBUk1WNVRFX1NBVAotCVdvcmQxNiByZXN1bHQ7Ci0JV29yZDMyIHRtcDsKLQlhc20gdm9sYXRpbGUgKAotCQkiTU9WCSVbdG1wXSwgJVtMX3ZhcjFdLEFTUiMxNVxuIgotCQkiVEVRCSVbdG1wXSwgJVtMX3ZhcjFdLEFTUiMzMVxuIgotCQkiRU9STkUJJVtyZXN1bHRdLCAlW21hc2tdLCVbTF92YXIxXSxBU1IjMzFcbiIKLQkJIk1PVkVRCSVbcmVzdWx0XSwgJVtMX3ZhcjFdXG4iCi0JCTpbcmVzdWx0XSI9JnIiKHJlc3VsdCksIFt0bXBdIj0mciIodG1wKQotCQk6W0xfdmFyMV0iciIoTF92YXIxKSwgW21hc2tdInIiKDB4N2ZmZikKLQkpOwotCi0JcmV0dXJuIHJlc3VsdDsKLSNlbHNlCi0gICAgV29yZDE2IHZhcl9vdXQ7Ci0KLSAgICAvL3Zhcl9vdXQgPSAoTF92YXIxID4gKFdvcmQzMikwWDAwMDA3ZmZmTCkgPyAoTUFYXzE2KSA6ICgoTF92YXIxIDwgKFdvcmQzMikweGZmZmY4MDAwTCkgPyAoTUlOXzE2KSA6ICgoV29yZDE2KUxfdmFyMSkpOwotCi0gICAgaWYgKExfdmFyMSA+IDBYMDAwMDdmZmZMKQotICAgIHsKLSAgICAgICAgdmFyX291dCA9IE1BWF8xNjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoTF92YXIxIDwgKFdvcmQzMikgMHhmZmZmODAwMEwpCi0gICAgewotICAgICAgICB2YXJfb3V0ID0gTUlOXzE2OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB2YXJfb3V0ID0gZXh0cmFjdF9sKExfdmFyMSk7Ci0gICAgfQotCi0gICAgcmV0dXJuICh2YXJfb3V0KTsKLSNlbmRpZgotfQotI2VuZGlmCi0KLS8qIFNob3J0IHNoaWZ0IGxlZnQsICAgIDEgICAqLwotI2lmIChTSExfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDE2IHNobCAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKQotewotI2lmIEFSTVY1VEVfU0hMCi0JaWYodmFyMj49MCkKLQl7Ci0JCXJldHVybiBBU01fc2hsKCB2YXIxLCB2YXIyKTsKLQl9Ci0JZWxzZQotCXsKLQkJcmV0dXJuIEFTTV9zaHIoIHZhcjEsIC12YXIyKTsKLQl9Ci0jZWxzZQotICAgIFdvcmQxNiB2YXJfb3V0OwotICAgIFdvcmQzMiByZXN1bHQ7Ci0KLSAgICBpZiAodmFyMiA8IDApCi0gICAgewotICAgICAgICB2YXJfb3V0ID0gc2hyICh2YXIxLCAoV29yZDE2KS12YXIyKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmVzdWx0ID0gKFdvcmQzMikgdmFyMSAqKChXb3JkMzIpIDEgPDwgdmFyMik7Ci0KLSAgICAgICAgaWYgKCh2YXIyID4gMTUgJiYgdmFyMSAhPSAwKSB8fCAocmVzdWx0ICE9IChXb3JkMzIpICgoV29yZDE2KSByZXN1bHQpKSkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyX291dCA9IChXb3JkMTYpKCh2YXIxID4gMCkgPyBNQVhfMTYgOiBNSU5fMTYpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdmFyX291dCA9IGV4dHJhY3RfbChyZXN1bHQpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAodmFyX291dCk7Ci0jZW5kaWYKLX0KLSNlbmRpZgotCi0vKiBTaG9ydCBzaGlmdCByaWdodCwgICAxICAgKi8KLSNpZiAoU0hSX0lTX0lOTElORSkKLV9faW5saW5lIFdvcmQxNiBzaHIgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikKLXsKLSNpZiBBUk1WNVRFX1NIUgotCWlmKHZhcjI+PTApCi0JewotCQlyZXR1cm4gIEFTTV9zaHIoIHZhcjEsIHZhcjIpOwotCX0KLQllbHNlCi0JewotCQlyZXR1cm4gIEFTTV9zaGwoIHZhcjEsIC12YXIyKTsKLQl9Ci0jZWxzZQotICAgIFdvcmQxNiB2YXJfb3V0OwotCi0gICAgaWYgKHZhcjIgPCAwKQotICAgIHsKLSAgICAgICAgdmFyX291dCA9IHNobCAodmFyMSwgKFdvcmQxNiktdmFyMik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmICh2YXIyID49IDE1KQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXJfb3V0ID0gKFdvcmQxNikoKHZhcjEgPCAwKSA/IC0xIDogMCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodmFyMSA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyX291dCA9IChXb3JkMTYpKH4oKH52YXIxKSA+PiB2YXIyKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyX291dCA9IChXb3JkMTYpKHZhcjEgPj4gdmFyMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gKHZhcl9vdXQpOwotI2VuZGlmCi19Ci0jZW5kaWYKLQotCi0jaWYgKExfTVVMVF9JU19JTkxJTkUpCi1fX2lubGluZSBXb3JkMzIgTF9tdWx0KFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikKLXsKLSNpZiBBUk1WNVRFX0xfTVVMVAotCVdvcmQzMiByZXN1bHQ7Ci0JYXNtICgKLQkJIlNNVUxCQiAlW3Jlc3VsdF0sICVbdmFyMV0sICVbdmFyMl0gXG4iCi0JCSJRQUREICVbcmVzdWx0XSwgJVtyZXN1bHRdLCAlW3Jlc3VsdF0gXG4iCi0JCTpbcmVzdWx0XSI9ciIocmVzdWx0KQotCQk6W3ZhcjFdInIiKHZhcjEpLCBbdmFyMl0iciIodmFyMikKLQkJKTsKLQlyZXR1cm4gcmVzdWx0OwotI2Vsc2UKLSAgICBXb3JkMzIgTF92YXJfb3V0OwotCi0gICAgTF92YXJfb3V0ID0gKFdvcmQzMikgdmFyMSAqKFdvcmQzMikgdmFyMjsKLQotICAgIGlmIChMX3Zhcl9vdXQgIT0gKFdvcmQzMikgMHg0MDAwMDAwMEwpCi0gICAgewotICAgICAgICBMX3Zhcl9vdXQgPDw9IDE7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIExfdmFyX291dCA9IE1BWF8zMjsKLSAgICB9Ci0gICAgcmV0dXJuIChMX3Zhcl9vdXQpOwotI2VuZGlmCi19Ci0jZW5kaWYKLQotI2lmIChMX01TVV9JU19JTkxJTkUpCi1fX2lubGluZSBXb3JkMzIgTF9tc3UgKFdvcmQzMiBMX3ZhcjMsIFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikKLXsKLSNpZiBBUk1WNVRFX0xfTVNVCi0JV29yZDMyIHJlc3VsdDsKLQlhc20gKAotCQkiU01VTEJCICVbcmVzdWx0XSwgJVt2YXIxXSwgJVt2YXIyXSBcbiIKLQkJIlFEU1VCICVbcmVzdWx0XSwgJVtMX3ZhcjNdLCAlW3Jlc3VsdF1cbiIKLQkJOltyZXN1bHRdIj0mciIocmVzdWx0KQotCQk6W0xfdmFyM10iciIoTF92YXIzKSwgW3ZhcjFdInIiKHZhcjEpLCBbdmFyMl0iciIodmFyMikKLQkJKTsKLQlyZXR1cm4gcmVzdWx0OwotI2Vsc2UKLSAgICBXb3JkMzIgTF92YXJfb3V0OwotICAgIFdvcmQzMiBMX3Byb2R1Y3Q7Ci0KLSAgICBMX3Byb2R1Y3QgPSBMX211bHQodmFyMSwgdmFyMik7Ci0gICAgTF92YXJfb3V0ID0gTF9zdWIoTF92YXIzLCBMX3Byb2R1Y3QpOwotICAgIHJldHVybiAoTF92YXJfb3V0KTsKLSNlbmRpZgotfQotI2VuZGlmCi0KLSNpZiAoTF9TVUJfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDMyIExfc3ViKFdvcmQzMiBMX3ZhcjEsIFdvcmQzMiBMX3ZhcjIpCi17Ci0jaWYgQVJNVjVURV9MX1NVQgotCVdvcmQzMiByZXN1bHQ7Ci0JYXNtICgKLQkJIlFTVUIgJVtyZXN1bHRdLCAlW0xfdmFyMV0sICVbTF92YXIyXVxuIgotCQk6W3Jlc3VsdF0iPXIiKHJlc3VsdCkKLQkJOltMX3ZhcjFdInIiKExfdmFyMSksIFtMX3ZhcjJdInIiKExfdmFyMikKLQkJKTsKLQlyZXR1cm4gcmVzdWx0OwotI2Vsc2UKLSAgICBXb3JkMzIgTF92YXJfb3V0OwotCi0gICAgTF92YXJfb3V0ID0gTF92YXIxIC0gTF92YXIyOwotCi0gICAgaWYgKCgoTF92YXIxIF4gTF92YXIyKSAmIE1JTl8zMikgIT0gMCkKLSAgICB7Ci0gICAgICAgIGlmICgoTF92YXJfb3V0IF4gTF92YXIxKSAmIE1JTl8zMikKLSAgICAgICAgewotICAgICAgICAgICAgTF92YXJfb3V0ID0gKExfdmFyMSA8IDBMKSA/IE1JTl8zMiA6IE1BWF8zMjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAoTF92YXJfb3V0KTsKLSNlbmRpZgotfQotI2VuZGlmCi0KLSNpZiAoTF9TSExfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDMyIExfc2hsKFdvcmQzMiBMX3ZhcjEsIFdvcmQxNiB2YXIyKQotewotI2lmIEFSTVY1VEVfTF9TSEwKLSAgICBpZih2YXIyPj0wKQotICAgIHsKLSAgICAgICAgcmV0dXJuICBBU01fTF9zaGwoIExfdmFyMSwgdmFyMik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiAgQVNNX0xfc2hyKCBMX3ZhcjEsIC12YXIyKTsKLSAgICB9Ci0jZWxzZQotICAgIGlmICh2YXIyIDw9IDApCi0gICAgewotICAgICAgICBMX3ZhcjEgPSBMX3NocihMX3ZhcjEsIChXb3JkMTYpLXZhcjIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBmb3IgKDsgdmFyMiA+IDA7IHZhcjItLSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKExfdmFyMSA+IChXb3JkMzIpIDBYM2ZmZmZmZmZMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBNQVhfMzI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKExfdmFyMSA8IChXb3JkMzIpIDB4YzAwMDAwMDBMKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1JTl8zMjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMX3ZhcjEgPDw9IDE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIChMX3ZhcjEpOwotI2VuZGlmCi19Ci0jZW5kaWYKLQotI2lmIChMX1NIUl9JU19JTkxJTkUpCi1fX2lubGluZSBXb3JkMzIgTF9zaHIgKFdvcmQzMiBMX3ZhcjEsIFdvcmQxNiB2YXIyKQotewotI2lmIEFSTVY1VEVfTF9TSFIKLQlpZih2YXIyPj0wKQotCXsKLQkJcmV0dXJuIEFTTV9MX3NociggTF92YXIxLCB2YXIyKTsKLQl9Ci0JZWxzZQotCXsKLQkJcmV0dXJuIEFTTV9MX3NobCggTF92YXIxLCAtdmFyMik7Ci0JfQotI2Vsc2UKLSAgICBXb3JkMzIgTF92YXJfb3V0OwotCi0gICAgaWYgKHZhcjIgPCAwKQotICAgIHsKLSAgICAgICAgTF92YXJfb3V0ID0gTF9zaGwgKExfdmFyMSwgKFdvcmQxNiktdmFyMik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmICh2YXIyID49IDMxKQotICAgICAgICB7Ci0gICAgICAgICAgICBMX3Zhcl9vdXQgPSAoTF92YXIxIDwgMEwpID8gLTEgOiAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKExfdmFyMSA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTF92YXJfb3V0ID0gfigofkxfdmFyMSkgPj4gdmFyMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTF92YXJfb3V0ID0gTF92YXIxID4+IHZhcjI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIChMX3Zhcl9vdXQpOwotI2VuZGlmCi19Ci0jZW5kaWYKLQotLyogU2hvcnQgYWRkLCAgICAgICAgICAgMSAgICovCi0jaWYgKEFERF9JU19JTkxJTkUpCi1fX2lubGluZSBXb3JkMTYgYWRkIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpCi17Ci0jaWYgQVJNVjVURV9BREQKLQlXb3JkMzIgcmVzdWx0OwotCVdvcmQzMiB0bXA7Ci0JYXNtICgKLQkJIkFERCAgJVtyZXN1bHRdLCAlW3ZhcjFdLCAlW3ZhcjJdIFxuIgotCQkiTU9WICAlW3RtcF0sICVbcmVzdWx0XSwgQVNSICMxNSBcbiIKLQkJIlRFUSAgJVt0bXBdLCAlW3Jlc3VsdF0sIEFTUiAjMzEgXG4iCi0JCSJFT1JORSAlW3Jlc3VsdF0sICVbbWFza10sICVbcmVzdWx0XSwgQVNSICMzMSIKLQkJOltyZXN1bHRdIj0mciIocmVzdWx0KSwgW3RtcF0iPSZyIih0bXApCi0JCTpbdmFyMV0iciIodmFyMSksIFt2YXIyXSJyIih2YXIyKSwgW21hc2tdInIiKDB4N2ZmZikKLQkJKTsKLQlyZXR1cm4gcmVzdWx0OwotI2Vsc2UKLSAgICBXb3JkMTYgdmFyX291dDsKLSAgICBXb3JkMzIgTF9zdW07Ci0KLSAgICBMX3N1bSA9IChXb3JkMzIpIHZhcjEgKyB2YXIyOwotICAgIHZhcl9vdXQgPSBzYXR1cmF0ZShMX3N1bSk7Ci0KLSAgICByZXR1cm4gKHZhcl9vdXQpOwotI2VuZGlmCi19Ci0jZW5kaWYKLQotLyogU2hvcnQgc3ViLCAgICAgICAgICAgMSAgICovCi0jaWYgKFNVQl9JU19JTkxJTkUpCi1fX2lubGluZSBXb3JkMTYgc3ViKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikKLXsKLSNpZiBBUk1WNVRFX1NVQgotCVdvcmQzMiByZXN1bHQ7Ci0JV29yZDMyIHRtcDsKLQlhc20gKAotCQkiU1VCICAgJVtyZXN1bHRdLCAlW3ZhcjFdLCAlW3ZhcjJdIFxuIgotCQkiTU9WICAgJVt0bXBdLCAlW3ZhcjFdLCBBU1IgIzE1IFxuIgotCQkiVEVRICAgJVt0bXBdLCAlW3ZhcjFdLCBBU1IgIzMxIFxuIgotCQkiRU9STkUgJVtyZXN1bHRdLCAlW21hc2tdLCAlW3Jlc3VsdF0sIEFTUiAjMzEgXG4iCi0JCTpbcmVzdWx0XSI9JnIiKHJlc3VsdCksIFt0bXBdIj0mciIodG1wKQotCQk6W3ZhcjFdInIiKHZhcjEpLCBbdmFyMl0iciIodmFyMiksIFttYXNrXSJyIigweDdmZmYpCi0JCSk7Ci0JcmV0dXJuIHJlc3VsdDsKLSNlbHNlCi0gICAgV29yZDE2IHZhcl9vdXQ7Ci0gICAgV29yZDMyIExfZGlmZjsKLQotICAgIExfZGlmZiA9IChXb3JkMzIpIHZhcjEgLSB2YXIyOwotICAgIHZhcl9vdXQgPSBzYXR1cmF0ZShMX2RpZmYpOwotCi0gICAgcmV0dXJuICh2YXJfb3V0KTsKLSNlbmRpZgotfQotI2VuZGlmCi0KLS8qIFNob3J0IGRpdmlzaW9uLCAgICAgICAxOCAgKi8KLSNpZiAoRElWX1NfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDE2IGRpdl9zIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpCi17Ci0gICAgV29yZDE2IHZhcl9vdXQgPSAwOwotICAgIFdvcmQxNiBpdGVyYXRpb247Ci0gICAgV29yZDMyIExfbnVtOwotICAgIFdvcmQzMiBMX2Rlbm9tOwotCi0gICAgdmFyX291dCA9IE1BWF8xNjsKLSAgICBpZiAodmFyMSE9IHZhcjIpLy92YXIxIT0gdmFyMgotICAgIHsKLSAgICAJdmFyX291dCA9IDA7Ci0gICAgCUxfbnVtID0gKFdvcmQzMikgdmFyMTsKLQotICAgIAlMX2Rlbm9tID0gKFdvcmQzMikgdmFyMjsKLQotCQkvL3JldHVybiAoTF9udW08PDE1KS92YXIyOwotCi0gICAgCWZvciAoaXRlcmF0aW9uID0gMDsgaXRlcmF0aW9uIDwgMTU7IGl0ZXJhdGlvbisrKQotICAgIAl7Ci0gICAgCQl2YXJfb3V0IDw8PSAxOwotICAgIAkJTF9udW0gPDw9IDE7Ci0KLSAgICAJCWlmIChMX251bSA+PSBMX2Rlbm9tKQotICAgIAkJewotICAgIAkJCUxfbnVtIC09IExfZGVub207Ci0gICAgCQkJdmFyX291dCsrOwotICAgIAkJfQotICAgIAl9Ci0gICAgfQotICAgIHJldHVybiAodmFyX291dCk7Ci19Ci0jZW5kaWYKLQotLyogU2hvcnQgbXVsdCwgICAgICAgICAgMSAgICovCi0jaWYgKE1VTFRfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDE2IG11bHQgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikKLXsKLSNpZiBBUk1WNVRFX01VTFQgJiYgQVJNVjZfU0FUCi0JV29yZDMyIHJlc3VsdDsKLQlhc20gKAotCQkiU01VTEJCICVbcmVzdWx0XSwgJVt2YXIxXSwgJVt2YXIyXSBcbiIKLQkJIlNTQVQgICAlW3Jlc3VsdF0sICMxNiwgJVtyZXN1bHRdLCBBU1IgIzE1IFxuIgotCQk6W3Jlc3VsdF0iPXIiKHJlc3VsdCkKLQkJOlt2YXIxXSJyIih2YXIxKSwgW3ZhcjJdInIiKHZhcjIpCi0JCSk7Ci0JcmV0dXJuIHJlc3VsdDsKLSNlbGlmIEFSTVY1VEVfTVVMVAotCVdvcmQzMiByZXN1bHQsIHRtcDsKLQlhc20gKAotCQkiU01VTEJCICVbdG1wXSwgJVt2YXIxXSwgJVt2YXIyXSBcbiIKLQkJIk1PVgklW3Jlc3VsdF0sICVbdG1wXSwgQVNSICMxNVxuIgotCQkiTU9WCSVbdG1wXSwgJVtyZXN1bHRdLCBBU1IgIzE1XG4iCi0JCSJURVEJJVt0bXBdLCAlW3Jlc3VsdF0sIEFTUiAjMzFcbiIKLQkJIkVPUk5FICAlW3Jlc3VsdF0sICVbbWFza10sICVbcmVzdWx0XSwgQVNSICMzMSBcbiIKLQkJOltyZXN1bHRdIj0mciIocmVzdWx0KSwgW3RtcF0iPSZyIih0bXApCi0JCTpbdmFyMV0iciIodmFyMSksIFt2YXIyXSJyIih2YXIyKSwgW21hc2tdInIiKDB4N2ZmZikKLQkJKTsKLQlyZXR1cm4gcmVzdWx0OwotI2Vsc2UKLSAgICBXb3JkMTYgdmFyX291dDsKLSAgICBXb3JkMzIgTF9wcm9kdWN0OwotCi0gICAgTF9wcm9kdWN0ID0gKFdvcmQzMikgdmFyMSAqKFdvcmQzMikgdmFyMjsKLSAgICBMX3Byb2R1Y3QgPSAoTF9wcm9kdWN0ICYgKFdvcmQzMikgMHhmZmZmODAwMEwpID4+IDE1OwotICAgIGlmIChMX3Byb2R1Y3QgJiAoV29yZDMyKSAweDAwMDEwMDAwTCkKLSAgICAgICAgTF9wcm9kdWN0ID0gTF9wcm9kdWN0IHwgKFdvcmQzMikgMHhmZmZmMDAwMEw7Ci0gICAgdmFyX291dCA9IHNhdHVyYXRlKExfcHJvZHVjdCk7Ci0KLSAgICByZXR1cm4gKHZhcl9vdXQpOwotI2VuZGlmCi19Ci0jZW5kaWYKLQotCi0vKiBTaG9ydCBub3JtLCAgICAgICAgICAgMTUgICovCi0jaWYgKE5PUk1fU19JU19JTkxJTkUpCi1fX2lubGluZSBXb3JkMTYgbm9ybV9zIChXb3JkMTYgdmFyMSkKLXsKLSNpZiBBUk1WNVRFX05PUk1fUwotCVdvcmQxNiByZXN1bHQ7Ci0JV29yZDMyIHRtcDsKLQlhc20gKAotCQkiUlNCUyAgJVt0bXBdLCAlW3ZhcjFdLCAjMCBcbiIKLQkJIkNMWkxUICVbcmVzdWx0XSwgJVt2YXIxXVxuIgotCQkiQ0xaR1QgJVtyZXN1bHRdLCAlW3RtcF1cbiIKLQkJIlNVQk5FICVbcmVzdWx0XSwgJVtyZXN1bHRdLCAjMTdcbiIKLQkJIk1PVkVRICVbcmVzdWx0XSwgIzBcbiIKLQkJIkNNUCAgICVbdmFyMV0sICMtMVxuIgotCQkiTU9WRVEgJVtyZXN1bHRdLCAjMTVcbiIKLQkJOltyZXN1bHRdIj0mciIocmVzdWx0KSwgW3RtcF0iPSZyIih0bXApCi0JCTpbdmFyMV0iciIodmFyMSkKLQkJKTsKLQlyZXR1cm4gcmVzdWx0OwotI2Vsc2UKLSAgICBXb3JkMTYgdmFyX291dDsKLQotICAgIGlmICh2YXIxID09IDApCi0gICAgewotICAgICAgICB2YXJfb3V0ID0gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKHZhcjEgPT0gLTEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhcl9vdXQgPSAxNTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh2YXIxIDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIxID0gKFdvcmQxNil+dmFyMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAodmFyX291dCA9IDA7IHZhcjEgPCAweDQwMDA7IHZhcl9vdXQrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIxIDw8PSAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAodmFyX291dCk7Ci0jZW5kaWYKLX0KLSNlbmRpZgotCi0vKiBMb25nIG5vcm0sICAgICAgICAgICAgMzAgICovCi0jaWYgKE5PUk1fTF9JU19JTkxJTkUpCi1fX2lubGluZSBXb3JkMTYgbm9ybV9sIChXb3JkMzIgTF92YXIxKQotewotI2lmIEFSTVY1VEVfTk9STV9MCi0JV29yZDE2IHJlc3VsdDsKLQlhc20gdm9sYXRpbGUoCi0JCSJDTVAgICAgJVtMX3ZhcjFdLCAjMFxuIgotCQkiQ0xaTkUgICVbcmVzdWx0XSwgJVtMX3ZhcjFdXG4iCi0JCSJTVUJORSAgJVtyZXN1bHRdLCAlW3Jlc3VsdF0sICMxXG4iCi0JCSJNT1ZFUSAgJVtyZXN1bHRdLCAjMFxuIgotCQk6W3Jlc3VsdF0iPXIiKHJlc3VsdCkKLQkJOltMX3ZhcjFdInIiKExfdmFyMSkKLQkJKTsKLQlyZXR1cm4gcmVzdWx0OwotI2Vsc2UKLSAgICAvL1dvcmQxNiB2YXJfb3V0OwotCi0gICAgLy9pZiAoTF92YXIxID09IDApCi0gICAgLy97Ci0gICAgLy8gICAgdmFyX291dCA9IDA7Ci0gICAgLy99Ci0gICAgLy9lbHNlCi0gICAgLy97Ci0gICAgLy8gICAgaWYgKExfdmFyMSA9PSAoV29yZDMyKSAweGZmZmZmZmZmTCkKLSAgICAvLyAgICB7Ci0gICAgLy8gICAgICAgIHZhcl9vdXQgPSAzMTsKLSAgICAvLyAgICB9Ci0gICAgLy8gICAgZWxzZQotICAgIC8vICAgIHsKLSAgICAvLyAgICAgICAgaWYgKExfdmFyMSA8IDApCi0gICAgLy8gICAgICAgIHsKLSAgICAvLyAgICAgICAgICAgIExfdmFyMSA9IH5MX3ZhcjE7Ci0gICAgLy8gICAgICAgIH0KLSAgICAvLyAgICAgICAgZm9yICh2YXJfb3V0ID0gMDsgTF92YXIxIDwgKFdvcmQzMikgMHg0MDAwMDAwMEw7IHZhcl9vdXQrKykKLSAgICAvLyAgICAgICAgewotICAgIC8vICAgICAgICAgICAgTF92YXIxIDw8PSAxOwotICAgIC8vICAgICAgICB9Ci0gICAgLy8gICAgfQotICAgIC8vfQotICAgIC8vcmV0dXJuICh2YXJfb3V0KTsKLSAgV29yZDE2IGExNjsKLSAgV29yZDE2IHIgPSAwIDsKLQotCi0gIGlmICggTF92YXIxIDwgMCApIHsKLSAgICBMX3ZhcjEgPSB+TF92YXIxOwotICB9Ci0KLSAgaWYgKDAgPT0gKExfdmFyMSAmIDB4N2ZmZjgwMDApKSB7Ci0gICAgYTE2ID0gZXh0cmFjdF9sKExfdmFyMSk7Ci0gICAgciArPSAxNjsKLQotICAgIGlmICgwID09IChhMTYgJiAweDdmODApKSB7Ci0gICAgICByICs9IDg7Ci0KLSAgICAgIGlmICgwID09IChhMTYgJiAweDAwNzgpKSB7Ci0gICAgICAgIHIgKz0gNDsKLQotICAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHgwMDA2KSkgewotICAgICAgICAgIHIgKz0gMjsKLQotICAgICAgICAgIGlmICgwID09IChhMTYgJiAweDAwMDEpKSB7Ci0gICAgICAgICAgICByICs9IDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotCi0gICAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MDAwNCkpIHsKLSAgICAgICAgICAgIHIgKz0gMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgewotCi0gICAgICAgIGlmICgwID09IChhMTYgJiAweDAwNjApKSB7Ci0gICAgICAgICAgciArPSAyOwotCi0gICAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MDAxMCkpIHsKLSAgICAgICAgICAgIHIgKz0gMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0KLSAgICAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHgwMDQwKSkgewotICAgICAgICAgICAgciArPSAxOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLQotICAgICAgaWYgKDAgPT0gKGExNiAmIDB4NzgwMCkpIHsKLSAgICAgICAgciArPSA0OwotCi0gICAgICAgIGlmICgwID09IChhMTYgJiAweDA2MDApKSB7Ci0gICAgICAgICAgciArPSAyOwotCi0gICAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MDEwMCkpIHsKLSAgICAgICAgICAgIHIgKz0gMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0KLSAgICAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHgwNDAwKSkgewotICAgICAgICAgICAgciArPSAxOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSB7Ci0KLSAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4NjAwMCkpIHsKLSAgICAgICAgICByICs9IDI7Ci0KLSAgICAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHgxMDAwKSkgewotICAgICAgICAgICAgciArPSAxOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLQotICAgICAgICAgIGlmICgwID09IChhMTYgJiAweDQwMDApKSB7Ci0gICAgICAgICAgICByICs9IDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGVsc2UgewotICAgIGExNiA9IGV4dHJhY3RfaChMX3ZhcjEpOwotCi0gICAgaWYgKDAgPT0gKGExNiAmIDB4N2Y4MCkpIHsKLSAgICAgIHIgKz0gODsKLQotICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MDA3OCkpIHsKLSAgICAgICAgciArPSA0IDsKLQotICAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHgwMDA2KSkgewotICAgICAgICAgIHIgKz0gMjsKLQotICAgICAgICAgIGlmICgwID09IChhMTYgJiAweDAwMDEpKSB7Ci0gICAgICAgICAgICByICs9IDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotCi0gICAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MDAwNCkpIHsKLSAgICAgICAgICAgIHIgKz0gMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgewotCi0gICAgICAgIGlmICgwID09IChhMTYgJiAweDAwNjApKSB7Ci0gICAgICAgICAgciArPSAyOwotCi0gICAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MDAxMCkpIHsKLSAgICAgICAgICAgIHIgKz0gMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0KLSAgICAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHgwMDQwKSkgewotICAgICAgICAgICAgciArPSAxOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLQotICAgICAgaWYgKDAgPT0gKGExNiAmIDB4NzgwMCkpIHsKLSAgICAgICAgciArPSA0OwotCi0gICAgICAgIGlmICgwID09IChhMTYgJiAweDA2MDApKSB7Ci0gICAgICAgICAgciArPSAyOwotCi0gICAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MDEwMCkpIHsKLSAgICAgICAgICAgIHIgKz0gMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0KLSAgICAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHgwNDAwKSkgewotICAgICAgICAgICAgciArPSAxOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSB7Ci0KLSAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4NjAwMCkpIHsKLSAgICAgICAgICByICs9IDI7Ci0KLSAgICAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHgxMDAwKSkgewotICAgICAgICAgICAgciArPSAxOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLQotICAgICAgICAgIGlmICgwID09IChhMTYgJiAweDQwMDApKSB7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICByZXR1cm4gciA7Ci0jZW5kaWYKLX0KLSNlbmRpZgotCi0vKiBSb3VuZCwgICAgICAgICAgICAgICAxICAgKi8KLSNpZiAoUk9VTkRfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDE2IHJvdW5kMTYoV29yZDMyIExfdmFyMSkKLXsKLSNpZiBBUk1WNVRFX1JPVU5ECi0JV29yZDE2IHJlc3VsdDsKLQlhc20gKAotCQkiUUFERCAgJVtyZXN1bHRdLCAlW0xfdmFyMV0sICVbYmlhc11cbiIKLQkJIk1PViAgICVbcmVzdWx0XSwgJVtyZXN1bHRdLCBBU1IgIzE2IFxuIgotCQk6W3Jlc3VsdF0iPXIiKHJlc3VsdCkKLQkJOltMX3ZhcjFdInIiKExfdmFyMSksIFtiaWFzXSJyIigweDgwMDApCi0JCSk7Ci0JcmV0dXJuIHJlc3VsdDsKLSNlbHNlCi0gICAgV29yZDE2IHZhcl9vdXQ7Ci0gICAgV29yZDMyIExfcm91bmRlZDsKLQotICAgIExfcm91bmRlZCA9IExfYWRkIChMX3ZhcjEsIChXb3JkMzIpIDB4MDAwMDgwMDBMKTsKLSAgICB2YXJfb3V0ID0gZXh0cmFjdF9oIChMX3JvdW5kZWQpOwotICAgIHJldHVybiAodmFyX291dCk7Ci0jZW5kaWYKLX0KLSNlbmRpZgotCi0vKiBNYWMsICAxICAqLwotI2lmIChMX01BQ19JU19JTkxJTkUpCi1fX2lubGluZSBXb3JkMzIgTF9tYWMgKFdvcmQzMiBMX3ZhcjMsIFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikKLXsKLSNpZiBBUk1WNVRFX0xfTUFDCi0JV29yZDMyIHJlc3VsdDsKLQlhc20gKAotCQkiU01VTEJCICVbcmVzdWx0XSwgJVt2YXIxXSwgJVt2YXIyXVxuIgotCQkiUURBREQgICVbcmVzdWx0XSwgJVtMX3ZhcjNdLCAlW3Jlc3VsdF1cbiIKLQkJOltyZXN1bHRdIj0mciIocmVzdWx0KQotCQk6IFtMX3ZhcjNdInIiKExfdmFyMyksIFt2YXIxXSJyIih2YXIxKSwgW3ZhcjJdInIiKHZhcjIpCi0JCSk7Ci0JcmV0dXJuIHJlc3VsdDsKLSNlbHNlCi0gICAgV29yZDMyIExfdmFyX291dDsKLSAgICBXb3JkMzIgTF9wcm9kdWN0OwotCi0gICAgTF9wcm9kdWN0ID0gTF9tdWx0KHZhcjEsIHZhcjIpOwotICAgIExfdmFyX291dCA9IExfYWRkIChMX3ZhcjMsIExfcHJvZHVjdCk7Ci0gICAgcmV0dXJuIChMX3Zhcl9vdXQpOwotI2VuZGlmCi19Ci0jZW5kaWYKLQotI2lmIChMX0FERF9JU19JTkxJTkUpCi1fX2lubGluZSBXb3JkMzIgTF9hZGQgKFdvcmQzMiBMX3ZhcjEsIFdvcmQzMiBMX3ZhcjIpCi17Ci0jaWYgQVJNVjVURV9MX0FERAotCVdvcmQzMiByZXN1bHQ7Ci0JYXNtICgKLQkJIlFBREQgJVtyZXN1bHRdLCAlW0xfdmFyMV0sICVbTF92YXIyXVxuIgotCQk6W3Jlc3VsdF0iPXIiKHJlc3VsdCkKLQkJOltMX3ZhcjFdInIiKExfdmFyMSksIFtMX3ZhcjJdInIiKExfdmFyMikKLQkJKTsKLQlyZXR1cm4gcmVzdWx0OwotI2Vsc2UKLSAgICBXb3JkMzIgTF92YXJfb3V0OwotCi0gICAgTF92YXJfb3V0ID0gTF92YXIxICsgTF92YXIyOwotICAgIGlmICgoKExfdmFyMSBeIExfdmFyMikgJiBNSU5fMzIpID09IDApCi0gICAgewotICAgICAgICBpZiAoKExfdmFyX291dCBeIExfdmFyMSkgJiBNSU5fMzIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExfdmFyX291dCA9IChMX3ZhcjEgPCAwKSA/IE1JTl8zMiA6IE1BWF8zMjsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gKExfdmFyX291dCk7Ci0jZW5kaWYKLX0KLSNlbmRpZgotCi0KLQotI2lmIChNVUxUX1JfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDE2IG11bHRfciAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKQotewotICAgIFdvcmQxNiB2YXJfb3V0OwotICAgIFdvcmQzMiBMX3Byb2R1Y3RfYXJyOwotCi0gICAgTF9wcm9kdWN0X2FyciA9IChXb3JkMzIpdmFyMSAqKFdvcmQzMil2YXIyOyAgICAgICAvKiBwcm9kdWN0ICovCi0gICAgTF9wcm9kdWN0X2FyciArPSAoV29yZDMyKTB4MDAwMDQwMDBMOyAgICAgIC8qIHJvdW5kICovCi0gICAgTF9wcm9kdWN0X2FyciA+Pj0gMTU7ICAgICAgIC8qIHNoaWZ0ICovCi0KLSAgICB2YXJfb3V0ID0gc2F0dXJhdGUoTF9wcm9kdWN0X2Fycik7Ci0KLSAgICByZXR1cm4gKHZhcl9vdXQpOwotfQotI2VuZGlmCi0KLSNpZiAoU0hSX1JfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDE2IHNocl9yIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpCi17Ci0gICAgV29yZDE2IHZhcl9vdXQ7Ci0KLSAgICBpZiAodmFyMiA+IDE1KQotICAgIHsKLSAgICAgICAgdmFyX291dCA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHZhcl9vdXQgPSBzaHIodmFyMSwgdmFyMik7Ci0KLSAgICAgICAgaWYgKHZhcjIgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKHZhcjEgJiAoKFdvcmQxNikgMSA8PCAodmFyMiAtIDEpKSkgIT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXJfb3V0Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gKHZhcl9vdXQpOwotfQotI2VuZGlmCi0KLSNpZiAoTUFDX1JfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDE2IG1hY19yIChXb3JkMzIgTF92YXIzLCBXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpCi17Ci0gICAgV29yZDE2IHZhcl9vdXQ7Ci0KLSAgICBMX3ZhcjMgPSBMX21hYyAoTF92YXIzLCB2YXIxLCB2YXIyKTsKLSAgICB2YXJfb3V0ID0gKFdvcmQxNikoKExfdmFyMyArIDB4ODAwMEwpID4+IDE2KTsKLQotICAgIHJldHVybiAodmFyX291dCk7Ci19Ci0jZW5kaWYKLQotI2lmIChNU1VfUl9JU19JTkxJTkUpCi1fX2lubGluZSBXb3JkMTYgbXN1X3IgKFdvcmQzMiBMX3ZhcjMsIFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikKLXsKLSAgICBXb3JkMTYgdmFyX291dDsKLQotICAgIExfdmFyMyA9IExfbXN1IChMX3ZhcjMsIHZhcjEsIHZhcjIpOwotICAgIHZhcl9vdXQgPSAoV29yZDE2KSgoTF92YXIzICsgMHg4MDAwTCkgPj4gMTYpOwotCi0gICAgcmV0dXJuICh2YXJfb3V0KTsKLX0KLSNlbmRpZgotCi0jaWYgKExfU0hSX1JfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDMyIExfc2hyX3IgKFdvcmQzMiBMX3ZhcjEsIFdvcmQxNiB2YXIyKQotewotICAgIFdvcmQzMiBMX3Zhcl9vdXQ7Ci0KLSAgICBpZiAodmFyMiA+IDMxKQotICAgIHsKLSAgICAgICAgTF92YXJfb3V0ID0gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTF92YXJfb3V0ID0gTF9zaHIoTF92YXIxLCB2YXIyKTsKLQotICAgICAgICBpZiAodmFyMiA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoTF92YXIxICYgKChXb3JkMzIpIDEgPDwgKHZhcjIgLSAxKSkpICE9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTF92YXJfb3V0Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gKExfdmFyX291dCk7Ci19Ci0jZW5kaWYKLQotI2lmIChFWFRSQUNUX0hfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDE2IGV4dHJhY3RfaCAoV29yZDMyIExfdmFyMSkKLXsKLSAgICBXb3JkMTYgdmFyX291dDsKLQotICAgIHZhcl9vdXQgPSAoV29yZDE2KSAoTF92YXIxID4+IDE2KTsKLQotICAgIHJldHVybiAodmFyX291dCk7Ci19Ci0jZW5kaWYKLQotI2lmIChFWFRSQUNUX0xfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDE2IGV4dHJhY3RfbChXb3JkMzIgTF92YXIxKQotewotCXJldHVybiAoV29yZDE2KSBMX3ZhcjE7Ci19Ci0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL2Jhc2ljb3AyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL2Jhc2ljb3AyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0M2JiZDkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC9iYXNpY29wMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTYyNCArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCWJhc2ljb3AyLmMKLQotCUNvbnRlbnQ6CUJhc2ljIGFyaXRobWV0aWMgb3BlcmF0b3JzLgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAidHlwZWRlZi5oIgotI2luY2x1ZGUgImJhc2ljX29wLmgiCi0KLQotLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBGdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKLSovCi0KLS8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgRnVuY3Rpb24gTmFtZSA6IHNhdHVyYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgTGltaXQgdGhlIDMyIGJpdCBpbnB1dCB0byB0aGUgcmFuZ2Ugb2YgYSAxNiBiaXQgd29yZC4gICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBMX3ZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3ZhcjEgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcl9vdXQgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgIHwKLSB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAotKi8KLQotI2lmICghU0FUUlVBVEVfSVNfSU5MSU5FKQotV29yZDE2IHNhdHVyYXRlKFdvcmQzMiBMX3ZhcjEpCi17Ci0gICAgV29yZDE2IHZhcl9vdXQ7Ci0KLSAgICBpZiAoTF92YXIxID4gMFgwMDAwN2ZmZkwpCi0gICAgewotICAgICAgICB2YXJfb3V0ID0gTUFYXzE2OwotICAgIH0KLSAgICBlbHNlIGlmIChMX3ZhcjEgPCAoV29yZDMyKSAweGZmZmY4MDAwTCkKLSAgICB7Ci0gICAgICAgIHZhcl9vdXQgPSBNSU5fMTY7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHZhcl9vdXQgPSBleHRyYWN0X2woTF92YXIxKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gKHZhcl9vdXQpOwotfQotI2VuZGlmCi0KLS8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgRnVuY3Rpb24gTmFtZSA6IGFkZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgUGVyZm9ybXMgdGhlIGFkZGl0aW9uICh2YXIxK3ZhcjIpIHdpdGggb3ZlcmZsb3cgY29udHJvbCBhbmQgc2F0dXJhdGlvbjt8Ci0gfCAgICB0aGUgMTYgYml0IHJlc3VsdCBpcyBzZXQgYXQgKzMyNzY3IHdoZW4gb3ZlcmZsb3cgb2NjdXJzIG9yIGF0IC0zMjc2OCAgIHwKLSB8ICAgIHdoZW4gdW5kZXJmbG93IG9jY3Vycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXJfb3V0IDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICB8Ci0gfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKLSovCi0KLSNpZiAoIUFERF9JU19JTkxJTkUpCi1Xb3JkMTYgYWRkIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpCi17Ci0gICAgV29yZDE2IHZhcl9vdXQ7Ci0gICAgV29yZDMyIExfc3VtOwotCi0gICAgTF9zdW0gPSAoV29yZDMyKXZhcjEgKyAoV29yZDMyKXZhcjI7Ci0gICAgdmFyX291dCA9IHNhdHVyYXRlKExfc3VtKTsKLQotICAgIHJldHVybiAodmFyX291dCk7Ci19Ci0jZW5kaWYKLQotLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBGdW5jdGlvbiBOYW1lIDogc3ViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBQZXJmb3JtcyB0aGUgc3VidHJhY3Rpb24gKHZhcjErdmFyMikgd2l0aCBvdmVyZmxvdyBjb250cm9sIGFuZCBzYXR1LSAgIHwKLSB8ICAgIHJhdGlvbjsgdGhlIDE2IGJpdCByZXN1bHQgaXMgc2V0IGF0ICszMjc2NyB3aGVuIG92ZXJmbG93IG9jY3VycyBvciBhdCAgfAotIHwgICAgLTMyNzY4IHdoZW4gdW5kZXJmbG93IG9jY3Vycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcl9vdXQgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgIHwKLSB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAotKi8KLSNpZiAoIVNVQl9JU19JTkxJTkUpCi1Xb3JkMTYgc3ViKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikKLXsKLSAgICBXb3JkMTYgdmFyX291dDsKLSAgICBXb3JkMzIgTF9kaWZmOwotCi0gICAgTF9kaWZmID0gKFdvcmQzMikgdmFyMSAtIHZhcjI7Ci0gICAgdmFyX291dCA9IHNhdHVyYXRlKExfZGlmZik7Ci0KLSAgICByZXR1cm4gKHZhcl9vdXQpOwotfQotI2VuZGlmCi0KLS8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgRnVuY3Rpb24gTmFtZSA6IGFic19zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgQWJzb2x1dGUgdmFsdWUgb2YgdmFyMTsgYWJzX3MoLTMyNzY4KSA9IDMyNzY3LiAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDAwMDAgMDAwMCA8PSB2YXJfb3V0IDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICB8Ci0gfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKLSovCi0vL1dvcmQxNiBhYnNfcyAoV29yZDE2IHZhcjEpCi0vL3sKLS8vICAgIFdvcmQxNiB2YXJfb3V0OwotLy8KLS8vICAgIGlmICh2YXIxID09IE1JTl8xNikKLS8vICAgIHsKLS8vICAgICAgICB2YXJfb3V0ID0gTUFYXzE2OwotLy8gICAgfQotLy8gICAgZWxzZQotLy8gICAgewotLy8gICAgICAgIGlmICh2YXIxIDwgMCkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICAgIHZhcl9vdXQgPSAoV29yZDE2KS12YXIxOwotLy8gICAgICAgIH0KLS8vICAgICAgICBlbHNlCi0vLyAgICAgICAgewotLy8gICAgICAgICAgICB2YXJfb3V0ID0gdmFyMTsKLS8vICAgICAgICB9Ci0vLyAgICB9Ci0vLwotLy8gICAgcmV0dXJuICh2YXJfb3V0KTsKLS8vfQotCi0KLS8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgRnVuY3Rpb24gTmFtZSA6IHNobCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBBcml0aG1ldGljYWxseSBzaGlmdCB0aGUgMTYgYml0IGlucHV0IHZhcjEgbGVmdCB2YXIyIHBvc2l0aW9ucy5aZXJvIGZpbGx8Ci0gfCAgIHRoZSB2YXIyIExTQiBvZiB0aGUgcmVzdWx0LiBJZiB2YXIyIGlzIG5lZ2F0aXZlLCBhcml0aG1ldGljYWxseSBzaGlmdCAgIHwKLSB8ICAgdmFyMSByaWdodCBieSAtdmFyMiB3aXRoIHNpZ24gZXh0ZW5zaW9uLiBTYXR1cmF0ZSB0aGUgcmVzdWx0IGluIGNhc2Ugb2YgfAotIHwgICB1bmRlcmZsb3dzIG9yIG92ZXJmbG93cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcl9vdXQgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgIHwKLSB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAotKi8KLQotI2lmICghU0hMX0lTX0lOTElORSkKLVdvcmQxNiBzaGwgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikKLXsKLSAgICBXb3JkMTYgdmFyX291dDsKLSAgICBXb3JkMzIgcmVzdWx0OwotCi0gICAgaWYgKHZhcjIgPCAwKQotICAgIHsKLSAgICAgICAgaWYgKHZhcjIgPCAtMTYpCi0gICAgICAgICAgICB2YXIyID0gLTE2OwotICAgICAgICB2YXJfb3V0ID0gc2hyICh2YXIxLCAoV29yZDE2KS12YXIyKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmVzdWx0ID0gKFdvcmQzMikgdmFyMSAqKChXb3JkMzIpIDEgPDwgdmFyMik7Ci0KLSAgICAgICAgaWYgKCh2YXIyID4gMTUgJiYgdmFyMSAhPSAwKSB8fCAocmVzdWx0ICE9IChXb3JkMzIpICgoV29yZDE2KSByZXN1bHQpKSkKLSAgICAgICAgewotICAgICAgICAgICAgLy9PdmVyZmxvdyA9IDE7Ci0gICAgICAgICAgICB2YXJfb3V0ID0gKFdvcmQxNikoKHZhcjEgPiAwKSA/IE1BWF8xNiA6IE1JTl8xNik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXJfb3V0ID0gZXh0cmFjdF9sKHJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gKHZhcl9vdXQpOwotfQotI2VuZGlmCi0vLyBlbmQKLQotLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBGdW5jdGlvbiBOYW1lIDogc2hyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIEFyaXRobWV0aWNhbGx5IHNoaWZ0IHRoZSAxNiBiaXQgaW5wdXQgdmFyMSByaWdodCB2YXIyIHBvc2l0aW9ucyB3aXRoICAgIHwKLSB8ICAgc2lnbiBleHRlbnNpb24uIElmIHZhcjIgaXMgbmVnYXRpdmUsIGFyaXRobWV0aWNhbGx5IHNoaWZ0IHZhcjEgbGVmdCBieSAgfAotIHwgICAtdmFyMiB3aXRoIHNpZ24gZXh0ZW5zaW9uLiBTYXR1cmF0ZSB0aGUgcmVzdWx0IGluIGNhc2Ugb2YgdW5kZXJmbG93cyBvciB8Ci0gfCAgIG92ZXJmbG93cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyX291dCA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgfAotIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ci0qLwotCi0jaWYgKCFTSFJfSVNfSU5MSU5FKQotV29yZDE2IHNociAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKQotewotICAgIFdvcmQxNiB2YXJfb3V0OwotCi0gICAgaWYgKHZhcjIgPCAwKQotICAgIHsKLSAgICAgICAgaWYgKHZhcjIgPCAtMTYpCi0gICAgICAgICAgICB2YXIyID0gLTE2OwotICAgICAgICB2YXJfb3V0ID0gc2hsICh2YXIxLCAoV29yZDE2KS12YXIyKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKHZhcjIgPj0gMTUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhcl9vdXQgPSAoV29yZDE2KSgodmFyMSA8IDApID8gLTEgOiAwKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh2YXIxIDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXJfb3V0ID0gKFdvcmQxNikofigofnZhcjEpID4+IHZhcjIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXJfb3V0ID0gKFdvcmQxNikodmFyMSA+PiB2YXIyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAodmFyX291dCk7Ci19Ci0jZW5kaWYKLQotCi0vKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIEZ1bmN0aW9uIE5hbWUgOiBtdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIFBlcmZvcm1zIHRoZSBtdWx0aXBsaWNhdGlvbiBvZiB2YXIxIGJ5IHZhcjIgYW5kIGdpdmVzIGEgMTYgYml0IHJlc3VsdCAgfAotIHwgICAgd2hpY2ggaXMgc2NhbGVkIGkuZS46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICBtdWx0KHZhcjEsdmFyMikgPSBleHRyYWN0X2woTF9zaHIoKHZhcjEgdGltZXMgdmFyMiksMTUpKSBhbmQgIHwKLSB8ICAgICAgICAgICAgIG11bHQoLTMyNzY4LC0zMjc2OCkgPSAzMjc2Ny4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXJfb3V0IDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICB8Ci0gfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKLSovCi0jaWYgKCFNVUxUX0lTX0lOTElORSkKLVdvcmQxNiBtdWx0IChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpCi17Ci0gICAgV29yZDE2IHZhcl9vdXQ7Ci0gICAgV29yZDMyIExfcHJvZHVjdDsKLQotICAgIExfcHJvZHVjdCA9IChXb3JkMzIpIHZhcjEgKihXb3JkMzIpIHZhcjI7Ci0KLSAgICBMX3Byb2R1Y3QgPSAoTF9wcm9kdWN0ICYgKFdvcmQzMikgMHhmZmZmODAwMEwpID4+IDE1OwotCi0gICAgaWYgKExfcHJvZHVjdCAmIChXb3JkMzIpIDB4MDAwMTAwMDBMKQotICAgICAgICBMX3Byb2R1Y3QgPSBMX3Byb2R1Y3QgfCAoV29yZDMyKSAweGZmZmYwMDAwTDsKLQotICAgIHZhcl9vdXQgPSBzYXR1cmF0ZShMX3Byb2R1Y3QpOwotCi0gICAgcmV0dXJuICh2YXJfb3V0KTsKLX0KLSNlbmRpZgotCi0vKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIEZ1bmN0aW9uIE5hbWUgOiBMX211bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgTF9tdWx0IGlzIHRoZSAzMiBiaXQgcmVzdWx0IG9mIHRoZSBtdWx0aXBsaWNhdGlvbiBvZiB2YXIxIHRpbWVzIHZhcjIgICAgfAotIHwgICB3aXRoIG9uZSBzaGlmdCBsZWZ0IGkuZS46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgTF9tdWx0KHZhcjEsdmFyMikgPSBMX3NobCgodmFyMSB0aW1lcyB2YXIyKSwxKSBhbmQgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICBMX211bHQoLTMyNzY4LC0zMjc2OCkgPSAyMTQ3NDgzNjQ3LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBMX3Zhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3Zhcl9vdXQgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICB8Ci0gfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKLSovCi0KLSNpZiAoIUxfTVVMVF9JU19JTkxJTkUpCi1Xb3JkMzIgTF9tdWx0KFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikKLXsKLSAgICBXb3JkMzIgTF92YXJfb3V0OwotCi0gICAgTF92YXJfb3V0ID0gKFdvcmQzMikgdmFyMSAqKFdvcmQzMikgdmFyMjsKLQotICAgIGlmIChMX3Zhcl9vdXQgIT0gKFdvcmQzMikgMHg0MDAwMDAwMEwpCi0gICAgewotICAgICAgICBMX3Zhcl9vdXQgPDw9IDE7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIExfdmFyX291dCA9IE1BWF8zMjsKLSAgICB9Ci0KLSAgICByZXR1cm4gKExfdmFyX291dCk7Ci19Ci0jZW5kaWYKLS8vIGVuZAotCi0vKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIEZ1bmN0aW9uIE5hbWUgOiBuZWdhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgTmVnYXRlIHZhcjEgd2l0aCBzYXR1cmF0aW9uLCBzYXR1cmF0ZSBpbiB0aGUgY2FzZSB3aGVyZSBpbnB1dCBpcyAtMzI3Njg6fAotIHwgICAgICAgICAgICAgICAgbmVnYXRlKHZhcjEpID0gc3ViKDAsdmFyMSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXJfb3V0IDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICB8Ci0gfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKLSovCi0vL1dvcmQxNiBuZWdhdGUgKFdvcmQxNiB2YXIxKQotLy97Ci0vLyAgICBXb3JkMTYgdmFyX291dDsKLS8vCi0vLyAgICB2YXJfb3V0ID0gKFdvcmQxNikoKHZhcjEgPT0gTUlOXzE2KSA/IE1BWF8xNiA6IC12YXIxKTsKLS8vCi0vLyAgICByZXR1cm4gKHZhcl9vdXQpOwotLy99Ci0KLQotLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBGdW5jdGlvbiBOYW1lIDogZXh0cmFjdF9oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFJldHVybiB0aGUgMTYgTVNCIG9mIExfdmFyMS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBMX3ZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIgKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3ZhcjEgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcl9vdXQgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgIHwKLSB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAotKi8KLSNpZiAoIUVYVFJBQ1RfSF9JU19JTkxJTkUpCi1Xb3JkMTYgZXh0cmFjdF9oIChXb3JkMzIgTF92YXIxKQotewotICAgIFdvcmQxNiB2YXJfb3V0OwotCi0gICAgdmFyX291dCA9IChXb3JkMTYpIChMX3ZhcjEgPj4gMTYpOwotCi0gICAgcmV0dXJuICh2YXJfb3V0KTsKLX0KLSNlbmRpZgotCi0vKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIEZ1bmN0aW9uIE5hbWUgOiBleHRyYWN0X2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUmV0dXJuIHRoZSAxNiBMU0Igb2YgTF92YXIxLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIExfdmFyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMiApIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyMSA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyX291dCA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgfAotIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ci0qLwotI2lmICghRVhUUkFDVF9MX0lTX0lOTElORSkKLVdvcmQxNiBleHRyYWN0X2woV29yZDMyIExfdmFyMSkKLXsKLSAgICBXb3JkMTYgdmFyX291dDsKLQotICAgIHZhcl9vdXQgPSAoV29yZDE2KSBMX3ZhcjE7Ci0KLSAgICByZXR1cm4gKHZhcl9vdXQpOwotfQotI2VuZGlmCi0KLS8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgRnVuY3Rpb24gTmFtZSA6IHJvdW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBSb3VuZCB0aGUgbG93ZXIgMTYgYml0cyBvZiB0aGUgMzIgYml0IGlucHV0IG51bWJlciBpbnRvIHRoZSBNUyAxNiBiaXRzICB8Ci0gfCAgIHdpdGggc2F0dXJhdGlvbi4gU2hpZnQgdGhlIHJlc3VsdGluZyBiaXRzIHJpZ2h0IGJ5IDE2IGFuZCByZXR1cm4gdGhlIDE2IHwKLSB8ICAgYml0IG51bWJlcjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICByb3VuZChMX3ZhcjEpID0gZXh0cmFjdF9oKExfYWRkKExfdmFyMSwzMjc2OCkpICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgTF92YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyICkgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXIxIDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXJfb3V0IDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICB8Ci0gfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKLSovCi0KLSNpZiAoIVJPVU5EX0lTX0lOTElORSkKLVdvcmQxNiByb3VuZDE2KFdvcmQzMiBMX3ZhcjEpCi17Ci0gICAgV29yZDE2IHZhcl9vdXQ7Ci0gICAgV29yZDMyIExfcm91bmRlZDsKLQotICAgIExfcm91bmRlZCA9IExfYWRkIChMX3ZhcjEsIChXb3JkMzIpIDB4MDAwMDgwMDBMKTsKLSAgICB2YXJfb3V0ID0gZXh0cmFjdF9oIChMX3JvdW5kZWQpOwotCi0gICAgcmV0dXJuICh2YXJfb3V0KTsKLX0KLSNlbmRpZgotLy8gZW5kCi0KLS8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgRnVuY3Rpb24gTmFtZSA6IExfbWFjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBNdWx0aXBseSB2YXIxIGJ5IHZhcjIgYW5kIHNoaWZ0IHRoZSByZXN1bHQgbGVmdCBieSAxLiBBZGQgdGhlIDMyIGJpdCAgICB8Ci0gfCAgIHJlc3VsdCB0byBMX3ZhcjMgd2l0aCBzYXR1cmF0aW9uLCByZXR1cm4gYSAzMiBiaXQgcmVzdWx0OiAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICBMX21hYyhMX3ZhcjMsdmFyMSx2YXIyKSA9IExfYWRkKExfdmFyMyxMX211bHQodmFyMSx2YXIyKSkuICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIExfdmFyMyAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3ZhcjMgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBMX3Zhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3Zhcl9vdXQgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICB8Ci0gfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKLSovCi0jaWYgKCFMX01TVV9JU19JTkxJTkUpCi1Xb3JkMzIgTF9tYWMgKFdvcmQzMiBMX3ZhcjMsIFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikKLXsKLSAgICBXb3JkMzIgTF92YXJfb3V0OwotICAgIFdvcmQzMiBMX3Byb2R1Y3Q7Ci0KLSAgICBMX3Byb2R1Y3QgPSBMX211bHQodmFyMSwgdmFyMik7Ci0gICAgTF92YXJfb3V0ID0gTF9hZGQgKExfdmFyMywgTF9wcm9kdWN0KTsKLQotICAgIHJldHVybiAoTF92YXJfb3V0KTsKLX0KLSNlbmRpZgotCi0vKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIEZ1bmN0aW9uIE5hbWUgOiBMX21zdSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgTXVsdGlwbHkgdmFyMSBieSB2YXIyIGFuZCBzaGlmdCB0aGUgcmVzdWx0IGxlZnQgYnkgMS4gU3VidHJhY3QgdGhlIDMyICAgfAotIHwgICBiaXQgcmVzdWx0IHRvIExfdmFyMyB3aXRoIHNhdHVyYXRpb24sIHJldHVybiBhIDMyIGJpdCByZXN1bHQ6ICAgICAgICAgICB8Ci0gfCAgICAgICAgTF9tc3UoTF92YXIzLHZhcjEsdmFyMikgPSBMX3N1YihMX3ZhcjMsTF9tdWx0KHZhcjEsdmFyMikpLiAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBMX3ZhcjMgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXIzIDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgTF92YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXJfb3V0IDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgfAotIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ci0qLwotCi0jaWYgKCFMX01TVV9JU19JTkxJTkUpCi1Xb3JkMzIgTF9tc3UgKFdvcmQzMiBMX3ZhcjMsIFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikKLXsKLSAgICBXb3JkMzIgTF92YXJfb3V0OwotICAgIFdvcmQzMiBMX3Byb2R1Y3Q7Ci0KLSAgICBMX3Byb2R1Y3QgPSBMX211bHQodmFyMSwgdmFyMik7Ci0gICAgTF92YXJfb3V0ID0gTF9zdWIgKExfdmFyMywgTF9wcm9kdWN0KTsKLQotICAgIHJldHVybiAoTF92YXJfb3V0KTsKLX0KLSNlbmRpZgotCi0KLS8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgRnVuY3Rpb24gTmFtZSA6IExfYWRkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAzMiBiaXRzIGFkZGl0aW9uIG9mIHRoZSB0d28gMzIgYml0cyB2YXJpYWJsZXMgKExfdmFyMStMX3ZhcjIpIHdpdGggICAgICB8Ci0gfCAgIG92ZXJmbG93IGNvbnRyb2wgYW5kIHNhdHVyYXRpb247IHRoZSByZXN1bHQgaXMgc2V0IGF0ICsyMTQ3NDgzNjQ3IHdoZW4gIHwKLSB8ICAgb3ZlcmZsb3cgb2NjdXJzIG9yIGF0IC0yMTQ3NDgzNjQ4IHdoZW4gdW5kZXJmbG93IG9jY3Vycy4gICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIExfdmFyMSAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3ZhcjMgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIExfdmFyMiAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3ZhcjMgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIExfdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyX291dCA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgIHwKLSB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAotKi8KLSNpZiAoIUxfQUREX0lTX0lOTElORSkKLVdvcmQzMiBMX2FkZCAoV29yZDMyIExfdmFyMSwgV29yZDMyIExfdmFyMikKLXsKLSAgICBXb3JkMzIgTF92YXJfb3V0OwotCi0gICAgTF92YXJfb3V0ID0gTF92YXIxICsgTF92YXIyOwotCi0gICAgaWYgKCgoTF92YXIxIF4gTF92YXIyKSAmIE1JTl8zMikgPT0gMCkKLSAgICB7Ci0gICAgICAgIGlmICgoTF92YXJfb3V0IF4gTF92YXIxKSAmIE1JTl8zMikKLSAgICAgICAgewotICAgICAgICAgICAgTF92YXJfb3V0ID0gKExfdmFyMSA8IDApID8gTUlOXzMyIDogTUFYXzMyOwotICAgICAgICAgICAgLy9PdmVyZmxvdyA9IDE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gKExfdmFyX291dCk7Ci19Ci0jZW5kaWYKLQotLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBGdW5jdGlvbiBOYW1lIDogTF9zdWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIDMyIGJpdHMgc3VidHJhY3Rpb24gb2YgdGhlIHR3byAzMiBiaXRzIHZhcmlhYmxlcyAoTF92YXIxLUxfdmFyMikgd2l0aCAgIHwKLSB8ICAgb3ZlcmZsb3cgY29udHJvbCBhbmQgc2F0dXJhdGlvbjsgdGhlIHJlc3VsdCBpcyBzZXQgYXQgKzIxNDc0ODM2NDcgd2hlbiAgfAotIHwgICBvdmVyZmxvdyBvY2N1cnMgb3IgYXQgLTIxNDc0ODM2NDggd2hlbiB1bmRlcmZsb3cgb2NjdXJzLiAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgTF92YXIxICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyMyA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgTF92YXIyICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyMyA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgTF92YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXJfb3V0IDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgfAotIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ci0qLwotI2lmICghTF9TVUJfSVNfSU5MSU5FKQotV29yZDMyIExfc3ViKFdvcmQzMiBMX3ZhcjEsIFdvcmQzMiBMX3ZhcjIpCi17Ci0gICAgV29yZDMyIExfdmFyX291dDsKLQotICAgIExfdmFyX291dCA9IExfdmFyMSAtIExfdmFyMjsKLQotICAgIGlmICgoKExfdmFyMSBeIExfdmFyMikgJiBNSU5fMzIpICE9IDApCi0gICAgewotICAgICAgICBpZiAoKExfdmFyX291dCBeIExfdmFyMSkgJiBNSU5fMzIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExfdmFyX291dCA9IChMX3ZhcjEgPCAwTCkgPyBNSU5fMzIgOiBNQVhfMzI7Ci0gICAgICAgICAgICAvL092ZXJmbG93ID0gMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAoTF92YXJfb3V0KTsKLX0KLSNlbmRpZgotCi0KLS8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgRnVuY3Rpb24gTmFtZSA6IExfbmVnYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBOZWdhdGUgdGhlIDMyIGJpdCB2YXJpYWJsZSBMX3ZhcjEgd2l0aCBzYXR1cmF0aW9uOyBzYXR1cmF0ZSBpbiB0aGUgY2FzZSB8Ci0gfCAgIHdoZXJlIGlucHV0IGlzIC0yMTQ3NDgzNjQ4ICgweDgwMDAgMDAwMCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBMX3ZhcjEgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXIzIDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBMX3Zhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3Zhcl9vdXQgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICB8Ci0gfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKLSovCi0vL1dvcmQzMiBMX25lZ2F0ZSAoV29yZDMyIExfdmFyMSkKLS8vewotLy8gICAgV29yZDMyIExfdmFyX291dDsKLS8vCi0vLyAgICBMX3Zhcl9vdXQgPSAoTF92YXIxID09IE1JTl8zMikgPyBNQVhfMzIgOiAtTF92YXIxOwotLy8KLS8vICAgIHJldHVybiAoTF92YXJfb3V0KTsKLS8vfQotCi0KLS8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgRnVuY3Rpb24gTmFtZSA6IG11bHRfciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBTYW1lIGFzIG11bHQgd2l0aCByb3VuZGluZywgaS5lLjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgbXVsdF9yKHZhcjEsdmFyMikgPSBleHRyYWN0X2woTF9zaHIoKCh2YXIxICogdmFyMikgKyAxNjM4NCksMTUpKSBhbmQgIHwKLSB8ICAgICBtdWx0X3IoLTMyNzY4LC0zMjc2OCkgPSAzMjc2Ny4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXJfb3V0IDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICB8Ci0gfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKLSovCi0jaWYgKCFNVUxUX1JfSVNfSU5MSU5FKQotV29yZDE2IG11bHRfciAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKQotewotICAgIFdvcmQxNiB2YXJfb3V0OwotICAgIFdvcmQzMiBMX3Byb2R1Y3RfYXJyOwotCi0gICAgTF9wcm9kdWN0X2FyciA9IChXb3JkMzIpIHZhcjEgKihXb3JkMzIpIHZhcjI7ICAgICAgIC8qIHByb2R1Y3QgKi8KLSAgICBMX3Byb2R1Y3RfYXJyICs9IChXb3JkMzIpIDB4MDAwMDQwMDBMOyAgICAgIC8qIHJvdW5kICovCi0gICAgTF9wcm9kdWN0X2FyciAmPSAoV29yZDMyKSAweGZmZmY4MDAwTDsKLSAgICBMX3Byb2R1Y3RfYXJyID4+PSAxNTsgICAgICAgLyogc2hpZnQgKi8KLQotICAgIGlmIChMX3Byb2R1Y3RfYXJyICYgKFdvcmQzMikgMHgwMDAxMDAwMEwpICAgLyogc2lnbiBleHRlbmQgd2hlbiBuZWNlc3NhcnkgKi8KLSAgICB7Ci0gICAgICAgIExfcHJvZHVjdF9hcnIgfD0gKFdvcmQzMikgMHhmZmZmMDAwMEw7Ci0gICAgfQotICAgIHZhcl9vdXQgPSBzYXR1cmF0ZShMX3Byb2R1Y3RfYXJyKTsKLQotICAgIHJldHVybiAodmFyX291dCk7Ci19Ci0jZW5kaWYKLQotLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBGdW5jdGlvbiBOYW1lIDogTF9zaGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIEFyaXRobWV0aWNhbGx5IHNoaWZ0IHRoZSAzMiBiaXQgaW5wdXQgTF92YXIxIGxlZnQgdmFyMiBwb3NpdGlvbnMuIFplcm8gIHwKLSB8ICAgZmlsbCB0aGUgdmFyMiBMU0Igb2YgdGhlIHJlc3VsdC4gSWYgdmFyMiBpcyBuZWdhdGl2ZSwgYXJpdGhtZXRpY2FsbHkgICAgfAotIHwgICBzaGlmdCBMX3ZhcjEgcmlnaHQgYnkgLXZhcjIgd2l0aCBzaWduIGV4dGVuc2lvbi4gU2F0dXJhdGUgdGhlIHJlc3VsdCBpbiB8Ci0gfCAgIGNhc2Ugb2YgdW5kZXJmbG93cyBvciBvdmVyZmxvd3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBMX3ZhcjEgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXIzIDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIExfdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyX291dCA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgIHwKLSB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAotKi8KLQotI2lmICghTF9TSExfSVNfSU5MSU5FKQotV29yZDMyIExfc2hsIChXb3JkMzIgTF92YXIxLCBXb3JkMTYgdmFyMikKLXsKLSAgICBXb3JkMzIgTF92YXJfb3V0ID0gMEw7Ci0KLSAgICBpZiAodmFyMiA8PSAwKQotICAgIHsKLSAgICAgICAgTF92YXIxID0gTF9zaHIoTF92YXIxLCAoV29yZDE2KS12YXIyKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZm9yICg7IHZhcjIgPiAwOyB2YXIyLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChMX3ZhcjEgPiAoV29yZDMyKSAwWDNmZmZmZmZmTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTUFYXzMyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChMX3ZhcjEgPCAoV29yZDMyKSAweGMwMDAwMDAwTCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNSU5fMzI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgTF92YXIxIDw8PSAxOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAoTF92YXIxKTsKLX0KLSNlbmRpZgotCi0vKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIEZ1bmN0aW9uIE5hbWUgOiBMX3NociAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgQXJpdGhtZXRpY2FsbHkgc2hpZnQgdGhlIDMyIGJpdCBpbnB1dCBMX3ZhcjEgcmlnaHQgdmFyMiBwb3NpdGlvbnMgd2l0aCAgfAotIHwgICBzaWduIGV4dGVuc2lvbi4gSWYgdmFyMiBpcyBuZWdhdGl2ZSwgYXJpdGhtZXRpY2FsbHkgc2hpZnQgTF92YXIxIGxlZnQgICB8Ci0gfCAgIGJ5IC12YXIyIGFuZCB6ZXJvIGZpbGwgdGhlIC12YXIyIExTQiBvZiB0aGUgcmVzdWx0LiBTYXR1cmF0ZSB0aGUgcmVzdWx0IHwKLSB8ICAgaW4gY2FzZSBvZiB1bmRlcmZsb3dzIG9yIG92ZXJmbG93cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIExfdmFyMSAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3ZhcjMgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgTF92YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXJfb3V0IDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgfAotIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ci0qLwotCi0jaWYgKCFMX1NIUl9JU19JTkxJTkUpCi1Xb3JkMzIgTF9zaHIgKFdvcmQzMiBMX3ZhcjEsIFdvcmQxNiB2YXIyKQotewotICAgIFdvcmQzMiBMX3Zhcl9vdXQ7Ci0KLSAgICBpZiAodmFyMiA8IDApCi0gICAgewotICAgICAgICBMX3Zhcl9vdXQgPSBMX3NobCAoTF92YXIxLCAoV29yZDE2KS12YXIyKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKHZhcjIgPj0gMzEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExfdmFyX291dCA9IChMX3ZhcjEgPCAwTCkgPyAtMSA6IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoTF92YXIxIDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBMX3Zhcl9vdXQgPSB+KCh+TF92YXIxKSA+PiB2YXIyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBMX3Zhcl9vdXQgPSBMX3ZhcjEgPj4gdmFyMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gKExfdmFyX291dCk7Ci19Ci0jZW5kaWYKLQotLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBGdW5jdGlvbiBOYW1lIDogc2hyX3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFNhbWUgYXMgc2hyKHZhcjEsdmFyMikgYnV0IHdpdGggcm91bmRpbmcuIFNhdHVyYXRlIHRoZSByZXN1bHQgaW4gY2FzZSBvZnwKLSB8ICAgdW5kZXJmbG93cyBvciBvdmVyZmxvd3MgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgLSBJZiB2YXIyIGlzIGdyZWF0ZXIgdGhhbiB6ZXJvIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICBpZiAoc3ViKHNobChzaHIodmFyMSx2YXIyKSwxKSxzaHIodmFyMSxzdWIodmFyMiwxKSkpKSAgICAgICAgICAgIHwKLSB8ICAgICAgICAgIGlzIGVxdWFsIHRvIHplcm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICB0aGVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgIHNocl9yKHZhcjEsdmFyMikgPSBzaHIodmFyMSx2YXIyKSAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICBzaHJfcih2YXIxLHZhcjIpID0gYWRkKHNocih2YXIxLHZhcjIpLDEpICAgICAgICAgICAgICB8Ci0gfCAgICAtIElmIHZhcjIgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHplcm8gOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgc2hyX3IodmFyMSx2YXIyKSA9IHNocih2YXIxLHZhcjIpLiAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXJfb3V0IDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICB8Ci0gfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKLSovCi0jaWYgKCFTSFJfUl9JU19JTkxJTkUpCi1Xb3JkMTYgc2hyX3IgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikKLXsKLSAgICBXb3JkMTYgdmFyX291dDsKLQotICAgIGlmICh2YXIyID4gMTUpCi0gICAgewotICAgICAgICB2YXJfb3V0ID0gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdmFyX291dCA9IHNociAodmFyMSwgdmFyMik7Ci0KLSAgICAgICAgaWYgKHZhcjIgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKHZhcjEgJiAoKFdvcmQxNikgMSA8PCAodmFyMiAtIDEpKSkgIT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXJfb3V0Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gKHZhcl9vdXQpOwotfQotI2VuZGlmCi0KLS8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgRnVuY3Rpb24gTmFtZSA6IG1hY19yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBNdWx0aXBseSB2YXIxIGJ5IHZhcjIgYW5kIHNoaWZ0IHRoZSByZXN1bHQgbGVmdCBieSAxLiBBZGQgdGhlIDMyIGJpdCAgICB8Ci0gfCAgIHJlc3VsdCB0byBMX3ZhcjMgd2l0aCBzYXR1cmF0aW9uLiBSb3VuZCB0aGUgTFMgMTYgYml0cyBvZiB0aGUgcmVzdWx0ICAgIHwKLSB8ICAgaW50byB0aGUgTVMgMTYgYml0cyB3aXRoIHNhdHVyYXRpb24gYW5kIHNoaWZ0IHRoZSByZXN1bHQgcmlnaHQgYnkgMTYuICAgfAotIHwgICBSZXR1cm4gYSAxNiBiaXQgcmVzdWx0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgIG1hY19yKExfdmFyMyx2YXIxLHZhcjIpID0gcm91bmQoTF9tYWMoTF92YXIzLHZhcjEsdmFyMikpICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBMX3ZhcjMgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXIzIDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHgwMDAwIDgwMDAgPD0gTF92YXJfb3V0IDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgfAotIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ci0qLwotI2lmICghTUFDX1JfSVNfSU5MSU5FKQotV29yZDE2IG1hY19yIChXb3JkMzIgTF92YXIzLCBXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpCi17Ci0gICAgV29yZDE2IHZhcl9vdXQ7Ci0KLSAgICBMX3ZhcjMgPSBMX21hYyAoTF92YXIzLCB2YXIxLCB2YXIyKTsKLSAgICBMX3ZhcjMgPSBMX2FkZCAoTF92YXIzLCAoV29yZDMyKSAweDAwMDA4MDAwTCk7Ci0gICAgdmFyX291dCA9IGV4dHJhY3RfaCAoTF92YXIzKTsKLQotICAgIHJldHVybiAodmFyX291dCk7Ci19Ci0jZW5kaWYKLQotLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBGdW5jdGlvbiBOYW1lIDogbXN1X3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIE11bHRpcGx5IHZhcjEgYnkgdmFyMiBhbmQgc2hpZnQgdGhlIHJlc3VsdCBsZWZ0IGJ5IDEuIFN1YnRyYWN0IHRoZSAzMiAgIHwKLSB8ICAgYml0IHJlc3VsdCB0byBMX3ZhcjMgd2l0aCBzYXR1cmF0aW9uLiBSb3VuZCB0aGUgTFMgMTYgYml0cyBvZiB0aGUgcmVzLSAgfAotIHwgICB1bHQgaW50byB0aGUgTVMgMTYgYml0cyB3aXRoIHNhdHVyYXRpb24gYW5kIHNoaWZ0IHRoZSByZXN1bHQgcmlnaHQgYnkgICB8Ci0gfCAgIDE2LiBSZXR1cm4gYSAxNiBiaXQgcmVzdWx0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgbXN1X3IoTF92YXIzLHZhcjEsdmFyMikgPSByb3VuZChMX21zdShMX3ZhcjMsdmFyMSx2YXIyKSkgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIExfdmFyMyAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3ZhcjMgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDAwMDAgODAwMCA8PSBMX3Zhcl9vdXQgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICB8Ci0gfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKLSovCi0jaWYgKCFNU1VfUl9JU19JTkxJTkUpCi1Xb3JkMTYgbXN1X3IgKFdvcmQzMiBMX3ZhcjMsIFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikKLXsKLSAgICBXb3JkMTYgdmFyX291dDsKLQotICAgIExfdmFyMyA9IExfbXN1IChMX3ZhcjMsIHZhcjEsIHZhcjIpOwotICAgIExfdmFyMyA9IExfYWRkIChMX3ZhcjMsIChXb3JkMzIpIDB4MDAwMDgwMDBMKTsKLSAgICB2YXJfb3V0ID0gZXh0cmFjdF9oIChMX3ZhcjMpOwotCi0gICAgcmV0dXJuICh2YXJfb3V0KTsKLX0KLSNlbmRpZgotCi0vKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIEZ1bmN0aW9uIE5hbWUgOiBMX2RlcG9zaXRfaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgRGVwb3NpdCB0aGUgMTYgYml0IHZhcjEgaW50byB0aGUgMTYgTVMgYml0cyBvZiB0aGUgMzIgYml0IG91dHB1dC4gVGhlICAgfAotIHwgICAxNiBMUyBiaXRzIG9mIHRoZSBvdXRwdXQgYXJlIHplcm9lZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBMX3Zhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSB2YXJfb3V0IDw9IDB4N2ZmZiAwMDAwLiAgICAgICAgICAgICAgICB8Ci0gfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKLSovCi0vL1dvcmQzMiBMX2RlcG9zaXRfaCAoV29yZDE2IHZhcjEpCi0vL3sKLS8vICAgIFdvcmQzMiBMX3Zhcl9vdXQ7Ci0vLwotLy8gICAgTF92YXJfb3V0ID0gKFdvcmQzMikgdmFyMSA8PCAxNjsKLS8vCi0vLyAgICByZXR1cm4gKExfdmFyX291dCk7Ci0vL30KLQotCi0vKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIEZ1bmN0aW9uIE5hbWUgOiBMX2RlcG9zaXRfbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgRGVwb3NpdCB0aGUgMTYgYml0IHZhcjEgaW50byB0aGUgMTYgTFMgYml0cyBvZiB0aGUgMzIgYml0IG91dHB1dC4gVGhlICAgfAotIHwgICAxNiBNUyBiaXRzIG9mIHRoZSBvdXRwdXQgYXJlIHNpZ24gZXh0ZW5kZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBMX3Zhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweEZGRkYgODAwMCA8PSB2YXJfb3V0IDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICB8Ci0gfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKLSovCi0vL1dvcmQzMiBMX2RlcG9zaXRfbCAoV29yZDE2IHZhcjEpCi0vL3sKLS8vICAgIFdvcmQzMiBMX3Zhcl9vdXQ7Ci0vLwotLy8gICAgTF92YXJfb3V0ID0gKFdvcmQzMikgdmFyMTsKLS8vCi0vLyAgICByZXR1cm4gKExfdmFyX291dCk7Ci0vL30KLQotCi0vKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIEZ1bmN0aW9uIE5hbWUgOiBMX3Nocl9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgU2FtZSBhcyBMX3NocihMX3ZhcjEsdmFyMikgYnV0IHdpdGggcm91bmRpbmcuIFNhdHVyYXRlIHRoZSByZXN1bHQgaW4gICAgfAotIHwgICBjYXNlIG9mIHVuZGVyZmxvd3Mgb3Igb3ZlcmZsb3dzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAtIElmIHZhcjIgaXMgZ3JlYXRlciB0aGFuIHplcm8gOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgIGlmIChMX3N1YihMX3NobChMX3NocihMX3ZhcjEsdmFyMiksMSksTF9zaHIoTF92YXIxLHN1Yih2YXIyLDEpKSkpfAotIHwgICAgICAgICAgaXMgZXF1YWwgdG8gemVybyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgIHRoZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgTF9zaHJfcihMX3ZhcjEsdmFyMikgPSBMX3NocihMX3ZhcjEsdmFyMikgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgIExfc2hyX3IoTF92YXIxLHZhcjIpID0gTF9hZGQoTF9zaHIoTF92YXIxLHZhcjIpLDEpICAgIHwKLSB8ICAgIC0gSWYgdmFyMiBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gemVybyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICBMX3Nocl9yKExfdmFyMSx2YXIyKSA9IExfc2hyKExfdmFyMSx2YXIyKS4gICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgTF92YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gdmFyMSA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIExfdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IHZhcl9vdXQgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICAgIHwKLSB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAotKi8KLSNpZiAoIUxfU0hSX1JfSVNfSU5MSU5FKQotV29yZDMyIExfc2hyX3IgKFdvcmQzMiBMX3ZhcjEsIFdvcmQxNiB2YXIyKQotewotICAgIFdvcmQzMiBMX3Zhcl9vdXQ7Ci0KLSAgICBpZiAodmFyMiA+IDMxKQotICAgIHsKLSAgICAgICAgTF92YXJfb3V0ID0gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTF92YXJfb3V0ID0gTF9zaHIgKExfdmFyMSwgdmFyMik7Ci0KLSAgICAgICAgaWYgKHZhcjIgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKExfdmFyMSAmICgoV29yZDMyKSAxIDw8ICh2YXIyIC0gMSkpKSAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExfdmFyX291dCsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIChMX3Zhcl9vdXQpOwotfQotI2VuZGlmCi0KLS8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgRnVuY3Rpb24gTmFtZSA6IExfYWJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgQWJzb2x1dGUgdmFsdWUgb2YgTF92YXIxOyBTYXR1cmF0ZSBpbiBjYXNlIHdoZXJlIHRoZSBpbnB1dCBpcyAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0yMTQ3ODM2NDggIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBMX3ZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSB2YXIxIDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIExfdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4MDAwMCAwMDAwIDw9IHZhcl9vdXQgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICAgIHwKLSB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAotKi8KLS8vV29yZDMyIExfYWJzIChXb3JkMzIgTF92YXIxKQotLy97Ci0vLyAgICBXb3JkMzIgTF92YXJfb3V0OwotLy8KLS8vICAgIGlmIChMX3ZhcjEgPT0gTUlOXzMyKQotLy8gICAgewotLy8gICAgICAgIExfdmFyX291dCA9IE1BWF8zMjsKLS8vICAgIH0KLS8vICAgIGVsc2UKLS8vICAgIHsKLS8vICAgICAgICBpZiAoTF92YXIxIDwgMCkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICAgIExfdmFyX291dCA9IC1MX3ZhcjE7Ci0vLyAgICAgICAgfQotLy8gICAgICAgIGVsc2UKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICAgIExfdmFyX291dCA9IExfdmFyMTsKLS8vICAgICAgICB9Ci0vLyAgICB9Ci0vLwotLy8gICAgcmV0dXJuIChMX3Zhcl9vdXQpOwotLy99Ci0KLS8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgRnVuY3Rpb24gTmFtZSA6IG5vcm1fcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBQcm9kdWNlcyB0aGUgbnVtYmVyIG9mIGxlZnQgc2hpZnQgbmVlZGVkIHRvIG5vcm1hbGl6ZSB0aGUgMTYgYml0IHZhcmlhLSB8Ci0gfCAgIGJsZSB2YXIxIGZvciBwb3NpdGl2ZSB2YWx1ZXMgb24gdGhlIGludGVydmFsIHdpdGggbWluaW11bSBvZiAxNjM4NCBhbmQgIHwKLSB8ICAgbWF4aW11bSBvZiAzMjc2NywgYW5kIGZvciBuZWdhdGl2ZSB2YWx1ZXMgb24gdGhlIGludGVydmFsIHdpdGggbWluaW11bSAgfAotIHwgICBvZiAtMzI3NjggYW5kIG1heGltdW0gb2YgLTE2Mzg0OyBpbiBvcmRlciB0byBub3JtYWxpemUgdGhlIHJlc3VsdCwgdGhlICB8Ci0gfCAgIGZvbGxvd2luZyBvcGVyYXRpb24gbXVzdCBiZSBkb25lIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICBub3JtX3ZhcjEgPSBzaGwodmFyMSxub3JtX3ModmFyMSkpLiAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHgwMDAwIDAwMDAgPD0gdmFyX291dCA8PSAweDAwMDAgMDAwZi4gICAgICAgICAgICAgICAgfAotIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ci0qLwotCi0jaWYgKCFOT1JNX1NfSVNfSU5MSU5FKQotV29yZDE2IG5vcm1fcyAoV29yZDE2IHZhcjEpCi17Ci0gICAgV29yZDE2IHZhcl9vdXQ7Ci0KLSAgICBpZiAodmFyMSA9PSAwKQotICAgIHsKLSAgICAgICAgdmFyX291dCA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmICh2YXIxID09IC0xKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXJfb3V0ID0gMTU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodmFyMSA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyMSA9IChXb3JkMTYpfnZhcjE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKHZhcl9vdXQgPSAwOyB2YXIxIDwgMHg0MDAwOyB2YXJfb3V0KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyMSA8PD0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAodmFyX291dCk7Ci19Ci0jZW5kaWYKLQotLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBGdW5jdGlvbiBOYW1lIDogZGl2X3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFByb2R1Y2VzIGEgcmVzdWx0IHdoaWNoIGlzIHRoZSBmcmFjdGlvbmFsIGludGVnZXIgZGl2aXNpb24gb2YgdmFyMSAgYnkgIHwKLSB8ICAgdmFyMjsgdmFyMSBhbmQgdmFyMiBtdXN0IGJlIHBvc2l0aXZlIGFuZCB2YXIyIG11c3QgYmUgZ3JlYXRlciBvciBlcXVhbCAgfAotIHwgICB0byB2YXIxOyB0aGUgcmVzdWx0IGlzIHBvc2l0aXZlIChsZWFkaW5nIGJpdCBlcXVhbCB0byAwKSBhbmQgdHJ1bmNhdGVkICB8Ci0gfCAgIHRvIDE2IGJpdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgSWYgdmFyMSA9IHZhcjIgdGhlbiBkaXYodmFyMSx2YXIyKSA9IDMyNzY3LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4MDAwMCAwMDAwIDw9IHZhcjEgPD0gdmFyMiBhbmQgdmFyMiAhPSAwLiAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogdmFyMSA8PSB2YXIyIDw9IDB4MDAwMCA3ZmZmIGFuZCB2YXIyICE9IDAuICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDAwMDAgMDAwMCA8PSB2YXJfb3V0IDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICBJdCdzIGEgUTE1IHZhbHVlIChwb2ludCBiZXR3ZWVuIGIxNSBhbmQgYjE0KS4gICAgICAgICAgICAgICAgIHwKLSB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAotKi8KLQotI2lmICghRElWX1NfSVNfSU5MSU5FKQotV29yZDE2IGRpdl9zIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpCi17Ci0gICAgV29yZDE2IHZhcl9vdXQgPSAwOwotICAgIFdvcmQxNiBpdGVyYXRpb247Ci0gICAgV29yZDMyIExfbnVtOwotICAgIFdvcmQzMiBMX2Rlbm9tOwotCi0gICAgaWYgKHZhcjEgPT0gMCkKLSAgICB7Ci0gICAgICAgIHZhcl9vdXQgPSAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAodmFyMSA9PSB2YXIyKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXJfb3V0ID0gTUFYXzE2OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTF9udW0gPSBMX2RlcG9zaXRfbCAodmFyMSk7Ci0gICAgICAgICAgICBMX2Rlbm9tID0gTF9kZXBvc2l0X2wgKHZhcjIpOwotCi0gICAgICAgICAgICBmb3IgKGl0ZXJhdGlvbiA9IDA7IGl0ZXJhdGlvbiA8IDE1OyBpdGVyYXRpb24rKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXJfb3V0IDw8PSAxOwotICAgICAgICAgICAgICAgIExfbnVtIDw8PSAxOwotCi0gICAgICAgICAgICAgICAgaWYgKExfbnVtID49IExfZGVub20pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBMX251bSA9IExfc3ViKExfbnVtLCBMX2Rlbm9tKTsKLSAgICAgICAgICAgICAgICAgICAgdmFyX291dCA9IGFkZCAodmFyX291dCwgMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuICh2YXJfb3V0KTsKLX0KLSNlbmRpZgotCi0vKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIEZ1bmN0aW9uIE5hbWUgOiBub3JtX2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUHJvZHVjZXMgdGhlIG51bWJlciBvZiBsZWZ0IHNoaWZ0cyBuZWVkZWQgdG8gbm9ybWFsaXplIHRoZSAzMiBiaXQgdmFyaWEtfAotIHwgICBibGUgTF92YXIxIGZvciBwb3NpdGl2ZSB2YWx1ZXMgb24gdGhlIGludGVydmFsIHdpdGggbWluaW11bSBvZiAgICAgICAgICB8Ci0gfCAgIDEwNzM3NDE4MjQgYW5kIG1heGltdW0gb2YgMjE0NzQ4MzY0NywgYW5kIGZvciBuZWdhdGl2ZSB2YWx1ZXMgb24gdGhlIGluLXwKLSB8ICAgdGVydmFsIHdpdGggbWluaW11bSBvZiAtMjE0NzQ4MzY0OCBhbmQgbWF4aW11bSBvZiAtMTA3Mzc0MTgyNDsgaW4gb3JkZXIgfAotIHwgICB0byBub3JtYWxpemUgdGhlIHJlc3VsdCwgdGhlIGZvbGxvd2luZyBvcGVyYXRpb24gbXVzdCBiZSBkb25lIDogICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICBub3JtX0xfdmFyMSA9IExfc2hsKExfdmFyMSxub3JtX2woTF92YXIxKSkuICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBMX3ZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSB2YXIxIDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4MDAwMCAwMDAwIDw9IHZhcl9vdXQgPD0gMHgwMDAwIDAwMWYuICAgICAgICAgICAgICAgIHwKLSB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAotKi8KLQotI2lmICghTk9STV9MX0lTX0lOTElORSkKLVdvcmQxNiBub3JtX2wgKFdvcmQzMiBMX3ZhcjEpCi17Ci0gICAgV29yZDE2IHZhcl9vdXQ7Ci0KLSAgICBpZiAoTF92YXIxID09IDApCi0gICAgewotICAgICAgICB2YXJfb3V0ID0gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKExfdmFyMSA9PSAoV29yZDMyKSAweGZmZmZmZmZmTCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyX291dCA9IDMxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKExfdmFyMSA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTF92YXIxID0gfkxfdmFyMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAodmFyX291dCA9IDA7IExfdmFyMSA8IChXb3JkMzIpIDB4NDAwMDAwMDBMOyB2YXJfb3V0KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTF92YXIxIDw8PSAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuICh2YXJfb3V0KTsKLX0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL29wZXJfMzJiLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL29wZXJfMzJiLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZjAzMmIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC9vcGVyXzMyYi5jCisrKyAvZGV2L251bGwKQEAgLTEsMzYzICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJb3Blcl8zMmIuYwotCi0JQ29udGVudDoJICBUaGlzIGZpbGUgY29udGFpbnMgb3BlcmF0aW9ucyBpbiBkb3VibGUgcHJlY2lzaW9uLgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAidHlwZWRlZi5oIgotI2luY2x1ZGUgImJhc2ljX29wLmgiCi0jaW5jbHVkZSAib3Blcl8zMmIuaCIKLQotI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgRnVuY3Rpb24gTF9FeHRyYWN0KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogIEV4dHJhY3QgZnJvbSBhIDMyIGJpdCBpbnRlZ2VyIHR3byAxNiBiaXQgRFBGLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICBBcmd1bWVudHM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIExfMzIgICAgICA6IDMyIGJpdCBpbnRlZ2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgMHg4MDAwIDAwMDAgPD0gTF8zMiA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBoaSAgICAgICAgOiBiMTYgdG8gYjMxIG9mIExfMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGxvICAgICAgICA6IChMXzMyIC0gaGk8PDE2KT4+MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotdm9pZCBMX0V4dHJhY3QgKFdvcmQzMiBMXzMyLCBXb3JkMTYgKmhpLCBXb3JkMTYgKmxvKQotewotICAgICpoaSA9IGV4dHJhY3RfaCAoTF8zMik7Ci0gICAgKmxvID0gZXh0cmFjdF9sIChMX21zdSAoTF9zaHIgKExfMzIsIDEpLCAqaGksIDE2Mzg0KSk7Ci0gICAgcmV0dXJuOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogIEZ1bmN0aW9uIExfQ29tcCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICBDb21wb3NlIGZyb20gdHdvIDE2IGJpdCBEUEYgYSAzMiBiaXQgaW50ZWdlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgTF8zMiA9IGhpPDwxNiArIGxvPDwxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogIEFyZ3VtZW50czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaGkgICAgICAgIG1zYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBsbyAgICAgICAgbHNmICh3aXRoIHNpZ24pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgICoKLSAqICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF8zMiA8PSAweDdmZmYgZmZmMC4gICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLVdvcmQzMiBMX0NvbXAgKFdvcmQxNiBoaSwgV29yZDE2IGxvKQotewotICAgIFdvcmQzMiBMXzMyOwotCi0gICAgTF8zMiA9IExfZGVwb3NpdF9oIChoaSk7Ci0gICAgcmV0dXJuIChMX21hYyAoTF8zMiwgbG8sIDEpKTsgICAgICAgLyogPSBoaTw8MTYgKyBsbzw8MSAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZ1bmN0aW9uIE1weV8zMigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIE11bHRpcGx5IHR3byAzMiBiaXQgaW50ZWdlcnMgKERQRikuIFRoZSByZXN1bHQgaXMgZGl2aWRlZCBieSAyKiozMSAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBMXzMyID0gKGhpMSpoaTIpPDwxICsgKCAoaGkxKmxvMik+PjE1ICsgKGxvMSpoaTIpPj4xNSApPDwxICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgVGhpcyBvcGVyYXRpb24gY2FuIGFsc28gYmUgdmlld2VkIGFzIHRoZSBtdWx0aXBsaWNhdGlvbiBvZiB0d28gUTMxICAgICAgKgotICogICBudW1iZXIgYW5kIHRoZSByZXN1bHQgaXMgYWxzbyBpbiBRMzEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEFyZ3VtZW50czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgaGkxICAgICAgICAgaGkgcGFydCBvZiBmaXJzdCBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICBsbzEgICAgICAgICBsbyBwYXJ0IG9mIGZpcnN0IG51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogIGhpMiAgICAgICAgIGhpIHBhcnQgb2Ygc2Vjb25kIG51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgbG8yICAgICAgICAgbG8gcGFydCBvZiBzZWNvbmQgbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi1Xb3JkMzIgTXB5XzMyIChXb3JkMTYgaGkxLCBXb3JkMTYgbG8xLCBXb3JkMTYgaGkyLCBXb3JkMTYgbG8yKQotewotICAgIFdvcmQzMiBMXzMyOwotCi0gICAgTF8zMiA9IExfbXVsdCAoaGkxLCBoaTIpOwotICAgIExfMzIgPSBMX21hYyAoTF8zMiwgbXVsdCAoaGkxLCBsbzIpLCAxKTsKLSAgICBMXzMyID0gTF9tYWMgKExfMzIsIG11bHQgKGxvMSwgaGkyKSwgMSk7Ci0KLSAgICByZXR1cm4gKExfMzIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZ1bmN0aW9uIE1weV8zMl8xNigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIE11bHRpcGx5IGEgMTYgYml0IGludGVnZXIgYnkgYSAzMiBiaXQgKERQRikuIFRoZSByZXN1bHQgaXMgZGl2aWRlZCAgICAgICoKLSAqICAgYnkgMioqMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgTF8zMiA9IChoaTEqbG8yKTw8MSArICgobG8xKmxvMik+PjE1KTw8MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBBcmd1bWVudHM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogIGhpICAgICAgICAgIGhpIHBhcnQgb2YgMzIgYml0IG51bWJlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgbG8gICAgICAgICAgbG8gcGFydCBvZiAzMiBiaXQgbnVtYmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICBuICAgICAgICAgICAxNiBiaXQgbnVtYmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLVdvcmQzMiBNcHlfMzJfMTYgKFdvcmQxNiBoaSwgV29yZDE2IGxvLCBXb3JkMTYgbikKLXsKLSAgICBXb3JkMzIgTF8zMjsKLQotICAgIExfMzIgPSBMX211bHQgKGhpLCBuKTsKLSAgICBMXzMyID0gTF9tYWMgKExfMzIsIG11bHQgKGxvLCBuKSwgMSk7Ci0KLSAgICByZXR1cm4gKExfMzIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBGdW5jdGlvbiBOYW1lIDogRGl2XzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgRnJhY3Rpb25hbCBpbnRlZ2VyIGRpdmlzaW9uIG9mIHR3byAzMiBiaXQgbnVtYmVycy4gICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICBMX251bSAvIExfZGVub20uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgIExfbnVtIGFuZCBMX2Rlbm9tIG11c3QgYmUgcG9zaXRpdmUgYW5kIExfbnVtIDwgTF9kZW5vbS4gICAgICAgKgotICogICAgICAgICAgICAgTF9kZW5vbSA9IGRlbm9tX2hpPDwxNiArIGRlbm9tX2xvPDwxICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICBkZW5vbV9oaSBpcyBhIG5vcm1hbGl6ZSBudW1iZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgIExfbnVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICAqCi0gKiAgICAgICAgICAgICByYW5nZSA6IDB4MDAwMCAwMDAwIDwgTF9udW0gPCBMX2Rlbm9tICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgTF9kZW5vbSA9IGRlbm9tX2hpPDwxNiArIGRlbm9tX2xvPDwxICAgICAgKERQRikgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgIGRlbm9tX2hpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgMTYgYml0IHBvc2l0aXZlIG5vcm1hbGl6ZWQgaW50ZWdlciB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgICAqCi0gKiAgICAgICAgICAgICByYW5nZSA6IDB4NDAwMCA8IGhpIDwgMHg3ZmZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgIGRlbm9tX2xvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgMTYgYml0IHBvc2l0aXZlIGludGVnZXIgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICByYW5nZSA6IDAgPCBsbyA8IDB4N2ZmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgIExfZGl2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICAqCi0gKiAgICAgICAgICAgICByYW5nZSA6IDB4MDAwMCAwMDAwIDw9IExfZGl2IDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogIEFsZ29yaXRobTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAtIGZpbmQgPSAxL0xfZGVub20uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICBGaXJzdCBhcHByb3hpbWF0aW9uOiBhcHByb3ggPSAxIC8gZGVub21faGkgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgIDEvTF9kZW5vbSA9IGFwcHJveCAqICgyLjAgLSBMX2Rlbm9tICogYXBwcm94ICkgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogIC0gIHJlc3VsdCA9IExfbnVtICogKDEvTF9kZW5vbSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLVdvcmQzMiBEaXZfMzIgKFdvcmQzMiBMX251bSwgV29yZDMyIGRlbm9tKQotewotICAgIFdvcmQxNiBhcHByb3g7Ci0gICAgV29yZDMyIExfMzI7Ci0gICAgLyogRmlyc3QgYXBwcm94aW1hdGlvbjogMSAvIExfZGVub20gPSAxL2Rlbm9tX2hpICovCi0KLSAgICBhcHByb3ggPSBkaXZfcyAoKFdvcmQxNikgMHgzZmZmLCBkZW5vbSA+PiAxNik7Ci0KLSAgICAvKiAxL0xfZGVub20gPSBhcHByb3ggKiAoMi4wIC0gTF9kZW5vbSAqIGFwcHJveCkgKi8KLQotICAgIExfMzIgPSBMX21weV9scyAoZGVub20sIGFwcHJveCk7Ci0KLSAgICBMXzMyID0gTF9zdWIgKChXb3JkMzIpIDB4N2ZmZmZmZmZMLCBMXzMyKTsKLQotCUxfMzIgPSBMX21weV9scyAoTF8zMiwgYXBwcm94KTsKLSAgICAvKiBMX251bSAqICgxL0xfZGVub20pICovCi0KLQlMXzMyID0gTVVMSElHSChMXzMyLCBMX251bSk7Ci0gICAgTF8zMiA9IExfc2hsIChMXzMyLCAzKTsKLQotICAgIHJldHVybiAoTF8zMik7Ci19Ci0KLS8qIQotCi0gIFxicmllZiAgY2FsY3VsYXRlcyB0aGUgbG9nIGR1YWxpcyB0aW1lcyA0IG9mIGFyZ3VtZW50Ci0gICAgICAgICAgaUxvZzQoeCkgPSAoV29yZDMyKSg0ICogbG9nKHZhbHVlKS9sb2coMi4wKSkKLQotICBccmV0dXJuIGlsb2c0IHZhbHVlCi0KLSovCi1Xb3JkMTYgaUxvZzQoV29yZDMyIHZhbHVlKQotewotICBXb3JkMTYgaUxvZzQ7Ci0KLSAgaWYodmFsdWUgIT0gMCl7Ci0gICAgV29yZDMyIHRtcDsKLSAgICBXb3JkMTYgdG1wMTY7Ci0gICAgaUxvZzQgPSBub3JtX2wodmFsdWUpOwotICAgIHRtcCA9ICh2YWx1ZSA8PCBpTG9nNCk7Ci0gICAgdG1wMTYgPSByb3VuZDE2KHRtcCk7Ci0gICAgdG1wID0gTF9tdWx0KHRtcDE2LCB0bXAxNik7Ci0gICAgdG1wMTYgPSByb3VuZDE2KHRtcCk7Ci0gICAgdG1wID0gTF9tdWx0KHRtcDE2LCB0bXAxNik7Ci0gICAgdG1wMTYgPSByb3VuZDE2KHRtcCk7Ci0KLSAgICBpTG9nNCA9ICgtKGlMb2c0IDw8IDIpIC0gbm9ybV9zKHRtcDE2KSkgLSAxOwotICB9Ci0gIGVsc2UgewotICAgIGlMb2c0ID0gLTEyODsgLyogLShJTlRfQklUUyo0KTsgKi8KLSAgfQotCi0gIHJldHVybiBpTG9nNDsKLX0KLQotI2RlZmluZSBzdGVwKHNoaWZ0KSBcCi0gICAgaWYgKCgweDQwMDAwMDAwbCA+PiAoc2hpZnQpKSArIHJvb3QgPD0gdmFsdWUpICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgdmFsdWUgLT0gKDB4NDAwMDAwMDBsID4+IChzaGlmdCkpICsgcm9vdDsgICAgICAgXAotICAgICAgICByb290ID0gKHJvb3QgPj4gMSkgfCAoMHg0MDAwMDAwMGwgPj4gKHNoaWZ0KSk7ICBcCi0gICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHJvb3QgPSByb290ID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfQotCi1Xb3JkMzIgcnNxcnQoV29yZDMyIHZhbHVlLCAgICAgLyohPCBPcGVyYW5kIHRvIHNxdWFyZSByb290ICgwLjAgLi4uIDEpICovCi0gICAgICAgICAgICAgV29yZDMyIGFjY3VyYWN5KSAgLyohPCBOdW1iZXIgb2YgdmFsaWQgYml0cyB0aGF0IHdpbGwgYmUgY2FsY3VsYXRlZCAqLwotewotICAgIFdvcmQzMiByb290ID0gMDsKLQlXb3JkMzIgc2NhbGU7Ci0gICAgVU5VU0VEKGFjY3VyYWN5KTsKLQotCWlmKHZhbHVlIDwgMCkKLQkJcmV0dXJuIDA7Ci0KLQlzY2FsZSA9IG5vcm1fbCh2YWx1ZSk7Ci0JaWYoc2NhbGUgJiAxKSBzY2FsZS0tOwotCi0JdmFsdWUgPDw9IHNjYWxlOwotCi0Jc3RlcCggMCk7IHN0ZXAoIDIpOyBzdGVwKCA0KTsgc3RlcCggNik7Ci0gICAgc3RlcCggOCk7IHN0ZXAoMTApOyBzdGVwKDEyKTsgc3RlcCgxNCk7Ci0gICAgc3RlcCgxNik7IHN0ZXAoMTgpOyBzdGVwKDIwKTsgc3RlcCgyMik7Ci0gICAgc3RlcCgyNCk7IHN0ZXAoMjYpOyBzdGVwKDI4KTsgc3RlcCgzMCk7Ci0KLSAgICBzY2FsZSA+Pj0gMTsKLQlpZiAocm9vdCA8IHZhbHVlKQotICAgICAgICArK3Jvb3Q7Ci0KLQlyb290ID4+PSBzY2FsZTsKLSAgICByZXR1cm4gcm9vdCogNDYzMzQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBXb3JkMzIgcG93MlRhYmxlW1BPVzJfVEFCTEVfU0laRV0gPSB7Ci0weDdmZmZmZmZmLCAweDdmYTc2NWFkLCAweDdmNGYwOGFlLCAweDdlZjZlOGRhLAotMHg3ZTlmMDYwNiwgMHg3ZTQ3NjAwOSwgMHg3ZGVmZjZiNiwgMHg3ZDk4YzllNiwKLTB4N2Q0MWQ5NmUsIDB4N2NlYjI1MjMsIDB4N2M5NGFjZGUsIDB4N2MzZTcwNzMsCi0weDdiZTg2ZmI5LCAweDdiOTJhYTg4LCAweDdiM2QyMGI2LCAweDdhZTdkMjFhLAotMHg3YTkyYmU4YiwgMHg3YTNkZTVkZiwgMHg3OWU5NDdlZiwgMHg3OTk0ZTQ5MiwKLTB4Nzk0MGJiOWUsIDB4NzhlY2NjZWMsIDB4Nzg5OTE4NTQsIDB4Nzg0NTlkYWMsCi0weDc3ZjI1Y2NlLCAweDc3OWY1NTkxLCAweDc3NGM4N2NjLCAweDc2ZjlmMzU5LAotMHg3NmE3OTgwZiwgMHg3NjU1NzVjOCwgMHg3NjAzOGM1YiwgMHg3NWIxZGJhMiwKLTB4NzU2MDYzNzQsIDB4NzUwZjIzYWIsIDB4NzRiZTFjMjAsIDB4NzQ2ZDRjYWMsCi0weDc0MWNiNTI4LCAweDczY2M1NTZkLCAweDczN2MyZDU1LCAweDczMmMzY2JhLAotMHg3MmRjODM3NCwgMHg3MjhkMDE1ZCwgMHg3MjNkYjY1MCwgMHg3MWVlYTIyNiwKLTB4NzE5ZmM0YjksIDB4NzE1MTFkZTQsIDB4NzEwMmFkODAsIDB4NzBiNDczNjgsCi0weDcwNjY2Zjc2LCAweDcwMThhMTg1LCAweDZmY2IwOTZmLCAweDZmN2RhNzEwLAotMHg2ZjMwN2E0MSwgMHg2ZWUzODJkZSwgMHg2ZTk2YzBjMywgMHg2ZTRhMzNjOSwKLTB4NmRmZGRiY2MsIDB4NmRiMWI4YTgsIDB4NmQ2NWNhMzgsIDB4NmQxYTEwNTcsCi0weDZjY2U4YWUxLCAweDZjODMzOWIyLCAweDZjMzgxY2E2LCAweDZiZWQzMzk4LAotMHg2YmEyN2U2NiwgMHg2YjU3ZmNlOSwgMHg2YjBkYWVmZiwgMHg2YWMzOTQ4NSwKLTB4NmE3OWFkNTYsIDB4NmEyZmY5NGYsIDB4NjllNjc4NGQsIDB4Njk5ZDJhMmMsCi0weDY5NTQwZWM5LCAweDY5MGIyNjAxLCAweDY4YzI2ZmIxLCAweDY4NzllYmI2LAotMHg2ODMxOTllZCwgMHg2N2U5N2EzNCwgMHg2N2ExOGM2OCwgMHg2NzU5ZDA2NSwKLTB4NjcxMjQ2MGIsIDB4NjZjYWVkMzUsIDB4NjY4M2M1YzMsIDB4NjYzY2NmOTIsCi0weDY1ZjYwYTgwLCAweDY1YWY3NjZhLCAweDY1NjkxMzJmLCAweDY1MjJlMGFkLAotMHg2NGRjZGVjMywgMHg2NDk3MGQ0ZiwgMHg2NDUxNmMyZSwgMHg2NDBiZmI0MSwKLTB4NjNjNmJhNjQsIDB4NjM4MWE5NzgsIDB4NjMzY2M4NWIsIDB4NjJmODE2ZWIsCi0weDYyYjM5NTA5LCAweDYyNmY0MjkyLCAweDYyMmIxZjY2LCAweDYxZTcyYjY1LAotMHg2MWEzNjY2ZCwgMHg2MTVmZDA1ZiwgMHg2MTFjNjkxOSwgMHg2MGQ5MzA3YiwKLTB4NjA5NjI2NjUsIDB4NjA1MzRhYjcsIDB4NjAxMDlkNTEsIDB4NWZjZTFlMTIsCi0weDVmOGJjY2RiLCAweDVmNDlhOThjLCAweDVmMDdiNDA1LCAweDVlYzVlYzI2LAotMHg1ZTg0NTFkMCwgMHg1ZTQyZTRlMywgMHg1ZTAxYTU0MCwgMHg1ZGMwOTJjNywKLTB4NWQ3ZmFkNTksIDB4NWQzZWY0ZDcsIDB4NWNmZTY5MjMsIDB4NWNiZTBhMWMsCi0weDVjN2RkN2E0LCAweDVjM2RkMTljLCAweDViZmRmN2U1LCAweDViYmU0YTYxLAotMHg1YjdlYzhmMiwgMHg1YjNmNzM3NywgMHg1YjAwNDlkNCwgMHg1YWMxNGJlYSwKLTB4NWE4Mjc5OWEsIDB4NWE0M2QyYzYsIDB4NWEwNTU3NTEsIDB4NTljNzA3MWMsCi0weDU5ODhlMjA5LCAweDU5NGFlN2ZiLCAweDU5MGQxOGQzLCAweDU4Y2Y3NDc0LAotMHg1ODkxZmFjMSwgMHg1ODU0YWI5YiwgMHg1ODE3ODZlNiwgMHg1N2RhOGM4MywKLTB4NTc5ZGJjNTcsIDB4NTc2MTE2NDIsIDB4NTcyNDlhMjksIDB4NTZlODQ3ZWYsCi0weDU2YWMxZjc1LCAweDU2NzAyMGEwLCAweDU2MzQ0YjUyLCAweDU1Zjg5ZjcwLAotMHg1NWJkMWNkYiwgMHg1NTgxYzM3OCwgMHg1NTQ2OTMyOSwgMHg1NTBiOGJkNCwKLTB4NTRkMGFkNWIsIDB4NTQ5NWY3YTEsIDB4NTQ1YjZhOGIsIDB4NTQyMTA1ZmQsCi0weDUzZTZjOWRiLCAweDUzYWNiNjA3LCAweDUzNzJjYTY4LCAweDUzMzkwNmUwLAotMHg1MmZmNmI1NSwgMHg1MmM1ZjdhYSwgMHg1MjhjYWJjMywgMHg1MjUzODc4NiwKLTB4NTIxYThhZDcsIDB4NTFlMWI1OWEsIDB4NTFhOTA3YjQsIDB4NTE3MDgxMGIsCi0weDUxMzgyMTgyLCAweDUwZmZlOGZlLCAweDUwYzdkNzY1LCAweDUwOGZlYzljLAotMHg1MDU4Mjg4OCwgMHg1MDIwOGIwZSwgMHg0ZmU5MTQxMywgMHg0ZmIxYzM3YywKLTB4NGY3YTk5MzAsIDB4NGY0Mzk1MTQsIDB4NGYwY2I3MGMsIDB4NGVkNWZmMDAsCi0weDRlOWY2Y2Q0LCAweDRlNjkwMDZlLCAweDRlMzJiOWI0LCAweDRkZmM5ODhjLAotMHg0ZGM2OWNkZCwgMHg0ZDkwYzY4YiwgMHg0ZDViMTU3ZSwgMHg0ZDI1ODk5YywKLTB4NGNmMDIyY2EsIDB4NGNiYWUwZWYsIDB4NGM4NWMzZjEsIDB4NGM1MGNiYjgsCi0weDRjMWJmODI5LCAweDRiZTc0OTJiLCAweDRiYjJiZWE1LCAweDRiN2U1ODdkLAotMHg0YjRhMTY5YywgMHg0YjE1ZjhlNiwgMHg0YWUxZmY0MywgMHg0YWFlMjk5YiwKLTB4NGE3YTc3ZDUsIDB4NGE0NmU5ZDYsIDB4NGExMzdmODgsIDB4NDllMDM4ZDAsCi0weDQ5YWQxNTk4LCAweDQ5N2ExNWM0LCAweDQ5NDczOTNmLCAweDQ5MTQ3ZmVlLAotMHg0OGUxZTliYSwgMHg0OGFmNzY4YSwgMHg0ODdkMjY0NiwgMHg0ODRhZjhkNiwKLTB4NDgxOGVlMjIsIDB4NDdlNzA2MTEsIDB4NDdiNTQwOGMsIDB4NDc4MzlkN2IsCi0weDQ3NTIxY2M2LCAweDQ3MjBiZTU1LCAweDQ2ZWY4MjEwLCAweDQ2YmU2N2UwLAotMHg0NjhkNmZhZSwgMHg0NjVjOTk2MSwgMHg0NjJiZTRlMiwgMHg0NWZiNTIxYSwKLTB4NDVjYWUwZjIsIDB4NDU5YTkxNTIsIDB4NDU2YTYzMjMsIDB4NDUzYTU2NGQsCi0weDQ1MGE2YWJiLCAweDQ0ZGFhMDU0LCAweDQ0YWFmNzAyLCAweDQ0N2I2ZWFkLAotMHg0NDRjMDc0MCwgMHg0NDFjYzBhMywgMHg0M2VkOWFjMCwgMHg0M2JlOTU4MCwKLTB4NDM4ZmIwY2IsIDB4NDM2MGVjOGQsIDB4NDMzMjQ4YWUsIDB4NDMwM2M1MTcsCi0weDQyZDU2MWI0LCAweDQyYTcxZTZjLCAweDQyNzhmYjJiLCAweDQyNGFmN2RhLAotMHg0MjFkMTQ2MiwgMHg0MWVmNTBhZSwgMHg0MWMxYWNhOCwgMHg0MTk0MjgzOSwKLTB4NDE2NmMzNGMsIDB4NDEzOTdkY2MsIDB4NDEwYzU3YTIsIDB4NDBkZjUwYjgsCi0weDQwYjI2OGZhLCAweDQwODVhMDUxLCAweDQwNThmNmE4LCAweDQwMmM2YmU5Ci19OwotCi0vKiEKLQotICBcYnJpZWYgY2FsY3VsYXRlcyAyIF4gKHgveSkgZm9yIHg8PTAsIHkgPiAwLCB4IDw9IDMyNzY4ICogeQotCi0gIGF2b2lkcyBpbnRlZ2VyIGRpdmlzaW9uCi0KLSAgXHJldHVybgotKi8KLVdvcmQzMiBwb3cyX3h5KFdvcmQzMiB4LCBXb3JkMzIgeSkKLXsKLSAgVVdvcmQzMiBpUGFydDsKLSAgVVdvcmQzMiBmUGFydDsKLSAgV29yZDMyIHJlczsKLSAgV29yZDMyIHRtcDsKLQotICB0bXAgPSAteDsKLSAgaVBhcnQgPSB0bXAgLyB5OwotICBmUGFydCA9IHRtcCAtIGlQYXJ0Knk7Ci0gIGlQYXJ0ID0gbWluKGlQYXJ0LElOVF9CSVRTLTEpOwotCi0gIHJlcyA9IHBvdzJUYWJsZVsoUE9XMl9UQUJMRV9TSVpFKmZQYXJ0KS95XSA+PiBpUGFydDsKLQotICByZXR1cm4ocmVzKTsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3Avb3Blcl8zMmIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3Avb3Blcl8zMmIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU1ODQ0Zi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL29wZXJfMzJiLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCW9wZXJfMzJiLmgKLQotCUNvbnRlbnQ6CURvdWJsZSBwcmVjaXNpb24gb3BlcmF0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fT1BFUl8zMmJfSAotI2RlZmluZSBfX09QRVJfMzJiX0gKLQotI2luY2x1ZGUgInR5cGVkZWYuaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jZGVmaW5lIFBPVzJfVEFCTEVfQklUUyA4Ci0jZGVmaW5lIFBPVzJfVEFCTEVfU0laRSAoMTw8UE9XMl9UQUJMRV9CSVRTKQotCi12b2lkIExfRXh0cmFjdCAoV29yZDMyIExfMzIsIFdvcmQxNiAqaGksIFdvcmQxNiAqbG8pOwotV29yZDMyIExfQ29tcCAoV29yZDE2IGhpLCBXb3JkMTYgbG8pOwotV29yZDMyIE1weV8zMiAoV29yZDE2IGhpMSwgV29yZDE2IGxvMSwgV29yZDE2IGhpMiwgV29yZDE2IGxvMik7Ci1Xb3JkMzIgTXB5XzMyXzE2IChXb3JkMTYgaGksIFdvcmQxNiBsbywgV29yZDE2IG4pOwotV29yZDMyIERpdl8zMiAoV29yZDMyIExfbnVtLCBXb3JkMzIgZGVub20pOwotV29yZDE2IGlMb2c0KFdvcmQzMiB2YWx1ZSk7Ci1Xb3JkMzIgcnNxcnQoV29yZDMyIHZhbHVlLCAgV29yZDMyIGFjY3VyYWN5KTsKLVdvcmQzMiBwb3cyX3h5KFdvcmQzMiB4LCBXb3JkMzIgeSk7Ci0KLV9faW5saW5lIFdvcmQzMiBMX21weV9scyhXb3JkMzIgTF92YXIyLCBXb3JkMTYgdmFyMSkKLXsKLSAgICB1bnNpZ25lZCBzaG9ydCBzd0xvdzE7Ci0gICAgV29yZDE2IHN3SGlnaDE7Ci0gICAgV29yZDMyIGxfdmFyX291dDsKLQotICAgIHN3TG93MSA9ICh1bnNpZ25lZCBzaG9ydCkoTF92YXIyKTsKLSAgICBzd0hpZ2gxID0gKFdvcmQxNikoTF92YXIyID4+IDE2KTsKLQotICAgIGxfdmFyX291dCA9IChsb25nKXN3TG93MSAqIChsb25nKXZhcjEgPj4gMTU7Ci0KLSAgICBsX3Zhcl9vdXQgKz0gc3dIaWdoMSAqIHZhcjEgPDwgMTsKLQotICAgIHJldHVybihsX3Zhcl9vdXQpOwotfQotCi1fX2lubGluZSBXb3JkMzIgTF9tcHlfd3goV29yZDMyIExfdmFyMiwgV29yZDE2IHZhcjEpCi17Ci0jaWYgQVJNVjVURV9MX01QWV9MUwotCVdvcmQzMiByZXN1bHQ7Ci0JYXNtIHZvbGF0aWxlKAotCQkiU01VTFdCICAlW3Jlc3VsdF0sICVbTF92YXIyXSwgJVt2YXIxXSBcbiIKLQkJOltyZXN1bHRdIj1yIihyZXN1bHQpCi0JCTpbTF92YXIyXSJyIihMX3ZhcjIpLCBbdmFyMV0iciIodmFyMSkKLQkJKTsKLQlyZXR1cm4gcmVzdWx0OwotI2Vsc2UKLSAgICB1bnNpZ25lZCBzaG9ydCBzd0xvdzE7Ci0gICAgV29yZDE2IHN3SGlnaDE7Ci0gICAgV29yZDMyIGxfdmFyX291dDsKLQotICAgIHN3TG93MSA9ICh1bnNpZ25lZCBzaG9ydCkoTF92YXIyKTsKLSAgICBzd0hpZ2gxID0gKFdvcmQxNikoTF92YXIyID4+IDE2KTsKLQotICAgIGxfdmFyX291dCA9IChsb25nKXN3TG93MSAqIChsb25nKXZhcjEgPj4gMTY7Ci0gICAgbF92YXJfb3V0ICs9IHN3SGlnaDEgKiB2YXIxOwotCi0gICAgcmV0dXJuKGxfdmFyX291dCk7Ci0jZW5kaWYKLX0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL3R5cGVkZWYuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3AvdHlwZWRlZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWY4MjI1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3AvdHlwZWRlZi5oCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQl0eXBlZGVmLmgKLQotCUNvbnRlbnQ6CXR5cGUgZGVmaW5lZCBmb3IgZGVmZmVyZW50IHBhbHRmb3JtCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgdHlwZWRlZl9oCi0jZGVmaW5lIHR5cGVkZWZfaCAiJElkICQiCi0KLSN1bmRlZiBPUklHSU5BTF9UWVBFREVGX0ggLyogZGVmaW5lIHRvIGdldCAib3JpZ2luYWwiIEVUU0kgdmVyc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0eXBlZGVmLmggICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0jaWZkZWYgT1JJR0lOQUxfVFlQRURFRl9ICi0vKgotICogdGhpcyBpcyB0aGUgb3JpZ2luYWwgY29kZSBmcm9tIHRoZSBFVFNJIGZpbGUgdHlwZWRlZi5oCi0gKi8KLQotI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKSB8fCBkZWZpbmVkKF9fV0FUQ09NQ19fKSB8fCBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fWlRDX18pCi10eXBlZGVmIHNpZ25lZCBjaGFyIFdvcmQ4OwotdHlwZWRlZiBzaG9ydCBXb3JkMTY7Ci10eXBlZGVmIGxvbmcgV29yZDMyOwotdHlwZWRlZiBpbnQgRmxhZzsKLQotI2VsaWYgZGVmaW5lZChfX3N1bikKLXR5cGVkZWYgc2lnbmVkIGNoYXIgV29yZDg7Ci10eXBlZGVmIHNob3J0IFdvcmQxNjsKLXR5cGVkZWYgbG9uZyBXb3JkMzI7Ci10eXBlZGVmIGludCBGbGFnOwotCi0jZWxpZiBkZWZpbmVkKF9fdW5peF9fKSB8fCBkZWZpbmVkKF9fdW5peCkKLXR5cGVkZWYgc2lnbmVkIGNoYXIgV29yZDg7Ci10eXBlZGVmIHNob3J0IFdvcmQxNjsKLXR5cGVkZWYgaW50IFdvcmQzMjsKLXR5cGVkZWYgaW50IEZsYWc7Ci0KLSNlbmRpZgotI2Vsc2UgLyogbm90IG9yaWdpbmFsIHR5cGVkZWYuaCAqLwotCi0vKgotICogdXNlIChpbXByb3ZlZCkgdHlwZSBkZWZpbml0aW9uIGZpbGUgdHlwZGVmcy5oIGFuZCBhZGQgYSAiRmxhZyIgdHlwZQotICovCi0jaW5jbHVkZSAidHlwZWRlZnMuaCIKLXR5cGVkZWYgaW50IEZsYWc7Ci0KLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3AvdHlwZWRlZnMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3AvdHlwZWRlZnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBkMzUwZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL3R5cGVkZWZzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQl0eXBlZGVmcy5oCi0KLQlDb250ZW50Ogl0eXBlIGRlZmluZWQgb3IgY29uc3QgZGVmaW5lZAotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIHR5cGVkZWZzX2gKLSNkZWZpbmUgdHlwZWRlZnNfaCAiJElkICQiCi0KLSNpZm5kZWYgQ0hBUl9CSVQKLSNkZWZpbmUgQ0hBUl9CSVQgICAgICA4ICAgICAgICAgLyogbnVtYmVyIG9mIGJpdHMgaW4gYSBjaGFyICovCi0jZW5kaWYKLQotI2lmbmRlZiBWT0FBQ19TSFJUX01BWAotI2RlZmluZSBWT0FBQ19TSFJUX01BWCAgICAoMzI3NjcpICAgICAgICAvKiBtYXhpbXVtIChzaWduZWQpIHNob3J0IHZhbHVlICovCi0jZW5kaWYKLQotI2lmbmRlZiBWT0FBQ19TSFJUX01JTgotI2RlZmluZSBWT0FBQ19TSFJUX01JTiAgICAoLTMyNzY4KSAgICAgICAgLyogbWluaW11bSAoc2lnbmVkKSBzaG9ydCB2YWx1ZSAqLwotI2VuZGlmCi0KLS8qIERlZmluZSBOVUxMIHBvaW50ZXIgdmFsdWUgKi8KLSNpZm5kZWYgTlVMTAotI2lmZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lIE5VTEwgICAgMAotI2Vsc2UKLSNkZWZpbmUgTlVMTCAgICAoKHZvaWQgKikwKQotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBhc3NlcnQKLSNkZWZpbmUgYXNzZXJ0KF9FeHByZXNzaW9uKSAgICAgKCh2b2lkKTApCi0jZW5kaWYKLQotI2RlZmluZSBfX2lubGluZSBzdGF0aWMgX19pbmxpbmUKLQotI2RlZmluZSBJTlRfQklUUyAgIDMyCi0vKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogICAgICAgICAgICAgICAgICAgICAgICAgREVGSU5JVElPTiBPRiBDT05TVEFOVFMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotLyoKLSAqKioqKioqKiogZGVmaW5lIGNoYXIgdHlwZQotICovCi10eXBlZGVmIGNoYXIgQ2hhcjsKLQotLyoKLSAqKioqKioqKiogZGVmaW5lIDggYml0IHNpZ25lZC91bnNpZ25lZCB0eXBlcyAmIGNvbnN0YW50cwotICovCi10eXBlZGVmIHNpZ25lZCBjaGFyIFdvcmQ4OwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIFVXb3JkODsKLS8qCi0gKioqKioqKioqIGRlZmluZSAxNiBiaXQgc2lnbmVkL3Vuc2lnbmVkIHR5cGVzICYgY29uc3RhbnRzCi0gKi8KLXR5cGVkZWYgc2hvcnQgV29yZDE2OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBVV29yZDE2OwotCi0vKgotICoqKioqKioqKiBkZWZpbmUgMzIgYml0IHNpZ25lZC91bnNpZ25lZCB0eXBlcyAmIGNvbnN0YW50cwotICovCi10eXBlZGVmIGludCBXb3JkMzI7Ci10eXBlZGVmIHVuc2lnbmVkIGludCBVV29yZDMyOwotCi0KLQotI2lmbmRlZiBfTVNDX1ZFUgotdHlwZWRlZiBsb25nIGxvbmcgV29yZDY0OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgVVdvcmQ2NDsKLSNlbHNlCi10eXBlZGVmIF9faW50NjQgV29yZDY0OwotdHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IFVXb3JkNjQ7Ci0jZW5kaWYKLQotI2lmbmRlZiBtaW4KLSNkZWZpbmUgbWluKGEsYikgKCAoYSkgPCAoYikgPyAoYSkgOiAoYikpCi0jZW5kaWYKLQotI2lmbmRlZiBtYXgKLSNkZWZpbmUgbWF4KGEsYikgKCAoYSkgPiAoYikgPyAoYSkgOiAoYikpCi0jZW5kaWYKLQotI2lmZGVmIEFSTV9JTkFTTQotI2lmZGVmIEFSTVY1X0lOQVNNCi0jZGVmaW5lIEFSTVY1RV9JTkFTTQkxCi0jZW5kaWYKLSNkZWZpbmUgQVJNVjRfSU5BU00JCTEKLSNlbmRpZgotCi0jaWYgQVJNVjRfSU5BU00KLQkjZGVmaW5lIEFSTVY1VEVfU0FUICAgICAgICAgICAxCi0gICAgI2RlZmluZSBBUk1WNVRFX0FERCAgICAgICAgICAgMQotICAgICNkZWZpbmUgQVJNVjVURV9TVUIgICAgICAgICAgIDEKLQkjZGVmaW5lIEFSTVY1VEVfU0hMICAgICAgICAgICAxCi0gICAgI2RlZmluZSBBUk1WNVRFX1NIUiAgICAgICAgICAgMQotCSNkZWZpbmUgQVJNVjVURV9MX1NITCAgICAgICAgIDEKLSAgICAjZGVmaW5lIEFSTVY1VEVfTF9TSFIgICAgICAgICAxCi0jZW5kaWYvL0FSTVY0Ci0jaWYgQVJNVjVFX0lOQVNNCi0gICAgI2RlZmluZSBBUk1WNVRFX0xfQUREICAgICAgICAgMQotICAgICNkZWZpbmUgQVJNVjVURV9MX1NVQiAgICAgICAgIDEKLSAgICAjZGVmaW5lIEFSTVY1VEVfTF9NVUxUICAgICAgICAxCi0gICAgI2RlZmluZSBBUk1WNVRFX0xfTUFDICAgICAgICAgMQotICAgICNkZWZpbmUgQVJNVjVURV9MX01TVSAgICAgICAgIDEKLQotCi0gICAgI2RlZmluZSBBUk1WNVRFX0RJVl9TICAgICAgICAgMQotICAgICNkZWZpbmUgQVJNVjVURV9ST1VORCAgICAgICAgIDEKLSAgICAjZGVmaW5lIEFSTVY1VEVfTVVMVCAgICAgICAgICAxCi0KLSAgICAjZGVmaW5lIEFSTVY1VEVfTk9STV9TICAgICAgICAxCi0gICAgI2RlZmluZSBBUk1WNVRFX05PUk1fTCAgICAgICAgMQotCSNkZWZpbmUgQVJNVjVURV9MX01QWV9MUwkgIDEKLSNlbmRpZgotI2lmIEFSTVY2X0lOQVNNCi0gICAgI3VuZGVmICBBUk1WNVRFX0FERAotICAgICNkZWZpbmUgQVJNVjVURV9BREQgICAgICAgICAgIDAKLSAgICAjdW5kZWYgIEFSTVY1VEVfU1VCCi0gICAgI2RlZmluZSBBUk1WNVRFX1NVQiAgICAgICAgICAgMAotICAgICNkZWZpbmUgQVJNVjZfU0FUICAgICAgICAgICAgIDEKLSNlbmRpZgotCi0vL2Jhc2ljIG9wZXJhdGlvbiBmdW5jdGlvbnMgb3B0aW1pemF0aW9uIGZsYWdzCi0jZGVmaW5lIFNBVFJVQVRFX0lTX0lOTElORSAgICAgICAgICAgICAgMSAgIC8vZGVmaW5lIHNhdHVyYXRlIGFzIGlubGluZSBmdW5jdGlvbgotI2RlZmluZSBTSExfSVNfSU5MSU5FICAgICAgICAgICAgICAgICAgIDEgIC8vZGVmaW5lIHNobCBhcyBpbmxpbmUgZnVuY3Rpb24KLSNkZWZpbmUgU0hSX0lTX0lOTElORSAgICAgICAgICAgICAgICAgICAxICAgLy9kZWZpbmUgc2hyIGFzIGlubGluZSBmdW5jdGlvbgotI2RlZmluZSBMX01VTFRfSVNfSU5MSU5FICAgICAgICAgICAgICAgIDEgICAvL2RlZmluZSBMX211bHQgYXMgaW5saW5lIGZ1bmN0aW9uCi0jZGVmaW5lIExfTVNVX0lTX0lOTElORSAgICAgICAgICAgICAgICAgMSAgIC8vZGVmaW5lIExfbXN1IGFzIGlubGluZSBmdW5jdGlvbgotI2RlZmluZSBMX1NVQl9JU19JTkxJTkUgICAgICAgICAgICAgICAgIDEgICAvL2RlZmluZSBMX3N1YiBhcyBpbmxpbmUgZnVuY3Rpb24KLSNkZWZpbmUgTF9TSExfSVNfSU5MSU5FICAgICAgICAgICAgICAgICAxICAgLy9kZWZpbmUgTF9zaGwgYXMgaW5saW5lIGZ1bmN0aW9uCi0jZGVmaW5lIExfU0hSX0lTX0lOTElORSAgICAgICAgICAgICAgICAgMSAgIC8vZGVmaW5lIExfc2hyIGFzIGlubGluZSBmdW5jdGlvbgotI2RlZmluZSBBRERfSVNfSU5MSU5FICAgICAgICAgICAgICAgICAgIDEgICAvL2RlZmluZSBhZGQgYXMgaW5saW5lIGZ1bmN0aW9uIC8vYWRkLCBpbmxpbmUgaXMgdGhlIGJlc3QKLSNkZWZpbmUgU1VCX0lTX0lOTElORSAgICAgICAgICAgICAgICAgICAxICAgLy9kZWZpbmUgc3ViIGFzIGlubGluZSBmdW5jdGlvbiAvL3N1YiwgaW5saW5lIGlzIHRoZSBiZXN0Ci0jZGVmaW5lIERJVl9TX0lTX0lOTElORSAgICAgICAgICAgICAgICAgMSAgIC8vZGVmaW5lIGRpdl9zIGFzIGlubGluZSBmdW5jdGlvbgotI2RlZmluZSBNVUxUX0lTX0lOTElORSAgICAgICAgICAgICAgICAgIDEgICAvL2RlZmluZSBtdWx0IGFzIGlubGluZSBmdW5jdGlvbgotI2RlZmluZSBOT1JNX1NfSVNfSU5MSU5FICAgICAgICAgICAgICAgIDEgICAvL2RlZmluZSBub3JtX3MgYXMgaW5saW5lIGZ1bmN0aW9uCi0jZGVmaW5lIE5PUk1fTF9JU19JTkxJTkUgICAgICAgICAgICAgICAgMSAgIC8vZGVmaW5lIG5vcm1fbCBhcyBpbmxpbmUgZnVuY3Rpb24KLSNkZWZpbmUgUk9VTkRfSVNfSU5MSU5FICAgICAgICAgICAgICAgICAxICAgLy9kZWZpbmUgcm91bmQgYXMgaW5saW5lIGZ1bmN0aW9uCi0jZGVmaW5lIExfTUFDX0lTX0lOTElORSAgICAgICAgICAgICAgICAgMSAgIC8vZGVmaW5lIExfbWFjIGFzIGlubGluZSBmdW5jdGlvbgotI2RlZmluZSBMX0FERF9JU19JTkxJTkUgICAgICAgICAgICAgICAgIDEgICAvL2RlZmluZSBMX2FkZCBhcyBpbmxpbmUgZnVuY3Rpb24KLSNkZWZpbmUgRVhUUkFDVF9IX0lTX0lOTElORSAgICAgICAgICAgICAxICAgLy9kZWZpbmUgZXh0cmFjdF9oIGFzIGlubGluZSBmdW5jdGlvbgotI2RlZmluZSBFWFRSQUNUX0xfSVNfSU5MSU5FICAgICAgICAgICAgIDEgICAvL2RlZmluZSBleHRyYWN0X2wgYXMgaW5saW5lIGZ1bmN0aW9uICAgICAgICAvLz8/PwotI2RlZmluZSBNVUxUX1JfSVNfSU5MSU5FICAgICAgICAgICAgICAgIDEgICAvL2RlZmluZSBtdWx0X3IgYXMgaW5saW5lIGZ1bmN0aW9uCi0jZGVmaW5lIFNIUl9SX0lTX0lOTElORSAgICAgICAgICAgICAgICAgMSAgIC8vZGVmaW5lIHNocl9yIGFzIGlubGluZSBmdW5jdGlvbgotI2RlZmluZSBNQUNfUl9JU19JTkxJTkUgICAgICAgICAgICAgICAgIDEgICAvL2RlZmluZSBtYWNfciBhcyBpbmxpbmUgZnVuY3Rpb24KLSNkZWZpbmUgTVNVX1JfSVNfSU5MSU5FICAgICAgICAgICAgICAgICAxICAgLy9kZWZpbmUgbXN1X3IgYXMgaW5saW5lIGZ1bmN0aW9uCi0jZGVmaW5lIExfU0hSX1JfSVNfSU5MSU5FICAgICAgICAgICAgICAgMSAgIC8vZGVmaW5lIExfc2hyX3IgYXMgaW5saW5lIGZ1bmN0aW9uCi0KLSNkZWZpbmUgUFJFRklYCQkJCXZvQUFDRW5jCi0jZGVmaW5lIExJTkswKHgsIHksIHopCQlMSU5LMSh4LHkseikKLSNkZWZpbmUgTElOSzEoeCx5LHopCQl4IyN5IyN6Ci0jZGVmaW5lIEFERF9QUkVGSVgoZnVuYykJTElOSzAoUFJFRklYLCBfLCBmdW5jKQotCi0jZGVmaW5lICBMX0V4dHJhY3QJCUFERF9QUkVGSVgoTF9FeHRyYWN0KQotI2RlZmluZSAgTF9Db21wCQkJQUREX1BSRUZJWChMX0NvbXApCi0jZGVmaW5lICBNcHlfMzIJCQlBRERfUFJFRklYKE1weV8zMikKLSNkZWZpbmUgIE1weV8zMl8xNgkJQUREX1BSRUZJWChNcHlfMzJfMTYpCi0jZGVmaW5lICBEaXZfMzIJCQlBRERfUFJFRklYKERpdl8zMikKLSNkZWZpbmUgIGlMb2c0CQkJQUREX1BSRUZJWChpTG9nNCkKLSNkZWZpbmUgIHJzcXJ0CQkJQUREX1BSRUZJWChyc3FydCkKLSNkZWZpbmUgIHBvdzJfeHkJCUFERF9QUkVGSVgocG93Ml94eSkKLSNkZWZpbmUgIExfbXB5X2xzCQlBRERfUFJFRklYKExfbXB5X2xzKQotI2RlZmluZSAgTF9tcHlfd3gJCUFERF9QUkVGSVgoTF9tcHlfd3gpCi0KLSNkZWZpbmUgbWVtX21hbGxvYwkJQUREX1BSRUZJWChtZW1fbWFsbG9jKQotI2RlZmluZSBtZW1fZnJlZQkJQUREX1BSRUZJWChtZW1fZnJlZSkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2RvYy92b0FBQ0VuY29kZXJTREsucGRmIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9kb2Mvdm9BQUNFbmNvZGVyU0RLLnBkZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc0ZDBmNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2RvYy92b0FBQ0VuY29kZXJTREsucGRmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9leHBvcnRzLmxkcyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvZXhwb3J0cy5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI0ZjNmYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvZXhwb3J0cy5sZHMKQEAgLTAsMCArMSw1IEBACit7CisgICAgZ2xvYmFsOgorICAgICAgICBfWjIyY3JlYXRlU29mdE9NWENvbXBvbmVudFBLY1BLMTZPTVhfQ0FMTEJBQ0tUWVBFUHZQUDE3T01YX0NPTVBPTkVOVFRZUEU7CisgICAgbG9jYWw6ICo7Cit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYWFjX3JvbS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYWFjX3JvbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjZmNjU2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2FhY19yb20uaAorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCWFhY19yb20uaAotCi0JQ29udGVudDoJY29uc3RhbnQgdGFibGVzCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgUk9NX0gKLSNkZWZpbmUgUk9NX0gKLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgInBzeV9jb25zdC5oIgotI2luY2x1ZGUgInRuc19wYXJhbS5oIgotCi0vKgotICBtZGN0Ci0qLwotZXh0ZXJuIGNvbnN0IGludCBTaG9ydFdpbmRvd1NpbmVbRlJBTUVfTEVOX1NIT1JULzJdOwotZXh0ZXJuIGNvbnN0IGludCBMb25nV2luZG93S0JEW0ZSQU1FX0xFTl9MT05HLzJdOwotCi1leHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBiaXRyZXZUYWJbMTcgKyAxMjldOwotZXh0ZXJuIGNvbnN0IGludCBjb3NzaW50YWJbMTI4ICsgMTAyNF07Ci0KLSNpZiBkZWZpbmVkIChBUk1WNUUpICYmICFkZWZpbmVkIChBUk1WN05lb24pCi1leHRlcm4gY29uc3QgaW50IHR3aWRUYWI2NFsoNCo2ICsgMTYqNikvMl07Ci1leHRlcm4gY29uc3QgaW50IHR3aWRUYWI1MTJbKDgqNiArIDMyKjYgKyAxMjgqNikvMl07Ci0jZWxzZQotZXh0ZXJuIGNvbnN0IGludCB0d2lkVGFiNjRbNCo2ICsgMTYqNl07Ci1leHRlcm4gY29uc3QgaW50IHR3aWRUYWI1MTJbOCo2ICsgMzIqNiArIDEyOCo2XTsKLSNlbmRpZgotCi0vKgotICBmb3JtIGZhY3RvcgotKi8KLWV4dGVybiBjb25zdCBXb3JkMzIgZm9ybWZhY19zcXJ0dGFibGVbOTZdOwotCi0vKgotICBxdWFudGl6ZXIKLSovCi1leHRlcm4gY29uc3QgV29yZDMyIG1UYWJfM180WzUxMl07Ci1leHRlcm4gY29uc3QgV29yZDMyIG1UYWJfNF8zWzUxMl07Ci0vKiEgJDJeey1cZnJhY3tufXsxNn19JCB0YWJsZSAqLwotZXh0ZXJuIGNvbnN0IFdvcmQxNiBwb3cydG9taW51c05vdmVyMTZbMTddIDsKLQotZXh0ZXJuIGNvbnN0IFdvcmQzMiBzcGVjRXhwTWFudFRhYmxlQ29tYl9lbmNbNF1bMTRdOwotZXh0ZXJuIGNvbnN0IFVXb3JkOCBzcGVjRXhwVGFibGVDb21iX2VuY1s0XVsxNF07Ci0KLWV4dGVybiBjb25zdCBXb3JkMTYgcXVhbnRCb3JkZXJzWzRdWzRdOwotLy9leHRlcm4gY29uc3QgV29yZDE2IHF1YW50UmVjb25bM11bNF07Ci1leHRlcm4gY29uc3QgV29yZDE2IHF1YW50UmVjb25bNF1bM107Ci0KLS8qCi0gIGh1ZmZtYW4KLSovCi1leHRlcm4gY29uc3QgVVdvcmQxNiBodWZmX2x0YWIxXzJbM11bM11bM11bM107Ci1leHRlcm4gY29uc3QgVVdvcmQxNiBodWZmX2x0YWIzXzRbM11bM11bM11bM107Ci1leHRlcm4gY29uc3QgVVdvcmQxNiBodWZmX2x0YWI1XzZbOV1bOV07Ci1leHRlcm4gY29uc3QgVVdvcmQxNiBodWZmX2x0YWI3XzhbOF1bOF07Ci1leHRlcm4gY29uc3QgVVdvcmQxNiBodWZmX2x0YWI5XzEwWzEzXVsxM107Ci1leHRlcm4gY29uc3QgVVdvcmQxNiBodWZmX2x0YWIxMVsxN11bMTddOwotZXh0ZXJuIGNvbnN0IFVXb3JkMTYgaHVmZl9sdGFic2NmWzEyMV07Ci1leHRlcm4gY29uc3QgVVdvcmQxNiBodWZmX2N0YWIxWzNdWzNdWzNdWzNdOwotZXh0ZXJuIGNvbnN0IFVXb3JkMTYgaHVmZl9jdGFiMlszXVszXVszXVszXTsKLWV4dGVybiBjb25zdCBVV29yZDE2IGh1ZmZfY3RhYjNbM11bM11bM11bM107Ci1leHRlcm4gY29uc3QgVVdvcmQxNiBodWZmX2N0YWI0WzNdWzNdWzNdWzNdOwotZXh0ZXJuIGNvbnN0IFVXb3JkMTYgaHVmZl9jdGFiNVs5XVs5XTsKLWV4dGVybiBjb25zdCBVV29yZDE2IGh1ZmZfY3RhYjZbOV1bOV07Ci1leHRlcm4gY29uc3QgVVdvcmQxNiBodWZmX2N0YWI3WzhdWzhdOwotZXh0ZXJuIGNvbnN0IFVXb3JkMTYgaHVmZl9jdGFiOFs4XVs4XTsKLWV4dGVybiBjb25zdCBVV29yZDE2IGh1ZmZfY3RhYjlbMTNdWzEzXTsKLWV4dGVybiBjb25zdCBVV29yZDE2IGh1ZmZfY3RhYjEwWzEzXVsxM107Ci1leHRlcm4gY29uc3QgVVdvcmQxNiBodWZmX2N0YWIxMVsxN11bMTddOwotZXh0ZXJuIGNvbnN0IFVXb3JkMzIgaHVmZl9jdGFic2NmWzEyMV07Ci0KLQotCi0vKgotICBtaXNjCi0qLwotZXh0ZXJuIGNvbnN0IGludCBzYW1wUmF0ZVRhYltOVU1fU0FNUExFX1JBVEVTXTsKLWV4dGVybiBjb25zdCBpbnQgQmFuZHdpdGhDb2VmVGFiWzhdW05VTV9TQU1QTEVfUkFURVNdOwotZXh0ZXJuIGNvbnN0IGludCByYXRlc1s4XTsKLWV4dGVybiBjb25zdCBVV29yZDggc2ZCYW5kVG90YWxTaG9ydFtOVU1fU0FNUExFX1JBVEVTXTsKLWV4dGVybiBjb25zdCBVV29yZDggc2ZCYW5kVG90YWxMb25nW05VTV9TQU1QTEVfUkFURVNdOwotZXh0ZXJuIGNvbnN0IGludCBzZkJhbmRUYWJTaG9ydE9mZnNldFtOVU1fU0FNUExFX1JBVEVTXTsKLWV4dGVybiBjb25zdCBzaG9ydCBzZkJhbmRUYWJTaG9ydFs3Nl07Ci1leHRlcm4gY29uc3QgaW50IHNmQmFuZFRhYkxvbmdPZmZzZXRbTlVNX1NBTVBMRV9SQVRFU107Ci1leHRlcm4gY29uc3Qgc2hvcnQgc2ZCYW5kVGFiTG9uZ1szMjVdOwotCi1leHRlcm4gY29uc3QgV29yZDMyIG1fbG9nMl90YWJsZVtJTlRfQklUU107Ci0KLS8qCi0gIFROUwotKi8KLWV4dGVybiBjb25zdCBXb3JkMzIgdG5zQ29lZmYzWzhdOwotZXh0ZXJuIGNvbnN0IFdvcmQzMiB0bnNDb2VmZjNCb3JkZXJzWzhdOwotZXh0ZXJuIGNvbnN0IFdvcmQzMiB0bnNDb2VmZjRbMTZdOwotZXh0ZXJuIGNvbnN0IFdvcmQzMiB0bnNDb2VmZjRCb3JkZXJzWzE2XTsKLWV4dGVybiBjb25zdCBXb3JkMzIgaW52U0JGWzI0XTsKLWV4dGVybiBjb25zdCBXb3JkMTYgc2lkZUluZm9UYWJMb25nW01BWF9TRkJfTE9ORyArIDFdOwotZXh0ZXJuIGNvbnN0IFdvcmQxNiBzaWRlSW5mb1RhYlNob3J0W01BWF9TRkJfU0hPUlQgKyAxXTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYWFjZW5jX2NvcmUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2FhY2VuY19jb3JlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiNzViNmQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYWFjZW5jX2NvcmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCWFhY2VuY19jb3JlLmgKLQotCUNvbnRlbnQ6CWFhYyBlbmNvZGVyIGludGVyZmFjZSBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfYWFjZW5jX2NvcmVfaF8KLSNkZWZpbmUgX2FhY2VuY19jb3JlX2hfCi0KLQotI2luY2x1ZGUgInR5cGVkZWYuaCIKLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJiaXRlbmMuaCIKLQotI2luY2x1ZGUgInBzeV9jb25maWd1cmF0aW9uLmgiCi0jaW5jbHVkZSAicHN5X21haW4uaCIKLSNpbmNsdWRlICJxY19tYWluLmgiCi0jaW5jbHVkZSAicHN5X21haW4uaCIKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZGVmaW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXR5cGVkZWYgIHN0cnVjdCB7Ci0gIFdvcmQzMiAgIHNhbXBsZVJhdGU7ICAgICAgICAgICAgLyogYXVkaW8gZmlsZSBzYW1wbGUgcmF0ZSAqLwotICBXb3JkMzIgICBiaXRSYXRlOyAgICAgICAgICAgICAgIC8qIGVuY29kZXIgYml0IHJhdGUgaW4gYml0cy9zZWMgKi8KLSAgV29yZDE2ICAgbkNoYW5uZWxzSW47ICAgICAgICAgICAvKiBudW1iZXIgb2YgY2hhbm5lbHMgb24gaW5wdXQgKDEsMikgKi8KLSAgV29yZDE2ICAgbkNoYW5uZWxzT3V0OyAgICAgICAgICAvKiBudW1iZXIgb2YgY2hhbm5lbHMgb24gb3V0cHV0ICgxLDIpICovCi0gIFdvcmQxNiAgIGJhbmRXaWR0aDsgICAgICAgICAgICAgLyogdGFyZ2V0ZWQgYXVkaW8gYmFuZHdpZHRoIGluIEh6ICovCi0gIFdvcmQxNiAgIGFkdHNVc2VkOwkJCSAgLyogd2hldGhlciB3cml0ZSBhZHRzIGhlYWRlciAqLwotfSBBQUNFTkNfQ09ORklHOwotCi0KLXR5cGVkZWYgc3RydWN0IHsKLQotICBBQUNFTkNfQ09ORklHIGNvbmZpZzsgICAgIC8qIFdvcmQxNiBzaXplOiA4ICovCi0KLSAgRUxFTUVOVF9JTkZPIGVsSW5mbzsgICAgICAvKiBXb3JkMTYgc2l6ZTogNCAqLwotCi0gIFFDX1NUQVRFIHFjS2VybmVsOyAgICAgICAgLyogV29yZDE2IHNpemU6IDYgKyA1KFBBRERJTkcpICsgNyhFTEVNRU5UX0JJVFMpICsgNTQoQURKX1RIUl9TVEFURSkgPSA3MiAqLwotICBRQ19PVVQgICBxY091dDsgICAgICAgICAgIC8qIFdvcmQxNiBzaXplOiBNQVhfQ0hBTk5FTFMqOTIwKFFDX09VVF9DSEFOTkVMKSArIDUoUUNfT1VUX0VMRU1FTlQpICsgNyA9IDkzMiAvIDE4NTIgKi8KLQotICBQU1lfT1VUICAgIHBzeU91dDsgICAgICAgIC8qIFdvcmQxNiBzaXplOiBNQVhfQ0hBTk5FTFMqMTg2ICsgMiA9IDE4OCAvIDM3NCAqLwotICBQU1lfS0VSTkVMIHBzeUtlcm5lbDsgICAgIC8qIFdvcmQxNiBzaXplOiAgMjU4NyAvIDQ0OTEgKi8KLQotICBzdHJ1Y3QgQklUU1RSRUFNRU5DT0RFUl9JTklUIGJzZUluaXQ7IC8qIFdvcmQxNiBzaXplOiA2ICovCi0gIHN0cnVjdCBCSVRfQlVGICBiaXRTdHJlYW07ICAgICAgICAgICAgLyogV29yZDE2IHNpemU6IDggKi8KLSAgSEFORExFX0JJVF9CVUYgIGhCaXRTdHJlYW07Ci0gIGludAkJCSAgaW5pdE9LOwotCi0gIHNob3J0CQkJKmludGJ1ZjsKLSAgc2hvcnQJCQkqZW5jYnVmOwotICBzaG9ydAkJCSppbmJ1ZjsKLSAgaW50CQkJZW5jbGVuOwotICBpbnQJCQlpbmxlbjsKLSAgaW50CQkJaW50bGVuOwotICBpbnQJCQl1c2VsZW5ndGg7Ci0KLSAgdm9pZAkJCSpoQ2hlY2s7Ci0gIFZPX01FTV9PUEVSQVRPUiAqdm9NZW1vcDsKLSAgVk9fTUVNX09QRVJBVE9SIHZvTWVtb3ByYXRvcjsKLQotfUFBQ19FTkNPREVSOyAvKiBXb3JkMTYgc2l6ZTogMzgwOSAvIDY4NTEgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1mdW5jdGlvbm5hbWU6IEFhY0luaXREZWZhdWx0Q29uZmlnCi1kZXNjcmlwdGlvbjogIGdpdmVzIHJlYXNvbmFibGUgZGVmYXVsdCBjb25maWd1cmF0aW9uCi1yZXR1cm5zOiAgICAgIC0tLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBBYWNJbml0RGVmYXVsdENvbmZpZyhBQUNFTkNfQ09ORklHICpjb25maWcpOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1mdW5jdGlvbm5hbWU6QWFjRW5jT3BlbgotZGVzY3JpcHRpb246IGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IGVuY29kZXIgaW5zdGFuY2UKLXJldHVybnM6ICAgICBBQUNFTkNfT0sgaWYgc3VjY2VzcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1Xb3JkMTYgIEFhY0VuY09wZW4gKEFBQ19FTkNPREVSCQkJCSpoQWFjRW5jLCAgICAgICAvKiBwb2ludGVyIHRvIGFuIGVuY29kZXIgaGFuZGxlLCBpbml0aWFsaXplZCBvbiByZXR1cm4gKi8KLSAgICAgICAgICAgICAgICAgICAgY29uc3QgIEFBQ0VOQ19DT05GSUcgICAgIGNvbmZpZyk7ICAgICAgICAvKiBwcmUtaW5pdGlhbGl6ZWQgY29uZmlnIHN0cnVjdCAqLwotCi1Xb3JkMTYgQWFjRW5jRW5jb2RlKEFBQ19FTkNPREVSCQkgICAqaEFhY0VuYywKLSAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgICAgICp0aW1lU2lnbmFsLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBVV29yZDggICAgICAgKmFuY0J5dGVzLCAgICAgIC8qITwgcG9pbnRlciB0byBhbmNpbGxhcnkgZGF0YSBieXRlcyAqLwotICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgICAgKm51bUFuY0J5dGVzLCAgIC8qITwgbnVtYmVyIG9mIGFuY2lsbGFyeSBEYXRhIEJ5dGVzLCBzZW5kIGFzIGZpbGwgZWxlbWVudCAgKi8KLSAgICAgICAgICAgICAgICAgICAgVVdvcmQ4ICAgICAgICAgICAgICpvdXRCeXRlcywgICAgICAvKiE8IHBvaW50ZXIgdG8gb3V0cHV0IGJ1ZmZlciAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIFZPX1UzMiAgICAgICAgICAgICAqbnVtT3V0Qnl0ZXMgICAgLyohPCBudW1iZXIgb2YgYnl0ZXMgaW4gb3V0cHV0IGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgICAgICApOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1mdW5jdGlvbm5hbWU6QWFjRW5jQ2xvc2UKLWRlc2NyaXB0aW9uOiBkZWFsbG9jYXRlIGFuIGVuY29kZXIgaW5zdGFuY2UKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBBYWNFbmNDbG9zZSAoQUFDX0VOQ09ERVIqIGhBYWNFbmMsIFZPX01FTV9PUEVSQVRPUiAqcE1lbU9QKTsgLyogYW4gZW5jb2RlciBoYW5kbGUgKi8KLQotI2VuZGlmIC8qIF9hYWNlbmNfaF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2Fkal90aHIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2Fkal90aHIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY0YmI1ZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9hZGpfdGhyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCWFkal90aHIuaAotCi0JQ29udGVudDoJVGhyZXNob2xkIGNvbXBlbnNhdGlvbiBmdW5jdGlvbgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fQURKX1RIUl9ICi0jZGVmaW5lIF9fQURKX1RIUl9ICi0KLSNpbmNsdWRlICJhZGpfdGhyX2RhdGEuaCIKLSNpbmNsdWRlICJxY19kYXRhLmgiCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0KLVdvcmQxNiBiaXRzMnBlKGNvbnN0IFdvcmQxNiBiaXRzKTsKLQotV29yZDMyIEFkalRock5ldyhBREpfVEhSX1NUQVRFKiogcGhBZGpUaHIsCi0gICAgICAgICAgICAgICAgIFdvcmQzMiBuRWxlbWVudHMpOwotCi12b2lkIEFkalRockRlbGV0ZShBREpfVEhSX1NUQVRFICpoQWRqVGhyKTsKLQotdm9pZCBBZGpUaHJJbml0KEFESl9USFJfU1RBVEUgKmhBZGpUaHIsCi0gICAgICAgICAgICAgICAgY29uc3QgV29yZDMyIHBlTWVhbiwKLSAgICAgICAgICAgICAgICBXb3JkMzIgY2hCaXRyYXRlKTsKLQotdm9pZCBBZGp1c3RUaHJlc2hvbGRzKEFESl9USFJfU1RBVEUgKmFkalRoclN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgIEFUU19FTEVNRU5UKiBBZGpUaHJTdGF0ZUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQgKnBzeU91dEVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpjaEJpdERpc3RyaWJ1dGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbG9nU2ZiRW5lcmd5W01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKLSAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgc2ZiTlJlbGV2YW50TGluZXNbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAotICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9FTEVNRU5UKiBxY09FLAotCQkJCQkgIEVMRU1FTlRfQklUUyogZWxCaXRzLAotCQkJCQkgIGNvbnN0IFdvcmQxNiBuQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IG1heEJpdEZhYyk7Ci0KLXZvaWQgQWRqVGhyVXBkYXRlKEFUU19FTEVNRU5UICpBZGpUaHJTdGF0ZUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgZHluQml0c1VzZWQpOwotCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYWRqX3Rocl9kYXRhLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9hZGpfdGhyX2RhdGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAxMzJkOC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9hZGpfdGhyX2RhdGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJYWRqX3Rocl9kYXRhLmgKLQotCUNvbnRlbnQ6CVRocmVzaG9sZCBjb21wZW5zYXRpb24gcGFyYW1ldGVyCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19BREpfVEhSX0RBVEFfSAotI2RlZmluZSBfX0FESl9USFJfREFUQV9ICi0KLSNpbmNsdWRlICJ0eXBlZGVmLmgiCi0jaW5jbHVkZSAicHN5X2NvbnN0LmgiCi0jaW5jbHVkZSAibGluZV9wZS5oIgotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICBXb3JkMTYgY2xpcFNhdmVMb3csIGNsaXBTYXZlSGlnaDsKLSAgIFdvcmQxNiBtaW5CaXRTYXZlLCBtYXhCaXRTYXZlOwotICAgV29yZDE2IGNsaXBTcGVuZExvdywgY2xpcFNwZW5kSGlnaDsKLSAgIFdvcmQxNiBtaW5CaXRTcGVuZCwgbWF4Qml0U3BlbmQ7Ci19IEJSRVNfUEFSQU07Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgIFVXb3JkOCBtb2RpZnlNaW5TbnI7Ci0gICBXb3JkMTYgc3RhcnRTZmJMLCBzdGFydFNmYlM7Ci19IEFIX1BBUkFNOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIFdvcmQzMiBtYXhSZWQ7Ci0gIFdvcmQzMiBzdGFydFJhdGlvLCBtYXhSYXRpbzsKLSAgV29yZDMyIHJlZFJhdGlvRmFjOwotICBXb3JkMzIgcmVkT2ZmczsKLX0gTUlOU05SX0FEQVBUX1BBUkFNOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIC8qIHBhcmFtZXRlcnMgZm9yIGJpdHJlc2Vydm9pciBjb250cm9sICovCi0gIFdvcmQxNiBwZU1pbiwgcGVNYXg7Ci0gIC8qIGNvbnN0YW50IG9mZnNldCB0byBwZSAgICAgICAgICAgICAgICovCi0gIFdvcmQxNiAgcGVPZmZzZXQ7Ci0gIC8qIGF2b2lkIGhvbGUgcGFyYW1ldGVycyAgICAgICAgICAgICAgICovCi0gIEFIX1BBUkFNIGFoUGFyYW07Ci0gIC8qIHBhcmFtdGVycyBmb3IgYWRhcHRhdGlvbiBvZiBtaW5TbnIgKi8KLSAgTUlOU05SX0FEQVBUX1BBUkFNIG1pblNuckFkYXB0UGFyYW07Ci0gIC8qIHZhbHVlcyBmb3IgY29ycmVjdGlvbiBvZiBwZSAqLwotICBXb3JkMTYgcGVMYXN0OwotICBXb3JkMTYgZHluQml0c0xhc3Q7Ci0gIFdvcmQxNiBwZUNvcnJlY3Rpb25GYWN0b3I7Ci19IEFUU19FTEVNRU5UOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIEJSRVNfUEFSQU0gICBicmVzUGFyYW1Mb25nLCBicmVzUGFyYW1TaG9ydDsgLyogV29yZDE2IHNpemU6IDIqOCAqLwotICBBVFNfRUxFTUVOVCAgYWRqVGhyU3RhdGVFbGVtOyAgICAgICAgICAgICAgIC8qIFdvcmQxNiBzaXplOiAxOSAqLwotfSBBREpfVEhSX1NUQVRFOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2JhbmRfbnJnLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9iYW5kX25yZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTQ1M2MwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2JhbmRfbnJnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCWJhbmRfbnJnLmgKLQotCUNvbnRlbnQ6CUJhbmQvTGluZSBlbmVyZ3kgY2FsY3VsYXRpb25zIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX0JBTkRfTlJHX0gKLSNkZWZpbmUgX0JBTkRfTlJHX0gKLQotI2luY2x1ZGUgInR5cGVkZWYuaCIKLQotCi12b2lkIENhbGNCYW5kRW5lcmd5KGNvbnN0IFdvcmQzMiAqbWRjdFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgKmJhbmRPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgbnVtQmFuZHMsCi0gICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqYmFuZEVuZXJneSwKLSAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICpiYW5kRW5lcmd5U3VtKTsKLQotCi12b2lkIENhbGNCYW5kRW5lcmd5TVMoY29uc3QgV29yZDMyICptZGN0U3BlY3RydW1MZWZ0LAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQzMiAqbWRjdFNwZWN0cnVtUmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICpiYW5kT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgbnVtQmFuZHMsCi0gICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICpiYW5kRW5lcmd5TWlkLAotICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqYmFuZEVuZXJneU1pZFN1bSwKLSAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKmJhbmRFbmVyZ3lTaWRlLAotICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqYmFuZEVuZXJneVNpZGVTdW0pOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2JpdF9jbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2JpdF9jbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY2YTIxOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9iaXRfY250LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQliaXRfY250LmgKLQotCUNvbnRlbnQ6CUh1ZmZtYW4gQml0Y291bnRlciAmIGNvZGVyIHN0cnVjdHVyZSBhbmQgZnVuY3Rpb25zCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19CSVRDT1VOVF9ICi0jZGVmaW5lIF9fQklUQ09VTlRfSAotCi0jaW5jbHVkZSAiYml0YnVmZmVyLmgiCi0jaW5jbHVkZSAiYmFzaWNfb3AuaCIKLSNkZWZpbmUgSU5WQUxJRF9CSVRDT1VOVCAoTUFYXzE2LzQpCi0KLS8qCi0gIGNvZGUgYm9vayBudW1iZXIgdGFibGUKLSovCi0KLWVudW0gY29kZUJvb2tOb3sKLSAgQ09ERV9CT09LX1pFUk9fTk89ICAgICAgICAgICAgICAgMCwKLSAgQ09ERV9CT09LXzFfTk89ICAgICAgICAgICAgICAgICAgMSwKLSAgQ09ERV9CT09LXzJfTk89ICAgICAgICAgICAgICAgICAgMiwKLSAgQ09ERV9CT09LXzNfTk89ICAgICAgICAgICAgICAgICAgMywKLSAgQ09ERV9CT09LXzRfTk89ICAgICAgICAgICAgICAgICAgNCwKLSAgQ09ERV9CT09LXzVfTk89ICAgICAgICAgICAgICAgICAgNSwKLSAgQ09ERV9CT09LXzZfTk89ICAgICAgICAgICAgICAgICAgNiwKLSAgQ09ERV9CT09LXzdfTk89ICAgICAgICAgICAgICAgICAgNywKLSAgQ09ERV9CT09LXzhfTk89ICAgICAgICAgICAgICAgICAgOCwKLSAgQ09ERV9CT09LXzlfTk89ICAgICAgICAgICAgICAgICAgOSwKLSAgQ09ERV9CT09LXzEwX05PPSAgICAgICAgICAgICAgICAxMCwKLSAgQ09ERV9CT09LX0VTQ19OTz0gICAgICAgICAgICAgICAxMSwKLSAgQ09ERV9CT09LX1JFU19OTz0gICAgICAgICAgICAgICAxMiwKLSAgQ09ERV9CT09LX1BOU19OTz0gICAgICAgICAgICAgICAxMwotfTsKLQotLyoKLSAgY29kZSBib29rIGluZGV4IHRhYmxlCi0qLwotCi1lbnVtIGNvZGVCb29rTmR4ewotICBDT0RFX0JPT0tfWkVST19ORFg9MCwKLSAgQ09ERV9CT09LXzFfTkRYLAotICBDT0RFX0JPT0tfMl9ORFgsCi0gIENPREVfQk9PS18zX05EWCwKLSAgQ09ERV9CT09LXzRfTkRYLAotICBDT0RFX0JPT0tfNV9ORFgsCi0gIENPREVfQk9PS182X05EWCwKLSAgQ09ERV9CT09LXzdfTkRYLAotICBDT0RFX0JPT0tfOF9ORFgsCi0gIENPREVfQk9PS185X05EWCwKLSAgQ09ERV9CT09LXzEwX05EWCwKLSAgQ09ERV9CT09LX0VTQ19ORFgsCi0gIENPREVfQk9PS19SRVNfTkRYLAotICBDT0RFX0JPT0tfUE5TX05EWCwKLSAgTlVNQkVSX09GX0NPREVfQk9PS1MKLX07Ci0KLS8qCi0gIGNvZGUgYm9vayBsYXYgdGFibGUKLSovCi0KLWVudW0gY29kZUJvb2tMYXZ7Ci0gIENPREVfQk9PS19aRVJPX0xBVj0wLAotICBDT0RFX0JPT0tfMV9MQVY9MSwKLSAgQ09ERV9CT09LXzJfTEFWPTEsCi0gIENPREVfQk9PS18zX0xBVj0yLAotICBDT0RFX0JPT0tfNF9MQVY9MiwKLSAgQ09ERV9CT09LXzVfTEFWPTQsCi0gIENPREVfQk9PS182X0xBVj00LAotICBDT0RFX0JPT0tfN19MQVY9NywKLSAgQ09ERV9CT09LXzhfTEFWPTcsCi0gIENPREVfQk9PS185X0xBVj0xMiwKLSAgQ09ERV9CT09LXzEwX0xBVj0xMiwKLSAgQ09ERV9CT09LX0VTQ19MQVY9MTYsCi0gIENPREVfQk9PS19TQ0ZfTEFWPTYwLAotICBDT0RFX0JPT0tfUE5TX0xBVj02MAotfTsKLQotV29yZDE2IGJpdENvdW50KGNvbnN0IFdvcmQxNiAqYVF1YW50U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICBub09mU3BlY0xpbmVzLAotICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgbWF4VmFsLAotICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAqYml0Q291bnRMdXQpOwotCi1Xb3JkMTYgY29kZVZhbHVlcyhXb3JkMTYgKnZhbHVlcywgV29yZDE2IHdpZHRoLCBXb3JkMTYgY29kZUJvb2ssIEhBTkRMRV9CSVRfQlVGIGhCaXRzdHJlYW0pOwotCi1Xb3JkMTYgYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKFdvcmQxNiBkZWx0YSk7Ci1Xb3JkMTYgY29kZVNjYWxlZmFjdG9yRGVsdGEoV29yZDE2IHNjYWxlZmFjdG9yLCBIQU5ETEVfQklUX0JVRiBoQml0c3RyZWFtKTsKLQotCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYml0YnVmZmVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9iaXRidWZmZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M3OWYwNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9iaXRidWZmZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJYml0YnVmZmVyLmgKLQotCUNvbnRlbnQ6CUJpdCBCdWZmZXIgTWFuYWdlbWVudCBzdHJ1Y3R1cmUgYW5kIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIEJJVEJVRkZFUl9ICi0jZGVmaW5lIEJJVEJVRkZFUl9ICi0KLSNpbmNsdWRlICJ0eXBlZGVmLmgiCi0KLQotZW51bSBkaXJlY3Rpb24KLXsKLSAgZm9yd2FyZERpcmVjdGlvbiwKLSAgYmFja3dhcmREaXJlY3Rpb24KLX07Ci0KLQotLyohCi0gICBUaGUgcG9pbnRlciAncFJlYWROZXh0JyBwb2ludHMgdG8gdGhlIG5leHQgYXZhaWxhYmxlIHdvcmQsIHdoZXJlIGJpdHMgY2FuIGJlIHJlYWQgZnJvbS4gVGhlIHBvaW50ZXIKLSAgICdwV3JpdGVOZXh0JyBwb2ludHMgdG8gdGhlIG5leHQgYXZhaWxhYmxlIHdvcmQsIHdoZXJlIGJpdHMgY2FuIGJlIHdyaXR0ZW4gdG8uIFRoZSBwb2ludGVyIHBCaXRCdWZCYXNlCi0gICBwb2ludHMgdG8gdGhlIHN0YXJ0IG9mIHRoZSBiaXRzdHJlYW0gYnVmZmVyIGFuZCB0aGUgcG9pbnRlciBwQml0QnVmRW5kIHBvaW50cyB0byB0aGUgZW5kIG9mIHRoZSBiaXRzdHJlYW0KLSAgIGJ1ZmZlci4gVGhlIHR3byBwb2ludGVycyBhcmUgdXNlZCBhcyBsb3dlci1ib3VuZCByZXNwZWN0aXZlbHkgdXBwZXItYm91bmQgYWRkcmVzcyBmb3IgdGhlIG1vZHVsbyBhZGRyZXNzaW5nCi0gICBtb2RlLgotCi0gICBUaGUgZWxlbWVudCBjbnRCaXRzIGNvbnRhaW5zIHRoZSBjdXJyZW50bHkgYXZhaWxhYmxlIGJpdHMgaW4gdGhlIGJpdCBidWZmZXIuIEl0IHdpbGwgYmUgaW5jcmVtZW50ZWQgd2hlbgotICAgYml0cyBhcmUgd3JpdHRlbiB0byB0aGUgYml0c3RyZWFtIGJ1ZmZlciBhbmQgZGVjcmVtZW50ZWQgd2hlbiBiaXRzIGFyZSByZWFkIGZyb20gdGhlIGJpdHN0cmVhbSBidWZmZXIuCi0qLwotc3RydWN0IEJJVF9CVUYKLXsKLSAgVVdvcmQ4ICpwQml0QnVmQmFzZTsgICAgICAgICAgLyohPCBwb2ludGVyIHBvaW50cyB0byBmaXJzdCBwb3NpdGlvbiBpbiBiaXRzdHJlYW0gYnVmZmVyICovCi0gIFVXb3JkOCAqcEJpdEJ1ZkVuZDsgICAgICAgICAgIC8qITwgcG9pbnRlciBwb2ludHMgdG8gbGFzdCBwb3NpdGlvbiBpbiBiaXRzdHJlYW0gYnVmZmVyICovCi0KLSAgVVdvcmQ4ICpwV3JpdGVOZXh0OyAgICAgICAgICAgLyohPCBwb2ludGVyIHBvaW50cyB0byBuZXh0IGF2YWlsYWJsZSB3b3JkIGluIGJpdHN0cmVhbSBidWZmZXIgdG8gd3JpdGUgKi8KLQotICBVV29yZDMyIGNhY2hlOwotCi0gIFdvcmQxNiAgd0JpdFBvczsgICAgICAgICAgICAgIC8qITwgMzE8PXdCaXRQb3M8PTAqLwotICBXb3JkMTYgIGNudEJpdHM7ICAgICAgICAgICAgICAvKiE8IG51bWJlciBvZiBhdmFpbGFibGUgYml0cyBpbiB0aGUgYml0c3RyZWFtIGJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlIGJpdHMgdG8gYml0c3RyZWFtIGJ1ZmZlciAgPT4gaW5jcmVtZW50IGNudEJpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkIGJpdHMgZnJvbSBiaXRzdHJlYW0gYnVmZmVyID0+IGRlY3JlbWVudCBjbnRCaXRzICovCi0gIFdvcmQxNiAgc2l6ZTsgICAgICAgICAgICAgICAgIC8qITwgc2l6ZSBvZiBiaXRidWZmZXIgaW4gYml0cyAqLwotICBXb3JkMTYgIGlzVmFsaWQ7ICAgICAgICAgICAgICAvKiE8IGluZGljYXRlcyB3aGV0aGVyIHRoZSBpbnN0YW5jZSBoYXMgYmVlbiBpbml0aWFsaXplZCAqLwotfTsgLyogc2l6ZSBXb3JkMTY6IDggKi8KLQotLyohIERlZmluZSBwb2ludGVyIHRvIGJpdCBidWZmZXIgc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdCBCSVRfQlVGICpIQU5ETEVfQklUX0JVRjsKLQotCi1IQU5ETEVfQklUX0JVRiBDcmVhdGVCaXRCdWZmZXIoSEFORExFX0JJVF9CVUYgaEJpdEJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVV29yZDggKnBCaXRCdWZCYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgYml0QnVmU2l6ZSk7Ci0KLQotdm9pZCBEZWxldGVCaXRCdWZmZXIoSEFORExFX0JJVF9CVUYgKmhCaXRCdWYpOwotCi0KLVdvcmQxNiBHZXRCaXRzQXZhaWwoSEFORExFX0JJVF9CVUYgaEJpdEJ1Zik7Ci0KLQotV29yZDE2IFdyaXRlQml0cyhIQU5ETEVfQklUX0JVRiBoQml0QnVmLAotICAgICAgICAgICAgICAgICBVV29yZDMyIHdyaXRlVmFsdWUsCi0gICAgICAgICAgICAgICAgIFdvcmQxNiBub0JpdHNUb1dyaXRlKTsKLQotdm9pZCBSZXNldEJpdEJ1ZihIQU5ETEVfQklUX0JVRiBoQml0QnVmLAotICAgICAgICAgICAgICAgICBVV29yZDggKnBCaXRCdWZCYXNlLAotICAgICAgICAgICAgICAgICBXb3JkMTYgIGJpdEJ1ZlNpemUpOwotCi0jZGVmaW5lIEdldE5yQml0c0F2YWlsYWJsZShoQml0QnVmKSAoIChoQml0QnVmKS0+Y250Qml0cykKLSNkZWZpbmUgR2V0TnJCaXRzUmVhZChoQml0QnVmKSAgICAgICAoKGhCaXRCdWYpLT5zaXplLShoQml0QnVmKS0+Y250Qml0cykKLQotI2VuZGlmIC8qIEJJVEJVRkZFUl9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9iaXRlbmMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2JpdGVuYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTU4YWViLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2JpdGVuYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQliaXRlbmMuaAotCi0JQ29udGVudDoJQml0c3RyZWFtIGVuY29kZXIgc3RydWN0dXJlIGFuZCBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfQklURU5DX0gKLSNkZWZpbmUgX0JJVEVOQ19ICi0KLSNpbmNsdWRlICJxY19kYXRhLmgiCi0jaW5jbHVkZSAidG5zLmgiCi0jaW5jbHVkZSAiY2hhbm5lbF9tYXAuaCIKLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLQotc3RydWN0IEJJVFNUUkVBTUVOQ09ERVJfSU5JVAotewotICBXb3JkMTYgbkNoYW5uZWxzOwotICBXb3JkMzIgYml0cmF0ZTsKLSAgV29yZDMyIHNhbXBsZVJhdGU7Ci0gIFdvcmQxNiBwcm9maWxlOwotfTsKLQotCi0KLVdvcmQxNiBXcml0ZUJpdHN0cmVhbSAoSEFORExFX0JJVF9CVUYgaEJpdHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgRUxFTUVOVF9JTkZPIGVsSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUICpxY091dCwKLSAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVCAqcHN5T3V0LAotICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKmdsb2JVc2VkQml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVVdvcmQ4ICphbmNCeXRlcywKLQkJCQkJICAgV29yZDE2IHNhbXBsZXJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgKTsKLQotI2VuZGlmIC8qIF9CSVRFTkNfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYmxvY2tfc3dpdGNoLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9ibG9ja19zd2l0Y2guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRkM2U4Zi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9ibG9ja19zd2l0Y2guaAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJYmxvY2tfc3dpdGNoLmgKLQotCUNvbnRlbnQ6CUJsb2NrIHN3aXRjaGluZyBzdHJ1Y3R1cmUgYW5kIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9CTE9DS19TV0lUQ0hfSAotI2RlZmluZSBfQkxPQ0tfU1dJVENIX0gKLQotI2luY2x1ZGUgInR5cGVkZWYuaCIKLQotCi0vKioqKioqKioqKioqKioqKioqIERlZmluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBCTE9DS19TV0lUQ0hJTkdfSUlSX0xFTiAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlbmd0aCBvZiBIaWdoUGFzcy1GSVItRmlsdGVyIGZvciBBdHRhY2stRGV0ZWN0aW9uICovCi0jZGVmaW5lIEJMT0NLX1NXSVRDSF9XSU5ET1dTIFRSQU5TX0ZBQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHdpbmRvd3MgZm9yIGVuZXJneSBjYWxjdWxhdGlvbiAqLwotI2RlZmluZSBCTE9DS19TV0lUQ0hfV0lORE9XX0xFTiBGUkFNRV9MRU5fU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1pbmltYWwgZ3JhbnVsYXJpdHkgb2YgZW5lcmd5IGNhbGN1bGF0aW9uICovCi0KLQotCi0vKioqKioqKioqKioqKioqKioqIFN0cnVjdHVyZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdHlwZWRlZiBzdHJ1Y3R7Ci0gIFdvcmQzMiBpbnZBdHRhY2tSYXRpbzsKLSAgV29yZDE2IHdpbmRvd1NlcXVlbmNlOwotICBXb3JkMTYgbmV4dHdpbmRvd1NlcXVlbmNlOwotICBGbGFnIGF0dGFjazsKLSAgRmxhZyBsYXN0YXR0YWNrOwotICBXb3JkMTYgYXR0YWNrSW5kZXg7Ci0gIFdvcmQxNiBsYXN0QXR0YWNrSW5kZXg7Ci0gIFdvcmQxNiBub09mR3JvdXBzOwotICBXb3JkMTYgZ3JvdXBMZW5bVFJBTlNfRkFDXTsKLSAgV29yZDMyIHdpbmRvd05yZ1syXVtCTE9DS19TV0lUQ0hfV0lORE9XU107ICAgICAvKiB0aW1lIHNpZ25hbCBlbmVyZ3kgaW4gU3Vid2luZG93cyAobGFzdCBhbmQgY3VycmVudCkgKi8KLSAgV29yZDMyIHdpbmRvd05yZ0ZbMl1bQkxPQ0tfU1dJVENIX1dJTkRPV1NdOyAgICAvKiBmaWx0ZXJlZCB0aW1lIHNpZ25hbCBlbmVyZ3kgaW4gc2VnbWVudHMgKGxhc3QgYW5kIGN1cnJlbnQpICovCi0gIFdvcmQzMiBpaXJTdGF0ZXNbQkxPQ0tfU1dJVENISU5HX0lJUl9MRU5dOyAgICAgLyogZmlsdGVyIGRlbGF5LWxpbmUgKi8KLSAgV29yZDMyIG1heFdpbmRvd05yZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXggZW5lcmd5IGluIHN1YndpbmRvd3MgKi8KLSAgV29yZDMyIGFjY1dpbmRvd05yZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWN1cnNpdmVseSBhY2N1bXVsYXRlZCB3aW5kb3dOcmdGICovCi19QkxPQ0tfU1dJVENISU5HX0NPTlRST0w7Ci0KLQotCi0KLQotV29yZDE2IEluaXRCbG9ja1N3aXRjaGluZyhCTE9DS19TV0lUQ0hJTkdfQ09OVFJPTCAqYmxvY2tTd2l0Y2hpbmdDb250cm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMzIgYml0UmF0ZSwgY29uc3QgV29yZDE2IG5DaGFubmVscyk7Ci0KLVdvcmQxNiBCbG9ja1N3aXRjaGluZyhCTE9DS19TV0lUQ0hJTkdfQ09OVFJPTCAqYmxvY2tTd2l0Y2hpbmdDb250cm9sLAotICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqdGltZVNpZ25hbCwKLQkJCQkJICBXb3JkMzIgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGNoSW5jcmVtZW50KTsKLQotV29yZDE2IFN5bmNCbG9ja1N3aXRjaGluZyhCTE9DS19TV0lUQ0hJTkdfQ09OVFJPTCAqYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQkxPQ0tfU1dJVENISU5HX0NPTlRST0wgKmJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgbm9PZkNoYW5uZWxzKTsKLQotCi0KLSNlbmRpZiAgLyogI2lmbmRlZiBfQkxPQ0tfU1dJVENIX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2NoYW5uZWxfbWFwLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9jaGFubmVsX21hcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzYxZmViLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2NoYW5uZWxfbWFwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCWNoYW5uZWxfbWFwLmgKLQotCUNvbnRlbnQ6CWNoYW5uZWwgbWFwcGluZyBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfQ0hBTk5FTF9NQVBfSAotI2RlZmluZSBfQ0hBTk5FTF9NQVBfSAotCi0jaW5jbHVkZSAicHN5X2NvbnN0LmgiCi0jaW5jbHVkZSAicWNfZGF0YS5oIgotCi1Xb3JkMTYgSW5pdEVsZW1lbnRJbmZvIChXb3JkMTYgbkNoYW5uZWxzLCBFTEVNRU5UX0lORk8qIGVsSW5mbyk7Ci0KLVdvcmQxNiBJbml0RWxlbWVudEJpdHMoRUxFTUVOVF9CSVRTICplbGVtZW50Qml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgRUxFTUVOVF9JTkZPIGVsSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyIGJpdHJhdGVUb3QsCi0gICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBhdmVyYWdlQml0c1RvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHN0YXRpY0JpdHNUb3QpOwotCi0jZW5kaWYgLyogQ0hBTk5FTF9NQVBfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvY29uZmlnLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9jb25maWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBiNGMyNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9jb25maWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJY29uZmlnLmgKLQotCUNvbnRlbnQ6CWFhYyBlbmNvZGVyIHBhcmFtZXRlcgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9BQUNFTkNfQ09ORklHX0hfCi0jZGVmaW5lIF9BQUNFTkNfQ09ORklHX0hfCi0KLSNkZWZpbmUgTUFYX0NIQU5ORUxTICAgICAgICAyCi0KLSNkZWZpbmUgQUFDRU5DX0JMT0NLU0laRSAgICAxMDI0ICAgLyohIGVuY29kZXIgb25seSB0YWtlcyBCTE9DS1NJWkUgc2FtcGxlcyBhdCBhIHRpbWUgKi8KLSNkZWZpbmUgQUFDRU5DX1RSQU5TX0ZBQyAgICA4ICAgICAgLyohIGVuY29kZXIgc2hvcnQgbG9uZyByYXRpbyAqLwotCi0KLSNkZWZpbmUgTUFYQklUU19DT0VGCQk2MTQ0Ci0jZGVmaW5lIE1JTkJJVFNfQ09FRgkJNzQ0Ci0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9keW5fYml0cy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvZHluX2JpdHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNhOGE2Ny4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9keW5fYml0cy5oCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQlkeW5fYml0cy5oCi0KLQlDb250ZW50OglOb2lzZWxlc3MgY29kZXIgbW9kdWxlIHN0cnVjdHVyZSBhbmQgZnVuY3Rpb25zCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19EWU5fQklUU19ICi0jZGVmaW5lIF9fRFlOX0JJVFNfSAotCi0jaW5jbHVkZSAicHN5X2NvbnN0LmgiCi0jaW5jbHVkZSAidG5zLmgiCi0jaW5jbHVkZSAiYml0X2NudC5oIgotCi0KLQotI2RlZmluZSBNQVhfU0VDVElPTlMgICAgICAgICAgTUFYX0dST1VQRURfU0ZCCi0jZGVmaW5lIFNFQ1RfRVNDX1ZBTF9MT05HICAgIDMxCi0jZGVmaW5lIFNFQ1RfRVNDX1ZBTF9TSE9SVCAgICA3Ci0jZGVmaW5lIENPREVfQk9PS19CSVRTICAgICAgICA0Ci0jZGVmaW5lIFNFQ1RfQklUU19MT05HICAgICAgICA1Ci0jZGVmaW5lIFNFQ1RfQklUU19TSE9SVCAgICAgICAzCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIFdvcmQxNiBjb2RlQm9vazsKLSAgV29yZDE2IHNmYlN0YXJ0OwotICBXb3JkMTYgc2ZiQ250OwotICBXb3JkMTYgc2VjdGlvbkJpdHM7Ci19Ci1TRUNUSU9OX0lORk87Ci0KLQotCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIFdvcmQxNiBibG9ja1R5cGU7Ci0gIFdvcmQxNiBub09mR3JvdXBzOwotICBXb3JkMTYgc2ZiQ250OwotICBXb3JkMTYgbWF4U2ZiUGVyR3JvdXA7Ci0gIFdvcmQxNiBzZmJQZXJHcm91cDsKLSAgV29yZDE2IG5vT2ZTZWN0aW9uczsKLSAgU0VDVElPTl9JTkZPIHNlY3Rpb25JbmZvW01BWF9TRUNUSU9OU107Ci0gIFdvcmQxNiBzaWRlSW5mb0JpdHM7ICAgICAgICAgICAgIC8qIHNlY3Rpb25pbmcgYml0cyAgICAgICAqLwotICBXb3JkMTYgaHVmZm1hbkJpdHM7ICAgICAgICAgICAgICAvKiBodWZmbWFuICAgIGNvZGVkIGJpdHMgKi8KLSAgV29yZDE2IHNjYWxlZmFjQml0czsgICAgICAgICAgICAgLyogc2NhbGVmYWMgICBjb2RlZCBiaXRzICovCi0gIFdvcmQxNiBmaXJzdFNjZjsgICAgICAgICAgICAgICAgIC8qIGZpcnN0IHNjZiB0byBiZSBjb2RlZCAqLwotICBXb3JkMTYgYml0TG9va1VwW01BWF9TRkJfTE9ORyooQ09ERV9CT09LX0VTQ19ORFgrMSldOwotICBXb3JkMTYgbWVyZ2VHYWluTG9va1VwW01BWF9TRkJfTE9OR107Ci19Ci1TRUNUSU9OX0RBVEE7IC8qICBXb3JkMTYgc2l6ZTogMTAgKyA2MChNQVhfU0VDVElPTlMpKjQoU0VDVElPTl9JTkZPKSArIDUxKE1BWF9TRkJfTE9ORykqMTIoQ09ERV9CT09LX0VTQ19ORFgrMSkgKyA1MShNQVhfU0ZCX0xPTkcpID0gOTEzICovCi0KLQotV29yZDE2IEJDSW5pdCh2b2lkKTsKLQotV29yZDE2IGR5bkJpdENvdW50KGNvbnN0IFdvcmQxNiAqcXVhbnRTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBVV29yZDE2ICptYXhWYWx1ZUluU2ZiLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAqc2NhbGVmYWMsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IGJsb2NrVHlwZSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgc2ZiQ250LAotICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBtYXhTZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgc2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICpzZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgU0VDVElPTl9EQVRBICpzZWN0aW9uRGF0YSk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvZ3JwX2RhdGEuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2dycF9kYXRhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMWIyY2IuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvZ3JwX2RhdGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJZ3JwX2RhdGEuaAotCi0JQ29udGVudDoJU2hvcnQgYmxvY2sgZ3JvdXBpbmcgZnVuY3Rpb24KLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX0dSUF9EQVRBX0hfXwotI2RlZmluZSBfX0dSUF9EQVRBX0hfXwotI2luY2x1ZGUgInBzeV9kYXRhLmgiCi0jaW5jbHVkZSAidHlwZWRlZnMuaCIKLQotdm9pZAotZ3JvdXBTaG9ydERhdGEoV29yZDMyICAgICAgICAqbWRjdFNwZWN0cnVtLAotICAgICAgICAgICAgICAgV29yZDMyICAgICAgICAqdG1wU3BlY3RydW0sCi0gICAgICAgICAgICAgICBTRkJfVEhSRVNIT0xEICpzZmJUaHJlc2hvbGQsCi0gICAgICAgICAgICAgICBTRkJfRU5FUkdZICAgICpzZmJFbmVyZ3ksCi0gICAgICAgICAgICAgICBTRkJfRU5FUkdZICAgICpzZmJFbmVyZ3lNUywKLSAgICAgICAgICAgICAgIFNGQl9FTkVSR1kgICAgKnNmYlNwcmVhZGVkRW5lcmd5LAotICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgc2ZiQ250LAotICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAqc2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAqc2ZiTWluU25yLAotICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAqZ3JvdXBlZFNmYk9mZnNldCwKLSAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgKm1heFNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAqZ3JvdXBlZFNmYk1pblNuciwKLSAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgIG5vT2ZHcm91cHMsCi0gICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICpncm91cExlbik7Ci0KLSNlbmRpZiAvKiBfSU5URVJGQUNFX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2ludGVyZmFjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvaW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MmU2YTkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvaW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQlpbnRlcmZhY2UuaAotCi0JQ29udGVudDoJcHN5Y2hvYWNjb3VzdGljL3F1YW50aXplciBzdHJ1Y3R1cmVzIGFuZCBpbnRlcmZhY2UKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfSU5URVJGQUNFX0gKLSNkZWZpbmUgX0lOVEVSRkFDRV9ICi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJwc3lfY29uc3QuaCIKLSNpbmNsdWRlICJwc3lfZGF0YS5oIgotI2luY2x1ZGUgInR5cGVkZWZzLmgiCi0KLQotZW51bQotewotICBNU19OT05FID0gMCwKLSAgTVNfU09NRSA9IDEsCi0gIE1TX0FMTCAgPSAyCi19OwotCi1lbnVtCi17Ci0gIE1TX09OID0gMQotfTsKLQotc3RydWN0IFRPT0xTSU5GTyB7Ci0gIFdvcmQxNiBtc0RpZ2VzdDsKLSAgV29yZDE2IG1zTWFza1tNQVhfR1JPVVBFRF9TRkJdOwotfTsKLQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIFdvcmQxNiAgc2ZiQ250OwotICBXb3JkMTYgIHNmYlBlckdyb3VwOwotICBXb3JkMTYgIG1heFNmYlBlckdyb3VwOwotICBXb3JkMTYgIHdpbmRvd1NlcXVlbmNlOwotICBXb3JkMTYgIHdpbmRvd1NoYXBlOwotICBXb3JkMTYgIGdyb3VwaW5nTWFzazsKLSAgV29yZDE2ICBzZmJPZmZzZXRzW01BWF9HUk9VUEVEX1NGQisxXTsKLSAgV29yZDE2ICBtZGN0U2NhbGU7Ci0gIFdvcmQzMiAqc2ZiRW5lcmd5OwotICBXb3JkMzIgKnNmYlNwcmVhZGVkRW5lcmd5OwotICBXb3JkMzIgKnNmYlRocmVzaG9sZDsKLSAgV29yZDMyICptZGN0U3BlY3RydW07Ci0gIFdvcmQzMiAgc2ZiRW5TdW1MUjsKLSAgV29yZDMyICBzZmJFblN1bU1TOwotICBXb3JkMzIgc2ZiRGlzdFtNQVhfR1JPVVBFRF9TRkJdOwotICBXb3JkMzIgc2ZiRGlzdE5ld1tNQVhfR1JPVVBFRF9TRkJdOwotICBXb3JkMTYgIHNmYk1pblNucltNQVhfR1JPVVBFRF9TRkJdOwotICBXb3JkMTYgbWluU2ZNYXhRdWFudFtNQVhfR1JPVVBFRF9TRkJdOwotICBXb3JkMTYgbWluU2NmQ2FsY3VsYXRlZFtNQVhfR1JPVVBFRF9TRkJdOwotICBXb3JkMTYgcHJldlNjZkxhc3RbTUFYX0dST1VQRURfU0ZCXTsKLSAgV29yZDE2IHByZXZTY2ZOZXh0W01BWF9HUk9VUEVEX1NGQl07Ci0gIFdvcmQxNiBkZWx0YVBlTGFzdFtNQVhfR1JPVVBFRF9TRkJdOwotICBUTlNfSU5GTyB0bnNJbmZvOwotfSBQU1lfT1VUX0NIQU5ORUw7IC8qIFdvcmQxNiBzaXplOiAxNCArIDYwKE1BWF9HUk9VUEVEX1NGQikgKyAxMTIoVE5TX0lORk8pID0gMTg2ICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgc3RydWN0IFRPT0xTSU5GTyB0b29sc0luZm87Ci0gIFdvcmQxNiBncm91cGVkU2ZiT2Zmc2V0W01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCKzFdOyAgLyogcGx1cyBvbmUgZm9yIGxhc3QgZHVtbXkgb2Zmc2V0ICEgKi8KLSAgV29yZDE2IGdyb3VwZWRTZmJNaW5TbnJbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdOwotfSBQU1lfT1VUX0VMRU1FTlQ7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyogaW5mb3JtYXRpb24gc2hhcmVkIGJ5IGJvdGggY2hhbm5lbHMgICovCi0gIFBTWV9PVVRfRUxFTUVOVCAgcHN5T3V0RWxlbWVudDsKLSAgLyogaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gZWFjaCBjaGFubmVsICovCi0gIFBTWV9PVVRfQ0hBTk5FTCAgcHN5T3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdOwotfVBTWV9PVVQ7Ci0KLXZvaWQgQnVpbGRJbnRlcmZhY2UoV29yZDMyICAgICAgICAgICAgICAgICAqbWRjdFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgICAgICAgICBtZGN0U2NhbGUsCi0gICAgICAgICAgICAgICAgICAgIFNGQl9USFJFU0hPTEQgICAgICAgICAgKnNmYlRocmVzaG9sZCwKLSAgICAgICAgICAgICAgICAgICAgU0ZCX0VORVJHWSAgICAgICAgICAgICAqc2ZiRW5lcmd5LAotICAgICAgICAgICAgICAgICAgICBTRkJfRU5FUkdZICAgICAgICAgICAgICpzZmJTcHJlYWRlZEVuZXJneSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgU0ZCX0VORVJHWV9TVU0gICAgc2ZiRW5lcmd5U3VtTFIsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFNGQl9FTkVSR1lfU1VNICAgIHNmYkVuZXJneVN1bU1TLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgICAgICAgICB3aW5kb3dTZXF1ZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICAgICAgICAgd2luZG93U2hhcGUsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgICAgICAgIHNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICAgICAgICAqc2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgICAgICAgICBtYXhTZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICAgICAgICAqZ3JvdXBlZFNmYk1pblNuciwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICAgICAgICAgbm9PZkdyb3VwcywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICAgICAgICAqZ3JvdXBMZW4sCi0gICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAgICAgICAgKnBzeU91dENoKTsKLQotI2VuZGlmIC8qIF9JTlRFUkZBQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvbGluZV9wZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvbGluZV9wZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTZkNWE4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2xpbmVfcGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJbGluZV9wZS5oCi0KLQlDb250ZW50OglQZXJjZXB0dWFsIGVudHJvcGllIG1vZHVsZSBzdHJ1Y3R1cmUgYW5kIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fTElORV9QRV9ICi0jZGVmaW5lIF9fTElORV9QRV9ICi0KLQotI2luY2x1ZGUgInBzeV9jb25zdC5oIgotI2luY2x1ZGUgImludGVyZmFjZS5oIgotCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgIFdvcmQxNiBzZmJMZEVuZXJneVtNQVhfR1JPVVBFRF9TRkJdOyAgICAgLyogNCpsb2coc2ZiRW5lcmd5KS9sb2coMikgKi8KLSAgIFdvcmQxNiBzZmJOTGluZXM0W01BWF9HUk9VUEVEX1NGQl07ICAgICAgLyogNCpudW1iZXIgb2YgcmVsZXZhbnQgbGluZXMgaW4gc2ZiICovCi0gICBXb3JkMTYgc2ZiUGVbTUFYX0dST1VQRURfU0ZCXTsgICAgICAgICAgIC8qIHBlIGZvciBlYWNoIHNmYiAqLwotICAgV29yZDE2IHNmYkNvbnN0UGFydFtNQVhfR1JPVVBFRF9TRkJdOyAgICAvKiBjb25zdGFudCBwYXJ0IGZvciBlYWNoIHNmYiAqLwotICAgV29yZDE2IHNmYk5BY3RpdmVMaW5lc1tNQVhfR1JPVVBFRF9TRkJdOyAvKiBudW1iZXIgb2YgYWN0aXZlIGxpbmVzIGluIHNmYiAqLwotICAgV29yZDE2IHBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdW0gb2Ygc2ZiUGUgKi8KLSAgIFdvcmQxNiBjb25zdFBhcnQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyogc3VtIG9mIHNmYkNvbnN0UGFydCAqLwotICAgV29yZDE2IG5BY3RpdmVMaW5lczsgICAgICAgICAgICAgICAgICAgICAvKiBzdW0gb2Ygc2ZiTkFjdGl2ZUxpbmVzICovCi19IFBFX0NIQU5ORUxfREFUQTsgLyogc2l6ZSBXb3JkMTY6IDMwMyAqLwotCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgIFBFX0NIQU5ORUxfREFUQSBwZUNoYW5uZWxEYXRhW01BWF9DSEFOTkVMU107Ci0gICBXb3JkMTYgcGU7Ci0gICBXb3JkMTYgY29uc3RQYXJ0OwotICAgV29yZDE2IG5BY3RpdmVMaW5lczsKLSAgIFdvcmQxNiBvZmZzZXQ7Ci0gICBXb3JkMTYgYWhGbGFnW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXTsKLSAgIFdvcmQzMiB0aHJFeHBbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdOwotICAgV29yZDMyIHNmYlBlRmFjdG9yc1tNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl07Ci19IFBFX0RBVEE7IC8qIHNpemUgV29yZDE2OiAzMDMgKyA0ICsgMTIwICsgMjQwID0gNjY3ICovCi0KLQotCi0KLXZvaWQgcHJlcGFyZVNmYlBlKFBFX0RBVEEgKnBlRGF0YSwKLSAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAgcHN5T3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLAotICAgICAgICAgICAgICAgICAgV29yZDE2IGxvZ1NmYkVuZXJneVtNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCi0gICAgICAgICAgICAgICAgICBXb3JkMTYgc2ZiTlJlbGV2YW50TGluZXNbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAotICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IG5DaGFubmVscywKLSAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBwZU9mZnNldCk7Ci0KLQotCi0KLQotdm9pZCBjYWxjU2ZiUGUoUEVfREFUQSAqcGVEYXRhLAotICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBuQ2hhbm5lbHMpOwotCi0KLQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL21lbWFsaWduLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9tZW1hbGlnbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGJiZjQ1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL21lbWFsaWduLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCW1lbWFsaWduLmgKLQotCUNvbnRlbnQ6CU1lbW9yeSBhbGxvYyBhbGlnbm1lbnRzIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fVk9fQUFDRU5DX01FTV9BTElHTl9IX18KLSNkZWZpbmUgX19WT19BQUNFTkNfTUVNX0FMSUdOX0hfXwotCi0jaW5jbHVkZSAidm9NZW0uaCIKLSNpbmNsdWRlICJ0eXBlZGVmLmgiCi0KLWV4dGVybiB2b2lkICptZW1fbWFsbG9jKFZPX01FTV9PUEVSQVRPUiAqcE1lbW9wLCB1bnNpZ25lZCBpbnQgc2l6ZSwgdW5zaWduZWQgY2hhciBhbGlnbm1lbnQsIHVuc2lnbmVkIGludCBDb2RlY0lEKTsKLWV4dGVybiB2b2lkIG1lbV9mcmVlKFZPX01FTV9PUEVSQVRPUiAqcE1lbW9wLCB2b2lkICptZW1fcHRyLCB1bnNpZ25lZCBpbnQgQ29kZWNJRCk7Ci0KLSNlbmRpZgkvKiBfX1ZPX01FTV9BTElHTl9IX18gKi8KLQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL21zX3N0ZXJlby5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvbXNfc3RlcmVvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMDNkZWEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvbXNfc3RlcmVvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCW1zX3N0ZXJlby5oCi0KLQlDb250ZW50OglEZWNsYXJhdGlvbiBNUyBzdGVyZW8gcHJvY2Vzc2luZyBzdHJ1Y3R1cmUgYW5kIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fTVNfU1RFUkVPX0hfXwotI2RlZmluZSBfX01TX1NURVJFT19IX18KLSNpbmNsdWRlICJ0eXBlZGVmLmgiCi0KLXZvaWQgTXNTdGVyZW9Qcm9jZXNzaW5nKFdvcmQzMiAgICAgICAqc2ZiRW5lcmd5TGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqc2ZiRW5lcmd5UmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMzIgKnNmYkVuZXJneU1pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQzMiAqc2ZiRW5lcmd5U2lkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqbWRjdFNwZWN0cnVtTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqbWRjdFNwZWN0cnVtUmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKnNmYlRocmVzaG9sZExlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKnNmYlRocmVzaG9sZFJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICpzZmJTcHJlYWRlZEVuTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqc2ZiU3ByZWFkZWRFblJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICptc0RpZ2VzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAqbXNNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICBzZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgIHNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICBtYXhTZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAqc2ZiT2Zmc2V0KTsKLQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3ByZV9lY2hvX2NvbnRyb2wuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3ByZV9lY2hvX2NvbnRyb2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcxOWJhNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9wcmVfZWNob19jb250cm9sLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCXByZV9lY2hvX2NvbnRyb2wuaAotCi0JQ29udGVudDoJUHJlIGVjaG8gY29udHJvbCBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX1BSRV9FQ0hPX0NPTlRST0xfSAotI2RlZmluZSBfX1BSRV9FQ0hPX0NPTlRST0xfSAotCi0jaW5jbHVkZSAidHlwZWRlZnMuaCIKLQotdm9pZCBJbml0UHJlRWNob0NvbnRyb2woV29yZDMyICpwYlRocmVzaG9sZG5tMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgbnVtUGIsCi0gICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgKnBiVGhyZXNob2xkUXVpZXQpOwotCi0KLXZvaWQgUHJlRWNob0NvbnRyb2woV29yZDMyICpwYlRocmVzaG9sZE5tMSwKLSAgICAgICAgICAgICAgICAgICAgV29yZDE2ICBudW1QYiwKLSAgICAgICAgICAgICAgICAgICAgV29yZDMyICBtYXhBbGxvd2VkSW5jcmVhc2VGYWN0b3IsCi0gICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgbWluUmVtYWluaW5nVGhyZXNob2xkRmFjdG9yLAotICAgICAgICAgICAgICAgICAgICBXb3JkMzIgKnBiVGhyZXNob2xkLAotICAgICAgICAgICAgICAgICAgICBXb3JkMTYgIG1kY3RTY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgV29yZDE2ICBtZGN0U2NhbGVubTEpOwotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcHN5X2NvbmZpZ3VyYXRpb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3BzeV9jb25maWd1cmF0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2OTgxZmEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcHN5X2NvbmZpZ3VyYXRpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCXBzeV9jb25maWd1cmF0aW9uLmgKLQotCUNvbnRlbnQ6CVBzeWNob2FjY291c3RpYyBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBhbmQgZnVuY3Rpb25zCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX1BTWV9DT05GSUdVUkFUSU9OX0gKLSNkZWZpbmUgX1BTWV9DT05GSUdVUkFUSU9OX0gKLQotI2luY2x1ZGUgInR5cGVkZWZzLmgiCi0jaW5jbHVkZSAicHN5X2NvbnN0LmgiCi0jaW5jbHVkZSAidG5zLmgiCi0KLXR5cGVkZWYgc3RydWN0ewotCi0gIFdvcmQxNiBzZmJDbnQ7Ci0gIFdvcmQxNiBzZmJBY3RpdmU7ICAgLyogbnVtYmVyIG9mIHNmIGJhbmRzIGNvbnRhaW5pbmcgZW5lcmd5IGFmdGVyIGxvd3Bhc3MgKi8KLSAgY29uc3QgV29yZDE2ICpzZmJPZmZzZXQ7Ci0KLSAgV29yZDMyIHNmYlRocmVzaG9sZFF1aWV0W01BWF9TRkJfTE9OR107Ci0KLSAgV29yZDE2IG1heEFsbG93ZWRJbmNyZWFzZUZhY3RvcjsgICAvKiBwcmVlY2hvIGNvbnRyb2wgKi8KLSAgV29yZDE2IG1pblJlbWFpbmluZ1RocmVzaG9sZEZhY3RvcjsKLQotICBXb3JkMTYgbG93cGFzc0xpbmU7Ci0gIFdvcmQxNiBzYW1wUmF0ZUlkeDsKLSAgV29yZDMyIGNsaXBFbmVyZ3k7ICAgICAgICAgICAgICAgICAvKiBmb3IgbGV2ZWwgZGVwZW5kZW5kIHRtbiAqLwotCi0gIFdvcmQxNiByYXRpbzsKLSAgV29yZDE2IHNmYk1hc2tMb3dGYWN0b3JbTUFYX1NGQl9MT05HXTsKLSAgV29yZDE2IHNmYk1hc2tIaWdoRmFjdG9yW01BWF9TRkJfTE9OR107Ci0KLSAgV29yZDE2IHNmYk1hc2tMb3dGYWN0b3JTcHJFbltNQVhfU0ZCX0xPTkddOwotICBXb3JkMTYgc2ZiTWFza0hpZ2hGYWN0b3JTcHJFbltNQVhfU0ZCX0xPTkddOwotCi0KLSAgV29yZDE2IHNmYk1pblNucltNQVhfU0ZCX0xPTkddOyAgICAgICAvKiBtaW5pbXVtIHNuciAoZm9ybWVybHkga25vd24gYXMgYm1heCkgKi8KLQotICBUTlNfQ09ORklHIHRuc0NvbmY7Ci0KLX1QU1lfQ09ORklHVVJBVElPTl9MT05HOyAvKldvcmQxNiBzaXplOiA4ICsgNTIgKyAxMDIgKyA1MSArIDUxICsgNTEgKyA1MSArIDQ3ID0gNTE1ICovCi0KLQotdHlwZWRlZiBzdHJ1Y3R7Ci0KLSAgV29yZDE2IHNmYkNudDsKLSAgV29yZDE2IHNmYkFjdGl2ZTsgICAvKiBudW1iZXIgb2Ygc2YgYmFuZHMgY29udGFpbmluZyBlbmVyZ3kgYWZ0ZXIgbG93cGFzcyAqLwotICBjb25zdCBXb3JkMTYgKnNmYk9mZnNldDsKLQotICBXb3JkMzIgc2ZiVGhyZXNob2xkUXVpZXRbTUFYX1NGQl9TSE9SVF07Ci0KLSAgV29yZDE2IG1heEFsbG93ZWRJbmNyZWFzZUZhY3RvcjsgICAvKiBwcmVlY2hvIGNvbnRyb2wgKi8KLSAgV29yZDE2IG1pblJlbWFpbmluZ1RocmVzaG9sZEZhY3RvcjsKLQotICBXb3JkMTYgbG93cGFzc0xpbmU7Ci0gIFdvcmQxNiBzYW1wUmF0ZUlkeDsKLSAgV29yZDMyIGNsaXBFbmVyZ3k7ICAgICAgICAgICAgICAgICAvKiBmb3IgbGV2ZWwgZGVwZW5kZW5kIHRtbiAqLwotCi0gIFdvcmQxNiByYXRpbzsKLSAgV29yZDE2IHNmYk1hc2tMb3dGYWN0b3JbTUFYX1NGQl9TSE9SVF07Ci0gIFdvcmQxNiBzZmJNYXNrSGlnaEZhY3RvcltNQVhfU0ZCX1NIT1JUXTsKLQotICBXb3JkMTYgc2ZiTWFza0xvd0ZhY3RvclNwckVuW01BWF9TRkJfU0hPUlRdOwotICBXb3JkMTYgc2ZiTWFza0hpZ2hGYWN0b3JTcHJFbltNQVhfU0ZCX1NIT1JUXTsKLQotCi0gIFdvcmQxNiBzZmJNaW5TbnJbTUFYX1NGQl9TSE9SVF07ICAgICAgIC8qIG1pbmltdW0gc25yIChmb3JtZXJseSBrbm93biBhcyBibWF4KSAqLwotCi0gIFROU19DT05GSUcgdG5zQ29uZjsKLQotfVBTWV9DT05GSUdVUkFUSU9OX1NIT1JUOyAvKldvcmQxNiBzaXplOiA4ICsgMTYgKyAxNiArIDE2ICsgMTYgKyAxNiArIDE2ICsgMTYgKyA0NyA9IDE2NyAqLwotCi0KLS8qIFJldHVybnMgdGhlIHNhbXBsZSByYXRlIGluZGV4ICovCi1Xb3JkMzIgR2V0U1JJbmRleChXb3JkMzIgc2FtcGxlUmF0ZSk7Ci0KLQotV29yZDE2IEluaXRQc3lDb25maWd1cmF0aW9uTG9uZyhXb3JkMzIgYml0cmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyIHNhbXBsZXJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBiYW5kd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9DT05GSUdVUkFUSU9OX0xPTkcgKnBzeUNvbmYpOwotCi1Xb3JkMTYgSW5pdFBzeUNvbmZpZ3VyYXRpb25TaG9ydChXb3JkMzIgYml0cmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiBzYW1wbGVyYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGJhbmR3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9DT05GSUdVUkFUSU9OX1NIT1JUICpwc3lDb25mKTsKLQotI2VuZGlmIC8qIF9QU1lfQ09ORklHVVJBVElPTl9IICovCi0KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9wc3lfY29uc3QuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3BzeV9jb25zdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjlmOGMzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3BzeV9jb25zdC5oCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQlwc3lfY29uc3QuaAotCi0JQ29udGVudDoJR2xvYmFsIHBzeWNob2Fjb3VzdGljIGNvbnN0YW50cyBzdHJ1Y3R1cmVzCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX1BTWUNPTlNUX0gKLSNkZWZpbmUgX1BTWUNPTlNUX0gKLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jZGVmaW5lIFRSVUUgIDEKLSNkZWZpbmUgRkFMU0UgMAotCi0jZGVmaW5lIEZSQU1FX0xFTl9MT05HICAgIEFBQ0VOQ19CTE9DS1NJWkUKLSNkZWZpbmUgVFJBTlNfRkFDICAgICAgICAgOAotI2RlZmluZSBGUkFNRV9MRU5fU0hPUlQgICAoRlJBTUVfTEVOX0xPTkcvVFJBTlNfRkFDKQotCi0KLQotLyogQmxvY2sgdHlwZXMgKi8KLWVudW0KLXsKLSAgTE9OR19XSU5ET1cgPSAwLAotICBTVEFSVF9XSU5ET1csCi0gIFNIT1JUX1dJTkRPVywKLSAgU1RPUF9XSU5ET1cKLX07Ci0KLS8qIFdpbmRvdyBzaGFwZXMgKi8KLWVudW0KLXsKLSAgU0lORV9XSU5ET1cgPSAwLAotICBLQkRfV0lORE9XICA9IDEKLX07Ci0KLS8qCi0gIE1TIHN0dWZmCi0qLwotZW51bQotewotICBTSV9NU19NQVNLX05PTkUgPSAwLAotICBTSV9NU19NQVNLX1NPTUUgPSAxLAotICBTSV9NU19NQVNLX0FMTCAgPSAyCi19OwotCi0jZGVmaW5lIE1BWF9OT19PRl9HUk9VUFMgNAotI2RlZmluZSBNQVhfU0ZCX1NIT1JUICAgMTUgIC8qIDE1IGZvciBhIG1lbW9yeSBvcHRpbWl6ZWQgaW1wbGVtZW50YXRpb24sIG1heWJlIDE2IGZvciBjb252ZW5pZW50IGRlYnVnZ2luZyAqLwotI2RlZmluZSBNQVhfU0ZCX0xPTkcgICAgNTEgIC8qIDUxIGZvciBhIG1lbW9yeSBvcHRpbWl6ZWQgaW1wbGVtZW50YXRpb24sIG1heWJlIDY0IGZvciBjb252ZW5pZW50IGRlYnVnZ2luZyAqLwotI2RlZmluZSBNQVhfU0ZCICAgICAgICAgKE1BWF9TRkJfU0hPUlQgPiBNQVhfU0ZCX0xPTkcgPyBNQVhfU0ZCX1NIT1JUIDogTUFYX1NGQl9MT05HKSAgIC8qID0gTUFYX1NGQl9MT05HICovCi0jZGVmaW5lIE1BWF9HUk9VUEVEX1NGQiAoTUFYX05PX09GX0dST1VQUypNQVhfU0ZCX1NIT1JUID4gTUFYX1NGQl9MT05HID8gXAotICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9OT19PRl9HUk9VUFMqTUFYX1NGQl9TSE9SVCA6IE1BWF9TRkJfTE9ORykKLQotI2RlZmluZSBCTE9DS19TV0lUQ0hJTkdfT0ZGU0VUCQkgICAoMSoxMDI0KzMqMTI4KzY0KzEyOCkKLSNkZWZpbmUgQkxPQ0tfU1dJVENISU5HX0RBVEFfU0laRSAgICAgICAgICBGUkFNRV9MRU5fTE9ORwotCi0jZGVmaW5lIFRSQU5TRk9STV9PRkZTRVRfTE9ORyAgICAwCi0jZGVmaW5lIFRSQU5TRk9STV9PRkZTRVRfU0hPUlQgICA0NDgKLQotI2RlZmluZSBMT0dfTk9STV9QQ00gICAgICAgICAgKC0xNSkKLQotI2RlZmluZSBOVU1fU0FNUExFX1JBVEVTCTEyCi0KLSNlbmRpZiAvKiBfUFNZQ09OU1RfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcHN5X2RhdGEuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3BzeV9kYXRhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYTZhODQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcHN5X2RhdGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJcHN5X2RhdGEuaAotCi0JQ29udGVudDoJUHN5Y2hvYWNvdXN0aWMgZGF0YSBhbmQgc3RydWN0dXJlcwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9QU1lfREFUQV9ICi0jZGVmaW5lIF9QU1lfREFUQV9ICi0KLSNpbmNsdWRlICJibG9ja19zd2l0Y2guaCIKLSNpbmNsdWRlICJ0bnMuaCIKLQotLyoKLSAgdGhlIHN0cnVjdHMgY2FuIGJlIGltcGxlbWVudGVkIGFzIHVuaW9ucwotKi8KLQotdHlwZWRlZiBzdHJ1Y3R7Ci0gIFdvcmQzMiBzZmJMb25nW01BWF9HUk9VUEVEX1NGQl07Ci0gIFdvcmQzMiBzZmJTaG9ydFtUUkFOU19GQUNdW01BWF9TRkJfU0hPUlRdOwotfVNGQl9USFJFU0hPTEQ7IC8qIFdvcmQxNiBzaXplOiAyNjAgKi8KLQotdHlwZWRlZiBzdHJ1Y3R7Ci0gIFdvcmQzMiBzZmJMb25nW01BWF9HUk9VUEVEX1NGQl07Ci0gIFdvcmQzMiBzZmJTaG9ydFtUUkFOU19GQUNdW01BWF9TRkJfU0hPUlRdOwotfVNGQl9FTkVSR1k7IC8qIFdvcmQxNiBzaXplOiAyNjAgKi8KLQotdHlwZWRlZiBzdHJ1Y3R7Ci0gIFdvcmQzMiBzZmJMb25nOwotICBXb3JkMzIgc2ZiU2hvcnRbVFJBTlNfRkFDXTsKLX1TRkJfRU5FUkdZX1NVTTsgLyogV29yZDE2IHNpemU6IDE4ICovCi0KLQotdHlwZWRlZiBzdHJ1Y3R7Ci0gIEJMT0NLX1NXSVRDSElOR19DT05UUk9MICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sOyAgICAgICAgICAvKiBibG9jayBzd2l0Y2hpbmcgKi8KLSAgV29yZDE2ICAgICAgICAgICAgICAgICAgICAqbWRjdERlbGF5QnVmZmVyOyAgICAgICAgICAgICAgIC8qIG1kY3QgZGVsYXkgYnVmZmVyIFtCTE9DS19TV0lUQ0hJTkdfT0ZGU0VUXSovCi0gIFdvcmQzMiAgICAgICAgICAgICAgICAgICAgc2ZiVGhyZXNob2xkbm0xW01BWF9TRkJdOyAgICAgICAvKiBQcmVFY2hvQ29udHJvbCAqLwotICBXb3JkMTYgICAgICAgICAgICAgICAgICAgIG1kY3RTY2FsZW5tMTsgICAgICAgICAgICAgICAgICAgLyogc2NhbGUgb2YgbGFzdCBibG9jaydzIG1kY3QgKFByZUVjaG9Db250cm9sKSAqLwotCi0gIFNGQl9USFJFU0hPTEQgICAgICAgICAgICAgc2ZiVGhyZXNob2xkOyAgICAgICAgICAgICAgICAgICAvKiBhZGFwdCAgICAgICAgICAgKi8KLSAgU0ZCX0VORVJHWSAgICAgICAgICAgICAgICBzZmJFbmVyZ3k7ICAgICAgICAgICAgICAgICAgICAgIC8qIHNmYiBFbmVyZ3kgICAgICAqLwotICBTRkJfRU5FUkdZICAgICAgICAgICAgICAgIHNmYkVuZXJneU1TOwotICBTRkJfRU5FUkdZX1NVTSAgICAgICAgICAgIHNmYkVuZXJneVN1bTsKLSAgU0ZCX0VORVJHWV9TVU0gICAgICAgICAgICBzZmJFbmVyZ3lTdW1NUzsKLSAgU0ZCX0VORVJHWSAgICAgICAgICAgICAgICBzZmJTcHJlYWRlZEVuZXJneTsKLQotICBXb3JkMzIgICAgICAgICAgICAgICAgICAgICptZGN0U3BlY3RydW07ICAgICAgICAgICAgICAgICAgLyogbWRjdCBzcGVjdHJ1bSBbRlJBTUVfTEVOX0xPTkddICovCi0gIFdvcmQxNiAgICAgICAgICAgICAgICAgICAgbWRjdFNjYWxlOyAgICAgICAgICAgICAgICAgICAgICAvKiBzY2FsZSBvZiBtZGN0ICAgKi8KLX1QU1lfREFUQTsgLyogV29yZDE2IHNpemU6IDQgKyA4NyArIDEwMiArIDM2MCArIDM2MCArIDM2MCArIDE4ICsgMTggKyAzNjAgPSAxNjY5ICovCi0KLSNlbmRpZiAvKiBfUFNZX0RBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcHN5X21haW4uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3BzeV9tYWluLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjY2FjNjAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcHN5X21haW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJcHN5X21haW4uaAotCi0JQ29udGVudDoJUHN5Y2hvYWNvdXN0aWMgbWFqb3IgZnVuY3Rpb24gYmxvY2sKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfUFNZTUFJTl9ICi0jZGVmaW5lIF9QU1lNQUlOX0gKLQotI2luY2x1ZGUgInBzeV9jb25maWd1cmF0aW9uLmgiCi0jaW5jbHVkZSAicWNfZGF0YS5oIgotI2luY2x1ZGUgIm1lbWFsaWduLmgiCi0KLS8qCi0gIHBzeSBrZXJuZWwKLSovCi10eXBlZGVmIHN0cnVjdCAgewotICBQU1lfQ09ORklHVVJBVElPTl9MT05HICBwc3lDb25mTG9uZzsgICAgICAgICAgIC8qIFdvcmQxNiBzaXplOiA1MTUgKi8KLSAgUFNZX0NPTkZJR1VSQVRJT05fU0hPUlQgcHN5Q29uZlNob3J0OyAgICAgICAgICAvKiBXb3JkMTYgc2l6ZTogMTY3ICovCi0gIFBTWV9EQVRBICAgICAgICAgICAgICAgIHBzeURhdGFbTUFYX0NIQU5ORUxTXTsgLyogV29yZDE2IHNpemU6IE1BWF9DSEFOTkVMUyoxNjY5Ki8KLSAgVE5TX0RBVEEgICAgICAgICAgICAgICAgdG5zRGF0YVtNQVhfQ0hBTk5FTFNdOyAvKiBXb3JkMTYgc2l6ZTogTUFYX0NIQU5ORUxTKjIzNSAqLwotICBXb3JkMzIqICAgICAgICAgICAgICAgICBwU2NyYXRjaFRuczsKLSAgV29yZDE2CQkJCSAgc2FtcGxlUmF0ZUlkeDsKLX1QU1lfS0VSTkVMOyAvKiBXb3JkMTYgc2l6ZTogMjU4NyAvIDQ0OTEgKi8KLQotCi1Xb3JkMTYgUHN5TmV3KCBQU1lfS0VSTkVMICAqaFBzeSwgV29yZDMyIG5DaGFuLCBWT19NRU1fT1BFUkFUT1IgKnBNZW1PUCk7Ci1Xb3JkMTYgUHN5RGVsZXRlKCBQU1lfS0VSTkVMICAqaFBzeSwgVk9fTUVNX09QRVJBVE9SICpwTWVtT1ApOwotCi1Xb3JkMTYgUHN5T3V0TmV3KCBQU1lfT1VUICpoUHN5T3V0LCBWT19NRU1fT1BFUkFUT1IgKnBNZW1PUCk7Ci1Xb3JkMTYgUHN5T3V0RGVsZXRlKCBQU1lfT1VUICpoUHN5T3V0LCBWT19NRU1fT1BFUkFUT1IgKnBNZW1PUCk7Ci0KLVdvcmQxNiBwc3lNYWluSW5pdCggUFNZX0tFUk5FTCAqaFBzeSwKLSAgICAgICAgICAgICAgICAgICAgV29yZDMyIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgIFdvcmQzMiBiaXRSYXRlLAotICAgICAgICAgICAgICAgICAgICBXb3JkMTYgY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgIFdvcmQxNiB0bnNNYXNrLAotICAgICAgICAgICAgICAgICAgICBXb3JkMTYgYmFuZHdpZHRoKTsKLQotCi1Xb3JkMTYgcHN5TWFpbihXb3JkMTYgICAgICAgICAgICAgICAgICAgbkNoYW5uZWxzLCAgIC8qITwgdG90YWwgbnVtYmVyIG9mIGNoYW5uZWxzICovCi0gICAgICAgICAgICAgICBFTEVNRU5UX0lORk8gICAgICAgICAgICAgKmVsZW1JbmZvLAotICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgICAgICAgICAgICp0aW1lU2lnbmFsLCAvKiE8IGludGVybGVhdmVkIHRpbWUgc2lnbmFsICovCi0gICAgICAgICAgICAgICBQU1lfREFUQSAgICAgICAgICAgICAgICAgcHN5RGF0YVtNQVhfQ0hBTk5FTFNdLAotICAgICAgICAgICAgICAgVE5TX0RBVEEgICAgICAgICAgICAgICAgIHRuc0RhdGFbTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgICAgICAgIFBTWV9DT05GSUdVUkFUSU9OX0xPTkcqICBwc3lDb25mTG9uZywKLSAgICAgICAgICAgICAgIFBTWV9DT05GSUdVUkFUSU9OX1NIT1JUKiBwc3lDb25mU2hvcnQsCi0gICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLAotICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UICAgICAgICAgICpwc3lPdXRFbGVtZW50LAotICAgICAgICAgICAgICAgV29yZDMyICAgICAgICAgICAgICAgICAgICpwU2NyYXRjaFRucywKLQkJCSAgIFdvcmQzMgkJCQkJc2FtcGxlUmF0ZSk7Ci0KLSNlbmRpZiAvKiBfUFNZTUFJTl9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9xY19kYXRhLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9xY19kYXRhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwOTkyMmQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcWNfZGF0YS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJcWNfZGF0YS5oCi0KLQlDb250ZW50OglRdWFudGl6aW5nICYgY29kaW5nIHN0cnVjdHVyZXMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfUUNfREFUQV9ICi0jZGVmaW5lIF9RQ19EQVRBX0gKLQotI2luY2x1ZGUgInBzeV9jb25zdC5oIgotI2luY2x1ZGUgImR5bl9iaXRzLmgiCi0jaW5jbHVkZSAiYWRqX3Rocl9kYXRhLmgiCi0KLQotI2RlZmluZSBNQVhfTU9ERVMgMTAKLQotdHlwZWRlZiBlbnVtIHsKLSAgTU9ERV9JTlZBTElEID0gMCwKLSAgTU9ERV8xLCAgICAgICAgLyogbW9ubyAgICAgICovCi0gIE1PREVfMV8xLCAgICAgIC8qIGR1YWwgbW9ubyAqLwotICBNT0RFXzIgICAgICAgICAvKiBzdGVyZW8gICAgKi8KLX0gRU5DT0RFUl9NT0RFOwotCi10eXBlZGVmIGVudW0gewotICBJRF9TQ0U9MCwgICAgIC8qIFNpbmdsZSBDaGFubmVsIEVsZW1lbnQgICAqLwotICBJRF9DUEU9MSwgICAgIC8qIENoYW5uZWwgUGFpciBFbGVtZW50ICAgICAqLwotICBJRF9DQ0U9MiwgICAgIC8qIENvdXBsaW5nIENoYW5uZWwgRWxlbWVudCAqLwotICBJRF9MRkU9MywgICAgIC8qIExGRSBDaGFubmVsIEVsZW1lbnQgICAgICAqLwotICBJRF9EU0U9NCwgICAgIC8qIGN1cnJlbnQgb25lIERTRSBlbGVtZW50IGZvciBhbmNpbGxhcnkgaXMgc3VwcG9ydGVkICovCi0gIElEX1BDRT01LAotICBJRF9GSUw9NiwKLSAgSURfRU5EPTcKLX1FTEVNRU5UX1RZUEU7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgRUxFTUVOVF9UWVBFIGVsVHlwZTsKLSAgV29yZDE2IGluc3RhbmNlVGFnOwotICBXb3JkMTYgbkNoYW5uZWxzSW5FbDsKLSAgV29yZDE2IENoYW5uZWxJbmRleFtNQVhfQ0hBTk5FTFNdOwotfSBFTEVNRU5UX0lORk87Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgV29yZDMyIHBhZGRpbmdSZXN0OwotfSBQQURESU5HOwotCi0KLS8qIFF1YW50aXppbmcgJiBjb2Rpbmcgc3RhZ2UgKi8KLQotc3RydWN0IFFDX0lOSVR7Ci0gIEVMRU1FTlRfSU5GTyAqZWxJbmZvOwotICBXb3JkMTYgbWF4Qml0czsgICAgIC8qIG1heGltdW0gbnVtYmVyIG9mIGJpdHMgaW4gcmVzZXJ2b2lyICAqLwotICBXb3JkMTYgYXZlcmFnZUJpdHM7IC8qIGF2ZXJhZ2UgbnVtYmVyIG9mIGJpdHMgd2Ugc2hvdWxkIHVzZSAqLwotICBXb3JkMTYgYml0UmVzOwotICBXb3JkMTYgbWVhblBlOwotICBXb3JkMzIgY2hCaXRyYXRlOwotICBXb3JkMTYgbWF4Qml0RmFjOwotICBXb3JkMzIgYml0cmF0ZTsKLQotICBQQURESU5HIHBhZGRpbmc7Ci19OwotCi10eXBlZGVmIHN0cnVjdAotewotICBXb3JkMTYgICAgICAgICAgKnF1YW50U3BlYzsgICAgICAgLyogW0ZSQU1FX0xFTl9MT05HXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgVVdvcmQxNiAgICAgICAgICptYXhWYWx1ZUluU2ZiOyAgIC8qIFtNQVhfR1JPVVBFRF9TRkJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIFdvcmQxNiAgICAgICAgICAqc2NmOyAgICAgICAgICAgICAvKiBbTUFYX0dST1VQRURfU0ZCXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBXb3JkMTYgICAgICAgICAgZ2xvYmFsR2FpbjsKLSAgV29yZDE2ICAgICAgICAgIG1kY3RTY2FsZTsKLSAgV29yZDE2ICAgICAgICAgIGdyb3VwaW5nTWFzazsKLSAgU0VDVElPTl9EQVRBICAgIHNlY3Rpb25EYXRhOwotICBXb3JkMTYgICAgICAgICAgd2luZG93U2hhcGU7Ci19IFFDX09VVF9DSEFOTkVMOwotCi10eXBlZGVmIHN0cnVjdAotewotICBXb3JkMTYJCSAgYWR0c1VzZWQ7Ci0gIFdvcmQxNiAgICAgICAgICBzdGF0aWNCaXRzVXNlZDsgLyogZm9yIHZlcmlmaWNhdGlvbiBwdXJwb3NlcyAqLwotICBXb3JkMTYgICAgICAgICAgZHluQml0c1VzZWQ7ICAgIC8qIGZvciB2ZXJpZmljYXRpb24gcHVycG9zZXMgKi8KLSAgV29yZDE2ICAgICAgICAgIHBlOwotICBXb3JkMTYgICAgICAgICAgYW5jQml0c1VzZWQ7Ci0gIFdvcmQxNiAgICAgICAgICBmaWxsQml0czsKLX0gUUNfT1VUX0VMRU1FTlQ7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIFFDX09VVF9DSEFOTkVMICBxY0NoYW5uZWxbTUFYX0NIQU5ORUxTXTsKLSAgUUNfT1VUX0VMRU1FTlQgIHFjRWxlbWVudDsKLSAgV29yZDE2ICAgICAgICAgIHRvdFN0YXRpY0JpdHNVc2VkOyAvKiBmb3IgdmVyaWZpY2F0aW9uIHB1cnBvc2VzICovCi0gIFdvcmQxNiAgICAgICAgICB0b3REeW5CaXRzVXNlZDsgICAgLyogZm9yIHZlcmlmaWNhdGlvbiBwdXJwb3NlcyAqLwotICBXb3JkMTYgICAgICAgICAgdG90QW5jQml0c1VzZWQ7ICAgIC8qIGZvciB2ZXJpZmljYXRpb24gcHVycG9zZXMgKi8KLSAgV29yZDE2ICAgICAgICAgIHRvdEZpbGxCaXRzOwotICBXb3JkMTYgICAgICAgICAgYWxpZ25CaXRzOwotICBXb3JkMTYgICAgICAgICAgYml0UmVzVG90OwotICBXb3JkMTYgICAgICAgICAgYXZlcmFnZUJpdHNUb3Q7Ci19IFFDX09VVDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBXb3JkMzIgY2hCaXRyYXRlOwotICBXb3JkMTYgYXZlcmFnZUJpdHM7ICAgICAgICAgICAgICAgLyogYnJ1dHRvIC0+IGxvb2sgYW5jaWxsYXJ5LmggKi8KLSAgV29yZDE2IG1heEJpdHM7Ci0gIFdvcmQxNiBiaXRSZXNMZXZlbDsKLSAgV29yZDE2IG1heEJpdFJlc0JpdHM7Ci0gIFdvcmQxNiByZWxhdGl2ZUJpdHM7ICAgICAgICAgICAgLyogQml0cyByZWxhdGl2ZSB0byB0b3RhbCBCaXRzIHNjYWxlZCBkb3duIGJ5IDIgKi8KLX0gRUxFTUVOVF9CSVRTOwotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiB0aGlzIGlzIGJhc2ljYWxseSBzdHJ1Y3QgUUNfSU5JVCAqLwotICBXb3JkMTYgYXZlcmFnZUJpdHNUb3Q7Ci0gIFdvcmQxNiBtYXhCaXRzVG90OwotICBXb3JkMTYgZ2xvYlN0YXRCaXRzOwotICBXb3JkMTYgbkNoYW5uZWxzOwotICBXb3JkMTYgYml0UmVzVG90OwotCi0gIFdvcmQxNiBtYXhCaXRGYWM7Ci0KLSAgUEFERElORyAgIHBhZGRpbmc7Ci0KLSAgRUxFTUVOVF9CSVRTICBlbGVtZW50Qml0czsKLSAgQURKX1RIUl9TVEFURSBhZGpUaHI7Ci0KLSAgV29yZDE2IGxvZ1NmYkZvcm1GYWN0b3JbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdOwotICBXb3JkMTYgc2ZiTlJlbGV2YW50TGluZXNbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdOwotICBXb3JkMTYgbG9nU2ZiRW5lcmd5W01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXTsKLX0gUUNfU1RBVEU7Ci0KLSNlbmRpZiAvKiBfUUNfREFUQV9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9xY19tYWluLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9xY19tYWluLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmODM5NzMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcWNfbWFpbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQlxY19tYWluLmgKLQotCUNvbnRlbnQ6CVF1YW50aXppbmcgJiBjb2RpbmcgZnVuY3Rpb25zCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX1FDX01BSU5fSAotI2RlZmluZSBfUUNfTUFJTl9ICi0KLSNpbmNsdWRlICJxY19kYXRhLmgiCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAibWVtYWxpZ24uaCIKLQotLyogUXVhbnRpemluZyAmIGNvZGluZyBzdGFnZSAqLwotCi1Xb3JkMTYgUUNPdXROZXcoUUNfT1VUICpoUUMsIFdvcmQxNiBuQ2hhbm5lbHMsIFZPX01FTV9PUEVSQVRPUiAqcE1lbU9QKTsKLQotdm9pZCBRQ091dERlbGV0ZShRQ19PVVQgKmhRQywgVk9fTUVNX09QRVJBVE9SICpwTWVtT1ApOwotCi1Xb3JkMTYgUUNOZXcoUUNfU1RBVEUgKmhRQywgVk9fTUVNX09QRVJBVE9SICpwTWVtT1ApOwotCi1Xb3JkMTYgUUNJbml0KFFDX1NUQVRFICpoUUMsCi0gICAgICAgICAgICAgIHN0cnVjdCBRQ19JTklUICppbml0KTsKLQotdm9pZCBRQ0RlbGV0ZShRQ19TVEFURSAqaFFDLCBWT19NRU1fT1BFUkFUT1IgKnBNZW1PUCk7Ci0KLQotV29yZDE2IFFDTWFpbihRQ19TVEFURSAqaFFDLAotICAgICAgICAgICAgICBFTEVNRU5UX0JJVFMqIGVsQml0cywKLSAgICAgICAgICAgICAgQVRTX0VMRU1FTlQqIGFkalRoclN0YXRlRWxlbWVudCwKLSAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwgLyogbWF5IGJlIG1vZGlmaWVkIGluLXBsYWNlICovCi0gICAgICAgICAgICAgIFBTWV9PVVRfRUxFTUVOVCogcHN5T3V0RWxlbWVudCwKLSAgICAgICAgICAgICAgUUNfT1VUX0NIQU5ORUwgIHFjT3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLCAgIC8qIG91dCAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICBRQ19PVVRfRUxFTUVOVCogcWNPdXRFbGVtZW50LAotICAgICAgICAgICAgICBXb3JkMTYgbkNoYW5uZWxzLAotCQkJICBXb3JkMTYgYW5jaWxsYXJ5RGF0YUJ5dGVzKTsgICAgIC8qIHJldHVybnMgZXJyb3IgY29kZSAgICAgICAqLwotCi12b2lkIHVwZGF0ZUJpdHJlcyhRQ19TVEFURSogcWNLZXJuZWwsCi0gICAgICAgICAgICAgICAgICBRQ19PVVQqIHFjT3V0KTsKLQotV29yZDE2IEZpbmFsaXplQml0Q29uc3VtcHRpb24oUUNfU1RBVEUgKmhRQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVCogcWNPdXQpOwotCi1Xb3JkMTYgQWRqdXN0Qml0cmF0ZShRQ19TVEFURSAqaFFDLAotICAgICAgICAgICAgICAgICAgICAgV29yZDMyIGJpdFJhdGUsCi0gICAgICAgICAgICAgICAgICAgICBXb3JkMzIgc2FtcGxlUmF0ZSk7Ci0KLSNlbmRpZiAvKiBfUUNfTUFJTl9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9xdWFudGl6ZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcXVhbnRpemUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNhZmVmNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9xdWFudGl6ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQlxdWFudGl6ZS5oCi0KLQlDb250ZW50OglRdWFudGl6YXRpb24gZnVuY3Rpb25zCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX1FVQU5USVpFX0hfCi0jZGVmaW5lIF9RVUFOVElaRV9IXwotI2luY2x1ZGUgInR5cGVkZWZzLmgiCi0KLS8qIHF1YW50aXppbmcgKi8KLQotI2RlZmluZSBNQVhfUVVBTlQgODE5MQotCi12b2lkIFF1YW50aXplU3BlY3RydW0oV29yZDE2IHNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbWF4U2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqc2ZiT2Zmc2V0LCBXb3JkMzIgKm1kY3RTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgZ2xvYmFsR2FpbiwgV29yZDE2ICpzY2FsZWZhY3RvcnMsCi0gICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpxdWFudGl6ZWRTcGVjdHJ1bSk7Ci0KLVdvcmQzMiBjYWxjU2ZiRGlzdChjb25zdCBXb3JkMzIgKnNwZWMsCi0gICAgICAgICAgICAgICAgICAgV29yZDE2ICBzZmJXaWR0aCwKLSAgICAgICAgICAgICAgICAgICBXb3JkMTYgIGdhaW4pOwotCi0jZW5kaWYgLyogX1FVQU5USVpFX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9zZl9lc3RpbS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvc2ZfZXN0aW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk3ZWJhNS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9zZl9lc3RpbS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQlzZl9lc3RpbS5oCi0KLQlDb250ZW50OglTY2FsZSBmYWN0b3IgZXN0aW1hdGlvbiBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX1NGX0VTVElNX0hfXwotI2RlZmluZSBfX1NGX0VTVElNX0hfXwotLyoKLSAgIFNjYWxlIGZhY3RvciBlc3RpbWF0aW9uCi0gKi8KLSNpbmNsdWRlICJwc3lfY29uc3QuaCIKLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJxY19kYXRhLmgiCi0KLXZvaWQKLUNhbGNGb3JtRmFjdG9yKFdvcmQxNiAgICAgICAgICBsb2dTZmJGb3JtRmFjdG9yW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKLSAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICBzZmJOUmVsZXZhbnRMaW5lc1tNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCi0gICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgbG9nU2ZiRW5lcmd5W01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKLSAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCBwc3lPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sCi0gICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgbkNoYW5uZWxzKTsKLQotdm9pZAotRXN0aW1hdGVTY2FsZUZhY3RvcnMoUFNZX09VVF9DSEFOTkVMIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMICBxY091dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICBsb2dTZmJFbmVyZ3lbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAotICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgIGxvZ1NmYkZvcm1GYWN0b3JbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAotICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgIHNmYk5SZWxldmFudExpbmVzW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICBuQ2hhbm5lbHMpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9zcHJlYWRpbmcuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3NwcmVhZGluZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzk2ZmM3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3NwcmVhZGluZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQlzcHJlYWRpbmcuaAotCi0JQ29udGVudDoJU3ByZWFkaW5nIG9mIGVuZXJneSBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfU1BSRUFESU5HX0gKLSNkZWZpbmUgX1NQUkVBRElOR19ICi0jaW5jbHVkZSAidHlwZWRlZnMuaCIKLQotCi12b2lkIFNwcmVhZGluZ01heChjb25zdCBXb3JkMTYgcGJDbnQsCi0gICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgKm1hc2tMb3dGYWN0b3IsCi0gICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgKm1hc2tIaWdoRmFjdG9yLAotICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICpwYlNwcmVhZGVkRW5lcmd5KTsKLQotI2VuZGlmIC8qICNpZm5kZWYgX1NQUkVBRElOR19IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9zdGF0X2JpdHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3N0YXRfYml0cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2RkYzFkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3N0YXRfYml0cy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQlzdGF0X2JpdHMuaAotCi0JQ29udGVudDoJU3RhdGljIGJpdCBjb3VudGVyIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fU1RBVF9CSVRTX0gKLSNkZWZpbmUgX19TVEFUX0JJVFNfSAotCi0jaW5jbHVkZSAicHN5X2NvbnN0LmgiCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0KLVdvcmQxNiBjb3VudFN0YXRpY0JpdGRlbWFuZChQU1lfT1VUX0NIQU5ORUwgcHN5T3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfRUxFTUVOVCAqcHN5T3V0RWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbkNoYW5uZWxzLAotCQkJCQkJCVdvcmQxNiBhZHRzVXNlZCk7Ci0KLSNlbmRpZiAvKiBfX1NUQVRfQklUU19IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy90bnMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3Rucy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGNmYWVlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3Rucy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJdG5zLmgKLQotCUNvbnRlbnQ6CVROUyBzdHJ1Y3R1cmVzCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX1ROU19ICi0jZGVmaW5lIF9UTlNfSAotCi0jaW5jbHVkZSAidHlwZWRlZi5oIgotI2luY2x1ZGUgInBzeV9jb25zdC5oIgotCi0KLQotI2RlZmluZSBUTlNfTUFYX09SREVSIDEyCi0jZGVmaW5lIFROU19NQVhfT1JERVJfU0hPUlQgNQotCi0jZGVmaW5lIEZJTFRFUl9ESVJFQ1RJT04gICAgMAotCi10eXBlZGVmIHN0cnVjdHsgLypzdHVmZiB0aGF0IGlzIHRhYnVsYXRlZCBkZXBlbmRlbnQgb24gYml0cmF0ZSBldGMuICovCi0gIFdvcmQxNiAgICAgdGhyZXNoT247ICAgICAgICAgICAgICAgIC8qIG1pbi4gcHJlZGljdGlvbiBnYWluIGZvciB1c2luZyB0bnMgVEFCVUwgKiAxMDAqLwotICBXb3JkMzIgICAgIGxwY1N0YXJ0RnJlcTsgICAgICAgICAgICAvKiBsb3dlc3QgZnJlcSBmb3IgbHBjIFRBQlVMKi8KLSAgV29yZDMyICAgICBscGNTdG9wRnJlcTsgICAgICAgICAgICAgLyogVEFCVUwgKi8KLSAgV29yZDMyICAgICB0bnNUaW1lUmVzb2x1dGlvbjsKLX1UTlNfQ09ORklHX1RBQlVMQVRFRDsKLQotCi10eXBlZGVmIHN0cnVjdCB7ICAgLyphc3NpZ25lZCBhdCBJbml0VGltZSovCi0gIFdvcmQxNiB0bnNBY3RpdmU7Ci0gIFdvcmQxNiB0bnNNYXhTZmI7Ci0KLSAgV29yZDE2IG1heE9yZGVyOyAgICAgICAgICAgICAgICAvKiBtYXguIG9yZGVyIG9mIHRucyBmaWx0ZXIgKi8KLSAgV29yZDE2IHRuc1N0YXJ0RnJlcTsgICAgICAgICAgICAvKiBsb3dlc3QgZnJlcS4gZm9yIHRucyBmaWx0ZXJpbmcgKi8KLSAgV29yZDE2IGNvZWZSZXM7Ci0KLSAgVE5TX0NPTkZJR19UQUJVTEFURUQgY29uZlRhYjsKLQotICBXb3JkMzIgYWNmV2luZG93W1ROU19NQVhfT1JERVIrMV07Ci0KLSAgV29yZDE2IHRuc1N0YXJ0QmFuZDsKLSAgV29yZDE2IHRuc1N0YXJ0TGluZTsKLQotICBXb3JkMTYgdG5zU3RvcEJhbmQ7Ci0gIFdvcmQxNiB0bnNTdG9wTGluZTsKLQotICBXb3JkMTYgbHBjU3RhcnRCYW5kOwotICBXb3JkMTYgbHBjU3RhcnRMaW5lOwotCi0gIFdvcmQxNiBscGNTdG9wQmFuZDsKLSAgV29yZDE2IGxwY1N0b3BMaW5lOwotCi0gIFdvcmQxNiB0bnNSYXRpb1BhdGNoTG93ZXN0Q2I7Ci0gIFdvcmQxNiB0bnNNb2RpZnlCZWdpbkNiOwotCi0gIFdvcmQxNiB0aHJlc2hvbGQ7IC8qIG1pbi4gcHJlZGljdGlvbiBnYWluIGZvciB1c2luZyB0bnMgVEFCVUwgKiAxMDAgKi8KLQotfVROU19DT05GSUc7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBXb3JkMTYgdG5zQWN0aXZlOwotICBXb3JkMzIgcGFyY29yW1ROU19NQVhfT1JERVJdOwotICBXb3JkMTYgcHJlZGljdGlvbkdhaW47Ci19IFROU19TVUJCTE9DS19JTkZPOyAvKiBXb3JkMTYgc2l6ZTogMjYgKi8KLQotdHlwZWRlZiBzdHJ1Y3R7Ci0gIFROU19TVUJCTE9DS19JTkZPIHN1YkJsb2NrSW5mb1tUUkFOU19GQUNdOwotfSBUTlNfREFUQV9TSE9SVDsKLQotdHlwZWRlZiBzdHJ1Y3R7Ci0gIFROU19TVUJCTE9DS19JTkZPIHN1YkJsb2NrSW5mbzsKLX0gVE5TX0RBVEFfTE9ORzsKLQotdHlwZWRlZiBzdHJ1Y3R7Ci0gIFROU19EQVRBX0xPTkcgdG5zTG9uZzsKLSAgVE5TX0RBVEFfU0hPUlQgdG5zU2hvcnQ7Ci19VE5TX0RBVEFfUkFXOwotCi10eXBlZGVmIHN0cnVjdHsKLSAgV29yZDE2IG51bU9mU3ViYmxvY2tzOwotICBUTlNfREFUQV9SQVcgZGF0YVJhdzsKLX1UTlNfREFUQTsgLyogV29yZDE2IHNpemU6IDEgKyA4KjI2ICsgMjYgPSAyMzUgKi8KLQotdHlwZWRlZiBzdHJ1Y3R7Ci0gIFdvcmQxNiB0bnNBY3RpdmVbVFJBTlNfRkFDXTsKLSAgV29yZDE2IGNvZWZSZXNbVFJBTlNfRkFDXTsKLSAgV29yZDE2IGxlbmd0aFtUUkFOU19GQUNdOwotICBXb3JkMTYgb3JkZXJbVFJBTlNfRkFDXTsKLSAgV29yZDE2IGNvZWZbVFJBTlNfRkFDKlROU19NQVhfT1JERVJfU0hPUlRdOwotfVROU19JTkZPOyAvKiBXb3JkMTYgc2l6ZTogNzIgKi8KLQotI2VuZGlmIC8qIF9UTlNfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvdG5zX2Z1bmMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3Ruc19mdW5jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZGYyNGQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvdG5zX2Z1bmMuaAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJdG5zX2Z1bmMuaAotCi0JQ29udGVudDoJVE5TIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICAgVGVtcG9yYWwgbm9pc2Ugc2hhcGluZwotICovCi0jaWZuZGVmIF9UTlNfRlVOQ19ICi0jZGVmaW5lIF9UTlNfRlVOQ19ICi0jaW5jbHVkZSAidHlwZWRlZi5oIgotI2luY2x1ZGUgInBzeV9jb25maWd1cmF0aW9uLmgiCi0KLVdvcmQxNiBJbml0VG5zQ29uZmlndXJhdGlvbkxvbmcoV29yZDMyIGJpdHJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiBzYW1wbGVyYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFROU19DT05GSUcgKnRuc0NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX0NPTkZJR1VSQVRJT05fTE9ORyAqcHN5Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgYWN0aXZlKTsKLQotV29yZDE2IEluaXRUbnNDb25maWd1cmF0aW9uU2hvcnQoV29yZDMyIGJpdHJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgc2FtcGxlcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBjaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFROU19DT05GSUcgKnRuc0NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9DT05GSUdVUkFUSU9OX1NIT1JUICpwc3lDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgYWN0aXZlKTsKLQotV29yZDMyIFRuc0RldGVjdChUTlNfREFUQSogdG5zRGF0YSwKLSAgICAgICAgICAgICAgICAgVE5TX0NPTkZJRyB0QywKLSAgICAgICAgICAgICAgICAgV29yZDMyKiBwU2NyYXRjaFRucywKLSAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IHNmYk9mZnNldFtdLAotICAgICAgICAgICAgICAgICBXb3JkMzIqIHNwZWN0cnVtLAotICAgICAgICAgICAgICAgICBXb3JkMTYgc3ViQmxvY2tOdW1iZXIsCi0gICAgICAgICAgICAgICAgIFdvcmQxNiBibG9ja1R5cGUsCi0gICAgICAgICAgICAgICAgIFdvcmQzMiAqIHNmYkVuZXJneSk7Ci0KLXZvaWQgVG5zU3luYyhUTlNfREFUQSAqdG5zRGF0YURlc3QsCi0gICAgICAgICAgICAgY29uc3QgVE5TX0RBVEEgKnRuc0RhdGFTcmMsCi0gICAgICAgICAgICAgY29uc3QgVE5TX0NPTkZJRyB0QywKLSAgICAgICAgICAgICBjb25zdCBXb3JkMTYgc3ViQmxvY2tOdW1iZXIsCi0gICAgICAgICAgICAgY29uc3QgV29yZDE2IGJsb2NrVHlwZSk7Ci0KLVdvcmQxNiBUbnNFbmNvZGUoVE5TX0lORk8qIHRuc0luZm8sCi0gICAgICAgICAgICAgICAgIFROU19EQVRBKiB0bnNEYXRhLAotICAgICAgICAgICAgICAgICBXb3JkMTYgbnVtT2ZTZmIsCi0gICAgICAgICAgICAgICAgIFROU19DT05GSUcgdEMsCi0gICAgICAgICAgICAgICAgIFdvcmQxNiBsb3dQYXNzTGluZSwKLSAgICAgICAgICAgICAgICAgV29yZDMyKiBzcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgV29yZDE2IHN1YkJsb2NrTnVtYmVyLAotICAgICAgICAgICAgICAgICBXb3JkMTYgYmxvY2tUeXBlKTsKLQotdm9pZCBBcHBseVRuc011bHRUYWJsZVRvUmF0aW9zKFdvcmQxNiBzdGFydENiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBzdG9wQ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE5TX1NVQkJMT0NLX0lORk8gc3ViSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgKnRocmVzaG9sZHMpOwotCi0KLSNlbmRpZiAvKiBfVE5TX0ZVTkNfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvdG5zX3BhcmFtLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy90bnNfcGFyYW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFhMzNjMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy90bnNfcGFyYW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJdG5zX3BhcmFtLmgKLQotCUNvbnRlbnQ6CVROUyBwYXJhbWV0ZXJzCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gICBUTlMgcGFyYW1ldGVycwotICovCi0jaWZuZGVmIF9UTlNfUEFSQU1fSAotI2RlZmluZSBfVE5TX1BBUkFNX0gKLQotI2luY2x1ZGUgInRucy5oIgotCi10eXBlZGVmIHN0cnVjdHsKLSAgV29yZDMyIHNhbXBsaW5nUmF0ZTsKLSAgV29yZDE2IG1heEJhbmRMb25nOwotICBXb3JkMTYgbWF4QmFuZFNob3J0OwotfVROU19NQVhfVEFCX0VOVFJZOwotCi10eXBlZGVmIHN0cnVjdHsKLSAgICBXb3JkMzIgYml0UmF0ZUZyb207Ci0gICAgV29yZDMyIGJpdFJhdGVUbzsKLSAgICBjb25zdCBUTlNfQ09ORklHX1RBQlVMQVRFRCAqcGFyYW1Nb25vX0xvbmc7ICAvKiBjb250YWlucyBUTlMgcGFyYW1ldGVycyAqLwotICAgIGNvbnN0IFROU19DT05GSUdfVEFCVUxBVEVEICpwYXJhbU1vbm9fU2hvcnQ7Ci0gICAgY29uc3QgVE5TX0NPTkZJR19UQUJVTEFURUQgKnBhcmFtU3RlcmVvX0xvbmc7Ci0gICAgY29uc3QgVE5TX0NPTkZJR19UQUJVTEFURUQgKnBhcmFtU3RlcmVvX1Nob3J0OwotfVROU19JTkZPX1RBQjsKLQotCi12b2lkIEdldFRuc1BhcmFtKFROU19DT05GSUdfVEFCVUxBVEVEICp0bnNDb25maWdUYWIsCi0gICAgICAgICAgICAgICAgIFdvcmQzMiBiaXRSYXRlLCBXb3JkMTYgY2hhbm5lbHMsIFdvcmQxNiBibG9ja1R5cGUpOwotCi12b2lkIEdldFRuc01heEJhbmRzKFdvcmQzMiBzYW1wbGluZ1JhdGUsIFdvcmQxNiBibG9ja1R5cGUsIFdvcmQxNiogdG5zTWF4U2ZiKTsKLQotI2VuZGlmIC8qIF9UTlNfUEFSQU1fSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvdHJhbnNmb3JtLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy90cmFuc2Zvcm0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzExY2VmNS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy90cmFuc2Zvcm0uaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJdHJhbnNmb3JtLmgKLQotCUNvbnRlbnQ6CU1EQ1QgVHJhbnNmb3JtIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmICBfX1RSQU5TRk9STV9IX18KLSNkZWZpbmUgX19UUkFOU0ZPUk1fSF9fCi0KLSNpbmNsdWRlICJ0eXBlZGVmLmgiCi0KLXZvaWQgVHJhbnNmb3JtX1JlYWwoV29yZDE2ICptZGN0RGVsYXlCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqdGltZVNpZ25hbCwKLSAgICAgICAgICAgICAgICAgICAgV29yZDE2IGNoSW5jcmVtZW50LCAgICAgLyohIGNoYW5uZWwgaW5jcmVtZW50ICovCi0gICAgICAgICAgICAgICAgICAgIFdvcmQzMiAqcmVhbE91dCwKLSAgICAgICAgICAgICAgICAgICAgV29yZDE2ICptZGN0U2NhbGUsCi0gICAgICAgICAgICAgICAgICAgIFdvcmQxNiB3aW5kb3dTZXF1ZW5jZQotICAgICAgICAgICAgICAgICAgICApOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FhY19yb20uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FhY19yb20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA4ZjNhOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hYWNfcm9tLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYzICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJYWFjX3JvbS5jCi0KLQlDb250ZW50Ogljb25zdGFudCB0YWJsZXMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImFhY19yb20uaCIKLQotI2lmIGRlZmluZWQgKEFSTVY1RSkgJiYgIWRlZmluZWQgKEFSTVY3TmVvbikKLQotLyoKLSAqICBRMzAgZm9yIDEyOCBhbmQgMTAyNAotICoKLSAqIGZvciAoaSA9IDA7IGkgPCBudW0vNDsgaSsrKSB7Ci0gKiAgIGFuZ2xlID0gKGkgKyAwLjEyNSkgKiBNX1BJIC8gbnVtOwotICogICB4ID0gY29zKGFuZ2xlKSAqICgxIDw8IDMwKTsKLSAqICAgeCA9IHNpbihhbmdsZSkgKiAoMSA8PCAzMCk7Ci0gKgotICogICBhbmdsZSA9IChudW0vMiAtIDEgLSBpICsgMC4xMjUpICogTV9QSSAvIG51bTsKLSAqICAgeCA9IGNvcyhhbmdsZSkgKiAoMSA8PCAzMCk7Ci0gKiAgIHggPSBzaW4oYW5nbGUpICogKDEgPDwgMzApOwotICogfQotICovCi1jb25zdCBpbnQgY29zc2ludGFiWzEyOCArIDEwMjRdID0gewotCS8qIDEyOCAqLwotCTB4M2ZmZmVjNDMsIDB4MDAzMjQzZjEsIDB4MDE1ZmQ0ZDIsIDB4M2ZmYzM4ZDEsIDB4M2ZmOWMxM2EsIDB4MDFjNDU0ZjUsIDB4MDJmMWI3NTUsIDB4M2ZlZWE3NzYsCi0JMHgzZmU5YjhhOSwgMHgwMzU2MjAzOCwgMHgwNDgzMjU5ZCwgMHgzZmQ3M2E0YSwgMHgzZmNmZDUwYiwgMHgwNGU3NjdjNSwgMHgwNjEzZTFjNSwgMHgzZmI1ZjRlYSwKLQkweDNmYWMxYTViLCAweDA2NzdlZGJiLCAweDA3YTNhZGZmLCAweDNmOGFkYzc3LCAweDNmN2U4ZTFlLCAweDA4MDc3NDU3LCAweDA5MzI0Y2E3LCAweDNmNTVmNzk2LAotCTB4M2Y0NzM3NTksIDB4MDk5NWJkZmQsIDB4MGFiZjgwNDMsIDB4M2YxNzRlNzAsIDB4M2YwNjFlOTUsIDB4MGIyMjhkNDIsIDB4MGM0YjBiOTQsIDB4M2VjZWVhYWQsCi0JMHgzZWJiNGRkYiwgMHgwY2FkYTRmNSwgMHgwZGQ0YjE5YSwgMHgzZTdjZDc3OCwgMHgzZTY2ZDBiNCwgMHgwZTM2YzgyYSwgMHgwZjVjMzVhMywgMHgzZTIxMjE3OSwKLQkweDNlMDhiNDJhLCAweDBmYmRiYTQwLCAweDEwZTE1YjRlLCAweDNkYmJkNmQ0LCAweDNkYTEwNmJkLCAweDExNDIzZWYwLCAweDEyNjNlNjk5LCAweDNkNGQwNzI4LAotCTB4M2QyZmQ4NmMsIDB4MTJjNDFhNGYsIDB4MTNlMzliZTksIDB4M2NkNGMzOGIsIDB4M2NiNTNhYWEsIDB4MTQ0MzEwZGQsIDB4MTU2MDQwMTMsIDB4M2M1MzFlODgsCi0JMHgzYzMxNDA2MCwgMHgxNWJlZTc4YywgMHgxNmQ5OTg2NCwgMHgzYmM4MmMxZiwgMHgzYmEzZmRlNywgMHgxNzM3NjNjOSwgMHgxODRmNmFhYiwgMHgzYjM0MDFiYiwKLQkweDNiMGQ4OTA5LCAweDE4YWM0Yjg3LCAweDE5YzE3ZDQ0LCAweDNhOTZiNjM2LCAweDNhNmRmOGY4LCAweDFhMWQ2NTQ0LCAweDFiMmY5NzFlLCAweDM5ZjA2MWQyLAotCTB4MzljNTY2NGYsIDB4MWI4YTc4MTUsIDB4MWM5OTdmYzQsIDB4Mzk0MTFlMzMsIDB4MzkxM2ViMGUsIDB4MWNmMzRiYWYsIDB4MWRmZWZmNjcsIDB4Mzg4OTA2NjMsCi0JMHgzODU5YTI5MiwgMHgxZTU3YTg2ZCwgMHgxZjVmZGVlNiwgMHgzN2M4MzZjMiwgMHgzNzk2YTk5NiwgMHgxZmI3NTc1YywgMHgyMGJiZTdkOCwgMHgzNmZlY2QwZSwKLQkweDM2Y2IxZTJhLCAweDIxMTIyMjQwLCAweDIyMTJlNDkyLCAweDM2MmNlODU1LCAweDM1ZjcxZmIxLCAweDIyNjdkM2EwLCAweDIzNjRhMDJlLCAweDM1NTJhOGY0LAotCTB4MzUxYWNlZGQsIDB4MjNiODM2Y2EsIDB4MjRiMGU2OTksIDB4MzQ3MDMwOTUsIDB4MzQzNjRkYTYsIDB4MjUwMzE3ZGYsIDB4MjVmNzg0OTcsIDB4MzM4NWEyMjIsCi0JMHgzMzQ5YmY0OCwgMHgyNjQ4NDNkOSwgMHgyNzM4NDdjOCwgMHgzMjkzMjFjNywgMHgzMjU1NDg0MCwgMHgyNzg3ODg5MywgMHgyODcyZmViNiwgMHgzMTk4ZDRlYSwKLQkweDMxNTkwZTNlLCAweDI4YzBiNGQyLCAweDI5YTc3OGRiLCAweDMwOTZlMjIzLCAweDMwNTUzODI4LCAweDI5ZjM5ODRjLCAweDJhZDU4NmEzLCAweDJmOGQ3MTNhLAotCTB4MmY0OWVlMGYsIDB4MmIyMDAzYWMsIDB4MmJmY2Y5N2MsIDB4MmU3Y2FiMWMsIDB4MmUzNzU5MmMsIDB4MmM0NWM4YTAsIDB4MmQxZGEzZDUsIDB4MmQ2NGI5ZGEsCi0JLyogMTAyNCAqLwotCTB4M2ZmZmZmYjEsIDB4MDAwNjQ4N2YsIDB4MDAyYmZiNzQsIDB4M2ZmZmYwZTMsIDB4M2ZmZmU3MDUsIDB4MDAzODhjNmUsIDB4MDA1ZTNmNGMsIDB4M2ZmZmJhOWIsCi0JMHgzZmZmYTZkZSwgMHgwMDZhZDAzYiwgMHgwMDkwODJlYSwgMHgzZmZmNWNkOCwgMHgzZmZmM2YzYywgMHgwMDlkMTNjNSwgMHgwMGMyYzYyZiwgMHgzZmZlZDc5YiwKLQkweDNmZmViMDIxLCAweDAwY2Y1NmVmLCAweDAwZjUwOGZjLCAweDNmZmUyYWU1LCAweDNmZmRmOThjLCAweDAxMDE5OTk4LCAweDAxMjc0YjMxLCAweDNmZmQ1NmI1LAotCTB4M2ZmZDFiN2UsIDB4MDEzM2RiYTMsIDB4MDE1OThjYjEsIDB4M2ZmYzViMGMsIDB4M2ZmYzE1ZjcsIDB4MDE2NjFjZjAsIDB4MDE4YmNkNWIsIDB4M2ZmYjM3ZWMsCi0JMHgzZmZhZThmOSwgMHgwMTk4NWQ2MCwgMHgwMWJlMGQxMSwgMHgzZmY5ZWQ1MywgMHgzZmY5OTQ4MywgMHgwMWNhOWNkNCwgMHgwMWYwNGJiNCwgMHgzZmY4N2I0NCwKLQkweDNmZjgxODk2LCAweDAxZmNkYjJlLCAweDAyMjI4OTI0LCAweDNmZjZlMWJmLCAweDNmZjY3NTM0LCAweDAyMmYxODRkLCAweDAyNTRjNTQ0LCAweDNmZjUyMGM1LAotCTB4M2ZmNGFhNWQsIDB4MDI2MTU0MTQsIDB4MDI4NmZmZjMsIDB4M2ZmMzM4NTgsIDB4M2ZmMmI4MTMsIDB4MDI5MzhlNjIsIDB4MDJiOTM5MTQsIDB4M2ZmMTI4NzgsCi0JMHgzZmYwOWU1NiwgMHgwMmM1YzcxYSwgMHgwMmViNzA4NiwgMHgzZmVlZjEyNiwgMHgzZmVlNWQyOCwgMHgwMmY3ZmUxYywgMHgwMzFkYTYyYiwgMHgzZmVjOTI2NSwKLQkweDNmZWJmNDhiLCAweDAzMmEzMzQ5LCAweDAzNGZkOWU1LCAweDNmZWEwYzM1LCAweDNmZTk2NDgwLCAweDAzNWM2NjgyLCAweDAzODIwYjkzLCAweDNmZTc1ZTk4LAotCTB4M2ZlNmFkMDgsIDB4MDM4ZTk3YTksIDB4MDNiNDNiMTcsIDB4M2ZlNDg5OTAsIDB4M2ZlM2NlMjYsIDB4MDNjMGM2OWUsIDB4MDNlNjY4NTIsIDB4M2ZlMThkMWYsCi0JMHgzZmUwYzdkYSwgMHgwM2YyZjM0MiwgMHgwNDE4OTMyNiwgMHgzZmRlNjk0NSwgMHgzZmRkOWEyNywgMHgwNDI1MWQ3NywgMHgwNDRhYmI3MywgMHgzZmRiMWUwNiwKLQkweDNmZGE0NTBmLCAweDA0NTc0NTFkLCAweDA0N2NlMTFhLCAweDNmZDdhYjY0LCAweDNmZDZjODk0LCAweDA0ODk2YTE2LCAweDA0YWYwM2ZjLCAweDNmZDQxMTVmLAotCTB4M2ZkMzI0YjcsIDB4MDRiYjhjNDIsIDB4MDRlMTIzZmEsIDB4M2ZkMDRmZmMsIDB4M2ZjZjU5N2MsIDB4MDRlZGFiODMsIDB4MDUxMzQwZjYsIDB4M2ZjYzY3M2IsCi0JMHgzZmNiNjZlNCwgMHgwNTFmYzdiOSwgMHgwNTQ1NWFkMSwgMHgzZmM4NTcxZiwgMHgzZmM3NGNmMywgMHgwNTUxZTBjNywgMHgwNTc3NzE2YiwgMHgzZmM0MWZhYywKLQkweDNmYzMwYmFhLCAweDA1ODNmNjhjLCAweDA1YTk4NGE2LCAweDNmYmZjMGUzLCAweDNmYmVhMzBjLCAweDA1YjYwOGViLCAweDA1ZGI5NDYzLCAweDNmYmIzYWM3LAotCTB4M2ZiYTEzMWIsIDB4MDVlODE3YzMsIDB4MDYwZGEwODMsIDB4M2ZiNjhkNWIsIDB4M2ZiNTViZGMsIDB4MDYxYTIyZjcsIDB4MDYzZmE4ZTcsIDB4M2ZiMWI4YTIsCi0JMHgzZmIwN2Q1MCwgMHgwNjRjMmE2NywgMHgwNjcxYWQ3MSwgMHgzZmFjYmM5ZiwgMHgzZmFiNzc3YiwgMHgwNjdlMmRmNSwgMHgwNmEzYWUwMCwgMHgzZmE3OTk1NCwKLQkweDNmYTY0YTVmLCAweDA2YjAyZDgxLCAweDA2ZDVhYTc3LCAweDNmYTI0ZWM2LCAweDNmYTBmNjAwLCAweDA2ZTIyOGVlLCAweDA3MDdhMmI3LCAweDNmOWNkY2Y3LAotCTB4M2Y5YjdhNjIsIDB4MDcxNDIwMWIsIDB4MDczOTk2YTEsIDB4M2Y5NzQzZWIsIDB4M2Y5NWQ3ODcsIDB4MDc0NjEyZWIsIDB4MDc2Yjg2MTYsIDB4M2Y5MTgzYTUsCi0JMHgzZjkwMGQ3MiwgMHgwNzc4MDEzZCwgMHgwNzlkNzBmNywgMHgzZjhiOWMyOCwgMHgzZjhhMWMyOSwgMHgwN2E5ZWFmNSwgMHgwN2NmNTcyNiwgMHgzZjg1OGQ3OSwKLQkweDNmODQwM2FlLCAweDA3ZGJjZmYyLCAweDA4MDEzODgzLCAweDNmN2Y1NzliLCAweDNmN2RjNDA1LCAweDA4MGRiMDE2LCAweDA4MzMxNGYxLCAweDNmNzhmYTkyLAotCTB4M2Y3NzVkMzEsIDB4MDgzZjhiNDMsIDB4MDg2NGVjNGYsIDB4M2Y3Mjc2NjEsIDB4M2Y3MGNmMzgsIDB4MDg3MTYxNTksIDB4MDg5NmJlODAsIDB4M2Y2YmNiMGUsCi0JMHgzZjZhMWExYywgMHgwOGEzMzIzYSwgMHgwOGM4OGI2NSwgMHgzZjY0Zjg5YiwgMHgzZjYzM2RlMiwgMHgwOGQ0ZmRjNiwgMHgwOGZhNTJkZSwgMHgzZjVkZmYwZSwKLQkweDNmNWMzYThmLCAweDA5MDZjM2UwLCAweDA5MmMxNGNlLCAweDNmNTZkZTZhLCAweDNmNTUxMDI2LCAweDA5Mzg4NDY5LCAweDA5NWRkMTE2LCAweDNmNGY5NmI0LAotCTB4M2Y0ZGJlYWMsIDB4MDk2YTNmNDIsIDB4MDk4Zjg3OTYsIDB4M2Y0ODI3ZjAsIDB4M2Y0NjQ2MjYsIDB4MDk5YmY0NGMsIDB4MDljMTM4MzEsIDB4M2Y0MDkyMjMsCi0JMHgzZjNlYTY5NywgMHgwOWNkYTM2OCwgMHgwOWYyZTJjNywgMHgzZjM4ZDU1MiwgMHgzZjM2ZTAwNiwgMHgwOWZmNGM3OCwgMHgwYTI0ODczYSwgMHgzZjMwZjE4MSwKLQkweDNmMmVmMjc2LCAweDBhMzBlZjVlLCAweDBhNTYyNTZjLCAweDNmMjhlNmI2LCAweDNmMjZkZGVjLCAweDBhNjI4YmZhLCAweDBhODdiZDNkLCAweDNmMjBiNGY1LAotCTB4M2YxZWEyNmUsIDB4MGE5NDIyMmYsIDB4MGFiOTRlOGYsIDB4M2YxODVjNDMsIDB4M2YxNjQwMDEsIDB4MGFjNWIxZGMsIDB4MGFlYWQ5NDQsIDB4M2YwZmRjYTUsCi0JMHgzZjBkYjZhOSwgMHgwYWY3M2FlNSwgMHgwYjFjNWQzZCwgMHgzZjA3MzYyMSwgMHgzZjA1MDY2ZCwgMHgwYjI4YmQyYSwgMHgwYjRkZGE1YywgMHgzZWZlNjhiYywKLQkweDNlZmMyZjUwLCAweDBiNWEzODhkLCAweDBiN2Y1MDgxLCAweDNlZjU3NDdiLCAweDNlZjMzMTVhLCAweDBiOGJhY2YwLCAweDBiYjBiZjhmLCAweDNlZWM1OTY1LAotCTB4M2VlYTBjOGUsIDB4MGJiZDFhMzMsIDB4MGJlMjI3NjYsIDB4M2VlMzE3N2UsIDB4M2VlMGMwZjQsIDB4MGJlZTgwMzgsIDB4MGMxMzg3ZTksIDB4M2VkOWFlY2MsCi0JMHgzZWQ3NGU5MSwgMHgwYzFmZGVlMSwgMHgwYzQ0ZTBmOSwgMHgzZWQwMWY1NSwgMHgzZWNkYjU2YSwgMHgwYzUxMzYxMCwgMHgwYzc2MzI3OCwgMHgzZWM2NjkyMCwKLQkweDNlYzNmNTg1LCAweDBjODI4NWE1LCAweDBjYTc3YzQ3LCAweDNlYmM4YzMxLCAweDNlYmEwZWU5LCAweDBjYjNjZDg0LCAweDBjZDhiZTQ3LCAweDNlYjI4ODhmLAotCTB4M2ViMDAxOWMsIDB4MGNlNTBkOGMsIDB4MGQwOWY4NWIsIDB4M2VhODVlNDEsIDB4M2VhNWNkYTMsIDB4MGQxNjQ1YTAsIDB4MGQzYjJhNjQsIDB4M2U5ZTBkNGMsCi0JMHgzZTliNzMwNiwgMHgwZDQ3NzVhMSwgMHgwZDZjNTQ0MywgMHgzZTkzOTViNywgMHgzZTkwZjFjYSwgMHgwZDc4OWQ3MSwgMHgwZDlkNzVkYiwgMHgzZTg4Zjc4OCwKLQkweDNlODY0OWY1LCAweDBkYTliY2YyLCAweDBkY2U4ZjBkLCAweDNlN2UzMmM2LCAweDNlN2I3YjkwLCAweDBkZGFkNDA2LCAweDBkZmY5ZmJhLCAweDNlNzM0Nzc4LAotCTB4M2U3MDg2OWYsIDB4MGUwYmUyOGUsIDB4MGUzMGE3YzUsIDB4M2U2ODM1YTQsIDB4M2U2NTZiMmIsIDB4MGUzY2U4NmIsIDB4MGU2MWE3MGYsIDB4M2U1Y2ZkNTEsCi0JMHgzZTVhMjkzOSwgMHgwZTZkZTU4MCwgMHgwZTkyOWQ3YSwgMHgzZTUxOWU4NiwgMHgzZTRlYzBkMSwgMHgwZTllZDlhZiwgMHgwZWMzOGFlOCwgMHgzZTQ2MTk0YSwKLQkweDNlNDMzMWZhLCAweDBlY2ZjNGQ5LCAweDBlZjQ2ZjNiLCAweDNlM2E2ZGE0LCAweDNlMzc3Y2JiLCAweDBmMDBhNmRmLCAweDBmMjU0YTUzLCAweDNlMmU5YjljLAotCTB4M2UyYmExMWIsIDB4MGYzMTdmYTUsIDB4MGY1NjFjMTUsIDB4M2UyMmEzMzgsIDB4M2UxZjlmMjEsIDB4MGY2MjRmMGMsIDB4MGY4NmU0NjAsIDB4M2UxNjg0ODAsCi0JMHgzZTEzNzZkNSwgMHgwZjkzMTRmNSwgMHgwZmI3YTMxNywgMHgzZTBhM2Y3YiwgMHgzZTA3MjgzZiwgMHgwZmMzZDE0MywgMHgwZmU4NTgxZCwgMHgzZGZkZDQzMiwKLQkweDNkZmFiMzY1LCAweDBmZjQ4M2Q3LCAweDEwMTkwMzUyLCAweDNkZjE0MmFiLCAweDNkZWUxODUxLCAweDEwMjUyYzk0LCAweDEwNDlhNDlhLCAweDNkZTQ4YWVmLAotCTB4M2RlMTU3MDgsIDB4MTA1NWNiNWIsIDB4MTA3YTNiZDUsIDB4M2RkN2FkMDUsIDB4M2RkNDZmOTQsIDB4MTA4NjYwMGUsIDB4MTBhYWM4ZTYsIDB4M2RjYWE4ZjUsCi0JMHgzZGM3NjFmYywgMHgxMGI2ZWE5MCwgMHgxMGRiNGJhZiwgMHgzZGJkN2VjNywgMHgzZGJhMmU0OCwgMHgxMGU3NmFjMywgMHgxMTBiYzQxMywgMHgzZGIwMmU4NCwKLQkweDNkYWNkNDgxLCAweDExMTdlMDg4LCAweDExM2MzMWYzLCAweDNkYTJiODM0LCAweDNkOWY1NGFmLCAweDExNDg0YmMyLCAweDExNmM5NTMxLCAweDNkOTUxYmRlLAotCTB4M2Q5MWFlZDksIDB4MTE3OGFjNTMsIDB4MTE5Y2VkYWYsIDB4M2Q4NzU5OGMsIDB4M2Q4M2UzMDksIDB4MTFhOTAyMWQsIDB4MTFjZDNiNTAsIDB4M2Q3OTcxNDUsCi0JMHgzZDc1ZjE0NywgMHgxMWQ5NGQwMiwgMHgxMWZkN2RmNiwgMHgzZDZiNjMxMywgMHgzZDY3ZDk5YiwgMHgxMjA5OGNlNSwgMHgxMjJkYjU4MywgMHgzZDVkMmVmZSwKLQkweDNkNTk5YzBlLCAweDEyMzljMWE3LCAweDEyNWRlMWRhLCAweDNkNGVkNTBmLCAweDNkNGIzOGFhLCAweDEyNjllYjJiLCAweDEyOGUwMmRjLCAweDNkNDA1NTRlLAotCTB4M2QzY2FmNzYsIDB4MTI5YTA5NTQsIDB4MTJiZTE4NmMsIDB4M2QzMWFmYzUsIDB4M2QyZTAwN2MsIDB4MTJjYTFjMDMsIDB4MTJlZTIyNmMsIDB4M2QyMmU0N2MsCi0JMHgzZDFmMmJjNSwgMHgxMmZhMjMxYiwgMHgxMzFlMjBjMCwgMHgzZDEzZjM3ZSwgMHgzZDEwMzE1YSwgMHgxMzJhMWU3ZSwgMHgxMzRlMTM0OCwgMHgzZDA0ZGNkMiwKLQkweDNkMDExMTQ1LCAweDEzNWEwZTBlLCAweDEzN2RmOWU3LCAweDNjZjVhMDgyLCAweDNjZjFjYjhlLCAweDEzODlmMWFmLCAweDEzYWRkNDgxLCAweDNjZTYzZTk4LAotCTB4M2NlMjYwM2YsIDB4MTNiOWM5NDMsIDB4MTNkZGEyZjcsIDB4M2NkNmI3MWUsIDB4M2NkMmNmNjIsIDB4MTNlOTk0YWIsIDB4MTQwZDY1MmMsIDB4M2NjNzBhMWMsCi0JMHgzY2MzMThmZiwgMHgxNDE5NTNjYiwgMHgxNDNkMWIwMiwgMHgzY2I3Mzc5YywgMHgzY2IzM2QyMiwgMHgxNDQ5MDY4NSwgMHgxNDZjYzQ1YywgMHgzY2E3M2ZhOSwKLQkweDNjYTMzYmQzLCAweDE0NzhhY2JjLCAweDE0OWM2MTFkLCAweDNjOTcyMjRjLCAweDNjOTMxNTFkLCAweDE0YTg0NjUyLCAweDE0Y2JmMTI3LCAweDNjODZkZjhlLAotCTB4M2M4MmM5MDksIDB4MTRkN2QzMmEsIDB4MTRmYjc0NWUsIDB4M2M3Njc3N2IsIDB4M2M3MjU3YTIsIDB4MTUwNzUzMjcsIDB4MTUyYWVhYTMsIDB4M2M2NWVhMWMsCi0JMHgzYzYxYzBmMSwgMHgxNTM2YzYyYiwgMHgxNTVhNTNkOSwgMHgzYzU1Mzc3YiwgMHgzYzUxMDUwMSwgMHgxNTY2MmMxOCwgMHgxNTg5YWZlMywgMHgzYzQ0NWZhMiwKLQkweDNjNDAyM2RkLCAweDE1OTU4NGQzLCAweDE1YjhmZWE0LCAweDNjMzM2MjlkLCAweDNjMmYxZDhlLCAweDE1YzRkMDNlLCAweDE1ZTgzZmZmLCAweDNjMjI0MDc1LAotCTB4M2MxZGYyMWYsIDB4MTVmNDBlM2EsIDB4MTYxNzczZDYsIDB4M2MxMGY5MzUsIDB4M2MwY2ExOWIsIDB4MTYyMzNlYWMsIDB4MTY0NjlhMGQsIDB4M2JmZjhjZTgsCi0JMHgzYmZiMmMwYywgMHgxNjUyNjE3NiwgMHgxNjc1YjI4NiwgMHgzYmVkZmI5OSwgMHgzYmU5OTE3ZSwgMHgxNjgxNzY3YywgMHgxNmE0YmQyNSwgMHgzYmRjNDU1MiwKLQkweDNiZDdkMWZhLCAweDE2YjA3ZDlmLCAweDE2ZDNiOWNjLCAweDNiY2E2YTFkLCAweDNiYzVlZDhkLCAweDE2ZGY3NmMzLCAweDE3MDJhODVlLCAweDNiYjg2YTA4LAotCTB4M2JiM2U0NDAsIDB4MTcwZTYxY2MsIDB4MTczMTg4YmUsIDB4M2JhNjQ1MWIsIDB4M2JhMWI2MjAsIDB4MTczZDNlOWIsIDB4MTc2MDVhZDAsIDB4M2I5M2ZiNjMsCi0JMHgzYjhmNjMzNywgMHgxNzZjMGQxNSwgMHgxNzhmMWU3NiwgMHgzYjgxOGNlYiwgMHgzYjdjZWI5MCwgMHgxNzlhY2QxYywgMHgxN2JkZDM5NCwgMHgzYjZlZjliZSwKLQkweDNiNmE0ZjM4LCAweDE3Yzk3ZTkzLCAweDE3ZWM3YTBkLCAweDNiNWM0MWU4LCAweDNiNTc4ZTM5LCAweDE3ZjgyMTVlLCAweDE4MWIxMWM0LCAweDNiNDk2NTc0LAotCTB4M2I0NGE4YTAsIDB4MTgyNmI1NjEsIDB4MTg0OTlhOWQsIDB4M2IzNjY0NmUsIDB4M2IzMTllNzcsIDB4MTg1NTNhN2QsIDB4MTg3ODE0N2EsIDB4M2IyMzNlZTEsCi0JMHgzYjFlNmZjYSwgMHgxODgzYjA5NywgMHgxOGE2N2YzZiwgMHgzYjBmZjRkOSwgMHgzYjBiMWNhNiwgMHgxOGIyMTc5MSwgMHgxOGQ0ZGFkMCwgMHgzYWZjODY2MywKLQkweDNhZjdhNTE2LCAweDE4ZTA2ZjUwLCAweDE5MDMyNzBmLCAweDNhZThmMzhiLCAweDNhZTQwOTI2LCAweDE5MGViN2I3LCAweDE5MzE2M2UxLCAweDNhZDUzYzViLAotCTB4M2FkMDQ4ZTMsIDB4MTkzY2YwYTksIDB4MTk1ZjkxMjgsIDB4M2FjMTYwZTEsIDB4M2FiYzY0NTgsIDB4MTk2YjFhMDksIDB4MTk4ZGFlYzgsIDB4M2FhZDYxMjksCi0JMHgzYWE4NWI5MiwgMHgxOTk5MzNiYiwgMHgxOWJiYmNhNiwgMHgzYTk5M2QzZSwgMHgzYTk0MmU5ZCwgMHgxOWM3M2RhMywgMHgxOWU5YmFhMywgMHgzYTg0ZjUyZiwKLQkweDNhN2ZkZDg2LCAweDE5ZjUzN2E0LCAweDFhMTdhOGE1LCAweDNhNzA4OTA2LCAweDNhNmI2ODU5LCAweDFhMjMyMWEyLCAweDFhNDU4NjhlLCAweDNhNWJmOGQxLAotCTB4M2E1NmNmMjMsIDB4MWE1MGZiODEsIDB4MWE3MzU0NDIsIDB4M2E0NzQ0OWMsIDB4M2E0MjExZjAsIDB4MWE3ZWM1MjQsIDB4MWFhMTExYTYsIDB4M2EzMjZjNzQsCi0JMHgzYTJkMzBjZCwgMHgxYWFjN2U2ZiwgMHgxYWNlYmU5ZCwgMHgzYTFkNzA2NiwgMHgzYTE4MmJjOCwgMHgxYWRhMjc0NiwgMHgxYWZjNWIwYSwgMHgzYTA4NTA3ZiwKLQkweDNhMDMwMmVkLCAweDFiMDdiZjhjLCAweDFiMjllNmQyLCAweDM5ZjMwY2NjLCAweDM5ZWRiNjQ5LCAweDFiMzU0NzI3LCAweDFiNTc2MWQ4LCAweDM5ZGRhNTVhLAotCTB4MzlkODQ1ZTksIDB4MWI2MmJkZjgsIDB4MWI4NGNjMDEsIDB4MzljODFhMzYsIDB4MzljMmIxZGEsIDB4MWI5MDIzZTUsIDB4MWJiMjI1MzAsIDB4MzliMjZiNmQsCi0JMHgzOWFjZmEyYiwgMHgxYmJkNzhkMiwgMHgxYmRmNmQ0YSwgMHgzOTljOTkwZCwgMHgzOTk3MWVlNywgMHgxYmVhYmNhMSwgMHgxYzBjYTQzMiwgMHgzOTg2YTMyNCwKLQkweDM5ODEyMDFlLCAweDFjMTdlZjM5LCAweDFjMzljOWNkLCAweDM5NzA4OWJmLCAweDM5NmFmZGRjLCAweDFjNDUxMDdjLCAweDFjNjZkZGZlLCAweDM5NWE0Y2ViLAotCTB4Mzk1NGI4MmUsIDB4MWM3MjIwNGYsIDB4MWM5M2UwYWIsIDB4Mzk0M2VjYjYsIDB4MzkzZTRmMjMsIDB4MWM5ZjFlOTYsIDB4MWNjMGQxYjYsIDB4MzkyZDY5MmYsCi0JMHgzOTI3YzJjOSwgMHgxY2NjMGIzNSwgMHgxY2VkYjEwNiwgMHgzOTE2YzI2MiwgMHgzOTExMTMyZCwgMHgxY2Y4ZTYxMSwgMHgxZDFhN2U3ZCwgMHgzOGZmZjg1ZSwKLQkweDM4ZmE0MDVlLCAweDFkMjVhZjBkLCAweDFkNDczYTAwLCAweDM4ZTkwYjMxLCAweDM4ZTM0YTY5LCAweDFkNTI2NjBmLCAweDFkNzNlMzc0LCAweDM4ZDFmYWU5LAotCTB4MzhjYzMxNWQsIDB4MWQ3ZjBhZmIsIDB4MWRhMDdhYmMsIDB4MzhiYWM3OTUsIDB4MzhiNGY1NDcsIDB4MWRhYjlkYjUsIDB4MWRjY2ZmYmYsIDB4MzhhMzcxNDIsCi0JMHgzODlkOTYzNywgMHgxZGQ4MWUyMSwgMHgxZGY5NzI1ZiwgMHgzODhiZjdmZiwgMHgzODg2MTQzYiwgMHgxZTA0OGMyNCwgMHgxZTI1ZDI4MiwgMHgzODc0NWJkYiwKLQkweDM4NmU2ZjYwLCAweDFlMzBlN2E0LCAweDFlNTIyMDBjLCAweDM4NWM5Y2UzLCAweDM4NTZhN2I2LCAweDFlNWQzMDg0LCAweDFlN2U1YWUyLCAweDM4NDRiYjI4LAotCTB4MzgzZWJkNGMsIDB4MWU4OTY2YTgsIDB4MWVhYTgyZTksIDB4MzgyY2I2YjcsIDB4MzgyNmIwMzAsIDB4MWViNTg5ZjcsIDB4MWVkNjk4MDUsIDB4MzgxNDhmOWYsCi0JMHgzODBlODA3MSwgMHgxZWUxOWE1NCwgMHgxZjAyOWExYywgMHgzN2ZjNDVlZiwgMHgzN2Y2MmUxZCwgMHgxZjBkOTdhNSwgMHgxZjJlODkxMSwgMHgzN2UzZDliNywKLQkweDM3ZGRiOTQ1LCAweDFmMzk4MWNlLCAweDFmNWE2NGNiLCAweDM3Y2I0YjA0LCAweDM3YzUyMWY2LCAweDFmNjU1OGI1LCAweDFmODYyZDJkLCAweDM3YjI5OWU3LAotCTB4MzdhYzY4NDEsIDB4MWY5MTFjM2QsIDB4MWZiMWUyMWQsIDB4Mzc5OWM2NmYsIDB4Mzc5MzhjMzQsIDB4MWZiY2NjNGQsIDB4MWZkZDgzODEsIDB4Mzc4MGQwYWEsCi0JMHgzNzdhOGRkZiwgMHgxZmU4NjhjOCwgMHgyMDA5MTEzYywgMHgzNzY3YjhhOSwgMHgzNzYxNmQ1MSwgMHgyMDEzZjE5NiwgMHgyMDM0OGIzNSwgMHgzNzRlN2U3YiwKLQkweDM3NDgyYTlhLCAweDIwM2Y2Njk5LCAweDIwNWZmMTRmLCAweDM3MzUyMjJmLCAweDM3MmVjNWM5LCAweDIwNmFjN2I4LCAweDIwOGI0MzcyLCAweDM3MWJhM2Q0LAotCTB4MzcxNTNlZWUsIDB4MjA5NjE0ZDksIDB4MjBiNjgxODEsIDB4MzcwMjAzN2MsIDB4MzZmYjk2MTgsIDB4MjBjMTRkZGYsIDB4MjBlMWFiNjMsIDB4MzZlODQxMzUsCi0JMHgzNmUxY2I1OCwgMHgyMGVjNzJiMSwgMHgyMTBjYzBmYywgMHgzNmNlNWQxMCwgMHgzNmM3ZGViZCwgMHgyMTE3ODMzNCwgMHgyMTM3YzIzMiwgMHgzNmI0NTcxYiwKLQkweDM2YWRkMDU4LCAweDIxNDI3ZjRkLCAweDIxNjJhZWVhLCAweDM2OWEyZjY5LCAweDM2OTNhMDM4LCAweDIxNmQ2NmUyLCAweDIxOGQ4NzBiLCAweDM2N2ZlNjA4LAotCTB4MzY3OTRlNmUsIDB4MjE5ODM5ZDgsIDB4MjFiODRhNzksIDB4MzY2NTdiMDgsIDB4MzY1ZWRiMDksIDB4MjFjMmY4MTUsIDB4MjFlMmY5MWEsIDB4MzY0YWVlN2IsCi0JMHgzNjQ0NDYxYiwgMHgyMWVkYTE3ZiwgMHgyMjBkOTJkNCwgMHgzNjMwNDA3MCwgMHgzNjI5OGZiNCwgMHgyMjE4MzVmYiwgMHgyMjM4MTc4ZCwgMHgzNjE1NzBmOCwKLQkweDM2MGViN2UzLCAweDIyNDJiNTZmLCAweDIyNjI4NzI5LCAweDM1ZmE4MDIzLCAweDM1ZjNiZWJhLCAweDIyNmQxZmMxLCAweDIyOGNlMTkxLCAweDM1ZGY2ZTAzLAotCTB4MzVkOGE0NDksIDB4MjI5Nzc0ZDcsIDB4MjJiNzI2YTgsIDB4MzVjNDNhYTcsIDB4MzViZDY4YTEsIDB4MjJjMWI0OTYsIDB4MjJlMTU2NTUsIDB4MzVhOGU2MjEsCi0JMHgzNWEyMGJkMywgMHgyMmViZGVlNSwgMHgyMzBiNzA3ZSwgMHgzNThkNzA4MSwgMHgzNTg2OGRlZiwgMHgyMzE1ZjNhOCwgMHgyMzM1NzUwOSwgMHgzNTcxZDlkOSwKLQkweDM1NmFlZjA4LCAweDIzM2ZmMmM4LCAweDIzNWY2M2RjLCAweDM1NTYyMjM5LCAweDM1NGYyZjJjLCAweDIzNjlkYzI5LCAweDIzODkzY2RkLCAweDM1M2E0OWIyLAotCTB4MzUzMzRlNmYsIDB4MjM5M2FmYjIsIDB4MjNiMmZmZjMsIDB4MzUxZTUwNTYsIDB4MzUxNzRjZTAsIDB4MjNiZDZkNDgsIDB4MjNkY2FkMDMsIDB4MzUwMjM2MzYsCi0JMHgzNGZiMmE5MiwgMHgyM2U3MTRkMywgMHgyNDA2NDNmNCwgMHgzNGU1ZmI2MywgMHgzNGRlZTc5NSwgMHgyNDEwYTYzOSwgMHgyNDJmYzRhZCwgMHgzNGM5OWZlZiwKLQkweDM0YzI4M2ZiLCAweDI0M2EyMTVmLCAweDI0NTkyZjEzLCAweDM0YWQyM2ViLCAweDM0YTVmZmQ1LCAweDI0NjM4NjJjLCAweDI0ODI4MzBkLCAweDM0OTA4NzY4LAotCTB4MzQ4OTViMzYsIDB4MjQ4Y2Q0ODcsIDB4MjRhYmMwODIsIDB4MzQ3M2NhNzksIDB4MzQ2Yzk2MmYsIDB4MjRiNjBjNTcsIDB4MjRkNGU3NTcsIDB4MzQ1NmVkMmYsCi0JMHgzNDRmYjBkMSwgMHgyNGRmMmQ4MSwgMHgyNGZkZjc3NSwgMHgzNDM5ZWY5YywgMHgzNDMyYWIyZSwgMHgyNTA4MzdlZCwgMHgyNTI2ZjBjMSwgMHgzNDFjZDFkMiwKLQkweDM0MTU4NTU5LCAweDI1MzEyYjgxLCAweDI1NGZkMzIzLCAweDMzZmY5M2UyLCAweDMzZjgzZjYyLCAweDI1NWEwODIzLCAweDI1Nzg5ZTgwLCAweDMzZTIzNWRmLAotCTB4MzNkYWQ5NWUsIDB4MjU4MmNkYmMsIDB4MjVhMTUyYzAsIDB4MzNjNGI3ZGIsIDB4MzNiZDUzNWMsIDB4MjVhYjdjMzAsIDB4MjVjOWVmY2EsIDB4MzNhNzE5ZTgsCi0JMHgzMzlmYWQ3MCwgMHgyNWQ0MTM2OSwgMHgyNWYyNzU4NCwgMHgzMzg5NWMxOCwgMHgzMzgxZTdhYywgMHgyNWZjOTM0YiwgMHgyNjFhZTNkNiwgMHgzMzZiN2U3ZSwKLQkweDMzNjQwMjIzLCAweDI2MjRmYmJmLCAweDI2NDMzYWE3LCAweDMzNGQ4MTJkLCAweDMzNDVmY2U2LCAweDI2NGQ0Y2FjLCAweDI2NmI3OWRkLCAweDMzMmY2NDM1LAotCTB4MzMyN2Q4MDgsIDB4MjY3NTg1ZjgsIDB4MjY5M2ExNjEsIDB4MzMxMTI3YWIsIDB4MzMwOTkzOWMsIDB4MjY5ZGE3OGIsIDB4MjZiYmIxMTksIDB4MzJmMmNiYTEsCi0JMHgzMmViMmZiNSwgMHgyNmM1YjE0YywgMHgyNmUzYThlYywgMHgzMmQ0NTAyOSwgMHgzMmNjYWM2NCwgMHgyNmVkYTMyMiwgMHgyNzBiODhjMiwgMHgzMmI1YjU1NywKLQkweDMyYWUwOWJlLCAweDI3MTU3Y2Y1LCAweDI3MzM1MDgyLCAweDMyOTZmYjNkLCAweDMyOGY0N2Q1LCAweDI3M2QzZWFjLCAweDI3NWIwMDE0LCAweDMyNzgyMWVlLAotCTB4MzI3MDY2YmMsIDB4Mjc2NGU4MmYsIDB4Mjc4Mjk3NjAsIDB4MzI1OTI5N2QsIDB4MzI1MTY2ODYsIDB4Mjc4Yzc5NjUsIDB4MjdhYTE2NGMsIDB4MzIzYTExZmUsCi0JMHgzMjMyNDc0NiwgMHgyN2IzZjIzNSwgMHgyN2QxN2NjMSwgMHgzMjFhZGI4MywgMHgzMjEzMDkwZiwgMHgyN2RiNTI4OCwgMHgyN2Y4Y2FhNSwgMHgzMWZiODYyMCwKLQkweDMxZjNhYmY1LCAweDI4MDI5YTQ1LCAweDI4MWZmZmUyLCAweDMxZGMxMWU4LCAweDMxZDQzMDBiLCAweDI4MjljOTU0LCAweDI4NDcxYzVlLCAweDMxYmM3ZWVlLAotCTB4MzFiNDk1NjQsIDB4Mjg1MGRmOWQsIDB4Mjg2ZTIwMDIsIDB4MzE5Y2NkNDYsIDB4MzE5NGRjMTQsIDB4Mjg3N2RkMDcsIDB4Mjg5NTBhYjYsIDB4MzE3Y2ZkMDQsCi0JMHgzMTc1MDQyZSwgMHgyODllYzE3YSwgMHgyOGJiZGM2MSwgMHgzMTVkMGUzYiwgMHgzMTU1MGRjNiwgMHgyOGM1OGNkZiwgMHgyOGUyOTRlYiwgMHgzMTNkMDBmZiwKLQkweDMxMzRmOGYxLCAweDI4ZWMzZjFlLCAweDI5MDkzNDNlLCAweDMxMWNkNTY0LCAweDMxMTRjNWMwLCAweDI5MTJkODFmLCAweDI5MmZiYTQwLCAweDMwZmM4YjdkLAotCTB4MzBmNDc0NDksIDB4MjkzOTU3YzksIDB4Mjk1NjI2ZGEsIDB4MzBkYzIzNWUsIDB4MzBkNDA0YTAsIDB4Mjk1ZmJlMDYsIDB4Mjk3Yzc5ZjUsIDB4MzBiYjlkMWMsCi0JMHgzMGIzNzZkOCwgMHgyOTg2MGFiZCwgMHgyOWEyYjM3OCwgMHgzMDlhZjhjYSwgMHgzMDkyY2IwNSwgMHgyOWFjM2RkNywgMHgyOWM4ZDM0ZCwgMHgzMDdhMzY3YywKLQkweDMwNzIwMTNjLCAweDI5ZDI1NzNjLCAweDI5ZWVkOTViLCAweDMwNTk1NjQ4LCAweDMwNTExOTkxLCAweDI5Zjg1NmQ1LCAweDJhMTRjNThiLCAweDMwMzg1ODQwLAotCTB4MzAzMDE0MTgsIDB4MmExZTNjOGEsIDB4MmEzYTk3YzcsIDB4MzAxNzNjN2EsIDB4MzAwZWYwZTUsIDB4MmE0NDA4NDQsIDB4MmE2MDRmZjUsIDB4MmZmNjAzMGEsCi0JMHgyZmVkYjAwZCwgMHgyYTY5YjllYywgMHgyYTg1ZWUwMCwgMHgyZmQ0YWMwNCwgMHgyZmNjNTFhNSwgMHgyYThmNTE2YiwgMHgyYWFiNzFkMCwgMHgyZmIzMzc3YywKLQkweDJmYWFkNWMxLCAweDJhYjRjZWE5LCAweDJhZDBkYjRlLCAweDJmOTFhNTg5LCAweDJmODkzYzc1LCAweDJhZGEzMThlLCAweDJhZjYyYTYzLCAweDJmNmZmNjNkLAotCTB4MmY2Nzg1ZDcsIDB4MmFmZjdhMDUsIDB4MmIxYjVlZjgsIDB4MmY0ZTI5YWYsIDB4MmY0NWIxZmIsIDB4MmIyNGE3ZjYsIDB4MmI0MDc4ZjUsIDB4MmYyYzNmZjIsCi0JMHgyZjIzYzBmNiwgMHgyYjQ5YmI0YSwgMHgyYjY1Nzg0NCwgMHgyZjBhMzkxZCwgMHgyZjAxYjJkZSwgMHgyYjZlYjNlYSwgMHgyYjhhNWNjZSwgMHgyZWU4MTU0MywKLQkweDJlZGY4N2M2LCAweDJiOTM5MWMwLCAweDJiYWYyNjdkLCAweDJlYzVkNDc5LCAweDJlYmQzZmM0LCAweDJiYjg1NGI0LCAweDJiZDNkNTNhLCAweDJlYTM3NmQ2LAotCTB4MmU5YWRhZWUsIDB4MmJkY2ZjYjAsIDB4MmJmODY4ZWQsIDB4MmU4MGZjNmUsIDB4MmU3ODU5NTgsIDB4MmMwMTg5OWUsIDB4MmMxY2UxODEsIDB4MmU1ZTY1NTYsCi0JMHgyZTU1YmIxNywgMHgyYzI1ZmI2NiwgMHgyYzQxM2VkZiwgMHgyZTNiYjFhNCwgMHgyZTMzMDA0MiwgMHgyYzRhNTFmMywgMHgyYzY1ODBmMSwgMHgyZTE4ZTE2ZCwKLQkweDJlMTAyOGVkLCAweDJjNmU4ZDJlLCAweDJjODlhNzlmLCAweDJkZjVmNGM3LCAweDJkZWQzNTJmLCAweDJjOTJhZDAxLCAweDJjYWRiMmQ1LCAweDJkZDJlYmM3LAotCTB4MmRjYTI1MWMsIDB4MmNiNmIxNTUsIDB4MmNkMWEyN2IsIDB4MmRhZmM2ODMsIDB4MmRhNmY4Y2EsIDB4MmNkYTlhMTQsIDB4MmNmNTc2N2MsIDB4MmQ4Yzg1MTAsCi0JMHgyZDgzYjA0ZiwgMHgyY2ZlNjcyOCwgMHgyZDE5MmVjMSwgMHgyZDY5Mjc4NCwgMHgyZDYwNGJjMCwgMHgyZDIyMTg3YSwgMHgyZDNjY2IzNCwgMHgyZDQ1YWRmNgotfTsKLQotCi1jb25zdCBpbnQgdHdpZFRhYjUxMlsoOCo2ICsgMzIqNiArIDEyOCo2KS8yXSA9IHsKLQkweDQwMDAwMDAwLCAweDQwMDAwMDAwLCAweDQwMDAwMDAwLCAweDNiMjAxODdkLAotCTB4M2VjNTBjN2MsIDB4MzUzNjIzOGUsIDB4MmQ0MTJkNDEsIDB4M2IyMDE4N2QsCi0JMHgxODdkM2IyMCwgMHgxODdkM2IyMCwgMHgzNTM2MjM4ZSwgMHhmMzg0M2VjNSwKLQkweDAwMDA0MDAwLCAweDJkNDEyZDQxLCAweGQyYmYyZDQxLCAweGU3ODMzYjIwLAotCTB4MjM4ZTM1MzYsIDB4YzEzYjBjN2MsIDB4ZDJiZjJkNDEsIDB4MTg3ZDNiMjAsCi0JMHhjNGUwZTc4MywgMHhjNGUwMTg3ZCwgMHgwYzdjM2VjNSwgMHhkYzcyY2FjYSwKLQotCTB4NDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4M2ZiMTA2NDUsCi0JMHgzZmVjMDMyMywgMHgzZjRlMDk2NCwgMHgzZWM1MGM3YywgMHgzZmIxMDY0NSwKLQkweDNkM2UxMjk0LCAweDNkM2UxMjk0LCAweDNmNGUwOTY0LCAweDM5ZGExYjVkLAotCTB4M2IyMDE4N2QsIDB4M2VjNTBjN2MsIDB4MzUzNjIzOGUsIDB4Mzg3MTFlMmIsCi0JMHgzZTE0MGY4YywgMHgyZjZiMmFmYSwgMHgzNTM2MjM4ZSwgMHgzZDNlMTI5NCwKLQkweDI4OTkzMTc5LCAweDMxNzkyODk5LCAweDNjNDIxNThmLCAweDIwZTczNmU1LAotCTB4MmQ0MTJkNDEsIDB4M2IyMDE4N2QsIDB4MTg3ZDNiMjAsIDB4Mjg5OTMxNzksCi0JMHgzOWRhMWI1ZCwgMHgwZjhjM2UxNCwgMHgyMzhlMzUzNiwgMHgzODcxMWUyYiwKLQkweDA2NDUzZmIxLCAweDFlMmIzODcxLCAweDM2ZTUyMGU3LCAweGZjZGQzZmVjLAotCTB4MTg3ZDNiMjAsIDB4MzUzNjIzOGUsIDB4ZjM4NDNlYzUsIDB4MTI5NDNkM2UsCi0JMHgzMzY3MjYxZiwgMHhlYTcxM2M0MiwgMHgwYzdjM2VjNSwgMHgzMTc5Mjg5OSwKLQkweGUxZDUzODcxLCAweDA2NDUzZmIxLCAweDJmNmIyYWZhLCAweGQ5ZTEzMzY3LAotCTB4MDAwMDQwMDAsIDB4MmQ0MTJkNDEsIDB4ZDJiZjJkNDEsIDB4ZjliYjNmYjEsCi0JMHgyYWZhMmY2YiwgMHhjYzk5MjYxZiwgMHhmMzg0M2VjNSwgMHgyODk5MzE3OSwKLQkweGM3OGYxZTJiLCAweGVkNmMzZDNlLCAweDI2MWYzMzY3LCAweGMzYmUxNThmLAotCTB4ZTc4MzNiMjAsIDB4MjM4ZTM1MzYsIDB4YzEzYjBjN2MsIDB4ZTFkNTM4NzEsCi0JMHgyMGU3MzZlNSwgMHhjMDE0MDMyMywgMHhkYzcyMzUzNiwgMHgxZTJiMzg3MSwKLQkweGMwNGZmOWJiLCAweGQ3NjczMTc5LCAweDFiNWQzOWRhLCAweGMxZWNmMDc0LAotCTB4ZDJiZjJkNDEsIDB4MTg3ZDNiMjAsIDB4YzRlMGU3ODMsIDB4Y2U4NzI4OTksCi0JMHgxNThmM2M0MiwgMHhjOTFiZGYxOSwgMHhjYWNhMjM4ZSwgMHgxMjk0M2QzZSwKLQkweGNlODdkNzY3LCAweGM3OGYxZTJiLCAweDBmOGMzZTE0LCAweGQ1MDZkMDk1LAotCTB4YzRlMDE4N2QsIDB4MGM3YzNlYzUsIDB4ZGM3MmNhY2EsIDB4YzJjMjEyOTQsCi0JMHgwOTY0M2Y0ZSwgMHhlNGEzYzYyNiwgMHhjMTNiMGM3YywgMHgwNjQ1M2ZiMSwKLQkweGVkNmNjMmMyLCAweGMwNGYwNjQ1LCAweDAzMjMzZmVjLCAweGY2OWNjMGIyLAotCi0JMHg0MDAwMDAwMCwgMHg0MDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgzZmZiMDE5MiwKLQkweDNmZmUwMGM5LCAweDNmZjQwMjViLCAweDNmZWMwMzIzLCAweDNmZmIwMTkyLAotCTB4M2ZkMzA0YjUsIDB4M2ZkMzA0YjUsIDB4M2ZmNDAyNWIsIDB4M2Y5YzA3MGQsCi0JMHgzZmIxMDY0NSwgMHgzZmVjMDMyMywgMHgzZjRlMDk2NCwgMHgzZjg0MDdkNSwKLQkweDNmZTEwM2VjLCAweDNlZWIwYmI2LCAweDNmNGUwOTY0LCAweDNmZDMwNGI1LAotCTB4M2U3MTBlMDUsIDB4M2YwZTBhZjEsIDB4M2ZjMzA1N2QsIDB4M2RlMjEwNGYsCi0JMHgzZWM1MGM3YywgMHgzZmIxMDY0NSwgMHgzZDNlMTI5NCwgMHgzZTcxMGUwNSwKLQkweDNmOWMwNzBkLCAweDNjODQxNGQxLCAweDNlMTQwZjhjLCAweDNmODQwN2Q1LAotCTB4M2JiNjE3MDgsIDB4M2RhZTExMTEsIDB4M2Y2YTA4OWMsIDB4M2FkMjE5MzcsCi0JMHgzZDNlMTI5NCwgMHgzZjRlMDk2NCwgMHgzOWRhMWI1ZCwgMHgzY2M1MTQxMywKLQkweDNmMmYwYTJhLCAweDM4Y2YxZDc5LCAweDNjNDIxNThmLCAweDNmMGUwYWYxLAotCTB4MzdhZjFmOGIsIDB4M2JiNjE3MDgsIDB4M2VlYjBiYjYsIDB4MzY3YzIxOTIsCi0JMHgzYjIwMTg3ZCwgMHgzZWM1MGM3YywgMHgzNTM2MjM4ZSwgMHgzYTgyMTllZiwKLQkweDNlOWMwZDQxLCAweDMzZGUyNTdkLCAweDM5ZGExYjVkLCAweDNlNzEwZTA1LAotCTB4MzI3NDI3NWYsIDB4MzkyYTFjYzYsIDB4M2U0NDBlYzksIDB4MzBmODI5MzQsCi0JMHgzODcxMWUyYiwgMHgzZTE0MGY4YywgMHgyZjZiMmFmYSwgMHgzN2FmMWY4YiwKLQkweDNkZTIxMDRmLCAweDJkY2UyY2IyLCAweDM2ZTUyMGU3LCAweDNkYWUxMTExLAotCTB4MmMyMTJlNWEsIDB4MzYxMjIyM2QsIDB4M2Q3NzExZDMsIDB4MmE2NTJmZjEsCi0JMHgzNTM2MjM4ZSwgMHgzZDNlMTI5NCwgMHgyODk5MzE3OSwgMHgzNDUzMjRkYSwKLQkweDNkMDIxMzU0LCAweDI2YzAzMmVlLCAweDMzNjcyNjFmLCAweDNjYzUxNDEzLAotCTB4MjRkYTM0NTMsIDB4MzI3NDI3NWYsIDB4M2M4NDE0ZDEsIDB4MjJlNjM1YTUsCi0JMHgzMTc5Mjg5OSwgMHgzYzQyMTU4ZiwgMHgyMGU3MzZlNSwgMHgzMDc2MjljZCwKLQkweDNiZmQxNjRjLCAweDFlZGMzODExLCAweDJmNmIyYWZhLCAweDNiYjYxNzA4LAotCTB4MWNjNjM5MmEsIDB4MmU1YTJjMjEsIDB4M2I2YzE3YzMsIDB4MWFhNjNhMmYsCi0JMHgyZDQxMmQ0MSwgMHgzYjIwMTg3ZCwgMHgxODdkM2IyMCwgMHgyYzIxMmU1YSwKLQkweDNhZDIxOTM3LCAweDE2NGMzYmZkLCAweDJhZmEyZjZiLCAweDNhODIxOWVmLAotCTB4MTQxMzNjYzUsIDB4MjljZDMwNzYsIDB4M2EyZjFhYTYsIDB4MTFkMzNkNzcsCi0JMHgyODk5MzE3OSwgMHgzOWRhMWI1ZCwgMHgwZjhjM2UxNCwgMHgyNzVmMzI3NCwKLQkweDM5ODMxYzEyLCAweDBkNDEzZTljLCAweDI2MWYzMzY3LCAweDM5MmExY2M2LAotCTB4MGFmMTNmMGUsIDB4MjRkYTM0NTMsIDB4MzhjZjFkNzksIDB4MDg5YzNmNmEsCi0JMHgyMzhlMzUzNiwgMHgzODcxMWUyYiwgMHgwNjQ1M2ZiMSwgMHgyMjNkMzYxMiwKLQkweDM4MTExZWRjLCAweDAzZWMzZmUxLCAweDIwZTczNmU1LCAweDM3YWYxZjhiLAotCTB4MDE5MjNmZmIsIDB4MWY4YjM3YWYsIDB4Mzc0YjIwMzksIDB4ZmYzNzNmZmUsCi0JMHgxZTJiMzg3MSwgMHgzNmU1MjBlNywgMHhmY2RkM2ZlYywgMHgxY2M2MzkyYSwKLQkweDM2N2MyMTkyLCAweGZhODMzZmMzLCAweDFiNWQzOWRhLCAweDM2MTIyMjNkLAotCTB4ZjgyYjNmODQsIDB4MTllZjNhODIsIDB4MzVhNTIyZTYsIDB4ZjVkNjNmMmYsCi0JMHgxODdkM2IyMCwgMHgzNTM2MjM4ZSwgMHhmMzg0M2VjNSwgMHgxNzA4M2JiNiwKLQkweDM0YzYyNDM0LCAweGYxMzczZTQ0LCAweDE1OGYzYzQyLCAweDM0NTMyNGRhLAotCTB4ZWVlZjNkYWUsIDB4MTQxMzNjYzUsIDB4MzNkZTI1N2QsIDB4ZWNhYzNkMDIsCi0JMHgxMjk0M2QzZSwgMHgzMzY3MjYxZiwgMHhlYTcxM2M0MiwgMHgxMTExM2RhZSwKLQkweDMyZWUyNmMwLCAweGU4M2QzYjZjLCAweDBmOGMzZTE0LCAweDMyNzQyNzVmLAotCTB4ZTYxMTNhODIsIDB4MGUwNTNlNzEsIDB4MzFmNzI3ZmQsIDB4ZTNlZTM5ODMsCi0JMHgwYzdjM2VjNSwgMHgzMTc5Mjg5OSwgMHhlMWQ1Mzg3MSwgMHgwYWYxM2YwZSwKLQkweDMwZjgyOTM0LCAweGRmYzczNzRiLCAweDA5NjQzZjRlLCAweDMwNzYyOWNkLAotCTB4ZGRjMzM2MTIsIDB4MDdkNTNmODQsIDB4MmZmMTJhNjUsIDB4ZGJjYzM0YzYsCi0JMHgwNjQ1M2ZiMSwgMHgyZjZiMmFmYSwgMHhkOWUxMzM2NywgMHgwNGI1M2ZkMywKLQkweDJlZTMyYjhlLCAweGQ4MDMzMWY3LCAweDAzMjMzZmVjLCAweDJlNWEyYzIxLAotCTB4ZDYzMzMwNzYsIDB4MDE5MjNmZmIsIDB4MmRjZTJjYjIsIDB4ZDQ3MjJlZTMsCi0JMHgwMDAwNDAwMCwgMHgyZDQxMmQ0MSwgMHhkMmJmMmQ0MSwgMHhmZTZlM2ZmYiwKLQkweDJjYjIyZGNlLCAweGQxMWQyYjhlLCAweGZjZGQzZmVjLCAweDJjMjEyZTVhLAotCTB4Y2Y4YTI5Y2QsIDB4ZmI0YjNmZDMsIDB4MmI4ZTJlZTMsIDB4Y2UwOTI3ZmQsCi0JMHhmOWJiM2ZiMSwgMHgyYWZhMmY2YiwgMHhjYzk5MjYxZiwgMHhmODJiM2Y4NCwKLQkweDJhNjUyZmYxLCAweGNiM2EyNDM0LCAweGY2OWMzZjRlLCAweDI5Y2QzMDc2LAotCTB4YzllZTIyM2QsIDB4ZjUwZjNmMGUsIDB4MjkzNDMwZjgsIDB4YzhiNTIwMzksCi0JMHhmMzg0M2VjNSwgMHgyODk5MzE3OSwgMHhjNzhmMWUyYiwgMHhmMWZiM2U3MSwKLQkweDI3ZmQzMWY3LCAweGM2N2QxYzEyLCAweGYwNzQzZTE0LCAweDI3NWYzMjc0LAotCTB4YzU3ZTE5ZWYsIDB4ZWVlZjNkYWUsIDB4MjZjMDMyZWUsIDB4YzQ5NDE3YzMsCi0JMHhlZDZjM2QzZSwgMHgyNjFmMzM2NywgMHhjM2JlMTU4ZiwgMHhlYmVkM2NjNSwKLQkweDI1N2QzM2RlLCAweGMyZmUxMzU0LCAweGVhNzEzYzQyLCAweDI0ZGEzNDUzLAotCTB4YzI1MjExMTEsIDB4ZThmODNiYjYsIDB4MjQzNDM0YzYsIDB4YzFiYzBlYzksCi0JMHhlNzgzM2IyMCwgMHgyMzhlMzUzNiwgMHhjMTNiMGM3YywgMHhlNjExM2E4MiwKLQkweDIyZTYzNWE1LCAweGMwZDEwYTJhLCAweGU0YTMzOWRhLCAweDIyM2QzNjEyLAotCTB4YzA3YzA3ZDUsIDB4ZTMzYTM5MmEsIDB4MjE5MjM2N2MsIDB4YzAzZDA1N2QsCi0JMHhlMWQ1Mzg3MSwgMHgyMGU3MzZlNSwgMHhjMDE0MDMyMywgMHhlMDc1MzdhZiwKLQkweDIwMzkzNzRiLCAweGMwMDIwMGM5LCAweGRmMTkzNmU1LCAweDFmOGIzN2FmLAotCTB4YzAwNWZlNmUsIDB4ZGRjMzM2MTIsIDB4MWVkYzM4MTEsIDB4YzAxZmZjMTQsCi0JMHhkYzcyMzUzNiwgMHgxZTJiMzg3MSwgMHhjMDRmZjliYiwgMHhkYjI2MzQ1MywKLQkweDFkNzkzOGNmLCAweGMwOTZmNzY0LCAweGQ5ZTEzMzY3LCAweDFjYzYzOTJhLAotCTB4YzBmMmY1MGYsIDB4ZDhhMTMyNzQsIDB4MWMxMjM5ODMsIDB4YzE2NGYyYmYsCi0JMHhkNzY3MzE3OSwgMHgxYjVkMzlkYSwgMHhjMWVjZjA3NCwgMHhkNjMzMzA3NiwKLQkweDFhYTYzYTJmLCAweGMyODllZTJkLCAweGQ1MDYyZjZiLCAweDE5ZWYzYTgyLAotCTB4YzMzYmViZWQsIDB4ZDNkZjJlNWEsIDB4MTkzNzNhZDIsIDB4YzQwM2U5YjQsCi0JMHhkMmJmMmQ0MSwgMHgxODdkM2IyMCwgMHhjNGUwZTc4MywgMHhkMWE2MmMyMSwKLQkweDE3YzMzYjZjLCAweGM1ZDFlNTVhLCAweGQwOTUyYWZhLCAweDE3MDgzYmI2LAotCTB4YzZkNmUzM2EsIDB4Y2Y4YTI5Y2QsIDB4MTY0YzNiZmQsIDB4YzdlZmUxMjQsCi0JMHhjZTg3Mjg5OSwgMHgxNThmM2M0MiwgMHhjOTFiZGYxOSwgMHhjZDhjMjc1ZiwKLQkweDE0ZDEzYzg0LCAweGNhNWJkZDFhLCAweGNjOTkyNjFmLCAweDE0MTMzY2M1LAotCTB4Y2JhZGRiMjYsIDB4Y2JhZDI0ZGEsIDB4MTM1NDNkMDIsIDB4Y2QxMmQ5NDAsCi0JMHhjYWNhMjM4ZSwgMHgxMjk0M2QzZSwgMHhjZTg3ZDc2NywgMHhjOWVlMjIzZCwKLQkweDExZDMzZDc3LCAweGQwMGZkNTliLCAweGM5MWIyMGU3LCAweDExMTEzZGFlLAotCTB4ZDFhNmQzZGYsIDB4Yzg1MTFmOGIsIDB4MTA0ZjNkZTIsIDB4ZDM0ZWQyMzIsCi0JMHhjNzhmMWUyYiwgMHgwZjhjM2UxNCwgMHhkNTA2ZDA5NSwgMHhjNmQ2MWNjNiwKLQkweDBlYzkzZTQ0LCAweGQ2Y2NjZjA4LCAweGM2MjYxYjVkLCAweDBlMDUzZTcxLAotCTB4ZDhhMWNkOGMsIDB4YzU3ZTE5ZWYsIDB4MGQ0MTNlOWMsIDB4ZGE4M2NjMjIsCi0JMHhjNGUwMTg3ZCwgMHgwYzdjM2VjNSwgMHhkYzcyY2FjYSwgMHhjNDRhMTcwOCwKLQkweDBiYjYzZWViLCAweGRlNmVjOTg0LCAweGMzYmUxNThmLCAweDBhZjEzZjBlLAotCTB4ZTA3NWM4NTEsIDB4YzMzYjE0MTMsIDB4MGEyYTNmMmYsIDB4ZTI4N2M3MzEsCi0JMHhjMmMyMTI5NCwgMHgwOTY0M2Y0ZSwgMHhlNGEzYzYyNiwgMHhjMjUyMTExMSwKLQkweDA4OWMzZjZhLCAweGU2YzljNTJlLCAweGMxZWMwZjhjLCAweDA3ZDUzZjg0LAotCTB4ZThmOGM0NGEsIDB4YzE4ZjBlMDUsIDB4MDcwZDNmOWMsIDB4ZWIyZmMzN2MsCi0JMHhjMTNiMGM3YywgMHgwNjQ1M2ZiMSwgMHhlZDZjYzJjMiwgMHhjMGYyMGFmMSwKLQkweDA1N2QzZmMzLCAweGVmYjFjMjFlLCAweGMwYjIwOTY0LCAweDA0YjUzZmQzLAotCTB4ZjFmYmMxOGYsIDB4YzA3YzA3ZDUsIDB4MDNlYzNmZTEsIDB4ZjQ0YWMxMTUsCi0JMHhjMDRmMDY0NSwgMHgwMzIzM2ZlYywgMHhmNjljYzBiMiwgMHhjMDJkMDRiNSwKLQkweDAyNWIzZmY0LCAweGY4ZjNjMDY0LCAweGMwMTQwMzIzLCAweDAxOTIzZmZiLAotCTB4ZmI0YmMwMmQsIDB4YzAwNTAxOTIsIDB4MDBjOTNmZmUsIDB4ZmRhNWMwMGMKLX07Ci0KLWNvbnN0IGludCB0d2lkVGFiNjRbKDQqNiArIDE2KjYpLzJdID0gewotCTB4NDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4MmQ0MTJkNDEsCi0JMHgzYjIwMTg3ZCwgMHgxODdkM2IyMCwgMHgwMDAwNDAwMCwgMHgyZDQxMmQ0MSwKLQkweGQyYmYyZDQxLCAweGQyYmYyZDQxLCAweDE4N2QzYjIwLCAweGM0ZTBlNzgzLAotCi0JMHg0MDAwMDAwMCwgMHg0MDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgzZWM1MGM3YywKLQkweDNmYjEwNjQ1LCAweDNkM2UxMjk0LCAweDNiMjAxODdkLCAweDNlYzUwYzdjLAotCTB4MzUzNjIzOGUsIDB4MzUzNjIzOGUsIDB4M2QzZTEyOTQsIDB4Mjg5OTMxNzksCi0JMHgyZDQxMmQ0MSwgMHgzYjIwMTg3ZCwgMHgxODdkM2IyMCwgMHgyMzhlMzUzNiwKLQkweDM4NzExZTJiLCAweDA2NDUzZmIxLCAweDE4N2QzYjIwLCAweDM1MzYyMzhlLAotCTB4ZjM4NDNlYzUsIDB4MGM3YzNlYzUsIDB4MzE3OTI4OTksIDB4ZTFkNTM4NzEsCi0JMHgwMDAwNDAwMCwgMHgyZDQxMmQ0MSwgMHhkMmJmMmQ0MSwgMHhmMzg0M2VjNSwKLQkweDI4OTkzMTc5LCAweGM3OGYxZTJiLCAweGU3ODMzYjIwLCAweDIzOGUzNTM2LAotCTB4YzEzYjBjN2MsIDB4ZGM3MjM1MzYsIDB4MWUyYjM4NzEsIDB4YzA0ZmY5YmIsCi0JMHhkMmJmMmQ0MSwgMHgxODdkM2IyMCwgMHhjNGUwZTc4MywgMHhjYWNhMjM4ZSwKLQkweDEyOTQzZDNlLCAweGNlODdkNzY3LCAweGM0ZTAxODdkLCAweDBjN2MzZWM1LAotCTB4ZGM3MmNhY2EsIDB4YzEzYjBjN2MsIDB4MDY0NTNmYjEsIDB4ZWQ2Y2MyYzIKLX07Ci0KLSNlbGlmIGRlZmluZWQgQVJNVjdOZW9uCi0vKgotICogIFEyOSBmb3IgMTI4IGFuZCAxMDI0Ci0gKgotICogZm9yIChpID0gMDsgaSA8IG51bS80OyBpKyspIHsKLSAqICAgYW5nbGUgPSAoaSArIDAuMTI1KSAqIE1fUEkgLyBudW07Ci0gKiAgIHggPSBjb3MoYW5nbGUpICogKDEgPDwgMjkpOwotICogICB4ID0gc2luKGFuZ2xlKSAqICgxIDw8IDI5KTsKLSAqCi0gKiAgIGFuZ2xlID0gKG51bS8yIC0gMSAtIGkgKyAwLjEyNSkgKiBNX1BJIC8gbnVtOwotICogICB4ID0gY29zKGFuZ2xlKSAqICgxIDw8IDI5KTsKLSAqICAgeCA9IHNpbihhbmdsZSkgKiAoMSA8PCAyOSk7Ci0gKiB9Ci0gKi8KLWNvbnN0IGludCBjb3NzaW50YWJbMTI4ICsgMTAyNF0gPSB7Ci0JLyogMTI4ICovCi0JMHgxZmZmZjYyMSwgMHgwMDE5MjFmOSwgMHgwMGFmZWE2OSwgMHgxZmZlMWM2OCwgMHgxZmZjZTA5ZCwgMHgwMGUyMmE3YSwgMHgwMTc4ZGJhYSwgMHgxZmY3NTNiYiwKLQkweDFmZjRkYzU1LCAweDAxYWIxMDFjLCAweDAyNDE5MmNmLCAweDFmZWI5ZDI1LCAweDFmZTdlYTg1LCAweDAyNzNiM2UyLCAweDAzMDlmMGUyLCAweDFmZGFmYTc1LAotCTB4MWZkNjBkMmUsIDB4MDMzYmY2ZGQsIDB4MDNkMWQ3MDAsIDB4MWZjNTZlM2IsIDB4MWZiZjQ3MGYsIDB4MDQwM2JhMmIsIDB4MDQ5OTI2NTMsIDB4MWZhYWZiY2IsCi0JMHgxZmEzOWJhYywgMHgwNGNhZGVmZSwgMHgwNTVmYzAyMiwgMHgxZjhiYTczOCwgMHgxZjgzMGY0YSwgMHgwNTkxNDZhMSwgMHgwNjI1ODVjYSwgMHgxZjY3NzU1NywKLQkweDFmNWRhNmVkLCAweDA2NTZkMjdhLCAweDA2ZWE1OGNkLCAweDFmM2U2YmJjLCAweDFmMzM2ODVhLCAweDA3MWI2NDE1LCAweDA3YWUxYWQyLCAweDFmMTA5MGJkLAotCTB4MWYwNDVhMTUsIDB4MDdkZWRkMjAsIDB4MDg3MGFkYTcsIDB4MWVkZGViNmEsIDB4MWVkMDgzNWYsIDB4MDhhMTFmNzgsIDB4MDkzMWYzNGQsIDB4MWVhNjgzOTQsCi0JMHgxZTk3ZWMzNiwgMHgwOTYyMGQyNywgMHgwOWYxY2RmNSwgMHgxZTZhNjFjNSwgMHgxZTVhOWQ1NSwgMHgwYTIxODg2ZSwgMHgwYWIwMjAwOSwgMHgxZTI5OGY0NCwKLQkweDFlMThhMDMwLCAweDBhZGY3M2M2LCAweDBiNmNjYzMyLCAweDFkZTQxNjBmLCAweDFkZDFmZWY0LCAweDBiOWJiMWU1LCAweDBjMjdiNTU1LCAweDFkOWEwMGRlLAotCTB4MWQ4NmM0ODQsIDB4MGM1NjI1YzMsIDB4MGNlMGJlYTIsIDB4MWQ0YjViMWIsIDB4MWQzNmZjN2MsIDB4MGQwZWIyYTIsIDB4MGQ5N2NiOGYsIDB4MWNmODMwZTksCi0JMHgxY2UyYjMyOCwgMHgwZGM1M2MwYSwgMHgwZTRjYmZlMiwgMHgxY2EwOGYxYSwgMHgxYzg5ZjU4NywgMHgwZTc5YTVkNywgMHgwZWZmN2ZiMywgMHgxYzQ0ODMzMSwKLQkweDFjMmNkMTQ5LCAweDBmMmJkNDM3LCAweDBmYWZlZjczLCAweDFiZTQxYjYxLCAweDFiY2I1NGNiLCAweDBmZGJhYmFlLCAweDEwNWRmM2VjLCAweDFiN2Y2Njg3LAotCTB4MWI2NThmMTUsIDB4MTA4OTExMjAsIDB4MTEwOTcyNDksIDB4MWIxNjc0MmEsIDB4MWFmYjhmZDksIDB4MTEzM2U5ZDAsIDB4MTFiMjUwMTcsIDB4MWFhOTU0N2EsCi0JMHgxYThkNjc2ZSwgMHgxMWRjMWI2NSwgMHgxMjU4NzM0ZCwgMHgxYTM4MTg0YSwgMHgxYTFiMjZkMywgMHgxMjgxOGJlZiwgMHgxMmZiYzI0YiwgMHgxOWMyZDExMSwKLQkweDE5YTRkZmE0LCAweDEzMjQyMWVjLCAweDEzOWMyM2U0LCAweDE5NDk5MGU0LCAweDE5MmFhNDIwLCAweDEzYzNjNDRhLCAweDE0Mzk3ZjViLCAweDE4Y2M2YTc1LAotCTB4MThhYzg3MWYsIDB4MTQ2MDVhNjksIDB4MTRkM2JjNmQsIDB4MTg0YjcxMTIsIDB4MTgyYTljMTQsIDB4MTRmOWNjMjYsIDB4MTU2YWMzNTIsIDB4MTdjNmI4OWQsCi0JMHgxN2E0ZjcwOCwgMHgxNTkwMDFkNiwgMHgxNWZlN2NiZSwgMHgxNzNlNTU4ZSwgMHgxNzFiYWM5NiwgMHgxNjIyZTQ1MCwgMHgxNjhlZDFlYiwgMHgxNmIyNWNlZCwKLQkvKiAxMDI0ICovCi0JMHgxZmZmZmZkOSwgMHgwMDAzMjQzZiwgMHgwMDE1ZmRiYSwgMHgxZmZmZjg3MiwgMHgxZmZmZjM4MiwgMHgwMDFjNDYzNywgMHgwMDJmMWZhNiwgMHgxZmZmZGQ0ZCwKLQkweDFmZmZkMzZmLCAweDAwMzU2ODFkLCAweDAwNDg0MTc1LCAweDFmZmZhZTZjLCAweDFmZmY5ZjllLCAweDAwNGU4OWUzLCAweDAwNjE2MzE4LCAweDFmZmY2YmNlLAotCTB4MWZmZjU4MTEsIDB4MDA2N2FiNzcsIDB4MDA3YTg0N2UsIDB4MWZmZjE1NzIsIDB4MWZmZWZjYzYsIDB4MDA4MGNjY2MsIDB4MDA5M2E1OTksIDB4MWZmZWFiNWIsCi0JMHgxZmZlOGRiZiwgMHgwMDk5ZWRkMiwgMHgwMGFjYzY1OCwgMHgxZmZlMmQ4NiwgMHgxZmZlMGFmYywgMHgwMGIzMGU3OCwgMHgwMGM1ZTZhZCwgMHgxZmZkOWJmNiwKLQkweDFmZmQ3NDdjLCAweDAwY2MyZWIwLCAweDAwZGYwNjg4LCAweDFmZmNmNmFhLCAweDFmZmNjYTQxLCAweDAwZTU0ZTZhLCAweDAwZjgyNWRhLCAweDFmZmMzZGEyLAotCTB4MWZmYzBjNGIsIDB4MDBmZTZkOTcsIDB4MDExMTQ0OTIsIDB4MWZmYjcwZTAsIDB4MWZmYjNhOWEsIDB4MDExNzhjMjcsIDB4MDEyYTYyYTIsIDB4MWZmYTkwNjMsCi0JMHgxZmZhNTUyZSwgMHgwMTMwYWEwYSwgMHgwMTQzN2ZmYSwgMHgxZmY5OWMyYywgMHgxZmY5NWMwOSwgMHgwMTQ5YzczMSwgMHgwMTVjOWM4YSwgMHgxZmY4OTQzYywKLQkweDFmZjg0ZjJiLCAweDAxNjJlMzhkLCAweDAxNzViODQzLCAweDFmZjc3ODkzLCAweDFmZjcyZTk0LCAweDAxN2JmZjBlLCAweDAxOGVkMzE2LCAweDFmZjY0OTMyLAotCTB4MWZmNWZhNDYsIDB4MDE5NTE5YTUsIDB4MDFhN2VjZjIsIDB4MWZmNTA2MWIsIDB4MWZmNGIyNDAsIDB4MDFhZTMzNDEsIDB4MDFjMTA1YzksIDB4MWZmM2FmNGMsCi0JMHgxZmYzNTY4NCwgMHgwMWM3NGJkNSwgMHgwMWRhMWQ4YywgMHgxZmYyNDRjOCwgMHgxZmYxZTcxMywgMHgwMWUwNjM0ZiwgMHgwMWYzMzQyOSwgMHgxZmYwYzY4ZiwKLQkweDFmZjA2M2VkLCAweDAxZjk3OWExLCAweDAyMGM0OTkzLCAweDFmZWYzNGEzLCAweDFmZWVjZDE0LCAweDAyMTI4ZWJiLCAweDAyMjU1ZGI5LCAweDFmZWQ4ZjAzLAotCTB4MWZlZDIyODcsIDB4MDIyYmEyOGYsIDB4MDIzZTcwOGQsIDB4MWZlYmQ1YjIsIDB4MWZlYjY0NGEsIDB4MDI0NGI1MGIsIDB4MDI1NzgxZmUsIDB4MWZlYTA4YjAsCi0JMHgxZmU5OTI1YywgMHgwMjVkYzYyMSwgMHgwMjcwOTFmZCwgMHgxZmU4MjdmZSwgMHgxZmU3YWNiZSwgMHgwMjc2ZDVjMSwgMHgwMjg5YTA3YiwgMHgxZmU2MzM5ZCwKLQkweDFmZTViMzcyLCAweDAyOGZlM2RkLCAweDAyYTJhZDY5LCAweDFmZTQyYjkwLCAweDFmZTNhNjc5LCAweDAyYThmMDYzLCAweDAyYmJiOGI2LCAweDFmZTIwZmQ2LAotCTB4MWZlMTg1ZDUsIDB4MDJjMWZiNDYsIDB4MDJkNGMyNTMsIDB4MWZkZmUwNzEsIDB4MWZkZjUxODYsIDB4MDJkYjA0NzUsIDB4MDJlZGNhMzIsIDB4MWZkZDlkNjQsCi0JMHgxZmRkMDk4ZSwgMHgwMmY0MGJlMiwgMHgwMzA2ZDA0MiwgMHgxZmRiNDZhZSwgMHgxZmRhYWRlZSwgMHgwMzBkMTE3YywgMHgwMzFmZDQ3NCwgMHgxZmQ4ZGM1MSwKLQkweDFmZDgzZWE4LCAweDAzMjYxNTM0LCAweDAzMzhkNmI4LCAweDFmZDY1ZTRmLCAweDFmZDViYmJkLCAweDAzM2YxNmZiLCAweDAzNTFkNzAwLCAweDFmZDNjY2FhLAotCTB4MWZkMzI1MzAsIDB4MDM1ODE2YzEsIDB4MDM2YWQ1M2MsIDB4MWZkMTI3NjMsIDB4MWZkMDdiMDAsIDB4MDM3MTE0NzcsIDB4MDM4M2QxNWMsIDB4MWZjZTZlN2MsCi0JMHgxZmNkYmQzMSwgMHgwMzhhMTAwZSwgMHgwMzljY2I1MSwgMHgxZmNiYTFmNSwgMHgxZmNhZWJjMywgMHgwM2EzMDk3NSwgMHgwM2I1YzMwYiwgMHgxZmM4YzFkMiwKLQkweDFmYzgwNmI5LCAweDAzYmMwMDlmLCAweDAzY2ViODdjLCAweDFmYzVjZTE0LCAweDFmYzUwZTE0LCAweDAzZDRmNTdhLCAweDAzZTdhYjkzLCAweDFmYzJjNmJkLAotCTB4MWZjMjAxZDcsIDB4MDNlZGU3ZjksIDB4MDQwMDljNDIsIDB4MWZiZmFiY2QsIDB4MWZiZWUyMDIsIDB4MDQwNmQ4MGIsIDB4MDQxOThhNzgsIDB4MWZiYzdkNDksCi0JMHgxZmJiYWU5OSwgMHgwNDFmYzVhMSwgMHgwNDMyNzYyOCwgMHgxZmI5M2IzMSwgMHgxZmI4Njc5YywgMHgwNDM4YjBhYywgMHgwNDRiNWY0MCwgMHgxZmI1ZTU4NywKLQkweDFmYjUwZDBlLCAweDA0NTE5OTFkLCAweDA0NjQ0NWIyLCAweDFmYjI3YzRlLCAweDFmYjE5ZWYxLCAweDA0NmE3ZWUzLCAweDA0N2QyOTZmLCAweDFmYWVmZjg3LAotCTB4MWZhZTFkNDcsIDB4MDQ4MzYxZjAsIDB4MDQ5NjBhNjcsIDB4MWZhYjZmMzUsIDB4MWZhYTg4MTMsIDB4MDQ5YzQyMzUsIDB4MDRhZWU4OGIsIDB4MWZhN2NiNWEsCi0JMHgxZmE2ZGY1NiwgMHgwNGI1MWZhMSwgMHgwNGM3YzNjYiwgMHgxZmE0MTNmOCwgMHgxZmEzMjMxMywgMHgwNGNkZmEyNiwgMHgwNGUwOWMxOCwgMHgxZmEwNDkxMiwKLQkweDFmOWY1MzRjLCAweDA0ZTZkMWI0LCAweDA0Zjk3MTYzLCAweDFmOWM2YWE5LCAweDFmOWI3MDAzLCAweDA0ZmZhNjNjLCAweDA1MTI0MzlkLCAweDFmOTg3OGMxLAotCTB4MWY5Nzc5M2IsIDB4MDUxODc3YWYsIDB4MDUyYjEyYjYsIDB4MWY5NDczNWIsIDB4MWY5MzZlZjYsIDB4MDUzMTQ1ZmQsIDB4MDU0M2RlOWUsIDB4MWY5MDVhN2EsCi0JMHgxZjhmNTEzNywgMHgwNTRhMTExNywgMHgwNTVjYTc0OCwgMHgxZjhjMmUyMSwgMHgxZjhiMjAwMCwgMHgwNTYyZDhlZSwgMHgwNTc1NmNhMiwgMHgxZjg3ZWU1MiwKLQkweDFmODZkYjU1LCAweDA1N2I5ZDczLCAweDA1OGUyZTlmLCAweDFmODM5YjEwLCAweDFmODI4MzM2LCAweDA1OTQ1ZTk1LCAweDA1YTZlZDJlLCAweDFmN2YzNDVlLAotCTB4MWY3ZTE3YTgsIDB4MDVhZDFjNDcsIDB4MDViZmE4NDAsIDB4MWY3YWJhM2UsIDB4MWY3OTk4YWQsIDB4MDVjNWQ2NzgsIDB4MDVkODVmYzcsIDB4MWY3NjJjYjIsCi0JMHgxZjc1MDY0NywgMHgwNWRlOGQxOSwgMHgwNWYxMTNiMywgMHgxZjcxOGJiZiwgMHgxZjcwNjA3YSwgMHgwNWY3NDAxYywgMHgwNjA5YzNmNSwgMHgxZjZjZDc2NiwKLQkweDFmNmJhNzQ4LCAweDA2MGZlZjcxLCAweDA2MjI3MDdkLCAweDFmNjgwZmFiLCAweDFmNjZkYWI1LCAweDA2Mjg5YjA4LCAweDA2M2IxOTNjLCAweDFmNjMzNDkwLAotCTB4MWY2MWZhYzMsIDB4MDY0MTQyZDMsIDB4MDY1M2JlMjMsIDB4MWY1ZTQ2MTksIDB4MWY1ZDA3NzUsIDB4MDY1OWU2YzIsIDB4MDY2YzVmMjQsIDB4MWY1OTQ0NDgsCi0JMHgxZjU4MDBjZSwgMHgwNjcyODZjNiwgMHgwNjg0ZmMyZSwgMHgxZjU0MmYyMSwgMHgxZjUyZTZkMiwgMHgwNjhiMjJkMCwgMHgwNjlkOTUzMiwgMHgxZjRmMDZhNiwKLQkweDFmNGRiOTgzLCAweDA2YTNiYWQwLCAweDA2YjYyYTIyLCAweDFmNDljYWRjLCAweDFmNDg3OGU1LCAweDA2YmM0ZWI5LCAweDA2Y2ViYWVlLCAweDFmNDQ3YmM0LAotCTB4MWY0MzI0ZmIsIDB4MDZkNGRlNzksIDB4MDZlNzQ3ODYsIDB4MWYzZjE5NjMsIDB4MWYzZGJkYzgsIDB4MDZlZDZhMDMsIDB4MDZmZmNmZGQsIDB4MWYzOWEzYmMsCi0JMHgxZjM4NDM1MCwgMHgwNzA1ZjE0NywgMHgwNzE4NTNlMywgMHgxZjM0MWFkMiwgMHgxZjMyYjU5NSwgMHgwNzFlNzQzNiwgMHgwNzMwZDM4OCwgMHgxZjJlN2VhOSwKLQkweDFmMmQxNDlkLCAweDA3MzZmMmMwLCAweDA3NDk0ZWJkLCAweDFmMjhjZjQzLCAweDFmMjc2MDY5LCAweDA3NGY2Y2Q3LCAweDA3NjFjNTc0LCAweDFmMjMwY2E1LAotCTB4MWYyMTk4ZmQsIDB4MDc2N2UyNmMsIDB4MDc3YTM3OWQsIDB4MWYxZDM2ZDIsIDB4MWYxYmJlNWQsIDB4MDc4MDUzNzAsIDB4MDc5MmE1MmEsIDB4MWYxNzRkY2UsCi0JMHgxZjE1ZDA4ZCwgMHgwNzk4YmZkMywgMHgwN2FiMGUwYSwgMHgxZjExNTE5YywgMHgxZjBmY2Y5MSwgMHgwN2IxMjc4NiwgMHgwN2MzNzIzMCwgMHgxZjBiNDI0MCwKLQkweDFmMDliYjZiLCAweDA3Yzk4YTdhLCAweDA3ZGJkMThjLCAweDFmMDUxZmJlLCAweDFmMDM5NDFmLCAweDA3ZTFlOGExLCAweDA3ZjQyYzBlLCAweDFlZmVlYTE5LAotCTB4MWVmZDU5YjMsIDB4MDdmYTQxZWIsIDB4MDgwYzgxYTksIDB4MWVmOGExNTUsIDB4MWVmNzBjMjgsIDB4MDgxMjk2NGEsIDB4MDgyNGQyNGQsIDB4MWVmMjQ1NzcsCi0JMHgxZWYwYWI4NCwgMHgwODJhZTVhZCwgMHgwODNkMWRlYSwgMHgxZWViZDY4MiwgMHgxZWVhMzdjYSwgMHgwODQzMzAwNywgMHgwODU1NjQ3MywgMHgxZWU1NTQ3YSwKLQkweDFlZTNiMGZlLCAweDA4NWI3NTQ4LCAweDA4NmRhNWQ4LCAweDFlZGViZjY0LCAweDFlZGQxNzI0LCAweDA4NzNiNTYyLCAweDA4ODVlMjA5LCAweDFlZDgxNzQyLAotCTB4MWVkNjZhNDEsIDB4MDg4YmYwNDQsIDB4MDg5ZTE4ZjksIDB4MWVkMTVjMWEsIDB4MWVjZmFhNTcsIDB4MDhhNDI1ZTEsIDB4MDhiNjRhOTgsIDB4MWVjYThkZWYsCi0JMHgxZWM4ZDc2YywgMHgwOGJjNTYyYSwgMHgwOGNlNzZkOCwgMHgxZWMzYWNjNiwgMHgxZWMxZjE4NCwgMHgwOGQ0ODEwZiwgMHgwOGU2OWRhOCwgMHgxZWJjYjhhMywKLQkweDFlYmFmOGEzLCAweDA4ZWNhNjgxLCAweDA4ZmViZWZiLCAweDFlYjViMThhLCAweDFlYjNlY2NkLCAweDA5MDRjNjczLCAweDA5MTZkYWMyLCAweDFlYWU5NzdmLAotCTB4MWVhY2NlMDcsIDB4MDkxY2UwZDQsIDB4MDkyZWYwZWQsIDB4MWVhNzZhODcsIDB4MWVhNTljNTUsIDB4MDkzNGY1OTYsIDB4MDk0NzAxNmUsIDB4MWVhMDJhYTcsCi0JMHgxZTllNTdiYiwgMHgwOTRkMDRhYSwgMHgwOTVmMGMzNiwgMHgxZTk4ZDdlMiwgMHgxZTk3MDAzZSwgMHgwOTY1MGUwMSwgMHgwOTc3MTEzNiwgMHgxZTkxNzIzZSwKLQkweDFlOGY5NWUzLCAweDA5N2QxMThkLCAweDA5OGYxMDYwLCAweDFlODlmOWJmLCAweDFlODgxOGFkLCAweDA5OTUwZjNmLCAweDA5YTcwOWE0LCAweDFlODI2ZTY5LAotCTB4MWU4MDg4YTIsIDB4MDlhZDA3MDcsIDB4MDliZWZjZjQsIDB4MWU3YWQwNDEsIDB4MWU3OGU1YzcsIDB4MDljNGY4ZDgsIDB4MDlkNmVhNDAsIDB4MWU3MzFmNGMsCi0JMHgxZTcxMzAxZiwgMHgwOWRjZTRhMSwgMHgwOWVlZDE3YiwgMHgxZTZiNWI4ZiwgMHgxZTY5NjdiMSwgMHgwOWY0Y2E1NiwgMHgwYTA2YjI5NiwgMHgxZTYzODUwZSwKLQkweDFlNjE4YzgwLCAweDBhMGNhOWU2LCAweDBhMWU4ZDgxLCAweDFlNWI5YmNlLCAweDFlNTk5ZTkxLCAweDBhMjQ4MzQzLCAweDBhMzY2MjJlLCAweDFlNTM5ZmQ0LAotCTB4MWU1MTlkZWEsIDB4MGEzYzU2NWUsIDB4MGE0ZTMwOGYsIDB4MWU0YjkxMjYsIDB4MWU0OThhOGUsIDB4MGE1NDIzMjksIDB4MGE2NWY4OTQsIDB4MWU0MzZmYzcsCi0JMHgxZTQxNjQ4NSwgMHgwYTZiZTk5NSwgMHgwYTdkYmEyZiwgMHgxZTNiM2JiZCwgMHgxZTM5MmJkMSwgMHgwYTgzYTk5MywgMHgwYTk1NzU1MSwgMHgxZTMyZjUwZSwKLQkweDFlMzBlMDc5LCAweDBhOWI2MzE1LCAweDBhYWQyOWVjLCAweDFlMmE5YmJkLCAweDFlMjg4MjgxLCAweDBhYjMxNjBjLCAweDBhYzRkN2YxLCAweDFlMjIyZmQxLAotCTB4MWUyMDExZWUsIDB4MGFjYWMyNmEsIDB4MGFkYzdmNTIsIDB4MWUxOWIxNGYsIDB4MWUxNzhlYzcsIDB4MGFlMjY4MWYsIDB4MGFmNDFmZmYsIDB4MWUxMTIwM2IsCi0JMHgxZTBlZjkxMCwgMHgwYWZhMDcxZCwgMHgwYjBiYjllYiwgMHgxZTA4N2M5YiwgMHgxZTA2NTBjZSwgMHgwYjExOWY1NiwgMHgwYjIzNGQwNywgMHgxZGZmYzY3NCwKLQkweDFkZmQ5NjA2LCAweDBiMjkzMGJiLCAweDBiM2FkOTQzLCAweDFkZjZmZGNjLCAweDFkZjRjOGJmLCAweDBiNDBiYjNlLCAweDBiNTI1ZTkyLCAweDFkZWUyMmE5LAotCTB4MWRlYmU4ZmQsIDB4MGI1ODNlY2YsIDB4MGI2OWRjZTYsIDB4MWRlNTM1MGYsIDB4MWRlMmY2YzYsIDB4MGI2ZmJiNjIsIDB4MGI4MTU0MmYsIDB4MWRkYzM1MDQsCi0JMHgxZGQ5ZjIyMCwgMHgwYjg3MzBlNiwgMHgwYjk4YzQ1ZiwgMHgxZGQzMjI4ZSwgMHgxZGQwZGIxMCwgMHgwYjllOWY0ZCwgMHgwYmIwMmQ2OCwgMHgxZGM5ZmRiMiwKLQkweDFkYzdiMTliLCAweDBiYjYwNjhhLCAweDBiYzc4ZjNiLCAweDFkYzBjNjc2LCAweDFkYmU3NWM4LCAweDBiY2Q2NjhlLCAweDBiZGVlOWNhLCAweDFkYjc3Y2RmLAotCTB4MWRiNTI3OWMsIDB4MGJlNGJmNGEsIDB4MGJmNjNkMDcsIDB4MWRhZTIwZjQsIDB4MWRhYmM3MWQsIDB4MGJmYzEwYWYsIDB4MGMwZDg4ZTIsIDB4MWRhNGIyYmEsCi0JMHgxZGEyNTQ1MCwgMHgwYzEzNWFiMCwgMHgwYzI0Y2Q0ZSwgMHgxZDliMzIzNywgMHgxZDk4Y2YzYiwgMHgwYzJhOWQzZSwgMHgwYzNjMGEzZCwgMHgxZDkxOWY3MCwKLQkweDFkOGYzN2U1LCAweDBjNDFkODRiLCAweDBjNTMzZmEwLCAweDFkODdmYTZkLCAweDFkODU4ZTUzLCAweDBjNTkwYmM5LCAweDBjNmE2ZDY4LCAweDFkN2U0MzMyLAotCTB4MWQ3YmQyOGIsIDB4MGM3MDM3YTgsIDB4MGM4MTkzODgsIDB4MWQ3NDc5YzUsIDB4MWQ3MjA0OTMsIDB4MGM4NzViZGIsIDB4MGM5OGIxZjAsIDB4MWQ2YTllMmUsCi0JMHgxZDY4MjQ3MiwgMHgwYzllNzg1NCwgMHgwY2FmYzg5NCwgMHgxZDYwYjA3MCwgMHgxZDVlMzIyYywgMHgwY2I1OGQwNCwgMHgwY2M2ZDc2NCwgMHgxZDU2YjA5NCwKLQkweDFkNTQyZGM5LCAweDBjY2M5OWRlLCAweDBjZGRkZTUzLCAweDFkNGM5ZTlmLCAweDFkNGExNzRmLCAweDBjZTM5ZWQyLCAweDBjZjRkZDUyLCAweDFkNDI3YTk3LAotCTB4MWQzZmVlYzMsIDB4MGNmYTliZDIsIDB4MGQwYmQ0NTIsIDB4MWQzODQ0ODMsIDB4MWQzNWI0MmQsIDB4MGQxMTkwZDEsIDB4MGQyMmMzNDcsIDB4MWQyZGZjNjgsCi0JMHgxZDJiNjc5MSwgMHgwZDI4N2RjMSwgMHgwZDM5YWEyMSwgMHgxZDIzYTI0ZSwgMHgxZDIxMDhmOCwgMHgwZDNmNjI5MiwgMHgwZDUwODhkMywgMHgxZDE5MzYzYSwKLQkweDFkMTY5ODY3LCAweDBkNTYzZjM4LCAweDBkNjc1ZjRlLCAweDFkMGViODMzLCAweDFkMGMxNWU0LCAweDBkNmQxM2EzLCAweDBkN2UyZDg1LCAweDFkMDQyODNmLAotCTB4MWQwMTgxNzYsIDB4MGQ4M2RmYzYsIDB4MGQ5NGYzNjksIDB4MWNmOTg2NjYsIDB4MWNmNmRiMjQsIDB4MGQ5YWEzOTMsIDB4MGRhYmIwZWMsIDB4MWNlZWQyYWQsCi0JMHgxY2VjMjJmNCwgMHgwZGIxNWVmYywgMHgwZGMyNjYwMCwgMHgxY2U0MGQxYiwgMHgxY2UxNThlZCwgMHgwZGM4MTFmMywgMHgwZGQ5MTI5OCwgMHgxY2Q5MzViNywKLQkweDFjZDY3ZDE1LCAweDBkZGViYzY5LCAweDBkZWZiNmE1LCAweDFjY2U0Yzg3LCAweDFjY2I4Zjc0LCAweDBkZjU1ZTUxLCAweDBlMDY1MjE5LCAweDFjYzM1MTkyLAotCTB4MWNjMDkwMGYsIDB4MGUwYmY3OWMsIDB4MGUxY2U0ZTYsIDB4MWNiODQ0ZGYsIDB4MWNiNTdlZWUsIDB4MGUyMjg4M2UsIDB4MGUzMzZlZmYsIDB4MWNhZDI2NzUsCi0JMHgxY2FhNWMxNywgMHgwZTM5MTAyNywgMHgwZTQ5ZjA1NSwgMHgxY2ExZjY1YiwgMHgxYzlmMjc5MiwgMHgwZTRmOGY0YiwgMHgwZTYwNjhkYiwgMHgxYzk2YjQ5NywKLQkweDFjOTNlMTY1LCAweDBlNjYwNTlhLCAweDBlNzZkODgzLCAweDFjOGI2MTMxLCAweDFjODg4OTk3LCAweDBlN2M3MzA4LCAweDBlOGQzZjNlLCAweDFjN2ZmYzJmLAotCTB4MWM3ZDIwMmYsIDB4MGU5MmQ3ODcsIDB4MGVhMzlkMDAsIDB4MWM3NDg1OTksIDB4MWM3MWE1MzUsIDB4MGVhOTMzMDgsIDB4MGViOWYxYmEsIDB4MWM2OGZkNzUsCi0JMHgxYzY2MThhZSwgMHgwZWJmODU3ZCwgMHgwZWQwM2Q1ZSwgMHgxYzVkNjNjYSwgMHgxYzVhN2FhNCwgMHgwZWQ1Y2VkYSwgMHgwZWU2N2ZkZiwgMHgxYzUxYjhhMSwKLQkweDFjNGVjYjFjLCAweDBlZWMwZjEwLCAweDBlZmNiOTJmLCAweDFjNDVmYzAwLCAweDFjNDMwYTFkLCAweDBmMDI0NjEyLCAweDBmMTJlOTQxLCAweDFjM2EyZGVkLAotCTB4MWMzNzM3YjAsIDB4MGYxODczZDIsIDB4MGYyOTEwMDYsIDB4MWMyZTRlNzIsIDB4MWMyYjUzZGIsIDB4MGYyZTk4NDIsIDB4MGYzZjJkNzEsIDB4MWMyMjVkOTQsCi0JMHgxYzFmNWVhNiwgMHgwZjQ0YjM1NCwgMHgwZjU1NDE3NSwgMHgxYzE2NWI1YiwgMHgxYzEzNTgxOCwgMHgwZjVhYzRmYywgMHgwZjZiNGMwMywgMHgxYzBhNDdjZiwKLQkweDFjMDc0MDM4LCAweDBmNzBjZDJhLCAweDBmODE0ZDBlLCAweDFiZmUyMmY4LCAweDFiZmIxNzBmLCAweDBmODZjYmQzLCAweDBmOTc0NDg5LCAweDFiZjFlY2RiLAotCTB4MWJlZWRjYTIsIDB4MGY5Y2MwZTcsIDB4MGZhZDMyNjUsIDB4MWJlNWE1ODIsIDB4MWJlMjkwZmIsIDB4MGZiMmFjNWEsIDB4MGZjMzE2OTcsIDB4MWJkOTRjZjQsCi0JMHgxYmQ2MzQyMSwgMHgwZmM4OGUxZSwgMHgwZmQ4ZjEwZiwgMHgxYmNjZTMzNywgMHgxYmM5YzYxYSwgMHgwZmRlNjYyNiwgMHgwZmVlYzFjMCwgMHgxYmMwNjg1NSwKLQkweDFiYmQ0NmYwLCAweDBmZjQzNDY0LCAweDEwMDQ4ODllLCAweDFiYjNkYzU1LCAweDFiYjBiNmE5LCAweDEwMDlmOGNiLCAweDEwMWE0NTlhLCAweDFiYTczZjNkLAotCTB4MWJhNDE1NGQsIDB4MTAxZmIzNGQsIDB4MTAyZmY4YTgsIDB4MWI5YTkxMTcsIDB4MWI5NzYyZTQsIDB4MTAzNTYzZGMsIDB4MTA0NWExYjksIDB4MWI4ZGQxZWEsCi0JMHgxYjhhOWY3NywgMHgxMDRiMGE2YywgMHgxMDViNDBjMSwgMHgxYjgxMDFiZSwgMHgxYjdkY2IwYywgMHgxMDYwYTZlZiwgMHgxMDcwZDViMSwgMHgxYjc0MjA5YiwKLQkweDFiNzBlNWFjLCAweDEwNzYzOTU4LCAweDEwODY2MDdlLCAweDFiNjcyZTg4LCAweDFiNjNlZjVmLCAweDEwOGJjMTlhLCAweDEwOWJlMTE5LCAweDFiNWEyYjhlLAotCTB4MWI1NmU4MmMsIDB4MTBhMTNmYTYsIDB4MTBiMTU3NzUsIDB4MWI0ZDE3YjQsIDB4MWI0OWQwMWMsIDB4MTBiNmIzNzEsIDB4MTBjNmMzODUsIDB4MWIzZmYzMDQsCi0JMHgxYjNjYTczNywgMHgxMGNjMWNlYywgMHgxMGRjMjUzYywgMHgxYjMyYmQ4NCwgMHgxYjJmNmQ4NSwgMHgxMGUxN2MwYiwgMHgxMGYxN2M4ZCwgMHgxYjI1NzczZCwKLQkweDFiMjIyMzBlLCAweDEwZjZkMGMwLCAweDExMDZjOTZhLCAweDFiMTgyMDM4LCAweDFiMTRjN2RhLCAweDExMGMxYWZlLCAweDExMWMwYmM2LCAweDFiMGFiODdjLAotCTB4MWIwNzViZjEsIDB4MTEyMTVhYjgsIDB4MTEzMTQzOTUsIDB4MWFmZDQwMTIsIDB4MWFmOWRmNWQsIDB4MTEzNjhmZTEsIDB4MTE0NjcwYzgsIDB4MWFlZmI3MDIsCi0JMHgxYWVjNTIyNSwgMHgxMTRiYmE2YiwgMHgxMTViOTM1NCwgMHgxYWUyMWQ1NCwgMHgxYWRlYjQ1MSwgMHgxMTYwZGE0YiwgMHgxMTcwYWIyYSwgMHgxYWQ0NzMxMSwKLQkweDFhZDEwNWU5LCAweDExNzVlZjcyLCAweDExODViODNmLCAweDFhYzZiODQxLCAweDFhYzM0NmY4LCAweDExOGFmOWQ0LCAweDExOWFiYTg0LCAweDFhYjhlY2VjLAotCTB4MWFiNTc3ODQsIDB4MTE5ZmY5NjQsIDB4MTFhZmIxZWUsIDB4MWFhYjExMWMsIDB4MWFhNzk3OTYsIDB4MTFiNGVlMTQsIDB4MTFjNDllNmYsIDB4MWE5ZDI0ZDksCi0JMHgxYTk5YTczNywgMHgxMWM5ZDdkOSwgMHgxMWQ5N2ZmOSwgMHgxYThmMjgyYiwgMHgxYThiYTY3MCwgMHgxMWRlYjZhNCwgMHgxMWVlNTY4MiwgMHgxYTgxMWIxYiwKLQkweDFhN2Q5NTQ5LCAweDExZjM4YTZhLCAweDEyMDMyMWZhLCAweDFhNzJmZGIyLCAweDFhNmY3M2NhLCAweDEyMDg1MzFjLCAweDEyMTdlMjU2LCAweDFhNjRjZmY4LAotCTB4MWE2MTQxZmQsIDB4MTIxZDEwYWYsIDB4MTIyYzk3ODksIDB4MWE1NjkxZjUsIDB4MWE1MmZmZWIsIDB4MTIzMWMzMTYsIDB4MTI0MTQxODYsIDB4MWE0ODQzYjQsCi0JMHgxYTQ0YWQ5YiwgMHgxMjQ2NmE0NCwgMHgxMjU1ZTA0MSwgMHgxYTM5ZTUzZCwgMHgxYTM2NGIxNywgMHgxMjViMDYyYiwgMHgxMjZhNzNhYywgMHgxYTJiNzY5OCwKLQkweDFhMjdkODY4LCAweDEyNmY5NmMxLCAweDEyN2VmYmJiLCAweDFhMWNmN2NlLCAweDFhMTk1NTk3LCAweDEyODQxYmY2LCAweDEyOTM3ODYxLCAweDFhMGU2OGU5LAotCTB4MWEwYWMyYWMsIDB4MTI5ODk1YzAsIDB4MTJhN2U5OTEsIDB4MTlmZmM5ZjEsIDB4MTlmYzFmYjEsIDB4MTJhZDA0MTIsIDB4MTJiYzRmNDAsIDB4MTlmMTFhZjAsCi0JMHgxOWVkNmNhZiwgMHgxMmMxNjZkZSwgMHgxMmQwYTk2MCwgMHgxOWUyNWJlZSwgMHgxOWRlYTlhZSwgMHgxMmQ1YmUxOCwgMHgxMmU0ZjdlNSwgMHgxOWQzOGNmNCwKLQkweDE5Y2ZkNmI4LCAweDEyZWEwOWI0LCAweDEyZjkzYWMyLCAweDE5YzRhZTBjLCAweDE5YzBmM2Q2LCAweDEyZmU0OWE2LCAweDEzMGQ3MWViLCAweDE5YjViZjNmLAotCTB4MTliMjAxMTEsIDB4MTMxMjdkZTAsIDB4MTMyMTlkNTMsIDB4MTlhNmMwOTYsIDB4MTlhMmZlNzMsIDB4MTMyNmE2NTYsIDB4MTMzNWJjZWYsIDB4MTk5N2IyMWIsCi0JMHgxOTkzZWMwNCwgMHgxMzNhYzJmYywgMHgxMzQ5ZDBiMCwgMHgxOTg4OTNkNiwgMHgxOTg0YzljZSwgMHgxMzRlZDNjNSwgMHgxMzVkZDg4YywgMHgxOTc5NjVkMCwKLQkweDE5NzU5N2RhLCAweDEzNjJkOGE2LCAweDEzNzFkNDc2LCAweDE5NmEyODE1LCAweDE5NjY1NjMyLCAweDEzNzZkMTkxLCAweDEzODVjNDYxLCAweDE5NWFkYWFiLAotCTB4MTk1NzA0ZGYsIDB4MTM4YWJlN2IsIDB4MTM5OWE4NDEsIDB4MTk0YjdkOWUsIDB4MTk0N2EzZWIsIDB4MTM5ZTlmNTYsIDB4MTNhZDgwMGEsIDB4MTkzYzEwZjcsCi0JMHgxOTM4MzM1ZSwgMHgxM2IyNzQxNywgMHgxM2MxNGJiMCwgMHgxOTJjOTRiZiwgMHgxOTI4YjM0MywgMHgxM2M2M2NiMiwgMHgxM2Q1MGIyNiwgMHgxOTFkMDhmZiwKLQkweDE5MTkyM2EzLCAweDEzZDlmOTFiLCAweDEzZThiZTYwLCAweDE5MGQ2ZGMxLCAweDE5MDk4NDg4LCAweDEzZWRhOTQ0LCAweDEzZmM2NTUzLCAweDE4ZmRjMzEwLAotCTB4MThmOWQ1ZmEsIDB4MTQwMTRkMjMsIDB4MTQwZmZmZjEsIDB4MThlZTA4ZjQsIDB4MThlYTE4MDUsIDB4MTQxNGU0YWEsIDB4MTQyMzhlMmYsIDB4MThkZTNmNzcsCi0JMHgxOGRhNGFiMiwgMHgxNDI4NmZjZSwgMHgxNDM3MTAwMSwgMHgxOGNlNjZhMywgMHgxOGNhNmUwYSwgMHgxNDNiZWU4MywgMHgxNDRhODU1YiwgMHgxOGJlN2U4MiwKLQkweDE4YmE4MjE3LCAweDE0NGY2MGJkLCAweDE0NWRlZTMwLCAweDE4YWU4NzFlLCAweDE4YWE4NmUzLCAweDE0NjJjNjcwLCAweDE0NzE0YTc2LCAweDE4OWU4MDgwLAotCTB4MTg5YTdjNzgsIDB4MTQ3NjFmOGYsIDB4MTQ4NDlhMWYsIDB4MTg4ZTZhYjIsIDB4MTg4YTYyZTAsIDB4MTQ4OTZjMGYsIDB4MTQ5N2RkMjAsIDB4MTg3ZTQ1YmUsCi0JMHgxODdhM2EyNSwgMHgxNDljYWJlNCwgMHgxNGFiMTM2ZCwgMHgxODZlMTFhZiwgMHgxODZhMDI1MCwgMHgxNGFmZGYwMywgMHgxNGJlM2NmYSwgMHgxODVkY2U4ZSwKLQkweDE4NTliYjZjLCAweDE0YzMwNTVlLCAweDE0ZDE1OWJjLCAweDE4NGQ3YzY1LCAweDE4NDk2NTgzLCAweDE0ZDYxZWViLCAweDE0ZTQ2OWE2LCAweDE4M2QxYjNlLAotCTB4MTgzOTAwOWUsIDB4MTRlOTJiOWUsIDB4MTRmNzZjYWQsIDB4MTgyY2FiMjQsIDB4MTgyODhjYzgsIDB4MTRmYzJiNmEsIDB4MTUwYTYyYzYsIDB4MTgxYzJjMjAsCi0JMHgxODE4MGEwYywgMHgxNTBmMWU0NSwgMHgxNTFkNGJlMywgMHgxODBiOWUzZCwgMHgxODA3Nzg3MywgMHgxNTIyMDQyMiwgMHgxNTMwMjdmYiwgMHgxN2ZiMDE4NSwKLQkweDE3ZjZkODA3LCAweDE1MzRkY2Y2LCAweDE1NDJmNzAwLCAweDE3ZWE1NjAyLCAweDE3ZTYyOGQzLCAweDE1NDdhOGI1LCAweDE1NTViOGU4LCAweDE3ZDk5YmJlLAotCTB4MTdkNTZhZTAsIDB4MTU1YTY3NTQsIDB4MTU2ODZkYTcsIDB4MTdjOGQyYzQsIDB4MTdjNDllM2IsIDB4MTU2ZDE4YzcsIDB4MTU3YjE1MzIsIDB4MTdiN2ZiMWYsCi0JMHgxN2IzYzJlYywgMHgxNTdmYmQwMywgMHgxNThkYWY3YywgMHgxN2E3MTRkNywgMHgxN2EyZDhmZSwgMHgxNTkyNTNmYiwgMHgxNWEwM2M3YSwgMHgxNzk2MWZmOSwKLQkweDE3OTFlMDdiLCAweDE1YTRkZGE1LCAweDE1YjJiYzIyLCAweDE3ODUxYzhlLCAweDE3ODBkOTZmLCAweDE1Yjc1OWY1LCAweDE1YzUyZTY3LCAweDE3NzQwYWExLAotCTB4MTc2ZmMzZTMsIDB4MTVjOWM4ZTAsIDB4MTVkNzkzM2YsIDB4MTc2MmVhM2QsIDB4MTc1ZTlmZTIsIDB4MTVkYzJhNWEsIDB4MTVlOWVhOWQsIDB4MTc1MWJiNmIsCi0JMHgxNzRkNmQ3NywgMHgxNWVlN2U1OCwgMHgxNWZjMzQ3NywgMHgxNzQwN2UzNywgMHgxNzNjMmNhYywgMHgxNjAwYzRjZiwgMHgxNjBlNzBjMSwgMHgxNzJmMzJhYiwKLQkweDE3MmFkZDhjLCAweDE2MTJmZGIzLCAweDE2MjA5ZjcwLCAweDE3MWRkOGQyLCAweDE3MTk4MDIxLCAweDE2MjUyOGZhLCAweDE2MzJjMDc4LCAweDE3MGM3MGI3LAotCTB4MTcwODE0NzcsIDB4MTYzNzQ2OTcsIDB4MTY0NGQzZDAsIDB4MTZmYWZhNjQsIDB4MTZmNjlhOTcsIDB4MTY0OTU2ODAsIDB4MTY1NmQ5NmEsIDB4MTZlOTc1ZTQsCi0JMHgxNmU1MTI4ZSwgMHgxNjViNThhYSwgMHgxNjY4ZDEzZSwgMHgxNmQ3ZTM0MSwgMHgxNmQzN2M2NSwgMHgxNjZkNGQwYSwgMHgxNjdhYmIzZSwgMHgxNmM2NDI4OCwKLQkweDE2YzFkODI3LCAweDE2N2YzMzk0LCAweDE2OGM5NzYwLCAweDE2YjQ5M2MyLCAweDE2YjAyNWUwLCAweDE2OTEwYzNkLCAweDE2OWU2NTlhLCAweDE2YTJkNmZiCi19OwotCi1jb25zdCBpbnQgdHdpZFRhYjUxMls4KjYgKyAzMio2ICsgMTI4KjZdID0gewotCTB4MjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MWQ5MDZiY2YsIDB4MGMzZWYxNTMsIDB4MTZhMDllNjYsIDB4MTZhMDllNjYsIDB4MGMzZWYxNTMsIDB4MWQ5MDZiY2YsCi0JMHgyMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgxZjYyOTdkMCwgMHgwNjNlMmUwZiwgMHgxZDkwNmJjZiwgMHgwYzNlZjE1MywgMHgxYTliNjYyOSwgMHgxMWM3M2IzYSwKLQkweDIwMDAwMDAwLCAweDAwMDAwMDAwLCAweDFhOWI2NjI5LCAweDExYzczYjNhLCAweDBjM2VmMTUzLCAweDFkOTA2YmNmLCAweGY5YzFkMWYxLCAweDFmNjI5N2QwLAotCTB4MDAwMDAwMDAsIDB4MjAwMDAwMDAsIDB4ZjNjMTBlYWQsIDB4MWQ5MDZiY2YsIDB4ZTk1ZjYxOWEsIDB4MTZhMDllNjYsIDB4ZTI2Zjk0MzEsIDB4MGMzZWYxNTMsCi0JMHgxNmEwOWU2NiwgMHgxNmEwOWU2NiwgMHgxMWM3M2IzYSwgMHgxYTliNjYyOSwgMHgwYzNlZjE1MywgMHgxZDkwNmJjZiwgMHgwNjNlMmUwZiwgMHgxZjYyOTdkMCwKLQkweGU5NWY2MTlhLCAweDE2YTA5ZTY2LCAweGUwOWQ2ODMwLCAweDA2M2UyZTBmLCAweGUyNmY5NDMxLCAweGYzYzEwZWFkLCAweGVlMzhjNGM2LCAweGU1NjQ5OWQ3LAotCi0JMHgyMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgxZmQ4OGRhNCwgMHgwMzIyZjRkOCwgMHgxZjYyOTdkMCwgMHgwNjNlMmUwZiwgMHgxZTlmNDE1NywgMHgwOTRhMDMxNywKLQkweDIwMDAwMDAwLCAweDAwMDAwMDAwLCAweDFmZjYyMWUzLCAweDAxOTFmNjVmLCAweDFmZDg4ZGE0LCAweDAzMjJmNGQ4LCAweDFmYTc1NTdmLCAweDA0YjIwNDFjLAotCTB4MjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MWZhNzU1N2YsIDB4MDRiMjA0MWMsIDB4MWU5ZjQxNTcsIDB4MDk0YTAzMTcsIDB4MWNlZDdhZjQsIDB4MGRhZTg4MDUsCi0JMHgxZDkwNmJjZiwgMHgwYzNlZjE1MywgMHgxYzM4YjJmMiwgMHgwZjE1YWU5YywgMHgxYTliNjYyOSwgMHgxMWM3M2IzYSwgMHgxOGJjODA2YiwgMHgxNDRjZjMyNSwKLQkweDFmNjI5N2QwLCAweDA2M2UyZTBmLCAweDFmMGE3ZWZjLCAweDA3YzY3ZTVmLCAweDFlOWY0MTU3LCAweDA5NGEwMzE3LCAweDFlMjEyMTA1LCAweDBhYzdjZDNiLAotCTB4MWE5YjY2MjksIDB4MTFjNzNiM2EsIDB4MTdiNWRmMjIsIDB4MTU3ZDY5MzUsIDB4MTQ0Y2YzMjUsIDB4MThiYzgwNmIsIDB4MTA3Mzg3OTksIDB4MWI3MjgzNDUsCi0JMHgxNmEwOWU2NiwgMHgxNmEwOWU2NiwgMHgxNDRjZjMyNSwgMHgxOGJjODA2YiwgMHgxMWM3M2IzYSwgMHgxYTliNjYyOSwgMHgwZjE1YWU5YywgMHgxYzM4YjJmMiwKLQkweDFkOTA2YmNmLCAweDBjM2VmMTUzLCAweDFjZWQ3YWY0LCAweDBkYWU4ODA1LCAweDFjMzhiMmYyLCAweDBmMTVhZTljLCAweDFiNzI4MzQ1LCAweDEwNzM4Nzk5LAotCTB4MGMzZWYxNTMsIDB4MWQ5MDZiY2YsIDB4MDdjNjdlNWYsIDB4MWYwYTdlZmMsIDB4MDMyMmY0ZDgsIDB4MWZkODhkYTQsIDB4ZmU2ZTA5YTEsIDB4MWZmNjIxZTMsCi0JMHgwYzNlZjE1MywgMHgxZDkwNmJjZiwgMHgwOTRhMDMxNywgMHgxZTlmNDE1NywgMHgwNjNlMmUwZiwgMHgxZjYyOTdkMCwgMHgwMzIyZjRkOCwgMHgxZmQ4OGRhNCwKLQkweDFhOWI2NjI5LCAweDExYzczYjNhLCAweDE5YjNlMDQ4LCAweDEzMGZmN2ZkLCAweDE4YmM4MDZiLCAweDE0NGNmMzI1LCAweDE3YjVkZjIyLCAweDE1N2Q2OTM1LAotCTB4ZjljMWQxZjEsIDB4MWY2Mjk3ZDAsIDB4ZjUzODMyYzUsIDB4MWUyMTIxMDUsIDB4ZjBlYTUxNjQsIDB4MWMzOGIyZjIsIDB4ZWNmMDA4MDMsIDB4MTliM2UwNDgsCi0JMHgwMDAwMDAwMCwgMHgyMDAwMDAwMCwgMHhmY2RkMGIyOCwgMHgxZmQ4OGRhNCwgMHhmOWMxZDFmMSwgMHgxZjYyOTdkMCwgMHhmNmI1ZmNlOSwgMHgxZTlmNDE1NywKLQkweDE2YTA5ZTY2LCAweDE2YTA5ZTY2LCAweDE1N2Q2OTM1LCAweDE3YjVkZjIyLCAweDE0NGNmMzI1LCAweDE4YmM4MDZiLCAweDEzMGZmN2ZkLCAweDE5YjNlMDQ4LAotCTB4ZTk1ZjYxOWEsIDB4MTZhMDllNjYsIDB4ZTY0YzFmYjgsIDB4MTMwZmY3ZmQsIDB4ZTNjNzRkMGUsIDB4MGYxNWFlOWMsIDB4ZTFkZWRlZmIsIDB4MGFjN2NkM2IsCi0JMHhmM2MxMGVhZCwgMHgxZDkwNmJjZiwgMHhmMGVhNTE2NCwgMHgxYzM4YjJmMiwgMHhlZTM4YzRjNiwgMHgxYTliNjYyOSwgMHhlYmIzMGNkYiwgMHgxOGJjODA2YiwKLQkweDExYzczYjNhLCAweDFhOWI2NjI5LCAweDEwNzM4Nzk5LCAweDFiNzI4MzQ1LCAweDBmMTVhZTljLCAweDFjMzhiMmYyLCAweDBkYWU4ODA1LCAweDFjZWQ3YWY0LAotCTB4ZTA5ZDY4MzAsIDB4MDYzZTJlMGYsIDB4ZTAwOWRlMWQsIDB4MDE5MWY2NWYsIDB4ZTAyNzcyNWMsIDB4ZmNkZDBiMjgsIDB4ZTBmNTgxMDQsIDB4ZjgzOTgxYTEsCi0JMHhlOTVmNjE5YSwgMHgxNmEwOWU2NiwgMHhlNzQzN2Y5NSwgMHgxNDRjZjMyNSwgMHhlNTY0OTlkNywgMHgxMWM3M2IzYSwgMHhlM2M3NGQwZSwgMHgwZjE1YWU5YywKLQkweDBjM2VmMTUzLCAweDFkOTA2YmNmLCAweDBhYzdjZDNiLCAweDFlMjEyMTA1LCAweDA5NGEwMzE3LCAweDFlOWY0MTU3LCAweDA3YzY3ZTVmLCAweDFmMGE3ZWZjLAotCTB4ZTI2Zjk0MzEsIDB4ZjNjMTBlYWQsIDB4ZTQ4ZDdjYmIsIDB4ZWY4Yzc4NjcsIDB4ZTc0MzdmOTUsIDB4ZWJiMzBjZGIsIDB4ZWE4Mjk2Y2IsIDB4ZTg0YTIwZGUsCi0JMHhlMjZmOTQzMSwgMHgwYzNlZjE1MywgMHhlMTYwYmVhOSwgMHgwOTRhMDMxNywgMHhlMDlkNjgzMCwgMHgwNjNlMmUwZiwgMHhlMDI3NzI1YywgMHgwMzIyZjRkOCwKLQkweDA2M2UyZTBmLCAweDFmNjI5N2QwLCAweDA0YjIwNDFjLCAweDFmYTc1NTdmLCAweDAzMjJmNGQ4LCAweDFmZDg4ZGE0LCAweDAxOTFmNjVmLCAweDFmZjYyMWUzLAotCTB4ZWUzOGM0YzYsIDB4ZTU2NDk5ZDcsIDB4ZjI1MTc3ZmIsIDB4ZTMxMjg1MGMsIDB4ZjZiNWZjZTksIDB4ZTE2MGJlYTksIDB4ZmI0ZGZiZTQsIDB4ZTA1OGFhODEsCi0KLQkweDIwMDAwMDAwLCAweDAwMDAwMDAwLCAweDFmZmQ4ODYxLCAweDAwYzkwYWIwLCAweDFmZjYyMWUzLCAweDAxOTFmNjVmLCAweDFmZTljZGFkLCAweDAyNWFhNDEyLAotCTB4MjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MWZmZjYyMTcsIDB4MDA2NDg3NDgsIDB4MWZmZDg4NjEsIDB4MDBjOTBhYjAsIDB4MWZmYTcyZjAsIDB4MDEyZDg2NTcsCi0JMHgyMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgxZmZhNzJmMCwgMHgwMTJkODY1NywgMHgxZmU5Y2RhZCwgMHgwMjVhYTQxMiwgMHgxZmNlMTVmZCwgMHgwMzg2ZjBiOSwKLQkweDFmZDg4ZGE0LCAweDAzMjJmNGQ4LCAweDFmYzI2NDcxLCAweDAzZWFjOWNiLCAweDFmYTc1NTdmLCAweDA0YjIwNDFjLCAweDFmODc2NGZhLCAweDA1Nzg4NTExLAotCTB4MWZmNjIxZTMsIDB4MDE5MWY2NWYsIDB4MWZmMDk1NjYsIDB4MDFmNjU2ZTgsIDB4MWZlOWNkYWQsIDB4MDI1YWE0MTIsIDB4MWZlMWNhZmQsIDB4MDJiZWRhMDEsCi0JMHgxZmE3NTU3ZiwgMHgwNGIyMDQxYywgMHgxZjc1OTlhNCwgMHgwNWRiNzY3OCwgMHgxZjM4ZjNhYywgMHgwNzAyZTA5YiwgMHgxZWYxNzhhNCwgMHgwODI3ZGMwNywKLQkweDFmNjI5N2QwLCAweDA2M2UyZTBmLCAweDFmMzhmM2FjLCAweDA3MDJlMDliLCAweDFmMGE3ZWZjLCAweDA3YzY3ZTVmLCAweDFlZDc0MGU3LCAweDA4ODhlOTMxLAotCTB4MWZkODhkYTQsIDB4MDMyMmY0ZDgsIDB4MWZjZTE1ZmQsIDB4MDM4NmYwYjksIDB4MWZjMjY0NzEsIDB4MDNlYWM5Y2IsIDB4MWZiNTc5NzIsIDB4MDQ0ZTdjMzQsCi0JMHgxZTlmNDE1NywgMHgwOTRhMDMxNywgMHgxZTQyNmE0YiwgMHgwYTY4ZjEyMSwgMHgxZGRiMTNiNywgMHgwYjg0NDI5OCwgMHgxZDY5NjE3NCwgMHgwYzliOTUzMiwKLQkweDFlOWY0MTU3LCAweDA5NGEwMzE3LCAweDFlNjI4OGVjLCAweDBhMDlhZTRhLCAweDFlMjEyMTA1LCAweDBhYzdjZDNiLCAweDFkZGIxM2I3LCAweDBiODQ0Mjk4LAotCTB4MWZhNzU1N2YsIDB4MDRiMjA0MWMsIDB4MWY5N2Y5MjUsIDB4MDUxNTVkYWMsIDB4MWY4NzY0ZmEsIDB4MDU3ODg1MTEsIDB4MWY3NTk5YTQsIDB4MDVkYjc2NzgsCi0JMHgxY2VkN2FmNCwgMHgwZGFlODgwNSwgMHgxYzY3OGIzNSwgMHgwZWJjYmJhZSwgMHgxYmQ3YzBhYywgMHgwZmM1ZDI2ZSwgMHgxYjNlNGQzZiwgMHgxMGM5NzA0ZCwKLQkweDFkOTA2YmNmLCAweDBjM2VmMTUzLCAweDFkNDEzNGQxLCAweDBjZjdiY2EyLCAweDFjZWQ3YWY0LCAweDBkYWU4ODA1LCAweDFjOTU0YjIxLCAweDBlNjMzNzRkLAotCTB4MWY2Mjk3ZDAsIDB4MDYzZTJlMGYsIDB4MWY0ZTYwM2IsIDB4MDZhMGE4MDksIDB4MWYzOGYzYWMsIDB4MDcwMmUwOWIsIDB4MWYyMjUyZjcsIDB4MDc2NGQzZjksCi0JMHgxYTliNjYyOSwgMHgxMWM3M2IzYSwgMHgxOWVmNDNlZiwgMHgxMmJlZGIyNiwgMHgxOTNhMjI0YSwgMHgxM2FmZmEyOSwgMHgxODdjNDAxMCwgMHgxNDlhNDQ5YywKLQkweDFjMzhiMmYyLCAweDBmMTVhZTljLCAweDFiZDdjMGFjLCAweDBmYzVkMjZlLCAweDFiNzI4MzQ1LCAweDEwNzM4Nzk5LCAweDFiMDkwYTU4LCAweDExMWViMzU0LAotCTB4MWYwYTdlZmMsIDB4MDdjNjdlNWYsIDB4MWVmMTc4YTQsIDB4MDgyN2RjMDcsIDB4MWVkNzQwZTcsIDB4MDg4OGU5MzEsIDB4MWViYmQ4YzksIDB4MDhlOWEyMjAsCi0JMHgxN2I1ZGYyMiwgMHgxNTdkNjkzNSwgMHgxNmU3NDQ1NSwgMHgxNjU5MTkyNiwgMHgxNjEwYjc1NSwgMHgxNzJkMDgzOCwgMHgxNTMyODI5MywgMHgxN2Y4ZWNlMywKLQkweDFhOWI2NjI5LCAweDExYzczYjNhLCAweDFhMjlhN2EwLCAweDEyNmQwNTRkLCAweDE5YjNlMDQ4LCAweDEzMGZmN2ZkLCAweDE5M2EyMjRhLCAweDEzYWZmYTI5LAotCTB4MWU5ZjQxNTcsIDB4MDk0YTAzMTcsIDB4MWU4MTdiYWIsIDB4MDlhYTA4NjEsIDB4MWU2Mjg4ZWMsIDB4MGEwOWFlNGEsIDB4MWU0MjZhNGIsIDB4MGE2OGYxMjEsCi0JMHgxNDRjZjMyNSwgMHgxOGJjODA2YiwgMHgxMzYwNThiMSwgMHgxOTc3N2VmNSwgMHgxMjZkMDU0ZCwgMHgxYTI5YTdhMCwgMHgxMTczNGQ2NCwgMHgxYWQyYmM5ZSwKLQkweDE4YmM4MDZiLCAweDE0NGNmMzI1LCAweDE4M2IwZTBjLCAweDE0ZTZjYWJjLCAweDE3YjVkZjIyLCAweDE1N2Q2OTM1LCAweDE3MmQwODM4LCAweDE2MTBiNzU1LAotCTB4MWUyMTIxMDUsIDB4MGFjN2NkM2IsIDB4MWRmZWFlNjIsIDB4MGIyNjNlZWYsIDB4MWRkYjEzYjcsIDB4MGI4NDQyOTgsIDB4MWRiNjUyNjIsIDB4MGJlMWQ0OTksCi0JMHgxMDczODc5OSwgMHgxYjcyODM0NSwgMHgwZjZlMGNhOSwgMHgxYzA4YzQyNiwgMHgwZTYzMzc0ZCwgMHgxYzk1NGIyMSwgMHgwZDUzNjQxNiwgMHgxZDE3ZTc3NCwKLQkweDE2YTA5ZTY2LCAweDE2YTA5ZTY2LCAweDE2MTBiNzU1LCAweDE3MmQwODM4LCAweDE1N2Q2OTM1LCAweDE3YjVkZjIyLCAweDE0ZTZjYWJjLCAweDE4M2IwZTBjLAotCTB4MWQ5MDZiY2YsIDB4MGMzZWYxNTMsIDB4MWQ2OTYxNzQsIDB4MGM5Yjk1MzIsIDB4MWQ0MTM0ZDEsIDB4MGNmN2JjYTIsIDB4MWQxN2U3NzQsIDB4MGQ1MzY0MTYsCi0JMHgwYzNlZjE1MywgMHgxZDkwNmJjZiwgMHgwYjI2M2VlZiwgMHgxZGZlYWU2MiwgMHgwYTA5YWU0YSwgMHgxZTYyODhlYywgMHgwOGU5YTIyMCwgMHgxZWJiZDhjOSwKLQkweDE0NGNmMzI1LCAweDE4YmM4MDZiLCAweDEzYWZmYTI5LCAweDE5M2EyMjRhLCAweDEzMGZmN2ZkLCAweDE5YjNlMDQ4LCAweDEyNmQwNTRkLCAweDFhMjlhN2EwLAotCTB4MWNlZDdhZjQsIDB4MGRhZTg4MDUsIDB4MWNjMWYwZjQsIDB4MGUwOTI0ZWMsIDB4MWM5NTRiMjEsIDB4MGU2MzM3NGQsIDB4MWM2NzhiMzUsIDB4MGViY2JiYWUsCi0JMHgwN2M2N2U1ZiwgMHgxZjBhN2VmYywgMHgwNmEwYTgwOSwgMHgxZjRlNjAzYiwgMHgwNTc4ODUxMSwgMHgxZjg3NjRmYSwgMHgwNDRlN2MzNCwgMHgxZmI1Nzk3MiwKLQkweDExYzczYjNhLCAweDFhOWI2NjI5LCAweDExMWViMzU0LCAweDFiMDkwYTU4LCAweDEwNzM4Nzk5LCAweDFiNzI4MzQ1LCAweDBmYzVkMjZlLCAweDFiZDdjMGFjLAotCTB4MWMzOGIyZjIsIDB4MGYxNWFlOWMsIDB4MWMwOGM0MjYsIDB4MGY2ZTBjYTksIDB4MWJkN2MwYWMsIDB4MGZjNWQyNmUsIDB4MWJhNWFhNjcsIDB4MTAxY2ZjODcsCi0JMHgwMzIyZjRkOCwgMHgxZmQ4OGRhNCwgMHgwMWY2NTZlOCwgMHgxZmYwOTU2NiwgMHgwMGM5MGFiMCwgMHgxZmZkODg2MSwgMHhmZjliNzhiOCwgMHgxZmZmNjIxNywKLQkweDBmMTVhZTljLCAweDFjMzhiMmYyLCAweDBlNjMzNzRkLCAweDFjOTU0YjIxLCAweDBkYWU4ODA1LCAweDFjZWQ3YWY0LCAweDBjZjdiY2EyLCAweDFkNDEzNGQxLAotCTB4MWI3MjgzNDUsIDB4MTA3Mzg3OTksIDB4MWIzZTRkM2YsIDB4MTBjOTcwNGQsIDB4MWIwOTBhNTgsIDB4MTExZWIzNTQsIDB4MWFkMmJjOWUsIDB4MTE3MzRkNjQsCi0JMHhmZTZlMDlhMSwgMHgxZmY2MjFlMywgMHhmZDQxMjVmZiwgMHgxZmUxY2FmZCwgMHhmYzE1MzYzNSwgMHgxZmMyNjQ3MSwgMHhmYWVhYTI1NCwgMHgxZjk3ZjkyNSwKLQkweDBjM2VmMTUzLCAweDFkOTA2YmNmLCAweDBiODQ0Mjk4LCAweDFkZGIxM2I3LCAweDBhYzdjZDNiLCAweDFlMjEyMTA1LCAweDBhMDlhZTRhLCAweDFlNjI4OGVjLAotCTB4MWE5YjY2MjksIDB4MTFjNzNiM2EsIDB4MWE2MzA5MWIsIDB4MTIxYTc5OTksIDB4MWEyOWE3YTAsIDB4MTI2ZDA1NGQsIDB4MTllZjQzZWYsIDB4MTJiZWRiMjYsCi0JMHhmOWMxZDFmMSwgMHgxZjYyOTdkMCwgMHhmODliMmMwNywgMHgxZjIyNTJmNywgMHhmNzc3MTZjZiwgMHgxZWQ3NDBlNywgMHhmNjU1Zjc5ZiwgMHgxZTgxN2JhYiwKLQkweDA5NGEwMzE3LCAweDFlOWY0MTU3LCAweDA4ODhlOTMxLCAweDFlZDc0MGU3LCAweDA3YzY3ZTVmLCAweDFmMGE3ZWZjLCAweDA3MDJlMDliLCAweDFmMzhmM2FjLAotCTB4MTliM2UwNDgsIDB4MTMwZmY3ZmQsIDB4MTk3NzdlZjUsIDB4MTM2MDU4YjEsIDB4MTkzYTIyNGEsIDB4MTNhZmZhMjksIDB4MThmYmNjYTQsIDB4MTNmZWQ5NTMsCi0JMHhmNTM4MzJjNSwgMHgxZTIxMjEwNSwgMHhmNDFlMmI2NywgMHgxZGI2NTI2MiwgMHhmMzA4NDM1ZSwgMHgxZDQxMzRkMSwgMHhmMWY2ZGIxNCwgMHgxY2MxZjBmNCwKLQkweDA2M2UyZTBmLCAweDFmNjI5N2QwLCAweDA1Nzg4NTExLCAweDFmODc2NGZhLCAweDA0YjIwNDFjLCAweDFmYTc1NTdmLCAweDAzZWFjOWNiLCAweDFmYzI2NDcxLAotCTB4MThiYzgwNmIsIDB4MTQ0Y2YzMjUsIDB4MTg3YzQwMTAsIDB4MTQ5YTQ0OWMsIDB4MTgzYjBlMGMsIDB4MTRlNmNhYmMsIDB4MTdmOGVjZTMsIDB4MTUzMjgyOTMsCi0JMHhmMGVhNTE2NCwgMHgxYzM4YjJmMiwgMHhlZmUzMDM3OSwgMHgxYmE1YWE2NywgMHhlZWUxNGNhYywgMHgxYjA5MGE1OCwgMHhlZGU1ODY2NywgMHgxYTYzMDkxYiwKLQkweDAzMjJmNGQ4LCAweDFmZDg4ZGE0LCAweDAyNWFhNDEyLCAweDFmZTljZGFkLCAweDAxOTFmNjVmLCAweDFmZjYyMWUzLCAweDAwYzkwYWIwLCAweDFmZmQ4ODYxLAotCTB4MTdiNWRmMjIsIDB4MTU3ZDY5MzUsIDB4MTc3MWU3NWYsIDB4MTVjNzdiYmUsIDB4MTcyZDA4MzgsIDB4MTYxMGI3NTUsIDB4MTZlNzQ0NTUsIDB4MTY1OTE5MjYsCi0JMHhlY2YwMDgwMywgMHgxOWIzZTA0OCwgMHhlYzAxMjZhZCwgMHgxOGZiY2NhNCwgMHhlYjE5MzU0NCwgMHgxODNiMGUwYywgMHhlYTM4ODQ0MiwgMHgxNzcxZTc1ZiwKLQkweDAwMDAwMDAwLCAweDIwMDAwMDAwLCAweGZmMzZmNTUwLCAweDFmZmQ4ODYxLCAweGZlNmUwOWExLCAweDFmZjYyMWUzLCAweGZkYTU1YmVlLCAweDFmZTljZGFkLAotCTB4MTZhMDllNjYsIDB4MTZhMDllNjYsIDB4MTY1OTE5MjYsIDB4MTZlNzQ0NTUsIDB4MTYxMGI3NTUsIDB4MTcyZDA4MzgsIDB4MTVjNzdiYmUsIDB4MTc3MWU3NWYsCi0JMHhlOTVmNjE5YSwgMHgxNmEwOWU2NiwgMHhlODhlMThhMSwgMHgxNWM3N2JiZSwgMHhlN2M0ZjFmNCwgMHgxNGU2Y2FiYywgMHhlNzA0MzM1YywgMHgxM2ZlZDk1MywKLQkweGZjZGQwYjI4LCAweDFmZDg4ZGE0LCAweGZjMTUzNjM1LCAweDFmYzI2NDcxLCAweGZiNGRmYmU0LCAweDFmYTc1NTdmLCAweGZhODc3YWVmLCAweDFmODc2NGZhLAotCTB4MTU3ZDY5MzUsIDB4MTdiNWRmMjIsIDB4MTUzMjgyOTMsIDB4MTdmOGVjZTMsIDB4MTRlNmNhYmMsIDB4MTgzYjBlMGMsIDB4MTQ5YTQ0OWMsIDB4MTg3YzQwMTAsCi0JMHhlNjRjMWZiOCwgMHgxMzBmZjdmZCwgMHhlNTljZjZlNSwgMHgxMjFhNzk5OSwgMHhlNGY2ZjVhOCwgMHgxMTFlYjM1NCwgMHhlNDVhNTU5OSwgMHgxMDFjZmM4NywKLQkweGY5YzFkMWYxLCAweDFmNjI5N2QwLCAweGY4ZmQxZjY1LCAweDFmMzhmM2FjLCAweGY4Mzk4MWExLCAweDFmMGE3ZWZjLCAweGY3NzcxNmNmLCAweDFlZDc0MGU3LAotCTB4MTQ0Y2YzMjUsIDB4MThiYzgwNmIsIDB4MTNmZWQ5NTMsIDB4MThmYmNjYTQsIDB4MTNhZmZhMjksIDB4MTkzYTIyNGEsIDB4MTM2MDU4YjEsIDB4MTk3NzdlZjUsCi0JMHhlM2M3NGQwZSwgMHgwZjE1YWU5YywgMHhlMzNlMGYwYywgMHgwZTA5MjRlYywgMHhlMmJlY2IyZiwgMHgwY2Y3YmNhMiwgMHhlMjQ5YWQ5ZSwgMHgwYmUxZDQ5OSwKLQkweGY2YjVmY2U5LCAweDFlOWY0MTU3LCAweGY1ZjY1MWI2LCAweDFlNjI4OGVjLCAweGY1MzgzMmM1LCAweDFlMjEyMTA1LCAweGY0N2JiZDY4LCAweDFkZGIxM2I3LAotCTB4MTMwZmY3ZmQsIDB4MTliM2UwNDgsIDB4MTJiZWRiMjYsIDB4MTllZjQzZWYsIDB4MTI2ZDA1NGQsIDB4MWEyOWE3YTAsIDB4MTIxYTc5OTksIDB4MWE2MzA5MWIsCi0JMHhlMWRlZGVmYiwgMHgwYWM3Y2QzYiwgMHhlMTdlODQ1NSwgMHgwOWFhMDg2MSwgMHhlMTI4YmYxOSwgMHgwODg4ZTkzMSwgMHhlMGRkYWQwOSwgMHgwNzY0ZDNmOSwKLQkweGYzYzEwZWFkLCAweDFkOTA2YmNmLCAweGYzMDg0MzVlLCAweDFkNDEzNGQxLCAweGYyNTE3N2ZiLCAweDFjZWQ3YWY0LCAweGYxOWNjOGIzLCAweDFjOTU0YjIxLAotCTB4MTFjNzNiM2EsIDB4MWE5YjY2MjksIDB4MTE3MzRkNjQsIDB4MWFkMmJjOWUsIDB4MTExZWIzNTQsIDB4MWIwOTBhNTgsIDB4MTBjOTcwNGQsIDB4MWIzZTRkM2YsCi0JMHhlMDlkNjgzMCwgMHgwNjNlMmUwZiwgMHhlMDY4MDZkYiwgMHgwNTE1NWRhYywgMHhlMDNkOWI4ZiwgMHgwM2VhYzljYiwgMHhlMDFlMzUwMywgMHgwMmJlZGEwMSwKLQkweGYwZWE1MTY0LCAweDFjMzhiMmYyLCAweGYwM2EyZDkyLCAweDFiZDdjMGFjLCAweGVmOGM3ODY3LCAweDFiNzI4MzQ1LCAweGVlZTE0Y2FjLCAweDFiMDkwYTU4LAotCTB4MTA3Mzg3OTksIDB4MWI3MjgzNDUsIDB4MTAxY2ZjODcsIDB4MWJhNWFhNjcsIDB4MGZjNWQyNmUsIDB4MWJkN2MwYWMsIDB4MGY2ZTBjYTksIDB4MWMwOGM0MjYsCi0JMHhlMDA5ZGUxZCwgMHgwMTkxZjY1ZiwgMHhlMDAwOWRlOSwgMHgwMDY0ODc0OCwgMHhlMDAyNzc5ZiwgMHhmZjM2ZjU1MCwgMHhlMDBmNmE5YSwgMHhmZTA5YTkxOCwKLQkweGVlMzhjNGM2LCAweDFhOWI2NjI5LCAweGVkOTJmYWIzLCAweDFhMjlhN2EwLCAweGVjZjAwODAzLCAweDE5YjNlMDQ4LCAweGVjNTAwNWQ3LCAweDE5M2EyMjRhLAotCTB4MGYxNWFlOWMsIDB4MWMzOGIyZjIsIDB4MGViY2JiYWUsIDB4MWM2NzhiMzUsIDB4MGU2MzM3NGQsIDB4MWM5NTRiMjEsIDB4MGUwOTI0ZWMsIDB4MWNjMWYwZjQsCi0JMHhlMDI3NzI1YywgMHhmY2RkMGIyOCwgMHhlMDRhODY4ZSwgMHhmYmIxODNjYywgMHhlMDc4OWIwNiwgMHhmYTg3N2FlZiwgMHhlMGIxOWZjNSwgMHhmOTVmNTdmNywKLQkweGViYjMwY2RiLCAweDE4YmM4MDZiLCAweGViMTkzNTQ0LCAweDE4M2IwZTBjLCAweGVhODI5NmNiLCAweDE3YjVkZjIyLCAweGU5ZWY0OGFiLCAweDE3MmQwODM4LAotCTB4MGRhZTg4MDUsIDB4MWNlZDdhZjQsIDB4MGQ1MzY0MTYsIDB4MWQxN2U3NzQsIDB4MGNmN2JjYTIsIDB4MWQ0MTM0ZDEsIDB4MGM5Yjk1MzIsIDB4MWQ2OTYxNzQsCi0JMHhlMGY1ODEwNCwgMHhmODM5ODFhMSwgMHhlMTQ0MjczNywgMHhmNzE2NWRlMCwgMHhlMTlkNzcxNCwgMHhmNWY2NTFiNiwgMHhlMjAxNTE5ZSwgMHhmNGQ5YzExMSwKLQkweGU5NWY2MTlhLCAweDE2YTA5ZTY2LCAweGU4ZDJmN2M4LCAweDE2MTBiNzU1LCAweGU4NGEyMGRlLCAweDE1N2Q2OTM1LCAweGU3YzRmMWY0LCAweDE0ZTZjYWJjLAotCTB4MGMzZWYxNTMsIDB4MWQ5MDZiY2YsIDB4MGJlMWQ0OTksIDB4MWRiNjUyNjIsIDB4MGI4NDQyOTgsIDB4MWRkYjEzYjcsIDB4MGIyNjNlZWYsIDB4MWRmZWFlNjIsCi0JMHhlMjZmOTQzMSwgMHhmM2MxMGVhZCwgMHhlMmU4MTg4YywgMHhmMmFjOWJlYSwgMHhlMzZhYjRkZiwgMHhmMTljYzhiMywgMHhlM2Y3M2JkYSwgMHhmMDkxZjM1NywKLQkweGU3NDM3Zjk1LCAweDE0NGNmMzI1LCAweGU2YzVkZGI2LCAweDEzYWZmYTI5LCAweGU2NGMxZmI4LCAweDEzMGZmN2ZkLCAweGU1ZDY1ODYwLCAweDEyNmQwNTRkLAotCTB4MGFjN2NkM2IsIDB4MWUyMTIxMDUsIDB4MGE2OGYxMjEsIDB4MWU0MjZhNGIsIDB4MGEwOWFlNGEsIDB4MWU2Mjg4ZWMsIDB4MDlhYTA4NjEsIDB4MWU4MTdiYWIsCi0JMHhlNDhkN2NiYiwgMHhlZjhjNzg2NywgMHhlNTJkNDM2MiwgMHhlZThjYjI5YywgMHhlNWQ2NTg2MCwgMHhlZDkyZmFiMywgMHhlNjg4ODEwYiwgMHhlYzlmYTc0ZiwKLQkweGU1NjQ5OWQ3LCAweDExYzczYjNhLCAweGU0ZjZmNWE4LCAweDExMWViMzU0LCAweGU0OGQ3Y2JiLCAweDEwNzM4Nzk5LCAweGU0MjgzZjU0LCAweDBmYzVkMjZlLAotCTB4MDk0YTAzMTcsIDB4MWU5ZjQxNTcsIDB4MDhlOWEyMjAsIDB4MWViYmQ4YzksIDB4MDg4OGU5MzEsIDB4MWVkNzQwZTcsIDB4MDgyN2RjMDcsIDB4MWVmMTc4YTQsCi0JMHhlNzQzN2Y5NSwgMHhlYmIzMGNkYiwgMHhlODA3MTMxZCwgMHhlYWNkN2Q2ZCwgMHhlOGQyZjdjOCwgMHhlOWVmNDhhYiwgMHhlOWE2ZTZkYSwgMHhlOTE4YmJhYiwKLQkweGUzYzc0ZDBlLCAweDBmMTVhZTljLCAweGUzNmFiNGRmLCAweDBlNjMzNzRkLCAweGUzMTI4NTBjLCAweDBkYWU4ODA1LCAweGUyYmVjYjJmLCAweDBjZjdiY2EyLAotCTB4MDdjNjdlNWYsIDB4MWYwYTdlZmMsIDB4MDc2NGQzZjksIDB4MWYyMjUyZjcsIDB4MDcwMmUwOWIsIDB4MWYzOGYzYWMsIDB4MDZhMGE4MDksIDB4MWY0ZTYwM2IsCi0JMHhlYTgyOTZjYiwgMHhlODRhMjBkZSwgMHhlYjY1YmI2NCwgMHhlNzgzYmZmMCwgMHhlYzUwMDVkNywgMHhlNmM1ZGRiNiwgMHhlZDQxMjRkYSwgMHhlNjEwYmMxMSwKLQkweGUyNmY5NDMxLCAweDBjM2VmMTUzLCAweGUyMjRlYzQ5LCAweDBiODQ0Mjk4LCAweGUxZGVkZWZiLCAweDBhYzdjZDNiLCAweGUxOWQ3NzE0LCAweDBhMDlhZTRhLAotCTB4MDYzZTJlMGYsIDB4MWY2Mjk3ZDAsIDB4MDVkYjc2NzgsIDB4MWY3NTk5YTQsIDB4MDU3ODg1MTEsIDB4MWY4NzY0ZmEsIDB4MDUxNTVkYWMsIDB4MWY5N2Y5MjUsCi0JMHhlZTM4YzRjNiwgMHhlNTY0OTlkNywgMHhlZjM2OGZiMywgMHhlNGMxYjJjMSwgMHhmMDNhMmQ5MiwgMHhlNDI4M2Y1NCwgMHhmMTQzNDQ1MiwgMHhlMzk4NzRjYiwKLQkweGUxNjBiZWE5LCAweDA5NGEwMzE3LCAweGUxMjhiZjE5LCAweDA4ODhlOTMxLCAweGUwZjU4MTA0LCAweDA3YzY3ZTVmLCAweGUwYzcwYzU0LCAweDA3MDJlMDliLAotCTB4MDRiMjA0MWMsIDB4MWZhNzU1N2YsIDB4MDQ0ZTdjMzQsIDB4MWZiNTc5NzIsIDB4MDNlYWM5Y2IsIDB4MWZjMjY0NzEsIDB4MDM4NmYwYjksIDB4MWZjZTE1ZmQsCi0JMHhmMjUxNzdmYiwgMHhlMzEyODUwYywgMHhmMzY0NmFjZSwgMHhlMjk2OWU4YywgMHhmNDdiYmQ2OCwgMHhlMjI0ZWM0OSwgMHhmNTk3MGVkZiwgMHhlMWJkOTViNSwKLQkweGUwOWQ2ODMwLCAweDA2M2UyZTBmLCAweGUwNzg5YjA2LCAweDA1Nzg4NTExLCAweGUwNThhYTgxLCAweDA0YjIwNDFjLCAweGUwM2Q5YjhmLCAweDAzZWFjOWNiLAotCTB4MDMyMmY0ZDgsIDB4MWZkODhkYTQsIDB4MDJiZWRhMDEsIDB4MWZlMWNhZmQsIDB4MDI1YWE0MTIsIDB4MWZlOWNkYWQsIDB4MDFmNjU2ZTgsIDB4MWZmMDk1NjYsCi0JMHhmNmI1ZmNlOSwgMHhlMTYwYmVhOSwgMHhmN2Q4MjNmOSwgMHhlMTBlODc1YywgMHhmOGZkMWY2NSwgMHhlMGM3MGM1NCwgMHhmYTI0ODk4OCwgMHhlMDhhNjY1YywKLQkweGUwMjc3MjVjLCAweDAzMjJmNGQ4LCAweGUwMTYzMjUzLCAweDAyNWFhNDEyLCAweGUwMDlkZTFkLCAweDAxOTFmNjVmLCAweGUwMDI3NzlmLCAweDAwYzkwYWIwLAotCTB4MDE5MWY2NWYsIDB4MWZmNjIxZTMsIDB4MDEyZDg2NTcsIDB4MWZmYTcyZjAsIDB4MDBjOTBhYjAsIDB4MWZmZDg4NjEsIDB4MDA2NDg3NDgsIDB4MWZmZjYyMTcsCi0JMHhmYjRkZmJlNCwgMHhlMDU4YWE4MSwgMHhmYzc5MGY0NywgMHhlMDMxZWEwMywgMHhmZGE1NWJlZSwgMHhlMDE2MzI1MywgMHhmZWQyNzlhOSwgMHhlMDA1OGQxMAotfTsKLQotY29uc3QgaW50IHR3aWRUYWI2NFs0KjYgKyAxNio2XSA9IHsKLQkweDIwMDAwMDAwLCAweDAwMDAwMDAwLCAweDE2YTA5ZTY2LCAweDE2YTA5ZTY2LCAweDAwMDAwMDAwLCAweDIwMDAwMDAwLCAweGU5NWY2MTlhLCAweDE2YTA5ZTY2LAotCTB4MjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MWQ5MDZiY2YsIDB4MGMzZWYxNTMsIDB4MTZhMDllNjYsIDB4MTZhMDllNjYsIDB4MGMzZWYxNTMsIDB4MWQ5MDZiY2YsCi0JMHgyMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwYzNlZjE1MywgMHgxZDkwNmJjZiwgMHhlOTVmNjE5YSwgMHgxNmEwOWU2NiwgMHhlMjZmOTQzMSwgMHhmM2MxMGVhZCwKLQotCTB4MjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MWY2Mjk3ZDAsIDB4MDYzZTJlMGYsIDB4MWQ5MDZiY2YsIDB4MGMzZWYxNTMsIDB4MWE5YjY2MjksIDB4MTFjNzNiM2EsCi0JMHgyMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgxZmQ4OGRhNCwgMHgwMzIyZjRkOCwgMHgxZjYyOTdkMCwgMHgwNjNlMmUwZiwgMHgxZTlmNDE1NywgMHgwOTRhMDMxNywKLQkweDIwMDAwMDAwLCAweDAwMDAwMDAwLCAweDFlOWY0MTU3LCAweDA5NGEwMzE3LCAweDFhOWI2NjI5LCAweDExYzczYjNhLCAweDE0NGNmMzI1LCAweDE4YmM4MDZiLAotCTB4MTZhMDllNjYsIDB4MTZhMDllNjYsIDB4MTFjNzNiM2EsIDB4MWE5YjY2MjksIDB4MGMzZWYxNTMsIDB4MWQ5MDZiY2YsIDB4MDYzZTJlMGYsIDB4MWY2Mjk3ZDAsCi0JMHgxZDkwNmJjZiwgMHgwYzNlZjE1MywgMHgxYzM4YjJmMiwgMHgwZjE1YWU5YywgMHgxYTliNjYyOSwgMHgxMWM3M2IzYSwgMHgxOGJjODA2YiwgMHgxNDRjZjMyNSwKLQkweDBjM2VmMTUzLCAweDFkOTA2YmNmLCAweDAzMjJmNGQ4LCAweDFmZDg4ZGE0LCAweGY5YzFkMWYxLCAweDFmNjI5N2QwLCAweGYwZWE1MTY0LCAweDFjMzhiMmYyLAotCTB4MDAwMDAwMDAsIDB4MjAwMDAwMDAsIDB4ZjljMWQxZjEsIDB4MWY2Mjk3ZDAsIDB4ZjNjMTBlYWQsIDB4MWQ5MDZiY2YsIDB4ZWUzOGM0YzYsIDB4MWE5YjY2MjksCi0JMHgxNmEwOWU2NiwgMHgxNmEwOWU2NiwgMHgxNDRjZjMyNSwgMHgxOGJjODA2YiwgMHgxMWM3M2IzYSwgMHgxYTliNjYyOSwgMHgwZjE1YWU5YywgMHgxYzM4YjJmMiwKLQkweGU5NWY2MTlhLCAweDE2YTA5ZTY2LCAweGUzYzc0ZDBlLCAweDBmMTVhZTljLCAweGUwOWQ2ODMwLCAweDA2M2UyZTBmLCAweGUwMjc3MjVjLCAweGZjZGQwYjI4LAotCTB4ZTk1ZjYxOWEsIDB4MTZhMDllNjYsIDB4ZTU2NDk5ZDcsIDB4MTFjNzNiM2EsIDB4ZTI2Zjk0MzEsIDB4MGMzZWYxNTMsIDB4ZTA5ZDY4MzAsIDB4MDYzZTJlMGYsCi0JMHgwYzNlZjE1MywgMHgxZDkwNmJjZiwgMHgwOTRhMDMxNywgMHgxZTlmNDE1NywgMHgwNjNlMmUwZiwgMHgxZjYyOTdkMCwgMHgwMzIyZjRkOCwgMHgxZmQ4OGRhNCwKLQkweGUyNmY5NDMxLCAweGYzYzEwZWFkLCAweGU3NDM3Zjk1LCAweGViYjMwY2RiLCAweGVlMzhjNGM2LCAweGU1NjQ5OWQ3LCAweGY2YjVmY2U5LCAweGUxNjBiZWE5Ci19OwotCi0jZWxzZQotCi0vKgotICogIFEzMCBmb3IgMTI4IGFuZCAxMDI0Ci0gKgotICogZm9yIChpID0gMDsgaSA8IG51bS80OyBpKyspIHsKLSAqICAgYW5nbGUgPSAoaSArIDAuMTI1KSAqIE1fUEkgLyBudW07Ci0gKiAgIHggPSBjb3MoYW5nbGUpICogKDEgPDwgMzApOwotICogICB4ID0gc2luKGFuZ2xlKSAqICgxIDw8IDMwKTsKLSAqCi0gKiAgIGFuZ2xlID0gKG51bS8yIC0gMSAtIGkgKyAwLjEyNSkgKiBNX1BJIC8gbnVtOwotICogICB4ID0gY29zKGFuZ2xlKSAqICgxIDw8IDMwKTsKLSAqICAgeCA9IHNpbihhbmdsZSkgKiAoMSA8PCAzMCk7Ci0gKiB9Ci0gKi8KLWNvbnN0IGludCBjb3NzaW50YWJbMTI4ICsgMTAyNF0gPSB7Ci0JLyogMTI4ICovCi0JMHgzZmZmZWM0MywgMHgwMDMyNDNmMSwgMHgwMTVmZDRkMiwgMHgzZmZjMzhkMSwgMHgzZmY5YzEzYSwgMHgwMWM0NTRmNSwgMHgwMmYxYjc1NSwgMHgzZmVlYTc3NiwKLQkweDNmZTliOGE5LCAweDAzNTYyMDM4LCAweDA0ODMyNTlkLCAweDNmZDczYTRhLCAweDNmY2ZkNTBiLCAweDA0ZTc2N2M1LCAweDA2MTNlMWM1LCAweDNmYjVmNGVhLAotCTB4M2ZhYzFhNWIsIDB4MDY3N2VkYmIsIDB4MDdhM2FkZmYsIDB4M2Y4YWRjNzcsIDB4M2Y3ZThlMWUsIDB4MDgwNzc0NTcsIDB4MDkzMjRjYTcsIDB4M2Y1NWY3OTYsCi0JMHgzZjQ3Mzc1OSwgMHgwOTk1YmRmZCwgMHgwYWJmODA0MywgMHgzZjE3NGU3MCwgMHgzZjA2MWU5NSwgMHgwYjIyOGQ0MiwgMHgwYzRiMGI5NCwgMHgzZWNlZWFhZCwKLQkweDNlYmI0ZGRiLCAweDBjYWRhNGY1LCAweDBkZDRiMTlhLCAweDNlN2NkNzc4LCAweDNlNjZkMGI0LCAweDBlMzZjODJhLCAweDBmNWMzNWEzLCAweDNlMjEyMTc5LAotCTB4M2UwOGI0MmEsIDB4MGZiZGJhNDAsIDB4MTBlMTViNGUsIDB4M2RiYmQ2ZDQsIDB4M2RhMTA2YmQsIDB4MTE0MjNlZjAsIDB4MTI2M2U2OTksIDB4M2Q0ZDA3MjgsCi0JMHgzZDJmZDg2YywgMHgxMmM0MWE0ZiwgMHgxM2UzOWJlOSwgMHgzY2Q0YzM4YiwgMHgzY2I1M2FhYSwgMHgxNDQzMTBkZCwgMHgxNTYwNDAxMywgMHgzYzUzMWU4OCwKLQkweDNjMzE0MDYwLCAweDE1YmVlNzhjLCAweDE2ZDk5ODY0LCAweDNiYzgyYzFmLCAweDNiYTNmZGU3LCAweDE3Mzc2M2M5LCAweDE4NGY2YWFiLCAweDNiMzQwMWJiLAotCTB4M2IwZDg5MDksIDB4MThhYzRiODcsIDB4MTljMTdkNDQsIDB4M2E5NmI2MzYsIDB4M2E2ZGY4ZjgsIDB4MWExZDY1NDQsIDB4MWIyZjk3MWUsIDB4MzlmMDYxZDIsCi0JMHgzOWM1NjY0ZiwgMHgxYjhhNzgxNSwgMHgxYzk5N2ZjNCwgMHgzOTQxMWUzMywgMHgzOTEzZWIwZSwgMHgxY2YzNGJhZiwgMHgxZGZlZmY2NywgMHgzODg5MDY2MywKLQkweDM4NTlhMjkyLCAweDFlNTdhODZkLCAweDFmNWZkZWU2LCAweDM3YzgzNmMyLCAweDM3OTZhOTk2LCAweDFmYjc1NzVjLCAweDIwYmJlN2Q4LCAweDM2ZmVjZDBlLAotCTB4MzZjYjFlMmEsIDB4MjExMjIyNDAsIDB4MjIxMmU0OTIsIDB4MzYyY2U4NTUsIDB4MzVmNzFmYjEsIDB4MjI2N2QzYTAsIDB4MjM2NGEwMmUsIDB4MzU1MmE4ZjQsCi0JMHgzNTFhY2VkZCwgMHgyM2I4MzZjYSwgMHgyNGIwZTY5OSwgMHgzNDcwMzA5NSwgMHgzNDM2NGRhNiwgMHgyNTAzMTdkZiwgMHgyNWY3ODQ5NywgMHgzMzg1YTIyMiwKLQkweDMzNDliZjQ4LCAweDI2NDg0M2Q5LCAweDI3Mzg0N2M4LCAweDMyOTMyMWM3LCAweDMyNTU0ODQwLCAweDI3ODc4ODkzLCAweDI4NzJmZWI2LCAweDMxOThkNGVhLAotCTB4MzE1OTBlM2UsIDB4MjhjMGI0ZDIsIDB4MjlhNzc4ZGIsIDB4MzA5NmUyMjMsIDB4MzA1NTM4MjgsIDB4MjlmMzk4NGMsIDB4MmFkNTg2YTMsIDB4MmY4ZDcxM2EsCi0JMHgyZjQ5ZWUwZiwgMHgyYjIwMDNhYywgMHgyYmZjZjk3YywgMHgyZTdjYWIxYywgMHgyZTM3NTkyYywgMHgyYzQ1YzhhMCwgMHgyZDFkYTNkNSwgMHgyZDY0YjlkYSwKLQkvKiAxMDI0ICovCi0JMHgzZmZmZmZiMSwgMHgwMDA2NDg3ZiwgMHgwMDJiZmI3NCwgMHgzZmZmZjBlMywgMHgzZmZmZTcwNSwgMHgwMDM4OGM2ZSwgMHgwMDVlM2Y0YywgMHgzZmZmYmE5YiwKLQkweDNmZmZhNmRlLCAweDAwNmFkMDNiLCAweDAwOTA4MmVhLCAweDNmZmY1Y2Q4LCAweDNmZmYzZjNjLCAweDAwOWQxM2M1LCAweDAwYzJjNjJmLCAweDNmZmVkNzliLAotCTB4M2ZmZWIwMjEsIDB4MDBjZjU2ZWYsIDB4MDBmNTA4ZmMsIDB4M2ZmZTJhZTUsIDB4M2ZmZGY5OGMsIDB4MDEwMTk5OTgsIDB4MDEyNzRiMzEsIDB4M2ZmZDU2YjUsCi0JMHgzZmZkMWI3ZSwgMHgwMTMzZGJhMywgMHgwMTU5OGNiMSwgMHgzZmZjNWIwYywgMHgzZmZjMTVmNywgMHgwMTY2MWNmMCwgMHgwMThiY2Q1YiwgMHgzZmZiMzdlYywKLQkweDNmZmFlOGY5LCAweDAxOTg1ZDYwLCAweDAxYmUwZDExLCAweDNmZjllZDUzLCAweDNmZjk5NDgzLCAweDAxY2E5Y2Q0LCAweDAxZjA0YmI0LCAweDNmZjg3YjQ0LAotCTB4M2ZmODE4OTYsIDB4MDFmY2RiMmUsIDB4MDIyMjg5MjQsIDB4M2ZmNmUxYmYsIDB4M2ZmNjc1MzQsIDB4MDIyZjE4NGQsIDB4MDI1NGM1NDQsIDB4M2ZmNTIwYzUsCi0JMHgzZmY0YWE1ZCwgMHgwMjYxNTQxNCwgMHgwMjg2ZmZmMywgMHgzZmYzMzg1OCwgMHgzZmYyYjgxMywgMHgwMjkzOGU2MiwgMHgwMmI5MzkxNCwgMHgzZmYxMjg3OCwKLQkweDNmZjA5ZTU2LCAweDAyYzVjNzFhLCAweDAyZWI3MDg2LCAweDNmZWVmMTI2LCAweDNmZWU1ZDI4LCAweDAyZjdmZTFjLCAweDAzMWRhNjJiLCAweDNmZWM5MjY1LAotCTB4M2ZlYmY0OGIsIDB4MDMyYTMzNDksIDB4MDM0ZmQ5ZTUsIDB4M2ZlYTBjMzUsIDB4M2ZlOTY0ODAsIDB4MDM1YzY2ODIsIDB4MDM4MjBiOTMsIDB4M2ZlNzVlOTgsCi0JMHgzZmU2YWQwOCwgMHgwMzhlOTdhOSwgMHgwM2I0M2IxNywgMHgzZmU0ODk5MCwgMHgzZmUzY2UyNiwgMHgwM2MwYzY5ZSwgMHgwM2U2Njg1MiwgMHgzZmUxOGQxZiwKLQkweDNmZTBjN2RhLCAweDAzZjJmMzQyLCAweDA0MTg5MzI2LCAweDNmZGU2OTQ1LCAweDNmZGQ5YTI3LCAweDA0MjUxZDc3LCAweDA0NGFiYjczLCAweDNmZGIxZTA2LAotCTB4M2ZkYTQ1MGYsIDB4MDQ1NzQ1MWQsIDB4MDQ3Y2UxMWEsIDB4M2ZkN2FiNjQsIDB4M2ZkNmM4OTQsIDB4MDQ4OTZhMTYsIDB4MDRhZjAzZmMsIDB4M2ZkNDExNWYsCi0JMHgzZmQzMjRiNywgMHgwNGJiOGM0MiwgMHgwNGUxMjNmYSwgMHgzZmQwNGZmYywgMHgzZmNmNTk3YywgMHgwNGVkYWI4MywgMHgwNTEzNDBmNiwgMHgzZmNjNjczYiwKLQkweDNmY2I2NmU0LCAweDA1MWZjN2I5LCAweDA1NDU1YWQxLCAweDNmYzg1NzFmLCAweDNmYzc0Y2YzLCAweDA1NTFlMGM3LCAweDA1Nzc3MTZiLCAweDNmYzQxZmFjLAotCTB4M2ZjMzBiYWEsIDB4MDU4M2Y2OGMsIDB4MDVhOTg0YTYsIDB4M2ZiZmMwZTMsIDB4M2ZiZWEzMGMsIDB4MDViNjA4ZWIsIDB4MDVkYjk0NjMsIDB4M2ZiYjNhYzcsCi0JMHgzZmJhMTMxYiwgMHgwNWU4MTdjMywgMHgwNjBkYTA4MywgMHgzZmI2OGQ1YiwgMHgzZmI1NWJkYywgMHgwNjFhMjJmNywgMHgwNjNmYThlNywgMHgzZmIxYjhhMiwKLQkweDNmYjA3ZDUwLCAweDA2NGMyYTY3LCAweDA2NzFhZDcxLCAweDNmYWNiYzlmLCAweDNmYWI3NzdiLCAweDA2N2UyZGY1LCAweDA2YTNhZTAwLCAweDNmYTc5OTU0LAotCTB4M2ZhNjRhNWYsIDB4MDZiMDJkODEsIDB4MDZkNWFhNzcsIDB4M2ZhMjRlYzYsIDB4M2ZhMGY2MDAsIDB4MDZlMjI4ZWUsIDB4MDcwN2EyYjcsIDB4M2Y5Y2RjZjcsCi0JMHgzZjliN2E2MiwgMHgwNzE0MjAxYiwgMHgwNzM5OTZhMSwgMHgzZjk3NDNlYiwgMHgzZjk1ZDc4NywgMHgwNzQ2MTJlYiwgMHgwNzZiODYxNiwgMHgzZjkxODNhNSwKLQkweDNmOTAwZDcyLCAweDA3NzgwMTNkLCAweDA3OWQ3MGY3LCAweDNmOGI5YzI4LCAweDNmOGExYzI5LCAweDA3YTllYWY1LCAweDA3Y2Y1NzI2LCAweDNmODU4ZDc5LAotCTB4M2Y4NDAzYWUsIDB4MDdkYmNmZjIsIDB4MDgwMTM4ODMsIDB4M2Y3ZjU3OWIsIDB4M2Y3ZGM0MDUsIDB4MDgwZGIwMTYsIDB4MDgzMzE0ZjEsIDB4M2Y3OGZhOTIsCi0JMHgzZjc3NWQzMSwgMHgwODNmOGI0MywgMHgwODY0ZWM0ZiwgMHgzZjcyNzY2MSwgMHgzZjcwY2YzOCwgMHgwODcxNjE1OSwgMHgwODk2YmU4MCwgMHgzZjZiY2IwZSwKLQkweDNmNmExYTFjLCAweDA4YTMzMjNhLCAweDA4Yzg4YjY1LCAweDNmNjRmODliLCAweDNmNjMzZGUyLCAweDA4ZDRmZGM2LCAweDA4ZmE1MmRlLCAweDNmNWRmZjBlLAotCTB4M2Y1YzNhOGYsIDB4MDkwNmMzZTAsIDB4MDkyYzE0Y2UsIDB4M2Y1NmRlNmEsIDB4M2Y1NTEwMjYsIDB4MDkzODg0NjksIDB4MDk1ZGQxMTYsIDB4M2Y0Zjk2YjQsCi0JMHgzZjRkYmVhYywgMHgwOTZhM2Y0MiwgMHgwOThmODc5NiwgMHgzZjQ4MjdmMCwgMHgzZjQ2NDYyNiwgMHgwOTliZjQ0YywgMHgwOWMxMzgzMSwgMHgzZjQwOTIyMywKLQkweDNmM2VhNjk3LCAweDA5Y2RhMzY4LCAweDA5ZjJlMmM3LCAweDNmMzhkNTUyLCAweDNmMzZlMDA2LCAweDA5ZmY0Yzc4LCAweDBhMjQ4NzNhLCAweDNmMzBmMTgxLAotCTB4M2YyZWYyNzYsIDB4MGEzMGVmNWUsIDB4MGE1NjI1NmMsIDB4M2YyOGU2YjYsIDB4M2YyNmRkZWMsIDB4MGE2MjhiZmEsIDB4MGE4N2JkM2QsIDB4M2YyMGI0ZjUsCi0JMHgzZjFlYTI2ZSwgMHgwYTk0MjIyZiwgMHgwYWI5NGU4ZiwgMHgzZjE4NWM0MywgMHgzZjE2NDAwMSwgMHgwYWM1YjFkYywgMHgwYWVhZDk0NCwgMHgzZjBmZGNhNSwKLQkweDNmMGRiNmE5LCAweDBhZjczYWU1LCAweDBiMWM1ZDNkLCAweDNmMDczNjIxLCAweDNmMDUwNjZkLCAweDBiMjhiZDJhLCAweDBiNGRkYTVjLCAweDNlZmU2OGJjLAotCTB4M2VmYzJmNTAsIDB4MGI1YTM4OGQsIDB4MGI3ZjUwODEsIDB4M2VmNTc0N2IsIDB4M2VmMzMxNWEsIDB4MGI4YmFjZjAsIDB4MGJiMGJmOGYsIDB4M2VlYzU5NjUsCi0JMHgzZWVhMGM4ZSwgMHgwYmJkMWEzMywgMHgwYmUyMjc2NiwgMHgzZWUzMTc3ZSwgMHgzZWUwYzBmNCwgMHgwYmVlODAzOCwgMHgwYzEzODdlOSwgMHgzZWQ5YWVjYywKLQkweDNlZDc0ZTkxLCAweDBjMWZkZWUxLCAweDBjNDRlMGY5LCAweDNlZDAxZjU1LCAweDNlY2RiNTZhLCAweDBjNTEzNjEwLCAweDBjNzYzMjc4LCAweDNlYzY2OTIwLAotCTB4M2VjM2Y1ODUsIDB4MGM4Mjg1YTUsIDB4MGNhNzdjNDcsIDB4M2ViYzhjMzEsIDB4M2ViYTBlZTksIDB4MGNiM2NkODQsIDB4MGNkOGJlNDcsIDB4M2ViMjg4OGYsCi0JMHgzZWIwMDE5YywgMHgwY2U1MGQ4YywgMHgwZDA5Zjg1YiwgMHgzZWE4NWU0MSwgMHgzZWE1Y2RhMywgMHgwZDE2NDVhMCwgMHgwZDNiMmE2NCwgMHgzZTllMGQ0YywKLQkweDNlOWI3MzA2LCAweDBkNDc3NWExLCAweDBkNmM1NDQzLCAweDNlOTM5NWI3LCAweDNlOTBmMWNhLCAweDBkNzg5ZDcxLCAweDBkOWQ3NWRiLCAweDNlODhmNzg4LAotCTB4M2U4NjQ5ZjUsIDB4MGRhOWJjZjIsIDB4MGRjZThmMGQsIDB4M2U3ZTMyYzYsIDB4M2U3YjdiOTAsIDB4MGRkYWQ0MDYsIDB4MGRmZjlmYmEsIDB4M2U3MzQ3NzgsCi0JMHgzZTcwODY5ZiwgMHgwZTBiZTI4ZSwgMHgwZTMwYTdjNSwgMHgzZTY4MzVhNCwgMHgzZTY1NmIyYiwgMHgwZTNjZTg2YiwgMHgwZTYxYTcwZiwgMHgzZTVjZmQ1MSwKLQkweDNlNWEyOTM5LCAweDBlNmRlNTgwLCAweDBlOTI5ZDdhLCAweDNlNTE5ZTg2LCAweDNlNGVjMGQxLCAweDBlOWVkOWFmLCAweDBlYzM4YWU4LCAweDNlNDYxOTRhLAotCTB4M2U0MzMxZmEsIDB4MGVjZmM0ZDksIDB4MGVmNDZmM2IsIDB4M2UzYTZkYTQsIDB4M2UzNzdjYmIsIDB4MGYwMGE2ZGYsIDB4MGYyNTRhNTMsIDB4M2UyZTliOWMsCi0JMHgzZTJiYTExYiwgMHgwZjMxN2ZhNSwgMHgwZjU2MWMxNSwgMHgzZTIyYTMzOCwgMHgzZTFmOWYyMSwgMHgwZjYyNGYwYywgMHgwZjg2ZTQ2MCwgMHgzZTE2ODQ4MCwKLQkweDNlMTM3NmQ1LCAweDBmOTMxNGY1LCAweDBmYjdhMzE3LCAweDNlMGEzZjdiLCAweDNlMDcyODNmLCAweDBmYzNkMTQzLCAweDBmZTg1ODFkLCAweDNkZmRkNDMyLAotCTB4M2RmYWIzNjUsIDB4MGZmNDgzZDcsIDB4MTAxOTAzNTIsIDB4M2RmMTQyYWIsIDB4M2RlZTE4NTEsIDB4MTAyNTJjOTQsIDB4MTA0OWE0OWEsIDB4M2RlNDhhZWYsCi0JMHgzZGUxNTcwOCwgMHgxMDU1Y2I1YiwgMHgxMDdhM2JkNSwgMHgzZGQ3YWQwNSwgMHgzZGQ0NmY5NCwgMHgxMDg2NjAwZSwgMHgxMGFhYzhlNiwgMHgzZGNhYThmNSwKLQkweDNkYzc2MWZjLCAweDEwYjZlYTkwLCAweDEwZGI0YmFmLCAweDNkYmQ3ZWM3LCAweDNkYmEyZTQ4LCAweDEwZTc2YWMzLCAweDExMGJjNDEzLCAweDNkYjAyZTg0LAotCTB4M2RhY2Q0ODEsIDB4MTExN2UwODgsIDB4MTEzYzMxZjMsIDB4M2RhMmI4MzQsIDB4M2Q5ZjU0YWYsIDB4MTE0ODRiYzIsIDB4MTE2Yzk1MzEsIDB4M2Q5NTFiZGUsCi0JMHgzZDkxYWVkOSwgMHgxMTc4YWM1MywgMHgxMTljZWRhZiwgMHgzZDg3NTk4YywgMHgzZDgzZTMwOSwgMHgxMWE5MDIxZCwgMHgxMWNkM2I1MCwgMHgzZDc5NzE0NSwKLQkweDNkNzVmMTQ3LCAweDExZDk0ZDAyLCAweDExZmQ3ZGY2LCAweDNkNmI2MzEzLCAweDNkNjdkOTliLCAweDEyMDk4Y2U1LCAweDEyMmRiNTgzLCAweDNkNWQyZWZlLAotCTB4M2Q1OTljMGUsIDB4MTIzOWMxYTcsIDB4MTI1ZGUxZGEsIDB4M2Q0ZWQ1MGYsIDB4M2Q0YjM4YWEsIDB4MTI2OWViMmIsIDB4MTI4ZTAyZGMsIDB4M2Q0MDU1NGUsCi0JMHgzZDNjYWY3NiwgMHgxMjlhMDk1NCwgMHgxMmJlMTg2YywgMHgzZDMxYWZjNSwgMHgzZDJlMDA3YywgMHgxMmNhMWMwMywgMHgxMmVlMjI2YywgMHgzZDIyZTQ3YywKLQkweDNkMWYyYmM1LCAweDEyZmEyMzFiLCAweDEzMWUyMGMwLCAweDNkMTNmMzdlLCAweDNkMTAzMTVhLCAweDEzMmExZTdlLCAweDEzNGUxMzQ4LCAweDNkMDRkY2QyLAotCTB4M2QwMTExNDUsIDB4MTM1YTBlMGUsIDB4MTM3ZGY5ZTcsIDB4M2NmNWEwODIsIDB4M2NmMWNiOGUsIDB4MTM4OWYxYWYsIDB4MTNhZGQ0ODEsIDB4M2NlNjNlOTgsCi0JMHgzY2UyNjAzZiwgMHgxM2I5Yzk0MywgMHgxM2RkYTJmNywgMHgzY2Q2YjcxZSwgMHgzY2QyY2Y2MiwgMHgxM2U5OTRhYiwgMHgxNDBkNjUyYywgMHgzY2M3MGExYywKLQkweDNjYzMxOGZmLCAweDE0MTk1M2NiLCAweDE0M2QxYjAyLCAweDNjYjczNzljLCAweDNjYjMzZDIyLCAweDE0NDkwNjg1LCAweDE0NmNjNDVjLCAweDNjYTczZmE5LAotCTB4M2NhMzNiZDMsIDB4MTQ3OGFjYmMsIDB4MTQ5YzYxMWQsIDB4M2M5NzIyNGMsIDB4M2M5MzE1MWQsIDB4MTRhODQ2NTIsIDB4MTRjYmYxMjcsIDB4M2M4NmRmOGUsCi0JMHgzYzgyYzkwOSwgMHgxNGQ3ZDMyYSwgMHgxNGZiNzQ1ZSwgMHgzYzc2Nzc3YiwgMHgzYzcyNTdhMiwgMHgxNTA3NTMyNywgMHgxNTJhZWFhMywgMHgzYzY1ZWExYywKLQkweDNjNjFjMGYxLCAweDE1MzZjNjJiLCAweDE1NWE1M2Q5LCAweDNjNTUzNzdiLCAweDNjNTEwNTAxLCAweDE1NjYyYzE4LCAweDE1ODlhZmUzLCAweDNjNDQ1ZmEyLAotCTB4M2M0MDIzZGQsIDB4MTU5NTg0ZDMsIDB4MTViOGZlYTQsIDB4M2MzMzYyOWQsIDB4M2MyZjFkOGUsIDB4MTVjNGQwM2UsIDB4MTVlODNmZmYsIDB4M2MyMjQwNzUsCi0JMHgzYzFkZjIxZiwgMHgxNWY0MGUzYSwgMHgxNjE3NzNkNiwgMHgzYzEwZjkzNSwgMHgzYzBjYTE5YiwgMHgxNjIzM2VhYywgMHgxNjQ2OWEwZCwgMHgzYmZmOGNlOCwKLQkweDNiZmIyYzBjLCAweDE2NTI2MTc2LCAweDE2NzViMjg2LCAweDNiZWRmYjk5LCAweDNiZTk5MTdlLCAweDE2ODE3NjdjLCAweDE2YTRiZDI1LCAweDNiZGM0NTUyLAotCTB4M2JkN2QxZmEsIDB4MTZiMDdkOWYsIDB4MTZkM2I5Y2MsIDB4M2JjYTZhMWQsIDB4M2JjNWVkOGQsIDB4MTZkZjc2YzMsIDB4MTcwMmE4NWUsIDB4M2JiODZhMDgsCi0JMHgzYmIzZTQ0MCwgMHgxNzBlNjFjYywgMHgxNzMxODhiZSwgMHgzYmE2NDUxYiwgMHgzYmExYjYyMCwgMHgxNzNkM2U5YiwgMHgxNzYwNWFkMCwgMHgzYjkzZmI2MywKLQkweDNiOGY2MzM3LCAweDE3NmMwZDE1LCAweDE3OGYxZTc2LCAweDNiODE4Y2ViLCAweDNiN2NlYjkwLCAweDE3OWFjZDFjLCAweDE3YmRkMzk0LCAweDNiNmVmOWJlLAotCTB4M2I2YTRmMzgsIDB4MTdjOTdlOTMsIDB4MTdlYzdhMGQsIDB4M2I1YzQxZTgsIDB4M2I1NzhlMzksIDB4MTdmODIxNWUsIDB4MTgxYjExYzQsIDB4M2I0OTY1NzQsCi0JMHgzYjQ0YThhMCwgMHgxODI2YjU2MSwgMHgxODQ5OWE5ZCwgMHgzYjM2NjQ2ZSwgMHgzYjMxOWU3NywgMHgxODU1M2E3ZCwgMHgxODc4MTQ3YSwgMHgzYjIzM2VlMSwKLQkweDNiMWU2ZmNhLCAweDE4ODNiMDk3LCAweDE4YTY3ZjNmLCAweDNiMGZmNGQ5LCAweDNiMGIxY2E2LCAweDE4YjIxNzkxLCAweDE4ZDRkYWQwLCAweDNhZmM4NjYzLAotCTB4M2FmN2E1MTYsIDB4MThlMDZmNTAsIDB4MTkwMzI3MGYsIDB4M2FlOGYzOGIsIDB4M2FlNDA5MjYsIDB4MTkwZWI3YjcsIDB4MTkzMTYzZTEsIDB4M2FkNTNjNWIsCi0JMHgzYWQwNDhlMywgMHgxOTNjZjBhOSwgMHgxOTVmOTEyOCwgMHgzYWMxNjBlMSwgMHgzYWJjNjQ1OCwgMHgxOTZiMWEwOSwgMHgxOThkYWVjOCwgMHgzYWFkNjEyOSwKLQkweDNhYTg1YjkyLCAweDE5OTkzM2JiLCAweDE5YmJiY2E2LCAweDNhOTkzZDNlLCAweDNhOTQyZTlkLCAweDE5YzczZGEzLCAweDE5ZTliYWEzLCAweDNhODRmNTJmLAotCTB4M2E3ZmRkODYsIDB4MTlmNTM3YTQsIDB4MWExN2E4YTUsIDB4M2E3MDg5MDYsIDB4M2E2YjY4NTksIDB4MWEyMzIxYTIsIDB4MWE0NTg2OGUsIDB4M2E1YmY4ZDEsCi0JMHgzYTU2Y2YyMywgMHgxYTUwZmI4MSwgMHgxYTczNTQ0MiwgMHgzYTQ3NDQ5YywgMHgzYTQyMTFmMCwgMHgxYTdlYzUyNCwgMHgxYWExMTFhNiwgMHgzYTMyNmM3NCwKLQkweDNhMmQzMGNkLCAweDFhYWM3ZTZmLCAweDFhY2ViZTlkLCAweDNhMWQ3MDY2LCAweDNhMTgyYmM4LCAweDFhZGEyNzQ2LCAweDFhZmM1YjBhLCAweDNhMDg1MDdmLAotCTB4M2EwMzAyZWQsIDB4MWIwN2JmOGMsIDB4MWIyOWU2ZDIsIDB4MzlmMzBjY2MsIDB4MzllZGI2NDksIDB4MWIzNTQ3MjcsIDB4MWI1NzYxZDgsIDB4MzlkZGE1NWEsCi0JMHgzOWQ4NDVlOSwgMHgxYjYyYmRmOCwgMHgxYjg0Y2MwMSwgMHgzOWM4MWEzNiwgMHgzOWMyYjFkYSwgMHgxYjkwMjNlNSwgMHgxYmIyMjUzMCwgMHgzOWIyNmI2ZCwKLQkweDM5YWNmYTJiLCAweDFiYmQ3OGQyLCAweDFiZGY2ZDRhLCAweDM5OWM5OTBkLCAweDM5OTcxZWU3LCAweDFiZWFiY2ExLCAweDFjMGNhNDMyLCAweDM5ODZhMzI0LAotCTB4Mzk4MTIwMWUsIDB4MWMxN2VmMzksIDB4MWMzOWM5Y2QsIDB4Mzk3MDg5YmYsIDB4Mzk2YWZkZGMsIDB4MWM0NTEwN2MsIDB4MWM2NmRkZmUsIDB4Mzk1YTRjZWIsCi0JMHgzOTU0YjgyZSwgMHgxYzcyMjA0ZiwgMHgxYzkzZTBhYiwgMHgzOTQzZWNiNiwgMHgzOTNlNGYyMywgMHgxYzlmMWU5NiwgMHgxY2MwZDFiNiwgMHgzOTJkNjkyZiwKLQkweDM5MjdjMmM5LCAweDFjY2MwYjM1LCAweDFjZWRiMTA2LCAweDM5MTZjMjYyLCAweDM5MTExMzJkLCAweDFjZjhlNjExLCAweDFkMWE3ZTdkLCAweDM4ZmZmODVlLAotCTB4MzhmYTQwNWUsIDB4MWQyNWFmMGQsIDB4MWQ0NzNhMDAsIDB4MzhlOTBiMzEsIDB4MzhlMzRhNjksIDB4MWQ1MjY2MGYsIDB4MWQ3M2UzNzQsIDB4MzhkMWZhZTksCi0JMHgzOGNjMzE1ZCwgMHgxZDdmMGFmYiwgMHgxZGEwN2FiYywgMHgzOGJhYzc5NSwgMHgzOGI0ZjU0NywgMHgxZGFiOWRiNSwgMHgxZGNjZmZiZiwgMHgzOGEzNzE0MiwKLQkweDM4OWQ5NjM3LCAweDFkZDgxZTIxLCAweDFkZjk3MjVmLCAweDM4OGJmN2ZmLCAweDM4ODYxNDNiLCAweDFlMDQ4YzI0LCAweDFlMjVkMjgyLCAweDM4NzQ1YmRiLAotCTB4Mzg2ZTZmNjAsIDB4MWUzMGU3YTQsIDB4MWU1MjIwMGMsIDB4Mzg1YzljZTMsIDB4Mzg1NmE3YjYsIDB4MWU1ZDMwODQsIDB4MWU3ZTVhZTIsIDB4Mzg0NGJiMjgsCi0JMHgzODNlYmQ0YywgMHgxZTg5NjZhOCwgMHgxZWFhODJlOSwgMHgzODJjYjZiNywgMHgzODI2YjAzMCwgMHgxZWI1ODlmNywgMHgxZWQ2OTgwNSwgMHgzODE0OGY5ZiwKLQkweDM4MGU4MDcxLCAweDFlZTE5YTU0LCAweDFmMDI5YTFjLCAweDM3ZmM0NWVmLCAweDM3ZjYyZTFkLCAweDFmMGQ5N2E1LCAweDFmMmU4OTExLCAweDM3ZTNkOWI3LAotCTB4MzdkZGI5NDUsIDB4MWYzOTgxY2UsIDB4MWY1YTY0Y2IsIDB4MzdjYjRiMDQsIDB4MzdjNTIxZjYsIDB4MWY2NTU4YjUsIDB4MWY4NjJkMmQsIDB4MzdiMjk5ZTcsCi0JMHgzN2FjNjg0MSwgMHgxZjkxMWMzZCwgMHgxZmIxZTIxZCwgMHgzNzk5YzY2ZiwgMHgzNzkzOGMzNCwgMHgxZmJjY2M0ZCwgMHgxZmRkODM4MSwgMHgzNzgwZDBhYSwKLQkweDM3N2E4ZGRmLCAweDFmZTg2OGM4LCAweDIwMDkxMTNjLCAweDM3NjdiOGE5LCAweDM3NjE2ZDUxLCAweDIwMTNmMTk2LCAweDIwMzQ4YjM1LCAweDM3NGU3ZTdiLAotCTB4Mzc0ODJhOWEsIDB4MjAzZjY2OTksIDB4MjA1ZmYxNGYsIDB4MzczNTIyMmYsIDB4MzcyZWM1YzksIDB4MjA2YWM3YjgsIDB4MjA4YjQzNzIsIDB4MzcxYmEzZDQsCi0JMHgzNzE1M2VlZSwgMHgyMDk2MTRkOSwgMHgyMGI2ODE4MSwgMHgzNzAyMDM3YywgMHgzNmZiOTYxOCwgMHgyMGMxNGRkZiwgMHgyMGUxYWI2MywgMHgzNmU4NDEzNSwKLQkweDM2ZTFjYjU4LCAweDIwZWM3MmIxLCAweDIxMGNjMGZjLCAweDM2Y2U1ZDEwLCAweDM2YzdkZWJkLCAweDIxMTc4MzM0LCAweDIxMzdjMjMyLCAweDM2YjQ1NzFiLAotCTB4MzZhZGQwNTgsIDB4MjE0MjdmNGQsIDB4MjE2MmFlZWEsIDB4MzY5YTJmNjksIDB4MzY5M2EwMzgsIDB4MjE2ZDY2ZTIsIDB4MjE4ZDg3MGIsIDB4MzY3ZmU2MDgsCi0JMHgzNjc5NGU2ZSwgMHgyMTk4MzlkOCwgMHgyMWI4NGE3OSwgMHgzNjY1N2IwOCwgMHgzNjVlZGIwOSwgMHgyMWMyZjgxNSwgMHgyMWUyZjkxYSwgMHgzNjRhZWU3YiwKLQkweDM2NDQ0NjFiLCAweDIxZWRhMTdmLCAweDIyMGQ5MmQ0LCAweDM2MzA0MDcwLCAweDM2Mjk4ZmI0LCAweDIyMTgzNWZiLCAweDIyMzgxNzhkLCAweDM2MTU3MGY4LAotCTB4MzYwZWI3ZTMsIDB4MjI0MmI1NmYsIDB4MjI2Mjg3MjksIDB4MzVmYTgwMjMsIDB4MzVmM2JlYmEsIDB4MjI2ZDFmYzEsIDB4MjI4Y2UxOTEsIDB4MzVkZjZlMDMsCi0JMHgzNWQ4YTQ0OSwgMHgyMjk3NzRkNywgMHgyMmI3MjZhOCwgMHgzNWM0M2FhNywgMHgzNWJkNjhhMSwgMHgyMmMxYjQ5NiwgMHgyMmUxNTY1NSwgMHgzNWE4ZTYyMSwKLQkweDM1YTIwYmQzLCAweDIyZWJkZWU1LCAweDIzMGI3MDdlLCAweDM1OGQ3MDgxLCAweDM1ODY4ZGVmLCAweDIzMTVmM2E4LCAweDIzMzU3NTA5LCAweDM1NzFkOWQ5LAotCTB4MzU2YWVmMDgsIDB4MjMzZmYyYzgsIDB4MjM1ZjYzZGMsIDB4MzU1NjIyMzksIDB4MzU0ZjJmMmMsIDB4MjM2OWRjMjksIDB4MjM4OTNjZGQsIDB4MzUzYTQ5YjIsCi0JMHgzNTMzNGU2ZiwgMHgyMzkzYWZiMiwgMHgyM2IyZmZmMywgMHgzNTFlNTA1NiwgMHgzNTE3NGNlMCwgMHgyM2JkNmQ0OCwgMHgyM2RjYWQwMywgMHgzNTAyMzYzNiwKLQkweDM0ZmIyYTkyLCAweDIzZTcxNGQzLCAweDI0MDY0M2Y0LCAweDM0ZTVmYjYzLCAweDM0ZGVlNzk1LCAweDI0MTBhNjM5LCAweDI0MmZjNGFkLCAweDM0Yzk5ZmVmLAotCTB4MzRjMjgzZmIsIDB4MjQzYTIxNWYsIDB4MjQ1OTJmMTMsIDB4MzRhZDIzZWIsIDB4MzRhNWZmZDUsIDB4MjQ2Mzg2MmMsIDB4MjQ4MjgzMGQsIDB4MzQ5MDg3NjgsCi0JMHgzNDg5NWIzNiwgMHgyNDhjZDQ4NywgMHgyNGFiYzA4MiwgMHgzNDczY2E3OSwgMHgzNDZjOTYyZiwgMHgyNGI2MGM1NywgMHgyNGQ0ZTc1NywgMHgzNDU2ZWQyZiwKLQkweDM0NGZiMGQxLCAweDI0ZGYyZDgxLCAweDI0ZmRmNzc1LCAweDM0MzllZjljLCAweDM0MzJhYjJlLCAweDI1MDgzN2VkLCAweDI1MjZmMGMxLCAweDM0MWNkMWQyLAotCTB4MzQxNTg1NTksIDB4MjUzMTJiODEsIDB4MjU0ZmQzMjMsIDB4MzNmZjkzZTIsIDB4MzNmODNmNjIsIDB4MjU1YTA4MjMsIDB4MjU3ODllODAsIDB4MzNlMjM1ZGYsCi0JMHgzM2RhZDk1ZSwgMHgyNTgyY2RiYywgMHgyNWExNTJjMCwgMHgzM2M0YjdkYiwgMHgzM2JkNTM1YywgMHgyNWFiN2MzMCwgMHgyNWM5ZWZjYSwgMHgzM2E3MTllOCwKLQkweDMzOWZhZDcwLCAweDI1ZDQxMzY5LCAweDI1ZjI3NTg0LCAweDMzODk1YzE4LCAweDMzODFlN2FjLCAweDI1ZmM5MzRiLCAweDI2MWFlM2Q2LCAweDMzNmI3ZTdlLAotCTB4MzM2NDAyMjMsIDB4MjYyNGZiYmYsIDB4MjY0MzNhYTcsIDB4MzM0ZDgxMmQsIDB4MzM0NWZjZTYsIDB4MjY0ZDRjYWMsIDB4MjY2Yjc5ZGQsIDB4MzMyZjY0MzUsCi0JMHgzMzI3ZDgwOCwgMHgyNjc1ODVmOCwgMHgyNjkzYTE2MSwgMHgzMzExMjdhYiwgMHgzMzA5OTM5YywgMHgyNjlkYTc4YiwgMHgyNmJiYjExOSwgMHgzMmYyY2JhMSwKLQkweDMyZWIyZmI1LCAweDI2YzViMTRjLCAweDI2ZTNhOGVjLCAweDMyZDQ1MDI5LCAweDMyY2NhYzY0LCAweDI2ZWRhMzIyLCAweDI3MGI4OGMyLCAweDMyYjViNTU3LAotCTB4MzJhZTA5YmUsIDB4MjcxNTdjZjUsIDB4MjczMzUwODIsIDB4MzI5NmZiM2QsIDB4MzI4ZjQ3ZDUsIDB4MjczZDNlYWMsIDB4Mjc1YjAwMTQsIDB4MzI3ODIxZWUsCi0JMHgzMjcwNjZiYywgMHgyNzY0ZTgyZiwgMHgyNzgyOTc2MCwgMHgzMjU5Mjk3ZCwgMHgzMjUxNjY4NiwgMHgyNzhjNzk2NSwgMHgyN2FhMTY0YywgMHgzMjNhMTFmZSwKLQkweDMyMzI0NzQ2LCAweDI3YjNmMjM1LCAweDI3ZDE3Y2MxLCAweDMyMWFkYjgzLCAweDMyMTMwOTBmLCAweDI3ZGI1Mjg4LCAweDI3ZjhjYWE1LCAweDMxZmI4NjIwLAotCTB4MzFmM2FiZjUsIDB4MjgwMjlhNDUsIDB4MjgxZmZmZTIsIDB4MzFkYzExZTgsIDB4MzFkNDMwMGIsIDB4MjgyOWM5NTQsIDB4Mjg0NzFjNWUsIDB4MzFiYzdlZWUsCi0JMHgzMWI0OTU2NCwgMHgyODUwZGY5ZCwgMHgyODZlMjAwMiwgMHgzMTljY2Q0NiwgMHgzMTk0ZGMxNCwgMHgyODc3ZGQwNywgMHgyODk1MGFiNiwgMHgzMTdjZmQwNCwKLQkweDMxNzUwNDJlLCAweDI4OWVjMTdhLCAweDI4YmJkYzYxLCAweDMxNWQwZTNiLCAweDMxNTUwZGM2LCAweDI4YzU4Y2RmLCAweDI4ZTI5NGViLCAweDMxM2QwMGZmLAotCTB4MzEzNGY4ZjEsIDB4MjhlYzNmMWUsIDB4MjkwOTM0M2UsIDB4MzExY2Q1NjQsIDB4MzExNGM1YzAsIDB4MjkxMmQ4MWYsIDB4MjkyZmJhNDAsIDB4MzBmYzhiN2QsCi0JMHgzMGY0NzQ0OSwgMHgyOTM5NTdjOSwgMHgyOTU2MjZkYSwgMHgzMGRjMjM1ZSwgMHgzMGQ0MDRhMCwgMHgyOTVmYmUwNiwgMHgyOTdjNzlmNSwgMHgzMGJiOWQxYywKLQkweDMwYjM3NmQ4LCAweDI5ODYwYWJkLCAweDI5YTJiMzc4LCAweDMwOWFmOGNhLCAweDMwOTJjYjA1LCAweDI5YWMzZGQ3LCAweDI5YzhkMzRkLCAweDMwN2EzNjdjLAotCTB4MzA3MjAxM2MsIDB4MjlkMjU3M2MsIDB4MjllZWQ5NWIsIDB4MzA1OTU2NDgsIDB4MzA1MTE5OTEsIDB4MjlmODU2ZDUsIDB4MmExNGM1OGIsIDB4MzAzODU4NDAsCi0JMHgzMDMwMTQxOCwgMHgyYTFlM2M4YSwgMHgyYTNhOTdjNywgMHgzMDE3M2M3YSwgMHgzMDBlZjBlNSwgMHgyYTQ0MDg0NCwgMHgyYTYwNGZmNSwgMHgyZmY2MDMwYSwKLQkweDJmZWRiMDBkLCAweDJhNjliOWVjLCAweDJhODVlZTAwLCAweDJmZDRhYzA0LCAweDJmY2M1MWE1LCAweDJhOGY1MTZiLCAweDJhYWI3MWQwLCAweDJmYjMzNzdjLAotCTB4MmZhYWQ1YzEsIDB4MmFiNGNlYTksIDB4MmFkMGRiNGUsIDB4MmY5MWE1ODksIDB4MmY4OTNjNzUsIDB4MmFkYTMxOGUsIDB4MmFmNjJhNjMsIDB4MmY2ZmY2M2QsCi0JMHgyZjY3ODVkNywgMHgyYWZmN2EwNSwgMHgyYjFiNWVmOCwgMHgyZjRlMjlhZiwgMHgyZjQ1YjFmYiwgMHgyYjI0YTdmNiwgMHgyYjQwNzhmNSwgMHgyZjJjM2ZmMiwKLQkweDJmMjNjMGY2LCAweDJiNDliYjRhLCAweDJiNjU3ODQ0LCAweDJmMGEzOTFkLCAweDJmMDFiMmRlLCAweDJiNmViM2VhLCAweDJiOGE1Y2NlLCAweDJlZTgxNTQzLAotCTB4MmVkZjg3YzYsIDB4MmI5MzkxYzAsIDB4MmJhZjI2N2QsIDB4MmVjNWQ0NzksIDB4MmViZDNmYzQsIDB4MmJiODU0YjQsIDB4MmJkM2Q1M2EsIDB4MmVhMzc2ZDYsCi0JMHgyZTlhZGFlZSwgMHgyYmRjZmNiMCwgMHgyYmY4NjhlZCwgMHgyZTgwZmM2ZSwgMHgyZTc4NTk1OCwgMHgyYzAxODk5ZSwgMHgyYzFjZTE4MSwgMHgyZTVlNjU1NiwKLQkweDJlNTViYjE3LCAweDJjMjVmYjY2LCAweDJjNDEzZWRmLCAweDJlM2JiMWE0LCAweDJlMzMwMDQyLCAweDJjNGE1MWYzLCAweDJjNjU4MGYxLCAweDJlMThlMTZkLAotCTB4MmUxMDI4ZWQsIDB4MmM2ZThkMmUsIDB4MmM4OWE3OWYsIDB4MmRmNWY0YzcsIDB4MmRlZDM1MmYsIDB4MmM5MmFkMDEsIDB4MmNhZGIyZDUsIDB4MmRkMmViYzcsCi0JMHgyZGNhMjUxYywgMHgyY2I2YjE1NSwgMHgyY2QxYTI3YiwgMHgyZGFmYzY4MywgMHgyZGE2ZjhjYSwgMHgyY2RhOWExNCwgMHgyY2Y1NzY3YywgMHgyZDhjODUxMCwKLQkweDJkODNiMDRmLCAweDJjZmU2NzI4LCAweDJkMTkyZWMxLCAweDJkNjkyNzg0LCAweDJkNjA0YmMwLCAweDJkMjIxODdhLCAweDJkM2NjYjM0LCAweDJkNDVhZGY2Ci19OwotCi1jb25zdCBpbnQgdHdpZFRhYjUxMls4KjYgKyAzMio2ICsgMTI4KjZdID0gewotCTB4NDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4M2IyMGQ3OWUsIDB4MTg3ZGUyYTYsCi0JMHgzZWM1MmY5ZiwgMHgwYzdjNWMxZSwgMHgzNTM2Y2M1MiwgMHgyMzhlNzY3MywgMHgyZDQxM2NjYywgMHgyZDQxM2NjYywgMHgzYjIwZDc5ZSwgMHgxODdkZTJhNiwKLQkweDE4N2RlMmE2LCAweDNiMjBkNzllLCAweDE4N2RlMmE2LCAweDNiMjBkNzllLCAweDM1MzZjYzUyLCAweDIzOGU3NjczLCAweGYzODNhM2UyLCAweDNlYzUyZjlmLAotCTB4MDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4MmQ0MTNjY2MsIDB4MmQ0MTNjY2MsIDB4ZDJiZWMzMzQsIDB4MmQ0MTNjY2MsIDB4ZTc4MjFkNWEsIDB4M2IyMGQ3OWUsCi0JMHgyMzhlNzY3MywgMHgzNTM2Y2M1MiwgMHhjMTNhZDA2MSwgMHgwYzdjNWMxZSwgMHhkMmJlYzMzNCwgMHgyZDQxM2NjYywgMHgxODdkZTJhNiwgMHgzYjIwZDc5ZSwKLQkweGM0ZGYyODYyLCAweGU3ODIxZDVhLCAweGM0ZGYyODYyLCAweDE4N2RlMmE2LCAweDBjN2M1YzFlLCAweDNlYzUyZjlmLCAweGRjNzE4OThkLCAweGNhYzkzM2FlLAotCi0JMHg0MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgzZmIxMWI0NywgMHgwNjQ1ZTlhZiwKLQkweDNmZWM0M2M2LCAweDAzMjNlY2JlLCAweDNmNGVhYWZlLCAweDA5NjQwODM3LCAweDNlYzUyZjlmLCAweDBjN2M1YzFlLCAweDNmYjExYjQ3LCAweDA2NDVlOWFmLAotCTB4M2QzZTgyYWQsIDB4MTI5NDA2MmUsIDB4M2QzZTgyYWQsIDB4MTI5NDA2MmUsIDB4M2Y0ZWFhZmUsIDB4MDk2NDA4MzcsIDB4MzlkYWY1ZTgsIDB4MWI1ZDEwMDksCi0JMHgzYjIwZDc5ZSwgMHgxODdkZTJhNiwgMHgzZWM1MmY5ZiwgMHgwYzdjNWMxZSwgMHgzNTM2Y2M1MiwgMHgyMzhlNzY3MywgMHgzODcxNjVlMywgMHgxZTJiNWQzOCwKLQkweDNlMTRmZGY3LCAweDBmOGNmY2JkLCAweDJmNmJiZTQ0LCAweDJhZmFkMjY5LCAweDM1MzZjYzUyLCAweDIzOGU3NjczLCAweDNkM2U4MmFkLCAweDEyOTQwNjJlLAotCTB4Mjg5OWU2NGEsIDB4MzE3OTAwZDYsIDB4MzE3OTAwZDYsIDB4Mjg5OWU2NGEsIDB4M2M0MjQyMDksIDB4MTU4ZjlhNzUsIDB4MjBlNzBmMzIsIDB4MzZlNTA2OGEsCi0JMHgyZDQxM2NjYywgMHgyZDQxM2NjYywgMHgzYjIwZDc5ZSwgMHgxODdkZTJhNiwgMHgxODdkZTJhNiwgMHgzYjIwZDc5ZSwgMHgyODk5ZTY0YSwgMHgzMTc5MDBkNiwKLQkweDM5ZGFmNWU4LCAweDFiNWQxMDA5LCAweDBmOGNmY2JkLCAweDNlMTRmZGY3LCAweDIzOGU3NjczLCAweDM1MzZjYzUyLCAweDM4NzE2NWUzLCAweDFlMmI1ZDM4LAotCTB4MDY0NWU5YWYsIDB4M2ZiMTFiNDcsIDB4MWUyYjVkMzgsIDB4Mzg3MTY1ZTMsIDB4MzZlNTA2OGEsIDB4MjBlNzBmMzIsIDB4ZmNkYzEzNDIsIDB4M2ZlYzQzYzYsCi0JMHgxODdkZTJhNiwgMHgzYjIwZDc5ZSwgMHgzNTM2Y2M1MiwgMHgyMzhlNzY3MywgMHhmMzgzYTNlMiwgMHgzZWM1MmY5ZiwgMHgxMjk0MDYyZSwgMHgzZDNlODJhZCwKLQkweDMzNjdjMDhmLCAweDI2MWZlZmY5LCAweGVhNzA2NThiLCAweDNjNDI0MjA5LCAweDBjN2M1YzFlLCAweDNlYzUyZjlmLCAweDMxNzkwMGQ2LCAweDI4OTllNjRhLAotCTB4ZTFkNGEyYzgsIDB4Mzg3MTY1ZTMsIDB4MDY0NWU5YWYsIDB4M2ZiMTFiNDcsIDB4MmY2YmJlNDQsIDB4MmFmYWQyNjksIDB4ZDllMDEwMDcsIDB4MzM2N2MwOGYsCi0JMHgwMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgyZDQxM2NjYywgMHgyZDQxM2NjYywgMHhkMmJlYzMzNCwgMHgyZDQxM2NjYywgMHhmOWJhMTY1MSwgMHgzZmIxMWI0NywKLQkweDJhZmFkMjY5LCAweDJmNmJiZTQ0LCAweGNjOTgzZjcxLCAweDI2MWZlZmY5LCAweGYzODNhM2UyLCAweDNlYzUyZjlmLCAweDI4OTllNjRhLCAweDMxNzkwMGQ2LAotCTB4Yzc4ZTlhMWQsIDB4MWUyYjVkMzgsIDB4ZWQ2YmY5ZDIsIDB4M2QzZTgyYWQsIDB4MjYxZmVmZjksIDB4MzM2N2MwOGYsIDB4YzNiZGJkZjcsIDB4MTU4ZjlhNzUsCi0JMHhlNzgyMWQ1YSwgMHgzYjIwZDc5ZSwgMHgyMzhlNzY3MywgMHgzNTM2Y2M1MiwgMHhjMTNhZDA2MSwgMHgwYzdjNWMxZSwgMHhlMWQ0YTJjOCwgMHgzODcxNjVlMywKLQkweDIwZTcwZjMyLCAweDM2ZTUwNjhhLCAweGMwMTNiYzNhLCAweDAzMjNlY2JlLCAweGRjNzE4OThkLCAweDM1MzZjYzUyLCAweDFlMmI1ZDM4LCAweDM4NzE2NWUzLAotCTB4YzA0ZWU0YjksIDB4ZjliYTE2NTEsIDB4ZDc2NjE5YjYsIDB4MzE3OTAwZDYsIDB4MWI1ZDEwMDksIDB4MzlkYWY1ZTgsIDB4YzFlYjAyMDksIDB4ZjA3MzAzNDMsCi0JMHhkMmJlYzMzNCwgMHgyZDQxM2NjYywgMHgxODdkZTJhNiwgMHgzYjIwZDc5ZSwgMHhjNGRmMjg2MiwgMHhlNzgyMWQ1YSwgMHhjZTg2ZmYyYSwgMHgyODk5ZTY0YSwKLQkweDE1OGY5YTc1LCAweDNjNDI0MjA5LCAweGM5MWFmOTc2LCAweGRmMThmMGNlLCAweGNhYzkzM2FlLCAweDIzOGU3NjczLCAweDEyOTQwNjJlLCAweDNkM2U4MmFkLAotCTB4Y2U4NmZmMmEsIDB4ZDc2NjE5YjYsIDB4Yzc4ZTlhMWQsIDB4MWUyYjVkMzgsIDB4MGY4Y2ZjYmQsIDB4M2UxNGZkZjcsIDB4ZDUwNTJkOTcsIDB4ZDA5NDQxYmMsCi0JMHhjNGRmMjg2MiwgMHgxODdkZTJhNiwgMHgwYzdjNWMxZSwgMHgzZWM1MmY5ZiwgMHhkYzcxODk4ZCwgMHhjYWM5MzNhZSwgMHhjMmMxN2Q1MywgMHgxMjk0MDYyZSwKLQkweDA5NjQwODM3LCAweDNmNGVhYWZlLCAweGU0YTJlZmY3LCAweGM2MjUwYTE4LCAweGMxM2FkMDYxLCAweDBjN2M1YzFlLCAweDA2NDVlOWFmLCAweDNmYjExYjQ3LAotCTB4ZWQ2YmY5ZDIsIDB4YzJjMTdkNTMsIDB4YzA0ZWU0YjksIDB4MDY0NWU5YWYsIDB4MDMyM2VjYmUsIDB4M2ZlYzQzYzYsIDB4ZjY5YmY3YzksIDB4YzBiMTU1MDIsCi0KLQkweDQwMDAwMDAwLCAweDAwMDAwMDAwLCAweDQwMDAwMDAwLCAweDAwMDAwMDAwLCAweDQwMDAwMDAwLCAweDAwMDAwMDAwLCAweDNmZmIxMGMxLCAweDAxOTIxNTVmLAotCTB4M2ZmZWM0MmQsIDB4MDBjOTBlOGYsIDB4M2ZmNGU1ZGYsIDB4MDI1YjBjYWUsIDB4M2ZlYzQzYzYsIDB4MDMyM2VjYmUsIDB4M2ZmYjEwYzEsIDB4MDE5MjE1NWYsCi0JMHgzZmQzOWI1YSwgMHgwNGI1NDgyNCwgMHgzZmQzOWI1YSwgMHgwNGI1NDgyNCwgMHgzZmY0ZTVkZiwgMHgwMjViMGNhZSwgMHgzZjljMmJmYSwgMHgwNzBkZTE3MSwKLQkweDNmYjExYjQ3LCAweDA2NDVlOWFmLCAweDNmZWM0M2M2LCAweDAzMjNlY2JlLCAweDNmNGVhYWZlLCAweDA5NjQwODM3LCAweDNmODRjOGUxLCAweDA3ZDU5Mzk1LAotCTB4M2ZlMTJhY2IsIDB4MDNlY2FkY2YsIDB4M2VlYjMzNDcsIDB4MGJiNmVjZWYsIDB4M2Y0ZWFhZmUsIDB4MDk2NDA4MzcsIDB4M2ZkMzliNWEsIDB4MDRiNTQ4MjQsCi0JMHgzZTcxZTc1OCwgMHgwZTA1YzEzNSwgMHgzZjBlYzlmNCwgMHgwYWYxMGEyMiwgMHgzZmMzOTVmOSwgMHgwNTdkYjQwMiwgMHgzZGUyZjE0NywgMHgxMDRmYjgwZSwKLQkweDNlYzUyZjlmLCAweDBjN2M1YzFlLCAweDNmYjExYjQ3LCAweDA2NDVlOWFmLCAweDNkM2U4MmFkLCAweDEyOTQwNjJlLCAweDNlNzFlNzU4LCAweDBlMDVjMTM1LAotCTB4M2Y5YzJiZmEsIDB4MDcwZGUxNzEsIDB4M2M4NGQ0OTYsIDB4MTRkMWUyNDIsIDB4M2UxNGZkZjcsIDB4MGY4Y2ZjYmQsIDB4M2Y4NGM4ZTEsIDB4MDdkNTkzOTUsCi0JMHgzYmI2Mjc2ZCwgMHgxNzA4ODUzMCwgMHgzZGFlODFjZSwgMHgxMTExZDI2MiwgMHgzZjZhZjJlMywgMHgwODljZjg2NywgMHgzYWQyYzJlNywgMHgxOTM3MmE2MywKLQkweDNkM2U4MmFkLCAweDEyOTQwNjJlLCAweDNmNGVhYWZlLCAweDA5NjQwODM3LCAweDM5ZGFmNWU4LCAweDFiNWQxMDA5LCAweDNjYzUxMWQ4LCAweDE0MTM1Yzk0LAotCTB4M2YyZmYyNDksIDB4MGEyYWJiNTgsIDB4MzhjZjE2NjksIDB4MWQ3OTc3NWIsIDB4M2M0MjQyMDksIDB4MTU4ZjlhNzUsIDB4M2YwZWM5ZjQsIDB4MGFmMTBhMjIsCi0JMHgzN2FmODE1OCwgMHgxZjhiYTRkYiwgMHgzYmI2Mjc2ZCwgMHgxNzA4ODUzMCwgMHgzZWViMzM0NywgMHgwYmI2ZWNlZiwgMHgzNjdjOWE3ZCwgMHgyMTkyZTA5YSwKLQkweDNiMjBkNzllLCAweDE4N2RlMmE2LCAweDNlYzUyZjlmLCAweDBjN2M1YzFlLCAweDM1MzZjYzUyLCAweDIzOGU3NjczLCAweDNhODI2OWEyLCAweDE5ZWY3OTQzLAotCTB4M2U5Y2MwNzYsIDB4MGQ0MTUwMTIsIDB4MzNkZTg3ZGUsIDB4MjU3ZGI2NGIsIDB4MzlkYWY1ZTgsIDB4MWI1ZDEwMDksIDB4M2U3MWU3NTgsIDB4MGUwNWMxMzUsCi0JMHgzMjc0NDQ5MywgMHgyNzVmZjQ1MiwgMHgzOTJhOTY0MiwgMHgxY2M2NmU5OSwgMHgzZTQ0YTVlZSwgMHgwZWM5YTdmMiwgMHgzMGY4ODAxZiwgMHgyOTM0ODkzNywKLQkweDM4NzE2NWUzLCAweDFlMmI1ZDM4LCAweDNlMTRmZGY3LCAweDBmOGNmY2JkLCAweDJmNmJiZTQ0LCAweDJhZmFkMjY5LCAweDM3YWY4MTU4LCAweDFmOGJhNGRiLAotCTB4M2RlMmYxNDcsIDB4MTA0ZmI4MGUsIDB4MmRjZTg4YTksIDB4MmNiMjMyNGIsIDB4MzZlNTA2OGEsIDB4MjBlNzBmMzIsIDB4M2RhZTgxY2UsIDB4MTExMWQyNjIsCi0JMHgyYzIxNmVhYSwgMHgyZTVhMTA2ZiwgMHgzNjEyMTRiMCwgMHgyMjNkNjZhOCwgMHgzZDc3YjE5MSwgMHgxMWQzNDQzZiwgMHgyYTY1MDUyNSwgMHgyZmYxZDljNiwKLQkweDM1MzZjYzUyLCAweDIzOGU3NjczLCAweDNkM2U4MmFkLCAweDEyOTQwNjJlLCAweDI4OTllNjRhLCAweDMxNzkwMGQ2LCAweDM0NTM0ZjQwLCAweDI0ZGEwYTk5LAotCTB4M2QwMmY3NTYsIDB4MTM1NDEwYzIsIDB4MjZjMGIxNjIsIDB4MzJlZWZkZTksIDB4MzM2N2MwOGYsIDB4MjYxZmVmZjksIDB4M2NjNTExZDgsIDB4MTQxMzVjOTQsCi0JMHgyNGRhMGE5OSwgMHgzNDUzNGY0MCwgMHgzMjc0NDQ5MywgMHgyNzVmZjQ1MiwgMHgzYzg0ZDQ5NiwgMHgxNGQxZTI0MiwgMHgyMmU2OWFjNywgMHgzNWE1NzkzYywKLQkweDMxNzkwMGQ2LCAweDI4OTllNjRhLCAweDNjNDI0MjA5LCAweDE1OGY5YTc1LCAweDIwZTcwZjMyLCAweDM2ZTUwNjhhLCAweDMwNzYxYzE3LCAweDI5Y2Q5NTc3LAotCTB4M2JmZDVjYzQsIDB4MTY0YzdkZGQsIDB4MWVkYzE5NTIsIDB4MzgxMTg4NGMsIDB4MmY2YmJlNDQsIDB4MmFmYWQyNjksIDB4M2JiNjI3NmQsIDB4MTcwODg1MzAsCi0JMHgxY2M2NmU5OSwgMHgzOTJhOTY0MiwgMHgyZTVhMTA2ZiwgMHgyYzIxNmVhYSwgMHgzYjZjYTRjNCwgMHgxN2MzYTkzMSwgMHgxYWE2YzgyYiwgMHgzYTJmY2VlOCwKLQkweDJkNDEzY2NjLCAweDJkNDEzY2NjLCAweDNiMjBkNzllLCAweDE4N2RlMmE2LCAweDE4N2RlMmE2LCAweDNiMjBkNzllLCAweDJjMjE2ZWFhLCAweDJlNWExMDZmLAotCTB4M2FkMmMyZTcsIDB4MTkzNzJhNjMsIDB4MTY0YzdkZGQsIDB4M2JmZDVjYzQsIDB4MmFmYWQyNjksIDB4MmY2YmJlNDQsIDB4M2E4MjY5YTIsIDB4MTllZjc5NDMsCi0JMHgxNDEzNWM5NCwgMHgzY2M1MTFkOCwgMHgyOWNkOTU3NywgMHgzMDc2MWMxNywgMHgzYTJmY2VlOCwgMHgxYWE2YzgyYiwgMHgxMWQzNDQzZiwgMHgzZDc3YjE5MSwKLQkweDI4OTllNjRhLCAweDMxNzkwMGQ2LCAweDM5ZGFmNWU4LCAweDFiNWQxMDA5LCAweDBmOGNmY2JkLCAweDNlMTRmZGY3LCAweDI3NWZmNDUyLCAweDMyNzQ0NDkzLAotCTB4Mzk4M2UxZTcsIDB4MWMxMjQ5ZDgsIDB4MGQ0MTUwMTIsIDB4M2U5Y2MwNzYsIDB4MjYxZmVmZjksIDB4MzM2N2MwOGYsIDB4MzkyYTk2NDIsIDB4MWNjNjZlOTksCi0JMHgwYWYxMGEyMiwgMHgzZjBlYzlmNCwgMHgyNGRhMGE5OSwgMHgzNDUzNGY0MCwgMHgzOGNmMTY2OSwgMHgxZDc5Nzc1YiwgMHgwODljZjg2NywgMHgzZjZhZjJlMywKLQkweDIzOGU3NjczLCAweDM1MzZjYzUyLCAweDM4NzE2NWUzLCAweDFlMmI1ZDM4LCAweDA2NDVlOWFmLCAweDNmYjExYjQ3LCAweDIyM2Q2NmE4LCAweDM2MTIxNGIwLAotCTB4MzgxMTg4NGMsIDB4MWVkYzE5NTIsIDB4MDNlY2FkY2YsIDB4M2ZlMTJhY2IsIDB4MjBlNzBmMzIsIDB4MzZlNTA2OGEsIDB4MzdhZjgxNTgsIDB4MWY4YmE0ZGIsCi0JMHgwMTkyMTU1ZiwgMHgzZmZiMTBjMSwgMHgxZjhiYTRkYiwgMHgzN2FmODE1OCwgMHgzNzRiNTRjZSwgMHgyMDM5ZjkwZSwgMHhmZjM2ZjE3MSwgMHgzZmZlYzQyZCwKLQkweDFlMmI1ZDM4LCAweDM4NzE2NWUzLCAweDM2ZTUwNjhhLCAweDIwZTcwZjMyLCAweGZjZGMxMzQyLCAweDNmZWM0M2M2LCAweDFjYzY2ZTk5LCAweDM5MmE5NjQyLAotCTB4MzY3YzlhN2QsIDB4MjE5MmUwOWEsIDB4ZmE4MjRiZmUsIDB4M2ZjMzk1ZjksIDB4MWI1ZDEwMDksIDB4MzlkYWY1ZTgsIDB4MzYxMjE0YjAsIDB4MjIzZDY2YTgsCi0JMHhmODJhNmM2YiwgMHgzZjg0YzhlMSwgMHgxOWVmNzk0MywgMHgzYTgyNjlhMiwgMHgzNWE1NzkzYywgMHgyMmU2OWFjNywgMHhmNWQ1NDRhOCwgMHgzZjJmZjI0OSwKLQkweDE4N2RlMmE2LCAweDNiMjBkNzllLCAweDM1MzZjYzUyLCAweDIzOGU3NjczLCAweGYzODNhM2UyLCAweDNlYzUyZjlmLCAweDE3MDg4NTMwLCAweDNiYjYyNzZkLAotCTB4MzRjNjEyMzYsIDB4MjQzNGYzMzIsIDB4ZjEzNjU4MGUsIDB4M2U0NGE1ZWUsIDB4MTU4ZjlhNzUsIDB4M2M0MjQyMDksIDB4MzQ1MzRmNDAsIDB4MjRkYTBhOTksCi0JMHhlZWVlMmQ5ZSwgMHgzZGFlODFjZSwgMHgxNDEzNWM5NCwgMHgzY2M1MTFkOCwgMHgzM2RlODdkZSwgMHgyNTdkYjY0YiwgMHhlY2FiZWYzZSwgMHgzZDAyZjc1NiwKLQkweDEyOTQwNjJlLCAweDNkM2U4MmFkLCAweDMzNjdjMDhmLCAweDI2MWZlZmY5LCAweGVhNzA2NThiLCAweDNjNDI0MjA5LCAweDExMTFkMjYyLCAweDNkYWU4MWNlLAotCTB4MzJlZWZkZTksIDB4MjZjMGIxNjIsIDB4ZTgzYzU2Y2YsIDB4M2I2Y2E0YzQsIDB4MGY4Y2ZjYmQsIDB4M2UxNGZkZjcsIDB4MzI3NDQ0OTMsIDB4Mjc1ZmY0NTIsCi0JMHhlNjEwODZiZCwgMHgzYTgyNjlhMiwgMHgwZTA1YzEzNSwgMHgzZTcxZTc1OCwgMHgzMWY3OTk0NywgMHgyN2ZkYjJhNiwgMHhlM2VkYjYyOCwgMHgzOTgzZTFlNywKLQkweDBjN2M1YzFlLCAweDNlYzUyZjlmLCAweDMxNzkwMGQ2LCAweDI4OTllNjRhLCAweGUxZDRhMmM4LCAweDM4NzE2NWUzLCAweDBhZjEwYTIyLCAweDNmMGVjOWY0LAotCTB4MzBmODgwMWYsIDB4MjkzNDg5MzcsIDB4ZGZjNjA2ZjIsIDB4Mzc0YjU0Y2UsIDB4MDk2NDA4MzcsIDB4M2Y0ZWFhZmUsIDB4MzA3NjFjMTcsIDB4MjljZDk1NzcsCi0JMHhkZGMyOTk1OCwgMHgzNjEyMTRiMCwgMHgwN2Q1OTM5NSwgMHgzZjg0YzhlMSwgMHgyZmYxZDljNiwgMHgyYTY1MDUyNSwgMHhkYmNiMGNjZSwgMHgzNGM2MTIzNiwKLQkweDA2NDVlOWFmLCAweDNmYjExYjQ3LCAweDJmNmJiZTQ0LCAweDJhZmFkMjY5LCAweGQ5ZTAxMDA3LCAweDMzNjdjMDhmLCAweDA0YjU0ODI0LCAweDNmZDM5YjVhLAotCTB4MmVlM2NlYmUsIDB4MmI4ZWY3N2MsIDB4ZDgwMjRkNWEsIDB4MzFmNzk5NDcsIDB4MDMyM2VjYmUsIDB4M2ZlYzQzYzYsIDB4MmU1YTEwNmYsIDB4MmMyMTZlYWEsCi0JMHhkNjMyNmE4OSwgMHgzMDc2MWMxNywgMHgwMTkyMTU1ZiwgMHgzZmZiMTBjMSwgMHgyZGNlODhhOSwgMHgyY2IyMzI0YiwgMHhkNDcxMDg4NCwgMHgyZWUzY2ViZSwKLQkweDAwMDAwMDAwLCAweDQwMDAwMDAwLCAweDJkNDEzY2NjLCAweDJkNDEzY2NjLCAweGQyYmVjMzM0LCAweDJkNDEzY2NjLCAweGZlNmRlYWExLCAweDNmZmIxMGMxLAotCTB4MmNiMjMyNGIsIDB4MmRjZTg4YTksIDB4ZDExYzMxNDIsIDB4MmI4ZWY3N2MsIDB4ZmNkYzEzNDIsIDB4M2ZlYzQzYzYsIDB4MmMyMTZlYWEsIDB4MmU1YTEwNmYsCi0JMHhjZjg5ZTNlOSwgMHgyOWNkOTU3NywgMHhmYjRhYjdkYywgMHgzZmQzOWI1YSwgMHgyYjhlZjc3YywgMHgyZWUzY2ViZSwgMHhjZTA4NjZiOSwgMHgyN2ZkYjJhNiwKLQkweGY5YmExNjUxLCAweDNmYjExYjQ3LCAweDJhZmFkMjY5LCAweDJmNmJiZTQ0LCAweGNjOTgzZjcxLCAweDI2MWZlZmY5LCAweGY4MmE2YzZiLCAweDNmODRjOGUxLAotCTB4MmE2NTA1MjUsIDB4MmZmMWQ5YzYsIDB4Y2IzOWVkY2EsIDB4MjQzNGYzMzIsIDB4ZjY5YmY3YzksIDB4M2Y0ZWFhZmUsIDB4MjljZDk1NzcsIDB4MzA3NjFjMTcsCi0JMHhjOWVkZWI1MCwgMHgyMjNkNjZhOCwgMHhmNTBlZjVkZSwgMHgzZjBlYzlmNCwgMHgyOTM0ODkzNywgMHgzMGY4ODAxZiwgMHhjOGI0YWIzMiwgMHgyMDM5ZjkwZSwKLQkweGYzODNhM2UyLCAweDNlYzUyZjlmLCAweDI4OTllNjRhLCAweDMxNzkwMGQ2LCAweGM3OGU5YTFkLCAweDFlMmI1ZDM4LCAweGYxZmEzZWNiLCAweDNlNzFlNzU4LAotCTB4MjdmZGIyYTYsIDB4MzFmNzk5NDcsIDB4YzY3YzFlMTksIDB4MWMxMjQ5ZDgsIDB4ZjA3MzAzNDMsIDB4M2UxNGZkZjcsIDB4Mjc1ZmY0NTIsIDB4MzI3NDQ0OTMsCi0JMHhjNTdkOTY1ZSwgMHgxOWVmNzk0MywgMHhlZWVlMmQ5ZSwgMHgzZGFlODFjZSwgMHgyNmMwYjE2MiwgMHgzMmVlZmRlOSwgMHhjNDkzNWIzYywgMHgxN2MzYTkzMSwKLQkweGVkNmJmOWQyLCAweDNkM2U4MmFkLCAweDI2MWZlZmY5LCAweDMzNjdjMDhmLCAweGMzYmRiZGY3LCAweDE1OGY5YTc1LCAweGViZWNhMzZjLCAweDNjYzUxMWQ4LAotCTB4MjU3ZGI2NGIsIDB4MzNkZTg3ZGUsIDB4YzJmZDA4YWEsIDB4MTM1NDEwYzIsIDB4ZWE3MDY1OGIsIDB4M2M0MjQyMDksIDB4MjRkYTBhOTksIDB4MzQ1MzRmNDAsCi0JMHhjMjUxN2UzMiwgMHgxMTExZDI2MiwgMHhlOGY3N2FkMCwgMHgzYmI2Mjc2ZCwgMHgyNDM0ZjMzMiwgMHgzNGM2MTIzNiwgMHhjMWJiNWExMiwgMHgwZWM5YTdmMiwKLQkweGU3ODIxZDVhLCAweDNiMjBkNzllLCAweDIzOGU3NjczLCAweDM1MzZjYzUyLCAweGMxM2FkMDYxLCAweDBjN2M1YzFlLCAweGU2MTA4NmJkLCAweDNhODI2OWEyLAotCTB4MjJlNjlhYzcsIDB4MzVhNTc5M2MsIDB4YzBkMDBkYjcsIDB4MGEyYWJiNTgsIDB4ZTRhMmVmZjcsIDB4MzlkYWY1ZTgsIDB4MjIzZDY2YTgsIDB4MzYxMjE0YjAsCi0JMHhjMDdiMzcxZiwgMHgwN2Q1OTM5NSwgMHhlMzM5OTE2NywgMHgzOTJhOTY0MiwgMHgyMTkyZTA5YSwgMHgzNjdjOWE3ZCwgMHhjMDNjNmEwNywgMHgwNTdkYjQwMiwKLQkweGUxZDRhMmM4LCAweDM4NzE2NWUzLCAweDIwZTcwZjMyLCAweDM2ZTUwNjhhLCAweGMwMTNiYzNhLCAweDAzMjNlY2JlLCAweGUwNzQ1YjI1LCAweDM3YWY4MTU4LAotCTB4MjAzOWY5MGUsIDB4Mzc0YjU0Y2UsIDB4YzAwMTNiZDMsIDB4MDBjOTBlOGYsIDB4ZGYxOGYwY2UsIDB4MzZlNTA2OGEsIDB4MWY4YmE0ZGIsIDB4MzdhZjgxNTgsCi0JMHhjMDA0ZWYzZiwgMHhmZTZkZWFhMSwgMHhkZGMyOTk1OCwgMHgzNjEyMTRiMCwgMHgxZWRjMTk1MiwgMHgzODExODg0YywgMHhjMDFlZDUzNSwgMHhmYzEzNTIzMSwKLQkweGRjNzE4OThkLCAweDM1MzZjYzUyLCAweDFlMmI1ZDM4LCAweDM4NzE2NWUzLCAweGMwNGVlNGI5LCAweGY5YmExNjUxLCAweGRiMjVmNTY3LCAweDM0NTM0ZjQwLAotCTB4MWQ3OTc3NWIsIDB4MzhjZjE2NjksIDB4YzA5NTBkMWQsIDB4Zjc2MzA3OTksIDB4ZDllMDEwMDcsIDB4MzM2N2MwOGYsIDB4MWNjNjZlOTksIDB4MzkyYTk2NDIsCi0JMHhjMGYxMzYwYywgMHhmNTBlZjVkZSwgMHhkOGEwMGJhZSwgMHgzMjc0NDQ5MywgMHgxYzEyNDlkOCwgMHgzOTgzZTFlNywgMHhjMTYzM2Y4YSwgMHhmMmJlYWZlZSwKLQkweGQ3NjYxOWI2LCAweDMxNzkwMGQ2LCAweDFiNWQxMDA5LCAweDM5ZGFmNWU4LCAweGMxZWIwMjA5LCAweGYwNzMwMzQzLCAweGQ2MzI2YTg5LCAweDMwNzYxYzE3LAotCTB4MWFhNmM4MmIsIDB4M2EyZmNlZTgsIDB4YzI4ODRlNmYsIDB4ZWUyY2JiYzEsIDB4ZDUwNTJkOTcsIDB4MmY2YmJlNDQsIDB4MTllZjc5NDMsIDB4M2E4MjY5YTIsCi0JMHhjMzNhZWUyOCwgMHhlYmVjYTM2YywgMHhkM2RlOTE1NiwgMHgyZTVhMTA2ZiwgMHgxOTM3MmE2MywgMHgzYWQyYzJlNywgMHhjNDAyYTMzYywgMHhlOWIzODIyMywKLQkweGQyYmVjMzM0LCAweDJkNDEzY2NjLCAweDE4N2RlMmE2LCAweDNiMjBkNzllLCAweGM0ZGYyODYyLCAweGU3ODIxZDVhLCAweGQxYTVlZjkxLCAweDJjMjE2ZWFhLAotCTB4MTdjM2E5MzEsIDB4M2I2Y2E0YzQsIDB4YzVkMDMxMTgsIDB4ZTU1OTM3ZDUsIDB4ZDA5NDQxYmMsIDB4MmFmYWQyNjksIDB4MTcwODg1MzAsIDB4M2JiNjI3NmQsCi0JMHhjNmQ1NjliZSwgMHhlMzM5OTE2NywgMHhjZjg5ZTNlOSwgMHgyOWNkOTU3NywgMHgxNjRjN2RkZCwgMHgzYmZkNWNjNCwgMHhjN2VlNzdiNCwgMHhlMTIzZTZhZSwKLQkweGNlODZmZjJhLCAweDI4OTllNjRhLCAweDE1OGY5YTc1LCAweDNjNDI0MjA5LCAweGM5MWFmOTc2LCAweGRmMThmMGNlLCAweGNkOGJiYjZkLCAweDI3NWZmNDUyLAotCTB4MTRkMWUyNDIsIDB4M2M4NGQ0OTYsIDB4Y2E1YTg2YzQsIDB4ZGQxOTY1MzksIDB4Y2M5ODNmNzEsIDB4MjYxZmVmZjksIDB4MTQxMzVjOTQsIDB4M2NjNTExZDgsCi0JMHhjYmFjYjBjMCwgMHhkYjI1ZjU2NywgMHhjYmFjYjBjMCwgMHgyNGRhMGE5OSwgMHgxMzU0MTBjMiwgMHgzZDAyZjc1NiwgMHhjZDExMDIxNywgMHhkOTNmNGU5ZSwKLQkweGNhYzkzM2FlLCAweDIzOGU3NjczLCAweDEyOTQwNjJlLCAweDNkM2U4MmFkLCAweGNlODZmZjJhLCAweGQ3NjYxOWI2LCAweGM5ZWRlYjUwLCAweDIyM2Q2NmE4LAotCTB4MTFkMzQ0M2YsIDB4M2Q3N2IxOTEsIDB4ZDAwZTI2M2EsIDB4ZDU5YWZhZGIsIDB4YzkxYWY5NzYsIDB4MjBlNzBmMzIsIDB4MTExMWQyNjIsIDB4M2RhZTgxY2UsCi0JMHhkMWE1ZWY5MSwgMHhkM2RlOTE1NiwgMHhjODUwN2VhOCwgMHgxZjhiYTRkYiwgMHgxMDRmYjgwZSwgMHgzZGUyZjE0NywgMHhkMzRkY2RiNSwgMHhkMjMxNzc1NywKLQkweGM3OGU5YTFkLCAweDFlMmI1ZDM4LCAweDBmOGNmY2JkLCAweDNlMTRmZGY3LCAweGQ1MDUyZDk3LCAweGQwOTQ0MWJjLCAweGM2ZDU2OWJlLCAweDFjYzY2ZTk5LAotCTB4MGVjOWE3ZjIsIDB4M2U0NGE1ZWUsIDB4ZDZjYjc2YzksIDB4Y2YwNzdmZTEsIDB4YzYyNTBhMTgsIDB4MWI1ZDEwMDksIDB4MGUwNWMxMzUsIDB4M2U3MWU3NTgsCi0JMHhkOGEwMGJhZSwgMHhjZDhiYmI2ZCwgMHhjNTdkOTY1ZSwgMHgxOWVmNzk0MywgMHgwZDQxNTAxMiwgMHgzZTljYzA3NiwgMHhkYTgyNDliNSwgMHhjYzIxNzgyMiwKLQkweGM0ZGYyODYyLCAweDE4N2RlMmE2LCAweDBjN2M1YzFlLCAweDNlYzUyZjlmLCAweGRjNzE4OThkLCAweGNhYzkzM2FlLCAweGM0NDlkODkzLCAweDE3MDg4NTMwLAotCTB4MGJiNmVjZWYsIDB4M2VlYjMzNDcsIDB4ZGU2ZDFmNjYsIDB4Yzk4MzY1ODMsIDB4YzNiZGJkZjcsIDB4MTU4ZjlhNzUsIDB4MGFmMTBhMjIsIDB4M2YwZWM5ZjQsCi0JMHhlMDc0NWIyNSwgMHhjODUwN2VhOCwgMHhjMzNhZWUyOCwgMHgxNDEzNWM5NCwgMHgwYTJhYmI1OCwgMHgzZjJmZjI0OSwgMHhlMjg2ODhhNSwgMHhjNzMwZTk5NywKLQkweGMyYzE3ZDUzLCAweDEyOTQwNjJlLCAweDA5NjQwODM3LCAweDNmNGVhYWZlLCAweGU0YTJlZmY3LCAweGM2MjUwYTE4LCAweGMyNTE3ZTMyLCAweDExMTFkMjYyLAotCTB4MDg5Y2Y4NjcsIDB4M2Y2YWYyZTMsIDB4ZTZjOGQ1OWQsIDB4YzUyZDNkMTksIDB4YzFlYjAyMDksIDB4MGY4Y2ZjYmQsIDB4MDdkNTkzOTUsIDB4M2Y4NGM4ZTEsCi0JMHhlOGY3N2FkMCwgMHhjNDQ5ZDg5MywgMHhjMThlMThhOCwgMHgwZTA1YzEzNSwgMHgwNzBkZTE3MSwgMHgzZjljMmJmYSwgMHhlYjJlMWRiZSwgMHhjMzdiMmI2YSwKLQkweGMxM2FkMDYxLCAweDBjN2M1YzFlLCAweDA2NDVlOWFmLCAweDNmYjExYjQ3LCAweGVkNmJmOWQyLCAweGMyYzE3ZDUzLCAweGMwZjEzNjBjLCAweDBhZjEwYTIyLAotCTB4MDU3ZGI0MDIsIDB4M2ZjMzk1ZjksIDB4ZWZiMDQ3ZjIsIDB4YzIxZDBlYjksIDB4YzBiMTU1MDIsIDB4MDk2NDA4MzcsIDB4MDRiNTQ4MjQsIDB4M2ZkMzliNWEsCi0JMHhmMWZhM2VjYiwgMHhjMThlMThhOCwgMHhjMDdiMzcxZiwgMHgwN2Q1OTM5NSwgMHgwM2VjYWRjZiwgMHgzZmUxMmFjYiwgMHhmNDQ5MTMxMSwgMHhjMTE0Y2NiOSwKLQkweGMwNGVlNGI5LCAweDA2NDVlOWFmLCAweDAzMjNlY2JlLCAweDNmZWM0M2M2LCAweGY2OWJmN2M5LCAweGMwYjE1NTAyLCAweGMwMmM2NGE2LCAweDA0YjU0ODI0LAotCTB4MDI1YjBjYWUsIDB4M2ZmNGU1ZGYsIDB4ZjhmMjFlOGYsIDB4YzA2M2Q0MDYsIDB4YzAxM2JjM2EsIDB4MDMyM2VjYmUsIDB4MDE5MjE1NWYsIDB4M2ZmYjEwYzEsCi0JMHhmYjRhYjdkYywgMHhjMDJjNjRhNiwgMHhjMDA0ZWYzZiwgMHgwMTkyMTU1ZiwgMHgwMGM5MGU4ZiwgMHgzZmZlYzQyZCwgMHhmZGE0ZjM1MiwgMHhjMDBiMWEyMQotfTsKLQotY29uc3QgaW50IHR3aWRUYWI2NFs0KjYgKyAxNio2XSA9IHsKLQkweDQwMDAwMDAwLCAweDAwMDAwMDAwLCAweDQwMDAwMDAwLCAweDAwMDAwMDAwLCAweDQwMDAwMDAwLCAweDAwMDAwMDAwLCAweDJkNDEzY2NjLCAweDJkNDEzY2NjLAotCTB4M2IyMGQ3OWUsIDB4MTg3ZGUyYTYsIDB4MTg3ZGUyYTYsIDB4M2IyMGQ3OWUsIDB4MDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4MmQ0MTNjY2MsIDB4MmQ0MTNjY2MsCi0JMHhkMmJlYzMzNCwgMHgyZDQxM2NjYywgMHhkMmJlYzMzNCwgMHgyZDQxM2NjYywgMHgxODdkZTJhNiwgMHgzYjIwZDc5ZSwgMHhjNGRmMjg2MiwgMHhlNzgyMWQ1YSwKLQotCTB4NDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4M2VjNTJmOWYsIDB4MGM3YzVjMWUsCi0JMHgzZmIxMWI0NywgMHgwNjQ1ZTlhZiwgMHgzZDNlODJhZCwgMHgxMjk0MDYyZSwgMHgzYjIwZDc5ZSwgMHgxODdkZTJhNiwgMHgzZWM1MmY5ZiwgMHgwYzdjNWMxZSwKLQkweDM1MzZjYzUyLCAweDIzOGU3NjczLCAweDM1MzZjYzUyLCAweDIzOGU3NjczLCAweDNkM2U4MmFkLCAweDEyOTQwNjJlLCAweDI4OTllNjRhLCAweDMxNzkwMGQ2LAotCTB4MmQ0MTNjY2MsIDB4MmQ0MTNjY2MsIDB4M2IyMGQ3OWUsIDB4MTg3ZGUyYTYsIDB4MTg3ZGUyYTYsIDB4M2IyMGQ3OWUsIDB4MjM4ZTc2NzMsIDB4MzUzNmNjNTIsCi0JMHgzODcxNjVlMywgMHgxZTJiNWQzOCwgMHgwNjQ1ZTlhZiwgMHgzZmIxMWI0NywgMHgxODdkZTJhNiwgMHgzYjIwZDc5ZSwgMHgzNTM2Y2M1MiwgMHgyMzhlNzY3MywKLQkweGYzODNhM2UyLCAweDNlYzUyZjlmLCAweDBjN2M1YzFlLCAweDNlYzUyZjlmLCAweDMxNzkwMGQ2LCAweDI4OTllNjRhLCAweGUxZDRhMmM4LCAweDM4NzE2NWUzLAotCTB4MDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4MmQ0MTNjY2MsIDB4MmQ0MTNjY2MsIDB4ZDJiZWMzMzQsIDB4MmQ0MTNjY2MsIDB4ZjM4M2EzZTIsIDB4M2VjNTJmOWYsCi0JMHgyODk5ZTY0YSwgMHgzMTc5MDBkNiwgMHhjNzhlOWExZCwgMHgxZTJiNWQzOCwgMHhlNzgyMWQ1YSwgMHgzYjIwZDc5ZSwgMHgyMzhlNzY3MywgMHgzNTM2Y2M1MiwKLQkweGMxM2FkMDYxLCAweDBjN2M1YzFlLCAweGRjNzE4OThkLCAweDM1MzZjYzUyLCAweDFlMmI1ZDM4LCAweDM4NzE2NWUzLCAweGMwNGVlNGI5LCAweGY5YmExNjUxLAotCTB4ZDJiZWMzMzQsIDB4MmQ0MTNjY2MsIDB4MTg3ZGUyYTYsIDB4M2IyMGQ3OWUsIDB4YzRkZjI4NjIsIDB4ZTc4MjFkNWEsIDB4Y2FjOTMzYWUsIDB4MjM4ZTc2NzMsCi0JMHgxMjk0MDYyZSwgMHgzZDNlODJhZCwgMHhjZTg2ZmYyYSwgMHhkNzY2MTliNiwgMHhjNGRmMjg2MiwgMHgxODdkZTJhNiwgMHgwYzdjNWMxZSwgMHgzZWM1MmY5ZiwKLQkweGRjNzE4OThkLCAweGNhYzkzM2FlLCAweGMxM2FkMDYxLCAweDBjN2M1YzFlLCAweDA2NDVlOWFmLCAweDNmYjExYjQ3LCAweGVkNmJmOWQyLCAweGMyYzE3ZDUzCi19OwotI2VuZGlmICAvL0FSTVY1RQotCi1jb25zdCBpbnQgU2hvcnRXaW5kb3dTaW5lW0ZSQU1FX0xFTl9TSE9SVC8yXSA9ewotCTB4MDBjOTdmZmYsIDB4MDI1YjdmZmEsIDB4MDNlZDdmZjEsIDB4MDU3ZjdmZTIsIDB4MDcxMTdmY2UsIDB4MDhhMjdmYjUsIDB4MGEzMzdmOTgsIDB4MGJjNDdmNzUsCi0JMHgwZDU0N2Y0ZSwgMHgwZWU0N2YyMiwgMHgxMDczN2VmMCwgMHgxMjAxN2ViYSwgMHgxMzhmN2U3ZiwgMHgxNTFjN2UzZiwgMHgxNmE4N2RmYiwgMHgxODMzN2RiMSwKLQkweDE5YmU3ZDYzLCAweDFiNDc3ZDBmLCAweDFjZDA3Y2I3LCAweDFlNTc3YzVhLCAweDFmZGQ3YmY5LCAweDIxNjI3YjkyLCAweDIyZTU3YjI3LCAweDI0Njc3YWI3LAotCTB4MjVlODdhNDIsIDB4Mjc2ODc5YzksIDB4MjhlNTc5NGEsIDB4MmE2Mjc4YzgsIDB4MmJkYzc4NDAsIDB4MmQ1NTc3YjQsIDB4MmVjYzc3MjMsIDB4MzA0Mjc2OGUsCi0JMHgzMWI1NzVmNCwgMHgzMzI3NzU1NiwgMHgzNDk3NzRiMywgMHgzNjA0NzQwYiwgMHgzNzcwNzM1ZiwgMHgzOGQ5NzJhZiwgMHgzYTQwNzFmYSwgMHgzYmE1NzE0MSwKLQkweDNkMDg3MDgzLCAweDNlNjg2ZmMyLCAweDNmYzY2ZWZiLCAweDQxMjE2ZTMxLCAweDQyN2E2ZDYyLCAweDQzZDE2YzhmLCAweDQ1MjQ2YmI4LCAweDQ2NzU2YWRkLAotCTB4NDdjNDY5ZmQsIDB4NDkwZjY5MWEsIDB4NGE1ODY4MzIsIDB4NGI5ZTY3NDcsIDB4NGNlMTY2NTcsIDB4NGUyMTY1NjQsIDB4NGY1ZTY0NmMsIDB4NTA5ODYzNzEsCi0JMHg1MWNmNjI3MiwgMHg1MzAzNjE2ZiwgMHg1NDMzNjA2OCwgMHg1NTYwNWY1ZSwgMHg1NjhhNWU1MCwgMHg1N2IxNWQzZSwgMHg1OGQ0NWMyOSwgMHg1OWY0NWIxMAotfTsKLQotY29uc3QgaW50IExvbmdXaW5kb3dLQkRbRlJBTUVfTEVOX0xPTkcvMl09ewotCTB4MDAwYTdmZmYsIDB4MDAwZTdmZmYsIDB4MDAxMjdmZmYsIDB4MDAxNTdmZmYsIDB4MDAxOTdmZmYsIDB4MDAxYzdmZmYsIDB4MDAyMDdmZmYsIDB4MDAyMzdmZmYsCi0JMHgwMDI2N2ZmZiwgMHgwMDJhN2ZmZiwgMHgwMDJkN2ZmZiwgMHgwMDMwN2ZmZiwgMHgwMDM0N2ZmZiwgMHgwMDM4N2ZmZiwgMHgwMDNiN2ZmZiwgMHgwMDNmN2ZmZiwKLQkweDAwNDM3ZmZmLCAweDAwNDc3ZmZmLCAweDAwNGI3ZmZmLCAweDAwNGY3ZmZmLCAweDAwNTM3ZmZmLCAweDAwNTc3ZmZmLCAweDAwNWI3ZmZmLCAweDAwNjA3ZmZmLAotCTB4MDA2NDdmZmYsIDB4MDA2OTdmZmYsIDB4MDA2ZDdmZmYsIDB4MDA3MjdmZmYsIDB4MDA3NzdmZmYsIDB4MDA3YzdmZmYsIDB4MDA4MTdmZmYsIDB4MDA4NjdmZmYsCi0JMHgwMDhiN2ZmZiwgMHgwMDkxN2ZmZiwgMHgwMDk2N2ZmZiwgMHgwMDljN2ZmZiwgMHgwMGExN2ZmZiwgMHgwMGE3N2ZmZiwgMHgwMGFkN2ZmZiwgMHgwMGIzN2ZmZiwKLQkweDAwYjk3ZmZmLCAweDAwYmY3ZmZmLCAweDAwYzY3ZmZmLCAweDAwY2M3ZmZmLCAweDAwZDM3ZmZmLCAweDAwZGE3ZmZmLCAweDAwZTA3ZmZmLCAweDAwZTc3ZmZmLAotCTB4MDBlZTdmZmYsIDB4MDBmNTdmZmYsIDB4MDBmZDdmZmYsIDB4MDEwNDdmZmYsIDB4MDEwYzdmZmYsIDB4MDExMzdmZmYsIDB4MDExYjdmZmYsIDB4MDEyMzdmZmYsCi0JMHgwMTJiN2ZmZiwgMHgwMTMzN2ZmZiwgMHgwMTNjN2ZmZSwgMHgwMTQ0N2ZmZSwgMHgwMTRkN2ZmZSwgMHgwMTU2N2ZmZSwgMHgwMTVmN2ZmZSwgMHgwMTY4N2ZmZSwKLQkweDAxNzE3ZmZlLCAweDAxN2E3ZmZlLCAweDAxODM3ZmZlLCAweDAxOGQ3ZmZlLCAweDAxOTc3ZmZkLCAweDAxYTE3ZmZkLCAweDAxYWI3ZmZkLCAweDAxYjU3ZmZkLAotCTB4MDFiZjdmZmQsIDB4MDFjYTdmZmQsIDB4MDFkNDdmZmQsIDB4MDFkZjdmZmMsIDB4MDFlYTdmZmMsIDB4MDFmNTdmZmMsIDB4MDIwMDdmZmMsIDB4MDIwYzdmZmMsCi0JMHgwMjE3N2ZmYywgMHgwMjIzN2ZmYiwgMHgwMjJmN2ZmYiwgMHgwMjNiN2ZmYiwgMHgwMjQ3N2ZmYiwgMHgwMjUzN2ZmYiwgMHgwMjYwN2ZmYSwgMHgwMjZkN2ZmYSwKLQkweDAyN2E3ZmZhLCAweDAyODc3ZmZhLCAweDAyOTQ3ZmY5LCAweDAyYTE3ZmY5LCAweDAyYWY3ZmY5LCAweDAyYmM3ZmY5LCAweDAyY2E3ZmY4LCAweDAyZDg3ZmY4LAotCTB4MDJlNzdmZjgsIDB4MDJmNTdmZjcsIDB4MDMwNDdmZjcsIDB4MDMxMjdmZjcsIDB4MDMyMTdmZjYsIDB4MDMzMTdmZjYsIDB4MDM0MDdmZjUsIDB4MDM0ZjdmZjUsCi0JMHgwMzVmN2ZmNSwgMHgwMzZmN2ZmNCwgMHgwMzdmN2ZmNCwgMHgwMzhmN2ZmMywgMHgwM2EwN2ZmMywgMHgwM2IwN2ZmMiwgMHgwM2MxN2ZmMiwgMHgwM2QyN2ZmMSwKLQkweDAzZTM3ZmYxLCAweDAzZjU3ZmYwLCAweDA0MDY3ZmYwLCAweDA0MTg3ZmVmLCAweDA0MmE3ZmVmLCAweDA0M2M3ZmVlLCAweDA0NGY3ZmVkLCAweDA0NjE3ZmVkLAotCTB4MDQ3NDdmZWMsIDB4MDQ4NzdmZWIsIDB4MDQ5YTdmZWIsIDB4MDRhZTdmZWEsIDB4MDRjMTdmZTksIDB4MDRkNTdmZTksIDB4MDRlOTdmZTgsIDB4MDRmZDdmZTcsCi0JMHgwNTEyN2ZlNiwgMHgwNTI3N2ZlNSwgMHgwNTNiN2ZlNSwgMHgwNTUwN2ZlNCwgMHgwNTY2N2ZlMywgMHgwNTdiN2ZlMiwgMHgwNTkxN2ZlMSwgMHgwNWE3N2ZlMCwKLQkweDA1YmQ3ZmRmLCAweDA1ZDM3ZmRlLCAweDA1ZWE3ZmRkLCAweDA2MDE3ZmRjLCAweDA2MTg3ZmRiLCAweDA2MmY3ZmRhLCAweDA2NDY3ZmQ5LCAweDA2NWU3ZmQ3LAotCTB4MDY3NjdmZDYsIDB4MDY4ZTdmZDUsIDB4MDZhNjdmZDQsIDB4MDZiZjdmZDIsIDB4MDZkODdmZDEsIDB4MDZmMTdmZDAsIDB4MDcwYTdmY2UsIDB4MDcyMzdmY2QsCi0JMHgwNzNkN2ZjYywgMHgwNzU3N2ZjYSwgMHgwNzcxN2ZjOSwgMHgwNzhjN2ZjNywgMHgwN2E2N2ZjNSwgMHgwN2MxN2ZjNCwgMHgwN2RjN2ZjMiwgMHgwN2Y3N2ZjMCwKLQkweDA4MTM3ZmJmLCAweDA4MmY3ZmJkLCAweDA4NGI3ZmJiLCAweDA4Njc3ZmI5LCAweDA4ODQ3ZmI3LCAweDA4YTA3ZmI2LCAweDA4YmQ3ZmI0LCAweDA4ZGE3ZmIyLAotCTB4MDhmODdmYWYsIDB4MDkxNjdmYWQsIDB4MDkzNDdmYWIsIDB4MDk1MjdmYTksIDB4MDk3MDdmYTcsIDB4MDk4ZjdmYTUsIDB4MDlhZTdmYTIsIDB4MDljZDdmYTAsCi0JMHgwOWVjN2Y5ZCwgMHgwYTBjN2Y5YiwgMHgwYTJjN2Y5OCwgMHgwYTRjN2Y5NiwgMHgwYTZjN2Y5MywgMHgwYThkN2Y5MSwgMHgwYWFlN2Y4ZSwgMHgwYWNmN2Y4YiwKLQkweDBhZjA3Zjg4LCAweDBiMTI3Zjg1LCAweDBiMzM3ZjgyLCAweDBiNTU3ZjdmLCAweDBiNzg3ZjdjLCAweDBiOWE3Zjc5LCAweDBiYmQ3Zjc2LCAweDBiZTA3ZjczLAotCTB4MGMwNDdmNmYsIDB4MGMyNzdmNmMsIDB4MGM0YjdmNjksIDB4MGM2ZjdmNjUsIDB4MGM5MzdmNjEsIDB4MGNiODdmNWUsIDB4MGNkZDdmNWEsIDB4MGQwMjdmNTYsCi0JMHgwZDI3N2Y1MywgMHgwZDRkN2Y0ZiwgMHgwZDczN2Y0YiwgMHgwZDk5N2Y0NywgMHgwZGJmN2Y0MywgMHgwZGU2N2YzZSwgMHgwZTBjN2YzYSwgMHgwZTM0N2YzNiwKLQkweDBlNWI3ZjMxLCAweDBlODM3ZjJkLCAweDBlYWE3ZjI4LCAweDBlZDM3ZjI0LCAweDBlZmI3ZjFmLCAweDBmMjM3ZjFhLCAweDBmNGM3ZjE1LCAweDBmNzU3ZjEwLAotCTB4MGY5ZjdmMGIsIDB4MGZjODdmMDYsIDB4MGZmMjdmMDEsIDB4MTAxYzdlZmIsIDB4MTA0NzdlZjYsIDB4MTA3MTdlZjAsIDB4MTA5YzdlZWIsIDB4MTBjODdlZTUsCi0JMHgxMGYzN2VkZiwgMHgxMTFmN2VkYSwgMHgxMTRhN2VkNCwgMHgxMTc3N2VjZSwgMHgxMWEzN2VjNywgMHgxMWQwN2VjMSwgMHgxMWZkN2ViYiwgMHgxMjJhN2ViNCwKLQkweDEyNTc3ZWFlLCAweDEyODU3ZWE3LCAweDEyYjM3ZWEwLCAweDEyZTE3ZTlhLCAweDEzMGY3ZTkzLCAweDEzM2U3ZThjLCAweDEzNmQ3ZTg0LCAweDEzOWM3ZTdkLAotCTB4MTNjYzdlNzYsIDB4MTNmYjdlNmUsIDB4MTQyYjdlNjcsIDB4MTQ1YjdlNWYsIDB4MTQ4YzdlNTcsIDB4MTRiYzdlNGYsIDB4MTRlZDdlNDcsIDB4MTUxZTdlM2YsCi0JMHgxNTUwN2UzNywgMHgxNTgxN2UyZSwgMHgxNWIzN2UyNiwgMHgxNWU1N2UxZCwgMHgxNjE4N2UxNCwgMHgxNjRhN2UwYiwgMHgxNjdkN2UwMiwgMHgxNmIwN2RmOSwKLQkweDE2ZTQ3ZGYwLCAweDE3MTc3ZGU2LCAweDE3NGI3ZGRkLCAweDE3N2Y3ZGQzLCAweDE3YjM3ZGM5LCAweDE3ZTg3ZGJmLCAweDE4MWQ3ZGI1LCAweDE4NTI3ZGFiLAotCTB4MTg4NzdkYTEsIDB4MThiYzdkOTYsIDB4MThmMjdkOGMsIDB4MTkyODdkODEsIDB4MTk1ZTdkNzYsIDB4MTk5NTdkNmIsIDB4MTljYjdkNjAsIDB4MWEwMjdkNTQsCi0JMHgxYTM5N2Q0OSwgMHgxYTcxN2QzZCwgMHgxYWE4N2QzMSwgMHgxYWUwN2QyNiwgMHgxYjE4N2QxOSwgMHgxYjUwN2QwZCwgMHgxYjg5N2QwMSwgMHgxYmMyN2NmNCwKLQkweDFiZmI3Y2U4LCAweDFjMzQ3Y2RiLCAweDFjNmQ3Y2NlLCAweDFjYTc3Y2MxLCAweDFjZTE3Y2IzLCAweDFkMWI3Y2E2LCAweDFkNTU3Yzk4LCAweDFkOGY3YzhhLAotCTB4MWRjYTdjN2MsIDB4MWUwNTdjNmUsIDB4MWU0MDdjNjAsIDB4MWU3YjdjNTEsIDB4MWViNzdjNDMsIDB4MWVmMzdjMzQsIDB4MWYyZjdjMjUsIDB4MWY2YjdjMTYsCi0JMHgxZmE3N2MwNiwgMHgxZmU0N2JmNywgMHgyMDIxN2JlNywgMHgyMDVlN2JkNywgMHgyMDliN2JjNywgMHgyMGQ4N2JiNywgMHgyMTE2N2JhNiwgMHgyMTU0N2I5NiwKLQkweDIxOTI3Yjg1LCAweDIxZDA3Yjc0LCAweDIyMGU3YjYzLCAweDIyNGQ3YjUyLCAweDIyOGM3YjQwLCAweDIyY2I3YjJlLCAweDIzMGE3YjFjLCAweDIzNDk3YjBhLAotCTB4MjM4OTdhZjgsIDB4MjNjODdhZTYsIDB4MjQwODdhZDMsIDB4MjQ0ODdhYzAsIDB4MjQ4OTdhYWQsIDB4MjRjOTdhOWEsIDB4MjUwYTdhODYsIDB4MjU0YjdhNzMsCi0JMHgyNThjN2E1ZiwgMHgyNWNkN2E0YiwgMHgyNjBlN2EzNiwgMHgyNjUwN2EyMiwgMHgyNjkxN2EwZCwgMHgyNmQzNzlmOCwgMHgyNzE1NzllMywgMHgyNzU3NzljZSwKLQkweDI3OWE3OWI4LCAweDI3ZGM3OWEzLCAweDI4MWY3OThkLCAweDI4NjI3OTc3LCAweDI4YTU3OTYwLCAweDI4ZTg3OTRhLCAweDI5MmI3OTMzLCAweDI5NmY3OTFjLAotCTB4MjliMjc5MDUsIDB4MjlmNjc4ZWQsIDB4MmEzYTc4ZDYsIDB4MmE3ZTc4YmUsIDB4MmFjMjc4YTYsIDB4MmIwNzc4OGQsIDB4MmI0Yjc4NzUsIDB4MmI5MDc4NWMsCi0JMHgyYmQ0Nzg0MywgMHgyYzE5NzgyYSwgMHgyYzVlNzgxMCwgMHgyY2E0NzdmNywgMHgyY2U5NzdkZCwgMHgyZDJlNzdjMywgMHgyZDc0NzdhOCwgMHgyZGJhNzc4ZSwKLQkweDJkZmY3NzczLCAweDJlNDU3NzU4LCAweDJlOGI3NzNkLCAweDJlZDI3NzIxLCAweDJmMTg3NzA2LCAweDJmNWU3NmVhLCAweDJmYTU3NmNkLCAweDJmZWM3NmIxLAotCTB4MzAzMjc2OTQsIDB4MzA3OTc2NzcsIDB4MzBjMDc2NWEsIDB4MzEwNzc2M2QsIDB4MzE0ZTc2MWYsIDB4MzE5Njc2MDEsIDB4MzFkZDc1ZTMsIDB4MzIyNTc1YzUsCi0JMHgzMjZjNzVhNiwgMHgzMmI0NzU4OCwgMHgzMmZjNzU2OSwgMHgzMzQ0NzU0OSwgMHgzMzhjNzUyYSwgMHgzM2Q0NzUwYSwgMHgzNDFjNzRlYSwgMHgzNDY0NzRjYSwKLQkweDM0YWM3NGE5LCAweDM0ZjU3NDg4LCAweDM1M2Q3NDY3LCAweDM1ODU3NDQ2LCAweDM1Y2U3NDI0LCAweDM2MTc3NDAzLCAweDM2NWY3M2UxLCAweDM2YTg3M2JlLAotCTB4MzZmMTczOWMsIDB4MzczYTczNzksIDB4Mzc4MzczNTYsIDB4MzdjYzczMzMsIDB4MzgxNTczMGYsIDB4Mzg1ZTcyZWMsIDB4MzhhNzcyYzgsIDB4MzhmMTcyYTMsCi0JMHgzOTNhNzI3ZiwgMHgzOTgzNzI1YSwgMHgzOWNkNzIzNSwgMHgzYTE2NzIxMCwgMHgzYTYwNzFlYSwgMHgzYWE5NzFjNCwgMHgzYWYzNzE5ZSwgMHgzYjNjNzE3OCwKLQkweDNiODY3MTUxLCAweDNiZDA3MTJiLCAweDNjMTk3MTA0LCAweDNjNjM3MGRjLCAweDNjYWQ3MGI1LCAweDNjZjc3MDhkLCAweDNkNDA3MDY1LCAweDNkOGE3MDNjLAotCTB4M2RkNDcwMTQsIDB4M2UxZTZmZWIsIDB4M2U2ODZmYzIsIDB4M2ViMTZmOTgsIDB4M2VmYjZmNmYsIDB4M2Y0NTZmNDUsIDB4M2Y4ZjZmMWIsIDB4M2ZkOTZlZjAsCi0JMHg0MDIzNmVjNiwgMHg0MDZkNmU5YiwgMHg0MGI2NmU3MCwgMHg0MTAwNmU0NCwgMHg0MTRhNmUxOSwgMHg0MTk0NmRlZCwgMHg0MWRlNmRjMSwgMHg0MjI4NmQ5NCwKLQkweDQyNzE2ZDY4LCAweDQyYmI2ZDNiLCAweDQzMDU2ZDBkLCAweDQzNGY2Y2UwLCAweDQzOTg2Y2IyLCAweDQzZTI2Yzg0LCAweDQ0MmM2YzU2LCAweDQ0NzU2YzI4LAotCTB4NDRiZjZiZjksIDB4NDUwODZiY2EsIDB4NDU1MjZiOWIsIDB4NDU5YjZiNmIsIDB4NDVlNTZiM2MsIDB4NDYyZTZiMGMsIDB4NDY3ODZhZGIsIDB4NDZjMTZhYWIsCi0JMHg0NzBhNmE3YSwgMHg0NzUzNmE0OSwgMHg0NzljNmExOCwgMHg0N2U1NjllNywgMHg0ODJlNjliNSwgMHg0ODc3Njk4MywgMHg0OGMwNjk1MSwgMHg0OTA5NjkxZSwKLQkweDQ5NTI2OGVjLCAweDQ5OWI2OGI5LCAweDQ5ZTM2ODg1LCAweDRhMmM2ODUyLCAweDRhNzQ2ODFlLCAweDRhYmQ2N2VhLCAweDRiMDU2N2I2LCAweDRiNGQ2NzgyLAotCTB4NGI5NTY3NGQsIDB4NGJkZTY3MTgsIDB4NGMyNjY2ZTMsIDB4NGM2ZDY2YWUsIDB4NGNiNTY2NzgsIDB4NGNmZDY2NDIsIDB4NGQ0NTY2MGMsIDB4NGQ4YzY1ZDYsCi0JMHg0ZGQ0NjU5ZiwgMHg0ZTFiNjU2OCwgMHg0ZTYyNjUzMSwgMHg0ZWE5NjRmYSwgMHg0ZWYwNjRjMywgMHg0ZjM3NjQ4YiwgMHg0ZjdlNjQ1MywgMHg0ZmM1NjQxYiwKLQkweDUwMGI2M2UyLCAweDUwNTI2M2FhLCAweDUwOTg2MzcxLCAweDUwZGY2MzM4LCAweDUxMjU2MmZlLCAweDUxNmI2MmM1LCAweDUxYjE2MjhiLCAweDUxZjY2MjUxLAotCTB4NTIzYzYyMTcsIDB4NTI4MTYxZGMsIDB4NTJjNzYxYTIsIDB4NTMwYzYxNjcsIDB4NTM1MTYxMmMsIDB4NTM5NjYwZjEsIDB4NTNkYjYwYjUsIDB4NTQyMDYwNzksCi0JMHg1NDY0NjAzZCwgMHg1NGE5NjAwMSwgMHg1NGVkNWZjNSwgMHg1NTMxNWY4OCwgMHg1NTc1NWY0YiwgMHg1NWI5NWYwZSwgMHg1NWZjNWVkMSwgMHg1NjQwNWU5NCwKLQkweDU2ODM1ZTU2LCAweDU2Yzc1ZTE4LCAweDU3MGE1ZGRhLCAweDU3NGQ1ZDljLCAweDU3OGY1ZDVlLCAweDU3ZDI1ZDFmLCAweDU4MTQ1Y2UwLCAweDU4NTY1Y2ExLAotCTB4NTg5OTVjNjIsIDB4NThkYTVjMjMsIDB4NTkxYzViZTMsIDB4NTk1ZTViYTQsIDB4NTk5ZjViNjQsIDB4NTllMDViMjQsIDB4NWEyMTVhZTMsIDB4NWE2MjVhYTMKLX07Ci0KLQotLyoKLSAgZm9ybSBmYWN0b3IKLSovCi0vKiBzcXJ0KCgoaSsoMTw8KEZGX1NRUlRfQklUUy0yKSswLjUpLzJeMzEpICovCi1jb25zdCBXb3JkMzIgZm9ybWZhY19zcXJ0dGFibGVbOTZdID0gewotICAweDAwMDQwN2Y4LCAweDAwMDQxN2I5LCAweDAwMDQyNzNmLCAweDAwMDQzNjhjLCAweDAwMDQ0NWExLCAweDAwMDQ1NDgzLCAweDAwMDQ2MzMyLCAweDAwMDQ3MWIwLAotICAweDAwMDQ4MDAwLCAweDAwMDQ4ZTIyLCAweDAwMDQ5YzFhLCAweDAwMDRhOWU3LCAweDAwMDRiNzhjLCAweDAwMDRjNTBhLCAweDAwMDRkMjYzLCAweDAwMDRkZjk2LAotICAweDAwMDRlY2E3LCAweDAwMDRmOTk1LCAweDAwMDUwNjYyLCAweDAwMDUxMzBlLCAweDAwMDUxZjljLCAweDAwMDUyYzBhLCAweDAwMDUzODViLCAweDAwMDU0NDkwLAotICAweDAwMDU1MGE4LCAweDAwMDU1Y2E1LCAweDAwMDU2ODg4LCAweDAwMDU3NDUwLCAweDAwMDU4MDAwLCAweDAwMDU4Yjk2LCAweDAwMDU5NzE1LCAweDAwMDVhMjdjLAotICAweDAwMDVhZGNjLCAweDAwMDViOTA2LCAweDAwMDVjNDJiLCAweDAwMDVjZjM5LCAweDAwMDVkYTMzLCAweDAwMDVlNTE5LCAweDAwMDVlZmVhLCAweDAwMDVmYWE4LAotICAweDAwMDYwNTUyLCAweDAwMDYwZmVhLCAweDAwMDYxYTcwLCAweDAwMDYyNGUzLCAweDAwMDYyZjQ1LCAweDAwMDYzOTk2LCAweDAwMDY0M2Q1LCAweDAwMDY0ZTA0LAotICAweDAwMDY1ODIzLCAweDAwMDY2MjMxLCAweDAwMDY2YzMwLCAweDAwMDY3NjFmLCAweDAwMDY4MDAwLCAweDAwMDY4OWQxLCAweDAwMDY5MzkzLCAweDAwMDY5ZDQ3LAotICAweDAwMDZhNmVkLCAweDAwMDZiMDg1LCAweDAwMDZiYTEwLCAweDAwMDZjMzhkLCAweDAwMDZjY2ZjLCAweDAwMDZkNjVmLCAweDAwMDZkZmI1LCAweDAwMDZlOGZlLAotICAweDAwMDZmMjNiLCAweDAwMDZmYjZjLCAweDAwMDcwNDkwLCAweDAwMDcwZGE5LCAweDAwMDcxNmI2LCAweDAwMDcxZmI4LCAweDAwMDcyOGFlLCAweDAwMDczMTk5LAotICAweDAwMDczYTc5LCAweDAwMDc0MzRlLCAweDAwMDc0YzE5LCAweDAwMDc1NGQ5LCAweDAwMDc1ZDhlLCAweDAwMDc2NjNhLCAweDAwMDc2ZWRiLCAweDAwMDc3NzcyLAotICAweDAwMDc4MDAwLCAweDAwMDc4ODgzLCAweDAwMDc5MGZkLCAweDAwMDc5OTZlLCAweDAwMDdhMWQ1LCAweDAwMDdhYTMzLCAweDAwMDdiMjg4LCAweDAwMDdiYWQ0LAotICAweDAwMDdjMzE4LCAweDAwMDdjYjUyLCAweDAwMDdkMzg0LCAweDAwMDdkYmFkLCAweDAwMDdlM2NlLCAweDAwMDdlYmU2LCAweDAwMDdmM2Y2LCAweDAwMDdmYmZlCi19OwotCi0KLQotLyohCi0gIFxuYW1lICAgIHF1YW50aXplciBhbmQgaW52ZXJzZSBxdWFudGl6ZXIgdGFibGVzCi0KLSAgXGJyaWVmICAgdGhlc2UgdGFibGVzIGFyZSB1c2VkIGZvciB0aGUgbm9uCi0gICAgICAgICAgIGxpbmVhciBxdWFudGl6ZXIgYW5kIGludmVyc2UgcXVhbnRpemVyCi0KLSovCi1jb25zdCBXb3JkMzIgbVRhYl8zXzRbNTEyXSA9IHsKLQkweDRjMWJmODI5LCAweDRjMzg4MGRlLCAweDRjNTUwNjAzLCAweDRjNzE4NzljLAotCTB4NGM4ZTA1YWEsIDB4NGNhYTgwMzAsIDB4NGNjNmY3MmYsIDB4NGNlMzZhYWIsCi0JMHg0Y2ZmZGFhNCwgMHg0ZDFjNDcxZCwgMHg0ZDM4YjAxOSwgMHg0ZDU1MTU5YSwKLQkweDRkNzE3N2ExLCAweDRkOGRkNjMxLCAweDRkYWEzMTRiLCAweDRkYzY4OGYzLAotCTB4NGRlMmRkMmEsIDB4NGRmZjJkZjIsIDB4NGUxYjdiNGQsIDB4NGUzN2M1M2QsCi0JMHg0ZTU0MGJjNSwgMHg0ZTcwNGVlNiwgMHg0ZThjOGVhMywgMHg0ZWE4Y2FmZCwKLQkweDRlYzUwM2Y3LCAweDRlZTEzOTkyLCAweDRlZmQ2YmQwLCAweDRmMTk5YWI0LAotCTB4NGYzNWM2NDAsIDB4NGY1MWVlNzUsIDB4NGY2ZTEzNTYsIDB4NGY4YTM0ZTQsCi0JMHg0ZmE2NTMyMSwgMHg0ZmMyNmUxMCwgMHg0ZmRlODViMiwgMHg0ZmZhOWEwYSwKLQkweDUwMTZhYjE4LCAweDUwMzJiOGUwLCAweDUwNGVjMzYyLCAweDUwNmFjYWExLAotCTB4NTA4NmNlYTAsIDB4NTBhMmNmNWUsIDB4NTBiZWNjZTAsIDB4NTBkYWM3MjUsCi0JMHg1MGY2YmUzMSwgMHg1MTEyYjIwNSwgMHg1MTJlYTJhMywgMHg1MTRhOTAwZCwKLQkweDUxNjY3YTQ1LCAweDUxODI2MTRjLCAweDUxOWU0NTI0LCAweDUxYmEyNWNmLAotCTB4NTFkNjAzNTAsIDB4NTFmMWRkYTcsIDB4NTIwZGI0ZDYsIDB4NTIyOTg4ZTAsCi0JMHg1MjQ1NTljNiwgMHg1MjYxMjc4OSwgMHg1MjdjZjIyZCwgMHg1Mjk4YjliMSwKLQkweDUyYjQ3ZTE5LCAweDUyZDAzZjY1LCAweDUyZWJmZDk4LCAweDUzMDdiOGI0LAotCTB4NTMyMzcwYjksIDB4NTMzZjI1YWEsIDB4NTM1YWQ3ODksIDB4NTM3Njg2NTYsCi0JMHg1MzkyMzIxNSwgMHg1M2FkZGFjNiwgMHg1M2M5ODA2YiwgMHg1M2U1MjMwNiwKLQkweDU0MDBjMjk4LCAweDU0MWM1ZjI0LCAweDU0MzdmOGFiLCAweDU0NTM4ZjJlLAotCTB4NTQ2ZjIyYWYsIDB4NTQ4YWIzMzAsIDB4NTRhNjQwYjMsIDB4NTRjMWNiMzgsCi0JMHg1NGRkNTJjMiwgMHg1NGY4ZDc1MywgMHg1NTE0NThlYiwgMHg1NTJmZDc4ZCwKLQkweDU1NGI1MzM5LCAweDU1NjZjYmYzLCAweDU1ODI0MWJiLCAweDU1OWRiNDkyLAotCTB4NTViOTI0N2IsIDB4NTVkNDkxNzcsIDB4NTVlZmZiODcsIDB4NTYwYjYyYWQsCi0JMHg1NjI2YzZlYiwgMHg1NjQyMjg0MiwgMHg1NjVkODZiNCwgMHg1Njc4ZTI0MiwKLQkweDU2OTQzYWVlLCAweDU2YWY5MGI5LCAweDU2Y2FlM2E0LCAweDU2ZTYzM2IyLAotCTB4NTcwMTgwZTQsIDB4NTcxY2NiM2IsIDB4NTczODEyYjgsIDB4NTc1MzU3NWUsCi0JMHg1NzZlOTkyZSwgMHg1Nzg5ZDgyOSwgMHg1N2E1MTQ1MCwgMHg1N2MwNGRhNiwKLQkweDU3ZGI4NDJiLCAweDU3ZjZiN2UxLCAweDU4MTFlOGM5LCAweDU4MmQxNmU2LAotCTB4NTg0ODQyMzgsIDB4NTg2MzZhYzAsIDB4NTg3ZTkwODEsIDB4NTg5OWIzN2MsCi0JMHg1OGI0ZDNiMSwgMHg1OGNmZjEyMywgMHg1OGViMGJkMywgMHg1OTA2MjNjMiwKLQkweDU5MjEzOGYyLCAweDU5M2M0YjYzLCAweDU5NTc1YjE5LCAweDU5NzI2ODEyLAotCTB4NTk4ZDcyNTMsIDB4NTlhODc5ZGEsIDB4NTljMzdlYWIsIDB4NTlkZTgwYzYsCi0JMHg1OWY5ODAyZCwgMHg1YTE0N2NlMCwgMHg1YTJmNzZlMiwgMHg1YTRhNmUzNCwKLQkweDVhNjU2MmQ2LCAweDVhODA1NGNiLCAweDVhOWI0NDE0LCAweDVhYjYzMGIyLAotCTB4NWFkMTFhYTYsIDB4NWFlYzAxZjEsIDB4NWIwNmU2OTYsIDB4NWIyMWM4OTUsCi0JMHg1YjNjYTdlZiwgMHg1YjU3ODRhNiwgMHg1YjcyNWViYywgMHg1YjhkMzYzMSwKLQkweDViYTgwYjA2LCAweDViYzJkZDNlLCAweDViZGRhY2Q5LCAweDViZjg3OWQ4LAotCTB4NWMxMzQ0M2QsIDB4NWMyZTBjMDksIDB4NWM0OGQxM2UsIDB4NWM2MzkzZGMsCi0JMHg1YzdlNTNlNSwgMHg1Yzk5MTE1YSwgMHg1Y2IzY2MzYywgMHg1Y2NlODQ4ZCwKLQkweDVjZTkzYTRlLCAweDVkMDNlZDgwLCAweDVkMWU5ZTI0LCAweDVkMzk0YzNiLAotCTB4NWQ1M2Y3YzcsIDB4NWQ2ZWEwYzksIDB4NWQ4OTQ3NDIsIDB4NWRhM2ViMzMsCi0JMHg1ZGJlOGM5ZSwgMHg1ZGQ5MmI4NCwgMHg1ZGYzYzdlNSwgMHg1ZTBlNjFjMywKLQkweDVlMjhmOTIwLCAweDVlNDM4ZGZjLCAweDVlNWUyMDU5LCAweDVlNzhiMDM3LAotCTB4NWU5MzNkOTksIDB4NWVhZGM4N2UsIDB4NWVjODUwZTksIDB4NWVlMmQ2ZGEsCi0JMHg1ZWZkNWE1MywgMHg1ZjE3ZGI1NCwgMHg1ZjMyNTllMCwgMHg1ZjRjZDVmNiwKLQkweDVmNjc0Zjk5LCAweDVmODFjNmM4LCAweDVmOWMzYjg3LCAweDVmYjZhZGQ0LAotCTB4NWZkMTFkYjMsIDB4NWZlYjhiMjMsIDB4NjAwNWY2MjYsIDB4NjAyMDVlYmQsCi0JMHg2MDNhYzRlOSwgMHg2MDU1MjhhYywgMHg2MDZmOGEwNSwgMHg2MDg5ZThmNywKLQkweDYwYTQ0NTgzLCAweDYwYmU5ZmE5LCAweDYwZDhmNzZiLCAweDYwZjM0Y2NhLAotCTB4NjEwZDlmYzcsIDB4NjEyN2YwNjIsIDB4NjE0MjNlOWUsIDB4NjE1YzhhN2EsCi0JMHg2MTc2ZDNmOSwgMHg2MTkxMWIxYiwgMHg2MWFiNWZlMSwgMHg2MWM1YTI0ZCwKLQkweDYxZGZlMjVmLCAweDYxZmEyMDE4LCAweDYyMTQ1YjdhLCAweDYyMmU5NDg1LAotCTB4NjI0OGNiM2IsIDB4NjI2MmZmOWQsIDB4NjI3ZDMxYWIsIDB4NjI5NzYxNjcsCi0JMHg2MmIxOGVkMSwgMHg2MmNiYjllYiwgMHg2MmU1ZTJiNiwgMHg2MzAwMDkzMywKLQkweDYzMWEyZDYyLCAweDYzMzQ0ZjQ1LCAweDYzNGU2ZWRkLCAweDYzNjg4YzJiLAotCTB4NjM4MmE3MzAsIDB4NjM5Y2JmZWMsIDB4NjNiNmQ2NjEsIDB4NjNkMGVhOTAsCi0JMHg2M2VhZmM3YSwgMHg2NDA1MGMxZiwgMHg2NDFmMTk4MiwgMHg2NDM5MjRhMiwKLQkweDY0NTMyZDgwLCAweDY0NmQzNDFmLCAweDY0ODczODdlLCAweDY0YTEzYTllLAotCTB4NjRiYjNhODEsIDB4NjRkNTM4MjgsIDB4NjRlZjMzOTMsIDB4NjUwOTJjYzQsCi0JMHg2NTIzMjNiYiwgMHg2NTNkMTg3OSwgMHg2NTU3MGIwMCwgMHg2NTcwZmI1MCwKLQkweDY1OGFlOTZiLCAweDY1YTRkNTUwLCAweDY1YmViZjAxLCAweDY1ZDhhNjgwLAotCTB4NjVmMjhiY2MsIDB4NjYwYzZlZTgsIDB4NjYyNjRmZDMsIDB4NjY0MDJlOGYsCi0JMHg2NjVhMGIxYywgMHg2NjczZTU3ZCwgMHg2NjhkYmRiMCwgMHg2NmE3OTNiOCwKLQkweDY2YzE2Nzk1LCAweDY2ZGIzOTQ5LCAweDY2ZjUwOGQ0LCAweDY3MGVkNjM2LAotCTB4NjcyOGExNzIsIDB4Njc0MjZhODcsIDB4Njc1YzMxNzcsIDB4Njc3NWY2NDMsCi0JMHg2NzhmYjhlYiwgMHg2N2E5Nzk3MSwgMHg2N2MzMzdkNSwgMHg2N2RjZjQxOCwKLQkweDY3ZjZhZTNiLCAweDY4MTA2NjNmLCAweDY4MmExYzI1LCAweDY4NDNjZmVkLAotCTB4Njg1ZDgxOTksIDB4Njg3NzMxMjksIDB4Njg5MGRlOWYsIDB4NjhhYTg5ZmEsCi0JMHg2OGM0MzMzZCwgMHg2OGRkZGE2NywgMHg2OGY3N2Y3YSwgMHg2OTExMjI3NywKLQkweDY5MmFjMzVlLCAweDY5NDQ2MjMwLCAweDY5NWRmZWVlLCAweDY5Nzc5OTlhLAotCTB4Njk5MTMyMzIsIDB4NjlhYWM4YmEsIDB4NjljNDVkMzEsIDB4NjlkZGVmOTgsCi0JMHg2OWY3N2ZmMCwgMHg2YTExMGUzYSwgMHg2YTJhOWE3NywgMHg2YTQ0MjRhOCwKLQkweDZhNWRhY2NjLCAweDZhNzczMmU2LCAweDZhOTBiNmY2LCAweDZhYWEzOGZkLAotCTB4NmFjM2I4ZmIsIDB4NmFkZDM2ZjIsIDB4NmFmNmIyZTIsIDB4NmIxMDJjY2QsCi0JMHg2YjI5YTRiMiwgMHg2YjQzMWE5MiwgMHg2YjVjOGU2ZiwgMHg2Yjc2MDA0YSwKLQkweDZiOGY3MDIyLCAweDZiYThkZGY5LCAweDZiYzI0OWQwLCAweDZiZGJiM2E3LAotCTB4NmJmNTFiODAsIDB4NmMwZTgxNWEsIDB4NmMyN2U1MzcsIDB4NmM0MTQ3MTgsCi0JMHg2YzVhYTZmZCwgMHg2Yzc0MDRlNywgMHg2YzhkNjBkNywgMHg2Y2E2YmFjZSwKLQkweDZjYzAxMmNjLCAweDZjZDk2OGQyLCAweDZjZjJiY2UxLCAweDZkMGMwZWY5LAotCTB4NmQyNTVmMWQsIDB4NmQzZWFkNGIsIDB4NmQ1N2Y5ODUsIDB4NmQ3MTQzY2MsCi0JMHg2ZDhhOGMyMSwgMHg2ZGEzZDI4MywgMHg2ZGJkMTZmNSwgMHg2ZGQ2NTk3NiwKLQkweDZkZWY5YTA4LCAweDZlMDhkOGFiLCAweDZlMjIxNTYwLCAweDZlM2I1MDI3LAotCTB4NmU1NDg5MDIsIDB4NmU2ZGJmZjEsIDB4NmU4NmY0ZjUsIDB4NmVhMDI4MGUsCi0JMHg2ZWI5NTkzZSwgMHg2ZWQyODg4NSwgMHg2ZWViYjVlMywgMHg2ZjA0ZTE1YSwKLQkweDZmMWUwYWVhLCAweDZmMzczMjk0LCAweDZmNTA1ODU5LCAweDZmNjk3YzM5LAotCTB4NmY4MjllMzUsIDB4NmY5YmJlNGUsIDB4NmZiNGRjODUsIDB4NmZjZGY4ZDksCi0JMHg2ZmU3MTM0ZCwgMHg3MDAwMmJlMCwgMHg3MDE5NDI5MywgMHg3MDMyNTc2NywKLQkweDcwNGI2YTVkLCAweDcwNjQ3Yjc2LCAweDcwN2Q4YWIxLCAweDcwOTY5ODExLAotCTB4NzBhZmEzOTQsIDB4NzBjOGFkM2QsIDB4NzBlMWI1MGMsIDB4NzBmYWJiMDEsCi0JMHg3MTEzYmYxZCwgMHg3MTJjYzE2MSwgMHg3MTQ1YzFjZSwgMHg3MTVlYzA2NCwKLQkweDcxNzdiZDI0LCAweDcxOTBiODBmLCAweDcxYTliMTI0LCAweDcxYzJhODY2LAotCTB4NzFkYjlkZDQsIDB4NzFmNDkxNzAsIDB4NzIwZDgzMzksIDB4NzIyNjczMzEsCi0JMHg3MjNmNjE1OSwgMHg3MjU4NGRiMCwgMHg3MjcxMzgzOCwgMHg3MjhhMjBmMSwKLQkweDcyYTMwN2RiLCAweDcyYmJlY2Y5LCAweDcyZDRkMDQ5LCAweDcyZWRiMWNlLAotCTB4NzMwNjkxODcsIDB4NzMxZjZmNzUsIDB4NzMzODRiOTgsIDB4NzM1MTI1ZjMsCi0JMHg3MzY5ZmU4NCwgMHg3MzgyZDU0ZCwgMHg3MzliYWE0ZSwgMHg3M2I0N2Q4OSwKLQkweDczY2Q0ZWZkLCAweDczZTYxZWFiLCAweDczZmVlYzk0LCAweDc0MTdiOGI4LAotCTB4NzQzMDgzMTksIDB4NzQ0OTRiYjYsIDB4NzQ2MjEyOTEsIDB4NzQ3YWQ3YWEsCi0JMHg3NDkzOWIwMiwgMHg3NGFjNWM5OCwgMHg3NGM1MWM2ZiwgMHg3NGRkZGE4NiwKLQkweDc0ZjY5NmRlLCAweDc1MGY1MTc4LCAweDc1MjgwYTU0LCAweDc1NDBjMTc0LAotCTB4NzU1OTc2ZDcsIDB4NzU3MjJhN2UsIDB4NzU4YWRjNjksIDB4NzVhMzhjOWIsCi0JMHg3NWJjM2IxMiwgMHg3NWQ0ZTdjZiwgMHg3NWVkOTJkNCwgMHg3NjA2M2MyMSwKLQkweDc2MWVlM2I2LCAweDc2Mzc4OTk0LCAweDc2NTAyZGJjLCAweDc2NjhkMDJlLAotCTB4NzY4MTcwZWIsIDB4NzY5YTBmZjMsIDB4NzZiMmFkNDcsIDB4NzZjYjQ4ZTcsCi0JMHg3NmUzZTJkNSwgMHg3NmZjN2IxMCwgMHg3NzE1MTE5YSwgMHg3NzJkYTY3MywKLQkweDc3NDYzOTliLCAweDc3NWVjYjEzLCAweDc3Nzc1YWRjLCAweDc3OGZlOGY2LAotCTB4NzdhODc1NjEsIDB4NzdjMTAwMWYsIDB4NzdkOTg5MzAsIDB4NzdmMjEwOTUsCi0JMHg3ODBhOTY0ZCwgMHg3ODIzMWE1YiwgMHg3ODNiOWNiZCwgMHg3ODU0MWQ3NSwKLQkweDc4NmM5Yzg0LCAweDc4ODUxOWU5LCAweDc4OWQ5NWE2LCAweDc4YjYwZmJiLAotCTB4NzhjZTg4MjgsIDB4NzhlNmZlZWYsIDB4NzhmZjc0MGYsIDB4NzkxN2U3OGEsCi0JMHg3OTMwNTk1ZiwgMHg3OTQ4Yzk5MCwgMHg3OTYxMzgxZCwgMHg3OTc5YTUwNiwKLQkweDc5OTIxMDRjLCAweDc5YWE3OWYwLCAweDc5YzJlMWYxLCAweDc5ZGI0ODUyLAotCTB4NzlmM2FkMTEsIDB4N2EwYzEwMzEsIDB4N2EyNDcxYjAsIDB4N2EzY2QxOTEsCi0JMHg3YTU1MmZkMywgMHg3YTZkOGM3NiwgMHg3YTg1ZTc3ZCwgMHg3YTllNDBlNiwKLQkweDdhYjY5OGIyLCAweDdhY2VlZWUzLCAweDdhZTc0Mzc4LCAweDdhZmY5NjczLAotCTB4N2IxN2U3ZDIsIDB4N2IzMDM3OTksIDB4N2I0ODg1YzUsIDB4N2I2MGQyNTksCi0JMHg3Yjc5MWQ1NSwgMHg3YjkxNjZiOSwgMHg3YmE5YWU4NiwgMHg3YmMxZjRiYywKLQkweDdiZGEzOTVjLCAweDdiZjI3YzY2LCAweDdjMGFiZGRiLCAweDdjMjJmZGJiLAotCTB4N2MzYjNjMDcsIDB4N2M1Mzc4YzAsIDB4N2M2YmIzZTUsIDB4N2M4M2VkNzgsCi0JMHg3YzljMjU3OSwgMHg3Y2I0NWJlOSwgMHg3Y2NjOTBjNywgMHg3Y2U0YzQxNCwKLQkweDdjZmNmNWQyLCAweDdkMTUyNjAwLCAweDdkMmQ1NDlmLCAweDdkNDU4MWIwLAotCTB4N2Q1ZGFkMzIsIDB4N2Q3NWQ3MjcsIDB4N2Q4ZGZmOGYsIDB4N2RhNjI2NmEsCi0JMHg3ZGJlNGJiYSwgMHg3ZGQ2NmY3ZCwgMHg3ZGVlOTFiNiwgMHg3ZTA2YjI2NCwKLQkweDdlMWVkMTg4LCAweDdlMzZlZjIyLCAweDdlNGYwYjM0LCAweDdlNjcyNWJkLAotCTB4N2U3ZjNlYmQsIDB4N2U5NzU2MzYsIDB4N2VhZjZjMjgsIDB4N2VjNzgwOTMsCi0JMHg3ZWRmOTM3OCwgMHg3ZWY3YTRkNywgMHg3ZjBmYjRiMSwgMHg3ZjI3YzMwNywKLQkweDdmM2ZjZmQ4LCAweDdmNTdkYjI1LCAweDdmNmZlNGVmLCAweDdmODdlZDM2LAotCTB4N2Y5ZmYzZmIsIDB4N2ZiN2Y5M2UsIDB4N2ZjZmZjZmYsIDB4N2ZlN2ZmNDAKLX07Ci0KLWNvbnN0IFdvcmQzMiBtVGFiXzRfM1s1MTJdPXsKLQkweDMyY2JmZDRhLCAweDMyZWRkZDcwLCAweDMzMGZjMzM5LCAweDMzMzFhZWEzLAotCTB4MzM1MzlmYWMsIDB4MzM3NTk2NTIsIDB4MzM5NzkyOTQsIDB4MzNiOTk0NzAsCi0JMHgzM2RiOWJlNCwgMHgzM2ZkYThlZCwgMHgzNDFmYmI4YiwgMHgzNDQxZDNiYiwKLQkweDM0NjNmMTdjLCAweDM0ODYxNGNjLCAweDM0YTgzZGE4LCAweDM0Y2E2YzEwLAotCTB4MzRlY2EwMDEsIDB4MzUwZWQ5NzksIDB4MzUzMTE4NzcsIDB4MzU1MzVjZmEsCi0JMHgzNTc1YTZmZSwgMHgzNTk3ZjY4MywgMHgzNWJhNGI4NywgMHgzNWRjYTYwNywKLQkweDM1ZmYwNjAzLCAweDM2MjE2Yjc4LCAweDM2NDNkNjY1LCAweDM2NjY0NmM3LAotCTB4MzY4OGJjOWUsIDB4MzZhYjM3ZTgsIDB4MzZjZGI4YTIsIDB4MzZmMDNlY2IsCi0JMHgzNzEyY2E2MiwgMHgzNzM1NWI2NCwgMHgzNzU3ZjFkMSwgMHgzNzdhOGRhNSwKLQkweDM3OWQyZWUwLCAweDM3YmZkNTgwLCAweDM3ZTI4MTg0LCAweDM4MDUzMmU4LAotCTB4MzgyN2U5YWQsIDB4Mzg0YWE1ZDAsIDB4Mzg2ZDY3NGYsIDB4Mzg5MDJlMmEsCi0JMHgzOGIyZmE1ZCwgMHgzOGQ1Y2JlOSwgMHgzOGY4YTJjYSwgMHgzOTFiN2VmZiwKLQkweDM5M2U2MDg4LCAweDM5NjE0NzYxLCAweDM5ODQzMzhhLCAweDM5YTcyNTAxLAotCTB4MzljYTFiYzQsIDB4MzllZDE3ZDEsIDB4M2ExMDE5MjgsIDB4M2EzMzFmYzYsCi0JMHgzYTU2MmJhYSwgMHgzYTc5M2NkMiwgMHgzYTljNTMzZCwgMHgzYWJmNmVlOSwKLQkweDNhZTI4ZmQ1LCAweDNiMDViNWZmLCAweDNiMjhlMTY1LCAweDNiNGMxMjA2LAotCTB4M2I2ZjQ3ZTAsIDB4M2I5MjgyZjIsIDB4M2JiNWMzM2EsIDB4M2JkOTA4YjcsCi0JMHgzYmZjNTM2OCwgMHgzYzFmYTM0OSwgMHgzYzQyZjg1YiwgMHgzYzY2NTI5YywKLQkweDNjODliMjA5LCAweDNjYWQxNmEyLCAweDNjZDA4MDY1LCAweDNjZjNlZjUxLAotCTB4M2QxNzYzNjQsIDB4M2QzYWRjOWMsIDB4M2Q1ZTVhZjgsIDB4M2Q4MWRlNzcsCi0JMHgzZGE1NjcxNywgMHgzZGM4ZjRkNiwgMHgzZGVjODdiNCwgMHgzZTEwMWZhZSwKLQkweDNlMzNiY2MzLCAweDNlNTc1ZWYyLCAweDNlN2IwNjNhLCAweDNlOWViMjk4LAotCTB4M2VjMjY0MGMsIDB4M2VlNjFhOTMsIDB4M2YwOWQ2MmQsIDB4M2YyZDk2ZDgsCi0JMHgzZjUxNWM5MywgMHgzZjc1Mjc1YiwgMHgzZjk4ZjczMSwgMHgzZmJjY2MxMSwKLQkweDNmZTBhNWZjLCAweDQwMDQ4NGVmLCAweDQwMjg2OGVhLCAweDQwNGM1MWU5LAotCTB4NDA3MDNmZWUsIDB4NDA5NDMyZjUsIDB4NDBiODJhZmQsIDB4NDBkYzI4MDYsCi0JMHg0MTAwMmEwZCwgMHg0MTI0MzExMSwgMHg0MTQ4M2QxMiwgMHg0MTZjNGUwZCwKLQkweDQxOTA2NDAxLCAweDQxYjQ3ZWVkLCAweDQxZDg5ZWNmLCAweDQxZmNjM2E3LAotCTB4NDIyMGVkNzIsIDB4NDI0NTFjMzAsIDB4NDI2OTRmZGUsIDB4NDI4ZDg4N2QsCi0JMHg0MmIxYzYwOSwgMHg0MmQ2MDg4MywgMHg0MmZhNGZlOCwgMHg0MzFlOWMzNywKLQkweDQzNDJlZDcwLCAweDQzNjc0MzkwLCAweDQzOGI5ZTk2LCAweDQzYWZmZTgyLAotCTB4NDNkNDYzNTEsIDB4NDNmOGNkMDMsIDB4NDQxZDNiOTUsIDB4NDQ0MWFmMDgsCi0JMHg0NDY2Mjc1OCwgMHg0NDhhYTQ4NywgMHg0NGFmMjY5MCwgMHg0NGQzYWQ3NSwKLQkweDQ0ZjgzOTMzLCAweDQ1MWNjOWM4LCAweDQ1NDE1ZjM1LCAweDQ1NjVmOTc3LAotCTB4NDU4YTk4OGQsIDB4NDVhZjNjNzYsIDB4NDVkM2U1MzEsIDB4NDVmODkyYmMsCi0JMHg0NjFkNDUxNiwgMHg0NjQxZmMzZSwgMHg0NjY2YjgzMiwgMHg0NjhiNzhmMiwKLQkweDQ2YjAzZTdjLCAweDQ2ZDUwOGNmLCAweDQ2ZjlkN2U5LCAweDQ3MWVhYmNhLAotCTB4NDc0Mzg0NzAsIDB4NDc2ODYxZDksIDB4NDc4ZDQ0MDYsIDB4NDdiMjJhZjMsCi0JMHg0N2Q3MTZhMSwgMHg0N2ZjMDcwZSwgMHg0ODIwZmMzOSwgMHg0ODQ1ZjYyMCwKLQkweDQ4NmFmNGMzLCAweDQ4OGZmODIwLCAweDQ4YjUwMDM1LCAweDQ4ZGEwZDAzLAotCTB4NDhmZjFlODcsIDB4NDkyNDM0YzAsIDB4NDk0OTRmYWQsIDB4NDk2ZTZmNGQsCi0JMHg0OTkzOTM5ZiwgMHg0OWI4YmNhMiwgMHg0OWRkZWE1NCwgMHg0YTAzMWNiNCwKLQkweDRhMjg1M2MxLCAweDRhNGQ4ZjdhLCAweDRhNzJjZmRlLCAweDRhOTgxNGViLAotCTB4NGFiZDVlYTEsIDB4NGFlMmFjZmQsIDB4NGIwODAwMDAsIDB4NGIyZDU3YTgsCi0JMHg0YjUyYjNmMywgMHg0Yjc4MTRlMSwgMHg0YjlkN2E3MCwgMHg0YmMyZTQ5ZiwKLQkweDRiZTg1MzZlLCAweDRjMGRjNmRiLCAweDRjMzMzZWU0LCAweDRjNThiYjg5LAotCTB4NGM3ZTNjYzksIDB4NGNhM2MyYTIsIDB4NGNjOTRkMTQsIDB4NGNlZWRjMWMsCi0JMHg0ZDE0NmZiYiwgMHg0ZDNhMDdlZiwgMHg0ZDVmYTRiNiwgMHg0ZDg1NDYxMSwKLQkweDRkYWFlYmZkLCAweDRkZDA5Njc5LCAweDRkZjY0NTg1LCAweDRlMWJmOTFmLAotCTB4NGU0MWIxNDYsIDB4NGU2NzZkZmEsIDB4NGU4ZDJmMzgsIDB4NGViMmY1MDEsCi0JMHg0ZWQ4YmY1MiwgMHg0ZWZlOGUyYiwgMHg0ZjI0NjE4YSwgMHg0ZjRhMzk3MCwKLQkweDRmNzAxNWQ5LCAweDRmOTVmNmM2LCAweDRmYmJkYzM2LCAweDRmZTFjNjI2LAotCTB4NTAwN2I0OTcsIDB4NTAyZGE3ODcsIDB4NTA1MzllZjUsIDB4NTA3OTlhZTEsCi0JMHg1MDlmOWI0OCwgMHg1MGM1YTAyYSwgMHg1MGViYTk4NSwgMHg1MTExYjc1YSwKLQkweDUxMzdjOWE2LCAweDUxNWRlMDY5LCAweDUxODNmYmEyLCAweDUxYWExYjRmLAotCTB4NTFkMDNmNzAsIDB4NTFmNjY4MDMsIDB4NTIxYzk1MDgsIDB4NTI0MmM2N2QsCi0JMHg1MjY4ZmM2MiwgMHg1MjhmMzZiNSwgMHg1MmI1NzU3NSwgMHg1MmRiYjhhMiwKLQkweDUzMDIwMDNhLCAweDUzMjg0YzNjLCAweDUzNGU5Y2E4LCAweDUzNzRmMTdjLAotCTB4NTM5YjRhYjcsIDB4NTNjMWE4NTgsIDB4NTNlODBhNWYsIDB4NTQwZTcwY2EsCi0JMHg1NDM0ZGI5OCwgMHg1NDViNGFjOCwgMHg1NDgxYmU1YSwgMHg1NGE4MzY0YiwKLQkweDU0Y2ViMjljLCAweDU0ZjUzMzRjLCAweDU1MWJiODU4LCAweDU1NDI0MWMxLAotCTB4NTU2OGNmODUsIDB4NTU4ZjYxYTMsIDB4NTViNWY4MWIsIDB4NTVkYzkyZWIsCi0JMHg1NjAzMzIxMiwgMHg1NjI5ZDU5MCwgMHg1NjUwN2Q2MywgMHg1Njc3Mjk4YSwKLQkweDU2OWRkYTA1LCAweDU2YzQ4ZWQzLCAweDU2ZWI0N2YyLCAweDU3MTIwNTYyLAotCTB4NTczOGM3MjEsIDB4NTc1ZjhkMmYsIDB4NTc4NjU3OGEsIDB4NTdhZDI2MzMsCi0JMHg1N2QzZjkyNywgMHg1N2ZhZDA2NiwgMHg1ODIxYWJlZiwgMHg1ODQ4OGJjMCwKLQkweDU4NmY2ZmRhLCAweDU4OTY1ODNiLCAweDU4YmQ0NGUyLCAweDU4ZTQzNWNlLAotCTB4NTkwYjJhZmYsIDB4NTkzMjI0NzMsIDB4NTk1OTIyMjksIDB4NTk4MDI0MjAsCi0JMHg1OWE3MmE1OSwgMHg1OWNlMzRkMCwgMHg1OWY1NDM4NywgMHg1YTFjNTY3YiwKLQkweDVhNDM2ZGFjLCAweDVhNmE4OTE5LCAweDVhOTFhOGMxLCAweDVhYjhjY2EzLAotCTB4NWFkZmY0YmUsIDB4NWIwNzIxMTEsIDB4NWIyZTUxOWMsIDB4NWI1NTg2NWUsCi0JMHg1YjdjYmY1NCwgMHg1YmEzZmM4MCwgMHg1YmNiM2RkZiwgMHg1YmYyODM3MSwKLQkweDVjMTljZDM1LCAweDVjNDExYjJhLCAweDVjNjg2ZDRmLCAweDVjOGZjM2E0LAotCTB4NWNiNzFlMjcsIDB4NWNkZTdjZDcsIDB4NWQwNWRmYjQsIDB4NWQyZDQ2YmQsCi0JMHg1ZDU0YjFmMCwgMHg1ZDdjMjE0ZSwgMHg1ZGEzOTRkNCwgMHg1ZGNiMGM4MywKLQkweDVkZjI4ODU5LCAweDVlMWEwODU2LCAweDVlNDE4Yzc4LCAweDVlNjkxNGJlLAotCTB4NWU5MGExMjksIDB4NWViODMxYjcsIDB4NWVkZmM2NjcsIDB4NWYwNzVmMzgsCi0JMHg1ZjJlZmMyOSwgMHg1ZjU2OWQzYSwgMHg1ZjdlNDI2YSwgMHg1ZmE1ZWJiNywKLQkweDVmY2Q5OTIxLCAweDVmZjU0YWE4LCAweDYwMWQwMDRhLCAweDYwNDRiYTA2LAotCTB4NjA2Yzc3ZGMsIDB4NjA5NDM5Y2EsIDB4NjBiYmZmZDAsIDB4NjBlM2M5ZWUsCi0JMHg2MTBiOTgyMSwgMHg2MTMzNmE2YSwgMHg2MTViNDBjOCwgMHg2MTgzMWIzOSwKLQkweDYxYWFmOWJkLCAweDYxZDJkYzUzLCAweDYxZmFjMmZhLCAweDYyMjJhZGIyLAotCTB4NjI0YTljNzksIDB4NjI3MjhmNGYsIDB4NjI5YTg2MzMsIDB4NjJjMjgxMjMsCi0JMHg2MmVhODAyMCwgMHg2MzEyODMyOSwgMHg2MzNhOGEzYywgMHg2MzYyOTU1OSwKLQkweDYzOGFhNDdmLCAweDYzYjJiN2FkLCAweDYzZGFjZWUyLCAweDY0MDJlYTFlLAotCTB4NjQyYjA5NjAsIDB4NjQ1MzJjYTYsIDB4NjQ3YjUzZjEsIDB4NjRhMzdmM2YsCi0JMHg2NGNiYWU4ZiwgMHg2NGYzZTFlMiwgMHg2NTFjMTkzNSwgMHg2NTQ0NTQ4OCwKLQkweDY1NmM5M2RiLCAweDY1OTRkNzJjLCAweDY1YmQxZTdiLCAweDY1ZTU2OWM3LAotCTB4NjYwZGI5MGYsIDB4NjYzNjBjNTMsIDB4NjY1ZTYzOTEsIDB4NjY4NmJlYzksCi0JMHg2NmFmMWRmYSwgMHg2NmQ3ODEyMywgMHg2NmZmZTg0NCwgMHg2NzI4NTM1YiwKLQkweDY3NTBjMjY4LCAweDY3NzkzNTZiLCAweDY3YTFhYzYyLCAweDY3Y2EyNzRjLAotCTB4NjdmMmE2MjksIDB4NjgxYjI4ZjksIDB4Njg0M2FmYjksIDB4Njg2YzNhNmEsCi0JMHg2ODk0YzkwYiwgMHg2OGJkNWI5YiwgMHg2OGU1ZjIxOSwgMHg2OTBlOGM4NCwKLQkweDY5MzcyYWRkLCAweDY5NWZjZDIxLCAweDY5ODg3MzUwLCAweDY5YjExZDZhLAotCTB4NjlkOWNiNmQsIDB4NmEwMjdkNWEsIDB4NmEyYjMzMmYsIDB4NmE1M2VjZWIsCi0JMHg2YTdjYWE4ZCwgMHg2YWE1NmMxNiwgMHg2YWNlMzE4NCwgMHg2YWY2ZmFkNiwKLQkweDZiMWZjODBjLCAweDZiNDg5OTI1LCAweDZiNzE2ZTIwLCAweDZiOWE0NmZkLAotCTB4NmJjMzIzYmIsIDB4NmJlYzA0NTgsIDB4NmMxNGU4ZDUsIDB4NmMzZGQxMzAsCi0JMHg2YzY2YmQ2OSwgMHg2YzhmYWQ4MCwgMHg2Y2I4YTE3MiwgMHg2Y2UxOTk0MCwKLQkweDZkMGE5NGU5LCAweDZkMzM5NDZkLCAweDZkNWM5N2NhLCAweDZkODU5ZWZmLAotCTB4NmRhZWFhMGQsIDB4NmRkN2I4ZjEsIDB4NmUwMGNiYWQsIDB4NmUyOWUyM2UsCi0JMHg2ZTUyZmNhNCwgMHg2ZTdjMWFkZiwgMHg2ZWE1M2NlZSwgMHg2ZWNlNjJjZiwKLQkweDZlZjc4YzgzLCAweDZmMjBiYTA5LCAweDZmNDllYjVmLCAweDZmNzMyMDg1LAotCTB4NmY5YzU5N2IsIDB4NmZjNTk2NDAsIDB4NmZlZWQ2ZDMsIDB4NzAxODFiMzMsCi0JMHg3MDQxNjM2MCwgMHg3MDZhYWY1OSwgMHg3MDkzZmYxZCwgMHg3MGJkNTJhYiwKLQkweDcwZTZhYTA0LCAweDcxMTAwNTI1LCAweDcxMzk2NDBmLCAweDcxNjJjNmMxLAotCTB4NzE4YzJkM2EsIDB4NzFiNTk3N2EsIDB4NzFkZjA1N2YsIDB4NzIwODc3NDksCi0JMHg3MjMxZWNkOCwgMHg3MjViNjYyYSwgMHg3Mjg0ZTMzZiwgMHg3MmFlNjQxNywKLQkweDcyZDdlOGIwLCAweDczMDE3MTBhLCAweDczMmFmZDI0LCAweDczNTQ4Y2ZlLAotCTB4NzM3ZTIwOTcsIDB4NzNhN2I3ZWUsIDB4NzNkMTUzMDMsIDB4NzNmYWYxZDUsCi0JMHg3NDI0OTQ2MiwgMHg3NDRlM2FhYywgMHg3NDc3ZTRiMCwgMHg3NGExOTI2ZSwKLQkweDc0Y2I0M2U2LCAweDc0ZjRmOTE3LCAweDc1MWViMjAxLCAweDc1NDg2ZWExLAotCTB4NzU3MjJlZjksIDB4NzU5YmYzMDcsIDB4NzVjNWJhY2EsIDB4NzVlZjg2NDIsCi0JMHg3NjE5NTU2ZiwgMHg3NjQzMjg0ZiwgMHg3NjZjZmVlMiwgMHg3Njk2ZDkyOCwKLQkweDc2YzBiNzFmLCAweDc2ZWE5OGM3LCAweDc3MTQ3ZTIwLCAweDc3M2U2NzI4LAotCTB4Nzc2ODUzZGYsIDB4Nzc5MjQ0NDUsIDB4NzdiYzM4NTgsIDB4NzdlNjMwMTksCi0JMHg3ODEwMmI4NSwgMHg3ODNhMmE5ZSwgMHg3ODY0MmQ2MiwgMHg3ODhlMzNkMSwKLQkweDc4YjgzZGU5LCAweDc4ZTI0YmFiLCAweDc5MGM1ZDE1LCAweDc5MzY3MjI4LAotCTB4Nzk2MDhhZTEsIDB4Nzk4YWE3NDIsIDB4NzliNGM3NDgsIDB4NzlkZWVhZjQsCi0JMHg3YTA5MTI0NSwgMHg3YTMzM2QzYSwgMHg3YTVkNmJkMiwgMHg3YTg3OWUwZSwKLQkweDdhYjFkM2VjLCAweDdhZGMwZDZiLCAweDdiMDY0YThjLCAweDdiMzA4YjRkLAotCTB4N2I1YWNmYWUsIDB4N2I4NTE3YWUsIDB4N2JhZjYzNGMsIDB4N2JkOWIyODksCi0JMHg3YzA0MDU2MywgMHg3YzJlNWJkYSwgMHg3YzU4YjVlYywgMHg3YzgzMTM5YiwKLQkweDdjYWQ3NGU0LCAweDdjZDdkOWM3LCAweDdkMDI0MjQ0LCAweDdkMmNhZTVhLAotCTB4N2Q1NzFlMDksIDB4N2Q4MTkxNGYsIDB4N2RhYzA4MmQsIDB4N2RkNjgyYTEsCi0JMHg3ZTAxMDBhYywgMHg3ZTJiODI0YiwgMHg3ZTU2MDc4MCwgMHg3ZTgwOTA0OCwKLQkweDdlYWIxY2E1LCAweDdlZDVhYzk0LCAweDdmMDA0MDE1LCAweDdmMmFkNzI5LAotCTB4N2Y1NTcxY2QsIDB4N2Y4MDEwMDMsIDB4N2ZhYWIxYzgsIDB4N2ZkNTU3MWQKLX07Ci0KLQotY29uc3QgV29yZDMyIGludlNCRlsyNF0gPSB7Ci0gIDB4M0ZGRDM0RkMsIDB4MkQzRjgwMDAsIDB4MjRGMThDN0UsIDB4MUZGRTlBN0UsCi0gIDB4MUM5REYxMEMsIDB4MUExRjg1MUEsIDB4MTgyRkU5OTQsIDB4MTY5RkMwMDAsCi0gIDB4MTU1NDJBQUEsIDB4MTQzQzMxQzIsIDB4MTM0QjFCNkMsIDB4MTI3OTIwQkUsCi0gIDB4MTFCRjJGQ0MsIDB4MTExQTc0OUUsIDB4MTA4NUZDNDIsIDB4MEZGRkE3QkUsCi0gIDB4MEY4NTU4MTgsIDB4MEYxNEVFNTYsIDB4MEVBRTZBNzgsIDB4MEU0RUY4ODYsCi0gIDB4MERGNjk4ODAsIDB4MERBNDk1NjgsIDB4MEQ1Nzg1NDIsIDB4MEQxMDFEMEMKLX07Ci0KLWNvbnN0IFdvcmQxNiBwb3cydG9taW51c05vdmVyMTZbMTddID0gewotICAweDdmZmYsIDB4N2E5MywgMHg3NTYwLCAweDcwNjYsCi0gIDB4NmJhMiwgMHg2NzEyLCAweDYyYjQsIDB4NWU4NCwKLSAgMHg1YTgyLCAweDU2YWMsIDB4NTJmZiwgMHg0ZjdiLAotICAweDRjMWMsIDB4NDhlMiwgMHg0NWNiLCAweDQyZDUsCi0gIDB4NDAwMAotfTsKLQotY29uc3QgV29yZDE2IHNpZGVJbmZvVGFiTG9uZ1tNQVhfU0ZCX0xPTkcgKyAxXSA9IHsKLSAgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwKLSAgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwKLSAgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwKLSAgOSwgOSwgOSwgOSwgMTQsIDE0LCAxNCwgMTQsCi0gIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAotICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLSAgMTQsIDE0LCAxNAotfTsKLQotY29uc3QgV29yZDE2IHNpZGVJbmZvVGFiU2hvcnRbTUFYX1NGQl9TSE9SVCArIDFdID0gewotICA3LCA3LCA3LCA3LCA3LCA3LCA3LCAxMCwgMTAsCi0gIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTMsIDEzCi19OwotCi1jb25zdCBXb3JkMzIgc3BlY0V4cE1hbnRUYWJsZUNvbWJfZW5jWzRdWzE0XSA9Ci17Ci0gIHsweDQwMDAwMDAwLCAgMHg1MGEyOGJlNiwgIDB4NjU5N2ZhOTUsICAweDQwMDAwMDAwLAotICAgMHg1MGEyOGJlNiwgIDB4NjU5N2ZhOTUsICAweDQwMDAwMDAwLCAgMHg1MGEyOGJlNiwKLSAgIDB4NjU5N2ZhOTUsICAweDQwMDAwMDAwLCAgMHg1MGEyOGJlNiwgIDB4NjU5N2ZhOTUsCi0gICAweDQwMDAwMDAwLCAgMHg1MGEyOGJlNn0sCi0KLSAgezB4NGMxYmY4MjksICAweDVmZTQ0MzVlLCAgMHg3OGQwZGY5YywgIDB4NGMxYmY4MjksCi0gICAweDVmZTQ0MzVlLCAgMHg3OGQwZGY5YywgIDB4NGMxYmY4MjksICAweDVmZTQ0MzVlLAotICAgMHg3OGQwZGY5YywgIDB4NGMxYmY4MjksICAweDVmZTQ0MzVlLCAgMHg3OGQwZGY5YywKLSAgIDB4NGMxYmY4MjksICAweDVmZTQ0MzVlfSwKLQotICB7MHg1YTgyNzk5YSwgIDB4NzIwOGY4MWQsICAweDQ3ZDY2YjBmLCAgMHg1YTgyNzk5YSwKLSAgIDB4NzIwOGY4MWQsICAweDQ3ZDY2YjBmLCAgMHg1YTgyNzk5YSwgIDB4NzIwOGY4MWQsCi0gICAweDQ3ZDY2YjBmLCAgMHg1YTgyNzk5YSwgIDB4NzIwOGY4MWQsICAweDQ3ZDY2YjBmLAotICAgMHg1YTgyNzk5YSwgIDB4NzIwOGY4MWR9LAotCi0gIHsweDZiYTI3ZTY1LCAgMHg0M2NlM2U0YiwgIDB4NTU2ZTA0MjQsICAweDZiYTI3ZTY1LAotICAgMHg0M2NlM2U0YiwgIDB4NTU2ZTA0MjQsICAweDZiYTI3ZTY1LCAgMHg0M2NlM2U0YiwKLSAgIDB4NTU2ZTA0MjQsICAweDZiYTI3ZTY1LCAgMHg0M2NlM2U0YiwgIDB4NTU2ZTA0MjQsCi0gICAweDZiYTI3ZTY1LCAgMHg0M2NlM2U0Yn0KLX07Ci0KLWNvbnN0ICBVV29yZDggc3BlY0V4cFRhYmxlQ29tYl9lbmNbNF1bMTRdID0KLXsKLSAgezEsIDIsIDMsIDUsIDYsIDcsIDksIDEwLCAxMSwgMTMsIDE0LCAxNSwgMTcsIDE4fSwKLSAgezEsIDIsIDMsIDUsIDYsIDcsIDksIDEwLCAxMSwgMTMsIDE0LCAxNSwgMTcsIDE4fSwKLSAgezEsIDIsIDQsIDUsIDYsIDgsIDksIDEwLCAxMiwgMTMsIDE0LCAxNiwgMTcsIDE4fSwKLSAgezEsIDMsIDQsIDUsIDcsIDgsIDksIDExLCAxMiwgMTMsIDE1LCAxNiwgMTcsIDE5fQotfTsKLQotY29uc3QgV29yZDE2IHF1YW50Qm9yZGVyc1s0XVs0XSA9IHsKLSAgLyogcG93KDEuMC0wLjQwNTQsIDQvMykvMTYgKiBwb3coMiwgKDAuLjMpLzQpICovCi0gIHsweDA0MDAsIDB4MGVlNywgMHgxYzg2LCAweDJjMGR9LAotICAvKiBwb3coMi4wLTAuNDA1NCwgNC8zKS8xNiAqIHBvdygyLCAoMC4uMykvNCkgKi8KLSAgezB4MDRjMiwgMHgxMWI5LCAweDIxZWIsIDB4MzQ2M30sCi0gIC8qIHBvdygzLjAtMC40MDU0LCA0LzMpLzE2ICogcG93KDIsICgwLi4zKS80KSAqLwotICB7MHgwNWE4LCAweDE1MTQsIDB4Mjg1NiwgMHgzZTRjfSwKLSAgLyogcG93KDQuMC0wLjQwNTQsIDQvMykvMTYgKiBwb3coMiwgKDAuLjMpLzQpICovCi0gIHsweDA2YmEsIDB4MTkxMSwgMHgyZmY4LCAweDRhMTZ9LAotfTsKLQotY29uc3QgV29yZDE2IHF1YW50UmVjb25bNF1bM10gPSB7Ci0gIHsweDA4MDAsIDB4MTQyOSwgMHgyMjlkfSwKLSAgezB4MDk4MywgMHgxN2Y5LCAweDI5MmF9LAotICB7MHgwYjUwLCAweDFjODIsIDB4MzBmNH0sCi0gIHsweDBkNzQsIDB4MjFlNywgMHgzYTM3fSwKLX07Ci0KLWNvbnN0IGludCBzYW1wUmF0ZVRhYltOVU1fU0FNUExFX1JBVEVTXSA9IHsKLSAgICA5NjAwMCwgODgyMDAsIDY0MDAwLCA0ODAwMCwgNDQxMDAsIDMyMDAwLAotCTI0MDAwLCAyMjA1MCwgMTYwMDAsIDEyMDAwLCAxMTAyNSwgIDgwMDAKLX07Ci0KLQotY29uc3QgaW50CXJhdGVzWzhdID0gewotCTE2MCwgMjQwLCAzMjAsIDQwMCwgNDgwLCA1NjAsIDY0MCwgMAotfTsKLQotY29uc3QgaW50IEJhbmR3aXRoQ29lZlRhYls4XVtOVU1fU0FNUExFX1JBVEVTXSA9IHsKLQl7IDcwMDAsICA3MDAwLCAgNDY2NiwgIDM1MDAsICAzNTAwLCAgMjgwMCwgIDI4MDAsICAyODAwLCAgMjgwMCwgIDIwMDAsICAyMDAwLCAgMjAwMH0sCi0JezEyMDAwLCAxMjAwMCwgIDgwMDAsICA2MDAwLCAgNjAwMCwgIDYwMDAsICA0MDAwLCAgNDAwMCwgIDQwMDAsICAzMDAwLCAgMzAwMCwgIDMwMDB9LAotCXsxODAwMCwgMTgwMDAsIDEyMDAwLCAgOTAwMCwgIDkwMDAsICA5MDAwLCAgNzAwMCwgIDcwMDAsICA3MDAwLCAgNTAwMCwgIDUwMDAsICA1MDAwfSwKLQl7MjAwMDAsIDIwMDAwLCAxNjAwMCwgMTIwMDAsIDEyMDAwLCAxMjAwMCwgIDkwMDAsICA5MDAwLCAgOTAwMCwgIDYwMDAsICA2MDAwLCAgNjAwMH0sCi0JezIwMDAwLCAyMDAwMCwgMTg2NjYsIDE0MDAwLCAxNDAwMCwgMTQwMDAsIDEwMDAwLCAxMDAwMCwgMTAwMDAsICA3MDAwLCAgNzAwMCwgIDcwMDB9LAotCXsyMDAwMCwgMjAwMDAsIDIwMDAwLCAxNjAwMCwgMTYwMDAsIDE2MDAwLCAxMjAwMCwgMTIwMDAsIDEyMDAwLCAgODAwMCwgIDgwMDAsICA4MDAwfSwKLQl7MjAwMDAsIDIwMDAwLCAyMDAwMCwgMjAwMDAsIDIwMDAwLCAyMDAwMCwgMTUwMDAsIDE1MDAwLCAxNTAwMCwgMTAwMDAsIDEwMDAwLCAxMDAwMH0sCi0JezIwMDAwLCAyMDAwMCwgMjAwMDAsIDIwMDAwLCAyMDAwMCwgMjAwMDAsIDIwMDAwLCAyMDAwMCwgMjAwMDAsIDIwMDAwLCAyMDAwMCwgMjAwMDB9Ci19OwotCi0KLS8qIHRvdGFsIG51bWJlciBvZiBzY2FsZSBmYWN0b3IgYmFuZHMgaW4gb25lIHdpbmRvdyAqLwotY29uc3QgVVdvcmQ4IHNmQmFuZFRvdGFsU2hvcnRbTlVNX1NBTVBMRV9SQVRFU10gPSB7Ci0gICAgMTIsIDEyLCAxMiwgMTQsIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNQotfTsKLQotY29uc3QgVVdvcmQ4IHNmQmFuZFRvdGFsTG9uZ1tOVU1fU0FNUExFX1JBVEVTXSA9IHsKLSAgICA0MSwgNDEsIDQ3LCA0OSwgNDksIDUxLCA0NywgNDcsIDQzLCA0MywgNDMsIDQwCi19OwotCi0vKiBzY2FsZSBmYWN0b3IgYmFuZCB0YWJsZXMgKi8KLWNvbnN0IGludCBzZkJhbmRUYWJTaG9ydE9mZnNldFtOVU1fU0FNUExFX1JBVEVTXSA9IHswLCAwLCAwLCAxMywgMTMsIDEzLCAyOCwgMjgsIDQ0LCA0NCwgNDQsIDYwfTsKLQotY29uc3Qgc2hvcnQgc2ZCYW5kVGFiU2hvcnRbNzZdID0gewotCS8qIHNob3J0IGJsb2NrIDY0LCA4OCwgOTYga0h6IFsxM10gICovCi0JMCwgICA0LCAgIDgsICAxMiwgIDE2LCAgMjAsICAyNCwgIDMyLCAgNDAsICA0OCwgIDY0LCAgOTIsIDEyOCwKLQotCS8qIHNob3J0IGJsb2NrIDMyLCA0NCwgNDgga0h6IFsxNV0gICovCi0JMCwgICA0LCAgIDgsICAxMiwgIDE2LCAgMjAsICAyOCwgIDM2LCAgNDQsICA1NiwgIDY4LCAgODAsICA5NiwgMTEyLCAxMjgsCi0KLQkvKiBzaG9ydCBibG9jayAyMiwgMjQga0h6IFsxNl0gICovCi0JMCwgICA0LCAgIDgsICAxMiwgIDE2LCAgMjAsICAyNCwgIDI4LCAgMzYsICA0NCwgIDUyLCAgNjQsICA3NiwgIDkyLCAxMDgsIDEyOCwKLQotCS8qIHNob3J0IGJsb2NrIDExLCAxMiwgMTYga0h6IFsxNl0gKi8KLQkwLCAgIDQsICAgOCwgIDEyLCAgMTYsICAyMCwgIDI0LCAgMjgsICAzMiwgIDQwLCAgNDgsICA2MCwgIDcyLCAgODgsIDEwOCwgMTI4LAotCi0JLyogc2hvcnQgYmxvY2sgOCBrSHogWzE2XSAqLwotCTAsICAgNCwgICA4LCAgMTIsICAxNiwgIDIwLCAgMjQsICAyOCwgIDM2LCAgNDQsICA1MiwgIDYwLCAgNzIsICA4OCwgMTA4LCAxMjgKLX07Ci0KLWNvbnN0IGludCBzZkJhbmRUYWJMb25nT2Zmc2V0W05VTV9TQU1QTEVfUkFURVNdID0gezAsIDAsIDQyLCA5MCwgOTAsIDE0MCwgMTkyLCAxOTIsIDI0MCwgMjQwLCAyNDAsIDI4NH07Ci0KLWNvbnN0IHNob3J0IHNmQmFuZFRhYkxvbmdbMzI1XSA9IHsKLQkvKiBsb25nIGJsb2NrIDg4LCA5NiBrSHogWzQyXSAgKi8KLQkgIDAsICAgNCwgICA4LCAgMTIsICAxNiwgIDIwLCAgMjQsICAyOCwgIDMyLCAgMzYsICA0MCwgIDQ0LCAgNDgsICAgNTIsCi0JIDU2LCAgNjQsICA3MiwgIDgwLCAgODgsICA5NiwgMTA4LCAxMjAsIDEzMiwgMTQ0LCAxNTYsIDE3MiwgMTg4LCAgMjEyLAotCTI0MCwgMjc2LCAzMjAsIDM4NCwgNDQ4LCA1MTIsIDU3NiwgNjQwLCA3MDQsIDc2OCwgODMyLCA4OTYsIDk2MCwgMTAyNCwKLQotCS8qIGxvbmcgYmxvY2sgNjQga0h6IFs0OF0gICovCi0JICAwLCAgIDQsICAgOCwgIDEyLCAgMTYsICAyMCwgIDI0LCAgMjgsICAzMiwgIDM2LCAgNDAsICA0NCwgIDQ4LCAgNTIsICA1NiwgICA2NCwKLQkgNzIsICA4MCwgIDg4LCAxMDAsIDExMiwgMTI0LCAxNDAsIDE1NiwgMTcyLCAxOTIsIDIxNiwgMjQwLCAyNjgsIDMwNCwgMzQ0LCAgMzg0LAotCTQyNCwgNDY0LCA1MDQsIDU0NCwgNTg0LCA2MjQsIDY2NCwgNzA0LCA3NDQsIDc4NCwgODI0LCA4NjQsIDkwNCwgOTQ0LCA5ODQsIDEwMjQsCi0KLQkvKiBsb25nIGJsb2NrIDQ0LCA0OCBrSHogWzUwXSAqLwotCSAgMCwgICA0LCAgIDgsICAxMiwgIDE2LCAgMjAsICAyNCwgIDI4LCAgMzIsICAzNiwgIDQwLCAgNDgsICA1NiwgIDY0LCAgNzIsICAgODAsICA4OCwKLQkgOTYsIDEwOCwgMTIwLCAxMzIsIDE0NCwgMTYwLCAxNzYsIDE5NiwgMjE2LCAyNDAsIDI2NCwgMjkyLCAzMjAsIDM1MiwgMzg0LCAgNDE2LCA0NDgsCi0JNDgwLCA1MTIsIDU0NCwgNTc2LCA2MDgsIDY0MCwgNjcyLCA3MDQsIDczNiwgNzY4LCA4MDAsIDgzMiwgODY0LCA4OTYsIDkyOCwgMTAyNCwKLQotCS8qIGxvbmcgYmxvY2sgMzIga0h6IFs1Ml0gKi8KLQkgIDAsICAgNCwgICA4LCAgMTIsICAxNiwgIDIwLCAgMjQsICAyOCwgIDMyLCAgMzYsICA0MCwgIDQ4LCAgNTYsICA2NCwgIDcyLCAgIDgwLCAgODgsICA5NiwKLQkxMDgsIDEyMCwgMTMyLCAxNDQsIDE2MCwgMTc2LCAxOTYsIDIxNiwgMjQwLCAyNjQsIDI5MiwgMzIwLCAzNTIsIDM4NCwgNDE2LCAgNDQ4LCA0ODAsIDUxMiwKLQk1NDQsIDU3NiwgNjA4LCA2NDAsIDY3MiwgNzA0LCA3MzYsIDc2OCwgODAwLCA4MzIsIDg2NCwgODk2LCA5MjgsIDk2MCwgOTkyLCAxMDI0LAotCi0JLyogbG9uZyBibG9jayAyMiwgMjQga0h6IFs0OF0gKi8KLQkgIDAsICAgNCwgICA4LCAgMTIsICAxNiwgIDIwLCAgMjQsICAyOCwgIDMyLCAgMzYsICA0MCwgIDQ0LCAgNTIsICA2MCwgIDY4LCAgIDc2LAotCSA4NCwgIDkyLCAxMDAsIDEwOCwgMTE2LCAxMjQsIDEzNiwgMTQ4LCAxNjAsIDE3MiwgMTg4LCAyMDQsIDIyMCwgMjQwLCAyNjAsICAyODQsCi0JMzA4LCAzMzYsIDM2NCwgMzk2LCA0MzIsIDQ2OCwgNTA4LCA1NTIsIDYwMCwgNjUyLCA3MDQsIDc2OCwgODMyLCA4OTYsIDk2MCwgMTAyNCwKLQotCS8qIGxvbmcgYmxvY2sgMTEsIDEyLCAxNiBrSHogWzQ0XSAqLwotCSAgMCwgICA4LCAgMTYsICAyNCwgIDMyLCAgNDAsICA0OCwgIDU2LCAgNjQsICA3MiwgIDgwLCAgODgsIDEwMCwgIDExMiwgMTI0LAotCTEzNiwgMTQ4LCAxNjAsIDE3MiwgMTg0LCAxOTYsIDIxMiwgMjI4LCAyNDQsIDI2MCwgMjgwLCAzMDAsIDMyMCwgIDM0NCwgMzY4LAotCTM5NiwgNDI0LCA0NTYsIDQ5MiwgNTMyLCA1NzIsIDYxNiwgNjY0LCA3MTYsIDc3MiwgODMyLCA4OTYsIDk2MCwgMTAyNCwKLQotCS8qIGxvbmcgYmxvY2sgOCBrSHogWzQxXSAgKi8KLQkgIDAsICAxMiwgIDI0LCAgMzYsICA0OCwgIDYwLCAgNzIsICA4NCwgIDk2LCAxMDgsIDEyMCwgMTMyLCAgMTQ0LCAxNTYsCi0JMTcyLCAxODgsIDIwNCwgMjIwLCAyMzYsIDI1MiwgMjY4LCAyODgsIDMwOCwgMzI4LCAzNDgsIDM3MiwgIDM5NiwgNDIwLAotCTQ0OCwgNDc2LCA1MDgsIDU0NCwgNTgwLCA2MjAsIDY2NCwgNzEyLCA3NjQsIDgyMCwgODgwLCA5NDQsIDEwMjQKLX07Ci0KLS8qCi0gIHRoZXNlIHRhYmxlcyBhcmUgdXNlZCBvbmx5IGZvciBjb3VudGluZyBhbmQKLSAgYXJlIHN0b3JlZCBpbiBwYWNrZWQgZm9ybWF0Ci0qLwotY29uc3QgVVdvcmQxNiBodWZmX2x0YWIxXzJbM11bM11bM11bM109Ci17Ci0gIHsKLSAgICB7Ci0gICAgICB7MHgwYjA5LDB4MDkwNywweDBiMDl9LAotICAgICAgezB4MGEwOCwweDA3MDYsMHgwYTA4fSwKLSAgICAgIHsweDBiMDksMHgwOTA4LDB4MGIwOX0KLSAgICB9LAotICAgIHsKLSAgICAgIHsweDBhMDgsMHgwNzA2LDB4MGEwN30sCi0gICAgICB7MHgwNzA2LDB4MDUwNSwweDA3MDZ9LAotICAgICAgezB4MDkwNywweDA3MDYsMHgwYTA4fQotICAgIH0sCi0gICAgewotICAgICAgezB4MGIwOSwweDA5MDcsMHgwYjA4fSwKLSAgICAgIHsweDA5MDgsMHgwNzA2LDB4MDkwOH0sCi0gICAgICB7MHgwYjA5LDB4MDkwNywweDBiMDl9Ci0gICAgfQotICB9LAotICB7Ci0gICAgewotICAgICAgezB4MDkwOCwweDA3MDYsMHgwOTA3fSwKLSAgICAgIHsweDA3MDYsMHgwNTA1LDB4MDcwNn0sCi0gICAgICB7MHgwOTA3LDB4MDcwNiwweDA5MDh9Ci0gICAgfSwKLSAgICB7Ci0gICAgICB7MHgwNzA2LDB4MDUwNSwweDA3MDZ9LAotICAgICAgezB4MDUwNSwweDAxMDMsMHgwNTA1fSwKLSAgICAgIHsweDA3MDYsMHgwNTA1LDB4MDcwNn0KLSAgICB9LAotICAgIHsKLSAgICAgIHsweDA5MDgsMHgwNzA2LDB4MDkwN30sCi0gICAgICB7MHgwNzA2LDB4MDUwNSwweDA3MDZ9LAotICAgICAgezB4MDkwOCwweDA3MDYsMHgwOTA4fQotICAgIH0KLSAgfSwKLSAgewotICAgIHsKLSAgICAgIHsweDBiMDksMHgwOTA3LDB4MGIwOX0sCi0gICAgICB7MHgwOTA4LDB4MDcwNiwweDA5MDh9LAotICAgICAgezB4MGIwOCwweDA5MDcsMHgwYjA5fQotICAgIH0sCi0gICAgewotICAgICAgezB4MGEwOCwweDA3MDYsMHgwOTA3fSwKLSAgICAgIHsweDA3MDYsMHgwNTA0LDB4MDcwNn0sCi0gICAgICB7MHgwOTA4LDB4MDcwNiwweDBhMDd9Ci0gICAgfSwKLSAgICB7Ci0gICAgICB7MHgwYjA5LDB4MDkwNywweDBiMDl9LAotICAgICAgezB4MGEwNywweDA3MDYsMHgwOTA4fSwKLSAgICAgIHsweDBiMDksMHgwOTA3LDB4MGIwOX0KLSAgICB9Ci0gIH0KLX07Ci0KLQotY29uc3QgVVdvcmQxNiBodWZmX2x0YWIzXzRbM11bM11bM11bM109Ci17Ci0gIHsKLSAgICB7Ci0gICAgICB7MHgwMTA0LDB4MDQwNSwweDA4MDh9LAotICAgICAgezB4MDQwNSwweDA1MDQsMHgwODA4fSwKLSAgICAgIHsweDA5MDksMHgwOTA4LDB4MGEwYn0KLSAgICB9LAotICAgIHsKLSAgICAgIHsweDA0MDUsMHgwNjA1LDB4MDkwOH0sCi0gICAgICB7MHgwNjA1LDB4MDYwNCwweDA5MDh9LAotICAgICAgezB4MDkwOCwweDA5MDcsMHgwYTBhfQotICAgIH0sCi0gICAgewotICAgICAgezB4MDkwOSwweDBhMDgsMHgwZDBifSwKLSAgICAgIHsweDA5MDgsMHgwOTA4LDB4MGIwYX0sCi0gICAgICB7MHgwYjBiLDB4MGEwYSwweDBjMGJ9Ci0gICAgfQotICB9LAotICB7Ci0gICAgewotICAgICAgezB4MDQwNCwweDA2MDUsMHgwYTA4fSwKLSAgICAgIHsweDA2MDQsMHgwNzA0LDB4MGEwOH0sCi0gICAgICB7MHgwYTA4LDB4MGEwOCwweDBjMGF9Ci0gICAgfSwKLSAgICB7Ci0gICAgICB7MHgwNTA0LDB4MDcwNCwweDBiMDh9LAotICAgICAgezB4MDYwNCwweDA3MDQsMHgwYTA3fSwKLSAgICAgIHsweDA5MDgsMHgwOTA3LDB4MGIwOX0KLSAgICB9LAotICAgIHsKLSAgICAgIHsweDA5MDgsMHgwYTA4LDB4MGQwYX0sCi0gICAgICB7MHgwODA3LDB4MDkwNywweDBjMDl9LAotICAgICAgezB4MGEwYSwweDBiMDksMHgwYzBhfQotICAgIH0KLSAgfSwKLSAgewotICAgIHsKLSAgICAgIHsweDA4MDgsMHgwYTA4LDB4MGYwYn0sCi0gICAgICB7MHgwOTA4LDB4MGIwNywweDBmMGF9LAotICAgICAgezB4MGQwYiwweDBlMGEsMHgxMDBjfQotICAgIH0sCi0gICAgewotICAgICAgezB4MDgwOCwweDBhMDcsMHgwZTBhfSwKLSAgICAgIHsweDA5MDcsMHgwYTA3LDB4MGUwOX0sCi0gICAgICB7MHgwYzBhLDB4MGMwOSwweDBmMGJ9Ci0gICAgfSwKLSAgICB7Ci0gICAgICB7MHgwYjBiLDB4MGMwYSwweDEwMGN9LAotICAgICAgezB4MGEwYSwweDBiMDksMHgwZjBifSwKLSAgICAgIHsweDBjMGIsMHgwYzBhLDB4MGYwYn0KLSAgICB9Ci0gIH0KLX07Ci0KLWNvbnN0IFVXb3JkMTYgaHVmZl9sdGFiNV82WzldWzldPQotewotICB7MHgwZDBiLDB4MGMwYSwweDBiMDksMHgwYjA5LDB4MGEwOSwweDBiMDksMHgwYjA5LDB4MGMwYSwweDBkMGJ9LAotICB7MHgwYzBhLDB4MGIwOSwweDBhMDgsMHgwOTA3LDB4MDgwNywweDA5MDcsMHgwYTA4LDB4MGIwOSwweDBjMGF9LAotICB7MHgwYzA5LDB4MGEwOCwweDA5MDYsMHgwODA2LDB4MDcwNiwweDA4MDYsMHgwOTA2LDB4MGEwOCwweDBiMDl9LAotICB7MHgwYjA5LDB4MDkwNywweDA4MDYsMHgwNTA0LDB4MDQwNCwweDA1MDQsMHgwODA2LDB4MDkwNywweDBiMDl9LAotICB7MHgwYTA5LDB4MDgwNywweDA3MDYsMHgwNDA0LDB4MDEwNCwweDA0MDQsMHgwNzA2LDB4MDgwNywweDBiMDl9LAotICB7MHgwYjA5LDB4MDkwNywweDA4MDYsMHgwNTA0LDB4MDQwNCwweDA1MDQsMHgwODA2LDB4MDkwNywweDBiMDl9LAotICB7MHgwYjA5LDB4MGEwOCwweDA5MDYsMHgwODA2LDB4MDcwNiwweDA4MDYsMHgwOTA2LDB4MGEwOCwweDBiMDl9LAotICB7MHgwYzBhLDB4MGIwOSwweDBhMDgsMHgwOTA3LDB4MDgwNywweDA5MDcsMHgwYTA3LDB4MGIwOCwweDBjMGF9LAotICB7MHgwZDBiLDB4MGMwYSwweDBjMDksMHgwYjA5LDB4MGEwOSwweDBhMDksMHgwYjA5LDB4MGMwYSwweDBkMGJ9Ci19OwotCi1jb25zdCBVV29yZDE2IGh1ZmZfbHRhYjdfOFs4XVs4XT0KLXsKLSAgezB4MDEwNSwweDAzMDQsMHgwNjA1LDB4MDcwNiwweDA4MDcsMHgwOTA4LDB4MGEwOSwweDBiMGF9LAotICB7MHgwMzA0LDB4MDQwMywweDA2MDQsMHgwNzA1LDB4MDgwNiwweDA4MDcsMHgwOTA3LDB4MDkwOH0sCi0gIHsweDA2MDUsMHgwNjA0LDB4MDcwNCwweDA4MDUsMHgwODA2LDB4MDkwNywweDA5MDcsMHgwYTA4fSwKLSAgezB4MDcwNiwweDA3MDUsMHgwODA1LDB4MDgwNiwweDA5MDYsMHgwOTA3LDB4MGEwOCwweDBhMDh9LAotICB7MHgwODA3LDB4MDgwNiwweDA5MDYsMHgwOTA2LDB4MGEwNywweDBhMDcsMHgwYTA4LDB4MGIwOX0sCi0gIHsweDA5MDgsMHgwODA3LDB4MDkwNiwweDA5MDcsMHgwYTA3LDB4MGEwOCwweDBiMDgsMHgwYjBhfSwKLSAgezB4MGEwOSwweDA5MDcsMHgwOTA3LDB4MGEwOCwweDBhMDgsMHgwYjA4LDB4MGMwOSwweDBjMDl9LAotICB7MHgwYjBhLDB4MGEwOCwweDBhMDgsMHgwYTA4LDB4MGIwOSwweDBiMDksMHgwYzA5LDB4MGMwYX0KLX07Ci0KLWNvbnN0IFVXb3JkMTYgaHVmZl9sdGFiOV8xMFsxM11bMTNdPQotewotICB7MHgwMTA2LDB4MDMwNSwweDA2MDYsMHgwODA2LDB4MDkwNywweDBhMDgsMHgwYTA5LDB4MGIwYSwweDBiMGEsMHgwYzBhLDB4MGMwYiwweDBkMGIsMHgwZDBjfSwKLSAgezB4MDMwNSwweDA0MDQsMHgwNjA0LDB4MDcwNSwweDA4MDYsMHgwODA3LDB4MDkwNywweDBhMDgsMHgwYTA4LDB4MGEwOSwweDBiMGEsMHgwYzBhLDB4MGMwYn0sCi0gIHsweDA2MDYsMHgwNjA0LDB4MDcwNSwweDA4MDUsMHgwODA2LDB4MDkwNiwweDBhMDcsMHgwYTA4LDB4MGEwOCwweDBiMDksMHgwYzA5LDB4MGMwYSwweDBjMGF9LAotICB7MHgwODA2LDB4MDcwNSwweDA4MDUsMHgwOTA1LDB4MDkwNiwweDBhMDcsMHgwYTA3LDB4MGIwOCwweDBiMDgsMHgwYjA5LDB4MGMwOSwweDBjMGEsMHgwZDBhfSwKLSAgezB4MDkwNywweDA4MDYsMHgwOTA2LDB4MDkwNiwweDBhMDYsMHgwYTA3LDB4MGIwNywweDBiMDgsMHgwYjA4LDB4MGMwOSwweDBjMDksMHgwYzBhLDB4MGQwYX0sCi0gIHsweDBhMDgsMHgwOTA3LDB4MDkwNiwweDBhMDcsMHgwYjA3LDB4MGIwNywweDBiMDgsMHgwYzA4LDB4MGIwOCwweDBjMDksMHgwYzBhLDB4MGQwYSwweDBkMGJ9LAotICB7MHgwYjA5LDB4MDkwNywweDBhMDcsMHgwYjA3LDB4MGIwNywweDBiMDgsMHgwYzA4LDB4MGMwOSwweDBjMDksMHgwYzA5LDB4MGQwYSwweDBkMGEsMHgwZDBifSwKLSAgezB4MGIwOSwweDBhMDgsMHgwYTA4LDB4MGIwOCwweDBiMDgsMHgwYzA4LDB4MGMwOSwweDBkMDksMHgwZDA5LDB4MGQwYSwweDBkMGEsMHgwZDBiLDB4MGQwYn0sCi0gIHsweDBiMDksMHgwYTA4LDB4MGEwOCwweDBiMDgsMHgwYjA4LDB4MGIwOCwweDBjMDksMHgwYzA5LDB4MGQwYSwweDBkMGEsMHgwZTBhLDB4MGQwYiwweDBlMGJ9LAotICB7MHgwYjBhLDB4MGEwOSwweDBiMDksMHgwYjA5LDB4MGMwOSwweDBjMDksMHgwYzA5LDB4MGMwYSwweDBkMGEsMHgwZDBhLDB4MGUwYiwweDBlMGIsMHgwZTBjfSwKLSAgezB4MGMwYSwweDBiMDksMHgwYjA5LDB4MGMwOSwweDBjMDksMHgwYzBhLDB4MGQwYSwweDBkMGEsMHgwZDBhLDB4MGUwYiwweDBlMGIsMHgwZTBiLDB4MGYwY30sCi0gIHsweDBjMGIsMHgwYjBhLDB4MGMwOSwweDBjMGEsMHgwYzBhLDB4MGQwYSwweDBkMGEsMHgwZDBhLDB4MGQwYiwweDBlMGIsMHgwZTBiLDB4MGYwYiwweDBmMGN9LAotICB7MHgwZDBiLDB4MGMwYSwweDBjMGEsMHgwYzBhLDB4MGQwYSwweDBkMGEsMHgwZDBhLDB4MGQwYiwweDBlMGIsMHgwZTBjLDB4MGUwYywweDBlMGMsMHgwZjBjfQotfTsKLQotY29uc3QgVVdvcmQxNiBodWZmX2x0YWIxMVsxN11bMTddPQotewotICB7MHgwMDA0LDB4MDAwNSwweDAwMDYsMHgwMDA3LDB4MDAwOCwweDAwMDgsMHgwMDA5LDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYiwweDAwMGIsMHgwMDBjLDB4MDAwYiwweDAwMGMsMHgwMDBjLDB4MDAwYX0sCi0gIHsweDAwMDUsMHgwMDA0LDB4MDAwNSwweDAwMDYsMHgwMDA3LDB4MDAwNywweDAwMDgsMHgwMDA4LDB4MDAwOSwweDAwMDksMHgwMDA5LDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGIsMHgwMDA4fSwKLSAgezB4MDAwNiwweDAwMDUsMHgwMDA1LDB4MDAwNiwweDAwMDcsMHgwMDA3LDB4MDAwOCwweDAwMDgsMHgwMDA4LDB4MDAwOSwweDAwMDksMHgwMDA5LDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMDh9LAotICB7MHgwMDA3LDB4MDAwNiwweDAwMDYsMHgwMDA2LDB4MDAwNywweDAwMDcsMHgwMDA4LDB4MDAwOCwweDAwMDgsMHgwMDA5LDB4MDAwOSwweDAwMDksMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwOH0sCi0gIHsweDAwMDgsMHgwMDA3LDB4MDAwNywweDAwMDcsMHgwMDA3LDB4MDAwOCwweDAwMDgsMHgwMDA4LDB4MDAwOCwweDAwMDksMHgwMDA5LDB4MDAwOSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDA4fSwKLSAgezB4MDAwOCwweDAwMDcsMHgwMDA3LDB4MDAwNywweDAwMDcsMHgwMDA4LDB4MDAwOCwweDAwMDgsMHgwMDA5LDB4MDAwOSwweDAwMDksMHgwMDA5LDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMDh9LAotICB7MHgwMDA5LDB4MDAwOCwweDAwMDgsMHgwMDA4LDB4MDAwOCwweDAwMDgsMHgwMDA4LDB4MDAwOCwweDAwMDksMHgwMDA5LDB4MDAwOSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwOH0sCi0gIHsweDAwMDksMHgwMDA4LDB4MDAwOCwweDAwMDgsMHgwMDA4LDB4MDAwOCwweDAwMDgsMHgwMDA5LDB4MDAwOSwweDAwMDksMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDA4fSwKLSAgezB4MDAwYSwweDAwMDksMHgwMDA4LDB4MDAwOCwweDAwMDksMHgwMDA5LDB4MDAwOSwweDAwMDksMHgwMDA5LDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYiwweDAwMDh9LAotICB7MHgwMDBhLDB4MDAwOSwweDAwMDksMHgwMDA5LDB4MDAwOSwweDAwMDksMHgwMDA5LDB4MDAwOSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGIsMHgwMDBiLDB4MDAwOH0sCi0gIHsweDAwMGIsMHgwMDA5LDB4MDAwOSwweDAwMDksMHgwMDA5LDB4MDAwOSwweDAwMDksMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGIsMHgwMDBhLDB4MDAwYiwweDAwMGIsMHgwMDA4fSwKLSAgezB4MDAwYiwweDAwMGEsMHgwMDA5LDB4MDAwOSwweDAwMGEsMHgwMDA5LDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBiLDB4MDAwYiwweDAwMGIsMHgwMDBiLDB4MDAwYiwweDAwMDh9LAotICB7MHgwMDBiLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGIsMHgwMDBiLDB4MDAwYiwweDAwMGIsMHgwMDBiLDB4MDAwOX0sCi0gIHsweDAwMGIsMHgwMDBhLDB4MDAwOSwweDAwMDksMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBiLDB4MDAwYiwweDAwMGIsMHgwMDBiLDB4MDAwYiwweDAwMGIsMHgwMDA5fSwKLSAgezB4MDAwYiwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGIsMHgwMDBiLDB4MDAwYiwweDAwMGIsMHgwMDBiLDB4MDAwYiwweDAwMDl9LAotICB7MHgwMDBjLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGIsMHgwMDBiLDB4MDAwYiwweDAwMGIsMHgwMDBiLDB4MDAwYiwweDAwMGMsMHgwMDBjLDB4MDAwOX0sCi0gIHsweDAwMDksMHgwMDA4LDB4MDAwOCwweDAwMDgsMHgwMDA4LDB4MDAwOCwweDAwMDgsMHgwMDA4LDB4MDAwOCwweDAwMDgsMHgwMDA4LDB4MDAwOCwweDAwMDgsMHgwMDA4LDB4MDAwOCwweDAwMDksMHgwMDA1fQotfTsKLQotY29uc3QgVVdvcmQxNiBodWZmX2x0YWJzY2ZbMTIxXT0KLXsKLSAgMHgwMDEyLAotICAweDAwMTIsCi0gIDB4MDAxMiwKLSAgMHgwMDEyLAotICAweDAwMTMsCi0gIDB4MDAxMywKLSAgMHgwMDEzLAotICAweDAwMTMsCi0gIDB4MDAxMywKLSAgMHgwMDEzLAotICAweDAwMTMsCi0gIDB4MDAxMywKLSAgMHgwMDEzLAotICAweDAwMTMsCi0gIDB4MDAxMywKLSAgMHgwMDEzLAotICAweDAwMTMsCi0gIDB4MDAxMywKLSAgMHgwMDEzLAotICAweDAwMTIsCi0gIDB4MDAxMywKLSAgMHgwMDEyLAotICAweDAwMTEsCi0gIDB4MDAxMSwKLSAgMHgwMDEwLAotICAweDAwMTEsCi0gIDB4MDAxMCwKLSAgMHgwMDEwLAotICAweDAwMTAsCi0gIDB4MDAxMCwKLSAgMHgwMDBmLAotICAweDAwMGYsCi0gIDB4MDAwZSwKLSAgMHgwMDBlLAotICAweDAwMGUsCi0gIDB4MDAwZSwKLSAgMHgwMDBlLAotICAweDAwMGUsCi0gIDB4MDAwZCwKLSAgMHgwMDBkLAotICAweDAwMGMsCi0gIDB4MDAwYywKLSAgMHgwMDBjLAotICAweDAwMGIsCi0gIDB4MDAwYywKLSAgMHgwMDBiLAotICAweDAwMGEsCi0gIDB4MDAwYSwKLSAgMHgwMDBhLAotICAweDAwMDksCi0gIDB4MDAwOSwKLSAgMHgwMDA4LAotICAweDAwMDgsCi0gIDB4MDAwOCwKLSAgMHgwMDA3LAotICAweDAwMDYsCi0gIDB4MDAwNiwKLSAgMHgwMDA1LAotICAweDAwMDQsCi0gIDB4MDAwMywKLSAgMHgwMDAxLAotICAweDAwMDQsCi0gIDB4MDAwNCwKLSAgMHgwMDA1LAotICAweDAwMDYsCi0gIDB4MDAwNiwKLSAgMHgwMDA3LAotICAweDAwMDcsCi0gIDB4MDAwOCwKLSAgMHgwMDA4LAotICAweDAwMDksCi0gIDB4MDAwOSwKLSAgMHgwMDBhLAotICAweDAwMGEsCi0gIDB4MDAwYSwKLSAgMHgwMDBiLAotICAweDAwMGIsCi0gIDB4MDAwYiwKLSAgMHgwMDBiLAotICAweDAwMGMsCi0gIDB4MDAwYywKLSAgMHgwMDBkLAotICAweDAwMGQsCi0gIDB4MDAwZCwKLSAgMHgwMDBlLAotICAweDAwMGUsCi0gIDB4MDAxMCwKLSAgMHgwMDBmLAotICAweDAwMTAsCi0gIDB4MDAwZiwKLSAgMHgwMDEyLAotICAweDAwMTMsCi0gIDB4MDAxMywKLSAgMHgwMDEzLAotICAweDAwMTMsCi0gIDB4MDAxMywKLSAgMHgwMDEzLAotICAweDAwMTMsCi0gIDB4MDAxMywKLSAgMHgwMDEzLAotICAweDAwMTMsCi0gIDB4MDAxMywKLSAgMHgwMDEzLAotICAweDAwMTMsCi0gIDB4MDAxMywKLSAgMHgwMDEzLAotICAweDAwMTMsCi0gIDB4MDAxMywKLSAgMHgwMDEzLAotICAweDAwMTMsCi0gIDB4MDAxMywKLSAgMHgwMDEzLAotICAweDAwMTMsCi0gIDB4MDAxMywKLSAgMHgwMDEzLAotICAweDAwMTMsCi0gIDB4MDAxMywKLSAgMHgwMDEzLAotICAweDAwMTMsCi0gIDB4MDAxMywKLSAgMHgwMDEzCi19OwotCi0KLWNvbnN0IFVXb3JkMTYgaHVmZl9jdGFiMVszXVszXVszXVszXT0KLXsKLSAgewotICAgIHsKLSAgICAgIHsweDA3ZjgsMHgwMWYxLDB4MDdmZH0sCi0gICAgICB7MHgwM2Y1LDB4MDA2OCwweDAzZjB9LAotICAgICAgezB4MDdmNywweDAxZWMsMHgwN2Y1fQotICAgIH0sCi0gICAgewotICAgICAgezB4MDNmMSwweDAwNzIsMHgwM2Y0fSwKLSAgICAgIHsweDAwNzQsMHgwMDExLDB4MDA3Nn0sCi0gICAgICB7MHgwMWViLDB4MDA2YywweDAzZjZ9Ci0gICAgfSwKLSAgICB7Ci0gICAgICB7MHgwN2ZjLDB4MDFlMSwweDA3ZjF9LAotICAgICAgezB4MDFmMCwweDAwNjEsMHgwMWY2fSwKLSAgICAgIHsweDA3ZjIsMHgwMWVhLDB4MDdmYn0KLSAgICB9Ci0gIH0sCi0gIHsKLSAgICB7Ci0gICAgICB7MHgwMWYyLDB4MDA2OSwweDAxZWR9LAotICAgICAgezB4MDA3NywweDAwMTcsMHgwMDZmfSwKLSAgICAgIHsweDAxZTYsMHgwMDY0LDB4MDFlNX0KLSAgICB9LAotICAgIHsKLSAgICAgIHsweDAwNjcsMHgwMDE1LDB4MDA2Mn0sCi0gICAgICB7MHgwMDEyLDB4MDAwMCwweDAwMTR9LAotICAgICAgezB4MDA2NSwweDAwMTYsMHgwMDZkfQotICAgIH0sCi0gICAgewotICAgICAgezB4MDFlOSwweDAwNjMsMHgwMWU0fSwKLSAgICAgIHsweDAwNmIsMHgwMDEzLDB4MDA3MX0sCi0gICAgICB7MHgwMWUzLDB4MDA3MCwweDAxZjN9Ci0gICAgfQotICB9LAotICB7Ci0gICAgewotICAgICAgezB4MDdmZSwweDAxZTcsMHgwN2YzfSwKLSAgICAgIHsweDAxZWYsMHgwMDYwLDB4MDFlZX0sCi0gICAgICB7MHgwN2YwLDB4MDFlMiwweDA3ZmF9Ci0gICAgfSwKLSAgICB7Ci0gICAgICB7MHgwM2YzLDB4MDA2YSwweDAxZTh9LAotICAgICAgezB4MDA3NSwweDAwMTAsMHgwMDczfSwKLSAgICAgIHsweDAxZjQsMHgwMDZlLDB4MDNmN30KLSAgICB9LAotICAgIHsKLSAgICAgIHsweDA3ZjYsMHgwMWUwLDB4MDdmOX0sCi0gICAgICB7MHgwM2YyLDB4MDA2NiwweDAxZjV9LAotICAgICAgezB4MDdmZiwweDAxZjcsMHgwN2Y0fQotICAgIH0KLSAgfQotfTsKLQotY29uc3QgVVdvcmQxNiBodWZmX2N0YWIyWzNdWzNdWzNdWzNdPQotewotICB7Ci0gICAgewotICAgICAgezB4MDFmMywweDAwNmYsMHgwMWZkfSwKLSAgICAgIHsweDAwZWIsMHgwMDIzLDB4MDBlYX0sCi0gICAgICB7MHgwMWY3LDB4MDBlOCwweDAxZmF9Ci0gICAgfSwKLSAgICB7Ci0gICAgICB7MHgwMGYyLDB4MDAyZCwweDAwNzB9LAotICAgICAgezB4MDAyMCwweDAwMDYsMHgwMDJifSwKLSAgICAgIHsweDAwNmUsMHgwMDI4LDB4MDBlOX0KLSAgICB9LAotICAgIHsKLSAgICAgIHsweDAxZjksMHgwMDY2LDB4MDBmOH0sCi0gICAgICB7MHgwMGU3LDB4MDAxYiwweDAwZjF9LAotICAgICAgezB4MDFmNCwweDAwNmIsMHgwMWY1fQotICAgIH0KLSAgfSwKLSAgewotICAgIHsKLSAgICAgIHsweDAwZWMsMHgwMDJhLDB4MDA2Y30sCi0gICAgICB7MHgwMDJjLDB4MDAwYSwweDAwMjd9LAotICAgICAgezB4MDA2NywweDAwMWEsMHgwMGY1fQotICAgIH0sCi0gICAgewotICAgICAgezB4MDAyNCwweDAwMDgsMHgwMDFmfSwKLSAgICAgIHsweDAwMDksMHgwMDAwLDB4MDAwN30sCi0gICAgICB7MHgwMDFkLDB4MDAwYiwweDAwMzB9Ci0gICAgfSwKLSAgICB7Ci0gICAgICB7MHgwMGVmLDB4MDAxYywweDAwNjR9LAotICAgICAgezB4MDAxZSwweDAwMGMsMHgwMDI5fSwKLSAgICAgIHsweDAwZjMsMHgwMDJmLDB4MDBmMH0KLSAgICB9Ci0gIH0sCi0gIHsKLSAgICB7Ci0gICAgICB7MHgwMWZjLDB4MDA3MSwweDAxZjJ9LAotICAgICAgezB4MDBmNCwweDAwMjEsMHgwMGU2fSwKLSAgICAgIHsweDAwZjcsMHgwMDY4LDB4MDFmOH0KLSAgICB9LAotICAgIHsKLSAgICAgIHsweDAwZWUsMHgwMDIyLDB4MDA2NX0sCi0gICAgICB7MHgwMDMxLDB4MDAwMiwweDAwMjZ9LAotICAgICAgezB4MDBlZCwweDAwMjUsMHgwMDZhfQotICAgIH0sCi0gICAgewotICAgICAgezB4MDFmYiwweDAwNzIsMHgwMWZlfSwKLSAgICAgIHsweDAwNjksMHgwMDJlLDB4MDBmNn0sCi0gICAgICB7MHgwMWZmLDB4MDA2ZCwweDAxZjZ9Ci0gICAgfQotICB9Ci19OwotCi1jb25zdCBVV29yZDE2IGh1ZmZfY3RhYjNbM11bM11bM11bM109Ci17Ci0gIHsKLSAgICB7Ci0gICAgICB7MHgwMDAwLDB4MDAwOSwweDAwZWZ9LAotICAgICAgezB4MDAwYiwweDAwMTksMHgwMGYwfSwKLSAgICAgIHsweDAxZWIsMHgwMWU2LDB4MDNmMn0KLSAgICB9LAotICAgIHsKLSAgICAgIHsweDAwMGEsMHgwMDM1LDB4MDFlZn0sCi0gICAgICB7MHgwMDM0LDB4MDAzNywweDAxZTl9LAotICAgICAgezB4MDFlZCwweDAxZTcsMHgwM2YzfQotICAgIH0sCi0gICAgewotICAgICAgezB4MDFlZSwweDAzZWQsMHgxZmZhfSwKLSAgICAgIHsweDAxZWMsMHgwMWYyLDB4MDdmOX0sCi0gICAgICB7MHgwN2Y4LDB4MDNmOCwweDBmZjh9Ci0gICAgfQotICB9LAotICB7Ci0gICAgewotICAgICAgezB4MDAwOCwweDAwMzgsMHgwM2Y2fSwKLSAgICAgIHsweDAwMzYsMHgwMDc1LDB4MDNmMX0sCi0gICAgICB7MHgwM2ViLDB4MDNlYywweDBmZjR9Ci0gICAgfSwKLSAgICB7Ci0gICAgICB7MHgwMDE4LDB4MDA3NiwweDA3ZjR9LAotICAgICAgezB4MDAzOSwweDAwNzQsMHgwM2VmfSwKLSAgICAgIHsweDAxZjMsMHgwMWY0LDB4MDdmNn0KLSAgICB9LAotICAgIHsKLSAgICAgIHsweDAxZTgsMHgwM2VhLDB4MWZmY30sCi0gICAgICB7MHgwMGYyLDB4MDFmMSwweDBmZmJ9LAotICAgICAgezB4MDNmNSwweDA3ZjMsMHgwZmZjfQotICAgIH0KLSAgfSwKLSAgewotICAgIHsKLSAgICAgIHsweDAwZWUsMHgwM2Y3LDB4N2ZmZX0sCi0gICAgICB7MHgwMWYwLDB4MDdmNSwweDdmZmR9LAotICAgICAgezB4MWZmYiwweDNmZmEsMHhmZmZmfQotICAgIH0sCi0gICAgewotICAgICAgezB4MDBmMSwweDAzZjAsMHgzZmZjfSwKLSAgICAgIHsweDAxZWEsMHgwM2VlLDB4M2ZmYn0sCi0gICAgICB7MHgwZmY2LDB4MGZmYSwweDdmZmN9Ci0gICAgfSwKLSAgICB7Ci0gICAgICB7MHgwN2YyLDB4MGZmNSwweGZmZmV9LAotICAgICAgezB4MDNmNCwweDA3ZjcsMHg3ZmZifSwKLSAgICAgIHsweDBmZjcsMHgwZmY5LDB4N2ZmYX0KLSAgICB9Ci0gIH0KLX07Ci0KLWNvbnN0IFVXb3JkMTYgaHVmZl9jdGFiNFszXVszXVszXVszXT0KLXsKLSAgewotICAgIHsKLSAgICAgIHsweDAwMDcsMHgwMDE2LDB4MDBmNn0sCi0gICAgICB7MHgwMDE4LDB4MDAwOCwweDAwZWZ9LAotICAgICAgezB4MDFlZiwweDAwZjMsMHgwN2Y4fQotICAgIH0sCi0gICAgewotICAgICAgezB4MDAxOSwweDAwMTcsMHgwMGVkfSwKLSAgICAgIHsweDAwMTUsMHgwMDAxLDB4MDBlMn0sCi0gICAgICB7MHgwMGYwLDB4MDA3MCwweDAzZjB9Ci0gICAgfSwKLSAgICB7Ci0gICAgICB7MHgwMWVlLDB4MDBmMSwweDA3ZmF9LAotICAgICAgezB4MDBlZSwweDAwZTQsMHgwM2YyfSwKLSAgICAgIHsweDA3ZjYsMHgwM2VmLDB4MDdmZH0KLSAgICB9Ci0gIH0sCi0gIHsKLSAgICB7Ci0gICAgICB7MHgwMDA1LDB4MDAxNCwweDAwZjJ9LAotICAgICAgezB4MDAwOSwweDAwMDQsMHgwMGU1fSwKLSAgICAgIHsweDAwZjQsMHgwMGU4LDB4MDNmNH0KLSAgICB9LAotICAgIHsKLSAgICAgIHsweDAwMDYsMHgwMDAyLDB4MDBlN30sCi0gICAgICB7MHgwMDAzLDB4MDAwMCwweDAwNmJ9LAotICAgICAgezB4MDBlMywweDAwNjksMHgwMWYzfQotICAgIH0sCi0gICAgewotICAgICAgezB4MDBlYiwweDAwZTYsMHgwM2Y2fSwKLSAgICAgIHsweDAwNmUsMHgwMDZhLDB4MDFmNH0sCi0gICAgICB7MHgwM2VjLDB4MDFmMCwweDAzZjl9Ci0gICAgfQotICB9LAotICB7Ci0gICAgewotICAgICAgezB4MDBmNSwweDAwZWMsMHgwN2ZifSwKLSAgICAgIHsweDAwZWEsMHgwMDZmLDB4MDNmN30sCi0gICAgICB7MHgwN2Y5LDB4MDNmMywweDBmZmZ9Ci0gICAgfSwKLSAgICB7Ci0gICAgICB7MHgwMGU5LDB4MDA2ZCwweDAzZjh9LAotICAgICAgezB4MDA2YywweDAwNjgsMHgwMWY1fSwKLSAgICAgIHsweDAzZWUsMHgwMWYyLDB4MDdmNH0KLSAgICB9LAotICAgIHsKLSAgICAgIHsweDA3ZjcsMHgwM2YxLDB4MGZmZX0sCi0gICAgICB7MHgwM2VkLDB4MDFmMSwweDA3ZjV9LAotICAgICAgezB4MDdmZSwweDAzZjUsMHgwN2ZjfQotICAgIH0KLSAgfQotfTsKLWNvbnN0IFVXb3JkMTYgaHVmZl9jdGFiNVs5XVs5XT0KLXsKLSAgezB4MWZmZiwweDBmZjcsMHgwN2Y0LDB4MDdlOCwweDAzZjEsMHgwN2VlLDB4MDdmOSwweDBmZjgsMHgxZmZkfSwKLSAgezB4MGZmZCwweDA3ZjEsMHgwM2U4LDB4MDFlOCwweDAwZjAsMHgwMWVjLDB4MDNlZSwweDA3ZjIsMHgwZmZhfSwKLSAgezB4MGZmNCwweDAzZWYsMHgwMWYyLDB4MDBlOCwweDAwNzAsMHgwMGVjLDB4MDFmMCwweDAzZWEsMHgwN2YzfSwKLSAgezB4MDdlYiwweDAxZWIsMHgwMGVhLDB4MDAxYSwweDAwMDgsMHgwMDE5LDB4MDBlZSwweDAxZWYsMHgwN2VkfSwKLSAgezB4MDNmMCwweDAwZjIsMHgwMDczLDB4MDAwYiwweDAwMDAsMHgwMDBhLDB4MDA3MSwweDAwZjMsMHgwN2U5fSwKLSAgezB4MDdlZiwweDAxZWUsMHgwMGVmLDB4MDAxOCwweDAwMDksMHgwMDFiLDB4MDBlYiwweDAxZTksMHgwN2VjfSwKLSAgezB4MDdmNiwweDAzZWIsMHgwMWYzLDB4MDBlZCwweDAwNzIsMHgwMGU5LDB4MDFmMSwweDAzZWQsMHgwN2Y3fSwKLSAgezB4MGZmNiwweDA3ZjAsMHgwM2U5LDB4MDFlZCwweDAwZjEsMHgwMWVhLDB4MDNlYywweDA3ZjgsMHgwZmY5fSwKLSAgezB4MWZmYywweDBmZmMsMHgwZmY1LDB4MDdlYSwweDAzZjMsMHgwM2YyLDB4MDdmNSwweDBmZmIsMHgxZmZlfQotfTsKLQotY29uc3QgVVdvcmQxNiBodWZmX2N0YWI2WzldWzldPQotewotICB7MHgwN2ZlLDB4MDNmZCwweDAxZjEsMHgwMWViLDB4MDFmNCwweDAxZWEsMHgwMWYwLDB4MDNmYywweDA3ZmR9LAotICB7MHgwM2Y2LDB4MDFlNSwweDAwZWEsMHgwMDZjLDB4MDA3MSwweDAwNjgsMHgwMGYwLDB4MDFlNiwweDAzZjd9LAotICB7MHgwMWYzLDB4MDBlZiwweDAwMzIsMHgwMDI3LDB4MDAyOCwweDAwMjYsMHgwMDMxLDB4MDBlYiwweDAxZjd9LAotICB7MHgwMWU4LDB4MDA2ZiwweDAwMmUsMHgwMDA4LDB4MDAwNCwweDAwMDYsMHgwMDI5LDB4MDA2YiwweDAxZWV9LAotICB7MHgwMWVmLDB4MDA3MiwweDAwMmQsMHgwMDAyLDB4MDAwMCwweDAwMDMsMHgwMDJmLDB4MDA3MywweDAxZmF9LAotICB7MHgwMWU3LDB4MDA2ZSwweDAwMmIsMHgwMDA3LDB4MDAwMSwweDAwMDUsMHgwMDJjLDB4MDA2ZCwweDAxZWN9LAotICB7MHgwMWY5LDB4MDBlZSwweDAwMzAsMHgwMDI0LDB4MDAyYSwweDAwMjUsMHgwMDMzLDB4MDBlYywweDAxZjJ9LAotICB7MHgwM2Y4LDB4MDFlNCwweDAwZWQsMHgwMDZhLDB4MDA3MCwweDAwNjksMHgwMDc0LDB4MDBmMSwweDAzZmF9LAotICB7MHgwN2ZmLDB4MDNmOSwweDAxZjYsMHgwMWVkLDB4MDFmOCwweDAxZTksMHgwMWY1LDB4MDNmYiwweDA3ZmN9Ci19OwotCi1jb25zdCBVV29yZDE2IGh1ZmZfY3RhYjdbOF1bOF09Ci17Ci0gIHsweDAwMDAsMHgwMDA1LDB4MDAzNywweDAwNzQsMHgwMGYyLDB4MDFlYiwweDAzZWQsMHgwN2Y3fSwKLSAgezB4MDAwNCwweDAwMGMsMHgwMDM1LDB4MDA3MSwweDAwZWMsMHgwMGVlLDB4MDFlZSwweDAxZjV9LAotICB7MHgwMDM2LDB4MDAzNCwweDAwNzIsMHgwMGVhLDB4MDBmMSwweDAxZTksMHgwMWYzLDB4MDNmNX0sCi0gIHsweDAwNzMsMHgwMDcwLDB4MDBlYiwweDAwZjAsMHgwMWYxLDB4MDFmMCwweDAzZWMsMHgwM2ZhfSwKLSAgezB4MDBmMywweDAwZWQsMHgwMWU4LDB4MDFlZiwweDAzZWYsMHgwM2YxLDB4MDNmOSwweDA3ZmJ9LAotICB7MHgwMWVkLDB4MDBlZiwweDAxZWEsMHgwMWYyLDB4MDNmMywweDAzZjgsMHgwN2Y5LDB4MDdmY30sCi0gIHsweDAzZWUsMHgwMWVjLDB4MDFmNCwweDAzZjQsMHgwM2Y3LDB4MDdmOCwweDBmZmQsMHgwZmZlfSwKLSAgezB4MDdmNiwweDAzZjAsMHgwM2YyLDB4MDNmNiwweDA3ZmEsMHgwN2ZkLDB4MGZmYywweDBmZmZ9Ci19OwotCi1jb25zdCBVV29yZDE2IGh1ZmZfY3RhYjhbOF1bOF09Ci17Ci0gIHsweDAwMGUsMHgwMDA1LDB4MDAxMCwweDAwMzAsMHgwMDZmLDB4MDBmMSwweDAxZmEsMHgwM2ZlfSwKLSAgezB4MDAwMywweDAwMDAsMHgwMDA0LDB4MDAxMiwweDAwMmMsMHgwMDZhLDB4MDA3NSwweDAwZjh9LAotICB7MHgwMDBmLDB4MDAwMiwweDAwMDYsMHgwMDE0LDB4MDAyZSwweDAwNjksMHgwMDcyLDB4MDBmNX0sCi0gIHsweDAwMmYsMHgwMDExLDB4MDAxMywweDAwMmEsMHgwMDMyLDB4MDA2YywweDAwZWMsMHgwMGZhfSwKLSAgezB4MDA3MSwweDAwMmIsMHgwMDJkLDB4MDAzMSwweDAwNmQsMHgwMDcwLDB4MDBmMiwweDAxZjl9LAotICB7MHgwMGVmLDB4MDA2OCwweDAwMzMsMHgwMDZiLDB4MDA2ZSwweDAwZWUsMHgwMGY5LDB4MDNmY30sCi0gIHsweDAxZjgsMHgwMDc0LDB4MDA3MywweDAwZWQsMHgwMGYwLDB4MDBmNiwweDAxZjYsMHgwMWZkfSwKLSAgezB4MDNmZCwweDAwZjMsMHgwMGY0LDB4MDBmNywweDAxZjcsMHgwMWZiLDB4MDFmYywweDAzZmZ9Ci19OwotCi1jb25zdCBVV29yZDE2IGh1ZmZfY3RhYjlbMTNdWzEzXT0KLXsKLSAgezB4MDAwMCwweDAwMDUsMHgwMDM3LDB4MDBlNywweDAxZGUsMHgwM2NlLDB4MDNkOSwweDA3YzgsMHgwN2NkLDB4MGZjOCwweDBmZGQsMHgxZmU0LDB4MWZlY30sCi0gIHsweDAwMDQsMHgwMDBjLDB4MDAzNSwweDAwNzIsMHgwMGVhLDB4MDBlZCwweDAxZTIsMHgwM2QxLDB4MDNkMywweDAzZTAsMHgwN2Q4LDB4MGZjZiwweDBmZDV9LAotICB7MHgwMDM2LDB4MDAzNCwweDAwNzEsMHgwMGU4LDB4MDBlYywweDAxZTEsMHgwM2NmLDB4MDNkZCwweDAzZGIsMHgwN2QwLDB4MGZjNywweDBmZDQsMHgwZmU0fSwKLSAgezB4MDBlNiwweDAwNzAsMHgwMGU5LDB4MDFkZCwweDAxZTMsMHgwM2QyLDB4MDNkYywweDA3Y2MsMHgwN2NhLDB4MDdkZSwweDBmZDgsMHgwZmVhLDB4MWZkYn0sCi0gIHsweDAxZGYsMHgwMGViLDB4MDFkYywweDAxZTYsMHgwM2Q1LDB4MDNkZSwweDA3Y2IsMHgwN2RkLDB4MDdkYywweDBmY2QsMHgwZmUyLDB4MGZlNywweDFmZTF9LAotICB7MHgwM2QwLDB4MDFlMCwweDAxZTQsMHgwM2Q2LDB4MDdjNSwweDA3ZDEsMHgwN2RiLDB4MGZkMiwweDA3ZTAsMHgwZmQ5LDB4MGZlYiwweDFmZTMsMHgxZmU5fSwKLSAgezB4MDdjNCwweDAxZTUsMHgwM2Q3LDB4MDdjNiwweDA3Y2YsMHgwN2RhLDB4MGZjYiwweDBmZGEsMHgwZmUzLDB4MGZlOSwweDFmZTYsMHgxZmYzLDB4MWZmN30sCi0gIHsweDA3ZDMsMHgwM2Q4LDB4MDNlMSwweDA3ZDQsMHgwN2Q5LDB4MGZkMywweDBmZGUsMHgxZmRkLDB4MWZkOSwweDFmZTIsMHgxZmVhLDB4MWZmMSwweDFmZjZ9LAotICB7MHgwN2QyLDB4MDNkNCwweDAzZGEsMHgwN2M3LDB4MDdkNywweDA3ZTIsMHgwZmNlLDB4MGZkYiwweDFmZDgsMHgxZmVlLDB4M2ZmMCwweDFmZjQsMHgzZmYyfSwKLSAgezB4MDdlMSwweDAzZGYsMHgwN2M5LDB4MDdkNiwweDBmY2EsMHgwZmQwLDB4MGZlNSwweDBmZTYsMHgxZmViLDB4MWZlZiwweDNmZjMsMHgzZmY0LDB4M2ZmNX0sCi0gIHsweDBmZTAsMHgwN2NlLDB4MDdkNSwweDBmYzYsMHgwZmQxLDB4MGZlMSwweDFmZTAsMHgxZmU4LDB4MWZmMCwweDNmZjEsMHgzZmY4LDB4M2ZmNiwweDdmZmN9LAotICB7MHgwZmU4LDB4MDdkZiwweDBmYzksMHgwZmQ3LDB4MGZkYywweDFmZGMsMHgxZmRmLDB4MWZlZCwweDFmZjUsMHgzZmY5LDB4M2ZmYiwweDdmZmQsMHg3ZmZlfSwKLSAgezB4MWZlNywweDBmY2MsMHgwZmQ2LDB4MGZkZiwweDFmZGUsMHgxZmRhLDB4MWZlNSwweDFmZjIsMHgzZmZhLDB4M2ZmNywweDNmZmMsMHgzZmZkLDB4N2ZmZn0KLX07Ci0KLWNvbnN0IFVXb3JkMTYgaHVmZl9jdGFiMTBbMTNdWzEzXT0KLXsKLSAgezB4MDAyMiwweDAwMDgsMHgwMDFkLDB4MDAyNiwweDAwNWYsMHgwMGQzLDB4MDFjZiwweDAzZDAsMHgwM2Q3LDB4MDNlZCwweDA3ZjAsMHgwN2Y2LDB4MGZmZH0sCi0gIHsweDAwMDcsMHgwMDAwLDB4MDAwMSwweDAwMDksMHgwMDIwLDB4MDA1NCwweDAwNjAsMHgwMGQ1LDB4MDBkYywweDAxZDQsMHgwM2NkLDB4MDNkZSwweDA3ZTd9LAotICB7MHgwMDFjLDB4MDAwMiwweDAwMDYsMHgwMDBjLDB4MDAxZSwweDAwMjgsMHgwMDViLDB4MDBjZCwweDAwZDksMHgwMWNlLDB4MDFkYywweDAzZDksMHgwM2YxfSwKLSAgezB4MDAyNSwweDAwMGIsMHgwMDBhLDB4MDAwZCwweDAwMjQsMHgwMDU3LDB4MDA2MSwweDAwY2MsMHgwMGRkLDB4MDFjYywweDAxZGUsMHgwM2QzLDB4MDNlN30sCi0gIHsweDAwNWQsMHgwMDIxLDB4MDAxZiwweDAwMjMsMHgwMDI3LDB4MDA1OSwweDAwNjQsMHgwMGQ4LDB4MDBkZiwweDAxZDIsMHgwMWUyLDB4MDNkZCwweDAzZWV9LAotICB7MHgwMGQxLDB4MDA1NSwweDAwMjksMHgwMDU2LDB4MDA1OCwweDAwNjIsMHgwMGNlLDB4MDBlMCwweDAwZTIsMHgwMWRhLDB4MDNkNCwweDAzZTMsMHgwN2VifSwKLSAgezB4MDFjOSwweDAwNWUsMHgwMDVhLDB4MDA1YywweDAwNjMsMHgwMGNhLDB4MDBkYSwweDAxYzcsMHgwMWNhLDB4MDFlMCwweDAzZGIsMHgwM2U4LDB4MDdlY30sCi0gIHsweDAxZTMsMHgwMGQyLDB4MDBjYiwweDAwZDAsMHgwMGQ3LDB4MDBkYiwweDAxYzYsMHgwMWQ1LDB4MDFkOCwweDAzY2EsMHgwM2RhLDB4MDdlYSwweDA3ZjF9LAotICB7MHgwMWUxLDB4MDBkNCwweDAwY2YsMHgwMGQ2LDB4MDBkZSwweDAwZTEsMHgwMWQwLDB4MDFkNiwweDAzZDEsMHgwM2Q1LDB4MDNmMiwweDA3ZWUsMHgwN2ZifSwKLSAgezB4MDNlOSwweDAxY2QsMHgwMWM4LDB4MDFjYiwweDAxZDEsMHgwMWQ3LDB4MDFkZiwweDAzY2YsMHgwM2UwLDB4MDNlZiwweDA3ZTYsMHgwN2Y4LDB4MGZmYX0sCi0gIHsweDAzZWIsMHgwMWRkLDB4MDFkMywweDAxZDksMHgwMWRiLDB4MDNkMiwweDAzY2MsMHgwM2RjLDB4MDNlYSwweDA3ZWQsMHgwN2YzLDB4MDdmOSwweDBmZjl9LAotICB7MHgwN2YyLDB4MDNjZSwweDAxZTQsMHgwM2NiLDB4MDNkOCwweDAzZDYsMHgwM2UyLDB4MDNlNSwweDA3ZTgsMHgwN2Y0LDB4MDdmNSwweDA3ZjcsMHgwZmZifSwKLSAgezB4MDdmYSwweDAzZWMsMHgwM2RmLDB4MDNlMSwweDAzZTQsMHgwM2U2LDB4MDNmMCwweDA3ZTksMHgwN2VmLDB4MGZmOCwweDBmZmUsMHgwZmZjLDB4MGZmZn0KLX07Ci0KLWNvbnN0IFVXb3JkMTYgaHVmZl9jdGFiMTFbMTddWzE3XT0KLXsKLSAgezB4MDAwMCwweDAwMDYsMHgwMDE5LDB4MDAzZCwweDAwOWMsMHgwMGM2LDB4MDFhNywweDAzOTAsMHgwM2MyLDB4MDNkZiwweDA3ZTYsMHgwN2YzLDB4MGZmYiwweDA3ZWMsMHgwZmZhLDB4MGZmZSwweDAzOGV9LAotICB7MHgwMDA1LDB4MDAwMSwweDAwMDgsMHgwMDE0LDB4MDAzNywweDAwNDIsMHgwMDkyLDB4MDBhZiwweDAxOTEsMHgwMWE1LDB4MDFiNSwweDAzOWUsMHgwM2MwLDB4MDNhMiwweDAzY2QsMHgwN2Q2LDB4MDBhZX0sCi0gIHsweDAwMTcsMHgwMDA3LDB4MDAwOSwweDAwMTgsMHgwMDM5LDB4MDA0MCwweDAwOGUsMHgwMGEzLDB4MDBiOCwweDAxOTksMHgwMWFjLDB4MDFjMSwweDAzYjEsMHgwMzk2LDB4MDNiZSwweDAzY2EsMHgwMDlkfSwKLSAgezB4MDAzYywweDAwMTUsMHgwMDE2LDB4MDAxYSwweDAwM2IsMHgwMDQ0LDB4MDA5MSwweDAwYTUsMHgwMGJlLDB4MDE5NiwweDAxYWUsMHgwMWI5LDB4MDNhMSwweDAzOTEsMHgwM2E1LDB4MDNkNSwweDAwOTR9LAotICB7MHgwMDlhLDB4MDAzNiwweDAwMzgsMHgwMDNhLDB4MDA0MSwweDAwOGMsMHgwMDliLDB4MDBiMCwweDAwYzMsMHgwMTllLDB4MDFhYiwweDAxYmMsMHgwMzlmLDB4MDM4ZiwweDAzYTksMHgwM2NmLDB4MDA5M30sCi0gIHsweDAwYmYsMHgwMDNlLDB4MDAzZiwweDAwNDMsMHgwMDQ1LDB4MDA5ZSwweDAwYTcsMHgwMGI5LDB4MDE5NCwweDAxYTIsMHgwMWJhLDB4MDFjMywweDAzYTYsMHgwM2E3LDB4MDNiYiwweDAzZDQsMHgwMDlmfSwKLSAgezB4MDFhMCwweDAwOGYsMHgwMDhkLDB4MDA5MCwweDAwOTgsMHgwMGE2LDB4MDBiNiwweDAwYzQsMHgwMTlmLDB4MDFhZiwweDAxYmYsMHgwMzk5LDB4MDNiZiwweDAzYjQsMHgwM2M5LDB4MDNlNywweDAwYTh9LAotICB7MHgwMWI2LDB4MDBhYiwweDAwYTQsMHgwMGFhLDB4MDBiMiwweDAwYzIsMHgwMGM1LDB4MDE5OCwweDAxYTQsMHgwMWI4LDB4MDM4YywweDAzYTQsMHgwM2M0LDB4MDNjNiwweDAzZGQsMHgwM2U4LDB4MDBhZH0sCi0gIHsweDAzYWYsMHgwMTkyLDB4MDBiZCwweDAwYmMsMHgwMThlLDB4MDE5NywweDAxOWEsMHgwMWEzLDB4MDFiMSwweDAzOGQsMHgwMzk4LDB4MDNiNywweDAzZDMsMHgwM2QxLDB4MDNkYiwweDA3ZGQsMHgwMGI0fSwKLSAgezB4MDNkZSwweDAxYTksMHgwMTliLDB4MDE5YywweDAxYTEsMHgwMWFhLDB4MDFhZCwweDAxYjMsMHgwMzhiLDB4MDNiMiwweDAzYjgsMHgwM2NlLDB4MDNlMSwweDAzZTAsMHgwN2QyLDB4MDdlNSwweDAwYjd9LAotICB7MHgwN2UzLDB4MDFiYiwweDAxYTgsMHgwMWE2LDB4MDFiMCwweDAxYjIsMHgwMWI3LDB4MDM5YiwweDAzOWEsMHgwM2JhLDB4MDNiNSwweDAzZDYsMHgwN2Q3LDB4MDNlNCwweDA3ZDgsMHgwN2VhLDB4MDBiYX0sCi0gIHsweDA3ZTgsMHgwM2EwLDB4MDFiZCwweDAxYjQsMHgwMzhhLDB4MDFjNCwweDAzOTIsMHgwM2FhLDB4MDNiMCwweDAzYmMsMHgwM2Q3LDB4MDdkNCwweDA3ZGMsMHgwN2RiLDB4MDdkNSwweDA3ZjAsMHgwMGMxfSwKLSAgezB4MDdmYiwweDAzYzgsMHgwM2EzLDB4MDM5NSwweDAzOWQsMHgwM2FjLDB4MDNhZSwweDAzYzUsMHgwM2Q4LDB4MDNlMiwweDAzZTYsMHgwN2U0LDB4MDdlNywweDA3ZTAsMHgwN2U5LDB4MDdmNywweDAxOTB9LAotICB7MHgwN2YyLDB4MDM5MywweDAxYmUsMHgwMWMwLDB4MDM5NCwweDAzOTcsMHgwM2FkLDB4MDNjMywweDAzYzEsMHgwM2QyLDB4MDdkYSwweDA3ZDksMHgwN2RmLDB4MDdlYiwweDA3ZjQsMHgwN2ZhLDB4MDE5NX0sCi0gIHsweDA3ZjgsMHgwM2JkLDB4MDM5YywweDAzYWIsMHgwM2E4LDB4MDNiMywweDAzYjksMHgwM2QwLDB4MDNlMywweDAzZTUsMHgwN2UyLDB4MDdkZSwweDA3ZWQsMHgwN2YxLDB4MDdmOSwweDA3ZmMsMHgwMTkzfSwKLSAgezB4MGZmZCwweDAzZGMsMHgwM2I2LDB4MDNjNywweDAzY2MsMHgwM2NiLDB4MDNkOSwweDAzZGEsMHgwN2QzLDB4MDdlMSwweDA3ZWUsMHgwN2VmLDB4MDdmNSwweDA3ZjYsMHgwZmZjLDB4MGZmZiwweDAxOWR9LAotICB7MHgwMWMyLDB4MDBiNSwweDAwYTEsMHgwMDk2LDB4MDA5NywweDAwOTUsMHgwMDk5LDB4MDBhMCwweDAwYTIsMHgwMGFjLDB4MDBhOSwweDAwYjEsMHgwMGIzLDB4MDBiYiwweDAwYzAsMHgwMThmLDB4MDAwNH0KLX07Ci0KLWNvbnN0IFVXb3JkMzIgaHVmZl9jdGFic2NmWzEyMV09Ci17Ci0gIDB4MDAwM2ZmZTgsCi0gIDB4MDAwM2ZmZTYsCi0gIDB4MDAwM2ZmZTcsCi0gIDB4MDAwM2ZmZTUsCi0gIDB4MDAwN2ZmZjUsCi0gIDB4MDAwN2ZmZjEsCi0gIDB4MDAwN2ZmZWQsCi0gIDB4MDAwN2ZmZjYsCi0gIDB4MDAwN2ZmZWUsCi0gIDB4MDAwN2ZmZWYsCi0gIDB4MDAwN2ZmZjAsCi0gIDB4MDAwN2ZmZmMsCi0gIDB4MDAwN2ZmZmQsCi0gIDB4MDAwN2ZmZmYsCi0gIDB4MDAwN2ZmZmUsCi0gIDB4MDAwN2ZmZjcsCi0gIDB4MDAwN2ZmZjgsCi0gIDB4MDAwN2ZmZmIsCi0gIDB4MDAwN2ZmZjksCi0gIDB4MDAwM2ZmZTQsCi0gIDB4MDAwN2ZmZmEsCi0gIDB4MDAwM2ZmZTMsCi0gIDB4MDAwMWZmZWYsCi0gIDB4MDAwMWZmZjAsCi0gIDB4MDAwMGZmZjUsCi0gIDB4MDAwMWZmZWUsCi0gIDB4MDAwMGZmZjIsCi0gIDB4MDAwMGZmZjMsCi0gIDB4MDAwMGZmZjQsCi0gIDB4MDAwMGZmZjEsCi0gIDB4MDAwMDdmZjYsCi0gIDB4MDAwMDdmZjcsCi0gIDB4MDAwMDNmZjksCi0gIDB4MDAwMDNmZjUsCi0gIDB4MDAwMDNmZjcsCi0gIDB4MDAwMDNmZjMsCi0gIDB4MDAwMDNmZjYsCi0gIDB4MDAwMDNmZjIsCi0gIDB4MDAwMDFmZjcsCi0gIDB4MDAwMDFmZjUsCi0gIDB4MDAwMDBmZjksCi0gIDB4MDAwMDBmZjcsCi0gIDB4MDAwMDBmZjYsCi0gIDB4MDAwMDA3ZjksCi0gIDB4MDAwMDBmZjQsCi0gIDB4MDAwMDA3ZjgsCi0gIDB4MDAwMDAzZjksCi0gIDB4MDAwMDAzZjcsCi0gIDB4MDAwMDAzZjUsCi0gIDB4MDAwMDAxZjgsCi0gIDB4MDAwMDAxZjcsCi0gIDB4MDAwMDAwZmEsCi0gIDB4MDAwMDAwZjgsCi0gIDB4MDAwMDAwZjYsCi0gIDB4MDAwMDAwNzksCi0gIDB4MDAwMDAwM2EsCi0gIDB4MDAwMDAwMzgsCi0gIDB4MDAwMDAwMWEsCi0gIDB4MDAwMDAwMGIsCi0gIDB4MDAwMDAwMDQsCi0gIDB4MDAwMDAwMDAsCi0gIDB4MDAwMDAwMGEsCi0gIDB4MDAwMDAwMGMsCi0gIDB4MDAwMDAwMWIsCi0gIDB4MDAwMDAwMzksCi0gIDB4MDAwMDAwM2IsCi0gIDB4MDAwMDAwNzgsCi0gIDB4MDAwMDAwN2EsCi0gIDB4MDAwMDAwZjcsCi0gIDB4MDAwMDAwZjksCi0gIDB4MDAwMDAxZjYsCi0gIDB4MDAwMDAxZjksCi0gIDB4MDAwMDAzZjQsCi0gIDB4MDAwMDAzZjYsCi0gIDB4MDAwMDAzZjgsCi0gIDB4MDAwMDA3ZjUsCi0gIDB4MDAwMDA3ZjQsCi0gIDB4MDAwMDA3ZjYsCi0gIDB4MDAwMDA3ZjcsCi0gIDB4MDAwMDBmZjUsCi0gIDB4MDAwMDBmZjgsCi0gIDB4MDAwMDFmZjQsCi0gIDB4MDAwMDFmZjYsCi0gIDB4MDAwMDFmZjgsCi0gIDB4MDAwMDNmZjgsCi0gIDB4MDAwMDNmZjQsCi0gIDB4MDAwMGZmZjAsCi0gIDB4MDAwMDdmZjQsCi0gIDB4MDAwMGZmZjYsCi0gIDB4MDAwMDdmZjUsCi0gIDB4MDAwM2ZmZTIsCi0gIDB4MDAwN2ZmZDksCi0gIDB4MDAwN2ZmZGEsCi0gIDB4MDAwN2ZmZGIsCi0gIDB4MDAwN2ZmZGMsCi0gIDB4MDAwN2ZmZGQsCi0gIDB4MDAwN2ZmZGUsCi0gIDB4MDAwN2ZmZDgsCi0gIDB4MDAwN2ZmZDIsCi0gIDB4MDAwN2ZmZDMsCi0gIDB4MDAwN2ZmZDQsCi0gIDB4MDAwN2ZmZDUsCi0gIDB4MDAwN2ZmZDYsCi0gIDB4MDAwN2ZmZjIsCi0gIDB4MDAwN2ZmZGYsCi0gIDB4MDAwN2ZmZTcsCi0gIDB4MDAwN2ZmZTgsCi0gIDB4MDAwN2ZmZTksCi0gIDB4MDAwN2ZmZWEsCi0gIDB4MDAwN2ZmZWIsCi0gIDB4MDAwN2ZmZTYsCi0gIDB4MDAwN2ZmZTAsCi0gIDB4MDAwN2ZmZTEsCi0gIDB4MDAwN2ZmZTIsCi0gIDB4MDAwN2ZmZTMsCi0gIDB4MDAwN2ZmZTQsCi0gIDB4MDAwN2ZmZTUsCi0gIDB4MDAwN2ZmZDcsCi0gIDB4MDAwN2ZmZWMsCi0gIDB4MDAwN2ZmZjQsCi0gIDB4MDAwN2ZmZjMKLX07Ci0KLWNvbnN0IFdvcmQzMiBtX2xvZzJfdGFibGVbSU5UX0JJVFNdID0gewotICAweDAwMDAwMDAwLDB4NGFlMDBkMDAsMHgyOTM0ZjA4MCwweDE1YzAxYTNmLAotICAweDBiMzFmYjgwLDB4MDVhZWI0ZTAsMHgwMmRjZjJkMCwweDAxNmZlNTBjLAotICAweDAwYjg0ZTIzLDB4MDA1YzNlMTAsMHgwMDJlMjRjYSwweDAwMTcxM2Q2LAotICAweDAwMGI4YTQ3LDB4MDAwNWM1M2IsMHgwMDAyZTJhMywweDAwMDE3MTUzLAotICAweDAwMDBiOGFhLDB4MDAwMDVjNTUsMHgwMDAwMmUyYiwweDAwMDAxNzE1LAotICAweDAwMDAwYjhiLDB4MDAwMDA1YzUsMHgwMDAwMDJlMywweDAwMDAwMTcxLAotICAweDAwMDAwMGI5LDB4MDAwMDAwNWMsMHgwMDAwMDAyZSwweDAwMDAwMDE3LAotICAweDAwMDAwMDBjLDB4MDAwMDAwMDYsMHgwMDAwMDAwMywweDAwMDAwMDAxCi19OwotCi0KLS8qCi0gIDMgYml0IHJlc29sdXRpb24KLSovCi1jb25zdCBXb3JkMzIgdG5zQ29lZmYzWzhdID0KLXsKLSAgMHg4MWYxZDFkNCwKLSAgMHg5MTI2MTQ3YywKLSAgMHhhZGI5MjJmNywKLSAgMHhkNDM4YWYwOSwKLSAgMHgwMDAwMDAwMCwKLSAgMHgzNzg5ODA4NywKLSAgMHg2NDEzMGRmYSwKLSAgMHg3Y2NhNmZmYiwKLX07Ci0KLWNvbnN0IFdvcmQzMiB0bnNDb2VmZjNCb3JkZXJzWzhdID0KLXsKLSAgMHg4MDAwMDAwMCwgIC8qIC00ICovCi0gIDB4ODdiODI2ZGUsICAvKiAtMyAqLwotICAweDlkZjI0MTUzLCAgLyogLTIgKi8KLSAgMHhiZmZmZmZlNSwgIC8qIC0xICovCi0gIDB4ZTljNWU1NzgsICAvKiAgMCAqLwotICAweDFjN2I5MGYwLCAgLyogIDEgKi8KLSAgMHg0ZmNlODNhYSwgIC8qICAyICovCi0gIDB4NzM1MmYyYzQsICAvKiAgMyAqLwotfTsKLQotCi0vKgotICA0IGJpdCByZXNvbHV0aW9uCi0qLwotCi1jb25zdCBXb3JkMzIgdG5zQ29lZmY0WzE2XSA9Ci17Ci0gIDB4ODA4YmM4NGIsCi0gIDB4ODRlMmU1N2QsCi0gIDB4OGQ2YjQ5ZmIsCi0gIDB4OTlkYTkyMDcsCi0gIDB4YTljNDU3MDcsCi0gIDB4YmM5ZGRlNzgsCi0gIDB4ZDFjMmQ0ZmMsCi0gIDB4ZTg3YWU1MzksCi0gIDB4MDAwMDAwMDAsCi0gIDB4MWE5Y2Q5YzAsCi0gIDB4MzQwZmYyM2IsCi0gIDB4NGIzYzhiZjcsCi0gIDB4NWYxZjVlODAsCi0gIDB4NmVkOWViODQsCi0gIDB4NzliYzM4ODAsCi0gIDB4N2Y0YzdlODkKLX07Ci0KLWNvbnN0IFdvcmQzMiB0bnNDb2VmZjRCb3JkZXJzWzE2XT0KLXsKLSAgMHg4MDAwMDAwMCwgIC8qIC04ICovCi0gIDB4ODIyZGVmZWYsICAvKiAtNyAqLwotICAweDg4YTRiZmU1LCAgLyogLTYgKi8KLSAgMHg5MzJjMTU5YywgIC8qIC01ICovCi0gIDB4YTE2ODI3YzEsICAvKiAtNCAqLwotICAweGIyZGNkZTI2LCAgLyogLTMgKi8KLSAgMHhjNmYyMGI5MSwgIC8qIC0yICovCi0gIDB4ZGNmODljNjQsICAvKiAtMSAqLwotICAweGY0MzA4Y2UxLCAgLyogIDAgKi8KLSAgMHgwZDYxMzA1NCwgIC8qICAxICovCi0gIDB4Mjc4ZGRlODAsICAvKiAgMiAqLwotICAweDQwMDAwMDFiLCAgLyogIDMgKi8KLSAgMHg1NWE2MTI3YywgIC8qICA0ICovCi0gIDB4Njc4ZGRlOGYsICAvKiAgNSAqLwotICAweDc0ZWYwZWQ4LCAgLyogIDYgKi8KLSAgMHg3ZDMzZjBkYiAgIC8qICA3ICovCi19OwotCi0KLWNvbnN0IHVuc2lnbmVkIGNoYXIgYml0cmV2VGFiWzE3ICsgMTI5XSA9Ci17Ci0vKiA2NCAqLwotMHgwMSwgMHgwOCwgMHgwMiwgMHgwNCwgMHgwMywgMHgwYywgMHgwNSwgMHgwYSwgMHgwNywgMHgwZSwgMHgwYiwgMHgwZCwgMHgwMCwgMHgwNiwgMHgwOSwgMHgwZiwKLTB4MDAsCi0KLS8qIDUxMiAqLwotMHgwMSwgMHg0MCwgMHgwMiwgMHgyMCwgMHgwMywgMHg2MCwgMHgwNCwgMHgxMCwgMHgwNSwgMHg1MCwgMHgwNiwgMHgzMCwgMHgwNywgMHg3MCwgMHgwOSwgMHg0OCwKLTB4MGEsIDB4MjgsIDB4MGIsIDB4NjgsIDB4MGMsIDB4MTgsIDB4MGQsIDB4NTgsIDB4MGUsIDB4MzgsIDB4MGYsIDB4NzgsIDB4MTEsIDB4NDQsIDB4MTIsIDB4MjQsCi0weDEzLCAweDY0LCAweDE1LCAweDU0LCAweDE2LCAweDM0LCAweDE3LCAweDc0LCAweDE5LCAweDRjLCAweDFhLCAweDJjLCAweDFiLCAweDZjLCAweDFkLCAweDVjLAotMHgxZSwgMHgzYywgMHgxZiwgMHg3YywgMHgyMSwgMHg0MiwgMHgyMywgMHg2MiwgMHgyNSwgMHg1MiwgMHgyNiwgMHgzMiwgMHgyNywgMHg3MiwgMHgyOSwgMHg0YSwKLTB4MmIsIDB4NmEsIDB4MmQsIDB4NWEsIDB4MmUsIDB4M2EsIDB4MmYsIDB4N2EsIDB4MzEsIDB4NDYsIDB4MzMsIDB4NjYsIDB4MzUsIDB4NTYsIDB4MzcsIDB4NzYsCi0weDM5LCAweDRlLCAweDNiLCAweDZlLCAweDNkLCAweDVlLCAweDNmLCAweDdlLCAweDQzLCAweDYxLCAweDQ1LCAweDUxLCAweDQ3LCAweDcxLCAweDRiLCAweDY5LAotMHg0ZCwgMHg1OSwgMHg0ZiwgMHg3OSwgMHg1MywgMHg2NSwgMHg1NywgMHg3NSwgMHg1YiwgMHg2ZCwgMHg1ZiwgMHg3ZCwgMHg2NywgMHg3MywgMHg2ZiwgMHg3YiwKLTB4MDAsIDB4MDgsIDB4MTQsIDB4MWMsIDB4MjIsIDB4MmEsIDB4MzYsIDB4M2UsIDB4NDEsIDB4NDksIDB4NTUsIDB4NWQsIDB4NjMsIDB4NmIsIDB4NzcsIDB4N2YsCi0weDAwLAotfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FhY2VuYy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYWFjZW5jLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMTc3ODcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYWFjZW5jLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MDUgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQlhYWNlbmMuYwotCi0JQ29udGVudDoJYWFjIGVuY29kZXIgaW50ZXJmYWNlIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAidm9BQUMuaCIKLSNpbmNsdWRlICJ0eXBlZGVmLmgiCi0jaW5jbHVkZSAiYWFjZW5jX2NvcmUuaCIKLSNpbmNsdWRlICJhYWNfcm9tLmgiCi0jaW5jbHVkZSAiY21uTWVtb3J5LmgiCi0jaW5jbHVkZSAibWVtYWxpZ24uaCIKLQotI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpCi0KLS8qKgotKiBJbml0IHRoZSBhdWRpbyBjb2RlYyBtb2R1bGUgYW5kIHJldHVybiBjb2RlYyBoYW5kbGUKLSogXHBhcmFtIHBoQ29kZWMgW09VVF0gUmV0dXJuIHRoZSB2aWRlbyBjb2RlYyBoYW5kbGUKLSogXHBhcmFtIHZUeXBlCVtJTl0gVGhlIGNvZGVjIHR5cGUgaWYgdGhlIG1vZHVsZSBzdXBwb3J0IG11bHRpIGNvZGVjLgotKiBccGFyYW0gcFVzZXJEYXRhCVtJTl0gVGhlIGluaXQgcGFyYW0uIEl0IGlzIG1lbW9yeSBvcGVyYXRvciBvciBhbGxvY2VkIG1lbW9yeQotKiBccmV0dmFsIFZPX0VSUl9OT05FIFN1Y2NlZWRlZC4KLSovCi1WT19VMzIgVk9fQVBJIHZvQUFDRW5jSW5pdChWT19IQU5ETEUgKiBwaENvZGVjLFZPX0FVRElPX0NPRElOR1RZUEUgdlR5cGUsIFZPX0NPREVDX0lOSVRfVVNFUkRBVEEgKnBVc2VyRGF0YSkKLXsKLQlBQUNfRU5DT0RFUipoQWFjRW5jOwotCWludCBlcnJvcjsKLQotI2lmZGVmIFVTRV9ERUFVTFRfTUVNCi0JVk9fTUVNX09QRVJBVE9SIHZvTWVtb3ByYXRvcjsKLSNlbmRpZgotCVZPX01FTV9PUEVSQVRPUiAqcE1lbU9QOwotCi0jaWZkZWYgVVNFX0RFQVVMVF9NRU0KLQlpbnQgaW50ZXJNZW07Ci0gICAgICAgIGludGVyTWVtID0gMDsKLSNlbmRpZgotCi0gICAgICAgIFVOVVNFRCh2VHlwZSk7Ci0KLQllcnJvciA9IDA7Ci0KLQkvKiBpbml0IHRoZSBtZW1vcnkgb3BlcmF0b3IgKi8KLQlpZihwVXNlckRhdGEgPT0gTlVMTCB8fCBwVXNlckRhdGEtPm1lbWZsYWcgIT0gVk9fSU1GX1VTRVJNRU1PUEVSQVRPUiB8fCBwVXNlckRhdGEtPm1lbURhdGEgPT0gTlVMTCApCi0JewotI2lmZGVmIFVTRV9ERUFVTFRfTUVNCi0JCXZvTWVtb3ByYXRvci5BbGxvYyA9IGNtbk1lbUFsbG9jOwotCQl2b01lbW9wcmF0b3IuQ29weSA9IGNtbk1lbUNvcHk7Ci0JCXZvTWVtb3ByYXRvci5GcmVlID0gY21uTWVtRnJlZTsKLQkJdm9NZW1vcHJhdG9yLlNldCA9IGNtbk1lbVNldDsKLQkJdm9NZW1vcHJhdG9yLkNoZWNrID0gY21uTWVtQ2hlY2s7Ci0KLQkJaW50ZXJNZW0gPSAxOwotCi0JCXBNZW1PUCA9ICZ2b01lbW9wcmF0b3I7Ci0jZWxzZQotCQkqcGhDb2RlYyA9IE5VTEw7Ci0JCXJldHVybiBWT19FUlJfSU5WQUxJRF9BUkc7Ci0jZW5kaWYKLQl9Ci0JZWxzZQotCXsKLQkJcE1lbU9QID0gKFZPX01FTV9PUEVSQVRPUiAqKXBVc2VyRGF0YS0+bWVtRGF0YTsKLQl9Ci0KLQkvKiBpbml0IHRoZSBhYWMgZW5jb2RlciBoYW5kbGUgKi8KLQloQWFjRW5jID0gKEFBQ19FTkNPREVSKiltZW1fbWFsbG9jKHBNZW1PUCwgc2l6ZW9mKEFBQ19FTkNPREVSKSwgMzIsIFZPX0lOREVYX0VOQ19BQUMpOwotCWlmKE5VTEwgPT0gaEFhY0VuYykKLQl7Ci0JCWVycm9yID0gMTsKLQl9Ci0KLQlpZighZXJyb3IpCi0JewotCQkvKiBpbml0IHRoZSBhYWMgZW5jb2RlciBpbnRyYSBtZW1vcnkgKi8KLQkJaEFhY0VuYy0+aW50YnVmID0gKHNob3J0ICopbWVtX21hbGxvYyhwTWVtT1AsIEFBQ0VOQ19CTE9DS1NJWkUqTUFYX0NIQU5ORUxTKnNpemVvZihzaG9ydCksIDMyLCBWT19JTkRFWF9FTkNfQUFDKTsKLQkJaWYoTlVMTCA9PSBoQWFjRW5jLT5pbnRidWYpCi0JCXsKLQkJCWVycm9yID0gMTsKLQkJfQotCX0KLQotCWlmICghZXJyb3IpIHsKLQkJLyogaW5pdCB0aGUgYWFjIGVuY29kZXIgcHN5Y2hvYWNvdXN0aWMgKi8KLQkJZXJyb3IgPSAoUHN5TmV3KCZoQWFjRW5jLT5wc3lLZXJuZWwsIE1BWF9DSEFOTkVMUywgcE1lbU9QKSB8fAotCQkJUHN5T3V0TmV3KCZoQWFjRW5jLT5wc3lPdXQsIHBNZW1PUCkpOwotCX0KLQotCWlmICghZXJyb3IpIHsKLQkJLyogaW5pdCB0aGUgYWFjIGVuY29kZXIgcXVhbnRpemF0aW9uIGVsZW1lbnRzICovCi0JCWVycm9yID0gUUNPdXROZXcoJmhBYWNFbmMtPnFjT3V0LE1BWF9DSEFOTkVMUywgcE1lbU9QKTsKLQl9Ci0KLQlpZiAoIWVycm9yKSB7Ci0JCS8qIGluaXQgdGhlIGFhYyBlbmNvZGVyIHF1YW50aXphdGlvbiBzdGF0ZSAqLwotCQllcnJvciA9IFFDTmV3KCZoQWFjRW5jLT5xY0tlcm5lbCwgcE1lbU9QKTsKLQl9Ci0KLQkvKiB1bmluaXQgdGhlIGFhYyBlbmNvZGVyIGlmIGVycm9yIGlzIG5vemVybyAqLwotCWlmKGVycm9yKQotCXsKLQkJQWFjRW5jQ2xvc2UoaEFhY0VuYywgcE1lbU9QKTsKLQkJaWYoaEFhY0VuYykKLQkJewotCQkJbWVtX2ZyZWUocE1lbU9QLCBoQWFjRW5jLCBWT19JTkRFWF9FTkNfQUFDKTsKLQkJCWhBYWNFbmMgPSBOVUxMOwotCQl9Ci0JCSpwaENvZGVjID0gTlVMTDsKLQkJcmV0dXJuIFZPX0VSUl9PVVRPRl9NRU1PUlk7Ci0JfQotCi0JLyogaW5pdCB0aGUgYWFjIGVuY29kZXIgbWVtb3J5IG9wZXJhdG9yICAqLwotI2lmZGVmIFVTRV9ERUFVTFRfTUVNCi0JaWYoaW50ZXJNZW0pCi0JewotCQloQWFjRW5jLT52b01lbW9wcmF0b3IuQWxsb2MgPSBjbW5NZW1BbGxvYzsKLQkJaEFhY0VuYy0+dm9NZW1vcHJhdG9yLkNvcHkgPSBjbW5NZW1Db3B5OwotCQloQWFjRW5jLT52b01lbW9wcmF0b3IuRnJlZSA9IGNtbk1lbUZyZWU7Ci0JCWhBYWNFbmMtPnZvTWVtb3ByYXRvci5TZXQgPSBjbW5NZW1TZXQ7Ci0JCWhBYWNFbmMtPnZvTWVtb3ByYXRvci5DaGVjayA9IGNtbk1lbUNoZWNrOwotCi0JCXBNZW1PUCA9ICZoQWFjRW5jLT52b01lbW9wcmF0b3I7Ci0JfQotI2VuZGlmCi0JLyogaW5pdCB0aGUgYWFjIGVuY29kZXIgZGVmYXVsdCBwYXJhbWV0ZXIgICovCi0JaWYoaEFhY0VuYy0+aW5pdE9LID09IDApCi0JewotCQkgQUFDRU5DX0NPTkZJRyBjb25maWc7Ci0JCSBjb25maWcuYWR0c1VzZWQgPSAxOwotCQkgY29uZmlnLmJpdFJhdGUgPSAxMjgwMDA7Ci0JCSBjb25maWcubkNoYW5uZWxzSW4gPSAyOwotCQkgY29uZmlnLm5DaGFubmVsc091dCA9IDI7Ci0JCSBjb25maWcuc2FtcGxlUmF0ZSA9IDQ0MTAwOwotCQkgY29uZmlnLmJhbmRXaWR0aCA9IDIwMDAwOwotCi0JCSBBYWNFbmNPcGVuKGhBYWNFbmMsIGNvbmZpZyk7Ci0JfQotCi0JaEFhY0VuYy0+dm9NZW1vcCA9IHBNZW1PUDsKLQotCSpwaENvZGVjID0gaEFhY0VuYzsKLQotCXJldHVybiBWT19FUlJfTk9ORTsKLX0KLQotLyoqCi0qIFNldCBpbnB1dCBhdWRpbyBkYXRhLgotKiBccGFyYW0gaENvZGVjIFtJTl1dIFRoZSBDb2RlYyBIYW5kbGUgd2hpY2ggd2FzIGNyZWF0ZWQgYnkgSW5pdCBmdW5jdGlvbi4KLSogXHBhcmFtIHBJbnB1dCBbSU5dIFRoZSBpbnB1dCBidWZmZXIgcGFyYW0uCi0qIFxwYXJhbSBwT3V0QnVmZmVyIFtPVVRdIFRoZSBvdXRwdXQgYnVmZmVyIGluZm8uCi0qIFxyZXR2YWwgVk9fRVJSX05PTkUgU3VjY2VlZGVkLgotKi8KLVZPX1UzMiBWT19BUEkgdm9BQUNFbmNTZXRJbnB1dERhdGEoVk9fSEFORExFIGhDb2RlYywgVk9fQ09ERUNCVUZGRVIgKiBwSW5wdXQpCi17Ci0JQUFDX0VOQ09ERVIgKmhBYWNFbmM7Ci0JaW50ICBsZW5ndGg7Ci0KLQlpZihOVUxMID09IGhDb2RlYyB8fCBOVUxMID09IHBJbnB1dCB8fCBOVUxMID09IHBJbnB1dC0+QnVmZmVyKQotCXsKLQkJcmV0dXJuIFZPX0VSUl9JTlZBTElEX0FSRzsKLQl9Ci0KLQloQWFjRW5jID0gKEFBQ19FTkNPREVSICopaENvZGVjOwotCi0JLyogaW5pdCBpbnB1dCBwY20gYnVmZmVyIGFuZCBsZW5ndGgqLwotCWhBYWNFbmMtPmluYnVmID0gKHNob3J0ICopcElucHV0LT5CdWZmZXI7Ci0JaEFhY0VuYy0+aW5sZW4gPSBwSW5wdXQtPkxlbmd0aCAvIHNpemVvZihzaG9ydCk7Ci0JaEFhY0VuYy0+dXNlbGVuZ3RoID0gMDsKLQotCWhBYWNFbmMtPmVuY2J1ZiA9IGhBYWNFbmMtPmluYnVmOwotCWhBYWNFbmMtPmVuY2xlbiA9IGhBYWNFbmMtPmlubGVuOwotCi0JLyogcmVidWlsZCBpbnRyYSBwY20gYnVmZmVyIGFuZCBsZW5ndGgqLwotCWlmKGhBYWNFbmMtPmludGxlbikKLQl7Ci0JCWxlbmd0aCA9IG1pbihoQWFjRW5jLT5jb25maWcubkNoYW5uZWxzSW4qQUFDRU5DX0JMT0NLU0laRSAtIGhBYWNFbmMtPmludGxlbiwgaEFhY0VuYy0+aW5sZW4pOwotCQloQWFjRW5jLT52b01lbW9wLT5Db3B5KFZPX0lOREVYX0VOQ19BQUMsIGhBYWNFbmMtPmludGJ1ZiArIGhBYWNFbmMtPmludGxlbiwKLQkJCWhBYWNFbmMtPmluYnVmLCBsZW5ndGgqc2l6ZW9mKHNob3J0KSk7Ci0KLQkJaEFhY0VuYy0+ZW5jYnVmID0gaEFhY0VuYy0+aW50YnVmOwotCQloQWFjRW5jLT5lbmNsZW4gPSBoQWFjRW5jLT5pbnRsZW4gKyBsZW5ndGg7Ci0KLQkJaEFhY0VuYy0+aW5idWYgKz0gbGVuZ3RoOwotCQloQWFjRW5jLT5pbmxlbiAtPSBsZW5ndGg7Ci0JfQotCi0JcmV0dXJuIFZPX0VSUl9OT05FOwotfQotCi0vKioKLSogR2V0IHRoZSBvdXR1dCBhdWRpbyBkYXRhCi0qIFxwYXJhbSBoQ29kZWMgW0lOXV0gVGhlIENvZGVjIEhhbmRsZSB3aGljaCB3YXMgY3JlYXRlZCBieSBJbml0IGZ1bmN0aW9uLgotKiBccGFyYW0gcE91dEJ1ZmZlciBbT1VUXSBUaGUgb3V0cHV0IGF1ZGlvIGRhdGEKLSogXHBhcmFtIHBPdXRJbmZvIFtPVVRdIFRoZSBkZWMgbW9kdWxlIGZpbGxlZCBhdWRpbyBmb3JtYXQgYW5kIHVzZWQgdGhlIGlucHV0IHNpemUuCi0qCQkJCQkJIHBPdXRJbmZvLT5JbnB1dFVzZWQgaXMgdG90YWwgdXNlZCB0aGUgaW5wdXQgc2l6ZS4KLSogXHJldHZhbCAgVk9fRVJSX05PTkUgU3VjY2VlZGVkLgotKgkJCVZPX0VSUl9JTlBVVF9CVUZGRVJfU01BTEwuIFRoZSBpbnB1dCB3YXMgZmluaXNoZWQgb3IgdGhlIGlucHV0IGRhdGEgd2FzIG5vdCBlbm91Z2h0LgotKi8KLVZPX1UzMiBWT19BUEkgdm9BQUNFbmNHZXRPdXRwdXREYXRhKFZPX0hBTkRMRSBoQ29kZWMsIFZPX0NPREVDQlVGRkVSICogcE91dHB1dCwgVk9fQVVESU9fT1VUUFVUSU5GTyAqIHBPdXRJbmZvKQotewotCUFBQ19FTkNPREVSKiBoQWFjRW5jID0gKEFBQ19FTkNPREVSKiloQ29kZWM7Ci0JV29yZDE2IG51bUFuY0RhdGFCeXRlcz0wOwotCVdvcmQzMiAgaW5idWZsZW47Ci0JaW50IGxlbmd0aDsKLQlpZihOVUxMID09IGhBYWNFbmMpCi0JCXJldHVybiBWT19FUlJfSU5WQUxJRF9BUkc7Ci0KLQkgaW5idWZsZW4gPSBBQUNFTkNfQkxPQ0tTSVpFKmhBYWNFbmMtPmNvbmZpZy5uQ2hhbm5lbHNJbjsKLQotCSAvKiBjaGVjayB0aGUgaW5wdXQgcGNtIGJ1ZmZlciBhbmQgbGVuZ3RoKi8KLQkgaWYoTlVMTCA9PSBoQWFjRW5jLT5lbmNidWYgfHwgaEFhY0VuYy0+ZW5jbGVuIDwgaW5idWZsZW4pCi0JIHsKLQkJbGVuZ3RoID0gaEFhY0VuYy0+ZW5jbGVuOwotCQlpZihoQWFjRW5jLT5pbnRsZW4gPT0gMCkKLQkJewotCQkJaEFhY0VuYy0+dm9NZW1vcC0+Q29weShWT19JTkRFWF9FTkNfQUFDLCBoQWFjRW5jLT5pbnRidWYsCi0JCQkJaEFhY0VuYy0+ZW5jYnVmLCBsZW5ndGgqc2l6ZW9mKHNob3J0KSk7Ci0JCQloQWFjRW5jLT51c2VsZW5ndGggKz0gbGVuZ3RoKnNpemVvZihzaG9ydCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQloQWFjRW5jLT51c2VsZW5ndGggKz0gKGxlbmd0aCAtIGhBYWNFbmMtPmludGxlbikqc2l6ZW9mKHNob3J0KTsKLQkJfQotCi0JCWhBYWNFbmMtPmludGxlbiA9IGxlbmd0aDsKLQotCQlwT3V0cHV0LT5MZW5ndGggPSAwOwotCQlpZihwT3V0SW5mbykKLQkJCXBPdXRJbmZvLT5JbnB1dFVzZWQgPSBoQWFjRW5jLT51c2VsZW5ndGg7Ci0JCXJldHVybiBWT19FUlJfSU5QVVRfQlVGRkVSX1NNQUxMOwotCSB9Ci0KLQkgLyogY2hlY2sgdGhlIG91dHB1dCBhYWMgYnVmZmVyIGFuZCBsZW5ndGgqLwotCSBpZihOVUxMID09IHBPdXRwdXQgfHwgTlVMTCA9PSBwT3V0cHV0LT5CdWZmZXIgfHwgcE91dHB1dC0+TGVuZ3RoIDwgKDYxNDQvOCkqaEFhY0VuYy0+Y29uZmlnLm5DaGFubmVsc091dC8oc2l6ZW9mKFdvcmQzMikpKQotCQkgcmV0dXJuIFZPX0VSUl9PVVRQVVRfQlVGRkVSX1NNQUxMOwotCi0JIC8qIGFhYyBlbmNvZGVyIGNvcmUgZnVuY3Rpb24gKi8KLQkgQWFjRW5jRW5jb2RlKCBoQWFjRW5jLAotCQkJKFdvcmQxNiopaEFhY0VuYy0+ZW5jYnVmLAotCQkJTlVMTCwKLQkJCSZudW1BbmNEYXRhQnl0ZXMsCi0JCQlwT3V0cHV0LT5CdWZmZXIsCi0JCQkmcE91dHB1dC0+TGVuZ3RoKTsKLQotCSAvKiB1cGRhdGUgdGhlIGlucHV0IHBjbSBidWZmZXIgYW5kIGxlbmd0aCovCi0JIGlmKGhBYWNFbmMtPmludGxlbikKLQkgewotCQlsZW5ndGggPSBpbmJ1ZmxlbiAtIGhBYWNFbmMtPmludGxlbjsKLQkJaEFhY0VuYy0+ZW5jYnVmID0gaEFhY0VuYy0+aW5idWY7Ci0JCWhBYWNFbmMtPmVuY2xlbiA9IGhBYWNFbmMtPmlubGVuOwotCQloQWFjRW5jLT51c2VsZW5ndGggKz0gbGVuZ3RoKnNpemVvZihzaG9ydCk7Ci0JCWhBYWNFbmMtPmludGxlbiA9IDA7Ci0JIH0KLQkgZWxzZQotCSB7Ci0JCSBoQWFjRW5jLT5lbmNidWYgPSBoQWFjRW5jLT5lbmNidWYgKyBpbmJ1ZmxlbjsKLQkJIGhBYWNFbmMtPmVuY2xlbiA9IGhBYWNFbmMtPmVuY2xlbiAtIGluYnVmbGVuOwotCQkgaEFhY0VuYy0+dXNlbGVuZ3RoICs9IGluYnVmbGVuKnNpemVvZihzaG9ydCk7Ci0JIH0KLQotCSAvKiB1cGRhdGUgdGhlIG91dHB1dCBhYWMgaW5mb3JtYXRpb24gKi8KLQlpZihwT3V0SW5mbykKLQl7Ci0JCXBPdXRJbmZvLT5Gb3JtYXQuQ2hhbm5lbHMgPSBoQWFjRW5jLT5jb25maWcubkNoYW5uZWxzT3V0OwotCQlwT3V0SW5mby0+Rm9ybWF0LlNhbXBsZVJhdGUgPSBoQWFjRW5jLT5jb25maWcuc2FtcGxlUmF0ZTsKLQkJcE91dEluZm8tPkZvcm1hdC5TYW1wbGVCaXRzID0gMTY7Ci0JCXBPdXRJbmZvLT5JbnB1dFVzZWQgPSBoQWFjRW5jLT51c2VsZW5ndGg7Ci0JfQotCi0JIHJldHVybiBWT19FUlJfTk9ORTsKLX0KLQotLyoqCi0qIFVuaW5pdCB0aGUgQ29kZWMuCi0qIFxwYXJhbSBoQ29kZWMgW0lOXV0gVGhlIENvZGVjIEhhbmRsZSB3aGljaCB3YXMgY3JlYXRlZCBieSBJbml0IGZ1bmN0aW9uLgotKiBccmV0dmFsIFZPX0VSUl9OT05FIFN1Y2NlZWRlZC4KLSovCi1WT19VMzIgVk9fQVBJIHZvQUFDRW5jVW5pbml0KFZPX0hBTkRMRSBoQ29kZWMpCi17Ci0JQUFDX0VOQ09ERVIqIGhBYWNFbmMgPSAoQUFDX0VOQ09ERVIqKWhDb2RlYzsKLQotCWlmKE5VTEwgIT0gaEFhY0VuYykKLQl7Ci0JCS8qIGNsb3NlIHRoZSBhYWMgZW5jb2RlciAqLwotCQlBYWNFbmNDbG9zZShoQWFjRW5jLCBoQWFjRW5jLT52b01lbW9wKTsKLQotCQkvKiBmcmVlIHRoZSBhYWMgZW5jb2RlciBoYW5kbGUqLwotCQltZW1fZnJlZShoQWFjRW5jLT52b01lbW9wLCBoQWFjRW5jLCBWT19JTkRFWF9FTkNfQUFDKTsKLQkJaEFhY0VuYyA9IE5VTEw7Ci0JfQotCi0JcmV0dXJuIFZPX0VSUl9OT05FOwotfQotCi0vKioKLSogU2V0IHRoZSBwYXJhbSBmb3Igc3BlY2lhbCB0YXJnZXQuCi0qIFxwYXJhbSBoQ29kZWMgW0lOXV0gVGhlIENvZGVjIEhhbmRsZSB3aGljaCB3YXMgY3JlYXRlZCBieSBJbml0IGZ1bmN0aW9uLgotKiBccGFyYW0gdVBhcmFtSUQgW0lOXSBUaGUgcGFyYW0gSUQuCi0qIFxwYXJhbSBwRGF0YSBbSU5dIFRoZSBwYXJhbSB2YWx1ZSBkZXBlbmQgb24gdGhlIElEPgotKiBccmV0dmFsIFZPX0VSUl9OT05FIFN1Y2NlZWRlZC4KLSovCi1WT19VMzIgVk9fQVBJIHZvQUFDRW5jU2V0UGFyYW0oVk9fSEFORExFIGhDb2RlYywgVk9fUzMyIHVQYXJhbUlELCBWT19QVFIgcERhdGEpCi17Ci0JQUFDRU5DX0NPTkZJRyBjb25maWc7Ci0JQUFDRU5DX1BBUkFNKiBwQUFDX3BhcmFtOwotCVZPX0FVRElPX0ZPUk1BVCAqcFdBVl9Gb3JtYXQ7Ci0JQUFDX0VOQ09ERVIqIGhBYWNFbmMgPSAoQUFDX0VOQ09ERVIqKWhDb2RlYzsKLQlpbnQgcmV0LCBpLCBiaXRyYXRlLCB0bXA7Ci0JaW50IFNhbXBsZVJhdGVJZHg7Ci0KLQlpZihOVUxMID09IGhBYWNFbmMpCi0JCXJldHVybiBWT19FUlJfSU5WQUxJRF9BUkc7Ci0KLQlzd2l0Y2godVBhcmFtSUQpCi0JewotCWNhc2UgVk9fUElEX0FBQ19FTkNQQVJBTTogIC8qIGluaXQgYWFjIGVuY29kZXIgcGFyYW1ldGVyKi8KLQkJQWFjSW5pdERlZmF1bHRDb25maWcoJmNvbmZpZyk7Ci0JCWlmKHBEYXRhID09IE5VTEwpCi0JCQlyZXR1cm4gVk9fRVJSX0lOVkFMSURfQVJHOwotCQlwQUFDX3BhcmFtID0gKEFBQ0VOQ19QQVJBTSopcERhdGE7Ci0JCWNvbmZpZy5hZHRzVXNlZCA9IHBBQUNfcGFyYW0tPmFkdHNVc2VkOwotCQljb25maWcuYml0UmF0ZSA9IHBBQUNfcGFyYW0tPmJpdFJhdGU7Ci0JCWNvbmZpZy5uQ2hhbm5lbHNJbiA9IHBBQUNfcGFyYW0tPm5DaGFubmVsczsKLQkJY29uZmlnLm5DaGFubmVsc091dCA9IHBBQUNfcGFyYW0tPm5DaGFubmVsczsKLQkJY29uZmlnLnNhbXBsZVJhdGUgPSBwQUFDX3BhcmFtLT5zYW1wbGVSYXRlOwotCi0JCS8qIGNoZWNrIHRoZSBjaGFubmVsICovCi0JCWlmKGNvbmZpZy5uQ2hhbm5lbHNJbjwgMSAgfHwgY29uZmlnLm5DaGFubmVsc0luID4gTUFYX0NIQU5ORUxTICB8fAotICAgICAgICAgICAgIGNvbmZpZy5uQ2hhbm5lbHNPdXQgPCAxIHx8IGNvbmZpZy5uQ2hhbm5lbHNPdXQgPiBNQVhfQ0hBTk5FTFMgfHwgY29uZmlnLm5DaGFubmVsc0luIDwgY29uZmlnLm5DaGFubmVsc091dCkKLQkJCSByZXR1cm4gVk9fRVJSX0FVRElPX1VOU0NIQU5ORUw7Ci0KLQkJLyogY2hlY2sgdGhlIHNhbXBsZXJhdGUgKi8KLQkJcmV0ID0gLTE7Ci0JCWZvcihpID0gMDsgaSA8IE5VTV9TQU1QTEVfUkFURVM7IGkrKykKLQkJewotCQkJaWYoY29uZmlnLnNhbXBsZVJhdGUgPT0gc2FtcFJhdGVUYWJbaV0pCi0JCQl7Ci0JCQkJcmV0ID0gMDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZihyZXQgPCAwKQotCQkJcmV0dXJuIFZPX0VSUl9BVURJT19VTlNTQU1QTEVSQVRFOwotCi0JCVNhbXBsZVJhdGVJZHggPSBpOwotCi0JCXRtcCA9IDQ0MTsKLQkJaWYoY29uZmlnLnNhbXBsZVJhdGUlODAwMCA9PSAwKQotCQkJdG1wID00ODA7Ci0JCS8qIGNoZWNrIHRoZSBiaXRyYXRlICovCi0JCWlmKGNvbmZpZy5iaXRSYXRlIT0wICYmICgoY29uZmlnLmJpdFJhdGUvY29uZmlnLm5DaGFubmVsc091dCA8IDQwMDApIHx8Ci0gICAgICAgICAgIChjb25maWcuYml0UmF0ZS9jb25maWcubkNoYW5uZWxzT3V0ID4gMTYwMDAwKSB8fAotCQkgICAoY29uZmlnLmJpdFJhdGUgPiBjb25maWcuc2FtcGxlUmF0ZSo2KmNvbmZpZy5uQ2hhbm5lbHNPdXQpKSkKLQkJewotCQkJY29uZmlnLmJpdFJhdGUgPSA2NDAqY29uZmlnLnNhbXBsZVJhdGUvdG1wKmNvbmZpZy5uQ2hhbm5lbHNPdXQ7Ci0KLQkJCWlmKGNvbmZpZy5iaXRSYXRlL2NvbmZpZy5uQ2hhbm5lbHNPdXQgPCA0MDAwKQotCQkJCWNvbmZpZy5iaXRSYXRlID0gNDAwMCAqIGNvbmZpZy5uQ2hhbm5lbHNPdXQ7Ci0JCQllbHNlIGlmKGNvbmZpZy5iaXRSYXRlID4gY29uZmlnLnNhbXBsZVJhdGUqNipjb25maWcubkNoYW5uZWxzT3V0KQotCQkJCWNvbmZpZy5iaXRSYXRlID0gY29uZmlnLnNhbXBsZVJhdGUqNipjb25maWcubkNoYW5uZWxzT3V0OwotCQkJZWxzZSBpZihjb25maWcuYml0UmF0ZS9jb25maWcubkNoYW5uZWxzT3V0ID4gMTYwMDAwKQotCQkJCWNvbmZpZy5iaXRSYXRlID0gY29uZmlnLm5DaGFubmVsc091dCoxNjAwMDA7Ci0JCX0KLQotCQkvKiBjaGVjayB0aGUgYmFuZHdpZHRoICovCi0JCWJpdHJhdGUgPSBjb25maWcuYml0UmF0ZSAvIGNvbmZpZy5uQ2hhbm5lbHNPdXQ7Ci0JCWJpdHJhdGUgPSBiaXRyYXRlICogdG1wIC8gY29uZmlnLnNhbXBsZVJhdGU7Ci0KLQkJZm9yIChpID0gMDsgcmF0ZXNbaV07IGkrKykKLQkJewotCQkJaWYgKHJhdGVzW2ldID49IGJpdHJhdGUpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQljb25maWcuYmFuZFdpZHRoID0gQmFuZHdpdGhDb2VmVGFiW2ldW1NhbXBsZVJhdGVJZHhdOwotCi0JCS8qIGluaXQgYWFjIGVuY29kZXIgY29yZSAqLwotCQlyZXQgPSBBYWNFbmNPcGVuKGhBYWNFbmMsIGNvbmZpZyk7Ci0JCWlmKHJldCkKLQkJCXJldHVybiBWT19FUlJfQVVESU9fVU5TRkVBVFVSRTsKLQkJYnJlYWs7Ci0JY2FzZSBWT19QSURfQVVESU9fRk9STUFUOgkvKiBpbml0IHBjbSBjaGFubmVsIGFuZCBzYW1wbGVyYXRlKi8KLQkJQWFjSW5pdERlZmF1bHRDb25maWcoJmNvbmZpZyk7Ci0JCWlmKHBEYXRhID09IE5VTEwpCi0JCQlyZXR1cm4gVk9fRVJSX0lOVkFMSURfQVJHOwotCQlwV0FWX0Zvcm1hdCA9IChWT19BVURJT19GT1JNQVQqKXBEYXRhOwotCQljb25maWcuYWR0c1VzZWQgPSAxOwotCQljb25maWcubkNoYW5uZWxzSW4gPSBwV0FWX0Zvcm1hdC0+Q2hhbm5lbHM7Ci0JCWNvbmZpZy5uQ2hhbm5lbHNPdXQgPSBwV0FWX0Zvcm1hdC0+Q2hhbm5lbHM7Ci0JCWNvbmZpZy5zYW1wbGVSYXRlID0gcFdBVl9Gb3JtYXQtPlNhbXBsZVJhdGU7Ci0KLQkJLyogY2hlY2sgdGhlIGNoYW5uZWwgKi8KLQkJaWYoY29uZmlnLm5DaGFubmVsc0luPCAxICB8fCBjb25maWcubkNoYW5uZWxzSW4gPiBNQVhfQ0hBTk5FTFMgIHx8Ci0gICAgICAgICAgICAgY29uZmlnLm5DaGFubmVsc091dCA8IDEgfHwgY29uZmlnLm5DaGFubmVsc091dCA+IE1BWF9DSEFOTkVMUyB8fCBjb25maWcubkNoYW5uZWxzSW4gPCBjb25maWcubkNoYW5uZWxzT3V0KQotCQkJIHJldHVybiBWT19FUlJfQVVESU9fVU5TQ0hBTk5FTDsKLQotCQkvKiBjaGVjayB0aGUgc2FtcGxlYml0cyAqLwotCQlpZihwV0FWX0Zvcm1hdC0+U2FtcGxlQml0cyAhPSAxNikKLQkJewotCQkJcmV0dXJuIFZPX0VSUl9BVURJT19VTlNGRUFUVVJFOwotCQl9Ci0KLQkJLyogY2hlY2sgdGhlIHNhbXBsZXJhdGUgKi8KLQkJcmV0ID0gLTE7Ci0JCWZvcihpID0gMDsgaSA8IE5VTV9TQU1QTEVfUkFURVM7IGkrKykKLQkJewotCQkJaWYoY29uZmlnLnNhbXBsZVJhdGUgPT0gc2FtcFJhdGVUYWJbaV0pCi0JCQl7Ci0JCQkJcmV0ID0gMDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZihyZXQgPCAwKQotCQkJcmV0dXJuIFZPX0VSUl9BVURJT19VTlNTQU1QTEVSQVRFOwotCi0JCVNhbXBsZVJhdGVJZHggPSBpOwotCi0JCS8qIHVwZGF0ZSB0aGUgYml0cmF0ZXMgKi8KLQkJdG1wID0gNDQxOwotCQlpZihjb25maWcuc2FtcGxlUmF0ZSU4MDAwID09IDApCi0JCQl0bXAgPTQ4MDsKLQotCQljb25maWcuYml0UmF0ZSA9IDY0MCpjb25maWcuc2FtcGxlUmF0ZS90bXAqY29uZmlnLm5DaGFubmVsc091dDsKLQotCQlpZihjb25maWcuYml0UmF0ZS9jb25maWcubkNoYW5uZWxzT3V0IDwgNDAwMCkKLQkJCWNvbmZpZy5iaXRSYXRlID0gNDAwMCAqIGNvbmZpZy5uQ2hhbm5lbHNPdXQ7Ci0JCWVsc2UgaWYoY29uZmlnLmJpdFJhdGUgPiBjb25maWcuc2FtcGxlUmF0ZSo2KmNvbmZpZy5uQ2hhbm5lbHNPdXQpCi0JCQljb25maWcuYml0UmF0ZSA9IGNvbmZpZy5zYW1wbGVSYXRlKjYqY29uZmlnLm5DaGFubmVsc091dDsKLQkJZWxzZSBpZihjb25maWcuYml0UmF0ZS9jb25maWcubkNoYW5uZWxzT3V0ID4gMTYwMDAwKQotCQkJY29uZmlnLmJpdFJhdGUgPSBjb25maWcubkNoYW5uZWxzT3V0KjE2MDAwMDsKLQotCQkvKiBjaGVjayB0aGUgYmFuZHdpZHRoICovCi0JCWJpdHJhdGUgPSBjb25maWcuYml0UmF0ZSAvIGNvbmZpZy5uQ2hhbm5lbHNPdXQ7Ci0JCWJpdHJhdGUgPSBiaXRyYXRlICogdG1wIC8gY29uZmlnLnNhbXBsZVJhdGU7Ci0KLQkJZm9yIChpID0gMDsgcmF0ZXNbaV07IGkrKykKLQkJewotCQkJaWYgKHJhdGVzW2ldID49IGJpdHJhdGUpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQljb25maWcuYmFuZFdpZHRoID0gQmFuZHdpdGhDb2VmVGFiW2ldW1NhbXBsZVJhdGVJZHhdOwotCi0JCS8qIGluaXQgYWFjIGVuY29kZXIgY29yZSAqLwotCQlyZXQgPSBBYWNFbmNPcGVuKGhBYWNFbmMsIGNvbmZpZyk7Ci0JCWlmKHJldCkKLQkJCXJldHVybiBWT19FUlJfQVVESU9fVU5TRkVBVFVSRTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIFZPX0VSUl9XUk9OR19QQVJBTV9JRDsKLQl9Ci0KLQlyZXR1cm4gVk9fRVJSX05PTkU7Ci19Ci0KLS8qKgotKiBHZXQgdGhlIHBhcmFtIGZvciBzcGVjaWFsIHRhcmdldC4KLSogXHBhcmFtIGhDb2RlYyBbSU5dXSBUaGUgQ29kZWMgSGFuZGxlIHdoaWNoIHdhcyBjcmVhdGVkIGJ5IEluaXQgZnVuY3Rpb24uCi0qIFxwYXJhbSB1UGFyYW1JRCBbSU5dIFRoZSBwYXJhbSBJRC4KLSogXHBhcmFtIHBEYXRhIFtJTl0gVGhlIHBhcmFtIHZhbHVlIGRlcGVuZCBvbiB0aGUgSUQ+Ci0qIFxyZXR2YWwgVk9fRVJSX05PTkUgU3VjY2VlZGVkLgotKi8KLVZPX1UzMiBWT19BUEkgdm9BQUNFbmNHZXRQYXJhbShWT19IQU5ETEUgaENvZGVjLCBWT19TMzIgdVBhcmFtSUQsIFZPX1BUUiBwRGF0YSkKLXsKLSAgICAgICAgVU5VU0VEKGhDb2RlYyk7Ci0gICAgICAgIFVOVVNFRCh1UGFyYW1JRCk7Ci0gICAgICAgIFVOVVNFRChwRGF0YSk7Ci0KLQlyZXR1cm4gVk9fRVJSX05PTkU7Ci19Ci0KLS8qKgotICogR2V0IGF1ZGlvIGNvZGVjIEFQSSBpbnRlcmZhY2UKLSAqIFxwYXJhbSBwRW5jSGFuZGxlIFtvdXRdIFJldHVybiB0aGUgQUFDIEVuY29kZXIgaGFuZGxlLgotICogXHJldHZhbCBWT19FUlJfT0sgU3VjY2VlZGVkLgotICovCi1WT19TMzIgVk9fQVBJIHZvR2V0QUFDRW5jQVBJKFZPX0FVRElPX0NPREVDQVBJICogcERlY0hhbmRsZSkKLXsKLQlpZihwRGVjSGFuZGxlID09IE5VTEwpCi0JCXJldHVybiBWT19FUlJfSU5WQUxJRF9BUkc7Ci0KLQlwRGVjSGFuZGxlLT5Jbml0ID0gdm9BQUNFbmNJbml0OwotCXBEZWNIYW5kbGUtPlNldElucHV0RGF0YSA9IHZvQUFDRW5jU2V0SW5wdXREYXRhOwotCXBEZWNIYW5kbGUtPkdldE91dHB1dERhdGEgPSB2b0FBQ0VuY0dldE91dHB1dERhdGE7Ci0JcERlY0hhbmRsZS0+U2V0UGFyYW0gPSB2b0FBQ0VuY1NldFBhcmFtOwotCXBEZWNIYW5kbGUtPkdldFBhcmFtID0gdm9BQUNFbmNHZXRQYXJhbTsKLQlwRGVjSGFuZGxlLT5VbmluaXQgPSB2b0FBQ0VuY1VuaW5pdDsKLQotCXJldHVybiBWT19FUlJfTk9ORTsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FhY2VuY19jb3JlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hYWNlbmNfY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTQ1MmQ0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FhY2VuY19jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQlhYWNlbmNfY29yZS5jCi0KLQlDb250ZW50OglhYWMgZW5jb2RlciBjb3JlIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAidHlwZWRlZi5oIgotI2luY2x1ZGUgImFhY2VuY19jb3JlLmgiCi0jaW5jbHVkZSAiYml0ZW5jLmgiCi0KLSNpbmNsdWRlICJwc3lfY29uZmlndXJhdGlvbi5oIgotI2luY2x1ZGUgInBzeV9tYWluLmgiCi0jaW5jbHVkZSAicWNfbWFpbi5oIgotI2luY2x1ZGUgInBzeV9tYWluLmgiCi0jaW5jbHVkZSAiY2hhbm5lbF9tYXAuaCIKLSNpbmNsdWRlICJhYWNfcm9tLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBBYWNJbml0RGVmYXVsdENvbmZpZwotKiBkZXNjcmlwdGlvbjogIGdpdmVzIHJlYXNvbmFibGUgZGVmYXVsdCBjb25maWd1cmF0aW9uCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBBYWNJbml0RGVmYXVsdENvbmZpZyhBQUNFTkNfQ09ORklHICpjb25maWcpCi17Ci0gIC8qIGRlZmF1bHQgY29uZmlndXJhdGlvbnMgKi8KLSAgY29uZmlnLT5hZHRzVXNlZCAgICAgICAgPSAxOwotICBjb25maWctPm5DaGFubmVsc0luICAgICA9IDI7Ci0gIGNvbmZpZy0+bkNoYW5uZWxzT3V0ICAgID0gMjsKLSAgY29uZmlnLT5iaXRSYXRlICAgICAgICAgPSAxMjgwMDA7Ci0gIGNvbmZpZy0+YmFuZFdpZHRoICAgICAgID0gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IEFhY0VuY09wZW4KLSogZGVzY3JpcHRpb246ICBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIG5ldyBlbmNvZGVyIGluc3RhbmNlCi0qIHJldHVybnM6ICAgICAgMCBpZiBzdWNjZXNzCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotV29yZDE2ICBBYWNFbmNPcGVuKCAgQUFDX0VOQ09ERVIqICAgICAgaEFhY0VuYywgICAgICAgIC8qIHBvaW50ZXIgdG8gYW4gZW5jb2RlciBoYW5kbGUsIGluaXRpYWxpemVkIG9uIHJldHVybiAqLwotICAgICAgICAgICAgICAgICAgICAgY29uc3QgIEFBQ0VOQ19DT05GSUcgICAgIGNvbmZpZyAgIC8qIHByZS1pbml0aWFsaXplZCBjb25maWcgc3RydWN0ICovCi0gICAgICAgICAgICAgICAgICAgICApCi17Ci0gIFdvcmQzMiBlcnJvciA9IDA7Ci0gIFdvcmQxNiBwcm9maWxlID0gMTsKLQotICBFTEVNRU5UX0lORk8gKmVsSW5mbyA9IE5VTEw7Ci0KLSAgaWYgKGhBYWNFbmM9PTApIHsKLSAgICBlcnJvcj0xOwotICB9Ci0KLSAgaWYgKCFlcnJvcikgewotICAgIGhBYWNFbmMtPmNvbmZpZyA9IGNvbmZpZzsKLSAgfQotCi0gIGlmICghZXJyb3IpIHsKLSAgICBlcnJvciA9IEluaXRFbGVtZW50SW5mbyAoY29uZmlnLm5DaGFubmVsc091dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhBYWNFbmMtPmVsSW5mbyk7Ci0gIH0KLQotICBpZiAoIWVycm9yKSB7Ci0gICAgZWxJbmZvID0gJmhBYWNFbmMtPmVsSW5mbzsKLSAgfQotCi0gIGlmICghZXJyb3IpIHsKLSAgICAvKiB1c2Ugb3Igbm90IHRucyB0b29sIGZvciBsb25nIGFuZCBzaG9ydCBibG9jayAqLwotCSBXb3JkMTYgdG5zTWFzaz0zOwotCi0JLyogaW5pdCBlbmNvZGVyIHBzeWNob2Fjb3VzdGljICovCi0gICAgZXJyb3IgPSBwc3lNYWluSW5pdCgmaEFhY0VuYy0+cHN5S2VybmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuYml0UmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsSW5mby0+bkNoYW5uZWxzSW5FbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRuc01hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5jb25maWcuYmFuZFdpZHRoKTsKLSAgfQotCi0gLyogdXNlIG9yIG5vdCBhZHRzIGhlYWRlciAqLwotICBpZighZXJyb3IpIHsKLQkgIGhBYWNFbmMtPnFjT3V0LnFjRWxlbWVudC5hZHRzVXNlZCA9IGNvbmZpZy5hZHRzVXNlZDsKLSAgfQotCi0gIC8qIGluaXQgZW5jb2RlciBxdWFudGl6YXRpb24gKi8KLSAgaWYgKCFlcnJvcikgewotICAgIHN0cnVjdCBRQ19JTklUIHFjSW5pdDsKLQotICAgIC8qcWNJbml0LmNoYW5uZWxNYXBwaW5nID0gJmhBYWNFbmMtPmNoYW5uZWxNYXBwaW5nOyovCi0gICAgcWNJbml0LmVsSW5mbyA9ICZoQWFjRW5jLT5lbEluZm87Ci0KLSAgICBxY0luaXQubWF4Qml0cyA9IChXb3JkMTYpIChNQVhCSVRTX0NPRUYqZWxJbmZvLT5uQ2hhbm5lbHNJbkVsKTsKLSAgICBxY0luaXQuYml0UmVzID0gcWNJbml0Lm1heEJpdHM7Ci0gICAgcWNJbml0LmF2ZXJhZ2VCaXRzID0gKFdvcmQxNikgKChjb25maWcuYml0UmF0ZSAqIEZSQU1FX0xFTl9MT05HKSAvIGNvbmZpZy5zYW1wbGVSYXRlKTsKLQotICAgIHFjSW5pdC5wYWRkaW5nLnBhZGRpbmdSZXN0ID0gY29uZmlnLnNhbXBsZVJhdGU7Ci0KLSAgICBxY0luaXQubWVhblBlID0gKFdvcmQxNikgKCgxMCAqIEZSQU1FX0xFTl9MT05HICogaEFhY0VuYy0+Y29uZmlnLmJhbmRXaWR0aCkgLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25maWcuc2FtcGxlUmF0ZT4+MSkpOwotCi0gICAgcWNJbml0Lm1heEJpdEZhYyA9IChXb3JkMTYpICgoMTAwICogKE1BWEJJVFNfQ09FRi1NSU5CSVRTX0NPRUYpKiBlbEluZm8tPm5DaGFubmVsc0luRWwpLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChxY0luaXQuYXZlcmFnZUJpdHM/cWNJbml0LmF2ZXJhZ2VCaXRzOjEpKTsKLQotICAgIHFjSW5pdC5iaXRyYXRlID0gY29uZmlnLmJpdFJhdGU7Ci0KLSAgICBlcnJvciA9IFFDSW5pdCgmaEFhY0VuYy0+cWNLZXJuZWwsICZxY0luaXQpOwotICB9Ci0KLSAgLyogaW5pdCBiaXRzdHJlYW0gZW5jb2RlciAqLwotICBpZiAoIWVycm9yKSB7Ci0gICAgaEFhY0VuYy0+YnNlSW5pdC5uQ2hhbm5lbHMgICA9IGVsSW5mby0+bkNoYW5uZWxzSW5FbDsKLSAgICBoQWFjRW5jLT5ic2VJbml0LmJpdHJhdGUgICAgID0gY29uZmlnLmJpdFJhdGU7Ci0gICAgaEFhY0VuYy0+YnNlSW5pdC5zYW1wbGVSYXRlICA9IGNvbmZpZy5zYW1wbGVSYXRlOwotICAgIGhBYWNFbmMtPmJzZUluaXQucHJvZmlsZSAgICAgPSBwcm9maWxlOwotICB9Ci0KLSAgcmV0dXJuIGVycm9yOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogQWFjRW5jRW5jb2RlCi0qIGRlc2NyaXB0aW9uOiAgZW5jb2RlIHBjbSB0byBhYWMgZGF0YSBjb3JlIGZ1bmN0aW9uCi0qIHJldHVybnM6ICAgICAgMCBpZiBzdWNjZXNzCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotV29yZDE2IEFhY0VuY0VuY29kZShBQUNfRU5DT0RFUiAqYWFjRW5jLAkJLyohPCBhbiBlbmNvZGVyIGhhbmRsZSAqLwotICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnRpbWVTaWduYWwsICAgICAgICAgLyohPCBCTE9DS1NJWkUqbkNoYW5uZWxzIGF1ZGlvIHNhbXBsZXMsIGludGVybGVhdmVkICovCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFVXb3JkOCAqYW5jQnl0ZXMsICAgICAvKiE8IHBvaW50ZXIgdG8gYW5jaWxsYXJ5IGRhdGEgYnl0ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpudW1BbmNCeXRlcywJCS8qITwgbnVtYmVyIG9mIGFuY2lsbGFyeSBEYXRhIEJ5dGVzICovCi0gICAgICAgICAgICAgICAgICAgIFVXb3JkOCAqb3V0Qnl0ZXMsICAgICAgICAgICAvKiE8IHBvaW50ZXIgdG8gb3V0cHV0IGJ1ZmZlciAobXVzdCBiZSBsYXJnZSBNSU5CSVRTX0NPRUYvOCpNQVhfQ0hBTk5FTFMgYnl0ZXMpICovCi0gICAgICAgICAgICAgICAgICAgIFZPX1UzMiAqbnVtT3V0Qnl0ZXMgICAgICAgICAvKiE8IG51bWJlciBvZiBieXRlcyBpbiBvdXRwdXQgYnVmZmVyIGFmdGVyIHByb2Nlc3NpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgKQotewotICBFTEVNRU5UX0lORk8gKmVsSW5mbyA9ICZhYWNFbmMtPmVsSW5mbzsKLSAgV29yZDE2IGdsb2JVc2VkQml0czsKLSAgV29yZDE2IGFuY0RhdGFCeXRlcywgYW5jRGF0YUJ5dGVzTGVmdDsKLQotICBhbmNEYXRhQnl0ZXMgPSBhbmNEYXRhQnl0ZXNMZWZ0ID0gKm51bUFuY0J5dGVzOwotCi0gIC8qIGluaXQgb3V0cHV0IGFhYyBkYXRhIGJ1ZmZlciBhbmQgbGVuZ3RoICovCi0gIGFhY0VuYy0+aEJpdFN0cmVhbSA9IENyZWF0ZUJpdEJ1ZmZlcigmYWFjRW5jLT5iaXRTdHJlYW0sIG91dEJ5dGVzLCAqbnVtT3V0Qnl0ZXMpOwotCi0gIC8qIHBzeWNob2Fjb3VzdGljIHByb2Nlc3MgKi8KLSAgcHN5TWFpbihhYWNFbmMtPmNvbmZpZy5uQ2hhbm5lbHNPdXQsCi0gICAgICAgICAgZWxJbmZvLAotICAgICAgICAgIHRpbWVTaWduYWwsCi0gICAgICAgICAgJmFhY0VuYy0+cHN5S2VybmVsLnBzeURhdGFbZWxJbmZvLT5DaGFubmVsSW5kZXhbMF1dLAotICAgICAgICAgICZhYWNFbmMtPnBzeUtlcm5lbC50bnNEYXRhW2VsSW5mby0+Q2hhbm5lbEluZGV4WzBdXSwKLSAgICAgICAgICAmYWFjRW5jLT5wc3lLZXJuZWwucHN5Q29uZkxvbmcsCi0gICAgICAgICAgJmFhY0VuYy0+cHN5S2VybmVsLnBzeUNvbmZTaG9ydCwKLSAgICAgICAgICAmYWFjRW5jLT5wc3lPdXQucHN5T3V0Q2hhbm5lbFtlbEluZm8tPkNoYW5uZWxJbmRleFswXV0sCi0gICAgICAgICAgJmFhY0VuYy0+cHN5T3V0LnBzeU91dEVsZW1lbnQsCi0gICAgICAgICAgYWFjRW5jLT5wc3lLZXJuZWwucFNjcmF0Y2hUbnMsCi0JCSAgYWFjRW5jLT5jb25maWcuc2FtcGxlUmF0ZSk7Ci0KLSAgLyogYWRqdXN0IGJpdHJhdGUgYW5kIGZyYW1lIGxlbmd0aCAqLwotICBBZGp1c3RCaXRyYXRlKCZhYWNFbmMtPnFjS2VybmVsLAotICAgICAgICAgICAgICAgIGFhY0VuYy0+Y29uZmlnLmJpdFJhdGUsCi0gICAgICAgICAgICAgICAgYWFjRW5jLT5jb25maWcuc2FtcGxlUmF0ZSk7Ci0KLSAgLyogcXVhbnRpemF0aW9uIGFuZCBjb2RpbmcgcHJvY2VzcyAqLwotICBRQ01haW4oJmFhY0VuYy0+cWNLZXJuZWwsCi0gICAgICAgICAmYWFjRW5jLT5xY0tlcm5lbC5lbGVtZW50Qml0cywKLSAgICAgICAgICZhYWNFbmMtPnFjS2VybmVsLmFkalRoci5hZGpUaHJTdGF0ZUVsZW0sCi0gICAgICAgICAmYWFjRW5jLT5wc3lPdXQucHN5T3V0Q2hhbm5lbFtlbEluZm8tPkNoYW5uZWxJbmRleFswXV0sCi0gICAgICAgICAmYWFjRW5jLT5wc3lPdXQucHN5T3V0RWxlbWVudCwKLSAgICAgICAgICZhYWNFbmMtPnFjT3V0LnFjQ2hhbm5lbFtlbEluZm8tPkNoYW5uZWxJbmRleFswXV0sCi0gICAgICAgICAmYWFjRW5jLT5xY091dC5xY0VsZW1lbnQsCi0gICAgICAgICBlbEluZm8tPm5DaGFubmVsc0luRWwsCi0JCSBtaW4oYW5jRGF0YUJ5dGVzTGVmdCxhbmNEYXRhQnl0ZXMpKTsKLQotICBhbmNEYXRhQnl0ZXNMZWZ0ID0gYW5jRGF0YUJ5dGVzTGVmdCAtIGFuY0RhdGFCeXRlczsKLQotICBnbG9iVXNlZEJpdHMgPSBGaW5hbGl6ZUJpdENvbnN1bXB0aW9uKCZhYWNFbmMtPnFjS2VybmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICZhYWNFbmMtPnFjT3V0KTsKLQotICAvKiB3cml0ZSBiaXRzdHJlYW0gcHJvY2VzcyAqLwotICBXcml0ZUJpdHN0cmVhbShhYWNFbmMtPmhCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICplbEluZm8sCi0gICAgICAgICAgICAgICAgICZhYWNFbmMtPnFjT3V0LAotICAgICAgICAgICAgICAgICAmYWFjRW5jLT5wc3lPdXQsCi0gICAgICAgICAgICAgICAgICZnbG9iVXNlZEJpdHMsCi0gICAgICAgICAgICAgICAgIGFuY0J5dGVzLAotCQkJCSBhYWNFbmMtPnBzeUtlcm5lbC5zYW1wbGVSYXRlSWR4KTsKLQotICB1cGRhdGVCaXRyZXMoJmFhY0VuYy0+cWNLZXJuZWwsCi0gICAgICAgICAgICAgICAmYWFjRW5jLT5xY091dCk7Ci0KLSAgLyogd3JpdGUgb3V0IHRoZSBiaXRzdHJlYW0gKi8KLSAgKm51bU91dEJ5dGVzID0gR2V0Qml0c0F2YWlsKGFhY0VuYy0+aEJpdFN0cmVhbSkgPj4gMzsKLQotICByZXR1cm4gMDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTpBYWNFbmNDbG9zZQotKiBkZXNjcmlwdGlvbjogZGVhbGxvY2F0ZSBhbiBlbmNvZGVyIGluc3RhbmNlCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBBYWNFbmNDbG9zZSAoQUFDX0VOQ09ERVIqIGhBYWNFbmMsIFZPX01FTV9PUEVSQVRPUiAqcE1lbU9QKQotewotICBpZiAoaEFhY0VuYykgewotICAgIFFDRGVsZXRlKCZoQWFjRW5jLT5xY0tlcm5lbCwgcE1lbU9QKTsKLQotICAgIFFDT3V0RGVsZXRlKCZoQWFjRW5jLT5xY091dCwgcE1lbU9QKTsKLQotICAgIFBzeURlbGV0ZSgmaEFhY0VuYy0+cHN5S2VybmVsLCBwTWVtT1ApOwotCi0gICAgUHN5T3V0RGVsZXRlKCZoQWFjRW5jLT5wc3lPdXQsIHBNZW1PUCk7Ci0KLSAgICBEZWxldGVCaXRCdWZmZXIoJmhBYWNFbmMtPmhCaXRTdHJlYW0pOwotCi0JaWYoaEFhY0VuYy0+aW50YnVmKQotCXsKLQkJbWVtX2ZyZWUocE1lbU9QLCBoQWFjRW5jLT5pbnRidWYsIFZPX0lOREVYX0VOQ19BQUMpOwotCQloQWFjRW5jLT5pbnRidWYgPSBOVUxMOwotCX0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYWRqX3Roci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYWRqX3Roci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjhiZTBlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2Fkal90aHIuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMjggKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQlhZGpfdGhyLmMKLQotCUNvbnRlbnQ6CVRocmVzaG9sZCBjb21wZW5zYXRpb24gZnVuY3Rpb25zCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEluY2x1ZGUgc3lzdGVtIGhlYWRlcnMgYmVmb3JlIGxvY2FsIGhlYWRlcnMgLSB0aGUgbG9jYWwgaGVhZGVycwotICogcmVkZWZpbmUgX19pbmxpbmUsIHdoaWNoIGNhbiBtZXNzIHVwIGRlZmluaXRpb25zIGluIGxpYmMgaGVhZGVycyBpZgotICogdGhleSBoYXBwZW4gdG8gdXNlIF9faW5saW5lLiAqLwotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgImJhc2ljX29wLmgiCi0jaW5jbHVkZSAib3Blcl8zMmIuaCIKLSNpbmNsdWRlICJhZGpfdGhyX2RhdGEuaCIKLSNpbmNsdWRlICJhZGpfdGhyLmgiCi0jaW5jbHVkZSAicWNfZGF0YS5oIgotI2luY2x1ZGUgImxpbmVfcGUuaCIKLQotCi0jZGVmaW5lICBtaW5TbnJMaW1pdCAgICAweDY2NjYgLyogMSBkQiAqLwotI2RlZmluZSAgUEVCSVRTX0NPRUYJMHgxNzBhIC8qIDAuMTgqKDEgPDwgMTUpKi8KLQotI2RlZmluZSAgSE9MRV9USFJfTE9ORwkweDI4NzMJLyogMC4zMTYqKDEgPDwgMTUpICovCi0jZGVmaW5lICBIT0xFX1RIUl9TSE9SVCAweDQwMDAgIC8qIDAuNSAgKigxIDw8IDE1KSAqLwotCi0jZGVmaW5lICBNU19USFJTUFJFQURfQ09FRiAweDczMzMgIC8qIDAuOSAqICgxIDw8IDE1KSAqLwotCi0jZGVmaW5lCSBNSU5fU05SX0NPRUYJICAgMHg2NTFmICAvKiAzLjE2KiAoMSA8PCAoMTUgLSAyKSkgKi8KLQotLyogdmFsdWVzIGZvciBhdm9pZCBob2xlIGZsYWcgKi8KLWVudW0gX2F2b2lkX2hvbGVfc3RhdGUgewotICBOT19BSCAgICAgICAgICAgICAgPTAsCi0gIEFIX0lOQUNUSVZFICAgICAgICA9MSwKLSAgQUhfQUNUSVZFICAgICAgICAgID0yCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTpiaXRzMnBlCi0qIGRlc2NyaXB0aW9uOiBjb252ZXJ0IGZyb20gYml0cyB0byBwZQotKgkJCSAgIHBlID0gMS4xOCpkZXNpcmVkQml0cwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVdvcmQxNiBiaXRzMnBlKGNvbnN0IFdvcmQxNiBiaXRzKSB7Ci0gIHJldHVybiAoYml0cyArICgoUEVCSVRTX0NPRUYgKiBiaXRzKSA+PiAxNSkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTpjYWxjVGhyZXNoRXhwCi0qIGRlc2NyaXB0aW9uOiBsb3VkbmVzcyBjYWxjdWxhdGlvbiAodGhyZXNob2xkIHRvIHRoZSBwb3dlciBvZiByZWRFeHApCi0qCQkJICAgdGhyKG4pXjAuMjUKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBjYWxjVGhyZXNoRXhwKFdvcmQzMiB0aHJFeHBbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgcHN5T3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgbkNoYW5uZWxzKQotewotICBXb3JkMTYgY2gsIHNmYiwgc2ZiR3JwOwotICBXb3JkMzIgKnB0aHJFeHAgPSBOVUxMLCAqcHNmYlRocmU7Ci0gIGZvciAoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7Ci0gICAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFuID0gJnBzeU91dENoYW5uZWxbY2hdOwotCSBmb3Ioc2ZiR3JwID0gMDsgc2ZiR3JwIDwgcHN5T3V0Q2hhbi0+c2ZiQ250OyBzZmJHcnArPSBwc3lPdXRDaGFuLT5zZmJQZXJHcm91cCkKLQkgIHB0aHJFeHAgPSAmKHRockV4cFtjaF1bc2ZiR3JwXSk7Ci0JICBwc2ZiVGhyZSA9IHBzeU91dENoYW4tPnNmYlRocmVzaG9sZCArIHNmYkdycDsKLQkgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFuLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKLQkJKnB0aHJFeHAgPSByc3FydChyc3FydCgqcHNmYlRocmUsSU5UX0JJVFMpLElOVF9CSVRTKTsKLQkJcHRockV4cCsrOyBwc2ZiVGhyZSsrOwotICAgICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOmFkYXB0TWluU25yCi0qIGRlc2NyaXB0aW9uOiByZWR1Y2UgbWluU25yIHJlcXVpcmVtZW50cyBmb3IgYmFuZHMgd2l0aCByZWxhdGl2ZSBsb3cgZW5lcmdpZXMKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBhZGFwdE1pblNucihQU1lfT1VUX0NIQU5ORUwgICAgIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICAgICAgbG9nU2ZiRW5lcmd5W01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1JTlNOUl9BREFQVF9QQVJBTSAqbXNhUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgICAgIG5DaGFubmVscykKLXsKLSAgV29yZDE2IGNoLCBzZmIsIHNmYk9mZnM7Ci0gIFdvcmQzMiBuU2ZiLCBhdmdFbjsKLSAgV29yZDE2IGxvZ19hdmdFbiA9IDA7Ci0gIFdvcmQzMiBzdGFydFJhdGlvX3hfYXZnRW4gPSAwOwotCi0KLSAgZm9yIChjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKLSAgICBQU1lfT1VUX0NIQU5ORUwqIHBzeU91dENoYW4gPSAmcHN5T3V0Q2hhbm5lbFtjaF07Ci0KLSAgICAvKiBjYWxjIGF2ZXJhZ2UgZW5lcmd5IHBlciBzY2FsZWZhY3RvciBiYW5kICovCi0gICAgYXZnRW4gPSAwOwotICAgIG5TZmIgPSAwOwotICAgIGZvciAoc2ZiT2Zmcz0wOyBzZmJPZmZzPHBzeU91dENoYW4tPnNmYkNudDsgc2ZiT2Zmcys9cHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXApIHsKLSAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFuLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKLSAgICAgICAgYXZnRW4gPSBMX2FkZChhdmdFbiwgcHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYk9mZnMrc2ZiXSk7Ci0gICAgICAgIG5TZmIgPSBuU2ZiICsgMTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoblNmYiA+IDApIHsKLQkgIGF2Z0VuID0gYXZnRW4gLyBuU2ZiOwotCi0gICAgICBsb2dfYXZnRW4gPSBpTG9nNChhdmdFbik7Ci0gICAgICBzdGFydFJhdGlvX3hfYXZnRW4gPSBmaXhtdWwobXNhUGFyYW0tPnN0YXJ0UmF0aW8sIGF2Z0VuKTsKLSAgICB9Ci0KLQotICAgIC8qIHJlZHVjZSBtaW5TbnIgcmVxdWlyZW1lbnQgYnkgbWluU25yXm1pblNuclJlZCBkZXBlbmRlbnQgb24gYXZnRW4vc2ZiRW4gKi8KLSAgICBmb3IgKHNmYk9mZnM9MDsgc2ZiT2Zmczxwc3lPdXRDaGFuLT5zZmJDbnQ7IHNmYk9mZnMrPXBzeU91dENoYW4tPnNmYlBlckdyb3VwKSB7Ci0gICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0gICAgICAgIGlmIChwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiT2ZmcytzZmJdIDwgc3RhcnRSYXRpb194X2F2Z0VuKSB7Ci0gICAgICAgICAgV29yZDE2IGRiUmF0aW8sIG1pblNuclJlZDsKLSAgICAgICAgICBXb3JkMzIgc25yUmVkOwotICAgICAgICAgIFdvcmQxNiBuZXdNaW5TbnI7Ci0KLSAgICAgICAgICBkYlJhdGlvID0gbG9nX2F2Z0VuIC0gbG9nU2ZiRW5lcmd5W2NoXVtzZmJPZmZzK3NmYl07Ci0gICAgICAgICAgZGJSYXRpbyA9IGRiUmF0aW8gKyAoZGJSYXRpbyA8PCAxKTsKLQotICAgICAgICAgIG1pblNuclJlZCA9IDExMCAtICgoZGJSYXRpbyArIChkYlJhdGlvIDw8IDEpKSA+PiAyKTsKLSAgICAgICAgICBtaW5TbnJSZWQgPSBtYXgobWluU25yUmVkLCAyMCk7IC8qIDExMDogKDAuMzc1KHJlZE9mZnMpKzEpKjgwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOiAwLjAwMzc1KHJlZFJhdGlvRmFjKSo4MAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDogMC4yNShtYXhSZWQpICogODAgKi8KLQotICAgICAgICAgIHNuclJlZCA9IG1pblNuclJlZCAqIGlMb2c0KChwc3lPdXRDaGFuLT5zZmJNaW5TbnJbc2ZiT2ZmcytzZmJdIDw8IDE2KSk7Ci0gICAgICAgICAgLyoKLSAgICAgICAgICAgICBzbnJSZWRJIHNpIG5vdyBzY2FsZWQgYnkgODAgKG1pblNuclJlZCkgYW5kIDQgKGZmcl9pTG9nNCkKLSAgICAgICAgICAqLwotCi0gICAgICAgICAgbmV3TWluU25yID0gcm91bmQxNihwb3cyX3h5KHNuclJlZCw4MCo0KSk7Ci0KLSAgICAgICAgICBwc3lPdXRDaGFuLT5zZmJNaW5TbnJbc2ZiT2ZmcytzZmJdID0gbWluKG5ld01pblNuciwgbWluU25yTGltaXQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTppbml0QXZvaWRIb2xlRmxhZwotKiBkZXNjcmlwdGlvbjogZGV0ZXJtaW5lIGJhbmRzIHdoZXJlIGF2b2lkIGhvbGUgaXMgbm90IG5lY2Vzc2FyeSByZXNwLiBwb3NzaWJsZQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGluaXRBdm9pZEhvbGVGbGFnKFdvcmQxNiBhaEZsYWdbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMICBwc3lPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQqIHBzeU91dEVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgbkNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUhfUEFSQU0gKmFoUGFyYW0pCi17Ci0gIFdvcmQxNiBjaCwgc2ZiLCBzZmJHcnAsIHNoaWZ0OwotICBXb3JkMzIgdGhyZXNob2xkOwotICBXb3JkMzIqIHBzZmJTcHJlYWRFbjsKLQotICBmb3IgKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgewotICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbiA9ICZwc3lPdXRDaGFubmVsW2NoXTsKLQotICAgIGlmIChwc3lPdXRDaGFuLT53aW5kb3dTZXF1ZW5jZSAhPSBTSE9SVF9XSU5ET1cpIHsKLSAgICAgIGZvcihzZmJHcnAgPSAwO3NmYkdycCA8IHBzeU91dENoYW4tPnNmYkNudDtzZmJHcnArPSBwc3lPdXRDaGFuLT5zZmJQZXJHcm91cCl7Ci0gICAgICAgICBwc2ZiU3ByZWFkRW4gPSBwc3lPdXRDaGFuLT5zZmJTcHJlYWRlZEVuZXJneSArIHNmYkdycDsKLQkJIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFuLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKLQkJCSpwc2ZiU3ByZWFkRW4gPSAqcHNmYlNwcmVhZEVuID4+IDE7ICAvKiAwLjUgKi8KLQkJCSsrcHNmYlNwcmVhZEVuOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgZm9yKHNmYkdycCA9IDA7c2ZiR3JwIDwgcHN5T3V0Q2hhbi0+c2ZiQ250O3NmYkdycCs9IHBzeU91dENoYW4tPnNmYlBlckdyb3VwKXsKLQkJcHNmYlNwcmVhZEVuID0gcHN5T3V0Q2hhbi0+c2ZiU3ByZWFkZWRFbmVyZ3kgKyBzZmJHcnA7Ci0gICAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFuLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKLSAgICAgICAgICAqcHNmYlNwcmVhZEVuID0gKCpwc2ZiU3ByZWFkRW4gPj4gMSkgKyAoKnBzZmJTcHJlYWRFbiA+PiAzKTsgIC8qIDAuNjMgKi8KLQkJICArK3BzZmJTcHJlYWRFbjsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qIGluY3JlYXNlIG1pblNuciBmb3IgbG9jYWwgcGVha3MsIGRlY3JlYXNlIGl0IGZvciB2YWxsZXlzICovCi0gIGlmIChhaFBhcmFtLT5tb2RpZnlNaW5TbnIpIHsKLSAgICBmb3IoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7Ci0gICAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4gPSAmcHN5T3V0Q2hhbm5lbFtjaF07Ci0KLSAgICAgIGlmIChwc3lPdXRDaGFuLT53aW5kb3dTZXF1ZW5jZSAhPSBTSE9SVF9XSU5ET1cpCi0gICAgICAgIHRocmVzaG9sZCA9IEhPTEVfVEhSX0xPTkc7Ci0gICAgICBlbHNlCi0gICAgICAgIHRocmVzaG9sZCA9IEhPTEVfVEhSX1NIT1JUOwotCi0gICAgICBmb3Ioc2ZiR3JwID0gMDtzZmJHcnAgPCBwc3lPdXRDaGFuLT5zZmJDbnQ7c2ZiR3JwKz0gcHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXApewotICAgICAgICBXb3JkMTYgKnBzZmJNaW5TbnIgPSBwc3lPdXRDaGFuLT5zZmJNaW5TbnIgKyBzZmJHcnA7Ci0JCWZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFuLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKLSAgICAgICAgICBXb3JkMzIgc2ZiRW4sIHNmYkVubTEsIHNmYkVucDEsIGF2Z0VuOwotCi0gICAgICAgICAgaWYgKHNmYiA+IDApCi0gICAgICAgICAgICBzZmJFbm0xID0gcHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYkdycCtzZmItMV07Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgc2ZiRW5tMSA9IHBzeU91dENoYW4tPnNmYkVuZXJneVtzZmJHcnBdOwotCi0gICAgICAgICAgaWYgKHNmYiA8IChwc3lPdXRDaGFuLT5tYXhTZmJQZXJHcm91cC0xKSkKLSAgICAgICAgICAgIHNmYkVucDEgPSBwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYisxXTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBzZmJFbnAxID0gcHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdOwotICAgICAgICAgIGF2Z0VuID0gKHNmYkVubTEgKyBzZmJFbnAxKSA+PiAxOwotICAgICAgICAgIHNmYkVuID0gcHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdOwotCi0gICAgICAgICAgaWYgKHNmYkVuID4gYXZnRW4gJiYgYXZnRW4gPiAwKSB7Ci0gICAgICAgICAgICBXb3JkMzIgdG1wTWluU25yOwotICAgICAgICAgICAgc2hpZnQgPSBub3JtX2woc2ZiRW4pOwotCQkJdG1wTWluU25yID0gRGl2XzMyKExfbXB5X2xzKGF2Z0VuLCBtaW5TbnJMaW1pdCkgPDwgc2hpZnQsIHNmYkVuIDw8IHNoaWZ0ICk7Ci0gICAgICAgICAgICB0bXBNaW5TbnIgPSBtYXgodG1wTWluU25yLCBIT0xFX1RIUl9MT05HKTsKLSAgICAgICAgICAgIHRtcE1pblNuciA9IG1heCh0bXBNaW5TbnIsIHRocmVzaG9sZCk7Ci0gICAgICAgICAgICAqcHNmYk1pblNuciA9IG1pbigqcHNmYk1pblNuciwgdG1wTWluU25yKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLyogdmFsbGV5ID8gKi8KLQotICAgICAgICAgIGlmICgoc2ZiRW4gPCAoYXZnRW4gPj4gMSkpICYmIChzZmJFbiA+IDApKSB7Ci0gICAgICAgICAgICBXb3JkMzIgdG1wTWluU25yOwotICAgICAgICAgICAgV29yZDMyIG1pblNuckVuID0gTF9tcHlfd3goYXZnRW4sICpwc2ZiTWluU25yKTsKLQotICAgICAgICAgICAgaWYobWluU25yRW4gPCBzZmJFbikgewotCQkJICBzaGlmdCA9IG5vcm1fbChzZmJFbik7Ci0gICAgICAgICAgICAgIHRtcE1pblNuciA9IERpdl8zMiggbWluU25yRW4gPDwgc2hpZnQsIHNmYkVuPDxzaGlmdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgdG1wTWluU25yID0gTUFYXzE2OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdG1wTWluU25yID0gbWluKG1pblNuckxpbWl0LCB0bXBNaW5TbnIpOwotCi0gICAgICAgICAgICAqcHNmYk1pblNuciA9Ci0gICAgICAgICAgICAgIChtaW4oKHRtcE1pblNuciA+PiAgMiksIG11bHQoKnBzZmJNaW5TbnIsIE1JTl9TTlJfQ09FRikpIDw8IDIpOwotICAgICAgICAgIH0KLQkJICBwc2ZiTWluU25yKys7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKiBzdGVyZW86IGFkYXB0IHRoZSBtaW5pbXVtIHJlcXVpcmVtZW50cyBzZmJNaW5TbnIgb2YgbWlkIGFuZAotICAgICBzaWRlIGNoYW5uZWxzICovCi0KLSAgaWYgKG5DaGFubmVscyA9PSAyKSB7Ci0gICAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFuTSA9ICZwc3lPdXRDaGFubmVsWzBdOwotICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhblMgPSAmcHN5T3V0Q2hhbm5lbFsxXTsKLSAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbk0tPnNmYkNudDsgc2ZiKyspIHsKLSAgICAgIGlmIChwc3lPdXRFbGVtZW50LT50b29sc0luZm8ubXNNYXNrW3NmYl0pIHsKLSAgICAgICAgV29yZDMyIHNmYkVuTSA9IHBzeU91dENoYW5NLT5zZmJFbmVyZ3lbc2ZiXTsKLSAgICAgICAgV29yZDMyIHNmYkVuUyA9IHBzeU91dENoYW5TLT5zZmJFbmVyZ3lbc2ZiXTsKLSAgICAgICAgV29yZDMyIG1heFNmYkVuID0gbWF4KHNmYkVuTSwgc2ZiRW5TKTsKLSAgICAgICAgV29yZDMyIG1heFRociA9IExfbXB5X3d4KG1heFNmYkVuLCBwc3lPdXRDaGFuTS0+c2ZiTWluU25yW3NmYl0pID4+IDE7Ci0KLSAgICAgICAgaWYobWF4VGhyID49IHNmYkVuTSkgewotICAgICAgICAgIHBzeU91dENoYW5NLT5zZmJNaW5TbnJbc2ZiXSA9IE1BWF8xNjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICBzaGlmdCA9IG5vcm1fbChzZmJFbk0pOwotCQkgIHBzeU91dENoYW5NLT5zZmJNaW5TbnJbc2ZiXSA9IG1pbihtYXgocHN5T3V0Q2hhbk0tPnNmYk1pblNucltzZmJdLAotCQkJICByb3VuZDE2KERpdl8zMihtYXhUaHI8PHNoaWZ0LCBzZmJFbk0gPDwgc2hpZnQpKSksIG1pblNuckxpbWl0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKG1heFRociA+PSBzZmJFblMpIHsKLSAgICAgICAgICBwc3lPdXRDaGFuUy0+c2ZiTWluU25yW3NmYl0gPSBNQVhfMTY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0JCSAgc2hpZnQgPSBub3JtX2woc2ZiRW5TKTsKLSAgICAgICAgICBwc3lPdXRDaGFuUy0+c2ZiTWluU25yW3NmYl0gPSBtaW4obWF4KHBzeU91dENoYW5TLT5zZmJNaW5TbnJbc2ZiXSwKLQkJCSAgcm91bmQxNihEaXZfMzIobWF4VGhyIDw8IHNoaWZ0LCBzZmJFblMgPDwgc2hpZnQpKSksIG1pblNuckxpbWl0KTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYgKHNmYkVuTSA+IHBzeU91dENoYW5NLT5zZmJTcHJlYWRlZEVuZXJneVtzZmJdKQotICAgICAgICAgIHBzeU91dENoYW5TLT5zZmJTcHJlYWRlZEVuZXJneVtzZmJdID0gTF9tcHlfbHMoc2ZiRW5TLCBNU19USFJTUFJFQURfQ09FRik7Ci0KLSAgICAgICAgaWYgKHNmYkVuUyA+IHBzeU91dENoYW5TLT5zZmJTcHJlYWRlZEVuZXJneVtzZmJdKQotICAgICAgICAgIHBzeU91dENoYW5NLT5zZmJTcHJlYWRlZEVuZXJneVtzZmJdID0gTF9tcHlfbHMoc2ZiRW5NLCBNU19USFJTUFJFQURfQ09FRik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICAvKiBpbml0IGFoRmxhZyAoMDogbm8gYWggbmVjZXNzYXJ5LCAxOiBhaCBwb3NzaWJsZSwgMjogYWggYWN0aXZlICovCi0gIGZvcihjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKLSAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4gPSAmcHN5T3V0Q2hhbm5lbFtjaF07Ci0gICAgZm9yKHNmYkdycCA9IDA7c2ZiR3JwIDwgcHN5T3V0Q2hhbi0+c2ZiQ250O3NmYkdycCs9IHBzeU91dENoYW4tPnNmYlBlckdyb3VwKXsKLSAgICAgIFdvcmQxNiAqcGFoRmxhZyA9IGFoRmxhZ1tjaF0gKyBzZmJHcnA7Ci0JICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0KLSAgICAgICAgaWYgKChwc3lPdXRDaGFuLT5zZmJTcHJlYWRlZEVuZXJneVtzZmJHcnArc2ZiXSA+IHBzeU91dENoYW4tPnNmYkVuZXJneVtzZmJHcnArc2ZiXSkgfHwKLSAgICAgICAgICAgIChwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYl0gPD0gcHN5T3V0Q2hhbi0+c2ZiVGhyZXNob2xkW3NmYkdycCtzZmJdKSB8fAotICAgICAgICAgICAgKHBzeU91dENoYW4tPnNmYk1pblNucltzZmJHcnArc2ZiXSA9PSBNQVhfMTYpKSB7Ci0gICAgICAgICAgKnBhaEZsYWcrKyA9IE5PX0FIOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICpwYWhGbGFnKysgPSBBSF9JTkFDVElWRTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZm9yIChzZmI9cHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYjxwc3lPdXRDaGFuLT5zZmJQZXJHcm91cDsgc2ZiKyspIHsKLSAgICAgICAgKnBhaEZsYWcrKyA9IE5PX0FIOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTpjYWxjUGVOb0FICi0qIGRlc2NyaXB0aW9uOiBzdW0gdGhlIHBlIGRhdGEgb25seSBmb3IgYmFuZHMgd2hlcmUgYXZvaWQgaG9sZSBpcyBpbmFjdGl2ZQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGNhbGNQZU5vQUgoV29yZDE2ICAgICAgICAgICpwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgICpjb25zdFBhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICAqbkFjdGl2ZUxpbmVzLAotICAgICAgICAgICAgICAgICAgICAgICBQRV9EQVRBICAgICAgICAgKnBlRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgICBhaEZsYWdbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAotICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICBuQ2hhbm5lbHMpCi17Ci0gIFdvcmQxNiBjaCwgc2ZiLCBzZmJHcnA7Ci0gIGludCBpcGUsIGljb25zdFBhcnQsIGluQWN0aXZlTGluZXM7Ci0KLSAgaXBlID0gMDsKLSAgaWNvbnN0UGFydCA9IDA7Ci0gIGluQWN0aXZlTGluZXMgPSAwOwotICBmb3IoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7Ci0gICAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFuID0gJnBzeU91dENoYW5uZWxbY2hdOwotICAgIFBFX0NIQU5ORUxfREFUQSAqcGVDaGFuRGF0YSA9ICZwZURhdGEtPnBlQ2hhbm5lbERhdGFbY2hdOwotICAgIGZvcihzZmJHcnAgPSAwO3NmYkdycCA8IHBzeU91dENoYW4tPnNmYkNudDtzZmJHcnArPSBwc3lPdXRDaGFuLT5zZmJQZXJHcm91cCl7Ci0gICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0KLSAgICAgICAgaWYgKGFoRmxhZ1tjaF1bc2ZiR3JwK3NmYl0gPCBBSF9BQ1RJVkUpIHsKLSAgICAgICAgICBpcGUgPSBpcGUgKyBwZUNoYW5EYXRhLT5zZmJQZVtzZmJHcnArc2ZiXTsKLSAgICAgICAgICBpY29uc3RQYXJ0ID0gaWNvbnN0UGFydCArIHBlQ2hhbkRhdGEtPnNmYkNvbnN0UGFydFtzZmJHcnArc2ZiXTsKLSAgICAgICAgICBpbkFjdGl2ZUxpbmVzID0gaW5BY3RpdmVMaW5lcyArIHBlQ2hhbkRhdGEtPnNmYk5BY3RpdmVMaW5lc1tzZmJHcnArc2ZiXTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gICpwZSA9IHNhdHVyYXRlKGlwZSk7Ci0gICpjb25zdFBhcnQgPSBzYXR1cmF0ZShpY29uc3RQYXJ0KTsKLSAgKm5BY3RpdmVMaW5lcyA9IHNhdHVyYXRlKGluQWN0aXZlTGluZXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTpyZWR1Y2VUaHJlc2hvbGRzCi0qIGRlc2NyaXB0aW9uOiBhcHBseSByZWR1Y3Rpb24gZm9ybXVsYQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHJlZHVjZVRocmVzaG9sZHMoUFNZX09VVF9DSEFOTkVMICBwc3lPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICAgYWhGbGFnW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICAgICB0aHJFeHBbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgIG5DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDMyICAgICByZWRWYWwpCi17Ci0gIFdvcmQzMiBzZmJUaHJSZWR1Y2VkOwotICBXb3JkMzIgKnBzZmJFbiwgKnBzZmJUaHI7Ci0gIFdvcmQxNiBjaCwgc2ZiLCBzZmJHcnA7Ci0KLSAgZm9yKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgewotICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbiA9ICZwc3lPdXRDaGFubmVsW2NoXTsKLSAgICBmb3Ioc2ZiR3JwPTA7IHNmYkdycDxwc3lPdXRDaGFuLT5zZmJDbnQ7IHNmYkdycCs9cHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXApIHsKLSAJICBwc2ZiRW4gID0gcHN5T3V0Q2hhbi0+c2ZiRW5lcmd5ICsgc2ZiR3JwOwotICAgICAgcHNmYlRociA9IHBzeU91dENoYW4tPnNmYlRocmVzaG9sZCArIHNmYkdycDsKLQkgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFuLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKLQotICAgICAgICBpZiAoKnBzZmJFbiA+ICpwc2ZiVGhyKSB7Ci0gICAgICAgICAgLyogdGhyZXNob2xkIHJlZHVjdGlvbiBmb3JtdWxhICovCi0gICAgICAgICAgV29yZDMyIHRtcCA9IHRockV4cFtjaF1bc2ZiR3JwK3NmYl0gKyByZWRWYWw7Ci0gICAgICAgICAgdG1wID0gZml4bXVsKHRtcCwgdG1wKTsKLSAgICAgICAgICBzZmJUaHJSZWR1Y2VkID0gZml4bXVsKHRtcCwgdG1wKTsKLSAgICAgICAgICAvKiBhdm9pZCBob2xlcyAqLwotICAgICAgICAgIHRtcCA9IExfbXB5X2xzKCpwc2ZiRW4sIHBzeU91dENoYW4tPnNmYk1pblNucltzZmJHcnArc2ZiXSk7Ci0KLSAgICAgICAgICBpZiAoKHNmYlRoclJlZHVjZWQgPiB0bXApICYmCi0gICAgICAgICAgICAgIChhaEZsYWdbY2hdW3NmYkdycCtzZmJdICE9IE5PX0FIKSl7Ci0gICAgICAgICAgICBzZmJUaHJSZWR1Y2VkID0gbWF4KHRtcCwgKnBzZmJUaHIpOwotICAgICAgICAgICAgYWhGbGFnW2NoXVtzZmJHcnArc2ZiXSA9IEFIX0FDVElWRTsKLSAgICAgICAgICB9Ci0JCSAgKnBzZmJUaHIgPSBzZmJUaHJSZWR1Y2VkOwotICAgICAgICB9Ci0KLQkJcHNmYkVuKys7ICBwc2ZiVGhyKys7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6Y29ycmVjdFRocmVzaAotKiBkZXNjcmlwdGlvbjogaWYgcGUgZGlmZmVyZW5jZSBkZWx0YVBlIGJldHdlZW4gZGVzaXJlZCBwZSBhbmQgcmVhbCBwZSBpcyBzbWFsbCBlbm91Z2gsCi0qICAgICAgICAgICAgIHRoZSBkaWZmZXJlbmNlIGNhbiBiZSBkaXN0cmlidXRlZCBhbW9uZyB0aGUgc2NhbGUgZmFjdG9yIGJhbmRzLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGNvcnJlY3RUaHJlc2goUFNZX09VVF9DSEFOTkVMICBwc3lPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICAgYWhGbGFnW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUEVfREFUQSAgICAgICAgICAqcGVEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgICAgIHRockV4cFtNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQzMiAgICAgcmVkVmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgIG5DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDMyICAgICBkZWx0YVBlKQotewotICBXb3JkMTYgY2gsIHNmYiwgc2ZiR3JwLHNoaWZ0OwotICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW47Ci0gIFBFX0NIQU5ORUxfREFUQSAqcGVDaGFuRGF0YTsKLSAgV29yZDMyIGRlbHRhU2ZiUGU7Ci0gIFdvcmQzMiBub3JtRmFjdG9yOwotICBXb3JkMzIgKnBzZmJQZUZhY3RvcnM7Ci0gIFdvcmQxNiAqcHNmYk5BY3RpdmVMaW5lcywgKnBhaEZsYWc7Ci0gIFdvcmQzMiBzZmJFbiwgc2ZiVGhyOwotICBXb3JkMzIgc2ZiVGhyUmVkdWNlZDsKLQotICAvKiBmb3IgZWFjaCBzZmIgY2FsYyByZWxhdGl2ZSBmYWN0b3JzIGZvciBwZSBjaGFuZ2VzICovCi0gIG5vcm1GYWN0b3IgPSAxOwotICBmb3IoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7Ci0gICAgcHN5T3V0Q2hhbiA9ICZwc3lPdXRDaGFubmVsW2NoXTsKLSAgICBwZUNoYW5EYXRhID0gJnBlRGF0YS0+cGVDaGFubmVsRGF0YVtjaF07Ci0gICAgZm9yKHNmYkdycCA9IDA7c2ZiR3JwIDwgcHN5T3V0Q2hhbi0+c2ZiQ250O3NmYkdycCs9IHBzeU91dENoYW4tPnNmYlBlckdyb3VwKXsKLSAgICAgIHBzZmJQZUZhY3RvcnMgPSBwZURhdGEtPnNmYlBlRmFjdG9yc1tjaF0gKyBzZmJHcnA7Ci0JICBwc2ZiTkFjdGl2ZUxpbmVzID0gcGVDaGFuRGF0YS0+c2ZiTkFjdGl2ZUxpbmVzICsgc2ZiR3JwOwotCSAgcGFoRmxhZyA9IGFoRmxhZ1tjaF0gKyBzZmJHcnA7Ci0JICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0gICAgICAgIFdvcmQzMiByZWRUaHJFeHAgPSB0aHJFeHBbY2hdW3NmYkdycCtzZmJdICsgcmVkVmFsOwotCi0gICAgICAgIGlmICgoKCpwYWhGbGFnIDwgQUhfQUNUSVZFKSB8fCAoZGVsdGFQZSA+IDApKSAmJiAocmVkVGhyRXhwID4gMCkgJiYgKHJlZFRockV4cCA+PSAqcHNmYk5BY3RpdmVMaW5lcykpIHsKLQotICAgICAgICAgICpwc2ZiUGVGYWN0b3JzID0gKCpwc2ZiTkFjdGl2ZUxpbmVzKSAqICgweDdmZmZmZmZmIC8gcmVkVGhyRXhwKTsKLSAgICAgICAgICBub3JtRmFjdG9yID0gTF9hZGQobm9ybUZhY3RvciwgKnBzZmJQZUZhY3RvcnMpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICpwc2ZiUGVGYWN0b3JzID0gMDsKLSAgICAgICAgfQotCQlwc2ZiUGVGYWN0b3JzKys7Ci0JCXBhaEZsYWcrKzsgcHNmYk5BY3RpdmVMaW5lcysrOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgLyogY2FsY3VsYXRlIG5ldyB0aHJlc2hvbGRzICovCi0gIGZvcihjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKLSAgICBwc3lPdXRDaGFuID0gJnBzeU91dENoYW5uZWxbY2hdOwotICAgIHBlQ2hhbkRhdGEgPSAmcGVEYXRhLT5wZUNoYW5uZWxEYXRhW2NoXTsKLSAgICBmb3Ioc2ZiR3JwID0gMDtzZmJHcnAgPCBwc3lPdXRDaGFuLT5zZmJDbnQ7c2ZiR3JwKz0gcHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXApewotICAgICAgcHNmYlBlRmFjdG9ycyA9IHBlRGF0YS0+c2ZiUGVGYWN0b3JzW2NoXSArIHNmYkdycDsKLQkgIHBzZmJOQWN0aXZlTGluZXMgPSBwZUNoYW5EYXRhLT5zZmJOQWN0aXZlTGluZXMgKyBzZmJHcnA7Ci0JICBwYWhGbGFnID0gYWhGbGFnW2NoXSArIHNmYkdycDsKLQkgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFuLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKLSAgICAgICAgLyogcGUgZGlmZmVyZW5jZSBmb3IgdGhpcyBzZmIgKi8KLSAgICAgICAgZGVsdGFTZmJQZSA9ICpwc2ZiUGVGYWN0b3JzICogZGVsdGFQZTsKLQotCQkvKiB0aHIzKG4pID0gdGhyMihuKSoyXmRlbHRhU2ZiUGUvYihuKSAqLwotICAgICAgICBpZiAoKnBzZmJOQWN0aXZlTGluZXMgPiAwICYmIChub3JtRmFjdG9yKiAoKnBzZmJOQWN0aXZlTGluZXMpKSAhPSAwKSB7Ci0gICAgICAgICAgLyogbmV3IHRocmVzaG9sZCAqLwotICAgICAgICAgIFdvcmQzMiB0aHJGYWN0b3I7Ci0gICAgICAgICAgc2ZiRW4gID0gcHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdOwotICAgICAgICAgIHNmYlRociA9IHBzeU91dENoYW4tPnNmYlRocmVzaG9sZFtzZmJHcnArc2ZiXTsKLQotICAgICAgICAgICBpZihkZWx0YVNmYlBlID49IDApewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgcmVkdWNlIHRocmVzaG9sZAotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHRockZhY3RvciA9IHBvdzJfeHkoTF9uZWdhdGUoZGVsdGFTZmJQZSksIChub3JtRmFjdG9yKiAoKnBzZmJOQWN0aXZlTGluZXMpKSk7Ci0KLSAgICAgICAgICAgIHNmYlRoclJlZHVjZWQgPSBMX21weV9scyhzZmJUaHIsIHJvdW5kMTYodGhyRmFjdG9yKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgaW5jcmVhc2UgdGhyZXNob2xkCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgdGhyRmFjdG9yID0gcG93Ml94eShkZWx0YVNmYlBlLCAobm9ybUZhY3RvciAqICgqcHNmYk5BY3RpdmVMaW5lcykpKTsKLQotCi0gICAgICAgICAgICBpZih0aHJGYWN0b3IgPiBzZmJUaHIpIHsKLSAgICAgICAgICAgICAgc2hpZnQgPSBub3JtX2wodGhyRmFjdG9yKTsKLQkJCSAgc2ZiVGhyUmVkdWNlZCA9IERpdl8zMiggc2ZiVGhyIDw8IHNoaWZ0LCB0aHJGYWN0b3I8PHNoaWZ0ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZCA9IE1BWF8zMjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgIH0KLQotICAgICAgICAgIC8qIGF2b2lkIGhvbGUgKi8KLSAgICAgICAgICBzZmJFbiA9IExfbXB5X2xzKHNmYkVuLCBwc3lPdXRDaGFuLT5zZmJNaW5TbnJbc2ZiR3JwK3NmYl0pOwotCi0gICAgICAgICAgaWYgKChzZmJUaHJSZWR1Y2VkID4gc2ZiRW4pICYmCi0gICAgICAgICAgICAgICgqcGFoRmxhZyA9PSBBSF9JTkFDVElWRSkpIHsKLSAgICAgICAgICAgIHNmYlRoclJlZHVjZWQgPSBtYXgoc2ZiRW4sIHNmYlRocik7Ci0gICAgICAgICAgICAqcGFoRmxhZyA9IEFIX0FDVElWRTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBwc3lPdXRDaGFuLT5zZmJUaHJlc2hvbGRbc2ZiR3JwK3NmYl0gPSBzZmJUaHJSZWR1Y2VkOwotICAgICAgICB9Ci0KLQkJcGFoRmxhZysrOyBwc2ZiTkFjdGl2ZUxpbmVzKys7IHBzZmJQZUZhY3RvcnMrKzsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTpyZWR1Y2VNaW5TbnIKLSogZGVzY3JpcHRpb246IGlmIHRoZSBkZXNpcmVkIHBlIGNhbiBub3QgYmUgcmVhY2hlZCwgcmVkdWNlIHBlIGJ5IHJlZHVjaW5nIG1pblNucgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHJlZHVjZU1pblNucihQU1lfT1VUX0NIQU5ORUwgIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBQRV9EQVRBICAgICAgICAgKnBlRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgIGFoRmxhZ1tNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICBuQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICBkZXNpcmVkUGUpCi17Ci0gIFdvcmQxNiBjaCwgc2ZiLCBzZmJTdWJXaW47Ci0gIFdvcmQxNiBkZWx0YVBlOwotCi0gIC8qIHN0YXJ0IGF0IGhpZ2hlc3QgZnJlcSBkb3duIHRvIDAgKi8KLSAgc2ZiU3ViV2luID0gcHN5T3V0Q2hhbm5lbFswXS5tYXhTZmJQZXJHcm91cDsKLSAgd2hpbGUgKHBlRGF0YS0+cGUgPiBkZXNpcmVkUGUgJiYgc2ZiU3ViV2luID4gMCkgewotCi0gICAgc2ZiU3ViV2luID0gc2ZiU3ViV2luIC0gMTsKLSAgICAvKiBsb29wIG92ZXIgYWxsIHN1YndpbmRvd3MgKi8KLSAgICBmb3IgKHNmYj1zZmJTdWJXaW47IHNmYjxwc3lPdXRDaGFubmVsWzBdLnNmYkNudDsKLSAgICAgICAgc2ZiKz1wc3lPdXRDaGFubmVsWzBdLnNmYlBlckdyb3VwKSB7Ci0gICAgICAvKiBsb29wIG92ZXIgYWxsIGNoYW5uZWxzICovCi0JCVBFX0NIQU5ORUxfREFUQSogcGVDaGFuID0gcGVEYXRhLT5wZUNoYW5uZWxEYXRhOwotCQlQU1lfT1VUX0NIQU5ORUwqIHBzeU91dENoID0gcHN5T3V0Q2hhbm5lbDsKLQkJZm9yIChjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKLSAgICAgICAgaWYgKGFoRmxhZ1tjaF1bc2ZiXSAhPSBOT19BSCAmJgotICAgICAgICAgICAgcHN5T3V0Q2gtPnNmYk1pblNucltzZmJdIDwgbWluU25yTGltaXQpIHsKLSAgICAgICAgICBwc3lPdXRDaC0+c2ZiTWluU25yW3NmYl0gPSBtaW5TbnJMaW1pdDsKLSAgICAgICAgICBwc3lPdXRDaC0+c2ZiVGhyZXNob2xkW3NmYl0gPQotICAgICAgICAgICAgTF9tcHlfbHMocHN5T3V0Q2gtPnNmYkVuZXJneVtzZmJdLCBwc3lPdXRDaC0+c2ZiTWluU25yW3NmYl0pOwotCi0gICAgICAgICAgLyogY2FsYyBuZXcgcGUgKi8KLSAgICAgICAgICBkZWx0YVBlID0gKChwZUNoYW4tPnNmYk5MaW5lczRbc2ZiXSArIChwZUNoYW4tPnNmYk5MaW5lczRbc2ZiXSA+PiAxKSkgPj4gMikgLQotICAgICAgICAgICAgICBwZUNoYW4tPnNmYlBlW3NmYl07Ci0gICAgICAgICAgcGVEYXRhLT5wZSA9IHBlRGF0YS0+cGUgKyBkZWx0YVBlOwotICAgICAgICAgIHBlQ2hhbi0+cGUgPSBwZUNoYW4tPnBlICsgZGVsdGFQZTsKLSAgICAgICAgfQotCQlwZUNoYW4gKz0gMTsgcHN5T3V0Q2ggKz0gMTsKLSAgICAgIH0KLSAgICAgIC8qIHN0b3AgaWYgZW5vdWdoIGhhcyBiZWVuIHNhdmVkICovCi0KLSAgICAgIGlmIChwZURhdGEtPnBlIDw9IGRlc2lyZWRQZSkKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOmFsbG93TW9yZUhvbGVzCi0qIGRlc2NyaXB0aW9uOiBpZiB0aGUgZGVzaXJlZCBwZSBjYW4gbm90IGJlIHJlYWNoZWQsIHNvbWUgbW9yZSBzY2FsZWZhY3RvciBiYW5kcwotKiAgICAgICAgICAgICAgaGF2ZSB0byBiZSBxdWFudGl6ZWQgdG8gemVybwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGFsbG93TW9yZUhvbGVzKFBTWV9PVVRfQ0hBTk5FTCAgcHN5T3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UICpwc3lPdXRFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUEVfREFUQSAgICAgICAgICpwZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgIGFoRmxhZ1tNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBSF9QQVJBTSAgKmFoUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgIG5DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgZGVzaXJlZFBlKQotewotICBXb3JkMTYgY2gsIHNmYjsKLSAgV29yZDE2IGFjdFBlLCBzaGlmdDsKLQotICBhY3RQZSA9IHBlRGF0YS0+cGU7Ci0KLSAgLyogZm9yIE1TIGFsbG93IGhvbGUgaW4gdGhlIGNoYW5uZWwgd2l0aCBsZXNzIGVuZXJneSAqLwotCi0gIGlmIChuQ2hhbm5lbHM9PTIgJiYKLSAgICAgIHBzeU91dENoYW5uZWxbMF0ud2luZG93U2VxdWVuY2U9PXBzeU91dENoYW5uZWxbMV0ud2luZG93U2VxdWVuY2UpIHsKLSAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW5MID0gJnBzeU91dENoYW5uZWxbMF07Ci0gICAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFuUiA9ICZwc3lPdXRDaGFubmVsWzFdOwotICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFuTC0+c2ZiQ250OyBzZmIrKykgewotICAgICAgV29yZDMyIG1pbkVuOwotCi0gICAgICBpZiAocHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLm1zTWFza1tzZmJdKSB7Ci0gICAgICAgIC8qIGFsbG93IGhvbGUgaW4gc2lkZSBjaGFubmVsID8gKi8KLSAgICAgICAgbWluRW4gPSBMX21weV9scyhwc3lPdXRDaGFuTC0+c2ZiRW5lcmd5W3NmYl0sIChtaW5TbnJMaW1pdCAqIHBzeU91dENoYW5MLT5zZmJNaW5TbnJbc2ZiXSkgPj4gMTYpOwotCi0gICAgICAgIGlmIChhaEZsYWdbMV1bc2ZiXSAhPSBOT19BSCAmJgotICAgICAgICAgICAgbWluRW4gPiBwc3lPdXRDaGFuUi0+c2ZiRW5lcmd5W3NmYl0pIHsKLSAgICAgICAgICBhaEZsYWdbMV1bc2ZiXSA9IE5PX0FIOwotICAgICAgICAgIHBzeU91dENoYW5SLT5zZmJUaHJlc2hvbGRbc2ZiXSA9IExfYWRkKHBzeU91dENoYW5SLT5zZmJFbmVyZ3lbc2ZiXSwgcHN5T3V0Q2hhblItPnNmYkVuZXJneVtzZmJdKTsKLSAgICAgICAgICBhY3RQZSA9IGFjdFBlIC0gcGVEYXRhLT5wZUNoYW5uZWxEYXRhWzFdLnNmYlBlW3NmYl07Ci0gICAgICAgIH0KLSAgICAgICAgLyogYWxsb3cgaG9sZSBpbiBtaWQgY2hhbm5lbCA/ICovCi0gICAgICAgIGVsc2UgewotICAgICAgICBtaW5FbiA9IExfbXB5X2xzKHBzeU91dENoYW5SLT5zZmJFbmVyZ3lbc2ZiXSwgKG1pblNuckxpbWl0ICogcHN5T3V0Q2hhblItPnNmYk1pblNucltzZmJdKSA+PiAxNik7Ci0KLSAgICAgICAgICBpZiAoYWhGbGFnWzBdW3NmYl0hPSBOT19BSCAmJgotICAgICAgICAgICAgICBtaW5FbiA+IHBzeU91dENoYW5MLT5zZmJFbmVyZ3lbc2ZiXSkgewotICAgICAgICAgICAgYWhGbGFnWzBdW3NmYl0gPSBOT19BSDsKLSAgICAgICAgICAgIHBzeU91dENoYW5MLT5zZmJUaHJlc2hvbGRbc2ZiXSA9IExfYWRkKHBzeU91dENoYW5MLT5zZmJFbmVyZ3lbc2ZiXSwgcHN5T3V0Q2hhbkwtPnNmYkVuZXJneVtzZmJdKTsKLSAgICAgICAgICAgIGFjdFBlID0gYWN0UGUgLSBwZURhdGEtPnBlQ2hhbm5lbERhdGFbMF0uc2ZiUGVbc2ZiXTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYWN0UGUgPCBkZXNpcmVkUGUpCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogc3Vic2VxdWVudGx5IGVyYXNlIGJhbmRzICovCi0gIGlmIChhY3RQZSA+IGRlc2lyZWRQZSkgewotICAgIFdvcmQxNiBzdGFydFNmYlsyXTsKLSAgICBXb3JkMzIgYXZnRW4sIG1pbkVuOwotICAgIFdvcmQxNiBhaENudDsKLSAgICBXb3JkMTYgZW5JZHg7Ci0gICAgV29yZDE2IGVuRGlmZjsKLSAgICBXb3JkMzIgZW5bNF07Ci0gICAgV29yZDE2IG1pblNmYiwgbWF4U2ZiOwotICAgIEZsYWcgICBkb25lOwotCi0gICAgLyogZG8gbm90IGdvIGJlbG93IHN0YXJ0U2ZiICovCi0gICAgZm9yIChjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKLQotICAgICAgaWYgKHBzeU91dENoYW5uZWxbY2hdLndpbmRvd1NlcXVlbmNlICE9IFNIT1JUX1dJTkRPVykKLSAgICAgICAgc3RhcnRTZmJbY2hdID0gYWhQYXJhbS0+c3RhcnRTZmJMOwotICAgICAgZWxzZQotICAgICAgICBzdGFydFNmYltjaF0gPSBhaFBhcmFtLT5zdGFydFNmYlM7Ci0gICAgfQotCi0gICAgYXZnRW4gPSAwOwotICAgIG1pbkVuID0gTUFYXzMyOwotICAgIGFoQ250ID0gMDsKLSAgICBmb3IgKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgewotICAgICAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFuID0gJnBzeU91dENoYW5uZWxbY2hdOwotICAgICAgZm9yIChzZmI9c3RhcnRTZmJbY2hdOyBzZmI8cHN5T3V0Q2hhbi0+c2ZiQ250OyBzZmIrKykgewotCi0gICAgICAgIGlmICgoYWhGbGFnW2NoXVtzZmJdICE9IE5PX0FIKSAmJgotICAgICAgICAgICAgKHBzeU91dENoYW4tPnNmYkVuZXJneVtzZmJdID4gcHN5T3V0Q2hhbi0+c2ZiVGhyZXNob2xkW3NmYl0pKSB7Ci0gICAgICAgICAgbWluRW4gPSBtaW4obWluRW4sIHBzeU91dENoYW4tPnNmYkVuZXJneVtzZmJdKTsKLSAgICAgICAgICBhdmdFbiA9IExfYWRkKGF2Z0VuLCBwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiXSk7Ci0gICAgICAgICAgYWhDbnQrKzsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGlmKGFoQ250KSB7Ci0gICAgICBXb3JkMzIgaWFoQ250OwotICAgICAgc2hpZnQgPSBub3JtX2woYWhDbnQpOwotCSAgaWFoQ250ID0gRGl2XzMyKCAxIDw8IHNoaWZ0LCBhaENudCA8PCBzaGlmdCApOwotICAgICAgYXZnRW4gPSBmaXhtdWwoYXZnRW4sIGlhaENudCk7Ci0gICAgfQotCi0gICAgZW5EaWZmID0gaUxvZzQoYXZnRW4pIC0gaUxvZzQobWluRW4pOwotICAgIC8qIGNhbGMgc29tZSBlbmVyZ3kgYm9yZGVycyBiZXR3ZWVuIG1pbkVuIGFuZCBhdmdFbiAqLwotICAgIGZvciAoZW5JZHg9MDsgZW5JZHg8NDsgZW5JZHgrKykgewotICAgICAgV29yZDMyIGVuRmFjOwotICAgICAgZW5GYWMgPSAoKDYtKGVuSWR4IDw8IDEpKSAqIGVuRGlmZik7Ci0gICAgICBlbltlbklkeF0gPSBmaXhtdWwoYXZnRW4sIHBvdzJfeHkoTF9uZWdhdGUoZW5GYWMpLDcqNCkpOwotICAgIH0KLQotICAgIC8qIHN0YXJ0IHdpdGggbG93ZXN0IGVuZXJneSBib3JkZXIgYXQgaGlnaGVzdCBzZmIgKi8KLSAgICBtYXhTZmIgPSBwc3lPdXRDaGFubmVsWzBdLnNmYkNudCAtIDE7Ci0gICAgbWluU2ZiID0gc3RhcnRTZmJbMF07Ci0KLSAgICBpZiAobkNoYW5uZWxzID09IDIpIHsKLSAgICAgIG1heFNmYiA9IG1heChtYXhTZmIsIChwc3lPdXRDaGFubmVsWzFdLnNmYkNudCAtIDEpKTsKLSAgICAgIG1pblNmYiA9IG1pbihtaW5TZmIsIHN0YXJ0U2ZiWzFdKTsKLSAgICB9Ci0KLSAgICBzZmIgPSBtYXhTZmI7Ci0gICAgZW5JZHggPSAwOwotICAgIGRvbmUgPSAwOwotICAgIHdoaWxlICghZG9uZSkgewotCi0gICAgICBmb3IgKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgewotICAgICAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4gPSAmcHN5T3V0Q2hhbm5lbFtjaF07Ci0KLSAgICAgICAgaWYgKHNmYj49c3RhcnRTZmJbY2hdICYmIHNmYjxwc3lPdXRDaGFuLT5zZmJDbnQpIHsKLSAgICAgICAgICAvKiBzZmIgZW5lcmd5IGJlbG93IGJvcmRlciA/ICovCi0KLSAgICAgICAgICBpZiAoYWhGbGFnW2NoXVtzZmJdICE9IE5PX0FIICYmIHBzeU91dENoYW4tPnNmYkVuZXJneVtzZmJdIDwgZW5bZW5JZHhdKXsKLSAgICAgICAgICAgIC8qIGFsbG93IGhvbGUgKi8KLSAgICAgICAgICAgIGFoRmxhZ1tjaF1bc2ZiXSA9IE5PX0FIOwotICAgICAgICAgICAgcHN5T3V0Q2hhbi0+c2ZiVGhyZXNob2xkW3NmYl0gPSBMX2FkZChwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiXSwgcHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYl0pOwotICAgICAgICAgICAgYWN0UGUgPSBhY3RQZSAtIHBlRGF0YS0+cGVDaGFubmVsRGF0YVtjaF0uc2ZiUGVbc2ZiXTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoYWN0UGUgPCBkZXNpcmVkUGUpIHsKLSAgICAgICAgICAgIGRvbmUgPSAxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBzZmIgPSBzZmIgLSAxOwotCi0gICAgICBpZiAoc2ZiIDwgbWluU2ZiKSB7Ci0gICAgICAgIC8qIHJlc3RhcnQgd2l0aCBuZXh0IGVuZXJneSBib3JkZXIgKi8KLSAgICAgICAgc2ZiID0gbWF4U2ZiOwotICAgICAgICBlbklkeCA9IGVuSWR4ICsgMTsKLQotICAgICAgICBpZiAoZW5JZHggLSA0ID49IDApCi0gICAgICAgICAgZG9uZSA9IDE7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOmFkYXB0VGhyZXNob2xkc1RvUGUKLSogZGVzY3JpcHRpb246IHR3byBndWVzc2VzIGZvciB0aGUgcmVkdWN0aW9uIHZhbHVlIGFuZCBvbmUgZmluYWwgY29ycmVjdGlvbiBvZiB0aGUKLSogICAgICAgICAgICAgIHRocmVzaG9sZHMKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBhZGFwdFRocmVzaG9sZHNUb1BlKFBTWV9PVVRfQ0hBTk5FTCAgICAgcHN5T3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQgICAgKnBzeU91dEVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICAgICAgbG9nU2ZiRW5lcmd5W01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEVfREFUQSAgICAgICAgICAgICpwZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgICAgbkNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgICAgIGRlc2lyZWRQZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUhfUEFSQU0gICAgICAgICAgICphaFBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSU5TTlJfQURBUFRfUEFSQU0gKm1zYVBhcmFtKQotewotICBXb3JkMTYgbm9SZWRQZSwgcmVkUGUsIHJlZFBlTm9BSDsKLSAgV29yZDE2IGNvbnN0UGFydCwgY29uc3RQYXJ0Tm9BSDsKLSAgV29yZDE2IG5BY3RpdmVMaW5lcywgbkFjdGl2ZUxpbmVzTm9BSDsKLSAgV29yZDE2IGRlc2lyZWRQZU5vQUg7Ci0gIFdvcmQzMiByZWRWYWwsIGF2Z1RockV4cDsKLSAgV29yZDMyIGl0ZXI7Ci0KLSAgY2FsY1RocmVzaEV4cChwZURhdGEtPnRockV4cCwgcHN5T3V0Q2hhbm5lbCwgbkNoYW5uZWxzKTsKLQotICBhZGFwdE1pblNucihwc3lPdXRDaGFubmVsLCBsb2dTZmJFbmVyZ3ksIG1zYVBhcmFtLCBuQ2hhbm5lbHMpOwotCi0gIGluaXRBdm9pZEhvbGVGbGFnKHBlRGF0YS0+YWhGbGFnLCBwc3lPdXRDaGFubmVsLCBwc3lPdXRFbGVtZW50LCBuQ2hhbm5lbHMsIGFoUGFyYW0pOwotCi0gIG5vUmVkUGUgPSBwZURhdGEtPnBlOwotICBjb25zdFBhcnQgPSBwZURhdGEtPmNvbnN0UGFydDsKLSAgbkFjdGl2ZUxpbmVzID0gcGVEYXRhLT5uQWN0aXZlTGluZXM7Ci0KLSAgLyogZmlyc3QgZ3Vlc3Mgb2YgcmVkdWN0aW9uIHZhbHVlIHReMC4yNSA9IDJeKChhLXBlbikvNCpiKSAqLwotICBhdmdUaHJFeHAgPSBwb3cyX3h5KChjb25zdFBhcnQgLSBub1JlZFBlKSwgKG5BY3RpdmVMaW5lcyA8PCAyKSk7Ci0KLSAgLyogcjEgPSAyXigoYS1wZXIpLzQqYikgLSB0XjAuMjUgKi8KLSAgcmVkVmFsID0gcG93Ml94eSgoY29uc3RQYXJ0IC0gZGVzaXJlZFBlKSwgKG5BY3RpdmVMaW5lcyA8PCAyKSkgLSBhdmdUaHJFeHA7Ci0KLSAgLyogcmVkdWNlIHRocmVzaG9sZHMgKi8KLSAgcmVkdWNlVGhyZXNob2xkcyhwc3lPdXRDaGFubmVsLCBwZURhdGEtPmFoRmxhZywgcGVEYXRhLT50aHJFeHAsIG5DaGFubmVscywgcmVkVmFsKTsKLQotICAvKiBwZSBhZnRlciBmaXJzdCBndWVzcyAqLwotICBjYWxjU2ZiUGUocGVEYXRhLCBwc3lPdXRDaGFubmVsLCBuQ2hhbm5lbHMpOwotICByZWRQZSA9IHBlRGF0YS0+cGU7Ci0KLSAgaXRlciA9IDA7Ci0gIGRvIHsKLSAgICAvKiBwZSBmb3IgYmFuZHMgd2hlcmUgYXZvaWQgaG9sZSBpcyBpbmFjdGl2ZSAqLwotICAgIGNhbGNQZU5vQUgoJnJlZFBlTm9BSCwgJmNvbnN0UGFydE5vQUgsICZuQWN0aXZlTGluZXNOb0FILAotICAgICAgICAgICAgICAgcGVEYXRhLCBwZURhdGEtPmFoRmxhZywgcHN5T3V0Q2hhbm5lbCwgbkNoYW5uZWxzKTsKLQotICAgIGRlc2lyZWRQZU5vQUggPSBkZXNpcmVkUGUgLShyZWRQZSAtIHJlZFBlTm9BSCk7Ci0KLSAgICBpZiAoZGVzaXJlZFBlTm9BSCA8IDApIHsKLSAgICAgIGRlc2lyZWRQZU5vQUggPSAwOwotICAgIH0KLQotICAgIC8qIHNlY29uZCBndWVzcyAqLwotCi0gICAgaWYgKG5BY3RpdmVMaW5lc05vQUggPiAwKSB7Ci0KLQkJYXZnVGhyRXhwID0gcG93Ml94eSgoY29uc3RQYXJ0Tm9BSCAtIHJlZFBlTm9BSCksIChuQWN0aXZlTGluZXNOb0FIIDw8IDIpKTsKLQotCQlyZWRWYWwgPSAocmVkVmFsICsgcG93Ml94eSgoY29uc3RQYXJ0Tm9BSCAtIGRlc2lyZWRQZU5vQUgpLCAobkFjdGl2ZUxpbmVzTm9BSCA8PCAyKSkpIC0gYXZnVGhyRXhwOwotCi0JCS8qIHJlZHVjZSB0aHJlc2hvbGRzICovCi0JCXJlZHVjZVRocmVzaG9sZHMocHN5T3V0Q2hhbm5lbCwgcGVEYXRhLT5haEZsYWcsIHBlRGF0YS0+dGhyRXhwLCBuQ2hhbm5lbHMsIHJlZFZhbCk7Ci0gICAgfQotCi0gICAgY2FsY1NmYlBlKHBlRGF0YSwgcHN5T3V0Q2hhbm5lbCwgbkNoYW5uZWxzKTsKLSAgICByZWRQZSA9IHBlRGF0YS0+cGU7Ci0KLSAgICBpdGVyID0gaXRlcisxOwotCi0gIH0gd2hpbGUgKCgyMCAqIGFic19zKHJlZFBlIC0gZGVzaXJlZFBlKSA+IGRlc2lyZWRQZSkgJiYgKGl0ZXIgPCAyKSk7Ci0KLQotICBpZiAoKDEwMCAqIHJlZFBlIDwgMTE1ICogZGVzaXJlZFBlKSkgewotICAgIGNvcnJlY3RUaHJlc2gocHN5T3V0Q2hhbm5lbCwgcGVEYXRhLT5haEZsYWcsIHBlRGF0YSwgcGVEYXRhLT50aHJFeHAsIHJlZFZhbCwKLSAgICAgICAgICAgICAgICAgIG5DaGFubmVscywgZGVzaXJlZFBlIC0gcmVkUGUpOwotICB9Ci0gIGVsc2UgewotICAgIFdvcmQxNiBkZXNpcmVkUGUxMDUgPSAoMTA1ICogZGVzaXJlZFBlKSAvIDEwMDsKLSAgICByZWR1Y2VNaW5TbnIocHN5T3V0Q2hhbm5lbCwgcGVEYXRhLCBwZURhdGEtPmFoRmxhZywKLSAgICAgICAgICAgICAgICAgbkNoYW5uZWxzLCBkZXNpcmVkUGUxMDUpOwotICAgIGFsbG93TW9yZUhvbGVzKHBzeU91dENoYW5uZWwsIHBzeU91dEVsZW1lbnQsIHBlRGF0YSwgcGVEYXRhLT5haEZsYWcsCi0gICAgICAgICAgICAgICAgICAgYWhQYXJhbSwgbkNoYW5uZWxzLCBkZXNpcmVkUGUxMDUpOwotICB9Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGNhbGNCaXRTYXZlCi0qIGRlc2NyaXB0aW9uOiAgQ2FsY3VsYXRlcyBwZXJjZW50YWdlIG9mIGJpdCBzYXZlLCBzZWUgZmlndXJlIGJlbG93Ci0qIHJldHVybnM6Ci0qIGlucHV0OiAgICAgICAgcGFyYW1ldGVycyBhbmQgYml0cmVzLWZ1bGxuZXNzCi0qIG91dHB1dDogICAgICAgcGVyY2VudGFnZSBvZiBiaXQgc2F2ZQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgV29yZDE2IGNhbGNCaXRTYXZlKFdvcmQxNiBmaWxsTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBjbGlwTG93LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgY2xpcEhpZ2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBtaW5CaXRTYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgbWF4Qml0U2F2ZSkKLXsKLSAgV29yZDE2IGJpdHNhdmUgPSAwOwotCi0gIGZpbGxMZXZlbCA9IG1heChmaWxsTGV2ZWwsIGNsaXBMb3cpOwotICBmaWxsTGV2ZWwgPSBtaW4oZmlsbExldmVsLCBjbGlwSGlnaCk7Ci0KLSAgaWYoY2xpcEhpZ2gtY2xpcExvdykKLSAgYml0c2F2ZSA9IChtYXhCaXRTYXZlIC0gKCgobWF4Qml0U2F2ZS1taW5CaXRTYXZlKSooZmlsbExldmVsLWNsaXBMb3cpKS8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGlwSGlnaC1jbGlwTG93KSkpOwotCi0gIHJldHVybiAoYml0c2F2ZSk7Ci19Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogY2FsY0JpdFNwZW5kCi0qIGRlc2NyaXB0aW9uOiAgQ2FsY3VsYXRlcyBwZXJjZW50YWdlIG9mIGJpdCBzcGVuZCwgc2VlIGZpZ3VyZSBiZWxvdwotKiByZXR1cm5zOgotKiBpbnB1dDogICAgICAgIHBhcmFtZXRlcnMgYW5kIGJpdHJlcy1mdWxsbmVzcwotKiBvdXRwdXQ6ICAgICAgIHBlcmNlbnRhZ2Ugb2YgYml0IHNwZW5kCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBXb3JkMTYgY2FsY0JpdFNwZW5kKFdvcmQxNiBmaWxsTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgY2xpcExvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBjbGlwSGlnaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBtaW5CaXRTcGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBtYXhCaXRTcGVuZCkKLXsKLSAgV29yZDE2IGJpdHNwZW5kID0gMTsKLQotICBmaWxsTGV2ZWwgPSBtYXgoZmlsbExldmVsLCBjbGlwTG93KTsKLSAgZmlsbExldmVsID0gbWluKGZpbGxMZXZlbCwgY2xpcEhpZ2gpOwotCi0gIGlmKGNsaXBIaWdoLWNsaXBMb3cpCi0gIGJpdHNwZW5kID0gKG1pbkJpdFNwZW5kICsgKChtYXhCaXRTcGVuZCAtIG1pbkJpdFNwZW5kKSooZmlsbExldmVsIC0gY2xpcExvdykgLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpcEhpZ2gtY2xpcExvdykpKTsKLQotICByZXR1cm4gKGJpdHNwZW5kKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogYWRqdXN0UGVNaW5NYXgoKQotKiBkZXNjcmlwdGlvbjogIGFkanVzdHMgcGVNaW4gYW5kIHBlTWF4IHBhcmFtZXRlcnMgb3ZlciB0aW1lCi0qIHJldHVybnM6Ci0qIGlucHV0OiAgICAgICAgY3VycmVudCBwZSwgcGVNaW4sIHBlTWF4Ci0qIG91dHB1dDogICAgICAgYWRqdXN0ZWQgcGVNaW4vcGVNYXgKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYWRqdXN0UGVNaW5NYXgoY29uc3QgV29yZDE2IGN1cnJQZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICpwZU1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICpwZU1heCkKLXsKLSAgV29yZDE2IG1pbkZhY0hpLCBtYXhGYWNIaSwgbWluRmFjTG8sIG1heEZhY0xvOwotICBXb3JkMTYgZGlmZjsKLSAgV29yZDE2IG1pbkRpZmYgPSBleHRyYWN0X2woY3VyclBlIC8gNik7Ci0gIG1pbkZhY0hpID0gMzA7Ci0gIG1heEZhY0hpID0gMTAwOwotICBtaW5GYWNMbyA9IDE0OwotICBtYXhGYWNMbyA9IDc7Ci0KLSAgZGlmZiA9IGN1cnJQZSAtICpwZU1heCA7Ci0KLSAgaWYgKGRpZmYgPiAwKSB7Ci0gICAgKnBlTWluID0gKnBlTWluICsgKChkaWZmICogbWluRmFjSGkpIC8gMTAwKTsKLSAgICAqcGVNYXggPSAqcGVNYXggKyAoKGRpZmYgKiBtYXhGYWNIaSkgLyAxMDApOwotICB9IGVsc2UgewotICAgIGRpZmYgPSAqcGVNaW4gLSBjdXJyUGU7Ci0KLSAgICBpZiAoZGlmZiA+IDApIHsKLSAgICAgICpwZU1pbiA9ICpwZU1pbiAtICgoZGlmZiAqIG1pbkZhY0xvKSAvIDEwMCk7Ci0gICAgICAqcGVNYXggPSAqcGVNYXggLSAoKGRpZmYgKiBtYXhGYWNMbykgLyAxMDApOwotICAgIH0gZWxzZSB7Ci0gICAgICAqcGVNaW4gPSAqcGVNaW4gKyAoKGN1cnJQZSAtICpwZU1pbikgKiBtaW5GYWNIaSAvIDEwMCk7Ci0gICAgICAqcGVNYXggPSAqcGVNYXggLSAoKCpwZU1heCAtIGN1cnJQZSkgKiBtYXhGYWNMbyAvIDEwMCk7Ci0gICAgfQotICB9Ci0KLQotICBpZiAoKCpwZU1heCAtICpwZU1pbikgPCBtaW5EaWZmKSB7Ci0gICAgV29yZDE2IHBhcnRMbywgcGFydEhpOwotCi0gICAgcGFydExvID0gbWF4KDAsIChjdXJyUGUgLSAqcGVNaW4pKTsKLSAgICBwYXJ0SGkgPSBtYXgoMCwgKCpwZU1heCAtIGN1cnJQZSkpOwotCi0gICAgKnBlTWF4ID0gY3VyclBlICsgKChwYXJ0SGkgKiBtaW5EaWZmKSAvIChwYXJ0TG8gKyBwYXJ0SGkpKTsKLSAgICAqcGVNaW4gPSBjdXJyUGUgLSAoKHBhcnRMbyAqIG1pbkRpZmYpIC8gKHBhcnRMbyArIHBhcnRIaSkpOwotICAgICpwZU1pbiA9IG1heCgwLCAqcGVNaW4pOwotICB9Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IEJpdHJlc0NhbGNCaXRGYWMKLSogZGVzY3JpcHRpb246ICBjYWxjdWxhdGVzIGZhY3RvciBvZiBzcGVuZGluZyBiaXRzIGZvciBvbmUgZnJhbWUKLSogICAgICAgICAgICAgICAgMS4wIDogdGFrZSBhbGwgZnJhbWUgZHlucGFydCBiaXRzCi0qICAgICAgICAgICAgICAgID4xLjAgOiB0YWtlIGFsbCBmcmFtZSBkeW5wYXJ0IGJpdHMgKyBiaXRyZXMKLSogICAgICAgICAgICAgICAgPDEuMCA6IHB1dCBiaXRzIGluIGJpdHJlc2Vydm9pcgotKiAgcmV0dXJuczogICAgICBCaXRGYWMqMTAwCi0qICBpbnB1dDogICAgICAgIGJpdHJlcy1mdWxsbmVzcywgcGUsIGJsb2NrVHlwZSwgcGFyYW1ldGVyLXNldHRpbmdzCi0qICBvdXRwdXQ6Ci0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBXb3JkMTYgYml0cmVzQ2FsY0JpdEZhYyggY29uc3QgV29yZDE2ICAgYml0cmVzQml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgbWF4Qml0cmVzQml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgcGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgIHdpbmRvd1NlcXVlbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICBhdmdCaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICBtYXhCaXRGYWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFESl9USFJfU1RBVEUgKkFkalRociwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRTX0VMRU1FTlQgICAqYWRqVGhyQ2hhbikKLXsKLSAgQlJFU19QQVJBTSAqYnJlc1BhcmFtOwotICBXb3JkMTYgcGV4OwotICBXb3JkMTYgZmlsbExldmVsOwotICBXb3JkMTYgYml0U2F2ZSwgYml0U3BlbmQsIGJpdHJlc0ZhYzsKLQotICBmaWxsTGV2ZWwgPSBleHRyYWN0X2woKDEwMCogYml0cmVzQml0cykgLyBtYXhCaXRyZXNCaXRzKTsKLQotICBpZiAod2luZG93U2VxdWVuY2UgIT0gU0hPUlRfV0lORE9XKQotICAgIGJyZXNQYXJhbSA9ICYoQWRqVGhyLT5icmVzUGFyYW1Mb25nKTsKLSAgZWxzZQotICAgIGJyZXNQYXJhbSA9ICYoQWRqVGhyLT5icmVzUGFyYW1TaG9ydCk7Ci0KLSAgcGV4ID0gbWF4KHBlLCBhZGpUaHJDaGFuLT5wZU1pbik7Ci0gIHBleCA9IG1pbihwZXgsYWRqVGhyQ2hhbi0+cGVNYXgpOwotCi0gIGJpdFNhdmUgPSBjYWxjQml0U2F2ZShmaWxsTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVzUGFyYW0tPmNsaXBTYXZlTG93LCBicmVzUGFyYW0tPmNsaXBTYXZlSGlnaCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZXNQYXJhbS0+bWluQml0U2F2ZSwgYnJlc1BhcmFtLT5tYXhCaXRTYXZlKTsKLQotICBiaXRTcGVuZCA9IGNhbGNCaXRTcGVuZChmaWxsTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZXNQYXJhbS0+Y2xpcFNwZW5kTG93LCBicmVzUGFyYW0tPmNsaXBTcGVuZEhpZ2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZXNQYXJhbS0+bWluQml0U3BlbmQsIGJyZXNQYXJhbS0+bWF4Qml0U3BlbmQpOwotCi0gIGlmKGFkalRockNoYW4tPnBlTWF4ICE9IGFkalRockNoYW4tPnBlTWluKQotCWJpdHJlc0ZhYyA9ICgxMDAgLSBiaXRTYXZlKSArIGV4dHJhY3RfbCgoKGJpdFNwZW5kICsgYml0U2F2ZSkgKiAocGV4IC0gYWRqVGhyQ2hhbi0+cGVNaW4pKSAvCi0gICAgICAgICAgICAgICAgICAgIChhZGpUaHJDaGFuLT5wZU1heCAtIGFkalRockNoYW4tPnBlTWluKSk7Ci0gIGVsc2UKLQliaXRyZXNGYWMgPSAweDdmZmY7Ci0KLSAgYml0cmVzRmFjID0gbWluKGJpdHJlc0ZhYywKLSAgICAgICAgICAgICAgICAgICAgKDEwMC0zMCArIGV4dHJhY3RfbCgoMTAwICogYml0cmVzQml0cykgLyBhdmdCaXRzKSkpOwotCi0gIGJpdHJlc0ZhYyA9IG1pbihiaXRyZXNGYWMsIG1heEJpdEZhYyk7Ci0KLSAgYWRqdXN0UGVNaW5NYXgocGUsICZhZGpUaHJDaGFuLT5wZU1pbiwgJmFkalRockNoYW4tPnBlTWF4KTsKLQotICByZXR1cm4gYml0cmVzRmFjOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogQWRqVGhySW5pdAotKiBkZXNjcmlwdGlvbjogIGluaXQgdGhyZXNob2xkcyBwYXJhbWV0ZXIKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBBZGpUaHJJbml0KEFESl9USFJfU1RBVEUgKmhBZGpUaHIsCi0gICAgICAgICAgICAgICAgY29uc3QgV29yZDMyICAgbWVhblBlLAotICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAgIGNoQml0cmF0ZSkKLXsKLSAgQVRTX0VMRU1FTlQqIGF0c0VsZW0gPSAmaEFkalRoci0+YWRqVGhyU3RhdGVFbGVtOwotICBNSU5TTlJfQURBUFRfUEFSQU0gKm1zYVBhcmFtID0gJmF0c0VsZW0tPm1pblNuckFkYXB0UGFyYW07Ci0KLSAgLyogY29tbW9uIGZvciBhbGwgZWxlbWVudHM6ICovCi0gIC8qIHBhcmFtZXRlcnMgZm9yIGJpdHJlcyBjb250cm9sICovCi0gIGhBZGpUaHItPmJyZXNQYXJhbUxvbmcuY2xpcFNhdmVMb3cgICA9ICAyMDsKLSAgaEFkalRoci0+YnJlc1BhcmFtTG9uZy5jbGlwU2F2ZUhpZ2ggID0gIDk1OwotICBoQWRqVGhyLT5icmVzUGFyYW1Mb25nLm1pbkJpdFNhdmUgICAgPSAgLTU7Ci0gIGhBZGpUaHItPmJyZXNQYXJhbUxvbmcubWF4Qml0U2F2ZSAgICA9ICAzMDsKLSAgaEFkalRoci0+YnJlc1BhcmFtTG9uZy5jbGlwU3BlbmRMb3cgID0gIDIwOwotICBoQWRqVGhyLT5icmVzUGFyYW1Mb25nLmNsaXBTcGVuZEhpZ2ggPSAgOTU7Ci0gIGhBZGpUaHItPmJyZXNQYXJhbUxvbmcubWluQml0U3BlbmQgICA9IC0xMDsKLSAgaEFkalRoci0+YnJlc1BhcmFtTG9uZy5tYXhCaXRTcGVuZCAgID0gIDQwOwotCi0gIGhBZGpUaHItPmJyZXNQYXJhbVNob3J0LmNsaXBTYXZlTG93ICAgPSAgMjA7Ci0gIGhBZGpUaHItPmJyZXNQYXJhbVNob3J0LmNsaXBTYXZlSGlnaCAgPSAgNzU7Ci0gIGhBZGpUaHItPmJyZXNQYXJhbVNob3J0Lm1pbkJpdFNhdmUgICAgPSAgIDA7Ci0gIGhBZGpUaHItPmJyZXNQYXJhbVNob3J0Lm1heEJpdFNhdmUgICAgPSAgMjA7Ci0gIGhBZGpUaHItPmJyZXNQYXJhbVNob3J0LmNsaXBTcGVuZExvdyAgPSAgMjA7Ci0gIGhBZGpUaHItPmJyZXNQYXJhbVNob3J0LmNsaXBTcGVuZEhpZ2ggPSAgNzU7Ci0gIGhBZGpUaHItPmJyZXNQYXJhbVNob3J0Lm1pbkJpdFNwZW5kICAgPSAtNTsKLSAgaEFkalRoci0+YnJlc1BhcmFtU2hvcnQubWF4Qml0U3BlbmQgICA9ICA1MDsKLQotICAvKiBzcGVjaWZpYyBmb3IgZWFjaCBlbGVtZW50OiAqLwotCi0gIC8qIHBhcmFtZXRlcnMgZm9yIGJpdHJlcyBjb250cm9sICovCi0gIGF0c0VsZW0tPnBlTWluID0gZXh0cmFjdF9sKCgoODAqbWVhblBlKSAvIDEwMCkpOwotICBhdHNFbGVtLT5wZU1heCA9IGV4dHJhY3RfbCgoKDEyMCptZWFuUGUpIC8gMTAwKSk7Ci0KLSAgLyogYWRkaXRpb25hbCBwZSBvZmZzZXQgdG8gY29ycmVjdCBwZTJiaXRzIGZvciBsb3cgYml0cmF0ZXMgKi8KLSAgYXRzRWxlbS0+cGVPZmZzZXQgPSAwOwotICBpZiAoY2hCaXRyYXRlIDwgMzIwMDApIHsKLSAgICBhdHNFbGVtLT5wZU9mZnNldCA9IG1heCg1MCwgKDEwMCAtIGV4dHJhY3RfbCgoMTAwICogY2hCaXRyYXRlKSAvIDMyMDAwKSkpOwotICB9Ci0KLSAgLyogYXZvaWQgaG9sZSBwYXJhbWV0ZXJzICovCi0gIGlmIChjaEJpdHJhdGUgPiAyMDAwMCkgewotICAgIGF0c0VsZW0tPmFoUGFyYW0ubW9kaWZ5TWluU25yID0gVFJVRTsKLSAgICBhdHNFbGVtLT5haFBhcmFtLnN0YXJ0U2ZiTCA9IDE1OwotICAgIGF0c0VsZW0tPmFoUGFyYW0uc3RhcnRTZmJTID0gMzsKLSAgfQotICBlbHNlIHsKLSAgICBhdHNFbGVtLT5haFBhcmFtLm1vZGlmeU1pblNuciA9IEZBTFNFOwotICAgIGF0c0VsZW0tPmFoUGFyYW0uc3RhcnRTZmJMID0gMDsKLSAgICBhdHNFbGVtLT5haFBhcmFtLnN0YXJ0U2ZiUyA9IDA7Ci0gIH0KLQotICAvKiBtaW5TbnIgYWRhcHRhdGlvbiAqLwotICAvKiBtYXhpbXVtIHJlZHVjdGlvbiBvZiBtaW5TbnIgZ29lcyBkb3duIHRvIG1pblNucl5tYXhSZWQgKi8KLSAgbXNhUGFyYW0tPm1heFJlZCA9IDB4MjAwMDAwMDA7ICAgICAvKiAqMC4yNWYgKi8KLSAgLyogc3RhcnQgYWRhcHRhdGlvbiBvZiBtaW5TbnIgZm9yIGF2Z0VuL3NmYkVuID4gc3RhcnRSYXRpbyAqLwotICBtc2FQYXJhbS0+c3RhcnRSYXRpbyA9IDB4MGNjY2NjY2Q7IC8qIDEwICovCi0gIC8qIG1heGltdW0gbWluU25yIHJlZHVjdGlvbiB0byBtaW5TbnJebWF4UmVkIGlzIHJlYWNoZWQgZm9yCi0gICAgIGF2Z0VuL3NmYkVuID49IG1heFJhdGlvICovCi0gIG1zYVBhcmFtLT5tYXhSYXRpbyA9ICAweDAwMjBjNDljOyAvKiAxMDAwICovCi0gIC8qIGhlbHBlciB2YXJpYWJsZXMgdG8gaW50ZXJwb2xhdGUgbWluU25yIHJlZHVjdGlvbiBmb3IKLSAgICAgYXZnRW4vc2ZiRW4gYmV0d2VlbiBzdGFydFJhdGlvIGFuZCBtYXhSYXRpbyAqLwotCi0gIG1zYVBhcmFtLT5yZWRSYXRpb0ZhYyA9IDB4ZmIzMzMzMzM7IC8qIC0wLjc1LzIwICovCi0KLSAgbXNhUGFyYW0tPnJlZE9mZnMgPSAweDMwMDAwMDAwOyAgLyogbXNhUGFyYW0tPnJlZFJhdGlvRmFjICogMTAqbG9nMTAobXNhUGFyYW0tPnN0YXJ0UmF0aW8pICovCi0KLQotICAvKiBwZSBjb3JyZWN0aW9uICovCi0gIGF0c0VsZW0tPnBlTGFzdCA9IDA7Ci0gIGF0c0VsZW0tPmR5bkJpdHNMYXN0ID0gMDsKLSAgYXRzRWxlbS0+cGVDb3JyZWN0aW9uRmFjdG9yID0gMTAwOyAvKiAxLjAgKi8KLQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogY2FsY1BlQ29ycmVjdGlvbgotKiBkZXNjcmlwdGlvbjogIGNhbGN1bGF0ZXMgdGhlIGRlc2lyZWQgcGVyY2VwdHVhbCBlbnRyb3B5IGZhY3RvcgotKgkJCQlJdCBpcyBiZXR3ZWVuIDAuODUgYW5kIDEuMTUKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgY2FsY1BlQ29ycmVjdGlvbihXb3JkMTYgKmNvcnJlY3Rpb25GYWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBwZUFjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IHBlTGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IGJpdHNMYXN0KQotewotICBXb3JkMzIgcGVBY3QxMDAgPSAxMDAgKiBwZUFjdDsKLSAgV29yZDMyIHBlTGFzdDEwMCA9IDEwMCAqIHBlTGFzdDsKLSAgV29yZDE2IHBlQml0c0xhc3QgPSBiaXRzMnBlKGJpdHNMYXN0KTsKLQotICBpZiAoKGJpdHNMYXN0ID4gMCkgJiYKLSAgICAgIChwZUFjdDEwMCA8ICgxNTAgKiBwZUxhc3QpKSAmJiAgKHBlQWN0MTAwID4gKDcwICogcGVMYXN0KSkgJiYKLSAgICAgICgoMTIwICogcGVCaXRzTGFzdCkgPiBwZUxhc3QxMDAgKSAmJiAoKCA2NSAqIHBlQml0c0xhc3QpIDwgcGVMYXN0MTAwKSkKLSAgICB7Ci0gICAgICBXb3JkMTYgbmV3RmFjID0gKDEwMCAqIHBlTGFzdCkgLyBwZUJpdHNMYXN0OwotICAgICAgLyogZGVhZCB6b25lICovCi0KLSAgICAgIGlmIChuZXdGYWMgPCAxMDApIHsKLSAgICAgICAgbmV3RmFjID0gbWluKCgoMTEwICogbmV3RmFjKSAvIDEwMCksIDEwMCk7Ci0gICAgICAgIG5ld0ZhYyA9IG1heChuZXdGYWMsIDg1KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBuZXdGYWMgPSBtYXgoKCg5MCAqIG5ld0ZhYykgLyAxMDApLCAxMDApOwotICAgICAgICBuZXdGYWMgPSBtaW4obmV3RmFjLCAxMTUpOwotICAgICAgfQotCi0gICAgICBpZiAoKG5ld0ZhYyA+IDEwMCAmJiAqY29ycmVjdGlvbkZhYyA8IDEwMCkgfHwKLSAgICAgICAgICAobmV3RmFjIDwgMTAwICYmICpjb3JyZWN0aW9uRmFjID4gMTAwKSkgewotICAgICAgICAqY29ycmVjdGlvbkZhYyA9IDEwMDsKLSAgICAgIH0KLSAgICAgIC8qIGZhc3RlciBhZGFwdGF0aW9uIHRvd2FyZHMgMS4wLCBzbG93ZXIgaW4gdGhlIG90aGVyIGRpcmVjdGlvbiAqLwotCi0gICAgICBpZiAoKCpjb3JyZWN0aW9uRmFjIDwgMTAwICYmIG5ld0ZhYyA8ICpjb3JyZWN0aW9uRmFjKSB8fAotICAgICAgICAgICgqY29ycmVjdGlvbkZhYyA+IDEwMCAmJiBuZXdGYWMgPiAqY29ycmVjdGlvbkZhYykpCi0gICAgICAgICpjb3JyZWN0aW9uRmFjID0gKDg1ICogKmNvcnJlY3Rpb25GYWMgKyAxNSAqIG5ld0ZhYykgLyAxMDA7Ci0gICAgICBlbHNlCi0gICAgICAgICpjb3JyZWN0aW9uRmFjID0gKDcwICogKmNvcnJlY3Rpb25GYWMgKyAzMCAqIG5ld0ZhYykgLyAxMDA7Ci0gICAgICAqY29ycmVjdGlvbkZhYyA9IG1pbigqY29ycmVjdGlvbkZhYywgMTE1KTsKLSAgICAgICpjb3JyZWN0aW9uRmFjID0gbWF4KCpjb3JyZWN0aW9uRmFjLCA4NSk7Ci0gICAgfQotICBlbHNlIHsKLSAgICAqY29ycmVjdGlvbkZhYyA9IDEwMDsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogQWRqdXN0VGhyZXNob2xkcwotKiBkZXNjcmlwdGlvbjogIEFkanVzdCB0aHJlc2hvbGRzIHRvIHRoZSBkZXNpcmVkIGJpdHJhdGUKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEFkanVzdFRocmVzaG9sZHMoQURKX1RIUl9TVEFURSAgICphZGpUaHJTdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICBBVFNfRUxFTUVOVCAgICAgKkFkalRoclN0YXRlRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQgKnBzeU91dEVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgICpjaEJpdERpc3RyaWJ1dGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgIGxvZ1NmYkVuZXJneVtNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCi0gICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgICBzZmJOUmVsZXZhbnRMaW5lc1tNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCi0gICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0VMRU1FTlQgICpxY09FLAotCQkJCQkgIEVMRU1FTlRfQklUUwkgICplbEJpdHMsCi0JCQkJCSAgY29uc3QgV29yZDE2ICAgICBuQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICBtYXhCaXRGYWMpCi17Ci0gIFBFX0RBVEEgcGVEYXRhOwotICBXb3JkMTYgbm9SZWRQZSwgZ3JhbnRlZFBlLCBncmFudGVkUGVDb3JyOwotICBXb3JkMTYgY3VyV2luZG93U2VxdWVuY2U7Ci0gIFdvcmQxNiBiaXRGYWN0b3I7Ci0gIFdvcmQxNiBhdmdCaXRzID0gKGVsQml0cy0+YXZlcmFnZUJpdHMgLSAocWNPRS0+c3RhdGljQml0c1VzZWQgKyBxY09FLT5hbmNCaXRzVXNlZCkpOwotICBXb3JkMTYgYml0cmVzQml0cyA9IGVsQml0cy0+Yml0UmVzTGV2ZWw7Ci0gIFdvcmQxNiBtYXhCaXRyZXNCaXRzID0gZWxCaXRzLT5tYXhCaXRzOwotICBXb3JkMTYgc2lkZUluZm9CaXRzID0gKHFjT0UtPnN0YXRpY0JpdHNVc2VkICsgcWNPRS0+YW5jQml0c1VzZWQpOwotICBXb3JkMTYgY2g7Ci0gIG1lbXNldCgmcGVEYXRhLCAwLCBzaXplb2YocGVEYXRhKSk7Ci0KLSAgcHJlcGFyZVNmYlBlKCZwZURhdGEsIHBzeU91dENoYW5uZWwsIGxvZ1NmYkVuZXJneSwgc2ZiTlJlbGV2YW50TGluZXMsIG5DaGFubmVscywgQWRqVGhyU3RhdGVFbGVtZW50LT5wZU9mZnNldCk7Ci0KLSAgLyogcGUgd2l0aG91dCByZWR1Y3Rpb24gKi8KLSAgY2FsY1NmYlBlKCZwZURhdGEsIHBzeU91dENoYW5uZWwsIG5DaGFubmVscyk7Ci0gIG5vUmVkUGUgPSBwZURhdGEucGU7Ci0KLQotICBjdXJXaW5kb3dTZXF1ZW5jZSA9IExPTkdfV0lORE9XOwotCi0gIGlmIChuQ2hhbm5lbHMgPT0gMikgewotCi0gICAgaWYgKChwc3lPdXRDaGFubmVsWzBdLndpbmRvd1NlcXVlbmNlID09IFNIT1JUX1dJTkRPVykgfHwKLSAgICAgICAgKHBzeU91dENoYW5uZWxbMV0ud2luZG93U2VxdWVuY2UgPT0gU0hPUlRfV0lORE9XKSkgewotICAgICAgY3VyV2luZG93U2VxdWVuY2UgPSBTSE9SVF9XSU5ET1c7Ci0gICAgfQotICB9Ci0gIGVsc2UgewotICAgIGN1cldpbmRvd1NlcXVlbmNlID0gcHN5T3V0Q2hhbm5lbFswXS53aW5kb3dTZXF1ZW5jZTsKLSAgfQotCi0KLSAgLyogYml0IGZhY3RvciAqLwotICBiaXRGYWN0b3IgPSBiaXRyZXNDYWxjQml0RmFjKGJpdHJlc0JpdHMsIG1heEJpdHJlc0JpdHMsIG5vUmVkUGUrNSpzaWRlSW5mb0JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyV2luZG93U2VxdWVuY2UsIGF2Z0JpdHMsIG1heEJpdEZhYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGpUaHJTdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGpUaHJTdGF0ZUVsZW1lbnQpOwotCi0gIC8qIGRlc2lyZWQgcGUgKi8KLSAgZ3JhbnRlZFBlID0gKChiaXRGYWN0b3IgKiBiaXRzMnBlKGF2Z0JpdHMpKSAvIDEwMCk7Ci0KLSAgLyogY29ycmVjdGlvbiBvZiBwZSB2YWx1ZSAqLwotICBjYWxjUGVDb3JyZWN0aW9uKCYoQWRqVGhyU3RhdGVFbGVtZW50LT5wZUNvcnJlY3Rpb25GYWN0b3IpLAotICAgICAgICAgICAgICAgICAgIG1pbihncmFudGVkUGUsIG5vUmVkUGUpLAotICAgICAgICAgICAgICAgICAgIEFkalRoclN0YXRlRWxlbWVudC0+cGVMYXN0LAotICAgICAgICAgICAgICAgICAgIEFkalRoclN0YXRlRWxlbWVudC0+ZHluQml0c0xhc3QpOwotICBncmFudGVkUGVDb3JyID0gKGdyYW50ZWRQZSAqIEFkalRoclN0YXRlRWxlbWVudC0+cGVDb3JyZWN0aW9uRmFjdG9yKSAvIDEwMDsKLQotCi0gIGlmIChncmFudGVkUGVDb3JyIDwgbm9SZWRQZSAmJiBub1JlZFBlID4gcGVEYXRhLm9mZnNldCkgewotICAgIC8qIGNhbGMgdGhyZXNob2xkIG5lY2Vzc2FyeSBmb3IgZGVzaXJlZCBwZSAqLwotICAgIGFkYXB0VGhyZXNob2xkc1RvUGUocHN5T3V0Q2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dEVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2dTZmJFbmVyZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAmcGVEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgbkNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbnRlZFBlQ29yciwKLSAgICAgICAgICAgICAgICAgICAgICAgICZBZGpUaHJTdGF0ZUVsZW1lbnQtPmFoUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAmQWRqVGhyU3RhdGVFbGVtZW50LT5taW5TbnJBZGFwdFBhcmFtKTsKLSAgfQotCi0gIC8qIGNhbGN1bGF0ZSByZWxhdGl2ZSBkaXN0cmlidXRpb24gKi8KLSAgZm9yIChjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKLSAgICBXb3JkMTYgcGVPZmZzRGlmZiA9IHBlRGF0YS5wZSAtIHBlRGF0YS5vZmZzZXQ7Ci0gICAgY2hCaXREaXN0cmlidXRpb25bY2hdID0gMjAwOwotCi0gICAgaWYgKHBlT2Zmc0RpZmYgPiAwKSB7Ci0gICAgICBXb3JkMzIgdGVtcCA9IDEwMDAgLSAobkNoYW5uZWxzICogMjAwKTsKLSAgICAgIGNoQml0RGlzdHJpYnV0aW9uW2NoXSA9IGNoQml0RGlzdHJpYnV0aW9uW2NoXSArCi0JCSAgKHRlbXAgKiBwZURhdGEucGVDaGFubmVsRGF0YVtjaF0ucGUpIC8gcGVPZmZzRGlmZjsKLSAgICB9Ci0gIH0KLQotICAvKiBzdG9yZSBwZSAqLwotICBxY09FLT5wZSA9IG5vUmVkUGU7Ci0KLSAgLyogdXBkYXRlIGxhc3QgcGUgKi8KLSAgQWRqVGhyU3RhdGVFbGVtZW50LT5wZUxhc3QgPSBncmFudGVkUGU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBBZGpUaHJVcGRhdGUKLSogZGVzY3JpcHRpb246ICBzYXZlIGR5bkJpdHNVc2VkIGZvciBjb3JyZWN0aW9uIG9mIGJpdHMycGUgcmVsYXRpb24KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEFkalRoclVwZGF0ZShBVFNfRUxFTUVOVCAqQWRqVGhyU3RhdGVFbGVtZW50LAotICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IGR5bkJpdHNVc2VkKQotewotICBBZGpUaHJTdGF0ZUVsZW1lbnQtPmR5bkJpdHNMYXN0ID0gZHluQml0c1VzZWQ7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY1RS9BdXRvQ29ycmVsYXRpb25fdjUucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNUUvQXV0b0NvcnJlbGF0aW9uX3Y1LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MDUxOTcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY1RS9BdXRvQ29ycmVsYXRpb25fdjUucworKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi1ALyoKLUAgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLUAgKioKLUAgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci1AICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLUAgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci1AICoqCi1AICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLUAgKioKLUAgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotQCAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotQCAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLUAgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotQCAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLUAgKi8KLQotQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAotQAlGaWxlOgkJQXV0b0NvcnJlbGF0aW9uX3Y1LnMKLUAKLUAJQ29udGVudDoJQXV0b0NvcnJlbGF0aW9uIGZ1bmN0aW9uIGFybXY1IGFzc2VtYmxlCi1ACi1AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAotCi0KLQkuc2VjdGlvbiAudGV4dAotCS5nbG9iYWwJQXV0b0NvcnJlbGF0aW9uCi0KLUF1dG9Db3JyZWxhdGlvbjoKLQlzdG1kYiAgICAgc3AhLCB7cjQgLSByMTEsIGxyfQotCi0gIHN1YiAgICAgcjEzLCByMTMsICMyMAotCi0gIG1vdiAgICAgcjUsIHIwCi0gIG1vdiAgICAgcjcsIHIxCi0gIG1vdiAgICAgcjksIHIzCi0gIG1vdiAgICAgcjIsIHIyLCBsc2wgIzE2Ci0gIG1vdiAgICAgcjAsICMwCi0gIG1vdiAgICAgcjQsIHIyLCBhc3IgIzE2Ci0gIG1vdiAgICAgcjgsICMwCi0gIGNtcCAgICAgcjQsICMwCi0gIGJsZSAgICAgTDEzNgotCi0JY21wICAgICByNCwgIzgKLQltb3YJCSAgcjIsICMwCi0gIGJsdCAgICAgTDEzMwotCi0Jc3ViICAgICByMTIsIHI0LCAjOAotTDEzMjoKLSAgbGRyICAgICByNiwgW3I1LCByMl0KLQlhZGQJCSAgcjIsIHIyLCAjNAotCXNtdWxiYiAgcjMsIHI2LCByNgotCWxkciAgICAgcjEsIFtyNSwgcjJdCi0Jc211bHR0CXIxMCwgcjYsIHI2Ci0JbW92CQkgIHIzLCByMywgYXNyICM5Ci0Jc211bGJiCXI2LCByMSwgcjEKLQltb3YJCSAgcjEwLCByMTAsIGFzciAjOQotCXFhZGQJICByMCwgcjAsIHIzCi0Jc211bHR0CXIxMSwgcjEsIHIxCi0JYWRkICAgICByMiwgcjIsICM0Ci0JcWFkZAkgIHIwLCByMCwgcjEwCi0JbW92CQkgIHI2LCByNiwgYXNyICM5Ci0JbW92CQkgIHIxMSwgcjExLCBhc3IgIzkKLQlsZHIJCSAgcjEsIFtyNSwgcjJdCi0JcWFkZAkgIHIwLCByMCwgcjYKLQlzbXVsYmIJcjEwLCByMSwgcjEKLQlzbXVsdHQJcjYsIHIxLCByMQotCXFhZGQJICByMCwgcjAsIHIxMQotCW1vdgkJICByMTAsIHIxMCwgYXNyICM5Ci0JbW92CQkgIHI2LCByNiwgYXNyICM5Ci0JcWFkZAkgIHIwLCByMCwgcjEwCi0JYWRkICAgICByMiwgcjIsICM0Ci0JYWRkICAgICByOCwgcjgsICM2Ci0KLQlxYWRkCSAgcjAsIHIwLCByNgotCWNtcCAgICAgcjgsIHIxMgotICBibHQgICAgIEwxMzIKLUwxMzM6Ci0gIGxkcnNoICAgcjYsIFtyNSwgcjJdCi0gIG11bCAgICAgcjEwLCByNiwgcjYKLQlhZGQgICAgIHIyLCByMiwgIzIKLSAgbW92ICAgICByMSwgcjEwLCBhc3IgIzkKLSAgcWFkZCAgICByMCwgcjAsIHIxCi1MMTM0OgotICBhZGQgICAgIHI4LCByOCwgIzEKLSAgY21wICAgICByOCwgcjQKLSAgYmx0ICAgICBMMTMzCi1MMTM1OgotTDEzNjoKLSAgc3RyICAgICByMCwgW3I3LCAjMF0KLSAgY21wICAgICByMCwgIzAKLSAgYmVxICAgICBMMTMyMAotTDEzNzoKLSAgbW92ICAgICByMiwgcjksIGxzbCAjMTYKLQltb3YgICAgIHI4LCAjMQotICBtb3YgICAgIHIyLCByMiwgYXNyICMxNgotICBjbXAgICAgIHIyLCAjMQotICBibGUgICAgIEwxMzE5Ci1MMTM4OgotTDEzOToKLSAgc3ViICAgICByNCwgcjQsICMxCi0gIG1vdiAgICAgcjE0LCAjMAotICBtb3YgICAgIHIzLCAjMAotICBjbXAgICAgIHI0LCAjMAotICBibGUgICAgIEwxMzE3Ci1MMTMxMDoKLSAgY21wICAgICByNCwgIzYKLSAgYWRkbHQgICByNiwgcjUsIHI4LCBsc2wgIzEKLSAgYmx0ICAgICBMMTMxNAotTDEzMTE6Ci0gIGFkZCAgICAgcjYsIHI1LCByOCwgbHNsICMxCi0gIHN1YiAgICAgcjEyLCByNCwgIzYKLSAgc3RyICAgICByOCwgW3IxMywgIzhdCi0gIHN0ciAgICAgcjcsIFtyMTMsICM0XQotTDEzMTI6Ci0gIG1vdiAgICAgcjEsIHIzLCBsc2wgIzEKLSAgbGRyc2ggICByNywgW3I2LCByMV0KLSAgbGRyc2ggICByMTAsIFtyNSwgcjFdCi0gIGFkZCAgICAgcjgsIHIxLCByNgotCWFkZCAgICAgcjksIHI1LCByMQotCW11bCAgICAgcjcsIHIxMCwgcjcKLSAgbGRyc2ggICByMSwgW3I4LCAjMl0KLQlsZHJzaCAgIHIxMCwgW3I4LCAjNF0KLSAgYWRkICAgICByNywgcjE0LCByNywgYXNyICM5Ci0gIGxkcnNoICAgcjAsIFtyOSwgIzJdCi0gIGxkcnNoICAgcjExLCBbcjksICM0XQotICBtdWwgICAgIHIxLCByMCwgcjEKLSAgbGRyc2ggICByMTQsIFtyOCwgIzZdCi0gIG11bCAgICAgcjEwLCByMTEsIHIxMAotCWFkZCAgICAgcjcsIHI3LCByMSwgYXNyICM5Ci0gIGxkcnNoICAgcjgsIFtyOCwgIzhdCi0JYWRkICAgICByMywgcjMsICM1Ci0JbGRyc2ggICByMTEsIFtyOSwgIzZdCi0gIGxkcnNoICAgcjEsIFtyOSwgIzhdCi0gIG11bCAgICAgcjE0LCByMTEsIHIxNAotICBhZGQgICAgIHI3LCByNywgcjEwLCBhc3IgIzkKLSAgbXVsICAgICByMSwgcjEsIHI4Ci0gIGFkZCAgICAgcjE0LCByNywgcjE0LCBhc3IgIzkKLQljbXAgICAgIHIzLCByMTIKLSAgYWRkICAgICByMTQsIHIxNCwgcjEsIGFzciAjOQotICBibGUgICAgIEwxMzEyCi1MMTMxMzoKLSAgbGRyICAgICByOCwgW3IxMywgIzhdCi0gIGxkciAgICAgcjcsIFtyMTMsICM0XQotTDEzMTQ6Ci1MMTMxNToKLSAgbW92ICAgICByMTIsIHIzLCBsc2wgIzEKLSAgbGRyc2ggICByOSwgW3I2LCByMTJdCi0gIGxkcnNoICAgcjEyLCBbcjUsIHIxMl0KLSAgYWRkICAgICByMywgcjMsICMxCi0gIGNtcCAgICAgcjMsIHI0Ci0gIG11bCAgICAgcjEyLCByMTIsIHI5Ci0gIGFkZCAgICAgcjE0LCByMTQsIHIxMiwgYXNyICM5Ci0gIGJsdCAgICAgTDEzMTUKLUwxMzE2OgotTDEzMTc6Ci0gIHN0ciAgICAgcjE0LCBbcjcsICtyOCwgbHNsICMyXQotICBhZGQgICAgIHI4LCByOCwgIzEKLSAgY21wICAgICByOCwgcjIKLSAgYmx0ICAgICBMMTM5Ci0KLUwxMzE5OgotTDEzMjA6Ci0JYWRkICAgICByMTMsIHIxMywgIzIwCi0JbGRtaWEgICBzcCEsIHtyNCAtIHIxMSwgcGN9Ci0KLQlARU5EUCAgQCB8QXV0b0NvcnJlbGF0aW9ufAotCS5lbmQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNUUvQ2FsY1dpbmRvd0VuZXJneV92NS5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY1RS9DYWxjV2luZG93RW5lcmd5X3Y1LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMGU4Y2IuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY1RS9DYWxjV2luZG93RW5lcmd5X3Y1LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotQC8qCi1AICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi1AICoqCi1AICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotQCAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi1AICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotQCAqKgotQCAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi1AICoqCi1AICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLUAgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLUAgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1AICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLUAgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi1AICovCi0KLUBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAKLUAJRmlsZToJCUNhbGNXaW5kb3dFbmVyZ3lfdjUucwotQAotQAlDb250ZW50OglDYWxjV2luZG93RW5lcmd5IGZ1bmN0aW9uIGFybXY1IGFzc2VtYmxlCi1ACi1AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAotCi0JLnNlY3Rpb24gLnRleHQKLQotCS5nbG9iYWwJQ2FsY1dpbmRvd0VuZXJneQotCi1DYWxjV2luZG93RW5lcmd5OgotCXN0bWRiICAgc3AhLCB7cjQgLSByMTEsIGxyfQotCXN1YiAgICAgcjEzLCByMTMsICMyMAotCi0gIG1vdiAgICAgcjMsIHIzLCBsc2wgIzE2Ci0JbGRyICAgICByMTAsIFtyMCwgIzE2OF0gICAgICAgICAgICAgICAgICAgIEAgc3RhdGVzMCA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+aWlyU3RhdGVzWzBdOwotICBtb3YgICAgIHIzLCByMywgYXNyICMxNgotCWxkciAgICAgcjExLCBbcjAsICMxNzJdICAgICAgICAgICAgICAgICAgICBAIHN0YXRlczEgPSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmlpclN0YXRlc1sxXTsKLQotCW1vdiAgICAgcjIsIHIyLCBsc2wgIzE2Ci0JbGRyICAgICByMTIsIGhpUGFzc0NvZWZmICAgICAgICAgICAgICAgICAgIEAgQ29lZmYwID0gaGlQYXNzQ29lZmZbMF07Ci0gIG1vdiAgICAgcjIsIHIyLCBhc3IgIzE2Ci0JbGRyICAgICByMTQsIGhpUGFzc0NvZWZmICsgNAkJCSAgICAgICAgIEAgQ29lZmYxID0gaGlQYXNzQ29lZmZbMV07Ci0KLQltb3YJCQlyOCwgIzAJCQkJCQkJICAgICAgICAgICAgICAgQCB3PTAKLQltb3YJCQlyNSwgIzAJCQkJCQkJICAgICAgICAgICAgICAgQCB3T2Zmc2V0ID0gMDsKLQotQkxPQ0tfQkVHSU46Ci0JbW92CQkJcjYsICMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGFjY3VVRSA9IDA7Ci0JbW92CQkJcjcsICMwCQkJCQkJCQkgICAgICAgICAgICAgQCBhY2N1RkUgPSAwOwotCW1vdgkJCXI0LCAjMAkJCQkJCQkgICAgICAgICAgICAgICBAIGk9MAotCi0Jc3RyCQkJcjgsIFtyMTMsICM0XQotCXN0cgkJCXIwLCBbcjEzLCAjOF0KLQlzdHIJCQlyMywgW3IxMywgIzEyXQotCi1FTkVSR1lfQkVHOgotCW1vdiAgICAgcjksIHI1LCBsc2wgIzEKLQlsZHJzaCAgIHI5LCBbcjEsIHI5XQkJCQkJCQkJCQkJQCB0ZW1wVW5maWx0ZXJlZCA9IHRpbWVTaWduYWxbdGlkeF07Ci0KLQlhZGQJCQlyNSwgcjUsIHIyCQkJCQkJCQkJCQkJQCB0aWR4ID0gdGlkeCArIGNoSW5jcmVtZW50OwotCi0Jc211bHdiCXIzLCByMTQsIHI5CQkJCQkJCQkJCQkJQCBhY2N1MSA9IExfbXB5X2xzKENvZWZmMSwgdGVtcFVuZmlsdGVyZWQpOwotCXNtdWxsCQlyMCwgcjgsIHIxMiwgcjExCQkJCQkJCQkJQCBhY2N1MiA9IGZpeG11bCggQ29lZmYwLCBzdGF0ZXMxICk7Ci0KLQltb3YJCQlyMywgcjMsIGxzbCAjMQotCW1vdgkJCXI4LCByOCwgbHNsICMxCi0KLQlzdWIJCQlyMCwgcjMsIHIxMAkJCQkJCQkJCQkJCUAgYWNjdTMgPSBhY2N1MSAtIHN0YXRlczA7Ci0Jc3ViCQkJcjgsCXIwLCByOAkJCQkJCQkJCQkJCUAgb3V0ID0gYWNjdTMgLSBhY2N1MjsKLQotCW1vdgkJICByMTAsIHIzCQkJCQkJCQkJCQkJCQlAIHN0YXRlczAgPSBhY2N1MTsKLQltb3YJCSAgcjExLCByOAkJCQkJCQkJCQkJCQkJQCBzdGF0ZXMxID0gb3V0OwotCi0JbXVsCQkgIHIzLCByOSwgcjkKLQltb3YgICAgIHI4LCByOCwgYXNyICMxNgotCi0JYWRkCQkgIHI0LCByNCwgIzEKLQlhZGQgICAgIHI2LCByNiwgcjMsIGFzciAjNwotCi0JbXVsCQkgIHI5LCByOCwgcjgKLQlsZHIJCSAgcjMsIFtyMTMsICMxMl0KLQotCWFkZAkJICByNywgcjcsIHI5LCBhc3IgIzcKLQotCWNtcCAgICAgcjQsIHIzCi0gIGJsdCAgICAgRU5FUkdZX0JFRwotCi0JbGRyCQkgIHIwLCBbcjEzLCAjOF0KLQlsZHIJCSAgcjgsIFtyMTMsICM0XQotCi1FTkVSR1lfRU5EOgotCWFkZAkJICByNCwgcjAsIHI4LCBsc2wgIzIKLQotCXN0ciAgICAgcjYsIFtyNCwgIzcyXQotCWFkZAkJICByOCwgcjgsICMxCi0gIHN0ciAgICAgcjcsIFtyNCwgIzEzNl0KLQotCWNtcAkJICByOCwgIzgKLQlibHQJCSAgQkxPQ0tfQkVHSU4KLQotQkxPQ0tfRU5EOgotCXN0ciAgICAgcjEwLCBbcjAsICMxNjhdCi0gIHN0ciAgICAgcjExLCBbcjAsICMxNzJdCi0gIG1vdiAgICAgcjAsICMxCi0KLSAgYWRkICAgICByMTMsIHIxMywgIzIwCi0JbGRtaWEgICBzcCEsIHtyNCAtIHIxMSwgcGN9Ci0KLWhpUGFzc0NvZWZmOgotCS53b3JkIDB4YmVjOGI0MzkKLQkud29yZAkweDYwOWQ0OTUyCi0KLQlARU5EUAotCS5lbmQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNUUvUHJlUG9zdE1EQ1RfdjUucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNUUvUHJlUG9zdE1EQ1RfdjUucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEyMWQ1Zi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjVFL1ByZVBvc3RNRENUX3Y1LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotQC8qCi1AICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi1AICoqCi1AICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotQCAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi1AICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotQCAqKgotQCAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi1AICoqCi1AICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLUAgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLUAgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1AICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLUAgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi1AICovCi0KLUBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAKLUAJRmlsZToJCVByZVBvc3RNRENUX3Y1LnMKLUAKLUAJQ29udGVudDoJcHJlbWRjdCBhbmQgcG9zdG1kY3QgZnVuY3Rpb24gYXJtdjUgYXNzZW1ibGUKLUAKLUBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBACi0KLQkuc2VjdGlvbiAudGV4dAotCS5nbG9iYWwJUHJlTURDVAotCi1QcmVNRENUOgotCXN0bWRiICAgICAgIHNwISwge3I0IC0gcjExLCBscn0KLQotCWFkZCAgICAgICAgIHI5LCByMCwgcjEsIGxzbCAjMgotCXN1YiAgICAgICAgIHIzLCByOSwgIzgKLQotCW1vdnMgICAgICAgIHIxLCByMSwgYXNyICMyCi0JYmVxICAgICAgICAgUHJlTURDVF9FTkQKLQotUHJlTURDVF9MT09QOgotCWxkcgkJCQkJcjgsIFtyMl0sICM0Ci0JbGRyCQkJCQlyOSwgW3IyXSwgIzQKLQotCWxkcmQJCQkJcjQsIFtyMF0KLQlsZHJkCQkJCXI2LCBbcjNdCi0KLQlzbXVsbAkJCQlyMTQsIHIxMSwgcjQsIHI4CQkJCQlAIE1VTEhJR0godHIxLCBjb3NhKQotCXNtdWxsICAgIAkJCXIxMCwgcjEyLCByNywgcjgJCQkJCUAgTVVMSElHSCh0aTEsIGNvc2EpCi0KLQlzbXVsbAkJCQlyMTQsIHI4LCByNywgcjkJCQkJCQlAIE1VTEhJR0godGkxLCBzaW5hKQotCXNtdWxsCQkJCXI3LCByMTAsIHI0LCByOQkJCQkJCUAgTVVMSElHSCh0cjEsIHNpbmEpCi0KLQlhZGQJCQkJCXIxMSwgcjExLCByOAkJCQkJCUAgTVVMSElHSChjb3NhLCB0cjEpICsgTVVMSElHSChzaW5hLCB0aTEpQAotCXN1YgkJCQkJcjcsIHIxMiwgcjEwCQkJCQkJQCBNVUxISUdIKHRpMSwgY29zYSkgLSBNVUxISUdIKHRyMSwgc2luYSkKLQotCWxkcgkJCQkJcjgsIFtyMl0sICM0Ci0JbGRyCQkJCQlyOSwgW3IyXSwgIzQKLQotCXNtdWxsCQkJCXIxNCwgcjQsIHI2LCByOAkJCQkJCUAgTVVMSElHSCh0cjIsIGNvc2EpCi0Jc211bGwgICAgCQkJcjEwLCByMTIsIHI1LCByOAkJCQkJQCBNVUxISUdIKHRpMiwgY29zYSkKLQotCXNtdWxsCQkJCXIxNCwgcjgsIHI1LCByOQkJCQkJCUAgTVVMSElHSCh0aTIsIHNpbmEpCi0Jc211bGwJCQkJcjUsIHIxMCwgcjYsIHI5CQkJCQkJQCBNVUxISUdIKHRyMiwgc2luYSkKLQotCWFkZAkJCQkJcjgsIHI4LCByNAotCXN1YgkJCQkJcjksIHIxMiwgcjEwCi0KLQltb3YJCQkJCXI2LCByMTEKLQotCXN0cmQJCQkJcjYsIFtyMF0KLQlzdHJkCQkJCXI4LCBbcjNdCi0KLQlzdWJzCQkJCXIxLCByMSwgIzEKLQlzdWIJCQkJCXIzLCByMywgIzgKLQlhZGQgCQkJCXIwLCByMCwgIzgKLQlibmUJCQkJCVByZU1EQ1RfTE9PUAotCi1QcmVNRENUX0VORDoKLQlsZG1pYSAgICAgICBzcCEsIHtyNCAtIHIxMSwgcGN9Ci0JQEVORFAgIEAgfFByZU1EQ1R8Ci0KLQkuc2VjdGlvbiAudGV4dAotCS5nbG9iYWwJUG9zdE1EQ1QKLQotUG9zdE1EQ1Q6Ci0Jc3RtZGIgICAgICAgc3AhLCB7cjQgLSByMTEsIGxyfQotCi0JYWRkICAgICAgICAgcjksIHIwLCByMSwgbHNsICMyCi0Jc3ViICAgICAgICAgcjMsIHI5LCAjOAotCi0JbW92cyAgICAgICAgcjEsIHIxLCBhc3IgIzIKLQliZXEgICAgICAgICBQb3N0TURDVF9FTkQKLQotUG9zdE1EQ1RfTE9PUDoKLQlsZHIJCQkJCXI4LCBbcjJdLCAjNAotCWxkcgkJCQkJcjksIFtyMl0sICM0Ci0KLQlsZHJkCQkJCXI0LCBbcjBdCi0JbGRyZAkJCQlyNiwgW3IzXQotCi0Jc211bGwJCQkJcjE0LCByMTEsIHI0LCByOAkJCQkJQCBNVUxISUdIKHRyMSwgY29zYSkKLQlzbXVsbCAgICAJCQlyMTAsIHIxMiwgcjUsIHI4CQkJCQlAIE1VTEhJR0godGkxLCBjb3NhKQotCi0Jc211bGwJCQkJcjE0LCByOCwgcjUsIHI5CQkJCQkJQCBNVUxISUdIKHRpMSwgc2luYSkKLQlzbXVsbAkJCQlyNSwgcjEwLCByNCwgcjkJCQkJCQlAIE1VTEhJR0godHIxLCBzaW5hKQotCi0JYWRkCQkJCQlyNCwgcjExLCByOAkJCQkJCQlAIE1VTEhJR0goY29zYSwgdHIxKSArIE1VTEhJR0goc2luYSwgdGkxKUAKLQlzdWIJCQkJCXIxMSwgcjEwLCByMTIJCQkJCQlAIE1VTEhJR0godGkxLCBjb3NhKSAtIE1VTEhJR0godHIxLCBzaW5hKUAKLQotCWxkcgkJCQkJcjgsIFtyMl0sICM0CQkJCQkJQAotCWxkcgkJCQkJcjksIFtyMl0sICM0Ci0KLQlzbXVsbAkJCQlyMTQsIHI1LCByNiwgcjgJCQkJCQlAIE1VTEhJR0godHIyLCBjb3NhKQotCXNtdWxsICAgIAkJCXIxMCwgcjEyLCByNywgcjgJCQkJCUAgTVVMSElHSCh0aTIsIGNvc2EpCi0KLQlzbXVsbAkJCQlyMTQsIHI4LCByNywgcjkJCQkJCQlAIE1VTEhJR0godGkyLCBzaW5hKQotCXNtdWxsCQkJCXI3LCByMTAsIHI2LCByOQkJCQkJCUAgTVVMSElHSCh0cjIsIHNpbmEpCi0KLQlhZGQJCQkJCXI2LCByOCwgcjUJCQkJCQkJQCBNVUxISUdIKGNvc2IsIHRyMikgKyBNVUxISUdIKHNpbmIsIHRpMilACi0Jc3ViCQkJCQlyNSwgcjEwLCByMTIJCQkJCQlAIE1VTEhJR0goc2luYiwgdHIyKSAtIE1VTEhJR0goY29zYiwgdGkyKUAKLQotCW1vdgkJCQkJcjcsIHIxMQotCi0Jc3RyZAkJCQlyNCwgW3IwXQotCXN0cmQJCQkJcjYsIFtyM10KLQotCXN1YnMJCQkJcjEsIHIxLCAjMQotCXN1YgkJCQkJcjMsIHIzLCAjOAotCWFkZCAJCQkJcjAsIHIwLCAjOAotCWJuZQkJCQkJUG9zdE1EQ1RfTE9PUAotCi1Qb3N0TURDVF9FTkQ6Ci0JbGRtaWEgICAgICAgc3AhLCB7cjQgLSByMTEsIHBjfQotCUBFTkRQICBAIHxQb3N0TURDVHwKLQkuZW5kCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjVFL1I0UjhGaXJzdF92NS5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY1RS9SNFI4Rmlyc3RfdjUucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNhNGYzMS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjVFL1I0UjhGaXJzdF92NS5zCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLUAvKgotQCAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotQCAqKgotQCAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLUAgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotQCAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLUAgKioKLUAgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotQCAqKgotQCAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1AICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1AICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotQCAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1AICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotQCAqLwotCi1AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBACi1ACUZpbGU6CQlSNFI4Rmlyc3RfdjUucwotQAotQAlDb250ZW50OglSYWRpeDhGaXJzdCBhbmQgUmFkaXg0Rmlyc3QgZnVuY3Rpb24gYXJtdjUgYXNzZW1ibGUKLUAKLUBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBACi0KLQkuc2VjdGlvbiAudGV4dAotCS5nbG9iYWwJUmFkaXg0Rmlyc3QKLQotUmFkaXg0Rmlyc3Q6Ci0Jc3RtZGIgICAgICAgc3AhLCB7cjQgLSByMTEsIGxyfQotCi0JbW92cwkJCQlyMTAsIHIxCi0JbW92CQkJCQlyMTEsIHIwCi0JYmVxCQkJCQlSYWRpeDRGaXJzdF9FTkQKLQotUmFkaXg0Rmlyc3RfTE9PUDoKLQlsZHJkCQkJCXIwLCBbcjExXQotCWxkcmQJCQkJcjIsIFtyMTEsICM4XQotCWxkcmQJCQkJcjQsIFtyMTEsICMxNl0KLQlsZHJkCQkJCXI2LCBbcjExLCAjMjRdCi0KLQlhZGQJCQkJCXI4LCByMCwgcjIKLQlhZGQJCQkJCXI5LCByMSwgcjMKLQotCXN1YgkJCQkJcjAsIHIwLCByMgotCXN1YgkJCQkJcjEsIHIxLCByMwotCi0JYWRkCQkJCQlyMiwgcjQsIHI2Ci0JYWRkCQkJCQlyMywgcjUsIHI3Ci0KLQlzdWIJCQkJCXI0LCByNCwgcjYKLQlzdWIJCQkJCXI1LCByNSwgcjcKLQotCWFkZAkJCQkJcjYsIHI4LCByMgotCWFkZAkJCQkJcjcsIHI5LCByMwotCi0Jc3ViCQkJCQlyOCwgcjgsIHIyCi0Jc3ViCQkJCQlyOSwgcjksIHIzCi0KLQlhZGQJCQkJCXIyLCByMCwgcjUKLQlzdWIJCQkJCXIzLCByMSwgcjQKLQotCXN1YgkJCQkJcjAsIHIwLCByNQotCWFkZAkJCQkJcjEsIHIxLCByNAotCi0Jc3RyZAkJCQlyNiwgW3IxMV0KLQlzdHJkCQkJCXIyLCBbcjExLCAjOF0KLQlzdHJkCQkJCXI4LCBbcjExLCAjMTZdCi0Jc3RyZAkJCQlyMCwgW3IxMSwgIzI0XQotCi0Jc3VicwkJCQlyMTAsIHIxMCwgIzEKLQlhZGQJCQkJCXIxMSwgcjExLCAjMzIKLQlibmUJCQkJCVJhZGl4NEZpcnN0X0xPT1AKLQotUmFkaXg0Rmlyc3RfRU5EOgotCWxkbWlhICAgICAgIHNwISwge3I0IC0gcjExLCBwY30KLQlARU5EUCAgQCB8UmFkaXg0Rmlyc3R8Ci0KLQkuc2VjdGlvbiAudGV4dAotCS5nbG9iYWwJUmFkaXg4Rmlyc3QKLQotUmFkaXg4Rmlyc3Q6Ci0Jc3RtZGIgICAgICAgc3AhLCB7cjQgLSByMTEsIGxyfQotCXN1YiAgICAgICAgIHNwLCBzcCwgIzB4MjQKLQotCW1vdgkJCQkgIHIxMiwgcjEKLQltb3YJCQkJCXIxNCwgcjAKLQljbXAJCQkJCXIxMiwgIzAKLQliZXEJCQkJCVJhZGl4OEZpcnN0X0VORAotCi1SYWRpeDhGaXJzdF9MT09QOgotCWxkcmQJCQkJcjAsIFtyMTRdCi0JbGRyZAkJCQlyMiwgW3IxNCwgIzhdCi0JbGRyZAkJCQlyNCwgW3IxNCwgIzE2XQotCWxkcmQJCQkJcjYsIFtyMTQsICMyNF0KLQotCWFkZAkJCQkJcjgsIHIwLCByMgkJCQkJQCByMCA9IGJ1ZlswXSArIGJ1ZlsyXUAKLQlhZGQJCQkJCXI5LCByMSwgcjMJCQkJCUAgaTAgPSBidWZbMV0gKyBidWZbM11ACi0KLQlzdWIJCQkJCXIwLCByMCwgcjIJCQkJCUAgcjEgPSBidWZbMF0gLSBidWZbMl1ACi0Jc3ViCQkJCQlyMSwgcjEsIHIzCQkJCQlAIGkxID0gYnVmWzFdIC0gYnVmWzNdQAotCi0JYWRkCQkJCQlyMiwgcjQsIHI2CQkJCQlACXIyID0gYnVmWzRdICsgYnVmWzZdQAotCWFkZAkJCQkJcjMsIHI1LCByNwkJCQkJQCBpMiA9IGJ1Zls1XSArIGJ1Zls3XUAKLQotCXN1YgkJCQkJcjQsIHI0LCByNgkJCQkJQAlyMyA9IGJ1Zls0XSAtIGJ1Zls2XUAKLQlzdWIJCQkJCXI1LCByNSwgcjcJCQkJCUAgaTMgPSBidWZbNV0gLSBidWZbN11ACi0KLQlhZGQJCQkJCXI2LCByOCwgcjIJCQkJCUAgcjQgPSAocjAgKyByMikgPj4gMUAKLQlhZGQJCQkJCXI3LCByOSwgcjMJCQkJCUAgaTQgPSAoaTAgKyBpMikgPj4gMUAKLQotCXN1YgkJCQkJcjgsIHI4LCByMgkJCQkJQAlyNSA9IChyMCAtIHIyKSA+PiAxQAotCXN1YgkJCQkJcjksIHI5LCByMwkJCQkJQCBpNSA9IChpMCAtIGkyKSA+PiAxQAotCi0Jc3ViCQkJCQlyMiwgcjAsIHI1CQkJCQlAIHI2ID0gKHIxIC0gaTMpID4+IDFACi0JYWRkCQkJCQlyMywgcjEsIHI0CQkJCQlAIGk2ID0gKGkxICsgcjMpID4+IDFACi0KLQlhZGQJCQkJCXIwLCByMCwgcjUJCQkJCUAgcjcgPSAocjEgKyBpMykgPj4gMUAKLQlzdWIJCQkJCXIxLCByMSwgcjQJCQkJCUAgaTcgPSAoaTEgLSByMykgPj4gMUAKLQotCW1vdgkJCQkJcjYsIHI2LCBhc3IgIzEJCQlACi0JbW92CQkJCQlyNywgcjcsIGFzciAjMQkJCUAKLQotCW1vdgkJCQkJcjgsIHI4LCBhc3IgIzEKLQltb3YJCQkJCXI5LCByOSwgYXNyICMxCi0KLQltb3YJCQkJCXIyLCByMiwgYXNyICMxCi0JbW92CQkJCQlyMywgcjMsIGFzciAjMQotCi0JbW92CQkJCQlyMCwgcjAsIGFzciAjMQotCW1vdgkJCQkJcjEsIHIxLCBhc3IgIzEKLQotCXN0cgkJCQkJcjYsIFtzcF0KLQlzdHIJCQkJCXI3LCBbc3AsICM0XQotCi0Jc3RyCQkJCQlyOCwgW3NwLCAjOF0KLQlzdHIJCQkJCXI5LCBbc3AsICMxMl0KLQotCXN0cgkJCQkJcjIsIFtzcCwgIzE2XQotCXN0cgkJCQkJcjMsIFtzcCwgIzIwXQotCi0Jc3RyCQkJCQlyMCwgW3NwLCAjMjRdCi0Jc3RyCQkJCQlyMSwgW3NwLCAjMjhdCi0KLQlsZHJkCQkJCXIyLCBbcjE0LCAjMzJdCi0JbGRyZAkJCQlyNCwgW3IxNCwgIzQwXQotCWxkcmQJCQkJcjYsIFtyMTQsICM0OF0KLQlsZHJkCQkJCXI4LCBbcjE0LCAjNTZdCi0KLQlhZGQJCQkJCXIwLCByMiwgcjQJCQkJCUAgcjAgPSBidWZbIDhdICsgYnVmWzEwXUAKLQlhZGQJCQkJCXIxLCByMywgcjUJCQkJCUAgaTAgPSBidWZbIDldICsgYnVmWzExXUAKLQotCXN1YgkJCQkJcjIsIHIyLCByNAkJCQkJQCByMSA9IGJ1ZlsgOF0gLSBidWZbMTBdQAotCXN1YgkJCQkJcjMsIHIzLCByNQkJCQkJQCBpMSA9IGJ1ZlsgOV0gLSBidWZbMTFdQAotCi0JYWRkCQkJCQlyNCwgcjYsIHI4CQkJCQlAIHIyID0gYnVmWzEyXSArIGJ1ZlsxNF1ACi0JYWRkCQkJCQlyNSwgcjcsIHI5CQkJCQlAIGkyID0gYnVmWzEzXSArIGJ1ZlsxNV1ACi0KLQlzdWIJCQkJCXI2LCByNiwgcjgJCQkJCUAgcjMgPSBidWZbMTJdIC0gYnVmWzE0XUAKLQlzdWIJCQkJCXI3LCByNywgcjkJCQkJCUAJaTMgPSBidWZbMTNdIC0gYnVmWzE1XUAKLQotCWFkZAkJCQkJcjgsIHIwLCByNAkJCQkJQCB0MCA9IChyMCArIHIyKQotCWFkZAkJCQkJcjksIHIxLCByNQkJCQkJQCB0MSA9IChpMCArIGkyKQotCi0Jc3ViCQkJCQlyMCwgcjAsIHI0CQkJCQlAIHQyID0gKHIwIC0gcjIpCi0Jc3ViCQkJCQlyMSwgcjEsIHI1CQkJCQlAIHQzID0gKGkwIC0gaTIpCi0KLQltb3YJCQkJCXI4LCByOCwgYXNyICMxCi0JbGRyCQkJCQlyNCwgW3NwXQotCi0JbW92CQkJCQlyOSwgcjksIGFzciAjMQotCWxkcgkJCQkJcjUsIFtzcCwgIzRdCi0KLQltb3YJCQkJCXIwLCByMCwgYXNyICMxCi0JbW92CQkJCQlyMSwgcjEsIGFzciAjMQotCi0JYWRkCQkJCQlyMTAsIHI0LCByOAkJCQkJQCBidWZbIDBdID0gcjQgKyB0MEAKLQlhZGQJCQkJCXIxMSwgcjUsIHI5CQkJCQlAIGJ1ZlsgMV0gPSBpNCArIHQxQAotCi0Jc3ViCQkJCQlyNCwgIHI0LCByOAkJCQkJQCBidWZbIDhdID0gcjQgLSB0MEAKLQlzdWIJCQkJCXI1LCAgcjUsIHI5CQkJCQlACWJ1ZlsgOV0gPSBpNCAtIHQxQAotCi0gCXN0cmQJCQkJcjEwLCBbcjE0XQotIAlzdHJkCQkJCXI0LCAgW3IxNCwgIzMyXQotCi0gCWxkcgkJCQkJcjEwLCBbc3AsICM4XQotIAlsZHIJCQkJCXIxMSwgW3NwLCAjMTJdCi0KLSAJYWRkCQkJCQlyNCwgcjEwLCByMQkJCQkJQCBidWZbIDRdID0gcjUgKyB0M0AKLSAJc3ViCQkJCQlyNSwgcjExLCByMAkJCQkJQAlidWZbIDVdID0gaTUgLSB0MkAKLQotIAlzdWIJCQkJCXIxMCwgcjEwLCByMQkJCQlAIGJ1ZlsxMl0gPSByNSAtIHQzQAotIAlhZGQJCQkJCXIxMSwgcjExLCByMAkJCQlAIGJ1ZlsxM10gPSBpNSArIHQyQAotCi0gCXN0cmQJCQkJcjQsICBbcjE0LCAjMTZdCi0gCXN0cmQJCQkJcjEwLCBbcjE0LCAjNDhdCi0KLSAJc3ViCQkJCQlyMCwgcjIsIHI3CQkJCQlAIHIwID0gcjEgLSBpM0AKLSAJYWRkCQkJCQlyMSwgcjMsIHI2CQkJCQlAIGkwID0gaTEgKyByM0AKLQotICBsZHIJCQkJCXIxMSwgREFUQVRhYgotCi0gCWFkZAkJCQkJcjIsIHIyLCByNwkJCQkJQCByMiA9IHIxICsgaTNACi0gCXN1YgkJCQkJcjMsIHIzLCByNgkJCQkJQCBpMiA9IGkxIC0gcjNACi0KLQlzdWIJCQkJCXI0LCByMCwgcjEJCQkJCUAgcjAgLSBpMAotCWFkZAkJCQkJcjUsIHIwLCByMQkJCQkJQCByMCArIGkwCi0KLQlzdWIJCQkJCXIwLCByMiwgcjMJCQkJCUAgcjIgLSBpMgotCWFkZAkJCQkJcjEsIHIyLCByMwkJCQkJQCByMiArIGkyCi0KLQlzbXVsbAkJCQlyOCwgcjYsIHI0LCByMTEKLQlzbXVsbAkJCQlyOSwgcjcsIHI1LCByMTEKLQotCWxkcgkJCQkJcjIsIFtzcCwgIzE2XQotCWxkcgkJCQkJcjMsIFtzcCwgIzIwXQotCi0Jc211bGwJCQkJcjgsIHI0LCByMCwgcjExCi0Jc211bGwJCQkJcjksIHI1LCByMSwgcjExCi0KLQlsZHIJCQkJCXIxMCwgW3NwLCAjMjRdCi0JbGRyCQkJCQlyMTEsIFtzcCwgIzI4XQotCi0Jc3ViCQkJCQlyOCwgcjIsIHI2Ci0Jc3ViCQkJCQlyOSwgcjMsIHI3Ci0KLQlhZGQJCQkJCXIyLCByMiwgcjYKLQlhZGQJCQkJCXIzLCByMywgcjcKLQotCWFkZAkJCQkJcjYsIHIxMCwgcjUKLQlzdWIJCQkJCXI3LCByMTEsIHI0Ci0KLQlzdWIJCQkJCXIwLCByMTAsIHI1Ci0JYWRkCQkJCQlyMSwgcjExLCByNAotCi0Jc3RyZAkJCQlyNiwgW3IxNCwgIzhdCi0Jc3RyZAkJCQlyOCwgW3IxNCwgIzI0XQotCXN0cmQJCQkJcjAsIFtyMTQsICM0MF0KLQlzdHJkCQkJCXIyLCBbcjE0LCAjNTZdCi0KLQlzdWJzCQkJCXIxMiwgcjEyLCAjMQotCWFkZAkJCQkJcjE0LCByMTQsICM2NAotCi0JYm5lCQkJCQlSYWRpeDhGaXJzdF9MT09QCi0KLVJhZGl4OEZpcnN0X0VORDoKLQlhZGQgICAgICAgICBzcCwgc3AsICMweDI0Ci0JbGRtaWEgICAgICAgc3AhLCB7cjQgLSByMTEsIHBjfQotCi1EQVRBVGFiOgotCS53b3JkICAgICAgIDB4NWE4Mjc5OWEKLQotCUBFTkRQICBAIHxSYWRpeDhGaXJzdHwKLQkuZW5kCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjVFL1JhZGl4NEZGVF92NS5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY1RS9SYWRpeDRGRlRfdjUucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU5Yjk2Ny4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjVFL1JhZGl4NEZGVF92NS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLUAvKgotQCAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotQCAqKgotQCAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLUAgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotQCAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLUAgKioKLUAgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotQCAqKgotQCAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1AICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1AICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotQCAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1AICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotQCAqLwotCi1AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBACi1ACUZpbGU6CQlSYWRpeDRGRlRfdjUucwotQAotQAlDb250ZW50OglSYWRpeDRGRlQgYXJtdjUgYXNzZW1ibGUKLUAKLUBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBACi0JLnNlY3Rpb24gLnRleHQKLQkuZ2xvYmFsCVJhZGl4NEZGVAotCi1SYWRpeDRGRlQ6Ci0Jc3RtZGIgICAgIHNwISwge3I0IC0gcjExLCBscn0KLQlzdWIgICAgICAgc3AsIHNwLCAjMzIKLQotCW1vdgkJCXIxLCByMSwgYXNyICMyCi0JY21wICAgICByMSwgIzAKLQliZXEgICAgIFJhZGl4NEZGVF9FTkQKLQotUmFkaXg0RkZUX0xPT1AxOgotCW1vdiAgICAgcjE0LCByMCAgICAgICAgICAJCQkJCQkJQCB4cHRyID0gYnVmQAotCW1vdgkJcjEwLCByMSAJCQkJCQkJCQkJCQlAIGkgPSBudW1ACi0JbW92ICAgICByOSwgcjIsIGxzbCAjMyAgCQkJCQkJCUAgc3RlcCA9IDIqYmduQAotCWNtcCAgICAgcjEwLCAjMAotCXN0cgkJcjAsIFtzcF0KLQlzdHIJCXIxLCBbc3AsICM0XQotCXN0cgkJcjIsIFtzcCwgIzhdCi0Jc3RyCQlyMywgW3NwLCAjMTJdCi0JYmVxICAgICBSYWRpeDRGRlRfTE9PUDFfRU5ECi0KLVJhZGl4NEZGVF9MT09QMjoKLQltb3YgICAgIHIxMiwgcjMJCQkJICAgICAgICAJCQkJQCBjc3B0ciA9IHR3aWRUYWJACi0JbW92CQlyMTEsIHIyCQkJCQkJCQkJCQkJQCBqID0gYmduCi0JY21wICAgICByMTEsICMwCi0Jc3RyCQlyMTAsIFtzcCwgIzE2XQotCWJlcSAgICAgUmFkaXg0RkZUX0xPT1AyX0VORAotCi1SYWRpeDRGRlRfTE9PUDM6Ci0Jc3RyCQkJcjExLCBbc3AsICMyMF0KLQotCWxkcmQJCXIwLCBbcjE0LCAjMF0JCQkJCQkJCQlAIHIwID0geHB0clswXUAgcjEgPSB4cHRyWzFdQAotCWFkZAkJCXIxNCwgcjE0LCByOSAJIAkJCQkJCQkJQCB4cHRyICs9IHN0ZXBACi0KLQlsZHJkCQlyMTAsCVtyMTQsICMwXSAgCQkJCQkgCQkJQCByMiA9IHhwdHJbMF1AIHIzID0geHB0clsxXUAKLQlsZHIJCQlyOCwgW3IxMl0sICM0CQkJCQkJCQkJQCBjb3N4c2lueCA9IGNzcHRyWzBdQAotCi0Jc211bHd0CXI0LCByMTAsIHI4CQkJCQkJCQkJCUAgTF9tcHlfd3goY29zeCwgdDApCi0Jc211bHd0CXIzLCByMTEsIHI4CQkJCQkJCQkJCUAgTF9tcHlfd3goY29zeCwgdDEpCi0KLQlzbWxhd2IJcjIsIHIxMSwgcjgsIHI0CQkJCQkJCQlAIHIyID0gTF9tcHlfd3goY29zeCwgdDApICsgTF9tcHlfd3goc2lueCwgdDEpQAotCXNtdWx3YglyNSwgcjEwLCByOAkJCQkJCQkJCQlAIExfbXB5X3d4KHNpbngsIHQwKQotCi0JbW92CQkJcjEwLCByMCwgYXNyICMyCQkJCQkJCQlAIHQwID0gcjAgPj4gMkAKLQltb3YJCQlyMTEsIHIxLCBhc3IgIzIJCQkJCQkJCUAJdDEgPSByMSA+PiAyQAotCi0Jc3ViCQkJcjMsIHIzLCByNQkJCQkJCQkJCQlAIHIzID0gTF9tcHlfd3goY29zeCwgdDEpIC0gTF9tcHlfd3goc2lueCwgdDApQAotCWFkZCAgICAgcjE0LCByMTQsIHI5IAkgCQkJCQkJCQlAIHhwdHIgKz0gc3RlcEAKLQotCXN1YgkJCXIwLCByMTAsIHIyCQkJCQkJCQkJCUAgcjAgPSB0MCAtIHIyQAotCXN1YgkJCXIxLCByMTEsIHIzCQkJCQkJCQkJICBAIHIxID0gdDEgLSByM0AKLQotCWFkZAkJCXIyLCByMTAsIHIyCQkJCQkJCQkJCUAgcjIgPSB0MCArIHIyQAotCWFkZAkJCXIzLCByMTEsIHIzCQkJCQkJCQkJCUAgcjMgPSB0MSArIHIzQAotCi0Jc3RyCQkJcjIsIFtzcCwgIzI0XQotCXN0cgkJCXIzLCBbc3AsICMyOF0KLQotCWxkcmQJCXIxMCwgW3IxNCwgIzBdCQkJCQkJCQlAIHI0ID0geHB0clswXUAgcjUgPSB4cHRyWzFdQAotCWxkcgkJCXI4LCBbcjEyXSwgIzQJCQkJCQkJCQlAIGNvc3hzaW54ID0gY3NwdHJbMV1ACi0KLQlzbXVsd3QJcjYsIHIxMCwgcjgJCQkJCQkJCQkJQCBMX21weV93eChjb3N4LCB0MCkKLQlzbXVsd3QJcjUsIHIxMSwgcjgJCQkJCQkJCQkJQCBMX21weV93eChjb3N4LCB0MSkKLQotCXNtbGF3YglyNCwgcjExLCByOCwgcjYJCQkJCQkJCUAgcjQgPSBMX21weV93eChjb3N4LCB0MCkgKyBMX21weV93eChzaW54LCB0MSlACi0Jc211bHdiCXI3LCByMTAsIHI4CQkJCQkJCQkJCUAgTF9tcHlfd3goc2lueCwgdDApCi0KLQlhZGQJCQlyMTQsIHIxNCwgcjkJCQkJCQkJCQlAIHhwdHIgKz0gc3RlcEAKLQlzdWIJCQlyNSwgcjUsIHI3CQkJCQkJCQkJCUAgcjUgPSBMX21weV93eChjb3N4LCB0MSkgLSBMX21weV93eChzaW54LCB0MClACi0KLQlsZHJkCQlyMTAsIFtyMTRdCQkJCQkJCQkJCUAgcjYgPSB4cHRyWzBdQCByNyA9IHhwdHJbMV1ACi0JbGRyCQkJcjgsIFtyMTJdLCAjNAkJCQkJCQkJCUAgY29zeHNpbnggPSBjc3B0clsxXUAKLQotCXNtdWx3dAlyMiwgcjEwLCByOAkJCQkJCQkJCQlAIExfbXB5X3d4KGNvc3gsIHQwKQotCXNtdWx3dAlyNywgcjExLCByOAkJCQkJCQkJCQlAIExfbXB5X3d4KGNvc3gsIHQxKQotCi0Jc21sYXdiCXI2LCByMTEsIHI4LCByMgkJCQkJCQkJQCByNCA9IExfbXB5X3d4KGNvc3gsIHQwKSArIExfbXB5X3d4KHNpbngsIHQxKUAKLQlzbXVsd2IJcjMsIHIxMCwgcjgJCQkJCQkJCQkJQCBMX21weV93eChzaW54LCB0MCkKLQotCW1vdgkJCXIxMCwgcjQJCQkJCQkJCQkJCQlAIHQwID0gcjRACi0JbW92CQkJcjExLCByNQkJCQkJCQkJCQkJCUAgdDEgPSByNUAKLQotCXN1YgkJCXI3LCByNywgcjMJCQkJCQkJCQkJQCByNSA9IExfbXB5X3d4KGNvc3gsIHQxKSAtIExfbXB5X3d4KHNpbngsIHQwKUAKLQotCi0JYWRkCQkJcjQsICByMTAsIHI2CQkJCQkJCQkJQAlyNCA9IHQwICsgcjZACi0Jc3ViCQkJcjUsIHI3LCByMTEJCQkJCQkJCQkJQCByNSA9IHI3IC0gdDFACi0KLQlzdWIJCQlyNiwgcjEwLCByNgkJCQkJCQkJCQlAIHI2ID0gdDAgLSByNkAKLQlhZGQJCQlyNywgcjcsIHIxMQkJCQkJCQkJCQlAIHI3ID0gcjcgKyB0MUAKLQotCWxkcgkJCXIyLCBbc3AsICMyNF0KLQlsZHIJCQlyMywgW3NwLCAjMjhdCi0KLQlhZGQJCQlyMTAsIHIwLCByNQkJCQkJCQkJCQlAIHhwdHJbMF0gPSByMCArIHI1QAotCWFkZAkJCXIxMSwgcjEsIHI2CQkJCQkJCQkJCUAgeHB0clswXSA9IHIxICsgcjYKLQotCXN0cmQJCXIxMCwgW3IxNF0KLQlzdWIJCQlyMTQsIHIxNCwgcjkJCQkJCQkJCQlAIHhwdHIgLT0gc3RlcEAKLQotCXN1YgkJCXIxMCwgcjIsIHI0CQkJCQkJCQkJCUAJeHB0clswXSA9IHIyIC0gcjRACi0Jc3ViCQkJcjExLCByMywgcjcJCQkJCQkJCQkJQCB4cHRyWzFdID0gcjMgLSByN0AKLQotCXN0cmQJCXIxMCwgW3IxNF0KLQlzdWIJCQlyMTQsIHIxNCwgcjkJCQkJCQkJCQlAIHhwdHIgLT0gc3RlcEAKLQotCXN1YgkJCXIxMCwgcjAsIHI1CQkJCQkJCQkJCUAgeHB0clswXSA9IHIwIC0gcjVACi0Jc3ViCQkJcjExLCByMSwgcjYJCQkJCQkJCQkJQCB4cHRyWzBdID0gcjEgLSByNgotCi0Jc3RyZAkJcjEwLCBbcjE0XQotCXN1YgkJCXIxNCwgcjE0LCByOQkJCQkJCQkJCUAgeHB0ciAtPSBzdGVwQAotCi0JYWRkCQkJcjEwLCByMiwgcjQJCQkJCQkJCQkJQAl4cHRyWzBdID0gcjIgLSByNEAKLQlhZGQJCQlyMTEsIHIzLCByNwkJCQkJCQkJCQlAIHhwdHJbMV0gPSByMyAtIHI3QAotCi0Jc3RyZAkJcjEwLCBbcjE0XQotCWFkZAkJCXIxNCwgcjE0LCAjOAkJCQkJCQkJCUAgeHB0ciArPSAyQAotCi0JbGRyCQkJcjExLCBbc3AsICMyMF0KLQlzdWJzCQlyMTEsIHIxMSwgIzEKLQlibmUJCQlSYWRpeDRGRlRfTE9PUDMKLQotUmFkaXg0RkZUX0xPT1AyX0VORDoKLQlsZHIJCQlyMTAsIFtzcCwgIzE2XQotCWxkcgkJCXIzLCBbc3AsICMxMl0KLQlsZHIJCQlyMiwgW3NwLCAjOF0KLQlyc2IJCQlyOCwgcjksIHI5LCBsc2wgIzIKLQlzdWIJCQlyMTAsIHIxMCwgIzEKLQlhZGQJCQlyMTQsIHIxNCwgcjgKLQljbXAJCQlyMTAsICMwCi0JYmhpICAgICBSYWRpeDRGRlRfTE9PUDIKLQotUmFkaXg0RkZUX0xPT1AxX0VORDoKLQlsZHIgICAgIHIwLCBbc3BdCi0JbGRyCQlyMSwgW3NwLCAjNF0KLQlhZGQgICAgIHIzLCByMywgcjgsIGFzciAjMQotCW1vdiAgICAgcjIsIHIyLCBsc2wgIzIKLQltb3ZzICAgIHIxLCByMSwgYXNyICMyCi0JYm5lICAgICBSYWRpeDRGRlRfTE9PUDEKLQotUmFkaXg0RkZUX0VORDoKLQlhZGQgICAgIHNwLCBzcCwgIzMyCi0JbGRtaWEgICBzcCEsIHtyNCAtIHIxMSwgcGN9Ci0KLQlARU5EUCAgQCB8UmFkaXg0RkZUfAotCS5lbmQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNUUvYmFuZF9ucmdfdjUucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNUUvYmFuZF9ucmdfdjUucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc4OWY2ZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjVFL2JhbmRfbnJnX3Y1LnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotQC8qCi1AICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi1AICoqCi1AICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotQCAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi1AICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotQCAqKgotQCAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi1AICoqCi1AICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLUAgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLUAgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1AICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLUAgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi1AICovCi0KLUBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAKLUAJRmlsZToJCWJhbmRfbnJnX3Y1LnMKLUAKLUAJQ29udGVudDoJQ2FsY0JhbmRFbmVyZ3kgYW5kIENhbGNCYW5kRW5lcmd5TVMgZnVuY3Rpb24gYXJtdjUgYXNzZW1ibGUKLUAKLUBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBACi0KLQkuc2VjdGlvbiAudGV4dAotCi0JLmdsb2JhbAlDYWxjQmFuZEVuZXJneQotCi1DYWxjQmFuZEVuZXJneToKLQlzdG1kYiAgIHNwISwge3I0IC0gcjExLCBscn0KLQotICBtb3YgICAgIHIyLCByMiwgbHNsICMxNgotCWxkciAgICAgcjEyLCBbcjEzLCAjMzZdCi0JbW92CQkJcjksICMwCi0gIG1vdiAgICAgcjUsIHIyLCBhc3IgIzE2Ci0JbW92CQkJcjQsICMwCi0gIGNtcCAgICAgcjUsICMwCi0JYmxlICAgICBMMjEyCi0KLUwyMjoKLSAgbW92ICAgICByMiwgcjQsIGxzbCAjMQotICBsZHJzaCAgIHIxMCwgW3IxLCByMl0KLSAgYWRkICAgICByMTEsIHIxLCByMgotICBsZHJzaCAgIHIyLCBbcjExLCAjMl0KLQltb3YgICAgIHIxNCwgIzAKLSAgY21wICAgICByMTAsIHIyCi0gIGJnZSAgICAgTDI4Ci0KLUwyMzoKLQlsZHIgICAgIHIxMSwgW3IwLCArcjEwLCBsc2wgIzJdCi0gIGFkZCAgICAgcjEwLCByMTAsICMxCi0JbGRyICAgICByNiwgW3IwLCArcjEwLCBsc2wgIzJdCi0Jc211bGwgICByMTEsIHI3LCByMTEsIHIxMQotCWFkZCAgICAgcjEwLCByMTAsICMxCi0Jc211bGwJICByNiwgcjgsIHI2LCByNgotCWxkciAgICAgcjExLCBbcjAsICtyMTAsIGxzbCAjMl0KLQlxYWRkCSAgcjE0LCByMTQsIHI3Ci0JYWRkICAgICByMTAsIHIxMCwgIzEKLQlzbXVsbAkgIHIxMSwgcjcsIHIxMSwgcjExCi0JbGRyICAgICByNiwgW3IwLCArcjEwLCBsc2wgIzJdCi0JcWFkZAkgIHIxNCwgcjE0LCByOAotCXNtdWxsCSAgcjYsIHI4LCByNiwgcjYKLSAgYWRkICAgICByMTAsIHIxMCwgIzEKLQlxYWRkCSAgcjE0LCByMTQsIHI3Ci0JY21wICAgICByMTAsIHIyCi0JcWFkZAkgIHIxNCwgcjE0LCByOAotCWJsdCAgICAgTDIzCi0KLUwyODoKLQlxYWRkCSAgcjE0LCByMTQsIHIxNAotCXN0ciAgICAgcjE0LCBbcjMsICtyNCwgbHNsICMyXQotCWFkZCAgICAgcjQsIHI0LCAjMQotCXFhZGQJICByOSwgcjksIHIxNAotCWNtcCAgICAgcjQsIHI1Ci0KLSAgYmx0ICAgICBMMjIKLQotTDIxMjoKLQlzdHIgICAgIHI5LCBbcjEyLCAjMF0KLQlsZG1pYSAgIHNwISwge3I0IC0gcjExLCBwY30KLQotCUBFTkRQICA7IHxDYWxjQmFuZEVuZXJneXwKLQotCS5nbG9iYWwJQ2FsY0JhbmRFbmVyZ3lNUwotCi1DYWxjQmFuZEVuZXJneU1TOgotCXN0bWRiICAgc3AhLCB7cjQgLSByMTEsIGxyfQotCXN1YiAgICAgcjEzLCByMTMsICMyNAotCi0JbW92ICAgICByMTIsICMwCi0gIG1vdiAgICAgcjMsIHIzLCBsc2wgIzE2Ci0gIG1vdiAgICAgcjE0LCAjMAotCW1vdiAgICAgcjMsIHIzLCBhc3IgIzE2Ci0JY21wICAgICByMywgIzAKLQltb3YJCSAgcjQsICMwCi0gIGJsZSAgICAgTDMxNQotCi1MMzI6Ci0JbW92CQkgIHI1LCByNCwgbHNsICMxCi0JbW92CQkgIHI2LCAjMAotCWxkcnNoICAgcjEwLCBbcjIsIHI1XQotCWFkZCAgICAgcjUsIHIyLCByNQotCW1vdgkJICByNywgIzAKLQlsZHJzaAkgIHIxMSwgW3I1LCAjMl0KLQljbXAgICAgIHIxMCwgcjExCi0gIGJnZSAgICAgTDM5Ci0KLQlzdHIJCSAgcjMsIFtyMTMsICM0XQotCXN0cgkJICByNCwgW3IxMywgIzhdCi0Jc3RyCQkgIHIxMiwgW3IxMywgIzEyXQotCXN0cgkJICByMTQsIFtyMTMsICMxNl0KLQotTDMzOgotCWxkciAgICAgcjgsIFtyMCwgK3IxMCwgbHNsICMyXQotCWxkciAgICAgcjksIFtyMSwgK3IxMCwgbHNsICMyXQotCW1vdgkJICByOCwgcjgsIGFzciAjMQotCWFkZAkJICByMTAsIHIxMCwgIzEKLQltb3YJCSAgcjksIHI5LCBhc3IgIzEKLQotCWxkciAgICAgcjEyLCBbcjAsICtyMTAsIGxzbCAjMl0KLQlhZGQJCSAgcjUsIHI4LCByOQotCWxkciAgICAgcjE0LCBbcjEsICtyMTAsIGxzbCAjMl0KLQlzdWIJCSAgcjgsIHI4LCByOQotCi0Jc211bGwgICByNSwgcjMsIHI1LCByNQotCW1vdgkJICByMTIsIHIxMiwgYXNyICMxCi0Jc211bGwgICByOCwgcjQsIHI4LCByOAotCW1vdgkJICByMTQsIHIxNCwgYXNyICMxCi0KLQlxYWRkCSAgcjYsIHI2LCByMwotCWFkZAkJICByNSwgcjEyLCByMTQKLQlxYWRkCSAgcjcsIHI3LCByNAotCXN1YgkJICByOCwgcjEyLCByMTQKLQotCXNtdWxsICAgcjUsIHIzLCByNSwgcjUKLQlhZGQJCSAgcjEwLCByMTAsICMxCi0Jc211bGwgICByOCwgcjQsIHI4LCByOAotCi0JcWFkZAkgIHI2LCByNiwgcjMKLQlxYWRkCSAgcjcsIHI3LCByNAotCi0JbGRyICAgICByOCwgW3IwLCArcjEwLCBsc2wgIzJdCi0JbGRyICAgICByOSwgW3IxLCArcjEwLCBsc2wgIzJdCi0JbW92CQkgIHI4LCByOCwgYXNyICMxCi0JYWRkCQkgIHIxMCwgcjEwLCAjMQotCW1vdgkJICByOSwgcjksIGFzciAjMQotCi0JbGRyICAgICByMTIsIFtyMCwgK3IxMCwgbHNsICMyXQotCWFkZAkJICByNSwgcjgsIHI5Ci0JbGRyICAgICByMTQsIFtyMSwgK3IxMCwgbHNsICMyXQotCXN1YgkJICByOCwgcjgsIHI5Ci0KLQlzbXVsbCAgIHI1LCByMywgcjUsIHI1Ci0JbW92CQkgIHIxMiwgcjEyLCBhc3IgIzEKLQlzbXVsbCAgIHI4LCByNCwgcjgsIHI4Ci0JbW92CQkgIHIxNCwgcjE0LCBhc3IgIzEKLQotCXFhZGQJICByNiwgcjYsIHIzCi0JYWRkCQkgIHI1LCByMTIsIHIxNAotCXFhZGQJICByNywgcjcsIHI0Ci0Jc3ViCQkgIHI4LCByMTIsIHIxNAotCi0Jc211bGwgICByNSwgcjMsIHI1LCByNQotCWFkZAkJICByMTAsIHIxMCwgIzEKLQlzbXVsbCAgIHI4LCByNCwgcjgsIHI4Ci0KLQlxYWRkCSAgcjYsIHI2LCByMwotCXFhZGQJICByNywgcjcsIHI0Ci0KLQljbXAgICAgIHIxMCwgcjExCi0KLQlibHQJCSAgTDMzCi0KLQlsZHIJCSAgcjMsIFtyMTMsICM0XQotCWxkcgkJICByNCwgW3IxMywgIzhdCi0JbGRyCQkgIHIxMiwgW3IxMywgIzEyXQotCWxkcgkJICByMTQsIFtyMTMsICMxNl0KLUwzOToKLQlxYWRkCSAgcjYsIHI2LCByNgotCXFhZGQJICByNywgcjcsIHI3Ci0KLQlsZHIJCSAgcjgsIFtyMTMsICM2MF0KLQlsZHIJCSAgcjksIFtyMTMsICM2OF0KLQotCXFhZGQJICByMTIsIHIxMiwgcjYKLQlxYWRkCSAgcjE0LCByMTQsIHI3Ci0KLQlzdHIJCSAgcjYsIFtyOCwgK3I0LCBsc2wgIzJdCi0Jc3RyICAgICByNywgW3I5LCArcjQsIGxzbCAjMl0KLQotCWFkZAkJICByNCwgcjQsICMxCi0JY21wCQkgIHI0LCByMwotCWJsdCAgICAgTDMyCi0KLUwzMTU6Ci0JbGRyCQkgIHI4LCBbcjEzLCAjNjRdCi0JbGRyCQkgIHI5LCBbcjEzLCAjNzJdCi0Jc3RyCQkgIHIxMiwgW3I4LCAjMF0KLQlzdHIJCSAgcjE0LCBbcjksICMwXQotCi0JYWRkICAgICByMTMsIHIxMywgIzI0Ci0JbGRtaWEgICBzcCEsIHtyNCAtIHIxMSwgcGN9Ci0JQEVORFAgIDsgfENhbGNCYW5kRW5lcmd5TVN8Ci0KLQkuZW5kCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjcvUHJlUG9zdE1EQ1RfdjcucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNy9QcmVQb3N0TURDVF92Ny5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjZiODgxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNy9QcmVQb3N0TURDVF92Ny5zCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLUAvKgotQCAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotQCAqKgotQCAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLUAgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotQCAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLUAgKioKLUAgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotQCAqKgotQCAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1AICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1AICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotQCAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1AICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotQCAqLwotCi1AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBACi1ACUZpbGU6CQlQcmVQb3N0TURDVF92Ny5zCi1ACi1ACUNvbnRlbnQ6CXByZW1kY3QgYW5kIHBvc3RtZGN0IGZ1bmN0aW9uIGFybXY3IGFzc2VtYmxlCi1ACi1AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAotCi0JLnNlY3Rpb24gLnRleHQKLQkuZ2xvYmFsCVByZU1EQ1QKLQkuZm5zdGFydAotCi1QcmVNRENUOgotCXN0bWRiICAgICBzcCEsIHtyNCAtIHIxMSwgbHJ9Ci0JLnNhdmUJICB7cjQgLSByMTEsIGxyfQotCWZzdG1mZGQgICBzcCEsIHtkOCAtIGQxNX0KLQkudnNhdmUJICB7ZDggLSBkMTV9Ci0KLQlhZGQgICAgICAgICByOSwgcjAsIHIxLCBsc2wgIzIKLQlzdWIgICAgICAgICByMywgcjksICMzMgotCi0JbW92cyAgICAgICAgcjEsIHIxLCBhc3IgIzIKLQliZXEgICAgICAgICBQcmVNRENUX0VORAotCi1QcmVNRENUX0xPT1A6Ci0JVkxENC5JMzIJCQl7ZDAsIGQyLCBkNCwgZDZ9LCBbcjJdIQkJCQlAIGNvc2EgPSAqY3NwdHIrK0Agc2luYSA9ICpjc3B0cisrQAotCVZMRDQuSTMyCQkJe2QxLCBkMywgZDUsIGQ3fSwgW3IyXSEJCQkJQCBjb3NiID0gKmNzcHRyKytAIHNpbmIgPSAqY3NwdHIrK0AKLQlWTEQyLkkzMgkJCXtkOCwgZDksIGQxMCwgZDExfSwgW3IwXQkJCUAgdHIxID0gKihidWYwICsgMClAIHRpMiA9ICooYnVmMCArIDEpQAotCVZMRDIuSTMyCQkJe2QxMywgZDE1fSwgW3IzXSEJCQkJCUAgdHIyID0gKihidWYxIC0gMSlAIHRpMSA9ICooYnVmMSArIDApQAotCVZMRDIuSTMyCQkJe2QxMiwgZDE0fSwgW3IzXSEJCQkJCUAgdHIyID0gKihidWYxIC0gMSlAIHRpMSA9ICooYnVmMSArIDApQAotCi0JVlJFVjY0LjMyCQkJUTgsIFE3Ci0JVlJFVjY0LjMyCQkJUTksIFE2Ci0KLQotCVZRRE1VTEguUzMyCQlRMTAsIFEwLCBRNAkJCQkJCQkJQCBNVUxISUdIKGNvc2EsIHRyMSkKLQlWUURNVUxILlMzMgkJUTExLCBRMSwgUTgJCQkJCQkJCUAgTVVMSElHSChzaW5hLCB0aTEpCi0JVlFETVVMSC5TMzIJCVExMiwgUTAsIFE4CQkJCQkJCQlAIE1VTEhJR0goY29zYSwgdGkxKQotCVZRRE1VTEguUzMyCQlRMTMsIFExLCBRNAkJCQkJCQkJQCBNVUxISUdIKHNpbmEsIHRyMSkKLQotCVZBREQuUzMyCQkJUTAsIFExMCwgUTExCQkJCQkJQCAqYnVmMCsrID0gTVVMSElHSChjb3NhLCB0cjEpICsgTVVMSElHSChzaW5hLCB0aTEpQAotCVZTVUIuUzMyCQkJUTEsIFExMiwgUTEzCQkJCQkJQCAqYnVmMCsrID0gTVVMSElHSChjb3NhLCB0aTEpIC0gTVVMSElHSChzaW5hLCB0cjEpQAotCi0JVlNUMi5JMzIJCQl7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdIQotCXN1YgkJCQkJCXIzLCByMywgIzMyCi0KLQlWUURNVUxILlMzMgkJUTEwLCBRMiwgUTkJCQkJCQkJCQkJQCBNVUxISUdIKGNvc2IsIHRyMikKLQlWUURNVUxILlMzMgkJUTExLCBRMywgUTUJCQkJCQkJCQkJQCBNVUxISUdIKHNpbmIsIHRpMikKLQlWUURNVUxILlMzMgkJUTEyLCBRMiwgUTUJCQkJCQkJCQkJQCBNVUxISUdIKGNvc2IsIHRpMikKLQlWUURNVUxILlMzMgkJUTEzLCBRMywgUTkJCQkJCQkJCQkJQCBNVUxISUdIKHNpbmIsIHRyMikKLQotCVZBREQuUzMyCQkJUTAsIFExMCwgUTExCQkJCQkJCQkJQCBNVUxISUdIKGNvc2EsIHRyMikgKyBNVUxISUdIKHNpbmEsIHRpMilACi0JVlNVQi5TMzIJCQlRMSwgUTEyLCBRMTMJCQkJCQkJCQlAIE1VTEhJR0goY29zYSwgdGkyKSAtIE1VTEhJR0goc2luYSwgdHIyKUAKLQotCVZSRVY2NC4zMgkJCVEzLCBRMQotCVZSRVY2NC4zMgkJCVEyLCBRMAotCi0JVlNUMi5JMzIJCXtkNSwgZDd9LCBbcjNdIQotCVZTVDIuSTMyCQl7ZDQsIGQ2fSwgW3IzXSEKLQotCXN1YnMgICAgIAkJcjEsIHIxLCAjNAotCXN1YgkJICAJCXIzLCByMywgIzY0Ci0JYm5lICAgICAgIAlQcmVNRENUX0xPT1AKLQotUHJlTURDVF9FTkQ6Ci0JZmxkbWZkZCAgIHNwISwge2Q4IC0gZDE1fQotCWxkbWlhICAgICBzcCEsIHtyNCAtIHIxMSwgcGN9Ci0JQEVORFAgIEAgfFByZU1EQ1R8Ci0JLmZuZW5kCi0KLQkuc2VjdGlvbiAudGV4dAotCS5nbG9iYWwJUG9zdE1EQ1QKLQkuZm5zdGFydAotCi1Qb3N0TURDVDoKLQlzdG1kYiAgICAgc3AhLCB7cjQgLSByMTEsIGxyfQotCS5zYXZlCSAge3I0IC0gcjExLCBscn0KLQlmc3RtZmRkICAgc3AhLCB7ZDggLSBkMTV9Ci0JLnZzYXZlCSAge2Q4IC0gZDE1fQotCi0JYWRkICAgICAgICAgcjksIHIwLCByMSwgbHNsICMyCi0Jc3ViICAgICAgICAgcjMsIHI5LCAjMzIKLQotCW1vdnMgICAgICAgIHIxLCByMSwgYXNyICMyCi0JYmVxICAgICAgICAgUG9zdE1EQ1RfRU5ECi0KLVBvc3RNRENUX0xPT1A6Ci0JVkxENC5JMzIJCQl7ZDAsIGQyLCBkNCwgZDZ9LCBbcjJdIQkJCQlAIGNvc2EgPSAqY3NwdHIrK0Agc2luYSA9ICpjc3B0cisrQAotCVZMRDQuSTMyCQkJe2QxLCBkMywgZDUsIGQ3fSwgW3IyXSEJCQkJQCBjb3NiID0gKmNzcHRyKytAIHNpbmIgPSAqY3NwdHIrK0AKLQlWTEQyLkkzMgkJCXtkOCwgZDksIGQxMCwgZDExfSwgW3IwXQkJCUAgdHIxID0gKih6YnVmMSArIDApQCB0aTEgPSAqKHpidWYxICsgMSlACi0JVkxEMi5JMzIJCQl7ZDEzLCBkMTV9LCBbcjNdIQkJCQkJCQlAIHRyMiA9ICooemJ1ZjIgLSAxKUAgdGkyID0gKih6YnVmMiArIDApQAotCVZMRDIuSTMyCQkJe2QxMiwgZDE0fSwgW3IzXSEJCQkJCQkJQCB0cjIgPSAqKHpidWYyIC0gMSlAIHRpMiA9ICooemJ1ZjIgKyAwKUAKLQotCVZSRVY2NC4zMgkJCVE4LCBRNgotCVZSRVY2NC4zMgkJCVE5LCBRNwotCi0JVlFETVVMSC5TMzIJCVExMCwgUTAsIFE0CQkJCQkJCQkJCUAgTVVMSElHSChjb3NhLCB0cjEpCi0JVlFETVVMSC5TMzIJCVExMSwgUTEsIFE1CQkJCQkJCQkJCUAgTVVMSElHSChzaW5hLCB0aTEpCi0JVlFETVVMSC5TMzIJCVExMiwgUTAsIFE1CQkJCQkJCQkJCUAgTVVMSElHSChjb3NhLCB0aTEpCi0JVlFETVVMSC5TMzIJCVExMywgUTEsIFE0CQkJCQkJCQkJCUAgTVVMSElHSChzaW5hLCB0cjEpCi0KLQlWQURELlMzMgkJCVEwLCBRMTAsIFExMQkJCQkJCQkJCUAgKmJ1ZjArKyA9IE1VTEhJR0goY29zYSwgdHIxKSArIE1VTEhJR0goc2luYSwgdGkxKUAKLQlWU1VCLlMzMgkJCVE1LCBRMTMsIFExMgkJCQkJCQkJCUAgKmJ1ZjEtLSA9IE1VTEhJR0goc2luYSwgdHIxKSAtIE1VTEhJR0goY29zYSwgdGkxKUAKLQotCVZRRE1VTEguUzMyCQlRMTAsIFEyLCBROAkJCQkJCQkJCQlAIE1VTEhJR0goY29zYiwgdHIyKQotCVZRRE1VTEguUzMyCQlRMTEsIFEzLCBROQkJCQkJCQkJCQlAIE1VTEhJR0goc2luYiwgdGkyKQotCVZRRE1VTEguUzMyCQlRMTIsIFEyLCBROQkJCQkJCQkJCQlAIE1VTEhJR0goY29zYiwgdGkyKQotCVZRRE1VTEguUzMyCQlRMTMsIFEzLCBROAkJCQkJCQkJCQlAIE1VTEhJR0goc2luYiwgdHIyKQotCi0JVkFERC5TMzIJCQlRNCwgUTEwLCBRMTEJCQkJCQkJCQlAICpidWYxLS0gPSBNVUxISUdIKGNvc2EsIHRyMikgKyBNVUxISUdIKHNpbmEsIHRpMilACi0JVlNVQi5TMzIJCQlRMSwgUTEzLCBRMTIJCQkJCQkJCQlAICpidWYwKysgPSBNVUxISUdIKHNpbmEsIHRyMikgLSBNVUxISUdIKGNvc2EsIHRpMilACi0KLQlWUkVWNjQuMzIJCQlRMiwgUTQKLQlWUkVWNjQuMzIJCQlRMywgUTUKLQotCXN1YgkJCQkJCXIzLCByMywgIzMyCi0JVlNUMi5JMzIJCQl7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdIQotCi0JVlNUMi5JMzIJCQl7ZDUsIGQ3fSwgW3IzXSEKLQlWU1QyLkkzMgkJCXtkNCwgZDZ9LCBbcjNdIQotCi0Jc3VicyAgICAgCQkJcjEsIHIxLCAjNAotCXN1YgkJICAJCQlyMywgcjMsICM2NAotCWJuZSAgICAgICAJUG9zdE1EQ1RfTE9PUAotCi1Qb3N0TURDVF9FTkQ6Ci0JZmxkbWZkZCAgIHNwISwge2Q4IC0gZDE1fQotCWxkbWlhICAgICBzcCEsIHtyNCAtIHIxMSwgcGN9Ci0KLQlARU5EUCAgCQlAIHxQb3N0TURDVHwKLQkuZm5lbmQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNy9SNFI4Rmlyc3RfdjcucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNy9SNFI4Rmlyc3RfdjcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNmYTZhOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjcvUjRSOEZpcnN0X3Y3LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotQC8qCi1AICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi1AICoqCi1AICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotQCAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi1AICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotQCAqKgotQCAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi1AICoqCi1AICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLUAgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLUAgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1AICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLUAgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi1AICovCi0KLUBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAKLUAJRmlsZToJCVI0UjhGaXJzdF92Ny5zCi1ACi1ACUNvbnRlbnQ6CVJhZGl4OEZpcnN0IGFuZCBSYWRpeDRGaXJzdCBmdW5jdGlvbiBhcm12NyBhc3NlbWJsZQotQAotQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAKLQotCS5zZWN0aW9uIC50ZXh0Ci0JLmdsb2JhbAlSYWRpeDhGaXJzdAotCS5mbnN0YXJ0Ci0KLVJhZGl4OEZpcnN0OgotCXN0bWRiICAgICAJCXNwISwge3I0IC0gcjExLCBscn0KLQkuc2F2ZQkgIAkJe3I0IC0gcjExLCBscn0KLQlmc3RtZmRkICAgCQlzcCEsIHtkOCAtIGQxNX0KLQkudnNhdmUJICAJCXtkOCAtIGQxNX0KLQotCWxkciAgICAgICAJCXIzLCBTUVJUMV8yCi0JY21wICAgICAgIAkJcjEsICMwCi0KLQlWRFVQLkkzMiAgCQlRMTUsIHIzCi0JYmVxICAgICAgIAkJUmFkaXg4Rmlyc3RfRU5ECi0KLVJhZGl4OEZpcnN0X0xPT1A6Ci0JVkxEMS5JMzIJCQl7ZDAsIGQxLCBkMiwgZDN9LAlbcjBdIQotCVZMRDEuSTMyCQkJe2Q4LCBkOSwgZDEwLCBkMTF9LAlbcjBdIQotCi0JVkFERC5TMzIJCQlkNCwgZDAsIGQxCQlAIHIwID0gYnVmWzBdICsgYnVmWzJdQGkwID0gYnVmWzFdICsgYnVmWzNdQAotCVZTVUIuUzMyCQkJZDUsIGQwLCBkMQkJQCByMSA9IGJ1ZlswXSAtIGJ1ZlsyXUBpMSA9IGJ1ZlsxXSAtIGJ1ZlszXUAKLQlWU1VCLlMzMgkJCWQ3LCBkMiwgZDMJCUAgcjIgPSBidWZbNF0gLSBidWZbNl1AaTIgPSBidWZbNV0gLSBidWZbN11ACi0JVkFERC5TMzIJCQlkNiwgZDIsIGQzCQlAIHIzID0gYnVmWzRdICsgYnVmWzZdQGkzID0gYnVmWzVdICsgYnVmWzddQAotCVZSRVY2NC5JMzIJCQlkNywgZDcKLQotCVZBREQuUzMyCQkJUTAsIFEyLCBRMwkJQCByNCA9IChyMCArIHIyKUBpNCA9IChpMCArIGkyKUBpNiA9IChpMSArIHIzKUByNyA9IChyMSArIGkzKQotCVZTVUIuUzMyCQkJUTEsIFEyLCBRMwkJQCByNSA9IChyMCAtIHIyKUBpNSA9IChpMCAtIGkyKUByNiA9IChyMSAtIGkzKUBpNyA9IChpMSAtIHIzKUAKLQotCVZSRVY2NC5JMzIJCQlkMywgZDMKLQotCVZBREQuUzMyCQkJZDQsIGQ4LCBkOQkJQCByMCA9IGJ1ZlsgOF0gKyBidWZbMTBdQGkwID0gYnVmWyA5XSArIGJ1ZlsxMV1ACi0JVlNVQi5TMzIJCQlkNywgZDEwLCBkMTEJQCByMSA9IGJ1ZlsxMl0gLSBidWZbMTRdQGkxID0gYnVmWzEzXSAtIGJ1ZlsxNV1ACi0JVkFERC5TMzIJCQlkNiwgZDEwLCBkMTEJQCByMiA9IGJ1ZlsxMl0gKyBidWZbMTRdQGkyID0gYnVmWzEzXSArIGJ1ZlsxNV1ACi0JVlJFVjY0LkkzMgkJCWQ3LCBkNwotCVZTVUIuUzMyCQkJZDUsIGQ4LCBkOQkJQCByMyA9IGJ1ZlsgOF0gLSBidWZbMTBdQGkzID0gYnVmWyA5XSAtIGJ1ZlsxMV1ACi0KLQlWVFJOLjMyCQkJCWQxLCBkMwotCi0JVkFERC5TMzIJCQlRNCwgUTIsIFEzCQlAIHQwID0gKHIwICsgcjIpID4+IDFAdDEgPSAoaTAgKyBpMikgPj4gMUBpMCA9IGkxICsgcjNAcjIgPSByMSArIGkzQAotCVZTVUIuUzMyCQkJUTUsIFEyLCBRMwkJQCB0MiA9IChyMCAtIHIyKSA+PiAxQHQzID0gKGkwIC0gaTIpID4+IDFAcjAgPSByMSAtIGkzQGkyID0gaTEgLSByM0AKLQotCVZSRVY2NC5JMzIJCQlkMywgZDMKLQotCVZTSFIuUzMyCQkJZDgsIGQ4LCAjMQotCVZTSFIuUzMyCQkJUTAsIFEwLCAjMQotCVZSRVY2NC5JMzIJCQlkMTAsIGQxMAotCVZUUk4uMzIJCQkJZDExLCBkOQotCVZTSFIuUzMyCQkJUTEsIFExLCAjMQotCVZTSFIuUzMyCQkJZDEwLCBkMTAsICMxCi0JVlJFVjY0LkkzMgkJCWQ5LCBkOQotCi0Jc3ViICAgICAgIAkJCXIwLCByMCwgIzB4NDAKLQotCVZBREQuUzMyCQkJZDEyLCBkMCwgZDgKLQlWU1VCLlMzMgkJCWQxNiwgZDAsIGQ4Ci0JVkFERC5TMzIJCQlkMTQsIGQyLCBkMTAKLQlWU1VCLlMzMgkJCWQxOCwgZDIsIGQxMAotCi0JVlNVQi5TMzIJCQlkNCwgZDExLCBkOQotCVZBREQuUzMyCQkJZDUsIGQxMSwgZDkKLQotCVZSRVY2NC5JMzIJCQlkMTgsIGQxOAotCi0JVlFETVVMSC5TMzIJCQlRMywgUTIsIFExNQotCVZUUk4uMzIJCQkJZDE0LCBkMTgKLQlWVFJOLjMyCQkJCWQ2LCBkNwotCVZSRVY2NC5JMzIJCQlkMTgsIGQxOAotCi0JVlNVQi5TMzIJCQlkMTUsIGQzLCBkNgotCVZSRVY2NC5JMzIJCQlkNywgZDcKLQlWQURELlMzMgkJCWQxOSwgZDMsIGQ2Ci0JVkFERC5TMzIJCQlkMTMsIGQxLCBkNwotCVZTVUIuUzMyCQkJZDE3LCBkMSwgZDcKLQotCVZSRVY2NC5JMzIJCQlkMTcsIGQxNwotCVZUUk4uMzIJCQkJZDEzLCBkMTcKLQlWUkVWNjQuSTMyCQkJZDE3LCBkMTcKLQotCXN1YnMgICAgICAgCQkJcjEsIHIxLCAjMQotCi0JVlNUMS5JMzIJCQl7ZDEyLCBkMTMsIGQxNCwgZDE1fSwgW3IwXSEKLQlWU1QxLkkzMgkJCXtkMTYsIGQxNywgZDE4LCBkMTl9LCBbcjBdIQotCWJuZSAgICAgICAJCQlSYWRpeDhGaXJzdF9MT09QCi0KLVJhZGl4OEZpcnN0X0VORDoKLQlmbGRtZmRkICAgc3AhLCB7ZDggLSBkMTV9Ci0JbGRtaWEgICAgIHNwISwge3I0IC0gcjExLCBwY30KLVNRUlQxXzI6Ci0JLndvcmQgICAgICAweDJkNDEzY2NkCi0KLQlARU5EUCAgQCB8UmFkaXg4Rmlyc3R8Ci0JLmZuZW5kCi0KLQkuc2VjdGlvbiAudGV4dAotCS5nbG9iYWwJUmFkaXg0Rmlyc3QKLQkuZm5zdGFydAotCi1SYWRpeDRGaXJzdDoKLQlzdG1kYiAgICAgCXNwISwge3I0IC0gcjExLCBscn0KLQkuc2F2ZQkgIAl7cjQgLSByMTEsIGxyfQotCWZzdG1mZGQgICAJc3AhLCB7ZDggLSBkMTV9Ci0JLnZzYXZlCSAgCXtkOCAtIGQxNX0KLQotCWNtcCAgICAgICAJcjEsICMwCi0JYmVxICAgICAgIAlSYWRpeDRGaXJzdF9FTkQKLQotUmFkaXg0Rmlyc3RfTE9PUDoKLQlWTEQxLkkzMgkJCXtkMCwgZDEsIGQyLCBkM30sIFtyMF0KLQotCVZBREQuUzMyCQkJZDQsIGQwLCBkMQkJCQkJCQlAIHIwID0gYnVmWzBdICsgYnVmWzJdQCByMSA9IGJ1ZlsxXSArIGJ1ZlszXUAKLQlWU1VCLlMzMgkJCWQ1LCBkMCwgZDEJCQkJCQkJQCByMiA9IGJ1ZlswXSAtIGJ1ZlsyXUAgcjMgPSBidWZbMV0gLSBidWZbM11ACi0JVlNVQi5TMzIJCQlkNywgZDIsIGQzCQkJCQkJCUAgcjQgPSBidWZbNF0gKyBidWZbNl1AIHI1ID0gYnVmWzVdICsgYnVmWzddQAotCVZBREQuUzMyCQkJZDYsIGQyLCBkMwkJCQkJCQlAIHI2ID0gYnVmWzRdIC0gYnVmWzZdQCByNyA9IGJ1Zls1XSAtIGJ1Zls3XUAKLQotCVZSRVY2NC5JMzIJCWQ3LCBkNwkJCQkJCQkJCUAKLQotCVZBREQuUzMyCQkJUTQsIFEyLCBRMwotCVZTVUIuUzMyCQkJUTUsIFEyLCBRMwotCi0JVlJFVjY0LkkzMgkJZDExLCBkMTEKLQlWVFJOLjMyCQkJCWQ5LCBkMTEKLQlzdWJzICAgICAgIAkJcjEsIHIxLCAjMQotCVZSRVY2NC5JMzIJCWQxMSwgZDExCi0JVlNUMS5JMzIJCQl7ZDgsIGQ5LCBkMTAsIGQxMX0sIFtyMF0hCi0KLQlibmUgICAgICAgCQlSYWRpeDRGaXJzdF9MT09QCi0KLVJhZGl4NEZpcnN0X0VORDoKLQlmbGRtZmRkICAgCQlzcCEsIHtkOCAtIGQxNX0KLQlsZG1pYSAgICAJCXNwISwge3I0IC0gcjExLCBwY30KLQotCUBFTkRQICBAIHxSYWRpeDRGaXJzdHwKLQkuZm5lbmQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNy9SYWRpeDRGRlRfdjcucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNy9SYWRpeDRGRlRfdjcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMxYmMzMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjcvUmFkaXg0RkZUX3Y3LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotQC8qCi1AICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi1AICoqCi1AICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotQCAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi1AICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotQCAqKgotQCAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi1AICoqCi1AICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLUAgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLUAgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1AICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLUAgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi1AICovCi0KLUBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAKLUAJRmlsZToJCVJhZGl4NEZGVF92Ny5zCi1ACi1ACUNvbnRlbnQ6CVJhZGl4NEZGVCBhcm12NyBhc3NlbWJsZQotQAotQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAKLQotCS5zZWN0aW9uIC50ZXh0Ci0JLmdsb2JhbAlSYWRpeDRGRlQKLQkuZm5zdGFydAotCi1SYWRpeDRGRlQ6Ci0Jc3RtZGIgICAgc3AhLCB7cjQgLSByMTEsIGxyfQotCS5zYXZlCSB7cjQgLSByMTEsIGxyfQotCWZzdG1mZGQgIHNwISwge2Q4IC0gZDE1fQotCS52c2F2ZQkge2Q4IC0gZDE1fQotCi0JbW92CQkJcjEsIHIxLCBhc3IgIzIKLQljbXAgICAgIAlyMSwgIzAKLQliZXEgICAgIAlSYWRpeDRGRlRfRU5ECi0KLVJhZGl4NEZGVF9MT09QMToKLQltb3YgICAgIAlyNSwgcjIsIGxzbCAjMQotCW1vdiAgICAgCXI4LCByMAotCW1vdiAgICAgCXI3LCByMQotCW1vdiAgICAgCXI1LCByNSwgbHNsICMyCi0JY21wICAgICAJcjEsICMwCi0JcnNiZXEgICAJcjEyLCByNSwgcjUsIGxzbCAjMgotCWJlcSAgICAgCVJhZGl4NEZGVF9MT09QMV9FTkQKLQotCXJzYiAgICAgCXIxMiwgcjUsIHI1LCBsc2wgIzIKLQotUmFkaXg0RkZUX0xPT1AyOgotCW1vdiAgICAgCXI2LCByMwotCW1vdiAgICAgCXI0LCByMgotCWNtcCAgICAgCXIyLCAjMAotCWJlcSAgICAgCVJhZGl4NEZGVF9MT09QMl9FTkQKLQotUmFkaXg0RkZUX0xPT1AzOgotCUByMCA9IHhwdHJbMF1ACi0JQHIxID0geHB0clsxXUAKLQlWTEQyLkkzMgkJCXtEMCwgRDEsIEQyLCBEM30sIFtyOF0KLQlWTEQyLkkzMgkJCXtEMjgsIEQyOSwgRDMwLCBEMzF9LCBbcjZdIQkJQCBjb3N4ID0gY3NwdHJbMF1AIHNpbnggPSBjc3B0clsxXUAKLQotCWFkZAkJCQkJcjgsIHI4LCByNQkJCQkJCQkJCQlAIHhwdHIgKz0gc3RlcEAKLQlWTEQyLkkzMgkJCXtENCwgRDUsIEQ2LEQ3fSwgW3I4XQkJCQkJQCByMiA9IHhwdHJbMF1AIHIzID0geHB0clsxXUAKLQotCVZRRE1VTEguUzMyCQlRMTAsIFEyLCBRMTQJCQkJCQkJCQlAIE1VTEhJR0goY29zeCwgdDApCi0JVlFETVVMSC5TMzIJCVExMSwgUTMsIFExNQkJCQkJCQkJCUAgTVVMSElHSChzaW54LCB0MSkKLQlWUURNVUxILlMzMgkJUTEyLCBRMywgUTE0CQkJCQkJCQkJQCBNVUxISUdIKGNvc3gsIHQxKQotCVZRRE1VTEguUzMyCQlRMTMsIFEyLCBRMTUJCQkJCQkJCQlAIE1VTEhJR0goc2lueCwgdDApCi0KLQlWQURELlMzMgkJCVEyLCBRMTAsIFExMQkJCQkJCQkJCUAgTVVMSElHSChjb3N4LCB0MCkgKyBNVUxISUdIKHNpbngsIHQxKQotCVZTVUIuUzMyCQkJUTMsIFExMiwgUTEzCQkJCQkJCQkJQCBNVUxISUdIKGNvc3gsIHQxKSAtIE1VTEhJR0goc2lueCwgdDApCi0KLQlhZGQJCQkJCXI4LCByOCwgcjUJCQkJCQkJCQkJQCB4cHRyICs9IHN0ZXBACi0JVlNIUi5TMzIJCQlRMTAsIFEwLCAjMgkJCQkJCQkJCQlAIHQwID0gcjAgPj4gMkAKLQlWU0hSLlMzMgkJCVExMSwgUTEsICMyCQkJCQkJCQkJCUAgdDEgPSByMSA+PiAyQAotCi0JVlNVQi5TMzIJCQlRMCwJUTEwLCBRMgkJCQkJCQkJCQlAIHIwID0gdDAgLSByMkAKLQlWU1VCLlMzMgkJCVExLAlRMTEsIFEzCQkJCQkJCQkJCUAgcjEgPSB0MSAtIHIzQAotCVZBREQuUzMyCQkJUTIsIFExMCwgUTIJCQkJCQkJCQkJQCByMiA9IHQwICsgcjJACi0JVkFERC5TMzIJCQlRMywgUTExLCBRMwkJCQkJCQkJCQlAIHIzID0gdDEgKyByM0AKLQotCVZMRDIuSTMyCQkJe0Q4LCBEOSwgRDEwLCBEMTF9LCBbcjhdCi0JVkxEMi5JMzIJCQl7RDI4LCBEMjksIEQzMCwgRDMxfSwgW3I2XSEKLQlhZGQJCQkJCQlyOCwgcjgsIHI1Ci0KLQlWUURNVUxILlMzMgkJUTEwLCBRNCwgUTE0CQkJCQkJCQkJQCBNVUxISUdIKGNvc3gsIHQwKQotCVZRRE1VTEguUzMyCQlRMTEsIFE1LCBRMTUJCQkJCQkJCQlAIE1VTEhJR0goc2lueCwgdDEpCi0JVlFETVVMSC5TMzIJCVExMiwgUTUsIFExNAkJCQkJCQkJCUAgTVVMSElHSChjb3N4LCB0MSkKLQlWUURNVUxILlMzMgkJUTEzLCBRNCwgUTE1CQkJCQkJCQkJQCBNVUxISUdIKHNpbngsIHQwKQotCi0JVkFERC5TMzIJCQlROCwgUTEwLCBRMTEJCQkJCQkJCQlAIE1VTEhJR0goY29zeCwgdDApICsgTVVMSElHSChzaW54LCB0MSkKLQlWU1VCLlMzMgkJCVE5LCBRMTIsIFExMwkJCQkJCQkJCUAgTVVMSElHSChjb3N4LCB0MSkgLSBNVUxISUdIKHNpbngsIHQwKQotCi0JVkxEMi5JMzIJCXtEMTIsIEQxMywgRDE0LCBEMTV9LCBbcjhdCi0JVkxEMi5JMzIJCXtEMjgsIEQyOSwgRDMwLCBEMzF9LCBbcjZdIQotCi0JVlFETVVMSC5TMzIJCVExMCwgUTYsIFExNAkJCQkJCQkJCUAgTVVMSElHSChjb3N4LCB0MCkKLQlWUURNVUxILlMzMgkJUTExLCBRNywgUTE1CQkJCQkJCQkJQCBNVUxISUdIKHNpbngsIHQxKQotCVZRRE1VTEguUzMyCQlRMTIsIFE3LCBRMTQJCQkJCQkJCQlAIE1VTEhJR0goY29zeCwgdDEpCi0JVlFETVVMSC5TMzIJCVExMywgUTYsIFExNQkJCQkJCQkJCUAgTVVMSElHSChzaW54LCB0MCkKLQotCVZBREQuUzMyCQkJUTYsIFExMCwgUTExCQkJCQkJCQkJQCBNVUxISUdIKGNvc3gsIHQwKSArIE1VTEhJR0goc2lueCwgdDEpCi0JVlNVQi5TMzIJCQlRNywgUTEyLCBRMTMJCQkJCQkJCQlAIE1VTEhJR0goY29zeCwgdDEpIC0gTVVMSElHSChzaW54LCB0MCkKLQotCVZBREQuUzMyCQkJUTQsIFE4LCBRNgkJCQkJCQkJCQlAIHI0ID0gdDAgKyByNkAKLQlWU1VCLlMzMgkJCVE1LCBRNywgUTkJCQkJCQkJCQkJQCByNSA9IHI3IC0gdDFACi0JVlNVQi5TMzIJCQlRNiwgUTgsIFE2CQkJCQkJCQkJCUAgcjYgPSB0MCAtIHI2QAotCVZBREQuUzMyCQkJUTcsIFE3LCBROQkJCQkJCQkJCQlAIHI3ID0gcjcgKyB0MUAKLQotCVZBREQuUzMyCQkJUTgsIFEwLCBRNQkJCQkJCQkJCQlAIHhwdHJbMF0gPSByMCArIHI1QAotCVZBREQuUzMyCQkJUTksIFExLCBRNgkJCQkJCQkJCQlAIHhwdHJbMV0gPSByMSArIHI2QAotCVZTVDIuSTMyCQkJe0QxNiwgRDE3LCBEMTgsIEQxOX0sIFtyOF0KLQotCVZTVUIuUzMyCQkJUTEwLCBRMiwgUTQJCQkJCQkJCQkJQCB4cHRyWzBdID0gcjIgLSByNEAKLQlzdWIJCQkJCXI4LCByOCwgcjUJCQkJCQkJCQkJQCB4cHRyIC09IHN0ZXBACi0JVlNVQi5TMzIJCQlRMTEsIFEzLCBRNwkJCQkJCQkJCQlAIHhwdHJbMV0gPSByMyAtIHI3QAotCVZTVDIuSTMyCQkJe0QyMCwgRDIxLCBEMjIsIEQyM30sIFtyOF0KLQotCVZTVUIuUzMyCQkJUTgsIFEwLCBRNQkJCQkJCQkJCQlAIHhwdHJbMF0gPSByMCAtIHI1QAotCXN1YgkJCQkJcjgsIHI4LCByNQkJCQkJCQkJCQlAIHhwdHIgLT0gc3RlcEAKLQlWU1VCLlMzMgkJCVE5LCBRMSwgUTYJCQkJCQkJCQkJQCB4cHRyWzFdID0gcjEgLSByNkAKLQlWU1QyLkkzMgkJCXtEMTYsIEQxNywgRDE4LCBEMTl9LCBbcjhdCi0KLQlWQURELlMzMgkJCVExMCwgUTIsIFE0CQkJCQkJCQkJCUAgeHB0clswXSA9IHIyICsgcjRACi0Jc3ViCQkJCQlyOCwgcjgsIHI1CQkJCQkJCQkJCUAgeHB0ciAtPSBzdGVwQAotCVZBREQuUzMyCQkJUTExLCBRMywgUTcJCQkJCQkJCQkJQCB4cHRyWzFdID0gcjMgKyByN0AKLQlWU1QyLkkzMgkJCXtEMjAsIEQyMSwgRDIyLCBEMjN9LCBbcjhdIQotCi0Jc3VicyAgICAJCQlyNCwgcjQsICM0Ci0JYm5lICAgICAJCQlSYWRpeDRGRlRfTE9PUDMKLQotUmFkaXg0RkZUX0xPT1AyX0VORDoKLQlhZGQgICAgIAkJCXI4LCByOCwgcjEyCi0Jc3ViICAgIAkJCQlyNywgcjcsICMxCi0JY21wCQkJCQlyNywgIzAKLQliaGkgICAgIAkJCVJhZGl4NEZGVF9MT09QMgotCi1SYWRpeDRGRlRfTE9PUDFfRU5EOgotCWFkZCAgICAgCQkJcjMsIHIxMiwgcjMKLQltb3YgICAgIAkJCXIyLCByMiwgbHNsICMyCi0JbW92cyAgICAJCQlyMSwgcjEsIGFzciAjMgotCWJuZSAgICAgCQkJUmFkaXg0RkZUX0xPT1AxCi0KLVJhZGl4NEZGVF9FTkQ6Ci0JZmxkbWZkZCAgIAkJCXNwISwge2Q4IC0gZDE1fQotCWxkbWlhICAgCQkJc3AhLCB7cjQgLSByMTEsIHBjfQotCi0JQEVORFAgIEAgfFJhZGl4NEZGVHwKLQkuZm5lbmQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2JhbmRfbnJnLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9iYW5kX25yZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDAzNGI4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2JhbmRfbnJnLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQliYW5kX25yZy5jCi0KLQlDb250ZW50OglCYW5kL0xpbmUgZW5lcmd5IGNhbGN1bGF0aW9ucyBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImJhc2ljX29wLmgiCi0jaW5jbHVkZSAiYmFuZF9ucmcuaCIKLQotI2lmbmRlZiBBUk1WNUUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBDYWxjQmFuZEVuZXJneQotKiBkZXNjcmlwdGlvbjogICBDYWxjIHNmYi1iYW5kd2lzZSBtZGN0LWVuZXJnaWVzIGZvciBsZWZ0IGFuZCByaWdodCBjaGFubmVsCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBDYWxjQmFuZEVuZXJneShjb25zdCBXb3JkMzIgKm1kY3RTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICpiYW5kT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgIG51bUJhbmRzLAotICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKmJhbmRFbmVyZ3ksCi0gICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqYmFuZEVuZXJneVN1bSkKLXsKLSAgV29yZDMyIGksIGo7Ci0gIFdvcmQzMiBhY2N1U3VtID0gMDsKLQotICBmb3IgKGk9MDsgaTxudW1CYW5kczsgaSsrKSB7Ci0gICAgV29yZDMyIGFjY3UgPSAwOwotICAgIGZvciAoaj1iYW5kT2Zmc2V0W2ldOyBqPGJhbmRPZmZzZXRbaSsxXTsgaisrKQotICAgICAgYWNjdSA9IExfYWRkKGFjY3UsIE1VTEhJR0gobWRjdFNwZWN0cnVtW2pdLCBtZGN0U3BlY3RydW1bal0pKTsKLQotCWFjY3UgPSBMX2FkZChhY2N1LCBhY2N1KTsKLSAgICBhY2N1U3VtID0gTF9hZGQoYWNjdVN1bSwgYWNjdSk7Ci0gICAgYmFuZEVuZXJneVtpXSA9IGFjY3U7Ci0gIH0KLSAgKmJhbmRFbmVyZ3lTdW0gPSBhY2N1U3VtOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogQ2FsY0JhbmRFbmVyZ3lNUwotKiBkZXNjcmlwdGlvbjogICBDYWxjIHNmYi1iYW5kd2lzZSBtZGN0LWVuZXJnaWVzIGZvciBsZWZ0IGFkZCBvciBtaW51cyByaWdodCBjaGFubmVsCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBDYWxjQmFuZEVuZXJneU1TKGNvbnN0IFdvcmQzMiAqbWRjdFNwZWN0cnVtTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMzIgKm1kY3RTcGVjdHJ1bVJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAqYmFuZE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgIG51bUJhbmRzLAotICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqYmFuZEVuZXJneU1pZCwKLSAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKmJhbmRFbmVyZ3lNaWRTdW0sCi0gICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICpiYW5kRW5lcmd5U2lkZSwKLSAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKmJhbmRFbmVyZ3lTaWRlU3VtKQotewotCi0gIFdvcmQzMiBpLCBqOwotICBXb3JkMzIgYWNjdU1pZFN1bSA9IDA7Ci0gIFdvcmQzMiBhY2N1U2lkZVN1bSA9IDA7Ci0KLQotICBmb3IoaT0wOyBpPG51bUJhbmRzOyBpKyspIHsKLSAgICBXb3JkMzIgYWNjdU1pZCA9IDA7Ci0gICAgV29yZDMyIGFjY3VTaWRlID0gMDsKLSAgICBmb3IgKGo9YmFuZE9mZnNldFtpXTsgajxiYW5kT2Zmc2V0W2krMV07IGorKykgewotICAgICAgV29yZDMyIHNwZWNtLCBzcGVjczsKLSAgICAgIFdvcmQzMiBsLCByOwotCi0gICAgICBsID0gbWRjdFNwZWN0cnVtTGVmdFtqXSA+PiAxOwotICAgICAgciA9IG1kY3RTcGVjdHJ1bVJpZ2h0W2pdID4+IDE7Ci0gICAgICBzcGVjbSA9IGwgKyByOwotICAgICAgc3BlY3MgPSBsIC0gcjsKLSAgICAgIGFjY3VNaWQgPSBMX2FkZChhY2N1TWlkLCBNVUxISUdIKHNwZWNtLCBzcGVjbSkpOwotICAgICAgYWNjdVNpZGUgPSBMX2FkZChhY2N1U2lkZSwgTVVMSElHSChzcGVjcywgc3BlY3MpKTsKLSAgICB9Ci0KLQlhY2N1TWlkID0gTF9hZGQoYWNjdU1pZCwgYWNjdU1pZCk7Ci0JYWNjdVNpZGUgPSBMX2FkZChhY2N1U2lkZSwgYWNjdVNpZGUpOwotCWJhbmRFbmVyZ3lNaWRbaV0gPSBhY2N1TWlkOwotICAgIGFjY3VNaWRTdW0gPSBMX2FkZChhY2N1TWlkU3VtLCBhY2N1TWlkKTsKLSAgICBiYW5kRW5lcmd5U2lkZVtpXSA9IGFjY3VTaWRlOwotICAgIGFjY3VTaWRlU3VtID0gTF9hZGQoYWNjdVNpZGVTdW0sIGFjY3VTaWRlKTsKLQotICB9Ci0gICpiYW5kRW5lcmd5TWlkU3VtID0gYWNjdU1pZFN1bTsKLSAgKmJhbmRFbmVyZ3lTaWRlU3VtID0gYWNjdVNpZGVTdW07Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYml0X2NudC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYml0X2NudC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWIwMzVlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2JpdF9jbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDg4NSArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCWJpdF9jbnQuYwotCi0JQ29udGVudDoJSHVmZm1hbiBCaXRjb3VudGVyICYgY29kZXIgZnVuY3Rpb25zCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJiaXRfY250LmgiCi0jaW5jbHVkZSAiYWFjX3JvbS5oIgotCi0jZGVmaW5lIEhJX0xUQUIoYSkgKChhKT4+OCkKLSNkZWZpbmUgTE9fTFRBQihhKSAoKGEpICYgMHhmZikKLQotI2RlZmluZSBFWFBBTkQoYSkgICgoKChXb3JkMzIpKChhKSYweGZmMDApKSA8PCA4KXwoV29yZDMyKSgoYSkmMHhmZikpCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGNvdW50MV8yXzNfNF81XzZfN184XzlfMTBfMTEKLSogZGVzY3JpcHRpb246ICBjb3VudHMgdGFibGVzIDEtMTEKLSogcmV0dXJuczoKLSogaW5wdXQ6ICAgICAgICBxdWFudGl6ZWQgc3BlY3RydW0KLSogb3V0cHV0OiAgICAgICBiaXRDb3VudCBmb3IgdGFibGVzIDEtMTEKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCBjb3VudDFfMl8zXzRfNV82XzdfOF85XzEwXzExKGNvbnN0IFdvcmQxNiAqdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgKmJpdENvdW50KQotewotICBXb3JkMzIgdDAsdDEsdDIsdDMsaTsKLSAgV29yZDMyIGJjMV8yLGJjM180LGJjNV82LGJjN184LGJjOV8xMDsKLSAgV29yZDE2IGJjMTEsc2M7Ci0KLSAgYmMxXzI9MDsKLSAgYmMzXzQ9MDsKLSAgYmM1XzY9MDsKLSAgYmM3Xzg9MDsKLSAgYmM5XzEwPTA7Ci0gIGJjMTE9MDsKLSAgc2M9MDsKLQotICBmb3IoaT0wO2k8d2lkdGg7aSs9NCl7Ci0KLSAgICB0MD0gdmFsdWVzW2krMF07Ci0gICAgdDE9IHZhbHVlc1tpKzFdOwotICAgIHQyPSB2YWx1ZXNbaSsyXTsKLSAgICB0Mz0gdmFsdWVzW2krM107Ci0KLSAgICAvKiAxLDIgKi8KLQotICAgIGJjMV8yID0gYmMxXzIgKyBFWFBBTkQoaHVmZl9sdGFiMV8yW3QwKzFdW3QxKzFdW3QyKzFdW3QzKzFdKTsKLQotICAgIC8qIDUsNiAqLwotICAgIGJjNV82ID0gYmM1XzYgKyBFWFBBTkQoaHVmZl9sdGFiNV82W3QwKzRdW3QxKzRdKTsKLSAgICBiYzVfNiA9IGJjNV82ICsgRVhQQU5EKGh1ZmZfbHRhYjVfNlt0Mis0XVt0Mys0XSk7Ci0KLSAgICB0MD1BQlModDApOwotICAgIHQxPUFCUyh0MSk7Ci0gICAgdDI9QUJTKHQyKTsKLSAgICB0Mz1BQlModDMpOwotCi0KLSAgICBiYzNfNCA9IGJjM180ICsgRVhQQU5EKGh1ZmZfbHRhYjNfNFt0MF1bdDFdW3QyXVt0M10pOwotCi0gICAgYmM3XzggPSBiYzdfOCArIEVYUEFORChodWZmX2x0YWI3XzhbdDBdW3QxXSk7Ci0gICAgYmM3XzggPSBiYzdfOCArIEVYUEFORChodWZmX2x0YWI3XzhbdDJdW3QzXSk7Ci0KLSAgICBiYzlfMTAgPSBiYzlfMTAgKyBFWFBBTkQoaHVmZl9sdGFiOV8xMFt0MF1bdDFdKTsKLSAgICBiYzlfMTAgPSBiYzlfMTAgKyBFWFBBTkQoaHVmZl9sdGFiOV8xMFt0Ml1bdDNdKTsKLQotICAgIGJjMTEgPSBiYzExICsgaHVmZl9sdGFiMTFbdDBdW3QxXTsKLSAgICBiYzExID0gYmMxMSArIGh1ZmZfbHRhYjExW3QyXVt0M107Ci0KLQotICAgIHNjID0gc2MgKyAodDA+MCkgKyAodDE+MCkgKyAodDI+MCkgKyAodDM+MCk7Ci0gIH0KLQotICBiaXRDb3VudFsxXT1leHRyYWN0X2goYmMxXzIpOwotICBiaXRDb3VudFsyXT1leHRyYWN0X2woYmMxXzIpOwotICBiaXRDb3VudFszXT1leHRyYWN0X2goYmMzXzQpICsgc2M7Ci0gIGJpdENvdW50WzRdPWV4dHJhY3RfbChiYzNfNCkgKyBzYzsKLSAgYml0Q291bnRbNV09ZXh0cmFjdF9oKGJjNV82KTsKLSAgYml0Q291bnRbNl09ZXh0cmFjdF9sKGJjNV82KTsKLSAgYml0Q291bnRbN109ZXh0cmFjdF9oKGJjN184KSArIHNjOwotICBiaXRDb3VudFs4XT1leHRyYWN0X2woYmM3XzgpICsgc2M7Ci0gIGJpdENvdW50WzldPWV4dHJhY3RfaChiYzlfMTApICsgc2M7Ci0gIGJpdENvdW50WzEwXT1leHRyYWN0X2woYmM5XzEwKSArIHNjOwotICBiaXRDb3VudFsxMV09YmMxMSArIHNjOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBjb3VudDNfNF81XzZfN184XzlfMTBfMTEKLSogZGVzY3JpcHRpb246ICBjb3VudHMgdGFibGVzIDMtMTEKLSogcmV0dXJuczoKLSogaW5wdXQ6ICAgICAgICBxdWFudGl6ZWQgc3BlY3RydW0KLSogb3V0cHV0OiAgICAgICBiaXRDb3VudCBmb3IgdGFibGVzIDMtMTEKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCBjb3VudDNfNF81XzZfN184XzlfMTBfMTEoY29uc3QgV29yZDE2ICp2YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgKmJpdENvdW50KQotewotICBXb3JkMzIgdDAsdDEsdDIsdDMsIGk7Ci0gIFdvcmQzMiBiYzNfNCxiYzVfNixiYzdfOCxiYzlfMTA7Ci0gIFdvcmQxNiBiYzExLHNjOwotCi0gIGJjM180PTA7Ci0gIGJjNV82PTA7Ci0gIGJjN184PTA7Ci0gIGJjOV8xMD0wOwotICBiYzExPTA7Ci0gIHNjPTA7Ci0KLSAgZm9yKGk9MDtpPHdpZHRoO2krPTQpewotCi0gICAgdDA9IHZhbHVlc1tpKzBdOwotICAgIHQxPSB2YWx1ZXNbaSsxXTsKLSAgICB0Mj0gdmFsdWVzW2krMl07Ci0gICAgdDM9IHZhbHVlc1tpKzNdOwotCi0gICAgLyoKLSAgICAgIDUsNgotICAgICovCi0gICAgYmM1XzYgPSBiYzVfNiArIEVYUEFORChodWZmX2x0YWI1XzZbdDArNF1bdDErNF0pOwotICAgIGJjNV82ID0gYmM1XzYgKyBFWFBBTkQoaHVmZl9sdGFiNV82W3QyKzRdW3QzKzRdKTsKLQotICAgIHQwPUFCUyh0MCk7Ci0gICAgdDE9QUJTKHQxKTsKLSAgICB0Mj1BQlModDIpOwotICAgIHQzPUFCUyh0Myk7Ci0KLQotICAgIGJjM180ID0gYmMzXzQgKyBFWFBBTkQoaHVmZl9sdGFiM180W3QwXVt0MV1bdDJdW3QzXSk7Ci0KLSAgICBiYzdfOCA9IGJjN184ICsgRVhQQU5EKGh1ZmZfbHRhYjdfOFt0MF1bdDFdKTsKLSAgICBiYzdfOCA9IGJjN184ICsgRVhQQU5EKGh1ZmZfbHRhYjdfOFt0Ml1bdDNdKTsKLQotICAgIGJjOV8xMCA9IGJjOV8xMCArIEVYUEFORChodWZmX2x0YWI5XzEwW3QwXVt0MV0pOwotICAgIGJjOV8xMCA9IGJjOV8xMCArIEVYUEFORChodWZmX2x0YWI5XzEwW3QyXVt0M10pOwotCi0gICAgYmMxMSA9IGJjMTEgKyBodWZmX2x0YWIxMVt0MF1bdDFdOwotICAgIGJjMTEgPSBiYzExICsgaHVmZl9sdGFiMTFbdDJdW3QzXTsKLQotCi0gICAgc2MgPSBzYyArICh0MD4wKSArICh0MT4wKSArICh0Mj4wKSArICh0Mz4wKTsKLSAgfQotCi0gIGJpdENvdW50WzFdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzJdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzNdPWV4dHJhY3RfaChiYzNfNCkgKyBzYzsKLSAgYml0Q291bnRbNF09ZXh0cmFjdF9sKGJjM180KSArIHNjOwotICBiaXRDb3VudFs1XT1leHRyYWN0X2goYmM1XzYpOwotICBiaXRDb3VudFs2XT1leHRyYWN0X2woYmM1XzYpOwotICBiaXRDb3VudFs3XT1leHRyYWN0X2goYmM3XzgpICsgc2M7Ci0gIGJpdENvdW50WzhdPWV4dHJhY3RfbChiYzdfOCkgKyBzYzsKLSAgYml0Q291bnRbOV09ZXh0cmFjdF9oKGJjOV8xMCkgKyBzYzsKLSAgYml0Q291bnRbMTBdPWV4dHJhY3RfbChiYzlfMTApICsgc2M7Ci0gIGJpdENvdW50WzExXT1iYzExICsgc2M7Ci0KLX0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBjb3VudDVfNl83XzhfOV8xMF8xMQotKiBkZXNjcmlwdGlvbjogIGNvdW50cyB0YWJsZXMgNS0xMQotKiByZXR1cm5zOgotKiBpbnB1dDogICAgICAgIHF1YW50aXplZCBzcGVjdHJ1bQotKiBvdXRwdXQ6ICAgICAgIGJpdENvdW50IGZvciB0YWJsZXMgNS0xMQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBjb3VudDVfNl83XzhfOV8xMF8xMShjb25zdCBXb3JkMTYgKnZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgKmJpdENvdW50KQotewotCi0gIFdvcmQzMiB0MCx0MSxpOwotICBXb3JkMzIgYmM1XzYsYmM3XzgsYmM5XzEwOwotICBXb3JkMTYgYmMxMSxzYzsKLQotICBiYzVfNj0wOwotICBiYzdfOD0wOwotICBiYzlfMTA9MDsKLSAgYmMxMT0wOwotICBzYz0wOwotCi0gIGZvcihpPTA7aTx3aWR0aDtpKz0yKXsKLQotICAgIHQwID0gdmFsdWVzW2krMF07Ci0gICAgdDEgPSB2YWx1ZXNbaSsxXTsKLQotICAgIGJjNV82ID0gYmM1XzYgKyBFWFBBTkQoaHVmZl9sdGFiNV82W3QwKzRdW3QxKzRdKTsKLQotICAgIHQwPUFCUyh0MCk7Ci0gICAgdDE9QUJTKHQxKTsKLQotICAgIGJjN184ID0gYmM3XzggKyBFWFBBTkQoaHVmZl9sdGFiN184W3QwXVt0MV0pOwotICAgIGJjOV8xMCA9IGJjOV8xMCArIEVYUEFORChodWZmX2x0YWI5XzEwW3QwXVt0MV0pOwotICAgIGJjMTEgPSBiYzExICsgaHVmZl9sdGFiMTFbdDBdW3QxXTsKLQotCi0gICAgc2MgPSBzYyArICh0MD4wKSArICh0MT4wKTsKLSAgfQotICBiaXRDb3VudFsxXT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFsyXT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFszXT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFs0XT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFs1XT1leHRyYWN0X2goYmM1XzYpOwotICBiaXRDb3VudFs2XT1leHRyYWN0X2woYmM1XzYpOwotICBiaXRDb3VudFs3XT1leHRyYWN0X2goYmM3XzgpICsgc2M7Ci0gIGJpdENvdW50WzhdPWV4dHJhY3RfbChiYzdfOCkgKyBzYzsKLSAgYml0Q291bnRbOV09ZXh0cmFjdF9oKGJjOV8xMCkgKyBzYzsKLSAgYml0Q291bnRbMTBdPWV4dHJhY3RfbChiYzlfMTApICsgc2M7Ci0gIGJpdENvdW50WzExXT1iYzExICsgc2M7Ci0KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogY291bnQ3XzhfOV8xMF8xMQotKiBkZXNjcmlwdGlvbjogIGNvdW50cyB0YWJsZXMgNy0xMQotKiByZXR1cm5zOgotKiBpbnB1dDogICAgICAgIHF1YW50aXplZCBzcGVjdHJ1bQotKiBvdXRwdXQ6ICAgICAgIGJpdENvdW50IGZvciB0YWJsZXMgNy0xMQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkIGNvdW50N184XzlfMTBfMTEoY29uc3QgV29yZDE2ICp2YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAqYml0Q291bnQpCi17Ci0gIFdvcmQzMiB0MCx0MSwgaTsKLSAgV29yZDMyIGJjN184LGJjOV8xMDsKLSAgV29yZDE2IGJjMTEsc2M7Ci0KLSAgYmM3Xzg9MDsKLSAgYmM5XzEwPTA7Ci0gIGJjMTE9MDsKLSAgc2M9MDsKLQotICBmb3IoaT0wO2k8d2lkdGg7aSs9Mil7Ci0KLSAgICB0MD1BQlModmFsdWVzW2krMF0pOwotICAgIHQxPUFCUyh2YWx1ZXNbaSsxXSk7Ci0KLSAgICBiYzdfOCA9IGJjN184ICsgRVhQQU5EKGh1ZmZfbHRhYjdfOFt0MF1bdDFdKTsKLSAgICBiYzlfMTAgPSBiYzlfMTAgKyBFWFBBTkQoaHVmZl9sdGFiOV8xMFt0MF1bdDFdKTsKLSAgICBiYzExID0gYmMxMSArIGh1ZmZfbHRhYjExW3QwXVt0MV07Ci0KLQotICAgIHNjID0gc2MgKyAodDA+MCkgKyAodDE+MCk7Ci0gIH0KLSAgYml0Q291bnRbMV09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbMl09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbM109SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbNF09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbNV09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbNl09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbN109ZXh0cmFjdF9oKGJjN184KSArIHNjOwotICBiaXRDb3VudFs4XT1leHRyYWN0X2woYmM3XzgpICsgc2M7Ci0gIGJpdENvdW50WzldPWV4dHJhY3RfaChiYzlfMTApICsgc2M7Ci0gIGJpdENvdW50WzEwXT1leHRyYWN0X2woYmM5XzEwKSArIHNjOwotICBiaXRDb3VudFsxMV09YmMxMSArIHNjOwotCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBjb3VudDlfMTBfMTEKLSogZGVzY3JpcHRpb246ICBjb3VudHMgdGFibGVzIDktMTEKLSogcmV0dXJuczoKLSogaW5wdXQ6ICAgICAgICBxdWFudGl6ZWQgc3BlY3RydW0KLSogb3V0cHV0OiAgICAgICBiaXRDb3VudCBmb3IgdGFibGVzIDktMTEKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgY291bnQ5XzEwXzExKGNvbnN0IFdvcmQxNiAqdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICpiaXRDb3VudCkKLXsKLQotICBXb3JkMzIgdDAsdDEsaTsKLSAgV29yZDMyIGJjOV8xMDsKLSAgV29yZDE2IGJjMTEsc2M7Ci0KLSAgYmM5XzEwPTA7Ci0gIGJjMTE9MDsKLSAgc2M9MDsKLQotICBmb3IoaT0wO2k8d2lkdGg7aSs9Mil7Ci0KLSAgICB0MD1BQlModmFsdWVzW2krMF0pOwotICAgIHQxPUFCUyh2YWx1ZXNbaSsxXSk7Ci0KLQotICAgIGJjOV8xMCArPSBFWFBBTkQoaHVmZl9sdGFiOV8xMFt0MF1bdDFdKTsKLSAgICBiYzExID0gYmMxMSArIGh1ZmZfbHRhYjExW3QwXVt0MV07Ci0KLQotICAgIHNjID0gc2MgKyAodDA+MCkgKyAodDE+MCk7Ci0gIH0KLSAgYml0Q291bnRbMV09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbMl09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbM109SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbNF09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbNV09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbNl09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbN109SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbOF09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbOV09ZXh0cmFjdF9oKGJjOV8xMCkgKyBzYzsKLSAgYml0Q291bnRbMTBdPWV4dHJhY3RfbChiYzlfMTApICsgc2M7Ci0gIGJpdENvdW50WzExXT1iYzExICsgc2M7Ci0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGNvdW50MTEKLSogZGVzY3JpcHRpb246ICBjb3VudHMgdGFibGUgMTEKLSogcmV0dXJuczoKLSogaW5wdXQ6ICAgICAgICBxdWFudGl6ZWQgc3BlY3RydW0KLSogb3V0cHV0OiAgICAgICBiaXRDb3VudCBmb3IgdGFibGUgMTEKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIHN0YXRpYyB2b2lkIGNvdW50MTEoY29uc3QgV29yZDE2ICp2YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgKmJpdENvdW50KQotewotICBXb3JkMzIgdDAsdDEsaTsKLSAgV29yZDE2IGJjMTEsc2M7Ci0KLSAgYmMxMT0wOwotICBzYz0wOwotICBmb3IoaT0wO2k8d2lkdGg7aSs9Mil7Ci0gICAgdDA9QUJTKHZhbHVlc1tpKzBdKTsKLSAgICB0MT1BQlModmFsdWVzW2krMV0pOwotICAgIGJjMTEgPSBiYzExICsgaHVmZl9sdGFiMTFbdDBdW3QxXTsKLQotCi0gICAgc2MgPSBzYyArICh0MD4wKSArICh0MT4wKTsKLSAgfQotCi0gIGJpdENvdW50WzFdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzJdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzNdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzRdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzVdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzZdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzddPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzhdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzldPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzEwXT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFsxMV09YmMxMSArIHNjOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogY291bnRFc2MKLSogZGVzY3JpcHRpb246ICBjb3VudHMgdGFibGUgMTEgKHdpdGggRXNjKQotKiByZXR1cm5zOgotKiBpbnB1dDogICAgICAgIHF1YW50aXplZCBzcGVjdHJ1bQotKiBvdXRwdXQ6ICAgICAgIGJpdENvdW50IGZvciB0YWJsZXMgMTEgKHdpdGggRXNjKQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkIGNvdW50RXNjKGNvbnN0IFdvcmQxNiAqdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAqYml0Q291bnQpCi17Ci0gIFdvcmQzMiB0MCx0MSx0MDAsdDAxLGk7Ci0gIFdvcmQxNiBiYzExLGVjLHNjOwotCi0gIGJjMTE9MDsKLSAgc2M9MDsKLSAgZWM9MDsKLSAgZm9yKGk9MDtpPHdpZHRoO2krPTIpewotICAgIHQwPUFCUyh2YWx1ZXNbaSswXSk7Ci0gICAgdDE9QUJTKHZhbHVlc1tpKzFdKTsKLQotCi0gICAgc2MgPSBzYyArICh0MD4wKSArICh0MT4wKTsKLQotICAgIHQwMCA9IG1pbih0MCwxNik7Ci0gICAgdDAxID0gbWluKHQxLDE2KTsKLSAgICBiYzExID0gYmMxMSArIGh1ZmZfbHRhYjExW3QwMF1bdDAxXTsKLQotCi0gICAgaWYodDAgPj0gMTYpewotICAgICAgZWMgPSBlYyArIDU7Ci0gICAgICB3aGlsZShzdWIodDA9KHQwID4+IDEpLCAxNikgPj0gMCkgewotICAgICAgICBlYyA9IGVjICsgMjsKLSAgICAgIH0KLSAgICB9Ci0KLQotICAgIGlmKHQxID49IDE2KXsKLSAgICAgIGVjID0gZWMgKyA1OwotICAgICAgd2hpbGUoc3ViKHQxPSh0MSA+PiAxKSwgMTYpID49IDApIHsKLSAgICAgICAgZWMgPSBlYyArIDI7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGJpdENvdW50WzFdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzJdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzNdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzRdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzVdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzZdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzddPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzhdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzldPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzEwXT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFsxMV09YmMxMSArIHNjICsgZWM7Ci19Ci0KLQotdHlwZWRlZiB2b2lkICgqQ09VTlRfRlVOQ1RJT04pKGNvbnN0IFdvcmQxNiAqdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICpiaXRDb3VudCk7Ci0KLXN0YXRpYyBDT1VOVF9GVU5DVElPTiBjb3VudEZ1bmNUYWJsZVtDT0RFX0JPT0tfRVNDX0xBVisxXSA9Ci0gIHsKLQotICAgIGNvdW50MV8yXzNfNF81XzZfN184XzlfMTBfMTEsICAvKiAwICAqLwotICAgIGNvdW50MV8yXzNfNF81XzZfN184XzlfMTBfMTEsICAvKiAxICAqLwotICAgIGNvdW50M180XzVfNl83XzhfOV8xMF8xMSwgICAgICAvKiAyICAqLwotICAgIGNvdW50NV82XzdfOF85XzEwXzExLCAgICAgICAgICAvKiAzICAqLwotICAgIGNvdW50NV82XzdfOF85XzEwXzExLCAgICAgICAgICAvKiA0ICAqLwotICAgIGNvdW50N184XzlfMTBfMTEsICAgICAgICAgICAgICAvKiA1ICAqLwotICAgIGNvdW50N184XzlfMTBfMTEsICAgICAgICAgICAgICAvKiA2ICAqLwotICAgIGNvdW50N184XzlfMTBfMTEsICAgICAgICAgICAgICAvKiA3ICAqLwotICAgIGNvdW50OV8xMF8xMSwgICAgICAgICAgICAgICAgICAvKiA4ICAqLwotICAgIGNvdW50OV8xMF8xMSwgICAgICAgICAgICAgICAgICAvKiA5ICAqLwotICAgIGNvdW50OV8xMF8xMSwgICAgICAgICAgICAgICAgICAvKiAxMCAqLwotICAgIGNvdW50OV8xMF8xMSwgICAgICAgICAgICAgICAgICAvKiAxMSAqLwotICAgIGNvdW50OV8xMF8xMSwgICAgICAgICAgICAgICAgICAvKiAxMiAqLwotICAgIGNvdW50MTEsICAgICAgICAgICAgICAgICAgICAgICAvKiAxMyAqLwotICAgIGNvdW50MTEsICAgICAgICAgICAgICAgICAgICAgICAvKiAxNCAqLwotICAgIGNvdW50MTEsICAgICAgICAgICAgICAgICAgICAgICAvKiAxNSAqLwotICAgIGNvdW50RXNjICAgICAgICAgICAgICAgICAgICAgICAvKiAxNiAqLwotICB9OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogYml0Q291bnQKLSogZGVzY3JpcHRpb246ICBjb3VudCBiaXRzCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVdvcmQxNiBiaXRDb3VudChjb25zdCBXb3JkMTYgKnZhbHVlcywKLSAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgIHdpZHRoLAotICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgbWF4VmFsLAotICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAqYml0Q291bnQpCi17Ci0gIC8qCi0gICAgY2hlY2sgaWYgd2UgY2FuIHVzZSBjb2RlYm9vayAwCi0gICovCi0KLSAgaWYobWF4VmFsID09IDApCi0gICAgYml0Q291bnRbMF0gPSAwOwotICBlbHNlCi0gICAgYml0Q291bnRbMF0gPSBJTlZBTElEX0JJVENPVU5UOwotCi0gIG1heFZhbCA9IG1pbihtYXhWYWwsIENPREVfQk9PS19FU0NfTEFWKTsKLSAgY291bnRGdW5jVGFibGVbbWF4VmFsXSh2YWx1ZXMsd2lkdGgsYml0Q291bnQpOwotCi0gIHJldHVybigwKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGNvZGVWYWx1ZXMKLSogZGVzY3JpcHRpb246ICB3cml0ZSBodWZmdW0gYml0cwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1Xb3JkMTYgY29kZVZhbHVlcyhXb3JkMTYgKnZhbHVlcywgV29yZDE2IHdpZHRoLCBXb3JkMTYgY29kZUJvb2ssIEhBTkRMRV9CSVRfQlVGIGhCaXRzdHJlYW0pCi17Ci0KLSAgV29yZDMyIGksIHQwLCB0MSwgdDIsIHQzLCB0MDAsIHQwMTsKLSAgVVdvcmQxNiBjb2RlV29yZCwgY29kZUxlbmd0aDsKLSAgV29yZDE2IHNpZ24sIHNpZ25MZW5ndGg7Ci0KLQotICBzd2l0Y2ggKGNvZGVCb29rKSB7Ci0gICAgY2FzZSBDT0RFX0JPT0tfWkVST19OTzoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDT0RFX0JPT0tfMV9OTzoKLSAgICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTQpIHsKLSAgICAgICAgdDAgICAgICAgICA9IHZhbHVlc1tpKzBdOwotICAgICAgICB0MSAgICAgICAgID0gdmFsdWVzW2krMV07Ci0gICAgICAgIHQyICAgICAgICAgPSB2YWx1ZXNbaSsyXTsKLSAgICAgICAgdDMgICAgICAgICA9IHZhbHVlc1tpKzNdOwotICAgICAgICBjb2RlV29yZCAgID0gaHVmZl9jdGFiMVt0MCsxXVt0MSsxXVt0MisxXVt0MysxXTsKLSAgICAgICAgY29kZUxlbmd0aCA9IEhJX0xUQUIoaHVmZl9sdGFiMV8yW3QwKzFdW3QxKzFdW3QyKzFdW3QzKzFdKTsKLSAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sIGNvZGVXb3JkLCBjb2RlTGVuZ3RoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDT0RFX0JPT0tfMl9OTzoKLSAgICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTQpIHsKLSAgICAgICAgdDAgICAgICAgICA9IHZhbHVlc1tpKzBdOwotICAgICAgICB0MSAgICAgICAgID0gdmFsdWVzW2krMV07Ci0gICAgICAgIHQyICAgICAgICAgPSB2YWx1ZXNbaSsyXTsKLSAgICAgICAgdDMgICAgICAgICA9IHZhbHVlc1tpKzNdOwotICAgICAgICBjb2RlV29yZCAgID0gaHVmZl9jdGFiMlt0MCsxXVt0MSsxXVt0MisxXVt0MysxXTsKLSAgICAgICAgY29kZUxlbmd0aCA9IExPX0xUQUIoaHVmZl9sdGFiMV8yW3QwKzFdW3QxKzFdW3QyKzFdW3QzKzFdKTsKLSAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sY29kZVdvcmQsY29kZUxlbmd0aCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ09ERV9CT09LXzNfTk86Ci0gICAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz00KSB7Ci0gICAgICAgIHNpZ249MDsKLSAgICAgICAgc2lnbkxlbmd0aD0wOwotICAgICAgICB0MCA9IHZhbHVlc1tpKzBdOwotCi0gICAgICAgIGlmKHQwICE9IDApewotICAgICAgICAgIHNpZ25MZW5ndGggPSBzaWduTGVuZ3RoICsgMTsKLSAgICAgICAgICBzaWduID0gc2lnbiA8PCAxOwotCi0gICAgICAgICAgaWYodDAgPCAwKXsKLSAgICAgICAgICAgIHNpZ258PTE7Ci0gICAgICAgICAgICB0MD0tdDA7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHQxID0gdmFsdWVzW2krMV07Ci0KLSAgICAgICAgaWYodDEgIT0gMCl7Ci0gICAgICAgICAgc2lnbkxlbmd0aCA9IHNpZ25MZW5ndGggKyAxOwotICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7Ci0KLSAgICAgICAgICBpZih0MSA8IDApewotICAgICAgICAgICAgc2lnbnw9MTsKLSAgICAgICAgICAgIHQxPS10MTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdDIgPSB2YWx1ZXNbaSsyXTsKLQotICAgICAgICBpZih0MiAhPSAwKXsKLSAgICAgICAgICBzaWduTGVuZ3RoID0gc2lnbkxlbmd0aCArIDE7Ci0gICAgICAgICAgc2lnbiA9IHNpZ24gPDwgMTsKLQotICAgICAgICAgIGlmKHQyIDwgMCl7Ci0gICAgICAgICAgICBzaWdufD0xOwotICAgICAgICAgICAgdDI9LXQyOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0MyA9IHZhbHVlc1tpKzNdOwotICAgICAgICBpZih0MyAhPSAwKXsKLSAgICAgICAgICBzaWduTGVuZ3RoID0gc2lnbkxlbmd0aCArIDE7Ci0gICAgICAgICAgc2lnbiA9IHNpZ24gPDwgMTsKLQotICAgICAgICAgIGlmKHQzIDwgMCl7Ci0gICAgICAgICAgICBzaWdufD0xOwotICAgICAgICAgICAgdDM9LXQzOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGNvZGVXb3JkICAgPSBodWZmX2N0YWIzW3QwXVt0MV1bdDJdW3QzXTsKLSAgICAgICAgY29kZUxlbmd0aCA9IEhJX0xUQUIoaHVmZl9sdGFiM180W3QwXVt0MV1bdDJdW3QzXSk7Ci0gICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLGNvZGVXb3JkLGNvZGVMZW5ndGgpOwotICAgICAgICBXcml0ZUJpdHMoaEJpdHN0cmVhbSxzaWduLHNpZ25MZW5ndGgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENPREVfQk9PS180X05POgotICAgICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9NCkgewotICAgICAgICBzaWduPTA7Ci0gICAgICAgIHNpZ25MZW5ndGg9MDsKLSAgICAgICAgdDAgPSB2YWx1ZXNbaSswXTsKLQotICAgICAgICBpZih0MCAhPSAwKXsKLSAgICAgICAgICBzaWduTGVuZ3RoID0gc2lnbkxlbmd0aCArIDE7Ci0gICAgICAgICAgc2lnbiA9IHNpZ24gPDwgMTsKLSAgICAgICAgICBpZih0MCA8IDApewotICAgICAgICAgICAgc2lnbnw9MTsKLSAgICAgICAgICAgIHQwPS10MDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdDEgPSB2YWx1ZXNbaSsxXTsKLQotICAgICAgICBpZih0MSAhPSAwKXsKLSAgICAgICAgICBzaWduTGVuZ3RoID0gc2lnbkxlbmd0aCArIDE7Ci0gICAgICAgICAgc2lnbiA9IHNpZ24gPDwgMTsKLQotICAgICAgICAgIGlmKHQxIDwgMCl7Ci0gICAgICAgICAgICBzaWdufD0xOwotICAgICAgICAgICAgdDE9LXQxOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0MiA9IHZhbHVlc1tpKzJdOwotCi0gICAgICAgIGlmKHQyICE9IDApewotICAgICAgICAgIHNpZ25MZW5ndGggPSBzaWduTGVuZ3RoICsgMTsKLSAgICAgICAgICBzaWduID0gc2lnbiA8PCAxOwotCi0gICAgICAgICAgaWYodDIgPCAwKXsKLSAgICAgICAgICAgIHNpZ258PTE7Ci0gICAgICAgICAgICB0Mj0tdDI7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHQzID0gdmFsdWVzW2krM107Ci0KLSAgICAgICAgaWYodDMgIT0gMCl7Ci0gICAgICAgICAgc2lnbkxlbmd0aCA9IHNpZ25MZW5ndGggKyAxOwotICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7Ci0KLSAgICAgICAgICBpZih0MyA8IDApewotICAgICAgICAgICAgc2lnbnw9MTsKLSAgICAgICAgICAgIHQzPS10MzsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29kZVdvcmQgICA9IGh1ZmZfY3RhYjRbdDBdW3QxXVt0Ml1bdDNdOwotICAgICAgICBjb2RlTGVuZ3RoID0gTE9fTFRBQihodWZmX2x0YWIzXzRbdDBdW3QxXVt0Ml1bdDNdKTsKLSAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sY29kZVdvcmQsY29kZUxlbmd0aCk7Ci0gICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLHNpZ24sc2lnbkxlbmd0aCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ09ERV9CT09LXzVfTk86Ci0gICAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz0yKSB7Ci0gICAgICAgIHQwICAgICAgICAgPSB2YWx1ZXNbaSswXTsKLSAgICAgICAgdDEgICAgICAgICA9IHZhbHVlc1tpKzFdOwotICAgICAgICBjb2RlV29yZCAgID0gaHVmZl9jdGFiNVt0MCs0XVt0MSs0XTsKLSAgICAgICAgY29kZUxlbmd0aCA9IEhJX0xUQUIoaHVmZl9sdGFiNV82W3QwKzRdW3QxKzRdKTsKLSAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sY29kZVdvcmQsY29kZUxlbmd0aCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ09ERV9CT09LXzZfTk86Ci0gICAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz0yKSB7Ci0gICAgICAgIHQwICAgICAgICAgPSB2YWx1ZXNbaSswXTsKLSAgICAgICAgdDEgICAgICAgICA9IHZhbHVlc1tpKzFdOwotICAgICAgICBjb2RlV29yZCAgID0gaHVmZl9jdGFiNlt0MCs0XVt0MSs0XTsKLSAgICAgICAgY29kZUxlbmd0aCA9IExPX0xUQUIoaHVmZl9sdGFiNV82W3QwKzRdW3QxKzRdKTsKLSAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sY29kZVdvcmQsY29kZUxlbmd0aCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ09ERV9CT09LXzdfTk86Ci0gICAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz0yKXsKLSAgICAgICAgc2lnbj0wOwotICAgICAgICBzaWduTGVuZ3RoPTA7Ci0gICAgICAgIHQwID0gdmFsdWVzW2krMF07Ci0KLSAgICAgICAgaWYodDAgIT0gMCl7Ci0gICAgICAgICAgc2lnbkxlbmd0aCA9IHNpZ25MZW5ndGggKyAxOwotICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7Ci0KLSAgICAgICAgICBpZih0MCA8IDApewotICAgICAgICAgICAgc2lnbnw9MTsKLSAgICAgICAgICAgIHQwPS10MDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0MSA9IHZhbHVlc1tpKzFdOwotCi0gICAgICAgIGlmKHQxICE9IDApewotICAgICAgICAgIHNpZ25MZW5ndGggPSBzaWduTGVuZ3RoICsgMTsKLSAgICAgICAgICBzaWduID0gc2lnbiA8PCAxOwotCi0gICAgICAgICAgaWYodDEgPCAwKXsKLSAgICAgICAgICAgIHNpZ258PTE7Ci0gICAgICAgICAgICB0MT0tdDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvZGVXb3JkICAgPSBodWZmX2N0YWI3W3QwXVt0MV07Ci0gICAgICAgIGNvZGVMZW5ndGggPSBISV9MVEFCKGh1ZmZfbHRhYjdfOFt0MF1bdDFdKTsKLSAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sY29kZVdvcmQsY29kZUxlbmd0aCk7Ci0gICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLHNpZ24sc2lnbkxlbmd0aCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ09ERV9CT09LXzhfTk86Ci0gICAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz0yKSB7Ci0gICAgICAgIHNpZ249MDsKLSAgICAgICAgc2lnbkxlbmd0aD0wOwotICAgICAgICB0MCA9IHZhbHVlc1tpKzBdOwotCi0gICAgICAgIGlmKHQwICE9IDApewotICAgICAgICAgIHNpZ25MZW5ndGggPSBzaWduTGVuZ3RoICsgMTsKLSAgICAgICAgICBzaWduID0gc2lnbiA8PCAxOwotCi0gICAgICAgICAgaWYodDAgPCAwKXsKLSAgICAgICAgICAgIHNpZ258PTE7Ci0gICAgICAgICAgICB0MD0tdDA7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdDEgPSB2YWx1ZXNbaSsxXTsKLQotICAgICAgICBpZih0MSAhPSAwKXsKLSAgICAgICAgICBzaWduTGVuZ3RoID0gc2lnbkxlbmd0aCArIDE7Ci0gICAgICAgICAgc2lnbiA9IHNpZ24gPDwgMTsKLQotICAgICAgICAgIGlmKHQxIDwgMCl7Ci0gICAgICAgICAgICBzaWdufD0xOwotICAgICAgICAgICAgdDE9LXQxOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb2RlV29yZCAgID0gaHVmZl9jdGFiOFt0MF1bdDFdOwotICAgICAgICBjb2RlTGVuZ3RoID0gTE9fTFRBQihodWZmX2x0YWI3XzhbdDBdW3QxXSk7Ci0gICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLGNvZGVXb3JkLGNvZGVMZW5ndGgpOwotICAgICAgICBXcml0ZUJpdHMoaEJpdHN0cmVhbSxzaWduLHNpZ25MZW5ndGgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENPREVfQk9PS185X05POgotICAgICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9MikgewotICAgICAgICBzaWduPTA7Ci0gICAgICAgIHNpZ25MZW5ndGg9MDsKLSAgICAgICAgdDAgPSB2YWx1ZXNbaSswXTsKLQotICAgICAgICBpZih0MCAhPSAwKXsKLSAgICAgICAgICBzaWduTGVuZ3RoID0gc2lnbkxlbmd0aCArIDE7Ci0gICAgICAgICAgc2lnbiA9IHNpZ24gPDwgMTsKLQotICAgICAgICAgIGlmKHQwIDwgMCl7Ci0gICAgICAgICAgICBzaWdufD0xOwotICAgICAgICAgICAgdDA9LXQwOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHQxID0gdmFsdWVzW2krMV07Ci0KLSAgICAgICAgaWYodDEgIT0gMCl7Ci0gICAgICAgICAgc2lnbkxlbmd0aCA9IHNpZ25MZW5ndGggKyAxOwotICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7Ci0KLSAgICAgICAgICBpZih0MSA8IDApewotICAgICAgICAgICAgc2lnbnw9MTsKLSAgICAgICAgICAgIHQxPS10MTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29kZVdvcmQgICA9IGh1ZmZfY3RhYjlbdDBdW3QxXTsKLSAgICAgICAgY29kZUxlbmd0aCA9IEhJX0xUQUIoaHVmZl9sdGFiOV8xMFt0MF1bdDFdKTsKLSAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sY29kZVdvcmQsY29kZUxlbmd0aCk7Ci0gICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLHNpZ24sc2lnbkxlbmd0aCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ09ERV9CT09LXzEwX05POgotICAgICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9MikgewotICAgICAgICBzaWduPTA7Ci0gICAgICAgIHNpZ25MZW5ndGg9MDsKLSAgICAgICAgdDAgPSB2YWx1ZXNbaSswXTsKLQotICAgICAgICBpZih0MCAhPSAwKXsKLSAgICAgICAgICBzaWduTGVuZ3RoID0gc2lnbkxlbmd0aCArIDE7Ci0gICAgICAgICAgc2lnbiA9IHNpZ24gPDwgMTsKLQotICAgICAgICAgIGlmKHQwIDwgMCl7Ci0gICAgICAgICAgICBzaWdufD0xOwotICAgICAgICAgICAgdDA9LXQwOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHQxID0gdmFsdWVzW2krMV07Ci0KLSAgICAgICAgaWYodDEgIT0gMCl7Ci0gICAgICAgICAgc2lnbkxlbmd0aCA9IHNpZ25MZW5ndGggKyAxOwotICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7Ci0KLSAgICAgICAgICBpZih0MSA8IDApewotICAgICAgICAgICAgc2lnbnw9MTsKLSAgICAgICAgICAgIHQxPS10MTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29kZVdvcmQgICA9IGh1ZmZfY3RhYjEwW3QwXVt0MV07Ci0gICAgICAgIGNvZGVMZW5ndGggPSBMT19MVEFCKGh1ZmZfbHRhYjlfMTBbdDBdW3QxXSk7Ci0gICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLGNvZGVXb3JkLGNvZGVMZW5ndGgpOwotICAgICAgICBXcml0ZUJpdHMoaEJpdHN0cmVhbSxzaWduLHNpZ25MZW5ndGgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENPREVfQk9PS19FU0NfTk86Ci0gICAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz0yKSB7Ci0gICAgICAgIHNpZ249MDsKLSAgICAgICAgc2lnbkxlbmd0aD0wOwotICAgICAgICB0MCA9IHZhbHVlc1tpKzBdOwotCi0gICAgICAgIGlmKHQwICE9IDApewotICAgICAgICAgIHNpZ25MZW5ndGggPSBzaWduTGVuZ3RoICsgMTsKLSAgICAgICAgICBzaWduID0gc2lnbiA8PCAxOwotCi0gICAgICAgICAgaWYodDAgPCAwKXsKLSAgICAgICAgICAgIHNpZ258PTE7Ci0gICAgICAgICAgICB0MD0tdDA7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdDEgPSB2YWx1ZXNbaSsxXTsKLQotICAgICAgICBpZih0MSAhPSAwKXsKLSAgICAgICAgICBzaWduTGVuZ3RoID0gc2lnbkxlbmd0aCArIDE7Ci0gICAgICAgICAgc2lnbiA9IHNpZ24gPDwgMTsKLQotICAgICAgICAgIGlmKHQxIDwgMCl7Ci0gICAgICAgICAgICBzaWdufD0xOwotICAgICAgICAgICAgdDE9LXQxOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0MDAgPSBtaW4odDAsMTYpOwotICAgICAgICB0MDEgPSBtaW4odDEsMTYpOwotCi0gICAgICAgIGNvZGVXb3JkICAgPSBodWZmX2N0YWIxMVt0MDBdW3QwMV07Ci0gICAgICAgIGNvZGVMZW5ndGggPSBodWZmX2x0YWIxMVt0MDBdW3QwMV07Ci0gICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLGNvZGVXb3JkLGNvZGVMZW5ndGgpOwotICAgICAgICBXcml0ZUJpdHMoaEJpdHN0cmVhbSxzaWduLHNpZ25MZW5ndGgpOwotCi0gICAgICAgIGlmKHQwID49IDE2KXsKLSAgICAgICAgICBXb3JkMTYgbiwgcDsKLSAgICAgICAgICBuPTA7Ci0gICAgICAgICAgcD10MDsKLSAgICAgICAgICB3aGlsZShzdWIocD0ocCA+PiAxKSwgMTYpID49IDApewotCi0gICAgICAgICAgICBXcml0ZUJpdHMoaEJpdHN0cmVhbSwxLDEpOwotICAgICAgICAgICAgbiA9IG4gKyAxOwotICAgICAgICAgIH0KLSAgICAgICAgICBXcml0ZUJpdHMoaEJpdHN0cmVhbSwwLDEpOwotICAgICAgICAgIG4gPSBuICsgNDsKLSAgICAgICAgICBXcml0ZUJpdHMoaEJpdHN0cmVhbSwodDAgLSAoMSA8PCBuKSksbik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZih0MSA+PSAxNil7Ci0gICAgICAgICAgV29yZDE2IG4sIHA7Ci0gICAgICAgICAgbj0wOwotICAgICAgICAgIHA9dDE7Ci0gICAgICAgICAgd2hpbGUoc3ViKHA9KHAgPj4gMSksIDE2KSA+PSAwKXsKLQotICAgICAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sMSwxKTsKLSAgICAgICAgICAgIG4gPSBuICsgMTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sMCwxKTsKLSAgICAgICAgICBuID0gbiArIDQ7Ci0gICAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sKHQxIC0gKDEgPDwgbikpLG4pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotICByZXR1cm4oMCk7Ci19Ci0KLVdvcmQxNiBiaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoV29yZDE2IGRlbHRhKQotewotICByZXR1cm4oaHVmZl9sdGFic2NmW2RlbHRhK0NPREVfQk9PS19TQ0ZfTEFWXSk7Ci19Ci0KLVdvcmQxNiBjb2RlU2NhbGVmYWN0b3JEZWx0YShXb3JkMTYgZGVsdGEsIEhBTkRMRV9CSVRfQlVGIGhCaXRzdHJlYW0pCi17Ci0gIFdvcmQzMiBjb2RlV29yZDsKLSAgV29yZDE2IGNvZGVMZW5ndGg7Ci0KLQotICBpZihkZWx0YSA+IENPREVfQk9PS19TQ0ZfTEFWIHx8IGRlbHRhIDwgLUNPREVfQk9PS19TQ0ZfTEFWKQotICAgIHJldHVybigxKTsKLQotICBjb2RlV29yZCAgID0gaHVmZl9jdGFic2NmW2RlbHRhICsgQ09ERV9CT09LX1NDRl9MQVZdOwotICBjb2RlTGVuZ3RoID0gaHVmZl9sdGFic2NmW2RlbHRhICsgQ09ERV9CT09LX1NDRl9MQVZdOwotICBXcml0ZUJpdHMoaEJpdHN0cmVhbSxjb2RlV29yZCxjb2RlTGVuZ3RoKTsKLSAgcmV0dXJuKDApOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYml0YnVmZmVyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9iaXRidWZmZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVlZWJkMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9iaXRidWZmZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCWJpdGJ1ZmZlci5jCi0KLQlDb250ZW50OglCaXQgQnVmZmVyIE1hbmFnZW1lbnQgZnVuY3Rpb25zCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJiaXRidWZmZXIuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IENyZWF0ZUJpdEJ1ZmZlcgotKiBkZXNjcmlwdGlvbjogIGNyZWF0ZSBhbmQgaW5pdCBCaXQgQnVmZmVyIE1hbmFnZW1lbnQKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotSEFORExFX0JJVF9CVUYgQ3JlYXRlQml0QnVmZmVyKEhBTkRMRV9CSVRfQlVGIGhCaXRCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVdvcmQ4ICpwQml0QnVmQmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgIGJpdEJ1ZlNpemUpCi17Ci0gIGFzc2VydChiaXRCdWZTaXplKjggPD0gMzI3NjgpOwotCi0gIGhCaXRCdWYtPnBCaXRCdWZCYXNlID0gcEJpdEJ1ZkJhc2U7Ci0gIGhCaXRCdWYtPnBCaXRCdWZFbmQgID0gcEJpdEJ1ZkJhc2UgKyBiaXRCdWZTaXplIC0gMTsKLQotICBoQml0QnVmLT5wV3JpdGVOZXh0ICA9IHBCaXRCdWZCYXNlOwotCi0gIGhCaXRCdWYtPmNhY2hlICAgICAgID0gMDsKLQotICBoQml0QnVmLT53Qml0UG9zICAgICA9IDA7Ci0gIGhCaXRCdWYtPmNudEJpdHMgICAgID0gMDsKLQotICBoQml0QnVmLT5zaXplICAgICAgICA9IChiaXRCdWZTaXplIDw8IDMpOwotICBoQml0QnVmLT5pc1ZhbGlkICAgICA9IDE7Ci0KLSAgcmV0dXJuIGhCaXRCdWY7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBEZWxldGVCaXRCdWZmZXIKLSogZGVzY3JpcHRpb246ICB1bmluaXQgQml0IEJ1ZmZlciBNYW5hZ2VtZW50Ci0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRGVsZXRlQml0QnVmZmVyKEhBTkRMRV9CSVRfQlVGICpoQml0QnVmKQotewotICBpZigqaEJpdEJ1ZikKLQkoKmhCaXRCdWYpLT5pc1ZhbGlkID0gMDsKLSAgKmhCaXRCdWYgPSBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogUmVzZXRCaXRCdWYKLSogZGVzY3JpcHRpb246ICByZXNldCBCaXQgQnVmZmVyIE1hbmFnZW1lbnQKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBSZXNldEJpdEJ1ZihIQU5ETEVfQklUX0JVRiBoQml0QnVmLAotICAgICAgICAgICAgICAgICBVV29yZDggKnBCaXRCdWZCYXNlLAotICAgICAgICAgICAgICAgICBXb3JkMTYgIGJpdEJ1ZlNpemUpCi17Ci0gIGhCaXRCdWYtPnBCaXRCdWZCYXNlID0gcEJpdEJ1ZkJhc2U7Ci0gIGhCaXRCdWYtPnBCaXRCdWZFbmQgID0gcEJpdEJ1ZkJhc2UgKyBiaXRCdWZTaXplIC0gMTsKLQotCi0gIGhCaXRCdWYtPnBXcml0ZU5leHQgID0gcEJpdEJ1ZkJhc2U7Ci0KLSAgaEJpdEJ1Zi0+d0JpdFBvcyAgICAgPSAwOwotICBoQml0QnVmLT5jbnRCaXRzICAgICA9IDA7Ci0KLSAgaEJpdEJ1Zi0+Y2FjaGUJICAgPSAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogQ29weUJpdEJ1ZgotKiBkZXNjcmlwdGlvbjogIGNvcHkgQml0IEJ1ZmZlciBNYW5hZ2VtZW50Ci0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQ29weUJpdEJ1ZihIQU5ETEVfQklUX0JVRiBoQml0QnVmU3JjLAotICAgICAgICAgICAgICAgIEhBTkRMRV9CSVRfQlVGIGhCaXRCdWZEc3QpCi17Ci0gICpoQml0QnVmRHN0ID0gKmhCaXRCdWZTcmM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBHZXRCaXRzQXZhaWwKLSogZGVzY3JpcHRpb246ICBnZXQgYXZhaWxhYmxlIGJpdHMKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotV29yZDE2IEdldEJpdHNBdmFpbChIQU5ETEVfQklUX0JVRiBoQml0QnVmKQotewotICByZXR1cm4gaEJpdEJ1Zi0+Y250Qml0czsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IFdyaXRlQml0cwotKiBkZXNjcmlwdGlvbjogIHdyaXRlIGJpdHMgdG8gdGhlIGJ1ZmZlcgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1Xb3JkMTYgV3JpdGVCaXRzKEhBTkRMRV9CSVRfQlVGIGhCaXRCdWYsCi0gICAgICAgICAgICAgICAgIFVXb3JkMzIgd3JpdGVWYWx1ZSwKLSAgICAgICAgICAgICAgICAgV29yZDE2IG5vQml0c1RvV3JpdGUpCi17Ci0gIFdvcmQxNiB3Qml0UG9zOwotCi0gIGFzc2VydChub0JpdHNUb1dyaXRlIDw9IChXb3JkMTYpc2l6ZW9mKFdvcmQzMikqOCk7Ci0KLSAgaWYobm9CaXRzVG9Xcml0ZSA9PSAwKQotCSAgcmV0dXJuIG5vQml0c1RvV3JpdGU7Ci0KLSAgaEJpdEJ1Zi0+Y250Qml0cyArPSBub0JpdHNUb1dyaXRlOwotCi0gIHdCaXRQb3MgPSBoQml0QnVmLT53Qml0UG9zOwotICB3Qml0UG9zICs9IG5vQml0c1RvV3JpdGU7Ci0gIHdyaXRlVmFsdWUgJj0gfigweGZmZmZmZmZmIDw8IG5vQml0c1RvV3JpdGUpOyAvLyBNYXNrIG91dCBldmVyeXRoaW5nIGV4Y2VwdCB0aGUgbG93ZXN0IG5vQml0c1RvV3JpdGUgYml0cwotICB3cml0ZVZhbHVlIDw8PSAzMiAtIHdCaXRQb3M7Ci0gIHdyaXRlVmFsdWUgfD0gaEJpdEJ1Zi0+Y2FjaGU7Ci0KLSAgd2hpbGUgKHdCaXRQb3MgPj0gOCkKLSAgewotCSAgVVdvcmQ4IHRtcDsKLQkgIHRtcCA9IChVV29yZDgpKCh3cml0ZVZhbHVlID4+IDI0KSAmIDB4RkYpOwotCi0JICAqaEJpdEJ1Zi0+cFdyaXRlTmV4dCsrID0gdG1wOwotCSAgd3JpdGVWYWx1ZSA8PD0gODsKLQkgIHdCaXRQb3MgLT0gODsKLSAgfQotCi0gIGhCaXRCdWYtPndCaXRQb3MgPSB3Qml0UG9zOwotICBoQml0QnVmLT5jYWNoZSA9IHdyaXRlVmFsdWU7Ci0KLSAgcmV0dXJuIG5vQml0c1RvV3JpdGU7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9iaXRlbmMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2JpdGVuYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzgxMjA0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2JpdGVuYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjkzICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJYml0ZW5jLmMKLQotCUNvbnRlbnQ6CUJpdHN0cmVhbSBlbmNvZGVyIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiYml0ZW5jLmgiCi0jaW5jbHVkZSAiYml0X2NudC5oIgotI2luY2x1ZGUgImR5bl9iaXRzLmgiCi0jaW5jbHVkZSAicWNfZGF0YS5oIgotI2luY2x1ZGUgImludGVyZmFjZS5oIgotCi0jZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCkKLQotc3RhdGljIGNvbnN0ICBXb3JkMTYgZ2xvYmFsR2Fpbk9mZnNldCA9IDEwMDsKLXN0YXRpYyBjb25zdCAgV29yZDE2IGljc1Jlc2VydmVkQml0ICAgPSAwOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBlbmNvZGVTcGVjdHJhbERhdGEKLSogZGVzY3JpcHRpb246ICBlbmNvZGUgc3BlY3RyYWwgZGF0YQotKiByZXR1cm5zOiAgICAgIHNwZWN0cmFsIGJpdHMgdXNlZAotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgV29yZDMyIGVuY29kZVNwZWN0cmFsRGF0YShXb3JkMTYgICAgICAgICAgICAgKnNmYk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ1RJT05fREFUQSAgICAgICAqc2VjdGlvbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgICAgKnF1YW50U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfQklUX0JVRiAgICAgIGhCaXRTdHJlYW0pCi17Ci0gIFdvcmQxNiBpLHNmYjsKLSAgV29yZDE2IGRiZ1ZhbDsKLSAgU0VDVElPTl9JTkZPKiBwc2VjdGlvbmluZm87Ci0gIGRiZ1ZhbCA9IEdldEJpdHNBdmFpbChoQml0U3RyZWFtKTsKLQotICBmb3IoaT0wOyBpPHNlY3Rpb25EYXRhLT5ub09mU2VjdGlvbnM7IGkrKykgewotICAgIHBzZWN0aW9uaW5mbyA9ICYoc2VjdGlvbkRhdGEtPnNlY3Rpb25JbmZvW2ldKTsKLQkvKgotICAgICAgIGh1ZmZlbmNvZGUgc3BlY3RyYWwgZGF0YSBmb3IgdGhpcyBzZWN0aW9uCi0gICAgKi8KLSAgICBmb3Ioc2ZiPXBzZWN0aW9uaW5mby0+c2ZiU3RhcnQ7Ci0gICAgICAgIHNmYjxwc2VjdGlvbmluZm8tPnNmYlN0YXJ0K3BzZWN0aW9uaW5mby0+c2ZiQ250OwotICAgICAgICBzZmIrKykgewotICAgICAgY29kZVZhbHVlcyhxdWFudFNwZWN0cnVtK3NmYk9mZnNldFtzZmJdLAotICAgICAgICAgICAgICAgICBzZmJPZmZzZXRbc2ZiKzFdIC0gc2ZiT2Zmc2V0W3NmYl0sCi0gICAgICAgICAgICAgICAgIHBzZWN0aW9uaW5mby0+Y29kZUJvb2ssCi0gICAgICAgICAgICAgICAgIGhCaXRTdHJlYW0pOwotICAgIH0KLSAgfQotCi0gIHJldHVybihHZXRCaXRzQXZhaWwoaEJpdFN0cmVhbSktZGJnVmFsKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6ZW5jb2RlR2xvYmFsR2FpbgotKiBkZXNjcmlwdGlvbjogZW5jb2RlcyBHbG9iYWwgR2FpbiAoY29tbW9uIHNjYWxlIGZhY3RvcikKLSogcmV0dXJuczogICAgIG5vbmUKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgZW5jb2RlR2xvYmFsR2FpbihXb3JkMTYgZ2xvYmFsR2FpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGxvZ05vcm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBzY2FsZWZhYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0JJVF9CVUYgaEJpdFN0cmVhbSkKLXsKLSAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sICgoZ2xvYmFsR2FpbiAtIHNjYWxlZmFjKSArIGdsb2JhbEdhaW5PZmZzZXQtKGxvZ05vcm0gPDwgMikpLCA4KTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTplbmNvZGVJY3NJbmZvCi0qIGRlc2NyaXB0aW9uOiBlbmNvZGVzIEljcyBJbmZvCi0qIHJldHVybnM6ICAgICBub25lCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgZW5jb2RlSWNzSW5mbyhXb3JkMTYgYmxvY2tUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgd2luZG93U2hhcGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBncm91cGluZ01hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ1RJT05fREFUQSAqc2VjdGlvbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9CSVRfQlVGICBoQml0U3RyZWFtKQotewotICBXcml0ZUJpdHMoaEJpdFN0cmVhbSxpY3NSZXNlcnZlZEJpdCwxKTsKLSAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sYmxvY2tUeXBlLDIpOwotICBXcml0ZUJpdHMoaEJpdFN0cmVhbSx3aW5kb3dTaGFwZSwxKTsKLQotCi0gIHN3aXRjaChibG9ja1R5cGUpewotICAgIGNhc2UgTE9OR19XSU5ET1c6Ci0gICAgY2FzZSBTVEFSVF9XSU5ET1c6Ci0gICAgY2FzZSBTVE9QX1dJTkRPVzoKLSAgICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLHNlY3Rpb25EYXRhLT5tYXhTZmJQZXJHcm91cCw2KTsKLQotICAgICAgLyogTm8gcHJlZGljdG9yIGRhdGEgcHJlc2VudCAqLwotICAgICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sIDAsIDEpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNIT1JUX1dJTkRPVzoKLSAgICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLHNlY3Rpb25EYXRhLT5tYXhTZmJQZXJHcm91cCw0KTsKLQotICAgICAgLyoKLSAgICAgIFdyaXRlIGdyb3VwaW5nIGJpdHMKLSAgICAgICovCi0gICAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSxncm91cGluZ01hc2ssVFJBTlNfRkFDLTEpOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGVuY29kZVNlY3Rpb25EYXRhCi0qIGRlc2NyaXB0aW9uOiAgZW5jb2RlIHNlY3Rpb24gZGF0YSAoY29tbW9uIEh1ZmZtYW4gY29kZWJvb2tzIGZvciBhZGphY2VudAotKiAgICAgICAgICAgICAgIFNGQidzKQotKiByZXR1cm5zOiAgICAgIG5vbmUKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIFdvcmQzMiBlbmNvZGVTZWN0aW9uRGF0YShTRUNUSU9OX0RBVEEgKnNlY3Rpb25EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfQklUX0JVRiBoQml0U3RyZWFtKQotewotICBXb3JkMTYgc2VjdEVzY2FwZVZhbD0wLHNlY3RMZW5CaXRzPTA7Ci0gIFdvcmQxNiBzZWN0TGVuOwotICBXb3JkMTYgaTsKLSAgV29yZDE2IGRiZ1ZhbD1HZXRCaXRzQXZhaWwoaEJpdFN0cmVhbSk7Ci0KLQotCi0gIHN3aXRjaChzZWN0aW9uRGF0YS0+YmxvY2tUeXBlKQotICB7Ci0gICAgY2FzZSBMT05HX1dJTkRPVzoKLSAgICBjYXNlIFNUQVJUX1dJTkRPVzoKLSAgICBjYXNlIFNUT1BfV0lORE9XOgotICAgICAgc2VjdEVzY2FwZVZhbCA9IFNFQ1RfRVNDX1ZBTF9MT05HOwotICAgICAgc2VjdExlbkJpdHMgICA9IFNFQ1RfQklUU19MT05HOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNIT1JUX1dJTkRPVzoKLSAgICAgIHNlY3RFc2NhcGVWYWwgPSBTRUNUX0VTQ19WQUxfU0hPUlQ7Ci0gICAgICBzZWN0TGVuQml0cyAgID0gU0VDVF9CSVRTX1NIT1JUOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICBmb3IoaT0wO2k8c2VjdGlvbkRhdGEtPm5vT2ZTZWN0aW9ucztpKyspIHsKLSAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSxzZWN0aW9uRGF0YS0+c2VjdGlvbkluZm9baV0uY29kZUJvb2ssNCk7Ci0gICAgc2VjdExlbiA9IHNlY3Rpb25EYXRhLT5zZWN0aW9uSW5mb1tpXS5zZmJDbnQ7Ci0KLSAgICB3aGlsZShzZWN0TGVuID49IHNlY3RFc2NhcGVWYWwpIHsKLQotICAgICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sc2VjdEVzY2FwZVZhbCxzZWN0TGVuQml0cyk7Ci0gICAgICBzZWN0TGVuID0gc2VjdExlbiAtIHNlY3RFc2NhcGVWYWw7Ci0gICAgfQotICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLHNlY3RMZW4sc2VjdExlbkJpdHMpOwotICB9Ci0gIHJldHVybihHZXRCaXRzQXZhaWwoaEJpdFN0cmVhbSktZGJnVmFsKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGVuY29kZVNjYWxlRmFjdG9yRGF0YQotKiBkZXNjcmlwdGlvbjogIGVuY29kZSBEUENNIGNvZGVkIHNjYWxlIGZhY3RvcnMKLSogcmV0dXJuczogICAgICBub25lCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBXb3JkMzIgZW5jb2RlU2NhbGVGYWN0b3JEYXRhKFVXb3JkMTYgICAgICAgICptYXhWYWx1ZUluU2ZiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDVElPTl9EQVRBICAgKnNlY3Rpb25EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgKnNjYWxlZmFjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0JJVF9CVUYgIGhCaXRTdHJlYW0pCi17Ci0gIFdvcmQxNiBpLGosbGFzdFZhbFNjZixkZWx0YVNjZjsKLSAgV29yZDE2IGRiZ1ZhbCA9IEdldEJpdHNBdmFpbChoQml0U3RyZWFtKTsKLSAgU0VDVElPTl9JTkZPKiBwc2VjdGlvbmluZm87Ci0KLSAgbGFzdFZhbFNjZj1zY2FsZWZhY1tzZWN0aW9uRGF0YS0+Zmlyc3RTY2ZdOwotCi0gIGZvcihpPTA7aTxzZWN0aW9uRGF0YS0+bm9PZlNlY3Rpb25zO2krKyl7Ci0gICAgcHNlY3Rpb25pbmZvID0gJihzZWN0aW9uRGF0YS0+c2VjdGlvbkluZm9baV0pOwotICAgIGlmIChwc2VjdGlvbmluZm8tPmNvZGVCb29rICE9IENPREVfQk9PS19aRVJPX05PKXsKLSAgICAgIGZvciAoaj1wc2VjdGlvbmluZm8tPnNmYlN0YXJ0OwotICAgICAgICAgICBqPHBzZWN0aW9uaW5mby0+c2ZiU3RhcnQrcHNlY3Rpb25pbmZvLT5zZmJDbnQ7IGorKyl7Ci0KLSAgICAgICAgaWYobWF4VmFsdWVJblNmYltqXSA9PSAwKSB7Ci0gICAgICAgICAgZGVsdGFTY2YgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIGRlbHRhU2NmID0gbGFzdFZhbFNjZiAtIHNjYWxlZmFjW2pdOwotICAgICAgICAgIGxhc3RWYWxTY2YgPSBzY2FsZWZhY1tqXTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKGNvZGVTY2FsZWZhY3RvckRlbHRhKGRlbHRhU2NmLGhCaXRTdHJlYW0pKXsKLSAgICAgICAgICByZXR1cm4oMSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotICByZXR1cm4oR2V0Qml0c0F2YWlsKGhCaXRTdHJlYW0pLWRiZ1ZhbCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOmVuY29kZU1zSW5mbwotKiBkZXNjcmlwdGlvbjogZW5jb2RlcyBNUy1TdGVyZW8gSW5mbwotKiByZXR1cm5zOiAgICAgbm9uZQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBlbmNvZGVNU0luZm8oV29yZDE2ICAgICAgICAgIHNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgZ3JwU2ZiLAotICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICBtYXhTZmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgIG1zRGlnZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICpqc0ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9CSVRfQlVGICBoQml0U3RyZWFtKQotewotICBXb3JkMTYgc2ZiLCBzZmJPZmY7Ci0KLQotICBzd2l0Y2gobXNEaWdlc3QpCi0gIHsKLSAgICBjYXNlIE1TX05PTkU6Ci0gICAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSxTSV9NU19NQVNLX05PTkUsMik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTVNfQUxMOgotICAgICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sU0lfTVNfTUFTS19BTEwsMik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTVNfU09NRToKLSAgICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLFNJX01TX01BU0tfU09NRSwyKTsKLSAgICAgIGZvcihzZmJPZmYgPSAwOyBzZmJPZmYgPCBzZmJDbnQ7IHNmYk9mZis9Z3JwU2ZiKSB7Ci0gICAgICAgIGZvcihzZmI9MDsgc2ZiPG1heFNmYjsgc2ZiKyspIHsKLQotICAgICAgICAgIGlmKGpzRmxhZ3Nbc2ZiT2ZmK3NmYl0gJiBNU19PTikgewotICAgICAgICAgICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sMSwxKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLDAsMSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgfQotCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBlbmNvZGVUbnNEYXRhCi0qIGRlc2NyaXB0aW9uOiAgZW5jb2RlIFROUyBkYXRhIChmaWx0ZXIgb3JkZXIsIGNvZWZmcywgLi4pCi0qIHJldHVybnM6ICAgICAgbm9uZQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBlbmNvZGVUbnNEYXRhKFROU19JTkZPIHRuc0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBibG9ja1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9CSVRfQlVGIGhCaXRTdHJlYW0pIHsKLSAgV29yZDE2IGksazsKLSAgRmxhZyB0bnNQcmVzZW50OwotICBXb3JkMTYgbnVtT2ZXaW5kb3dzOwotICBXb3JkMTYgY29lZkJpdHM7Ci0gIEZsYWcgaXNTaG9ydDsKLQotCi0gIGlmIChibG9ja1R5cGU9PTIpIHsKLSAgICBpc1Nob3J0ID0gMTsKLSAgICBudW1PZldpbmRvd3MgPSBUUkFOU19GQUM7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgaXNTaG9ydCA9IDA7Ci0gICAgbnVtT2ZXaW5kb3dzID0gMTsKLSAgfQotCi0gIHRuc1ByZXNlbnQ9MDsKLSAgZm9yIChpPTA7IGk8bnVtT2ZXaW5kb3dzOyBpKyspIHsKLQotICAgIGlmICh0bnNJbmZvLnRuc0FjdGl2ZVtpXSkgewotICAgICAgdG5zUHJlc2VudD0xOwotICAgIH0KLSAgfQotCi0gIGlmICh0bnNQcmVzZW50PT0wKSB7Ci0gICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sMCwxKTsKLSAgfQotICBlbHNleyAvKiB0aGVyZSBpcyBkYXRhIHRvIGJlIHdyaXR0ZW4qLwotICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLDEsMSk7IC8qZGF0YV9wcmVzZW50ICovCi0gICAgZm9yIChpPTA7IGk8bnVtT2ZXaW5kb3dzOyBpKyspIHsKLQotICAgICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sdG5zSW5mby50bnNBY3RpdmVbaV0sKGlzU2hvcnQ/MToyKSk7Ci0KLSAgICAgIGlmICh0bnNJbmZvLnRuc0FjdGl2ZVtpXSkgewotCi0gICAgICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLCgodG5zSW5mby5jb2VmUmVzW2ldIC0gNCk9PTA/MTowKSwxKTsKLQotICAgICAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSx0bnNJbmZvLmxlbmd0aFtpXSwoaXNTaG9ydD80OjYpKTsKLQotICAgICAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSx0bnNJbmZvLm9yZGVyW2ldLChpc1Nob3J0PzM6NSkpOwotCi0gICAgICAgIGlmICh0bnNJbmZvLm9yZGVyW2ldKXsKLSAgICAgICAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSwgRklMVEVSX0RJUkVDVElPTiwgMSk7Ci0KLSAgICAgICAgICBpZih0bnNJbmZvLmNvZWZSZXNbaV0gPT0gNCkgewotICAgICAgICAgICAgY29lZkJpdHMgPSAzOwotICAgICAgICAgICAgZm9yKGs9MDsgazx0bnNJbmZvLm9yZGVyW2ldOyBrKyspIHsKLQotICAgICAgICAgICAgICBpZiAodG5zSW5mby5jb2VmW2kqVE5TX01BWF9PUkRFUl9TSE9SVCtrXSA+IDMgfHwKLSAgICAgICAgICAgICAgICAgIHRuc0luZm8uY29lZltpKlROU19NQVhfT1JERVJfU0hPUlQra10gPCAtNCkgewotICAgICAgICAgICAgICAgIGNvZWZCaXRzID0gNDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGNvZWZCaXRzID0gMjsKLSAgICAgICAgICAgIGZvcihrPTA7IGs8dG5zSW5mby5vcmRlcltpXTsgaysrKSB7Ci0KLSAgICAgICAgICAgICAgaWYgKHRuc0luZm8uY29lZltpKlROU19NQVhfT1JERVJfU0hPUlQra10gPiAxIHx8Ci0gICAgICAgICAgICAgICAgICB0bnNJbmZvLmNvZWZbaSpUTlNfTUFYX09SREVSX1NIT1JUK2tdIDwgLTIpIHsKLSAgICAgICAgICAgICAgICBjb2VmQml0cyA9IDM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sIHRuc0luZm8uY29lZlJlc1tpXSAtIGNvZWZCaXRzLCAxKTsgLypjb2VmX2NvbXByZXMqLwotICAgICAgICAgIGZvciAoaz0wOyBrPHRuc0luZm8ub3JkZXJbaV07IGsrKyApIHsKLSAgICAgICAgICAgIHN0YXRpYyBjb25zdCBXb3JkMTYgcm1hc2tbXSA9IHswLDEsMyw3LDE1fTsKLQotICAgICAgICAgICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sdG5zSW5mby5jb2VmW2kqVE5TX01BWF9PUkRFUl9TSE9SVCtrXSAmIHJtYXNrW2NvZWZCaXRzXSxjb2VmQml0cyk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGVuY29kZUdhaW5Db250cm9sRGF0YQotKiBkZXNjcmlwdGlvbjogIHVuc3VwcG9ydGVkCi0qIHJldHVybnM6ICAgICAgbm9uZQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBlbmNvZGVHYWluQ29udHJvbERhdGEoSEFORExFX0JJVF9CVUYgaEJpdFN0cmVhbSkKLXsKLSAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sMCwxKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGVuY29kZVB1bHNlRGF0YQotKiBkZXNjcmlwdGlvbjogIG5vdCBzdXBwb3J0ZWQgeWV0IChkdW1teSkKLSogcmV0dXJuczogICAgICBub25lCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGVuY29kZVB1bHNlRGF0YShIQU5ETEVfQklUX0JVRiBoQml0U3RyZWFtKQotewotICBXcml0ZUJpdHMoaEJpdFN0cmVhbSwwLDEpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBXcml0ZUluZGl2aWR1YWxDaGFubmVsU3RyZWFtCi0qIGRlc2NyaXB0aW9uOiAgbWFuYWdlbWVudCBvZiB3cml0ZSBwcm9jZXNzIG9mIGluZGl2aWR1YWwgY2hhbm5lbCBzdHJlYW0KLSogcmV0dXJuczogICAgICBub25lCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkCi13cml0ZUluZGl2aWR1YWxDaGFubmVsU3RyZWFtKEZsYWcgICBjb21tb25XaW5kb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBtZGN0U2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiB3aW5kb3dTaGFwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGdyb3VwaW5nTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpzZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBzY2ZbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVdvcmQxNiAqbWF4VmFsdWVJblNmYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGdsb2JhbEdhaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBxdWFudFNwZWNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDVElPTl9EQVRBICpzZWN0aW9uRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0JJVF9CVUYgaEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE5TX0lORk8gdG5zSW5mbykKLXsKLSAgV29yZDE2IGxvZ05vcm07Ci0KLSAgbG9nTm9ybSA9IExPR19OT1JNX1BDTSAtIChtZGN0U2NhbGUgKyAxKTsKLQotICBlbmNvZGVHbG9iYWxHYWluKGdsb2JhbEdhaW4sIGxvZ05vcm0sc2NmW3NlY3Rpb25EYXRhLT5maXJzdFNjZl0sIGhCaXRTdHJlYW0pOwotCi0KLSAgaWYoIWNvbW1vbldpbmRvdykgewotICAgIGVuY29kZUljc0luZm8oc2VjdGlvbkRhdGEtPmJsb2NrVHlwZSwgd2luZG93U2hhcGUsIGdyb3VwaW5nTWFzaywgc2VjdGlvbkRhdGEsIGhCaXRTdHJlYW0pOwotICB9Ci0KLSAgZW5jb2RlU2VjdGlvbkRhdGEoc2VjdGlvbkRhdGEsIGhCaXRTdHJlYW0pOwotCi0gIGVuY29kZVNjYWxlRmFjdG9yRGF0YShtYXhWYWx1ZUluU2ZiLAotICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBzY2YsCi0gICAgICAgICAgICAgICAgICAgICAgICBoQml0U3RyZWFtKTsKLQotICBlbmNvZGVQdWxzZURhdGEoaEJpdFN0cmVhbSk7Ci0KLSAgZW5jb2RlVG5zRGF0YSh0bnNJbmZvLCBzZWN0aW9uRGF0YS0+YmxvY2tUeXBlLCBoQml0U3RyZWFtKTsKLQotICBlbmNvZGVHYWluQ29udHJvbERhdGEoaEJpdFN0cmVhbSk7Ci0KLSAgZW5jb2RlU3BlY3RyYWxEYXRhKHNmYk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhLAotICAgICAgICAgICAgICAgICAgICAgcXVhbnRTcGVjLAotICAgICAgICAgICAgICAgICAgICAgaEJpdFN0cmVhbSk7Ci0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IHdyaXRlU2luZ2xlQ2hhbm5lbEVsZW1lbnQKLSogZGVzY3JpcHRpb246ICB3cml0ZSBzaW5nbGUgY2hhbm5lbCBlbGVtZW50IHRvIGJpdHN0cmVhbQotKiByZXR1cm5zOiAgICAgIG5vbmUKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIFdvcmQxNiB3cml0ZVNpbmdsZUNoYW5uZWxFbGVtZW50KFdvcmQxNiBpbnN0YW5jZVRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnNmYk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfQ0hBTk5FTCogcWNPdXRDaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9CSVRfQlVGIGhCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE5TX0lORk8gdG5zSW5mbykKLXsKLSAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sSURfU0NFLDMpOwotICBXcml0ZUJpdHMoaEJpdFN0cmVhbSxpbnN0YW5jZVRhZyw0KTsKLSAgd3JpdGVJbmRpdmlkdWFsQ2hhbm5lbFN0cmVhbSgwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbC0+bWRjdFNjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbC0+d2luZG93U2hhcGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsLT5ncm91cGluZ01hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbC0+c2NmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbC0+bWF4VmFsdWVJblNmYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWwtPmdsb2JhbEdhaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsLT5xdWFudFNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihxY091dENoYW5uZWwtPnNlY3Rpb25EYXRhKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQml0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuc0luZm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICByZXR1cm4oMCk7Ci19Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogd3JpdGVDaGFubmVsUGFpckVsZW1lbnQKLSogZGVzY3JpcHRpb246Ci0qIHJldHVybnM6ICAgICAgbm9uZQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgV29yZDE2IHdyaXRlQ2hhbm5lbFBhaXJFbGVtZW50KFdvcmQxNiBpbnN0YW5jZVRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IG1zRGlnZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbXNGbGFnc1tNQVhfR1JPVVBFRF9TRkJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnNmYk9mZnNldFsyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0NIQU5ORUwgcWNPdXRDaGFubmVsWzJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfQklUX0JVRiBoQml0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTlNfSU5GTyB0bnNJbmZvWzJdKQotewotICBXcml0ZUJpdHMoaEJpdFN0cmVhbSxJRF9DUEUsMyk7Ci0gIFdyaXRlQml0cyhoQml0U3RyZWFtLGluc3RhbmNlVGFnLDQpOwotICBXcml0ZUJpdHMoaEJpdFN0cmVhbSwxLDEpOyAvKiBjb21tb24gd2luZG93ICovCi0KLSAgZW5jb2RlSWNzSW5mbyhxY091dENoYW5uZWxbMF0uc2VjdGlvbkRhdGEuYmxvY2tUeXBlLAotICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFswXS53aW5kb3dTaGFwZSwKLSAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbMF0uZ3JvdXBpbmdNYXNrLAotICAgICAgICAgICAgICAgICYocWNPdXRDaGFubmVsWzBdLnNlY3Rpb25EYXRhKSwKLSAgICAgICAgICAgICAgICBoQml0U3RyZWFtKTsKLQotICBlbmNvZGVNU0luZm8ocWNPdXRDaGFubmVsWzBdLnNlY3Rpb25EYXRhLnNmYkNudCwKLSAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFswXS5zZWN0aW9uRGF0YS5zZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFswXS5zZWN0aW9uRGF0YS5tYXhTZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgIG1zRGlnZXN0LAotICAgICAgICAgICAgICAgbXNGbGFncywKLSAgICAgICAgICAgICAgIGhCaXRTdHJlYW0pOwotCi0gIHdyaXRlSW5kaXZpZHVhbENoYW5uZWxTdHJlYW0oMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbMF0ubWRjdFNjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFswXS53aW5kb3dTaGFwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbMF0uZ3JvdXBpbmdNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYk9mZnNldFswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbMF0uc2NmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFswXS5tYXhWYWx1ZUluU2ZiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFswXS5nbG9iYWxHYWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFswXS5xdWFudFNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihxY091dENoYW5uZWxbMF0uc2VjdGlvbkRhdGEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG5zSW5mb1swXSk7Ci0KLSAgd3JpdGVJbmRpdmlkdWFsQ2hhbm5lbFN0cmVhbSgxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFsxXS5tZGN0U2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsWzFdLndpbmRvd1NoYXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFsxXS5ncm91cGluZ01hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiT2Zmc2V0WzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFsxXS5zY2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsWzFdLm1heFZhbHVlSW5TZmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsWzFdLmdsb2JhbEdhaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsWzFdLnF1YW50U3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHFjT3V0Q2hhbm5lbFsxXS5zZWN0aW9uRGF0YSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bnNJbmZvWzFdKTsKLQotICByZXR1cm4oMCk7Ci19Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogd3JpdGVGaWxsRWxlbWVudAotKiBkZXNjcmlwdGlvbjogIHdyaXRlIGZpbGwgZWxlbWVudHMgdG8gYml0c3RyZWFtCi0qIHJldHVybnM6ICAgICAgbm9uZQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCB3cml0ZUZpbGxFbGVtZW50KCBjb25zdCBVV29yZDggKmFuY0J5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHRvdEZpbGxCaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0JJVF9CVUYgaEJpdFN0cmVhbSkKLXsKLSAgV29yZDE2IGk7Ci0gIFdvcmQxNiBjbnQsZXNjX2NvdW50OwotCi0gIC8qCi0gICAgV3JpdGUgZmlsbCBFbGVtZW50KHMpOgotICAgIGFtb3VudCBvZiBhIGZpbGwgZWxlbWVudCBjYW4gYmUgNytYKjggQml0cywgWCBlbGVtZW50IG9mIFswLi4yNzBdCi0gICovCi0KLSAgd2hpbGUodG90RmlsbEJpdHMgPj0gKDMrNCkpIHsKLSAgICBjbnQgPSBtaW4oKCh0b3RGaWxsQml0cyAtICgzKzQpKSA+PiAzKSwgKCgxPDw0KS0xKSk7Ci0KLSAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSxJRF9GSUwsMyk7Ci0gICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sY250LDQpOwotCi0gICAgdG90RmlsbEJpdHMgPSB0b3RGaWxsQml0cyAtICgzKzQpOwotCi0KLSAgICBpZiAoY250ID09ICgxPDw0KS0xKSB7Ci0KLSAgICAgIGVzY19jb3VudCA9IG1pbiggKCh0b3RGaWxsQml0cyA+PiAzKSAtICgoMTw8NCktMSkpLCAoMTw8OCktMSk7Ci0gICAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSxlc2NfY291bnQsOCk7Ci0gICAgICB0b3RGaWxsQml0cyA9ICh0b3RGaWxsQml0cyAtIDgpOwotICAgICAgY250ID0gY250ICsgKGVzY19jb3VudCAtIDEpOwotICAgIH0KLQotICAgIGZvcihpPTA7aTxjbnQ7aSsrKSB7Ci0KLSAgICAgIGlmKGFuY0J5dGVzKQotICAgICAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSwgKmFuY0J5dGVzKyssOCk7Ci0gICAgICBlbHNlCi0gICAgICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLDAsOCk7Ci0gICAgICB0b3RGaWxsQml0cyA9IHRvdEZpbGxCaXRzIC0gODsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IFdyaXRlQml0U3RyZWFtCi0qIGRlc2NyaXB0aW9uOiAgbWFpbiBmdW5jdGlvbiBvZiB3cml0ZSBiaXRzdGVhbSBwcm9jZXNzCi0qIHJldHVybnM6ICAgICAgMCBpZiBzdWNjZXNzCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVdvcmQxNiBXcml0ZUJpdHN0cmVhbSAoSEFORExFX0JJVF9CVUYgaEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgRUxFTUVOVF9JTkZPIGVsSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUICpxY091dCwKLSAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVCAqcHN5T3V0LAotICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKmdsb2JVc2VkQml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVVdvcmQ4ICphbmNCeXRlcywKLQkJCQkJICAgV29yZDE2IHNhbXBpbmRleAotICAgICAgICAgICAgICAgICAgICAgICApIC8qIHJldHVybnMgZXJyb3IgY29kZSAqLwotewotICBXb3JkMTYgYml0TWFya1VwOwotICBXb3JkMTYgZWxlbWVudFVzZWRCaXRzOwotICBXb3JkMTYgZnJhbWVCaXRzPTA7Ci0KLSAgVU5VU0VEKGFuY0J5dGVzKTsKLQotICAvKiAgIHN0cnVjdCBiaXRidWZmZXIgYnNXcml0ZUNvcHk7ICovCi0gIGJpdE1hcmtVcCA9IEdldEJpdHNBdmFpbChoQml0U3RyZWFtKTsKLSAgaWYocWNPdXQtPnFjRWxlbWVudC5hZHRzVXNlZCkgIC8qICB3cml0ZSBhZHRzIGhlYWRlciovCi0gIHsKLQkgIFdyaXRlQml0cyhoQml0U3RyZWFtLCAweEZGRiwgMTIpOyAvKiAxMiBiaXQgU3luY3dvcmQgKi8KLQkgIFdyaXRlQml0cyhoQml0U3RyZWFtLCAxLCAxKTsgLyogSUQgPT0gMCBmb3IgTVBFRzQgQUFDLCAxIGZvciBNUEVHMiBBQUMgKi8KLQkgIFdyaXRlQml0cyhoQml0U3RyZWFtLCAwLCAyKTsgLyogbGF5ZXIgPT0gMCAqLwotCSAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sIDEsIDEpOyAvKiBwcm90ZWN0aW9uIGFic2VudCAqLwotCSAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sIDEsIDIpOyAvKiBwcm9maWxlICovCi0JICBXcml0ZUJpdHMoaEJpdFN0cmVhbSwgc2FtcGluZGV4LCA0KTsgLyogc2FtcGxpbmcgcmF0ZSAqLwotCSAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sIDAsIDEpOyAvKiBwcml2YXRlIGJpdCAqLwotCSAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sIGVsSW5mby5uQ2hhbm5lbHNJbkVsLCAzKTsgLyogY2guIGNvbmZpZyAobXVzdCBiZSA+IDApICovCi0JCQkJCQkJCSAgIC8qIHNpbXBseSB1c2luZyBudW1DaGFubmVscyBvbmx5IHdvcmtzIGZvcgotCQkJCQkJCQkJNiBjaGFubmVscyBvciBsZXNzLCBlbHNlIGEgY2hhbm5lbAotCQkJCQkJCQkJY29uZmlndXJhdGlvbiBzaG91bGQgYmUgd3JpdHRlbiAqLwotCSAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sIDAsIDEpOyAvKiBvcmlnaW5hbC9jb3B5ICovCi0JICBXcml0ZUJpdHMoaEJpdFN0cmVhbSwgMCwgMSk7IC8qIGhvbWUgKi8KLQotCSAgLyogVmFyaWFibGUgQURUUyBoZWFkZXIgKi8KLQkgIFdyaXRlQml0cyhoQml0U3RyZWFtLCAwLCAxKTsgLyogY29weXIuIGlkLiBiaXQgKi8KLQkgIFdyaXRlQml0cyhoQml0U3RyZWFtLCAwLCAxKTsgLyogY29weXIuIGlkLiBzdGFydCAqLwotCSAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sICpnbG9iVXNlZEJpdHMgPj4gMywgMTMpOwotCSAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sIDB4N0ZGLCAxMSk7IC8qIGJ1ZmZlciBmdWxsbmVzcyAoMHg3RkYgZm9yIFZCUikgKi8KLQkgIFdyaXRlQml0cyhoQml0U3RyZWFtLCAwLCAyKTsgLyogcmF3IGRhdGEgYmxvY2tzICgwKzE9MSkgKi8KLSAgfQotCi0gICpnbG9iVXNlZEJpdHM9MDsKLQotICB7Ci0KLSAgICBXb3JkMTYgKnNmYk9mZnNldFsyXTsKLSAgICBUTlNfSU5GTyB0bnNJbmZvWzJdOwotICAgIGVsZW1lbnRVc2VkQml0cyA9IDA7Ci0KLSAgICBzd2l0Y2ggKGVsSW5mby5lbFR5cGUpIHsKLQotICAgICAgY2FzZSBJRF9TQ0U6ICAgICAgLyogc2luZ2xlIGNoYW5uZWwgKi8KLSAgICAgICAgc2ZiT2Zmc2V0WzBdID0gcHN5T3V0LT5wc3lPdXRDaGFubmVsW2VsSW5mby5DaGFubmVsSW5kZXhbMF1dLnNmYk9mZnNldHM7Ci0gICAgICAgIHRuc0luZm9bMF0gPSBwc3lPdXQtPnBzeU91dENoYW5uZWxbZWxJbmZvLkNoYW5uZWxJbmRleFswXV0udG5zSW5mbzsKLQotICAgICAgICB3cml0ZVNpbmdsZUNoYW5uZWxFbGVtZW50KGVsSW5mby5pbnN0YW5jZVRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJPZmZzZXRbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnFjT3V0LT5xY0NoYW5uZWxbZWxJbmZvLkNoYW5uZWxJbmRleFswXV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bnNJbmZvWzBdKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgSURfQ1BFOiAgICAgLyogY2hhbm5lbCBwYWlyICovCi0gICAgICAgIHsKLSAgICAgICAgICBXb3JkMTYgbXNEaWdlc3Q7Ci0gICAgICAgICAgV29yZDE2ICptc0ZsYWdzID0gcHN5T3V0LT5wc3lPdXRFbGVtZW50LnRvb2xzSW5mby5tc01hc2s7Ci0gICAgICAgICAgbXNEaWdlc3QgPSBwc3lPdXQtPnBzeU91dEVsZW1lbnQudG9vbHNJbmZvLm1zRGlnZXN0OwotICAgICAgICAgIHNmYk9mZnNldFswXSA9Ci0gICAgICAgICAgICBwc3lPdXQtPnBzeU91dENoYW5uZWxbZWxJbmZvLkNoYW5uZWxJbmRleFswXV0uc2ZiT2Zmc2V0czsKLSAgICAgICAgICBzZmJPZmZzZXRbMV0gPQotICAgICAgICAgICAgcHN5T3V0LT5wc3lPdXRDaGFubmVsW2VsSW5mby5DaGFubmVsSW5kZXhbMV1dLnNmYk9mZnNldHM7Ci0KLSAgICAgICAgICB0bnNJbmZvWzBdPQotICAgICAgICAgICAgcHN5T3V0LT5wc3lPdXRDaGFubmVsW2VsSW5mby5DaGFubmVsSW5kZXhbMF1dLnRuc0luZm87Ci0gICAgICAgICAgdG5zSW5mb1sxXT0KLSAgICAgICAgICAgIHBzeU91dC0+cHN5T3V0Q2hhbm5lbFtlbEluZm8uQ2hhbm5lbEluZGV4WzFdXS50bnNJbmZvOwotICAgICAgICAgIHdyaXRlQ2hhbm5lbFBhaXJFbGVtZW50KGVsSW5mby5pbnN0YW5jZVRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc0RpZ2VzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc0ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcWNPdXQtPnFjQ2hhbm5lbFtlbEluZm8uQ2hhbm5lbEluZGV4WzBdXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQml0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuc0luZm8pOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4oMSk7Ci0KLSAgICAgIH0gICAvKiBzd2l0Y2ggKi8KLQotICAgIGVsZW1lbnRVc2VkQml0cyA9IGVsZW1lbnRVc2VkQml0cyAtIGJpdE1hcmtVcDsKLSAgICBiaXRNYXJrVXAgPSBHZXRCaXRzQXZhaWwoaEJpdFN0cmVhbSk7Ci0gICAgZnJhbWVCaXRzID0gZnJhbWVCaXRzICsgZWxlbWVudFVzZWRCaXRzICsgYml0TWFya1VwOwotCi0gIH0KLQotICB3cml0ZUZpbGxFbGVtZW50KE5VTEwsCi0gICAgICAgICAgICAgICAgICAgcWNPdXQtPnRvdEZpbGxCaXRzLAotICAgICAgICAgICAgICAgICAgIGhCaXRTdHJlYW0pOwotCi0gIFdyaXRlQml0cyhoQml0U3RyZWFtLElEX0VORCwzKTsKLQotICAvKiBieXRlIGFsaWduZW1lbnQgKi8KLSAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sMCwgKDggLSAoaEJpdFN0cmVhbS0+Y250Qml0cyAmIDcpKSAmIDcpOwotCi0gICpnbG9iVXNlZEJpdHMgPSAqZ2xvYlVzZWRCaXRzLSBiaXRNYXJrVXA7Ci0gIGJpdE1hcmtVcCA9IEdldEJpdHNBdmFpbChoQml0U3RyZWFtKTsKLSAgKmdsb2JVc2VkQml0cyA9ICpnbG9iVXNlZEJpdHMgKyBiaXRNYXJrVXA7Ci0gIGZyYW1lQml0cyA9IGZyYW1lQml0cyArICpnbG9iVXNlZEJpdHM7Ci0KLQotICBpZiAoZnJhbWVCaXRzICE9ICAocWNPdXQtPnRvdFN0YXRpY0JpdHNVc2VkK3FjT3V0LT50b3REeW5CaXRzVXNlZCArIHFjT3V0LT50b3RBbmNCaXRzVXNlZCArCi0gICAgICAgICAgICAgICAgICAgICBxY091dC0+dG90RmlsbEJpdHMgKyBxY091dC0+YWxpZ25CaXRzKSkgewotICAgIHJldHVybigtMSk7Ci0gIH0KLSAgcmV0dXJuKDApOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYmxvY2tfc3dpdGNoLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9ibG9ja19zd2l0Y2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFiYzdlNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9ibG9ja19zd2l0Y2guYworKysgL2Rldi9udWxsCkBAIC0xLDQwNCArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCWJsb2NrX3N3aXRjaC5jCi0KLQlDb250ZW50OglCbG9jayBzd2l0Y2hpbmcgZnVuY3Rpb25zCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJ0eXBlZGVmLmgiCi0jaW5jbHVkZSAiYmFzaWNfb3AuaCIKLSNpbmNsdWRlICJvcGVyXzMyYi5oIgotI2luY2x1ZGUgInBzeV9jb25zdC5oIgotI2luY2x1ZGUgImJsb2NrX3N3aXRjaC5oIgotCi0KLSNkZWZpbmUgRU5FUkdZX1NISUZUICg4IC0gMSkKLQotLyoqKioqKioqKioqKioqKiogaW50ZXJuYWwgZnVuY3Rpb24gcHJvdG90eXBlcyAqKioqKioqKioqKi8KLXN0YXRpYyBXb3JkMzIKLVNyY2hNYXhXaXRoSW5kZXgoY29uc3QgV29yZDMyICppbiwgV29yZDE2ICppbmRleCwgV29yZDE2IG4pOwotCi0KLVdvcmQzMgotQ2FsY1dpbmRvd0VuZXJneShCTE9DS19TV0lUQ0hJTkdfQ09OVFJPTCAqYmxvY2tTd2l0Y2hpbmdDb250cm9sLAotICAgICAgICAgICAgICAgICBXb3JkMTYgKnRpbWVTaWduYWwsCi0gICAgICAgICAgICAgICAgIFdvcmQxNiBjaEluY3JlbWVudCwKLSAgICAgICAgICAgICAgICAgV29yZDE2IHdpbmRvd0xlbik7Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqIENvbnN0YW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKgotICBJSVIgaGlnaCBwYXNzIGNvZWZmcwotKi8KLWNvbnN0IFdvcmQzMiBoaVBhc3NDb2VmZltCTE9DS19TV0lUQ0hJTkdfSUlSX0xFTl0gPSB7Ci0gIDB4YmVjOGI0MzksIDB4NjA5ZDQ5NTIgIC8qIC0wLjUwOTVmLCAwLjc1NDhmICovCi19OwotCi1zdGF0aWMgY29uc3QgV29yZDMyIGFjY1dpbmRvd05yZ0ZhYyA9IDB4MjY2NjY2NjY7ICAgICAgICAgICAgICAgICAgIC8qIGZhY3RvciBmb3IgYWNjdW11bGF0aW5nIGZpbHRlcmVkIHdpbmRvdyBlbmVyZ2llcyAwLjMgKi8KLXN0YXRpYyBjb25zdCBXb3JkMzIgb25lTWludXNBY2NXaW5kb3dOcmdGYWMgPSAweDU5OTk5OTlhOwkJCS8qIDAuNyAqLwotc3RhdGljIGNvbnN0IFdvcmQzMiBpbnZBdHRhY2tSYXRpb0hpZ2hCciA9IDB4MGNjY2NjY2Q7ICAgICAgICAgICAgICAvKiBpbnZlcnRlZCBsb3dlciByYXRpbyBsaW1pdCBmb3IgYXR0YWNrcyAwLjEqLwotc3RhdGljIGNvbnN0IFdvcmQzMiBpbnZBdHRhY2tSYXRpb0xvd0JyID0gIDB4MDcyYjAyMGM7ICAgICAgICAgICAgICAvKiAwLjA1NiAqLwotc3RhdGljIGNvbnN0IFdvcmQzMiBtaW5BdHRhY2tOcmcgPSAweDAwMDAxZTg0OyAgICAgICAgICAgICAgICAgICAgICAvKiBtaW5pbXVtIGVuZXJneSBmb3IgYXR0YWNrcyAxZSs2ICovCi0KLQotLyoqKioqKioqKioqKioqKioqKiBSb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBJbml0QmxvY2tTd2l0Y2hpbmcKLSogZGVzY3JpcHRpb246ICBpbml0IEJsb2NrIFN3aXRjaGluZyBwYXJhbWV0ZXIuCi0qIHJldHVybnM6ICAgICAgVFJVRSBpZiBzdWNjZXNzCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotV29yZDE2IEluaXRCbG9ja1N3aXRjaGluZyhCTE9DS19TV0lUQ0hJTkdfQ09OVFJPTCAqYmxvY2tTd2l0Y2hpbmdDb250cm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMzIgYml0UmF0ZSwgY29uc3QgV29yZDE2IG5DaGFubmVscykKLXsKLSAgLyogc2VsZWN0IGF0dGFja1JhdGlvICovCi0KLSAgaWYgKChzdWIobkNoYW5uZWxzLDEpPT0wICYmIExfc3ViKGJpdFJhdGUsIDI0MDAwKSA+IDApIHx8Ci0gICAgICAoc3ViKG5DaGFubmVscywxKT4wICYmIGJpdFJhdGUgPiAobkNoYW5uZWxzICogMTYwMDApKSkgewotICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+aW52QXR0YWNrUmF0aW8gPSBpbnZBdHRhY2tSYXRpb0hpZ2hCcjsKLSAgfQotICBlbHNlICB7Ci0gICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5pbnZBdHRhY2tSYXRpbyA9IGludkF0dGFja1JhdGlvTG93QnI7Ci0gIH0KLQotICByZXR1cm4oVFJVRSk7Ci19Ci0KLXN0YXRpYyBXb3JkMTYgc3VnZ2VzdGVkR3JvdXBpbmdUYWJsZVtUUkFOU19GQUNdW01BWF9OT19PRl9HUk9VUFNdID0gewotICAvKiBBdHRhY2sgaW4gV2luZG93IDAgKi8gezEsICAzLCAgMywgIDF9LAotICAvKiBBdHRhY2sgaW4gV2luZG93IDEgKi8gezEsICAxLCAgMywgIDN9LAotICAvKiBBdHRhY2sgaW4gV2luZG93IDIgKi8gezIsICAxLCAgMywgIDJ9LAotICAvKiBBdHRhY2sgaW4gV2luZG93IDMgKi8gezMsICAxLCAgMywgIDF9LAotICAvKiBBdHRhY2sgaW4gV2luZG93IDQgKi8gezMsICAxLCAgMSwgIDN9LAotICAvKiBBdHRhY2sgaW4gV2luZG93IDUgKi8gezMsICAyLCAgMSwgIDJ9LAotICAvKiBBdHRhY2sgaW4gV2luZG93IDYgKi8gezMsICAzLCAgMSwgIDF9LAotICAvKiBBdHRhY2sgaW4gV2luZG93IDcgKi8gezMsICAzLCAgMSwgIDF9Ci19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogQmxvY2tTd2l0Y2hpbmcKLSogZGVzY3JpcHRpb246ICBkZXRlY3QgdGhpcyBmcmFtZSB3aGV0aGVyIHRoZXJlIGlzIGFuIGF0dGFjawotKiByZXR1cm5zOiAgICAgIFRSVUUgaWYgc3VjY2VzcwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVdvcmQxNiBCbG9ja1N3aXRjaGluZyhCTE9DS19TV0lUQ0hJTkdfQ09OVFJPTCAqYmxvY2tTd2l0Y2hpbmdDb250cm9sLAotICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqdGltZVNpZ25hbCwKLQkJCQkJICBXb3JkMzIgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgY2hJbmNyZW1lbnQpCi17Ci0gIFdvcmQzMiBpLCB3OwotICBXb3JkMzIgZW5NMSwgZW5NYXg7Ci0KLSAgLyogUmVzZXQgZ3JvdXBpbmcgaW5mbyAqLwotICBmb3IgKGk9MDsgaTxUUkFOU19GQUM7IGkrKykgewotICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+Z3JvdXBMZW5baV0gPSAwOwotICB9Ci0KLQotICAvKiBTZWFyY2ggZm9yIHBvc2l0aW9uIGFuZCBhbXBsaXR1ZGUgb2YgYXR0YWNrIGluIGxhc3QgZnJhbWUgKDEgd2luZG93cyBkZWxheSkgKi8KLSAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5tYXhXaW5kb3dOcmcgPSBTcmNoTWF4V2l0aEluZGV4KCAmYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdbMF1bQkxPQ0tfU1dJVENIX1dJTkRPV1MtMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkxPQ0tfU1dJVENIX1dJTkRPV1MpOwotCi0gIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrSW5kZXggPSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmxhc3RBdHRhY2tJbmRleDsKLQotICAvKiBTZXQgZ3JvdXBpbmcgaW5mbyAqLwotICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPm5vT2ZHcm91cHMgPSBNQVhfTk9fT0ZfR1JPVVBTOwotCi0gIGZvciAoaT0wOyBpPE1BWF9OT19PRl9HUk9VUFM7IGkrKykgewotICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+Z3JvdXBMZW5baV0gPSBzdWdnZXN0ZWRHcm91cGluZ1RhYmxlW2Jsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrSW5kZXhdW2ldOwotICB9Ci0KLSAgLyogaWYgdGhlIHNhbXBsZXJhdGUgaXMgbGVzcyB0aGFuIDE2MDAwLCBpdCBzaG91bGQgYmUgYWxsIHRoZSBzaG9ydCBibG9jaywgYXZvaWQgcHJlJnBvc3QgZWNobyAqLwotICBpZihzYW1wbGVSYXRlID49IDE2MDAwKSB7Ci0JICAvKiBTYXZlIGN1cnJlbnQgd2luZG93IGVuZXJneSBhcyBsYXN0IHdpbmRvdyBlbmVyZ3kgKi8KLQkgIGZvciAodz0wOyB3PEJMT0NLX1NXSVRDSF9XSU5ET1dTOyB3KyspIHsKLQkJICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ1swXVt3XSA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93TnJnWzFdW3ddOwotCQkgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93TnJnRlswXVt3XSA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93TnJnRlsxXVt3XTsKLQkgIH0KLQotCi0JICAvKiBDYWxjdWxhdGUgdW5maWx0ZXJlZCBhbmQgZmlsdGVyZWQgZW5lcmdpZXMgaW4gc3Vid2luZG93cyBhbmQgY29tYmluZSB0byBzZWdtZW50cyAqLwotCSAgQ2FsY1dpbmRvd0VuZXJneShibG9ja1N3aXRjaGluZ0NvbnRyb2wsIHRpbWVTaWduYWwsIGNoSW5jcmVtZW50LCBCTE9DS19TV0lUQ0hfV0lORE9XX0xFTik7Ci0KLQkgIC8qIHJlc2V0IGF0dGFjayAqLwotCSAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2sgPSBGQUxTRTsKLQotCSAgZW5NYXggPSAwOwotCSAgZW5NMSA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93TnJnRlswXVtCTE9DS19TV0lUQ0hfV0lORE9XUy0xXTsKLQotCSAgZm9yICh3PTA7IHc8QkxPQ0tfU1dJVENIX1dJTkRPV1M7IHcrKykgewotCQkgIFdvcmQzMiBlbk0xX1RtcCwgYWNjV2luZG93TnJnX1RtcCwgd2luZG93TnJnRl9UbXA7Ci0JCSAgV29yZDE2IGVuTTFfU2hmLCBhY2NXaW5kb3dOcmdfU2hmLCB3aW5kb3dOcmdGX1NoZjsKLQotCQkgIGFjY1dpbmRvd05yZ19TaGYgPSBub3JtX2woYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hY2NXaW5kb3dOcmcpOwotCQkgIGVuTTFfU2hmID0gbm9ybV9sKGVuTTEpOwotCQkgIHdpbmRvd05yZ0ZfU2hmID0gbm9ybV9sKGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93TnJnRlsxXVt3XSk7Ci0KLQkJICBhY2NXaW5kb3dOcmdfVG1wID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hY2NXaW5kb3dOcmcgPDwgYWNjV2luZG93TnJnX1NoZjsKLQkJICBlbk0xX1RtcCA9IGVuTTEgPDwgZW5NMV9TaGY7Ci0JCSAgd2luZG93TnJnRl9UbXAgPSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ0ZbMV1bd10gPDwgd2luZG93TnJnRl9TaGY7Ci0KLQkJICAvKiBhIHNsaWRpbmcgYXZlcmFnZSBvZiB0aGUgcHJldmlvdXMgZW5lcmdpZXMgKi8KLQkJICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmFjY1dpbmRvd05yZyA9IChmaXhtdWwob25lTWludXNBY2NXaW5kb3dOcmdGYWMsIGFjY1dpbmRvd05yZ19UbXApID4+IGFjY1dpbmRvd05yZ19TaGYpICsKLQkJCSAgKGZpeG11bChhY2NXaW5kb3dOcmdGYWMsIGVuTTFfVG1wKSA+PiBlbk0xX1NoZik7Ci0KLQotCQkgIC8qIGlmIHRoZSBlbmVyZ3kgd2l0aCB0aGUgcmF0aW8gaXMgYmlnZ2VyIHRoYW4gdGhlIGF2ZXJhZ2UsIGFuZCB0aGUgYXR0YWNrIGFuZCBzaG9ydCBibG9jayAgKi8KLQkJICBpZiAoKGZpeG11bCh3aW5kb3dOcmdGX1RtcCwgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5pbnZBdHRhY2tSYXRpbykgPj4gd2luZG93TnJnRl9TaGYpID4KLQkJCSAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hY2NXaW5kb3dOcmcgKSB7Ci0JCQkJICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFjayA9IFRSVUU7Ci0JCQkJICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmxhc3RBdHRhY2tJbmRleCA9IHc7Ci0JCSAgfQotCQkgIGVuTTEgPSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ0ZbMV1bd107Ci0JCSAgZW5NYXggPSBtYXgoZW5NYXgsIGVuTTEpOwotCSAgfQotCi0JICBpZiAoZW5NYXggPCBtaW5BdHRhY2tOcmcpIHsKLQkJICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFjayA9IEZBTFNFOwotCSAgfQotICB9Ci0gIGVsc2UKLSAgewotCSAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2sgPSBUUlVFOwotICB9Ci0KLSAgLyogQ2hlY2sgaWYgYXR0YWNrIHNwcmVhZHMgb3ZlciBmcmFtZSBib3JkZXIgKi8KLSAgaWYgKCghYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2spICYmIChibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmxhc3RhdHRhY2spKSB7Ci0KLSAgICBpZiAoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2tJbmRleCA9PSBUUkFOU19GQUMtMSkgewotICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2sgPSBUUlVFOwotICAgIH0KLQotICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bGFzdGF0dGFjayA9IEZBTFNFOwotICB9Ci0gIGVsc2UgewotICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bGFzdGF0dGFjayA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrOwotICB9Ci0KLSAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dTZXF1ZW5jZSA9ICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPm5leHR3aW5kb3dTZXF1ZW5jZTsKLQotCi0gIGlmIChibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFjaykgewotICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bmV4dHdpbmRvd1NlcXVlbmNlID0gU0hPUlRfV0lORE9XOwotICB9Ci0gIGVsc2UgewotICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bmV4dHdpbmRvd1NlcXVlbmNlID0gTE9OR19XSU5ET1c7Ci0gIH0KLQotICAvKiB1cGRhdGUgc2hvcnQgYmxvY2sgZ3JvdXAgKi8KLSAgaWYgKGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bmV4dHdpbmRvd1NlcXVlbmNlID09IFNIT1JUX1dJTkRPVykgewotCi0gICAgaWYgKGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93U2VxdWVuY2U9PSBMT05HX1dJTkRPVykgewotICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dTZXF1ZW5jZSA9IFNUQVJUX1dJTkRPVzsKLSAgICB9Ci0KLSAgICBpZiAoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dTZXF1ZW5jZSA9PSBTVE9QX1dJTkRPVykgewotICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dTZXF1ZW5jZSA9IFNIT1JUX1dJTkRPVzsKLSAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bm9PZkdyb3VwcyA9IDM7Ci0gICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmdyb3VwTGVuWzBdID0gMzsKLSAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+Z3JvdXBMZW5bMV0gPSAzOwotICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5ncm91cExlblsyXSA9IDI7Ci0gICAgfQotICB9Ci0KLSAgLyogdXBkYXRlIGJsb2NrIHR5cGUgKi8KLSAgaWYgKGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bmV4dHdpbmRvd1NlcXVlbmNlID09IExPTkdfV0lORE9XKSB7Ci0KLSAgICBpZiAoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dTZXF1ZW5jZSA9PSBTSE9SVF9XSU5ET1cpIHsKLSAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bmV4dHdpbmRvd1NlcXVlbmNlID0gU1RPUF9XSU5ET1c7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuKFRSVUUpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBTcmNoTWF4V2l0aEluZGV4Ci0qIGRlc2NyaXB0aW9uOiAgc2VhcmNoIGZvciB0aGUgYmlnZ2VzdCB2YWx1ZSBpbiBhbiBhcnJheQotKiByZXR1cm5zOiAgICAgIHRoZSBtYXggdmFsdWUKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgV29yZDMyIFNyY2hNYXhXaXRoSW5kZXgoY29uc3QgV29yZDMyIGluW10sIFdvcmQxNiAqaW5kZXgsIFdvcmQxNiBuKQotewotICBXb3JkMzIgbWF4OwotICBXb3JkMzIgaSwgaWR4OwotCi0gIC8qIFNlYXJjaCBtYXhpbXVtIHZhbHVlIGluIGFycmF5IGFuZCByZXR1cm4gaW5kZXggYW5kIHZhbHVlICovCi0gIG1heCA9IDA7Ci0gIGlkeCA9IDA7Ci0KLSAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCi0gICAgaWYgKGluW2krMV0gID4gbWF4KSB7Ci0gICAgICBtYXggPSBpbltpKzFdOwotICAgICAgaWR4ID0gaTsKLSAgICB9Ci0gIH0KLSAgKmluZGV4ID0gaWR4OwotCi0gIHJldHVybihtYXgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogQ2FsY1dpbmRvd0VuZXJneQotKiBkZXNjcmlwdGlvbjogIGNhbGN1bGF0ZSB0aGUgZW5lcmd5IGJlZm9yZSBpaXItZmlsdGVyIGFuZCBhZnRlciBpcnItZmlsdGVyCi0qIHJldHVybnM6ICAgICAgVFJVRSBpZiBzdWNjZXNzCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBBUk1WNUUKLVdvcmQzMiBDYWxjV2luZG93RW5lcmd5KEJMT0NLX1NXSVRDSElOR19DT05UUk9MICpibG9ja1N3aXRjaGluZ0NvbnRyb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnRpbWVTaWduYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgY2hJbmNyZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgd2luZG93TGVuKQotewotICBXb3JkMzIgdywgaSwgdGlkeDsKLSAgV29yZDMyIGFjY3VVRSwgYWNjdUZFOwotICBXb3JkMzIgdGVtcFVuZmlsdGVyZWQ7Ci0gIFdvcmQzMiB0ZW1wRmlsdGVyZWQ7Ci0gIFdvcmQzMiBzdGF0ZXMwLCBzdGF0ZXMxOwotICBXb3JkMzIgQ29lZmYwLCBDb2VmZjE7Ci0KLQotICBzdGF0ZXMwID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5paXJTdGF0ZXNbMF07Ci0gIHN0YXRlczEgPSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmlpclN0YXRlc1sxXTsKLSAgQ29lZmYwID0gaGlQYXNzQ29lZmZbMF07Ci0gIENvZWZmMSA9IGhpUGFzc0NvZWZmWzFdOwotICB0aWR4ID0gMDsKLSAgZm9yICh3PTA7IHcgPCBCTE9DS19TV0lUQ0hfV0lORE9XUzsgdysrKSB7Ci0KLSAgICBhY2N1VUUgPSAwOwotICAgIGFjY3VGRSA9IDA7Ci0KLSAgICBmb3IoaT0wOyBpPHdpbmRvd0xlbjsgaSsrKSB7Ci0JICBXb3JkMzIgYWNjdTEsIGFjY3UyLCBhY2N1MzsKLQkgIFdvcmQzMiBvdXQ7Ci0JICB0ZW1wVW5maWx0ZXJlZCA9IHRpbWVTaWduYWxbdGlkeF07Ci0gICAgICB0aWR4ID0gdGlkeCArIGNoSW5jcmVtZW50OwotCi0JICBhY2N1MSA9IExfbXB5X2xzKENvZWZmMSwgdGVtcFVuZmlsdGVyZWQpOwotCSAgYWNjdTIgPSBmaXhtdWwoIENvZWZmMCwgc3RhdGVzMSApOwotCSAgYWNjdTMgPSBhY2N1MSAtIHN0YXRlczA7Ci0JICBvdXQgPSBhY2N1MyAtIGFjY3UyOwotCi0JICBzdGF0ZXMwID0gYWNjdTE7Ci0JICBzdGF0ZXMxID0gb3V0OwotCi0gICAgICB0ZW1wRmlsdGVyZWQgPSBleHRyYWN0X2gob3V0KTsKLSAgICAgIGFjY3VVRSArPSAodGVtcFVuZmlsdGVyZWQgKiB0ZW1wVW5maWx0ZXJlZCkgPj4gRU5FUkdZX1NISUZUOwotICAgICAgYWNjdUZFICs9ICh0ZW1wRmlsdGVyZWQgKiB0ZW1wRmlsdGVyZWQpID4+IEVORVJHWV9TSElGVDsKLSAgICB9Ci0KLSAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ1sxXVt3XSA9IGFjY3VVRTsKLSAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ0ZbMV1bd10gPSBhY2N1RkU7Ci0KLSAgfQotCi0gIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+aWlyU3RhdGVzWzBdID0gc3RhdGVzMDsKLSAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5paXJTdGF0ZXNbMV0gPSBzdGF0ZXMxOwotCi0gIHJldHVybihUUlVFKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgV29yZDE2IHN5bmNocm9uaXplZEJsb2NrVHlwZVRhYmxlWzRdWzRdID0gewotICAvKiAgICAgICAgICAgICAgICAgTE9OR19XSU5ET1cgICBTVEFSVF9XSU5ET1cgIFNIT1JUX1dJTkRPVyAgU1RPUF9XSU5ET1cgKi8KLSAgLyogTE9OR19XSU5ET1cgICove0xPTkdfV0lORE9XLCAgU1RBUlRfV0lORE9XLCBTSE9SVF9XSU5ET1csIFNUT1BfV0lORE9XfSwKLSAgLyogU1RBUlRfV0lORE9XICove1NUQVJUX1dJTkRPVywgU1RBUlRfV0lORE9XLCBTSE9SVF9XSU5ET1csIFNIT1JUX1dJTkRPV30sCi0gIC8qIFNIT1JUX1dJTkRPVyAqL3tTSE9SVF9XSU5ET1csIFNIT1JUX1dJTkRPVywgU0hPUlRfV0lORE9XLCBTSE9SVF9XSU5ET1d9LAotICAvKiBTVE9QX1dJTkRPVyAgKi97U1RPUF9XSU5ET1csICBTSE9SVF9XSU5ET1csIFNIT1JUX1dJTkRPVywgU1RPUF9XSU5ET1d9Ci19OwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBTeW5jQmxvY2tTd2l0Y2hpbmcKLSogZGVzY3JpcHRpb246ICB1cGRhdGUgYmxvY2sgdHlwZSBhbmQgZ3JvdXAgdmFsdWUKLSogcmV0dXJuczogICAgICBUUlVFIGlmIHN1Y2Nlc3MKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1Xb3JkMTYgU3luY0Jsb2NrU3dpdGNoaW5nKEJMT0NLX1NXSVRDSElOR19DT05UUk9MICpibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBCTE9DS19TV0lUQ0hJTkdfQ09OVFJPTCAqYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBuQ2hhbm5lbHMpCi17Ci0gIFdvcmQxNiBpOwotICBXb3JkMTYgcGF0Y2hUeXBlID0gTE9OR19XSU5ET1c7Ci0KLQotICBpZiAobkNoYW5uZWxzID09IDEpIHsgLyogTW9ubyAqLwotICAgIGlmIChibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT53aW5kb3dTZXF1ZW5jZSAhPSBTSE9SVF9XSU5ET1cpIHsKLSAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPm5vT2ZHcm91cHMgPSAxOwotICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+Z3JvdXBMZW5bMF0gPSAxOwotCi0gICAgICBmb3IgKGk9MTsgaTxUUkFOU19GQUM7IGkrKykgewotICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ncm91cExlbltpXSA9IDA7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGVsc2UgeyAvKiBTdGVyZW8gY29tbW9uIFdpbmRvdyAqLwotICAgIHBhdGNoVHlwZSA9IHN5bmNocm9uaXplZEJsb2NrVHlwZVRhYmxlW3BhdGNoVHlwZV1bYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+d2luZG93U2VxdWVuY2VdOwotICAgIHBhdGNoVHlwZSA9IHN5bmNocm9uaXplZEJsb2NrVHlwZVRhYmxlW3BhdGNoVHlwZV1bYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPndpbmRvd1NlcXVlbmNlXTsKLQotICAgIC8qIFNldCBzeW5jaHJvbml6ZWQgQmxvY2t0eXBlICovCi0gICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+d2luZG93U2VxdWVuY2UgPSBwYXRjaFR5cGU7Ci0gICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPndpbmRvd1NlcXVlbmNlID0gcGF0Y2hUeXBlOwotCi0gICAgLyogU3luY2hyb25pemUgZ3JvdXBpbmcgaW5mbyAqLwotICAgIGlmKHBhdGNoVHlwZSAhPSBTSE9SVF9XSU5ET1cpIHsgLyogTG9uZyBCbG9ja3MgKi8KLSAgICAgIC8qIFNldCBncm91cGluZyBpbmZvICovCi0gICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ub09mR3JvdXBzID0gMTsKLSAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5ub09mR3JvdXBzID0gMTsKLSAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmdyb3VwTGVuWzBdID0gMTsKLSAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5ncm91cExlblswXSA9IDE7Ci0KLSAgICAgIGZvciAoaT0xOyBpPFRSQU5TX0ZBQzsgaSsrKSB7Ci0gICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmdyb3VwTGVuW2ldID0gMDsKLSAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmdyb3VwTGVuW2ldID0gMDsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0KLSAgICAgIGlmIChibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5tYXhXaW5kb3dOcmcgPiBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+bWF4V2luZG93TnJnKSB7Ci0gICAgICAgIC8qIExlZnQgQ2hhbm5lbCB3aW5zICovCi0gICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5ub09mR3JvdXBzID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bm9PZkdyb3VwczsKLSAgICAgICAgZm9yIChpPTA7IGk8VFJBTlNfRkFDOyBpKyspIHsKLSAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+Z3JvdXBMZW5baV0gPSBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ncm91cExlbltpXTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIC8qIFJpZ2h0IENoYW5uZWwgd2lucyAqLwotICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ub09mR3JvdXBzID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPm5vT2ZHcm91cHM7Ci0gICAgICAgIGZvciAoaT0wOyBpPFRSQU5TX0ZBQzsgaSsrKSB7Ci0gICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+Z3JvdXBMZW5baV0gPSBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+Z3JvdXBMZW5baV07Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0gLyplbmRpZiBNb25vIG9yIFN0ZXJlbyAqLwotCi0gIHJldHVybihUUlVFKTsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2NoYW5uZWxfbWFwLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9jaGFubmVsX21hcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjU1MmVkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2NoYW5uZWxfbWFwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQljaGFubmVsX21hcC5jCi0KLQlDb250ZW50OgljaGFubmVsIG1hcHBpbmcgZnVuY3Rpb25zCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJjaGFubmVsX21hcC5oIgotI2luY2x1ZGUgImJpdGVuYy5oIgotI2luY2x1ZGUgInBzeV9jb25zdC5oIgotI2luY2x1ZGUgInFjX2RhdGEuaCIKLQotc3RhdGljIGNvbnN0IFdvcmQxNiBtYXhDaGFubmVsQml0cyA9IE1BWEJJVFNfQ09FRjsKLQotc3RhdGljIFdvcmQxNiBpbml0RWxlbWVudChFTEVNRU5UX0lORk8qIGVsSW5mbywgRUxFTUVOVF9UWVBFIGVsVHlwZSkKLXsKLSAgV29yZDE2IGVycm9yPTA7Ci0KLSAgZWxJbmZvLT5lbFR5cGU9ZWxUeXBlOwotCi0gIHN3aXRjaChlbEluZm8tPmVsVHlwZSkgewotCi0gICAgY2FzZSBJRF9TQ0U6Ci0gICAgICBlbEluZm8tPm5DaGFubmVsc0luRWw9MTsKLQotICAgICAgZWxJbmZvLT5DaGFubmVsSW5kZXhbMF09MDsKLQotICAgICAgZWxJbmZvLT5pbnN0YW5jZVRhZz0wOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIElEX0NQRToKLQotICAgICAgZWxJbmZvLT5uQ2hhbm5lbHNJbkVsPTI7Ci0KLSAgICAgIGVsSW5mby0+Q2hhbm5lbEluZGV4WzBdPTA7Ci0gICAgICBlbEluZm8tPkNoYW5uZWxJbmRleFsxXT0xOwotCi0gICAgICBlbEluZm8tPmluc3RhbmNlVGFnPTA7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBlcnJvcj0xOwotICB9Ci0KLSAgcmV0dXJuIGVycm9yOwotfQotCi0KLVdvcmQxNiBJbml0RWxlbWVudEluZm8gKFdvcmQxNiBuQ2hhbm5lbHMsIEVMRU1FTlRfSU5GTyogZWxJbmZvKQotewotICBXb3JkMTYgZXJyb3I7Ci0gIGVycm9yID0gMDsKLQotICBzd2l0Y2gobkNoYW5uZWxzKSB7Ci0KLSAgICBjYXNlIDE6Ci0gICAgICBpbml0RWxlbWVudChlbEluZm8sIElEX1NDRSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMjoKLSAgICAgIGluaXRFbGVtZW50KGVsSW5mbywgSURfQ1BFKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGVycm9yPTQ7Ci0gIH0KLQotICByZXR1cm4gZXJyb3I7Ci19Ci0KLQotV29yZDE2IEluaXRFbGVtZW50Qml0cyhFTEVNRU5UX0JJVFMgKmVsZW1lbnRCaXRzLAotICAgICAgICAgICAgICAgICAgICAgICBFTEVNRU5UX0lORk8gZWxJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgYml0cmF0ZVRvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGF2ZXJhZ2VCaXRzVG90LAotICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgc3RhdGljQml0c1RvdCkKLXsKLSAgV29yZDE2IGVycm9yOwotICBlcnJvciA9IDA7Ci0KLSAgIHN3aXRjaChlbEluZm8ubkNoYW5uZWxzSW5FbCkgewotICAgIGNhc2UgMToKLSAgICAgIGVsZW1lbnRCaXRzLT5jaEJpdHJhdGUgPSBiaXRyYXRlVG90OwotICAgICAgZWxlbWVudEJpdHMtPmF2ZXJhZ2VCaXRzID0gYXZlcmFnZUJpdHNUb3QgLSBzdGF0aWNCaXRzVG90OwotICAgICAgZWxlbWVudEJpdHMtPm1heEJpdHMgPSBtYXhDaGFubmVsQml0czsKLQotICAgICAgZWxlbWVudEJpdHMtPm1heEJpdFJlc0JpdHMgPSBtYXhDaGFubmVsQml0cyAtIGF2ZXJhZ2VCaXRzVG90OwotICAgICAgZWxlbWVudEJpdHMtPm1heEJpdFJlc0JpdHMgPSBlbGVtZW50Qml0cy0+bWF4Qml0UmVzQml0cyAtIChlbGVtZW50Qml0cy0+bWF4Qml0UmVzQml0cyAmIDcpOwotICAgICAgZWxlbWVudEJpdHMtPmJpdFJlc0xldmVsID0gZWxlbWVudEJpdHMtPm1heEJpdFJlc0JpdHM7Ci0gICAgICBlbGVtZW50Qml0cy0+cmVsYXRpdmVCaXRzICA9IDB4NDAwMDsgLyogMS4wZi8yICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgMjoKLSAgICAgIGVsZW1lbnRCaXRzLT5jaEJpdHJhdGUgICA9IGJpdHJhdGVUb3QgPj4gMTsKLSAgICAgIGVsZW1lbnRCaXRzLT5hdmVyYWdlQml0cyA9IGF2ZXJhZ2VCaXRzVG90IC0gc3RhdGljQml0c1RvdDsKLSAgICAgIGVsZW1lbnRCaXRzLT5tYXhCaXRzICAgICA9IG1heENoYW5uZWxCaXRzIDw8IDE7Ci0KLSAgICAgIGVsZW1lbnRCaXRzLT5tYXhCaXRSZXNCaXRzID0gKG1heENoYW5uZWxCaXRzIDw8IDEpIC0gYXZlcmFnZUJpdHNUb3Q7Ci0gICAgICBlbGVtZW50Qml0cy0+bWF4Qml0UmVzQml0cyA9IGVsZW1lbnRCaXRzLT5tYXhCaXRSZXNCaXRzIC0gKGVsZW1lbnRCaXRzLT5tYXhCaXRSZXNCaXRzICYgNyk7Ci0gICAgICBlbGVtZW50Qml0cy0+Yml0UmVzTGV2ZWwgPSBlbGVtZW50Qml0cy0+bWF4Qml0UmVzQml0czsKLSAgICAgIGVsZW1lbnRCaXRzLT5yZWxhdGl2ZUJpdHMgPSAweDQwMDA7IC8qIDEuMGYvMiAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgZXJyb3IgPSAxOwotICB9Ci0gIHJldHVybiBlcnJvcjsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2R5bl9iaXRzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9keW5fYml0cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzViNDhmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2R5bl9iaXRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NTEgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQlkeW5fYml0cy5jCi0KLQlDb250ZW50OglOb2lzZWxlc3MgY29kZXIgbW9kdWxlIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIExPR19UQUcgIk5vaXNlbGVzc0NvZGVyIgotCi0jaW5jbHVkZSAibG9nL2xvZy5oIgotCi0jaW5jbHVkZSAiYWFjX3JvbS5oIgotI2luY2x1ZGUgImR5bl9iaXRzLmgiCi0jaW5jbHVkZSAiYml0X2NudC5oIgotI2luY2x1ZGUgInBzeV9jb25zdC5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogYnVpbGRCaXRMb29rVXAKLSogZGVzY3JpcHRpb246ICBjb3VudCBiaXRzIHVzaW5nIGFsbCBwb3NzaWJsZSB0YWJsZXMKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQKLWJ1aWxkQml0TG9va1VwKGNvbnN0IFdvcmQxNiAqcXVhbnRTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBtYXhTZmIsCi0gICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgKnNmYk9mZnNldCwKLSAgICAgICAgICAgICAgIGNvbnN0IFVXb3JkMTYgKnNmYk1heCwKLSAgICAgICAgICAgICAgIFdvcmQxNiBiaXRMb29rVXBbTUFYX1NGQl9MT05HXVtDT0RFX0JPT0tfRVNDX05EWCArIDFdLAotICAgICAgICAgICAgICAgU0VDVElPTl9JTkZPICogc2VjdGlvbkluZm8pCi17Ci0gIFdvcmQzMiBpOwotCi0gIGZvciAoaT0wOyBpPG1heFNmYjsgaSsrKSB7Ci0gICAgV29yZDE2IHNmYldpZHRoLCBtYXhWYWw7Ci0KLSAgICBzZWN0aW9uSW5mb1tpXS5zZmJDbnQgPSAxOwotICAgIHNlY3Rpb25JbmZvW2ldLnNmYlN0YXJ0ID0gaTsKLSAgICBzZWN0aW9uSW5mb1tpXS5zZWN0aW9uQml0cyA9IElOVkFMSURfQklUQ09VTlQ7Ci0gICAgc2VjdGlvbkluZm9baV0uY29kZUJvb2sgPSAtMTsKLSAgICBzZmJXaWR0aCA9IHNmYk9mZnNldFtpICsgMV0gLSBzZmJPZmZzZXRbaV07Ci0gICAgbWF4VmFsID0gc2ZiTWF4W2ldOwotICAgIGJpdENvdW50KHF1YW50U3BlY3RydW0gKyBzZmJPZmZzZXRbaV0sIHNmYldpZHRoLCBtYXhWYWwsIGJpdExvb2tVcFtpXSk7Ci0gIH0KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogZmluZEJlc3RCb29rCi0qIGRlc2NyaXB0aW9uOiAgZXNzZW50aWFsIGhlbHBlciBmdW5jdGlvbnMKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIFdvcmQxNgotZmluZEJlc3RCb29rKGNvbnN0IFdvcmQxNiAqYmMsIFdvcmQxNiAqYm9vaykKLXsKLSAgV29yZDMyIG1pbkJpdHMsIGo7Ci0gIG1pbkJpdHMgPSBJTlZBTElEX0JJVENPVU5UOwotCi0gIGZvciAoaj0wOyBqPD1DT0RFX0JPT0tfRVNDX05EWDsgaisrKSB7Ci0KLSAgICBpZiAoYmNbal0gPCBtaW5CaXRzKSB7Ci0gICAgICBtaW5CaXRzID0gYmNbal07Ci0gICAgICAqYm9vayA9IGo7Ci0gICAgfQotICB9Ci0gIHJldHVybiBleHRyYWN0X2wobWluQml0cyk7Ci19Ci0KLXN0YXRpYyBXb3JkMTYKLWZpbmRNaW5NZXJnZUJpdHMoY29uc3QgV29yZDE2ICpiYzEsIGNvbnN0IFdvcmQxNiAqYmMyKQotewotICBXb3JkMzIgbWluQml0cywgaiwgc3VtOwotICBtaW5CaXRzID0gSU5WQUxJRF9CSVRDT1VOVDsKLQotICBmb3IgKGo9MDsgajw9Q09ERV9CT09LX0VTQ19ORFg7IGorKykgewotICAgIHN1bSA9IGJjMVtqXSArIGJjMltqXTsKLSAgICBpZiAoc3VtIDwgbWluQml0cykgewotICAgICAgbWluQml0cyA9IHN1bTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGV4dHJhY3RfbChtaW5CaXRzKTsKLX0KLQotc3RhdGljIHZvaWQKLW1lcmdlQml0TG9va1VwKFdvcmQxNiAqYmMxLCBjb25zdCBXb3JkMTYgKmJjMikKLXsKLSAgV29yZDMyIGo7Ci0KLSAgZm9yIChqPTA7IGo8PUNPREVfQk9PS19FU0NfTkRYOyBqKyspIHsKLSAgICBiYzFbal0gPSBtaW4oYmMxW2pdICsgYmMyW2pdLCBJTlZBTElEX0JJVENPVU5UKTsKLSAgfQotfQotCi1zdGF0aWMgV29yZDE2Ci1maW5kTWF4TWVyZ2UoY29uc3QgV29yZDE2IG1lcmdlR2Fpbkxvb2tVcFtNQVhfU0ZCX0xPTkddLAotICAgICAgICAgICAgIGNvbnN0IFNFQ1RJT05fSU5GTyAqc2VjdGlvbkluZm8sCi0gICAgICAgICAgICAgY29uc3QgV29yZDE2IG1heFNmYiwgV29yZDE2ICptYXhOZHgpCi17Ci0gIFdvcmQzMiBpLCBtYXhNZXJnZUdhaW47Ci0gIG1heE1lcmdlR2FpbiA9IDA7Ci0KLSAgZm9yIChpPTA7IGkrc2VjdGlvbkluZm9baV0uc2ZiQ250IDwgbWF4U2ZiOyBpICs9IHNlY3Rpb25JbmZvW2ldLnNmYkNudCkgewotCi0gICAgaWYgKG1lcmdlR2Fpbkxvb2tVcFtpXSA+IG1heE1lcmdlR2FpbikgewotICAgICAgbWF4TWVyZ2VHYWluID0gbWVyZ2VHYWluTG9va1VwW2ldOwotICAgICAgKm1heE5keCA9IGk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBleHRyYWN0X2wobWF4TWVyZ2VHYWluKTsKLX0KLQotCi0KLXN0YXRpYyBXb3JkMTYKLUNhbGNNZXJnZUdhaW4oY29uc3QgU0VDVElPTl9JTkZPICpzZWN0aW9uSW5mbywKLSAgICAgICAgICAgICAgV29yZDE2IGJpdExvb2tVcFtNQVhfU0ZCX0xPTkddW0NPREVfQk9PS19FU0NfTkRYICsgMV0sCi0gICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAqc2lkZUluZm9UYWIsCi0gICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBuZHgxLAotICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgbmR4MikKLXsKLSAgV29yZDMyIFNwbGl0Qml0czsKLSAgV29yZDMyIE1lcmdlQml0czsKLSAgV29yZDMyIE1lcmdlR2FpbjsKLQotICAvKgotICAgIEJpdCBhbW91bnQgZm9yIHNwbGl0dGVkIHNlY3Rpb25zCi0gICovCi0gIFNwbGl0Qml0cyA9IHNlY3Rpb25JbmZvW25keDFdLnNlY3Rpb25CaXRzICsgc2VjdGlvbkluZm9bbmR4Ml0uc2VjdGlvbkJpdHM7Ci0KLSAgTWVyZ2VCaXRzID0gc2lkZUluZm9UYWJbc2VjdGlvbkluZm9bbmR4MV0uc2ZiQ250ICsgc2VjdGlvbkluZm9bbmR4Ml0uc2ZiQ250XSArCi0gICAgICAgICAgICAgICAgICBmaW5kTWluTWVyZ2VCaXRzKGJpdExvb2tVcFtuZHgxXSwgYml0TG9va1VwW25keDJdKTsKLSAgTWVyZ2VHYWluID0gKFNwbGl0Qml0cyAtIE1lcmdlQml0cyk7Ci0KLSAgcmV0dXJuIGV4dHJhY3RfbChNZXJnZUdhaW4pOwotfQotCi0vKgotICBzZWN0aW9uaW5nIFN0YWdlIDA6ZmluZCBtaW5pbXVtIGNvZGJvb2tzCi0qLwotCi1zdGF0aWMgdm9pZAotZ21TdGFnZTAoU0VDVElPTl9JTkZPICogc2VjdGlvbkluZm8sCi0gICAgICAgICBXb3JkMTYgYml0TG9va1VwW01BWF9TRkJfTE9OR11bQ09ERV9CT09LX0VTQ19ORFggKyAxXSwKLSAgICAgICAgIGNvbnN0IFdvcmQxNiBtYXhTZmIpCi17Ci0gIFdvcmQzMiBpOwotCi0gIGZvciAoaT0wOyBpPG1heFNmYjsgaSsrKSB7Ci0gICAgLyogU2lkZS1JbmZvIGJpdHMgd2lsbCBiZSBjYWxjdWxhdGVkIGluIFN0YWdlIDEhICAqLwotCi0gICAgaWYgKHNlY3Rpb25JbmZvW2ldLnNlY3Rpb25CaXRzID09IElOVkFMSURfQklUQ09VTlQpIHsKLSAgICAgIHNlY3Rpb25JbmZvW2ldLnNlY3Rpb25CaXRzID0gZmluZEJlc3RCb29rKGJpdExvb2tVcFtpXSwgJihzZWN0aW9uSW5mb1tpXS5jb2RlQm9vaykpOwotICAgIH0KLSAgfQotfQotCi0vKgotICBzZWN0aW9uaW5nIFN0YWdlIDE6bWVyZ2UgYWxsIGNvbm5lY3RlZCByZWdpb25zIHdpdGggdGhlIHNhbWUgY29kZSBib29rIGFuZAotICBjYWxjdWxhdGUgc2lkZSBpbmZvCi0qLwotCi1zdGF0aWMgdm9pZAotZ21TdGFnZTEoU0VDVElPTl9JTkZPICogc2VjdGlvbkluZm8sCi0gICAgICAgICBXb3JkMTYgYml0TG9va1VwW01BWF9TRkJfTE9OR11bQ09ERV9CT09LX0VTQ19ORFggKyAxXSwKLSAgICAgICAgIGNvbnN0IFdvcmQxNiBtYXhTZmIsCi0gICAgICAgICBjb25zdCBXb3JkMTYgKnNpZGVJbmZvVGFiKQotewotICBTRUNUSU9OX0lORk8gKiBzZWN0aW9uSW5mb19zOwotICBTRUNUSU9OX0lORk8gKiBzZWN0aW9uSW5mb19lOwotICBXb3JkMzIgbWVyZ2VTdGFydCwgbWVyZ2VFbmQ7Ci0gIG1lcmdlU3RhcnQgPSAwOwotCi0gIGRvIHsKLQotICAgIHNlY3Rpb25JbmZvX3MgPSBzZWN0aW9uSW5mbyArIG1lcmdlU3RhcnQ7Ci0JZm9yIChtZXJnZUVuZD1tZXJnZVN0YXJ0KzE7IG1lcmdlRW5kPG1heFNmYjsgbWVyZ2VFbmQrKykgewotICAgICAgc2VjdGlvbkluZm9fZSA9IHNlY3Rpb25JbmZvICsgbWVyZ2VFbmQ7Ci0gICAgICBpZiAoc2VjdGlvbkluZm9fcy0+Y29kZUJvb2sgIT0gc2VjdGlvbkluZm9fZS0+Y29kZUJvb2spCi0gICAgICAgIGJyZWFrOwotICAgICAgc2VjdGlvbkluZm9fcy0+c2ZiQ250ICs9IDE7Ci0gICAgICBzZWN0aW9uSW5mb19zLT5zZWN0aW9uQml0cyArPSBzZWN0aW9uSW5mb19lLT5zZWN0aW9uQml0czsKLQotICAgICAgbWVyZ2VCaXRMb29rVXAoYml0TG9va1VwW21lcmdlU3RhcnRdLCBiaXRMb29rVXBbbWVyZ2VFbmRdKTsKLSAgICB9Ci0KLSAgICBzZWN0aW9uSW5mb19zLT5zZWN0aW9uQml0cyArPSBzaWRlSW5mb1RhYltzZWN0aW9uSW5mb19zLT5zZmJDbnRdOwotICAgIHNlY3Rpb25JbmZvW21lcmdlRW5kIC0gMV0uc2ZiU3RhcnQgPSBzZWN0aW9uSW5mb19zLT5zZmJTdGFydDsgICAgICAvKiBzcGVlZCB1cCBwcmV2IHNlYXJjaCAqLwotCi0gICAgbWVyZ2VTdGFydCA9IG1lcmdlRW5kOwotCi0KLSAgfSB3aGlsZSAobWVyZ2VTdGFydCAtIG1heFNmYiA8IDApOwotfQotCi0vKgotICBzZWN0aW9uaW5nIFN0YWdlIDI6Z3JlZWR5IG1lcmdlIGFsZ29yaXRobSwgbWVyZ2UgY29ubmVjdGVkIHNlY3Rpb25zIHdpdGgKLSAgbWF4aW11bSBiaXQgZ2FpbiB1bnRpbCBubyBtb3JlIGdhaW4gaXMgcG9zc2libGUKLSovCi1zdGF0aWMgdm9pZAotZ21TdGFnZTIoU0VDVElPTl9JTkZPICpzZWN0aW9uSW5mbywKLSAgICAgICAgIFdvcmQxNiBtZXJnZUdhaW5Mb29rVXBbTUFYX1NGQl9MT05HXSwKLSAgICAgICAgIFdvcmQxNiBiaXRMb29rVXBbTUFYX1NGQl9MT05HXVtDT0RFX0JPT0tfRVNDX05EWCArIDFdLAotICAgICAgICAgY29uc3QgV29yZDE2IG1heFNmYiwKLSAgICAgICAgIGNvbnN0IFdvcmQxNiAqc2lkZUluZm9UYWIpCi17Ci0gIFdvcmQxNiBpOwotCi0gIGZvciAoaT0wOyBpK3NlY3Rpb25JbmZvW2ldLnNmYkNudDxtYXhTZmI7IGkrPXNlY3Rpb25JbmZvW2ldLnNmYkNudCkgewotICAgIG1lcmdlR2Fpbkxvb2tVcFtpXSA9IENhbGNNZXJnZUdhaW4oc2VjdGlvbkluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRMb29rVXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWRlSW5mb1RhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaSArIHNlY3Rpb25JbmZvW2ldLnNmYkNudCkpOwotICB9Ci0KLSAgd2hpbGUgKFRSVUUpIHsKLSAgICBXb3JkMTYgbWF4TWVyZ2VHYWluLCBtYXhOZHggPSAwLCBtYXhOZHhOZXh0LCBtYXhOZHhMYXN0OwotCi0gICAgbWF4TWVyZ2VHYWluID0gZmluZE1heE1lcmdlKG1lcmdlR2Fpbkxvb2tVcCwgc2VjdGlvbkluZm8sIG1heFNmYiwgJm1heE5keCk7Ci0KLQotICAgIGlmIChtYXhNZXJnZUdhaW4gPD0gMCkKLSAgICAgIGJyZWFrOwotCi0KLSAgICBtYXhOZHhOZXh0ID0gbWF4TmR4ICsgc2VjdGlvbkluZm9bbWF4TmR4XS5zZmJDbnQ7Ci0KLSAgICBzZWN0aW9uSW5mb1ttYXhOZHhdLnNmYkNudCA9IHNlY3Rpb25JbmZvW21heE5keF0uc2ZiQ250ICsgc2VjdGlvbkluZm9bbWF4TmR4TmV4dF0uc2ZiQ250OwotICAgIHNlY3Rpb25JbmZvW21heE5keF0uc2VjdGlvbkJpdHMgPSBzZWN0aW9uSW5mb1ttYXhOZHhdLnNlY3Rpb25CaXRzICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWN0aW9uSW5mb1ttYXhOZHhOZXh0XS5zZWN0aW9uQml0cyAtIG1heE1lcmdlR2Fpbik7Ci0KLQotICAgIG1lcmdlQml0TG9va1VwKGJpdExvb2tVcFttYXhOZHhdLCBiaXRMb29rVXBbbWF4TmR4TmV4dF0pOwotCi0KLSAgICBpZiAobWF4TmR4ICE9IDApIHsKLSAgICAgIG1heE5keExhc3QgPSBzZWN0aW9uSW5mb1ttYXhOZHggLSAxXS5zZmJTdGFydDsKLSAgICAgIG1lcmdlR2Fpbkxvb2tVcFttYXhOZHhMYXN0XSA9IENhbGNNZXJnZUdhaW4oc2VjdGlvbkluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdExvb2tVcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lkZUluZm9UYWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heE5keExhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heE5keCk7Ci0gICAgfQotICAgIG1heE5keE5leHQgPSBtYXhOZHggKyBzZWN0aW9uSW5mb1ttYXhOZHhdLnNmYkNudDsKLQotICAgIHNlY3Rpb25JbmZvW21heE5keE5leHQgLSAxXS5zZmJTdGFydCA9IHNlY3Rpb25JbmZvW21heE5keF0uc2ZiU3RhcnQ7Ci0KLQotICAgIGlmIChtYXhOZHhOZXh0IC0gbWF4U2ZiIDwgMCkgewotICAgICAgbWVyZ2VHYWluTG9va1VwW21heE5keF0gPSBDYWxjTWVyZ2VHYWluKHNlY3Rpb25JbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdExvb2tVcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWRlSW5mb1RhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhOZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4TmR4TmV4dCk7Ci0gICAgfQotICB9Ci19Ci0KLS8qCi0gIGNvdW50IGJpdHMgdXNlZCBieSB0aGUgbm9pc2VsZXNzIGNvZGVyCi0qLwotc3RhdGljIHZvaWQKLW5vaXNlbGVzc0NvdW50ZXIoU0VDVElPTl9EQVRBICpzZWN0aW9uRGF0YSwKLSAgICAgICAgICAgICAgICAgV29yZDE2IG1lcmdlR2Fpbkxvb2tVcFtNQVhfU0ZCX0xPTkddLAotICAgICAgICAgICAgICAgICBXb3JkMTYgYml0TG9va1VwW01BWF9TRkJfTE9OR11bQ09ERV9CT09LX0VTQ19ORFggKyAxXSwKLSAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICpxdWFudFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICBjb25zdCBVV29yZDE2ICptYXhWYWx1ZUluU2ZiLAotICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgKnNmYk9mZnNldCwKLSAgICAgICAgICAgICAgICAgY29uc3QgV29yZDMyIGJsb2NrVHlwZSkKLXsKLSAgV29yZDMyIGdycE5keCwgaTsKLSAgY29uc3QgV29yZDE2ICpzaWRlSW5mb1RhYiA9IE5VTEw7Ci0gIFNFQ1RJT05fSU5GTyAqc2VjdGlvbkluZm87Ci0KLSAgLyoKLSAgICB1c2UgYXBwcm9wcmlhdGUgc2lkZSBpbmZvIHRhYmxlCi0gICovCi0gIHN3aXRjaCAoYmxvY2tUeXBlKQotICB7Ci0gICAgY2FzZSBMT05HX1dJTkRPVzoKLSAgICBjYXNlIFNUQVJUX1dJTkRPVzoKLSAgICBjYXNlIFNUT1BfV0lORE9XOgotICAgICAgc2lkZUluZm9UYWIgPSBzaWRlSW5mb1RhYkxvbmc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNIT1JUX1dJTkRPVzoKLSAgICAgIHNpZGVJbmZvVGFiID0gc2lkZUluZm9UYWJTaG9ydDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBBTE9HRSgiaW52YWxpZCBibG9ja1R5cGU6ICVkIiwgYmxvY2tUeXBlKTsKLSAgICAgIHJldHVybjsKLSAgfQotCi0KLSAgc2VjdGlvbkRhdGEtPm5vT2ZTZWN0aW9ucyA9IDA7Ci0gIHNlY3Rpb25EYXRhLT5odWZmbWFuQml0cyA9IDA7Ci0gIHNlY3Rpb25EYXRhLT5zaWRlSW5mb0JpdHMgPSAwOwotCi0KLSAgaWYgKHNlY3Rpb25EYXRhLT5tYXhTZmJQZXJHcm91cCA9PSAwKQotICAgIHJldHVybjsKLQotICAvKgotICAgIGxvb3AgdHJvdWdoIGdyb3VwcwotICAqLwotICBmb3IgKGdycE5keD0wOyBncnBOZHg8c2VjdGlvbkRhdGEtPnNmYkNudDsgZ3JwTmR4Kz1zZWN0aW9uRGF0YS0+c2ZiUGVyR3JvdXApIHsKLQotICAgIHNlY3Rpb25JbmZvID0gc2VjdGlvbkRhdGEtPnNlY3Rpb25JbmZvICsgc2VjdGlvbkRhdGEtPm5vT2ZTZWN0aW9uczsKLQotICAgIGJ1aWxkQml0TG9va1VwKHF1YW50U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgc2VjdGlvbkRhdGEtPm1heFNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgICAgIHNmYk9mZnNldCArIGdycE5keCwKLSAgICAgICAgICAgICAgICAgICBtYXhWYWx1ZUluU2ZiICsgZ3JwTmR4LAotICAgICAgICAgICAgICAgICAgIGJpdExvb2tVcCwKLSAgICAgICAgICAgICAgICAgICBzZWN0aW9uSW5mbyk7Ci0KLSAgICAvKgotICAgICAgIDAuU3RhZ2UKLSAgICAqLwotICAgIGdtU3RhZ2UwKHNlY3Rpb25JbmZvLCBiaXRMb29rVXAsIHNlY3Rpb25EYXRhLT5tYXhTZmJQZXJHcm91cCk7Ci0KLSAgICAvKgotICAgICAgIDEuU3RhZ2UKLSAgICAqLwotICAgIGdtU3RhZ2UxKHNlY3Rpb25JbmZvLCBiaXRMb29rVXAsIHNlY3Rpb25EYXRhLT5tYXhTZmJQZXJHcm91cCwgc2lkZUluZm9UYWIpOwotCi0KLSAgICAvKgotICAgICAgIDIuU3RhZ2UKLSAgICAqLwotICAgIGdtU3RhZ2UyKHNlY3Rpb25JbmZvLAotICAgICAgICAgICAgIG1lcmdlR2Fpbkxvb2tVcCwKLSAgICAgICAgICAgICBiaXRMb29rVXAsCi0gICAgICAgICAgICAgc2VjdGlvbkRhdGEtPm1heFNmYlBlckdyb3VwLAotICAgICAgICAgICAgIHNpZGVJbmZvVGFiKTsKLQotCi0gICAgLyoKLSAgICAgICBjb21wcmVzcyBvdXRwdXQsIGNhbGN1bGF0ZSB0b3RhbCBodWZmIGFuZCBzaWRlIGJpdHMKLSAgICAqLwotICAgIGZvciAoaT0wOyBpPHNlY3Rpb25EYXRhLT5tYXhTZmJQZXJHcm91cDsgaSs9c2VjdGlvbkluZm9baV0uc2ZiQ250KSB7Ci0gICAgICBmaW5kQmVzdEJvb2soYml0TG9va1VwW2ldLCAmKHNlY3Rpb25JbmZvW2ldLmNvZGVCb29rKSk7Ci0gICAgICBzZWN0aW9uSW5mb1tpXS5zZmJTdGFydCA9IHNlY3Rpb25JbmZvW2ldLnNmYlN0YXJ0ICsgZ3JwTmR4OwotCi0gICAgICBzZWN0aW9uRGF0YS0+aHVmZm1hbkJpdHMgPSAoc2VjdGlvbkRhdGEtPmh1ZmZtYW5CaXRzICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VjdGlvbkluZm9baV0uc2VjdGlvbkJpdHMgLSBzaWRlSW5mb1RhYltzZWN0aW9uSW5mb1tpXS5zZmJDbnRdKSk7Ci0gICAgICBzZWN0aW9uRGF0YS0+c2lkZUluZm9CaXRzID0gKHNlY3Rpb25EYXRhLT5zaWRlSW5mb0JpdHMgKyBzaWRlSW5mb1RhYltzZWN0aW9uSW5mb1tpXS5zZmJDbnRdKTsKLSAgICAgIHNlY3Rpb25EYXRhLT5zZWN0aW9uSW5mb1tzZWN0aW9uRGF0YS0+bm9PZlNlY3Rpb25zXSA9IHNlY3Rpb25JbmZvW2ldOwotICAgICAgc2VjdGlvbkRhdGEtPm5vT2ZTZWN0aW9ucyA9IHNlY3Rpb25EYXRhLT5ub09mU2VjdGlvbnMgKyAxOwotICAgIH0KLSAgfQotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9ubmFtZTogc2NmQ291bnQKLSogcmV0dXJucyAgICAgOiAtLS0KLSogZGVzY3JpcHRpb24gOiBjb3VudCBiaXRzIHVzZWQgYnkgc2NhbGVmYWN0b3JzLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBzY2ZDb3VudChjb25zdCBXb3JkMTYgKnNjYWxlZmFjR2FpbiwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVXb3JkMTYgKm1heFZhbHVlSW5TZmIsCi0gICAgICAgICAgICAgICAgICAgICBTRUNUSU9OX0RBVEEgKiBzZWN0aW9uRGF0YSkKLQotewotICBTRUNUSU9OX0lORk8gKnBzZWN0aW9uSW5mbzsKLSAgU0VDVElPTl9JTkZPICpwc2VjdGlvbkluZm9tOwotCi0gIC8qIGNvdW50ZXIgKi8KLSAgV29yZDMyIGkgPSAwOyAvKiBzZWN0aW9uIGNvdW50ZXIgKi8KLSAgV29yZDMyIGogPSAwOyAvKiBzZmIgY291bnRlciAqLwotICBXb3JkMzIgayA9IDA7IC8qIGN1cnJlbnQgc2VjdGlvbiBhdXhpbGlhcnkgY291bnRlciAqLwotICBXb3JkMzIgbSA9IDA7IC8qIG90aGVyIHNlY3Rpb24gYXV4aWxpYXJ5IGNvdW50ZXIgKi8KLSAgV29yZDMyIG4gPSAwOyAvKiBvdGhlciBzZmIgYXV4aWxpYXJ5IGNvdW50ZXIgKi8KLQotICAvKiBmdXJ0aGVyIHZhcmlhYmxlcyAqLwotICBXb3JkMzIgbGFzdFZhbFNjZiAgICAgPSAwOwotICBXb3JkMzIgZGVsdGFTY2YgICAgICAgPSAwOwotICBGbGFnIGZvdW5kICAgICAgICAgICAgPSAwOwotICBXb3JkMzIgc2NmU2tpcENvdW50ZXIgPSAwOwotCi0KLSAgc2VjdGlvbkRhdGEtPnNjYWxlZmFjQml0cyA9IDA7Ci0KLQotICBpZiAoc2NhbGVmYWNHYWluID09IE5VTEwpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBsYXN0VmFsU2NmID0gMDsKLSAgc2VjdGlvbkRhdGEtPmZpcnN0U2NmID0gMDsKLQotICBwc2VjdGlvbkluZm8gPSBzZWN0aW9uRGF0YS0+c2VjdGlvbkluZm87Ci0gIGZvciAoaT0wOyBpPHNlY3Rpb25EYXRhLT5ub09mU2VjdGlvbnM7IGkrKykgewotCi0gICAgaWYgKHBzZWN0aW9uSW5mby0+Y29kZUJvb2sgIT0gQ09ERV9CT09LX1pFUk9fTk8pIHsKLSAgICAgIHNlY3Rpb25EYXRhLT5maXJzdFNjZiA9IHBzZWN0aW9uSW5mby0+c2ZiU3RhcnQ7Ci0gICAgICBsYXN0VmFsU2NmID0gc2NhbGVmYWNHYWluW3NlY3Rpb25EYXRhLT5maXJzdFNjZl07Ci0gICAgICBicmVhazsKLSAgICB9Ci0JcHNlY3Rpb25JbmZvICs9IDE7Ci0gIH0KLQotICBwc2VjdGlvbkluZm8gPSBzZWN0aW9uRGF0YS0+c2VjdGlvbkluZm87Ci0gIGZvciAoaT0wOyBpPHNlY3Rpb25EYXRhLT5ub09mU2VjdGlvbnM7IGkrKywgcHNlY3Rpb25JbmZvICs9IDEpIHsKLQotICAgIGlmIChwc2VjdGlvbkluZm8tPmNvZGVCb29rICE9IENPREVfQk9PS19aRVJPX05PCi0gICAgICAgICYmIHBzZWN0aW9uSW5mby0+Y29kZUJvb2sgIT0gQ09ERV9CT09LX1BOU19OTykgewotICAgICAgZm9yIChqID0gcHNlY3Rpb25JbmZvLT5zZmJTdGFydDsKLSAgICAgICAgICAgaiA8IChwc2VjdGlvbkluZm8tPnNmYlN0YXJ0ICsgcHNlY3Rpb25JbmZvLT5zZmJDbnQpOyBqKyspIHsKLSAgICAgICAgLyogY2hlY2sgaWYgd2UgY2FuIHJlcGVhdCB0aGUgbGFzdCB2YWx1ZSB0byBzYXZlIGJpdHMgKi8KLQotICAgICAgICBpZiAobWF4VmFsdWVJblNmYltqXSA9PSAwKSB7Ci0gICAgICAgICAgZm91bmQgPSAwOwotCi0gICAgICAgICAgaWYgKHNjZlNraXBDb3VudGVyID09IDApIHsKLSAgICAgICAgICAgIC8qIGVuZCBvZiBzZWN0aW9uICovCi0KLSAgICAgICAgICAgIGlmIChqIC0gKChwc2VjdGlvbkluZm8tPnNmYlN0YXJ0ICsgcHNlY3Rpb25JbmZvLT5zZmJDbnQpIC0gMSkgPT0gMCkgewotICAgICAgICAgICAgICBmb3VuZCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgZm9yIChrID0gaiArIDE7IGsgPCBwc2VjdGlvbkluZm8tPnNmYlN0YXJ0ICsgcHNlY3Rpb25JbmZvLT5zZmJDbnQ7IGsrKykgewotCi0gICAgICAgICAgICAgICAgaWYgKG1heFZhbHVlSW5TZmJba10gIT0gMCkgewotICAgICAgICAgICAgICAgICAgaW50IHRtcCA9IExfYWJzKHNjYWxlZmFjR2FpbltrXSAtIGxhc3RWYWxTY2YpOwotCQkJCSAgZm91bmQgPSAxOwotCi0gICAgICAgICAgICAgICAgICBpZiAoIHRtcCA8IENPREVfQk9PS19TQ0ZfTEFWKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHNhdmUgYml0cyAqLwotICAgICAgICAgICAgICAgICAgICBkZWx0YVNjZiA9IDA7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLyogZG8gbm90IHNhdmUgYml0cyAqLwotICAgICAgICAgICAgICAgICAgICBkZWx0YVNjZiA9IGxhc3RWYWxTY2YgLSBzY2FsZWZhY0dhaW5bal07Ci0gICAgICAgICAgICAgICAgICAgIGxhc3RWYWxTY2YgPSBzY2FsZWZhY0dhaW5bal07Ci0gICAgICAgICAgICAgICAgICAgIHNjZlNraXBDb3VudGVyID0gMDsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBjb3VudCBzY2FsZWZhY3RvciBza2lwICovCi0gICAgICAgICAgICAgICAgc2NmU2tpcENvdW50ZXIgPSBzY2ZTa2lwQ291bnRlciArIDE7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotCQkJcHNlY3Rpb25JbmZvbSA9IHBzZWN0aW9uSW5mbyArIDE7Ci0gICAgICAgICAgICAvKiBzZWFyY2ggZm9yIHRoZSBuZXh0IG1heFZhbHVlSW5TZmJbXSAhPSAwIGluIGFsbCBvdGhlciBzZWN0aW9ucyAqLwotICAgICAgICAgICAgZm9yIChtID0gaSArIDE7IChtIDwgc2VjdGlvbkRhdGEtPm5vT2ZTZWN0aW9ucykgJiYgKGZvdW5kID09IDApOyBtKyspIHsKLQotICAgICAgICAgICAgICBpZiAoKHBzZWN0aW9uSW5mb20tPmNvZGVCb29rICE9IENPREVfQk9PS19aRVJPX05PKSAmJgotICAgICAgICAgICAgICAgICAgKHBzZWN0aW9uSW5mb20tPmNvZGVCb29rICE9IENPREVfQk9PS19QTlNfTk8pKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChuID0gcHNlY3Rpb25JbmZvbS0+c2ZiU3RhcnQ7Ci0gICAgICAgICAgICAgICAgICAgICBuIDwgKHBzZWN0aW9uSW5mb20tPnNmYlN0YXJ0ICsgcHNlY3Rpb25JbmZvbS0+c2ZiQ250KTsgbisrKSB7Ci0KLSAgICAgICAgICAgICAgICAgIGlmIChtYXhWYWx1ZUluU2ZiW25dICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZm91bmQgPSAxOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICggKGFic19zKHNjYWxlZmFjR2FpbltuXSAtIGxhc3RWYWxTY2YpIDwgQ09ERV9CT09LX1NDRl9MQVYpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgZGVsdGFTY2YgPSAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgIGRlbHRhU2NmID0gKGxhc3RWYWxTY2YgLSBzY2FsZWZhY0dhaW5bal0pOwotICAgICAgICAgICAgICAgICAgICAgIGxhc3RWYWxTY2YgPSBzY2FsZWZhY0dhaW5bal07Ci0gICAgICAgICAgICAgICAgICAgICAgc2NmU2tpcENvdW50ZXIgPSAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgLyogY291bnQgc2NhbGVmYWN0b3Igc2tpcCAqLwotICAgICAgICAgICAgICAgICAgc2NmU2tpcENvdW50ZXIgPSBzY2ZTa2lwQ291bnRlciArIDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0KLQkJCSAgcHNlY3Rpb25JbmZvbSArPSAxOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZm91bmQgPT0gMCkgewotICAgICAgICAgICAgICBkZWx0YVNjZiA9IDA7Ci0gICAgICAgICAgICAgIHNjZlNraXBDb3VudGVyID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBkZWx0YVNjZiA9IDA7Ci0gICAgICAgICAgICBzY2ZTa2lwQ291bnRlciA9IHNjZlNraXBDb3VudGVyIC0gMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgZGVsdGFTY2YgPSBsYXN0VmFsU2NmIC0gc2NhbGVmYWNHYWluW2pdOwotICAgICAgICAgIGxhc3RWYWxTY2YgPSBzY2FsZWZhY0dhaW5bal07Ci0gICAgICAgIH0KLSAgICAgICAgc2VjdGlvbkRhdGEtPnNjYWxlZmFjQml0cyArPSBiaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoZGVsdGFTY2YpOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0KLXR5cGVkZWYgV29yZDE2ICgqbG9va1VwVGFibGUpW0NPREVfQk9PS19FU0NfTkRYICsgMV07Ci0KLQotV29yZDE2Ci1keW5CaXRDb3VudChjb25zdCBXb3JkMTYgICpxdWFudFNwZWN0cnVtLAotICAgICAgICAgICAgY29uc3QgVVdvcmQxNiAqbWF4VmFsdWVJblNmYiwKLSAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgKnNjYWxlZmFjLAotICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgYmxvY2tUeXBlLAotICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgc2ZiQ250LAotICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgbWF4U2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICBjb25zdCBXb3JkMTYgICBzZmJQZXJHcm91cCwKLSAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgKnNmYk9mZnNldCwKLSAgICAgICAgICAgIFNFQ1RJT05fREFUQSAgKnNlY3Rpb25EYXRhKQotewotICBzZWN0aW9uRGF0YS0+YmxvY2tUeXBlICAgICAgPSBibG9ja1R5cGU7Ci0gIHNlY3Rpb25EYXRhLT5zZmJDbnQgICAgICAgICA9IHNmYkNudDsKLSAgc2VjdGlvbkRhdGEtPnNmYlBlckdyb3VwICAgID0gc2ZiUGVyR3JvdXA7Ci0gIGlmKHNmYlBlckdyb3VwKQotCXNlY3Rpb25EYXRhLT5ub09mR3JvdXBzICAgPSBzZmJDbnQvc2ZiUGVyR3JvdXA7Ci0gIGVsc2UKLQlzZWN0aW9uRGF0YS0+bm9PZkdyb3VwcyAgID0gMHg3ZmZmOwotICBzZWN0aW9uRGF0YS0+bWF4U2ZiUGVyR3JvdXAgPSBtYXhTZmJQZXJHcm91cDsKLQotICBub2lzZWxlc3NDb3VudGVyKHNlY3Rpb25EYXRhLAotICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhLT5tZXJnZUdhaW5Mb29rVXAsCi0gICAgICAgICAgICAgICAgICAgKGxvb2tVcFRhYmxlKXNlY3Rpb25EYXRhLT5iaXRMb29rVXAsCi0gICAgICAgICAgICAgICAgICAgcXVhbnRTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICBtYXhWYWx1ZUluU2ZiLAotICAgICAgICAgICAgICAgICAgIHNmYk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICBibG9ja1R5cGUpOwotCi0gIHNjZkNvdW50KHNjYWxlZmFjLAotICAgICAgICAgICBtYXhWYWx1ZUluU2ZiLAotICAgICAgICAgICBzZWN0aW9uRGF0YSk7Ci0KLQotICByZXR1cm4gKHNlY3Rpb25EYXRhLT5odWZmbWFuQml0cyArIHNlY3Rpb25EYXRhLT5zaWRlSW5mb0JpdHMgKwotCSAgICAgIHNlY3Rpb25EYXRhLT5zY2FsZWZhY0JpdHMpOwotfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9ncnBfZGF0YS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvZ3JwX2RhdGEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRmYjk1Yi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9ncnBfZGF0YS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJZ3JwX2RhdGEuYwotCi0JQ29udGVudDoJU2hvcnQgYmxvY2sgZ3JvdXBpbmcgZnVuY3Rpb24KLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImJhc2ljX29wLmgiCi0jaW5jbHVkZSAicHN5X2NvbnN0LmgiCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiZ3JwX2RhdGEuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGdyb3VwU2hvcnREYXRhCi0qIGRlc2NyaXB0aW9uOiAgZ3JvdXAgc2hvcnQgZGF0YSBmb3IgbmV4dCBxdWFudGl6YXRpb24gYW5kIGNvZGluZwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQKLWdyb3VwU2hvcnREYXRhKFdvcmQzMiAgICAgICAgKm1kY3RTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAgKnRtcFNwZWN0cnVtLAotICAgICAgICAgICAgICAgU0ZCX1RIUkVTSE9MRCAqc2ZiVGhyZXNob2xkLAotICAgICAgICAgICAgICAgU0ZCX0VORVJHWSAgICAqc2ZiRW5lcmd5LAotICAgICAgICAgICAgICAgU0ZCX0VORVJHWSAgICAqc2ZiRW5lcmd5TVMsCi0gICAgICAgICAgICAgICBTRkJfRU5FUkdZICAgICpzZmJTcHJlYWRlZEVuZXJneSwKLSAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgIHNmYkNudCwKLSAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgKnNmYk9mZnNldCwKLSAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgKnNmYk1pblNuciwKLSAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgKmdyb3VwZWRTZmJPZmZzZXQsCi0gICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICptYXhTZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgKmdyb3VwZWRTZmJNaW5TbnIsCi0gICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICBub09mR3JvdXBzLAotICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAqZ3JvdXBMZW4pCi17Ci0gIFdvcmQzMiBpLCBqOwotICBXb3JkMzIgbGluZTsKLSAgV29yZDMyIHNmYjsKLSAgV29yZDMyIGdycDsKLSAgV29yZDMyIHduZDsKLSAgV29yZDMyIG9mZnNldDsKLSAgV29yZDMyIGhpZ2hlc3RTZmI7Ci0KLSAgLyogZm9yIHNob3J0OiByZWdyb3VwIGFuZCAgKi8KLSAgLyogY3VtdWxhdGUgZW5lcmdpZXMgdW5kIHRocmVzaG9sZHMgZ3JvdXAtd2lzZSAuICovCi0KLSAgLyogY2FsY3VsYXRlIHNmYkNudCAqLwotICBoaWdoZXN0U2ZiID0gMDsKLSAgZm9yICh3bmQ9MDsgd25kPFRSQU5TX0ZBQzsgd25kKyspIHsKLSAgICBmb3IgKHNmYj1zZmJDbnQgLSAxOyBzZmI+PWhpZ2hlc3RTZmI7IHNmYi0tKSB7Ci0gICAgICBmb3IgKGxpbmU9KHNmYk9mZnNldFtzZmIgKyAxXSAtIDEpOyBsaW5lPj1zZmJPZmZzZXRbc2ZiXTsgbGluZS0tKSB7Ci0KLSAgICAgICAgaWYgKG1kY3RTcGVjdHJ1bVt3bmQqRlJBTUVfTEVOX1NIT1JUK2xpbmVdICE9IDApIGJyZWFrOwotICAgICAgfQotCi0gICAgICBpZiAobGluZSA+PSBzZmJPZmZzZXRbc2ZiXSkgYnJlYWs7Ci0gICAgfQotICAgIGhpZ2hlc3RTZmIgPSBtYXgoaGlnaGVzdFNmYiwgc2ZiKTsKLSAgfQotCi0gIGlmIChoaWdoZXN0U2ZiIDwgMCkgewotICAgIGhpZ2hlc3RTZmIgPSAwOwotICB9Ci0gICptYXhTZmJQZXJHcm91cCA9IGhpZ2hlc3RTZmIgKyAxOwotCi0gIC8qIGNhbGN1bGF0ZSBzZmJPZmZzZXQgKi8KLSAgaSA9IDA7Ci0gIG9mZnNldCA9IDA7Ci0gIGZvciAoZ3JwID0gMDsgZ3JwIDwgbm9PZkdyb3VwczsgZ3JwKyspIHsKLSAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNmYkNudDsgc2ZiKyspIHsKLSAgICAgIGdyb3VwZWRTZmJPZmZzZXRbaV0gPSBvZmZzZXQgKyBzZmJPZmZzZXRbc2ZiXSAqIGdyb3VwTGVuW2dycF07Ci0gICAgICBpICs9IDE7Ci0gICAgfQotICAgIG9mZnNldCArPSBncm91cExlbltncnBdICogRlJBTUVfTEVOX1NIT1JUOwotICB9Ci0gIGdyb3VwZWRTZmJPZmZzZXRbaV0gPSBGUkFNRV9MRU5fTE9ORzsKLQotICAvKiBjYWxjdWxhdGUgbWluU25yICovCi0gIGkgPSAwOwotICBvZmZzZXQgPSAwOwotICBmb3IgKGdycCA9IDA7IGdycCA8IG5vT2ZHcm91cHM7IGdycCsrKSB7Ci0gICAgZm9yIChzZmIgPSAwOyBzZmIgPCBzZmJDbnQ7IHNmYisrKSB7Ci0gICAgICBncm91cGVkU2ZiTWluU25yW2ldID0gc2ZiTWluU25yW3NmYl07Ci0gICAgICBpICs9IDE7Ci0gICAgfQotICAgIG9mZnNldCArPSBncm91cExlbltncnBdICogRlJBTUVfTEVOX1NIT1JUOwotICB9Ci0KLQotICAvKiBzdW0gdXAgc2ZiVGhyZXNob2xkcyAqLwotICB3bmQgPSAwOwotICBpID0gMDsKLSAgZm9yIChncnAgPSAwOyBncnAgPCBub09mR3JvdXBzOyBncnArKykgewotICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2ZiQ250OyBzZmIrKykgewotICAgICAgV29yZDMyIHRocmVzaCA9IHNmYlRocmVzaG9sZC0+c2ZiU2hvcnRbd25kXVtzZmJdOwotICAgICAgZm9yIChqPTE7IGo8Z3JvdXBMZW5bZ3JwXTsgaisrKSB7Ci0gICAgICAgIHRocmVzaCA9IExfYWRkKHRocmVzaCwgc2ZiVGhyZXNob2xkLT5zZmJTaG9ydFt3bmQral1bc2ZiXSk7Ci0gICAgICB9Ci0gICAgICBzZmJUaHJlc2hvbGQtPnNmYkxvbmdbaV0gPSB0aHJlc2g7Ci0gICAgICBpICs9IDE7Ci0gICAgfQotICAgIHduZCArPSBncm91cExlbltncnBdOwotICB9Ci0KLSAgLyogc3VtIHVwIHNmYkVuZXJnaWVzIGxlZnQvcmlnaHQgKi8KLSAgd25kID0gMDsKLSAgaSA9IDA7Ci0gIGZvciAoZ3JwID0gMDsgZ3JwIDwgbm9PZkdyb3VwczsgZ3JwKyspIHsKLSAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNmYkNudDsgc2ZiKyspIHsKLSAgICAgIFdvcmQzMiBlbmVyZ3kgPSBzZmJFbmVyZ3ktPnNmYlNob3J0W3duZF1bc2ZiXTsKLSAgICAgIGZvciAoaj0xOyBqPGdyb3VwTGVuW2dycF07IGorKykgewotICAgICAgICBlbmVyZ3kgPSBMX2FkZChlbmVyZ3ksIHNmYkVuZXJneS0+c2ZiU2hvcnRbd25kK2pdW3NmYl0pOwotICAgICAgfQotICAgICAgc2ZiRW5lcmd5LT5zZmJMb25nW2ldID0gZW5lcmd5OwotICAgICAgaSArPSAxOwotICAgIH0KLSAgICB3bmQgKz0gZ3JvdXBMZW5bZ3JwXTsKLSAgfQotCi0gIC8qIHN1bSB1cCBzZmJFbmVyZ2llcyBtaWQvc2lkZSAqLwotICB3bmQgPSAwOwotICBpID0gMDsKLSAgZm9yIChncnAgPSAwOyBncnAgPCBub09mR3JvdXBzOyBncnArKykgewotICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2ZiQ250OyBzZmIrKykgewotICAgICAgV29yZDMyIGVuZXJneSA9IHNmYkVuZXJneU1TLT5zZmJTaG9ydFt3bmRdW3NmYl07Ci0gICAgICBmb3IgKGo9MTsgajxncm91cExlbltncnBdOyBqKyspIHsKLSAgICAgICAgZW5lcmd5ID0gTF9hZGQoZW5lcmd5LCBzZmJFbmVyZ3lNUy0+c2ZiU2hvcnRbd25kK2pdW3NmYl0pOwotICAgICAgfQotICAgICAgc2ZiRW5lcmd5TVMtPnNmYkxvbmdbaV0gPSBlbmVyZ3k7Ci0gICAgICBpICs9IDE7Ci0gICAgfQotICAgIHduZCArPSBncm91cExlbltncnBdOwotICB9Ci0KLSAgLyogc3VtIHVwIHNmYlNwcmVhZGVkRW5lcmdpZXMgKi8KLSAgd25kID0gMDsKLSAgaSA9IDA7Ci0gIGZvciAoZ3JwID0gMDsgZ3JwIDwgbm9PZkdyb3VwczsgZ3JwKyspIHsKLSAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNmYkNudDsgc2ZiKyspIHsKLSAgICAgIFdvcmQzMiBlbmVyZ3kgPSBzZmJTcHJlYWRlZEVuZXJneS0+c2ZiU2hvcnRbd25kXVtzZmJdOwotICAgICAgZm9yIChqPTE7IGo8Z3JvdXBMZW5bZ3JwXTsgaisrKSB7Ci0gICAgICAgIGVuZXJneSA9IExfYWRkKGVuZXJneSwgc2ZiU3ByZWFkZWRFbmVyZ3ktPnNmYlNob3J0W3duZCtqXVtzZmJdKTsKLSAgICAgIH0KLSAgICAgIHNmYlNwcmVhZGVkRW5lcmd5LT5zZmJMb25nW2ldID0gZW5lcmd5OwotICAgICAgaSArPSAxOwotICAgIH0KLSAgICB3bmQgKz0gZ3JvdXBMZW5bZ3JwXTsKLSAgfQotCi0gIC8qIHJlLWdyb3VwIHNwZWN0cnVtICovCi0gIHduZCA9IDA7Ci0gIGkgPSAwOwotICBmb3IgKGdycCA9IDA7IGdycCA8IG5vT2ZHcm91cHM7IGdycCsrKSB7Ci0gICAgZm9yIChzZmIgPSAwOyBzZmIgPCBzZmJDbnQ7IHNmYisrKSB7Ci0gICAgICBmb3IgKGogPSAwOyBqIDwgZ3JvdXBMZW5bZ3JwXTsgaisrKSB7Ci0gICAgICAgIFdvcmQxNiBsaW5lT2Zmc2V0ID0gRlJBTUVfTEVOX1NIT1JUICogKHduZCArIGopOwotICAgICAgICBmb3IgKGxpbmUgPSBsaW5lT2Zmc2V0ICsgc2ZiT2Zmc2V0W3NmYl07IGxpbmUgPCBsaW5lT2Zmc2V0ICsgc2ZiT2Zmc2V0W3NmYisxXTsgbGluZSsrKSB7Ci0gICAgICAgICAgdG1wU3BlY3RydW1baV0gPSBtZGN0U3BlY3RydW1bbGluZV07Ci0gICAgICAgICAgaSA9IGkgKyAxOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHduZCArPSBncm91cExlbltncnBdOwotICB9Ci0KLSAgZm9yKGk9MDtpPEZSQU1FX0xFTl9MT05HO2krPTQpIHsKLSAgICBtZGN0U3BlY3RydW1baV0gPSB0bXBTcGVjdHJ1bVtpXTsKLQltZGN0U3BlY3RydW1baSsxXSA9IHRtcFNwZWN0cnVtW2krMV07Ci0JbWRjdFNwZWN0cnVtW2krMl0gPSB0bXBTcGVjdHJ1bVtpKzJdOwotCW1kY3RTcGVjdHJ1bVtpKzNdID0gdG1wU3BlY3RydW1baSszXTsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9pbnRlcmZhY2UuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2ludGVyZmFjZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGFkNDMzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2ludGVyZmFjZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJaW50ZXJmYWNlLmMKLQotCUNvbnRlbnQ6CUludGVyZmFjZSBwc3ljaG9hY2NvdXN0aWMvcXVhbnRpemVyIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiYmFzaWNfb3AuaCIKLSNpbmNsdWRlICJvcGVyXzMyYi5oIgotI2luY2x1ZGUgInBzeV9jb25zdC5oIgotI2luY2x1ZGUgImludGVyZmFjZS5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogQnVpbGRJbnRlcmZhY2UKLSogZGVzY3JpcHRpb246ICB1cGRhdGUgb3V0cHV0IHBhcmFtZXRlcgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQnVpbGRJbnRlcmZhY2UoV29yZDMyICAgICAgICAgICAgICAgICAgKmdyb3VwZWRNZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgICAgICAgICBtZGN0U2NhbGUsCi0gICAgICAgICAgICAgICAgICAgIFNGQl9USFJFU0hPTEQgICAgICAgICAgICpncm91cGVkU2ZiVGhyZXNob2xkLAotICAgICAgICAgICAgICAgICAgICBTRkJfRU5FUkdZICAgICAgICAgICAgICAqZ3JvdXBlZFNmYkVuZXJneSwKLSAgICAgICAgICAgICAgICAgICAgU0ZCX0VORVJHWSAgICAgICAgICAgICAgKmdyb3VwZWRTZmJTcHJlYWRlZEVuZXJneSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgU0ZCX0VORVJHWV9TVU0gICAgIHNmYkVuZXJneVN1bUxSLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBTRkJfRU5FUkdZX1NVTSAgICAgc2ZiRW5lcmd5U3VtTVMsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgICAgICAgICB3aW5kb3dTZXF1ZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICAgICAgICAgIHdpbmRvd1NoYXBlLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgICAgICAgICAgZ3JvdXBlZFNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICAgICAgICAgKmdyb3VwZWRTZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgICAgICAgICBtYXhTZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICAgICAgICAgKmdyb3VwZWRTZmJNaW5TbnIsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgICAgICAgICBub09mR3JvdXBzLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgICAgICAgICAqZ3JvdXBMZW4sCi0gICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAgICAgICAgICpwc3lPdXRDaCkKLXsKLSAgV29yZDMyIGo7Ci0gIFdvcmQzMiBncnA7Ci0gIFdvcmQzMiBtYXNrOwotICBXb3JkMTYgKnRtcFY7Ci0KLSAgLyoKLSAgY29weSB2YWx1ZXMgdG8gcHN5T3V0Ci0gICovCi0gIHBzeU91dENoLT5tYXhTZmJQZXJHcm91cCAgICA9IG1heFNmYlBlckdyb3VwOwotICBwc3lPdXRDaC0+c2ZiQ250ICAgICAgICAgICAgPSBncm91cGVkU2ZiQ250OwotICBpZihub09mR3JvdXBzKQotCXBzeU91dENoLT5zZmJQZXJHcm91cCAgICAgPSBncm91cGVkU2ZiQ250LyBub09mR3JvdXBzOwotICBlbHNlCi0JcHN5T3V0Q2gtPnNmYlBlckdyb3VwICAgICA9IDB4N2ZmZjsKLSAgcHN5T3V0Q2gtPndpbmRvd1NlcXVlbmNlICAgID0gd2luZG93U2VxdWVuY2U7Ci0gIHBzeU91dENoLT53aW5kb3dTaGFwZSAgICAgICA9IHdpbmRvd1NoYXBlOwotICBwc3lPdXRDaC0+bWRjdFNjYWxlICAgICAgICAgPSBtZGN0U2NhbGU7Ci0gIHBzeU91dENoLT5tZGN0U3BlY3RydW0gICAgICA9IGdyb3VwZWRNZGN0U3BlY3RydW07Ci0gIHBzeU91dENoLT5zZmJFbmVyZ3kgICAgICAgICA9IGdyb3VwZWRTZmJFbmVyZ3ktPnNmYkxvbmc7Ci0gIHBzeU91dENoLT5zZmJUaHJlc2hvbGQgICAgICA9IGdyb3VwZWRTZmJUaHJlc2hvbGQtPnNmYkxvbmc7Ci0gIHBzeU91dENoLT5zZmJTcHJlYWRlZEVuZXJneSA9IGdyb3VwZWRTZmJTcHJlYWRlZEVuZXJneS0+c2ZiTG9uZzsKLQotICB0bXBWID0gcHN5T3V0Q2gtPnNmYk9mZnNldHM7Ci0gIGZvcihqPTA7IGo8Z3JvdXBlZFNmYkNudCArIDE7IGorKykgewotICAgICAgKnRtcFYrKyA9IGdyb3VwZWRTZmJPZmZzZXRbal07Ci0gIH0KLQotICB0bXBWID0gcHN5T3V0Q2gtPnNmYk1pblNucjsKLSAgZm9yKGo9MDtqPGdyb3VwZWRTZmJDbnQ7IGorKykgewotCSAgKnRtcFYrKyA9ICAgZ3JvdXBlZFNmYk1pblNucltqXTsKLSAgfQotCi0gIC8qIGdlbmVyYXRlIGdyb3VwaW5nIG1hc2sgKi8KLSAgbWFzayA9IDA7Ci0gIGZvciAoZ3JwID0gMDsgZ3JwIDwgbm9PZkdyb3VwczsgZ3JwKyspIHsKLSAgICBtYXNrID0gbWFzayA8PCAxOwotICAgIGZvciAoaj0xOyBqPGdyb3VwTGVuW2dycF07IGorKykgewotICAgICAgbWFzayA9IG1hc2sgPDwgMTsKLSAgICAgIG1hc2sgfD0gMTsKLSAgICB9Ci0gIH0KLSAgcHN5T3V0Q2gtPmdyb3VwaW5nTWFzayA9IG1hc2s7Ci0KLSAgaWYgKHdpbmRvd1NlcXVlbmNlICE9IFNIT1JUX1dJTkRPVykgewotICAgIHBzeU91dENoLT5zZmJFblN1bUxSID0gIHNmYkVuZXJneVN1bUxSLnNmYkxvbmc7Ci0gICAgcHN5T3V0Q2gtPnNmYkVuU3VtTVMgPSAgc2ZiRW5lcmd5U3VtTVMuc2ZiTG9uZzsKLSAgfQotICBlbHNlIHsKLSAgICBXb3JkMzIgaTsKLSAgICBXb3JkMzIgYWNjdVN1bU1TPTA7Ci0gICAgV29yZDMyIGFjY3VTdW1MUj0wOwotICAgIGNvbnN0IFdvcmQzMiAqcFN1bU1TID0gc2ZiRW5lcmd5U3VtTVMuc2ZiU2hvcnQ7Ci0gICAgY29uc3QgV29yZDMyICpwU3VtTFIgPSBzZmJFbmVyZ3lTdW1MUi5zZmJTaG9ydDsKLQotICAgIGZvciAoaT1UUkFOU19GQUM7IGk7IGktLSkgewotICAgICAgYWNjdVN1bUxSID0gTF9hZGQoYWNjdVN1bUxSLCAqcFN1bUxSKTsgcFN1bUxSKys7Ci0gICAgICBhY2N1U3VtTVMgPSBMX2FkZChhY2N1U3VtTVMsICpwU3VtTVMpOyBwU3VtTVMrKzsKLSAgICB9Ci0gICAgcHN5T3V0Q2gtPnNmYkVuU3VtTVMgPSBhY2N1U3VtTVM7Ci0gICAgcHN5T3V0Q2gtPnNmYkVuU3VtTFIgPSBhY2N1U3VtTFI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2xpbmVfcGUuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2xpbmVfcGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgwZGMyOC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9saW5lX3BlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQlsaW5lX3BlLmMKLQotCUNvbnRlbnQ6CVBlcmNlcHR1YWwgZW50cm9waWUgbW9kdWxlIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiYmFzaWNfb3AuaCIKLSNpbmNsdWRlICJvcGVyXzMyYi5oIgotI2luY2x1ZGUgInR5cGVkZWYuaCIKLSNpbmNsdWRlICJsaW5lX3BlLmgiCi0KLQotc3RhdGljIGNvbnN0IFdvcmQxNiAgQzFfSSA9IDEyOyAgICAvKiBsb2coOC4wKS9sb2coMikgKjQgICAgICAgICAqLwotc3RhdGljIGNvbnN0IFdvcmQzMiAgQzJfSSA9IDEwODMwOyAvKiBsb2coMi41KS9sb2coMikgKiAxMDI0ICogNCAqIDIgKi8KLXN0YXRpYyBjb25zdCBXb3JkMTYgIEMzX0kgPSA1NzM7ICAgLyogKDEtQzIvQzEpICoxMDI0ICAgICAgICAgICAgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogcHJlcGFyZVNmYlBlCi0qIGRlc2NyaXB0aW9uOiAgY29uc3RhbnRzIHRoYXQgZG8gbm90IGNoYW5nZSBkdXJpbmcgc3VjY2Vzc2l2ZSBwZSBjYWxjdWxhdGlvbnMKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHByZXBhcmVTZmJQZShQRV9EQVRBICpwZURhdGEsCi0gICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgICAgICAgICAgIFdvcmQxNiBsb2dTZmJFbmVyZ3lbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAotICAgICAgICAgICAgICAgICAgV29yZDE2IHNmYk5SZWxldmFudExpbmVzW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBuQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgcGVPZmZzZXQpCi17Ci0gIFdvcmQzMiBzZmJHcnAsIHNmYjsKLSAgV29yZDMyIGNoOwotCi0gIGZvcihjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKLSAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4gPSAmcHN5T3V0Q2hhbm5lbFtjaF07Ci0gICAgUEVfQ0hBTk5FTF9EQVRBICpwZUNoYW5EYXRhPSZwZURhdGEtPnBlQ2hhbm5lbERhdGFbY2hdOwotICAgIGZvcihzZmJHcnA9MDtzZmJHcnA8cHN5T3V0Q2hhbi0+c2ZiQ250OyBzZmJHcnArPXBzeU91dENoYW4tPnNmYlBlckdyb3VwKXsKLSAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFuLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKLQkgICAgcGVDaGFuRGF0YS0+c2ZiTkxpbmVzNFtzZmJHcnArc2ZiXSA9IHNmYk5SZWxldmFudExpbmVzW2NoXVtzZmJHcnArc2ZiXTsKLSAgICAgICAgc2ZiTlJlbGV2YW50TGluZXNbY2hdW3NmYkdycCtzZmJdID0gc2ZiTlJlbGV2YW50TGluZXNbY2hdW3NmYkdycCtzZmJdID4+IDI7Ci0JICAgIHBlQ2hhbkRhdGEtPnNmYkxkRW5lcmd5W3NmYkdycCtzZmJdID0gbG9nU2ZiRW5lcmd5W2NoXVtzZmJHcnArc2ZiXTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcGVEYXRhLT5vZmZzZXQgPSBwZU9mZnNldDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogY2FsY1NmYlBlCi0qIGRlc2NyaXB0aW9uOiAgY29uc3RQYXJ0IGlzIHNmYlBlIHdpdGhvdXQgdGhlIHRocmVzaG9sZCBwYXJ0IG4qbGQodGhyKSBvciBuKkMzKmxkKHRocikKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGNhbGNTZmJQZShQRV9EQVRBICpwZURhdGEsCi0gICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgcHN5T3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLAotICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IG5DaGFubmVscykKLXsKLSAgV29yZDMyIGNoOwotICBXb3JkMzIgc2ZiR3JwLCBzZmI7Ci0gIFdvcmQzMiBuTGluZXM0OwotICBXb3JkMzIgbGRUaHIsIGxkUmF0aW87Ci0gIFdvcmQzMiBwZSwgY29uc3RQYXJ0LCBuQWN0aXZlTGluZXM7Ci0KLSAgcGVEYXRhLT5wZSA9IHBlRGF0YS0+b2Zmc2V0OwotICBwZURhdGEtPmNvbnN0UGFydCA9IDA7Ci0gIHBlRGF0YS0+bkFjdGl2ZUxpbmVzID0gMDsKLSAgZm9yKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgewotICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbiA9ICZwc3lPdXRDaGFubmVsW2NoXTsKLSAgICBQRV9DSEFOTkVMX0RBVEEgKnBlQ2hhbkRhdGEgPSAmcGVEYXRhLT5wZUNoYW5uZWxEYXRhW2NoXTsKLSAgICBjb25zdCBXb3JkMzIgKnNmYkVuZXJneSA9IHBzeU91dENoYW4tPnNmYkVuZXJneTsKLSAgICBjb25zdCBXb3JkMzIgKnNmYlRocmVzaG9sZCA9IHBzeU91dENoYW4tPnNmYlRocmVzaG9sZDsKLQotICAgIHBlID0gMDsKLSAgICBjb25zdFBhcnQgPSAwOwotICAgIG5BY3RpdmVMaW5lcyA9IDA7Ci0KLSAgICBmb3Ioc2ZiR3JwPTA7IHNmYkdycDxwc3lPdXRDaGFuLT5zZmJDbnQ7IHNmYkdycCs9cHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXApIHsKLSAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFuLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKLSAgICAgICAgV29yZDMyIG5yZyA9IHNmYkVuZXJneVtzZmJHcnArc2ZiXTsKLSAgICAgICAgV29yZDMyIHRocmVzID0gc2ZiVGhyZXNob2xkW3NmYkdycCtzZmJdOwotICAgICAgICBXb3JkMzIgc2ZiTERFbiA9IHBlQ2hhbkRhdGEtPnNmYkxkRW5lcmd5W3NmYkdycCtzZmJdOwotCi0gICAgICAgIGlmIChucmcgPiB0aHJlcykgewotICAgICAgICAgIGxkVGhyID0gaUxvZzQodGhyZXMpOwotCi0gICAgICAgICAgbGRSYXRpbyA9IHNmYkxERW4gLSBsZFRocjsKLQotICAgICAgICAgIG5MaW5lczQgPSBwZUNoYW5EYXRhLT5zZmJOTGluZXM0W3NmYkdycCtzZmJdOwotCi0gICAgICAgICAgLyogc2ZiUGUgPSBubCpsb2cyKGVuL3RocikqLwotCQkgIGlmIChsZFJhdGlvID49IEMxX0kpIHsKLSAgICAgICAgICAgIHBlQ2hhbkRhdGEtPnNmYlBlW3NmYkdycCtzZmJdID0gKG5MaW5lczQqbGRSYXRpbyArIDgpID4+IDQ7Ci0gICAgICAgICAgICBwZUNoYW5EYXRhLT5zZmJDb25zdFBhcnRbc2ZiR3JwK3NmYl0gPSAoKG5MaW5lczQqc2ZiTERFbikpID4+IDQ7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgewotCQkgIC8qIHNmYlBlID0gbmwqKGMyICsgYzMqbG9nMihlbi90aHIpKSovCi0gICAgICAgICAgICBwZUNoYW5EYXRhLT5zZmJQZVtzZmJHcnArc2ZiXSA9IGV4dHJhY3RfbCgoTF9tcHlfd3goCi0gICAgICAgICAgICAgICAgICAgIChDMl9JICsgQzNfSSAqIGxkUmF0aW8gKiAyKSA8PCA0LCBuTGluZXM0KSArIDQpID4+IDMpOwotICAgICAgICAgICAgcGVDaGFuRGF0YS0+c2ZiQ29uc3RQYXJ0W3NmYkdycCtzZmJdID0gZXh0cmFjdF9sKCggTF9tcHlfd3goCi0gICAgICAgICAgICAgICAgICAgIChDMl9JICsgQzNfSSAqIHNmYkxERW4gKiAyKSA8PCA0LCBuTGluZXM0KSArIDQpID4+IDMpOwotICAgICAgICAgICAgbkxpbmVzNCA9IChuTGluZXM0ICogQzNfSSArICgxMDI0PDwxKSkgPj4gMTA7Ci0gICAgICAgICAgfQotICAgICAgICAgIHBlQ2hhbkRhdGEtPnNmYk5BY3RpdmVMaW5lc1tzZmJHcnArc2ZiXSA9IG5MaW5lczQgPj4gMjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICBwZUNoYW5EYXRhLT5zZmJQZVtzZmJHcnArc2ZiXSA9IDA7Ci0gICAgICAgICAgcGVDaGFuRGF0YS0+c2ZiQ29uc3RQYXJ0W3NmYkdycCtzZmJdID0gMDsKLSAgICAgICAgICBwZUNoYW5EYXRhLT5zZmJOQWN0aXZlTGluZXNbc2ZiR3JwK3NmYl0gPSAwOwotICAgICAgICB9Ci0gICAgICAgIHBlID0gcGUgKyBwZUNoYW5EYXRhLT5zZmJQZVtzZmJHcnArc2ZiXTsKLSAgICAgICAgY29uc3RQYXJ0ID0gY29uc3RQYXJ0ICsgcGVDaGFuRGF0YS0+c2ZiQ29uc3RQYXJ0W3NmYkdycCtzZmJdOwotICAgICAgICBuQWN0aXZlTGluZXMgPSBuQWN0aXZlTGluZXMgKyBwZUNoYW5EYXRhLT5zZmJOQWN0aXZlTGluZXNbc2ZiR3JwK3NmYl07Ci0gICAgICB9Ci0gICAgfQotCi0JcGVDaGFuRGF0YS0+cGUgPSBzYXR1cmF0ZShwZSk7Ci0gICAgcGVDaGFuRGF0YS0+Y29uc3RQYXJ0ID0gc2F0dXJhdGUoY29uc3RQYXJ0KTsKLSAgICBwZUNoYW5EYXRhLT5uQWN0aXZlTGluZXMgPSBzYXR1cmF0ZShuQWN0aXZlTGluZXMpOwotCi0KLQlwZSArPSBwZURhdGEtPnBlOwotCXBlRGF0YS0+cGUgPSBzYXR1cmF0ZShwZSk7Ci0gICAgY29uc3RQYXJ0ICs9IHBlRGF0YS0+Y29uc3RQYXJ0OwotCXBlRGF0YS0+Y29uc3RQYXJ0ID0gc2F0dXJhdGUoY29uc3RQYXJ0KTsKLSAgICBuQWN0aXZlTGluZXMgKz0gcGVEYXRhLT5uQWN0aXZlTGluZXM7Ci0JcGVEYXRhLT5uQWN0aXZlTGluZXMgPSBzYXR1cmF0ZShuQWN0aXZlTGluZXMpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9tZW1hbGlnbi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvbWVtYWxpZ24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIyNjZkYy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9tZW1hbGlnbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQltZW1fYWxpZ24uYwotCi0JQ29udGVudDoJTWVtb3J5IGFsbG9jIGFsaWdubWVudHMgZnVuY3Rpb25zCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUJIm1lbWFsaWduLmgiCi0jaWZkZWYgX01TQ19WRVIKLSNpbmNsdWRlCTxzdGRkZWYuaD4KLSNlbHNlCi0jaW5jbHVkZQk8c3RkaW50Lmg+Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IG1lbV9tYWxsb2MKLSogZGVzY3JpcHRpb246ICBtYWxsb2MgdGhlIGFsaWdubWVudHMgbWVtb3J5Ci0qIHJldHVybnM6ICAgICAgdGhlIHBvaW50IG9mIHRoZSBtZW1vcnkKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICoKLW1lbV9tYWxsb2MoVk9fTUVNX09QRVJBVE9SICpwTWVtb3AsIHVuc2lnbmVkIGludCBzaXplLCB1bnNpZ25lZCBjaGFyIGFsaWdubWVudCwgdW5zaWduZWQgaW50IENvZGVjSUQpCi17Ci0JaW50IHJldDsKLQl1bnNpZ25lZCBjaGFyICptZW1fcHRyOwotCVZPX01FTV9JTkZPIE1lbUluZm87Ci0KLQlpZiAoIWFsaWdubWVudCkgewotCi0JCU1lbUluZm8uRmxhZyA9IDA7Ci0JCU1lbUluZm8uU2l6ZSA9IHNpemUgKyAxOwotCQlyZXQgPSBwTWVtb3AtPkFsbG9jKENvZGVjSUQsICZNZW1JbmZvKTsKLQkJaWYocmV0ICE9IDApCi0JCQlyZXR1cm4gMDsKLQkJbWVtX3B0ciA9ICh1bnNpZ25lZCBjaGFyICopTWVtSW5mby5WQnVmZmVyOwotCi0JCXBNZW1vcC0+U2V0KENvZGVjSUQsIG1lbV9wdHIsIDAsIHNpemUgKyAxKTsKLQotCQkqbWVtX3B0ciA9ICh1bnNpZ25lZCBjaGFyKTE7Ci0KLQkJcmV0dXJuICgodm9pZCAqKShtZW1fcHRyKzEpKTsKLQl9IGVsc2UgewotCQl1bnNpZ25lZCBjaGFyICp0bXA7Ci0KLQkJTWVtSW5mby5GbGFnID0gMDsKLQkJTWVtSW5mby5TaXplID0gc2l6ZSArIGFsaWdubWVudDsKLQkJcmV0ID0gcE1lbW9wLT5BbGxvYyhDb2RlY0lELCAmTWVtSW5mbyk7Ci0JCWlmKHJldCAhPSAwKQotCQkJcmV0dXJuIDA7Ci0KLQkJdG1wID0gKHVuc2lnbmVkIGNoYXIgKilNZW1JbmZvLlZCdWZmZXI7Ci0KLQkJcE1lbW9wLT5TZXQoQ29kZWNJRCwgdG1wLCAwLCBzaXplICsgYWxpZ25tZW50KTsKLQotCQltZW1fcHRyID0KLQkJCSh1bnNpZ25lZCBjaGFyICopICgoaW50cHRyX3QpICh0bXAgKyBhbGlnbm1lbnQgLSAxKSAmCi0JCQkJCSh+KChpbnRwdHJfdCkgKGFsaWdubWVudCAtIDEpKSkpOwotCi0JCWlmIChtZW1fcHRyID09IHRtcCkKLQkJCW1lbV9wdHIgKz0gYWxpZ25tZW50OwotCi0JCSoobWVtX3B0ciAtIDEpID0gKHVuc2lnbmVkIGNoYXIpIChtZW1fcHRyIC0gdG1wKTsKLQotCQlyZXR1cm4gKCh2b2lkICopbWVtX3B0cik7Ci0JfQotCi0JcmV0dXJuKDApOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBtZW1fZnJlZQotKiBkZXNjcmlwdGlvbjogIGZyZWUgdGhlIG1lbW9yeQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQKLW1lbV9mcmVlKFZPX01FTV9PUEVSQVRPUiAqcE1lbW9wLCB2b2lkICptZW1fcHRyLCB1bnNpZ25lZCBpbnQgQ29kZWNJRCkKLXsKLQotCXVuc2lnbmVkIGNoYXIgKnB0cjsKLQotCWlmIChtZW1fcHRyID09IDApCi0JCXJldHVybjsKLQotCXB0ciA9IG1lbV9wdHI7Ci0KLQlwdHIgLT0gKihwdHIgLSAxKTsKLQotCXBNZW1vcC0+RnJlZShDb2RlY0lELCBwdHIpOwotfQotCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvbXNfc3RlcmVvLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9tc19zdGVyZW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EwMjhkYy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9tc19zdGVyZW8uYworKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCW1zX3N0ZXJlby5jCi0KLQlDb250ZW50OglNUyBzdGVyZW8gcHJvY2Vzc2luZyBmdW5jdGlvbgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiYmFzaWNfb3AuaCIKLSNpbmNsdWRlICJvcGVyXzMyYi5oIgotI2luY2x1ZGUgInBzeV9jb25zdC5oIgotI2luY2x1ZGUgIm1zX3N0ZXJlby5oIgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBNc1N0ZXJlb1Byb2Nlc3NpbmcKLSogZGVzY3JpcHRpb246ICBkZXRlY3QgdXNlIG1zIHN0ZXJlbyBvciBub3QKLSoJCQkJaWYgKChtaW4odGhyTG4sIHRoclJuKSptaW4odGhyTG4sIHRoclJuKSkvKGVuTW4qZW5TbikpCi0qCQkJCT49ICgodGhyTG4gKnRoclJuKS8oZW5MbiplblJuKSkgdGhlbiBtcyBzdGVyZW8KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIE1zU3RlcmVvUHJvY2Vzc2luZyhXb3JkMzIgICAgICAgKnNmYkVuZXJneUxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKnNmYkVuZXJneVJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDMyICpzZmJFbmVyZ3lNaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMzIgKnNmYkVuZXJneVNpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKm1kY3RTcGVjdHJ1bUxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKm1kY3RTcGVjdHJ1bVJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICpzZmJUaHJlc2hvbGRMZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICpzZmJUaHJlc2hvbGRSaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqc2ZiU3ByZWFkZWRFbkxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKnNmYlNwcmVhZGVkRW5SaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAqbXNEaWdlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgKm1zTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgc2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICBzZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgbWF4U2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgKnNmYk9mZnNldCkgewotICBXb3JkMzIgc2ZiLHNmYm9mZnMsIGo7Ci0gIFdvcmQzMiBtc01hc2tUcnVlU29tZXdoZXJlID0gMDsKLSAgV29yZDMyIG1zTWFza0ZhbHNlU29tZXdoZXJlID0gMDsKLQotICBmb3IgKHNmYj0wOyBzZmI8c2ZiQ250OyBzZmIrPXNmYlBlckdyb3VwKSB7Ci0gICAgZm9yIChzZmJvZmZzPTA7c2Zib2ZmczxtYXhTZmJQZXJHcm91cDtzZmJvZmZzKyspIHsKLQotICAgICAgV29yZDMyIHRlbXA7Ci0gICAgICBXb3JkMzIgcG5scixwbm1zOwotICAgICAgV29yZDMyIG1pblRocmVzaG9sZDsKLSAgICAgIFdvcmQzMiB0aHJMLCB0aHJSLCBucmdMLCBucmdSOwotICAgICAgV29yZDMyIGlkeCwgc2hpZnQ7Ci0KLSAgICAgIGlkeCA9IHNmYiArIHNmYm9mZnM7Ci0KLSAgICAgIHRockwgPSBzZmJUaHJlc2hvbGRMZWZ0W2lkeF07Ci0gICAgICB0aHJSID0gc2ZiVGhyZXNob2xkUmlnaHRbaWR4XTsKLSAgICAgIG5yZ0wgPSBzZmJFbmVyZ3lMZWZ0W2lkeF07Ci0gICAgICBucmdSID0gc2ZiRW5lcmd5UmlnaHRbaWR4XTsKLQotICAgICAgbWluVGhyZXNob2xkID0gbWluKHRockwsIHRoclIpOwotCi0gICAgICBucmdMID0gbWF4KG5yZ0wsdGhyTCkgKyAxOwotICAgICAgc2hpZnQgPSBub3JtX2wobnJnTCk7Ci0JICBucmdMID0gRGl2XzMyKHRockwgPDwgc2hpZnQsIG5yZ0wgPDwgc2hpZnQpOwotICAgICAgbnJnUiA9IG1heChucmdSLHRoclIpICsgMTsKLSAgICAgIHNoaWZ0ID0gbm9ybV9sKG5yZ1IpOwotCSAgbnJnUiA9IERpdl8zMih0aHJSIDw8IHNoaWZ0LCBucmdSIDw8IHNoaWZ0KTsKLQotCSAgcG5sciA9IGZpeG11bChucmdMLCBucmdSKTsKLQotICAgICAgbnJnTCA9IHNmYkVuZXJneU1pZFtpZHhdOwotICAgICAgbnJnUiA9IHNmYkVuZXJneVNpZGVbaWR4XTsKLQotICAgICAgbnJnTCA9IG1heChucmdMLG1pblRocmVzaG9sZCkgKyAxOwotICAgICAgc2hpZnQgPSBub3JtX2wobnJnTCk7Ci0JICBucmdMID0gRGl2XzMyKG1pblRocmVzaG9sZCA8PCBzaGlmdCwgbnJnTCA8PCBzaGlmdCk7Ci0KLSAgICAgIG5yZ1IgPSBtYXgobnJnUixtaW5UaHJlc2hvbGQpICsgMTsKLSAgICAgIHNoaWZ0ID0gbm9ybV9sKG5yZ1IpOwotCSAgbnJnUiA9IERpdl8zMihtaW5UaHJlc2hvbGQgPDwgc2hpZnQsIG5yZ1IgPDwgc2hpZnQpOwotCi0gICAgICBwbm1zID0gZml4bXVsKG5yZ0wsIG5yZ1IpOwotCi0gICAgICB0ZW1wID0gcG5tcyAtIHBubHI7Ci0gICAgICBpZiggdGVtcCA+IDAgKXsKLQotICAgICAgICBtc01hc2tbaWR4XSA9IDE7Ci0gICAgICAgIG1zTWFza1RydWVTb21ld2hlcmUgPSAxOwotCi0gICAgICAgIGZvciAoaj1zZmJPZmZzZXRbaWR4XTsgajxzZmJPZmZzZXRbaWR4KzFdOyBqKyspIHsKLSAgICAgICAgICBXb3JkMzIgbGVmdCwgcmlnaHQ7Ci0gICAgICAgICAgbGVmdCAgPSAobWRjdFNwZWN0cnVtTGVmdFtqXSA+PiAgMSk7Ci0gICAgICAgICAgcmlnaHQgPSAobWRjdFNwZWN0cnVtUmlnaHRbal0gPj4gMSk7Ci0gICAgICAgICAgbWRjdFNwZWN0cnVtTGVmdFtqXSA9ICBsZWZ0ICsgcmlnaHQ7Ci0gICAgICAgICAgbWRjdFNwZWN0cnVtUmlnaHRbal0gPSAgbGVmdCAtIHJpZ2h0OwotICAgICAgICB9Ci0KLSAgICAgICAgc2ZiVGhyZXNob2xkTGVmdFtpZHhdID0gbWluVGhyZXNob2xkOwotICAgICAgICBzZmJUaHJlc2hvbGRSaWdodFtpZHhdID0gbWluVGhyZXNob2xkOwotICAgICAgICBzZmJFbmVyZ3lMZWZ0W2lkeF0gPSBzZmJFbmVyZ3lNaWRbaWR4XTsKLSAgICAgICAgc2ZiRW5lcmd5UmlnaHRbaWR4XSA9IHNmYkVuZXJneVNpZGVbaWR4XTsKLQotICAgICAgICBzZmJTcHJlYWRlZEVuUmlnaHRbaWR4XSA9IG1pbihzZmJTcHJlYWRlZEVuTGVmdFtpZHhdLHNmYlNwcmVhZGVkRW5SaWdodFtpZHhdKSA+PiAxOwotICAgICAgICBzZmJTcHJlYWRlZEVuTGVmdFtpZHhdID0gc2ZiU3ByZWFkZWRFblJpZ2h0W2lkeF07Ci0KLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBtc01hc2tbaWR4XSAgPSAwOwotICAgICAgICBtc01hc2tGYWxzZVNvbWV3aGVyZSA9IDE7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICggbXNNYXNrVHJ1ZVNvbWV3aGVyZSApIHsKLSAgICAgIGlmKG1zTWFza0ZhbHNlU29tZXdoZXJlICkgewotICAgICAgICAqbXNEaWdlc3QgPSBTSV9NU19NQVNLX1NPTUU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAqbXNEaWdlc3QgPSBTSV9NU19NQVNLX0FMTDsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgKm1zRGlnZXN0ID0gU0lfTVNfTUFTS19OT05FOwotICAgIH0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9wcmVfZWNob19jb250cm9sLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9wcmVfZWNob19jb250cm9sLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MDZlMTEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcHJlX2VjaG9fY29udHJvbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJcHJlX2VjaG9fY29udHJvbC5jCi0KLQlDb250ZW50OglQcmUgZWNobyBjb250cm9sIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiYmFzaWNfb3AuaCIKLSNpbmNsdWRlICJvcGVyXzMyYi5oIgotCi0jaW5jbHVkZSAib3Blcl8zMmIuaCIKLSNpbmNsdWRlICJwcmVfZWNob19jb250cm9sLmgiCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6SW5pdFByZUVjaG9Db250cm9sCi0qIGRlc2NyaXB0aW9uOiBpbml0IHByZSBlY2hvIGNvbnRyb2wgcGFyYW1ldGVyCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgSW5pdFByZUVjaG9Db250cm9sKFdvcmQzMiAqcGJUaHJlc2hvbGRObTEsCi0gICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgIG51bVBiLAotICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICpwYlRocmVzaG9sZFF1aWV0KQotewotICBXb3JkMTYgcGI7Ci0KLSAgZm9yKHBiPTA7IHBiPG51bVBiOyBwYisrKSB7Ci0gICAgcGJUaHJlc2hvbGRObTFbcGJdID0gcGJUaHJlc2hvbGRRdWlldFtwYl07Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6UHJlRWNob0NvbnRyb2wKLSogZGVzY3JpcHRpb246IHVwZGF0ZSBzaHJlc2hvbGQgdG8gYXZvaWQgcHJlIGVjaG8KLSoJCQkgICB0aHIobikgPSBtYXgocnBtaW4qdGhycShuKSwgbWluKHRocnEobiksIHJwZWxldip0aHJxMShuKSkpCi0qCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUHJlRWNob0NvbnRyb2woV29yZDMyICpwYlRocmVzaG9sZE5tMSwKLSAgICAgICAgICAgICAgICAgICAgV29yZDE2ICBudW1QYiwKLSAgICAgICAgICAgICAgICAgICAgV29yZDMyICBtYXhBbGxvd2VkSW5jcmVhc2VGYWN0b3IsCi0gICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgbWluUmVtYWluaW5nVGhyZXNob2xkRmFjdG9yLAotICAgICAgICAgICAgICAgICAgICBXb3JkMzIgKnBiVGhyZXNob2xkLAotICAgICAgICAgICAgICAgICAgICBXb3JkMTYgIG1kY3RTY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgV29yZDE2ICBtZGN0U2NhbGVubTEpCi17Ci0gIFdvcmQzMiBpOwotICBXb3JkMzIgdG1wVGhyZXNob2xkMSwgdG1wVGhyZXNob2xkMjsKLSAgV29yZDMyIHNjYWxpbmc7Ci0KLSAgLyogbWF4QWxsb3dlZEluY3JlYXNlRmFjdG9yIGlzIGhhcmQgY29kZWQgdG8gMiAqLwotICAodm9pZCltYXhBbGxvd2VkSW5jcmVhc2VGYWN0b3I7Ci0KLSAgc2NhbGluZyA9ICgobWRjdFNjYWxlIC0gbWRjdFNjYWxlbm0xKSA8PCAxKTsKLQotICBpZiAoIHNjYWxpbmcgPiAwICkgewotICAgIGZvcihpID0gMDsgaSA8IG51bVBiOyBpKyspIHsKLSAgICAgIHRtcFRocmVzaG9sZDEgPSBwYlRocmVzaG9sZE5tMVtpXSA+PiAoc2NhbGluZy0xKTsKLSAgICAgIHRtcFRocmVzaG9sZDIgPSBMX21weV9scyhwYlRocmVzaG9sZFtpXSwgbWluUmVtYWluaW5nVGhyZXNob2xkRmFjdG9yKTsKLQotICAgICAgLyogY29weSB0aHJlc2hvbGRzIHRvIGludGVybmFsIG1lbW9yeSAqLwotICAgICAgcGJUaHJlc2hvbGRObTFbaV0gPSBwYlRocmVzaG9sZFtpXTsKLQotCi0gICAgICBpZihwYlRocmVzaG9sZFtpXSA+IHRtcFRocmVzaG9sZDEpIHsKLSAgICAgICAgcGJUaHJlc2hvbGRbaV0gPSB0bXBUaHJlc2hvbGQxOwotICAgICAgfQotCi0gICAgICBpZih0bXBUaHJlc2hvbGQyID4gcGJUaHJlc2hvbGRbaV0pIHsKLSAgICAgICAgcGJUaHJlc2hvbGRbaV0gPSB0bXBUaHJlc2hvbGQyOwotICAgICAgfQotCi0gICAgfQotICB9Ci0gIGVsc2UgewotICAgIHNjYWxpbmcgPSAtc2NhbGluZzsKLSAgICBmb3IoaSA9IDA7IGkgPCBudW1QYjsgaSsrKSB7Ci0KLSAgICAgIHRtcFRocmVzaG9sZDEgPSBwYlRocmVzaG9sZE5tMVtpXSA8PCAxOwotICAgICAgdG1wVGhyZXNob2xkMiA9IExfbXB5X2xzKHBiVGhyZXNob2xkW2ldLCBtaW5SZW1haW5pbmdUaHJlc2hvbGRGYWN0b3IpOwotCi0gICAgICAvKiBjb3B5IHRocmVzaG9sZHMgdG8gaW50ZXJuYWwgbWVtb3J5ICovCi0gICAgICBwYlRocmVzaG9sZE5tMVtpXSA9IHBiVGhyZXNob2xkW2ldOwotCi0KLSAgICAgIGlmKCgocGJUaHJlc2hvbGRbaV0gPj4gc2NhbGluZykgPiB0bXBUaHJlc2hvbGQxKSkgewotICAgICAgICBwYlRocmVzaG9sZFtpXSA9IHRtcFRocmVzaG9sZDEgPDwgc2NhbGluZzsKLSAgICAgIH0KLQotICAgICAgaWYodG1wVGhyZXNob2xkMiA+IHBiVGhyZXNob2xkW2ldKSB7Ci0gICAgICAgIHBiVGhyZXNob2xkW2ldID0gdG1wVGhyZXNob2xkMjsKLSAgICAgIH0KLQotICAgIH0KLSAgfQotfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9wc3lfY29uZmlndXJhdGlvbi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcHN5X2NvbmZpZ3VyYXRpb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ0MGY5Yi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9wc3lfY29uZmlndXJhdGlvbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTA1ICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJcHN5X2NvbmZpZ3VyYXRpb24uYwotCi0JQ29udGVudDoJUHN5Y2hvYWNjb3VzdGljIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJiYXNpY19vcC5oIgotI2luY2x1ZGUgIm9wZXJfMzJiLmgiCi0jaW5jbHVkZSAicHN5X2NvbmZpZ3VyYXRpb24uaCIKLSNpbmNsdWRlICJhZGpfdGhyLmgiCi0jaW5jbHVkZSAiYWFjX3JvbS5oIgotCi0KLQotI2RlZmluZSBCQVJDX1NDQUxFCTEwMCAvKiBpbnRlZ2VyIGJhcmMgdmFsdWVzIGFyZSBzY2FsZWQgd2l0aCAxMDAgKi8KLSNkZWZpbmUgTE9HMl8xMDAwCTMwMSAvKiBsb2cyKjEwMDAgKi8KLSNkZWZpbmUgUEkyXzEwMDAJMTU3MSAvKiBwaS8yKjEwMDAqLwotI2RlZmluZSBBVEFOX0NPRUYxCTM1NjAgLyogMTAwMC8wLjI4MDg3MmYqLwotI2RlZmluZSBBVEFOX0NPRUYyCTI4MSAvKiAxMDAwKjAuMjgwODcyZiovCi0KLQotdHlwZWRlZiBzdHJ1Y3R7Ci0gIFdvcmQzMiBzYW1wbGVSYXRlOwotICBjb25zdCBVV29yZDggKnBhcmFtTG9uZzsKLSAgY29uc3QgVVdvcmQ4ICpwYXJhbVNob3J0OwotfVNGQl9JTkZPX1RBQjsKLQotc3RhdGljIGNvbnN0IFdvcmQxNiBBQlNfTEVWID0gMjA7Ci1zdGF0aWMgY29uc3QgV29yZDE2IEJBUkNfVEhSX1FVSUVUW10gPSB7MTUsIDEwLCAgNywgIDIsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsICA1LCAxMCwgMjAsIDMwfTsKLQotCi0KLXN0YXRpYyBjb25zdCBXb3JkMTYgbWF4X2JhcmsgPSAyNDsgLyogbWF4aW11bSBiYXJrLXZhbHVlICovCi1zdGF0aWMgY29uc3QgV29yZDE2IG1hc2tMb3cgID0gMzA7IC8qIGluIDFkQi9iYXJrICovCi1zdGF0aWMgY29uc3QgV29yZDE2IG1hc2tIaWdoID0gMTU7IC8qIGluIDEqZEIvYmFyayAqLwotc3RhdGljIGNvbnN0IFdvcmQxNiBjX3JhdGlvICA9IDB4MDAyOTsgLyogcG93KDEwLjBmLCAtKDI5LjBmLzEwLjBmKSkgKi8KLQotc3RhdGljIGNvbnN0IFdvcmQxNiBtYXNrTG93U3ByRW5Mb25nID0gMzA7ICAgICAgIC8qIGluIDFkQi9iYXJrICovCi1zdGF0aWMgY29uc3QgV29yZDE2IG1hc2tIaWdoU3ByRW5Mb25nID0gMjA7ICAgICAgLyogaW4gMWRCL2JhcmsgKi8KLXN0YXRpYyBjb25zdCBXb3JkMTYgbWFza0hpZ2hTcHJFbkxvbmdMb3dCciA9IDE1OyAvKiBpbiAxZEIvYmFyayAqLwotc3RhdGljIGNvbnN0IFdvcmQxNiBtYXNrTG93U3ByRW5TaG9ydCA9IDIwOyAgICAgIC8qIGluIDFkQi9iYXJrICovCi1zdGF0aWMgY29uc3QgV29yZDE2IG1hc2tIaWdoU3ByRW5TaG9ydCA9IDE1OyAgICAgLyogaW4gMWRCL2JhcmsgKi8KLXN0YXRpYyBjb25zdCBXb3JkMTYgY19taW5SZW1haW5pbmdUaHJlc2hvbGRGYWN0b3IgPSAweDAxNDg7ICAgIC8qIDAuMDEgKigxIDw8IDE1KSovCi1zdGF0aWMgY29uc3QgV29yZDMyIGNfbWF4c25yID0gMHg2NjY2NjY2NjsJCSAvKiB1cHBlciBsaW1pdCBpcyAtMSBkQiAqLwotc3RhdGljIGNvbnN0IFdvcmQzMiBjX21pbnNuciA9IDB4MDA2MjRkZDM7CQkgLyogbG93ZXIgbGltaXQgaXMgLTI1IGRCICovCi0KLXN0YXRpYyBjb25zdCBXb3JkMzIgY19tYXhDbGlwRW5lcmd5TG9uZyA9IDB4NzczNTk0MDA7ICAvKiAyLjBlOWYqLwotc3RhdGljIGNvbnN0IFdvcmQzMiBjX21heENsaXBFbmVyZ3lTaG9ydCA9IDB4MDFkY2Q2NTA7IC8qIDIuMGU5Zi8oQUFDRU5DX1RSQU5TX0ZBQypBQUNFTkNfVFJBTlNfRkFDKSovCi0KLQotV29yZDMyIEdldFNSSW5kZXgoV29yZDMyIHNhbXBsZVJhdGUpCi17Ci0gICAgaWYgKDkyMDE3IDw9IHNhbXBsZVJhdGUpIHJldHVybiAwOwotICAgIGlmICg3NTEzMiA8PSBzYW1wbGVSYXRlKSByZXR1cm4gMTsKLSAgICBpZiAoNTU0MjYgPD0gc2FtcGxlUmF0ZSkgcmV0dXJuIDI7Ci0gICAgaWYgKDQ2MDA5IDw9IHNhbXBsZVJhdGUpIHJldHVybiAzOwotICAgIGlmICgzNzU2NiA8PSBzYW1wbGVSYXRlKSByZXR1cm4gNDsKLSAgICBpZiAoMjc3MTMgPD0gc2FtcGxlUmF0ZSkgcmV0dXJuIDU7Ci0gICAgaWYgKDIzMDA0IDw9IHNhbXBsZVJhdGUpIHJldHVybiA2OwotICAgIGlmICgxODc4MyA8PSBzYW1wbGVSYXRlKSByZXR1cm4gNzsKLSAgICBpZiAoMTM4NTYgPD0gc2FtcGxlUmF0ZSkgcmV0dXJuIDg7Ci0gICAgaWYgKDExNTAyIDw9IHNhbXBsZVJhdGUpIHJldHVybiA5OwotICAgIGlmICg5MzkxIDw9IHNhbXBsZVJhdGUpIHJldHVybiAxMDsKLQotICAgIHJldHVybiAxMTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGF0YW5fMTAwMAotKiBkZXNjcmlwdGlvbjogIGNhbGN1bGF0ZXMgMTAwMCphdGFuKHgvMTAwMCkKLSogICAgICAgICAgICAgICBiYXNlZCBvbiBhdGFuIGFwcHJveCBmb3IgeCA+IDAKLSoJCQkJYXRhbih4KSA9IHgvKChmbG9hdCkxLjBmKyhmbG9hdCkwLjI4MDg3MmYqeCp4KSAgaWYgeCA8IDEKLSoJCQkJCQk9IHBpLzIgLSB4LygoZmxvYXQpMC4yODA4NzJmICt4KngpCSAgICBpZiB4ID49IDEKLSogcmV0dXJuOiAgICAgICAxMDAwKmF0YW4oeC8xMDAwKQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBXb3JkMTYgYXRhbl8xMDAwKFdvcmQzMiB2YWwpCi17Ci0gIFdvcmQzMiB5OwotCi0KLSAgaWYoTF9zdWIodmFsLCAxMDAwKSA8IDApIHsKLSAgICB5ID0gZXh0cmFjdF9sKCgoMTAwMCAqIHZhbCkgLyAoMTAwMCArICgodmFsICogdmFsKSAvIEFUQU5fQ09FRjEpKSkpOwotICB9Ci0gIGVsc2UgewotICAgIHkgPSBQSTJfMTAwMCAtICgoMTAwMCAqIHZhbCkgLyAoQVRBTl9DT0VGMiArICgodmFsICogdmFsKSAvIDEwMDApKSk7Ci0gIH0KLQotICByZXR1cm4gZXh0cmFjdF9sKHkpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBCYXJjTGluZVZhbHVlCi0qIGRlc2NyaXB0aW9uOiAgQ2FsY3VsYXRlcyBiYXJjIHZhbHVlIGZvciBvbmUgZnJlcXVlbmN5IGxpbmUKLSogcmV0dXJuczogICAgICBiYXJjIHZhbHVlIG9mIGxpbmUgKiBCQVJDX1NDQUxFCi0qIGlucHV0OiAgICAgICAgbnVtYmVyIG9mIGxpbmVzIGluIHRyYW5zZm9ybSwgaW5kZXggb2YgbGluZSB0byBjaGVjaywgRnMKLSogb3V0cHV0OgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgV29yZDE2IEJhcmNMaW5lVmFsdWUoV29yZDE2IG5vT2ZMaW5lcywgV29yZDE2IGZmdExpbmUsIFdvcmQzMiBzYW1wbGluZ0ZyZXEpCi17Ci0gIFdvcmQzMiBjZW50ZXJfZnJlcSwgdGVtcCwgYnZhbEZGVExpbmU7Ci0KLSAgLyogY2VudGVyIGZyZXF1ZW5jeSBvZiBmZnQgbGluZSAqLwotICBjZW50ZXJfZnJlcSA9IChmZnRMaW5lICogc2FtcGxpbmdGcmVxKSAvIChub09mTGluZXMgPDwgMSk7Ci0gIHRlbXAgPSAgYXRhbl8xMDAwKChjZW50ZXJfZnJlcSA8PCAyKSAvICgzKjEwKSk7Ci0gIGJ2YWxGRlRMaW5lID0KLSAgICAoMjY2MDAgKiBhdGFuXzEwMDAoKGNlbnRlcl9mcmVxKjc2KSAvIDEwMCkgKyA3KnRlbXAqdGVtcCkgLyAoMioxMDAwKjEwMDAgLyBCQVJDX1NDQUxFKTsKLQotICByZXR1cm4gc2F0dXJhdGUoYnZhbEZGVExpbmUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogaW5pdFRoclF1aWV0Ci0qIGRlc2NyaXB0aW9uOiAgaW5pdCB0aHJlZGhvbGQgaW4gcXVpZXQKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgaW5pdFRoclF1aWV0KFdvcmQxNiAgbnVtUGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICpwYk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnBiQmFyY1ZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgKnBiVGhyZXNob2xkUXVpZXQpIHsKLSAgV29yZDE2IGk7Ci0gIFdvcmQxNiBiYXJjVGhyUXVpZXQ7Ci0KLSAgZm9yKGk9MDsgaTxudW1QYjsgaSsrKSB7Ci0gICAgV29yZDE2IGJ2MSwgYnYyOwotCi0KLSAgICBpZiAoaT4wKQotICAgICAgYnYxID0gKHBiQmFyY1ZhbFtpXSArIHBiQmFyY1ZhbFtpLTFdKSA+PiAxOwotICAgIGVsc2UKLSAgICAgIGJ2MSA9IHBiQmFyY1ZhbFtpXSA+PiAxOwotCi0KLSAgICBpZiAoaSA8IChudW1QYiAtIDEpKQotICAgICAgYnYyID0gKHBiQmFyY1ZhbFtpXSArIHBiQmFyY1ZhbFtpKzFdKSA+PiAxOwotICAgIGVsc2UgewotICAgICAgYnYyID0gcGJCYXJjVmFsW2ldOwotICAgIH0KLQotICAgIGJ2MSA9IG1pbigoYnYxIC8gQkFSQ19TQ0FMRSksIG1heF9iYXJrKTsKLSAgICBidjIgPSBtaW4oKGJ2MiAvIEJBUkNfU0NBTEUpLCBtYXhfYmFyayk7Ci0KLSAgICBiYXJjVGhyUXVpZXQgPSBtaW4oQkFSQ19USFJfUVVJRVRbYnYxXSwgQkFSQ19USFJfUVVJRVRbYnYyXSk7Ci0KLQotICAgIC8qCi0gICAgICB3ZSBjYWxjdWxhdGUKLSAgICAgIHBvdygxMC4wZiwoZmxvYXQpKGJhcmNUaHJRdWlldCAtIEFCU19MRVYpKjAuMSkqKGZsb2F0KUFCU19MT1cqKHBiT2Zmc2V0W2krMV0gLSBwYk9mZnNldFtpXSk7Ci0gICAgKi8KLQotICAgIHBiVGhyZXNob2xkUXVpZXRbaV0gPSBwb3cyX3h5KCgoKGJhcmNUaHJRdWlldCAtIEFCU19MRVYpICogMTAwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIExPRzJfMTAwMCooMTQrMipMT0dfTk9STV9QQ00pKSwgTE9HMl8xMDAwKSAqIChwYk9mZnNldFtpKzFdIC0gcGJPZmZzZXRbaV0pOwotICB9Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGluaXRTcHJlYWRpbmcKLSogZGVzY3JpcHRpb246ICBpbml0IGVuZXJneSBzcHJlYWRpbmcgcGFyYW1ldGVyCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGluaXRTcHJlYWRpbmcoV29yZDE2ICBudW1QYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpwYkJhcmNWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpwYk1hc2tMb0ZhY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpwYk1hc2tIaUZhY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpwYk1hc2tMb0ZhY3RvclNwckVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnBiTWFza0hpRmFjdG9yU3ByRW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQzMiBiaXRyYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgYmxvY2tUeXBlKQotewotICBXb3JkMTYgaTsKLSAgV29yZDE2IG1hc2tMb3dTcHJFbiwgbWFza0hpZ2hTcHJFbjsKLQotCi0gIGlmIChzdWIoYmxvY2tUeXBlLCBTSE9SVF9XSU5ET1cpICE9IDApIHsKLSAgICBtYXNrTG93U3ByRW4gPSBtYXNrTG93U3ByRW5Mb25nOwotCi0gICAgaWYgKGJpdHJhdGUgPiAyMjAwMCkKLSAgICAgIG1hc2tIaWdoU3ByRW4gPSBtYXNrSGlnaFNwckVuTG9uZzsKLSAgICBlbHNlCi0gICAgICBtYXNrSGlnaFNwckVuID0gbWFza0hpZ2hTcHJFbkxvbmdMb3dCcjsKLSAgfQotICBlbHNlIHsKLSAgICBtYXNrTG93U3ByRW4gPSBtYXNrTG93U3ByRW5TaG9ydDsKLSAgICBtYXNrSGlnaFNwckVuID0gbWFza0hpZ2hTcHJFblNob3J0OwotICB9Ci0KLSAgZm9yKGk9MDsgaTxudW1QYjsgaSsrKSB7Ci0KLSAgICBpZiAoaSA+IDApIHsKLSAgICAgIFdvcmQzMiBkYlZhbDsKLSAgICAgIFdvcmQxNiBkYmFyayA9IHBiQmFyY1ZhbHVlW2ldIC0gcGJCYXJjVmFsdWVbaS0xXTsKLQotICAgICAgLyoKLSAgICAgICAgd2UgY2FsdWxhdGUgcG93KDEwLjBmLCAtMC4xKmRiVmFsL0JBUkNfU0NBTEUpCi0gICAgICAqLwotICAgICAgZGJWYWwgPSAobWFza0hpZ2ggKiBkYmFyayk7Ci0gICAgICBwYk1hc2tIaUZhY3RvcltpXSA9IHJvdW5kMTYocG93Ml94eShMX25lZ2F0ZShkYlZhbCksIChXb3JkMzIpTE9HMl8xMDAwKSk7ICAgICAgICAgICAgIC8qIDAuMzAxIGxvZzEwKDIpICovCi0KLSAgICAgIGRiVmFsID0gKG1hc2tMb3cgKiBkYmFyayk7Ci0gICAgICBwYk1hc2tMb0ZhY3RvcltpLTFdID0gcm91bmQxNihwb3cyX3h5KExfbmVnYXRlKGRiVmFsKSwoV29yZDMyKUxPRzJfMTAwMCkpOwotCi0KLSAgICAgIGRiVmFsID0gKG1hc2tIaWdoU3ByRW4gKiBkYmFyayk7Ci0gICAgICBwYk1hc2tIaUZhY3RvclNwckVuW2ldID0gIHJvdW5kMTYocG93Ml94eShMX25lZ2F0ZShkYlZhbCksKFdvcmQzMilMT0cyXzEwMDApKTsKLSAgICAgIGRiVmFsID0gKG1hc2tMb3dTcHJFbiAqIGRiYXJrKTsKLSAgICAgIHBiTWFza0xvRmFjdG9yU3ByRW5baS0xXSA9IHJvdW5kMTYocG93Ml94eShMX25lZ2F0ZShkYlZhbCksKFdvcmQzMilMT0cyXzEwMDApKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBwYk1hc2tIaUZhY3RvcltpXSA9IDA7Ci0gICAgICBwYk1hc2tMb0ZhY3RvcltudW1QYi0xXSA9IDA7Ci0KLSAgICAgIHBiTWFza0hpRmFjdG9yU3ByRW5baV0gPSAwOwotICAgICAgcGJNYXNrTG9GYWN0b3JTcHJFbltudW1QYi0xXSA9IDA7Ci0gICAgfQotICB9Ci0KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogaW5pdEJhcmNWYWx1ZXMKLSogZGVzY3JpcHRpb246ICBpbml0IGJhcmsgdmFsdWUKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgaW5pdEJhcmNWYWx1ZXMoV29yZDE2ICBudW1QYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAqcGJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgIG51bUxpbmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICBzYW1wbGluZ0ZyZXF1ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqcGJCdmFsKQotewotICBXb3JkMTYgaTsKLSAgV29yZDE2IHBiQnZhbDAsIHBiQnZhbDE7Ci0KLSAgcGJCdmFsMCA9IDA7Ci0KLSAgZm9yKGk9MDsgaTxudW1QYjsgaSsrKXsKLSAgICBwYkJ2YWwxID0gQmFyY0xpbmVWYWx1ZShudW1MaW5lcywgcGJPZmZzZXRbaSsxXSwgc2FtcGxpbmdGcmVxdWVuY3kpOwotICAgIHBiQnZhbFtpXSA9IChwYkJ2YWwwICsgcGJCdmFsMSkgPj4gMTsKLSAgICBwYkJ2YWwwID0gcGJCdmFsMTsKLSAgfQotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBpbml0TWluU25yCi0qIGRlc2NyaXB0aW9uOiAgY2FsY3VsYXRlIG1pbiBzbnIgcGFyYW1ldGVyCi0qCQkJCW1pblNucihuKSA9IDEvKDJec2ZiUGVtaW4obikvdyhuKSAtIDEuNSkKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgaW5pdE1pblNucihjb25zdCBXb3JkMzIgIGJpdHJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQzMiAgc2FtcGxlcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICBudW1MaW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICpzZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAqcGJCYXJjVmFsLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgIHNmYkFjdGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICpzZmJNaW5TbnIpCi17Ci0gIFdvcmQxNiBzZmI7Ci0gIFdvcmQxNiBiYXJjV2lkdGg7Ci0gIFdvcmQxNiBwZVBlcldpbmRvdzsKLSAgV29yZDMyIHBlUGFydDsKLSAgV29yZDMyIHNucjsKLSAgV29yZDE2IHBiVmFsMCwgcGJWYWwxLCBzaGlmdDsKLQotICAvKiByZWxhdGl2ZSBudW1iZXIgb2YgYWN0aXZlIGJhcmtzICovCi0KLQotICBwZVBlcldpbmRvdyA9IGJpdHMycGUoZXh0cmFjdF9sKChiaXRyYXRlICogbnVtTGluZXMpIC8gc2FtcGxlcmF0ZSkpOwotCi0gIHBiVmFsMCA9IDA7Ci0KLSAgZm9yIChzZmI9MDsgc2ZiPHNmYkFjdGl2ZTsgc2ZiKyspIHsKLQotICAgIHBiVmFsMSA9IChwYkJhcmNWYWxbc2ZiXSA8PCAxKSAtIHBiVmFsMDsKLSAgICBiYXJjV2lkdGggPSBwYlZhbDEgLSBwYlZhbDA7Ci0gICAgcGJWYWwwID0gcGJWYWwxOwotCi0gICAgLyogYWxsb3cgYXQgbGVhc3QgMi40JSBvZiBwZSBmb3IgZWFjaCBhY3RpdmUgYmFyYyAqLwotCXBlUGFydCA9ICgocGVQZXJXaW5kb3cgKiAyNCkgKiAobWF4X2JhcmsgKiBiYXJjV2lkdGgpKSAvCi0gICAgICAgIChwYkJhcmNWYWxbc2ZiQWN0aXZlLTFdICogKHNmYk9mZnNldFtzZmIrMV0gLSBzZmJPZmZzZXRbc2ZiXSkpOwotCi0KLSAgICBwZVBhcnQgPSBtaW4ocGVQYXJ0LCA4NDAwKTsKLSAgICBwZVBhcnQgPSBtYXgocGVQYXJ0LCAxNDAwKTsKLQotICAgIC8qIG1pblNucihuKSA9IDEvKDJec2ZiUGVtaW4obikvdyhuKSAtIDEuNSkqLwotCS8qIHdlIGFkZCBhbiBvZmZzZXQgb2YgMl4xNiB0byB0aGUgcG93IGZ1bmN0aW9ucyAqLwotCS8qIDB4YzAwMCA9IDEuNSooMSA8PCAxNSkqLwotCi0gICAgc25yID0gcG93Ml94eSgocGVQYXJ0IC0gMTYqMTAwMCksMTAwMCkgLSAweDAwMDBjMDAwOwotCi0gICAgaWYoc25yID4gMHgwMDAwODAwMCkKLQl7Ci0JCXNoaWZ0ID0gbm9ybV9sKHNucik7Ci0JCXNuciA9IERpdl8zMigweDAwMDA4MDAwIDw8IHNoaWZ0LCBzbnIgPDwgc2hpZnQpOwotCX0KLQllbHNlCi0JewotCQlzbnIgPSAweDdmZmZmZmZmOwotCX0KLQotICAgIC8qIHVwcGVyIGxpbWl0IGlzIC0xIGRCICovCi0gICAgc25yID0gbWluKHNuciwgY19tYXhzbnIpOwotICAgIC8qIGxvd2VyIGxpbWl0IGlzIC0yNSBkQiAqLwotICAgIHNuciA9IG1heChzbnIsIGNfbWluc25yKTsKLSAgICBzZmJNaW5TbnJbc2ZiXSA9IHJvdW5kMTYoc25yKTsKLSAgfQotCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBJbml0UHN5Q29uZmlndXJhdGlvbkxvbmcKLSogZGVzY3JpcHRpb246ICBpbml0IGxvbmcgYmxvY2sgcHN5Y2hvYWNvdXN0aWMgY29uZmlndXJhdGlvbgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1Xb3JkMTYgSW5pdFBzeUNvbmZpZ3VyYXRpb25Mb25nKFdvcmQzMiBiaXRyYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgc2FtcGxlcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGJhbmR3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX0NPTkZJR1VSQVRJT05fTE9ORyAqcHN5Q29uZikKLXsKLSAgV29yZDMyIHNhbXBsZXJhdGVpbmRleDsKLSAgV29yZDE2IHNmYkJhcmNWYWxbTUFYX1NGQl9MT05HXTsKLSAgV29yZDE2IHNmYjsKLQotICAvKgotICAgIGluaXQgc2ZiIHRhYmxlCi0gICovCi0gIHNhbXBsZXJhdGVpbmRleCA9IEdldFNSSW5kZXgoc2FtcGxlcmF0ZSk7Ci0gIHBzeUNvbmYtPnNmYkNudCA9IHNmQmFuZFRvdGFsTG9uZ1tzYW1wbGVyYXRlaW5kZXhdOwotICBwc3lDb25mLT5zZmJPZmZzZXQgPSBzZkJhbmRUYWJMb25nICsgc2ZCYW5kVGFiTG9uZ09mZnNldFtzYW1wbGVyYXRlaW5kZXhdOwotICBwc3lDb25mLT5zYW1wUmF0ZUlkeCA9IHNhbXBsZXJhdGVpbmRleDsKLQotICAvKgotICAgIGNhbGN1bGF0ZSBiYXJjIHZhbHVlcyBmb3IgZWFjaCBwYgotICAqLwotICBpbml0QmFyY1ZhbHVlcyhwc3lDb25mLT5zZmJDbnQsCi0gICAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk9mZnNldCwKLSAgICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiT2Zmc2V0W3BzeUNvbmYtPnNmYkNudF0sCi0gICAgICAgICAgICAgICAgIHNhbXBsZXJhdGUsCi0gICAgICAgICAgICAgICAgIHNmYkJhcmNWYWwpOwotCi0gIC8qCi0gICAgaW5pdCB0aHJlc2hvbGRzIGluIHF1aWV0Ci0gICovCi0gIGluaXRUaHJRdWlldChwc3lDb25mLT5zZmJDbnQsCi0gICAgICAgICAgICAgICBwc3lDb25mLT5zZmJPZmZzZXQsCi0gICAgICAgICAgICAgICBzZmJCYXJjVmFsLAotICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiVGhyZXNob2xkUXVpZXQpOwotCi0gIC8qCi0gICAgY2FsY3VsYXRlIHNwcmVhZGluZyBmdW5jdGlvbgotICAqLwotICBpbml0U3ByZWFkaW5nKHBzeUNvbmYtPnNmYkNudCwKLSAgICAgICAgICAgICAgICBzZmJCYXJjVmFsLAotICAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk1hc2tMb3dGYWN0b3IsCi0gICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiTWFza0hpZ2hGYWN0b3IsCi0gICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiTWFza0xvd0ZhY3RvclNwckVuLAotICAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk1hc2tIaWdoRmFjdG9yU3ByRW4sCi0gICAgICAgICAgICAgICAgYml0cmF0ZSwKLSAgICAgICAgICAgICAgICBMT05HX1dJTkRPVyk7Ci0KLSAgLyoKLSAgICBpbml0IHJhdGlvCi0gICovCi0gIHBzeUNvbmYtPnJhdGlvID0gY19yYXRpbzsKLQotICBwc3lDb25mLT5tYXhBbGxvd2VkSW5jcmVhc2VGYWN0b3IgPSAyOwotICBwc3lDb25mLT5taW5SZW1haW5pbmdUaHJlc2hvbGRGYWN0b3IgPSBjX21pblJlbWFpbmluZ1RocmVzaG9sZEZhY3RvcjsgICAgLyogMC4wMSAqKDEgPDwgMTUpKi8KLQotICBwc3lDb25mLT5jbGlwRW5lcmd5ID0gY19tYXhDbGlwRW5lcmd5TG9uZzsKLSAgcHN5Q29uZi0+bG93cGFzc0xpbmUgPSBleHRyYWN0X2woKGJhbmR3aWR0aDw8MSkgKiBGUkFNRV9MRU5fTE9ORyAvIHNhbXBsZXJhdGUpOwotCi0gIGZvciAoc2ZiID0gMDsgc2ZiIDwgcHN5Q29uZi0+c2ZiQ250OyBzZmIrKykgewotICAgIGlmIChzdWIocHN5Q29uZi0+c2ZiT2Zmc2V0W3NmYl0sIHBzeUNvbmYtPmxvd3Bhc3NMaW5lKSA+PSAwKQotICAgICAgYnJlYWs7Ci0gIH0KLSAgcHN5Q29uZi0+c2ZiQWN0aXZlID0gc2ZiOwotCi0gIC8qCi0gICAgY2FsY3VsYXRlIG1pblNucgotICAqLwotICBpbml0TWluU25yKGJpdHJhdGUsCi0gICAgICAgICAgICAgc2FtcGxlcmF0ZSwKLSAgICAgICAgICAgICBwc3lDb25mLT5zZmJPZmZzZXRbcHN5Q29uZi0+c2ZiQ250XSwKLSAgICAgICAgICAgICBwc3lDb25mLT5zZmJPZmZzZXQsCi0gICAgICAgICAgICAgc2ZiQmFyY1ZhbCwKLSAgICAgICAgICAgICBwc3lDb25mLT5zZmJBY3RpdmUsCi0gICAgICAgICAgICAgcHN5Q29uZi0+c2ZiTWluU25yKTsKLQotCi0gIHJldHVybigwKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IEluaXRQc3lDb25maWd1cmF0aW9uU2hvcnQKLSogZGVzY3JpcHRpb246ICBpbml0IHNob3J0IGJsb2NrIHBzeWNob2Fjb3VzdGljIGNvbmZpZ3VyYXRpb24KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotV29yZDE2IEluaXRQc3lDb25maWd1cmF0aW9uU2hvcnQoV29yZDMyIGJpdHJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgc2FtcGxlcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBiYW5kd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfQ09ORklHVVJBVElPTl9TSE9SVCAqcHN5Q29uZikKLXsKLSAgV29yZDMyIHNhbXBsZXJhdGVpbmRleDsKLSAgV29yZDE2IHNmYkJhcmNWYWxbTUFYX1NGQl9TSE9SVF07Ci0gIFdvcmQxNiBzZmI7Ci0gIC8qCi0gICAgaW5pdCBzZmIgdGFibGUKLSAgKi8KLSAgc2FtcGxlcmF0ZWluZGV4ID0gR2V0U1JJbmRleChzYW1wbGVyYXRlKTsKLSAgcHN5Q29uZi0+c2ZiQ250ID0gc2ZCYW5kVG90YWxTaG9ydFtzYW1wbGVyYXRlaW5kZXhdOwotICBwc3lDb25mLT5zZmJPZmZzZXQgPSBzZkJhbmRUYWJTaG9ydCArIHNmQmFuZFRhYlNob3J0T2Zmc2V0W3NhbXBsZXJhdGVpbmRleF07Ci0gIHBzeUNvbmYtPnNhbXBSYXRlSWR4ID0gc2FtcGxlcmF0ZWluZGV4OwotICAvKgotICAgIGNhbGN1bGF0ZSBiYXJjIHZhbHVlcyBmb3IgZWFjaCBwYgotICAqLwotICBpbml0QmFyY1ZhbHVlcyhwc3lDb25mLT5zZmJDbnQsCi0gICAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk9mZnNldCwKLSAgICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiT2Zmc2V0W3BzeUNvbmYtPnNmYkNudF0sCi0gICAgICAgICAgICAgICAgIHNhbXBsZXJhdGUsCi0gICAgICAgICAgICAgICAgIHNmYkJhcmNWYWwpOwotCi0gIC8qCi0gICAgaW5pdCB0aHJlc2hvbGRzIGluIHF1aWV0Ci0gICovCi0gIGluaXRUaHJRdWlldChwc3lDb25mLT5zZmJDbnQsCi0gICAgICAgICAgICAgICBwc3lDb25mLT5zZmJPZmZzZXQsCi0gICAgICAgICAgICAgICBzZmJCYXJjVmFsLAotICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiVGhyZXNob2xkUXVpZXQpOwotCi0gIC8qCi0gICAgY2FsY3VsYXRlIHNwcmVhZGluZyBmdW5jdGlvbgotICAqLwotICBpbml0U3ByZWFkaW5nKHBzeUNvbmYtPnNmYkNudCwKLSAgICAgICAgICAgICAgICBzZmJCYXJjVmFsLAotICAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk1hc2tMb3dGYWN0b3IsCi0gICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiTWFza0hpZ2hGYWN0b3IsCi0gICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiTWFza0xvd0ZhY3RvclNwckVuLAotICAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk1hc2tIaWdoRmFjdG9yU3ByRW4sCi0gICAgICAgICAgICAgICAgYml0cmF0ZSwKLSAgICAgICAgICAgICAgICBTSE9SVF9XSU5ET1cpOwotCi0gIC8qCi0gICAgaW5pdCByYXRpbwotICAqLwotICBwc3lDb25mLT5yYXRpbyA9IGNfcmF0aW87Ci0KLSAgcHN5Q29uZi0+bWF4QWxsb3dlZEluY3JlYXNlRmFjdG9yID0gMjsKLSAgcHN5Q29uZi0+bWluUmVtYWluaW5nVGhyZXNob2xkRmFjdG9yID0gY19taW5SZW1haW5pbmdUaHJlc2hvbGRGYWN0b3I7Ci0KLSAgcHN5Q29uZi0+Y2xpcEVuZXJneSA9IGNfbWF4Q2xpcEVuZXJneVNob3J0OwotCi0gIHBzeUNvbmYtPmxvd3Bhc3NMaW5lID0gZXh0cmFjdF9sKCgoYmFuZHdpZHRoIDw8IDEpICogRlJBTUVfTEVOX1NIT1JUKSAvIHNhbXBsZXJhdGUpOwotCi0gIGZvciAoc2ZiID0gMDsgc2ZiIDwgcHN5Q29uZi0+c2ZiQ250OyBzZmIrKykgewotCi0gICAgaWYgKHBzeUNvbmYtPnNmYk9mZnNldFtzZmJdID49IHBzeUNvbmYtPmxvd3Bhc3NMaW5lKQotICAgICAgYnJlYWs7Ci0gIH0KLSAgcHN5Q29uZi0+c2ZiQWN0aXZlID0gc2ZiOwotCi0gIC8qCi0gICAgY2FsY3VsYXRlIG1pblNucgotICAqLwotICBpbml0TWluU25yKGJpdHJhdGUsCi0gICAgICAgICAgICAgc2FtcGxlcmF0ZSwKLSAgICAgICAgICAgICBwc3lDb25mLT5zZmJPZmZzZXRbcHN5Q29uZi0+c2ZiQ250XSwKLSAgICAgICAgICAgICBwc3lDb25mLT5zZmJPZmZzZXQsCi0gICAgICAgICAgICAgc2ZiQmFyY1ZhbCwKLSAgICAgICAgICAgICBwc3lDb25mLT5zZmJBY3RpdmUsCi0gICAgICAgICAgICAgcHN5Q29uZi0+c2ZiTWluU25yKTsKLQotICByZXR1cm4oMCk7Ci19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3BzeV9tYWluLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9wc3lfbWFpbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjA2NzljLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3BzeV9tYWluLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MTUgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQlwc3lfbWFpbi5jCi0KLQlDb250ZW50OglQc3ljaG9hY291c3RpYyBtYWpvciBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInR5cGVkZWYuaCIKLSNpbmNsdWRlICJiYXNpY19vcC5oIgotI2luY2x1ZGUgIm9wZXJfMzJiLmgiCi0jaW5jbHVkZSAicHN5X2NvbnN0LmgiCi0jaW5jbHVkZSAiYmxvY2tfc3dpdGNoLmgiCi0jaW5jbHVkZSAidHJhbnNmb3JtLmgiCi0jaW5jbHVkZSAic3ByZWFkaW5nLmgiCi0jaW5jbHVkZSAicHJlX2VjaG9fY29udHJvbC5oIgotI2luY2x1ZGUgImJhbmRfbnJnLmgiCi0jaW5jbHVkZSAicHN5X2NvbmZpZ3VyYXRpb24uaCIKLSNpbmNsdWRlICJwc3lfZGF0YS5oIgotI2luY2x1ZGUgIm1zX3N0ZXJlby5oIgotI2luY2x1ZGUgImludGVyZmFjZS5oIgotI2luY2x1ZGUgInBzeV9tYWluLmgiCi0jaW5jbHVkZSAiZ3JwX2RhdGEuaCIKLSNpbmNsdWRlICJ0bnNfZnVuYy5oIgotI2luY2x1ZGUgIm1lbWFsaWduLmgiCi0KLSNkZWZpbmUgVU5VU0VEKHgpICh2b2lkKSh4KQotCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgc3RhcnQgICAgICAgc2hvcnQgICAgICAgc3RvcCAqLwotc3RhdGljIFdvcmQxNiBibG9ja1R5cGUyd2luZG93U2hhcGVbXSA9IHtLQkRfV0lORE9XLFNJTkVfV0lORE9XLFNJTkVfV0lORE9XLEtCRF9XSU5ET1d9OwotCi0vKgotICBmb3J3YXJkIGRlZmluaXRpb25zCi0qLwotc3RhdGljIFdvcmQxNiBhZHZhbmNlUHN5Y2hMb25nKFBTWV9EQVRBKiBwc3lEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFROU19EQVRBKiB0bnNEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9DT05GSUdVUkFUSU9OX0xPTkcgKmhQc3lDb25mTG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwqIHBzeU91dENoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICpwU2NyYXRjaFRucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTlNfREFUQSAqdG5zRGF0YTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IGNoKTsKLQotc3RhdGljIFdvcmQxNiBhZHZhbmNlUHN5Y2hMb25nTVMgKFBTWV9EQVRBICBwc3lEYXRhW01BWF9DSEFOTkVMU10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFNZX0NPTkZJR1VSQVRJT05fTE9ORyAqaFBzeUNvbmZMb25nKTsKLQotc3RhdGljIFdvcmQxNiBhZHZhbmNlUHN5Y2hTaG9ydChQU1lfREFUQSogcHN5RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE5TX0RBVEEqIHRuc0RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBTWV9DT05GSUdVUkFUSU9OX1NIT1JUICpoUHN5Q29uZlNob3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwqIHBzeU91dENoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAqcFNjcmF0Y2hUbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFROU19EQVRBICp0bnNEYXRhMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IGNoKTsKLQotc3RhdGljIFdvcmQxNiBhZHZhbmNlUHN5Y2hTaG9ydE1TIChQU1lfREFUQSAgcHN5RGF0YVtNQVhfQ0hBTk5FTFNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQU1lfQ09ORklHVVJBVElPTl9TSE9SVCAqaFBzeUNvbmZTaG9ydCk7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IFBzeU5ldwotKiBkZXNjcmlwdGlvbjogIGFsbG9jYXRlcyBtZW1vcnkgZm9yIHBzeWNob2Fjb3VzdGljCi0qIHJldHVybnM6ICAgICAgYW4gZXJyb3IgY29kZQotKiBpbnB1dDogICAgICAgIHBvaW50ZXIgdG8gYSBwc3ljaCBoYW5kbGUKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotV29yZDE2IFBzeU5ldyhQU1lfS0VSTkVMICpoUHN5LCBXb3JkMzIgbkNoYW4sIFZPX01FTV9PUEVSQVRPUiAqcE1lbU9QKQotewotICBXb3JkMTYgaTsKLSAgV29yZDMyICptZGN0U3BlY3RydW07Ci0gIFdvcmQzMiAqc2NyYXRjaFROUzsKLSAgV29yZDE2ICptZGN0RGVsYXlCdWZmZXI7Ci0KLSAgbWRjdFNwZWN0cnVtID0gKFdvcmQzMiAqKW1lbV9tYWxsb2MocE1lbU9QLCBuQ2hhbiAqIEZSQU1FX0xFTl9MT05HICogc2l6ZW9mKFdvcmQzMiksIDMyLCBWT19JTkRFWF9FTkNfQUFDKTsKLSAgaWYoTlVMTCA9PSBtZGN0U3BlY3RydW0pCi0JICByZXR1cm4gMTsKLQotICBzY3JhdGNoVE5TID0gKFdvcmQzMiAqKW1lbV9tYWxsb2MocE1lbU9QLCBuQ2hhbiAqIEZSQU1FX0xFTl9MT05HICogc2l6ZW9mKFdvcmQzMiksIDMyLCBWT19JTkRFWF9FTkNfQUFDKTsKLSAgaWYoTlVMTCA9PSBzY3JhdGNoVE5TKQotICB7Ci0JICByZXR1cm4gMTsKLSAgfQotCi0gIG1kY3REZWxheUJ1ZmZlciA9IChXb3JkMTYgKiltZW1fbWFsbG9jKHBNZW1PUCwgbkNoYW4gKiBCTE9DS19TV0lUQ0hJTkdfT0ZGU0VUICogc2l6ZW9mKFdvcmQxNiksIDMyLCBWT19JTkRFWF9FTkNfQUFDKTsKLSAgaWYoTlVMTCA9PSBtZGN0RGVsYXlCdWZmZXIpCi0gIHsKLQkgIHJldHVybiAxOwotICB9Ci0KLSAgZm9yIChpPTA7IGk8bkNoYW47IGkrKyl7Ci0gICAgaFBzeS0+cHN5RGF0YVtpXS5tZGN0RGVsYXlCdWZmZXIgPSBtZGN0RGVsYXlCdWZmZXIgKyBpKkJMT0NLX1NXSVRDSElOR19PRkZTRVQ7Ci0gICAgaFBzeS0+cHN5RGF0YVtpXS5tZGN0U3BlY3RydW0gPSBtZGN0U3BlY3RydW0gKyBpKkZSQU1FX0xFTl9MT05HOwotICB9Ci0KLSAgaFBzeS0+cFNjcmF0Y2hUbnMgPSBzY3JhdGNoVE5TOwotCi0gIHJldHVybiAwOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBQc3lEZWxldGUKLSogZGVzY3JpcHRpb246ICBhbGxvY2F0ZXMgbWVtb3J5IGZvciBwc3ljaG9hY291c3RpYwotKiByZXR1cm5zOiAgICAgIGFuIGVycm9yIGNvZGUKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotV29yZDE2IFBzeURlbGV0ZShQU1lfS0VSTkVMICAqaFBzeSwgVk9fTUVNX09QRVJBVE9SICpwTWVtT1ApCi17Ci0gIFdvcmQzMiBuY2g7Ci0KLSAgaWYoaFBzeSkKLSAgewotCWlmKGhQc3ktPnBzeURhdGFbMF0ubWRjdERlbGF5QnVmZmVyKQotCQltZW1fZnJlZShwTWVtT1AsIGhQc3ktPnBzeURhdGFbMF0ubWRjdERlbGF5QnVmZmVyLCBWT19JTkRFWF9FTkNfQUFDKTsKLQotICAgIGlmKGhQc3ktPnBzeURhdGFbMF0ubWRjdFNwZWN0cnVtKQotCQltZW1fZnJlZShwTWVtT1AsIGhQc3ktPnBzeURhdGFbMF0ubWRjdFNwZWN0cnVtLCBWT19JTkRFWF9FTkNfQUFDKTsKLQotICAgIGZvciAobmNoPTA7IG5jaDxNQVhfQ0hBTk5FTFM7IG5jaCsrKXsKLQkgIGhQc3ktPnBzeURhdGFbbmNoXS5tZGN0RGVsYXlCdWZmZXIgPSBOVUxMOwotCSAgaFBzeS0+cHN5RGF0YVtuY2hdLm1kY3RTcGVjdHJ1bSA9IE5VTEw7Ci0JfQotCi0JaWYoaFBzeS0+cFNjcmF0Y2hUbnMpCi0JewotCQltZW1fZnJlZShwTWVtT1AsIGhQc3ktPnBTY3JhdGNoVG5zLCBWT19JTkRFWF9FTkNfQUFDKTsKLQkJaFBzeS0+cFNjcmF0Y2hUbnMgPSBOVUxMOwotCX0KLSAgfQotCi0gIHJldHVybiAwOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBQc3lPdXROZXcKLSogZGVzY3JpcHRpb246ICBhbGxvY2F0ZXMgbWVtb3J5IGZvciBwc3lPdXQgc3RydWMKLSogcmV0dXJuczogICAgICBhbiBlcnJvciBjb2RlCi0qIGlucHV0OiAgICAgICAgcG9pbnRlciB0byBhIHBzeWNoIGhhbmRsZQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1Xb3JkMTYgUHN5T3V0TmV3KFBTWV9PVVQgKmhQc3lPdXQsIFZPX01FTV9PUEVSQVRPUiAqcE1lbU9QKQotewotICBwTWVtT1AtPlNldChWT19JTkRFWF9FTkNfQUFDLCBoUHN5T3V0LCAwLCBzaXplb2YoUFNZX09VVCkpOwotICAvKgotICAgIGFsbG9jIHNvbWUgbW9yZSBzdHVmZiwgdGJkCi0gICovCi0gIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogUHN5T3V0RGVsZXRlCi0qIGRlc2NyaXB0aW9uOiAgYWxsb2NhdGVzIG1lbW9yeSBmb3IgcHN5Y2hvYWNvdXN0aWMKLSogcmV0dXJuczogICAgICBhbiBlcnJvciBjb2RlCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVdvcmQxNiBQc3lPdXREZWxldGUoUFNZX09VVCAqaFBzeU91dCwgVk9fTUVNX09QRVJBVE9SICpwTWVtT1ApCi17Ci0gIFVOVVNFRChoUHN5T3V0KTsKLSAgVU5VU0VEKHBNZW1PUCk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IHBzeU1haW5Jbml0Ci0qIGRlc2NyaXB0aW9uOiAgaW5pdGlhbGl6ZXMgcHN5Y2hvYWNvdXN0aWMKLSogcmV0dXJuczogICAgICBhbiBlcnJvciBjb2RlCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotV29yZDE2IHBzeU1haW5Jbml0KFBTWV9LRVJORUwgKmhQc3ksCi0gICAgICAgICAgICAgICAgICAgV29yZDMyIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgV29yZDMyIGJpdFJhdGUsCi0gICAgICAgICAgICAgICAgICAgV29yZDE2IGNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgIFdvcmQxNiB0bnNNYXNrLAotICAgICAgICAgICAgICAgICAgIFdvcmQxNiBiYW5kd2lkdGgpCi17Ci0gIFdvcmQxNiBjaCwgZXJyOwotICBXb3JkMzIgY2hhbm5lbEJpdFJhdGUgPSBiaXRSYXRlL2NoYW5uZWxzOwotCi0gIGVyciA9IEluaXRQc3lDb25maWd1cmF0aW9uTG9uZyhjaGFubmVsQml0UmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYW5kd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKGhQc3ktPnBzeUNvbmZMb25nKSk7Ci0KLSAgaWYgKCFlcnIpIHsKLSAgICAgIGhQc3ktPnNhbXBsZVJhdGVJZHggPSBoUHN5LT5wc3lDb25mTG9uZy5zYW1wUmF0ZUlkeDsKLQkgIGVyciA9IEluaXRUbnNDb25maWd1cmF0aW9uTG9uZyhiaXRSYXRlLCBzYW1wbGVSYXRlLCBjaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhQc3ktPnBzeUNvbmZMb25nLnRuc0NvbmYsICZoUHN5LT5wc3lDb25mTG9uZywgdG5zTWFzayYyKTsKLSAgfQotCi0gIGlmICghZXJyKQotICAgIGVyciA9IEluaXRQc3lDb25maWd1cmF0aW9uU2hvcnQoY2hhbm5lbEJpdFJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFuZHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhQc3ktPnBzeUNvbmZTaG9ydCk7Ci0gIGlmICghZXJyKSB7Ci0gICAgZXJyID0gSW5pdFRuc0NvbmZpZ3VyYXRpb25TaG9ydChiaXRSYXRlLCBzYW1wbGVSYXRlLCBjaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoUHN5LT5wc3lDb25mU2hvcnQudG5zQ29uZiwgJmhQc3ktPnBzeUNvbmZTaG9ydCwgdG5zTWFzayYxKTsKLSAgfQotCi0gIGlmICghZXJyKQotICAgIGZvcihjaD0wO2NoIDwgY2hhbm5lbHM7Y2grKyl7Ci0KLSAgICAgIEluaXRCbG9ja1N3aXRjaGluZygmaFBzeS0+cHN5RGF0YVtjaF0uYmxvY2tTd2l0Y2hpbmdDb250cm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJpdFJhdGUsIGNoYW5uZWxzKTsKLQotICAgICAgSW5pdFByZUVjaG9Db250cm9sKGhQc3ktPnBzeURhdGFbY2hdLnNmYlRocmVzaG9sZG5tMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBoUHN5LT5wc3lDb25mTG9uZy5zZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaFBzeS0+cHN5Q29uZkxvbmcuc2ZiVGhyZXNob2xkUXVpZXQpOwotICAgICAgaFBzeS0+cHN5RGF0YVtjaF0ubWRjdFNjYWxlbm0xID0gMDsKLSAgICB9Ci0KLQlyZXR1cm4oZXJyKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IHBzeU1haW4KLSogZGVzY3JpcHRpb246ICBwc3ljaG9hY291c3RpYyBtYWluIGZ1bmN0aW9uCi0qIHJldHVybnM6ICAgICAgYW4gZXJyb3IgY29kZQotKgotKiAgICBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBlbm91Z2ggaW5wdXQgZGF0YSBpcyBpbiB0aGUgbW9kdWxvIGJ1ZmZlci4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1Xb3JkMTYgcHN5TWFpbihXb3JkMTYgICAgICAgICAgICAgICAgICAgbkNoYW5uZWxzLAotICAgICAgICAgICAgICAgRUxFTUVOVF9JTkZPICAgICAgICAgICAgKmVsZW1JbmZvLAotICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgICAgICAgICAgKnRpbWVTaWduYWwsCi0gICAgICAgICAgICAgICBQU1lfREFUQSAgICAgICAgICAgICAgICAgcHN5RGF0YVtNQVhfQ0hBTk5FTFNdLAotICAgICAgICAgICAgICAgVE5TX0RBVEEgICAgICAgICAgICAgICAgIHRuc0RhdGFbTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgICAgICAgIFBTWV9DT05GSUdVUkFUSU9OX0xPTkcgICpoUHN5Q29uZkxvbmcsCi0gICAgICAgICAgICAgICBQU1lfQ09ORklHVVJBVElPTl9TSE9SVCAqaFBzeUNvbmZTaG9ydCwKLSAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAgICAgICAgICBwc3lPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sCi0gICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQgICAgICAgICAqcHN5T3V0RWxlbWVudCwKLSAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAgICAgICAgICAgICpwU2NyYXRjaFRucywKLQkJCSAgIFdvcmQzMgkJCQkgICBzYW1wbGVSYXRlKQotewotICBXb3JkMTYgbWF4U2ZiUGVyR3JvdXBbTUFYX0NIQU5ORUxTXTsKLSAgV29yZDE2IG1kY3RTY2FsaW5nQXJyYXlbTUFYX0NIQU5ORUxTXTsKLQotICBXb3JkMTYgY2g7ICAgLyogY291bnRzIHRocm91Z2ggY2hhbm5lbHMgICAgICAgICAgKi8KLSAgV29yZDE2IHNmYjsgIC8qIGNvdW50cyB0aHJvdWdoIHNjYWxlZmFjdG9yIGJhbmRzICovCi0gIFdvcmQxNiBsaW5lOyAvKiBjb3VudHMgdGhyb3VnaCBsaW5lcyAgICAgICAgICAgICAqLwotICBXb3JkMTYgY2hhbm5lbHM7Ci0gIFdvcmQxNiBtYXhTY2FsZTsKLQotICBjaGFubmVscyA9IGVsZW1JbmZvLT5uQ2hhbm5lbHNJbkVsOwotICBtYXhTY2FsZSA9IDA7Ci0KLSAgLyogYmxvY2sgc3dpdGNoaW5nICovCi0gIGZvcihjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKLSAgICBCbG9ja1N3aXRjaGluZygmcHN5RGF0YVtjaF0uYmxvY2tTd2l0Y2hpbmdDb250cm9sLAotICAgICAgICAgICAgICAgICAgIHRpbWVTaWduYWwrZWxlbUluZm8tPkNoYW5uZWxJbmRleFtjaF0sCi0JCQkJICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMpOwotICB9Ci0KLSAgLyogc3luY2ggbGVmdCBhbmQgcmlnaHQgYmxvY2sgdHlwZSAqLwotICBTeW5jQmxvY2tTd2l0Y2hpbmcoJnBzeURhdGFbMF0uYmxvY2tTd2l0Y2hpbmdDb250cm9sLAotICAgICAgICAgICAgICAgICAgICAgJnBzeURhdGFbMV0uYmxvY2tTd2l0Y2hpbmdDb250cm9sLAotICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMpOwotCi0gIC8qIHRyYW5zZm9ybQotICAgICBhbmQgZ2V0IG1heFNjYWxlIChtYXggbWRjdFNjYWxpbmcpIGZvciBhbGwgY2hhbm5lbHMgKi8KLSAgZm9yKGNoPTA7IGNoPGNoYW5uZWxzOyBjaCsrKSB7Ci0gICAgVHJhbnNmb3JtX1JlYWwocHN5RGF0YVtjaF0ubWRjdERlbGF5QnVmZmVyLAotICAgICAgICAgICAgICAgICAgIHRpbWVTaWduYWwrZWxlbUluZm8tPkNoYW5uZWxJbmRleFtjaF0sCi0gICAgICAgICAgICAgICAgICAgbkNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLm1kY3RTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICAmKG1kY3RTY2FsaW5nQXJyYXlbY2hdKSwKLSAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS5ibG9ja1N3aXRjaGluZ0NvbnRyb2wud2luZG93U2VxdWVuY2UpOwotICAgIG1heFNjYWxlID0gbWF4KG1heFNjYWxlLCBtZGN0U2NhbGluZ0FycmF5W2NoXSk7Ci0gIH0KLQotICAvKiBjb21tb24gc2NhbGluZyBmb3IgYWxsIGNoYW5uZWxzICovCi0gIGZvciAoY2g9MDsgY2g8Y2hhbm5lbHM7IGNoKyspIHsKLSAgICBXb3JkMTYgc2NhbGVEaWZmID0gbWF4U2NhbGUgLSBtZGN0U2NhbGluZ0FycmF5W2NoXTsKLQotICAgIGlmIChzY2FsZURpZmYgPiAwKSB7Ci0gICAgICBXb3JkMzIgKlNwZWN0cnVtID0gcHN5RGF0YVtjaF0ubWRjdFNwZWN0cnVtOwotCSAgZm9yKGxpbmU9MDsgbGluZTxGUkFNRV9MRU5fTE9ORzsgbGluZSsrKSB7Ci0gICAgICAgICpTcGVjdHJ1bSA9ICgqU3BlY3RydW0pID4+IHNjYWxlRGlmZjsKLQkJU3BlY3RydW0rKzsKLSAgICAgIH0KLSAgICB9Ci0gICAgcHN5RGF0YVtjaF0ubWRjdFNjYWxlID0gbWF4U2NhbGU7Ci0gIH0KLQotICBmb3IgKGNoPTA7IGNoPGNoYW5uZWxzOyBjaCsrKSB7Ci0KLSAgICBpZihwc3lEYXRhW2NoXS5ibG9ja1N3aXRjaGluZ0NvbnRyb2wud2luZG93U2VxdWVuY2UgIT0gU0hPUlRfV0lORE9XKSB7Ci0gICAgICAvKiB1cGRhdGUgbG9uZyBibG9jayBwYXJhbWV0ZXIgKi8KLQkgIGFkdmFuY2VQc3ljaExvbmcoJnBzeURhdGFbY2hdLAotICAgICAgICAgICAgICAgICAgICAgICAmdG5zRGF0YVtjaF0sCi0gICAgICAgICAgICAgICAgICAgICAgIGhQc3lDb25mTG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgJnBzeU91dENoYW5uZWxbY2hdLAotICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaFRucywKLSAgICAgICAgICAgICAgICAgICAgICAgJnRuc0RhdGFbMSAtIGNoXSwKLSAgICAgICAgICAgICAgICAgICAgICAgY2gpOwotCi0gICAgICAvKiBkZXRlcm1pbmUgbWF4U2ZiICovCi0gICAgICBmb3IgKHNmYj1oUHN5Q29uZkxvbmctPnNmYkNudC0xOyBzZmI+PTA7IHNmYi0tKSB7Ci0gICAgICAgIGZvciAobGluZT1oUHN5Q29uZkxvbmctPnNmYk9mZnNldFtzZmIrMV0gLSAxOyBsaW5lPj1oUHN5Q29uZkxvbmctPnNmYk9mZnNldFtzZmJdOyBsaW5lLS0pIHsKLQotICAgICAgICAgIGlmIChwc3lEYXRhW2NoXS5tZGN0U3BlY3RydW1bbGluZV0gIT0gMCkgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxpbmUgPj0gaFBzeUNvbmZMb25nLT5zZmJPZmZzZXRbc2ZiXSkgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBtYXhTZmJQZXJHcm91cFtjaF0gPSBzZmIgKyAxOwotCi0gICAgICAvKiBDYWxjIGJhbmR3aXNlIGVuZXJnaWVzIGZvciBtaWQgYW5kIHNpZGUgY2hhbm5lbAotICAgICAgICAgRG8gaXQgb25seSBpZiAyIGNoYW5uZWxzIGV4aXN0ICovCi0KLSAgICAgIGlmIChjaCA9PSAxKQotICAgICAgICBhZHZhbmNlUHN5Y2hMb25nTVMocHN5RGF0YSwgaFBzeUNvbmZMb25nKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBhZHZhbmNlUHN5Y2hTaG9ydCgmcHN5RGF0YVtjaF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAmdG5zRGF0YVtjaF0sCi0gICAgICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgJnBzeU91dENoYW5uZWxbY2hdLAotICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2hUbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAmdG5zRGF0YVsxIC0gY2hdLAotICAgICAgICAgICAgICAgICAgICAgICAgY2gpOwotCi0gICAgICAvKiBDYWxjIGJhbmR3aXNlIGVuZXJnaWVzIGZvciBtaWQgYW5kIHNpZGUgY2hhbm5lbAotICAgICAgICAgRG8gaXQgb25seSBpZiAyIGNoYW5uZWxzIGV4aXN0ICovCi0KLSAgICAgIGlmIChjaCA9PSAxKQotICAgICAgICBhZHZhbmNlUHN5Y2hTaG9ydE1TIChwc3lEYXRhLCBoUHN5Q29uZlNob3J0KTsKLSAgICB9Ci0gIH0KLQotICAvKiBncm91cCBzaG9ydCBkYXRhICovCi0gIGZvcihjaD0wOyBjaDxjaGFubmVsczsgY2grKykgewotCi0gICAgaWYgKHBzeURhdGFbY2hdLmJsb2NrU3dpdGNoaW5nQ29udHJvbC53aW5kb3dTZXF1ZW5jZSA9PSBTSE9SVF9XSU5ET1cpIHsKLSAgICAgIGdyb3VwU2hvcnREYXRhKHBzeURhdGFbY2hdLm1kY3RTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoVG5zLAotICAgICAgICAgICAgICAgICAgICAgJnBzeURhdGFbY2hdLnNmYlRocmVzaG9sZCwKLSAgICAgICAgICAgICAgICAgICAgICZwc3lEYXRhW2NoXS5zZmJFbmVyZ3ksCi0gICAgICAgICAgICAgICAgICAgICAmcHN5RGF0YVtjaF0uc2ZiRW5lcmd5TVMsCi0gICAgICAgICAgICAgICAgICAgICAmcHN5RGF0YVtjaF0uc2ZiU3ByZWFkZWRFbmVyZ3ksCi0gICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5zZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5zZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5zZmJNaW5TbnIsCi0gICAgICAgICAgICAgICAgICAgICBwc3lPdXRFbGVtZW50LT5ncm91cGVkU2ZiT2Zmc2V0W2NoXSwKLSAgICAgICAgICAgICAgICAgICAgICZtYXhTZmJQZXJHcm91cFtjaF0sCi0gICAgICAgICAgICAgICAgICAgICBwc3lPdXRFbGVtZW50LT5ncm91cGVkU2ZiTWluU25yW2NoXSwKLSAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLmJsb2NrU3dpdGNoaW5nQ29udHJvbC5ub09mR3JvdXBzLAotICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0uYmxvY2tTd2l0Y2hpbmdDb250cm9sLmdyb3VwTGVuKTsKLSAgICB9Ci0gIH0KLQotCi0jaWYgKE1BWF9DSEFOTkVMUz4xKQotICAvKgotICAgIHN0ZXJlbyBQcm9jZXNzaW5nCi0gICovCi0gIGlmIChjaGFubmVscyA9PSAyKSB7Ci0gICAgcHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLm1zRGlnZXN0ID0gTVNfTk9ORTsKLSAgICBtYXhTZmJQZXJHcm91cFswXSA9IG1heFNmYlBlckdyb3VwWzFdID0gbWF4KG1heFNmYlBlckdyb3VwWzBdLCBtYXhTZmJQZXJHcm91cFsxXSk7Ci0KLQotICAgIGlmIChwc3lEYXRhWzBdLmJsb2NrU3dpdGNoaW5nQ29udHJvbC53aW5kb3dTZXF1ZW5jZSAhPSBTSE9SVF9XSU5ET1cpCi0gICAgICBNc1N0ZXJlb1Byb2Nlc3NpbmcocHN5RGF0YVswXS5zZmJFbmVyZ3kuc2ZiTG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzFdLnNmYkVuZXJneS5zZmJMb25nLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0uc2ZiRW5lcmd5TVMuc2ZiTG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzFdLnNmYkVuZXJneU1TLnNmYkxvbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS5tZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS5tZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS5zZmJUaHJlc2hvbGQuc2ZiTG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzFdLnNmYlRocmVzaG9sZC5zZmJMb25nLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0uc2ZiU3ByZWFkZWRFbmVyZ3kuc2ZiTG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzFdLnNmYlNwcmVhZGVkRW5lcmd5LnNmYkxvbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKFdvcmQxNiopJnBzeU91dEVsZW1lbnQtPnRvb2xzSW5mby5tc0RpZ2VzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoV29yZDE2Kilwc3lPdXRFbGVtZW50LT50b29sc0luZm8ubXNNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgIGhQc3lDb25mTG9uZy0+c2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgIGhQc3lDb25mTG9uZy0+c2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgIG1heFNmYlBlckdyb3VwWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBXb3JkMTYqKWhQc3lDb25mTG9uZy0+c2ZiT2Zmc2V0KTsKLSAgICAgIGVsc2UKLSAgICAgICAgTXNTdGVyZW9Qcm9jZXNzaW5nKHBzeURhdGFbMF0uc2ZiRW5lcmd5LnNmYkxvbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzFdLnNmYkVuZXJneS5zZmJMb25nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS5zZmJFbmVyZ3lNUy5zZmJMb25nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS5zZmJFbmVyZ3lNUy5zZmJMb25nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS5tZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzFdLm1kY3RTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0uc2ZiVGhyZXNob2xkLnNmYkxvbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzFdLnNmYlRocmVzaG9sZC5zZmJMb25nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS5zZmJTcHJlYWRlZEVuZXJneS5zZmJMb25nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS5zZmJTcHJlYWRlZEVuZXJneS5zZmJMb25nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdvcmQxNiopJnBzeU91dEVsZW1lbnQtPnRvb2xzSW5mby5tc0RpZ2VzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChXb3JkMTYqKXBzeU91dEVsZW1lbnQtPnRvb2xzSW5mby5tc01hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzBdLmJsb2NrU3dpdGNoaW5nQ29udHJvbC5ub09mR3JvdXBzKmhQc3lDb25mU2hvcnQtPnNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQc3lDb25mU2hvcnQtPnNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFNmYlBlckdyb3VwWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IFdvcmQxNiopcHN5T3V0RWxlbWVudC0+Z3JvdXBlZFNmYk9mZnNldFswXSk7Ci0gIH0KLQotI2VuZGlmIC8qIChNQVhfQ0hBTk5FTFM+MSkgKi8KLQotICAvKgotICAgIGJ1aWxkIG91dHB1dAotICAqLwotICBmb3IoY2g9MDtjaDxjaGFubmVscztjaCsrKSB7Ci0KLSAgICBpZiAocHN5RGF0YVtjaF0uYmxvY2tTd2l0Y2hpbmdDb250cm9sLndpbmRvd1NlcXVlbmNlICE9IFNIT1JUX1dJTkRPVykKLSAgICAgIEJ1aWxkSW50ZXJmYWNlKHBzeURhdGFbY2hdLm1kY3RTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLm1kY3RTY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICZwc3lEYXRhW2NoXS5zZmJUaHJlc2hvbGQsCi0gICAgICAgICAgICAgICAgICAgICAmcHN5RGF0YVtjaF0uc2ZiRW5lcmd5LAotICAgICAgICAgICAgICAgICAgICAgJnBzeURhdGFbY2hdLnNmYlNwcmVhZGVkRW5lcmd5LAotICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0uc2ZiRW5lcmd5U3VtLAotICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0uc2ZiRW5lcmd5U3VtTVMsCi0gICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS5ibG9ja1N3aXRjaGluZ0NvbnRyb2wud2luZG93U2VxdWVuY2UsCi0gICAgICAgICAgICAgICAgICAgICBibG9ja1R5cGUyd2luZG93U2hhcGVbcHN5RGF0YVtjaF0uYmxvY2tTd2l0Y2hpbmdDb250cm9sLndpbmRvd1NlcXVlbmNlXSwKLSAgICAgICAgICAgICAgICAgICAgIGhQc3lDb25mTG9uZy0+c2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZMb25nLT5zZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICBtYXhTZmJQZXJHcm91cFtjaF0sCi0gICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZkxvbmctPnNmYk1pblNuciwKLSAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLmJsb2NrU3dpdGNoaW5nQ29udHJvbC5ub09mR3JvdXBzLAotICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0uYmxvY2tTd2l0Y2hpbmdDb250cm9sLmdyb3VwTGVuLAotICAgICAgICAgICAgICAgICAgICAgJnBzeU91dENoYW5uZWxbY2hdKTsKLSAgICBlbHNlCi0gICAgICBCdWlsZEludGVyZmFjZShwc3lEYXRhW2NoXS5tZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS5tZGN0U2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAmcHN5RGF0YVtjaF0uc2ZiVGhyZXNob2xkLAotICAgICAgICAgICAgICAgICAgICAgJnBzeURhdGFbY2hdLnNmYkVuZXJneSwKLSAgICAgICAgICAgICAgICAgICAgICZwc3lEYXRhW2NoXS5zZmJTcHJlYWRlZEVuZXJneSwKLSAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLnNmYkVuZXJneVN1bSwKLSAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLnNmYkVuZXJneVN1bU1TLAotICAgICAgICAgICAgICAgICAgICAgU0hPUlRfV0lORE9XLAotICAgICAgICAgICAgICAgICAgICAgU0lORV9XSU5ET1csCi0gICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzBdLmJsb2NrU3dpdGNoaW5nQ29udHJvbC5ub09mR3JvdXBzKmhQc3lDb25mU2hvcnQtPnNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgIHBzeU91dEVsZW1lbnQtPmdyb3VwZWRTZmJPZmZzZXRbY2hdLAotICAgICAgICAgICAgICAgICAgICAgbWF4U2ZiUGVyR3JvdXBbY2hdLAotICAgICAgICAgICAgICAgICAgICAgcHN5T3V0RWxlbWVudC0+Z3JvdXBlZFNmYk1pblNucltjaF0sCi0gICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubm9PZkdyb3VwcywKLSAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLmJsb2NrU3dpdGNoaW5nQ29udHJvbC5ncm91cExlbiwKLSAgICAgICAgICAgICAgICAgICAgICZwc3lPdXRDaGFubmVsW2NoXSk7Ci0gIH0KLQotICByZXR1cm4oMCk7IC8qIG5vIGVycm9yICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBhZHZhbmNlUHN5Y2hMb25nCi0qIGRlc2NyaXB0aW9uOiAgcHN5Y2hvYWNvdXN0aWMgZm9yIGxvbmcgYmxvY2tzCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIFdvcmQxNiBhZHZhbmNlUHN5Y2hMb25nKFBTWV9EQVRBKiBwc3lEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFROU19EQVRBKiB0bnNEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9DT05GSUdVUkFUSU9OX0xPTkcgKmhQc3lDb25mTG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwqIHBzeU91dENoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICpwU2NyYXRjaFRucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTlNfREFUQSogdG5zRGF0YTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IGNoKQotewotICBXb3JkMzIgaTsKLSAgV29yZDMyIG5vcm1FbmVyZ3lTaGlmdCA9IChwc3lEYXRhLT5tZGN0U2NhbGUgKyAxKSA8PCAxOyAvKiBpbiByZWZlcmVuY2UgY29kZSwgbWRjdCBzcGVjdHJ1bSBtdXN0IGJlIG11bHRpcGllZCB3aXRoIDIsIHNvICsxICovCi0gIFdvcmQzMiBjbGlwRW5lcmd5ID0gaFBzeUNvbmZMb25nLT5jbGlwRW5lcmd5ID4+IG5vcm1FbmVyZ3lTaGlmdDsKLSAgV29yZDMyICpkYXRhMCwgKmRhdGExLCB0ZGF0YTsKLQotICAvKiBsb3cgcGFzcyAqLwotICBkYXRhMCA9IHBzeURhdGEtPm1kY3RTcGVjdHJ1bSArIGhQc3lDb25mTG9uZy0+bG93cGFzc0xpbmU7Ci0gIGZvcihpPWhQc3lDb25mTG9uZy0+bG93cGFzc0xpbmU7IGk8RlJBTUVfTEVOX0xPTkc7IGkrKykgewotICAgICpkYXRhMCsrID0gMDsKLSAgfQotCi0gIC8qIENhbGMgc2ZiLWJhbmR3aXNlIG1kY3QtZW5lcmdpZXMgZm9yIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWwgKi8KLSAgQ2FsY0JhbmRFbmVyZ3koIHBzeURhdGEtPm1kY3RTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgIGhQc3lDb25mTG9uZy0+c2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgaFBzeUNvbmZMb25nLT5zZmJBY3RpdmUsCi0gICAgICAgICAgICAgICAgICBwc3lEYXRhLT5zZmJFbmVyZ3kuc2ZiTG9uZywKLSAgICAgICAgICAgICAgICAgICZwc3lEYXRhLT5zZmJFbmVyZ3lTdW0uc2ZiTG9uZyk7Ci0KLSAgLyoKLSAgICBUTlMgZGV0ZWN0Ci0gICovCi0gIFRuc0RldGVjdCh0bnNEYXRhLAotICAgICAgICAgICAgaFBzeUNvbmZMb25nLT50bnNDb25mLAotICAgICAgICAgICAgcFNjcmF0Y2hUbnMsCi0gICAgICAgICAgICAoY29uc3QgV29yZDE2KiloUHN5Q29uZkxvbmctPnNmYk9mZnNldCwKLSAgICAgICAgICAgIHBzeURhdGEtPm1kY3RTcGVjdHJ1bSwKLSAgICAgICAgICAgIDAsCi0gICAgICAgICAgICBwc3lEYXRhLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wud2luZG93U2VxdWVuY2UsCi0gICAgICAgICAgICBwc3lEYXRhLT5zZmJFbmVyZ3kuc2ZiTG9uZyk7Ci0KLSAgLyogIFRuc1N5bmMgKi8KLSAgaWYgKGNoID09IDEpIHsKLSAgICBUbnNTeW5jKHRuc0RhdGEsCi0gICAgICAgICAgICB0bnNEYXRhMiwKLSAgICAgICAgICAgIGhQc3lDb25mTG9uZy0+dG5zQ29uZiwKLSAgICAgICAgICAgIDAsCi0gICAgICAgICAgICBwc3lEYXRhLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wud2luZG93U2VxdWVuY2UpOwotICB9Ci0KLSAgLyogIFRucyBFbmNvZGVyICovCi0gIFRuc0VuY29kZSgmcHN5T3V0Q2hhbm5lbC0+dG5zSW5mbywKLSAgICAgICAgICAgIHRuc0RhdGEsCi0gICAgICAgICAgICBoUHN5Q29uZkxvbmctPnNmYkNudCwKLSAgICAgICAgICAgIGhQc3lDb25mTG9uZy0+dG5zQ29uZiwKLSAgICAgICAgICAgIGhQc3lDb25mTG9uZy0+bG93cGFzc0xpbmUsCi0gICAgICAgICAgICBwc3lEYXRhLT5tZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAwLAotICAgICAgICAgICAgcHN5RGF0YS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLndpbmRvd1NlcXVlbmNlKTsKLQotICAvKiBmaXJzdCBwYXJ0IG9mIHRocmVzaG9sZCBjYWxjdWxhdGlvbiAqLwotICBkYXRhMCA9IHBzeURhdGEtPnNmYkVuZXJneS5zZmJMb25nOwotICBkYXRhMSA9IHBzeURhdGEtPnNmYlRocmVzaG9sZC5zZmJMb25nOwotICBmb3IgKGk9aFBzeUNvbmZMb25nLT5zZmJDbnQ7IGk7IGktLSkgewotICAgIHRkYXRhID0gTF9tcHlfbHMoKmRhdGEwKyssIGhQc3lDb25mTG9uZy0+cmF0aW8pOwotICAgICpkYXRhMSsrID0gbWluKHRkYXRhLCBjbGlwRW5lcmd5KTsKLSAgfQotCi0gIC8qIENhbGMgc2ZiLWJhbmR3aXNlIG1kY3QtZW5lcmdpZXMgZm9yIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWwgYWdhaW4gKi8KLSAgaWYgKHRuc0RhdGEtPmRhdGFSYXcudG5zTG9uZy5zdWJCbG9ja0luZm8udG5zQWN0aXZlIT0wKSB7Ci0gICAgV29yZDE2IHRuc1N0YXJ0QmFuZCA9IGhQc3lDb25mTG9uZy0+dG5zQ29uZi50bnNTdGFydEJhbmQ7Ci0gICAgQ2FsY0JhbmRFbmVyZ3koIHBzeURhdGEtPm1kY3RTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZMb25nLT5zZmJPZmZzZXQrdG5zU3RhcnRCYW5kLAotICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZkxvbmctPnNmYkFjdGl2ZSAtIHRuc1N0YXJ0QmFuZCwKLSAgICAgICAgICAgICAgICAgICAgcHN5RGF0YS0+c2ZiRW5lcmd5LnNmYkxvbmcrdG5zU3RhcnRCYW5kLAotICAgICAgICAgICAgICAgICAgICAmcHN5RGF0YS0+c2ZiRW5lcmd5U3VtLnNmYkxvbmcpOwotCi0JZGF0YTAgPSBwc3lEYXRhLT5zZmJFbmVyZ3kuc2ZiTG9uZzsKLQl0ZGF0YSA9IHBzeURhdGEtPnNmYkVuZXJneVN1bS5zZmJMb25nOwotCWZvciAoaT0wOyBpPHRuc1N0YXJ0QmFuZDsgaSsrKQotICAgICAgdGRhdGEgKz0gKmRhdGEwKys7Ci0KLQlwc3lEYXRhLT5zZmJFbmVyZ3lTdW0uc2ZiTG9uZyA9IHRkYXRhOwotICB9Ci0KLQotICAvKiBzcHJlYWRpbmcgZW5lcmd5ICovCi0gIFNwcmVhZGluZ01heChoUHN5Q29uZkxvbmctPnNmYkNudCwKLSAgICAgICAgICAgICAgIGhQc3lDb25mTG9uZy0+c2ZiTWFza0xvd0ZhY3RvciwKLSAgICAgICAgICAgICAgIGhQc3lDb25mTG9uZy0+c2ZiTWFza0hpZ2hGYWN0b3IsCi0gICAgICAgICAgICAgICBwc3lEYXRhLT5zZmJUaHJlc2hvbGQuc2ZiTG9uZyk7Ci0KLSAgLyogdGhyZXNob2xkIGluIHF1aWV0ICovCi0gIGRhdGEwID0gcHN5RGF0YS0+c2ZiVGhyZXNob2xkLnNmYkxvbmc7Ci0gIGRhdGExID0gaFBzeUNvbmZMb25nLT5zZmJUaHJlc2hvbGRRdWlldDsKLSAgZm9yIChpPWhQc3lDb25mTG9uZy0+c2ZiQ250OyBpOyBpLS0pCi0gIHsKLQkgICpkYXRhMCA9IG1heCgqZGF0YTAsICgqZGF0YTEgPj4gbm9ybUVuZXJneVNoaWZ0KSk7Ci0JICBkYXRhMCsrOyBkYXRhMSsrOwotICB9Ci0KLSAgLyogcHJlZWNobyBjb250cm9sICovCi0gIGlmIChwc3lEYXRhLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wud2luZG93U2VxdWVuY2UgPT0gU1RPUF9XSU5ET1cpIHsKLSAgICBkYXRhMCA9IHBzeURhdGEtPnNmYlRocmVzaG9sZG5tMTsKLQlmb3IgKGk9aFBzeUNvbmZMb25nLT5zZmJDbnQ7IGk7IGktLSkgewotICAgICAgKmRhdGEwKysgPSBNQVhfMzI7Ci0gICAgfQotICAgIHBzeURhdGEtPm1kY3RTY2FsZW5tMSA9IDA7Ci0gIH0KLQotICBQcmVFY2hvQ29udHJvbCggcHN5RGF0YS0+c2ZiVGhyZXNob2xkbm0xLAotICAgICAgICAgICAgICAgICAgaFBzeUNvbmZMb25nLT5zZmJDbnQsCi0gICAgICAgICAgICAgICAgICBoUHN5Q29uZkxvbmctPm1heEFsbG93ZWRJbmNyZWFzZUZhY3RvciwKLSAgICAgICAgICAgICAgICAgIGhQc3lDb25mTG9uZy0+bWluUmVtYWluaW5nVGhyZXNob2xkRmFjdG9yLAotICAgICAgICAgICAgICAgICAgcHN5RGF0YS0+c2ZiVGhyZXNob2xkLnNmYkxvbmcsCi0gICAgICAgICAgICAgICAgICBwc3lEYXRhLT5tZGN0U2NhbGUsCi0gICAgICAgICAgICAgICAgICBwc3lEYXRhLT5tZGN0U2NhbGVubTEpOwotICBwc3lEYXRhLT5tZGN0U2NhbGVubTEgPSBwc3lEYXRhLT5tZGN0U2NhbGU7Ci0KLQotICBpZiAocHN5RGF0YS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLndpbmRvd1NlcXVlbmNlPT0gU1RBUlRfV0lORE9XKSB7Ci0gICAgZGF0YTAgPSBwc3lEYXRhLT5zZmJUaHJlc2hvbGRubTE7Ci0JZm9yIChpPWhQc3lDb25mTG9uZy0+c2ZiQ250OyBpOyBpLS0pIHsKLSAgICAgICpkYXRhMCsrID0gTUFYXzMyOwotICAgIH0KLSAgICBwc3lEYXRhLT5tZGN0U2NhbGVubTEgPSAwOwotICB9Ci0KLSAgLyogYXBwbHkgdG5zIG11bHQgdGFibGUgb24gY2IgdGhyZXNob2xkcyAqLwotICBBcHBseVRuc011bHRUYWJsZVRvUmF0aW9zKGhQc3lDb25mTG9uZy0+dG5zQ29uZi50bnNSYXRpb1BhdGNoTG93ZXN0Q2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZMb25nLT50bnNDb25mLnRuc1N0YXJ0QmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bnNEYXRhLT5kYXRhUmF3LnRuc0xvbmcuc3ViQmxvY2tJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGEtPnNmYlRocmVzaG9sZC5zZmJMb25nKTsKLQotCi0gIC8qIHNwcmVhZGVkIGVuZXJneSAqLwotICBkYXRhMCA9IHBzeURhdGEtPnNmYlNwcmVhZGVkRW5lcmd5LnNmYkxvbmc7Ci0gIGRhdGExID0gcHN5RGF0YS0+c2ZiRW5lcmd5LnNmYkxvbmc7Ci0gIGZvciAoaT1oUHN5Q29uZkxvbmctPnNmYkNudDsgaTsgaS0tKSB7Ci0gICAgLy9wc3lEYXRhLT5zZmJTcHJlYWRlZEVuZXJneS5zZmJMb25nW2ldID0gcHN5RGF0YS0+c2ZiRW5lcmd5LnNmYkxvbmdbaV07Ci0JICAqZGF0YTArKyA9ICpkYXRhMSsrOwotICB9Ci0KLSAgLyogc3ByZWFkaW5nIGVuZXJneSAqLwotICBTcHJlYWRpbmdNYXgoaFBzeUNvbmZMb25nLT5zZmJDbnQsCi0gICAgICAgICAgICAgICBoUHN5Q29uZkxvbmctPnNmYk1hc2tMb3dGYWN0b3JTcHJFbiwKLSAgICAgICAgICAgICAgIGhQc3lDb25mTG9uZy0+c2ZiTWFza0hpZ2hGYWN0b3JTcHJFbiwKLSAgICAgICAgICAgICAgIHBzeURhdGEtPnNmYlNwcmVhZGVkRW5lcmd5LnNmYkxvbmcpOwotCi0gIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogYWR2YW5jZVBzeWNoTG9uZ01TCi0qIGRlc2NyaXB0aW9uOiAgIHVwZGF0ZSBtZGN0LWVuZXJnaWVzIGZvciBsZWZ0IGFkZCBvciBtaW51cyByaWdodCBjaGFubmVsCi0qCQkJCWZvciBsb25nIGJsb2NrCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBXb3JkMTYgYWR2YW5jZVBzeWNoTG9uZ01TIChQU1lfREFUQSBwc3lEYXRhW01BWF9DSEFOTkVMU10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFNZX0NPTkZJR1VSQVRJT05fTE9ORyAqaFBzeUNvbmZMb25nKQotewotICBDYWxjQmFuZEVuZXJneU1TKHBzeURhdGFbMF0ubWRjdFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMV0ubWRjdFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgIGhQc3lDb25mTG9uZy0+c2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgIGhQc3lDb25mTG9uZy0+c2ZiQWN0aXZlLAotICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0uc2ZiRW5lcmd5TVMuc2ZiTG9uZywKLSAgICAgICAgICAgICAgICAgICAmcHN5RGF0YVswXS5zZmJFbmVyZ3lTdW1NUy5zZmJMb25nLAotICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMV0uc2ZiRW5lcmd5TVMuc2ZiTG9uZywKLSAgICAgICAgICAgICAgICAgICAmcHN5RGF0YVsxXS5zZmJFbmVyZ3lTdW1NUy5zZmJMb25nKTsKLQotICByZXR1cm4gMDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogYWR2YW5jZVBzeWNoU2hvcnQKLSogZGVzY3JpcHRpb246ICBwc3ljaG9hY291c3RpYyBmb3Igc2hvcnQgYmxvY2tzCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIFdvcmQxNiBhZHZhbmNlUHN5Y2hTaG9ydChQU1lfREFUQSogcHN5RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE5TX0RBVEEqIHRuc0RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBTWV9DT05GSUdVUkFUSU9OX1NIT1JUICpoUHN5Q29uZlNob3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwqIHBzeU91dENoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAqcFNjcmF0Y2hUbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFROU19EQVRBICp0bnNEYXRhMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IGNoKQotewotICBXb3JkMzIgdzsKLSAgV29yZDMyIG5vcm1FbmVyZ3lTaGlmdCA9IChwc3lEYXRhLT5tZGN0U2NhbGUgKyAxKSA8PCAxOyAvKiBpbiByZWZlcmVuY2UgY29kZSwgbWRjdCBzcGVjdHJ1bSBtdXN0IGJlIG11bHRpcGllZCB3aXRoIDIsIHNvICsxICovCi0gIFdvcmQzMiBjbGlwRW5lcmd5ID0gaFBzeUNvbmZTaG9ydC0+Y2xpcEVuZXJneSA+PiBub3JtRW5lcmd5U2hpZnQ7Ci0gIFdvcmQzMiB3T2Zmc2V0ID0gMDsKLSAgV29yZDMyICpkYXRhMDsKLSAgY29uc3QgV29yZDMyICpkYXRhMTsKLQotICBmb3IodyA9IDA7IHcgPCBUUkFOU19GQUM7IHcrKykgewotICAgIFdvcmQzMiBpLCB0ZGF0YTsKLQotICAgIC8qIGxvdyBwYXNzICovCi0gICAgZGF0YTAgPSBwc3lEYXRhLT5tZGN0U3BlY3RydW0gKyB3T2Zmc2V0ICsgaFBzeUNvbmZTaG9ydC0+bG93cGFzc0xpbmU7Ci0JZm9yKGk9aFBzeUNvbmZTaG9ydC0+bG93cGFzc0xpbmU7IGk8RlJBTUVfTEVOX1NIT1JUOyBpKyspewotICAgICAgKmRhdGEwKysgPSAwOwotICAgIH0KLQotICAgIC8qIENhbGMgc2ZiLWJhbmR3aXNlIG1kY3QtZW5lcmdpZXMgZm9yIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWwgKi8KLSAgICBDYWxjQmFuZEVuZXJneSggcHN5RGF0YS0+bWRjdFNwZWN0cnVtK3dPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIGhQc3lDb25mU2hvcnQtPnNmYk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+c2ZiQWN0aXZlLAotICAgICAgICAgICAgICAgICAgICBwc3lEYXRhLT5zZmJFbmVyZ3kuc2ZiU2hvcnRbd10sCi0gICAgICAgICAgICAgICAgICAgICZwc3lEYXRhLT5zZmJFbmVyZ3lTdW0uc2ZiU2hvcnRbd10pOwotICAgIC8qCi0gICAgICAgVE5TCi0gICAgKi8KLSAgICBUbnNEZXRlY3QodG5zRGF0YSwKLSAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+dG5zQ29uZiwKLSAgICAgICAgICAgICAgcFNjcmF0Y2hUbnMsCi0gICAgICAgICAgICAgIChjb25zdCBXb3JkMTYqKWhQc3lDb25mU2hvcnQtPnNmYk9mZnNldCwKLSAgICAgICAgICAgICAgcHN5RGF0YS0+bWRjdFNwZWN0cnVtK3dPZmZzZXQsCi0gICAgICAgICAgICAgIHcsCi0gICAgICAgICAgICAgIHBzeURhdGEtPmJsb2NrU3dpdGNoaW5nQ29udHJvbC53aW5kb3dTZXF1ZW5jZSwKLSAgICAgICAgICAgICAgcHN5RGF0YS0+c2ZiRW5lcmd5LnNmYlNob3J0W3ddKTsKLQotICAgIC8qICBUbnNTeW5jICovCi0gICAgaWYgKGNoID09IDEpIHsKLSAgICAgIFRuc1N5bmModG5zRGF0YSwKLSAgICAgICAgICAgICAgdG5zRGF0YTIsCi0gICAgICAgICAgICAgIGhQc3lDb25mU2hvcnQtPnRuc0NvbmYsCi0gICAgICAgICAgICAgIHcsCi0gICAgICAgICAgICAgIHBzeURhdGEtPmJsb2NrU3dpdGNoaW5nQ29udHJvbC53aW5kb3dTZXF1ZW5jZSk7Ci0gICAgfQotCi0gICAgVG5zRW5jb2RlKCZwc3lPdXRDaGFubmVsLT50bnNJbmZvLAotICAgICAgICAgICAgICB0bnNEYXRhLAotICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5zZmJDbnQsCi0gICAgICAgICAgICAgIGhQc3lDb25mU2hvcnQtPnRuc0NvbmYsCi0gICAgICAgICAgICAgIGhQc3lDb25mU2hvcnQtPmxvd3Bhc3NMaW5lLAotICAgICAgICAgICAgICBwc3lEYXRhLT5tZGN0U3BlY3RydW0rd09mZnNldCwKLSAgICAgICAgICAgICAgdywKLSAgICAgICAgICAgICAgcHN5RGF0YS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLndpbmRvd1NlcXVlbmNlKTsKLQotICAgIC8qIGZpcnN0IHBhcnQgb2YgdGhyZXNob2xkIGNhbGN1bGF0aW9uICovCi0gICAgZGF0YTAgPSBwc3lEYXRhLT5zZmJUaHJlc2hvbGQuc2ZiU2hvcnRbd107Ci0JZGF0YTEgPSBwc3lEYXRhLT5zZmJFbmVyZ3kuc2ZiU2hvcnRbd107Ci0JZm9yIChpPWhQc3lDb25mU2hvcnQtPnNmYkNudDsgaTsgaS0tKSB7Ci0gICAgICB0ZGF0YSA9IExfbXB5X2xzKCpkYXRhMSsrLCBoUHN5Q29uZlNob3J0LT5yYXRpbyk7Ci0gICAgICAqZGF0YTArKyA9IG1pbih0ZGF0YSwgY2xpcEVuZXJneSk7Ci0gICAgfQotCi0gICAgLyogQ2FsYyBzZmItYmFuZHdpc2UgbWRjdC1lbmVyZ2llcyBmb3IgbGVmdCBhbmQgcmlnaHQgY2hhbm5lbCBhZ2FpbiAqLwotICAgIGlmICh0bnNEYXRhLT5kYXRhUmF3LnRuc1Nob3J0LnN1YkJsb2NrSW5mb1t3XS50bnNBY3RpdmUgIT0gMCkgewotICAgICAgV29yZDE2IHRuc1N0YXJ0QmFuZCA9IGhQc3lDb25mU2hvcnQtPnRuc0NvbmYudG5zU3RhcnRCYW5kOwotICAgICAgQ2FsY0JhbmRFbmVyZ3koIHBzeURhdGEtPm1kY3RTcGVjdHJ1bSt3T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgIGhQc3lDb25mU2hvcnQtPnNmYk9mZnNldCt0bnNTdGFydEJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgKGhQc3lDb25mU2hvcnQtPnNmYkFjdGl2ZSAtIHRuc1N0YXJ0QmFuZCksCi0gICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YS0+c2ZiRW5lcmd5LnNmYlNob3J0W3ddK3Ruc1N0YXJ0QmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAmcHN5RGF0YS0+c2ZiRW5lcmd5U3VtLnNmYlNob3J0W3ddKTsKLQotICAgICAgdGRhdGEgPSBwc3lEYXRhLT5zZmJFbmVyZ3lTdW0uc2ZiU2hvcnRbd107Ci0JICBkYXRhMCA9IHBzeURhdGEtPnNmYkVuZXJneS5zZmJTaG9ydFt3XTsKLQkgIGZvciAoaT10bnNTdGFydEJhbmQ7IGk7IGktLSkKLSAgICAgICAgdGRhdGEgKz0gKmRhdGEwKys7Ci0KLQkgIHBzeURhdGEtPnNmYkVuZXJneVN1bS5zZmJTaG9ydFt3XSA9IHRkYXRhOwotICAgIH0KLQotICAgIC8qIHNwcmVhZGluZyAqLwotICAgIFNwcmVhZGluZ01heChoUHN5Q29uZlNob3J0LT5zZmJDbnQsCi0gICAgICAgICAgICAgICAgIGhQc3lDb25mU2hvcnQtPnNmYk1hc2tMb3dGYWN0b3IsCi0gICAgICAgICAgICAgICAgIGhQc3lDb25mU2hvcnQtPnNmYk1hc2tIaWdoRmFjdG9yLAotICAgICAgICAgICAgICAgICBwc3lEYXRhLT5zZmJUaHJlc2hvbGQuc2ZiU2hvcnRbd10pOwotCi0KLSAgICAvKiB0aHJlc2hvbGQgaW4gcXVpZXQgKi8KLSAgICBkYXRhMCA9IHBzeURhdGEtPnNmYlRocmVzaG9sZC5zZmJTaG9ydFt3XTsKLQlkYXRhMSA9IGhQc3lDb25mU2hvcnQtPnNmYlRocmVzaG9sZFF1aWV0OwotCWZvciAoaT1oUHN5Q29uZlNob3J0LT5zZmJDbnQ7IGk7IGktLSkKLSAgICB7Ci0JCSpkYXRhMCA9IG1heCgqZGF0YTAsICgqZGF0YTEgPj4gbm9ybUVuZXJneVNoaWZ0KSk7Ci0KLQkJZGF0YTArKzsgZGF0YTErKzsKLQl9Ci0KLQotICAgIC8qIHByZWVjaG8gKi8KLSAgICBQcmVFY2hvQ29udHJvbCggcHN5RGF0YS0+c2ZiVGhyZXNob2xkbm0xLAotICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5zZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgIGhQc3lDb25mU2hvcnQtPm1heEFsbG93ZWRJbmNyZWFzZUZhY3RvciwKLSAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+bWluUmVtYWluaW5nVGhyZXNob2xkRmFjdG9yLAotICAgICAgICAgICAgICAgICAgICBwc3lEYXRhLT5zZmJUaHJlc2hvbGQuc2ZiU2hvcnRbd10sCi0gICAgICAgICAgICAgICAgICAgIHBzeURhdGEtPm1kY3RTY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgdz09MCA/IHBzeURhdGEtPm1kY3RTY2FsZW5tMSA6IHBzeURhdGEtPm1kY3RTY2FsZSk7Ci0KLSAgICAvKiBhcHBseSB0bnMgbXVsdCB0YWJsZSBvbiBjYiB0aHJlc2hvbGRzICovCi0gICAgQXBwbHlUbnNNdWx0VGFibGVUb1JhdGlvcyggaFBzeUNvbmZTaG9ydC0+dG5zQ29uZi50bnNSYXRpb1BhdGNoTG93ZXN0Q2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+dG5zQ29uZi50bnNTdGFydEJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG5zRGF0YS0+ZGF0YVJhdy50bnNTaG9ydC5zdWJCbG9ja0luZm9bd10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YS0+c2ZiVGhyZXNob2xkLnNmYlNob3J0W3ddKTsKLQotICAgIC8qIHNwcmVhZGVkIGVuZXJneSAqLwotICAgIGRhdGEwID0gcHN5RGF0YS0+c2ZiU3ByZWFkZWRFbmVyZ3kuc2ZiU2hvcnRbd107Ci0JZGF0YTEgPSBwc3lEYXRhLT5zZmJFbmVyZ3kuc2ZiU2hvcnRbd107Ci0JZm9yIChpPWhQc3lDb25mU2hvcnQtPnNmYkNudDsgaTsgaS0tKSB7Ci0JICAqZGF0YTArKyA9ICpkYXRhMSsrOwotICAgIH0KLSAgICBTcHJlYWRpbmdNYXgoaFBzeUNvbmZTaG9ydC0+c2ZiQ250LAotICAgICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5zZmJNYXNrTG93RmFjdG9yU3ByRW4sCi0gICAgICAgICAgICAgICAgIGhQc3lDb25mU2hvcnQtPnNmYk1hc2tIaWdoRmFjdG9yU3ByRW4sCi0gICAgICAgICAgICAgICAgIHBzeURhdGEtPnNmYlNwcmVhZGVkRW5lcmd5LnNmYlNob3J0W3ddKTsKLQotICAgIHdPZmZzZXQgKz0gRlJBTUVfTEVOX1NIT1JUOwotICB9IC8qIGZvciBUUkFOU19GQUMgKi8KLQotICBwc3lEYXRhLT5tZGN0U2NhbGVubTEgPSBwc3lEYXRhLT5tZGN0U2NhbGU7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBhZHZhbmNlUHN5Y2hTaG9ydE1TCi0qIGRlc2NyaXB0aW9uOiAgIHVwZGF0ZSBtZGN0LWVuZXJnaWVzIGZvciBsZWZ0IGFkZCBvciBtaW51cyByaWdodCBjaGFubmVsCi0qCQkJCWZvciBzaG9ydCBibG9jawotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgV29yZDE2IGFkdmFuY2VQc3ljaFNob3J0TVMgKFBTWV9EQVRBIHBzeURhdGFbTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFNZX0NPTkZJR1VSQVRJT05fU0hPUlQgKmhQc3lDb25mU2hvcnQpCi17Ci0gIFdvcmQzMiB3LCB3T2Zmc2V0OwotICB3T2Zmc2V0ID0gMDsKLSAgZm9yKHc9MDsgdzxUUkFOU19GQUM7IHcrKykgewotICAgIENhbGNCYW5kRW5lcmd5TVMocHN5RGF0YVswXS5tZGN0U3BlY3RydW0rd09mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMV0ubWRjdFNwZWN0cnVtK3dPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5zZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5zZmJBY3RpdmUsCi0gICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzBdLnNmYkVuZXJneU1TLnNmYlNob3J0W3ddLAotICAgICAgICAgICAgICAgICAgICAgJnBzeURhdGFbMF0uc2ZiRW5lcmd5U3VtTVMuc2ZiU2hvcnRbd10sCi0gICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzFdLnNmYkVuZXJneU1TLnNmYlNob3J0W3ddLAotICAgICAgICAgICAgICAgICAgICAgJnBzeURhdGFbMV0uc2ZiRW5lcmd5U3VtTVMuc2ZiU2hvcnRbd10pOwotICAgIHdPZmZzZXQgKz0gRlJBTUVfTEVOX1NIT1JUOwotICB9Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9xY19tYWluLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9xY19tYWluLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ZDc4YWEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcWNfbWFpbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTc4ICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJcWNfbWFpbi5jCi0KLQlDb250ZW50OglRdWFudGl6aW5nICYgY29kaW5nIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiYmFzaWNfb3AuaCIKLSNpbmNsdWRlICJvcGVyXzMyYi5oIgotI2luY2x1ZGUgInFjX21haW4uaCIKLSNpbmNsdWRlICJxdWFudGl6ZS5oIgotI2luY2x1ZGUgImludGVyZmFjZS5oIgotI2luY2x1ZGUgImFkal90aHIuaCIKLSNpbmNsdWRlICJzZl9lc3RpbS5oIgotI2luY2x1ZGUgInN0YXRfYml0cy5oIgotI2luY2x1ZGUgImJpdF9jbnQuaCIKLSNpbmNsdWRlICJkeW5fYml0cy5oIgotI2luY2x1ZGUgImNoYW5uZWxfbWFwLmgiCi0jaW5jbHVkZSAibWVtYWxpZ24uaCIKLQotI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpCi0KLXR5cGVkZWYgZW51bXsKLSAgRlJBTUVfTEVOX0JZVEVTX01PRFVMTyA9ICAxLAotICBGUkFNRV9MRU5fQllURVNfSU5UICAgID0gIDIKLX1GUkFNRV9MRU5fUkVTVUxUX01PREU7Ci0KLXN0YXRpYyBjb25zdCBXb3JkMTYgbWF4RmlsbEVsZW1CaXRzID0gNyArIDI3MCo4OwotCi0vKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwotCi1zdGF0aWMgV29yZDE2IGNhbGNNYXhWYWx1ZUluU2ZiKFdvcmQxNiBzZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBtYXhTZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgc2ZiT2Zmc2V0W01BWF9HUk9VUEVEX1NGQl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBxdWFudFNwZWN0cnVtW0ZSQU1FX0xFTl9MT05HXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVdvcmQxNiBtYXhWYWx1ZVtNQVhfR1JPVVBFRF9TRkJdKTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogY2FsY0ZyYW1lTGVuCi0qIGRlc2NyaXB0aW9uOiBlc3RpbWF0ZSB0aGUgZnJhbWUgbGVuZ3RoIGFjY29yZGluZyB0aGUgYml0cmF0ZXMKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIFdvcmQxNiBjYWxjRnJhbWVMZW4oV29yZDMyIGJpdFJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FX0xFTl9SRVNVTFRfTU9ERSBtb2RlKQotewotCi0gIFdvcmQzMiByZXN1bHQ7Ci0gIFdvcmQzMiBxdW90OwotCi0gIHJlc3VsdCA9IChGUkFNRV9MRU5fTE9ORyA+PiAzKSAqIGJpdFJhdGU7Ci0gIHF1b3QgPSByZXN1bHQgLyBzYW1wbGVSYXRlOwotCi0KLSAgaWYgKG1vZGUgPT0gRlJBTUVfTEVOX0JZVEVTX01PRFVMTykgewotICAgIHJlc3VsdCAtPSBxdW90ICogc2FtcGxlUmF0ZTsKLSAgfQotICBlbHNlIHsgLyogRlJBTUVfTEVOX0JZVEVTX0lOVCAqLwotICAgIHJlc3VsdCA9IHF1b3Q7Ci0gIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogIGZ1bmN0aW9uIG5hbWU6ZnJhbWVQYWRkaW5nCi0qICBkZXNjcmlwdGlvbjogQ2FsY3VsYXRlcyBpZiBwYWRkaW5nIGlzIG5lZWRlZCBmb3IgYWN0dWFsIGZyYW1lCi0qICByZXR1cm5zOiBwYWRkaW5nT24gb3Igbm90Ci0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBXb3JkMTYgZnJhbWVQYWRkaW5nKFdvcmQzMiBiaXRSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgKnBhZGRpbmdSZXN0KQotewotICBXb3JkMTYgcGFkZGluZ09uOwotICBXb3JkMTYgZGlmZmVyZW5jZTsKLQotICBwYWRkaW5nT24gPSAwOwotCi0gIGRpZmZlcmVuY2UgPSBjYWxjRnJhbWVMZW4oIGJpdFJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FX0xFTl9CWVRFU19NT0RVTE8gKTsKLSAgKnBhZGRpbmdSZXN0ID0gKnBhZGRpbmdSZXN0IC0gZGlmZmVyZW5jZTsKLQotCi0gIGlmICgqcGFkZGluZ1Jlc3QgPD0gMCApIHsKLSAgICBwYWRkaW5nT24gPSAxOwotICAgICpwYWRkaW5nUmVzdCA9ICpwYWRkaW5nUmVzdCArIHNhbXBsZVJhdGU7Ci0gIH0KLQotICByZXR1cm4gcGFkZGluZ09uOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogUUNPdXROZXcKLSogZGVzY3JpcHRpb246IGluaXQgcWNvdXQgcGFyYW1ldGVyCi0qIHJldHVybnM6ICAgICAwIGlmIHN1Y2Nlc3MKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLVdvcmQxNiBRQ091dE5ldyhRQ19PVVQgKmhRQywgV29yZDE2IG5DaGFubmVscywgVk9fTUVNX09QRVJBVE9SICpwTWVtT1ApCi17Ci0gIFdvcmQzMiBpOwotICBXb3JkMTYgKnF1YW50U3BlYzsKLSAgV29yZDE2ICpzY2Y7Ci0gIFVXb3JkMTYgKm1heFZhbHVlSW5TZmI7Ci0KLSAgcXVhbnRTcGVjID0gKFdvcmQxNiAqKW1lbV9tYWxsb2MocE1lbU9QLCBuQ2hhbm5lbHMgKiBGUkFNRV9MRU5fTE9ORyAqIHNpemVvZihXb3JkMTYpLCAzMiwgVk9fSU5ERVhfRU5DX0FBQyk7Ci0gIGlmKE5VTEwgPT0gcXVhbnRTcGVjKQotCSAgcmV0dXJuIDE7Ci0gIHNjZiA9IChXb3JkMTYgKiltZW1fbWFsbG9jKHBNZW1PUCwgbkNoYW5uZWxzICogTUFYX0dST1VQRURfU0ZCICogc2l6ZW9mKFdvcmQxNiksIDMyLCBWT19JTkRFWF9FTkNfQUFDKTsKLSAgaWYoTlVMTCA9PSBzY2YpCi0gIHsKLQkgIHJldHVybiAxOwotICB9Ci0gIG1heFZhbHVlSW5TZmIgPSAoVVdvcmQxNiAqKW1lbV9tYWxsb2MocE1lbU9QLCBuQ2hhbm5lbHMgKiBNQVhfR1JPVVBFRF9TRkIgKiBzaXplb2YoVVdvcmQxNiksIDMyLCBWT19JTkRFWF9FTkNfQUFDKTsKLSAgaWYoTlVMTCA9PSBtYXhWYWx1ZUluU2ZiKQotICB7Ci0JICByZXR1cm4gMTsKLSAgfQotCi0gIGZvciAoaT0wOyBpPG5DaGFubmVsczsgaSsrKSB7Ci0gICAgaFFDLT5xY0NoYW5uZWxbaV0ucXVhbnRTcGVjID0gcXVhbnRTcGVjICsgaSpGUkFNRV9MRU5fTE9ORzsKLQotICAgIGhRQy0+cWNDaGFubmVsW2ldLm1heFZhbHVlSW5TZmIgPSBtYXhWYWx1ZUluU2ZiICsgaSpNQVhfR1JPVVBFRF9TRkI7Ci0KLSAgICBoUUMtPnFjQ2hhbm5lbFtpXS5zY2YgPSBzY2YgKyBpKk1BWF9HUk9VUEVEX1NGQjsKLSAgfQotCi0gIHJldHVybiAwOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogUUNPdXREZWxldGUKLSogZGVzY3JpcHRpb246IHVuaW50IHFjb3V0IHBhcmFtZXRlcgotKiByZXR1cm5zOiAgICAgIDAgaWYgc3VjY2VzcwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUUNPdXREZWxldGUoUUNfT1VUKiBoUUMsIFZPX01FTV9PUEVSQVRPUiAqcE1lbU9QKQotewotICAgV29yZDMyIGk7Ci0gICBpZihoUUMpCi0gICB7Ci0gICAgICBpZihoUUMtPnFjQ2hhbm5lbFswXS5xdWFudFNwZWMpCi0JCSBtZW1fZnJlZShwTWVtT1AsIGhRQy0+cWNDaGFubmVsWzBdLnF1YW50U3BlYywgVk9fSU5ERVhfRU5DX0FBQyk7Ci0KLSAgICAgIGlmKGhRQy0+cWNDaGFubmVsWzBdLm1heFZhbHVlSW5TZmIpCi0JCSAgbWVtX2ZyZWUocE1lbU9QLCBoUUMtPnFjQ2hhbm5lbFswXS5tYXhWYWx1ZUluU2ZiLCBWT19JTkRFWF9FTkNfQUFDKTsKLQotCSAgaWYoaFFDLT5xY0NoYW5uZWxbMF0uc2NmKQotCQkgIG1lbV9mcmVlKHBNZW1PUCwgaFFDLT5xY0NoYW5uZWxbMF0uc2NmLCBWT19JTkRFWF9FTkNfQUFDKTsKLQotCSAgZm9yIChpPTA7IGk8TUFYX0NIQU5ORUxTOyBpKyspIHsKLQkJICBoUUMtPnFjQ2hhbm5lbFtpXS5xdWFudFNwZWMgPSBOVUxMOwotCi0JCSAgaFFDLT5xY0NoYW5uZWxbaV0ubWF4VmFsdWVJblNmYiA9IE5VTEw7Ci0KLQkJICBoUUMtPnFjQ2hhbm5lbFtpXS5zY2YgPSBOVUxMOwotCSAgfQotICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IFFDTmV3Ci0qIGRlc2NyaXB0aW9uOiBzZXQgUUMgdG8gemVybwotKiByZXR1cm5zOiAgICAgMCBpZiBzdWNjZXNzCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotV29yZDE2IFFDTmV3KFFDX1NUQVRFICpoUUMsIFZPX01FTV9PUEVSQVRPUiAqcE1lbU9QKQotewotICBwTWVtT1AtPlNldChWT19JTkRFWF9FTkNfQUFDLCBoUUMsMCxzaXplb2YoUUNfU1RBVEUpKTsKLQotICByZXR1cm4gKDApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IFFDRGVsZXRlCi0qIGRlc2NyaXB0aW9uOiB1bmludCBxY291dCBwYXJhbWV0ZXIKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFFDRGVsZXRlKFFDX1NUQVRFICpoUUMsIFZPX01FTV9PUEVSQVRPUiAqcE1lbU9QKQotewotICBVTlVTRUQoaFFDKTsKLSAgVU5VU0VEKHBNZW1PUCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogUUNJbml0Ci0qIGRlc2NyaXB0aW9uOiBpbml0IFFEIHBhcmFtZXRlcgotKiByZXR1cm5zOiAgICAgMCBpZiBzdWNjZXNzCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotV29yZDE2IFFDSW5pdChRQ19TVEFURSAqaFFDLAotICAgICAgICAgICAgICBzdHJ1Y3QgUUNfSU5JVCAqaW5pdCkKLXsKLSAgaFFDLT5uQ2hhbm5lbHMgICAgICAgPSBpbml0LT5lbEluZm8tPm5DaGFubmVsc0luRWw7Ci0gIGhRQy0+bWF4Qml0c1RvdCAgICAgID0gaW5pdC0+bWF4Qml0czsKLSAgaFFDLT5iaXRSZXNUb3QgICAgICAgPSBzdWIoaW5pdC0+Yml0UmVzLCBpbml0LT5hdmVyYWdlQml0cyk7Ci0gIGhRQy0+YXZlcmFnZUJpdHNUb3QgID0gaW5pdC0+YXZlcmFnZUJpdHM7Ci0gIGhRQy0+bWF4Qml0RmFjICAgICAgID0gaW5pdC0+bWF4Qml0RmFjOwotCi0gIGhRQy0+cGFkZGluZy5wYWRkaW5nUmVzdCA9IGluaXQtPnBhZGRpbmcucGFkZGluZ1Jlc3Q7Ci0KLSAgaFFDLT5nbG9iU3RhdEJpdHMgICAgPSAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yIElEX0VORCAqLwotCi0gIC8qIGNoYW5uZWwgZWxlbWVudHMgaW5pdCAqLwotICBJbml0RWxlbWVudEJpdHMoJmhRQy0+ZWxlbWVudEJpdHMsCi0gICAgICAgICAgICAgICAgICAqaW5pdC0+ZWxJbmZvLAotICAgICAgICAgICAgICAgICAgaW5pdC0+Yml0cmF0ZSwKLSAgICAgICAgICAgICAgICAgIGluaXQtPmF2ZXJhZ2VCaXRzLAotICAgICAgICAgICAgICAgICAgaFFDLT5nbG9iU3RhdEJpdHMpOwotCi0gIC8qIHRocmVzaG9sZCBwYXJhbWV0ZXIgaW5pdCAqLwotICBBZGpUaHJJbml0KCZoUUMtPmFkalRociwKLSAgICAgICAgICAgICBpbml0LT5tZWFuUGUsCi0gICAgICAgICAgICAgaFFDLT5lbGVtZW50Qml0cy5jaEJpdHJhdGUpOwotCi0gIHJldHVybiAwOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogUUNNYWluCi0qIGRlc2NyaXB0aW9uOiAgcXVhbnRpemF0aW9uIGFuZCBjb2RpbmcgdGhlIHNwZWN0cnVtCi0qIHJldHVybnM6ICAgICAgMCBpZiBzdWNjZXNzCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotV29yZDE2IFFDTWFpbihRQ19TVEFURSogaFFDLAotICAgICAgICAgICAgICBFTEVNRU5UX0JJVFMqIGVsQml0cywKLSAgICAgICAgICAgICAgQVRTX0VMRU1FTlQqIGFkalRoclN0YXRlRWxlbWVudCwKLSAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMICBwc3lPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sICAvKiBtYXkgYmUgbW9kaWZpZWQgaW4tcGxhY2UgKi8KLSAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UKiBwc3lPdXRFbGVtZW50LAotICAgICAgICAgICAgICBRQ19PVVRfQ0hBTk5FTCAgcWNPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sICAgIC8qIG91dCAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICBRQ19PVVRfRUxFTUVOVCogcWNPdXRFbGVtZW50LAotICAgICAgICAgICAgICBXb3JkMTYgbkNoYW5uZWxzLAotCQkJICBXb3JkMTYgYW5jaWxsYXJ5RGF0YUJ5dGVzKQotewotICBXb3JkMTYgbWF4Q2hEeW5CaXRzW01BWF9DSEFOTkVMU107Ci0gIFdvcmQxNiBjaEJpdERpc3RyaWJ1dGlvbltNQVhfQ0hBTk5FTFNdOwotICBXb3JkMzIgY2g7Ci0KLSAgaWYgKGVsQml0cy0+Yml0UmVzTGV2ZWwgPCAwKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgaWYgKGVsQml0cy0+Yml0UmVzTGV2ZWwgPiBlbEJpdHMtPm1heEJpdFJlc0JpdHMpIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBxY091dEVsZW1lbnQtPnN0YXRpY0JpdHNVc2VkID0gY291bnRTdGF0aWNCaXRkZW1hbmQocHN5T3V0Q2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dEVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMsCi0JCQkJCQkJCQkJCQkJICBxY091dEVsZW1lbnQtPmFkdHNVc2VkKTsKLQotCi0gIGlmIChhbmNpbGxhcnlEYXRhQnl0ZXMpIHsKLSAgICBxY091dEVsZW1lbnQtPmFuY0JpdHNVc2VkID0gNyArIChhbmNpbGxhcnlEYXRhQnl0ZXMgPDwgMyk7Ci0KLSAgICBpZiAoYW5jaWxsYXJ5RGF0YUJ5dGVzID49IDE1KQotICAgICAgcWNPdXRFbGVtZW50LT5hbmNCaXRzVXNlZCA9IHFjT3V0RWxlbWVudC0+YW5jQml0c1VzZWQgKyA4OwotICB9Ci0gIGVsc2UgewotICAgIHFjT3V0RWxlbWVudC0+YW5jQml0c1VzZWQgPSAwOwotICB9Ci0KLSAgQ2FsY0Zvcm1GYWN0b3IoaFFDLT5sb2dTZmJGb3JtRmFjdG9yLCBoUUMtPnNmYk5SZWxldmFudExpbmVzLCBoUUMtPmxvZ1NmYkVuZXJneSwgcHN5T3V0Q2hhbm5lbCwgbkNoYW5uZWxzKTsKLQotICAvKmFkanVzdCB0aHJlc2hvbGRzIGZvciB0aGUgZGVzaXJlZCBiaXRyYXRlICovCi0gIEFkanVzdFRocmVzaG9sZHMoJmhRQy0+YWRqVGhyLAotICAgICAgICAgICAgICAgICAgIGFkalRoclN0YXRlRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsLAotICAgICAgICAgICAgICAgICAgIHBzeU91dEVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgY2hCaXREaXN0cmlidXRpb24sCi0gICAgICAgICAgICAgICAgICAgaFFDLT5sb2dTZmJFbmVyZ3ksCi0gICAgICAgICAgICAgICAgICAgaFFDLT5zZmJOUmVsZXZhbnRMaW5lcywKLSAgICAgICAgICAgICAgICAgICBxY091dEVsZW1lbnQsCi0JCQkJICAgZWxCaXRzLAotCQkJCSAgIG5DaGFubmVscywKLQkJCQkgICBoUUMtPm1heEJpdEZhYyk7Ci0KLSAgLyplc3RpbWF0ZSBzY2FsZSBmYWN0b3JzICovCi0gIEVzdGltYXRlU2NhbGVGYWN0b3JzKHBzeU91dENoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgaFFDLT5sb2dTZmJFbmVyZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgIGhRQy0+bG9nU2ZiRm9ybUZhY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgaFFDLT5zZmJOUmVsZXZhbnRMaW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgbkNoYW5uZWxzKTsKLQotICAvKiBjb25kaXRpb24gdG8gcHJldmVudCBlbXB0eSBiaXRyZXNlcnZvaXIgKi8KLSAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKSB7Ci0gICAgV29yZDMyIG1heER5bkJpdHM7Ci0gICAgbWF4RHluQml0cyA9IGVsQml0cy0+YXZlcmFnZUJpdHMgKyBlbEJpdHMtPmJpdFJlc0xldmVsIC0gNzsgLyogLTcgYmVjLiBvZiBhbGlnbiBiaXRzICovCi0gICAgbWF4RHluQml0cyA9IG1heER5bkJpdHMgLSBxY091dEVsZW1lbnQtPnN0YXRpY0JpdHNVc2VkICsgcWNPdXRFbGVtZW50LT5hbmNCaXRzVXNlZDsKLSAgICBtYXhDaER5bkJpdHNbY2hdID0gZXh0cmFjdF9sKGNoQml0RGlzdHJpYnV0aW9uW2NoXSAqIG1heER5bkJpdHMgLyAxMDAwKTsKLSAgfQotCi0gIHFjT3V0RWxlbWVudC0+ZHluQml0c1VzZWQgPSAwOwotICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspIHsKLSAgICBXb3JkMzIgY2hEeW5CaXRzOwotICAgIEZsYWcgICBjb25zdHJhaW50c0Z1bGZpbGxlZDsKLSAgICBXb3JkMzIgaXRlcjsKLSAgICBpdGVyID0gMDsKLSAgICBkbyB7Ci0gICAgICBjb25zdHJhaW50c0Z1bGZpbGxlZCA9IDE7Ci0KLSAgICAgIFF1YW50aXplU3BlY3RydW0ocHN5T3V0Q2hhbm5lbFtjaF0uc2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS5tYXhTZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0uc2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLnNmYk9mZnNldHMsCi0gICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLm1kY3RTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS5nbG9iYWxHYWluLAotICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbY2hdLnNjZiwKLSAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS5xdWFudFNwZWMpOwotCi0gICAgICBpZiAoY2FsY01heFZhbHVlSW5TZmIocHN5T3V0Q2hhbm5lbFtjaF0uc2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLm1heFNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLnNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLnNmYk9mZnNldHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS5xdWFudFNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS5tYXhWYWx1ZUluU2ZiKSA+IE1BWF9RVUFOVCkgewotICAgICAgICBjb25zdHJhaW50c0Z1bGZpbGxlZCA9IDA7Ci0gICAgICB9Ci0KLSAgICAgIGNoRHluQml0cyA9IGR5bkJpdENvdW50KHFjT3V0Q2hhbm5lbFtjaF0ucXVhbnRTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS5tYXhWYWx1ZUluU2ZiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS5zY2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS53aW5kb3dTZXF1ZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLnNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLm1heFNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0uc2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS5zZmJPZmZzZXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnFjT3V0Q2hhbm5lbFtjaF0uc2VjdGlvbkRhdGEpOwotCi0gICAgICBpZiAoY2hEeW5CaXRzID49IG1heENoRHluQml0c1tjaF0pIHsKLSAgICAgICAgY29uc3RyYWludHNGdWxmaWxsZWQgPSAwOwotICAgICAgfQotCi0gICAgICBpZiAoIWNvbnN0cmFpbnRzRnVsZmlsbGVkKSB7Ci0gICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0uZ2xvYmFsR2FpbiA9IHFjT3V0Q2hhbm5lbFtjaF0uZ2xvYmFsR2FpbiArIDE7Ci0gICAgICB9Ci0KLSAgICAgIGl0ZXIgPSBpdGVyICsgMTsKLQotICAgIH0gd2hpbGUoIWNvbnN0cmFpbnRzRnVsZmlsbGVkKTsKLQotICAgIHFjT3V0RWxlbWVudC0+ZHluQml0c1VzZWQgPSBxY091dEVsZW1lbnQtPmR5bkJpdHNVc2VkICsgY2hEeW5CaXRzOwotCi0gICAgcWNPdXRDaGFubmVsW2NoXS5tZGN0U2NhbGUgICAgPSBwc3lPdXRDaGFubmVsW2NoXS5tZGN0U2NhbGU7Ci0gICAgcWNPdXRDaGFubmVsW2NoXS5ncm91cGluZ01hc2sgPSBwc3lPdXRDaGFubmVsW2NoXS5ncm91cGluZ01hc2s7Ci0gICAgcWNPdXRDaGFubmVsW2NoXS53aW5kb3dTaGFwZSAgPSBwc3lPdXRDaGFubmVsW2NoXS53aW5kb3dTaGFwZTsKLSAgfQotCi0gIC8qIHNhdmUgZHluQml0c1VzZWQgZm9yIGNvcnJlY3Rpb24gb2YgYml0czJwZSByZWxhdGlvbiAqLwotICBBZGpUaHJVcGRhdGUoYWRqVGhyU3RhdGVFbGVtZW50LCBxY091dEVsZW1lbnQtPmR5bkJpdHNVc2VkKTsKLQotICB7Ci0gICAgV29yZDE2IGJpdFJlc1NwYWNlID0gZWxCaXRzLT5tYXhCaXRSZXNCaXRzIC0gZWxCaXRzLT5iaXRSZXNMZXZlbDsKLSAgICBXb3JkMTYgZGVsdGFCaXRSZXMgPSBlbEJpdHMtPmF2ZXJhZ2VCaXRzIC0KLSAgICAgICAgICAgICAgICAgICAgICAgIChxY091dEVsZW1lbnQtPnN0YXRpY0JpdHNVc2VkICsKLSAgICAgICAgICAgICAgICAgICAgICAgICBxY091dEVsZW1lbnQtPmR5bkJpdHNVc2VkICsgcWNPdXRFbGVtZW50LT5hbmNCaXRzVXNlZCk7Ci0KLSAgICBxY091dEVsZW1lbnQtPmZpbGxCaXRzID0gbWF4KDAsIChkZWx0YUJpdFJlcyAtIGJpdFJlc1NwYWNlKSk7Ci0gIH0KLQotICByZXR1cm4gMDsgLyogT0sgKi8KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGNhbGNNYXhWYWx1ZUluU2ZiCi0qIGRlc2NyaXB0aW9uOiAgc2VhcmNoIHRoZSBtYXggU3BlY3RydW0gaW4gb25lIHNmYgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBXb3JkMTYgY2FsY01heFZhbHVlSW5TZmIoV29yZDE2IHNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IG1heFNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgc2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBzZmJPZmZzZXRbTUFYX0dST1VQRURfU0ZCXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHF1YW50U3BlY3RydW1bRlJBTUVfTEVOX0xPTkddLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVV29yZDE2IG1heFZhbHVlW01BWF9HUk9VUEVEX1NGQl0pCi17Ci0gIFdvcmQxNiBzZmJPZmZzLCBzZmI7Ci0gIFdvcmQxNiBtYXhWYWx1ZUFsbDsKLQotICBtYXhWYWx1ZUFsbCA9IDA7Ci0KLSAgZm9yKHNmYk9mZnM9MDtzZmJPZmZzPHNmYkNudDtzZmJPZmZzKz1zZmJQZXJHcm91cCkgewotICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgbWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0gICAgICBXb3JkMTYgbGluZTsKLSAgICAgIFdvcmQxNiBtYXhUaGlzU2ZiOwotICAgICAgbWF4VGhpc1NmYiA9IDA7Ci0KLSAgICAgIGZvciAobGluZSA9IHNmYk9mZnNldFtzZmJPZmZzK3NmYl07IGxpbmUgPCBzZmJPZmZzZXRbc2ZiT2ZmcytzZmIrMV07IGxpbmUrKykgewotICAgICAgICBXb3JkMTYgYWJzVmFsOwotICAgICAgICBhYnNWYWwgPSBhYnNfcyhxdWFudFNwZWN0cnVtW2xpbmVdKTsKLSAgICAgICAgbWF4VGhpc1NmYiA9IG1heChtYXhUaGlzU2ZiLCBhYnNWYWwpOwotICAgICAgfQotCi0gICAgICBtYXhWYWx1ZVtzZmJPZmZzK3NmYl0gPSBtYXhUaGlzU2ZiOwotICAgICAgbWF4VmFsdWVBbGwgPSBtYXgobWF4VmFsdWVBbGwsIG1heFRoaXNTZmIpOwotICAgIH0KLSAgfQotICByZXR1cm4gbWF4VmFsdWVBbGw7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiB1cGRhdGVCaXRyZXMKLSogZGVzY3JpcHRpb246IHVwZGF0ZSBiaXRyZXNlcnZvaXIKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHVwZGF0ZUJpdHJlcyhRQ19TVEFURSogcWNLZXJuZWwsCi0gICAgICAgICAgICAgICAgICBRQ19PVVQqICAgcWNPdXQpCi0KLXsKLSAgRUxFTUVOVF9CSVRTICplbEJpdHM7Ci0KLSAgcWNLZXJuZWwtPmJpdFJlc1RvdCA9IDA7Ci0KLSAgZWxCaXRzID0gJnFjS2VybmVsLT5lbGVtZW50Qml0czsKLQotCi0gIGlmIChlbEJpdHMtPmF2ZXJhZ2VCaXRzID4gMCkgewotICAgIC8qIGNvbnN0YW50IGJpdHJhdGUgKi8KLSAgICBXb3JkMTYgYml0c1VzZWQ7Ci0gICAgYml0c1VzZWQgPSAocWNPdXQtPnFjRWxlbWVudC5zdGF0aWNCaXRzVXNlZCArIHFjT3V0LT5xY0VsZW1lbnQuZHluQml0c1VzZWQpICsKLSAgICAgICAgICAgICAgICAgICAocWNPdXQtPnFjRWxlbWVudC5hbmNCaXRzVXNlZCArIHFjT3V0LT5xY0VsZW1lbnQuZmlsbEJpdHMpOwotICAgIGVsQml0cy0+Yml0UmVzTGV2ZWwgPSBlbEJpdHMtPmJpdFJlc0xldmVsICsgKGVsQml0cy0+YXZlcmFnZUJpdHMgLSBiaXRzVXNlZCk7Ci0gICAgcWNLZXJuZWwtPmJpdFJlc1RvdCA9IHFjS2VybmVsLT5iaXRSZXNUb3QgKyBlbEJpdHMtPmJpdFJlc0xldmVsOwotICB9Ci0gIGVsc2UgewotICAgIC8qIHZhcmlhYmxlIGJpdHJhdGUgKi8KLSAgICBlbEJpdHMtPmJpdFJlc0xldmVsID0gZWxCaXRzLT5tYXhCaXRzOwotICAgIHFjS2VybmVsLT5iaXRSZXNUb3QgPSBxY0tlcm5lbC0+bWF4Qml0c1RvdDsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IEZpbmFsaXplQml0Q29uc3VtcHRpb24KLSogZGVzY3JpcHRpb246IGNvdW50IGJpdHMgdXNlZAotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVdvcmQxNiBGaW5hbGl6ZUJpdENvbnN1bXB0aW9uKFFDX1NUQVRFICpxY0tlcm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVCogcWNPdXQpCi17Ci0gIFdvcmQzMiBuRnVsbEZpbGxFbGVtOwotICBXb3JkMzIgdG90RmlsbEJpdHM7Ci0gIFdvcmQxNiBkaWZmQml0czsKLSAgV29yZDE2IGJpdHNVc2VkOwotCi0gIHRvdEZpbGxCaXRzID0gMDsKLQotICBxY091dC0+dG90U3RhdGljQml0c1VzZWQgPSBxY0tlcm5lbC0+Z2xvYlN0YXRCaXRzOwotICBxY091dC0+dG90U3RhdGljQml0c1VzZWQgKz0gcWNPdXQtPnFjRWxlbWVudC5zdGF0aWNCaXRzVXNlZDsKLSAgcWNPdXQtPnRvdER5bkJpdHNVc2VkICAgID0gcWNPdXQtPnFjRWxlbWVudC5keW5CaXRzVXNlZDsKLSAgcWNPdXQtPnRvdEFuY0JpdHNVc2VkICAgID0gcWNPdXQtPnFjRWxlbWVudC5hbmNCaXRzVXNlZDsKLSAgcWNPdXQtPnRvdEZpbGxCaXRzICAgICAgID0gcWNPdXQtPnFjRWxlbWVudC5maWxsQml0czsKLQotICBpZiAocWNPdXQtPnFjRWxlbWVudC5maWxsQml0cykgewotICAgIHRvdEZpbGxCaXRzICs9IHFjT3V0LT5xY0VsZW1lbnQuZmlsbEJpdHM7Ci0gIH0KLQotICBuRnVsbEZpbGxFbGVtID0gKG1heCgocWNPdXQtPnRvdEZpbGxCaXRzIC0gMSksIDApIC8gbWF4RmlsbEVsZW1CaXRzKSAqIG1heEZpbGxFbGVtQml0czsKLQotICBxY091dC0+dG90RmlsbEJpdHMgPSBxY091dC0+dG90RmlsbEJpdHMgLSBuRnVsbEZpbGxFbGVtOwotCi0gIC8qIGNoZWNrIGZpbGwgZWxlbWVudHMgKi8KLQotICBpZiAocWNPdXQtPnRvdEZpbGxCaXRzID4gMCkgewotICAgIC8qIG1pbmltdW0gRmlsbGVsZW1lbnQgY29udGFpbnMgNyAoVEFHICsgYnl0ZSBjbnQpIGJpdHMgKi8KLSAgICBxY091dC0+dG90RmlsbEJpdHMgPSBtYXgoNywgcWNPdXQtPnRvdEZpbGxCaXRzKTsKLSAgICAvKiBmaWxsIGVsZW1lbnQgc2l6ZSBlcXVhbHMgbio4ICsgNyAqLwotICAgIHFjT3V0LT50b3RGaWxsQml0cyA9IHFjT3V0LT50b3RGaWxsQml0cyArICgoOCAtICgocWNPdXQtPnRvdEZpbGxCaXRzIC0gNykgJiAweDAwMDcpKSAmIDB4MDAwNyk7Ci0gIH0KLQotICBxY091dC0+dG90RmlsbEJpdHMgPSBxY091dC0+dG90RmlsbEJpdHMgKyBuRnVsbEZpbGxFbGVtOwotCi0gIC8qIG5vdyBkaXN0cmlidXRlIGV4dHJhIGZpbGxiaXRzIGFuZCBhbGlnbmJpdHMgb3ZlciBjaGFubmVsIGVsZW1lbnRzICovCi0gIHFjT3V0LT5hbGlnbkJpdHMgPSA3IC0gKChxY091dC0+dG90RHluQml0c1VzZWQgKyBxY091dC0+dG90U3RhdGljQml0c1VzZWQgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXQtPnRvdEFuY0JpdHNVc2VkICsgcWNPdXQtPnRvdEZpbGxCaXRzIC0gMSkgJiAweDAwMDcpOwotCi0KLSAgaWYgKCAocWNPdXQtPmFsaWduQml0cyArIHFjT3V0LT50b3RGaWxsQml0cyAtIHRvdEZpbGxCaXRzID09IDgpICYmCi0gICAgICAgKHFjT3V0LT50b3RGaWxsQml0cyA+IDgpKQotICAgIHFjT3V0LT50b3RGaWxsQml0cyA9IHFjT3V0LT50b3RGaWxsQml0cyAtIDg7Ci0KLQotICBkaWZmQml0cyA9IHFjT3V0LT5hbGlnbkJpdHMgKyBxY091dC0+dG90RmlsbEJpdHMgLSB0b3RGaWxsQml0czsKLQotICBpZihkaWZmQml0cz49MCkgewotICAgIHFjT3V0LT5xY0VsZW1lbnQuZmlsbEJpdHMgKz0gZGlmZkJpdHM7Ci0gIH0KLQotICBiaXRzVXNlZCA9IHFjT3V0LT50b3REeW5CaXRzVXNlZCArIHFjT3V0LT50b3RTdGF0aWNCaXRzVXNlZCArIHFjT3V0LT50b3RBbmNCaXRzVXNlZDsKLSAgYml0c1VzZWQgPSBiaXRzVXNlZCArIHFjT3V0LT50b3RGaWxsQml0cyArIHFjT3V0LT5hbGlnbkJpdHM7Ci0KLSAgaWYgKGJpdHNVc2VkID4gcWNLZXJuZWwtPm1heEJpdHNUb3QpIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgcmV0dXJuIGJpdHNVc2VkOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogQWRqdXN0Qml0cmF0ZQotKiBkZXNjcmlwdGlvbjogIGFkanVzdHMgZnJhbWVsZW5ndGggdmlhIHBhZGRpbmcgb24gYSBmcmFtZSB0byBmcmFtZSBiYXNpcywKLSogICAgICAgICAgICAgICB0byBhY2hpZXZlIGEgYml0cmF0ZSB0aGF0IGRlbWFuZHMgYSBub24gYnl0ZSBhbGlnbmVkCi0qICAgICAgICAgICAgICAgZnJhbWVsZW5ndGgKLSogcmV0dXJuOiAgICAgICBlcnJvcmNvZGUKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1Xb3JkMTYgQWRqdXN0Qml0cmF0ZShRQ19TVEFURSAgICAgICAgKmhRQywKLSAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAgICAgYml0UmF0ZSwgICAgLyogdG90YWwgYml0cmF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICAgICBzYW1wbGVSYXRlKSAvKiBvdXRwdXQgc2FtcGxpbmcgcmF0ZSAqLwotewotICBXb3JkMTYgcGFkZGluZ09uOwotICBXb3JkMTYgZnJhbWVMZW47Ci0gIFdvcmQxNiBjb2RlQml0czsKLSAgV29yZDE2IGNvZGVCaXRzTGFzdDsKLQotICAvKiBEbyB3ZSBuZWVkIGEgZXh0cmEgcGFkZGluZyBieXRlPyAqLwotICBwYWRkaW5nT24gPSBmcmFtZVBhZGRpbmcoYml0UmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmaFFDLT5wYWRkaW5nLnBhZGRpbmdSZXN0KTsKLQotICAvKiBmcmFtZSBsZW5ndGggKi8KLSAgZnJhbWVMZW4gPSBwYWRkaW5nT24gKyBjYWxjRnJhbWVMZW4oYml0UmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVfTEVOX0JZVEVTX0lOVCk7Ci0KLSAgZnJhbWVMZW4gPSBmcmFtZUxlbiA8PCAzOwotICBjb2RlQml0c0xhc3QgPSBoUUMtPmF2ZXJhZ2VCaXRzVG90IC0gaFFDLT5nbG9iU3RhdEJpdHM7Ci0gIGNvZGVCaXRzICAgICA9IGZyYW1lTGVuIC0gaFFDLT5nbG9iU3RhdEJpdHM7Ci0KLSAgLyogY2FsY3VsYXRlIGJpdHMgZm9yIGV2ZXJ5IGNoYW5uZWwgZWxlbWVudCAqLwotICBpZiAoY29kZUJpdHMgIT0gY29kZUJpdHNMYXN0KSB7Ci0gICAgV29yZDE2IHRvdGFsQml0cyA9IDA7Ci0KLSAgICBoUUMtPmVsZW1lbnRCaXRzLmF2ZXJhZ2VCaXRzID0gKGhRQy0+ZWxlbWVudEJpdHMucmVsYXRpdmVCaXRzICogY29kZUJpdHMpID4+IDE2OyAvKiByZWxhdGl2ZUJpdHMgd2FzIHNjYWxlZCBkb3duIGJ5IDIgKi8KLSAgICB0b3RhbEJpdHMgKz0gaFFDLT5lbGVtZW50Qml0cy5hdmVyYWdlQml0czsKLQotICAgIGhRQy0+ZWxlbWVudEJpdHMuYXZlcmFnZUJpdHMgPSBoUUMtPmVsZW1lbnRCaXRzLmF2ZXJhZ2VCaXRzICsgKGNvZGVCaXRzIC0gdG90YWxCaXRzKTsKLSAgfQotCi0gIGhRQy0+YXZlcmFnZUJpdHNUb3QgPSBmcmFtZUxlbjsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3F1YW50aXplLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9xdWFudGl6ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDBmNTUwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3F1YW50aXplLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NDUgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQlxdWFudGl6ZS5jCi0KLQlDb250ZW50OglxdWFudGl6YXRpb24gZnVuY3Rpb25zCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJ0eXBlZGVmLmgiCi0jaW5jbHVkZSAiYmFzaWNfb3AuaCIKLSNpbmNsdWRlICJvcGVyXzMyYi5oIgotI2luY2x1ZGUgInF1YW50aXplLmgiCi0jaW5jbHVkZSAiYWFjX3JvbS5oIgotCi0jZGVmaW5lIE1BTlRfRElHSVRTIDkKLSNkZWZpbmUgTUFOVF9TSVpFICAgKDE8PE1BTlRfRElHSVRTKQotCi1zdGF0aWMgY29uc3QgV29yZDMyIFhST1VORCA9IDB4MzNlNDI1YWY7IC8qIGZpbmFsIHJvdW5kaW5nIGNvbnN0YW50ICgtMC4wOTQ2ZisgMC41ZikgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTpwb3czNAotKiBkZXNjcmlwdGlvbjogY2FsY3VsYXRlICR4XntcZnJhY3szfXs0fX0sIGZvciAwLjUgPCB4IDwgMS4wJC4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotX19pbmxpbmUgV29yZDMyIHBvdzM0KFdvcmQzMiB4KQotewotICAvKiBpbmRleCB0YWJsZSB1c2luZyBNQU5UX0RJR0lUUyBiaXRzLCBidXQgbWFzayBvdXQgdGhlIHNpZ24gYml0IGFuZCB0aGUgTVNCCi0gICAgIHdoaWNoIGlzIGFsd2F5cyBvbmUgKi8KLSAgcmV0dXJuIG1UYWJfM180Wyh4ID4+IChJTlRfQklUUy0yLU1BTlRfRElHSVRTKSkgJiAoTUFOVF9TSVpFLTEpXTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTpxdWFudGl6ZVNpbmdsZUxpbmUKLSogZGVzY3JpcHRpb246IHF1YW50aXplcyBzcGVjdHJ1bQotKiAgICAgICAgICAgICAgcXVhU3BlY3RydW0gPSBtZGN0U3BlY3RydW1eMy80KjJeKC0oMy8xNikqZ2FpbikKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIFdvcmQxNiBxdWFudGl6ZVNpbmdsZUxpbmUoY29uc3QgV29yZDE2IGdhaW4sIGNvbnN0IFdvcmQzMiBhYnNTcGVjdHJ1bSkKLXsKLSAgV29yZDMyIGUsIG1pbnVzRmluYWxFeHAsIGZpbmFsU2hpZnQ7Ci0gIFdvcmQzMiB4OwotICBXb3JkMTYgcXVhID0gMDsKLQotCi0gIGlmIChhYnNTcGVjdHJ1bSkgewotICAgIGUgPSBub3JtX2woYWJzU3BlY3RydW0pOwotICAgIHggPSBwb3czNChhYnNTcGVjdHJ1bSA8PCBlKTsKLQotICAgIC8qIGNhbGN1bGF0ZSB0aGUgZmluYWwgZnJhY3Rpb25hbCBleHBvbmVudCB0aW1lcyAxNiAod2FzIDMqKDQqZSArIGdhaW4pICsgKElOVF9CSVRTLTEpKjE2KSAqLwotICAgIG1pbnVzRmluYWxFeHAgPSAoZSA8PCAyKSArIGdhaW47Ci0gICAgbWludXNGaW5hbEV4cCA9IChtaW51c0ZpbmFsRXhwIDw8IDEpICsgbWludXNGaW5hbEV4cDsKLSAgICBtaW51c0ZpbmFsRXhwID0gbWludXNGaW5hbEV4cCArICgoSU5UX0JJVFMtMSkgPDwgNCk7Ci0KLSAgICAvKiBzZXBhcmF0ZSB0aGUgZXhwb25lbnQgaW50byBhIHNoaWZ0LCBhbmQgYSBtdWx0aXBseSAqLwotICAgIGZpbmFsU2hpZnQgPSBtaW51c0ZpbmFsRXhwID4+IDQ7Ci0KLSAgICBpZiAoZmluYWxTaGlmdCA8IElOVF9CSVRTKSB7Ci0gICAgICB4ID0gTF9tcHlfd3goeCwgcG93MnRvbWludXNOb3ZlcjE2W21pbnVzRmluYWxFeHAgJiAxNV0pOwotCi0gICAgICB4ICs9IFhST1VORCA+PiAoSU5UX0JJVFMgLSBmaW5hbFNoaWZ0KTsKLQotICAgICAgLyogc2hpZnQgYW5kIHF1YW50aXplICovCi0JICBmaW5hbFNoaWZ0LS07Ci0KLQkgIGlmKGZpbmFsU2hpZnQgPj0gMCkKLQkJICB4ID4+PSBmaW5hbFNoaWZ0OwotCSAgZWxzZQotCQkgIHggPDw9ICgtZmluYWxTaGlmdCk7Ci0KLQkgIHF1YSA9IHNhdHVyYXRlKHgpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBxdWE7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOnF1YW50aXplTGluZXMKLSogZGVzY3JpcHRpb246IHF1YW50aXplcyBzcGVjdHJ1bSBsaW5lcwotKiAgICAgICAgICAgICAgcXVhU3BlY3RydW0gPSBtZGN0U3BlY3RydW1eMy80KjJeKC0oMy8xNikqZ2FpbikKLSogIGlucHV0OiBnbG9iYWwgZ2FpbiwgbnVtYmVyIG9mIGxpbmVzIHRvIHByb2Nlc3MsIHNwZWN0cmFsIGRhdGEKLSogIG91dHB1dDogcXVhbnRpemVkIHNwZWN0cnVtCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHF1YW50aXplTGluZXMoY29uc3QgV29yZDE2IGdhaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBub09mTGluZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQzMiAqbWRjdFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnF1YVNwZWN0cnVtKQotewotICBXb3JkMzIgbGluZTsKLSAgV29yZDMyIG0gPSBnYWluJjM7Ci0gIFdvcmQzMiBnID0gKGdhaW4gPj4gMikgKyA0OwotICBXb3JkMzIgbWRjdFNwZUw7Ci0gIGNvbnN0IFdvcmQxNiAqcHF1YXQ7Ci0gICAgLyogZ2FpbiYzICovCi0KLSAgcHF1YXQgPSBxdWFudEJvcmRlcnNbbV07Ci0KLSAgZyArPSAxNjsKLQotICBpZihnID49IDApCi0gIHsKLQlmb3IgKGxpbmU9MDsgbGluZTxub09mTGluZXM7IGxpbmUrKykgewotCSAgV29yZDMyIHF1YTsKLQkgIHF1YSA9IDA7Ci0KLQkgIG1kY3RTcGVMID0gbWRjdFNwZWN0cnVtW2xpbmVdOwotCi0JICBpZiAobWRjdFNwZUwpIHsKLQkJV29yZDMyIHNhOwotCQlXb3JkMzIgc2FTaGZ0OwotCi0gICAgICAgIHNhID0gTF9hYnMobWRjdFNwZUwpOwotICAgICAgICAvL3NhU2hmdCA9IExfc2hyKHNhLCAxNiArIGcpOwotCSAgICBzYVNoZnQgPSBzYSA+PiBnOwotCi0gICAgICAgIGlmIChzYVNoZnQgPiBwcXVhdFswXSkgewotCi0gICAgICAgICAgaWYgKHNhU2hmdCA8IHBxdWF0WzFdKSB7Ci0KLSAgICAgICAgICAgIHF1YSA9IG1kY3RTcGVMPjAgPyAxIDogLTE7Ci0JCSAgfQotICAgICAgICAgIGVsc2UgewotCi0gICAgICAgICAgICBpZiAoc2FTaGZ0IDwgcHF1YXRbMl0pIHsKLQotICAgICAgICAgICAgICBxdWEgPSBtZGN0U3BlTD4wID8gMiA6IC0yOwotCQkJfQotICAgICAgICAgICAgZWxzZSB7Ci0KLSAgICAgICAgICAgICAgaWYgKHNhU2hmdCA8IHBxdWF0WzNdKSB7Ci0KLSAgICAgICAgICAgICAgICBxdWEgPSBtZGN0U3BlTD4wID8gMyA6IC0zOwotCQkJICB9Ci0gICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHF1YSA9IHF1YW50aXplU2luZ2xlTGluZShnYWluLCBzYSk7Ci0gICAgICAgICAgICAgICAgLyogYWRqdXN0IHRoZSBzaWduLiBTaW5jZSAwIDwgcXVhIDwgMSwgdGhpcyBjYW5ub3Qgb3ZlcmZsb3cuICovCi0KLSAgICAgICAgICAgICAgICBpZiAobWRjdFNwZUwgPCAwKQotICAgICAgICAgICAgICAgICAgcXVhID0gLXF1YTsKLQkJCSAgfQotCQkJfQotCQkgIH0KLQkJfQotCSAgfQotICAgICAgcXVhU3BlY3RydW1bbGluZV0gPSBxdWEgOwotCX0KLSAgfQotICBlbHNlCi0gIHsKLQlmb3IgKGxpbmU9MDsgbGluZTxub09mTGluZXM7IGxpbmUrKykgewotCSAgV29yZDMyIHF1YTsKLQkgIHF1YSA9IDA7Ci0KLQkgIG1kY3RTcGVMID0gbWRjdFNwZWN0cnVtW2xpbmVdOwotCi0JICBpZiAobWRjdFNwZUwpIHsKLQkJV29yZDMyIHNhOwotCQlXb3JkMzIgc2FTaGZ0OwotCi0gICAgICAgIHNhID0gTF9hYnMobWRjdFNwZUwpOwotICAgICAgICBzYVNoZnQgPSBzYSA8PCBnOwotCi0gICAgICAgIGlmIChzYVNoZnQgPiBwcXVhdFswXSkgewotCi0gICAgICAgICAgaWYgKHNhU2hmdCA8IHBxdWF0WzFdKSB7Ci0KLSAgICAgICAgICAgIHF1YSA9IG1kY3RTcGVMPjAgPyAxIDogLTE7Ci0JCSAgfQotICAgICAgICAgIGVsc2UgewotCi0gICAgICAgICAgICBpZiAoc2FTaGZ0IDwgcHF1YXRbMl0pIHsKLQotICAgICAgICAgICAgICBxdWEgPSBtZGN0U3BlTD4wID8gMiA6IC0yOwotCQkJfQotICAgICAgICAgICAgZWxzZSB7Ci0KLSAgICAgICAgICAgICAgaWYgKHNhU2hmdCA8IHBxdWF0WzNdKSB7Ci0KLSAgICAgICAgICAgICAgICBxdWEgPSBtZGN0U3BlTD4wID8gMyA6IC0zOwotCQkJICB9Ci0gICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHF1YSA9IHF1YW50aXplU2luZ2xlTGluZShnYWluLCBzYSk7Ci0gICAgICAgICAgICAgICAgLyogYWRqdXN0IHRoZSBzaWduLiBTaW5jZSAwIDwgcXVhIDwgMSwgdGhpcyBjYW5ub3Qgb3ZlcmZsb3cuICovCi0KLSAgICAgICAgICAgICAgICBpZiAobWRjdFNwZUwgPCAwKQotICAgICAgICAgICAgICAgICAgcXVhID0gLXF1YTsKLQkJCSAgfQotCQkJfQotCQkgIH0KLQkJfQotCSAgfQotICAgICAgcXVhU3BlY3RydW1bbGluZV0gPSBxdWEgOwotCX0KLSAgfQotCi19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6aXF1YW50aXplTGluZXMKLSogZGVzY3JpcHRpb246IGlxdWFudGl6ZXMgc3BlY3RydW0gbGluZXMgd2l0aG91dCBzaWduCi0qICAgICAgICAgICAgICBtZGN0U3BlY3RydW0gPSBpcXVhU3BlY3RydW1eNC8zICoyXigwLjI1KmdhaW4pCi0qIGlucHV0OiBnbG9iYWwgZ2FpbiwgbnVtYmVyIG9mIGxpbmVzIHRvIHByb2Nlc3MscXVhbnRpemVkIHNwZWN0cnVtCi0qIG91dHB1dDogc3BlY3RyYWwgZGF0YQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBpcXVhbnRpemVMaW5lcyhjb25zdCBXb3JkMTYgZ2FpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBub09mTGluZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgKnF1YW50U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgKm1kY3RTcGVjdHJ1bSkKLXsKLSAgV29yZDMyICAgaXF1YW50aXplcm1vZDsKLSAgV29yZDMyICAgaXF1YW50aXplcnNoaWZ0OwotICBXb3JkMzIgICBsaW5lOwotCi0gIGlxdWFudGl6ZXJtb2QgPSBnYWluICYgMzsKLSAgaXF1YW50aXplcnNoaWZ0ID0gZ2FpbiA+PiAyOwotCi0gIGZvciAobGluZT0wOyBsaW5lPG5vT2ZMaW5lczsgbGluZSsrKSB7Ci0KLSAgICBpZiggcXVhbnRTcGVjdHJ1bVtsaW5lXSAhPSAwICkgewotICAgICAgV29yZDMyIGFjY3U7Ci0gICAgICBXb3JkMzIgZXg7Ci0JICBXb3JkMzIgdGFiSW5kZXg7Ci0gICAgICBXb3JkMzIgc3BlY0V4cDsKLSAgICAgIFdvcmQzMiBzLHQ7Ci0KLSAgICAgIGFjY3UgPSBxdWFudFNwZWN0cnVtW2xpbmVdOwotCi0gICAgICBleCA9IG5vcm1fbChhY2N1KTsKLSAgICAgIGFjY3UgPSBhY2N1IDw8IGV4OwotICAgICAgc3BlY0V4cCA9IElOVF9CSVRTLTEgLSBleDsKLQotICAgICAgdGFiSW5kZXggPSAoYWNjdSA+PiAoSU5UX0JJVFMtMi1NQU5UX0RJR0lUUykpICYgKH5NQU5UX1NJWkUpOwotCi0gICAgICAvKiBjYWxjdWxhdGUgIm1hbnRpc3NhIiBeNC8zICovCi0gICAgICBzID0gbVRhYl80XzNbdGFiSW5kZXhdOwotCi0gICAgICAvKiBnZXQgYXBwcm9wZXJpYXRlIGV4cG9uZW50IG11bHRpcGxpZXIgZm9yIHNwZWNFeHBeMy80IGNvbWJpbmVkIHdpdGggc2NmTW9kICovCi0gICAgICB0ID0gc3BlY0V4cE1hbnRUYWJsZUNvbWJfZW5jW2lxdWFudGl6ZXJtb2RdW3NwZWNFeHBdOwotCi0gICAgICAvKiBtdWx0aXBseSAibWFudGlzc2EiIF40LzMgd2l0aCBleHBvbmVudCBtdWx0aXBsaWVyICovCi0gICAgICBhY2N1ID0gTVVMSElHSChzLCB0KTsKLQotICAgICAgLyogZ2V0IGFwcHJvcGVyaWF0ZSBleHBvbmVudCBzaGlmdGVyICovCi0gICAgICBzcGVjRXhwID0gc3BlY0V4cFRhYmxlQ29tYl9lbmNbaXF1YW50aXplcm1vZF1bc3BlY0V4cF07Ci0KLSAgICAgIHNwZWNFeHAgKz0gaXF1YW50aXplcnNoaWZ0ICsgMTsKLQkgIGlmKHNwZWNFeHAgPj0gMCkKLQkJICBtZGN0U3BlY3RydW1bbGluZV0gPSBhY2N1IDw8IHNwZWNFeHA7Ci0JICBlbHNlCi0JCSAgbWRjdFNwZWN0cnVtW2xpbmVdID0gYWNjdSA+PiAoLXNwZWNFeHApOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIG1kY3RTcGVjdHJ1bVtsaW5lXSA9IDA7Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBRdWFudGl6ZVNwZWN0cnVtCi0qIGRlc2NyaXB0aW9uOiBxdWFudGl6ZXMgdGhlIGVudGlyZSBzcGVjdHJ1bQotKiByZXR1cm5zOgotKiBpbnB1dDogbnVtYmVyIG9mIHNjYWxlZmFjdG9yIGJhbmRzIHRvIGJlIHF1YW50aXplZCwgLi4uCi0qIG91dHB1dDogcXVhbnRpemVkIHNwZWN0cnVtCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUXVhbnRpemVTcGVjdHJ1bShXb3JkMTYgc2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBtYXhTZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgc2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpzZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgV29yZDMyICptZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGdsb2JhbEdhaW4sCi0gICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpzY2FsZWZhY3RvcnMsCi0gICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpxdWFudGl6ZWRTcGVjdHJ1bSkKLXsKLSAgV29yZDMyIHNmYk9mZnMsIHNmYjsKLQotICBmb3Ioc2ZiT2Zmcz0wO3NmYk9mZnM8c2ZiQ250O3NmYk9mZnMrPXNmYlBlckdyb3VwKSB7Ci0gICAgV29yZDMyIHNmYk5leHQgOwotICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgbWF4U2ZiUGVyR3JvdXA7IHNmYiA9IHNmYk5leHQpIHsKLSAgICAgIFdvcmQxNiBzY2FsZWZhY3RvciA9IHNjYWxlZmFjdG9yc1tzZmJPZmZzK3NmYl07Ci0gICAgICAvKiBjb2FsZXNjZSBzZmJzIHdpdGggdGhlIHNhbWUgc2NhbGVmYWN0b3IgKi8KLSAgICAgIGZvciAoc2ZiTmV4dCA9IHNmYisxOwotICAgICAgICAgICBzZmJOZXh0IDwgbWF4U2ZiUGVyR3JvdXAgJiYgc2NhbGVmYWN0b3IgPT0gc2NhbGVmYWN0b3JzW3NmYk9mZnMrc2ZiTmV4dF07Ci0gICAgICAgICAgIHNmYk5leHQrKykgOwotCi0gICAgICBxdWFudGl6ZUxpbmVzKGdsb2JhbEdhaW4gLSBzY2FsZWZhY3RvciwKLSAgICAgICAgICAgICAgICAgICAgc2ZiT2Zmc2V0W3NmYk9mZnMrc2ZiTmV4dF0gLSBzZmJPZmZzZXRbc2ZiT2ZmcytzZmJdLAotICAgICAgICAgICAgICAgICAgICBtZGN0U3BlY3RydW0gKyBzZmJPZmZzZXRbc2ZiT2ZmcytzZmJdLAotICAgICAgICAgICAgICAgICAgICBxdWFudGl6ZWRTcGVjdHJ1bSArIHNmYk9mZnNldFtzZmJPZmZzK3NmYl0pOwotICAgIH0KLSAgfQotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOmNhbGNTZmJEaXN0Ci0qIGRlc2NyaXB0aW9uOiBxdWFudGl6ZXMgYW5kIHJlcXVhbnRpemVzIGxpbmVzIHRvIGNhbGN1bGF0ZSBkaXN0b3J0aW9uCi0qIGlucHV0OiAgbnVtYmVyIG9mIGxpbmVzIHRvIGJlIHF1YW50aXplZCwgLi4uCi0qIG91dHB1dDogZGlzdG9ydGlvbgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1Xb3JkMzIgY2FsY1NmYkRpc3QoY29uc3QgV29yZDMyICpzcGVjLAotICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgc2ZiV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgV29yZDE2ICBnYWluKQotewotICBXb3JkMzIgbGluZTsKLSAgV29yZDMyIGRpc3Q7Ci0gIFdvcmQzMiBtID0gZ2FpbiYzOwotICBXb3JkMzIgZyA9IChnYWluID4+IDIpICsgNDsKLSAgV29yZDMyIGcyID0gKGcgPDwgMSkgKyAxOwotICBjb25zdCBXb3JkMTYgKnBxdWF0LCAqcmVwcXVhdDsKLSAgICAvKiBnYWluJjMgKi8KLQotICBwcXVhdCA9IHF1YW50Qm9yZGVyc1ttXTsKLSAgcmVwcXVhdCA9IHF1YW50UmVjb25bbV07Ci0KLSAgZGlzdCA9IDA7Ci0gIGcgKz0gMTY7Ci0gIGlmKGcyIDwgMCAmJiBnID49IDApCi0gIHsKLQkgIGcyID0gLWcyOwotCSAgZm9yKGxpbmU9MDsgbGluZTxzZmJXaWR0aDsgbGluZSsrKSB7Ci0JCSAgaWYgKHNwZWNbbGluZV0pIHsKLQkJCSAgV29yZDMyIGRpZmY7Ci0JCQkgIFdvcmQzMiBkaXN0U2luZ2xlOwotCQkJICBXb3JkMzIgc2E7Ci0JCQkgIFdvcmQzMiBzYVNoZnQ7Ci0JCQkgIHNhID0gTF9hYnMoc3BlY1tsaW5lXSk7Ci0JCQkgIC8vc2FTaGZ0ID0gcm91bmQxNihMX3NocihzYSwgZykpOwotCQkJICAvL3NhU2hmdCA9IExfc2hyKHNhLCAxNitnKTsKLQkJCSAgc2FTaGZ0ID0gc2EgPj4gZzsKLQotCQkJICBpZiAoc2FTaGZ0IDwgcHF1YXRbMF0pIHsKLQkJCQkgIGRpc3RTaW5nbGUgPSAoc2FTaGZ0ICogc2FTaGZ0KSA+PiBnMjsKLQkJCSAgfQotCQkJICBlbHNlIHsKLQotCQkJCSAgaWYgKHNhU2hmdCA8IHBxdWF0WzFdKSB7Ci0JCQkJCSAgZGlmZiA9IHNhU2hmdCAtIHJlcHF1YXRbMF07Ci0JCQkJCSAgZGlzdFNpbmdsZSA9IChkaWZmICogZGlmZikgPj4gZzI7Ci0JCQkJICB9Ci0JCQkJICBlbHNlIHsKLQotCQkJCQkgIGlmIChzYVNoZnQgPCBwcXVhdFsyXSkgewotCQkJCQkJICBkaWZmID0gc2FTaGZ0IC0gcmVwcXVhdFsxXTsKLQkJCQkJCSAgZGlzdFNpbmdsZSA9IChkaWZmICogZGlmZikgPj4gZzI7Ci0JCQkJCSAgfQotCQkJCQkgIGVsc2UgewotCi0JCQkJCQkgIGlmIChzYVNoZnQgPCBwcXVhdFszXSkgewotCQkJCQkJCSAgZGlmZiA9IHNhU2hmdCAtIHJlcHF1YXRbMl07Ci0JCQkJCQkJICBkaXN0U2luZ2xlID0gKGRpZmYgKiBkaWZmKSA+PiBnMjsKLQkJCQkJCSAgfQotCQkJCQkJICBlbHNlIHsKLQkJCQkJCQkgIFdvcmQxNiBxdWEgPSBxdWFudGl6ZVNpbmdsZUxpbmUoZ2Fpbiwgc2EpOwotCQkJCQkJCSAgV29yZDMyIGlxdmFsLCBkaWZmMzI7Ci0JCQkJCQkJICAvKiBub3cgdGhhdCB3ZSBoYXZlIHF1YW50aXplZCB4LCByZS1xdWFudGl6ZSBpdC4gKi8KLQkJCQkJCQkgIGlxdWFudGl6ZUxpbmVzKGdhaW4sIDEsICZxdWEsICZpcXZhbCk7Ci0JCQkJCQkJICBkaWZmMzIgPSBzYSAtIGlxdmFsOwotCQkJCQkJCSAgZGlzdFNpbmdsZSA9IGZpeG11bChkaWZmMzIsIGRpZmYzMik7Ci0JCQkJCQkgIH0KLQkJCQkJICB9Ci0JCQkJICB9Ci0JCQkgIH0KLQotCQkJICBkaXN0ID0gTF9hZGQoZGlzdCwgZGlzdFNpbmdsZSk7Ci0JCSAgfQotCSAgfQotICB9Ci0gIGVsc2UKLSAgewotCSAgZm9yKGxpbmU9MDsgbGluZTxzZmJXaWR0aDsgbGluZSsrKSB7Ci0JCSAgaWYgKHNwZWNbbGluZV0pIHsKLQkJCSAgV29yZDMyIGRpZmY7Ci0JCQkgIFdvcmQzMiBkaXN0U2luZ2xlOwotCQkJICBXb3JkMzIgc2E7Ci0JCQkgIFdvcmQzMiBzYVNoZnQ7Ci0JCQkgIHNhID0gTF9hYnMoc3BlY1tsaW5lXSk7Ci0JCQkgIC8vc2FTaGZ0ID0gcm91bmQxNihMX3NocihzYSwgZykpOwotCQkJICBzYVNoZnQgPSBMX3NocihzYSwgZyk7Ci0KLQkJCSAgaWYgKHNhU2hmdCA8IHBxdWF0WzBdKSB7Ci0JCQkJICBkaXN0U2luZ2xlID0gTF9zaGwoKHNhU2hmdCAqIHNhU2hmdCksIGcyKTsKLQkJCSAgfQotCQkJICBlbHNlIHsKLQotCQkJCSAgaWYgKHNhU2hmdCA8IHBxdWF0WzFdKSB7Ci0JCQkJCSAgZGlmZiA9IHNhU2hmdCAtIHJlcHF1YXRbMF07Ci0JCQkJCSAgZGlzdFNpbmdsZSA9IExfc2hsKChkaWZmICogZGlmZiksIGcyKTsKLQkJCQkgIH0KLQkJCQkgIGVsc2UgewotCi0JCQkJCSAgaWYgKHNhU2hmdCA8IHBxdWF0WzJdKSB7Ci0JCQkJCQkgIGRpZmYgPSBzYVNoZnQgLSByZXBxdWF0WzFdOwotCQkJCQkJICBkaXN0U2luZ2xlID0gTF9zaGwoKGRpZmYgKiBkaWZmKSwgZzIpOwotCQkJCQkgIH0KLQkJCQkJICBlbHNlIHsKLQotCQkJCQkJICBpZiAoc2FTaGZ0IDwgcHF1YXRbM10pIHsKLQkJCQkJCQkgIGRpZmYgPSBzYVNoZnQgLSByZXBxdWF0WzJdOwotCQkJCQkJCSAgZGlzdFNpbmdsZSA9IExfc2hsKChkaWZmICogZGlmZiksIGcyKTsKLQkJCQkJCSAgfQotCQkJCQkJICBlbHNlIHsKLQkJCQkJCQkgIFdvcmQxNiBxdWEgPSBxdWFudGl6ZVNpbmdsZUxpbmUoZ2Fpbiwgc2EpOwotCQkJCQkJCSAgV29yZDMyIGlxdmFsLCBkaWZmMzI7Ci0JCQkJCQkJICAvKiBub3cgdGhhdCB3ZSBoYXZlIHF1YW50aXplZCB4LCByZS1xdWFudGl6ZSBpdC4gKi8KLQkJCQkJCQkgIGlxdWFudGl6ZUxpbmVzKGdhaW4sIDEsICZxdWEsICZpcXZhbCk7Ci0JCQkJCQkJICBkaWZmMzIgPSBzYSAtIGlxdmFsOwotCQkJCQkJCSAgZGlzdFNpbmdsZSA9IGZpeG11bChkaWZmMzIsIGRpZmYzMik7Ci0JCQkJCQkgIH0KLQkJCQkJICB9Ci0JCQkJICB9Ci0JCQkgIH0KLQkJCSAgZGlzdCA9IExfYWRkKGRpc3QsIGRpc3RTaW5nbGUpOwotCQkgIH0KLQkgIH0KLSAgfQotCi0gIHJldHVybiBkaXN0OwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvc2ZfZXN0aW0uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3NmX2VzdGltLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4OTQ3ZTEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvc2ZfZXN0aW0uYworKysgL2Rldi9udWxsCkBAIC0xLDg4MiArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCXNmX2VzdGltLmMKLQotCUNvbnRlbnQ6CVNjYWxlIGZhY3RvciBlc3RpbWF0aW9uIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiYmFzaWNfb3AuaCIKLSNpbmNsdWRlICJvcGVyXzMyYi5oIgotI2luY2x1ZGUgInNmX2VzdGltLmgiCi0jaW5jbHVkZSAicXVhbnRpemUuaCIKLSNpbmNsdWRlICJiaXRfY250LmgiCi0jaW5jbHVkZSAiYWFjX3JvbS5oIgotCi1zdGF0aWMgY29uc3QgV29yZDE2IE1BWF9TQ0ZfREVMVEEgPSA2MDsKLQotLyohCi1jb25zdGFudHMgcmVmZXJlbmNlIGluIGNvbW1lbnRzCi0KLSBDMCA9IDYuNzVmOwotIEMxID0gLTY5LjMzMjk1ZjsgICAtMTYvMypsb2coTUFYX1FVQU5UKzAuNS1sb2dDb24pL2xvZygyKQotIEMyID0gNC4wZjsKLSBDMyA9IDIuNjY2NjY2NjZmOwotCi0gIFBFX0MxID0gMy4wZjsgICAgICAgIGxvZyg4LjApL2xvZygyKQotICBQRV9DMiA9IDEuMzIxOTI4MWY7ICBsb2coMi41KS9sb2coMikKLSAgUEVfQzMgPSAwLjU1OTM1NzNmOyAgMS1DMi9DMQotCi0qLwotCi0jZGVmaW5lIEZGX1NRUlRfQklUUyAgICAgICAgICAgICAgICAgICAgNwotI2RlZmluZSBGRl9TUVJUX1RBQkxFX1NJWkUgICAgICAgICAgICAgICgxPDxGRl9TUVJUX0JJVFMgLSAxPDwoRkZfU1FSVF9CSVRTLTIpKQotI2RlZmluZSBDT0VGMDhfMzEJCTB4NjY2NjY2NjYJCS8qIDAuOCooMSA8PCAzMSkgKi8KLSNkZWZpbmUgUEVfQzFfOAkJCTI0CQkJCS8qIFBFX0MxKjggKi8KLSNkZWZpbmUgUEVfQzJfMTYJCTIxCQkJCS8qIFBFX0MyKjgvUEVfQzMgKi8KLSNkZWZpbmUgUEVfU0NBTEUJCTB4MDU5YQkJCS8qIDAuNyAqICgxIDw8ICgxNSAtIDEgLSAzKSkqLwotCi0jZGVmaW5lIFNDQUxFX0VTVElNQVRFX0NPRUYJMHg1NTU1CQkvKiAoOC44NTg1Lyg0KmxvZzIoMTApKSkgKiAoMSA8PCAxNSkqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGZvcm1mYWNfc3FydAotKiBkZXNjcmlwdGlvbjogIGNhbGN1bGF0ZXMgc3FydCh4KS8yNTYKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1fX2lubGluZSBXb3JkMzIgZm9ybWZhY19zcXJ0KFdvcmQzMiB4KQotewotCVdvcmQzMiB5OwotCVdvcmQzMiBwcmVzaGlmdCwgcG9zdHNoaWZ0OwotCi0KLQlpZiAoeD09MCkgcmV0dXJuIDA7Ci0JcHJlc2hpZnQgID0gbm9ybV9sKHgpIC0gKElOVF9CSVRTLTEtRkZfU1FSVF9CSVRTKTsKLQlwb3N0c2hpZnQgPSBwcmVzaGlmdCA+PiAxOwotCXByZXNoaWZ0ICA9IHBvc3RzaGlmdCA8PCAxOwotCXBvc3RzaGlmdCA9IHBvc3RzaGlmdCArIDg7CSAgLyogc3FydC8yNTYgKi8KLQlpZihwcmVzaGlmdCA+PSAwKQotCQl5ID0geCA8PCBwcmVzaGlmdDsgICAgICAgIC8qIG5vdyAxLzQgPD0geSA8IDEgKi8KLQllbHNlCi0JCXkgPSB4ID4+ICgtcHJlc2hpZnQpOwotCXkgPSBmb3JtZmFjX3NxcnR0YWJsZVt5LTMyXTsKLQotCWlmKHBvc3RzaGlmdCA+PSAwKQotCQl5ID0geSA+PiBwb3N0c2hpZnQ7Ci0JZWxzZQotCQl5ID0geSA8PCAoLXBvc3RzaGlmdCk7Ci0KLQlyZXR1cm4geTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IENhbGNGb3JtRmFjdG9yQ2hhbm5lbAotKiBkZXNjcmlwdGlvbjogIGNhbGN1bGF0ZSB0aGUgZm9ybSBmYWN0b3Igb25lIGNoYW5uZWwKLSoJCQkJZmZhYyhuKSA9IHNxcnQoYWJzKFgoaykpICsgc3FydChhYnMoWChrKzEpKSArIC4uLi4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZAotQ2FsY0Zvcm1GYWN0b3JDaGFubmVsKFdvcmQxNiAqbG9nU2ZiRm9ybUZhY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnNmYk5SZWxldmFudExpbmVzLAotICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqbG9nU2ZiRW5lcmd5LAotICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbikKLXsKLQlXb3JkMzIgc2Zidywgc2ZidzE7Ci0JV29yZDMyIGksIGo7Ci0JV29yZDMyIHNmYk9mZnMsIHNmYjsKLQotCXNmYncgPSBzZmJ3MSA9IDA7Ci0JZm9yIChzZmJPZmZzPTA7IHNmYk9mZnM8cHN5T3V0Q2hhbi0+c2ZiQ250OyBzZmJPZmZzKz1wc3lPdXRDaGFuLT5zZmJQZXJHcm91cCl7Ci0JCWZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFuLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKLQkJCWkgPSBzZmJPZmZzK3NmYjsKLQotCQkJaWYgKHBzeU91dENoYW4tPnNmYkVuZXJneVtpXSA+IHBzeU91dENoYW4tPnNmYlRocmVzaG9sZFtpXSkgewotCQkJCVdvcmQzMiBhY2N1LCBhdmdGb3JtRmFjdG9yLGlTZmJXaWR0aDsKLQkJCQlXb3JkMzIgKm1kY3RTcGVjOwotCQkJCXNmYncgPSBwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW2krMV0gLSBwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW2ldOwotCQkJCWlTZmJXaWR0aCA9IGludlNCRlsoc2ZidyA+PiAyKSAtIDFdOwotCQkJCW1kY3RTcGVjID0gcHN5T3V0Q2hhbi0+bWRjdFNwZWN0cnVtICsgcHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0c1tpXTsKLQkJCQlhY2N1ID0gMDsKLQkJCQkvKiBjYWxjIHN1bSBvZiBzcXJ0KHNwZWMpICovCi0JCQkJZm9yIChqPXNmYnc7IGo7IGotLSkgewotCQkJCQlhY2N1ICs9IGZvcm1mYWNfc3FydChMX2FicygqbWRjdFNwZWMpKTsgbWRjdFNwZWMrKzsKLQkJCQl9Ci0JCQkJbG9nU2ZiRm9ybUZhY3RvcltpXSA9IGlMb2c0KGFjY3UpOwotCQkJCWxvZ1NmYkVuZXJneVtpXSA9IGlMb2c0KHBzeU91dENoYW4tPnNmYkVuZXJneVtpXSk7Ci0JCQkJYXZnRm9ybUZhY3RvciA9IGZpeG11bChyc3FydChwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbaV0sSU5UX0JJVFMpLCBpU2ZiV2lkdGgpOwotCQkJCWF2Z0Zvcm1GYWN0b3IgPSByc3FydCgoV29yZDMyKWF2Z0Zvcm1GYWN0b3IsSU5UX0JJVFMpID4+IDEwOwotCQkJCS8qIHJlc3VsdCBpcyBtdWx0aXBsaWVkIGJ5IDQgKi8KLQkJCQlpZihhdmdGb3JtRmFjdG9yKQotCQkJCQlzZmJOUmVsZXZhbnRMaW5lc1tpXSA9IGFjY3UgLyBhdmdGb3JtRmFjdG9yOwotCQkJCWVsc2UKLQkJCQkJc2ZiTlJlbGV2YW50TGluZXNbaV0gPSAweDdmZmY7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvKiBzZXQgbnVtYmVyIG9mIGxpbmVzIHRvIHplcm8gKi8KLQkJCQlzZmJOUmVsZXZhbnRMaW5lc1tpXSA9IDA7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogaW1wcm92ZVNjZgotKiBkZXNjcmlwdGlvbjogIGZpbmQgYmV0dGVyIHNjYWxlZmFjdG9yIHdpdGggYW5hbHlzaXMgYnkgc3ludGhlc2lzCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIFdvcmQxNiBpbXByb3ZlU2NmKFdvcmQzMiAqc3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgIHNmYldpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgdGhyZXNoLAotICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgc2NmLAotICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgbWluU2NmLAotICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAqZGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKm1pblNjZkNhbGN1bGF0ZWQpCi17Ci0JV29yZDMyIGNudDsKLQlXb3JkMzIgc2ZiRGlzdDsKLQlXb3JkMzIgc2NmQmVzdDsKLQlXb3JkMzIgdGhyZXNoMTI1ID0gTF9hZGQodGhyZXNoLCAodGhyZXNoID4+IDIpKTsKLQotCXNjZkJlc3QgPSBzY2Y7Ci0KLQkvKiBjYWxjIHJlYWwgZGlzdG9ydGlvbiAqLwotCXNmYkRpc3QgPSBjYWxjU2ZiRGlzdChzcGVjLCBzZmJXaWR0aCwgc2NmKTsKLQkqbWluU2NmQ2FsY3VsYXRlZCA9IHNjZjsKLQlpZighc2ZiRGlzdCkKLQkgIHJldHVybiBzY2ZCZXN0OwotCi0JaWYgKHNmYkRpc3QgPiB0aHJlc2gxMjUpIHsKLQkJV29yZDMyIHNjZkVzdGltYXRlZDsKLQkJV29yZDMyIHNmYkRpc3RCZXN0OwotCQlzY2ZFc3RpbWF0ZWQgPSBzY2Y7Ci0JCXNmYkRpc3RCZXN0ID0gc2ZiRGlzdDsKLQotCQljbnQgPSAwOwotCQl3aGlsZSAoc2ZiRGlzdCA+IHRocmVzaDEyNSAmJiAoY250IDwgMykpIHsKLQotCQkJc2NmID0gc2NmICsgMTsKLQkJCXNmYkRpc3QgPSBjYWxjU2ZiRGlzdChzcGVjLCBzZmJXaWR0aCwgc2NmKTsKLQotCQkJaWYgKHNmYkRpc3QgPCBzZmJEaXN0QmVzdCkgewotCQkJCXNjZkJlc3QgPSBzY2Y7Ci0JCQkJc2ZiRGlzdEJlc3QgPSBzZmJEaXN0OwotCQkJfQotCQkJY250ID0gY250ICsgMTsKLQkJfQotCQljbnQgPSAwOwotCQlzY2YgPSBzY2ZFc3RpbWF0ZWQ7Ci0JCXNmYkRpc3QgPSBzZmJEaXN0QmVzdDsKLQkJd2hpbGUgKChzZmJEaXN0ID4gdGhyZXNoMTI1KSAmJiAoY250IDwgMSkgJiYgKHNjZiA+IG1pblNjZikpIHsKLQotCQkJc2NmID0gc2NmIC0gMTsKLQkJCXNmYkRpc3QgPSBjYWxjU2ZiRGlzdChzcGVjLCBzZmJXaWR0aCwgc2NmKTsKLQotCQkJaWYgKHNmYkRpc3QgPCBzZmJEaXN0QmVzdCkgewotCQkJCXNjZkJlc3QgPSBzY2Y7Ci0JCQkJc2ZiRGlzdEJlc3QgPSBzZmJEaXN0OwotCQkJfQotCQkJKm1pblNjZkNhbGN1bGF0ZWQgPSBzY2Y7Ci0JCQljbnQgPSBjbnQgKyAxOwotCQl9Ci0JCSpkaXN0ID0gc2ZiRGlzdEJlc3Q7Ci0JfQotCWVsc2UgewotCQlXb3JkMzIgc2ZiRGlzdEJlc3Q7Ci0JCVdvcmQzMiBzZmJEaXN0QWxsb3dlZDsKLQkJV29yZDMyIHRocmVzaDA4ID0gZml4bXVsKENPRUYwOF8zMSwgdGhyZXNoKTsKLQkJc2ZiRGlzdEJlc3QgPSBzZmJEaXN0OwotCi0JCWlmIChzZmJEaXN0IDwgdGhyZXNoMDgpCi0JCQlzZmJEaXN0QWxsb3dlZCA9IHNmYkRpc3Q7Ci0JCWVsc2UKLQkJCXNmYkRpc3RBbGxvd2VkID0gdGhyZXNoMDg7Ci0JCWZvciAoY250PTA7IGNudDwzOyBjbnQrKykgewotCQkJc2NmID0gc2NmICsgMTsKLQkJCXNmYkRpc3QgPSBjYWxjU2ZiRGlzdChzcGVjLCBzZmJXaWR0aCwgc2NmKTsKLQotCQkJaWYgKGZpeG11bChDT0VGMDhfMzEsc2ZiRGlzdCkgPCBzZmJEaXN0QWxsb3dlZCkgewotCQkJCSptaW5TY2ZDYWxjdWxhdGVkID0gc2NmQmVzdCArIDE7Ci0JCQkJc2NmQmVzdCA9IHNjZjsKLQkJCQlzZmJEaXN0QmVzdCA9IHNmYkRpc3Q7Ci0JCQl9Ci0JCX0KLQkJKmRpc3QgPSBzZmJEaXN0QmVzdDsKLQl9Ci0KLQkvKiByZXR1cm4gYmVzdCBzY2FsZWZhY3RvciAqLwotCXJldHVybiBzY2ZCZXN0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGNvdW50U2luZ2xlU2NmQml0cwotKiBkZXNjcmlwdGlvbjogIGNvdW50IHNpbmdsZSBzY2YgYml0cyBpbiBodWZmdW0KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgV29yZDE2IGNvdW50U2luZ2xlU2NmQml0cyhXb3JkMTYgc2NmLCBXb3JkMTYgc2NmTGVmdCwgV29yZDE2IHNjZlJpZ2h0KQotewotCVdvcmQxNiBzY2ZCaXRzOwotCi0Jc2NmQml0cyA9IGJpdENvdW50U2NhbGVmYWN0b3JEZWx0YShzY2ZMZWZ0IC0gc2NmKSArCi0JCWJpdENvdW50U2NhbGVmYWN0b3JEZWx0YShzY2YgLSBzY2ZSaWdodCk7Ci0KLQlyZXR1cm4gc2NmQml0czsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBjYWxjU2luZ2xlU3BlY1BlCi0qIGRlc2NyaXB0aW9uOiAgbGRSYXRpbyA9IGxvZzIoZW4obikpIC0gMCwzNzUqc2NmR2FpbihuKQotKgkJCQluYml0cyA9IDAuNypuTGluZXMqbGRSYXRpb24gZm9yIGxkUmF0aW9uID49IGMxCi0qCQkJCW5iaXRzID0gMC43Km5MaW5lcyooYzIgKyBjMypsZFJhdGlvKSBmb3IgbGRSYXRpb24gPCBjMQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBXb3JkMTYgY2FsY1NpbmdsZVNwZWNQZShXb3JkMTYgc2NmLCBXb3JkMTYgc2ZiQ29uc3RQZVBhcnQsIFdvcmQxNiBuTGluZXMpCi17Ci0JV29yZDMyIHNwZWNQZTsKLQlXb3JkMzIgbGRSYXRpbzsKLQlXb3JkMzIgc2NmMzsKLQotCWxkUmF0aW8gPSBzZmJDb25zdFBlUGFydCA8PCAzOyAvKiAgKHNmYkNvbnN0UGVQYXJ0IC0wLjM3NSpzY2YpKjggKi8KLQlzY2YzID0gc2NmICsgc2NmICsgc2NmOwotCWxkUmF0aW8gPSBsZFJhdGlvIC0gc2NmMzsKLQotCWlmIChsZFJhdGlvIDwgUEVfQzFfOCkgewotCQkvKiAyMSA6IDIqOCpQRV9DMiwgMipQRV9DMyB+IDEqLwotCQlsZFJhdGlvID0gKGxkUmF0aW8gKyBQRV9DMl8xNikgPj4gMTsKLQl9Ci0Jc3BlY1BlID0gbkxpbmVzICogbGRSYXRpbzsKLQlzcGVjUGUgPSAoc3BlY1BlICogUEVfU0NBTEUpID4+IDE0OwotCi0JcmV0dXJuIHNhdHVyYXRlKHNwZWNQZSk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBjb3VudFNjZkJpdHNEaWZmCi0qIGRlc2NyaXB0aW9uOiAgY291bnQgZGlmZmVyZW50IHNjZiBiaXRzIHVzZWQKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgV29yZDE2IGNvdW50U2NmQml0c0RpZmYoV29yZDE2ICpzY2ZPbGQsIFdvcmQxNiAqc2NmTmV3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBzZmJDbnQsIFdvcmQxNiBzdGFydFNmYiwgV29yZDE2IHN0b3BTZmIpCi17Ci0JV29yZDMyIHNjZkJpdHNEaWZmOwotCVdvcmQzMiBzZmIsIHNmYkxhc3Q7Ci0JV29yZDMyIHNmYlByZXYsIHNmYk5leHQ7Ci0KLQlzY2ZCaXRzRGlmZiA9IDA7Ci0Jc2ZiID0gMDsKLQotCS8qIHNlYXJjaCBmb3IgZmlyc3QgcmVsZXZhbnQgc2ZiICovCi0Jc2ZiTGFzdCA9IHN0YXJ0U2ZiOwotCXdoaWxlIChzZmJMYXN0IDwgc3RvcFNmYiAmJiBzY2ZPbGRbc2ZiTGFzdF0gPT0gVk9BQUNfU0hSVF9NSU4pIHsKLQotCQlzZmJMYXN0ID0gc2ZiTGFzdCArIDE7Ci0JfQotCS8qIHNlYXJjaCBmb3IgcHJldmlvdXMgcmVsZXZhbnQgc2ZiIGFuZCBjb3VudCBkaWZmICovCi0Jc2ZiUHJldiA9IHN0YXJ0U2ZiIC0gMTsKLQl3aGlsZSAoKHNmYlByZXY+PTApICYmIHNjZk9sZFtzZmJQcmV2XSA9PSBWT0FBQ19TSFJUX01JTikgewotCi0JCXNmYlByZXYgPSBzZmJQcmV2IC0gMTsKLQl9Ci0KLQlpZiAoc2ZiUHJldj49MCkgewotCQlzY2ZCaXRzRGlmZiArPSBiaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoc2NmTmV3W3NmYlByZXZdIC0gc2NmTmV3W3NmYkxhc3RdKSAtCi0JCQliaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoc2NmT2xkW3NmYlByZXZdIC0gc2NmT2xkW3NmYkxhc3RdKTsKLQl9Ci0JLyogbm93IGxvb3AgdGhyb3VnaCBhbGwgc2ZicyBhbmQgY291bnQgZGlmZnMgb2YgcmVsZXZhbnQgc2ZicyAqLwotCWZvciAoc2ZiPXNmYkxhc3QrMTsgc2ZiPHN0b3BTZmI7IHNmYisrKSB7Ci0KLQkJaWYgKHNjZk9sZFtzZmJdICE9IFZPQUFDX1NIUlRfTUlOKSB7Ci0JCQlzY2ZCaXRzRGlmZiArPSBiaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoc2NmTmV3W3NmYkxhc3RdIC0gc2NmTmV3W3NmYl0pIC0KLQkJCQliaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoc2NmT2xkW3NmYkxhc3RdIC0gc2NmT2xkW3NmYl0pOwotCQkJc2ZiTGFzdCA9IHNmYjsKLQkJfQotCX0KLQkvKiBzZWFyY2ggZm9yIG5leHQgcmVsZXZhbnQgc2ZiIGFuZCBjb3VudCBkaWZmICovCi0Jc2ZiTmV4dCA9IHN0b3BTZmI7Ci0Jd2hpbGUgKHNmYk5leHQgPCBzZmJDbnQgJiYgc2NmT2xkW3NmYk5leHRdID09IFZPQUFDX1NIUlRfTUlOKSB7Ci0KLQkJc2ZiTmV4dCA9IHNmYk5leHQgKyAxOwotCX0KLQotCWlmIChzZmJOZXh0IDwgc2ZiQ250KQotCQlzY2ZCaXRzRGlmZiArPSBiaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoc2NmTmV3W3NmYkxhc3RdIC0gc2NmTmV3W3NmYk5leHRdKSAtCi0JCWJpdENvdW50U2NhbGVmYWN0b3JEZWx0YShzY2ZPbGRbc2ZiTGFzdF0gLSBzY2ZPbGRbc2ZiTmV4dF0pOwotCi0JcmV0dXJuIHNhdHVyYXRlKHNjZkJpdHNEaWZmKTsKLX0KLQotc3RhdGljIFdvcmQxNiBjYWxjU3BlY1BlRGlmZihXb3JkMTYgKnNjZk9sZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpzY2ZOZXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqc2ZiQ29uc3RQZVBhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqbG9nU2ZiRW5lcmd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKmxvZ1NmYkZvcm1GYWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqc2ZiTlJlbGV2YW50TGluZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBzdGFydFNmYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHN0b3BTZmIpCi17Ci0JV29yZDMyIHNwZWNQZURpZmY7Ci0JV29yZDMyIHNmYjsKLQotCXNwZWNQZURpZmYgPSAwOwotCi0JLyogbG9vcCB0aHJvdWdoIGFsbCBzZmJzIGFuZCBjb3VudCBwZSBkaWZmZXJlbmNlICovCi0JZm9yIChzZmI9c3RhcnRTZmI7IHNmYjxzdG9wU2ZiOyBzZmIrKykgewotCi0KLQkJaWYgKHNjZk9sZFtzZmJdICE9IFZPQUFDX1NIUlRfTUlOKSB7Ci0JCQlXb3JkMzIgbGRSYXRpb09sZCwgbGRSYXRpb05ldzsKLQkJCVdvcmQzMiBzY2YzOwotCi0KLQkJCWlmIChzZmJDb25zdFBlUGFydFtzZmJdID09IE1JTl8xNikgewotCQkJCXNmYkNvbnN0UGVQYXJ0W3NmYl0gPSAoKGxvZ1NmYkVuZXJneVtzZmJdIC0KLQkJCQkJbG9nU2ZiRm9ybUZhY3RvcltzZmJdKSArIDExLTgqNCszKSA+PiAyOwotCQkJfQotCi0KLQkJCWxkUmF0aW9PbGQgPSBzZmJDb25zdFBlUGFydFtzZmJdIDw8IDM7Ci0JCQlzY2YzID0gc2NmT2xkW3NmYl0gKyBzY2ZPbGRbc2ZiXSArIHNjZk9sZFtzZmJdOwotCQkJbGRSYXRpb09sZCA9IGxkUmF0aW9PbGQgLSBzY2YzOwotCQkJbGRSYXRpb05ldyA9IHNmYkNvbnN0UGVQYXJ0W3NmYl0gPDwgMzsKLQkJCXNjZjMgPSBzY2ZOZXdbc2ZiXSArIHNjZk5ld1tzZmJdICsgc2NmTmV3W3NmYl07Ci0JCQlsZFJhdGlvTmV3ID0gbGRSYXRpb05ldyAtIHNjZjM7Ci0KLQkJCWlmIChsZFJhdGlvT2xkIDwgUEVfQzFfOCkgewotCQkJCS8qIDIxIDogMio4KlBFX0MyLCAyKlBFX0MzIH4gMSovCi0JCQkJbGRSYXRpb09sZCA9IChsZFJhdGlvT2xkICsgUEVfQzJfMTYpID4+IDE7Ci0JCQl9Ci0KLQkJCWlmIChsZFJhdGlvTmV3IDwgUEVfQzFfOCkgewotCQkJCS8qIDIxIDogMio4KlBFX0MyLCAyKlBFX0MzIH4gMSovCi0JCQkJbGRSYXRpb05ldyA9IChsZFJhdGlvTmV3ICsgUEVfQzJfMTYpID4+IDE7Ci0JCQl9Ci0KLQkJCXNwZWNQZURpZmYgKz0gIHNmYk5SZWxldmFudExpbmVzW3NmYl0gKiAobGRSYXRpb05ldyAtIGxkUmF0aW9PbGQpOwotCQl9Ci0JfQotCi0Jc3BlY1BlRGlmZiA9IChzcGVjUGVEaWZmICogUEVfU0NBTEUpID4+IDE0OwotCi0JcmV0dXJuIHNhdHVyYXRlKHNwZWNQZURpZmYpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogYXNzaW1pbGF0ZVNpbmdsZVNjZgotKiBkZXNjcmlwdGlvbjogIHNlYXJjaGVkIGZvciBzaW5nbGUgc2NhbGVmYWN0b3IgYmFuZHMsIHdoZXJlIHRoZSBudW1iZXIgb2YgYml0cyBnYWluZWQKLSoJCQkJYnkgdXNpbmcgYSBzbWFsbGVyIHNjZmdhaW4obikgaXMgZ3JlYXRlciB0aGFuIHRoZSBlc3RpbWF0ZWQgaW5jcmVhc2VkCi0qCQkJCWJpdCBkZW1hbmQKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBhc3NpbWlsYXRlU2luZ2xlU2NmKFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpzY2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqbWluU2NmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgKnNmYkRpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqc2ZiQ29uc3RQZVBhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqbG9nU2ZiRW5lcmd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKmxvZ1NmYkZvcm1GYWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqc2ZiTlJlbGV2YW50TGluZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqbWluU2NmQ2FsY3VsYXRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZyAgICByZXN0YXJ0T25TdWNjZXNzKQotewotCVdvcmQxNiBzZmJMYXN0LCBzZmJBY3QsIHNmYk5leHQsIHNjZkFjdCwgc2NmTWluOwotCVdvcmQxNiAqc2NmTGFzdCwgKnNjZk5leHQ7Ci0JV29yZDMyIHNmYlBlT2xkLCBzZmJQZU5ldzsKLQlXb3JkMzIgc2ZiRGlzdE5ldzsKLQlXb3JkMzIgajsKLQlGbGFnICAgc3VjY2VzczsKLQlXb3JkMTYgZGVsdGFQZSwgZGVsdGFQZU5ldywgZGVsdGFQZVRtcDsKLQlXb3JkMTYgKnByZXZTY2ZMYXN0ID0gcHN5T3V0Q2hhbi0+cHJldlNjZkxhc3Q7Ci0JV29yZDE2ICpwcmV2U2NmTmV4dCA9IHBzeU91dENoYW4tPnByZXZTY2ZOZXh0OwotCVdvcmQxNiAqZGVsdGFQZUxhc3QgPSBwc3lPdXRDaGFuLT5kZWx0YVBlTGFzdDsKLQlGbGFnICAgdXBkYXRlTWluU2NmQ2FsY3VsYXRlZDsKLQotCXN1Y2Nlc3MgPSAwOwotCWRlbHRhUGUgPSAwOwotCi0JZm9yKGo9MDtqPHBzeU91dENoYW4tPnNmYkNudDtqKyspewotCQlwcmV2U2NmTGFzdFtqXSA9IE1BWF8xNjsKLQkJcHJldlNjZk5leHRbal0gPSBNQVhfMTY7Ci0JCWRlbHRhUGVMYXN0W2pdID0gTUFYXzE2OwotCX0KLQotCXNmYkxhc3QgPSAtMTsKLQlzZmJBY3QgPSAtMTsKLQlzZmJOZXh0ID0gLTE7Ci0Jc2NmTGFzdCA9IDA7Ci0Jc2NmTmV4dCA9IDA7Ci0Jc2NmTWluID0gTUFYXzE2OwotCWRvIHsKLQkJLyogc2VhcmNoIGZvciBuZXcgcmVsZXZhbnQgc2ZiICovCi0JCXNmYk5leHQgPSBzZmJOZXh0ICsgMTsKLQkJd2hpbGUgKHNmYk5leHQgPCBwc3lPdXRDaGFuLT5zZmJDbnQgJiYgc2NmW3NmYk5leHRdID09IE1JTl8xNikgewotCi0JCQlzZmJOZXh0ID0gc2ZiTmV4dCArIDE7Ci0JCX0KLQotCQlpZiAoKHNmYkxhc3Q+PTApICYmIChzZmJBY3Q+PTApICYmIHNmYk5leHQgPCBwc3lPdXRDaGFuLT5zZmJDbnQpIHsKLQkJCS8qIHJlbGV2YW50IHNjZnMgdG8gdGhlIGxlZnQgYW5kIHRvIHRoZSByaWdodCAqLwotCQkJc2NmQWN0ICA9IHNjZltzZmJBY3RdOwotCQkJc2NmTGFzdCA9IHNjZiArIHNmYkxhc3Q7Ci0JCQlzY2ZOZXh0ID0gc2NmICsgc2ZiTmV4dDsKLQkJCXNjZk1pbiAgPSBtaW4oKnNjZkxhc3QsICpzY2ZOZXh0KTsKLQkJfQotCQllbHNlIHsKLQotCQkJaWYgKHNmYkxhc3QgPT0gLTEgJiYgKHNmYkFjdD49MCkgJiYgc2ZiTmV4dCA8IHBzeU91dENoYW4tPnNmYkNudCkgewotCQkJCS8qIGZpcnN0IHJlbGV2YW50IHNjZiAqLwotCQkJCXNjZkFjdCAgPSBzY2Zbc2ZiQWN0XTsKLQkJCQlzY2ZMYXN0ID0gJnNjZkFjdDsKLQkJCQlzY2ZOZXh0ID0gc2NmICsgc2ZiTmV4dDsKLQkJCQlzY2ZNaW4gID0gKnNjZk5leHQ7Ci0JCQl9Ci0JCQllbHNlIHsKLQotCQkJCWlmICgoc2ZiTGFzdD49MCkgJiYgKHNmYkFjdD49MCkgJiYgc2ZiTmV4dCA9PSBwc3lPdXRDaGFuLT5zZmJDbnQpIHsKLQkJCQkJLyogbGFzdCByZWxldmFudCBzY2YgKi8KLQkJCQkJc2NmQWN0ICA9IHNjZltzZmJBY3RdOwotCQkJCQlzY2ZMYXN0ID0gc2NmICsgc2ZiTGFzdDsKLQkJCQkJc2NmTmV4dCA9ICZzY2ZBY3Q7Ci0JCQkJCXNjZk1pbiAgPSAqc2NmTGFzdDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoc2ZiQWN0Pj0wKQotCQkJc2NmTWluID0gbWF4KHNjZk1pbiwgbWluU2NmW3NmYkFjdF0pOwotCi0JCWlmICgoc2ZiQWN0ID49IDApICYmCi0JCQkoc2ZiTGFzdD49MCB8fCBzZmJOZXh0IDwgcHN5T3V0Q2hhbi0+c2ZiQ250KSAmJgotCQkJc2NmQWN0ID4gc2NmTWluICYmCi0JCQkoKnNjZkxhc3QgIT0gcHJldlNjZkxhc3Rbc2ZiQWN0XSB8fAotCQkJKnNjZk5leHQgIT0gcHJldlNjZk5leHRbc2ZiQWN0XSB8fAotCQkJZGVsdGFQZSA8IGRlbHRhUGVMYXN0W3NmYkFjdF0pKSB7Ci0JCQlzdWNjZXNzID0gMDsKLQotCQkJLyogZXN0aW1hdGUgcmVxdWlyZWQgYml0cyBmb3IgYWN0dWFsIHNjZiAqLwotCQkJaWYgKHNmYkNvbnN0UGVQYXJ0W3NmYkFjdF0gPT0gTUlOXzE2KSB7Ci0JCQkJc2ZiQ29uc3RQZVBhcnRbc2ZiQWN0XSA9IGxvZ1NmYkVuZXJneVtzZmJBY3RdIC0KLQkJCQkJbG9nU2ZiRm9ybUZhY3RvcltzZmJBY3RdICsgMTEtOCo0OyAvKiA0KmxvZzIoNi43NSkgLSAzMiAqLwotCi0JCQkJaWYgKHNmYkNvbnN0UGVQYXJ0W3NmYkFjdF0gPCAwKQotCQkJCQlzZmJDb25zdFBlUGFydFtzZmJBY3RdID0gc2ZiQ29uc3RQZVBhcnRbc2ZiQWN0XSArIDM7Ci0JCQkJc2ZiQ29uc3RQZVBhcnRbc2ZiQWN0XSA9IHNmYkNvbnN0UGVQYXJ0W3NmYkFjdF0gPj4gMjsKLQkJCX0KLQotCQkJc2ZiUGVPbGQgPSBjYWxjU2luZ2xlU3BlY1BlKHNjZkFjdCwgc2ZiQ29uc3RQZVBhcnRbc2ZiQWN0XSwgc2ZiTlJlbGV2YW50TGluZXNbc2ZiQWN0XSkgKwotCQkJCWNvdW50U2luZ2xlU2NmQml0cyhzY2ZBY3QsICpzY2ZMYXN0LCAqc2NmTmV4dCk7Ci0JCQlkZWx0YVBlTmV3ID0gZGVsdGFQZTsKLQkJCXVwZGF0ZU1pblNjZkNhbGN1bGF0ZWQgPSAxOwotCQkJZG8gewotCQkJCXNjZkFjdCA9IHNjZkFjdCAtIDE7Ci0JCQkJLyogY2hlY2sgb25seSBpZiB0aGUgc2FtZSBjaGVjayB3YXMgbm90IGRvbmUgYmVmb3JlICovCi0KLQkJCQlpZiAoc2NmQWN0IDwgbWluU2NmQ2FsY3VsYXRlZFtzZmJBY3RdKSB7Ci0JCQkJCXNmYlBlTmV3ID0gY2FsY1NpbmdsZVNwZWNQZShzY2ZBY3QsIHNmYkNvbnN0UGVQYXJ0W3NmYkFjdF0sIHNmYk5SZWxldmFudExpbmVzW3NmYkFjdF0pICsKLQkJCQkJCWNvdW50U2luZ2xlU2NmQml0cyhzY2ZBY3QsICpzY2ZMYXN0LCAqc2NmTmV4dCk7Ci0JCQkJCS8qIHVzZSBuZXcgc2NmIGlmIG5vIGluY3JlYXNlIGluIHBlIGFuZAotCQkJCQlxdWFudGl6YXRpb24gZXJyb3IgaXMgc21hbGxlciAqLwotCQkJCQlkZWx0YVBlVG1wID0gZGVsdGFQZSArIHNmYlBlTmV3IC0gc2ZiUGVPbGQ7Ci0KLQkJCQkJaWYgKGRlbHRhUGVUbXAgPCAxMCkgewotCQkJCQkJc2ZiRGlzdE5ldyA9IGNhbGNTZmJEaXN0KHBzeU91dENoYW4tPm1kY3RTcGVjdHJ1bSsKLQkJCQkJCQlwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW3NmYkFjdF0sCi0JCQkJCQkJKHBzeU91dENoYW4tPnNmYk9mZnNldHNbc2ZiQWN0KzFdIC0gcHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0c1tzZmJBY3RdKSwKLQkJCQkJCQlzY2ZBY3QpOwotCQkJCQkJaWYgKHNmYkRpc3ROZXcgPCBzZmJEaXN0W3NmYkFjdF0pIHsKLQkJCQkJCQkvKiBzdWNjZXNzLCByZXBsYWNlIHNjZiBieSBuZXcgb25lICovCi0JCQkJCQkJc2NmW3NmYkFjdF0gPSBzY2ZBY3Q7Ci0JCQkJCQkJc2ZiRGlzdFtzZmJBY3RdID0gc2ZiRGlzdE5ldzsKLQkJCQkJCQlkZWx0YVBlTmV3ID0gZGVsdGFQZVRtcDsKLQkJCQkJCQlzdWNjZXNzID0gMTsKLQkJCQkJCX0KLQkJCQkJCS8qIG1hcmsgYXMgYWxyZWFkeSBjaGVja2VkICovCi0KLQkJCQkJCWlmICh1cGRhdGVNaW5TY2ZDYWxjdWxhdGVkKSB7Ci0JCQkJCQkJbWluU2NmQ2FsY3VsYXRlZFtzZmJBY3RdID0gc2NmQWN0OwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJdXBkYXRlTWluU2NmQ2FsY3VsYXRlZCA9IDA7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0gd2hpbGUgKHNjZkFjdCA+IHNjZk1pbik7Ci0JCQlkZWx0YVBlID0gZGVsdGFQZU5ldzsKLQkJCS8qIHNhdmUgcGFyYW1ldGVycyB0byBhdm9pZCBtdWx0aXBsZSBjb21wdXRhdGlvbnMgb2YgdGhlIHNhbWUgc2ZiICovCi0JCQlwcmV2U2NmTGFzdFtzZmJBY3RdID0gKnNjZkxhc3Q7Ci0JCQlwcmV2U2NmTmV4dFtzZmJBY3RdID0gKnNjZk5leHQ7Ci0JCQlkZWx0YVBlTGFzdFtzZmJBY3RdID0gZGVsdGFQZTsKLQkJfQotCi0JCWlmIChzdWNjZXNzICYmIHJlc3RhcnRPblN1Y2Nlc3MpIHsKLQkJCS8qIHN0YXJ0IGFnYWluIGF0IGZpcnN0IHNmYiAqLwotCQkJc2ZiTGFzdCA9IC0xOwotCQkJc2ZiQWN0ICA9IC0xOwotCQkJc2ZiTmV4dCA9IC0xOwotCQkJc2NmTGFzdCA9IDA7Ci0JCQlzY2ZOZXh0ID0gMDsKLQkJCXNjZk1pbiAgPSBNQVhfMTY7Ci0JCQlzdWNjZXNzID0gMDsKLQkJfQotCQllbHNlIHsKLQkJCS8qIHNoaWZ0IHNmYnMgZm9yIG5leHQgYmFuZCAqLwotCQkJc2ZiTGFzdCA9IHNmYkFjdDsKLQkJCXNmYkFjdCAgPSBzZmJOZXh0OwotCQl9Ci0KLSAgfSB3aGlsZSAoc2ZiTmV4dCA8IHBzeU91dENoYW4tPnNmYkNudCk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBhc3NpbWlsYXRlTXVsdGlwbGVTY2YKLSogZGVzY3JpcHRpb246ICBzY2FsZWZhY3RvciBkaWZmZXJlbmNlIHJlZHVjdGlvbgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGFzc2ltaWxhdGVNdWx0aXBsZVNjZihQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpzY2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICptaW5TY2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICpzZmJEaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqc2ZiQ29uc3RQZVBhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpsb2dTZmJFbmVyZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpsb2dTZmJGb3JtRmFjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqc2ZiTlJlbGV2YW50TGluZXMpCi17Ci0JV29yZDMyIHNmYiwgc3RhcnRTZmIsIHN0b3BTZmIsIHNjZk1pbiwgc2NmTWF4LCBzY2ZBY3Q7Ci0JRmxhZyAgIHBvc3NpYmxlUmVnaW9uRm91bmQ7Ci0JV29yZDMyIGRlbHRhU2NmQml0czsKLQlXb3JkMzIgZGVsdGFTcGVjUGU7Ci0JV29yZDMyIGRlbHRhUGUsIGRlbHRhUGVOZXc7Ci0JV29yZDMyIHNmYkNudDsKLQlXb3JkMzIgKnNmYkRpc3ROZXcgPSBwc3lPdXRDaGFuLT5zZmJEaXN0TmV3OwotCVdvcmQxNiAqc2NmVG1wID0gcHN5T3V0Q2hhbi0+cHJldlNjZkxhc3Q7Ci0KLQlkZWx0YVBlID0gMDsKLQlzZmJDbnQgPSBwc3lPdXRDaGFuLT5zZmJDbnQ7Ci0KLQkvKiBjYWxjIG1pbiBhbmQgbWF4IHNjYWxmYWN0b3JzICovCi0Jc2NmTWluID0gTUFYXzE2OwotCXNjZk1heCA9IE1JTl8xNjsKLQlmb3IgKHNmYj0wOyBzZmI8c2ZiQ250OyBzZmIrKykgewotCi0JCWlmIChzY2Zbc2ZiXSAhPSBNSU5fMTYpIHsKLQkJCXNjZk1pbiA9IG1pbihzY2ZNaW4sIHNjZltzZmJdKTsKLQkJCXNjZk1heCA9IG1heChzY2ZNYXgsIHNjZltzZmJdKTsKLQkJfQotCX0KLQotCWlmIChzY2ZNYXggIT0gIE1JTl8xNikgewotCi0JCXNjZkFjdCA9IHNjZk1heDsKLQotCQlkbyB7Ci0JCQlzY2ZBY3QgPSBzY2ZBY3QgLSAxOwotCQkJZm9yIChzZmI9MDsgc2ZiPHNmYkNudDsgc2ZiKyspIHsKLQkJCQlzY2ZUbXBbc2ZiXSA9IHNjZltzZmJdOwotCQkJfQotCQkJc3RvcFNmYiA9IDA7Ci0JCQlkbyB7Ci0JCQkJc2ZiID0gc3RvcFNmYjsKLQotCQkJCXdoaWxlIChzZmIgPCBzZmJDbnQgJiYgKHNjZltzZmJdID09IE1JTl8xNiB8fCBzY2Zbc2ZiXSA8PSBzY2ZBY3QpKSB7Ci0JCQkJCXNmYiA9IHNmYiArIDE7Ci0JCQkJfQotCQkJCXN0YXJ0U2ZiID0gc2ZiOwotCQkJCXNmYiA9IHNmYiArIDE7Ci0KLQkJCQl3aGlsZSAoc2ZiIDwgc2ZiQ250ICYmIChzY2Zbc2ZiXSA9PSBNSU5fMTYgfHwgc2NmW3NmYl0gPiBzY2ZBY3QpKSB7Ci0JCQkJCXNmYiA9IHNmYiArIDE7Ci0JCQkJfQotCQkJCXN0b3BTZmIgPSBzZmI7Ci0KLQkJCQlwb3NzaWJsZVJlZ2lvbkZvdW5kID0gMDsKLQotCQkJCWlmIChzdGFydFNmYiA8IHNmYkNudCkgewotCQkJCQlwb3NzaWJsZVJlZ2lvbkZvdW5kID0gMTsKLQkJCQkJZm9yIChzZmI9c3RhcnRTZmI7IHNmYjxzdG9wU2ZiOyBzZmIrKykgewotCi0JCQkJCQlpZiAoc2NmW3NmYl0hPU1JTl8xNikgewotCi0JCQkJCQkJaWYgKHNjZkFjdCA8IG1pblNjZltzZmJdKSB7Ci0JCQkJCQkJCXBvc3NpYmxlUmVnaW9uRm91bmQgPSAwOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQotCQkJCWlmIChwb3NzaWJsZVJlZ2lvbkZvdW5kKSB7IC8qIHJlZ2lvbiBmb3VuZCAqLwotCi0JCQkJCS8qIHJlcGxhY2Ugc2NmcyBpbiByZWdpb24gYnkgc2NmQWN0ICovCi0JCQkJCWZvciAoc2ZiPXN0YXJ0U2ZiOyBzZmI8c3RvcFNmYjsgc2ZiKyspIHsKLQotCQkJCQkJaWYgKHNjZlRtcFtzZmJdIT1NSU5fMTYpCi0JCQkJCQkJc2NmVG1wW3NmYl0gPSBzY2ZBY3Q7Ci0JCQkJCX0KLQotCQkJCQkvKiBlc3RpbWF0ZSBjaGFuZ2UgaW4gYml0IGRlbWFuZCBmb3IgbmV3IHNjZnMgKi8KLQkJCQkJZGVsdGFTY2ZCaXRzID0gY291bnRTY2ZCaXRzRGlmZihzY2Ysc2NmVG1wLHNmYkNudCxzdGFydFNmYixzdG9wU2ZiKTsKLQkJCQkJZGVsdGFTcGVjUGUgPSBjYWxjU3BlY1BlRGlmZihzY2YsIHNjZlRtcCwgc2ZiQ29uc3RQZVBhcnQsCi0JCQkJCQlsb2dTZmJFbmVyZ3ksIGxvZ1NmYkZvcm1GYWN0b3IsIHNmYk5SZWxldmFudExpbmVzLAotCQkJCQkJc3RhcnRTZmIsIHN0b3BTZmIpOwotCQkJCQlkZWx0YVBlTmV3ID0gZGVsdGFQZSArIGRlbHRhU2NmQml0cyArIGRlbHRhU3BlY1BlOwotCi0KLQkJCQkJaWYgKGRlbHRhUGVOZXcgPCAxMCkgewotCQkJCQkJV29yZDMyIGRpc3RPbGRTdW0sIGRpc3ROZXdTdW07Ci0KLQkJCQkJCS8qIHF1YW50aXplIGFuZCBjYWxjIHN1bSBvZiBuZXcgZGlzdG9ydGlvbiAqLwotCQkJCQkJZGlzdE9sZFN1bSA9IDA7Ci0JCQkJCQlkaXN0TmV3U3VtID0gMDsKLQkJCQkJCWZvciAoc2ZiPXN0YXJ0U2ZiOyBzZmI8c3RvcFNmYjsgc2ZiKyspIHsKLQotCQkJCQkJCWlmIChzY2ZUbXBbc2ZiXSAhPSBNSU5fMTYpIHsKLQkJCQkJCQkJZGlzdE9sZFN1bSA9IExfYWRkKGRpc3RPbGRTdW0sIHNmYkRpc3Rbc2ZiXSk7Ci0KLQkJCQkJCQkJc2ZiRGlzdE5ld1tzZmJdID0gY2FsY1NmYkRpc3QocHN5T3V0Q2hhbi0+bWRjdFNwZWN0cnVtICsKLQkJCQkJCQkJCXBzeU91dENoYW4tPnNmYk9mZnNldHNbc2ZiXSwKLQkJCQkJCQkJCShwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW3NmYisxXSAtIHBzeU91dENoYW4tPnNmYk9mZnNldHNbc2ZiXSksCi0JCQkJCQkJCQlzY2ZBY3QpOwotCi0KLQkJCQkJCQkJaWYgKHNmYkRpc3ROZXdbc2ZiXSA+IHBzeU91dENoYW4tPnNmYlRocmVzaG9sZFtzZmJdKSB7Ci0JCQkJCQkJCQlkaXN0TmV3U3VtID0gZGlzdE9sZFN1bSA8PCAxOwotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZGlzdE5ld1N1bSA9IExfYWRkKGRpc3ROZXdTdW0sIHNmYkRpc3ROZXdbc2ZiXSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlpZiAoZGlzdE5ld1N1bSA8IGRpc3RPbGRTdW0pIHsKLQkJCQkJCQlkZWx0YVBlID0gZGVsdGFQZU5ldzsKLQkJCQkJCQlmb3IgKHNmYj1zdGFydFNmYjsgc2ZiPHN0b3BTZmI7IHNmYisrKSB7Ci0KLQkJCQkJCQkJaWYgKHNjZltzZmJdIT1NSU5fMTYpIHsKLQkJCQkJCQkJCXNjZltzZmJdID0gc2NmQWN0OwotCQkJCQkJCQkJc2ZiRGlzdFtzZmJdID0gc2ZiRGlzdE5ld1tzZmJdOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSB3aGlsZSAoc3RvcFNmYiA8PSBzZmJDbnQpOwotCQl9IHdoaWxlIChzY2ZBY3QgPiBzY2ZNaW4pOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBFc3RpbWF0ZVNjYWxlRmFjdG9yc0NoYW5uZWwKLSogZGVzY3JpcHRpb246ICBlc3RpbWF0ZSBzY2FsZSBmYWN0b3JzIGZvciBvbmUgY2hhbm5lbAotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkCi1Fc3RpbWF0ZVNjYWxlRmFjdG9yc0NoYW5uZWwoUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICAqc2NmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICAqZ2xvYmFsR2FpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgKmxvZ1NmYkVuZXJneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgKmxvZ1NmYkZvcm1GYWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgICpzZmJOUmVsZXZhbnRMaW5lcykKLXsKLQlXb3JkMzIgaSwgajsKLQlXb3JkMzIgdGhyZXNoLCBlbmVyZ3k7Ci0JV29yZDMyIGVuZXJneVBhcnQsIHRocmVzaG9sZFBhcnQ7Ci0JV29yZDMyIHNjZkludCwgbWluU2NmLCBtYXhTY2YsIG1heEFsbG93ZWRTY2YsIGxhc3RTZjsKLQlXb3JkMzIgbWF4U3BlYzsKLQlXb3JkMzIgKnNmYkRpc3QgPSBwc3lPdXRDaGFuLT5zZmJEaXN0OwotCVdvcmQxNiAqbWluU2ZNYXhRdWFudCA9IHBzeU91dENoYW4tPm1pblNmTWF4UXVhbnQ7Ci0JV29yZDE2ICptaW5TY2ZDYWxjdWxhdGVkID0gcHN5T3V0Q2hhbi0+bWluU2NmQ2FsY3VsYXRlZDsKLQotCi0JZm9yIChpPTA7IGk8cHN5T3V0Q2hhbi0+c2ZiQ250OyBpKyspIHsKLQkJV29yZDMyIHNiZndpdGgsIHNiZlN0YXJ0OwotCQlXb3JkMzIgKm1kY3RTcGVjOwotCQl0aHJlc2ggPSBwc3lPdXRDaGFuLT5zZmJUaHJlc2hvbGRbaV07Ci0JCWVuZXJneSA9IHBzeU91dENoYW4tPnNmYkVuZXJneVtpXTsKLQotCQlzYmZTdGFydCA9IHBzeU91dENoYW4tPnNmYk9mZnNldHNbaV07Ci0JCXNiZndpdGggPSBwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW2krMV0gLSBzYmZTdGFydDsKLQkJbWRjdFNwZWMgPSBwc3lPdXRDaGFuLT5tZGN0U3BlY3RydW0rc2JmU3RhcnQ7Ci0KLQkJbWF4U3BlYyA9IDA7Ci0JCS8qIG1heGltdW0gb2Ygc3BlY3RydW0gKi8KLQkJZm9yIChqPXNiZndpdGg7IGo7IGotLSApIHsKLQkJCVdvcmQzMiBhYnNTcGVjID0gTF9hYnMoKm1kY3RTcGVjKTsgbWRjdFNwZWMrKzsKLQkJCW1heFNwZWMgfD0gYWJzU3BlYzsKLQkJfQotCi0JCS8qIHNjZnMgd2l0aG91dCBlbmVyZ3kgb3Igd2l0aCB0aHJlc2g+ZW5lcmd5IGFyZSBtYXJrZWQgd2l0aCBNSU5fMTYgKi8KLQkJc2NmW2ldID0gTUlOXzE2OwotCQltaW5TZk1heFF1YW50W2ldID0gTUlOXzE2OwotCi0JCWlmICgobWF4U3BlYyA+IDApICYmIChlbmVyZ3kgPiB0aHJlc2gpKSB7Ci0KLQkJCWVuZXJneVBhcnQgPSBsb2dTZmJGb3JtRmFjdG9yW2ldOwotCQkJdGhyZXNob2xkUGFydCA9IGlMb2c0KHRocmVzaCk7Ci0JCQkvKiAtMjAgPSA0KmxvZzIoNi43NSkgLSAzMiAqLwotCQkJc2NmSW50ID0gKCh0aHJlc2hvbGRQYXJ0IC0gZW5lcmd5UGFydCAtIDIwKSAqIFNDQUxFX0VTVElNQVRFX0NPRUYpID4+IDE1OwotCi0JCQltaW5TZk1heFF1YW50W2ldID0gaUxvZzQobWF4U3BlYykgLSA2ODsgLyogNjggIC0xNi8zKmxvZyhNQVhfUVVBTlQrMC41LWxvZ0NvbikvbG9nKDIpICsgMSAqLwotCi0KLQkJCWlmIChtaW5TZk1heFF1YW50W2ldID4gc2NmSW50KSB7Ci0JCQkJc2NmSW50ID0gbWluU2ZNYXhRdWFudFtpXTsKLQkJCX0KLQotCQkJLyogZmluZCBiZXR0ZXIgc2NhbGVmYWN0b3Igd2l0aCBhbmFseXNpcyBieSBzeW50aGVzaXMgKi8KLQkJCXNjZkludCA9IGltcHJvdmVTY2YocHN5T3V0Q2hhbi0+bWRjdFNwZWN0cnVtK3NiZlN0YXJ0LAotCQkJCXNiZndpdGgsCi0JCQkJdGhyZXNoLCBzY2ZJbnQsIG1pblNmTWF4UXVhbnRbaV0sCi0JCQkJJnNmYkRpc3RbaV0sICZtaW5TY2ZDYWxjdWxhdGVkW2ldKTsKLQotCQkJc2NmW2ldID0gc2NmSW50OwotCQl9Ci0JfQotCi0KLQkvKiBzY2FsZWZhY3RvciBkaWZmZXJlY2UgcmVkdWN0aW9uICAqLwotCXsKLQkJV29yZDE2IHNmYkNvbnN0UGVQYXJ0W01BWF9HUk9VUEVEX1NGQl07Ci0JCWZvcihpPTA7aTxwc3lPdXRDaGFuLT5zZmJDbnQ7aSsrKSB7Ci0JCQlzZmJDb25zdFBlUGFydFtpXSA9IE1JTl8xNjsKLQkJfQotCi0JCWFzc2ltaWxhdGVTaW5nbGVTY2YocHN5T3V0Q2hhbiwgc2NmLAotCQkJbWluU2ZNYXhRdWFudCwgc2ZiRGlzdCwgc2ZiQ29uc3RQZVBhcnQsIGxvZ1NmYkVuZXJneSwKLQkJCWxvZ1NmYkZvcm1GYWN0b3IsIHNmYk5SZWxldmFudExpbmVzLCBtaW5TY2ZDYWxjdWxhdGVkLCAxKTsKLQotCQlhc3NpbWlsYXRlTXVsdGlwbGVTY2YocHN5T3V0Q2hhbiwgc2NmLAotCQkJbWluU2ZNYXhRdWFudCwgc2ZiRGlzdCwgc2ZiQ29uc3RQZVBhcnQsIGxvZ1NmYkVuZXJneSwKLQkJCWxvZ1NmYkZvcm1GYWN0b3IsIHNmYk5SZWxldmFudExpbmVzKTsKLQl9Ci0KLQkvKiBnZXQgbWF4IHNjYWxlZmFjIGZvciBnbG9iYWwgZ2FpbiAqLwotCW1heFNjZiA9IE1JTl8xNjsKLQltaW5TY2YgPSBNQVhfMTY7Ci0JZm9yIChpPTA7IGk8cHN5T3V0Q2hhbi0+c2ZiQ250OyBpKyspIHsKLQotCQlpZiAobWF4U2NmIDwgc2NmW2ldKSB7Ci0JCQltYXhTY2YgPSBzY2ZbaV07Ci0JCX0KLQotCQlpZiAoKHNjZltpXSAhPSBNSU5fMTYpICYmIChtaW5TY2YgPiBzY2ZbaV0pKSB7Ci0JCQltaW5TY2YgPSBzY2ZbaV07Ci0JCX0KLQl9Ci0JLyogbGltaXQgc2NmIGRlbHRhICovCi0JbWF4QWxsb3dlZFNjZiA9IG1pblNjZiArIE1BWF9TQ0ZfREVMVEE7Ci0JZm9yKGk9MDsgaTxwc3lPdXRDaGFuLT5zZmJDbnQ7IGkrKykgewotCi0JCWlmICgoc2NmW2ldICE9IE1JTl8xNikgJiYgKG1heEFsbG93ZWRTY2YgPCBzY2ZbaV0pKSB7Ci0JCQlzY2ZbaV0gPSBtYXhBbGxvd2VkU2NmOwotCQl9Ci0JfQotCS8qIG5ldyBtYXhTY2YgaWYgYW55IHNjZiBoYXMgYmVlbiBsaW1pdGVkICovCi0KLQlpZiAobWF4QWxsb3dlZFNjZiA8IG1heFNjZikgewotCQltYXhTY2YgPSBtYXhBbGxvd2VkU2NmOwotCX0KLQotCS8qIGNhbGMgbG9vcCBzY2FsZWZhY3RvcnMgKi8KLQotCWlmIChtYXhTY2YgPiBNSU5fMTYpIHsKLQkJKmdsb2JhbEdhaW4gPSBtYXhTY2Y7Ci0JCWxhc3RTZiA9IDA7Ci0KLQkJZm9yKGk9MDsgaTxwc3lPdXRDaGFuLT5zZmJDbnQ7IGkrKykgewotCi0JCQlpZiAoc2NmW2ldID09IE1JTl8xNikgewotCQkJCXNjZltpXSA9IGxhc3RTZjsKLQkJCQkvKiBzZXQgYmFuZCBleHBsaWNpdGVseSB0byB6ZXJvICovCi0JCQkJZm9yIChqPXBzeU91dENoYW4tPnNmYk9mZnNldHNbaV07IGo8cHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0c1tpKzFdOyBqKyspIHsKLQkJCQkJcHN5T3V0Q2hhbi0+bWRjdFNwZWN0cnVtW2pdID0gMDsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzY2ZbaV0gPSBtYXhTY2YgLSBzY2ZbaV07Ci0JCQkJbGFzdFNmID0gc2NmW2ldOwotCQkJfQotCQl9Ci0JfQotCWVsc2V7Ci0JCSpnbG9iYWxHYWluID0gMDsKLQkJLyogc2V0IHNwZWN0cnVtIGV4cGxpY2l0ZWx5IHRvIHplcm8gKi8KLQkJZm9yKGk9MDsgaTxwc3lPdXRDaGFuLT5zZmJDbnQ7IGkrKykgewotCQkJc2NmW2ldID0gMDsKLQkJCWZvciAoaj1wc3lPdXRDaGFuLT5zZmJPZmZzZXRzW2ldOyBqPHBzeU91dENoYW4tPnNmYk9mZnNldHNbaSsxXTsgaisrKSB7Ci0JCQkJcHN5T3V0Q2hhbi0+bWRjdFNwZWN0cnVtW2pdID0gMDsKLQkJCX0KLQkJfQotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBDYWxjRm9ybUZhY3RvcgotKiBkZXNjcmlwdGlvbjogIGVzdGltYXRlIEZvcm0gZmFjdG9ycyBmb3IgYWxsIGNoYW5uZWwKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkCi1DYWxjRm9ybUZhY3RvcihXb3JkMTYgbG9nU2ZiRm9ybUZhY3RvcltNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCi0gICAgICAgICAgICAgICBXb3JkMTYgc2ZiTlJlbGV2YW50TGluZXNbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAotICAgICAgICAgICAgICAgV29yZDE2IGxvZ1NmYkVuZXJneVtNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCi0gICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgcHN5T3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLAotICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IG5DaGFubmVscykKLXsKLQlXb3JkMTYgajsKLQotCWZvciAoaj0wOyBqPG5DaGFubmVsczsgaisrKSB7Ci0JCUNhbGNGb3JtRmFjdG9yQ2hhbm5lbChsb2dTZmJGb3JtRmFjdG9yW2pdLCBzZmJOUmVsZXZhbnRMaW5lc1tqXSwgbG9nU2ZiRW5lcmd5W2pdLCAmcHN5T3V0Q2hhbm5lbFtqXSk7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IEVzdGltYXRlU2NhbGVGYWN0b3JzCi0qIGRlc2NyaXB0aW9uOiAgZXN0aW1hdGUgc2NhbGUgZmFjdG9ycyBmb3IgYWxsIGNoYW5uZWwKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkCi1Fc3RpbWF0ZVNjYWxlRmFjdG9ycyhQU1lfT1VUX0NIQU5ORUwgcHN5T3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLAotICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0NIQU5ORUwgIHFjT3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLAotICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgIGxvZ1NmYkVuZXJneVtNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCi0gICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgbG9nU2ZiRm9ybUZhY3RvcltNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCi0gICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgc2ZiTlJlbGV2YW50TGluZXNbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgIG5DaGFubmVscykKLXsKLQlXb3JkMTYgajsKLQotCWZvciAoaj0wOyBqPG5DaGFubmVsczsgaisrKSB7Ci0JCUVzdGltYXRlU2NhbGVGYWN0b3JzQ2hhbm5lbCgmcHN5T3V0Q2hhbm5lbFtqXSwKLQkJCXFjT3V0Q2hhbm5lbFtqXS5zY2YsCi0JCQkmKHFjT3V0Q2hhbm5lbFtqXS5nbG9iYWxHYWluKSwKLQkJCWxvZ1NmYkVuZXJneVtqXSwKLQkJCWxvZ1NmYkZvcm1GYWN0b3Jbal0sCi0JCQlzZmJOUmVsZXZhbnRMaW5lc1tqXSk7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9zcHJlYWRpbmcuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3NwcmVhZGluZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWYyZmZmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3NwcmVhZGluZy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQlzcHJlYWRpbmcuYwotCi0JQ29udGVudDoJU3ByZWFkaW5nIG9mIGVuZXJneSBmdW5jdGlvbgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiYmFzaWNfb3AuaCIKLSNpbmNsdWRlICJvcGVyXzMyYi5oIgotI2luY2x1ZGUgInNwcmVhZGluZy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IFNwcmVhZGluZ01heAotKiBkZXNjcmlwdGlvbjogIHNwcmVhZGluZyB0aGUgZW5lcmd5Ci0qCQkJCSBoaWdoZXIgZnJlcXVlbmNpZXMgdGhyKG4pID0gbWF4KHRocihuKSwgc2gobikqdGhyKG4tMSkpCi0qCQkJCSBsb3dlciBmcmVxdWVuY2llcyAgdGhyKG4pID0gbWF4KHRocihuKSwgc2wobikqdGhyKG4rMSkpCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBTcHJlYWRpbmdNYXgoY29uc3QgV29yZDE2IHBiQ250LAotICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICptYXNrTG93RmFjdG9yLAotICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICptYXNrSGlnaEZhY3RvciwKLSAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqcGJTcHJlYWRlZEVuZXJneSkKLXsKLSAgV29yZDMyIGk7Ci0KLSAgLyogc2xvcGUgdG8gaGlnaGVyIGZyZXF1ZW5jaWVzICovCi0gIGZvciAoaT0xOyBpPHBiQ250OyBpKyspIHsKLSAgICBwYlNwcmVhZGVkRW5lcmd5W2ldID0gbWF4KHBiU3ByZWFkZWRFbmVyZ3lbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExfbXB5X2xzKHBiU3ByZWFkZWRFbmVyZ3lbaS0xXSwgbWFza0hpZ2hGYWN0b3JbaV0pKTsKLSAgfQotICAvKiBzbG9wZSB0byBsb3dlciBmcmVxdWVuY2llcyAqLwotICBmb3IgKGk9cGJDbnQgLSAyOyBpPj0wOyBpLS0pIHsKLSAgICBwYlNwcmVhZGVkRW5lcmd5W2ldID0gbWF4KHBiU3ByZWFkZWRFbmVyZ3lbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExfbXB5X2xzKHBiU3ByZWFkZWRFbmVyZ3lbaSsxXSwgbWFza0xvd0ZhY3RvcltpXSkpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9zdGF0X2JpdHMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3N0YXRfYml0cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmJkOGJkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3N0YXRfYml0cy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJc3RhdF9iaXRzLmMKLQotCUNvbnRlbnQ6CVN0YXRpYyBiaXQgY291bnRlciBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInN0YXRfYml0cy5oIgotI2luY2x1ZGUgImJpdGVuYy5oIgotI2luY2x1ZGUgInRucy5oIgotCi0KLXR5cGVkZWYgZW51bSB7Ci0gIFNJX0lEX0JJVFMgICAgICAgICAgICAgICAgPSgzKSwKLSAgU0lfRklMTF9DT1VOVF9CSVRTICAgICAgICA9KDQpLAotICBTSV9GSUxMX0VTQ19DT1VOVF9CSVRTICAgID0oOCksCi0gIFNJX0ZJTExfRVhURU5USU9OX0JJVFMgICAgPSg0KSwKLSAgU0lfRklMTF9OSUJCTEVfQklUUyAgICAgICA9KDQpLAotICBTSV9TQ0VfQklUUyAgICAgICAgICAgICAgID0oNCksCi0gIFNJX0NQRV9CSVRTICAgICAgICAgICAgICAgPSg1KSwKLSAgU0lfQ1BFX01TX01BU0tfQklUUyAgICAgICA9KDIpICwKLSAgU0lfSUNTX0lORk9fQklUU19MT05HICAgICA9KDErMisxKzYrMSksCi0gIFNJX0lDU19JTkZPX0JJVFNfU0hPUlQgICAgPSgxKzIrMSs0KzcpLAotICBTSV9JQ1NfQklUUyAgICAgICAgICAgICAgID0oOCsxKzErMSkKLX0gU0lfQklUUzsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGNvdW50TXNNYXNrQml0cwotKiBkZXNjcmlwdGlvbjogICBjb3VudCBtcyBzdGVyZW8gYml0cyBkZW1hbmQKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgV29yZDE2IGNvdW50TXNNYXNrQml0cyhXb3JkMTYgICBzZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICBzZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgIG1heFNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFRPT0xTSU5GTyAqdG9vbHNJbmZvKQotewotICBXb3JkMTYgbXNCaXRzLCBzZmJPZmYsIHNmYjsKLSAgbXNCaXRzID0gMDsKLQotCi0gIHN3aXRjaCh0b29sc0luZm8tPm1zRGlnZXN0KSB7Ci0gICAgY2FzZSBNU19OT05FOgotICAgIGNhc2UgTVNfQUxMOgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1TX1NPTUU6Ci0gICAgICBmb3Ioc2ZiT2ZmPTA7IHNmYk9mZjxzZmJDbnQ7IHNmYk9mZis9c2ZiUGVyR3JvdXApCi0gICAgICAgIGZvcihzZmI9MDsgc2ZiPG1heFNmYlBlckdyb3VwOyBzZmIrKykKLSAgICAgICAgICBtc0JpdHMgKz0gMTsKLSAgICAgIGJyZWFrOwotICB9Ci0gIHJldHVybihtc0JpdHMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IHRuc0NvdW50Ci0qIGRlc2NyaXB0aW9uOiAgIGNvdW50IHRucyBiaXQgZGVtYW5kICBjb3JlIGZ1bmN0aW9uCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIFdvcmQxNiB0bnNDb3VudChUTlNfSU5GTyAqdG5zSW5mbywgV29yZDE2IGJsb2NrVHlwZSkKLXsKLQotICBXb3JkMzIgaSwgazsKLSAgRmxhZyB0bnNQcmVzZW50OwotICBXb3JkMzIgbnVtT2ZXaW5kb3dzOwotICBXb3JkMzIgY291bnQ7Ci0gIFdvcmQzMiBjb2VmQml0czsKLSAgV29yZDE2ICpwdGNvZWY7Ci0KLSAgY291bnQgPSAwOwotCi0gIGlmIChibG9ja1R5cGUgPT0gMikKLSAgICBudW1PZldpbmRvd3MgPSA4OwotICBlbHNlCi0gICAgbnVtT2ZXaW5kb3dzID0gMTsKLSAgdG5zUHJlc2VudCA9IDA7Ci0KLSAgZm9yIChpPTA7IGk8bnVtT2ZXaW5kb3dzOyBpKyspIHsKLQotICAgIGlmICh0bnNJbmZvLT50bnNBY3RpdmVbaV0hPTApIHsKLSAgICAgIHRuc1ByZXNlbnQgPSAxOwotICAgIH0KLSAgfQotCi0gIGlmICh0bnNQcmVzZW50KSB7Ci0gICAgLyogdGhlcmUgaXMgZGF0YSB0byBiZSB3cml0dGVuKi8KLSAgICAvKmNvdW50ICs9IDE7ICovCi0gICAgZm9yIChpPTA7IGk8bnVtT2ZXaW5kb3dzOyBpKyspIHsKLQotICAgICAgaWYgKGJsb2NrVHlwZSA9PSAyKQotICAgICAgICBjb3VudCArPSAxOwotICAgICAgZWxzZQotICAgICAgICBjb3VudCArPSAyOwotCi0gICAgICBpZiAodG5zSW5mby0+dG5zQWN0aXZlW2ldKSB7Ci0gICAgICAgIGNvdW50ICs9IDE7Ci0KLSAgICAgICAgaWYgKGJsb2NrVHlwZSA9PSAyKSB7Ci0gICAgICAgICAgY291bnQgKz0gNDsKLSAgICAgICAgICBjb3VudCArPSAzOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIGNvdW50ICs9IDY7Ci0gICAgICAgICAgY291bnQgKz0gNTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0bnNJbmZvLT5vcmRlcltpXSkgewotICAgICAgICAgIGNvdW50ICs9IDE7IC8qZGlyZWN0aW9uKi8KLSAgICAgICAgICBjb3VudCArPSAxOyAvKmNvZWZfY29tcHJlc3Npb24gKi8KLQotICAgICAgICAgIGlmICh0bnNJbmZvLT5jb2VmUmVzW2ldID09IDQpIHsKLSAgICAgICAgICAgIHB0Y29lZiA9IHRuc0luZm8tPmNvZWYgKyBpKlROU19NQVhfT1JERVJfU0hPUlQ7Ci0JCQljb2VmQml0cyA9IDM7Ci0gICAgICAgICAgICBmb3Ioaz0wOyBrPHRuc0luZm8tPm9yZGVyW2ldOyBrKyspIHsKLQotICAgICAgICAgICAgICBpZiAoKHB0Y29lZltrXSA+IDMpIHx8IChwdGNvZWZba10gPCAtNCkpIHsKLSAgICAgICAgICAgICAgICBjb2VmQml0cyA9IDQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBjb2VmQml0cyA9IDI7Ci0gICAgICAgICAgICBwdGNvZWYgPSB0bnNJbmZvLT5jb2VmICsgaSpUTlNfTUFYX09SREVSX1NIT1JUOwotCQkJZm9yKGs9MDsgazx0bnNJbmZvLT5vcmRlcltpXTsgaysrKSB7Ci0KLSAgICAgICAgICAgICAgaWYgKChwdGNvZWZba10gPiAxKSB8fCAocHRjb2VmW2tdIDwgLTIpKSB7Ci0gICAgICAgICAgICAgICAgY29lZkJpdHMgPSAzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGZvciAoaz0wOyBrPHRuc0luZm8tPm9yZGVyW2ldOyBrKysgKSB7Ci0gICAgICAgICAgICBjb3VudCArPSBjb2VmQml0czsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICByZXR1cm4gY291bnQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGNvdW50VG5zQml0cwotKiBkZXNjcmlwdGlvbjogICBjb3VudCB0bnMgYml0IGRlbWFuZAotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBXb3JkMTYgY291bnRUbnNCaXRzKFROU19JTkZPICp0bnNJbmZvLFdvcmQxNiBibG9ja1R5cGUpCi17Ci0gIHJldHVybih0bnNDb3VudCh0bnNJbmZvLCBibG9ja1R5cGUpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBjb3VudFN0YXRpY0JpdGRlbWFuZAotKiBkZXNjcmlwdGlvbjogICBjb3VudCBzdGF0aWMgYml0IGRlbWFuZCBpbmNsdWRlIHRucwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVdvcmQxNiBjb3VudFN0YXRpY0JpdGRlbWFuZChQU1lfT1VUX0NIQU5ORUwgcHN5T3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfRUxFTUVOVCAqcHN5T3V0RWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgY2hhbm5lbHMsCi0JCQkJCQkJV29yZDE2IGFkdHNVc2VkKQotewotICBXb3JkMzIgc3RhdEJpdHM7Ci0gIFdvcmQzMiBjaDsKLQotICBzdGF0Qml0cyA9IDA7Ci0KLSAgLyogaWYgYWR0cyB1c2VkLCBhZGQgNTYgYml0cyAqLwotICBpZihhZHRzVXNlZCkgc3RhdEJpdHMgKz0gNTY7Ci0KLQotICBzd2l0Y2ggKGNoYW5uZWxzKSB7Ci0gICAgY2FzZSAxOgotICAgICAgc3RhdEJpdHMgKz0gU0lfSURfQklUUytTSV9TQ0VfQklUUytTSV9JQ1NfQklUUzsKLSAgICAgIHN0YXRCaXRzICs9IGNvdW50VG5zQml0cygmKHBzeU91dENoYW5uZWxbMF0udG5zSW5mbyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFswXS53aW5kb3dTZXF1ZW5jZSk7Ci0KLSAgICAgIHN3aXRjaChwc3lPdXRDaGFubmVsWzBdLndpbmRvd1NlcXVlbmNlKXsKLSAgICAgICAgY2FzZSBMT05HX1dJTkRPVzoKLSAgICAgICAgY2FzZSBTVEFSVF9XSU5ET1c6Ci0gICAgICAgIGNhc2UgU1RPUF9XSU5ET1c6Ci0gICAgICAgICAgc3RhdEJpdHMgKz0gU0lfSUNTX0lORk9fQklUU19MT05HOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNIT1JUX1dJTkRPVzoKLSAgICAgICAgICBzdGF0Qml0cyArPSBTSV9JQ1NfSU5GT19CSVRTX1NIT1JUOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgc3RhdEJpdHMgKz0gU0lfSURfQklUUytTSV9DUEVfQklUUysyKlNJX0lDU19CSVRTOwotCi0gICAgICBzdGF0Qml0cyArPSBTSV9DUEVfTVNfTUFTS19CSVRTOwotICAgICAgc3RhdEJpdHMgKz0gY291bnRNc01hc2tCaXRzKHBzeU91dENoYW5uZWxbMF0uc2ZiQ250LAotCQkJCQkJCQkgIHBzeU91dENoYW5uZWxbMF0uc2ZiUGVyR3JvdXAsCi0JCQkJCQkJCSAgcHN5T3V0Q2hhbm5lbFswXS5tYXhTZmJQZXJHcm91cCwKLQkJCQkJCQkJICAmcHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvKTsKLQotICAgICAgc3dpdGNoIChwc3lPdXRDaGFubmVsWzBdLndpbmRvd1NlcXVlbmNlKSB7Ci0gICAgICAgIGNhc2UgTE9OR19XSU5ET1c6Ci0gICAgICAgIGNhc2UgU1RBUlRfV0lORE9XOgotICAgICAgICBjYXNlIFNUT1BfV0lORE9XOgotICAgICAgICAgIHN0YXRCaXRzICs9IFNJX0lDU19JTkZPX0JJVFNfTE9ORzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTSE9SVF9XSU5ET1c6Ci0gICAgICAgICAgc3RhdEJpdHMgKz0gU0lfSUNTX0lORk9fQklUU19TSE9SVDsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGZvcihjaD0wOyBjaDwyOyBjaCsrKQotICAgICAgICBzdGF0Qml0cyArPSBjb3VudFRuc0JpdHMoJihwc3lPdXRDaGFubmVsW2NoXS50bnNJbmZvKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLndpbmRvd1NlcXVlbmNlKTsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgcmV0dXJuIHN0YXRCaXRzOwotfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy90bnMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3Rucy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2MzOTcxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3Rucy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTA2ICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJdG5zLmMKLQotCUNvbnRlbnQ6CURlZmluaXRpb24gVE5TIHRvb2xzIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiYmFzaWNfb3AuaCIKLSNpbmNsdWRlICJvcGVyXzMyYi5oIgotI2luY2x1ZGUgImFzc2VydC5oIgotI2luY2x1ZGUgImFhY19yb20uaCIKLSNpbmNsdWRlICJwc3lfY29uc3QuaCIKLSNpbmNsdWRlICJ0bnMuaCIKLSNpbmNsdWRlICJ0bnNfcGFyYW0uaCIKLSNpbmNsdWRlICJwc3lfY29uZmlndXJhdGlvbi5oIgotI2luY2x1ZGUgInRuc19mdW5jLmgiCi0KLSNkZWZpbmUgVU5VU0VEKHgpICh2b2lkKSh4KQotCi0jZGVmaW5lIFROU19NT0RJRllfQkVHSU4gICAgICAgICAyNjAwICAvKiBIeiAqLwotI2RlZmluZSBSQVRJT19QQVRDSF9MT1dFUl9CT1JERVIgMzgwICAgLyogSHogKi8KLSNkZWZpbmUgVE5TX0dBSU5fVEhSRVNICQkJIDE0MSAgIC8qIDEuNDEqMTAwICovCi0jZGVmaW5lIE5PUk1fQ09FRgkJCQkgMHgwMjhmNWMyOAotCi1zdGF0aWMgY29uc3QgV29yZDMyIFROU19QQVJDT1JfVEhSRVNIID0gMHgwY2NjY2NjZDsgLyogMC4xKigxIDw8IDMxKSAqLwotLyogTGltaXQgYmFuZHMgdG8gPiAyLjAga0h6ICovCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgdG5zTWluQmFuZE51bWJlckxvbmdbMTJdID0KLXsgMTEsIDEyLCAxNSwgMTYsIDE3LCAyMCwgMjUsIDI2LCAyNCwgMjgsIDMwLCAzMSB9Owotc3RhdGljIHVuc2lnbmVkIHNob3J0IHRuc01pbkJhbmROdW1iZXJTaG9ydFsxMl0gPQoteyAyLCAyLCAyLCAzLCAzLCA0LCA2LCA2LCA4LCAxMCwgMTAsIDEyIH07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIE1haW4vTG93IFByb2ZpbGUgVE5TIFBhcmFtZXRlcnMgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCB0bnNNYXhCYW5kc0xvbmdNYWluTG93WzEyXSA9Ci17IDMxLCAzMSwgMzQsIDQwLCA0MiwgNTEsIDQ2LCA0NiwgNDIsIDQyLCA0MiwgMzkgfTsKLQotc3RhdGljIHVuc2lnbmVkIHNob3J0IHRuc01heEJhbmRzU2hvcnRNYWluTG93WzEyXSA9Ci17IDksIDksIDEwLCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0IH07Ci0KLQotc3RhdGljIHZvaWQgQ2FsY1dlaWdodGVkU3BlY3RydW0oY29uc3QgV29yZDMyIHNwZWN0cnVtW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgd2VpZ2h0ZWRTcGVjdHJ1bVtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyKiBzZmJFbmVyZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYqIHNmYk9mZnNldCwgV29yZDE2IGxwY1N0YXJ0TGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBscGNTdG9wTGluZSwgV29yZDE2IGxwY1N0YXJ0QmFuZCxXb3JkMTYgbHBjU3RvcEJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgKnBXb3JrMzIpOwotCi0KLQotdm9pZCBBdXRvQ29ycmVsYXRpb24oY29uc3QgV29yZDE2IGlucHV0W10sIFdvcmQzMiBjb3JyW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHNhbXBsZXMsIFdvcmQxNiBjb3JyQ29lZmYpOwotc3RhdGljIFdvcmQxNiBBdXRvVG9QYXJjb3IoV29yZDMyIHdvcmtCdWZmZXJbXSwgV29yZDMyIHJlZmxDb2VmZltdLCBXb3JkMTYgbnVtT2ZDb2VmZik7Ci0KLXN0YXRpYyBXb3JkMTYgQ2FsY1Ruc0ZpbHRlcihjb25zdCBXb3JkMTYqIHNpZ25hbCwgY29uc3QgV29yZDMyIHdpbmRvd1tdLCBXb3JkMTYgbnVtT2ZMaW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgdG5zT3JkZXIsIFdvcmQzMiBwYXJjb3JbXSk7Ci0KLQotc3RhdGljIHZvaWQgUGFyY29yMkluZGV4KGNvbnN0IFdvcmQzMiBwYXJjb3JbXSwgV29yZDE2IGluZGV4W10sIFdvcmQxNiBvcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgYml0c1BlckNvZWZmKTsKLQotc3RhdGljIHZvaWQgSW5kZXgyUGFyY29yKGNvbnN0IFdvcmQxNiBpbmRleFtdLCBXb3JkMzIgcGFyY29yW10sIFdvcmQxNiBvcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgYml0c1BlckNvZWZmKTsKLQotCi0KLXN0YXRpYyB2b2lkIEFuYWx5c2lzRmlsdGVyTGF0dGljZShjb25zdCBXb3JkMzIgc2lnbmFsW10sIFdvcmQxNiBudW1PZkxpbmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQzMiBwYXJDb2VmZltdLCBXb3JkMTYgb3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyIG91dHB1dFtdKTsKLQotCi0vKioKLSoKLSogZnVuY3Rpb24gbmFtZTogRnJlcVRvQmFuZFdpdGhSb3VuZGluZwotKiBkZXNjcmlwdGlvbjogIFJldHJpZXZlIGluZGV4IG9mIG5lYXJlc3QgYmFuZCBib3JkZXIKLSogcmV0dXJudDoJCWluZGV4Ci0qCi0qLwotc3RhdGljIFdvcmQxNiBGcmVxVG9CYW5kV2l0aFJvdW5kaW5nKFdvcmQzMiBmcmVxLCAgICAgICAgICAgICAgICAgICAvKiE8IGZyZXF1ZW5jeSBpbiBIZXJ0eiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiBmcywgICAgICAgICAgICAgICAgICAgICAvKiE8IFNhbXBsaW5nIGZyZXF1ZW5jeSBpbiBIZXJ0eiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBudW1PZkJhbmRzLCAgICAgICAgICAgICAvKiE8IHRvdGFsIG51bWJlciBvZiBiYW5kcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAqYmFuZFN0YXJ0T2Zmc2V0KSAvKiE8IHRhYmxlIG9mIGJhbmQgYm9yZGVycyAqLwotewotICBXb3JkMzIgbGluZU51bWJlciwgYmFuZDsKLSAgV29yZDMyIHRlbXAsIHNoaWZ0OwotCi0gIC8qICBhc3NlcnQoZnJlcSA+PSAwKTsgICovCi0gIHNoaWZ0ID0gbm9ybV9sKGZzKTsKLSAgbGluZU51bWJlciA9IChleHRyYWN0X2woZml4bXVsKChiYW5kU3RhcnRPZmZzZXRbbnVtT2ZCYW5kc10gPDwgMiksRGl2XzMyKGZyZXEgPDwgc2hpZnQsZnMgPDwgc2hpZnQpKSkgKyAxKSA+PiAxOwotCi0gIC8qIGZyZXEgPiBmcy8yICovCi0gIHRlbXAgPSBsaW5lTnVtYmVyIC0gYmFuZFN0YXJ0T2Zmc2V0W251bU9mQmFuZHNdIDsKLSAgaWYgKHRlbXAgPj0gMCkKLSAgICByZXR1cm4gbnVtT2ZCYW5kczsKLQotICAvKiBmaW5kIGJhbmQgdGhlIGxpbmUgbnVtYmVyIGxpZXMgaW4gKi8KLSAgZm9yIChiYW5kPTA7IGJhbmQ8bnVtT2ZCYW5kczsgYmFuZCsrKSB7Ci0gICAgdGVtcCA9IGJhbmRTdGFydE9mZnNldFtiYW5kICsgMV0gLSBsaW5lTnVtYmVyOwotICAgIGlmICh0ZW1wID4gMCkgYnJlYWs7Ci0gIH0KLQotICB0ZW1wID0gKGxpbmVOdW1iZXIgLSBiYW5kU3RhcnRPZmZzZXRbYmFuZF0pOwotICB0ZW1wID0gKHRlbXAgLSAoYmFuZFN0YXJ0T2Zmc2V0W2JhbmQgKyAxXSAtIGxpbmVOdW1iZXIpKTsKLSAgaWYgKCB0ZW1wID4gMCApCi0gIHsKLSAgICBiYW5kID0gYmFuZCArIDE7Ci0gIH0KLQotICByZXR1cm4gZXh0cmFjdF9sKGJhbmQpOwotfQotCi0KLS8qKgotKgotKiBmdW5jdGlvbiBuYW1lOiBJbml0VG5zQ29uZmlndXJhdGlvbkxvbmcKLSogZGVzY3JpcHRpb246ICBGaWxsIFROU19DT05GSUcgc3RydWN0dXJlIHdpdGggc2Vuc2libGUgY29udGVudCBmb3IgbG9uZyBibG9ja3MKLSogcmV0dXJuczoJCTAgaWYgc3VjY2VzcwotKgotKi8KLVdvcmQxNiBJbml0VG5zQ29uZmlndXJhdGlvbkxvbmcoV29yZDMyIGJpdFJhdGUsICAgICAgICAgIC8qITwgYml0cmF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgc2FtcGxlUmF0ZSwgICAgICAgICAgLyohPCBTYW1wbGluZyBmcmVxdWVuY3kgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGNoYW5uZWxzLCAgICAgICAgICAgIC8qITwgbnVtYmVyIG9mIGNoYW5uZWxzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFROU19DT05GSUcgKnRDLCAgICAgICAgICAgICAvKiE8IFROUyBDb25maWcgc3RydWN0IChtb2RpZmllZCkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX0NPTkZJR1VSQVRJT05fTE9ORyAqcEMsIC8qITwgcHN5IGNvbmZpZyBzdHJ1Y3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGFjdGl2ZSkgICAgICAgICAgICAgIC8qITwgdG5zIGFjdGl2ZSBmbGFnICovCi17Ci0KLSAgV29yZDMyIGJpdHJhdGVQZXJDaGFubmVsIF9fdW51c2VkOwotICB0Qy0+bWF4T3JkZXIgICAgID0gVE5TX01BWF9PUkRFUjsKLSAgdEMtPnRuc1N0YXJ0RnJlcSA9IDEyNzU7Ci0gIHRDLT5jb2VmUmVzICAgICAgPSA0OwotCi0gIC8qIHRvIGF2b2lkIGludGVnZXIgZGl2aXNpb24gKi8KLSAgaWYgKCBzdWIoY2hhbm5lbHMsMikgPT0gMCApIHsKLSAgICBiaXRyYXRlUGVyQ2hhbm5lbCA9IGJpdFJhdGUgPj4gMTsKLSAgfQotICBlbHNlIHsKLSAgICBiaXRyYXRlUGVyQ2hhbm5lbCA9IGJpdFJhdGU7Ci0gIH0KLQotICB0Qy0+dG5zTWF4U2ZiID0gdG5zTWF4QmFuZHNMb25nTWFpbkxvd1twQy0+c2FtcFJhdGVJZHhdOwotCi0gIHRDLT50bnNBY3RpdmUgPSBhY3RpdmU7Ci0KLSAgLyogbm93IGNhbGMgYmFuZCBhbmQgbGluZSBib3JkZXJzICovCi0gIHRDLT50bnNTdG9wQmFuZCA9IG1pbihwQy0+c2ZiQ250LCB0Qy0+dG5zTWF4U2ZiKTsKLSAgdEMtPnRuc1N0b3BMaW5lID0gcEMtPnNmYk9mZnNldFt0Qy0+dG5zU3RvcEJhbmRdOwotCi0gIHRDLT50bnNTdGFydEJhbmQgPSBGcmVxVG9CYW5kV2l0aFJvdW5kaW5nKHRDLT50bnNTdGFydEZyZXEsIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5zZmJDbnQsIChjb25zdCBXb3JkMTYqKXBDLT5zZmJPZmZzZXQpOwotCi0gIHRDLT50bnNNb2RpZnlCZWdpbkNiID0gRnJlcVRvQmFuZFdpdGhSb3VuZGluZyhUTlNfTU9ESUZZX0JFR0lOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5zZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgV29yZDE2KilwQy0+c2ZiT2Zmc2V0KTsKLQotICB0Qy0+dG5zUmF0aW9QYXRjaExvd2VzdENiID0gRnJlcVRvQmFuZFdpdGhSb3VuZGluZyhSQVRJT19QQVRDSF9MT1dFUl9CT1JERVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5zZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBXb3JkMTYqKXBDLT5zZmJPZmZzZXQpOwotCi0KLSAgdEMtPnRuc1N0YXJ0TGluZSA9IHBDLT5zZmJPZmZzZXRbdEMtPnRuc1N0YXJ0QmFuZF07Ci0KLSAgdEMtPmxwY1N0b3BCYW5kID0gdG5zTWF4QmFuZHNMb25nTWFpbkxvd1twQy0+c2FtcFJhdGVJZHhdOwotICB0Qy0+bHBjU3RvcEJhbmQgPSBtaW4odEMtPmxwY1N0b3BCYW5kLCBwQy0+c2ZiQWN0aXZlKTsKLQotICB0Qy0+bHBjU3RvcExpbmUgPSBwQy0+c2ZiT2Zmc2V0W3RDLT5scGNTdG9wQmFuZF07Ci0KLSAgdEMtPmxwY1N0YXJ0QmFuZCA9IHRuc01pbkJhbmROdW1iZXJMb25nW3BDLT5zYW1wUmF0ZUlkeF07Ci0KLSAgdEMtPmxwY1N0YXJ0TGluZSA9IHBDLT5zZmJPZmZzZXRbdEMtPmxwY1N0YXJ0QmFuZF07Ci0KLSAgdEMtPnRocmVzaG9sZCA9IFROU19HQUlOX1RIUkVTSDsKLQotCi0gIHJldHVybigwKTsKLX0KLQotLyoqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IEluaXRUbnNDb25maWd1cmF0aW9uU2hvcnQKLSogZGVzY3JpcHRpb246ICBGaWxsIFROU19DT05GSUcgc3RydWN0dXJlIHdpdGggc2Vuc2libGUgY29udGVudCBmb3Igc2hvcnQgYmxvY2tzCi0qIHJldHVybnM6CQkwIGlmIHN1Y2Nlc3MKLSoKLSovCi1Xb3JkMTYgSW5pdFRuc0NvbmZpZ3VyYXRpb25TaG9ydChXb3JkMzIgYml0UmF0ZSwgICAgICAgICAgICAgIC8qITwgYml0cmF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyIHNhbXBsZVJhdGUsICAgICAgICAgICAvKiE8IFNhbXBsaW5nIGZyZXF1ZW5jeSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGNoYW5uZWxzLCAgICAgICAgICAgICAvKiE8IG51bWJlciBvZiBjaGFubmVscyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE5TX0NPTkZJRyAqdEMsICAgICAgICAgICAgICAvKiE8IFROUyBDb25maWcgc3RydWN0IChtb2RpZmllZCkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9DT05GSUdVUkFUSU9OX1NIT1JUICpwQywgLyohPCBwc3kgY29uZmlnIHN0cnVjdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGFjdGl2ZSkgICAgICAgICAgICAgICAvKiE8IHRucyBhY3RpdmUgZmxhZyAqLwotewotICBXb3JkMzIgYml0cmF0ZVBlckNoYW5uZWwgX191bnVzZWQ7Ci0gIHRDLT5tYXhPcmRlciAgICAgPSBUTlNfTUFYX09SREVSX1NIT1JUOwotICB0Qy0+dG5zU3RhcnRGcmVxID0gMjc1MDsKLSAgdEMtPmNvZWZSZXMgICAgICA9IDM7Ci0KLSAgLyogdG8gYXZvaWQgaW50ZWdlciBkaXZpc2lvbiAqLwotICBpZiAoIHN1YihjaGFubmVscywyKSA9PSAwICkgewotICAgIGJpdHJhdGVQZXJDaGFubmVsID0gTF9zaHIoYml0UmF0ZSwxKTsKLSAgfQotICBlbHNlIHsKLSAgICBiaXRyYXRlUGVyQ2hhbm5lbCA9IGJpdFJhdGU7Ci0gIH0KLQotICB0Qy0+dG5zTWF4U2ZiID0gdG5zTWF4QmFuZHNTaG9ydE1haW5Mb3dbcEMtPnNhbXBSYXRlSWR4XTsKLQotICB0Qy0+dG5zQWN0aXZlID0gYWN0aXZlOwotCi0gIC8qIG5vdyBjYWxjIGJhbmQgYW5kIGxpbmUgYm9yZGVycyAqLwotICB0Qy0+dG5zU3RvcEJhbmQgPSBtaW4ocEMtPnNmYkNudCwgdEMtPnRuc01heFNmYik7Ci0gIHRDLT50bnNTdG9wTGluZSA9IHBDLT5zZmJPZmZzZXRbdEMtPnRuc1N0b3BCYW5kXTsKLQotICB0Qy0+dG5zU3RhcnRCYW5kPUZyZXFUb0JhbmRXaXRoUm91bmRpbmcodEMtPnRuc1N0YXJ0RnJlcSwgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5zZmJDbnQsIChjb25zdCBXb3JkMTYqKXBDLT5zZmJPZmZzZXQpOwotCi0gIHRDLT50bnNNb2RpZnlCZWdpbkNiID0gRnJlcVRvQmFuZFdpdGhSb3VuZGluZyhUTlNfTU9ESUZZX0JFR0lOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5zZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgV29yZDE2KilwQy0+c2ZiT2Zmc2V0KTsKLQotICB0Qy0+dG5zUmF0aW9QYXRjaExvd2VzdENiID0gRnJlcVRvQmFuZFdpdGhSb3VuZGluZyhSQVRJT19QQVRDSF9MT1dFUl9CT1JERVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5zZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBXb3JkMTYqKXBDLT5zZmJPZmZzZXQpOwotCi0KLSAgdEMtPnRuc1N0YXJ0TGluZSA9IHBDLT5zZmJPZmZzZXRbdEMtPnRuc1N0YXJ0QmFuZF07Ci0KLSAgdEMtPmxwY1N0b3BCYW5kID0gdG5zTWF4QmFuZHNTaG9ydE1haW5Mb3dbcEMtPnNhbXBSYXRlSWR4XTsKLQotICB0Qy0+bHBjU3RvcEJhbmQgPSBtaW4odEMtPmxwY1N0b3BCYW5kLCBwQy0+c2ZiQWN0aXZlKTsKLQotICB0Qy0+bHBjU3RvcExpbmUgPSBwQy0+c2ZiT2Zmc2V0W3RDLT5scGNTdG9wQmFuZF07Ci0KLSAgdEMtPmxwY1N0YXJ0QmFuZCA9IHRuc01pbkJhbmROdW1iZXJTaG9ydFtwQy0+c2FtcFJhdGVJZHhdOwotCi0gIHRDLT5scGNTdGFydExpbmUgPSBwQy0+c2ZiT2Zmc2V0W3RDLT5scGNTdGFydEJhbmRdOwotCi0gIHRDLT50aHJlc2hvbGQgPSBUTlNfR0FJTl9USFJFU0g7Ci0KLSAgcmV0dXJuKDApOwotfQotCi0vKioKLSoKLSogZnVuY3Rpb24gbmFtZTogVG5zRGV0ZWN0Ci0qIGRlc2NyaXB0aW9uOiAgQ2FsY3VsYXRlIFROUyBmaWx0ZXIgYW5kIGRlY2lkZSBvbiBUTlMgdXNhZ2UKLSogcmV0dXJuczoJCTAgaWYgc3VjY2VzcwotKgotKi8KLVdvcmQzMiBUbnNEZXRlY3QoVE5TX0RBVEEqIHRuc0RhdGEsICAgICAgICAvKiE8IHRucyBkYXRhIHN0cnVjdHVyZSAobW9kaWZpZWQpICovCi0gICAgICAgICAgICAgICAgIFROU19DT05GSUcgdEMsICAgICAgICAgICAgLyohPCB0bnMgY29uZmlnIHN0cnVjdHVyZSAqLwotICAgICAgICAgICAgICAgICBXb3JkMzIqIHBTY3JhdGNoVG5zLCAgICAgIC8qITwgcG9pbnRlciB0byBzY3JhdGNoIHNwYWNlICovCi0gICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBzZmJPZmZzZXRbXSwgLyohPCBzY2FsZWZhY3RvciBzaXplIGFuZCB0YWJsZSAqLwotICAgICAgICAgICAgICAgICBXb3JkMzIqIHNwZWN0cnVtLCAgICAgICAgIC8qITwgc3BlY3RyYWwgZGF0YSAqLwotICAgICAgICAgICAgICAgICBXb3JkMTYgc3ViQmxvY2tOdW1iZXIsICAgIC8qITwgc3ViYmxvY2sgbnVtICovCi0gICAgICAgICAgICAgICAgIFdvcmQxNiBibG9ja1R5cGUsICAgICAgICAgLyohPCBibG9ja3R5cGUgKGxvbmcgb3Igc2hvcnQpICovCi0gICAgICAgICAgICAgICAgIFdvcmQzMiAqIHNmYkVuZXJneSkgICAgICAgLyohPCBzZmItd2lzZSBlbmVyZ3kgKi8KLXsKLQotICBXb3JkMzIgIHByZWRpY3Rpb25HYWluOwotICBXb3JkMzIgIHRlbXA7Ci0gIFdvcmQzMiogcFdvcmszMiA9ICZwU2NyYXRjaFRuc1tzdWJCbG9ja051bWJlciA+PiA4XTsKLSAgV29yZDE2KiBwV2VpZ2h0ZWRTcGVjdHJ1bSA9IChXb3JkMTYgKikmcFNjcmF0Y2hUbnNbc3ViQmxvY2tOdW1iZXIgPj4gOF07Ci0KLQotICBpZiAodEMudG5zQWN0aXZlKSB7Ci0gICAgQ2FsY1dlaWdodGVkU3BlY3RydW0oc3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgcFdlaWdodGVkU3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2ZiRW5lcmd5LAotICAgICAgICAgICAgICAgICAgICAgICAgIHNmYk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0Qy5scGNTdGFydExpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdEMubHBjU3RvcExpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdEMubHBjU3RhcnRCYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRDLmxwY1N0b3BCYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBXb3JrMzIpOwotCi0gICAgdGVtcCA9IGJsb2NrVHlwZSAtIFNIT1JUX1dJTkRPVzsKLSAgICBpZiAoIHRlbXAgIT0gMCApIHsKLSAgICAgICAgcHJlZGljdGlvbkdhaW4gPSBDYWxjVG5zRmlsdGVyKCAmcFdlaWdodGVkU3BlY3RydW1bdEMubHBjU3RhcnRMaW5lXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Qy5hY2ZXaW5kb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEMubHBjU3RvcExpbmUgLSB0Qy5scGNTdGFydExpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEMubWF4T3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG5zRGF0YS0+ZGF0YVJhdy50bnNMb25nLnN1YkJsb2NrSW5mby5wYXJjb3IpOwotCi0KLSAgICAgICAgdGVtcCA9IHByZWRpY3Rpb25HYWluIC0gdEMudGhyZXNob2xkOwotICAgICAgICBpZiAoIHRlbXAgPiAwICkgewotICAgICAgICAgIHRuc0RhdGEtPmRhdGFSYXcudG5zTG9uZy5zdWJCbG9ja0luZm8udG5zQWN0aXZlID0gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICB0bnNEYXRhLT5kYXRhUmF3LnRuc0xvbmcuc3ViQmxvY2tJbmZvLnRuc0FjdGl2ZSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICB0bnNEYXRhLT5kYXRhUmF3LnRuc0xvbmcuc3ViQmxvY2tJbmZvLnByZWRpY3Rpb25HYWluID0gcHJlZGljdGlvbkdhaW47Ci0gICAgfQotICAgIGVsc2V7Ci0KLSAgICAgICAgcHJlZGljdGlvbkdhaW4gPSBDYWxjVG5zRmlsdGVyKCAmcFdlaWdodGVkU3BlY3RydW1bdEMubHBjU3RhcnRMaW5lXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Qy5hY2ZXaW5kb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEMubHBjU3RvcExpbmUgLSB0Qy5scGNTdGFydExpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEMubWF4T3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG5zRGF0YS0+ZGF0YVJhdy50bnNTaG9ydC5zdWJCbG9ja0luZm9bc3ViQmxvY2tOdW1iZXJdLnBhcmNvcik7Ci0KLSAgICAgICAgdGVtcCA9IHByZWRpY3Rpb25HYWluIC0gdEMudGhyZXNob2xkOwotICAgICAgICBpZiAoIHRlbXAgPiAwICkgewotICAgICAgICAgIHRuc0RhdGEtPmRhdGFSYXcudG5zU2hvcnQuc3ViQmxvY2tJbmZvW3N1YkJsb2NrTnVtYmVyXS50bnNBY3RpdmUgPSAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIHRuc0RhdGEtPmRhdGFSYXcudG5zU2hvcnQuc3ViQmxvY2tJbmZvW3N1YkJsb2NrTnVtYmVyXS50bnNBY3RpdmUgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgdG5zRGF0YS0+ZGF0YVJhdy50bnNTaG9ydC5zdWJCbG9ja0luZm9bc3ViQmxvY2tOdW1iZXJdLnByZWRpY3Rpb25HYWluID0gcHJlZGljdGlvbkdhaW47Ci0gICAgfQotCi0gIH0KLSAgZWxzZXsKLQotICAgIHRlbXAgPSBibG9ja1R5cGUgLSBTSE9SVF9XSU5ET1c7Ci0gICAgaWYgKCB0ZW1wICE9IDAgKSB7Ci0gICAgICAgIHRuc0RhdGEtPmRhdGFSYXcudG5zTG9uZy5zdWJCbG9ja0luZm8udG5zQWN0aXZlID0gMDsKLSAgICAgICAgdG5zRGF0YS0+ZGF0YVJhdy50bnNMb25nLnN1YkJsb2NrSW5mby5wcmVkaWN0aW9uR2FpbiA9IDA7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICB0bnNEYXRhLT5kYXRhUmF3LnRuc1Nob3J0LnN1YkJsb2NrSW5mb1tzdWJCbG9ja051bWJlcl0udG5zQWN0aXZlID0gMDsKLSAgICAgICAgdG5zRGF0YS0+ZGF0YVJhdy50bnNTaG9ydC5zdWJCbG9ja0luZm9bc3ViQmxvY2tOdW1iZXJdLnByZWRpY3Rpb25HYWluID0gMDsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4oMCk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IFRuc1N5bmMKLSogZGVzY3JpcHRpb246IHVwZGF0ZSB0bnMgcGFyYW1ldGVyCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgVG5zU3luYyhUTlNfREFUQSAqdG5zRGF0YURlc3QsCi0gICAgICAgICAgICAgY29uc3QgVE5TX0RBVEEgKnRuc0RhdGFTcmMsCi0gICAgICAgICAgICAgY29uc3QgVE5TX0NPTkZJRyB0QywKLSAgICAgICAgICAgICBjb25zdCBXb3JkMTYgc3ViQmxvY2tOdW1iZXIsCi0gICAgICAgICAgICAgY29uc3QgV29yZDE2IGJsb2NrVHlwZSkKLXsKLSAgIFROU19TVUJCTE9DS19JTkZPICpzYkluZm9EZXN0OwotICAgY29uc3QgVE5TX1NVQkJMT0NLX0lORk8gKnNiSW5mb1NyYzsKLSAgIFdvcmQzMiBpLCB0ZW1wOwotCi0gICB0ZW1wID0gIGJsb2NrVHlwZSAtIFNIT1JUX1dJTkRPVzsKLSAgIGlmICggdGVtcCAhPSAwICkgewotICAgICAgc2JJbmZvRGVzdCA9ICZ0bnNEYXRhRGVzdC0+ZGF0YVJhdy50bnNMb25nLnN1YkJsb2NrSW5mbzsKLSAgICAgIHNiSW5mb1NyYyAgPSAmdG5zRGF0YVNyYy0+ZGF0YVJhdy50bnNMb25nLnN1YkJsb2NrSW5mbzsKLSAgIH0KLSAgIGVsc2UgewotICAgICAgc2JJbmZvRGVzdCA9ICZ0bnNEYXRhRGVzdC0+ZGF0YVJhdy50bnNTaG9ydC5zdWJCbG9ja0luZm9bc3ViQmxvY2tOdW1iZXJdOwotICAgICAgc2JJbmZvU3JjICA9ICZ0bnNEYXRhU3JjLT5kYXRhUmF3LnRuc1Nob3J0LnN1YkJsb2NrSW5mb1tzdWJCbG9ja051bWJlcl07Ci0gICB9Ci0KLSAgIGlmICgxMDAqYWJzX3Moc2JJbmZvRGVzdC0+cHJlZGljdGlvbkdhaW4gLSBzYkluZm9TcmMtPnByZWRpY3Rpb25HYWluKSA8Ci0gICAgICAgKDMgKiBzYkluZm9EZXN0LT5wcmVkaWN0aW9uR2FpbikpIHsKLSAgICAgIHNiSW5mb0Rlc3QtPnRuc0FjdGl2ZSA9IHNiSW5mb1NyYy0+dG5zQWN0aXZlOwotICAgICAgZm9yICggaT0wOyBpPCB0Qy5tYXhPcmRlcjsgaSsrKSB7Ci0gICAgICAgIHNiSW5mb0Rlc3QtPnBhcmNvcltpXSA9IHNiSW5mb1NyYy0+cGFyY29yW2ldOwotICAgICAgfQotICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogVG5zRW5jb2RlCi0qIGRlc2NyaXB0aW9uOiBkbyBUTlMgZmlsdGVyaW5nCi0qIHJldHVybnM6ICAgICAwIGlmIHN1Y2Nlc3MKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotV29yZDE2IFRuc0VuY29kZShUTlNfSU5GTyogdG5zSW5mbywgICAgIC8qITwgdG5zIGluZm8gc3RydWN0dXJlIChtb2RpZmllZCkgKi8KLSAgICAgICAgICAgICAgICAgVE5TX0RBVEEqIHRuc0RhdGEsICAgICAvKiE8IHRucyBkYXRhIHN0cnVjdHVyZSAobW9kaWZpZWQpICovCi0gICAgICAgICAgICAgICAgIFdvcmQxNiBudW1PZlNmYiwgICAgICAgLyohPCBudW1iZXIgb2Ygc2NhbGUgZmFjdG9yIGJhbmRzICovCi0gICAgICAgICAgICAgICAgIFROU19DT05GSUcgdEMsICAgICAgICAgLyohPCB0bnMgY29uZmlnIHN0cnVjdHVyZSAqLwotICAgICAgICAgICAgICAgICBXb3JkMTYgbG93UGFzc0xpbmUsICAgIC8qITwgbG93cGFzcyBsaW5lICovCi0gICAgICAgICAgICAgICAgIFdvcmQzMiogc3BlY3RydW0sICAgICAgLyohPCBzcGVjdHJhbCBkYXRhIChtb2RpZmllZCkgKi8KLSAgICAgICAgICAgICAgICAgV29yZDE2IHN1YkJsb2NrTnVtYmVyLCAvKiE8IHN1YmJsb2NrIG51bSAqLwotICAgICAgICAgICAgICAgICBXb3JkMTYgYmxvY2tUeXBlKSAgICAgIC8qITwgYmxvY2t0eXBlIChsb25nIG9yIHNob3J0KSAqLwotewotICBXb3JkMzIgaTsKLSAgV29yZDMyIHRlbXBfczsKLSAgV29yZDMyIHRlbXA7Ci0gIFROU19TVUJCTE9DS19JTkZPICpwc3ViQmxvY2tJbmZvOwotCi0gIHRlbXBfcyA9IGJsb2NrVHlwZSAtIFNIT1JUX1dJTkRPVzsKLSAgaWYgKCB0ZW1wX3MgIT0gMCkgewotICAgIHBzdWJCbG9ja0luZm8gPSAmdG5zRGF0YS0+ZGF0YVJhdy50bnNMb25nLnN1YkJsb2NrSW5mbzsKLQlpZiAocHN1YkJsb2NrSW5mby0+dG5zQWN0aXZlID09IDApIHsKLSAgICAgIHRuc0luZm8tPnRuc0FjdGl2ZVtzdWJCbG9ja051bWJlcl0gPSAwOwotICAgICAgcmV0dXJuKDApOwotICAgIH0KLSAgICBlbHNlIHsKLQotICAgICAgUGFyY29yMkluZGV4KHBzdWJCbG9ja0luZm8tPnBhcmNvciwKLSAgICAgICAgICAgICAgICAgICB0bnNJbmZvLT5jb2VmLAotICAgICAgICAgICAgICAgICAgIHRDLm1heE9yZGVyLAotICAgICAgICAgICAgICAgICAgIHRDLmNvZWZSZXMpOwotCi0gICAgICBJbmRleDJQYXJjb3IodG5zSW5mby0+Y29lZiwKLSAgICAgICAgICAgICAgICAgICBwc3ViQmxvY2tJbmZvLT5wYXJjb3IsCi0gICAgICAgICAgICAgICAgICAgdEMubWF4T3JkZXIsCi0gICAgICAgICAgICAgICAgICAgdEMuY29lZlJlcyk7Ci0KLSAgICAgIGZvciAoaT10Qy5tYXhPcmRlciAtIDE7IGk+PTA7IGktLSkgIHsKLSAgICAgICAgdGVtcCA9IHBzdWJCbG9ja0luZm8tPnBhcmNvcltpXSAtIFROU19QQVJDT1JfVEhSRVNIOwotICAgICAgICBpZiAoIHRlbXAgPiAwICkKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgdGVtcCA9IHBzdWJCbG9ja0luZm8tPnBhcmNvcltpXSArIFROU19QQVJDT1JfVEhSRVNIOwotICAgICAgICBpZiAoIHRlbXAgPCAwICkKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIHRuc0luZm8tPm9yZGVyW3N1YkJsb2NrTnVtYmVyXSA9IGkgKyAxOwotCi0KLSAgICAgIHRuc0luZm8tPnRuc0FjdGl2ZVtzdWJCbG9ja051bWJlcl0gPSAxOwotICAgICAgZm9yIChpPXN1YkJsb2NrTnVtYmVyKzE7IGk8VFJBTlNfRkFDOyBpKyspIHsKLSAgICAgICAgdG5zSW5mby0+dG5zQWN0aXZlW2ldID0gMDsKLSAgICAgIH0KLSAgICAgIHRuc0luZm8tPmNvZWZSZXNbc3ViQmxvY2tOdW1iZXJdID0gdEMuY29lZlJlczsKLSAgICAgIHRuc0luZm8tPmxlbmd0aFtzdWJCbG9ja051bWJlcl0gPSBudW1PZlNmYiAtIHRDLnRuc1N0YXJ0QmFuZDsKLQotCi0gICAgICBBbmFseXNpc0ZpbHRlckxhdHRpY2UoJihzcGVjdHJ1bVt0Qy50bnNTdGFydExpbmVdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWluKHRDLnRuc1N0b3BMaW5lLGxvd1Bhc3NMaW5lKSAtIHRDLnRuc1N0YXJ0TGluZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN1YkJsb2NrSW5mby0+cGFyY29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuc0luZm8tPm9yZGVyW3N1YkJsb2NrTnVtYmVyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHNwZWN0cnVtW3RDLnRuc1N0YXJ0TGluZV0pKTsKLQotICAgIH0KLSAgfSAgICAgLyogaWYgKGJsb2NrVHlwZSE9U0hPUlRfV0lORE9XKSAqLwotICBlbHNlIC8qc2hvcnQgYmxvY2sqLyB7Ci0gICAgcHN1YkJsb2NrSW5mbyA9ICZ0bnNEYXRhLT5kYXRhUmF3LnRuc1Nob3J0LnN1YkJsb2NrSW5mb1tzdWJCbG9ja051bWJlcl07Ci0JaWYgKHBzdWJCbG9ja0luZm8tPnRuc0FjdGl2ZSA9PSAwKSB7Ci0gICAgICB0bnNJbmZvLT50bnNBY3RpdmVbc3ViQmxvY2tOdW1iZXJdID0gMDsKLSAgICAgIHJldHVybigwKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0KLSAgICAgIFBhcmNvcjJJbmRleChwc3ViQmxvY2tJbmZvLT5wYXJjb3IsCi0gICAgICAgICAgICAgICAgICAgJnRuc0luZm8tPmNvZWZbc3ViQmxvY2tOdW1iZXIqVE5TX01BWF9PUkRFUl9TSE9SVF0sCi0gICAgICAgICAgICAgICAgICAgdEMubWF4T3JkZXIsCi0gICAgICAgICAgICAgICAgICAgdEMuY29lZlJlcyk7Ci0KLSAgICAgIEluZGV4MlBhcmNvcigmdG5zSW5mby0+Y29lZltzdWJCbG9ja051bWJlcipUTlNfTUFYX09SREVSX1NIT1JUXSwKLSAgICAgICAgICAgICAgICAgICBwc3ViQmxvY2tJbmZvLT5wYXJjb3IsCi0gICAgICAgICAgICAgICAgICAgdEMubWF4T3JkZXIsCi0gICAgICAgICAgICAgICAgICAgdEMuY29lZlJlcyk7Ci0gICAgICBmb3IgKGk9KHRDLm1heE9yZGVyIC0gMSk7IGk+PTA7IGktLSkgIHsKLSAgICAgICAgdGVtcCA9IHBzdWJCbG9ja0luZm8tPnBhcmNvcltpXSAtIFROU19QQVJDT1JfVEhSRVNIOwotICAgICAgICAgaWYgKCB0ZW1wID4gMCApCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgdGVtcCA9IHBzdWJCbG9ja0luZm8tPnBhcmNvcltpXSArIFROU19QQVJDT1JfVEhSRVNIOwotICAgICAgICBpZiAoIHRlbXAgPCAwICkKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIHRuc0luZm8tPm9yZGVyW3N1YkJsb2NrTnVtYmVyXSA9IGkgKyAxOwotCi0gICAgICB0bnNJbmZvLT50bnNBY3RpdmVbc3ViQmxvY2tOdW1iZXJdID0gMTsKLSAgICAgIHRuc0luZm8tPmNvZWZSZXNbc3ViQmxvY2tOdW1iZXJdID0gdEMuY29lZlJlczsKLSAgICAgIHRuc0luZm8tPmxlbmd0aFtzdWJCbG9ja051bWJlcl0gPSBudW1PZlNmYiAtIHRDLnRuc1N0YXJ0QmFuZDsKLQotCi0gICAgICBBbmFseXNpc0ZpbHRlckxhdHRpY2UoJihzcGVjdHJ1bVt0Qy50bnNTdGFydExpbmVdKSwgKHRDLnRuc1N0b3BMaW5lIC0gdEMudG5zU3RhcnRMaW5lKSwKLSAgICAgICAgICAgICAgICAgcHN1YkJsb2NrSW5mby0+cGFyY29yLAotICAgICAgICAgICAgICAgICB0bnNJbmZvLT5vcmRlcltzdWJCbG9ja051bWJlcl0sCi0gICAgICAgICAgICAgICAgICYoc3BlY3RydW1bdEMudG5zU3RhcnRMaW5lXSkpOwotCi0gICAgfQotICB9Ci0KLSAgcmV0dXJuKDApOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBDYWxjV2VpZ2h0ZWRTcGVjdHJ1bQotKiBkZXNjcmlwdGlvbjogQ2FsY3VsYXRlIHdlaWdodGVkIHNwZWN0cnVtIGZvciBMUEMgY2FsY3VsYXRpb24KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgQ2FsY1dlaWdodGVkU3BlY3RydW0oY29uc3QgV29yZDMyICBzcGVjdHJ1bVtdLCAgICAgICAgIC8qITwgaW5wdXQgc3BlY3RydW0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgd2VpZ2h0ZWRTcGVjdHJ1bVtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICpzZmJFbmVyZ3ksICAgICAgICAgIC8qITwgc2ZiIGVuZXJnaWVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgKnNmYk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgbHBjU3RhcnRMaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICBscGNTdG9wTGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgbHBjU3RhcnRCYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICBscGNTdG9wQmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqcFdvcmszMikKLXsKLSAgICAjZGVmaW5lIElOVF9CSVRTX1NDQUwgMTw8KElOVF9CSVRTLzIpCi0KLSAgICBXb3JkMzIgaSwgc2ZiLCBzaGlmdDsKLSAgICBXb3JkMzIgbWF4U2hpZnQ7Ci0gICAgV29yZDMyIHRtcF9zLCB0bXAyX3M7Ci0gICAgV29yZDMyIHRtcCwgdG1wMjsKLSAgICBXb3JkMzIgbWF4V1M7Ci0gICAgV29yZDMyIHRuc1NmYk1lYW5bTUFYX1NGQl07ICAgIC8qIGxlbmd0aCBbbHBjU3RvcEJhbmQtbHBjU3RhcnRCYW5kXSBzaG91bGQgYmUgc3VmZmljaWVudCBoZXJlICovCi0KLSAgICBtYXhXUyA9IDA7Ci0KLSAgICAvKiBjYWxjIDEuMCoyXi1JTlRfQklUUy8yL3NxcnQoZW4pICovCi0gICAgZm9yKCBzZmIgPSBscGNTdGFydEJhbmQ7IHNmYiA8IGxwY1N0b3BCYW5kOyBzZmIrKykgewotCi0gICAgICB0bXAyID0gc2ZiRW5lcmd5W3NmYl0gLSAyOwotICAgICAgaWYoIHRtcDIgPiAwKSB7Ci0gICAgICAgIHRtcCA9IHJzcXJ0KHNmYkVuZXJneVtzZmJdLCBJTlRfQklUUyk7Ci0JCWlmKHRtcCA+IElOVF9CSVRTX1NDQUwpCi0JCXsKLQkJCXNoaWZ0ID0gIG5vcm1fbCh0bXApOwotCQkJdG1wID0gRGl2XzMyKCBJTlRfQklUU19TQ0FMIDw8IHNoaWZ0LCB0bXAgPDwgc2hpZnQgKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXRtcCA9IDB4N2ZmZmZmZmY7Ci0JCX0KLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICB0bXAgPSAweDdmZmZmZmZmOwotICAgICAgfQotICAgICAgdG5zU2ZiTWVhbltzZmJdID0gdG1wOwotICAgIH0KLQotICAgIC8qIHNwcmVhZCBub3JtYWxpemVkIHZhbHVlcyBmcm9tIHNmYnMgdG8gbGluZXMgKi8KLSAgICBzZmIgPSBscGNTdGFydEJhbmQ7Ci0gICAgdG1wID0gdG5zU2ZiTWVhbltzZmJdOwotICAgIGZvciAoIGk9bHBjU3RhcnRMaW5lOyBpPGxwY1N0b3BMaW5lOyBpKyspewotICAgICAgdG1wX3MgPSBzZmJPZmZzZXRbc2ZiICsgMV0gLSBpOwotICAgICAgaWYgKCB0bXBfcyA9PSAwICkgewotICAgICAgICBzZmIgPSBzZmIgKyAxOwotICAgICAgICB0bXAyX3MgPSBzZmIgKyAxIC0gbHBjU3RvcEJhbmQ7Ci0gICAgICAgIGlmICh0bXAyX3MgPD0gMCkgewotICAgICAgICAgIHRtcCA9IHRuc1NmYk1lYW5bc2ZiXTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcFdvcmszMltpXSA9IHRtcDsKLSAgICB9Ci0gICAgLypmaWx0ZXIgZG93biovCi0gICAgZm9yIChpPShscGNTdG9wTGluZSAtIDIpOyBpPj1scGNTdGFydExpbmU7IGktLSl7Ci0gICAgICAgIHBXb3JrMzJbaV0gPSAocFdvcmszMltpXSArIHBXb3JrMzJbaSArIDFdKSA+PiAxOwotICAgIH0KLSAgICAvKiBmaWx0ZXIgdXAgKi8KLSAgICBmb3IgKGk9KGxwY1N0YXJ0TGluZSArIDEpOyBpPGxwY1N0b3BMaW5lOyBpKyspewotICAgICAgIHBXb3JrMzJbaV0gPSAocFdvcmszMltpXSArIHBXb3JrMzJbaSAtIDFdKSA+PiAxOwotICAgIH0KLQotICAgIC8qIHdlaWdodCBhbmQgbm9ybWFsaXplICovCi0gICAgZm9yIChpPWxwY1N0YXJ0TGluZTsgaTxscGNTdG9wTGluZTsgaSsrKXsKLSAgICAgIHBXb3JrMzJbaV0gPSBNVUxISUdIKHBXb3JrMzJbaV0sIHNwZWN0cnVtW2ldKTsKLSAgICAgIG1heFdTIHw9IExfYWJzKHBXb3JrMzJbaV0pOwotICAgIH0KLSAgICBtYXhTaGlmdCA9IG5vcm1fbChtYXhXUyk7Ci0KLQltYXhTaGlmdCA9IDE2IC0gbWF4U2hpZnQ7Ci0gICAgaWYobWF4U2hpZnQgPj0gMCkKLQl7Ci0JCWZvciAoaT1scGNTdGFydExpbmU7IGk8bHBjU3RvcExpbmU7IGkrKyl7Ci0JCQl3ZWlnaHRlZFNwZWN0cnVtW2ldID0gcFdvcmszMltpXSA+PiBtYXhTaGlmdDsKLQkJfQotICAgIH0KLQllbHNlCi0JewotCQltYXhTaGlmdCA9IC1tYXhTaGlmdDsKLQkJZm9yIChpPWxwY1N0YXJ0TGluZTsgaTxscGNTdG9wTGluZTsgaSsrKXsKLQkJCXdlaWdodGVkU3BlY3RydW1baV0gPSBzYXR1cmF0ZShwV29yazMyW2ldIDw8IG1heFNoaWZ0KTsKLQkJfQotCX0KLX0KLQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IENhbGNUbnNGaWx0ZXIKLSogZGVzY3JpcHRpb246ICBMUEMgY2FsY3VsYXRpb24gZm9yIG9uZSBUTlMgZmlsdGVyCi0qIHJldHVybnM6ICAgICAgcHJlZGljdGlvbiBnYWluCi0qIGlucHV0OiAgICAgICAgc2lnbmFsIHNwZWN0cnVtLCBhY2Ygd2luZG93LCBuby4gb2Ygc3BlY3RyYWwgbGluZXMsCi0qICAgICAgICAgICAgICAgIG1heC4gVE5TIG9yZGVyLCBwdHIuIHRvIHJlZmxlY3Rpb24gb2NlZmZpY2llbnRzCi0qIG91dHB1dDogICAgICAgcmVmbGVjdGlvbiBjb2VmZmljaWVudHMKLSooaGFsZikgd2luZG93IHNpemUgbXVzdCBiZSBsYXJnZXIgdGhhbiB0bnNPcmRlciAhISoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIFdvcmQxNiBDYWxjVG5zRmlsdGVyKGNvbnN0IFdvcmQxNiAqc2lnbmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQzMiB3aW5kb3dbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbnVtT2ZMaW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgdG5zT3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyIHBhcmNvcltdKQotewotICBXb3JkMzIgcGFyY29yV29ya0J1ZmZlclsyKlROU19NQVhfT1JERVIrMV07Ci0gIFdvcmQzMiBwcmVkaWN0aW9uR2FpbjsKLSAgV29yZDMyIGk7Ci0gIFdvcmQzMiB0bnNPcmRlclBsdXMxID0gdG5zT3JkZXIgKyAxOwotCi0gIFVOVVNFRCh3aW5kb3cpOwotCi0gIGFzc2VydCh0bnNPcmRlciA8PSBUTlNfTUFYX09SREVSKTsgICAgICAvKiByZW1vdmUgYXNzZXJ0cyBsYXRlcj8gKGJ0ZykgKi8KLQotICBmb3IoaT0wO2k8dG5zT3JkZXI7aSsrKSB7Ci0gICAgcGFyY29yW2ldID0gMDsKLSAgfQotCi0gIEF1dG9Db3JyZWxhdGlvbihzaWduYWwsIHBhcmNvcldvcmtCdWZmZXIsIG51bU9mTGluZXMsIHRuc09yZGVyUGx1czEpOwotCi0gIC8qIGVhcmx5IHJldHVybiBpZiBzaWduYWwgaXMgdmVyeSBsb3c6IHNpZ25hbCBwcmVkaWN0aW9uIG9mZiwgd2l0aCB6ZXJvIHBhcmNvciBjb2VmZnMgKi8KLSAgaWYgKHBhcmNvcldvcmtCdWZmZXJbMF0gPT0gMCkKLSAgICByZXR1cm4gMDsKLQotICBwcmVkaWN0aW9uR2FpbiA9IEF1dG9Ub1BhcmNvcihwYXJjb3JXb3JrQnVmZmVyLCBwYXJjb3IsIHRuc09yZGVyKTsKLQotICByZXR1cm4ocHJlZGljdGlvbkdhaW4pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogQXV0b0NvcnJlbGF0aW9uCi0qIGRlc2NyaXB0aW9uOiAgY2FsYy4gYXV0b2NvcnJlbGF0aW9uIChhY2YpCi0qIHJldHVybnM6ICAgICAgLQotKiBpbnB1dDogICAgICAgIGlucHV0IHZhbHVlcywgbm8uIG9mIGlucHV0IHZhbHVlcywgbm8uIG9mIGFjZiB2YWx1ZXMKLSogb3V0cHV0OiAgICAgICBhY2YgdmFsdWVzCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgQVJNVjVFCi12b2lkIEF1dG9Db3JyZWxhdGlvbihjb25zdCBXb3JkMTYJCSBpbnB1dFtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICBjb3JyW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgIHNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgIGNvcnJDb2VmZikgewotICBXb3JkMzIgaSwgaiwgaXNhbXBsZXM7Ci0gIFdvcmQzMiBhY2N1OwotICBXb3JkMzIgc2NmOwotCi0gIHNjZiA9IDEwIC0gMTsKLQotICBpc2FtcGxlcyA9IHNhbXBsZXM7Ci0gIC8qIGNhbGMgZmlyc3QgY29yckNvZWY6ICBSWzBdID0gc3VtIHsgdFtpXSAqIHRbaV0gfSA7IGkgPSAwLi5OLTEgKi8KLSAgYWNjdSA9IDA7Ci0gIGZvcihqPTA7IGo8aXNhbXBsZXM7IGorKykgewotICAgIGFjY3UgPSBMX2FkZChhY2N1LCAoKGlucHV0W2pdICogaW5wdXRbal0pID4+IHNjZikpOwotICB9Ci0gIGNvcnJbMF0gPSBhY2N1OwotCi0gIC8qIGVhcmx5IHRlcm1pbmF0aW9uIGlmIGFsbCBjb3JyIGNvZWZmcyBhcmUgbGlrZWx5IGdvaW5nIHRvIGJlIHplcm8gKi8KLSAgaWYoY29yclswXSA9PSAwKSByZXR1cm4gOwotCi0gIC8qIGNhbGMgYWxsIG90aGVyIGNvcnJDb2VmOiAgUltqXSA9IHN1bSB7IHRbaV0gKiB0W2kral0gfSA7IGkgPSAwLi4oTi1qLTEpLCBqPTEuLnAgKi8KLSAgZm9yKGk9MTsgaTxjb3JyQ29lZmY7IGkrKykgewotICAgIGlzYW1wbGVzID0gaXNhbXBsZXMgLSAxOwotICAgIGFjY3UgPSAwOwotICAgIGZvcihqPTA7IGo8aXNhbXBsZXM7IGorKykgewotICAgICAgYWNjdSA9IExfYWRkKGFjY3UsICgoaW5wdXRbal0gKiBpbnB1dFtqK2ldKSA+PiBzY2YpKTsKLSAgICB9Ci0gICAgY29ycltpXSA9IGFjY3U7Ci0gIH0KLX0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogQXV0b1RvUGFyY29yCi0qIGRlc2NyaXB0aW9uOiAgY29udmVyc2lvbiBhdXRvY29ycmVsYXRpb24gdG8gcmVmbGVjdGlvbiBjb2VmZmljaWVudHMKLSogcmV0dXJuczogICAgICBwcmVkaWN0aW9uIGdhaW4KLSogaW5wdXQ6ICAgICAgICA8b3JkZXIrMT4gaW5wdXQgdmFsdWVzLCBuby4gb2Ygb3V0cHV0IHZhbHVlcyAoPW9yZGVyKSwKLSogICAgICAgICAgICAgICBwdHIuIHRvIHdvcmtidWZmZXIgKHJlcXVpcmVkIHNpemU6IDIqb3JkZXIpCi0qIG91dHB1dDogICAgICAgPG9yZGVyPiByZWZsZWN0aW9uIGNvZWZmaWNpZW50cwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgV29yZDE2IEF1dG9Ub1BhcmNvcihXb3JkMzIgd29ya0J1ZmZlcltdLCBXb3JkMzIgcmVmbENvZWZmW10sIFdvcmQxNiBudW1PZkNvZWZmKSB7Ci0KLSAgV29yZDMyIGksIGosIHNoaWZ0OwotICBXb3JkMzIgKnBXb3JrQnVmZmVyOyAvKiB0ZW1wIHBvaW50ZXIgKi8KLSAgV29yZDMyIHByZWRpY3Rpb25HYWluID0gMDsKLSAgV29yZDMyIG51bSwgZGVub207Ci0gIFdvcmQzMiB0ZW1wLCB3b3JrQnVmZmVyMDsKLQotCi0gIG51bSA9IHdvcmtCdWZmZXJbMF07Ci0gIHRlbXAgPSB3b3JrQnVmZmVyW251bU9mQ29lZmZdOwotCi0gIGZvcihpPTA7IGk8bnVtT2ZDb2VmZi0xOyBpKyspIHsKLSAgICB3b3JrQnVmZmVyW2kgKyBudW1PZkNvZWZmXSA9IHdvcmtCdWZmZXJbaSArIDFdOwotICB9Ci0gIHdvcmtCdWZmZXJbaSArIG51bU9mQ29lZmZdID0gdGVtcDsKLQotICBmb3IoaT0wOyBpPG51bU9mQ29lZmY7IGkrKykgewotICAgIFdvcmQzMiByZWZjOwotCi0KLSAgICBpZiAod29ya0J1ZmZlclswXSA8IExfYWJzKHdvcmtCdWZmZXJbaSArIG51bU9mQ29lZmZdKSkgewotICAgICAgcmV0dXJuIDAgOwotICAgIH0KLQlzaGlmdCA9IG5vcm1fbCh3b3JrQnVmZmVyWzBdKTsKLQl3b3JrQnVmZmVyMCA9IERpdl8zMigxIDw8IHNoaWZ0LCB3b3JrQnVmZmVyWzBdIDw8IHNoaWZ0KTsKLSAgICAvKiBjYWxjdWxhdGUgcmVmYyA9IC13b3JrQnVmZmVyW251bU9mQ29lZmYraV0gLyB3b3JrQnVmZmVyWzBdOyAtMSA8PSByZWZjIDwgMSAqLwotCXJlZmMgPSBMX25lZ2F0ZShmaXhtdWwod29ya0J1ZmZlcltudW1PZkNvZWZmICsgaV0sIHdvcmtCdWZmZXIwKSk7Ci0KLSAgICByZWZsQ29lZmZbaV0gPSByZWZjOwotCi0gICAgcFdvcmtCdWZmZXIgPSAmKHdvcmtCdWZmZXJbbnVtT2ZDb2VmZl0pOwotCi0gICAgZm9yKGo9aTsgajxudW1PZkNvZWZmOyBqKyspIHsKLSAgICAgIFdvcmQzMiBhY2N1MSwgYWNjdTI7Ci0gICAgICBhY2N1MSA9IExfYWRkKHBXb3JrQnVmZmVyW2pdLCBmaXhtdWwocmVmYywgd29ya0J1ZmZlcltqIC0gaV0pKTsKLSAgICAgIGFjY3UyID0gTF9hZGQod29ya0J1ZmZlcltqIC0gaV0sIGZpeG11bChyZWZjLCBwV29ya0J1ZmZlcltqXSkpOwotICAgICAgcFdvcmtCdWZmZXJbal0gPSBhY2N1MTsKLSAgICAgIHdvcmtCdWZmZXJbaiAtIGldID0gYWNjdTI7Ci0gICAgfQotICB9Ci0KLSAgZGVub20gPSBNVUxISUdIKHdvcmtCdWZmZXJbMF0sIE5PUk1fQ09FRik7Ci0KLSAgaWYgKGRlbm9tICE9IDApIHsKLSAgICBXb3JkMzIgdGVtcDsKLQlzaGlmdCA9IG5vcm1fbChkZW5vbSk7Ci0JdGVtcCA9IERpdl8zMigxIDw8IHNoaWZ0LCBkZW5vbSA8PCBzaGlmdCk7Ci0gICAgcHJlZGljdGlvbkdhaW4gPSBmaXhtdWwobnVtLCB0ZW1wKTsKLSAgfQotCi0gIHJldHVybiBleHRyYWN0X2wocHJlZGljdGlvbkdhaW4pOwotfQotCi0KLQotc3RhdGljIFdvcmQxNiBTZWFyY2gzKFdvcmQzMiBwYXJjb3IpCi17Ci0gIFdvcmQzMiBpbmRleCA9IDA7Ci0gIFdvcmQzMiBpOwotICBXb3JkMzIgdGVtcDsKLQotICBmb3IgKGk9MDtpPDg7aSsrKSB7Ci0gICAgdGVtcCA9IExfc3ViKCBwYXJjb3IsIHRuc0NvZWZmM0JvcmRlcnNbaV0pOwotICAgIGlmICh0ZW1wID4gMCkKLSAgICAgIGluZGV4PWk7Ci0gIH0KLSAgcmV0dXJuIGV4dHJhY3RfbChpbmRleCAtIDQpOwotfQotCi1zdGF0aWMgV29yZDE2IFNlYXJjaDQoV29yZDMyIHBhcmNvcikKLXsKLSAgV29yZDMyIGluZGV4ID0gMDsKLSAgV29yZDMyIGk7Ci0gIFdvcmQzMiB0ZW1wOwotCi0KLSAgZm9yIChpPTA7aTwxNjtpKyspIHsKLSAgICB0ZW1wID0gTF9zdWIocGFyY29yLCB0bnNDb2VmZjRCb3JkZXJzW2ldKTsKLSAgICBpZiAodGVtcCA+IDApCi0gICAgICBpbmRleD1pOwotICB9Ci0gIHJldHVybiBleHRyYWN0X2woaW5kZXggLSA4KTsKLX0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbm5hbWU6IFBhcmNvcjJJbmRleAotKiBkZXNjcmlwdGlvbjogIHF1YW50aXphdGlvbiBpbmRleCBmb3IgcmVmbGVjdGlvbiBjb2VmZmljaWVudHMKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgUGFyY29yMkluZGV4KGNvbnN0IFdvcmQzMiBwYXJjb3JbXSwgICAvKiE8IHBhcmNvciBjb2VmZmljaWVudHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgaW5kZXhbXSwgICAgICAgICAgLyohPCBxdWFudGl6ZWQgY29lZmYgaW5kaWNlcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBvcmRlciwgICAgICAgICAgICAvKiE8IGZpbHRlciBvcmRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBiaXRzUGVyQ29lZmYpIHsgICAvKiE8IHF1YW50aXplciByZXNvbHV0aW9uICovCi0gIFdvcmQzMiBpOwotICBXb3JkMzIgdGVtcDsKLQotICBmb3IoaT0wOyBpPG9yZGVyOyBpKyspIHsKLSAgICB0ZW1wID0gYml0c1BlckNvZWZmIC0gMzsKLSAgICBpZiAodGVtcCA9PSAwKSB7Ci0gICAgICBpbmRleFtpXSA9IFNlYXJjaDMocGFyY29yW2ldKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBpbmRleFtpXSA9IFNlYXJjaDQocGFyY29yW2ldKTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9ubmFtZTogSW5kZXgyUGFyY29yCi0qIGRlc2NyaXB0aW9uOiAgSW52ZXJzZSBxdWFudGl6YXRpb24gZm9yIHJlZmxlY3Rpb24gY29lZmZpY2llbnRzCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIEluZGV4MlBhcmNvcihjb25zdCBXb3JkMTYgaW5kZXhbXSwgIC8qITwgcXVhbnRpemVkIHZhbHVlcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiBwYXJjb3JbXSwgICAgICAgLyohPCBwdHIuIHRvIHJlZmxlY3Rpb24gY29lZmZpY2llbnRzIChvdXRwdXQpICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IG9yZGVyLCAgICAgICAgICAvKiE8IG5vLiBvZiBjb2VmZmljaWVudHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgYml0c1BlckNvZWZmKSAgIC8qITwgcXVhbnRpemVyIHJlc29sdXRpb24gKi8KLXsKLSAgV29yZDMyIGk7Ci0gIFdvcmQzMiB0ZW1wOwotCi0gIGZvciAoaT0wOyBpPG9yZGVyOyBpKyspIHsKLSAgICB0ZW1wID0gYml0c1BlckNvZWZmIC0gNDsKLSAgICBpZiAoIHRlbXAgPT0gMCApIHsKLSAgICAgICAgcGFyY29yW2ldID0gdG5zQ29lZmY0W2luZGV4W2ldICsgOF07Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBwYXJjb3JbaV0gPSB0bnNDb2VmZjNbaW5kZXhbaV0gKyA0XTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9ubmFtZTogRklSTGF0dGljZQotKiBkZXNjcmlwdGlvbjogIGluIHBsYWNlIGxhdHRpY2UgZmlsdGVyaW5nIG9mIHNwZWN0cmFsIGRhdGEKLSogcmV0dXJuczoJCXBvaW50ZXIgdG8gbW9kaWZpZWQgZGF0YQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgV29yZDMyIEZJUkxhdHRpY2UoV29yZDE2IG9yZGVyLCAgICAgICAgICAgLyohPCBmaWx0ZXIgb3JkZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgeCwgICAgICAgICAgICAgICAvKiE8IHNwZWN0cmFsIGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgKnN0YXRlX3BhciwgICAgICAvKiE8IGZpbHRlciBzdGF0ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMzIgKmNvZWZfcGFyKSAvKiE8IGZpbHRlciBjb2VmZmljaWVudHMgKi8KLXsKLSAgIFdvcmQzMiBpOwotICAgV29yZDMyIGFjY3UsdG1wLHRtcFNhdmU7Ci0KLSAgIHggPSB4ID4+IDE7Ci0gICB0bXBTYXZlID0geDsKLQotICAgZm9yIChpPTA7IGk8KG9yZGVyIC0gMSk7IGkrKykgewotCi0gICAgIHRtcCA9IExfYWRkKGZpeG11bChjb2VmX3BhcltpXSwgeCksIHN0YXRlX3BhcltpXSk7Ci0gICAgIHggICA9IExfYWRkKGZpeG11bChjb2VmX3BhcltpXSwgc3RhdGVfcGFyW2ldKSwgeCk7Ci0KLSAgICAgc3RhdGVfcGFyW2ldID0gdG1wU2F2ZTsKLSAgICAgdG1wU2F2ZSA9IHRtcDsKLSAgfQotCi0gIC8qIGxhc3Qgc3RhZ2U6IG9ubHkgbmVlZCBoYWxmIG9wZXJhdGlvbnMgKi8KLSAgYWNjdSA9IGZpeG11bChzdGF0ZV9wYXJbb3JkZXIgLSAxXSwgY29lZl9wYXJbKG9yZGVyIC0gMSldKTsKLSAgc3RhdGVfcGFyWyhvcmRlciAtIDEpXSA9IHRtcFNhdmU7Ci0KLSAgeCA9IExfYWRkKGFjY3UsIHgpOwotICB4ID0gTF9hZGQoeCwgeCk7Ci0KLSAgcmV0dXJuIHg7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbm5hbWU6IEFuYWx5c2lzRmlsdGVyTGF0dGljZQotKiBkZXNjcmlwdGlvbjogIGZpbHRlcnMgc3BlY3RyYWwgbGluZXMgd2l0aCBUTlMgZmlsdGVyCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIEFuYWx5c2lzRmlsdGVyTGF0dGljZShjb25zdCAgV29yZDMyIHNpZ25hbFtdLCAgLyohPCBpbnB1dCBzcGVjdHJ1bSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBudW1PZkxpbmVzLCAgICAgICAvKiE8IG5vLiBvZiBsaW5lcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICBXb3JkMzIgcGFyQ29lZmZbXSwvKiE8IFBBUkMgY29lZmZpY2llbnRzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IG9yZGVyLCAgICAgICAgICAgIC8qITwgZmlsdGVyIG9yZGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyIG91dHB1dFtdKSAgICAgICAgIC8qITwgZmlsdGVyZWQgc2lnbmFsIHZhbHVlcyAqLwotewotCi0gIFdvcmQzMiBzdGF0ZV9wYXJbVE5TX01BWF9PUkRFUl07Ci0gIFdvcmQzMiBqOwotCi0gIGZvciAoIGo9MDsgajxUTlNfTUFYX09SREVSOyBqKysgKSB7Ci0gICAgc3RhdGVfcGFyW2pdID0gMDsKLSAgfQotCi0gIGZvcihqPTA7IGo8bnVtT2ZMaW5lczsgaisrKSB7Ci0gICAgb3V0cHV0W2pdID0gRklSTGF0dGljZShvcmRlcixzaWduYWxbal0sc3RhdGVfcGFyLHBhckNvZWZmKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb25uYW1lOiBBcHBseVRuc011bHRUYWJsZVRvUmF0aW9zCi0qIGRlc2NyaXB0aW9uOiAgQ2hhbmdlIHRocmVzaG9sZHMgYWNjb3JkaW5nIHRvIHRucwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEFwcGx5VG5zTXVsdFRhYmxlVG9SYXRpb3MoV29yZDE2IHN0YXJ0Q2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHN0b3BDYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTlNfU1VCQkxPQ0tfSU5GTyBzdWJJbmZvLCAvKiE8IFROUyBzdWJibG9jayBpbmZvICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICp0aHJlc2hvbGRzKSAgICAgICAgLyohPCB0aHJlc2hvbGRzIChtb2RpZmllZCkgKi8KLXsKLSAgV29yZDMyIGk7Ci0gIGlmIChzdWJJbmZvLnRuc0FjdGl2ZSkgewotICAgIGZvcihpPXN0YXJ0Q2I7IGk8c3RvcENiOyBpKyspIHsKLSAgICAgIC8qIHRocmVzaG9sZHNbaV0gKiAwLjI1ICovCi0gICAgICB0aHJlc2hvbGRzW2ldID0gKHRocmVzaG9sZHNbaV0gPj4gMik7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy90cmFuc2Zvcm0uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3RyYW5zZm9ybS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGUyYjk2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3RyYW5zZm9ybS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjc3ICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJdHJhbnNmb3JtLmMKLQotCUNvbnRlbnQ6CU1EQ1QgVHJhbnNmb3JtIGZ1bmN0aW9uc3MKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImJhc2ljX29wLmgiCi0jaW5jbHVkZSAicHN5X2NvbnN0LmgiCi0jaW5jbHVkZSAidHJhbnNmb3JtLmgiCi0jaW5jbHVkZSAiYWFjX3JvbS5oIgotCi0KLSNkZWZpbmUgTFNfVFJBTlMgKChGUkFNRV9MRU5fTE9ORy1GUkFNRV9MRU5fU0hPUlQpLzIpIC8qIDQ0OCAqLwotI2RlZmluZSBTUVJUMV8yIDB4NWE4Mjc5OWEJLyogc3FydCgxLzIpIGluIFEzMSAqLwotI2RlZmluZSBzd2FwMihwMCxwMSkgXAotCXQgPSBwMDsgdDEgPSAqKCYocDApKzEpOwlcCi0JKHAwKSA9IHAxOyAqKCYocDApKzEpID0gKigmKHAxKSsxKTsJXAotCShwMSkgPSB0OyAqKCYocDEpKzEpID0gdDEKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBTaHVmZmxlCi0qIGRlc2NyaXB0aW9uOiAgU2h1ZmZsZSBwb2ludHMgcHJlcGFyZWQgZnVuY3Rpb24gZm9yIGZmdAotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIFNodWZmbGUoaW50ICpidWYsIGludCBudW0sIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGJpdFRhYikKLXsKLSAgICBpbnQgKnBhcnQwLCAqcGFydDE7Ci0JaW50IGksIGo7Ci0JaW50IHQsIHQxOwotCi0JcGFydDAgPSBidWY7Ci0gICAgcGFydDEgPSBidWYgKyBudW07Ci0KLQl3aGlsZSAoKGkgPSAqYml0VGFiKyspICE9IDApIHsKLSAgICAgICAgaiA9ICpiaXRUYWIrKzsKLQotICAgICAgICBzd2FwMihwYXJ0MFs0KmkrMF0sIHBhcnQwWzQqaiswXSk7Ci0gICAgICAgIHN3YXAyKHBhcnQwWzQqaSsyXSwgcGFydDFbNCpqKzBdKTsKLSAgICAgICAgc3dhcDIocGFydDFbNCppKzBdLCBwYXJ0MFs0KmorMl0pOwotICAgICAgICBzd2FwMihwYXJ0MVs0KmkrMl0sIHBhcnQxWzQqaisyXSk7Ci0gICAgfQotCi0gICAgZG8gewotICAgICAgICBzd2FwMihwYXJ0MFs0KmkrMl0sIHBhcnQxWzQqaSswXSk7Ci0gICAgfSB3aGlsZSAoKGkgPSAqYml0VGFiKyspICE9IDApOwotfQotCi0jaWYgIWRlZmluZWQoQVJNVjVFKSAmJiAhZGVmaW5lZChBUk1WN05lb24pCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBSYWRpeDRGaXJzdAotKiBkZXNjcmlwdGlvbjogIFJhZGl4IDQgcG9pbnQgcHJlcGFyZWQgZnVuY3Rpb24gZm9yIGZmdAotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIFJhZGl4NEZpcnN0KGludCAqYnVmLCBpbnQgbnVtKQotewotICAgIGludCByMCwgcjEsIHIyLCByMzsKLQlpbnQgcjQsIHI1LCByNiwgcjc7Ci0KLQlmb3IgKDsgbnVtICE9IDA7IG51bS0tKQotCXsKLQkJcjAgPSBidWZbMF0gKyBidWZbMl07Ci0JCXIxID0gYnVmWzFdICsgYnVmWzNdOwotCQlyMiA9IGJ1ZlswXSAtIGJ1ZlsyXTsKLQkJcjMgPSBidWZbMV0gLSBidWZbM107Ci0JCXI0ID0gYnVmWzRdICsgYnVmWzZdOwotCQlyNSA9IGJ1Zls1XSArIGJ1Zls3XTsKLQkJcjYgPSBidWZbNF0gLSBidWZbNl07Ci0JCXI3ID0gYnVmWzVdIC0gYnVmWzddOwotCi0JCWJ1ZlswXSA9IHIwICsgcjQ7Ci0JCWJ1ZlsxXSA9IHIxICsgcjU7Ci0JCWJ1Zls0XSA9IHIwIC0gcjQ7Ci0JCWJ1Zls1XSA9IHIxIC0gcjU7Ci0JCWJ1ZlsyXSA9IHIyICsgcjc7Ci0JCWJ1ZlszXSA9IHIzIC0gcjY7Ci0JCWJ1Zls2XSA9IHIyIC0gcjc7Ci0JCWJ1Zls3XSA9IHIzICsgcjY7Ci0KLQkJYnVmICs9IDg7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogUmFkaXg4Rmlyc3QKLSogZGVzY3JpcHRpb246ICBSYWRpeCA4IHBvaW50IHByZXBhcmVkIGZ1bmN0aW9uIGZvciBmZnQKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBSYWRpeDhGaXJzdChpbnQgKmJ1ZiwgaW50IG51bSkKLXsKLSAgIGludCByMCwgcjEsIHIyLCByMzsKLSAgIGludCBpMCwgaTEsIGkyLCBpMzsKLSAgIGludCByNCwgcjUsIHI2LCByNzsKLSAgIGludCBpNCwgaTUsIGk2LCBpNzsKLSAgIGludCB0MCwgdDEsIHQyLCB0MzsKLQotCWZvciAoIDsgbnVtICE9IDA7IG51bS0tKQotCXsKLQkJcjAgPSBidWZbMF0gKyBidWZbMl07Ci0JCWkwID0gYnVmWzFdICsgYnVmWzNdOwotCQlyMSA9IGJ1ZlswXSAtIGJ1ZlsyXTsKLQkJaTEgPSBidWZbMV0gLSBidWZbM107Ci0JCXIyID0gYnVmWzRdICsgYnVmWzZdOwotCQlpMiA9IGJ1Zls1XSArIGJ1Zls3XTsKLQkJcjMgPSBidWZbNF0gLSBidWZbNl07Ci0JCWkzID0gYnVmWzVdIC0gYnVmWzddOwotCi0JCXI0ID0gKHIwICsgcjIpID4+IDE7Ci0JCWk0ID0gKGkwICsgaTIpID4+IDE7Ci0JCXI1ID0gKHIwIC0gcjIpID4+IDE7Ci0JCWk1ID0gKGkwIC0gaTIpID4+IDE7Ci0JCXI2ID0gKHIxIC0gaTMpID4+IDE7Ci0JCWk2ID0gKGkxICsgcjMpID4+IDE7Ci0JCXI3ID0gKHIxICsgaTMpID4+IDE7Ci0JCWk3ID0gKGkxIC0gcjMpID4+IDE7Ci0KLQkJcjAgPSBidWZbIDhdICsgYnVmWzEwXTsKLQkJaTAgPSBidWZbIDldICsgYnVmWzExXTsKLQkJcjEgPSBidWZbIDhdIC0gYnVmWzEwXTsKLQkJaTEgPSBidWZbIDldIC0gYnVmWzExXTsKLQkJcjIgPSBidWZbMTJdICsgYnVmWzE0XTsKLQkJaTIgPSBidWZbMTNdICsgYnVmWzE1XTsKLQkJcjMgPSBidWZbMTJdIC0gYnVmWzE0XTsKLQkJaTMgPSBidWZbMTNdIC0gYnVmWzE1XTsKLQotCQl0MCA9IChyMCArIHIyKSA+PiAxOwotCQl0MSA9IChpMCArIGkyKSA+PiAxOwotCQl0MiA9IChyMCAtIHIyKSA+PiAxOwotCQl0MyA9IChpMCAtIGkyKSA+PiAxOwotCi0JCWJ1ZlsgMF0gPSByNCArIHQwOwotCQlidWZbIDFdID0gaTQgKyB0MTsKLQkJYnVmWyA4XSA9IHI0IC0gdDA7Ci0JCWJ1ZlsgOV0gPSBpNCAtIHQxOwotCQlidWZbIDRdID0gcjUgKyB0MzsKLQkJYnVmWyA1XSA9IGk1IC0gdDI7Ci0JCWJ1ZlsxMl0gPSByNSAtIHQzOwotCQlidWZbMTNdID0gaTUgKyB0MjsKLQotCQlyMCA9IHIxIC0gaTM7Ci0JCWkwID0gaTEgKyByMzsKLQkJcjIgPSByMSArIGkzOwotCQlpMiA9IGkxIC0gcjM7Ci0KLQkJdDAgPSBNVUxISUdIKFNRUlQxXzIsIHIwIC0gaTApOwotCQl0MSA9IE1VTEhJR0goU1FSVDFfMiwgcjAgKyBpMCk7Ci0JCXQyID0gTVVMSElHSChTUVJUMV8yLCByMiAtIGkyKTsKLQkJdDMgPSBNVUxISUdIKFNRUlQxXzIsIHIyICsgaTIpOwotCi0JCWJ1ZlsgNl0gPSByNiAtIHQwOwotCQlidWZbIDddID0gaTYgLSB0MTsKLQkJYnVmWzE0XSA9IHI2ICsgdDA7Ci0JCWJ1ZlsxNV0gPSBpNiArIHQxOwotCQlidWZbIDJdID0gcjcgKyB0MzsKLQkJYnVmWyAzXSA9IGk3IC0gdDI7Ci0JCWJ1ZlsxMF0gPSByNyAtIHQzOwotCQlidWZbMTFdID0gaTcgKyB0MjsKLQotCQlidWYgKz0gMTY7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogUmFkaXg0RkZUCi0qIGRlc2NyaXB0aW9uOiAgUmFkaXggNCBwb2ludCBmZnQgY29yZSBmdW5jdGlvbgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIFJhZGl4NEZGVChpbnQgKmJ1ZiwgaW50IG51bSwgaW50IGJnbiwgaW50ICp0d2lkVGFiKQotewotCWludCByMCwgcjEsIHIyLCByMzsKLQlpbnQgcjQsIHI1LCByNiwgcjc7Ci0JaW50IHQwLCB0MTsKLQlpbnQgc2lueCwgY29zeDsKLQlpbnQgaSwgaiwgc3RlcDsKLQlpbnQgKnhwdHIsICpjc3B0cjsKLQotCWZvciAobnVtID4+PSAyOyBudW0gIT0gMDsgbnVtID4+PSAyKQotCXsKLQkJc3RlcCA9IDIqYmduOwotCQl4cHRyID0gYnVmOwotCi0gICAgCWZvciAoaSA9IG51bTsgaSAhPSAwOyBpLS0pCi0JCXsKLQkJCWNzcHRyID0gdHdpZFRhYjsKLQotCQkJZm9yIChqID0gYmduOyBqICE9IDA7IGotLSkKLQkJCXsKLQkJCQlyMCA9IHhwdHJbMF07Ci0JCQkJcjEgPSB4cHRyWzFdOwotCQkJCXhwdHIgKz0gc3RlcDsKLQotCQkJCXQwID0geHB0clswXTsKLQkJCQl0MSA9IHhwdHJbMV07Ci0JCQkJY29zeCA9IGNzcHRyWzBdOwotCQkJCXNpbnggPSBjc3B0clsxXTsKLQkJCQlyMiA9IE1VTEhJR0goY29zeCwgdDApICsgTVVMSElHSChzaW54LCB0MSk7CQkvKiBjb3MqYnIgKyBzaW4qYmkgKi8KLQkJCQlyMyA9IE1VTEhJR0goY29zeCwgdDEpIC0gTVVMSElHSChzaW54LCB0MCk7CQkvKiBjb3MqYmkgLSBzaW4qYnIgKi8KLQkJCQl4cHRyICs9IHN0ZXA7Ci0KLQkJCQl0MCA9IHIwID4+IDI7Ci0JCQkJdDEgPSByMSA+PiAyOwotCQkJCXIwID0gdDAgLSByMjsKLQkJCQlyMSA9IHQxIC0gcjM7Ci0JCQkJcjIgPSB0MCArIHIyOwotCQkJCXIzID0gdDEgKyByMzsKLQotCQkJCXQwID0geHB0clswXTsKLQkJCQl0MSA9IHhwdHJbMV07Ci0JCQkJY29zeCA9IGNzcHRyWzJdOwotCQkJCXNpbnggPSBjc3B0clszXTsKLQkJCQlyNCA9IE1VTEhJR0goY29zeCwgdDApICsgTVVMSElHSChzaW54LCB0MSk7CQkvKiBjb3MqY3IgKyBzaW4qY2kgKi8KLQkJCQlyNSA9IE1VTEhJR0goY29zeCwgdDEpIC0gTVVMSElHSChzaW54LCB0MCk7CQkvKiBjb3MqY2kgLSBzaW4qY3IgKi8KLQkJCQl4cHRyICs9IHN0ZXA7Ci0KLQkJCQl0MCA9IHhwdHJbMF07Ci0JCQkJdDEgPSB4cHRyWzFdOwotCQkJCWNvc3ggPSBjc3B0cls0XTsKLQkJCQlzaW54ID0gY3NwdHJbNV07Ci0JCQkJcjYgPSBNVUxISUdIKGNvc3gsIHQwKSArIE1VTEhJR0goc2lueCwgdDEpOwkJLyogY29zKmNyICsgc2luKmNpICovCi0JCQkJcjcgPSBNVUxISUdIKGNvc3gsIHQxKSAtIE1VTEhJR0goc2lueCwgdDApOwkJLyogY29zKmNpIC0gc2luKmNyICovCi0JCQkJY3NwdHIgKz0gNjsKLQotCQkJCXQwID0gcjQ7Ci0JCQkJdDEgPSByNTsKLQkJCQlyNCA9IHQwICsgcjY7Ci0JCQkJcjUgPSByNyAtIHQxOwotCQkJCXI2ID0gdDAgLSByNjsKLQkJCQlyNyA9IHI3ICsgdDE7Ci0KLQkJCQl4cHRyWzBdID0gcjAgKyByNTsKLQkJCQl4cHRyWzFdID0gcjEgKyByNjsKLQkJCQl4cHRyIC09IHN0ZXA7Ci0KLQkJCQl4cHRyWzBdID0gcjIgLSByNDsKLQkJCQl4cHRyWzFdID0gcjMgLSByNzsKLQkJCQl4cHRyIC09IHN0ZXA7Ci0KLQkJCQl4cHRyWzBdID0gcjAgLSByNTsKLQkJCQl4cHRyWzFdID0gcjEgLSByNjsKLQkJCQl4cHRyIC09IHN0ZXA7Ci0KLQkJCQl4cHRyWzBdID0gcjIgKyByNDsKLQkJCQl4cHRyWzFdID0gcjMgKyByNzsKLQkJCQl4cHRyICs9IDI7Ci0JCQl9Ci0JCQl4cHRyICs9IDMqc3RlcDsKLQkJfQotCQl0d2lkVGFiICs9IDMqc3RlcDsKLQkJYmduIDw8PSAyOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBQcmVNRENUCi0qIGRlc2NyaXB0aW9uOiAgcHJlcGFyZSBNRENUIHByb2Nlc3MgZm9yIG5leHQgRkZUIGNvbXB1dGUKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBQcmVNRENUKGludCAqYnVmMCwgaW50IG51bSwgY29uc3QgaW50ICpjc3B0cikKLXsKLQlpbnQgaTsKLQlpbnQgdHIxLCB0aTEsIHRyMiwgdGkyOwotCWludCBjb3NhLCBzaW5hLCBjb3NiLCBzaW5iOwotCWludCAqYnVmMTsKLQotCWJ1ZjEgPSBidWYwICsgbnVtIC0gMTsKLQotCWZvcihpID0gbnVtID4+IDI7IGkgIT0gMDsgaS0tKQotCXsKLQkJY29zYSA9ICpjc3B0cisrOwotCQlzaW5hID0gKmNzcHRyKys7Ci0JCWNvc2IgPSAqY3NwdHIrKzsKLQkJc2luYiA9ICpjc3B0cisrOwotCi0JCXRyMSA9ICooYnVmMCArIDApOwotCQl0aTIgPSAqKGJ1ZjAgKyAxKTsKLQkJdHIyID0gKihidWYxIC0gMSk7Ci0JCXRpMSA9ICooYnVmMSArIDApOwotCi0JCSpidWYwKysgPSBNVUxISUdIKGNvc2EsIHRyMSkgKyBNVUxISUdIKHNpbmEsIHRpMSk7Ci0JCSpidWYwKysgPSBNVUxISUdIKGNvc2EsIHRpMSkgLSBNVUxISUdIKHNpbmEsIHRyMSk7Ci0KLQkJKmJ1ZjEtLSA9IE1VTEhJR0goY29zYiwgdGkyKSAtIE1VTEhJR0goc2luYiwgdHIyKTsKLQkJKmJ1ZjEtLSA9IE1VTEhJR0goY29zYiwgdHIyKSArIE1VTEhJR0goc2luYiwgdGkyKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogUG9zdE1EQ1QKLSogZGVzY3JpcHRpb246ICAgcG9zdCBNRENUIHByb2Nlc3MgYWZ0ZXIgbmV4dCBGRlQgZm9yIE1EQ1QKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBQb3N0TURDVChpbnQgKmJ1ZjAsIGludCBudW0sIGNvbnN0IGludCAqY3NwdHIpCi17Ci0JaW50IGk7Ci0JaW50IHRyMSwgdGkxLCB0cjIsIHRpMjsKLQlpbnQgY29zYSwgc2luYSwgY29zYiwgc2luYjsKLQlpbnQgKmJ1ZjE7Ci0KLQlidWYxID0gYnVmMCArIG51bSAtIDE7Ci0KLQlmb3IoaSA9IG51bSA+PiAyOyBpICE9IDA7IGktLSkKLQl7Ci0JCWNvc2EgPSAqY3NwdHIrKzsKLQkJc2luYSA9ICpjc3B0cisrOwotCQljb3NiID0gKmNzcHRyKys7Ci0JCXNpbmIgPSAqY3NwdHIrKzsKLQotCQl0cjEgPSAqKGJ1ZjAgKyAwKTsKLQkJdGkxID0gKihidWYwICsgMSk7Ci0JCXRpMiA9ICooYnVmMSArIDApOwotCQl0cjIgPSAqKGJ1ZjEgLSAxKTsKLQotCQkqYnVmMCsrID0gTVVMSElHSChjb3NhLCB0cjEpICsgTVVMSElHSChzaW5hLCB0aTEpOwotCQkqYnVmMS0tID0gTVVMSElHSChzaW5hLCB0cjEpIC0gTVVMSElHSChjb3NhLCB0aTEpOwotCi0JCSpidWYwKysgPSBNVUxISUdIKHNpbmIsIHRyMikgLSBNVUxISUdIKGNvc2IsIHRpMik7Ci0JCSpidWYxLS0gPSBNVUxISUdIKGNvc2IsIHRyMikgKyBNVUxISUdIKHNpbmIsIHRpMik7Ci0JfQotfQotI2Vsc2UKLXZvaWQgUmFkaXg0Rmlyc3QoaW50ICpidWYsIGludCBudW0pOwotdm9pZCBSYWRpeDhGaXJzdChpbnQgKmJ1ZiwgaW50IG51bSk7Ci12b2lkIFJhZGl4NEZGVChpbnQgKmJ1ZiwgaW50IG51bSwgaW50IGJnbiwgaW50ICp0d2lkVGFiKTsKLXZvaWQgUHJlTURDVChpbnQgKmJ1ZjAsIGludCBudW0sIGNvbnN0IGludCAqY3NwdHIpOwotdm9pZCBQb3N0TURDVChpbnQgKmJ1ZjAsIGludCBudW0sIGNvbnN0IGludCAqY3NwdHIpOwotI2VuZGlmCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogTWRjdF9Mb25nCi0qIGRlc2NyaXB0aW9uOiAgdGhlIGxvbmcgYmxvY2sgbWRjdCwgaW5jbHVkZSBsb25nX3N0YXJ0IGJsb2NrLCBlbmRfbG9uZyBibG9jawotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTWRjdF9Mb25nKGludCAqYnVmKQotewotCVByZU1EQ1QoYnVmLCAxMDI0LCBjb3NzaW50YWIgKyAxMjgpOwotCi0JU2h1ZmZsZShidWYsIDUxMiwgYml0cmV2VGFiICsgMTcpOwotCVJhZGl4OEZpcnN0KGJ1ZiwgNTEyID4+IDMpOwotCVJhZGl4NEZGVChidWYsIDUxMiA+PiAzLCA4LCAoaW50ICopdHdpZFRhYjUxMik7Ci0KLQlQb3N0TURDVChidWYsIDEwMjQsIGNvc3NpbnRhYiArIDEyOCk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogTWRjdF9TaG9ydAotKiBkZXNjcmlwdGlvbjogIHRoZSBzaG9ydCBibG9jayBtZGN0Ci0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBNZGN0X1Nob3J0KGludCAqYnVmKQotewotCVByZU1EQ1QoYnVmLCAxMjgsIGNvc3NpbnRhYik7Ci0KLQlTaHVmZmxlKGJ1ZiwgNjQsIGJpdHJldlRhYik7Ci0JUmFkaXg0Rmlyc3QoYnVmLCA2NCA+PiAyKTsKLQlSYWRpeDRGRlQoYnVmLCA2NCA+PiAyLCA0LCAoaW50ICopdHdpZFRhYjY0KTsKLQotCVBvc3RNRENUKGJ1ZiwgMTI4LCBjb3NzaW50YWIpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBzaGlmdE1kY3REZWxheUJ1ZmZlcgotKiBkZXNjcmlwdGlvbjogICAgdGhlIG1kY3QgZGVsYXkgYnVmZmVyIGhhcyBhIHNpemUgb2YgMTYwMCwKLSogIHNvIHRoZSBjYWxjdWxhdGlvbiBvZiBMT05HLFNUT1AgbXVzdCBiZSAgc3BpbHQgaW4gdHdvCi0qICBwYXNzZXMgd2l0aCAxMDI0IHNhbXBsZXMgYW5kIGEgbWlkIHNoaWZ0LAotKiAgdGhlIFNIT1JUIHRyYW5zZm9ybXMgY2FuIGJlIGNvbXBsZXRlZCBpbiB0aGUgZGVsYXkgYnVmZmVyLAotKiAgYW5kIGFmdGVyd2FyZHMgYSBzaGlmdAotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHNoaWZ0TWRjdERlbGF5QnVmZmVyKFdvcmQxNiAqbWRjdERlbGF5QnVmZmVyLCAvKiEgc3RhcnQgb2YgbWRjdCBkZWxheSBidWZmZXIgKi8KLQkJCQkJCQkJIFdvcmQxNiAqdGltZVNpZ25hbCwgICAgICAvKiEgcG9pbnRlciB0byBuZXcgdGltZSBzaWduYWwgc2FtcGxlcywgaW50ZXJsZWF2ZWQgKi8KLQkJCQkJCQkJIFdvcmQxNiBjaEluY3JlbWVudCAgICAgICAvKiEgbnVtYmVyIG9mIGNoYW5uZWxzICovCi0JCQkJCQkJCSApCi17Ci0JV29yZDMyIGk7Ci0JV29yZDE2ICpzckJ1ZiA9IG1kY3REZWxheUJ1ZmZlcjsKLQlXb3JkMTYgKmRzQnVmID0gbWRjdERlbGF5QnVmZmVyK0ZSQU1FX0xFTl9MT05HOwotCi0JZm9yKGkgPSAwOyBpIDwgQkxPQ0tfU1dJVENISU5HX09GRlNFVC1GUkFNRV9MRU5fTE9ORzsgaSs9IDgpCi0JewotCQkqc3JCdWYrKyA9ICpkc0J1ZisrOwkgKnNyQnVmKysgPSAqZHNCdWYrKzsKLQkJKnNyQnVmKysgPSAqZHNCdWYrKzsJICpzckJ1ZisrID0gKmRzQnVmKys7Ci0JCSpzckJ1ZisrID0gKmRzQnVmKys7CSAqc3JCdWYrKyA9ICpkc0J1ZisrOwotCQkqc3JCdWYrKyA9ICpkc0J1ZisrOwkgKnNyQnVmKysgPSAqZHNCdWYrKzsKLQl9Ci0KLQlzckJ1ZiA9IG1kY3REZWxheUJ1ZmZlciArIEJMT0NLX1NXSVRDSElOR19PRkZTRVQtRlJBTUVfTEVOX0xPTkc7Ci0JZHNCdWYgPSB0aW1lU2lnbmFsOwotCi0JZm9yKGk9MDsgaTxGUkFNRV9MRU5fTE9ORzsgaSs9OCkKLQl7Ci0JCSpzckJ1ZisrID0gKmRzQnVmOyBkc0J1ZiArPSBjaEluY3JlbWVudDsKLQkJKnNyQnVmKysgPSAqZHNCdWY7IGRzQnVmICs9IGNoSW5jcmVtZW50OwotCQkqc3JCdWYrKyA9ICpkc0J1ZjsgZHNCdWYgKz0gY2hJbmNyZW1lbnQ7Ci0JCSpzckJ1ZisrID0gKmRzQnVmOyBkc0J1ZiArPSBjaEluY3JlbWVudDsKLQkJKnNyQnVmKysgPSAqZHNCdWY7IGRzQnVmICs9IGNoSW5jcmVtZW50OwotCQkqc3JCdWYrKyA9ICpkc0J1ZjsgZHNCdWYgKz0gY2hJbmNyZW1lbnQ7Ci0JCSpzckJ1ZisrID0gKmRzQnVmOyBkc0J1ZiArPSBjaEluY3JlbWVudDsKLQkJKnNyQnVmKysgPSAqZHNCdWY7IGRzQnVmICs9IGNoSW5jcmVtZW50OwotCX0KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogZ2V0U2NhbGVmYWN0b3JPZlNob3J0VmVjdG9yU3RyaWRlCi0qIGRlc2NyaXB0aW9uOiAgQ2FsY3VsYXRlIG1heCBwb3NzaWJsZSBzY2FsZSBmYWN0b3IgZm9yIGlucHV0IHZlY3RvciBvZiBzaG9ydHMKLSogcmV0dXJuczogICAgICBNYXhpbXVtIHNjYWxlIGZhY3RvcgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBXb3JkMTYgZ2V0U2NhbGVmYWN0b3JPZlNob3J0VmVjdG9yU3RyaWRlKGNvbnN0IFdvcmQxNiAqdmVjdG9yLCAvKiE8IFBvaW50ZXIgdG8gaW5wdXQgdmVjdG9yICovCi0JCQkJCQkJCQkJCQlXb3JkMTYgbGVuLCAgICAgICAgICAgLyohPCBMZW5ndGggb2YgaW5wdXQgdmVjdG9yICovCi0JCQkJCQkJCQkJCQlXb3JkMTYgc3RyaWRlKSAgICAgICAgLyohPCBTdHJpZGUgb2YgaW5wdXQgdmVjdG9yICovCi17Ci0JV29yZDE2IG1heFZhbCA9IDA7Ci0JV29yZDE2IGFic1ZhbDsKLQlXb3JkMTYgaTsKLQotCWZvcihpPTA7IGk8bGVuOyBpKyspewotCQlhYnNWYWwgPSBhYnNfcyh2ZWN0b3JbaSpzdHJpZGVdKTsKLQkJbWF4VmFsIHw9IGFic1ZhbDsKLQl9Ci0KLQlyZXR1cm4oIG1heFZhbCA/IG5vcm1fcyhtYXhWYWwpIDogMTUpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBUcmFuc2Zvcm1fUmVhbAotKiBkZXNjcmlwdGlvbjogIENhbGN1bGF0ZSB0cmFuc2Zvcm0gZmlsdGVyIGZvciBpbnB1dCB2ZWN0b3Igb2Ygc2hvcnRzCi0qIHJldHVybnM6ICAgICAgVFJVRSBpZiBzdWNjZXNzCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBUcmFuc2Zvcm1fUmVhbChXb3JkMTYgKm1kY3REZWxheUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgV29yZDE2ICp0aW1lU2lnbmFsLAotICAgICAgICAgICAgICAgICAgICBXb3JkMTYgY2hJbmNyZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgIFdvcmQzMiAqcmVhbE91dCwKLSAgICAgICAgICAgICAgICAgICAgV29yZDE2ICptZGN0U2NhbGUsCi0gICAgICAgICAgICAgICAgICAgIFdvcmQxNiBibG9ja1R5cGUKLSAgICAgICAgICAgICAgICAgICAgKQotewotCVdvcmQzMiBpLHc7Ci0JV29yZDMyIHRpbWVTaWduYWxTYW1wbGU7Ci0JV29yZDMyIHdzMSx3czI7Ci0JV29yZDE2ICpkY3RJbjAsICpkY3RJbjE7Ci0JV29yZDMyICpvdXREYXRhMCwgKm91dERhdGExOwotCVdvcmQzMiAqd2luUHRyOwotCi0JV29yZDMyIGRlbGF5QnVmZmVyU2YsdGltZVNpZ25hbFNmLG1pblNmOwotCi0Jc3dpdGNoKGJsb2NrVHlwZSl7Ci0KLQotCWNhc2UgTE9OR19XSU5ET1c6Ci0JCS8qCi0JCXdlIGFjY2VzcyBCTE9DS19TV0lUQ0hJTkdfT0ZGU0VUICgxNjAwICkgZGVsYXkgYnVmZmVyIHNhbXBsZXMgKyA0NDggbmV3IHRpbWVTaWduYWwgc2FtcGxlcwotCQlhbmQgZ2V0IHRoZSBiaWdnZXN0IHNjYWxlIGZhY3RvciBmb3IgbmV4dCBjYWxjdWxhdGUgbW9yZSBwcmVjaXNlCi0JCSovCi0JCWRlbGF5QnVmZmVyU2YgPSBnZXRTY2FsZWZhY3Rvck9mU2hvcnRWZWN0b3JTdHJpZGUobWRjdERlbGF5QnVmZmVyLEJMT0NLX1NXSVRDSElOR19PRkZTRVQsMSk7Ci0JCXRpbWVTaWduYWxTZiAgPSBnZXRTY2FsZWZhY3Rvck9mU2hvcnRWZWN0b3JTdHJpZGUodGltZVNpZ25hbCwyKkZSQU1FX0xFTl9MT05HLUJMT0NLX1NXSVRDSElOR19PRkZTRVQsY2hJbmNyZW1lbnQpOwotCQltaW5TZiA9IG1pbihkZWxheUJ1ZmZlclNmLHRpbWVTaWduYWxTZik7Ci0JCW1pblNmID0gbWluKG1pblNmLDE0KTsKLQotCQlkY3RJbjAgPSBtZGN0RGVsYXlCdWZmZXI7Ci0JCWRjdEluMSA9IG1kY3REZWxheUJ1ZmZlciArIEZSQU1FX0xFTl9MT05HIC0gMTsKLQkJb3V0RGF0YTAgPSByZWFsT3V0ICsgRlJBTUVfTEVOX0xPTkcvMjsKLQotCQkvKiBhZGQgd2luZG93cyBhbmQgcHJlIGFkZCBmb3IgbWRjdCB0byBsYXN0IGJ1ZmZlciovCi0JCXdpblB0ciA9IChpbnQgKilMb25nV2luZG93S0JEOwotCQlmb3IoaT0wO2k8RlJBTUVfTEVOX0xPTkcvMjtpKyspewotCQkJdGltZVNpZ25hbFNhbXBsZSA9ICgqZGN0SW4wKyspIDw8IG1pblNmOwotCQkJd3MxID0gdGltZVNpZ25hbFNhbXBsZSAqICgqd2luUHRyID4+IDE2KTsKLQkJCXRpbWVTaWduYWxTYW1wbGUgPSAoKmRjdEluMS0tKSA8PCBtaW5TZjsKLQkJCXdzMiA9IHRpbWVTaWduYWxTYW1wbGUgKiAoKndpblB0ciAmIDB4ZmZmZik7Ci0JCQl3aW5QdHIgKys7Ci0JCQkvKiBzaGlmdCAyIHRvIGF2b2lkIG92ZXJmbG93IG5leHQgKi8KLQkJCSpvdXREYXRhMCsrID0gKHdzMSA+PiAyKSAtICh3czIgPj4gMik7Ci0JCX0KLQotCQlzaGlmdE1kY3REZWxheUJ1ZmZlcihtZGN0RGVsYXlCdWZmZXIsdGltZVNpZ25hbCxjaEluY3JlbWVudCk7Ci0KLQkJLyogYWRkIHdpbmRvd3MgYW5kIHByZSBhZGQgZm9yIG1kY3QgdG8gbmV3IGJ1ZmZlciovCi0JCWRjdEluMCA9IG1kY3REZWxheUJ1ZmZlcjsKLQkJZGN0SW4xID0gbWRjdERlbGF5QnVmZmVyICsgRlJBTUVfTEVOX0xPTkcgLSAxOwotCQlvdXREYXRhMCA9IHJlYWxPdXQgKyBGUkFNRV9MRU5fTE9ORy8yIC0gMTsKLQkJd2luUHRyID0gKGludCAqKUxvbmdXaW5kb3dLQkQ7Ci0JCWZvcihpPTA7aTxGUkFNRV9MRU5fTE9ORy8yO2krKyl7Ci0JCQl0aW1lU2lnbmFsU2FtcGxlID0gKCpkY3RJbjArKykgPDwgbWluU2Y7Ci0JCQl3czEgPSB0aW1lU2lnbmFsU2FtcGxlICogKCp3aW5QdHIgJiAweGZmZmYpOwotCQkJdGltZVNpZ25hbFNhbXBsZSA9ICgqZGN0SW4xLS0pIDw8IG1pblNmOwotCQkJd3MyID0gdGltZVNpZ25hbFNhbXBsZSAqICgqd2luUHRyID4+IDE2KTsKLQkJCXdpblB0cisrOwotCQkJLyogc2hpZnQgMiB0byBhdm9pZCBvdmVyZmxvdyBuZXh0ICovCi0JCQkqb3V0RGF0YTAtLSA9IC0oKHdzMSA+PiAyKSArICh3czIgPj4gMikpOwotCQl9Ci0KLQkJTWRjdF9Mb25nKHJlYWxPdXQpOwotCQkvKiB1cGRhdGUgc2NhbGUgZmFjdG9yICovCi0JCW1pblNmID0gMTQgLSBtaW5TZjsKLQkJKm1kY3RTY2FsZT1taW5TZjsKLQkJYnJlYWs7Ci0KLQljYXNlIFNUQVJUX1dJTkRPVzoKLQkJLyoKLQkJd2UgYWNjZXNzIEJMT0NLX1NXSVRDSElOR19PRkZTRVQgKDE2MDAgKSBkZWxheSBidWZmZXIgc2FtcGxlcyArIG5vIHRpbWVTaWduYWwgc2FtcGxlcwotCQlhbmQgZ2V0IHRoZSBiaWdnZXN0IHNjYWxlIGZhY3RvciBmb3IgbmV4dCBjYWxjdWxhdGUgbW9yZSBwcmVjaXNlCi0JCSovCi0JCW1pblNmID0gZ2V0U2NhbGVmYWN0b3JPZlNob3J0VmVjdG9yU3RyaWRlKG1kY3REZWxheUJ1ZmZlcixCTE9DS19TV0lUQ0hJTkdfT0ZGU0VULDEpOwotCQltaW5TZiA9IG1pbihtaW5TZiwxNCk7Ci0KLQkJZGN0SW4wID0gbWRjdERlbGF5QnVmZmVyOwotCQlkY3RJbjEgPSBtZGN0RGVsYXlCdWZmZXIgKyBGUkFNRV9MRU5fTE9ORyAtIDE7Ci0JCW91dERhdGEwID0gcmVhbE91dCArIEZSQU1FX0xFTl9MT05HLzI7Ci0JCXdpblB0ciA9IChpbnQgKilMb25nV2luZG93S0JEOwotCi0JCS8qIGFkZCB3aW5kb3dzIGFuZCBwcmUgYWRkIGZvciBtZGN0IHRvIGxhc3QgYnVmZmVyKi8KLQkJZm9yKGk9MDtpPEZSQU1FX0xFTl9MT05HLzI7aSsrKXsKLQkJCXRpbWVTaWduYWxTYW1wbGUgPSAoKmRjdEluMCsrKSA8PCBtaW5TZjsKLQkJCXdzMSA9IHRpbWVTaWduYWxTYW1wbGUgKiAoKndpblB0ciA+PiAxNik7Ci0JCQl0aW1lU2lnbmFsU2FtcGxlID0gKCpkY3RJbjEtLSkgPDwgbWluU2Y7Ci0JCQl3czIgPSB0aW1lU2lnbmFsU2FtcGxlICogKCp3aW5QdHIgJiAweGZmZmYpOwotCQkJd2luUHRyICsrOwotCQkJKm91dERhdGEwKysgPSAod3MxID4+IDIpIC0gKHdzMiA+PiAyKTsgIC8qIHNoaWZ0IDIgdG8gYXZvaWQgb3ZlcmZsb3cgbmV4dCAqLwotCQl9Ci0KLQkJc2hpZnRNZGN0RGVsYXlCdWZmZXIobWRjdERlbGF5QnVmZmVyLHRpbWVTaWduYWwsY2hJbmNyZW1lbnQpOwotCi0JCW91dERhdGEwID0gcmVhbE91dCArIEZSQU1FX0xFTl9MT05HLzIgLSAxOwotCQlmb3IoaT0wO2k8TFNfVFJBTlM7aSsrKXsKLQkJCSpvdXREYXRhMC0tID0gLW1kY3REZWxheUJ1ZmZlcltpXSA8PCAoMTUgLSAyICsgbWluU2YpOwotCQl9Ci0KLQkJLyogYWRkIHdpbmRvd3MgYW5kIHByZSBhZGQgZm9yIG1kY3QgdG8gbmV3IGJ1ZmZlciovCi0JCWRjdEluMCA9IG1kY3REZWxheUJ1ZmZlciArIExTX1RSQU5TOwotCQlkY3RJbjEgPSBtZGN0RGVsYXlCdWZmZXIgKyBGUkFNRV9MRU5fTE9ORyAtIDEgLSBMU19UUkFOUzsKLQkJb3V0RGF0YTAgPSByZWFsT3V0ICsgRlJBTUVfTEVOX0xPTkcvMiAtIDEgLUxTX1RSQU5TOwotCQl3aW5QdHIgPSAoaW50ICopU2hvcnRXaW5kb3dTaW5lOwotCQlmb3IoaT0wO2k8RlJBTUVfTEVOX1NIT1JULzI7aSsrKXsKLQkJCXRpbWVTaWduYWxTYW1wbGU9ICgqZGN0SW4wKyspIDw8IG1pblNmOwotCQkJd3MxID0gdGltZVNpZ25hbFNhbXBsZSAqICgqd2luUHRyICYgMHhmZmZmKTsKLQkJCXRpbWVTaWduYWxTYW1wbGU9ICgqZGN0SW4xLS0pIDw8IG1pblNmOwotCQkJd3MyID0gdGltZVNpZ25hbFNhbXBsZSAqICgqd2luUHRyID4+IDE2KTsKLQkJCXdpblB0cisrOwotCQkJKm91dERhdGEwLS0gPSAgLSgod3MxID4+IDIpICsgKHdzMiA+PiAyKSk7ICAvKiBzaGlmdCAyIHRvIGF2b2lkIG92ZXJmbG93IG5leHQgKi8KLQkJfQotCi0JCU1kY3RfTG9uZyhyZWFsT3V0KTsKLQkJLyogdXBkYXRlIHNjYWxlIGZhY3RvciAqLwotCQltaW5TZiA9IDE0IC0gbWluU2Y7Ci0JCSptZGN0U2NhbGU9IG1pblNmOwotCQlicmVhazsKLQotCWNhc2UgU1RPUF9XSU5ET1c6Ci0JCS8qCi0JCXdlIGFjY2VzcyBCTE9DS19TV0lUQ0hJTkdfT0ZGU0VULUxTX1RSQU5TICgxNjAwLTQ0OCApIGRlbGF5IGJ1ZmZlciBzYW1wbGVzICsgNDQ4IG5ldyB0aW1lU2lnbmFsIHNhbXBsZXMKLQkJYW5kIGdldCB0aGUgYmlnZ2VzdCBzY2FsZSBmYWN0b3IgZm9yIG5leHQgY2FsY3VsYXRlIG1vcmUgcHJlY2lzZQotCQkqLwotCQlkZWxheUJ1ZmZlclNmID0gZ2V0U2NhbGVmYWN0b3JPZlNob3J0VmVjdG9yU3RyaWRlKG1kY3REZWxheUJ1ZmZlcitMU19UUkFOUyxCTE9DS19TV0lUQ0hJTkdfT0ZGU0VULUxTX1RSQU5TLDEpOwotCQl0aW1lU2lnbmFsU2YgID0gZ2V0U2NhbGVmYWN0b3JPZlNob3J0VmVjdG9yU3RyaWRlKHRpbWVTaWduYWwsMipGUkFNRV9MRU5fTE9ORy1CTE9DS19TV0lUQ0hJTkdfT0ZGU0VULGNoSW5jcmVtZW50KTsKLQkJbWluU2YgPSBtaW4oZGVsYXlCdWZmZXJTZix0aW1lU2lnbmFsU2YpOwotCQltaW5TZiA9IG1pbihtaW5TZiwxMyk7Ci0KLQkJb3V0RGF0YTAgPSByZWFsT3V0ICsgRlJBTUVfTEVOX0xPTkcvMjsKLQkJZGN0SW4xID0gbWRjdERlbGF5QnVmZmVyICsgRlJBTUVfTEVOX0xPTkcgLSAxOwotCQlmb3IoaT0wO2k8TFNfVFJBTlM7aSsrKXsKLQkJCSpvdXREYXRhMCsrID0gLSgqZGN0SW4xLS0pIDw8ICgxNSAtIDIgKyBtaW5TZik7Ci0JCX0KLQotCQkvKiBhZGQgd2luZG93cyBhbmQgcHJlIGFkZCBmb3IgbWRjdCB0byBsYXN0IGJ1ZmZlciovCi0JCWRjdEluMCA9IG1kY3REZWxheUJ1ZmZlciArIExTX1RSQU5TOwotCQlkY3RJbjEgPSBtZGN0RGVsYXlCdWZmZXIgKyBGUkFNRV9MRU5fTE9ORyAtIDEgLSBMU19UUkFOUzsKLQkJb3V0RGF0YTAgPSByZWFsT3V0ICsgRlJBTUVfTEVOX0xPTkcvMiArIExTX1RSQU5TOwotCQl3aW5QdHIgPSAoaW50ICopU2hvcnRXaW5kb3dTaW5lOwotCQlmb3IoaT0wO2k8RlJBTUVfTEVOX1NIT1JULzI7aSsrKXsKLQkJCXRpbWVTaWduYWxTYW1wbGUgPSAoKmRjdEluMCsrKSA8PCBtaW5TZjsKLQkJCXdzMSA9IHRpbWVTaWduYWxTYW1wbGUgKiAoKndpblB0ciA+PiAxNik7Ci0JCQl0aW1lU2lnbmFsU2FtcGxlPSAoKmRjdEluMS0tKSA8PCBtaW5TZjsKLQkJCXdzMiA9IHRpbWVTaWduYWxTYW1wbGUgKiAoKndpblB0ciAmIDB4ZmZmZik7Ci0JCQl3aW5QdHIrKzsKLQkJCSpvdXREYXRhMCsrID0gKHdzMSA+PiAyKSAtICh3czIgPj4gMik7ICAvKiBzaGlmdCAyIHRvIGF2b2lkIG92ZXJmbG93IG5leHQgKi8KLQkJfQotCi0JCXNoaWZ0TWRjdERlbGF5QnVmZmVyKG1kY3REZWxheUJ1ZmZlcix0aW1lU2lnbmFsLGNoSW5jcmVtZW50KTsKLQotCQkvKiBhZGQgd2luZG93cyBhbmQgcHJlIGFkZCBmb3IgbWRjdCB0byBuZXcgYnVmZmVyKi8KLQkJZGN0SW4wID0gbWRjdERlbGF5QnVmZmVyOwotCQlkY3RJbjEgPSBtZGN0RGVsYXlCdWZmZXIgKyBGUkFNRV9MRU5fTE9ORyAtIDE7Ci0JCW91dERhdGEwID0gcmVhbE91dCArIEZSQU1FX0xFTl9MT05HLzIgLSAxOwotCQl3aW5QdHIgPSAoaW50ICopTG9uZ1dpbmRvd0tCRDsKLQkJZm9yKGk9MDtpPEZSQU1FX0xFTl9MT05HLzI7aSsrKXsKLQkJCXRpbWVTaWduYWxTYW1wbGU9ICgqZGN0SW4wKyspIDw8IG1pblNmOwotCQkJd3MxID0gdGltZVNpZ25hbFNhbXBsZSAqKCp3aW5QdHIgJiAweGZmZmYpOwotCQkJdGltZVNpZ25hbFNhbXBsZT0gKCpkY3RJbjEtLSkgPDwgbWluU2Y7Ci0JCQl3czIgPSB0aW1lU2lnbmFsU2FtcGxlICogKCp3aW5QdHIgPj4gMTYpOwotCQkJKm91dERhdGEwLS0gPSAgLSgod3MxID4+IDIpICsgKHdzMiA+PiAyKSk7ICAvKiBzaGlmdCAyIHRvIGF2b2lkIG92ZXJmbG93IG5leHQgKi8KLQkJCXdpblB0cisrOwotCQl9Ci0KLQkJTWRjdF9Mb25nKHJlYWxPdXQpOwotCQltaW5TZiA9IDE0IC0gbWluU2Y7Ci0JCSptZGN0U2NhbGU9IG1pblNmOyAvKiB1cGRhdGUgc2NhbGUgZmFjdG9yICovCi0JCWJyZWFrOwotCi0JY2FzZSBTSE9SVF9XSU5ET1c6Ci0JCS8qCi0JCXdlIGFjY2VzcyBCTE9DS19TV0lUQ0hJTkdfT0ZGU0VUICgxNjAwICkgZGVsYXkgYnVmZmVyIHNhbXBsZXMgKyBubyBuZXcgdGltZVNpZ25hbCBzYW1wbGVzCi0JCWFuZCBnZXQgdGhlIGJpZ2dlc3Qgc2NhbGUgZmFjdG9yIGZvciBuZXh0IGNhbGN1bGF0ZSBtb3JlIHByZWNpc2UKLQkJKi8KLQkJbWluU2YgPSBnZXRTY2FsZWZhY3Rvck9mU2hvcnRWZWN0b3JTdHJpZGUobWRjdERlbGF5QnVmZmVyK1RSQU5TRk9STV9PRkZTRVRfU0hPUlQsOSpGUkFNRV9MRU5fU0hPUlQsMSk7Ci0JCW1pblNmID0gbWluKG1pblNmLDEwKTsKLQotCi0JCWZvcih3PTA7dzxUUkFOU19GQUM7dysrKXsKLQkJCWRjdEluMCA9IG1kY3REZWxheUJ1ZmZlcit3KkZSQU1FX0xFTl9TSE9SVCtUUkFOU0ZPUk1fT0ZGU0VUX1NIT1JUOwotCQkJZGN0SW4xID0gbWRjdERlbGF5QnVmZmVyK3cqRlJBTUVfTEVOX1NIT1JUK1RSQU5TRk9STV9PRkZTRVRfU0hPUlQgKyBGUkFNRV9MRU5fU0hPUlQtMTsKLQkJCW91dERhdGEwID0gcmVhbE91dCArIEZSQU1FX0xFTl9TSE9SVC8yOwotCQkJb3V0RGF0YTEgPSByZWFsT3V0ICsgRlJBTUVfTEVOX1NIT1JULzIgLSAxOwotCi0JCQl3aW5QdHIgPSAoaW50ICopU2hvcnRXaW5kb3dTaW5lOwotCQkJZm9yKGk9MDtpPEZSQU1FX0xFTl9TSE9SVC8yO2krKyl7Ci0JCQkJdGltZVNpZ25hbFNhbXBsZT0gKmRjdEluMCA8PCBtaW5TZjsKLQkJCQl3czEgPSB0aW1lU2lnbmFsU2FtcGxlICogKCp3aW5QdHIgPj4gMTYpOwotCQkJCXRpbWVTaWduYWxTYW1wbGU9ICpkY3RJbjEgPDwgbWluU2Y7Ci0JCQkJd3MyID0gdGltZVNpZ25hbFNhbXBsZSAqICgqd2luUHRyICYgMHhmZmZmKTsKLQkJCQkqb3V0RGF0YTArKyA9ICh3czEgPj4gMikgLSAod3MyID4+IDIpOyAgLyogc2hpZnQgMiB0byBhdm9pZCBvdmVyZmxvdyBuZXh0ICovCi0KLQkJCQl0aW1lU2lnbmFsU2FtcGxlPSAqKGRjdEluMCArIEZSQU1FX0xFTl9TSE9SVCkgPDwgbWluU2Y7Ci0JCQkJd3MxID0gdGltZVNpZ25hbFNhbXBsZSAqICgqd2luUHRyICYgMHhmZmZmKTsKLQkJCQl0aW1lU2lnbmFsU2FtcGxlPSAqKGRjdEluMSArIEZSQU1FX0xFTl9TSE9SVCkgPDwgbWluU2Y7Ci0JCQkJd3MyID0gdGltZVNpZ25hbFNhbXBsZSAqICgqd2luUHRyID4+IDE2KTsKLQkJCQkqb3V0RGF0YTEtLSA9ICAtKCh3czEgPj4gMikgKyAod3MyID4+IDIpKTsgIC8qIHNoaWZ0IDIgdG8gYXZvaWQgb3ZlcmZsb3cgbmV4dCAqLwotCi0JCQkJd2luUHRyKys7Ci0JCQkJZGN0SW4wKys7Ci0JCQkJZGN0SW4xLS07Ci0JCQl9Ci0KLQkJCU1kY3RfU2hvcnQocmVhbE91dCk7Ci0JCQlyZWFsT3V0ICs9IEZSQU1FX0xFTl9TSE9SVDsKLQkJfQotCi0JCW1pblNmID0gMTEgLSBtaW5TZjsKLQkJKm1kY3RTY2FsZSA9IG1pblNmOyAvKiB1cGRhdGUgc2NhbGUgZmFjdG9yICovCi0KLQkJc2hpZnRNZGN0RGVsYXlCdWZmZXIobWRjdERlbGF5QnVmZmVyLHRpbWVTaWduYWwsY2hJbmNyZW1lbnQpOwotCQlicmVhazsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL0FuZHJvaWQuYnAKaW5kZXggZDI2NmRjMi4uODgwZjE2MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvQW5kcm9pZC5icApAQCAtNDEsNyArNDEsNyBAQAogICAgIF0sCiAKICAgICBpbmNsdWRlX2RpcnM6IFsiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIl0sCi0gICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbInNyYyJdLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsic3JjIl0sCiAKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1ET1NDTF9VTlVTRURfQVJHKHgpPSh2b2lkKSh4KSIsCkBAIC01MCw2ICs1MCw4IEBACiAgICAgICAgICItV2Vycm9yIiwKICAgICBdLAogCisgICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCisKICAgICAvL3Nhbml0aXplOiB7CiAgICAgLy8gICAgbWlzY191bmRlZmluZWQ6IFsKICAgICAvLyAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKQEAgLTg1LDYgKzg3LDggQEAKICAgICAgICAgIi1XZXJyb3IiLAogICAgIF0sCiAKKyAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKKwogICAgIC8vc2FuaXRpemU6IHsKICAgICAvLyAgICBtaXNjX3VuZGVmaW5lZDogWwogICAgIC8vICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLApAQCAtMTA2LDcgKzExMCw2IEBACiAgICAgXSwKICAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQotCiAvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIGNjX3Rlc3QgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9hbXJuYmRlY190ZXN0IiwKQEAgLTExNCw2ICsxMTcsOCBAQAogCiAgICAgc3JjczogWyJ0ZXN0L2Ftcm5iZGVjX3Rlc3QuY3BwIl0sCiAKKyAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAorCiAgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbInNyYyJdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvZXhwb3J0cy5sZHMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL2V4cG9ydHMubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNGYzZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL2V4cG9ydHMubGRzCkBAIC0wLDAgKzEsNSBAQAoreworICAgIGdsb2JhbDoKKyAgICAgICAgX1oyMmNyZWF0ZVNvZnRPTVhDb21wb25lbnRQS2NQSzE2T01YX0NBTExCQUNLVFlQRVB2UFAxN09NWF9DT01QT05FTlRUWVBFOworICAgIGxvY2FsOiAqOworfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvQW5kcm9pZC5icAppbmRleCA2ZGMyZGMxLi4xOWZkNGE4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9BbmRyb2lkLmJwCkBAIC02MywxMyArNjMsMTUgQEAKICAgICBdLAogCiAgICAgaW5jbHVkZV9kaXJzOiBbImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSJdLAotICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJzcmMiXSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbInNyYyJdLAogCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItRE9TQ0xfVU5VU0VEX0FSRyh4KT0odm9pZCkoeCkiLAogICAgICAgICAiLVdlcnJvciIsCiAgICAgXSwKIAorICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAorCiAgICAgLy9hZGRyZXNzaW5nIGIvMjU0MDk3NDQKICAgICAvL3Nhbml0aXplOiB7CiAgICAgLy8gICAgbWlzY191bmRlZmluZWQ6IFsKQEAgLTEyNiw2ICsxMjgsOCBAQAogCiAgICAgc3JjczogWyJ0ZXN0L2Ftcm5iX2VuY190ZXN0LmNwcCJdLAogCisgICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiXSwKKwogICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJzcmMiXSwKIAogICAgIHN0YXRpY19saWJzOiBbImxpYnN0YWdlZnJpZ2h0X2Ftcm5iZW5jIl0sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL2V4cG9ydHMubGRzIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9leHBvcnRzLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjRmM2ZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9leHBvcnRzLmxkcwpAQCAtMCwwICsxLDUgQEAKK3sKKyAgICBnbG9iYWw6CisgICAgICAgIF9aMjJjcmVhdGVTb2Z0T01YQ29tcG9uZW50UEtjUEsxNk9NWF9DQUxMQkFDS1RZUEVQdlBQMTdPTVhfQ09NUE9ORU5UVFlQRTsKKyAgICBsb2NhbDogKjsKK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9BbmRyb2lkLmJwCmluZGV4IGI5MzJjY2MuLjlmZWZkODEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9BbmRyb2lkLmJwCkBAIC00NSw4ICs0NSwxMSBAQAogICAgIF0sCiAKICAgICBpbmNsdWRlX2RpcnM6IFsiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIl0sCi0gICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbInNyYyJdLAotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAic3JjIiwKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCiAKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1ET1NDTF9VTlVTRURfQVJHKHgpPSh2b2lkKSh4KSIsCkBAIC02OSw2ICs3Miw4IEBACiAKICAgICBzcmNzOiBbInRlc3QvYW1yd2JkZWNfdGVzdC5jcHAiXSwKIAorICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIl0sCisKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1yd2JkZWMiLAogICAgICAgICAibGlic25kZmlsZSIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9BbmRyb2lkLmJwCmluZGV4IDg5Njg5OTEuLmViZTA4YzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9BbmRyb2lkLmJwCkBAIC03Niw3ICs3Niw3IEBACiAKICAgICAgICAgICAgIGluc3RydWN0aW9uX3NldDogImFybSIsCiAKLSAgICAgICAgICAgIGFybXY3X2FfbmVvbjogeworICAgICAgICAgICAgbmVvbjogewogICAgICAgICAgICAgICAgIGV4Y2x1ZGVfc3JjczogWwogICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvY29udm9sdmVfb3B0LnMiLAogICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvY29yX2hfdmVjX29wdC5zIiwKQEAgLTE1OSw2ICsxNTksOCBAQAogCiAgICAgY2ZsYWdzOiBbIi1XZXJyb3IiXSwKIAorICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAorCiAgICAgc2FuaXRpemU6IHsKICAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU2FtcGxlQ29kZS9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NhbXBsZUNvZGUvQW5kcm9pZC5icAppbmRleCBkNTJmZWQzLi44MWIzZjY5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU2FtcGxlQ29kZS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9TYW1wbGVDb2RlL0FuZHJvaWQuYnAKQEAgLTQsNiArNCw4IEBACiAKICAgICBzcmNzOiBbIkFNUldCX0VfU0FNUExFLmMiXSwKIAorICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIl0sCisKICAgICBhcmNoOiB7CiAgICAgICAgIGFybTogewogICAgICAgICAgICAgaW5zdHJ1Y3Rpb25fc2V0OiAiYXJtIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9leHBvcnRzLmxkcyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9leHBvcnRzLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjRmM2ZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2V4cG9ydHMubGRzCkBAIC0wLDAgKzEsNSBAQAoreworICAgIGdsb2JhbDoKKyAgICAgICAgX1oyMmNyZWF0ZVNvZnRPTVhDb21wb25lbnRQS2NQSzE2T01YX0NBTExCQUNLVFlQRVB2UFAxN09NWF9DT01QT05FTlRUWVBFOworICAgIGxvY2FsOiAqOworfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvQW5kcm9pZC5icAppbmRleCAxZjQzODAzLi5jZjUwYTA0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9BbmRyb2lkLmJwCkBAIC04LDYgKzgsMTMgQEAKICAgICBzdGF0aWNfbGliczogWyJsaWJhdmNkZWMiXSwKICAgICBzcmNzOiBbIlNvZnRBVkNEZWMuY3BwIl0sCiAKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisKKyAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKKwogICAgIGluY2x1ZGVfZGlyczogWwogICAgICAgICAiZXh0ZXJuYWwvbGliYXZjL2RlY29kZXIiLAogICAgICAgICAiZXh0ZXJuYWwvbGliYXZjL2NvbW1vbiIsCkBAIC0xNiw3ICsyMyw2IEBACiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJtZWRpYV9vbXgiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidXRpbHMiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9Tb2Z0QVZDRGVjLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvU29mdEFWQ0RlYy5jcHAKaW5kZXggZGFlNmU3OS4uMzkyNGZjMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9Tb2Z0QVZDRGVjLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL1NvZnRBVkNEZWMuY3BwCkBAIC0xNzEsNyArMTcxLDcgQEAKIHN0YXR1c190IFNvZnRBVkM6OnJlc2V0UGx1Z2luKCkgewogICAgIG1Jc0luRmx1c2ggPSBmYWxzZTsKICAgICBtUmVjZWl2ZWRFT1MgPSBmYWxzZTsKLSAgICBtSW5wdXRPZmZzZXQgPSAwOworCiAgICAgbWVtc2V0KG1UaW1lU3RhbXBzLCAwLCBzaXplb2YobVRpbWVTdGFtcHMpKTsKICAgICBtZW1zZXQobVRpbWVTdGFtcHNWYWxpZCwgMCwgc2l6ZW9mKG1UaW1lU3RhbXBzVmFsaWQpKTsKIApAQCAtMzA0LDcgKzMwNCw2IEBACiB9CiAKIHN0YXR1c190IFNvZnRBVkM6OmRlSW5pdERlY29kZXIoKSB7Ci0gICAgc2l6ZV90IGk7CiAgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzOwogCiAgICAgaWYgKG1Db2RlY0N0eCkgewpAQCAtMzM0LDYgKzMzMyw3IEBACiAgICAgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6b25SZXNldCgpOwogCiAgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbUlucHV0T2Zmc2V0ID0gMDsKICAgICByZXNldERlY29kZXIoKTsKICAgICByZXNldFBsdWdpbigpOwogfQpAQCAtNDUwLDcgKzQ1MCw2IEBACiAgICAgICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3Qgc19kZWNfaXA7CiAgICAgICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3Qgc19kZWNfb3A7CiAgICAgICAgICAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXM7Ci0gICAgICAgICAgICBzaXplX3Qgc2l6ZVksIHNpemVVVjsKIAogICAgICAgICAgICAgc2V0RGVjb2RlQXJncygmc19kZWNfaXAsICZzX2RlY19vcCwgTlVMTCwgTlVMTCwgMCk7CiAKQEAgLTQ2NSw3ICs0NjQsOCBAQAogICAgICAgICAgICAgZnJlZShtRmx1c2hPdXRCdWZmZXIpOwogICAgICAgICAgICAgbUZsdXNoT3V0QnVmZmVyID0gTlVMTDsKICAgICAgICAgfQotCisgICAgfSBlbHNlIHsKKyAgICAgICAgbUlucHV0T2Zmc2V0ID0gMDsKICAgICB9CiB9CiAKQEAgLTU2MSw3ICs1NjEsNiBAQAogICAgICAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90IHNfZGVjX2lwOwogICAgICAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90IHNfZGVjX29wOwogICAgICAgICAgICAgbnNlY3NfdCB0aW1lRGVsYXksIHRpbWVUYWtlbjsKLSAgICAgICAgICAgIHNpemVfdCBzaXplWSwgc2l6ZVVWOwogCiAgICAgICAgICAgICBpZiAoIXNldERlY29kZUFyZ3MoJnNfZGVjX2lwLCAmc19kZWNfb3AsIGluSGVhZGVyLCBvdXRIZWFkZXIsIHRpbWVTdGFtcEl4KSkgewogICAgICAgICAgICAgICAgIEFMT0dFKCJEZWNvZGVyIGFyZyBzZXR1cCBmYWlsZWQiKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvZXhwb3J0cy5sZHMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL2V4cG9ydHMubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNGYzZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL2V4cG9ydHMubGRzCkBAIC0wLDAgKzEsNSBAQAoreworICAgIGdsb2JhbDoKKyAgICAgICAgX1oyMmNyZWF0ZVNvZnRPTVhDb21wb25lbnRQS2NQSzE2T01YX0NBTExCQUNLVFlQRVB2UFAxN09NWF9DT01QT05FTlRUWVBFOworICAgIGxvY2FsOiAqOworfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvQW5kcm9pZC5icAppbmRleCA2NjUwN2E3Li5jZWZlNzdjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9BbmRyb2lkLmJwCkBAIC0xNyw3ICsxNyw3IEBACiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJtZWRpYV9vbXgiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlibG9nIiwKQEAgLTMzLDYgKzMzLDE0IEBACiAgICAgICAgIH0sCiAgICAgfSwKIAorICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV25vLXVudXNlZC12YXJpYWJsZSIsCisgICAgXSwKICAgICBsZGZsYWdzOiBbIi1XbCwtQnN5bWJvbGljIl0sCisKKyAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKKwogICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmNwcAppbmRleCAzMmZkYmQzLi4zNzlkNDFlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5jcHAKQEAgLTI2LDcgKzI2LDYgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxPTVhfSW5kZXhFeHQuaD4KICNpbmNsdWRlIDxPTVhfVmlkZW9FeHQuaD4KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9leHBvcnRzLmxkcyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvZXhwb3J0cy5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI0ZjNmYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvZXhwb3J0cy5sZHMKQEAgLTAsMCArMSw1IEBACit7CisgICAgZ2xvYmFsOgorICAgICAgICBfWjIyY3JlYXRlU29mdE9NWENvbXBvbmVudFBLY1BLMTZPTVhfQ0FMTEJBQ0tUWVBFUHZQUDE3T01YX0NPTVBPTkVOVFRZUEU7CisgICAgbG9jYWw6ICo7Cit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvQW5kcm9pZC5icAppbmRleCA1OTVjZmRiLi45YWYwODZiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvQW5kcm9pZC5icApAQCAtMTgsNiArMTgsOCBAQAogCiAgICAgY2ZsYWdzOiBbIi1XZXJyb3IiXSwKIAorICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAorCiAgICAgc2FuaXRpemU6IHsKICAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvU29mdEZsYWNEZWNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9Tb2Z0RmxhY0RlY29kZXIuY3BwCmluZGV4IDRhYjFhYjIuLjJjMGYyMjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9Tb2Z0RmxhY0RlY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9Tb2Z0RmxhY0RlY29kZXIuY3BwCkBAIC00NSw5ICs0NSwxMSBAQAogICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkKICAgICA6IFNpbXBsZVNvZnRPTVhDb21wb25lbnQobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpLAogICAgICAgbUZMQUNEZWNvZGVyKE5VTEwpLAotICAgICAgbUhhc1N0cmVhbUluZm8oZmFsc2UpLAogICAgICAgbUlucHV0QnVmZmVyQ291bnQoMCksCisgICAgICBtSGFzU3RyZWFtSW5mbyhmYWxzZSksCiAgICAgICBtU2lnbmFsbGVkRXJyb3IoZmFsc2UpLAorICAgICAgbVNhd0lucHV0RU9TKGZhbHNlKSwKKyAgICAgIG1GaW5pc2hlZERlY29kZXIoZmFsc2UpLAogICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZShOT05FKSB7CiAgICAgQUxPR1YoImN0b3I6Iik7CiAgICAgbWVtc2V0KCZtU3RyZWFtSW5mbywgMCwgc2l6ZW9mKG1TdHJlYW1JbmZvKSk7CkBAIC01Nyw2ICs1OSw3IEBACiAKIFNvZnRGbGFjRGVjb2Rlcjo6flNvZnRGbGFjRGVjb2RlcigpIHsKICAgICBBTE9HVigiZHRvcjoiKTsKKyAgICBkZWxldGUgbUZMQUNEZWNvZGVyOwogfQogCiB2b2lkIFNvZnRGbGFjRGVjb2Rlcjo6aW5pdFBvcnRzKCkgewpAQCAtMjkxLDcgKzI5NCw2IEBACiB9CiAKIHZvaWQgU29mdEZsYWNEZWNvZGVyOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgLyogcG9ydEluZGV4ICovKSB7Ci0gICAgQUxPR1YoIm9uUXVldWVGaWxsZWQ6Iik7CiAgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlICE9IE5PTkUpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTI5OSw5NiArMzAxLDExNCBAQAogICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmaW5RdWV1ZSA9IGdldFBvcnRRdWV1ZSgwKTsKICAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJm91dFF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDEpOwogCi0gICAgd2hpbGUgKCFpblF1ZXVlLmVtcHR5KCkgJiYgIW91dFF1ZXVlLmVtcHR5KCkpIHsKLSAgICAgICAgQnVmZmVySW5mbyAqaW5JbmZvID0gKmluUXVldWUuYmVnaW4oKTsKLSAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmluSGVhZGVyID0gaW5JbmZvLT5tSGVhZGVyOworICAgIEFMT0dWKCJvblF1ZXVlRmlsbGVkICVkLyVkOiIsIGluUXVldWUuZW1wdHkoKSwgb3V0UXVldWUuZW1wdHkoKSk7CisgICAgd2hpbGUgKCghaW5RdWV1ZS5lbXB0eSgpIHx8IG1TYXdJbnB1dEVPUykgJiYgIW91dFF1ZXVlLmVtcHR5KCkgJiYgIW1GaW5pc2hlZERlY29kZXIpIHsKICAgICAgICAgQnVmZmVySW5mbyAqb3V0SW5mbyA9ICpvdXRRdWV1ZS5iZWdpbigpOwogICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyID0gb3V0SW5mby0+bUhlYWRlcjsKLSAgICAgICAgdWludDhfdCogaW5CdWZmZXIgPSBpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0OwotICAgICAgICB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCA9IGluSGVhZGVyLT5uRmlsbGVkTGVuOwotICAgICAgICBib29sIGVuZE9mSW5wdXQgPSAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgIT0gMDsKKyAgICAgICAgc2hvcnQgKm91dEJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8c2hvcnQgKj4ob3V0SGVhZGVyLT5wQnVmZmVyICsgb3V0SGVhZGVyLT5uT2Zmc2V0KTsKKyAgICAgICAgc2l6ZV90IG91dEJ1ZmZlclNpemUgPSBvdXRIZWFkZXItPm5BbGxvY0xlbiAtIG91dEhlYWRlci0+bk9mZnNldDsKKyAgICAgICAgaW50NjRfdCB0aW1lU3RhbXAgPSAwOwogCi0gICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAoZW5kT2ZJbnB1dCkgewotICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IDA7Ci0gICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7Ci0gICAgICAgICAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOwotICAgICAgICAgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dFKCJvblF1ZXVlRmlsbGVkOiBlbXB0eUlucHV0QnVmZmVyIHJlY2VpdmVkIik7CisgICAgICAgIGlmICghaW5RdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICBCdWZmZXJJbmZvICppbkluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOworICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmluSGVhZGVyID0gaW5JbmZvLT5tSGVhZGVyOworICAgICAgICAgICAgdWludDhfdCogaW5CdWZmZXIgPSBpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0OworICAgICAgICAgICAgdWludDMyX3QgaW5CdWZmZXJMZW5ndGggPSBpbkhlYWRlci0+bkZpbGxlZExlbjsKKyAgICAgICAgICAgIEFMT0dWKCJpbnB1dDogJXUgYnl0ZXMiLCBpbkJ1ZmZlckxlbmd0aCk7CisgICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgeworICAgICAgICAgICAgICAgIEFMT0dWKCJzYXcgRU9TIik7CisgICAgICAgICAgICAgICAgbVNhd0lucHV0RU9TID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPT0gMCAmJiBpbkhlYWRlci0+bkZpbGxlZExlbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IGJ1ZmZlciB3YXMgZW1wdHkgYW5kIEVPUzogc2lnbmFsIEVPUyBvbiBvdXRwdXQgYW5kIHJldHVybgorICAgICAgICAgICAgICAgICAgICBBTE9HVigiZW1wdHkgZmlyc3QgRU9TIik7CisgICAgICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9IGluSGVhZGVyLT5uVGltZVN0YW1wOworICAgICAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IE9NWF9CVUZGRVJGTEFHX0VPUzsKKyAgICAgICAgICAgICAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgbUZpbmlzaGVkRGVjb2RlciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKLSAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKLSAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlckNvdW50ID09IDAgJiYgIShpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUcpKSB7Ci0gICAgICAgICAgICBBTE9HRSgib25RdWV1ZUZpbGxlZDogZmlyc3QgYnVmZmVyIHNob3VsZCBoYXZlIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHIHNldCIpOwotICAgICAgICAgICAgaW5IZWFkZXItPm5GbGFncyB8PSBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRzsKLSAgICAgICAgfQotICAgICAgICBpZiAoKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRykgIT0gMCkgewotICAgICAgICAgICAgc3RhdHVzX3QgZGVjb2RlckVyciA9IG1GTEFDRGVjb2Rlci0+cGFyc2VNZXRhZGF0YShpbkJ1ZmZlciwgaW5CdWZmZXJMZW5ndGgpOwotICAgICAgICAgICAgbUlucHV0QnVmZmVyQ291bnQrKzsKIAotICAgICAgICAgICAgaWYgKGRlY29kZXJFcnIgIT0gT0sgJiYgZGVjb2RlckVyciAhPSBXT1VMRF9CTE9DSykgewotICAgICAgICAgICAgICAgIEFMT0dFKCJvblF1ZXVlRmlsbGVkOiBGTEFDRGVjb2RlciBwYXJzZU1ldGFEYXRhIHJldHVybnMgZXJyb3IgJWQiLCBkZWNvZGVyRXJyKTsKKyAgICAgICAgICAgIGlmIChtSW5wdXRCdWZmZXJDb3VudCA9PSAwICYmICEoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJvblF1ZXVlRmlsbGVkOiBmaXJzdCBidWZmZXIgc2hvdWxkIGhhdmUgT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUcgc2V0Iik7CisgICAgICAgICAgICAgICAgaW5IZWFkZXItPm5GbGFncyB8PSBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoInJlY2VpdmVkIGNvbmZpZyBidWZmZXIgb2Ygc2l6ZSAldSIsIGluQnVmZmVyTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBkZWNvZGVyRXJyID0gbUZMQUNEZWNvZGVyLT5wYXJzZU1ldGFkYXRhKGluQnVmZmVyLCBpbkJ1ZmZlckxlbmd0aCk7CisgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyQ291bnQrKzsKKworICAgICAgICAgICAgICAgIGlmIChkZWNvZGVyRXJyICE9IE9LICYmIGRlY29kZXJFcnIgIT0gV09VTERfQkxPQ0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIm9uUXVldWVGaWxsZWQ6IEZMQUNEZWNvZGVyIHBhcnNlTWV0YURhdGEgcmV0dXJucyBlcnJvciAlZCIsIGRlY29kZXJFcnIpOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclN0cmVhbUNvcnJ1cHQsIGRlY29kZXJFcnIsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CisKKyAgICAgICAgICAgICAgICBpZiAoZGVjb2RlckVyciA9PSBXT1VMRF9CTE9DSykgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVN0cmVhbUluZm8gPSBtRkxBQ0RlY29kZXItPmdldFN0cmVhbUluZm8oKTsKKyAgICAgICAgICAgICAgICBtSGFzU3RyZWFtSW5mbyA9IHRydWU7CisKKyAgICAgICAgICAgICAgICAvLyBPbmx5IHNlbmQgb3V0IHBvcnQgc2V0dGluZ3MgY2hhbmdlZCBldmVudCBpZiBib3RoIHNhbXBsZSByYXRlCisgICAgICAgICAgICAgICAgLy8gYW5kIG51bUNoYW5uZWxzIGFyZSB2YWxpZC4KKyAgICAgICAgICAgICAgICBpZiAobVN0cmVhbUluZm8uc2FtcGxlX3JhdGUgJiYgbVN0cmVhbUluZm8uY2hhbm5lbHMpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIm9uUXVldWVGaWxsZWQ6IGluaXRpYWxseSBjb25maWd1cmluZyBkZWNvZGVyOiAlZCBIeiwgJWQgY2hhbm5lbHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbUluZm8uc2FtcGxlX3JhdGUsIG1TdHJlYW1JbmZvLmNoYW5uZWxzKTsKKworICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCwgMSwgMCwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBBV0FJVElOR19ESVNBQkxFRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0dXNfdCBkZWNvZGVyRXJyID0gbUZMQUNEZWNvZGVyLT5kZWNvZGVPbmVGcmFtZSgKKyAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXIsIGluQnVmZmVyTGVuZ3RoLCBvdXRCdWZmZXIsICZvdXRCdWZmZXJTaXplKTsKKyAgICAgICAgICAgIGlmIChkZWNvZGVyRXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIm9uUXVldWVGaWxsZWQ6IEZMQUNEZWNvZGVyIGRlY29kZU9uZUZyYW1lIHJldHVybnMgZXJyb3IgJWQiLCBkZWNvZGVyRXJyKTsKICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yU3RyZWFtQ29ycnVwdCwgZGVjb2RlckVyciwgTlVMTCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBtSW5wdXRCdWZmZXJDb3VudCsrOworICAgICAgICAgICAgdGltZVN0YW1wID0gaW5IZWFkZXItPm5UaW1lU3RhbXA7CiAgICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKICAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKICAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CiAKLSAgICAgICAgICAgIGlmIChkZWNvZGVyRXJyID09IFdPVUxEX0JMT0NLKSB7CisgICAgICAgICAgICBpZiAob3V0QnVmZmVyU2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIm5vIG91dHB1dCwgdHJ5aW5nIGFnYWluIik7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtU3RyZWFtSW5mbyA9IG1GTEFDRGVjb2Rlci0+Z2V0U3RyZWFtSW5mbygpOwotICAgICAgICAgICAgbUhhc1N0cmVhbUluZm8gPSB0cnVlOwotCi0gICAgICAgICAgICAvLyBPbmx5IHNlbmQgb3V0IHBvcnQgc2V0dGluZ3MgY2hhbmdlZCBldmVudCBpZiBib3RoIHNhbXBsZSByYXRlCi0gICAgICAgICAgICAvLyBhbmQgbnVtQ2hhbm5lbHMgYXJlIHZhbGlkLgotICAgICAgICAgICAgaWYgKG1TdHJlYW1JbmZvLnNhbXBsZV9yYXRlICYmIG1TdHJlYW1JbmZvLmNoYW5uZWxzKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0QoIm9uUXVldWVGaWxsZWQ6IGluaXRpYWxseSBjb25maWd1cmluZyBkZWNvZGVyOiAlZCBIeiwgJWQgY2hhbm5lbHMiLAotICAgICAgICAgICAgICAgICAgICBtU3RyZWFtSW5mby5zYW1wbGVfcmF0ZSwgbVN0cmVhbUluZm8uY2hhbm5lbHMpOwotCi0gICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIDEsIDAsIE5VTEwpOwotICAgICAgICAgICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBBV0FJVElOR19ESVNBQkxFRDsKKyAgICAgICAgfSBlbHNlIGlmIChtU2F3SW5wdXRFT1MpIHsKKyAgICAgICAgICAgIHN0YXR1c190IGRlY29kZXJFcnIgPSBtRkxBQ0RlY29kZXItPmRlY29kZU9uZUZyYW1lKE5VTEwsIDAsIG91dEJ1ZmZlciwgJm91dEJ1ZmZlclNpemUpOworICAgICAgICAgICAgbUZpbmlzaGVkRGVjb2RlciA9IHRydWU7CisgICAgICAgICAgICBpZiAoZGVjb2RlckVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJvblF1ZXVlRmlsbGVkOiBGTEFDRGVjb2RlciBmaW5pc2ggcmV0dXJucyBlcnJvciAlZCIsIGRlY29kZXJFcnIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JTdHJlYW1Db3JydXB0LCBkZWNvZGVyRXJyLCBOVUxMKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBzaG9ydCAqb3V0QnVmZmVyID0KLSAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHNob3J0ICo+KG91dEhlYWRlci0+cEJ1ZmZlciArIG91dEhlYWRlci0+bk9mZnNldCk7Ci0gICAgICAgIHNpemVfdCBvdXRCdWZmZXJTaXplID0gb3V0SGVhZGVyLT5uQWxsb2NMZW4gLSBvdXRIZWFkZXItPm5PZmZzZXQ7Ci0KLSAgICAgICAgc3RhdHVzX3QgZGVjb2RlckVyciA9IG1GTEFDRGVjb2Rlci0+ZGVjb2RlT25lRnJhbWUoCi0gICAgICAgICAgICAgICAgaW5CdWZmZXIsIGluQnVmZmVyTGVuZ3RoLCBvdXRCdWZmZXIsICZvdXRCdWZmZXJTaXplKTsKLSAgICAgICAgaWYgKGRlY29kZXJFcnIgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJvblF1ZXVlRmlsbGVkOiBGTEFDRGVjb2RlciBkZWNvZGVPbmVGcmFtZSByZXR1cm5zIGVycm9yICVkIiwgZGVjb2RlckVycik7Ci0gICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwotICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JTdHJlYW1Db3JydXB0LCBkZWNvZGVyRXJyLCBOVUxMKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIG1JbnB1dEJ1ZmZlckNvdW50Kys7Ci0gICAgICAgIGludDY0X3QgdHMgPSBpbkhlYWRlci0+blRpbWVTdGFtcDsKLSAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7Ci0gICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKLSAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKLQotICAgICAgICBpZiAoZW5kT2ZJbnB1dCkgewogICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7Ci0gICAgICAgIH0gZWxzZSBpZiAob3V0QnVmZmVyU2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gMDsKKyAgICAgICAgICAgIC8vIG5vIG1vcmUgaW5wdXQgYnVmZmVycyBhdCB0aGlzIHRpbWUsIGxvb3AgYW5kIHNlZSBpZiB0aGVyZSBpcyBtb3JlIG91dHB1dAorICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAogICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSBvdXRCdWZmZXJTaXplOwotICAgICAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPSB0czsKKyAgICAgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0gdGltZVN0YW1wOwogCiAgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CkBAIC00MDUsOSArNDI1LDEyIEBACiAKIHZvaWQgU29mdEZsYWNEZWNvZGVyOjpkcmFpbkRlY29kZXIoKSB7CiAgICAgbUZMQUNEZWNvZGVyLT5mbHVzaCgpOworICAgIG1TYXdJbnB1dEVPUyA9IGZhbHNlOworICAgIG1GaW5pc2hlZERlY29kZXIgPSBmYWxzZTsKIH0KIAogdm9pZCBTb2Z0RmxhY0RlY29kZXI6Om9uUmVzZXQoKSB7CisgICAgQUxPR1YoIm9uUmVzZXQiKTsKICAgICBkcmFpbkRlY29kZXIoKTsKIAogICAgIG1lbXNldCgmbVN0cmVhbUluZm8sIDAsIHNpemVvZihtU3RyZWFtSW5mbykpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL1NvZnRGbGFjRGVjb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL1NvZnRGbGFjRGVjb2Rlci5oCmluZGV4IDRhMjFjMzQuLmI2M2Y3YWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9Tb2Z0RmxhY0RlY29kZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvU29mdEZsYWNEZWNvZGVyLmgKQEAgLTUwLDExICs1MCwxMyBAQAogICAgICAgICBrTnVtT3V0cHV0QnVmZmVycyAgPSA0LAogICAgIH07CiAKLSAgICBzcDxGTEFDRGVjb2Rlcj4gbUZMQUNEZWNvZGVyOworICAgIEZMQUNEZWNvZGVyICptRkxBQ0RlY29kZXI7CiAgICAgRkxBQ19fU3RyZWFtTWV0YWRhdGFfU3RyZWFtSW5mbyBtU3RyZWFtSW5mbzsKLSAgICBib29sIG1IYXNTdHJlYW1JbmZvOwogICAgIHNpemVfdCBtSW5wdXRCdWZmZXJDb3VudDsKKyAgICBib29sIG1IYXNTdHJlYW1JbmZvOwogICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbVNhd0lucHV0RU9TOworICAgIGJvb2wgbUZpbmlzaGVkRGVjb2RlcjsKIAogICAgIGVudW0gewogICAgICAgICBOT05FLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL2V4cG9ydHMubGRzIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL2V4cG9ydHMubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNGYzZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvZXhwb3J0cy5sZHMKQEAgLTAsMCArMSw1IEBACit7CisgICAgZ2xvYmFsOgorICAgICAgICBfWjIyY3JlYXRlU29mdE9NWENvbXBvbmVudFBLY1BLMTZPTVhfQ0FMTEJBQ0tUWVBFUHZQUDE3T01YX0NPTVBPTkVOVFRZUEU7CisgICAgbG9jYWw6ICo7Cit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvQW5kcm9pZC5icAppbmRleCAwNjY5MTdiLi40NmI5NzRkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvQW5kcm9pZC5icApAQCAtMTAsNiArMTAsOCBAQAogCiAgICAgY2ZsYWdzOiBbIi1XZXJyb3IiXSwKIAorICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAorCiAgICAgc2FuaXRpemU6IHsKICAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCkBAIC0yMiw3ICsyNCw2IEBACiAgICAgfSwKIAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJtZWRpYV9vbXgiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidXRpbHMiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmNwcAppbmRleCA1NmQyZDY5Li5mZGM4OTc1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmNwcApAQCAtNTYsMTIgKzU2LDEzIEBACiAgICAgICBtQ29tcHJlc3Npb25MZXZlbChGTEFDX0NPTVBSRVNTSU9OX0xFVkVMX0RFRkFVTFQpLAogICAgICAgbUVuY29kZXJXcml0ZURhdGEoZmFsc2UpLAogICAgICAgbUVuY29kZXJSZXR1cm5lZEVuY29kZWREYXRhKGZhbHNlKSwKKyAgICAgIG1TYXdJbnB1dEVPUyhmYWxzZSksCisgICAgICBtU2VudE91dHB1dEVPUyhmYWxzZSksCiAgICAgICBtRW5jb2RlclJldHVybmVkTmJCeXRlcygwKSwKLSAgICAgIG1JbnB1dEJ1ZmZlclBjbTMyKE5VTEwpCi0jaWZkZWYgV1JJVEVfRkxBQ19IRUFERVJfSU5fRklSU1RfQlVGRkVSCi0gICAgICAsIG1IZWFkZXJPZmZzZXQoMCkKLSAgICAgICwgbVdyb3RlSGVhZGVyKGZhbHNlKQotI2VuZGlmCisgICAgICBtSW5wdXRCdWZmZXJQY20zMihOVUxMKSwKKyAgICAgIG1IZWFkZXJPZmZzZXQoMCksCisgICAgICBtSGVhZGVyQ29tcGxldGUoZmFsc2UpLAorICAgICAgbVdyb3RlSGVhZGVyKGZhbHNlKQogewogICAgIEFMT0dWKCJTb2Z0RmxhY0VuY29kZXI6OlNvZnRGbGFjRW5jb2RlcihuYW1lPSVzKSIsIG5hbWUpOwogICAgIGluaXRQb3J0cygpOwpAQCAtMzU0LDU1ICszNTUsNTUgQEAKICAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJmluUXVldWUgPSBnZXRQb3J0UXVldWUoMCk7CiAgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZvdXRRdWV1ZSA9IGdldFBvcnRRdWV1ZSgxKTsKIAotICAgIHdoaWxlICghaW5RdWV1ZS5lbXB0eSgpICYmICFvdXRRdWV1ZS5lbXB0eSgpKSB7Ci0gICAgICAgIEJ1ZmZlckluZm8gKmluSW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7Ci0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciA9IGluSW5mby0+bUhlYWRlcjsKKyAgICBGTEFDX19ib29sIG9rID0gdHJ1ZTsKKworICAgIHdoaWxlICgoIWluUXVldWUuZW1wdHkoKSB8fCBtU2F3SW5wdXRFT1MpICYmICFvdXRRdWV1ZS5lbXB0eSgpICYmICFtU2VudE91dHB1dEVPUykgeworICAgICAgICBpZiAoIWluUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgQnVmZmVySW5mbyAqaW5JbmZvID0gKmluUXVldWUuYmVnaW4oKTsKKyAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciA9IGluSW5mby0+bUhlYWRlcjsKKworICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigic2F3IEVPUyBvbiBidWZmZXIgb2Ygc2l6ZSAldSIsIGluSGVhZGVyLT5uRmlsbGVkTGVuKTsKKyAgICAgICAgICAgICAgICBtU2F3SW5wdXRFT1MgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5GaWxsZWRMZW4gPiBrTWF4SW5wdXRCdWZmZXJTaXplKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImlucHV0IGJ1ZmZlciB0b28gbGFyZ2UgKCVkKS4iLCBpbkhlYWRlci0+bkZpbGxlZExlbik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhc3NlcnQobU51bUNoYW5uZWxzICE9IDApOworICAgICAgICAgICAgbUVuY29kZXJXcml0ZURhdGEgPSB0cnVlOworICAgICAgICAgICAgbUVuY29kZXJSZXR1cm5lZEVuY29kZWREYXRhID0gZmFsc2U7CisgICAgICAgICAgICBtRW5jb2RlclJldHVybmVkTmJCeXRlcyA9IDA7CisgICAgICAgICAgICBtQ3VycmVudElucHV0VGltZVN0YW1wID0gaW5IZWFkZXItPm5UaW1lU3RhbXA7CisKKyAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIG5iSW5wdXRGcmFtZXMgPSBpbkhlYWRlci0+bkZpbGxlZExlbiAvICgyICogbU51bUNoYW5uZWxzKTsKKyAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIG5iSW5wdXRTYW1wbGVzID0gaW5IZWFkZXItPm5GaWxsZWRMZW4gLyAyOworICAgICAgICAgICAgY29uc3QgT01YX1MxNiAqIGNvbnN0IHBjbTE2ID0gcmVpbnRlcnByZXRfY2FzdDxPTVhfUzE2ICo+KGluSGVhZGVyLT5wQnVmZmVyKTsKKworICAgICAgICAgICAgQ0hFQ0tfTEUobmJJbnB1dFNhbXBsZXMsIDIgKiBrTWF4TnVtU2FtcGxlc1BlckZyYW1lKTsKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgaT0wIDsgaSA8IG5iSW5wdXRTYW1wbGVzIDsgaSsrKSB7CisgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyUGNtMzJbaV0gPSAoRkxBQ19faW50MzIpIHBjbTE2W2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoIiBhYm91dCB0byBlbmNvZGUgJXUgc2FtcGxlcyBwZXIgY2hhbm5lbCIsIG5iSW5wdXRGcmFtZXMpOworICAgICAgICAgICAgb2sgPSBGTEFDX19zdHJlYW1fZW5jb2Rlcl9wcm9jZXNzX2ludGVybGVhdmVkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFjU3RyZWFtRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXJQY20zMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYklucHV0RnJhbWVzIC8qc2FtcGxlcyBwZXIgY2hhbm5lbCovICk7CisKKyAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgaW5JbmZvID0gTlVMTDsKKyAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CisgICAgICAgICAgICBpbkhlYWRlciA9IE5VTEw7CisgICAgICAgIH0KIAogICAgICAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7CiAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIgPSBvdXRJbmZvLT5tSGVhZGVyOwogCi0gICAgICAgIGlmIChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSB7Ci0gICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7Ci0gICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKLSAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7Ci0KLSAgICAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IDA7Ci0gICAgICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IE9NWF9CVUZGRVJGTEFHX0VPUzsKLQotICAgICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7Ci0gICAgICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7Ci0gICAgICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOwotCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaW5IZWFkZXItPm5GaWxsZWRMZW4gPiBrTWF4SW5wdXRCdWZmZXJTaXplKSB7Ci0gICAgICAgICAgICBBTE9HRSgiaW5wdXQgYnVmZmVyIHRvbyBsYXJnZSAoJWQpLiIsIGluSGVhZGVyLT5uRmlsbGVkTGVuKTsKLSAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7Ci0gICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnQobU51bUNoYW5uZWxzICE9IDApOwotICAgICAgICBtRW5jb2RlcldyaXRlRGF0YSA9IHRydWU7Ci0gICAgICAgIG1FbmNvZGVyUmV0dXJuZWRFbmNvZGVkRGF0YSA9IGZhbHNlOwotICAgICAgICBtRW5jb2RlclJldHVybmVkTmJCeXRlcyA9IDA7Ci0gICAgICAgIG1DdXJyZW50SW5wdXRUaW1lU3RhbXAgPSBpbkhlYWRlci0+blRpbWVTdGFtcDsKLQotICAgICAgICBjb25zdCB1bnNpZ25lZCBuYklucHV0RnJhbWVzID0gaW5IZWFkZXItPm5GaWxsZWRMZW4gLyAoMiAqIG1OdW1DaGFubmVscyk7Ci0gICAgICAgIGNvbnN0IHVuc2lnbmVkIG5iSW5wdXRTYW1wbGVzID0gaW5IZWFkZXItPm5GaWxsZWRMZW4gLyAyOwotICAgICAgICBjb25zdCBPTVhfUzE2ICogY29uc3QgcGNtMTYgPSByZWludGVycHJldF9jYXN0PE9NWF9TMTYgKj4oaW5IZWFkZXItPnBCdWZmZXIpOwotCi0gICAgICAgIENIRUNLX0xFKG5iSW5wdXRTYW1wbGVzLCAyICoga01heE51bVNhbXBsZXNQZXJGcmFtZSk7Ci0gICAgICAgIGZvciAodW5zaWduZWQgaT0wIDsgaSA8IG5iSW5wdXRTYW1wbGVzIDsgaSsrKSB7Ci0gICAgICAgICAgICBtSW5wdXRCdWZmZXJQY20zMltpXSA9IChGTEFDX19pbnQzMikgcGNtMTZbaV07Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoIiBhYm91dCB0byBlbmNvZGUgJXUgc2FtcGxlcyBwZXIgY2hhbm5lbCIsIG5iSW5wdXRGcmFtZXMpOwotICAgICAgICBGTEFDX19ib29sIG9rID0gRkxBQ19fc3RyZWFtX2VuY29kZXJfcHJvY2Vzc19pbnRlcmxlYXZlZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFjU3RyZWFtRW5jb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlclBjbTMyLAotICAgICAgICAgICAgICAgICAgICAgICAgbmJJbnB1dEZyYW1lcyAvKnNhbXBsZXMgcGVyIGNoYW5uZWwqLyApOwotCiAgICAgICAgIGlmIChvaykgewogICAgICAgICAgICAgaWYgKG1FbmNvZGVyUmV0dXJuZWRFbmNvZGVkRGF0YSAmJiAobUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMgIT0gMCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiIGRlcXVldWVpbmcgYnVmZmVyIG9uIG91dHB1dCBwb3J0IGFmdGVyIHdyaXRpbmcgZGF0YSIpOwpAQCAtNDE0LDYgKzQxNSwyMSBAQAogICAgICAgICAgICAgICAgIG1FbmNvZGVyUmV0dXJuZWRFbmNvZGVkRGF0YSA9IGZhbHNlOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBBTE9HVigiIGVuY29kZXIgcHJvY2Vzc19pbnRlcmxlYXZlZCByZXR1cm5lZCB3aXRob3V0IGRhdGEgdG8gd3JpdGUiKTsKKyAgICAgICAgICAgICAgICBpZiAobVNhd0lucHV0RU9TKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJmaW5pc2hpbmcgZW5jb2RlciIpOworICAgICAgICAgICAgICAgICAgICBtU2VudE91dHB1dEVPUyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIEZMQUNfX3N0cmVhbV9lbmNvZGVyX2ZpbmlzaChtRmxhY1N0cmVhbUVuY29kZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAobUVuY29kZXJSZXR1cm5lZEVuY29kZWREYXRhICYmIChtRW5jb2RlclJldHVybmVkTmJCeXRlcyAhPSAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiBkZXF1ZXVlaW5nIHJlc2lkdWFsIGJ1ZmZlciBvbiBvdXRwdXQgcG9ydCBhZnRlciB3cml0aW5nIGRhdGEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0SW5mbyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IE9NWF9CVUZGRVJGTEFHX0VPUzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRIZWFkZXIgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgbUVuY29kZXJSZXR1cm5lZEVuY29kZWREYXRhID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HRSgiIGVycm9yIGVuY291bnRlcmVkIGR1cmluZyBlbmNvZGluZyIpOwpAQCAtNDIyLDExICs0MzgsNiBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7Ci0gICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKLSAgICAgICAgaW5JbmZvID0gTlVMTDsKLSAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKLSAgICAgICAgaW5IZWFkZXIgPSBOVUxMOwogICAgIH0KIH0KIApAQCAtNDM4LDE2ICs0NDksMjIgQEAKICAgICBBTE9HVigiU29mdEZsYWNFbmNvZGVyOjpvbkVuY29kZWRGbGFjQXZhaWxhYmxlKGJ5dGVzPSV6dSwgc2FtcGxlcz0ldSwgY3Vycl9mcmFtZT0ldSkiLAogICAgICAgICAgICAgYnl0ZXMsIHNhbXBsZXMsIGN1cnJlbnRfZnJhbWUpOwogCi0jaWZkZWYgV1JJVEVfRkxBQ19IRUFERVJfSU5fRklSU1RfQlVGRkVSCiAgICAgaWYgKHNhbXBsZXMgPT0gMCkgewotICAgICAgICBBTE9HSSgiIHNhdmluZyAlenUgYnl0ZXMgb2YgaGVhZGVyIiwgYnl0ZXMpOwotICAgICAgICBtZW1jcHkobUhlYWRlciArIG1IZWFkZXJPZmZzZXQsIGJ1ZmZlciwgYnl0ZXMpOwotICAgICAgICBtSGVhZGVyT2Zmc2V0ICs9IGJ5dGVzOy8vIHdpbGwgY29udGFpbiBoZWFkZXIgc2l6ZSB3aGVuIGZpbmlzaGVkIHJlY2VpdmluZyBoZWFkZXIKKyAgICAgICAgQUxPR1YoInNhdmluZyAlenUgYnl0ZXMgb2YgaGVhZGVyIiwgYnl0ZXMpOworICAgICAgICBpZiAobUhlYWRlck9mZnNldCArIGJ5dGVzID4gc2l6ZW9mKG1IZWFkZXIpIHx8IG1IZWFkZXJDb21wbGV0ZSkgeworICAgICAgICAgICAgQUxPR1coImhlYWRlciBpcyB0b28gYmlnLCBvciBoZWFkZXIgYWxyZWFkeSByZWNlaXZlZCIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbWNweShtSGVhZGVyICsgbUhlYWRlck9mZnNldCwgYnVmZmVyLCBieXRlcyk7CisgICAgICAgICAgICBtSGVhZGVyT2Zmc2V0ICs9IGJ5dGVzOy8vIHdpbGwgY29udGFpbiBoZWFkZXIgc2l6ZSB3aGVuIGZpbmlzaGVkIHJlY2VpdmluZyBoZWFkZXIKKyAgICAgICAgICAgIGlmIChidWZmZXJbMF0gJiAweDgwKSB7CisgICAgICAgICAgICAgICAgbUhlYWRlckNvbXBsZXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICByZXR1cm4gRkxBQ19fU1RSRUFNX0VOQ09ERVJfV1JJVEVfU1RBVFVTX09LOwogICAgIH0KIAotI2VuZGlmCi0KICAgICBpZiAoKHNhbXBsZXMgPT0gMCkgfHwgIW1FbmNvZGVyV3JpdGVEYXRhKSB7CiAgICAgICAgIC8vIGNhbGxlZCBieSB0aGUgZW5jb2RlciBiZWNhdXNlIHRoZXJlJ3MgaGVhZGVyIGRhdGEgdG8gc2F2ZSwgYnV0IGl0J3Mgbm90IHRoZSByb2xlCiAgICAgICAgIC8vIG9mIHRoaXMgY29tcG9uZW50ICh1bmxlc3MgV1JJVEVfRkxBQ19IRUFERVJfSU5fRklSU1RfQlVGRkVSIGlzIGRlZmluZWQpCkBAIC00NjAsMTYgKzQ3NywyMyBAQAogICAgIEJ1ZmZlckluZm8gKm91dEluZm8gPSAqb3V0UXVldWUuYmVnaW4oKTsKICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyID0gb3V0SW5mby0+bUhlYWRlcjsKIAotI2lmZGVmIFdSSVRFX0ZMQUNfSEVBREVSX0lOX0ZJUlNUX0JVRkZFUgotICAgIGlmICghbVdyb3RlSGVhZGVyKSB7Ci0gICAgICAgIEFMT0dJKCIgd3JpdGluZyAlZCBieXRlcyBvZiBoZWFkZXIgb24gb3V0cHV0IHBvcnQiLCBtSGVhZGVyT2Zmc2V0KTsKKyAgICBpZiAobUhlYWRlckNvbXBsZXRlICYmICFtV3JvdGVIZWFkZXIpIHsKKyAgICAgICAgQUxPR1YoIiB3cml0aW5nICVkIGJ5dGVzIG9mIGhlYWRlciBvbiBvdXRwdXQgcG9ydCIsIG1IZWFkZXJPZmZzZXQpOwogICAgICAgICBtZW1jcHkob3V0SGVhZGVyLT5wQnVmZmVyICsgb3V0SGVhZGVyLT5uT2Zmc2V0ICsgb3V0SGVhZGVyLT5uRmlsbGVkTGVuLAogICAgICAgICAgICAgICAgIG1IZWFkZXIsIG1IZWFkZXJPZmZzZXQpOwogICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gKz0gbUhlYWRlck9mZnNldDsKLSAgICAgICAgb3V0SGVhZGVyLT5uT2Zmc2V0ICAgICs9IG1IZWFkZXJPZmZzZXQ7CiAgICAgICAgIG1Xcm90ZUhlYWRlciA9IHRydWU7CisgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CisgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUc7CisgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7CisgICAgICAgIG91dEluZm8gPSBOVUxMOworICAgICAgICBvdXRIZWFkZXIgPSBOVUxMOworICAgICAgICAvLyBnZXQgdGhlIG5leHQgYnVmZmVyIGZvciB0aGUgcmVzdCBvZiB0aGUgZGF0YQorICAgICAgICBDSEVDSyghb3V0UXVldWUuZW1wdHkoKSk7CisgICAgICAgIG91dEluZm8gPSAqb3V0UXVldWUuYmVnaW4oKTsKKyAgICAgICAgb3V0SGVhZGVyID0gb3V0SW5mby0+bUhlYWRlcjsKICAgICB9Ci0jZW5kaWYKIAogICAgIC8vIHdyaXRlIGVuY29kZWQgZGF0YQogICAgIEFMT0dWKCIgd3JpdGluZyAlenUgYnl0ZXMgb2YgZW5jb2RlZCBkYXRhIG9uIG91dHB1dCBwb3J0IiwgYnl0ZXMpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5oCmluZGV4IGY0ZjA2NTUuLjY0YTZiMWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmgKQEAgLTIyLDEwICsyMiw2IEBACiAKICNpbmNsdWRlICJGTEFDL3N0cmVhbV9lbmNvZGVyLmgiCiAKLS8vIHVzZSB0aGlzIHN5bWJvbCB0byBoYXZlIHRoZSBmaXJzdCBvdXRwdXQgYnVmZmVyIHN0YXJ0IHdpdGggRkxBQyBmcmFtZSBoZWFkZXIgc28gYSBkdW1wIG9mCi0vLyBhbGwgdGhlIG91dHB1dCBidWZmZXJzIGNhbiBiZSBvcGVuZWQgYXMgYSAuZmxhYyBmaWxlCi0vLyNkZWZpbmUgV1JJVEVfRkxBQ19IRUFERVJfSU5fRklSU1RfQlVGRkVSCi0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IFNvZnRGbGFjRW5jb2RlciA6IHB1YmxpYyBTaW1wbGVTb2Z0T01YQ29tcG9uZW50IHsKQEAgLTYyLDYgKzU4LDggQEAKICAgICAvLyBzaG91bGQgdGhlIGRhdGEgcmVjZWl2ZWQgYnkgdGhlIGNhbGxiYWNrIGJlIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBwb3J0CiAgICAgYm9vbCAgICAgICAgbUVuY29kZXJXcml0ZURhdGE7CiAgICAgYm9vbCAgICAgICAgbUVuY29kZXJSZXR1cm5lZEVuY29kZWREYXRhOworICAgIGJvb2wgICAgICAgIG1TYXdJbnB1dEVPUzsKKyAgICBib29sICAgICAgICBtU2VudE91dHB1dEVPUzsKICAgICBzaXplX3QgICAgICBtRW5jb2RlclJldHVybmVkTmJCeXRlczsKICAgICBPTVhfVElDS1MgIG1DdXJyZW50SW5wdXRUaW1lU3RhbXA7CiAKQEAgLTg1LDExICs4MywxMCBAQAogICAgIC8vIGJlZm9yZSBwYXNzaW5nIHRoZSBpbnB1dCBkYXRhIHRvIHRoZSBlbmNvZGVyCiAgICAgRkxBQ19faW50MzIqIG1JbnB1dEJ1ZmZlclBjbTMyOwogCi0jaWZkZWYgV1JJVEVfRkxBQ19IRUFERVJfSU5fRklSU1RfQlVGRkVSCiAgICAgdW5zaWduZWQgbUhlYWRlck9mZnNldDsKKyAgICBib29sIG1IZWFkZXJDb21wbGV0ZTsKICAgICBib29sIG1Xcm90ZUhlYWRlcjsKICAgICBjaGFyIG1IZWFkZXJbMTI4XTsKLSNlbmRpZgogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU29mdEZsYWNFbmNvZGVyKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvZXhwb3J0cy5sZHMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvZXhwb3J0cy5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI0ZjNmYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9leHBvcnRzLmxkcwpAQCAtMCwwICsxLDUgQEAKK3sKKyAgICBnbG9iYWw6CisgICAgICAgIF9aMjJjcmVhdGVTb2Z0T01YQ29tcG9uZW50UEtjUEsxNk9NWF9DQUxMQkFDS1RZUEVQdlBQMTdPTVhfQ09NUE9ORU5UVFlQRTsKKyAgICBsb2NhbDogKjsKK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9BbmRyb2lkLmJwCmluZGV4IGZmZjcyYTguLjNkOTdkOGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9BbmRyb2lkLmJwCkBAIC0xMyw3ICsxMyw3IEBACiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJtZWRpYV9vbXgiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlibG9nIiwKQEAgLTIxLDYgKzIxLDggQEAKIAogICAgIGNmbGFnczogWyItV2Vycm9yIl0sCiAKKyAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKKwogICAgIHNhbml0aXplOiB7CiAgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL2V4cG9ydHMubGRzIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL2V4cG9ydHMubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNGYzZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvZXhwb3J0cy5sZHMKQEAgLTAsMCArMSw1IEBACit7CisgICAgZ2xvYmFsOgorICAgICAgICBfWjIyY3JlYXRlU29mdE9NWENvbXBvbmVudFBLY1BLMTZPTVhfQ0FMTEJBQ0tUWVBFUHZQUDE3T01YX0NPTVBPTkVOVFRZUEU7CisgICAgbG9jYWw6ICo7Cit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL0FuZHJvaWQuYnAKaW5kZXggNzUzZWVlZi4uMWMzMjA4YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9BbmRyb2lkLmJwCkBAIC0xNSw2ICsxNSw4IEBACiAKICAgICBjZmxhZ3M6IFsiLVdlcnJvciJdLAogCisgICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCisKICAgICBzYW5pdGl6ZTogewogICAgICAgICBtaXNjX3VuZGVmaW5lZDogWwogICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKQEAgLTI3LDcgKzI5LDcgQEAKICAgICB9LAogCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYm1lZGlhX29teCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvZXhwb3J0cy5sZHMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9leHBvcnRzLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjRmM2ZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvZXhwb3J0cy5sZHMKQEAgLTAsMCArMSw1IEBACit7CisgICAgZ2xvYmFsOgorICAgICAgICBfWjIyY3JlYXRlU29mdE9NWENvbXBvbmVudFBLY1BLMTZPTVhfQ0FMTEJBQ0tUWVBFUHZQUDE3T01YX0NPTVBPTkVOVFRZUEU7CisgICAgbG9jYWw6ICo7Cit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL0FuZHJvaWQuYnAKaW5kZXggN2ZhNzRkNC4uNDU5MjBlNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9BbmRyb2lkLmJwCkBAIC04LDYgKzgsMTQgQEAKICAgICBzdGF0aWNfbGliczogWyJsaWJoZXZjZGVjIl0sCiAgICAgc3JjczogWyJTb2Z0SEVWQy5jcHAiXSwKIAorICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV25vLXVudXNlZC12YXJpYWJsZSIsCisgICAgXSwKKworICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAorCiAgICAgaW5jbHVkZV9kaXJzOiBbCiAgICAgICAgICJleHRlcm5hbC9saWJoZXZjL2RlY29kZXIiLAogICAgICAgICAiZXh0ZXJuYWwvbGliaGV2Yy9jb21tb24iLApAQCAtMjYsNyArMzQsNiBAQAogICAgIH0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlibWVkaWFfb214IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnV0aWxzIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL1NvZnRIRVZDLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL1NvZnRIRVZDLmNwcAppbmRleCAxMDNmYzIyLi5iYjdkMzYxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9Tb2Z0SEVWQy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvU29mdEhFVkMuY3BwCkBAIC00OCw3ICs0OCw4IEBACiAgICAgICAgIChJVkRfQ09OVFJPTF9BUElfQ09NTUFORF9UWVBFX1QpSUhFVkNEX0NYQV9DTURfQ1RMX1NFVF9OVU1fQ09SRVMKIAogc3RhdGljIGNvbnN0IENvZGVjUHJvZmlsZUxldmVsIGtQcm9maWxlTGV2ZWxzW10gPSB7Ci0gICAgeyBPTVhfVklERU9fSEVWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWw1MSB9LAorICAgIHsgT01YX1ZJREVPX0hFVkNQcm9maWxlTWFpbiwgICAgICBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWw1MSB9LAorICAgIHsgT01YX1ZJREVPX0hFVkNQcm9maWxlTWFpblN0aWxsLCBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWw1MSB9LAogfTsKIAogU29mdEhFVkM6OlNvZnRIRVZDKApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvZXhwb3J0cy5sZHMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9leHBvcnRzLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjRmM2ZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvZXhwb3J0cy5sZHMKQEAgLTAsMCArMSw1IEBACit7CisgICAgZ2xvYmFsOgorICAgICAgICBfWjIyY3JlYXRlU29mdE9NWENvbXBvbmVudFBLY1BLMTZPTVhfQ0FMTEJBQ0tUWVBFUHZQUDE3T01YX0NPTVBPTkVOVFRZUEU7CisgICAgbG9jYWw6ICo7Cit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9BbmRyb2lkLmJwCmluZGV4IDEyMTZhZTUuLmNhNzBjYzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL0FuZHJvaWQuYnAKQEAgLTUzLDYgKzUzLDggQEAKICAgICAgICAgIi1XZXJyb3IiLAogICAgIF0sCiAKKyAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKKwogICAgIHNhbml0aXplOiB7CiAgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLApAQCAtOTMsNyArOTUsNiBAQAogICAgIHN0YXRpY19saWJzOiBbImxpYnN0YWdlZnJpZ2h0X200dmgyNjNkZWMiXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJtZWRpYV9vbXgiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidXRpbHMiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9Tb2Z0TVBFRzQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9Tb2Z0TVBFRzQuY3BwCmluZGV4IDM5YjY3YWIuLmZkYTcwMjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL1NvZnRNUEVHNC5jcHAKQEAgLTM1Myw3ICszNTMsOCBAQAogICAgIGJvb2wgcG9ydFdpbGxSZXNldCA9IGZhbHNlOwogICAgIGNvbnN0IGJvb2wgZmFrZVN0cmlkZSA9IHRydWU7CiAgICAgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6aGFuZGxlUG9ydFNldHRpbmdzQ2hhbmdlKAotICAgICAgICAgICAgJnBvcnRXaWxsUmVzZXQsIGJ1Zl93aWR0aCwgYnVmX2hlaWdodCwgY3JvcFNldHRpbmdzTW9kZSwgZmFrZVN0cmlkZSk7CisgICAgICAgICAgICAmcG9ydFdpbGxSZXNldCwgYnVmX3dpZHRoLCBidWZfaGVpZ2h0LAorICAgICAgICAgICAgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hciwgY3JvcFNldHRpbmdzTW9kZSwgZmFrZVN0cmlkZSk7CiAgICAgaWYgKHBvcnRXaWxsUmVzZXQpIHsKICAgICAgICAgaWYgKG1Nb2RlID09IE1PREVfSDI2MykgewogICAgICAgICAgICAgUFZDbGVhblVwVmlkZW9EZWNvZGVyKG1IYW5kbGUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9leHBvcnRzLmxkcyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvZXhwb3J0cy5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI0ZjNmYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvZXhwb3J0cy5sZHMKQEAgLTAsMCArMSw1IEBACit7CisgICAgZ2xvYmFsOgorICAgICAgICBfWjIyY3JlYXRlU29mdE9NWENvbXBvbmVudFBLY1BLMTZPTVhfQ0FMTEJBQ0tUWVBFUHZQUDE3T01YX0NPTVBPTkVOVFRZUEU7CisgICAgbG9jYWw6ICo7Cit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9BbmRyb2lkLmJwCmluZGV4IDY0MDcxOGQuLjZiZTQwMzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL0FuZHJvaWQuYnAKQEAgLTQsOCArNCw3IEBACiAKICAgICBzcmNzOiBbCiAgICAgICAgICJzcmMvYml0c3RyZWFtX2lvLmNwcCIsCi0gICAgICAgICJzcmMvY29tYmluZWRfZW5jb2RlLmNwcCIsCi0gICAgICAgICJzcmMvZGF0YXBhcnRfZW5jb2RlLmNwcCIsCisgICAgICAgICJzcmMvY29tYmluZWRfZW5jb2RlLmNwcCIsICJzcmMvZGF0YXBhcnRfZW5jb2RlLmNwcCIsCiAgICAgICAgICJzcmMvZGN0LmNwcCIsCiAgICAgICAgICJzcmMvZmluZGhhbGZwZWwuY3BwIiwKICAgICAgICAgInNyYy9mYXN0Y29kZW1iLmNwcCIsCkBAIC0zMSw2ICszMCw4IEBACiAgICAgICAgICItV2Vycm9yIiwKICAgICBdLAogCisgICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCisKICAgICBpbmNsdWRlX2RpcnM6IFsKICAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCiAgICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLApAQCAtODAsNyArODEsNyBAQAogICAgIHN0YXRpY19saWJzOiBbImxpYnN0YWdlZnJpZ2h0X200dmgyNjNlbmMiXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJtZWRpYV9vbXgiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlibG9nIiwKQEAgLTExMiw2ICsxMTMsOCBAQAogICAgICAgICAiLURPU0NMX0VYUE9SVF9SRUY9IiwKICAgICAgICAgIi1ET1NDTF9JTVBPUlRfUkVGPSIsCiAgICAgICAgICItREJYX1JDIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAogICAgIF0sCiAKICAgICBzYW5pdGl6ZTogewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9leHBvcnRzLmxkcyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvZXhwb3J0cy5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI0ZjNmYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvZXhwb3J0cy5sZHMKQEAgLTAsMCArMSw1IEBACit7CisgICAgZ2xvYmFsOgorICAgICAgICBfWjIyY3JlYXRlU29mdE9NWENvbXBvbmVudFBLY1BLMTZPTVhfQ0FMTEJBQ0tUWVBFUHZQUDE3T01YX0NPTVBPTkVOVFRZUEU7CisgICAgbG9jYWw6ICo7Cit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9BbmRyb2lkLmJwCmluZGV4IDI3M2ZhMzEuLjlmYTlhNGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL0FuZHJvaWQuYnAKQEAgLTY1LDggKzY1LDExIEBACiAgICAgfSwKIAogICAgIGluY2x1ZGVfZGlyczogWyJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiXSwKLSAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsic3JjIl0sCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICAgICAgInNyYyIsCisgICAgXSwKIAogICAgIGNmbGFnczogWwogICAgICAgICAiLURPU0NMX1VOVVNFRF9BUkcoeCk9KHZvaWQpKHgpIiwKQEAgLTk2LDYgKzk5LDggQEAKIAogICAgIGNmbGFnczogWyItV2Vycm9yIl0sCiAKKyAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKKwogICAgIHNhbml0aXplOiB7CiAgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLApAQCAtMTA3LDcgKzExMiw2IEBACiAgICAgfSwKIAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJtZWRpYV9vbXgiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidXRpbHMiLApAQCAtMTI4LDYgKzEzMiw4IEBACiAgICAgICAgICJ0ZXN0L21wM3JlYWRlci5jcHAiLAogICAgIF0sCiAKKyAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAorCiAgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCiAgICAgICAgICJzcmMiLAogICAgICAgICAiaW5jbHVkZSIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL2V4cG9ydHMubGRzIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9leHBvcnRzLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjRmM2ZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9leHBvcnRzLmxkcwpAQCAtMCwwICsxLDUgQEAKK3sKKyAgICBnbG9iYWw6CisgICAgICAgIF9aMjJjcmVhdGVTb2Z0T01YQ29tcG9uZW50UEtjUEsxNk9NWF9DQUxMQkFDS1RZUEVQdlBQMTdPTVhfQ09NUE9ORU5UVFlQRTsKKyAgICBsb2NhbDogKjsKK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9BbmRyb2lkLmJwCmluZGV4IDE1ZmRkZTcuLmZiMGRiOGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9BbmRyb2lkLmJwCkBAIC04LDYgKzgsMTQgQEAKICAgICBzdGF0aWNfbGliczogWyJsaWJtcGVnMmRlYyJdLAogICAgIHNyY3M6IFsiU29mdE1QRUcyLmNwcCJdLAogCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1Xbm8tdW51c2VkLXZhcmlhYmxlIiwKKyAgICBdLAorCisgICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCisKICAgICBpbmNsdWRlX2RpcnM6IFsKICAgICAgICAgImV4dGVybmFsL2xpYm1wZWcyL2RlY29kZXIiLAogICAgICAgICAiZXh0ZXJuYWwvbGlibXBlZzIvY29tbW9uIiwKQEAgLTE2LDcgKzI0LDYgQEAKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYm1lZGlhX29teCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1dGlscyIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvZXhwb3J0cy5sZHMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvZXhwb3J0cy5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI0ZjNmYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9leHBvcnRzLmxkcwpAQCAtMCwwICsxLDUgQEAKK3sKKyAgICBnbG9iYWw6CisgICAgICAgIF9aMjJjcmVhdGVTb2Z0T01YQ29tcG9uZW50UEtjUEsxNk9NWF9DQUxMQkFDS1RZUEVQdlBQMTdPTVhfQ09NUE9ORU5UVFlQRTsKKyAgICBsb2NhbDogKjsKK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvQW5kcm9pZC5icAppbmRleCA1OWMxZjVkLi44YTkzOTlhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL0FuZHJvaWQuYnAKQEAgLTE1LDcgKzE1LDYgQEAKICAgICBzdGF0aWNfbGliczogWyJsaWJ2cHgiXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJtZWRpYV9vbXgiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidXRpbHMiLApAQCAtMjQsNiArMjMsOCBAQAogCiAgICAgY2ZsYWdzOiBbIi1XZXJyb3IiXSwKIAorICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAorCiAgICAgc2FuaXRpemU6IHsKICAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguY3BwCmluZGV4IDM0OTAwMDguLjhkNWYzZTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguY3BwCkBAIC0zMCw3ICszMCw5IEBACiAKIC8vIE9ubHkgbmVlZCB0byBkZWNsYXJlIHRoZSBoaWdoZXN0IHN1cHBvcnRlZCBwcm9maWxlIGFuZCBsZXZlbCBoZXJlLgogc3RhdGljIGNvbnN0IENvZGVjUHJvZmlsZUxldmVsIGtWUDlQcm9maWxlTGV2ZWxzW10gPSB7Ci0gICAgeyBPTVhfVklERU9fVlA5UHJvZmlsZTAsIE9NWF9WSURFT19WUDlMZXZlbDUgIH0sCisgICAgeyBPTVhfVklERU9fVlA5UHJvZmlsZTAsIE9NWF9WSURFT19WUDlMZXZlbDUgfSwKKyAgICB7IE9NWF9WSURFT19WUDlQcm9maWxlMiwgT01YX1ZJREVPX1ZQOUxldmVsNSB9LAorICAgIHsgT01YX1ZJREVPX1ZQOVByb2ZpbGUySERSLCBPTVhfVklERU9fVlA5TGV2ZWw1IH0sCiB9OwogCiBTb2Z0VlBYOjpTb2Z0VlBYKApAQCAtNzgsNiArODAsMTAgQEAKICAgICByZXR1cm4gY3B1Q29yZUNvdW50OwogfQogCitib29sIFNvZnRWUFg6OnN1cHBvcnREZXNjcmliZUhkclN0YXRpY0luZm8oKSB7CisgICAgcmV0dXJuIHRydWU7Cit9CisKIHN0YXR1c190IFNvZnRWUFg6OmluaXREZWNvZGVyKCkgewogICAgIG1DdHggPSBuZXcgdnB4X2NvZGVjX2N0eF90OwogICAgIHZweF9jb2RlY19lcnJfdCB2cHhfZXJyOwpAQCAtMTQ2LDE1ICsxNTIsMjEgQEAKICAgICAgICAgdWludDMyX3QgaGVpZ2h0ID0gbUltZy0+ZF9oOwogICAgICAgICBvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7CiAgICAgICAgIG91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7Ci0gICAgICAgIENIRUNLX0VRKG1JbWctPmZtdCwgVlBYX0lNR19GTVRfSTQyMCk7Ci0gICAgICAgIGhhbmRsZVBvcnRTZXR0aW5nc0NoYW5nZShwb3J0V2lsbFJlc2V0LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgQ0hFQ0sobUltZy0+Zm10ID09IFZQWF9JTUdfRk1UX0k0MjAgfHwgbUltZy0+Zm10ID09IFZQWF9JTUdfRk1UX0k0MjAxNik7CisgICAgICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIG91dHB1dENvbG9yRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjsKKyAgICAgICAgaW50MzJfdCBicHAgPSAxOworICAgICAgICBpZiAobUltZy0+Zm10ID09IFZQWF9JTUdfRk1UX0k0MjAxNikgeworICAgICAgICAgICAgb3V0cHV0Q29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyMTY7CisgICAgICAgICAgICBicHAgPSAyOworICAgICAgICB9CisgICAgICAgIGhhbmRsZVBvcnRTZXR0aW5nc0NoYW5nZShwb3J0V2lsbFJlc2V0LCB3aWR0aCwgaGVpZ2h0LCBvdXRwdXRDb2xvckZvcm1hdCk7CiAgICAgICAgIGlmICgqcG9ydFdpbGxSZXNldCkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KIAogICAgICAgICBvdXRIZWFkZXItPm5PZmZzZXQgPSAwOwogICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IDA7Ci0gICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IChvdXRwdXRCdWZmZXJXaWR0aCgpICogb3V0cHV0QnVmZmVySGVpZ2h0KCkgKiAzKSAvIDI7CisgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IChvdXRwdXRCdWZmZXJXaWR0aCgpICogb3V0cHV0QnVmZmVySGVpZ2h0KCkgKiBicHAgKiAzKSAvIDI7CiAgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9ICooT01YX1RJQ0tTICopbUltZy0+dXNlcl9wcml2OwogICAgICAgICBpZiAob3V0cHV0QnVmZmVyU2FmZShvdXRIZWFkZXIpKSB7CiAgICAgICAgICAgICB1aW50OF90ICpkc3QgPSBvdXRIZWFkZXItPnBCdWZmZXI7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmgKaW5kZXggZDZiYjkwMi4uYjYyYjUyNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguaApAQCAtNDAsMTAgKzQwLDExIEBACiAgICAgdmlydHVhbCB2b2lkIG9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpOwogICAgIHZpcnR1YWwgdm9pZCBvblBvcnRGbHVzaENvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCk7CiAgICAgdmlydHVhbCB2b2lkIG9uUmVzZXQoKTsKKyAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydERlc2NyaWJlSGRyU3RhdGljSW5mbygpOwogCiBwcml2YXRlOgogICAgIGVudW0gewotICAgICAgICBrTnVtQnVmZmVycyA9IDQKKyAgICAgICAga051bUJ1ZmZlcnMgPSAxMAogICAgIH07CiAKICAgICBlbnVtIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL2V4cG9ydHMubGRzIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvZXhwb3J0cy5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI0ZjNmYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL2V4cG9ydHMubGRzCkBAIC0wLDAgKzEsNSBAQAoreworICAgIGdsb2JhbDoKKyAgICAgICAgX1oyMmNyZWF0ZVNvZnRPTVhDb21wb25lbnRQS2NQSzE2T01YX0NBTExCQUNLVFlQRVB2UFAxN09NWF9DT01QT05FTlRUWVBFOworICAgIGxvY2FsOiAqOworfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9BbmRyb2lkLmJwCmluZGV4IDc0MTc3NGMuLjNkOWZlZWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvQW5kcm9pZC5icApAQCAtMTEsNiArMTEsMTAgQEAKICAgICAgICAgIlNvZnRWUDlFbmNvZGVyLmNwcCIsCiAgICAgXSwKIAorICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIl0sCisKKyAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKKwogICAgIGluY2x1ZGVfZGlyczogWwogICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKICAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCkBAIC0zMCw3ICszNCw2IEBACiAgICAgc3RhdGljX2xpYnM6IFsibGlidnB4Il0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlibWVkaWFfb214IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnV0aWxzIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUDlFbmNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUDlFbmNvZGVyLmNwcAppbmRleCA0YzcyOTBkLi4xZWExYzg1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlA5RW5jb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQOUVuY29kZXIuY3BwCkBAIC02OSw2ICs2OSwxMyBAQAogICAgICAgICAgICAgICBjb2RlY1JldHVybik7CiAgICAgICAgIHJldHVybiBjb2RlY1JldHVybjsKICAgICB9CisgICAgY29kZWNSZXR1cm4gPSB2cHhfY29kZWNfY29udHJvbChtQ29kZWNDb250ZXh0LCBWUDlFX1NFVF9ST1dfTVQsIDEpOworICAgIGlmIChjb2RlY1JldHVybiAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIHNldHRpbmcgVlA5RV9TRVRfUk9XX01UIHRvIDEuIHZweF9jb2RlY19jb250cm9sKCkgIgorICAgICAgICAgICAgICAicmV0dXJuZWQgJWQiLCBjb2RlY1JldHVybik7CisgICAgICAgIHJldHVybiBjb2RlY1JldHVybjsKKyAgICB9CisKICAgICAvLyBGb3IgVlA5LCB3ZSBhbHdheXMgc2V0IENQVV9VU0VEIHRvIDggKGJlY2F1c2UgdGhlIHJlYWx0aW1lIGRlZmF1bHQgaXMgMAogICAgIC8vIHdoaWNoIGlzIHRvbyBzbG93KS4KICAgICBjb2RlY1JldHVybiA9IHZweF9jb2RlY19jb250cm9sKG1Db2RlY0NvbnRleHQsIFZQOEVfU0VUX0NQVVVTRUQsIDgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvZXhwb3J0cy5sZHMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9leHBvcnRzLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjRmM2ZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvZXhwb3J0cy5sZHMKQEAgLTAsMCArMSw1IEBACit7CisgICAgZ2xvYmFsOgorICAgICAgICBfWjIyY3JlYXRlU29mdE9NWENvbXBvbmVudFBLY1BLMTZPTVhfQ0FMTEJBQ0tUWVBFUHZQUDE3T01YX0NPTVBPTkVOVFRZUEU7CisgICAgbG9jYWw6ICo7Cit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVjMjA3NS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi1jY19saWJyYXJ5X3NoYXJlZCB7Ci0gICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfaDI2NGRlYyIsCi0KLSAgICBzcmNzOiBbCi0gICAgICAgICJzb3VyY2UvaDI2NGJzZF90cmFuc2Zvcm0uYyIsCi0gICAgICAgICJzb3VyY2UvaDI2NGJzZF91dGlsLmMiLAotICAgICAgICAic291cmNlL2gyNjRic2RfYnl0ZV9zdHJlYW0uYyIsCi0gICAgICAgICJzb3VyY2UvaDI2NGJzZF9zZXFfcGFyYW1fc2V0LmMiLAotICAgICAgICAic291cmNlL2gyNjRic2RfcGljX3BhcmFtX3NldC5jIiwKLSAgICAgICAgInNvdXJjZS9oMjY0YnNkX3NsaWNlX2hlYWRlci5jIiwKLSAgICAgICAgInNvdXJjZS9oMjY0YnNkX3NsaWNlX2RhdGEuYyIsCi0gICAgICAgICJzb3VyY2UvaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmMiLAotICAgICAgICAic291cmNlL2gyNjRic2Rfc3RyZWFtLmMiLAotICAgICAgICAic291cmNlL2gyNjRic2RfdmxjLmMiLAotICAgICAgICAic291cmNlL2gyNjRic2RfY2F2bGMuYyIsCi0gICAgICAgICJzb3VyY2UvaDI2NGJzZF9uYWxfdW5pdC5jIiwKLSAgICAgICAgInNvdXJjZS9oMjY0YnNkX25laWdoYm91ci5jIiwKLSAgICAgICAgInNvdXJjZS9oMjY0YnNkX3N0b3JhZ2UuYyIsCi0gICAgICAgICJzb3VyY2UvaDI2NGJzZF9zbGljZV9ncm91cF9tYXAuYyIsCi0gICAgICAgICJzb3VyY2UvaDI2NGJzZF9pbnRyYV9wcmVkaWN0aW9uLmMiLAotICAgICAgICAic291cmNlL2gyNjRic2RfaW50ZXJfcHJlZGljdGlvbi5jIiwKLSAgICAgICAgInNvdXJjZS9oMjY0YnNkX3JlY29uc3RydWN0LmMiLAotICAgICAgICAic291cmNlL2gyNjRic2RfZHBiLmMiLAotICAgICAgICAic291cmNlL2gyNjRic2RfaW1hZ2UuYyIsCi0gICAgICAgICJzb3VyY2UvaDI2NGJzZF9kZWJsb2NraW5nLmMiLAotICAgICAgICAic291cmNlL2gyNjRic2RfY29uY2VhbC5jIiwKLSAgICAgICAgInNvdXJjZS9oMjY0YnNkX3Z1aS5jIiwKLSAgICAgICAgInNvdXJjZS9oMjY0YnNkX3BpY19vcmRlcl9jbnQuYyIsCi0gICAgICAgICJzb3VyY2UvaDI2NGJzZF9kZWNvZGVyLmMiLAotICAgICAgICAic291cmNlL0gyNjRTd0RlY0FwaS5jIiwKLSAgICAgICAgIlNvZnRBVkMuY3BwIiwKLSAgICBdLAotCi0gICAgYXJjaDogewotICAgICAgICBhcm06IHsKLSAgICAgICAgICAgIGluc3RydWN0aW9uX3NldDogImFybSIsCi0KLSAgICAgICAgICAgIGFybXY3X2FfbmVvbjogewotICAgICAgICAgICAgICAgIGNmbGFnczogWwotICAgICAgICAgICAgICAgICAgICAiLURIMjY0REVDX05FT04iLAotICAgICAgICAgICAgICAgICAgICAiLURIMjY0REVDX09NWERMIiwKLSAgICAgICAgICAgICAgICBdLAotICAgICAgICAgICAgICAgIHNyY3M6IFsKLSAgICAgICAgICAgICAgICAgICAgInNvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RXcml0ZU1hY3JvYmxvY2suUyIsCi0gICAgICAgICAgICAgICAgICAgICJzb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkQ2xlYXJNYkxheWVyLlMiLAotICAgICAgICAgICAgICAgICAgICAic291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZEZpbGxSb3c3LlMiLAotICAgICAgICAgICAgICAgICAgICAic291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZENvdW50TGVhZGluZ1plcm9zLlMiLAotICAgICAgICAgICAgICAgICAgICAic291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZEZsdXNoQml0cy5TIiwKLQotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jIiwKLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYyIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYyIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTV9CaXRzdHJlYW0uYyIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTS5jIiwKLQotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MuUyIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFfdW5zYWZlX3MuUyIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MuUyIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLlMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLlMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9EaWFnQ29weV91bnNhZmVfcy5TIiwKLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MuUyIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLlMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZV9zLlMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZV9zLlMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MuUyIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5TIiwKLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5TIiwKLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5TIiwKLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5TIiwKLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9BdmVyYWdlXzR4X0FsaWduX3Vuc2FmZV9zLlMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLlMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5TIiwKLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9RdWFudFRhYmxlc19zLlMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MuUyIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5TIiwKLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXJfcy5TIiwKLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTZfcy5TIiwKLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MuUyIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLlMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkX3MuUyIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5TIiwKLSAgICAgICAgICAgICAgICBdLAotCi0gICAgICAgICAgICAgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICAgICAgICAgICAgICJzb3VyY2UvYXJtX25lb25fYXNtX2djYyIsCi0KLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL2FwaSIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi92Yy9hcGkiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvYXBpIiwKLSAgICAgICAgICAgICAgICBdLAotICAgICAgICAgICAgfSwKLSAgICAgICAgfSwKLSAgICB9LAotCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICBdLAotCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmMiXSwKLQotICAgIHNhbml0aXplOiB7Ci0gICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCi0gICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAotICAgICAgICBdLAotICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIGRpYWc6IHsKLSAgICAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgfSwKLSAgICB9LAotCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYm1lZGlhIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgXSwKLX0KLQotLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotLy8gdGVzdCB1dGlsaXR5OiBkZWNvZGVyCi0vLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0vLyMKLS8vIyBUZXN0IGFwcGxpY2F0aW9uCi0vLyMKLWNjX2JpbmFyeSB7Ci0gICAgbmFtZTogImRlY29kZXIiLAotCi0gICAgc3JjczogWyJzb3VyY2UvRGVjVGVzdEJlbmNoLmMiXSwKLQotICAgIHNoYXJlZF9saWJzOiBbImxpYnN0YWdlZnJpZ2h0X3NvZnRfaDI2NGRlYyJdLAotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL1NvZnRBVkMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL1NvZnRBVkMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjYxZDEyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9Tb2Z0QVZDLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJTb2Z0QVZDIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiU29mdEFWQy5oIgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0YXRpYyBjb25zdCBDb2RlY1Byb2ZpbGVMZXZlbCBrUHJvZmlsZUxldmVsc1tdID0gewotICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMSAgfSwKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDFiIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwxMSB9LAotICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMTIgfSwKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDEzIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwyICB9LAotICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMjEgfSwKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDIyIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwzICB9LAotICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMzEgfSwKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDMyIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWw0ICB9LAotICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsNDEgfSwKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDQyIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWw1ICB9LAotICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsNTEgfSwKLX07Ci0KLVNvZnRBVkM6OlNvZnRBVkMoCi0gICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKLSAgICAgICAgT01YX1BUUiBhcHBEYXRhLAotICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkKLSAgICA6IFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQoCi0gICAgICAgICAgICBuYW1lLCAidmlkZW9fZGVjb2Rlci5hdmMiLCBPTVhfVklERU9fQ29kaW5nQVZDLAotICAgICAgICAgICAga1Byb2ZpbGVMZXZlbHMsIEFSUkFZX1NJWkUoa1Byb2ZpbGVMZXZlbHMpLAotICAgICAgICAgICAgMzIwIC8qIHdpZHRoICovLCAyNDAgLyogaGVpZ2h0ICovLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCksCi0gICAgICBtSGFuZGxlKE5VTEwpLAotICAgICAgbUlucHV0QnVmZmVyQ291bnQoMCksCi0gICAgICBtRmlyc3RQaWN0dXJlKE5VTEwpLAotICAgICAgbUZpcnN0UGljdHVyZUlkKC0xKSwKLSAgICAgIG1QaWNJZCgwKSwKLSAgICAgIG1IZWFkZXJzRGVjb2RlZChmYWxzZSksCi0gICAgICBtRU9TU3RhdHVzKElOUFVUX0RBVEFfQVZBSUxBQkxFKSwKLSAgICAgIG1TaWduYWxsZWRFcnJvcihmYWxzZSkgewotICAgIGNvbnN0IHNpemVfdCBrTWluQ29tcHJlc3Npb25SYXRpbyA9IDI7Ci0gICAgY29uc3Qgc2l6ZV90IGtNYXhPdXRwdXRCdWZmZXJTaXplID0gMjA0OCAqIDIwNDggKiAzIC8gMjsKLSAgICBpbml0UG9ydHMoCi0gICAgICAgICAgICBrTnVtSW5wdXRCdWZmZXJzLCBrTWF4T3V0cHV0QnVmZmVyU2l6ZSAvIGtNaW5Db21wcmVzc2lvblJhdGlvIC8qIG1pbklucHV0QnVmZmVyU2l6ZSAqLywKLSAgICAgICAgICAgIGtOdW1PdXRwdXRCdWZmZXJzLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsIGtNaW5Db21wcmVzc2lvblJhdGlvKTsKLQotICAgIENIRUNLX0VRKGluaXREZWNvZGVyKCksIChzdGF0dXNfdClPSyk7Ci19Ci0KLVNvZnRBVkM6On5Tb2Z0QVZDKCkgewotICAgIEgyNjRTd0RlY1JlbGVhc2UobUhhbmRsZSk7Ci0gICAgbUhhbmRsZSA9IE5VTEw7Ci0KLSAgICB3aGlsZSAobVBpY1RvSGVhZGVyTWFwLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIgPSBtUGljVG9IZWFkZXJNYXAuZWRpdFZhbHVlQXQoMCk7Ci0gICAgICAgIG1QaWNUb0hlYWRlck1hcC5yZW1vdmVJdGVtc0F0KDApOwotICAgICAgICBkZWxldGUgaGVhZGVyOwotICAgICAgICBoZWFkZXIgPSBOVUxMOwotICAgIH0KLSAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJm91dFF1ZXVlID0gZ2V0UG9ydFF1ZXVlKGtPdXRwdXRQb3J0SW5kZXgpOwotICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmaW5RdWV1ZSA9IGdldFBvcnRRdWV1ZShrSW5wdXRQb3J0SW5kZXgpOwotICAgIENIRUNLKG91dFF1ZXVlLmVtcHR5KCkpOwotICAgIENIRUNLKGluUXVldWUuZW1wdHkoKSk7Ci0KLSAgICBkZWxldGVbXSBtRmlyc3RQaWN0dXJlOwotfQotCi1zdGF0dXNfdCBTb2Z0QVZDOjppbml0RGVjb2RlcigpIHsKLSAgICAvLyBGb3JjZSBkZWNvZGVyIHRvIG91dHB1dCBidWZmZXJzIGluIGRpc3BsYXkgb3JkZXIuCi0gICAgaWYgKEgyNjRTd0RlY0luaXQoJm1IYW5kbGUsIDApID09IEgyNjRTV0RFQ19PSykgewotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotfQotCi12b2lkIFNvZnRBVkM6Om9uUXVldWVGaWxsZWQoT01YX1UzMiAvKiBwb3J0SW5kZXggKi8pIHsKLSAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgIT0gTk9ORSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG1FT1NTdGF0dXMgPT0gT1VUUFVUX0ZSQU1FU19GTFVTSEVEKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJmluUXVldWUgPSBnZXRQb3J0UXVldWUoa0lucHV0UG9ydEluZGV4KTsKLSAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJm91dFF1ZXVlID0gZ2V0UG9ydFF1ZXVlKGtPdXRwdXRQb3J0SW5kZXgpOwotCi0gICAgaWYgKG1IZWFkZXJzRGVjb2RlZCkgewotICAgICAgICAvLyBEZXF1ZXVlIGFueSBhbHJlYWR5IGRlY29kZWQgb3V0cHV0IGZyYW1lcyB0byBmcmVlIHVwIHNwYWNlCi0gICAgICAgIC8vIGluIHRoZSBvdXRwdXQgcXVldWUuCi0KLSAgICAgICAgZHJhaW5BbGxPdXRwdXRCdWZmZXJzKGZhbHNlIC8qIGVvcyAqLyk7Ci0gICAgfQotCi0gICAgSDI2NFN3RGVjUmV0IHJldCA9IEgyNjRTV0RFQ19QSUNfUkRZOwotICAgIGJvb2wgcG9ydFdpbGxSZXNldCA9IGZhbHNlOwotICAgIHdoaWxlICgobUVPU1N0YXR1cyAhPSBJTlBVVF9EQVRBX0FWQUlMQUJMRSB8fCAhaW5RdWV1ZS5lbXB0eSgpKQotICAgICAgICAgICAgJiYgb3V0UXVldWUuc2l6ZSgpID09IGtOdW1PdXRwdXRCdWZmZXJzKSB7Ci0KLSAgICAgICAgaWYgKG1FT1NTdGF0dXMgPT0gSU5QVVRfRU9TX1NFRU4pIHsKLSAgICAgICAgICAgIGRyYWluQWxsT3V0cHV0QnVmZmVycyh0cnVlIC8qIGVvcyAqLyk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBCdWZmZXJJbmZvICppbkluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOwotICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7Ci0gICAgICAgICsrbVBpY0lkOwotCi0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIgPSBuZXcgT01YX0JVRkZFUkhFQURFUlRZUEU7Ci0gICAgICAgIG1lbXNldChoZWFkZXIsIDAsIHNpemVvZihPTVhfQlVGRkVSSEVBREVSVFlQRSkpOwotICAgICAgICBoZWFkZXItPm5UaW1lU3RhbXAgPSBpbkhlYWRlci0+blRpbWVTdGFtcDsKLSAgICAgICAgaGVhZGVyLT5uRmxhZ3MgPSBpbkhlYWRlci0+bkZsYWdzOwotICAgICAgICBpZiAoaGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKLSAgICAgICAgICAgIG1FT1NTdGF0dXMgPSBJTlBVVF9FT1NfU0VFTjsKLSAgICAgICAgfQotICAgICAgICBtUGljVG9IZWFkZXJNYXAuYWRkKG1QaWNJZCwgaGVhZGVyKTsKLSAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOwotCi0gICAgICAgIEgyNjRTd0RlY0lucHV0IGluUGljdHVyZTsKLSAgICAgICAgSDI2NFN3RGVjT3V0cHV0IG91dFBpY3R1cmU7Ci0gICAgICAgIG1lbXNldCgmaW5QaWN0dXJlLCAwLCBzaXplb2YoaW5QaWN0dXJlKSk7Ci0gICAgICAgIGluUGljdHVyZS5kYXRhTGVuID0gaW5IZWFkZXItPm5GaWxsZWRMZW47Ci0gICAgICAgIGluUGljdHVyZS5wU3RyZWFtID0gaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKLSAgICAgICAgaW5QaWN0dXJlLnBpY0lkID0gbVBpY0lkOwotICAgICAgICBpblBpY3R1cmUuaW50cmFDb25jZWFsbWVudE1ldGhvZCA9IDE7Ci0gICAgICAgIEgyNjRTd0RlY1BpY3R1cmUgZGVjb2RlZFBpY3R1cmU7Ci0KLSAgICAgICAgd2hpbGUgKGluUGljdHVyZS5kYXRhTGVuID4gMCkgewotICAgICAgICAgICAgcmV0ID0gSDI2NFN3RGVjRGVjb2RlKG1IYW5kbGUsICZpblBpY3R1cmUsICZvdXRQaWN0dXJlKTsKLSAgICAgICAgICAgIGlmIChyZXQgPT0gSDI2NFNXREVDX0hEUlNfUkRZX0JVRkZfTk9UX0VNUFRZIHx8Ci0gICAgICAgICAgICAgICAgcmV0ID09IEgyNjRTV0RFQ19QSUNfUkRZX0JVRkZfTk9UX0VNUFRZKSB7Ci0gICAgICAgICAgICAgICAgaW5QaWN0dXJlLmRhdGFMZW4gLT0gKHUzMikob3V0UGljdHVyZS5wU3RybUN1cnJQb3MgLSBpblBpY3R1cmUucFN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgaW5QaWN0dXJlLnBTdHJlYW0gPSBvdXRQaWN0dXJlLnBTdHJtQ3VyclBvczsKLSAgICAgICAgICAgICAgICBpZiAocmV0ID09IEgyNjRTV0RFQ19IRFJTX1JEWV9CVUZGX05PVF9FTVBUWSkgewotICAgICAgICAgICAgICAgICAgICBtSGVhZGVyc0RlY29kZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBIMjY0U3dEZWNJbmZvIGRlY29kZXJJbmZvOwotICAgICAgICAgICAgICAgICAgICBDSEVDSyhIMjY0U3dEZWNHZXRJbmZvKG1IYW5kbGUsICZkZWNvZGVySW5mbykgPT0gSDI2NFNXREVDX09LKTsKLQotICAgICAgICAgICAgICAgICAgICBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjpDcm9wU2V0dGluZ3NNb2RlIGNyb3BTZXR0aW5nc01vZGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ3JvcFBhcmFtcyhkZWNvZGVySW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZVBvcnRTZXR0aW5nc0NoYW5nZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9ydFdpbGxSZXNldCwgZGVjb2RlckluZm8ucGljV2lkdGgsIGRlY29kZXJJbmZvLnBpY0hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9wU2V0dGluZ3NNb2RlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChwb3J0V2lsbFJlc2V0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChIMjY0U3dEZWNOZXh0UGljdHVyZShtSGFuZGxlLCAmZGVjb2RlZFBpY3R1cmUsIDApCi0gICAgICAgICAgICAgICAgICAgICAgICA9PSBIMjY0U1dERUNfUElDX1JEWSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBTYXZlIHRoaXMgb3V0cHV0IGJ1ZmZlcjsgb3RoZXJ3aXNlLCBpdCB3aWxsIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBsb3N0IGR1cmluZyBkeW5hbWljIHBvcnQgcmVjb25maWd1cmF0aW9uIGJlY2F1c2UKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9wZW5NQVggY2xpZW50IHdpbGwgZGVsZXRlIF9hbGxfIG91dHB1dCBidWZmZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgcHJvY2Vzcy4KLSAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVGaXJzdE91dHB1dEJ1ZmZlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkUGljdHVyZS5waWNJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCAqKWRlY29kZWRQaWN0dXJlLnBPdXRwdXRQaWN0dXJlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpblBpY3R1cmUuZGF0YUxlbiA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkRlY29kZXIgZmFpbGVkOiAlZCIsIHJldCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJPUl9NQUxGT1JNRUQsIE5VTEwpOwotCi0gICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7Ci0gICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7Ci0KLSAgICAgICAgaWYgKHBvcnRXaWxsUmVzZXQpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtRmlyc3RQaWN0dXJlICYmICFvdXRRdWV1ZS5lbXB0eSgpKSB7Ci0gICAgICAgICAgICBpZiAoIWRyYWluT25lT3V0cHV0QnVmZmVyKG1GaXJzdFBpY3R1cmVJZCwgbUZpcnN0UGljdHVyZSkpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiRHJhaW4gZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOwotICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVsZXRlW10gbUZpcnN0UGljdHVyZTsKLSAgICAgICAgICAgIG1GaXJzdFBpY3R1cmUgPSBOVUxMOwotICAgICAgICAgICAgbUZpcnN0UGljdHVyZUlkID0gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBkcmFpbkFsbE91dHB1dEJ1ZmZlcnMoZmFsc2UgLyogZW9zICovKTsKLSAgICB9Ci19Ci0KLVNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OkNyb3BTZXR0aW5nc01vZGUgU29mdEFWQzo6aGFuZGxlQ3JvcFBhcmFtcygKLSAgICAgICAgY29uc3QgSDI2NFN3RGVjSW5mbyYgZGVjSW5mbykgewotICAgIGlmICghZGVjSW5mby5jcm9wcGluZ0ZsYWcpIHsKLSAgICAgICAgcmV0dXJuIGtDcm9wVW5TZXQ7Ci0gICAgfQotCi0gICAgY29uc3QgQ3JvcFBhcmFtcyYgY3JvcCA9IGRlY0luZm8uY3JvcFBhcmFtczsKLSAgICBpZiAobUNyb3BMZWZ0ID09IGNyb3AuY3JvcExlZnRPZmZzZXQgJiYKLSAgICAgICAgbUNyb3BUb3AgPT0gY3JvcC5jcm9wVG9wT2Zmc2V0ICYmCi0gICAgICAgIG1Dcm9wV2lkdGggPT0gY3JvcC5jcm9wT3V0V2lkdGggJiYKLSAgICAgICAgbUNyb3BIZWlnaHQgPT0gY3JvcC5jcm9wT3V0SGVpZ2h0KSB7Ci0gICAgICAgIHJldHVybiBrQ3JvcFNldDsKLSAgICB9Ci0KLSAgICBtQ3JvcExlZnQgPSBjcm9wLmNyb3BMZWZ0T2Zmc2V0OwotICAgIG1Dcm9wVG9wID0gY3JvcC5jcm9wVG9wT2Zmc2V0OwotICAgIG1Dcm9wV2lkdGggPSBjcm9wLmNyb3BPdXRXaWR0aDsKLSAgICBtQ3JvcEhlaWdodCA9IGNyb3AuY3JvcE91dEhlaWdodDsKLSAgICByZXR1cm4ga0Nyb3BDaGFuZ2VkOwotfQotCi12b2lkIFNvZnRBVkM6OnNhdmVGaXJzdE91dHB1dEJ1ZmZlcihpbnQzMl90IHBpY0lkLCB1aW50OF90ICpkYXRhKSB7Ci0gICAgQ0hFQ0sobUZpcnN0UGljdHVyZSA9PSBOVUxMKTsKLSAgICBtRmlyc3RQaWN0dXJlSWQgPSBwaWNJZDsKLQotICAgIHVpbnQzMl90IHBpY3R1cmVTaXplID0gbVdpZHRoICogbUhlaWdodCAqIDMgLyAyOwotICAgIG1GaXJzdFBpY3R1cmUgPSBuZXcgdWludDhfdFtwaWN0dXJlU2l6ZV07Ci0gICAgbWVtY3B5KG1GaXJzdFBpY3R1cmUsIGRhdGEsIHBpY3R1cmVTaXplKTsKLX0KLQotYm9vbCBTb2Z0QVZDOjpkcmFpbk9uZU91dHB1dEJ1ZmZlcihpbnQzMl90IHBpY0lkLCB1aW50OF90KiBkYXRhKSB7Ci0gICAgTGlzdDxCdWZmZXJJbmZvICo+ICZvdXRRdWV1ZSA9IGdldFBvcnRRdWV1ZShrT3V0cHV0UG9ydEluZGV4KTsKLSAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7Ci0gICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7Ci0gICAgT01YX1UzMiBmcmFtZVNpemUgPSBtV2lkdGggKiBtSGVpZ2h0ICogMyAvIDI7Ci0gICAgaWYgKG91dEhlYWRlci0+bkFsbG9jTGVuIC0gb3V0SGVhZGVyLT5uT2Zmc2V0IDwgZnJhbWVTaXplKSB7Ci0gICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjc4MzM2MTYiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKLSAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyID0gbVBpY1RvSGVhZGVyTWFwLnZhbHVlRm9yKHBpY0lkKTsKLSAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPSBoZWFkZXItPm5UaW1lU3RhbXA7Ci0gICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBoZWFkZXItPm5GbGFnczsKLSAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSBmcmFtZVNpemU7Ci0KLSAgICB1aW50OF90ICpkc3QgPSBvdXRIZWFkZXItPnBCdWZmZXIgKyBvdXRIZWFkZXItPm5PZmZzZXQ7Ci0gICAgY29uc3QgdWludDhfdCAqc3JjWSA9IGRhdGE7Ci0gICAgY29uc3QgdWludDhfdCAqc3JjVSA9IHNyY1kgKyBtV2lkdGggKiBtSGVpZ2h0OwotICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1YgPSBzcmNVICsgbVdpZHRoICogbUhlaWdodCAvIDQ7Ci0gICAgc2l6ZV90IHNyY1lTdHJpZGUgPSBtV2lkdGg7Ci0gICAgc2l6ZV90IHNyY1VTdHJpZGUgPSBtV2lkdGggLyAyOwotICAgIHNpemVfdCBzcmNWU3RyaWRlID0gc3JjVVN0cmlkZTsKLSAgICBjb3B5WVYxMkZyYW1lVG9PdXRwdXRCdWZmZXIoZHN0LCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlLCBzcmNVU3RyaWRlLCBzcmNWU3RyaWRlKTsKLQotICAgIG1QaWNUb0hlYWRlck1hcC5yZW1vdmVJdGVtKHBpY0lkKTsKLSAgICBkZWxldGUgaGVhZGVyOwotICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKLSAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOwotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIFNvZnRBVkM6OmRyYWluQWxsT3V0cHV0QnVmZmVycyhib29sIGVvcykgewotICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmb3V0UXVldWUgPSBnZXRQb3J0UXVldWUoa091dHB1dFBvcnRJbmRleCk7Ci0gICAgSDI2NFN3RGVjUGljdHVyZSBkZWNvZGVkUGljdHVyZTsKLQotICAgIGlmIChtSGVhZGVyc0RlY29kZWQpIHsKLSAgICAgICAgd2hpbGUgKCFvdXRRdWV1ZS5lbXB0eSgpCi0gICAgICAgICAgICAgICAgJiYgSDI2NFNXREVDX1BJQ19SRFkgPT0gSDI2NFN3RGVjTmV4dFBpY3R1cmUoCi0gICAgICAgICAgICAgICAgICAgIG1IYW5kbGUsICZkZWNvZGVkUGljdHVyZSwgZW9zIC8qIGZsdXNoICovKSkgewotICAgICAgICAgICAgaW50MzJfdCBwaWNJZCA9IGRlY29kZWRQaWN0dXJlLnBpY0lkOwotICAgICAgICAgICAgdWludDhfdCAqZGF0YSA9ICh1aW50OF90ICopIGRlY29kZWRQaWN0dXJlLnBPdXRwdXRQaWN0dXJlOwotICAgICAgICAgICAgaWYgKCFkcmFpbk9uZU91dHB1dEJ1ZmZlcihwaWNJZCwgZGF0YSkpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiRHJhaW4gZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOwotICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFlb3MpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHdoaWxlICghb3V0UXVldWUuZW1wdHkoKSkgewotICAgICAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7Ci0gICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOwotICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyID0gb3V0SW5mby0+bUhlYWRlcjsKLQotICAgICAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPSAwOwotICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAwOwotICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IE9NWF9CVUZGRVJGTEFHX0VPUzsKLQotICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7Ci0gICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7Ci0KLSAgICAgICAgbUVPU1N0YXR1cyA9IE9VVFBVVF9GUkFNRVNfRkxVU0hFRDsKLSAgICB9Ci19Ci0KLXZvaWQgU29mdEFWQzo6b25Qb3J0Rmx1c2hDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKLSAgICBpZiAocG9ydEluZGV4ID09IGtJbnB1dFBvcnRJbmRleCkgewotICAgICAgICBtRU9TU3RhdHVzID0gSU5QVVRfREFUQV9BVkFJTEFCTEU7Ci0gICAgfQotfQotCi12b2lkIFNvZnRBVkM6Om9uUmVzZXQoKSB7Ci0gICAgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6b25SZXNldCgpOwotICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi1hbmRyb2lkOjpTb2Z0T01YQ29tcG9uZW50ICpjcmVhdGVTb2Z0T01YQ29tcG9uZW50KAotICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCi0gICAgICAgIE9NWF9QVFIgYXBwRGF0YSwgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpIHsKLSAgICByZXR1cm4gbmV3IGFuZHJvaWQ6OlNvZnRBVkMobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL1NvZnRBVkMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9Tb2Z0QVZDLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZDk4OGIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL1NvZnRBVkMuaAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFNPRlRfQVZDX0hfCi0KLSNkZWZpbmUgU09GVF9BVkNfSF8KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLQotI2luY2x1ZGUgIkgyNjRTd0RlY0FwaS5oIgotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IFNvZnRBVkMgOiBwdWJsaWMgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudCB7Ci0gICAgU29mdEFWQyhjb25zdCBjaGFyICpuYW1lLAotICAgICAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAotICAgICAgICAgICAgT01YX1BUUiBhcHBEYXRhLAotICAgICAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+U29mdEFWQygpOwotCi0gICAgdmlydHVhbCB2b2lkIG9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpOwotICAgIHZpcnR1YWwgdm9pZCBvblBvcnRGbHVzaENvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCk7Ci0gICAgdmlydHVhbCB2b2lkIG9uUmVzZXQoKTsKLQotcHJpdmF0ZToKLSAgICBlbnVtIHsKLSAgICAgICAga051bUlucHV0QnVmZmVycyAgPSA4LAotICAgICAgICBrTnVtT3V0cHV0QnVmZmVycyA9IDIsCi0gICAgfTsKLQotICAgIGVudW0gRU9TU3RhdHVzIHsKLSAgICAgICAgSU5QVVRfREFUQV9BVkFJTEFCTEUsCi0gICAgICAgIElOUFVUX0VPU19TRUVOLAotICAgICAgICBPVVRQVVRfRlJBTUVTX0ZMVVNIRUQsCi0gICAgfTsKLQotICAgIHZvaWQgKm1IYW5kbGU7Ci0KLSAgICBzaXplX3QgbUlucHV0QnVmZmVyQ291bnQ7Ci0KLSAgICB1aW50OF90ICptRmlyc3RQaWN0dXJlOwotICAgIGludDMyX3QgbUZpcnN0UGljdHVyZUlkOwotCi0gICAgaW50MzJfdCBtUGljSWQ7ICAvLyBXaGljaCBvdXRwdXQgcGljdHVyZSBpcyBmb3Igd2hpY2ggaW5wdXQgYnVmZmVyPwotCi0gICAgLy8gT01YX0JVRkZFUkhFQURFUlRZUEUgbWF5IGJlIG92ZXJraWxsLCBidXQgaXQgaXMgY29udmVuaWVudAotICAgIC8vIGZvciB0cmFja2luZyB0aGUgZm9sbG93aW5nIGZpZWxkczogbkZsYWdzLCBuVGltZVN0YW1wLCBldGMuCi0gICAgS2V5ZWRWZWN0b3I8aW50MzJfdCwgT01YX0JVRkZFUkhFQURFUlRZUEUgKj4gbVBpY1RvSGVhZGVyTWFwOwotICAgIGJvb2wgbUhlYWRlcnNEZWNvZGVkOwotCi0gICAgRU9TU3RhdHVzIG1FT1NTdGF0dXM7Ci0KLSAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKLQotICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7Ci0gICAgdm9pZCBkcmFpbkFsbE91dHB1dEJ1ZmZlcnMoYm9vbCBlb3MpOwotICAgIGJvb2wgZHJhaW5PbmVPdXRwdXRCdWZmZXIoaW50MzJfdCBwaWNJZCwgdWludDhfdCAqZGF0YSk7Ci0gICAgdm9pZCBzYXZlRmlyc3RPdXRwdXRCdWZmZXIoaW50MzJfdCBwaWRJZCwgdWludDhfdCAqZGF0YSk7Ci0gICAgQ3JvcFNldHRpbmdzTW9kZSBoYW5kbGVDcm9wUGFyYW1zKGNvbnN0IEgyNjRTd0RlY0luZm8mIGRlY0luZm8pOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU29mdEFWQyk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIFNPRlRfQVZDX0hfCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9pbmMvSDI2NFN3RGVjQXBpLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvaW5jL0gyNjRTd0RlY0FwaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODE0ZTczLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9pbmMvSDI2NFN3RGVjQXBpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgMS4gSW5jbHVkZSBIZWFkZXJzCi0KLSAgICAyLiBFbnVtZXJhdGlvbnMgdXNlZCBhcyBhIHJldHVybiB2YWx1ZSBvciBhIHBhcmFtZXRlci4KLSAgICAgICAgMi4xLiBBUEkncyByZXR1cm4gdmFsdWUgZW51bWVyYXRpb25zLgotCi0gICAgMy4gVXNlciBTdHJ1Y3R1cmVzCi0gICAgICAgIDMuMS4gU3RydWN0dXJlcyBmb3IgSDI2NFN3RGVjRGVjb2RlKCkgcGFyYW1ldGVycy4KLSAgICAgICAgMy4yLiBTdHJ1Y3R1cmVzIGZvciBpbmZvcm1hdGlvbiBpbnRlcmNoYW5nZSB3aXRoCi0gICAgICAgICAgICAgREVDIEFQSSBhbmQgdXNlciBhcHBsaWNhdGlvbi4KLQotICAgIDQuIFByb3RvdHlwZXMgb2YgRGVjb2RlciBBUEkgZnVuY3Rpb25zCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSDI2NFNXREVDQVBJX0gKLSNkZWZpbmUgSDI2NFNXREVDQVBJX0gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi17Ci0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIEhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICAjaW5jbHVkZSAiYmFzZXR5cGUuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLjEuIEFQSSdzIHJldHVybiB2YWx1ZSBlbnVtZXJhdGlvbnMuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgdHlwZWRlZiBlbnVtCi0gICAgewotICAgICAgICBIMjY0U1dERUNfT0sgPSAwLAotICAgICAgICBIMjY0U1dERUNfU1RSTV9QUk9DRVNTRUQgPSAxLAotICAgICAgICBIMjY0U1dERUNfUElDX1JEWSwKLSAgICAgICAgSDI2NFNXREVDX1BJQ19SRFlfQlVGRl9OT1RfRU1QVFksCi0gICAgICAgIEgyNjRTV0RFQ19IRFJTX1JEWV9CVUZGX05PVF9FTVBUWSwKLSAgICAgICAgSDI2NFNXREVDX1BBUkFNX0VSUiA9IC0xLAotICAgICAgICBIMjY0U1dERUNfU1RSTV9FUlIgPSAtMiwKLSAgICAgICAgSDI2NFNXREVDX05PVF9JTklUSUFMSVpFRCA9IC0zLAotICAgICAgICBIMjY0U1dERUNfTUVNRkFJTCA9IC00LAotICAgICAgICBIMjY0U1dERUNfSU5JVEZBSUwgPSAtNSwKLSAgICAgICAgSDI2NFNXREVDX0hEUlNfTk9UX1JEWSA9IC02LAotICAgICAgICBIMjY0U1dERUNfRVZBTFVBVElPTl9MSU1JVF9FWENFRURFRCA9IC03Ci0gICAgfSBIMjY0U3dEZWNSZXQ7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4xLiBTdHJ1Y3R1cmVzIGZvciBIMjY0U3dEZWNEZWNvZGUoKSBwYXJhbWV0ZXJzLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIC8qIHR5cGVkZWYgb2YgdGhlIERlY29kZXIgaW5zdGFuY2UgKi8KLSAgICB0eXBlZGVmIHZvaWQgKkgyNjRTd0RlY0luc3Q7Ci0KLSAgICAvKiBJbnB1dCBzdHJ1Y3R1cmUgKi8KLSAgICB0eXBlZGVmIHN0cnVjdAotICAgIHsKLSAgICAgICAgdTggICpwU3RyZWFtOyAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gc3RyZWFtIHRvIGJlIGRlY29kZWQgICAgICAgICAgKi8KLSAgICAgICAgdTMyICBkYXRhTGVuOyAgICAgICAgICAgIC8qIE51bWJlciBvZiBieXRlcyB0byBiZSBkZWNvZGVkICAgICAgICAgICAgKi8KLSAgICAgICAgdTMyICBwaWNJZDsgICAgICAgICAgICAgIC8qIElkZW50aWZpZXIgZm9yIHRoZSBwaWN0dXJlIHRvIGJlIGRlY29kZWQgKi8KLSAgICAgICAgdTMyIGludHJhQ29uY2VhbG1lbnRNZXRob2Q7IC8qIDAgPSBHcmF5IGNvbmNlYWxtZW50IGZvciBpbnRyYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSA9IFJlZmVyZW5jZSBjb25jZWFsbWVudCBmb3IgaW50cmEgKi8KLQotICAgIH0gSDI2NFN3RGVjSW5wdXQ7Ci0KLQotICAgIC8qIE91dHB1dCBzdHJ1Y3R1cmUgKi8KLSAgICB0eXBlZGVmIHN0cnVjdAotICAgIHsKLSAgICAgICAgdTggICpwU3RybUN1cnJQb3M7ICAgICAgLyogUG9pbnRlciB0byBzdHJlYW0gcG9zaXRpb24gd2hlcmUgZGVjb2RlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRlZCB1cCAqLwotICAgIH0gSDI2NFN3RGVjT3V0cHV0OwotCi0gICAgLyogT3V0cHV0IHN0cnVjdHVyZSBmb3IgSDI2NFN3RGVjTmV4dFBpY3R1cmUgKi8KLSAgICB0eXBlZGVmIHN0cnVjdAotICAgIHsKLSAgICAgICAgdTMyICpwT3V0cHV0UGljdHVyZTsgICAgLyogUG9pbnRlciB0byB0aGUgcGljdHVyZSwgWVVWIGZvcm1hdCAgICAgICAqLwotICAgICAgICB1MzIgcGljSWQ7ICAgICAgICAgICAgICAvKiBJZGVudGlmaWVyIG9mIHRoZSBwaWN0dXJlIHRvIGJlIGRpc3BsYXllZCovCi0gICAgICAgIHUzMiBpc0lkclBpY3R1cmU7ICAgICAgIC8qIEZsYWcgdG8gaW5kaWNhdGUgaWYgdGhlIHBpY3R1cmUgaXMgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURSIHBpY3R1cmUgKi8KLSAgICAgICAgdTMyIG5ick9mRXJyTUJzOyAgICAgICAgLyogTnVtYmVyIG9mIGNvbmNlYWxlZCBNQidzIGluIHRoZSBwaWN0dXJlICAqLwotICAgIH0gSDI2NFN3RGVjUGljdHVyZTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLjIuIFN0cnVjdHVyZXMgZm9yIGluZm9ybWF0aW9uIGludGVyY2hhbmdlIHdpdGggREVDIEFQSQotICAgICAgICAgYW5kIHVzZXIgYXBwbGljYXRpb24uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgdHlwZWRlZiBzdHJ1Y3QKLSAgICB7Ci0gICAgICAgIHUzMiBjcm9wTGVmdE9mZnNldDsKLSAgICAgICAgdTMyIGNyb3BPdXRXaWR0aDsKLSAgICAgICAgdTMyIGNyb3BUb3BPZmZzZXQ7Ci0gICAgICAgIHUzMiBjcm9wT3V0SGVpZ2h0OwotICAgIH0gQ3JvcFBhcmFtczsKLQotICAgIHR5cGVkZWYgc3RydWN0Ci0gICAgewotICAgICAgICB1MzIgcHJvZmlsZTsKLSAgICAgICAgdTMyIHBpY1dpZHRoOwotICAgICAgICB1MzIgcGljSGVpZ2h0OwotICAgICAgICB1MzIgdmlkZW9SYW5nZTsKLSAgICAgICAgdTMyIG1hdHJpeENvZWZmaWNpZW50czsKLSAgICAgICAgdTMyIHBhcldpZHRoOwotICAgICAgICB1MzIgcGFySGVpZ2h0OwotICAgICAgICB1MzIgY3JvcHBpbmdGbGFnOwotICAgICAgICBDcm9wUGFyYW1zIGNyb3BQYXJhbXM7Ci0gICAgfSBIMjY0U3dEZWNJbmZvOwotCi0gICAgLyogVmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIHR5cGVkZWYgc3RydWN0Ci0gICAgewotICAgICAgICB1MzIgbWFqb3I7ICAgIC8qIERlY29kZXIgQVBJIG1ham9yIHZlcnNpb24gKi8KLSAgICAgICAgdTMyIG1pbm9yOyAgICAvKiBEbmNvZGVyIEFQSSBtaW5vciB2ZXJzaW9uICovCi0gICAgfSBIMjY0U3dEZWNBcGlWZXJzaW9uOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIFByb3RvdHlwZXMgb2YgRGVjb2RlciBBUEkgZnVuY3Rpb25zCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgSDI2NFN3RGVjUmV0IEgyNjRTd0RlY0RlY29kZShIMjY0U3dEZWNJbnN0ICAgICAgZGVjSW5zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEgyNjRTd0RlY0lucHV0ICAgICAqcElucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSDI2NFN3RGVjT3V0cHV0ICAgICpwT3V0cHV0KTsKLQotICAgIEgyNjRTd0RlY1JldCBIMjY0U3dEZWNJbml0KEgyNjRTd0RlY0luc3QgKmRlY0luc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyICAgICAgICAgICAgbm9PdXRwdXRSZW9yZGVyaW5nKTsKLQotICAgIEgyNjRTd0RlY1JldCBIMjY0U3dEZWNOZXh0UGljdHVyZShIMjY0U3dEZWNJbnN0ICAgICBkZWNJbnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIMjY0U3dEZWNQaWN0dXJlICpwT3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgICAgICAgICAgICAgICBlbmRPZlN0cmVhbSk7Ci0KLSAgICBIMjY0U3dEZWNSZXQgSDI2NFN3RGVjR2V0SW5mbyhIMjY0U3dEZWNJbnN0IGRlY0luc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSDI2NFN3RGVjSW5mbyAqcERlY0luZm8pOwotCi0gICAgdm9pZCAgSDI2NFN3RGVjUmVsZWFzZShIMjY0U3dEZWNJbnN0IGRlY0luc3QpOwotCi0gICAgSDI2NFN3RGVjQXBpVmVyc2lvbiBIMjY0U3dEZWNHZXRBUElWZXJzaW9uKHZvaWQpOwotCi0gICAgLyogZnVuY3Rpb24gcHJvdG90eXBlIGZvciBBUEkgdHJhY2UgKi8KLSAgICB2b2lkIEgyNjRTd0RlY1RyYWNlKGNoYXIgKik7Ci0KLSAgICAvKiBmdW5jdGlvbiBwcm90b3R5cGUgZm9yIG1lbW9yeSBhbGxvY2F0aW9uICovCi0gICAgdm9pZCogSDI2NFN3RGVjTWFsbG9jKHUzMiBzaXplLCB1MzIgbnVtKTsKLQotICAgIC8qIGZ1bmN0aW9uIHByb3RvdHlwZSBmb3IgbWVtb3J5IGZyZWUgKi8KLSAgICB2b2lkIEgyNjRTd0RlY0ZyZWUodm9pZCAqcHRyKTsKLQotICAgIC8qIGZ1bmN0aW9uIHByb3RvdHlwZSBmb3IgbWVtb3J5IGNvcHkgKi8KLSAgICB2b2lkIEgyNjRTd0RlY01lbWNweSh2b2lkICpkZXN0LCB2b2lkICpzcmMsIHUzMiBjb3VudCk7Ci0KLSAgICAvKiBmdW5jdGlvbiBwcm90b3R5cGUgZm9yIG1lbXNldCAqLwotICAgIHZvaWQgSDI2NFN3RGVjTWVtc2V0KHZvaWQgKnB0ciwgaTMyIHZhbHVlLCB1MzIgY291bnQpOwotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBIMjY0U1dERUNBUElfSCAqLwotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL2luYy9iYXNldHlwZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL2luYy9iYXNldHlwZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2Q1NjUzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9pbmMvYmFzZXR5cGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLSNpZm5kZWYgQkFTRVRZUEVfSF9JTkNMVURFRAotI2RlZmluZSBCQVNFVFlQRV9IX0lOQ0xVREVECi0KLQotI2lmZGVmIF9fYXJtCi0jZGVmaW5lIFZPTEFUSUxFIHZvbGF0aWxlCi0jZWxzZQotI2RlZmluZSBWT0xBVElMRQotI2VuZGlmCi0KLXR5cGVkZWYgdW5zaWduZWQgY2hhciAgIHU4OwotdHlwZWRlZiBzaWduZWQgY2hhciAgICAgaTg7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0ICB1MTY7Ci10eXBlZGVmIHNpZ25lZCBzaG9ydCAgICBpMTY7Ci10eXBlZGVmIHVuc2lnbmVkIGludCAgICB1MzI7Ci10eXBlZGVmIHNpZ25lZCBpbnQgICAgICBpMzI7Ci0KLSNpZiBkZWZpbmVkKFZDMVNXREVDXzE2QklUKSB8fCBkZWZpbmVkKE1QNEVOQ19BUk0xMSkKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIHUxNng7Ci10eXBlZGVmIHNpZ25lZCBzaG9ydCAgICBpMTZ4OwotI2Vsc2UKLXR5cGVkZWYgdW5zaWduZWQgaW50ICAgIHUxNng7Ci10eXBlZGVmIHNpZ25lZCBpbnQgICAgICBpMTZ4OwotI2VuZGlmCi0KLQotI2lmbmRlZiBOVUxMCi0jaWZkZWYgIF9fY3BsdXNwbHVzCi0jZGVmaW5lIE5VTEwgMAotI2Vsc2UKLSNkZWZpbmUgTlVMTCAoKHZvaWQgKikwKQotI2VuZGlmCi0jZW5kaWYKLQotI2VuZGlmICAvKiBCQVNFVFlQRV9IX0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvQVJNX0RFTElWRVJZLlRYVCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9BUk1fREVMSVZFUlkuVFhUCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2U3MGNhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9BUk1fREVMSVZFUlkuVFhUCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotVGhlIGNvbnRlbnRzIG9mIHRoaXMgdHJhbnNhY3Rpb24gd2FzIGNyZWF0ZWQgYnkgSGVkbGV5IEZyYW5jaXMKLW9mIEFSTSBvbiAxOS1GZWItMjAwOC4KLQotSXQgY29udGFpbnMgdGhlIEFSTSBkYXRhIHZlcnNpb25zIGxpc3RlZCBiZWxvdy4KLQotVGhpcyBkYXRhLCB1bmxlc3Mgb3RoZXJ3aXNlIHN0YXRlZCwgaXMgQVJNIFByb3ByaWV0YXJ5IGFuZCBhY2Nlc3MgdG8gaXQKLWlzIHN1YmplY3QgdG8gdGhlIGFncmVlbWVudHMgaW5kaWNhdGVkIGJlbG93LgotCi1JZiB5b3UgZXhwZXJpZW5jZSBwcm9ibGVtcyB3aXRoIHRoaXMgZGF0YSwgcGxlYXNlIGNvbnRhY3QgQVJNIHN1cHBvcnQKLXF1b3RpbmcgdHJhbnNhY3Rpb24gcmVmZXJlbmNlIDw5NzQxMz4uCi0KLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KLQotLSBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MQotICBWaWRlbyBjb2RlY3MgLSBvcHRpbWlzZWQgY29kZQotICBWNiBvcHRpbWl6ZWQgY29kZSByZWxlYXNlIGZvciBIYW50cm8gKFZlciAxLjAuMikKLSAgaW50ZXJuYWwgYWNjZXNzCi0KLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KLQotVGhpcyB0cmFuc2FjdGlvbiBjb250YWlucyBkZWxpdmVyYWJsZXMgd2hpY2ggYXJlIGRlc2lnbmF0ZWQgYXMgYmVpbmcgb2YKLWJldGEgcmVsZWFzZSBzdGF0dXMgKEJFVCkuCi0KLUJldGEgcmVsZWFzZSBzdGF0dXMgaGFzIGEgcGFydGljdWxhciBtZWFuaW5nIHRvIEFSTSBvZiB3aGljaCB0aGUgcmVjaXBpZW50Ci1tdXN0IGJlIGF3YXJlLiBCZXRhIGlzIGEgcHJlLXJlbGVhc2Ugc3RhdHVzIGluZGljYXRpbmcgdGhhdCB0aGUgZGVsaXZlcmFibGUKLXNvIGRlc2NyaWJlZCBpcyBiZWxpZXZlZCB0byByb2J1c3RseSBkZW1vbnN0cmF0ZSBzcGVjaWZpZWQgYmVoYXZpb3VyLCB0byBiZQotY29uc2lzdGVudCBhY3Jvc3MgaXRzIGluY2x1ZGVkIGFzcGVjdHMgYW5kIGJlIHJlYWR5IGZvciBnZW5lcmFsIGRlcGxveW1lbnQuCi1CdXQgQmV0YSBhbHNvIGluZGljYXRlcyB0aGF0IHByZS1yZWxlYXNlIHJlbGlhYmlsaXR5IHRyaWFscyBhcmUgb25nb2luZyBhbmQKLXRoYXQgaXQgaXMgcG9zc2libGUgcmVzaWR1YWwgZGVmZWN0cyBvciBlcnJvcnMgaW4gb3BlcmF0aW9uLCBjb25zaXN0ZW5jeQotYW5kIGRvY3VtZW50YXRpb24gbWF5IHN0aWxsIGJlIGVuY291bnRlcmVkLiBUaGUgcmVjaXBpZW50IHNob3VsZCBjb25zaWRlcgotdGhpcyBwb3NpdGlvbiB3aGVuIHVzaW5nIHRoaXMgQmV0YSBtYXRlcmlhbCBzdXBwbGllZC4gQVJNIHdpbGwgbm9ybWFsbHkKLWF0dGVtcHQgdG8gcHJvdmlkZSBmaXhlcyBvciBhIHdvcmstYXJvdW5kIGZvciBkZWZlY3RzIGlkZW50aWZpZWQgYnkgdGhlCi1yZWNpcGllbnQsIGJ1dCB0aGUgcHJvdmlzaW9uIG9yIHRpbWVsaW5lc3Mgb2YgdGhpcyBzdXBwb3J0IGNhbm5vdCBiZQotZ3VhcmFudGVlZC4gQVJNIHNoYWxsIG5vdCBiZSByZXNwb25zaWJsZSBmb3IgZGlyZWN0IG9yIGNvbnNlcXVlbnRpYWwKLWRhbWFnZXMgYXMgYSByZXN1bHQgb2YgZW5jb3VudGVyaW5nIG9uZSBvciBtb3JlIG9mIHRoZXNlIHJlc2lkdWFsIGRlZmVjdHMuCi1CeSBhY2NlcHRpbmcgYSBCZXRhIHJlbGVhc2UsIHRoZSByZWNpcGllbnQgYWdyZWVzIHRvIHRoZXNlIGNvbnN0cmFpbnRzIGFuZAotdG8gcHJvdmlkaW5nIHJlYXNvbmFibGUgaW5mb3JtYXRpb24gdG8gQVJNIHRvIGVuYWJsZSB0aGUgcmVwbGljYXRpb24gb2YgdGhlCi1kZWZlY3RzIGlkZW50aWZpZWQgYnkgdGhlIHJlY2lwaWVudC4gVGhlIHNwZWNpZmljIEJldGEgdmVyc2lvbiBzdXBwbGllZAotd2lsbCBub3QgYmUgc3VwcG9ydGVkIGFmdGVyIHJlbGVhc2Ugb2YgYSBsYXRlciBvciBoaWdoZXIgc3RhdHVzIHZlcnNpb24uCi1JdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBTdXBwb3J0IGZvciB0aGUgQmV0YSByZWxlYXNlIG9mIHRoZSBkZWxpdmVyYWJsZQotd2lsbCBvbmx5IGJlIHByb3ZpZGVkIGJ5IEFSTSB0byBhIHJlY2lwaWVudCB3aG8gaGFzIGEgY3VycmVudCBzdXBwb3J0IGFuZAotbWFpbnRlbmFuY2UgY29udHJhY3QgZm9yIHRoZSBkZWxpdmVyYWJsZS4KLQotCi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCi0KLUluIGFkZGl0aW9uIHRvIHRoZSBkYXRhIHZlcnNpb25zIGxpc3RlZCBhYm92ZSwgdGhpcyB0cmFuc2FjdGlvbiBjb250YWlucwotdHdvIGFkZGl0aW9uYWwgZmlsZXMgYXQgdGhlIHRvcCBsZXZlbC4KLQotVGhlIGZpcnN0IGlzIHRoaXMgZmlsZSwgQVJNX0RFTElWRVJZXzk3NDEzLlRYVCwgd2hpY2ggaXMgdGhlIGRlbGl2ZXJ5Ci1ub3RlLgotCi1UaGUgc2Vjb25kIGlzIEFSTV9NQU5JRkVTVF85NzQxMy5UWFQgd2hpY2ggY29udGFpbnMgYSBtYW5pZmVzdCBvZiBhbGwgdGhlCi1maWxlcyBpbmNsdWRlZCBpbiB0aGlzIHRyYW5zYWN0aW9uLCB0b2dldGhlciB3aXRoIHRoZWlyIGNoZWNrc3Vtcy4KLQotVGhlIGNoZWNrc3VtcyBwcm92aWRlZCBhcmUgY2FsY3VsYXRlZCB1c2luZyB0aGUgUlNBIERhdGEgU2VjdXJpdHksIEluYy4KLU1ENSBNZXNzYWdlLURpZ2VzdCBBbGdvcml0aG0uCi0KLVRoZSBjaGVja3N1bXMgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IHRoZSBpbnRlZ3JpdHkgb2YgdGhpcyBkYXRhIHVzaW5nIHRoZQotIm1kNXN1bSIgdG9vbCAod2hpY2ggaXMgcGFydCBvZiB0aGUgR05VICJ0ZXh0dXRpbHMiIHBhY2thZ2UpIGJ5IHJ1bm5pbmc6Ci0KLSAgJSBtZDVzdW0gLS1jaGVjayBBUk1fTUFOSUZFU1RfOTc0MTMuVFhUCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9BUk1fTUFOSUZFU1QuVFhUIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL0FSTV9NQU5JRkVTVC5UWFQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMjIzOGIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL0FSTV9NQU5JRkVTVC5UWFQKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0JCQkJICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS8KLQkJCQkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS8KLWUwNDk3OTFjZmFiNjA2MGEwOGNiYWM3YjNhZDc2N2Q2ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTV9zLmgKLWVkNzk4ZmFjZTI1NDk3YjI3MDNlZGU3MzZkNmQ1MmI2ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvb214dHlwZXNfcy5oCi00ZWViZDYzYWYwODczNzY4MTFkNjc0OWYwNjQ2Yjg2NCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU1fQml0RGVjX3MuaAotNDNjZjQ2YzJjZjJmZTFmOTNjNjE1YjU3YmNiZTQ4MDkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NLmgKLThmMjQ4Y2VhYWM4ZjYwMmUyNzdhNTIxYjY3OWRjYmJlICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTV9JRENUVGFibGUuaAotNTNmMmFlOGE5ODQ5NWYwNWUyNmE0Y2Y4NjJhN2Y3NTAgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX1ZlcnNpb24uaAotM2EyZjQyMGRkZjZhMWI5NTA0NzBiZDBmNWViZDVjNjIgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX0lEQ1Rfcy5oCi01MTFjMGJiNTM0ZmUyMjM1OTllMmM4NGVmZjI0YzllZCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU1fTWFza1RhYmxlLmgKLTg5NzE5MzJkNTZlZWQ2YjFhZDFiYTUwN2YwYmZmNWYwICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTV9CaXRzdHJlYW0uaAotZjg3ZmVkZDljYTQzMmZlZmE3NTcwMDgxNzY4NjRlZjggIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1PTVguaAotOGU0OTg5OWE0Mjg4MjJjMzZlZjlkZDk0ZTBlMDVmMTggIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9vbXh0eXBlcy5oCi02OTQyODFkMTFhZjUyZjg4ZTZmOWQ0Y2IyMjZhYzhhNyAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvYnVpbGRfdmMucGwKLWU3MmQ5NmMwYTQxNTQ1OTc0OGRmOTgwN2YzZGFlNzJmICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS9maWxlbGlzdF92Yy50eHQKLQkJCQkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3NyYy8KLTVlZWFlNjU5YTI5NDc3ZjVjNTIyOTZkMjRhZmZmZDNjICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS9zcmMvYXJtQ09NTV9JRENUVGFibGUuYwotZDY0Y2RjZjM4Zjc3NDlkYzdmNzc0NjVlNWI3ZDM1NmQgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3NyYy9hcm1DT01NX01hc2tUYWJsZS5jCi0JCQkJICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy8KLQkJCQkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwLwotCQkJCSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjLwotZTdlMGMzMjA5Nzg1NjRhN2M5YjJjNzIzNzQ5YTk4ZDYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKLTRhZGNkMGRmMDgxOTkwYmRmYzQ3MjkwNDFhMmE5MTUyICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCi04NTJlMDQwNDE0Mjk2NWRjMWYzYWE3ZjAwZWU1MTI3YiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5zCi03MDU0MTUxYzViZmVhNmI1ZTc0ZmVlZTg2YjJkN2IwMSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYwotMzg5NDRjNWUwYmJhMDFlMzJmZjM0OWMyYzg3YzcxYjIgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5zCi0zMmZmNGI4YmU2MmUyZjBmM2U3NjRiODNjMWU1ZTJmZCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMKLTkwYjBlNmEwNGU3NjQ5MDJjMGEwOTAzNjQwYzEwYjMyICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYV91bnNhZmVfcy5zCi0yOGExOWFlNGZlMjI1ODYyODA4MGQ2YTg5YmI1NGI5MSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5zCi05OGUxOTZiOWUxZmZlYmFmOTFmNjJlYTlkMTdmYjk3ZCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MucwotMDFiYTYwZWZmNjZlYTQ5YTRmODMzY2U2Mjc5ZjhlMmYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYwotZjMwMWQ1YTk1ZTA3MzU0ZjU5M2VhNTc0N2MwMWNiMGEgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZV9zLnMKLTQ0YzllZjIxZTg0MGExMDAzMDFmN2Q3YTQxODk5NTdjICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MucwotYTMzYjAzYmJkMzM1MmQyNGVkNzQ0NzY5ZTEyYmI4N2QgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZV9zLnMKLTAwYzIwYmZkYTY3YmI4NjA5NmI2MTVmYzE3Yzk0YjM1ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcl9zLnMKLTJkZGNhZjYwYThlYTFlNmU2Yjc3NzM3Zjc2OGJmYjlkICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9RdWFudFRhYmxlc19zLnMKLWMzMDAyYWFkNTYwMGY4NzJiNzBhNWQ3ZmUzOTE1ODQ2ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MucwotYTI5MDBmMmM0N2YxYzYxZDIwYmQ2YzFlZGEzM2Q2ZDQgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLnMKLWU0ZmVjZDY2YmM0N2YwNzUzOWJjMzA4OTM1ZTg0YTFmICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MucwotNzg4MTVjOWRmNTBiYTUzMTMxYmIyMmQyYjgyOWUzYzMgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLnMKLTE5MDlhZTMxMmFjNzlhMDNhNWZhYzFkMWU4YmMwMjkxICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLnMKLTNkMmM0ODU4MDY1NTkyODA2NWRlNzgzOTg2NmQ5YmM0ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MucwotMjNhYTJmZGYxNTVkNGZhNmZmNzQ1ZWFiNmUwMWYzMmIgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNl9zLnMKLTk3ZjIwYTkzYzQ4MWQ3ZjYxNzNkOTE5ZjQxZTQxNWJkICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSV9zLnMKLWJlY2Q1MTJkYTIwMjQzNjI4NjgxMWI2YWVjMDYxZjQ3ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5zCi1kZDI0YTk5YWUzY2Q4NDJkY2FjYWYzMWQ0N2RlODhiMyAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MucwotYzJkOTk1Zjc4N2I2ZjQ0ZWYxMGM3NTFjMTJkMTkzNWYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9EaWFnQ29weV91bnNhZmVfcy5zCi0zNjI4ZmJkZjBjZDIxN2MyODdiNmNjYzk0MTM1ZDA2ZSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLnMKLTRhNTJiM2U5ZTI2OGI4YThmMDc4MjliZjUwMGQwM2FmICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5zCi0xMTI0OWY4YTk4YzVkNGI4NGNiNTU3NWIwZTM3Y2E5YyAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5zCi0zNTk5YjEwNzQzMzA5NjVjOGNhMjg1ZDE2NGVmY2NmZiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MucwotMzMzOWUwMjZjN2RlNjU1ZDk0MDA5NDllYjVlNTE0NTEgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MucwotY2M0YTZmMzJkYjBiNzJhOTFkM2YyNzhmNjg1NWRmNjkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYwotCQkJCSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvYXBpLwotNmU1MzBkZGFhN2MyYjU3ZmZlODgxNjJjMDIwY2I2NjIgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKLQkJCQkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvCi0JCQkJICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy8KLWNkZjQxMjkyMGMyMDM3YTcyNWQwNDIwMDAyYjY3NTJlICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2xpcDhfcy5zCi1kYmE5ODI0ZTk1OWIyMWQ0MDFjYWM5MjVlNjhhMTFhNiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcl9zLnMKLWI1NTliNzFkNWM5NDYyN2YxMGU2MTZmYjcyYzBjZWZjICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JX3MucwotNGZiYTRjNDMxYTc4M2E3OGEyZWI2NDk3YTk0YWM5NjcgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKLTFlNGMzYmU4YzVlZGRjMDBjOWYwNWU4M2JjZjMxNWVmICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUNSZWNvbkJsb2NrX3MucwotMWIwYjI5OTBjMjY2OWRmYjg3Y2Y2YjgxMDYxMWMwMWIgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYwotMWM5Yjg3YWJmMzI4M2U5NTc4MTZiMzkzN2M2ODA3MDEgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QX3MucwotNGZlMWFmY2E2NTlhOTA1NWZjMTE3MmU1OGY3OGE1MDYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYwotMmVhMDY3ZjA0MzZmOTFiYTEzNTFlZGFmNDExY2I0ZWEgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9Mb29rdXBfVGFibGVzLmMKLWFjYjkyYmUxZGJjZGIzZWJlODI0Y2JlOWUyOGQwM2JmICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfSURDVDh4OGJsa19zLnMKLWE2YjQxZjAxYjFkZjdkZDY1NmViZGJhMzA4NGJmYTJhICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRmluZE1WcHJlZF9zLnMKLTI5M2E0OGE2NDhhMzA4NTQ1NmU2NjY1YmI3MzY2ZmFkICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpcl9zLnMKLWZmZTZiOTZjNzRkNDg4MWY0ZDNjOGRlOGNjNzM3Nzk3ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JX3MucwotNDM3ZGZhMjA0NTA4ODUwZDYxZDRiODcwOTE0NDZlOWYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQ19zLnMKLWZmNTkxNWQxODFiZmQyY2QyZjBiZDU4OGJkMjMwMGRjICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTENfcy5zCi02Nzc1ZWIwYzU2MWRiYWI5NjVjNjBmODViMDhjOTZmZCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYV9zLnMKLWEwZDg1ZjRmNTE3Yzk0NWE0YzkzMTdhYzAyMWYyZDA4ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZV9zLnMKLTM4NjAyMGRlZThiNzI1YzdmZTI1MjZmMWZjMjExZDdkICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKLQkJCQkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvYXBpLwotNDYyNGU3YzgzOGUxMGEyNDlhYmNjM2QzZjRmNDA3NDggIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvYXBpL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaAotNjVlMTA1N2QwNGUyY2I4NDQ1NTlkYzlmNmUwOTc5NWEgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKLQkJCQkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL3NyYy8KLWU2MjdiMzM0NmIwZGM5YWZmMTQ0NDYwMDVjZTBmYTQzICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9zcmMvYXJtVkNfVmVyc2lvbi5jCi0JCQkJICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9hcGkvCi03Y2E5NGIxYzMzYWMwMjExZTE3ZDM4YmFhZGQ3ZDFkZCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvYXBpL2FybVZDLmgKLTEyY2Y3NTk2ZWRiYmY2MDQ4YjYyNmQxNWU4ZDBlZDQ4ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9hcGkvb214VkMuaAotMTE3MjZlMjg2YTgxMjU3Y2I0NWY1NTQ3ZmI0ZDM3NGMgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2FwaS9vbXhWQ19zLmgKLWE1YjJhZjYwNWMzMTljZDI0OTEzMTllNDMwNzQxMzc3ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9hcGkvYXJtVkNDT01NX3MuaAotCQkJCSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS8KLQkJCQkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjLwotNTBjY2E2OTU0YzQ0N2IwMTJhYjM5Y2E3ODcyZTVlOGYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5MTZ4MTZfcy5zCi1kMWMzYmNlNzdmYzU3NzRjODk5YjQ0N2QxM2YwMmNkMCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHk4eDhfcy5zCi1mZGFjMWQxYmFkM2ZkMjNjODgwYmViMzliYzJlODlhYSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0lfcy5zCi02ZDlhZGMyYmU1YmQwMzExNTkxMDMwZDBjNmRmNzcxYyAgQVJNX0RFTElWRVJZXzk3NDEzLlRYVApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJiOTdlMi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU0uaAorKysgL2Rldi9udWxsCkBAIC0xLDgwMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtQ09NTS5oCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiAgIAotICogRmlsZTogYXJtQ09NTS5oCi0gKiBCcmllZjogRGVjbGFyZXMgQ29tbW9uIEFQSXMvRGF0YSBUeXBlcyB1c2VkIGFjcm9zcyBPcGVuTUFYIEFQSSdzCi0gKgotICovCi0gCi0gIAotI2lmbmRlZiBfYXJtQ29tbW9uX0hfCi0jZGVmaW5lIF9hcm1Db21tb25fSF8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIE9NWF9GMzIgUmU7IC8qKiBSZWFsIHBhcnQgKi8KLSAgT01YX0YzMiBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQotICAgICAgICAKLX0gT01YX0ZDMzI7IC8qKiBzaW5nbGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IGNvbXBsZXggbnVtYmVyICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIE9NWF9GNjQgUmU7IC8qKiBSZWFsIHBhcnQgKi8KLSAgT01YX0Y2NCBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQotICAgICAgICAKLX0gT01YX0ZDNjQ7IC8qKiBkb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IGNvbXBsZXggbnVtYmVyICovCi0KLQotLyogVXNlZCBieSBib3RoIElQIGFuZCBJQyBkb21haW5zIGZvciA4eDggSlBFRyBibG9ja3MuICovCi10eXBlZGVmIE9NWF9TMTYgQVJNX0JMT0NLOHg4WzY0XTsKLQotCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0KLSNkZWZpbmUgIGFybVBJIChPTVhfRjY0KSgzLjE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3OTUpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogQ29tcGlsZXIgZXh0ZW5zaW9ucyAqLwotI2lmZGVmIEFSTV9ERUJVRwotLyogZGVidWcgdmVyc2lvbiAqLwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jZGVmaW5lIGFybUVycm9yKHN0cikge3ByaW50Zigoc3RyKSk7IHByaW50ZigiXG4iKTsgZXhpdCgtMSk7fQotI2RlZmluZSBhcm1XYXJuKHN0cikge3ByaW50Zigoc3RyKSk7IHByaW50ZigiXG4iKTt9Ci0jZGVmaW5lIGFybUlnbm9yZShhKSAoKHZvaWQpYSkKLSNkZWZpbmUgYXJtQXNzZXJ0KGEpIGFzc2VydChhKQotI2Vsc2UgCi0vKiByZWxlYXNlIHZlcnNpb24gKi8KLSNkZWZpbmUgYXJtRXJyb3Ioc3RyKSAoKHZvaWQpIChzdHIpKQotI2RlZmluZSBhcm1XYXJuKHN0cikgICgodm9pZCkgKHN0cikpCi0jZGVmaW5lIGFybUlnbm9yZShhKSAgKCh2b2lkKSAoYSkpCi0jZGVmaW5lIGFybUFzc2VydChhKSAgKCh2b2lkKSAoYSkpCi0jZW5kaWYgLyogQVJNX0RFQlVHICovCi0KLS8qIEFyaXRobWV0aWMgb3BlcmF0aW9ucyAqLwotCi0jZGVmaW5lIGFybU1pbihhLGIpICAgICAgICAgICAgICggKGEpID4gKGIpID8gIChiKTooYSkgKQotI2RlZmluZSBhcm1NYXgoYSxiKSAgICAgICAgICAgICAoIChhKSA+IChiKSA/ICAoYSk6KGIpICkKLSNkZWZpbmUgYXJtQWJzKGEpICAgICAgICAgICAgICAgKCAoYSkgPCAgMCAgPyAtKGEpOihhKSApCi0KLS8qIEFsaWdubWVudCBvcGVyYXRpb24gKi8KLQotI2RlZmluZSBhcm1BbGlnblRvQnl0ZXMoUHRyLE4pICAgICAgKFB0ciArICggKChOLShpbnQpUHRyKSYoTi0xKSkgLyBzaXplb2YoKlB0cikgKSkKLSNkZWZpbmUgYXJtQWxpZ25UbzJCeXRlcyhQdHIpICAgICAgIGFybUFsaWduVG9CeXRlcyhQdHIsMikKLSNkZWZpbmUgYXJtQWxpZ25UbzRCeXRlcyhQdHIpICAgICAgIGFybUFsaWduVG9CeXRlcyhQdHIsNCkKLSNkZWZpbmUgYXJtQWxpZ25UbzhCeXRlcyhQdHIpICAgICAgIGFybUFsaWduVG9CeXRlcyhQdHIsOCkKLSNkZWZpbmUgYXJtQWxpZ25UbzE2Qnl0ZXMoUHRyKSAgICAgIGFybUFsaWduVG9CeXRlcyhQdHIsMTYpCi0KLS8qIEVycm9yIGFuZCBBbGlnbm1lbnQgY2hlY2sgKi8KLQotI2RlZmluZSBhcm1SZXRBcmdFcnJJZihjb25kaXRpb24sIGNvZGUpICBpZihjb25kaXRpb24pIHsgcmV0dXJuIChjb2RlKTsgfQotI2RlZmluZSBhcm1SZXREYXRhRXJySWYoY29uZGl0aW9uLCBjb2RlKSBpZihjb25kaXRpb24pIHsgcmV0dXJuIChjb2RlKTsgfQotCi0jaWZuZGVmIEFMSUdOTUVOVF9ET0VTTlRfTUFUVEVSCi0jZGVmaW5lIGFybUlzQnl0ZUFsaWduZWQoUHRyLE4pICAgICAoKCgoaW50KShQdHIpKSAlIE4pPT0wKQotI2RlZmluZSBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsTikgICAgKCgoKGludCkoUHRyKSkgJSBOKSE9MCkKLSNlbHNlCi0jZGVmaW5lIGFybUlzQnl0ZUFsaWduZWQoUHRyLE4pICAgICAoMSkKLSNkZWZpbmUgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLE4pICAgICgwKQotI2VuZGlmCi0KLSNkZWZpbmUgYXJtSXMyQnl0ZUFsaWduZWQoUHRyKSAgICAgIGFybUlzQnl0ZUFsaWduZWQoUHRyLDIpCi0jZGVmaW5lIGFybUlzNEJ5dGVBbGlnbmVkKFB0cikgICAgICBhcm1Jc0J5dGVBbGlnbmVkKFB0ciw0KQotI2RlZmluZSBhcm1JczhCeXRlQWxpZ25lZChQdHIpICAgICAgYXJtSXNCeXRlQWxpZ25lZChQdHIsOCkKLSNkZWZpbmUgYXJtSXMxNkJ5dGVBbGlnbmVkKFB0cikgICAgIGFybUlzQnl0ZUFsaWduZWQoUHRyLDE2KQotCi0jZGVmaW5lIGFybU5vdDJCeXRlQWxpZ25lZChQdHIpICAgICBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsMikKLSNkZWZpbmUgYXJtTm90NEJ5dGVBbGlnbmVkKFB0cikgICAgIGFybU5vdEJ5dGVBbGlnbmVkKFB0ciw0KQotI2RlZmluZSBhcm1Ob3Q4Qnl0ZUFsaWduZWQoUHRyKSAgICAgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLDgpCi0jZGVmaW5lIGFybU5vdDE2Qnl0ZUFsaWduZWQoUHRyKSAgICBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsMTYpCi0jZGVmaW5lIGFybU5vdDMyQnl0ZUFsaWduZWQoUHRyKSAgICBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsMzIpCi0KLS8qKgotICogRnVuY3Rpb246IGFybVJvdW5kRmxvYXRUb1MxNl9yZWYvYXJtUm91bmRGbG9hdFRvUzMyX3JlZi9hcm1Sb3VuZEZsb2F0VG9TNjQKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgc2hvcnQgaW50L2ludCBhZnRlciByb3VuZGluZwotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMTYvT01YX1MzMiBmb3JtYXQKLSAqCi0gKi8KLQotT01YX1MxNiBhcm1Sb3VuZEZsb2F0VG9TMTYgKE9NWF9GNjQgVmFsdWUpOwotT01YX1MzMiBhcm1Sb3VuZEZsb2F0VG9TMzIgKE9NWF9GNjQgVmFsdWUpOwotT01YX1M2NCBhcm1Sb3VuZEZsb2F0VG9TNjQgKE9NWF9GNjQgVmFsdWUpOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9TMTZfcmVmL2FybVNhdFJvdW5kRmxvYXRUb1MzMgotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBzaG9ydCBpbnQvaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MxNi9PTVhfUzMyIGZvcm1hdAotICoKLSAqLwotCi1PTVhfUzE2IGFybVNhdFJvdW5kRmxvYXRUb1MxNiAoT01YX0Y2NCBWYWx1ZSk7Ci1PTVhfUzMyIGFybVNhdFJvdW5kRmxvYXRUb1MzMiAoT01YX0Y2NCBWYWx1ZSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1UxNl9yZWYvYXJtU2F0Um91bmRGbG9hdFRvVTMyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHVuc2lnbmVkIHNob3J0IGludC9pbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfVTE2L09NWF9VMzIgZm9ybWF0Ci0gKgotICovCi0KLU9NWF9VMTYgYXJtU2F0Um91bmRGbG9hdFRvVTE2IChPTVhfRjY0IFZhbHVlKTsKLU9NWF9VMzIgYXJtU2F0Um91bmRGbG9hdFRvVTMyIChPTVhfRjY0IFZhbHVlKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtU2lnbkNoZWNrCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDaGVja3MgdGhlIHNpZ24gb2YgYSB2YXJpYWJsZToKLSAqIHJldHVybnMgMSBpZiBpdCBpcyBQb3NpdGl2ZQotICogcmV0dXJucyAwIGlmIGl0IGlzIDAKLSAqIHJldHVybnMgLTEgaWYgaXQgaXMgTmVnYXRpdmUgCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQkgICAgdmFyICAgICBWYXJpYWJsZSB0byBiZSBjaGVja2VkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX0lOVCAtLSAgIHJldHVybnMgMSBpZiBpdCBpcyBQb3NpdGl2ZQotICogICAgICAgICAgICAgIHJldHVybnMgMCBpZiBpdCBpcyAwCi0gKiAgICAgICAgICAgICAgcmV0dXJucyAtMSBpZiBpdCBpcyBOZWdhdGl2ZSAKLSAqLyAKLSAKLU9NWF9JTlQgYXJtU2lnbkNoZWNrIChPTVhfUzE2IHZhcik7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybUNsaXAKLSAqCi0gKiBEZXNjcmlwdGlvbjogQ2xpcHMgdGhlIGlucHV0IGJldHdlZW4gTUFYIGFuZCBNSU4gdmFsdWUKLSAqIAotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gTWluICAgICBsb3dlciBib3VuZAotICogW2luXSBNYXggICAgIHVwcGVyIGJvdW5kCi0gKiBbaW5dIHNyYyAgICAgdmFyaWFibGUgdG8gdGhlIGNsaXBwZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfUzMyIC0tICAgcmV0dXJucyBjbGlwcGVkIHZhbHVlCi0gKi8gCi0gCi1PTVhfUzMyIGFybUNsaXAgKAotICAgICAgICBPTVhfSU5UIG1pbiwKLSAgICAgICAgT01YX0lOVCBtYXgsIAotICAgICAgICBPTVhfUzMyIHNyYwotICAgICAgICApOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1DbGlwX0YzMgotICoKLSAqIERlc2NyaXB0aW9uOiBDbGlwcyB0aGUgaW5wdXQgYmV0d2VlbiBNQVggYW5kIE1JTiB2YWx1ZQotICogCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBNaW4gICAgIGxvd2VyIGJvdW5kCi0gKiBbaW5dIE1heCAgICAgdXBwZXIgYm91bmQKLSAqIFtpbl0gc3JjICAgICB2YXJpYWJsZSB0byB0aGUgY2xpcHBlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9GMzIgLS0gICByZXR1cm5zIGNsaXBwZWQgdmFsdWUKLSAqLyAKLSAKLU9NWF9GMzIgYXJtQ2xpcF9GMzIgKAotICAgICAgICBPTVhfRjMyIG1pbiwKLSAgICAgICAgT01YX0YzMiBtYXgsIAotICAgICAgICBPTVhfRjMyIHNyYwotICAgICAgICApOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1TaGlmdFNhdF9GMzIKLSAqCi0gKiBEZXNjcmlwdGlvbjogRGl2aWRlcyBhIGZsb2F0IHZhbHVlIGJ5IDJec2hpZnQgYW5kIAotICogc2F0dXJhdGVzIGl0IGZvciB1bnNpZ25lZCB2YWx1ZSByYW5nZSBmb3Igc2F0Qml0cy4KLSAqIFNlY29uZCBwYXJhbWV0ZXIgaXMgbGlrZSAic2hpZnRpbmciIHRoZSBjb3JyZXNwb25kaW5nIAotICogaW50ZWdlciB2YWx1ZS4gVGFrZXMgY2FyZSBvZiByb3VuZGluZyB3aGlsZSBjbGlwcGluZyB0aGUgZmluYWwgCi0gKiB2YWx1ZS4KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSB2ICAgICAgICAgIE51bWJlciB0byBiZSBvcGVyYXRlZCB1cG9uCi0gKiBbaW5dIHNoaWZ0ICAgICAgRGl2aWRlcyB0aGUgaW5wdXQgInYiIGJ5ICIyXnNoaWZ0IgotICogW2luXSBzYXRCaXRzICAgIEZpbmFsIHJhbmdlIGlzIFswLCAyXnNhdEJpdHMpCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1MzMiAtLSAgIHJldHVybnMgInNoaWZ0ZWQiIHNhdHVyYXRlZCB2YWx1ZQotICovIAotIAotT01YX1UzMiBhcm1TaGlmdFNhdF9GMzIoCi0gICAgICAgIE9NWF9GMzIgdiwgCi0gICAgICAgIE9NWF9JTlQgc2hpZnQsIAotICAgICAgICBPTVhfSU5UIHNhdEJpdHMKLSAgICAgICAgKTsKLQotLyoqCi0gKiBGdW5jdGlvbnM6IGFybVN3YXBFbGVtCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHN3YXBzIHR3byBlbGVtZW50cyBhdCB0aGUgc3BlY2lmaWVkIHBvaW50ZXIgbG9jYXRpb25zLgotICogVGhlIHNpemUgb2YgZWFjaCBlbGVtZW50IGNvdWxkIGJlIGFueXRoaW5nIGFzIHNwZWNpZmllZCBieSA8ZWxlbVNpemU+Ci0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YUmVzdWx0IC0tIEVycm9yIHN0YXR1cyBmcm9tIHRoZSBmdW5jdGlvbgotICovCi1PTVhSZXN1bHQgYXJtU3dhcEVsZW0oT01YX1U4ICpwQnVmMSwgT01YX1U4ICpwQnVmMiwgT01YX0lOVCBlbGVtU2l6ZSk7Ci0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtTWVkaWFuT2YzCi0gKgotICogRGVzY3JpcHRpb246IEZpbmRzIHRoZSBtZWRpYW4gb2YgdGhyZWUgbnVtYmVycwotICogCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIGZFbnRyeSAgICAgRmlyc3QgZW50cnkKLSAqIFtpbl0gc0VudHJ5ICAgICBzZWNvbmQgZW50cnkKLSAqIFtpbl0gdEVudHJ5ICAgICBUaGlyZCBlbnRyeQotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TMzIgLS0gICByZXR1cm5zIHRoZSBtZWRpYW4gdmFsdWUKLSAqLyAKLSAKLU9NWF9TMzIgYXJtTWVkaWFuT2YzICgKLSAgICBPTVhfUzMyIGZFbnRyeSwKLSAgICBPTVhfUzMyIHNFbnRyeSwgCi0gICAgT01YX1MzMiB0RW50cnkgCi0gICAgKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtTG9nU2l6ZQotICoKLSAqIERlc2NyaXB0aW9uOiBGaW5kcyB0aGUgc2l6ZSBvZiBhIHBvc2l0aXZlIHZhbHVlIGFuZCByZXR1cm5zIHRoZSBzYW1lCi0gKiAKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gdmFsdWUgICAgUG9zaXRpdmUgdmFsdWUKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfVTggLS0gICByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBwb3NpdGl2ZSB2YWx1ZQotICovIAotIAotT01YX1U4IGFybUxvZ1NpemUgKAotICAgIE9NWF9VMTYgdmFsdWUgCi0gICAgKTsgICAgCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICAgICAvKiBTYXR1cmF0aW5nIEFyaXRobWV0aWMgb3BlcmF0aW9ucyAqLwotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRBZGRfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgYWRkaXRpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCi0gKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqIAotICogICAgCi0gKiovCi0KLU9NWF9TMzIgYXJtU2F0QWRkX1MzMigKLSAgICAgICAgICAgICAgICBPTVhfUzMyIFZhbHVlMSwKLSAgICAgICAgICAgICAgICBPTVhfUzMyIFZhbHVlMgotICAgICAgICAgICAgICAgICk7Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdEFkZF9TNjQoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBhZGRpdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKLSAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogCi0gKiAgICAKLSAqKi8KLQotT01YX1M2NCBhcm1TYXRBZGRfUzY0KAotICAgICAgICAgICAgICAgIE9NWF9TNjQgVmFsdWUxLAotICAgICAgICAgICAgICAgIE9NWF9TNjQgVmFsdWUyCi0gICAgICAgICAgICAgICAgKTsKLQotLyoqIEZ1bmN0aW9uIDphcm1TYXRTdWJfUzMyKCkKLSAqIAotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgc3Vic3RyYWN0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAotICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAKLSAqKi8KLQotT01YX1MzMiBhcm1TYXRTdWJfUzMyKAotICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIFZhbHVlMSwKLSAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBWYWx1ZTIKLSAgICAgICAgICAgICAgICAgICAgKTsKLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0TWFjX1MzMigpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBNdWx0aXBsaWNhdGlvbiBvZiBWYWx1ZTEgYW5kIFZhbHVlMiBhbmQgc3ViZXNxdWVudCBzYXR1cmF0ZWQKLSAqICAgICBhY2N1bXVsYXRpb24gd2l0aCBNYWMKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCi0gKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAotICogW2luXSBNYWMgICAgICAgICAgQWNjdW11bGF0b3IKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiovCi0KLU9NWF9TMzIgYXJtU2F0TWFjX1MzMigKLSAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBNYWMsCi0gICAgICAgICAgICAgICAgICAgIE9NWF9TMTYgVmFsdWUxLAotICAgICAgICAgICAgICAgICAgICBPTVhfUzE2IFZhbHVlMgotICAgICAgICAgICAgICAgICAgICApOwotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRNYWNfUzE2UzMyX1MzMgotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBNQUMgb3BlcmF0aW9uIG9mIHRoZSB0aHJlZSBpbnB1dHMgZGVsYXlFbGVtLCBmaWxUYXAgLCBtYWMKLSAqCi0gKiAgIG1hYyA9IG1hYyArIFNhdHVyYXRlX2luXzMyQml0cyhkZWxheUVsZW0gKiBmaWxUYXApCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBkZWxheUVsZW0gICAgRmlyc3QgMzIgYml0IE9wZXJhbmQKLSAqIFtpbl0gZmlsVGFwICAgICAgIFNlY29uZCAxNiBiaXQgT3BlcmFuZAotICogW2luXSBtYWMgICAgICAgICAgUmVzdWx0IG9mIE1BQyBvcGVyYXRpb24KLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgbWFjICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLSAKLU9NWF9TMzIgYXJtU2F0TWFjX1MxNlMzMl9TMzIoCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIG1hYywgCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIGRlbGF5RWxlbSwgCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzE2IGZpbFRhcCApOwotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZFJpZ2h0U2hpZnRfUzMyX1MxNgotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHJvdW5kZWQgcmlnaHQgc2hpZnQgb3BlcmF0aW9uIG9mIGlucHV0IGJ5IHRoZSBzY2FsZWZhY3RvcgotICoKLSAqICAgb3V0cHV0ID0gU2F0dXJhdGVfaW5fMTZCaXRzKCAoIFJpZ2h0U2hpZnQoIChSb3VuZChpbnB1dCkgLCBzY2FsZUZhY3RvciApICkKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIGlucHV0ICAgICAgIFRoZSBpbnB1dCB0byBiZSBvcGVyYXRlZCBvbgotICogW2luXSBzY2FsZUZhY3RvciBUaGUgc2hpZnQgbnVtYmVyCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLQotCi1PTVhfUzE2IGFybVNhdFJvdW5kUmlnaHRTaGlmdF9TMzJfUzE2KAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBpbnB1dCwgCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU5UIHNjYWxlRmFjdG9yKTsKLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRMZWZ0U2hpZnRfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRpbmcgbGVmdC1zaGlmdCBvcGVyYXRpb24gb24gaW5wdXQKLSAqICAgICBPciByb3VuZGVkIFJpZ2h0IHNoaWZ0IGlmIHRoZSBpbnB1dCBTaGlmdCBpcyBuZWdhdGl2ZS4KLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlICAgICAgICBPcGVyYW5kCi0gKiBbaW5dIHNoaWZ0ICAgICAgICBPcGVyYW5kIGZvciBzaGlmdCBvcGVyYXRpb24KLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLSAKLU9NWF9TMzIgYXJtU2F0Um91bmRMZWZ0U2hpZnRfUzMyKAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTlQgc2hpZnQKLSAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdFJvdW5kTGVmdFNoaWZ0X1M2NCgpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0aW5nIGxlZnQtc2hpZnQgb3BlcmF0aW9uIG9uIGlucHV0Ci0gKiAgICAgT3Igcm91bmRlZCBSaWdodCBzaGlmdCBpZiB0aGUgaW5wdXQgU2hpZnQgaXMgbmVnYXRpdmUuCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBWYWx1ZSAgICAgICAgT3BlcmFuZAotICogW2luXSBzaGlmdCAgICAgICAgT3BlcmFuZCBmb3Igc2hpZnQgb3BlcmF0aW9uCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0gCi1PTVhfUzY0IGFybVNhdFJvdW5kTGVmdFNoaWZ0X1M2NCgKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TNjQgVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU5UIHNoaWZ0Ci0gICAgICAgICAgICAgICAgICAgICAgICApOwotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRNdWxTMTZTMzJfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGEgUzE2IGRhdGEgdHlwZSBtdWx0aXBsaWVkIHdpdGggYW4gUzMyIGRhdGEgdHlwZQotICogICAgIGluIGEgUzMyIGNvbnRhaW5lcgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gaW5wdXQxICAgICAgIE9wZXJhbmQgMQotICogW2luXSBpbnB1dDIgICAgICAgT3BlcmFuZCAyCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0KLQotT01YX1MzMiBhcm1TYXRNdWxTMTZTMzJfUzMyKAotICAgICAgICAgICAgICAgICAgICBPTVhfUzE2IGlucHV0MSwKLSAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBpbnB1dDIpOwotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRNdWxTMzJTMzJfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGEgUzMyIGRhdGEgdHlwZSBtdWx0aXBsaWVkIHdpdGggYW4gUzMyIGRhdGEgdHlwZQotICogICAgIGluIGEgUzMyIGNvbnRhaW5lcgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gaW5wdXQxICAgICAgIE9wZXJhbmQgMQotICogW2luXSBpbnB1dDIgICAgICAgT3BlcmFuZCAyCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0KLU9NWF9TMzIgYXJtU2F0TXVsUzMyUzMyX1MzMigKLSAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBpbnB1dDEsCi0gICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgaW5wdXQyKTsKLQotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1JbnREaXZBd2F5RnJvbVplcm8oKQotICoKLSAqIERlc2NyaXB0aW9uIDogSW50ZWdlciBkaXZpc2lvbiB3aXRoIHJvdW5kaW5nIHRvIHRoZSBuZWFyZXN0IGludGVnZXIuIAotICogICAgICAgICAgICAgICBIYWxmLWludGVnZXIgdmFsdWVzIGFyZSByb3VuZGVkIGF3YXkgZnJvbSB6ZXJvCi0gKiAgICAgICAgICAgICAgIHVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLiBGb3IgZXhhbXBsZSAzLy8yIGlzIHJvdW5kZWQgCi0gKiAgICAgICAgICAgICAgIHRvIDIsIGFuZCAtMy8vMiBpcyByb3VuZGVkIHRvIC0yLgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gTnVtICAgICAgICBPcGVyYW5kIDEKLSAqIFtpbl0gRGVubyAgICAgICBPcGVyYW5kIDIKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uIGlucHV0MS8vaW5wdXQyCi0gKiAgICAKLSAqKi8KLQotT01YX1MzMiBhcm1JbnREaXZBd2F5RnJvbVplcm8gKE9NWF9TMzIgTnVtLCBPTVhfUzMyIERlbm8pOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBEZWJ1Z2dpbmcgbWFjcm9zCi0gKgotICovCi0KLQotLyoKLSAqIERlZmluaXRpb24gb2Ygb3V0cHV0IHN0cmVhbSAtIGNoYW5nZSB0byBzdGRlcnIgaWYgbmVjZXNzYXJ5Ci0gKi8KLSNkZWZpbmUgREVCVUdfU1RSRUFNIHN0ZG91dAotCi0vKgotICogRGVidWcgcHJpbnRmIG1hY3Jvcywgb25lIGZvciBlYWNoIGFyZ3VtZW50IGNvdW50LgotICogQWRkIG1vcmUgaWYgbmVlZGVkLgotICovCi0jaWZkZWYgREVCVUdfT04KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jZGVmaW5lIERFQlVHX1BSSU5URl8wKGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSkKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzEoYSwgYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiKQotI2RlZmluZSBERUJVR19QUklOVEZfMihhLCBiLCBjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMpCi0jZGVmaW5lIERFQlVHX1BSSU5URl8zKGEsIGIsIGMsIGQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCkKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzQoYSwgYiwgYywgZCwgZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlKQotI2RlZmluZSBERUJVR19QUklOVEZfNShhLCBiLCBjLCBkLCBlLCBmKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYpCi0jZGVmaW5lIERFQlVHX1BSSU5URl82KGEsIGIsIGMsIGQsIGUsIGYsIGcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZykKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzcoYSwgYiwgYywgZCwgZSwgZiwgZywgaCkgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoKQotI2RlZmluZSBERUJVR19QUklOVEZfOChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpKSAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGkpCi0jZGVmaW5lIERFQlVHX1BSSU5URl85KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGopICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaikKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzEwKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGspICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrKQotI2RlZmluZSBERUJVR19QUklOVEZfMTEoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCkgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwpCi0jZGVmaW5lIERFQlVHX1BSSU5URl8xMihhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtKSAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSkKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzEzKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4pICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuKQotI2RlZmluZSBERUJVR19QUklOVEZfMTQoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbiwgbykgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4sIG8pCi0jZWxzZSAvKiBERUJVR19PTiAqLwotI2RlZmluZSBERUJVR19QUklOVEZfMChhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzEoYSwgYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl8yKGEsIGIsIGMpICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfMyhhLCBiLCBjLCBkKSAgICAgICAgICAgICAgICAgICAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzQoYSwgYiwgYywgZCwgZSkgICAgICAgICAgICAgICAgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl81KGEsIGIsIGMsIGQsIGUsIGYpICAgICAgICAgICAgICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfNihhLCBiLCBjLCBkLCBlLCBmLCBnKSAgICAgICAgICAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzcoYSwgYiwgYywgZCwgZSwgZiwgZywgaCkgICAgICAgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl84KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGkpICAgICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfOShhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqKSAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzEwKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGspICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfMTEoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCkgICAgICAgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl8xMihhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtKSAgICAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzEzKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4pICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl8xNChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuLCBvKSAgIAotI2VuZGlmIC8qIERFQlVHX09OICovCi0KLQotLyoKLSAqIERvbWFpbiBhbmQgc3ViIGRvbWFpbiBkZWZpbml0aW9ucwotICoKLSAqIEluIG9yZGVyIHRvIHR1cm4gb24gZGVidWcgZm9yIGFuIGVudGlyZSBkb21haW4gb3Igc3ViLWRvbWFpbgotICogYXQgY29tcGlsZSB0aW1lLCBvbmUgb2YgdGhlIERFQlVHX0RPTUFJTl8qIGJlbG93IG1heSBiZSBkZWZpbmVkLAotICogd2hpY2ggd2lsbCBhY3RpdmF0ZSBkZWJ1ZyBpbiBhbGwgb2YgdGhlIGRlZmluZXMgaXQgY29udGFpbnMuCi0gKi8KLQotI2lmZGVmIERFQlVHX0RPTUFJTl9BQwotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVDSEFOUEFJUkVMVF9NUEVHNAotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVDSEFOUEFJUkVMVAotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVEQVRTVFJFTFQKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFRklMTEVMVAotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVJU1NURVJFT19TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFTVNQTlNfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERU1TU1RFUkVPX1MzMl9JCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERVBSR0NGR0VMVAotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVUTlNfUzMyX0kKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVJTlRFUkxFQVZFU1BFQ1RSVU1fUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0VOQ09ERVROU19TMzJfSQotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19MT05HVEVSTVBSRURJQ1RfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0xPTkdURVJNUkVDT05TVFJVQ1RfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX01EQ1RGV0RfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX01EQ1RJTlZfUzMyX1MxNgotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19OT0lTRUxFU1NERUNPREUKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfUVVBTlRJTlZfUzMyX0kKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfVU5QQUNLQURJRkhFQURFUgotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19VTlBBQ0tBRFRTRlJBTUVIRUFERVIKLSNkZWZpbmUgREVCVUdfT01YQUNNUDNfSFVGRk1BTkRFQ09ERVNGQk1CUF9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNNUDNfSFVGRk1BTkRFQ09ERVNGQl9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNNUDNfSFVGRk1BTkRFQ09ERV9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNNUDNfTURDVElOVl9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNNUDNfUkVRVUFOVElaRVNGQl9TMzJfSQotI2RlZmluZSBERUJVR19PTVhBQ01QM19SRVFVQU5USVpFX1MzMl9JCi0jZGVmaW5lIERFQlVHX09NWEFDTVAzX1NZTlRIUFFNRl9TMzJfUzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDTVAzX1VOUEFDS0ZSQU1FSEVBREVSCi0jZGVmaW5lIERFQlVHX09NWEFDTVAzX1VOUEFDS1NDQUxFRkFDVE9SU19TOAotI2RlZmluZSBERUJVR19PTVhBQ01QM19VTlBBQ0tTSURFSU5GTwotI2VuZGlmIC8qIERFQlVHX0RPTUFJTl9BQyAqLwotCi0KLSNpZmRlZiBERUJVR19ET01BSU5fVkMKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9BVkVSQUdFXzE2WAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0FWRVJBR0VfNFgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9BVkVSQUdFXzhYCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfREVCTE9DS0NIUk9NQV9VOF9DMUlSCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfREVCTE9DS0xVTUFfVThfQzFJUgotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0RFQ09ERUNIUk9NQURDQ09FRkZTVE9QQUlSQ0FWTENfVTgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9ERUNPREVDT0VGRlNUT1BBSVJDQVZMQ19VOAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0RFUVVBTlRUUkFOU0ZPUk1BQ0ZST01QQUlSX1U4X1MxNl9DMV9ETFgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9FWFBBTkRGUkFNRQotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0ZJTFRFUkRFQkxPQ0tJTkdDSFJPTUFfSE9SRURHRV9VOF9DMUlSCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfRklMVEVSREVCTE9DS0lOR0NIUk9NQV9WRVJFREdFX1U4X0MxSVIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9GSUxURVJERUJMT0NLSU5HTFVNQV9IT1JFREdFX1U4X0MxSVIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9GSUxURVJERUJMT0NLSU5HTFVNQV9WRVJFREdFX1U4X0MxSVIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9QUkVESUNUSU5UUkFDSFJPTUE4WDhfVThfQzFSCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfUFJFRElDVElOVFJBXzE2WDE2X1U4X0MxUgotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1BSRURJQ1RJTlRSQV80WDRfVThfQzFSCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEUVVBUl8xNlgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURRVUFSXzRYCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEUVVBUl84WAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRF8xNlgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURfNFgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURfOFgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQVREXzRYNAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1RSQU5TRk9STURFUVVBTlRDSFJPTUFEQ0ZST01QQUlSX1U4X1MxNl9DMQotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1RSQU5TRk9STURFUVVBTlRMVU1BRENGUk9NUEFJUl9VOF9TMTZfQzEKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9UUkFOU0ZPUk1RVUFOVF9DSFJPTUFEQwotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1RSQU5TRk9STVFVQU5UX0xVTUFEQwotI2RlZmluZSBERUJVR19PTVhWQ000UDJfQkxPQ0tNQVRDSF9IQUxGXzE2WDE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9CTE9DS01BVENIX0hBTEZfOFg4Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9CTE9DS01BVENIX0lOVEVHRVJfMTZYMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0JMT0NLTUFUQ0hfSU5URUdFUl84WDgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0NPTVBVVEVURVhUVVJFRVJST1JCTE9DS19TQURfVThfUzE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9DT01QVVRFVEVYVFVSRUVSUk9SQkxPQ0tfVThfUzE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9EQ1Q4WDhCTEtETFgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RFQ09ERUJMT0NLQ09FRl9JTlRFUl9TMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RFQ09ERVBBRE1WX1BWT1AKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RFQ09ERVZMQ1pJR1pBR19JTlRFUl9TMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RFQ09ERVZMQ1pJR1pBR19JTlRSQUFDVkxDX1MxNgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFVkxDWklHWkFHX0lOVFJBRENWTENfUzE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9FTkNPREVNVl9VOF9TMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0VOQ09ERVZMQ1pJR1pBR19JTlRFUl9TMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0VOQ09ERVZMQ1pJR1pBR19JTlRSQUFDVkxDX1MxNgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfRU5DT0RFVkxDWklHWkFHX0lOVFJBRENWTENfUzE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9GSU5ETVZQUkVECi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9JRENUOFg4QkxLRExYCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9MSU1JVE1WVE9SRUNUCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9NT1RJT05FU1RJTUFUSU9OTUIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1BBRE1CR1JBWV9VOAotI2RlZmluZSBERUJVR19PTVhWQ000UDJfUEFETUJIT1JJWk9OVEFMX1U4Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9QQURNQlZFUlRJQ0FMX1U4Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9QQURNVgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfUVVBTlRJTlRFUl9TMTZfSQotI2RlZmluZSBERUJVR19PTVhWQ000UDJfUVVBTlRJTlRSQV9TMTZfSQotI2RlZmluZSBERUJVR19PTVhWQ000UDJfUVVBTlRJTlZJTlRFUl9TMTZfSQotI2RlZmluZSBERUJVR19PTVhWQ000UDJfUVVBTlRJTlZJTlRSQV9TMTZfSQotI2RlZmluZSBERUJVR19PTVhWQ000UDJfVFJBTlNSRUNCTE9DS0NFT0ZfSU5URVIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1RSQU5TUkVDQkxPQ0tDRU9GX0lOVFJBCi0jZW5kaWYgLyogREVCVUdfRE9NQUlOX1ZDICovCi0KLQotI2lmZGVmIERFQlVHX0RPTUFJTl9JQwotLyogVG8gYmUgZmlsbGVkIGluICovCi0jZW5kaWYgLyogREVCVUdfRE9NQUlOX0lDICovCi0KLQotI2lmZGVmIERFQlVHX0RPTUFJTl9TUAotI2RlZmluZSBERUJVR19PTVhBQ1NQX0RPVFBST0RfUzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDU1BfQkxPQ0tFWFBfUzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDU1BfQkxPQ0tFWFBfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfQ09QWV9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9ET1RQUk9EX1MxNgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0RPVFBST0RfUzE2X1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEZXRF9DVE9DX1NDMTZfU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZURldEX0NUT0NfU0MzMl9TRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRGV0RfUlRPQ0NTX1MxNlMzMl9TRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRGV0RfUlRPQ0NTX1MzMl9TRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRHRVRCVUZTSVpFX0NfU0MxNgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEdFVEJVRlNJWkVfQ19TQzMyCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUR0VUQlVGU0laRV9SX1MxNl9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRHRVRCVUZTSVpFX1JfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5JVF9DX1NDMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTklUX0NfU0MzMgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOSVRfUl9TMTZfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5JVF9SX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOVl9DQ1NUT1JfUzMyUzE2X1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOVl9DQ1NUT1JfUzMyX1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOVl9DVE9DX1NDMTZfU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5WX0NUT0NfU0MzMl9TRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GSUxURVJNRURJQU5fUzMyX0kKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GSUxURVJNRURJQU5fUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRklST05FX0RJUkVDVF9TMTZfSVNGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUk9ORV9ESVJFQ1RfUzE2X0kKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJPTkVfRElSRUNUX1MxNgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUk9ORV9ESVJFQ1RfUzE2X1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUl9ESVJFQ1RfUzE2X0lTRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJfRElSRUNUX1MxNl9JCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRklSX0RJUkVDVF9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJfRElSRUNUX1MxNl9TRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJPTkVfQklRVUFERElSRUNUX1MxNl9JCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfSUlST05FX0JJUVVBRERJUkVDVF9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJPTkVfRElSRUNUX1MxNl9JCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfSUlST05FX0RJUkVDVF9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJfQklRVUFERElSRUNUX1MxNl9JCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfSUlSX0JJUVVBRERJUkVDVF9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJfRElSRUNUX1MxNl9JCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfSUlSX0RJUkVDVF9TMTYKLSNlbmRpZiAvKiBERUJVR19ET01BSU5fU1AgKi8KLQotCi0jaWZkZWYgREVCVUdfRE9NQUlOX0lQCi0jZGVmaW5lIERFQlVHX09NWElQQk1fQUREQ19VOF9DMVJfU0ZTCi0jZGVmaW5lIERFQlVHX09NWElQQk1fQ09QWV9VOF9DMVIKLSNkZWZpbmUgREVCVUdfT01YSVBCTV9DT1BZX1U4X0MzUgotI2RlZmluZSBERUJVR19PTVhJUEJNX01JUlJPUl9VOF9DMVIKLSNkZWZpbmUgREVCVUdfT01YSVBCTV9NVUxDX1U4X0MxUl9TRlMKLSNkZWZpbmUgREVCVUdfT01YSVBDU19DT0xPUlRXSVNUUTE0X1U4X0MzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1JHQjU2NVRPWUNCQ1I0MjBMU19NQ1VfVTE2X1MxNl9DM1AzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1JHQjU2NVRPWUNCQ1I0MjJMU19NQ1VfVTE2X1MxNl9DM1AzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1JHQjU2NVRPWUNCQ1I0NDRMU19NQ1VfVTE2X1MxNl9DM1AzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1JHQlRPWUNCQ1I0MjBMU19NQ1VfVThfUzE2X0MzUDNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCVE9ZQ0JDUjQyMkxTX01DVV9VOF9TMTZfQzNQM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19SR0JUT1lDQkNSNDQ0TFNfTUNVX1U4X1MxNl9DM1AzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIwUlNaUk9UX1U4X1AzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIwVE9SR0I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIwVE9SR0I1NjVfVThfVTE2X1AzQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjBUT1JHQkxTX01DVV9TMTZfVThfUDNDM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlJTWkNTQ1JPVFJHQl9VOF9DMlIKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlJTWlJPVF9VOF9QM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPUkdCNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPUkdCNTY1X1U4X1UxNl9DMkMzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9SR0JMU19NQ1VfUzE2X1U4X1AzQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1JHQl9VOF9DMkMzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9ZQ0JDUjQyMFJPVEFURV9VOF9DMlAzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9ZQ0JDUjQyMFJPVEFURV9VOF9QM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQ0NFRPUkdCNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQ0NFRPUkdCTFNfTUNVX1MxNl9VOF9QM0MzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSVE9SR0I1NjVfVThfVTE2X0MzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSVE9SR0I1NjVfVThfVTE2X1AzQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1JUT1JHQl9VOF9DM1IKLSNkZWZpbmUgREVCVUdfT01YSVBQUF9HRVRDRU5UUkFMTU9NRU5UX1M2NAotI2RlZmluZSBERUJVR19PTVhJUFBQX0dFVFNQQVRJQUxNT01FTlRfUzY0Ci0jZGVmaW5lIERFQlVHX09NWElQUFBfTU9NRU5UR0VUU1RBVEVTSVpFX1M2NAotI2RlZmluZSBERUJVR19PTVhJUFBQX01PTUVOVElOSVRfUzY0Ci0jZGVmaW5lIERFQlVHX09NWElQUFBfTU9NRU5UUzY0U19VOF9DMVIKLSNkZWZpbmUgREVCVUdfT01YSVBQUF9NT01FTlRTNjRTX1U4X0MzUgotI2VuZGlmIC8qIERFQlVHX0RPTUFJTl9JUCAqLwotCi0KLSNlbmRpZiAvKiBfYXJtQ29tbW9uX0hfICovCi0KLS8qRW5kIG9mIEZpbGUqLwotCi0KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fQml0RGVjX3MuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9CaXREZWNfcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTg2NmZhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9CaXREZWNfcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjg0ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1DT01NX0JpdERlY19zLmgKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLyBPcGVuTUFYIG9wdGltaXplZCBiaXRzdHJlYW0gZGVjb2RlIG1vZHVsZQotOy8vCi07Ly8gWW91IG11c3QgaW5jbHVkZSBhcm1DT01NX3MuaCBiZWZvcmUgaW5jbHVkaW5nIHRoaXMgZmlsZQotOy8vCi07Ly8gVGhpcyBtb2R1bGUgcHJvdmlkZXMgbWFjcm9zIHRvIHBlcmZvcm0gYXNzZW1ibHkgb3B0aW1pemVkIGZpeGVkIGFuZAotOy8vIHZhcmlhYmxlIGxlbmd0aCBkZWNvZGluZyBmcm9tIGEgcmVhZC1vbmx5IGJpdHN0cmVhbS4gVGhlIHZhcmlhYmxlCi07Ly8gbGVuZ3RoIGRlY29kZSBtb2R1bGVzIHRha2UgYXMgaW5wdXQgYSBwb2ludGVyIHRvIGEgdGFibGUgb2YgMTYtYml0Ci07Ly8gZW50cmllcyBvZiB0aGUgZm9sbG93aW5nIGZvcm1hdC4KLTsvLwotOy8vIFZMRCBUYWJsZSBFbnRyeSBmb3JtYXQKLTsvLwotOy8vICAgICAgICAxNSAxNCAxMyAxMiAxMSAxMCAwOSAwOCAwNyAwNiAwNSAwNCAwMyAwMiAwMSAwMAotOy8vICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi07Ly8gICAgICAgfCAgTGVuICAgfCAgICAgICAgICAgICAgIFN5bWJvbCAgICAgICAgICAgICAgfCAxIHwKLTsvLyAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotOy8vICAgICAgIHwgICAgICAgICAgICAgICAgT2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgIHwgMCB8Ci07Ly8gICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLTsvLwotOy8vIElmIHRoZSB0YWJsZSBlbnRyeSBpcyBhIGxlYWYgZW50cnkgdGhlbiBiaXQgMCBzZXQ6Ci07Ly8gICAgTGVuICAgID0gTnVtYmVyIG9mIGJpdHMgb3ZlcnJlYWQgKDAgdG8gNykKLTsvLyAgICBTeW1ib2wgPSBTeW1ib2wgcGF5bG9hZCAodW5zaWduZWQgMTIgYml0cykKLTsvLwotOy8vIElmIHRoZSB0YWJsZSBlbnRyeSBpcyBhbiBpbnRlcm5hbCBub2RlIHRoZW4gYml0IDAgaXMgY2xlYXI6Ci07Ly8gICAgT2Zmc2V0ID0gTnVtYmVyIG9mICgxNi1iaXQpIGhhbGYgd29yZHMgZnJvbSB0aGUgdGFibGUKLTsvLyAgICAgICAgICAgICBzdGFydCB0byB0aGUgbmV4dCB0YWJsZSBub2RlCi07Ly8KLTsvLyBUaGUgdGFibGUgaXMgYWNjZXNzZWQgYnkgc3VjY2Vzc2l2ZSBsb29rdXAgdXAgb24gdGhlCi07Ly8gbmV4dCBTdGVwIGJpdHMgb2YgdGhlIGlucHV0IGJpdHN0cmVhbSB1bnRpbCBhIGxlYWYgbm9kZQotOy8vIGlzIG9idGFpbmVkLiBUaGUgU3RlcCBzaXplcyBhcmUgc3VwcGxpZWQgdG8gdGhlIFZMRCBtYWNyby4KLTsvLwotOy8vIFVTQUdFOgotOy8vCi07Ly8gVG8gdXNlIGFueSBvZiB0aGUgbWFjcm9zIGluIHRoaXMgcGFja2FnZSwgZmlyc3QgY2FsbDoKLTsvLwotOy8vICAgIE1fQkRfSU5JVCBwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcEJpdFN0cmVhbSwgUkJpdEJ1ZmZlciwgUkJpdENvdW50LCBUbXAKLTsvLwotOy8vIFRoaXMgY2FjaGVzIHRoZSBjdXJyZW50IGJpdHN0cmVhbSBwb3NpdGlvbiBhbmQgbmV4dCBhdmFpbGFibGUKLTsvLyBiaXRzIGluIHJlZ2lzdGVycyBwQml0U3RyZWFtLCBSQml0QnVmZmVyLCBSQml0Q291bnQuIFRoZXNlIHJlZ2lzdGVycwotOy8vIGFyZSByZXNlcnZlZCBmb3IgdXNlIGJ5IHRoZSBiaXRzdHJlYW0gZGVjb2RlIHBhY2thZ2UgdW50aWwgeW91Ci07Ly8gY2FsbCBNX0JEX0ZJTkkuCi07Ly8KLTsvLyBOZXh0IGNhbGwgdGhlIGZvbGxvd2luZyBtYWNybyhzKSBhcyBtYW55IHRpbWVzIGFzIHlvdSBuZWVkOgotOy8vCi07Ly8gICAgTV9CRF9MT09LOCAgICAgICAtIExvb2sgYWhlYWQgY29uc3RhbnQgMTw9Tjw9OCAgYml0cyBpbnRvIHRoZSBiaXRzdHJlYW0KLTsvLyAgICBNX0JEX0xPT0sxNiAgICAgIC0gTG9vayBhaGVhZCBjb25zdGFudCAxPD1OPD0xNiBiaXRzIGludG8gdGhlIGJpdHN0cmVhbQotOy8vICAgIE1fQkRfUkVBRDggICAgICAgLSBSZWFkIGNvbnN0YW50IDE8PU48PTggIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtCi07Ly8gICAgTV9CRF9SRUFEMTYgICAgICAtIFJlYWQgY29uc3RhbnQgMTw9Tjw9MTYgYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KLTsvLyAgICBNX0JEX1ZSRUFEOCAgICAgIC0gUmVhZCB2YXJpYWJsZSAxPD1OPD04ICBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbQotOy8vICAgIE1fQkRfVlJFQUQxNiAgICAgLSBSZWFkIHZhcmlhYmxlIDE8PU48PTE2IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtCi07Ly8gICAgTV9CRF9WTEQgICAgICAgICAtIFBlcmZvcm0gdmFyaWFibGUgbGVuZ3RoIGRlY29kZSB1c2luZyBsb29rdXAgdGFibGUKLTsvLwotOy8vIEZpbmFsbHkgY2FsbCB0aGUgbWFjcm86Ci07Ly8KLTsvLyAgICBNX0JEX0ZJTkkgcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQKLTsvLwotOy8vIFRoaXMgd3JpdGVzIHRoZSBiaXRzdHJlYW0gc3RhdGUgYmFjayB0byBtZW1vcnkuCi07Ly8KLTsvLyBUaGUgdGhyZWUgYml0c3RyZWFtIGNhY2hlIHJlZ2lzdGVyIG5hbWVzIGFyZSBhc3NpZ25lZCB0byB0aGUgZm9sbG93aW5nIGdsb2JhbAotOy8vIHZhcmlhYmxlczoKLTsvLwotCi0gICAgICAgIEdCTFMgICAgcEJpdFN0cmVhbSAgOy8vIFJlZ2lzdGVyIG5hbWUgZm9yIHBCaXRTdHJlYW0KLSAgICAgICAgR0JMUyAgICBCaXRCdWZmZXIgICA7Ly8gUmVnaXN0ZXIgbmFtZSBmb3IgQml0QnVmZmVyCi0gICAgICAgIEdCTFMgICAgQml0Q291bnQgICAgOy8vIFJlZ2lzdGVyIG5hbWUgZm9yIEJpdENvdW50Ci0gICAKLTsvLyAgICAgICAgCi07Ly8gVGhlc2UgcmVnaXN0ZXIgdmFyaWFibGVzIG11c3QgaGF2ZSBhIGNlcnRhaW4gZGVmaW5lZCBzdGF0ZSBvbiBlbnRyeSB0byBldmVyeSBiaXRzdHJlYW0KLTsvLyBtYWNybyAoZXhjZXB0IE1fQkRfSU5JVCkgYW5kIG9uIGV4aXQgZnJvbSBldmVyeSBiaXRzdHJlYW0gbWFjcm8gKGV4Y2VwdCBNX0JEX0ZJTkkpLgotOy8vIFRoZSBzdGF0ZSBtYXkgZGVwZW5kIG9uIGltcGxlbWVudGF0aW9uLgotOy8vCi07Ly8gRm9yIHRoZSBkZWZhdWx0IChBUk0xMSkgaW1wbGVtZW50YXRpb24gdGhlIGZvbGxvd2luZyBob2xkOgotOy8vICAgIHBCaXRTdHJlYW0gLSBwb2ludHMgdG8gdGhlIGZpcnN0IGJ5dGUgbm90IGhlbGQgaW4gdGhlIEJpdEJ1ZmZlcgotOy8vICAgIEJpdEJ1ZmZlciAgLSBpcyBhIGNhY2hlIG9mICg0IGJ5dGVzKSAzMiBiaXRzLCBiaXQgMzEgdGhlIGZpcnN0IGJpdAotOy8vICAgIEJpdENvdW50ICAgLSBpcyBvZmZzZXQgKGZyb20gdGhlIHRvcCBiaXQpIHRvIHRoZSBuZXh0IHVudXNlZCBiaXRzdHJlYW0gYml0Ci07Ly8gICAgMDw9Qml0Q291bnQ8PTE1IChzbyBCaXRCdWZmZXIgaG9sZHMgYXQgbGVhc3QgMTcgdW51c2VkIGJpdHMpCi07Ly8KLTsvLwotCi0gICAgICAgIDsvLyBCaXRzdHJlYW0gRGVjb2RlIGluaXRpYWxpc2UKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbml0aWFsaXNlcyB0aGUgYml0c3RyZWFtIGRlY29kZSBnbG9iYWwgcmVnaXN0ZXJzIGZyb20KLSAgICAgICAgOy8vIGJpdHN0cmVhbSBwb2ludGVycy4gVGhpcyBtYWNybyBpcyBzcGxpdCBpbnRvIDMgcGFydHMgdG8gZW5hYmxlCi0gICAgICAgIDsvLyBzY2hlZHVsaW5nLgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkcHBCaXRTdHJlYW0gICAgLSBwb2ludGVyIHRvIHBvaW50ZXIgdG8gdGhlIG5leHQgYml0c3RyZWFtIGJ5dGUKLSAgICAgICAgOy8vICRwQml0T2Zmc2V0ICAgICAtIHBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBiaXRzIHVzZWQgaW4gdGhlIGN1cnJlbnQgYnl0ZSAoMC4uNykKLSAgICAgICAgOy8vICRSQml0U3RyZWFtICAgICAtIHJlZ2lzdGVyIHRvIHVzZSBmb3IgcEJpdFN0cmVhbSAoY2FuIGJlICRwcEJpdFN0cmVhbSkKLSAgICAgICAgOy8vICRSQml0QnVmZmVyICAgICAtIHJlZ2lzdGVyIHRvIHVzZSBmb3IgQml0QnVmZmVyCi0gICAgICAgIDsvLyAkUkJpdENvdW50ICAgICAgLSByZWdpc3RlciB0byB1c2UgZm9yIEJpdENvdW50ICAgKGNhbiBiZSAkcEJpdE9mZnNldCkKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRUMSwkVDIsJFQzICAgICAtIHJlZ2lzdGVycyB0aGF0IG11c3QgYmUgcHJlc2VydmVkIGJldHdlZW4gY2FsbHMgdG8KLSAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIE1fQkRfSU5JVDEgYW5kIE1fQkRfSU5JVDIKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9JTklUMCAgJHBwQml0U3RyZWFtLCAkcEJpdE9mZnNldCwgJFJCaXRTdHJlYW0sICRSQml0QnVmZmVyLCAkUkJpdENvdW50Ci0KLXBCaXRTdHJlYW0gIFNFVFMgIiRSQml0U3RyZWFtIgotQml0QnVmZmVyICAgU0VUUyAiJFJCaXRCdWZmZXIiCi1CaXRDb3VudCAgICBTRVRTICIkUkJpdENvdW50IiAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gbG9hZCBpbnB1dHMKLSAgICAgICAgTERSICAgICAkcEJpdFN0cmVhbSwgWyRwcEJpdFN0cmVhbV0KLSAgICAgICAgTERSICAgICAkQml0Q291bnQsIFskcEJpdE9mZnNldF0KLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9JTklUMSAgJFQxLCAkVDIsICRUMwotICAgICAgICBMRFJCICAgICRUMiwgWyRwQml0U3RyZWFtLCAjMl0KLSAgICAgICAgTERSQiAgICAkVDEsIFskcEJpdFN0cmVhbSwgIzFdCi0gICAgICAgIExEUkIgICAgJEJpdEJ1ZmZlciwgIFskcEJpdFN0cmVhbV0sICMzCi0gICAgICAgIEFERCAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4Ci0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfSU5JVDIgICRUMSwgJFQyLCAkVDMKLSAgICAgICAgT1JSICAgICAkVDIsICRUMiwgJFQxLCBMU0wgIzgKLSAgICAgICAgT1JSICAgICAkQml0QnVmZmVyLCAkVDIsICRCaXRCdWZmZXIsIExTTCAjMTYKLSAgICAgICAgTUVORCAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gTG9vayBhaGVhZCBmaXhlZCAxPD1OPD04IGJpdHMgd2l0aG91dCBjb25zdW1pbmcgYW55IGJpdHMKLSAgICAgICAgOy8vIFRoZSBuZXh0IGJpdHMgd2lsbCBiZSBwbGFjZWQgYXQgYml0IDMxLi4yNCBvZiBkZXN0aW5hdGlvbiByZWdpc3RlcgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cyB0byBsb29rCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vIAotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbmV4dCBOIGJpdHMgb2YgdGhlIGJpdHN0cmVhbQotICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLwotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX0xPT0s4ICAkU3ltYm9sLCAkTgotICAgICAgICBBU1NFUlQgICgkTj49MSk6TEFORDooJE48PTgpCi0gICAgICAgIE1PViAgICAgJFN5bWJvbCwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudAotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIExvb2sgYWhlYWQgZml4ZWQgMTw9Tjw9MTYgYml0cyB3aXRob3V0IGNvbnN1bWluZyBhbnkgYml0cwotICAgICAgICA7Ly8gVGhlIG5leHQgYml0cyB3aWxsIGJlIHBsYWNlZCBhdCBiaXQgMzEuLjE2IG9mIGRlc3RpbmF0aW9uIHJlZ2lzdGVyCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzIHRvIGxvb2sKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBuZXh0IE4gYml0cyBvZiB0aGUgYml0c3RyZWFtCi0gICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfTE9PSzE2ICAkU3ltYm9sLCAkTiwgJFQxCi0gICAgICAgIEFTU0VSVCAgKCROID49IDEpOkxBTkQ6KCROIDw9IDE2KQotICAgICAgICBNT1YgICAgICRTeW1ib2wsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBTa2lwcyBmaXhlZCAxPD1OPD04IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtLCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vIAotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfU0tJUDggJE4sICRUMQotICAgICAgICBBU1NFUlQgICgkTj49MSk6TEFORDooJE48PTgpICAgICAgICAKLSAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIyg4LSROKQotICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAKLSAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKLSAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBSZWFkIGZpeGVkIDE8PU48PTggYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0sIGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMgdG8gcmVhZAotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gdGhlIG5leHQgTiBiaXRzIG9mIHRoZSBiaXRzdHJlYW0KLSAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9SRUFEOCAkU3ltYm9sLCAkTiwgJFQxCi0gICAgICAgIEFTU0VSVCAgKCROPj0xKTpMQU5EOigkTjw9OCkgICAgICAgICAgICAgICAgCi0gICAgICAgIE1PVlMgICAgJFN5bWJvbCwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudCAgICAgICAgCi0gICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICMoOC0kTikKLSAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgCi0gICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4Ci0gICAgICAgIE1PViAgICAgJFN5bWJvbCwgJFN5bWJvbCwgTFNSICMoMzItJE4pCi0gICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKLSAgICAgICAgTUVORAotCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gUmVhZCBmaXhlZCAxPD1OPD0xNiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSwgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cyB0byByZWFkCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vIAotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbmV4dCBOIGJpdHMgb2YgdGhlIGJpdHN0cmVhbQotICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLwotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX1JFQUQxNiAkU3ltYm9sLCAkTiwgJFQxLCAkVDIKLSAgICAgICAgQVNTRVJUICAoJE4+PTEpOkxBTkQ6KCROPD0xNikKLSAgICAgICAgQVNTRVJUICAkU3ltYm9sPD4kVDEKLSAgICAgICAgSUYgKCROPD04KQotICAgICAgICAgICAgTV9CRF9SRUFEOCAgJFN5bWJvbCwgJE4sICRUMQotICAgICAgICBFTFNFICAgICAgICAKLSAgICAgICAgICAgIDsvLyBOPjggc28gd2Ugd2lsbCBiZSBhYmxlIHRvIHJlZmlsbCBhdCBsZWFzdCBvbmUgYnl0ZSAgICAgICAgICAgIAotICAgICAgICAgICAgTERSQiAgICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgICAgICAgICAgCi0gICAgICAgICAgICBNT1ZTICAgICRTeW1ib2wsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQKLSAgICAgICAgICAgIE9SUiAgICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzggICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIygxNi0kTikKLSAgICAgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgICAgICAgICAgIAotICAgICAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkU3ltYm9sLCBMU1IgIygzMi0kTikKLSAgICAgICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4Ci0gICAgICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4Ci0gICAgICAgIEVORElGCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gU2tpcCB2YXJpYWJsZSAxPD1OPD04IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtLCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyLgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cy4gMTw9Tjw9OAotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLwotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX1ZTS0lQOCAkTiwgJFQxCi0gICAgICAgIEFERCAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICROCi0gICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4Ci0gICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgICAgICAgCi0gICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4Ci0gICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKLSAgICAgICAgTUVORCAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFNraXAgdmFyaWFibGUgMTw9Tjw9MTYgYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0sIGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIuCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzLiAxPD1OPD0xNgotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLwotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX1ZTS0lQMTYgJE4sICRUMSwgJFQyCi0gICAgICAgIEFERCAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICROCi0gICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4Ci0gICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgICAgICAgCi0gICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKLSAgICAgICAgU1VCQ1NTICAkQml0Q291bnQsICRCaXRDb3VudCwgIzggICAgICAgIAotICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEKLSAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKLSAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAotICAgICAgICBNRU5EICAgICAgICAKLQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFJlYWQgdmFyaWFibGUgMTw9Tjw9OCBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSwgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlci4KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMgdG8gcmVhZC4gMTw9Tjw9OAotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gdGhlIG5leHQgTiBiaXRzIG9mIHRoZSBiaXRzdHJlYW0KLSAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRUMiAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9WUkVBRDggJFN5bWJvbCwgJE4sICRUMSwgJFQyCi0gICAgICAgIE1PViAgICAgJFN5bWJvbCwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudCAgICAgICAgCi0gICAgICAgIEFERCAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICROCi0gICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4Ci0gICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgICAgICAgCi0gICAgICAgIFJTQiAgICAgJFQyLCAkTiwgIzMyICAgICAgICAKLSAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKLSAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkU3ltYm9sLCBMU1IgJFQyCi0gICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKLSAgICAgICAgTUVORAotCi0KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBSZWFkIHZhcmlhYmxlIDE8PU48PTE2IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtLCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyLgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cyB0byByZWFkLiAxPD1OPD0xNgotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gdGhlIG5leHQgTiBiaXRzIG9mIHRoZSBiaXRzdHJlYW0KLSAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRUMiAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9WUkVBRDE2ICRTeW1ib2wsICROLCAkVDEsICRUMgotICAgICAgICBNT1YgICAgICRTeW1ib2wsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQgICAgICAgIAotICAgICAgICBBREQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAkTgotICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAotICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAgICAgIAotICAgICAgICBSU0IgICAgICRUMiwgJE4sICMzMiAgICAgICAgCi0gICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKLSAgICAgICAgU1VCQ1NTICAkQml0Q291bnQsICRCaXRDb3VudCwgIzggICAgICAgIAotICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEKLSAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKLSAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkU3ltYm9sLCBMU1IgJFQyCi0gICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKLSAgICAgICAgTUVORAotCi0KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBEZWNvZGUgYSBjb2RlIG9mIHRoZSBmb3JtIDAwMDAuLi4wMDEgd2hlcmUgdGhlcmUKLSAgICAgICAgOy8vIGFyZSBOIHplcm9zIGJlZm9yZSB0aGUgMSBhbmQgTjw9MTUgKGNvZGUgbGVuZ3RoPD0xNikKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gdGhlIG51bWJlciBvZiB6ZXJvcyBiZWZvcmUgdGhlIG5leHQgMQotICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgPj0xNiBpcyBhbiBpbGxlZ2FsIGNvZGUKLSAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRUMiAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX0NMWjE2ICRTeW1ib2wsICRUMSwgJFQyCi0gICAgICAgIE1PVlMgICAgJFN5bWJvbCwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudAotICAgICAgICBDTFogICAgICRTeW1ib2wsICRTeW1ib2wgICAgICAgICAgICAgICAgCi0gICAgICAgIEFERCAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICRTeW1ib2wKLSAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzcgICAgICAgIDsvLyBsZW5ndGggaXMgU3ltYm9sKzEKLSAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxCi0gICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKLSAgICAgICAgU1VCQ1NTICAkQml0Q291bnQsICRCaXRDb3VudCwgIzggICAgICAgIAotICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEKLSAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKLSAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAotICAgICAgICBNRU5EICAKLQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIERlY29kZSBhIGNvZGUgb2YgdGhlIGZvcm0gMTExMS4uLjExMCB3aGVyZSB0aGVyZQotICAgICAgICA7Ly8gYXJlIE4gb25lcyBiZWZvcmUgdGhlIDAgYW5kIE48PTE1IChjb2RlIGxlbmd0aDw9MTYpCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBudW1iZXIgb2YgemVyb3MgYmVmb3JlIHRoZSBuZXh0IDEKLSAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgID49MTYgaXMgYW4gaWxsZWdhbCBjb2RlCi0gICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9DTE8xNiAkU3ltYm9sLCAkVDEsICRUMgotICAgICAgICBNT1YgICAgICRTeW1ib2wsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQKLSAgICAgICAgTVZOICAgICAkU3ltYm9sLCAkU3ltYm9sCi0gICAgICAgIENMWiAgICAgJFN5bWJvbCwgJFN5bWJvbCAgICAgICAgICAgICAgICAKLSAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgJFN5bWJvbAotICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjNyAgICAgICAgOy8vIGxlbmd0aCBpcyBTeW1ib2wrMQotICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEKLSAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAotICAgICAgICBTVUJDU1MgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOCAgICAgICAgCi0gICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMQotICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAotICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4Ci0gICAgICAgIE1FTkQgIAotCi0KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBWYXJpYWJsZSBMZW5ndGggRGVjb2RlIG1vZHVsZQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIERlY29kZXMgb25lIFZMRCBTeW1ib2wgZnJvbSBhIGJpdHN0cmVhbSBhbmQgcmVmaWxsIHRoZSBiaXRzdHJlYW0KLSAgICAgICAgOy8vIGJ1ZmZlci4KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJHBWTERUYWJsZSAgICAgIC0gcG9pbnRlciB0byBWTEQgZGVjb2RlIHRhYmxlIG9mIDE2LWJpdCBlbnRyaWVzLgotICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgVGhlIGZvcm1hdCBpcyBkZXNjcmliZWQgYWJvdmUgYXQgdGhlIHN0YXJ0IG9mCi0gICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICB0aGlzIGZpbGUuCi0gICAgICAgIDsvLyAkUzAgICAgICAgICAgICAgLSBUaGUgbnVtYmVyIG9mIGJpdHMgdG8gbG9vayB1cCBmb3IgdGhlIGZpcnN0IHN0ZXAKLSAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIDE8PSRTMDw9OAotICAgICAgICA7Ly8gJFMxICAgICAgICAgICAgIC0gVGhlIG51bWJlciBvZiBiaXRzIHRvIGxvb2sgdXAgZm9yIGVhY2ggc3Vic2VxdWVudAotICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgc3RlcCAxPD0kUzE8PSRTMC4KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vIAotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSBkZWNvZGVkIFZMRCBzeW1ib2wgdmFsdWUKLSAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRUMiAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9WTEQgJFN5bWJvbCwgJFQxLCAkVDIsICRwVkxEVGFibGUsICRTMCwgJFMxCi0gICAgICAgIEFTU0VSVCAoMTw9JFMwKTpMQU5EOigkUzA8PTgpCi0gICAgICAgIEFTU0VSVCAoMTw9JFMxKTpMQU5EOigkUzE8PSRTMCkKLSAgICAgICAgCi0gICAgICAgIDsvLyBOb3RlIDA8PUJpdENvdW50PD0xNSBvbiBlbnRyeSBhbmQgZXhpdAotICAgICAgICAKLSAgICAgICAgTU9WUyAgICAkVDEsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQgICAgICAgOy8vIGxlZnQgYWxpZ24gbmV4dCBiaXRzCi0gICAgICAgIE1PVlMgICAgJFN5bWJvbCwgIygyPDwkUzApLTIgICAgICAgICAgICAgICAgIDsvLyBjcmVhdGUgbWFzawotICAgICAgICBBTkQgICAgICRTeW1ib2wsICRTeW1ib2wsICRUMSwgTFNSICMoMzEtJFMwKSA7Ly8gMioobmV4dCAkUzAgYml0cykKLSAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzggICAgICAgICAgICAgOy8vIENTIGlmIGJ1ZmZlciBjYW4gYmUgZmlsbGVkCi0wMQotICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAgICAgICAgICAgICA7Ly8gbG9hZCByZWZpbGwgYnl0ZQotICAgICAgICBMRFJIICAgICRTeW1ib2wsIFskcFZMRFRhYmxlLCAkU3ltYm9sXSAgICAgICA7Ly8gbG9hZCB0YWJsZSBlbnRyeQotICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOCAgICAgICAgICAgICA7Ly8gcmVmaWxsIG5vdCBwb3NzaWJsZQotICAgICAgICBBREQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjJFMwICAgICAgICAgICA7Ly8gYXNzdW1lICRTMCBiaXRzIHVzZWQKLSAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOCAgOy8vIG1lcmdlIGluIHJlZmlsbCBieXRlCi0gICAgICAgIE1PVlMgICAgJFQxLCAkU3ltYm9sLCBMU1IgIzEgICAgICAgICAgICAgICAgIDsvLyBDUz1sZWFmIGVudHJ5Ci0gICAgICAgIEJDUyAgICAgJUZUMDIKLSAgICAgICAgCi0gICAgICAgIE1PVlMgICAgJFQxLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50ICAgICAgIDsvLyBsZWZ0IGFsaWduIG5leHQgYml0Ci0gICAgICAgIElGICgyKiRTMC0kUzE8PTgpCi0gICAgICAgICAgICA7Ly8gQ2FuIGNvbWJpbmUgcmVmaWxsIGNoZWNrIGFuZCAtUzArUzEgYW5kIGtlZXAgJEJpdENvdW50PD0xNQotICAgICAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgrKCRTMC0kUzEpCi0gICAgICAgIEVMU0UKLSAgICAgICAgICAgIDsvLyBTZXBhcmF0ZSByZWZpbGwgY2hlY2sgYW5kIC1TMCtTMSBvZmZzZXQKLSAgICAgICAgICAgIFNVQlMgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAotICAgICAgICAgICAgU1VCICAgJEJpdENvdW50LCAkQml0Q291bnQsICMoJFMwLSRTMSkKLSAgICAgICAgRU5ESUYKLSAgICAgICAgQUREICAgICAkU3ltYm9sLCAkU3ltYm9sLCAkVDEsIExTUiAjKDMxLSRTMSkgOy8vIGFkZCAyKihuZXh0ICRTMSBiaXRzKSB0bwotICAgICAgICBCSUMgICAgICRTeW1ib2wsICRTeW1ib2wsICMxICAgICAgICAgICAgICAgICA7Ly8gICB0YWJsZSBvZmZzZXQKLSAgICAgICAgQiAgICAgICAlQlQwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGxvYWQgbmV4dCB0YWJsZSBlbnRyeQotMDIKLSAgICAgICAgOy8vIEJpdENvdW50IHJhbmdlIG5vdyBkZXBlbmQgb24gdGhlIHJvdXRlIGhlcmUKLSAgICAgICAgOy8vIGlmIChmaXJzdCBzdGVwKSAgICAgICBTMCA8PSBCaXRDb3VudCA8PSA3K1MwICAgICAgICA8PTE1Ci0gICAgICAgIDsvLyBlbHNlIGlmICgyKlMwLVMxPD04KSAgUzAgPD0gQml0Q291bnQgPD0gNysoMipTMC1TMSkgPD0xNQotICAgICAgICA7Ly8gZWxzZSAgICAgICAgICAgICAgICAgIFMxIDw9IEJpdENvdW50IDw9IDcrUzEgICAgICAgIDw9MTUKLSAgICAgICAgCi0gICAgICAgIFNVQiAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICRTeW1ib2wsIExTUiMxMwotICAgICAgICBCSUMgICAgICRTeW1ib2wsICRUMSwgIzB4RjAwMAotICAgICAgICBNRU5ECi0gICAgICAgIAotCi0gICAgICAgIDsvLyBBZGQgYW4gb2Zmc2V0IG51bWJlciBvZiBiaXRzCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gT3V0cHV0cyBkZXN0aW5hdGlvbiBieXRlIGFuZCBiaXQgaW5kZXggdmFsdWVzIHdoaWNoIGNvcnJlc3BvbmRzIHRvIGFuIG9mZnNldCBudW1iZXIgb2YgYml0cyAKLSAgICAgICAgOy8vIGZyb20gdGhlIGN1cnJlbnQgbG9jYXRpb24uIFRoaXMgaXMgdXNlZCB0byBjb21wYXJlIGJpdHN0cmVhbSBwb3NpdGlvbnMgdXNpbmcuIE1fQkRfQ01QLgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkT2Zmc2V0ICAgICAgICAgLSBPZmZzZXQgdG8gYmUgYWRkZWQgaW4gYml0cy4KLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJEJ5dGVJbmRleCAgICAgIC0gRGVzdGluYXRpb24gcEJpdFN0cmVhbSBwb2ludGVyIGFmdGVyIGFkZGluZyB0aGUgT2Zmc2V0LiAKLSAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgd2lsbCBiZSA0IGJ5dGUgYWhlYWQgYW5kIG5lZWRzIHRvIHN1YnRyYWN0IGJ5IDQgdG8gZ2V0IGV4YWN0IAotICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgcG9pbnRlciAoYXMgaW4gTV9CRF9GSU5JKS4gQnV0IGZvciB1c2luZyB3aXRoIE1fQkRfQ01QIHN1YnRyYWN0IGlzIG5vdCBuZWVkZWQuCi0gICAgICAgIDsvLyAkQml0SW5kZXggICAgICAgLSBEZXN0aW5hdGlvbiBCaXRDb3VudCBhZnRlciB0aGUgYWRkaXRpb24gb2YgT2Zmc2V0IG51bWJlciBvZiBiaXRzCi0gICAgICAgIDsvLwotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX0FERCAgJEJ5dGVJbmRleCwgJEJpdEluZGV4LCAkT2Zmc2V0Ci0KLSAgICAgICAgOy8vICgkQnl0ZUluZGV4LCRCaXRJbmRleCkgPSBDdXJyZW50IHBvc2l0aW9uICsgJE9mZnNldCBiaXRzCi0gICAgICAgIEFERCAgICAgJE9mZnNldCwgJE9mZnNldCwgJEJpdENvdW50Ci0gICAgICAgIEFORCAgICAgJEJpdEluZGV4LCAkT2Zmc2V0LCAjNwotICAgICAgICBBREQgICAgICRCeXRlSW5kZXgsICRwQml0U3RyZWFtLCAkT2Zmc2V0LCBBU1IgIzMgICAgICAgIAotICAgICAgICBNRU5ECi0KLSAgICAgICAgOy8vIE1vdmUgYml0c3RyZWFtIHBvaW50ZXJzIHRvIHRoZSBsb2NhdGlvbiBnaXZlbgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIE91dHB1dHMgZGVzdGluYXRpb24gYnl0ZSBhbmQgYml0IGluZGV4IHZhbHVlcyB3aGljaCBjb3JyZXNwb25kcyB0byAgCi0gICAgICAgIDsvLyB0aGUgY3VycmVudCBsb2NhdGlvbiBnaXZlbiAoY2FsY3VsYXRlZCB1c2luZyBNX0JEX0FERCkuIAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vICRCeXRlSW5kZXggICAgICAtIERlc3RpbmF0aW9uIHBCaXRTdHJlYW0gcG9pbnRlciBhZnRlciBtb3ZlLiAKLSAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgd2lsbCBiZSA0IGJ5dGUgYWhlYWQgYW5kIG5lZWRzIHRvIHN1YnRyYWN0IGJ5IDQgdG8gZ2V0IGV4YWN0IAotICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgcG9pbnRlciAoYXMgaW4gTV9CRF9GSU5JKS4KLSAgICAgICAgOy8vICRCaXRJbmRleCAgICAgICAtIERlc3RpbmF0aW9uIEJpdENvdW50IGFmdGVyIHRoZSBtb3ZlCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuICAKLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9NT1YgICRCeXRlSW5kZXgsICRCaXRJbmRleAotCi0gICAgICAgIDsvLyAoJHBCaXRTdHJlYW0sICRPZmZzZXQpID0gKCRCeXRlSW5kZXgsJEJpdEluZGV4KQotICAgICAgICBNT1YgICAgICRCaXRDb3VudCwgJEJpdEluZGV4Ci0gICAgICAgIE1PViAgICAgJHBCaXRTdHJlYW0sICRCeXRlSW5kZXgKLSAgICAgICAgTUVORAotCi0gICAgICAgIDsvLyBCaXRzdHJlYW0gQ29tcGFyZQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIENvbXBhcmVzIGJpdHN0cmVhbSBwb3NpdGlvbiB3aXRoIHRoYXQgb2YgYSBkZXN0aW5hdGlvbiBwb3NpdGlvbi4gRGVzdGluYXRpb24gcG9zaXRpb24gCi0gICAgICAgIDsvLyBpcyBoZWxkIGluIHR3byBpbnB1dCByZWdpc3RlcnMgd2hpY2ggYXJlIGNhbGN1bGF0ZWQgdXNpbmcgTV9CRF9BREQgbWFjcm8KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJEJ5dGVJbmRleCAgICAgIC0gRGVzdGluYXRpb24gcEJpdFN0cmVhbSBwb2ludGVyLCAoNCBieXRlIGFoZWFkIGFzIGRlc2NyaWJlZCBpbiBNX0JEX0FERCkKLSAgICAgICAgOy8vICRCaXRJbmRleCAgICAgICAtIERlc3RpbmF0aW9uIEJpdENvdW50Ci0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIEZMQUdTICAgICAgICAgICAtIEdFIGlmIGRlc3RpbmF0aW9uIGlzIHJlYWNoZWQsIExUID0gaXMgZGVzdGluYXRpb24gaXMgYWhlYWQKLSAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfQ01QICAkQnl0ZUluZGV4LCAkQml0SW5kZXgsICRUMQotICAgICAgICAKLSAgICAgICAgOy8vIFJldHVybiBmbGFncyBzZXQgYnkgKGN1cnJlbnQgcG9zaXRvbiktKCRCeXRlSW5kZXgsJEJpdEluZGV4KQotICAgICAgICA7Ly8gc28gR0UgbWVhbnMgdGhhdCB3ZSBoYXZlIHJlYWNoZWQgdGhlIGluZGljYXRlZCBwb3NpdGlvbgotCi0gICAgICAgIEFERCAgICAgICAgICRUMSwgJHBCaXRTdHJlYW0sICRCaXRDb3VudCwgTFNSICMzCi0gICAgICAgIENNUCAgICAgICAgICRUMSwgJEJ5dGVJbmRleAotICAgICAgICBBTkQgICAgICAgICAkVDEsICRCaXRDb3VudCwgIzcKLSAgICAgICAgQ01QRVEgICAgICAgJFQxLCAkQml0SW5kZXggICAgICAgIAotICAgICAgICBNRU5ECi0KLSAgICAgICAgCi0gICAgICAgIDsvLyBCaXRzdHJlYW0gRGVjb2RlIGZpbmFsaXNlCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gV3JpdGVzIGJhY2sgdGhlIGJpdHN0cmVhbSBzdGF0ZSB0byB0aGUgYml0c3RyZWFtIHBvaW50ZXJzCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJHBwQml0U3RyZWFtICAgIC0gcG9pbnRlciB0byBwb2ludGVyIHRvIHRoZSBuZXh0IGJpdHN0cmVhbSBieXRlCi0gICAgICAgIDsvLyAkcEJpdE9mZnNldCAgICAgLSBwb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgYml0cyB1c2VkIGluIHRoZSBjdXJyZW50IGJ5dGUgKDAuLjcpCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSB0aGVzZSByZWdpc3RlciBhcmUgY29ycnVwdGVkCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfRklOSSAgJHBwQml0U3RyZWFtLCAkcEJpdE9mZnNldAotICAgICAgICAKLSAgICAgICAgOy8vIEFkdmFuY2UgcG9pbnRlciBieSB0aGUgbnVtYmVyIG9mIGZyZWUgYml0cyBpbiB0aGUgYnVmZmVyCi0gICAgICAgIEFERCAgICAgJHBCaXRTdHJlYW0sICRwQml0U3RyZWFtLCAkQml0Q291bnQsIExTUiMzCi0gICAgICAgIEFORCAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM3Ci0gICAgICAgIAotICAgICAgICA7Ly8gTm93IG1vdmUgYmFjayAzMiBiaXRzIHRvIHJlYWNoIHRoZSBmaXJzdCB1c3VlZCBiaXQKLSAgICAgICAgU1VCICAgICAkcEJpdFN0cmVhbSwgJHBCaXRTdHJlYW0sICM0Ci0gICAgICAgIAotICAgICAgICA7Ly8gU3RvcmUgb3V0IGJpdHN0cmVhbSBzdGF0ZQotICAgICAgICBTVFIgICAgICRCaXRDb3VudCwgWyRwQml0T2Zmc2V0XQotICAgICAgICBTVFIgICAgICRwQml0U3RyZWFtLCBbJHBwQml0U3RyZWFtXQotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBFTkQKLSAgICAgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fQml0c3RyZWFtLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fQml0c3RyZWFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NmI2NmQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1DT01NX0JpdHN0cmVhbS5oCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRmlsZTogYXJtQ09NTV9CaXRzdHJlYW0uaAotICogQnJpZWY6IERlY2xhcmVzIGNvbW1vbiBBUEkncy9EYXRhIHR5cGVzIHVzZWQgYWNyb3NzIHRoZSBPcGVuTWF4IEVuY29kZXJzL0RlY29kZXJzLgotICoKLSAqLwotCi0jaWZuZGVmIF9hcm1Db2RlY19IXwotI2RlZmluZSBfYXJtQ29kZWNfSF8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBPTVhfVTggICBjb2RlTGVuOwotICAgIE9NWF9VMzIJIGNvZGVXb3JkOwotfSBBUk1fVkxDMzI7Ci0KLS8qIFRoZSBhYm92ZSBzaG91bGQgYmUgcmVuYW1lZCBhcyAiQVJNX1ZMQzMyIiAqLwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1Mb29rQWhlYWRCaXRzKCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEdldCB0aGUgbmV4dCBOIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtIHdpdGhvdXQgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICAgICAqKnBwQml0U3RyZWFtCi0gKiBbaW5dICAgICAqcE9mZnNldAotICogW2luXSAgICAgTj0xLi4uMzIKLSAqCi0gKiBSZXR1cm5zICBWYWx1ZQotICovCi0KLU9NWF9VMzIgYXJtTG9va0FoZWFkQml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwgT01YX0lOVCAqcE9mZnNldCwgT01YX0lOVCBOKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtR2V0Qml0cygpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBSZWFkIE4gYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KLSAqICAgIAotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQotICogW2luXSAgICAgKnBPZmZzZXQKLSAqIFtpbl0gICAgIE49MS4uMzIKLSAqCi0gKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KLSAqIFtvdXRdICAgICpwT2Zmc2V0Ci0gKiBSZXR1cm5zICBWYWx1ZQotICovCi0KLU9NWF9VMzIgYXJtR2V0Qml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwgT01YX0lOVCAqcE9mZnNldCwgT01YX0lOVCBOKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtQnl0ZUFsaWduKCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEFsaWduIHRoZSBwb2ludGVyICpwcEJpdFN0cmVhbSB0byB0aGUgbmV4dCBieXRlIGJvdW5kYXJ5Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQotICogW2luXSAgICAgKnBPZmZzZXQKLSAqCi0gKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KLSAqIFtvdXRdICAgICpwT2Zmc2V0Ci0gKgotICoqLwotIAotT01YVm9pZCBhcm1CeXRlQWxpZ24oY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCk7Ci0KLS8qKiAKLSAqIEZ1bmN0aW9uOiBhcm1Ta2lwQml0cygpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBTa2lwIE4gYml0cyBmcm9tIHRoZSB2YWx1ZSBhdCAqcHBCaXRTdHJlYW0KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgICAgKnBwQml0U3RyZWFtCi0gKiBbaW5dICAgICAqcE9mZnNldAotICogW2luXSAgICAgTgotICoKLSAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQotICogW291dF0gICAgKnBPZmZzZXQKLSAqCi0gKiovCi0KLU9NWFZvaWQgYXJtU2tpcEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCxPTVhfSU5UIE4pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBWYXJpYWJsZSBiaXQgbGVuZ3RoIERlY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVW5QYWNrVkxDMzIoKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVmFyaWFibGUgbGVuZ3RoIGRlY29kZSBvZiB2YXJpYWJsZSBsZW5ndGggc3ltYm9sIChtYXggc2l6ZSAzMiBiaXRzKSByZWFkIGZyb20KLSAqIHRoZSBiaXQgc3RyZWFtIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIGF0ICpwT2Zmc2V0IGJ5IHVzaW5nIHRoZSB0YWJsZQotICogcG9pbnRlZCBieSBwQ29kZUJvb2sKLSAqIAotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICoqcHBCaXRTdHJlYW0KLSAqIFtpbl0gICAgICpwT2Zmc2V0Ci0gKiBbaW5dICAgICBwQ29kZUJvb2sKLSAqIAotICogW291dF0gICAgKipwcEJpdFN0cmVhbQotICogW291dF0gICAgKnBPZmZzZXQKLSAqCi0gKiBSZXR1cm5zIDogQ29kZSBCb29rIEluZGV4IGlmIHN1Y2Nlc3NmdWxsLiAKLSAqICAgICAgICAgOiAiQVJNX05PX0NPREVCT09LX0lOREVYID0gMHhGRkZGIiBpZiBzZWFyY2ggZmFpbHMuCi0gKiovCi0KLSNkZWZpbmUgQVJNX05PX0NPREVCT09LX0lOREVYIChPTVhfVTE2KSgweEZGRkYpCi0KLU9NWF9VMTYgYXJtVW5QYWNrVkxDMzIoCi0gICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcE9mZnNldCwKLSAgICBjb25zdCBBUk1fVkxDMzIgKnBDb2RlQm9vawotKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRml4ZWQgYml0IGxlbmd0aCBFbmNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogRnVuY3Rpb246IGFybVBhY2tCaXRzCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQYWNrIGEgVkxDIGNvZGUgd29yZCBpbnRvIHRoZSBiaXRzdHJlYW0KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbS4KLSAqIFtpbl0JcE9mZnNldAkgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKLSAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAotICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KLSAqIFtpbl0JY29kZVdvcmQJCUNvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCi0gKiBbaW5dCWNvZGVMZW5ndGgJCUxlbmd0aCBvZiB0aGUgY29kZSB3b3JkIHZhbGlkIHJhbmdlIDEuLi4zMgotICoKLSAqIFtvdXRdIHBwQml0U3RyZWFtCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAotICoJICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0Ci0gKgkJCQkJCQlzdHJlYW0gYnVmZmVyLgotICogW291dF0gcEJpdE9mZnNldAkJKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLSAqCQkJCQkJCWN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLSAqCQkJCQkJCSpwcEJpdFN0cmVhbS4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0gCi1PTVhSZXN1bHQgYXJtUGFja0JpdHMgKAotICAgIE9NWF9VOCAgKipwcEJpdFN0cmVhbSwgCi0gICAgT01YX0lOVCAqcE9mZnNldCwKLSAgICBPTVhfVTMyIGNvZGVXb3JkLCAKLSAgICBPTVhfSU5UIGNvZGVMZW5ndGggCi0pOwotIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVmFyaWFibGUgYml0IGxlbmd0aCBFbmNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogRnVuY3Rpb246IGFybVBhY2tWTEMzMgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGFjayBhIFZMQyBjb2RlIHdvcmQgaW50byB0aGUgYml0c3RyZWFtCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIAotICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0uCi0gKiBbaW5dCXBCaXRPZmZzZXQJICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKLSAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAotICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KLSAqIFtpbl0JIGNvZGUgICAgIAkJVkxDIGNvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0KLSAqCi0gKiBbb3V0XSBwcEJpdFN0cmVhbQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKLSAqCSAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0Ci0gKgkJCQkJCXN0cmVhbSBidWZmZXIuCi0gKiBbb3V0XSBwQml0T2Zmc2V0CQkqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotICoJCQkJCQljdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci0gKgkJCQkJCSpwcEJpdFN0cmVhbS4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0gCi1PTVhSZXN1bHQgYXJtUGFja1ZMQzMyICgKLSAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwgCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBBUk1fVkxDMzIgY29kZSAKLSk7Ci0KLSNlbmRpZiAgICAgIC8qX2FybUNvZGVjX0hfKi8KLQotLypFbmQgb2YgRmlsZSovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fSURDVFRhYmxlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fSURDVFRhYmxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyMzY4NGUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX0lEQ1RUYWJsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1DT01NX0lEQ1RUYWJsZS5oCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRmlsZSAgICAgICAgIDogYXJtQ09NTV9JRENUVGFibGUuaAotICogRGVzY3JpcHRpb24gIDogQ29udGFpbnMgZGVjbGFyYXRpb25zIG9mIHRhYmxlcyBmb3IgSURDVCBjYWxjdWxhdGlvbi4KLSAqCi0gKi8KLSAgCi0jaWZuZGVmIF9hcm1DT01NX0lEQ1RUYWJsZV9IXwotI2RlZmluZSBfYXJtQ09NTV9JRENUVGFibGVfSF8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0KLSAgICAgLyogIFRhYmxlIG9mIHModSkqQSh1KSpBKHYpLzE2IGF0IFExNQotICAgICAgKiAgcyh1KT0xLjAgMCA8PSB1IDw9IDUKLSAgICAgICogIHMoNik9Mi4wCi0gICAgICAqICBzKDcpPTQuMAotICAgICAgKiAgQSgwKSA9IDIqc3FydCgyKQotICAgICAgKiAgQSh1KSA9IDQqY29zKHUqcGkvMTYpICBmb3IgKHUhPTApCi0JICAqLwotZXh0ZXJuIGNvbnN0IE9NWF9VMTYgYXJtQ09NTV9JRENUUHJlU2NhbGUgWzY0XTsKLWV4dGVybiBjb25zdCBPTVhfVTE2IGFybUNPTU1fSURDVENvZWYgWzRdOwotCi0jZW5kaWYgLyogX2FybUNPTU1fSURDVFRhYmxlX0hfICovCi0KLQotLyogRW5kIG9mIEZpbGUgKi8KLQotCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX0lEQ1Rfcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX0lEQ1Rfcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTdkMjRmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9JRENUX3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0NTMgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA0IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLwotOy8vIElEQ1Rfcy5zCi07Ly8KLTsvLyBJbnZlcnNlIERDVCBtb2R1bGUKLTsvLwotOy8vIAotOy8vIEFMR09SSVRITSBERVNDUklQVElPTgotOy8vCi07Ly8gVGhlIDh4OCAyRCBJRENUIGlzIHBlcmZvcm1lZCBieSBjYWxjdWxhdGluZyBhIDFEIElEQ1QgZm9yIGVhY2gKLTsvLyBjb2x1bW4gYW5kIHRoZW4gYSAxRCBJRENUIGZvciBlYWNoIHJvdy4KLTsvLwotOy8vIFRoZSA4LXBvaW50IDFEIElEQ1QgaXMgZGVmaW5lZCBieQotOy8vICAgZih4KSA9IChDKDApKlQoMCkqYygwLHgpICsgLi4uICsgQyg3KSpUKDcpKmMoNyx4KSkvMgotOy8vCi07Ly8gICBDKHUpID0gMS9zcXJ0KDIpIGlmIHU9MCBvciAxIGlmIHUhPTAKLTsvLyAgIGModSx4KSA9IGNvcyggKDJ4KzEpKnUqcGkvMTYgKQotOy8vCi07Ly8gV2UgY29tcHV0ZSB0aGUgOC1wb2ludCAxRCBJRENUIHVzaW5nIHRoZSByZXZlcnNlIG9mCi07Ly8gdGhlIEFyYWktQWd1aS1OYWthamltYSBmbG93IGdyYXBoIHdoaWNoIHdlIHNwbGl0IGludG8KLTsvLyA1IHN0YWdlcyBuYW1lZCBpbiByZXZlcnNlIG9yZGVyIHRvIGlkZW50aWZ5IHdpdGggdGhlCi07Ly8gZm9yd2FyZCBEQ1QuIERpcmVjdCBpbnZlcnNpb24gb2YgdGhlIGZvcndhcmQgZm9ybXVsYWUKLTsvLyBpbiBmaWxlIEZEQ1Rfcy5zIGdpdmVzOgotOy8vCi07Ly8gSVN0YWdlIDU6ICAgaih1KSA9IFQodSkqQSh1KSAgWyBBKHUpPTQqQyh1KSpjKHUsMCkgXQotOy8vICAgICAgICAgICAgIFsgQSgwKSA9IDIqc3FydCgyKQotOy8vICAgICAgICAgICAgICAgQSh1KSA9IDQqY29zKHUqcGkvMTYpICBmb3IgKHUhPTApIF0KLTsvLwotOy8vIElTdGFnZSA0OiAgIGkwID0gajAgICAgICAgICAgICAgaTEgPSBqNAotOy8vICAgICAgICAgICAgIGkzID0gKGoyK2o2KS8yICAgICAgaTIgPSAoajItajYpLzIKLTsvLyAgICAgICAgICAgICBpNyA9IChqNStqMykvMiAgICAgIGk0ID0gKGo1LWozKS8yCi07Ly8gICAgICAgICAgICAgaTUgPSAoajErajcpLzIgICAgICBpNiA9IChqMS1qNykvMgotOy8vCi07Ly8gSVN0YWdlIDM6ICAgaDAgPSAoaTAraTEpLzIgICAgICBoMSA9IChpMC1pMSkvMgotOy8vICAgICAgICAgICAgIGgyID0gKGkyKnNxcnQyKS1pMyAgaDMgPSBpMwotOy8vICAgICAgICAgICAgIGg0ID0gIGNvcyhwaS84KSppNCArIHNpbihwaS84KSppNgotOy8vICAgICAgICAgICAgIGg2ID0gLXNpbihwaS84KSppNCArIGNvcyhwaS84KSppNgotOy8vICAgICAgICAgICAgIFsgVGhlIGFib3ZlIHR3byBsaW5lcyByb3RhdGUgYnkgLShwaS84KSBdCi07Ly8gICAgICAgICAgICAgaDUgPSAoaTUtaTcpL3NxcnQyICBoNyA9IChpNStpNykvMiAKLTsvLyAgICAgICAgICAgICAKLTsvLyBJU3RhZ2UgMjogICBnMCA9IChoMCtoMykvMiAgICAgIGczID0gKGgwLWgzKS8yCi07Ly8gICAgICAgICAgICAgZzEgPSAoaDEraDIpLzIgICAgICBnMiA9IChoMS1oMikvMgotOy8vICAgICAgICAgICAgIGc3ID0gaDcgICAgICAgICAgICAgZzYgPSBoNiAtIGg3Ci07Ly8gICAgICAgICAgICAgZzUgPSBoNSAtIGc2ICAgICAgICBnNCA9IGg0IC0gZzUKLTsvLwotOy8vIElTdGFnZSAxOiAgIGYwID0gKGcwK2c3KS8yICAgICAgZjcgPSAoZzAtZzcpLzIKLTsvLyAgICAgICAgICAgICBmMSA9IChnMStnNikvMiAgICAgIGY2ID0gKGcxLWc2KS8yCi07Ly8gICAgICAgICAgICAgZjIgPSAoZzIrZzUpLzIgICAgICBmNSA9IChnMi1nNSkvMgotOy8vICAgICAgICAgICAgIGYzID0gKGczK2c0KS8yICAgICAgZjQgPSAoZzMtZzQpLzIKLTsvLwotOy8vIE5vdGUgdGhhdCBtb3N0IGNvZWZmaWNpZW50cyBhcmUgaGFsdmVkIDMgdGltZXMgZHVyaW5nIHRoZQotOy8vIGFib3ZlIGNhbGN1bGF0aW9uLiBXZSBjYW4gcmVzY2FsZSB0aGUgYWxnb3JpdGhtIGRpdmlkaW5nCi07Ly8gdGhlIGlucHV0IGJ5IDggdG8gcmVtb3ZlIHRoZSBoYWx2aW5ncy4KLTsvLwotOy8vIElTdGFnZSA1OiAgIGoodSkgPSBUKHUpKkEodSkvOAotOy8vCi07Ly8gSVN0YWdlIDQ6ICAgaTAgPSBqMCAgICAgICAgICAgICBpMSA9IGo0Ci07Ly8gICAgICAgICAgICAgaTMgPSBqMiArIGo2ICAgICAgICBpMiA9IGoyIC0gajYKLTsvLyAgICAgICAgICAgICBpNyA9IGo1ICsgajMgICAgICAgIGk0ID0gajUgLSBqMwotOy8vICAgICAgICAgICAgIGk1ID0gajEgKyBqNyAgICAgICAgaTYgPSBqMSAtIGo3Ci07Ly8KLTsvLyBJU3RhZ2UgMzogICBoMCA9IGkwICsgaTEgICAgICAgIGgxID0gaTAgLSBpMQotOy8vICAgICAgICAgICAgIGgyID0gKGkyKnNxcnQyKS1pMyAgaDMgPSBpMwotOy8vICAgICAgICAgICAgIGg0ID0gMiooIGNvcyhwaS84KSppNCArIHNpbihwaS84KSppNikKLTsvLyAgICAgICAgICAgICBoNiA9IDIqKC1zaW4ocGkvOCkqaTQgKyBjb3MocGkvOCkqaTYpCi07Ly8gICAgICAgICAgICAgaDUgPSAoaTUtaTcpKnNxcnQyICBoNyA9IGk1ICsgaTcgCi07Ly8gICAgICAgICAgICAgCi07Ly8gSVN0YWdlIDI6ICAgZzAgPSBoMCArIGgzICAgICAgICBnMyA9IGgwIC0gaDMKLTsvLyAgICAgICAgICAgICBnMSA9IGgxICsgaDIgICAgICAgIGcyID0gaDEgLSBoMgotOy8vICAgICAgICAgICAgIGc3ID0gaDcgICAgICAgICAgICAgZzYgPSBoNiAtIGg3Ci07Ly8gICAgICAgICAgICAgZzUgPSBoNSAtIGc2ICAgICAgICBnNCA9IGg0IC0gZzUKLTsvLwotOy8vIElTdGFnZSAxOiAgIGYwID0gZzAgKyBnNyAgICAgICAgZjcgPSBnMCAtIGc3Ci07Ly8gICAgICAgICAgICAgZjEgPSBnMSArIGc2ICAgICAgICBmNiA9IGcxIC0gZzYKLTsvLyAgICAgICAgICAgICBmMiA9IGcyICsgZzUgICAgICAgIGY1ID0gZzIgLSBnNQotOy8vICAgICAgICAgICAgIGYzID0gZzMgKyBnNCAgICAgICAgZjQgPSBnMyAtIGc0Ci07Ly8KLTsvLyBOb3RlOgotOy8vIDEuIFRoZSBzY2FsaW5nIGJ5IEEodSkvOCBjYW4gb2Z0ZW4gYmUgY29tYmluZWQgd2l0aCBpbnZlcnNlCi07Ly8gICAgcXVhbnRpemF0aW9uLiBUaGUgY29sdW1uIGFuZCByb3cgc2NhbGluZ3MgY2FuIGJlIGNvbWJpbmVkLgotOy8vIDIuIFRoZSBmbG93Z3JhcGggaW4gdGhlIEFBTiBwYXBlciBoYXMgaDQsZzYgbmVnYXRlZCBjb21wYXJlZAotOy8vICAgIHRvIHRoZSBhYm92ZSBjb2RlIGJ1dCBpcyBvdGhlcndpc2UgaWRlbnRpY2FsLgotOy8vIDMuIFRoZSByb3RhdGlvbiBieSAtcGkvOCBjYW4gYmUgcGVmb3JtZWQgdXNpbmcgdGhyZWUgbXVsdGlwbGllcwotOy8vICAgIEVnICBjKmk0K3MqaTYgPSAoaTYtaTQpKnMgKyAoYytzKSppNAotOy8vICAgICAgIC1zKmk0K2MqaTYgPSAoaTYtaTQpKnMgKyAoYy1zKSppNgotOy8vIDQuIElmIHxUKHUpfDw9MSB0aGVuIGZyb20gdGhlIElEQ1QgZGVmaW5pdGlvbiwKLTsvLyAgICB8Zih4KXwgPD0gKCgxL3NxcnQyKSArIHxjKDEseCl8ICsgLi4gKyB8Yyg3LHgpfCkvMgotOy8vICAgICAgICAgICAgPSAoKDEvc3FydDIpICsgY29zKHBpLzE2KSArIC4uLiArIGNvcyg3KnBpLzE2KSkvMgotOy8vICAgICAgICAgICAgPSAoKDEvc3FydDIpICsgKGNvdChwaS8zMiktMSkvMikvMgotOy8vICAgICAgICAgICAgPSAoMSArIGNvcyhwaS8xNikgKyBjb3MoMnBpLzE2KSArIGNvcygzcGkvMTYpKS9zcXJ0KDIpCi07Ly8gICAgICAgICAgICA9IChhcHByb3gpMi42NAotOy8vICAgIFNvIHRoZSBtYXggZ2FpbiBvZiB0aGUgMkQgSURDVCBpcyB+eDcuMCA9IDMgYml0cy4KLTsvLyAgICBUaGUgdGFibGUgYmVsb3cgc2hvd3MgaW5wdXQgcGF0dGVybnMgZ2VuZXJhdGluZyB0aGUgbWF4aW11bQotOy8vICAgIHZhbHVlIG9mIHxmKHUpfCBmb3IgaW5wdXQgaW4gdGhlIHJhbmdlIHxUKHgpfDw9MS4gTT0tMSwgUD0rMQotOy8vICAgIElucHV0UGF0dGVybiAgICAgIE1heCB8Zih4KXwKLTsvLyAgICAgIFBQUFBQUFBQICAgICAgICB8ZjB8ID0gIDIuNjQKLTsvLyAgICAgIFBQUE1NTU1NICAgICAgICB8ZjF8ID0gIDIuNjQKLTsvLyAgICAgIFBQTU1NUFBQICAgICAgICB8ZjJ8ID0gIDIuNjQKLTsvLyAgICAgIFBQTU1QUE1NICAgICAgICB8ZjN8ID0gIDIuNjQKLTsvLyAgICAgIFBNTVBQTU1QICAgICAgICB8ZjR8ID0gIDIuNjQKLTsvLyAgICAgIFBNTVBNTVBNICAgICAgICB8ZjV8ID0gIDIuNjQKLTsvLyAgICAgIFBNUFBNUE1QICAgICAgICB8ZjZ8ID0gIDIuNjQKLTsvLyAgICAgIFBNUE1QTVBNICAgICAgICB8Zjd8ID0gIDIuNjQKLTsvLyAgIE5vdGUgdGhhdCB0aGlzIGlucHV0IHBhdHRlcm4gaXMgdGhlIHRyYW5zcG9zZSBvZiB0aGUKLTsvLyAgIGNvcnJlc3BvbmRpbmcgbWF4IGlucHV0IHBhdHRlciBmb3IgdGhlIEZEQ1QuCi0KLTsvLyBBcmd1bWVudHMKLQotcFNyYyAgICBSTiAwICAgIDsvLyBzb3VyY2UgZGF0YSBidWZmZXIKLVN0cmlkZSAgUk4gMSAgICA7Ly8gZGVzdGluYXRpb24gc3RyaWRlIGluIGJ5dGVzCi1wRGVzdCAgIFJOIDIgICAgOy8vIGRlc3RpbmF0aW9uIGRhdGEgYnVmZmVyCi1wU2NhbGUgIFJOIDMgICAgOy8vIHBvaW50ZXIgdG8gc2NhbGluZyB0YWJsZQotCi0KLSAgICAgICAgOy8vIERDVCBJbnZlcnNlIE1hY3JvCi0gICAgICAgIDsvLyBUaGUgRENUIGNvZGUgc2hvdWxkIGJlIHBhcmFtZXRyaXplZCBhY2NvcmRpbmcKLSAgICAgICAgOy8vIHRvIHRoZSBmb2xsb3dpbmcgaW5wdXRzOgotICAgICAgICA7Ly8gJG91dHNpemUgPSAidTgiICA6ICA4LWJpdCB1bnNpZ25lZCBkYXRhIHNhdHVyYXRlZCAoMCB0byArMjU1KQotICAgICAgICA7Ly8gICAgICAgICAgICAiczkiICA6IDE2LWJpdCBzaWduZWQgZGF0YSBzYXR1cmF0ZWQgdG8gOS1iaXQgKC0yNTYgdG8gKzI1NSkKLSAgICAgICAgOy8vICAgICAgICAgICAgInMxNiIgOiAxNi1iaXQgc2lnbmVkIGRhdGEgbm90IHNhdHVyYXRlZCAobWF4IHNpemUgfisvLTE0MjczKQotICAgICAgICA7Ly8gJGluc2NhbGUgPSAiczE2IiA6IHNpZ25lZCAxNi1iaXQgYWFuLXNjYWxlIHRhYmxlLCBRMTUgZm9ybWF0LCB3aXRoIDQgYnl0ZSBhbGlnbm1lbnQKLSAgICAgICAgOy8vICAgICAgICAgICAgInMzMiIgOiBzaWduZWQgMzItYml0IGFhbi1zY2FsZSB0YWJsZSwgUTIzIGZvcm1hdCwgd2l0aCA0IGJ5dGUgYWxpZ25tZW50Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXRzOgotICAgICAgICA7Ly8gcFNyYyAgID0gcjAgPSBQb2ludGVyIHRvIGlucHV0IGRhdGEKLSAgICAgICAgOy8vICAgICAgICAgICAgICAgUmFuZ2UgaXMgLTI1NiB0byArMjU1ICg5LWJpdCkKLSAgICAgICAgOy8vIFN0cmlkZSA9IHIxID0gU3RyaWRlIGJldHdlZW4gaW5wdXQgbGluZXMKLSAgICAgICAgOy8vIHBEZXN0ICA9IHIyID0gUG9pbnRlciB0byBvdXRwdXQgZGF0YQotICAgICAgICA7Ly8gcFNjYWxlID0gcjMgPSBQb2ludGVyIHRvIGFhbi1zY2FsZSB0YWJsZSBpbiB0aGUgZm9ybWF0IGRlZmluZWQgYnkgJGluc2NhbGUKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9JRENUICAkb3V0c2l6ZSwgJGluc2NhbGUsICRzdHJpZGUKLSAgICAgICAgTENMQSAgICBTSElGVAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIElGIEFSTTExMzZKUwotICAgICAgICAKLTsvLyBSRUdJU1RFUiBBTExPQ0FUSU9OCi07Ly8gVGhpcyBpcyBoYXJkIHNpbmNlIHdlIGhhdmUgOCB2YWx1ZXMsIDkgZnJlZSByZWdpc3RlcnMgYW5kIGVhY2gKLTsvLyBidXR0ZXJmbHkgcmVxdWlyZXMgYSB0ZW1wb3JhcnkgcmVnaXN0ZXIuIFdlIGFsc28gd2FudCB0byAKLTsvLyBtYWludGFpbiByZWdpc3RlciBvcmRlciBzbyB3ZSBjYW4gdXNlIExETS9TVE0uIFRoZSB0YWJsZSBiZWxvdwotOy8vIHN1bW1hcmlzZXMgdGhlIHJlZ2lzdGVyIGFsbG9jYXRpb24gdGhhdCBtZWV0cyBhbGwgdGhlc2UgY3JpdGVyaWEuCi07Ly8gYT0xc3Rjb2wsIGI9Mm5kY29sLCBmLGcsaCxpIGFyZSBkYXRhZmxvdyBwb2ludHMgZGVzY3JpYmVkIGFib3ZlLgotOy8vCi07Ly8gcjEgIGEwMSAgICAgZzAgIGgwCi07Ly8gcjQgIGIwMSBmMCAgZzEgIGgxICBpMAotOy8vIHI1ICBhMjMgZjEgIGcyICAgICAgaTEKLTsvLyByNiAgYjIzIGYyICBnMyAgaDIgIGkyCi07Ly8gcjcgIGE0NSBmMyAgICAgIGgzICBpMwotOy8vIHI4ICBiNDUgZjQgIGc0ICBoNCAgaTQKLTsvLyByOSAgYTY3IGY1ICBnNSAgaDUgIGk1Ci07Ly8gcjEwIGI2NyBmNiAgZzYgIGg2ICBpNgotOy8vIHIxMSAgICAgZjcgIGc3ICBoNyAgaTcKLTsvLwotcmEwMSAgICBSTiAxCi1yYjAxICAgIFJOIDQKLXJhMjMgICAgUk4gNQotcmIyMyAgICBSTiA2Ci1yYTQ1ICAgIFJOIDcKLXJiNDUgICAgUk4gOAotcmE2NyAgICBSTiA5Ci1yYjY3ICAgIFJOIDEwCi1ydG1wICAgIFJOIDExCi1jc1BpQnk4IFJOIDEyICAgOy8vIFsgKFNpbihwaS84KUBRMTUpLCAoQ29zKHBpLzgpQFExNSkgXQotTG9vcFJSMiBSTiAxNCAgIDsvLyBbIExvb3BOdW1iZXI8PDEzICwgKDEvU3FydCgyKSlAUTE1IF0KLTsvLyBUcmFuc3Bvc2UgYWxsb2NhdGlvbgoteGZ0ICAgICBSTiByYTAxCi14ZjAgICAgIFJOIHJiMDEKLXhmMSAgICAgUk4gcmEyMwoteGYyICAgICBSTiByYjIzCi14ZjMgICAgIFJOIHJhNDUKLXhmNCAgICAgUk4gcmI0NQoteGY1ICAgICBSTiByYTY3Ci14ZjYgICAgIFJOIHJiNjcKLXhmNyAgICAgUk4gcnRtcAotOy8vIElTdGFnZSAxIGFsbG9jYXRpb24KLXhnMCAgICAgUk4geGZ0Ci14ZzEgICAgIFJOIHhmMAoteGcyICAgICBSTiB4ZjEKLXhnMyAgICAgUk4geGYyCi14Z3QgICAgIFJOIHhmMwoteGc0ICAgICBSTiB4ZjQKLXhnNSAgICAgUk4geGY1Ci14ZzYgICAgIFJOIHhmNgoteGc3ICAgICBSTiB4ZjcKLTsvLyBJU3RhZ2UgMiBhbGxvY2F0aW9uCi14aDAgICAgIFJOIHhnMAoteGgxICAgICBSTiB4ZzEKLXhodCAgICAgUk4geGcyCi14aDIgICAgIFJOIHhnMwoteGgzICAgICBSTiB4Z3QKLXhoNCAgICAgUk4geGc0Ci14aDUgICAgIFJOIHhnNQoteGg2ICAgICBSTiB4ZzYKLXhoNyAgICAgUk4geGc3Ci07Ly8gSVN0YWdlIDMsNCBhbGxvY2F0aW9uCi14aXQgICAgIFJOIHhoMAoteGkwICAgICBSTiB4aDEKLXhpMSAgICAgUk4geGh0Ci14aTIgICAgIFJOIHhoMgoteGkzICAgICBSTiB4aDMKLXhpNCAgICAgUk4geGg0Ci14aTUgICAgIFJOIHhoNQoteGk2ICAgICBSTiB4aDYKLXhpNyAgICAgUk4geGg3Ci0gICAgICAgIAotICAgICAgICBNX1NUUiAgIHBEZXN0LCAgcHBEZXN0Ci0gICAgICAgIElGICIkc3RyaWRlIj0icyIKLSAgICAgICAgICAgIE1fU1RSICAgU3RyaWRlLCBwU3RyaWRlCi0gICAgICAgIEVORElGCi0gICAgICAgIE1fQURSICAgcERlc3QsICBwQmxrCi0gICAgICAgIExEUiAgICAgY3NQaUJ5OCwgPTB4MzBmYzc2NDIKLSAgICAgICAgTERSICAgICBMb29wUlIyLCA9MHgwMDAwNWE4MgotICAKLXY2X2lkY3RfY29sJF9GCi0gICAgICAgIDsvLyBMb2FkIGV2ZW4gdmFsdWVzCi0gICAgICAgIExEUiAgICAgeGk0LCBbcFNyY10sICM0ICA7Ly8gajAKLSAgICAgICAgTERSICAgICB4aTUsIFtwU3JjLCAjNCoxNi00XSAgOy8vIGo0Ci0gICAgICAgIExEUiAgICAgeGk2LCBbcFNyYywgIzIqMTYtNF0gIDsvLyBqMgotICAgICAgICBMRFIgICAgIHhpNywgW3BTcmMsICM2KjE2LTRdICA7Ly8gajYKLSAgICAgICAgCi0gICAgICAgIDsvLyBTY2FsZSBFdmVuIFZhbHVlcwotICAgICAgICBJRiAiJGluc2NhbGUiPSJzMTYiIDsvLyAxNngxNiBtdWwKLVNISUZUICAgICAgIFNFVEEgICAgMTIKLSAgICAgICAgICAgIExEUiAgICAgeGkwLCBbcFNjYWxlXSwgIzQKLSAgICAgICAgICAgIExEUiAgICAgeGkxLCBbcFNjYWxlLCAjNCoxNi00XSAgICAgICAgCi0gICAgICAgICAgICBMRFIgICAgIHhpMiwgW3BTY2FsZSwgIzIqMTYtNF0KLSAgICAgICAgICAgIE1PViAgICAgeGl0LCAjMTw8KFNISUZULTEpCi0gICAgICAgICAgICBTTUxBQkIgIHhpMywgeGkwLCB4aTQsIHhpdAotICAgICAgICAgICAgU01MQVRUICB4aTQsIHhpMCwgeGk0LCB4aXQKLSAgICAgICAgICAgIFNNTEFCQiAgeGkwLCB4aTEsIHhpNSwgeGl0Ci0gICAgICAgICAgICBTTUxBVFQgIHhpNSwgeGkxLCB4aTUsIHhpdAotICAgICAgICAgICAgTU9WICAgICB4aTMsIHhpMywgQVNSICNTSElGVAotICAgICAgICAgICAgUEtIQlQgICB4aTQsIHhpMywgeGk0LCBMU0wgIygxNi1TSElGVCkKLSAgICAgICAgICAgIExEUiAgICAgeGkzLCBbcFNjYWxlLCAjNioxNi00XQotICAgICAgICAgICAgU01MQUJCICB4aTEsIHhpMiwgeGk2LCB4aXQKLSAgICAgICAgICAgIFNNTEFUVCAgeGk2LCB4aTIsIHhpNiwgeGl0Ci0gICAgICAgICAgICBNT1YgICAgIHhpMCwgeGkwLCBBU1IgI1NISUZUCi0gICAgICAgICAgICBQS0hCVCAgIHhpNSwgeGkwLCB4aTUsIExTTCAjKDE2LVNISUZUKQotICAgICAgICAgICAgU01MQUJCICB4aTIsIHhpMywgeGk3LCB4aXQKLSAgICAgICAgICAgIFNNTEFUVCAgeGk3LCB4aTMsIHhpNywgeGl0Ci0gICAgICAgICAgICBNT1YgICAgIHhpMSwgeGkxLCBBU1IgI1NISUZUCi0gICAgICAgICAgICBQS0hCVCAgIHhpNiwgeGkxLCB4aTYsIExTTCAjKDE2LVNISUZUKQotICAgICAgICAgICAgTU9WICAgICB4aTIsIHhpMiwgQVNSICNTSElGVAotICAgICAgICAgICAgUEtIQlQgICB4aTcsIHhpMiwgeGk3LCBMU0wgIygxNi1TSElGVCkKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgIiRpbnNjYWxlIj0iczMyIiA7Ly8gMzJ4MTYgbXVsCi1TSElGVCAgICAgICBTRVRBICAgICgxMis4LTE2KQotICAgICAgICAgICAgTU9WICAgICB4aXQsICMxPDwoU0hJRlQtMSkKLSAgICAgICAgICAgIExEUiAgICAgeGkwLCBbcFNjYWxlXSwgIzgKLSAgICAgICAgICAgIExEUiAgICAgeGkxLCBbcFNjYWxlLCAjMCozMis0LThdCi0gICAgICAgICAgICBMRFIgICAgIHhpMiwgW3BTY2FsZSwgIzQqMzItOF0KLSAgICAgICAgICAgIExEUiAgICAgeGkzLCBbcFNjYWxlLCAjNCozMis0LThdICAgICAgICAgICAgCi0gICAgICAgICAgICBTTUxBV0IgIHhpMCwgeGkwLCB4aTQsIHhpdAotICAgICAgICAgICAgU01MQVdUICB4aTEsIHhpMSwgeGk0LCB4aXQKLSAgICAgICAgICAgIFNNTEFXQiAgeGkyLCB4aTIsIHhpNSwgeGl0Ci0gICAgICAgICAgICBTTUxBV1QgIHhpMywgeGkzLCB4aTUsIHhpdCAgICAgICAgICAgIAotICAgICAgICAgICAgTU9WICAgICB4aTAsIHhpMCwgQVNSICNTSElGVAotICAgICAgICAgICAgUEtIQlQgICB4aTQsIHhpMCwgeGkxLCBMU0wgIygxNi1TSElGVCkKLSAgICAgICAgICAgIE1PViAgICAgeGkyLCB4aTIsIEFTUiAjU0hJRlQgICAgICAgICAgICAKLSAgICAgICAgICAgIFBLSEJUICAgeGk1LCB4aTIsIHhpMywgTFNMICMoMTYtU0hJRlQpCi0gICAgICAgICAgICBMRFIgICAgIHhpMCwgW3BTY2FsZSwgIzIqMzItOF0KLSAgICAgICAgICAgIExEUiAgICAgeGkxLCBbcFNjYWxlLCAjMiozMis0LThdCi0gICAgICAgICAgICBMRFIgICAgIHhpMiwgW3BTY2FsZSwgIzYqMzItOF0KLSAgICAgICAgICAgIExEUiAgICAgeGkzLCBbcFNjYWxlLCAjNiozMis0LThdICAgICAgICAgICAgCi0gICAgICAgICAgICBTTUxBV0IgIHhpMCwgeGkwLCB4aTYsIHhpdAotICAgICAgICAgICAgU01MQVdUICB4aTEsIHhpMSwgeGk2LCB4aXQKLSAgICAgICAgICAgIFNNTEFXQiAgeGkyLCB4aTIsIHhpNywgeGl0Ci0gICAgICAgICAgICBTTUxBV1QgIHhpMywgeGkzLCB4aTcsIHhpdCAgICAgICAgICAgIAotICAgICAgICAgICAgTU9WICAgICB4aTAsIHhpMCwgQVNSICNTSElGVAotICAgICAgICAgICAgUEtIQlQgICB4aTYsIHhpMCwgeGkxLCBMU0wgIygxNi1TSElGVCkKLSAgICAgICAgICAgIE1PViAgICAgeGkyLCB4aTIsIEFTUiAjU0hJRlQgICAgICAgICAgICAKLSAgICAgICAgICAgIFBLSEJUICAgeGk3LCB4aTIsIHhpMywgTFNMICMoMTYtU0hJRlQpCi0gICAgICAgIEVORElGCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBMb2FkIG9kZCB2YWx1ZXMKLSAgICAgICAgTERSICAgICB4aTAsIFtwU3JjLCAjMSoxNi00XSAgICAgIDsvLyBqMQotICAgICAgICBMRFIgICAgIHhpMSwgW3BTcmMsICM3KjE2LTRdICAgICAgOy8vIGo3Ci0gICAgICAgIExEUiAgICAgeGkyLCBbcFNyYywgIzUqMTYtNF0gICAgICA7Ly8gajUKLSAgICAgICAgTERSICAgICB4aTMsIFtwU3JjLCAjMyoxNi00XSAgICAgIDsvLyBqMwotICAgICAgICAKLSAgICAgICAgSUYgIHtUUlVFfQotICAgICAgICAgICAgOy8vIHNob3J0Y3V0IGlmIG9kZCB2YWx1ZXMgMAotICAgICAgICAgICAgVEVRICAgICB4aTAsICMwCi0gICAgICAgICAgICBURVFFUSAgIHhpMSwgIzAKLSAgICAgICAgICAgIFRFUUVRICAgeGkyLCAjMAotICAgICAgICAgICAgVEVRRVEgICB4aTMsICMwCi0gICAgICAgICAgICBCRVEgICAgIHY2T2RkWmVybyRfRgotICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgICAgOy8vIFN0b3JlIHNjYWxlZCBldmVuIHZhbHVlcwotICAgICAgICBTVE1JQSAgIHBEZXN0LCB7eGk0LCB4aTUsIHhpNiwgeGk3fQotICAgICAgICAKLSAgICAgICAgOy8vIFNjYWxlIG9kZCB2YWx1ZXMKLSAgICAgICAgSUYgIiRpbnNjYWxlIj0iczE2IgotICAgICAgICAgICAgOy8vIFBlcmZvcm0gQUFOIFNjYWxlCi0gICAgICAgICAgICBMRFIgICAgIHhpNCwgW3BTY2FsZSwgIzEqMTYtNF0KLSAgICAgICAgICAgIExEUiAgICAgeGk1LCBbcFNjYWxlLCAjNyoxNi00XSAgICAgICAgCi0gICAgICAgICAgICBMRFIgICAgIHhpNiwgW3BTY2FsZSwgIzUqMTYtNF0KLSAgICAgICAgICAgIFNNTEFCQiAgeGk3LCB4aTAsIHhpNCwgeGl0Ci0gICAgICAgICAgICBTTUxBVFQgIHhpMCwgeGkwLCB4aTQsIHhpdAotICAgICAgICAgICAgU01MQUJCICB4aTQsIHhpMSwgeGk1LCB4aXQKLSAgICAgICAgICAgIFNNTEFUVCAgeGkxLCB4aTEsIHhpNSwgeGl0Ci0gICAgICAgICAgICBNT1YgICAgIHhpNywgeGk3LCBBU1IgI1NISUZUCi0gICAgICAgICAgICBQS0hCVCAgIHhpMCwgeGk3LCB4aTAsIExTTCAjKDE2LVNISUZUKQotICAgICAgICAgICAgTERSICAgICB4aTcsIFtwU2NhbGUsICMzKjE2LTRdCi0gICAgICAgICAgICBTTUxBQkIgIHhpNSwgeGkyLCB4aTYsIHhpdAotICAgICAgICAgICAgU01MQVRUICB4aTIsIHhpMiwgeGk2LCB4aXQKLSAgICAgICAgICAgIE1PViAgICAgeGk0LCB4aTQsIEFTUiAjU0hJRlQKLSAgICAgICAgICAgIFBLSEJUICAgeGkxLCB4aTQsIHhpMSwgTFNMICMoMTYtU0hJRlQpCi0gICAgICAgICAgICBTTUxBQkIgIHhpNiwgeGkzLCB4aTcsIHhpdAotICAgICAgICAgICAgU01MQVRUICB4aTMsIHhpMywgeGk3LCB4aXQKLSAgICAgICAgICAgIE1PViAgICAgeGk1LCB4aTUsIEFTUiAjU0hJRlQKLSAgICAgICAgICAgIFBLSEJUICAgeGkyLCB4aTUsIHhpMiwgTFNMICMoMTYtU0hJRlQpCi0gICAgICAgICAgICBNT1YgICAgIHhpNiwgeGk2LCBBU1IgI1NISUZUCi0gICAgICAgICAgICBQS0hCVCAgIHhpMywgeGk2LCB4aTMsIExTTCAjKDE2LVNISUZUKQotICAgICAgICBFTkRJRgotICAgICAgICBJRiAiJGluc2NhbGUiPSJzMzIiIDsvLyAzMngxNiBtdWwKLSAgICAgICAgICAgIExEUiAgICAgeGk0LCBbcFNjYWxlLCAjMSozMi04XQotICAgICAgICAgICAgTERSICAgICB4aTUsIFtwU2NhbGUsICMxKjMyKzQtOF0KLSAgICAgICAgICAgIExEUiAgICAgeGk2LCBbcFNjYWxlLCAjNyozMi04XQotICAgICAgICAgICAgTERSICAgICB4aTcsIFtwU2NhbGUsICM3KjMyKzQtOF0gICAgICAgICAgICAKLSAgICAgICAgICAgIFNNTEFXQiAgeGk0LCB4aTQsIHhpMCwgeGl0Ci0gICAgICAgICAgICBTTUxBV1QgIHhpNSwgeGk1LCB4aTAsIHhpdAotICAgICAgICAgICAgU01MQVdCICB4aTYsIHhpNiwgeGkxLCB4aXQKLSAgICAgICAgICAgIFNNTEFXVCAgeGk3LCB4aTcsIHhpMSwgeGl0ICAgICAgICAgICAgCi0gICAgICAgICAgICBNT1YgICAgIHhpNCwgeGk0LCBBU1IgI1NISUZUCi0gICAgICAgICAgICBQS0hCVCAgIHhpMCwgeGk0LCB4aTUsIExTTCAjKDE2LVNISUZUKQotICAgICAgICAgICAgTU9WICAgICB4aTYsIHhpNiwgQVNSICNTSElGVCAgICAgICAgICAgIAotICAgICAgICAgICAgUEtIQlQgICB4aTEsIHhpNiwgeGk3LCBMU0wgIygxNi1TSElGVCkKLSAgICAgICAgICAgIExEUiAgICAgeGk0LCBbcFNjYWxlLCAjNSozMi04XQotICAgICAgICAgICAgTERSICAgICB4aTUsIFtwU2NhbGUsICM1KjMyKzQtOF0KLSAgICAgICAgICAgIExEUiAgICAgeGk2LCBbcFNjYWxlLCAjMyozMi04XQotICAgICAgICAgICAgTERSICAgICB4aTcsIFtwU2NhbGUsICMzKjMyKzQtOF0gICAgICAgICAgICAKLSAgICAgICAgICAgIFNNTEFXQiAgeGk0LCB4aTQsIHhpMiwgeGl0Ci0gICAgICAgICAgICBTTUxBV1QgIHhpNSwgeGk1LCB4aTIsIHhpdAotICAgICAgICAgICAgU01MQVdCICB4aTYsIHhpNiwgeGkzLCB4aXQKLSAgICAgICAgICAgIFNNTEFXVCAgeGk3LCB4aTcsIHhpMywgeGl0ICAgICAgICAgICAgCi0gICAgICAgICAgICBNT1YgICAgIHhpNCwgeGk0LCBBU1IgI1NISUZUCi0gICAgICAgICAgICBQS0hCVCAgIHhpMiwgeGk0LCB4aTUsIExTTCAjKDE2LVNISUZUKQotICAgICAgICAgICAgTU9WICAgICB4aTYsIHhpNiwgQVNSICNTSElGVCAgICAgICAgICAgIAotICAgICAgICAgICAgUEtIQlQgICB4aTMsIHhpNiwgeGk3LCBMU0wgIygxNi1TSElGVCkKLSAgICAgICAgRU5ESUYKLSAgICAgICAgCi0gICAgICAgIFNIQUREMTYgeGk1LCB4aTAsIHhpMSAgICAgICAgICAgOy8vIChqMStqNykvMgotICAgICAgICBTU1VCMTYgIHhpNiwgeGkwLCB4aTEgICAgICAgICAgIDsvLyBqMS1qNwotICAgICAgICBTSEFERDE2IHhpNywgeGkyLCB4aTMgICAgICAgICAgIDsvLyAoajUrajMpLzIKLSAgICAgICAgU1NVQjE2ICB4aTQsIHhpMiwgeGkzICAgICAgICAgICA7Ly8gajUtajMKLSAgICAgICAgCi0gICAgICAgIFNTVUIxNiAgeGkzLCB4aTUsIHhpNyAgICAgICAgICAgOy8vIChpNS1pNykvMgotICAgICAgICAKLSAgICAgICAgUEtIQlQgICB4aTAsIHhpNiwgeGk0LCBMU0wjMTYgICA7Ly8gW2k0LGk2XSByb3cgYQotICAgICAgICBQS0hUQiAgIHhpMSwgeGk0LCB4aTYsIEFTUiMxNiAgIDsvLyBbaTQsaTZdIHJvdyBiCi0gICAgICAgIAotICAgICAgICBTTVVBRFggIHhpMiwgeGkwLCBjc1BpQnk4ICAgICAgIDsvLyByb3dhIGJ5IFtjLHNdCi0gICAgICAgIFNNVUFEWCAgeGk0LCB4aTEsIGNzUGlCeTggICAgICAgOy8vIHJvd2IgYnkgW2Msc10KLSAgICAgICAgU01VU0QgICB4aTAsIHhpMCwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YSBieSBbLXMsY10gICAKLSAgICAgICAgU01VU0QgICB4aTYsIHhpMSwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YiBieSBbLXMsY10KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgU01VTEJCICB4aTEsIHhpMywgTG9vcFJSMgotICAgICAgICBTTVVMVEIgIHhpMywgeGkzLCBMb29wUlIyCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIFBLSFRCICAgeGg0LCB4aTQsIHhpMiwgQVNSIzE2ICAgOy8vIGg0LzQKLSAgICAgICAgUEtIVEIgICB4aDYsIHhpNiwgeGkwLCBBU1IjMTYgICA7Ly8gaDYvNAotICAgICAgICBTSEFERDE2IHhoNywgeGk1LCB4aTcgICAgICAgICAgIDsvLyAoaTUraTcpLzQKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIHhpMCx4aTEseGkyLHhpMyBub3cgZnJlZQotICAgICAgICA7Ly8gSVN0YWdlIDQsMywgcm93cyAydG8zIHgxLzIKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgeGkzLCB4aTMsIExTTCAjMQotICAgICAgICBQS0hUQiAgIHhoNSwgeGkzLCB4aTEsIEFTUiMxNSAgIDsvLyBoNS80Ci0gICAgICAgIExEUkQgICAgeGkwLCBbcERlc3QsICM4XSAgICAgICAgOy8vIGoyLGo2IHNjYWxlZAotICAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gSVN0YWdlIDIsIHJvd3M0dG83Ci0gICAgICAgIFNTVUIxNiAgeGc2LCB4aDYsIHhoNwotICAgICAgICBTU1VCMTYgIHhnNSwgeGg1LCB4ZzYgICAgICAgIAotICAgICAgICBTU1VCMTYgIHhnNCwgeGg0LCB4ZzUKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgU1NVQjE2ICB4aTIsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gKGoyLWo2KQotICAgICAgICBTSEFERDE2IHhpMywgeGkwLCB4aTEgICAgICAgICAgIDsvLyAoajIrajYpLzIKLSAgICAgICAgCi0gICAgICAgIFNNVUxCQiAgeGkwLCB4aTIsIExvb3BSUjIKLSAgICAgICAgU01VTFRCICB4aTIsIHhpMiwgTG9vcFJSMgotICAgICAgICAKLSAgICAgICAgTU9WICAgICB4aTIsIHhpMiwgTFNMICMxCi0gICAgICAgIFBLSFRCICAgeGgyLCB4aTIsIHhpMCwgQVNSIzE1ICAgOy8vIGkyKnNxcnQoMikvNAotICAgICAgICAKLSAgICAgICAgOy8vIHhpMCwgeGkxIG5vdyBmcmVlCi0gICAgICAgIDsvLyBJU3RhZ2UgNCwzIHJvd3MgMHRvMSB4IDEvMgotICAgICAgICBMRFJEICAgIHhpMCwgW3BEZXN0XSAgICAgICAgICAgIDsvLyBqMCwgajQgc2NhbGVkCi0gICAgICAgIFNTVUIxNiAgeGgyLCB4aDIsIHhpMwotICAgICAgICBBRERTICAgIExvb3BSUjIsIExvb3BSUjIsICMyPDwyOSAgICA7Ly8gZG9uZSB0d28gcm93cwotICAgICAgICAKLSAgICAgICAgU0hBREQxNiB4aDAsIHhpMCwgeGkxCi0gICAgICAgIFNIU1VCMTYgeGgxLCB4aTAsIHhpMSAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBJU3RhZ2UgMiByb3dzIDB0bzMgeCAxLzIKLSAgICAgICAgU0hTVUIxNiB4ZzIsIHhoMSwgeGgyCi0gICAgICAgIFNIQUREMTYgeGcxLCB4aDEsIHhoMgotICAgICAgICBTSFNVQjE2IHhnMywgeGgwLCB4aDMKLSAgICAgICAgU0hBREQxNiB4ZzAsIHhoMCwgeGgzCi0gICAgICAgIAotICAgICAgICA7Ly8gSVN0YWdlIDEgYWxsIHJvd3MKLSAgICAgICAgU0FERDE2ICB4ZjMsIHhnMywgeGc0Ci0gICAgICAgIFNTVUIxNiAgeGY0LCB4ZzMsIHhnNAotICAgICAgICBTQUREMTYgIHhmMiwgeGcyLCB4ZzUKLSAgICAgICAgU1NVQjE2ICB4ZjUsIHhnMiwgeGc1Ci0gICAgICAgIFNBREQxNiAgeGYxLCB4ZzEsIHhnNgotICAgICAgICBTU1VCMTYgIHhmNiwgeGcxLCB4ZzYKLSAgICAgICAgU0FERDE2ICB4ZjAsIHhnMCwgeGc3Ci0gICAgICAgIFNTVUIxNiAgeGY3LCB4ZzAsIHhnNwotICAgICAgICAKLSAgICAgICAgOy8vIFRyYW5zcG9zZSwgc3RvcmUgYW5kIGxvb3AKLSAgICAgICAgUEtIQlQgICByYTAxLCB4ZjAsIHhmMSwgTFNMICMxNgotICAgICAgICBQS0hUQiAgIHJiMDEsIHhmMSwgeGYwLCBBU1IgIzE2Ci0gICAgICAgIAotICAgICAgICBQS0hCVCAgIHJhMjMsIHhmMiwgeGYzLCBMU0wgIzE2Ci0gICAgICAgIFBLSFRCICAgcmIyMywgeGYzLCB4ZjIsIEFTUiAjMTYKLSAgICAgICAgCi0gICAgICAgIFBLSEJUICAgcmE0NSwgeGY0LCB4ZjUsIExTTCAjMTYKLSAgICAgICAgUEtIVEIgICByYjQ1LCB4ZjUsIHhmNCwgQVNSICMxNgotICAgICAgICAKLSAgICAgICAgUEtIQlQgICByYTY3LCB4ZjYsIHhmNywgTFNMICMxNgotICAgICAgICBTVE1JQSAgIHBEZXN0ISwge3JhMDEsIHJhMjMsIHJhNDUsIHJhNjd9ICAgICAgCi0gICAgICAgIFBLSFRCICAgcmI2NywgeGY3LCB4ZjYsIEFTUiAjMTYKLSAgICAgICAgU1RNSUEgICBwRGVzdCEsIHtyYjAxLCByYjIzLCByYjQ1LCByYjY3fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBCQ0MgICAgIHY2X2lkY3RfY29sJF9GCi0gICAgICAgIAotICAgICAgICBTVUIgICAgIHBTcmMsIHBEZXN0LCAjKDY0KjIpCi0gICAgICAgIE1fTERSICAgcERlc3QsIHBwRGVzdAotICAgICAgICBJRiAiJHN0cmlkZSI9InMiCi0gICAgICAgICAgICBNX0xEUiAgIHBTY2FsZSwgcFN0cmlkZSAKLSAgICAgICAgRU5ESUYKLSAgICAgICAgQiAgICAgICB2Nl9pZGN0X3JvdyRfRgotICAgICAgICAKLXY2T2RkWmVybyRfRgotICAgICAgICBTU1VCMTYgIHhpMiwgeGk2LCB4aTcgICAgICAgICAgIDsvLyAoajItajYpCi0gICAgICAgIFNIQUREMTYgeGkzLCB4aTYsIHhpNyAgICAgICAgICAgOy8vIChqMitqNikvMgotICAgICAgICAKLSAgICAgICAgU01VTEJCICB4aTAsIHhpMiwgTG9vcFJSMgotICAgICAgICBTTVVMVEIgIHhpMiwgeGkyLCBMb29wUlIyCi0gICAgICAgIAotICAgICAgICBNT1YgICAgIHhpMiwgeGkyLCBMU0wgIzEKLSAgICAgICAgUEtIVEIgICB4aDIsIHhpMiwgeGkwLCBBU1IjMTUgICA7Ly8gaTIqc3FydCgyKS80Ci0gICAgICAgIFNTVUIxNiAgeGgyLCB4aDIsIHhpMwotICAgICAgICAKLSAgICAgICAgOy8vIHhpMCwgeGkxIG5vdyBmcmVlCi0gICAgICAgIDsvLyBJU3RhZ2UgNCwzIHJvd3MgMHRvMSB4IDEvMgotICAgICAgICAKLSAgICAgICAgU0hBREQxNiB4aDAsIHhpNCwgeGk1Ci0gICAgICAgIFNIU1VCMTYgeGgxLCB4aTQsIHhpNSAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBJU3RhZ2UgMiByb3dzIDB0bzMgeCAxLzIKLSAgICAgICAgU0hTVUIxNiB4ZzIsIHhoMSwgeGgyCi0gICAgICAgIFNIQUREMTYgeGcxLCB4aDEsIHhoMgotICAgICAgICBTSFNVQjE2IHhnMywgeGgwLCB4aDMKLSAgICAgICAgU0hBREQxNiB4ZzAsIHhoMCwgeGgzCi0gICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIElTdGFnZSAxIGFsbCByb3dzCi0gICAgICAgIE1PViAgeGYzLCB4ZzMKLSAgICAgICAgTU9WICB4ZjQsIHhnMwotICAgICAgICBNT1YgIHhmMiwgeGcyCi0gICAgICAgIE1PViAgeGY1LCB4ZzIKLSAgICAgICAgTU9WICB4ZjEsIHhnMQotICAgICAgICBNT1YgIHhmNiwgeGcxCi0gICAgICAgIE1PViAgeGYwLCB4ZzAKLSAgICAgICAgTU9WICB4ZjcsIHhnMAotICAgICAgICAKLSAgICAgICAgOy8vIFRyYW5zcG9zZQotICAgICAgICBQS0hCVCAgIHJhMDEsIHhmMCwgeGYxLCBMU0wgIzE2Ci0gICAgICAgIFBLSFRCICAgcmIwMSwgeGYxLCB4ZjAsIEFTUiAjMTYKLSAgICAgICAgCi0gICAgICAgIFBLSEJUICAgcmEyMywgeGYyLCB4ZjMsIExTTCAjMTYKLSAgICAgICAgUEtIVEIgICByYjIzLCB4ZjMsIHhmMiwgQVNSICMxNgotICAgICAgICAKLSAgICAgICAgUEtIQlQgICByYTQ1LCB4ZjQsIHhmNSwgTFNMICMxNgotICAgICAgICBQS0hUQiAgIHJiNDUsIHhmNSwgeGY0LCBBU1IgIzE2Ci0gICAgICAgIAotICAgICAgICBQS0hCVCAgIHJhNjcsIHhmNiwgeGY3LCBMU0wgIzE2Ci0gICAgICAgIFBLSFRCICAgcmI2NywgeGY3LCB4ZjYsIEFTUiAjMTYKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgU1RNSUEgICBwRGVzdCEsIHtyYTAxLCByYTIzLCByYTQ1LCByYTY3fSAgICAgIAotICAgICAgICBBRERTICAgIExvb3BSUjIsIExvb3BSUjIsICMyPDwyOSAgICA7Ly8gZG9uZSB0d28gcm93cwotICAgICAgICBTVE1JQSAgIHBEZXN0ISwge3JiMDEsIHJiMjMsIHJiNDUsIHJiNjd9ICAgICAgCi0gICAgICAgIAotICAgICAgICBCQ0MgICAgIHY2X2lkY3RfY29sJF9GCi0gICAgICAgIFNVQiAgICAgcFNyYywgcERlc3QsICMoNjQqMikKLSAgICAgICAgTV9MRFIgICBwRGVzdCwgcHBEZXN0Ci0gICAgICAgIElGICIkc3RyaWRlIj0icyIKLSAgICAgICAgICAgIE1fTERSICAgcFNjYWxlLCBwU3RyaWRlIAotICAgICAgICBFTkRJRgotICAgICAgICAgICAgICAgCi0gICAgICAgIAotdjZfaWRjdF9yb3ckX0YKLSAgICAgICAgOy8vIElTdGFnZSA0LDMsIHJvd3M0dG83IHgxLzQKLSAgICAgICAgTERSICAgICB4aXQsID0weDAwMDEwMDAxICAgICAgICA7Ly8gcm91bmRpbmcgY29uc3RhbnQKLSAgICAgICAgTERSICAgICB4aTAsIFtwU3JjLCAjMSoxNl0gICAgICA7Ly8gajEKLSAgICAgICAgTERSICAgICB4aTEsIFtwU3JjLCAjNyoxNl0gICAgICA7Ly8gNCpqNwotICAgICAgICBMRFIgICAgIHhpMiwgW3BTcmMsICM1KjE2XSAgICAgIDsvLyBqNQotICAgICAgICBMRFIgICAgIHhpMywgW3BTcmMsICMzKjE2XSAgICAgIDsvLyBqMwotICAgICAgICAKLSAgICAgICAgU0hBREQxNiB4aTEsIHhpMSwgeGl0ICAgICAgICAgICA7Ly8gMipqNwotICAgICAgICBTSEFERDE2IHhpMSwgeGkxLCB4aXQgICAgICAgICAgIDsvLyBqNyAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFNIQUREMTYgeGk1LCB4aTAsIHhpMSAgICAgICAgICAgOy8vIChqMStqNykvMgotICAgICAgICBTU1VCMTYgIHhpNiwgeGkwLCB4aTEgICAgICAgICAgIDsvLyBqMS1qNwotICAgICAgICBTSEFERDE2IHhpNywgeGkyLCB4aTMgICAgICAgICAgIDsvLyAoajUrajMpLzIKLSAgICAgICAgU1NVQjE2ICB4aTQsIHhpMiwgeGkzICAgICAgICAgICA7Ly8gajUtajMKLSAgICAgICAgCi0gICAgICAgIFNTVUIxNiAgeGkzLCB4aTUsIHhpNyAgICAgICAgICAgOy8vIChpNS1pNykvMgotICAgICAgICAKLSAgICAgICAgUEtIQlQgICB4aTAsIHhpNiwgeGk0LCBMU0wjMTYgICA7Ly8gW2k0LGk2XSByb3cgYQotICAgICAgICBQS0hUQiAgIHhpMSwgeGk0LCB4aTYsIEFTUiMxNiAgIDsvLyBbaTQsaTZdIHJvdyBiCi0gICAgICAgIAotICAgICAgICBTTVVBRFggIHhpMiwgeGkwLCBjc1BpQnk4ICAgICAgIDsvLyByb3dhIGJ5IFtjLHNdCi0gICAgICAgIFNNVUFEWCAgeGk0LCB4aTEsIGNzUGlCeTggICAgICAgOy8vIHJvd2IgYnkgW2Msc10KLSAgICAgICAgU01VU0QgICB4aTAsIHhpMCwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YSBieSBbLXMsY10gICAKLSAgICAgICAgU01VU0QgICB4aTYsIHhpMSwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YiBieSBbLXMsY10KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgU01VTEJCICB4aTEsIHhpMywgTG9vcFJSMgotICAgICAgICBTTVVMVEIgIHhpMywgeGkzLCBMb29wUlIyCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIFBLSFRCICAgeGg0LCB4aTQsIHhpMiwgQVNSIzE2ICAgOy8vIGg0LzQKLSAgICAgICAgUEtIVEIgICB4aDYsIHhpNiwgeGkwLCBBU1IjMTYgICA7Ly8gaDYvNAotICAgICAgICBTSEFERDE2IHhoNywgeGk1LCB4aTcgICAgICAgICAgIDsvLyAoaTUraTcpLzQKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgeGkzLCB4aTMsIExTTCAjMQotICAgICAgICBQS0hUQiAgIHhoNSwgeGkzLCB4aTEsIEFTUiMxNSAgIDsvLyBoNS80Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIHhpMCx4aTEseGkyLHhpMyBub3cgZnJlZQotICAgICAgICA7Ly8gSVN0YWdlIDQsMywgcm93cyAydG8zIHgxLzIKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgeGkwLCBbcFNyYywgIzIqMTZdICAgICAgOy8vIGoyCi0gICAgICAgIExEUiAgICAgeGkxLCBbcFNyYywgIzYqMTZdICAgICAgOy8vIDIqajYKLSAgICAgICAgCi0gICAgICAgIDsvLyBJU3RhZ2UgMiwgcm93czR0bzcKLSAgICAgICAgU1NVQjE2ICB4ZzYsIHhoNiwgeGg3Ci0gICAgICAgIFNTVUIxNiAgeGc1LCB4aDUsIHhnNgotICAgICAgICBTU1VCMTYgIHhnNCwgeGg0LCB4ZzUKLSAgICAgICAgCi0gICAgICAgIFNIQUREMTYgeGkxLCB4aTEsIHhpdCAgICAgICAgICAgOy8vIGo2Ci0gICAgICAgIFNTVUIxNiAgeGkyLCB4aTAsIHhpMSAgICAgICAgICAgOy8vIChqMi1qNikgICAgICAgIAotICAgICAgICBTSEFERDE2IHhpMywgeGkwLCB4aTEgICAgICAgICAgIDsvLyAoajIrajYpLzIKLSAgICAgICAgCi0gICAgICAgIFNNVUxCQiAgeGkwLCB4aTIsIExvb3BSUjIKLSAgICAgICAgU01VTFRCICB4aTIsIHhpMiwgTG9vcFJSMgotICAgICAgICAKLSAgICAgICAgTU9WICAgICB4aTIsIHhpMiwgTFNMICMxCi0gICAgICAgIAotICAgICAgICBQS0hUQiAgIHhoMiwgeGkyLCB4aTAsIEFTUiMxNSAgIDsvLyBpMipzcXJ0KDIpLzQKLSAgICAgICAgCi0gICAgICAgIDsvLyB4aTAsIHhpMSBub3cgZnJlZQotICAgICAgICA7Ly8gSVN0YWdlIDQsMyByb3dzIDB0bzEgeCAxLzIKLSAgICAgICAgTERSICAgICB4aTEsIFtwU3JjLCAjNCoxNl0gICAgICA7Ly8gajQKLSAgICAgICAgTERSICAgICB4aTAsIFtwU3JjXSwgIzQgICAgICAgICA7Ly8gajAKLQotICAgICAgICBTU1VCMTYgIHhoMiwgeGgyLCB4aTMKLSAgICAgICAgQUREUyAgICBMb29wUlIyLCBMb29wUlIyLCAjMjw8MjkgICAgOy8vIGRvbmUgdHdvIHJvd3MKLSAgICAgICAgCi0gICAgICAgIEFERCAgICAgeGkwLCB4aTAsIHhpdCwgTFNMICMyICAgOy8vIGVuc3VyZSBjb3JyZWN0IHJvdW5kCi0gICAgICAgIFNIQUREMTYgeGgwLCB4aTAsIHhpMSAgICAgICAgICAgOy8vIG9mIERDIHJlc3VsdAotICAgICAgICBTSFNVQjE2IHhoMSwgeGkwLCB4aTEKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIElTdGFnZSAyIHJvd3MgMHRvMyB4IDEvMgotICAgICAgICBTSFNVQjE2IHhnMiwgeGgxLCB4aDIKLSAgICAgICAgU0hBREQxNiB4ZzEsIHhoMSwgeGgyCi0gICAgICAgIFNIU1VCMTYgeGczLCB4aDAsIHhoMwotICAgICAgICBTSEFERDE2IHhnMCwgeGgwLCB4aDMKLSAgICAgICAgCi0gICAgICAgIDsvLyBJU3RhZ2UgMSBhbGwgcm93cwotICAgICAgICBTSEFERDE2IHhmMywgeGczLCB4ZzQKLSAgICAgICAgU0hTVUIxNiB4ZjQsIHhnMywgeGc0Ci0gICAgICAgIFNIQUREMTYgeGYyLCB4ZzIsIHhnNQotICAgICAgICBTSFNVQjE2IHhmNSwgeGcyLCB4ZzUKLSAgICAgICAgU0hBREQxNiB4ZjEsIHhnMSwgeGc2Ci0gICAgICAgIFNIU1VCMTYgeGY2LCB4ZzEsIHhnNgotICAgICAgICBTSEFERDE2IHhmMCwgeGcwLCB4ZzcKLSAgICAgICAgU0hTVUIxNiB4ZjcsIHhnMCwgeGc3Ci0gICAgICAgIAotICAgICAgICA7Ly8gU2F0dXJhdGUKLSAgICAgICAgSUYgKCIkb3V0c2l6ZSI9InU4IikKLSAgICAgICAgICAgIFVTQVQxNiAgeGYwLCAjOCwgeGYwCi0gICAgICAgICAgICBVU0FUMTYgIHhmMSwgIzgsIHhmMQotICAgICAgICAgICAgVVNBVDE2ICB4ZjIsICM4LCB4ZjIKLSAgICAgICAgICAgIFVTQVQxNiAgeGYzLCAjOCwgeGYzCi0gICAgICAgICAgICBVU0FUMTYgIHhmNCwgIzgsIHhmNAotICAgICAgICAgICAgVVNBVDE2ICB4ZjUsICM4LCB4ZjUKLSAgICAgICAgICAgIFVTQVQxNiAgeGY2LCAjOCwgeGY2Ci0gICAgICAgICAgICBVU0FUMTYgIHhmNywgIzgsIHhmNyAgICAgICAgCi0gICAgICAgIEVORElGCi0gICAgICAgIElGICgiJG91dHNpemUiPSJzOSIpCi0gICAgICAgICAgICBTU0FUMTYgIHhmMCwgIzksIHhmMAotICAgICAgICAgICAgU1NBVDE2ICB4ZjEsICM5LCB4ZjEKLSAgICAgICAgICAgIFNTQVQxNiAgeGYyLCAjOSwgeGYyCi0gICAgICAgICAgICBTU0FUMTYgIHhmMywgIzksIHhmMwotICAgICAgICAgICAgU1NBVDE2ICB4ZjQsICM5LCB4ZjQKLSAgICAgICAgICAgIFNTQVQxNiAgeGY1LCAjOSwgeGY1Ci0gICAgICAgICAgICBTU0FUMTYgIHhmNiwgIzksIHhmNgotICAgICAgICAgICAgU1NBVDE2ICB4ZjcsICM5LCB4ZjcgICAgICAgIAotICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgICAgOy8vIFRyYW5zcG9zZSB0byBSb3csIFBhY2sgYW5kIHN0b3JlCi0gICAgICAgIElGICgiJG91dHNpemUiPSJ1OCIpCi0gICAgICAgICAgICBPUlIgICAgIHhmMCwgeGYwLCB4ZjEsIExTTCAjOCA7Ly8gWyBiMSBiMCBhMSBhMCBdCi0gICAgICAgICAgICBPUlIgICAgIHhmMiwgeGYyLCB4ZjMsIExTTCAjOCA7Ly8gWyBiMyBiMiBhMyBhMiBdCi0gICAgICAgICAgICBPUlIgICAgIHhmNCwgeGY0LCB4ZjUsIExTTCAjOCA7Ly8gWyBiNSBiNCBhNSBhNCBdCi0gICAgICAgICAgICBPUlIgICAgIHhmNiwgeGY2LCB4ZjcsIExTTCAjOCA7Ly8gWyBiNyBiNiBhNyBhNiBdCi0gICAgICAgICAgICBQS0hCVCAgIHJhMDEsIHhmMCwgeGYyLCBMU0wgIzE2Ci0gICAgICAgICAgICBQS0hUQiAgIHJiMDEsIHhmMiwgeGYwLCBBU1IgIzE2Ci0gICAgICAgICAgICBQS0hCVCAgIHJhMjMsIHhmNCwgeGY2LCBMU0wgIzE2Ci0gICAgICAgICAgICBQS0hUQiAgIHJiMjMsIHhmNiwgeGY0LCBBU1IgIzE2Ci0gICAgICAgICAgICBTVE1JQSAgIHBEZXN0LCB7cmEwMSwgcmEyM30KLSAgICAgICAgICAgIElGICIkc3RyaWRlIj0icyIKLSAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgcFNjYWxlCi0gICAgICAgICAgICAgICAgU1RNSUEgICBwRGVzdCwge3JiMDEsIHJiMjN9Ci0gICAgICAgICAgICAgICAgQUREICAgICBwRGVzdCwgcERlc3QsIHBTY2FsZQotICAgICAgICAgICAgRUxTRSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgIygkc3RyaWRlKQotICAgICAgICAgICAgICAgIFNUTUlBICAgcERlc3QsIHtyYjAxLCByYjIzfQotICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCAjKCRzdHJpZGUpCi0gICAgICAgICAgICBFTkRJRgotICAgICAgICBFTkRJRgotICAgICAgICBJRiAoIiRvdXRzaXplIj0iczkiKTpMT1I6KCIkb3V0c2l6ZSI9InMxNiIpICAgICAgICAKLSAgICAgICAgICAgIFBLSEJUICAgcmEwMSwgeGYwLCB4ZjEsIExTTCAjMTYKLSAgICAgICAgICAgIFBLSFRCICAgcmIwMSwgeGYxLCB4ZjAsIEFTUiAjMTYKLSAgICAgICAgCi0gICAgICAgICAgICBQS0hCVCAgIHJhMjMsIHhmMiwgeGYzLCBMU0wgIzE2Ci0gICAgICAgICAgICBQS0hUQiAgIHJiMjMsIHhmMywgeGYyLCBBU1IgIzE2Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFBLSEJUICAgcmE0NSwgeGY0LCB4ZjUsIExTTCAjMTYKLSAgICAgICAgICAgIFBLSFRCICAgcmI0NSwgeGY1LCB4ZjQsIEFTUiAjMTYKLSAgICAgICAgICAgIAotICAgICAgICAgICAgUEtIQlQgICByYTY3LCB4ZjYsIHhmNywgTFNMICMxNgotICAgICAgICAgICAgUEtIVEIgICByYjY3LCB4ZjcsIHhmNiwgQVNSICMxNgotICAgICAgICAgICAgCi0gICAgICAgICAgICBTVE1JQSAgIHBEZXN0LCB7cmEwMSwgcmEyMywgcmE0NSwgcmE2N30gICAgICAKLSAgICAgICAgICAgIElGICIkc3RyaWRlIj0icyIKLSAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgcFNjYWxlCi0gICAgICAgICAgICAgICAgU1RNSUEgICBwRGVzdCwge3JiMDEsIHJiMjMsIHJiNDUsIHJiNjd9ICAgICAgCi0gICAgICAgICAgICAgICAgQUREICAgICBwRGVzdCwgcERlc3QsIHBTY2FsZQotICAgICAgICAgICAgRUxTRSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgIygkc3RyaWRlKQotICAgICAgICAgICAgICAgIFNUTUlBICAgcERlc3QsIHtyYjAxLCByYjIzLCByYjQ1LCByYjY3fSAgICAgIAotICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCAjKCRzdHJpZGUpCi0gICAgICAgICAgICBFTkRJRgotICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgICAgQkNDICAgICB2Nl9pZGN0X3JvdyRfRgotICAgICAgICBFTkRJRiA7Ly8gQVJNMTEzNkpTCi0KLQotICAgICAgICBJRiBDb3J0ZXhBOAotICAgICAgICAKLVNyYzAgICAgICAgICAgICBFUVUgIDcgICAgICAgICAgICAgIAotU3JjMSAgICAgICAgICAgIEVRVSAgOCAgICAgICAgICAgICAgCi1TcmMyICAgICAgICAgICAgRVFVICA5ICAgICAgICAgICAgICAKLVNyYzMgICAgICAgICAgICBFUVUgIDEwICAgICAgICAgICAgICAKLVNyYzQgICAgICAgICAgICBFUVUgIDExICAgICAgICAgICAgICAKLVNyYzUgICAgICAgICAgICBFUVUgIDEyICAgICAgICAgICAgICAKLVNyYzYgICAgICAgICAgICBFUVUgIDEzCi1TcmM3ICAgICAgICAgICAgRVFVICAxNAotVG1wICAgICAgICAgICAgIEVRVSAgMTUKLQotcVhqMCAgICAgICAgICAgIFFOIFNyYzAuUzE2IAotcVhqMSAgICAgICAgICAgIFFOIFNyYzEuUzE2Ci1xWGoyICAgICAgICAgICAgUU4gU3JjMi5TMTYKLXFYajMgICAgICAgICAgICBRTiBTcmMzLlMxNgotcVhqNCAgICAgICAgICAgIFFOIFNyYzQuUzE2Ci1xWGo1ICAgICAgICAgICAgUU4gU3JjNS5TMTYKLXFYajYgICAgICAgICAgICBRTiBTcmM2LlMxNgotcVhqNyAgICAgICAgICAgIFFOIFNyYzcuUzE2Ci1xWGp0ICAgICAgICAgICAgUU4gVG1wLlMxNgotCi1kWGowbG8gICAgICAgICAgRE4gKFNyYzAqMikuUzE2Ci1kWGowaGkgICAgICAgICAgRE4gKFNyYzAqMisxKS5TMTYKLWRYajFsbyAgICAgICAgICBETiAoU3JjMSoyKS5TMTYKLWRYajFoaSAgICAgICAgICBETiAoU3JjMSoyKzEpLlMxNgotZFhqMmxvICAgICAgICAgIEROIChTcmMyKjIpLlMxNgotZFhqMmhpICAgICAgICAgIEROIChTcmMyKjIrMSkuUzE2Ci1kWGozbG8gICAgICAgICAgRE4gKFNyYzMqMikuUzE2Ci1kWGozaGkgICAgICAgICAgRE4gKFNyYzMqMisxKS5TMTYKLWRYajRsbyAgICAgICAgICBETiAoU3JjNCoyKS5TMTYKLWRYajRoaSAgICAgICAgICBETiAoU3JjNCoyKzEpLlMxNgotZFhqNWxvICAgICAgICAgIEROIChTcmM1KjIpLlMxNgotZFhqNWhpICAgICAgICAgIEROIChTcmM1KjIrMSkuUzE2Ci1kWGo2bG8gICAgICAgICAgRE4gKFNyYzYqMikuUzE2Ci1kWGo2aGkgICAgICAgICAgRE4gKFNyYzYqMisxKS5TMTYKLWRYajdsbyAgICAgICAgICBETiAoU3JjNyoyKS5TMTYKLWRYajdoaSAgICAgICAgICBETiAoU3JjNyoyKzEpLlMxNgotZFhqdGxvICAgICAgICAgIEROIChUbXAqMikuUzE2Ci1kWGp0aGkgICAgICAgICAgRE4gKFRtcCoyKzEpLlMxNgotCi1xWGkwICAgICAgICAgICAgUU4gcVhqMAotcVhpMSAgICAgICAgICAgIFFOIHFYajQKLXFYaTIgICAgICAgICAgICBRTiBxWGoyCi1xWGkzICAgICAgICAgICAgUU4gcVhqNwotcVhpNCAgICAgICAgICAgIFFOIHFYajUKLXFYaTUgICAgICAgICAgICBRTiBxWGp0Ci1xWGk2ICAgICAgICAgICAgUU4gcVhqMQotcVhpNyAgICAgICAgICAgIFFOIHFYajYKLXFYaXQgICAgICAgICAgICBRTiBxWGozCi0KLWRYaTBsbyAgICAgICAgICBETiBkWGowbG8KLWRYaTBoaSAgICAgICAgICBETiBkWGowaGkKLWRYaTFsbyAgICAgICAgICBETiBkWGo0bG8KLWRYaTFoaSAgICAgICAgICBETiBkWGo0aGkKLWRYaTJsbyAgICAgICAgICBETiBkWGoybG8KLWRYaTJoaSAgICAgICAgICBETiBkWGoyaGkKLWRYaTNsbyAgICAgICAgICBETiBkWGo3bG8KLWRYaTNoaSAgICAgICAgICBETiBkWGo3aGkKLWRYaTRsbyAgICAgICAgICBETiBkWGo1bG8KLWRYaTRoaSAgICAgICAgICBETiBkWGo1aGkKLWRYaTVsbyAgICAgICAgICBETiBkWGp0bG8KLWRYaTVoaSAgICAgICAgICBETiBkWGp0aGkKLWRYaTZsbyAgICAgICAgICBETiBkWGoxbG8KLWRYaTZoaSAgICAgICAgICBETiBkWGoxaGkKLWRYaTdsbyAgICAgICAgICBETiBkWGo2bG8KLWRYaTdoaSAgICAgICAgICBETiBkWGo2aGkKLWRYaXRsbyAgICAgICAgICBETiBkWGozbG8KLWRYaXRoaSAgICAgICAgICBETiBkWGozaGkKLQotcVhoMCAgICAgICAgICAgIFFOIHFYaXQKLXFYaDEgICAgICAgICAgICBRTiBxWGkwCi1xWGgyICAgICAgICAgICAgUU4gcVhpMgotcVhoMyAgICAgICAgICAgIFFOIHFYaTMKLXFYaDQgICAgICAgICAgICBRTiBxWGk3Ci1xWGg1ICAgICAgICAgICAgUU4gcVhpNQotcVhoNiAgICAgICAgICAgIFFOIHFYaTQKLXFYaDcgICAgICAgICAgICBRTiBxWGkxCi1xWGh0ICAgICAgICAgICAgUU4gcVhpNgotCi1kWGgwbG8gICAgICAgICAgRE4gZFhpdGxvCi1kWGgwaGkgICAgICAgICAgRE4gZFhpdGhpCi1kWGgxbG8gICAgICAgICAgRE4gZFhpMGxvCi1kWGgxaGkgICAgICAgICAgRE4gZFhpMGhpCi1kWGgybG8gICAgICAgICAgRE4gZFhpMmxvCi1kWGgyaGkgICAgICAgICAgRE4gZFhpMmhpCi1kWGgzbG8gICAgICAgICAgRE4gZFhpM2xvCi1kWGgzaGkgICAgICAgICAgRE4gZFhpM2hpCi1kWGg0bG8gICAgICAgICAgRE4gZFhpN2xvCi1kWGg0aGkgICAgICAgICAgRE4gZFhpN2hpCi1kWGg1bG8gICAgICAgICAgRE4gZFhpNWxvCi1kWGg1aGkgICAgICAgICAgRE4gZFhpNWhpCi1kWGg2bG8gICAgICAgICAgRE4gZFhpNGxvCi1kWGg2aGkgICAgICAgICAgRE4gZFhpNGhpCi1kWGg3bG8gICAgICAgICAgRE4gZFhpMWxvCi1kWGg3aGkgICAgICAgICAgRE4gZFhpMWhpCi1kWGh0bG8gICAgICAgICAgRE4gZFhpNmxvCi1kWGh0aGkgICAgICAgICAgRE4gZFhpNmhpCi0KLXFYZzAgICAgICAgICAgICBRTiBxWGgyCi1xWGcxICAgICAgICAgICAgUU4gcVhodAotcVhnMiAgICAgICAgICAgIFFOIHFYaDEKLXFYZzMgICAgICAgICAgICBRTiBxWGgwCi1xWGc0ICAgICAgICAgICAgUU4gcVhoNAotcVhnNSAgICAgICAgICAgIFFOIHFYaDUKLXFYZzYgICAgICAgICAgICBRTiBxWGg2Ci1xWGc3ICAgICAgICAgICAgUU4gcVhoNwotcVhndCAgICAgICAgICAgIFFOIHFYaDMKLQotcVhmMCAgICAgICAgICAgIFFOIHFYZzYKLXFYZjEgICAgICAgICAgICBRTiBxWGc1Ci1xWGYyICAgICAgICAgICAgUU4gcVhnNAotcVhmMyAgICAgICAgICAgIFFOIHFYZ3QKLXFYZjQgICAgICAgICAgICBRTiBxWGczCi1xWGY1ICAgICAgICAgICAgUU4gcVhnMgotcVhmNiAgICAgICAgICAgIFFOIHFYZzEKLXFYZjcgICAgICAgICAgICBRTiBxWGcwCi1xWGZ0ICAgICAgICAgICAgUU4gcVhnNwotCi0KLXFYdDAgICAgICAgICAgICBRTiAxLlMzMgotcVh0MSAgICAgICAgICAgIFFOIDIuUzMyCi1xVDBsbyAgICAgICAgICAgUU4gMS5TMzIgICAgICAgICAKLXFUMGhpICAgICAgICAgICBRTiAyLlMzMiAgICAgICAgIAotcVQxbG8gICAgICAgICAgIFFOIDMuUzMyICAgICAgICAgCi1xVDFoaSAgICAgICAgICAgUU4gNC5TMzIgICAgICAgICAKLXFTY2FsZWxvICAgICAgICBRTiA1LlMzMiAgICAgICAgOy8vIHVzZWQgdG8gcmVhZCBwb3N0IHNjYWxlIHZhbHVlcwotcVNjYWxlaGkgICAgICAgIFFOIDYuUzMyCi1xVGVtcDAgICAgICAgICAgUU4gNS5TMzIgICAgICAgICAKLXFUZW1wMSAgICAgICAgICBRTiA2LlMzMiAgICAKLQotCi1TY2FsZTEgICAgICAgICAgRVFVIDYKLVNjYWxlMiAgICAgICAgICBFUVUgMTUKLXFTY2FsZTEgICAgICAgICBRTiBTY2FsZTEuUzE2ICAgICAKLXFTY2FsZTIgICAgICAgICBRTiBTY2FsZTIuUzE2ICAgICAKLWRTY2FsZTFsbyAgICAgICBETiAoU2NhbGUxKjIpLlMxNiAgICAgCi1kU2NhbGUxaGkgICAgICAgRE4gKFNjYWxlMSoyKzEpLlMxNgotZFNjYWxlMmxvICAgICAgIEROIChTY2FsZTIqMikuUzE2ICAgICAKLWRTY2FsZTJoaSAgICAgICBETiAoU2NhbGUyKjIrMSkuUzE2Ci0KLWRDb2VmcyAgICAgICAgICBETiAwLlMxNiAgICAgICAgOy8vIFNjYWxlIGNvZWZmaWNpZW50cyBpbiBmb3JtYXQge1swXSBbQ10gW1NdIFtJbnZTcXJ0Ml19Ci1JbnZTcXJ0MiAgICAgICAgRE4gZENvZWZzWzBdICAgIDsvLyAxL3NxcnQoMikgaW4gUTE1Ci1TICAgICAgICAgICAgICAgRE4gZENvZWZzWzFdICAgIDsvLyBTaW4oUEkvOCkgaW4gUTE1Ci1DICAgICAgICAgICAgICAgRE4gZENvZWZzWzJdICAgIDsvLyBDb3MoUEkvOCkgaW4gUTE1Ci0KLXBUZW1wICAgICAgICAgICBSTiAxMgotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIElNUE9SVCAgYXJtQ09NTV9JRENUQ29lZgotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgVkxEMSAgICAgICAge3FYajAscVhqMX0sIFtwU3JjIEA2NF0hCi0gICAgICAgIFZMRDEgICAgICAgIHtxWGoyLHFYajN9LCBbcFNyYyBANjRdIQotICAgICAgICBWTEQxICAgICAgICB7cVhqNCxxWGo1fSwgW3BTcmMgQDY0XSEKLSAgICAgICAgVkxEMSAgICAgICAge3FYajYscVhqN30sIFtwU3JjIEA2NF0hCi0gICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBQcmVTY2FsZSBhbmQgbXVsdGlwbHkgd2l0aCBTcmMKLSAgICAgICAgOy8vIElTdGFnZSA0Ci0gICAgICAgIAotICAgICAgICBJRiAiJGluc2NhbGUiPSJzMTYiICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAxNlgxNiBNdWwKLSAgICAgICAgICAgIE1fSURDVF9QUkVTQ0FMRTE2Ci0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICBJRiAiJGluc2NhbGUiPSJzMzIiICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAzMlgzMiAsdWwKLSAgICAgICAgICAgIE1fSURDVF9QUkVTQ0FMRTMyCi0gICAgICAgIEVORElGCi0KLSAgICAgICAgOy8vIElTdGFnZSAzCi0gICAgICAgIFZRUkRNVUxIICAgICBxWGkyLCBxWGkyLCBJbnZTcXJ0MiAgICAgICAgICAgIDsvLyBpMi9zcXJ0KDIpCi0gICAgICAgIFZIQUREICAgICAgIHFYaDAsIHFYaTAsIHFYaTEgICAgICAgICAgICAgICAgOy8vIChpMCtpMSkvMgotICAgICAgICBWSFNVQiAgICAgICBxWGgxLCBxWGkwLCBxWGkxICAgICAgICAgICAgICAgIDsvLyAoaTAtaTEpLzIKLSAgICAgICAgVkhBREQgICAgICAgcVhoNywgcVhpNSwgcVhpNyAgICAgICAgICAgICAgICA7Ly8gKGk1K2k3KS80Ci0gICAgICAgIFZTVUIgICAgICAgIHFYaDUsIHFYaTUsIHFYaTcgICAgICAgICAgICAgICAgOy8vIChpNS1pNykvMgotICAgICAgICBWUVJETVVMSCAgICAgcVhoNSwgcVhoNSwgSW52U3FydDIgICAgICAgICAgICA7Ly8gaDUvc3FydCgyKQotICAgICAgICBWU1VCICAgICAgICBxWGgyLCBxWGkyLCBxWGkzICAgICAgICAgICAgICAgIDsvLyBoMiwgaDMKLQotICAgICAgICBWTVVMTCAgICAgICBxWHQwLCBkWGk0bG8sIEMgICAgICAgICAgICAgICAgIDsvLyBjKmk0Ci0gICAgICAgIFZNTEFMICAgICAgIHFYdDAsIGRYaTZsbywgUyAgICAgICAgICAgICAgICAgOy8vIGMqaTQrcyppNgotICAgICAgICBWTVVMTCAgICAgICBxWHQxLCBkWGk0aGksIEMKLSAgICAgICAgVk1MQUwgICAgICAgcVh0MSwgZFhpNmhpLCBTCi0gICAgICAgIFZTSFJOICAgICAgIGRYaDRsbywgcVh0MCwgIzE2ICAgICAgICAgICAgICAgOy8vIGg0Ci0gICAgICAgIFZTSFJOICAgICAgIGRYaDRoaSwgcVh0MSwgIzE2Ci0gICAgICAgIAotICAgICAgICBWTVVMTCAgICAgICBxWHQwLCBkWGk2bG8sIEMgICAgICAgICAgICAgICAgIDsvLyBjKmk2Ci0gICAgICAgIFZNTFNMICAgICAgIHFYdDAsIGRYaTRsbywgUyAgICAgICAgICAgICAgICAgOy8vIC1zKmk0ICsgYypoNgotICAgICAgICBWTVVMTCAgICAgICBxWHQxLCBkWGk2aGksIEMKLSAgICAgICAgVk1MU0wgICAgICAgcVh0MSwgZFhpNGhpLCBTCi0gICAgICAgIFZTSFJOICAgICAgIGRYaDZsbywgcVh0MCwgIzE2ICAgICAgICAgICAgICAgOy8vIGg2Ci0gICAgICAgIFZTSFJOICAgICAgIGRYaDZoaSwgcVh0MSwgIzE2Ci0gICAgICAgIAotICAgICAgICA7Ly8gSVN0YWdlIDIKLSAgICAgICAgVlNVQiAgICAgICAgcVhnNiwgcVhoNiwgcVhoNwotICAgICAgICBWU1VCICAgICAgICBxWGc1LCBxWGg1LCBxWGc2Ci0gICAgICAgIFZTVUIgICAgICAgIHFYZzQsIHFYaDQsIHFYZzUKLSAgICAgICAgVkhBREQgICAgICAgcVhnMSwgcVhoMSwgcVhoMiAgICAgICAgOy8vIChoMStoMikvMgotICAgICAgICBWSFNVQiAgICAgICBxWGcyLCBxWGgxLCBxWGgyICAgICAgICA7Ly8gKGgxLWgyKS8yCi0gICAgICAgIFZIQUREICAgICAgIHFYZzAsIHFYaDAsIHFYaDMgICAgICAgIDsvLyAoaDAraDMpLzIKLSAgICAgICAgVkhTVUIgICAgICAgcVhnMywgcVhoMCwgcVhoMyAgICAgICAgOy8vIChoMC1oMykvMgotCi0gICAgICAgIDsvLyBJU3RhZ2UgMSBhbGwgcm93cwotICAgICAgICBWQUREICAgICAgICBxWGYzLCBxWGczLCBxWGc0ICAgICAgICAKLSAgICAgICAgVlNVQiAgICAgICAgcVhmNCwgcVhnMywgcVhnNCAgICAgICAgCi0gICAgICAgIFZBREQgICAgICAgIHFYZjIsIHFYZzIsIHFYZzUgICAgICAgIAotICAgICAgICBWU1VCICAgICAgICBxWGY1LCBxWGcyLCBxWGc1ICAgICAgICAKLSAgICAgICAgVkFERCAgICAgICAgcVhmMSwgcVhnMSwgcVhnNgotICAgICAgICBWU1VCICAgICAgICBxWGY2LCBxWGcxLCBxWGc2ICAgICAgICAKLSAgICAgICAgVkFERCAgICAgICAgcVhmMCwgcVhnMCwgcVhnNwotICAgICAgICBWU1VCICAgICAgICBxWGY3LCBxWGcwLCBxWGc3ICAgICAgCi0KLSAgICAgICAgOy8vIFRyYW5zcG9zZSwgc3RvcmUgYW5kIGxvb3AKLVhUUjAgICAgICAgICAgICBFUVUgU3JjNQotWFRSMSAgICAgICAgICAgIEVRVSBUbXAKLVhUUjIgICAgICAgICAgICBFUVUgU3JjNgotWFRSMyAgICAgICAgICAgIEVRVSBTcmM3Ci1YVFI0ICAgICAgICAgICAgRVFVIFNyYzMKLVhUUjUgICAgICAgICAgICBFUVUgU3JjMAotWFRSNiAgICAgICAgICAgIEVRVSBTcmMxCi1YVFI3ICAgICAgICAgICAgRVFVIFNyYzIKLVhUUnQgICAgICAgICAgICBFUVUgU3JjNAotICAgICAgICAgICAgICAgIAotcUEwICAgICAgICAgICAgIFFOICBYVFIwLlMzMiAgOy8vIGZvciBYVFJwb3NlCi1xQTEgICAgICAgICAgICAgUU4gIFhUUjEuUzMyCi1xQTIgICAgICAgICAgICAgUU4gIFhUUjIuUzMyCi1xQTMgICAgICAgICAgICAgUU4gIFhUUjMuUzMyCi1xQTQgICAgICAgICAgICAgUU4gIFhUUjQuUzMyCi1xQTUgICAgICAgICAgICAgUU4gIFhUUjUuUzMyCi1xQTYgICAgICAgICAgICAgUU4gIFhUUjYuUzMyCi1xQTcgICAgICAgICAgICAgUU4gIFhUUjcuUzMyCi0KLWRCMCAgICAgICAgICAgICBETiAgWFRSMCoyKzEgICAgICA7Ly8gZm9yIHVzaW5nIFZTV1AKLWRCMSAgICAgICAgICAgICBETiAgWFRSMSoyKzEKLWRCMiAgICAgICAgICAgICBETiAgWFRSMioyKzEKLWRCMyAgICAgICAgICAgICBETiAgWFRSMyoyKzEKLWRCNCAgICAgICAgICAgICBETiAgWFRSNCoyCi1kQjUgICAgICAgICAgICAgRE4gIFhUUjUqMgotZEI2ICAgICAgICAgICAgIEROICBYVFI2KjIKLWRCNyAgICAgICAgICAgICBETiAgWFRSNyoyCi0KLSAgICAgICAgICAKLSAgICAgICAgVlRSTiAgICAgICAgcVhmMCwgcVhmMQotICAgICAgICBWVFJOICAgICAgICBxWGYyLCBxWGYzCi0gICAgICAgIFZUUk4gICAgICAgIHFYZjQsIHFYZjUKLSAgICAgICAgVlRSTiAgICAgICAgcVhmNiwgcVhmNwotICAgICAgICBWVFJOICAgICAgICBxQTAsIHFBMgotICAgICAgICBWVFJOICAgICAgICBxQTEsIHFBMwotICAgICAgICBWVFJOICAgICAgICBxQTQsIHFBNgotICAgICAgICBWVFJOICAgICAgICBxQTUsIHFBNyAgICAgICAgCi0gICAgICAgIFZTV1AgICAgICAgIGRCMCwgZEI0Ci0gICAgICAgIFZTV1AgICAgICAgIGRCMSwgZEI1Ci0gICAgICAgIFZTV1AgICAgICAgIGRCMiwgZEI2Ci0gICAgICAgIFZTV1AgICAgICAgIGRCMywgZEI3Ci0gICAgICAgIAotCi1xWWowICAgICAgICAgICAgUU4gcVhmMAotcVlqMSAgICAgICAgICAgIFFOIHFYZjEKLXFZajIgICAgICAgICAgICBRTiBxWGYyCi1xWWozICAgICAgICAgICAgUU4gcVhmMwotcVlqNCAgICAgICAgICAgIFFOIHFYZjQKLXFZajUgICAgICAgICAgICBRTiBxWGY1Ci1xWWo2ICAgICAgICAgICAgUU4gcVhmNgotcVlqNyAgICAgICAgICAgIFFOIHFYZjcKLXFZanQgICAgICAgICAgICBRTiBxWGZ0Ci0KLWRZajBsbyAgICAgICAgICBETiAoWFRSMCoyKS5TMTYKLWRZajBoaSAgICAgICAgICBETiAoWFRSMCoyKzEpLlMxNgotZFlqMWxvICAgICAgICAgIEROIChYVFIxKjIpLlMxNgotZFlqMWhpICAgICAgICAgIEROIChYVFIxKjIrMSkuUzE2Ci1kWWoybG8gICAgICAgICAgRE4gKFhUUjIqMikuUzE2Ci1kWWoyaGkgICAgICAgICAgRE4gKFhUUjIqMisxKS5TMTYKLWRZajNsbyAgICAgICAgICBETiAoWFRSMyoyKS5TMTYKLWRZajNoaSAgICAgICAgICBETiAoWFRSMyoyKzEpLlMxNgotZFlqNGxvICAgICAgICAgIEROIChYVFI0KjIpLlMxNgotZFlqNGhpICAgICAgICAgIEROIChYVFI0KjIrMSkuUzE2Ci1kWWo1bG8gICAgICAgICAgRE4gKFhUUjUqMikuUzE2Ci1kWWo1aGkgICAgICAgICAgRE4gKFhUUjUqMisxKS5TMTYKLWRZajZsbyAgICAgICAgICBETiAoWFRSNioyKS5TMTYKLWRZajZoaSAgICAgICAgICBETiAoWFRSNioyKzEpLlMxNgotZFlqN2xvICAgICAgICAgIEROIChYVFI3KjIpLlMxNgotZFlqN2hpICAgICAgICAgIEROIChYVFI3KjIrMSkuUzE2Ci1kWWp0bG8gICAgICAgICAgRE4gKFhUUnQqMikuUzE2Ci1kWWp0aGkgICAgICAgICAgRE4gKFhUUnQqMisxKS5TMTYKLQotcVlpMCAgICAgICAgICAgIFFOIHFZajAKLXFZaTEgICAgICAgICAgICBRTiBxWWo0Ci1xWWkyICAgICAgICAgICAgUU4gcVlqMgotcVlpMyAgICAgICAgICAgIFFOIHFZajcKLXFZaTQgICAgICAgICAgICBRTiBxWWo1Ci1xWWk1ICAgICAgICAgICAgUU4gcVlqdAotcVlpNiAgICAgICAgICAgIFFOIHFZajEKLXFZaTcgICAgICAgICAgICBRTiBxWWo2Ci1xWWl0ICAgICAgICAgICAgUU4gcVlqMwotCi1kWWkwbG8gICAgICAgICAgRE4gZFlqMGxvCi1kWWkwaGkgICAgICAgICAgRE4gZFlqMGhpCi1kWWkxbG8gICAgICAgICAgRE4gZFlqNGxvCi1kWWkxaGkgICAgICAgICAgRE4gZFlqNGhpCi1kWWkybG8gICAgICAgICAgRE4gZFlqMmxvCi1kWWkyaGkgICAgICAgICAgRE4gZFlqMmhpCi1kWWkzbG8gICAgICAgICAgRE4gZFlqN2xvCi1kWWkzaGkgICAgICAgICAgRE4gZFlqN2hpCi1kWWk0bG8gICAgICAgICAgRE4gZFlqNWxvCi1kWWk0aGkgICAgICAgICAgRE4gZFlqNWhpCi1kWWk1bG8gICAgICAgICAgRE4gZFlqdGxvCi1kWWk1aGkgICAgICAgICAgRE4gZFlqdGhpCi1kWWk2bG8gICAgICAgICAgRE4gZFlqMWxvCi1kWWk2aGkgICAgICAgICAgRE4gZFlqMWhpCi1kWWk3bG8gICAgICAgICAgRE4gZFlqNmxvCi1kWWk3aGkgICAgICAgICAgRE4gZFlqNmhpCi1kWWl0bG8gICAgICAgICAgRE4gZFlqM2xvCi1kWWl0aGkgICAgICAgICAgRE4gZFlqM2hpCi0KLXFZaDAgICAgICAgICAgICBRTiBxWWl0Ci1xWWgxICAgICAgICAgICAgUU4gcVlpMAotcVloMiAgICAgICAgICAgIFFOIHFZaTIKLXFZaDMgICAgICAgICAgICBRTiBxWWkzCi1xWWg0ICAgICAgICAgICAgUU4gcVlpNwotcVloNSAgICAgICAgICAgIFFOIHFZaTUKLXFZaDYgICAgICAgICAgICBRTiBxWWk0Ci1xWWg3ICAgICAgICAgICAgUU4gcVlpMQotcVlodCAgICAgICAgICAgIFFOIHFZaTYKLQotZFloMGxvICAgICAgICAgIEROIGRZaXRsbwotZFloMGhpICAgICAgICAgIEROIGRZaXRoaQotZFloMWxvICAgICAgICAgIEROIGRZaTBsbwotZFloMWhpICAgICAgICAgIEROIGRZaTBoaQotZFloMmxvICAgICAgICAgIEROIGRZaTJsbwotZFloMmhpICAgICAgICAgIEROIGRZaTJoaQotZFloM2xvICAgICAgICAgIEROIGRZaTNsbwotZFloM2hpICAgICAgICAgIEROIGRZaTNoaQotZFloNGxvICAgICAgICAgIEROIGRZaTdsbwotZFloNGhpICAgICAgICAgIEROIGRZaTdoaQotZFloNWxvICAgICAgICAgIEROIGRZaTVsbwotZFloNWhpICAgICAgICAgIEROIGRZaTVoaQotZFloNmxvICAgICAgICAgIEROIGRZaTRsbwotZFloNmhpICAgICAgICAgIEROIGRZaTRoaQotZFloN2xvICAgICAgICAgIEROIGRZaTFsbwotZFloN2hpICAgICAgICAgIEROIGRZaTFoaQotZFlodGxvICAgICAgICAgIEROIGRZaTZsbwotZFlodGhpICAgICAgICAgIEROIGRZaTZoaQotCi1xWWcwICAgICAgICAgICAgUU4gcVloMgotcVlnMSAgICAgICAgICAgIFFOIHFZaHQKLXFZZzIgICAgICAgICAgICBRTiBxWWgxCi1xWWczICAgICAgICAgICAgUU4gcVloMAotcVlnNCAgICAgICAgICAgIFFOIHFZaDQKLXFZZzUgICAgICAgICAgICBRTiBxWWg1Ci1xWWc2ICAgICAgICAgICAgUU4gcVloNgotcVlnNyAgICAgICAgICAgIFFOIHFZaDcKLXFZZ3QgICAgICAgICAgICBRTiBxWWgzCi0KLXFZZjAgICAgICAgICAgICBRTiBxWWc2Ci1xWWYxICAgICAgICAgICAgUU4gcVlnNQotcVlmMiAgICAgICAgICAgIFFOIHFZZzQKLXFZZjMgICAgICAgICAgICBRTiBxWWd0Ci1xWWY0ICAgICAgICAgICAgUU4gcVlnMwotcVlmNSAgICAgICAgICAgIFFOIHFZZzIKLXFZZjYgICAgICAgICAgICBRTiBxWWcxCi1xWWY3ICAgICAgICAgICAgUU4gcVlnMAotcVlmdCAgICAgICAgICAgIFFOIHFZZzcKLQotICAgICAgICBWUlNIUiAgICAgICBxWWo3LCBxWWo3LCAjMgotICAgICAgICBWUlNIUiAgICAgICBxWWo2LCBxWWo2LCAjMQotICAgICAgICAKLSAgICAgICAgVkhBREQgICAgICAgcVlpNSwgcVlqMSwgcVlqNyAgICAgICAgOy8vIGk1ID0gKGoxK2o3KS8yCi0gICAgICAgIFZTVUIgICAgICAgIHFZaTYsIHFZajEsIHFZajcgICAgICAgIDsvLyBpNiA9IGoxLWo3Ci0gICAgICAgIFZIQUREICAgICAgIHFZaTMsIHFZajIsIHFZajYgICAgICAgIDsvLyBpMyA9IChqMitqNikvMgotICAgICAgICBWU1VCICAgICAgICBxWWkyLCBxWWoyLCBxWWo2ICAgICAgICA7Ly8gaTIgPSBqMi1qNgotICAgICAgICBWSEFERCAgICAgICBxWWk3LCBxWWo1LCBxWWozICAgICAgICA7Ly8gaTcgPSAoajUrajMpLzIKLSAgICAgICAgVlNVQiAgICAgICAgcVlpNCwgcVlqNSwgcVlqMyAgICAgICAgOy8vIGk0ID0gajUtajMKLQotICAgICAgICBWUVJETVVMSCAgICAgcVlpMiwgcVlpMiwgSW52U3FydDIgICAgOy8vIGkyL3NxcnQoMikKLSAgICAgICAgOy8vIElTdGFnZSA0LDMgcm93cyAwdG8xIHggMS8yCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICAgICBwVGVtcCwgIzB4NCAgICAgICAgICAgICA7Ly8gZW5zdXJlIGNvcnJlY3Qgcm91bmQKLSAgICAgICAgVkRVUCAgICAgICAgcVNjYWxlMSwgcFRlbXAgICAgICAgICAgIDsvLyBvZiBEQyByZXN1bHQKLSAgICAgICAgVkFERCAgICAgICAgcVlpMCwgcVlpMCwgcVNjYWxlMQotICAgICAgICAKLSAgICAgICAgVkhBREQgICAgICAgcVloMCwgcVlpMCwgcVlpMSAgICAgICAgOy8vIChpMCtpMSkvMgotICAgICAgICBWSFNVQiAgICAgICBxWWgxLCBxWWkwLCBxWWkxICAgICAgICA7Ly8gKGkwLWkxKS8yCi0KLSAgICAgICAgVkhBREQgICAgICAgcVloNywgcVlpNSwgcVlpNyAgICAgICAgOy8vIChpNStpNykvNAotICAgICAgICBWU1VCICAgICAgICBxWWg1LCBxWWk1LCBxWWk3ICAgICAgICA7Ly8gKGk1LWk3KS8yCi0gICAgICAgIFZTVUIgICAgICAgIHFZaDIsIHFZaTIsIHFZaTMgICAgICAgIDsvLyBoMiwgaDMKLSAgICAgICAgVlFSRE1VTEggICAgIHFZaDUsIHFZaDUsIEludlNxcnQyICAgIDsvLyBoNS9zcXJ0KDIpCi0KLSAgICAgICAgVk1VTEwgICAgICAgcVh0MCwgZFlpNGxvLCBDICAgICAgICAgOy8vIGMqaTQKLSAgICAgICAgVk1MQUwgICAgICAgcVh0MCwgZFlpNmxvLCBTICAgICAgICAgOy8vIGMqaTQrcyppNgotICAgICAgICBWTVVMTCAgICAgICBxWHQxLCBkWWk0aGksIEMKLSAgICAgICAgVk1MQUwgICAgICAgcVh0MSwgZFlpNmhpLCBTCi0gICAgICAgIFZTSFJOICAgICAgIGRZaDRsbywgcVh0MCwgIzE2ICAgICAgIDsvLyBoNAotICAgICAgICBWU0hSTiAgICAgICBkWWg0aGksIHFYdDEsICMxNgotICAgICAgICAKLSAgICAgICAgVk1VTEwgICAgICAgcVh0MCwgZFlpNmxvLCBDICAgICAgICAgOy8vIGMqaTYKLSAgICAgICAgVk1MU0wgICAgICAgcVh0MCwgZFlpNGxvLCBTICAgICAgICAgOy8vIC1zKmk0ICsgYypoNgotICAgICAgICBWTVVMTCAgICAgICBxWHQxLCBkWWk2aGksIEMKLSAgICAgICAgVk1MU0wgICAgICAgcVh0MSwgZFlpNGhpLCBTCi0gICAgICAgIFZTSFJOICAgICAgIGRZaDZsbywgcVh0MCwgIzE2ICAgICAgIDsvLyBoNgotICAgICAgICBWU0hSTiAgICAgICBkWWg2aGksIHFYdDEsICMxNgotICAgICAgICAKLSAgICAgICAgVlNVQiAgICAgICAgcVlnNiwgcVloNiwgcVloNwotICAgICAgICBWU1VCICAgICAgICBxWWc1LCBxWWg1LCBxWWc2Ci0gICAgICAgIFZTVUIgICAgICAgIHFZZzQsIHFZaDQsIHFZZzUKLSAgICAgICAgCi0gICAgICAgIDsvLyBJU3RhZ2UgMiByb3dzIDB0bzMgeCAxLzIKLSAgICAgICAgVkhBREQgICAgICAgcVlnMSwgcVloMSwgcVloMiAgICAgICAgOy8vIChoMStoMikvMgotICAgICAgICBWSFNVQiAgICAgICBxWWcyLCBxWWgxLCBxWWgyICAgICAgICA7Ly8gKGgxLWgyKS8yCi0gICAgICAgIFZIQUREICAgICAgIHFZZzAsIHFZaDAsIHFZaDMgICAgICAgIDsvLyAoaDAraDMpLzIKLSAgICAgICAgVkhTVUIgICAgICAgcVlnMywgcVloMCwgcVloMyAgICAgICAgOy8vIChoMC1oMykvMgotICAgICAgICAKLQotICAgICAgICA7Ly8gSVN0YWdlIDEgYWxsIHJvd3MKLSAgICAgICAgVkhBREQgICAgICAgIHFZZjMsIHFZZzMsIHFZZzQgICAgICAgIAotICAgICAgICBWSFNVQiAgICAgICAgcVlmNCwgcVlnMywgcVlnNCAgICAgICAgCi0gICAgICAgIFZIQUREICAgICAgICBxWWYyLCBxWWcyLCBxWWc1ICAgICAgICAKLSAgICAgICAgVkhTVUIgICAgICAgIHFZZjUsIHFZZzIsIHFZZzUgICAgICAgIAotICAgICAgICBWSEFERCAgICAgICAgcVlmMSwgcVlnMSwgcVlnNgotICAgICAgICBWSFNVQiAgICAgICAgcVlmNiwgcVlnMSwgcVlnNiAgICAgICAgCi0gICAgICAgIFZIQUREICAgICAgICBxWWYwLCBxWWcwLCBxWWc3Ci0gICAgICAgIFZIU1VCICAgICAgICBxWWY3LCBxWWcwLCBxWWc3ICAgICAgCi0KLVlUUjAgICAgICAgICAgICBFUVUgU3JjMAotWVRSMSAgICAgICAgICAgIEVRVSBTcmM0Ci1ZVFIyICAgICAgICAgICAgRVFVIFNyYzEKLVlUUjMgICAgICAgICAgICBFUVUgU3JjMgotWVRSNCAgICAgICAgICAgIEVRVSBTcmM3Ci1ZVFI1ICAgICAgICAgICAgRVFVIFNyYzUKLVlUUjYgICAgICAgICAgICBFUVUgVG1wCi1ZVFI3ICAgICAgICAgICAgRVFVIFNyYzYKLVlUUnQgICAgICAgICAgICBFUVUgU3JjMwotCi1xQzAgICAgICAgICAgICAgUU4gIFlUUjAuUzMyICAgICAgICAgICAgICAgIDsvLyBmb3IgWVRScG9zZQotcUMxICAgICAgICAgICAgIFFOICBZVFIxLlMzMgotcUMyICAgICAgICAgICAgIFFOICBZVFIyLlMzMgotcUMzICAgICAgICAgICAgIFFOICBZVFIzLlMzMgotcUM0ICAgICAgICAgICAgIFFOICBZVFI0LlMzMgotcUM1ICAgICAgICAgICAgIFFOICBZVFI1LlMzMgotcUM2ICAgICAgICAgICAgIFFOICBZVFI2LlMzMgotcUM3ICAgICAgICAgICAgIFFOICBZVFI3LlMzMgotCi1kRDAgICAgICAgICAgICAgRE4gIFlUUjAqMisxICAgICAgICAgICAgICAgIDsvLyBmb3IgdXNpbmcgVlNXUAotZEQxICAgICAgICAgICAgIEROICBZVFIxKjIrMQotZEQyICAgICAgICAgICAgIEROICBZVFIyKjIrMQotZEQzICAgICAgICAgICAgIEROICBZVFIzKjIrMQotZEQ0ICAgICAgICAgICAgIEROICBZVFI0KjIKLWRENSAgICAgICAgICAgICBETiAgWVRSNSoyCi1kRDYgICAgICAgICAgICAgRE4gIFlUUjYqMgotZEQ3ICAgICAgICAgICAgIEROICBZVFI3KjIKLSAgICAgICAgICAKLSAgICAgICAgVlRSTiAgICAgICAgcVlmMCwgcVlmMQotICAgICAgICBWVFJOICAgICAgICBxWWYyLCBxWWYzCi0gICAgICAgIFZUUk4gICAgICAgIHFZZjQsIHFZZjUKLSAgICAgICAgVlRSTiAgICAgICAgcVlmNiwgcVlmNwotICAgICAgICBWVFJOICAgICAgICBxQzAsIHFDMgotICAgICAgICBWVFJOICAgICAgICBxQzEsIHFDMwotICAgICAgICBWVFJOICAgICAgICBxQzQsIHFDNgotICAgICAgICBWVFJOICAgICAgICBxQzUsIHFDNyAgICAgICAgCi0gICAgICAgIFZTV1AgICAgICAgIGREMCwgZEQ0Ci0gICAgICAgIFZTV1AgICAgICAgIGREMSwgZEQ1Ci0gICAgICAgIFZTV1AgICAgICAgIGREMiwgZEQ2Ci0gICAgICAgIFZTV1AgICAgICAgIGREMywgZEQ3Ci0KLSAgICAgICAgCi1kWWYwVTggICAgICAgICAgRE4gWVRSMCoyLlU4Ci1kWWYxVTggICAgICAgICAgRE4gWVRSMSoyLlU4Ci1kWWYyVTggICAgICAgICAgRE4gWVRSMioyLlU4Ci1kWWYzVTggICAgICAgICAgRE4gWVRSMyoyLlU4Ci1kWWY0VTggICAgICAgICAgRE4gWVRSNCoyLlU4Ci1kWWY1VTggICAgICAgICAgRE4gWVRSNSoyLlU4Ci1kWWY2VTggICAgICAgICAgRE4gWVRSNioyLlU4Ci1kWWY3VTggICAgICAgICAgRE4gWVRSNyoyLlU4Ci0gICAgICAgIAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIERvIHNhdHVyYXRpb24gaWYgb3V0c2l6ZSBpcyBvdGhlciB0aGFuIFMxNgotICAgICAgICA7Ly8KLSAgICAgICAgCi0gICAgICAgIElGICgiJG91dHNpemUiPSJ1OCIpCi0gICAgICAgICAgICA7Ly8gT3V0cHV0IHJhbmdlIFswLTI1NV0KLSAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjBVOCwgcVlmMAotICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmMVU4LCBxWWYxCi0gICAgICAgICAgICBWUU1PVk4gICAgICAgICAgICBkWWYyVTgsIHFZZjIKLSAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjNVOCwgcVlmMwotICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmNFU4LCBxWWY0Ci0gICAgICAgICAgICBWUU1PVk4gICAgICAgICAgICBkWWY1VTgsIHFZZjUKLSAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjZVOCwgcVlmNgotICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmN1U4LCBxWWY3Ci0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICBJRiAoIiRvdXRzaXplIj0iczkiKQotICAgICAgICAgICAgOy8vIE91dHB1dCByYW5nZSBbLTI1NiB0byArMjU1XQotICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWYwLCBxWWYwLCAjMTYtOQotICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWYxLCBxWWYxLCAjMTYtOQotICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWYyLCBxWWYyLCAjMTYtOQotICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWYzLCBxWWYzLCAjMTYtOQotICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWY0LCBxWWY0LCAjMTYtOQotICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWY1LCBxWWY1LCAjMTYtOQotICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWY2LCBxWWY2LCAjMTYtOQotICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWY3LCBxWWY3LCAjMTYtOQotICAgICAgICAgICAgCi0gICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjAsIHFZZjAsICMxNi05Ci0gICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjEsIHFZZjEsICMxNi05Ci0gICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjIsIHFZZjIsICMxNi05Ci0gICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjMsIHFZZjMsICMxNi05Ci0gICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjQsIHFZZjQsICMxNi05Ci0gICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjUsIHFZZjUsICMxNi05Ci0gICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjYsIHFZZjYsICMxNi05Ci0gICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjcsIHFZZjcsICMxNi05Ci0gICAgICAgIEVORElGCi0KLSAgICAgICAgOy8vIFN0b3JlIG91dHB1dCBkZXBlbmRpbmcgb24gdGhlIFN0cmlkZSBzaXplCi0gICAgICAgIElGICIkc3RyaWRlIj0icyIKLSAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjAsIFtwRGVzdCBANjRdLCBTdHJpZGUKLSAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjEsIFtwRGVzdCBANjRdLCBTdHJpZGUKLSAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjIsIFtwRGVzdCBANjRdLCBTdHJpZGUKLSAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjMsIFtwRGVzdCBANjRdLCBTdHJpZGUKLSAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjQsIFtwRGVzdCBANjRdLCBTdHJpZGUKLSAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjUsIFtwRGVzdCBANjRdLCBTdHJpZGUKLSAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjYsIFtwRGVzdCBANjRdLCBTdHJpZGUKLSAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjcsIFtwRGVzdCBANjRdICAgICAgICAgICAgCi0gICAgICAgIEVMU0UKLSAgICAgICAgICAgIElGICgiJG91dHNpemUiPSJ1OCIpCi0gICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmMFU4LCBbcERlc3QgQDY0XSwgIzgKLSAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWYxVTgsIFtwRGVzdCBANjRdLCAjOAotICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIGRZZjJVOCwgW3BEZXN0IEA2NF0sICM4Ci0gICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmM1U4LCBbcERlc3QgQDY0XSwgIzgKLSAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWY0VTgsIFtwRGVzdCBANjRdLCAjOAotICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIGRZZjVVOCwgW3BEZXN0IEA2NF0sICM4Ci0gICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmNlU4LCBbcERlc3QgQDY0XSwgIzgKLSAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWY3VTgsIFtwRGVzdCBANjRdCi0gICAgICAgICAgICBFTFNFCi0gICAgICAgICAgICAgICAgOy8vICgiJG91dHNpemUiPSJzOSIpIG9yICgiJG91dHNpemUiPSJzMTYiKQotICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjAsIFtwRGVzdCBANjRdLCAjMTYKLSAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWYxLCBbcERlc3QgQDY0XSwgIzE2Ci0gICAgICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmMiwgW3BEZXN0IEA2NF0sICMxNgotICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjMsIFtwRGVzdCBANjRdLCAjMTYKLSAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWY0LCBbcERlc3QgQDY0XSwgIzE2Ci0gICAgICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmNSwgW3BEZXN0IEA2NF0sICMxNgotICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjYsIFtwRGVzdCBANjRdLCAjMTYKLSAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWY3LCBbcERlc3QgQDY0XQotICAgICAgICAgICAgRU5ESUYKLSAgICAgICAgCi0gICAgICAgIEVORElGCi0KLQotCi0gICAgICAgIEVORElGIDsvLyBDb3J0ZXhBOAotCi0KLQotICAgICAgICBNRU5EICAgICAgICAKLQotICAgICAgICA7Ly8gU2NhbGUgVFdPIGlucHV0IHJvd3Mgd2l0aCBUV08gcm93cyBvZiAxNiBiaXQgc2NhbGUgdmFsdWVzCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gVGhpcyBtYWNybyBpcyB1c2VkIGJ5IE1fSURDVF9QUkVTQ0FMRTE2IHRvIHByZS1zY2FsZSBvbmUgcm93Ci0gICAgICAgIDsvLyBpbnB1dCAoRWlnaHQgaW5wdXQgdmFsdWVzKSB3aXRoIG9uZSByb3cgb2Ygc2NhbGUgdmFsdWVzLiBBbHNvIAotICAgICAgICA7Ly8gTG9hZHMgbmV4dCBzY2FsZSB2YWx1ZXMgZnJvbSBwU2NhbGUsIGlmICRMYXN0Um93IGZsYWcgaXMgbm90IHNldC4KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJGRBbG8gICAgICAgICAgIC0gSW5wdXQgRCByZWdpc3RlciB3aXRoIGZpcnN0IGZvdXIgUzE2IHZhbHVlcyBvZiByb3cgbgotICAgICAgICA7Ly8gJGRBaGkgICAgICAgICAgIC0gSW5wdXQgRCByZWdpc3RlciB3aXRoIG5leHQgZm91ciBTMTYgdmFsdWVzIG9mIHJvdyBuCi0gICAgICAgIDsvLyAkZEJsbyAgICAgICAgICAgLSBJbnB1dCBEIHJlZ2lzdGVyIHdpdGggZmlyc3QgZm91ciBTMTYgdmFsdWVzIG9mIHJvdyBuKzEKLSAgICAgICAgOy8vICRkQmhpICAgICAgICAgICAtIElucHV0IEQgcmVnaXN0ZXIgd2l0aCBuZXh0IGZvdXIgUzE2IHZhbHVlcyBvZiByb3cgbisxCi0gICAgICAgIDsvLyBwU2NhbGUgICAgICAgICAgLSBQb2ludGVyIHRvIG5leHQgcm93IG9mIHNjYWxlIHZhbHVlcwotICAgICAgICA7Ly8gcVQwbG8gICAgICAgICAgIC0gVGVtcG9yYXJ5IHNjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vIHFUMGhpICAgICAgICAgICAtIFRlbXBvcmFyeSBzY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyBxVDFsbyAgICAgICAgICAgLSBUZW1wb3Jhcnkgc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gcVQxaGkgICAgICAgICAgIC0gVGVtcG9yYXJ5IHNjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vIGRTY2FsZTFsbyAgICAgICAtIFNjYWxlIHZhbHVlIG9mIHJvdyBuCi0gICAgICAgIDsvLyBkU2NhbGUxaGkgICAgICAgLSBTY2FsZSB2YWx1ZSBvZiByb3cgbgotICAgICAgICA7Ly8gZFNjYWxlMmxvICAgICAgIC0gU2NhbGUgdmFsdWUgb2Ygcm93IG4rMQotICAgICAgICA7Ly8gZFNjYWxlMmhpICAgICAgIC0gU2NhbGUgdmFsdWUgb2Ygcm93IG4rMQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IEZsYWcKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkTGFzdFJvdyAgICAgICAgLSBGbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgY3VycmVudCByb3cgaXMgbGFzdCByb3cKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRkQWxvICAgICAgICAgICAtIFNjYWxlZCBvdXRwdXQgdmFsdWVzIChmaXJzdCBmb3VyIFMxNiBvZiByb3cgbikKLSAgICAgICAgOy8vICRkQWhpICAgICAgICAgICAtIFNjYWxlZCBvdXRwdXQgdmFsdWVzIChuZXh0IGZvdXIgUzE2IG9mIHJvdyBuKQotICAgICAgICA7Ly8gJGRCbG8gICAgICAgICAgIC0gU2NhbGVkIG91dHB1dCB2YWx1ZXMgKGZpcnN0IGZvdXIgUzE2IG9mIHJvdyBuKzEpCi0gICAgICAgIDsvLyAkZEJoaSAgICAgICAgICAgLSBTY2FsZWQgb3V0cHV0IHZhbHVlcyAobmV4dCBmb3VyIFMxNiBvZiByb3cgbisxKQotICAgICAgICA7Ly8gcVNjYWxlMSAgICAgICAgIC0gU2NhbGUgdmFsdWVzIGZvciBuZXh0IHJvdwotICAgICAgICA7Ly8gcVNjYWxlMiAgICAgICAgIC0gU2NhbGUgdmFsdWVzIGZvciBuZXh0IHJvdysxCi0gICAgICAgIDsvLyBwU2NhbGUgICAgICAgICAgLSBQb2ludGVyIHRvIG5leHQgcm93IG9mIHNjYWxlIHZhbHVlcwotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9JRENUX1NDQUxFMTYgJGRBbG8sICRkQWhpLCAkZEJsbywgJGRCaGksICRMYXN0Um93Ci0gICAgICAgIFZNVUxMICAgICAgIHFUMGxvLCAkZEFsbywgZFNjYWxlMWxvCi0gICAgICAgIFZNVUxMICAgICAgIHFUMGhpLCAkZEFoaSwgZFNjYWxlMWhpCi0gICAgICAgIFZNVUxMICAgICAgIHFUMWxvLCAkZEJsbywgZFNjYWxlMmxvCi0gICAgICAgIFZNVUxMICAgICAgIHFUMWhpLCAkZEJoaSwgZFNjYWxlMmhpCi0gICAgICAgIElGICIkTGFzdFJvdyI9IjAiCi0gICAgICAgICAgICBWTEQxICAgICAgICBxU2NhbGUxLCBbcFNjYWxlXSwgIzE2ICA7Ly8gTG9hZCBzY2FsZSBmb3Igcm93IG4rMQotICAgICAgICAgICAgVkxEMSAgICAgICAgcVNjYWxlMiwgW3BTY2FsZV0sICMxNiAgOy8vIExvYWQgc2NhbGUgZm9yIHJvdyBuKzIKLSAgICAgICAgRU5ESUYKLSAgICAgICAgVlFSU0hSTiAgICAgICAkZEFsbywgcVQwbG8sICMxMiAgICAgICAgCi0gICAgICAgIFZRUlNIUk4gICAgICAgJGRBaGksIHFUMGhpLCAjMTIgICAgICAgIAotICAgICAgICBWUVJTSFJOICAgICAgICRkQmxvLCBxVDFsbywgIzEyICAgICAgICAKLSAgICAgICAgVlFSU0hSTiAgICAgICAkZEJoaSwgcVQxaGksICMxMiAgICAgICAgCi0gICAgICAgIE1FTkQKLQotICAgICAgICA7Ly8gU2NhbGUgOHg4IGJsb2NrIGlucHV0IHZhbHVlcyB3aXRoIDE2IGJpdCBzY2FsZSB2YWx1ZXMKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gcHJlLXNjYWxlIGJsb2NrIG9mIDh4OCBpbnB1dC4KLSAgICAgICAgOy8vIFRoaXMgYWxzbyBkbyB0aGUgSXN0IHN0YWdlIHRyYW5zZm9ybWF0aW9ucyBvZiBJRENULgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBkWGpubG8gICAgICAgICAgLSBuIHRoIGlucHV0IEQgcmVnaXN0ZXIgd2l0aCBmaXJzdCBmb3VyIFMxNiB2YWx1ZXMKLSAgICAgICAgOy8vIGRYam5oaSAgICAgICAgICAtIG4gdGggaW5wdXQgRCByZWdpc3RlciB3aXRoIG5leHQgZm91ciBTMTYgdmFsdWVzCi0gICAgICAgIDsvLyBxWGpuICAgICAgICAgICAgLSBuIHRoIGlucHV0IFEgcmVnaXN0ZXIgd2l0aCBlaWdodCBTMTYgdmFsdWVzCi0gICAgICAgIDsvLyBwU2NhbGUgICAgICAgICAgLSBQb2ludGVyIHRvIHNjYWxlIHZhbHVlcwotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gcVhpbiAgICAgICAgICAgIC0gbiB0aCBvdXRwdXQgUSByZWdpc3RlciB3aXRoIGVpZ2h0IFMxNiBvdXRwdXQgdmFsdWVzIG9mIDFzdCBzdGFnZQotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9JRENUX1BSRVNDQUxFMTYKLSAgICAgICAgVkxEMSAgICAgICAgcVNjYWxlMSwgW3BTY2FsZV0sICMxNiAgICAgIDsvLyBMb2FkIFByZSBzY2FsZSBmb3Igcm93IDAKLSAgICAgICAgVkxEMSAgICAgICAgcVNjYWxlMiwgW3BTY2FsZV0sICMxNiAgICAgIDsvLyBMb2FkIFByZSBzY2FsZSBmb3Igcm93IDAKLSAgICAgICAgTV9JRENUX1NDQUxFMTYgZFhqMGxvLCBkWGowaGksIGRYajFsbywgZFhqMWhpLCAwICAgICAgICA7Ly8gUHJlIHNjYWxlIHJvdyAwICYgMQotICAgICAgICBNX0lEQ1RfU0NBTEUxNiBkWGoybG8sIGRYajJoaSwgZFhqM2xvLCBkWGozaGksIDAgICAgICAgIAotICAgICAgICBNX0lEQ1RfU0NBTEUxNiBkWGo0bG8sIGRYajRoaSwgZFhqNWxvLCBkWGo1aGksIDAgICAgICAgIAotICAgICAgICBNX0lEQ1RfU0NBTEUxNiBkWGo2bG8sIGRYajZoaSwgZFhqN2xvLCBkWGo3aGksIDEgICAgICAgIAotICAgICAgICBWSEFERCAgICAgICBxWGk1LCBxWGoxLCBxWGo3ICAgICAgICAgICAgOy8vIChqMStqNykvMgotICAgICAgICBWU1VCICAgICAgICBxWGk2LCBxWGoxLCBxWGo3ICAgICAgICAgICAgOy8vIGoxLWo3Ci0gICAgICAgIExEUiAgICAgICAgIHBTcmMsID1hcm1DT01NX0lEQ1RDb2VmIDsvLyBBZGRyZXNzIG9mIERDVCBpbnZlcnNlIEFBTiBjb25zdGFudHMKLSAgICAgICAgVkhBREQgICAgICAgcVhpMywgcVhqMiwgcVhqNiAgICAgICAgICAgIDsvLyAoajIrajYpLzIKLSAgICAgICAgVlNVQiAgICAgICAgcVhpMiwgcVhqMiwgcVhqNiAgICAgICAgICAgIDsvLyBqMi1qNgotICAgICAgICBWTERSICAgICAgICBkQ29lZnMsIFtwU3JjXSAgICAgICAgICAgICAgOy8vIExvYWQgRENUIGludmVyc2UgQUFOIGNvbnN0YW50cwotICAgICAgICBWSEFERCAgICAgICBxWGk3LCBxWGo1LCBxWGozICAgICAgICAgICAgOy8vIChqNStqMykvMgotICAgICAgICBWU1VCICAgICAgICBxWGk0LCBxWGo1LCBxWGozICAgICAgICAgICAgOy8vIGo1LWozCi0gICAgICAgIE1FTkQgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIFNjYWxlIDh4OCBibG9jayBpbnB1dCB2YWx1ZXMgd2l0aCAzMiBiaXQgc2NhbGUgdmFsdWVzCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gVGhpcyBtYWNybyBpcyB1c2VkIHRvIHByZS1zY2FsZSBibG9jayBvZiA4eDggaW5wdXQuCi0gICAgICAgIDsvLyBUaGlzIGFsc28gZG8gdGhlIElzdCBzdGFnZSB0cmFuc2Zvcm1hdGlvbnMgb2YgSURDVC4KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gZFhqbmxvICAgICAgICAgIC0gbiB0aCBpbnB1dCBEIHJlZ2lzdGVyIHdpdGggZmlyc3QgZm91ciBTMTYgdmFsdWVzCi0gICAgICAgIDsvLyBkWGpuaGkgICAgICAgICAgLSBuIHRoIGlucHV0IEQgcmVnaXN0ZXIgd2l0aCBuZXh0IGZvdXIgUzE2IHZhbHVlcwotICAgICAgICA7Ly8gcVhqbiAgICAgICAgICAgIC0gbiB0aCBpbnB1dCBRIHJlZ2lzdGVyIHdpdGggZWlnaHQgUzE2IHZhbHVlcwotICAgICAgICA7Ly8gcFNjYWxlICAgICAgICAgIC0gUG9pbnRlciB0byAzMmJpdCBzY2FsZSB2YWx1ZXMgaW4gUTIzIGZvcm1hdAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gZFhpbmxvICAgICAgICAgIC0gbiB0aCBvdXRwdXQgRCByZWdpc3RlciB3aXRoIGZpcnN0IGZvdXIgUzE2IG91dHB1dCB2YWx1ZXMgb2YgMXN0IHN0YWdlCi0gICAgICAgIDsvLyBkWGluaGkgICAgICAgICAgLSBuIHRoIG91dHB1dCBEIHJlZ2lzdGVyIHdpdGggbmV4dCBmb3VyIFMxNiBvdXRwdXQgdmFsdWVzIG9mIDFzdCBzdGFnZQotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9JRENUX1BSRVNDQUxFMzIKLXFTY2FsZTBsbyAgICAgICBRTiAwLlMzMgotcVNjYWxlMGhpICAgICAgIFFOIDEuUzMyCi1xU2NhbGUxbG8gICAgICAgUU4gMi5TMzIKLXFTY2FsZTFoaSAgICAgICBRTiAzLlMzMgotcVNjYWxlMmxvICAgICAgIFFOIHFTY2FsZTFsbwotcVNjYWxlMmhpICAgICAgIFFOIHFTY2FsZTFoaQotcVNjYWxlM2xvICAgICAgIFFOIHFTY2FsZTFsbwotcVNjYWxlM2hpICAgICAgIFFOIHFTY2FsZTFoaQotcVNjYWxlNGxvICAgICAgIFFOIHFTY2FsZTFsbwotcVNjYWxlNGhpICAgICAgIFFOIHFTY2FsZTFoaQotcVNjYWxlNWxvICAgICAgIFFOIHFTY2FsZTBsbwotcVNjYWxlNWhpICAgICAgIFFOIHFTY2FsZTBoaQotcVNjYWxlNmxvICAgICAgIFFOIHFTY2FsZTBsbwotcVNjYWxlNmhpICAgICAgIFFOIHFTY2FsZTBoaQotcVNjYWxlN2xvICAgICAgIFFOIHFTY2FsZTBsbwotcVNjYWxlN2hpICAgICAgIFFOIHFTY2FsZTBoaQotCi1xU3JjMGxvICAgICAgICAgUU4gNC5TMzIKLXFTcmMwaGkgICAgICAgICBRTiA1LlMzMgotcVNyYzFsbyAgICAgICAgIFFOIDYuUzMyCi1xU3JjMWhpICAgICAgICAgUU4gU3JjNC5TMzIKLXFTcmMybG8gICAgICAgICBRTiBxU3JjMGxvCi1xU3JjMmhpICAgICAgICAgUU4gcVNyYzBoaQotcVNyYzNsbyAgICAgICAgIFFOIHFTcmMwbG8KLXFTcmMzaGkgICAgICAgICBRTiBxU3JjMGhpCi1xU3JjNGxvICAgICAgICAgUU4gcVNyYzBsbwotcVNyYzRoaSAgICAgICAgIFFOIHFTcmMwaGkKLXFTcmM1bG8gICAgICAgICBRTiBxU3JjMWxvCi1xU3JjNWhpICAgICAgICAgUU4gcVNyYzFoaQotcVNyYzZsbyAgICAgICAgIFFOIHFTcmMxbG8KLXFTcmM2aGkgICAgICAgICBRTiBxU3JjMWhpCi1xU3JjN2xvICAgICAgICAgUU4gcVNyYzBsbwotcVNyYzdoaSAgICAgICAgIFFOIHFTcmMwaGkKLQotcVJlczE3bG8gICAgICAgIFFOIHFTY2FsZTBsbwotcVJlczE3aGkgICAgICAgIFFOIHFTY2FsZTBoaQotcVJlczI2bG8gICAgICAgIFFOIHFTY2FsZTBsbwotcVJlczI2aGkgICAgICAgIFFOIHFTY2FsZTBoaQotcVJlczUzbG8gICAgICAgIFFOIHFTY2FsZTBsbwotcVJlczUzaGkgICAgICAgIFFOIHFTY2FsZTBoaQotCi0gICAgICAgICAgICBBREQgICAgICAgICBwVGVtcCwgcFNjYWxlLCAjNCo4KjcgICAgICAgICAgIDsvLyBBZGRyZXNzIG9mICBwU2NhbGVbN10KLSAgICAgICAgICAgIAotICAgICAgICAgICAgOy8vIFJvdyAwCi0gICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlMGxvLCBxU2NhbGUwaGl9LCBbcFNjYWxlXSEKLSAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmMwbG8sIGRYajBsbywgIygxMi0xKQotICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzBoaSwgZFhqMGhpLCAjKDEyLTEpICAgICAgICAgICAgCi0gICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlMWxvLCBxU2NhbGUxaGl9LCBbcFNjYWxlXSEKLSAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmMwbG8sIHFTY2FsZTBsbywgcVNyYzBsbwotICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzBoaSwgcVNjYWxlMGhpLCBxU3JjMGhpCi0gICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlN2xvLCBxU2NhbGU3aGl9LCBbcFRlbXBdIQotICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzFsbywgZFhqMWxvLCAjKDEyLTEpCi0gICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjMWhpLCBkWGoxaGksICMoMTItMSkgICAgICAgICAgICAKLSAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTBsbywgcVNyYzBsbyAgICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpMAotICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpMGhpLCBxU3JjMGhpCi0gICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjN2xvLCBkWGo3bG8sICMoMTItMSkKLSAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM3aGksIGRYajdoaSwgIygxMi0xKQotICAgICAgICAgICAgU1VCICAgICAgICAgcFRlbXAsIHBUZW1wLCAjKCgxNioyKSsoNCo4KjEpKQotICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzFsbywgcVNjYWxlMWxvLCBxU3JjMWxvCi0gICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjMWhpLCBxU2NhbGUxaGksIHFTcmMxaGkKLSAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM3bG8sIHFTY2FsZTdsbywgcVNyYzdsbwotICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzdoaSwgcVNjYWxlN2hpLCBxU3JjN2hpCi0gICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlMmxvLCBxU2NhbGUyaGl9LCBbcFNjYWxlXSEKLQotICAgICAgICAgICAgOy8vIFJvdyAxICYgNwotICAgICAgICAgICAgVkhBREQgICAgICAgcVJlczE3bG8sIHFTcmMxbG8sIHFTcmM3bG8gICAgICA7Ly8gKGoxK2o3KS8yCi0gICAgICAgICAgICBWSEFERCAgICAgICBxUmVzMTdoaSwgcVNyYzFoaSwgcVNyYzdoaSAgICAgIDsvLyAoajErajcpLzIKLSAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTVsbywgcVJlczE3bG8gICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpNQotICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpNWhpLCBxUmVzMTdoaSAgICAgICAgICAgICAgCi0gICAgICAgICAgICBWU1VCICAgICAgICBxUmVzMTdsbywgcVNyYzFsbywgcVNyYzdsbyAgICAgIDsvLyBqMS1qNwotICAgICAgICAgICAgVlNVQiAgICAgICAgcVJlczE3aGksIHFTcmMxaGksIHFTcmM3aGkgICAgICA7Ly8gajEtajcKLSAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTZsbywgcVJlczE3bG8gICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpNgotICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpNmhpLCBxUmVzMTdoaSAgICAgIAotICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzJsbywgZFhqMmxvLCAjKDEyLTEpCi0gICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjMmhpLCBkWGoyaGksICMoMTItMSkKLSAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGU2bG8sIHFTY2FsZTZoaX0sIFtwVGVtcF0hCi0gICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjNmxvLCBkWGo2bG8sICMoMTItMSkKLSAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM2aGksIGRYajZoaSwgIygxMi0xKQotICAgICAgICAgICAgU1VCICAgICAgICAgcFRlbXAsIHBUZW1wLCAjKCgxNioyKSsoNCo4KjEpKQotICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzJsbywgcVNjYWxlMmxvLCBxU3JjMmxvCi0gICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjMmhpLCBxU2NhbGUyaGksIHFTcmMyaGkKLSAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM2bG8sIHFTY2FsZTZsbywgcVNyYzZsbwotICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzZoaSwgcVNjYWxlNmhpLCBxU3JjNmhpCi0gICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlM2xvLCBxU2NhbGUzaGl9LCBbcFNjYWxlXSEKLQotICAgICAgICAgICAgOy8vIFJvdyAyICYgNgotICAgICAgICAgICAgVkhBREQgICAgICAgcVJlczI2bG8sIHFTcmMybG8sIHFTcmM2bG8gICAgICA7Ly8gKGoyK2o2KS8yCi0gICAgICAgICAgICBWSEFERCAgICAgICBxUmVzMjZoaSwgcVNyYzJoaSwgcVNyYzZoaSAgICAgIDsvLyAoajIrajYpLzIKLSAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTNsbywgcVJlczI2bG8gICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpMwotICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpM2hpLCBxUmVzMjZoaSAgICAgICAgICAgICAgCi0gICAgICAgICAgICBWU1VCICAgICAgICBxUmVzMjZsbywgcVNyYzJsbywgcVNyYzZsbyAgICAgIDsvLyBqMi1qNgotICAgICAgICAgICAgVlNVQiAgICAgICAgcVJlczI2aGksIHFTcmMyaGksIHFTcmM2aGkgICAgICA7Ly8gajItajYKLSAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTJsbywgcVJlczI2bG8gICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpMgotICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpMmhpLCBxUmVzMjZoaSAgICAgIAotICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzNsbywgZFhqM2xvLCAjKDEyLTEpCi0gICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjM2hpLCBkWGozaGksICMoMTItMSkKLSAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGU1bG8sIHFTY2FsZTVoaX0sIFtwVGVtcF0hCi0gICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjNWxvLCBkWGo1bG8sICMoMTItMSkKLSAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM1aGksIGRYajVoaSwgIygxMi0xKQotICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzNsbywgcVNjYWxlM2xvLCBxU3JjM2xvCi0gICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjM2hpLCBxU2NhbGUzaGksIHFTcmMzaGkKLSAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM1bG8sIHFTY2FsZTVsbywgcVNyYzVsbwotICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzVoaSwgcVNjYWxlNWhpLCBxU3JjNWhpCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIDsvLyBSb3cgMyAmIDUKLSAgICAgICAgICAgIFZIQUREICAgICAgIHFSZXM1M2xvLCBxU3JjNWxvLCBxU3JjM2xvICAgICAgOy8vIChqNStqMykvMgotICAgICAgICAgICAgVkhBREQgICAgICAgcVJlczUzaGksIHFTcmM1aGksIHFTcmMzaGkgICAgICA7Ly8gKGo1K2ozKS8yCi0gICAgICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCAjMTYqMioyCi0gICAgICAgICAgICBWTU9WTiAgICAgICBkWGk3bG8sIHFSZXM1M2xvICAgICAgICAgICAgICAgIDsvLyBPdXRwdXQgaTcKLSAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTdoaSwgcVJlczUzaGkgICAgICAgICAgICAgIAotICAgICAgICAgICAgVlNVQiAgICAgICAgcVJlczUzbG8sIHFTcmM1bG8sIHFTcmMzbG8gICAgICA7Ly8gajUtajMKLSAgICAgICAgICAgIFZTVUIgICAgICAgIHFSZXM1M2hpLCBxU3JjNWhpLCBxU3JjM2hpICAgICAgOy8vIGo1LWozCi0gICAgICAgICAgICBWTEQxICAgICAgICBxWGo0LCBbcFNyYyBANjRdCi0gICAgICAgICAgICBWTU9WTiAgICAgICBkWGk0bG8sIHFSZXM1M2xvICAgICAgICAgICAgICAgIDsvLyBPdXRwdXQgaTQKLSAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTRoaSwgcVJlczUzaGkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM0bG8sIGRYajRsbywgIygxMi0xKQotICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzRoaSwgZFhqNGhpLCAjKDEyLTEpCi0gICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlNGxvLCBxU2NhbGU0aGl9LCBbcFNjYWxlXSAgICAgICAgICAgIAotICAgICAgICAgICAgTERSICAgICAgICAgcFNyYywgPWFybUNPTU1fSURDVENvZWYgICAgIDsvLyBBZGRyZXNzIG9mIERDVCBpbnZlcnNlIEFBTiBjb25zdGFudHMKLSAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM0bG8sIHFTY2FsZTRsbywgcVNyYzRsbwotICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzRoaSwgcVNjYWxlNGhpLCBxU3JjNGhpCi0gICAgICAgICAgICBWTERSICAgICAgICBkQ29lZnMsIFtwU3JjXSAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIERDVCBpbnZlcnNlIEFBTiBjb25zdGFudHMKLSAgICAgICAgICAgIDsvLyBSb3cgNAotICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpMWxvLCBxU3JjNGxvICAgICAgICAgICAgICAgICA7Ly8gT3V0cHV0IGkxCi0gICAgICAgICAgICBWTU9WTiAgICAgICBkWGkxaGksIHFTcmM0aGkgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgTUVORAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX01hc2tUYWJsZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX01hc2tUYWJsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjQ2ZjE1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9NYXNrVGFibGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1DT01NX01hc2tUYWJsZS5oCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogTWFzayBUYWJsZSB0byBtYXNrIHRoZSBlbmQgb2YgYXJyYXkKLSAqLwotIAotCi0KLSNpZm5kZWYgX0FSTUNPTU1fTUFTS1RBQkxFX0hfCi0jZGVmaW5lIF9BUk1DT01NX01BU0tUQUJMRV9IXwotCi0jZGVmaW5lIE1hc2tUYWJsZVNpemUgNzIKLSAgCi0vKiBNYXNrIHRhYmxlICovCi0KLWV4dGVybiBjb25zdCBPTVhfVTE2IGFybUNPTU1fcU1hc2tUYWJsZTE2W01hc2tUYWJsZVNpemVdOwotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1DT01NX3FNYXNrVGFibGU4W01hc2tUYWJsZVNpemVdOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9WZXJzaW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fVmVyc2lvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2U1YjJiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9WZXJzaW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKiBHdWFyZCB0aGUgaGVhZGVyIGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9uLiAqLwotI2lmbmRlZiBfX0FSTV9DT01NX1ZFUlNJT05fSF9fCi0jZGVmaW5lIF9fQVJNX0NPTU1fVkVSU0lPTl9IX18KLQotCi0vKiBUaGUgZm9sbG93aW5nIGxpbmUgc2hvdWxkIGJlIGluIG9teHR5cGVzLmggYnV0IGhhc24ndCBiZWVuIGFwcHJvdmVkIGJ5IE9wZW5NQVggeWV0ICovCi0jZGVmaW5lIE9NWF9WRVJTSU9OIDEwMgotCi0vKiBXZSBuZWVkIHRvIGRlZmluZSB0aGVzZSBtYWNyb3MgaW4gb3JkZXIgdG8gY29udmVydCBhICNkZWZpbmUgbnVtYmVyIGludG8gYSAjZGVmaW5lIHN0cmluZy4gKi8KLSNkZWZpbmUgQVJNX1FVT1RFKGEpICNhCi0jZGVmaW5lIEFSTV9JTkRJUkVDVChBKSBBUk1fUVVPVEUoQSkKLQotLyogQ29udmVydCB0aGUgT01YX1ZFUlNJT04gbnVtYmVyIGludG8gYSBzdHJpbmcgdGhhdCBjYW4gYmUgdXNlZCwgZm9yIGV4YW1wbGUsIHRvIHByaW50IGl0IG91dC4gKi8KLSNkZWZpbmUgQVJNX1ZFUlNJT05fU1RSSU5HIEFSTV9JTkRJUkVDVChPTVhfVkVSU0lPTikKLQotCi0vKiBEZWZpbmUgdGhpcyBpbiBvcmRlciB0byB0dXJuIG9uIEFSTSB2ZXJzaW9uL3JlbGVhc2UvYnVpbGQgc3RyaW5ncyBpbiBlYWNoIGRvbWFpbiAqLwotI2RlZmluZSBBUk1fSU5DTFVERV9WRVJTSU9OX0RFU0NSSVBUSU9OUwotCi0jaWZkZWYgQVJNX0lOQ0xVREVfVkVSU0lPTl9ERVNDUklQVElPTlMKLSAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBvbXhBQ19WZXJzaW9uRGVzY3JpcHRpb247Ci0gIGV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgb214SUNfVmVyc2lvbkRlc2NyaXB0aW9uOwotICBleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IG9teElQX1ZlcnNpb25EZXNjcmlwdGlvbjsKLSAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBvbXhTUF9WZXJzaW9uRGVzY3JpcHRpb247Ci0gIGV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgb214VkNfVmVyc2lvbkRlc2NyaXB0aW9uOwotI2VuZGlmIC8qIEFSTV9JTkNMVURFX1ZFUlNJT05fREVTQ1JJUFRJT05TICovCi0KLQotLyogVGhlIGZvbGxvd2luZyBlbnRyaWVzIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgYnkgdGhlIHJlbGVhc2Ugc2NyaXB0ICovCi0vKiBUaGV5IGFyZSB1c2VkIGluIHRoZSBBUk0gdmVyc2lvbiBzdHJpbmdzIGRlZmluZWQgZm9yIGVhY2ggZG9tYWluLiAgICAgICAgICAgICAqLwotCi0vKiBUaGUgcmVsZWFzZSB0YWcgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVsZWFzZSBvZiB0aGUgbGlicmFyeS4gLSB1c2VkIGZvciBzb3VyY2UgYW5kIG9iamVjdCByZWxlYXNlcyAqLwotI2RlZmluZSBPTVhfQVJNX1JFTEVBU0VfVEFHICAicjBwMC0wMGJldDEiCi0KLS8qIFRoZSBBUk0gYXJjaGl0ZWN0dXJlIHVzZWQgdG8gYnVpbGQgYW55IG9iamVjdHMgb3IgZXhlY3V0YWJsZXMgaW4gdGhpcyByZWxlYXNlLiAqLwotI2RlZmluZSBPTVhfQVJNX0JVSUxEX0FSQ0hJVEVDVFVSRSAiQVJNIEFyY2hpdGVjdHVyZSBWNiIKLQotLyogVGhlIEFSTSBUb29sY2hhaW4gdXNlZCB0byBidWlsZCBhbnkgb2JqZWN0cyBvciBleGVjdXRhYmxlcyBpbiB0aGlzIHJlbGVhc2UuICovCi0jZGVmaW5lIE9NWF9BUk1fQlVJTERfVE9PTENIQUlOICAgICJBUk0gUlZDVCAzLjEiCi0KLQotI2VuZGlmIC8qIF9fQVJNX0NPTU1fVkVSU0lPTl9IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX3MuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NzM1YTkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNjggKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybUNPTU1fcy5oCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgOTY0MQotOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLTsvLyBBUk0gb3B0aW1pemVkIE9wZW5NQVggY29tbW9uIGhlYWRlciBmaWxlCi07Ly8KLQotOy8vIFByb3RlY3QgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb24KLSBJRiA6TE5PVDo6REVGOkFSTUNPTU1fU19ICi0gR0JMTCBBUk1DT01NX1NfSAotCi0gICAgICAgIFJFUVVJUkU4ICAgICAgICAgICAgOy8vIFJlcXVpcmVzIDgtYnl0ZSBzdGFjayBhbGlnbm1lbnQKLSAgICAgICAgUFJFU0VSVkU4ICAgICAgICAgICA7Ly8gUHJlc2VydmVzIDgtYnl0ZSBzdGFjayBhbGlnbm1lbnQKLSAgICAgICAgCi0gICAgICAgIEdCTEwgICAgQVJNX0VSUk9SQ0hFQ0sKLUFSTV9FUlJPUkNIRUNLICBTRVRMIHtGQUxTRX0KLQotOy8vIEdsb2JhbHMKLQotICAgICAgICBHQkxTICAgIF9SUmVnTGlzdCAgIDsvLyBSIHNhdmVkIHJlZ2lzdGVyIGxpc3QKLSAgICAgICAgR0JMUyAgICBfRFJlZ0xpc3QgICA7Ly8gRCBzYXZlZCByZWdpc3RlciBsaXN0Ci0gICAgICAgIEdCTFMgICAgX1ZhcmlhbnQgICAgOy8vIFNlbGVjdGVkIHByb2Nlc3NvciB2YXJpYW50Ci0gICAgICAgIEdCTFMgICAgX0NQVSAgICAgICAgOy8vIENQVSBuYW1lCi0gICAgICAgIEdCTFMgICAgX1N0cnVjdCAgICAgOy8vIFN0cnVjdHVyZSBuYW1lCi0gICAgICAgIAotICAgICAgICBHQkxMICAgIF9JbkZ1bmMgICAgIDsvLyBJbnNpZGUgZnVuY3Rpb24gYXNzZW1ibHkgZmxhZwotICAgICAgICBHQkxMICAgIF9Td0xvbmcgICAgIDsvLyBMb25nIHN3aXRjaCBmbGFnCi0gICAgICAgIAotICAgICAgICBHQkxBICAgIF9SQnl0ZXMgICAgIDsvLyBOdW1iZXIgb2YgcmVnaXN0ZXIgYnl0ZXMgb24gc3RhY2sKLSAgICAgICAgR0JMQSAgICBfU0J5dGVzICAgICA7Ly8gTnVtYmVyIG9mIHNjcmF0Y2ggYnl0ZXMgb24gc3RhY2sgCi0gICAgICAgIEdCTEEgICAgX0FCeXRlcyAgICAgOy8vIFN0YWNrIG9mZnNldCBvZiBuZXh0IGFyZ3VtZW50Ci0gICAgICAgIEdCTEEgICAgX1dvcmtzcGFjZSAgOy8vIFN0YWNrIG9mZnNldCBvZiBzY3JhdGNoIHdvcmtzcGFjZQotICAgICAgICBHQkxBICAgIF9GICAgICAgICAgIDsvLyBGdW5jdGlvbiBudW1iZXIKLSAgICAgICAgR0JMQSAgICBfU3RPZmYgICAgICA7Ly8gU3RydWN0IG9mZnNldAotICAgICAgICBHQkxBICAgIF9Td051bSAgICAgIDsvLyBTd2l0Y2ggbnVtYmVyCi0gICAgICAgIEdCTFMgICAgXzMyICAgICAgICAgOy8vIFN1ZmZpeCBmb3IgMzIgYnl0ZSBhbGlnbm1uZXQKLSAgICAgICAgR0JMUyAgICBfMTYgICAgICAgICA7Ly8gU3VmZml4IGZvciAxNiBieXRlIGFsaWdubW5ldAotICAgICAgICAKLV9JbkZ1bmMgICAgICAgICBTRVRMICAgIHtGQUxTRX0KLV9TQnl0ZXMgICAgICAgICBTRVRBICAgIDAKLV9GICAgICAgICAgICAgICBTRVRBICAgIDAKLV9Td051bSAgICAgICAgICBTRVRBICAgIDAKLV8zMiAgICAgICAgICAgICBTRVRTICAgICJBTElHTjMyIgotXzE2ICAgICAgICAgICAgIFNFVFMgICAgIkFMSUdOMTYiCi0KLTsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLTsvLyBPdmVycmlkZSB0aGUgdG9vbHMgc2V0dGluZ3Mgb2YgdGhlIENQVSBpZiB0aGUgI2RlZmluZQotOy8vIFVTRUNQVSBpcyBzZXQsIG90aGVyd2lzZSB1c2UgdGhlIENQVSBkZWZpbmVkIGJ5IHRoZQotOy8vIGFzc2VtYmxlciBzZXR0aW5ncy4KLTsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgICAgIElGIDpERUY6IE9WRVJSSURFQ1BVCi1fQ1BVICAgICAgIFNFVFMgIE9WRVJSSURFQ1BVCi0gICAgICAgRUxTRQotX0NQVSAgICAgICBTRVRTICAgIHtDUFV9ICAgICAgIAotICAgICAgIEVORElGCi0KLQotCi07Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi07Ly8gV29yayBvdXQgd2hpY2ggY29kZSB0byBidWlsZAotOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgICAgIElGIDpERUY6QVJNMTEzNkpTOkxPUjo6REVGOkNvcnRleEE4OkxPUjo6REVGOkFSTV9HRU5FUklDCi0gICAgICAgICAgICBJTkZPIDEsIlBsZWFzZSBzd2l0Y2ggdG8gdXNpbmcgTV9WQVJJQU5UUyIKLSAgICAgICAgRU5ESUYKLQotICAgICAgICA7Ly8gRGVmaW5lIGFuZCByZXNldCBhbGwgb2ZmaWNpYWxseSByZWNvbmduaXNlZCB2YXJpYW50cwotICAgICAgICBNQUNSTwotICAgICAgICBfTV9ERUZfVkFSSUFOVFMKLSAgICAgICAgX01fREVGX1ZBUklBTlQgQVJNOTI2RUpTCi0gICAgICAgIF9NX0RFRl9WQVJJQU5UIEFSTTExMzZKUwotICAgICAgICBfTV9ERUZfVkFSSUFOVCBBUk0xMTM2SlNfVQotICAgICAgICBfTV9ERUZfVkFSSUFOVCBDb3J0ZXhBOAotICAgICAgICBfTV9ERUZfVkFSSUFOVCBBUk03VERNSQotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBfTV9ERUZfVkFSSUFOVCAkdmFyCi0gICAgICAgIEdCTEwgJHZhcgotICAgICAgICBHQkxMIF9vayR2YXIKLSR2YXIgICAgU0VUTCB7RkFMU0V9Ci0gICAgICAgIE1FTkQgICAgICAgIAotICAgICAgICAKLQotICAgICAgICA7Ly8gVmFyaWFudCBkZWNsYXJhdGlvbgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIERlZmluZSBhIGxpc3Qgb2YgY29kZSB2YXJpYW50cyBzdXBwb3J0ZWQgYnkgdGhpcwotICAgICAgICA7Ly8gc291cmNlIGZpbGUuIFRoaXMgbWFjcm8gdGhlbiBjaG9vc2VzIHRoZSBtb3N0Ci0gICAgICAgIDsvLyBhcHByb3ByaWF0ZSB2YXJpYW50IHRvIGJ1aWxkIGZvciB0aGUgY3VycmVudGx5IGNvbmZpZ3VyZWQKLSAgICAgICAgOy8vIGNvcmUuCi0gICAgICAgIDsvLyAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fVkFSSUFOVFMgJHYwLCR2MSwkdjIsJHYzLCR2NCwkdjUsJHY2LCR2NyAgICAgICAgCi0gICAgICAgIDsvLyBTZXQgdG8gVFJVRSB2YXJpYW50cyB0aGF0IGFyZSBzdXBwb3J0ZWQKLSAgICAgICAgX01fREVGX1ZBUklBTlRTCi0gICAgICAgIF9NX1ZBUklBTlQgJHYwCi0gICAgICAgIF9NX1ZBUklBTlQgJHYxCi0gICAgICAgIF9NX1ZBUklBTlQgJHYyCi0gICAgICAgIF9NX1ZBUklBTlQgJHYzCi0gICAgICAgIF9NX1ZBUklBTlQgJHY0Ci0gICAgICAgIF9NX1ZBUklBTlQgJHY1Ci0gICAgICAgIF9NX1ZBUklBTlQgJHY2Ci0gICAgICAgIF9NX1ZBUklBTlQgJHY3Ci0gICAgICAgIAotICAgICAgICA7Ly8gTG9vayBmb3IgZmlyc3QgYXZhaWxhYmxlIHZhcmlhbnQgdG8gbWF0Y2ggYSBDUFUKLSAgICAgICAgOy8vIF9NX1RSWSBjcHUsIHZhcmlhbnQgZmFsbCBiYWNrIGxpc3QKLV9WYXJpYW50IFNFVFMgIiIgICAgICAgICAgICAgICAgCi0gICAgICAgIF9NX1RSWSBBUk05MjZFSi1TLCAgIEFSTTkyNkVKUwotICAgICAgICBfTV9UUlkgQVJNMTE3NkpaLVMsICBBUk0xMTM2SlMKLSAgICAgICAgX01fVFJZIEFSTTExNzZKWkYtUywgQVJNMTEzNkpTCi0gICAgICAgIF9NX1RSWSBBUk0xMTU2VDItUywgIEFSTTExMzZKUwotICAgICAgICBfTV9UUlkgQVJNMTE1NlQyRi1TLCBBUk0xMTM2SlMKLSAgICAgICAgX01fVFJZIEFSTTExMzZKLVMsICAgQVJNMTEzNkpTCi0gICAgICAgIF9NX1RSWSBBUk0xMTM2SkYtUywgIEFSTTExMzZKUwotICAgICAgICBfTV9UUlkgTVBDb3JlLCAgICAgICBBUk0xMTM2SlMKLSAgICAgICAgX01fVFJZIENvcnRleC1BOCwgICAgQ29ydGV4QTgsIEFSTTExMzZKUwotICAgICAgICBfTV9UUlkgQ29ydGV4LVI0LCAgICBBUk0xMTM2SlMKLSAgICAgICAgX01fVFJZIEFSTTdURE1JCi0gICAgICAgIAotICAgICAgICA7Ly8gU2VsZWN0IHRoZSBjb3JyZWN0IHZhcmlhbnQKLSAgICAgICAgX01fREVGX1ZBUklBTlRTCi0gICAgICAgIElGIF9WYXJpYW50PSIiCi0gICAgICAgICAgICBJTkZPIDEsICJObyBtYXRjaCBmb3VuZCBmb3IgQ1BVICckX0NQVSciCi0gICAgICAgIEVMU0UKLSRfVmFyaWFudCAgIFNFVEwge1RSVUV9Ci0gICAgICAgIEVORElGCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBSZWdpc3RlciBhIHZhcmlhbnQgYXMgYXZhaWxhYmxlCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIF9NX1ZBUklBTlQgJHZhcgotICAgICAgICBJRiAiJHZhciI9IiIKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIElGIDpMTk9UOjpERUY6X29rJHZhcgotICAgICAgICAgICAgSU5GTyAxLCAiVW5yZWNvZ25pemVkIHZhcmlhbnQgJyR2YXInIgotICAgICAgICBFTkRJRgotJHZhciAgICBTRVRMIHtUUlVFfQotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gRm9yIGEgZ2l2ZW4gQ1BVLCBzZWUgaWYgYW55IG9mIHRoZSB2YXJpYW50cyBzdXBwb3J0aW5nCi0gICAgICAgIDsvLyB0aGlzIENQVSBhcmUgYXZhaWxhYmxlLiBUaGUgZmlyc3QgYXZhaWxhYmxlIHZhcmlhbnQgaXMKLSAgICAgICAgOy8vIGNob3NlbgotICAgICAgICBNQUNSTwotICAgICAgICBfTV9UUlkgJGNwdSwgJHYwLCR2MSwkdjIsJHYzLCR2NCwkdjUsJHY2LCR2NwotICAgICAgICBJRiAiJGNwdSI8Pl9DUFUKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIF9NX1RSWTEgJHYwCi0gICAgICAgIF9NX1RSWTEgJHYxCi0gICAgICAgIF9NX1RSWTEgJHYyCi0gICAgICAgIF9NX1RSWTEgJHYzCi0gICAgICAgIF9NX1RSWTEgJHY0Ci0gICAgICAgIF9NX1RSWTEgJHY1Ci0gICAgICAgIF9NX1RSWTEgJHY2Ci0gICAgICAgIF9NX1RSWTEgJHY3Ci0gICAgICAgIDsvLyBDaGVjayBhIG1hdGNoIHdhcyBmb3VuZAotICAgICAgICBJRiBfVmFyaWFudD0iIgotICAgICAgICAgICAgSU5GTyAxLCAiTm8gdmFyaWFudCBtYXRjaCBmb3VuZCBmb3IgQ1BVICckX0NQVSciCi0gICAgICAgIEVORElGCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIF9NX1RSWTEgJHZhcgotICAgICAgICBJRiAiJHZhciI9IiIKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIElGIChfVmFyaWFudD0iIik6TEFORDokdmFyCi1fVmFyaWFudCBTRVRTICIkdmFyIgotICAgICAgICBFTkRJRgotICAgICAgICBNRU5ECi0gICAgICAgIAotOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi07Ly8gU3RydWN0dXJlIGRlZmluaXRpb24KLTsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgICAgIDsvLyBEZWNsYXJlIGEgc3RydWN0dXJlIG9mIGdpdmVuIG5hbWUKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9TVFJVQ1QgJHNuYW1lCi1fU3RydWN0IFNFVFMgIiRzbmFtZSIKLV9TdE9mZiAgU0VUQSAwCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBEZWNsYXJlIGEgc3RydWN0dXJlIGZpZWxkCi0gICAgICAgIDsvLyBUaGUgZmllbGQgaXMgY2FsbGVkICRzbmFtZV8kZm5hbWUKLSAgICAgICAgOy8vICRzaXplICAgPSB0aGUgc2l6ZSBvZiBlYWNoIGVudHJ5LCBtdXN0IGJlIHBvd2VyIG9mIDIgCi0gICAgICAgIDsvLyAkbnVtYmVyID0gKGlmIHByb3ZpZGVkKSB0aGUgbnVtYmVyIG9mIGVudHJpZXMgZm9yIGFuIGFycmF5Ci0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fRklFTEQgJGZuYW1lLCAkc2l6ZSwgJG51bWJlcgotICAgICAgICBJRiAoX1N0T2ZmOkFORDooJHNpemUtMSkpIT0wCi1fU3RPZmYgICAgICBTRVRBIF9TdE9mZiArICgkc2l6ZSAtIChfU3RPZmY6QU5EOigkc2l6ZS0xKSkpCi0gICAgICAgIEVORElGCi0kX1N0cnVjdC5fJGZuYW1lIEVRVSBfU3RPZmYKLSAgICAgICAgSUYgIiRudW1iZXIiPD4iIgotX1N0T2ZmICAgICAgU0VUQSBfU3RPZmYgKyAkc2l6ZSokbnVtYmVyCi0gICAgICAgIEVMU0UKLV9TdE9mZiAgICAgIFNFVEEgX1N0T2ZmICsgJHNpemUKLSAgICAgICAgRU5ESUYKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fRU5EU1RSVUNUCi1zaXplb2ZfJF9TdHJ1Y3QgRVFVIF9TdE9mZgotX1N0cnVjdCBTRVRTICIiCi0gICAgICAgIE1FTkQKLQotOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLTsvLyBTd2l0Y2ggYW5kIHRhYmxlIG1hY3JvcwotOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgICAgICA7Ly8gU3RhcnQgYSByZWxhdGl2ZSBzd2l0Y2ggdGFibGUgd2l0aCByZWdpc3RlciB0byBzd2l0Y2ggb24KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkdiA9IHRoZSByZWdpc3RlciB0byBzd2l0Y2ggb24KLSAgICAgICAgOy8vICRzID0gaWYgc3BlY2lmaWVkIG11c3QgYmUgIkwiIHRvIGluZGljYXRlIGxvbmcKLSAgICAgICAgOy8vICAgICAgdGhpcyBhbGxvd3MgYSBncmVhdGVyIHJhbmdlIHRvIHRoZSBjYXNlIGNvZGUKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9TV0lUQ0ggJHYsICRzCi0gICAgICAgIEFTU0VSVCAiJHMiPSIiOkxPUjoiJHMiPSJMIgotX1N3TG9uZyBTRVRMIHtGQUxTRX0KLSAgICAgICAgSUYgIiRzIj0iTCIKLV9Td0xvbmcgICAgIFNFVEwge1RSVUV9Ci0gICAgICAgIEVORElGCi1fU3dOdW0gIFNFVEEgX1N3TnVtKzEgICAgICAgIAotICAgICAgICBJRiB7Q09ORklHfT0xNgotICAgICAgICAgICAgOy8vIFRodW1iCi0gICAgICAgICAgICBJRiBfU3dMb25nCi0gICAgICAgICAgICAgICAgVEJIIFtwYywgJHYsIExTTCMxXQotICAgICAgICAgICAgRUxTRQotICAgICAgICAgICAgICAgIFRCQiBbcGMsICR2XQotICAgICAgICAgICAgRU5ESUYKLV9Td2l0Y2gkX1N3TnVtCi0gICAgICAgIEVMU0UKLSAgICAgICAgICAgIDsvLyBBUk0KLSAgICAgICAgICAgIEFERCBwYywgcGMsICR2LCBMU0wgIzIKLSAgICAgICAgICAgIE5PUAotICAgICAgICBFTkRJRgotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gQWRkIGEgY2FzZSB0byB0aGUgc3dpdGNoIHN0YXRlbWVudAotICAgICAgICBNQUNSTwotICAgICAgICBNX0NBU0UgICRsYWJlbAotICAgICAgICBJRiB7Q09ORklHfT0xNgotICAgICAgICAgICAgOy8vIFRodW1iCi0gICAgICAgICAgICBJRiBfU3dMb25nCi0gICAgICAgICAgICAgICAgRENXICgkbGFiZWwgLSBfU3dpdGNoJF9Td051bSkvMgotICAgICAgICAgICAgRUxTRQotICAgICAgICAgICAgICAgIERDQiAoJGxhYmVsIC0gX1N3aXRjaCRfU3dOdW0pLzIKLSAgICAgICAgICAgIEVORElGCi0gICAgICAgIEVMU0UKLSAgICAgICAgICAgIDsvLyBBUk0KLSAgICAgICAgICAgIEIgICAkbGFiZWwKLSAgICAgICAgRU5ESUYKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIEVuZCBvZiBzd2l0Y2ggc3RhdGVtZW50Ci0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fRU5EU1dJVENICi0gICAgICAgIEFMSUdOIDIKLSAgICAgICAgTUVORCAgICAgICAKLQotCi07Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLTsvLyBEYXRhIGFyZWEgYWxsb2NhdGlvbgotOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAgICAgOy8vIENvbnN0YW50IHRhYmxlIGFsbG9jYXRvciBtYWNybwotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIENyZWF0ZXMgYSBuZXcgc2VjdGlvbiBmb3IgZWFjaCBjb25zdGFudCB0YWJsZQotICAgICAgICA7Ly8gJG5hbWUgaXMgc3ltYm9sIHRocm91Z2ggd2hpY2ggdGhlIHRhYmxlIGNhbiBiZSBhY2Nlc3NlZC4KLSAgICAgICAgOy8vICRhbGlnbiBpcyB0aGUgb3B0aW9uYWwgYWxpZ25tZW50IG9mIHRoZSB0YWJsZSwgbG9nMiBvZiAKLSAgICAgICAgOy8vICB0aGUgYnl0ZSBhbGlnbm1lbnQgLSAkYWxpZ249NCBpcyAxNiBieXRlIGFsaWduZWQKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9UQUJMRSAgJG5hbWUsICRhbGlnbgotICAgICAgICBBU1NFUlQgOkxOT1Q6X0luRnVuYwotICAgICAgICBJRiAiJGFsaWduIj0iIgotICAgICAgICAgICAgQVJFQSB8LmNvbnN0ZGF0YXwsIFJFQURPTkxZLCBEQVRBCi0gICAgICAgIEVMU0UKLSAgICAgICAgICAgIDsvLyBBUkVBcyBpbmhlcml0IHRoZSBhbGlnbm1lbnQgb2YgdGhlIGZpcnN0IGRlY2xhcmF0aW9uLgotICAgICAgICAgICAgOy8vIFRoZXJlZm9yZSBmb3IgZWFjaCBhbGlnbm1lbnQgc2l6ZSB3ZSBtdXN0IGhhdmUgYW4gYXJlYQotICAgICAgICAgICAgOy8vIG9mIGEgZGlmZmVyZW50IG5hbWUuCi0gICAgICAgICAgICBBUkVBIGNvbnN0ZGF0YV9hJGFsaWduLCBSRUFET05MWSwgREFUQSwgQUxJR049JGFsaWduCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIDsvLyBXZSBhbHNvIGZvcmNlIGFsaWdubWVudCBpbmNhc2Ugd2UgYXJlIHRhZ2dpbmcgb250bwotICAgICAgICAgICAgOy8vIGFuIGFscmVhZHkgc3RhcnRlZCBhcmVhLgotICAgICAgICAgICAgQUxJR04gKDE8PCRhbGlnbikKLSAgICAgICAgRU5ESUYKLSRuYW1lCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi07Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLTsvLyBNYWNyb3MgdG8gYWxsb2NhdGUgc3BhY2Ugb24gdGhlIHN0YWNrCi07Ly8KLTsvLyBUaGVzZSBhbGwgYXNzdW1lIHRoYXQgdGhlIHN0YWNrIGlzIDgtYnl0ZSBhbGlnbmVkCi07Ly8gYXQgZW50cnkgdG8gdGhlIGZ1bmN0aW9uLCB3aGljaCBtZWFucyB0aGF0IHRoZSAKLTsvLyAzMi1ieXRlIGFsaWdubWVudCBtYWNybyBuZWVkcyB0byB3b3JrIGluIGEKLTsvLyBiaXQgbW9yZSBvZiBhIHNwZWNpYWwgd2F5Li4uCi07Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgICAgICAKLQotCi0gICAgICAgIDsvLyBBbGxvY2F0ZSAxLWJ5dGUgYWxpZ25lZCBhcmVhIG9mIG5hbWUKLSAgICAgICAgOy8vICRuYW1lIHNpemUgJHNpemUgYnl0ZXMuCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQUxMT0MxICAkbmFtZSwgJHNpemUKLSAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKLSRuYW1lJF9GICAgRVFVIF9TQnl0ZXMKLV9TQnl0ZXMgU0VUQSBfU0J5dGVzICsgKCRzaXplKQotICAgICAgICBNRU5ECi0gICAgICAgICAgICAKLSAgICAgICAgOy8vIEFsbG9jYXRlIDItYnl0ZSBhbGlnbmVkIGFyZWEgb2YgbmFtZQotICAgICAgICA7Ly8gJG5hbWUgc2l6ZSAkc2l6ZSBieXRlcy4KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9BTExPQzIgICRuYW1lLCAkc2l6ZQotICAgICAgICBBU1NFUlQgOkxOT1Q6X0luRnVuYwotICAgICAgICBJRiAoX1NCeXRlczpBTkQ6MSkhPTAKLV9TQnl0ZXMgICAgIFNFVEEgX1NCeXRlcyArICgyIC0gKF9TQnl0ZXM6QU5EOjEpKQotICAgICAgICBFTkRJRgotJG5hbWUkX0YgICBFUVUgX1NCeXRlcwotX1NCeXRlcyBTRVRBIF9TQnl0ZXMgKyAoJHNpemUpCi0gICAgICAgIE1FTkQKLSAgICAgICAgICAgIAotICAgICAgICA7Ly8gQWxsb2NhdGUgNC1ieXRlIGFsaWduZWQgYXJlYSBvZiBuYW1lCi0gICAgICAgIDsvLyAkbmFtZSBzaXplICRzaXplIGJ5dGVzLgotICAgICAgICBNQUNSTwotICAgICAgICBNX0FMTE9DNCAgJG5hbWUsICRzaXplCi0gICAgICAgIEFTU0VSVCA6TE5PVDpfSW5GdW5jCi0gICAgICAgIElGIChfU0J5dGVzOkFORDozKSE9MAotX1NCeXRlcyAgICAgU0VUQSBfU0J5dGVzICsgKDQgLSAoX1NCeXRlczpBTkQ6MykpCi0gICAgICAgIEVORElGCi0kbmFtZSRfRiAgIEVRVSBfU0J5dGVzCi1fU0J5dGVzIFNFVEEgX1NCeXRlcyArICgkc2l6ZSkKLSAgICAgICAgTUVORAotICAgICAgICAgICAgCi0gICAgICAgIDsvLyBBbGxvY2F0ZSA4LWJ5dGUgYWxpZ25lZCBhcmVhIG9mIG5hbWUKLSAgICAgICAgOy8vICRuYW1lIHNpemUgJHNpemUgYnl0ZXMuCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQUxMT0M4ICAkbmFtZSwgJHNpemUKLSAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKLSAgICAgICAgSUYgKF9TQnl0ZXM6QU5EOjcpIT0wCi1fU0J5dGVzICAgICBTRVRBIF9TQnl0ZXMgKyAoOCAtIChfU0J5dGVzOkFORDo3KSkKLSAgICAgICAgRU5ESUYKLSRuYW1lJF9GICAgRVFVIF9TQnl0ZXMKLV9TQnl0ZXMgU0VUQSBfU0J5dGVzICsgKCRzaXplKQotICAgICAgICBNRU5EICAgICAgICAKLQotICAgICAgICAKLSAgICAgICAgOy8vIEFsbG9jYXRlIDgtYnl0ZSBhbGlnbmVkIGFyZWEgb2YgbmFtZQotICAgICAgICA7Ly8gJG5hbWUgc2l6ZSAoJHNpemUrMTYpIGJ5dGVzLgotICAgICAgICA7Ly8gVGhlIGV4dHJhIDE2IGJ5dGVzIGFyZSBsYXRlciB1c2VkIHRvIGFsaWduIHRoZSBwb2ludGVyIHRvIDE2IGJ5dGVzCi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBNX0FMTE9DMTYgICRuYW1lLCAkc2l6ZQotICAgICAgICBBU1NFUlQgOkxOT1Q6X0luRnVuYwotICAgICAgICBJRiAoX1NCeXRlczpBTkQ6NykhPTAKLV9TQnl0ZXMgICAgIFNFVEEgX1NCeXRlcyArICg4IC0gKF9TQnl0ZXM6QU5EOjcpKQotICAgICAgICBFTkRJRgotJG5hbWUkX0YkXzE2ICAgRVFVIChfU0J5dGVzICsgOCkKLV9TQnl0ZXMgU0VUQSBfU0J5dGVzICsgKCRzaXplKSArIDgKLSAgICAgICAgTUVORCAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gQWxsb2NhdGUgOC1ieXRlIGFsaWduZWQgYXJlYSBvZiBuYW1lCi0gICAgICAgIDsvLyAkbmFtZSBzaXplICgkc2l6ZSszMikgYnl0ZXMuCi0gICAgICAgIDsvLyBUaGUgZXh0cmEgMzIgYnl0ZXMgYXJlIGxhdGVyIHVzZWQgdG8gYWxpZ24gdGhlIHBvaW50ZXIgdG8gMzIgYnl0ZXMKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQUxMT0MzMiAgJG5hbWUsICRzaXplCi0gICAgICAgIEFTU0VSVCA6TE5PVDpfSW5GdW5jCi0gICAgICAgIElGIChfU0J5dGVzOkFORDo3KSE9MAotX1NCeXRlcyAgICAgU0VUQSBfU0J5dGVzICsgKDggLSAoX1NCeXRlczpBTkQ6NykpCi0gICAgICAgIEVORElGCi0kbmFtZSRfRiRfMzIgICBFUVUgKF9TQnl0ZXMgKyAyNCkKLV9TQnl0ZXMgU0VUQSBfU0J5dGVzICsgKCRzaXplKSArIDI0Ci0gICAgICAgIE1FTkQgICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIEFyZ3VtZW50IERlY2xhcmF0aW9uIE1hY3JvCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gQWxsb2NhdGUgYW4gYXJndW1lbnQgbmFtZSAkbmFtZQotICAgICAgICA7Ly8gc2l6ZSAkc2l6ZSBieXRlcwotICAgICAgICBNQUNSTwotICAgICAgICBNX0FSRyAgICAgJG5hbWUsICRzaXplCi0gICAgICAgIEFTU0VSVCBfSW5GdW5jCi0kbmFtZSRfRiAgICBFUVUgX0FCeXRlcwotX0FCeXRlcyBTRVRBIF9BQnl0ZXMgKyAoJHNpemUpCi0gICAgICAgIE1FTkQgICAgICAgIAotICAgICAgICAKLTsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotOy8vIE1hY3JvcyB0byBhY2Nlc3Mgc3RhY2tlZCB2YXJpYWJsZXMKLTsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgICAgIDsvLyBNYWNybyB0byBwZXJmb3JtIGEgZGF0YSBwcm9jZXNzaW5nIG9wZXJhdGlvbgotICAgICAgICA7Ly8gd2l0aCBhIGNvbnN0YW50IHNlY29uZCBvcGVyYW5kCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIF9NX09QQyAkb3AsJHJkLCRybiwkY29uc3QKLSAgICAgICAgTENMQSAgICBfc2gKLSAgICAgICAgTENMQSAgICBfY3N0Ci1fc2ggICAgIFNFVEEgICAgMAotX2NzdCAgICBTRVRBICAgICRjb25zdAotICAgICAgICBJRiBfY3N0PTAKLSAgICAgICAgJG9wICRyZCwgJHJuLCAjX2NzdAotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgV0hJTEUgKF9jc3Q6QU5EOjMpPTAKLV9jc3QgICAgICAgIFNFVEEgX2NzdD4+MgotX3NoICAgICAgICAgU0VUQSBfc2grMgotICAgICAgICBXRU5ECi0gICAgICAgICRvcCAkcmQsICRybiwgIyhfY3N0OkFORDoweDAwMDAwMEZGKTw8X3NoCi0gICAgICAgIElGIF9jc3Q+PTI1NgotICAgICAgICAgICAgJG9wICRyZCwgJHJkLCAjKF9jc3Q6QU5EOjB4RkZGRkZGMDApPDxfc2gKLSAgICAgICAgRU5ESUYKLSAgICAgICAgTUVORAotCi0gICAgICAgIDsvLyBNYWNybyB0byBwZXJmb3JtIGEgZGF0YSBhY2Nlc3Mgb3BlcmF0aW9uCi0gICAgICAgIDsvLyBTdWNoIGFzIExEUiBvciBTVFIKLSAgICAgICAgOy8vIFRoZSBhZGRyZXNzaW5nIG1vZGUgaXMgbW9kaWZpZWQgc3VjaCB0aGF0Ci0gICAgICAgIDsvLyAxLiBJZiBubyBhZGRyZXNzIGlzIGdpdmVuIHRoZW4gdGhlIG5hbWUgaXMgdGFrZW4KLSAgICAgICAgOy8vICAgIGFzIGEgc3RhY2sgb2Zmc2V0Ci0gICAgICAgIDsvLyAyLiBJZiB0aGUgYWRkcmVzc2luZyBtb2RlIGlzIG5vdCBhdmFpbGFibGUgZm9yIHRoZQotICAgICAgICA7Ly8gICAgc3RhdGUgYmVpbmcgYXNzZW1ibGVkIGZvciAoZWcgVGh1bWIpIHRoZW4gYSBzdWl0YWJsZQotICAgICAgICA7Ly8gICAgYWRkcmVzc2luZyBtb2RlIGlzIHN1YnN0aXR1dGVkLgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIE9uIEVudHJ5OgotICAgICAgICA7Ly8gJGkgPSBJbnN0cnVjdGlvbiB0byBwZXJmb3JtIChlZyAiTERSQiIpCi0gICAgICAgIDsvLyAkYSA9IFJlcXVpcmVkIGJ5dGUgYWxpZ25tZW50Ci0gICAgICAgIDsvLyAkciA9IFJlZ2lzdGVyKHMpIHRvIHRyYW5zZmVyIChlZyAicjEiKQotICAgICAgICA7Ly8gJGEwLCRhMSwkYTIuIEFkZHJlc3NpbmcgbW9kZSBhbmQgY29uZGl0aW9uLiBPbmUgb2Y6Ci0gICAgICAgIDsvLyAgICAgbGFiZWwgeyxjY30KLSAgICAgICAgOy8vICAgICBbYmFzZV0gICAgICAgICAgICAgICAgICAgIHssLCxjY30KLSAgICAgICAgOy8vICAgICBbYmFzZSwgb2Zmc2V0XXshfSAgICAgICAgIHssLGNjfQotICAgICAgICA7Ly8gICAgIFtiYXNlLCBvZmZzZXQsIHNoaWZ0XXshfSAgeyxjY30KLSAgICAgICAgOy8vICAgICBbYmFzZV0sIG9mZnNldCAgICAgICAgICAgIHssLGNjfQotICAgICAgICA7Ly8gICAgIFtiYXNlXSwgb2Zmc2V0LCBzaGlmdCAgICAgeyxjY30KLSAgICAgICAgTUFDUk8KLSAgICAgICAgX01fREFUQSAkaSwkYSwkciwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgSUYgIiRhMCI6TEVGVDoxPSJbIgotICAgICAgICAgICAgSUYgIiRhMSI9IiIKLSAgICAgICAgICAgICAgICAkaSRhMyAgICRyLCAkYTAKLSAgICAgICAgICAgIEVMU0UKLSAgICAgICAgICAgICAgICBJRiAiJGEwIjpSSUdIVDoxPSJdIgotICAgICAgICAgICAgICAgICAgICBJRiAiJGEyIj0iIgotICAgICAgICAgICAgICAgICAgICAgICAgX01fUE9TVElORCAkaSRhMywgIiRyIiwgJGEwLCAkYTEKLSAgICAgICAgICAgICAgICAgICAgRUxTRQotICAgICAgICAgICAgICAgICAgICAgICAgX01fUE9TVElORCAkaSRhMywgIiRyIiwgJGEwLCAiJGExLCRhMiIKLSAgICAgICAgICAgICAgICAgICAgRU5ESUYKLSAgICAgICAgICAgICAgICBFTFNFCi0gICAgICAgICAgICAgICAgICAgIElGICIkYTIiPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICBfTV9QUkVJTkQgICRpJGEzLCAiJHIiLCAkYTAsICRhMQotICAgICAgICAgICAgICAgICAgICBFTFNFCi0gICAgICAgICAgICAgICAgICAgICAgICBfTV9QUkVJTkQgICRpJGEzLCAiJHIiLCAkYTAsICIkYTEsJGEyIgotICAgICAgICAgICAgICAgICAgICBFTkRJRgotICAgICAgICAgICAgICAgIEVORElGCi0gICAgICAgICAgICBFTkRJRgotICAgICAgICBFTFNFCi0gICAgICAgICAgICBMQ0xBICAgIF9PZmZzZXQKLV9PZmZzZXQgICAgIFNFVEEgICAgX1dvcmtzcGFjZSArICRhMCRfRgotICAgICAgICAgICAgQVNTRVJUICAoX09mZnNldDpBTkQ6KCRhLTEpKT0wCi0gICAgICAgICAgICAkaSRhMSAgICRyLCBbc3AsICNfT2Zmc2V0XQotICAgICAgICBFTkRJRgotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gSGFuZGxlIHBvc3QgaW5kZXhlZCBsb2FkL3N0b3JlcwotICAgICAgICA7Ly8gb3AgIHJlZywgW2Jhc2VdLCBvZmZzZXQKLSAgICAgICAgTUFDUk8KLSAgICAgICAgX01fUE9TVElORCAkaSwkciwkYTAsJGExCi0gICAgICAgIExDTFMgX2Jhc2UKLSAgICAgICAgTENMUyBfb2Zmc2V0Ci0gICAgICAgIElGIHtDT05GSUd9PTE2IDsvLyBUaHVtYgotX2Jhc2UgICAgICAgU0VUUyAoIiRhMCI6TEVGVDooOkxFTjoiJGEwIi0xKSk6UklHSFQ6KDpMRU46IiRhMCItMikgICA7Ly8gcmVtb3ZlIFtdCi1fb2Zmc2V0ICAgICBTRVRTICIkYTEiCi0gICAgICAgICAgICBJRiBfb2Zmc2V0OkxFRlQ6MT0iKyIKLV9vZmZzZXQgICAgICAgICBTRVRTIF9vZmZzZXQ6UklHSFQ6KDpMRU46X29mZnNldC0xKQotICAgICAgICAgICAgRU5ESUYKLSAgICAgICAgICAgICRpICAkciwgJGEwCi0gICAgICAgICAgICBJRiBfb2Zmc2V0OkxFRlQ6MT0iLSIKLV9vZmZzZXQgICAgICAgICBTRVRTIF9vZmZzZXQ6UklHSFQ6KDpMRU46X29mZnNldC0xKQotICAgICAgICAgICAgICAgIFNVQiAkX2Jhc2UsICRfYmFzZSwgJF9vZmZzZXQKLSAgICAgICAgICAgIEVMU0UgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgQUREICRfYmFzZSwgJF9iYXNlLCAkX29mZnNldAotICAgICAgICAgICAgRU5ESUYKLSAgICAgICAgRUxTRSA7Ly8gQVJNCi0gICAgICAgICAgICAkaSAgJHIsICRhMCwgJGExCi0gICAgICAgIEVORElGCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBIYW5kbGUgcHJlIGluZGV4ZWQgbG9hZC9zdG9yZQotICAgICAgICA7Ly8gb3AgIHJlZywgW2Jhc2UsIG9mZnNldF17IX0KLSAgICAgICAgTUFDUk8KLSAgICAgICAgX01fUFJFSU5EICRpLCRyLCRhMCwkYTEKLSAgICAgICAgTENMUyBfYmFzZQotICAgICAgICBMQ0xTIF9vZmZzZXQKLSAgICAgICAgSUYgKHtDT05GSUd9PTE2KTpMQU5EOigoIiRhMSI6UklHSFQ6Mik9Il0hIikKLV9iYXNlICAgICAgIFNFVFMgIiRhMCI6UklHSFQ6KDpMRU46KCIkYTAiKS0xKQotX29mZnNldCAgICAgU0VUUyAiJGExIjpMRUZUOig6TEVOOigiJGExIiktMikKLSAgICAgICAgICAgICRpICRyLCBbJF9iYXNlLCAkX29mZnNldF0KLSAgICAgICAgICAgIEFERCAkX2Jhc2UsICRfYmFzZSwgJF9vZmZzZXQKLSAgICAgICAgRUxTRQotICAgICAgICAgICAgJGkgICRyLCAkYTAsICRhMQotICAgICAgICBFTkRJRgotICAgICAgICBNRU5ECi0KLSAgICAgICAgOy8vIExvYWQgdW5zaWduZWQgYnl0ZSBmcm9tIHN0YWNrCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fTERSQiAgJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIF9NX0RBVEEgIkxEUkIiLDEsJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBMb2FkIHNpZ25lZCBieXRlIGZyb20gc3RhY2sKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9MRFJTQiAkciwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgX01fREFUQSAiTERSU0IiLDEsJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBTdG9yZSBieXRlIHRvIHN0YWNrCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fU1RSQiAgJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIF9NX0RBVEEgIlNUUkIiLDEsJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBMb2FkIHVuc2lnbmVkIGhhbGYgd29yZCBmcm9tIHN0YWNrCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fTERSSCAgJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIF9NX0RBVEEgIkxEUkgiLDIsJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBMb2FkIHNpZ25lZCBoYWxmIHdvcmQgZnJvbSBzdGFjawotICAgICAgICBNQUNSTwotICAgICAgICBNX0xEUlNIICRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBfTV9EQVRBICJMRFJTSCIsMiwkciwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIFN0b3JlIGhhbGYgd29yZCB0byBzdGFjawotICAgICAgICBNQUNSTwotICAgICAgICBNX1NUUkggICRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBfTV9EQVRBICJTVFJIIiwyLCRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBNRU5ECi0KLSAgICAgICAgOy8vIExvYWQgd29yZCBmcm9tIHN0YWNrCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fTERSICAgJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIF9NX0RBVEEgIkxEUiIsNCwkciwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIFN0b3JlIHdvcmQgdG8gc3RhY2sKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9TVFIgICAkciwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgX01fREFUQSAiU1RSIiw0LCRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBNRU5ECi0KLSAgICAgICAgOy8vIExvYWQgZG91YmxlIHdvcmQgZnJvbSBzdGFjawotICAgICAgICBNQUNSTwotICAgICAgICBNX0xEUkQgICRyMCwkcjEsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIF9NX0RBVEEgIkxEUkQiLDgsIiRyMCwkcjEiLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBNRU5ECi0gICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBTdG9yZSBkb3VibGUgd29yZCB0byBzdGFjawotICAgICAgICBNQUNSTwotICAgICAgICBNX1NUUkQgICRyMCwkcjEsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIF9NX0RBVEEgIlNUUkQiLDgsIiRyMCwkcjEiLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gR2V0IGFic29sdXRlIGFkZHJlc3Mgb2Ygc3RhY2sgYWxsb2NhdGVkIGxvY2F0aW9uCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQURSICAgJGEsICRiLCAkY2MKLSAgICAgICAgX01fT1BDICBBREQkY2MsICRhLCBzcCwgKF9Xb3Jrc3BhY2UgKyAkYiRfRikKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIEdldCBhYnNvbHV0ZSBhZGRyZXNzIG9mIHN0YWNrIGFsbG9jYXRlZCBsb2NhdGlvbiBhbmQgYWxpZ24gdGhlIGFkZHJlc3MgdG8gMTYgYnl0ZXMKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9BRFIxNiAkYSwgJGIsICRjYwotICAgICAgICAgICAgX01fT1BDICBBREQkY2MsICRhLCBzcCwgKF9Xb3Jrc3BhY2UgKyAkYiRfRiRfMTYpCi0gICAgICAgIAotICAgICAgICAgICAgOy8vIE5vdyBhbGlnbiAkYSB0byAxNiBieXRlcwotICAgICAgICAgICAgQklDJGNjICAkYSwkYSwjMHgwRgotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gR2V0IGFic29sdXRlIGFkZHJlc3Mgb2Ygc3RhY2sgYWxsb2NhdGVkIGxvY2F0aW9uIGFuZCBhbGlnbiB0aGUgYWRkcmVzcyB0byAzMiBieXRlcwotICAgICAgICBNQUNSTwotICAgICAgICBNX0FEUjMyICRhLCAkYiwgJGNjCi0gICAgICAgICAgICBfTV9PUEMgIEFERCRjYywgJGEsIHNwLCAoX1dvcmtzcGFjZSArICRiJF9GJF8zMikKLSAgICAgICAgCi0gICAgICAgICAgICA7Ly8gTm93IGFsaWduICRhIHRvIDMyIGJ5dGVzCi0gICAgICAgICAgICBCSUMkY2MgICRhLCRhLCMweDFGCi0gICAgICAgIE1FTkQKLQotOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLTsvLyBGdW5jdGlvbiBoZWFkZXIgYW5kIGZvb3RlciBtYWNyb3MKLTsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gRnVuY3Rpb24gSGVhZGVyIE1hY3JvICAgIAotICAgICAgICA7Ly8gR2VuZXJhdGVzIHRoZSBmdW5jdGlvbiBwcm9sb2d1ZQotICAgICAgICA7Ly8gTm90ZSB0aGF0IGZ1bmN0aW9ucyBzaG91bGQgYWxsIGJlICJzdGFjay1tb3Zlcy1vbmNlIgotICAgICAgICA7Ly8gVGhlIEZOU1RBUlQgYW5kIEZORU5EIG1hY3JvcyBzaG91bGQgYmUgdGhlIG9ubHkgcGxhY2VzCi0gICAgICAgIDsvLyB3aGVyZSB0aGUgc3RhY2sgbW92ZXMuCi0gICAgICAgIDsvLyAgICAKLSAgICAgICAgOy8vICRuYW1lICA9IGZ1bmN0aW9uIG5hbWUKLSAgICAgICAgOy8vICRycmVnICA9ICIiICAgZG9uJ3Qgc3RhY2sgYW55IHJlZ2lzdGVycwotICAgICAgICA7Ly8gICAgICAgICAgImxyIiBzdGFjayAibHIiIG9ubHkKLSAgICAgICAgOy8vICAgICAgICAgICJyTiIgc3RhY2sgcmVnaXN0ZXJzICJyNC1yTixsciIKLSAgICAgICAgOy8vICRkcmVnICA9ICIiICAgZG9uJ3Qgc3RhY2sgYW55IEQgcmVnaXN0ZXJzCi0gICAgICAgIDsvLyAgICAgICAgICAiZE4iIHN0YWNrIHJlZ2lzdGVycyAiZDgtZE4iCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gTm90ZTogQVJNIEFyY2hpY3R1cmUgcHJvY2VkdXJlIGNhbGwgc3RhbmRhcmQgQUFQQ1MKLSAgICAgICAgOy8vIHN0YXRlcyB0aGF0IHI0LXIxMSwgc3AsIGQ4LWQxNSBtdXN0IGJlIHByZXNlcnZlZCBieQotICAgICAgICA7Ly8gYSBjb21wbGlhbnQgZnVuY3Rpb24uCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fU1RBUlQgJG5hbWUsICRycmVnLCAkZHJlZwotICAgICAgICBBU1NFUlQgOkxOT1Q6X0luRnVuYwotICAgICAgICBBU1NFUlQgIiRuYW1lIiE9IiIKLV9JbkZ1bmMgU0VUTCB7VFJVRX0KLV9SQnl0ZXMgU0VUQSAwCi1fV29ya3NwYWNlIFNFVEEgMAotCi0gICAgICAgIDsvLyBDcmVhdGUgYW4gYXJlYSBmb3IgdGhlIGZ1bmN0aW9uICAgICAgICAKLSAgICAgICAgQVJFQSAgICB8LnRleHR8LCBDT0RFCi0gICAgICAgIEVYUE9SVCAgJG5hbWUKLSRuYW1lICAgRlVOQ1RJT04KLSAgICAgICAgCi0gICAgICAgIDsvLyBTYXZlIFIgcmVnaXN0ZXJzCi0gICAgICAgIF9NX0dFVFJSRUdMSVNUICRycmVnCi0gICAgICAgIElGIF9SUmVnTGlzdDw+IiIKLSAgICAgICAgICAgIFNUTUZEICAgc3AhLCB7JF9SUmVnTGlzdCwgbHJ9Ci0gICAgICAgIEVORElGCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBTYXZlIEQgcmVnaXN0ZXJzCi0gICAgICAgIF9NX0dFVERSRUdMSVNUICAkZHJlZyAgICAgICAgCi0gICAgICAgIElGIF9EUmVnTGlzdDw+IiIKLSAgICAgICAgICAgIFZTVE1GRCAgc3AhLCB7JF9EUmVnTGlzdH0KLSAgICAgICAgRU5ESUYgICAgICAgICAgICAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIEVuc3VyZSBzaXplIGNsYWltZWQgb24gc3RhY2sgaXMgOC1ieXRlIGFsaWduZWQKLSAgICAgICAgSUYgKChfU0J5dGVzOkFORDo3KSE9MCkKLV9TQnl0ZXMgICAgIFNFVEEgX1NCeXRlcyArICg4IC0gKF9TQnl0ZXM6QU5EOjcpKQotICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgICAgSUYgKF9TQnl0ZXMhPTApCi0gICAgICAgICAgICBfTV9PUEMgU1VCLCBzcCwgc3AsIF9TQnl0ZXMKLSAgICAgICAgRU5ESUYKLSAgICAgICAgCi0gICAgICAgIAotX0FCeXRlcyBTRVRBIF9TQnl0ZXMgKyBfUkJ5dGVzIC0gX1dvcmtzcGFjZQotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIFByaW50IGZ1bmN0aW9uIG5hbWUgaWYgZGVidWcgZW5hYmxlZAotICAgICAgICBNX1BSSU5URiAiJG5hbWVcbiIsCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBXb3JrIG91dCBhIGxpc3Qgb2YgUiBzYXZlZCByZWdpc3RlcnMKLSAgICAgICAgTUFDUk8KLSAgICAgICAgX01fR0VUUlJFR0xJU1QgJHJyZWcKLSAgICAgICAgSUYgIiRycmVnIj0iIgotX1JSZWdMaXN0ICAgU0VUUyAiIgotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYgICAgICAgIAotICAgICAgICBJRiAiJHJyZWciPSJsciI6TE9SOiIkcnJlZyI9InI0IgotX1JSZWdMaXN0ICAgU0VUUyAicjQiCi1fUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrOAotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgIiRycmVnIj0icjUiOkxPUjoiJHJyZWciPSJyNiIKLV9SUmVnTGlzdCAgIFNFVFMgInI0LXI2IgotX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzE2Ci0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRgotICAgICAgICBJRiAiJHJyZWciPSJyNyI6TE9SOiIkcnJlZyI9InI4IgotX1JSZWdMaXN0ICAgU0VUUyAicjQtcjgiCi1fUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrMjQKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIElGICIkcnJlZyI9InI5IjpMT1I6IiRycmVnIj0icjEwIgotX1JSZWdMaXN0ICAgU0VUUyAicjQtcjEwIgotX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzMyCi0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRgotICAgICAgICBJRiAiJHJyZWciPSJyMTEiOkxPUjoiJHJyZWciPSJyMTIiCi1fUlJlZ0xpc3QgICBTRVRTICJyNC1yMTIiCi1fUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrNDAKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIElORk8gMSwgIlVucmVjb2duaXplZCBzYXZlZCByIHJlZ2lzdGVyIGxpbWl0ICckcnJlZyciCi0gICAgICAgIE1FTkQgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIFdvcmsgb3V0IGEgbGlzdCBvZiBEIHNhdmVkIHJlZ2lzdGVycwotICAgICAgICBNQUNSTwotICAgICAgICBfTV9HRVREUkVHTElTVCAkZHJlZwotICAgICAgICBJRiAiJGRyZWciPSIiCi1fRFJlZ0xpc3QgICBTRVRTICIiCi0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRiAgICAgICAgCi0gICAgICAgIElGICIkZHJlZyI9ImQ4IgotX0RSZWdMaXN0ICAgU0VUUyAiZDgiCi1fUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrOAotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgIiRkcmVnIj0iZDkiCi1fRFJlZ0xpc3QgICBTRVRTICJkOC1kOSIKLV9SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcysxNgotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgIiRkcmVnIj0iZDEwIgotX0RSZWdMaXN0ICAgU0VUUyAiZDgtZDEwIgotX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzI0Ci0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRgotICAgICAgICBJRiAiJGRyZWciPSJkMTEiCi1fRFJlZ0xpc3QgICBTRVRTICJkOC1kMTEiCi1fUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrMzIKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIElGICIkZHJlZyI9ImQxMiIKLV9EUmVnTGlzdCAgIFNFVFMgImQ4LWQxMiIKLV9SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcys0MAotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgIiRkcmVnIj0iZDEzIgotX0RSZWdMaXN0ICAgU0VUUyAiZDgtZDEzIgotX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzQ4Ci0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRgotICAgICAgICBJRiAiJGRyZWciPSJkMTQiCi1fRFJlZ0xpc3QgICBTRVRTICJkOC1kMTQiCi1fUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrNTYKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIElGICIkZHJlZyI9ImQxNSIKLV9EUmVnTGlzdCAgIFNFVFMgImQ4LWQxNSIKLV9SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcys2NAotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSU5GTyAxLCAiVW5yZWNvZ25pemVkIHNhdmVkIGQgcmVnaXN0ZXIgbGltaXQgJyRkcmVnJyIKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIFByb2R1Y2UgZnVuY3Rpb24gcmV0dXJuIGluc3RydWN0aW9ucwotICAgICAgICBNQUNSTwotICAgICAgICBfTV9SRVQgJGNjCi0gICAgICAgIElGIF9EUmVnTGlzdDw+IiIKLSAgICAgICAgICAgIFZQT1AkY2MgeyRfRFJlZ0xpc3R9Ci0gICAgICAgIEVORElGCi0gICAgICAgIElGIF9SUmVnTGlzdD0iIgotICAgICAgICAgICAgQlgkY2MgbHIKLSAgICAgICAgRUxTRQotICAgICAgICAgICAgTERNJGNjLkZEIHNwISwgeyRfUlJlZ0xpc3QsIHBjfQotICAgICAgICBFTkRJRgotICAgICAgICBNRU5EICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBFYXJseSBGdW5jdGlvbiBFeGl0IE1hY3JvCi0gICAgICAgIDsvLyAkY2MgPSBjb25kaXRpb24gdG8gZXhpdCB3aXRoCi0gICAgICAgIDsvLyAoRXhhbXBsZTogTV9FWElUIEVRKQotICAgICAgICBNQUNSTwotICAgICAgICBNX0VYSVQgICRjYwotICAgICAgICBBU1NFUlQgIF9JbkZ1bmMKLSAgICAgICAgSUYgIF9TQnl0ZXMhPTAKLSAgICAgICAgICAgIDsvLyBSZXN0b3JlIHN0YWNrIGZyYW1lIGFuZCBleGl0Ci0gICAgICAgICAgICBCJGNjICBfRW5kJF9GCi0gICAgICAgIEVMU0UKLSAgICAgICAgICAgIDsvLyBDYW4gcmV0dXJuIGRpcmVjdGx5Ci0gICAgICAgICAgICBfTV9SRVQgJGNjCi0gICAgICAgIEVORElGICAgICAgICAKLSAgICAgICAgTUVORCAgICAgICAgCi0KLSAgICAgICAgOy8vIEZ1bmN0aW9uIEZvb3RlciBNYWNybyAgICAgICAgCi0gICAgICAgIDsvLyBHZW5lcmF0ZXMgdGhlIGZ1bmN0aW9uIGVwaWxvZ3VlCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fRU5ECi0gICAgICAgIEFTU0VSVCBfSW5GdW5jCi1fSW5GdW5jIFNFVEwge0ZBTFNFfQotX0VuZCRfRgotCi0gICAgICAgIDsvLyBSZXN0b3JlIHRoZSBzdGFjayBwb2ludGVyIHRvIGl0cyBvcmlnaW5hbCB2YWx1ZSBvbiBmdW5jdGlvbiBlbnRyeQotICAgICAgICBJRiBfU0J5dGVzIT0wCi0gICAgICAgICAgICBfTV9PUEMgQURELCBzcCwgc3AsIF9TQnl0ZXMKLSAgICAgICAgRU5ESUYKLSAgICAgICAgX01fUkVUCi0gICAgICAgIEVOREZVTkMKLQotICAgICAgICA7Ly8gUmVzZXQgdGhlIGdsb2JhbCBzdGFjayB0cmFja2luZyB2YXJpYWJsZXMgYmFjayB0byB0aGVpciAKLSAgICAgICAgOy8vIGluaXRpYWwgdmFsdWVzLCBhbmQgaW5jcmVtZW50IHRoZSBmdW5jdGlvbiBjb3VudAotX1NCeXRlcyAgICAgICAgU0VUQSAwCi1fRiAgICAgICAgICAgICBTRVRBIF9GKzEKLSAgICAgICAgTUVORAotCi0gICAgICAgICAgICAgICAgCi07Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOy8vIERlYnVnIE1hY3JvcwotOy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgICAgICBHQkxMICAgIERFQlVHX09OCi1ERUJVR19PTiBTRVRMICAge0ZBTFNFfQotICAgICAgICBHQkxMICAgIERFQlVHX1NUQUxMU19PTgotREVCVUdfU1RBTExTX09OIFNFVEwge0ZBTFNFfQotICAgICAgICAKLSAgICAgICAgOy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgOy8vIERlYnVnIGNhbGwgdG8gcHJpbnRmCi0gICAgICAgIDsvLyAgTV9QUklOVEYgJGZvcm1hdCwgJHZhbDAsICR2YWwxLCAkdmFsMgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIEV4YW1wbGVzOgotICAgICAgICA7Ly8gIE1fUFJJTlRGICJ4PSUwOHhcbiIsIHIwCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gVGhpcyBtYWNybyBwcmVzZXJ2ZXMgdGhlIHZhbHVlIG9mIGFsbCByZWdpc3RlcnMgaW5jbHVkaW5nIHRoZQotICAgICAgICA7Ly8gZmxhZ3MuCi0gICAgICAgIDsvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9QUklOVEYgICRmb3JtYXQsICR2YWwwLCAkdmFsMSwgJHZhbDIKLSAgICAgICAgSUYgREVCVUdfT04KLSAgICAgICAgCi0gICAgICAgIElNUE9SVCAgcHJpbnRmCi0gICAgICAgIExDTEEgICAgbkFyZ3MKLW5BcmdzCVNFVEEgICAgMAotICAgICAgICAKLSAgICAgICAgOy8vIHNhdmUgcmVnaXN0ZXJzIHNvIHdlIGRvbid0IGNvcnJ1cHQgdGhlbQotICAgICAgICBTVE1GRCAgIHNwISwge3IwLXIxMiwgbHJ9Ci0gICAgICAgIAotICAgICAgICA7Ly8gRHJvcCBzdGFjayB0byBnaXZlIHVzIHNvbWUgd29ya3NwYWNlCi0gICAgICAgIFNVQiAgICAgc3AsIHNwLCAjMTYKLSAgICAgICAgCi0gICAgICAgIDsvLyBTYXZlIHJlZ2lzdGVycyB3ZSBuZWVkIHRvIHByaW50IHRvIHRoZSBzdGFjawotICAgICAgICBJRiAiJHZhbDIiIDw+ICIiCi0gICAgICAgICAgICBBU1NFUlQgIiR2YWwxIiA8PiAiIgotICAgICAgICAgICAgU1RSICAgICR2YWwyLCBbc3AsICM4XQotbkFyZ3MgICAgICAgU0VUQSAgIG5BcmdzKzEKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgIiR2YWwxIiA8PiAiIgotICAgICAgICAgICAgQVNTRVJUICIkdmFsMCIgPD4gIiIKLSAgICAgICAgICAgIFNUUiAgICAkdmFsMSwgW3NwLCAjNF0KLW5BcmdzCSAgICBTRVRBICAgbkFyZ3MrMQotICAgICAgICBFTkRJRgotICAgICAgICBJRiAiJHZhbDAiPD4iIgotICAgICAgICAgICAgU1RSICAgICR2YWwwLCBbc3BdCi1uQXJncwkgICAgU0VUQSAgIG5BcmdzKzEKLSAgICAgICAgRU5ESUYKLSAgICAgICAgCi0gICAgICAgIDsvLyBOb3cgd2UgYXJlIHNhZmUgdG8gY29ycnVwdCByZWdpc3RlcnMKLSAgICAgICAgQURSICAgICByMCwgJUZUMDAKLSAgICAgICAgSUYgbkFyZ3M9MQotICAgICAgICAgIExEUiAgIHIxLCBbc3BdCi0gICAgICAgIEVORElGCi0gICAgICAgIElGIG5BcmdzPTIKLSAgICAgICAgICBMRE1JQSBzcCwge3IxLHIyfQotICAgICAgICBFTkRJRgotICAgICAgICBJRiBuQXJncz0zCi0gICAgICAgICAgTERNSUEgc3AsIHtyMSxyMixyM30KLSAgICAgICAgRU5ESUYKLSAgICAgICAgCi0gICAgICAgIDsvLyBwcmludCB0aGUgdmFsdWVzCi0gICAgICAgIE1SUyAgICAgcjQsIGNwc3IgICAgICAgIDsvLyBwcmVzZXJ2ZSBmbGFncwotICAgICAgICBCTCAgICAgIHByaW50ZgotICAgICAgICBNU1IgICAgIGNwc3JfZiwgcjQgICAgICA7Ly8gcmVzdG9yZSBmbGFncwotICAgICAgICBCICAgICAgICVGVDAxCi0wMCAgICAgIDsvLyBzdHJpbmcgdG8gcHJpbnQKLSAgICAgICAgRENCICAgICAiJGZvcm1hdCIsIDAKLSAgICAgICAgQUxJR04KLTAxICAgICAgOy8vIEZpbmlzaGVkCi0gICAgICAgIEFERCAgICAgc3AsIHNwLCAjMTYKLSAgICAgICAgOy8vIFJlc3RvcmUgcmVnaXN0ZXJzCi0gICAgICAgIExETUZECXNwISwge3IwLXIxMixscn0KLQotICAgICAgICBFTkRJRiAgIDsvLyBERUJVR19PTgotICAgICAgICBNRU5ECi0KLQotICAgICAgICA7Ly8gU3RhbGwgU2ltdWxhdGlvbiBNYWNybwotICAgICAgICA7Ly8gSW5zZXJ0cyBhIGdpdmVuIG51bWJlciBvZiBOT1BzIGZvciB0aGUgY3VycmVudGx5Ci0gICAgICAgIDsvLyAgZGVmaW5lZCBwbGF0Zm9ybQotICAgICAgICBNQUNSTwotICAgICAgICBNX1NUQUxMICRwbGF0MXN0YWxsLCAkcGxhdDJzdGFsbCwgJHBsYXQzc3RhbGwsICRwbGF0NHN0YWxsLCAkcGxhdDVzdGFsbCwgJHBsYXQ2c3RhbGwKLSAgICAgICAgSUYgREVCVUdfU1RBTExTX09OCi0gICAgICAgICAgICBfTV9TVEFMTF9TVUIgJHBsYXQxc3RhbGwgICAgCi0gICAgICAgICAgICBfTV9TVEFMTF9TVUIgJHBsYXQyc3RhbGwgICAgCi0gICAgICAgICAgICBfTV9TVEFMTF9TVUIgJHBsYXQzc3RhbGwgICAgCi0gICAgICAgICAgICBfTV9TVEFMTF9TVUIgJHBsYXQ0c3RhbGwgICAgCi0gICAgICAgICAgICBfTV9TVEFMTF9TVUIgJHBsYXQ1c3RhbGwgICAgCi0gICAgICAgICAgICBfTV9TVEFMTF9TVUIgJHBsYXQ2c3RhbGwgICAgCi0gICAgICAgIEVORElGCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIF9NX1NUQUxMX1NVQiAkcGxhdHN0YWxsCi0gICAgICAgIElGICIkcGxhdHN0YWxsIiE9IiIKLSAgICAgICAgICAgIExDTEEgX3BsbGVuCi0gICAgICAgICAgICBMQ0xTIF9wbAotICAgICAgICAgICAgTENMTCBfcGxsb2cKLV9wbGxlbiAgICAgIFNFVEEgOkxFTjoiJHBsYXRzdGFsbCIKLV9wbCAgICAgICAgIFNFVFMgIiRwbGF0c3RhbGwiOkxFRlQ6KF9wbGxlbiAtIDIpCi0gICAgICAgICAgICBJRiA6REVGOiRfcGwKLSAgICAgICAgICAgICAgICBJRiAkX3BsCi0gICAgICAgICAgICAgICAgICAgIExDTFMgX3N0Ci0gICAgICAgICAgICAgICAgICAgIExDTEEgX3N0bnVtCi1fc3QgICAgICAgICAgICAgICAgIFNFVFMgIiRwbGF0c3RhbGwiOlJJR0hUOjEgICAgICAgIAotX3N0bnVtICAgICAgICAgICAgICBTRVRBICRfc3QKLSAgICAgICAgICAgICAgICAgICAgV0hJTEUgX3N0bnVtPjAKLQkJCU1PViBzcCwgc3AKLV9zdG51bSAgICAgICAgICAgICAgICAgIFNFVEEgX3N0bnVtIC0gMQotICAgICAgICAgICAgICAgICAgICBXRU5ECi0gICAgICAgICAgICAgICAgRU5ESUYKLSAgICAgICAgICAgIEVORElGCi0gICAgICAgIEVORElGCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLTsvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07Ly8gRW5kaWFuIEludmFyaWVuY2UgTWFjcm9zCi07Ly8gCi07Ly8gVGhlIGlkZWEgYmVoaW5kIHRoZXNlIG1hY3JvcyBpcyB0aGF0IGlmIGFuIGFycmF5IGlzCi07Ly8gbG9hZGVkIGFzIHdvcmRzIHRoZW4gdGhlIFNNVUwwMCBtYWNybyB3aWxsIG11bHRpcGx5Ci07Ly8gYXJyYXkgZWxlbWVudHMgMCByZWdhcmRsZXNzIG9mIHRoZSBlbmRpYW5lc3Mgb2YgdGhlCi07Ly8gc3lzdGVtLiBGb3IgbGl0dGxlIGVuZGlhbiBTTVVMMDA9U01VTEJCLCBmb3IgYmlnCi07Ly8gZW5kaWFuIFNNVUwwMD1TTVVMVFQgYW5kIHNpbWlsYXJseSBmb3Igb3RoZXIgcGFja2VkIG9wZXJhdGlvbnMuCi07Ly8KLTsvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTElCSTQgICAkY29tbGksICRjb21iaSwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBJRiB7RU5ESUFOfT0iYmlnIgotICAgICAgICAkY29tYmkuJGNjICRhLCAkYiwgJGMsICRkCi0gICAgICAgIEVMU0UKLSAgICAgICAgJGNvbWxpLiRjYyAkYSwgJGIsICRjLCAkZAotICAgICAgICBFTkRJRgotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBMSUJJMyAgICRjb21saSwgJGNvbWJpLCAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgSUYge0VORElBTn09ImJpZyIKLSAgICAgICAgJGNvbWJpLiRjYyAkYSwgJGIsICRjCi0gICAgICAgIEVMU0UKLSAgICAgICAgJGNvbWxpLiRjYyAkYSwgJGIsICRjCi0gICAgICAgIEVORElGCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBTTUxBeHkgbWFjcm9zCi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBMDAgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUJCLCBTTUxBVFQsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQTAxICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFCVCwgU01MQVRCLCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEEwQiAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBQkIsIFNNTEFUQiwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBMFQgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUJULCBTTUxBVFQsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQTEwICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFUQiwgU01MQUJULCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEExMSAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBVFQsIFNNTEFCQiwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBMUIgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQVRCLCBTTUxBQkIsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQTFUICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFUVCwgU01MQUJULCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFCMCAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBQkIsIFNNTEFCVCwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBQjEgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUJULCBTTUxBQkIsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQVQwICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFUQiwgU01MQVRULCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFUMSAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBVFQsIFNNTEFUQiwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gU01VTHh5IG1hY3JvcwotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01VTDAwICAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTElCSTMgU01VTEJCLCBTTVVMVFQsICRhLCAkYiwgJGMsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTVVMMDEgICRhLCAkYiwgJGMsICRjYwotICAgICAgICBMSUJJMyBTTVVMQlQsIFNNVUxUQiwgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNVUwwQiAgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIExJQkkzIFNNVUxCQiwgU01VTFRCLCAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01VTDBUICAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTElCSTMgU01VTEJULCBTTVVMVFQsICRhLCAkYiwgJGMsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTVVMMTAgICRhLCAkYiwgJGMsICRjYwotICAgICAgICBMSUJJMyBTTVVMVEIsIFNNVUxCVCwgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNVUwxMSAgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIExJQkkzIFNNVUxUVCwgU01VTEJCLCAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01VTDFCICAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTElCSTMgU01VTFRCLCBTTVVMQkIsICRhLCAkYiwgJGMsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTVVMMVQgICRhLCAkYiwgJGMsICRjYwotICAgICAgICBMSUJJMyBTTVVMVFQsIFNNVUxCVCwgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNVUxCMCAgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIExJQkkzIFNNVUxCQiwgU01VTEJULCAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01VTEIxICAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTElCSTMgU01VTEJULCBTTVVMQkIsICRhLCAkYiwgJGMsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTVVMVDAgICRhLCAkYiwgJGMsICRjYwotICAgICAgICBMSUJJMyBTTVVMVEIsIFNNVUxUVCwgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNVUxUMSAgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIExJQkkzIFNNVUxUVCwgU01VTFRCLCAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIFNNTEFXeCwgU01VTFd4IG1hY3JvcwotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQVcwICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFXQiwgU01MQVdULCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFXMSAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBV1QsIFNNTEFXQiwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTVVMVzAgICRhLCAkYiwgJGMsICRjYwotICAgICAgICBMSUJJMyBTTVVMV0IsIFNNVUxXVCwgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNVUxXMSAgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIExJQkkzIFNNVUxXVCwgU01VTFdCLCAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTUVORAotCi0gICAgICAgIDsvLyBTTUxBTHh5IG1hY3JvcwotCi0KLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQUwwMCAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBTEJCLCBTTUxBTFRULCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFMMDEgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUxCVCwgU01MQUxUQiwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBTDBCICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFMQkIsIFNNTEFMVEIsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQUwwVCAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBTEJULCBTTUxBTFRULCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFMMTAgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUxUQiwgU01MQUxCVCwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0KLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQUwxMSAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBTFRULCBTTUxBTEJCLCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFMMUIgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUxUQiwgU01MQUxCQiwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBTDFUICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFMVFQsIFNNTEFMQlQsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQUxCMCAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBTEJCLCBTTUxBTEJULCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFMQjEgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUxCVCwgU01MQUxCQiwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBTFQwICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFMVEIsIFNNTEFMVFQsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQUxUMSAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBTFRULCBTTUxBTFRCLCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gIEVORElGIDsvLyBBUk1DT01NX1NfSAotICAgICAgICAgICAgCi0gIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1PTVguaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtT01YLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YzBjMjYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1PTVguaAorKysgL2Rldi9udWxsCkBAIC0xLDI4OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtT01YX1JlbGVhc2VWZXJzaW9uLmgKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBUaGlzIGZpbGUgYWxsb3dzIGEgdmVyc2lvbiBvZiB0aGUgT01YIERMIGxpYnJhcmllcyB0byBiZSBidWlsdCB3aGVyZSBzb21lIG9yCi0gKiBhbGwgb2YgdGhlIGZ1bmN0aW9uIG5hbWVzIGNhbiBiZSBnaXZlbiBhIHVzZXIgc3BlY2lmaWVkIHN1ZmZpeC4gCi0gKgotICogWW91IG1pZ2h0IHdhbnQgdG8gdXNlIGl0IHdoZXJlOgotICoKLSAqIC0geW91IHdhbnQgdG8gcmVuYW1lIGEgZnVuY3Rpb24gIm91dCBvZiB0aGUgd2F5IiBzbyB0aGF0IHlvdSBjb3VsZCByZXBsYWNlCi0gKiAgIGEgZnVuY3Rpb24gd2l0aCBhIGRpZmZlcmVudCB2ZXJzaW9uICh0aGUgb3JpZ2luYWwgdmVyc2lvbiB3b3VsZCBzdGlsbCBiZQotICogICBpbiB0aGUgbGlicmFyeSBqdXN0IHdpdGggYSBkaWZmZXJlbnQgbmFtZSAtIHNvIHlvdSBjb3VsZCBkZWJ1ZyB0aGUgbmV3Ci0gKiAgIHZlcnNpb24gYnkgY29tcGFyaW5nIGl0IHRvIHRoZSBvdXRwdXQgb2YgdGhlIG9sZCkKLSAqCi0gKiAtIHlvdSB3YW50IHRvIHJlbmFtZSBhbGwgdGhlIGZ1bmN0aW9ucyB0byB2ZXJzaW9ucyB3aXRoIGEgc3VmZml4IHNvIHRoYXQgCi0gKiAgIHlvdSBjYW4gaW5jbHVkZSB0d28gdmVyc2lvbnMgb2YgdGhlIGxpYnJhcnkgYW5kIGNob29zZSBiZXR3ZWVuIGZ1bmN0aW9ucwotICogICBhdCBydW50aW1lLgotICoKLSAqICAgICBlLmcuIG9teElQQk1fQ29weV9VOF9DMVIgY291bGQgYmUgcmVuYW1lZCBvbXhJUEJNX0NvcHlfVThfQzFSX0NvcnRleEE4Ci0gKiAKLSAqLwotCi0gIAotI2lmbmRlZiBfYXJtT01YX0hfCi0jZGVmaW5lIF9hcm1PTVhfSF8KLQotCi0vKiBXZSBuZWVkIHRvIGRlZmluZSB0aGVzZSB0d28gbWFjcm9zIGluIG9yZGVyIHRvIGV4cGFuZCBhbmQgY29uY2F0ZW5hdGUgdGhlIG5hbWVzICovCi0jZGVmaW5lIE9NWENBVDJCQVIoQSwgQikgb214ICMjIEEgIyMgQgotI2RlZmluZSBPTVhDQVRCQVIoQSwgQikgT01YQ0FUMkJBUihBLCBCKQotCi0vKiBEZWZpbmUgdGhlIHN1ZmZpeCB0byBhZGQgdG8gYWxsIGZ1bmN0aW9ucyAtIHRoZSBkZWZhdWx0IGlzIG5vIHN1ZmZpeCAqLwotI2RlZmluZSBCQVJFX1NVRkZJWCAKLQotCi0KLS8qIERlZmluZSB3aGF0IGhhcHBlbnMgdG8gdGhlIGJhcmUgc3VmZml4LWxlc3MgZnVuY3Rpb25zLCBkb3duIHRvIHRoZSBzdWItZG9tYWluIGFjY3VyYWN5ICovCi0jZGVmaW5lIE9NWEFDQUFDX1NVRkZJWCAgICBCQVJFX1NVRkZJWCAgIAotI2RlZmluZSBPTVhBQ01QM19TVUZGSVggICAgQkFSRV9TVUZGSVgKLSNkZWZpbmUgT01YSUNKUF9TVUZGSVggICAgIEJBUkVfU1VGRklYCi0jZGVmaW5lIE9NWElQQk1fU1VGRklYICAgICBCQVJFX1NVRkZJWAotI2RlZmluZSBPTVhJUENTX1NVRkZJWCAgICAgQkFSRV9TVUZGSVgKLSNkZWZpbmUgT01YSVBQUF9TVUZGSVggICAgIEJBUkVfU1VGRklYCi0jZGVmaW5lIE9NWFNQX1NVRkZJWCAgICAgICBCQVJFX1NVRkZJWAotI2RlZmluZSBPTVhWQ0NPTU1fU1VGRklYICAgQkFSRV9TVUZGSVgKLSNkZWZpbmUgT01YVkNNNFAxMF9TVUZGSVggIEJBUkVfU1VGRklYCi0jZGVmaW5lIE9NWFZDTTRQMl9TVUZGSVggICBCQVJFX1NVRkZJWAotCi0KLQotCi0vKiBEZWZpbmUgd2hhdCB0aGUgZWFjaCBiYXJlLCB1bi1zdWZmaXhlZCBPcGVuTUFYIEFQSSBmdW5jdGlvbiBuYW1lcyBpcyB0byBiZSByZW5hbWVkICovCi0jZGVmaW5lIG9teEFDQUFDX0RlY29kZUNoYW5QYWlyRWx0ICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZUNoYW5QYWlyRWx0LCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX0RlY29kZURhdFN0ckVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZURhdFN0ckVsdCwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVGaWxsRWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVGaWxsRWx0LCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX0RlY29kZUlzU3RlcmVvX1MzMiAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZUlzU3RlcmVvX1MzMiwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVNc1BOU19TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVNc1BOU19TMzJfSSwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVNc1N0ZXJlb19TMzJfSSAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVNc1N0ZXJlb19TMzJfSSwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVQcmdDZmdFbHQgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVQcmdDZmdFbHQsIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfRGVjb2RlVE5TX1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlVE5TX1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX0RlaW50ZXJsZWF2ZVNwZWN0cnVtX1MzMiAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlaW50ZXJsZWF2ZVNwZWN0cnVtX1MzMiwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19FbmNvZGVUTlNfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19FbmNvZGVUTlNfUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfTG9uZ1Rlcm1QcmVkaWN0X1MzMiAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfTG9uZ1Rlcm1QcmVkaWN0X1MzMiwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19Mb25nVGVybVJlY29uc3RydWN0X1MzMl9JICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19Mb25nVGVybVJlY29uc3RydWN0X1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX01EQ1RGd2RfUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX01EQ1RGd2RfUzMyLCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX01EQ1RJbnZfUzMyX1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX01EQ1RJbnZfUzMyX1MxNiwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19Ob2lzZWxlc3NEZWNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19Ob2lzZWxlc3NEZWNvZGUsIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfUXVhbnRJbnZfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfUXVhbnRJbnZfUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfVW5wYWNrQURJRkhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfVW5wYWNrQURJRkhlYWRlciwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19VbnBhY2tBRFRTRnJhbWVIZWFkZXIgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19VbnBhY2tBRFRTRnJhbWVIZWFkZXIsIE9NWEFDQUFDX1NVRkZJWCkKLQotCi0jZGVmaW5lIG9teEFDTVAzX0h1ZmZtYW5EZWNvZGVfUzMyICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX0h1ZmZtYW5EZWNvZGVfUzMyLCBPTVhBQ01QM19TVUZGSVgpCi0jZGVmaW5lIG9teEFDTVAzX0h1ZmZtYW5EZWNvZGVTZmJfUzMyICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX0h1ZmZtYW5EZWNvZGVTZmJfUzMyLCBPTVhBQ01QM19TVUZGSVgpCi0jZGVmaW5lIG9teEFDTVAzX0h1ZmZtYW5EZWNvZGVTZmJNYnBfUzMyICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX0h1ZmZtYW5EZWNvZGVTZmJNYnBfUzMyLCBPTVhBQ01QM19TVUZGSVgpCi0jZGVmaW5lIG9teEFDTVAzX01EQ1RJbnZfUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX01EQ1RJbnZfUzMyLCBPTVhBQ01QM19TVUZGSVgpCi0jZGVmaW5lIG9teEFDTVAzX1JlUXVhbnRpemVfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1JlUXVhbnRpemVfUzMyX0ksIE9NWEFDTVAzX1NVRkZJWCkKLSNkZWZpbmUgb214QUNNUDNfUmVRdWFudGl6ZVNmYl9TMzJfSSAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfUmVRdWFudGl6ZVNmYl9TMzJfSSwgT01YQUNNUDNfU1VGRklYKQotI2RlZmluZSBvbXhBQ01QM19TeW50aFBRTUZfUzMyX1MxNiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19TeW50aFBRTUZfUzMyX1MxNiwgT01YQUNNUDNfU1VGRklYKQotI2RlZmluZSBvbXhBQ01QM19VbnBhY2tGcmFtZUhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19VbnBhY2tGcmFtZUhlYWRlciwgT01YQUNNUDNfU1VGRklYKQotI2RlZmluZSBvbXhBQ01QM19VbnBhY2tTY2FsZUZhY3RvcnNfUzggICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19VbnBhY2tTY2FsZUZhY3RvcnNfUzgsIE9NWEFDTVAzX1NVRkZJWCkKLSNkZWZpbmUgb214QUNNUDNfVW5wYWNrU2lkZUluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfVW5wYWNrU2lkZUluZm8sIE9NWEFDTVAzX1NVRkZJWCkKLQotI2RlZmluZSBvbXhJQ0pQX0NvcHlFeHBhbmRfVThfQzMgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0NvcHlFeHBhbmRfVThfQzMsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVEZ3ZF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVEZ3ZF9TMTYsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVEZ3ZF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVEZ3ZF9TMTZfSSwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENUSW52X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUSW52X1MxNiwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENUSW52X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUSW52X1MxNl9JLCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEZ3ZF9NdWx0aXBsZV9TMTYgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEZ3ZF9NdWx0aXBsZV9TMTYsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50RndkX1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50RndkX1MxNiwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENUUXVhbnRGd2RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRGd2RfUzE2X0ksIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50RndkVGFibGVJbml0ICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50RndkVGFibGVJbml0LCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEludl9NdWx0aXBsZV9TMTYgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEludl9NdWx0aXBsZV9TMTYsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50SW52X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50SW52X1MxNiwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENUUXVhbnRJbnZfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRJbnZfUzE2X0ksIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50SW52VGFibGVJbml0ICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50SW52VGFibGVJbml0LCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EZWNvZGVIdWZmbWFuOHg4X0RpcmVjdF9TMTZfQzEgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EZWNvZGVIdWZmbWFuOHg4X0RpcmVjdF9TMTZfQzEsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RlY29kZUh1ZmZtYW5TcGVjR2V0QnVmU2l6ZV9VOCAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RlY29kZUh1ZmZtYW5TcGVjR2V0QnVmU2l6ZV9VOCwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRGVjb2RlSHVmZm1hblNwZWNJbml0X1U4ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRGVjb2RlSHVmZm1hblNwZWNJbml0X1U4LCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9FbmNvZGVIdWZmbWFuOHg4X0RpcmVjdF9TMTZfVTFfQzEgICAgICAgICBPTVhDQVRCQVIoSUNKUF9FbmNvZGVIdWZmbWFuOHg4X0RpcmVjdF9TMTZfVTFfQzEsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0VuY29kZUh1ZmZtYW5TcGVjR2V0QnVmU2l6ZV9VOCAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0VuY29kZUh1ZmZtYW5TcGVjR2V0QnVmU2l6ZV9VOCwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRW5jb2RlSHVmZm1hblNwZWNJbml0X1U4ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRW5jb2RlSHVmZm1hblNwZWNJbml0X1U4LCBPTVhJQ0pQX1NVRkZJWCkKLQotI2RlZmluZSBvbXhJUEJNX0FkZENfVThfQzFSX1NmcyAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUEJNX0FkZENfVThfQzFSX1NmcywgT01YSVBCTV9TVUZGSVgpCi0jZGVmaW5lIG9teElQQk1fQ29weV9VOF9DMVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQk1fQ29weV9VOF9DMVIsIE9NWElQQk1fU1VGRklYKQotI2RlZmluZSBvbXhJUEJNX0NvcHlfVThfQzNSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUEJNX0NvcHlfVThfQzNSLCBPTVhJUEJNX1NVRkZJWCkKLSNkZWZpbmUgb214SVBCTV9NaXJyb3JfVThfQzFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBCTV9NaXJyb3JfVThfQzFSLCBPTVhJUEJNX1NVRkZJWCkKLSNkZWZpbmUgb214SVBCTV9NdWxDX1U4X0MxUl9TZnMgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBCTV9NdWxDX1U4X0MxUl9TZnMsIE9NWElQQk1fU1VGRklYKQotCi0jZGVmaW5lIG9teElQQ1NfQ29sb3JUd2lzdFExNF9VOF9DM1IgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfQ29sb3JUd2lzdFExNF9VOF9DM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX0JHUjU2NVRvWUNiQ3I0MjBMU19NQ1VfVTE2X1MxNl9DM1AzUiAgICAgIE9NWENBVEJBUihJUENTX0JHUjU2NVRvWUNiQ3I0MjBMU19NQ1VfVTE2X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfQkdSNTY1VG9ZQ2JDcjQyMkxTX01DVV9VMTZfUzE2X0MzUDNSICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSNTY1VG9ZQ2JDcjQyMkxTX01DVV9VMTZfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19CR1I1NjVUb1lDYkNyNDQ0TFNfTUNVX1UxNl9TMTZfQzNQM1IgICAgICBPTVhDQVRCQVIoSVBDU19CR1I1NjVUb1lDYkNyNDQ0TFNfTUNVX1UxNl9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX0JHUjg4OFRvWUNiQ3I0MjBMU19NQ1VfVThfUzE2X0MzUDNSICAgICAgIE9NWENBVEJBUihJUENTX0JHUjg4OFRvWUNiQ3I0MjBMU19NQ1VfVThfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19CR1I4ODhUb1lDYkNyNDIyTFNfTUNVX1U4X1MxNl9DM1AzUiAgICAgICBPTVhDQVRCQVIoSVBDU19CR1I4ODhUb1lDYkNyNDIyTFNfTUNVX1U4X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfQkdSODg4VG9ZQ2JDcjQ0NExTX01DVV9VOF9TMTZfQzNQM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSODg4VG9ZQ2JDcjQ0NExTX01DVV9VOF9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwUnN6Q3NjUm90QkdSX1U4X1AzQzNSICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwUnN6Q3NjUm90QkdSX1U4X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMFJzelJvdF9VOF9QM1IgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMFJzelJvdF9VOF9QM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwVG9CR1I1NjVfVThfVTE2X1AzQzNSICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwVG9CR1I1NjVfVThfVTE2X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMFRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMFRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlJzekNzY1JvdEJHUl9VOF9QM0MzUiAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlJzekNzY1JvdEJHUl9VOF9QM0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfQ2JZQ3JZNDIyUnN6Q3NjUm90QkdSX1U4X1UxNl9DMlIgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfQ2JZQ3JZNDIyUnN6Q3NjUm90QkdSX1U4X1UxNl9DMlIsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyUnN6Um90X1U4X1AzUiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyUnN6Um90X1U4X1AzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiWUNyNDIyVG9CR1I1NjVfVThfVTE2X0MyQzNSICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiWUNyNDIyVG9CR1I1NjVfVThfVTE2X0MyQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYllDcjQyMlRvQkdSODg4X1U4X0MyQzNSICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYllDcjQyMlRvQkdSODg4X1U4X0MyQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX0NiWUNyWTQyMlRvWUNiQ3I0MjBSb3RhdGVfVThfQzJQM1IgICAgICAgIE9NWENBVEJBUihJUENTX0NiWUNyWTQyMlRvWUNiQ3I0MjBSb3RhdGVfVThfQzJQM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyVG9ZQ2JDcjQyMFJvdGF0ZV9VOF9QM1IgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyVG9ZQ2JDcjQyMFJvdGF0ZV9VOF9QM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDQ0VG9CR1I1NjVfVThfVTE2X0MzUiAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDQ0VG9CR1I1NjVfVThfVTE2X0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0NDRUb0JHUjU2NV9VOF9VMTZfUDNDM1IgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0NDRUb0JHUjU2NV9VOF9VMTZfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDQ0VG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDQ0VG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0NDRUb0JHUjg4OF9VOF9DM1IgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0NDRUb0JHUjg4OF9VOF9DM1IsIE9NWElQQ1NfU1VGRklYKQotCi0jZGVmaW5lIG9teElQUFBfRGVibG9ja19Ib3JFZGdlX1U4X0kgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfRGVibG9ja19Ib3JFZGdlX1U4X0ksIE9NWElQUFBfU1VGRklYKQotI2RlZmluZSBvbXhJUFBQX0RlYmxvY2tfVmVyRWRnZV9VOF9JICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0RlYmxvY2tfVmVyRWRnZV9VOF9JLCBPTVhJUFBQX1NVRkZJWCkKLSNkZWZpbmUgb214SVBQUF9GaWx0ZXJGSVJfVThfQzFSICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9GaWx0ZXJGSVJfVThfQzFSLCBPTVhJUFBQX1NVRkZJWCkKLSNkZWZpbmUgb214SVBQUF9GaWx0ZXJNZWRpYW5fVThfQzFSICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9GaWx0ZXJNZWRpYW5fVThfQzFSLCBPTVhJUFBQX1NVRkZJWCkKLSNkZWZpbmUgb214SVBQUF9HZXRDZW50cmFsTW9tZW50X1M2NCAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9HZXRDZW50cmFsTW9tZW50X1M2NCwgT01YSVBQUF9TVUZGSVgpCi0jZGVmaW5lIG9teElQUFBfR2V0U3BhdGlhbE1vbWVudF9TNjQgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfR2V0U3BhdGlhbE1vbWVudF9TNjQsIE9NWElQUFBfU1VGRklYKQotI2RlZmluZSBvbXhJUFBQX01vbWVudEdldFN0YXRlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX01vbWVudEdldFN0YXRlU2l6ZSwgT01YSVBQUF9TVUZGSVgpCi0jZGVmaW5lIG9teElQUFBfTW9tZW50SW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfTW9tZW50SW5pdCwgT01YSVBQUF9TVUZGSVgpCi0jZGVmaW5lIG9teElQUFBfTW9tZW50c19VOF9DMVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfTW9tZW50c19VOF9DMVIsIE9NWElQUFBfU1VGRklYKQotI2RlZmluZSBvbXhJUFBQX01vbWVudHNfVThfQzNSICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX01vbWVudHNfVThfQzNSLCBPTVhJUFBQX1NVRkZJWCkKLQotI2RlZmluZSBvbXhTUF9CbG9ja0V4cF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9CbG9ja0V4cF9TMTYsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfQmxvY2tFeHBfUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfQmxvY2tFeHBfUzMyLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0NvcHlfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0NvcHlfUzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0RvdFByb2RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0RvdFByb2RfUzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0RvdFByb2RfUzE2X1NmcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0RvdFByb2RfUzE2X1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRGd2RfQ1RvQ19TQzE2X1NmcyAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRGd2RfQ1RvQ19TQzE2X1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRGd2RfQ1RvQ19TQzMyX1NmcyAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRGd2RfQ1RvQ19TQzMyX1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRGd2RfUlRvQ0NTX1MxNlMzMl9TZnMgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRGd2RfUlRvQ0NTX1MxNlMzMl9TZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZURndkX1JUb0NDU19TMzJfU2ZzICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZURndkX1JUb0NDU19TMzJfU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEdldEJ1ZlNpemVfQ19TQzE2ICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEdldEJ1ZlNpemVfQ19TQzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEdldEJ1ZlNpemVfQ19TQzMyICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEdldEJ1ZlNpemVfQ19TQzMyLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEdldEJ1ZlNpemVfUl9TMTZTMzIgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEdldEJ1ZlNpemVfUl9TMTZTMzIsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZUR2V0QnVmU2l6ZV9SX1MzMiAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUR2V0QnVmU2l6ZV9SX1MzMiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRJbml0X0NfU0MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbml0X0NfU0MxNiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRJbml0X0NfU0MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbml0X0NfU0MzMiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRJbml0X1JfUzE2UzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbml0X1JfUzE2UzMyLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEluaXRfUl9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEluaXRfUl9TMzIsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZUSW52X0NDU1RvUl9TMzJfU2ZzICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW52X0NDU1RvUl9TMzJfU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEludl9DQ1NUb1JfUzMyUzE2X1NmcyAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEludl9DQ1NUb1JfUzMyUzE2X1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRJbnZfQ1RvQ19TQzE2X1NmcyAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbnZfQ1RvQ19TQzE2X1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRJbnZfQ1RvQ19TQzMyX1NmcyAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbnZfQ1RvQ19TQzMyX1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GaWx0ZXJNZWRpYW5fUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GaWx0ZXJNZWRpYW5fUzMyLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZpbHRlck1lZGlhbl9TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZpbHRlck1lZGlhbl9TMzJfSSwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GSVJfRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJfRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GSVJfRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJfRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZJUl9EaXJlY3RfUzE2X0lTZnMgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUl9EaXJlY3RfUzE2X0lTZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRklSX0RpcmVjdF9TMTZfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklSX0RpcmVjdF9TMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZJUk9uZV9EaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUk9uZV9EaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZJUk9uZV9EaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUk9uZV9EaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRklST25lX0RpcmVjdF9TMTZfSVNmcyAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklST25lX0RpcmVjdF9TMTZfSVNmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GSVJPbmVfRGlyZWN0X1MxNl9TZnMgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJPbmVfRGlyZWN0X1MxNl9TZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfSUlSX0JpUXVhZERpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlSX0JpUXVhZERpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfSUlSX0JpUXVhZERpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlSX0JpUXVhZERpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9JSVJfRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJfRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9JSVJfRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJfRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0lJUk9uZV9CaVF1YWREaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUk9uZV9CaVF1YWREaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0lJUk9uZV9CaVF1YWREaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUk9uZV9CaVF1YWREaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfSUlST25lX0RpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlST25lX0RpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfSUlST25lX0RpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlST25lX0RpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQotCi0jZGVmaW5lIG9teFZDQ09NTV9BdmVyYWdlXzE2eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9BdmVyYWdlXzE2eCwgT01YVkNDT01NX1NVRkZJWCkKLSNkZWZpbmUgb214VkNDT01NX0F2ZXJhZ2VfOHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0F2ZXJhZ2VfOHgsIE9NWFZDQ09NTV9TVUZGSVgpCi0jZGVmaW5lIG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2sgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2ssIE9NWFZDQ09NTV9TVUZGSVgpCi0jZGVmaW5lIG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FEICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FELCBPTVhWQ0NPTU1fU1VGRklYKQotI2RlZmluZSBvbXhWQ0NPTU1fQ29weTE2eDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQ29weTE2eDE2LCBPTVhWQ0NPTU1fU1VGRklYKQotI2RlZmluZSBvbXhWQ0NPTU1fQ29weTh4OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQ29weTh4OCwgT01YVkNDT01NX1NVRkZJWCkKLSNkZWZpbmUgb214VkNDT01NX0V4cGFuZEZyYW1lX0kgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0V4cGFuZEZyYW1lX0ksIE9NWFZDQ09NTV9TVUZGSVgpCi0jZGVmaW5lIG9teFZDQ09NTV9MaW1pdE1WVG9SZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9MaW1pdE1WVG9SZWN0LCBPTVhWQ0NPTU1fU1VGRklYKQotI2RlZmluZSBvbXhWQ0NPTU1fU0FEXzE2eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fU0FEXzE2eCwgT01YVkNDT01NX1NVRkZJWCkKLSNkZWZpbmUgb214VkNDT01NX1NBRF84eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX1NBRF84eCwgT01YVkNDT01NX1NVRkZJWCkKLQotI2RlZmluZSBvbXhWQ000UDEwX0F2ZXJhZ2VfNHggICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0F2ZXJhZ2VfNHgsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSSAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0RlYmxvY2tDaHJvbWFfSSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSSAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRGVibG9ja0x1bWFfSSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQyAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQywgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkIE9NWENBVEJBUihWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0ksIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9HZXRWTENJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9HZXRWTENJbmZvLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZCAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfTUVHZXRCdWZTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfTUVHZXRCdWZTaXplLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9NRUluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9NRUluaXQsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2ICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2LCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0ICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0LCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfU0FEXzR4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FEXzR4LCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9TQURRdWFyXzE2eCAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TQURRdWFyXzE2eCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfU0FEUXVhcl80eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FEUXVhcl80eCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfU0FEUXVhcl84eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FEUXVhcl84eCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfU0FURF80eDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FURF80eDQsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpciAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpciwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQyAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQywgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDLCBPTVhWQ000UDEwX1NVRkZJWCkKLQotI2RlZmluZSBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2ICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2LCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OCAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OCwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDggICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDgsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9EQ1Q4eDhibGsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EQ1Q4eDhibGssIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0VuY29kZU1WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0VuY29kZU1WLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0ZpbmRNVnByZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0ZpbmRNVnByZWQsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9JRENUOHg4YmxrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9JRENUOHg4YmxrLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfTUNSZWNvbkJsb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfTUNSZWNvbkJsb2NrLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfTUVHZXRCdWZTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfTUVHZXRCdWZTaXplLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfTUVJbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfTUVJbml0LCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfUXVhbnRJbnRlcl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUXVhbnRJbnRlcl9JLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfUXVhbnRJbnRyYV9JICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUXVhbnRJbnRyYV9JLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUXVhbnRJbnZJbnRlcl9JLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUXVhbnRJbnZJbnRyYV9JLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSwgT01YVkNNNFAyX1NVRkZJWCkKLQotCi0jZW5kaWYgLyogX2FybU9NWF9oXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9vbXh0eXBlcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9vbXh0eXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTJjYjBkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvb214dHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioKLSAqIEZpbGU6IG9teHR5cGVzLmgKLSAqIEJyaWVmOiBEZWZpbmVzIGJhc2ljIERhdGEgdHlwZXMgdXNlZCBpbiBPcGVuTUFYIHYxLjAuMiBoZWFkZXIgZmlsZXMuCi0gKgotICogQ29weXJpZ2h0IKkgMjAwNS0yMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0gKgotICogVGhlc2UgbWF0ZXJpYWxzIGFyZSBwcm90ZWN0ZWQgYnkgY29weXJpZ2h0IGxhd3MgYW5kIGNvbnRhaW4gbWF0ZXJpYWwgCi0gKiBwcm9wcmlldGFyeSB0byB0aGUgS2hyb25vcyBHcm91cCwgSW5jLiAgWW91IG1heSB1c2UgdGhlc2UgbWF0ZXJpYWxzIAotICogZm9yIGltcGxlbWVudGluZyBLaHJvbm9zIHNwZWNpZmljYXRpb25zLCB3aXRob3V0IGFsdGVyaW5nIG9yIHJlbW92aW5nIAotICogYW55IHRyYWRlbWFyaywgY29weXJpZ2h0IG9yIG90aGVyIG5vdGljZSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uLgotICogCi0gKiBLaHJvbm9zIEdyb3VwIG1ha2VzIG5vLCBhbmQgZXhwcmVzc2x5IGRpc2NsYWltcyBhbnksIHJlcHJlc2VudGF0aW9ucyAKLSAqIG9yIHdhcnJhbnRpZXMsIGV4cHJlc3Mgb3IgaW1wbGllZCwgcmVnYXJkaW5nIHRoZXNlIG1hdGVyaWFscywgaW5jbHVkaW5nLCAKLSAqIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcyAKLSAqIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBvciBub24taW5mcmluZ2VtZW50IG9mIGFueSBpbnRlbGxlY3R1YWwgcHJvcGVydHkuIAotICogS2hyb25vcyBHcm91cCBtYWtlcyBubywgYW5kIGV4cHJlc3NseSBkaXNjbGFpbXMgYW55LCB3YXJyYW50aWVzLCBleHByZXNzIAotICogb3IgaW1wbGllZCwgcmVnYXJkaW5nIHRoZSBjb3JyZWN0bmVzcywgYWNjdXJhY3ksIGNvbXBsZXRlbmVzcywgdGltZWxpbmVzcywgCi0gKiBhbmQgcmVsaWFiaWxpdHkgb2YgdGhlc2UgbWF0ZXJpYWxzLiAKLSAqCi0gKiBVbmRlciBubyBjaXJjdW1zdGFuY2VzIHdpbGwgdGhlIEtocm9ub3MgR3JvdXAsIG9yIGFueSBvZiBpdHMgUHJvbW90ZXJzLCAKLSAqIENvbnRyaWJ1dG9ycyBvciBNZW1iZXJzIG9yIHRoZWlyIHJlc3BlY3RpdmUgcGFydG5lcnMsIG9mZmljZXJzLCBkaXJlY3RvcnMsIAotICogZW1wbG95ZWVzLCBhZ2VudHMgb3IgcmVwcmVzZW50YXRpdmVzIGJlIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMsIHdoZXRoZXIgCi0gKiBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBmb3IgbG9zdCByZXZlbnVlcywgCi0gKiBsb3N0IHByb2ZpdHMsIG9yIG90aGVyd2lzZSwgYXJpc2luZyBmcm9tIG9yIGluIGNvbm5lY3Rpb24gd2l0aCB0aGVzZSAKLSAqIG1hdGVyaWFscy4KLSAqIAotICogS2hyb25vcyBhbmQgT3Blbk1BWCBhcmUgdHJhZGVtYXJrcyBvZiB0aGUgS2hyb25vcyBHcm91cCBJbmMuIAotICoKLSAqLwotICAKLSNpZm5kZWYgX09NWFRZUEVTX0hfCi0jZGVmaW5lIF9PTVhUWVBFU19IXwotCi0jaW5jbHVkZSA8bGltaXRzLmg+IAotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jZGVmaW5lIE9NWF9JTgotI2RlZmluZSBPTVhfT1VUCi0jZGVmaW5lIE9NWF9JTk9VVAotCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgCi0gICAgLyogTWFuZGF0b3J5IHJldHVybiBjb2RlcyAtIHVzZSBjYXNlcyBhcmUgZXhwbGljaXRseSBkZXNjcmliZWQgZm9yIGVhY2ggZnVuY3Rpb24gKi8KLSAgICBPTVhfU3RzX05vRXJyICAgICAgICAgICAgICAgICAgICA9ICAwLCAgICAvKiBObyBlcnJvciwgdGhlIGZ1bmN0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgKi8KLSAgICBPTVhfU3RzX0VyciAgICAgICAgICAgICAgICAgICAgICA9IC0yLCAgICAvKiBVbmtub3duL3Vuc3BlY2lmaWVkIGVycm9yICovICAgIAotICAgIE9NWF9TdHNfSW52YWxpZEJpdHN0cmVhbVZhbEVyciAgID0gLTE4MiwgIC8qIEludmFsaWQgdmFsdWUgZGV0ZWN0ZWQgZHVyaW5nIGJpdHN0cmVhbSBwcm9jZXNzaW5nICovICAgIAotICAgIE9NWF9TdHNfTWVtQWxsb2NFcnIgICAgICAgICAgICAgID0gLTksICAgIC8qIE5vdCBlbm91Z2ggbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIG9wZXJhdGlvbiAqLwotICAgIE9NWF9TdHNBQ0FBQ19HYWluQ3RyRXJyICAgIAkgICAgID0gLTE1OSwgIC8qIEFBQzogVW5zdXBwb3J0ZWQgZ2FpbiBjb250cm9sIGRhdGEgZGV0ZWN0ZWQgKi8KLSAgICBPTVhfU3RzQUNBQUNfUHJnTnVtRXJyICAgICAgICAgICA9IC0xNjcsICAvKiBBQUM6IEludmFsaWQgbnVtYmVyIG9mIGVsZW1lbnRzIGZvciBvbmUgcHJvZ3JhbSAgICovCi0gICAgT01YX1N0c0FDQUFDX0NvZWZWYWxFcnIgICAgICAgICAgPSAtMTYzLCAgLyogQUFDOiBJbnZhbGlkIHF1YW50aXplZCBjb2VmZmljaWVudCB2YWx1ZSAgICAgICAgICAqLyAgICAgCi0gICAgT01YX1N0c0FDQUFDX01heFNmYkVyciAgICAgICAgICAgPSAtMTYyLCAgLyogQUFDOiBJbnZhbGlkIG1heFNmYiB2YWx1ZSBpbiByZWxhdGlvbiB0byBudW1Td2IgKi8gICAgCi0JT01YX1N0c0FDQUFDX1Bsc0RhdGFFcnIJCSAgICAgPSAtMTYwLCAgLyogQUFDOiBwdWxzZSBlc2NhcGUgc2VxdWVuY2UgZGF0YSBlcnJvciAqLwotCi0gICAgLyogT3B0aW9uYWwgcmV0dXJuIGNvZGVzIC0gdXNlIGNhc2VzIGFyZSBleHBsaWNpdGx5IGRlc2NyaWJlZCBmb3IgZWFjaCBmdW5jdGlvbiovCi0gICAgT01YX1N0c19CYWRBcmdFcnIgICAgICAgICAgICAgICAgPSAtNSwgICAgLyogQmFkIEFyZ3VtZW50cyAqLwotCi0gICAgT01YX1N0c0FDQUFDX1Ruc051bUZpbHRFcnIgICAgICAgPSAtMTU3LCAgLyogQUFDOiBJbnZhbGlkIG51bWJlciBvZiBUTlMgZmlsdGVycyAgKi8KLSAgICBPTVhfU3RzQUNBQUNfVG5zTGVuRXJyICAgICAgICAgICA9IC0xNTYsICAvKiBBQUM6IEludmFsaWQgVE5TIHJlZ2lvbiBsZW5ndGggICovICAgCi0gICAgT01YX1N0c0FDQUFDX1Ruc09yZGVyRXJyICAgICAgICAgPSAtMTU1LCAgLyogQUFDOiBJbnZhbGlkIG9yZGVyIG9mIFROUyBmaWx0ZXIgICovICAgICAgICAgICAgICAgICAgCi0gICAgT01YX1N0c0FDQUFDX1Ruc0NvZWZSZXNFcnIgICAgICAgPSAtMTU0LCAgLyogQUFDOiBJbnZhbGlkIGJpdC1yZXNvbHV0aW9uIGZvciBUTlMgZmlsdGVyIGNvZWZmaWNpZW50cyAgKi8KLSAgICBPTVhfU3RzQUNBQUNfVG5zQ29lZkVyciAgICAgICAgICA9IC0xNTMsICAvKiBBQUM6IEludmFsaWQgVE5TIGZpbHRlciBjb2VmZmljaWVudHMgICovICAgICAgICAgICAgICAgICAgCi0gICAgT01YX1N0c0FDQUFDX1Ruc0RpcmVjdEVyciAgICAgICAgPSAtMTUyLCAgLyogQUFDOiBJbnZhbGlkIFROUyBmaWx0ZXIgZGlyZWN0aW9uICAqLyAgCi0KLSAgICBPTVhfU3RzSUNKUF9KUEVHTWFya2VyRXJyICAgICAgICA9IC0xODMsICAvKiBKUEVHIG1hcmtlciBlbmNvdW50ZXJlZCB3aXRoaW4gYW4gZW50cm9weS1jb2RlZCBibG9jazsgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIdWZmbWFuIGRlY29kaW5nIG9wZXJhdGlvbiB0ZXJtaW5hdGVkIGVhcmx5LiAgICAgICAgICAgKi8KLSAgICBPTVhfU3RzSUNKUF9KUEVHTWFya2VyICAgICAgICAgICA9IC0xODEsICAvKiBKUEVHIG1hcmtlciBlbmNvdW50ZXJlZDsgSHVmZm1hbiBkZWNvZGluZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9wZXJhdGlvbiB0ZXJtaW5hdGVkIGVhcmx5LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIE9NWF9TdHNJUFBQX0NvbnRleHRNYXRjaEVyciAgICAgID0gLTE3LCAgIC8qIENvbnRleHQgcGFyYW1ldGVyIGRvZXNuJ3QgbWF0Y2ggdG8gdGhlIG9wZXJhdGlvbiAqLwotCi0gICAgT01YX1N0c1NQX0V2ZW5NZWRpYW5NYXNrU2l6ZUVyciAgPSAtMTgwLCAgLyogRXZlbiBzaXplIG9mIHRoZSBNZWRpYW4gRmlsdGVyIG1hc2sgd2FzIHJlcGxhY2VkIGJ5IHRoZSBvZGQgb25lICovCi0KLSAgICBPTVhfU3RzX01heGltdW1FbnVtZXJhdGlvbiAgICAgICA9IElOVF9NQVggIC8qUGxhY2Vob2xkZXIsIGZvcmNlcyBlbnVtIG9mIHNpemUgT01YX0lOVCovCi0gICAgCi0gfSBPTVhSZXN1bHQ7ICAgICAgICAgIC8qKiBSZXR1cm4gdmFsdWUgb3IgZXJyb3IgdmFsdWUgcmV0dXJuZWQgZnJvbSBhIGZ1bmN0aW9uLiBJZGVudGljYWwgdG8gT01YX0lOVCAqLwotCi0gCi0vKiBPTVhfVTggKi8KLXR5cGVkZWYgdWludDhfdCBPTVhfVTg7Ci0gCi0vKiBPTVhfUzggKi8KLXR5cGVkZWYgaW50OF90IE9NWF9TODsKLSAKLS8qIE9NWF9VMTYgKi8KLXR5cGVkZWYgdWludDE2X3QgT01YX1UxNjsKLQotLyogT01YX1MxNiAqLwotdHlwZWRlZiBpbnQxNl90IE9NWF9TMTY7Ci0KLS8qIE9NWF9VMzIgKi8KLXR5cGVkZWYgdWludDMyX3QgT01YX1UzMjsKLQotLyogT01YX1MzMiAqLwotdHlwZWRlZiBpbnQzMl90IE9NWF9TMzI7Ci0KLS8qIE9NWF9VNjQgJiBPTVhfUzY0ICovCi0jaWYgZGVmaW5lZCggX1dJTjMyICkgfHwgZGVmaW5lZCAoIF9XSU42NCApCi0gICAgdHlwZWRlZiBfX2ludDY0IE9NWF9TNjQ7IC8qKiBTaWduZWQgNjQtYml0IGludGVnZXIgKi8KLSAgICB0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgT01YX1U2NDsgLyoqIFVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCi0gICAgI2RlZmluZSBPTVhfTUlOX1M2NAkJCSgweDgwMDAwMDAwMDAwMDAwMDBpNjQpCi0gICAgI2RlZmluZSBPTVhfTUlOX1U2NAkJCSgweDAwMDAwMDAwMDAwMDAwMDBpNjQpCi0gICAgI2RlZmluZSBPTVhfTUFYX1M2NAkJCSgweDdGRkZGRkZGRkZGRkZGRkZpNjQpCi0gICAgI2RlZmluZSBPTVhfTUFYX1U2NAkJCSgweEZGRkZGRkZGRkZGRkZGRkZpNjQpCi0jZWxzZQotICAgIHR5cGVkZWYgaW50NjRfdCBPTVhfUzY0OyAvKiogU2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCi0gICAgdHlwZWRlZiB1aW50NjRfdCBPTVhfVTY0OyAvKiogVW5zaWduZWQgNjQtYml0IGludGVnZXIgKi8KLSAgICAjZGVmaW5lIE9NWF9NSU5fUzY0CQkJKDB4ODAwMDAwMDAwMDAwMDAwMExMKQotICAgICNkZWZpbmUgT01YX01JTl9VNjQJCQkoMHgwMDAwMDAwMDAwMDAwMDAwTEwpCi0gICAgI2RlZmluZSBPTVhfTUFYX1M2NAkJCSgweDdGRkZGRkZGRkZGRkZGRkZMTCkKLSAgICAjZGVmaW5lIE9NWF9NQVhfVTY0CQkJKDB4RkZGRkZGRkZGRkZGRkZGRkxMKQotI2VuZGlmCi0KLS8qIE9NWF9TQzggKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIE9NWF9TOCBSZTsgLyoqIFJlYWwgcGFydCAqLwotICBPTVhfUzggSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKLQkKLX0gT01YX1NDODsgLyoqIFNpZ25lZCA4LWJpdCBjb21wbGV4IG51bWJlciAqLwotCi0KLS8qIE9NWF9TQzE2ICovCi10eXBlZGVmIHN0cnVjdAotewotICBPTVhfUzE2IFJlOyAvKiogUmVhbCBwYXJ0ICovCi0gIE9NWF9TMTYgSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKLQkKLX0gT01YX1NDMTY7IC8qKiBTaWduZWQgMTYtYml0IGNvbXBsZXggbnVtYmVyICovCi0KLQotLyogT01YX1NDMzIgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIE9NWF9TMzIgUmU7IC8qKiBSZWFsIHBhcnQgKi8KLSAgT01YX1MzMiBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQotCQotfSBPTVhfU0MzMjsgLyoqIFNpZ25lZCAzMi1iaXQgY29tcGxleCBudW1iZXIgKi8KLQotCi0vKiBPTVhfU0M2NCAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgT01YX1M2NCBSZTsgLyoqIFJlYWwgcGFydCAqLwotICBPTVhfUzY0IEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCi0JCi19IE9NWF9TQzY0OyAvKiogU2lnbmVkIDY0LWJpdCBjb21wbGV4IG51bWJlciAqLwotCi0KLS8qIE9NWF9GMzIgKi8KLXR5cGVkZWYgZmxvYXQgT01YX0YzMjsgLyoqIFNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQsSUVFRSA3NTQgKi8KLQotCi0vKiBPTVhfRjY0ICovCi10eXBlZGVmIGRvdWJsZSBPTVhfRjY0OyAvKiogRG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCxJRUVFIDc1NCAqLwotCi0KLS8qIE9NWF9JTlQgKi8KLXR5cGVkZWYgaW50IE9NWF9JTlQ7IC8qKiBzaWduZWQgaW50ZWdlciBjb3JyZXNwb25kaW5nIHRvIG1hY2hpbmUgd29yZCBsZW5ndGgsIGhhcyBtYXhpbXVtIHNpZ25lZCB2YWx1ZSBJTlRfTUFYKi8KLQotCi0jZGVmaW5lIE9NWF9NSU5fUzggIAkgICAJKC0xMjgpCi0jZGVmaW5lIE9NWF9NSU5fVTggIAkJMAotI2RlZmluZSBPTVhfTUlOX1MxNgkJIAkoLTMyNzY4KQotI2RlZmluZSBPTVhfTUlOX1UxNgkJCTAKLSNkZWZpbmUgT01YX01JTl9TMzIJCQkoLTIxNDc0ODM2NDctMSkKLSNkZWZpbmUgT01YX01JTl9VMzIJCQkwCi0KLSNkZWZpbmUgT01YX01BWF9TOAkJCSgxMjcpCi0jZGVmaW5lIE9NWF9NQVhfVTgJCQkoMjU1KQotI2RlZmluZSBPTVhfTUFYX1MxNgkJCSgzMjc2NykKLSNkZWZpbmUgT01YX01BWF9VMTYJCQkoMHhGRkZGKQotI2RlZmluZSBPTVhfTUFYX1MzMgkJCSgyMTQ3NDgzNjQ3KQotI2RlZmluZSBPTVhfTUFYX1UzMgkJCSgweEZGRkZGRkZGKQotCi10eXBlZGVmIHZvaWQgT01YVm9pZDsKLQotI2lmbmRlZiBOVUxMCi0jZGVmaW5lIE5VTEwgKCh2b2lkKikwKQotI2VuZGlmCi0KLS8qKiBEZWZpbmVzIHRoZSBnZW9tZXRyaWMgcG9zaXRpb24gYW5kIHNpemUgb2YgYSByZWN0YW5nbGUsIAotICAqIHdoZXJlIHgseSBkZWZpbmVzIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgdG9wIGxlZnQgY29ybmVyCi0gICogb2YgdGhlIHJlY3RhbmdsZSwgd2l0aCBkaW1lbnNpb25zIHdpZHRoIGluIHRoZSB4LWRpcmVjdGlvbiAKLSAgKiBhbmQgaGVpZ2h0IGluIHRoZSB5LWRpcmVjdGlvbiAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCU9NWF9JTlQgeDsgICAgICAvKiogeC1jb29yZGluYXRlIG9mIHRvcCBsZWZ0IGNvcm5lciBvZiByZWN0YW5nbGUgKi8KLQlPTVhfSU5UIHk7ICAgICAgLyoqIHktY29vcmRpbmF0ZSBvZiB0b3AgbGVmdCBjb3JuZXIgb2YgcmVjdGFuZ2xlICovCi0JT01YX0lOVCB3aWR0aDsgIC8qKiBXaWR0aCBpbiB0aGUgeC1kaXJlY3Rpb24uICovCi0JT01YX0lOVCBoZWlnaHQ7IC8qKiBIZWlnaHQgaW4gdGhlIHktZGlyZWN0aW9uLiAqLwotfU9NWFJlY3Q7Ci0KLQotLyoqIERlZmluZXMgdGhlIGdlb21ldHJpYyBwb3NpdGlvbiBvZiBhIHBvaW50LCAqLwotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gT01YX0lOVCB4OyAvKiogeC1jb29yZGluYXRlICovCi0gT01YX0lOVCB5OwkvKiogeS1jb29yZGluYXRlICovCi0JCi19IE9NWFBvaW50OwotCi0KLS8qKiBEZWZpbmVzIHRoZSBkaW1lbnNpb25zIG9mIGEgcmVjdGFuZ2xlLCBvciByZWdpb24gb2YgaW50ZXJlc3QgaW4gYW4gaW1hZ2UgKi8KLXR5cGVkZWYgc3RydWN0IAotewotIE9NWF9JTlQgd2lkdGg7ICAvKiogV2lkdGggb2YgdGhlIHJlY3RhbmdsZSwgaW4gdGhlIHgtZGlyZWN0aW9uICovCi0gT01YX0lOVCBoZWlnaHQ7IC8qKiBIZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSwgaW4gdGhlIHktZGlyZWN0aW9uICovCi0JCi19IE9NWFNpemU7Ci0KLSNlbmRpZiAvKiBfT01YVFlQRVNfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvb214dHlwZXNfcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9vbXh0eXBlc19zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MWEwMzcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9vbXh0eXBlc19zLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgb214dHlwZXNfcy5oCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgOTY0MQotOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotOy8vIE1hbmRhdG9yeSByZXR1cm4gY29kZXMgLSB1c2UgY2FzZXMgYXJlIGV4cGxpY2l0bHkgZGVzY3JpYmVkIGZvciBlYWNoIGZ1bmN0aW9uIAotT01YX1N0c19Ob0VyciAgICAgICAgICAgICAgICAgICAgRVFVICAwICAgIDsvLyBObyBlcnJvciB0aGUgZnVuY3Rpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseSAKLU9NWF9TdHNfRXJyICAgICAgICAgICAgICAgICAgICAgIEVRVSAtMiAgICA7Ly8gVW5rbm93bi91bnNwZWNpZmllZCBlcnJvciAgICAgCi1PTVhfU3RzX0ludmFsaWRCaXRzdHJlYW1WYWxFcnIgICBFUVUgLTE4MiAgOy8vIEludmFsaWQgdmFsdWUgZGV0ZWN0ZWQgZHVyaW5nIGJpdHN0cmVhbSBwcm9jZXNzaW5nICAgICAKLU9NWF9TdHNfTWVtQWxsb2NFcnIgICAgICAgICAgICAgIEVRVSAtOSAgICA7Ly8gTm90IGVub3VnaCBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgb3BlcmF0aW9uIAotT01YX1N0c0FDQUFDX0dhaW5DdHJFcnIgICAgCSAgICAgRVFVIC0xNTkgIDsvLyBBQUM6IFVuc3VwcG9ydGVkIGdhaW4gY29udHJvbCBkYXRhIGRldGVjdGVkIAotT01YX1N0c0FDQUFDX1ByZ051bUVyciAgICAgICAgICAgRVFVIC0xNjcgIDsvLyBBQUM6IEludmFsaWQgbnVtYmVyIG9mIGVsZW1lbnRzIGZvciBvbmUgcHJvZ3JhbSAgIAotT01YX1N0c0FDQUFDX0NvZWZWYWxFcnIgICAgICAgICAgRVFVIC0xNjMgIDsvLyBBQUM6IEludmFsaWQgcXVhbnRpemVkIGNvZWZmaWNpZW50IHZhbHVlICAgICAgICAgICAgICAgCi1PTVhfU3RzQUNBQUNfTWF4U2ZiRXJyICAgICAgICAgICBFUVUgLTE2MiAgOy8vIEFBQzogSW52YWxpZCBtYXhTZmIgdmFsdWUgaW4gcmVsYXRpb24gdG8gbnVtU3diICAgICAKLU9NWF9TdHNBQ0FBQ19QbHNEYXRhRXJyCQkgICAgIEVRVSAtMTYwICA7Ly8gQUFDOiBwdWxzZSBlc2NhcGUgc2VxdWVuY2UgZGF0YSBlcnJvciAKLQotOy8vIE9wdGlvbmFsIHJldHVybiBjb2RlcyAtIHVzZSBjYXNlcyBhcmUgZXhwbGljaXRseSBkZXNjcmliZWQgZm9yIGVhY2ggZnVuY3Rpb24KLU9NWF9TdHNfQmFkQXJnRXJyICAgICAgICAgICAgICAgIEVRVSAtNSAgICA7Ly8gQmFkIEFyZ3VtZW50cyAKLQotT01YX1N0c0FDQUFDX1Ruc051bUZpbHRFcnIgICAgICAgRVFVIC0xNTcgIDsvLyBBQUM6IEludmFsaWQgbnVtYmVyIG9mIFROUyBmaWx0ZXJzICAKLU9NWF9TdHNBQ0FBQ19UbnNMZW5FcnIgICAgICAgICAgIEVRVSAtMTU2ICA7Ly8gQUFDOiBJbnZhbGlkIFROUyByZWdpb24gbGVuZ3RoICAgICAKLU9NWF9TdHNBQ0FBQ19UbnNPcmRlckVyciAgICAgICAgIEVRVSAtMTU1ICA7Ly8gQUFDOiBJbnZhbGlkIG9yZGVyIG9mIFROUyBmaWx0ZXIgICAgICAgICAgICAgICAgICAgIAotT01YX1N0c0FDQUFDX1Ruc0NvZWZSZXNFcnIgICAgICAgRVFVIC0xNTQgIDsvLyBBQUM6IEludmFsaWQgYml0LXJlc29sdXRpb24gZm9yIFROUyBmaWx0ZXIgY29lZmZpY2llbnRzICAKLU9NWF9TdHNBQ0FBQ19UbnNDb2VmRXJyICAgICAgICAgIEVRVSAtMTUzICA7Ly8gQUFDOiBJbnZhbGlkIFROUyBmaWx0ZXIgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAKLU9NWF9TdHNBQ0FBQ19UbnNEaXJlY3RFcnIgICAgICAgIEVRVSAtMTUyICA7Ly8gQUFDOiBJbnZhbGlkIFROUyBmaWx0ZXIgZGlyZWN0aW9uICAgIAotCi1PTVhfU3RzSUNKUF9KUEVHTWFya2VyRXJyICAgICAgICBFUVUgLTE4MyAgOy8vIEpQRUcgbWFya2VyIGVuY291bnRlcmVkIHdpdGhpbiBhbiBlbnRyb3B5LWNvZGVkIGJsb2NrOyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEh1ZmZtYW4gZGVjb2Rpbmcgb3BlcmF0aW9uIHRlcm1pbmF0ZWQgZWFybHkuICAgICAgICAgICAKLU9NWF9TdHNJQ0pQX0pQRUdNYXJrZXIgICAgICAgICAgIEVRVSAtMTgxICA7Ly8gSlBFRyBtYXJrZXIgZW5jb3VudGVyZWQ7IEh1ZmZtYW4gZGVjb2RpbmcgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBvcGVyYXRpb24gdGVybWluYXRlZCBlYXJseS4gICAgICAgICAgICAgICAgICAgICAgICAgCi1PTVhfU3RzSVBQUF9Db250ZXh0TWF0Y2hFcnIgICAgICBFUVUgLTE3ICAgOy8vIENvbnRleHQgcGFyYW1ldGVyIGRvZXNuJ3QgbWF0Y2ggdG8gdGhlIG9wZXJhdGlvbiAKLQotT01YX1N0c1NQX0V2ZW5NZWRpYW5NYXNrU2l6ZUVyciAgRVFVIC0xODAgIDsvLyBFdmVuIHNpemUgb2YgdGhlIE1lZGlhbiBGaWx0ZXIgbWFzayB3YXMgcmVwbGFjZWQgYnkgdGhlIG9kZCBvbmUgCi0KLU9NWF9TdHNfTWF4aW11bUVudW1lcmF0aW9uICAgICAgIEVRVSAweDdGRkZGRkZGCi0KLQotCi1PTVhfTUlOX1M4ICAgICAgRVFVIAkgICAJKC0xMjgpCi1PTVhfTUlOX1U4ICAJRVFVICAgICAJMAotT01YX01JTl9TMTYJCUVRVSAgICAgIAkoLTMyNzY4KQotT01YX01JTl9VMTYJCUVRVQkgICAgICAgIDAKLQotCi1PTVhfTUlOX1MzMgkJRVFVCSgtMjE0NzQ4MzY0Ny0xKQotT01YX01JTl9VMzIJCUVRVQkwCi0KLU9NWF9NQVhfUzgJCUVRVQkoMTI3KQotT01YX01BWF9VOAkJRVFVCSgyNTUpCi1PTVhfTUFYX1MxNgkJRVFVCSgzMjc2NykKLU9NWF9NQVhfVTE2CQlFUVUJKDB4RkZGRikKLU9NWF9NQVhfUzMyCQlFUVUJKDIxNDc0ODM2NDcpCi1PTVhfTUFYX1UzMgkJRVFVCSgweEZGRkZGRkZGKQotCi1PTVhfVkNfVVBQRVIgICAgRVFVIDB4MSAgICAgICAgICAgICAgICAgOy8vIFVzZWQgYnkgdGhlIFByZWRpY3RJbnRyYSBmdW5jdGlvbnMgICAKLU9NWF9WQ19MRUZUICAgICBFUVUgMHgyICAgICAgICAgICAgICAgICA7Ly8gVXNlZCBieSB0aGUgUHJlZGljdEludHJhIGZ1bmN0aW9ucyAKLU9NWF9WQ19VUFBFUl9SSUdIVCAgICBFUVUgMHg0MCAgICAgICAgICA7Ly8gVXNlZCBieSB0aGUgUHJlZGljdEludHJhIGZ1bmN0aW9ucyAgIAotCi1OVUxMICAgIEVRVSAwCi0KLTsvLyBTdHJ1Y3R1cmVzCi0KLSAgICBJTkNMVURFICAgICBhcm1DT01NX3MuaAotCi0gICAgTV9TVFJVQ1QgICAgT01YUG9pbnQKLSAgICBNX0ZJRUxEICAgICB4LCA0Ci0gICAgTV9GSUVMRCAgICAgeSwgNAotICAgIE1fRU5EU1RSVUNUCi0KLSAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYnVpbGRfdmMucGwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYnVpbGRfdmMucGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVkNjcyYjMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2J1aWxkX3ZjLnBsCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLSMhL3Vzci9iaW4vcGVybAotIwotIyAKLSMgRmlsZSBOYW1lOiAgYnVpbGRfdmMucGwKLSMgT3Blbk1BWCBETDogdjEuMC4yCi0jIFJldmlzaW9uOiAgIDk2NDEKLSMgRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSMgCi0jIAotIyAKLSMKLSMgVGhpcyBmaWxlIGJ1aWxkcyB0aGUgT3Blbk1BWCBETCB2YyBkb21haW4gbGlicmFyeSBvbXhWQy5vLgotIwotCi11c2UgRmlsZTo6U3BlYzsKLXVzZSBzdHJpY3Q7Ci0KLW15ICgkQ0MsICRDQ19PUFRTLCAkQVMsICRBU19PUFRTLCAkTElCLCAkTElCX09QVFMsICRMSUJfVFlQRSk7Ci0KLSRDQyAgICAgICA9ICdhcm1jYyc7Ci0kQ0NfT1BUUyAgPSAnLS1ub191bmFsaWduZWRfYWNjZXNzIC0tY3B1IEFSTTExMzZKLVMgLWMnOwotJEFTICAgICAgID0gJ2FybWFzbSc7Ci0kQVNfT1BUUyAgPSAnLS1ub191bmFsaWduZWRfYWNjZXNzIC0tY3B1IEFSTTExMzZKLVMnOwotIyAkTElCICAgICAgPSAnYXJtbGluayc7Ci0jICRMSUJfT1BUUyA9ICctLXBhcnRpYWwgLW8nOwotIyAkTElCX1RZUEUgPSAnLm8nOwotJExJQiAgICAgID0gJ2FybWFyJzsKLSRMSUJfT1BUUyA9ICctLWNyZWF0ZSAtcic7Ci0kTElCX1RZUEUgPSAnLmEnOwotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLW15IChAaGVhZGVybGlzdCwgQGZpbGVsaXN0LCAkaGQsICRmaWxlLCAkb2ZpbGUsICRjb21tYW5kLCAkb2JqbGlzdCwgJGxpYmZpbGUsICRoKTsKLQotIyBEZWZpbmUgdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgY29udGFpbmluZyBpbmNsdWRlZCBoZWFkZXIgZmlsZXMuCi1AaGVhZGVybGlzdCA9IHF3KGFwaSB2Yy9hcGkgdmMvbTRwMi9hcGkgdmMvbTRwMTAvYXBpKTsKLQotIyBEZWZpbmUgdGhlIGxpc3Qgb2Ygc291cmNlIGZpbGVzIHRvIGNvbXBpbGUuCi1vcGVuKEZJTEVTLCAnPGZpbGVsaXN0X3ZjLnR4dCcpIG9yIGRpZSgiQ2FuJ3Qgb3BlbiBzb3VyY2UgZmlsZSBsaXN0XG4iKTsKLUBmaWxlbGlzdCA9IDxGSUxFUz47Ci1jbG9zZShGSUxFUyk7Ci0KLSMgRml4IHRoZSBmaWxlIHNlcGFyYXRvcnMgaW4gdGhlIGhlYWRlciBwYXRocwotZm9yZWFjaCAkaCAoQGhlYWRlcmxpc3QpCi17Ci0gICAgICAgICRoID0gRmlsZTo6U3BlYy0+Y2Fub25wYXRoKCRoKTsKLX0KLQotIyBDcmVhdGUgdGhlIGluY2x1ZGUgcGF0aCB0byBiZSBwYXNzZWQgdG8gdGhlIGNvbXBpbGVyCi0kaGQgPSAnLUknIC4gam9pbignIC1JJywgQGhlYWRlcmxpc3QpOwotCi0jIENyZWF0ZSB0aGUgYnVpbGQgZGlyZWN0b3JpZXMgIi9saWIvIiBhbmQgIi9vYmovIiAoaWYgdGhleSBhcmUgbm90IHRoZXJlIGFscmVhZHkpCi1ta2RpciAib2JqIiwgMDc3NyBpZiAoISAtZCAib2JqIik7Ci1ta2RpciAibGliIiwgMDc3NyBpZiAoISAtZCAibGliIik7Ci0KLSRvYmpsaXN0ID0gJyc7Ci0KLSMgQ29tcGlsZSBlYWNoIGZpbGUKLWZvcmVhY2ggJGZpbGUgKEBmaWxlbGlzdCkKLXsKLQlteSAkZjsKLQlteSAkYmFzZTsKLQlteSAkZXh0OwotCW15ICRvYmpmaWxlOwotCi0JY2hvbXAoJGZpbGUpOwotCSRmaWxlID0gRmlsZTo6U3BlYy0+Y2Fub25wYXRoKCRmaWxlKTsKLQotCSh1bmRlZiwgdW5kZWYsICRmKSA9IEZpbGU6OlNwZWMtPnNwbGl0cGF0aCgkZmlsZSk7Ci0JaWYoKCRiYXNlLCAkZXh0KSA9ICRmID1+IC8oLispXC4oXHcpJC8pCi0JewotCQkkb2JqZmlsZSA9IEZpbGU6OlNwZWMtPmNhdGZpbGUoJ29iaicsICRiYXNlLicubycpOwotCi0JCWlmKCRleHQgZXEgJ2MnKQotCQl7Ci0JCQkkb2JqbGlzdCAuPSAiJG9iamZpbGUgIjsKLQkJCSRjb21tYW5kID0gJENDLicgJy4kQ0NfT1BUUy4nICcuJGhkLicgLW8gJy4kb2JqZmlsZS4nICcuJGZpbGU7Ci0JCQlwcmludCAiJGNvbW1hbmRcbiI7Ci0JCQlzeXN0ZW0oJGNvbW1hbmQpOwotCQl9Ci0JCWVsc2lmKCRleHQgZXEgJ3MnKQotCQl7Ci0JCQkkb2JqbGlzdCAuPSAiJG9iamZpbGUgIjsKLQkJCSRjb21tYW5kID0gJEFTLicgJy4kQVNfT1BUUy4nICcuJGhkLicgLW8gJy4kb2JqZmlsZS4nICcuJGZpbGU7Ci0JCQlwcmludCAiJGNvbW1hbmRcbiI7Ci0JCQlzeXN0ZW0oJGNvbW1hbmQpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcHJpbnQgIklnbm9yaW5nIGZpbGU6ICRmXG4iOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCWRpZSAiTm8gZmlsZSBleHRlbnNpb24gZm91bmQ6ICRmXG4iOwotCX0KLX0KLQotIyBEbyB0aGUgZmluYWwgbGluayBzdGFnZSB0byBjcmVhdGUgdGhlIGxpYnJhcmllcy4KLSRsaWJmaWxlID0gRmlsZTo6U3BlYy0+Y2F0ZmlsZSgnbGliJywgJ29teFZDJy4kTElCX1RZUEUpOwotJGNvbW1hbmQgPSAkTElCLicgJy4kTElCX09QVFMuJyAnLiRsaWJmaWxlLicgJy4kb2JqbGlzdDsKLXByaW50ICIkY29tbWFuZFxuIjsKLShzeXN0ZW0oJGNvbW1hbmQpID09IDApIGFuZCBwcmludCAiQnVpbGQgc3VjY2Vzc2Z1bFxuIjsKLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2ZpbGVsaXN0X3ZjLnR4dCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9maWxlbGlzdF92Yy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMTYyM2YuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2ZpbGVsaXN0X3ZjLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS4vYXBpL2FybUNPTU0uaAotLi9hcGkvYXJtQ09NTV9CaXREZWNfcy5oCi0uL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oCi0uL2FwaS9hcm1DT01NX0lEQ1Rfcy5oCi0uL2FwaS9hcm1DT01NX0lEQ1RUYWJsZS5oCi0uL2FwaS9hcm1DT01NX01hc2tUYWJsZS5oCi0uL2FwaS9hcm1DT01NX3MuaAotLi9hcGkvYXJtQ09NTV9WZXJzaW9uLmgKLS4vYXBpL2FybU9NWF9SZWxlYXNlVmVyc2lvbi5oCi0uL2FwaS9vbXh0eXBlcy5oCi0uL2FwaS9vbXh0eXBlc19zLmgKLS4vc3JjL2FybUNPTU1fSURDVFRhYmxlLmMKLS4vc3JjL2FybUNPTU1fTWFza1RhYmxlLmMKLS4vdmMvYXBpL2FybVZDLmgKLS4vdmMvYXBpL2FybVZDQ09NTV9zLmgKLS4vdmMvYXBpL29teFZDLmgKLS4vdmMvYXBpL29teFZDX3MuaAotLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTE2eDE2X3MucwotLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OF9zLnMKLS4vdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0lfcy5zCi0uL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5zCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5zCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLnMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MucwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MucwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5zCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9BbGlnbl91bnNhZmVfcy5zCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLnMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLnMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZV9zLnMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLnMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MucwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5zCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1F1YW50VGFibGVzX3MucwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLnMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5zCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLnMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5zCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSV9zLnMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MucwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYV9zLnMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MucwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MucwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MucwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcl9zLnMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MucwotLi92Yy9tNHAyL2FwaS9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKLS4vdmMvbTRwMi9hcGkvYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaAotLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2xpcDhfcy5zCi0uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlX3MucwotLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKLS4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYwotLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpcl9zLnMKLS4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QX3MucwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyX3MucwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTENfcy5zCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQ19zLnMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0ZpbmRNVnByZWRfcy5zCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrX3MucwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUNSZWNvbkJsb2NrX3MucwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhX3MucwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JX3MucwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JX3MucwotLi92Yy9zcmMvYXJtVkNfVmVyc2lvbi5jClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3NyYy9hcm1DT01NLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvc3JjL2FybUNPTU0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThkYmY0MS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvc3JjL2FybUNPTU0uYworKysgL2Rldi9udWxsCkBAIC0xLDk1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtQ09NTS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVmaW5lcyBDb21tb24gQVBJcyB1c2VkIGFjcm9zcyBPcGVuTUFYIEFQSSdzCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAgICAgLyogTWlzY2VsbGFuZW91cyBBcml0aG1ldGljIG9wZXJhdGlvbnMgKi8KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtUm91bmRGbG9hdFRvUzE2Ci0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHNob3J0IGludCBhZnRlciByb3VuZGluZwotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMTYgZm9ybWF0Ci0gKgotICovCi0KLU9NWF9TMTYgYXJtUm91bmRGbG9hdFRvUzE2IChPTVhfRjY0IFZhbHVlKQotewotICAgIGlmIChWYWx1ZSA+IDApCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9TMTYpKFZhbHVlICsgLjUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9TMTYpKFZhbHVlIC0gLjUpOwotICAgIH0KLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtUm91bmRGbG9hdFRvUzMyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIGludCBhZnRlciByb3VuZGluZwotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMzIgZm9ybWF0Ci0gKgotICovCi0KLU9NWF9TMzIgYXJtUm91bmRGbG9hdFRvUzMyIChPTVhfRjY0IFZhbHVlKQotewotICAgIGlmIChWYWx1ZSA+IDApCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9TMzIpKFZhbHVlICsgLjUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9TMzIpKFZhbHVlIC0gLjUpOwotICAgIH0KLX0KLS8qKgotICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1MxNgotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBzaG9ydCBpbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzE2IGZvcm1hdAotICoKLSAqLwotCi1PTVhfUzE2IGFybVNhdFJvdW5kRmxvYXRUb1MxNiAoT01YX0Y2NCBWYWx1ZSkKLXsKLSAgICBpZiAoVmFsdWUgPiAwKQotICAgIHsKLSAgICAgICAgVmFsdWUgKz0gMC41OwotICAgICAgICAKLSAgICAgICAgaWYoVmFsdWUgPiAoT01YX1MxNilPTVhfTUFYX1MxNiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoT01YX1MxNilPTVhfTUFYX1MxNjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoT01YX1MxNilWYWx1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBWYWx1ZSAtPSAwLjU7Ci0KLSAgICAgICAgaWYoVmFsdWUgPCAoT01YX1MxNilPTVhfTUlOX1MxNiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoT01YX1MxNilPTVhfTUlOX1MxNjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoT01YX1MxNilWYWx1ZTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvUzMyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIGludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMzIgZm9ybWF0Ci0gKgotICovCi0KLU9NWF9TMzIgYXJtU2F0Um91bmRGbG9hdFRvUzMyIChPTVhfRjY0IFZhbHVlKQotewotICAgIGlmIChWYWx1ZSA+IDApCi0gICAgewotICAgICAgICBWYWx1ZSArPSAwLjU7Ci0gICAgICAgIAotICAgICAgICBpZihWYWx1ZSA+IChPTVhfUzMyKU9NWF9NQVhfUzMyICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChPTVhfUzMyKU9NWF9NQVhfUzMyOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChPTVhfUzMyKVZhbHVlOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIFZhbHVlIC09IDAuNTsKLQotICAgICAgICBpZihWYWx1ZSA8IChPTVhfUzMyKU9NWF9NSU5fUzMyICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChPTVhfUzMyKU9NWF9NSU5fUzMyOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChPTVhfUzMyKVZhbHVlOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9VMTYKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgdW5zaWduZWQgc2hvcnQgaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1UxNiBmb3JtYXQKLSAqCi0gKi8KLQotT01YX1UxNiBhcm1TYXRSb3VuZEZsb2F0VG9VMTYgKE9NWF9GNjQgVmFsdWUpCi17Ci0gICAgVmFsdWUgKz0gMC41OwotICAgIAotICAgIGlmKFZhbHVlID4gKE9NWF9VMTYpT01YX01BWF9VMTYgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChPTVhfVTE2KU9NWF9NQVhfVTE2OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9VMTYpVmFsdWU7Ci0gICAgfQotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9VMzIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgdW5zaWduZWQgaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1UzMiBmb3JtYXQKLSAqCi0gKi8KLQotT01YX1UzMiBhcm1TYXRSb3VuZEZsb2F0VG9VMzIgKE9NWF9GNjQgVmFsdWUpCi17Ci0gICAgVmFsdWUgKz0gMC41OwotICAgIAotICAgIGlmKFZhbHVlID4gKE9NWF9VMzIpT01YX01BWF9VMzIgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChPTVhfVTMyKU9NWF9NQVhfVTMyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9VMzIpVmFsdWU7Ci0gICAgfQotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1Sb3VuZEZsb2F0VG9TNjQKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgNjQgYml0IGludCBhZnRlciByb3VuZGluZwotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TNjQgZm9ybWF0Ci0gKgotICovCi0KLU9NWF9TNjQgYXJtUm91bmRGbG9hdFRvUzY0IChPTVhfRjY0IFZhbHVlKQotewotICAgIGlmIChWYWx1ZSA+IDApCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9TNjQpKFZhbHVlICsgLjUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9TNjQpKFZhbHVlIC0gLjUpOwotICAgIH0KLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtU2lnbkNoZWNrCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDaGVja3MgdGhlIHNpZ24gb2YgYSB2YXJpYWJsZToKLSAqIHJldHVybnMgMSBpZiBpdCBpcyBQb3NpdGl2ZQotICogcmV0dXJucyAwIGlmIGl0IGlzIDAKLSAqIHJldHVybnMgLTEgaWYgaXQgaXMgTmVnYXRpdmUgCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQkgICAgdmFyICAgICBWYXJpYWJsZSB0byBiZSBjaGVja2VkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX0lOVCAtLSAgIHJldHVybnMgMSBpZiBpdCBpcyBQb3NpdGl2ZQotICogICAgICAgICAgICAgIHJldHVybnMgMCBpZiBpdCBpcyAwCi0gKiAgICAgICAgICAgICAgcmV0dXJucyAtMSBpZiBpdCBpcyBOZWdhdGl2ZSAKLSAqLyAKLQotT01YX0lOVCBhcm1TaWduQ2hlY2sgKAotICAgIE9NWF9TMTYgdmFyCi0pCi0KLXsKLSAgICBPTVhfSU5UIFNpZ247Ci0gICAgCi0gICAgaWYgKHZhciA8IDApCi0gICAgewotICAgICAgICBTaWduID0gLTE7Ci0gICAgfQotICAgIGVsc2UgaWYgKCB2YXIgPiAwKQotICAgIHsKLSAgICAgICAgU2lnbiA9IDE7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIFNpZ24gPSAwOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gU2lnbjsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtQ2xpcAotICoKLSAqIERlc2NyaXB0aW9uOiBDbGlwcyB0aGUgaW5wdXQgYmV0d2VlbiBNQVggYW5kIE1JTiB2YWx1ZQotICogCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBNaW4gICAgIGxvd2VyIGJvdW5kCi0gKiBbaW5dIE1heCAgICAgdXBwZXIgYm91bmQKLSAqIFtpbl0gc3JjICAgICB2YXJpYWJsZSB0byB0aGUgY2xpcHBlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TMzIgLS0gICByZXR1cm5zIGNsaXBwZWQgdmFsdWUKLSAqLyAKLSAKLU9NWF9TMzIgYXJtQ2xpcCAoCi0gICAgT01YX0lOVCBtaW4sCi0gICAgT01YX0lOVCBtYXgsIAotICAgIE9NWF9TMzIgc3JjIAotKQotIAotewotICAgIGlmIChzcmMgPiBtYXgpCi0gICAgewotICAgICAgICBzcmMgPSBtYXg7Ci0gICAgfQotICAgIGVsc2UgaWYgKHNyYyA8IG1pbikKLSAgICB7Ci0gICAgICAgIHNyYyA9IG1pbjsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHNyYzsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtQ2xpcF9GMzIKLSAqCi0gKiBEZXNjcmlwdGlvbjogQ2xpcHMgdGhlIGlucHV0IGJldHdlZW4gTUFYIGFuZCBNSU4gdmFsdWUKLSAqIAotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gTWluICAgICBsb3dlciBib3VuZAotICogW2luXSBNYXggICAgIHVwcGVyIGJvdW5kCi0gKiBbaW5dIHNyYyAgICAgdmFyaWFibGUgdG8gdGhlIGNsaXBwZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfRjMyIC0tICAgcmV0dXJucyBjbGlwcGVkIHZhbHVlCi0gKi8gCi0gCi1PTVhfRjMyIGFybUNsaXBfRjMyICgKLSAgICBPTVhfRjMyIG1pbiwKLSAgICBPTVhfRjMyIG1heCwgCi0gICAgT01YX0YzMiBzcmMgCi0pCi0gCi17Ci0gICAgaWYgKHNyYyA+IG1heCkKLSAgICB7Ci0gICAgICAgIHNyYyA9IG1heDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3JjIDwgbWluKQotICAgIHsKLSAgICAgICAgc3JjID0gbWluOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gc3JjOwotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1TaGlmdFNhdF9GMzIKLSAqCi0gKiBEZXNjcmlwdGlvbjogRGl2aWRlcyBhIGZsb2F0IHZhbHVlIGJ5IDJec2hpZnQgYW5kIAotICogc2F0dXJhdGVzIGl0IGZvciB1bnNpZ25lZCB2YWx1ZSByYW5nZSBmb3Igc2F0Qml0cy4KLSAqIFNlY29uZCBwYXJhbWV0ZXIgaXMgbGlrZSAic2hpZnRpbmciIHRoZSBjb3JyZXNwb25kaW5nIAotICogaW50ZWdlciB2YWx1ZS4gVGFrZXMgY2FyZSBvZiByb3VuZGluZyB3aGlsZSBjbGlwcGluZyB0aGUgZmluYWwgCi0gKiB2YWx1ZS4KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSB2ICAgICAgICAgIE51bWJlciB0byBiZSBvcGVyYXRlZCB1cG9uCi0gKiBbaW5dIHNoaWZ0ICAgICAgRGl2aWRlcyB0aGUgaW5wdXQgInYiIGJ5ICIyXnNoaWZ0IgotICogW2luXSBzYXRCaXRzICAgIEZpbmFsIHJhbmdlIGlzIFswLCAyXnNhdEJpdHMpCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1MzMiAtLSAgIHJldHVybnMgInNoaWZ0ZWQiIHNhdHVyYXRlZCB2YWx1ZQotICovIAotIAotT01YX1UzMiBhcm1TaGlmdFNhdF9GMzIoT01YX0YzMiB2LCBPTVhfSU5UIHNoaWZ0LCBPTVhfSU5UIHNhdEJpdHMpIAotewotICAgIE9NWF9VMzIgYWxsT25lcyA9IChPTVhfVTMyKSgtMSk7Ci0gICAgT01YX1UzMiBtYXhWID0gYWxsT25lcyA+PiAoMzItc2F0Qml0cyk7Ci0gICAgT01YX0YzMiB2U2hpZnRlZCwgdlJvdW5kZWQsIHNoaWZ0RGl2ID0gKE9NWF9GMzIpKDEgPDwgc2hpZnQpOwotICAgIE9NWF9VMzIgdkludDsKLSAgICBPTVhfVTMyIHZJbnRTYXQ7Ci0gICAgCi0gICAgaWYodiA8PSAwKQotICAgICAgICByZXR1cm4gMDsKLSAgICAKLSAgICB2U2hpZnRlZCA9IHYgLyBzaGlmdERpdjsKLSAgICB2Um91bmRlZCA9IChPTVhfRjMyKSh2U2hpZnRlZCArIDAuNSk7Ci0gICAgdkludCA9IChPTVhfVTMyKXZSb3VuZGVkOwotICAgIHZJbnRTYXQgPSB2SW50OwotICAgIGlmKHZJbnRTYXQgPiBtYXhWKSAKLSAgICAgICAgdkludFNhdCA9IG1heFY7Ci0gICAgcmV0dXJuIHZJbnRTYXQ7Ci19Ci0KLS8qKgotICogRnVuY3Rpb25zOiBhcm1Td2FwRWxlbQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhlc2UgZnVuY3Rpb24gc3dhcHMgdHdvIGVsZW1lbnRzIGF0IHRoZSBzcGVjaWZpZWQgcG9pbnRlciBsb2NhdGlvbnMuCi0gKiBUaGUgc2l6ZSBvZiBlYWNoIGVsZW1lbnQgY291bGQgYmUgYW55dGhpbmcgYXMgc3BlY2lmaWVkIGJ5IDxlbGVtU2l6ZT4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhSZXN1bHQgLS0gRXJyb3Igc3RhdHVzIGZyb20gdGhlIGZ1bmN0aW9uCi0gKi8KLU9NWFJlc3VsdCBhcm1Td2FwRWxlbSgKLSAgICAgICAgT01YX1U4ICpwQnVmMSwKLSAgICAgICAgT01YX1U4ICpwQnVmMiwKLSAgICAgICAgT01YX0lOVCBlbGVtU2l6ZQotICAgICAgICkKLXsKLSAgICBPTVhfSU5UIGk7Ci0gICAgT01YX1U4IHRlbXA7Ci0gICAgYXJtUmV0QXJnRXJySWYoIXBCdWYxIHx8ICFwQnVmMiwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIAotICAgIGZvcihpID0gMDsgaSA8IGVsZW1TaXplOyBpKyspCi0gICAgewotICAgICAgICB0ZW1wID0gKihwQnVmMSArIGkpOwotICAgICAgICAqKHBCdWYxICsgaSkgPSAqKHBCdWYyICsgaSk7Ci0gICAgICAgICoocEJ1ZjIgKyBpKSA9IHRlbXA7Ci0gICAgfQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1NZWRpYW5PZjMKLSAqCi0gKiBEZXNjcmlwdGlvbjogRmluZHMgdGhlIG1lZGlhbiBvZiB0aHJlZSBudW1iZXJzCi0gKiAKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gZkVudHJ5ICAgICBGaXJzdCBlbnRyeQotICogW2luXSBzRW50cnkgICAgIHNlY29uZCBlbnRyeQotICogW2luXSB0RW50cnkgICAgIFRoaXJkIGVudHJ5Ci0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1MzMiAtLSAgIHJldHVybnMgdGhlIG1lZGlhbiB2YWx1ZQotICovIAotIAotT01YX1MzMiBhcm1NZWRpYW5PZjMgKAotICAgIE9NWF9TMzIgZkVudHJ5LAotICAgIE9NWF9TMzIgc0VudHJ5LCAKLSAgICBPTVhfUzMyIHRFbnRyeSAKLSkKLXsKLSAgICBPTVhfUzMyIGEsIGIsIGM7Ci0gICAgCi0gICAgYSA9IGFybU1pbiAoZkVudHJ5LCBzRW50cnkpOwotICAgIGIgPSBhcm1NYXggKGZFbnRyeSwgc0VudHJ5KTsKLSAgICBjID0gYXJtTWluIChiLCB0RW50cnkpOwotICAgIHJldHVybiAoYXJtTWF4IChhLCBjKSk7Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybUxvZ1NpemUKLSAqCi0gKiBEZXNjcmlwdGlvbjogRmluZHMgdGhlIHNpemUgb2YgYSBwb3NpdGl2ZSB2YWx1ZSBhbmQgcmV0dXJucyB0aGUgc2FtZQotICogCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHZhbHVlICAgIFBvc2l0aXZlIHZhbHVlCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1U4IC0tICAgICBSZXR1cm5zIHRoZSBtaW5pbXVtIG51bWJlciBvZiBiaXRzIHJlcXVpcmVkIHRvIHJlcHJlc2VudCB0aGUgcG9zaXRpdmUgdmFsdWUuIAotICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBzbWFsbGVzdCBrPj0wIHN1Y2ggdGhhdCB0aGF0IHZhbHVlIGlzIGxlc3MgdGhhbiAoMTw8aykuCi0gKi8gCi0gCi1PTVhfVTggYXJtTG9nU2l6ZSAoCi0gICAgT01YX1UxNiB2YWx1ZSAKLSkKLXsKLSAgICBPTVhfVTggaTsgICAgCi0gICAgZm9yICggaSA9IDA7IHZhbHVlID4gMDsgdmFsdWUgPSB2YWx1ZSA+PiAxKSAKLSAgICB7Ci0gICAgICAgIGkrKzsKLSAgICB9Ci0gICAgcmV0dXJuIGk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICAgICAvKiBTYXR1cmF0aW5nIEFyaXRobWV0aWMgb3BlcmF0aW9ucyAqLwotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRBZGRfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgYWRkaXRpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCi0gKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqIAotICogICAgCi0gKiovCi0gCi1PTVhfUzMyIGFybVNhdEFkZF9TMzIoT01YX1MzMiBWYWx1ZTEsT01YX1MzMiBWYWx1ZTIpCi17Ci0gICAgT01YX1MzMiBSZXN1bHQ7Ci0gICAgCi0gICAgUmVzdWx0ID0gVmFsdWUxICsgVmFsdWUyOwotCi0gICAgaWYoIChWYWx1ZTFeVmFsdWUyKSA+PSAwKQotICAgIHsKLSAgICAgICAgLypTYW1lIHNpZ24qLwotICAgICAgICBpZiggKFJlc3VsdF5WYWx1ZTEpID49IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBub3Qgc2F0dXJhdGVkKi8KLSAgICAgICAgICAgIHJldHVybiBSZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihWYWx1ZTEgPj0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIHBvc2l0aXZlIHNpZGUqLwotICAgICAgICAgICAgICAgIHJldHVybiBPTVhfTUFYX1MzMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIG5lZ2F0aXZlIHNpZGUqLwotICAgICAgICAgICAgICAgIHJldHVybiBPTVhfTUlOX1MzMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIH0KLSAgIAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gUmVzdWx0OwotICAgIH0KLSAgICAKLX0KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0QWRkX1M2NCgpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIGFkZGl0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAotICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAKLSAqICAgIAotICoqLwotIAotT01YX1M2NCBhcm1TYXRBZGRfUzY0KE9NWF9TNjQgVmFsdWUxLE9NWF9TNjQgVmFsdWUyKQotewotICAgIE9NWF9TNjQgUmVzdWx0OwotICAgIAotICAgIFJlc3VsdCA9IFZhbHVlMSArIFZhbHVlMjsKLQotICAgIGlmKCAoVmFsdWUxXlZhbHVlMikgPj0gMCkKLSAgICB7Ci0gICAgICAgIC8qU2FtZSBzaWduKi8KLSAgICAgICAgaWYoIChSZXN1bHReVmFsdWUxKSA+PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKlJlc3VsdCBoYXMgbm90IHNhdHVyYXRlZCovCi0gICAgICAgICAgICByZXR1cm4gUmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYoVmFsdWUxID49IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBwb3NpdGl2ZSBzaWRlKi8KLSAgICAgICAgICAgICAgICBSZXN1bHQgPSBPTVhfTUFYX1M2NDsKLSAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gbmVnYXRpdmUgc2lkZSovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9NSU5fUzY0OwotICAgICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgfQotICAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiBSZXN1bHQ7Ci0gICAgfQotICAgIAotfQotCi0vKiogRnVuY3Rpb24gOmFybVNhdFN1Yl9TMzIoKQotICogCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBzdWJzdHJhY3Rpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCi0gKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqIAotICoqLwotCi1PTVhfUzMyIGFybVNhdFN1Yl9TMzIoT01YX1MzMiBWYWx1ZTEsT01YX1MzMiBWYWx1ZTIpCi17Ci0gICAgT01YX1MzMiBSZXN1bHQ7Ci0gICAgCi0gICAgUmVzdWx0ID0gVmFsdWUxIC0gVmFsdWUyOwotCi0gICAgaWYoIChWYWx1ZTFeVmFsdWUyKSA8IDApCi0gICAgewotICAgICAgICAvKk9wcG9zaXRlIHNpZ24qLwotICAgICAgICBpZiggKFJlc3VsdF5WYWx1ZTEpID49IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBub3Qgc2F0dXJhdGVkKi8KLSAgICAgICAgICAgIHJldHVybiBSZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihWYWx1ZTEgPj0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIHBvc2l0aXZlIHNpZGUqLwotICAgICAgICAgICAgICAgIHJldHVybiBPTVhfTUFYX1MzMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIG5lZ2F0aXZlIHNpZGUqLwotICAgICAgICAgICAgICAgIHJldHVybiBPTVhfTUlOX1MzMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIH0KLSAgIAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gUmVzdWx0OwotICAgIH0KLSAgICAKLX0KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0TWFjX1MzMigpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBNdWx0aXBsaWNhdGlvbiBvZiBWYWx1ZTEgYW5kIFZhbHVlMiBhbmQgc3ViZXNxdWVudCBzYXR1cmF0ZWQKLSAqICAgICBhY2N1bXVsYXRpb24gd2l0aCBNYWMKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCi0gKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAotICogW2luXSBNYWMgICAgICAgICAgQWNjdW11bGF0b3IKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiovCi0KLU9NWF9TMzIgYXJtU2F0TWFjX1MzMihPTVhfUzMyIE1hYyxPTVhfUzE2IFZhbHVlMSxPTVhfUzE2IFZhbHVlMikKLXsKLSAgICBPTVhfUzMyIFJlc3VsdDsKLSAgICAKLSAgICBSZXN1bHQgPSAoT01YX1MzMikoVmFsdWUxKlZhbHVlMik7Ci0gICAgUmVzdWx0ID0gYXJtU2F0QWRkX1MzMiggTWFjICwgUmVzdWx0ICk7Ci0KLSAgICByZXR1cm4gUmVzdWx0OyAgICAKLX0KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0TWFjX1MxNlMzMl9TMzIKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgTUFDIG9wZXJhdGlvbiBvZiB0aGUgdGhyZWUgaW5wdXRzIGRlbGF5RWxlbSwgZmlsVGFwICwgbWFjCi0gKgotICogICBtYWMgPSBtYWMgKyBTYXR1cmF0ZV9pbl8zMkJpdHMoZGVsYXlFbGVtICogZmlsVGFwKQotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gZGVsYXlFbGVtICAgIEZpcnN0IDMyIGJpdCBPcGVyYW5kCi0gKiBbaW5dIGZpbFRhcCAgICAgICBTZWNvbmQgMTYgYml0IE9wZXJhbmQKLSAqIFtpbl0gbWFjICAgICAgICAgIFJlc3VsdCBvZiBNQUMgb3BlcmF0aW9uCi0gKgotICogUmV0dXJuOgotICogW291dF0gIG1hYyAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0gCi1PTVhfUzMyIGFybVNhdE1hY19TMTZTMzJfUzMyKE9NWF9TMzIgbWFjLCBPTVhfUzMyIGRlbGF5RWxlbSwgT01YX1MxNiBmaWxUYXAgKQotewotICAgIAotICAgIE9NWF9TMzIgcmVzdWx0OwotCi0gICAgcmVzdWx0ID0gYXJtU2F0TXVsUzE2UzMyX1MzMihmaWxUYXAsZGVsYXlFbGVtKTsgCi0KLSAgICBpZiAoIHJlc3VsdCA+IE9NWF9NQVhfUzE2ICkKLSAgICB7Ci0gICAgICAgIHJlc3VsdCA9IE9NWF9NQVhfUzMyOwotICAgIH0KLSAgICBlbHNlIGlmKCByZXN1bHQgPCBPTVhfTUlOX1MxNiApCi0gICAgewotICAgICAgICByZXN1bHQgPSBPTVhfTUlOX1MzMjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZGVsYXlFbGVtICogZmlsVGFwOwotICAgIH0KLQotICAgIG1hYyA9IGFybVNhdEFkZF9TMzIobWFjLHJlc3VsdCk7Ci0gICAgCi0gICAgcmV0dXJuIG1hYzsKLX0KLQotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZFJpZ2h0U2hpZnRfUzMyX1MxNgotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHJvdW5kZWQgcmlnaHQgc2hpZnQgb3BlcmF0aW9uIG9mIGlucHV0IGJ5IHRoZSBzY2FsZWZhY3RvcgotICoKLSAqICAgb3V0cHV0ID0gU2F0dXJhdGVfaW5fMTZCaXRzKCAoIFJpZ2h0L0xlZnRTaGlmdCggKFJvdW5kKGlucHV0KSAsIHNoaWZ0ICkgKQotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gaW5wdXQgICAgICAgVGhlIGlucHV0IHRvIGJlIG9wZXJhdGVkIG9uCi0gKiBbaW5dIHNoaWZ0IFRoZSBzaGlmdCBudW1iZXIKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqICAgIAotICoqLwotCi0KLU9NWF9TMTYgYXJtU2F0Um91bmRSaWdodFNoaWZ0X1MzMl9TMTYoT01YX1MzMiBpbnB1dCwgT01YX0lOVCBzaGlmdCkKLXsKLSAgICBpbnB1dCA9IGFybVNhdFJvdW5kTGVmdFNoaWZ0X1MzMihpbnB1dCwtc2hpZnQpOwotCi0gICAgaWYgKCBpbnB1dCA+IE9NWF9NQVhfUzE2ICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1MxNilPTVhfTUFYX1MxNjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXQgPCBPTVhfTUlOX1MxNikKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1MxNilPTVhfTUlOX1MxNjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICByZXR1cm4gKE9NWF9TMTYpaW5wdXQ7Ci0gICAgfQotCi19Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdFJvdW5kTGVmdFNoaWZ0X1MzMigpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0aW5nIGxlZnQtc2hpZnQgb3BlcmF0aW9uIG9uIGlucHV0Ci0gKiAgICAgT3Igcm91bmRlZCBSaWdodCBzaGlmdCBpZiB0aGUgaW5wdXQgU2hpZnQgaXMgbmVnYXRpdmUuCi0gKiAgICAgCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlICAgICAgICBPcGVyYW5kCi0gKiBbaW5dIFNoaWZ0ICAgICAgICBPcGVyYW5kIGZvciBzaGlmdCBvcGVyYXRpb24KLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLQotT01YX1MzMiBhcm1TYXRSb3VuZExlZnRTaGlmdF9TMzIoT01YX1MzMiBWYWx1ZSwgT01YX0lOVCBTaGlmdCkKLXsKLSAgICBPTVhfSU5UIGk7Ci0gICAgCi0gICAgaWYgKFNoaWZ0IDwgMCkKLSAgICB7Ci0gICAgICAgIFNoaWZ0ID0gLVNoaWZ0OwotICAgICAgICBWYWx1ZSA9IGFybVNhdEFkZF9TMzIoVmFsdWUsICgxIDw8IChTaGlmdCAtIDEpKSk7Ci0gICAgICAgIFZhbHVlID0gVmFsdWUgPj4gU2hpZnQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBTaGlmdDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWx1ZSA9IGFybVNhdEFkZF9TMzIoVmFsdWUsIFZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gVmFsdWU7Ci19Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdFJvdW5kTGVmdFNoaWZ0X1M2NCgpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0aW5nIGxlZnQtc2hpZnQgb3BlcmF0aW9uIG9uIGlucHV0Ci0gKiAgICAgT3Igcm91bmRlZCBSaWdodCBzaGlmdCBpZiB0aGUgaW5wdXQgU2hpZnQgaXMgbmVnYXRpdmUuCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBWYWx1ZSAgICAgICAgT3BlcmFuZAotICogW2luXSBzaGlmdCAgICAgICAgT3BlcmFuZCBmb3Igc2hpZnQgb3BlcmF0aW9uCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0gCi1PTVhfUzY0IGFybVNhdFJvdW5kTGVmdFNoaWZ0X1M2NChPTVhfUzY0IFZhbHVlLCBPTVhfSU5UIFNoaWZ0KQotewotICAgIE9NWF9JTlQgaTsKLSAgICAKLSAgICBpZiAoU2hpZnQgPCAwKQotICAgIHsKLSAgICAgICAgU2hpZnQgPSAtU2hpZnQ7Ci0gICAgICAgIFZhbHVlID0gYXJtU2F0QWRkX1M2NChWYWx1ZSwgKChPTVhfUzY0KTEgPDwgKFNoaWZ0IC0gMSkpKTsKLSAgICAgICAgVmFsdWUgPSBWYWx1ZSA+PiBTaGlmdDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IFNoaWZ0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbHVlID0gYXJtU2F0QWRkX1M2NChWYWx1ZSwgVmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBWYWx1ZTsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0TXVsUzE2UzMyX1MzMigpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhIFMxNiBkYXRhIHR5cGUgbXVsdGlwbGllZCB3aXRoIGFuIFMzMiBkYXRhIHR5cGUKLSAqICAgICBpbiBhIFMzMiBjb250YWluZXIKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIGlucHV0MSAgICAgICBPcGVyYW5kIDEKLSAqIFtpbl0gaW5wdXQyICAgICAgIE9wZXJhbmQgMgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqICAgIAotICoqLwotCi0KLU9NWF9TMzIgYXJtU2F0TXVsUzE2UzMyX1MzMihPTVhfUzE2IGlucHV0MSxPTVhfUzMyIGlucHV0MikKLXsKLSAgICBPTVhfUzE2IGhpMixsbzE7Ci0gICAgT01YX1UxNiBsbzI7Ci0gICAgCi0gICAgT01YX1MzMiB0ZW1wMSx0ZW1wMjsKLSAgICBPTVhfUzMyIHJlc3VsdDsKLSAgICAKLSAgICBsbzEgID0gaW5wdXQxOwotCi0gICAgaGkyICA9ICggaW5wdXQyID4+ICAxNiApOwotICAgIGxvMiAgPSAoIChPTVhfVTMyKSggaW5wdXQyIDw8IDE2ICkgPj4gMTYgKTsKLSAgICAKLSAgICB0ZW1wMSA9IGhpMiAqIGxvMTsKLSAgICB0ZW1wMiA9ICggbG8yKiBsbzEgKSA+PiAxNjsKLQotICAgIHJlc3VsdCA9ICBhcm1TYXRBZGRfUzMyKHRlbXAxLHRlbXAyKTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdE11bFMzMlMzMl9TMzIoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYSBTMzIgZGF0YSB0eXBlIG11bHRpcGxpZWQgd2l0aCBhbiBTMzIgZGF0YSB0eXBlCi0gKiAgICAgaW4gYSBTMzIgY29udGFpbmVyCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBpbnB1dDEgICAgICAgT3BlcmFuZCAxCi0gKiBbaW5dIGlucHV0MiAgICAgICBPcGVyYW5kIDIKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLQotT01YX1MzMiBhcm1TYXRNdWxTMzJTMzJfUzMyKE9NWF9TMzIgaW5wdXQxLE9NWF9TMzIgaW5wdXQyKQotewotICAgIE9NWF9TMTYgaGkxLGhpMjsKLSAgICBPTVhfVTE2IGxvMSxsbzI7Ci0gICAgCi0gICAgT01YX1MzMiB0ZW1wMSx0ZW1wMix0ZW1wMzsKLSAgICBPTVhfUzMyIHJlc3VsdDsKLQotICAgIGhpMSAgPSAoIGlucHV0MSA+PiAgMTYgKTsKLSAgICBsbzEgID0gKCAoT01YX1UzMikoIGlucHV0MSA8PCAxNiApID4+IDE2ICk7Ci0KLSAgICBoaTIgID0gKCBpbnB1dDIgPj4gIDE2ICk7Ci0gICAgbG8yICA9ICggKE9NWF9VMzIpKCBpbnB1dDIgPDwgMTYgKSA+PiAxNiApOwotICAgIAotICAgIHRlbXAxID0gICBoaTEgKiBoaTI7Ci0gICAgdGVtcDIgPSAoIGhpMSogbG8yICkgPj4gMTY7Ci0gICAgdGVtcDMgPSAoIGhpMiogbG8xICkgPj4gMTY7Ci0KLSAgICByZXN1bHQgPSBhcm1TYXRBZGRfUzMyKHRlbXAxLHRlbXAyKTsKLSAgICByZXN1bHQgPSBhcm1TYXRBZGRfUzMyKHJlc3VsdCx0ZW1wMyk7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1JbnREaXZBd2F5RnJvbVplcm8oKQotICoKLSAqIERlc2NyaXB0aW9uIDogSW50ZWdlciBkaXZpc2lvbiB3aXRoIHJvdW5kaW5nIHRvIHRoZSBuZWFyZXN0IGludGVnZXIuIAotICogICAgICAgICAgICAgICBIYWxmLWludGVnZXIgdmFsdWVzIGFyZSByb3VuZGVkIGF3YXkgZnJvbSB6ZXJvCi0gKiAgICAgICAgICAgICAgIHVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLiBGb3IgZXhhbXBsZSAzLy8yIGlzIHJvdW5kZWQgCi0gKiAgICAgICAgICAgICAgIHRvIDIsIGFuZCAtMy8vMiBpcyByb3VuZGVkIHRvIC0yLgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gTnVtICAgICAgICBPcGVyYW5kIDEKLSAqIFtpbl0gRGVubyAgICAgICBPcGVyYW5kIDIKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uIGlucHV0MS8vaW5wdXQyCi0gKiAgICAKLSAqKi8KLQotT01YX1MzMiBhcm1JbnREaXZBd2F5RnJvbVplcm8gKE9NWF9TMzIgTnVtLCBPTVhfUzMyIERlbm8pCi17Ci0gICAgT01YX0Y2NCByZXN1bHQ7Ci0gICAgCi0gICAgcmVzdWx0ID0gKChPTVhfRjY0KU51bSkvKChPTVhfRjY0KURlbm8pOwotICAgIAotICAgIGlmIChyZXN1bHQgPj0gMCkKLSAgICB7Ci0gICAgICAgIHJlc3VsdCArPSAwLjU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJlc3VsdCAtPSAwLjU7Ci0gICAgfQotCi0gICAgcmV0dXJuIChPTVhfUzMyKShyZXN1bHQpOwotfQotCi0KLS8qRW5kIG9mIEZpbGUqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvc3JjL2FybUNPTU1fQml0c3RyZWFtLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvc3JjL2FybUNPTU1fQml0c3RyZWFtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZjUzY2EuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3NyYy9hcm1DT01NX0JpdHN0cmVhbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1DT01NX0JpdHN0cmVhbS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVmaW5lcyBiaXRzdHJlYW0gZW5jb2RlIGFuZCBkZWNvZGUgZnVuY3Rpb25zIGNvbW1vbiB0byBhbGwgY29kZWNzCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZpeGVkIGJpdCBsZW5ndGggRGVjb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1Mb29rQWhlYWRCaXRzKCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEdldCB0aGUgbmV4dCBOIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtIHdpdGhvdXQgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICAgICAqKnBwQml0U3RyZWFtCi0gKiBbaW5dICAgICAqcE9mZnNldAotICogW2luXSAgICAgTj0xLi4uMzIKLSAqCi0gKiBSZXR1cm5zICBWYWx1ZQotICovCi0KLU9NWF9VMzIgYXJtTG9va0FoZWFkQml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwgT01YX0lOVCAqcE9mZnNldCwgT01YX0lOVCBOKQotewotICAgIGNvbnN0IE9NWF9VOCAqcEJpdFN0cmVhbSA9ICpwcEJpdFN0cmVhbTsKLSAgICBPTVhfSU5UIE9mZnNldCA9ICpwT2Zmc2V0OwotICAgIE9NWF9VMzIgVmFsdWU7Ci0KLSAgICBhcm1Bc3NlcnQoT2Zmc2V0Pj0wICYmIE9mZnNldDw9Nyk7Ci0gICAgYXJtQXNzZXJ0KE4+PTEgJiYgTjw9MzIpOwotCi0gICAgLyogUmVhZCBuZXh0IDMyIGJpdHMgZnJvbSBzdHJlYW0gKi8KLSAgICBWYWx1ZSA9IChwQml0U3RyZWFtWzBdIDw8IDI0ICkgfCAoIHBCaXRTdHJlYW1bMV0gPDwgMTYpICB8IChwQml0U3RyZWFtWzJdIDw8IDggKSB8IChwQml0U3RyZWFtWzNdKSA7Ci0gICAgVmFsdWUgPSAoVmFsdWUgPDwgT2Zmc2V0ICkgfCAocEJpdFN0cmVhbVs0XSA+PiAoOC1PZmZzZXQpKTsKLQotICAgIC8qIFJldHVybiBOIGJpdHMgKi8KLSAgICByZXR1cm4gVmFsdWUgPj4gKDMyLU4pOwotfQotCi0KLS8qKgotICogRnVuY3Rpb246IGFybUdldEJpdHMoKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUmVhZCBOIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtCi0gKiAgICAKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICAgICAqcHBCaXRTdHJlYW0KLSAqIFtpbl0gICAgICpwT2Zmc2V0Ci0gKiBbaW5dICAgICBOPTEuLjMyCi0gKgotICogW291dF0gICAgKnBwQml0U3RyZWFtCi0gKiBbb3V0XSAgICAqcE9mZnNldAotICogUmV0dXJucyAgVmFsdWUKLSAqLwotCi0KLU9NWF9VMzIgYXJtR2V0Qml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwgT01YX0lOVCAqcE9mZnNldCwgT01YX0lOVCBOKQotewotICAgIGNvbnN0IE9NWF9VOCAqcEJpdFN0cmVhbSA9ICpwcEJpdFN0cmVhbTsKLSAgICBPTVhfSU5UIE9mZnNldCA9ICpwT2Zmc2V0OwotICAgIE9NWF9VMzIgVmFsdWU7Ci0gICAgCi0gICAgaWYoTiA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGFybUFzc2VydChPZmZzZXQ+PTAgJiYgT2Zmc2V0PD03KTsKLSAgICBhcm1Bc3NlcnQoTj49MSAmJiBOPD0zMik7Ci0KLSAgICAvKiBSZWFkIG5leHQgMzIgYml0cyBmcm9tIHN0cmVhbSAqLwotICAgIFZhbHVlID0gKHBCaXRTdHJlYW1bMF0gPDwgMjQgKSB8ICggcEJpdFN0cmVhbVsxXSA8PCAxNikgIHwgKHBCaXRTdHJlYW1bMl0gPDwgOCApIHwgKHBCaXRTdHJlYW1bM10pIDsKLSAgICBWYWx1ZSA9IChWYWx1ZSA8PCBPZmZzZXQgKSB8IChwQml0U3RyZWFtWzRdID4+ICg4LU9mZnNldCkpOwotCi0gICAgLyogQWR2YW5jZSBiaXRzdHJlYW0gcG9pbnRlciBieSBOIGJpdHMgKi8KLSAgICBPZmZzZXQgKz0gTjsKLSAgICAqcHBCaXRTdHJlYW0gPSBwQml0U3RyZWFtICsgKE9mZnNldD4+Myk7Ci0gICAgKnBPZmZzZXQgPSBPZmZzZXQgJiA3OwotCi0gICAgLyogUmV0dXJuIE4gYml0cyAqLwotICAgIHJldHVybiBWYWx1ZSA+PiAoMzItTik7Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybUJ5dGVBbGlnbigpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBBbGlnbiB0aGUgcG9pbnRlciAqcHBCaXRTdHJlYW0gdG8gdGhlIG5leHQgYnl0ZSBib3VuZGFyeQotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICAgICAqcHBCaXRTdHJlYW0KLSAqIFtpbl0gICAgICpwT2Zmc2V0Ci0gKgotICogW291dF0gICAgKnBwQml0U3RyZWFtCi0gKiBbb3V0XSAgICAqcE9mZnNldAotICoKLSAqKi8KLSAKLU9NWFZvaWQgYXJtQnl0ZUFsaWduKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLE9NWF9JTlQgKnBPZmZzZXQpCi17Ci0gICAgaWYoKnBPZmZzZXQgPiAwKQotICAgIHsKLSAgICAgICAgKnBwQml0U3RyZWFtICs9IDE7Ci0gICAgICAgICpwT2Zmc2V0ID0gMDsKLSAgICB9ICAgIAotfQotCi0vKiogCi0gKiBGdW5jdGlvbjogYXJtU2tpcEJpdHMoKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogU2tpcCBOIGJpdHMgZnJvbSB0aGUgdmFsdWUgYXQgKnBwQml0U3RyZWFtCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQotICogW2luXSAgICAgKnBPZmZzZXQKLSAqIFtpbl0gICAgIE4KLSAqCi0gKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KLSAqIFtvdXRdICAgICpwT2Zmc2V0Ci0gKgotICoqLwotCi0KLU9NWFZvaWQgYXJtU2tpcEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCxPTVhfSU5UIE4pCi17Ci0gICAgT01YX0lOVCBPZmZzZXQgPSAqcE9mZnNldDsKLSAgICBjb25zdCBPTVhfVTggKnBCaXRTdHJlYW0gPSAqcHBCaXRTdHJlYW07Ci0gICAKLSAgICAvKiBBZHZhbmNlIGJpdHN0cmVhbSBwb2ludGVyIGJ5IE4gYml0cyAqLwotICAgIE9mZnNldCArPSBOOwotICAgICpwcEJpdFN0cmVhbSA9IHBCaXRTdHJlYW0gKyAoT2Zmc2V0Pj4zKTsKLSAgICAqcE9mZnNldCA9IE9mZnNldCAmIDc7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFZhcmlhYmxlIGJpdCBsZW5ndGggRGVjb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1VblBhY2tWTEMzMigpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBWYXJpYWJsZSBsZW5ndGggZGVjb2RlIG9mIHZhcmlhYmxlIGxlbmd0aCBzeW1ib2wgKG1heCBzaXplIDMyIGJpdHMpIHJlYWQgZnJvbQotICogdGhlIGJpdCBzdHJlYW0gcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gYXQgKnBPZmZzZXQgYnkgdXNpbmcgdGhlIHRhYmxlCi0gKiBwb2ludGVkIGJ5IHBDb2RlQm9vawotICogCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgICAgKnBCaXRTdHJlYW0KLSAqIFtpbl0gICAgICpwT2Zmc2V0Ci0gKiBbaW5dICAgICBwQ29kZUJvb2sKLSAqIAotICogW291dF0gICAgKnBCaXRTdHJlYW0KLSAqIFtvdXRdICAgICpwT2Zmc2V0Ci0gKgotICogUmV0dXJucyA6IENvZGUgQm9vayBJbmRleCBpZiBzdWNjZXNzZnVsbC4gCi0gKiAgICAgICAgIDogQVJNX05PX0NPREVCT09LX0lOREVYID0gLTEgaWYgc2VhcmNoIGZhaWxzLgotICoqLwotI2lmbmRlZiBDX09QVElNSVpFRF9JTVBMRU1FTlRBVElPTiAKLQotT01YX1UxNiBhcm1VblBhY2tWTEMzMigKLSAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwT2Zmc2V0LAotICAgIGNvbnN0IEFSTV9WTEMzMiAqcENvZGVCb29rCi0pCi17ICAgIAotICAgIGNvbnN0IE9NWF9VOCAqcEJpdFN0cmVhbSA9ICpwcEJpdFN0cmVhbTsKLSAgICBPTVhfSU5UIE9mZnNldCA9ICpwT2Zmc2V0OwotICAgIE9NWF9VMzIgVmFsdWU7Ci0gICAgT01YX0lOVCBJbmRleDsKLSAgICAgICAgCi0gICAgYXJtQXNzZXJ0KE9mZnNldD49MCAmJiBPZmZzZXQ8PTcpOwotCi0gICAgLyogUmVhZCBuZXh0IDMyIGJpdHMgZnJvbSBzdHJlYW0gKi8KLSAgICBWYWx1ZSA9IChwQml0U3RyZWFtWzBdIDw8IDI0ICkgfCAoIHBCaXRTdHJlYW1bMV0gPDwgMTYpICB8IChwQml0U3RyZWFtWzJdIDw8IDggKSB8IChwQml0U3RyZWFtWzNdKSA7Ci0gICAgVmFsdWUgPSAoVmFsdWUgPDwgT2Zmc2V0ICkgfCAocEJpdFN0cmVhbVs0XSA+PiAoOC1PZmZzZXQpKTsKLQotICAgIC8qIFNlYXJjaCB0aHJvdWdoIHRoZSBjb2RlYm9vayAqLyAgICAKLSAgICBmb3IgKEluZGV4PTA7IHBDb2RlQm9vay0+Y29kZUxlbiAhPSAwOyBJbmRleCsrKQotICAgIHsKLSAgICAgICAgaWYgKHBDb2RlQm9vay0+Y29kZVdvcmQgPT0gKFZhbHVlID4+ICgzMiAtIHBDb2RlQm9vay0+Y29kZUxlbikpKQotICAgICAgICB7Ci0gICAgICAgICAgICBPZmZzZXQgICAgICAgPSBPZmZzZXQgKyBwQ29kZUJvb2stPmNvZGVMZW47Ci0gICAgICAgICAgICAqcHBCaXRTdHJlYW0gPSBwQml0U3RyZWFtICsgKE9mZnNldCA+PiAzKSA7Ci0gICAgICAgICAgICAqcE9mZnNldCAgICAgPSBPZmZzZXQgJiA3OwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gSW5kZXg7Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgICBwQ29kZUJvb2srKzsKLSAgICB9Ci0KLSAgICAvKiBObyBjb2RlIG1hdGNoIGZvdW5kICovCi0gICAgcmV0dXJuIEFSTV9OT19DT0RFQk9PS19JTkRFWDsKLX0KLQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZpeGVkIGJpdCBsZW5ndGggRW5jb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1QYWNrQml0cwotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGFjayBhIFZMQyBjb2RlIHdvcmQgaW50byB0aGUgYml0c3RyZWFtCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBwcEJpdFN0cmVhbSAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIAotICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0uCi0gKiBbaW5dIHBPZmZzZXQgICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAKLSAqICAgICAgICAgICAgICAgICAgICAgIHRvIDcuCi0gKiBbaW5dIGNvZGVXb3JkICAgICAgICBDb2RlIHdvcmQgdGhhdCBuZWVkIHRvIGJlIGluc2VydGVkIGluIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbQotICogW2luXSBjb2RlTGVuZ3RoICAgICAgTGVuZ3RoIG9mIHRoZSBjb2RlIHdvcmQgdmFsaWQgcmFuZ2UgMS4uLjMyCi0gKgotICogW291dF0gcHBCaXRTdHJlYW0gICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4KLSAqIFtvdXRdIHBCaXRPZmZzZXQgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotICogICAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0gCi1PTVhSZXN1bHQgYXJtUGFja0JpdHMgKAotICAgIE9NWF9VOCAgKipwcEJpdFN0cmVhbSwgCi0gICAgT01YX0lOVCAqcE9mZnNldCwKLSAgICBPTVhfVTMyIGNvZGVXb3JkLCAKLSAgICBPTVhfSU5UIGNvZGVMZW5ndGggCi0pCi17Ci0gICAgT01YX1U4ICAqcEJpdFN0cmVhbSA9ICpwcEJpdFN0cmVhbTsKLSAgICBPTVhfSU5UIE9mZnNldCA9ICpwT2Zmc2V0OwotICAgIE9NWF9VMzIgVmFsdWU7Ci0gICAgICAgIAotICAgIC8qIGNoZWNraW5nIGFyZ3VtZW50IHZhbGlkaXR5ICovCi0gICAgYXJtUmV0QXJnRXJySWYoT2Zmc2V0IDwgMCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKE9mZnNldCA+IDcsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihjb2RlTGVuZ3RoIDwgMSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGNvZGVMZW5ndGggPiAzMiwgT01YX1N0c19CYWRBcmdFcnIpOwotCi0gICAgLyogUHJlcGFyZSB0aGUgZmlyc3QgYnl0ZSAqLwotICAgIGNvZGVXb3JkID0gY29kZVdvcmQgPDwgKDMyLWNvZGVMZW5ndGgpOwotICAgIFZhbHVlID0gKHBCaXRTdHJlYW1bMF0gPj4gKDgtT2Zmc2V0KSkgPDwgKDgtT2Zmc2V0KTsKLSAgICBWYWx1ZSA9IFZhbHVlIHwgKGNvZGVXb3JkID4+ICgyNCtPZmZzZXQpKTsKLQotICAgIC8qIFdyaXRlIG91dCB3aG9sZSBieXRlcyAqLwotICAgIHdoaWxlICg4LU9mZnNldCA8PSBjb2RlTGVuZ3RoKQotICAgIHsKLSAgICAgICAgKnBCaXRTdHJlYW0rKyA9IChPTVhfVTgpVmFsdWU7Ci0gICAgICAgIGNvZGVXb3JkICAgPSBjb2RlV29yZCAgPDwgKDgtT2Zmc2V0KTsKLSAgICAgICAgY29kZUxlbmd0aCA9IGNvZGVMZW5ndGggLSAoOC1PZmZzZXQpOwotICAgICAgICBPZmZzZXQgPSAwOwotICAgICAgICBWYWx1ZSA9IGNvZGVXb3JkID4+IDI0OwotICAgIH0KLQotICAgIC8qIFdyaXRlIG91dCBmaW5hbCBwYXJ0aWFsIGJ5dGUgKi8KLSAgICAqcEJpdFN0cmVhbSAgPSAoT01YX1U4KVZhbHVlOwotICAgICpwcEJpdFN0cmVhbSA9IHBCaXRTdHJlYW07Ci0gICAgKnBPZmZzZXQgPSBPZmZzZXQgKyBjb2RlTGVuZ3RoOwotICAgIAotICAgIHJldHVybiAgT01YX1N0c19Ob0VycjsKLX0KLSAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFZhcmlhYmxlIGJpdCBsZW5ndGggRW5jb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1QYWNrVkxDMzIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBhY2sgYSBWTEMgY29kZSB3b3JkIGludG8gdGhlIGJpdHN0cmVhbQotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcHBCaXRTdHJlYW0JCXBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSAKLSAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtLgotICogW2luXQlwQml0T2Zmc2V0CSAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAKLSAqICAgICAgICAgICAgICAgICAgICAgIHRvIDcuCi0gKiBbaW5dCSBjb2RlICAgICAJCVZMQyBjb2RlIHdvcmQgdGhhdCBuZWVkIHRvIGJlIGluc2VydGVkIGluIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCi0gKgotICogW291dF0gcHBCaXRTdHJlYW0JKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsCi0gKgkgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAotICoJCQkJCQlzdHJlYW0gYnVmZmVyLgotICogW291dF0gcEJpdE9mZnNldAkJKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLSAqCQkJCQkJY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotICoJCQkJCQkqcHBCaXRTdHJlYW0uCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YX1JFU1VMVCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotIAotT01YUmVzdWx0IGFybVBhY2tWTEMzMiAoCi0gICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sIAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgQVJNX1ZMQzMyIGNvZGUgCi0pCi17Ci0gICAgcmV0dXJuIChhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgY29kZS5jb2RlV29yZCwgY29kZS5jb2RlTGVuKSk7Ci19Ci0KLS8qRW5kIG9mIEZpbGUqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3NyYy9hcm1DT01NX0lEQ1RUYWJsZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3NyYy9hcm1DT01NX0lEQ1RUYWJsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjBiODdmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9zcmMvYXJtQ09NTV9JRENUVGFibGUuYworKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1DT01NX0lEQ1RUYWJsZS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiAgIAotICogRmlsZTogYXJtQ09NTV9JRENUVGFibGUuYwotICogQnJpZWY6IERlZmluZXMgVGFibGVzIHVzZWQgaW4gSURDVCBjb21wdXRhdGlvbgotICoKLSAqLwotCi0jaW5jbHVkZSAiYXJtQ09NTV9JRENUVGFibGUuaCIKLQotICAgICAvKiAgVGFibGUgb2Ygcyh1KSpBKHUpKkEodikvMTYgYXQgUTE1Ci0gICAgICAqICBzKHUpPTEuMCAwIDw9IHUgPD0gNQotICAgICAgKiAgcyg2KT0yLjAKLSAgICAgICogIHMoNyk9NC4wCi0gICAgICAqICBBKDApID0gMipzcXJ0KDIpCi0gICAgICAqICBBKHUpID0gNCpjb3ModSpwaS8xNikgIGZvciAodSE9MCkKLQkgICovCi0JICAKLV9fYWxpZ24oNCkgY29uc3QgT01YX1UxNiBhcm1DT01NX0lEQ1RQcmVTY2FsZSBbNjRdID0KLXsKLSAgICAweDQwMDAsIDB4NThjNSwgMHg1MzlmLCAweDRiNDIsIDB4NDAwMCwgMHgzMjQ5LCAweDQ1NDYsIDB4NDZhMSwKLSAgICAweDU4YzUsIDB4N2IyMSwgMHg3M2ZjLCAweDY4NjIsIDB4NThjNSwgMHg0NWJmLCAweDYwMTYsIDB4NjFmOCwKLSAgICAweDUzOWYsIDB4NzNmYywgMHg2ZDQxLCAweDYyNTQsIDB4NTM5ZiwgMHg0MWIzLCAweDVhODIsIDB4NWM0OCwKLSAgICAweDRiNDIsIDB4Njg2MiwgMHg2MjU0LCAweDU4N2UsIDB4NGI0MiwgMHgzYjIxLCAweDUxNzUsIDB4NTMwZCwKLSAgICAweDQwMDAsIDB4NThjNSwgMHg1MzlmLCAweDRiNDIsIDB4NDAwMCwgMHgzMjQ5LCAweDQ1NDYsIDB4NDZhMSwKLSAgICAweDMyNDksIDB4NDViZiwgMHg0MWIzLCAweDNiMjEsIDB4MzI0OSwgMHgyNzgyLCAweDM2NmQsIDB4Mzc3ZSwKLSAgICAweDIyYTMsIDB4MzAwYiwgMHgyZDQxLCAweDI4YmEsIDB4MjJhMywgMHgxYjM3LCAweDI1N2UsIDB4MjYzYSwKLSAgICAweDExYTgsIDB4MTg3ZSwgMHgxNzEyLCAweDE0YzMsIDB4MTFhOCwgMHgwZGUwLCAweDEzMWQsIDB4MTM3ZCAgICAKLX07Ci0gICAgLyogQWJvdmUgYXJyYXkgYXJtQ09NTV9JRENUUHJlU2NhbGUsICBpbiBRMjMgZm9ybWF0ICovCi1jb25zdCBPTVhfVTMyIGFybUNPTU1fSURDVFByZVNjYWxlVTMyIFs2NF0gPQotewotICAgIDB4NDAwMDAwLCAweDU4YzU0MywgMHg1MzllYmEsIDB4NGI0MThjLCAweDQwMDAwMCwgMHgzMjQ4ZDQsIDB4NDU0NWVhLCAweDQ2YTE1NywKLSAgICAweDU4YzU0MywgMHg3YjIwZDgsIDB4NzNmYmZjLCAweDY4NjIxNCwgMHg1OGM1NDMsIDB4NDViZjFmLCAweDYwMTVhNSwgMHg2MWY3OGIsCi0gICAgMHg1MzllYmEsIDB4NzNmYmZjLCAweDZkNDEzZCwgMHg2MjUzYTYsIDB4NTM5ZWJhLCAweDQxYjMyOCwgMHg1YTgyN2EsIDB4NWM0ODY5LAotICAgIDB4NGI0MThjLCAweDY4NjIxNCwgMHg2MjUzYTYsIDB4NTg3ZGUzLCAweDRiNDE4YywgMHgzYjIwZDgsIDB4NTE3NGUwLCAweDUzMGQ2OSwKLSAgICAweDQwMDAwMCwgMHg1OGM1NDMsIDB4NTM5ZWJhLCAweDRiNDE4YywgMHg0MDAwMDAsIDB4MzI0OGQ0LCAweDQ1NDVlYSwgMHg0NmExNTcsCi0gICAgMHgzMjQ4ZDQsIDB4NDViZjFmLCAweDQxYjMyOCwgMHgzYjIwZDgsIDB4MzI0OGQ0LCAweDI3ODIxZCwgMHgzNjZkNzIsIDB4Mzc3ZTZiLAotICAgIDB4MjJhMmY1LCAweDMwMGFkMywgMHgyZDQxM2QsIDB4MjhiYTcwLCAweDIyYTJmNSwgMHgxYjM2YjksIDB4MjU3ZDg2LCAweDI2Mzk4ZCwKLSAgICAweDExYTg1NiwgMHgxODdkZTMsIDB4MTcxMjFhLCAweDE0YzM1YSwgMHgxMWE4NTYsIDB4MGRkZjliLCAweDEzMWNjNywgMHgxMzdjYTIKLX07Ci0gICAKLWNvbnN0IE9NWF9VMTYgYXJtQ09NTV9JRENUQ29lZiBbNF0gPQotewotICAgIDB4NWE4MiwgLyogSW52U3FydDIgKi8KLSAgICAweDMwZmMsIC8qIFNpblBJQnk4ICovCi0gICAgMHg3NjQyLCAvKiBDb3NQSUJ5OCAqLwotICAgIDB4MDAwMCAgICAKLX07Ci0KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvc3JjL2FybUNPTU1fTWFza1RhYmxlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvc3JjL2FybUNPTU1fTWFza1RhYmxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNmE4ZTUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3NyYy9hcm1DT01NX01hc2tUYWJsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtQ09NTV9NYXNrVGFibGUuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIE1hc2sgVGFibGUgdG8gbWFzayB0aGUgZW5kIG9mIGFycmF5LgotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotCi0jZGVmaW5lIE1hc2tUYWJsZVNpemUgNzIKLQotY29uc3QgT01YX1UxNiBhcm1DT01NX3FNYXNrVGFibGUxNltNYXNrVGFibGVTaXplXSA9IAotewotICAgICAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAgICAgMHhGRkZGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgICAgIDB4RkZGRiwgMHhGRkZGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgICAgICAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAgICAgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgICAgIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAKLSAgICAgICAgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHgwMDAwLCAweDAwMDAsIAotICAgICAgICAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4MDAwMCwKLSAgICAgICAgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYgICAgCi19OwotCi1jb25zdCBPTVhfVTggYXJtQ09NTV9xTWFza1RhYmxlOFtNYXNrVGFibGVTaXplXSA9IAotewotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKLSAgICAgICAgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCi0gICAgICAgIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAotICAgICAgICAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKLSAgICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCi0gICAgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsICAKLSAgICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgIAotICAgICAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAKLSAgICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiAgICAKLX07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvYXBpL2FybVZDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvYXBpL2FybVZDLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYmU4YjYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2FwaS9hcm1WQy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE2OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkMuaAotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEZpbGU6IGFybVZpZGVvLmgKLSAqIEJyaWVmOiBEZWNsYXJlcyBBUEkncy9CYXNpYyBEYXRhIHR5cGVzIHVzZWQgYWNyb3NzIHRoZSBPcGVuTUFYIFZpZGVvIGRvbWFpbgotICoKLSAqLwotCi0KLSNpZm5kZWYgX2FybVZpZGVvX0hfCi0jZGVmaW5lIF9hcm1WaWRlb19IXwotCi0jaW5jbHVkZSAib214VkMuaCIKLSNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgotCi0vKioKLSAqIEFSTSBzcGVjaWZpYyBzdGF0ZSBzdHJ1Y3R1cmUgdG8gaG9sZCBNb3Rpb24gRXN0aW1hdGlvbiBpbmZvcm1hdGlvbi4KLSAqLwotIAotc3RydWN0IG00cDJfTUVTcGVjCi17Ci0gICAgT01YVkNNNFAyTUVQYXJhbXMgTUVQYXJhbXM7Ci0gICAgT01YVkNNNFAyTUVNb2RlICAgTUVNb2RlOwotfTsKLQotc3RydWN0IG00cDEwX01FU3BlYwotewotICAgIE9NWFZDTTRQMTBNRVBhcmFtcyBNRVBhcmFtczsKLSAgICBPTVhWQ000UDEwTUVNb2RlICAgTUVNb2RlOwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgbTRwMl9NRVNwZWMgIEFSTVZDTTRQMl9NRVNwZWM7Ci10eXBlZGVmIHN0cnVjdCBtNHAxMF9NRVNwZWMgQVJNVkNNNFAxMF9NRVNwZWM7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9Db21wYXJlTVYKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGNvbXBhcmlzaW9uIG9mIG1vdGlvbiB2ZWN0b3JzIGFuZCBTQUQncyB0byBkZWNpZGUgdGhlCi0gKiBiZXN0IE1WIGFuZCBTQUQKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICAgICBtdlggICAgIHggY29vcmRpbmF0ZSBvZiB0aGUgY2FuZGlkYXRlIG1vdGlvbiB2ZWN0b3IKLSAqIFtpbl0gICAgIG12WSAgICAgeSBjb29yZGluYXRlIG9mIHRoZSBjYW5kaWRhdGUgbW90aW9uIHZlY3RvcgotICogW2luXSAgICAgY2FuZFNBRCBDYW5kaWRhdGUgU0FECi0gKiBbaW5dICAgICBiZXN0TVZYIHggY29vcmRpbmF0ZSBvZiB0aGUgYmVzdCBtb3Rpb24gdmVjdG9yCi0gKiBbaW5dICAgICBiZXN0TVZZIHkgY29vcmRpbmF0ZSBvZiB0aGUgYmVzdCBtb3Rpb24gdmVjdG9yCi0gKiBbaW5dICAgICBiZXN0U0FEIGJlc3QgU0FECi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX0lOVCAtLSAxIHRvIGluZGljYXRlIHRoYXQgdGhlIGN1cnJlbnQgc2FkIGlzIHRoZSBiZXN0Ci0gKiAgICAgICAgICAgIDAgdG8gaW5kaWNhdGUgdGhhdCBpdCBpcyBOT1QgdGhlIGJlc3QgU0FECi0gKi8KLQotT01YX0lOVCBhcm1WQ000UDJfQ29tcGFyZU1WICgKLSAgICBPTVhfUzE2IG12WCwKLSAgICBPTVhfUzE2IG12WSwKLSAgICBPTVhfSU5UIGNhbmRTQUQsCi0gICAgT01YX1MxNiBiZXN0TVZYLAotICAgIE9NWF9TMTYgYmVzdE1WWSwKLSAgICBPTVhfSU5UIGJlc3RTQUQpOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQUNEQ1ByZWRpY3QKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGFkYXB0aXZlIERDL0FDIGNvZWZmaWNpZW50IHByZWRpY3Rpb24gZm9yIGFuIGludHJhIGJsb2NrLiBQcmlvcgotICogdG8gdGhlIGZ1bmN0aW9uIGNhbGwsIHByZWRpY3Rpb24gZGlyZWN0aW9uIChwcmVkRGlyKSBzaG91bGQgYmUgc2VsZWN0ZWQKLSAqIGFzIHNwZWNpZmllZCBpbiBzdWJjbGF1c2UgNy40LjMuMSBvZiBJU08vSUVDIDE0NDk2LTIuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBwU3JjRHN0ICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcXVhbnRpemVkIGNvZWZmaWNpZW50IHJlc2lkdWFscyAoUFFGKSBvZiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJsb2NrCi0gKiBbaW5dIHBQcmVkQnVmUm93IHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXIKLSAqIFtpbl0gcFByZWRCdWZDb2wgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcgotICogW2luXSBjdXJRUCAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBjdXJRUAotICogICAgICAgICAgICAgICAgICAgICAgICAgIG1heSBlcXVhbCB0byBwcmVkUVAgZXNwZWNpYWxseSB3aGVuIHRoZSBjdXJyZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sgYW5kIHRoZSBwcmVkaWN0b3IgYmxvY2sgYXJlIGluIHRoZSBzYW1lCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9jay4KLSAqIFtpbl0gcHJlZFFQICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrCi0gKiBbaW5dIHByZWREaXIgICAgIGluZGljYXRlcyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggdGFrZXMgb25lCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX0hPUklaT05UQUwgICAgcHJlZGljdCBob3Jpem9udGFsbHkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fVkVSVElDQUwgICAgICBwcmVkaWN0IHZlcnRpY2FsbHkKLSAqIFtpbl0gQUNQcmVkRmxhZyAgYSBmbGFnIGluZGljYXRpbmcgaWYgQUMgcHJlZGljdGlvbiBzaG91bGQgYmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtZWQuIEl0IGlzIGVxdWFsIHRvIGFjX3ByZWRfZmxhZyBpbiB0aGUgYml0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIHN5bnRheCBvZiBNUEVHLTQKLSAqIFtpbl0gdmlkZW9Db21wICAgdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSwgY2hyb21pbmFuY2Ugb3IKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSkgb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqIFtpbl0gZmxhZyAgICAgICAgVGhpcyBmbGFnIGRlZmluZXMgdGhlIGlmIG9uZSB3YW50cyB0byB1c2UgdGhpcyBmdW5jdGlvbnMgdG8KLSAqICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlIFBRRiAoc2V0IDEsIHByZWRpY3Rpb24pIG9yIFFGIChzZXQgMCwgcmVjb25zdHJ1Y3Rpb24pCi0gKiBbb3V0XSAgICBwUHJlQUNQcmVkaWN0ICAgcG9pbnRlciB0byB0aGUgcHJlZGljdGVkIGNvZWZmaWNpZW50cyBidWZmZXIuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsbGVkIE9OTFkgaWYgaXQgaXMgbm90IE5VTEwKLSAqIFtvdXRdICAgIHBTcmNEc3QgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucwotICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBxdWFudGl6ZWQgY29lZmZpY2llbnRzIChRRikgb2YgdGhlIGN1cnJlbnQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jawotICogW291dF0gICAgcFByZWRCdWZSb3cgcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyCi0gKiBbb3V0XSAgICBwUHJlZEJ1ZkNvbCBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIKLSAqIFtvdXRdICAgIHBTdW1FcnIgICAgIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgc3VtIG9mIHRoZSBkaWZmZXJlbmNlCi0gKiAgICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuIHByZWRpY3RlZCBhbmQgdW5wcmVkaWN0ZWQgY29lZmZpY2llbnRzCi0gKiAgICAgICAgICAgICAgICAgICAgICBJZiB0aGlzIGlzIE5VTEwsIGRvIG5vdCB1cGRhdGUKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9BQ0RDUHJlZGljdCgKLSAgICAgT01YX1MxNiAqIHBTcmNEc3QsCi0gICAgIE9NWF9TMTYgKiBwUHJlQUNQcmVkaWN0LAotICAgICBPTVhfUzE2ICogcFByZWRCdWZSb3csCi0gICAgIE9NWF9TMTYgKiBwUHJlZEJ1ZkNvbCwKLSAgICAgT01YX0lOVCBjdXJRUCwKLSAgICAgT01YX0lOVCBwcmVkUVAsCi0gICAgIE9NWF9JTlQgcHJlZERpciwKLSAgICAgT01YX0lOVCBBQ1ByZWRGbGFnLAotICAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCAgdmlkZW9Db21wLAotICAgICBPTVhfVTggZmxhZywKLSAgICAgT01YX0lOVCAqcFN1bUVycgotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX1NldFByZWREaXIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGRldGVjdGluZyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIGJsb2NrSW5kZXggIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uIGFzIGRlZmluZWQgaW4gc3ViY2xhdXNlIDYuMS4zLjgsIG9mIElTTy9JRUMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAxNDQ5Ni0yLiBGdXJ0aGVybW9yZSwgaW5kZXhlcyA2IHRvIDkgaW5kaWNhdGUgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgYmxvY2tzIHNwYXRpYWxseSBjb3JyZXNwb25kaW5nIHRvIGx1bWluYW5jZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrcyAwIHRvIDMgaW4gdGhlIHNhbWUgbWFjcm9ibG9jay4KLSAqIFtpbl0gcENvZWZCdWZSb3cgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgotICogW2luXSBwUXBCdWYgICAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlcgotICogW291dF0gICAgcHJlZFFQICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrCi0gKiBbb3V0XSAgICBwcmVkRGlyICAgICBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgotICogICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19IT1JJWk9OVEFMICAgIHByZWRpY3QgaG9yaXpvbnRhbGx5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX1ZFUlRJQ0FMICAgICAgcHJlZGljdCB2ZXJ0aWNhbGx5Ci0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfU2V0UHJlZERpcigKLSAgICAgT01YX0lOVCBibG9ja0luZGV4LAotICAgICBPTVhfUzE2ICpwQ29lZkJ1ZlJvdywKLSAgICAgT01YX1MxNiAqcENvZWZCdWZDb2wsCi0gICAgIE9NWF9JTlQgKnByZWREaXIsCi0gICAgIE9NWF9JTlQgKnByZWRRUCwKLSAgICAgY29uc3QgT01YX1U4ICpwUXBCdWYKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmEKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGVuY29kaW5nIGZvciBvbmUgaW50cmEgYmxvY2suCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBwcEJpdFN0cmVhbSAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXQgc3RyZWFtCi0gKiBbaW5dIHBCaXRPZmZzZXQgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcuCi0gKiBbaW5dIHBRRGN0QmxrQ29lZiAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50Ci0gKiBbaW5dIHByZWREaXIgICAgICAgICBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiwgd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHppZ3phZyBzY2FuIHBhdHRlcm4uIFRoaXMgdGFrZXMgb25lIG9mIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgdmFsdWVzOgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fTk9ORSAgICAgICAgICBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW4uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19IT1JJWk9OVEFMICAgIEhvcml6b250YWwgcHJlZGljdGlvbi4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fVkVSVElDQUwgICAgICBWZXJ0aWNhbCBwcmVkaWN0aW9uLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aWd6YWcgc2Nhbi4KLSAqIFtpbl0gcGF0dGVybiAgICAgICAgIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGJsb2NrIGlzIGVuY29kZWQKLSAqIFtpbl0gc3RhcnQgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAwdGggZWxlbWVudAotICogICAgICAgICAgICAgICAgICAgICAgb3IgMXN0LgotICogW291dF0gICAgcHBCaXRTdHJlYW0gICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4KLSAqIFtvdXRdICAgIHBCaXRPZmZzZXQgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmEoCi0gICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCi0gICAgIE9NWF9VOCBwcmVkRGlyLAotICAgICBPTVhfVTggcGF0dGVybiwKLSAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAotICAgICBPTVhfVTggc3RhcnQKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmEKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3Igb25lIGludHJhIGNvZGVkIGJsb2NrLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gcHBCaXRTdHJlYW0gICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0c3RyZWFtIGJ1ZmZlcgotICogW2luXSBwQml0T2Zmc2V0ICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAtN10uCi0gKiBbaW5dIHByZWREaXIgICAgICAgICBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgemlnemFnIHNjYW4gcGF0dGVybi4gSXQgdGFrZXMgb25lIG9mIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgdmFsdWVzOgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fTk9ORSAgQUMgcHJlZGljdGlvbiBub3QgdXNlZDsKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm0gY2xhc3NpY2FsIHppZ3phZyBzY2FuOwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fSE9SSVpPTlRBTCAgICBIb3Jpem9udGFsIHByZWRpY3Rpb247Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm0gYWx0ZXJuYXRlLXZlcnRpY2FsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuOwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fVkVSVElDQUwgICAgICBWZXJ0aWNhbCBwcmVkaWN0aW9uOwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHVzIHBlcmZvcm0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0ZXJuYXRlLWhvcml6b250YWwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlnemFnIHNjYW4uCi0gKiBbaW5dIHZpZGVvQ29tcCAgICAgICB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlLCBjaHJvbWluYW5jZSBvcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSkgb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KLSAqIFtpbl0gc3RhcnQgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAwdGggZWxlbWVudAotICogICAgICAgICAgICAgICAgICAgICAgb3IgMXN0LgotICogW291dF0gICAgcHBCaXRTdHJlYW0gICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlcgotICogW291dF0gICAgcEJpdE9mZnNldCAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtCi0gKiBbb3V0XSAgICBwRHN0ICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2suIFNob3VsZCBiZSAzMi1iaXQgYWxpZ25lZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYSgKLSAgICAgY29uc3QgT01YX1U4ICoqIHBwQml0U3RyZWFtLAotICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKLSAgICAgT01YX1MxNiAqIHBEc3QsCi0gICAgIE9NWF9VOCBwcmVkRGlyLAotICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsIAotICAgICBPTVhfVTggIHN0YXJ0Ci0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlcgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgZmlsbGluZyBvZiB0aGUgY29lZmZpY2llbnQgYnVmZmVyIGFjY29yZGluZyB0byB0aGUgcnVuLCBsZXZlbAotICogYW5kIHNpZ24sIGFsc28gdXBkYXRlcyB0aGUgaW5kZXgKLSAqIAotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIHN0b3JlUnVuICAgICAgICBTdG9yZWQgUnVuIHZhbHVlIChjb3VudCBvZiB6ZXJvcykgICAKLSAqIFtpbl0gIHN0b3JlTGV2ZWwgICAgICBTdG9yZWQgTGV2ZWwgdmFsdWUgKG5vbi16ZXJvIHZhbHVlKQotICogW2luXSAgc2lnbiAgICAgICAgICAgIEZsYWcgaW5kaWNhdGluZyB0aGUgc2lnbiBvZiBsZXZlbAotICogW2luXSAgbGFzdCAgICAgICAgICAgIHN0YXR1cyBvZiB0aGUgbGFzdCBmbGFnCi0gKiBbaW5dICBwSW5kZXggICAgICAgICAgcG9pbnRlciB0byBjb2VmZmljaWVudCBpbmRleCBpbiA4eDggbWF0cml4Ci0gKiBbb3V0XSBwSW5kZXggICAgICAgICAgcG9pbnRlciB0byB1cGRhdGVkIGNvZWZmaWNpZW50IGluZGV4IGluIDh4OCAKLSAqICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXgKLSAqIFtpbl0gIHBaaWd6YWdUYWJsZSAgICBwb2ludGVyIHRvIHRoZSB6aWd6YWcgdGFibGVzCi0gKiBbb3V0XSBwRHN0ICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKLSAqICAgICAgICAgICAgICAgICAgICAgICBibG9jay4gU2hvdWxkIGJlIDMyLWJpdCBhbGlnbmVkCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyKAotICAgIE9NWF9VMzIgc3RvcmVSdW4sCi0gICAgT01YX1MxNiAqIHBEc3QsCi0gICAgT01YX1MxNiBzdG9yZUxldmVsLAotICAgIE9NWF9VOCAgc2lnbiwKLSAgICBPTVhfVTggIGxhc3QsCi0gICAgT01YX1U4ICAqIGluZGV4LAotICAgIGNvbnN0IE9NWF9VOCAqIHBaaWd6YWdUYWJsZQotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0dldFZMQ0JpdHMKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGVzY2FwZSBtb2RlIGRlY2lzaW9uIGJhc2VkIG9uIHRoZSBydW4sIHJ1bissIGxldmVsLCBsZXZlbCsgYW5kIAotICogbGFzdCBjb21iaW5hdGlvbnMuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi0gKgkJCQkJCQkJdGhlIGJpdCBzdHJlYW0KLSAqIFtpbl0JcEJpdE9mZnNldAkJcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLSAqCQkJCQkJCQlieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcKLSAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KLSAqIFtpbl0gc3RhcnQgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAKLSAqICAgICAgICAgICAgICAgICAgICAgIDB0aCBlbGVtZW50IG9yIDFzdC4KLSAqIFtpbi9vdXRdIHBMYXN0ICAgICAgIHBvaW50ZXIgdG8gbGFzdCBzdGF0dXMgZmxhZwotICogW2luXSBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwICAgICAgVGhlIHJ1biB2YWx1ZSBmcm9tIHdoaWNoIGxldmVsIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiBsYXN0ID09IDAKLSAqIFtpbl0gSW5kZXhCZWdpblNpbmdsZUxldmVsRW50cmllc0wwICAgIEFycmF5IGluZGV4IGluIHRoZSBWTEMgdGFibGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGluZyB0byB0aGUgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCAKLSAqIFtpbl0gcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMSAgICAgIFRoZSBydW4gdmFsdWUgZnJvbSB3aGljaCBsZXZlbCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogbGFzdCA9PSAxCi0gKiBbaW5dIEluZGV4QmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMSAgICBBcnJheSBpbmRleCBpbiB0aGUgVkxDIHRhYmxlIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRpbmcgdG8gdGhlICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAgCi0gKiBbaW5dIHBSdW5JbmRleFRhYmxlTDAgICAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKLSAqIFtpbl0gcFZsY1RhYmxlTDAgICAgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMAotICogW2luXSBwUnVuSW5kZXhUYWJsZUwxICAgIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCi0gKiBbaW5dIHBWbGNUYWJsZUwxICAgICAgICAgVkxDIHRhYmxlIGZvciBsYXN0ID09IDEKLSAqIFtpbl0gcExNQVhUYWJsZUwwICAgICAgICBMZXZlbCBNQVggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAotICogW2luXSBwTE1BWFRhYmxlTDEgICAgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCi0gKiBbaW5dIHBSTUFYVGFibGVMMCAgICAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCi0gKiBbaW5dIHBSTUFYVGFibGVMMSAgICAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCi0gKiBbb3V0XXBEc3QJCQkgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKLSAqCQkJCQkJCWJsb2NrLiBTaG91bGQgYmUgMzItYml0IGFsaWduZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9HZXRWTENCaXRzICgKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgICAgICAgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAotCQkJICBPTVhfUzE2ICogcERzdCwKLQkJCSAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAotCQkJICBPTVhfVTggICAgc3RhcnQsCQkJICAKLQkJCSAgT01YX1U4ICAqIHBMYXN0LAotCQkJICBPTVhfVTggICAgcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCwKLQkJCSAgT01YX1U4ICAgIG1heEluZGV4Rm9yTXVsdGlwbGVFbnRyaWVzTDAsCi0JCQkgIE9NWF9VOCAgICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMSwKLQkJCSAgT01YX1U4ICAgIG1heEluZGV4Rm9yTXVsdGlwbGVFbnRyaWVzTDEsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwwLAotICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwwLAotCQkJICBjb25zdCBPTVhfVTggICogcFJ1bkluZGV4VGFibGVMMSwKLSAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGVMMSwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMCwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMSwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMCwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMSwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBaaWd6YWdUYWJsZQotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX1B1dFZMQ0JpdHMKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENoZWNrcyB0aGUgdHlwZSBvZiBFc2NhcGUgTW9kZSBhbmQgcHV0IGVuY29kZWQgYml0cyBmb3IgCi0gKiBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50cy4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCSBwcEJpdFN0cmVhbSAgICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgotICoJCQkJCQkgIHRoZSBiaXQgc3RyZWFtCi0gKiBbaW5dCSBwQml0T2Zmc2V0ICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNwotICogW2luXSBzaG9ydFZpZGVvSGVhZGVyIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgotICogW2luXSAgc3RhcnQgICAgICAgICAgICBzdGFydCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZW5jb2RpbmcgYmVnaW5zIHdpdGggCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIDB0aCBlbGVtZW50IG9yIDFzdC4KLSAqIFtpbl0gIG1heFN0b3JlUnVuTDAgICAgTWF4IHN0b3JlIHBvc3NpYmxlIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGxhc3QgPSAwCi0gKiBbaW5dICBtYXhTdG9yZVJ1bkwxICAgIE1heCBzdG9yZSBwb3NzaWJsZSAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsYXN0ID0gMQotICogW2luXSAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpIGZvciBsYXN0ID0gMAotICogW2luXSAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDEgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpIGZvciBsYXN0ID0gMQotICogW2luXSAgcFJ1bkluZGV4VGFibGVMMCBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKLSAqIFtpbl0gIHBWbGNUYWJsZUwwICAgICAgVkxDIHRhYmxlIGZvciBsYXN0ID09IDAKLSAqIFtpbl0gIHBSdW5JbmRleFRhYmxlTDEgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCi0gKiBbaW5dICBwVmxjVGFibGVMMSAgICAgIFZMQyB0YWJsZSBmb3IgbGFzdCA9PSAxCi0gKiBbaW5dICBwTE1BWFRhYmxlTDAgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAotICogW2luXSAgcExNQVhUYWJsZUwxICAgICBMZXZlbCBNQVggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKLSAqIFtpbl0gIHBSTUFYVGFibGVMMCAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAotICogW2luXSAgcFJNQVhUYWJsZUwxICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCi0gKiBbb3V0XSBwUURjdEJsa0NvZWYgICAgIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQKLSAqIFtvdXRdIHBwQml0U3RyZWFtICAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuCi0gKiBbb3V0XSBwQml0T2Zmc2V0ICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfUHV0VkxDQml0cyAoCi0gICAgICAgICAgICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgICAgICAgICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAotICAgICAgICAgICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCi0gICAgICAgICAgICAgIE9NWF9VOCBzdGFydCwKLSAgICAgICAgICAgICAgT01YX1U4IG1heFN0b3JlUnVuTDAsCi0gICAgICAgICAgICAgIE9NWF9VOCBtYXhTdG9yZVJ1bkwxLAotICAgICAgICAgICAgICBPTVhfVTggIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wwLAotICAgICAgICAgICAgICBPTVhfVTggIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wxLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJ1bkluZGV4VGFibGVMMCwKLSAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGVMMCwKLQkJCSAgY29uc3QgT01YX1U4ICAqIHBSdW5JbmRleFRhYmxlTDEsCi0gICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlTDEsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwTE1BWFRhYmxlTDAsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwTE1BWFRhYmxlTDEsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUk1BWFRhYmxlTDAsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUk1BWFRhYmxlTDEsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwWmlnemFnVGFibGUKLSk7Ci0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfRmlsbFZMQ0J1ZmZlcgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgY2FsY3VsYXRpbmcgdGhlIFZMQyBiaXRzIGRlcGVuZGluZyBvbiB0aGUgZXNjYXBlIHR5cGUgYW5kIGluc2VydCAKLSAqIHRoZSBzYW1lIGluIHRoZSBiaXRzdHJlYW0KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCSBwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi0gKgkgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0IHN0cmVhbQotICogW2luXQkgcEJpdE9mZnNldCAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3Ci0gKiBbaW5dICBydW4gICAgICAgICAgICAgICAgUnVuIHZhbHVlIChjb3VudCBvZiB6ZXJvcykgdG8gYmUgZW5jb2RlZCAgCi0gKiBbaW5dICBsZXZlbCAgICAgICAgICAgICAgTGV2ZWwgdmFsdWUgKG5vbi16ZXJvIHZhbHVlKSB0byBiZSBlbmNvZGVkCi0gKiBbaW5dICBydW5QbHVzICAgICAgICAgICAgQ2FsY3VsYXRlZCBhcyBydW5QbHVzID0gcnVuIC0gKFJNQVggKyAxKSAgCi0gKiBbaW5dICBsZXZlbFBsdXMgICAgICAgICAgQ2FsY3VsYXRlZCBhcyAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFBsdXMgPSBzaWduKGxldmVsKSpbYWJzKGxldmVsKSAtIExNQVhdCi0gKiBbaW5dICBmTW9kZSAgICAgICAgICAgICAgRmxhZyBpbmRpY2F0aW5nIHRoZSBlc2NhcGUgbW9kZXMKLSAqIFtpbl0gIGxhc3QgICAgICAgICAgICAgICBzdGF0dXMgb2YgdGhlIGxhc3QgZmxhZwotICogW2luXSAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgd2lsbCBiZSBlcXVhbCB0byAxOiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKQotICogW2luXSAgcFJ1bkluZGV4VGFibGUgICAgIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfdGFibGVzX1ZMQy5oCi0gKiBbaW5dICBwVmxjVGFibGUgICAgICAgICAgVkxDIHRhYmxlIGRlZmluZWQgaW4gYXJtVkNNNFAyX0h1ZmZfdGFibGVzX1ZMQy5oCi0gKiBbb3V0XSBwcEJpdFN0cmVhbQkJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyLgotICogW291dF0gcEJpdE9mZnNldCAgICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotICogICAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9GaWxsVkxDQnVmZmVyICgKLSAgICAgICAgICAgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgICAgICAgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAotICAgICAgICAgICAgICBPTVhfVTMyIHJ1biwKLSAgICAgICAgICAgICAgT01YX1MxNiBsZXZlbCwgCi0JCQkgIE9NWF9VMzIgcnVuUGx1cywKLSAgICAgICAgICAgICAgT01YX1MxNiBsZXZlbFBsdXMsIAotICAgICAgICAgICAgICBPTVhfVTggIGZNb2RlLAotCQkJICBPTVhfVTggIGxhc3QsCi0gICAgICAgICAgICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzLCAKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqcFJ1bkluZGV4VGFibGUsCi0gICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlCi0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQ2hlY2tWTENFc2NhcGVNb2RlCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBlc2NhcGUgbW9kZSBkZWNpc2lvbiBiYXNlZCBvbiB0aGUgcnVuLCBydW4rLCBsZXZlbCwgbGV2ZWwrIGFuZCAKLSAqIGxhc3QgY29tYmluYXRpb25zLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gcnVuICAgICAgICAgICAgIFJ1biB2YWx1ZSAoY291bnQgb2YgemVyb3MpIHRvIGJlIGVuY29kZWQgIAotICogW2luXSBsZXZlbCAgICAgICAgICAgTGV2ZWwgdmFsdWUgKG5vbi16ZXJvIHZhbHVlKSB0byBiZSBlbmNvZGVkCi0gKiBbaW5dIHJ1blBsdXMgICAgICAgICBDYWxjdWxhdGVkIGFzIHJ1blBsdXMgPSBydW4gLSAoUk1BWCArIDEpICAKLSAqIFtpbl0gbGV2ZWxQbHVzICAgICAgIENhbGN1bGF0ZWQgYXMgCi0gKiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFBsdXMgPSBzaWduKGxldmVsKSpbYWJzKGxldmVsKSAtIExNQVhdCi0gKiBbaW5dIG1heFN0b3JlUnVuICAgICBNYXggc3RvcmUgcG9zc2libGUgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhKQotICogW2luXSBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMgCi0gKiAgICAgICAgICAgICAgICAgICAgICBUaGUgcnVuIHZhbHVlIGFmdGVyIHdoaWNoIGxldmVsIAotICogICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiAKLSAqICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpCi0gKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCi0gKiBbaW5dIHBSdW5JbmRleFRhYmxlICBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYwotICogICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykKLSAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAKLSAqIFJldHVybiBWYWx1ZToKLSAqIFJldHVybnMgYW4gRXNjYXBlIG1vZGUgd2hpY2ggY2FuIHRha2UgdmFsdWVzIGZyb20gMCB0byAzCi0gKiAwIC0tPiBubyBlc2NhcGUgbW9kZSwgMSAtLT4gZXNjYXBlIHR5cGUgMSwKLSAqIDEgLS0+IGVzY2FwZSB0eXBlIDIsIDMgLS0+IGVzY2FwZSB0eXBlIDMsIGNoZWNrIHNlY3Rpb24gNy40LjEuMwotICogaW4gdGhlIE1QRUcgSVNPIHN0YW5kYXJkLgotICoKLSAqLwotCi1PTVhfVTggYXJtVkNNNFAyX0NoZWNrVkxDRXNjYXBlTW9kZSgKLSAgICAgT01YX1UzMiBydW4sCi0gICAgIE9NWF9VMzIgcnVuUGx1cywKLSAgICAgT01YX1MxNiBsZXZlbCwKLSAgICAgT01YX1MxNiBsZXZlbFBsdXMsCi0gICAgIE9NWF9VOCAgbWF4U3RvcmVSdW4sCi0gICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzLAotICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCi0gICAgIGNvbnN0IE9NWF9VOCAgKnBSdW5JbmRleFRhYmxlCi0pOwotCi0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgc2VhcmNoOyBlc3RpbWF0ZXMgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIAotICogQm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgdXNpbmcgaGFsZi1waXhlbCB1bml0cywgYW5kIAotICogdGhlcmVmb3JlIGEgc2hpZnQgbGVmdCBvciByaWdodCBieSAxIGJpdCBtYXkgYmUgcmVxdWlyZWQsIHJlc3BlY3RpdmVseSwgdG8gbWF0Y2ggdGhlIAotICogaW5wdXQgb3Igb3V0cHV0IE1WcyB3aXRoIG90aGVyIGZ1bmN0aW9ucyB0aGF0IGVpdGhlciBnZW5lcmF0ZSBvdXRwdXQgTVZzIG9yIGV4cGVjdCAKLSAqIGlucHV0IE1WcyByZXByZXNlbnRlZCB1c2luZyBpbnRlZ2VyIHBpeGVsIHVuaXRzLiAKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBTcmNSZWZCdWYJCXBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSBNQiB0aGF0IAotICogICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICAgICAgICAgIHBsYW5lLgotICogW2luXQlyZWZXaWR0aAkJICB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lCi0gKiBbaW5dCXBSZWZSZWN0CQkgIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlY3Rhbmd1bGFyIGluIHJlZmVyZW5jZSBwbGFuZS4gUmVsYXRpdmUgdG8gaW1hZ2Ugb3JpZ2luLiAKLSAqICAgICAgICAgICAgICAgICAgICBJdCdzIG5vdCBsaW1pdGVkIHRvIHRoZSBpbWFnZSBib3VuZGFyeSwgYnV0IGRlcGVuZGVkIG9uIHRoZSBwYWRkaW5nLiBGb3IgZXhhbXBsZSwgCi0gKiAgICAgICAgICAgICAgICAgICAgaWYgeW91IHBhZCA0IHBpeGVscyBvdXRzaWRlIHRoZSBpbWFnZSBib3JkZXIsIHRoZW4gdGhlIHZhbHVlIGZvciBsZWZ0IGJvcmRlciAKLSAqICAgICAgICAgICAgICAgICAgICBjYW4gYmUgLTQKLSAqIFtpbl0JcFNyY0N1cnJCdWYJCXBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBleHRyYWN0ZWQgZnJvbSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAKLSAqICAgICAgICAgICAgICAgICAgICAyNTYgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuCi0gKiBbaW5dIHBDdXJyUG9pbnRQb3MJcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZQotICogW2luXSBwU3JjUHJlTVYJCSAgcG9pbnRlciB0byBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcjsgTlVMTCBpbmRpY2F0ZXMgbm8gcHJlZGljdGVkIE1WCi0gKiBbaW5dIHBTcmNQcmVTQUQJCXBvaW50ZXIgdG8gU0FEIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJlZGljdGVkIE1WIChyZWZlcmVuY2VkIGJ5IHBTcmNQcmVNVikKLSAqIFtpbl0gc2VhcmNoUmFuZ2UJCXNlYXJjaCByYW5nZSBmb3IgMTZYMTYgaW50ZWdlciBibG9jayx0aGUgdW5pdHMgb2YgaXQgaXMgZnVsbCBwaXhlbCx0aGUgc2VhcmNoIHJhbmdlIAotICogICAgICAgICAgICAgICAgICAgIGlzIHRoZSBzYW1lIGluIGFsbCBkaXJlY3Rpb25zLkl0IGlzIGluIGluY2x1c2l2ZSBvZiB0aGUgYm91bmRhcnkgYW5kIHNwZWNpZmllZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVsIHVuaXRzLgotICogW2luXSBwTUVTcGVjCQkJICB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKLSAqICAgICAgICAgICAgICAgICAgICBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhlIGJsb2NrIG1hdGNoaW5nIAotICogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLgotICogW2luXSBCbG9ja1NpemUgICAgIE1hY3JvQmxvY2sgU2l6ZSBpLmUgZWl0aGVyIDE2eDE2IG9yIDh4OC4KLSAqIFtvdXRdCXBEc3RNVgkJCXBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WCi0gKiBbb3V0XQlwRHN0U0FECQkJcG9pbnRlciB0byBtaW5pbXVtIFNBRAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TdHNfTm9FcnIgqEMgbm8gZXJyb3IuCi0gKiBPTVhfU3RzX0JhZEFyZ0VyciCoQyBiYWQgYXJndW1lbnRzCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyKAotICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCi0gICAgIE9NWF9JTlQgcmVmV2lkdGgsCi0gICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotICAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAotICAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAotICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY1ByZU1WLAotICAgICBjb25zdCBPTVhfSU5UICpwU3JjUHJlU0FELAotICAgICB2b2lkICpwTUVTcGVjLAotICAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WLAotICAgICBPTVhfSU5UICpwRHN0U0FELAotICAgICBPTVhfVTggQmxvY2tTaXplCi0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQmxvY2tNYXRjaF9IYWxmCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhIDE2eDE2IGJsb2NrIG1hdGNoIHdpdGggaGFsZi1waXhlbCByZXNvbHV0aW9uLiAgUmV0dXJucyB0aGUgZXN0aW1hdGVkIAotICogbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIFRoaXMgZnVuY3Rpb24gZXN0aW1hdGVzIHRoZSBoYWxmLXBpeGVsIAotICogbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIHJlc29sdXRpb24gbW90aW9uIHZlY3RvciByZWZlcmVuY2VkIAotICogYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0TVYsIGkuZS4sIHRoZSBpbml0aWFsIGludGVnZXIgTVYgaXMgZ2VuZXJhdGVkIAotICogZXh0ZXJuYWxseS4gIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIHBTcmNSZWZCdWYgYW5kIHBTZWFyY2hQb2ludFJlZlBvcyBzaG91bGQgYmUgCi0gKiBzaGlmdGVkIGJ5IHRoZSB3aW5uaW5nIE1WIG9mIDE2eDE2IGludGVnZXIgc2VhcmNoIHByaW9yIHRvIGNhbGxpbmcgQmxvY2tNYXRjaF9IYWxmXzE2eDE2LiAgCi0gKiBUaGUgZnVuY3Rpb24gQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2IG1heSBiZSB1c2VkIGZvciBpbnRlZ2VyIG1vdGlvbiBlc3RpbWF0aW9uLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcFNyY1JlZkJ1ZgkJcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIE1CIAotICogICAgICAgICAgICAgICAgICAgIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgdGhlCWN1cnJlbnQgcGxhbmUuCi0gKiBbaW5dCXJlZldpZHRoCQkgIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUKLSAqIFtpbl0JcFJlZlJlY3QJCSAgcmVmZXJlbmNlIHBsYW5lIHZhbGlkIHJlZ2lvbiByZWN0YW5nbGUKLSAqIFtpbl0JcFNyY0N1cnJCdWYJCXBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBleHRyYWN0ZWQgZnJvbSBvcmlnaW5hbCBwbGFuZSAKLSAqICAgICAgICAgICAgICAgICAgICAobGluZWFyIGFycmF5LCAyNTYgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogW2luXQlwU2VhcmNoUG9pbnRSZWZQb3MJcG9zaXRpb24gb2YgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciBoYWxmIHBpeGVsIHNlYXJjaCAoc3BlY2lmaWVkIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMpIGluIHRoZSByZWZlcmVuY2UgcGxhbmUuCi0gKiBbaW5dCXJuZFZhbAkJCSAgcm91bmRpbmcgY29udHJvbCBiaXQgZm9yIGhhbGYgcGl4ZWwgbW90aW9uIGVzdGltYXRpb247IAotICogICAgICAgICAgICAgICAgICAgIDA9cm91bmRpbmcgY29udHJvbCBkaXNhYmxlZDsgMT1yb3VuZGluZyBjb250cm9sIGVuYWJsZWQKLSAqIFtpbl0JcFNyY0RzdE1WCQlwb2ludGVyIHRvIHRoZSBpbml0aWFsIE1WIGVzdGltYXRlOyB0eXBpY2FsbHkgZ2VuZXJhdGVkIGR1cmluZyBhIHByaW9yIAotICogICAgICAgICAgICAgICAgICAxNlgxNiBpbnRlZ2VyIHNlYXJjaCBhbmQgaXRzIHVuaXQgaXMgaGFsZiBwaXhlbC4KLSAqIFtpbl0gQmxvY2tTaXplICAgICBNYWNyb0Jsb2NrIFNpemUgaS5lIGVpdGhlciAxNngxNiBvciA4eDguCi0gKiBbb3V0XXBTcmNEc3RNVgkJcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYKLSAqIFtvdXRdcERzdFNBRAkJCXBvaW50ZXIgdG8gbWluaW11bSBTQUQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfU3RzX05vRXJyIKhDIG5vIGVycm9yCi0gKiBPTVhfU3RzX0JhZEFyZ0VyciCoQyBiYWQgYXJndW1lbnRzCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfQmxvY2tNYXRjaF9IYWxmKAotICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCi0gICAgIE9NWF9JTlQgcmVmV2lkdGgsCi0gICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotICAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAotICAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwU2VhcmNoUG9pbnRSZWZQb3MsCi0gICAgIE9NWF9JTlQgcm5kVmFsLAotICAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdE1WLAotICAgICBPTVhfSU5UICpwRHN0U0FELAotICAgICBPTVhfVTggQmxvY2tTaXplCi0pOwotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX1BhZE1WCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBtb3Rpb24gdmVjdG9yIHBhZGRpbmcgZm9yIGEgbWFjcm9ibG9jay4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHBTcmNEc3RNViAgICAgICBwb2ludGVyIHRvIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIG9mIHRoZSBjdXJyZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2sKLSAqIFtpbl0gcFRyYW5zcCAgICAgICAgIHBvaW50ZXIgdG8gdHJhbnNwYXJlbnQgc3RhdHVzIGJ1ZmZlciBvZiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBtYWNyb2Jsb2NrCi0gKiBbb3V0XSAgICBwU3JjRHN0TVYgICAgICAgcG9pbnRlciB0byBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBpbiB3aGljaCB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uIHZlY3RvcnMgaGF2ZSBiZWVuIHBhZGRlZAotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfUGFkTVYoCi0gICAgIE9NWFZDTW90aW9uVmVjdG9yICogcFNyY0RzdE1WLAotICAgICBPTVhfVTggKiBwVHJhbnNwCi0pOwotCi0vKiAKLSAqIEguMjY0IFNwZWNpZmljIERlY2xhcmF0aW9ucyAKLSAqLwotLyogRGVmaW5lcyAqLwotI2RlZmluZSBBUk1fTTRQMTBfUV9PRkZTRVQgICAgICAgICgxNSkKLQotCi0vKiBEZXF1YW50IHRhYmxlcyAqLwotCi1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMTBfUG9zVG9WQ29sNHg0WzE2XTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9Qb3NUb1ZDb2wyeDJbNF07Ci1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMTBfVk1hdHJpeFs2XVszXTsKLWV4dGVybiBjb25zdCBPTVhfVTMyIGFybVZDTTRQMTBfTUZNYXRyaXhbNl1bM107Ci0KLQotLyoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtIHRoZSB3b3JrIHJlcXVpcmVkIGJ5IHRoZSBPcGVuTUFYCi0gKiBEZWNvZGVDb2VmZnNUb1BhaXIgZnVuY3Rpb24gYW5kIERlY29kZUNocm9tYURDQ29lZmZzVG9QYWlyLgotICogU2luY2UgbW9zdCBvZiB0aGUgY29kZSBpcyBjb21tb24gd2Ugc2hhcmUgaXQgaGVyZS4KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcEJpdFN0cmVhbQkJRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0gYnVmZmVyCi0gKiBbaW5dCXBPZmZzZXQJCQlQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLSAqCQkJCQkJCQl0byBieSAqcHBCaXRTdHJlYW0KLSAqIFtpbl0Jc01heE51bUNvZWZmCU1heGltdW0gbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyBpbiBjdXJyZW50Ci0gKgkJCQkJCQkJYmxvY2sgKDQsMTUgb3IgMTYpCi0gKiBbaW5dCW5UYWJsZSAgICAgICAgICBUYWJsZSBudW1iZXIgKDAgdG8gNCkgYWNjb3JkaW5nIHRvIHRoZSBmaXZlIGNvbHVtbnMKLSAqICAgICAgICAgICAgICAgICAgICAgIG9mIFRhYmxlIDktNSBpbiB0aGUgSC4yNjQgc3BlYwotICogW291dF0JcHBCaXRTdHJlYW0JCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAotICogW291dF0JcE9mZnNldAkJCSpwT2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkCi0gKiBbb3V0XQlwTnVtQ29lZmYJCVBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cyBpbgotICoJCQkJCQkJCXRoaXMgYmxvY2sKLSAqIFtvdXRdCXBwUG9zQ29lZmJ1ZglEb3VibGUgcG9pbnRlciB0byBkZXN0aW5hdGlvbiByZXNpZHVhbAotICoJCQkJCQkJCWNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBvbXhFcnJvciByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyKAotICAgICBjb25zdCBPTVhfVTgqKiBwcEJpdFN0cmVhbSwKLSAgICAgT01YX1MzMiogcE9mZnNldCwKLSAgICAgT01YX1U4KiBwTnVtQ29lZmYsCi0gICAgIE9NWF9VOCoqcHBQb3NDb2VmYnVmLAotICAgICBPTVhfSU5UIG5UYWJsZSwKLSAgICAgT01YX0lOVCBzTWF4TnVtQ29lZmYgICAgICAgIAotICk7Ci0KLS8qCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm0gREMgc3R5bGUgaW50cmEgcHJlZGljdGlvbiwgYXZlcmFnaW5nIHVwcGVyIGFuZCBsZWZ0IGJsb2NrCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcFNyY0xlZnQJCVBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBsZWZ0IGNvZWZmaWNpZW50czoKLSAqCQkJCQkJCQlwW3gsIHldICh4ID0gLTEsIHkgPSAwLi4zKQotICogW2luXQlwU3JjQWJvdmUJCVBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBhYm92ZSBjb2VmZmljaWVudHM6Ci0gKgkJCQkJCQkJcFt4LHldICh4ID0gMC4uMywgeSA9IC0xKQotICogW2luXQlsZWZ0U3RlcAkJU3RlcCBvZiBsZWZ0IGNvZWZmaWNpZW50IGJ1ZmZlcgotICogW2luXQlkc3RTdGVwCQkJU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyCi0gKiBbaW5dCWF2YWlsYWJpbGl0eQlOZWlnaGJvcmluZyAxNngxNiBNQiBhdmFpbGFiaWxpdHkgZmxhZwotICogW291dF0JcERzdAkJCVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE5vbmUKLSAqLwotCi12b2lkIGFybVZDTTRQMTBfUHJlZGljdEludHJhREM0eDQoCi0gICAgIGNvbnN0IE9NWF9VOCogcFNyY0xlZnQsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAotICAgICBPTVhfVTgqIHBEc3QsCi0gICAgIE9NWF9JTlQgbGVmdFN0ZXAsCi0gICAgIE9NWF9JTlQgZHN0U3RlcCwKLSAgICAgT01YX1MzMiBhdmFpbGFiaWxpdHkgICAgICAgIAotKTsKLQotLyoKLSAqIERlc2NyaXB0aW9uCi0gKiBVbnBhY2sgYSA0eDQgYmxvY2sgb2YgY29lZmZpY2llbnQtcmVzaWR1YWwgcGFpciB2YWx1ZXMKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcFNyYwlEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyCi0gKgkJCQkJCWJ1ZmZlciBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcKLSAqIFtvdXRdCXBwU3JjCSpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jawotICogW291dF0JcERzdAlQb2ludGVyIHRvIHVucGFja2VkIDR4NCBibG9jawotICovCi0KLXZvaWQgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NCgKLSAgICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCi0gICAgIE9NWF9TMTYqIHBEc3QKLSk7Ci0KLS8qCi0gKiBEZXNjcmlwdGlvbgotICogVW5wYWNrIGEgMngyIGJsb2NrIG9mIGNvZWZmaWNpZW50LXJlc2lkdWFsIHBhaXIgdmFsdWVzCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcHBTcmMJRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpcgotICoJCQkJCQlidWZmZXIgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nCi0gKiBbb3V0XQlwcFNyYwkqcHBTcmMgaXMgdXBkYXRlZCB0byB0aGUgc3RhcnQgb2YgbmV4dCBub24gZW1wdHkgYmxvY2sKLSAqIFtvdXRdCXBEc3QJUG9pbnRlciB0byB1bnBhY2tlZCA0eDQgYmxvY2sKLSAqLwotCi12b2lkIGFybVZDTTRQMTBfVW5wYWNrQmxvY2syeDIoCi0gICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAotICAgICBPTVhfUzE2KiBwRHN0Ci0pOwotCi0vKgotICogRGVzY3JpcHRpb24KLSAqIERlYmxvY2sgb25lIGJvdW5kYXJ5IHBpeGVsCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcFEwICAgICAgICAgUG9pbnRlciB0byBwaXhlbCBxMAotICogW2luXSBTdGVwICAgICAgICBTdGVwIGJldHdlZW4gcGl4ZWxzIHEwIGFuZCBxMQotICogW2luXSB0QzAgICAgICAgICBFZGdlIHRocmVzaG9sZCB2YWx1ZQotICogW2luXSBhbHBoYSAgICAgICBhbHBoYSB0aHJlc2hvbGQgdmFsdWUKLSAqIFtpbl0gYmV0YSAgICAgICAgYmV0YSB0aHJlc2hvbGQgdmFsdWUKLSAqIFtpbl0gYlMgICAgICAgICAgZGVibG9ja2luZyBzdHJlbmd0aAotICogW2luXSBDaHJvbWFGbGFnICBUcnVlIGZvciBjaHJvbWEgYmxvY2tzCi0gKiBbb3V0XSBwUTAgICAgICAgIERlYmxvY2tlZCBwaXhlbHMKLSAqIAotICovCi0KLXZvaWQgYXJtVkNNNFAxMF9EZUJsb2NrUGl4ZWwoCi0gICAgT01YX1U4ICpwUTAsICAgIC8qIHBvaW50ZXIgdG8gdGhlIHBpeGVsIHEwICovCi0gICAgaW50IFN0ZXAsICAgICAgIC8qIHN0ZXAgYmV0d2VlbiBwaXhlbHMgcTAgYW5kIHExICovCi0gICAgaW50IHRDMCwgICAgICAgIC8qIGVkZ2UgdGhyZXNob2xkIHZhbHVlICovCi0gICAgaW50IGFscGhhLCAgICAgIC8qIGFscGhhICovCi0gICAgaW50IGJldGEsICAgICAgIC8qIGJldGEgKi8KLSAgICBpbnQgYlMsICAgICAgICAgLyogZGVibG9ja2luZyBzdHJlbmd0aCAqLwotICAgIGludCBDaHJvbWFGbGFnCi0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIGhvcml6b250YWwgMS8yLXBlbCBwb3NpdGlvbnMKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqCVtpbl0JcFNyYwkJCVBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgCi0gCQkJCQkJCQkJCQkJCWluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCi0gKglbaW5dCWlTcmNTdGVwCVN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCi0gKglbaW5dCWlEc3RTdGVwCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KLSAqCVtpbl0JaVdpZHRoCQlXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jawotICoJW2luXQlpSGVpZ2h0CQlIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqCVtvdXRdCXBEc3QJICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAxLzItcGVsIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEoCi0gICAgICAgIGNvbnN0IE9NWF9VOCoJCXBTcmMsIAotCQlPTVhfVTMyIAlpU3JjU3RlcCwgCi0JCU9NWF9VOCogCXBEc3QsIAotCQlPTVhfVTMyIAlpRHN0U3RlcCwgCi0JCU9NWF9VMzIgCWlXaWR0aCwgCi0JCU9NWF9VMzIgCWlIZWlnaHQKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIHZlcnRpY2FsIDEvMi1wZWwgcG9zaXRpb25zIAotICogYXJvdW5kIGEgZnVsbC1wZWwgcG9zaXRpb24uCi0gKgotICogUmVtYXJrczoKLSAqCi0gKglbaW5dCXBTcmMJCQlQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIAotICoJCQkJCQkJCQkJCQlpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQotICoJW2luXQlpU3JjU3RlcAlTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgotICoJW2luXQlpRHN0U3RlcAlTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCi0gKglbaW5dCWlXaWR0aAkJV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqCVtpbl0JaUhlaWdodAkJSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKglbb3V0XQlwRHN0ICAgIAlQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgMS8yLXBlbAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEoCQotCSBjb25zdCBPTVhfVTgqIAlwU3JjLCAKLQkgT01YX1UzMiAJaVNyY1N0ZXAsIAotIAkgT01YX1U4KiAJcERzdCwKLSAJIE9NWF9VMzIgCWlEc3RTdGVwLCAKLSAJIE9NWF9VMzIgCWlXaWR0aCwgCi0gCSBPTVhfVTMyIAlpSGVpZ2h0Ci0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkRpYWdfTHVtYQotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgKDEvMiwgMS8yKSAgcG9zaXRpb25zIAotICogYXJvdW5kIGEgZnVsbC1wZWwgcG9zaXRpb24uCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiAgW2luXSAgICBwU3JjICAgICAgICBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIAotICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKLSAqICBbaW5dICAgIGlTcmNTdGVwICAgIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCi0gKiAgW2luXSAgICBpRHN0U3RlcCAgICBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCi0gKiAgW2luXSAgICBpV2lkdGggICAgICBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jawotICogIFtpbl0gICAgaUhlaWdodCAgICAgSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiAgW291dF0gICBwRHN0ICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgKDEvMiwxLzIpLXBlbAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmRGlhZ19MdW1hKCAgCi0gICAgICAgIGNvbnN0IE9NWF9VOCogICAgIHBTcmMsIAotICAgICAgICBPTVhfVTMyICAgICBpU3JjU3RlcCwgCi0gICAgICAgIE9NWF9VOCogICAgIHBEc3QsIAotICAgICAgICBPTVhfVTMyICAgICBpRHN0U3RlcCwKLSAgICAgICAgT01YX1UzMiAgICAgaVdpZHRoLCAKLSAgICAgICAgT01YX1UzMiAgICAgaUhlaWdodAotKTsKLQotLyoKLSAqIERlc2NyaXB0aW9uOgotICogVHJhbnNmb3JtIFJlc2lkdWFsIDR4NCBDb2VmZmljaWVudHMKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgcFNyYwkJU291cmNlIDR4NCBibG9jawotICogW291dF0gcERzdAkJRGVzdGluYXRpb24gNHg0IGJsb2NrCi0gKgotICovCi0KLXZvaWQgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NChPTVhfUzE2KiBwRHN0LCBPTVhfUzE2ICpwU3JjKTsKLQotLyoKLSAqIERlc2NyaXB0aW9uOgotICogRm9yd2FyZCBUcmFuc2Zvcm0gUmVzaWR1YWwgNHg0IENvZWZmaWNpZW50cwotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBwU3JjCQlTb3VyY2UgNHg0IGJsb2NrCi0gKiBbb3V0XSBwRHN0CQlEZXN0aW5hdGlvbiA0eDQgYmxvY2sKLSAqCi0gKi8KLQotdm9pZCBhcm1WQ000UDEwX0Z3ZFRyYW5zZm9ybVJlc2lkdWFsNHg0KE9NWF9TMTYqIHBEc3QsIE9NWF9TMTYgKnBTcmMpOwotCi1PTVhfSU5UIGFybVZDTTRQMTBfQ29tcGFyZU1vdGlvbkNvc3RUb01WICgKLSAgICBPTVhfUzE2ICBtdlgsCi0gICAgT01YX1MxNiAgbXZZLAotICAgIE9NWFZDTW90aW9uVmVjdG9yIGRpZmZNViwgCi0gICAgT01YX0lOVCBjYW5kU0FELCAKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqYmVzdE1WLCAKLSAgICBPTVhfVTMyIG5MYW1kYSwKLSAgICBPTVhfUzMyICpwQmVzdENvc3QpOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ0NPTU1fU0FECi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZSB0aGUgU0FEIGZvciBOeE0gYmxvY2tzLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogW2luXQkJcFNyY09yZwkJUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2sKLSAqIFtpbl0JCWlTdGVwT3JnCVN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcgotICogW2luXQkJcFNyY1JlZgkJUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrCi0gKiBbaW5dCQlpU3RlcFJlZglTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyCi0gKiBbaW5dCQlpSGVpZ2h0CQlIZWlnaHQgb2YgdGhlIGJsb2NrCi0gKiBbaW5dCQlpV2lkdGgJCVdpZHRoIG9mIHRoZSBibG9jawotICogW291dF0JcERzdFNBRAkJUG9pbnRlciBvZiByZXN1bHQgU0FECi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotT01YUmVzdWx0IGFybVZDQ09NTV9TQUQoCQotCWNvbnN0IE9NWF9VOCogCXBTcmNPcmcsCi0JT01YX1UzMiAJaVN0ZXBPcmcsCi0JY29uc3QgT01YX1U4KiAJcFNyY1JlZiwKLQlPTVhfVTMyIAlpU3RlcFJlZiwKLQlPTVhfUzMyKglwRHN0U0FELAotCU9NWF9VMzIJCWlIZWlnaHQsCi0JT01YX1UzMgkJaVdpZHRoKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNDT01NX0F2ZXJhZ2UKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gYmxvY2tzIGFuZCBzdG9yZXMgdGhlIHJlc3VsdC4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqCVtpbl0JcFByZWQwCQkJUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAwCi0gKglbaW5dCXBQcmVkMQkJCVBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMQotICoJW2luXQlpUHJlZFN0ZXAwCSAgICBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwCi0gKglbaW5dCWlQcmVkU3RlcDEJICAgIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEKLSAqCVtpbl0JaURzdFN0ZXAgCQlTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKLSAqCVtpbl0JaVdpZHRoCQkJV2lkdGggb2YgdGhlIGJsb2NrcwotICoJW2luXQlpSGVpZ2h0CQkJSGVpZ2h0IG9mIHRoZSBibG9ja3MKLSAqCVtvdXRdCXBEc3RQcmVkCQlQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCi0gKgotICovCi0gT01YUmVzdWx0IGFybVZDQ09NTV9BdmVyYWdlICgKLQkgY29uc3QgT01YX1U4KiAJICAgIHBQcmVkMCwKLQkgY29uc3QgT01YX1U4KiAJICAgIHBQcmVkMSwJCi0JIE9NWF9VMzIJCWlQcmVkU3RlcDAsCi0JIE9NWF9VMzIJCWlQcmVkU3RlcDEsCi0JIE9NWF9VOCoJCXBEc3RQcmVkLAotCSBPTVhfVTMyCQlpRHN0U3RlcCwgCi0JIE9NWF9VMzIJCWlXaWR0aCwKLQkgT01YX1UzMgkJaUhlaWdodAotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9TQURRdWFyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBiZXR3ZWVuIG9uZSBibG9jayAocFNyYykgYW5kIHRoZSAKLSAqIGF2ZXJhZ2Ugb2YgdGhlIG90aGVyIHR3byAocFNyY1JlZjAgYW5kIHBTcmNSZWYxKQotICoKLSAqIFJlbWFya3M6Ci0gKgotICogW2luXQkJcFNyYwkJCQlQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jawotICogW2luXQkJcFNyY1JlZjAJCVBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDAKLSAqIFtpbl0JCXBTcmNSZWYxCQlQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxCi0gKiBbaW5dCQlpU3JjU3RlcCAJCVN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcgotICogW2luXQkJaVJlZlN0ZXAwCQlTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogW2luXQkJaVJlZlN0ZXAxIAlTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogW2luXQkJaUhlaWdodAkJCUhlaWdodCBvZiB0aGUgYmxvY2sKLSAqIFtpbl0JCWlXaWR0aAkJCVdpZHRoIG9mIHRoZSBibG9jawotICogW291dF0JcERzdFNBRAkJCVBvaW50ZXIgb2YgcmVzdWx0IFNBRAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLU9NWFJlc3VsdCBhcm1WQ000UDEwX1NBRFF1YXIoCi0JY29uc3QgT01YX1U4KiAJcFNyYywKLSAgICBjb25zdCBPTVhfVTgqIAlwU3JjUmVmMCwKLQljb25zdCBPTVhfVTgqIAlwU3JjUmVmMSwJCi0gICAgT01YX1UzMiAJaVNyY1N0ZXAsCi0gICAgT01YX1UzMgkJaVJlZlN0ZXAwLAotICAgIE9NWF9VMzIJCWlSZWZTdGVwMSwKLSAgICBPTVhfVTMyKglwRHN0U0FELAotICAgIE9NWF9VMzIgICAgIGlIZWlnaHQsCi0gICAgT01YX1UzMiAgICAgaVdpZHRoCi0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciBjaHJvbWEgY29tcG9uZW50cy4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqICBbaW5dICAgIHBTcmMgICAgICAgICAgICBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGUgaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKLSAqICBbaW5dICAgIGlTcmNTdGVwICAgIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCi0gKiAgW2luXSAgICBpRHN0U3RlcCAgICBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCi0gKiAgW2luXSAgICBpV2lkdGggICAgICBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jawotICogIFtpbl0gICAgaUhlaWdodCAgICAgSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiAgW2luXSAgICBkeCAgICAgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvciAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgdW5pdCAoMH43KSAKLSAqICBbaW5dICAgIGR5ICAgICAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgdW5pdCAoMH43KQotICogIFtvdXRdICAgcERzdCAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotIE9NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYSgKLSAgICAgICAgT01YX1U4ICAgICAgKnBTcmMsCi0gICAgICAgIE9NWF9VMzIgICAgIGlTcmNTdGVwLAotICAgICAgICBPTVhfVTggICAgICAqcERzdCwKLSAgICAgICAgT01YX1UzMiAgICAgaURzdFN0ZXAsCi0gICAgICAgIE9NWF9VMzIgICAgIGlXaWR0aCwKLSAgICAgICAgT01YX1UzMiAgICAgaUhlaWdodCwKLSAgICAgICAgT01YX1UzMiAgICAgZHgsCi0gICAgICAgIE9NWF9VMzIgICAgIGR5Ci0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgbHVtYSBjb21wb25lbnRzLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogIFtpbl0gICAgcFNyYyAgICAgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnBvbGF0ZSBpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQotICogIFtpbl0gICAgaVNyY1N0ZXAgICAgU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KLSAqICBbaW5dICAgIGlEc3RTdGVwICAgIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KLSAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqICBbaW5dICAgIGR4ICAgICAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvNCBwaXhlbCB1bml0ICgwfjMpIAotICogIFtpbl0gICAgZHkgICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvNCBwaXhlbCB1bml0ICgwfjMpIAotICogIFtvdXRdICAgcERzdCAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotCi0gT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYSgKLSAgICAgY29uc3QgT01YX1U4ICAgICAqcFNyYywKLSAgICAgT01YX1UzMiAgICBpU3JjU3RlcCwKLSAgICAgT01YX1U4ICAgICAqcERzdCwKLSAgICAgT01YX1UzMiAgICBpRHN0U3RlcCwKLSAgICAgT01YX1UzMiAgICBpV2lkdGgsCi0gICAgIE9NWF9VMzIgICAgaUhlaWdodCwKLSAgICAgT01YX1UzMiAgICBkeCwKLSAgICAgT01YX1UzMiAgICBkeQotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogb214VkNIMjY0X0RlcXVhbnRUcmFuc2Zvcm1BQ0Zyb21QYWlyX1U4X1MxNl9DMV9ETHgKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFJlY29uc3RydWN0IHRoZSA0eDQgcmVzaWR1YWwgYmxvY2sgZnJvbSBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciwKLSAqIHBlcmZvcm0gZGVxdWFudGlzYXRpb24gYW5kIGludGVnZXIgaW52ZXJzZSB0cmFuc2Zvcm1hdGlvbiBmb3IgNHg0IGJsb2NrIG9mCi0gKiByZXNpZHVhbHMgYW5kIHVwZGF0ZSB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byBuZXh0IG5vbi1lbXB0eSBibG9jay4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwU3JjCQlEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbgotICoJCQkJCQkJcGFpciBidWZmZXIgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nCi0gKiBbaW5dCXBEQwkJCVBvaW50ZXIgdG8gdGhlIERDIGNvZWZmaWNpZW50IG9mIHRoaXMgYmxvY2ssIE5VTEwKLSAqCQkJCQkJCWlmIGl0IGRvZXNuJ3QgZXhpc3QKLSAqIFtpbl0JUVAJCQlRdWFudGl6YXRpb24gcGFyYW1ldGVyCi0gKiBbaW5dIEFDICAgICAgICAgIEZsYWcgaW5kaWNhdGluZyBpZiBhdCBsZWFzdCBvbmUgbm9uLXplcm8gY29lZmZpY2llbnQgZXhpc3RzCi0gKiBbb3V0XQlwRHN0CQlwb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIDR4NCBibG9jayBkYXRhCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgb214RXJyb3IgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybUFDRnJvbVBhaXJfVThfUzE2X0MxX0RMeCgKLSAgICAgT01YX1U4ICoqcHBTcmMsCi0gICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgIE9NWF9JTlQgUVAsCi0gICAgIE9NWF9TMTYqIHBEQywKLSAgICAgaW50IEFDCi0pOwotCi0jZW5kaWYgIC8qX2FybVZpZGVvX0hfKi8KLQotLypFbmQgb2YgRmlsZSovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9hcGkvYXJtVkNDT01NX3MuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9hcGkvYXJtVkNDT01NX3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlkNDY0NC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvYXBpL2FybVZDQ09NTV9zLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtVkNDT01NX3MuaAotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi07Ly8gQVJNIG9wdGltaXplZCBPcGVuTUFYIEFDIGhlYWRlciBmaWxlCi07Ly8gCi07Ly8gRm9ybXVsYSB1c2VkOgotOy8vIE1BQ1JPIGZvciBjYWxjdWxhdGluZyBtZWRpYW4gZm9yIHRocmVlIHZhbHVlcy4KLQotCi0KLSAgICBJRiA6TE5PVDo6REVGOkFSTVZDQ09NTV9TX0gKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgIE1fVkFSSUFOVFMgICAgICBDb3J0ZXhBOCwgQVJNMTEzNkpTCi0gICAgCi0gICAgSUYgQVJNMTEzNkpTIDpMT1I6IENvcnRleEE4IAotICAgICAKLSAgICAgOy8vLyoKLSAgICAgOy8vICogTWFjcm86IE1fTUVESUFOMwotICAgICA7Ly8gKgotICAgICA7Ly8gKiBEZXNjcmlwdGlvbjogRmluZHMgdGhlIG1lZGlhbiBvZiB0aHJlZSBudW1iZXJzCi0gICAgIDsvLyAqIAotICAgICA7Ly8gKiBSZW1hcmtzOgotICAgICA7Ly8gKgotICAgICA7Ly8gKiBQYXJhbWV0ZXJzOgotICAgICA7Ly8gKiBbaW5dIHggICAgIEZpcnN0IGVudHJ5IGZvciB0aGUgbGlzdCBvZiB0aHJlZSBudW1iZXJzLgotICAgICA7Ly8gKiBbaW5dIHkgICAgIFNlY29uZCBlbnRyeSBmb3IgdGhlIGxpc3Qgb2YgdGhyZWUgbnVtYmVycy4KLSAgICAgOy8vICogICAgICAgICAgICBJbnB1dCB2YWx1ZSBtYXkgYmUgY29ycnVwdGVkIGF0IHRoZSBlbmQgb2YKLSAgICAgOy8vICogICAgICAgICAgICB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgbWFjcm8uCi0gICAgIDsvLyAqIFtpbl0geiAgICAgVGhpcmQgZW50cnkgb2YgdGhlIGxpc3Qgb2YgdGhyZWUgbnVtYmVycy4KLSAgICAgOy8vICogICAgICAgICAgICBJbnB1dCB2YWx1ZSBjb3JydXB0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgCi0gICAgIDsvLyAqICAgICAgICAgICAgZXhlY3V0aW9uIG9mIHRoaXMgbWFjcm8uCi0gICAgIDsvLyAqIFtpbl0gdCAgICAgVGVtcG9yYXJ5IHNjcmF0Y2ggIHJlZ2lzdGVyLgotICAgICA7Ly8gKiBbb3V0XXogICAgIE1lZGlhbiBvZiB0aGUgdGhyZWUgbnVtYmVycy4gICAgICAgCi0gICAgIDsvLyAqLwotICAgICAKLSAgICAgTUFDUk8KLQotICAgICBNX01FRElBTjMgJHgsICR5LCAkeiwgJHQgCi0gICAgIAotICAgICBTVUJTICAkdCwgJHksICR6OyAvLyBpZiAoeSA8IHopCi0gICAgIEFERExUICR6LCAkeiwgJHQ7IC8vICBzd2FwIHkgYW5kIHoKLSAgICAgU1VCTFQgJHksICR5LCAkdDsKLQotICAgICA7Ly8gTm93IHonIDw9IHknLCBzbyB0aGVyZSBhcmUgdGhyZWUgY2FzZXMgZm9yIHRoZQotICAgICA7Ly8gbWVkaWFuIHZhbHVlLCBkZXBlbmRpbmcgb24geC4KLQotICAgICA7Ly8gMSkgeCA8PSB6JyAgICAgIDw9IHknICAgICAgOiBtZWRpYW4gdmFsdWUgaXMgeicKLSAgICAgOy8vIDIpICAgICAgeicgPD0geCA8PSB5JyAgICAgIDogbWVkaWFuIHZhbHVlIGlzIHgKLSAgICAgOy8vIDMpICAgICAgeicgICAgICA8PSB5JyA8PSB4IDogbWVkaWFuIHZhbHVlIGlzIHknCi0KLSAgICAgQ01QICAgJHosICR4OyAgICAgLy8gaWYgKCB4ID4gbWluKHkseikgKQotICAgICBNT1ZMVCAkeiwgJHg7ICAgICAvLyBhbnMgPSB4IAotCi0gICAgIENNUCAgICR4LCAkeTsgICAgIC8vIGlmICggeCA+IG1heCh5LHopICkKLSAgICAgTU9WR1QgJHosICR5OyAgICAgLy8gYW5zID0gbWF4KHkseikKLSAgICAgCi0gICAgIE1FTkQKLSAgICBFTkRJRiAgICAgIAotICAgIAotICAgIAotICAgICAgICAKLSAgICBFTkRJRiA7Ly8gQVJNQUNDT01NX1NfSAotCi0gRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvYXBpL29teFZDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvYXBpL29teFZDLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiM2NjNzIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2FwaS9vbXhWQy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDM4MSArMCwwIEBACi0vKioKLSAqIEZpbGU6IG9teFZDLmgKLSAqIEJyaWVmOiBPcGVuTUFYIERMIHYxLjAuMiAtIFZpZGVvIENvZGluZyBsaWJyYXJ5Ci0gKgotICogQ29weXJpZ2h0IKkgMjAwNS0yMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0gKgotICogVGhlc2UgbWF0ZXJpYWxzIGFyZSBwcm90ZWN0ZWQgYnkgY29weXJpZ2h0IGxhd3MgYW5kIGNvbnRhaW4gbWF0ZXJpYWwgCi0gKiBwcm9wcmlldGFyeSB0byB0aGUgS2hyb25vcyBHcm91cCwgSW5jLiAgWW91IG1heSB1c2UgdGhlc2UgbWF0ZXJpYWxzIAotICogZm9yIGltcGxlbWVudGluZyBLaHJvbm9zIHNwZWNpZmljYXRpb25zLCB3aXRob3V0IGFsdGVyaW5nIG9yIHJlbW92aW5nIAotICogYW55IHRyYWRlbWFyaywgY29weXJpZ2h0IG9yIG90aGVyIG5vdGljZSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uLgotICogCi0gKiBLaHJvbm9zIEdyb3VwIG1ha2VzIG5vLCBhbmQgZXhwcmVzc2x5IGRpc2NsYWltcyBhbnksIHJlcHJlc2VudGF0aW9ucyAKLSAqIG9yIHdhcnJhbnRpZXMsIGV4cHJlc3Mgb3IgaW1wbGllZCwgcmVnYXJkaW5nIHRoZXNlIG1hdGVyaWFscywgaW5jbHVkaW5nLCAKLSAqIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcyAKLSAqIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBvciBub24taW5mcmluZ2VtZW50IG9mIGFueSBpbnRlbGxlY3R1YWwgcHJvcGVydHkuIAotICogS2hyb25vcyBHcm91cCBtYWtlcyBubywgYW5kIGV4cHJlc3NseSBkaXNjbGFpbXMgYW55LCB3YXJyYW50aWVzLCBleHByZXNzIAotICogb3IgaW1wbGllZCwgcmVnYXJkaW5nIHRoZSBjb3JyZWN0bmVzcywgYWNjdXJhY3ksIGNvbXBsZXRlbmVzcywgdGltZWxpbmVzcywgCi0gKiBhbmQgcmVsaWFiaWxpdHkgb2YgdGhlc2UgbWF0ZXJpYWxzLiAKLSAqCi0gKiBVbmRlciBubyBjaXJjdW1zdGFuY2VzIHdpbGwgdGhlIEtocm9ub3MgR3JvdXAsIG9yIGFueSBvZiBpdHMgUHJvbW90ZXJzLCAKLSAqIENvbnRyaWJ1dG9ycyBvciBNZW1iZXJzIG9yIHRoZWlyIHJlc3BlY3RpdmUgcGFydG5lcnMsIG9mZmljZXJzLCBkaXJlY3RvcnMsIAotICogZW1wbG95ZWVzLCBhZ2VudHMgb3IgcmVwcmVzZW50YXRpdmVzIGJlIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMsIHdoZXRoZXIgCi0gKiBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBmb3IgbG9zdCByZXZlbnVlcywgCi0gKiBsb3N0IHByb2ZpdHMsIG9yIG90aGVyd2lzZSwgYXJpc2luZyBmcm9tIG9yIGluIGNvbm5lY3Rpb24gd2l0aCB0aGVzZSAKLSAqIG1hdGVyaWFscy4KLSAqIAotICogS2hyb25vcyBhbmQgT3Blbk1BWCBhcmUgdHJhZGVtYXJrcyBvZiB0aGUgS2hyb25vcyBHcm91cCBJbmMuIAotICoKLSAqLwotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfT01YVkNfSF8KLSNkZWZpbmUgX09NWFZDX0hfCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLQotLyogNi4xLjEuMSBNb3Rpb24gVmVjdG9ycyAgKi8KLS8qIEluIG9teFZDLCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgYXMgZm9sbG93czogICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBPTVhfUzE2IGR4OwotICAgIE9NWF9TMTYgZHk7Ci19IE9NWFZDTW90aW9uVmVjdG9yOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9BdmVyYWdlXzh4ICAgKDYuMS4zLjEuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gOHg0LCA4eDgsIG9yIDh4MTYgYmxvY2tzLiAgVGhlIAotICogcmVzdWx0IGlzIHJvdW5kZWQgYWNjb3JkaW5nIHRvIChhK2IrMSkvMi4gIFRoZSBibG9jayBhdmVyYWdlIGZ1bmN0aW9uIGNhbiAKLSAqIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBoYWxmLXBpeGVsIGludGVycG9sYXRpb24gdG8gb2J0YWluIHF1YXJ0ZXIgCi0gKiBwaXhlbCBtb3Rpb24gZXN0aW1hdGVzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTEwXSwgc3ViY2xhdXNlIDguNC4yLjIuMS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFByZWQwICAgICAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgcFByZWQxICAgICAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaVByZWRTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIGlQcmVkU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpRHN0U3RlcCAgIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAKLSAqICAgaUhlaWdodCAgICAtIEhlaWdodCBvZiB0aGUgYmxvY2tzIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0UHJlZCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gOC1ieXRlIGFsaWduZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBQcmVkMCwgcFByZWQxLCBvciAKLSAqICAgICAgICAgICAgICBwRHN0UHJlZC4gCi0gKiAgICAtICAgcERzdFByZWQgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgIC0gICBpUHJlZFN0ZXAwIDw9IDAgb3IgaVByZWRTdGVwMCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICBpUHJlZFN0ZXAxIDw9IDAgb3IgaVByZWRTdGVwMSBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICBpRHN0U3RlcCAgIDw9IDAgb3IgaURzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgaUhlaWdodCBpcyBub3QgNCwgOCwgb3IgMTYuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDQ09NTV9BdmVyYWdlXzh4ICgKLSAgICBjb25zdCBPTVhfVTggKnBQcmVkMCwKLSAgICBjb25zdCBPTVhfVTggKnBQcmVkMSwKLSAgICBPTVhfVTMyIGlQcmVkU3RlcDAsCi0gICAgT01YX1UzMiBpUHJlZFN0ZXAxLAotICAgIE9NWF9VOCAqcERzdFByZWQsCi0gICAgT01YX1UzMiBpRHN0U3RlcCwKLSAgICBPTVhfVTMyIGlIZWlnaHQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0F2ZXJhZ2VfMTZ4ICAgKDYuMS4zLjEuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gMTZ4MTYgb3IgMTZ4OCBibG9ja3MuICBUaGUgCi0gKiByZXN1bHQgaXMgcm91bmRlZCBhY2NvcmRpbmcgdG8gKGErYisxKS8yLiAgVGhlIGJsb2NrIGF2ZXJhZ2UgZnVuY3Rpb24gY2FuIAotICogYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGhhbGYtcGl4ZWwgaW50ZXJwb2xhdGlvbiB0byBvYnRhaW4gcXVhcnRlciAKLSAqIHBpeGVsIG1vdGlvbiBlc3RpbWF0ZXMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMTBdLCBzdWJjbGF1c2UgOC40LjIuMi4xLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwUHJlZDAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIHBQcmVkMSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaVByZWRTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIGlQcmVkU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciAKLSAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2tzIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0UHJlZCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gMTYtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCi0gKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwUHJlZDAsIHBQcmVkMSwgb3IgCi0gKiAgICAgICAgICAgICAgcERzdFByZWQuIAotICogICAgLSAgIHBEc3RQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgICAtICAgaVByZWRTdGVwMCA8PSAwIG9yIGlQcmVkU3RlcDAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICogICAgLSAgIGlQcmVkU3RlcDEgPD0gMCBvciBpUHJlZFN0ZXAxIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgIC0gICBpRHN0U3RlcCA8PSAwIG9yIGlEc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgIC0gICBpSGVpZ2h0IGlzIG5vdCA4IG9yIDE2LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fQXZlcmFnZV8xNnggKAotICAgIGNvbnN0IE9NWF9VOCAqcFByZWQwLAotICAgIGNvbnN0IE9NWF9VOCAqcFByZWQxLAotICAgIE9NWF9VMzIgaVByZWRTdGVwMCwKLSAgICBPTVhfVTMyIGlQcmVkU3RlcDEsCi0gICAgT01YX1U4ICpwRHN0UHJlZCwKLSAgICBPTVhfVTMyIGlEc3RTdGVwLAotICAgIE9NWF9VMzIgaUhlaWdodAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSSAgICg2LjEuMy4yLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGV4cGFuZHMgYSByZWNvbnN0cnVjdGVkIGZyYW1lIGluLXBsYWNlLiAgVGhlIHVuZXhwYW5kZWQgCi0gKiBzb3VyY2UgZnJhbWUgc2hvdWxkIGJlIHN0b3JlZCBpbiBhIHBsYW5lIGJ1ZmZlciB3aXRoIHN1ZmZpY2llbnQgc3BhY2UgCi0gKiBwcmUtYWxsb2NhdGVkIGZvciBlZGdlIGV4cGFuc2lvbiwgYW5kIHRoZSBpbnB1dCBmcmFtZSBzaG91bGQgYmUgbG9jYXRlZCBpbiAKLSAqIHRoZSBwbGFuZSBidWZmZXIgY2VudGVyLiAgVGhpcyBmdW5jdGlvbiBleGVjdXRlcyB0aGUgcGl4ZWwgZXhwYW5zaW9uIGJ5IAotICogcmVwbGljYXRpbmcgc291cmNlIGZyYW1lIGVkZ2UgcGl4ZWwgaW50ZW5zaXRpZXMgaW4gdGhlIGVtcHR5IHBpeGVsIAotICogbG9jYXRpb25zIChleHBhbnNpb24gcmVnaW9uKSBiZXR3ZWVuIHRoZSBzb3VyY2UgZnJhbWUgZWRnZSBhbmQgdGhlIHBsYW5lIAotICogYnVmZmVyIGVkZ2UuICBUaGUgd2lkdGgvaGVpZ2h0IG9mIHRoZSBleHBhbnNpb24gcmVnaW9ucyBvbiB0aGUgCi0gKiBob3Jpem9udGFsL3ZlcnRpY2FsIGVkZ2VzIGlzIGNvbnRyb2xsZWQgYnkgdGhlIHBhcmFtZXRlciBpRXhwYW5kUGVscy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdFBsYW5lIC0gcG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBmcmFtZSB0byBiZSAKLSAqICAgICAgICAgICAgZXhwYW5kZWQ7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBpRnJhbWVXaWR0aCAtIGZyYW1lIHdpZHRoOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIGlGcmFtZUhlaWdodCAtZnJhbWUgaGVpZ2h0OyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIGlFeHBhbmRQZWxzIC0gbnVtYmVyIG9mIHBpeGVscyB0byBiZSBleHBhbmRlZCBpbiB0aGUgaG9yaXpvbnRhbCBhbmQgCi0gKiAgICAgICAgICAgIHZlcnRpY2FsIGRpcmVjdGlvbnM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgaVBsYW5lU3RlcCAtIGRpc3RhbmNlLCBpbiBieXRlcywgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMgCi0gKiAgICAgICAgICAgIGluIHRoZSBwbGFuZSBidWZmZXI7IG11c3QgYmUgbGFyZ2VyIHRoYW4gb3IgZXF1YWwgdG8gCi0gKiAgICAgICAgICAgIChpRnJhbWVXaWR0aCArIDIgKiBpRXhwYW5kUGVscykuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0UGxhbmUgLVBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgZnJhbWUgKE5PVCB0aGUgCi0gKiAgICAgICAgICAgIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgcGxhbmUpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAotICogICAgLSAgICBwU3JjRHN0UGxhbmUgaXMgTlVMTC4gCi0gKiAgICAtICAgIHBTcmNEc3RQbGFuZSBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICAgLSAgICBvbmUgb2YgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGlzIGVpdGhlciBlcXVhbCB0byB6ZXJvIG9yIGlzIGEgCi0gKiAgICAgICAgICAgICAgbm9uLW11bHRpcGxlIG9mIDg6IGlGcmFtZUhlaWdodCwgaUZyYW1lV2lkdGgsIGlQbGFuZVN0ZXAsIG9yIAotICogICAgICAgICAgICAgIGlFeHBhbmRQZWxzLiAKLSAqICAgIC0gICAgaVBsYW5lU3RlcCA8IChpRnJhbWVXaWR0aCArIDIgKiBpRXhwYW5kUGVscykuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDQ09NTV9FeHBhbmRGcmFtZV9JICgKLSAgICBPTVhfVTggKnBTcmNEc3RQbGFuZSwKLSAgICBPTVhfVTMyIGlGcmFtZVdpZHRoLAotICAgIE9NWF9VMzIgaUZyYW1lSGVpZ2h0LAotICAgIE9NWF9VMzIgaUV4cGFuZFBlbHMsCi0gICAgT01YX1UzMiBpUGxhbmVTdGVwCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9Db3B5OHg4ICAgKDYuMS4zLjMuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvcGllcyB0aGUgcmVmZXJlbmNlIDh4OCBibG9jayB0byB0aGUgY3VycmVudCBibG9jay4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayBpbiB0aGUgc291cmNlIGZyYW1lOyBtdXN0IGJlIAotICogICAgICAgICAgICBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHN0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydHMgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgZnJhbWUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOCBhbmQgbXVzdCBiZSBsYXJnZXIgdGhhbiAKLSAqICAgICAgICAgICAgb3IgZXF1YWwgdG8gOC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBEc3QgCi0gKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCi0gKiAgICAgICAgICAgICAgYm91bmRhcnk6IHBTcmMsIHBEc3QgCi0gKiAgICAtICAgIHN0ZXAgPDggb3Igc3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fQ29weTh4OCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIE9NWF9VOCAqcERzdCwKLSAgICBPTVhfSU5UIHN0ZXAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvcHkxNngxNiAgICg2LjEuMy4zLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb3BpZXMgdGhlIHJlZmVyZW5jZSAxNngxNiBtYWNyb2Jsb2NrIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2suIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgbWFjcm9ibG9jayBpbiB0aGUgc291cmNlIGZyYW1lOyBtdXN0IGJlIAotICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHN0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydHMgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgZnJhbWUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYgYW5kIG11c3QgYmUgbGFyZ2VyIAotICogICAgICAgICAgICB0aGFuIG9yIGVxdWFsIHRvIDE2LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIG1hY3JvYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIAotICogICAgICAgICAgICAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCi0gKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwRHN0IAotICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIAotICogICAgICAgICAgICAgIGJvdW5kYXJ5OiBwU3JjLCBwRHN0IAotICogICAgLSAgICBzdGVwIDwxNiBvciBzdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fQ29weTE2eDE2ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgT01YX1U4ICpwRHN0LAotICAgIE9NWF9JTlQgc3RlcAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRCAgICg2LjEuNC4xLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb21wdXRlcyB0ZXh0dXJlIGVycm9yIG9mIHRoZSBibG9jazsgYWxzbyByZXR1cm5zIFNBRC4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBzcmNTdGVwIC0gc3RlcCBvZiB0aGUgc291cmNlIHBsYW5lIAotICogICBwU3JjUmVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJ1ZmZlciwgYW4gOHg4IGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIGFuIDh4OCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBwRHN0U0FEIC0gcG9pbnRlciB0byB0aGUgU3VtIG9mIEFic29sdXRlIERpZmZlcmVuY2VzIChTQUQpIHZhbHVlIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIAotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZiwgcERzdCBhbmQgcERzdFNBRC4gCi0gKiAgICAtICAgIHBTcmMgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgU3JjU3RlcCA8PSAwIG9yIHNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgIHBTcmNSZWYgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgcERzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FEICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgT01YX0lOVCBzcmNTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKLSAgICBPTVhfUzE2ICpwRHN0LAotICAgIE9NWF9JTlQgKnBEc3RTQUQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jayAgICg2LjEuNC4xLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb21wdXRlcyB0aGUgdGV4dHVyZSBlcnJvciBvZiB0aGUgYmxvY2suIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgcGxhbmUuIFRoaXMgc2hvdWxkIGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIHNyY1N0ZXAgLSBzdGVwIG9mIHRoZSBzb3VyY2UgcGxhbmUgCi0gKiAgIHBTcmNSZWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYnVmZmVyLCBhbiA4eDggYmxvY2suIFRoaXMgc2hvdWxkIGJlIAotICogICAgICAgICAgICBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIGFuIDh4OCBibG9jay4gVGhpcyBzaG91bGQgYmUgCi0gKiAgICAgICAgICAgIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmMsIHBTcmNSZWYsIHBEc3QuIAotICogICAgLSAgICBwU3JjIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIFNyY1N0ZXAgPD0gMCBvciBzcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgICBwU3JjUmVmIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHBEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2sgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBPTVhfSU5UIHNyY1N0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAotICAgIE9NWF9TMTYgKnBEc3QKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0xpbWl0TVZUb1JlY3QgICAoNi4xLjQuMS4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogTGltaXRzIHRoZSBtb3Rpb24gdmVjdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBibG9jay9tYWNyb2Jsb2NrIHRvIAotICogcHJldmVudCB0aGUgbW90aW9uIGNvbXBlbnNhdGVkIGJsb2NrL21hY3JvYmxvY2sgZnJvbSBtb3Zpbmcgb3V0c2lkZSBhIAotICogYm91bmRpbmcgcmVjdGFuZ2xlIGFzIHNob3duIGluIEZpZ3VyZSA2LTEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNNViAtIHBvaW50ZXIgdG8gdGhlIG1vdGlvbiB2ZWN0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IGJsb2NrIAotICogICAgICAgICAgICBvciBtYWNyb2Jsb2NrIAotICogICBwUmVjdFZPUFJlZiAtIHBvaW50ZXIgdG8gdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSAKLSAqICAgWGNvb3JkLCBZY29vcmQgIC0gY29vcmRpbmF0ZXMgb2YgdGhlIGN1cnJlbnQgYmxvY2sgb3IgbWFjcm9ibG9jayAKLSAqICAgc2l6ZSAtIHNpemUgb2YgdGhlIGN1cnJlbnQgYmxvY2sgb3IgbWFjcm9ibG9jazsgbXVzdCBiZSBlcXVhbCB0byA4IG9yIAotICogICAgICAgICAgICAxNi4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RNViAtIHBvaW50ZXIgdG8gdGhlIGxpbWl0ZWQgbW90aW9uIHZlY3RvciAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKLSAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmNNViwgcERzdE1WLCBvciBwUmVjdFZPUFJlZi4gCi0gKiAgICAtICAgIHNpemUgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA4IG9yIDE2LiAKLSAqICAgIC0gICAgdGhlIHdpZHRoIG9yIGhlaWdodCBvZiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIGlzIGxlc3MgdGhhbiAKLSAqICAgICAgICAgdHdpY2UgdGhlIGJsb2NrIHNpemUuCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fTGltaXRNVlRvUmVjdCAoCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNViwKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WLAotICAgIGNvbnN0IE9NWFJlY3QgKnBSZWN0Vk9QUmVmLAotICAgIE9NWF9JTlQgWGNvb3JkLAotICAgIE9NWF9JTlQgWWNvb3JkLAotICAgIE9NWF9JTlQgc2l6ZQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fU0FEXzE2eCAgICg2LjEuNC4xLjQpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBmb3IgMTZ4MTYgYW5kIDE2eDggYmxvY2tzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjT3JnIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCi0gKiAgICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIGlTdGVwT3JnIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyIAotICogICBwU3JjUmVmICAtIFBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayAKLSAqICAgaVN0ZXBSZWYgLSBTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyIAotICogICBpSGVpZ2h0ICAtIEhlaWdodCBvZiB0aGUgYmxvY2sgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RTQUQgLSBQb2ludGVyIG9mIHJlc3VsdCBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCi0gKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjT3JnLCBwRHN0U0FELCBvciBwU3JjUmVmIAotICogICAgLSAgICBwU3JjT3JnIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBpU3RlcE9yZyAgPD0gMCBvciBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAKLSAqICAgIC0gICAgaVN0ZXBSZWYgPD0gMCBvciBpU3RlcFJlZiBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAKLSAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgOCBvciAxNiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fU0FEXzE2eCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAotICAgIE9NWF9VMzIgaVN0ZXBPcmcsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAotICAgIE9NWF9VMzIgaVN0ZXBSZWYsCi0gICAgT01YX1MzMiAqcERzdFNBRCwKLSAgICBPTVhfVTMyIGlIZWlnaHQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX1NBRF84eCAgICg2LjEuNC4xLjUpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBmb3IgOHgxNiwgOHg4LCA4eDQgYmxvY2tzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjT3JnICAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA4LWJ5dGUgCi0gKiAgICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBpU3RlcE9yZyAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlciAKLSAqICAgcFNyY1JlZiAgLSBQb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgCi0gKiAgIGlTdGVwUmVmIC0gU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlciAKLSAqICAgaUhlaWdodCAgLSBIZWlnaHQgb2YgdGhlIGJsb2NrIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0U0FEIC1Qb2ludGVyIG9mIHJlc3VsdCBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCi0gKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjT3JnLCBwRHN0U0FELCBvciBwU3JjUmVmIAotICogICAgLSAgICBwU3JjT3JnIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIGlTdGVwT3JnICA8PSAwIG9yIGlTdGVwT3JnIGlzIG5vdCBhIG11bHRpcGxlIG9mIDggCi0gKiAgICAtICAgIGlTdGVwUmVmIDw9IDAgb3IgaVN0ZXBSZWYgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCAKLSAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgNCwgOCBvciAxNiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fU0FEXzh4ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNPcmcsCi0gICAgT01YX1UzMiBpU3RlcE9yZywKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCi0gICAgT01YX1UzMiBpU3RlcFJlZiwKLSAgICBPTVhfUzMyKnBEc3RTQUQsCi0gICAgT01YX1UzMiBpSGVpZ2h0Ci0pOwotCi0KLQotLyogNi4yLjEuMSBEaXJlY3Rpb24gICovCi0vKiBUaGUgZGlyZWN0aW9uIGVudW1lcmF0b3IgaXMgdXNlZCB3aXRoIGZ1bmN0aW9ucyB0aGF0IHBlcmZvcm0gQUMvREMgcHJlZGljdGlvbiBhbmQgemlnLXphZyBzY2FuLiAgKi8KLQotZW51bSB7Ci0gICAgT01YX1ZDX05PTkUgICAgICAgPSAwLAotICAgIE9NWF9WQ19IT1JJWk9OVEFMID0gMSwKLSAgICBPTVhfVkNfVkVSVElDQUwgICA9IDIgCi19OwotCi0KLQotLyogNi4yLjEuMiBCaWxpbmVhciBJbnRlcnBvbGF0aW9uICAqLwotLyogVGhlIGJpbGluZWFyIGludGVycG9sYXRpb24gZW51bWVyYXRvciBpcyB1c2VkIHdpdGggbW90aW9uIGVzdGltYXRpb24sIG1vdGlvbiBjb21wZW5zYXRpb24sIGFuZCByZWNvbnN0cnVjdGlvbiBmdW5jdGlvbnMuICAqLwotCi1lbnVtIHsKLSAgICBPTVhfVkNfSU5URUdFUl9QSVhFTCA9IDAsIC8qIGNhc2UgYSAqLwotICAgIE9NWF9WQ19IQUxGX1BJWEVMX1ggID0gMSwgLyogY2FzZSBiICovCi0gICAgT01YX1ZDX0hBTEZfUElYRUxfWSAgPSAyLCAvKiBjYXNlIGMgKi8KLSAgICBPTVhfVkNfSEFMRl9QSVhFTF9YWSA9IDMgIC8qIGNhc2UgZCAqLyAKLX07Ci0KLQotCi0vKiA2LjIuMS4zIE5laWdoYm9yaW5nIE1hY3JvYmxvY2sgQXZhaWxhYmlsaXR5ICAqLwotLyogTmVpZ2hib3JpbmcgbWFjcm9ibG9jayBhdmFpbGFiaWxpdHkgaXMgaW5kaWNhdGVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgZmxhZ3M6ICAgKi8KLQotZW51bSB7Ci0gICAgT01YX1ZDX1VQUEVSID0gMSwgICAgICAgIC8qKiBhYm92ZSBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLwotICAgIE9NWF9WQ19MRUZUID0gMiwgICAgICAgICAvKiogbGVmdCBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLwotICAgIE9NWF9WQ19DRU5URVIgPSA0LAotICAgIE9NWF9WQ19SSUdIVCA9IDgsCi0gICAgT01YX1ZDX0xPV0VSID0gMTYsCi0gICAgT01YX1ZDX1VQUEVSX0xFRlQgPSAzMiwgIC8qKiBhYm92ZS1sZWZ0IG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCi0gICAgT01YX1ZDX1VQUEVSX1JJR0hUID0gNjQsIC8qKiBhYm92ZS1yaWdodCBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLwotICAgIE9NWF9WQ19MT1dFUl9MRUZUID0gMTI4LAotICAgIE9NWF9WQ19MT1dFUl9SSUdIVCA9IDI1NiAKLX07Ci0KLQotCi0vKiA2LjIuMS40IFZpZGVvIENvbXBvbmVudHMgICovCi0vKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgdmlkZW8gY29tcG9uZW50cyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLwotCi10eXBlZGVmIGVudW0gewotICAgIE9NWF9WQ19MVU1JTkFOQ0UsICAgIC8qKiBMdW1pbmFuY2UgY29tcG9uZW50ICovCi0gICAgT01YX1ZDX0NIUk9NSU5BTkNFICAgLyoqIGNocm9taW5hbmNlIGNvbXBvbmVudCAqLyAKLX0gT01YVkNNNFAyVmlkZW9Db21wb25lbnQ7Ci0KLQotCi0vKiA2LjIuMS41IE1hY3JvYmxvY2tUeXBlcyAgKi8KLS8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBtYWNyb2Jsb2NrIHR5cGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgT01YX1ZDX0lOVEVSICAgICA9IDAsIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KLSAgICBPTVhfVkNfSU5URVJfUSAgID0gMSwgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLwotICAgIE9NWF9WQ19JTlRFUjRWICAgPSAyLCAvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCi0gICAgT01YX1ZDX0lOVFJBICAgICA9IDMsIC8qKiBJIGFuZCBQIHBpY3R1cmUsIEktIGFuZCBQLVZPUCAqLwotICAgIE9NWF9WQ19JTlRSQV9RICAgPSA0LCAvKiogSSBhbmQgUCBwaWN0dXJlLCBJLSBhbmQgUC1WT1AgKi8KLSAgICBPTVhfVkNfSU5URVI0Vl9RID0gNSAgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAoSC4yNjMpKi8KLX0gT01YVkNNNFAyTWFjcm9ibG9ja1R5cGU7Ci0KLQotCi0vKiA2LjIuMS42IENvb3JkaW5hdGVzICAqLwotLyogQ29vcmRpbmF0ZXMgYXJlIHJlcHJlc2VudGVkIGFzIGZvbGxvd3M6ICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgT01YX0lOVCB4OwotICAgIE9NWF9JTlQgeTsKLX0gT01YVkNNNFAyQ29vcmRpbmF0ZTsKLQotCi0KLS8qIDYuMi4xLjcgTW90aW9uIEVzdGltYXRpb24gQWxnb3JpdGhtcyAgKi8KLS8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBtb3Rpb24gZXN0aW1hdGlvbiBzZWFyY2ggbWV0aG9kcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLwotCi10eXBlZGVmIGVudW0gewotICAgIE9NWF9WQ19NNFAyX0ZBU1RfU0VBUkNIID0gMCwgIC8qKiBGYXN0IG1vdGlvbiBzZWFyY2ggKi8KLSAgICBPTVhfVkNfTTRQMl9GVUxMX1NFQVJDSCA9IDEgICAvKiogRnVsbCBtb3Rpb24gc2VhcmNoICovIAotfSBPTVhWQ000UDJNRU1vZGU7Ci0KLQotCi0vKiA2LjIuMS44IE1vdGlvbiBFc3RpbWF0aW9uIFBhcmFtZXRlcnMgICovCi0vKiBBIGRhdGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgY29udHJvbCBwYXJhbWV0ZXJzIGZvciAKLSAqIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9ucyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAKLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgT01YX0lOVCBzZWFyY2hFbmFibGU4eDg7ICAgICAvKiogZW5hYmxlcyA4eDggc2VhcmNoICovCi0gICAgT01YX0lOVCBoYWxmUGVsU2VhcmNoRW5hYmxlOyAvKiogZW5hYmxlcyBoYWxmLXBlbCByZXNvbHV0aW9uICovCi0gICAgT01YX0lOVCBzZWFyY2hSYW5nZTsgICAgICAgICAvKiogc2VhcmNoIHJhbmdlICovCi0gICAgT01YX0lOVCBybmRWYWw7ICAgICAgICAgICAgICAvKiogcm91bmRpbmcgY29udHJvbDsgMC1kaXNhYmxlZCwgMS1lbmFibGVkKi8KLX0gT01YVkNNNFAyTUVQYXJhbXM7Ci0KLQotCi0vKiA2LjIuMS45IE1hY3JvYmxvY2sgSW5mb3JtYXRpb24gICAqLwotLyogQSBkYXRhIHN0cnVjdHVyZSBjb250YWluaW5nIG1hY3JvYmxvY2sgcGFyYW1ldGVycyBmb3IgCi0gKiBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE9NWF9TMzIgc2xpY2VJZDsgICAgICAgICAgICAgICAgIC8qIHNsaWNlIG51bWJlciAqLwotICAgIE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlIG1iVHlwZTsgIC8qIE1CIHR5cGU6IE9NWF9WQ19JTlRSQSwgT01YX1ZDX0lOVEVSLCBvciBPTVhfVkNfSU5URVI0ICovCi0gICAgT01YX1MzMiBxcDsgICAgICAgICAgICAgICAgICAgICAgLyogcXVhbnRpemF0aW9uIHBhcmFtZXRlciovCi0gICAgT01YX1UzMiBjYnB5OyAgICAgICAgICAgICAgICAgICAgLyogQ0JQIEx1bWEgKi8KLSAgICBPTVhfVTMyIGNicGM7ICAgICAgICAgICAgICAgICAgICAvKiBDQlAgQ2hyb21hICovCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgcE1WMFsyXVsyXTsgICAgLyogbW90aW9uIHZlY3RvciwgcmVwcmVzZW50ZWQgdXNpbmcgMS8yLXBlbCB1bml0cywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcE1WMFtibG9ja3ldW2Jsb2NreF0gKGJsb2NreSA9IDB+MSwgYmxvY2t4ID0wfjEpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVlByZWRbMl1bMl07IC8qIG1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbiwgcmVwcmVzZW50ZWQgdXNpbmcgMS8yLXBlbCB1bml0cywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcE1WUHJlZFtibG9ja3ldW2Jsb2NreF0gKGJsb2NreSA9IDB+MSwgYmxvY2t4ID0gMH4xKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBPTVhfVTggcFByZWREaXJbMl1bMl07ICAgICAgICAgICAvKiBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbjogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBPTVhfVkNfTk9ORSwgT01YX1ZDX1ZFUlRJQ0FMLCBPTVhfVkNfSE9SSVpPTlRBTCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLX0gT01YVkNNNFAyTUJJbmZvLCAqT01YVkNNNFAyTUJJbmZvUHRyOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9GaW5kTVZwcmVkICAgKDYuMi4zLjEuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFByZWRpY3RzIGEgbW90aW9uIHZlY3RvciBmb3IgdGhlIGN1cnJlbnQgYmxvY2sgdXNpbmcgdGhlIHByb2NlZHVyZSAKLSAqIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuNS4gIFRoZSByZXN1bHRpbmcgcHJlZGljdGVkIE1WIGlzIAotICogcmV0dXJuZWQgaW4gcERzdE1WUHJlZC4gSWYgdGhlIHBhcmFtZXRlciBwRHN0TVZQcmVkTUUgaWYgaXMgbm90IE5VTEwgdGhlbiAKLSAqIHRoZSBzZXQgb2YgdGhyZWUgTVYgY2FuZGlkYXRlcyB1c2VkIGZvciBwcmVkaWN0aW9uIGlzIGFsc28gcmV0dXJuZWQsIAotICogb3RoZXJ3aXNlIHBEc3RNVlByZWRNRWlzIE5VTEwgdXBvbiByZXR1cm4uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNNVkN1ck1CIC0gcG9pbnRlciB0byB0aGUgTVYgYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBZIAotICogICAgICAgICAgICBtYWNyb2Jsb2NrOyBhIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKLSAqICAgcFNyY0NhbmRNVjEgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgY29udGFpbmluZyB0aGUgNCBNVnMgYXNzb2NpYXRlZCAKLSAqICAgICAgICAgICAgd2l0aCB0aGUgTUIgbG9jYXRlZCB0byB0aGUgbGVmdCBvZiB0aGUgY3VycmVudCBNQjsgc2V0IHRvIE5VTEwgCi0gKiAgICAgICAgICAgIGlmIHRoZXJlIGlzIG5vIE1CIHRvIHRoZSBsZWZ0LiAKLSAqICAgcFNyY0NhbmRNVjIgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgY29udGFpbmluZyB0aGUgNCBNVnMgYXNzb2NpYXRlZCAKLSAqICAgICAgICAgICAgd2l0aCB0aGUgTUIgbG9jYXRlZCBhYm92ZSB0aGUgY3VycmVudCBNQjsgc2V0IHRvIE5VTEwgaWYgdGhlcmUgCi0gKiAgICAgICAgICAgIGlzIG5vIE1CIGxvY2F0ZWQgYWJvdmUgdGhlIGN1cnJlbnQgTUIuIAotICogICBwU3JjQ2FuZE1WMyAtIHBvaW50ZXIgdG8gdGhlIE1WIGJ1ZmZlciBjb250YWluaW5nIHRoZSA0IE1WcyBhc3NvY2lhdGVkIAotICogICAgICAgICAgICB3aXRoIHRoZSBNQiBsb2NhdGVkIHRvIHRoZSByaWdodCBhbmQgYWJvdmUgdGhlIGN1cnJlbnQgTUI7IHNldCAKLSAqICAgICAgICAgICAgdG8gTlVMTCBpZiB0aGVyZSBpcyBubyBNQiBsb2NhdGVkIHRvIHRoZSBhYm92ZS1yaWdodC4gCi0gKiAgIGlCbGsgLSB0aGUgaW5kZXggb2YgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKLSAqICAgcERzdE1WUHJlZE1FIC0gTVYgY2FuZGlkYXRlIHJldHVybiBidWZmZXI7ICBpZiBzZXQgdG8gTlVMTCB0aGVuIAotICogICAgICAgICAgICBwcmVkaWN0aW9uIGNhbmRpZGF0ZSBNVnMgYXJlIG5vdCByZXR1cm5lZCBhbmQgcERzdE1WUHJlZE1FIHdpbGwgCi0gKiAgICAgICAgICAgIGJlIE5VTEwgdXBvbiBmdW5jdGlvbiByZXR1cm47IGlmIHBEc3RNVlByZWRNRSBpcyBub24tTlVMTCB0aGVuIGl0IAotICogICAgICAgICAgICBtdXN0IHBvaW50IHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgc3VmZmljaWVudCBzcGFjZSBmb3IgdGhyZWUgCi0gKiAgICAgICAgICAgIHJldHVybiBNVnMuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0TVZQcmVkIC0gcG9pbnRlciB0byB0aGUgcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3IgCi0gKiAgIHBEc3RNVlByZWRNRSAtIGlmIG5vbi1OVUxMIHVwb24gaW5wdXQgdGhlbiBwRHN0TVZQcmVkTUUgIHBvaW50cyB1cG9uIAotICogICAgICAgICAgICByZXR1cm4gdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgdGhyZWUgbW90aW9uIHZlY3RvciBjYW5kaWRhdGVzIAotICogICAgICAgICAgICB1c2VkIGZvciBwcmVkaWN0aW9uIGFzIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSAKLSAqICAgICAgICAgICAgNy42LjUsIG90aGVyd2lzZSBpZiBOVUxMIHVwb24gaW5wdXQgdGhlbiBwRHN0TVZQcmVkTUUgaXMgTlVMTCAKLSAqICAgICAgICAgICAgdXBvbiBvdXRwdXQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKLSAqICAgIC0gICAgdGhlIHBvaW50ZXIgcERzdE1WUHJlZCBpcyBOVUxMIAotICogICAgLSAgICB0aGUgcGFyYW1ldGVyIGlCbGsgZG9lcyBub3QgZmFsbCBpbnRvIHRoZSByYW5nZSAwIDw9IGlCbGs8PTMgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0ZpbmRNVnByZWQgKAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZDdXJNQiwKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0NhbmRNVjEsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNDYW5kTVYyLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjQ2FuZE1WMywKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WUHJlZCwKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WUHJlZE1FLAotICAgIE9NWF9JTlQgaUJsawotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfSURDVDh4OGJsayAgICg2LjIuMy4yLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb21wdXRlcyBhIDJEIGludmVyc2UgRENUIGZvciBhIHNpbmdsZSA4eDggYmxvY2ssIGFzIGRlZmluZWQgaW4gCi0gKiBbSVNPMTQ0OTYtMl0uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgSURDVCBpbnB1dCBidWZmZXI7IAotICogICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgQWNjb3JkaW5nIHRvIAotICogICAgICAgICAgICBbSVNPMTQ0OTYtMl0sIHRoZSBpbnB1dCBjb2VmZmljaWVudCB2YWx1ZXMgc2hvdWxkIGxpZSB3aXRoaW4gdGhlIAotICogICAgICAgICAgICByYW5nZSBbLTIwNDgsIDIwNDddLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lYXJseSBhcnJhbmdlZCBJRENUIG91dHB1dCBidWZmZXI7IAotICogICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIE5VTEwuIAotICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0lEQ1Q4eDhibGsgKAotICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCi0gICAgT01YX1MxNiAqcERzdAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfTUVHZXRCdWZTaXplICAgKDYuMi40LjEuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbXB1dGVzIHRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIAotICogc3RydWN0dXJlIGZvciB0aGUgZm9sbG93aW5nIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9uczogCi0gKiBCbG9ja01hdGNoX0ludGVnZXJfOHg4LCBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYsIGFuZCBNb3Rpb25Fc3RpbWF0aW9uTUIuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCi0gKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDJNRU1vZGUgCi0gKiAgIHBNRVBhcmFtcyAtIG1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTaXplIC0gcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgc3BlY2lmaWNhdGlvbiAKLSAqICAgICAgICAgICAgc3RydWN0dXJlIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAotICogICAgLSAgICBhbiBpbnZhbGlkIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSBwYXJhbWV0ZXIgTUVtb2RlIAotICogICAgLSAgICBhIG5lZ2F0aXZlIG9yIHplcm8gdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIAotICogICAgICAgICBwYXJhbWV0ZXIgcE1FUGFyYW1zLT5zZWFyY2hSYW5nZSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfTUVHZXRCdWZTaXplICgKLSAgICBPTVhWQ000UDJNRU1vZGUgTUVtb2RlLAotICAgIGNvbnN0IE9NWFZDTTRQMk1FUGFyYW1zICpwTUVQYXJhbXMsCi0gICAgT01YX1UzMiAqcFNpemUKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01FSW5pdCAgICg2LjIuNC4xLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBJbml0aWFsaXplcyB0aGUgdmVuZG9yLXNwZWNpZmljIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIHJlcXVpcmVkIGZvciB0aGUgCi0gKiBmb2xsb3dpbmcgbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zOiAgQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCwgCi0gKiBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYsIGFuZCBNb3Rpb25Fc3RpbWF0aW9uTUIuIE1lbW9yeSBmb3IgdGhlIAotICogc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgKnBNRVNwZWMgbXVzdCBiZSBhbGxvY2F0ZWQgcHJpb3IgdG8gY2FsbGluZyB0aGUgCi0gKiBmdW5jdGlvbiwgYW5kIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgRm9sbG93aW5nIAotICogaW5pdGlhbGl6YXRpb24gYnkgdGhpcyBmdW5jdGlvbiwgdGhlIHZlbmRvci1zcGVjaWZpYyBzdHJ1Y3R1cmUgKnBNRVNwZWMgCi0gKiBzaG91bGQgY29udGFpbiBhbiBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyByZXByZXNlbnRhdGlvbiBvZiBhbGwgbW90aW9uIAotICogZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIHJlY2VpdmVkIHZpYSB0aGUgc3RydWN0dXJlIHBNRVBhcmFtcywgZm9yIGV4YW1wbGUgIAotICogcm5kVmFsLCBzZWFyY2hSYW5nZSwgZXRjLiAgVGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIAotICogc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgY2FuIGJlIGRldGVybWluZWQgdXNpbmcgdGhlIGZ1bmN0aW9uIAotICogb214VkNNNFAyX01FR2V0QnVmU2l6ZS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgTUVtb2RlIC0gbW90aW9uIGVzdGltYXRpb24gbW9kZTsgYXZhaWxhYmxlIG1vZGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSAKLSAqICAgICAgICAgICAgZW51bWVyYXRlZCB0eXBlIE9NWFZDTTRQMk1FTW9kZSAKLSAqICAgcE1FUGFyYW1zIC0gbW90aW9uIGVzdGltYXRpb24gcGFyYW1ldGVycyAKLSAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIHVuaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsaXplZCBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYW4gaW52YWxpZCB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgcGFyYW1ldGVyIE1FbW9kZSAKLSAqICAgIC0gICAgYSBuZWdhdGl2ZSBvciB6ZXJvIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSAKLSAqICAgICAgICAgcGFyYW1ldGVyIHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX01FSW5pdCAoCi0gICAgT01YVkNNNFAyTUVNb2RlIE1FbW9kZSwKLSAgICBjb25zdCBPTVhWQ000UDJNRVBhcmFtcypwTUVQYXJhbXMsCi0gICAgdm9pZCAqcE1FU3BlYwotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2ICAgKDYuMi40LjIuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgc2VhcmNoOyBlc3RpbWF0ZXMgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCAKLSAqIG1pbmltdW0gU0FELiBCb3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IG1vdGlvbiB2ZWN0b3JzIGFyZSByZXByZXNlbnRlZCB1c2luZyAKLSAqIGhhbGYtcGl4ZWwgdW5pdHMsIGFuZCB0aGVyZWZvcmUgYSBzaGlmdCBsZWZ0IG9yIHJpZ2h0IGJ5IDEgYml0IG1heSBiZSAKLSAqIHJlcXVpcmVkLCByZXNwZWN0aXZlbHksIHRvIG1hdGNoIHRoZSBpbnB1dCBvciBvdXRwdXQgTVZzIHdpdGggb3RoZXIgCi0gKiBmdW5jdGlvbnMgdGhhdCBlaXRoZXIgZ2VuZXJhdGUgb3V0cHV0IE1WcyBvciBleHBlY3QgaW5wdXQgTVZzIHJlcHJlc2VudGVkIAotICogdXNpbmcgaW50ZWdlciBwaXhlbCB1bml0cy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgTUIgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiAKLSAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgcGxhbmUuIAotICogICByZWZXaWR0aCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUgCi0gKiAgIHBSZWZSZWN0IC0gcG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHBsYW5lIHJlY3RhbmdsZTsgY29vcmRpbmF0ZXMgCi0gKiAgICAgICAgICAgIGFyZSBzcGVjaWZpZWQgcmVsYXRpdmUgdG8gdGhlIGltYWdlIG9yaWdpbi4gIFJlY3RhbmdsZSAKLSAqICAgICAgICAgICAgYm91bmRhcmllcyBtYXkgZXh0ZW5kIGJleW9uZCBpbWFnZSBib3VuZGFyaWVzIGlmIHRoZSBpbWFnZSBoYXMgCi0gKiAgICAgICAgICAgIGJlZW4gcGFkZGVkLiAgRm9yIGV4YW1wbGUsIGlmIHBhZGRpbmcgZXh0ZW5kcyA0IHBpeGVscyBiZXlvbmQgCi0gKiAgICAgICAgICAgIGZyYW1lIGJvcmRlciwgdGhlbiB0aGUgdmFsdWUgZm9yIHRoZSBsZWZ0IGJvcmRlciBjb3VsZCBiZSBzZXQgdG8gCi0gKiAgICAgICAgICAgIC00LiAKLSAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCi0gKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMjU2IAotICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCi0gKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2LiAKLSAqICAgcEN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCi0gKiAgIHBTcmNQcmVNViAtIHBvaW50ZXIgdG8gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3I7IE5VTEwgaW5kaWNhdGVzIG5vIAotICogICAgICAgICAgICBwcmVkaWN0ZWQgTVYgCi0gKiAgIHBTcmNQcmVTQUQgLSBwb2ludGVyIHRvIFNBRCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWRpY3RlZCBNViAocmVmZXJlbmNlZCAKLSAqICAgICAgICAgICAgYnkgcFNyY1ByZU1WKTsgbWF5IGJlIHNldCB0byBOVUxMIGlmIHVuYXZhaWxhYmxlLiAKLSAqICAgcE1FU3BlYyAtIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgCi0gKiAgICAgICAgICAgIG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyAKLSAqICAgICAgICAgICAgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoZSBibG9jayBtYXRjaGluZyBmdW5jdGlvbi4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAotICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNSZWZCdWYsIAotICogICAgICAgICAgICAgIHBSZWZSZWN0LCBwU3JjQ3VyckJ1ZmYsIHBDdXJyUG9pbnRQb3MsIHBEc3RNViwgcERzdFNBRCBvciAKLSAqICAgICAgICAgICAgICBwTUVTcGVjLCBvciAKLSAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCi0gICAgT01YX0lOVCByZWZXaWR0aCwKLSAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAotICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IqcFNyY1ByZU1WLAotICAgIGNvbnN0IE9NWF9JTlQgKnBTcmNQcmVTQUQsCi0gICAgdm9pZCAqcE1FU3BlYywKLSAgICBPTVhWQ01vdGlvblZlY3RvcipwRHN0TVYsCi0gICAgT01YX0lOVCAqcERzdFNBRAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCAgICg2LjIuNC4yLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhbiA4eDggYmxvY2sgc2VhcmNoOyBlc3RpbWF0ZXMgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCAKLSAqIG1pbmltdW0gU0FELiAgQm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgCi0gKiB1c2luZyBoYWxmLXBpeGVsIHVuaXRzLCBhbmQgdGhlcmVmb3JlIGEgc2hpZnQgbGVmdCBvciByaWdodCBieSAxIGJpdCBtYXkgYmUgCi0gKiByZXF1aXJlZCwgcmVzcGVjdGl2ZWx5LCB0byBtYXRjaCB0aGUgaW5wdXQgb3Igb3V0cHV0IE1WcyB3aXRoIG90aGVyIAotICogZnVuY3Rpb25zIHRoYXQgZWl0aGVyIGdlbmVyYXRlIG91dHB1dCBNVnMgb3IgZXhwZWN0IGlucHV0IE1WcyByZXByZXNlbnRlZCAKLSAqIHVzaW5nIGludGVnZXIgcGl4ZWwgdW5pdHMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIGJsb2NrIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IDh4OCBibG9jayAKLSAqICAgICAgICAgICAgaW4gdGhlIGN1cnJlbnQgcGxhbmUuIAotICogICByZWZXaWR0aCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUgCi0gKiAgIHBSZWZSZWN0IC0gcG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHBsYW5lIHJlY3RhbmdsZTsgY29vcmRpbmF0ZXMgCi0gKiAgICAgICAgICAgIGFyZSBzcGVjaWZpZWQgcmVsYXRpdmUgdG8gdGhlIGltYWdlIG9yaWdpbi4gIFJlY3RhbmdsZSAKLSAqICAgICAgICAgICAgYm91bmRhcmllcyBtYXkgZXh0ZW5kIGJleW9uZCBpbWFnZSBib3VuZGFyaWVzIGlmIHRoZSBpbWFnZSBoYXMgCi0gKiAgICAgICAgICAgIGJlZW4gcGFkZGVkLiAKLSAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCi0gKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMTI4IAotICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCi0gKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2IGJ5dGVzLiAKLSAqICAgcEN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lIAotICogICBwU3JjUHJlTVYgLSBwb2ludGVyIHRvIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yOyBOVUxMIGluZGljYXRlcyBubyAKLSAqICAgICAgICAgICAgcHJlZGljdGVkIE1WIAotICogICBwU3JjUHJlU0FEIC0gcG9pbnRlciB0byBTQUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVkaWN0ZWQgTVYgKHJlZmVyZW5jZWQgCi0gKiAgICAgICAgICAgIGJ5IHBTcmNQcmVNVik7IG1heSBiZSBzZXQgdG8gTlVMTCBpZiB1bmF2YWlsYWJsZS4gCi0gKiAgIHBNRVNwZWMgLSB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IAotICogICAgICAgICAgICBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgYW5kIHRoZW4gaW5pdGlhbGl6ZWQgdXNpbmcgCi0gKiAgICAgICAgICAgIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgYmxvY2sgbWF0Y2hpbmcgZnVuY3Rpb24uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0TVYgLSBwb2ludGVyIHRvIGVzdGltYXRlZCBNViAKLSAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gbWluaW11bSBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjUmVmQnVmLCAKLSAqICAgICAgICAgICAgICBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwQ3VyclBvaW50UG9zLCBwRHN0TVYsIHBEc3RTQUQgb3IgCi0gKiAgICAgICAgICAgICAgcE1FU3BlYywgb3IgCi0gKiAgICAtICAgIHBTcmNDdXJyQnVmIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAotICAgIE9NWF9JTlQgcmVmV2lkdGgsCi0gICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKLSAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjUHJlTVYsCi0gICAgY29uc3QgT01YX0lOVCAqcFNyY1ByZVNBRCwKLSAgICB2b2lkICpwTUVTcGVjLAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVYsCi0gICAgT01YX0lOVCAqcERzdFNBRAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2ICAgKDYuMi40LjIuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgbWF0Y2ggd2l0aCBoYWxmLXBpeGVsIHJlc29sdXRpb24uICBSZXR1cm5zIHRoZSAKLSAqIGVzdGltYXRlZCBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgVGhpcyBmdW5jdGlvbiAKLSAqIGVzdGltYXRlcyB0aGUgaGFsZi1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGludGVnZXIgCi0gKiByZXNvbHV0aW9uIG1vdGlvbiB2ZWN0b3IgcmVmZXJlbmNlZCBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RNViwgaS5lLiwgCi0gKiB0aGUgaW5pdGlhbCBpbnRlZ2VyIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGlucHV0IHBhcmFtZXRlcnMgCi0gKiBwU3JjUmVmQnVmIGFuZCBwU2VhcmNoUG9pbnRSZWZQb3Mgc2hvdWxkIGJlIHNoaWZ0ZWQgYnkgdGhlIHdpbm5pbmcgTVYgb2YgCi0gKiAxNngxNiBpbnRlZ2VyIHNlYXJjaCBwcmlvciB0byBjYWxsaW5nIEJsb2NrTWF0Y2hfSGFsZl8xNngxNi4gVGhlIGZ1bmN0aW9uIAotICogQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2IG1heSBiZSB1c2VkIGZvciBpbnRlZ2VyIG1vdGlvbiBlc3RpbWF0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAotICogICAgICAgICAgICBtYWNyb2Jsb2NrIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lLiAKLSAqICAgcmVmV2lkdGggLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lIAotICogICBwUmVmUmVjdCAtIHJlZmVyZW5jZSBwbGFuZSB2YWxpZCByZWdpb24gcmVjdGFuZ2xlIAotICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKLSAqICAgICAgICAgICAgYnVmZmVyIGV4dHJhY3RlZCBmcm9tIHRoZSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAyNTYgCi0gKiAgICAgICAgICAgIGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKLSAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYuIAotICogICBwU2VhcmNoUG9pbnRSZWZQb3MgLSBwb3NpdGlvbiBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGhhbGYgcGl4ZWwgCi0gKiAgICAgICAgICAgIHNlYXJjaCAoc3BlY2lmaWVkIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMpIGluIHRoZSAKLSAqICAgICAgICAgICAgcmVmZXJlbmNlIHBsYW5lLCBpLmUuLCB0aGUgcmVmZXJlbmNlIHBvc2l0aW9uIHBvaW50ZWQgdG8gYnkgdGhlIAotICogICAgICAgICAgICBwcmVkaWN0ZWQgbW90aW9uIHZlY3Rvci4gCi0gKiAgIHJuZFZhbCAtIHJvdW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVyOiAwIC0gZGlzYWJsZWQ7IDEgLSBlbmFibGVkLiAKLSAqICAgcFNyY0RzdE1WIC0gcG9pbnRlciB0byB0aGUgaW5pdGlhbCBNViBlc3RpbWF0ZTsgdHlwaWNhbGx5IGdlbmVyYXRlZCAKLSAqICAgICAgICAgICAgZHVyaW5nIGEgcHJpb3IgMTZYMTYgaW50ZWdlciBzZWFyY2g7IHNwZWNpZmllZCBpbiB0ZXJtcyBvZiAKLSAqICAgICAgICAgICAgaGFsZi1waXhlbCB1bml0cy4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAotICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNSZWZCdWYsIAotICogICAgICAgICBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwU2VhcmNoUG9pbnRSZWZQb3MsIHBTcmNEc3RNVi4KLSAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCwgb3IgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNiAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAotICAgIE9NWF9JTlQgcmVmV2lkdGgsCi0gICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKLSAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwU2VhcmNoUG9pbnRSZWZQb3MsCi0gICAgT01YX0lOVCBybmRWYWwsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RNViwKLSAgICBPTVhfSU5UICpwRHN0U0FECi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4ICAgKDYuMi40LjIuNCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGFuIDh4OCBibG9jayBtYXRjaCB3aXRoIGhhbGYtcGl4ZWwgcmVzb2x1dGlvbi4gUmV0dXJucyB0aGUgCi0gKiBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIFRoaXMgZnVuY3Rpb24gCi0gKiBlc3RpbWF0ZXMgdGhlIGhhbGYtcGl4ZWwgbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIAotICogcmVzb2x1dGlvbiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0TVYsIGkuZS4sIAotICogdGhlIGluaXRpYWwgaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgZXh0ZXJuYWxseS4gIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIAotICogcFNyY1JlZkJ1ZiBhbmQgcFNlYXJjaFBvaW50UmVmUG9zIHNob3VsZCBiZSBzaGlmdGVkIGJ5IHRoZSB3aW5uaW5nIE1WIG9mIAotICogOHg4IGludGVnZXIgc2VhcmNoIHByaW9yIHRvIGNhbGxpbmcgQmxvY2tNYXRjaF9IYWxmXzh4OC4gVGhlIGZ1bmN0aW9uIAotICogQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCBtYXkgYmUgdXNlZCBmb3IgaW50ZWdlciBtb3Rpb24gZXN0aW1hdGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgYmxvY2sgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgOHg4IGJsb2NrIAotICogICAgICAgICAgICBpbiB0aGUgY3VycmVudCBwbGFuZS4gCi0gKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKLSAqICAgcFJlZlJlY3QgLSByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZSAKLSAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCi0gKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMTI4IAotICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKLSAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYuIAotICogICBwU2VhcmNoUG9pbnRSZWZQb3MgLSBwb3NpdGlvbiBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGhhbGYgcGl4ZWwgCi0gKiAgICAgICAgICAgIHNlYXJjaCAoc3BlY2lmaWVkIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMpIGluIHRoZSAKLSAqICAgICAgICAgICAgcmVmZXJlbmNlIHBsYW5lLiAKLSAqICAgcm5kVmFsIC0gcm91bmRpbmcgY29udHJvbCBwYXJhbWV0ZXI6IDAgLSBkaXNhYmxlZDsgMSAtIGVuYWJsZWQuIAotICogICBwU3JjRHN0TVYgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsIE1WIGVzdGltYXRlOyB0eXBpY2FsbHkgZ2VuZXJhdGVkIAotICogICAgICAgICAgICBkdXJpbmcgYSBwcmlvciA4eDggaW50ZWdlciBzZWFyY2gsIHNwZWNpZmllZCBpbiB0ZXJtcyBvZiAKLSAqICAgICAgICAgICAgaGFsZi1waXhlbCB1bml0cy4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAotICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjUmVmQnVmLCBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwU2VhcmNoUG9pbnRSZWZQb3MsIHBTcmNEc3RNVgotICogICAgLSAgICBwU3JjQ3VyckJ1ZiBpcyBub3QgOC1ieXRlIGFsaWduZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDggKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKLSAgICBPTVhfSU5UIHJlZldpZHRoLAotICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCi0gICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcFNlYXJjaFBvaW50UmVmUG9zLAotICAgIE9NWF9JTlQgcm5kVmFsLAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0TVYsCi0gICAgT01YX0lOVCAqcERzdFNBRAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CICAgKDYuMi40LjMuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIG1vdGlvbiBzZWFyY2ggZm9yIGEgMTZ4MTYgbWFjcm9ibG9jay4gIFNlbGVjdHMgYmVzdCBtb3Rpb24gc2VhcmNoIAotICogc3RyYXRlZ3kgZnJvbSBhbW9uZyBpbnRlci0xTVYsIGludGVyLTRNViwgYW5kIGludHJhIG1vZGVzLiAgU3VwcG9ydHMgCi0gKiBpbnRlZ2VyIGFuZCBoYWxmIHBpeGVsIHJlc29sdXRpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjdXJyZW50IE1CIGluIHRoZSAKLSAqICAgICAgICAgICAgb3JpZ2luYWwgcGljdHVyZSBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIAotICogICAgICAgICAgICBUaGUgZnVuY3Rpb24gZG9lcyBub3QgZXhwZWN0IHNvdXJjZSBkYXRhIG91dHNpZGUgdGhlIHJlZ2lvbiAKLSAqICAgICAgICAgICAgYm91bmRlZCBieSB0aGUgTUIgdG8gYmUgYXZhaWxhYmxlOyBmb3IgZXhhbXBsZSBpdCBpcyBub3QgCi0gKiAgICAgICAgICAgIG5lY2Vzc2FyeSBmb3IgdGhlIGNhbGxlciB0byBndWFyYW50ZWUgdGhlIGF2YWlsYWJpbGl0eSBvZiAKLSAqICAgICAgICAgICAgcFNyY0N1cnJCdWZbLVNyY0N1cnJTdGVwXSwgaS5lLiwgdGhlIHJvdyBvZiBwaXhlbHMgYWJvdmUgdGhlIE1CIAotICogICAgICAgICAgICB0byBiZSBwcm9jZXNzZWQuIAotICogICBzcmNDdXJyU3RlcCAtIHdpZHRoIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lLCBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIHBsYW5lIGxvY2F0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIHNyY1JlZlN0ZXAgLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUsIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgcFJlZlJlY3QgLSByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZSwgc3BlY2lmaWVkIHJlbGF0aXZlIHRvIAotICogICAgICAgICAgICB0aGUgaW1hZ2Ugb3JpZ2luIAotICogICBwQ3VyclBvaW50UG9zIC0gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZSAKLSAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIAotICogICAgICAgICAgICBzdHJ1Y3R1cmU7IG11c3QgYmUgYWxsb2NhdGVkIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIAotICogICAgICAgICAgICBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gCi0gKiAgIHBNQkluZm8gLSBhcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBmb3VyIG5lYXJieSBNQnM6IAotICogICAgICAgICAgICAtICAgcE1CSW5mb1swXSAtIHBvaW50ZXIgdG8gbGVmdCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgLSAgIHBNQkluZm9bMV0gLSBwb2ludGVyIHRvIHRvcCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgLSAgIHBNQkluZm9bMl0gLSBwb2ludGVyIHRvIHRvcC1sZWZ0IE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICAtICAgcE1CSW5mb1szXSAtIHBvaW50ZXIgdG8gdG9wLXJpZ2h0IE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICBBbnkgcG9pbnRlciBpbiB0aGUgYXJyYXkgbWF5IGJlIHNldCBlcXVhbCB0byBOVUxMIGlmIHRoZSAKLSAqICAgICAgICAgICAgY29ycmVzcG9uZGluZyBNQiBkb2Vzbid0IGV4aXN0LiAgRm9yIGVhY2ggTUIsIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIAotICogICAgICAgICAgICBtZW1iZXJzIGFyZSB1c2VkOiAgICAKLSAqICAgICAgICAgICAgLSAgIG1iVHlwZSAtIG1hY3JvYmxvY2sgdHlwZSwgZWl0aGVyIE9NWF9WQ19JTlRSQSwgT01YX1ZDX0lOVEVSLCBvciAKLSAqICAgICAgICAgICAgICAgIE9NWF9WQ19JTlRFUjRWIAotICogICAgICAgICAgICAtICAgcE1WMFsyXVsyXSAtIGVzdGltYXRlZCBtb3Rpb24gdmVjdG9yczsgcmVwcmVzZW50ZWQgCi0gKiAgICAgICAgICAgICAgICBpbiAxLzIgcGl4ZWwgdW5pdHMgCi0gKiAgICAgICAgICAgIC0gICBzbGljZUlEIC0gbnVtYmVyIG9mIHRoZSBzbGljZSB0byB3aGljaCB0aGUgTUIgYmVsb25ncyAKLSAqICAgcFNyY0RzdE1CQ3VyciAtIHBvaW50ZXIgdG8gaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCBNQi4gIAotICogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGVudHJpZXMgc2hvdWxkIGJlIHNldCBwcmlvciB0byBjYWxsaW5nIHRoZSAKLSAqICAgICAgICAgICAgZnVuY3Rpb246IHNsaWNlSUQgLSB0aGUgbnVtYmVyIG9mIHRoZSBzbGljZSB0aGUgdG8gd2hpY2ggdGhlIAotICogICAgICAgICAgICBjdXJyZW50IE1CIGJlbG9uZ3MuICBUaGUgc3RydWN0dXJlIGVsZW1lbnRzIGNicHkgYW5kIGNicGMgYXJlIAotICogICAgICAgICAgICBpZ25vcmVkLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdE1CQ3VyciAtIHBvaW50ZXIgdG8gdXBkYXRlZCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBNQiBhZnRlciBNQi1sZXZlbCBtb3Rpb24gZXN0aW1hdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQuICBUaGUgCi0gKiAgICAgICAgICAgIGZvbGxvd2luZyBzdHJ1Y3R1cmUgbWVtYmVycyBhcmUgdXBkYXRlZCBieSB0aGUgTUUgZnVuY3Rpb246ICAgCi0gKiAgICAgICAgICAgICAgLSAgbWJUeXBlIC0gbWFjcm9ibG9jayB0eXBlOiBPTVhfVkNfSU5UUkEsIE9NWF9WQ19JTlRFUiwgb3IgCi0gKiAgICAgICAgICAgICAgICAgT01YX1ZDX0lOVEVSNFYuIAotICogICAgICAgICAgICAgIC0gIHBNVjBbMl1bMl0gLSBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvcnM7IHJlcHJlc2VudGVkIGluIAotICogICAgICAgICAgICAgICAgIHRlcm1zIG9mIDEvMiBwZWwgdW5pdHMuIAotICogICAgICAgICAgICAgIC0gIHBNVlByZWRbMl1bMl0gLSBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcnM7IHJlcHJlc2VudGVkIAotICogICAgICAgICAgICAgICAgIGluIHRlcm1zIG9mIDEvMiBwZWwgdW5pdHMuIAotICogICAgICAgICAgICBUaGUgc3RydWN0dXJlIG1lbWJlcnMgY2JweSBhbmQgY2JwYyBhcmUgbm90IHVwZGF0ZWQgYnkgdGhlIGZ1bmN0aW9uLiAKLSAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gdGhlIG1pbmltdW0gU0FEIGZvciBJTlRFUjFWLCBvciBzdW0gb2YgbWluaW11bSBTQURzIAotICogICAgICAgICAgICBmb3IgSU5URVI0ViAKLSAqICAgcERzdEJsb2NrU0FEIC0gcG9pbnRlciB0byBhbiBhcnJheSBvZiBTQUQgdmFsdWVzIGZvciBlYWNoIG9mIHRoZSBmb3VyIAotICogICAgICAgICAgICA4eDggbHVtYSBibG9ja3MgaW4gdGhlIE1CLiAgVGhlIGJsb2NrIFNBRHMgYXJlIGluIHNjYW4gb3JkZXIgZm9yIAotICogICAgICAgICAgICBlYWNoIE1CLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKLSAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0N1cnJCdWYsIAotICogICAgICAgICAgICAgIHBTcmNSZWZCdWYsIHBSZWZSZWN0LCBwQ3VyclBvaW50UG9zLCBwTUJJbnRlciwgcE1CSW50cmEsIAotICogICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnIsIG9yIHBEc3RTQUQuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCi0gICAgT01YX1MzMiBzcmNDdXJyU3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCi0gICAgT01YX1MzMiBzcmNSZWZTdGVwLAotICAgIGNvbnN0IE9NWFJlY3QqcFJlZlJlY3QsCi0gICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKLSAgICB2b2lkICpwTUVTcGVjLAotICAgIGNvbnN0IE9NWFZDTTRQMk1CSW5mb1B0ciAqcE1CSW5mbywKLSAgICBPTVhWQ000UDJNQkluZm8gKnBTcmNEc3RNQkN1cnIsCi0gICAgT01YX1UxNiAqcERzdFNBRCwKLSAgICBPTVhfVTE2ICpwRHN0QmxvY2tTQUQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RDVDh4OGJsayAgICg2LjIuNC40LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb21wdXRlcyBhIDJEIGZvcndhcmQgRENUIGZvciBhIHNpbmdsZSA4eDggYmxvY2ssIGFzIGRlZmluZWQgaW4gCi0gKiBbSVNPMTQ0OTYtMl0uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgaW5wdXQgYnVmZmVyOyBtdXN0IAotICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIElucHV0IHZhbHVlcyAocGl4ZWwgCi0gKiAgICAgICAgICAgIGludGVuc2l0aWVzKSBhcmUgdmFsaWQgaW4gdGhlIHJhbmdlIFstMjU1LDI1NV0uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmVhcmx5IGFycmFuZ2VkIG91dHB1dCBidWZmZXI7IG11c3QgCi0gKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgcmV0dXJuZWQgaWY6Ci0gKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKLSAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9EQ1Q4eDhibGsgKAotICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCi0gICAgT01YX1MxNiAqcERzdAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfUXVhbnRJbnRyYV9JICAgKDYuMi40LjQuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHF1YW50aXphdGlvbiBvbiBpbnRyYSBibG9jayBjb2VmZmljaWVudHMuIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgCi0gKiBiaXRzX3Blcl9waXhlbCA9PSA4LiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgaW50cmEgYmxvY2sgY29lZmZpY2llbnRzOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKS4gCi0gKiAgIGJsb2NrSW5kZXggLSBibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQgcG9zaXRpb24sIAotICogICAgICAgICAgICB2YWxpZCBpbiB0aGUgcmFuZ2UgMCB0byA1LCBhcyBkZWZpbmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIAotICogICAgICAgICAgICA2LjEuMy44LiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyAKLSAqICAgICAgICAgICAgbW9kZSwgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChxdWFudGl6ZWQpIGludGVyYmxvY2sgY29lZmZpY2llbnRzLiAgCi0gKiAgICAgICAgICAgIFdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MSwgQUMgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgb24gdGhlIAotICogICAgICAgICAgICBpbnRlcnZhbCBbLTEyNywgMTI3XSwgYW5kIERDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKLSAqICAgICAgICAgICAgaW50ZXJ2YWwgWzEsIDI1NF0uICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTAsIEFDIGNvZWZmaWNpZW50cyAKLSAqICAgICAgICAgICAgYXJlIHNhdHVyYXRlZCBvbiB0aGUgaW50ZXJ2YWwgWy0yMDQ3LCAyMDQ3XS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTC4gCi0gKiAgICAtICAgIGJsb2NrSW5kZXggPCAwIG9yIGJsb2NrSW5kZXggPj0gMTAgCi0gKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0gMzIuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludHJhX0kgKAotICAgIE9NWF9TMTYgKnBTcmNEc3QsCi0gICAgT01YX1U4IFFQLAotICAgIE9NWF9JTlQgYmxvY2tJbmRleCwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1F1YW50SW50ZXJfSSAgICg2LjIuNC40LjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBxdWFudGl6YXRpb24gb24gYW4gaW50ZXIgY29lZmZpY2llbnQgYmxvY2s7IHN1cHBvcnRzIAotICogYml0c19wZXJfcGl4ZWwgPT0gOC4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IGludGVyIGJsb2NrIGNvZWZmaWNpZW50czsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXplcl9zY2FsZSkgCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgbW9kZSwgYW5kIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAocXVhbnRpemVkKSBpbnRlcmJsb2NrIGNvZWZmaWNpZW50cy4gIAotICogICAgICAgICAgICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTEsIEFDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKLSAqICAgICAgICAgICAgaW50ZXJ2YWwgWy0xMjcsIDEyN10sIGFuZCBEQyBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCBvbiB0aGUgCi0gKiAgICAgICAgICAgIGludGVydmFsIFsxLCAyNTRdLiAgV2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0wLCBBQyBjb2VmZmljaWVudHMgCi0gKiAgICAgICAgICAgIGFyZSBzYXR1cmF0ZWQgb24gdGhlIGludGVydmFsIFstMjA0NywgMjA0N10uIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgotICogICAgLSAgICBwU3JjRHN0IGlzIE5VTEwuIAotICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49IDMyLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfUXVhbnRJbnRlcl9JICgKLSAgICBPTVhfUzE2ICpwU3JjRHN0LAotICAgIE9NWF9VOCBRUCwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhICAgKDYuMi40LjQuNCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFF1YW50aXplcyB0aGUgRENUIGNvZWZmaWNpZW50cywgaW1wbGVtZW50cyBpbnRyYSBibG9jayBBQy9EQyBjb2VmZmljaWVudCAKLSAqIHByZWRpY3Rpb24sIGFuZCByZWNvbnN0cnVjdHMgdGhlIGN1cnJlbnQgaW50cmEgYmxvY2sgdGV4dHVyZSBmb3IgcHJlZGljdGlvbiAKLSAqIG9uIHRoZSBuZXh0IGZyYW1lLiAgUXVhbnRpemVkIHJvdyBhbmQgY29sdW1uIGNvZWZmaWNpZW50cyBhcmUgcmV0dXJuZWQgaW4gCi0gKiB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBidWZmZXJzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgcGl4ZWxzIG9mIGN1cnJlbnQgaW50cmEgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiAKLSAqICAgICAgICAgICAgYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFByZWRCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyIGNvbnRhaW5pbmcgCi0gKiAgICAgICAgICAgICgobnVtX21iX3Blcl9yb3cgKiAyICsgMSkgKiA4KSBlbGVtZW50cyBvZiB0eXBlIE9NWF9TMTYuIAotICogICAgICAgICAgICBDb2VmZmljaWVudHMgYXJlIG9yZ2FuaXplZCBpbnRvIGJsb2NrcyBvZiBlaWdodCBhcyBkZXNjcmliZWQgCi0gKiAgICAgICAgICAgIGJlbG93IChJbnRlcm5hbCBQcmVkaWN0aW9uIENvZWZmaWNpZW50IFVwZGF0ZSBQcm9jZWR1cmVzKS4gIFRoZSAKLSAqICAgICAgICAgICAgREMgY29lZmZpY2llbnQgaXMgZmlyc3QsIGFuZCB0aGUgcmVtYWluaW5nIGJ1ZmZlciBsb2NhdGlvbnMgCi0gKiAgICAgICAgICAgIGNvbnRhaW4gdGhlIHF1YW50aXplZCBBQyBjb2VmZmljaWVudHMuIEVhY2ggZ3JvdXAgb2YgZWlnaHQgcm93IAotICogICAgICAgICAgICBidWZmZXIgZWxlbWVudHMgY29tYmluZWQgd2l0aCBvbmUgZWxlbWVudCBlaWdodCBlbGVtZW50cyBhaGVhZCAKLSAqICAgICAgICAgICAgY29udGFpbnMgdGhlIGNvZWZmaWNpZW50IHByZWRpY3RvcnMgb2YgdGhlIG5laWdoYm9yaW5nIGJsb2NrIAotICogICAgICAgICAgICB0aGF0IGlzIHNwYXRpYWxseSBhYm92ZSBvciB0byB0aGUgbGVmdCBvZiB0aGUgYmxvY2sgY3VycmVudGx5IHRvIAotICogICAgICAgICAgICBiZSBkZWNvZGVkLiBBIG5lZ2F0aXZlLXZhbHVlZCBEQyBjb2VmZmljaWVudCBpbmRpY2F0ZXMgdGhhdCB0aGlzIAotICogICAgICAgICAgICBuZWlnaGJvcmluZyBibG9jayBpcyBub3QgSU5UUkEtY29kZWQgb3Igb3V0IG9mIGJvdW5kcywgYW5kIAotICogICAgICAgICAgICB0aGVyZWZvcmUgdGhlIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgYXJlIGludmFsaWQuICBQb2ludGVyIG11c3QgCi0gKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFByZWRCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSBwcmVkaWN0aW9uIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgCi0gKiAgICAgICAgICAgIGNvbnRhaW5pbmcgMTYgZWxlbWVudHMgb2YgdHlwZSBPTVhfUzE2LiBDb2VmZmljaWVudHMgYXJlIAotICogICAgICAgICAgICBvcmdhbml6ZWQgYXMgZGVzY3JpYmVkIGluIHNlY3Rpb24gNi4yLjIuNS4gIFBvaW50ZXIgbXVzdCBiZSAKLSAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBwU3VtRXJyIC0gcG9pbnRlciB0byBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCBBQyBwcmVkaWN0aW9uIGlzIAotICogICAgICAgICAgICByZXF1aXJlZDsgQUMgcHJlZGljdGlvbiBpcyBlbmFibGVkIGlmICpwU3VtRXJyID49MCwgYnV0IHRoZSAKLSAqICAgICAgICAgICAgdmFsdWUgaXMgbm90IHVzZWQgZm9yIGNvZWZmaWNpZW50IHByZWRpY3Rpb24sIGkuZS4sIHRoZSBzdW0gb2YgCi0gKiAgICAgICAgICAgIGFic29sdXRlIGRpZmZlcmVuY2VzIHN0YXJ0cyBmcm9tIDAgZm9yIGVhY2ggY2FsbCB0byB0aGlzIAotICogICAgICAgICAgICBmdW5jdGlvbi4gIE90aGVyd2lzZSBBQyBwcmVkaWN0aW9uIGlzIGRpc2FibGVkIGlmICpwU3VtRXJyIDwgMCAuIAotICogICBibG9ja0luZGV4IC0gYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kIHBvc2l0aW9uLCBhcyAKLSAqICAgICAgICAgICAgZGVmaW5lZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA2LjEuMy44LiAKLSAqICAgY3VyUXAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBtYWNyb2Jsb2NrIHRvIHdoaWNoIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBibG9jayBiZWxvbmdzIAotICogICBwUXBCdWYgLSBwb2ludGVyIHRvIGEgMi1lbGVtZW50IHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYnVmZmVyOyBwUXBCdWZbMF0gCi0gKiAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgOHg4IAotICogICAgICAgICAgICBibG9jayBsZWZ0IG9mIHRoZSBjdXJyZW50IGJsb2NrIChRUGEpLCBhbmQgcFFwQnVmWzFdIGNvbnRhaW5zIAotICogICAgICAgICAgICB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBhc3NvY2lhdGVkIHdpdGggdGhlIDh4OCBibG9jayBhYm92ZSAKLSAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgYmxvY2sgKFFQYykuICBJbiB0aGUgZXZlbnQgdGhhdCB0aGUgY29ycmVzcG9uZGluZyAKLSAqICAgICAgICAgICAgYmxvY2sgaXMgb3V0c2lkZSBvZiB0aGUgVk9QIGJvdW5kLCB0aGUgUXAgdmFsdWUgd2lsbCBub3QgYWZmZWN0IAotICogICAgICAgICAgICB0aGUgaW50cmEgcHJlZGljdGlvbiBwcm9jZXNzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCAKLSAqICAgICAgICAgICAgc3ViLWNsYXVzZSA3LjQuMy4zLCAgQWRhcHRpdmUgQUMgQ29lZmZpY2llbnQgUHJlZGljdGlvbi4gIAotICogICBzcmNTdGVwIC0gd2lkdGggb2YgdGhlIHNvdXJjZSBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgZHN0U3RlcCAtIHdpZHRoIG9mIHRoZSByZWNvbnN0cnVjdGVkIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIAotICogICAgICAgICAgICBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCi0gKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgYnVmZmVyOyBwRHN0WzBdIGNvbnRhaW5zIAotICogICAgICAgICAgICB0aGUgcHJlZGljdGVkIERDIGNvZWZmaWNpZW50OyB0aGUgcmVtYWluaW5nIGVudHJpZXMgY29udGFpbiB0aGUgCi0gKiAgICAgICAgICAgIHF1YW50aXplZCBBQyBjb2VmZmljaWVudHMgKHdpdGhvdXQgcHJlZGljdGlvbikuICBUaGUgcG9pbnRlciAKLSAqICAgICAgICAgICAgcERzdG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBwUmVjIC0gcG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCB0ZXh0dXJlOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gCi0gKiAgICAgICAgICAgIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyIAotICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlciAKLSAqICAgcFByZUFDUHJlZGljdCAtIGlmIHByZWRpY3Rpb24gaXMgZW5hYmxlZCwgdGhlIHBhcmFtZXRlciBwb2ludHMgdG8gdGhlIAotICogICAgICAgICAgICBzdGFydCBvZiB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGNvZWZmaWNpZW50IGRpZmZlcmVuY2VzIGZvciAKLSAqICAgICAgICAgICAgVkxDIGVuY29kaW5nLiBUaGUgZW50cnkgcFByZUFDUHJlZGljdFswXWluZGljYXRlcyBwcmVkaWN0aW9uIAotICogICAgICAgICAgICBkaXJlY3Rpb24gZm9yIHRoZSBjdXJyZW50IGJsb2NrIGFuZCB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgdmFsdWVzOiBPTVhfVkNfTk9ORSAocHJlZGljdGlvbiBkaXNhYmxlZCksIE9NWF9WQ19IT1JJWk9OVEFMLCBvciAKLSAqICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMLiAgVGhlIGVudHJpZXMgCi0gKiAgICAgICAgICAgIHBQcmVBQ1ByZWRpY3RbMV0tcFByZUFDUHJlZGljdFs3XWNvbnRhaW4gcHJlZGljdGVkIEFDIAotICogICAgICAgICAgICBjb2VmZmljaWVudHMuICBJZiBwcmVkaWN0aW9uIGlzIGRpc2FibGVkICgqcFN1bUVycjwwKSB0aGVuIHRoZSAKLSAqICAgICAgICAgICAgY29udGVudHMgb2YgdGhpcyBidWZmZXIgYXJlIHVuZGVmaW5lZCB1cG9uIHJldHVybiBmcm9tIHRoZSAKLSAqICAgICAgICAgICAgZnVuY3Rpb24gCi0gKiAgIHBTdW1FcnIgLSBwb2ludGVyIHRvIHRoZSB2YWx1ZSBvZiB0aGUgYWNjdW11bGF0ZWQgQUMgY29lZmZpY2llbnQgZXJyb3JzLCAKLSAqICAgICAgICAgICAgaS5lLiwgc3VtIG9mIHRoZSBhYnNvbHV0ZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHByZWRpY3RlZCBhbmQgCi0gKiAgICAgICAgICAgIHVucHJlZGljdGVkIEFDIGNvZWZmaWNpZW50cyAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcERzdCwgcFJlYywgCi0gKiAgICAgICAgIHBDb2VmQnVmUm93LCBwQ29lZkJ1ZkNvbCwgcFFwQnVmLCBwUHJlQUNQcmVkaWN0LCBwU3VtRXJyLiAKLSAqICAgIC0gICAgYmxvY2tJbmRleCA8IDAgb3IgYmxvY2tJbmRleCA+PSAxMDsgCi0gKiAgICAtICAgIGN1clFQIDw9IDAgb3IgY3VyUVAgPj0gMzIuIAotICogICAgLSAgICBzcmNTdGVwLCBvciBkc3RTdGVwIDw9IDAgb3Igbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZDogLiAKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IDgtYnl0ZSBhbGlnbmVkOiAKLSAqICAgICAgICAgcFNyYywgcFJlYy4gIAotICoKLSAqICBOb3RlOiBUaGUgY29lZmZpY2llbnQgYnVmZmVycyBtdXN0IGJlIHVwZGF0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSAKLSAqICAgICAgICB1cGRhdGUgcHJvY2VkdXJlcyBkZWZpbmVkIGluIHNlY3Rpb24gaW4gNi4yLjIuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgT01YX1U4ICpwUmVjLAotICAgIE9NWF9TMTYgKnBQcmVkQnVmUm93LAotICAgIE9NWF9TMTYgKnBQcmVkQnVmQ29sLAotICAgIE9NWF9TMTYgKnBQcmVBQ1ByZWRpY3QsCi0gICAgT01YX0lOVCAqcFN1bUVyciwKLSAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCi0gICAgT01YX1U4IGN1clFwLAotICAgIGNvbnN0IE9NWF9VOCAqcFFwQnVmLAotICAgIE9NWF9JTlQgc3JjU3RlcCwKLSAgICBPTVhfSU5UIGRzdFN0ZXAsCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlciAgICg2LjIuNC40LjUpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBJbXBsZW1lbnRzIERDVCwgYW5kIHF1YW50aXplcyB0aGUgRENUIGNvZWZmaWNpZW50cyBvZiB0aGUgaW50ZXIgYmxvY2sgCi0gKiB3aGlsZSByZWNvbnN0cnVjdGluZyB0aGUgdGV4dHVyZSByZXNpZHVhbC4gVGhlcmUgaXMgbm8gYm91bmRhcnkgY2hlY2sgZm9yIAotICogdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC1wb2ludGVyIHRvIHRoZSByZXNpZHVhbHMgdG8gYmUgZW5jb2RlZDsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIAotICogICAgICAgICAgICAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyLiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyAKLSAqICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgbW9kZSwgYW5kIAotICogICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50cyBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFJlYyAtIHBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgdGV4dHVyZSByZXNpZHVhbHM7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgZWl0aGVyIE5VTEwgb3IgCi0gKiAgICAgICAgIG5vdCAxNi1ieXRlIGFsaWduZWQ6IAotICogICAgICAgICAgICAtIHBTcmMgCi0gKiAgICAgICAgICAgIC0gcERzdAotICogICAgICAgICAgICAtIHBSZWMKLSAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PSAzMi4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyICgKLSAgICBjb25zdCBPTVhfUzE2ICpwU3JjLAotICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgT01YX1MxNiAqcFJlYywKLSAgICBPTVhfVTggUVAsCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAgICg2LjIuNC41LjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyB6aWd6YWcgc2NhbiBhbmQgVkxDIGVuY29kaW5nIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgZm9yIG9uZSAKLSAqIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgcHJvdmlkZWQgCi0gKiBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKLSAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICJJbnRyYSBEQyAKLSAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmciLiAgCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBkb3VibGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXRzdHJlYW0gCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3LiAKLSAqICAgcFFEY3RCbGtDb2VmIC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudCAKLSAqICAgcHJlZERpciAtIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uLCB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB0aGUgemlnemFnIAotICogICAgICAgICAgICBzY2FuIHBhdHRlcm47IHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19OT05FIC0gQUMgcHJlZGljdGlvbiBub3QgdXNlZC4gIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uLiAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsIHppZ3phZyBzY2FuLiAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX1ZFUlRJQ0FMIC0gVmVydGljYWwgcHJlZGljdGlvbi4gIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsIHppZ3phZyBzY2FuLiAKLSAqICAgcGF0dGVybiAtIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0aGlzIGJsb2NrIGlzIAotICogICAgICAgICAgICBlbmNvZGVkIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAotICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlLCBjaHJvbWluYW5jZSkgb2YgdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIGJsb2NrIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLCBzbyAKLSAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIuIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCi0gKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sIAotICogICAgICAgICAgICAgICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcFFEY3RCbGtDb2VmLiAKLSAqICAgIC0gICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKLSAqICAgIC0gICAgUHJlZERpciBpcyBub3Qgb25lIG9mOiBPTVhfVkNfTk9ORSwgT01YX1ZDX0hPUklaT05UQUwsIG9yIAotICogICAgICAgICBPTVhfVkNfVkVSVElDQUwuIAotICogICAgLSAgICBWaWRlb0NvbXAgaXMgbm90IG9uZSBjb21wb25lbnQgb2YgZW51bSBPTVhWQ000UDJWaWRlb0NvbXBvbmVudC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICgKLSAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKLSAgICBPTVhfVTggcHJlZERpciwKLSAgICBPTVhfVTggcGF0dGVybiwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCi0gICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAgICg2LjIuNC41LjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyB6aWd6YWcgc2NhbiBhbmQgVkxDIGVuY29kaW5nIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgZm9yIG9uZSAKLSAqIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgcHJvdmlkZWQgCi0gKiBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKLSAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICBJbnRyYSBEQyAKLSAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmcuICAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIGRvdWJsZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdHN0cmVhbSAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcuIAotICogICBwUURjdEJsa0NvZWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50IAotICogICBwcmVkRGlyIC0gQUMgcHJlZGljdGlvbiBkaXJlY3Rpb24sIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHRoZSB6aWd6YWcgCi0gKiAgICAgICAgICAgIHNjYW4gcGF0dGVybjsgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX05PTkUgLSBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkLiAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FuLiAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX0hPUklaT05UQUwgLSBIb3Jpem9udGFsIHByZWRpY3Rpb24uICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW4uIAotICogICAgICAgICAgICAtICBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCBwcmVkaWN0aW9uLiAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwgemlnemFnIHNjYW4uIAotICogICBwYXR0ZXJuIC0gYmxvY2sgcGF0dGVybiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRoaXMgYmxvY2sgaXMgCi0gKiAgICAgICAgICAgIGVuY29kZWQgCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsIHNvIAotICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKLSAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgCi0gKiAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwUURjdEJsa0NvZWYuIAotICogICAgLSAgICpwQml0T2Zmc2V0IDwgMCwgb3IgKnBCaXRPZmZzZXQgPjcuIAotICogICAgLSAgICBQcmVkRGlyIGlzIG5vdCBvbmUgb2Y6IE9NWF9WQ19OT05FLCBPTVhfVkNfSE9SSVpPTlRBTCwgb3IgCi0gKiAgICAgICAgIE9NWF9WQ19WRVJUSUNBTC4gCi0gKiAgICAtICAgIFZpZGVvQ29tcCBpcyBub3Qgb25lIGNvbXBvbmVudCBvZiBlbnVtIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgKAotICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAotICAgIE9NWF9VOCBwcmVkRGlyLAotICAgIE9NWF9VOCBwYXR0ZXJuLAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyICAgKDYuMi40LjUuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBlbmNvZGluZyBmb3Igb25lIGludGVyIGJsb2NrLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IAotICogICAgICAgICAgICBzdHJlYW0gCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3IAotICogICBwUURjdEJsa0NvZWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50IAotICogICBwYXR0ZXJuIC0gYmxvY2sgcGF0dGVybiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRoaXMgYmxvY2sgaXMgCi0gKiAgICAgICAgICAgIGVuY29kZWQgCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQgc28gdGhhdCAKLSAqICAgICAgICAgICAgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAotICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHMgCi0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgcG9pbnRlcnM6IGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIAotICogICAgICAgICAgICAgIHBCaXRPZmZzZXQsIHBRRGN0QmxrQ29lZiAKLSAqICAgIC0gICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyICgKLSAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKLSAgICBPTVhfVTggcGF0dGVybiwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0VuY29kZU1WICAgKDYuMi40LjUuNCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFByZWRpY3RzIGEgbW90aW9uIHZlY3RvciBmb3IgdGhlIGN1cnJlbnQgbWFjcm9ibG9jaywgZW5jb2RlcyB0aGUgCi0gKiBkaWZmZXJlbmNlLCBhbmQgd3JpdGVzIHRoZSBvdXRwdXQgdG8gdGhlIHN0cmVhbSBidWZmZXIuIFRoZSBpbnB1dCBNVnMgCi0gKiBwTVZDdXJNQiwgcFNyY01WTGVmdE1CLCBwU3JjTVZVcHBlck1CLCBhbmQgcFNyY01WVXBwZXJSaWdodE1CIHNob3VsZCBsaWUgCi0gKiB3aXRoaW4gdGhlIHJhbmdlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGlucHV0IHBhcmFtZXRlciBmY29kZUZvcndhcmQsIGFzIAotICogZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi4zLiAgVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIAotICogc3VwZXJzZXQgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBmdW5jdGlvbiAKLSAqIG9teFZDTTRQMl9GaW5kTVZwcmVkLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIGRvdWJsZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSBpbmRleCBvZiB0aGUgZmlyc3QgZnJlZSAobmV4dCBhdmFpbGFibGUpIGJpdCBpbiB0aGUgc3RyZWFtIAotICogICAgICAgICAgICBidWZmZXIgcmVmZXJlbmNlZCBieSAqcHBCaXRTdHJlYW0sIHZhbGlkIGluIHRoZSByYW5nZSAwIHRvIDcuIAotICogICBwTVZDdXJNQiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBtb3Rpb24gdmVjdG9yOyBhIHZhbHVlIG9mIAotICogICAgICAgICAgICBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCi0gKiAgIHBTcmNNVkxlZnRNQiAtIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBsZWZ0IG1hY3JvYmxvY2sgbW90aW9uIHZlY3RvcjsgYSAKLSAqICAgICAgICAgICAgdmFsdWUgb2YgIE5VTExpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAotICogICBwU3JjTVZVcHBlck1CIC0gcG9pbnRlciB0byBzb3VyY2UgdXBwZXIgbWFjcm9ibG9jayBtb3Rpb24gdmVjdG9yOyBhIAotICogICAgICAgICAgICB2YWx1ZSBvZiBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCi0gKiAgIHBTcmNNVlVwcGVyUmlnaHRNQiAtIHBvaW50ZXIgdG8gc291cmNlIHVwcGVyIHJpZ2h0IE1CIG1vdGlvbiB2ZWN0b3I7IGEgCi0gKiAgICAgICAgICAgIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKLSAqICAgZmNvZGVGb3J3YXJkIC0gYW4gaW50ZWdlciB3aXRoIHZhbHVlcyBmcm9tIDEgdG8gNzsgdXNlZCBpbiBlbmNvZGluZyAKLSAqICAgICAgICAgICAgbW90aW9uIHZlY3RvcnMgcmVsYXRlZCB0byBzZWFyY2ggcmFuZ2UsIGFzIGRlc2NyaWJlZCBpbiAKLSAqICAgICAgICAgICAgW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjMuIAotICogICBNQlR5cGUgLSBtYWNybyBibG9jayB0eXBlLCB2YWxpZCBpbiB0aGUgcmFuZ2UgMCB0byA1IAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIHVwZGF0ZWQgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIAotICogICAgICAgICAgICBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSB1cGRhdGVkIGluZGV4IG9mIHRoZSBuZXh0IGF2YWlsYWJsZSBiaXQgcG9zaXRpb24gaW4gc3RyZWFtIAotICogICAgICAgICAgICBidWZmZXIgcmVmZXJlbmNlZCBieSAqcHBCaXRTdHJlYW0gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCi0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAKLSAqICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBNVkN1ck1CIAotICogICAgLSAgICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKLSAqICAgIC0gICAgZmNvZGVGb3J3YXJkIDw9IDAsIG9yIGZjb2RlRm9yd2FyZCA+IDcsIG9yIE1CVHlwZSA8IDAuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9FbmNvZGVNViAoCi0gICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcE1WQ3VyTUIsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IqcFNyY01WTGVmdE1CLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZVcHBlck1CLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZVcHBlclJpZ2h0TUIsCi0gICAgT01YX0lOVCBmY29kZUZvcndhcmQsCi0gICAgT01YVkNNNFAyTWFjcm9ibG9ja1R5cGUgTUJUeXBlCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QICAgKDYuMi41LjEuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIERlY29kZXMgYW5kIHBhZHMgdGhlIGZvdXIgbW90aW9uIHZlY3RvcnMgYXNzb2NpYXRlZCB3aXRoIGEgbm9uLWludHJhIFAtVk9QIAotICogbWFjcm9ibG9jay4gIEZvciBtYWNyb2Jsb2NrcyBvZiB0eXBlIE9NWF9WQ19JTlRFUjRWLCB0aGUgb3V0cHV0IE1WIGlzIAotICogcGFkZGVkIGFzIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuMS42LiBPdGhlcndpc2UsIGZvciAKLSAqIG1hY3JvYmxvY2tzIG9mIHR5cGVzIG90aGVyIHRoYW4gT01YX1ZDX0lOVEVSNFYsIHRoZSBkZWNvZGVkIE1WIGlzIGNvcGllZCB0byAKLSAqIGFsbCBmb3VyIG91dHB1dCBNViBidWZmZXIgZW50cmllcy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCAKLSAqICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiBbMC03XS4gCi0gKiAgIHBTcmNNVkxlZnRNQiwgcFNyY01WVXBwZXJNQiwgYW5kIHBTcmNNVlVwcGVyUmlnaHRNQiAtIHBvaW50ZXJzIHRvIHRoZSAKLSAqICAgICAgICAgICAgbW90aW9uIHZlY3RvciBidWZmZXJzIG9mIHRoZSBtYWNyb2Jsb2NrcyBzcGVjaWFsbHkgYXQgdGhlIGxlZnQsIAotICogICAgICAgICAgICB1cHBlciwgYW5kIHVwcGVyLXJpZ2h0IHNpZGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jaywgCi0gKiAgICAgICAgICAgIHJlc3BlY3RpdmVseTsgYSB2YWx1ZSBvZiBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gIE5vdGU6IAotICogICAgICAgICAgICBBbnkgbmVpZ2hib3Job29kIG1hY3JvYmxvY2sgb3V0c2lkZSB0aGUgY3VycmVudCBWT1Agb3IgdmlkZW8gCi0gKiAgICAgICAgICAgIHBhY2tldCBvciBvdXRzaWRlIHRoZSBjdXJyZW50IEdPQiAod2hlbiBzaG9ydF92aWRlb19oZWFkZXIgaXMgCi0gKiAgICAgICAgICAgICAxICkgZm9yIHdoaWNoIGdvYl9oZWFkZXJfZW1wdHkgaXMgIDAgIGlzIHRyZWF0ZWQgYXMgCi0gKiAgICAgICAgICAgIHRyYW5zcGFyZW50LCBhY2NvcmRpbmcgdG8gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjUuIAotICogICBmY29kZUZvcndhcmQgLSBhIGNvZGUgZXF1YWwgdG8gdm9wX2Zjb2RlX2ZvcndhcmQgaW4gTVBFRy00IGJpdCBzdHJlYW0gCi0gKiAgICAgICAgICAgIHN5bnRheCAKLSAqICAgTUJUeXBlIC0gdGhlIHR5cGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jay4gSWYgTUJUeXBlIGlzIG5vdCBlcXVhbCB0byAKLSAqICAgICAgICAgICAgT01YX1ZDX0lOVEVSNFYsIHRoZSBkZXN0aW5hdGlvbiBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBpcyBzdGlsbCAKLSAqICAgICAgICAgICAgZmlsbGVkIHdpdGggdGhlIHNhbWUgZGVjb2RlZCB2ZWN0b3IuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkLCBzbyAKLSAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKLSAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCi0gKiAgIHBEc3RNVkN1ck1CIC0gcG9pbnRlciB0byB0aGUgbW90aW9uIHZlY3RvciBidWZmZXIgZm9yIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBtYWNyb2Jsb2NrOyBjb250YWlucyBmb3VyIGRlY29kZWQgbW90aW9uIHZlY3RvcnMgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0TVZDdXJNQiAKLSAqICAgIC0gICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQotICogICAgLSAgICBmY29kZUZvcndhcmQgZXhjZWVkcyAoMCw3XQotICogICAgLSAgICBNQlR5cGUgbGVzcyB0aGFuIHplcm8KLSAqICAgIC0gICAgbW90aW9uIHZlY3RvciBidWZmZXIgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QICgKLSAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZMZWZ0TUIsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IqcFNyY01WVXBwZXJNQiwKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WVXBwZXJSaWdodE1CLAotICAgIE9NWFZDTW90aW9uVmVjdG9yKnBEc3RNVkN1ck1CLAotICAgIE9NWF9JTlQgZmNvZGVGb3J3YXJkLAotICAgIE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlIE1CVHlwZQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMgICAoNi4yLjUuMi4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgCi0gKiBmb3Igb25lIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgCi0gKiBwcm92aWRlZCBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKLSAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICBJbnRyYSBEQyAKLSAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmcuICAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgCi0gKiAgICAgICAgICAgIGJpdHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGN1cnJlbnQgYnl0ZSByZWZlcmVuY2VkIAotICogICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uICBUaGUgcGFyYW1ldGVyICpwQml0T2Zmc2V0IGlzIHZhbGlkIGluIHRoZSAKLSAqICAgICAgICAgICAgcmFuZ2UgWzAtN10uIAotICogICAgICAgICAgICBCaXQgUG9zaXRpb24gaW4gb25lIGJ5dGU6ICB8TW9zdCAgICAgIExlYXN0fCAKLSAqICAgICAgICAgICAgICAgICAgICAqcEJpdE9mZnNldCAgICAgICAgfDAgMSAyIDMgNCA1IDYgN3wgCi0gKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbjsgdXNlZCB0byBzZWxlY3QgdGhlIHppZ3phZyBzY2FuIAotICogICAgICAgICAgICBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IAotICogICAgICAgICAgICAtICBPTVhfVkNfTk9ORSAtIEFDIHByZWRpY3Rpb24gbm90IHVzZWQ7IAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uOyAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW47IAotICogICAgICAgICAgICAtICBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCBwcmVkaWN0aW9uOyAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCi0gKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2Ugb3IgY2hyb21pbmFuY2UpIG9mIHRoZSAKLSAqICAgICAgICAgICAgY3VycmVudCBibG9jayAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCBzdWNoIAotICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc3VjaCB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgCi0gKiAgICAgICAgICAgIDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgaWY6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0Ci0gKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KLSAqICAgIC0gICAgcHJlRGlyIGV4Y2VlZHMgWzAsMl0KLSAqICAgIC0gICAgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQgCi0gKiAgICBPTVhfU3RzX0VyciAtIGlmOgotICogICAgLSAgICBJbiBEZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgZGNfc2l6ZSA+IDEyIAotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgbWFyayBiaXRzIGVxdWFscyB6ZXJvIAotICogICAgLSAgICBJbGxlZ2FsIHN0cmVhbSBlbmNvdW50ZXJlZDsgY29kZSBjYW5ub3QgYmUgbG9jYXRlZCBpbiBWTEMgdGFibGUgCi0gKiAgICAtICAgIEZvcmJpZGRlbiBjb2RlIGVuY291bnRlcmVkIGluIHRoZSBWTEMgRkxDIHRhYmxlLiAKLSAqICAgIC0gICAgVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAoCi0gICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBPTVhfUzE2ICpwRHN0LAotICAgIE9NWF9VOCBwcmVkRGlyLAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKLSAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICAgKDYuMi41LjIuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBvZiBBQyBhbmQgREMgY29lZmZpY2llbnRzIAotICogZm9yIG9uZSBpbnRyYSBibG9jay4gIFR3byB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24gKERDVkxDIGFuZCBBQ1ZMQykgYXJlIAotICogcHJvdmlkZWQgaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgdHdvIGRpZmZlcmVudCBtZXRob2RzIG9mIHByb2Nlc3NpbmcgREMgCi0gKiBjb2VmZmljaWVudHMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMS40LCAgSW50cmEgREMgCi0gKiBDb2VmZmljaWVudCBEZWNvZGluZyBmb3IgdGhlIENhc2Ugb2YgU3dpdGNoZWQgVkxDIEVuY29kaW5nLiAgCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIAotICogICAgICAgICAgICBiaXRzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBjdXJyZW50IGJ5dGUgcmVmZXJlbmNlZCAKLSAqICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiAgVGhlIHBhcmFtZXRlciAqcEJpdE9mZnNldCBpcyB2YWxpZCBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJhbmdlIFswLTddLiBCaXQgUG9zaXRpb24gaW4gb25lIGJ5dGU6ICB8TW9zdCBMZWFzdHwgKnBCaXRPZmZzZXQgCi0gKiAgICAgICAgICAgIHwwIDEgMiAzIDQgNSA2IDd8IAotICogICBwcmVkRGlyIC0gQUMgcHJlZGljdGlvbiBkaXJlY3Rpb247IHVzZWQgdG8gc2VsZWN0IHRoZSB6aWd6YWcgc2NhbiAKLSAqICAgICAgICAgICAgcGF0dGVybjsgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiBPTVhfVkNfTk9ORSAtIEFDIAotICogICAgICAgICAgICBwcmVkaWN0aW9uIG5vdCB1c2VkOyBwZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW4uIAotICogICAgICAgICAgICBPTVhfVkNfSE9SSVpPTlRBTCAtIEhvcml6b250YWwgcHJlZGljdGlvbjsgcGVyZm9ybXMgCi0gKiAgICAgICAgICAgIGFsdGVybmF0ZS12ZXJ0aWNhbCB6aWd6YWcgc2NhbjsgT01YX1ZDX1ZFUlRJQ0FMIC0gVmVydGljYWwgCi0gKiAgICAgICAgICAgIHByZWRpY3Rpb247IHBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsIHppZ3phZyBzY2FuLiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKLSAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSBvciBjaHJvbWluYW5jZSkgb2YgdGhlIAotICogICAgICAgICAgICBjdXJyZW50IGJsb2NrIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkIHN1Y2ggCi0gKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzdWNoIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudCBibG9jazsgbXVzdCBiZSAKLSAqICAgICAgICAgICAgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QsIAotICogICAgICAgICAgICAgIG9yIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAgICAgICAgICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XSwgcHJlRGlyIGV4Y2VlZHMgWzAsMl0sIG9yIHBEc3QgaXMgCi0gKiAgICAgICAgICAgICAgbm90IDQtYnl0ZSBhbGlnbmVkIAotICogICAgT01YX1N0c19FcnIgSW4gRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMsIGRjX3NpemUgPiAxMiBBdCBsZWFzdCBvbmUgb2YgCi0gKiAgICAgICAgICAgICAgbWFyayBiaXRzIGVxdWFscyB6ZXJvIElsbGVnYWwgc3RyZWFtIGVuY291bnRlcmVkOyBjb2RlIGNhbm5vdCAKLSAqICAgICAgICAgICAgICBiZSBsb2NhdGVkIGluIFZMQyB0YWJsZSBGb3JiaWRkZW4gY29kZSBlbmNvdW50ZXJlZCBpbiB0aGUgVkxDIAotICogICAgICAgICAgICAgIEZMQyB0YWJsZSBUaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICgKLSAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgT01YX1U4IHByZWREaXIsCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIgICAoNi4yLjUuMi4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciBvbmUgaW50ZXItY29kZWQgYmxvY2suIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIG5leHQgYXZhaWxhYmxlIGJpdCBpbiB0aGUgY3VycmVudCBzdHJlYW0gCi0gKiAgICAgICAgICAgIGJ5dGUgcmVmZXJlbmNlZCBieSAqcHBCaXRTdHJlYW0uIFRoZSBwYXJhbWV0ZXIgKnBCaXRPZmZzZXQgaXMgCi0gKiAgICAgICAgICAgIHZhbGlkIHdpdGhpbiB0aGUgcmFuZ2UgWzAtN10uIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkIHN1Y2ggCi0gKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGRlY29kaW5nIHN1Y2ggdGhhdCBpdCBwb2ludHMgCi0gKiAgICAgICAgICAgIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSBiaXQgaW4gdGhlIHN0cmVhbSBieXRlIHJlZmVyZW5jZWQgYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbSAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAotICogICAgICAgICAgICA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0Ci0gKiAgICAtICAgIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkCi0gKiAgICAtICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQotICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IsIGlmOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgbWFyayBiaXQgaXMgZXF1YWwgdG8gemVybyAKLSAqICAgIC0gICAgRW5jb3VudGVyZWQgYW4gaWxsZWdhbCBzdHJlYW0gY29kZSB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgVkxDIHRhYmxlIAotICogICAgLSAgICBFbmNvdW50ZXJlZCBhbiBpbGxlZ2FsIGNvZGUgaW4gdGhlIFZMQyBGTEMgdGFibGUgCi0gKiAgICAtICAgIFRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyICgKLSAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludkludHJhX0kgICAoNi4yLjUuMy4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgdGhlIHNlY29uZCBpbnZlcnNlIHF1YW50aXphdGlvbiBtb2RlIG9uIGFuIGludHJhL2ludGVyIGNvZGVkIAotICogYmxvY2suIFN1cHBvcnRzIGJpdHNfcGVyX3BpeGVsID0gOC4gVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIGNsaXBwZWQgdG8gCi0gKiB0aGUgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IChxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrOyBtdXN0IGJlIAotICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKSAKLSAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgb2YgdGhlIGN1cnJlbnQgYmxvY2suIFRha2VzIG9uZSBvZiB0aGUgCi0gKiAgICAgICAgICAgIGZvbGxvd2luZyBmbGFnczogT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFIChpbnRyYSAKLSAqICAgICAgICAgICAgdmVyc2lvbiBvbmx5KS4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlciAKLSAqICAgICAgICAgICAgKGludHJhIHZlcnNpb24gb25seSkuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChkZXF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2sgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgCi0gKiAgICAgICAgICAgICAgdHJ1ZTogCi0gKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTCAKLSAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PTMxIAotICogICAgLSAgICB2aWRlb0NvbXAgaXMgbmVpdGhlciBPTVhfVkNfTFVNSU5BTkNFIG5vciBPTVhfVkNfQ0hST01JTkFOQ0UuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludkludHJhX0kgKAotICAgIE9NWF9TMTYgKnBTcmNEc3QsCi0gICAgT01YX0lOVCBRUCwKLSAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAsCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludkludGVyX0kgICAoNi4yLjUuMy4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgdGhlIHNlY29uZCBpbnZlcnNlIHF1YW50aXphdGlvbiBtb2RlIG9uIGFuIGludHJhL2ludGVyIGNvZGVkIAotICogYmxvY2suIFN1cHBvcnRzIGJpdHNfcGVyX3BpeGVsID0gOC4gVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIGNsaXBwZWQgdG8gCi0gKiB0aGUgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IChxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrOyBtdXN0IGJlIAotICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKSAKLSAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgb2YgdGhlIGN1cnJlbnQgYmxvY2suIFRha2VzIG9uZSBvZiB0aGUgCi0gKiAgICAgICAgICAgIGZvbGxvd2luZyBmbGFnczogT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFIChpbnRyYSAKLSAqICAgICAgICAgICAgdmVyc2lvbiBvbmx5KS4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlciAKLSAqICAgICAgICAgICAgKGludHJhIHZlcnNpb24gb25seSkuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChkZXF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2sgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgCi0gKiAgICAgICAgICAgICAgdHJ1ZTogCi0gKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTCAKLSAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PTMxIAotICogICAgLSAgICB2aWRlb0NvbXAgaXMgbmVpdGhlciBPTVhfVkNfTFVNSU5BTkNFIG5vciBPTVhfVkNfQ0hST01JTkFOQ0UuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludkludGVyX0kgKAotICAgIE9NWF9TMTYgKnBTcmNEc3QsCi0gICAgT01YX0lOVCBRUAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhICAgKDYuMi41LjQuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIERlY29kZXMgdGhlIElOVFJBIGJsb2NrIGNvZWZmaWNpZW50cy4gSW52ZXJzZSBxdWFudGl6YXRpb24sIGludmVyc2VseSAKLSAqIHppZ3phZyBwb3NpdGlvbmluZywgYW5kIElEQ1QsIHdpdGggYXBwcm9wcmlhdGUgY2xpcHBpbmcgb24gZWFjaCBzdGVwLCBhcmUgCi0gKiBwZXJmb3JtZWQgb24gdGhlIGNvZWZmaWNpZW50cy4gVGhlIHJlc3VsdHMgYXJlIHRoZW4gcGxhY2VkIGluIHRoZSBvdXRwdXQgCi0gKiBmcmFtZS9wbGFuZSBvbiBhIHBpeGVsIGJhc2lzLiAgTm90ZTogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIHVzZWQgb25seSB3aGVuIAotICogYXQgbGVhc3Qgb25lIG5vbi16ZXJvIEFDIGNvZWZmaWNpZW50IG9mIGN1cnJlbnQgYmxvY2sgZXhpc3RzIGluIHRoZSBiaXQgCi0gKiBzdHJlYW0uIFRoZSBEQyBvbmx5IGNvbmRpdGlvbiB3aWxsIGJlIGhhbmRsZWQgaW4gYW5vdGhlciBmdW5jdGlvbi4gCi0gKgotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCi0gKiAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5IGNoZWNrIGZvciB0aGUgYml0IHN0cmVhbSAKLSAqICAgICAgICAgICAgYnVmZmVyLiAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiBbMC03XS4gCi0gKiAgIHN0ZXAgLSB3aWR0aCBvZiB0aGUgZGVzdGluYXRpb24gcGxhbmUgCi0gKiAgIHBDb2VmQnVmUm93IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIAotICogICAgICAgICAgICBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBwQ29lZkJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgY3VyUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBtYWNyb2Jsb2NrIHdoaWNoIHRoZSBjdXJyZW50IGJsb2NrIAotICogICAgICAgICAgICBiZWxvbmdzIHRvIAotICogICBwUVBCdWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlciAKLSAqICAgYmxvY2tJbmRleCAtIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZCBwb3NpdGlvbiBhcyAKLSAqICAgICAgICAgICAgZGVmaW5lZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA2LjEuMy44LCBGaWd1cmUgNi01LiAKLSAqICAgaW50cmFEQ1ZMQyAtIGEgY29kZSBkZXRlcm1pbmVkIGJ5IGludHJhX2RjX3ZsY190aHIgYW5kIFFQLiBUaGlzIGFsbG93cyBhIAotICogICAgICAgICAgICBtZWNoYW5pc20gdG8gc3dpdGNoIGJldHdlZW4gdHdvIFZMQyBmb3IgY29kaW5nIG9mIEludHJhIERDIAotICogICAgICAgICAgICBjb2VmZmljaWVudHMgYXMgcGVyIFtJU08xNDQ5Ni0yXSwgVGFibGUgNi0yMS4gCi0gKiAgIEFDUHJlZEZsYWcgLSBhIGZsYWcgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIChvZiBsdW1pbmFuY2UpIGluZGljYXRpbmcgaWYgCi0gKiAgICAgICAgICAgIHRoZSBhYyBjb2VmZmljaWVudHMgb2YgdGhlIGZpcnN0IHJvdyBvciBmaXJzdCBjb2x1bW4gYXJlIAotICogICAgICAgICAgICBkaWZmZXJlbnRpYWxseSBjb2RlZCBmb3IgaW50cmEgY29kZWQgbWFjcm9ibG9jay4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCi0gKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwgc28gCi0gKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCi0gKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIGRlc3RpbmF0aW9uIHBsYW5lOyBtdXN0IGJlIGFsaWduZWQgb24gCi0gKiAgICAgICAgICAgIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBDb2VmQnVmUm93IC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyLiAKLSAqICAgcENvZWZCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgIE5vdGU6IAotICogICAgICAgICAgICBUaGUgY29lZmZpY2llbnQgYnVmZmVycyBtdXN0IGJlIHVwZGF0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSAKLSAqICAgICAgICAgICAgdXBkYXRlIHByb2NlZHVyZSBkZWZpbmVkIGluIHNlY3Rpb24gNi4yLjIuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBDb2VmQnVmUm93LCBwQ29lZkJ1ZkNvbCwgCi0gKiAgICAgICAgIHBRUEJ1ZiwgcERzdC4gCi0gKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10gCi0gKiAgICAtICAgIGN1clFQIGV4Y2VlZHMgKDEsIDMxKQotICogICAgLSAgICBibG9ja0luZGV4IGV4Y2VlZHMgWzAsNV0KLSAqICAgIC0gICAgc3RlcCBpcyBub3QgdGhlIG11bHRpcGxlIG9mIDgKLSAqICAgIC0gICAgYSBwb2ludGVyIGFsaWdubWVudCByZXF1aXJlbWVudCB3YXMgdmlvbGF0ZWQuIAotICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IuIFJlZmVyIHRvIE9NWF9TdHNfRXJyIG9mIERlY29kZVZMQ1ppZ3phZ19JbnRyYS4gIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEgKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgT01YX1U4ICpwRHN0LAotICAgIE9NWF9JTlQgc3RlcCwKLSAgICBPTVhfUzE2ICpwQ29lZkJ1ZlJvdywKLSAgICBPTVhfUzE2ICpwQ29lZkJ1ZkNvbCwKLSAgICBPTVhfVTggY3VyUVAsCi0gICAgY29uc3QgT01YX1U4ICpwUVBCdWYsCi0gICAgT01YX0lOVCBibG9ja0luZGV4LAotICAgIE9NWF9JTlQgaW50cmFEQ1ZMQywKLSAgICBPTVhfSU5UIEFDUHJlZEZsYWcsCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIgICAoNi4yLjUuNC4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogRGVjb2RlcyB0aGUgSU5URVIgYmxvY2sgY29lZmZpY2llbnRzLiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgCi0gKiBxdWFudGl6YXRpb24sIGludmVyc2UgemlnemFnIHBvc2l0aW9uaW5nLCBhbmQgSURDVCAod2l0aCBhcHByb3ByaWF0ZSAKLSAqIGNsaXBwaW5nIG9uIGVhY2ggc3RlcCkgb24gdGhlIGNvZWZmaWNpZW50cy4gVGhlIHJlc3VsdHMgKHJlc2lkdWFscykgYXJlIAotICogcGxhY2VkIGluIGEgY29udGlndW91cyBhcnJheSBvZiA2NCBlbGVtZW50cy4gRm9yIElOVEVSIGJsb2NrLCB0aGUgb3V0cHV0IAotICogYnVmZmVyIGhvbGRzIHRoZSByZXNpZHVhbHMgZm9yIGZ1cnRoZXIgcmVjb25zdHJ1Y3Rpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCi0gKiAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5IGNoZWNrIGZvciB0aGUgYml0IHN0cmVhbSAKLSAqICAgICAgICAgICAgYnVmZmVyLiAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiBbMC03XSAKLSAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIAotICogICAgICAgICAgICBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQsIHNvIAotICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAotICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlY29kZWQgcmVzaWR1YWwgYnVmZmVyIChhIGNvbnRpZ3VvdXMgYXJyYXkgb2YgNjQgCi0gKiAgICAgICAgICAgIGVsZW1lbnRzIG9mIE9NWF9TMTYgZGF0YSB0eXBlKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTnVsbDogCi0gKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQgLCBwRHN0IAotICogICAgLSAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddCi0gKiAgICAtICAgIFFQIDw9IDAuIAotICogICAgLSAgICBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQgCi0gKiAgICBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvci4gUmVmZXIgdG8gT01YX1N0c19FcnIgb2YgRGVjb2RlVkxDWmlnemFnX0ludGVyIC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlciAoCi0gICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBPTVhfUzE2ICpwRHN0LAotICAgIE9NWF9JTlQgUVAsCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEgICAoNi4yLjUuNC4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYWRhcHRpdmUgREMvQUMgY29lZmZpY2llbnQgcHJlZGljdGlvbiBmb3IgYW4gaW50cmEgYmxvY2suICBQcmlvciAKLSAqIHRvIHRoZSBmdW5jdGlvbiBjYWxsLCBwcmVkaWN0aW9uIGRpcmVjdGlvbiAocHJlZERpcikgc2hvdWxkIGJlIHNlbGVjdGVkIGFzIAotICogc3BlY2lmaWVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4zLjEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMgdGhlIHF1YW50aXplZCAKLSAqICAgICAgICAgICAgY29lZmZpY2llbnQgcmVzaWR1YWxzIChQUUYpIG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAotICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIAotICogICAgICAgICAgICBzYXR1cmF0ZWQgdG8gdGhlIHJhbmdlIFstMjA0OCwgMjA0N10uIAotICogICBwUHJlZEJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiAKLSAqICAgICAgICAgICAgYSA0LWJ5dGUgYm91bmRhcnkuIAotICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAotICogICBjdXJRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIGN1cnJlbnQgYmxvY2suIGN1clFQIG1heSBlcXVhbCB0byAKLSAqICAgICAgICAgICAgcHJlZFFQIGVzcGVjaWFsbHkgd2hlbiB0aGUgY3VycmVudCBibG9jayBhbmQgdGhlIHByZWRpY3RvciBibG9jayAKLSAqICAgICAgICAgICAgYXJlIGluIHRoZSBzYW1lIG1hY3JvYmxvY2suIAotICogICBwcmVkUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sgCi0gKiAgIHByZWREaXIgLSBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZSBvZiB0aGUgCi0gKiAgICAgICAgICAgIGZvbGxvd2luZyB2YWx1ZXM6IE9NWF9WQ19IT1JJWk9OVEFMIC0gcHJlZGljdCBob3Jpem9udGFsbHkgCi0gKiAgICAgICAgICAgIE9NWF9WQ19WRVJUSUNBTCAtIHByZWRpY3QgdmVydGljYWxseSAKLSAqICAgQUNQcmVkRmxhZyAtIGEgZmxhZyBpbmRpY2F0aW5nIGlmIEFDIHByZWRpY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZC4gSXQgCi0gKiAgICAgICAgICAgIGlzIGVxdWFsIHRvIGFjX3ByZWRfZmxhZyBpbiB0aGUgYml0IHN0cmVhbSBzeW50YXggb2YgTVBFRy00IAotICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlIG9yIGNocm9taW5hbmNlKSBvZiB0aGUgCi0gKiAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMgdGhlIHF1YW50aXplZCAKLSAqICAgICAgICAgICAgY29lZmZpY2llbnRzIChRRikgb2YgdGhlIGN1cnJlbnQgYmxvY2sgCi0gKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyIAotICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlciAgTm90ZTogCi0gKiAgICAgICAgICAgIEJ1ZmZlciB1cGRhdGU6IFVwZGF0ZSB0aGUgQUMgcHJlZGljdGlvbiBidWZmZXIgKGJvdGggcm93IGFuZCAKLSAqICAgICAgICAgICAgY29sdW1uIGJ1ZmZlcikuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKLSAqICAgICAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgICAgICAgcFNyY0RzdCwgcFByZWRCdWZSb3csIG9yIHBQcmVkQnVmQ29sLiAKLSAqICAgICAgICAtICAgIGN1clFQIDw9IDAsIAotICogICAgICAgIC0gICAgcHJlZFFQIDw9IDAsIAotICogICAgICAgIC0gICAgY3VyUVAgPjMxLCAKLSAqICAgICAgICAtICAgIHByZWRRUCA+IDMxLCAKLSAqICAgICAgICAtICAgIHByZURpciBleGNlZWRzIFsxLDJdCi0gKiAgICAgICAgLSAgICBwU3JjRHN0LCBwUHJlZEJ1ZlJvdywgb3IgcFByZWRCdWZDb2wgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhICgKLSAgICBPTVhfUzE2ICpwU3JjRHN0LAotICAgIE9NWF9TMTYgKnBQcmVkQnVmUm93LAotICAgIE9NWF9TMTYgKnBQcmVkQnVmQ29sLAotICAgIE9NWF9JTlQgY3VyUVAsCi0gICAgT01YX0lOVCBwcmVkUVAsCi0gICAgT01YX0lOVCBwcmVkRGlyLAotICAgIE9NWF9JTlQgQUNQcmVkRmxhZywKLSAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01DUmVjb25CbG9jayAgICg2LjIuNS41LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBtb3Rpb24gY29tcGVuc2F0aW9uIHByZWRpY3Rpb24gZm9yIGFuIDh4OCBibG9jayB1c2luZyAKLSAqIGludGVycG9sYXRpb24gZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi4yLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZS4gCi0gKiAgIHNyY1N0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJlZmVyZW5jZSBwbGFuZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgZHN0U3RlcCAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSAKLSAqICAgICAgICAgICAgZGVzdGluYXRpb24gcGxhbmUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIHBTcmNSZXNpZHVlIC0gcG9pbnRlciB0byBhIGJ1ZmZlciBjb250YWluaW5nIHRoZSAxNi1iaXQgcHJlZGljdGlvbiAKLSAqICAgICAgICAgICAgcmVzaWR1YWxzOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gSWYgdGhlIHBvaW50ZXIgaXMgTlVMTCwgdGhlbiAKLSAqICAgICAgICAgICAgbm8gcHJlZGljdGlvbiBpcyBkb25lLCBvbmx5IG1vdGlvbiBjb21wZW5zYXRpb24sIGkuZS4sIHRoZSBibG9jayAKLSAqICAgICAgICAgICAgaXMgbW92ZWQgd2l0aCBpbnRlcnBvbGF0aW9uLiAKLSAqICAgcHJlZGljdFR5cGUgLSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIHR5cGUsIGFzIGRlZmluZWQgaW4gc2VjdGlvbiAKLSAqICAgICAgICAgICAgNi4yLjEuMi4gCi0gKiAgIHJuZFZhbCAtIHJvdW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVyOiAwIC0gZGlzYWJsZWQ7IDEgLSBlbmFibGVkLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gIElmIAotICogICAgICAgICAgICBwcmVkaWN0aW9uIHJlc2lkdWFscyBhcmUgYWRkZWQgdGhlbiBvdXRwdXQgaW50ZW5zaXRpZXMgYXJlIAotICogICAgICAgICAgICBjbGlwcGVkIHRvIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCi0gKiAgICAtICAgIHBEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgcFNyY1Jlc2lkdWUgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYyBvciBwRHN0LiAKLSAqICAgIC0gICAgZWl0aGVyIHNyY1N0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICAgaW52YWxpZCB0eXBlIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBwcmVkaWN0VHlwZS4gCi0gKiAgICAtICAgIHRoZSBwYXJhbWV0ZXIgcm5kVmFsIGlzIG5vdCBlcXVhbCBlaXRoZXIgdG8gMCBvciAxLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfTUNSZWNvbkJsb2NrICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgT01YX0lOVCBzcmNTdGVwLAotICAgIGNvbnN0IE9NWF9TMTYgKnBTcmNSZXNpZHVlLAotICAgIE9NWF9VOCAqcERzdCwKLSAgICBPTVhfSU5UIGRzdFN0ZXAsCi0gICAgT01YX0lOVCBwcmVkaWN0VHlwZSwKLSAgICBPTVhfSU5UIHJuZFZhbAotKTsKLQotCi0KLS8qIDYuMy4xLjEgSW50cmEgMTZ4MTYgUHJlZGljdGlvbiBNb2RlcyAgKi8KLS8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBpbnRyYV8xNngxNiBtYWNyb2Jsb2NrIHByZWRpY3Rpb24gbW9kZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBPTVhfVkNfMTZYMTZfVkVSVCA9IDAsICAvKiogSW50cmFfMTZ4MTZfVmVydGljYWwgKi8KLSAgICBPTVhfVkNfMTZYMTZfSE9SID0gMSwgICAvKiogSW50cmFfMTZ4MTZfSG9yaXpvbnRhbCAqLwotICAgIE9NWF9WQ18xNlgxNl9EQyA9IDIsICAgIC8qKiBJbnRyYV8xNngxNl9EQyAqLwotICAgIE9NWF9WQ18xNlgxNl9QTEFORSA9IDMgIC8qKiBJbnRyYV8xNngxNl9QbGFuZSAqLyAKLX0gT01YVkNNNFAxMEludHJhMTZ4MTZQcmVkTW9kZTsKLQotCi0KLS8qIDYuMy4xLjIgSW50cmEgNHg0IFByZWRpY3Rpb24gTW9kZXMgICovCi0vKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgaW50cmFfNHg0IG1hY3JvYmxvY2sgcHJlZGljdGlvbiBtb2RlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLwotCi10eXBlZGVmIGVudW0gewotICAgIE9NWF9WQ180WDRfVkVSVCA9IDAsICAgICAvKiogSW50cmFfNHg0X1ZlcnRpY2FsICovCi0gICAgT01YX1ZDXzRYNF9IT1IgPSAxLCAgICAgIC8qKiBJbnRyYV80eDRfSG9yaXpvbnRhbCAqLwotICAgIE9NWF9WQ180WDRfREMgPSAyLCAgICAgICAvKiogSW50cmFfNHg0X0RDICovCi0gICAgT01YX1ZDXzRYNF9ESUFHX0RMID0gMywgIC8qKiBJbnRyYV80eDRfRGlhZ29uYWxfRG93bl9MZWZ0ICovCi0gICAgT01YX1ZDXzRYNF9ESUFHX0RSID0gNCwgIC8qKiBJbnRyYV80eDRfRGlhZ29uYWxfRG93bl9SaWdodCAqLwotICAgIE9NWF9WQ180WDRfVlIgPSA1LCAgICAgICAvKiogSW50cmFfNHg0X1ZlcnRpY2FsX1JpZ2h0ICovCi0gICAgT01YX1ZDXzRYNF9IRCA9IDYsICAgICAgIC8qKiBJbnRyYV80eDRfSG9yaXpvbnRhbF9Eb3duICovCi0gICAgT01YX1ZDXzRYNF9WTCA9IDcsICAgICAgIC8qKiBJbnRyYV80eDRfVmVydGljYWxfTGVmdCAqLwotICAgIE9NWF9WQ180WDRfSFUgPSA4ICAgICAgICAvKiogSW50cmFfNHg0X0hvcml6b250YWxfVXAgKi8gCi19IE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlOwotCi0KLQotLyogNi4zLjEuMyBDaHJvbWEgUHJlZGljdGlvbiBNb2RlcyAgKi8KLS8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBpbnRyYSBjaHJvbWEgcHJlZGljdGlvbiBtb2RlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLwotCi10eXBlZGVmIGVudW0gewotICAgIE9NWF9WQ19DSFJPTUFfREMgPSAwLCAgICAvKiogSW50cmFfQ2hyb21hX0RDICovCi0gICAgT01YX1ZDX0NIUk9NQV9IT1IgPSAxLCAgIC8qKiBJbnRyYV9DaHJvbWFfSG9yaXpvbnRhbCAqLwotICAgIE9NWF9WQ19DSFJPTUFfVkVSVCA9IDIsICAvKiogSW50cmFfQ2hyb21hX1ZlcnRpY2FsICovCi0gICAgT01YX1ZDX0NIUk9NQV9QTEFORSA9IDMgIC8qKiBJbnRyYV9DaHJvbWFfUGxhbmUgKi8gCi19IE9NWFZDTTRQMTBJbnRyYUNocm9tYVByZWRNb2RlOwotCi0KLQotLyogNi4zLjEuNCBNb3Rpb24gRXN0aW1hdGlvbiBNb2RlcyAgKi8KLS8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBILjI2NCBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLwotCi10eXBlZGVmIGVudW0gewotICAgIE9NWF9WQ19NNFAxMF9GQVNUX1NFQVJDSCA9IDAsIC8qKiBGYXN0IG1vdGlvbiBzZWFyY2ggKi8KLSAgICBPTVhfVkNfTTRQMTBfRlVMTF9TRUFSQ0ggPSAxICAvKiogRnVsbCBtb3Rpb24gc2VhcmNoICovIAotfSBPTVhWQ000UDEwTUVNb2RlOwotCi0KLQotLyogNi4zLjEuNSBNYWNyb2Jsb2NrIFR5cGVzICAqLwotLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIEguMjY0IG1hY3JvYmxvY2sgdHlwZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBPTVhfVkNfUF8xNngxNiAgPSAwLCAvKiBkZWZpbmVkIGJ5IFtJU08xNDQ5Ni0xMF0gKi8KLSAgICBPTVhfVkNfUF8xNng4ICA9IDEsCi0gICAgT01YX1ZDX1BfOHgxNiAgPSAyLAotICAgIE9NWF9WQ19QXzh4OCAgPSAzLAotICAgIE9NWF9WQ19QUkVGMF84eDggID0gNCwKLSAgICBPTVhfVkNfSU5URVJfU0tJUCAgPSA1LAotICAgIE9NWF9WQ19JTlRSQV80eDQgID0gOCwKLSAgICBPTVhfVkNfSU5UUkFfMTZ4MTYgID0gOSwKLSAgICBPTVhfVkNfSU5UUkFfUENNID0gMTAgCi19IE9NWFZDTTRQMTBNYWNyb2Jsb2NrVHlwZTsKLQotCi0KLS8qIDYuMy4xLjYgU3ViLU1hY3JvYmxvY2sgVHlwZXMgICovCi0vKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgSC4yNjQgc3ViLW1hY3JvYmxvY2sgdHlwZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBPTVhfVkNfU1VCX1BfOHg4ID0gMCwgLyogZGVmaW5lZCBieSBbSVNPMTQ0OTYtMTBdICovCi0gICAgT01YX1ZDX1NVQl9QXzh4NCA9IDEsCi0gICAgT01YX1ZDX1NVQl9QXzR4OCA9IDIsCi0gICAgT01YX1ZDX1NVQl9QXzR4NCA9IDMgCi19IE9NWFZDTTRQMTBTdWJNYWNyb2Jsb2NrVHlwZTsKLQotCi0KLS8qIDYuMy4xLjcgVmFyaWFibGUgTGVuZ3RoIENvZGluZyAoVkxDKSBJbmZvcm1hdGlvbiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE9NWF9VOCB1VHJhaWxpbmdfT25lczsgICAgICAvKiBUcmFpbGluZyBvbmVzOyAzIGF0IG1vc3QgKi8KLSAgICBPTVhfVTggdVRyYWlsaW5nX09uZV9TaWduczsgLyogVHJhaWxpbmcgb25lcyBzaWduYWwgKi8KLSAgICBPTVhfVTggdU51bUNvZWZmczsgICAgICAgICAgLyogVG90YWwgbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZzLCBpbmNsdWRpbmcgdHJhaWxpbmcgb25lcyAqLwotICAgIE9NWF9VOCB1VG90YWxaZXJvczsgICAgICAgICAvKiBUb3RhbCBudW1iZXIgb2YgemVybyBjb2VmcyAqLwotICAgIE9NWF9TMTYgaUxldmVsc1sxNl07ICAgICAgICAvKiBMZXZlbHMgb2Ygbm9uLXplcm8gY29lZnMsIGluIHJldmVyc2UgemlnLXphZyBvcmRlciAqLwotICAgIE9NWF9VOCB1UnVuc1sxNl07ICAgICAgICAgICAvKiBSdW5zIGZvciBsZXZlbHMgYW5kIHRyYWlsaW5nIG9uZXMsIGluIHJldmVyc2UgemlnLXphZyBvcmRlciAqLwotfSBPTVhWQ000UDEwVkxDSW5mbzsKLQotCi0KLS8qIDYuMy4xLjggTWFjcm9ibG9jayBJbmZvcm1hdGlvbiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE9NWF9TMzIgc2xpY2VJZDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNsaWNlIG51bWJlciAqLwotICAgIE9NWFZDTTRQMTBNYWNyb2Jsb2NrVHlwZSBtYlR5cGU7ICAgICAgICAgIC8qIE1CIHR5cGUgKi8KLSAgICBPTVhWQ000UDEwU3ViTWFjcm9ibG9ja1R5cGUgc3ViTUJUeXBlWzRdOyAvKiBzdWItYmxvY2sgdHlwZSAqLwotICAgIE9NWF9TMzIgcXB5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHFwIGZvciBsdW1hICovCi0gICAgT01YX1MzMiBxcGM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcXAgZm9yIGNocm9tYSAqLwotICAgIE9NWF9VMzIgY2JweTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENCUCBMdW1hICovCi0gICAgT01YX1UzMiBjYnBjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ0JQIENocm9tYSAqLwotICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVjBbNF1bNF07IC8qIG1vdGlvbiB2ZWN0b3IsIHJlcHJlc2VudGVkIHVzaW5nIDEvNC1wZWwgdW5pdHMsIHBNVjBbYmxvY2t5XVtibG9ja3hdIChibG9ja3kgPSAwfjMsIGJsb2NreCA9MH4zKSAqLwotICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVlByZWRbNF1bNF07IC8qIG1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbiwgUmVwcmVzZW50ZWQgdXNpbmcgMS80LXBlbCB1bml0cywgcE1WUHJlZFtibG9ja3ldW2Jsb2NreF0gKGJsb2NreSA9IDB+MywgYmxvY2t4ID0gMH4zKSAqLwotICAgIE9NWF9VOCBwUmVmTDBJZHhbNF07ICAgICAgICAgICAgICAgICAgICAgIC8qIHJlZmVyZW5jZSBwaWN0dXJlIGluZGljZXMgKi8KLSAgICBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlIEludHJhMTZ4MTZQcmVkTW9kZTsgLyogYmVzdCBpbnRyYSAxNngxNiBwcmVkaWN0aW9uIG1vZGUgKi8KLSAgICBPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZSBwSW50cmE0eDRQcmVkTW9kZVsxNl07IC8qIGJlc3QgaW50cmEgNHg0IHByZWRpY3Rpb24gbW9kZSBmb3IgZWFjaCBibG9jaywgcE1WMCBpbmRleGVkIGFzIGFib3ZlICovCi19IE9NWFZDTTRQMTBNQkluZm8sICpPTVhWQ000UDEwTUJJbmZvUHRyOwotCi0KLQotLyogNi4zLjEuOSBNb3Rpb24gRXN0aW1hdGlvbiBQYXJhbWV0ZXJzICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgT01YX1MzMiBibG9ja1NwbGl0RW5hYmxlOHg4OyAvKiBlbmFibGVzIDE2eDgsIDh4MTYsIDh4OCAqLwotICAgIE9NWF9TMzIgYmxvY2tTcGxpdEVuYWJsZTR4NDsgLyogZW5hYmxlIHNwbGl0dGluZyBvZiA4eDQsIDR4OCwgNHg0IGJsb2NrcyAqLwotICAgIE9NWF9TMzIgaGFsZlNlYXJjaEVuYWJsZTsKLSAgICBPTVhfUzMyIHF1YXJ0ZXJTZWFyY2hFbmFibGU7Ci0gICAgT01YX1MzMiBpbnRyYUVuYWJsZTR4NDsgICAgICAvKiAxPWVuYWJsZSwgMD1kaXNhYmxlICovCi0gICAgT01YX1MzMiBzZWFyY2hSYW5nZTE2eDE2OyAgICAvKiBpbnRlZ2VyIHBpeGVsIHVuaXRzICovCi0gICAgT01YX1MzMiBzZWFyY2hSYW5nZTh4ODsKLSAgICBPTVhfUzMyIHNlYXJjaFJhbmdlNHg0OwotfSBPTVhWQ000UDEwTUVQYXJhbXM7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0ICAgKDYuMy4zLjEuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm0gSW50cmFfNHg0IHByZWRpY3Rpb24gZm9yIGx1bWEgc2FtcGxlcy4gSWYgdGhlIHVwcGVyLXJpZ2h0IGJsb2NrIGlzIAotICogbm90IGF2YWlsYWJsZSwgdGhlbiBkdXBsaWNhdGlvbiB3b3JrIHNob3VsZCBiZSBoYW5kbGVkIGluc2lkZSB0aGUgZnVuY3Rpb24uIAotICogVXNlcnMgbmVlZCBub3QgZGVmaW5lIHRoZW0gb3V0c2lkZS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0xlZnQgLSAgUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDQgbGVmdCBwaXhlbHM6IAotICogICAgICAgICAgICAgICAgICBwW3gsIHldICh4ID0gLTEsIHkgPSAwLi4zKSAKLSAqICAgcFNyY0Fib3ZlIC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDggYWJvdmUgcGl4ZWxzOiAKLSAqICAgICAgICAgICAgICAgICAgcFt4LHldICh4ID0gMC4uNywgeSA9LTEpOyAKLSAqICAgICAgICAgICAgICAgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFNyY0Fib3ZlTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGFib3ZlIGxlZnQgcGl4ZWxzOiBwW3gseV0gKHggPSAtMSwgeSA9IC0xKSAKLSAqICAgbGVmdFN0ZXAgLSBTdGVwIG9mIGxlZnQgcGl4ZWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIGRzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgcHJlZE1vZGUgLSBJbnRyYV80eDQgcHJlZGljdGlvbiBtb2RlLiAKLSAqICAgYXZhaWxhYmlsaXR5IC0gTmVpZ2hib3JpbmcgNHg0IGJsb2NrIGF2YWlsYWJpbGl0eSBmbGFnLCByZWZlciB0byAKLSAqICAgICAgICAgICAgICJOZWlnaGJvcmluZyBNYWNyb2Jsb2NrIEF2YWlsYWJpbGl0eSIgLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKLSAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCi0gKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAotICogICAgcERzdCBpcyBOVUxMLiAKLSAqICAgIGRzdFN0ZXAgPCA0LCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIAotICogICAgbGVmdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgICBwcmVkTW9kZSBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlIG9mIGVudW1lcmF0aW9uIAotICogICAgICAgICAgICAgIE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfVkVSVCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfVVBQRVIgCi0gKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwW3gsLTFdICh4ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0hPUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfTEVGVCAKLSAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbLTEseV0gKHkgPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfRElBR19ETCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKLSAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVIgaW5kaWNhdGluZyBwW3gsIC0xXSAoeCA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9ESUFHX0RSLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAotICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAotICogICAgICAgICAgICAgIHBbeCwtMV0gKHggPSAwLi4zKSwgb3IgcFstMSx5XSAoeSA9IDAuLjMpIG9yIHBbLTEsLTFdIGlzIG5vdCAKLSAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9WUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKLSAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKLSAqICAgICAgICAgICAgICBwW3gsLTFdICh4ID0gMC4uMyksIG9yIHBbLTEseV0gKHkgPSAwLi4zKSBvciBwWy0xLC0xXSBpcyBub3QgCi0gKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfSEQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCi0gKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCi0gKiAgICAgICAgICAgICAgcFt4LC0xXSAoeCA9IDAuLjMpLCBvciBwWy0xLHldICh5ID0gMC4uMykgb3IgcFstMSwtMV0gaXMgbm90IAotICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X1ZMLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19VUFBFUiAKLSAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfSFUsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCi0gKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVIsIGJ1dCBwU3JjQWJvdmUgaXMgTlVMTC4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfTEVGVCwgYnV0IHBTcmNMZWZ0IGlzIE5VTEwuIAotICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSX0xFRlQsIGJ1dCBwU3JjQWJvdmVMZWZ0IGlzIE5VTEwuIAotICogICAgZWl0aGVyIHBTcmNBYm92ZSBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgCi0gKgotICogTm90ZTogCi0gKiAgICAgcFNyY0Fib3ZlLCBwU3JjQWJvdmUsIHBTcmNBYm92ZUxlZnQgbWF5IGJlIGludmFsaWQgcG9pbnRlcnMgaWYgCi0gKiAgICAgdGhleSBhcmUgbm90IHVzZWQgYnkgaW50cmEgcHJlZGljdGlvbiBhcyBpbXBsaWVkIGluIHByZWRNb2RlLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0xlZnQsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmVMZWZ0LAotICAgIE9NWF9VOCAqcERzdCwKLSAgICBPTVhfSU5UIGxlZnRTdGVwLAotICAgIE9NWF9JTlQgZHN0U3RlcCwKLSAgICBPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZSBwcmVkTW9kZSwKLSAgICBPTVhfUzMyIGF2YWlsYWJpbGl0eQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiAgICg2LjMuMy4xLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtIEludHJhXzE2eDE2IHByZWRpY3Rpb24gZm9yIGx1bWEgc2FtcGxlcy4gSWYgdGhlIHVwcGVyLXJpZ2h0IGJsb2NrIAotICogaXMgbm90IGF2YWlsYWJsZSwgdGhlbiBkdXBsaWNhdGlvbiB3b3JrIHNob3VsZCBiZSBoYW5kbGVkIGluc2lkZSB0aGUgCi0gKiBmdW5jdGlvbi4gVXNlcnMgbmVlZCBub3QgZGVmaW5lIHRoZW0gb3V0c2lkZS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0xlZnQgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgbGVmdCBwaXhlbHM6IHBbeCwgeV0gKHggPSAtMSwgeSA9IAotICogICAgICAgICAgICAwLi4xNSkgCi0gKiAgIHBTcmNBYm92ZSAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBhYm92ZSBwaXhlbHM6IHBbeCx5XSAoeCA9IDAuLjE1LCAKLSAqICAgICAgICAgICAgeT0gLTEpOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFNyY0Fib3ZlTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGFib3ZlIGxlZnQgcGl4ZWxzOiBwW3gseV0gKHggPSAtMSwgeSA9IC0xKSAKLSAqICAgbGVmdFN0ZXAgLSBTdGVwIG9mIGxlZnQgcGl4ZWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBkc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBwcmVkTW9kZSAtIEludHJhXzE2eDE2IHByZWRpY3Rpb24gbW9kZSwgcGxlYXNlIHJlZmVyIHRvIHNlY3Rpb24gMy40LjEuIAotICogICBhdmFpbGFiaWxpdHkgLSBOZWlnaGJvcmluZyAxNngxNiBNQiBhdmFpbGFiaWxpdHkgZmxhZy4gUmVmZXIgdG8gCi0gKiAgICAgICAgICAgICAgICAgIHNlY3Rpb24gMy40LjQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC1Qb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAotICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKLSAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCi0gKiAgICBwRHN0IGlzIE5VTEwuIAotICogICAgZHN0U3RlcCA8IDE2LiBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgIGxlZnRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgIHByZWRNb2RlIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgZW51bWVyYXRpb24gCi0gKiAgICAgICAgICAgICAgT01YVkNNNFAxMEludHJhMTZ4MTZQcmVkTW9kZSAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ18xNlgxNl9WRVJULCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAotICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUiBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi4xNSkgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfMTZYMTZfSE9SLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19MRUZUIAotICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFstMSx5XSAoeSA9IDAuLjE1KSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ18xNlgxNl9QTEFORSwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKLSAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKLSAqICAgICAgICAgICAgICBwW3gsLTFdKHggPSAwLi4xNSksIG9yIHBbLTEseV0gKHkgPSAwLi4xNSksIG9yIHBbLTEsLTFdIGlzIG5vdCAKLSAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAotICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSLCBidXQgcFNyY0Fib3ZlIGlzIE5VTEwuIAotICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX0xFRlQsIGJ1dCBwU3JjTGVmdCBpcyBOVUxMLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUl9MRUZULCBidXQgcFNyY0Fib3ZlTGVmdCBpcyBOVUxMLiAKLSAqICAgIGVpdGhlciBwU3JjQWJvdmUgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICAKLSAqCi0gKiBOb3RlOiAKLSAqICAgICBwU3JjQWJvdmUsIHBTcmNBYm92ZSwgcFNyY0Fib3ZlTGVmdCBtYXkgYmUgaW52YWxpZCBwb2ludGVycyBpZiAKLSAqICAgICB0aGV5IGFyZSBub3QgdXNlZCBieSBpbnRyYSBwcmVkaWN0aW9uIGltcGxpZWQgaW4gcHJlZE1vZGUuIAotICogTm90ZTogCi0gKiAgICAgT01YX1ZDX1VQUEVSX1JJR0hUIGlzIG5vdCB1c2VkIGluIGludHJhXzE2eDE2IGx1bWEgcHJlZGljdGlvbi4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0xlZnQsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmVMZWZ0LAotICAgIE9NWF9VOCAqcERzdCwKLSAgICBPTVhfSU5UIGxlZnRTdGVwLAotICAgIE9NWF9JTlQgZHN0U3RlcCwKLSAgICBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlIHByZWRNb2RlLAotICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCAgICg2LjMuMy4xLjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBpbnRyYSBwcmVkaWN0aW9uIGZvciBjaHJvbWEgc2FtcGxlcy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0xlZnQgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgOCBsZWZ0IHBpeGVsczogcFt4LCB5XSAoeCA9IC0xLCB5PSAKLSAqICAgICAgICAgICAgMC4uNykuIAotICogICBwU3JjQWJvdmUgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgOCBhYm92ZSBwaXhlbHM6IHBbeCx5XSAoeCA9IDAuLjcsIHkgCi0gKiAgICAgICAgICAgID0gLTEpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFNyY0Fib3ZlTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGFib3ZlIGxlZnQgcGl4ZWxzOiBwW3gseV0gKHggPSAtMSwgeSA9IC0xKSAKLSAqICAgbGVmdFN0ZXAgLSBTdGVwIG9mIGxlZnQgcGl4ZWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIGRzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgcHJlZE1vZGUgLSBJbnRyYSBjaHJvbWEgcHJlZGljdGlvbiBtb2RlLCBwbGVhc2UgcmVmZXIgdG8gc2VjdGlvbiAzLjQuMy4gCi0gKiAgIGF2YWlsYWJpbGl0eSAtIE5laWdoYm9yaW5nIGNocm9tYSBibG9jayBhdmFpbGFiaWxpdHkgZmxhZywgcGxlYXNlIHJlZmVyIAotICogICAgICAgICAgICB0byAgIk5laWdoYm9yaW5nIE1hY3JvYmxvY2sgQXZhaWxhYmlsaXR5Ii4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAotICogICAgSWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKLSAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCi0gKiAgICBwRHN0IGlzIE5VTEwuIAotICogICAgZHN0U3RlcCA8IDggb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIGxlZnRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgcHJlZE1vZGUgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSBvZiBlbnVtZXJhdGlvbiAKLSAqICAgICAgICAgICAgICBPTVhWQ000UDEwSW50cmFDaHJvbWFQcmVkTW9kZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfQ0hST01BX1ZFUlQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCi0gKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSIGluZGljYXRpbmcgcFt4LC0xXSAoeCA9IDAuLjcpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDX0NIUk9NQV9IT1IsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCi0gKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uNykgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfQ0hST01BX1BMQU5FLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAotICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAotICogICAgICAgICAgICAgIHBbeCwtMV0oeCA9IDAuLjcpLCBvciBwWy0xLHldICh5ID0gMC4uNyksIG9yIHBbLTEsLTFdIGlzIG5vdCAKLSAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAotICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSLCBidXQgcFNyY0Fib3ZlIGlzIE5VTEwuIAotICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX0xFRlQsIGJ1dCBwU3JjTGVmdCBpcyBOVUxMLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUl9MRUZULCBidXQgcFNyY0Fib3ZlTGVmdCBpcyBOVUxMLiAKLSAqICAgIGVpdGhlciBwU3JjQWJvdmUgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeS4gIAotICoKLSAqICBOb3RlOiBwU3JjQWJvdmUsIHBTcmNBYm92ZSwgcFNyY0Fib3ZlTGVmdCBtYXkgYmUgaW52YWxpZCBwb2ludGVyIGlmIAotICogIHRoZXkgYXJlIG5vdCB1c2VkIGJ5IGludHJhIHByZWRpY3Rpb24gaW1wbGllZCBpbiBwcmVkTW9kZS4gCi0gKgotICogIE5vdGU6IE9NWF9WQ19VUFBFUl9SSUdIVCBpcyBub3QgdXNlZCBpbiBpbnRyYSBjaHJvbWEgcHJlZGljdGlvbi4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNMZWZ0LAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlTGVmdCwKLSAgICBPTVhfVTggKnBEc3QsCi0gICAgT01YX0lOVCBsZWZ0U3RlcCwKLSAgICBPTVhfSU5UIGRzdFN0ZXAsCi0gICAgT01YVkNNNFAxMEludHJhQ2hyb21hUHJlZE1vZGUgcHJlZE1vZGUsCi0gICAgT01YX1MzMiBhdmFpbGFiaWxpdHkKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEgICAoNi4zLjMuMi4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgcXVhcnRlci1waXhlbCBpbnRlcnBvbGF0aW9uIGZvciBpbnRlciBsdW1hIE1CLiBJdCBpcyBhc3N1bWVkIHRoYXQgCi0gKiB0aGUgZnJhbWUgaXMgYWxyZWFkeSBwYWRkZWQgd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSBzb3VyY2UgcmVmZXJlbmNlIGZyYW1lIGJ1ZmZlciAKLSAqICAgc3JjU3RlcCAtIHJlZmVyZW5jZSBmcmFtZSBzdGVwLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHJvaS53aWR0aCAKLSAqICAgZHN0U3RlcCAtIGRlc3RpbmF0aW9uIGZyYW1lIHN0ZXAsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgCi0gKiAgICAgICAgICAgIHJvaS53aWR0aCAKLSAqICAgZHggLSBGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgCi0gKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCwzXSAKLSAqICAgZHkgLSBGcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciB5IGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgCi0gKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCwzXSAKLSAqICAgcm9pIC0gRGltZW5zaW9uIG9mIHRoZSBpbnRlcnBvbGF0aW9uIHJlZ2lvbjsgdGhlIHBhcmFtZXRlcnMgcm9pLndpZHRoIGFuZCAKLSAqICAgICAgICAgICAgcm9pLmhlaWdodCBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBmcmFtZSBidWZmZXI6IAotICogICAgICAgICAgaWYgcm9pLndpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKLSAqICAgICAgICAgIGlmIHJvaS53aWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCi0gKiAgICAgICAgICBpZiByb2kud2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAotICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKLSAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCi0gKiAgICBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCi0gKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgPCByb2kud2lkdGguIAotICogICAgZHggb3IgZHkgaXMgb3V0IG9mIHJhbmdlIFswLDNdLiAKLSAqICAgIHJvaS53aWR0aCBvciByb2kuaGVpZ2h0IGlzIG91dCBvZiByYW5nZSB7NCwgOCwgMTZ9LiAKLSAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byA0LCBidXQgcERzdCBpcyBub3QgNCBieXRlIGFsaWduZWQuIAotICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDggb3IgMTYsIGJ1dCBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4gCi0gKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBPTVhfUzMyIHNyY1N0ZXAsCi0gICAgT01YX1U4ICpwRHN0LAotICAgIE9NWF9TMzIgZHN0U3RlcCwKLSAgICBPTVhfUzMyIGR4LAotICAgIE9NWF9TMzIgZHksCi0gICAgT01YU2l6ZSByb2kKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSAgICg2LjMuMy4yLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyAxLzgtcGl4ZWwgaW50ZXJwb2xhdGlvbiBmb3IgaW50ZXIgY2hyb21hIE1CLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC1Qb2ludGVyIHRvIHRoZSBzb3VyY2UgcmVmZXJlbmNlIGZyYW1lIGJ1ZmZlciAKLSAqICAgc3JjU3RlcCAtUmVmZXJlbmNlIGZyYW1lIHN0ZXAgaW4gYnl0ZXMgCi0gKiAgIGRzdFN0ZXAgLURlc3RpbmF0aW9uIGZyYW1lIHN0ZXAgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAKLSAqICAgICAgICAgICAgcm9pLndpZHRoLiAKLSAqICAgZHggLUZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50IGluIDEvOCBwaXhlbCAKLSAqICAgICAgICAgICAgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddIAotICogICBkeSAtRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50IGluIDEvOCBwaXhlbCAKLSAqICAgICAgICAgICAgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddIAotICogICByb2kgLURpbWVuc2lvbiBvZiB0aGUgaW50ZXJwb2xhdGlvbiByZWdpb247IHRoZSBwYXJhbWV0ZXJzIHJvaS53aWR0aCBhbmQgCi0gKiAgICAgICAgICAgIHJvaS5oZWlnaHQgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgMiwgNCwgb3IgOC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGZyYW1lIGJ1ZmZlcjoKLSAqICAgICAgICAgaWYgcm9pLndpZHRoPT0yLCAgMi1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKLSAqICAgICAgICAgaWYgcm9pLndpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKLSAqICAgICAgICAgaWYgcm9pLndpZHRoPT04LCA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCi0gKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAotICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKLSAqICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKLSAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCA8IDguIAotICogICAgZHggb3IgZHkgaXMgb3V0IG9mIHJhbmdlIFswLTddLiAKLSAqICAgIHJvaS53aWR0aCBvciByb2kuaGVpZ2h0IGlzIG91dCBvZiByYW5nZSB7Miw0LDh9LiAKLSAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byAyLCBidXQgcERzdCBpcyBub3QgMi1ieXRlIGFsaWduZWQuIAotICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDQsIGJ1dCBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gOCwgYnV0IHBEc3QgaXMgbm90IDggYnl0ZSBhbGlnbmVkLiAKLSAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgT01YX1MzMiBzcmNTdGVwLAotICAgIE9NWF9VOCAqcERzdCwKLSAgICBPTVhfUzMyIGRzdFN0ZXAsCi0gICAgT01YX1MzMiBkeCwKLSAgICBPTVhfUzMyIGR5LAotICAgIE9NWFNpemUgcm9pCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JICAgKDYuMy4zLjMuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIGZvdXIgdmVydGljYWwgZWRnZXMgb2YgdGhlIGx1bWEgCi0gKiBtYWNyb2Jsb2NrICgxNngxNikuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgIHNyY2RzdFN0ZXAgLVN0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgcEFscGhhIC1BcnJheSBvZiBzaXplIDIgb2YgYWxwaGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGFscGhhIAotICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIAotICogICAgICAgICAgICBmb3IgdGhlIGludGVybmFsIHZlcnRpY2FsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgCi0gKiAgICAgICAgICAgIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAotICogICBwQmV0YSAtQXJyYXkgb2Ygc2l6ZSAyIG9mIGJldGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGJldGEgCi0gKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCi0gKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGJldGEgdmFsdWVzIAotICogICAgICAgICAgICBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAotICogICBwVGhyZXNob2xkcyAtQXJyYXkgb2Ygc2l6ZSAxNiBvZiBUaHJlc2hvbGRzIChUQzApICh2YWx1ZXMgZm9yIHRoZSBsZWZ0IAotICogICAgICAgICAgICBlZGdlIG9mIGVhY2ggNHg0IGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayBvcmRlcik7IG11c3QgCi0gKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuLiAgUGVyIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgCi0gKiAgICAgICAgICAgIGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAotICogICBwQlMgLUFycmF5IG9mIHNpemUgMTYgb2YgQlMgcGFyYW1ldGVycyAoYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgCi0gKiAgICAgICAgICAgIG9yZGVyKTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgCi0gKiAgICAgICAgICAgIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSA0LiAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCi0gKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAotICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKLSAqICAgIEVpdGhlciBvZiB0aGUgcG9pbnRlcnMgaW4gcFNyY0RzdCwgcEFscGhhLCBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUyAKLSAqICAgICAgICAgICAgICBpcyBOVUxMLiAKLSAqICAgIEVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAotICogICAgcFNyY0RzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICogICAgcEFscGhhWzBdIGFuZC9vciBwQWxwaGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgIE9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjE1XWlzIG91dHNpZGUgb2YgdGhlIAotICogICAgICAgICAgICAgIHJhbmdlIFswLDI1XS4gCi0gKiAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAocEJTW2ldPT00ICYmIAotICogICAgICAgICAgICAgIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kgKAotICAgIE9NWF9VOCAqcFNyY0RzdCwKLSAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCi0gICAgY29uc3QgT01YX1U4ICpwQmV0YSwKLSAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAotICAgIGNvbnN0IE9NWF9VOCAqcEJTCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JICAgKDYuMy4zLjMuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIGZvdXIgaG9yaXpvbnRhbCBlZGdlcyBvZiB0aGUgbHVtYSAKLSAqIG1hY3JvYmxvY2sgKDE2eDE2KS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgc3JjZHN0U3RlcCAtIHN0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgcEFscGhhIC0gYXJyYXkgb2Ygc2l6ZSAyIG9mIGFscGhhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBhbHBoYSAKLSAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyAKLSAqICAgICAgICAgICAgZm9yIHRoZSBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBhbHBoYSAKLSAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAotICogICBwQmV0YSAtIGFycmF5IG9mIHNpemUgMiBvZiBiZXRhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBiZXRhIAotICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gCi0gKiAgICAgICAgICAgIGlzIGZvciB0aGUgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlKS4gUGVyIFtJU08xNDQ5Ni0xMF0gYmV0YSAKLSAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgIHBUaHJlc2hvbGRzIC0gYXJyYXkgb2Ygc2l6ZSAxNiBjb250YWluaW5nIHRocmVzaG9sZHMsIFRDMCwgZm9yIHRoZSB0b3AgCi0gKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSBvZiBlYWNoIDR4NCBibG9jaywgYXJyYW5nZWQgaW4gaG9yaXpvbnRhbCBibG9jayAKLSAqICAgICAgICAgICAgb3JkZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFBlciBbSVNPMTQ0OTYgMTBdIAotICogICAgICAgICAgICB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgcEJTIC0gYXJyYXkgb2Ygc2l6ZSAxNiBvZiBCUyBwYXJhbWV0ZXJzIChhcnJhbmdlZCBpbiBob3Jpem9udGFsIGJsb2NrIAotICogICAgICAgICAgICBvcmRlcik7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIAotICogICAgICAgICAgICBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC1Qb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyLCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCi0gKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAotICogICAgLSAgICBlaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgICAtICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAotICogICAgLSAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgIC0gICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uMTVdIGlzIAotICogICAgICAgICBvdXRzaWRlIG9mIHRoZSByYW5nZSBbMCwyNV0uIAotICogICAgLSAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKLSAqICAgICAgICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kgKAotICAgIE9NWF9VOCAqcFNyY0RzdCwKLSAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCi0gICAgY29uc3QgT01YX1U4ICpwQmV0YSwKLSAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAotICAgIGNvbnN0IE9NWF9VOCAqcEJTCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kgICAoNi4zLjMuMy4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgb24gZm91ciB2ZXJ0aWNhbCBlZGdlcyBvZiB0aGUgY2hyb21hIAotICogbWFjcm9ibG9jayAoOHg4KS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuIAotICogICBzcmNkc3RTdGVwIC0gU3RlcCBvZiB0aGUgYXJyYXlzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIHBBbHBoYSAtIEFycmF5IG9mIHNpemUgMiBvZiBhbHBoYSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyBhbHBoYSAKLSAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIGZvciAKLSAqICAgICAgICAgICAgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyBtdXN0IGJlIAotICogICAgICAgICAgICBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgIHBCZXRhIC0gQXJyYXkgb2Ygc2l6ZSAyIG9mIGJldGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGJldGEgCi0gKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCi0gKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGJldGEgdmFsdWVzIAotICogICAgICAgICAgICBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAotICogICBwVGhyZXNob2xkcyAtIEFycmF5IG9mIHNpemUgOCBjb250YWluaW5nIHRocmVzaG9sZHMsIFRDMCwgZm9yIHRoZSBsZWZ0IAotICogICAgICAgICAgICB2ZXJ0aWNhbCBlZGdlIG9mIGVhY2ggNHgyIGNocm9tYSBibG9jaywgYXJyYW5nZWQgaW4gdmVydGljYWwgCi0gKiAgICAgICAgICAgIGJsb2NrIG9yZGVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgCi0gKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgIHBCUyAtIEFycmF5IG9mIHNpemUgMTYgb2YgQlMgcGFyYW1ldGVycyAodmFsdWVzIGZvciBlYWNoIDJ4MiBjaHJvbWEgCi0gKiAgICAgICAgICAgIGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayBvcmRlcikuIFRoaXMgcGFyYW1ldGVyIGlzIHRoZSAKLSAqICAgICAgICAgICAgc2FtZSBhcyB0aGUgcEJTIHBhcmFtZXRlciBwYXNzZWQgaW50byBGaWx0ZXJEZWJsb2NrTHVtYV9WZXJFZGdlOyAKLSAqICAgICAgICAgICAgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIAotICogICAgICAgICAgICBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgCi0gKiAgICAgICAgICAgIG9ubHkgaWYgcEJTW2leM109PSA0LiAgTXVzdCBiZSA0IGJ5dGUgYWxpZ25lZC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCi0gKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAotICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgIHBUaHJlc2hvbGRzIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAotICogICAgLSAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgIC0gICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uN10gaXMgb3V0c2lkZSAKLSAqICAgICAgICAgb2YgdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKLSAqICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAotICogICAgLSAgICBwQlMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JICgKLSAgICBPTVhfVTggKnBTcmNEc3QsCi0gICAgT01YX1MzMiBzcmNkc3RTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAotICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCi0gICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKLSAgICBjb25zdCBPTVhfVTggKnBCUwotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JICAgKDYuMy4zLjMuNCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIHRoZSBob3Jpem9udGFsIGVkZ2VzIG9mIHRoZSBjaHJvbWEgCi0gKiBtYWNyb2Jsb2NrICg4eDgpLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgIHNyY2RzdFN0ZXAgLSBhcnJheSBzdGVwOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIHBBbHBoYSAtIGFycmF5IG9mIHNpemUgMiBjb250YWluaW5nIGFscGhhIHRocmVzaG9sZHM7IHRoZSBmaXJzdCBlbGVtZW50IAotICogICAgICAgICAgICBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBhbmQgdGhlIAotICogICAgICAgICAgICBzZWNvbmQgZWxlbWVudCBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciBpbnRlcm5hbCBob3Jpem9udGFsIAotICogICAgICAgICAgICBlZGdlLiAgUGVyIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIAotICogICAgICAgICAgICBbMCwyNTVdLiAKLSAqICAgcEJldGEgLSBhcnJheSBvZiBzaXplIDIgY29udGFpbmluZyBiZXRhIHRocmVzaG9sZHM7IHRoZSBmaXJzdCBlbGVtZW50IAotICogICAgICAgICAgICBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBhbmQgdGhlIAotICogICAgICAgICAgICBzZWNvbmQgZWxlbWVudCBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciB0aGUgaW50ZXJuYWwgCi0gKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZS4gIFBlciBbSVNPMTQ0OTYtMTBdIGJldGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIAotICogICAgICAgICAgICByYW5nZSBbMCwxOF0uIAotICogICBwVGhyZXNob2xkcyAtIGFycmF5IG9mIHNpemUgOCBjb250YWluaW5nIHRocmVzaG9sZHMsIFRDMCwgZm9yIHRoZSB0b3AgCi0gKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSBvZiBlYWNoIDJ4NCBjaHJvbWEgYmxvY2ssIGFycmFuZ2VkIGluIGhvcml6b250YWwgCi0gKiAgICAgICAgICAgIGJsb2NrIG9yZGVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgCi0gKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgIHBCUyAtIGFycmF5IG9mIHNpemUgMTYgY29udGFpbmluZyBCUyBwYXJhbWV0ZXJzIGZvciBlYWNoIDJ4MiBjaHJvbWEgCi0gKiAgICAgICAgICAgIGJsb2NrLCBhcnJhbmdlZCBpbiBob3Jpem9udGFsIGJsb2NrIG9yZGVyOyB2YWxpZCBpbiB0aGUgcmFuZ2UgCi0gKiAgICAgICAgICAgIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIAotICogICAgICAgICAgICBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IDQuIAotICogICAgICAgICAgICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtUG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciwgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgYW55IG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmNEc3QsIHBBbHBoYSwgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAotICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgIHBUaHJlc2hvbGRzIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAotICogICAgLSAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgIC0gICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uN10gaXMgb3V0c2lkZSAKLSAqICAgICAgICAgb2YgdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAotICogICAgICAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLgotICogICAgLSAgICBwQlMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JICgKLSAgICBPTVhfVTggKnBTcmNEc3QsCi0gICAgT01YX1MzMiBzcmNkc3RTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAotICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCi0gICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKLSAgICBjb25zdCBPTVhfVTggKnBCUwotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kgICAoNi4zLjMuMy41KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyB0aGUgaG9yaXpvbnRhbCBhbmQgCi0gKiB2ZXJ0aWNhbCBlZGdlcyBvZiBhIGx1bWEgbWFjcm9ibG9jayAoMTZ4MTYpLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAotICogICBzcmNkc3RTdGVwIC0gaW1hZ2Ugd2lkdGg7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIHBBbHBoYSAtIHBvaW50ZXIgdG8gYSAyeDIgdGFibGUgb2YgYWxwaGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIAotICogICAgICAgICAgICBmb2xsb3dzOiB7ZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgCi0gKiAgICAgICAgICAgIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0uICBQZXIgCi0gKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAotICogICBwQmV0YSAtIHBvaW50ZXIgdG8gYSAyeDIgdGFibGUgb2YgYmV0YSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogCi0gKiAgICAgICAgICAgIHtleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbCAKLSAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciBbSVNPMTQ0OTYtMTBdIAotICogICAgICAgICAgICBiZXRhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAotICogICBwVGhyZXNob2xkcyAtIHBvaW50ZXIgdG8gYSAxNngyIHRhYmxlIG9mIHRocmVzaG9sZCAoVEMwKSwgb3JnYW5pemVkIGFzIAotICogICAgICAgICAgICBmb2xsb3dzOiB7dmFsdWVzIGZvciB0aGUgbGVmdCBvciBhYm92ZSBlZGdlIG9mIGVhY2ggNHg0IGJsb2NrLCAKLSAqICAgICAgICAgICAgYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgb3JkZXIgYW5kIHRoZW4gaW4gaG9yaXpvbnRhbCBibG9jayAKLSAqICAgICAgICAgICAgb3JkZXJ9OyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgW0lTTzE0NDk2LTEwXSAKLSAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgIHBCUyAtIHBvaW50ZXIgdG8gYSAxNngyIHRhYmxlIG9mIEJTIHBhcmFtZXRlcnMgYXJyYW5nZWQgaW4gc2NhbiBibG9jayAKLSAqICAgICAgICAgICAgb3JkZXIgZm9yIHZlcnRpY2FsIGVkZ2VzIGFuZCB0aGVuIGhvcml6b250YWwgZWRnZXM7IHZhbGlkIGluIHRoZSAKLSAqICAgICAgICAgICAgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgCi0gKiAgICAgICAgICAgIG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gCi0gKiAgICAgICAgICAgIDQuIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCi0gKiAgICAtICAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCi0gKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzIG9yIHBCUy4gCi0gKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIGVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAotICogICAgLSAgICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQWxwaGFbMC4uM10gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgCi0gKiAgICAgICAgICAgICAgWzAsMjU1XS4gCi0gKiAgICAtICAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBCZXRhWzAuLjNdIGlzIG91dHNpZGUgdGhlIHJhbmdlIAotICogICAgICAgICAgICAgIFswLDE4XS4gCi0gKiAgICAtICAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjMxXWlzIG91dHNpZGUgb2YgCi0gKiAgICAgICAgICAgICAgdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAotICogICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAotICogICAgLSAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kgKAotICAgIE9NWF9VOCAqcFNyY0RzdCwKLSAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCi0gICAgY29uc3QgT01YX1U4ICpwQmV0YSwKLSAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAotICAgIGNvbnN0IE9NWF9VOCAqcEJTCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JICAgKDYuMy4zLjMuNikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2tpbmcgZmlsdGVyaW5nIG9uIGFsbCBlZGdlcyBvZiB0aGUgY2hyb21hIAotICogbWFjcm9ibG9jayAoMTZ4MTYpLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgIHNyY2RzdFN0ZXAgLSBzdGVwIG9mIHRoZSBhcnJheXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgcEFscGhhIC0gcG9pbnRlciB0byBhIDJ4MiBhcnJheSBvZiBhbHBoYSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgCi0gKiAgICAgICAgICAgIGZvbGxvd3M6IHtleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCAKLSAqICAgICAgICAgICAgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciAKLSAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgIHBCZXRhIC0gcG9pbnRlciB0byBhIDJ4MiBhcnJheSBvZiBCZXRhIFRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiAKLSAqICAgICAgICAgICAgeyBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbCAKLSAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciBbSVNPMTQ0OTYtMTBdIAotICogICAgICAgICAgICBiZXRhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAotICogICBwVGhyZXNob2xkcyAtIGFycmF5IG9mIHNpemUgOHgyIG9mIFRocmVzaG9sZHMgKFRDMCkgKHZhbHVlcyBmb3IgdGhlIGxlZnQgCi0gKiAgICAgICAgICAgIG9yIGFib3ZlIGVkZ2Ugb2YgZWFjaCA0eDIgb3IgMng0IGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCAKLSAqICAgICAgICAgICAgYmxvY2sgb3JkZXIgYW5kIHRoZW4gaW4gaG9yaXpvbnRhbCBibG9jayBvcmRlcik7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYSA0LWJ5dGUgYm91bmRhcnkuIFBlciBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IGJlIGluIHRoZSAKLSAqICAgICAgICAgICAgcmFuZ2UgWzAsMjVdLiAKLSAqICAgcEJTIC0gYXJyYXkgb2Ygc2l6ZSAxNngyIG9mIEJTIHBhcmFtZXRlcnMgKGFycmFuZ2VkIGluIHNjYW4gYmxvY2sgb3JkZXIgCi0gKiAgICAgICAgICAgIGZvciB2ZXJ0aWNhbCBlZGdlcyBhbmQgdGhlbiBob3Jpem9udGFsIGVkZ2VzKTsgdmFsaWQgaW4gdGhlIAotICogICAgICAgICAgICByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSAKLSAqICAgICAgICAgICAgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSAKLSAqICAgICAgICAgICAgNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCi0gKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwQWxwaGEsIAotICogICAgICAgICAgICAgIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTLiAKLSAqICAgIC0gICBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgZWl0aGVyIHBUaHJlc2hvbGRzIG9yIHBCUyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBBbHBoYVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKLSAqICAgICAgICAgICAgICBbMCwyNTVdLiAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQmV0YVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKLSAqICAgICAgICAgICAgICBbMCwxOF0uIAotICogICAgLSAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjE1XWlzIG91dHNpZGUgb2YgCi0gKiAgICAgICAgICAgICAgdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgICAtICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgIGZvciBpPj00LCBvciAKLSAqICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAotICogICAgLSAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kgKAotICAgIE9NWF9VOCAqcFNyY0RzdCwKLSAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCi0gICAgY29uc3QgT01YX1U4ICpwQmV0YSwKLSAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAotICAgIGNvbnN0IE9NWF9VOCAqcEJTCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQyAgICg2LjMuNC4xLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBDQVZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSByYXN0ZXIgc2NhbiBmb3IgYSAyeDIgYmxvY2sgb2YgCi0gKiBDaHJvbWFEQ0xldmVsLiAgVGhlIGRlY29kZWQgY29lZmZpY2llbnRzIGluIHRoZSBwYWNrZWQgcG9zaXRpb24tY29lZmZpY2llbnQgCi0gKiBidWZmZXIgYXJlIHN0b3JlZCBpbiByZXZlcnNlIHppZy16YWcgb3JkZXIsIGkuZS4sIHRoZSBmaXJzdCBidWZmZXIgZWxlbWVudCAKLSAqIGNvbnRhaW5zIHRoZSBsYXN0IG5vbi16ZXJvIHBvc3Rpb24tY29lZmZpY2llbnQgcGFpciBvZiB0aGUgYmxvY2suIFdpdGhpbiAKLSAqIGVhY2ggcG9zaXRpb24tY29lZmZpY2llbnQgcGFpciwgdGhlIHBvc2l0aW9uIGVudHJ5IGluZGljYXRlcyB0aGUgCi0gKiByYXN0ZXItc2NhbiBwb3NpdGlvbiBvZiB0aGUgY29lZmZpY2llbnQsIHdoaWxlIHRoZSBjb2VmZmljaWVudCBlbnRyeSAKLSAqIGNvbnRhaW5zIHRoZSBjb2VmZmljaWVudCB2YWx1ZS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBEb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbSBidWZmZXIgCi0gKiAgIHBPZmZzZXQgLSBQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQgCi0gKiAgIHBPZmZzZXQgLSAqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZCAKLSAqICAgcE51bUNvZWZmIC0gUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzIGluIHRoaXMgYmxvY2sgCi0gKiAgIHBwUG9zQ29lZkJ1ZiAtIERvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsIAotICogICAgICAgICAgICBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlci4gIEJ1ZmZlciBwb3NpdGlvbiAKLSAqICAgICAgICAgICAgKCpwcFBvc0NvZWZCdWYpIGlzIHVwZGF0ZWQgdXBvbiByZXR1cm4sIHVubGVzcyB0aGVyZSBhcmUgb25seSAKLSAqICAgICAgICAgICAgemVybyBjb2VmZmljaWVudHMgaW4gdGhlIGN1cnJlbnRseSBkZWNvZGVkIGJsb2NrLiAgSW4gdGhpcyBjYXNlIAotICogICAgICAgICAgICB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGJ5cGFzcyB0aGUgdHJhbnNmb3JtL2RlcXVhbnRpemF0aW9uIG9mIAotICogICAgICAgICAgICB0aGUgZW1wdHkgYmxvY2tzLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBwcEJpdFN0cmVhbSBvciBwT2Zmc2V0IGlzIE5VTEwuIAotICogICAgLSAgICBwcFBvc0NvZWZCdWYgb3IgcE51bUNvZWZmIGlzIE5VTEwuIAotICogICAgT01YX1N0c19FcnIgLSBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYW4gaWxsZWdhbCBjb2RlIGlzIGVuY291bnRlcmVkIGluIHRoZSBiaXRzdHJlYW0gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDICgKLSAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfUzMyKnBPZmZzZXQsCi0gICAgT01YX1U4ICpwTnVtQ29lZmYsCi0gICAgT01YX1U4ICoqcHBQb3NDb2VmYnVmCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMgICAoNi4zLjQuMS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgQ0FWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIDR4NCBibG9jayBvZiAKLSAqIEludHJhMTZ4MTZEQ0xldmVsLCBJbnRyYTE2eDE2QUNMZXZlbCwgTHVtYUxldmVsLCBhbmQgQ2hyb21hQUNMZXZlbC4gSW52ZXJzZSAKLSAqIGZpZWxkIHNjYW4gaXMgbm90IHN1cHBvcnRlZC4gVGhlIGRlY29kZWQgY29lZmZpY2llbnRzIGluIHRoZSBwYWNrZWQgCi0gKiBwb3NpdGlvbi1jb2VmZmljaWVudCBidWZmZXIgYXJlIHN0b3JlZCBpbiByZXZlcnNlIHppZy16YWcgb3JkZXIsIGkuZS4sIHRoZSAKLSAqIGZpcnN0IGJ1ZmZlciBlbGVtZW50IGNvbnRhaW5zIHRoZSBsYXN0IG5vbi16ZXJvIHBvc3Rpb24tY29lZmZpY2llbnQgcGFpciBvZiAKLSAqIHRoZSBibG9jay4gV2l0aGluIGVhY2ggcG9zaXRpb24tY29lZmZpY2llbnQgcGFpciwgdGhlIHBvc2l0aW9uIGVudHJ5IAotICogaW5kaWNhdGVzIHRoZSByYXN0ZXItc2NhbiBwb3NpdGlvbiBvZiB0aGUgY29lZmZpY2llbnQsIHdoaWxlIHRoZSAKLSAqIGNvZWZmaWNpZW50IGVudHJ5IGNvbnRhaW5zIHRoZSBjb2VmZmljaWVudCB2YWx1ZS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLURvdWJsZSBwb2ludGVyIHRvIGN1cnJlbnQgYnl0ZSBpbiBiaXQgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcE9mZnNldCAtIFBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtOyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10uIAotICogICBzTWF4TnVtQ29lZmYgLSBNYXhpbXVtIHRoZSBudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIGluIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIGJsb2NrIAotICogICBzVkxDU2VsZWN0IC0gVkxDIHRhYmxlIHNlbGVjdG9yLCBvYnRhaW5lZCBmcm9tIHRoZSBudW1iZXIgb2Ygbm9uLXplcm8gCi0gKiAgICAgICAgICAgIGNvZWZmaWNpZW50cyBjb250YWluZWQgaW4gdGhlIGFib3ZlIGFuZCBsZWZ0IDR4NCBibG9ja3MuICBJdCBpcyAKLSAqICAgICAgICAgICAgZXF1aXZhbGVudCB0byB0aGUgdmFyaWFibGUgbkMgZGVzY3JpYmVkIGluIEguMjY0IHN0YW5kYXJkIHRhYmxlIAotICogICAgICAgICAgICA5IDUsIGV4Y2VwdCBpdHMgdmFsdWUgY2FuIHQgYmUgbGVzcyB0aGFuIHplcm8uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZC4gIAotICogICAgICAgICAgICBCdWZmZXIgcG9zaXRpb24gKCpwcFBvc0NvZWZCdWYpIGlzIHVwZGF0ZWQgdXBvbiByZXR1cm4sIHVubGVzcyAKLSAqICAgICAgICAgICAgdGhlcmUgYXJlIG9ubHkgemVybyBjb2VmZmljaWVudHMgaW4gdGhlIGN1cnJlbnRseSBkZWNvZGVkIGJsb2NrLiAKLSAqICAgICAgICAgICAgIEluIHRoaXMgY2FzZSB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGJ5cGFzcyB0aGUgCi0gKiAgICAgICAgICAgIHRyYW5zZm9ybS9kZXF1YW50aXphdGlvbiBvZiB0aGUgZW1wdHkgYmxvY2tzLiAKLSAqICAgcE9mZnNldCAtICpwT2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkIAotICogICBwTnVtQ29lZmYgLSBQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMgaW4gdGhpcyBibG9jayAKLSAqICAgcHBQb3NDb2VmQnVmIC0gRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwgCi0gKiAgICAgICAgICAgIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgcHBCaXRTdHJlYW0gb3IgcE9mZnNldCBpcyBOVUxMLiAKLSAqICAgIC0gICAgcHBQb3NDb2VmQnVmIG9yIHBOdW1Db2VmZiBpcyBOVUxMLiAKLSAqICAgIC0gICAgc01heE51bUNvZWZmIGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgMTUgb3IgMTYuIAotICogICAgLSAgICBzVkxDU2VsZWN0IGlzIGxlc3MgdGhhbiAwLiAKLSAqCi0gKiAgICBPTVhfU3RzX0VyciAtIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAotICogICAgLSAgICBhbiBpbGxlZ2FsIGNvZGUgaXMgZW5jb3VudGVyZWQgaW4gdGhlIGJpdHN0cmVhbSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDICgKLSAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfUzMyICpwT2Zmc2V0LAotICAgIE9NWF9VOCAqcE51bUNvZWZmLAotICAgIE9NWF9VOCAqKnBwUG9zQ29lZmJ1ZiwKLSAgICBPTVhfSU5UIHNWTENTZWxlY3QsCi0gICAgT01YX0lOVCBzTWF4TnVtQ29lZmYKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIgICAoNi4zLjQuMi4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUmVjb25zdHJ1Y3RzIHRoZSA0eDQgTHVtYURDIGJsb2NrIGZyb20gdGhlIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgCi0gKiBidWZmZXIsIHBlcmZvcm1zIGludGVnZXIgaW52ZXJzZSwgYW5kIGRlcXVhbnRpemF0aW9uIGZvciA0eDQgTHVtYURDIAotICogY29lZmZpY2llbnRzLCBhbmQgdXBkYXRlcyB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byB0aGUgbmV4dCBub24tZW1wdHkgCi0gKiBibG9jay4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBTcmMgLSBEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKLSAqICAgICAgICAgICAgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nIAotICogICBRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXIgUXBZIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcFNyYyAtICpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jayAKLSAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgNHg0IEx1bWFEQyBjb2VmZmljaWVudHMgYnVmZmVyOyBtdXN0IAotICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBwcFNyYyBvciBwRHN0IGlzIE5VTEwuIAotICogICAgLSAgICBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIFFQIGlzIG5vdCBpbiB0aGUgcmFuZ2Ugb2YgWzAtNTFdLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpciAoCi0gICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCi0gICAgT01YX1MxNiAqcERzdCwKLSAgICBPTVhfSU5UIFFQCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIgICAoNi4zLjQuMi4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUmVjb25zdHJ1Y3QgdGhlIDJ4MiBDaHJvbWFEQyBibG9jayBmcm9tIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyLCAKLSAqIHBlcmZvcm0gaW50ZWdlciBpbnZlcnNlIHRyYW5zZm9ybWF0aW9uLCBhbmQgZGVxdWFudGl6YXRpb24gZm9yIDJ4MiBjaHJvbWEgCi0gKiBEQyBjb2VmZmljaWVudHMsIGFuZCB1cGRhdGUgdGhlIHBhaXIgYnVmZmVyIHBvaW50ZXIgdG8gbmV4dCBub24tZW1wdHkgCi0gKiBibG9jay4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBTcmMgLSBEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKLSAqICAgICAgICAgICAgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nIAotICogICBRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXIgUXBDIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcFNyYyAtICpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jayAKLSAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgMngyIENocm9tYURDIGNvZWZmaWNpZW50cyBidWZmZXI7IAotICogICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIHBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCi0gKiAgICAtICAgIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgUVAgaXMgbm90IGluIHRoZSByYW5nZSBvZiBbMC01MV0uIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIgKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAotICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgT01YX0lOVCBRUAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkICAgKDYuMy40LjIuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFJlY29uc3RydWN0IHRoZSA0eDQgcmVzaWR1YWwgYmxvY2sgZnJvbSBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciwgCi0gKiBwZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnRlZ2VyIGludmVyc2UgdHJhbnNmb3JtYXRpb24gZm9yIDR4NCBibG9jayBvZiAKLSAqIHJlc2lkdWFscyB3aXRoIHByZXZpb3VzIGludHJhIHByZWRpY3Rpb24gb3IgbW90aW9uIGNvbXBlbnNhdGlvbiBkYXRhLCBhbmQgCi0gKiB1cGRhdGUgdGhlIHBhaXIgYnVmZmVyIHBvaW50ZXIgdG8gbmV4dCBub24tZW1wdHkgYmxvY2suIElmIHBEQyA9PSBOVUxMLCAKLSAqIHRoZXJlIHJlIDE2IG5vbi16ZXJvIEFDIGNvZWZmaWNpZW50cyBhdCBtb3N0IGluIHRoZSBwYWNrZWQgYnVmZmVyIHN0YXJ0aW5nIAotICogZnJvbSA0eDQgYmxvY2sgcG9zaXRpb24gMDsgSWYgcERDICE9IE5VTEwsIHRoZXJlIHJlIDE1IG5vbi16ZXJvIEFDIAotICogY29lZmZpY2llbnRzIGF0IG1vc3QgaW4gdGhlIHBhY2tldCBidWZmZXIgc3RhcnRpbmcgZnJvbSA0eDQgYmxvY2sgcG9zaXRpb24gCi0gKiAxLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcFNyYyAtIERvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyIAotICogICAgICAgICAgICBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcgCi0gKiAgIHBQcmVkIC0gUG9pbnRlciB0byB0aGUgcHJlZGljdGVkIDR4NCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeSAKLSAqICAgcHJlZFN0ZXAgLSBQcmVkaWN0ZWQgZnJhbWUgc3RlcCBzaXplIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgZHN0U3RlcCAtIERlc3RpbmF0aW9uIGZyYW1lIHN0ZXAgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IAotICogICBwREMgLSBQb2ludGVyIHRvIHRoZSBEQyBjb2VmZmljaWVudCBvZiB0aGlzIGJsb2NrLCBOVUxMIGlmIGl0IGRvZXNuJ3QgCi0gKiAgICAgICAgICAgIGV4aXN0IAotICogICBRUCAtIFFQIFF1YW50aXphdGlvbiBwYXJhbWV0ZXIuICBJdCBzaG91bGQgYmUgUXBDIGluIGNocm9tYSA0eDQgYmxvY2sgCi0gKiAgICAgICAgICAgIGRlY29kaW5nLCBvdGhlcndpc2UgaXQgc2hvdWxkIGJlIFFwWS4gCi0gKiAgIEFDIC0gRmxhZyBpbmRpY2F0aW5nIGlmIGF0IGxlYXN0IG9uZSBub24temVybyBBQyBjb2VmZmljaWVudCBleGlzdHMgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIDR4NCBibG9jayBkYXRhOyBtdXN0IGJlIGFsaWduZWQgb24gYSAKLSAqICAgICAgICAgICAgNC1ieXRlIGJvdW5kYXJ5IAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIHBQcmVkIG9yIHBEc3QgaXMgTlVMTC4gCi0gKiAgICAtICAgIHBQcmVkIG9yIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgcHJlZFN0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgIC0gICAgQUMgIT0wIGFuZCBRcCBpcyBub3QgaW4gdGhlIHJhbmdlIG9mIFswLTUxXSBvciBwcFNyYyA9PSBOVUxMLiAKLSAqICAgIC0gICAgQUMgPT0wICYmIHBEQyA9PU5VTEwuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQgKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAotICAgIGNvbnN0IE9NWF9VOCAqcFByZWQsCi0gICAgY29uc3QgT01YX1MxNiAqcERDLAotICAgIE9NWF9VOCAqcERzdCwKLSAgICBPTVhfSU5UIHByZWRTdGVwLAotICAgIE9NWF9JTlQgZHN0U3RlcCwKLSAgICBPTVhfSU5UIFFQLAotICAgIE9NWF9JTlQgQUMKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9NRUdldEJ1ZlNpemUgICAoNi4zLjUuMS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29tcHV0ZXMgdGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgdmVuZG9yLXNwZWNpZmljIHNwZWNpZmljYXRpb24gCi0gKiBzdHJ1Y3R1cmUgZm9yIHRoZSBvbXhWQ000UDEwIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9ucyBCbG9ja01hdGNoX0ludGVnZXIgCi0gKiBhbmQgTW90aW9uRXN0aW1hdGlvbk1CLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBNRW1vZGUgLSBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlOyBhdmFpbGFibGUgbW9kZXMgYXJlIGRlZmluZWQgYnkgdGhlIAotICogICAgICAgICAgICBlbnVtZXJhdGVkIHR5cGUgT01YVkNNNFAxME1FTW9kZSAKLSAqICAgcE1FUGFyYW1zIC1tb3Rpb24gZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU2l6ZSAtIHBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIG1vdGlvbiAKLSAqICAgICAgICAgICAgZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBwTUVQYXJhbXMgb3IgcFNpemUgaXMgTlVMTC4gCi0gKiAgICAtICAgIGFuIGludmFsaWQgTUVNb2RlIGlzIHNwZWNpZmllZC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9NRUdldEJ1ZlNpemUgKAotICAgIE9NWFZDTTRQMTBNRU1vZGUgTUVtb2RlLAotICAgIGNvbnN0IE9NWFZDTTRQMTBNRVBhcmFtcyAqcE1FUGFyYW1zLAotICAgIE9NWF9VMzIgKnBTaXplCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfTUVJbml0ICAgKDYuMy41LjEuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEluaXRpYWxpemVzIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgcmVxdWlyZWQgZm9yIHRoZSAKLSAqIG9teFZDTTRQMTAgbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zOiAgQmxvY2tNYXRjaF9JbnRlZ2VyIGFuZCAKLSAqIE1vdGlvbkVzdGltYXRpb25NQi4gTWVtb3J5IGZvciB0aGUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgKnBNRVNwZWMgbXVzdCBiZSAKLSAqIGFsbG9jYXRlZCBwcmlvciB0byBjYWxsaW5nIHRoZSBmdW5jdGlvbiwgYW5kIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAotICogYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgY2FuIAotICogYmUgZGV0ZXJtaW5lZCB1c2luZyB0aGUgZnVuY3Rpb24gb214VkNNNFAxMF9NRUdldEJ1ZlNpemUuIEZvbGxvd2luZyAKLSAqIGluaXRpYWxpemF0aW9uIGJ5IHRoaXMgZnVuY3Rpb24sIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3RydWN0dXJlICpwTUVTcGVjIAotICogc2hvdWxkIGNvbnRhaW4gYW4gaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgcmVwcmVzZW50YXRpb24gb2YgYWxsIG1vdGlvbiAKLSAqIGVzdGltYXRpb24gcGFyYW1ldGVycyByZWNlaXZlZCB2aWEgdGhlIHN0cnVjdHVyZSBwTUVQYXJhbXMsIGZvciBleGFtcGxlICAKLSAqIHNlYXJjaFJhbmdlMTZ4MTYsIHNlYXJjaFJhbmdlOHg4LCBldGMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCi0gKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDEwTUVNb2RlIAotICogICBwTUVQYXJhbXMgLSBtb3Rpb24gZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIAotICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgdW5pbml0aWFsaXplZCBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIGluaXRpYWxpemVkIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIHBNRVBhcmFtcyBvciBwU2l6ZSBpcyBOVUxMLiAKLSAqICAgIC0gICAgYW4gaW52YWxpZCB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgcGFyYW1ldGVyIE1FbW9kZSAKLSAqICAgIC0gICAgYSBuZWdhdGl2ZSBvciB6ZXJvIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIG9uZSBvZiB0aGUgc2VhcmNoIHJhbmdlcyAKLSAqICAgICAgICAgKGUuZy4sICBwTUJQYXJhbXMgPnNlYXJjaFJhbmdlOHg4LCBwTUVQYXJhbXMtPnNlYXJjaFJhbmdlMTZ4MTYsIGV0Yy4pIAotICogICAgLSAgICBlaXRoZXIgaW4gaXNvbGF0aW9uIG9yIGluIGNvbWJpbmF0aW9uLCBvbmUgb3IgbW9yZSBvZiB0aGUgZW5hYmxlcyBvciAKLSAqICAgICAgICAgc2VhcmNoIHJhbmdlcyBpbiB0aGUgc3RydWN0dXJlICpwTUVQYXJhbXMgd2VyZSBjb25maWd1cmVkIHN1Y2ggCi0gKiAgICAgICAgIHRoYXQgdGhlIHJlcXVlc3RlZCBiZWhhdmlvciBmYWlscyB0byBjb21wbHkgd2l0aCBbSVNPMTQ0OTYtMTBdLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX01FSW5pdCAoCi0gICAgT01YVkNNNFAxME1FTW9kZSBNRW1vZGUsCi0gICAgY29uc3QgT01YVkNNNFAxME1FUGFyYW1zICpwTUVQYXJhbXMsCi0gICAgdm9pZCAqcE1FU3BlYwotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciAgICg2LjMuNS4yLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBpbnRlZ2VyIGJsb2NrIG1hdGNoLiAgUmV0dXJucyBiZXN0IE1WIGFuZCBhc3NvY2lhdGVkIGNvc3QuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNPcmdZIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjdXJyZW50IGJsb2NrOgotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgcFNyY1JlZlkgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgYmxvY2sgaW4gdGhlIAotICogICAgICAgICAgICByZWZlcmVuY2UgcGljdHVyZTogCi0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIG5TcmNPcmdTdGVwIC0gU3RyaWRlIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lLCBleHByZXNzZWQgaW4gdGVybXMgCi0gKiAgICAgICAgICAgIG9mIGludGVnZXIgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgaUJsb2NrV2lkdGguIAotICogICBuU3JjUmVmU3RlcCAtIFN0cmlkZSBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUsIGV4cHJlc3NlZCBpbiB0ZXJtcyAKLSAqICAgICAgICAgICAgb2YgaW50ZWdlciBwaXhlbHMgCi0gKiAgIHBSZWZSZWN0IC0gcG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHJlY3RhbmdsZSBpbnNpZGUgdGhlIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgcGljdHVyZSBwbGFuZSAKLSAqICAgbkN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lIAotICogICBpQmxvY2tXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrLCBleHByZXNzZWQgaW4gdGVybXMgb2YgaW50ZWdlciAKLSAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKiAgIGlCbG9ja0hlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jaywgZXhwcmVzc2VkIGluIHRlcm1zIG9mIAotICogICAgICAgICAgICBpbnRlZ2VyIHBpeGVsczsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICogICBuTGFtZGEgLSBMYW1kYSBmYWN0b3I7IHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCAKLSAqICAgcE1WUHJlZCAtIFByZWRpY3RlZCBNVjsgdXNlZCB0byBjb21wdXRlIG1vdGlvbiBjb3N0LCBleHByZXNzZWQgaW4gdGVybXMgCi0gKiAgICAgICAgICAgIG9mIDEvNC1wZWwgdW5pdHMgCi0gKiAgIHBNVkNhbmRpZGF0ZSAtIENhbmRpZGF0ZSBNVjsgdXNlZCB0byBpbml0aWFsaXplIHRoZSBtb3Rpb24gc2VhcmNoLCAKLSAqICAgICAgICAgICAgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWxzIAotICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RCZXN0TVYgLSBCZXN0IE1WIHJlc3VsdGluZyBmcm9tIGludGVnZXIgc2VhcmNoLCBleHByZXNzZWQgaW4gdGVybXMgCi0gKiAgICAgICAgICAgIG9mIDEvNC1wZWwgdW5pdHMgCi0gKiAgIHBCZXN0Q29zdCAtIE1vdGlvbiBjb3N0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYmVzdCBNVjsgY29tcHV0ZWQgYXMgCi0gKiAgICAgICAgICAgIFNBRCtMYW1kYSpCaXRzVXNlZEJ5TVYgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgYW55IG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgYXJlIE5VTEw6Ci0gKiAgICAgICAgIHBTcmNPcmdZLCBwU3JjUmVmWSwgcFJlZlJlY3QsIHBNVlByZWQsIHBNVkNhbmRpZGF0ZSwgb3IgcE1FU3BlYy4gCi0gKiAgICAtICAgIEVpdGhlciBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKLSAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNPcmdZLAotICAgIE9NWF9TMzIgblNyY09yZ1N0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmWSwKLSAgICBPTVhfUzMyIG5TcmNSZWZTdGVwLAotICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCi0gICAgT01YX1U4IGlCbG9ja1dpZHRoLAotICAgIE9NWF9VOCBpQmxvY2tIZWlnaHQsCi0gICAgT01YX1UzMiBuTGFtZGEsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVlByZWQsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVkNhbmRpZGF0ZSwKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcEJlc3RNViwKLSAgICBPTVhfUzMyICpwQmVzdENvc3QsCi0gICAgdm9pZCAqcE1FU3BlYwotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiAgICg2LjMuNS4yLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhIGhhbGYtcGVsIGJsb2NrIG1hdGNoIHVzaW5nIHJlc3VsdHMgZnJvbSBhIHByaW9yIGludGVnZXIgc2VhcmNoLiAKLSAqICBSZXR1cm5zIHRoZSBiZXN0IE1WIGFuZCBhc3NvY2lhdGVkIGNvc3QuICBUaGlzIGZ1bmN0aW9uIGVzdGltYXRlcyB0aGUgCi0gKiBoYWxmLXBpeGVsIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaW50ZWdlciByZXNvbHV0aW9uIG1vdGlvbiAKLSAqIHZlY3RvciByZWZlcmVuY2VkIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdEJlc3RNViwgaS5lLiwgdGhlIGluaXRpYWwgCi0gKiBpbnRlZ2VyIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGZ1bmN0aW9uIAotICogb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIgbWF5IGJlIHVzZWQgZm9yIGludGVnZXIgbW90aW9uIGVzdGltYXRpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNPcmdZIC0gUG9pbnRlciB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lOgotICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgcFNyY1JlZlkgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgYmxvY2sgaW4gdGhlIAotICogICAgICAgICAgICByZWZlcmVuY2UgcGljdHVyZTogIAotICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAotICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAotICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBuU3JjT3JnU3RlcCAtIFN0cmlkZSBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiBpQmxvY2tXaWR0aC4gCi0gKiAgIG5TcmNSZWZTdGVwIC0gU3RyaWRlIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHMgCi0gKiAgIGlCbG9ja1dpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGVybXMgb2YgZnVsbCBwaXhlbHM7IG11c3QgCi0gKiAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKiAgIGlCbG9ja0hlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKLSAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqICAgbkxhbWRhIC0gTGFtZGEgZmFjdG9yLCB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QgCi0gKiAgIHBNVlByZWQgLSBQcmVkaWN0ZWQgTVYsIHJlcHJlc2VudGVkIGluIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHM7IHVzZWQgdG8gCi0gKiAgICAgICAgICAgIGNvbXB1dGUgbW90aW9uIGNvc3QgCi0gKiAgIHBTcmNEc3RCZXN0TVYgLSBUaGUgYmVzdCBNViByZXN1bHRpbmcgZnJvbSBhIHByaW9yIGludGVnZXIgc2VhcmNoLCAKLSAqICAgICAgICAgICAgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0cyAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdEJlc3RNViAtIEJlc3QgTVYgcmVzdWx0aW5nIGZyb20gdGhlIGhhbGYtcGVsIHNlYXJjaCwgZXhwcmVzc2VkIGluIAotICogICAgICAgICAgICB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzIAotICogICBwQmVzdENvc3QgLSBNb3Rpb24gY29zdCBhc3NvY2lhdGVkIHdpdGggdGhlIGJlc3QgTVY7IGNvbXB1dGVkIGFzIAotICogICAgICAgICAgICBTQUQrTGFtZGEqQml0c1VzZWRCeU1WIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIGFueSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNPcmdZLCBwU3JjUmVmWSwgCi0gKiAgICAgICAgICAgICAgcFNyY0RzdEJlc3RNViwgcE1WUHJlZCwgcEJlc3RDb3N0IAotICogICAgLSAgICBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIGVxdWFsIHRvIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKLSAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNPcmdZLAotICAgIE9NWF9TMzIgblNyY09yZ1N0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmWSwKLSAgICBPTVhfUzMyIG5TcmNSZWZTdGVwLAotICAgIE9NWF9VOCBpQmxvY2tXaWR0aCwKLSAgICBPTVhfVTggaUJsb2NrSGVpZ2h0LAotICAgIE9NWF9VMzIgbkxhbWRhLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZQcmVkLAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0QmVzdE1WLAotICAgIE9NWF9TMzIgKnBCZXN0Q29zdAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlciAgICg2LjMuNS4yLjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhIHF1YXJ0ZXItcGVsIGJsb2NrIG1hdGNoIHVzaW5nIHJlc3VsdHMgZnJvbSBhIHByaW9yIGhhbGYtcGVsIAotICogc2VhcmNoLiAgUmV0dXJucyB0aGUgYmVzdCBNViBhbmQgYXNzb2NpYXRlZCBjb3N0LiAgVGhpcyBmdW5jdGlvbiBlc3RpbWF0ZXMgCi0gKiB0aGUgcXVhcnRlci1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGhhbGYtcGVsIHJlc29sdXRpb24gCi0gKiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0QmVzdE1WLCBpLmUuLCB0aGUgCi0gKiBpbml0aWFsIGhhbGYtcGVsIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGZ1bmN0aW9uIAotICogb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYgbWF5IGJlIHVzZWQgZm9yIGhhbGYtcGVsIG1vdGlvbiBlc3RpbWF0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjT3JnWSAtIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gb3JpZ2luYWwgcGljdHVyZSBwbGFuZToKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIHBTcmNSZWZZIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIGJsb2NrIGluIHRoZSAKLSAqICAgICAgICAgICAgcmVmZXJlbmNlIHBpY3R1cmU6Ci0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIG5TcmNPcmdTdGVwIC0gU3RyaWRlIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGlCbG9ja1dpZHRoLiAKLSAqICAgblNyY1JlZlN0ZXAgLSBTdHJpZGUgb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVscyAKLSAqICAgaUJsb2NrV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKLSAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqICAgaUJsb2NrSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRlcm1zIG9mIGZ1bGwgcGl4ZWxzOyBtdXN0IAotICogICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICogICBuTGFtZGEgLSBMYW1kYSBmYWN0b3IsIHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCAKLSAqICAgcE1WUHJlZCAtIFByZWRpY3RlZCBNViwgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0czsgdXNlZCB0byAKLSAqICAgICAgICAgICAgY29tcHV0ZSBtb3Rpb24gY29zdCAKLSAqICAgcFNyY0RzdEJlc3RNViAtIFRoZSBiZXN0IE1WIHJlc3VsdGluZyBmcm9tIGEgcHJpb3IgaGFsZi1wZWwgc2VhcmNoLCAKLSAqICAgICAgICAgICAgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80IHBlbCB1bml0cyAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdEJlc3RNViAtIEJlc3QgTVYgcmVzdWx0aW5nIGZyb20gdGhlIHF1YXJ0ZXItcGVsIHNlYXJjaCwgZXhwcmVzc2VkIAotICogICAgICAgICAgICBpbiB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzIAotICogICBwQmVzdENvc3QgLSBNb3Rpb24gY29zdCBhc3NvY2lhdGVkIHdpdGggdGhlIGJlc3QgTVY7IGNvbXB1dGVkIGFzIAotICogICAgICAgICAgICBTQUQrTGFtZGEqQml0c1VzZWRCeU1WIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmNPcmdZLCBwU3JjUmVmWSwgcFNyY0RzdEJlc3RNViwgcE1WUHJlZCwgcEJlc3RDb3N0IAotICogICAgLSAgICBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIGVxdWFsIHRvIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKLSAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNPcmdZLAotICAgIE9NWF9TMzIgblNyY09yZ1N0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmWSwKLSAgICBPTVhfUzMyIG5TcmNSZWZTdGVwLAotICAgIE9NWF9VOCBpQmxvY2tXaWR0aCwKLSAgICBPTVhfVTggaUJsb2NrSGVpZ2h0LAotICAgIE9NWF9VMzIgbkxhbWRhLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZQcmVkLAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0QmVzdE1WLAotICAgIE9NWF9TMzIgKnBCZXN0Q29zdAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiAgICg2LjMuNS4zLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBNQi1sZXZlbCBtb3Rpb24gZXN0aW1hdGlvbiBhbmQgc2VsZWN0cyBiZXN0IG1vdGlvbiBlc3RpbWF0aW9uIAotICogc3RyYXRlZ3kgZnJvbSB0aGUgc2V0IG9mIG1vZGVzIHN1cHBvcnRlZCBpbiBiYXNlbGluZSBwcm9maWxlIFtJU08xNDQ5Ni0xMF0uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNDdXJyQnVmIC0gUG9pbnRlciB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lOyAKLSAqICAgICAgICAgICAgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCi0gKiAgIHBTcmNSZWZCdWZMaXN0IC0gUG9pbnRlciB0byBhbiBhcnJheSB3aXRoIDE2IGVudHJpZXMuICBFYWNoIGVudHJ5IHBvaW50cyAKLSAqICAgICAgICAgICAgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBNQiBpbiBhIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgcGljdHVyZS4gIFRoZSBhcnJheSBpcyBmaWxsZWQgZnJvbSBsb3ctdG8taGlnaCB3aXRoIHZhbGlkIAotICogICAgICAgICAgICByZWZlcmVuY2UgZnJhbWUgcG9pbnRlcnM7IHRoZSB1bnVzZWQgaGlnaCBlbnRyaWVzIHNob3VsZCBiZSBzZXQgCi0gKiAgICAgICAgICAgIHRvIE5VTEwuICBPcmRlcmluZyBvZiB0aGUgcmVmZXJlbmNlIGZyYW1lcyBzaG91bGQgZm9sbG93IAotICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIHN1YmNsYXVzZSA4LjIuNCAgRGVjb2RpbmcgUHJvY2VzcyBmb3IgUmVmZXJlbmNlIAotICogICAgICAgICAgICBQaWN0dXJlIExpc3RzLiAgIFRoZSBlbnRyaWVzIG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgcFNyY1JlY0J1ZiAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBNQiBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJlY29uc3RydWN0ZWQgcGljdHVyZTsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAotICogICBTcmNDdXJyU3RlcCAtIFdpZHRoIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgU3JjUmVmU3RlcCAtIFdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIFNyY1JlY1N0ZXAgLSBXaWR0aCBvZiB0aGUgcmVjb25zdHJ1Y3RlZCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgcFJlZlJlY3QgLSBQb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcmVjdGFuZ2xlOyByZWxhdGl2ZSB0byB0aGUgCi0gKiAgICAgICAgICAgIGltYWdlIG9yaWdpbi4gCi0gKiAgIHBDdXJyUG9pbnRQb3MgLSBQb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lLiAKLSAqICAgTGFtYmRhIC0gTGFncmFuZ2UgZmFjdG9yIGZvciBjb21wdXRpbmcgdGhlIGNvc3QgZnVuY3Rpb24gCi0gKiAgIHBNRVNwZWMgLSBQb2ludGVyIHRvIHRoZSBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgbXVzdCAKLSAqICAgICAgICAgICAgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgcHJpb3IgdG8gY2FsbGluZyB0aGlzIAotICogICAgICAgICAgICBmdW5jdGlvbi4gCi0gKiAgIHBNQkludGVyIC0gQXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggZm91ciBhZGphY2VudCB0eXBlIElOVEVSIE1CcyAoTGVmdCwgVG9wLCAKLSAqICAgICAgICAgICAgVG9wLUxlZnQsIFRvcC1SaWdodCkuIEFueSBwb2ludGVyIGluIHRoZSBhcnJheSBtYXkgYmUgc2V0IGVxdWFsIAotICogICAgICAgICAgICB0byBOVUxMIGlmIHRoZSBjb3JyZXNwb25kaW5nIE1CIGRvZXNuIHQgZXhpc3Qgb3IgaXMgbm90IG9mIHR5cGUgCi0gKiAgICAgICAgICAgIElOVEVSLiAKLSAqICAgICAgICAgICAgLSAgcE1CSW50ZXJbMF0gLSBQb2ludGVyIHRvIGxlZnQgTUIgaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIC0gIHBNQkludGVyWzFdIC0gUG9pbnRlciB0byB0b3AgTUIgaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIC0gIHBNQkludGVyWzJdIC0gUG9pbnRlciB0byB0b3AtbGVmdCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgLSAgcE1CSW50ZXJbM10gLSBQb2ludGVyIHRvIHRvcC1yaWdodCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgcE1CSW50cmEgLSBBcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBmb3VyIGFkamFjZW50IHR5cGUgSU5UUkEgTUJzIChMZWZ0LCBUb3AsIAotICogICAgICAgICAgICBUb3AtTGVmdCwgVG9wLVJpZ2h0KS4gQW55IHBvaW50ZXIgaW4gdGhlIGFycmF5IG1heSBiZSBzZXQgZXF1YWwgCi0gKiAgICAgICAgICAgIHRvIE5VTEwgaWYgdGhlIGNvcnJlc3BvbmRpbmcgTUIgZG9lc24gdCBleGlzdCBvciBpcyBub3Qgb2YgdHlwZSAKLSAqICAgICAgICAgICAgSU5UUkEuIAotICogICAgICAgICAgICAtICBwTUJJbnRyYVswXSAtIFBvaW50ZXIgdG8gbGVmdCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgLSAgcE1CSW50cmFbMV0gLSBQb2ludGVyIHRvIHRvcCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgLSAgcE1CSW50cmFbMl0gLSBQb2ludGVyIHRvIHRvcC1sZWZ0IE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICAtICBwTUJJbnRyYVszXSAtIFBvaW50ZXIgdG8gdG9wLXJpZ2h0IE1CIGluZm9ybWF0aW9uIAotICogICBwU3JjRHN0TUJDdXJyIC0gUG9pbnRlciB0byBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IE1CLiAgCi0gKiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZW50cmllcyBzaG91bGQgYmUgc2V0IHByaW9yIHRvIGNhbGxpbmcgdGhlIAotICogICAgICAgICAgICBmdW5jdGlvbjogIHNsaWNlSUQgLSB0aGUgbnVtYmVyIG9mIHRoZSBzbGljZSB0aGUgdG8gd2hpY2ggdGhlIAotICogICAgICAgICAgICBjdXJyZW50IE1CIGJlbG9uZ3MuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0Q29zdCAtIFBvaW50ZXIgdG8gdGhlIG1pbmltdW0gbW90aW9uIGNvc3QgZm9yIHRoZSBjdXJyZW50IE1CLiAKLSAqICAgcERzdEJsb2NrU0FEIC0gUG9pbnRlciB0byB0aGUgYXJyYXkgb2YgU0FEcyBmb3IgZWFjaCBvZiB0aGUgc2l4dGVlbiBsdW1hIAotICogICAgICAgICAgICA0eDQgYmxvY2tzIGluIGVhY2ggTUIuICBUaGUgYmxvY2sgU0FEcyBhcmUgaW4gc2NhbiBvcmRlciBmb3IgCi0gKiAgICAgICAgICAgIGVhY2ggTUIuICBGb3IgaW1wbGVtZW50YXRpb25zIHRoYXQgY2Fubm90IGNvbXB1dGUgdGhlIFNBRCB2YWx1ZXMgCi0gKiAgICAgICAgICAgIGluZGl2aWR1YWxseSwgdGhlIG1heGltdW0gcG9zc2libGUgdmFsdWUgKDB4ZmZmZikgaXMgcmV0dXJuZWQgCi0gKiAgICAgICAgICAgIGZvciBlYWNoIG9mIHRoZSAxNiBibG9jayBTQUQgZW50cmllcy4gCi0gKiAgIHBTcmNEc3RNQkN1cnIgLSBQb2ludGVyIHRvIHVwZGF0ZWQgaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgTUIgYWZ0ZXIgTUItbGV2ZWwgbW90aW9uIGVzdGltYXRpb24gaGFzIGJlZW4gY29tcGxldGVkLiAgVGhlIAotICogICAgICAgICAgICBmb2xsb3dpbmcgZmllbGRzIGFyZSB1cGRhdGVkIGJ5IHRoZSBNRSBmdW5jdGlvbi4gICBUaGUgZm9sbG93aW5nIAotICogICAgICAgICAgICBwYXJhbWV0ZXIgc2V0IHF1YW50aWZpZXMgdGhlIE1CLWxldmVsIE1FIHNlYXJjaCByZXN1bHRzOiAKLSAqICAgICAgICAgICAgLSAgTWJUeXBlIAotICogICAgICAgICAgICAtICBzdWJNQlR5cGVbNF0gCi0gKiAgICAgICAgICAgIC0gIHBNVjBbNF1bNF0gCi0gKiAgICAgICAgICAgIC0gIHBNVlByZWRbNF1bNF0gCi0gKiAgICAgICAgICAgIC0gIHBSZWZMMElkeFs0XSAKLSAqICAgICAgICAgICAgLSAgSW50cmExNngxNlByZWRNb2RlIAotICogICAgICAgICAgICAtICBwSW50cmE0eDRQcmVkTW9kZVs0XVs0XSAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0N1cnJCdWYsIAotICogICAgICAgICAgIHBTcmNSZWZCdWZMaXN0LCBwU3JjUmVjQnVmLCBwUmVmUmVjdCwgcEN1cnJQb2ludFBvcywgcE1FU3BlYywgCi0gKiAgICAgICAgICAgcE1CSW50ZXIsIHBNQkludHJhLHBTcmNEc3RNQkN1cnIsIHBEc3RDb3N0LCBwU3JjUmVmQnVmTGlzdFswXSAKLSAqICAgIC0gICAgU3JjUmVmU3RlcCwgU3JjUmVjU3RlcCBhcmUgbm90IG11bHRpcGxlcyBvZiAxNiAKLSAqICAgIC0gICAgaUJsb2NrV2lkdGggb3IgaUJsb2NrSGVpZ2h0IGFyZSB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNi4gCi0gKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKLSAgICBPTVhfUzMyIFNyY0N1cnJTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1Zkxpc3RbMTVdLAotICAgIE9NWF9TMzIgU3JjUmVmU3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWNCdWYsCi0gICAgT01YX1MzMiBTcmNSZWNTdGVwLAotICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCi0gICAgT01YX1UzMiBMYW1iZGEsCi0gICAgdm9pZCAqcE1FU3BlYywKLSAgICBjb25zdCBPTVhWQ000UDEwTUJJbmZvUHRyICpwTUJJbnRlciwKLSAgICBjb25zdCBPTVhWQ000UDEwTUJJbmZvUHRyICpwTUJJbnRyYSwKLSAgICBPTVhWQ000UDEwTUJJbmZvUHRyIHBTcmNEc3RNQkN1cnIsCi0gICAgT01YX0lOVCAqcERzdENvc3QsCi0gICAgT01YX1UxNiAqcERzdEJsb2NrU0FECi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FEXzR4ICAgKDYuMy41LjQuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGZvciA0eDggYW5kIDR4NCBibG9ja3MuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNPcmcgLVBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgaVN0ZXBPcmcgLVN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAotICogICBwU3JjUmVmIC1Qb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgCi0gKiAgIGlTdGVwUmVmIC1TdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyIAotICogICBpSGVpZ2h0IC1IZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0U0FEIC1Qb2ludGVyIG9mIHJlc3VsdCBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyY09yZywgcFNyY1JlZiwgb3IgcERzdFNBRCAKLSAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOC4gCi0gKiAgICAtICAgIGlTdGVwT3JnIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1NBRF80eCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAotICAgIE9NWF9VMzIgaVN0ZXBPcmcsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAotICAgIE9NWF9VMzIgaVN0ZXBSZWYsCi0gICAgT01YX1MzMiAqcERzdFNBRCwKLSAgICBPTVhfVTMyIGlIZWlnaHQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQURRdWFyXzR4ICAgKDYuMy41LjQuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGJldHdlZW4gb25lIGJsb2NrIChwU3JjKSBhbmQgdGhlIGF2ZXJhZ2UgCi0gKiBvZiB0aGUgb3RoZXIgdHdvIChwU3JjUmVmMCBhbmQgcFNyY1JlZjEpIGZvciA0eDggb3IgNHg0IGJsb2Nrcy4gIFJvdW5kaW5nIAotICogaXMgYXBwbGllZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnZlbnRpb24gKGErYisxKT4+MS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgcFNyY1JlZjAgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAwIAotICogICBwU3JjUmVmMSAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIGlSZWZTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIGlSZWZTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0U0FEIC0gUG9pbnRlciBvZiByZXN1bHQgU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAotICogICAgLSAgICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYwLCAKLSAqICAgICAgICAgICAgICBwU3JjUmVmMSwgcERzdFNBRC4gCi0gKiAgICAtICAgIGlTcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1NBRFF1YXJfNHggKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjEsCi0gICAgT01YX1UzMiBpU3JjU3RlcCwKLSAgICBPTVhfVTMyIGlSZWZTdGVwMCwKLSAgICBPTVhfVTMyIGlSZWZTdGVwMSwKLSAgICBPTVhfVTMyICpwRHN0U0FELAotICAgIE9NWF9VMzIgaUhlaWdodAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBRFF1YXJfOHggICAoNi4zLjUuNC4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgYmV0d2VlbiBvbmUgYmxvY2sgKHBTcmMpIGFuZCB0aGUgYXZlcmFnZSAKLSAqIG9mIHRoZSBvdGhlciB0d28gKHBTcmNSZWYwIGFuZCBwU3JjUmVmMSkgZm9yIDh4MTYsIDh4OCwgb3IgOHg0IGJsb2Nrcy4gIAotICogUm91bmRpbmcgaXMgYXBwbGllZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnZlbnRpb24gKGErYisxKT4+MS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIHBTcmNSZWYwIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgcFNyY1JlZjEgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBpUmVmU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogICBpUmVmU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9jazsgbXVzdCBiZSBlcXVhbCBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0U0FEIC0gUG9pbnRlciBvZiByZXN1bHQgU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKiAgICAtICAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZjAsIAotICogICAgICAgICAgICAgIHBTcmNSZWYxLCBwRHN0U0FELiAKLSAqICAgIC0gICAgaVNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCAKLSAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfU0FEUXVhcl84eCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjAsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMSwKLSAgICBPTVhfVTMyIGlTcmNTdGVwLAotICAgIE9NWF9VMzIgaVJlZlN0ZXAwLAotICAgIE9NWF9VMzIgaVJlZlN0ZXAxLAotICAgIE9NWF9VMzIgKnBEc3RTQUQsCi0gICAgT01YX1UzMiBpSGVpZ2h0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FEUXVhcl8xNnggICAoNi4zLjUuNC40KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgYmV0d2VlbiBvbmUgYmxvY2sgKHBTcmMpIGFuZCB0aGUgYXZlcmFnZSAKLSAqIG9mIHRoZSBvdGhlciB0d28gKHBTcmNSZWYwIGFuZCBwU3JjUmVmMSkgZm9yIDE2eDE2IG9yIDE2eDggYmxvY2tzLiAgCi0gKiBSb3VuZGluZyBpcyBhcHBsaWVkIGFjY29yZGluZyB0byB0aGUgY29udmVudGlvbiAoYStiKzEpPj4xLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgcFNyY1JlZjAgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAwIAotICogICBwU3JjUmVmMSAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYgCi0gKiAgIGlSZWZTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIGlSZWZTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA4IG9yIDE2IAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0U0FEIC1Qb2ludGVyIG9mIHJlc3VsdCBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDggb3IgMTYuIAotICogICAgLSAgICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYwLCAKLSAqICAgICAgICAgICAgICBwU3JjUmVmMSwgcERzdFNBRC4gCi0gKiAgICAtICAgIGlTcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2IAotICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9TQURRdWFyXzE2eCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjAsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMSwKLSAgICBPTVhfVTMyIGlTcmNTdGVwLAotICAgIE9NWF9VMzIgaVJlZlN0ZXAwLAotICAgIE9NWF9VMzIgaVJlZlN0ZXAxLAotICAgIE9NWF9VMzIgKnBEc3RTQUQsCi0gICAgT01YX1UzMiBpSGVpZ2h0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FURF80eDQgICAoNi4zLjUuNC41KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBzdW0gb2YgYWJzb2x1dGUgdHJhbnNmb3JtIGRpZmZlcmVuY2VzIChTQVREKSAKLSAqIGZvciBhIDR4NCBibG9jayBieSBhcHBseWluZyBhIEhhZGFtYXJkIHRyYW5zZm9ybSB0byB0aGUgZGlmZmVyZW5jZSBibG9jayAKLSAqIGFuZCB0aGVuIGNhbGN1bGF0aW5nIHRoZSBzdW0gb2YgYWJzb2x1dGUgY29lZmZpY2llbnQgdmFsdWVzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjT3JnIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkgCi0gKiAgIGlTdGVwT3JnIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgcFNyY1JlZiAtIFBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeSAKLSAqICAgaVN0ZXBSZWYgLSBTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gdGhlIHJlc3VsdGluZyBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyY09yZywgcFNyY1JlZiwgb3IgcERzdFNBRCBlaXRoZXIgcFNyY09yZyAKLSAqICAgIC0gICAgcFNyY1JlZiBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgaVN0ZXBPcmcgPD0gMCBvciBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICogICAgLSAgICBpU3RlcFJlZiA8PSAwIG9yIGlTdGVwUmVmIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9TQVREXzR4NCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAotICAgIE9NWF9VMzIgaVN0ZXBPcmcsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAotICAgIE9NWF9VMzIgaVN0ZXBSZWYsCi0gICAgT01YX1UzMiAqcERzdFNBRAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hICAgKDYuMy41LjUuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgdHdvIGhvcml6b250YWwgMS8yLXBlbCBwb3NpdGlvbnMgCi0gKiAoLTEvMiwwKSBhbmQgKDEvMiwgMCkgLSBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSBpbiAKLSAqICAgICAgICAgICAgdGhlIHJlY29uc3RydWN0aW9uIGZyYW1lIHBsYW5lLiAKLSAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiAKLSAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXI7IG11c3QgYmUgYSAKLSAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgaVdpZHRoLiAKLSAqICAgaVdpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2IAotICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIDQsIDgsIG9yIDE2IAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0TGVmdCAtUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIGxlZnQgLXBlbCBwb3NpdGlvbiAKLSAqICAgICAgICAgICAgKC0xLzIsIDApIAotICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgcERzdFJpZ2h0IC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgcmlnaHQgLXBlbCAKLSAqICAgICAgICAgICAgcG9zaXRpb24gKDEvMiwgMCkgCi0gKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgICAgICBwU3JjLCBwRHN0TGVmdCwgb3IgcERzdFJpZ2h0IAotICogICAgLSAgICBpV2lkdGggb3IgaUhlaWdodCBoYXZlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2IAotICogICAgLSAgICBpV2lkdGg9PTQgYnV0IHBEc3RMZWZ0IGFuZC9vciBwRHN0UmlnaHQgaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBpV2lkdGg9PTggYnV0IHBEc3RMZWZ0IGFuZC9vciBwRHN0UmlnaHQgaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBpV2lkdGg9PTE2IGJ1dCBwRHN0TGVmdCBhbmQvb3IgcERzdFJpZ2h0IGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgT01YX1UzMiBpU3JjU3RlcCwKLSAgICBPTVhfVTggKnBEc3RMZWZ0LAotICAgIE9NWF9VOCAqcERzdFJpZ2h0LAotICAgIE9NWF9VMzIgaURzdFN0ZXAsCi0gICAgT01YX1UzMiBpV2lkdGgsCi0gICAgT01YX1UzMiBpSGVpZ2h0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEgICAoNi4zLjUuNS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciB0d28gdmVydGljYWwgMS8yLXBlbCBwb3NpdGlvbnMgLSAKLSAqICgwLCAtMS8yKSBhbmQgKDAsIDEvMikgLSBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgaW4gdGhlIAotICogICAgICAgICAgICByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lIAotICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuIAotICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIChpbnRlcnBvbGF0aW9uKSBidWZmZXI7IG11c3QgYmUgYSAKLSAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgaVdpZHRoLiAKLSAqICAgaVdpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2IAotICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFVwIC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgLXBlbCBwb3NpdGlvbiBhYm92ZSAKLSAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgZnVsbC1wZWwgcG9zaXRpb24gKDAsIC0xLzIpIAotICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIHBEc3REb3duIC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgLXBlbCBwb3NpdGlvbiBiZWxvdyAKLSAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgZnVsbC1wZWwgcG9zaXRpb24gKDAsIDEvMikgCi0gKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTQsIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT04LCA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICAgICBwU3JjLCBwRHN0VXAsIG9yIHBEc3REb3duIAotICogICAgLSAgICBpV2lkdGggb3IgaUhlaWdodCBoYXZlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2IAotICogICAgLSAgICBpV2lkdGg9PTQgYnV0IHBEc3RVcCBhbmQvb3IgcERzdERvd24gaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBpV2lkdGg9PTggYnV0IHBEc3RVcCBhbmQvb3IgcERzdERvd24gaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBpV2lkdGg9PTE2IGJ1dCBwRHN0VXAgYW5kL29yIHBEc3REb3duIGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIE9NWF9VMzIgaVNyY1N0ZXAsCi0gICAgT01YX1U4ICpwRHN0VXAsCi0gICAgT01YX1U4ICpwRHN0RG93biwKLSAgICBPTVhfVTMyIGlEc3RTdGVwLAotICAgIE9NWF9VMzIgaVdpZHRoLAotICAgIE9NWF9VMzIgaUhlaWdodAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0F2ZXJhZ2VfNHggICAoNi4zLjUuNS4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byA0eDQsIDR4OCBibG9ja3MuICBUaGUgcmVzdWx0IAotICogaXMgcm91bmRlZCBhY2NvcmRpbmcgdG8gKGErYisxKS8yLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwUHJlZDAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIHBQcmVkMSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaVByZWRTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDA7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgaVByZWRTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDE7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2tzOyBtdXN0IGJlIGVpdGhlciA0IG9yIDguIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0UHJlZCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgICBwUHJlZDAsIHBQcmVkMSwgb3IgcERzdFByZWQgCi0gKiAgICAtICAgIHBEc3RQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBpUHJlZFN0ZXAwIDw9IDAgb3IgaVByZWRTdGVwMCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICogICAgLSAgICBpUHJlZFN0ZXAxIDw9IDAgb3IgaVByZWRTdGVwMSBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICogICAgLSAgICBpRHN0U3RlcCA8PSAwIG9yIGlEc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0IG9yIDggCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9BdmVyYWdlXzR4ICgKLSAgICBjb25zdCBPTVhfVTggKnBQcmVkMCwKLSAgICBjb25zdCBPTVhfVTggKnBQcmVkMSwKLSAgICBPTVhfVTMyIGlQcmVkU3RlcDAsCi0gICAgT01YX1UzMiBpUHJlZFN0ZXAxLAotICAgIE9NWF9VOCAqcERzdFByZWQsCi0gICAgT01YX1UzMiBpRHN0U3RlcCwKLSAgICBPTVhfVTMyIGlIZWlnaHQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQyAgICg2LjMuNS42LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIDJ4MiBIYWRhbWFyZCB0cmFuc2Zvcm0gb2YgY2hyb21hIERDIGNvZWZmaWNpZW50cyAKLSAqIGFuZCB0aGVuIHF1YW50aXplcyB0aGUgY29lZmZpY2llbnRzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgMngyIGFycmF5IG9mIGNocm9tYSBEQyBjb2VmZmljaWVudHMuICA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCi0gKiAgIGJJbnRyYSAtIEluZGljYXRlIHdoZXRoZXIgdGhpcyBpcyBhbiBJTlRSQSBibG9jay4gMS1JTlRSQSwgMC1JTlRFUiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdHJhbnNmb3JtZWQgYW5kIHF1YW50aXplZCBjb2VmZmljaWVudHMuICA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgICAgIHBTcmNEc3QgCi0gKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMgKAotICAgIE9NWF9TMTYgKnBTcmNEc3QsCi0gICAgT01YX1UzMiBpUVAsCi0gICAgT01YX1U4IGJJbnRyYQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQyAgICg2LjMuNS42LjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGEgNHg0IEhhZGFtYXJkIHRyYW5zZm9ybSBvZiBsdW1hIERDIGNvZWZmaWNpZW50cyAKLSAqIGFuZCB0aGVuIHF1YW50aXplcyB0aGUgY29lZmZpY2llbnRzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgNHg0IGFycmF5IG9mIGx1bWEgREMgY29lZmZpY2llbnRzLiAgMTYtYnl0ZSAKLSAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdHJhbnNmb3JtZWQgYW5kIHF1YW50aXplZCBjb2VmZmljaWVudHMuICAxNi1ieXRlIAotICogICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QgCi0gKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IGFsaWduZWQgb24gYW4gMTYtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQyAoCi0gICAgT01YX1MxNiAqcFNyY0RzdCwKLSAgICBPTVhfVTMyIGlRUAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDICAgKDYuMy41LjYuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSA0eDQgSGFkYW1hcmQgdHJhbnNmb3JtIGFuZCB0aGVuIGRlcXVhbnRpemVzIAotICogdGhlIGNvZWZmaWNpZW50cy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIDR4NCBhcnJheSBvZiB0aGUgNHg0IEhhZGFtYXJkLXRyYW5zZm9ybWVkIGFuZCAKLSAqICAgICAgICAgICAgcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIDE2IGJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIFBvaW50ZXIgdG8gaW52ZXJzZS10cmFuc2Zvcm1lZCBhbmQgZGVxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgCi0gKiAgICAgICAgICAgIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMgCi0gKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQyAoCi0gICAgY29uc3QgT01YX1MxNiAqcFNyYywKLSAgICBPTVhfUzE2ICpwRHN0LAotICAgIE9NWF9VMzIgaVFQCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQyAgICg2LjMuNS42LjQpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgMngyIEhhZGFtYXJkIHRyYW5zZm9ybSBhbmQgdGhlbiBkZXF1YW50aXplcyAKLSAqIHRoZSBjb2VmZmljaWVudHMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSAyeDIgYXJyYXkgb2YgdGhlIDJ4MiBIYWRhbWFyZC10cmFuc2Zvcm1lZCBhbmQgCi0gKiAgICAgICAgICAgIHF1YW50aXplZCBjb2VmZmljaWVudHMuICA4IGJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIFBvaW50ZXIgdG8gaW52ZXJzZS10cmFuc2Zvcm1lZCBhbmQgZGVxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgCi0gKiAgICAgICAgICAgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYyAKLSAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMgKAotICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCi0gICAgT01YX1MxNiAqcERzdCwKLSAgICBPTVhfVTMyIGlRUAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkICAgKDYuMy41LjcuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSBhbiA0eDQgaW50ZWdlciB0cmFuc2Zvcm1hdGlvbiB0byBwcm9kdWNlIAotICogdGhlIGRpZmZlcmVuY2Ugc2lnbmFsIGFuZCB0aGVuIGFkZHMgdGhlIGRpZmZlcmVuY2UgdG8gdGhlIHByZWRpY3Rpb24gdG8gZ2V0IAotICogdGhlIHJlY29uc3RydWN0ZWQgc2lnbmFsLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjUHJlZCAtIFBvaW50ZXIgdG8gcHJlZGljdGlvbiBzaWduYWwuICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgcERlcXVhbnRDb2VmZiAtIFBvaW50ZXIgdG8gdGhlIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cy4gIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgaVNyY1ByZWRTdGVwIC0gU3RlcCBvZiB0aGUgcHJlZGljdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgaURzdFJlY29uU3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIHJlY29uc3RydWN0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIAotICogICAgICAgICAgICBtdWx0aXBsZSBvZiA0LiAKLSAqICAgYkFDIC0gSW5kaWNhdGUgd2hldGhlciB0aGVyZSBpcyBBQyBjb2VmZmljaWVudHMgaW4gdGhlIGNvZWZmaWNpZW50cyAKLSAqICAgICAgICAgICAgbWF0cml4LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFJlY29uIC1Qb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiByZWNvbnN0cnVjdGlvbiBidWZmZXIuICA0LWJ5dGUgCi0gKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgICAgcFNyY1ByZWQsIHBEZXF1YW50Q29lZmYsIHBEc3RSZWNvbiAKLSAqICAgIC0gICAgcFNyY1ByZWQgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGlTcmNQcmVkU3RlcCBvciBpRHN0UmVjb25TdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIAotICogICAgLSAgICBwRGVxdWFudENvZWZmIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNQcmVkLAotICAgIGNvbnN0IE9NWF9TMTYgKnBEZXF1YW50Q29lZmYsCi0gICAgT01YX1U4ICpwRHN0UmVjb24sCi0gICAgT01YX1UzMiBpU3JjUHJlZFN0ZXAsCi0gICAgT01YX1UzMiBpRHN0UmVjb25TdGVwLAotICAgIE9NWF9VOCBiQUMKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbCAgICg2LjMuNS44LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHN1YnRyYWN0cyB0aGUgcHJlZGljdGlvbiBzaWduYWwgZnJvbSB0aGUgb3JpZ2luYWwgc2lnbmFsIHRvIAotICogcHJvZHVjZSB0aGUgZGlmZmVyZW5jZSBzaWduYWwgYW5kIHRoZW4gcGVyZm9ybXMgYSA0eDQgaW50ZWdlciB0cmFuc2Zvcm0gYW5kIAotICogcXVhbnRpemF0aW9uLiBUaGUgcXVhbnRpemVkIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cyBhcmUgc3RvcmVkIGFzIAotICogcERzdFF1YW50Q29lZmYuIFRoaXMgZnVuY3Rpb24gY2FuIGFsc28gb3V0cHV0IGRlcXVhbnRpemVkIGNvZWZmaWNpZW50cyBvciAKLSAqIHVucXVhbnRpemVkIERDIGNvZWZmaWNpZW50cyBvcHRpb25hbGx5IGJ5IHNldHRpbmcgdGhlIHBvaW50ZXJzIAotICogcERzdERlUXVhbnRDb2VmZiwgcERDQ29lZmYuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNPcmcgLSBQb2ludGVyIHRvIG9yaWdpbmFsIHNpZ25hbC4gNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIHBTcmNQcmVkIC0gUG9pbnRlciB0byBwcmVkaWN0aW9uIHNpZ25hbC4gNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIGlTcmNPcmdTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgc2lnbmFsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIAotICogICAgICAgICAgICA0LiAKLSAqICAgaVNyY1ByZWRTdGVwIC0gU3RlcCBvZiB0aGUgcHJlZGljdGlvbiBzaWduYWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgCi0gKiAgICAgICAgICAgIG9mIDQuIAotICogICBwTnVtQ29lZmYgLU51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMgYWZ0ZXIgcXVhbnRpemF0aW9uLiBJZiB0aGlzIAotICogICAgICAgICAgICBwYXJhbWV0ZXIgaXMgbm90IHJlcXVpcmVkLCBpdCBpcyBzZXQgdG8gTlVMTC4gCi0gKiAgIG5UaHJlc2hTQUQgLSBaZXJvLWJsb2NrIGVhcmx5IGRldGVjdGlvbiB0aHJlc2hvbGQuIElmIHRoaXMgcGFyYW1ldGVyIGlzIAotICogICAgICAgICAgICBub3QgcmVxdWlyZWQsIGl0IGlzIHNldCB0byAwLiAKLSAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKLSAqICAgYkludHJhIC0gSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpcyBhbiBJTlRSQSBibG9jaywgZWl0aGVyIDEtSU5UUkEgb3IgCi0gKiAgICAgICAgICAgIDAtSU5URVIgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RRdWFudENvZWZmIC0gUG9pbnRlciB0byB0aGUgcXVhbnRpemVkIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cy4gIAotICogICAgICAgICAgICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgcERzdERlUXVhbnRDb2VmZiAtIFBvaW50ZXIgdG8gdGhlIGRlcXVhbnRpemVkIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cyAKLSAqICAgICAgICAgICAgaWYgdGhpcyBwYXJhbWV0ZXIgaXMgbm90IGVxdWFsIHRvIE5VTEwuICA4LWJ5dGUgYWxpZ25tZW50IAotICogICAgICAgICAgICByZXF1aXJlZC4gCi0gKiAgIHBEQ0NvZWZmIC0gUG9pbnRlciB0byB0aGUgdW5xdWFudGl6ZWQgREMgY29lZmZpY2llbnQgaWYgdGhpcyBwYXJhbWV0ZXIgCi0gKiAgICAgICAgICAgIGlzIG5vdCBlcXVhbCB0byBOVUxMLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICAgICBwU3JjT3JnLCBwU3JjUHJlZCwgcE51bUNvZWZmLCBwRHN0UXVhbnRDb2VmZiwgCi0gKiAgICAgICAgICAgIHBEc3REZVF1YW50Q29lZmYsIHBEQ0NvZWZmIAotICogICAgLSAgICBwU3JjT3JnIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBwU3JjUHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgaVNyY09yZ1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgIC0gICAgaVNyY1ByZWRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKiAgICAtICAgIHBEc3RRdWFudENvZWZmIG9yIHBEc3REZVF1YW50Q29lZmYgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZywKLSAgICBjb25zdCBPTVhfVTggKnBTcmNQcmVkLAotICAgIE9NWF9VMzIgaVNyY09yZ1N0ZXAsCi0gICAgT01YX1UzMiBpU3JjUHJlZFN0ZXAsCi0gICAgT01YX1MxNiAqcERzdFF1YW50Q29lZmYsCi0gICAgT01YX1MxNiAqcERzdERlUXVhbnRDb2VmZiwKLSAgICBPTVhfUzE2ICpwRENDb2VmZiwKLSAgICBPTVhfUzggKnBOdW1Db2VmZiwKLSAgICBPTVhfVTMyIG5UaHJlc2hTQUQsCi0gICAgT01YX1UzMiBpUVAsCi0gICAgT01YX1U4IGJJbnRyYQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0dldFZMQ0luZm8gICAoNi4zLjUuOS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBleHRyYWN0cyBydW4tbGVuZ3RoIGVuY29kaW5nIChSTEUpIGluZm9ybWF0aW9uIGZyb20gdGhlIAotICogY29lZmZpY2llbnQgbWF0cml4LiAgVGhlIHJlc3VsdHMgYXJlIHJldHVybmVkIGluIGFuIE9NWFZDTTRQMTBWTENJbmZvIAotICogc3RydWN0dXJlLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjQ29lZmYgLSBwb2ludGVyIHRvIHRoZSB0cmFuc2Zvcm0gY29lZmZpY2llbnQgbWF0cml4LiAgOC1ieXRlIAotICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBwU2Nhbk1hdHJpeCAtIHBvaW50ZXIgdG8gdGhlIHNjYW4gb3JkZXIgZGVmaW5pdGlvbiBtYXRyaXguICBGb3IgYSBsdW1hIAotICogICAgICAgICAgICBibG9jayB0aGUgc2NhbiBtYXRyaXggc2hvdWxkIGZvbGxvdyBbSVNPMTQ0OTYtMTBdIHNlY3Rpb24gOC41LjQsIAotICogICAgICAgICAgICBhbmQgc2hvdWxkIGNvbnRhaW4gdGhlIHZhbHVlcyAwLCAxLCA0LCA4LCA1LCAyLCAzLCA2LCA5LCAxMiwgMTMsIAotICogICAgICAgICAgICAxMCwgNywgMTEsIDE0LCAxNS4gIEZvciBhIGNocm9tYSBibG9jaywgdGhlIHNjYW4gbWF0cml4IHNob3VsZCAKLSAqICAgICAgICAgICAgY29udGFpbiB0aGUgdmFsdWVzIDAsIDEsIDIsIDMuIAotICogICBiQUMgLSBpbmRpY2F0ZXMgcHJlc2VuY2Ugb2YgYSBEQyBjb2VmZmljaWVudDsgMCA9IERDIGNvZWZmaWNpZW50IAotICogICAgICAgICAgICBwcmVzZW50LCAxPSBEQyBjb2VmZmljaWVudCBhYnNlbnQuIAotICogICBNYXhOdW1Db2VmIC0gc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGNvbnRhaW5lZCBpbiB0aGUgCi0gKiAgICAgICAgICAgIHRyYW5zZm9ybSBjb2VmZmljaWVudCBtYXRyaXgsIHBTcmNDb2VmZi4gVGhlIHZhbHVlIHNob3VsZCBiZSAxNiAKLSAqICAgICAgICAgICAgZm9yIGJsb2NrcyBvZiB0eXBlIExVTUFEQywgTFVNQUFDLCBMVU1BTEVWRUwsIGFuZCBDSFJPTUFBQy4gVGhlIAotICogICAgICAgICAgICB2YWx1ZSBzaG91bGQgYmUgNCBmb3IgYmxvY2tzIG9mIHR5cGUgQ0hST01BREMuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0VkxDSW5mbyAtIHBvaW50ZXIgdG8gc3RydWN0dXJlIHRoYXQgc3RvcmVzIGluZm9ybWF0aW9uIGZvciAKLSAqICAgICAgICAgICAgcnVuLWxlbmd0aCBjb2RpbmcuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgICAgIHBTcmNDb2VmZiwgcFNjYW5NYXRyaXgsIHBEc3RWTENJbmZvIAotICogICAgLSAgICBwU3JjQ29lZmYgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfR2V0VkxDSW5mbyAoCi0gICAgY29uc3QgT01YX1MxNiAqcFNyY0NvZWZmLAotICAgIGNvbnN0IE9NWF9VOCAqcFNjYW5NYXRyaXgsCi0gICAgT01YX1U4IGJBQywKLSAgICBPTVhfVTMyIE1heE51bUNvZWYsCi0gICAgT01YVkNNNFAxMFZMQ0luZm8qcERzdFZMQ0luZm8KLSk7Ci0KLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyoqIGVuZCBvZiAjZGVmaW5lIF9PTVhWQ19IXyAqLwotCi0vKiogRU9GICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9hcGkvb214VkNfcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2FwaS9vbXhWQ19zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlOTc0ZDUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2FwaS9vbXhWQ19zLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotOy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsvLyBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNSBUaGUgS2hyb25vcyBHcm91cCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKLTsvLwotOy8vCi07Ly8KLTsvLwotOy8vCi07Ly8KLTsvLwotOy8vCi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi07LyoqID09PT09PT09PT09PT09PSBTdHJ1Y3R1cmUgRGVmaW5pdGlvbiBmb3IgU2FtcGxlIEdlbmVyYXRpb24gPT09PT09PT09PT09PT0gKi8KLTsvKiogdHJhbnNwYXJlbnQgc3RhdHVzICovCi0KLTtlbnVtIHsKLU9NWF9WSURFT19UUkFOU1BBUkVOVAlFUVUgMDsJLyoqIFdob2xseSB0cmFuc3BhcmVudCAqLwotT01YX1ZJREVPX1BBUlRJQUwJCUVRVSAxOwkvKiogUGFydGlhbGx5IHRyYW5zcGFyZW50ICovCi1PTVhfVklERU9fT1BBUVVFCQlFUVUgMjsJLyoqIE9wYXF1ZSAqLwotO30KLQotOy8qKiBkaXJlY3Rpb24gKi8KLTtlbnVtIHsKLU9NWF9WSURFT19OT05FCQkJRVFVIDA7Ci1PTVhfVklERU9fSE9SSVpPTlRBTAlFUVUgMTsKLU9NWF9WSURFT19WRVJUSUNBTAkJRVFVIDI7Ci07fQotCi07LyoqIGJpbGluZWFyIGludGVycG9sYXRpb24gdHlwZSAqLwotO2VudW0gewotT01YX1ZJREVPX0lOVEVHRVJfUElYRUwgRVFVIDA7CS8qKiBjYXNlIKGwYaGxICovCi1PTVhfVklERU9fSEFMRl9QSVhFTF9YICBFUVUgMTsJLyoqIGNhc2UgobBiobEgKi8KLU9NWF9WSURFT19IQUxGX1BJWEVMX1kgIEVRVSAyOwkvKiogY2FzZSChsGOhsSAqLwotT01YX1ZJREVPX0hBTEZfUElYRUxfWFkgRVFVIDM7CS8qKiBjYXNlIKGwZKGxICovCi07fQotCi07ZW51bSB7Ci1PTVhfVVBQRVIgIAkJCQlFUVUgMTsJCQkvKiogc2V0IGlmIHRoZSBhYm92ZSBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLwotT01YX0xFRlQgICAJCQkJRVFVIDI7CQkJLyoqIHNldCBpZiB0aGUgbGVmdCBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLwotT01YX0NFTlRFUiAJCQkJRVFVIDQ7Ci1PTVhfUklHSFQJCQkJRVFVIDg7Ci1PTVhfTE9XRVIgIAkJCQlFUVUJMTY7Ci1PTVhfVVBQRVJfTEVGVCAgCQlFUVUgMzI7CQkvKiogc2V0IGlmIHRoZSBhYm92ZS1sZWZ0IG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCi1PTVhfVVBQRVJfUklHSFQgCQlFUVUgNjQ7CQkvKiogc2V0IGlmIHRoZSBhYm92ZS1yaWdodCBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLwotT01YX0xPV0VSX0xFRlQgIAkJRVFVIDEyODsKLU9NWF9MT1dFUl9SSUdIVCAJCUVRVSAyNTYKLTt9Ci0KLTtlbnVtIHsKLU9NWF9WSURFT19MVU1JTkFOQ0UgIAlFUVUgMDsJLyoqIEx1bWluYW5jZSBjb21wb25lbnQgKi8KLU9NWF9WSURFT19DSFJPTUlOQU5DRSAgCUVRVSAxOwkvKiogY2hyb21pbmFuY2UgY29tcG9uZW50ICovCi1PTVhfVklERU9fQUxQSEEgIAkJRVFVIDI7CQkJLyoqIEFscGhhIGNvbXBvbmVudCAqLwotO30KLQotO2VudW0gewotT01YX1ZJREVPX0lOVEVSCQkJRVFVIDA7CS8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KLU9NWF9WSURFT19JTlRFUl9RCQlFUVUgMTsJLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLwotT01YX1ZJREVPX0lOVEVSNFYJCUVRVSAyOwkvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCi1PTVhfVklERU9fSU5UUkEJCQlFUVUgMzsJLyoqIEkgYW5kIFAgcGljdHVyZTsgSS0gYW5kIFAtVk9QICovCi1PTVhfVklERU9fSU5UUkFfUQkJRVFVIDQ7CS8qKiBJIGFuZCBQIHBpY3R1cmU7IEktIGFuZCBQLVZPUCAqLwotT01YX1ZJREVPX0lOVEVSNFZfUQkJRVFVIDU7CS8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKEguMjYzKSovCi1PTVhfVklERU9fRElSRUNUCQlFUVUgNjsJLyoqIEIgcGljdHVyZSBvciBCLVZPUCAoTVBFRy00IG9ubHkpICovCi1PTVhfVklERU9fSU5URVJQT0xBVEUJRVFVIDc7CS8qKiBCIHBpY3R1cmUgb3IgQi1WT1AgKi8KLU9NWF9WSURFT19CQUNLV0FSRAkJRVFVIDg7CS8qKiBCIHBpY3R1cmUgb3IgQi1WT1AgKi8KLU9NWF9WSURFT19GT1JXQVJECQlFUVUgOTsJLyoqIEIgcGljdHVyZSBvciBCLVZPUCAqLwotT01YX1ZJREVPX05PVENPREVECQlFUVUgMTA7CS8qKiBCIHBpY3R1cmUgb3IgQi1WT1AgKi8KLTt9Ci0KLTtlbnVtIHsKLU9NWF8xNlgxNl9WRVJUIAkJCUVRVSAwOwkJLyoqIEludHJhXzE2eDE2X1ZlcnRpY2FsIChwcmVkaWN0aW9uIG1vZGUpICovCi1PTVhfMTZYMTZfSE9SIAkJCUVRVSAxOwkJLyoqIEludHJhXzE2eDE2X0hvcml6b250YWwgKHByZWRpY3Rpb24gbW9kZSkgKi8KLU9NWF8xNlgxNl9EQyAJCQlFUVUgMjsJCS8qKiBJbnRyYV8xNngxNl9EQyAocHJlZGljdGlvbiBtb2RlKSAqLwotT01YXzE2WDE2X1BMQU5FIAkJRVFVIDM7CS8qKiBJbnRyYV8xNngxNl9QbGFuZSAocHJlZGljdGlvbiBtb2RlKSAqLwotO30KLQotO2VudW0gewotT01YXzR4NF9WRVJUIAkJCUVRVSAwOwkJLyoqIEludHJhXzR4NF9WZXJ0aWNhbCAocHJlZGljdGlvbiBtb2RlKSAqLwotT01YXzR4NF9IT1IgIAkJCUVRVSAxOwkJLyoqIEludHJhXzR4NF9Ib3Jpem9udGFsIChwcmVkaWN0aW9uIG1vZGUpICovCi1PTVhfNHg0X0RDICAgCQkJRVFVIDI7CQkvKiogSW50cmFfNHg0X0RDIChwcmVkaWN0aW9uIG1vZGUpICovCi1PTVhfNHg0X0RJQUdfREwgCQlFUVUgMzsJLyoqIEludHJhXzR4NF9EaWFnb25hbF9Eb3duX0xlZnQgKHByZWRpY3Rpb24gbW9kZSkgKi8KLU9NWF80eDRfRElBR19EUiAJCUVRVSA0OwkvKiogSW50cmFfNHg0X0RpYWdvbmFsX0Rvd25fUmlnaHQgKHByZWRpY3Rpb24gbW9kZSkgKi8KLU9NWF80eDRfVlIgCQkJCUVRVSA1OwkJCS8qKiBJbnRyYV80eDRfVmVydGljYWxfUmlnaHQgKHByZWRpY3Rpb24gbW9kZSkgKi8KLU9NWF80eDRfSEQgCQkJCUVRVSA2OwkJCS8qKiBJbnRyYV80eDRfSG9yaXpvbnRhbF9Eb3duIChwcmVkaWN0aW9uIG1vZGUpICovCi1PTVhfNHg0X1ZMIAkJCQlFUVUgNzsJCQkvKiogSW50cmFfNHg0X1ZlcnRpY2FsX0xlZnQgKHByZWRpY3Rpb24gbW9kZSkgKi8KLU9NWF80eDRfSFUgCQkJCUVRVSA4OwkJCS8qKiBJbnRyYV80eDRfSG9yaXpvbnRhbF9VcCAocHJlZGljdGlvbiBtb2RlKSAqLwotO30KLQotO2VudW0gewotT01YX0NIUk9NQV9EQyAJCQlFUVUgMDsJCS8qKiBJbnRyYV9DaHJvbWFfREMgKHByZWRpY3Rpb24gbW9kZSkgKi8KLU9NWF9DSFJPTUFfSE9SIAkJCUVRVSAxOwkJLyoqIEludHJhX0Nocm9tYV9Ib3Jpem9udGFsIChwcmVkaWN0aW9uIG1vZGUpICovCi1PTVhfQ0hST01BX1ZFUlQgCQlFUVUgMjsJLyoqIEludHJhX0Nocm9tYV9WZXJ0aWNhbCAocHJlZGljdGlvbiBtb2RlKSAqLwotT01YX0NIUk9NQV9QTEFORSAJCUVRVSAzOwkvKiogSW50cmFfQ2hyb21hX1BsYW5lIChwcmVkaWN0aW9uIG1vZGUpICovCi07fQotCi07dHlwZWRlZglzdHJ1Y3QgewkKLXgJRVFVCTA7Ci15CUVRVQk0OwotO31PTVhDb29yZGluYXRlOwotCi07dHlwZWRlZiBzdHJ1Y3QgewotZHgJRVFVCTA7Ci1keQlFUVUJMjsKLTt9T01YTW90aW9uVmVjdG9yOwotCi07dHlwZWRlZiBzdHJ1Y3QgewoteHgJCUVRVQkwOwoteXkJCUVRVQk0Owotd2lkdGgJRVFVCTg7Ci1oZWlnaHQJRVFVCTEyOwotO31PTVhpUmVjdDsKLQotO3R5cGVkZWYgZW51bSB7Ci1PTVhfVkNfSU5URVIgICAgICAgICBFUVUgMDsgICAgICAgIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KLU9NWF9WQ19JTlRFUl9RICAgICAgIEVRVSAxOyAgICAgICAvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCi1PTVhfVkNfSU5URVI0ViAgICAgICBFUVUgMjsgICAgICAgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLwotT01YX1ZDX0lOVFJBICAgICAgICAgRVFVIDM7ICAgICAgICAvKiogSSBhbmQgUCBwaWN0dXJlLCBJLSBhbmQgUC1WT1AgKi8KLU9NWF9WQ19JTlRSQV9RICAgICAgIEVRVSA0OyAgICAgICAvKiogSSBhbmQgUCBwaWN0dXJlLCBJLSBhbmQgUC1WT1AgKi8KLU9NWF9WQ19JTlRFUjRWX1EgICAgIEVRVSA1OyAgICAvKiogUCBwaWN0dXJlIG9yIFAtVk9QIChILjI2MykqLwotO30gT01YVkNNNFAyTWFjcm9ibG9ja1R5cGU7Ci0KLTtlbnVtIHsKLU9NWF9WQ19OT05FICAgICAgICAgIEVRVSAwCi1PTVhfVkNfSE9SSVpPTlRBTCAgICBFUVUgMQotT01YX1ZDX1ZFUlRJQ0FMICAgICAgRVFVIDIgCi07fTsKLQotCi0JRU5ECi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTE2eDE2X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTE2eDE2X3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY2M2E3MC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHkxNngxNl9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotIDsvKioKLSA7ICogRnVuY3Rpb246IG9teFZDQ09NTV9Db3B5MTZ4MTYKLSA7ICoKLSA7ICogRGVzY3JpcHRpb246Ci0gOyAqIENvcGllcyB0aGUgcmVmZXJlbmNlIDE2eDE2IGJsb2NrIHRvIHRoZSBjdXJyZW50IGJsb2NrLgotIDsgKiBQYXJhbWV0ZXJzOgotIDsgKiBbaW5dIHBTcmMgICAgICAgICAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayBpbiB0aGUgc291cmNlIGZyYW1lOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gMTYtYnl0ZSBib3VuZGFyeS4KLSA7ICogW2luXSBzdGVwICAgICAgICAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydHMgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIHJlZmVyZW5jZSBmcmFtZSwgaW4gYnl0ZXM7Ci0gOyAqICAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2IGFuZCBtdXN0IGJlIGxhcmdlciB0aGFuIG9yIGVxdWFsIHRvIDE2LgotIDsgKiBbb3V0XSBwRHN0ICAgICAgICAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LgotIDsgKiBSZXR1cm4gVmFsdWU6Ci0gOyAqIE9NWF9TdHNfTm9FcnIgICAgIC0gbm8gZXJyb3IKLSA7ICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotIDsgKiAgICAgICAgICAgICAgICAgICAtIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogIHBTcmMsIHBEc3QKLSA7ICogICAgICAgICAgICAgICAgICAgLSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDE2LWJ5dGUgYm91bmRhcnk6ICBwU3JjLCBwRHN0Ci0gOyAqICAgICAgICAgICAgICAgICAgIC0gc3RlcCA8MTYgb3Igc3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gIAotIDsgKi8KLQotICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgIAotICAgICAKLSAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLSAgICAgCi0KLQotCi0gICAgIElGIEFSTTExMzZKUwotCi07Ly9JbnB1dCBBcmd1bWVudHMKLXBTcmMgICAgUk4gMCAgICAgICAgCi1wRHN0ICAgIFJOIDEgICAgICAgIAotc3RlcCAgICBSTiAyCi0KLTsvL0xvY2FsIFZhcmlhYmxlcwotQ291bnQgICBSTiAxNAotWDAgICAgICBSTiAyCi1YMSAgICAgIFJOIDQKLQotUmV0dXJuICBSTiAwCi0gICAgIAotICAgICBNX1NUQVJUIG9teFZDQ09NTV9Db3B5MTZ4MTYscjUKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgU1VCICAgQ291bnQsc3RlcCwjOCAgICAgICAgICAgICAgICAgOy8vQ291bnQ9c3RlcC04Ci0gICAgICAgIExEUkQgIFgwLFtwU3JjXSwjOCAgICAgICAgICAgICAgICAgIDsvL3BTcmMgYWZ0ZXIgbG9hZGluZyBwU3JjPXBTcmMrOAotICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQgICAgICAgICAgICAgICA7Ly9wU3JjIGFmdGVyIGxvYWRpbmcgcFNyYz1wU3JjK3N0ZXAKLSAgICAgICAgCi0gICAgICAgIDsvLyBsb2FkaW5nIDE2IGJ5dGVzIGFuZCBzdG9yaW5nCi0gICAgICAgIFNUUkQgIFgwLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMCxbcFNyY10sIzggCi0gICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKLSAgICAgICAgCi0gICAgICAgIDsvLyBsb2FkaW5nIDE2IGJ5dGVzIGFuZCBzdG9yaW5nCi0gICAgICAgIFNUUkQgIFgwLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMCxbcFNyY10sIzgKLSAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAotICAgICAgICAKLSAgICAgICAgOy8vIGxvYWRpbmcgMTYgYnl0ZXMgYW5kIHN0b3JpbmcKLSAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgwLFtwU3JjXSwjOAotICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50Ci0gICAgICAgIAotICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZwotICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTERSRCAgWDAsW3BTcmNdLCM4Ci0gICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKLSAgICAgICAgCi0gICAgICAgIDsvLyBsb2FkaW5nIDE2IGJ5dGVzIGFuZCBzdG9yaW5nCi0gICAgICAgIFNUUkQgIFgwLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMCxbcFNyY10sIzgKLSAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAotICAgICAgIAotICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZwotICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTERSRCAgWDAsW3BTcmNdLCM4Ci0gICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKLQotICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZwotICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTERSRCAgWDAsW3BTcmNdLCM4Ci0gICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKLSAgICAgICAgCi0gICAgICAgIDsvLyBsb2FkaW5nIDE2IGJ5dGVzIGFuZCBzdG9yaW5nCi0gICAgICAgIFNUUkQgIFgwLFtwRHN0XSwjOCAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgwLFtwU3JjXSwjOCAKLSAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAotICAgICAgICAKLSAgICAgICAgOy8vIGxvYWRpbmcgMTYgYnl0ZXMgYW5kIHN0b3JpbmcKLSAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgwLFtwU3JjXSwjOCAKLSAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAotCi0gICAgICAgIDsvLyBsb2FkaW5nIDE2IGJ5dGVzIGFuZCBzdG9yaW5nCi0gICAgICAgIFNUUkQgIFgwLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMCxbcFNyY10sIzggCi0gICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKLQotICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZwotICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTERSRCAgWDAsW3BTcmNdLCM4IAotICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50Ci0KLSAgICAgICAgOy8vIGxvYWRpbmcgMTYgYnl0ZXMgYW5kIHN0b3JpbmcKLSAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgwLFtwU3JjXSwjOCAKLSAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAotCi0gICAgICAgIDsvLyBsb2FkaW5nIDE2IGJ5dGVzIGFuZCBzdG9yaW5nCi0gICAgICAgIFNUUkQgIFgwLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMCxbcFNyY10sIzggCi0gICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKLQotICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZwotICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTERSRCAgWDAsW3BTcmNdLCM4IAotICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50Ci0gICAgICAgCi0gICAgICAgIDsvLyBsb2FkaW5nIDE2IGJ5dGVzIGFuZCBzdG9yaW5nCi0gICAgICAgIFNUUkQgIFgwLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMCxbcFNyY10sIzggCi0gICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKLQotICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTU9WICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyCi0gICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotCi0gICAgICAgCi0gICAgICAgIE1fRU5ECi0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICBFTkQKLSAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHk4eDhfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5OHg4X3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkzODczYy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHk4eDhfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotIDsvKioKLSA7ICogRnVuY3Rpb246IG9teFZDQ09NTV9Db3B5OHg4Ci0gOyAqCi0gOyAqIERlc2NyaXB0aW9uOgotIDsgKiBDb3BpZXMgdGhlIHJlZmVyZW5jZSA4eDggYmxvY2sgdG8gdGhlIGN1cnJlbnQgYmxvY2suCi0gOyAqIFBhcmFtZXRlcnM6Ci0gOyAqIFtpbl0gcFNyYyAgICAgICAgIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIGluIHRoZSBzb3VyY2UgZnJhbWU7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuCi0gOyAqIFtpbl0gc3RlcCAgICAgICAgIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnRzIG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSByZWZlcmVuY2UgZnJhbWUsIGluIGJ5dGVzOwotIDsgKiAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4IGFuZCBtdXN0IGJlIGxhcmdlciB0aGFuIG9yIGVxdWFsIHRvIDguCi0gOyAqIFtvdXRdIHBEc3QgICAgICAgIC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuCi0gOyAqIFJldHVybiBWYWx1ZToKLSA7ICogT01YX1N0c19Ob0VyciAgICAgLSBubyBlcnJvcgotIDsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0gOyAqICAgICAgICAgICAgICAgICAgIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAgcFNyYywgcERzdAotIDsgKiAgICAgICAgICAgICAgICAgICAtIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5OiAgcFNyYywgcERzdAotIDsgKiAgICAgICAgICAgICAgICAgICAtIHN0ZXAgPDggb3Igc3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAgCi0gOyAqLwotCi0gICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgCi0gICAgIAotICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotICAgICAKLQotCi0KLSAgICAgSUYgQVJNMTEzNkpTCi0KLTsvL0lucHV0IEFyZ3VtZW50cwotcFNyYyAgICBSTiAwICAgICAgICAKLXBEc3QgICAgUk4gMSAgICAgICAgCi1zdGVwICAgIFJOIDIKLQotOy8vTG9jYWwgVmFyaWFibGVzCi1Db3VudCAgIFJOIDE0Ci1YMCAgICAgIFJOIDIKLVgxICAgICAgUk4gNAotUmV0dXJuICBSTiAwCi0gICAgIE1fU1RBUlQgb214VkNDT01NX0NvcHk4eDgscjUKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgTU9WICAgQ291bnQsc3RlcCAgICAgICAgICAgICAgICAgOy8vQ291bnQ9c3RlcCAKLSAgICAgICAgCi0gICAgICAgIExEUkQgIFgwLFtwU3JjXSxDb3VudCAgICAgICAgICAgIDsvL3BTcmMgYWZ0ZXIgbG9hZGluZyA6IHBTcmM9cFNyYytzdGVwCi0gICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAotICAgICAgICAKLSAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgwLFtwU3JjXSxDb3VudCAKLSAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAotICAgICAgICAKLSAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgwLFtwU3JjXSxDb3VudAotICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50Ci0gICAgICAgIAotICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMCxbcFNyY10sQ291bnQKLSAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAotICAgICAgICAKLSAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIE1PViAgIFJldHVybiwjT01YX1N0c19Ob0VycgotICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBNX0VORAotICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgICAgRU5ECi0gICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0lfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWQyMjcxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIG9teFZDQ09NTV9FeHBhbmRGcmFtZV9JX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi07Ly8gRGVzY3JpcHRpb246Ci07Ly8gVGhpcyBmdW5jdGlvbiB3aWxsIEV4cGFuZCBGcmFtZSBib3VuZGFyeSBwaXhlbHMgaW50byBQbGFuZQotOy8vIAotOy8vIAotCi07Ly8gSW5jbHVkZSBzdGFuZGFyZCBoZWFkZXJzCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLSAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLQotOy8vIEltcG9ydCBzeW1ib2xzIHJlcXVpcmVkIGZyb20gb3RoZXIgZmlsZXMKLTsvLyAoRm9yIGV4YW1wbGUgdGFibGVzKQotICAgIAotICAKLTsvLyBTZXQgZGVidWdnaW5nIGxldmVsICAgICAgICAKLURFQlVHX09OICAgIFNFVEwge0ZBTFNFfQotCi0KLSAgICAKLQotCi0KLSAgICAgICAgCi07Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCi0gICAgCi0gICAgSUYgIEFSTTExMzZKUwotICAgIAotOy8vSW5wdXQgUmVnaXN0ZXJzCi0KLXBTcmNEc3RQbGFuZSAgICBSTiAgMAotaUZyYW1lV2lkdGggICAgIFJOICAxCi1pRnJhbWVIZWlnaHQgICAgUk4gIDIgICAgCi1pRXhwYW5kUGVscyAgICAgUk4gIDMKLQotCi07Ly9PdXRwdXQgUmVnaXN0ZXJzCi0KLXJlc3VsdCAgICAgICAgICBSTiAgMAotCi07Ly9Mb2NhbCBTY3JhdGNoIFJlZ2lzdGVycwotCi1pUGxhbmVTdGVwICAgICAgUk4gIDQKLXBUb3AgICAgICAgICAgICBSTiAgNQotcEJvdHRvbSAgICAgICAgIFJOICA2Ci1wQm90dG9tSW5kZXggICAgUk4gIDcKLXggICAgICAgICAgICAgICBSTiAgOAoteSAgICAgICAgICAgICAgIFJOICA5Ci10ZW1wVG9wICAgICAgICAgUk4gIDEwCi10ZW1wQm90ICAgICAgICAgUk4gIDExCi1Db2xTdGVwICAgICAgICAgUk4gIDEyCi1wTGVmdCAgICAgICAgICAgUk4gIDUKLXBSaWdodCAgICAgICAgICBSTiAgNgotcFJpZ2h0SW5kZXggICAgIFJOICA3Ci10ZW1wTGVmdDEgICAgICAgUk4gIDEwCi10ZW1wUmlnaHQxICAgICAgUk4gIDExCi10ZW1wTGVmdDIgICAgICAgUk4gIDE0Ci10ZW1wUmlnaHQyICAgICAgUk4gIDIKLWluZGV4WSAgICAgICAgICBSTiAgMTQKLVJvd1N0ZXAgICAgICAgICBSTiAgMTIKLWV4cGFuZFRvNGJ5dGVzICBSTiAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY29weSBhIGJ5dGUgdG8gNCBieXRlcyBvZiBhIHdvcmQKLSAgICAKLSAgICAgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSByZXF1aXJlZCBieSB0aGUgZnVuY3Rpb24KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgb214VkNDT01NX0V4cGFuZEZyYW1lX0kscjExCi0gICAgICAgIAotICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cwotICAgICAgICBNX0FSRyAgIGlQbGFuZVN0ZXBPblN0YWNrLCA0Ci0gICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjawotICAgICAgICBNX0xEUiAgIGlQbGFuZVN0ZXAsIGlQbGFuZVN0ZXBPblN0YWNrCi0gICAgICAgIAotICAgICAgICBNVUwgICAgIHBUb3AsaUV4cGFuZFBlbHMsaVBsYW5lU3RlcAotICAgICAgICBNTEEgICAgIHBCb3R0b20saUZyYW1lSGVpZ2h0LGlQbGFuZVN0ZXAscFNyY0RzdFBsYW5lCi0gICAgICAgIFNVQiAgICAgeCxpRnJhbWVXaWR0aCwjNAotICAgICAgICBNT1YgICAgIGluZGV4WSxwVG9wCi0gICAgICAgIEFERCAgICAgQ29sU3RlcCxpbmRleFksIzQKLSAgICAgICAgU1VCICAgICBwQm90dG9tSW5kZXgscEJvdHRvbSxpUGxhbmVTdGVwCi0gICAgICAgIFNVQiAgICAgcFRvcCxwU3JjRHN0UGxhbmUscFRvcAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIEFERCAgICAgcFRvcCxwVG9wLHgKLSAgICAgICAgQUREICAgICBwQm90dG9tLHBCb3R0b20seAotCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICA7Ly8gVGhlIGZvbGxvd2luZyBpbXByb3ZlcyB1cG9uIHRoZSBDIGltcGxtZW50YXRpb24KLSAgICAgICAgOy8vIFRoZSB4IGFuZCB5IGxvb3BzIGFyZSBpbnRlcmNoYW5nZWQ6IFRoaXMgZW5zdXJlcyB0aGF0IHRoZSB2YWx1ZXMgb2YKLSAgICAgICAgOy8vIHBTcmNEc3RQbGFuZSBbeF0gYW5kIHBTcmNEc3RQbGFuZSBbKGlGcmFtZUhlaWdodCAtIDEpICogaVBsYW5lU3RlcCArIHhdIAotICAgICAgICA7Ly8gd2hpY2ggZGVwZW5kIG9ubHkgb24gbG9vcCB2YXJpYWJsZSAneCcgYXJlIGxvYWRlZCBvbmNlIGFuZCB1c2VkIGluIAotICAgICAgICA7Ly8gbXVsdGlwbGUgc3RvcmVzIGluIHRoZSAnWScgbG9vcAotICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICA7Ly8geGxvb3AKLUV4cGFuZEZyYW1lVG9wQm90WGxvb3AKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgdGVtcFRvcCxbcFNyY0RzdFBsYW5lLHhdCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICA7Ly8gcFNyY0RzdFBsYW5lIFsoaUZyYW1lSGVpZ2h0IC0gMSkgKiBpUGxhbmVTdGVwICsgeF0gaXMgc2ltcGxpZmllZCBhczoKLSAgICAgICAgOy8vIHBTcmNEc3RQbGFuZSArIChpRnJhbWVIZWlnaHQgKiBpUGxhbmVTdGVwKSAtIGlQbGFuZVN0ZXAgKyB4ID09Ci0gICAgICAgIDsvLyBwQm90dG9tIC0gaVBsYW5lU3RlcCArIHggPT0gcEJvdHRvbUluZGV4IFt4XQotICAgICAgICA7Ly8gVGhlIHZhbHVlIG9mIHBCb3R0b21JbmRleCBpcyBjYWxjdWxhdGVkIGFib3ZlIHRoaXMgJ3gnIGxvb3AKLSAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIExEUiAgICAgdGVtcEJvdCxbcEJvdHRvbUluZGV4LHhdCi0gICAgICAgIAotICAgICAgICA7Ly8geWxvb3AKLSAgICAgICAgTU9WICAgICB5LGlFeHBhbmRQZWxzCi0KLUV4cGFuZEZyYW1lVG9wQm90WWxvb3AgICAgICAgIAotICAgICAgICBTVUJTICAgIHkseSwjMQotICAgICAgICBNX1NUUiAgIHRlbXBUb3AsW3BUb3BdLGlQbGFuZVN0ZXAKLSAgICAgICAgTV9TVFIgICB0ZW1wQm90LFtwQm90dG9tXSxpUGxhbmVTdGVwCi0gICAgICAgIEJHVCAgICAgRXhwYW5kRnJhbWVUb3BCb3RZbG9vcAotICAgICAgICAKLSAgICAgICAgU1VCUyAgICB4LHgsIzQKLSAgICAgICAgU1VCICAgICBwVG9wLHBUb3AsQ29sU3RlcAotICAgICAgICBTVUIgICAgIHBCb3R0b20scEJvdHRvbSxDb2xTdGVwCi0gICAgICAgIEJHRSAgICAgRXhwYW5kRnJhbWVUb3BCb3RYbG9vcAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyB5IGxvb3AKLSAgICAgICAgOy8vIFRoZSBwcm9kdWN0IGlzIGFscmVhZHkgY2FsY3VsYXRlZCBhYm92ZSA6IFJldXNlCi0gICAgICAgIDsvL01VTCAgICAgaW5kZXhZLGlFeHBhbmRQZWxzLGlQbGFuZVN0ZXAgICAgICAKLSAgICAgIAotICAgICAgICBTVUIgICAgIHBTcmNEc3RQbGFuZSxwU3JjRHN0UGxhbmUsaW5kZXhZCi0gICAgICAgIFNVQiAgICAgcExlZnQscFNyY0RzdFBsYW5lLGlFeHBhbmRQZWxzICAgICAgICAgICAgICAgICAgOy8vIHBMZWZ0LT5wb2ludHMgdG8gdGhlIHRvcCBsZWZ0IG9mIHRoZSBleHBhbmRlZCBibG9jawotICAgICAgICBBREQgICAgIHBSaWdodCxwU3JjRHN0UGxhbmUsaUZyYW1lV2lkdGgKLSAgICAgICAgU1VCICAgICBwUmlnaHRJbmRleCxwUmlnaHQsIzEgCi0gICAgICAgIAotICAgICAgICBBREQgICAgIHksaUZyYW1lSGVpZ2h0LGlFeHBhbmRQZWxzLExTTCAjMQotICAgICAgICBMRFIgICAgIGV4cGFuZFRvNGJ5dGVzLD0weDAxMDEwMTAxCi0gICAgICAgIAotICAgICAgICBSU0IgICAgIFJvd1N0ZXAsaUV4cGFuZFBlbHMsaVBsYW5lU3RlcCxMU0wgIzEKLQotICAgICAgICA7Ly8gVGhlIFkgTG9vcCBpcyB1bnJvbGxlZCB0d2ljZQotRXhwYW5kRnJhbWVMZWZ0UmlnaHRZbG9vcCAgCi0gICAgICAgIExEUkIgICAgdGVtcExlZnQyLFtwU3JjRHN0UGxhbmUsaVBsYW5lU3RlcF0gICAgICAgICAgICAgOy8vIFByZUxvYWQgdGhlIHZhbHVlcwotICAgICAgICBMRFJCICAgIHRlbXBSaWdodDIsW3BSaWdodEluZGV4LGlQbGFuZVN0ZXBdCi0gICAgICAgIE1fTERSQiAgdGVtcExlZnQxLFtwU3JjRHN0UGxhbmVdLGlQbGFuZVN0ZXAsTFNMICMxICAgICAgOy8vIFByZUxvYWQgdGhlIHZhbHVlcwotICAgICAgICBNX0xEUkIgIHRlbXBSaWdodDEsW3BSaWdodEluZGV4XSxpUGxhbmVTdGVwLExTTCAjMQotICAgICAgICAgICAgICAKLSAgICAgICAgU1VCICAgICB4LGlFeHBhbmRQZWxzLCM0Ci0gICAgICAgIE1VTCAgICAgdGVtcExlZnQyLHRlbXBMZWZ0MixleHBhbmRUbzRieXRlcyAgICAgICAgICAgICAgOy8vIENvcHkgdGhlIHNpbmdsZSBieXRlIHRvIDQgYnl0ZXMKLSAgICAgICAgTVVMICAgICB0ZW1wUmlnaHQyLHRlbXBSaWdodDIsZXhwYW5kVG80Ynl0ZXMKLSAgICAgICAgTVVMICAgICB0ZW1wTGVmdDEsdGVtcExlZnQxLGV4cGFuZFRvNGJ5dGVzICAgICAgICAgICAgICA7Ly8gQ29weSB0aGUgc2luZ2xlIGJ5dGUgdG8gNCBieXRlcwotICAgICAgICBNVUwgICAgIHRlbXBSaWdodDEsdGVtcFJpZ2h0MSxleHBhbmRUbzRieXRlcwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyB4IGxvb3AKLUV4cGFuZEZyYW1lTGVmdFJpZ2h0WGxvb3AgICAgICAgIAotICAgICAgICBTVUJTICAgIHgseCwjNAotICAgICAgICBTVFIgICAgIHRlbXBMZWZ0MixbcExlZnQsaVBsYW5lU3RlcF0gICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgdGhlIDQgYnl0ZXMgYXQgb25lIGdvCi0gICAgICAgIFNUUiAgICAgdGVtcFJpZ2h0MixbcFJpZ2h0LGlQbGFuZVN0ZXBdCi0gICAgICAgIFNUUiAgICAgdGVtcExlZnQxLFtwTGVmdF0sIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSB0aGUgNCBieXRlcyBhdCBvbmUgZ28KLSAgICAgICAgU1RSICAgICB0ZW1wUmlnaHQxLFtwUmlnaHRdLCM0Ci0gICAgICAgIEJHRSAgICAgRXhwYW5kRnJhbWVMZWZ0UmlnaHRYbG9vcAotICAgICAgICAKLSAgICAgICAgU1VCUyAgICB5LHksIzIKLSAgICAgICAgQUREICAgICBwTGVmdCxwTGVmdCxSb3dTdGVwCi0gICAgICAgIEFERCAgICAgcFJpZ2h0LHBSaWdodCxSb3dTdGVwCi0gICAgICAgIEJHVCAgICAgRXhwYW5kRnJhbWVMZWZ0UmlnaHRZbG9vcAotICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gU2V0IHJldHVybiB2YWx1ZQotICAgICAgICAgIAotICAgICAgICBNT1YgICAgICAgICByZXN1bHQsI09NWF9TdHNfTm9FcnIgIAotRW5kICAgICAgICAgICAgIAotICAgICAgCi0gICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiB0YWlsCi0gICAgICAgIAotICAgICAgICBNX0VORAotICAgICAgICAKLSAgICBFTkRJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9BUk0xMTM2SlMgICAgICAgIAotIAotICAgICAgICAgICAgCi0gICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvYXBpL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9hcGkvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDNkODZiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9hcGkvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfQ0FWTENUYWJsZXMuaAotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogCi0gKiBIZWFkZXIgZmlsZSBmb3Igb3B0aW1pemVkIEguMjY0IENBTFZDIHRhYmxlcwotICogCi0gKi8KLSAKLSNpZm5kZWYgQVJNVkNNNFAxMF9DQVZMQ1RBQkxFU19ICi0jZGVmaW5lIEFSTVZDTTRQMTBfQ0FWTENUQUJMRVNfSAotICAKLS8qIENBVkxDIHRhYmxlcyAqLwotCi1leHRlcm4gY29uc3QgT01YX1UxNiAqYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNbMThdOwotZXh0ZXJuIGNvbnN0IE9NWF9VMTYgKmFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNbMTVdOwotZXh0ZXJuIGNvbnN0IE9NWF9VMTYgKmFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzWzNdOwotZXh0ZXJuIGNvbnN0IE9NWF9VMTYgKmFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNbMTVdOwotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1ppZ1phZ180eDRbMTZdOwotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1ppZ1phZ18yeDJbNF07Ci1leHRlcm4gY29uc3QgT01YX1M4IGFybVZDTTRQMTBfU3VmZml4VG9MZXZlbFs3XTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0F2ZXJhZ2VfNHhfQWxpZ25fdW5zYWZlX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk4ZjBhYy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjM2ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHhfQWxpZ25fdW5zYWZlX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLQotOy8vIEZ1bmN0aW9uczoKLTsvLyAgICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjxBTElHTk1FTlQ+X3Vuc2FmZSAgCi07Ly8KLTsvLyBJbXBsZW1lbnRzIEF2ZXJhZ2Ugb2YgNHg0IHdpdGggZXF1YXRpb24gYyA9IChhK2IrMSk+PjEuCi07Ly8gRmlyc3Qgb3BlcmFuZCB3aWxsIGJlIGF0IG9mZnNldCBBTElHTk1FTlQgZnJvbSBhbGlnbmVkIGFkZHJlc3MKLTsvLyBTZWNvbmQgb3BlcmFuZCB3aWxsIGJlIGF0IGFsaWduZWQgbG9jYXRpb24gYW5kIHdpbGwgYmUgdXNlZCBhcyBvdXRwdXQuCi07Ly8gZGVzdGluYXRpb24gcG9pbnRlZCBieSAocERzdCkgZm9yIHZlcnRpY2FsIGludGVycG9sYXRpb24uCi07Ly8gVGhpcyBmdW5jdGlvbiBuZWVkcyB0byBjb3B5IDQgYnl0ZXMgaW4gaG9yaXpvbnRhbCBkaXJlY3Rpb24gCi07Ly8KLTsvLyBSZWdpc3RlcnMgdXNlZCBhcyBpbnB1dCBmb3IgdGhpcyBmdW5jdGlvbgotOy8vIHIwLHIxLHIyLHIzIHdoZXJlIHIyIGNvbnRhaW5pbmdzIGFsaWduZWQgbWVtb3J5IHBvaW50ZXIgYW5kIHIzIHN0ZXAgc2l6ZQotOy8vCi07Ly8gUmVnaXN0ZXJzIHByZXNlcnZlZCBmb3IgdG9wIGxldmVsIGZ1bmN0aW9uCi07Ly8gcjQscjUscjYscjgscjkscjE0Ci07Ly8KLTsvLyBSZWdpc3RlcnMgbW9kaWZpZWQgYnkgdGhlIGZ1bmN0aW9uCi07Ly8gcjcscjEwLHIxMSxyMTIKLTsvLwotOy8vIE91dHB1dCByZWdpc3RlcnMKLTsvLyByMiAtIHBvaW50ZXIgdG8gdGhlIGFsaWduZWQgbG9jYXRpb24KLTsvLyByMyAtIHN0ZXAgc2l6ZSB0byB0aGlzIGFsaWduZWQgbG9jYXRpb24KLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotCi0gICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMF91bnNhZmUKLSAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24yX3Vuc2FmZQotICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjNfdW5zYWZlCi0KLURFQlVHX09OICAgIFNFVEwge0ZBTFNFfQotCi07Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKLXBQcmVkMCAgICAgICAgICBSTiAwCi1pUHJlZFN0ZXAwICAgICAgUk4gMQotcFByZWQxICAgICAgICAgIFJOIDIKLWlQcmVkU3RlcDEgICAgICBSTiAzCi1wRHN0UHJlZCAgICAgICAgUk4gMgotaURzdFN0ZXAgICAgICAgIFJOIDMKLQotOy8vIERlY2xhcmUgb3RoZXIgaW50ZXJtZWRpYXRlIHJlZ2lzdGVycwotaVByZWRBMCAgICAgICAgIFJOIDEwCi1pUHJlZEExICAgICAgICAgUk4gMTEKLWlQcmVkQjAgICAgICAgICBSTiAxMgotaVByZWRCMSAgICAgICAgIFJOIDE0Ci1UZW1wMSAgICAgICAgICAgUk4gNAotVGVtcDIgICAgICAgICAgIFJOIDUKLVJlc3VsdEEgICAgICAgICBSTiA1Ci1SZXN1bHRCICAgICAgICAgUk4gNAotcjB4ODA4MDgwODAgICAgIFJOIDcKLQotICAgIElGIEFSTTExMzZKUwotICAgICAgICAKLSAgICAgICAgOy8vIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyBhdmVyYWdlIG9mIDR4NCBibG9jayAKLSAgICAgICAgOy8vIHBQcmVkMCBpcyBhdCBhbGlnbm1lbnQgb2Zmc2V0IDAgYW5kIHBQcmVkMSBpcyBhbGlnbm1lbnQgNAotCi0gICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMF91bnNhZmUsIHI2Ci0KLSAgICAgICAgOy8vIENvZGUgc3RhcnQgICAgICAgIAotICAgICAgICBMRFIgICAgICAgICByMHg4MDgwODA4MCwgPTB4ODA4MDgwODAKLQotICAgICAgICA7Ly8gMXN0IGxvYWQKLSAgICAgICAgTV9MRFIgICAgICAgaVByZWRCMCwgW3BQcmVkMV0KLSAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMCwgW3BQcmVkMF0sIGlQcmVkU3RlcDAgICAgICAgIAotICAgICAgICBNX0xEUiAgICAgICBpUHJlZEIxLCBbcFByZWQxLCBpUHJlZFN0ZXAxXQotICAgICAgICBNX0xEUiAgICAgICBpUHJlZEExLCBbcFByZWQwXSwgaVByZWRTdGVwMAotCi0gICAgICAgIDsvLyAoYStiKzEpLzIgPSAoYSsyNTYtKDI1NS1iKSkvMiA9IChhLSgyNTUtYikpLzIgKyAxMjgKLSAgICAgICAgTVZOICAgICAgICAgaVByZWRCMCwgaVByZWRCMAotICAgICAgICBNVk4gICAgICAgICBpUHJlZEIxLCBpUHJlZEIxCi0gICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEEsIGlQcmVkQTAsIGlQcmVkQjAKLSAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QiwgaVByZWRBMSwgaVByZWRCMQotICAgICAgICBFT1IgICAgICAgICBSZXN1bHRBLCBSZXN1bHRBLCByMHg4MDgwODA4MAotICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRBLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCi0gICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEIsIFJlc3VsdEIsIHIweDgwODA4MDgwCi0gICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEIsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyAybmQgbG9hZAotICAgICAgICBNX0xEUiAgICAgICBpUHJlZEEwLCBbcFByZWQwXSwgaVByZWRTdGVwMCAgICAgICAgCi0gICAgICAgIE1fTERSICAgICAgIGlQcmVkQjAsIFtwUHJlZDFdCi0gICAgICAgIE1fTERSICAgICAgIGlQcmVkQTEsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwCi0gICAgICAgIE1fTERSICAgICAgIGlQcmVkQjEsIFtwUHJlZDEsIGlQcmVkU3RlcDFdCi0KLSAgICAgICAgTVZOICAgICAgICAgaVByZWRCMCwgaVByZWRCMAotICAgICAgICBVSFNVQjggICAgICBSZXN1bHRBLCBpUHJlZEEwLCBpUHJlZEIwCi0gICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjEsIGlQcmVkQjEKLSAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QiwgaVByZWRBMSwgaVByZWRCMQotICAgICAgICBFT1IgICAgICAgICBSZXN1bHRBLCBSZXN1bHRBLCByMHg4MDgwODA4MCAgICAgICAgCi0gICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEEsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKLSAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QiwgUmVzdWx0QiwgcjB4ODA4MDgwODAKLSAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QiwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgICAgICAgICAgCi1FbmQwCi0gICAgICAgIE1fRU5ECi0KLSAgICAgICAgOy8vIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyBhdmVyYWdlIG9mIDR4NCBibG9jayAKLSAgICAgICAgOy8vIHBQcmVkMCBpcyBhdCBhbGlnbm1lbnQgb2Zmc2V0IDIgYW5kIHBQcmVkMSBpcyBhbGlnbm1lbnQgNAotCi0gICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMl91bnNhZmUsIHI2Ci0KLSAgICAgICAgOy8vIENvZGUgc3RhcnQgICAgICAgIAotICAgICAgICBMRFIgICAgICAgICByMHg4MDgwODA4MCwgPTB4ODA4MDgwODAKLQotICAgICAgICA7Ly8gMXN0IGxvYWQKLSAgICAgICAgTERSICAgICAgICAgVGVtcDEsIFtwUHJlZDAsICM0XQotICAgICAgICBNX0xEUiAgICAgICBpUHJlZEEwLCBbcFByZWQwXSwgaVByZWRTdGVwMCAgICAgICAgCi0gICAgICAgIE1fTERSICAgICAgIGlQcmVkQjAsIFtwUHJlZDFdCi0gICAgICAgIE1fTERSICAgICAgIGlQcmVkQjEsIFtwUHJlZDEsIGlQcmVkU3RlcDFdCi0gICAgICAgIE1fTERSICAgICAgIFRlbXAyLCBbcFByZWQwLCAjNF0KLSAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMSwgW3BQcmVkMF0sIGlQcmVkU3RlcDAKLSAgICAgICAgTVZOICAgICAgICAgaVByZWRCMCwgaVByZWRCMAotICAgICAgICBNVk4gICAgICAgICBpUHJlZEIxLCBpUHJlZEIxICAgICAgICAKLSAgICAgICAgTU9WICAgICAgICAgaVByZWRBMCwgaVByZWRBMCwgTFNSICMxNgotICAgICAgICBPUlIgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBUZW1wMSwgTFNMICMxNiAgICAgICAgCi0gICAgICAgIE1PViAgICAgICAgIGlQcmVkQTEsIGlQcmVkQTEsIExTUiAjMTYKLSAgICAgICAgT1JSICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgVGVtcDIsIExTTCAjMTYKLQotICAgICAgICA7Ly8gKGErYisxKS8yID0gKGErMjU2LSgyNTUtYikpLzIgPSAoYS0oMjU1LWIpKS8yICsgMTI4Ci0gICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEEsIGlQcmVkQTAsIGlQcmVkQjAKLSAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QiwgaVByZWRBMSwgaVByZWRCMQotICAgICAgICBFT1IgICAgICAgICBSZXN1bHRBLCBSZXN1bHRBLCByMHg4MDgwODA4MAotICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRBLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCi0gICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEIsIFJlc3VsdEIsIHIweDgwODA4MDgwCi0gICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEIsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyAybmQgbG9hZAotICAgICAgICBMRFIgICAgICAgICBUZW1wMSwgW3BQcmVkMCwgIzRdCi0gICAgICAgIE1fTERSICAgICAgICAgaVByZWRBMCwgW3BQcmVkMF0sIGlQcmVkU3RlcDAgICAgICAgIAotICAgICAgICBMRFIgICAgICAgICBpUHJlZEIwLCBbcFByZWQxXQotICAgICAgICBMRFIgICAgICAgICBpUHJlZEIxLCBbcFByZWQxLCBpUHJlZFN0ZXAxXQotICAgICAgICBMRFIgICAgICAgICBUZW1wMiwgW3BQcmVkMCwgIzRdCi0gICAgICAgIE1fTERSICAgICAgICAgaVByZWRBMSwgW3BQcmVkMF0sIGlQcmVkU3RlcDAKLSAgICAgICAgTVZOICAgICAgICAgaVByZWRCMCwgaVByZWRCMAotICAgICAgICBNVk4gICAgICAgICBpUHJlZEIxLCBpUHJlZEIxCi0gICAgICAgIE1PViAgICAgICAgIGlQcmVkQTAsIGlQcmVkQTAsIExTUiAjMTYKLSAgICAgICAgT1JSICAgICAgICAgaVByZWRBMCwgaVByZWRBMCwgVGVtcDEsIExTTCAjMTYgICAgICAgIAotICAgICAgICBNT1YgICAgICAgICBpUHJlZEExLCBpUHJlZEExLCBMU1IgIzE2Ci0gICAgICAgIE9SUiAgICAgICAgIGlQcmVkQTEsIGlQcmVkQTEsIFRlbXAyLCBMU0wgIzE2Ci0KLSAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QSwgaVByZWRBMCwgaVByZWRCMAotICAgICAgICBVSFNVQjggICAgICBSZXN1bHRCLCBpUHJlZEExLCBpUHJlZEIxCi0gICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEEsIFJlc3VsdEEsIHIweDgwODA4MDgwICAgICAgICAKLSAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QSwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAotICAgICAgICBFT1IgICAgICAgICBSZXN1bHRCLCBSZXN1bHRCLCByMHg4MDgwODA4MAotICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRCLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgICAgICAgICAKLUVuZDIKLSAgICAgICAgTV9FTkQKLQotCi0gICAgICAgIDsvLyBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgYXZlcmFnZSBvZiA0eDQgYmxvY2sgCi0gICAgICAgIDsvLyBwUHJlZDAgaXMgYXQgYWxpZ25tZW50IG9mZnNldCAzIGFuZCBwUHJlZDEgaXMgYWxpZ25tZW50IDQKLQotICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjNfdW5zYWZlLCByNgotCi0gICAgICAgIDsvLyBDb2RlIHN0YXJ0ICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgcjB4ODA4MDgwODAsID0weDgwODA4MDgwCi0KLSAgICAgICAgOy8vIDFzdCBsb2FkCi0gICAgICAgIExEUiAgICAgICAgIFRlbXAxLCBbcFByZWQwLCAjNF0KLSAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMCwgW3BQcmVkMF0sIGlQcmVkU3RlcDAgICAgICAgIAotICAgICAgICBMRFIgICAgICAgICBpUHJlZEIwLCBbcFByZWQxXQotICAgICAgICBMRFIgICAgICAgICBpUHJlZEIxLCBbcFByZWQxLCBpUHJlZFN0ZXAxXQotICAgICAgICBMRFIgICAgICAgICBUZW1wMiwgW3BQcmVkMCwgIzRdCi0gICAgICAgIE1fTERSICAgICAgIGlQcmVkQTEsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwCi0KLSAgICAgICAgTVZOICAgICAgICAgaVByZWRCMCwgaVByZWRCMAotICAgICAgICBNVk4gICAgICAgICBpUHJlZEIxLCBpUHJlZEIxCi0gICAgICAgIE1PViAgICAgICAgIGlQcmVkQTAsIGlQcmVkQTAsIExTUiAjMjQKLSAgICAgICAgT1JSICAgICAgICAgaVByZWRBMCwgaVByZWRBMCwgVGVtcDEsIExTTCAjOCAgICAgICAgICAgICAgICAKLSAgICAgICAgTU9WICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgTFNSICMyNAotICAgICAgICBPUlIgICAgICAgICBpUHJlZEExLCBpUHJlZEExLCBUZW1wMiwgTFNMICM4Ci0gICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEEsIGlQcmVkQTAsIGlQcmVkQjAKLSAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QiwgaVByZWRBMSwgaVByZWRCMQotICAgICAgICBFT1IgICAgICAgICBSZXN1bHRBLCBSZXN1bHRBLCByMHg4MDgwODA4MAotICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRBLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCi0gICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEIsIFJlc3VsdEIsIHIweDgwODA4MDgwCi0gICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEIsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyAybmQgbG9hZAotICAgICAgICBMRFIgICAgICAgICBUZW1wMSwgW3BQcmVkMCwgIzRdCi0gICAgICAgIE1fTERSICAgICAgIGlQcmVkQTAsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgaVByZWRCMCwgW3BQcmVkMV0KLSAgICAgICAgTERSICAgICAgICAgaVByZWRCMSwgW3BQcmVkMSwgaVByZWRTdGVwMV0KLSAgICAgICAgTERSICAgICAgICAgVGVtcDIsIFtwUHJlZDAsICM0XQotICAgICAgICBNX0xEUiAgICAgICBpUHJlZEExLCBbcFByZWQwXSwgaVByZWRTdGVwMAotCi0gICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjAsIGlQcmVkQjAKLSAgICAgICAgTVZOICAgICAgICAgaVByZWRCMSwgaVByZWRCMQotICAgICAgICBNT1YgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBMU1IgIzI0Ci0gICAgICAgIE9SUiAgICAgICAgIGlQcmVkQTAsIGlQcmVkQTAsIFRlbXAxLCBMU0wgIzggICAgICAgIAotICAgICAgICBNT1YgICAgICAgICBpUHJlZEExLCBpUHJlZEExLCBMU1IgIzI0Ci0gICAgICAgIE9SUiAgICAgICAgIGlQcmVkQTEsIGlQcmVkQTEsIFRlbXAyLCBMU0wgIzgKLQotICAgICAgICBVSFNVQjggICAgICBSZXN1bHRBLCBpUHJlZEEwLCBpUHJlZEIwCi0gICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEIsIGlQcmVkQTEsIGlQcmVkQjEKLSAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QSwgUmVzdWx0QSwgcjB4ODA4MDgwODAgICAgICAgIAotICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRBLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCi0gICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEIsIFJlc3VsdEIsIHIweDgwODA4MDgwCi0gICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEIsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAgICAgICAgIAotRW5kMwotICAgICAgICBNX0VORAotCi0gICAgRU5ESUYKLSAgICAKLSAgICBFTkQKLSAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiODRjOGQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiAKLSAqIE9wdGltaXplZCBDQVZMQyB0YWJsZXMgZm9yIEguMjY0Ci0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0KLSNpbmNsdWRlICJhcm1WQ000UDEwX0NBVkxDVGFibGVzLmgiCi0KLS8qIDR4NCBEZVppZ1phZyB0YWJsZSAqLwotCi1jb25zdCBPTVhfVTggYXJtVkNNNFAxMF9aaWdaYWdfNHg0WzE2XSA9Ci17Ci0gICAgMCwgMSwgNCwgOCwgNSwgMiwgMywgNiwgOSwgMTIsIDEzLCAxMCwgNywgMTEsIDE0LCAxNQotfTsKLQotLyogMngyIERlWmlnWmFnIHRhYmxlICovCi0KLWNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1ppZ1phZ18yeDJbNF0gPQotewotICAgIDAsIDEsIDIsIDMKLX07Ci0KLQotLyoKLSAqIFN1ZmZpeCBUbyBMZXZlbCB0YWJsZQotICogV2UgaW5jcmVtZW50IHRoZSBzdWZmaXggbGVuZ3RoIGlmIAotICogKChMZXZlbENvZGU+PjEpKzEpPigzPDwoU3VmZml4TGVuZ3RoLTEpKSAmJiBTdWZmaXhMZW5ndGg8NgotICogKExldmVsQ29kZT4+MSk+PSgzPDwoU3VmZml4TGVuZ3RoLTEpKSAgICAmJiBTdWZmaXhMZW5ndGg8NgotICogIExldmVsQ29kZSAgICA+PSAzPDxTdWZmaXhMZW5ndGggICAgICAgICAmJiBTdWZmaXhMZW5ndGg8NgotICogKExldmVsQ29kZSsyKSA+PSAoMzw8U3VmZml4TGVuZ3RoKSsyICAgICAmJiBTdWZmaXhMZW5ndGg8NgotICovCi1jb25zdCBPTVhfUzggYXJtVkNNNFAxMF9TdWZmaXhUb0xldmVsWzddID0KLXsKLSAgICAoMzw8MSkrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTEgKi8KLSAgICAoMzw8MSkrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTEgKi8KLSAgICAoMzw8MikrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTIgKi8KLSAgICAoMzw8MykrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTMgKi8KLSAgICAoMzw8NCkrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTQgKi8KLSAgICAoMzw8NSkrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTUgKi8KLSAgICAtMSAgICAgICAgICAgICAgLyogU3VmZml4TGVuZ3RoPTYgLSBuZXZlciBpbmNyZW1lbnQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzBbMTMyXSA9IHsKLSAgICAweDAwMjAsIDB4MDEwMCwgMHgyMDE1LCAweDIwMTUsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwKLSAgICAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwKLSAgICAweDAwMjgsIDB4MDBmMCwgMHgwMGY4LCAweDAwMjcsIDB4MDAzMCwgMHgwMGQ4LCAweDAwZTAsIDB4MDBlOCwKLSAgICAweDAwMzgsIDB4MDBhMCwgMHgwMGM4LCAweDAwZDAsIDB4MDA0MCwgMHgwMDY4LCAweDAwOTAsIDB4MDA5OCwKLSAgICAweDAwNDgsIDB4MDA1MCwgMHgwMDU4LCAweDAwNjAsIDB4MjdmZiwgMHgyN2ZmLCAweDIwNmIsIDB4MjA2YiwKLSAgICAweDAwODEsIDB4MDA4NSwgMHgwMDgzLCAweDAwNzksIDB4MDA4NywgMHgwMDdkLCAweDAwN2IsIDB4MDA3MSwKLSAgICAweDAwN2YsIDB4MDA3NSwgMHgwMDczLCAweDAwNjksIDB4MDA3MCwgMHgwMDc4LCAweDAwODAsIDB4MDA4OCwKLSAgICAweDIwNzcsIDB4MjA3NywgMHgyMDZkLCAweDIwNmQsIDB4MjA2MywgMHgyMDYzLCAweDIwNjEsIDB4MjA2MSwKLSAgICAweDIwNmYsIDB4MjA2ZiwgMHgyMDY1LCAweDIwNjUsIDB4MjA1YiwgMHgyMDViLCAweDIwNTksIDB4MjA1OSwKLSAgICAweDAwNjcsIDB4MDA1ZCwgMHgwMDUzLCAweDAwNTEsIDB4MDA1ZiwgMHgwMDU1LCAweDAwNGIsIDB4MDA0OSwKLSAgICAweDAwYTgsIDB4MDBiMCwgMHgwMGI4LCAweDAwYzAsIDB4MjA0MSwgMHgyMDQxLCAweDIwNGQsIDB4MjA0ZCwKLSAgICAweDIwNDMsIDB4MjA0MywgMHgyMDM5LCAweDIwMzksIDB4MjA1NywgMHgyMDU3LCAweDIwNDUsIDB4MjA0NSwKLSAgICAweDIwM2IsIDB4MjAzYiwgMHgyMDMxLCAweDIwMzEsIDB4MjA0ZiwgMHgyMDRmLCAweDIwM2QsIDB4MjAzZCwKLSAgICAweDIwMzMsIDB4MjAzMywgMHgyMDI5LCAweDIwMjksIDB4MDA0NywgMHgwMDM1LCAweDAwMmIsIDB4MDAyMSwKLSAgICAweDIwM2YsIDB4MjAzZiwgMHgyMDJkLCAweDIwMmQsIDB4MjAyMywgMHgyMDIzLCAweDIwMTksIDB4MjAxOSwKLSAgICAweDAwMzcsIDB4MDAyNSwgMHgwMDFiLCAweDAwMTEsIDB4MjAyZiwgMHgyMDJmLCAweDIwMWQsIDB4MjAxZCwKLSAgICAweDAwMTMsIDB4MDAwOSwgMHgyMDFmLCAweDIwMWYKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzFbMTI4XSA9IHsKLSAgICAweDAwMjAsIDB4MDBlOCwgMHgwMGYwLCAweDAwZjgsIDB4MDAyNywgMHgwMDFmLCAweDIwMTUsIDB4MjAxNSwKLSAgICAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwKLSAgICAweDAwMjgsIDB4MDBkMCwgMHgwMGQ4LCAweDAwZTAsIDB4MDAzMCwgMHgwMDk4LCAweDAwYzAsIDB4MDBjOCwKLSAgICAweDAwMzgsIDB4MDA2MCwgMHgwMDg4LCAweDAwOTAsIDB4MDA0MCwgMHgwMDQ4LCAweDAwNTAsIDB4MDA1OCwKLSAgICAweDI3ZmYsIDB4MjdmZiwgMHgyMDdmLCAweDIwN2YsIDB4MDA4NywgMHgwMDg1LCAweDAwODMsIDB4MDA4MSwKLSAgICAweDAwN2IsIDB4MDA3OSwgMHgwMDdkLCAweDAwNzMsIDB4MjA3NSwgMHgyMDc1LCAweDIwNzEsIDB4MjA3MSwKLSAgICAweDAwNjgsIDB4MDA3MCwgMHgwMDc4LCAweDAwODAsIDB4MjA3NywgMHgyMDc3LCAweDIwNmQsIDB4MjA2ZCwKLSAgICAweDIwNmIsIDB4MjA2YiwgMHgyMDY5LCAweDIwNjksIDB4MjA2ZiwgMHgyMDZmLCAweDIwNjUsIDB4MjA2NSwKLSAgICAweDIwNjMsIDB4MjA2MywgMHgyMDYxLCAweDIwNjEsIDB4MDA1OSwgMHgwMDVkLCAweDAwNWIsIDB4MDA1MSwKLSAgICAweDAwNjcsIDB4MDA1NSwgMHgwMDUzLCAweDAwNDksIDB4MDBhMCwgMHgwMGE4LCAweDAwYjAsIDB4MDBiOCwKLSAgICAweDIwNWYsIDB4MjA1ZiwgMHgyMDRkLCAweDIwNGQsIDB4MjA0YiwgMHgyMDRiLCAweDIwNDEsIDB4MjA0MSwKLSAgICAweDIwNTcsIDB4MjA1NywgMHgyMDQ1LCAweDIwNDUsIDB4MjA0MywgMHgyMDQzLCAweDIwMzksIDB4MjAzOSwKLSAgICAweDIwNGYsIDB4MjA0ZiwgMHgyMDNkLCAweDIwM2QsIDB4MjAzYiwgMHgyMDNiLCAweDIwMzEsIDB4MjAzMSwKLSAgICAweDAwMjksIDB4MDAzNSwgMHgwMDMzLCAweDAwMjEsIDB4MjA0NywgMHgyMDQ3LCAweDIwMmQsIDB4MjAyZCwKLSAgICAweDIwMmIsIDB4MjAyYiwgMHgyMDE5LCAweDIwMTksIDB4MDAzZiwgMHgwMDI1LCAweDAwMjMsIDB4MDAxMSwKLSAgICAweDAwMzcsIDB4MDAxZCwgMHgwMDFiLCAweDAwMDksIDB4MjAyZiwgMHgyMDJmLCAweDIwMTMsIDB4MjAxMwotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMlsxMTJdID0gewotICAgIDB4MDAyMCwgMHgwMDg4LCAweDAwYjAsIDB4MDBiOCwgMHgwMGMwLCAweDAwYzgsIDB4MDBkMCwgMHgwMGQ4LAotICAgIDB4MDAzZiwgMHgwMDM3LCAweDAwMmYsIDB4MDAyNywgMHgwMDFmLCAweDAwMTUsIDB4MDAwYiwgMHgwMDAxLAotICAgIDB4MDAyOCwgMHgwMDUwLCAweDAwNzgsIDB4MDA4MCwgMHgwMDMwLCAweDAwMzgsIDB4MDA0MCwgMHgwMDQ4LAotICAgIDB4MDdmZiwgMHgwMDgxLCAweDAwODcsIDB4MDA4NSwgMHgwMDgzLCAweDAwNzksIDB4MDA3ZiwgMHgwMDdkLAotICAgIDB4MDA3YiwgMHgwMDcxLCAweDAwNzcsIDB4MDA3NSwgMHgwMDczLCAweDAwNjksIDB4MjA2YiwgMHgyMDZiLAotICAgIDB4MDA1OCwgMHgwMDYwLCAweDAwNjgsIDB4MDA3MCwgMHgyMDYxLCAweDIwNjEsIDB4MjA2ZCwgMHgyMDZkLAotICAgIDB4MjA2MywgMHgyMDYzLCAweDIwNTksIDB4MjA1OSwgMHgyMDZmLCAweDIwNmYsIDB4MjA2NSwgMHgyMDY1LAotICAgIDB4MjA1YiwgMHgyMDViLCAweDIwNTEsIDB4MjA1MSwgMHgwMDY3LCAweDAwNWQsIDB4MDA1MywgMHgwMDQ5LAotICAgIDB4MDA1ZiwgMHgwMDU1LCAweDAwNGIsIDB4MDA0MSwgMHgwMDkwLCAweDAwOTgsIDB4MDBhMCwgMHgwMGE4LAotICAgIDB4MjAzOSwgMHgyMDM5LCAweDIwMzEsIDB4MjAzMSwgMHgyMDRkLCAweDIwNGQsIDB4MjAyOSwgMHgyMDI5LAotICAgIDB4MjA1NywgMHgyMDU3LCAweDIwNDUsIDB4MjA0NSwgMHgyMDQzLCAweDIwNDMsIDB4MjAyMSwgMHgyMDIxLAotICAgIDB4MDAxOSwgMHgwMDNkLCAweDAwM2IsIDB4MDAxMSwgMHgwMDRmLCAweDAwMzUsIDB4MDAzMywgMHgwMDA5LAotICAgIDB4MjAyYiwgMHgyMDJiLCAweDIwMmQsIDB4MjAyZCwgMHgyMDIzLCAweDIwMjMsIDB4MjAyNSwgMHgyMDI1LAotICAgIDB4MjAxYiwgMHgyMDFiLCAweDIwNDcsIDB4MjA0NywgMHgyMDFkLCAweDIwMWQsIDB4MjAxMywgMHgyMDEzCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zWzgwXSA9IHsKLSAgICAweDAwMjAsIDB4MDAyOCwgMHgwMDMwLCAweDAwMzgsIDB4MDA0MCwgMHgwMDQ4LCAweDAwNTAsIDB4MDA1OCwKLSAgICAweDAwNjAsIDB4MDA2OCwgMHgwMDcwLCAweDAwNzgsIDB4MDA4MCwgMHgwMDg4LCAweDAwOTAsIDB4MDA5OCwKLSAgICAweDAwMDksIDB4MDAwYiwgMHgwN2ZmLCAweDAwMDEsIDB4MDAxMSwgMHgwMDEzLCAweDAwMTUsIDB4MDdmZiwKLSAgICAweDAwMTksIDB4MDAxYiwgMHgwMDFkLCAweDAwMWYsIDB4MDAyMSwgMHgwMDIzLCAweDAwMjUsIDB4MDAyNywKLSAgICAweDAwMjksIDB4MDAyYiwgMHgwMDJkLCAweDAwMmYsIDB4MDAzMSwgMHgwMDMzLCAweDAwMzUsIDB4MDAzNywKLSAgICAweDAwMzksIDB4MDAzYiwgMHgwMDNkLCAweDAwM2YsIDB4MDA0MSwgMHgwMDQzLCAweDAwNDUsIDB4MDA0NywKLSAgICAweDAwNDksIDB4MDA0YiwgMHgwMDRkLCAweDAwNGYsIDB4MDA1MSwgMHgwMDUzLCAweDAwNTUsIDB4MDA1NywKLSAgICAweDAwNTksIDB4MDA1YiwgMHgwMDVkLCAweDAwNWYsIDB4MDA2MSwgMHgwMDYzLCAweDAwNjUsIDB4MDA2NywKLSAgICAweDAwNjksIDB4MDA2YiwgMHgwMDZkLCAweDAwNmYsIDB4MDA3MSwgMHgwMDczLCAweDAwNzUsIDB4MDA3NywKLSAgICAweDAwNzksIDB4MDA3YiwgMHgwMDdkLCAweDAwN2YsIDB4MDA4MSwgMHgwMDgzLCAweDAwODUsIDB4MDA4NwotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfNFszMl0gPSB7Ci0gICAgMHgwMDIwLCAweDAwMzgsIDB4MjAxNSwgMHgyMDE1LCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsCi0gICAgMHg2MDBiLCAweDYwMGIsIDB4NjAwYiwgMHg2MDBiLCAweDYwMGIsIDB4NjAwYiwgMHg2MDBiLCAweDYwMGIsCi0gICAgMHgwMDI4LCAweDAwMzAsIDB4MDAyMSwgMHgwMDE5LCAweDIwMjcsIDB4MjAyNywgMHgwMDI1LCAweDAwMjMsCi0gICAgMHgyMDFkLCAweDIwMWQsIDB4MjAxYiwgMHgyMDFiLCAweDAwMTEsIDB4MDAxZiwgMHgwMDEzLCAweDAwMDkKLX07Ci0KLWNvbnN0IE9NWF9VMTYgKiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc1sxOF0gPSB7Ci0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMCwgLyogbkM9MCAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzAsIC8qIG5DPTEgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18xLCAvKiBuQz0yICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMSwgLyogbkM9MyAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzIsIC8qIG5DPTQgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18yLCAvKiBuQz01ICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMiwgLyogbkM9NiAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzIsIC8qIG5DPTcgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz04ICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9OSAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTEwICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9MTEgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz0xMiAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTEzICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9MTQgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz0xNSAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTE2ICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfNCAgLyogbkM9LTEgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMFs0MF0gPSB7Ci0gICAgMHgwMDIwLCAweDAwNDgsIDB4MDAwOSwgMHgwMDA3LCAweDIwMDUsIDB4MjAwNSwgMHgyMDAzLCAweDIwMDMsCi0gICAgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsCi0gICAgMHgwMDI4LCAweDAwNDAsIDB4MDAxMSwgMHgwMDBmLCAweDAwMzAsIDB4MDAzOCwgMHgwMDE5LCAweDAwMTcsCi0gICAgMHgyN2ZmLCAweDI3ZmYsIDB4MjAxZiwgMHgyMDFmLCAweDIwMWQsIDB4MjAxZCwgMHgyMDFiLCAweDIwMWIsCi0gICAgMHgyMDE1LCAweDIwMTUsIDB4MjAxMywgMHgyMDEzLCAweDIwMGQsIDB4MjAwZCwgMHgyMDBiLCAweDIwMGIKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMVsyNF0gPSB7Ci0gICAgMHgwMDIwLCAweDAwMjgsIDB4MDAxMSwgMHgwMDBmLCAweDAwMGQsIDB4MDAwYiwgMHgyMDA5LCAweDIwMDksCi0gICAgMHgyMDA3LCAweDIwMDcsIDB4MjAwNSwgMHgyMDA1LCAweDIwMDMsIDB4MjAwMywgMHgyMDAxLCAweDIwMDEsCi0gICAgMHgwMDFkLCAweDAwMWIsIDB4MDAxOSwgMHgwMDE3LCAweDIwMTUsIDB4MjAxNSwgMHgyMDEzLCAweDIwMTMKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMlsyNF0gPSB7Ci0gICAgMHgwMDIwLCAweDAwMjgsIDB4MDAxMSwgMHgwMDBiLCAweDAwMDksIDB4MDAwMSwgMHgyMDBmLCAweDIwMGYsCi0gICAgMHgyMDBkLCAweDIwMGQsIDB4MjAwNywgMHgyMDA3LCAweDIwMDUsIDB4MjAwNSwgMHgyMDAzLCAweDIwMDMsCi0gICAgMHgwMDFiLCAweDAwMTcsIDB4MjAxOSwgMHgyMDE5LCAweDIwMTUsIDB4MjAxNSwgMHgyMDEzLCAweDIwMTMKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfM1syNF0gPSB7Ci0gICAgMHgwMDIwLCAweDAwMjgsIDB4MDAxMywgMHgwMDBmLCAweDAwMDcsIDB4MDAwNSwgMHgyMDExLCAweDIwMTEsCi0gICAgMHgyMDBkLCAweDIwMGQsIDB4MjAwYiwgMHgyMDBiLCAweDIwMDksIDB4MjAwOSwgMHgyMDAzLCAweDIwMDMsCi0gICAgMHgyMDE5LCAweDIwMTksIDB4MjAxNywgMHgyMDE3LCAweDIwMTUsIDB4MjAxNSwgMHgyMDAxLCAweDIwMDEKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfNFsyMF0gPSB7Ci0gICAgMHgwMDIwLCAweDAwMTUsIDB4MDAxMSwgMHgwMDA1LCAweDAwMDMsIDB4MDAwMSwgMHgyMDBmLCAweDIwMGYsCi0gICAgMHgyMDBkLCAweDIwMGQsIDB4MjAwYiwgMHgyMDBiLCAweDIwMDksIDB4MjAwOSwgMHgyMDA3LCAweDIwMDcsCi0gICAgMHgyMDE3LCAweDIwMTcsIDB4MjAxMywgMHgyMDEzCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzVbMjBdID0gewotICAgIDB4MDAyMCwgMHgwMDExLCAweDIwMTMsIDB4MjAxMywgMHgyMDBmLCAweDIwMGYsIDB4MjAwZCwgMHgyMDBkLAotICAgIDB4MjAwYiwgMHgyMDBiLCAweDIwMDksIDB4MjAwOSwgMHgyMDA3LCAweDIwMDcsIDB4MjAwNSwgMHgyMDA1LAotICAgIDB4MDAxNSwgMHgwMDAxLCAweDIwMDMsIDB4MjAwMwotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc182WzIwXSA9IHsKLSAgICAweDAwMjAsIDB4MDAwZiwgMHgyMDExLCAweDIwMTEsIDB4MjAwZCwgMHgyMDBkLCAweDIwMDksIDB4MjAwOSwKLSAgICAweDIwMDcsIDB4MjAwNywgMHgyMDA1LCAweDIwMDUsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwKLSAgICAweDAwMTMsIDB4MDAwMSwgMHgyMDAzLCAweDIwMDMKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfN1syMF0gPSB7Ci0gICAgMHgwMDIwLCAweDAwMDMsIDB4MjAwZiwgMHgyMDBmLCAweDIwMGQsIDB4MjAwZCwgMHgyMDA3LCAweDIwMDcsCi0gICAgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLCAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksCi0gICAgMHgwMDExLCAweDAwMDEsIDB4MjAwNSwgMHgyMDA1Ci19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzhbMjBdID0gewotICAgIDB4MDAyMCwgMHgwMDA1LCAweDIwMGIsIDB4MjAwYiwgMHg0MDBkLCAweDQwMGQsIDB4NDAwZCwgMHg0MDBkLAotICAgIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHg0MDA3LCAweDQwMDcsIDB4NDAwNywgMHg0MDA3LAotICAgIDB4MDAwMywgMHgwMDAxLCAweDIwMGYsIDB4MjAwZgotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc185WzIwXSA9IHsKLSAgICAweDAwMjAsIDB4MDAwZCwgMHgyMDA1LCAweDIwMDUsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwKLSAgICAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4NDAwNywgMHg0MDA3LCAweDQwMDcsIDB4NDAwNywKLSAgICAweDIwMDMsIDB4MjAwMywgMHgyMDAxLCAweDIwMDEKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTBbMTZdID0gewotICAgIDB4MDAwMSwgMHgwMDAzLCAweDIwMDUsIDB4MjAwNSwgMHgyMDA3LCAweDIwMDcsIDB4MjAwYiwgMHgyMDBiLAotICAgIDB4NjAwOSwgMHg2MDA5LCAweDYwMDksIDB4NjAwOSwgMHg2MDA5LCAweDYwMDksIDB4NjAwOSwgMHg2MDA5Ci19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzExWzE2XSA9IHsKLSAgICAweDAwMDEsIDB4MDAwMywgMHgyMDA5LCAweDIwMDksIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsIDB4NDAwNSwKLSAgICAweDYwMDcsIDB4NjAwNywgMHg2MDA3LCAweDYwMDcsIDB4NjAwNywgMHg2MDA3LCAweDYwMDcsIDB4NjAwNwotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xMlsxNl0gPSB7Ci0gICAgMHgyMDAxLCAweDIwMDEsIDB4MjAwMywgMHgyMDAzLCAweDQwMDcsIDB4NDAwNywgMHg0MDA3LCAweDQwMDcsCi0gICAgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTNbMTZdID0gewotICAgIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLAotICAgIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1Ci19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzE0WzE2XSA9IHsKLSAgICAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwKLSAgICAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMwotfTsKLQotY29uc3QgT01YX1UxNiAqIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNbMTVdID0gewotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMCwKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzEsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18yLAotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMywKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzQsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc181LAotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfNiwKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzcsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc184LAotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfOSwKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzEwLAotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTEsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xMiwKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzEzLAotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTQKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzXzBbMTZdID0gewotICAgIDB4MjAwNywgMHgyMDA3LCAweDIwMDUsIDB4MjAwNSwgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLAotICAgIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc18xWzE2XSA9IHsKLSAgICAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywKLSAgICAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMQotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNfMlsxNl0gPSB7Ci0gICAgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsCi0gICAgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEKLX07Ci0KLWNvbnN0IE9NWF9VMTYgKiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc1szXSA9IHsKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc18wLAotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzXzEsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNfMgotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18wWzhdID0gewotICAgIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzFbOF0gPSB7Ci0gICAgMHgyMDA1LCAweDIwMDUsIDB4MjAwMywgMHgyMDAzLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfMls4XSA9IHsKLSAgICAweDIwMDcsIDB4MjAwNywgMHgyMDA1LCAweDIwMDUsIDB4MjAwMywgMHgyMDAzLCAweDIwMDEsIDB4MjAwMQotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18zWzhdID0gewotICAgIDB4MDAwOSwgMHgwMDA3LCAweDIwMDUsIDB4MjAwNSwgMHgyMDAzLCAweDIwMDMsIDB4MjAwMSwgMHgyMDAxCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzRbOF0gPSB7Ci0gICAgMHgwMDBiLCAweDAwMDksIDB4MDAwNywgMHgwMDA1LCAweDIwMDMsIDB4MjAwMywgMHgyMDAxLCAweDIwMDEKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNVs4XSA9IHsKLSAgICAweDAwMDMsIDB4MDAwNSwgMHgwMDA5LCAweDAwMDcsIDB4MDAwZCwgMHgwMDBiLCAweDIwMDEsIDB4MjAwMQotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182WzI0XSA9IHsKLSAgICAweDAwMTAsIDB4MDAwZCwgMHgwMDBiLCAweDAwMDksIDB4MDAwNywgMHgwMDA1LCAweDAwMDMsIDB4MDAwMSwKLSAgICAweDAwMTgsIDB4MDAxMSwgMHgyMDBmLCAweDIwMGYsIDB4MDAyMCwgMHgwMDE1LCAweDIwMTMsIDB4MjAxMywKLSAgICAweDAwMjgsIDB4MDAxOSwgMHgyMDE3LCAweDIwMTcsIDB4MDdmZiwgMHgwMDFkLCAweDIwMWIsIDB4MjAxYgotfTsKLQotLyogVGFibGVzIDcgdG8gMTQgYXJlIGR1cGxpY2F0ZXMgb2YgdGFibGUgNiAqLwotCi1jb25zdCBPTVhfVTE2ICogYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc1sxNV0gPSB7Ci0gICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18wLCAgLyogWmVyb3NMZWZ0PTEgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzEsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18yLAotICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfMywKLSAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzQsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc181LCAgLyogWmVyb3NMZWZ0PTYgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9NyAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNiwgIC8qIFplcm9zTGVmdD04ICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182LCAgLyogWmVyb3NMZWZ0PTkgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9MTAgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9MTEgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9MTIgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9MTMgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9MTQgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYgICAvKiBaZXJvc0xlZnQ9MTUgKi8KLX07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFkY2I5Mi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgOTY0MQotOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotCi0KLQotICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYV91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwODUyMzMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzODAgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFfdW5zYWZlX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLSAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLQotCi0KLSAgICBJRiAgQVJNMTEzNkpTCi0KLU1BU0tfMSAgRVFVIDB4MDEwMTAxMDEKLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi0KLXBRMCAgICAgICAgUk4gMAotU3RlcEFyZyAgICBSTiAxCi10QzBBcmcgICAgIFJOIDIKLWFscGhhICAgICAgUk4gNgotCi1iZXRhICAgICAgIFJOIDE0Ci1iUyAgICAgICAgIFJOIDE0Ci10QzAgICAgICAgIFJOIDE0Ci1wdEMwICAgICAgIFJOIDEKLQotOy8vIERlY2xhcmUgTG9jYWwvVGVtcG9yYXJ5IHZhcmlhYmxlcwotCi07Ly8gUGl4ZWxzCi1wXzAgICAgIFJOIDMgCi1wXzEgICAgIFJOIDUgIAotcF8yICAgICBSTiA0ICAKLXBfMyAgICAgUk4gMiAgCi1xXzAgICAgIFJOIDggIAotcV8xICAgICBSTiA5ICAKLXFfMiAgICAgUk4gMTAgCi1xXzMgICAgIFJOIDEyIAotCi0KLTsvLyBGaWx0ZXJpbmcKLQotYXAwcTAgICBSTiAxICAKLWZpbHQgICAgUk4gMgotICAgICAgICAKLW0wMCAgICAgUk4gNwotbTAxICAgICBSTiAxMQotCi1hcGZsZyAgIFJOIDAgCi1hcWZsZyAgIFJOIDYKLQotdEMgICAgICBSTiAxCi0KLQotOy8vRGVjbGFyYXRpb25zIGZvciBiU0xUNCBrZXJuZWwKLQotcG9zICAgICBSTiA3Ci1uZWcgICAgIFJOIDEyCi0KLVAwYSAgICAgUk4gMSAgIAotUDFhICAgICBSTiA4ICAgCi1RMGEgICAgIFJOIDcgIAotUTFhICAgICBSTiA0ICAgCi0KLXUxICAgICAgUk4gMyAgIAotbWF4ICAgICBSTiAxMgotbWluICAgICBSTiAyICAgCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLTsvL0RlY2xhcmF0aW9ucyBmb3IgYlNHRTQga2VybmVsCi0KLXFfM2IgICAgUk4gOSAgIAotcF8zYiAgICBSTiAwCi1hcHFmbGcgIFJOIDEyCi0KLVAwYiAgICAgUk4gNgotUDFiICAgICBSTiA3IAotUDJiICAgICBSTiAxCi0KLVEwYiAgICAgUk4gOSAKLVExYiAgICAgUk4gMCAKLVEyYiAgICAgUk4gMgotCi07Ly8gTWlzY2VsbGFub3VzCi0KLWEgICAgICAgUk4gMAotdDAgICAgICBSTiAzIAotdDEgICAgICBSTiAxMgotdDIgICAgICBSTiA3Ci10MyAgICAgIFJOIDExCi10NCAgICAgIFJOIDQgICAKLXQ1ICAgICAgUk4gMSAgIAotdDggICAgICBSTiA2ICAgCi10OSAgICAgIFJOIDE0ICAKLXQxMCAgICAgUk4gNSAgIAotdDExICAgICBSTiA5ICAgCi0KLTsvLyBSZWdpc3RlciB1c2FnZSBmb3IgLSBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlKCkKLTsvLwotOy8vIElucHV0cyAtIDMsNCw1LDgsOSwxMCAtIElucHV0IFBpeGVscyAocDAtcDIscTAtcTIpCi07Ly8gICAgICAgIC0gMiAtIGZpbHQsIDAgLSBhcGZsZywgNiAtIGFxZmxnCi07Ly8gICAgICAgIC0gMTEgLSBtMDEsIDcgLSB0QzAKLTsvLyAgICAgICAgIAotOy8vIE91dHB1dHMgLSAxLDgsNywxMSAtIE91dHB1dCBQaXhlbHMoUDBhLFAxYSxRMGEsUTFhKQotOy8vCi07Ly8gUmVnaXN0ZXJzIENvcnJ1cHRlZCAtIDAtMyw1LTEyLDE0Ci0KLQotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUsIGxyCi0KLSAgICAgICAgOy8vIFNpbmNlIGJldGEgPD0gMTggYW5kIGFscGhhIDw9IDI1NSB3ZSBrbm93Ci0gICAgICAgIDsvLyAtMjU0IDw9IHAwLXEwIDw9IDI1NAotICAgICAgICA7Ly8gIC0xNyA8PSBxMS1xMCA8PSAxNwotICAgICAgICA7Ly8gIC0xNyA8PSBwMS1wMCA8PSAxNwotCi0gICAgICAgIDsvLyBkZWx0YSA9IENsaXAzKCAtdEMsIHRDLCAoKCgocTAtcDApPDwyKSArIChwMS1xMSkgKyA0KT4+MykpCi0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vICAgIENhbGN1bGF0ZSBBID0gKCgocTAtcDApPDwyKSArIChwMS1xMSkgKyA0KT4+MwotICAgICAgICA7Ly8gICAgICAgICAgICAgICAgPSAoNCpxMCAtIDQqcDAgKyBwMSAtIHExICsgNCk+PjMKLSAgICAgICAgOy8vICAgICAgICAgICAgICAgID0gKChwMS1wMCkgLSAocTEtcTApIC0gMyoocDAtcTApICsgNCk+PjMKLSAgICAgICAgCi0gICAgICAgIFVTVUI4ICAgdDEsIHBfMSwgcF8wCi0gICAgICAgIE1VTCAgICAgdEMwLCB0MiwgbTAxCi0gICAgICAgIAotICAgICAgICBVU1VCOCAgIHQyLCBxXzEsIHFfMAotICAgICAgICBTU1VCOCAgIHQxLCB0MSwgdDIKLQotICAgICAgICBVU1VCOCAgIHQyLCBwXzAsIHFfMAotICAgICAgICBBTkQgICAgIHQyLCB0MiwgbTAxCi0gICAgICAgIFNIU1VCOCAgdDEsIHQxLCB0MgotICAgICAgICBVSFNVQjggIHQ1LCBwXzAsIHFfMAotICAgICAgICBTU1VCOCAgIHQxLCB0MSwgdDIKLSAgICAgICAgU0hTVUI4ICB0MSwgdDEsIHQ1Ci0gICAgICAgIE1PViAgICAgbTAwLCAjMAotICAgICAgICBTQUREOCAgIHQxLCB0MSwgbTAxCi0gICAgICAgIFNIU1VCOCAgdDEsIHQxLCB0NQotICAgICAgICAKLSAgICAgICAgOy8vIHRDID0gdEMwCi0gICAgICAgIDsvLyBpZiAoYXAgPCBiZXRhKSB0QysrOwotICAgICAgICA7Ly8gaWYgKGFxIDwgYmV0YSkgdEMrKzsKLSAgICAgICAgVVNVQjggICB0NSwgZmlsdCwgbTAxICAgCi0gICAgICAgIFNFTCAgICAgdEMwLCB0QzAsIG0wMAotICAgICAgICBVUUFERDggIHRDLCB0QzAsIGFwZmxnCi0gICAgICAgIFNTVUI4ICAgdDEsIHQxLCBtMDAKLSAgICAgICAgVVFBREQ4ICB0QywgdEMsIGFxZmxnCi0KLSAgICAgICAgOy8vIFNwbGl0IGludG8gcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHBhcnQgYW5kIGNsaXAgCi0gICAgICAgIFNFTCAgICAgcG9zLCB0MSwgbTAwCi0gICAgICAgIFVTVUI4ICAgbmVnLCBwb3MsIHQxCi0gICAgICAgIFVTVUI4ICAgdDMsIHBvcywgdEMKLSAgICAgICAgU0VMICAgICBwb3MsIHRDLCBwb3MKLSAgICAgICAgVVNVQjggICB0MywgbmVnLCB0QwotICAgICAgICBTRUwgICAgIG5lZywgdEMsIG5lZwotICAgICAgICAKLSAgICAgICAgOy8vUmVsb2FkIG0wMQotICAgICAgICBMRFIgICAgIG0wMSw9TUFTS18xCi0KLSAgICAgICAgVVFBREQ4ICBQMGEsIHBfMCwgcG9zCi0gICAgICAgIFVRU1VCOCAgUTBhLCBxXzAsIHBvcwotICAgICAgICBVUVNVQjggIFAwYSwgUDBhLCBuZWcKLSAgICAgICAgVVFBREQ4ICBRMGEsIFEwYSwgbmVnCi0gICAgICAgIAotICAgICAgICA7Ly8gQ2hvb3NlIHRvIHN0b3JlIHRoZSBmaWx0ZXJlZAotICAgICAgICA7Ly8gdmFsdWUgb3IgdGhlIG9yaWdpbmFsIHBpeGVsCi0gICAgICAgIFVTVUI4ICAgdDEsIGZpbHQsIG0wMSAgICAKLSAgICAgICAgU0VMICAgICBQMGEsIFAwYSwgcF8wCi0gICAgICAgIFNFTCAgICAgUTBhLCBRMGEsIHFfMAotICAgIAotICAgICAgICA7Ly8gZGVsdGEgPSAocDIgKyAoKHAwK3EwKzEpPj4xKSAtIChwMTw8MSkpPj4xOwotICAgICAgICA7Ly8gdTEgPSAocDAgKyBxMCArIDEpPj4xCi0gICAgICAgIDsvLyB1MSA9ICggKHFfMCAtIHBfMCcpPj4xICkgXiAweDgwCi0gICAgICAgIE1WTiAgICAgcF8wLCBwXzAKLSAgICAgICAgVUhTVUI4ICB1MSwgcV8wLCBwXzAgCi0gICAgICAgIFVRQUREOCAgbWF4LCBwXzEsIHRDMAotICAgICAgICBFT1IgICAgIHUxLCB1MSwgbTAxICxMU0wgIzcKLSAgICAKLSAgICAgICAgOy8vIENhbGN1bGF0ZSBBID0gKHAyK3UxKT4+MSAKLSAgICAgICAgOy8vIFRoZW4gZGVsdGEgPSBDbGlwMyggLXRDMCwgdEMwLCBBIC0gcDEpCi0KLSAgICAgICAgOy8vIENsaXAgUDEKLSAgICAgICAgVUhBREQ4ICBQMWEsIHBfMiwgdTEKLSAgICAgICAgVVFTVUI4ICBtaW4sIHBfMSwgdEMwCi0gICAgICAgIFVTVUI4ICAgdDQsIFAxYSwgbWF4Ci0gICAgICAgIFNFTCAgICAgUDFhLCBtYXgsIFAxYQotICAgICAgICBVU1VCOCAgIHQ0LCBQMWEsIG1pbgotICAgICAgICBTRUwgICAgIFAxYSwgUDFhLCBtaW4KLQotICAgICAgICA7Ly8gQ2xpcCBRMQotICAgICAgICBVSEFERDggIFExYSwgcV8yLCB1MQotICAgICAgICBVUUFERDggIG1heCwgcV8xLCB0QzAKLSAgICAgICAgVVFTVUI4ICBtaW4sIHFfMSwgdEMwCi0gICAgICAgIFVTVUI4ICAgdDAsIFExYSwgbWF4Ci0gICAgICAgIFNFTCAgICAgUTFhLCBtYXgsIFExYQotICAgICAgICBVU1VCOCAgIHQwLCBRMWEsIG1pbgotICAgICAgICBTRUwgICAgIFExYSwgUTFhLCBtaW4KLSAgICAgICAgCi0gICAgICAgIDsvLyBDaG9vc2UgdG8gc3RvcmUgdGhlIGZpbHRlcmVkCi0gICAgICAgIDsvLyB2YWx1ZSBvciB0aGUgb3JpZ2luYWwgcGl4ZWwKLSAgICAgICAgVVNVQjggICB0MCwgYXBmbGcsIG0wMQotICAgICAgICBTRUwgICAgIFAxYSwgUDFhLCBwXzEKLSAgICAgICAgVVNVQjggICB0MCwgYXFmbGcsIG0wMQotICAgICAgICBTRUwgICAgIHQzLCBRMWEsIHFfMQotICAgICAgICAKLSAgICAgICAgTV9FTkQKLQotOy8vIFJlZ2lzdGVyIHVzYWdlIGZvciAtIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUoKQotOy8vCi07Ly8gSW5wdXRzIC0gMyw0LDUsOCw5LDEwIC0gSW5wdXQgUGl4ZWxzIChwMC1wMixxMC1xMikKLTsvLyAgICAgICAgLSAyIC0gZmlsdCwgMCAtIGFwZmxnLGFxZmxnCi07Ly8gICAgICAgIC0gMSAtIGFwMHEwLCA2IC0gYWxwaGEKLTsvLyAgICAgICAgLSA3IC0gbTAwLCAxMSAtIG0wMQotOy8vICAgICAgICAgCi07Ly8gT3V0cHV0cyAtIDYsNywxLDksMCwyIC0gT3V0cHV0IFBpeGVscyhQMGIsUDFiLFAyYiwgUTBiLFExYixRMmIpCi07Ly8gCi07Ly8gUmVnaXN0ZXJzIENvcnJ1cHRlZCAtIDAtMyw1LTEyLDE0Ci0KLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlLCBscgotICAgIAotICAgICAgICA7Ly8gYXBmbGcgPSBhcGZsZyAmJiB8cDAtcTB8PCgoYWxwaGE+PjIpKzIpIAotICAgICAgICA7Ly8gYXBmbGcgPSBhcWZsZyAmJiB8cDAtcTB8PCgoYWxwaGE+PjIpKzIpIAotCi0gICAgICAgIE1fQVJHICAgcER1bW15LDQKLSAgICAgICAgTV9BUkcgICBwUV8zLDQKLSAgICAgICAgTV9BUkcgICBwUF8zLDQKLSAgICAgICAgCi0gICAgICAgIFVIQUREOCAgYWxwaGEsIGFscGhhLCBtMDAKLSAgICAgICAgVVNVQjggICB0OSwgcF8yLCBwXzAgICAgOy8vdDkgPSBkcDJwMAotICAgICAgICBVSEFERDggIGFscGhhLCBhbHBoYSwgbTAwCi0gICAgICAgIEFERCAgICAgYWxwaGEsIGFscGhhLCBtMDEsIExTTCAjMSAgICAgICAgCi0gICAgICAgIFVTVUI4ICAgYXAwcTAsIGFwMHEwLCBhbHBoYQotICAgICAgICBTRUwgICAgIGFwcWZsZywgbTAwLCBhcGZsZwotCi0gICAgICAgIDsvLyBQMCA9IChwMiArIDIqcDEgKyAyKnAwICsgMipxMCArIHExICsgNCk+PjMgCi0gICAgICAgIDsvLyAgICA9ICgocDItcDApICsgMioocDEtcDApICsgKHExLXEwKSArIDMqKHEwLXAwKSArIDgqcDAgKyA0KT4+MwotICAgICAgICA7Ly8gICAgPSBwMCArICgoKHAyLXAwKSArIDIqKHAxLXAwKSArIChxMS1xMCkgLSAzKihwMC1xMCkgKyA0KT4+MykKLQotICAgICAgICA7Ly8gUDEgPSAocDIgKyBwMSArIHEwICsgcDAgKyAyKT4+MgotICAgICAgICA7Ly8gICAgPSBwMCArICgoKHAyLXAwKSArIChwMS1wMCkgLSAocDAtcTApICsgMik+PjIpCi0gICAgICAgIAotICAgICAgICA7Ly8gUDIgPSAoMipwMyArIDMqcDIgKyBwMSArIHAwICsgcTAgKyA0KT4+MwotICAgICAgICA7Ly8gICAgPSAoMioocDMtcDApICsgMyoocDItcDApICsgKHAxLXAwKSAtIChwMC1xMCkgKyA4KnAwICsgNCk+PjMKLSAgICAgICAgOy8vICAgID0gcDAgKyAoKChwMy1wMCkgKyAocDItcDApICsgdDIgKyAyKT4+MikKLQotICAgICAgICA7Ly8gQ29tcHV0ZSBQMGIKLSAgICAgICAgVVNVQjggICB0MiwgcF8wLCBxXzAgICAgICAgICAKLSAgICAgICAgU1NVQjggICB0NSwgdDksIHQyICAgICAgICAgICAKLQotICAgICAgICBVU1VCOCAgIHQ4LCBxXzEsIHFfMCAgICAgICAgIAotICAgICAgICBTSEFERDggIHQ4LCB0NSwgdDgKLQotICAgICAgICBVU1VCOCAgIHQ5LCBwXzEsIHBfMCAgICAgICAgIAotICAgICAgICBTQUREOCAgIHQ4LCB0OCwgdDkKLSAgICAgICAgU0hTVUI4ICB0OCwgdDgsIHQyCi0gICAgICAgIFNIQUREOCAgdDUsIHQ1LCB0OQotICAgICAgICBTSEFERDggIHQ4LCB0OCwgbTAxCi0gICAgICAgIFNIQUREOCAgdDksIHQ1LCBtMDEKLSAgICAgICAgU0FERDggICBQMGIsIHBfMCwgdDggICAgICAgICAKLSAgICAgICAgOy8vIFAwYiByZWFkeQotICAgICAgICAKLSAgICAgICAgOy8vIENvbXB1dGUgUDFiCi0gICAgICAgIE1fTERSICAgcF8zYiwgcFBfMwotICAgICAgICBTQUREOCAgIFAxYiwgcF8wLCB0OSAgICAgICAgIAotICAgICAgICA7Ly8gUDFiIHJlYWR5Ci0gICAgICAgIAotICAgICAgICA7Ly8gQ29tcHV0ZSBQMmIKLSAgICAgICAgVVNVQjggICB0OSwgcF8yLCBwXzAgICAgICAgICAKLSAgICAgICAgU0FERDggICB0NSwgdDUsIHQ5Ci0gICAgICAgIFVIU1VCOCAgdDksIHBfM2IsIHBfMCAgICAgICAgCi0gICAgICAgIEVPUiAgICAgYSwgcF8zYiwgcF8wICAgICAgICAgCi0gICAgICAgIEFORCAgICAgYSwgYSwgbTAxCi0gICAgICAgIFNIQUREOCAgdDUsIHQ1LCBhCi0gICAgICAgIFVIQUREOCAgYSwgcF8wLCBxXzEKLSAgICAgICAgU0FERDggICB0NSwgdDUsIG0wMQotICAgICAgICBTSEFERDggIHQ1LCB0NSwgdDkKLSAgICAgICAgTVZOICAgICB0OSwgcF8xCi0gICAgICAgIFNBREQ4ICAgUDJiLCBwXzAsIHQ1ICAgICAgICAgCi0gICAgICAgIDsvLyBQMmIgcmVhZHkKLSAgICAgICAgCi0gICAgICAgIFVIU1VCOCAgYSwgYSwgdDkKLSAgICAgICAgT1JSICAgICB0OSwgYXBxZmxnLCBtMDEKLSAgICAgICAgVVNVQjggICB0OSwgYXBxZmxnLCB0OQotCi0gICAgICAgIEVPUiAgICAgYSwgYSwgbTAxLCBMU0wgIzcKLSAgICAgICAgU0VMICAgICBQMGIsIFAwYiwgYQotICAgICAgICBTRUwgICAgIFAxYiwgUDFiLCBwXzEKLSAgICAgICAgU0VMICAgICBQMmIsIFAyYiwgcF8yCi0KLSAgICAgICAgVVNVQjggICB0NCwgZmlsdCwgbTAxCi0gICAgICAgIFNFTCAgICAgUDBiLCBQMGIsIHBfMAotCi0gICAgICAgIAotICAgICAgICA7Ly8gUTAgPSAocTIgKyAyKnExICsgMipxMCArIDIqcDAgKyBwMSArIDQpPj4zIAotICAgICAgICA7Ly8gICAgPSAoKHEyLXEwKSArIDIqKHExLXEwKSArIChwMS1wMCkgKyAzKihwMC1xMCkgKyA4KnEwICsgNCk+PjMKLSAgICAgICAgOy8vICAgID0gcTAgKyAoKChxMi1xMCkgKyAyKihxMS1xMCkgKyAocDEtcDApICsgMyoocDAtcTApICsgNCk+PjMpCi0KLSAgICAgICAgOy8vIFExID0gKHEyICsgcTEgKyBwMCArIHEwICsgMik+PjIKLSAgICAgICAgOy8vICAgID0gcTAgKyAoKChxMi1xMCkgKyAocTEtcTApICsgKHAwLXEwKSArIDIpPj4yKQotCi0gICAgICAgIDsvLyBRMiA9ICgyKnEzICsgMypxMiArIHExICsgcTAgKyBwMCArIDQpPj4zCi0gICAgICAgIDsvLyAgICA9ICgyKihxMy1xMCkgKyAzKihxMi1xMCkgKyAocTEtcTApICsgKHAwLXEwKSArIDgqcTAgKyA0KT4+MwotICAgICAgICA7Ly8gICAgPSBxMCArICgoKHEzLXEwKSArIChxMi1xMCkgKyB0MiArIDIpPj4yKQotCi0KLSAgICAgICAgOy8vIENvbXB1dGUgUTBiIFExYgotICAgICAgICBVU1VCOCAgIHQ0LCBxXzIsIHFfMCAgICAgICAgICAgCi0gICAgICAgIFVTVUI4ICAgYSwgcF8wLCBxXzAKLSAgICAgICAgVVNVQjggICB0OSwgcF8xLCBwXzAKLSAgICAgICAgU0FERDggICB0MCwgdDQsIGEKLSAgICAgICAgU0hBREQ4ICB0OSwgdDAsIHQ5Ci0gICAgICAgIFVIQUREOCAgdDEwLCBxXzAsIHBfMQotICAgICAgICBTQUREOCAgIHQ5LCB0OSwgYQotICAgICAgICBVU1VCOCAgIGEsIHFfMSwgcV8wCi0gICAgICAgIFNIQUREOCAgdDksIHQ5LCBhCi0gICAgICAgIFNIQUREOCAgdDAsIHQwLCBhCi0gICAgICAgIFNIQUREOCAgdDksIHQ5LCBtMDEKLSAgICAgICAgU0hBREQ4ICBhLCB0MCwgbTAxCi0gICAgICAgIFNBREQ4ICAgdDksIHFfMCwgdDkgICAgICAgICAgICAKLSAgICAgICAgOy8vIFEwYiByZWFkeSAtIHQ5Ci0gICAgICAgIAotICAgICAgICBNT1YgICAgIHQ0LCAjMAotICAgICAgICBVSEFERDggIGFwcWZsZywgYXBxZmxnLCB0NAotICAgICAgICAKLSAgICAgICAgU0FERDggICBRMWIsIHFfMCwgYSAKLSAgICAgICAgOy8vIFExYiByZWFkeQotICAgICAgIAotICAgICAgICBVU1VCOCAgIHQ0LCBhcHFmbGcsIG0wMQotICAgICAgICBTRUwgICAgIFExYiwgUTFiLCBxXzEKLSAgICAgICAgTVZOICAgICB0MTEsIHFfMQotICAgICAgICBVSFNVQjggIHQxMCwgdDEwLCB0MTEKLSAgICAgICAgTV9MRFIgICBxXzNiLCBwUV8zCi0gICAgICAgIEVPUiAgICAgdDEwLCB0MTAsIG0wMSwgTFNMICM3Ci0gICAgICAgIFNFTCAgICAgdDksIHQ5LCB0MTAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBDb21wdXRlIFEyYgotICAgICAgICBVU1VCOCAgIHQ0LCBxXzIsIHFfMAotICAgICAgICBTQUREOCAgIHQ0LCB0MCwgdDQKLSAgICAgICAgRU9SICAgICB0MCwgcV8zYiwgcV8wIAotICAgICAgICBBTkQgICAgIHQwLCB0MCwgbTAxCi0gICAgICAgIFNIQUREOCAgdDQsIHQ0LCB0MAotICAgICAgICBVSFNVQjggIHQxMCwgcV8zYiwgcV8wCi0gICAgICAgIFNBREQ4ICAgdDQsIHQ0LCBtMDEKLSAgICAgICAgU0hBREQ4ICB0NCwgdDQsIHQxMAotCi0gICAgICAgIFVTVUI4ICAgdDEwLCBmaWx0LCBtMDEKLSAgICAgICAgU0VMICAgICBRMGIsIHQ5LCBxXzAKLQotICAgICAgICBTQUREOCAgIHQ0LCBxXzAsIHQ0ICAgICAgICAgICAgCi0gICAgICAgIDsvLyBRMmIgcmVhZHkgLSB0NAotCi0gICAgICAgIFVTVUI4ICAgdDEwLCBhcHFmbGcsIG0wMQotICAgICAgICBTRUwgICAgIFEyYiwgdDQsIHFfMgotCi0gICAgICAgIE1fRU5ECi0gICAgCi0gICAgRU5ESUYKLQotICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNjM4YmYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzkgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fQml0RGVjX3MuaAotICAgICAgICAKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlcwotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlcwotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9TdWZmaXhUb0xldmVsCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1ppZ1phZ180eDQKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfWmlnWmFnXzJ4MgotICAgICAgICAKLSAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLSAgICAgICAgCi07Ly9ERUJVR19PTiAgICBTRVRMIHtUUlVFfQotICAgICAgICAKLUxBU1RfQ09FRkYgICAgICAgICAgICAgICBFUVUgMHgyMCAgICAgICAgOy8vIEVuZCBvZiBibG9jayBmbGFnCi1UV09fQllURV9DT0VGRiAgICAgICAgICAgRVFVIDB4MTAKLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi0KLXBwQml0U3RyZWFtICAgICBSTiAwCi1wT2Zmc2V0ICAgICAgICAgUk4gMQotcE51bUNvZWZmICAgICAgIFJOIDIKLXBwUG9zQ29lZmJ1ZiAgICBSTiAzCi1uQyAgICAgICAgICAgICAgUk4gNCA7Ly8gbnVtYmVyIG9mIGNvZWZmcyBvciAxNyBmb3IgY2hyb21hCi1zTWF4TnVtQ29lZmYgICAgUk4gNQotCi07Ly8gRGVjbGFyZSBpbm5lciBsb29wIHJlZ2lzdGVycwotCi07Ly8gTGV2ZWwgbG9vcAotQ291bnQgICAgICAgICAgIFJOIDAKLVRyYWlsaW5nT25lcyAgICBSTiAxCi1wTGV2ZWwgICAgICAgICAgUk4gMgotTGV2ZWxTdWZmaXggICAgIFJOIDMKLVN1ZmZpeExlbmd0aCAgICBSTiA0Ci1Ub3RhbENvZWZmICAgICAgUk4gNQotCi1wVkxEVGFibGUgICAgICAgUk4gNgotU3ltYm9sICAgICAgICAgIFJOIDcKLVQxICAgICAgICAgICAgICBSTiA4Ci1UMiAgICAgICAgICAgICAgUk4gOQotUkJpdFN0cmVhbSAgICAgIFJOIDEwCi1SQml0QnVmZmVyICAgICAgUk4gMTEKLVJCaXRDb3VudCAgICAgICBSTiAxMgotbHIgICAgICAgICAgICAgIFJOIDE0Ci0KLTsvLyBSdW4gbG9vcAotQ291bnQgICAgICAgICAgIFJOIDAKLVplcm9zTGVmdCAgICAgICBSTiAxCi1wTGV2ZWwgICAgICAgICAgUk4gMgotcHBSdW5UYWJsZSAgICAgIFJOIDMKLXBSdW4gICAgICAgICAgICBSTiA0Ci1Ub3RhbENvZWZmICAgICAgUk4gNQotCi1wVkxEVGFibGUgICAgICAgUk4gNgotU3ltYm9sICAgICAgICAgIFJOIDcKLVQxICAgICAgICAgICAgICBSTiA4Ci1UMiAgICAgICAgICAgICAgUk4gOQotUkJpdFN0cmVhbSAgICAgIFJOIDEwCi1SQml0QnVmZmVyICAgICAgUk4gMTEKLVJCaXRDb3VudCAgICAgICBSTiAxMgotbHIgICAgICAgICAgICAgIFJOIDE0Ci0KLTsvLyBGaWxsIGluIGNvZWZmaWNpZW50cyBsb29wCi1wUG9zQ29lZmJ1ZiAgICAgUk4gMAotdGVtcCAgICAgICAgICAgIFJOIDEKLXBMZXZlbCAgICAgICAgICBSTiAyCi1wcFBvc0NvZWZidWYgICAgUk4gMwotcFJ1biAgICAgICAgICAgIFJOIDQKLVRvdGFsQ29lZmYgICAgICBSTiA1Ci1wWmlnWmFnICAgICAgICAgUk4gNgotCi1UMSAgICAgICAgICAgICAgUk4gOAotVDIgICAgICAgICAgICAgIFJOIDkKLVJCaXRTdHJlYW0gICAgICBSTiAxMAotUkJpdEJ1ZmZlciAgICAgIFJOIDExCi1SQml0Q291bnQgICAgICAgUk4gMTIKLUNvZWZmTnVtICAgICAgICBSTiAxNAotCi0KLQotICAgIElGIEFSTTExMzZKUwotICAgICAgICAKLSAgICAgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSByZXF1aXJlZCBieSB0aGUgZnVuY3Rpb24KLSAgICAgICAgTV9BTExPQzQgcHBwQml0U3RyZWFtLCA0Ci0gICAgICAgIE1fQUxMT0M0IHBwT2Zmc2V0LCA0Ci0gICAgICAgIE1fQUxMT0M0IHBwcFBvc0NvZWZidWYsIDQKLSAgICAgICAgTV9BTExPQzQgcHBMZXZlbCwgMTYqMgotICAgICAgICBNX0FMTE9DNCBwcFJ1biwgMTYKLSAgICAgICAgCi0gICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpciwgcjExCi0gICAgICAgIAotICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cwotICAgICAgICBNX0FSRyAgIHBOQywgNAotICAgICAgICBNX0FSRyAgIHBTTWF4TnVtQ29lZmYsNAotICAgICAgICAKLSAgICAgICAgOy8vIENvZGUgc3RhcnQgICAgICAgIAotICAgICAgICBNX0JEX0lOSVQwIHBwQml0U3RyZWFtLCBwT2Zmc2V0LCBSQml0U3RyZWFtLCBSQml0QnVmZmVyLCBSQml0Q291bnQKLSAgICAgICAgTERSICAgICAgICBwVkxEVGFibGUsID1hcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlcwotICAgICAgICBNX0xEUiAgICAgIG5DLCBwTkMKLSAgICAgICAgCi0gICAgICAgIE1fQkRfSU5JVDEgVDEsIFQyLCBscgotICAgICAgICBMRFIgICAgIHBWTERUYWJsZSwgW3BWTERUYWJsZSwgbkMsIExTTCAjMl0gIDsvLyBGaW5kIFZMRCB0YWJsZSAgICAKLSAgICAgICAgCi0gICAgICAgIE1fQkRfSU5JVDIgVDEsIFQyLCBscgotCi0gICAgICAgIDsvLyBEZWNvZGUgU3ltYm9sID0gVG90YWxDb2VmZio0ICsgVHJhaWxpbmdPbmVzCi0gICAgICAgIE1fQkRfVkxEICBTeW1ib2wsIFQxLCBUMiwgcFZMRFRhYmxlLCA0LCAyCi0gICAgCi0gICAgICAgIE1PVlMgICAgVG90YWxDb2VmZiwgU3ltYm9sLCBMU1IgIzIgICAgCi0gICAgICAgIFNUUkIgICAgVG90YWxDb2VmZiwgW3BOdW1Db2VmZl0gICAgCi0gICAgICAgIE1fUFJJTlRGICJUb3RhbENvZWZmPSVkXG4iLCBUb3RhbENvZWZmCi0gICAgICAgIEJFUS5XICAgRW5kTm9FcnJvciAgICAgICAgICAgICAgICAgIDsvLyBGaW5pc2hlZCBpZiBubyBjb2VmZmljaWVudHMKLQotICAgICAgICBDTVAgICAgIFN5bWJvbCwgIzE3KjQKLSAgICAgICAgQkdFLlcgICBFbmRCYWRTeW1ib2wgICAgICAgICAgICAgICAgOy8vIEVycm9yIGlmIGJhZCBzeW1ib2wKLSAgICAgICAgCi0gICAgICAgIDsvLyBTYXZlIGJpdHN0cmVhbSBwb2ludGVycwotICAgICAgICBNX1NUUiAgIHBwQml0U3RyZWFtLCAgcHBwQml0U3RyZWFtCi0gICAgICAgIE1fU1RSICAgcE9mZnNldCwgICAgICBwcE9mZnNldAotICAgICAgICBNX1NUUiAgIHBwUG9zQ29lZmJ1ZiwgcHBwUG9zQ29lZmJ1ZiAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBEZWNvZGUgVHJhaWxpbmcgT25lcwotICAgICAgICBBTkRTICAgIFRyYWlsaW5nT25lcywgU3ltYm9sLCAjMwotICAgICAgICBNX0FEUiAgIHBMZXZlbCwgcHBMZXZlbCAgICAgICAgICAgIAotICAgICAgICBNX1BSSU5URiAiVHJhaWxpbmdPbmVzPSVkXG4iLCBUcmFpbGluZ09uZXMKLSAgICAgICAgQkVRICAgICBUcmFpbGluZ09uZXNEb25lICAgIAotICAgICAgICBNT1YgICAgIENvdW50LCBUcmFpbGluZ09uZXMKLVRyYWlsaW5nT25lc0xvb3AgICAgCi0gICAgICAgIE1fQkRfUkVBRDggU3ltYm9sLCAxLCBUMQotICAgICAgICBTVUJTICAgIENvdW50LCBDb3VudCwgIzEKLSAgICAgICAgTU9WICAgICBUMSwgIzEKLSAgICAgICAgU1VCICAgICBUMSwgVDEsIFN5bWJvbCwgTFNMICMxCi0gICAgICAgIE1fUFJJTlRGICJMZXZlbD0lZFxuIiwgVDEKLSAgICAgICAgU1RSSCAgICBUMSwgW3BMZXZlbF0sICMyCi0gICAgICAgIEJHVCAgICAgVHJhaWxpbmdPbmVzTG9vcAotVHJhaWxpbmdPbmVzRG9uZSAgICAKLSAgICAKLSAgICAgICAgOy8vIERlY29kZSBsZXZlbCB2YWx1ZXMgICAgCi0gICAgICAgIFNVQlMgICAgQ291bnQsIFRvdGFsQ29lZmYsIFRyYWlsaW5nT25lcyAgICAgOy8vIE51bWJlciBvZiBsZXZlbHMgdG8gcmVhZAotICAgICAgICBCRVEgICAgIERlY29kZVJ1bnMgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBOb25lIGxlZnQKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgU3VmZml4TGVuZ3RoLCAjMQotICAgICAgICBDTVAgICAgIFRvdGFsQ29lZmYsICMxMAotICAgICAgICBNT1ZMRSAgIFN1ZmZpeExlbmd0aCwgIzAKLSAgICAgICAgQ01QICAgICBUcmFpbGluZ09uZXMsICMzICAgIDsvLyBpZiAoVHJhaWxpbmdPbmVzPDMpCi0gICAgICAgIE1PVkxUICAgVHJhaWxpbmdPbmVzLCAjNCAgICA7Ly8gdGhlbiBUcmFpbGluZ09uZXMgPSArNAotICAgICAgICBNT1ZHRSAgIFRyYWlsaW5nT25lcywgIzIgICAgOy8vIGVsc2UgVHJhaWxpbmdPbmVzID0gKzIKLSAgICAgICAgTU9WR0UgICBTdWZmaXhMZW5ndGgsICMwICAgIDsvLyAgICAgIFN1ZmZpeExlbmd0aCA9IDAKLSAgICAgICAgCi1MZXZlbExvb3AKLSAgICAgICAgTV9CRF9DTFoxNiBTeW1ib2wsIFQxLCBUMiAgIDsvLyBTeW1ib2w9TGV2ZWxQcmVmaXgKLSAgICAgICAgQ01QICAgICBTeW1ib2wsIzE2Ci0gICAgICAgIEJHRSAgICAgRW5kQmFkU3ltYm9sCi0gICAgICAgIAotICAgICAgICBNT1ZTICAgIGxyLCBTdWZmaXhMZW5ndGggICAgOy8vIGlmIExldmVsU3VmZml4U2l6ZT09MAotICAgICAgICBURVFFUSAgIFN5bWJvbCwgIzE0ICAgICAgICAgOy8vICAgYW5kICBMZXZlbFByZWZpeD09MTQKLSAgICAgICAgTU9WRVEgICBsciwgIzQgICAgICAgICAgICAgIDsvLyAgIHRoZW4gTGV2ZWxTdWZmaXhTaXplPTQKLSAgICAgICAgVEVRICAgICBTeW1ib2wsICMxNSAgICAgICAgIDsvLyBpZiBMZXZlbFN1ZmZpeFNpemU9PTE1Ci0gICAgICAgIE1PVkVRICAgbHIsICMxMiAgICAgICAgICAgICA7Ly8gICB0aGVuIExldmVsU3VmZml4U2l6ZT0xMgotICAgICAgICAKLSAgICAgICAgVEVRRVEgICBTdWZmaXhMZW5ndGgsIzAKLSAgICAgICAgQURERVEgICBTeW1ib2wsU3ltYm9sLCMxNQotICAgICAgICAKLSAgICAgICAgVEVRICAgICBsciwgIzAgICAgICAgICAgICAgIDsvLyBpZiBMZXZlbFN1ZmZpeFNpemU9PTAKLSAgICAgICAgQkVRICAgICBMZXZlbENvZGVSZWFkICAgICAgIDsvLyBMZXZlbENvZGUgPSBMZXZlbFByZWZpeAotICAgICAgICAKLSAgICAgICAgTV9CRF9WUkVBRDE2IExldmVsU3VmZml4LCBsciwgVDEsIFQyICA7Ly8gUmVhZCBMZXZlbCBTdWZmaXgKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgU3ltYm9sLCBTeW1ib2wsIExTTCBTdWZmaXhMZW5ndGgKLSAgICAgICAgQUREICAgICBTeW1ib2wsIExldmVsU3VmZml4LCBTeW1ib2wKLSAgICAgICAgICAgICAKLUxldmVsQ29kZVJlYWQgICAgICAgIAotICAgICAgICA7Ly8gU3ltYm9sID0gTGV2ZWxDb2RlCi0gICAgICAgIEFERCAgICAgU3ltYm9sLCBTeW1ib2wsIFRyYWlsaW5nT25lcyA7Ly8gKzQgaWYgbGV2ZWwgY2Fubm90IGJlICsvLTEsICsyIG8vdwotICAgICAgICBNT1YgICAgIFRyYWlsaW5nT25lcywgIzIKLSAgICAgICAgTU9WUyAgICBUMSwgU3ltYm9sLCBMU1IgIzEKLSAgICAgICAgUlNCQ1MgICBUMSwgVDEsICMwICAgICAgICAgICAgICAgICAgOy8vIElmIFN5bWJvbCBvZGQgdGhlbiBuZWdhdGUKLSAgICAgICAgTV9QUklOVEYgIkxldmVsPSVkXG4iLCBUMQotICAgICAgICBTVFJIICAgIFQxLCBbcExldmVsXSwgIzIgICAgICAgICAgICA7Ly8gU3RvcmUgbGV2ZWwuCi0gICAgICAgIAotICAgICAgICBMRFIgICAgIFQyLCA9YXJtVkNNNFAxMF9TdWZmaXhUb0xldmVsCi0gICAgICAgIExEUlNCICAgVDEsIFtUMiwgU3VmZml4TGVuZ3RoXSAgICAgIDsvLyBGaW5kIGluY3JlbWVudCBsZXZlbCAgICAgICAgCi0gICAgICAgIFRFUSAgICAgU3VmZml4TGVuZ3RoLCAjMAotICAgICAgICBNT1ZFUSAgIFN1ZmZpeExlbmd0aCwgIzEKLSAgICAgICAgQ01QICAgICBTeW1ib2wsIFQxCi0gICAgICAgIEFERENTICAgU3VmZml4TGVuZ3RoLCBTdWZmaXhMZW5ndGgsICMxICAgICAgICAKLSAgICAgICAgU1VCUyAgICBDb3VudCwgQ291bnQsICMxICAgICAgICAKLSAgICAgICAgQkdUICAgICBMZXZlbExvb3AKLSAgICAgICAgCi1EZWNvZGVSdW5zICAgICAgICAKLSAgICAgICAgOy8vIEZpbmQgbnVtYmVyIG9mIHplcm9zCi0gICAgICAgIE1fTERSICAgVDEsIHBTTWF4TnVtQ29lZmYgICAgICAgICAgIDsvLyBzTWF4TnVtQ29lZmYKLSAgICAgICAgU1VCICAgICBDb3VudCwgVG90YWxDb2VmZiwgIzEgICAgICAgOy8vIE51bWJlciBvZiBydW5zIGV4Y2x1ZGluZyBsYXN0Ci0gICAgICAgIFNVQlMgICAgWmVyb3NMZWZ0LCBUMSwgVG90YWxDb2VmZiAgIDsvLyBNYXhpbXVtIG51bWJlciBvZiB6ZXJvcyB0aGVyZSBjb3VsZCBiZQotICAgICAgICBNX0FEUiAgIHBSdW4sIHBwUnVuCi0gICAgICAgIE1PViAgICAgQ29lZmZOdW0sVG90YWxDb2VmZgotICAgICAgICBTVUIgICAgIENvZWZmTnVtLENvZWZmTnVtLCMxCi0gICAgICAgIEJFUSAgICAgTm9aZXJvc0xlZnQKLSAgICAgICAgCi0gICAgICAgIDsvLyBVbnBhY2sgbnVtYmVyIG9mIHplcm9zIGZyb20gYml0c3RyZWFtCi0gICAgICAgIFRFUSAgICAgVDEsICM0ICAgICAgICAKLSAgICAgICAgTERSRVEgICBwVkxEVGFibGUsID0oYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXMtNCkKLSAgICAgICAgTERSTkUgICBwVkxEVGFibGUsID0oYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlcy00KQotICAgICAgICBMRFIgICAgIHBWTERUYWJsZSwgW3BWTERUYWJsZSwgVG90YWxDb2VmZiwgTFNMICMyXQotICAgICAgICAKLSAgICAgICAgTV9CRF9WTEQgIFN5bWJvbCwgVDEsIFQyLCBwVkxEVGFibGUsIDQsIDIgOy8vIFN5bWJvbCA9IFplcm9zTGVmdAotICAgICAgICBDTVAgICAgIFN5bWJvbCwjMTYKLSAgICAgICAgQkdFICAgICBFbmRCYWRTeW1ib2wKLQotICAgICAgICBMRFIgICAgIHBwUnVuVGFibGUsID0oYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlcy00KQotICAgICAgICBNX0FEUiAgIHBSdW4sIHBwUnVuCi0gICAgICAgIE1PVlMgICAgWmVyb3NMZWZ0LCBTeW1ib2wKLQotICAgICAgICBBREQgICAgIENvZWZmTnVtLENvZWZmTnVtLFplcm9zTGVmdCAgICAgICAgCi0KLSAgICAgICAgQkVRICAgICBOb1plcm9zTGVmdAotICAgICAgICAKLSAgICAgICAgOy8vIERlY29kZSBydW5zIHdoaWxlIHplcm9zIGFyZSBsZWZ0IGFuZCBtb3JlIHRoYW4gb25lIGNvZWZmaWNpZW50Ci1SdW5Mb29wIAotICAgICAgICBTVUJTICAgIENvdW50LCBDb3VudCwgIzEKLSAgICAgICAgTERSICAgICBwVkxEVGFibGUsIFtwcFJ1blRhYmxlLCBaZXJvc0xlZnQsIExTTCMyXQotICAgICAgICBCTFQgICAgIExhc3RSdW4KLSAgICAgICAgTV9CRF9WTEQgIFN5bWJvbCwgVDEsIFQyLCBwVkxEVGFibGUsIDMsIDIgOy8vIFN5bWJvbCA9IFJ1bgotICAgICAgICBDTVAgICAgIFN5bWJvbCwjMTUgICAgICAgICAKLSAgICAgICAgQkdFICAgICBFbmRCYWRTeW1ib2wgICAgICAgIAotCi0gICAgICAgIFNVQlMgICAgWmVyb3NMZWZ0LCBaZXJvc0xlZnQsIFN5bWJvbAotICAgICAgICBNX1BSSU5URiAiUnVuPSVkXG4iLCBTeW1ib2wKLSAgICAgICAgU1RSQiAgICBTeW1ib2wsIFtwUnVuXSwgIzEKLSAgICAgICAgQkdUICAgICBSdW5Mb29wCi0gICAgICAgIAotICAgICAgICA7Ly8gRGVjb2RlIHJ1bnMgd2hpbGUgbm8gemVyb3MgYXJlIGxlZnQKLU5vWmVyb3NMZWZ0IAotICAgICAgICBTVUJTICAgIENvdW50LCBDb3VudCwgIzEKLSAgICAgICAgTV9QUklOVEYgIlJ1bj0lZFxuIiwgWmVyb3NMZWZ0Ci0gICAgICAgIFNUUkdFQiAgWmVyb3NMZWZ0LCBbcFJ1bl0sICMxCi0gICAgICAgIEJHVCAgICAgTm9aZXJvc0xlZnQKLQotTGFzdFJ1biAgICAgICAgCi0gICAgICAgIDsvLyBGaW5hbCBydW4gbGVuZ3RoIGlzIHJlbWFpbmluZyB6ZXJvcwotICAgICAgICBNX1BSSU5URiAiTGFzdFJ1bj0lZFxuIiwgWmVyb3NMZWZ0Ci0gICAgICAgIFNUUkIgICAgWmVyb3NMZWZ0LCBbcFJ1bl0sICMxICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBXcml0ZSBjb2VmZmljaWVudHMgdG8gb3V0cHV0IGFycmF5Ci0gICAgICAgIE1fTERSICAgVDEsIHBTTWF4TnVtQ29lZmYgICAgICAgICAgICAgICAgICAgIDsvLyBzTWF4TnVtQ29lZmYKLSAgICAgICAgVEVRICAgICBUMSwgIzE1Ci0gICAgICAgIEFEREVRICAgQ29lZmZOdW0sQ29lZmZOdW0sIzEKLSAgICAgICAgCi0KLSAgICAgICAgU1VCICAgICBwUnVuLHBSdW4sVG90YWxDb2VmZgotICAgICAgICBTVUIgICAgIHBMZXZlbCxwTGV2ZWwsVG90YWxDb2VmZiAgCi0gICAgICAgIFNVQiAgICAgcExldmVsLHBMZXZlbCxUb3RhbENvZWZmICAgCi0KLSAgICAgICAgTV9MRFIgICBwcFBvc0NvZWZidWYsIHBwcFBvc0NvZWZidWYKLSAgICAgICAgTERSICAgICBwUG9zQ29lZmJ1ZiwgW3BwUG9zQ29lZmJ1Zl0KLSAgICAgICAgVEVRICAgICBUMSwgIzQKLSAgICAgICAgTERSRVEgICBwWmlnWmFnLCA9YXJtVkNNNFAxMF9aaWdaYWdfMngyCi0gICAgICAgIExEUk5FICAgcFppZ1phZywgPWFybVZDTTRQMTBfWmlnWmFnXzR4NAotCi0gICAgICAgIAotICAgICAgICAKLU91dHB1dExvb3AKLSAgICAgICAgCi0gICAgICAgIExEUkIgICAgVDIsIFtwUnVuXSwjMQotICAgICAgICBMRFJCICAgIFQxLCBbcFppZ1phZywgQ29lZmZOdW1dCi0gICAgICAgIFNVQiAgICAgQ29lZmZOdW0sIENvZWZmTnVtLCAjMSAgICAgIDsvLyBTa2lwIE5vbiB6ZXJvCi0gICAgICAgIFNVQiAgICAgQ29lZmZOdW0sIENvZWZmTnVtLCBUMiAgICAgIDsvLyBTa2lwIFplcm8gcnVuCi0gICAgICAgIAotICAgICAgICBMRFJTSCAgIFQyLCBbcExldmVsXSwjMgotICAgICAgICAKLSAgICAgICAgU1VCUyAgICBUb3RhbENvZWZmLCBUb3RhbENvZWZmLCAjMSAgICAgICAKLSAgICAgICAgT1JSRVEgICBUMSwgVDEsICNMQVNUX0NPRUZGCi0gICAgICAgIAotICAgICAgICBBREQgICAgIHRlbXAsIFQyLCAjMTI4Ci0gICAgICAgIENNUCAgICAgdGVtcCwgIzI1NgotICAgICAgICBPUlJDUyAgIFQxLCBUMSwgI1RXT19CWVRFX0NPRUZGCi0KLSAgICAgICAgCi0gICAgICAgIFRFUSAgICAgVG90YWxDb2VmZiwgIzAgICAgICAgICAgICAgIDsvLyBQcmVzZXJ2ZXMgY2FycnkgICAgICAgIAotICAgICAgICAKLSAgICAgICAgTV9QUklOVEYgIk91dHB1dD0lMDJ4ICUwNHhcbiIsIFQxLCBUMgotICAgICAgICBTVFJCICAgIFQxLCBbcFBvc0NvZWZidWZdLCAjMQotICAgICAgICBTVFJCICAgIFQyLCBbcFBvc0NvZWZidWZdLCAjMQotICAgICAgICBNT1YgICAgIFQyLCBUMiwgTFNSICM4Ci0gICAgICAgIFNUUkNTQiAgVDIsIFtwUG9zQ29lZmJ1Zl0sICMxICAgICAgICAgICAgICAgIAotICAgICAgICBCTkUgICAgIE91dHB1dExvb3AKLSAgICAgICAgCi0gICAgICAgIDsvLyBGaW5pc2hlZAotICAgICAgICBTVFIgICAgIHBQb3NDb2VmYnVmLCBbcHBQb3NDb2VmYnVmXQotICAgICAgICBNX0xEUiAgIHBwQml0U3RyZWFtLCBwcHBCaXRTdHJlYW0KLSAgICAgICAgTV9MRFIgICBwT2Zmc2V0LCBwcE9mZnNldAotICAgICAgICBCICAgICAgIEVuZE5vRXJyb3IKLSAgICAgICAgICAgIAotRW5kQmFkU3ltYm9sCi0gICAgICAgIE1PViAgICAgcjAsICNPTVhfU3RzX0VycgotICAgICAgICBCICAgICAgIEVuZCAgICAKLSAgICAgICAgCi1FbmROb0Vycm9yCi0gICAgICAgIDsvLyBGaW5pc2hlZCByZWFkaW5nIGZyb20gdGhlIGJpdHN0cmVhbSAgICAgICAgICAgICAgICAKLSAgICAgICAgTV9CRF9GSU5JIHBwQml0U3RyZWFtLCBwT2Zmc2V0Ci0gICAgICAgIAotICAgICAgICA7Ly8gU2V0IHJldHVybiB2YWx1ZQotICAgICAgICBNT1YgICAgIHIwLCAjT01YX1N0c19Ob0VyciAgICAKLUVuZAotICAgICAgICBNX0VORAotICAgIAotICAgIEVORElGCi0gICAgCi0gICAgRU5ECi0gICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlc19zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlc19zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZTA3YjUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgOTY0MQotOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotICAgICAgICAKLQotICAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgCi0gICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9RUERpdlRhYmxlCi0gICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZQotICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfUG9zVG9WQ29sNHg0Ci0gICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9Qb3NUb1ZDb2wyeDIKLSAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1ZNYXRyaXggCi0gICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9RUE1vZHVsb1RhYmxlCi0gICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9WTWF0cml4VTE2Ci0gICAgICAgICAKLTsvLyBEZWZpbmUgdGhlIHByb2Nlc3NvciB2YXJpYW50cyBzdXBwb3J0ZWQgYnkgdGhpcyBmaWxlCi0gICAgICAgICAKLSAgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0gICAgICAgICAgIAotICAgICAgICAgCi07Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCi0KLSAgICAKLSAgICBJRiBBUk0xMTM2SlMgOkxPUjogQ29ydGV4QTgKLSAgICAgICAgICAgCi0gCi0gICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfUG9zVG9WQ29sNHg0Ci0gICAgICAgICBEQ0IgIDAsIDIsIDAsIDIKLSAgICAgICAgIERDQiAgMiwgMSwgMiwgMQotICAgICAgICAgRENCICAwLCAyLCAwLCAyCi0gICAgICAgICBEQ0IgIDIsIDEsIDIsIDEKLQotCi0gICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfUG9zVG9WQ29sMngyCi0gICAgICAgICBEQ0IgIDAsIDIKLSAgICAgICAgIERDQiAgMiwgMQotCi0KLSAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9WTWF0cml4Ci0gICAgICAgICBEQ0IgIDEwLCAxNiwgMTMKLSAgICAgICAgIERDQiAgMTEsIDE4LCAxNAotICAgICAgICAgRENCICAxMywgMjAsIDE2Ci0gICAgICAgICBEQ0IgIDE0LCAyMywgMTgKLSAgICAgICAgIERDQiAgMTYsIDI1LCAyMAotICAgICAgICAgRENCICAxOCwgMjksIDIzCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBUaGlzIHRhYmxlIGV2YWx1YXRlcyB0aGUgZXhwcmVzc2lvbiBbKElOVCkoUVAvNildLAotOy8vIGZvciB2YWx1ZXMgb2YgUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLiAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1FQRGl2VGFibGUKLSAgICAgICAgIERDQiAgMCwgIDAsICAwLCAgMCwgIDAsICAwCi0gICAgICAgICBEQ0IgIDEsICAxLCAgMSwgIDEsICAxLCAgMQotICAgICAgICAgRENCICAyLCAgMiwgIDIsICAyLCAgMiwgIDIKLSAgICAgICAgIERDQiAgMywgIDMsICAzLCAgMywgIDMsICAzCi0gICAgICAgICBEQ0IgIDQsICA0LCAgNCwgIDQsICA0LCAgNAotICAgICAgICAgRENCICA1LCAgNSwgIDUsICA1LCAgNSwgIDUKLSAgICAgICAgIERDQiAgNiwgIDYsICA2LCAgNiwgIDYsICA2Ci0gICAgICAgICBEQ0IgIDcsICA3LCAgNywgIDcsICA3LCAgNwotICAgICAgICAgRENCICA4LCAgOCwgIDgsICA4LCAgOCwgIDgKLSAgICAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBUaGlzIHRhYmxlIGNvbnRhaW5zIGFybVZDTTRQMTBfVk1hdHJpeFtRUCU2XVswXSBlbnRpcmVzLAotOy8vIGZvciB2YWx1ZXMgb2YgUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLiAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlCi0gICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAotICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKLSAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4Ci0gICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAotICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKLSAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4Ci0gICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAotICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKLSAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4Ci0gICAgCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gVGhpcyB0YWJsZSBldmFsdWF0ZXMgdGhlIG1vZHVsdXMgZXhwcmVzc2lvbiBbUVAlNl0qNiwKLTsvLyBmb3IgdmFsdWVzIG9mIFFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4gCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9RUE1vZHVsb1RhYmxlCi0gICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKLSAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAotICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCi0gICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKLSAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAotICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCi0gICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKLSAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAotICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCi0gICAgICAgIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIGludmlkdWFsIGJ5dGUgdmFsdWVzIHN0b3JlZCBhcwotOy8vIGhhbGZ3b3Jkcy4gVGhpcyBhdm9pZHMgdW5wYWNraW5nIGluc2lkZSB0aGUgZnVuY3Rpb24KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgCi0gICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfVk1hdHJpeFUxNgotICAgICAgICAgRENXIDEwLCAxNiwgMTMgCi0gICAgICAgICBEQ1cgMTEsIDE4LCAxNAotICAgICAgICAgRENXIDEzLCAyMCwgMTYKLSAgICAgICAgIERDVyAxNCwgMjMsIDE4Ci0gICAgICAgICBEQ1cgMTYsIDI1LCAyMAotICAgICAgICAgRENXIDE4LCAyOSwgMjMgCi0gICAgICAgICAKLSAgICBFTkRJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vQVJNMTEzNkpTICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgCi0gICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZlMTIzZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi0gICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLSAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlCi0gICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQotCi1ERUJVR19PTiAgICBTRVRMIHtGQUxTRX0KLQotICAgIElGIEFSTTExMzZKUyAKLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi1wU3JjICAgICAgICAgICAgUk4gMAotc3JjU3RlcCAgICAgICAgIFJOIDEKLXBEc3QgICAgICAgICAgICBSTiA4Ci1pSGVpZ2h0ICAgICAgICAgUk4gOQotCi07Ly8gRGVjbGFyZSBpbm5lciBsb29wIHJlZ2lzdGVycwoteCAgICAgICAgICAgICAgIFJOIDcKLXgwICAgICAgICAgICAgICBSTiA3Ci14MSAgICAgICAgICAgICAgUk4gMTAKLXgyICAgICAgICAgICAgICBSTiAxMQotU2NyYXRjaCAgICAgICAgIFJOIDEyCi0KLTsvLyBGdW5jdGlvbjogCi07Ly8gICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlCi07Ly8KLTsvLyBJbXBsZW1lbnRzIGNvcHkgZnJvbSBhbiBhcmJpdHJhcnkgYWxpZ25lZCBzb3VyY2UgbWVtb3J5IGxvY2F0aW9uIChwU3JjKSB0byBhIDQgYnl0ZSBhbGlnbmVkCi07Ly8gZGVzdGluYXRpb24gcG9pbnRlZCBieSAocERzdCkgZm9yIGhvcml6b250YWwgaW50ZXJwb2xhdGlvbi4KLTsvLyBUaGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGNvcHkgOSBieXRlcyBpbiBob3Jpem9udGFsIGRpcmVjdGlvbi4gCi07Ly8KLTsvLyBSZWdpc3RlcnMgdXNlZCBhcyBpbnB1dCBmb3IgdGhpcyBmdW5jdGlvbgotOy8vIHIwLHIxLHI4LHI5IHdoZXJlIHI4IGNvbnRhaW5pbmdzIGFsaWduZWQgbWVtb3J5IHBvaW50ZXIgYW5kIHI5IG5vIHJvd3MgdG8gY29weQotOy8vCi07Ly8gUmVnaXN0ZXJzIHByZXNlcnZlZCBmb3IgdG9wIGxldmVsIGZ1bmN0aW9uCi07Ly8gcjIscjMscjQscjUscjYKLTsvLwotOy8vIFJlZ2lzdGVycyBtb2RpZmllZCBieSB0aGUgZnVuY3Rpb24KLTsvLyByNyxyOCxyOSxyMTAscjExLHIxMgotOy8vCi07Ly8gT3V0cHV0IHJlZ2lzdGVycwotOy8vIHIwIC0gcG9pbnRlciB0byB0aGUgbmV3IGFsaWduZWQgbG9jYXRpb24gd2hpY2ggd2lsbCBiZSB1c2VkIGFzIHBTcmMKLTsvLyByMSAtIHN0ZXAgc2l6ZSB0byB0aGlzIGFsaWduZWQgbG9jYXRpb24KLQotICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIENvcHkgcERzdCB0byBzY3JhdGNoCi0gICAgICAgIE1PViAgICAgU2NyYXRjaCwgcERzdAotCi1TdGFydEFsaWduZWRTdGFja0NvcHkKLSAgICAgICAgQU5EICAgICB4LCBwU3JjLCAjMwotICAgICAgICBCSUMgICAgIHBTcmMsIHBTcmMsICMzCi0gICAgICAgIAotICAgICAgICBNX1NXSVRDSCB4Ci0gICAgICAgIE1fQ0FTRSAgIENvcHkwdG9BbGlnbmVkCi0gICAgICAgIE1fQ0FTRSAgIENvcHkxdG9BbGlnbmVkCi0gICAgICAgIE1fQ0FTRSAgIENvcHkydG9BbGlnbmVkCi0gICAgICAgIE1fQ0FTRSAgIENvcHkzdG9BbGlnbmVkCi0gICAgICAgIE1fRU5EU1dJVENICi0KLUNvcHkwdG9BbGlnbmVkICAKLSAgICAgICAgTERNICAgICBwU3JjLCB7eDAsIHgxLCB4Mn0KLSAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMQotICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAKLSAgICAgICAgCi0gICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKLQotICAgICAgICBTVE0gICAgIHBEc3QhLCB7eDAsIHgxLCB4Mn0gICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93Ci0gICAgICAgIEJHVCAgICAgQ29weTB0b0FsaWduZWQKLSAgICAgICAgQiAgICAgICBDb3B5RW5kICAKLSAgICAgIAotQ29weTF0b0FsaWduZWQgICAgICAgIAotICAgICAgICBMRE0gICAgIHBTcmMsIHt4MCwgeDEsIHgyfQotICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxCi0gICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcAotICAgICAgICAKLSAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAotCi0gICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzgKLSAgICAgICAgT1JSICAgICB4MCwgeDAsIHgxLCBMU0wgIzI0Ci0gICAgICAgIE1PViAgICAgeDEsIHgxLCBMU1IgIzgKLSAgICAgICAgT1JSICAgICB4MSwgeDEsIHgyLCBMU0wgIzI0Ci0gICAgICAgIE1PViAgICAgeDIsIHgyLCBMU1IgIzgKLSAgICAgICAgU1RNICAgICBwRHN0ISwge3gwLCB4MSwgeDJ9ICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIGFsaWduZWQgb3V0cHV0IHJvdwotICAgICAgICBCR1QgICAgIENvcHkxdG9BbGlnbmVkCi0gICAgICAgIEIgICAgICAgQ29weUVuZCAgCi0KLUNvcHkydG9BbGlnbmVkICAgICAgICAKLSAgICAgICAgTERNICAgICBwU3JjLCB7eDAsIHgxLCB4Mn0KLSAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMQotICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAKLSAgICAgICAgCi0gICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKLQotICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICMxNgotICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjMTYKLSAgICAgICAgTU9WICAgICB4MSwgeDEsIExTUiAjMTYKLSAgICAgICAgT1JSICAgICB4MSwgeDEsIHgyLCBMU0wgIzE2Ci0gICAgICAgIE1PViAgICAgeDIsIHgyLCBMU1IgIzE2Ci0gICAgICAgIFNUTSAgICAgcERzdCEsIHt4MCwgeDEsIHgyfSAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKLSAgICAgICAgQkdUICAgICBDb3B5MnRvQWxpZ25lZAotICAgICAgICBCICAgICAgIENvcHlFbmQgIAotCi1Db3B5M3RvQWxpZ25lZCAgICAgICAgCi0gICAgICAgIExETSAgICAgcFNyYywge3gwLCB4MSwgeDJ9Ci0gICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEKLSAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwCi0gICAgICAgIAotICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCi0KLSAgICAgICAgTU9WICAgICB4MCwgeDAsIExTUiAjMjQKLSAgICAgICAgT1JSICAgICB4MCwgeDAsIHgxLCBMU0wgIzgKLSAgICAgICAgTU9WICAgICB4MSwgeDEsIExTUiAjMjQKLSAgICAgICAgT1JSICAgICB4MSwgeDEsIHgyLCBMU0wgIzgKLSAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjMjQKLSAgICAgICAgU1RNICAgICBwRHN0ISwge3gwLCB4MSwgeDJ9ICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIGFsaWduZWQgb3V0cHV0IHJvdwotICAgICAgICBCR1QgICAgIENvcHkzdG9BbGlnbmVkCi0KLUNvcHlFbmQgIAotICAgICAgICAKLSAgICAgICAgTU9WICAgICBwU3JjLCBTY3JhdGNoCi0gICAgICAgIE1PViAgICAgc3JjU3RlcCwgIzEyCi0KLSAgICAgICAgTV9FTkQKLSAgICAKLQotOy8vIEZ1bmN0aW9uOgotOy8vICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQotOy8vCi07Ly8gSW1wbGVtZW50cyBjb3B5IGZyb20gYW4gYXJiaXRyYXJ5IGFsaWduZWQgc291cmNlIG1lbW9yeSBsb2NhdGlvbiAocFNyYykgdG8gYW4gYWxpZ25lZAotOy8vIGRlc3RpbmF0aW9uIHBvaW50ZWQgYnkgKHBEc3QpIGZvciB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uLgotOy8vIFRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gY29weSA0IGJ5dGVzIGluIGhvcml6b250YWwgZGlyZWN0aW9uIAotOy8vCi07Ly8gUmVnaXN0ZXJzIHVzZWQgYXMgaW5wdXQgZm9yIHRoaXMgZnVuY3Rpb24KLTsvLyByMCxyMSxyOCxyOSB3aGVyZSByOCBjb250YWluaW5ncyBhbGlnbmVkIG1lbW9yeSBwb2ludGVyIGFuZCByOSBubyBvZiByb3dzIHRvIGNvcHkKLTsvLwotOy8vIFJlZ2lzdGVycyBwcmVzZXJ2ZWQgZm9yIHRvcCBsZXZlbCBmdW5jdGlvbgotOy8vIHIyLHIzLHI0LHI1LHI2Ci07Ly8KLTsvLyBSZWdpc3RlcnMgbW9kaWZpZWQgYnkgdGhlIGZ1bmN0aW9uCi07Ly8gcjcscjgscjkscjEwLHIxMSxyMTIKLTsvLwotOy8vIE91dHB1dCByZWdpc3RlcnMKLTsvLyByMCAtIHBvaW50ZXIgdG8gdGhlIG5ldyBhbGlnbmVkIGxvY2F0aW9uIHdoaWNoIHdpbGwgYmUgdXNlZCBhcyBwU3JjCi07Ly8gcjEgLSBzdGVwIHNpemUgdG8gdGhpcyBhbGlnbmVkIGxvY2F0aW9uCi0KLSAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckFsaWduNHhfdW5zYWZlICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBDb3B5IHBTcmMgdG8gc3RhY2sKLVN0YXJ0VkFsaWduZWRTdGFja0NvcHkKLSAgICAgICAgQU5EICAgICB4LCBwU3JjLCAjMwotICAgICAgICBCSUMgICAgIHBTcmMsIHBTcmMsICMzICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgTV9TV0lUQ0ggeAotICAgICAgICBNX0NBU0UgICBDb3B5MHRvVkFsaWduZWQKLSAgICAgICAgTV9DQVNFICAgQ29weTF0b1ZBbGlnbmVkCi0gICAgICAgIE1fQ0FTRSAgIENvcHkydG9WQWxpZ25lZAotICAgICAgICBNX0NBU0UgICBDb3B5M3RvVkFsaWduZWQKLSAgICAgICAgTV9FTkRTV0lUQ0gKLSAgICAgICAgCi1Db3B5MHRvVkFsaWduZWQgIAotICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMQotICAgICAgICAKLSAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAotCi0gICAgICAgIFNUUiAgICAgeDAsIFtwRHN0XSwgIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93Ci0gICAgICAgIEJHVCAgICAgQ29weTB0b1ZBbGlnbmVkCi0gICAgICAgIEIgICAgICAgQ29weVZFbmQgIAotICAgICAgCi1Db3B5MXRvVkFsaWduZWQgICAgICAgIAotICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCi0gICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKLQotICAgICAgICBNT1YgICAgIHgxLCB4MSwgTFNMICMyNAotICAgICAgICBPUlIgICAgIHgwLCB4MSwgeDAsIExTUiAjOAotICAgICAgICBTVFIgICAgIHgwLCBbcERzdF0sICM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIGFsaWduZWQgb3V0cHV0IHJvdwotICAgICAgICBCR1QgICAgIENvcHkxdG9WQWxpZ25lZAotICAgICAgICBCICAgICAgIENvcHlWRW5kICAKLQotQ29weTJ0b1ZBbGlnbmVkICAgICAgICAKLSAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQotICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCi0KLSAgICAgICAgTU9WICAgICB4MSwgeDEsIExTTCAjMTYKLSAgICAgICAgT1JSICAgICB4MCwgeDEsIHgwLCBMU1IgIzE2Ci0gICAgICAgIFNUUiAgICAgeDAsIFtwRHN0XSwgIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93Ci0gICAgICAgIEJHVCAgICAgQ29weTJ0b1ZBbGlnbmVkCi0gICAgICAgIEIgICAgICAgQ29weVZFbmQgIAotCi1Db3B5M3RvVkFsaWduZWQgICAgICAgIAotICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCi0gICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKLQotICAgICAgICBNT1YgICAgIHgxLCB4MSwgTFNMICM4Ci0gICAgICAgIE9SUiAgICAgeDAsIHgxLCB4MCwgTFNSICMyNAotICAgICAgICBTVFIgICAgIHgwLCBbcERzdF0sICM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIGFsaWduZWQgb3V0cHV0IHJvdwotICAgICAgICBCR1QgICAgIENvcHkzdG9WQWxpZ25lZAotCi1Db3B5VkVuZCAgCi0KLSAgICAgICAgU1VCICAgICBwU3JjLCBwRHN0LCAjMjgKLSAgICAgICAgTU9WICAgICBzcmNTdGVwLCAjNAotCi0gICAgICAgIE1fRU5ECi0KLQotICAgIEVORElGCi0KLSAgICBFTkQKLSAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weV91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5YTg5ZmQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHlfdW5zYWZlX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLTsvLyBGdW5jdGlvbjoKLTsvLyAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weTR4NF91bnNhZmUgCi07Ly8KLTsvLyBJbXBsZW1lbnRzIGNvcHkgZnJvbSBhbiBhcmJpdHJhcnkgYWxpZ25lZCBzb3VyY2UgbWVtb3J5IGxvY2F0aW9uIChwU3JjKSB0byBhbiBhbGlnbmVkCi07Ly8gZGVzdGluYXRpb24gcG9pbnRlZCBieSAocERzdCkKLTsvLwotOy8vIFJlZ2lzdGVycyBwcmVzZXJ2ZWQgZm9yIHRvcCBsZXZlbCBmdW5jdGlvbgotOy8vIHIxLHIzLHI0LHI1LHI2LHI3LHIxMCxyMTEscjE0Ci07Ly8KLTsvLyBSZWdpc3RlcnMgbW9kaWZpZWQgYnkgdGhlIGZ1bmN0aW9uCi07Ly8gcjAscjIscjgscjkscjEyCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLSAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLQotICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weTR4NF91bnNhZmUKLSAgICAgICAgCi07Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKLXBTcmMgICAgICAgICAgICBSTiAwCi1zcmNTdGVwICAgICAgICAgUk4gMQotcERzdCAgICAgICAgICAgIFJOIDIKLWRzdFN0ZXAgICAgICAgICBSTiAzCi0KLTsvLyBEZWNsYXJlIG90aGVyIGludGVybWVkaWF0ZSByZWdpc3RlcnMKLXgwICAgICAgICAgICAgICBSTiA0Ci14MSAgICAgICAgICAgICAgUk4gNQoteDIgICAgICAgICAgICAgIFJOIDgKLXgzICAgICAgICAgICAgICBSTiA5Ci1UZW1wICAgICAgICAgICAgUk4gMTIKLQotICAgIElGIEFSTTExMzZKUwotCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weTR4NF91bnNhZmUsIHI2Ci0KLUNvcHk0eDRTdGFydAotICAgICAgICA7Ly8gRG8gQ29weSBhbmQgYnJhbmNoIHRvIEVuZE9mSW50ZXJwb2xhdGlvbgotICAgICAgICBBTkQgICAgIFRlbXAsIHBTcmMsICMzCi0gICAgICAgIEJJQyAgICAgcFNyYywgcFNyYywgIzMgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICBNX1NXSVRDSCBUZW1wCi0gICAgICAgIE1fQ0FTRSAgQ29weTR4NEFsaWduMAotICAgICAgICBNX0NBU0UgIENvcHk0eDRBbGlnbjEKLSAgICAgICAgTV9DQVNFICBDb3B5NHg0QWxpZ24yCi0gICAgICAgIE1fQ0FTRSAgQ29weTR4NEFsaWduMwotICAgICAgICBNX0VORFNXSVRDSAotCi1Db3B5NHg0QWxpZ24wCi0gICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBNX0xEUiAgIHgxLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgTV9TVFIgICB4MCwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBNX1NUUiAgIHgxLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgTV9MRFIgICB4MywgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIE1fU1RSICAgeDIsIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBNX1NUUiAgIHgzLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgQiAgICAgICBDb3B5NHg0RW5kICAKLQotQ29weTR4NEFsaWduMQotICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCi0gICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBMRFIgICAgIHgzLCBbcFNyYywgIzRdCi0gICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICM4Ci0gICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICMyNAotICAgICAgICBNX1NUUiAgIHgwLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjOAotICAgICAgICBPUlIgICAgIHgyLCB4MiwgeDMsIExTTCAjMjQKLSAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQotICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgTV9TVFIgICB4MiwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIExEUiAgICAgeDMsIFtwU3JjLCAjNF0KLSAgICAgICAgTV9MRFIgICB4MiwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzgKLSAgICAgICAgT1JSICAgICB4MCwgeDAsIHgxLCBMU0wgIzI0Ci0gICAgICAgIE1fU1RSICAgeDAsIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICM4Ci0gICAgICAgIE9SUiAgICAgeDIsIHgyLCB4MywgTFNMICMyNAotICAgICAgICBNX1NUUiAgIHgyLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgQiAgICAgICBDb3B5NHg0RW5kICAKLSAgICAgIAotQ29weTR4NEFsaWduMgotICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCi0gICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBMRFIgICAgIHgzLCBbcFNyYywgIzRdCi0gICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICMxNgotICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjMTYKLSAgICAgICAgTV9TVFIgICB4MCwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIE1PViAgICAgeDIsIHgyLCBMU1IgIzE2Ci0gICAgICAgIE9SUiAgICAgeDIsIHgyLCB4MywgTFNMICMxNgotICAgICAgICBNX1NUUiAgIHgyLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgIAotCi0gICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KLSAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIExEUiAgICAgeDMsIFtwU3JjLCAjNF0KLSAgICAgICAgTV9MRFIgICB4MiwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzE2Ci0gICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICMxNgotICAgICAgICBNX1NUUiAgIHgwLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjMTYKLSAgICAgICAgT1JSICAgICB4MiwgeDIsIHgzLCBMU0wgIzE2Ci0gICAgICAgIE1fU1RSICAgeDIsIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgCi0gICAgICAgIEIgICAgICAgQ29weTR4NEVuZCAgCi0KLUNvcHk0eDRBbGlnbjMgCi0gICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KLSAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIExEUiAgICAgeDMsIFtwU3JjLCAjNF0KLSAgICAgICAgTV9MRFIgICB4MiwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzI0Ci0gICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICM4Ci0gICAgICAgIE1fU1RSICAgeDAsIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICMyNAotICAgICAgICBPUlIgICAgIHgyLCB4MiwgeDMsIExTTCAjOAotICAgICAgICBNX1NUUiAgIHgyLCBbcERzdF0sIGRzdFN0ZXAKLQotICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCi0gICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBMRFIgICAgIHgzLCBbcFNyYywgIzRdCi0gICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICMyNAotICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjOAotICAgICAgICBNX1NUUiAgIHgwLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjMjQKLSAgICAgICAgT1JSICAgICB4MiwgeDIsIHgzLCBMU0wgIzgKLSAgICAgICAgTV9TVFIgICB4MiwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIEIgICAgICAgQ29weTR4NEVuZCAgCi0KLUNvcHk0eDRFbmQKLSAgICAgICAgTV9FTkQKLQotICAgIEVORElGCi0KLSAgICBFTkQKLSAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfRGlhZ0NvcHlfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfRGlhZ0NvcHlfdW5zYWZlX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThiNjdlYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi0gICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLSAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckRpYWdDb3B5X3Vuc2FmZQotICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyRGlhZ0NvcHlfdW5zYWZlCi0KLTsvLyBGdW5jdGlvbnM6IAotOy8vICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JEaWFnQ29weV91bnNhZmUgYW5kCi07Ly8gICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckRpYWdDb3B5X3Vuc2FmZSAKLTsvLwotOy8vIEltcGxlbWVudHMgcmUtYXJyYW5nZW1lbnQgb2YgZGF0YSBmcm9tIHRlbXBvcmFyeSBidWZmZXIgdG8gYSBidWZmZXIgcG9pbnRlZCBieSBwQnVmLgotOy8vIFRoaXMgd2lsbCBkbyB0aGUgY29udmVydGlvbiBvZiBkYXRhIGZyb20gMTYgYml0IHRvIDggYml0IGFuZCBpdCBhbHNvCi07Ly8gcmVtb3ZlIG9mZnNldCBhbmQgY2hlY2sgZm9yIHNhdHVyYXRpb24uCi07Ly8KLTsvLyBSZWdpc3RlcnMgdXNlZCBhcyBpbnB1dCBmb3IgdGhpcyBmdW5jdGlvbgotOy8vIHIwLHIxLHI3IHdoZXJlIHIwIGlzIGlucHV0IHBvaW50ZXIgYW5kIHIyIGl0cyBzdGVwIHNpemUsIHI3IGlzIG91dHB1dCBwb2ludGVyCi07Ly8KLTsvLyBSZWdpc3RlcnMgcHJlc2VydmVkIGZvciB0b3AgbGV2ZWwgZnVuY3Rpb24KLTsvLyByNCxyNSxyNixyOCxyOSxyMTQKLTsvLwotOy8vIFJlZ2lzdGVycyBtb2RpZmllZCBieSB0aGUgZnVuY3Rpb24KLTsvLyByNyxyMTAscjExLHIxMgotOy8vCi07Ly8gT3V0cHV0IHJlZ2lzdGVycwotOy8vIHIwIC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gbG9jYXRpb24KLTsvLyByMSAtIHN0ZXAgc2l6ZSB0byB0aGlzIGRlc3RpbmF0aW9uIGxvY2F0aW9uCi0KLQotREVCVUdfT04gICAgU0VUTCB7RkFMU0V9Ci0gICAgICAgIAotTUFTSyAgICAgICAgICAgIEVRVSAweDgwODA4MDgwICA7Ly8gTWFzayBpcyB1c2VkIHRvIGltcGxlbWVudCAoYStiKzEpLzIKLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi0KLXBTcmMwICAgICAgICAgICBSTiAwCi1zcmNTdGVwMCAgICAgICAgUk4gMQotCi07Ly8gRGVjbGFyZSBvdGhlciBpbnRlcm1lZGlhdGUgcmVnaXN0ZXJzCi1UZW1wMSAgICAgICAgICAgUk4gNAotVGVtcDIgICAgICAgICAgIFJOIDUKLVRlbXAzICAgICAgICAgICBSTiAxMAotVGVtcDQgICAgICAgICAgIFJOIDExCi1wQnVmICAgICAgICAgICAgUk4gNwotcjB4MGZlMDBmZTAgICAgIFJOIDYKLXIweDAwZmYwMGZmICAgICBSTiAxMgotQ291bnQgICAgICAgICAgIFJOIDE0Ci1WYWx1ZUEwICAgICAgICAgUk4gMTAKLVZhbHVlQTEgICAgICAgICBSTiAxMQotCi0gICAgSUYgQVJNMTEzNkpTCi0KLQotICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yRGlhZ0NvcHlfdW5zYWZlLCByNgotCi0gICAgICAgIDsvLyBDb2RlIHN0YXJ0ICAgICAKLSAgICAgICAgTU9WICAgICAgICAgQ291bnQsICM0ICAgCi0gICAgICAgIExEUiAgICAgICAgIHIweDBmZTAwZmUwLCA9MHgwZmUwMGZlMAotICAgICAgICBMRFIgICAgICAgICByMHgwMGZmMDBmZiwgPTB4MDBmZjAwZmYgICAgICAgIAotTG9vcFN0YXJ0MQotICAgICAgICBMRFIgICAgICAgICBUZW1wNCwgW3BTcmMwLCAjMTJdCi0gICAgICAgIExEUiAgICAgICAgIFRlbXAzLCBbcFNyYzAsICM4XSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIFRlbXAyLCBbcFNyYzAsICM0XQotICAgICAgICBNX0xEUiAgICAgICBUZW1wMSwgW3BTcmMwXSwgc3JjU3RlcDAgICAgICAgICAgICAgIAotICAgICAgICBVUVNVQjE2ICAgICBUZW1wNCwgVGVtcDQsIHIweDBmZTAwZmUwICAgICAgICAKLSAgICAgICAgVVFTVUIxNiAgICAgVGVtcDMsIFRlbXAzLCByMHgwZmUwMGZlMCAgICAgICAgICAgICAgICAgCi0gICAgICAgIFVRU1VCMTYgICAgIFRlbXAyLCBUZW1wMiwgcjB4MGZlMDBmZTAgICAgICAgIAotICAgICAgICBVUVNVQjE2ICAgICBUZW1wMSwgVGVtcDEsIHIweDBmZTAwZmUwICAgICAgICAgICAgICAgICAKLSAgICAgICAgVVNBVDE2ICAgICAgVGVtcDQsICMxMywgVGVtcDQKLSAgICAgICAgVVNBVDE2ICAgICAgVGVtcDMsICMxMywgVGVtcDMgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBVU0FUMTYgICAgICBUZW1wMiwgIzEzLCBUZW1wMgotICAgICAgICBVU0FUMTYgICAgICBUZW1wMSwgIzEzLCBUZW1wMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQU5EICAgICAgICAgVGVtcDQsIHIweDAwZmYwMGZmLCBUZW1wNCwgTFNSICM1ICAgICAgICAgCi0gICAgICAgIEFORCAgICAgICAgIFRlbXAzLCByMHgwMGZmMDBmZiwgVGVtcDMsIExTUiAjNSAgICAgICAgIAotICAgICAgICBBTkQgICAgICAgICBUZW1wMiwgcjB4MDBmZjAwZmYsIFRlbXAyLCBMU1IgIzUgICAgICAgICAKLSAgICAgICAgQU5EICAgICAgICAgVGVtcDEsIHIweDAwZmYwMGZmLCBUZW1wMSwgTFNSICM1ICAgICAgICAgCi0gICAgICAgIE9SUiAgICAgICAgIFZhbHVlQTEsIFRlbXAzLCBUZW1wNCwgTFNMICM4ICAgICAgICAgICAgIAotICAgICAgICBPUlIgICAgICAgICBWYWx1ZUEwLCBUZW1wMSwgVGVtcDIsIExTTCAjOCAgICAgICAgICAgICAKLSAgICAgICAgU1VCUyAgICAgICAgQ291bnQsIENvdW50LCAjMSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgU1RSRCAgICAgICAgVmFsdWVBMCwgW3BCdWZdLCAjOCAKLSAgICAgICAgQkdUICAgICAgICAgTG9vcFN0YXJ0MQotRW5kMQotICAgICAgICBTVUIgICAgICAgIHBTcmMwLCBwQnVmLCAjMzIKLSAgICAgICAgTU9WICAgICAgICBzcmNTdGVwMCwgIzgKLQotICAgICAgICBNX0VORAotCi0KLSAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckRpYWdDb3B5X3Vuc2FmZSwgcjYKLSAgICAgICAgCi0gICAgICAgIDsvLyBDb2RlIHN0YXJ0ICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgcjB4MGZlMDBmZTAsID0weDBmZTAwZmUwCi0gICAgICAgIExEUiAgICAgICAgIHIweDAwZmYwMGZmLCA9MHgwMGZmMDBmZgotICAgICAgICBNT1YgICAgICAgICBDb3VudCwgIzIKLQotTG9vcFN0YXJ0ICAgIAotICAgICAgICBMRFIgICAgICAgICBUZW1wNCwgW3BTcmMwLCAjMTJdCi0gICAgICAgIExEUiAgICAgICAgIFRlbXAzLCBbcFNyYzAsICM4XSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIFRlbXAyLCBbcFNyYzAsICM0XQotICAgICAgICBNX0xEUiAgICAgICBUZW1wMSwgW3BTcmMwXSwgc3JjU3RlcDAKLSAgICAgICAgCi0gICAgICAgIFVRU1VCMTYgICAgIFRlbXA0LCBUZW1wNCwgcjB4MGZlMDBmZTAgICAgICAgIAotICAgICAgICBVUVNVQjE2ICAgICBUZW1wMywgVGVtcDMsIHIweDBmZTAwZmUwICAgICAgICAgICAgICAgICAKLSAgICAgICAgVVFTVUIxNiAgICAgVGVtcDIsIFRlbXAyLCByMHgwZmUwMGZlMCAgICAgICAgCi0gICAgICAgIFVRU1VCMTYgICAgIFRlbXAxLCBUZW1wMSwgcjB4MGZlMDBmZTAgICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgVVNBVDE2ICAgICAgVGVtcDQsICMxMywgVGVtcDQKLSAgICAgICAgVVNBVDE2ICAgICAgVGVtcDMsICMxMywgVGVtcDMgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBVU0FUMTYgICAgICBUZW1wMiwgIzEzLCBUZW1wMgotICAgICAgICBVU0FUMTYgICAgICBUZW1wMSwgIzEzLCBUZW1wMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBBTkQgICAgICAgICBUZW1wNCwgcjB4MDBmZjAwZmYsIFRlbXA0LCBMU1IgIzUgICAgICAgICAKLSAgICAgICAgQU5EICAgICAgICAgVGVtcDMsIHIweDAwZmYwMGZmLCBUZW1wMywgTFNSICM1ICAgICAgICAgCi0gICAgICAgIEFORCAgICAgICAgIFRlbXAyLCByMHgwMGZmMDBmZiwgVGVtcDIsIExTUiAjNSAgICAgICAgIAotICAgICAgICBBTkQgICAgICAgICBUZW1wMSwgcjB4MDBmZjAwZmYsIFRlbXAxLCBMU1IgIzUgICAgICAgICAKLSAgICAgICAgT1JSICAgICAgICAgVmFsdWVBMSwgVGVtcDMsIFRlbXA0LCBMU0wgIzggICAgICAgIDsvLyBbZDIgYzIgZDAgYzBdICAgICAgICAgICAgIAotICAgICAgICBPUlIgICAgICAgICBWYWx1ZUEwLCBUZW1wMSwgVGVtcDIsIExTTCAjOCAgICAgICAgOy8vIFtiMiBhMiBiMCBhMF0gICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFBLSEJUICAgICAgIFRlbXAxLCBWYWx1ZUEwLCBWYWx1ZUExLCBMU0wgIzE2ICAgICA7Ly8gW2QwIGMwIGIwIGEwXQotCi0gICAgICAgIFNUUiAgICAgICAgIFRlbXAxLCBbcEJ1Zl0sICM4IAotICAgICAgICBQS0hUQiAgICAgICBUZW1wMiwgVmFsdWVBMSwgVmFsdWVBMCwgQVNSICMxNiAgICAgOy8vIFtkMiBjMiBiMiBhMl0KLSAgICAgICAgU1RSICAgICAgICAgVGVtcDIsIFtwQnVmXSwgIy00ICAKLQotICAgICAgICBMRFIgICAgICAgICBUZW1wNCwgW3BTcmMwLCAjMTJdCi0gICAgICAgIExEUiAgICAgICAgIFRlbXAzLCBbcFNyYzAsICM4XSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIFRlbXAyLCBbcFNyYzAsICM0XQotICAgICAgICBNX0xEUiAgICAgICBUZW1wMSwgW3BTcmMwXSwgc3JjU3RlcDAKLSAgICAgICAgCi0gICAgICAgIFVRU1VCMTYgICAgIFRlbXA0LCBUZW1wNCwgcjB4MGZlMDBmZTAgICAgICAgIAotICAgICAgICBVUVNVQjE2ICAgICBUZW1wMywgVGVtcDMsIHIweDBmZTAwZmUwICAgICAgICAgICAgICAgICAKLSAgICAgICAgVVFTVUIxNiAgICAgVGVtcDIsIFRlbXAyLCByMHgwZmUwMGZlMCAgICAgICAgCi0gICAgICAgIFVRU1VCMTYgICAgIFRlbXAxLCBUZW1wMSwgcjB4MGZlMDBmZTAgICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgVVNBVDE2ICAgICAgVGVtcDQsICMxMywgVGVtcDQKLSAgICAgICAgVVNBVDE2ICAgICAgVGVtcDMsICMxMywgVGVtcDMgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBVU0FUMTYgICAgICBUZW1wMiwgIzEzLCBUZW1wMgotICAgICAgICBVU0FUMTYgICAgICBUZW1wMSwgIzEzLCBUZW1wMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBBTkQgICAgICAgICBUZW1wNCwgcjB4MDBmZjAwZmYsIFRlbXA0LCBMU1IgIzUgICAgICAgICAKLSAgICAgICAgQU5EICAgICAgICAgVGVtcDMsIHIweDAwZmYwMGZmLCBUZW1wMywgTFNSICM1ICAgICAgICAgCi0gICAgICAgIEFORCAgICAgICAgIFRlbXAyLCByMHgwMGZmMDBmZiwgVGVtcDIsIExTUiAjNSAgICAgICAgIAotICAgICAgICBBTkQgICAgICAgICBUZW1wMSwgcjB4MDBmZjAwZmYsIFRlbXAxLCBMU1IgIzUgICAgICAgICAKLSAgICAgICAgT1JSICAgICAgICAgVmFsdWVBMSwgVGVtcDMsIFRlbXA0LCBMU0wgIzggICAgICAgIDsvLyBbZDIgYzIgZDAgYzBdICAgICAgICAgICAgIAotICAgICAgICBPUlIgICAgICAgICBWYWx1ZUEwLCBUZW1wMSwgVGVtcDIsIExTTCAjOCAgICAgICAgOy8vIFtiMiBhMiBiMCBhMF0gICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFBLSEJUICAgICAgIFRlbXAxLCBWYWx1ZUEwLCBWYWx1ZUExLCBMU0wgIzE2ICAgICA7Ly8gW2QwIGMwIGIwIGEwXQotICAgICAgICBTVUJTICAgICAgICBDb3VudCwgQ291bnQsICMxCi0gICAgICAgIFNUUiAgICAgICAgIFRlbXAxLCBbcEJ1Zl0sICM4IAotICAgICAgICBQS0hUQiAgICAgICBUZW1wMiwgVmFsdWVBMSwgVmFsdWVBMCwgQVNSICMxNiAgICAgOy8vIFtkMiBjMiBiMiBhMl0KLSAgICAgICAgU1RSICAgICAgICAgVGVtcDIsIFtwQnVmXSwgIzQgIAotICAgICAgICAKLSAgICAgICAgQkdUICAgICAgICAgTG9vcFN0YXJ0Ci1FbmQyCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMwLCBwQnVmLCAjMzItOAotICAgICAgICBNT1YgICAgICAgICBzcmNTdGVwMCwgIzQKLQotICAgICAgICBNX0VORAotCi0gICAgRU5ESUYKLSAgICAKLSAgICBFTkQKLSAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIzZWFjZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTAgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi0gICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKLQotICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotCi0KLQotICAgIElGIEFSTTExMzZKUyAKLQotCi0gICAgICAgIE1fQUxMT0M4IHBwRHN0QXJncywgOAotICAgICAgICBNX0FMTE9DOCBwVGVtcFJlc3VsdDEsIDgKLSAgICAgICAgTV9BTExPQzggcFRlbXBSZXN1bHQyLCA4Ci0gICAgICAgIE1fQUxMT0M0IHBwU3JjLCA0Ci0gICAgICAgIE1fQUxMT0M0IHBwRHN0LCA0Ci0gICAgICAgIE1fQUxMT0M0IHBEc3RTdGVwLCA0Ci0gICAgICAgIE1fQUxMT0M0IHBTcmNTdGVwLCA0Ci0gICAgICAgIE1fQUxMT0M0IHBDb3VudGVyLCA0Ci0KLSAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgotICAgICAgICA7Ly8gRnVuY3Rpb246IAotICAgICAgICA7Ly8gICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIEltcGxlbWVudHMgZGlhZ29uYWwgaW50ZXJwb2xhdGlvbiBmb3IgYSBibG9jayBvZiBzaXplIDR4NC4gSW5wdXQgYW5kIG91dHB1dCBzaG91bGQgCi0gICAgICAgIDsvLyBiZSBhbGlnbmVkLiAKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBSZWdpc3RlcnMgdXNlZCBhcyBpbnB1dCBmb3IgdGhpcyBmdW5jdGlvbgotICAgICAgICA7Ly8gcjAscjEscjIscjMsIHI4IHdoZXJlIHIwLHIyICBpbnB1dCBwb2ludGVyIGFuZCByMSxyMyBzdGVwIHNpemUsIHI4IGludGVybWVkaWF0ZS1idWYgcG9pbnRlcgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFJlZ2lzdGVycyBwcmVzZXJ2ZWQgZm9yIHRvcCBsZXZlbCBmdW5jdGlvbgotICAgICAgICA7Ly8gcjAscjEscjIscjMscjQscjUscjYscjE0Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gUmVnaXN0ZXJzIG1vZGlmaWVkIGJ5IHRoZSBmdW5jdGlvbgotICAgICAgICA7Ly8gcjcscjgscjkscjEwLHIxMSxyMTIKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBPdXRwdXQgcmVnaXN0ZXJzCi0gICAgICAgIDsvLyBOb25lLiBGdW5jdGlvbiB3aWxsIHByZXNlcnZlIHIwLXIzCi0KLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUsIHI2Ci0gICAgICAgIAotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi1wU3JjICAgICAgICAgICAgUk4gMAotc3JjU3RlcCAgICAgICAgIFJOIDEKLXBEc3QgICAgICAgICAgICBSTiAyCi1kc3RTdGVwICAgICAgICAgUk4gMwotCi07Ly8gRGVjbGFyZSBpbm5lciBsb29wIHJlZ2lzdGVycwotQWNjMCAgICAgICAgICAgIFJOIDQKLUFjYzEgICAgICAgICAgICBSTiA1Ci1BY2MyICAgICAgICAgICAgUk4gNgotQWNjMyAgICAgICAgICAgIFJOIDcKLQotVmFsQSAgICAgICAgICAgIFJOIDQKLVZhbEIgICAgICAgICAgICBSTiA1Ci1WYWxDICAgICAgICAgICAgUk4gNgotVmFsRCAgICAgICAgICAgIFJOIDcKLVZhbEUgICAgICAgICAgICBSTiA4Ci1WYWxGICAgICAgICAgICAgUk4gOQotVmFsRyAgICAgICAgICAgIFJOIDEyCi1WYWxIICAgICAgICAgICAgUk4gMTQKLVZhbEkgICAgICAgICAgICBSTiAxCi0KLVRlbXAxICAgICAgICAgICBSTiAzCi1UZW1wMiAgICAgICAgICAgUk4gMQotVGVtcDMgICAgICAgICAgIFJOIDEyCi1UZW1wNCAgICAgICAgICAgUk4gNwotVGVtcDUgICAgICAgICAgIFJOIDUKLXIweDBmZTAwZmUwICAgICBSTiAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFswICgxNioyNTUgLSAxNikgMCAoMTYqMjU1IC0gMTYpXQotcjB4MDBmZjAwZmYgICAgIFJOIDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgMjU1IDAgMjU1XSB3aGVyZSAyNTUgaXMgb2Zmc2V0Ci1Db3VudGVyICAgICAgICAgUk4gMTEKLXBJbnRlckJ1ZiAgICAgICBSTiA4Ci0KLVZhbENBICAgICAgICAgICBSTiA4Ci1WYWxEQiAgICAgICAgICAgUk4gOQotVmFsR0UgICAgICAgICAgIFJOIDEwCi1WYWxIRiAgICAgICAgICAgUk4gMTEKLXIweDAwMTQwMDAxICAgICBSTiAxMgotcjB4MDAxNGZmZmIgICAgIFJOIDE0Ci0KLXIweDAwMDFmYzAwICAgICBSTiAxMQotCi1BY2N4ICAgICAgICAgICAgUk4gOAotQWNjeSAgICAgICAgICAgIFJOIDkKLVRlbXA2ICAgICAgICAgICBSTiAxNAotCi0gICAgICAgIE1fU1RSRCAgICAgIHBEc3QsIGRzdFN0ZXAsIHBwRHN0QXJncwotCi0gICAgICAgIE1PViAgICAgICAgIHBEc3QsIHBJbnRlckJ1ZiAgICAgICAgICAgICAgICAKLSAgICAgICAgTU9WICAgICAgICAgZHN0U3RlcCwgIzE2Ci0KLSAgICAgICAgOy8vIFNldCB1cCBjb3VudGVyIG9mIGZvcm1hdCwgWzBdICBbMF0gIFsxIChoZWlnaHQpXSAgWzggKHdpZHRoKV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgTU9WICAgICAgICAgQ291bnRlciwgIzQKLSAgICAgICAgTV9TVFIgICAgICAgZHN0U3RlcCwgcERzdFN0ZXAgICAgICAgIAotICAgICAgICBNX1NUUiAgICAgICBzcmNTdGVwLCBwU3JjU3RlcCAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIHIweDAwZmYwMGZmLCA9MHgwMGZmMDBmZiAgICAgICAgICAgICAgIDsvLyBbMCAyNTUgMCAyNTVdIDI1NSBpcyBvZmZzZXQgdG8gYXZvaWQgbmVnYXRpdmUgcmVzdWx0cyAKLQotSGVpZ2h0TG9vcAotTmV4dFR3b1Jvd3NMb29wCi0gICAgICAgIExEUiAgICAgVmFsRCwgW3BTcmMsIHNyY1N0ZXBdICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHJvdyAxIFtkMSBjMSBiMSBhMV0KLSAgICAgICAgTERSICAgICBWYWxBLCBbcFNyY10sICM0ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgcm93IDAgW2QwIGMwIGIwIGEwXQotICAgICAgICBMRFIgICAgIFZhbEgsIFtwU3JjLCBzcmNTdGVwXSAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2gxIGcxIGYxIGUxXSAgICAgICAgCi0gICAgICAgIExEUiAgICAgVmFsRSwgW3BTcmNdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbaDAgZzAgZjAgZTBdCi0gICAgICAgIExEUkIgICAgVGVtcDIsIFtwU3JjLCBzcmNTdGVwXSAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHJvdyAxIFtsMSBrMSBqMSBpMV0KLSAgICAgICAgTERSQiAgICBUZW1wMSwgW3BTcmNdLCAjLTggICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgcm93IDAgW2wwIGswIGowIGkwXQotICAgICAgICAKLSAgICAgICAgUEtIQlQgICBWYWxCLCBWYWxBLCBWYWxELCBMU0wgIzE2ICAgICAgICAgICAgICAgOy8vIFtiMSBhMSBiMCBhMF0KLSAgICAgICAgUEtIVEIgICBWYWxELCBWYWxELCBWYWxBLCBBU1IgIzE2ICAgICAgICAgICAgICAgOy8vIFtkMSBjMSBkMCBjMF0KLSAgICAgICAgVVhUQUIxNiBWYWxBLCByMHgwMGZmMDBmZiwgVmFsQiAgICAgICAgICAgICAgICAgOy8vIFswMCBhMSAwMCBhMF0gKyBbMCAyNTUgMCAyNTVdCi0gICAgICAgIFVYVEFCMTYgVmFsQywgcjB4MDBmZjAwZmYsIFZhbEQgICAgICAgICAgICAgICAgIDsvLyBbMDAgYzEgMDAgYzBdICsgWzAgMjU1IDAgMjU1XQotICAgICAgICBQS0hCVCAgIFZhbEksIFRlbXAxLCBUZW1wMiwgTFNMICMxNiAgICAgICAgICAgICA7Ly8gWzAwIGkxIDAwIGkwXSAgICAgICAgICAgIAotICAgICAgICBQS0hCVCAgIFZhbEYsIFZhbEUsIFZhbEgsIExTTCAjMTYgICAgICAgICAgICAgICA7Ly8gW2YxIGUxIGYwIGUwXQotICAgICAgICBQS0hUQiAgIFZhbEgsIFZhbEgsIFZhbEUsIEFTUiAjMTYgICAgICAgICAgICAgICA7Ly8gW2gxIGcxIGgwIGcwXQotICAgICAgICBVWFRBQjE2IFZhbEUsIHIweDAwZmYwMGZmLCBWYWxGICAgICAgICAgICAgICAgICA7Ly8gWzAwIGUxIDAwIGUwXSArIFswIDI1NSAwIDI1NV0KLQotICAgICAgICA7Ly8gQ2FsY3VsYXRlIEFjYzAKLSAgICAgICAgOy8vIEFjYzAgPSBhIC0gNSpiICsgMjAqYyArIDIwKmQgLSA1KmUgKyBmCi0gICAgICAgIFVYVEFCMTYgVGVtcDEsIFZhbEMsIFZhbEQsIFJPUiAjOAotICAgICAgICBVWFRBQjE2IFRlbXAzLCBWYWxFLCBWYWxCLCBST1IgIzgKLSAgICAgICAgUlNCICAgICBUZW1wMSwgVGVtcDMsIFRlbXAxLCBMU0wgIzIgICAgICAgICAgICAgICAgCi0gICAgICAgIFVYVEFCMTYgQWNjMCwgVmFsQSwgVmFsRiwgUk9SICM4Ci0gICAgICAgIEFERCAgICAgVGVtcDEsIFRlbXAxLCBUZW1wMSwgTFNMICMyICAgICAgICAKLSAgICAgICAgQUREICAgICBBY2MwLCBBY2MwLCBUZW1wMSAgICAgICAKLQotICAgICAgICA7Ly8gQ2FsY3VsYXRlIEFjYzEKLSAgICAgICAgOy8vIEFjYzEgPSBiIC0gNSpjICsgMjAqZCArIDIwKmUgLSA1KmYgKyBnCi0gICAgICAgIFVYVEFCMTYgVGVtcDEsIFZhbEUsIFZhbEQsIFJPUiAjOAotICAgICAgICBVWFRBQjE2IFRlbXAzLCBWYWxDLCBWYWxGLCBST1IgIzgKLSAgICAgICAgUlNCICAgICBUZW1wMSwgVGVtcDMsIFRlbXAxLCBMU0wgIzIgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgVVhUQUIxNiBWYWxHLCByMHgwMGZmMDBmZiwgVmFsSCAgICAgICAgICAgICAgICAgOy8vIFswMCBnMSAwMCBnMF0gKyBbMCAyNTUgMCAyNTVdCi0gICAgICAgIEFERCAgICAgVGVtcDEsIFRlbXAxLCBUZW1wMSwgTFNMICMyICAgICAgICAKLSAgICAgICAgVVhUQUIxNiBBY2MxLCBWYWxHLCBWYWxCLCBST1IgIzgKLSAgICAgICAgQUREICAgICBBY2MxLCBBY2MxLCBUZW1wMSAgICAgICAgCi0KLSAgICAgICAgVVhUQUIxNiBBY2MyLCBWYWxDLCBWYWxILCBST1IgIzggICAgICAgIAotICAgICAgICBBREQgICAgIFZhbEksIHIweDAwZmYwMGZmLCBWYWxJICAgICAgICAgICAgICAgICA7Ly8gWzAwIGkxIDAwIGkwXSArIFswIDI1NSAwIDI1NV0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIENhbGN1bGF0ZSBBY2MyCi0gICAgICAgIDsvLyBBY2MyID0gYyAtIDUqZCArIDIwKmUgKyAyMCpmIC0gNSpnICsgaAotICAgICAgICBVWFRBQjE2IFRlbXAxLCBWYWxHLCBWYWxELCBST1IgIzgKLSAgICAgICAgVVhUQUIxNiBBY2MzLCBWYWxJLCBWYWxELCBST1IgIzgKLSAgICAgICAgVVhUQUIxNiBUZW1wMiwgVmFsRSwgVmFsRiwgUk9SICM4Ci0gICAgICAgIAotICAgICAgICBSU0IgICAgIFRlbXAxLCBUZW1wMSwgVGVtcDIsIExTTCAjMiAgICAgICAgCi0gICAgICAgIFVYVEFCMTYgVGVtcDIsIFZhbEcsIFZhbEYsIFJPUiAjOAotICAgICAgICBBREQgICAgIFRlbXAxLCBUZW1wMSwgVGVtcDEsIExTTCAjMiAgICAgICAgCi0gICAgICAgIEFERCAgICAgQWNjMiwgQWNjMiwgVGVtcDEgICAgICAgIAotCi0gICAgICAgIDsvLyBDYWxjdWxhdGUgQWNjMwotICAgICAgICA7Ly8gQWNjMyA9IGQgLSA1KmUgKyAyMCpmICsgMjAqZyAtIDUqaCArIGkKLSAgICAgICAgVVhUQUIxNiBUZW1wMSwgVmFsRSwgVmFsSCwgUk9SICM4Ci0gICAgICAgIFJTQiAgICAgVGVtcDEsIFRlbXAxLCBUZW1wMiwgTFNMICMyCi0gICAgICAgIEFERCAgICAgVGVtcDEsIFRlbXAxLCBUZW1wMSwgTFNMICMyICAgICAgICAKLSAgICAgICAgQUREICAgICBBY2MzLCBBY2MzLCBUZW1wMQotICAgICAgICAKLSAgICAgICAgTV9MRFIgICBkc3RTdGVwLCBwRHN0U3RlcCAgICAgICAgCi0gICAgICAgIE1fTERSICAgc3JjU3RlcCwgcFNyY1N0ZXAKLQotICAgICAgICA7Ly8gSWYgQ291bnRlciBpcyBldmVuIHN0b3JlIEFjYzAtQWNjMyBpbiBhIHRlbXBvcmFyeSBidWZmZXIKLSAgICAgICAgOy8vIElmIENvdW50ZXIgaXMgb2ZmIHN0b3JlIEFjYzAtQWNjMyBhbmQgcHJldmlvdXMgQWNjMC1BY2MzIGluIGEgaW50ZXJtZWRpYXRlIGJ1ZiAKLSAgICAgICAgQU5EUyAgICAgICAgVGVtcDMsIENvdW50ZXIsICMxCi0gICAgICAgIEJFUSAgICAgICAgIE5vUHJvY2Vzc2luZyAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gUGFja2luZyBwcmV2aW91cyBhbmQgY3VycmVudCBBY2MwLUFjYzMgdmFsdWVzCi0gICAgICAgIE1fTERSRCAgICAgIEFjY3gsIEFjY3ksIHBUZW1wUmVzdWx0MQotICAgICAgICBQS0hCVCAgICAgICBUZW1wNiwgQWNjeCwgQWNjMCwgTFNMICMxNiAgICAgICAgICA7Ly9bMCBhMiAwIGEwXSA9IFswIGEzIDAgYTJdIFswIGExIDAgYTBdCi0gICAgICAgIFBLSFRCICAgICAgIEFjYzAsIEFjYzAsIEFjY3gsIEFTUiAjMTYgICAgICAgICAgIDsvL1swIGEzIDAgYTFdID0gWzAgYTEgMCBhMF0gWzAgYTMgMCBhMl0gCi0gICAgICAgIFNUUiAgICAgICAgIEFjYzAsIFtwRHN0LCBkc3RTdGVwXSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBTVFIgICAgICAgICBUZW1wNiwgW3BEc3RdLCAjNCAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgUEtIQlQgICAgICAgVGVtcDYsIEFjY3ksIEFjYzEsIExTTCAjMTYgICAgICAgICAgOy8vWzAgYjIgMCBiMF0gPSBbMCBiMyAwIGIyXSBbMCBiMSAwIGIwXQotICAgICAgICBQS0hUQiAgICAgICBBY2MxLCBBY2MxLCBBY2N5LCBBU1IgIzE2ICAgICAgICAgICAgOy8vWzAgYjMgMCBiMV0gPSBbMCBiMSAwIGIwXSBbMCBiMyAwIGIyXQotICAgICAgICBNX0xEUkQgICAgICBBY2N4LCBBY2N5LCBwVGVtcFJlc3VsdDIKLSAgICAgICAgU1RSICAgICAgICAgQWNjMSwgW3BEc3QsIGRzdFN0ZXBdICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFNUUiAgICAgICAgIFRlbXA2LCBbcERzdF0sICM0ICAgICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgUEtIQlQgICAgICAgVGVtcDYsIEFjY3gsIEFjYzIsIExTTCAjMTYgICAgICAgICAgOy8vWzAgYzIgMCBjMF0gPSBbMCBjMyAwIGMyXSBbMCBjMSAwIGMwXQotICAgICAgICBQS0hUQiAgICAgICBBY2MyLCBBY2MyLCBBY2N4LCBBU1IgIzE2ICAgICAgICAgICAgOy8vWzAgYzMgMCBjMV0gPSBbMCBjMSAwIGMwXSBbMCBjMyAwIGMyXQotICAgICAgICBTVFIgICAgICAgICBBY2MyLCBbcERzdCwgZHN0U3RlcF0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgU1RSICAgICAgICAgVGVtcDYsIFtwRHN0XSwgIzQgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFBLSEJUICAgICAgIFRlbXA2LCBBY2N5LCBBY2MzLCBMU0wgIzE2ICAgICAgICAgIDsvL1swIGQyIDAgZDBdID0gWzAgZDMgMCBkMl0gWzAgZDEgMCBkMF0KLSAgICAgICAgUEtIVEIgICAgICAgQWNjMywgQWNjMywgQWNjeSwgQVNSICMxNiAgICAgICAgICAgIDsvL1swIGQzIDAgZDFdID0gWzAgZDEgMCBkMF0gWzAgZDMgMCBkMl0KLSAgICAgICAgU1RSICAgICAgICAgQWNjMywgW3BEc3QsIGRzdFN0ZXBdICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFNUUiAgICAgICAgIFRlbXA2LCBbcERzdF0sICMtMTIKLSAgICAgICAgQUREICAgICAgICAgcERzdCwgcERzdCwgZHN0U3RlcCwgTFNMICMxICAgICAgICAgICAgICAgICAgIAotICAgICAgICBCICAgICAgICAgICBBZnRlclN0b3JlCi0KLU5vUHJvY2Vzc2luZwotICAgICAgICBNX1NUUkQgICAgICBBY2MwLCBBY2MxLCBwVGVtcFJlc3VsdDEKLSAgICAgICAgTV9TVFJEICAgICAgQWNjMiwgQWNjMywgcFRlbXBSZXN1bHQyCi1BZnRlclN0b3JlCi0gICAgICAgIFNVQlMgICAgICAgIENvdW50ZXIsIENvdW50ZXIsICMxICAgICAgICAgICAgICAgIDsvLyBMb29wIHRpbGwgaGVpZ2h0IGlzIDEwCi0gICAgICAgIEFERCAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICBCUEwgICAgICAgICBIZWlnaHRMb29wCi0KLSAgICAgICAgU1RSICAgICAgICAgQWNjMCwgW3BEc3RdLCAjNCAgICAgICAgICAgICAgICAgICAgOy8vWzAgYTEgMCBhMF0KLSAgICAgICAgU1RSICAgICAgICAgQWNjMSwgW3BEc3RdLCAjNAotICAgICAgICBTVFIgICAgICAgICBBY2MyLCBbcERzdF0sICM0Ci0gICAgICAgIFNUUiAgICAgICAgIEFjYzMsIFtwRHN0XSwgIy0xMgotICAgICAgICAKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBIb3Jpem9udGFsIGludGVycG9sYXRpb24gdXNpbmcgbXVsdGlwbGljYXRpb24KLSAgICAgICAgOy8vCi0gICAgCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMgotICAgICAgICBNT1YgICAgICAgICBzcmNTdGVwLCAjMTYKLSAgICAgICAgTV9MRFJEICAgICAgcERzdCwgZHN0U3RlcCwgcHBEc3RBcmdzCi0KLSAgICAgICAgTU9WICAgICAgICAgQ291bnRlciwgIzQKLSAgICAgICAgTERSICAgICAgICAgcjB4MDAxNGZmZmIsID0weDAwMTRmZmZiCi0gICAgICAgIExEUiAgICAgICAgIHIweDAwMTQwMDAxLCA9MHgwMDE0MDAwMQotCi1IZWlnaHRMb29wMQotICAgICAgICBNX1NUUiAgICAgICBDb3VudGVyLCBwQ291bnRlcgotCi0gICAgICAgIE1fTERSICAgICAgIFZhbENBLCBbcFNyY10sIHNyY1N0ZXAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgWzAgYyAwIGFdCi0gICAgICAgIE1fTERSICAgICAgIFZhbERCLCBbcFNyY10sIHNyY1N0ZXAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgWzAgZCAwIGJdCi0gICAgICAgIE1fTERSICAgICAgIFZhbEdFLCBbcFNyY10sIHNyY1N0ZXAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgWzAgZyAwIGVdCi0gICAgICAgIE1fTERSICAgICAgIFZhbEhGLCBbcFNyY10sIHNyY1N0ZXAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgWzAgaCAwIGZdCi0KLQotICAgICAgICA7Ly8gQWNjMCA9IHNtdWFkIChbMCAyMCAwIDFdLCBhZGQoWzAgYyAwIGFdICsgWzAgZCAwIGZdKSkgLSAoNSAqIChiICsgZSkpIAotICAgICAgICA7Ly8gQWNjMSA9IHNtdWFkIChbMCAyMCAwIDFdLCBhZGQoWzAgZSAwIGddICsgWzAgZCAwIGJdKSkgLSAoNSAqIChjICsgZikpIAotICAgICAgICA7Ly8gQWNjMiA9IHNtdWFkIChbMCAxIDAgMjBdLCBhZGQoWzAgYyAwIGVdICsgWzAgaCAwIGZdKSkgLSAoNSAqIChkICsgZykpIAotICAgICAgICA7Ly8gQWNjMyA9IHNtdWFkIChbMCAyMCAwIDFdLCBhZGQoWzAgZCAwIGZdICsgWzAgaSAwIGddKSkgLSAoNSAqIChlICsgaCkpIAotCi0gICAgICAgIFNNVUFEICAgICAgIEFjYzAsIFZhbENBLCByMHgwMDE0MDAwMSAgICAgICAgICAgIDsvLyBBY2MwICA9IFswIGMgMCBhXSAqIFswIDIwIDAgMV0KLSAgICAgICAgU01VQUQgICAgICAgQWNjMSwgVmFsREIsIHIweDAwMTQwMDAxICAgICAgICAgICAgOy8vIEFjYzEgID0gWzAgYyAwIGFdICogWzAgMjAgMCAxXQotICAgICAgICBTTVVBRFggICAgICBBY2MyLCBWYWxHRSwgcjB4MDAxNGZmZmIgICAgICAgICAgICA7Ly8gQWNjMiAgPSBbMCBnIDAgZV0gKiBbMCAyMCAwIC01XQotICAgICAgICBTTVVBRCAgICAgICBBY2MzLCBWYWxHRSwgcjB4MDAxNGZmZmIgICAgICAgICAgICA7Ly8gQWNjMyAgPSBbMCBnIDAgZV0gKiBbMCAyMCAwIC01XQotCi0gICAgICAgIFNNTEFEICAgICAgIEFjYzAsIFZhbERCLCByMHgwMDE0ZmZmYiwgQWNjMCAgICAgIDsvLyBBY2MwICs9IFswIGQgMCBiXSAqIFswIDIwIDAgLTVdCi0gICAgICAgIFNNTEFEWCAgICAgIEFjYzEsIFZhbEdFLCByMHgwMDE0MDAwMSwgQWNjMSAgICAgIDsvLyBBY2MxICs9IFswIGcgMCBlXSAqIFswIDIwIDAgMV0KLSAgICAgICAgU01MQURYICAgICAgQWNjMiwgVmFsSEYsIHIweDAwMTQwMDAxLCBBY2MyICAgICAgOy8vIEFjYzIgKz0gWzAgaCAwIGZdICogWzAgMjAgMCAxXQotICAgICAgICBTTUxBRFggICAgICBBY2MzLCBWYWxIRiwgcjB4MDAxNGZmZmIsIEFjYzMgICAgICA7Ly8gQWNjMyArPSBbMCBoIDAgZl0gKiBbMCAyMCAwIC01XQotCi0gICAgICAgIFNNTEFCQiAgICAgIEFjYzAsIFZhbEdFLCByMHgwMDE0ZmZmYiwgQWNjMCAgICAgIDsvLyBBY2MwICs9IFswIGcgMCBlXSAqIFswIDAgMCAtNV0KLSAgICAgICAgU01MQVRCICAgICAgQWNjMSwgVmFsQ0EsIHIweDAwMTRmZmZiLCBBY2MxICAgICAgOy8vIEFjYzEgKz0gWzAgZCAwIGJdICogWzAgMCAwIC01XQotICAgICAgICBTTUxBVEIgICAgICBBY2MyLCBWYWxDQSwgcjB4MDAxNDAwMDEsIEFjYzIgICAgICA7Ly8gQWNjMiArPSBbMCBjIDAgYV0gKiBbMCAwIDAgMV0KLSAgICAgICAgU01MQVRCICAgICAgQWNjMywgVmFsREIsIHIweDAwMTQwMDAxLCBBY2MzICAgICAgOy8vIEFjYzMgKz0gWzAgYyAwIGFdICogWzAgMCAwIDFdCi0KLSAgICAgICAgTERSSCAgICAgICAgVmFsQ0EsIFtwU3JjXSwgIzQgICAgICAgICAgICAgICAgICAgOy8vIDggPSBzcmNTdGVwIC0gMTYKLSAgICAgICAgU01MQUJCICAgICAgQWNjMCwgVmFsSEYsIHIweDAwMTQwMDAxLCBBY2MwICAgICAgOy8vIEFjYzAgKz0gWzAgaCAwIGZdICogWzAgMCAwIDFdICAgICAgICAKLSAgICAgICAgU01MQUJCICAgICAgQWNjMSwgVmFsSEYsIHIweDAwMTRmZmZiLCBBY2MxICAgICAgOy8vIEFjYzEgKz0gWzAgaCAwIGZdICogWzAgMCAwIC01XQotICAgICAgICBTTUxBVEIgICAgICBBY2MyLCBWYWxEQiwgcjB4MDAxNGZmZmIsIEFjYzIgICAgICA7Ly8gQWNjMiArPSBbMCBkIDAgYl0gKiBbMCAwIDAgLTVdICAgICAgICAKLSAgICAgICAgU01MQUJCICAgICAgQWNjMywgVmFsQ0EsIHIweDAwMTQwMDAxLCBBY2MzICAgICAgOy8vIEFjYzMgKz0gWzAgZCAwIGJdICogWzAgMCAwIDFdCi0gICAgICAgIAotICAgICAgICBMRFIgICAgICAgICByMHgwMDAxZmMwMCwgPTB4MDAwMWZjMDAgICAgICAgICAgICA7Ly8gKDB4ZmYgKiAxNiAqIDMyKSAtIDUxMgotICAgICAgICBTVUIgICAgICAgICBBY2MwLCBBY2MwLCByMHgwMDAxZmMwMCAgICAgICAgCi0gICAgICAgIFNVQiAgICAgICAgIEFjYzEsIEFjYzEsIHIweDAwMDFmYzAwICAgICAgICAKLSAgICAgICAgU1VCICAgICAgICAgQWNjMiwgQWNjMiwgcjB4MDAwMWZjMDAgICAgICAgIAotICAgICAgICBTVUIgICAgICAgICBBY2MzLCBBY2MzLCByMHgwMDAxZmMwMCAgICAgICAgCi0KLSAgICAgICAgVVNBVCAgICAgICAgQWNjMCwgIzE4LCBBY2MwCi0gICAgICAgIFVTQVQgICAgICAgIEFjYzEsICMxOCwgQWNjMQotICAgICAgICBVU0FUICAgICAgICBBY2MyLCAjMTgsIEFjYzIKLSAgICAgICAgVVNBVCAgICAgICAgQWNjMywgIzE4LCBBY2MzCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICAgICBBY2MwLCBBY2MwLCBMU1IgIzEwCi0gICAgICAgIE1fU1RSQiAgICAgIEFjYzAsIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBNT1YgICAgICAgICBBY2MxLCBBY2MxLCBMU1IgIzEwCi0gICAgICAgIE1fU1RSQiAgICAgIEFjYzEsIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBNT1YgICAgICAgICBBY2MyLCBBY2MyLCBMU1IgIzEwCi0gICAgICAgIE1fU1RSQiAgICAgIEFjYzIsIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBNT1YgICAgICAgICBBY2MzLCBBY2MzLCBMU1IgIzEwCi0gICAgICAgIE1fU1RSQiAgICAgIEFjYzMsIFtwRHN0XSwgZHN0U3RlcAotCi0KLSAgICAgICAgTV9MRFIgICAgICAgQ291bnRlciwgcENvdW50ZXIKLSAgICAgICAgU1VCICAgICAgICAgcERzdCwgcERzdCwgZHN0U3RlcCwgTFNMICMyCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMgotICAgICAgICBBREQgICAgICAgICBwRHN0LCBwRHN0LCAjMQotICAgICAgICBTVUJTICAgICAgICBDb3VudGVyLCBDb3VudGVyLCAjMQotICAgICAgICBCR1QgICAgICAgICBIZWlnaHRMb29wMQotRW5kCi0gICAgICAgIFNVQiAgICAgICAgIHBEc3QsIHBEc3QsICM0Ci0gICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsICMxNgotCi0gICAgICAgIE1fRU5ECi0gICAgCi0gICAgRU5ESUYKLSAgICAKLSAgICBFTkQKLSAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU3YzVjNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLQotICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlCi0KLSAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLQotICAgIAotICAgIAotICAgIAotCi0gICAgSUYgQVJNMTEzNkpTIAotICAgICAgICAKLSAgICAgICAgTV9BTExPQzggcHBEc3RBcmdzLCA4Ci0gICAgICAgIE1fQUxMT0M0IHBwU3JjLCA0Ci0gICAgICAgIE1fQUxMT0M0IHBwRHN0LCA0Ci0gICAgICAgIE1fQUxMT0M0IHBDb3VudGVyLCA0Ci0KLSAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgotICAgICAgICA7Ly8gRnVuY3Rpb246Ci0gICAgICAgIDsvLyAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW1wbGVtZW50cyBkaWFnb25hbCBpbnRlcnBvbGF0aW9uIGZvciBhIGJsb2NrIG9mIHNpemUgNHg0LiBJbnB1dCBhbmQgb3V0cHV0IHNob3VsZCAKLSAgICAgICAgOy8vIGJlIGFsaWduZWQuIAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFJlZ2lzdGVycyB1c2VkIGFzIGlucHV0IGZvciB0aGlzIGZ1bmN0aW9uCi0gICAgICAgIDsvLyByMCxyMSxyMixyMywgcjggd2hlcmUgcjAscjIgIGlucHV0IHBvaW50ZXIgYW5kIHIxLHIzIHN0ZXAgc2l6ZSwgcjggaW50ZXJtZWRpYXRlLWJ1ZiBwb2ludGVyCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gUmVnaXN0ZXJzIHByZXNlcnZlZCBmb3IgdG9wIGxldmVsIGZ1bmN0aW9uCi0gICAgICAgIDsvLyByMCxyMSxyMixyMyxyNCxyNSxyNixyMTQKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBSZWdpc3RlcnMgbW9kaWZpZWQgYnkgdGhlIGZ1bmN0aW9uCi0gICAgICAgIDsvLyByNyxyOCxyOSxyMTAscjExLHIxMgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIE91dHB1dCByZWdpc3RlcnMKLSAgICAgICAgOy8vIE5vbmUuIEZ1bmN0aW9uIHdpbGwgcHJlc2VydmUgcjAtcjMKLQotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZSwgcjYKLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi1wU3JjICAgICAgICAgICAgUk4gMAotc3JjU3RlcCAgICAgICAgIFJOIDEKLXBEc3QgICAgICAgICAgICBSTiAyCi1kc3RTdGVwICAgICAgICAgUk4gMwotCi07Ly8gRGVjbGFyZSBpbm5lciBsb29wIHJlZ2lzdGVycwotVmFsQSAgICAgICAgICAgIFJOIDUKLVZhbEEwICAgICAgICAgICBSTiA0Ci1WYWxBMSAgICAgICAgICAgUk4gNQotVmFsQUYwICAgICAgICAgIFJOIDQKLVZhbEFGMSAgICAgICAgICBSTiA1Ci0KLVZhbEIgICAgICAgICAgICBSTiAxMQotCi1WYWxDICAgICAgICAgICAgUk4gNQotVmFsQzAgICAgICAgICAgIFJOIDQKLVZhbEMxICAgICAgICAgICBSTiA1Ci1WYWxDRDAgICAgICAgICAgUk4gMTIKLVZhbENEMSAgICAgICAgICBSTiAxNAotVmFsQ0YwICAgICAgICAgIFJOIDQKLVZhbENGMSAgICAgICAgICBSTiA1Ci0KLVZhbEQgICAgICAgICAgICBSTiAxMAotCi1WYWxFICAgICAgICAgICAgUk4gNwotVmFsRTAgICAgICAgICAgIFJOIDYKLVZhbEUxICAgICAgICAgICBSTiA3Ci1WYWxFQjAgICAgICAgICAgUk4gMTAKLVZhbEVCMSAgICAgICAgICBSTiAxMQotVmFsRUQwICAgICAgICAgIFJOIDYKLVZhbEVEMSAgICAgICAgICBSTiA3Ci0KLVZhbEYgICAgICAgICAgICBSTiAxMAotCi1WYWxHICAgICAgICAgICAgUk4gMTQKLVZhbEcwICAgICAgICAgICBSTiAxMgotVmFsRzEgICAgICAgICAgIFJOIDE0Ci1WYWxHQjAgICAgICAgICAgUk4gMTIKLVZhbEdCMSAgICAgICAgICBSTiAxNAotCi1BY2MwICAgICAgICAgICAgUk4gNAotQWNjMSAgICAgICAgICAgIFJOIDUKLUFjYzIgICAgICAgICAgICBSTiA2Ci1BY2MzICAgICAgICAgICAgUk4gNwotCi1UZW1wICAgICAgICAgICAgUk4gNwotU3RlcCAgICAgICAgICAgIFJOIDYKLQotcEludGVyQnVmICAgICAgIFJOIDgKLUNvdW50ZXIgICAgICAgICBSTiA4Ci1yMHgwMGZmMDBmZiAgICAgUk4gOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgMjU1IDAgMjU1XSB3aGVyZSAyNTUgaXMgb2Zmc2V0Ci1yMHgwMDAxZmMwMCAgICAgUk4gMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgKDE2KjI1NSAtIDE2KSAwICgxNioyNTUgLSAxNildCi0KLSAgICAKLTsvLyBEZWNsYXJlIGlubmVyIGxvb3AgcmVnaXN0ZXJzCi1WYWxDQSAgICAgICAgICAgUk4gOAotVmFsREIgICAgICAgICAgIFJOIDkKLVZhbEdFICAgICAgICAgICBSTiAxMAotVmFsSEYgICAgICAgICAgIFJOIDExCi1yMHgwMDE0MDAwMSAgICAgUk4gMTIKLXIweDAwMTRmZmZiICAgICBSTiAxNAotCi1yMHgwMDAwMDIwMCAgICAgUk4gMTIKLXIweDAwMDAwMGZmICAgICBSTiAxMgotICAgICAgICAKLSAgICAgICAgTV9TVFJEICAgICAgcERzdCwgZHN0U3RlcCwgcHBEc3RBcmdzCi0gICAgICAgIE1PViAgICAgICAgIHBEc3QsIHBJbnRlckJ1ZiAgICAgICAgICAgICAgICAKLSAgICAgICAgTU9WICAgICAgICAgZHN0U3RlcCwgIzI0Ci0KLSAgICAgICAgOy8vIFNldCB1cCBjb3VudGVyIG9mIGZvcm1hdCwgWzBdICBbMF0gIFsxIChoZWlnaHQpXSAgWzggKHdpZHRoKV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgTU9WICAgICAgICAgQ291bnRlciwgIzEKLSAgICAgICAgTU9WICAgICAgICAgVGVtcCwgIzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBBREQgICAgICAgICBDb3VudGVyLCBUZW1wLCBDb3VudGVyLCBMU0wgIzggICAgICAgIDsvLyBbMCAwIEggV10gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIHIweDAwZmYwMGZmLCA9MHgwMGZmMDBmZiAgICAgICAgICAgICAgICA7Ly8gWzAgMjU1IDAgMjU1XSAyNTUgaXMgb2Zmc2V0IHRvIGF2b2lkIG5lZ2F0aXZlIHJlc3VsdHMgCi1XaWR0aExvb3AKLSAgICAgICAgTV9TVFIgICAgICAgcFNyYywgcHBTcmMKLSAgICAgICAgTV9TVFIgICAgICAgcERzdCwgcHBEc3QKLUhlaWdodExvb3AKLVR3b1Jvd3NMb29wCi0gICAgICAgIE1fTERSICAgICAgIFZhbEMsIFtwU3JjXSwgc3JjU3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2MzIGMyIGMxIGMwXQotICAgICAgICBNX0xEUiAgICAgICBWYWxELCBbcFNyY10sIHNyY1N0ZXAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFtkMyBkMiBkMSBkMF0KLSAgICAgICAgTV9MRFIgICAgICAgVmFsRSwgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbZTMgZTIgZTEgZTBdICAgICAgICAKLSAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMyICAgICAgICAgICAgICAgIAotICAgICAgICBVWFRBQjE2ICAgICBWYWxDMCwgcjB4MDBmZjAwZmYsIFZhbEMgICAgICAgICAgICAgICAgOy8vIFswIGMyIDAgYzBdICsgWzAgMjU1IDAgMjU1XQotICAgICAgICBVWFRBQjE2ICAgICBWYWxDMSwgcjB4MDBmZjAwZmYsIFZhbEMsIFJPUiAjOCAgICAgICAgOy8vIFswIGMzIDAgYzFdICsgWzAgMjU1IDAgMjU1XSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIFZhbEIsIFtwU3JjXSAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2IzIGIyIGIxIGIwXSAgICAgICAgCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbEUwLCByMHgwMGZmMDBmZiwgVmFsRSAgICAgICAgICAgICAgICA7Ly8gWzAgZTIgMCBlMF0gKyBbMCAyNTUgMCAyNTVdCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbEUxLCByMHgwMGZmMDBmZiwgVmFsRSwgUk9SICM4ICAgICAgICA7Ly8gWzAgZTMgMCBlMV0gKyBbMCAyNTUgMCAyNTVdICAgICAgICAKLSAgICAgICAgVVhUQUIxNiAgICAgVmFsQ0QwLCBWYWxDMCwgVmFsRCAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCBjMiAwIGMwXSArIFswIDI1NSAwIDI1NV0gKyBbMCBkMiAwIGQwXQotICAgICAgICBVWFRBQjE2ICAgICBWYWxDRDEsIFZhbEMxLCBWYWxELCBST1IgIzggICAgICAgICAgICAgOy8vIFswIGMzIDAgYzFdICsgWzAgMjU1IDAgMjU1XSArIFswIGQzIDAgZDFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgVVhUQUIxNiAgICAgVmFsRUIwLCBWYWxFMCwgVmFsQiAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCBlMiAwIGUwXSArIFswIDI1NSAwIDI1NV0gKyBbMCBiMiAwIGIwXQotICAgICAgICBSU0IgICAgICAgICBWYWxDRDAsIFZhbEVCMCwgVmFsQ0QwLCBMU0wgIzIgICAgICAgICAgOy8vIDQqKE9mZitDK0QpIC0gKE9mZitCK0UpCi0gICAgICAgIAotICAgICAgICBMRFIgICAgICAgICBWYWxELCBbcFNyYywgc3JjU3RlcCwgTFNMICMxXSAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFtkMyBkMiBkMSBkMF0KLSAgICAgICAgVVhUQUIxNiAgICAgVmFsRUIxLCBWYWxFMSwgVmFsQiwgUk9SICM4ICAgICAgICAgICAgIDsvLyBbMCBlMyAwIGUxXSArIFswIDI1NSAwIDI1NV0gKyBbMCBiMyAwIGIxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFJTQiAgICAgICAgIFZhbENEMSwgVmFsRUIxLCBWYWxDRDEsIExTTCAjMiAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbEVEMCwgVmFsRTAsIFZhbEQgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgZTIgMCBlMF0gKyBbMCAyNTUgMCAyNTVdICsgWzAgZDIgMCBkMF0KLSAgICAgICAgVVhUQUIxNiAgICAgVmFsRUQxLCBWYWxFMSwgVmFsRCwgUk9SICM4ICAgICAgICAgICAgIDsvLyBbMCBlMyAwIGUxXSArIFswIDI1NSAwIDI1NV0gKyBbMCBkMyAwIGQxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgVmFsRiwgW3BTcmMsIHNyY1N0ZXAsIExTTCAjMl0gICAgICAgICAgIDsvLyBMb2FkICBbZjMgZjIgZjEgZjBdCi0gICAgICAgIE1fTERSICAgICAgIFZhbEIsIFtwU3JjXSwgc3JjU3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2IzIGIyIGIxIGIwXSAgICAgICAgICAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgVmFsQ0QwLCBWYWxDRDAsIFZhbENEMCwgTFNMICMyICAgICAgICAgIDsvLyA1ICogWzQqKE9mZitDK0QpIC0gKE9mZitCK0UpXQotICAgICAgICBBREQgICAgICAgICBWYWxDRDEsIFZhbENEMSwgVmFsQ0QxLCBMU0wgIzIgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBVWFRBQjE2ICAgICBWYWxDRjEsIFZhbEMxLCBWYWxGLCBST1IgIzggICAgICAgICAgICAgOy8vIFswIGMzIDAgYzFdICsgWzAgMjU1IDAgMjU1XSArIFswIGYzIDAgZjFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgVVhUQUIxNiAgICAgVmFsQ0YwLCBWYWxDMCwgVmFsRiAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCBjMiAwIGMwXSArIFswIDI1NSAwIDI1NV0gKyBbMCBmMiAwIGYwXSAgICAgICAgCi0gICAgICAgIFJTQiAgICAgICAgIFZhbEVEMSwgVmFsQ0YxLCBWYWxFRDEsIExTTCAjMiAgICAgICAgCi0gICAgICAgIAotICAgICAgICBTVUIgICAgICAgICBWYWxBLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgTERSICAgICAgICAgVmFsQSwgW1ZhbEFdICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbYTMgYTIgYTEgYTBdCi0gICAgICAgIFJTQiAgICAgICAgIFZhbEVEMCwgVmFsQ0YwLCBWYWxFRDAsIExTTCAjMiAgICAgICAgICA7Ly8gNCooT2ZmK0UrRCkgLSAoT2ZmK0MrRikgICAgICAgIAotICAgICAgICBBREQgICAgICAgICBWYWxFRDEsIFZhbEVEMSwgVmFsRUQxLCBMU0wgIzIgICAgICAgICAgCi0gICAgICAgIEFERCAgICAgICAgIFZhbEVEMCwgVmFsRUQwLCBWYWxFRDAsIExTTCAjMiAgICAgICAgICA7Ly8gNSAqIFs0KihPZmYrRStEKSAtIChPZmYrQytGKV0KLSAgICAgICAgVVhUQUIxNiAgICAgVmFsQTAsIHIweDAwZmYwMGZmLCBWYWxBICAgICAgICAgICAgICAgIDsvLyBbMCBhMiAwIGEwXSArIFswIDI1NSAwIDI1NV0KLSAgICAgICAgVVhUQUIxNiAgICAgVmFsQTEsIHIweDAwZmYwMGZmLCBWYWxBLCBST1IgIzggICAgICAgIDsvLyBbMCBhMyAwIGExXSArIFswIDI1NSAwIDI1NV0KLSAgICAgICAgVVhUQUIxNiAgICAgVmFsQUYwLCBWYWxBMCwgVmFsRiAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCBhMiAwIGEwXSArIFswIDI1NSAwIDI1NV0gKyBbMCBmMiAwIGYwXQotICAgICAgICBVWFRBQjE2ICAgICBWYWxBRjEsIFZhbEExLCBWYWxGLCBST1IgIzggICAgICAgICAgICAgOy8vIFswIGEzIDAgYTFdICsgWzAgMjU1IDAgMjU1XSArIFswIGYzIDAgZjFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBBREQgICAgICAgICBBY2MxLCBWYWxDRDEsIFZhbEFGMSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBMRFIgICAgICAgICBWYWxHLCBbcFNyYywgc3JjU3RlcCwgTFNMICMyXSAgICAgICAgICAgOy8vIExvYWQgIFtnMyBnMiBnMSBnMF0KLSAgICAgICAgQUREICAgICAgICAgQWNjMCwgVmFsQ0QwLCBWYWxBRjAgICAgICAgICAgICAgICAgICAgIDsvLyBBY2MwID0gMTYqT2ZmICsgKEErRikgKyAyMCooQytEKSAtIDUqKEIrRSkgICAgICAgIAotICAgICAgICBTVFIgICAgICAgICBBY2MxLCBbcERzdCwgIzRdICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHJlc3VsdCAmIGFkanVzdCBwb2ludGVyCi0gICAgICAgIE1fU1RSICAgICAgIEFjYzAsIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcmVzdWx0ICYgYWRqdXN0IHBvaW50ZXIKLSAgICAgICAgVVhUQUIxNiAgICAgVmFsRzAsIHIweDAwZmYwMGZmLCBWYWxHICAgICAgICAgICAgICAgIDsvLyBbMCBnMiAwIGcwXSArIFswIDI1NSAwIDI1NV0KLSAgICAgICAgVVhUQUIxNiAgICAgVmFsRzEsIHIweDAwZmYwMGZmLCBWYWxHLCBST1IgIzggICAgICAgIDsvLyBbMCBnMyAwIGcxXSArIFswIDI1NSAwIDI1NV0KLSAgICAgICAgVVhUQUIxNiAgICAgVmFsR0IwLCBWYWxHMCwgVmFsQiAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCBnMiAwIGcwXSArIFswIDI1NSAwIDI1NV0gKyBbMCBiMiAwIGIwXQotICAgICAgICBVWFRBQjE2ICAgICBWYWxHQjEsIFZhbEcxLCBWYWxCLCBST1IgIzggICAgICAgICAgICAgOy8vIFswIGczIDAgZzFdICsgWzAgMjU1IDAgMjU1XSArIFswIGIzIDAgYjFdICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIEFERCAgICAgICAgIEFjYzIsIFZhbEVEMCwgVmFsR0IwICAgICAgICAgICAgICAgICAgICA7Ly8gQWNjMiA9IDE2Kk9mZiArIChCK0cpICsgMjAqKEQrRSkgLSA1KihDK0YpCi0gICAgICAgIEFERCAgICAgICAgIEFjYzMsIFZhbEVEMSwgVmFsR0IxICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFNUUiAgICAgICAgIEFjYzMsIFtwRHN0LCAjNF0gICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcmVzdWx0ICYgYWRqdXN0IHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgTV9TVFIgICAgICAgQWNjMiwgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSByZXN1bHQgJiBhZGp1c3QgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICBTVUJTICAgICAgICBDb3VudGVyLCBDb3VudGVyLCAjMSA8PCA4ICAgICAgICAgICAgICAgOy8vIExvb3AgdGlsbCBoZWlnaHQgaXMgMTAKLSAgICAgICAgQUREICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCi0gICAgICAgIEJQTCAgICAgICAgIEhlaWdodExvb3AKLSAgICAgICAgCi0gICAgICAgIE1fTERSICAgICAgIHBTcmMsIHBwU3JjCi0gICAgICAgIE1fTERSICAgICAgIHBEc3QsIHBwRHN0Ci0gICAgICAgIEFERFMgICAgICAgIENvdW50ZXIsIENvdW50ZXIsICMoMSA8PCA4KS00ICAgICAgICAgICA7Ly8gTG9vcCB0aWxsIHdpZHRoIGlzIDEyCi0gICAgICAgIEFERCAgICAgICAgIHBTcmMsIHBTcmMsICM0Ci0gICAgICAgIEFERCAgICAgICAgIHBEc3QsIHBEc3QsICM4Ci0gICAgICAgIEFERCAgICAgICAgIENvdW50ZXIsIENvdW50ZXIsICMxPDw4Ci0gICAgICAgIEJQTCAgICAgICAgIFdpZHRoTG9vcAotICAgIAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIEhvcml6b250YWwgaW50ZXJwb2xhdGlvbiB1c2luZyBtdWx0aXBsaWNhdGlvbgotICAgICAgICA7Ly8KLSAgICAKLSAgICAgICAgU1VCICAgICAgICAgcFNyYywgcERzdCwgIzI0Ci0gICAgICAgIE1PViAgICAgICAgIHNyY1N0ZXAsICMyNAotICAgICAgICBNX0xEUkQgICAgICBwRHN0LCBkc3RTdGVwLCBwcERzdEFyZ3MKLQotICAgICAgICBNT1YgICAgICAgICBDb3VudGVyLCAjNAotICAgICAgICBMRFIgICAgICAgICByMHgwMDE0ZmZmYiwgPTB4MDAxNGZmZmIKLSAgICAgICAgTERSICAgICAgICAgcjB4MDAxNDAwMDEsID0weDAwMTQwMDAxCi0KLUhlaWdodExvb3AxCi0gICAgICAgIE1fU1RSICAgICAgIENvdW50ZXIsIHBDb3VudGVyCi0KLQotICAgICAgICBMRFIgICAgICAgICBWYWxDQSwgW3BTcmNdLCAjNCAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgWzAgYyAwIGFdCi0gICAgICAgIExEUiAgICAgICAgIFZhbERCLCBbcFNyY10sICM0ICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbMCBkIDAgYl0KLSAgICAgICAgTERSICAgICAgICAgVmFsR0UsIFtwU3JjXSwgIzQgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFswIGcgMCBlXQotICAgICAgICBMRFIgICAgICAgICBWYWxIRiwgW3BTcmNdLCAjNCAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgWzAgaCAwIGZdCi0KLSAgICAgICAgOy8vIEFjYzAgPSBzbXVhZCAoWzAgMjAgMCAxXSwgYWRkKFswIGMgMCBhXSArIFswIGQgMCBmXSkpIC0gKDUgKiAoYiArIGUpKSAKLSAgICAgICAgOy8vIEFjYzEgPSBzbXVhZCAoWzAgMjAgMCAxXSwgYWRkKFswIGUgMCBnXSArIFswIGQgMCBiXSkpIC0gKDUgKiAoYyArIGYpKSAKLSAgICAgICAgOy8vIEFjYzIgPSBzbXVhZCAoWzAgMSAwIDIwXSwgYWRkKFswIGMgMCBlXSArIFswIGggMCBmXSkpIC0gKDUgKiAoZCArIGcpKSAKLSAgICAgICAgOy8vIEFjYzMgPSBzbXVhZCAoWzAgMjAgMCAxXSwgYWRkKFswIGQgMCBmXSArIFswIGkgMCBnXSkpIC0gKDUgKiAoZSArIGgpKSAKLSAgICAgICAgU01VQUQgICAgICAgQWNjMCwgVmFsQ0EsIHIweDAwMTQwMDAxICAgICAgICAgICAgOy8vIEFjYzAgID0gWzAgYyAwIGFdICogWzAgMjAgMCAxXQotICAgICAgICBTTVVBRCAgICAgICBBY2MxLCBWYWxEQiwgcjB4MDAxNDAwMDEgICAgICAgICAgICA7Ly8gQWNjMSAgPSBbMCBjIDAgYV0gKiBbMCAyMCAwIDFdCi0gICAgICAgIFNNVUFEWCAgICAgIEFjYzIsIFZhbEdFLCByMHgwMDE0ZmZmYiAgICAgICAgICAgIDsvLyBBY2MyICA9IFswIGcgMCBlXSAqIFswIDIwIDAgLTVdCi0gICAgICAgIFNNVUFEICAgICAgIEFjYzMsIFZhbEdFLCByMHgwMDE0ZmZmYiAgICAgICAgICAgIDsvLyBBY2MzICA9IFswIGcgMCBlXSAqIFswIDIwIDAgLTVdCi0KLSAgICAgICAgU01MQUQgICAgICAgQWNjMCwgVmFsREIsIHIweDAwMTRmZmZiLCBBY2MwICAgICAgOy8vIEFjYzAgKz0gWzAgZCAwIGJdICogWzAgMjAgMCAtNV0KLSAgICAgICAgU01MQURYICAgICAgQWNjMSwgVmFsR0UsIHIweDAwMTQwMDAxLCBBY2MxICAgICAgOy8vIEFjYzEgKz0gWzAgZyAwIGVdICogWzAgMjAgMCAxXQotICAgICAgICBTTUxBRFggICAgICBBY2MyLCBWYWxIRiwgcjB4MDAxNDAwMDEsIEFjYzIgICAgICA7Ly8gQWNjMiArPSBbMCBoIDAgZl0gKiBbMCAyMCAwIDFdCi0gICAgICAgIFNNTEFEWCAgICAgIEFjYzMsIFZhbEhGLCByMHgwMDE0ZmZmYiwgQWNjMyAgICAgIDsvLyBBY2MzICs9IFswIGggMCBmXSAqIFswIDIwIDAgLTVdCi0KLSAgICAgICAgU01MQUJCICAgICAgQWNjMCwgVmFsR0UsIHIweDAwMTRmZmZiLCBBY2MwICAgICAgOy8vIEFjYzAgKz0gWzAgZyAwIGVdICogWzAgMCAwIC01XQotICAgICAgICBTTUxBVEIgICAgICBBY2MxLCBWYWxDQSwgcjB4MDAxNGZmZmIsIEFjYzEgICAgICA7Ly8gQWNjMSArPSBbMCBkIDAgYl0gKiBbMCAwIDAgLTVdCi0gICAgICAgIFNNTEFUQiAgICAgIEFjYzIsIFZhbENBLCByMHgwMDE0MDAwMSwgQWNjMiAgICAgIDsvLyBBY2MyICs9IFswIGMgMCBhXSAqIFswIDAgMCAxXQotICAgICAgICBTTUxBVEIgICAgICBBY2MzLCBWYWxEQiwgcjB4MDAxNDAwMDEsIEFjYzMgICAgICA7Ly8gQWNjMyArPSBbMCBjIDAgYV0gKiBbMCAwIDAgMV0KLQotICAgICAgICBMRFJIICAgICAgICBWYWxDQSwgW3BTcmNdLCAjOCAgICAgICAgICAgICAgICAgICA7Ly8gOCA9IHNyY1N0ZXAgLSAxNgotICAgICAgICBTTUxBQkIgICAgICBBY2MwLCBWYWxIRiwgcjB4MDAxNDAwMDEsIEFjYzAgICAgICA7Ly8gQWNjMCArPSBbMCBoIDAgZl0gKiBbMCAwIDAgMV0gICAgICAgIAotICAgICAgICBTTUxBQkIgICAgICBBY2MxLCBWYWxIRiwgcjB4MDAxNGZmZmIsIEFjYzEgICAgICA7Ly8gQWNjMSArPSBbMCBoIDAgZl0gKiBbMCAwIDAgLTVdCi0gICAgICAgIFNNTEFUQiAgICAgIEFjYzIsIFZhbERCLCByMHgwMDE0ZmZmYiwgQWNjMiAgICAgIDsvLyBBY2MyICs9IFswIGQgMCBiXSAqIFswIDAgMCAtNV0gICAgICAgIAotICAgICAgICBTTUxBQkIgICAgICBBY2MzLCBWYWxDQSwgcjB4MDAxNDAwMDEsIEFjYzMgICAgICA7Ly8gQWNjMyArPSBbMCBkIDAgYl0gKiBbMCAwIDAgMV0KLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIHIweDAwMDFmYzAwLCA9MHgwMDAxZmMwMCAgICAgICAgICAgIDsvLyAoMHhmZiAqIDE2ICogMzIpIC0gNTEyCi0gICAgICAgIFNVQiAgICAgICAgIEFjYzAsIEFjYzAsIHIweDAwMDFmYzAwICAgICAgICAKLSAgICAgICAgU1VCICAgICAgICAgQWNjMSwgQWNjMSwgcjB4MDAwMWZjMDAgICAgICAgIAotICAgICAgICBTVUIgICAgICAgICBBY2MyLCBBY2MyLCByMHgwMDAxZmMwMCAgICAgICAgCi0gICAgICAgIFNVQiAgICAgICAgIEFjYzMsIEFjYzMsIHIweDAwMDFmYzAwICAgICAgICAKLQotICAgICAgICBVU0FUICAgICAgICBBY2MwLCAjMTgsIEFjYzAKLSAgICAgICAgVVNBVCAgICAgICAgQWNjMSwgIzE4LCBBY2MxCi0gICAgICAgIFVTQVQgICAgICAgIEFjYzIsICMxOCwgQWNjMgotICAgICAgICBVU0FUICAgICAgICBBY2MzLCAjMTgsIEFjYzMKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgICAgIEFjYzAsIEFjYzAsIExTUiAjMTAKLSAgICAgICAgTU9WICAgICAgICAgQWNjMSwgQWNjMSwgTFNSICMxMAotICAgICAgICBNT1YgICAgICAgICBBY2MyLCBBY2MyLCBMU1IgIzEwCi0gICAgICAgIE1PViAgICAgICAgIEFjYzMsIEFjYzMsIExTUiAjMTAKLQotICAgICAgICBNX0xEUiAgICAgICBDb3VudGVyLCBwQ291bnRlciAgICAgICAgCi0gICAgICAgIE9SUiAgICAgICAgIEFjYzAsIEFjYzAsIEFjYzEsIExTTCAjOAotICAgICAgICBPUlIgICAgICAgICBBY2MyLCBBY2MyLCBBY2MzLCBMU0wgIzgKLSAgICAgICAgU1VCUyAgICAgICAgQ291bnRlciwgQ291bnRlciwgIzEKLSAgICAgICAgT1JSICAgICAgICAgQWNjMCwgQWNjMCwgQWNjMiwgTFNMICMxNgotICAgICAgICBNX1NUUiAgICAgICBBY2MwLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgQkdUICAgICAgICAgSGVpZ2h0TG9vcDEKLUVuZAotICAgICAgICBTVUIgICAgICAgICBwRHN0LCBwRHN0LCBkc3RTdGVwLCBMU0wgIzIKLSAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMyCi0KLSAgICAgICAgTV9FTkQKLSAgICAKLSAgICBFTkRJRgotICAgIAotICAgIEVORAotICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFhZjc1YS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MucworKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmVfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgOTY0MQotOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0KLSAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLSAgICAgICAgCi0gICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQotCi1ERUJVR19PTiAgICBTRVRMIHtGQUxTRX0KLQotCi0gICAgSUYgQVJNMTEzNkpTCi0KLTsvLyBGdW5jdGlvbjogCi07Ly8gICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCi07Ly8KLTsvLyBJbXBsZW1lbnRzIGhvcml6b250YWwgaW50ZXJwb2xhdGlvbiBmb3IgYSBibG9jayBvZiBzaXplIDR4NC4gSW5wdXQgYW5kIG91dHB1dCBzaG91bGQgCi07Ly8gYmUgYWxpZ25lZC4gCi07Ly8KLTsvLyBSZWdpc3RlcnMgdXNlZCBhcyBpbnB1dCBmb3IgdGhpcyBmdW5jdGlvbgotOy8vIHIwLHIxLHIyLHIzIHdoZXJlIHIwLHIyICBpbnB1dCBwb2ludGVyIGFuZCByMSxyMyBjb3JyZXNwb25kaW5nIHN0ZXAgc2l6ZQotOy8vCi07Ly8gUmVnaXN0ZXJzIHByZXNlcnZlZCBmb3IgdG9wIGxldmVsIGZ1bmN0aW9uCi07Ly8gcjAscjEscjIscjMscjQscjUscjYscjE0Ci07Ly8KLTsvLyBSZWdpc3RlcnMgbW9kaWZpZWQgYnkgdGhlIGZ1bmN0aW9uCi07Ly8gcjcscjgscjkscjEwLHIxMSxyMTIKLTsvLwotOy8vIE91dHB1dCByZWdpc3RlcnMKLTsvLyBOb25lLiBGdW5jdGlvbiB3aWxsIHByZXNlcnZlIHIwLXIzCi0KLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi1wU3JjICAgICAgICAgICAgUk4gMAotc3JjU3RlcCAgICAgICAgIFJOIDEKLXBEc3QgICAgICAgICAgICBSTiAyCi1kc3RTdGVwICAgICAgICAgUk4gMwotCi07Ly8gRGVjbGFyZSBpbm5lciBsb29wIHJlZ2lzdGVycwotQWNjMCAgICAgICAgICAgIFJOIDQKLUFjYzEgICAgICAgICAgICBSTiA1Ci1BY2MyICAgICAgICAgICAgUk4gNgotQWNjMyAgICAgICAgICAgIFJOIDcKLQotVmFsQSAgICAgICAgICAgIFJOIDQKLVZhbEIgICAgICAgICAgICBSTiA1Ci1WYWxDICAgICAgICAgICAgUk4gNgotVmFsRCAgICAgICAgICAgIFJOIDcKLVZhbEUgICAgICAgICAgICBSTiA4Ci1WYWxGICAgICAgICAgICAgUk4gOQotVmFsRyAgICAgICAgICAgIFJOIDEyCi1WYWxIICAgICAgICAgICAgUk4gMTQKLVZhbEkgICAgICAgICAgICBSTiAxCi0KLVRlbXAxICAgICAgICAgICBSTiAzCi1UZW1wMiAgICAgICAgICAgUk4gMQotVGVtcDMgICAgICAgICAgIFJOIDEyCi1UZW1wNCAgICAgICAgICAgUk4gNwotVGVtcDUgICAgICAgICAgIFJOIDUKLXIweDBmZTAwZmUwICAgICBSTiAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFswICgxNioyNTUgLSAxNikgMCAoMTYqMjU1IC0gMTYpXQotcjB4MDBmZjAwZmYgICAgIFJOIDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgMjU1IDAgMjU1XSB3aGVyZSAyNTUgaXMgb2Zmc2V0Ci1Db3VudGVyICAgICAgICAgUk4gMTEKLQotSGVpZ2h0ICAgICAgICAgIFJOIDMKLQotICAgICAgICBNX0FMTE9DNCBwRHN0U3RlcCwgNAotICAgICAgICBNX0FMTE9DNCBwU3JjU3RlcCwgNAotCi0gICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZSwgcjYKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgQ291bnRlciwgIzIKLSAgICAgICAgTV9TVFIgICBkc3RTdGVwLCBwRHN0U3RlcCAgICAgICAgCi0gICAgICAgIE1fU1RSICAgc3JjU3RlcCwgcFNyY1N0ZXAgICAgICAgIAotICAgICAgICBMRFIgICAgIHIweDAwZmYwMGZmLCA9MHgwMGZmMDBmZiAgICAgICAgICAgICAgIDsvLyBbMCAyNTUgMCAyNTVdIDI1NSBpcyBvZmZzZXQgdG8gYXZvaWQgbmVnYXRpdmUgcmVzdWx0cyAKLQotTmV4dFR3b1Jvd3NMb29wCi0gICAgICAgIExEUiAgICAgVmFsRCwgW3BTcmMsIHNyY1N0ZXBdICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHJvdyAxIFtkMSBjMSBiMSBhMV0KLSAgICAgICAgTERSICAgICBWYWxBLCBbcFNyY10sICM0ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgcm93IDAgW2QwIGMwIGIwIGEwXQotICAgICAgICBMRFIgICAgIFZhbEgsIFtwU3JjLCBzcmNTdGVwXSAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2gxIGcxIGYxIGUxXSAgICAgICAgCi0gICAgICAgIExEUiAgICAgVmFsRSwgW3BTcmNdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbaDAgZzAgZjAgZTBdCi0gICAgICAgIExEUkIgICAgVGVtcDIsIFtwU3JjLCBzcmNTdGVwXSAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHJvdyAxIFtsMSBrMSBqMSBpMV0KLSAgICAgICAgTERSQiAgICBUZW1wMSwgW3BTcmNdLCAjLTggICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgcm93IDAgW2wwIGswIGowIGkwXQotICAgICAgICAKLSAgICAgICAgUEtIQlQgICBWYWxCLCBWYWxBLCBWYWxELCBMU0wgIzE2ICAgICAgICAgICAgICAgOy8vIFtiMSBhMSBiMCBhMF0KLSAgICAgICAgUEtIVEIgICBWYWxELCBWYWxELCBWYWxBLCBBU1IgIzE2ICAgICAgICAgICAgICAgOy8vIFtkMSBjMSBkMCBjMF0KLSAgICAgICAgVVhUQUIxNiBWYWxBLCByMHgwMGZmMDBmZiwgVmFsQiAgICAgICAgICAgICAgICAgOy8vIFswMCBhMSAwMCBhMF0gKyBbMCAyNTUgMCAyNTVdCi0gICAgICAgIFVYVEFCMTYgVmFsQywgcjB4MDBmZjAwZmYsIFZhbEQgICAgICAgICAgICAgICAgIDsvLyBbMDAgYzEgMDAgYzBdICsgWzAgMjU1IDAgMjU1XQotICAgICAgICBQS0hCVCAgIFZhbEksIFRlbXAxLCBUZW1wMiwgTFNMICMxNiAgICAgICAgICAgICA7Ly8gWzAwIGkxIDAwIGkwXSAgICAgICAgICAgIAotICAgICAgICBQS0hCVCAgIFZhbEYsIFZhbEUsIFZhbEgsIExTTCAjMTYgICAgICAgICAgICAgICA7Ly8gW2YxIGUxIGYwIGUwXQotICAgICAgICBQS0hUQiAgIFZhbEgsIFZhbEgsIFZhbEUsIEFTUiAjMTYgICAgICAgICAgICAgICA7Ly8gW2gxIGcxIGgwIGcwXQotICAgICAgICBVWFRBQjE2IFZhbEUsIHIweDAwZmYwMGZmLCBWYWxGICAgICAgICAgICAgICAgICA7Ly8gWzAwIGUxIDAwIGUwXSArIFswIDI1NSAwIDI1NV0KLQotICAgICAgICA7Ly8gQ2FsY3VsYXRlIEFjYzAKLSAgICAgICAgOy8vIEFjYzAgPSBhIC0gNSpiICsgMjAqYyArIDIwKmQgLSA1KmUgKyBmCi0gICAgICAgIFVYVEFCMTYgVGVtcDEsIFZhbEMsIFZhbEQsIFJPUiAjOAotICAgICAgICBVWFRBQjE2IFRlbXAzLCBWYWxFLCBWYWxCLCBST1IgIzgKLSAgICAgICAgUlNCICAgICBUZW1wMSwgVGVtcDMsIFRlbXAxLCBMU0wgIzIgICAgICAgICAgICAgICAgCi0gICAgICAgIFVYVEFCMTYgQWNjMCwgVmFsQSwgVmFsRiwgUk9SICM4Ci0gICAgICAgIEFERCAgICAgVGVtcDEsIFRlbXAxLCBUZW1wMSwgTFNMICMyICAgICAgICAKLSAgICAgICAgQUREICAgICBBY2MwLCBBY2MwLCBUZW1wMSAgICAgICAKLQotICAgICAgICA7Ly8gQ2FsY3VsYXRlIEFjYzEKLSAgICAgICAgOy8vIEFjYzEgPSBiIC0gNSpjICsgMjAqZCArIDIwKmUgLSA1KmYgKyBnCi0gICAgICAgIFVYVEFCMTYgVGVtcDEsIFZhbEUsIFZhbEQsIFJPUiAjOAotICAgICAgICBVWFRBQjE2IFRlbXAzLCBWYWxDLCBWYWxGLCBST1IgIzgKLSAgICAgICAgUlNCICAgICBUZW1wMSwgVGVtcDMsIFRlbXAxLCBMU0wgIzIgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgVVhUQUIxNiBWYWxHLCByMHgwMGZmMDBmZiwgVmFsSCAgICAgICAgICAgICAgICAgOy8vIFswMCBnMSAwMCBnMF0gKyBbMCAyNTUgMCAyNTVdCi0gICAgICAgIEFERCAgICAgVGVtcDEsIFRlbXAxLCBUZW1wMSwgTFNMICMyICAgICAgICAKLSAgICAgICAgVVhUQUIxNiBBY2MxLCBWYWxHLCBWYWxCLCBST1IgIzgKLSAgICAgICAgQUREICAgICBBY2MxLCBBY2MxLCBUZW1wMSAgICAgICAgCi0KLSAgICAgICAgTERSICAgICByMHgwZmUwMGZlMCwgPTB4MGZlMDBmZTAgICAgICAgICAgICAgICAgOy8vIDB4MGZlMDBmZTAgPSAoMTYgKiBPZmZzZXQpIC0gMTYgd2hlcmUgT2Zmc2V0IGlzIDI1NSAgICAgICAgCi0gICAgICAgIFVYVEFCMTYgQWNjMiwgVmFsQywgVmFsSCwgUk9SICM4ICAgICAgICAKLSAgICAgICAgQUREICAgICBWYWxJLCByMHgwMGZmMDBmZiwgVmFsSSAgICAgICAgICAgICAgICAgOy8vIFswMCBpMSAwMCBpMF0gKyBbMCAyNTUgMCAyNTVdICAgICAgICAKLSAgICAgICAgVVFTVUIxNiBBY2MwLCBBY2MwLCByMHgwZmUwMGZlMCAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFVRU1VCMTYgQWNjMSwgQWNjMSwgcjB4MGZlMDBmZTAKLSAgICAgICAgVVNBVDE2ICBBY2MwLCAjMTMsIEFjYzAKLSAgICAgICAgVVNBVDE2ICBBY2MxLCAjMTMsIEFjYzEgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIENhbGN1bGF0ZSBBY2MyCi0gICAgICAgIDsvLyBBY2MyID0gYyAtIDUqZCArIDIwKmUgKyAyMCpmIC0gNSpnICsgaAotICAgICAgICBVWFRBQjE2IFRlbXAxLCBWYWxHLCBWYWxELCBST1IgIzgKLSAgICAgICAgVVhUQUIxNiBBY2MzLCBWYWxJLCBWYWxELCBST1IgIzgKLSAgICAgICAgVVhUQUIxNiBUZW1wMiwgVmFsRSwgVmFsRiwgUk9SICM4Ci0gICAgICAgIEFORCAgICAgQWNjMSwgcjB4MDBmZjAwZmYsIEFjYzEsIExTUiAjNQotICAgICAgICBBTkQgICAgIEFjYzAsIHIweDAwZmYwMGZmLCBBY2MwLCBMU1IgIzUKLSAgICAgICAgT1JSICAgICBBY2MwLCBBY2MwLCBBY2MxLCBMU0wgIzggICAgICAgIAotICAgICAgICBSU0IgICAgIFRlbXA1LCBUZW1wMSwgVGVtcDIsIExTTCAjMiAgICAgICAgCi0gICAgICAgIFVYVEFCMTYgVGVtcDIsIFZhbEcsIFZhbEYsIFJPUiAjOAotICAgICAgICBBREQgICAgIFRlbXA1LCBUZW1wNSwgVGVtcDUsIExTTCAjMiAgICAgICAgCi0gICAgICAgIEFERCAgICAgQWNjMiwgQWNjMiwgVGVtcDUgICAgICAgIAotCi0gICAgICAgIDsvLyBDYWxjdWxhdGUgQWNjMwotICAgICAgICA7Ly8gQWNjMyA9IGQgLSA1KmUgKyAyMCpmICsgMjAqZyAtIDUqaCArIGkKLSAgICAgICAgVVhUQUIxNiBUZW1wNSwgVmFsRSwgVmFsSCwgUk9SICM4Ci0gICAgICAgIFJTQiAgICAgVGVtcDUsIFRlbXA1LCBUZW1wMiwgTFNMICMyCi0gICAgICAgIExEUiAgICAgcjB4MGZlMDBmZTAsID0weDBmZTAwZmUwCi0gICAgICAgIEFERCAgICAgVGVtcDUsIFRlbXA1LCBUZW1wNSwgTFNMICMyICAgICAgICAKLSAgICAgICAgQUREICAgICBBY2MzLCBBY2MzLCBUZW1wNQotICAgICAgICAKLSAgICAgICAgVVFTVUIxNiBBY2MzLCBBY2MzLCByMHgwZmUwMGZlMCAgICAgICAgCi0gICAgICAgIFVRU1VCMTYgQWNjMiwgQWNjMiwgcjB4MGZlMDBmZTAgICAgICAgIAotICAgICAgICBVU0FUMTYgIEFjYzMsICMxMywgQWNjMwotICAgICAgICBVU0FUMTYgIEFjYzIsICMxMywgQWNjMiAgICAgICAgCi0KLSAgICAgICAgTV9MRFIgICBkc3RTdGVwLCBwRHN0U3RlcAotICAgICAgICBBTkQgICAgIEFjYzMsIHIweDAwZmYwMGZmLCBBY2MzLCBMU1IgIzUKLSAgICAgICAgQU5EICAgICBBY2MyLCByMHgwMGZmMDBmZiwgQWNjMiwgTFNSICM1Ci0gICAgICAgIE9SUiAgICAgQWNjMiwgQWNjMiwgQWNjMywgTFNMICM4Ci0gICAgICAgIAotICAgICAgICBTVUJTICAgIENvdW50ZXIsIENvdW50ZXIsICMxCi0gICAgICAgIE1fTERSICAgc3JjU3RlcCwgcFNyY1N0ZXAKLSAgICAgICAgUEtIQlQgICBBY2MxLCBBY2MwLCBBY2MyLCBMU0wgIzE2ICAgCi0gICAgICAgIE1fU1RSICAgQWNjMSwgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSByZXN1bHQxCi0gICAgICAgIFBLSFRCICAgQWNjMiwgQWNjMiwgQWNjMCwgQVNSICMxNiAgIAotICAgICAgICBNX1NUUiAgIEFjYzIsIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcmVzdWx0MgotICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICAKLSAgICAgICAgQkdUICAgICBOZXh0VHdvUm93c0xvb3AKLUVuZAotICAgICAgICBTVUIgICAgIHBEc3QsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMgotICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMgotCi0gICAgICAgIE1fRU5ECi0gICAgCi0gICAgRU5ESUYKLQotICAgIEVORAotICAgIAotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDZjYmYzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAKLSAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLSAgICAgICAKLSAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCi0KLQotICAgIAotICAgIElGIEFSTTExMzZKUwotICAgIAotICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCi0KLSAgICAgICAgOy8vIEZ1bmN0aW9uOiAKLSAgICAgICAgOy8vICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZSAgCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW1wbGVtZW50cyB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uIGZvciBhIGJsb2NrIG9mIHNpemUgNHg0LiBJbnB1dCBhbmQgb3V0cHV0IHNob3VsZCAKLSAgICAgICAgOy8vIGJlIGFsaWduZWQuIAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFJlZ2lzdGVycyB1c2VkIGFzIGlucHV0IGZvciB0aGlzIGZ1bmN0aW9uCi0gICAgICAgIDsvLyByMCxyMSxyMixyMyB3aGVyZSByMCxyMiAgaW5wdXQgcG9pbnRlciBhbmQgcjEscjMgY29ycmVzcG9uZGluZyBzdGVwIHNpemUKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBSZWdpc3RlcnMgcHJlc2VydmVkIGZvciB0b3AgbGV2ZWwgZnVuY3Rpb24KLSAgICAgICAgOy8vIHIwLHIxLHIyLHIzLHI0LHI1LHI2LHIxNAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFJlZ2lzdGVycyBtb2RpZmllZCBieSB0aGUgZnVuY3Rpb24KLSAgICAgICAgOy8vIHI3LHI4LHI5LHIxMCxyMTEscjEyCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gT3V0cHV0IHJlZ2lzdGVycwotICAgICAgICA7Ly8gTm9uZS4gRnVuY3Rpb24gd2lsbCBwcmVzZXJ2ZSByMC1yMwotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlLCByNgotCi07Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKLXBTcmMgICAgICAgICAgICBSTiAwCi1zcmNTdGVwICAgICAgICAgUk4gMQotcERzdCAgICAgICAgICAgIFJOIDIKLWRzdFN0ZXAgICAgICAgICBSTiAzCi0KLTsvLyBEZWNsYXJlIGlubmVyIGxvb3AgcmVnaXN0ZXJzCi1WYWxBICAgICAgICAgICAgUk4gNQotVmFsQTAgICAgICAgICAgIFJOIDQKLVZhbEExICAgICAgICAgICBSTiA1Ci1WYWxBRjAgICAgICAgICAgUk4gNAotVmFsQUYxICAgICAgICAgIFJOIDUKLQotVmFsQiAgICAgICAgICAgIFJOIDExCi0KLVZhbEMgICAgICAgICAgICBSTiA1Ci1WYWxDMCAgICAgICAgICAgUk4gNAotVmFsQzEgICAgICAgICAgIFJOIDUKLVZhbENEMCAgICAgICAgICBSTiAxMgotVmFsQ0QxICAgICAgICAgIFJOIDE0Ci1WYWxDRjAgICAgICAgICAgUk4gNAotVmFsQ0YxICAgICAgICAgIFJOIDUKLQotVmFsRCAgICAgICAgICAgIFJOIDEwCi0KLVZhbEUgICAgICAgICAgICBSTiA3Ci1WYWxFMCAgICAgICAgICAgUk4gNgotVmFsRTEgICAgICAgICAgIFJOIDcKLVZhbEVCMCAgICAgICAgICBSTiAxMAotVmFsRUIxICAgICAgICAgIFJOIDExCi1WYWxFRDAgICAgICAgICAgUk4gNgotVmFsRUQxICAgICAgICAgIFJOIDcKLQotVmFsRiAgICAgICAgICAgIFJOIDEwCi0KLVZhbEcgICAgICAgICAgICBSTiAxNAotVmFsRzAgICAgICAgICAgIFJOIDEyCi1WYWxHMSAgICAgICAgICAgUk4gMTQKLVZhbEdCMCAgICAgICAgICBSTiAxMgotVmFsR0IxICAgICAgICAgIFJOIDE0Ci0KLUFjYzAgICAgICAgICAgICBSTiA0Ci1BY2MxICAgICAgICAgICAgUk4gNQotQWNjMiAgICAgICAgICAgIFJOIDYKLUFjYzMgICAgICAgICAgICBSTiA3Ci0KLVRlbXAgICAgICAgICAgICBSTiA3Ci1IZWlnaHQgICAgICAgICAgUk4gMwotU3RlcCAgICAgICAgICAgIFJOIDYKLQotQ291bnRlciAgICAgICAgIFJOIDgKLXIweDAwZmYwMGZmICAgICBSTiA5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCAyNTUgMCAyNTVdIHdoZXJlIDI1NSBpcyBvZmZzZXQKLXIweDBmZTAwZmUwICAgICBSTiAxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCAoMTYqMjU1IC0gMTYpIDAgKDE2KjI1NSAtIDE2KV0KLQotICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgcjB4MDBmZjAwZmYsID0weDAwZmYwMGZmICAgICAgICAgICAgICAgIDsvLyBbMCAyNTUgMCAyNTVdIDI1NSBpcyBvZmZzZXQgdG8gYXZvaWQgbmVnYXRpdmUgcmVzdWx0cyAKLSAgICAgICAgTU9WICAgICAgICAgQ291bnRlciwgIzIKLSAgICAgICAgCi1Ud29Sb3dzTG9vcAotICAgICAgICBNX0xEUiAgICAgICBWYWxDLCBbcFNyY10sIHNyY1N0ZXAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFtjMyBjMiBjMSBjMF0KLSAgICAgICAgTV9MRFIgICAgICAgVmFsRCwgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbZDMgZDIgZDEgZDBdCi0gICAgICAgIE1fTERSICAgICAgIFZhbEUsIFtwU3JjXSwgc3JjU3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2UzIGUyIGUxIGUwXSAgICAgICAgCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMiAgICAgICAgICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgVmFsQiwgW3BTcmNdICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbYjMgYjIgYjEgYjBdICAgICAgICAKLSAgICAgICAgVVhUQUIxNiAgICAgVmFsQzAsIHIweDAwZmYwMGZmLCBWYWxDICAgICAgICAgICAgICAgIDsvLyBbMCBjMiAwIGMwXSArIFswIDI1NSAwIDI1NV0KLSAgICAgICAgVVhUQUIxNiAgICAgVmFsQzEsIHIweDAwZmYwMGZmLCBWYWxDLCBST1IgIzggICAgICAgIDsvLyBbMCBjMyAwIGMxXSArIFswIDI1NSAwIDI1NV0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgVVhUQUIxNiAgICAgVmFsRTAsIHIweDAwZmYwMGZmLCBWYWxFICAgICAgICAgICAgICAgIDsvLyBbMCBlMiAwIGUwXSArIFswIDI1NSAwIDI1NV0KLSAgICAgICAgVVhUQUIxNiAgICAgVmFsRTEsIHIweDAwZmYwMGZmLCBWYWxFLCBST1IgIzggICAgICAgIDsvLyBbMCBlMyAwIGUxXSArIFswIDI1NSAwIDI1NV0gICAgICAgIAotICAgICAgICBVWFRBQjE2ICAgICBWYWxDRDAsIFZhbEMwLCBWYWxEICAgICAgICAgICAgICAgICAgICAgOy8vIFswIGMyIDAgYzBdICsgWzAgMjU1IDAgMjU1XSArIFswIGQyIDAgZDBdCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbENEMSwgVmFsQzEsIFZhbEQsIFJPUiAjOCAgICAgICAgICAgICA7Ly8gWzAgYzMgMCBjMV0gKyBbMCAyNTUgMCAyNTVdICsgWzAgZDMgMCBkMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBVWFRBQjE2ICAgICBWYWxFQjAsIFZhbEUwLCBWYWxCICAgICAgICAgICAgICAgICAgICAgOy8vIFswIGUyIDAgZTBdICsgWzAgMjU1IDAgMjU1XSArIFswIGIyIDAgYjBdCi0gICAgICAgIFJTQiAgICAgICAgIFZhbENEMCwgVmFsRUIwLCBWYWxDRDAsIExTTCAjMiAgICAgICAgICA7Ly8gNCooT2ZmK0MrRCkgLSAoT2ZmK0IrRSkKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIFZhbEQsIFtwU3JjLCBzcmNTdGVwLCBMU0wgIzFdICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2QzIGQyIGQxIGQwXQotICAgICAgICBVWFRBQjE2ICAgICBWYWxFQjEsIFZhbEUxLCBWYWxCLCBST1IgIzggICAgICAgICAgICAgOy8vIFswIGUzIDAgZTFdICsgWzAgMjU1IDAgMjU1XSArIFswIGIzIDAgYjFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgUlNCICAgICAgICAgVmFsQ0QxLCBWYWxFQjEsIFZhbENEMSwgTFNMICMyICAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbEVEMCwgVmFsRTAsIFZhbEQgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgZTIgMCBlMF0gKyBbMCAyNTUgMCAyNTVdICsgWzAgZDIgMCBkMF0KLSAgICAgICAgVVhUQUIxNiAgICAgVmFsRUQxLCBWYWxFMSwgVmFsRCwgUk9SICM4ICAgICAgICAgICAgIDsvLyBbMCBlMyAwIGUxXSArIFswIDI1NSAwIDI1NV0gKyBbMCBkMyAwIGQxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICBMRFIgICAgICAgICBWYWxGLCBbcFNyYywgc3JjU3RlcCwgTFNMICMyXSAgICAgICAgICAgOy8vIExvYWQgIFtmMyBmMiBmMSBmMF0KLSAgICAgICAgTV9MRFIgICAgICAgVmFsQiwgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbYjMgYjIgYjEgYjBdICAgICAgICAgICAgICAgIAotICAgICAgICBBREQgICAgICAgICBWYWxDRDAsIFZhbENEMCwgVmFsQ0QwLCBMU0wgIzIgICAgICAgICAgOy8vIDUgKiBbNCooT2ZmK0MrRCkgLSAoT2ZmK0IrRSldCi0gICAgICAgIEFERCAgICAgICAgIFZhbENEMSwgVmFsQ0QxLCBWYWxDRDEsIExTTCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbENGMSwgVmFsQzEsIFZhbEYsIFJPUiAjOCAgICAgICAgICAgICA7Ly8gWzAgYzMgMCBjMV0gKyBbMCAyNTUgMCAyNTVdICsgWzAgZjMgMCBmMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBVWFRBQjE2ICAgICBWYWxDRjAsIFZhbEMwLCBWYWxGICAgICAgICAgICAgICAgICAgICAgOy8vIFswIGMyIDAgYzBdICsgWzAgMjU1IDAgMjU1XSArIFswIGYyIDAgZjBdCi0gICAgICAgIFJTQiAgICAgICAgIFZhbEVEMSwgVmFsQ0YxLCBWYWxFRDEsIExTTCAjMiAgICAgICAgCi0gICAgICAgIAotICAgICAgICBTVUIgICAgICAgICBWYWxBLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgTERSICAgICAgICAgVmFsQSwgW1ZhbEFdICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbYTMgYTIgYTEgYTBdCi0gICAgICAgIFJTQiAgICAgICAgIFZhbEVEMCwgVmFsQ0YwLCBWYWxFRDAsIExTTCAjMiAgICAgICAgICA7Ly8gNCooT2ZmK0UrRCkgLSAoT2ZmK0MrRikgICAgICAgIAotICAgICAgICBBREQgICAgICAgICBWYWxFRDEsIFZhbEVEMSwgVmFsRUQxLCBMU0wgIzIgICAgICAgICAgCi0gICAgICAgIEFERCAgICAgICAgIFZhbEVEMCwgVmFsRUQwLCBWYWxFRDAsIExTTCAjMiAgICAgICAgICA7Ly8gNSAqIFs0KihPZmYrRStEKSAtIChPZmYrQytGKV0KLSAgICAgICAgVVhUQUIxNiAgICAgVmFsQTAsIHIweDAwZmYwMGZmLCBWYWxBICAgICAgICAgICAgICAgIDsvLyBbMCBhMiAwIGEwXSArIFswIDI1NSAwIDI1NV0KLSAgICAgICAgVVhUQUIxNiAgICAgVmFsQTEsIHIweDAwZmYwMGZmLCBWYWxBLCBST1IgIzggICAgICAgIDsvLyBbMCBhMyAwIGExXSArIFswIDI1NSAwIDI1NV0KLSAgICAgICAgVVhUQUIxNiAgICAgVmFsQUYwLCBWYWxBMCwgVmFsRiAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCBhMiAwIGEwXSArIFswIDI1NSAwIDI1NV0gKyBbMCBmMiAwIGYwXQotICAgICAgICBVWFRBQjE2ICAgICBWYWxBRjEsIFZhbEExLCBWYWxGLCBST1IgIzggICAgICAgICAgICAgOy8vIFswIGEzIDAgYTFdICsgWzAgMjU1IDAgMjU1XSArIFswIGYzIDAgZjFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIHIweDBmZTAwZmUwLCA9MHgwZmUwMGZlMCAgICAgICAgICAgICAgICA7Ly8gWzAgMjU1IDAgMjU1XSAyNTUgaXMgb2Zmc2V0IHRvIGF2b2lkIG5lZ2F0aXZlIHJlc3VsdHMgCi0gICAgICAgIEFERCAgICAgICAgIEFjYzEsIFZhbENEMSwgVmFsQUYxICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIFZhbEcsIFtwU3JjLCBzcmNTdGVwLCBMU0wgIzJdICAgICAgICAgICA7Ly8gTG9hZCAgW2czIGcyIGcxIGcwXQotICAgICAgICBBREQgICAgICAgICBBY2MwLCBWYWxDRDAsIFZhbEFGMCAgICAgICAgICAgICAgICAgICAgOy8vIEFjYzAgPSAxNipPZmYgKyAoQStGKSArIDIwKihDK0QpIC0gNSooQitFKSAgICAgICAgCi0gICAgICAgIFVRU1VCMTYgICAgIEFjYzEsIEFjYzEsIHIweDBmZTAwZmUwICAgICAgICAgICAgICAgICA7Ly8gQWNjMSAtPSAoMTYqT2ZmIC0gMTYpCi0gICAgICAgIFVRU1VCMTYgICAgIEFjYzAsIEFjYzAsIHIweDBmZTAwZmUwICAgICAgICAKLSAgICAgICAgVVhUQUIxNiAgICAgVmFsRzAsIHIweDAwZmYwMGZmLCBWYWxHICAgICAgICAgICAgICAgIDsvLyBbMCBnMiAwIGcwXSArIFswIDI1NSAwIDI1NV0KLSAgICAgICAgVVhUQUIxNiAgICAgVmFsRzEsIHIweDAwZmYwMGZmLCBWYWxHLCBST1IgIzggICAgICAgIDsvLyBbMCBnMyAwIGcxXSArIFswIDI1NSAwIDI1NV0KLSAgICAgICAgVVhUQUIxNiAgICAgVmFsR0IwLCBWYWxHMCwgVmFsQiAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCBnMiAwIGcwXSArIFswIDI1NSAwIDI1NV0gKyBbMCBiMiAwIGIwXQotICAgICAgICBVWFRBQjE2ICAgICBWYWxHQjEsIFZhbEcxLCBWYWxCLCBST1IgIzggICAgICAgICAgICAgOy8vIFswIGczIDAgZzFdICsgWzAgMjU1IDAgMjU1XSArIFswIGIzIDAgYjFdICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIEFERCAgICAgICAgIEFjYzIsIFZhbEVEMCwgVmFsR0IwICAgICAgICAgICAgICAgICAgICA7Ly8gQWNjMiA9IDE2Kk9mZiArIChCK0cpICsgMjAqKEQrRSkgLSA1KihDK0YpCi0gICAgICAgIEFERCAgICAgICAgIEFjYzMsIFZhbEVEMSwgVmFsR0IxICAgICAgICAKLSAgICAgICAgVVFTVUIxNiAgICAgQWNjMywgQWNjMywgcjB4MGZlMDBmZTAgICAgICAgICAgICAgICAgIDsvLyBBY2MzIC09ICgxNipPZmYgLSAxNikKLSAgICAgICAgVVFTVUIxNiAgICAgQWNjMiwgQWNjMiwgcjB4MGZlMDBmZTAgICAgICAgIAotICAgICAgICBVU0FUMTYgICAgICBBY2MxLCAjMTMsIEFjYzEgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNhdHVyYXRlIHRvIDgrNSA9IDEzIGJpdHMKLSAgICAgICAgVVNBVDE2ICAgICAgQWNjMCwgIzEzLCBBY2MwCi0gICAgICAgIFVTQVQxNiAgICAgIEFjYzMsICMxMywgQWNjMyAgICAgICAgCi0gICAgICAgIFVTQVQxNiAgICAgIEFjYzIsICMxMywgQWNjMgotICAgICAgICBBTkQgICAgICAgICBBY2MxLCByMHgwMGZmMDBmZiwgQWNjMSwgTFNSICM1ICAgICAgICAgOy8vIFswIGEzIDAgYTFdCi0gICAgICAgIEFORCAgICAgICAgIEFjYzAsIHIweDAwZmYwMGZmLCBBY2MwLCBMU1IgIzUgICAgICAgICA7Ly8gWzAgYTIgMCBhMF0KLSAgICAgICAgT1JSICAgICAgICAgQWNjMCwgQWNjMCwgQWNjMSwgTFNMICM4ICAgICAgICAgICAgICAgIDsvLyBbYTMgYTIgYTEgYTBdCi0gICAgICAgIEFORCAgICAgICAgIEFjYzMsIHIweDAwZmYwMGZmLCBBY2MzLCBMU1IgIzUgICAgICAgICA7Ly8gWzAgYjMgMCBiMV0KLSAgICAgICAgQU5EICAgICAgICAgQWNjMiwgcjB4MDBmZjAwZmYsIEFjYzIsIExTUiAjNSAgICAgICAgIDsvLyBbMCBiMiAwIGIwXQotICAgICAgICAKLSAgICAgICAgTV9TVFIgICAgICAgQWNjMCwgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSByZXN1bHQgJiBhZGp1c3QgcG9pbnRlcgotICAgICAgICBPUlIgICAgICAgICBBY2MyLCBBY2MyLCBBY2MzLCBMU0wgIzggICAgICAgICAgICAgICAgOy8vIFtiMyBiMiBiMSBiMF0gICAgICAgIAotICAgICAgICBNX1NUUiAgICAgICBBY2MyLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHJlc3VsdCAmIGFkanVzdCBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIEFERCAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICAKLSAgICAgICAgU1VCUyAgICAgICAgQ291bnRlciwgQ291bnRlciwgIzEKLSAgICAgICAgQkdUICAgICAgICAgVHdvUm93c0xvb3AKLUVuZAotICAgICAgICBTVUIgICAgIHBEc3QsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMgotICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMgotCi0gICAgICAgIE1fRU5ECi0gICAgCi0gICAgRU5ESUYKLSAgICAKLSAgICBFTkQKLSAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YmY2N2MuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyODcgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotICAgICAgICAKLSAgICBJRiBBUk0xMTM2SlMKLQotOy8vIGlucHV0IHJlZ2lzdGVycwotCi1wU3JjICAgICAgICAgICAgICAgICBSTiAwCi1pU3JjU3RlcCAgICAgICAgICAgICBSTiAxCi1wRHN0ICAgICAgICAgICAgICAgICBSTiAyCi1pRHN0U3RlcCAgICAgICAgICAgICBSTiAzCi1pV2lkdGggICAgICAgICAgICAgICBSTiA0Ci1pSGVpZ2h0ICAgICAgICAgICAgICBSTiA1Ci1keCAgICAgICAgICAgICAgICAgICBSTiA2Ci1keSAgICAgICAgICAgICAgICAgICBSTiA3Ci0KLQotOy8vIGxvY2FsIHZhcmlhYmxlIHJlZ2lzdGVycwotdGVtcCAgICAgICAgICAgICAgICAgUk4gMTEKLXIweDIwICAgICAgICAgICAgICAgIFJOIDEyCi10bXAweDIwICAgICAgICAgICAgICBSTiAxNAotcmV0dXJuICAgICAgICAgICAgICAgUk4gMAotZHhQbHVzZHkgICAgICAgICAgICAgUk4gMTAKLUVpZ2h0TWludXNkeCAgICAgICAgIFJOIDggCi1FaWdodE1pbnVzZHkgICAgICAgICBSTiA5Ci1keEVpZ2h0TWludXNkeCAgICAgICBSTiA4Ci1CQUNvZWZmICAgICAgICAgICAgICBSTiA2Ci1EQ0NvZWZmICAgICAgICAgICAgICBSTiA3Ci0gICAgICAgICAgICAgICAgICAgICAKLWlEc3RTdGVweDJNaW51c1dpZHRoIFJOIDgKLWlTcmNTdGVweDJNaW51c1dpZHRoIFJOIDkKLWlTcmNTdGVwMSAgICAgICAgICAgIFJOIDEwCi0KLXBTcmMxICAgICAgICAgICAgICAgIFJOIDEKLXBTcmMyICAgICAgICAgICAgICAgIFJOIDgKLXBEc3QxICAgICAgICAgICAgICAgIFJOIDgKLXBEc3QyICAgICAgICAgICAgICAgIFJOIDEyCi0gICAgICAgICAgICAgICAgICAgICAKLXBpeDAwICAgICAgICAgICAgICAgIFJOIDgKLXBpeDAxICAgICAgICAgICAgICAgIFJOIDkKLXBpeDEwICAgICAgICAgICAgICAgIFJOIDEwCi1waXgxMSAgICAgICAgICAgICAgICBSTiAxMQotCi1PdXQwMTAwICAgICAgICAgICAgICBSTiA4ICAKLU91dDExMTAgICAgICAgICAgICAgIFJOIDEwIAotCi14MDAgICAgICAgICAgICAgICAgICBSTiA4Ci14MDEgICAgICAgICAgICAgICAgICBSTiAxMAoteDAyICAgICAgICAgICAgICAgICAgUk4gMTIKLXgxMCAgICAgICAgICAgICAgICAgIFJOIDkKLXgxMSAgICAgICAgICAgICAgICAgIFJOIDExCi14MTIgICAgICAgICAgICAgICAgICBSTiAxNAoteDIwICAgICAgICAgICAgICAgICAgUk4gMTAKLXgyMSAgICAgICAgICAgICAgICAgIFJOIDEyCi14MjIgICAgICAgICAgICAgICAgICBSTiAxNAotICAgICAgICAgICAgICAgICAgICAgCi14MDF4MDAgICAgICAgICAgICAgICBSTiA4ICAKLXgwMngwMSAgICAgICAgICAgICAgIFJOIDEwIAoteDExeDEwICAgICAgICAgICAgICAgUk4gOSAgCi14MTJ4MTEgICAgICAgICAgICAgICBSTiAxMSAKLXgyMXgyMCAgICAgICAgICAgICAgIFJOIDEwIAoteDIyeDIxICAgICAgICAgICAgICAgUk4gMTIgCi0gICAgICAgICAgICAgICAgICAgICAKLU91dFJvdzAwICAgICAgICAgICAgIFJOIDEyCi1PdXRSb3cwMSAgICAgICAgICAgICBSTiAxNAotT3V0Um93MTAgICAgICAgICAgICAgUk4gMTAKLU91dFJvdzExICAgICAgICAgICAgIFJOIDEyCi0gICAgICAgICAgICAgICAgICAgICAKLU91dFJvdzAxMDAgICAgICAgICAgIFJOIDEyCi1PdXRSb3cxMTEwICAgICAgICAgICBSTiAxMgotICAgICAgICAgICAgICAgICAgICAgCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX2FzbSBzdGFydHMKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIAotICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEsIHIxMQotICAgICAgICAKLSAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKLSAgICAgICAgTV9BUkcgICBXaWR0aCwgICAgICA0Ci0gICAgICAgIE1fQVJHICAgSGVpZ2h0LCAgICAgNAotICAgICAgICBNX0FSRyAgIER4LCAgICAgICAgIDQKLSAgICAgICAgTV9BUkcgICBEeSwgICAgICAgICA0Ci0gICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjawotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NAotICAgICAgICAKLSAgICAgICAgTV9MRFIgICBpV2lkdGgsICBXaWR0aCAgCi0gICAgICAgIE1fTERSICAgaUhlaWdodCwgSGVpZ2h0ICAKLSAgICAgICAgTV9MRFIgICBkeCwgICAgICBEeCAKLSAgICAgICAgTV9MRFIgICBkeSwgICAgICBEeQotICAgICAgICAKLSAgICAgICAgOy8vIEVpZ2h0TWludXNkeCA9IDggLSBkeAotICAgICAgICA7Ly8gRWlnaHRNaW51c2R5ID0gOCAtIGR5Ci0gICAgICAgIAotICAgICAgICA7Ly8gQUNvZWZmID0gRWlnaHRNaW51c2R4ICogRWlnaHRNaW51c2R5Ci0gICAgICAgIDsvLyBCQ29lZmYgPSBkeCAqIEVpZ2h0TWludXNkeQotICAgICAgICA7Ly8gQ0NvZWZmID0gRWlnaHRNaW51c2R4ICogZHkKLSAgICAgICAgOy8vIERDb2VmZiA9IGR4ICogZHkKLSAgICAgICAgCi0gICAgICAgIEFERCAgICAgcFNyYzEsIHBTcmMsIGlTcmNTdGVwCi0gICAgICAgIFNVQiAgICAgdGVtcCwgaVdpZHRoLCAjMQotICAgICAgICBSU0IgICAgIEVpZ2h0TWludXNkeCwgZHgsICM4IAotICAgICAgICBSU0IgICAgIEVpZ2h0TWludXNkeSwgZHksICM4Ci0gICAgICAgIENNTiAgICAgZHgsZHkKLSAgICAgICAgQUREICAgICBkeEVpZ2h0TWludXNkeCwgRWlnaHRNaW51c2R4LCBkeCwgTFNMICMxNgotICAgICAgICBPUlIgICAgIGlXaWR0aCwgaVdpZHRoLCB0ZW1wLCBMU0wgIzE2Ci0gICAgICAgIAotICAgICAgICA7Ly8gUGFja2VkIENvZWZmcy4KLSAgICAgICAgCi0gICAgICAgIE1VTCAgICAgQkFDb2VmZiwgZHhFaWdodE1pbnVzZHgsIEVpZ2h0TWludXNkeQotICAgICAgICBNVUwgICAgIERDQ29lZmYsIGR4RWlnaHRNaW51c2R4LCBkeSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIENoZWNraW5nIGVpdGhlciBvZiBkeCBhbmQgZHkgYmVpbmcgbm9uLXplcm8KLSAgICAgICAgCi0gICAgICAgIEJFUSAgICAgTVZJc1plcm8KLSAgICAgICAgCi07Ly8gUGl4ZWwgbGF5b3V0OgotOy8vCi07Ly8gICB4MDAgeDAxIHgwMgotOy8vICAgeDEwIHgxMSB4MTIKLTsvLyAgIHgyMCB4MjEgeDIyCi0KLTsvLyBJZiBmcmFjdGlvbmwgbXYgaXMgbm90ICgwLCAwKQotICAgICAgICAKLU91dGVyTG9vcE1WSXNOb3RaZXJvCi0KLUlubmVyTG9vcE1WSXNOb3RaZXJvCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBMRFJCICAgIHgwMCwgW3BTcmMsICAjKzBdICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIExEUkIgICAgeDEwLCBbcFNyYzEsICMrMF0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgTERSQiAgICB4MDEsIFtwU3JjLCAgIysxXSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIExEUkIgICAgeDExLCBbcFNyYzEsICMrMV0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBMRFJCICAgIHgwMiwgW3BTcmMsICAjKzJdISAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBMRFJCICAgIHgxMiwgW3BTcmMxLCAjKzJdISAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBPUlIgICAgIHgwMXgwMCwgeDAwLCB4MDEsIExTTCAjMTYgICAgICAgIAotICAgICAgICAgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCi0gICAgICAgICAgICAgICAgT1JSICAgICB4MDJ4MDEsIHgwMSwgeDAyLCBMU0wgIzE2ICAgICAgICAKLSAgICAgICAgICAgICAgICBNT1YgICAgIHIweDIwLCAgIzMyCi0gICAgICAgICAgICAgICAgT1JSICAgICB4MTF4MTAsIHgxMCwgeDExLCBMU0wgIzE2ICAgIAotICAgICAgICAgICAgICAgIE9SUiAgICAgeDEyeDExLCB4MTEsIHgxMiwgTFNMICMxNiAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU01MQUQgICB4MDF4MDAsIHgwMXgwMCwgQkFDb2VmZiwgcjB4MjAKLSAgICAgICAgICAgICAgICBTTUxBRCAgIHgwMngwMSwgeDAyeDAxLCBCQUNvZWZmLCByMHgyMCAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICA7Ly8gaVdpZHRoIHBhY2tlZCB3aXRoIE1TQiAodG9wIDE2IGJpdHMpIAotICAgICAgICAgICAgICAgIDsvLyBhcyBpbm5lciBsb29wIGNvdW50ZXIgdmFsdWUgaS5lIAotICAgICAgICAgICAgICAgIDsvLyAoaVdpZHRoIC0xKSBhbmQgTFNCIChsb3dlciAxNiBiaXRzKQotICAgICAgICAgICAgICAgIDsvLyBhcyBvcmlnaW5hbCB3aWR0aAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFNVQlMgICAgaVdpZHRoLCBpV2lkdGgsICMxPDwxNwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFNNTEFEICAgT3V0Um93MDAsIHgxMXgxMCwgRENDb2VmZiwgeDAxeDAwICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU01MQUQgICBPdXRSb3cwMSwgeDEyeDExLCBEQ0NvZWZmLCB4MDJ4MDEgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBSU0IgICAgIHBTcmMyLCBwU3JjLCBwU3JjMSwgTFNMICMxCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgTU9WICAgICBPdXRSb3cwMCwgT3V0Um93MDAsIExTUiAjNgotICAgICAgICAgICAgICAgIE1PViAgICAgT3V0Um93MDEsIE91dFJvdzAxLCBMU1IgIzYKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBMRFJCICAgIHgyMCxbcFNyYzIsICMtMl0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBPUlIgICAgIE91dFJvdzAxMDAsIE91dFJvdzAwLCBPdXRSb3cwMSwgTFNMICM4Ci0gICAgICAgICAgICAgICAgU1RSSCAgICBPdXRSb3cwMTAwLCBbcERzdF0sICMyCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgTERSQiAgICB4MjEsW3BTcmMyLCAjLTFdCi0gICAgICAgICAgICAgICAgTERSQiAgICB4MjIsW3BTcmMyLCAjKzBdCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgQUREICAgICBwRHN0MSwgcERzdCwgaURzdFN0ZXAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBPUlIgICAgIHgyMXgyMCwgeDIwLCB4MjEsIExTTCAjMTYKLSAgICAgICAgICAgICAgICBPUlIgICAgIHgyMngyMSwgeDIxLCB4MjIsIExTTCAjMTYgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIE1PViAgICAgdG1wMHgyMCwgIzMyCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgOy8vIFJldXNpbmcgdGhlIHBhY2tlZCBkYXRhIHgxMXgxMCBhbmQgeDEyeDExCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU01MQUQgICB4MTF4MTAsICB4MTF4MTAsICBCQUNvZWZmLCB0bXAweDIwCi0gICAgICAgICAgICAgICAgU01MQUQgICB4MTJ4MTEsICB4MTJ4MTEsICBCQUNvZWZmLCB0bXAweDIwCi0gICAgICAgICAgICAgICAgU01MQUQgICBPdXRSb3cxMCwgeDIxeDIwLCBEQ0NvZWZmLCB4MTF4MTAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTTUxBRCAgIE91dFJvdzExLCB4MjJ4MjEsIERDQ29lZmYsIHgxMngxMQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIE1PViAgICAgT3V0Um93MTAsIE91dFJvdzEwLCBMU1IgIzYKLSAgICAgICAgICAgICAgICBNT1YgICAgIE91dFJvdzExLCBPdXRSb3cxMSwgTFNSICM2Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIE9SUiAgICAgT3V0Um93MTExMCwgT3V0Um93MTAsIE91dFJvdzExLCBMU0wgIzgKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTVFJIICAgIE91dFJvdzExMTAsIFtwRHN0MSwgIy0yXQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEJHVCAgICAgSW5uZXJMb29wTVZJc05vdFplcm8KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMyCi0gICAgICAgICAgICAgICAgQUREICAgICBpV2lkdGgsIGlXaWR0aCwgIzE8PDE2Ci0gICAgICAgICAgICAgICAgUlNCICAgICBpRHN0U3RlcHgyTWludXNXaWR0aCwgaVdpZHRoLCBpRHN0U3RlcCwgTFNMICMxCi0gICAgICAgICAgICAgICAgU1VCICAgICBpU3JjU3RlcDEsIHBTcmMxLCBwU3JjCi0gICAgICAgICAgICAgICAgU1VCICAgICB0ZW1wLCBpV2lkdGgsICMxCi0gICAgICAgICAgICAgICAgUlNCICAgICBpU3JjU3RlcHgyTWludXNXaWR0aCwgaVdpZHRoLCBpU3JjU3RlcDEsIExTTCAjMQotICAgICAgICAgICAgICAgIEFERCAgICAgcERzdCwgcERzdCwgaURzdFN0ZXB4Mk1pbnVzV2lkdGgKLSAgICAgICAgICAgICAgICBBREQgICAgIHBTcmMxLCBwU3JjMSwgaVNyY1N0ZXB4Mk1pbnVzV2lkdGgKLSAgICAgICAgICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIGlTcmNTdGVweDJNaW51c1dpZHRoCi0gICAgICAgICAgICAgICAgT1JSICAgICBpV2lkdGgsIGlXaWR0aCwgdGVtcCwgTFNMICMxNgotICAgICAgICAgICAgICAgIEJHVCAgICAgT3V0ZXJMb29wTVZJc05vdFplcm8KLSAgICAgICAgICAgICAgICBNT1YgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCi0gICAgICAgICAgICAgICAgTV9FWElUCi0KLTsvLyBJZiBmcmFjdGlvbmwgbXYgaXMgKDAsIDApCi0KLU1WSXNaZXJvCi0gICAgICAgICAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTQKLU91dGVyTG9vcE1WSXNaZXJvCi0KLUlubmVyTG9vcE1WSXNaZXJvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIExEUkIgICAgcGl4MDAsIFtwU3JjXSwgICMrMQotICAgICAgICAgICAgICAgIExEUkIgICAgcGl4MDEsIFtwU3JjXSwgICMrMQotICAgICAgICAgICAgICAgIExEUkIgICAgcGl4MTAsIFtwU3JjMV0sICMrMQotICAgICAgICAgICAgICAgIExEUkIgICAgcGl4MTEsIFtwU3JjMV0sICMrMQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEFERCAgICAgcERzdDIsICBwRHN0LCBpRHN0U3RlcAotICAgICAgICAgICAgICAgIFNVQlMgICAgaVdpZHRoLCBpV2lkdGgsICMxPDwxNyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBPUlIgICAgIE91dDAxMDAsIHBpeDAwLCBwaXgwMSwgTFNMICM4IAotICAgICAgICAgICAgICAgIE9SUiAgICAgT3V0MTExMCwgcGl4MTAsIHBpeDExLCBMU0wgIzgKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTVFJIICAgIE91dDAxMDAsIFtwRHN0XSwgICMyCi0gICAgICAgICAgICAgICAgU1RSSCAgICBPdXQxMTEwLCBbcERzdDJdLCAjMgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEJHVCAgICAgSW5uZXJMb29wTVZJc1plcm8KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMyCi0gICAgICAgICAgICAgICAgQUREICAgICBpV2lkdGgsIGlXaWR0aCwgIzE8PDE2Ci0gICAgICAgICAgICAgICAgUlNCICAgICBpRHN0U3RlcHgyTWludXNXaWR0aCwgaVdpZHRoLCBpRHN0U3RlcCwgTFNMICMxCi0gICAgICAgICAgICAgICAgU1VCICAgICBpU3JjU3RlcDEsIHBTcmMxLCBwU3JjCi0gICAgICAgICAgICAgICAgU1VCICAgICB0ZW1wLCBpV2lkdGgsICMxCi0gICAgICAgICAgICAgICAgUlNCICAgICBpU3JjU3RlcHgyTWludXNXaWR0aCwgaVdpZHRoLCBpU3JjU3RlcDEsIExTTCAjMQotICAgICAgICAgICAgICAgIEFERCAgICAgcERzdCwgcERzdCwgaURzdFN0ZXB4Mk1pbnVzV2lkdGgKLSAgICAgICAgICAgICAgICBBREQgICAgIHBTcmMxLCBwU3JjMSwgaVNyY1N0ZXB4Mk1pbnVzV2lkdGgKLSAgICAgICAgICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIGlTcmNTdGVweDJNaW51c1dpZHRoCi0gICAgICAgICAgICAgICAgT1JSICAgICBpV2lkdGgsIGlXaWR0aCwgdGVtcCwgTFNMICMxNgotICAgICAgICAgICAgICAgIEJHVCAgICAgT3V0ZXJMb29wTVZJc1plcm8KLSAgICAgICAgICAgICAgICBNT1YgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCi0gICAgICAgICAgICAgICAgTV9FTkQKLQotICAgICAgICBFTkRJRiA7Ly8gQVJNMTEzNkpTCi0KLSAgICAgICAgCi0gICAgICAgIEVORAotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX2FzbSBlbmRzCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXNfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1F1YW50VGFibGVzX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM4YzcxOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXNfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfUXVhbnRUYWJsZXNfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgOTY0MQotOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8gRGVzY3JpcHRpb246Ci07Ly8gVGhpcyBmaWxlIGNvbnRhaW5zIHF1YW50aXphdGlvbiB0YWJsZXMKLTsvLyAKLTsvLyAKLQotICAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgCi0gICAgICAgICAKLSAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX01GTWF0cml4UVBNb2RUYWJsZQotICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfUVBEaXZJbnRyYVRhYmxlCi0gICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9RUERpdlBsdXNPbmVUYWJsZSAgCi0gICAgICAgICAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gVGhpcyB0YWJsZSBjb250YWlucyBhcm1WQ000UDEwX01GTWF0cml4IFtpUVAgJSA2XVswXSBlbnRpcmVzLAotOy8vIGZvciB2YWx1ZXMgb2YgaVFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4gCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfTUZNYXRyaXhRUE1vZFRhYmxlCi0gICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgotICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKLSAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCi0gICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgotICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKLSAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCi0gICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgotICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKLSAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCi0gICAgICAgICAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFRoaXMgdGFibGUgY29udGFpbnMgQVJNX000UDEwX1FfT0ZGU0VUICsgMSArIChpUVAgLyA2KSB2YWx1ZXMsCi07Ly8gZm9yIHZhbHVlcyBvZiBpUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLiAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfUVBEaXZQbHVzT25lVGFibGUKLSAgICAgICAgIERDQiAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2Ci0gICAgICAgICBEQ0IgMTcsIDE3LCAxNywgMTcsIDE3LCAxNwotICAgICAgICAgRENCIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgKLSAgICAgICAgIERDQiAxOSwgMTksIDE5LCAxOSwgMTksIDE5Ci0gICAgICAgICBEQ0IgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMAotICAgICAgICAgRENCIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEKLSAgICAgICAgIERDQiAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyCi0gICAgICAgICBEQ0IgMjMsIDIzLCAyMywgMjMsIDIzLCAyMwotICAgICAgICAgRENCIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gVGhpcyB0YWJsZSBjb250YWlucyAoMSA8PCBRYml0c1BsdXNPbmUpIC8gMyBWYWx1ZXMgKEludHJhIGNhc2UpICwKLTsvLyBmb3IgdmFsdWVzIG9mIGlRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgCi0gICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfUVBEaXZJbnRyYVRhYmxlLCAyCi0gICAgICAgICBEQ0QgMjE4NDUsIDIxODQ1LCAyMTg0NSwgMjE4NDUsIDIxODQ1LCAyMTg0NQotICAgICAgICAgRENEIDQzNjkwLCA0MzY5MCwgNDM2OTAsIDQzNjkwLCA0MzY5MCwgNDM2OTAKLSAgICAgICAgIERDRCA4NzM4MSwgODczODEsIDg3MzgxLCA4NzM4MSwgODczODEsIDg3MzgxCi0gICAgICAgICBEQ0QgMTc0NzYyLCAxNzQ3NjIsIDE3NDc2MiwgMTc0NzYyLCAxNzQ3NjIsIDE3NDc2MgotICAgICAgICAgRENEIDM0OTUyNSwgMzQ5NTI1LCAzNDk1MjUsIDM0OTUyNSwgMzQ5NTI1LCAzNDk1MjUKLSAgICAgICAgIERDRCA2OTkwNTAsIDY5OTA1MCwgNjk5MDUwLCA2OTkwNTAsIDY5OTA1MCwgNjk5MDUwCi0gICAgICAgICBEQ0QgMTM5ODEwMSwgMTM5ODEwMSwgMTM5ODEwMSwgMTM5ODEwMSwgMTM5ODEwMSwgMTM5ODEwMQotICAgICAgICAgRENEIDI3OTYyMDIsIDI3OTYyMDIsIDI3OTYyMDIsIDI3OTYyMDIsIDI3OTYyMDIsIDI3OTYyMDIKLSAgICAgICAgIERDRCA1NTkyNDA1LCA1NTkyNDA1LCA1NTkyNDA1LCA1NTkyNDA1LCA1NTkyNDA1LCA1NTkyNDA1ICAgICAgICAgICAgICAgIAotICAgICAgICAgCi0gICAgICAgICAKLSAgICAgICAgIEVORAotICAgICAgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDRfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUzNzJlMS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDRfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsNDIxICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi07Ly8gRGVzY3JpcHRpb246Ci07Ly8gVHJhbnNmb3JtIFJlc2lkdWFsIDR4NCBDb2VmZmljaWVudHMKLTsvLyAKLTsvLyAKLQotICAgICAgICAKLTsvLyBJbmNsdWRlIHN0YW5kYXJkIGhlYWRlcnMKLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotICAgICAgICAKLTsvLyBJbXBvcnQgc3ltYm9scyByZXF1aXJlZCBmcm9tIG90aGVyIGZpbGVzCi07Ly8gKEZvciBleGFtcGxlIHRhYmxlcykKLSAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLTsvLyBTZXQgZGVidWdnaW5nIGxldmVsICAgICAgICAKLTsvL0RFQlVHX09OICAgIFNFVEwge1RSVUV9Ci0KLQotCi07Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCi0gICAgCi0gICAgSUYgIEFSTTExMzZKUyAKLSAgICAKLTsvL0lucHV0IFJlZ2lzdGVycwotcERzdCAgICAgICAgICAgICAgICBSTiAgMAotcFNyYyAgICAgICAgICAgICAgICBSTiAgMQotCi07Ly9PdXRwdXQgUmVnaXN0ZXJzCi0KLQotOy8vTG9jYWwgU2NyYXRjaCBSZWdpc3RlcnMKLQotOy8vIFBhY2tlZCBJbnB1dCBwaXhlbHMKLWluMDAgICAgICAgICAgICAgICAgUk4gIDIgICAgICAgICAgICAgICAgICAgOy8vIFNyY1swXSAmIFNyY1sxXSAKLWluMDIgICAgICAgICAgICAgICAgUk4gIDMgICAgICAgICAgICAgICAgICAgOy8vIFNyY1syXSAmIFNyY1szXQotaW4xMCAgICAgICAgICAgICAgICBSTiAgNCAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzRdICYgU3JjWzVdCi1pbjEyICAgICAgICAgICAgICAgIFJOICA1ICAgICAgICAgICAgICAgICAgIDsvLyBTcmNbNl0gJiBTcmNbN10KLWluMjAgICAgICAgICAgICAgICAgUk4gIDYgICAgICAgICAgICAgICAgICAgOy8vIFNyY1s4XSAmIFNyY1s5XQotaW4yMiAgICAgICAgICAgICAgICBSTiAgNyAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzEwXSAmIFNyY1sxMV0KLWluMzAgICAgICAgICAgICAgICAgUk4gIDggICAgICAgICAgICAgICAgICAgOy8vIFNyY1sxMl0gJiBTcmNbMTNdCi1pbjMyICAgICAgICAgICAgICAgIFJOICA5ICAgICAgICAgICAgICAgICAgIDsvLyBTcmNbMTRdICYgU3JjWzE1XQotCi07Ly8gVHJhbnNwb3NlIGZvciBSb3cgb3BlcmF0aW9ucyAoUm93cyB0byBjb2xzKQotdHJSb3cwMCAgICAgICAgICAgICBSTiAgMgotdHJSb3cxMCAgICAgICAgICAgICBSTiAgMTAKLXRyUm93MDIgICAgICAgICAgICAgUk4gIDMKLXRyUm93MTIgICAgICAgICAgICAgUk4gIDUKLXRyUm93MjAgICAgICAgICAgICAgUk4gIDExCi10clJvdzMwICAgICAgICAgICAgIFJOICAxMgotdHJSb3czMiAgICAgICAgICAgICBSTiAgMTQKLXRyUm93MjIgICAgICAgICAgICAgUk4gIDcKLQotOy8vIEludGVybWVkaWF0ZSBjYWxjdWxhdGlvbnMKLWUwICAgICAgICAgICAgICAgICAgUk4gIDQgICAgICAgICAgICAgICAgICAgCi1lMSAgICAgICAgICAgICAgICAgIFJOICA2Ci1lMiAgICAgICAgICAgICAgICAgIFJOICA4Ci1lMyAgICAgICAgICAgICAgICAgIFJOICA5Ci1jb25zdFplcm8gICAgICAgICAgIFJOICAxCi0KLTsvLyBSb3cgb3BlcmF0ZWQgcGl4ZWxzCi1yb3dPcDAwICAgICAgICAgICAgIFJOICAyCi1yb3dPcDEwICAgICAgICAgICAgIFJOICAxMAotcm93T3AyMCAgICAgICAgICAgICBSTiAgMTEKLXJvd09wMzAgICAgICAgICAgICAgUk4gIDEyCi1yb3dPcDAyICAgICAgICAgICAgIFJOICAzCi1yb3dPcDEyICAgICAgICAgICAgIFJOICA1Ci1yb3dPcDIyICAgICAgICAgICAgIFJOICA3Ci1yb3dPcDMyICAgICAgICAgICAgIFJOICAxNAotCi07Ly8gVHJhbnNwb3NlIGZvciBjb2x1bG1uIG9wZXJhdGlvbnMKLXRyQ29sMDAgICAgICAgICAgICAgUk4gIDIgICAgICAgICAgICAgICAgICAgCi10ckNvbDAyICAgICAgICAgICAgIFJOICAzICAgICAgICAgICAgICAgICAgIAotdHJDb2wxMCAgICAgICAgICAgICBSTiAgNCAgICAgICAgICAgICAgICAgICAKLXRyQ29sMTIgICAgICAgICAgICAgUk4gIDUgICAgICAgICAgICAgICAgICAgCi10ckNvbDIwICAgICAgICAgICAgIFJOICA2ICAgICAgICAgICAgICAgICAgIAotdHJDb2wyMiAgICAgICAgICAgICBSTiAgNyAgICAgICAgICAgICAgICAgICAKLXRyQ29sMzAgICAgICAgICAgICAgUk4gIDggICAgICAgICAgICAgICAgICAgCi10ckNvbDMyICAgICAgICAgICAgIFJOICA5ICAKLQotOy8vIEludGVybWVkaWF0ZSBjYWxjdWxhdGlvbnMKLWcwICAgICAgICAgICAgICAgICAgUk4gIDEwCi1nMSAgICAgICAgICAgICAgICAgIFJOICAxMQotZzIgICAgICAgICAgICAgICAgICBSTiAgMTIKLWczICAgICAgICAgICAgICAgICAgUk4gIDE0ICAgCi0KLTsvLyBDb2xvdW1uIG9wZXJhdGVkIHBpeGVscwotY29sT3AwMCAgICAgICAgICAgICBSTiAgMiAgICAgICAgICAgICAgICAgICAKLWNvbE9wMDIgICAgICAgICAgICAgUk4gIDMgICAgICAgICAgICAgICAgICAgCi1jb2xPcDEwICAgICAgICAgICAgIFJOICA0ICAgICAgICAgICAgICAgICAgIAotY29sT3AxMiAgICAgICAgICAgICBSTiAgNSAgICAgICAgICAgICAgICAgICAKLWNvbE9wMjAgICAgICAgICAgICAgUk4gIDYgICAgICAgICAgICAgICAgICAgCi1jb2xPcDIyICAgICAgICAgICAgIFJOICA3ICAgICAgICAgICAgICAgICAgIAotY29sT3AzMCAgICAgICAgICAgICBSTiAgOCAgICAgICAgICAgICAgICAgICAKLWNvbE9wMzIgICAgICAgICAgICAgUk4gIDkgIAotCi0KLXRlbXAxICAgICAgICAgICAgICAgUk4gIDEwICAgICAgICAgICAgICAgICAgOy8vIFRlbXBvcmFyeSBzY3JhdGNoIHZhcmFpYmxlcwotY29uc3QxICAgICAgICAgICAgICBSTiAgMTEgICAgICAKLWNvbnN0MiAgICAgICAgICAgICAgUk4gIDEyCi1tYXNrICAgICAgICAgICAgICAgIFJOICAxNAotCi07Ly8gT3V0cHV0IHBpeGVscwotb3V0MDAgICAgICAgICAgICAgICBSTiAgMiAgICAgICAgICAgICAgICAgICAKLW91dDAyICAgICAgICAgICAgICAgUk4gIDMgICAgICAgICAgICAgICAgICAgCi1vdXQxMCAgICAgICAgICAgICAgIFJOICA0ICAgICAgICAgICAgICAgICAgIAotb3V0MTIgICAgICAgICAgICAgICBSTiAgNSAgICAgICAgICAgICAgICAgICAKLW91dDIwICAgICAgICAgICAgICAgUk4gIDYgICAgICAgICAgICAgICAgICAgCi1vdXQyMiAgICAgICAgICAgICAgIFJOICA3ICAgICAgICAgICAgICAgICAgIAotb3V0MzAgICAgICAgICAgICAgICBSTiAgOCAgICAgICAgICAgICAgICAgICAKLW91dDMyICAgICAgICAgICAgICAgUk4gIDkgIAotICAgICAgCi0gICAgICAgCi0gICAgICAgCi0gICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSByZXF1aXJlZCBieSB0aGUgZnVuY3Rpb24KLSAgICAgICAgCi0KLSAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NCxyMTEKLSAgICAgICAgCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgOy8vIFRoZSBzdHJhdGVneSB1c2VkIGluIGltcGxlbWVudGluZyB0aGUgdHJhbnNmb3JtIGlzIGFzIGZvbGxvd3M6KgotICAgICAgICA7Ly8gTG9hZCB0aGUgNHg0IGJsb2NrIGludG8gOCByZWdpc3RlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAKLSAgICAgICAgOy8vIFRyYW5zcG9zZSB0aGUgNHg0IG1hdHJpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgCi0gICAgICAgIDsvLyBQZXJmb3JtIHRoZSByb3cgb3BlcmF0aW9ucyAob24gY29sdW1ucykgdXNpbmcgU0lNRCAgICAgICAgICAgICogIAotICAgICAgICA7Ly8gVHJhbnNwb3NlIHRoZSA0eDQgcmVzdWx0IG1hdHJpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAKLSAgICAgICAgOy8vIFBlcmZvcm0gdGhlIGNvbG91bW4gb3BlcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAgICA7Ly8gU3RvcmUgdGhlIDR4NCBibG9jayBhdCBvbmUgZ28gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgICAgIDsvLyBMb2FkIGFsbCB0aGUgNHg0IHBpeGVscwotICAgICAgICAKLSAgICAgICAgTERNSUEgICBwU3JjLHtpbjAwLGluMDIsaW4xMCxpbjEyLGluMjAsaW4yMixpbjMwLGluMzJ9Ci0gICAgICAgIAotICAgICAgICBNT1YgICAgICAgY29uc3RaZXJvLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBVc2VkIHRvIHJpZ2h0IHNoaWZ0IGJ5IDEgCi0gICAgICAgIDtMRFIgICAgICAgY29uc3RaZXJvLD0weDAwMDAwMDAwICAKLSAgICAgICAgCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFRyYW5zcG9zZSB0aGUgbWF0cml4IGlub3JkZXIgdG8gcGVyZm9ybSByb3cgb3BzIGFzIGNvbG91bW4gb3BzCi0gICAgICAgIDsvLyBJbnB1dDogICBpbltdW10gPSBvcmlnaW5hbCBtYXRyaXgKLSAgICAgICAgOy8vIE91dHB1dDogIHRyUm93W11bXT0gdHJhbnNwb3NlZCBtYXRyaXgKLSAgICAgICAgOy8vIFN0ZXAxOiBPYnRhaW4gdGhlIExMIHBhcnQgb2YgdGhlIHRyYW5zcG9zZWQgbWF0cml4Ci0gICAgICAgIDsvLyBTdGVwMjogT2J0YWluIHRoZSBITCBwYXJ0Ci0gICAgICAgIDsvLyBzdGVwMzogT2J0YWluIHRoZSBMSCBwYXJ0Ci0gICAgICAgIDsvLyBTdGVwNDogT2J0YWluIHRoZSBISCBwYXJ0Ci0gICAgICAgIDsvLwotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgCi0gICAgICAgIDsvLyBMTCAyeDIgdHJhbnNwb3NlZCBtYXRyaXggCi0gICAgICAgIDsvLyAgIGQwIGQxIC0gLQotICAgICAgICA7Ly8gICBkNCBkNSAtIC0KLSAgICAgICAgOy8vICAgLSAgLSAgLSAtCi0gICAgICAgIDsvLyAgIC0gIC0gIC0gLQotICAgICAgICAKLSAgICAgICAgUEtIVEIgICB0clJvdzEwLGluMTAsaW4wMCxBU1IgIzE2ICAgICAgICAgICAgICAgOy8vIFs1IDRdID0gW2Y1OmYxXSAgICAKLSAgICAgICAgUEtIQlQgICB0clJvdzAwLGluMDAsaW4xMCxMU0wgIzE2ICAgICAgICAgICAgICAgOy8vIFsxIDBdID0gW2Y0OmYwXSAgCi0gICAgICAgIAotICAgICAgICA7Ly8gSEwgMngyIHRyYW5zcG9zZWQgbWF0cml4ICAKLSAgICAgICAgOy8vICAgIC0gICAtICAgLSAtCi0gICAgICAgIDsvLyAgICAtICAgLSAgIC0gLQotICAgICAgICA7Ly8gICAgZDggIGQ5ICAtIC0KLSAgICAgICAgOy8vICAgZDEyIGQxMyAgLSAtCi0gICAgICAgIAotICAgICAgICAgCi0gICAgICAgICBQS0hUQiAgIHRyUm93MzAsaW4xMixpbjAyLEFTUiAjMTYgICAgICAgICAgICAgIDsvLyBbMTMgMTJdID0gWzcgM10KLSAgICAgICAgIFBLSEJUICAgdHJSb3cyMCxpbjAyLGluMTIsTFNMICMxNiAgICAgICAgICAgICAgOy8vIFs5IDhdID0gWzYgMl0gCi0gICAgICAgIAotICAgICAgICA7Ly8gTEggMngyIHRyYW5zcG9zZWQgbWF0cml4IAotICAgICAgICA7Ly8gICAtIC0gZDIgZDMgCi0gICAgICAgIDsvLyAgIC0gLSBkNiBkNyAKLSAgICAgICAgOy8vICAgLSAtIC0gIC0KLSAgICAgICAgOy8vICAgLSAtIC0gIC0KLSAgICAgICAgCi0gICAgICAgIFBLSEJUICAgdHJSb3cwMixpbjIwLGluMzAsTFNMICMxNiAgICAgICAgICAgICAgIDsvLyBbMyAyXSA9IFtmMTI6ZjhdICAKLSAgICAgICAgUEtIVEIgICB0clJvdzEyLGluMzAsaW4yMCxBU1IgIzE2ICAgICAgICAgICAgICAgOy8vIFs3IDZdID0gW2YxMzpmOV0gCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAKLSAgICAgICAgOy8vIEhIIDJ4MiB0cmFuc3Bvc2VkIG1hdHJpeCAgCi0gICAgICAgIDsvLyAgICAtIC0gICAtICAgLQotICAgICAgICA7Ly8gICAgLSAtICAgLSAgIC0KLSAgICAgICAgOy8vICAgIC0gLSAgZDEwIGQxMQotICAgICAgICA7Ly8gICAgLSAtICBkMTQgZDE1Ci0gICAgICAgIAotICAgICAgICBQS0hUQiAgIHRyUm93MzIsaW4zMixpbjIyLEFTUiAjMTYgICAgICAgICAgICAgICA7Ly8gWzE1IDE0XSA9IFsxNSAxMV0KLSAgICAgICAgUEtIQlQgICB0clJvdzIyLGluMjIsaW4zMixMU0wgIzE2ICAgICAgICAgICAgICAgOy8vIFsxMSAxMF0gPSBbMTQgMTBdCi0gICAgICAgCi0gICAgICAgIAotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAgICAgICAgOy8vIFJvdyBPcGVyYXRpb25zIChQZXJmb3JtZWQgb24gY29sdW1ucykKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIFNJTUQgb3BlcmF0aW9ucyBvbiBmaXJzdCB0d28gY29sdW1ucyh0d28gcm93cyBvZiB0aGUgb3JpZ2luYWwgbWF0cml4KQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFNBREQxNiAgICAgIGUwLCB0clJvdzAwLHRyUm93MjAgICAgICAgICAgICAgICAgICAgOy8vICBlMCA9IGQwICsgZDIgCi0gICAgICAgIFNTVUIxNiAgICBlMSwgdHJSb3cwMCx0clJvdzIwICAgICAgICAgICAgICAgICAgIDsvLyAgZTEgPSBkMCAtIGQyICAKLSAgICAgICAgU0hBREQxNiAgIGUyLCB0clJvdzEwLGNvbnN0WmVybyAgICAgICAgICAgICAgICAgOy8vIChmMT4+MSkgY29uc3RaZXJvIGlzIGEgcmVnaXN0ZXIgaG9sZGluZyAwCi0gICAgICAgIFNIQUREMTYgICBlMywgdHJSb3czMCxjb25zdFplcm8gICAgICAgICAgICAgICAgIDsvLyAgYXZvaWQgcGlwZWxpbmUgc3RhbGxzIGZvciBlMiBhbmQgZTMKLSAgICAgICAgU1NVQjE2ICAgIGUyLCBlMiwgdHJSb3czMCAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMiA9IChkMT4+MSkgLSBkMyAgCi0gICAgICAgIFNBREQxNiAgICBlMywgZTMsIHRyUm93MTAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTMgPSBkMSArIChkMz4+MSkgIAotICAgICAgICBTQUREMTYgICAgcm93T3AwMCwgZTAsIGUzICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYwID0gZTAgKyBlMyAgCi0gICAgICAgIFNBREQxNiAgICByb3dPcDEwLCBlMSwgZTIgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjEgPSBlMSArIGUyICAKLSAgICAgICAgU1NVQjE2ICAgIHJvd09wMjAsIGUxLCBlMiAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMiA9IGUxIC0gZTIgIAotICAgICAgICBTU1VCMTYgICAgcm93T3AzMCwgZTAsIGUzICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYzID0gZTAgLSBlMwotICAgICAgICAKLSAgICAgICAgOy8vIFNJTUQgb3BlcmF0aW9ucyBvbiBuZXh0IHR3byBjb2x1bW5zKG5leHQgdHdvIHJvd3Mgb2YgdGhlIG9yaWdpbmFsIG1hdHJpeCkKLSAgICAgICAgCi0gICAgICAgIFNBREQxNiAgICAgIGUwLCB0clJvdzAyLHRyUm93MjIKLSAgICAgICAgU1NVQjE2ICAgIGUxLCB0clJvdzAyLHRyUm93MjIKLSAgICAgICAgU0hBREQxNiAgIGUyLCB0clJvdzEyLGNvbnN0WmVybyAgICAgICAgICAgICAgICAgOy8vKGYxPj4xKSBjb25zdFplcm8gaXMgYSByZWdpc3RlciBob2xkaW5nIDAKLSAgICAgICAgU0hBREQxNiAgIGUzLCB0clJvdzMyLGNvbnN0WmVybwotICAgICAgICBTU1VCMTYgICAgZTIsIGUyLCB0clJvdzMyCi0gICAgICAgIFNBREQxNiAgICBlMywgZTMsIHRyUm93MTIKLSAgICAgICAgU0FERDE2ICAgIHJvd09wMDIsIGUwLCBlMwotICAgICAgICBTQUREMTYgICAgcm93T3AxMiwgZTEsIGUyCi0gICAgICAgIFNTVUIxNiAgICByb3dPcDIyLCBlMSwgZTIKLSAgICAgICAgU1NVQjE2ICAgIHJvd09wMzIsIGUwLCBlMwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICA7Ly8gVHJhbnNwb3NlIHRoZSByZXN1bHRhbnQgbWF0cml4Ci0gICAgICAgIDsvLyBJbnB1dDogIHJvd09wW11bXQotICAgICAgICA7Ly8gT3V0cHV0OiB0ckNvbFtdW10gCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAKLSAgICAgICAgOy8vIExMIDJ4MiB0cmFuc3Bvc2VkIG1hdHJpeCAKLSAgICAgICAgOy8vICAgZDAgZDEgLSAtCi0gICAgICAgIDsvLyAgIGQ0IGQ1IC0gLQotICAgICAgICA7Ly8gICAtICAtICAtIC0KLSAgICAgICAgOy8vICAgLSAgLSAgLSAtCi0gICAgICAgIAotICAgICAgICBQS0hUQiAgIHRyQ29sMTAscm93T3AxMCxyb3dPcDAwLEFTUiAjMTYgICAgICAgICAgIDsvLyBbNSA0XSA9IFtmNTpmMV0KLSAgICAgICAgUEtIQlQgICB0ckNvbDAwLHJvd09wMDAscm93T3AxMCxMU0wgIzE2ICAgICAgICAgICA7Ly8gWzEgMF0gPSBbZjQ6ZjBdICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBITCAyeDIgdHJhbnNwb3NlZCBtYXRyaXggIAotICAgICAgICA7Ly8gICAgLSAgIC0gICAtIC0KLSAgICAgICAgOy8vICAgIC0gICAtICAgLSAtCi0gICAgICAgIDsvLyAgICBkOCAgZDkgIC0gLQotICAgICAgICA7Ly8gICBkMTIgZDEzICAtIC0KLSAgICAgICAgCi0gICAgICAgICAKLSAgICAgICAgIFBLSFRCICAgdHJDb2wzMCxyb3dPcDEyLHJvd09wMDIsQVNSICMxNiAgICAgICAgICA7Ly8gWzEzIDEyXSA9IFs3IDNdCi0gICAgICAgICBQS0hCVCAgIHRyQ29sMjAscm93T3AwMixyb3dPcDEyLExTTCAjMTYgICAgICAgICAgOy8vIFs5IDhdID0gWzYgMl0gCi0gICAgICAgIAotICAgICAgICA7Ly8gTEggMngyIHRyYW5zcG9zZWQgbWF0cml4IAotICAgICAgICA7Ly8gICAtIC0gZDIgZDMgCi0gICAgICAgIDsvLyAgIC0gLSBkNiBkNyAKLSAgICAgICAgOy8vICAgLSAtIC0gIC0KLSAgICAgICAgOy8vICAgLSAtIC0gIC0KLSAgICAgICAgCi0gICAgICAgIFBLSEJUICAgdHJDb2wwMixyb3dPcDIwLHJvd09wMzAsTFNMICMxNiAgICAgICAgICAgOy8vIFszIDJdID0gW2YxMjpmOF0gIAotICAgICAgICBQS0hUQiAgIHRyQ29sMTIscm93T3AzMCxyb3dPcDIwLEFTUiAjMTYgICAgICAgICAgIDsvLyBbNyA2XSA9IFtmMTM6ZjldIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgCi0gICAgICAgIDsvLyBISCAyeDIgdHJhbnNwb3NlZCBtYXRyaXggIAotICAgICAgICA7Ly8gICAgLSAtICAgLSAgIC0KLSAgICAgICAgOy8vICAgIC0gLSAgIC0gICAtCi0gICAgICAgIDsvLyAgICAtIC0gIGQxMCBkMTEKLSAgICAgICAgOy8vICAgIC0gLSAgZDE0IGQxNQotICAgICAgICAKLSAgICAgICAgUEtIVEIgICB0ckNvbDMyLHJvd09wMzIscm93T3AyMixBU1IgIzE2ICAgICAgICAgICAgOy8vIFsxNSAxNF0gPSBbMTUgMTFdCi0gICAgICAgIFBLSEJUICAgdHJDb2wyMixyb3dPcDIyLHJvd09wMzIsTFNMICMxNiAgICAgICAgICAgIDsvLyBbMTEgMTBdID0gWzE0IDEwXQotICAgICAgIAotICAgICAgICAKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gICAgICAgIDsvLyBDb2xvdW1uIE9wZXJhdGlvbnMgCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBTSU1EIG9wZXJhdGlvbnMgb24gZmlyc3QgdHdvIGNvbHVtbnMKLSAgICAgICAgCi0gICAgICAgICAgCi0gICAgICAgIFNBREQxNiAgICAgIGcwLCB0ckNvbDAwLHRyQ29sMjAKLSAgICAgICAgU1NVQjE2ICAgIGcxLCB0ckNvbDAwLHRyQ29sMjAKLSAgICAgICAgU0hBREQxNiAgIGcyLCB0ckNvbDEwLGNvbnN0WmVybyAgICAgICAgICAgICAgICAgICAgIDsvLyAoZjE+PjEpIGNvbnN0WmVybyBpcyBhIHJlZ2lzdGVyIGhvbGRpbmcgMAotICAgICAgICBTSEFERDE2ICAgZzMsIHRyQ29sMzAsY29uc3RaZXJvCi0gICAgICAgIFNTVUIxNiAgICBnMiwgZzIsIHRyQ29sMzAKLSAgICAgICAgU0FERDE2ICAgIGczLCBnMywgdHJDb2wxMAotICAgICAgICBTQUREMTYgICAgY29sT3AwMCwgZzAsIGczCi0gICAgICAgIFNBREQxNiAgICBjb2xPcDEwLCBnMSwgZzIKLSAgICAgICAgU1NVQjE2ICAgIGNvbE9wMjAsIGcxLCBnMgotICAgICAgICBTU1VCMTYgICAgY29sT3AzMCwgZzAsIGczCi0gICAgICAgIAotICAgICAgICA7Ly8gU0lNRCBvcGVyYXRpb25zIG9uIG5leHQgdHdvIGNvbHVtbnMKLSAgICAgICAgCi0gICAgICAgIFNBREQxNiAgICAgIGcwLCB0ckNvbDAyLHRyQ29sMjIKLSAgICAgICAgU1NVQjE2ICAgIGcxLCB0ckNvbDAyLHRyQ29sMjIKLSAgICAgICAgU0hBREQxNiAgIGcyLCB0ckNvbDEyLGNvbnN0WmVybyAgICAgICAgICAgICAgICAgICAgIDsvLyAoZjE+PjEpIGNvbnN0WmVybyBpcyBhIHJlZ2lzdGVyIGhvbGRpbmcgMAotICAgICAgICBTSEFERDE2ICAgZzMsIHRyQ29sMzIsY29uc3RaZXJvCi0gICAgICAgIFNTVUIxNiAgICBnMiwgZzIsIHRyQ29sMzIKLSAgICAgICAgU0FERDE2ICAgIGczLCBnMywgdHJDb2wxMgotICAgICAgICBTQUREMTYgICAgY29sT3AwMiwgZzAsIGczCi0gICAgICAgIFNBREQxNiAgICBjb2xPcDEyLCBnMSwgZzIKLSAgICAgICAgU1NVQjE2ICAgIGNvbE9wMjIsIGcxLCBnMgotICAgICAgICBTU1VCMTYgICAgY29sT3AzMiwgZzAsIGczCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgIAotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIDsvLyBDYWxjdWxhdGUgZmluYWwgdmFsdWUgKGNvbE9wW2ldW2pdICsgMzIpPj42Ci0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgCi0gICAgICAgIDsvLyBjb25zdDE6IFNlcnZlcyBkdWFsIHB1cnBvc2UgCi0gICAgICAgIDsvLyAoMSkgQWRkICMzMiB0byBib3RoIHRoZSBsb3dlciBhbmQgaGlnaGVyIDE2Yml0cyBvZiB0aGUgU0lNRCByZXN1bHQgCi0gICAgICAgIDsvLyAoMikgQ29udmVydCB0aGUgbG93ZXIgMTYgYml0IHZhbHVlIHRvIGFuIHVuc2lnbmVkIG51bWJlciAoQWRkIDMyNzY4KQotICAgICAgICAKLSAgICAgICAgTERSICAgICBjb25zdDEsID0weDAwMjA4MDIwICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgTERSICAgICBtYXNrLCA9MHhmZmZmMDNmZiAgICAgICAgICAgICAgICAgICAgICAgOy8vIFVzZWQgdG8gbWFzayB0aGUgZG93biBzaGlmdGVkIDYgYml0cyAgCi0gICAgICAgIAotICAgICAgICA7Ly8gY29uc3QyKCM1MTIpOiB1c2VkIHRvIGNvbnZlcnQgdGhlIGxvd2VyIDE2Yml0IG51bWJlciBiYWNrIHRvIHNpZ25lZCB2YWx1ZSAKLSAgICAgIAotICAgICAgICBNT1YgICAgIGNvbnN0MiwjMHgyMDAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY29uc3QyID0gMl45Ci0gICAgICAgIAotICAgICAgICA7Ly8gRmlyc3QgUm93IAotICAgICAgICAKLSAgICAgICAgU0FERDE2ICAgIGNvbE9wMDAsIGNvbE9wMDAsIGNvbnN0MQotICAgICAgICBTQUREMTYgICAgY29sT3AwMiwgY29sT3AwMiwgY29uc3QxCi0gICAgICAgIEFORCAgICAgY29sT3AwMCwgbWFzaywgY29sT3AwMCwgQVNSICM2Ci0gICAgICAgIEFORCAgICAgY29sT3AwMiwgbWFzaywgY29sT3AwMiwgQVNSICM2Ci0gICAgICAgIFNTVUIxNiAgb3V0MDAsY29sT3AwMCxjb25zdDIKLSAgICAgICAgU1NVQjE2ICBvdXQwMixjb2xPcDAyLGNvbnN0MiAgICAKLSAgICAgICAgCi0KLSAgICAgICAgOy8vIFNlY29uZCBSb3cKLSAgICAgICAgCi0gICAgICAgIFNBREQxNiAgICBjb2xPcDEwLCBjb2xPcDEwLCBjb25zdDEKLSAgICAgICAgU0FERDE2ICAgIGNvbE9wMTIsIGNvbE9wMTIsIGNvbnN0MQotICAgICAgICBBTkQgICAgIGNvbE9wMTAsIG1hc2ssIGNvbE9wMTAsIEFTUiAjNgotICAgICAgICBBTkQgICAgIGNvbE9wMTIsIG1hc2ssIGNvbE9wMTIsIEFTUiAjNgotICAgICAgICBTU1VCMTYgIG91dDEwLGNvbE9wMTAsY29uc3QyCi0gICAgICAgIFNTVUIxNiAgb3V0MTIsY29sT3AxMixjb25zdDIgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIFRoaXJkIFJvdwotICAgICAgICAKLSAgICAgICAgU0FERDE2ICAgIGNvbE9wMjAsIGNvbE9wMjAsIGNvbnN0MQotICAgICAgICBTQUREMTYgICAgY29sT3AyMiwgY29sT3AyMiwgY29uc3QxCi0gICAgICAgIEFORCAgICAgY29sT3AyMCwgbWFzaywgY29sT3AyMCwgQVNSICM2Ci0gICAgICAgIEFORCAgICAgY29sT3AyMiwgbWFzaywgY29sT3AyMiwgQVNSICM2Ci0gICAgICAgIFNTVUIxNiAgb3V0MjAsY29sT3AyMCxjb25zdDIKLSAgICAgICAgU1NVQjE2ICBvdXQyMixjb2xPcDIyLGNvbnN0MgotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBGb3VydGggUm93ICAgCi0gICAgICAgIAotICAgICAgICBTQUREMTYgICAgY29sT3AzMCwgY29sT3AzMCwgY29uc3QxCi0gICAgICAgIFNBREQxNiAgICBjb2xPcDMyLCBjb2xPcDMyLCBjb25zdDEKLSAgICAgICAgQU5EICAgICBjb2xPcDMwLCBtYXNrLCBjb2xPcDMwLCBBU1IgIzYKLSAgICAgICAgQU5EICAgICBjb2xPcDMyLCBtYXNrLCBjb2xPcDMyLCBBU1IgIzYKLSAgICAgICAgU1NVQjE2ICBvdXQzMCxjb2xPcDMwLGNvbnN0MgotICAgICAgICBTU1VCMTYgIG91dDMyLGNvbE9wMzIsY29uc3QyCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgOy8vIFN0b3JlIGFsbCB0aGUgNHg0IHBpeGVscwotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIAotICAgICAgICBTVE1JQSAgIHBEc3Qse291dDAwLG91dDAyLG91dDEwLG91dDEyLG91dDIwLG91dDIyLG91dDMwLG91dDMyfQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAKLSAgICAgICAgOy8vIFNldCByZXR1cm4gdmFsdWUKLSAgICAgICAgCi1FbmQgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgCi0gICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiB0YWlsCi0gICAgICAgIE1fRU5ECi0gICAgICAgIAotICAgIEVORElGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9BUk0xMTM2SlMgICAgCi0gICAgCi0gICAgCi0KLQotCi0KLQotOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQotICAgIAotICAgICAgICAgICAgCi0gICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0X3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAyYjRmMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0X3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi07Ly8gRGVmaW5lIHRoZSBwcm9jZXNzb3IgdmFyaWFudHMgc3VwcG9ydGVkIGJ5IHRoaXMgZmlsZQotCi0gICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0gICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgSUYgQVJNMTEzNkpTCi0gICAgICAgIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBJbnB1dCBBcmd1bWVudHMgYW5kIHRoZWlyIHNjb3BlL3VzYWdlCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcHBTcmMgICAgICAgICAgIFJOIDAgICAgOy8vIFBlcnNpc3RlbnQgdmFyaWFibGUKLXBEc3QgICAgICAgICAgICBSTiAxICAgIDsvLyBQZXJzaXN0ZW50IHZhcmlhYmxlCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gVmFyaWFibGVzIGFuZCB0aGVpciBzY29wZS91c2FnZQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBTcmMgICAgICAgICAgICBSTiAyICAgIDsvLyBQZXJzaXN0ZW50IHZhcmlhYmxlcwotRmxhZyAgICAgICAgICAgIFJOIDMgICAgCi1WYWx1ZSAgICAgICAgICAgUk4gNCAgICAKLVZhbHVlMiAgICAgICAgICBSTiA1ICAgIAotc3RyT2Zmc2V0ICAgICAgIFJOIDYgICAgCi1jc3RPZmZzZXQgICAgICAgUk4gNyAgICAKLQotICAgICAgICAKLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0LCByNwotICAgICAgICAKLSAgICAgICAgTERSICAgICBwU3JjLCBbcHBTcmNdICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBwU3JjCi0gICAgICAgIE1PViAgICAgY3N0T2Zmc2V0LCAjMzEgICAgICAgICAgICAgICAgICAgICAgOy8vIFRvIGJlIHVzZWQgaW4gdGhlIGxvb3AsIHRvIGNvbXB1dGUgb2Zmc2V0Ci0gICAgICAgIAotICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICA7IEZpcnN0bHksIGZpbGwgYWxsIHRoZSBjb2VmZmljaWVudCB2YWx1ZXMgb24gdGhlIDxwRHN0PiBidWZmZXIgYnkgemVybwotICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgVmFsdWUsICAjMCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSW5pdGlhbGl6ZSB0aGUgemVybyB2YWx1ZQotICAgICAgICBNT1YgICAgICBWYWx1ZTIsICMwICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJbml0aWFsaXplIHRoZSB6ZXJvIHZhbHVlCi0gICAgICAgIExEUkIgICAgIEZsYWcsICBbcFNyY10sICMxICAgICAgICAgICAgICAgICAgOy8vIFByZWxvYWQgPEZsYWc+IGJlZm9yZSA8dW5wYWNrTG9vcD4KLSAgICAgICAgCi0gICAgICAgIFNUUkQgICAgIFZhbHVlLCBbcERzdCwgIzBdICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMF0gID0gcERzdFsxXSAgPSBwRHN0WzJdICA9IHBEc3RbM10gID0gMAotICAgICAgICBTVFJEICAgICBWYWx1ZSwgW3BEc3QsICM4XSAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzRdICA9IHBEc3RbNV0gID0gcERzdFs2XSAgPSBwRHN0WzddICA9IDAKLSAgICAgICAgU1RSRCAgICAgVmFsdWUsIFtwRHN0LCAjMTZdICAgICAgICAgICAgICAgICA7Ly8gcERzdFs4XSAgPSBwRHN0WzldICA9IHBEc3RbMTBdID0gcERzdFsxMV0gPSAwCi0gICAgICAgIFNUUkQgICAgIFZhbHVlLCBbcERzdCwgIzI0XSAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMTJdID0gcERzdFsxM10gPSBwRHN0WzE0XSA9IHBEc3RbMTVdID0gMAotICAgICAgICAKLSAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICA7Ly8gVGhlIGxvb3AgYmVsb3cgcGFyc2VzIGFuZCB1bnBhY2tzIHRoZSBpbnB1dCBzdHJlYW0uIFRoZSBDLW1vZGVsIGhhcyAKLSAgICAgICAgOy8vIGEgc29tZXdoYXQgY29tcGxpY2F0ZWQgbG9naWMgZm9yIHNpZ24gZXh0ZW5zaW9uLiAgQnV0IGluIHRoZSB2NiB2ZXJzaW9uLAotICAgICAgICA7Ly8gdGhhdCBjYW4gYmUgZWFzaWx5IHRha2VuIGNhcmUgYnkgbG9hZGluZyB0aGUgZGF0YSBmcm9tIDxwU3JjPiBzdHJlYW0gYXMgCi0gICAgICAgIDsvLyBTSUdORUQgYnl0ZS9oYWxmd29yZC4gU28sIGJhc2VkIG9uIHRoZSBmaXJzdCBUU1QgaW5zdHJ1Y3Rpb24sIDgtYml0cyBvciAKLSAgICAgICAgOy8vIDE2LWJpdHMgYXJlIHJlYWQuCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gTmV4dCwgdG8gY29tcHV0ZSB0aGUgb2Zmc2V0LCB3aGVyZSB0aGUgdW5wYWNrZWQgdmFsdWUgbmVlZHMgdG8gYmUgc3RvcmVkLAotICAgICAgICA7Ly8gd2UgbW9kaWZ5IHRoZSBjb21wdXRhdGlvbiB0byBwZXJmb3JtIFsoRmxhZyAmIDE1KSA8IDFdIGFzIFsoRmxhZyA8IDEpICYgMzFdCi0gICAgICAgIDsvLyBUaGlzIHJlc3VsdHMgaW4gYSBzYXZpbmcgb2Ygb25lIGN5Y2xlLgotICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIAotdW5wYWNrTG9vcAotICAgICAgICBUU1QgICAgICBGbGFnLCAgIzB4MTAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ29tcHV0aW5nIChGbGFnICYgMHgxMCkKLSAgICAgICAgTERSU0JORSAgVmFsdWUyLFtwU3JjLCMxXSAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgYnl0ZSB3aXNlIHRvIGF2b2lkIHVuYWxpZ25lZCBhY2Nlc3MgICAKLSAgICAgICAgTERSQk5FICAgVmFsdWUsIFtwU3JjXSwgIzIgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIEFORCAgICAgIHN0ck9mZnNldCwgY3N0T2Zmc2V0LCBGbGFnLCBMU0wgIzEgIDsvLyBzdHJPZmZzZXQgPSAoRmxhZyAmIDE1KSA8IDE7Ci0gICAgICAgIExEUlNCRVEgIFZhbHVlLCBbcFNyY10sICMxICAgICAgICAgICAgICAgICAgIDsvLyBWYWx1ZSA9IChPTVhfVTgpICAqcFNyYysrCi0gICAgICAgIE9SUk5FICAgIFZhbHVlLFZhbHVlLFZhbHVlMiwgTFNMICM4ICAgICAgICAgIDsvLyBWYWx1ZSA9IChPTVhfVTE2KSAqcFNyYysrCi0gICAgICAgIAotICAgICAgICBUU1QgICAgICBGbGFnLCAgIzB4MjAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ29tcHV0aW5nIChGbGFnICYgMHgyMCkgdG8gY2hlY2ssIGlmIHdlJ3JlIGRvbmUKLSAgICAgICAgTERSQkVRICAgRmxhZywgIFtwU3JjXSwgIzEgICAgICAgICAgICAgICAgICAgOy8vIEZsYWcgID0gKE9NWF9VOCkgKnBTcmMrKywgZm9yIG5leHQgaXRlcmF0aW9uCi0gICAgICAgIFNUUkggICAgIFZhbHVlLCBbcERzdCwgc3RyT2Zmc2V0XSAgICAgICAgICAgIDsvLyBTdG9yZSA8VmFsdWU+IGF0IG9mZnNldCA8c3RyT2Zmc2V0PgotICAgICAgICBCRVEgICAgICB1bnBhY2tMb29wICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIHRoZSBsb29wIGJlZ2lubmluZwotICAgICAgICAKLSAgICAgICAgU1RSICAgICAgcFNyYywgW3BwU3JjXSAgICAgICAgICAgICAgICAgICAgICAgOy8vIFVwZGF0ZSB0aGUgYml0c3RyZWFtIHBvaW50ZXIKLSAgICAgICAgTV9FTkQKLSAgICAKLSAgICBFTkRJRgotICAgIAotICAgIAotICAgIAotICAgIEVORAotICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGFkZWE4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogSC4yNjQgaW50cmEgY2hyb21hIGRlYmxvY2sKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qKgotICogRnVuY3Rpb246IG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBkZWJsb2NraW5nIGZpbHRlcmluZyBvbiBhbGwgZWRnZXMgb2YgdGhlIGNocm9tYSBtYWNyb2Jsb2NrICgxNngxNikuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwU3JjRHN0ICAgICAgICAgcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jay4gTXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4KLSAqIFtpbl0Jc3JjZHN0U3RlcCAgICAgIFN0ZXAgb2YgdGhlIGFycmF5cwotICogW2luXQlwQWxwaGEgICAgICAgICAgcG9pbnRlciB0byBhIDJ4MiBhcnJheSBvZiBhbHBoYSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogeyBleHRlcm5hbAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsICB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbAotICogICAgICAgICAgICAgICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfQotICogW2luXQlwQmV0YQkJCXBvaW50ZXIgdG8gYSAyeDIgYXJyYXkgb2YgYmV0YSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogeyBleHRlcm5hbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbCAgaG9yaXpvbnRhbCBlZGdlLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbCAgaG9yaXpvbnRhbCBlZGdlIH0KLSAqIFtpbl0JcFRocmVzaG9sZHMJCUFBcnJheSBvZiBzaXplICA4eDIgb2YgVGhyZXNob2xkcyAoVEMwKSAodmFsdWVzIGZvciB0aGUgbGVmdCBvcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvdmUgZWRnZSBvZiBlYWNoIDR4MiBvciAyeDQgYmxvY2ssIGFycmFuZ2VkIGluICB2ZXJ0aWNhbCBibG9jayBvcmRlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZW4gaW4gIGhvcml6b250YWwgYmxvY2sgb3JkZXIpCi0gKiBbaW5dCXBCUwkJCQlhcnJheSBvZiBzaXplIDE2eDIgb2YgQlMgcGFyYW1ldGVycyAoYXJyYW5nZWQgaW4gc2NhbiBibG9jayBvcmRlciBmb3IgdmVydGljYWwgZWRnZXMgYW5kIHRoZW4gaG9yaXpvbnRhbCBlZGdlcyk7Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leMV09PSA0LiAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4KLSAqIFtvdXRdCXBTcmNEc3QJCXBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2sKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKLSAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cwotICogICAtIEVpdGhlciBvZiB0aGUgcG9pbnRlcnMgaW4gcFNyY0RzdCwgcEFscGhhLCBwQmV0YSwgcFRyZXNob2xkcywgb3IgcEJTIGlzIE5VTEwuCi0gKiAgIC0gcFNyY0RzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuCi0gKiAgIC0gZWl0aGVyIHBUaHJlc2hvbGRzIG9yIHBCUyBpcyBub3QgNC1ieXRlIGFsaWduZWQuCi0gKiAgIC0gcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgKHBCU1tpXT09NCAmJiBwQlNbaV4xXSE9NCkgZm9yIDA8PWk8PTMuCi0gKiAgIC0gc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LgotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JKAotCU9NWF9VOCogcFNyY0RzdCwgCi0JT01YX1MzMiBzcmNkc3RTdGVwLCAKLQljb25zdCBPTVhfVTgqIHBBbHBoYSwgCi0JY29uc3QgT01YX1U4KiBwQmV0YSwgCi0JY29uc3QgT01YX1U4KiBwVGhyZXNob2xkcywKLSAgICBjb25zdCBPTVhfVTggKnBCUwotKQotewotICAgIE9NWFJlc3VsdCBlcnJvckNvZGU7Ci0gICAgCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwU3JjRHN0KSwgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihzcmNkc3RTdGVwICYgNywgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEFscGhhID09IE5VTEwsICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCZXRhID09IE5VTEwsICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwVGhyZXNob2xkcyA9PSBOVUxMLCAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBUaHJlc2hvbGRzKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCUyA9PSBOVUxMLCAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocEJTKSwgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLSAgICBlcnJvckNvZGUgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JKAotICAgICAgICBwU3JjRHN0LCBzcmNkc3RTdGVwLCBwQWxwaGEsIHBCZXRhLCBwVGhyZXNob2xkcywgcEJTKTsKLQotICAgIGFybVJldEFyZ0VycklmKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyLCBlcnJvckNvZGUpCi0gICAgCi0gICAgZXJyb3JDb2RlID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSgKLSAgICAgICAgcFNyY0RzdCwgc3JjZHN0U3RlcCwgcEFscGhhKzIsIHBCZXRhKzIsIHBUaHJlc2hvbGRzKzgsIHBCUysxNik7Ci0KLSAgICByZXR1cm4gZXJyb3JDb2RlOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNDdkYzIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEguMjY0IGx1bWEgZGVibG9jawotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSAKLQotLyoqCi0gKiBGdW5jdGlvbjogb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGRlYmxvY2sgZmlsdGVyaW5nIHRoZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBlZGdlcyBvZiBhIGx1bWEgbWFjcm9ibG9jawotICooMTZ4MTYpLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcFNyY0RzdCAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2suIE11c3QgYmUgOC1ieXRlIGFsaWduZWQuCi0gKiBbaW5dCXNyY2RzdFN0ZXAgICAgICBpbWFnZSB3aWR0aAotICogW2luXQlwQWxwaGEgICAgICAgICAgcG9pbnRlciB0byBhIDJ4MiB0YWJsZSBvZiBhbHBoYSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogeyBleHRlcm5hbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsIGhvcml6b250YWwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfQotICogW2luXQlwQmV0YQkJCXBvaW50ZXIgdG8gYSAyeDIgdGFibGUgb2YgYmV0YSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogeyBleHRlcm5hbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbCAgaG9yaXpvbnRhbCBlZGdlLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbCAgaG9yaXpvbnRhbCBlZGdlIH0KLSAqIFtpbl0JcFRocmVzaG9sZHMJCXBvaW50ZXIgdG8gYSAxNngyIHRhYmxlIG9mIHRocmVzaG9sZCAoVEMwKSwgb3JnYW5pemVkIGFzIGZvbGxvd3M6IHsgdmFsdWVzIGZvcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgIGxlZnQgb3IgYWJvdmUgZWRnZSBvZiBlYWNoIDR4NCBibG9jaywgYXJyYW5nZWQgaW4gIHZlcnRpY2FsIGJsb2NrIG9yZGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGVuIGluIGhvcml6b250YWwgYmxvY2sgb3JkZXIpCi0gKiBbaW5dCXBCUwkJCQkgcG9pbnRlciB0byBhIDE2eDIgdGFibGUgb2YgQlMgcGFyYW1ldGVycyBhcnJhbmdlZCBpbiBzY2FuIGJsb2NrIG9yZGVyIGZvciB2ZXJ0aWNhbCBlZGdlcyBhbmQgdGhlbiBob3Jpem9udGFsIGVkZ2VzOwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjFdPT0gNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuCi0gKiBbb3V0XQlwU3JjRHN0CQlwb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgotICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCi0gKiAgICAtIEVpdGhlciBvZiB0aGUgcG9pbnRlcnMgaW4gcFNyY0RzdCwgcEFscGhhLCBwQmV0YSwgcFRyZXNob2xkcyBvciBwQlMgaXMgTlVMTC4KLSAqICAgIC0gcFNyY0RzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuCi0gKiAgICAtIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOAotICogICAgLSBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAocEJTW2ldPT00ICYmIHBCU1tpXjFdIT00KSBmb3IgMDw9aTw9My4KLS4KLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSSgKLQlPTVhfVTgqIHBTcmNEc3QsIAotCU9NWF9TMzIgc3JjZHN0U3RlcCwgCi0JY29uc3QgT01YX1U4KiBwQWxwaGEsIAotCWNvbnN0IE9NWF9VOCogcEJldGEsIAotCWNvbnN0IE9NWF9VOCogcFRocmVzaG9sZHMsIAotCWNvbnN0IE9NWF9VOCAqcEJTCi0pCi17Ci0gICAgT01YUmVzdWx0IGVycm9yQ29kZTsKLSAgICAKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocFNyY0RzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihzcmNkc3RTdGVwICYgNywgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsgICAgCi0gICAgYXJtUmV0QXJnRXJySWYocEFscGhhID09IE5VTEwsICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJldGEgPT0gTlVMTCwgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFRocmVzaG9sZHMgPT0gTlVMTCwgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBUaHJlc2hvbGRzKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCUyA9PSBOVUxMLCAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocEJTKSwgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLSAgICBlcnJvckNvZGUgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSgKLSAgICAgICAgcFNyY0RzdCwgc3JjZHN0U3RlcCwgcEFscGhhLCBwQmV0YSwgcFRocmVzaG9sZHMsIHBCUyk7Ci0KLSAgICBhcm1SZXRBcmdFcnJJZihlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciwgZXJyb3JDb2RlKQotICAgIAotICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JKAotICAgICAgICBwU3JjRHN0LCBzcmNkc3RTdGVwLCBwQWxwaGErMiwgcEJldGErMiwgcFRocmVzaG9sZHMrMTYsIHBCUysxNik7Ci0KLSAgICByZXR1cm4gZXJyb3JDb2RlOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZDY1Y2EuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYworKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogSC4yNjQgZGVjb2RlIGNvZWZmaWNpZW50cyBtb2R1bGUKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qKgotICogRnVuY3Rpb246IG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQwotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgQ0FWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgcmFzdGVyIHNjYW4gZm9yIDJ4MiBibG9jayBvZiAKLSAqIENocm9tYURDTGV2ZWwuIFRoZSBkZWNvZGVkIGNvZWZmaWNpZW50cyBpbiBwYWNrZWQgcG9zaXRpb24tY29lZmZpY2llbnQgCi0gKiBidWZmZXIgYXJlIHN0b3JlZCBpbiBpbmNyZWFzaW5nIHJhc3RlciBzY2FuIG9yZGVyLCBuYW1lbHkgcG9zaXRpb24gb3JkZXIuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcEJpdFN0cmVhbQkJRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0KLSAqCQkJCQkJCQlidWZmZXIKLSAqIFtpbl0JcE9mZnNldAkJCVBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgCi0gKgkJCQkJCQkJcG9pbnRlZCB0byBieSAqcHBCaXRTdHJlYW0KLSAqIFtvdXRdCXBwQml0U3RyZWFtCQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKLSAqIFtvdXRdCXBPZmZzZXQJCQkqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAotICogW291dF0JcE51bUNvZWZmCQlQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMKLSAqCQkJCQkJCQlpbiB0aGlzIGJsb2NrCi0gKiBbb3V0XQlwcFBvc0NvZWZidWYJRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwKLSAqCQkJCQkJCQljb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlcgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIG9teEVycm9yIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMgKAotICAgICBjb25zdCBPTVhfVTgqKiBwcEJpdFN0cmVhbSwKLSAgICAgT01YX1MzMiogcE9mZnNldCwKLSAgICAgT01YX1U4KiBwTnVtQ29lZmYsCi0gICAgIE9NWF9VOCoqIHBwUG9zQ29lZmJ1ZiAgICAgICAgCi0gKQotCi17Ci0gICAgcmV0dXJuIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyKHBwQml0U3RyZWFtLCBwT2Zmc2V0LCBwTnVtQ29lZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwUG9zQ29lZmJ1ZiwgMTcsIDQpOwotCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Zjk3MDZiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogSC4yNjQgZGVjb2RlIGNvZWZmaWNpZW50cyBtb2R1bGUKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qKgotICogRnVuY3Rpb246IG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIENBVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciA0eDQgYmxvY2sgb2YgCi0gKiBJbnRyYTE2eDE2RENMZXZlbCwgSW50cmExNngxNkFDTGV2ZWwsTHVtYUxldmVsLCBhbmQgQ2hyb21hQUNMZXZlbC4gCi0gKiBJbnZlcnNlIGZpZWxkIHNjYW4gaXMgbm90IHN1cHBvcnRlZC4gVGhlIGRlY29kZWQgY29lZmZpY2llbnRzIGluIHBhY2tlZCAKLSAqIHBvc2l0aW9uLWNvZWZmaWNpZW50IGJ1ZmZlciBhcmUgc3RvcmVkIGluIGluY3JlYXNpbmcgemlnemFnIG9yZGVyIGluc3RlYWQgCi0gKiBvZiBwb3NpdGlvbiBvcmRlci4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwQml0U3RyZWFtCQlEb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbSBidWZmZXIKLSAqIFtpbl0JcE9mZnNldAkJCVBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotICoJCQkJCQkJCXRvIGJ5ICpwcEJpdFN0cmVhbQotICogW2luXQlzTWF4TnVtQ29lZmYJTWF4aW11bSBudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIGluIGN1cnJlbnQKLSAqCQkJCQkJCQlibG9jawotICogW2luXQlzVkxDU2VsZWN0CQlWTEMgdGFibGUgc2VsZWN0b3IsIG9idGFpbmVkIGZyb20gbnVtYmVyIG9mIG5vbi16ZXJvCi0gKgkJCQkJCQkJQUMgY29lZmZpY2llbnRzIG9mIGFib3ZlIGFuZCBsZWZ0IDR4NCBibG9ja3MuIEl0IGlzIAotICoJCQkJCQkJCWVxdWl2YWxlbnQgdG8gdGhlIHZhcmlhYmxlIG5DIGRlc2NyaWJlZCBpbiBILjI2NCBzdGFuZGFyZCAKLSAqCQkJCQkJCQl0YWJsZSA5LTUsIGV4Y2VwdCBpdHMgdmFsdWUgY2Fuoa90IGJlIGxlc3MgdGhhbiB6ZXJvLgotICogW291dF0JcHBCaXRTdHJlYW0JCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAotICogW291dF0JcE9mZnNldAkJCSpwT2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkCi0gKiBbb3V0XQlwTnVtQ29lZmYJCVBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cyBpbgotICoJCQkJCQkJCXRoaXMgYmxvY2sKLSAqIFtvdXRdCXBwUG9zQ29lZmJ1ZglEb3VibGUgcG9pbnRlciB0byBkZXN0aW5hdGlvbiByZXNpZHVhbAotICoJCQkJCQkJCWNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBvbXhFcnJvciByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQygKLSAgICAgY29uc3QgT01YX1U4KiogcHBCaXRTdHJlYW0sCi0gICAgIE9NWF9TMzIqIHBPZmZzZXQsCi0gICAgIE9NWF9VOCogcE51bUNvZWZmLAotICAgICBPTVhfVTgqKnBwUG9zQ29lZmJ1ZiwKLSAgICAgT01YX0lOVCBzVkxDU2VsZWN0LAotICAgICBPTVhfSU5UIHNNYXhOdW1Db2VmZiAgICAgICAgCi0gKQotewotICAgIHJldHVybiBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcihwcEJpdFN0cmVhbSwgcE9mZnNldCwgcE51bUNvZWZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcFBvc0NvZWZidWYsIHNWTENTZWxlY3QsIHNNYXhOdW1Db2VmZik7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGRfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE4N2YyYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGRfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsNDk0ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNyBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8KLTsvLyBEZXNjcmlwdGlvbjoKLTsvLyBILjI2NCBpbnZlcnNlIHF1YW50aXplIGFuZCB0cmFuc2Zvcm0gbW9kdWxlCi07Ly8gCi07Ly8gCi0KLSAgICAgICAgCi0KLTsvLyBJbmNsdWRlIHN0YW5kYXJkIGhlYWRlcnMKLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotOy8vIEltcG9ydCBzeW1ib2xzIHJlcXVpcmVkIGZyb20gb3RoZXIgZmlsZXMKLTsvLyAoRm9yIGV4YW1wbGUgdGFibGVzKQotICAgIAotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NAotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NAotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9RUERpdlRhYmxlCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1ZNYXRyaXhVMTYKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfUVBNb2R1bG9UYWJsZSAKLSAgICAgICAgCi0gICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMsIEFSTTExMzZKU19VCi0gICAgICAgIAotOy8vIFNldCBkZWJ1Z2dpbmcgbGV2ZWwgICAgICAgIAotOy8vREVCVUdfT04gICAgU0VUTCB7VFJVRX0KLQotCi07Ly8gU3RhdGljIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0RlcXVhbnRMdW1hQUM0eDQKLQotOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQotICAgIAotICAgIElGICBBUk0xMTM2SlMgCi0gICAgCi07Ly9JbnB1dCBSZWdpc3RlcnMKLXBTcmNEc3QgICAgICAgUk4gIDAKLVFQICAgICAgICAgICAgUk4gIDEKLQotCi07Ly9PdXRwdXQgUmVnaXN0ZXJzCi0KLQotOy8vTG9jYWwgU2NyYXRjaCBSZWdpc3RlcnMKLXBRUGRpdiAgICAgICAgICBSTiAgNAotcFFQbW9kICAgICAgICAgIFJOICA1Ci1wVlJvdyAgICAgICAgICAgUk4gIDIKLVFQbW9kICAgICAgICAgICBSTiAgNgotc2hpZnQgICAgICAgICAgIFJOICAzCi1yb3dMdW1hMDEgICAgICAgUk4gIDEKLXJvd0x1bWEyMyAgICAgICBSTiAgNAotCi1TcmNEc3QwMCAgICAgICAgUk4gIDUKLVNyY0RzdDAyICAgICAgICBSTiAgNgotU3JjRHN0MTAgICAgICAgIFJOICA3Ci1TcmNEc3QxMiAgICAgICAgUk4gIDgKLVNyY0RzdDIwICAgICAgICBSTiAgOQotU3JjRHN0MjIgICAgICAgIFJOICAxMAotU3JjRHN0MzAgICAgICAgIFJOICAxMQotU3JjRHN0MzIgICAgICAgIFJOICAxMgotCi10ZW1wMSAgICAgICAgICAgUk4gIDIKLXRlbXAyICAgICAgICAgICBSTiAgMwotdGVtcDMgICAgICAgICAgIFJOICAxNAotICAgIAotICAgIAotICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHJlcXVpcmVkIGJ5IHRoZSBmdW5jdGlvbgotICAgICAgICAKLSAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfRGVxdWFudEx1bWFBQzR4NCxyMTEKLSAgICAgICAgIAotICAgICAgICBMRFIgICAgcFFQbW9kLD1hcm1WQ000UDEwX1FQTW9kdWxvVGFibGUKLSAgICAgICAgTERSICAgIHBRUGRpdiw9YXJtVkNNNFAxMF9RUERpdlRhYmxlICAgICAgICAKLSAgICAgICAgTERSICAgIHBWUm93LD1hcm1WQ000UDEwX1ZNYXRyaXhVMTYKLSAgICAgICAgIAotICAgICAgICBMRFJTQiAgUVBtb2QsW3BRUG1vZCxRUF0gICAgICAgICAgICAgICAgICAgIDsvLyAoUVAlNikgKiA2Ci0gICAgICAgIExEUlNCICBzaGlmdCxbcFFQZGl2LFFQXSAgICAgICAgICAgICAgICAgICAgOy8vIFNoaWZ0ID0gUVAgLyA2Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkggICAgcm93THVtYTAxLFtwVlJvdyxRUG1vZF0hICAgICAgICAgICAgIDsvLyByb3dMdW1hMDEgPSBbMDB8MGFdCi0gICAgICAgIExEUkggICAgdGVtcDMsW3BWUm93LCMyXSAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wMyAgICAgPSBbMDB8MGJdICAgCi0gICAgICAgIExEUkggICAgcm93THVtYTIzLFtwVlJvdywjNF0gICAgICAgICAgICAgICAgIDsvLyByb3dMdW1hMjMgPSBbMDB8MGNdIAotICAgICAgICBPUlIgICAgIHJvd0x1bWEwMSxyb3dMdW1hMDEsdGVtcDMsTFNMICMxNiAgICA7Ly8gcm93THVtYTAxID0gWzBifDBhXSAgIAotICAgICAgICAKLSAgICAgICAgOy8vIExvYWQgYWxsIHRoZSAxNiAnc3JjJyB2YWx1ZXMKLSAgICAgICAgTERNSUEgICBwU3JjRHN0LHtTcmNEc3QwMCxTcmNEc3QwMixTcmNEc3QxMCxTcmNEc3QxMixTcmNEc3QyMCxTcmNEc3QyMixTcmNEc3QzMCxTcmNEc3QzMn0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAnU2hpZnQnIHJhbmdlcyBiZXR3ZWVuIFswLDhdIAotICAgICAgICA7Ly8gU28gd2UgY2FuIHNoaWZ0IHRoZSBwYWNrZWQgcm93THVtYSB2YWx1ZXMgWzBifDBhXSB3aXRoIGEgc2luZ2xlIExTTCBvcGVyYXRpb24KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAKLSAgICAgICAgTFNMICAgIHJvd0x1bWEwMSxyb3dMdW1hMDEsc2hpZnQKLSAgICAgICAgTFNMICAgIHJvd0x1bWEyMyxyb3dMdW1hMjMsc2hpZnQKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gVGhlIGlkZWEgaXMgdG8gdW5yb2xsIHRoZSBMb29wIGNvbXBsZXRlbHkKLSAgICAgICAgOy8vIEFsbCB0aGUgMTYgc3JjIHZhbHVlcyBhcmUgbG9hZGVkIGF0IG9uY2UgaW50byA4IHJlZ2lzdGVycyA6IFNyY0RzdDx5Pjx4PiAoYWJvdmUpCi0gICAgICAgIDsvLyAwPD0gYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDRbaV0gPD0yIGZvciBhbnkgJ2k8MTYnIAotICAgICAgICA7Ly8gU28gdGhlIG9ubHkgdmFsdWVzIG9mIHBWUm93W2ldIHRoYXQgbmVlZCB0byBiZSBsb2FkZWQgYXJlIGZvciBpPTAsMSwyCi0gICAgICAgIDsvLyBUaGVzZSAzIHZhbHVlcyBhcmUgbG9hZGVkIGludG8gcm93THVtYTAxIGFuZCByb3dMdW1hMjMgKGFib3ZlKQotICAgICAgICA7Ly8gV2UgZmlyc3QgY2FsY3VsYXRlIHBWUm93W2FybVZDTTRQMTBfUG9zVG9WQ29sNHg0W2ldXSkgPDwgU2hpZnQgd2hpY2ggZml0cyBpbnRvIDE2IGJpdHMgKGFib3ZlKQotICAgICAgICA7Ly8gVGhlbiB0aGUgcHJvZHVjdCBwU3JjRHN0W2ldICogKHBWUm93W2FybVZDTTRQMTBfUG9zVG9WQ29sNHg0W2ldXSA8PCBTaGlmdCkgaXMgY2FsY3VsYXRlZAotICAgICAgICA7Ly8gSGVyZSB3ZSBpbnRlcmxlYXZlIHRoZSBQS0hCVCBvcGVyYXRpb25zIGZvciB2YXJpb3VzIHJvd3MgIHRvIGF2b2lkZSBwaXBlbGluZSBzdGFsbHMKLSAgICAgICAgOy8vIAotICAgICAgICA7Ly8gV2UgdGhlbiBwYWNrIHRoZSB0d28gMTYgYml0IG11bHRpcGxpY2F0aW9uIHJlc3VsdCBpbnRvIGEgd29yZCBhbmQgc3RvcmUgYXQgb25lIGdvCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIFJvdyAxCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgU01VTFRCICB0ZW1wMSxTcmNEc3QwMCxyb3dMdW1hMjMgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzFdICogKHBWUm93WzJdPDxTaGlmdCkgCi0gICAgICAgIFNNVUxCQiAgU3JjRHN0MDAsU3JjRHN0MDAscm93THVtYTAxICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFswXSAqIChwVlJvd1swXTw8U2hpZnQpICAKLSAgICAgICAgCi0gICAgICAgIFNNVUxUQiAgdGVtcDIsU3JjRHN0MDIscm93THVtYTIzICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFszXSAqIChwVlJvd1syXTw8U2hpZnQpIAotICAgICAgICBTTVVMQkIgIFNyY0RzdDAyLFNyY0RzdDAyLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMl0gKiAocFZSb3dbMF08PFNoaWZ0KQotICAgICAgICAKLSAgICAgICAgUEtIQlQgICBTcmNEc3QwMCxTcmNEc3QwMCx0ZW1wMSxMU0wgIzE2ICAgICAgICAgICAgIDsvLyBQYWNrIHRoZSBmaXJzdCB0d28gcHJvZHVjdCB2YWx1ZXMKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBSb3cgMgotICAgICAgICBTTVVMVFQgIHRlbXAxLFNyY0RzdDEwLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbNV0gKiAocFZSb3dbMV08PFNoaWZ0KQotICAgICAgICBTTVVMQkIgIFNyY0RzdDEwLFNyY0RzdDEwLHJvd0x1bWEyMyAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbNF0gKiAocFZSb3dbMl08PFNoaWZ0KQotICAgICAgICAKLSAgICAgICAgUEtIQlQgICBTcmNEc3QwMixTcmNEc3QwMix0ZW1wMixMU0wgIzE2ICAgICAgICAgICAgIDsvLyBQYWNrIHRoZSBuZXh0IHR3byBwcm9kdWN0IHZhbHVlcwotICAgICAgICBTTVVMVFQgIHRlbXAyLFNyY0RzdDEyLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbN10gKiAocFZSb3dbMV08PFNoaWZ0KQotICAgICAgICBTTVVMQkIgIFNyY0RzdDEyLFNyY0RzdDEyLHJvd0x1bWEyMyAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbNl0gKiAocFZSb3dbMl08PFNoaWZ0KQotICAgICAgICAKLSAgICAgICAgUEtIQlQgICBTcmNEc3QxMCxTcmNEc3QxMCx0ZW1wMSxMU0wgIzE2ICAgICAgICAgICAgIDsvLyBQYWNrIHRoZSBuZXh0IHR3byBwcm9kdWN0IHZhbHVlcwotICAgICAgICAKLSAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gUm93IDMgICAgCi0gICAgICAgIAotICAgICAgICBTTVVMVEIgIHRlbXAxLFNyY0RzdDIwLHJvd0x1bWEyMyAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbOV0gKiAocFZSb3dbMl08PFNoaWZ0KSAgICAgICAgIAotICAgICAgICBTTVVMQkIgIFNyY0RzdDIwLFNyY0RzdDIwLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbOF0gKiAocFZSb3dbMF08PFNoaWZ0KSAgCi0gICAgICAgCi0gICAgICAgIFBLSEJUICAgU3JjRHN0MTIsU3JjRHN0MTIsdGVtcDIsTFNMICMxNiAgICAgICAgICAgICAgIDsvLyBQYWNrIHRoZSBuZXh0IHR3byBwcm9kdWN0IHZhbHVlcwotICAgICAgICBTTVVMVEIgIHRlbXAyLFNyY0RzdDIyLHJvd0x1bWEyMyAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMTFdICogKHBWUm93WzJdPDxTaGlmdCkgCi0gICAgICAgIFNNVUxCQiAgU3JjRHN0MjIsU3JjRHN0MjIscm93THVtYTAxICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsxMF0gKiAocFZSb3dbMF08PFNoaWZ0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFBLSEJUICAgU3JjRHN0MjAsU3JjRHN0MjAsdGVtcDEsTFNMICMxNiAgICAgICAgICAgICA7Ly8gUGFjayB0aGUgbmV4dCB0d28gcHJvZHVjdCB2YWx1ZXMKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBSb3cgNCAgIAotICAgICAgICAKLSAgICAgICAgU01VTFRUICB0ZW1wMSxTcmNEc3QzMCxyb3dMdW1hMDEgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzEzXSAqIChwVlJvd1sxXTw8U2hpZnQpCi0gICAgICAgIFNNVUxCQiAgU3JjRHN0MzAsU3JjRHN0MzAscm93THVtYTIzICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsxMl0gKiAocFZSb3dbMl08PFNoaWZ0KQotICAgICAgICAKLSAgICAgICAgU01VTFRUICB0ZW1wMyxTcmNEc3QzMixyb3dMdW1hMDEgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzE1XSAqIChwVlJvd1sxXTw8U2hpZnQpCi0gICAgICAgIFNNVUxCQiAgU3JjRHN0MzIsU3JjRHN0MzIscm93THVtYTIzICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsxNF0gKiAocFZSb3dbMl08PFNoaWZ0KQotICAgICAgIAotICAgICAgICBQS0hCVCAgIFNyY0RzdDIyLFNyY0RzdDIyLHRlbXAyLExTTCAjMTYgICAgICAgICAgICAgOy8vIFBhY2sgdGhlIHJlbWFpbmluZyBwcm9kdWN0IHZhbHVlcwotICAgICAgICBQS0hCVCAgIFNyY0RzdDMwLFNyY0RzdDMwLHRlbXAxLExTTCAjMTYKLSAgICAgICAgUEtIQlQgICBTcmNEc3QzMixTcmNEc3QzMix0ZW1wMyxMU0wgIzE2Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgU1RNSUEgICBwU3JjRHN0LHtTcmNEc3QwMCxTcmNEc3QwMixTcmNEc3QxMCxTcmNEc3QxMixTcmNEc3QyMCxTcmNEc3QyMixTcmNEc3QzMCxTcmNEc3QzMn0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gU2V0IHJldHVybiB2YWx1ZQotICAgICAgICAgIAotICAgICAgICAgICAKLSAgICAgIAotICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gdGFpbAotICAgICAgICBNX0VORAotICAgICAgICAKLSAgICBFTkRJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9BUk0xMTM2SlMgICAgICAgIAotIAotCi07Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCi0gICAgCi0gICAgSUYgIEFSTTExMzZKU19VCi0gICAgCi07Ly9JbnB1dCBSZWdpc3RlcnMKLXBTcmNEc3QgICAgICAgUk4gIDAKLVFQICAgICAgICAgICAgUk4gIDEKLQotCi07Ly9PdXRwdXQgUmVnaXN0ZXJzCi0KLQotOy8vTG9jYWwgU2NyYXRjaCBSZWdpc3RlcnMKLXBRUGRpdiAgICAgICAgICBSTiAgNAotcFFQbW9kICAgICAgICAgIFJOICA1Ci1wVlJvdyAgICAgICAgICAgUk4gIDIKLVFQbW9kICAgICAgICAgICBSTiAgNgotc2hpZnQgICAgICAgICAgIFJOICAzCi1yb3dMdW1hMDEgICAgICAgUk4gIDEKLXJvd0x1bWEyMyAgICAgICBSTiAgNAotCi1TcmNEc3QwMCAgICAgICAgUk4gIDUKLVNyY0RzdDAyICAgICAgICBSTiAgNgotU3JjRHN0MTAgICAgICAgIFJOICA3Ci1TcmNEc3QxMiAgICAgICAgUk4gIDgKLVNyY0RzdDIwICAgICAgICBSTiAgOQotU3JjRHN0MjIgICAgICAgIFJOICAxMAotU3JjRHN0MzAgICAgICAgIFJOICAxMQotU3JjRHN0MzIgICAgICAgIFJOICAxMgotCi10ZW1wMSAgICAgICAgICAgUk4gIDIKLXRlbXAyICAgICAgICAgICBSTiAgMwotdGVtcDMgICAgICAgICAgIFJOICAxNAotICAgIAotICAgIAotICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHJlcXVpcmVkIGJ5IHRoZSBmdW5jdGlvbgotICAgICAgICAKLSAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfRGVxdWFudEx1bWFBQzR4NCxyMTEKLSAgICAgICAgIAotICAgICAgICBMRFIgICAgcFFQbW9kLD1hcm1WQ000UDEwX1FQTW9kdWxvVGFibGUKLSAgICAgICAgTERSICAgIHBRUGRpdiw9YXJtVkNNNFAxMF9RUERpdlRhYmxlICAgICAgICAKLSAgICAgICAgTERSICAgIHBWUm93LD1hcm1WQ000UDEwX1ZNYXRyaXhVMTYKLSAgICAgICAgIAotICAgICAgICBMRFJTQiAgUVBtb2QsW3BRUG1vZCxRUF0gICAgICAgICAgICAgICAgICAgIDsvLyAoUVAlNikgKiA2Ci0gICAgICAgIExEUlNCICBzaGlmdCxbcFFQZGl2LFFQXSAgICAgICAgICAgICAgICAgICAgOy8vIFNoaWZ0ID0gUVAgLyA2Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIExEUiAgICByb3dMdW1hMDEsW3BWUm93LFFQbW9kXSEgICAgICAgICAgICAgOy8vIHJvd0x1bWEwMSA9IFswYnwwYV0KLSAgICAgICAgTERSICAgIHJvd0x1bWEyMyxbcFZSb3csIzRdICAgICAgICAgICAgICAgICA7Ly8gcm93THVtYTIzID0gWzBkfDBjXSAgICAKLQotICAgICAgICA7Ly8gTG9hZCBhbGwgdGhlIDE2ICdzcmMnIHZhbHVlcwotICAgICAgICBMRE1JQSAgIHBTcmNEc3Qse1NyY0RzdDAwLFNyY0RzdDAyLFNyY0RzdDEwLFNyY0RzdDEyLFNyY0RzdDIwLFNyY0RzdDIyLFNyY0RzdDMwLFNyY0RzdDMyfQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICdTaGlmdCcgcmFuZ2VzIGJldHdlZW4gWzAsOF0gCi0gICAgICAgIDsvLyBTbyB3ZSBjYW4gc2hpZnQgdGhlIHBhY2tlZCByb3dMdW1hIHZhbHVlcyBbMGJ8MGFdIHdpdGggYSBzaW5nbGUgTFNMIG9wZXJhdGlvbgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIAotICAgICAgICBMU0wgICAgcm93THVtYTAxLHJvd0x1bWEwMSxzaGlmdAotICAgICAgICBMU0wgICAgcm93THVtYTIzLHJvd0x1bWEyMyxzaGlmdAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBUaGUgaWRlYSBpcyB0byB1bnJvbGwgdGhlIExvb3AgY29tcGxldGVseQotICAgICAgICA7Ly8gQWxsIHRoZSAxNiBzcmMgdmFsdWVzIGFyZSBsb2FkZWQgYXQgb25jZSBpbnRvIDggcmVnaXN0ZXJzIDogU3JjRHN0PHk+PHg+IChhYm92ZSkKLSAgICAgICAgOy8vIDA8PSBhcm1WQ000UDEwX1Bvc1RvVkNvbDR4NFtpXSA8PTIgZm9yIGFueSAnaTwxNicgCi0gICAgICAgIDsvLyBTbyB0aGUgb25seSB2YWx1ZXMgb2YgcFZSb3dbaV0gdGhhdCBuZWVkIHRvIGJlIGxvYWRlZCBhcmUgZm9yIGk9MCwxLDIKLSAgICAgICAgOy8vIFRoZXNlIDMgdmFsdWVzIGFyZSBsb2FkZWQgaW50byByb3dMdW1hMDEgYW5kIHJvd0x1bWEyMyAoYWJvdmUpCi0gICAgICAgIDsvLyBXZSBmaXJzdCBjYWxjdWxhdGUgcFZSb3dbYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDRbaV1dKSA8PCBTaGlmdCB3aGljaCBmaXRzIGludG8gMTYgYml0cyAoYWJvdmUpCi0gICAgICAgIDsvLyBUaGVuIHRoZSBwcm9kdWN0IHBTcmNEc3RbaV0gKiAocFZSb3dbYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDRbaV1dIDw8IFNoaWZ0KSBpcyBjYWxjdWxhdGVkCi0gICAgICAgIDsvLyBIZXJlIHdlIGludGVybGVhdmUgdGhlIFBLSEJUIG9wZXJhdGlvbnMgZm9yIHZhcmlvdXMgcm93cyAgdG8gYXZvaWRlIHBpcGVsaW5lIHN0YWxscwotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLyBXZSB0aGVuIHBhY2sgdGhlIHR3byAxNiBiaXQgbXVsdGlwbGljYXRpb24gcmVzdWx0IGludG8gYSB3b3JkIGFuZCBzdG9yZSBhdCBvbmUgZ28KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gUm93IDEKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBTTVVMVEIgIHRlbXAxLFNyY0RzdDAwLHJvd0x1bWEyMyAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMV0gKiAocFZSb3dbMl08PFNoaWZ0KSAKLSAgICAgICAgU01VTEJCICBTcmNEc3QwMCxTcmNEc3QwMCxyb3dMdW1hMDEgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzBdICogKHBWUm93WzBdPDxTaGlmdCkgIAotICAgICAgICAKLSAgICAgICAgU01VTFRCICB0ZW1wMixTcmNEc3QwMixyb3dMdW1hMjMgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzNdICogKHBWUm93WzJdPDxTaGlmdCkgCi0gICAgICAgIFNNVUxCQiAgU3JjRHN0MDIsU3JjRHN0MDIscm93THVtYTAxICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsyXSAqIChwVlJvd1swXTw8U2hpZnQpCi0gICAgICAgIAotICAgICAgICBQS0hCVCAgIFNyY0RzdDAwLFNyY0RzdDAwLHRlbXAxLExTTCAjMTYgICAgICAgICAgICAgOy8vIFBhY2sgdGhlIGZpcnN0IHR3byBwcm9kdWN0IHZhbHVlcwotICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIFJvdyAyCi0gICAgICAgIFNNVUxUVCAgdGVtcDEsU3JjRHN0MTAscm93THVtYTAxICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFs1XSAqIChwVlJvd1sxXTw8U2hpZnQpCi0gICAgICAgIFNNVUxCQiAgU3JjRHN0MTAsU3JjRHN0MTAscm93THVtYTIzICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFs0XSAqIChwVlJvd1syXTw8U2hpZnQpCi0gICAgICAgIAotICAgICAgICBQS0hCVCAgIFNyY0RzdDAyLFNyY0RzdDAyLHRlbXAyLExTTCAjMTYgICAgICAgICAgICAgOy8vIFBhY2sgdGhlIG5leHQgdHdvIHByb2R1Y3QgdmFsdWVzCi0gICAgICAgIFNNVUxUVCAgdGVtcDIsU3JjRHN0MTIscm93THVtYTAxICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFs3XSAqIChwVlJvd1sxXTw8U2hpZnQpCi0gICAgICAgIFNNVUxCQiAgU3JjRHN0MTIsU3JjRHN0MTIscm93THVtYTIzICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFs2XSAqIChwVlJvd1syXTw8U2hpZnQpCi0gICAgICAgIAotICAgICAgICBQS0hCVCAgIFNyY0RzdDEwLFNyY0RzdDEwLHRlbXAxLExTTCAjMTYgICAgICAgICAgICAgOy8vIFBhY2sgdGhlIG5leHQgdHdvIHByb2R1Y3QgdmFsdWVzCi0gICAgICAgIAotICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBSb3cgMyAgICAKLSAgICAgICAgCi0gICAgICAgIFNNVUxUQiAgdGVtcDEsU3JjRHN0MjAscm93THVtYTIzICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFs5XSAqIChwVlJvd1syXTw8U2hpZnQpICAgICAgICAgCi0gICAgICAgIFNNVUxCQiAgU3JjRHN0MjAsU3JjRHN0MjAscm93THVtYTAxICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFs4XSAqIChwVlJvd1swXTw8U2hpZnQpICAKLSAgICAgICAKLSAgICAgICAgUEtIQlQgICBTcmNEc3QxMixTcmNEc3QxMix0ZW1wMixMU0wgIzE2ICAgICAgICAgICAgICAgOy8vIFBhY2sgdGhlIG5leHQgdHdvIHByb2R1Y3QgdmFsdWVzCi0gICAgICAgIFNNVUxUQiAgdGVtcDIsU3JjRHN0MjIscm93THVtYTIzICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsxMV0gKiAocFZSb3dbMl08PFNoaWZ0KSAKLSAgICAgICAgU01VTEJCICBTcmNEc3QyMixTcmNEc3QyMixyb3dMdW1hMDEgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzEwXSAqIChwVlJvd1swXTw8U2hpZnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgUEtIQlQgICBTcmNEc3QyMCxTcmNEc3QyMCx0ZW1wMSxMU0wgIzE2ICAgICAgICAgICAgIDsvLyBQYWNrIHRoZSBuZXh0IHR3byBwcm9kdWN0IHZhbHVlcwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIFJvdyA0ICAgCi0gICAgICAgIAotICAgICAgICBTTVVMVFQgIHRlbXAxLFNyY0RzdDMwLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMTNdICogKHBWUm93WzFdPDxTaGlmdCkKLSAgICAgICAgU01VTEJCICBTcmNEc3QzMCxTcmNEc3QzMCxyb3dMdW1hMjMgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzEyXSAqIChwVlJvd1syXTw8U2hpZnQpCi0gICAgICAgIAotICAgICAgICBTTVVMVFQgIHRlbXAzLFNyY0RzdDMyLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMTVdICogKHBWUm93WzFdPDxTaGlmdCkKLSAgICAgICAgU01VTEJCICBTcmNEc3QzMixTcmNEc3QzMixyb3dMdW1hMjMgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzE0XSAqIChwVlJvd1syXTw8U2hpZnQpCi0gICAgICAgCi0gICAgICAgIFBLSEJUICAgU3JjRHN0MjIsU3JjRHN0MjIsdGVtcDIsTFNMICMxNiAgICAgICAgICAgICA7Ly8gUGFjayB0aGUgcmVtYWluaW5nIHByb2R1Y3QgdmFsdWVzCi0gICAgICAgIFBLSEJUICAgU3JjRHN0MzAsU3JjRHN0MzAsdGVtcDEsTFNMICMxNgotICAgICAgICBQS0hCVCAgIFNyY0RzdDMyLFNyY0RzdDMyLHRlbXAzLExTTCAjMTYKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBTVE1JQSAgIHBTcmNEc3Qse1NyY0RzdDAwLFNyY0RzdDAyLFNyY0RzdDEwLFNyY0RzdDEyLFNyY0RzdDIwLFNyY0RzdDIyLFNyY0RzdDMwLFNyY0RzdDMyfQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBTZXQgcmV0dXJuIHZhbHVlCi0gICAgICAgICAgCi0gICAgICAgICAgIAotICAgICAgCi0gICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiB0YWlsCi0gICAgICAgIE1fRU5ECi0gICAgICAgIAotICAgIEVORElGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL0FSTTExMzZKU19VICAgICAgICAKLQotCi0KLQotCi07Ly8gRnVuY3Rpb246IG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQgICAgICAgICAgICAKLSAgICAKLTsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKLSAgICAKLSAgICBJRiAgQVJNMTEzNkpTCi0gICAgCi07Ly9JbnB1dCBSZWdpc3RlcnMKLXBwU3JjICAgICAgIFJOICAwCi1wUHJlZCAgICAgICBSTiAgMQotcERDICAgICAgICAgUk4gIDIKLXBEc3QgICAgICAgIFJOICAzCi0gICAKLQotOy8vT3V0cHV0IFJlZ2lzdGVycwotcmVzdWx0ICAgICAgUk4gIDAKLQotOy8vTG9jYWwgU2NyYXRjaCBSZWdpc3RlcnMKLXBEZWx0YSAgICAgIFJOICA0Ci1wRGVsdGFUbXAgICBSTiAgNgotQUMgICAgICAgICAgUk4gIDUgICAgICAgICAgICAgICAgICAgOy8vTG9hZCBmcm9tIHN0YWNrCi1wUHJlZFRlbXAgICBSTiAgNwotcERDVGVtcCAgICAgUk4gIDgKLXBEc3RUZW1wICAgIFJOICA5Ci1wRGVsdGFBcmcxICBSTiAgMQotcERlbHRhQXJnMCAgUk4gIDAKLVFQICAgICAgICAgIFJOICAxICAgICAgICAgICAgICAgICAgIDsvL0xvYWQgZnJvbSBzdGFjawotREN2YWwgICAgICAgUk4gIDEwICAKLURDdmFsQ29weSAgIFJOICAxMQotcHJlZHN0ZXAgICAgUk4gIDEKLWRzdFN0ZXAgICAgIFJOICAxMAoteWNvdW50ZXIgICAgUk4gIDAKLVByZWRWYWwxICAgIFJOICAzCi1QcmVkVmFsMiAgICBSTiAgNQotRGVsdGFWYWwxICAgUk4gIDIKLURlbHRhVmFsMiAgIFJOICAxMQotUHJlZFZhbCAgICAgUk4gIDgKLXRtcERlbHRhVmFsIFJOICA2Ci1zdW0xICAgICAgICBSTiAgMTIKLXN1bTIgICAgICAgIFJOICAxNAotICAgIAotICAgIAotICAgICAgICAgICAKLSAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHJlcXVpcmVkIGJ5IHRoZSBmdW5jdGlvbgotICAgICAgICBNX0FMTE9DOCBwQnVmZmVyLCAzMgotICAgICAgICAgICAgICAgCi0KLSAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCxyMTEKLSAgICAgICAgCi0gICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCi0gICAgICAgIE1fQVJHICAgcHJlZFN0ZXBPblN0YWNrLCA0Ci0gICAgICAgIE1fQVJHICAgZHN0U3RlcE9uU3RhY2ssNAotICAgICAgICBNX0FSRyAgIFFQT25TdGFjaywgNAotICAgICAgICBNX0FSRyAgIEFDT25TdGFjayw0Ci0gIAotICAgICAgICAKLSAgICAgICAgTV9BRFIgICBwRGVsdGEscEJ1ZmZlciAKLSAgICAgICAgTV9MRFIgICBBQyxBQ09uU3RhY2sgCi0gICAgICAgIAotICAgICAgICAgCi0gICAgICAgIDsvLyBTYXZlIHJlZ2lzdGVycyByMSxyMixyMyBiZWZvcmUgZnVuY3Rpb24gY2FsbCAgICAKLSAgICAgICAgTU9WICAgICBwUHJlZFRlbXAscFByZWQKLSAgICAgICAgTU9WICAgICBwRENUZW1wLHBEQwotICAgICAgICBNT1YgICAgIHBEc3RUZW1wLHBEc3QKLSAgICAgICAgCi0gICAgICAgIENNUCAgICAgQUMsIzAKLSAgICAgICAgQkVRICAgICBEQ2Nhc2UKLSAgICAgICAgTU9WICAgICBwRGVsdGFBcmcxLHBEZWx0YSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXQgdXAgcjEgZm9yIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQKLSAgICAKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0Ci0gICAgCi0gICAgICAgIE1fTERSICAgUVAsUVBPblN0YWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2V0IHVwIHIxIGZvciBEZXF1YW50THVtYUFDNHg0Ci0gICAgICAgIE1PViAgICAgcERlbHRhQXJnMCxwRGVsdGEgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2V0IHVwIHIwIGZvciBEZXF1YW50THVtYUFDNHg0Ci0KLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0RlcXVhbnRMdW1hQUM0eDQKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBDTVAgICAgIHBEQ1RlbXAsIzAKLSAgICAgICAgTERSU0hORSBEQ3ZhbCxbcERDVGVtcF0KLSAgICAgICAgTU9WICAgICBwRGVsdGFBcmcwLHBEZWx0YSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXQgdXAgcjAgZm9yIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQKLSAgICAgICAgTU9WICAgICBwRGVsdGFBcmcxLHBEZWx0YSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXQgdXAgcjEgZm9yIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQKLSAgICAgICAgU1RSSE5FICBEQ3ZhbCxbcERlbHRhXQotICAgICAgICAKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0Ci0gICAgICAgIEIgICAgICAgT3V0RENjYXNlIAotICAgICAgICAKLQotRENjYXNlCi0gICAgICAgIExEUlNIICAgREN2YWwsW3BEQ1RlbXBdIAotICAgICAgICBBREQgICAgIERDdmFsLERDdmFsLCMzMiAKLSAgICAgICAgQVNSICAgICBEQ3ZhbCxEQ3ZhbCwjNgotICAgICAgICBQS0hCVCAgIERDdmFsLERDdmFsLERDdmFsLExTTCAjMTYgICAgICAgICAgICAgICAgICA7Ly8gRHVwbGljYXRpbmcgdGhlIExvd2VyIGhhbGZ3b3JkCi0gICAgICAgIE1PViAgICAgREN2YWxDb3B5LCBEQ3ZhbCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBOZWVkZWQgZm9yIFNUUkQKLSAgICAgICAgU1RSRCAgICBEQ3ZhbCwgW3BEZWx0YSwgIzBdICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBEZWx0YVswXSAgPSBwRGVsdGFbMV0gID0gcERlbHRhWzJdICA9IHBEZWx0YVszXSA9IERDdmFsCi0gICAgICAgIFNUUkQgICAgREN2YWwsIFtwRGVsdGEsICM4XSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwRGVsdGFbNF0gID0gcERlbHRhWzVdICA9IHBEZWx0YVs2XSAgPSBwRGVsdGFbN10gPSBEQ3ZhbAotICAgICAgICBTVFJEICAgIERDdmFsLCBbcERlbHRhLCAjMTZdICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcERlbHRhWzhdICA9IHBEZWx0YVs5XSAgPSBwRGVsdGFbMTBdID0gcERlbHRhWzExXSA9IERDdmFsCi0gICAgICAgIFNUUkQgICAgREN2YWwsIFtwRGVsdGEsICMyNF0gICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAKLU91dERDY2FzZSAgICAgIAotICAgICAgICBNX0xEUiAgIHByZWRzdGVwLHByZWRTdGVwT25TdGFjawotICAgICAgICBNX0xEUiAgIGRzdFN0ZXAsZHN0U3RlcE9uU3RhY2sKLSAgICAgICAgCi0gICAgICAgIExETUlBICAgcERlbHRhISx7dG1wRGVsdGFWYWwsRGVsdGFWYWwyfSAgICAgICAgICAgICA7Ly8gUHJlIGxvYWQKLSAgICAgICAgTU9WICAgICB5Y291bnRlciwjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDb3VudGVyIGZvciB0aGUgUHJlZFBsdXNEZWx0YUxvb3AKLSAgICAgICAgTERSICAgICBQcmVkVmFsLFtwUHJlZFRlbXBdICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBQcmUgbG9hZAotCi1QcmVkUGx1c0RlbHRhTG9vcAotICAgICAgICAKLSAgICAgICAKLSAgICAgICAgU1VCUyAgICB5Y291bnRlcix5Y291bnRlciwjMQotICAgICAgICBBREQgICAgIHBQcmVkVGVtcCxwUHJlZFRlbXAscHJlZHN0ZXAgICAgICAgICAgICAgICAgOy8vIEluY3JlbWVudCBwUHJlZCBwdHIKLSAgICAgICAgCi0gICAgICAgIFBLSEJUICAgRGVsdGFWYWwxLHRtcERlbHRhVmFsLERlbHRhVmFsMixMU0wgIzE2ICAgICA7Ly8gRGVsdGF2YWwxID0gW0MgQV0gICAKLSAgICAgICAgUEtIVEIgICBEZWx0YVZhbDIsRGVsdGFWYWwyLHRtcERlbHRhVmFsLEFTUiAjMTYgICAgIDsvLyBEZWx0YVZhbDIgPSBbRCBCXQotICAgICAgICAKLSAgICAgICAgVVhUQjE2ICBQcmVkVmFsMSxQcmVkVmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBQcmVkVmFsMSA9IFswYzBhXQotICAgICAgICBVWFRCMTYgIFByZWRWYWwyLFByZWRWYWwsUk9SICM4ICAgICAgICAgICAgICAgICAgICAgOy8vIFByZWRWYWwyID0gWzBkMGJdCi0gICAgICAgIAotICAgICAgICBMRFJHVCAgIFByZWRWYWwsW3BQcmVkVGVtcF0gICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFByZSBsb2FkCi0gICAgICAgIAotICAgICAgICBRQUREMTYgIHN1bTIsRGVsdGFWYWwyLFByZWRWYWwyICAgICAgICAgICAgICAgICAgICAgOy8vIEFkZCBhbmQgc2F0dXJhdGUgdG8gMTYgYml0cwotICAgICAgICBRQUREMTYgIHN1bTEsRGVsdGFWYWwxLFByZWRWYWwxCi0gICAgICAgIAotICAgICAgICBVU0FUMTYgIHN1bTIsIzgsc3VtMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGFybUNsaXAoMCwyNTUsc3VtMikKLSAgICAgICAgVVNBVDE2ICBzdW0xLCM4LHN1bTEKLSAgICAgICAgCi0gICAgICAgIExETUdUSUEgICBwRGVsdGEhLHt0bXBEZWx0YVZhbCxEZWx0YVZhbDJ9ICAgICAgICAgICA7Ly8gUHJlIGxvYWQKLSAgICAgICAgICAKLSAgICAgICAgT1JSICAgICBzdW0xLHN1bTEsc3VtMixMU0wgIzggICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0xID0gW2RjYmFdCi0gICAgICAgIFNUUiAgICAgc3VtMSxbcERzdFRlbXBdCi0gICAgICAgIAotICAgICAgICBBREQgICAgIHBEc3RUZW1wLHBEc3RUZW1wLGRzdFN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIEluY3JlbWVudCBwRHN0IHB0cgotICAgICAgICBCR1QgICAgIFByZWRQbHVzRGVsdGFMb29wICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gU2V0IHJldHVybiB2YWx1ZQotICAgICAgICBNT1YgICAgIHJlc3VsdCwjT01YX1N0c19Ob0VycgotICAgICAgICAKLUVuZCAgICAgICAgICAgICAgICAKLQotICAgICAgICAKLSAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIHRhaWwKLSAgICAgICAgCi0gICAgICAgIE1fRU5ECi0gICAgICAgIAotICAgIEVORElGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL0FSTTExMzZKUyAgIAotICAgIAotICAgIAotOy8vIEZ1bmN0aW9uOiBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkICAgICAgICAgICAgCi0gICAgCi07Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCi0gICAgCi0gICAgCi0gICAgICAgICAKLSAgICAgICAgICAgIAotICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NDA0MTguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MucworKysgL2Rldi9udWxsCkBAIC0xLDM1MCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotCi0gICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLSAgICAgICAgCi0gICAgICAgIElGIEFSTTExMzZKUwotICAgICAgICAKLU1BU0tfMCAgICAgIEVRVSAweDAwMDAwMDAwICAgCi1NQVNLXzEgICAgICBFUVUgMHgwMTAxMDEwMQotTE9PUF9DT1VOVCAgRVFVIDB4NTAwMDAwMDAKLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi0KLXBTcmNEc3QgICAgIFJOIDAKLXNyY2RzdFN0ZXAgIFJOIDEKLXBBbHBoYUFyZyAgIFJOIDIKLXBCZXRhQXJnICAgIFJOIDMKLQotcFRocmVzaG9sZHMgUk4gNgotcEJTICAgICAgICAgUk4gOQotcFEwICAgICAgICAgUk4gMAotYlMgICAgICAgICAgUk4gMTAKLQotYWxwaGEgICAgICAgUk4gNgotYWxwaGEwICAgICAgUk4gNgotYWxwaGExICAgICAgUk4gOAotCi1iZXRhICAgICAgICBSTiA3Ci1iZXRhMCAgICAgICBSTiA3Ci1iZXRhMSAgICAgICBSTiA5Ci0KLTsvLyBEZWNsYXJlIExvY2FsL1RlbXBvcmFyeSB2YXJpYWJsZXMKLQotOy8vIFBpeGVscwotcF8wICAgICAgICAgUk4gMyAgCi1wXzEgICAgICAgICBSTiA1ICAKLXFfMCAgICAgICAgIFJOIDggIAotcV8xICAgICAgICAgUk4gOSAgCi0KLTsvLyBGaWx0ZXJpbmcKLQotZHAwcTAgICAgICAgUk4gMTIKLWRwMXAwICAgICAgIFJOIDEyCi1kcTFxMCAgICAgICBSTiAxMgotCi1hcDBxMCAgICAgICBSTiA0ICAKLWZpbHQgICAgICAgIFJOIDIKLSAgICAgICAgCi1tMDAgICAgICAgICBSTiAxNAotbTAxICAgICAgICAgUk4gMTEKLSAgICAgICAgICAgIAotcFEwICAgICAgICAgUk4gMAotU3RlcCAgICAgICAgUk4gMQotICAgICAgICAgICAgCi07Ly8gT3V0cHV0Ci0gICAgICAgICAgICAKLVBfMCAgICAgICAgIFJOIDYKLVFfMCAgICAgICAgIFJOIDcgCi0KLTsvL0RlY2xhcmF0aW9ucyBmb3IgYlNMVDQga2VybmVsCi0KLXRDICAgICAgICAgIFJOIDEyCi10QzAgICAgICAgICBSTiA1Ci10QzEgICAgICAgICBSTiAxMgotcG9zICAgICAgICAgUk4gNQotbmVnICAgICAgICAgUk4gOQotCi07Ly9EZWNsYXJhdGlvbnMgZm9yIGJTR0U0IGtlcm5lbAotCi0KLTsvLyBNaXNjZWxsYW5vdXMKLVhZICAgICAgICAgIFJOIDgKLQotYSAgICAgICAgICAgUk4gMTAKLXQxICAgICAgICAgIFJOIDEwCi10MiAgICAgICAgICBSTiAxMgotdDMgICAgICAgICAgUk4gMTQKLXQ0ICAgICAgICAgIFJOIDYKLXQ1ICAgICAgICAgIFJOIDUKLQotICAgICAgICAKLSAgICAgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSAKLSAgICAgICAgTV9BTExPQzQgcHBUaHJlc2hvbGRzLDQKLSAgICAgICAgTV9BTExPQzggcEFscGhhQmV0YTAsOAotICAgICAgICBNX0FMTE9DOCBwQWxwaGFCZXRhMSw4Ci0gICAgICAgIE1fQUxMT0M4IHBYWUJTLDQKLSAgICAgICAgTV9BTExPQzQgcHBCUyw0Ci0gICAgICAgIAotICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSwgcjExCi0gICAgICAgIAotICAgICAgICA7Ly9JbnB1dCBhcmd1bWVudHMgb24gdGhlIHN0YWNrCi0gICAgICAgIE1fQVJHICAgcHBUaHJlc2hvbGRzQXJnLCA0Ci0gICAgICAgIE1fQVJHICAgcHBCU0FyZywgNAotICAgICAgICAKLSAgICAgICAgTERSQiAgICBhbHBoYTEsIFtwQWxwaGFBcmcsIzFdCi0gICAgICAgIExEUkIgICAgYmV0YTEsICBbcEJldGFBcmcsIzFdCi0gICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkc0FyZwotICAgICAgICBMRFIgICAgIGEsPU1BU0tfMQotICAgICAgICBMRFJCICAgIGJldGEwLCAgW3BCZXRhQXJnXQotICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKLSAgICAgICAgTERSQiAgICBhbHBoYTAsIFtwQWxwaGFBcmddCi0KLSAgICAgICAgTVVMICAgICBhbHBoYTEsIGFscGhhMSwgYQotICAgICAgICBNVUwgICAgIGJldGExLCBiZXRhMSwgYQotICAgICAgICBNVUwgICAgIGFscGhhMCwgYWxwaGEwLCBhCi0gICAgICAgIE1VTCAgICAgYmV0YTAsIGJldGEwLCBhCi0KLSAgICAgICAgTV9TVFJEICBhbHBoYTEsIGJldGExLCBwQWxwaGFCZXRhMQotICAgICAgICBNX0xEUiAgIHBCUywgcHBCU0FyZwotICAgICAgICBNX1NUUkQgIGFscGhhMCwgYmV0YTAsIHBBbHBoYUJldGEwCi0KLSAgICAgICAgTERSICAgICBYWSw9TE9PUF9DT1VOVAotICAgICAgICBNX1NUUkQgIFhZLCBwQlMsIHBYWUJTCi0KLSAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcCwgTFNMICMxCi1Mb29wWQotTG9vcFgKLTsvLy0tLS0tLS0tLS0tLS0tLUxvYWQgUGl4ZWxzLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBMRFJIICAgIGJTLCBbcEJTXSwgIzIKLSAgICAgICAgCi0gICAgICAgIE1fU1RSICAgcEJTLCBwcEJTCi0gICAgICAgIE1fTERSICAgcF8xLCBbcFEwXSxzcmNkc3RTdGVwCi0KLSAgICAgICAgQ01QICAgICBiUywgIzAKLSAgICAgICAgCi0gICAgICAgIE1fTERSICAgcF8wLCBbcFEwXSxzcmNkc3RTdGVwCi0gICAgICAgIE1fTERSICAgcV8wLCBbcFEwXSxzcmNkc3RTdGVwCi0gICAgICAgIE1fTERSICAgcV8xLCBbcFEwXQotICAgICAgICBMRFIgICAgIG0wMSwgPU1BU0tfMSAgICAgICAgICAgICAgICA7Ly8gIDAxMDEwMTAxIG1hc2sgCi0gICAgICAgIEJFUSAgICAgTm9GaWx0ZXJCUzAKLQotICAgICAgICAKLSAgICAgICAgOy8vIHBfMCA9IFtyM3AwIHIycDAgcjFwMCByMHAwXQotICAgICAgICA7Ly8gcF8xID0gW3IzcDEgcjJwMSByMXAxIHIwcDFdCi0gICAgICAgIDsvLyBxXzAgPSBbcjNxMCByMnEwIHIxcTAgcjBxMF0KLSAgICAgICAgOy8vIHFfMSA9IFtyM3ExIHIycTEgcjFxMSByMHExXQotCi07Ly8tLS0tLS0tLS0tLS0tLUZpbHRlcmluZyBEZWNpc2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIE1PViAgICAgbTAwLCAjTUFTS18wICAgICAgICAgICAgICAgIDsvLyAgMDAwMDAwMDAgbWFzayAKLQotICAgICAgICBNT1YgICAgIGZpbHQsIG0wMQotICAgICAgICBUU1QgICAgIGJTLCAjMHhmZjAwCi0gICAgICAgIE1PVkVRICAgZmlsdCwgZmlsdCwgTFNSICMxNgotICAgICAgICBUU1QgICAgIGJTLCAjMHhmZgotICAgICAgICBNT1ZFUSAgIGZpbHQsIGZpbHQsIExTTCAjMTYKLSAgICAgICAgVFNUICAgICBiUywgIzQKLQotICAgICAgICAKLSAgICAgICAgOy8vIENoZWNrIHxwMC1xMHw8QWxwaGEgCi0gICAgICAgIFVTVUI4ICAgZHAwcTAsIHBfMCwgcV8wIAotICAgICAgICBVU1VCOCAgIGEsIHFfMCwgcF8wCi0gICAgICAgIFNFTCAgICAgYXAwcTAsIGEsIGRwMHEwCi0gICAgICAgIFVTVUI4ICAgYSwgYXAwcTAsIGFscGhhCi0gICAgICAgIFNFTCAgICAgZmlsdCwgbTAwLCBmaWx0Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBDaGVjayB8cDEtcDB8PEJldGEgCi0gICAgICAgIFVTVUI4ICAgZHAxcDAsIHBfMSwgcF8wCi0gICAgICAgIFVTVUI4ICAgYSwgcF8wLCBwXzEKLSAgICAgICAgU0VMICAgICBhLCBhLCBkcDFwMAotICAgICAgICBVU1VCOCAgIGEsIGEsIGJldGEKLSAgICAgICAgU0VMICAgICBmaWx0LCBtMDAsIGZpbHQKLQotICAgICAgICA7Ly8gQ2hlY2sgfHExLXEwfDxCZXRhIAotICAgICAgICBVU1VCOCAgIGRxMXEwLCBxXzEsIHFfMAotICAgICAgICBVU1VCOCAgIGEsIHFfMCwgcV8xCi0gICAgICAgIFNFTCAgICAgYSwgYSwgZHExcTAKLSAgICAgICAgVVNVQjggICBhLCBhLCBiZXRhCi0gICAgICAgIFNFTCAgICAgZmlsdCwgbTAwLCBmaWx0Ci0KLSAgICAgICAgQkVRICAgICBiU0xUNCAgICAgICAgCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tRmlsdGVyLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWJTR0U0ICAgICAgICAKLSAgICAgICAgOy8vLS0tLS0tLS0tYlNHRTQgRXhlY3V0aW9uLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIENNUCAgICAgZmlsdCwgIzAKLQotICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKLQotICAgICAgICA7Ly8gQ29tcHV0ZSBQMGIKLSAgICAgICAgVUhBREQ4ICB0MSwgcF8wLCBxXzEKLSAgICAgICAgQkVRICAgICBOb0ZpbHRlckZpbHQwCi0gICAgICAgIE1WTiAgICAgdDIsIHBfMQotICAgICAgICBVSFNVQjggIHQxLCB0MSwgdDIKLSAgICAgICAgVVNVQjggICB0MiwgZmlsdCwgbTAxCi0gICAgICAgIEVPUiAgICAgdDEsIHQxLCBtMDEsIExTTCAjNwotCi0gICAgICAgIEFERCAgICAgcFRocmVzaG9sZHMscFRocmVzaG9sZHMsICMyCi0gICAgICAgIAotICAgICAgICA7Ly8gQ29tcHV0ZSBRMGIgCi0gICAgICAgIFVIQUREOCAgdDIsIHFfMCwgcF8xCi0gICAgICAgIE1WTiAgICAgdDMsIHFfMQotICAgICAgICBVSFNVQjggIHQyLCB0MiwgdDMKLSAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCi0gICAgICAgIFNFTCAgICAgUF8wLCB0MSwgcF8wCi0gICAgICAgIEVPUiAgICAgdDIsIHQyLCBtMDEsIExTTCAjNwotICAgICAgICBTRUwgICAgIFFfMCwgdDIsIHFfMAotCi0gICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMQotICAgICAgICBCICAgICAgIFN0b3JlUmVzdWx0QW5kRXhpdAotCi07Ly8tLS0tLS0tLS0tIEV4aXQgb2YgTG9vcFggLS0tLS0tLS0tLS0tLS0KLTsvLy0tLS0gZm9yIHRoZSBjYXNlIG9mIG5vIGZpbHRlcmluZyAtLS0tLQotCi1Ob0ZpbHRlckZpbHQwCi1Ob0ZpbHRlckJTMAotICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKLSAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcCwgTFNMICMxCi0gICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAKLSAgICAgICAgQUREICAgICBwUTAsIHBRMCwgIzQKLSAgICAgICAgQUREICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICMyCi0KLSAgICAgICAgOy8vIExvYWQgY291bnRlciBmb3IgTG9vcFgKLSAgICAgICAgTV9MRFJEICBYWSwgcEJTLCBwWFlCUwotICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKLSAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTAKLQotICAgICAgICA7Ly8gQWxpZ24gdGhlIHBvaW50ZXIKLSAgICAgICAgQUREUyAgICBYWSwgWFksIFhZCi0gICAgICAgIE1fU1RSICAgWFksIHBYWUJTCi0gICAgICAgIEJDQyAgICAgTG9vcFkKLSAgICAgICAgQiAgICAgICBFeGl0TG9vcFkKLSAgICAgICAgCi1iU0xUNCAgICAgICAgIAotICAgICAgICA7Ly8tLS0tLS0tLS1iU0xUNCBFeGVjdXRpb24tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgTV9MRFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCi0gICAgICAgIENNUCAgICAgZmlsdCwgIzAKLSAgICAgICAgCi0gICAgICAgIDsvLyBTaW5jZSBiZXRhIDw9IDE4IGFuZCBhbHBoYSA8PSAyNTUgd2Uga25vdwotICAgICAgICA7Ly8gLTI1NCA8PSBwMC1xMCA8PSAyNTQKLSAgICAgICAgOy8vICAtMTcgPD0gcTEtcTAgPD0gMTcKLSAgICAgICAgOy8vICAtMTcgPD0gcDEtcDAgPD0gMTcKLQotICAgICAgICA7Ly8gZGVsdGEgPSBDbGlwMyggLXRDLCB0QywgKCgoKHEwLXAwKTw8MikgKyAocDEtcTEpICsgNCk+PjMpKQotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLyAgICBDYWxjdWxhdGUgQSA9ICgoKHEwLXAwKTw8MikgKyAocDEtcTEpICsgNCk+PjMKLSAgICAgICAgOy8vICAgICAgICAgICAgICAgID0gKDQqcTAgLSA0KnAwICsgcDEgLSBxMSArIDQpPj4zCi0gICAgICAgIDsvLyAgICAgICAgICAgICAgICA9ICgocDEtcDApIC0gKHExLXEwKSAtIDMqKHAwLXEwKSArIDQpPj4zCi0KLSAgICAgICAgVVNVQjggICB0MSwgcF8xLCBwXzAKLSAgICAgICAgVVNVQjggICB0MiwgcV8xLCBxXzAKLSAgICAgICAgQkVRICAgICBOb0ZpbHRlckZpbHQwCi0gICAgICAgIAotICAgICAgICBMRFJCICAgIHRDMCwgW3BUaHJlc2hvbGRzXSwjMQotICAgICAgICBTU1VCOCAgIHQxLCB0MSwgdDIKLSAgICAgICAgTERSQiAgICB0QzEsIFtwVGhyZXNob2xkc10sIzEKLSAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCi0gICAgICAgIFVIU1VCOCAgdDQsIHBfMCwgcV8wCi0gICAgICAgIE9SUiAgICAgdEMsIHRDMCwgdEMxLCBMU0wgIzE2Ci0gICAgICAgIFVTVUI4ICAgdDUsIHBfMCwgcV8wCi0gICAgICAgIEFORCAgICAgdDUsIHQ1LCBtMDEKLSAgICAgICAgU0hTVUI4ICB0MSwgdDEsIHQ1Ci0gICAgICAgIE9SUiAgICAgdEMsIHRDLCBMU0wgIzggICAgICAgIAotICAgICAgICBTU1VCOCAgIHQxLCB0MSwgdDUKLSAgICAgICAgU0hTVUI4ICB0MSwgdDEsIHQ0Ci0gICAgICAgIFVRQUREOCAgdEMsIHRDLCBtMDEKLSAgICAgICAgU0FERDggICB0MSwgdDEsIG0wMQotICAgICAgICBVU1VCOCAgIHQ1LCBmaWx0LCBtMDEgICAKLSAgICAgICAgU0hTVUI4ICB0MSwgdDEsIHQ0Ci0gICAgICAgIFNFTCAgICAgdEMsIHRDLCBtMDAKLQotICAgICAgICA7Ly8gU3BsaXQgaW50byBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgcGFydCBhbmQgY2xpcCAKLQotICAgICAgICBTU1VCOCAgIHQxLCB0MSwgbTAwCi0gICAgICAgIFNFTCAgICAgcG9zLCB0MSwgbTAwCi0gICAgICAgIFVTVUI4ICAgbmVnLCBwb3MsIHQxCi0gICAgICAgIFVTVUI4ICAgdDMsIHBvcywgdEMKLSAgICAgICAgU0VMICAgICBwb3MsIHRDLCBwb3MKLSAgICAgICAgVVNVQjggICB0MywgbmVnLCB0QwotICAgICAgICBTRUwgICAgIG5lZywgdEMsIG5lZwotICAgICAgICBVUUFERDggIFBfMCwgcF8wLCBwb3MKLSAgICAgICAgVVFTVUI4ICBRXzAsIHFfMCwgcG9zCi0gICAgICAgIFVRU1VCOCAgUF8wLCBQXzAsIG5lZwotICAgICAgICBVUUFERDggIFFfMCwgUV8wLCBuZWcKLSAgICAgICAgCi0gICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMQotCi0gICAgICAgIDsvLyBDaG9vc2UgdG8gc3RvcmUgdGhlIGZpbHRlcmVkCi0gICAgICAgIDsvLyB2YWx1ZSBvciB0aGUgb3JpZ2luYWwgcGl4ZWwKLSAgICAgICAgVVNVQjggICB0MSwgZmlsdCwgbTAxICAgIAotICAgICAgICBTRUwgICAgIFBfMCwgUF8wLCBwXzAKLSAgICAgICAgU0VMICAgICBRXzAsIFFfMCwgcV8wCi0gICAgCi1TdG9yZVJlc3VsdEFuZEV4aXQKLQotICAgICAgICA7Ly8tLS0tLS0tLS1TdG9yZSByZXN1bHQtLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICA7Ly8gUF8wID0gW3IwcDAgcjFwMCByMnAwIHIzcDBdCi0gICAgICAgIDsvLyBRXzAgPSBbcjBxMCByMXEwIHIycTAgcjNxMF0KLQotICAgICAgICBNX1NUUiAgIFBfMCwgW3BRMF0sIHNyY2RzdFN0ZXAKLSAgICAgICAgU1RSICAgICBRXzAsIFtwUTBdLCAjNAotCi0gICAgICAgIE1fTERSRCAgWFksIHBCUywgcFhZQlMKLSAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTAKLQotICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzEKLQotICAgICAgICBBRERTICAgIFhZLCBYWSwgWFkKLSAgICAgICAgTV9TVFIgICBYWSwgcFhZQlMKLSAgICAgICAgQkNDICAgICBMb29wWAotCi07Ly8tLS0tLS0tLSBDb21tb24gRXhpdCBvZiBMb29wWSAtLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICA7Ly8gQWxpZ24gdGhlIHBvaW50ZXJzIAotCi1FeGl0TG9vcFkKLSAgICAgICAgQUREICAgICBwQlMsIHBCUywgIzQKLSAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTEKLSAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgIzgKLSAgICAgICAgQUREICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcCwgTFNMICMyCi0gICAgICAgIE1fU1RSRCAgYWxwaGEsIGJldGEsIHBBbHBoYUJldGEwCi0KLSAgICAgICAgQk5FICAgICBMb29wWQotICAgICAgICBNT1YgICAgIHIwLCAjT01YX1N0c19Ob0VycgotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLUVuZCBGaWx0ZXItLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBNX0VORAotCi0gICAgRU5ESUYgICAgICAgIAotCi0gICAgICAgIEVORAotICAgICAgICAKLSAgICAgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRjOTM2OS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsNDUxICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotCi0gICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLQotICAgICAgICBJRiBBUk0xMTM2SlMKLSAgICAgICAgCi0gICAgICAgIAotTUFTS18wICAgICAgRVFVIDB4MDAwMDAwMDAgICAKLU1BU0tfMSAgICAgIEVRVSAweDAxMDEwMTAxCi1NQVNLXzIgICAgICBFUVUgMHgwMDAwZmYwMAotTE9PUF9DT1VOVCAgRVFVIDB4NTAwMDAwMDAKLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi0KLXBTcmNEc3QgICAgIFJOIDAKLXNyY2RzdFN0ZXAgIFJOIDEKLXBBbHBoYUFyZyAgIFJOIDIKLXBCZXRhQXJnICAgIFJOIDMKLQotcFRocmVzaG9sZHMgUk4gNgotcEJTICAgICAgICAgUk4gOQotcFEwICAgICAgICAgUk4gMAotYlMgICAgICAgICAgUk4gMgotYlNUZW1wICAgICAgUk4gMTAKLQotYWxwaGEgICAgICAgUk4gNgotYWxwaGEwICAgICAgUk4gNgotYWxwaGExICAgICAgUk4gOAotCi1iZXRhICAgICAgICBSTiA3Ci1iZXRhMCAgICAgICBSTiA3Ci1iZXRhMSAgICAgICBSTiA5Ci0KLTsvLyBEZWNsYXJlIExvY2FsL1RlbXBvcmFyeSB2YXJpYWJsZXMKLQotOy8vIFBpeGVscwotcF8wICAgICAgICAgUk4gMyAgCi1wXzEgICAgICAgICBSTiA1ICAKLXFfMCAgICAgICAgIFJOIDggIAotcV8xICAgICAgICAgUk4gOSAgCi0KLTsvLyBVbnBhY2tpbmcKLW1hc2sgICAgICAgIFJOIDExIAotCi1yb3cwICAgICAgICBSTiAyCi1yb3cxICAgICAgICBSTiA0Ci1yb3cyICAgICAgICBSTiA1Ci1yb3czICAgICAgICBSTiAzCi0KLXJvdzQgICAgICAgIFJOIDgKLXJvdzUgICAgICAgIFJOIDkKLXJvdzYgICAgICAgIFJOIDEwCi1yb3c3ICAgICAgICBSTiAxMgotCi10dW5wazAgICAgICBSTiAyCi10dW5wazIgICAgICBSTiAxMAotdHVucGszICAgICAgUk4gMTIKLQotdHVucGs0ICAgICAgUk4gNAotdHVucGs1ICAgICAgUk4gNQotdHVucGs2ICAgICAgUk4gMTQKLXR1bnBrNyAgICAgIFJOIDIgCi0KLTsvLyBGaWx0ZXJpbmcKLQotZHAwcTAgICAgICAgUk4gMTIKLWRwMXAwICAgICAgIFJOIDEyCi1kcTFxMCAgICAgICBSTiAxMgotCi1hcDBxMCAgICAgICBSTiA0ICAKLWZpbHQgICAgICAgIFJOIDIKLSAgICAgICAgCi1tMDAgICAgICAgICBSTiAxNAotbTAxICAgICAgICAgUk4gMTEKLSAgICAgICAgICAgIAotcFEwICAgICAgICAgUk4gMAotU3RlcCAgICAgICAgUk4gMQotICAgICAgICAgICAgCi07Ly8gT3V0cHV0Ci0gICAgICAgICAgICAKLVBfMCAgICAgICAgIFJOIDYKLVFfMCAgICAgICAgIFJOIDcgCi0KLTsvL0RlY2xhcmF0aW9ucyBmb3IgYlNMVDQga2VybmVsCi0KLXRDICAgICAgICAgIFJOIDEyCi10QzAgICAgICAgICBSTiA1Ci10QzEgICAgICAgICBSTiAxMgotcG9zICAgICAgICAgUk4gNQotbmVnICAgICAgICAgUk4gOQotCi07Ly9EZWNsYXJhdGlvbnMgZm9yIGJTR0U0IGtlcm5lbAotCi0KLTsvLyBNaXNjZWxsYW5vdXMKLVhZICAgICAgICAgIFJOIDgKLQotYSAgICAgICAgICAgUk4gMTAKLXQxICAgICAgICAgIFJOIDEwCi10MiAgICAgICAgICBSTiAxMgotdDMgICAgICAgICAgUk4gMTQKLXQ0ICAgICAgICAgIFJOIDYKLXQ1ICAgICAgICAgIFJOIDUKLQotCi0gICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgCi0gICAgICAgIE1fQUxMT0M0IHBwVGhyZXNob2xkcyw0Ci0gICAgICAgIE1fQUxMT0M4IHBBbHBoYUJldGEwLDgKLSAgICAgICAgTV9BTExPQzggcEFscGhhQmV0YTEsOAotICAgICAgICBNX0FMTE9DOCBwWFlCUyw0Ci0gICAgICAgIE1fQUxMT0M0IHBwQlMsNAotICAgICAgICAKLSAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0ksIHIxMQotICAgICAgICAKLSAgICAgICAgOy8vSW5wdXQgYXJndW1lbnRzIG9uIHRoZSBzdGFjawotICAgICAgICBNX0FSRyAgIHBwVGhyZXNob2xkc0FyZywgNAotICAgICAgICBNX0FSRyAgIHBwQlNBcmcsIDQKLSAgICAgICAgCi0gICAgICAgIExEUkIgICAgYWxwaGExLCBbcEFscGhhQXJnLCMxXQotICAgICAgICBMRFJCICAgIGJldGExLCAgW3BCZXRhQXJnLCMxXQotICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHNBcmcKLSAgICAgICAgTERSICAgICBhLD1NQVNLXzEKLSAgICAgICAgTERSQiAgICBiZXRhMCwgIFtwQmV0YUFyZ10KLSAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCi0gICAgICAgIExEUkIgICAgYWxwaGEwLCBbcEFscGhhQXJnXQotCi0gICAgICAgIE1VTCAgICAgYWxwaGExLCBhbHBoYTEsIGEKLSAgICAgICAgTVVMICAgICBiZXRhMSwgYmV0YTEsIGEKLSAgICAgICAgTVVMICAgICBhbHBoYTAsIGFscGhhMCwgYQotICAgICAgICBNVUwgICAgIGJldGEwLCBiZXRhMCwgYQotCi0gICAgICAgIE1fU1RSRCAgYWxwaGExLCBiZXRhMSwgcEFscGhhQmV0YTEKLSAgICAgICAgTV9MRFIgICBwQlMsIHBwQlNBcmcKLSAgICAgICAgTV9TVFJEICBhbHBoYTAsIGJldGEwLCBwQWxwaGFCZXRhMAotCi0gICAgICAgIExEUiAgICAgWFksPUxPT1BfQ09VTlQKLSAgICAgICAgTV9TVFJEICBYWSwgcEJTLCBwWFlCUwotICAgICAgICAKLSAgICAgICAgCi1Mb29wWQotTG9vcFgKLTsvLy0tLS0tLS0tLS0tLS0tLUxvYWQgUGl4ZWxzLS0tLS0tLS0tLS0tLS0tLS0tLQotCi07Ly8tLS0tLS0tLS0tLS0tLS0tUGFjayBxMC1xMS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIExEUkggICAgYlMsIFtwQlNdLCAjOAotICAgICAgICBMRFIgICAgIG1hc2ssID1NQVNLXzIKLQotICAgICAgICBNX0xEUkggIHJvdzQsIFtwUTBdLCBzcmNkc3RTdGVwCi0gICAgICAgIENNUCAgICAgYlMsICMwCi0gICAgICAgIE1fU1RSICAgcEJTLCBwcEJTCi0gICAgICAgIE1fTERSSCAgcm93NSwgW3BRMF0sIHNyY2RzdFN0ZXAKLSAgICAgICAgQkVRLlcgICBOb0ZpbHRlckJTMAotICAgICAgICBMRFJIICAgIHJvdzYsIFtwUTBdCi0gICAgICAgIExEUkggICAgcm93NywgW3BRMCwgc3JjZHN0U3RlcF0KLQotICAgICAgICA7Ly8gcm93NCA9IFswIDAgcjBxMCByMHExXQotICAgICAgICA7Ly8gcm93NSA9IFswIDAgcjFxMCByMXExXQotICAgICAgICA7Ly8gcm93NiA9IFswIDAgcjJxMCByMnExXQotICAgICAgICA7Ly8gcm93NyA9IFswIDAgcjNxMCByM3ExXQotCi0gICAgICAgIEFORCAgICAgdHVucGs0LCBtYXNrLCByb3c0Ci0gICAgICAgIEFORCAgICAgdHVucGs1LCBtYXNrLCByb3c0LCBMU0wjOAotICAgICAgICBVWFRBQiAgIHR1bnBrNCwgdHVucGs0LCByb3c1LCBST1IjOAotICAgICAgICBVWFRBQiAgIHR1bnBrNSwgdHVucGs1LCByb3c1Ci0gICAgICAgIEFORCAgICAgdHVucGs2LCBtYXNrLCByb3c2Ci0gICAgICAgIEFORCAgICAgdHVucGs3LCBtYXNrLCByb3c2LCBMU0wjOAotICAgICAgICBVWFRBQiAgIHR1bnBrNiwgdHVucGs2LCByb3c3LCBST1IjOAotICAgICAgICBVWFRBQiAgIHR1bnBrNywgdHVucGs3LCByb3c3Ci0KLSAgICAgICAgOy8vIHR1bnBrNCA9IFswIDAgcjBxMCByMXEwXQotICAgICAgICA7Ly8gdHVucGs1ID0gWzAgMCByMHExIHIxcTFdCi0gICAgICAgIDsvLyB0dW5wazYgPSBbMCAwIHIycTAgcjNxMF0KLSAgICAgICAgOy8vIHR1bnBrNyA9IFswIDAgcjJxMSByM3ExXQotCi0gICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMQotICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCAjMgotCi0gICAgICAgIFBLSEJUICAgcV8xLCB0dW5wazYsIHR1bnBrNCwgTFNMIzE2Ci0gICAgICAgIFBLSEJUICAgcV8wLCB0dW5wazcsIHR1bnBrNSwgTFNMIzE2Ci0KLSAgICAgICAgOy8vIHFfMCA9IFtyMHEwIHIxcTAgcjJxMCByM3EwXQotICAgICAgICA7Ly8gcV8xID0gW3IwcTEgcjFxMSByMnExIHIzcTFdCi0KLQotOy8vLS0tLS0tLS0tLS0tLS0tLVBhY2sgcDAtcDEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIE1fTERSSCAgcm93MCwgW3BRMF0sIHNyY2RzdFN0ZXAgICAgICAgICAgCi0gICAgICAgIE1fTERSSCAgcm93MSwgW3BRMF0sIHNyY2RzdFN0ZXAgICAgICAgICAgCi0gICAgICAgIExEUkggICAgcm93MiwgW3BRMF0KLSAgICAgICAgTERSSCAgICByb3czLCBbcFEwLCBzcmNkc3RTdGVwXQotICAgICAgICAKLSAgICAgICAgOy8vIHJvdzAgPSBbMCAwIHIwcDAgcjBwMV0KLSAgICAgICAgOy8vIHJvdzEgPSBbMCAwIHIxcDAgcjFwMV0KLSAgICAgICAgOy8vIHJvdzIgPSBbMCAwIHIycDAgcjJwMV0KLSAgICAgICAgOy8vIHJvdzMgPSBbMCAwIHIzcDAgcjNwMV0KLQotICAgICAgICBBTkQgICAgIHR1bnBrMiwgbWFzaywgcm93MAotICAgICAgICBBTkQgICAgIHR1bnBrNiwgbWFzaywgcm93MCwgTFNMIzgKLSAgICAgICAgVVhUQUIgICB0dW5wazIsIHR1bnBrMiwgcm93MSwgUk9SIzgKLSAgICAgICAgVVhUQUIgICB0dW5wazYsIHR1bnBrNiwgcm93MQotCi0gICAgICAgIEFORCAgICAgdHVucGswLCBtYXNrLCByb3cyCi0gICAgICAgIEFORCAgICAgdHVucGszLCBtYXNrLCByb3cyLCBMU0wjOAotICAgICAgICBVWFRBQiAgIHR1bnBrMCwgdHVucGswLCByb3czLCBST1IjOAotICAgICAgICBVWFRBQiAgIHR1bnBrMywgdHVucGszLCByb3czCi0KLSAgICAgICAgOy8vIHR1bnBrMiA9IFswIDAgcjBwMCByMXAwXQotICAgICAgICA7Ly8gdHVucGs2ID0gWzAgMCByMHAxIHIxcDFdCi0gICAgICAgIDsvLyB0dW5wazAgPSBbMCAwIHIycDAgcjNwMF0KLSAgICAgICAgOy8vIHR1bnBrMyA9IFswIDAgcjJwMSByM3AxXQotCi0gICAgICAgIFBLSEJUICAgcF8wLCB0dW5wazAsIHR1bnBrMiwgTFNMIzE2Ci0gICAgICAgIE1fTERSICAgYlNUZW1wLCBwcEJTCi0gICAgICAgIFBLSEJUICAgcF8xLCB0dW5wazMsIHR1bnBrNiwgTFNMIzE2Ci0KLSAgICAgICAgOy8vIHBfMCA9IFtyMHAwIHIxcDAgcjJwMCByM3AwXQotICAgICAgICA7Ly8gcF8xID0gW3IwcDEgcjFwMSByMnAxIHIzcDFdCi0KLTsvLy0tLS0tLS0tLS0tLS0tRmlsdGVyaW5nIERlY2lzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgVVNVQjggICBkcDBxMCwgcF8wLCBxXzAgCi0gICAgICAgIExEUiAgICAgbTAxLCA9TUFTS18xCi0gICAgICAgIExEUkggICAgYlNUZW1wLCBbYlNUZW1wICwjLThdCi0gICAgICAgIE1PViAgICAgbTAwLCAjTUFTS18wICAgICAgICAgICAgICAgIDsvLyAgMDAwMDAwMDAgbWFzayAKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgZmlsdCwgbTAxCi0gICAgICAgIFRTVCAgICAgYlNUZW1wLCAjMHhmZjAwCi0gICAgICAgIE1PVkVRICAgZmlsdCwgZmlsdCwgTFNMICMxNgotICAgICAgICBUU1QgICAgIGJTVGVtcCwgIzB4ZmYKLSAgICAgICAgTU9WRVEgICBmaWx0LCBmaWx0LCBMU1IgIzE2Ci0gICAgICAgIFRTVCAgICAgYlNUZW1wLCAjNAotCi0gICAgICAgIDsvLyBDaGVjayB8cDAtcTB8PEFscGhhIAotICAgICAgICBVU1VCOCAgIGEsIHFfMCwgcF8wCi0gICAgICAgIFNFTCAgICAgYXAwcTAsIGEsIGRwMHEwCi0gICAgICAgIFVTVUI4ICAgYSwgYXAwcTAsIGFscGhhCi0gICAgICAgIFNFTCAgICAgZmlsdCwgbTAwLCBmaWx0Ci0gICAgICAgIAotICAgICAgICA7Ly8gQ2hlY2sgfHAxLXAwfDxCZXRhIAotICAgICAgICBVU1VCOCAgIGRwMXAwLCBwXzEsIHBfMAotICAgICAgICBVU1VCOCAgIGEsIHBfMCwgcF8xCi0gICAgICAgIFNFTCAgICAgYSwgYSwgZHAxcDAKLSAgICAgICAgVVNVQjggICBhLCBhLCBiZXRhCi0gICAgICAgIFNFTCAgICAgZmlsdCwgbTAwLCBmaWx0Ci0KLSAgICAgICAgOy8vIENoZWNrIHxxMS1xMHw8QmV0YSAKLSAgICAgICAgVVNVQjggICBkcTFxMCwgcV8xLCBxXzAKLSAgICAgICAgVVNVQjggICBhLCBxXzAsIHFfMQotICAgICAgICBTRUwgICAgIGEsIGEsIGRxMXEwCi0gICAgICAgIFVTVUI4ICAgYSwgYSwgYmV0YQotICAgICAgICBTRUwgICAgIGZpbHQsIG0wMCwgZmlsdAotCi0gICAgICAgIEJFUSAgICAgYlNMVDQgICAgICAgIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLUZpbHRlci0tLS0tLS0tLS0tLS0tLS0tLS0tCi1iU0dFNCAgICAgICAgCi0gICAgICAgIDsvLy0tLS0tLS0tLWJTR0U0IEV4ZWN1dGlvbi0tLS0tLS0tLS0tLS0tLQotICAgICAgICBDTVAgICAgIGZpbHQsICMwCi0KLSAgICAgICAgTV9MRFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCi0KLSAgICAgICAgOy8vIENvbXB1dGUgUDBiCi0gICAgICAgIFVIQUREOCAgdDEsIHBfMCwgcV8xCi0gICAgICAgIEJFUSAgICAgTm9GaWx0ZXJGaWx0MAotICAgICAgICBNVk4gICAgIHQyLCBwXzEKLSAgICAgICAgVUhTVUI4ICB0MSwgdDEsIHQyCi0gICAgICAgIFVTVUI4ICAgdDIsIGZpbHQsIG0wMQotICAgICAgICBFT1IgICAgIHQxLCB0MSwgbTAxLCBMU0wgIzcKLQotICAgICAgICBBREQgICAgIHBUaHJlc2hvbGRzLHBUaHJlc2hvbGRzLCAjNAotICAgICAgICAKLSAgICAgICAgOy8vIENvbXB1dGUgUTBiIAotICAgICAgICBVSEFERDggIHQyLCBxXzAsIHBfMQotICAgICAgICBNVk4gICAgIHQzLCBxXzEKLSAgICAgICAgVUhTVUI4ICB0MiwgdDIsIHQzCi0gICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcwotICAgICAgICBTRUwgICAgIFBfMCwgdDEsIHBfMAotICAgICAgICBFT1IgICAgIHQyLCB0MiwgbTAxLCBMU0wgIzcKLSAgICAgICAgU0VMICAgICBRXzAsIHQyLCBxXzAKLQotICAgICAgICBCICAgICAgIFN0b3JlUmVzdWx0QW5kRXhpdAotCi07Ly8tLS0tLS0tLS0tIEV4aXQgb2YgTG9vcFggLS0tLS0tLS0tLS0tLS0KLTsvLy0tLS0gZm9yIHRoZSBjYXNlIG9mIG5vIGZpbHRlcmluZyAtLS0tLQotCi1Ob0ZpbHRlckZpbHQwCi0gICAgICAgIEFERCAgICAgcFEwLCBwUTAsICMyCi1Ob0ZpbHRlckJTMAotICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKLSAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcCwgTFNMICMxCi0gICAgICAgIEFERCAgICAgcFEwLCBwUTAsICM0Ci0gICAgICAgIEFERCAgICAgcFRocmVzaG9sZHMsIHBUaHJlc2hvbGRzLCAjNAotICAgICAgICA7Ly8gTG9hZCBjb3VudGVyIGZvciBMb29wWAotICAgICAgICBNX0xEUkQgIFhZLCBwQlMsIHBYWUJTCi0gICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcwotICAgICAgICBNX0xEUkQgIGFscGhhLCBiZXRhLCBwQWxwaGFCZXRhMQotCi0gICAgICAgIDsvLyBBbGlnbiB0aGUgcG9pbnRlcgotICAgICAgICBBRERTICAgIFhZLCBYWSwgWFkKLSAgICAgICAgTV9TVFIgICBYWSwgcFhZQlMKLSAgICAgICAgQkNDICAgICBMb29wWQotICAgICAgICBCICAgICAgIEV4aXRMb29wWQotICAgICAgICAKLWJTTFQ0ICAgICAgICAKLSAgICAgICAgOy8vLS0tLS0tLS0tYlNMVDQgRXhlY3V0aW9uLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcwotICAgICAgICBDTVAgICAgIGZpbHQsICMwCi0gICAgICAgIAotCi0gICAgICAgIDsvLyBTaW5jZSBiZXRhIDw9IDE4IGFuZCBhbHBoYSA8PSAyNTUgd2Uga25vdwotICAgICAgICA7Ly8gLTI1NCA8PSBwMC1xMCA8PSAyNTQKLSAgICAgICAgOy8vICAtMTcgPD0gcTEtcTAgPD0gMTcKLSAgICAgICAgOy8vICAtMTcgPD0gcDEtcDAgPD0gMTcKLQotICAgICAgICA7Ly8gZGVsdGEgPSBDbGlwMyggLXRDLCB0QywgKCgoKHEwLXAwKTw8MikgKyAocDEtcTEpICsgNCk+PjMpKQotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLyAgICBDYWxjdWxhdGUgQSA9ICgoKHEwLXAwKTw8MikgKyAocDEtcTEpICsgNCk+PjMKLSAgICAgICAgOy8vICAgICAgICAgICAgICAgID0gKDQqcTAgLSA0KnAwICsgcDEgLSBxMSArIDQpPj4zCi0gICAgICAgIDsvLyAgICAgICAgICAgICAgICA9ICgocDEtcDApIC0gKHExLXEwKSAtIDMqKHAwLXEwKSArIDQpPj4zCi0KLSAgICAgICAgVVNVQjggICB0MSwgcF8xLCBwXzAKLSAgICAgICAgVVNVQjggICB0MiwgcV8xLCBxXzAKLSAgICAgICAgQkVRICAgICBOb0ZpbHRlckZpbHQwCi0gICAgICAgIAotICAgICAgICBMRFJCICAgIHRDMCwgW3BUaHJlc2hvbGRzXSwgIzEKLSAgICAgICAgU1NVQjggICB0MSwgdDEsIHQyCi0gICAgICAgIExEUkIgICAgdEMxLCBbcFRocmVzaG9sZHNdLCAjMwotICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKLSAgICAgICAgVUhTVUI4ICB0NCwgcF8wLCBxXzAKLSAgICAgICAgT1JSICAgICB0QywgdEMxLCB0QzAsIExTTCAjMTYKLSAgICAgICAgVVNVQjggICB0NSwgcF8wLCBxXzAKLSAgICAgICAgQU5EICAgICB0NSwgdDUsIG0wMQotICAgICAgICBTSFNVQjggIHQxLCB0MSwgdDUKLSAgICAgICAgT1JSICAgICB0QywgdEMsIExTTCAjOCAgICAgICAgCi0gICAgICAgIFNTVUI4ICAgdDEsIHQxLCB0NQotICAgICAgICBTSFNVQjggIHQxLCB0MSwgdDQKLSAgICAgICAgVVFBREQ4ICB0QywgdEMsIG0wMQotICAgICAgICBTQUREOCAgIHQxLCB0MSwgbTAxCi0gICAgICAgIFVTVUI4ICAgdDUsIGZpbHQsIG0wMSAgIAotICAgICAgICBTSFNVQjggIHQxLCB0MSwgdDQKLSAgICAgICAgU0VMICAgICB0QywgdEMsIG0wMAotCi0gICAgICAgIDsvLyBTcGxpdCBpbnRvIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBwYXJ0IGFuZCBjbGlwIAotCi0gICAgICAgIFNTVUI4ICAgdDEsIHQxLCBtMDAKLSAgICAgICAgU0VMICAgICBwb3MsIHQxLCBtMDAKLSAgICAgICAgVVNVQjggICBuZWcsIHBvcywgdDEKLSAgICAgICAgVVNVQjggICB0MywgcG9zLCB0QwotICAgICAgICBTRUwgICAgIHBvcywgdEMsIHBvcwotICAgICAgICBVU1VCOCAgIHQzLCBuZWcsIHRDCi0gICAgICAgIFNFTCAgICAgbmVnLCB0QywgbmVnCi0gICAgICAgIFVRQUREOCAgUF8wLCBwXzAsIHBvcwotICAgICAgICBVUVNVQjggIFFfMCwgcV8wLCBwb3MKLSAgICAgICAgVVFTVUI4ICBQXzAsIFBfMCwgbmVnCi0gICAgICAgIFVRQUREOCAgUV8wLCBRXzAsIG5lZwotICAgICAgICAKLSAgICAgICAgOy8vIENob29zZSB0byBzdG9yZSB0aGUgZmlsdGVyZWQKLSAgICAgICAgOy8vIHZhbHVlIG9yIHRoZSBvcmlnaW5hbCBwaXhlbAotICAgICAgICBVU1VCOCAgIHQxLCBmaWx0LCBtMDEgICAgCi0gICAgICAgIFNFTCAgICAgUF8wLCBQXzAsIHBfMAotICAgICAgICBTRUwgICAgIFFfMCwgUV8wLCBxXzAKLSAgICAKLVN0b3JlUmVzdWx0QW5kRXhpdAotCi0gICAgICAgIDsvLy0tLS0tLS0tLVN0b3JlIHJlc3VsdC0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIDsvLyBQXzAgPSBbcjBwMCByMXAwIHIycDAgcjNwMF0KLSAgICAgICAgOy8vIFFfMCA9IFtyMHEwIHIxcTAgcjJxMCByM3EwXQotCi0gICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMQotICAgICAgICBBREQgICAgICAgIHBRMCwgcFEwLCAjMSAgICAgIAotIAotICAgICAgICBNT1YgICAgIHQxLCBRXzAsIExTUiAjMjQKLSAgICAgICAgU1RSQiAgICB0MSwgW3BRMCwgIzFdCi0gICAgICAgIE1PViAgICAgdDEsIFBfMCwgTFNSICMyNAotICAgICAgICBNX1NUUkIgIHQxLCBbcFEwXSwgc3JjZHN0U3RlcAotCi0gICAgICAgIE1PViAgICAgdDEsIFFfMCwgTFNSICMxNgotICAgICAgICBTVFJCICAgIHQxLCBbcFEwLCAjMV0KLSAgICAgICAgTU9WICAgICB0MSwgUF8wLCBMU1IgIzE2Ci0gICAgICAgIE1fU1RSQiAgdDEsIFtwUTBdLCBzcmNkc3RTdGVwCi0KLSAgICAgICAgTU9WICAgICB0MSwgUF8wLCBMU1IgIzgKLSAgICAgICAgU1RSQiAgICB0MSwgW3BRMF0KLSAgICAgICAgU1RSQiAgICBQXzAsIFtwUTAsIHNyY2RzdFN0ZXBdCi0gICAgICAgIE1PViAgICAgdDEsIFFfMCwgTFNSICM4Ci0gICAgICAgIFNUUkIgICAgdDEsIFtwUTAsICMxXSEKLSAgICAgICAgU1RSQiAgICBRXzAsIFtwUTAsIHNyY2RzdFN0ZXBdCi0KLSAgICAgICAgTV9MRFJEICBYWSwgcEJTLCBwWFlCUwotICAgICAgICBNX0xEUkQgIGFscGhhLCBiZXRhLCBwQWxwaGFCZXRhMQotCi0gICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMQotICAgICAgICBBREQgICAgIHBRMCwgcFEwLCAjNAotCi0gICAgICAgIEFERFMgICAgWFksIFhZLCBYWQotICAgICAgICBNX1NUUiAgIFhZLCBwWFlCUwotICAgICAgICBCQ0MgICAgIExvb3BYCi0KLTsvLy0tLS0tLS0tIENvbW1vbiBFeGl0IG9mIExvb3BZIC0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIDsvLyBBbGlnbiB0aGUgcG9pbnRlcnMgCi0KLUV4aXRMb29wWQotCi0gICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcwotICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCAjOAotICAgICAgICBBREQgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzIKLSAgICAgICAgU1VCICAgICBwQlMsIHBCUywgIzE0IAotICAgICAgICBTVUIgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzYKLSAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCi0KLSAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTAKLQotICAgICAgICBCTkUgICAgIExvb3BZCi0gICAgICAgIE1PViAgICAgcjAsICNPTVhfU3RzX05vRXJyCi07Ly8tLS0tLS0tLS0tLS0tLS0tLUVuZCBGaWx0ZXItLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIE1fRU5ECi0KLSAgICAgICAgRU5ESUYgICAgICAgIAotCi0gICAgICAgIEVORAotICAgICAgICAKLSAgICAgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGZiZmE0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMzQ1ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLQotICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotCi0gICAgICAgIElNUE9SVCAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQotICAgICAgICBJTVBPUlQgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUKLQotICAgIAotCi0gICAgSUYgQVJNMTEzNkpTCi0KLQotTUFTS18wICAgICAgRVFVIDB4MDAwMDAwMDAgICAKLU1BU0tfMSAgICAgIEVRVSAweDAxMDEwMTAxCi1NQVNLXzIgICAgICBFUVUgMHhmZjAwZmYwMAotTE9PUF9DT1VOVCAgRVFVIDB4MTExMTAwMDAKLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi0KLXBTcmNEc3QgICAgIFJOIDAKLXNyY2RzdFN0ZXAgIFJOIDEKLXBBbHBoYUFyZyAgIFJOIDIKLXBCZXRhQXJnICAgIFJOIDMKLQotcFRocmVzaG9sZHMgUk4gMTQKLXBCUyAgICAgICAgIFJOIDkKLXBRMCAgICAgICAgIFJOIDAKLWJTICAgICAgICAgIFJOIDIKLQotYWxwaGEgICAgICAgUk4gNgotYWxwaGEwICAgICAgUk4gNgotYWxwaGExICAgICAgUk4gOAotCi1iZXRhICAgICAgICBSTiA3Ci1iZXRhMCAgICAgICBSTiA3Ci1iZXRhMSAgICAgICBSTiA5Ci0KLTsvLyBEZWNsYXJlIExvY2FsL1RlbXBvcmFyeSB2YXJpYWJsZXMKLQotOy8vIFBpeGVscwotcF8wICAgICAgICAgUk4gMyAgCi1wXzEgICAgICAgICBSTiA1ICAKLXBfMiAgICAgICAgIFJOIDQgIAotcF8zICAgICAgICAgUk4gMiAgCi1xXzAgICAgICAgICBSTiA4ICAKLXFfMSAgICAgICAgIFJOIDkgIAotcV8yICAgICAgICAgUk4gMTAgCi1xXzMgICAgICAgICBSTiAxMiAKLQotOy8vIEZpbHRlcmluZwotCi1kcDBxMCAgICAgICBSTiAxMgotZHAxcDAgICAgICAgUk4gMTIKLWRxMXEwICAgICAgIFJOIDEyCi1kcDJwMCAgICAgICBSTiAxMgotZHEycTAgICAgICAgUk4gMTIKLSAgICAgICAgICAgIAotYXAwcTAgICAgICAgUk4gMSAgCi1maWx0ICAgICAgICBSTiAyCi0gICAgICAgIAotbTAwICAgICAgICAgUk4gMTQKLW0wMSAgICAgICAgIFJOIDExCi0gICAgICAgICAgICAKLWFwZmxnICAgICAgIFJOIDAgCi1hcWZsZyAgICAgICBSTiA2Ci1hcHFmbGcgICAgICBSTiAwCi0gICAgICAgICAgICAKLQotOy8vRGVjbGFyYXRpb25zIGZvciBiU0xUNCBrZXJuZWwKLQotdEMwICAgICAgICAgUk4gNwotcHRDMCAgICAgICAgUk4gMQotCi1wUTBhICAgICAgICBSTiAwICAgIAotU3RlcGEgICAgICAgUk4gMSAgICAKLW1hc2thICAgICAgIFJOIDE0Ci0gICAgICAgICAgICAKLVAwYSAgICAgICAgIFJOIDEKLVAxYSAgICAgICAgIFJOIDgKLVEwYSAgICAgICAgIFJOIDcKLVExYSAgICAgICAgIFJOIDExCi0gICAgICAgICAgICAKLTsvL0RlY2xhcmF0aW9ucyBmb3IgYlNHRTQga2VybmVsCi0KLXBRMGIgICAgICAgIFJOIDAKLVN0ZXBiICAgICAgIFJOIDEKLW1hc2tiICAgICAgIFJOIDE0Ci0gICAgICAgICAgICAKLVAwYiAgICAgICAgIFJOIDYKLVAxYiAgICAgICAgIFJOIDcKLVAyYiAgICAgICAgIFJOIDEKLVAzYiAgICAgICAgIFJOIDMKLSAgICAgICAgICAgIAotUTBiICAgICAgICAgUk4gOSAKLVExYiAgICAgICAgIFJOIDAgICAKLVEyYiAgICAgICAgIFJOIDIgCi1RM2IgICAgICAgICBSTiAzIAotCi07Ly8gTWlzY2VsbGFub3VzCi1YWSAgICAgICAgICBSTiA4Ci10MCAgICAgICAgICBSTiAzIAotdDEgICAgICAgICAgUk4gMTIKLXQyICAgICAgICAgIFJOIDE0Ci10NyAgICAgICAgICBSTiA3Ci10NCAgICAgICAgICBSTiA0Ci10NSAgICAgICAgICBSTiAxICAKLXQ4ICAgICAgICAgIFJOIDYgIAotYSAgICAgICAgICAgUk4gMAotCi0gICAgICAgICAgICAKLQotICAgICAgICAKLSAgICAgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSAKLSAgICAgICAgTV9BTExPQzQgcHBUaHJlc2hvbGRzLDQKLSAgICAgICAgTV9BTExPQzQgcFFfMyw0Ci0gICAgICAgIE1fQUxMT0M0IHBQXzMsNAotICAgICAgICBNX0FMTE9DOCBwQWxwaGFCZXRhMCw4Ci0gICAgICAgIE1fQUxMT0M4IHBBbHBoYUJldGExLDgKLSAgICAgICAgTV9BTExPQzggcFhZQlMsNAotICAgICAgICBNX0FMTE9DNCBwcEJTLDQKLSAgICAgICAgTV9BTExPQzggcHBRMFN0ZXAsNAotICAgICAgICBNX0FMTE9DNCBwU3RlcCw0Ci0gICAgICAgIAotICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0ksIHIxMQotICAgICAgICAKLSAgICAgICAgOy8vSW5wdXQgYXJndW1lbnRzIG9uIHRoZSBzdGFjawotICAgICAgICBNX0FSRyAgIHBwVGhyZXNob2xkc0FyZywgNAotICAgICAgICBNX0FSRyAgIHBwQlNBcmcsIDQKLQotICAgICAgICBMRFIgICAgIHQ0LD1NQVNLXzEKLQotICAgICAgICBMRFJCICAgIGFscGhhMCwgW3BBbHBoYUFyZ10KLSAgICAgICAgTERSQiAgICBiZXRhMCwgIFtwQmV0YUFyZ10KLSAgICAgICAgTERSQiAgICBhbHBoYTEsIFtwQWxwaGFBcmcsIzFdCi0gICAgICAgIExEUkIgICAgYmV0YTEsICBbcEJldGFBcmcsIzFdCi0KLSAgICAgICAgTVVMICAgICBhbHBoYTAsIGFscGhhMCwgdDQKLSAgICAgICAgTVVMICAgICBiZXRhMCwgYmV0YTAsIHQ0Ci0gICAgICAgIE1VTCAgICAgYWxwaGExLCBhbHBoYTEsIHQ0Ci0gICAgICAgIE1VTCAgICAgYmV0YTEsIGJldGExLCB0NAotCi0gICAgICAgIE1fU1RSRCAgYWxwaGEwLCBiZXRhMCwgcEFscGhhQmV0YTAKLSAgICAgICAgTV9TVFJEICBhbHBoYTEsIGJldGExLCBwQWxwaGFCZXRhMQotCi0gICAgICAgIExEUiAgICAgWFksPUxPT1BfQ09VTlQKLSAgICAgICAgTV9MRFIgICBwQlMsIHBwQlNBcmcKLSAgICAgICAgTV9MRFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzQXJnCi0gICAgICAgIE1fU1RSICAgc3JjZHN0U3RlcCwgcFN0ZXAKLSAgICAgICAgTV9TVFJEICBYWSwgcEJTLCBwWFlCUwotICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzIKLSAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCi1Mb29wWQotTG9vcFgKLTsvLy0tLS0tLS0tLS0tLS0tLUxvYWQgUGl4ZWxzLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBNX1NUUiAgIHBRMCwgcHBRMFN0ZXAKLSAgICAgICAgTV9MRFIgICBwXzMsIFtwUTBdLCBzcmNkc3RTdGVwCi0gICAgICAgIE1fTERSICAgcF8yLCBbcFEwXSwgc3JjZHN0U3RlcAotICAgICAgICBNX1NUUiAgIHBfMywgcFBfMwotICAgICAgICBMRFJCICAgIGJTLCBbcEJTXSwgIzEKLSAgICAgICAgTV9TVFIgICBwQlMsIHBwQlMKLSAgICAgICAgTV9MRFIgICBwXzEsIFtwUTBdLCBzcmNkc3RTdGVwCi0gICAgICAgIENNUCAgICAgYlMsICMwCi0gICAgICAgIE1fTERSICAgcF8wLCBbcFEwXSwgc3JjZHN0U3RlcAotICAgICAgICBNX0xEUiAgIHFfMCwgW3BRMF0sIHNyY2RzdFN0ZXAKLSAgICAgICAgTV9MRFIgICBxXzEsIFtwUTBdLCBzcmNkc3RTdGVwCi0gICAgICAgIE1fTERSICAgcV8yLCBbcFEwXSwgc3JjZHN0U3RlcAotICAgICAgICBNX0xEUiAgIHFfMywgW3BRMF0sIHNyY2RzdFN0ZXAKLSAgICAgICAgQkVRICAgICBOb0ZpbHRlckJTMAotICAgICAgICBDTVAgICAgIGJTLCAjNAotICAgICAgICBNX1NUUiAgIHFfMywgcFFfMwotCi07Ly8tLS0tLS0tLS0tLS0tLUZpbHRlcmluZyBEZWNpc2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIExEUiAgICAgbTAxLCA9TUFTS18xICAgICAgICAgICAgICAgIDsvLyAgMDEwMTAxMDEgbWFzayAKLSAgICAgICAgTU9WICAgICBtMDAsICNNQVNLXzAgICAgICAgICAgICAgICAgOy8vICAwMDAwMDAwMCBtYXNrIAotCi0gICAgICAgIDsvLyBDaGVjayB8cDAtcTB8PEFscGhhIAotICAgICAgICBVU1VCOCAgIGRwMHEwLCBwXzAsIHFfMCAKLSAgICAgICAgVVNVQjggICBhLCBxXzAsIHBfMAotICAgICAgICBTRUwgICAgIGFwMHEwLCBhLCBkcDBxMAotICAgICAgICBVU1VCOCAgIGEsIGFwMHEwLCBhbHBoYQotICAgICAgICBTRUwgICAgIGZpbHQsIG0wMCwgbTAxCi0gICAgICAgIAotICAgICAgICA7Ly8gQ2hlY2sgfHAxLXAwfDxCZXRhIAotICAgICAgICBVU1VCOCAgIGRwMXAwLCBwXzEsIHBfMAotICAgICAgICBVU1VCOCAgIGEsIHBfMCwgcF8xCi0gICAgICAgIFNFTCAgICAgYSwgYSwgZHAxcDAKLSAgICAgICAgVVNVQjggICBhLCBhLCBiZXRhCi0gICAgICAgIFNFTCAgICAgZmlsdCwgbTAwLCBmaWx0Ci0KLSAgICAgICAgOy8vIENoZWNrIHxxMS1xMHw8QmV0YSAKLSAgICAgICAgVVNVQjggICBkcTFxMCwgcV8xLCBxXzAKLSAgICAgICAgVVNVQjggICBhLCBxXzAsIHFfMQotICAgICAgICBTRUwgICAgIGEsIGEsIGRxMXEwCi0gICAgICAgIFVTVUI4ICAgYSwgYSwgYmV0YQotICAgICAgICBTRUwgICAgIGZpbHQsIG0wMCwgZmlsdAotCi0gICAgICAgIDsvLyBDaGVjayBhcDxCZXRhIAotICAgICAgICBVU1VCOCAgIGRwMnAwLCBwXzIsIHBfMAotICAgICAgICBVU1VCOCAgIGEsIHBfMCwgcF8yCi0gICAgICAgIFNFTCAgICAgYSwgYSwgZHAycDAKLSAgICAgICAgVVNVQjggICBhLCBhLCBiZXRhCi0gICAgICAgIFNFTCAgICAgYXBmbGcsIG0wMCwgZmlsdCAgICAgICAgICAgIDsvLyBhcGZsZyA9IGZpbHQgJiYgKGFwPGJldGEpCi0KLSAgICAgICAgOy8vIENoZWNrIGFxPEJldGEgCi0gICAgICAgIFVTVUI4ICAgZHEycTAsIHFfMiwgcV8wCi0gICAgICAgIFVTVUI4ICAgdDIsIHFfMCwgcV8yCi0gICAgICAgIFNFTCAgICAgdDIsIHQyLCBkcTJxMAotICAgICAgICBVU1VCOCAgIHQyLCB0MiwgYmV0YQotICAgICAgICBNT1YgICAgIHQ3LCMwCi0KLSAgICAgICAgQkxUICAgICBiU0xUNCAgICAgICAgCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tRmlsdGVyLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWJTR0U0ICAgICAgICAKLSAgICAgICAgOy8vLS0tLS0tLS0tYlNHRTQgRXhlY3V0aW9uLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIFNFTCAgICAgdDEsIHQ3LCBmaWx0ICAgICAgICAgICAgOy8vIGFxZmxnID0gZmlsdCAmJiAoYXE8YmV0YSkgCi0gICAgICAgIENNUCAgICAgZmlsdCwgIzAKLSAgICAgICAgT1JSICAgICBhcHFmbGcsIGFwZmxnLCB0MSwgTFNMICMxCi0gICAgICAgIE1fTERSRCAgcFEwLCBzcmNkc3RTdGVwLCBwcFEwU3RlcCwgRVEKLSAgICAgICAgQkVRICAgICBOb0ZpbHRlckZpbHQwCi0KLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlCi0gICAgICAgIAotICAgICAgICA7Ly8tLS0tLS0tLS1TdG9yZSByZXN1bHQtLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgTV9MRFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCi0gICAgICAgIE1PViAgICAgcF8yLCBRMWIKLSAgICAgICAgTU9WICAgICBwXzEsIFAyYgotICAgICAgICBNX0xEUkQgIHBRMGIsIFN0ZXBiLCBwcFEwU3RlcAotICAgICAgICBBREQgICAgIHBUaHJlc2hvbGRzLCAjMQotICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKLSAgICAgICAgTV9TVFIgICBwXzEsIFtwUTBiLCBTdGVwYl0hCi0gICAgICAgIE1fU1RSICAgUDFiLCBbcFEwYiwgU3RlcGJdIQotICAgICAgICBNX1NUUiAgIFAwYiwgW3BRMGIsIFN0ZXBiXSEKLSAgICAgICAgTV9TVFIgICBRMGIsIFtwUTBiLCBTdGVwYl0hCi0gICAgICAgIFNUUiAgICAgcF8yLCBbcFEwYiwgU3RlcGJdCi0gICAgICAgIFNUUiAgICAgUTJiLCBbcFEwYiwgU3RlcGIsIExTTCAjMV0KLQotCi0gICAgICAgIE1fTERSRCAgWFksIHBCUywgcFhZQlMKLSAgICAgICAgU1VCICAgICBwUTAsIHBRMGIsIFN0ZXBiLCBMU0wgIzIKLSAgICAgICAgQUREICAgICBwUTAsIHBRMCwgIzQKLSAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTAKLSAgICAgICAgQUREUyAgICBYWSwgWFksIFhZCi0gICAgICAgIE1fU1RSICAgWFksIHBYWUJTCi0gICAgICAgIEJDQyAgICAgTG9vcFgKLSAgICAgICAgQiAgICAgICBFeGl0TG9vcFkKLQotOy8vLS0tLS0tLS0tLSBFeGl0IG9mIExvb3BYIC0tLS0tLS0tLS0tLS0tCi07Ly8tLS0tIGZvciB0aGUgY2FzZSBvZiBubyBmaWx0ZXJpbmcgLS0tLS0KLQotTm9GaWx0ZXJCUzAKLSAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcCwgTFNMICMzCi1Ob0ZpbHRlckZpbHQwCi0gICAgICAgIEFERCAgICAgcFEwLCBwUTAsICM0Ci0gICAgICAgIDsvLyBMb2FkIGNvdW50ZXIgZm9yIExvb3BYCi0gICAgICAgIE1fTERSRCAgWFksIHBCUywgcFhZQlMKLSAgICAgICAgTV9MRFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCi0gICAgICAgIE1fTERSRCAgYWxwaGEsIGJldGEsIHBBbHBoYUJldGEwCi0KLSAgICAgICAgOy8vIEFsaWduIHRoZSBwb2ludGVycwotICAgICAgICBBRERTICAgIFhZLCBYWSwgWFkKLSAgICAgICAgQUREICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICMxCi0gICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcwotICAgICAgICBNX1NUUiAgIFhZLCBwWFlCUwotICAgICAgICBCQ0MgICAgIExvb3BYCi0gICAgICAgIEIgICAgICAgRXhpdExvb3BZCi0KLWJTTFQ0ICAgICAgICAKLSAgICAgICAgOy8vLS0tLS0tLS0tYlNMVDQgRXhlY3V0aW9uLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIFNFTCAgICAgYXFmbGcsIHQ3LCBmaWx0ICAgICAgICAgICAgOy8vIGFxZmxnID0gZmlsdCAmJiAoYXE8YmV0YSkgCi0gICAgICAgIE1fTERSICAgcHRDMCwgcHBUaHJlc2hvbGRzCi0gICAgICAgIENNUCAgICAgZmlsdCwgIzAKLSAgICAgICAgTV9MRFJEICBwUTAsIHNyY2RzdFN0ZXAsIHBwUTBTdGVwLCBFUQotICAgICAgICBCRVEgICAgIE5vRmlsdGVyRmlsdDAKLSAgICAgICAgCi0gICAgICAgIExEUkIgICAgdEMwLCBbcHRDMF0sICMxCi0gICAgICAgIE1fU1RSICAgcHRDMCwgcHBUaHJlc2hvbGRzCi0KLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlCi0KLSAgICAgICAgOy8vLS0tLS0tLS0tU3RvcmUgcmVzdWx0LS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIE1PViAgICAgcF8yLCBQMGEKLSAgICAgICAgTV9MRFJEICBwUTBhLCBTdGVwYSwgcHBRMFN0ZXAKLSAgICAgICAgTV9TVFIgICBQMWEsIFtwUTBhLCBTdGVwYSwgTFNMICMxXSEKLSAgICAgICAgTV9TVFIgICBwXzIsIFtwUTBhLCBTdGVwYV0hCi0gICAgICAgIE1fU1RSICAgUTBhLCBbcFEwYSwgU3RlcGFdIQotICAgICAgICBTVFIgICAgIFExYSwgW3BRMGEsIFN0ZXBhXQotICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBjb3VudGVyCi0gICAgICAgIE1fTERSRCAgWFksIHBCUywgcFhZQlMKLSAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTAKLQotICAgICAgICBTVUIgICAgIHBRMCwgcFEwYSwgU3RlcGEsIExTTCAjMgotICAgICAgICBBREQgICAgIHBRMCwgcFEwLCAjNAotCi0gICAgICAgIEFERFMgICAgWFksIFhZLCBYWQotICAgICAgICBNX1NUUiAgIFhZLCBwWFlCUwotICAgICAgICBCQ0MgICAgIExvb3BYCi0gICAgICAgIAotOy8vLS0tLS0tLS0gQ29tbW9uIEV4aXQgb2YgTG9vcFkgLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgOy8vIEFsaWduIHRoZSBwb2ludGVycyAKLUV4aXRMb29wWQotICAgICAgICBNX0xEUkQgIGFscGhhLCBiZXRhLCBwQWxwaGFCZXRhMQotICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCAjMTYKLSAgICAgICAgQUREICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcCwgTFNMICMyCi0gICAgICAgIE1fU1RSRCAgYWxwaGEsIGJldGEsIHBBbHBoYUJldGEwCi0KLSAgICAgICAgQk5FICAgICBMb29wWQotICAgICAgICBNT1YgICAgIHIwLCAjT01YX1N0c19Ob0VycgotOy8vLS0tLS0tLS0tLS0tLS0tLS1FbmQgRmlsdGVyLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgTV9FTkQKLQotICAgIEVORElGICAgICAgICAKLSAgICAgICAgCi0KLSAgICAgICAgRU5ECi0gICAgICAgIAotICAgICAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhZGYyN2IuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NjQgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotCi0gICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLSAgICAgICAgSU1QT1JUICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlCi0gICAgICAgIElNUE9SVCAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZQotICAgICAgICAKLSAgICAKLSAgICBJRiBBUk0xMTM2SlMKLQotTUFTS18wICAgICAgRVFVIDB4MDAwMDAwMDAgICAKLU1BU0tfMSAgICAgIEVRVSAweDAxMDEwMTAxCi1NQVNLXzIgICAgICBFUVUgMHhmZjAwZmYwMAotTE9PUF9DT1VOVCAgRVFVIDB4MTExMTAwMDAKLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi0KLXBTcmNEc3QgICAgIFJOIDAKLXNyY2RzdFN0ZXAgIFJOIDEKLXBBbHBoYUFyZyAgIFJOIDIKLXBCZXRhQXJnICAgIFJOIDMKLQotcFRocmVzaG9sZHMgUk4gMTQKLXBCUyAgICAgICAgIFJOIDkKLXBRMCAgICAgICAgIFJOIDAKLWJTICAgICAgICAgIFJOIDIKLQotYWxwaGEgICAgICAgUk4gNgotYWxwaGEwICAgICAgUk4gNgotYWxwaGExICAgICAgUk4gOAotCi1iZXRhICAgICAgICBSTiA3Ci1iZXRhMCAgICAgICBSTiA3Ci1iZXRhMSAgICAgICBSTiA5Ci0KLTsvLyBEZWNsYXJlIExvY2FsL1RlbXBvcmFyeSB2YXJpYWJsZXMKLQotOy8vIFBpeGVscwotcF8wICAgICAgICAgUk4gMyAgCi1wXzEgICAgICAgICBSTiA1ICAKLXBfMiAgICAgICAgIFJOIDQgIAotcF8zICAgICAgICAgUk4gMiAgCi1xXzAgICAgICAgICBSTiA4ICAKLXFfMSAgICAgICAgIFJOIDkgIAotcV8yICAgICAgICAgUk4gMTAgCi1xXzMgICAgICAgICBSTiAxMiAKLQotOy8vIFVucGFja2luZwotbWFzayAgICAgICAgUk4gMTEgCi0KLXJvdzAgICAgICAgIFJOIDIKLXJvdzEgICAgICAgIFJOIDQKLXJvdzIgICAgICAgIFJOIDUKLXJvdzMgICAgICAgIFJOIDMKLQotcm93NCAgICAgICAgUk4gOAotcm93NSAgICAgICAgUk4gOQotcm93NiAgICAgICAgUk4gMTAKLXJvdzcgICAgICAgIFJOIDEyCi1yb3c4ICAgICAgICBSTiAxNAotcm93OSAgICAgICAgUk4gNwotICAgICAgICAgICAgCi10dW5wazAgICAgICBSTiA4Ci10dW5wazEgICAgICBSTiA5Ci10dW5wazIgICAgICBSTiAxMAotdHVucGszICAgICAgUk4gMTIKLXR1bnBrNCAgICAgIFJOIDAKLQotdHVucGs1ICAgICAgUk4gMQotdHVucGs2ICAgICAgUk4gMTQKLXR1bnBrNyAgICAgIFJOIDIgCi10dW5wazggICAgICBSTiA1IAotdHVucGs5ICAgICAgUk4gNiAKLSAKLQotOy8vIEZpbHRlcmluZwotCi1kcDBxMCAgICAgICBSTiAxMgotZHAxcDAgICAgICAgUk4gMTIKLWRxMXEwICAgICAgIFJOIDEyCi1kcDJwMCAgICAgICBSTiAxMgotZHEycTAgICAgICAgUk4gMTIKLSAgICAgICAgICAgIAotYXAwcTAgICAgICAgUk4gMSAgCi1maWx0ICAgICAgICBSTiAyCi0gICAgICAgIAotbTAwICAgICAgICAgUk4gMTQKLW0wMSAgICAgICAgIFJOIDExCi0gICAgICAgICAgICAKLWFwZmxnICAgICAgIFJOIDAgCi1hcWZsZyAgICAgICBSTiA2Ci1hcHFmbGcgICAgICBSTiAwCi0gICAgICAgICAgICAKLQotOy8vRGVjbGFyYXRpb25zIGZvciBiU0xUNCBrZXJuZWwKLQotdEMwICAgICAgICAgUk4gNwotcHRDMCAgICAgICAgUk4gMQotCi1wUTBhICAgICAgICBSTiAwICAgIAotU3RlcGEgICAgICAgUk4gMSAgICAKLW1hc2thICAgICAgIFJOIDE0Ci0gICAgICAgICAgICAKLVAwYSAgICAgICAgIFJOIDEKLVAxYSAgICAgICAgIFJOIDgKLVEwYSAgICAgICAgIFJOIDcKLVExYSAgICAgICAgIFJOIDExCi0gICAgICAgICAgICAKLTsvL0RlY2xhcmF0aW9ucyBmb3IgYlNHRTQga2VybmVsCi0KLXBRMGIgICAgICAgIFJOIDAKLVN0ZXBiICAgICAgIFJOIDEKLW1hc2tiICAgICAgIFJOIDE0Ci0gICAgICAgICAgICAKLVAwYiAgICAgICAgIFJOIDYKLVAxYiAgICAgICAgIFJOIDcKLVAyYiAgICAgICAgIFJOIDEKLVAzYiAgICAgICAgIFJOIDMKLSAgICAgICAgICAgIAotUTBiICAgICAgICAgUk4gOSAKLVExYiAgICAgICAgIFJOIDAgICAKLVEyYiAgICAgICAgIFJOIDIgCi1RM2IgICAgICAgICBSTiAzIAotCi07Ly8gTWlzY2VsbGFub3VzCi1YWSAgICAgICAgICBSTiA4Ci10MCAgICAgICAgICBSTiAzIAotdDEgICAgICAgICAgUk4gMTIKLXQyICAgICAgICAgIFJOIDE0Ci10NyAgICAgICAgICBSTiA3Ci10NCAgICAgICAgICBSTiA0Ci10NSAgICAgICAgICBSTiAxICAKLXQ4ICAgICAgICAgIFJOIDYgIAotYSAgICAgICAgICAgUk4gMAotCi0gICAgICAgICAgICAKLQotICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IAotICAgICAgICBNX0FMTE9DNCBwcFRocmVzaG9sZHMsNAotICAgICAgICBNX0FMTE9DNCBwUV8zLDQKLSAgICAgICAgTV9BTExPQzQgcFBfMyw0Ci0gICAgICAgIE1fQUxMT0M4IHBBbHBoYUJldGEwLDgKLSAgICAgICAgTV9BTExPQzggcEFscGhhQmV0YTEsOAotICAgICAgICBNX0FMTE9DOCBwWFlCUyw0Ci0gICAgICAgIE1fQUxMT0M0IHBwQlMsNAotICAgICAgICBNX0FMTE9DOCBwcFEwU3RlcCw0Ci0gICAgICAgIE1fQUxMT0M0IHBTdGVwLDQKLSAgICAgICAgCi0gICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSwgcjExCi0gICAgICAgIAotICAgICAgICA7Ly9JbnB1dCBhcmd1bWVudHMgb24gdGhlIHN0YWNrCi0gICAgICAgIE1fQVJHICAgcHBUaHJlc2hvbGRzQXJnLCA0Ci0gICAgICAgIE1fQVJHICAgcHBCU0FyZywgNAotICAgICAgICAKLSAgICAgICAgTERSICAgICB0NCw9TUFTS18xCi0KLSAgICAgICAgTERSQiAgICBhbHBoYTAsIFtwQWxwaGFBcmddCi0gICAgICAgIExEUkIgICAgYmV0YTAsICBbcEJldGFBcmddCi0gICAgICAgIExEUkIgICAgYWxwaGExLCBbcEFscGhhQXJnLCMxXQotICAgICAgICBMRFJCICAgIGJldGExLCAgW3BCZXRhQXJnLCMxXQotCi0gICAgICAgIE1VTCAgICAgYWxwaGEwLCBhbHBoYTAsIHQ0Ci0gICAgICAgIE1VTCAgICAgYmV0YTAsIGJldGEwLCB0NAotICAgICAgICBNVUwgICAgIGFscGhhMSwgYWxwaGExLCB0NAotICAgICAgICBNVUwgICAgIGJldGExLCBiZXRhMSwgdDQKLQotICAgICAgICBNX1NUUkQgIGFscGhhMCwgYmV0YTAsIHBBbHBoYUJldGEwCi0gICAgICAgIE1fU1RSRCAgYWxwaGExLCBiZXRhMSwgcEFscGhhQmV0YTEKLQotICAgICAgICBMRFIgICAgIFhZLD1MT09QX0NPVU5UCi0gICAgICAgIE1fTERSICAgcEJTLCBwcEJTQXJnCi0gICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkc0FyZwotICAgICAgICBNX1NUUiAgIHNyY2RzdFN0ZXAsIHBTdGVwCi0gICAgICAgIE1fU1RSRCAgWFksIHBCUywgcFhZQlMKLSAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCi0gICAgICAgIAotICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCAjNAotTG9vcFkKLTsvLy0tLS0tLS0tLS0tLS0tLUxvYWQgUGl4ZWxzLS0tLS0tLS0tLS0tLS0tLS0tLQotCi07Ly8tLS0tLS0tLS0tLS0tLS0tUGFjayBwMC1wMy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIExEUiAgICAgbWFzaywgPU1BU0tfMgotICAgICAgICAKLSAgICAgICAgTV9MRFIgICByb3cwLCBbcFEwXSwgc3JjZHN0U3RlcCAgICAgICAgICAKLSAgICAgICAgTV9MRFIgICByb3cxLCBbcFEwXSwgc3JjZHN0U3RlcCAgICAgICAgICAKLSAgICAgICAgTERSICAgICByb3cyLCBbcFEwXQotICAgICAgICBMRFIgICAgIHJvdzMsIFtwUTAsIHNyY2RzdFN0ZXBdCi0gICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMQotICAgICAgICAKLSAgICAgICAgOy8vIHJvdzAgPSBbcjBwMCByMHAxIHIwcDIgcjBwM10KLSAgICAgICAgOy8vIHJvdzEgPSBbcjFwMCByMXAxIHIxcDIgcjFwM10KLSAgICAgICAgOy8vIHJvdzIgPSBbcjJwMCByMnAxIHIycDIgcjJwM10KLSAgICAgICAgOy8vIHJvdzMgPSBbcjNwMCByM3AxIHIzcDIgcjNwM10KLQotICAgICAgICBBTkQgICAgIHR1bnBrMCwgbWFzaywgcm93MAotICAgICAgICBBTkQgICAgIHR1bnBrNiwgbWFzaywgcm93MCwgTFNMIzgKLSAgICAgICAgVVhUQUIxNiB0dW5wazAsIHR1bnBrMCwgcm93MSwgUk9SIzgKLSAgICAgICAgVVhUQUIxNiB0dW5wazYsIHR1bnBrNiwgcm93MQotICAgICAgICBBTkQgICAgIHR1bnBrMiwgbWFzaywgcm93MgotICAgICAgICBBTkQgICAgIHR1bnBrMywgbWFzaywgcm93MiwgTFNMIzgKLSAgICAgICAgVVhUQUIxNiB0dW5wazIsIHR1bnBrMiwgcm93MywgUk9SIzgKLSAgICAgICAgVVhUQUIxNiB0dW5wazMsIHR1bnBrMywgcm93MwotCi0gICAgICAgIDsvLyB0dW5wazAgPSBbcjBwMCByMXAwIHIwcDIgcjFwMl0KLSAgICAgICAgOy8vIHR1bnBrNiA9IFtyMHAxIHIxcDEgcjBwMyByMXAzXQotICAgICAgICA7Ly8gdHVucGsyID0gW3IycDAgcjNwMCByMnAyIHIzcDJdCi0gICAgICAgIDsvLyB0dW5wazMgPSBbcjJwMSByM3AxIHIycDMgcjNwM10KLQotICAgICAgICBQS0hUQiAgIHBfMCwgdHVucGswLCB0dW5wazIsIEFTUiMxNgotICAgICAgICBQS0hUQiAgIHBfMSwgdHVucGs2LCB0dW5wazMsIEFTUiMxNgotICAgICAgICBQS0hCVCAgIHBfMiwgdHVucGsyLCB0dW5wazAsIExTTCMxNgotICAgICAgICBQS0hCVCAgIHBfMywgdHVucGszLCB0dW5wazYsIExTTCMxNgotCi0KLSAgICAgICAgOy8vIHBfMCA9IFtyMHAwIHIxcDAgcjJwMCByM3AwXQotICAgICAgICA7Ly8gcF8xID0gW3IwcDEgcjFwMSByMnAxIHIzcDFdCi0gICAgICAgIDsvLyBwXzIgPSBbcjBwMiByMXAyIHIycDEgcjNwMl0KLSAgICAgICAgOy8vIHBfMyA9IFtyMHAzIHIxcDMgcjJwMyByM3AzXQotCi0gICAgICAgIE1fU1RSICAgcF8zLCBwUF8zCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS1QYWNrIHEwLXEzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUxvb3BYCi0gICAgICAgIExEUkIgICAgYlMsIFtwQlNdLCAjNAotICAgICAgICBNX1NUUiAgIHBRMCwgcHBRMFN0ZXAKLSAgICAgICAgTERSICAgICBtYXNrLCA9TUFTS18yCi0gICAgICAgIENNUCAgICAgYlMsICMwCi0gICAgICAgIE1fU1RSICAgcEJTLCBwcEJTCi0KLSAgICAgICAgTERSICAgICByb3c0LCBbcFEwLCAjNF0hCi0gICAgICAgIEJFUS5XICAgTm9GaWx0ZXJCUzAKLSAgICAgICAgTV9MRFIgICByb3c1LCBbcFEwLCBzcmNkc3RTdGVwXSEKLSAgICAgICAgTV9MRFIgICByb3c2LCBbcFEwLCBzcmNkc3RTdGVwXSEKLSAgICAgICAgTV9MRFIgICByb3c3LCBbcFEwLCBzcmNkc3RTdGVwXQotCi0gICAgICAgIDsvLyByb3c0ID0gW3IwcTMgcjBxMiByMHExIHIwcTBdCi0gICAgICAgIDsvLyByb3c1ID0gW3IxcTMgcjFxMiByMXExIHIxcTBdCi0gICAgICAgIDsvLyByb3c2ID0gW3IycTMgcjJxMiByMnExIHIycTBdCi0gICAgICAgIDsvLyByb3c3ID0gW3IzcTMgcjNxMiByM3ExIHIzcTBdCi0gICAgCi0gICAgICAgIEFORCAgICAgdHVucGs0LCBtYXNrLCByb3c0Ci0gICAgICAgIENNUCAgICAgYlMsICM0Ci0gICAgICAgIEFORCAgICAgdHVucGs1LCBtYXNrLCByb3c0LCBMU0wjOAotICAgICAgICBVWFRBQjE2IHR1bnBrNCwgdHVucGs0LCByb3c1LCBST1IjOAotICAgICAgICBVWFRBQjE2IHR1bnBrNSwgdHVucGs1LCByb3c1Ci0gICAgICAgIEFORCAgICAgdHVucGs2LCBtYXNrLCByb3c2Ci0gICAgICAgIEFORCAgICAgdHVucGs3LCBtYXNrLCByb3c2LCBMU0wjOAotICAgICAgICBVWFRBQjE2IHR1bnBrNiwgdHVucGs2LCByb3c3LCBST1IjOAotICAgICAgICBVWFRBQjE2IHR1bnBrNywgdHVucGs3LCByb3c3Ci0KLSAgICAgICAgOy8vIHR1bnBrNCA9IFtyMHEwIHIxcTAgcjBxMiByMXEyXQotICAgICAgICA7Ly8gdHVucGs1ID0gW3IwcTEgcjFxMSByMHEzIHIxcTNdCi0gICAgICAgIDsvLyB0dW5wazYgPSBbcjJxMCByM3EwIHIycTIgcjNxMl0KLSAgICAgICAgOy8vIHR1bnBrNyA9IFtyMnExIHIzcTEgcjJxMyByM3EzXQotCi0gICAgICAgIFBLSFRCICAgcV8zLCB0dW5wazQsIHR1bnBrNiwgQVNSIzE2Ci0gICAgICAgIFBLSFRCICAgcV8yLCB0dW5wazUsIHR1bnBrNywgQVNSIzE2Ci0gICAgICAgIFBLSEJUICAgcV8xLCB0dW5wazYsIHR1bnBrNCwgTFNMIzE2Ci0gICAgICAgIE1fU1RSICAgcV8zLCBwUV8zCi0gICAgICAgIFBLSEJUICAgcV8wLCB0dW5wazcsIHR1bnBrNSwgTFNMIzE2Ci0KLQotICAgICAgICA7Ly8gcV8wID0gW3IwcTAgcjFxMCByMnEwIHIzcTBdCi0gICAgICAgIDsvLyBxXzEgPSBbcjBxMSByMXExIHIycTEgcjNxMV0KLSAgICAgICAgOy8vIHFfMiA9IFtyMHEyIHIxcTIgcjJxMSByM3EyXQotICAgICAgICA7Ly8gcV8zID0gW3IwcTMgcjFxMyByMnEzIHIzcTNdCi0KLQotOy8vLS0tLS0tLS0tLS0tLS1GaWx0ZXJpbmcgRGVjaXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBMRFIgICAgIG0wMSwgPU1BU0tfMSAgICAgICAgICAgICAgICA7Ly8gIDAxMDEwMTAxIG1hc2sgCi0gICAgICAgIE1PViAgICAgbTAwLCAjTUFTS18wICAgICAgICAgICAgICAgIDsvLyAgMDAwMDAwMDAgbWFzayAKLQotICAgICAgICA7Ly8gQ2hlY2sgfHAwLXEwfDxBbHBoYSAKLSAgICAgICAgVVNVQjggICBkcDBxMCwgcF8wLCBxXzAgCi0gICAgICAgIFVTVUI4ICAgYSwgcV8wLCBwXzAKLSAgICAgICAgU0VMICAgICBhcDBxMCwgYSwgZHAwcTAKLSAgICAgICAgVVNVQjggICBhLCBhcDBxMCwgYWxwaGEKLSAgICAgICAgU0VMICAgICBmaWx0LCBtMDAsIG0wMQotICAgICAgICAKLSAgICAgICAgOy8vIENoZWNrIHxwMS1wMHw8QmV0YSAKLSAgICAgICAgVVNVQjggICBkcDFwMCwgcF8xLCBwXzAKLSAgICAgICAgVVNVQjggICBhLCBwXzAsIHBfMQotICAgICAgICBTRUwgICAgIGEsIGEsIGRwMXAwCi0gICAgICAgIFVTVUI4ICAgYSwgYSwgYmV0YQotICAgICAgICBTRUwgICAgIGZpbHQsIG0wMCwgZmlsdAotCi0gICAgICAgIDsvLyBDaGVjayB8cTEtcTB8PEJldGEgCi0gICAgICAgIFVTVUI4ICAgZHExcTAsIHFfMSwgcV8wCi0gICAgICAgIFVTVUI4ICAgYSwgcV8wLCBxXzEKLSAgICAgICAgU0VMICAgICBhLCBhLCBkcTFxMAotICAgICAgICBVU1VCOCAgIGEsIGEsIGJldGEKLSAgICAgICAgU0VMICAgICBmaWx0LCBtMDAsIGZpbHQKLQotICAgICAgICA7Ly8gQ2hlY2sgYXA8QmV0YSAKLSAgICAgICAgVVNVQjggICBkcDJwMCwgcF8yLCBwXzAKLSAgICAgICAgVVNVQjggICBhLCBwXzAsIHBfMgotICAgICAgICBTRUwgICAgIGEsIGEsIGRwMnAwCi0gICAgICAgIFVTVUI4ICAgYSwgYSwgYmV0YQotICAgICAgICBTRUwgICAgIGFwZmxnLCBtMDAsIGZpbHQgICAgICAgICAgICA7Ly8gYXBmbGcgPSBmaWx0ICYmIChhcDxiZXRhKQotCi0gICAgICAgIDsvLyBDaGVjayBhcTxCZXRhIAotICAgICAgICBVU1VCOCAgIGRxMnEwLCBxXzIsIHFfMAotICAgICAgICBVU1VCOCAgIHQyLCBxXzAsIHFfMgotICAgICAgICBTRUwgICAgIHQyLCB0MiwgZHEycTAKLSAgICAgICAgVVNVQjggICB0MiwgdDIsIGJldGEKLSAgICAgICAgTU9WICAgICB0NywjMAotICAgICAgICAKLQotICAgICAgICBCTFQgICAgIGJTTFQ0ICAgICAgICAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS1GaWx0ZXItLS0tLS0tLS0tLS0tLS0tLS0tLQotYlNHRTQgICAgICAgIAotICAgICAgICA7Ly8tLS0tLS0tLS1iU0dFNCBFeGVjdXRpb24tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgU0VMICAgICB0MSwgdDcsIGZpbHQgICAgICAgICAgICA7Ly8gYXFmbGcgPSBmaWx0ICYmIChhcTxiZXRhKSAKLSAgICAgICAgQ01QICAgICBmaWx0LCAjMAotICAgICAgICBPUlIgICAgIGFwcWZsZywgYXBmbGcsIHQxLCBMU0wgIzEKLSAgICAgICAgTV9MRFJEICBwUTAsIHNyY2RzdFN0ZXAsIHBwUTBTdGVwLCBFUQotICAgICAgICBCRVEgICAgIE5vRmlsdGVyRmlsdDAKLQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUKLSAgICAgICAgCi0gICAgICAgIDsvLy0tLS0tLS0tLVN0b3JlIHJlc3VsdC0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIExEUiAgICAgbWFza2IsPU1BU0tfMgotCi0gICAgICAgIDsvLyBQMGIgPSBbcjBwMCByMXAwIHIycDAgcjNwMF0KLSAgICAgICAgOy8vIFAxYiA9IFtyMHAxIHIxcDEgcjJwMSByM3AxXQotICAgICAgICA7Ly8gUDJiID0gW3IwcDIgcjFwMiByMnAyIHIzcDJdCi0gICAgICAgIDsvLyBQM2IgPSBbcjBwMyByMXAzIHIycDMgcjNwM10KLQotICAgICAgICBNX0xEUiAgIFAzYiwgcFBfMyAgIAotICAgICAgICBNX1NUUiAgIFEwYiwgcFBfMyAgIAotCi0gICAgICAgIDsvLy0tLS0tLVBhY2sgcDAtcDMtLS0tLS0KLSAgICAgICAgQU5EICAgICB0dW5wazAsIG1hc2tiLCBQMGIKLSAgICAgICAgQU5EICAgICB0dW5wazIsIG1hc2tiLCBQMGIsIExTTCM4Ci0gICAgICAgIFVYVEFCMTYgdHVucGswLCB0dW5wazAsIFAxYiwgUk9SIzgKLSAgICAgICAgVVhUQUIxNiB0dW5wazIsIHR1bnBrMiwgUDFiCi0KLSAgICAgICAgQU5EICAgICB0dW5wazMsIG1hc2tiLCBQMmIKLSAgICAgICAgQU5EICAgICB0dW5wazgsIG1hc2tiLCBQMmIsIExTTCM4Ci0gICAgICAgIFVYVEFCMTYgdHVucGszLCB0dW5wazMsIFAzYiwgUk9SIzgKLSAgICAgICAgVVhUQUIxNiB0dW5wazgsIHR1bnBrOCwgUDNiCi0KLSAgICAgICAgOy8vIHR1bnBrMCA9IFtyMHAwIHIwcDEgcjJwMCByMnAxXQotICAgICAgICA7Ly8gdHVucGsyID0gW3IxcDAgcjFwMSByM3AwIHIzcDFdCi0gICAgICAgIDsvLyB0dW5wazMgPSBbcjBwMiByMHAzIHIycDIgcjJwM10KLSAgICAgICAgOy8vIHR1bnBrOCA9IFtyMXAyIHIxcDMgcjNwMiByM3AzXQotCi0gICAgICAgIE1PViAgICAgcF8yLCBRMWIKLSAgICAgICAgTV9MRFJEICBwUTBiLCBTdGVwYiwgcHBRMFN0ZXAKLQotICAgICAgICBQS0hUQiAgIHJvdzksIHR1bnBrMCwgdHVucGszLCBBU1IjMTYKLSAgICAgICAgUEtIQlQgICByb3c3LCB0dW5wazMsIHR1bnBrMCwgTFNMIzE2Ci0gICAgICAgIFBLSFRCICAgcm93MywgdHVucGsyLCB0dW5wazgsIEFTUiMxNgotICAgICAgICBQS0hCVCAgIHJvdzYsIHR1bnBrOCwgdHVucGsyLCBMU0wjMTYKLQotICAgICAgICA7Ly8gcm93OSA9IFtyMHAwIHIwcDEgcjBwMiByMHAzXQotICAgICAgICA7Ly8gcm93MyA9IFtyMXAwIHIxcDEgcjFwMiByMXAzXQotICAgICAgICA7Ly8gcm93NyA9IFtyMnAwIHIycDEgcjJwMiByMnAzXQotICAgICAgICA7Ly8gcm93NiA9IFtyM3AwIHIzcDEgcjNwMiByM3AzXQotCi0gICAgICAgIE1fU1RSICAgcm93OSwgW3BRMGJdLCBTdGVwYgotICAgICAgICBTVFIgICAgIHJvdzcsIFtwUTBiLCBTdGVwYl0KLSAgICAgICAgU1RSICAgICByb3c2LCBbcFEwYiwgU3RlcGIsIExTTCAjMV0KLSAgICAgICAgU1RSICAgICByb3czLCBbcFEwYl0sICM0Ci0gICAgICAgIAotICAgICAgICBNX0xEUiAgIFEzYiwgcFFfMwotCi0gICAgICAgIDsvLyBRMGIgPSBbcjBxMCByMXEwIHIycTAgcjNxMF0KLSAgICAgICAgOy8vIFExYiA9IFtyMHExIHIxcTEgcjJxMSByM3ExXQotICAgICAgICA7Ly8gUTJiID0gW3IwcTIgcjFxMiByMnEyIHIzcTJdCi0gICAgICAgIDsvLyBRM2IgPSBbcjBxMyByMXEzIHIycTMgcjNxM10KLQotICAgICAgICA7Ly8tLS0tLS1QYWNrIHEwLXEzLS0tLS0tCi0gICAgICAgIEFORCAgICAgdHVucGswLCBtYXNrYiwgcF8yCi0gICAgICAgIEFORCAgICAgdHVucGsyLCBtYXNrYiwgcF8yLCBMU0wjOAotICAgICAgICBVWFRBQjE2IHR1bnBrMCwgdHVucGswLCBRMGIsIFJPUiM4Ci0gICAgICAgIFVYVEFCMTYgdHVucGsyLCB0dW5wazIsIFEwYgotCi0gICAgICAgIEFORCAgICAgdHVucGszLCBtYXNrYiwgUTNiCi0gICAgICAgIEFORCAgICAgdHVucGs4LCBtYXNrYiwgUTNiLCBMU0wjOAotICAgICAgICBVWFRBQjE2IHR1bnBrMywgdHVucGszLCBRMmIsIFJPUiM4Ci0gICAgICAgIFVYVEFCMTYgdHVucGs4LCB0dW5wazgsIFEyYgotCi0gICAgICAgIDsvLyB0dW5wazAgPSBbcjBxMSByMHEwIHIycTEgcjJxMF0KLSAgICAgICAgOy8vIHR1bnBrMiA9IFtyMXExIHIxcTAgcjNxMSByM3EwXQotICAgICAgICA7Ly8gdHVucGszID0gW3IwcTMgcjBxMiByMnEzIHIycTJdCi0gICAgICAgIDsvLyB0dW5wazggPSBbcjFxMyByMXEyIHIzcTMgcjNxMl0KLQotICAgICAgICBQS0hUQiAgIHJvdzgsIHR1bnBrMywgdHVucGswLCBBU1IjMTYKLSAgICAgICAgUEtIQlQgICByb3c3LCB0dW5wazAsIHR1bnBrMywgTFNMIzE2Ci0gICAgICAgIFBLSFRCICAgcm93NCwgdHVucGs4LCB0dW5wazIsIEFTUiMxNgotICAgICAgICBQS0hCVCAgIHJvdzYsIHR1bnBrMiwgdHVucGs4LCBMU0wjMTYKLQotICAgICAgICA7Ly8gcm93OCA9IFtyMHEwIHIwcTEgcjBxMiByMHEzXQotICAgICAgICA7Ly8gcm93NCA9IFtyMXEwIHIxcTEgcjFxMiByMXEzXQotICAgICAgICA7Ly8gcm93NyA9IFtyMnEwIHIycTEgcjJxMiByMnEzXQotICAgICAgICA7Ly8gcm93NiA9IFtyM3EwIHIzcTEgcjNxMiByM3EzXQotCi0gICAgICAgIFNUUiAgICAgcm93NCwgW3BRMGJdCi0gICAgICAgIFNUUiAgICAgcm93NywgW3BRMGIsIFN0ZXBiXQotICAgICAgICBTVFIgICAgIHJvdzYsIFtwUTBiLCBTdGVwYiwgTFNMICMxXQotCi0gICAgICAgIFNVQiAgICAgcFEwLCBwUTBiLCBTdGVwYgotICAgICAgICBNT1YgICAgIHBfMSwgUTJiCi0KLSAgICAgICAgU1RSICAgICByb3c4LCBbcFEwXQotCi0gICAgICAgIE1fTERSRCAgWFksIHBCUywgcFhZQlMKLSAgICAgICAgTV9MRFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCi0gICAgICAgIE1fTERSRCAgYWxwaGEsIGJldGEsIHBBbHBoYUJldGExCi0KLSAgICAgICAgQUREUyAgICBYWSwgWFksIFhZCi0gICAgICAgIEFERCAgICAgcFRocmVzaG9sZHMsICM0Ci0gICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcwotICAgICAgICBNX1NUUiAgIFhZLCBwWFlCUwotICAgICAgICBCQ0MgICAgIExvb3BYCi0gICAgICAgIEIgICAgICAgRXhpdExvb3BZCi0KLTsvLy0tLS0tLS0tLS0gRXhpdCBvZiBMb29wWCAtLS0tLS0tLS0tLS0tLQotOy8vLS0tLSBmb3IgdGhlIGNhc2Ugb2Ygbm8gZmlsdGVyaW5nIC0tLS0tCi0KLU5vRmlsdGVyRmlsdDAKLSAgICAgICAgQUREICAgICBwUTAsIHBRMCwgIzQKLU5vRmlsdGVyQlMwCi0gICAgICAgIDsvLyBMb2FkIGNvdW50ZXIgZm9yIExvb3BYCi0gICAgICAgIE1fTERSRCAgWFksIHBCUywgcFhZQlMKLSAgICAgICAgTV9MRFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCi0gICAgICAgIE1fTERSRCAgYWxwaGEsIGJldGEsIHBBbHBoYUJldGExCi0KLSAgICAgICAgOy8vIEFsaWduIHRoZSBwb2ludGVyCi0gICAgICAgIEFERFMgICAgWFksIFhZLCBYWQotICAgICAgICBBREQgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzQKLSAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCi0gICAgICAgIE1fU1RSICAgWFksIHBYWUJTCi0gICAgICAgIEJDQyAgICAgTG9vcFkKLSAgICAgICAgQiAgICAgICBFeGl0TG9vcFkKLSAgICAgICAgCi1iU0xUNCAgICAgICAgCi0gICAgICAgIDsvLy0tLS0tLS0tLWJTTFQ0IEV4ZWN1dGlvbi0tLS0tLS0tLS0tLS0tLQotICAgICAgICBTRUwgICAgIGFxZmxnLCB0NywgZmlsdCAgICAgICAgICAgIDsvLyBhcWZsZyA9IGZpbHQgJiYgKGFxPGJldGEpIAotICAgICAgICBNX0xEUiAgIHB0QzAsIHBwVGhyZXNob2xkcwotICAgICAgICBDTVAgICAgIGZpbHQsICMwCi0gICAgICAgIE1fTERSRCAgcFEwLCBzcmNkc3RTdGVwLCBwcFEwU3RlcCwgRVEKLSAgICAgICAgQkVRICAgICBOb0ZpbHRlckZpbHQwCi0gICAgICAgIAotICAgICAgICBMRFJCICAgIHRDMCwgW3B0QzBdLCAjNAotICAgICAgICBNX1NUUiAgIHB0QzAsIHBwVGhyZXNob2xkcwotCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQotCi0gICAgICAgIDsvLy0tLS0tLS0tLVN0b3JlIHJlc3VsdC0tLS0tLS0tLS0tLS0tLQotICAgICAgICA7Ly8tLS0tLS0tLVBhY2sgcDEscDAscTEscTAtLS0tLS0tLS0tLS0KLSAgICAgICAgCi0gICAgICAgIDsvL0xvYWQgZGVzdGluYXRpb24gcG9pbnRlcgotICAgICAgICBMRFIgICAgIG1hc2thLD1NQVNLXzIKLSAgICAgICAgTV9TVFIgICBRMGEsIHBQXzMKLSAgICAgICAgTU9WICAgICBwXzEsIHFfMgotCi0gICAgICAgIDsvLyBQMWEgPSBbcjBwMSByMXAxIHIycDEgcjNwMV0KLSAgICAgICAgOy8vIFAwYSA9IFtyMHAwIHIxcDAgcjJwMCByM3AwXQotICAgICAgICA7Ly8gUTBhID0gW3IwcTAgcjFxMCByMnEwIHIzcTBdCi0gICAgICAgIDsvLyBRMWEgPSBbcjBxMSByMXExIHIycTEgcjNxMV0KLQotICAgICAgICBBTkQgICAgIHR1bnBrMSwgbWFza2EsIFAwYQotICAgICAgICBBTkQgICAgIHR1bnBrMiwgbWFza2EsIFAwYSwgTFNMIzgKLSAgICAgICAgVVhUQUIxNiB0dW5wazEsIHR1bnBrMSwgUDFhLCBST1IjOAotICAgICAgICBVWFRBQjE2IHR1bnBrMiwgdHVucGsyLCBQMWEKLQotICAgICAgICBNX0xEUkQgIHBRMGEsIFN0ZXBhLCBwcFEwU3RlcAotCi0gICAgICAgIEFORCAgICAgdHVucGs5LCBtYXNrYSwgUTFhCi0gICAgICAgIEFORCAgICAgdHVucGszLCBtYXNrYSwgUTFhLCBMU0wjOAotICAgICAgICBVWFRBQjE2IHR1bnBrOSwgdHVucGs5LCBRMGEsIFJPUiM4Ci0gICAgICAgIFVYVEFCMTYgdHVucGszLCB0dW5wazMsIFEwYQotCi0gICAgICAgIDsvLyB0dW5wazEgPSBbcjBwMCByMHAxIHIycDAgcjJwMV0KLSAgICAgICAgOy8vIHR1bnBrMiA9IFtyMXAwIHIxcDEgcjNwMCByM3AxXQotICAgICAgICA7Ly8gdHVucGs5ID0gW3IwcTEgcjBxMCByMnExIHIycTBdCi0gICAgICAgIDsvLyB0dW5wazMgPSBbcjFxMSByMXEwIHIzcTEgcjNxMF0KLQotICAgICAgICBNT1YgICAgIHQ0LCB0dW5wazEsIExTUiAjMTYKLSAgICAgICAgTU9WICAgICB0MCwgdHVucGs5LCBMU1IgIzE2Ci0KLSAgICAgICAgU1RSSCAgICB0NCxbcFEwYSwgIzJdISAgICAgICAgICA7Ly9TdG9yZXMgW3IwcDAgcjBwMV0KLSAgICAgICAgU1RSSCAgICB0MCxbcFEwYSwgIzJdICAgICAgICAgICA7Ly9TdG9yZXMgW3IwcTAgcjBxMV0KLQotICAgICAgICBNT1YgICAgIHQ0LCB0dW5wazIsIExTUiAjMTYKLSAgICAgICAgTU9WICAgICB0MCwgdHVucGszLCBMU1IgIzE2Ci0KLSAgICAgICAgTV9TVFJIICB0NCxbcFEwYSwgU3RlcGFdISAgICAgICA7Ly9TdG9yZXMgW3IxcDAgcjFwMV0KLSAgICAgICAgU1RSSCAgICB0MCxbcFEwYSwgIzJdICAgICAgICAgICA7Ly9TdG9yZXMgW3IxcTAgcjFxMV0KLSAgICAgICAgCi0gICAgICAgIE1fU1RSSCAgdHVucGsxLFtwUTBhLCBTdGVwYV0hICAgOy8vU3RvcmVzIFtyMnAwIHIycDFdCi0gICAgICAgIFNUUkggICAgdHVucGsyLFtwUTBhLCBTdGVwYV0gICAgOy8vU3RvcmVzIFtyM3AwIHIzcDFdCi0gICAgICAgIFNUUkggICAgdHVucGs5LFtwUTBhLCAjMl0hICAgICAgICA7Ly9TdG9yZXMgW3IycTAgcjJxMV0KLSAgICAgICAgU1RSSCAgICB0dW5wazMsW3BRMGEsIFN0ZXBhXSAgICA7Ly9TdG9yZXMgW3IzcTAgcjNxMV0KLQotICAgICAgICBTVUIgICAgIHBRMCwgcFEwYSwgU3RlcGEsIExTTCAjMQotCi0gICAgICAgIDsvLyBMb2FkIGNvdW50ZXIKLSAgICAgICAgTV9MRFJEICBYWSwgcEJTLCBwWFlCUwotCi0gICAgICAgIDsvLyBSZWxvYWQgUGl4ZWxzCi0gICAgICAgIE1fTERSICAgcF8wLCBwUV8zCi0gICAgICAgIE1PViAgICAgcF8yLCBRMWEKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTEKLQotICAgICAgICBBRERTICAgIFhZLCBYWSwgWFkKLSAgICAgICAgTV9TVFIgICBYWSwgcFhZQlMKLSAgICAgICAgQkNDICAgICBMb29wWAotICAgICAgICAKLTsvLy0tLS0tLS0tIENvbW1vbiBFeGl0IG9mIExvb3BZIC0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIDsvLyBBbGlnbiB0aGUgcG9pbnRlcnMgCi0gICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcwotRXhpdExvb3BZCi0gICAgICAgIFNVQiAgICAgcFEwLCBwUTAsICMxNgotICAgICAgICBBREQgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzIKLSAgICAgICAgU1VCICAgICBwQlMsIHBCUywgIzE1Ci0gICAgICAgIFNVQiAgICAgcFRocmVzaG9sZHMsIHBUaHJlc2hvbGRzLCAjMTUKLSAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCi0KLSAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTAKLQotICAgICAgICBCTkUgICAgIExvb3BZCi0gICAgICAgIE1PViAgICAgcjAsICNPTVhfU3RzX05vRXJyCi0KLSAgICAgICAgTV9FTkQKLTsvLy0tLS0tLS0tLS0tLS0tLS0tRW5kIEZpbHRlci0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBFTkRJRiAgICAgICAgCi0gICAgICAgIAotICAgICAgICBFTkQKLSAgICAgICAgCi0gICAgICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNkMTg1Zi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEuYworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSAxLzggUGl4ZWwgaW50ZXJwb2xhdGlvbiBmb3IgQ2hyb21hIEJsb2NrCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSwKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIDEvOC1waXhlbCBpbnRlcnBvbGF0aW9uIGZvciBpbnRlciBjaHJvbWEgTUIuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwU3JjCVBvaW50ZXIgdG8gdGhlIHNvdXJjZSByZWZlcmVuY2UgZnJhbWUgYnVmZmVyCi0gKiBbaW5dCXNyY1N0ZXAgUmVmZXJlbmNlIGZyYW1lIHN0ZXAgaW4gYnl0ZQotICogW2luXQlkc3RTdGVwIERlc3RpbmF0aW9uIGZyYW1lIHN0ZXAgaW4gYnl0ZS4gTXVzdCBiZSBtdWx0aXBsZSBvZiByb2kud2lkdGguCi0gKiBbaW5dCWR4CQlGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudAotICoJCQkJCQlpbiAxLzggcGl4ZWwgdW5pdDt2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10KLSAqIFtpbl0JZHkJCUZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudAotICoJCQkJCQlpbiAxLzggcGl4ZWwgdW5pdDt2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10KLSAqIFtpbl0Jcm9pCQlEaW1lbnNpb24gb2YgdGhlIGludGVycG9sYXRpb24gcmVnaW9uO3RoZSBwYXJhbWV0ZXJzIHJvaS53aWR0aCBhbmQgcm9pLmhlaWdodCBtdXN0Ci0gKiAgICAgICAgICAgICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgMiwgNCwgb3IgOC4KLSAqIFtvdXRdCXBEc3QJUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gZnJhbWUgYnVmZmVyLgotICogICAgICAgICAgICAgICAgICAgaWYgcm9pLndpZHRoPT0yLCAgMi1ieXRlIGFsaWdubWVudCByZXF1aXJlZAotICogICAgICAgICAgICAgICAgICAgaWYgcm9pLndpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZAotICogICAgICAgICAgICAgICAgICAgaWYgcm9pLndpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4KLSAqIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgT01YX1N0c19CYWRBcmdFcnI6Ci0gKglwU3JjIG9yIHBEc3QgaXMgTlVMTC4KLSAqCXNyY1N0ZXAgb3IgZHN0U3RlcCA8IDguCi0gKglkeCBvciBkeSBpcyBvdXQgb2YgcmFuZ2UgWzAtN10uCi0gKglyb2kud2lkdGggb3Igcm9pLmhlaWdodCBpcyBvdXQgb2YgcmFuZ2UgezIsNCw4fS4KLSAqCXJvaS53aWR0aCBpcyBlcXVhbCB0byAyLCBidXQgcERzdCBpcyBub3QgMi1ieXRlIGFsaWduZWQuCi0gKglyb2kud2lkdGggaXMgZXF1YWwgdG8gNCwgYnV0IHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLgotICoJcm9pLndpZHRoIGlzIGVxdWFsIHRvIDgsIGJ1dCBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4KLSAqCXNyY1N0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LgotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSAoCi0gICAgIGNvbnN0IE9NWF9VOCogcFNyYywKLSAgICAgT01YX1MzMiBzcmNTdGVwLAotICAgICBPTVhfVTgqIHBEc3QsCi0gICAgIE9NWF9TMzIgZHN0U3RlcCwKLSAgICAgT01YX1MzMiBkeCwKLSAgICAgT01YX1MzMiBkeSwKLSAgICAgT01YU2l6ZSByb2kKLSApCi17Ci0gICAgcmV0dXJuIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hIAotICAgICAgICAoKE9NWF9VOCopcFNyYywgc3JjU3RlcCwgcERzdCwgZHN0U3RlcCwgcm9pLndpZHRoLCByb2kuaGVpZ2h0LCBkeCwgZHkpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjNiNGUyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsNDQwICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi07Ly8gRnVuY3Rpb246Ci07Ly8gICAgIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hCi07Ly8KLTsvLyBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEgaW4gdjYgYXNzZW1ibHkuCi07Ly8gUGVyZm9ybXMgcXVhcnRlciBwZWwgaW50ZXJwb2xhdGlvbiBvZiBpbnRlciBsdW1hIE1CLgotOy8vIEl0J3MgYXNzdW1lZCB0aGF0IHRoZSBmcmFtZSBpcyBhbHJlYWR5IHBhZGRlZCB3aGVuIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KLTsvLyBQYXJhbWV0ZXJzOgotOy8vIFtpbl0gICAgcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgc291cmNlIHJlZmVyZW5jZSBmcmFtZSBidWZmZXIKLTsvLyBbaW5dICAgIHNyY1N0ZXAgICAgIFJlZmVyZW5jZSBmcmFtZSBzdGVwIGluIGJ5dGUKLTsvLyBbaW5dICAgIGRzdFN0ZXAgICAgIERlc3RpbmF0aW9uIGZyYW1lIHN0ZXAgaW4gYnl0ZS4gTXVzdCBiZSBtdWx0aXBsZSBvZiByb2kud2lkdGgKLTsvLyBbaW5dICAgIGR4ICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IKLTsvLyAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS80IHBpeGVsIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCwzXQotOy8vIFtpbl0gICAgZHkgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IKLTsvLyAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS80IHBpeGVsIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCwzXQotOy8vIFtpbl0gICAgcm9pICAgICAgICAgRGltZW5zaW9uIG9mIHRoZSBpbnRlcnBvbGF0aW9uIHJlZ2lvbjt0aGUgcGFyYW1ldGVycyByb2kud2lkdGggYW5kIHJvaS5oZWlnaHQgbXVzdAotOy8vICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4KLTsvLyBbb3V0XSAgIHBEc3QgICAgICAgIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGZyYW1lIGJ1ZmZlci4KLTsvLyAgICAgICAgICAgICAgICAgICBpZiByb2kud2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkCi07Ly8gICAgICAgICAgICAgICAgICAgaWYgcm9pLndpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZAotOy8vICAgICAgICAgICAgICAgICAgIGlmIHJvaS53aWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkCi07Ly8KLTsvLyBSZXR1cm4gVmFsdWU6Ci07Ly8gSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLgotOy8vIEl0IGlzIGFzc3VlZCB0aGF0IGZvbGxvd2luZyBjYXNlcyBhcmUgc2F0aXNmaWVkIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb246Ci07Ly8gIHBTcmMgb3IgcERzdCBpcyBub3QgTlVMTC4KLTsvLyAgc3JjU3RlcCBvciBkc3RTdGVwID49IHJvaS53aWR0aC4KLTsvLyAgICAgZHggb3IgZHkgaXMgaW4gdGhlIHJhbmdlIFswLTNdLgotOy8vICAgICByb2kud2lkdGggb3Igcm9pLmhlaWdodCBpcyBub3Qgb3V0IG9mIHJhbmdlIHs0LCA4LCAxNn0uCi07Ly8gICAgIElmIHJvaS53aWR0aCBpcyBlcXVhbCB0byA0LCBEc3QgaXMgNCBieXRlIGFsaWduZWQuCi07Ly8gICAgIElmIHJvaS53aWR0aCBpcyBlcXVhbCB0byA4LCBwRHN0IGlzIDggYnl0ZSBhbGlnbmVkLgotOy8vICAgICBJZiByb2kud2lkdGggaXMgZXF1YWwgdG8gMTYsIHBEc3QgaXMgMTYgYnl0ZSBhbGlnbmVkLgotOy8vICAgICBzcmNTdGVwIGFuZCBkc3RTdGVwIGlzIG11bHRpcGxlIG9mIDguCi07Ly8KLTsvLwotCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotCi0gICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLSAgICAgICAgRVhQT1JUIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hCi0gICAgICAgIAotICAgIElGIEFSTTExMzZKUwotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weTR4NF91bnNhZmUKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMl91bnNhZmUKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24zX3Vuc2FmZQotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yRGlhZ0NvcHlfdW5zYWZlCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJEaWFnQ29weV91bnNhZmUKLSAgICBFTkRJRgotCi0gICAgSUYgQVJNMTEzNkpTCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZQotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlCi0gICAgRU5ESUYKLSAgICAKLSAgICAKLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi1wU3JjICAgICAgICAgICAgUk4gMAotc3JjU3RlcCAgICAgICAgIFJOIDEKLXBEc3QgICAgICAgICAgICBSTiAyCi1kc3RTdGVwICAgICAgICAgUk4gMwotaUhlaWdodCAgICAgICAgIFJOIDQKLWlXaWR0aCAgICAgICAgICBSTiA1Ci0KLTsvLyBEZWNsYXJlIG90aGVyIGludGVybWVkaWF0ZSByZWdpc3RlcnMKLWlkeCAgICAgICAgICAgICBSTiA2Ci1pZHkgICAgICAgICAgICAgUk4gNwotaW5kZXggICAgICAgICAgIFJOIDYKLVRlbXAgICAgICAgICAgICBSTiAxMgotcEFyZ3MgICAgICAgICAgIFJOIDExCi0KLQotICAgICAgICA7Ly8gRW5kIG9mIENvcnRleEE4Ci0gICAgICAgICAgICAgICAgICAgIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgCi0gICAgSUYgQVJNMTEzNkpTCi0KLQotICAgICAgICBNX0FMTE9DNCBwcERzdCwgOAotICAgICAgICBNX0FMTE9DNCBwcFNyYywgOAotICAgICAgICBNX0FMTE9DNCBwcEFyZ3MsIDE2Ci0gICAgICAgIE1fQUxMT0M0IHBCdWZmZXIsIDEyMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAxMjAgPSAxMngxMAotICAgICAgICBNX0FMTE9DOCBwSW50ZXJCdWYsIDEyMCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gMTIwID0gMTIqNSoyCi0gICAgICAgIE1fQUxMT0M4IHBUZW1wQnVmLCAzMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAzMiA9ICA4KjQKLSAgICAgICAgCi0gICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgOy8vIEludGVycG9sYXRpb24gb2YgbHVtYSBpcyBpbXBsZW1lbnRlZCBieSBwcm9jZXNzaW5nIGJsb2NrIG9mIHBpeGVscywgc2l6ZSA0eDQgYXQgYSB0aW1lLgotICAgICAgICA7Ly8gRGVwZW5kaW5nIG9uIHRoZSB2YWx1ZXMgb2YgbW90aW9uIHZlY3RvciBmcmFjdGlvbmFsIHBhcnRzIChkeCxkeSksIG9uZSBvdXQgb2YgMTYgY2FzZXMgd2lsbCBiZSBwcm9jZXNzZWQuCi0gICAgICAgIDsvLyBSZWdpc3RlcnMgcjQsIHI1LCByNiB0byBiZSBwcmVzZXJ2ZWQgYnkgaW50ZXJuYWwgdW5zYWZlIGZ1bmN0aW9ucwotICAgICAgICA7Ly8gcjQgLSBpSGVpZ2h0Ci0gICAgICAgIDsvLyByNSAtIGlXaWR0aAotICAgICAgICA7Ly8gcjYgLSBpbmRleAotICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hLCByMTEKLQotOy8vIERlY2xhcmUgb3RoZXIgaW50ZXJtZWRpYXRlIHJlZ2lzdGVycwotaWR4ICAgICAgICAgICAgIFJOIDYKLWlkeSAgICAgICAgICAgICBSTiA3Ci1pbmRleCAgICAgICAgICAgUk4gNgotVGVtcCAgICAgICAgICAgIFJOIDEyCi1wQXJncyAgICAgICAgICAgUk4gMTEKLQotcEJ1ZiAgICAgICAgICAgIFJOIDgKLUhlaWdodCAgICAgICAgICBSTiA5IAotYnVmU3RlcCAgICAgICAgIFJOIDkKLSAgICAgICAgCi0gICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCi0gICAgICAgIE1fQVJHICAgcHRyaWR4LCA0Ci0gICAgICAgIE1fQVJHICAgcHRyaWR5LCA0ICAgICAgICAKLSAgICAgICAgTV9BUkcgICBwdHJXaWR0aCwgNAotICAgICAgICBNX0FSRyAgIHB0ckhlaWdodCwgNCAgICAgICAgCi0KLSAgICAgICAgOy8vIExvYWQgc3RydWN0dXJlIGVsZW1lbnRzIG9mIHJvaSAKLSAgICAgICAgTV9MRFIgICBpZHgsIHB0cmlkeAotICAgICAgICBNX0xEUiAgIGlkeSwgcHRyaWR5Ci0gICAgICAgIE1fTERSICAgaVdpZHRoLCBwdHJXaWR0aAotICAgICAgICBNX0xEUiAgIGlIZWlnaHQsIHB0ckhlaWdodAotICAgICAgICAKLSAgICAgICAgTV9QUklOVEYgInJvaS53aWR0aCAlZFxuIiwgaVdpZHRoCi0gICAgICAgIE1fUFJJTlRGICJyb2kuaGVpZ2h0ICVkXG4iLCBpSGVpZ2h0Ci0KLSAgICAgICAgQUREICAgICBpbmRleCwgaWR4LCBpZHksIExTTCAjMiAgICAgICAgICAgICAgICAgOy8vICBbaW5kZXhdID0gW2lkeV1baWR4XQotICAgICAgICBNX0FEUiAgIHBBcmdzLCBwcEFyZ3MKLQotSW50ZXJwb2xhdGVMdW1hCi1CbG9jazR4NFdpZHRoTG9vcAotQmxvY2s0eDRIZWlnaHRMb29wCi0KLSAgICAgICAgU1RNICAgICBwQXJncywge3BTcmMsc3JjU3RlcCxwRHN0LGRzdFN0ZXB9IAotICAgICAgICBNX0FEUiAgIHBCdWYsIHBCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICA7Ly8gc3dpdGNoIHRhYmxlIHVzaW5nIG1vdGlvbiB2ZWN0b3IgYXMgaW5kZXgKLSAgICAgICAgTV9TV0lUQ0ggaW5kZXgsIEwKLSAgICAgICAgTV9DQVNFICBDYXNlXzAKLSAgICAgICAgTV9DQVNFICBDYXNlXzEKLSAgICAgICAgTV9DQVNFICBDYXNlXzIKLSAgICAgICAgTV9DQVNFICBDYXNlXzMKLSAgICAgICAgTV9DQVNFICBDYXNlXzQKLSAgICAgICAgTV9DQVNFICBDYXNlXzUKLSAgICAgICAgTV9DQVNFICBDYXNlXzYKLSAgICAgICAgTV9DQVNFICBDYXNlXzcKLSAgICAgICAgTV9DQVNFICBDYXNlXzgKLSAgICAgICAgTV9DQVNFICBDYXNlXzkKLSAgICAgICAgTV9DQVNFICBDYXNlX2EKLSAgICAgICAgTV9DQVNFICBDYXNlX2IKLSAgICAgICAgTV9DQVNFICBDYXNlX2MKLSAgICAgICAgTV9DQVNFICBDYXNlX2QKLSAgICAgICAgTV9DQVNFICBDYXNlX2UKLSAgICAgICAgTV9DQVNFICBDYXNlX2YKLSAgICAgICAgTV9FTkRTV0lUQ0gKLQotQ2FzZV8wCi0gICAgICAgIDsvLyBDYXNlIEcKLSAgICAgICAgTV9QUklOVEYgIkNhc2UgMCBcbiIKLQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHk0eDRfdW5zYWZlCi0gICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCi0KLUNhc2VfMQotICAgICAgICA7Ly8gQ2FzZSBhCi0gICAgICAgIE1fUFJJTlRGICJDYXNlIDEgXG4iCi0KLSAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCAjMgotICAgICAgICBNT1YgICAgIEhlaWdodCwgIzQKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjJfdW5zYWZlCi0gICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCi1DYXNlXzIKLSAgICAgICAgOy8vIENhc2UgYgotICAgICAgICBNX1BSSU5URiAiQ2FzZSAyIFxuIgotICAgICAgICAKLSAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCAjMgotICAgICAgICBNT1YgICAgIEhlaWdodCwgIzQKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlICAgICAgICAKLSAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKLUNhc2VfMwotICAgICAgICA7Ly8gQ2FzZSBjCi0gICAgICAgIE1fUFJJTlRGICJDYXNlIDMgXG4iCi0KLSAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCAjMgotICAgICAgICBNT1YgICAgIEhlaWdodCwgIzQKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjNfdW5zYWZlCi0gICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCi1DYXNlXzQKLSAgICAgICAgOy8vIENhc2UgZAotICAgICAgICBNX1BSSU5URiAiQ2FzZSA0IFxuIgotCi0gICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCi0gICAgICAgIE1PViAgICAgSGVpZ2h0LCAjOQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckFsaWduNHhfdW5zYWZlCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMF91bnNhZmUKLQotICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAotQ2FzZV81Ci0gICAgICAgIDsvLyBDYXNlIGUKLSAgICAgICAgTV9QUklOVEYgIkNhc2UgNSBcbiIKLQotICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsICMyCi0gICAgICAgIE1PViAgICAgSGVpZ2h0LCAjNAotICAgICAgICBNX0FEUiAgIHBEc3QsIHBUZW1wQnVmCi0gICAgICAgIE1PViAgICAgZHN0U3RlcCwgIzQKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCi0gICAgICAgIE1fQURSICAgcEFyZ3MsIHBwQXJncwotICAgICAgICBMRE0gICAgIHBBcmdzLCB7cFNyYywgc3JjU3RlcCwgcERzdCwgZHN0U3RlcH0KLSAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgTV9BRFIgICBwQnVmLCBwQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIE1PViAgICAgSGVpZ2h0LCAjOQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckFsaWduNHhfdW5zYWZlCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKLSAgICAgICAgTV9BRFIgICBwU3JjLCBwVGVtcEJ1ZgotICAgICAgICBNT1YgICAgIHNyY1N0ZXAsICM0Ci0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlCi0gICAgICAgIAotCi0gICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCi1DYXNlXzYKLSAgICAgICAgOy8vIENhc2UgZgotICAgICAgICBNX1BSSU5URiAiQ2FzZSA2IFxuIgotCi0gICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgIzIKLSAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgTU9WICAgICBIZWlnaHQsICM5Ci0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKLSAgICAgICAgTV9BRFIgICBwQnVmLCBwSW50ZXJCdWYKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKLSAgICAgICAgTV9BRFIgICBpZHksIHBUZW1wQnVmCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyRGlhZ0NvcHlfdW5zYWZlICAgIAotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZQotICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAotQ2FzZV83Ci0gICAgICAgIDsvLyBDYXNlIGcKLSAgICAgICAgTV9QUklOVEYgIkNhc2UgNyBcbiIKLSAgICAgICAgCi0gICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgIzIKLSAgICAgICAgTU9WICAgICBIZWlnaHQsICM0Ci0gICAgICAgIE1fQURSICAgcERzdCwgcFRlbXBCdWYKLSAgICAgICAgTU9WICAgICBkc3RTdGVwLCAjNAotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKLSAgICAgICAgTV9BRFIgICBwQXJncywgcHBBcmdzCi0gICAgICAgIExETSAgICAgcEFyZ3MsIHtwU3JjLCBzcmNTdGVwLCBwRHN0LCBkc3RTdGVwfQotICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsICMxCi0gICAgICAgIE1fQURSICAgcEJ1ZiwgcEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBNT1YgICAgIEhlaWdodCwgIzkKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCi0gICAgICAgIE1fQURSICAgcFNyYywgcFRlbXBCdWYKLSAgICAgICAgTU9WICAgICBzcmNTdGVwLCAjNAotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZQotCi0gICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCi1DYXNlXzgKLSAgICAgICAgOy8vIENhc2UgaAotICAgICAgICBNX1BSSU5URiAiQ2FzZSA4IFxuIgotCi0gICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCi0gICAgICAgIE1PViAgICAgSGVpZ2h0LCAjOQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckFsaWduNHhfdW5zYWZlCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKLSAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKLUNhc2VfOQotICAgICAgICA7Ly8gQ2FzZSBpCi0gICAgICAgIE1fUFJJTlRGICJDYXNlIDkgXG4iCi0KLSAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCAjMgotICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICBNT1YgICAgIEhlaWdodCwgIzkKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQotICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICBNX0FEUiAgIHBCdWYsIHBJbnRlckJ1ZgotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZQotICAgICAgICBNX0FEUiAgIGlkeSwgcFRlbXBCdWYKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JEaWFnQ29weV91bnNhZmUgICAgCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjJfdW5zYWZlCi0gICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCi1DYXNlX2EKLSAgICAgICAgOy8vIENhc2UgagotICAgICAgICBNX1BSSU5URiAiQ2FzZSBhIFxuIgotCi0gICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgIzIKLSAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgTU9WICAgICBIZWlnaHQsICM5Ci0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKLSAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgTV9BRFIgICBwQnVmLCBwSW50ZXJCdWYKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKLSAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKLUNhc2VfYgotICAgICAgICA7Ly8gQ2FzZSBrCi0gICAgICAgIE1fUFJJTlRGICJDYXNlIGIgXG4iCi0gICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgIzIKLSAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgTU9WICAgICBIZWlnaHQsICM5Ci0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKLSAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgTV9BRFIgICBwQnVmLCBwSW50ZXJCdWYKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKLSAgICAgICAgTV9BRFIgICBpZHksIHBUZW1wQnVmCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yRGlhZ0NvcHlfdW5zYWZlICAgIAotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24zX3Vuc2FmZQotICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAotQ2FzZV9jCi0gICAgICAgIDsvLyBDYXNlIG4KLSAgICAgICAgTV9QUklOVEYgIkNhc2UgYyBcbiIKLQotICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICBNT1YgICAgIEhlaWdodCwgIzkKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCi0gICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcCAgICAgICAgICAgICAgICAgICAgIDsvLyBVcGRhdGUgcFNyYyB0byBvbmUgcm93IGRvd24KLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMF91bnNhZmUKLSAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKLUNhc2VfZAotICAgICAgICA7Ly8gQ2FzZSBwCi0gICAgICAgIE1fUFJJTlRGICJDYXNlIGQgXG4iCi0gICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgIzIKLSAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwCi0gICAgICAgIE1PViAgICAgSGVpZ2h0LCAjNAotICAgICAgICBNX0FEUiAgIHBEc3QsIHBUZW1wQnVmCi0gICAgICAgIE1PViAgICAgZHN0U3RlcCwgIzQKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCi0gICAgICAgIE1fQURSICAgcEFyZ3MsIHBwQXJncwotICAgICAgICBMRE0gICAgIHBBcmdzLCB7cFNyYywgc3JjU3RlcCwgcERzdCwgZHN0U3RlcH0KLSAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgTV9BRFIgICBwQnVmLCBwQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIE1PViAgICAgSGVpZ2h0LCAjOQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckFsaWduNHhfdW5zYWZlCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKLSAgICAgICAgTV9BRFIgICBwU3JjLCBwVGVtcEJ1ZgotICAgICAgICBNT1YgICAgIHNyY1N0ZXAsICM0Ci0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlCi0gICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCi1DYXNlX2UKLSAgICAgICAgOy8vIENhc2UgcQotICAgICAgICBNX1BSSU5URiAiQ2FzZSBlIFxuIgotICAgICAgICAKLSAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCAjMgotICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICBNT1YgICAgIEhlaWdodCwgIzkKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQotICAgICAgICBNX0FEUiAgIHBCdWYsIHBJbnRlckJ1ZgotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZQotICAgICAgICBNX0FEUiAgIGlkeSwgcFRlbXBCdWYKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJEaWFnQ29weV91bnNhZmUKLSAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCAjNCAgICAKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMF91bnNhZmUKLQotICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAotQ2FzZV9mCi0gICAgICAgIDsvLyBDYXNlIHIKLSAgICAgICAgTV9QUklOVEYgIkNhc2UgZiBcbiIKLSAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCAjMgotICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAKLSAgICAgICAgTU9WICAgICBIZWlnaHQsICM0Ci0gICAgICAgIE1fQURSICAgcERzdCwgcFRlbXBCdWYKLSAgICAgICAgTU9WICAgICBkc3RTdGVwLCAjNAotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKLSAgICAgICAgTV9BRFIgICBwQXJncywgcHBBcmdzCi0gICAgICAgIExETSAgICAgcEFyZ3MsIHtwU3JjLCBzcmNTdGVwLCBwRHN0LCBkc3RTdGVwfQotICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsICMxCi0gICAgICAgIE1fQURSICAgcEJ1ZiwgcEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBNT1YgICAgIEhlaWdodCwgIzkKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCi0gICAgICAgIE1fQURSICAgcFNyYywgcFRlbXBCdWYKLSAgICAgICAgTU9WICAgICBzcmNTdGVwLCAjNAotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZQotCi1CbG9jazR4NExvb3BFbmQKLQotICAgICAgICA7Ly8gV2lkdGggTG9vcAotICAgICAgICBTVUJTICAgIGlXaWR0aCwgaVdpZHRoLCAjNAotICAgICAgICBNX0FEUiAgIHBBcmdzLCBwcEFyZ3MKLSAgICAgICAgTERNICAgICBwQXJncywge3BTcmMsc3JjU3RlcCxwRHN0LGRzdFN0ZXB9ICA7Ly8gTG9hZCBhcmd1bWVudHMKLSAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCAjNCAgICAgIAotICAgICAgICBBREQgICAgIHBEc3QsIHBEc3QsICM0Ci0gICAgICAgIEJHVCAgICAgQmxvY2s0eDRXaWR0aExvb3AKLQotICAgICAgICA7Ly8gSGVpZ2h0IExvb3AKLSAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjNAotICAgICAgICBNX0xEUiAgIGlXaWR0aCwgcHRyV2lkdGgKLSAgICAgICAgTV9BRFIgICBwQXJncywgcHBBcmdzCi0gICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMyICAgICAgCi0gICAgICAgIEFERCAgICAgcERzdCwgcERzdCwgZHN0U3RlcCwgTFNMICMyCi0gICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgaVdpZHRoCi0gICAgICAgIFNVQiAgICAgcERzdCwgcERzdCwgaVdpZHRoCi0gICAgICAgIEJHVCAgICAgQmxvY2s0eDRIZWlnaHRMb29wCi0KLUVuZE9mSW50ZXJwb2xhdGlvbgotICAgICAgICBNT1YgICAgIHIwLCAjMAotICAgICAgICBNX0VORAotCi0gICAgRU5ESUYKLSAgICAgICAgICAgICAgICAgICAgCi0KLSAgICBFTkQKLSAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDliNGNmNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1MDggKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gIAotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9wSW5kZXhUYWJsZTh4OAotICAgICAgICAKLTsvLyBEZWZpbmUgdGhlIHByb2Nlc3NvciB2YXJpYW50cyBzdXBwb3J0ZWQgYnkgdGhpcyBmaWxlCi0gICAgICAgICAKLSAgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0gICAgIAotICAgICBBUkVBIHRhYmxlLCBEQVRBICAgIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFRoaXMgdGFibGUgZm9yIGltcGxlbWVudGluZyBzd2l0Y2ggY2FzZSBvZiBDIGluIGFzbSBieQotOy8vIHRoZSBtZWh0b2Qgb2YgdHdvIGxldmVscyBvZiBpbmRleGluZy4KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9wSW5kZXhUYWJsZTh4OAotICAgIERDRCAgT01YX1ZDX0NIUk9NQV9EQywgICAgIE9NWF9WQ19DSFJPTUFfSE9SIAotICAgIERDRCAgT01YX1ZDX0NIUk9NQV9WRVJULCAgIE9NWF9WQ19DSFJPTUFfUExBTkUgIAotICAgIAotICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9NdWx0aXBsaWVyVGFibGVDaHJvbWE4eDgsMQotICAgIERDVyAgIDMsIDIsIDEsNCAKLSAgICBEQ1cgIC0zLC0yLC0xLDAKLSAgICBEQ1cgICAxLCAyLCAzLDQKLSAgICAKLSAgICBJRiBBUk0xMTM2SlMKLSAgCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIENvbnN0YW50cwotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAotCi1CTEtfU0laRSAgICAgICAgRVFVIDB4OAotTVVMX0NPTlNUMCAgICAgIEVRVSAweDAxMDEwMTAxCi1NQVNLX0NPTlNUICAgICAgRVFVIDB4MDBGRjAwRkYKLU1VTF9DT05TVDEgICAgICBFUVUgMHg4MDgwODA4MAotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFNjcmF0Y2ggdmFyaWFibGUKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi15ICAgICAgICAgICAgICAgUk4gMTIgICAKLXBjICAgICAgICAgICAgICBSTiAxNSAgIAotcmV0dXJuICAgICAgICAgIFJOIDAgICAgCi1wU3JjTGVmdDIgICAgICAgUk4gMSAgICAKLXBEc3QyICAgICAgICAgICBSTiAyICAgIAotc3VtMSAgICAgICAgICAgIFJOIDYgICAgCi1zdW0yICAgICAgICAgICAgUk4gNyAgICAKLXBUYWJsZSAgICAgICAgICBSTiA5ICAgIAotZHN0U3RlcHgyICAgICAgIFJOIDExICAgCi1sZWZ0U3RlcHgyICAgICAgUk4gMTQgICAKLW91dGVyQ291bnQgICAgICBSTiAxNCAgIAotcjB4MDEwMTAxMDEgICAgIFJOIDEwICAgCi1yMHgwMEZGMDBGRiAgICAgUk4gMTEgICAKLQotdFZhbDAgICAgICAgICAgIFJOIDAgICAgCi10VmFsMSAgICAgICAgICAgUk4gMSAgICAKLXRWYWwyICAgICAgICAgICBSTiAyICAgIAotdFZhbDMgICAgICAgICAgIFJOIDMgICAgCi10VmFsNCAgICAgICAgICAgUk4gNCAgICAKLXRWYWw1ICAgICAgICAgICBSTiA1ICAgIAotdFZhbDYgICAgICAgICAgIFJOIDYgICAgCi10VmFsNyAgICAgICAgICAgUk4gNyAgICAKLXRWYWw4ICAgICAgICAgICBSTiA4ICAgIAotdFZhbDkgICAgICAgICAgIFJOIDkgICAgCi10VmFsMTAgICAgICAgICAgUk4gMTAgICAKLXRWYWwxMSAgICAgICAgICBSTiAxMSAgIAotdFZhbDEyICAgICAgICAgIFJOIDEyICAgCi10VmFsMTQgICAgICAgICAgUk4gMTQgICAKLQotYiAgICAgICAgICAgICAgIFJOIDE0ICAgCi1jICAgICAgICAgICAgICAgUk4gMTIgICAKLQotcDJwMCAgICAgICAgICAgIFJOIDAgICAgCi1wM3AxICAgICAgICAgICAgUk4gMSAgICAKLXA2cDQgICAgICAgICAgICBSTiAyICAgIAotcDdwNSAgICAgICAgICAgIFJOIDQgICAgCi0KLXBwMnBwMCAgICAgICAgICBSTiA2ICAgIAotcHAzcHAxICAgICAgICAgIFJOIDcgICAgCi1wcDZwcDQgICAgICAgICAgUk4gOCAgICAKLXBwN3BwNSAgICAgICAgICBSTiA5ICAgIAotCi1wMzIxMCAgICAgICAgICAgUk4gMTAgICAKLXA3NjU0ICAgICAgICAgICBSTiAxMCAgIAotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIElucHV0IEFyZ3VtZW50cwotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBTcmNMZWZ0ICAgICAgICBSTiAwICAgIDsvLyBpbnB1dCBwb2ludGVyCi1wU3JjQWJvdmUgICAgICAgUk4gMSAgICA7Ly8gaW5wdXQgcG9pbnRlcgotcFNyY0Fib3ZlTGVmdCAgIFJOIDIgICAgOy8vIGlucHV0IHBvaW50ZXIKLXBEc3QgICAgICAgICAgICBSTiAzICAgIDsvLyBvdXRwdXQgcG9pbnRlcgotbGVmdFN0ZXAgICAgICAgIFJOIDQgICAgOy8vIGlucHV0IHZhcmlhYmxlCi1kc3RTdGVwICAgICAgICAgUk4gNSAgICA7Ly8gaW5wdXQgdmFyaWFibGUKLXByZWRNb2RlICAgICAgICBSTiA2ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQotYXZhaWxhYmlsaXR5ICAgIFJOIDcgICAgOy8vIGlucHV0IHZhcmlhYmxlCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4IHN0YXJ0cwotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgCi0gICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDgsIHIxMQotICAgICAgICAKLSAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKLSAgICAgICAgTV9BUkcgICAgTGVmdFN0ZXAsICAgICA0Ci0gICAgICAgIE1fQVJHICAgIERzdFN0ZXAsICAgICAgNAotICAgICAgICBNX0FSRyAgICBQcmVkTW9kZSwgICAgIDQKLSAgICAgICAgTV9BUkcgICAgQXZhaWxhYmlsaXR5LCA0Ci0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NAotICAgICAgICAKLSAgICAgICAgTERSICAgICAgcFRhYmxlLD1hcm1WQ000UDEwX3BJbmRleFRhYmxlOHg4ICAgOy8vIExvYWQgaW5kZXggdGFibGUgZm9yIHN3aXRjaCBjYXNlCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKLSAgICAgICAgTV9MRFIgICAgcHJlZE1vZGUsIFByZWRNb2RlICAgICAgICAgICAgICAgICAgOy8vIEFyZyBwcmVkTW9kZSBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCi0gICAgICAgIE1fTERSICAgIGxlZnRTdGVwLCBMZWZ0U3RlcCAgICAgICAgICAgICAgICAgIDsvLyBBcmcgbGVmdFN0ZXAgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnIAotICAgICAgICBNX0xEUiAgICBkc3RTdGVwLCAgRHN0U3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gQXJnIGRzdFN0ZXAgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnICAgICAgICAgCi0gICAgICAgIE1fTERSICAgIGF2YWlsYWJpbGl0eSwgQXZhaWxhYmlsaXR5ICAgICAgICAgIDsvLyBBcmcgYXZhaWxhYmlsaXR5IGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgIHksICNCTEtfU0laRSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBPdXRlciBMb29wIENvdW50Ci0gICAgICAgIExEUiAgICAgIHBjLCBbcFRhYmxlLCBwcmVkTW9kZSwgTFNMICMyXSAgICAgIDsvLyBCcmFuY2ggdG8gdGhlIGNhc2UgYmFzZWQgb24gcHJlTW9kZQotCi1PTVhfVkNfQ0hST01BX0RDCi0gICAgICAgIEFORCAgICAgIGF2YWlsYWJpbGl0eSwgYXZhaWxhYmlsaXR5LCMoT01YX1ZDX1VQUEVSICsgT01YX1ZDX0xFRlQpCi0gICAgICAgIENNUCAgICAgIGF2YWlsYWJpbGl0eSwgIyhPTVhfVkNfVVBQRVIgKyBPTVhfVkNfTEVGVCkgOy8vIGlmKGF2YWlsYWJpbGl0eSAmICgjT01YX1ZDX1VQUEVSIHwgI09NWF9WQ19MRUZUKSkKLSAgICAgICAgTERSICAgICAgcjB4MDEwMTAxMDEsID1NVUxfQ09OU1QwCi0gICAgICAgIEJORSAgICAgIFRTVF9VUFBFUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBKdW1wIHRvIFVwcGVyIGlmIG5vdCBib3RoCi0gICAgICAgIExETSAgICAgIHBTcmNBYm92ZSx7dFZhbDgsdFZhbDl9ICAgICAgICAgICAgIDsvLyB0VmFsIDggdG8gOSA9IHBTcmNBYm92ZVswIHRvIDddCi0gICAgICAgIAotICAgICAgICBBREQgICAgICBsZWZ0U3RlcHgyLCBsZWZ0U3RlcCxsZWZ0U3RlcCAgICAgICA7Ly8gbGVmdFN0ZXB4MiA9IDIgKiBsZWZ0U3RlcAotICAgICAgICBBREQgICAgICBwU3JjTGVmdDIsIHBTcmNMZWZ0LCBsZWZ0U3RlcCAgICAgICA7Ly8gcFNyY0xlZnQyID0gcFNyY0xlZnQgKyBsZWZ0U3RlcAotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKLSAgICAgICAKLSAgICAgICAgVVhUQjE2ICAgdFZhbDcsIHRWYWw4ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswLCAyXQotICAgICAgICBVWFRCMTYgICB0VmFsOCwgdFZhbDgsIFJPUiAjOCAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzEsIDNdCi0gICAgICAgIFVBREQxNiAgIHN1bTEsIHRWYWw3LCB0VmFsOCAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCwgMl0gKyBwU3JjQWJvdmVbMSwgM10KLSAgICAgICAgCi0gICAgICAgIFVYVEIxNiAgIHRWYWw3LCB0VmFsOSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNCwgNl0KLSAgICAgICAgVVhUQjE2ICAgdFZhbDksIHRWYWw5LCBST1IgIzggICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs1LCA3XQotICAgICAgICBVQUREMTYgICBzdW0yLCB0VmFsNywgdFZhbDkgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAsIDJdICsgcFNyY0Fib3ZlWzQsIDZdCi0gICAgICAgIEFERCAgICAgIHN1bTEsIHN1bTEsIHN1bTEsIExTUiAjMTYgICAgICAgICAgIDsvLyBzdW0ocFNyY0Fib3ZlWzBdIHRvIHBTcmNBYm92ZVszXSkKLSAgICAgICAgQUREICAgICAgc3VtMiwgc3VtMiwgc3VtMiwgTFNSICMxNiAgICAgICAgICAgOy8vIHN1bShwU3JjQWJvdmVbNF0gdG8gcFNyY0Fib3ZlWzddKQotICAgICAgICBVWFRIICAgICBzdW0xLCBzdW0xICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdXBzdW0xIChDbGVhciB0aGUgdG9wIGp1bmsgYml0cykKLSAgICAgICAgVVhUSCAgICAgc3VtMiwgc3VtMiAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHVwc3VtMiAoQ2xlYXIgdGhlIHRvcCBqdW5rIGJpdHMpCi0gICAgICAgIAotICAgICAgICBNX0xEUkIgICB0VmFsOCwgW3BTcmNMZWZ0XSwgICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDggPSBwU3JjTGVmdFswXQotICAgICAgICBNX0xEUkIgICB0VmFsOSwgW3BTcmNMZWZ0Ml0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDkgPSBwU3JjTGVmdFsxXQotICAgICAgICBNX0xEUkIgICB0VmFsNCwgW3BTcmNMZWZ0XSwgICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDQgPSBwU3JjTGVmdFsyXQotICAgICAgICBNX0xEUkIgICB0VmFsMTIsW3BTcmNMZWZ0Ml0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDEyPSBwU3JjTGVmdFszXQotICAgICAgICBBREQgICAgICB0VmFsMiwgdFZhbDgsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gdFZhbDE0ID0gdFZhbDggKyB0VmFsOQotICAgICAgICAKLSAgICAgICAgTV9MRFJCICAgdFZhbDgsIFtwU3JjTGVmdF0sICArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWw4ID0gcFNyY0xlZnRbNF0KLSAgICAgICAgTV9MRFJCICAgdFZhbDksIFtwU3JjTGVmdDJdLCArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWw5ID0gcFNyY0xlZnRbNV0KLSAgICAgICAgQUREICAgICAgdFZhbDE0LCB0VmFsNCwgdFZhbDEyICAgICAgICAgICAgICAgOy8vIHRWYWwxNCA9IHRWYWw0ICsgdFZhbDEyCi0gICAgICAgIAotICAgICAgICBMRFJCICAgICB0VmFsNCwgW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDQgPSBwU3JjTGVmdFs2XQotICAgICAgICBMRFJCICAgICB0VmFsMTIsW3BTcmNMZWZ0Ml0gICAgICAgICAgICAgICAgICA7Ly8gdFZhbDEyPSBwU3JjTGVmdFs3XQotICAgICAgICBBREQgICAgICB0VmFsOCwgdFZhbDgsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gdFZhbDggPSB0VmFsOCArIHRWYWw5Ci0gICAgICAgIEFERCAgICAgIHRWYWwyLCB0VmFsMiwgdFZhbDE0ICAgICAgICAgICAgICAgIDsvLyBsZWZ0c3VtMSAgPSBzdW0ocFNyY0xlZnRbMF0gdG8gcFNyY0xlZnRbM10pCi0gICAgICAgIEFERCAgICAgIHRWYWw0LCB0VmFsNCwgdFZhbDEyICAgICAgICAgICAgICAgIDsvLyB0VmFsNCA9IHRWYWw0ICsgdFZhbDEyCi0gICAgICAgIEFERCAgICAgIHRWYWwxNCwgdFZhbDgsIHRWYWw0ICAgICAgICAgICAgICAgIDsvLyBsZWZ0c3VtMiAgPSBzdW0ocFNyY0xlZnRbNF0gdG8gcFNyY0xlZnRbN10pCi0gICAgICAgIEFERCAgICAgIHRWYWw4LCB0VmFsMTQsICMyICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsOCA9IGxlZnRzdW0yICsgMgotICAgICAgICBBREQgICAgICB0VmFsOSwgc3VtMiwgICAjMiAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDggPSB1cHN1bTIgKyAyCi0gICAgICAgIEFERCAgICAgIHN1bTEsICBzdW0xLCB0VmFsMiAgICAgICAgICAgICAgICAgIDsvLyBzdW0xID0gdXBzdW0xICsgbGVmdHN1bTEKLSAgICAgICAgQUREICAgICAgc3VtMiwgIHN1bTIsIHRWYWwxNCAgICAgICAgICAgICAgICAgOy8vIHN1bTIgPSB1cHN1bTIgKyBsZWZ0c3VtMgotICAgICAgICBBREQgICAgICBzdW0xLCBzdW0xLCAjNCAgICAgICAgICAgICAgICAgICAgICA7Ly8gKHN1bTEgKyA0KQotICAgICAgICBBREQgICAgICBzdW0yLCBzdW0yLCAjNCAgICAgICAgICAgICAgICAgICAgICA7Ly8gKHN1bTIgKyA0KQotICAgICAgICBNT1YgICAgICBzdW0xLCAgc3VtMSwgIExTUiAjMyAgICAgICAgICAgICAgICA7Ly8gKHN1bTEgKyA0KT4+MwotICAgICAgICBNT1YgICAgICB0VmFsOSwgdFZhbDksIExTUiAjMiAgICAgICAgICAgICAgICA7Ly8gKHRWYWw5ICsgMik+PjIKLSAgICAgICAgTU9WICAgICAgdFZhbDgsIHRWYWw4LCBMU1IgIzIgICAgICAgICAgICAgICAgOy8vICh0VmFsOCArIDIpPj4yCi0gICAgICAgIE1PViAgICAgIHN1bTIsICBzdW0yLCAgTFNSICMzICAgICAgICAgICAgICAgIDsvLyAoc3VtMiArIDQpPj4zCi0gICAgICAgIAotICAgICAgICBNVUwgICAgICB0VmFsMCwgc3VtMSwgcjB4MDEwMTAxMDEgICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcwotICAgICAgICBNVUwgICAgICB0VmFsMSwgdFZhbDkscjB4MDEwMTAxMDEgICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcwotICAgICAgICBNVUwgICAgICB0VmFsOCwgdFZhbDgscjB4MDEwMTAxMDEgICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcwotICAgICAgICBNVUwgICAgICB0VmFsOSwgc3VtMiwgcjB4MDEwMTAxMDEgICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcwotICAgICAgICAKLSAgICAgICAgTV9TVFJEICAgdFZhbDAsIHRWYWwxLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMCB0byA3XSAgID0gdFZhbCAwIHRvIDEKLSAgICAgICAgTV9TVFJEICAgdFZhbDAsIHRWYWwxLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbOCB0byAxNV0gID0gdFZhbCAwIHRvIDEKLSAgICAgICAgTV9TVFJEICAgdFZhbDAsIHRWYWwxLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMTYgdG8gMjNdID0gdFZhbCAwIHRvIDEKLSAgICAgICAgTV9TVFJEICAgdFZhbDAsIHRWYWwxLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMjQgdG8gMzFdID0gdFZhbCAwIHRvIDEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBNX1NUUkQgICB0VmFsOCwgdFZhbDksIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFszMiB0byAzOV0gPSB0VmFsIDggdG8gOQotICAgICAgICBNX1NUUkQgICB0VmFsOCwgdFZhbDksIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs0MCB0byA0N10gPSB0VmFsIDggdG8gOQotICAgICAgICBNX1NUUkQgICB0VmFsOCwgdFZhbDksIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs0OCB0byA1NV0gPSB0VmFsIDggdG8gOQotICAgICAgICBNX1NUUkQgICB0VmFsOCwgdFZhbDksIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs1NiB0byA2M10gPSB0VmFsIDggdG8gOQotICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0gICAgICAgIE1fRVhJVAotICAgICAgICAKLVRTVF9VUFBFUgotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTMKLSAgICAgICAgCi0gICAgICAgIENNUCAgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19VUFBFUiAgICAgICAgIDsvLyBpZihhdmFpbGFiaWxpdHkgJiAjT01YX1ZDX1VQUEVSKQotICAgICAgICAKLSAgICAgICAgQk5FICAgICAgVFNUX0xFRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEp1bXAgdG8gTGVmdCBpZiBub3QgdXBwZXIKLSAgICAgICAgTERNICAgICAgcFNyY0Fib3ZlLHt0VmFsOCx0VmFsOX0gICAgICAgICAgICAgOy8vIHRWYWwgOCB0byA5ID0gcFNyY0Fib3ZlWzAgdG8gN10KLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0zCi0gICAgICAgIAotICAgICAgICBVWFRCMTYgICB0VmFsNywgdFZhbDggICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAsIDJdCi0gICAgICAgIFVYVEIxNiAgIHRWYWw4LCB0VmFsOCwgUk9SICM4ICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMSwgM10KLSAgICAgICAgVUFERDE2ICAgc3VtMSwgIHRWYWw3LCB0VmFsOCAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswLCAyXSArIHBTcmNBYm92ZVsxLCAzXQotICAgICAgICAKLSAgICAgICAgVVhUQjE2ICAgdFZhbDcsIHRWYWw5ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs0LCA2XQotICAgICAgICBVWFRCMTYgICB0VmFsOSwgdFZhbDksIFJPUiAjOCAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzUsIDddCi0gICAgICAgIFVBREQxNiAgIHN1bTIsICB0VmFsNywgdFZhbDkgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCwgMl0gKyBwU3JjQWJvdmVbNCwgNl0KLSAgICAgICAgCi0gICAgICAgIEFERCAgICAgIHN1bTEsIHN1bTEsIHN1bTEsIExTUiAjMTYgICAgICAgICAgIDsvLyBzdW0ocFNyY0Fib3ZlWzBdIHRvIHBTcmNBYm92ZVszXSkKLSAgICAgICAgQUREICAgICAgc3VtMiwgc3VtMiwgc3VtMiwgTFNSICMxNiAgICAgICAgICAgOy8vIHN1bShwU3JjQWJvdmVbNF0gdG8gcFNyY0Fib3ZlWzddKQotICAgICAgICAKLSAgICAgICAgVVhUSCAgICAgc3VtMSwgc3VtMSAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHVwc3VtMSAoQ2xlYXIgdGhlIHRvcCBqdW5rIGJpdHMpCi0gICAgICAgIFVYVEggICAgIHN1bTIsIHN1bTIgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB1cHN1bTIgKENsZWFyIHRoZSB0b3AganVuayBiaXRzKQotICAgICAgICAKLSAgICAgICAgQUREICAgICAgc3VtMSwgc3VtMSwgIzIgICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bTEgKyAyCi0gICAgICAgIEFERCAgICAgIHN1bTIsIHN1bTIsICMyICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0yICsgMgotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgc3VtMSwgc3VtMSwgTFNSICMyICAgICAgICAgICAgICAgICAgOy8vIChzdW0xICsgMik+PjIKLSAgICAgICAgTU9WICAgICAgc3VtMiwgc3VtMiwgTFNSICMyICAgICAgICAgICAgICAgICAgOy8vIChzdW0yICsgMik+PjIKLSAgICAgICAgCi0gICAgICAgIE1VTCAgICAgIHN1bTEsIHN1bTEscjB4MDEwMTAxMDEgICAgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCi0gICAgICAgIE1VTCAgICAgIHN1bTIsIHN1bTIscjB4MDEwMTAxMDEgICAgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCi0gICAgICAgIAotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFswIHRvIDddICAgPSB0VmFsIDYgdG8gNwotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs4IHRvIDE1XSAgPSB0VmFsIDYgdG8gNwotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFsxNiB0byAyM10gPSB0VmFsIDYgdG8gNwotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFsyNCB0byAzMV0gPSB0VmFsIDYgdG8gNwotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFszMiB0byAzOV0gPSB0VmFsIDYgdG8gNwotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs0MCB0byA0N10gPSB0VmFsIDYgdG8gNwotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs0OCB0byA1NV0gPSB0VmFsIDYgdG8gNwotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs1NiB0byA2M10gPSB0VmFsIDYgdG8gNwotICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0gICAgICAgIE1fRVhJVAotICAgICAgICAKLVRTVF9MRUZUIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MyAgICAgICAKLSAgICAgICAgCi0gICAgICAgIENNUCAgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19MRUZUCi0gICAgICAgIEJORSAgICAgIFRTVF9DT1VOVDAKLSAgICAgICAgQUREICAgICAgbGVmdFN0ZXB4MiwgbGVmdFN0ZXAsbGVmdFN0ZXAgICAgICAgOy8vIGxlZnRTdGVweDIgPSAyICogbGVmdFN0ZXAKLSAgICAgICAgQUREICAgICAgcFNyY0xlZnQyLCBwU3JjTGVmdCwgbGVmdFN0ZXAgICAgICAgOy8vIHBTcmNMZWZ0MiA9IHBTcmNMZWZ0ICsgbGVmdFN0ZXAKLSAgICAgICAgCi0gICAgICAgIE1fTERSQiAgIHRWYWw4LCBbcFNyY0xlZnRdLCAgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOCA9IHBTcmNMZWZ0WzBdCi0gICAgICAgIE1fTERSQiAgIHRWYWw5LCBbcFNyY0xlZnQyXSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOSA9IHBTcmNMZWZ0WzFdCi0gICAgICAgIE1fTERSQiAgIHRWYWw0LCBbcFNyY0xlZnRdLCAgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsNCA9IHBTcmNMZWZ0WzJdCi0gICAgICAgIE1fTERSQiAgIHRWYWwxMixbcFNyY0xlZnQyXSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsMTI9IHBTcmNMZWZ0WzNdCi0gICAgICAgIAotICAgICAgICBBREQgICAgICB0VmFsNiwgdFZhbDgsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gdFZhbDYgPSB0VmFsOCArIHRWYWw5Ci0gICAgICAgIAotICAgICAgICBNX0xEUkIgICB0VmFsOCwgW3BTcmNMZWZ0XSwgICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDggPSBwU3JjTGVmdFs0XQotICAgICAgICBBREQgICAgICB0VmFsNywgdFZhbDQsIHRWYWwxMiAgICAgICAgICAgICAgICA7Ly8gdFZhbDcgPSB0VmFsNCArIHRWYWwxMgotICAgICAgICBNX0xEUkIgICB0VmFsOSwgW3BTcmNMZWZ0Ml0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDkgPSBwU3JjTGVmdFs1XQotICAgICAgICBNX0xEUkIgICB0VmFsNCwgW3BTcmNMZWZ0XSwgICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDQgPSBwU3JjTGVmdFs2XQotICAgICAgICBNX0xEUkIgICB0VmFsMTIsW3BTcmNMZWZ0Ml0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDEyPSBwU3JjTGVmdFs3XQotICAgICAgICAKLSAgICAgICAgQUREICAgICAgdFZhbDgsIHRWYWw4LCB0VmFsOSAgICAgICAgICAgICAgICAgOy8vIHRWYWw4ID0gdFZhbDggKyB0VmFsOQotICAgICAgICBBREQgICAgICBzdW0xLCAgdFZhbDYsIHRWYWw3ICAgICAgICAgICAgICAgICA7Ly8gc3VtMSAgPSBzdW0ocFNyY0xlZnRbMF0gdG8gcFNyY0xlZnRbM10pCi0gICAgICAgIEFERCAgICAgIHRWYWw0LCB0VmFsNCwgdFZhbDEyICAgICAgICAgICAgICAgIDsvLyB0VmFsNCA9IHRWYWw0ICsgdFZhbDEyCi0gICAgICAgIEFERCAgICAgIHN1bTIsICB0VmFsOCwgdFZhbDQgICAgICAgICAgICAgICAgIDsvLyBzdW0yICA9IHN1bShwU3JjTGVmdFs0XSB0byBwU3JjTGVmdFs3XSkKLSAgICAgICAgCi0gICAgICAgIEFERCAgICAgIHN1bTEsIHN1bTEsICMyICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0xICsgMgotICAgICAgICBBREQgICAgICBzdW0yLCBzdW0yLCAjMiAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3VtMiArIDIKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgIHN1bTEsIHN1bTEsIExTUiAjMiAgICAgICAgICAgICAgICAgIDsvLyAoc3VtMSArIDIpPj4yCi0gICAgICAgIE1PViAgICAgIHN1bTIsIHN1bTIsIExTUiAjMiAgICAgICAgICAgICAgICAgIDsvLyAoc3VtMiArIDIpPj4yCi0gICAgICAgIAotICAgICAgICBNVUwgICAgICB0VmFsNiwgc3VtMSxyMHgwMTAxMDEwMSAgICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcwotICAgICAgICBNVUwgICAgICB0VmFsOCwgc3VtMixyMHgwMTAxMDEwMSAgICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcwotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKLSAgICAgICAgTU9WICAgICAgdFZhbDcsdFZhbDYgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWw3ID0gc3VtMQotICAgICAgICBNT1YgICAgICB0VmFsOSx0VmFsOCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDkgPSBzdW0yCi0gICAgICAgIAotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFswIHRvIDddICAgPSB0VmFsIDYgdG8gNwotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs4IHRvIDE1XSAgPSB0VmFsIDYgdG8gNwotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFsxNiB0byAyM10gPSB0VmFsIDYgdG8gNwotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFsyNCB0byAzMV0gPSB0VmFsIDYgdG8gNwotICAgICAgICAKLSAgICAgICAgTV9TVFJEICAgdFZhbDgsIHRWYWw5LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMzIgdG8gMzldID0gdFZhbCA4IHRvIDkKLSAgICAgICAgTV9TVFJEICAgdFZhbDgsIHRWYWw5LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbNDAgdG8gNDddID0gdFZhbCA4IHRvIDkKLSAgICAgICAgTV9TVFJEICAgdFZhbDgsIHRWYWw5LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbNDggdG8gNTVdID0gdFZhbCA4IHRvIDkKLSAgICAgICAgTV9TVFJEICAgdFZhbDgsIHRWYWw5LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbNTYgdG8gNjNdID0gdFZhbCA4IHRvIDkKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1hY3JvIHRvIGV4aXQgbWlkd2F5LWJyZWFrIGZybSBjYXNlCi0KLVRTVF9DT1VOVDAKLSAgICAgICAgTERSICAgICAgc3VtMSwgPU1VTF9DT05TVDEgICAgICAgICAgICAgICAgICA7Ly8gc3VtMSA9IDB4ODA4MDgwODAgaWYoY291bnQgPT0gMCkKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0yCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICB0VmFsNywgc3VtMSAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDcgPSBzdW0xCi0gICAgICAgIAotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFswIHRvIDddICAgPSB0VmFsIDYgdG8gNwotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs4IHRvIDE1XSAgPSB0VmFsIDYgdG8gNwotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFsxNiB0byAyM10gPSB0VmFsIDYgdG8gNwotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFsyNCB0byAzMV0gPSB0VmFsIDYgdG8gNwotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFszMiB0byAzOV0gPSB0VmFsIDYgdG8gNwotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs0MCB0byA0N10gPSB0VmFsIDYgdG8gNwotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs0OCB0byA1NV0gPSB0VmFsIDYgdG8gNwotICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs1NiB0byA2M10gPSB0VmFsIDYgdG8gNwotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgotICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKLQotT01YX1ZDX0NIUk9NQV9IT1IKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0yIAotICAgICAgICAKLSAgICAgICAgQUREICAgICAgcFNyY0xlZnQyLCBwU3JjTGVmdCwgbGVmdFN0ZXAgICAgICAgOy8vIHBTcmNMZWZ0MiA9IHBTcmNMZWZ0ICsgbGVmdFN0ZXAKLSAgICAgICAgQUREICAgICAgbGVmdFN0ZXB4MiwgbGVmdFN0ZXAsIGxlZnRTdGVwICAgICAgOy8vIGxlZnRTdGVweDIgPSBsZWZ0U3RlcCAqIDIKLSAgICAgICAgQUREICAgICAgcERzdDIsIHBEc3QsIGRzdFN0ZXAgICAgICAgICAgICAgICAgOy8vIHBEc3QyID0gcERzdCArIGRzdFN0ZXAKLSAgICAgICAgQUREICAgICAgZHN0U3RlcHgyLCBkc3RTdGVwLCBkc3RTdGVwICAgICAgICAgOy8vIGRvdWJsZSBkc3RTdGVwCi0gICAgICAgIFNVQiAgICAgIGRzdFN0ZXB4MiwgZHN0U3RlcHgyLCAjNCAgICAgICAgICAgIDsvLyBkb3VibGUgZHN0U3RlcCAgbWludXMgNAotICAgICAgICBMRFIgICAgICByMHgwMTAxMDEwMSwgPU1VTF9DT05TVDAgICAgICAgICAgICA7Ly8gQ29uc3QgdG8gcmVwZWF0IHRoZSBieXRlIGluIHJlZyA0IHRpbWVzCi0gICAgICAgIE1fTERSQiAgIHRWYWw2LCBbcFNyY0xlZnRdLCArbGVmdFN0ZXB4MiAgICAgIDsvLyB0VmFsNiA9IHBTcmNMZWZ0WzBdCi0gICAgICAgIE1fTERSQiAgIHRWYWw3LCBbcFNyY0xlZnQyXSwrbGVmdFN0ZXB4MiAgICAgIDsvLyB0VmFsNyA9IHBTcmNMZWZ0WzFdCi0gICAgICAgIE1fTERSQiAgIHRWYWw4LCBbcFNyY0xlZnRdLCArbGVmdFN0ZXB4MiAgICAgIDsvLyB0VmFsOCA9IHBTcmNMZWZ0WzJdCi0gICAgICAgIE1fTERSQiAgIHRWYWw5LCBbcFNyY0xlZnQyXSwrbGVmdFN0ZXB4MiAgICAgIDsvLyB0VmFsOSA9IHBTcmNMZWZ0WzNdCi0gICAgICAgIE1VTCAgICAgIHRWYWw2LCB0VmFsNiwgcjB4MDEwMTAxMDEgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCi0gICAgICAgIE1VTCAgICAgIHRWYWw3LCB0VmFsNywgcjB4MDEwMTAxMDEgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCi0gICAgICAgIE1VTCAgICAgIHRWYWw4LCB0VmFsOCwgcjB4MDEwMTAxMDEgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCi0gICAgICAgIE1VTCAgICAgIHRWYWw5LCB0VmFsOSwgcjB4MDEwMTAxMDEgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCi0gICAgICAgIFNUUiAgICAgIHRWYWw2LCBbcERzdF0sICAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3QgWzAgdG8gM10gCi0gICAgICAgIFNUUiAgICAgIHRWYWw3LCBbcERzdDJdLCAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDd9IGF0IHBEc3QyWzAgdG8gM10KLSAgICAgICAgTV9TVFIgICAgdFZhbDYsIFtwRHN0XSwgIGRzdFN0ZXB4MiAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdCBbNCB0byA3XQotICAgICAgICBNX1NUUiAgICB0VmFsNywgW3BEc3QyXSwgZHN0U3RlcHgyICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0Mls0IHRvIDddCi0gICAgICAgIFNUUiAgICAgIHRWYWw4LCBbcERzdF0sICAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3QgWzAgdG8gM10KLSAgICAgICAgU1RSICAgICAgdFZhbDksIFtwRHN0Ml0sICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbMCB0byAzXQotICAgICAgICBNX1NUUiAgICB0VmFsOCwgW3BEc3RdLCAgZHN0U3RlcHgyICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0IFs0IHRvIDddCi0gICAgICAgIE1fU1RSICAgIHRWYWw5LCBbcERzdDJdLCBkc3RTdGVweDIgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDd9IGF0IHBEc3QyWzQgdG8gN10KLSAgICAgICAgTV9MRFJCICAgdFZhbDYsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcHgyICAgICAgOy8vIHRWYWw2ID0gcFNyY0xlZnRbNF0KLSAgICAgICAgTV9MRFJCICAgdFZhbDcsIFtwU3JjTGVmdDJdLCtsZWZ0U3RlcHgyICAgICAgOy8vIHRWYWw3ID0gcFNyY0xlZnRbNV0KLSAgICAgICAgTV9MRFJCICAgdFZhbDgsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcHgyICAgICAgOy8vIHRWYWw4ID0gcFNyY0xlZnRbNl0KLSAgICAgICAgTV9MRFJCICAgdFZhbDksIFtwU3JjTGVmdDJdLCtsZWZ0U3RlcHgyICAgICAgOy8vIHRWYWw5ID0gcFNyY0xlZnRbN10KLSAgICAgICAgTVVMICAgICAgdFZhbDYsIHRWYWw2LCByMHgwMTAxMDEwMSAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKLSAgICAgICAgTVVMICAgICAgdFZhbDcsIHRWYWw3LCByMHgwMTAxMDEwMSAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKLSAgICAgICAgTVVMICAgICAgdFZhbDgsIHRWYWw4LCByMHgwMTAxMDEwMSAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKLSAgICAgICAgTVVMICAgICAgdFZhbDksIHRWYWw5LCByMHgwMTAxMDEwMSAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKLSAgICAgICAgU1RSICAgICAgdFZhbDYsIFtwRHN0XSwgICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdCBbMCB0byAzXSAKLSAgICAgICAgU1RSICAgICAgdFZhbDcsIFtwRHN0Ml0sICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbMCB0byAzXQotICAgICAgICBNX1NUUiAgICB0VmFsNiwgW3BEc3RdLCAgZHN0U3RlcHgyICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0IFs0IHRvIDddCi0gICAgICAgIE1fU1RSICAgIHRWYWw3LCBbcERzdDJdLCBkc3RTdGVweDIgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDd9IGF0IHBEc3QyWzQgdG8gN10KLSAgICAgICAgU1RSICAgICAgdFZhbDgsIFtwRHN0XSwgICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdCBbMCB0byAzXQotICAgICAgICBTVFIgICAgICB0VmFsOSwgW3BEc3QyXSwgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0MlswIHRvIDNdCi0gICAgICAgIE1fU1RSICAgIHRWYWw4LCBbcERzdF0sICBkc3RTdGVweDIgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3QgWzQgdG8gN10KLSAgICAgICAgTV9TVFIgICAgdFZhbDksIFtwRHN0Ml0sIGRzdFN0ZXB4MiAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbNCB0byA3XQotICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0gICAgICAgIE1fRVhJVAotICAgICAgICAKLU9NWF9WQ19DSFJPTUFfVkVSVAotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTQgICAgICAgIAotICAgICAgICAKLSAgICAgICAgTERNSUEgICAgcFNyY0Fib3ZlLCB7dFZhbDYsdFZhbDd9ICAgICAgICAgICAgOy8vIHRWYWwgNiB0byA3ID0gcFNyY0Fib3ZlWzAgdG8gN10KLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgotICAgICAgICAKLSAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMCB0byA3XSAgID0gdFZhbCA2IHRvIDcKLSAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbOCB0byAxNV0gID0gdFZhbCA2IHRvIDcKLSAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMTYgdG8gMjNdID0gdFZhbCA2IHRvIDcKLSAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMjQgdG8gMzFdID0gdFZhbCA2IHRvIDcKLSAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMzIgdG8gMzldID0gdFZhbCA2IHRvIDcKLSAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbNDAgdG8gNDddID0gdFZhbCA2IHRvIDcKLSAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbNDggdG8gNTVdID0gdFZhbCA2IHRvIDcKLSAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbNTYgdG8gNjNdID0gdFZhbCA2IHRvIDcKLQotICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKLSAgICAgICAgCi1PTVhfVkNfQ0hST01BX1BMQU5FCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MwotICAgICAgICAKLSAgICAgICAgUlNCICAgICAgdFZhbDE0LCBsZWZ0U3RlcCwgbGVmdFN0ZXAsIExTTCAjMyAgOy8vIDcqbGVmdFN0ZXAKLSAgICAgICAgTERSQiAgICAgdFZhbDcsIFtwU3JjQWJvdmUsICMrN10gICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs3XQotICAgICAgICBMRFJCICAgICB0VmFsNiwgW3BTcmNMZWZ0LCArdFZhbDE0XSAgICAgICAgICA7Ly8gcFNyY0xlZnRbNypsZWZ0U3RlcF0KLSAgICAgICAgTERSQiAgICAgdFZhbDgsIFtwU3JjQWJvdmVMZWZ0XSAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZUxlZnRbMF0KLSAgICAgICAgTERSQiAgICAgdFZhbDksIFtwU3JjQWJvdmUsICMrNiBdICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs2XQotICAgICAgICBMRFJCICAgICB0VmFsMTAsW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzBdCi0gICAgICAgIEFERCAgICAgIHRWYWwyLCB0VmFsNywgdFZhbDYgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbN10gKyBwU3JjTGVmdFs3KmxlZnRTdGVwXQotICAgICAgICBTVUIgICAgICB0VmFsNiwgdFZhbDYsIHRWYWw4ICAgICAgICAgICAgICAgICA7Ly8gVjAgPSBwU3JjTGVmdFs3KmxlZnRTdGVwXSAtIHBTcmNBYm92ZUxlZnRbMF0KLSAgICAgICAgU1VCICAgICAgdFZhbDcsIHRWYWw3LCB0VmFsOCAgICAgICAgICAgICAgICAgOy8vIEgwID0gcFNyY0Fib3ZlWzddIC0gcFNyY0Fib3ZlTGVmdFswXSAgICAgICAgCi0gICAgICAgIExTTCAgICAgIHRWYWwyLCB0VmFsMiwgIzQgICAgICAgICAgICAgICAgICAgIDsvLyBhID0gMTYgKiAocFNyY0Fib3ZlWzE1XSArIHBTcmNMZWZ0WzE1KmxTXSkKLSAgICAgICAgQUREICAgICAgdFZhbDIsIHRWYWwyLCAjMTYgICAgICAgICAgICAgICAgICAgOy8vIGEgKyAxNgotICAgICAgICBTVUIgICAgICB0VmFsOSwgdFZhbDksdFZhbDEwICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzZdIC0gcFNyY0Fib3ZlWzBdCi0gICAgICAgIExEUkIgICAgIHRWYWw4LCBbcFNyY0Fib3ZlLCMrNV0gICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNV0KLSAgICAgICAgTERSQiAgICAgdFZhbDEwLFtwU3JjQWJvdmUsIysxXSAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVsxXQotICAgICAgICBBREQgICAgICB0VmFsOSwgdFZhbDksIHRWYWw5LCBMU0wgIzEgICAgICAgICA7Ly8gSDEgPSAzICogKHBTcmNBYm92ZVs2XSAtIHBTcmNBYm92ZVswXSkKLSAgICAgICAgQUREICAgICAgdFZhbDcsIHRWYWw5LCB0VmFsNywgTFNMICMyICAgICAgICAgOy8vIEggPSBIMSArIEgwCi0gICAgICAgIFNVQiAgICAgIHRWYWw4LCB0VmFsOCwgdFZhbDEwICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNV0gLSBwU3JjQWJvdmVbMV0KLSAgICAgICAgTERSQiAgICAgdFZhbDksIFtwU3JjQWJvdmUsIys0XSAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs0XQotICAgICAgICBMRFJCICAgICB0VmFsMTAsW3BTcmNBYm92ZSwjKzJdICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzJdCi0gICAgICAgIEFERCAgICAgIHRWYWw3LCB0VmFsNywgdFZhbDgsIExTTCAjMSAgICAgICAgIDsvLyBIID0gSCArIEgyCi0gICAgICAgIFNVQiAgICAgIHRWYWwxMSwgdFZhbDE0LGxlZnRTdGVwICAgICAgICAgICAgIDsvLyA2KmxlZnRTdGVwCi0gICAgICAgIEFERCAgICAgIHRWYWwxMSwgcFNyY0xlZnQsIHRWYWwxMSAgICAgICAgICAgIDsvLyBwU3JjTGVmdCArIDYqbGVmdFN0ZXAKLSAgICAgICAgTU9WICAgICAgdFZhbDEyLCBwU3JjTGVmdCAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0Ci0gICAgICAgIFNVQiAgICAgIHRWYWw5LCB0VmFsOSwgdFZhbDEwICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNF0gLSBwU3JjQWJvdmVbMl0KLSAgICAgICAgQUREICAgICAgdFZhbDcsIHRWYWw3LCB0VmFsOSAgICAgICAgICAgICAgICAgOy8vIEggPSBIICsgSDMKLSAgICAgICAgTV9MRFJCICAgdFZhbDgsIFt0VmFsMTFdLC1sZWZ0U3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzYqbGVmdFN0ZXBdCi0gICAgICAgIE1fTERSQiAgIHRWYWwxMCxbdFZhbDEyXSwrbGVmdFN0ZXAgICAgICAgICAgIDsvLyBwU3JjTGVmdFswXQotICAgICAgICBBREQgICAgICB0VmFsNywgdFZhbDcsIHRWYWw3LCBMU0wgIzQgICAgICAgICA7Ly8gMTcgKiBICi0gICAgICAgIEFERCAgICAgIHRWYWw3LCB0VmFsNywgIzE2ICAgICAgICAgICAgICAgICAgIDsvLyAxNyAqIEggKyAxNgotICAgICAgICBTVUIgICAgICB0VmFsOCwgdFZhbDgsIHRWYWwxMCAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNipsZWZ0U3RlcF0gLSBwU3JjTGVmdFswXQotICAgICAgICBBU1IgICAgICBiLCB0VmFsNywgIzUgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gYiA9ICgxNyAqIEggKyAxNikgPj4gNQotICAgICAgICBBREQgICAgICB0VmFsOCwgdFZhbDgsIHRWYWw4LCBMU0wgIzEgICAgICAgICA7Ly8gVjEgPSAzICogKHBTcmNMZWZ0WzYqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbMF0pCi0gICAgICAgIEFERCAgICAgIHRWYWw2LCB0VmFsOCwgdFZhbDYsIExTTCAjMiAgICAgICAgIDsvLyBWID0gVjAgK1YxCi0gICAgICAgIE1fTERSQiAgIHRWYWw4LCBbdFZhbDExXSwtbGVmdFN0ZXAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs1KmxlZnRTdGVwXQotICAgICAgICBNX0xEUkIgICB0VmFsMTAsW3RWYWwxMl0sK2xlZnRTdGVwICAgICAgICAgICA7Ly8gcFNyY0xlZnRbbGVmdFN0ZXBdCi0gICAgICAgIEFERCAgICAgIHRWYWw3LCBiLCBiLCBMU0wgIzEgICAgICAgICAgICAgICAgIDsvLyAzKmIKLSAgICAgICAgU1VCICAgICAgdFZhbDIsIHRWYWwyLCB0VmFsNyAgICAgICAgICAgICAgICAgOy8vIGEgKyAxNiAtIDMqYgotICAgICAgICBTVUIgICAgICB0VmFsNywgdFZhbDgsIHRWYWwxMCAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNSpsZWZ0U3RlcF0gLSBwU3JjTGVmdFtsZWZ0U3RlcF0KLSAgICAgICAgTV9MRFJCICAgdFZhbDgsIFt0VmFsMTFdLC1sZWZ0U3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzQqbGVmdFN0ZXBdCi0gICAgICAgIE1fTERSQiAgIHRWYWwxMCxbdFZhbDEyXSwrbGVmdFN0ZXAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsyKmxlZnRTdGVwXSAgICAgICAgCi0gICAgICAgIEFERCAgICAgIHRWYWw2LCB0VmFsNiwgdFZhbDcsIExTTCAjMSAgICAgICAgIDsvLyBWID0gViArIFYyCi0gICAgICAgIExEUiAgICAgIHIweDAwRkYwMEZGLCA9TUFTS19DT05TVCAgICAgICAgICAgIDsvLyByMHgwMEZGMDBGRiA9IDB4MDBGRjAwRkYKLSAgICAgICAgU1VCICAgICAgdFZhbDcsIHRWYWw4LCB0VmFsMTAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzQqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbMipsZWZ0U3RlcF0KLSAgICAgICAgQUREICAgICAgdFZhbDYsIHRWYWw2LCB0VmFsNyAgICAgICAgICAgICAgICAgOy8vIFYgPSBWICsgVjcKLSAgICAgICAgU1VCICAgICAgZHN0U3RlcCwgZHN0U3RlcCwgIzQgICAgICAgICAgICAgICAgOy8vIGRzdFN0ZXAgLSA0Ci0gICAgICAgIEFERCAgICAgIHRWYWw2LCB0VmFsNiwgdFZhbDYsIExTTCAjNCAgICAgICAgIDsvLyAxNypWCi0gICAgICAgIEFERCAgICAgIHRWYWw2LCB0VmFsNiwgIzE2ICAgICAgICAgICAgICAgICAgIDsvLyAxNypWICsgMTYKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCi0gICAgICAgIAotICAgICAgICBBU1IgICAgICBjLCB0VmFsNiwgIzUgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gYyA9ICgxNypWICsgMTYpPj41Ci0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQotICAgICAgICAKLSAgICAgICAgQUREICAgICAgdFZhbDYsIGMsIGMsIExTTCAjMSAgICAgICAgICAgICAgICAgOy8vIDMqYwotICAgICAgICBVWFRIICAgICBjLCBjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gb25seSBpbiBoYWxmIHdvcmQKLSAgICAgICAgU1VCICAgICAgdFZhbDYsIHRWYWwyLCB0VmFsNiAgICAgICAgICAgICAgICAgOy8vIGEgLSAzKmIgLSAzKmMgKyAxNgotICAgICAgICBPUlIgICAgICBjLCBjLCBjLCBMU0wgIzE2ICAgICAgICAgICAgICAgICAgICA7Ly8gYyBjCi0gICAgICAgIEFERCAgICAgIHRWYWw3LCBiLCBiICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAyYgotICAgICAgICBBREQgICAgICB0VmFsMiwgdFZhbDYsIHRWYWw3ICAgICAgICAgICAgICAgICA7Ly8gcHAyID0gZCArIDIqYgotICAgICAgICBBREQgICAgICB0VmFsNywgdFZhbDcsIGIgICAgICAgICAgICAgICAgICAgICA7Ly8gM2IKLSAgICAgICAgT1JSICAgICAgcDJwMCwgICB0VmFsNiwgIHRWYWwyLCAgTFNMICMxNiAgICAgOy8vIHAycDAgICA9IHBhY2sge3AyLCBwMH0KLSAgICAgICAgVVhUSCAgICAgYiwgYgotICAgICAgICBVWFRIICAgICB0VmFsNywgdFZhbDcKLSAgICAgICAgT1JSICAgICAgYiwgYiwgYiwgTFNMICMxNiAgICAgICAgICAgICAgICAgICAgOy8vIHtiLGJ9Ci0gICAgICAgIE9SUiAgICAgIHRWYWw3LCB0VmFsNywgdFZhbDcsIExTTCAjMTYgICAgICAgIDsvLyB7M2IsM2J9Ci0gICAgICAgIFNBREQxNiAgIHAzcDEsICAgcDJwMCwgYiAgICAgICAgICAgICAgICAgICAgIDsvLyBwM3AxICAgPSBwMnAwICsge2IsYn0KLSAgICAgICAgU0FERDE2ICAgcDZwNCwgICBwM3AxLCB0VmFsNyAgICAgICAgICAgICAgICAgOy8vIHA2cDQgICA9IHAzcDEgKyB7M2IsM2J9Ci0gICAgICAgIFNBREQxNiAgIHA3cDUsICAgcDZwNCwgYiAgICAgICAgICAgICAgICAgICAgIDsvLyBwN3A1ICAgPSBwNnA0ICsge2IsYn0KLSAgICAgICAgTU9WICAgICAgb3V0ZXJDb3VudCwgI0JMS19TSVpFICAgICAgICAgICAgICAgOy8vIE91dGVyIExvb3AgQ291bnQgICAgICAgIAotICAgICAgICAKLUxPT1BfUExBTkUgICAgICAgIAotCi0gICAgICAgIFVTQVQxNiAgIHA3cDUsICAgIzEzLCBwN3A1ICAgICAgICAgICAgICAgICAgICA7Ly8gY2xpcDEzKHA3KSBjbGlwMTMocDUpCi0gICAgICAgIFVTQVQxNiAgIHA2cDQsICAgIzEzLCBwNnA0ICAgICAgICAgICAgICAgICAgICA7Ly8gY2xpcDEzKHA2KSBjbGlwMTMocDQpCi0gICAgICAgIFVTQVQxNiAgIHAzcDEsICAgIzEzLCBwM3AxICAgICAgICAgICAgICAgICAgICA7Ly8gY2xpcDEzKHAzKSBjbGlwMTMocDEpCi0gICAgICAgIFVTQVQxNiAgIHAycDAsICAgIzEzLCBwMnAwICAgICAgICAgICAgICAgICAgICA7Ly8gY2xpcDEzKHAyKSBjbGlwMTMocDApCi0gICAgICAgIAotICAgICAgICBBTkQgICAgICBwcDdwcDUsIHIweDAwRkYwMEZGLCBwN3A1LCBBU1IgIzUgICAgOy8vIGNsaXA4KHA3KSBjbGlwOChwNSkKLSAgICAgICAgQU5EICAgICAgcHA2cHA0LCByMHgwMEZGMDBGRiwgcDZwNCwgQVNSICM1ICAgIDsvLyBjbGlwOChwNikgY2xpcDgocDQpCi0gICAgICAgIEFORCAgICAgIHBwM3BwMSwgcjB4MDBGRjAwRkYsIHAzcDEsIEFTUiAjNSAgICA7Ly8gY2xpcDgocDMpIGNsaXA4KHAxKQotICAgICAgICBBTkQgICAgICBwcDJwcDAsIHIweDAwRkYwMEZGLCBwMnAwLCBBU1IgIzUgICAgOy8vIGNsaXA4KHAyKSBjbGlwOChwMCkKLSAgICAgICAgCi0gICAgICAgIFNVQlMgICAgIG91dGVyQ291bnQsIG91dGVyQ291bnQsICMxICAgICAgICAgICA7Ly8gb3V0ZXJDb3VudC0tCi0gICAgICAKLSAgICAgICAgT1JSICAgICAgcDMyMTAsIHBwMnBwMCwgcHAzcHAxLCBMU0wgIzggICAgICAgIDsvLyBwYWNrIHtwMyxwMiwgcDEsIHAwfQotICAgICAgICBTVFIgICAgICBwMzIxMCwgW3BEc3RdLCAjNCAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHtwRHN0WzBdIHRvIHBEc3RbM119ICAKLSAgICAgICAgCi0gICAgICAgIE9SUiAgICAgIHA3NjU0LCBwcDZwcDQsIHBwN3BwNSwgTFNMICM4ICAgICAgICA7Ly8gcGFjayB7cDcscDYsIHA1LCBwNH0KLSAgICAgICAgTV9TVFIgICAgcDc2NTQsIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7cERzdFs0XSB0byBwRHN0WzddfQotCi0gICAgICAgIFNBREQxNiAgIHA3cDUsICAgcDdwNSwgICBjICAgICAgICAgICAgICAgICAgICA7Ly8ge3A3ICsgY30sIHtwNSArIGN9Ci0gICAgICAgIFNBREQxNiAgIHA2cDQsICAgcDZwNCwgICBjICAgICAgICAgICAgICAgICAgICA7Ly8ge3A2ICsgY30sIHtwNCArIGN9Ci0gICAgICAgIFNBREQxNiAgIHAzcDEsICAgcDNwMSwgICBjICAgICAgICAgICAgICAgICAgICA7Ly8ge3AzICsgY30sIHtwMSArIGN9Ci0gICAgICAgIFNBREQxNiAgIHAycDAsICAgcDJwMCwgICBjICAgICAgICAgICAgICAgICAgICA7Ly8ge3AyICsgY30sIHtwMCArIGN9Ci0gICAgICAKLSAgICAgICAgQk5FICAgICAgTE9PUF9QTEFORSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb29wIGZvciA4IHRpbWVzCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgTV9FTkQKLSAgICAgICAgCi0gICAgICAgIEVORElGIDsvLyBBUk0xMTM2SlMKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgRU5ECi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCBlbmRzCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNl9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMwY2JhNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MucworKysgL2Rldi9udWxsCkBAIC0xLDUxNSArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTZfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgOTY0MQotOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUyAgICAKLSAgCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gVGhpcyB0YWJsZSBmb3IgaW1wbGVtZW50aW5nIHN3aXRjaCBjYXNlIG9mIEMgaW4gYXNtIGJ5Ci07Ly8gdGhlIG1laHRvZCBvZiB0d28gbGV2ZWxzIG9mIGluZGV4aW5nLgotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgTV9UQUJMRSBhcm1WQ000UDEwX3BJbmRleFRhYmxlMTZ4MTYKLSAgICBEQ0QgIE9NWF9WQ18xNlgxNl9WRVJULCBPTVhfVkNfMTZYMTZfSE9SIAotICAgIERDRCAgT01YX1ZDXzE2WDE2X0RDLCAgIE9NWF9WQ18xNlgxNl9QTEFORQotICAgIAotICAgIElGIEFSTTExMzZKUwotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIENvbnN0YW50cyAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKLUJMS19TSVpFICAgICAgICBFUVUgMHgxMAotTVVMX0NPTlNUMCAgICAgIEVRVSAweDAxMDEwMTAxCi1NVUxfQ09OU1QxICAgICAgRVFVIDB4MDAwNjAwMDQKLU1VTF9DT05TVDIgICAgICBFUVUgMHgwMDA3MDAwNQotTVVMX0NPTlNUMyAgICAgIEVRVSAweDAwMDMwMDAxCi1NQVNLX0NPTlNUICAgICAgRVFVIDB4MDBGRjAwRkYKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBTY3JhdGNoIHZhcmlhYmxlCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoteSAgICAgICAgICAgICAgIFJOIDEyICAgCi1wYyAgICAgICAgICAgICAgUk4gMTUgICAKLQotcmV0dXJuICAgICAgICAgIFJOIDAgICAgCi1pbm5lckNvdW50ICAgICAgUk4gMCAgICAKLW91dGVyQ291bnQgICAgICBSTiAxICAgIAotcFNyY0xlZnQyICAgICAgIFJOIDEgICAgCi1wRHN0MiAgICAgICAgICAgUk4gMiAgICAKLXN1bSAgICAgICAgICAgICBSTiA2ICAgIAotcFRhYmxlICAgICAgICAgIFJOIDkgICAgCi10ZW1wMSAgICAgICAgICAgUk4gMTAgICAKLXRlbXAyICAgICAgICAgICBSTiAxMiAgIAotY011bDEgICAgICAgICAgIFJOIDExICAgCi1jTXVsMiAgICAgICAgICAgUk4gMTIgICAKLWNvdW50ICAgICAgICAgICBSTiAxMiAgIAotZHN0U3RlcHgyICAgICAgIFJOIDExICAgCi1sZWZ0U3RlcHgyICAgICAgUk4gMTQgICAKLXIweDAxMDEwMTAxICAgICBSTiAxMCAgIAotcjB4MDBGRjAwRkYgICAgIFJOIDExCi0KLXRWYWwwICAgICAgICAgICBSTiAwICAgIAotdFZhbDEgICAgICAgICAgIFJOIDEgICAgCi10VmFsMiAgICAgICAgICAgUk4gMiAgICAKLXRWYWwzICAgICAgICAgICBSTiAzICAgIAotdFZhbDQgICAgICAgICAgIFJOIDQgICAgCi10VmFsNSAgICAgICAgICAgUk4gNSAgICAKLXRWYWw2ICAgICAgICAgICBSTiA2ICAgIAotdFZhbDcgICAgICAgICAgIFJOIDcgICAgCi10VmFsOCAgICAgICAgICAgUk4gOCAgICAKLXRWYWw5ICAgICAgICAgICBSTiA5ICAgIAotdFZhbDEwICAgICAgICAgIFJOIDEwICAgCi10VmFsMTEgICAgICAgICAgUk4gMTEgICAKLXRWYWwxMiAgICAgICAgICBSTiAxMiAgIAotdFZhbDE0ICAgICAgICAgIFJOIDE0ICAgCi0KLWIgICAgICAgICAgICAgICBSTiAxMiAgIAotYyAgICAgICAgICAgICAgIFJOIDE0ICAgCi0KLXAycDAgICAgICAgICAgICBSTiAwICAgIAotcDNwMSAgICAgICAgICAgIFJOIDEgICAgCi1wNnA0ICAgICAgICAgICAgUk4gMiAgICAKLXA3cDUgICAgICAgICAgICBSTiA0ICAgIAotcDEwcDggICAgICAgICAgIFJOIDYgICAgCi1wMTFwOSAgICAgICAgICAgUk4gNyAgICAKLXAxNHAxMiAgICAgICAgICBSTiA4ICAgIAotcDE1cDEzICAgICAgICAgIFJOIDkgICAgCi0KLXAzMjEwICAgICAgICAgICBSTiAxMCAgIAotcDc2NTQgICAgICAgICAgIFJOIDEwICAgCi1wMTExMDk4ICAgICAgICAgUk4gMTAgICAKLXAxNTE0MTMxMiAgICAgICBSTiAxMCAgIAotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcFNyY0xlZnQgICAgICAgIFJOIDAgICAgOy8vIGlucHV0IHBvaW50ZXIKLXBTcmNBYm92ZSAgICAgICBSTiAxICAgIDsvLyBpbnB1dCBwb2ludGVyCi1wU3JjQWJvdmVMZWZ0ICAgUk4gMiAgICA7Ly8gaW5wdXQgcG9pbnRlcgotcERzdCAgICAgICAgICAgIFJOIDMgICAgOy8vIG91dHB1dCBwb2ludGVyCi1sZWZ0U3RlcCAgICAgICAgUk4gNCAgICA7Ly8gaW5wdXQgdmFyaWFibGUKLWRzdFN0ZXAgICAgICAgICBSTiA1ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQotcHJlZE1vZGUgICAgICAgIFJOIDYgICAgOy8vIGlucHV0IHZhcmlhYmxlCi1hdmFpbGFiaWxpdHkgICAgUk4gNyAgICA7Ly8gaW5wdXQgdmFyaWFibGUKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiBzdGFydHMKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIAotICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYsIHIxMQotICAgICAgICAKLSAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKLSAgICAgICAgTV9BUkcgICAgTGVmdFN0ZXAsICAgICA0Ci0gICAgICAgIE1fQVJHICAgIERzdFN0ZXAsICAgICAgNAotICAgICAgICBNX0FSRyAgICBQcmVkTW9kZSwgICAgIDQKLSAgICAgICAgTV9BUkcgICAgQXZhaWxhYmlsaXR5LCA0Ci0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NAotICAgICAgICAKLSAgICAgICAgTERSICAgICAgcFRhYmxlLD1hcm1WQ000UDEwX3BJbmRleFRhYmxlMTZ4MTYgOy8vIExvYWQgaW5kZXggdGFibGUgZm9yIHN3aXRjaCBjYXNlCi0gICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjawotICAgICAgICBNX0xEUiAgICBwcmVkTW9kZSwgUHJlZE1vZGUgICAgICAgICAgICAgICAgICA7Ly8gQXJnIHByZWRNb2RlIGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAKLSAgICAgICAgTV9MRFIgICAgbGVmdFN0ZXAsIExlZnRTdGVwICAgICAgICAgICAgICAgICAgOy8vIEFyZyBsZWZ0U3RlcCBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCi0gICAgICAgIE1fTERSICAgIGRzdFN0ZXAsICBEc3RTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBBcmcgZHN0U3RlcCBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgICAgICAgICAKLSAgICAgICAgTV9MRFIgICAgYXZhaWxhYmlsaXR5LCBBdmFpbGFiaWxpdHkgICAgICAgICAgOy8vIEFyZyBhdmFpbGFiaWxpdHkgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICB5LCAjQkxLX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gT3V0ZXIgTG9vcCBDb3VudAotICAgICAgICBMRFIgICAgICBwYywgW3BUYWJsZSwgcHJlZE1vZGUsIExTTCAjMl0gICAgICA7Ly8gQnJhbmNoIHRvIHRoZSBjYXNlIGJhc2VkIG9uIHByZU1vZGUKLSAgICAgICAgCi1PTVhfVkNfMTZYMTZfVkVSVAotICAgICAgICBMRE0gICAgICBwU3JjQWJvdmUsIHt0VmFsNix0VmFsNyx0VmFsOCx0VmFsOX07Ly8gdFZhbCA2IHRvIDkgPSBwU3JjQWJvdmVbMCB0byAxNV0KLSAgICAgICAgQUREICAgICAgZHN0U3RlcHgyLCBkc3RTdGVwLCBkc3RTdGVwICAgICAgICAgOy8vIGRvdWJsZSBkc3RTdGVwCi0gICAgICAgIEFERCAgICAgIHBEc3QyLCBwRHN0LCBkc3RTdGVwICAgICAgICAgICAgICAgIDsvLyBwRHN0Mi0gcERzdCBhZHZhbmNlZCBieSBkc3RTdGVwCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MiAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0YWxsIG91dHNpZGUgdGhlIGxvb3AKLQotTE9PUF9WRVJUCi0gICAgICAgIFNUTSAgICAgIHBEc3QsIHt0VmFsNix0VmFsNyx0VmFsOCx0VmFsOX0gICAgIDsvLyBwRHN0WzAgdG8gMTVdID0gdFZhbCA2IHRvIDkKLSAgICAgICAgU1VCUyAgICAgeSwgeSwgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHktLQotICAgICAgICBBREQgICAgICBwRHN0LCBwRHN0LCBkc3RTdGVweDIgICAgICAgICAgICAgICA7Ly8gcERzdCBhZHZhbmNlZCBieSBkc3RTdGVwCi0gICAgICAgIFNUTSAgICAgIHBEc3QyLCB7dFZhbDYsdFZhbDcsdFZhbDgsdFZhbDl9ICAgIDsvLyBwRHN0MlsxNiB0byAzMV0gPSB0VmFsIDYgdG8gOQotICAgICAgICBBREQgICAgICBwRHN0MiwgcERzdDIsIGRzdFN0ZXB4MiAgICAgICAgICAgICA7Ly8gcERzdCBhZHZhbmNlZCBieSBkc3RTdGVwCi0gICAgICAgIEJORSAgICAgIExPT1BfVkVSVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb29wIGZvciA4IHRpbWVzCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgTV9FWElUCi0KLSAgICAgICAgCi1PTVhfVkNfMTZYMTZfSE9SCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NiAKLSAgICAgICAgICAgICAgIAotICAgICAgICBMRFIgICAgICByMHgwMTAxMDEwMSwgPU1VTF9DT05TVDAgICAgICAgICAgICA7Ly8gQ29uc3QgdG8gcmVwZWF0IHRoZSBieXRlIGluIHJlZyA0IHRpbWVzCi0gICAgICAgIE1PViAgICAgIHksICM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBPdXRlciBMb29wIENvdW50Ci0gICAgICAgIE1fTERSQiAgIHRWYWw2LCBbcFNyY0xlZnRdLCArbGVmdFN0ZXAgICAgICAgIDsvLyB0VmFsNiA9IHBTcmNMZWZ0WzAgdG8gM10KLSAgICAgICAgQUREICAgICAgcERzdDIsIHBEc3QsIGRzdFN0ZXAgICAgICAgICAgICAgICAgOy8vIHBEc3QyLSBwRHN0IGFkdmFuY2VkIGJ5IGRzdFN0ZXAKLSAgICAgICAgTV9MRFJCICAgdFZhbDcsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcCAgICAgICAgOy8vIHRWYWwxID0gcFNyY0xlZnRbNCB0byA3XQotICAgICAgICBBREQgICAgICBkc3RTdGVweDIsIGRzdFN0ZXAsIGRzdFN0ZXAgICAgICAgICA7Ly8gZG91YmxlIGRzdFN0ZXAKLSAgICAgICAgU1VCICAgICAgZHN0U3RlcHgyLCBkc3RTdGVweDIsICMxMiAgICAgICAgICAgOy8vIGRvdWJsZSBkc3RTdGVwICBtaW51cyAxMgotICAgICAgIAotTE9PUF9IT1IgICAgICAgIAotICAgICAgICBNX0xEUkIgICB0VmFsOCwgW3BTcmNMZWZ0XSwgK2xlZnRTdGVwICAgICAgICA7Ly8gdFZhbDggPSBwU3JjTGVmdFswIHRvIDNdCi0gICAgICAgIE1VTCAgICAgIHRWYWw2LCB0VmFsNiwgcjB4MDEwMTAxMDEgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCi0gICAgICAgIE1fTERSQiAgIHRWYWw5LCBbcFNyY0xlZnRdLCArbGVmdFN0ZXAgICAgICAgIDsvLyB0VmFsOSA9IHBTcmNMZWZ0WzQgdG8gN10KLSAgICAgICAgTVVMICAgICAgdFZhbDcsIHRWYWw3LCByMHgwMTAxMDEwMSAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKLSAgICAgICAgU1VCUyAgICAgeSwgeSwgIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHktLQotICAgICAgICBTVFIgICAgICB0VmFsNiwgW3BEc3RdLCAgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0WzAgdG8gM10gCi0gICAgICAgIFNUUiAgICAgIHRWYWw3LCBbcERzdDJdLCAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDd9IGF0IHBEc3QyWzAgdG8gM10KLSAgICAgICAgU1RSICAgICAgdFZhbDYsIFtwRHN0XSwgICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdFs0IHRvIDddCi0gICAgICAgIFNUUiAgICAgIHRWYWw3LCBbcERzdDJdLCAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDd9IGF0IHBEc3QyWzQgdG8gN10KLSAgICAgICAgTVVMICAgICAgdFZhbDgsIHRWYWw4LCByMHgwMTAxMDEwMSAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKLSAgICAgICAgU1RSICAgICAgdFZhbDYsIFtwRHN0XSwgICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdFs4IHRvIDExXQotICAgICAgICBTVFIgICAgICB0VmFsNywgW3BEc3QyXSwgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0Mls4IHRvIDExXQotICAgICAgICBNVUwgICAgICB0VmFsOSwgdFZhbDksIHIweDAxMDEwMTAxICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcwotICAgICAgICBNX1NUUiAgICB0VmFsNiwgW3BEc3RdLCBkc3RTdGVweDIgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0WzEyIHRvIDE1XQotICAgICAgICBNX1NUUiAgICB0VmFsNywgW3BEc3QyXSwgZHN0U3RlcHgyICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0MlsxMiB0byAxNV0KLSAgICAgICAgU1RSICAgICAgdFZhbDgsIFtwRHN0XSwgICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdFswIHRvIDNdIAotICAgICAgICBTVFIgICAgICB0VmFsOSwgW3BEc3QyXSwgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0MlswIHRvIDNdCi0gICAgICAgIFNUUiAgICAgIHRWYWw4LCBbcERzdF0sICAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3RbNCB0byA3XQotICAgICAgICBTVFIgICAgICB0VmFsOSwgW3BEc3QyXSwgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0Mls0IHRvIDddCi0gICAgICAgIFNUUiAgICAgIHRWYWw4LCBbcERzdF0sICAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3RbOCB0byAxMV0KLSAgICAgICAgU1RSICAgICAgdFZhbDksIFtwRHN0Ml0sICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbOCB0byAxMV0KLSAgICAgICAgTV9TVFIgICAgdFZhbDgsIFtwRHN0XSwgZHN0U3RlcHgyICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdFsxMiB0byAxNV0KLSAgICAgICAgTV9MRFJCICAgdFZhbDYsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcCAgICAgICAgOy8vIHRWYWw2ID0gcFNyY0xlZnRbMCB0byAzXQotICAgICAgICBNX1NUUiAgICB0VmFsOSwgW3BEc3QyXSwgZHN0U3RlcHgyICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0MlsxMiB0byAxNV0KLSAgICAgICAgTV9MRFJCICAgdFZhbDcsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcCAgICAgICAgOy8vIHRWYWw3ID0gcFNyY0xlZnRbNCB0byA3XQotICAgICAgICBCTkUgICAgICBMT09QX0hPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9vcCBmb3IgMyB0aW1lcwotICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0gICAgICAgIE1fRVhJVAotICAgICAgICAKLU9NWF9WQ18xNlgxNl9EQwotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTIKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgIGNvdW50LCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjb3VudCA9IDAKLSAgICAgICAgVFNUICAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX1VQUEVSICAgICAgICAgOy8vIGlmKGF2YWlsYWJpbGl0eSAmICNPTVhfVkNfVVBQRVIpCi0gICAgICAgIEJFUSAgICAgIFRTVF9MRUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBKdW1wIHRvIExlZnQgaWYgbm90IHVwcGVyCi0gICAgICAgIExETSAgICAgIHBTcmNBYm92ZSx7dFZhbDgsdFZhbDksdFZhbDEwLHRWYWwxMX07Ly8gdFZhbCA4IHRvIDExID0gcFNyY0Fib3ZlWzAgdG8gMTVdCi0gICAgICAgIEFERCAgICAgIGNvdW50LCBjb3VudCwgIzEgICAgICAgICAgICAgICAgICAgIDsvLyBpZiB1cHBlciBpbmMgY291bnQgYnkgMQotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTIKLSAgICAgICAgCi0gICAgICAgIFVYVEIxNiAgIHRWYWwyLCB0VmFsOCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCwgMl0KLSAgICAgICAgVVhUQjE2ICAgdFZhbDYsIHRWYWw5ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs0LCA2XQotICAgICAgICBVQUREMTYgICB0VmFsMiwgdFZhbDIsIHRWYWw2ICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAsIDJdICsgcFNyY0Fib3ZlWzQsIDZdCi0gICAgICAgIFVYVEIxNiAgIHRWYWw4LCB0VmFsOCwgUk9SICM4ICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMSwgM10KLSAgICAgICAgVVhUQjE2ICAgdFZhbDksIHRWYWw5LCBST1IgIzggICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs1LCA3XQotICAgICAgICBVQUREMTYgICB0VmFsOCwgdFZhbDgsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzEsIDNdICsgcFNyY0Fib3ZlWzUsIDddCi0gICAgICAgIFVBREQxNiAgIHRWYWwyLCB0VmFsMiwgdFZhbDggICAgICAgICAgICAgICAgIDsvLyBzdW0ocFNyY0Fib3ZlWzBdIHRvIHBTcmNBYm92ZVs3XSkKLSAgICAgICAgCi0gICAgICAgIFVYVEIxNiAgIHRWYWw4LCB0VmFsMTAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbOCwgMTBdCi0gICAgICAgIFVYVEIxNiAgIHRWYWw5LCB0VmFsMTEgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMTIsIDE0XQotICAgICAgICBVQUREMTYgICB0VmFsOCwgdFZhbDgsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzgsIDEwXSArIHBTcmNBYm92ZVsxMiwgMTRdCi0gICAgICAgIFVYVEIxNiAgIHRWYWwxMCwgdFZhbDEwLCBST1IgIzggICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbOSwgMTFdCi0gICAgICAgIFVYVEIxNiAgIHRWYWwxMSwgdFZhbDExLCBST1IgIzggICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMTMsIDE1XQotICAgICAgICBVQUREMTYgICB0VmFsMTAsIHRWYWwxMCwgdFZhbDExICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzksIDExXSArIHBTcmNBYm92ZVsxMywgMTVdCi0gICAgICAgIFVBREQxNiAgIHRWYWw4LCB0VmFsOCwgdFZhbDEwICAgICAgICAgICAgICAgIDsvLyBzdW0ocFNyY0Fib3ZlWzhdIHRvIHBTcmNBYm92ZVsxNV0pCi0gICAgICAgIAotICAgICAgICBVQUREMTYgICB0VmFsMiwgdFZhbDIsIHRWYWw4ICAgICAgICAgICAgICAgICA7Ly8gc3VtKHBTcmNBYm92ZVswXSB0byBwU3JjQWJvdmVbMTVdKQotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKLSAgICAgICAgCi0gICAgICAgIEFERCAgICAgIHRWYWwyLCB0VmFsMiwgdFZhbDIsIExTUiAjMTYgICAgICAgIDsvLyBzdW0ocFNyY0Fib3ZlWzBdIHRvIHBTcmNBYm92ZVsxNV0pCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQotICAgICAgICAKLSAgICAgICAgVVhUSCAgICAgc3VtLCB0VmFsMiAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4dHJhY3QgdGhlIGxvd2VyIGhhbGYgZm9yIHJlc3VsdAotICAgICAgICAKLVRTVF9MRUZUICAgICAgICAKLSAgICAgICAgVFNUICAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX0xFRlQKLSAgICAgICAgQkVRICAgICAgVFNUX0NPVU5UCi0gICAgICAgIEFERCAgICAgIGxlZnRTdGVweDIsIGxlZnRTdGVwLGxlZnRTdGVwICAgICAgIDsvLyBsZWZ0U3RlcHgyID0gMiAqIGxlZnRTdGVwCi0gICAgICAgIEFERCAgICAgIHBTcmNMZWZ0MiwgcFNyY0xlZnQsIGxlZnRTdGVwICAgICAgIDsvLyBwU3JjTGVmdDIgPSBwU3JjTGVmdCArIGxlZnRTdGVwCi0gICAgICAgIAotICAgICAgICBNX0xEUkIgICB0VmFsOCwgW3BTcmNMZWZ0XSwgICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDggPSBwU3JjTGVmdFswXQotICAgICAgICBNX0xEUkIgICB0VmFsOSwgW3BTcmNMZWZ0Ml0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDkgPSBwU3JjTGVmdFsxXQotICAgICAgICBNX0xEUkIgICB0VmFsMTAsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDEwPSBwU3JjTGVmdFsyXQotICAgICAgICBNX0xEUkIgICB0VmFsMTEsIFtwU3JjTGVmdDJdLCtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDExPSBwU3JjTGVmdFszXQotICAgICAgICBBREQgICAgICB0VmFsNywgdFZhbDgsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gdFZhbDcgPSB0VmFsOCArIHRWYWw5Ci0gICAgICAgIEFERCAgICAgIGNvdW50LCBjb3VudCwgIzEgICAgICAgICAgICAgICAgICAgIDsvLyBJbmMgQ291bnRlciBpZiBMZWZ0IGlzIGF2YWlsYWJsZQotICAgICAgICBBREQgICAgICB0VmFsNiwgdFZhbDEwLCB0VmFsMTEgICAgICAgICAgICAgICA7Ly8gdFZhbDYgPSB0VmFsMTAgKyB0VmFsMTEKLSAgICAgICAgCi0gICAgICAgIE1fTERSQiAgIHRWYWw4LCBbcFNyY0xlZnRdLCAgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOCA9IHBTcmNMZWZ0WzBdCi0gICAgICAgIE1fTERSQiAgIHRWYWw5LCBbcFNyY0xlZnQyXSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOSA9IHBTcmNMZWZ0WzFdCi0gICAgICAgIE1fTERSQiAgIHRWYWwxMCwgW3BTcmNMZWZ0XSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsMTA9IHBTcmNMZWZ0WzJdCi0gICAgICAgIE1fTERSQiAgIHRWYWwxMSwgW3BTcmNMZWZ0Ml0sK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsMTE9IHBTcmNMZWZ0WzNdCi0gICAgICAgIEFERCAgICAgIHN1bSwgdFZhbDcsIHRWYWw2ICAgICAgICAgICAgICAgICAgIDsvLyBzdW0gPSB0VmFsOCArIHRWYWwxMAotICAgICAgICBBREQgICAgICB0VmFsOCwgdFZhbDgsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gdFZhbDggPSB0VmFsOCArIHRWYWw5Ci0gICAgICAgIEFERCAgICAgIHRWYWwxMCwgdFZhbDEwLCB0VmFsMTEgICAgICAgICAgICAgIDsvLyB0VmFsMTA9IHRWYWwxMCArIHRWYWwxMQotICAgICAgICBBREQgICAgICB0VmFsNywgdFZhbDgsIHRWYWwxMCAgICAgICAgICAgICAgICA7Ly8gdFZhbDcgPSB0VmFsOCArIHRWYWwxMAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIE1fTERSQiAgIHRWYWw4LCBbcFNyY0xlZnRdLCAgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOCA9IHBTcmNMZWZ0WzBdCi0gICAgICAgIE1fTERSQiAgIHRWYWw5LCBbcFNyY0xlZnQyXSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOSA9IHBTcmNMZWZ0WzFdCi0gICAgICAgIE1fTERSQiAgIHRWYWwxMCwgW3BTcmNMZWZ0XSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsMTA9IHBTcmNMZWZ0WzJdCi0gICAgICAgIE1fTERSQiAgIHRWYWwxMSwgW3BTcmNMZWZ0Ml0sK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsMTE9IHBTcmNMZWZ0WzNdCi0gICAgICAgIEFERCAgICAgIHN1bSwgc3VtLCB0VmFsNyAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0gPSBzdW0gKyB0VmFsNwotICAgICAgICBBREQgICAgICB0VmFsOCwgdFZhbDgsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gdFZhbDggPSB0VmFsOCArIHRWYWw5Ci0gICAgICAgIEFERCAgICAgIHRWYWwxMCwgdFZhbDEwLCB0VmFsMTEgICAgICAgICAgICAgIDsvLyB0VmFsMTA9IHRWYWwxMCArIHRWYWwxMQotICAgICAgICBBREQgICAgICB0VmFsNywgdFZhbDgsIHRWYWwxMCAgICAgICAgICAgICAgICA7Ly8gdFZhbDcgPSB0VmFsOCArIHRWYWwxMAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIE1fTERSQiAgIHRWYWw4LCBbcFNyY0xlZnRdLCAgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOCA9IHBTcmNMZWZ0WzBdCi0gICAgICAgIE1fTERSQiAgIHRWYWw5LCBbcFNyY0xlZnQyXSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOSA9IHBTcmNMZWZ0WzFdCi0gICAgICAgIE1fTERSQiAgIHRWYWwxMCwgW3BTcmNMZWZ0XSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsMTA9IHBTcmNMZWZ0WzJdCi0gICAgICAgIE1fTERSQiAgIHRWYWwxMSwgW3BTcmNMZWZ0Ml0sK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsMTE9IHBTcmNMZWZ0WzNdCi0gICAgICAgIEFERCAgICAgIHN1bSwgc3VtLCB0VmFsNyAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0gPSBzdW0gKyB0VmFsNwotICAgICAgICBBREQgICAgICB0VmFsOCwgdFZhbDgsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gdFZhbDggPSB0VmFsOCArIHRWYWw5Ci0gICAgICAgIEFERCAgICAgIHRWYWwxMCwgdFZhbDEwLCB0VmFsMTEgICAgICAgICAgICAgIDsvLyB0VmFsMTA9IHRWYWwxMCArIHRWYWwxMQotICAgICAgICBBREQgICAgICB0VmFsNywgdFZhbDgsIHRWYWwxMCAgICAgICAgICAgICAgICA7Ly8gdFZhbDcgPSB0VmFsOCArIHRWYWwxMAotICAgICAgICBBREQgICAgICBzdW0sIHN1bSwgdFZhbDcgICAgICAgICAgICAgICAgICAgICA7Ly8gc3VtID0gc3VtICsgdFZhbDcKLQotVFNUX0NPVU5UICAgICAgICAKLSAgICAgICAgQ01QICAgICAgY291bnQsICMwICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGlmKGNvdW50ID09IDApCi0gICAgICAgIE1PVkVRICAgIHN1bSwgIzEyOCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0gPSAxMjggaWYoY291bnQgPT0gMCkKLSAgICAgICAgQkVRICAgICAgVFNUX0NPVU5UMCAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGlmKGNvdW50ID09IDApCi0gICAgICAgIENNUCAgICAgIGNvdW50LCAjMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBpZihjb3VudCA9PSAxKQotICAgICAgICBBRERFUSAgICBzdW0sIHN1bSwgIzggICAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3VtICs9IDggaWYoY291bnQgPT0gMSkKLSAgICAgICAgQURETkUgICAgc3VtLCBzdW0sIHRWYWwyICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bSA9IHN1bWxlZnQgKyBzdW11cHBlcgotICAgICAgICBBRERORSAgICBzdW0sIHN1bSwgIzE2ICAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3VtICs9IDE2IGlmKGNvdW50ID09IDIpCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQotICAgICAgICAKLSAgICAgICAgVVhUSCAgICAgc3VtLCBzdW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bSBvbmx5IGJ5dGUgcmVzdCBjbGVhcmVkCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQotICAgICAgICAKLSAgICAgICAgTFNSRVEgICAgc3VtLCBzdW0sICM0ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bSA+PiA0IGlmKGNvdW50ID09IDEpCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQotICAgICAgICAKLSAgICAgICAgTFNSTkUgICAgc3VtLCBzdW0sICM1ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bSA+PiA1IGlmKGNvdW50ID09IDIpCi0KLVRTVF9DT1VOVDAKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCi0gICAgICAgIAotICAgICAgICBPUlIgICAgICBzdW0sIHN1bSwgc3VtLCBMU0wgIzggICAgICAgICAgICAgICA7Ly8gc3VtIHJlcGxpY2F0ZWQgaW4gdHdvIGhhbGZ3b3JkCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQotICAgICAgICAKLSAgICAgICAgT1JSICAgICAgdFZhbDYsIHN1bSwgc3VtLCBMU0wgIzE2ICAgICAgICAgICAgOy8vIHN1bSAgcmVwbGljYXRlZCBpbiBhbGwgYnl0ZXMKLSAgICAgICAgQ1BZICAgICAgdFZhbDcsIHRWYWw2ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwxID0gdFZhbDAKLSAgICAgICAgQ1BZICAgICAgdFZhbDgsIHRWYWw2ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwyID0gdFZhbDAKLSAgICAgICAgQ1BZICAgICAgdFZhbDksIHRWYWw2ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwzID0gdFZhbDAKLSAgICAgICAgQUREICAgICAgZHN0U3RlcHgyLCBkc3RTdGVwLCBkc3RTdGVwICAgICAgICAgOy8vIGRvdWJsZSBkc3RTdGVwCi0gICAgICAgIEFERCAgICAgIHBEc3QyLCBwRHN0LCBkc3RTdGVwICAgICAgICAgICAgICAgIDsvLyBwRHN0Mi0gcERzdCBhZHZhbmNlZCBieSBkc3RTdGVwCi0gICAgICAgIE1PViAgICAgIHksICNCTEtfU0laRSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBPdXRlciBMb29wIENvdW50Ci0gICAgICAgIAotTE9PUF9EQyAgICAgICAgCi0gICAgICAgIFNUTSAgICAgIHBEc3QsIHt0VmFsNix0VmFsNyx0VmFsOCx0VmFsOX0gICAgIDsvLyBwRHN0WzAgdG8gMTVdID0gdFZhbCA2IHRvIDkKLSAgICAgICAgU1VCUyAgICAgeSwgeSwgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHktLQotICAgICAgICBBREQgICAgICBwRHN0LCBwRHN0LCBkc3RTdGVweDIgICAgICAgICAgICAgICA7Ly8gcERzdCBhZHZhbmNlZCBieSBkc3RTdGVwCi0gICAgICAgIFNUTSAgICAgIHBEc3QyLCB7dFZhbDYsdFZhbDcsdFZhbDgsdFZhbDl9ICAgIDsvLyBwRHN0MlsxNiB0byAzMV0gPSB0VmFsIDYgdG8gOQotICAgICAgICBBREQgICAgICBwRHN0MiwgcERzdDIsIGRzdFN0ZXB4MiAgICAgICAgICAgICA7Ly8gcERzdCBhZHZhbmNlZCBieSBkc3RTdGVwCi0gICAgICAgIEJORSAgICAgIExPT1BfREMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb29wIGZvciA4IHRpbWVzCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0gICAgICAgIE1fRVhJVAotCi1PTVhfVkNfMTZYMTZfUExBTkUKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0zCi0gICAgICAgIFJTQiAgICAgIHRWYWwxNCwgbGVmdFN0ZXAsIGxlZnRTdGVwLCBMU0wgIzQgIDsvLyB0VmFsMTQgPSAxNSpsZWZ0U3RlcAotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTIKLSAgICAgICAgTERSQiAgICAgdFZhbDEwLCBbcFNyY0xlZnQsICB0VmFsMTRdICAgICAgICAgOy8vIHRWYWwxMCA9IHBTcmNMZWZ0WzE1KmxlZnRTdGVwXQotICAgICAgICBMRFJCICAgICB0VmFsMTEsIFtwU3JjQWJvdmVMZWZ0XSAgICAgICAgICAgICA7Ly8gdFZhbDExID0gcFNyY0Fib3ZlTGVmdFswXQotICAgICAgICBMRFJCICAgICB0VmFsMTIsIFtwU3JjQWJvdmUsICMxNV0KLQotICAgICAgICBBREQgICAgICB0VmFsMiwgIHRWYWwxMiwgIHRWYWwxMCAgICAgICAgICAgICA7Ly8gdFZhbDIgID0gcFNyY0Fib3ZlWzE1XSArIHBTcmNMZWZ0WzE1KmxlZnRTdGVwXQotICAgICAgICBTVUIgICAgICB0VmFsMTAsIHRWYWwxMCwgIHRWYWwxMSAgICAgICAgICAgICA7Ly8gdFZhbDEwID0gVjAgPSBwU3JjTGVmdFsxNSpsZWZ0U3RlcF0gLSBwU3JjQWJvdmVMZWZ0WzBdCi0gICAgICAgIFNVQiAgICAgIHRWYWwxMSwgdFZhbDEyLCAgdFZhbDExICAgICAgICAgICAgIDsvLyB0VmFsMTEgPSBIMCA9IHBTcmNBYm92ZVsxNV0gLSBwU3JjQWJvdmVMZWZ0WzBdCi0gICAgICAgIE1PViAgICAgIHRWYWwyLCAgdFZhbDIsICAgTFNMICM0ICAgICAgICAgICAgIDsvLyB0VmFsMiAgPSBhID0gMTYgKiAocFNyY0Fib3ZlWzE1XSArIHBTcmNMZWZ0WzE1KmxlZnRTdGVwXSkKLQotICAgICAgICBNT1YgICAgIHRWYWwxMSwgdFZhbDExLCBMU0wgIzMgICAgICAgICAgICAgIDsvLyA4KlsxNV0tWy0xXQotICAgICAgICBMRFJCICAgIHRWYWw2LCBbcFNyY0Fib3ZlLCAjMF0KLSAgICAgICAgTERSQiAgICB0VmFsNywgW3BTcmNBYm92ZSwgIzE0XQotICAgICAgICBTVUIgICAgIHRWYWw4LCB0VmFsNywgdFZhbDYKLSAgICAgICAgUlNCICAgICB0VmFsOCwgdFZhbDgsIHRWYWw4LCBMU0wgIzMgICAgICAgICA7Ly8gNypbMTRdLVswXQotICAgICAgICBBREQgICAgIHRWYWwxMSwgdFZhbDExLCB0VmFsOAotICAgICAgICBMRFJCICAgIHRWYWw2LCBbcFNyY0Fib3ZlLCAjMV0KLSAgICAgICAgTERSQiAgICB0VmFsNywgW3BTcmNBYm92ZSwgIzEzXQotICAgICAgICBTVUIgICAgIHRWYWw4LCB0VmFsNywgdFZhbDYKLSAgICAgICAgQUREICAgICB0VmFsOCwgdFZhbDgsIHRWYWw4Ci0gICAgICAgIEFERCAgICAgdFZhbDgsIHRWYWw4LCB0VmFsOCwgTFNMICMxICAgICAgICAgOy8vIDYqWzEzXS1bMV0KLSAgICAgICAgQUREICAgICB0VmFsMTEsIHRWYWwxMSwgdFZhbDgKLSAgICAgICAgTERSQiAgICB0VmFsNiwgW3BTcmNBYm92ZSwgIzJdCi0gICAgICAgIExEUkIgICAgdFZhbDcsIFtwU3JjQWJvdmUsICMxMl0KLSAgICAgICAgU1VCICAgICB0VmFsOCwgdFZhbDcsIHRWYWw2Ci0gICAgICAgIEFERCAgICAgdFZhbDgsIHRWYWw4LCB0VmFsOCwgTFNMICMyICAgICAgICAgOy8vIDUqWzEyXS1bMl0KLSAgICAgICAgQUREICAgICB0VmFsMTEsIHRWYWwxMSwgdFZhbDgKLSAgICAgICAgTERSQiAgICB0VmFsNiwgW3BTcmNBYm92ZSwgIzNdCi0gICAgICAgIExEUkIgICAgdFZhbDcsIFtwU3JjQWJvdmUsICMxMV0KLSAgICAgICAgU1VCICAgICB0VmFsOCwgdFZhbDcsIHRWYWw2Ci0gICAgICAgIEFERCAgICAgdFZhbDExLCB0VmFsMTEsIHRWYWw4LCBMU0wgIzIgICAgICAgOy8vICsgNCpbMTFdLVszXQotICAgICAgICBMRFJCICAgIHRWYWw2LCBbcFNyY0Fib3ZlLCAjNF0KLSAgICAgICAgTERSQiAgICB0VmFsNywgW3BTcmNBYm92ZSwgIzEwXQotICAgICAgICBTVUIgICAgIHRWYWw4LCB0VmFsNywgdFZhbDYKLSAgICAgICAgQUREICAgICB0VmFsOCwgdFZhbDgsIHRWYWw4LCBMU0wgIzEgICAgICAgICA7Ly8gMypbMTBdLVs0XQotICAgICAgICBBREQgICAgIHRWYWwxMSwgdFZhbDExLCB0VmFsOAotICAgICAgICBMRFJCICAgIHRWYWw2LCBbcFNyY0Fib3ZlLCAjNV0KLSAgICAgICAgTERSQiAgICB0VmFsNywgW3BTcmNBYm92ZSwgIzldCi0gICAgICAgIFNVQiAgICAgdFZhbDgsIHRWYWw3LCB0VmFsNgotICAgICAgICBBREQgICAgIHRWYWwxMSwgdFZhbDExLCB0VmFsOCwgTFNMICMxICAgICAgIDsvLyArIDIqWzldLVs1XQotICAgICAgICBMRFJCICAgIHRWYWw2LCBbcFNyY0Fib3ZlLCAjNl0KLSAgICAgICAgTERSQiAgICB0VmFsNywgW3BTcmNBYm92ZSwgIzhdCi0gICAgICAgIFNVQiAgICAgdFZhbDgsIHRWYWw3LCB0VmFsNiAgICAgICAgICAgICAgICAgOy8vIDEqWzhdLVs2XQotICAgICAgICBBREQgICAgIHRWYWw3LCB0VmFsMTEsIHRWYWw4Ci0KLSAgICAgICAgQUREICAgICAgdFZhbDIsICB0VmFsMiwgICAjMTYgICAgICAgICAgICAgICAgOy8vIHRWYWwyICA9IGEgKyAxNgotICAgICAgICBNT1YgICAgICB0VmFsMSwgIHBTcmNMZWZ0ICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDQgID0gcFNyY0xlZnQKLSAgICAgICAgU1VCICAgICAgdFZhbDksICB0VmFsMTQsICAgbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWw5ICA9IDE0KmxlZnRTdGVwCi0gICAgICAgIEFERCAgICAgIHRWYWw5LCAgcFNyY0xlZnQsIHRWYWw5ICAgICAgICAgICAgIDsvLyB0VmFsOSAgPSBwU3JjTGVmdCArIDE0KmxlZnRTdGVwCi0gICAgICAgIAotICAgICAgICBNX0xEUkIgICB0VmFsOCwgIFt0VmFsOV0sIC1sZWZ0U3RlcCAgICAgICAgICA7Ly8gdFZhbDggID0gcFNyY0xlZnRbMTQqbGVmdFN0ZXBdCi0gICAgICAgIE1fTERSQiAgIHRWYWwxMSwgW3RWYWwxXSwgK2xlZnRTdGVwICAgICAgICAgIDsvLyB0VmFsMTEgPSBwU3JjTGVmdFswXQotICAgICAgICBBREQgICAgICB0VmFsNywgIHRWYWw3LCAgdFZhbDcsICBMU0wgIzIgICAgICA7Ly8gdFZhbDcgID0gNSAqIEgKLSAgICAgICAgQUREICAgICAgdFZhbDcsICB0VmFsNywgICMzMiAgICAgICAgICAgICAgICAgOy8vIHRWYWw3ICA9IDUgKiBIICsgMzIKLSAgICAgICAgU1VCICAgICAgdFZhbDgsICB0VmFsOCwgIHRWYWwxMSAgICAgICAgICAgICAgOy8vIHRWYWw4ICA9IHBTcmNMZWZ0WzE0KmxlZnRTdGVwXSAtIHBTcmNMZWZ0WzBdCi0gICAgICAgIEFTUiAgICAgIHRWYWwxMiwgdFZhbDcsICAjNiAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMTIgPSBiID0gKDUgKiBIICsgMzIpID4+IDYKLSAgICAgICAgCi0gICAgICAgIFJTQiAgICAgIHRWYWw4LCAgdFZhbDgsICB0VmFsOCwgIExTTCAjMyAgICAgIDsvLyB0VmFsOCAgPSBWMSA9IDcqIChwU3JjTGVmdFsxNCpsZWZ0U3RlcF0tcFNyY0xlZnRbMF0pCi0gICAgICAgIEFERCAgICAgIHRWYWw2LCAgdFZhbDgsICB0VmFsMTAsIExTTCAjMyAgICAgIDsvLyB0VmFsNiAgPSBWID0gVjAgK1YxCi0gICAgICAgIE1fTERSQiAgIHRWYWw4LCAgW3RWYWw5XSwgLWxlZnRTdGVwICAgICAgICAgIDsvLyB0VmFsOCAgPSBwU3JjTGVmdFsxMypsZWZ0U3RlcF0KLSAgICAgICAgTV9MRFJCICAgdFZhbDEwLCBbdFZhbDFdLCArbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWwxMCA9IHBTcmNMZWZ0W2xlZnRTdGVwXQotICAgICAgICBSU0IgICAgICB0VmFsNywgIHRWYWwxMiwgIHRWYWwxMiwgIExTTCAjMyAgICA7Ly8gdFZhbDcgID0gNypiCi0gICAgICAgIFNVQiAgICAgIHRWYWwyLCAgdFZhbDIsICAgdFZhbDcgICAgICAgICAgICAgIDsvLyB0VmFsMiAgPSBhICsgMTYgLSA3KmIKLSAgICAgICAgU1VCICAgICAgdFZhbDcsICB0VmFsOCwgICB0VmFsMTAgICAgICAgICAgICAgOy8vIHRWYWw3ICA9IHBTcmNMZWZ0WzEzKmxlZnRTdGVwXSAtIHBTcmNMZWZ0W2xlZnRTdGVwXQotICAgICAgICBNX0xEUkIgICB0VmFsOCwgIFt0VmFsOV0sIC1sZWZ0U3RlcCAgICAgICAgICA7Ly8gdFZhbDggID0gcFNyY0xlZnRbMTIqbFNdCi0gICAgICAgIEFERCAgICAgIHRWYWw3LCAgdFZhbDcsICAgdFZhbDcgICAgICAgICAgICAgIDsvLyB0VmFsNyAgPSAyICogKHBTcmNMZWZ0WzEzKmxlZnRTdGVwXSAtIHBTcmNMZWZ0W2xlZnRTdGVwXSkKLSAgICAgICAgTV9MRFJCICAgdFZhbDEwLCBbdFZhbDFdLCArbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWwxMCA9IHBTcmNMZWZ0WzIqbGVmdFN0ZXBdICAgICAgICAKLSAgICAgICAgQUREICAgICAgdFZhbDcsICB0VmFsNywgICB0VmFsNywgIExTTCAjMSAgICAgOy8vIHRWYWw3ICA9IDYgKiAocFNyY0xlZnRbMTMqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbbGVmdFN0ZXBdKQotICAgICAgICBBREQgICAgICB0VmFsNiwgIHRWYWw2LCAgIHRWYWw3ICAgICAgICAgICAgICA7Ly8gdFZhbDYgID0gViA9IFYgKyBWMgotICAgICAgICBTVUIgICAgICB0VmFsNywgIHRWYWw4LCAgIHRWYWwxMCAgICAgICAgICAgICA7Ly8gdFZhbDcgID0gcFNyY0xlZnRbMTIqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbMipsZWZ0U3RlcF0KLSAgICAgICAgTV9MRFJCICAgdFZhbDgsICBbdFZhbDldLCAtbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWw4ICA9IHBTcmNMZWZ0WzExKmxlZnRTdGVwXQotICAgICAgICBNX0xEUkIgICB0VmFsMTAsIFt0VmFsMV0sICtsZWZ0U3RlcCAgICAgICAgICA7Ly8gdFZhbDEwID0gcFNyY0xlZnRbMypsZWZ0U3RlcF0KLSAgICAgICAgQUREICAgICAgdFZhbDcsICB0VmFsNywgICB0VmFsNywgIExTTCAjMiAgICAgOy8vIHRWYWw3ICA9IDUgKiAocFNyY0xlZnRbMTIqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbMipsZWZ0U3RlcF0pCi0gICAgICAgIEFERCAgICAgIHRWYWw2LCAgdFZhbDYsICAgdFZhbDcgICAgICAgICAgICAgIDsvLyB0VmFsNiAgPSBWID0gViArIFYzCi0gICAgICAgIFNVQiAgICAgIHRWYWw3LCAgdFZhbDgsICAgdFZhbDEwICAgICAgICAgICAgIDsvLyB0VmFsNyAgPSBwU3JjTGVmdFsxMSpsZWZ0U3RlcF0gLSBwU3JjTGVmdFszKmxlZnRTdGVwXQotICAgICAgICBNX0xEUkIgICB0VmFsOCwgIFt0VmFsOV0sIC1sZWZ0U3RlcCAgICAgICAgICA7Ly8gdFZhbDggID0gcFNyY0xlZnRbMTAqbGVmdFN0ZXBdCi0gICAgICAgIE1fTERSQiAgIHRWYWwxMCwgW3RWYWwxXSwgK2xlZnRTdGVwICAgICAgICAgIDsvLyB0VmFsMTAgPSBwU3JjTGVmdFs0KmxlZnRTdGVwXQotICAgICAgICBBREQgICAgICB0VmFsNiwgIHRWYWw2LCAgIHRWYWw3LCAgTFNMICMyICAgICA7Ly8gdFZhbDYgID0gViA9IFYgKyBWNAotICAgICAgICBTVUIgICAgICBkc3RTdGVwLCBkc3RTdGVwLCAjMTYgICAgICAgICAgICAgICA7Ly8gdFZhbDUgID0gZHN0U3RlcCAtIDE2Ci0gICAgICAgIFNVQiAgICAgIHRWYWw3LCAgdFZhbDgsICAgdFZhbDEwICAgICAgICAgICAgIDsvLyB0VmFsNyAgPSBwU3JjTGVmdFsxMCpsZWZ0U3RlcF0gLSBwU3JjTGVmdFs0KmxlZnRTdGVwXQotICAgICAgICBNX0xEUkIgICB0VmFsOCwgIFt0VmFsOV0sIC1sZWZ0U3RlcCAgICAgICAgICA7Ly8gdFZhbDggID0gcFNyY0xlZnRbOSpsZWZ0U3RlcF0KLSAgICAgICAgTV9MRFJCICAgdFZhbDEwLCBbdFZhbDFdLCArbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWwxMCA9IHBTcmNMZWZ0WzUqbGVmdFN0ZXBdCi0gICAgICAgIEFERCAgICAgIHRWYWw3LCAgdFZhbDcsICAgdFZhbDcsICBMU0wgIzEgICAgIDsvLyB0VmFsNyAgPSAzICogKHBTcmNMZWZ0WzEwKmxlZnRTdGVwXSAtIHBTcmNMZWZ0WzQqbGVmdFN0ZXBdKQotICAgICAgICBBREQgICAgICB0VmFsNiwgIHRWYWw2LCAgIHRWYWw3ICAgICAgICAgICAgICA7Ly8gdFZhbDYgID0gViA9IFYgKyBWNQotICAgICAgICBTVUIgICAgICB0VmFsNywgIHRWYWw4LCAgIHRWYWwxMCAgICAgICAgICAgICA7Ly8gdFZhbDcgID0gcFNyY0xlZnRbOSpsZWZ0U3RlcF0gLSBwU3JjTGVmdFs1KmxlZnRTdGVwXQotICAgICAgICBNX0xEUkIgICB0VmFsOCwgIFt0VmFsOV0sIC1sZWZ0U3RlcCAgICAgICAgICA7Ly8gdFZhbDggID0gcFNyY0xlZnRbOCpsZWZ0U3RlcF0KLSAgICAgICAgTV9MRFJCICAgdFZhbDEwLCBbdFZhbDFdLCArbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWwxMCA9IHBTcmNMZWZ0WzYqbGVmdFN0ZXBdCi0gICAgICAgIEFERCAgICAgIHRWYWw2LCAgdFZhbDYsICAgdFZhbDcsICBMU0wgIzEgICAgIDsvLyB0VmFsNiAgPSBWID0gViArIFY2Ci0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQotICAgICAgICBTVUIgICAgICB0VmFsNywgIHRWYWw4LCAgIHRWYWwxMCAgICAgICAgICAgICA7Ly8gdFZhbDcgID0gcFNyY0xlZnRbOCpsZWZ0U3RlcF0gLSBwU3JjTGVmdFs2KmxlZnRTdGVwXQotICAgICAgICBBREQgICAgICB0VmFsNiwgIHRWYWw2LCAgIHRWYWw3ICAgICAgICAgICAgICA7Ly8gdFZhbDYgID0gViA9IFYgKyBWNwotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKLSAgICAgICAgQUREICAgICAgdFZhbDYsICB0VmFsNiwgICB0VmFsNiwgIExTTCAjMiAgICAgOy8vIHRWYWw2ICA9IDUqVgotICAgICAgICBBREQgICAgICB0VmFsNiwgIHRWYWw2LCAgICMzMiAgICAgICAgICAgICAgICA7Ly8gdFZhbDYgID0gNSpWICsgMzIKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCi0gICAgICAgIEFTUiAgICAgIHRWYWwxNCwgdFZhbDYsICAgIzYgICAgICAgICAgICAgICAgIDsvLyB0VmFsMTQgPSBjID0gKDUqViArIDMyKT4+NgotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKLSAgICAgICAgUlNCICAgICAgdFZhbDYsICB0VmFsMTQsICB0VmFsMTQsIExTTCAjMyAgICAgOy8vIHRWYWw2ICA9IDcqYwotICAgICAgICBVWFRIICAgICB0VmFsMTQsIHRWYWwxNCAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDE0ID0gQ2xlYXJlZCB0aGUgdXBwZXIgaGFsZiB3b3JkCi0gICAgICAgIEFERCAgICAgIHRWYWwxMCwgdFZhbDEyLCAgdFZhbDEyICAgICAgICAgICAgIDsvLyB0VmFsMTAgPSAyKmIKLSAgICAgICAgT1JSICAgICAgdFZhbDE0LCB0VmFsMTQsICB0VmFsMTQsIExTTCAjMTYgICAgOy8vIHRWYWwxNCA9IHtjICAsICBjfQotICAgICAgICBTVUIgICAgICB0VmFsNiwgIHRWYWwyLCAgIHRWYWw2ICAgICAgICAgICAgICA7Ly8gdFZhbDYgID0gZCA9IGEgLSA3KmIgLSA3KmMgKyAxNgotICAgICAgICBBREQgICAgICB0VmFsMSwgIHRWYWw2LCAgIHRWYWwxMCAgICAgICAgICAgICA7Ly8gdFZhbDEgID0gcHAyID0gZCArIDIqYgotICAgICAgICBBREQgICAgICB0VmFsMTAsIHRWYWwxMCwgIHRWYWwxMiAgICAgICAgICAgICA7Ly8gdFZhbDEwID0zKmIKLSAgICAgICAgT1JSICAgICAgdFZhbDAsICB0VmFsNiwgICB0VmFsMSwgIExTTCAjMTYgICAgOy8vIHR2YWwwICA9IHAycDAgICA9IHBhY2sge3AyLCBwMH0KLSAgICAgICAgVVhUSCAgICAgdFZhbDEyLCB0VmFsMTIgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwxMiA9IENsZWFyZWQgdGhlIHVwcGVyIGhhbGYgd29yZAotICAgICAgICBVWFRIICAgICB0VmFsMTAsIHRWYWwxMCAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDEyID0gQ2xlYXJlZCB0aGUgdXBwZXIgaGFsZiB3b3JkCi0gICAgICAgIE9SUiAgICAgIHRWYWwxMiwgdFZhbDEyLCAgdFZhbDEyLCBMU0wgIzE2ICAgIDsvLyB0VmFsMTIgPSB7YiAgLCAgYn0KLSAgICAgICAgT1JSICAgICAgdFZhbDEwLCB0VmFsMTAsICB0VmFsMTAsIExTTCAjMTYgICAgOy8vIHRWYWwxMCA9IHszYiAsIDNifQotICAgICAgICBTQUREMTYgICB0VmFsMSwgIHRWYWwwLCAgIHRWYWwxMiAgICAgICAgICAgICA7Ly8gdFZhbDEgID0gcDNwMSAgID0gcDJwMCAgICsge2IsYn0KLSAgICAgICAgU0FERDE2ICAgdFZhbDIsICB0VmFsMSwgICB0VmFsMTAgICAgICAgICAgICAgOy8vIHRWYWwyICA9IHA2cDQgICA9IHAzcDEgICArIHszYiwzYn0KLSAgICAgICAgU0FERDE2ICAgdFZhbDQsICB0VmFsMiwgICB0VmFsMTIgICAgICAgICAgICAgOy8vIHRWYWw0ICA9IHA3cDUgICA9IHA2cDQgICArIHtiLGJ9Ci0gICAgICAgIFNBREQxNiAgIHRWYWw2LCAgdFZhbDQsICAgdFZhbDEwICAgICAgICAgICAgIDsvLyB0VmFsNiAgPSBwMTBwOCAgPSBwN3A1ICAgKyB7M2IsM2J9Ci0gICAgICAgIFNBREQxNiAgIHRWYWw3LCAgdFZhbDYsICAgdFZhbDEyICAgICAgICAgICAgIDsvLyB0VmFsNyAgPSBwMTFwOSAgPSBwMTBwOCAgKyB7YixifQotICAgICAgICBTQUREMTYgICB0VmFsOCwgIHRWYWw3LCAgIHRWYWwxMCAgICAgICAgICAgICA7Ly8gdFZhbDggID0gcDE0cDEyID0gcDExcDkgICsgezNiLDNifQotICAgICAgICBTQUREMTYgICB0VmFsOSwgIHRWYWw4LCAgIHRWYWwxMiAgICAgICAgICAgICA7Ly8gdFZhbDkgID0gcDE1cDEzID0gcDE0cDEyICsge2IsYn0KLSAgICAgICAgTERSICAgICAgcjB4MDBGRjAwRkYsICAgICA9TUFTS19DT05TVCAgICAgICAgOy8vIHIweDAwRkYwMEZGID0gMHgwMEZGMDBGRgotICAgICAgICAKLUxPT1BfUExBTkUgICAgICAgIAotCi0gICAgICAgIFVTQVQxNiAgIHRlbXAyLCAjMTMsIHAzcDEKLSAgICAgICAgVVNBVDE2ICAgdGVtcDEsICMxMywgcDJwMAotICAgICAgICBTQUREMTYgICBwM3AxLCAgIHAzcDEsICAgYyAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFNBREQxNiAgIHAycDAsICAgcDJwMCwgICBjICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQU5EICAgICAgdGVtcDIsIHIweDAwRkYwMEZGLCB0ZW1wMiwgQVNSICM1Ci0gICAgICAgIEFORCAgICAgIHRlbXAxLCByMHgwMEZGMDBGRiwgdGVtcDEsIEFTUiAjNQotICAgICAgICBPUlIgICAgICB0ZW1wMSwgdGVtcDEsIHRlbXAyLCBMU0wgIzgKLSAgICAgICAgU1RSICAgICAgdGVtcDEsIFtwRHN0XSwgIzQKLSAgICAgICAgCi0gICAgICAgIFVTQVQxNiAgIHRlbXAyLCAjMTMsIHA3cDUKLSAgICAgICAgVVNBVDE2ICAgdGVtcDEsICMxMywgcDZwNAotICAgICAgICBTQUREMTYgICBwN3A1LCAgIHA3cDUsICAgYyAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFNBREQxNiAgIHA2cDQsICAgcDZwNCwgICBjICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQU5EICAgICAgdGVtcDIsIHIweDAwRkYwMEZGLCB0ZW1wMiwgQVNSICM1Ci0gICAgICAgIEFORCAgICAgIHRlbXAxLCByMHgwMEZGMDBGRiwgdGVtcDEsIEFTUiAjNQotICAgICAgICBPUlIgICAgICB0ZW1wMSwgdGVtcDEsIHRlbXAyLCBMU0wgIzgKLSAgICAgICAgU1RSICAgICAgdGVtcDEsIFtwRHN0XSwgIzQKLSAgICAgICAgCi0gICAgICAgIFVTQVQxNiAgIHRlbXAyLCAjMTMsIHAxMXA5Ci0gICAgICAgIFVTQVQxNiAgIHRlbXAxLCAjMTMsIHAxMHA4Ci0gICAgICAgIFNBREQxNiAgIHAxMXA5LCAgcDExcDksICBjICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgU0FERDE2ICAgcDEwcDgsICBwMTBwOCwgIGMgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBBTkQgICAgICB0ZW1wMiwgcjB4MDBGRjAwRkYsIHRlbXAyLCBBU1IgIzUKLSAgICAgICAgQU5EICAgICAgdGVtcDEsIHIweDAwRkYwMEZGLCB0ZW1wMSwgQVNSICM1Ci0gICAgICAgIE9SUiAgICAgIHRlbXAxLCB0ZW1wMSwgdGVtcDIsIExTTCAjOAotICAgICAgICBTVFIgICAgICB0ZW1wMSwgW3BEc3RdLCAjNAotICAgICAgICAKLSAgICAgICAgVVNBVDE2ICAgdGVtcDIsICMxMywgcDE1cDEzCi0gICAgICAgIFVTQVQxNiAgIHRlbXAxLCAjMTMsIHAxNHAxMgotICAgICAgICBTQUREMTYgICBwMTVwMTMsIHAxNXAxMywgYyAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFNBREQxNiAgIHAxNHAxMiwgcDE0cDEyLCBjICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQU5EICAgICAgdGVtcDIsIHIweDAwRkYwMEZGLCB0ZW1wMiwgQVNSICM1Ci0gICAgICAgIEFORCAgICAgIHRlbXAxLCByMHgwMEZGMDBGRiwgdGVtcDEsIEFTUiAjNQotICAgICAgICBPUlIgICAgICB0ZW1wMSwgdGVtcDEsIHRlbXAyLCBMU0wgIzgKLSAgICAgICAgU1RSICAgICAgdGVtcDEsIFtwRHN0XSwgIzQKLSAgICAgICAgCi0gICAgICAgIEFERFMgICAgIHIweDAwRkYwMEZGLCByMHgwMEZGMDBGRiwgIzE8PDI4ICAgICA7Ly8gTG9vcCBjb3VudGVyIHZhbHVlIGluIHRvcCA0IGJpdHMKLSAgICAgICAgCi0gICAgICAgIEFERCAgICAgIHBEc3QsIHBEc3QsIGRzdFN0ZXAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICBCQ0MgICAgICBMT09QX1BMQU5FICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvb3AgZm9yIDE2IHRpbWVzCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgTV9FTkQKLSAgICAgICAgCi0gICAgICAgIEVORElGIDsvLyBBUk0xMTM2SlMKLQotICAgICAgICAgICAgCi0gICAgICAgIEVORAotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2IGVuZHMKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTIxMzlmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MucworKysgL2Rldi9udWxsCkBAIC0xLDU4MSArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi07Ly8gRGVmaW5lIHRoZSBwcm9jZXNzb3IgdmFyaWFudHMgc3VwcG9ydGVkIGJ5IHRoaXMgZmlsZQotICAgICAgICAgCi0gICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotICAgICAgICAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBUaGlzIHRhYmxlIGZvciBpbXBsZW1lbnRpbmcgc3dpdGNoIGNhc2Ugb2YgQyBpbiBhc20gYnkKLTsvLyB0aGUgbWVodG9kIG9mIHR3byBsZXZlbHMgb2YgaW5kZXhpbmcuCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBNX1RBQkxFIGFybVZDTTRQMTBfcFN3aXRjaFRhYmxlNHg0Ci0gICAgRENEICBPTVhfVkNfNHg0X1ZFUlQsICAgICBPTVhfVkNfNHg0X0hPUiAKLSAgICBEQ0QgIE9NWF9WQ180eDRfREMsICAgICAgIE9NWF9WQ180eDRfRElBR19ETAotICAgIERDRCAgT01YX1ZDXzR4NF9ESUFHX0RSLCAgT01YX1ZDXzR4NF9WUgotICAgIERDRCAgT01YX1ZDXzR4NF9IRCwgICAgICAgT01YX1ZDXzR4NF9WTAotICAgIERDRCAgT01YX1ZDXzR4NF9IVSAgIAotICAgIAotICAgIElGIEFSTTExMzZKUwotICAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gQ29uc3RhbnRzCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCi1CTEtfU0laRSAgICAgICAgICAgICAgRVFVIDB4OAotTVVMX0NPTlNUMCAgICAgICAgICAgIEVRVSAweDAxMDEwMTAxCi1BRERfQ09OU1QxICAgICAgICAgICAgRVFVIDB4ODA4MDgwODAKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBTY3JhdGNoIHZhcmlhYmxlCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcmV0dXJuICAgICAgICAgIFJOIDAKLXBUYWJsZSAgICAgICAgICBSTiA5Ci1wYyAgICAgICAgICAgICAgUk4gMTUKLXIweDAxMDEwMTAxICAgICBSTiAxCi1yMHg4MDgwODA4MCAgICAgUk4gMAotCi10VmFsMCAgICAgICAgICAgUk4gMAotdFZhbDEgICAgICAgICAgIFJOIDEKLXRWYWwyICAgICAgICAgICBSTiAyCi10VmFsNCAgICAgICAgICAgUk4gNAotdFZhbDYgICAgICAgICAgIFJOIDYKLXRWYWw3ICAgICAgICAgICBSTiA3Ci10VmFsOCAgICAgICAgICAgUk4gOAotdFZhbDkgICAgICAgICAgIFJOIDkKLXRWYWwxMCAgICAgICAgICBSTiAxMAotdFZhbDExICAgICAgICAgIFJOIDExCi10VmFsMTIgICAgICAgICAgUk4gMTIKLXRWYWwxNCAgICAgICAgICBSTiAxNAotCi1PdXQwICAgICAgICAgICAgUk4gNgotT3V0MSAgICAgICAgICAgIFJOIDcKLU91dDIgICAgICAgICAgICBSTiA4Ci1PdXQzICAgICAgICAgICAgUk4gOQotCi1MZWZ0MCAgICAgICAgICAgUk4gNgotTGVmdDEgICAgICAgICAgIFJOIDcKLUxlZnQyICAgICAgICAgICBSTiA4Ci1MZWZ0MyAgICAgICAgICAgUk4gOQotCi1BYm92ZTAxMjMgICAgICAgUk4gMTIKLUFib3ZlNDU2NyAgICAgICBSTiAxNAotCi1BYm92ZUxlZnQgICAgICAgUk4gMTAKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycwotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBTcmNMZWZ0ICAgICAgICBSTiAwICAgIDsvLyBpbnB1dCBwb2ludGVyCi1wU3JjQWJvdmUgICAgICAgUk4gMSAgICA7Ly8gaW5wdXQgcG9pbnRlcgotcFNyY0Fib3ZlTGVmdCAgIFJOIDIgICAgOy8vIGlucHV0IHBvaW50ZXIKLXBEc3QgICAgICAgICAgICBSTiAzICAgIDsvLyBvdXRwdXQgcG9pbnRlcgotbGVmdFN0ZXAgICAgICAgIFJOIDQgICAgOy8vIGlucHV0IHZhcmlhYmxlCi1kc3RTdGVwICAgICAgICAgUk4gNSAgICA7Ly8gaW5wdXQgdmFyaWFibGUKLXByZWRNb2RlICAgICAgICBSTiA2ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQotYXZhaWxhYmlsaXR5ICAgIFJOIDcgICAgOy8vIGlucHV0IHZhcmlhYmxlCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0IHN0YXJ0cwotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgCi0gICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQsIHIxMQotICAgICAgICAKLSAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKLSAgICAgICAgTV9BUkcgICAgTGVmdFN0ZXAsICAgICA0Ci0gICAgICAgIE1fQVJHICAgIERzdFN0ZXAsICAgICAgNAotICAgICAgICBNX0FSRyAgICBQcmVkTW9kZSwgICAgIDQKLSAgICAgICAgTV9BUkcgICAgQXZhaWxhYmlsaXR5LCA0Ci0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NAotICAgICAgICAKLSAgICAgICAgTERSICAgICAgcFRhYmxlLD1hcm1WQ000UDEwX3BTd2l0Y2hUYWJsZTR4NCAgOy8vIExvYWQgaW5kZXggdGFibGUgZm9yIHN3aXRjaCBjYXNlCi0gICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjawotICAgICAgICBNX0xEUiAgICBwcmVkTW9kZSwgUHJlZE1vZGUgICAgICAgICAgICAgICAgICA7Ly8gQXJnIHByZWRNb2RlIGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAKLSAgICAgICAgTV9MRFIgICAgbGVmdFN0ZXAsIExlZnRTdGVwICAgICAgICAgICAgICAgICAgOy8vIEFyZyBsZWZ0U3RlcCBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCi0gICAgICAgIE1fTERSICAgIGRzdFN0ZXAsICBEc3RTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBBcmcgZHN0U3RlcCBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgICAgICAgICAKLSAgICAgICAgTV9MRFIgICAgYXZhaWxhYmlsaXR5LCBBdmFpbGFiaWxpdHkgICAgICAgICAgOy8vIEFyZyBhdmFpbGFiaWxpdHkgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnIAotICAgICAgICAKLSAgICAgICAgTERSICAgICAgcGMsIFtwVGFibGUsIHByZWRNb2RlLCBMU0wgIzJdICAgICAgOy8vIEJyYW5jaCB0byB0aGUgY2FzZSBiYXNlZCBvbiBwcmVNb2RlCi0KLU9NWF9WQ180eDRfVkVSVAotICAgICAgICAKLSAgICAgICAgTERSICAgICAgQWJvdmUwMTIzLCAgW3BTcmNBYm92ZV0gICAgICAgICAgICAgOy8vIEFib3ZlMDEyMyA9IHBTcmNBYm92ZVswIHRvIDNdCi0gICAgICAgIE1fU1RSICAgIEFib3ZlMDEyMywgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgIDsvLyBwRHN0WzAgIHRvIDNdICA9IEFib3ZlMDEyMwotICAgICAgICBNX1NUUiAgICBBYm92ZTAxMjMsICBbcERzdF0sICBkc3RTdGVwICAgICAgICA7Ly8gcERzdFs0ICB0byA3XSAgPSBBYm92ZTAxMjMKLSAgICAgICAgTV9TVFIgICAgQWJvdmUwMTIzLCAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgOy8vIHBEc3RbOCAgdG8gMTFdID0gQWJvdmUwMTIzCi0gICAgICAgIFNUUiAgICAgIEFib3ZlMDEyMywgIFtwRHN0XSAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzEyIHRvIDE1XSA9IEFib3ZlMDEyMwotICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0gICAgICAgIE1fRVhJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1hY3JvIHRvIGV4aXQgbWlkd2F5LWJyZWFrIGZybSBjYXNlCi0KLU9NWF9WQ180eDRfSE9SCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NiAKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgIHIweDAxMDEwMTAxLCAgPU1VTF9DT05TVDAgICAgICAgICAgIDsvLyBDb25zdCB0byByZXBlYXQgdGhlIGJ5dGUgaW4gcmVnIDQgdGltZXMKLSAgICAgICAgTV9MRFJCICAgTGVmdDAsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQwID0gcFNyY0xlZnRbMF0KLSAgICAgICAgTV9MRFJCICAgTGVmdDEsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQxID0gcFNyY0xlZnRbMV0KLSAgICAgICAgTV9MRFJCICAgTGVmdDIsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQyID0gcFNyY0xlZnRbMl0KLSAgICAgICAgTERSQiAgICAgTGVmdDMsICBbcFNyY0xlZnRdICAgICAgICAgICAgICAgICAgOy8vIExlZnQzID0gcFNyY0xlZnRbM10KLSAgICAgICAgTVVMICAgICAgT3V0MCwgICBMZWZ0MCwgICByMHgwMTAxMDEwMSAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKLSAgICAgICAgTVVMICAgICAgT3V0MSwgICBMZWZ0MSwgICByMHgwMTAxMDEwMSAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKLSAgICAgICAgTVVMICAgICAgT3V0MiwgICBMZWZ0MiwgICByMHgwMTAxMDEwMSAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKLSAgICAgICAgTVVMICAgICAgT3V0MywgICBMZWZ0MywgICByMHgwMTAxMDEwMSAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKLSAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSBhdCBwRHN0IFswICB0byAzIF0gCi0gICAgICAgIE1fU1RSICAgIE91dDEsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MX0gYXQgcERzdCBbNCAgdG8gNyBdCi0gICAgICAgIE1fU1RSICAgIE91dDIsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0Mn0gYXQgcERzdCBbOCAgdG8gMTFdCi0gICAgICAgIFNUUiAgICAgIE91dDMsICAgW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0M30gYXQgcERzdCBbMTIgdG8gMTVdCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1hY3JvIHRvIGV4aXQgbWlkd2F5LWJyZWFrIGZybSBjYXNlCi0gICAgICAgIAotT01YX1ZDXzR4NF9EQwotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTYKLSAgICAgICAgCi0gICAgICAgIEFORCAgICAgIGF2YWlsYWJpbGl0eSwgIGF2YWlsYWJpbGl0eSwgICMoT01YX1ZDX1VQUEVSICsgT01YX1ZDX0xFRlQpCi0gICAgICAgIENNUCAgICAgIGF2YWlsYWJpbGl0eSwgICMoT01YX1ZDX1VQUEVSICsgT01YX1ZDX0xFRlQpCi0gICAgICAgIEJORSAgICAgIFVwcGVyT3JMZWZ0T3JOb25lQXZhaWxhYmxlICAgICAgICAgIDsvLyBKdW1wIHRvIFVwcGVyIGlmIG5vdCBib3RoCi0gICAgICAgIExEUiAgICAgIEFib3ZlMDEyMywgIFtwU3JjQWJvdmVdICAgICAgICAgICAgIDsvLyBBYm92ZTAxMjMgID0gcFNyY0Fib3ZlWzAgdG8gM10KLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCi0gICAgICAgIAotICAgICAgICBVWFRCMTYgICB0VmFsNywgIEFib3ZlMDEyMyAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAsIDJdCi0gICAgICAgIFVYVEIxNiAgIHRWYWw2LCAgQWJvdmUwMTIzLCAgUk9SICM4ICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMSwgM10KLSAgICAgICAgVUFERDE2ICAgdFZhbDExLCB0VmFsNiwgICB0VmFsNyAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswLCAyXSArIHBTcmNBYm92ZVsxLCAzXQotICAgICAgICBNX0xEUkIgICBMZWZ0MCwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDAgPSBwU3JjTGVmdFswXQotICAgICAgICBNX0xEUkIgICBMZWZ0MSwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDEgPSBwU3JjTGVmdFsxXQotICAgICAgICBBREQgICAgICB0VmFsMTEsIHRWYWwxMSwgIExTUiAjMTYgICAgICAgICAgICA7Ly8gc3VtKHBTcmNBYm92ZVswXSB0byBwU3JjQWJvdmVbM10pCi0gICAgICAgIE1fTERSQiAgIExlZnQyLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MiA9IHBTcmNMZWZ0WzJdCi0gICAgICAgIExEUkIgICAgIExlZnQzLCAgW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgIDsvLyBMZWZ0MyA9IHBTcmNMZWZ0WzNdCi0gICAgICAgIFVYVEggICAgIHRWYWwxMSwgdFZhbDExICAgICAgICAgICAgICAgICAgICAgIDsvLyB1cHN1bTEgKENsZWFyIHRoZSB0b3AganVuayBiaXRzKQotICAgICAgICBBREQgICAgICB0VmFsNiwgIExlZnQwLCAgTGVmdDEgICAgICAgICAgICAgICA7Ly8gdFZhbDYgPSBMZWZ0MCArIExlZnQxCi0gICAgICAgIEFERCAgICAgIHRWYWw3LCAgTGVmdDIsICBMZWZ0MyAgICAgICAgICAgICAgIDsvLyB0VmFsNyA9IExlZnQyICsgTGVmdDMKLSAgICAgICAgQUREICAgICAgdFZhbDYsICB0VmFsNiwgIHRWYWw3ICAgICAgICAgICAgICAgOy8vIHRWYWw2ID0gdFZhbDYgKyB0VmFsNwotICAgICAgICBBREQgICAgICBPdXQwLCAgIHRWYWw2LCAgdFZhbDExICAgICAgICAgICAgICA7Ly8gT3V0MCAgPSB0VmFsNiArIHRWYWwxMSAgIAotICAgICAgICBBREQgICAgICBPdXQwLCAgIE91dDAsICAgIzQgICAgICAgICAgICAgICAgICA7Ly8gT3V0MCAgPSBPdXQwICsgNAotICAgICAgICBMRFIgICAgICByMHgwMTAxMDEwMSwgICA9TVVMX0NPTlNUMCAgICAgICAgICA7Ly8gMHgwMTAxMDEwMQotICAgICAgICBNT1YgICAgICBPdXQwLCAgIE91dDAsICBMU1IgIzMgICAgICAgICAgICAgICA7Ly8gT3V0MCA9IChPdXQwICsgNCk+PjMKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCi0gICAgICAgIAotICAgICAgICBNVUwgICAgICBPdXQwLCAgIE91dDAsICByMHgwMTAxMDEwMSAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcwotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCi0gICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gYXQgcERzdCBbMCAgdG8gMyBdCi0gICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gYXQgcERzdCBbNCAgdG8gNyBdCi0gICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gYXQgcERzdCBbOCAgdG8gMTFdCi0gICAgICAgIFNUUiAgICAgIE91dDAsICAgW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gYXQgcERzdCBbMTIgdG8gMTVdCi0gICAgICAgIE1fRVhJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBNYWNybyB0byBleGl0IG1pZHdheS1icmVhayBmcm0gY2FzZQotICAgICAgICAKLVVwcGVyT3JMZWZ0T3JOb25lQXZhaWxhYmxlCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0zCi0gICAgICAgIAotICAgICAgICBDTVAgICAgICBhdmFpbGFiaWxpdHksICAjT01YX1ZDX1VQUEVSICAgICAgICA7Ly8gaWYoYXZhaWxhYmlsaXR5ICYgI09NWF9WQ19VUFBFUikKLSAgICAgICAgQk5FICAgICAgTGVmdE9yTm9uZUF2YWlsYWJsZSAgICAgICAgICAgICAgICAgOy8vIEp1bXAgdG8gTGVmdCBpZiBub3QgdXBwZXIKLSAgICAgICAgTERSICAgICAgQWJvdmUwMTIzLCAgW3BTcmNBYm92ZV0gICAgICAgICAgICAgOy8vIEFib3ZlMDEyMyAgPSBwU3JjQWJvdmVbMCB0byAzXQotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTMKLSAgICAgICAgCi0gICAgICAgIFVYVEIxNiAgIHRWYWw3LCAgQWJvdmUwMTIzICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCwgMl0KLSAgICAgICAgVVhUQjE2ICAgdFZhbDYsICBBYm92ZTAxMjMsICBST1IgIzggICAgICAgICAgOy8vIHBTcmNBYm92ZVsxLCAzXQotICAgICAgICBVQUREMTYgICBPdXQwLCAgIHRWYWw2LCAgdFZhbDcgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAsIDJdICsgcFNyY0Fib3ZlWzEsIDNdCi0gICAgICAgIExEUiAgICAgIHIweDAxMDEwMTAxLCAgID1NVUxfQ09OU1QwICAgICAgICAgIDsvLyAweDAxMDEwMTAxCi0gICAgICAgIEFERCAgICAgIE91dDAsICAgT3V0MCwgICBMU1IgIzE2ICAgICAgICAgICAgIDsvLyBzdW0ocFNyY0Fib3ZlWzBdIHRvIHBTcmNBYm92ZVszXSkKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCi0gICAgICAgIAotICAgICAgICBVWFRIICAgICBPdXQwLCAgIE91dDAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdXBzdW0xIChDbGVhciB0aGUgdG9wIGp1bmsgYml0cykKLSAgICAgICAgQUREICAgICAgT3V0MCwgICBPdXQwLCAgICMyICAgICAgICAgICAgICAgICAgOy8vIE91dDAgID0gT3V0MCArIDIKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICBPdXQwLCAgIE91dDAsICAgTFNSICMyICAgICAgICAgICAgICA7Ly8gT3V0MCAgPSAoT3V0MCArIDIpPj4yCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQotICAgICAgICAKLSAgICAgICAgTVVMICAgICAgT3V0MCwgICBPdXQwLCAgIHIweDAxMDEwMTAxICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0gICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3QgWzAgIHRvIDMgXQotICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0IFs0ICB0byA3IF0gCi0gICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3QgWzggIHRvIDExXQotICAgICAgICBTVFIgICAgICBPdXQwLCAgIFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0IFsxMiB0byAxNV0KLSAgICAgICAgCi0gICAgICAgIE1fRVhJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBNYWNybyB0byBleGl0IG1pZHdheS1icmVhayBmcm0gY2FzZQotICAgICAgICAKLUxlZnRPck5vbmVBdmFpbGFibGUgICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MwotICAgICAgICAKLSAgICAgICAgTERSICAgICAgcjB4MDEwMTAxMDEsICAgPU1VTF9DT05TVDAgICAgICAgICAgOy8vIDB4MDEwMTAxMDEKLSAgICAgICAgQ01QICAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX0xFRlQKLSAgICAgICAgQk5FICAgICAgTm9uZUF2YWlsYWJsZQotICAgICAgICBNX0xEUkIgICBMZWZ0MCwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDAgPSBwU3JjTGVmdFswXQotICAgICAgICBNX0xEUkIgICBMZWZ0MSwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDEgPSBwU3JjTGVmdFsxXQotICAgICAgICBNX0xEUkIgICBMZWZ0MiwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDIgPSBwU3JjTGVmdFsyXQotICAgICAgICBMRFJCICAgICBMZWZ0MywgIFtwU3JjTGVmdF0gICAgICAgICAgICAgICAgICA7Ly8gTGVmdDMgPSBwU3JjTGVmdFszXQotICAgICAgICBBREQgICAgICBPdXQwLCAgIExlZnQwLCAgTGVmdDEgICAgICAgICAgICAgICA7Ly8gT3V0MCAgPSBMZWZ0MCArIExlZnQxCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQotICAgICAgICAKLSAgICAgICAgQUREICAgICAgT3V0MSwgICBMZWZ0MiwgIExlZnQzICAgICAgICAgICAgICAgOy8vIE91dDEgID0gTGVmdDIgKyBMZWZ0MwotICAgICAgICBBREQgICAgICBPdXQwLCAgIE91dDAsICAgT3V0MSAgICAgICAgICAgICAgICA7Ly8gT3V0MCAgPSBPdXQwICArIE91dDEKLSAgICAgICAgQUREICAgICAgT3V0MCwgICBPdXQwLCAgICMyICAgICAgICAgICAgICAgICAgOy8vIE91dDAgID0gT3V0MCArIDIKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICBPdXQwLCAgIE91dDAsICAgTFNSICMyICAgICAgICAgICAgICA7Ly8gT3V0MCAgPSAoT3V0MCArIDIpPj4yCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQotICAgICAgICAKLSAgICAgICAgTVVMICAgICAgT3V0MCwgICBPdXQwLCAgIHIweDAxMDEwMTAxICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0gICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gYXQgcERzdCBbMCAgdG8gMyBdCi0gICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gYXQgcERzdCBbNCAgdG8gNyBdIAotICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDB9IGF0IHBEc3QgWzggIHRvIDExXQotICAgICAgICBTVFIgICAgICBPdXQwLCAgIFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDB9IGF0IHBEc3QgWzEyIHRvIDE1XQotICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKLQotTm9uZUF2YWlsYWJsZQotICAgICAgICBNT1YgICAgICBPdXQwLCAgICMxMjggICAgICAgICAgICAgICAgICAgICAgICA7Ly8gT3V0MCA9IDEyOCBpZihjb3VudCA9PSAwKQotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTUKLSAgICAgICAgCi0gICAgICAgIE1VTCAgICAgIE91dDAsICAgT3V0MCwgIHIweDAxMDEwMTAxICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgotICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDB9IGF0IHBEc3QgWzAgIHRvIDMgXQotICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDB9IGF0IHBEc3QgWzQgIHRvIDcgXSAKLSAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSBhdCBwRHN0IFs4ICB0byAxMV0KLSAgICAgICAgU1RSICAgICAgT3V0MCwgICBbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSBhdCBwRHN0IFsxMiB0byAxNV0KLSAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1hY3JvIHRvIGV4aXQgbWlkd2F5LWJyZWFrIGZybSBjYXNlCi0gICAgICAgIAotT01YX1ZDXzR4NF9ESUFHX0RMCi0gICAgICAgIAotICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgOy8vIGYgPSAoYSsyKmIrYysyKT4+MgotICAgICAgICA7Ly8gQ2FsY3VsYXRlIGFzOgotICAgICAgICA7Ly8gZCA9IChhICsgYyApPj4xCi0gICAgICAgIDsvLyBlID0gKGQgLSBiJyk+PjEKLSAgICAgICAgOy8vIGYgPSBlICsgMTI4Ci0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTMKLSAgICAgICAgCi0gICAgICAgIFRTVCAgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19VUFBFUl9SSUdIVCAgICAgICAgICAgICAgICAgIAotICAgICAgICBMRE1JQSAgICBwU3JjQWJvdmUsICB7QWJvdmUwMTIzLCBBYm92ZTQ1Njd9ICA7Ly8gQWJvdmUwMTIzLCBBYm92ZTQ1NjcgPSBwU3JjQWJvdmVbMCB0byA3XQotICAgICAgICBMRFIgICAgICByMHg4MDgwODA4MCwgID1BRERfQ09OU1QxICAgICAgICAgICA7Ly8gMHg4MDgwODA4MAotICAgICAgICBCTkUgICAgICBETFVwcGVyUmlnaHRBdmFpbGFibGUKLSAgICAgICAgTERSICAgICAgcjB4MDEwMTAxMDEsICA9TVVMX0NPTlNUMCAgICAgICAgICAgOy8vIDB4MDEwMTAxMDEKLSAgICAgICAgTU9WICAgICAgdFZhbDcsICBBYm92ZTAxMjMsICBMU1IgIzI0ICAgICAgICAgOy8vIHswMCwgIDAwLCAgMDAsICBVMyB9Ci0gICAgICAgIE1PViAgICAgIHRWYWwxMSwgdFZhbDcsICBMU0wgIzI0ICAgICAgICAgICAgIDsvLyB7VTMsICAwMCwgIDAwLCAgMDAgfQotICAgICAgICBNVUwgICAgICBPdXQzLCAgIHRWYWw3LCAgcjB4MDEwMTAxMDEgICAgICAgICA7Ly8ge1UzLCAgVTMsICBVMywgIFUzIH0gCi0gICAgICAgIE1PViAgICAgIHRWYWw4LCAgQWJvdmUwMTIzLCAgTFNSICMxNiAgICAgICAgIDsvLyB7MDAsICAwMCwgIFUzLCAgVTIgfQotICAgICAgICBNT1YgICAgICB0VmFsMTAsIEFib3ZlMDEyMywgIExTUiAjOCAgICAgICAgICA7Ly8gezAwLCAgVTMsICBVMiwgIFUxIH0KLSAgICAgICAgTVZOICAgICAgdFZhbDEwLCB0VmFsMTAgICAgICAgICAgICAgICAgICAgICAgOy8vIHswMCcsIFUzJywgVTInLCBVMSd9Ci0gICAgICAgIFVIQUREOCAgIHRWYWw4LCAgdFZhbDgsICBBYm92ZTAxMjMgICAgICAgICAgIDsvLyB7eHgsICB4eCwgIGQxLCAgZDAgfQotICAgICAgICBVSEFERDggICB0VmFsNiwgIEFib3ZlMDEyMywgIHRWYWw5ICAgICAgICAgICA7Ly8ge3h4LCAgZDIsICB4eCwgIHh4IH0KLSAgICAgICAgVUhTVUI4ICAgdFZhbDgsICB0VmFsOCwgIHRWYWwxMCAgICAgICAgICAgICAgOy8vIHt4eCwgIHh4LCAgZTEsICBlMCB9Ci0gICAgICAgIFVIU1VCOCAgIHRWYWw2LCAgdFZhbDYsICB0VmFsMTAgICAgICAgICAgICAgIDsvLyB7eHgsICBlMiwgIHh4LCAgeHggfQotICAgICAgICBVQUREOCAgICB0VmFsOCwgIHRWYWw4LCAgcjB4ODA4MDgwODAgICAgICAgICA7Ly8ge3h4LCAgeHgsICBmMSwgIGYwIH0KLSAgICAgICAgVUFERDggICAgdFZhbDYsICB0VmFsNiwgIHIweDgwODA4MDgwICAgICAgICAgOy8vIHt4eCwgIGYyLCAgeHgsICB4eCB9Ci0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQotICAgICAgICAKLSAgICAgICAgUEtIQlQgICAgdFZhbDYsICB0VmFsOCwgIHRWYWw2ICAgICAgICAgICAgICAgOy8vIHt4eCwgIGYyLCAgZjEsICBmMCB9Ci0gICAgICAgIEJJQyAgICAgIHRWYWw2LCAgdFZhbDYsICAjMHhGRjAwMDAwMCAgICAgICAgIDsvLyB7MDAsICBmMiwgIGYxLCAgZjAgfQotICAgICAgICBPUlIgICAgICBPdXQwLCAgIHRWYWw2LCAgdFZhbDExICAgICAgICAgICAgICA7Ly8ge1UzLCAgZjIsICBmMSwgIGYwIH0KLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCi0gICAgICAgIAotICAgICAgICBQS0hUQiAgICBPdXQxLCAgIE91dDMsICAgT3V0MCwgIEFTUiAjOCAgICAgICA7Ly8ge1UzLCAgVTMsICBmMiwgIGYxIH0KLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgotICAgICAgICBQS0hUQiAgICBPdXQyLCAgIE91dDMsICAgT3V0MSwgIEFTUiAjOCAgICAgICA7Ly8ge1UzLCAgVTMsICBVMywgIGYyIH0KLSAgICAgICAgCi0gICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7ZjMgdG8gZjB9IGF0IHBEc3RbMyAgdG8gMCBdCi0gICAgICAgIE1fU1RSICAgIE91dDEsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7ZjQgdG8gZjF9IGF0IHBEc3RbNyAgdG8gNCBdCi0gICAgICAgIE1fU1RSICAgIE91dDIsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7ZjUgdG8gZjJ9IGF0IHBEc3RbMTEgdG8gOCBdCi0gICAgICAgIFNUUiAgICAgIE91dDMsICAgW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7ZjYgdG8gZjN9IGF0IHBEU3RbMTUgdG8gMTJdCi0gICAgICAgIE1fRVhJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBNYWNybyB0byBleGl0IG1pZHdheS1icmVhayBmcm0gY2FzZQotCi1ETFVwcGVyUmlnaHRBdmFpbGFibGUgICAgICAgIAotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgdFZhbDgsICBBYm92ZTAxMjMsICBMU1IgIzI0ICAgICAgICAgOy8vIHswMCwgIDAwLCAgMDAsICBVMyB9Ci0gICAgICAgIE1PViAgICAgIHRWYWw5LCAgQWJvdmUwMTIzLCAgTFNSICMxNiAgICAgICAgIDsvLyB7MDAsICAwMCwgIFUzLCAgVTIgfQotICAgICAgICBNT1YgICAgICB0VmFsMTAsIEFib3ZlMDEyMywgIExTUiAjOCAgICAgICAgICA7Ly8gezAwLCAgVTMsICBVMiwgIFUxIH0KLSAgICAgICAgT1JSICAgICAgdFZhbDgsICB0VmFsOCwgIEFib3ZlNDU2NywgTFNMICM4ICAgOy8vIHtVNiwgIFU1LCAgVTQsICBVMyB9Ci0gICAgICAgIE9SUiAgICAgIHRWYWwxMCwgdFZhbDEwLCBBYm92ZTQ1NjcsIExTTCAjMjQgIDsvLyB7VTQsICBVMywgIFUyLCAgVTEgfQotICAgICAgICBQS0hCVCAgICB0VmFsOSwgIHRWYWw5LCAgQWJvdmU0NTY3LCBMU0wgIzE2ICA7Ly8ge1U1LCAgVTQsICBVMywgIFUyIH0KLSAgICAgICAgTVZOICAgICAgdFZhbDEsICB0VmFsOCAgICAgICAgICAgICAgICAgICAgICAgOy8vIHtVNicsIFU1JywgVTQnLCBVMyd9Ci0gICAgICAgIE1WTiAgICAgIHRWYWwxMCwgdFZhbDEwICAgICAgICAgICAgICAgICAgICAgIDsvLyB7VTQnLCBVMycsIFUyJywgVTEnfQotICAgICAgICBNVk4gICAgICB0VmFsMiwgIEFib3ZlNDU2NyAgICAgICAgICAgICAgICAgICA7Ly8ge1U3JywgVTYnLCBVNScsIFU0J30KLSAgICAgICAgVUhBREQ4ICAgdFZhbDYsICBBYm92ZTAxMjMsICB0VmFsOSAgICAgICAgICAgOy8vIHtkMywgIGQyLCAgZDEsICBkMCB9Ci0gICAgICAgIFVIQUREOCAgIHRWYWw5LCAgdFZhbDksICBBYm92ZTQ1NjcgICAgICAgICAgIDsvLyB7ZDUsICBkNCwgIGQzLCAgZDIgfQotICAgICAgICBVSEFERDggICB0VmFsOCwgIEFib3ZlNDU2NywgIHRWYWw4ICAgICAgICAgICA7Ly8ge2Q2LCAgeHgsICB4eCwgIHh4IH0KLSAgICAgICAgVUhTVUI4ICAgdFZhbDYsICB0VmFsNiwgIHRWYWwxMCAgICAgICAgICAgICAgOy8vIHtlMywgIGUyLCAgZTEsICBlMCB9Ci0gICAgICAgIFVIU1VCOCAgIHRWYWwxMiwgdFZhbDksICB0VmFsMSAgICAgICAgICAgICAgIDsvLyB7ZTUsICBlNCwgIGUzLCAgZTIgfQotICAgICAgICBVSFNVQjggICB0VmFsOCwgIHRWYWw4LCAgdFZhbDIgICAgICAgICAgICAgICA7Ly8ge2U2LCAgeHgsICB4eCwgIHh4IH0KLSAgICAgICAgVUFERDggICAgT3V0MCwgICB0VmFsNiwgIHIweDgwODA4MDgwICAgICAgICAgOy8vIHtmMywgIGYyLCAgZjEsICBmMCB9Ci0gICAgICAgIFVBREQ4ICAgIHRWYWw5LCAgdFZhbDgsICByMHg4MDgwODA4MCAgICAgICAgIDsvLyB7ZjYsICB4eCwgIHh4LCAgeHggfQotICAgICAgICBVQUREOCAgICBPdXQyLCAgIHRWYWwxMiwgcjB4ODA4MDgwODAgICAgICAgICA7Ly8ge2Y1LCAgZjQsICBmMywgIGYyIH0KLSAgICAgICAgTU9WICAgICAgdFZhbDcsICBPdXQwLCAgIExTUiAjOCAgICAgICAgICAgICAgOy8vIHswMCwgIGYzLCAgZjIsICBmMSB9Ci0gICAgICAgIEFORCAgICAgIHRWYWw5LCAgdFZhbDksICAjMHhGRjAwMDAwMCAgICAgICAgIDsvLyB7ZjYsICAwMCwgIDAwLCAgMDAgfQotICAgICAgICBQS0hCVCAgICBPdXQxLCAgIHRWYWw3LCAgT3V0MiwgIExTTCAjOCAgICAgICA7Ly8ge2Y0LCAgZjMsICBmMiwgIGYxIH0KLSAgICAgICAgT1JSICAgICAgT3V0MywgICB0VmFsOSwgIE91dDIsICBMU1IgIzggICAgICAgOy8vIHtmNiwgIGY1LCAgZjQsICBmMyB9Ci0gICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7ZjMgdG8gZjB9IGF0IHBEc3RbMyAgdG8gMCBdCi0gICAgICAgIE1fU1RSICAgIE91dDEsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7ZjQgdG8gZjF9IGF0IHBEc3RbNyAgdG8gNCBdCi0gICAgICAgIE1fU1RSICAgIE91dDIsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7ZjUgdG8gZjJ9IGF0IHBEc3RbMTEgdG8gOCBdCi0gICAgICAgIFNUUiAgICAgIE91dDMsICAgW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7ZjYgdG8gZjN9IGF0IHBEU3RbMTUgdG8gMTJdCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1hY3JvIHRvIGV4aXQgbWlkd2F5LWJyZWFrIGZybSBjYXNlCi0gICAgICAgIAotCi1PTVhfVkNfNHg0X0RJQUdfRFIKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz00Ci0gICAgICAgIAotICAgICAgICBNX0xEUkIgICBMZWZ0MCwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDAgPSBwU3JjTGVmdFswXQotICAgICAgICBNX0xEUkIgICBMZWZ0MSwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDEgPSBwU3JjTGVmdFsxXQotICAgICAgICBNX0xEUkIgICBMZWZ0MiwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDIgPSBwU3JjTGVmdFsyXQotICAgICAgICBMRFJCICAgICBMZWZ0MywgIFtwU3JjTGVmdF0gICAgICAgICAgICAgICAgICA7Ly8gTGVmdDMgPSBwU3JjTGVmdFszXQotICAgICAgICBMRFJCICAgICBBYm92ZUxlZnQsIFtwU3JjQWJvdmVMZWZ0XSAgICAgICAgICA7Ly8gQWJvdmVMZWZ0ID0gcFNyY0Fib3ZlTGVmdFswXQotICAgICAgICBPUlIgICAgICB0VmFsNywgIExlZnQxLCAgTGVmdDAsICBMU0wgIzggICAgICA7Ly8gdFZhbDcgPSAwMCAwMCBMMCBMMQotICAgICAgICBMRFIgICAgICBBYm92ZTAxMjMsICBbcFNyY0Fib3ZlXSAgICAgICAgICAgICA7Ly8gQWJvdmUwMTIzID0gVTMgVTIgVTEgVTAKLSAgICAgICAgTERSICAgICAgcjB4ODA4MDgwODAsID1BRERfQ09OU1QxICAgICAgICAgICAgOy8vIDB4ODA4MDgwODAKLSAgICAgICAgT1JSICAgICAgdFZhbDgsICBMZWZ0MywgIExlZnQyLCAgTFNMICM4ICAgICAgOy8vIHRWYWw4ID0gMDAgMDAgTDIgTDMKLSAgICAgICAgUEtIQlQgICAgdFZhbDcsICB0VmFsOCwgIHRWYWw3LCAgTFNMICMxNiAgICAgOy8vIHRWYWw3ID0gTDAgTDEgTDIgTDMKLSAgICAgICAgTU9WICAgICAgdFZhbDgsICBBYm92ZTAxMjMsICBMU0wgIzggICAgICAgICAgOy8vIHRWYWw4ID0gVTIgVTEgVTAgMDAKLSAgICAgICAgTU9WICAgICAgdFZhbDksICB0VmFsNywgIExTUiAjOCAgICAgICAgICAgICAgOy8vIHRWYWw5ID0gMDAgTDAgTDEgTDIKLSAgICAgICAgT1JSICAgICAgdFZhbDgsICB0VmFsOCwgIEFib3ZlTGVmdCAgICAgICAgICAgOy8vIHRWYWw4ID0gVTIgVTEgVTAgVUwKLSAgICAgICAgT1JSICAgICAgdFZhbDksICB0VmFsOSwgIEFib3ZlTGVmdCwgTFNMICMyNCAgOy8vIHRWYWw5ID0gVUwgTDAgTDEgTDIKLSAgICAgICAgTU9WICAgICAgdFZhbDEwLCBBYm92ZTAxMjMsICBMU0wgIzI0ICAgICAgICAgOy8vIHRWYWwxMD0gVTAgMDAgMDAgMDAKLSAgICAgICAgVVhUQiAgICAgdFZhbDExLCB0VmFsNywgIFJPUiAjMjQgICAgICAgICAgICAgOy8vIHRWYWwxMT0gMDAgMDAgMDAgTDAKLSAgICAgICAgT1JSICAgICAgdFZhbDEwLCB0VmFsMTAsIHRWYWw5LCAgTFNSICM4ICAgICAgOy8vIHRWYWwxMD0gVTAgVUwgTDAgTDEKLSAgICAgICAgT1JSICAgICAgdFZhbDExLCB0VmFsMTEsIHRWYWw4LCAgTFNMICM4ICAgICAgOy8vIHRWYWwxMT0gVTEgVTAgVUwgTDAKLSAgICAgICAgVUhBREQ4ICAgdFZhbDExLCBBYm92ZTAxMjMsICB0VmFsMTEgICAgICAgICAgOy8vIHRWYWwxMT0gZDEgZDAgZEwgZzAKLSAgICAgICAgVUhBREQ4ICAgdFZhbDEwLCB0VmFsNywgIHRWYWwxMCAgICAgICAgICAgICAgOy8vIHRWYWwxMD0gZzAgZzEgZzIgZzMKLSAgICAgICAgTVZOICAgICAgdFZhbDgsICB0VmFsOCAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWw4ID0gVTInVTEnVTAnVUwnCi0gICAgICAgIE1WTiAgICAgIHRWYWw5LCAgdFZhbDkgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsOSA9IFVMJ0wwJ0wxJ0wyJwotICAgICAgICBVSFNVQjggICB0VmFsMTEsIHRWYWwxMSwgdFZhbDggICAgICAgICAgICAgICA7Ly8gdFZhbDExPSBlMSBlMCBlTCBoMAotICAgICAgICBVSFNVQjggICB0VmFsMTAsIHRWYWwxMCwgdFZhbDkgICAgICAgICAgICAgICA7Ly8gdFZhbDEwPSBoMCBoMSBoMiBoMwotICAgICAgICBVQUREOCAgICBPdXQzLCAgIHRWYWwxMCwgcjB4ODA4MDgwODAgICAgICAgICA7Ly8gT3V0MyAgPSBpMCBpMSBpMiBpMwotICAgICAgICBVQUREOCAgICBPdXQwLCAgIHRWYWwxMSwgcjB4ODA4MDgwODAgICAgICAgICA7Ly8gT3V0MCAgPSBmMSBmMCBmTCBpMAotICAgICAgICBVWFRIICAgICB0VmFsMTEsIE91dDMsICAgUk9SICM4ICAgICAgICAgICAgICA7Ly8gdFZhbDExPSAwMCAwMCBpMSBpMgotICAgICAgICBNT1YgICAgICB0VmFsNywgIE91dDAsICAgTFNMICM4ICAgICAgICAgICAgICA7Ly8gdFZhbDcgPSBmMCBmTCBpMCAwMAotICAgICAgICBPUlIgICAgICBPdXQxLCAgIHRWYWw3LCAgdFZhbDExLCAgTFNSICM4ICAgICA7Ly8gT3V0MSAgPSBmMCBmTCBpMCBpMQotICAgICAgICBQS0hCVCAgICBPdXQyLCAgIHRWYWwxMSwgT3V0MCwgICAgTFNMICMxNiAgICA7Ly8gT3V0MiAgPSBmTCBpMCBpMSBpMgotICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge2YxIHRvIGkwfSBhdCBwRHN0WzMgIHRvIDAgXQotICAgICAgICBNX1NUUiAgICBPdXQxLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge2YwIHRvIGkxfSBhdCBwRHN0WzcgIHRvIDQgXQotICAgICAgICBNX1NUUiAgICBPdXQyLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge2ZMIHRvIGkyfSBhdCBwRHN0WzExIHRvIDggXQotICAgICAgICBTVFIgICAgICBPdXQzLCAgIFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge2kwIHRvIGkzfSBhdCBwRHN0WzE1IHRvIDEyXSAKLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1hY3JvIHRvIGV4aXQgbWlkd2F5LWJyZWFrIGZybSBjYXNlCi0KLU9NWF9WQ180eDRfVlIKLQotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NAotICAgICAgICAKLSAgICAgICAgTERSICAgICAgQWJvdmUwMTIzLCAgW3BTcmNBYm92ZV0gICAgICAgICAgICAgOy8vIEFib3ZlMDEyMyA9IFUzIFUyIFUxIFUwCi0gICAgICAgIExEUkIgICAgIEFib3ZlTGVmdCwgIFtwU3JjQWJvdmVMZWZ0XSAgICAgICAgIDsvLyBBYm92ZUxlZnQgPSAwMCAwMCAwMCBVTAotICAgICAgICBNX0xEUkIgICBMZWZ0MCwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDAgICAgID0gMDAgMDAgMDAgTDAKLSAgICAgICAgTV9MRFJCICAgTGVmdDEsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQxICAgICA9IDAwIDAwIDAwIEwxCi0gICAgICAgIExEUkIgICAgIExlZnQyLCAgW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgIDsvLyBMZWZ0MiAgICAgPSAwMCAwMCAwMCBMMgotICAgICAgICBNT1YgICAgICB0VmFsMCwgIEFib3ZlMDEyMywgIExTTCAjOCAgICAgICAgICA7Ly8gdFZhbDAgICAgID0gVTIgVTEgVTAgMDAKLSAgICAgICAgTU9WICAgICAgdFZhbDksICBBYm92ZTAxMjMgICAgICAgICAgICAgICAgICAgOy8vIHRWYWw5ICAgICA9IFUzIFUyIFUxIFUwIAotICAgICAgICBPUlIgICAgICB0VmFsMTQsIHRWYWwwLCAgIEFib3ZlTGVmdCAgICAgICAgICA7Ly8gdFZhbDE0ICAgID0gVTIgVTEgVTAgVUwKLSAgICAgICAgTVZOICAgICAgdFZhbDExLCB0VmFsMTQgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwxMSAgICA9IFUyJ1UxJ1UwJ1VMJwotICAgICAgICBNT1YgICAgICB0VmFsMiwgIHRWYWwxNCwgIExTTCAjOCAgICAgICAgICAgICA7Ly8gdFZhbDIgICAgID0gVTEgVTAgVUwgMDAKLSAgICAgICAgVUhTVUI4ICAgdFZhbDEsICBBYm92ZTAxMjMsICB0VmFsMTEgICAgICAgICAgOy8vIHRWYWwxICAgICA9IGQyIGQxIGQwIGRMCi0gICAgICAgIFVIQUREOCAgIHRWYWwxMCwgQWJvdmVMZWZ0LCBMZWZ0MSAgICAgICAgICAgIDsvLyB0VmFsMTAgICAgPSAwMCAwMCAwMCBqMSAgICAgICAKLSAgICAgICAgTVZOICAgICAgdFZhbDQsICBMZWZ0MCAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWw0ICAgICA9IDAwIDAwIDAwIEwwJwotICAgICAgICBVSFNVQjggICB0VmFsNCwgIHRWYWwxMCwgIHRWYWw0ICAgICAgICAgICAgICA7Ly8gdFZhbDQgICAgID0gMDAgMDAgMDAgazEKLSAgICAgICAgT1JSICAgICAgdFZhbDEyLCB0VmFsMCwgICBMZWZ0MCAgICAgICAgICAgICAgOy8vIHRWYWwxMiAgICA9IFUyIFUxIFUwIEwwCi0gICAgICAgIE9SUiAgICAgIHRWYWwxNCwgdFZhbDIsICAgTGVmdDAgICAgICAgICAgICAgIDsvLyB0VmFsMTQgICAgPSBVMSBVMCBVTCBMMAotICAgICAgICBMRFIgICAgICByMHg4MDgwODA4MCwgID1BRERfQ09OU1QxICAgICAgICAgICA7Ly8gMHg4MDgwODA4MAotICAgICAgICBVSEFERDggICB0VmFsMTAsIHRWYWw5LCAgIHRWYWwxNCAgICAgICAgICAgICA7Ly8gdFZhbDEwICAgID0gZzMgZzIgZzEgZzAKLSAgICAgICAgVUFERDggICAgT3V0MCwgICB0VmFsMSwgICByMHg4MDgwODA4MCAgICAgICAgOy8vIE91dDAgICAgICA9IGUyIGUxIGUwIGVMCi0gICAgICAgIFVIU1VCOCAgIHRWYWwxMCwgdFZhbDEwLCAgdFZhbDExICAgICAgICAgICAgIDsvLyB0VmFsMTAgICAgPSBoMyBoMiBoMSBoMAotICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge2UyIHRvIGVMfSBhdCBwRHN0WzMgIHRvIDAgXQotICAgICAgICBNT1YgICAgICB0VmFsMSwgIHRWYWwxNCwgIExTTCAjOCAgICAgICAgICAgICA7Ly8gdFZhbDEgICAgID0gVTAgVUwgTDAgMDAKLSAgICAgICAgTU9WICAgICAgdFZhbDYsICBPdXQwLCAgICBMU0wgIzggICAgICAgICAgICAgOy8vIHRWYWw2ICAgICA9IGUxIGUwIGVMIDAwCi0gICAgICAgIE9SUiAgICAgIHRWYWwyLCAgdFZhbDIsICAgTGVmdDEgICAgICAgICAgICAgIDsvLyB0VmFsMiAgICAgPSBVMSBVMCBVTCBMMQotICAgICAgICBVQUREOCAgICB0VmFsNCwgIHRWYWw0LCAgIHIweDgwODA4MDgwICAgICAgICA7Ly8gdFZhbDQgICAgID0gMDAgMDAgMDAgbDEgICAgICAgIAotICAgICAgICBVQUREOCAgICBPdXQxLCAgIHRWYWwxMCwgIHIweDgwODA4MDgwICAgICAgICA7Ly8gT3V0MSAgICAgID0gaTMgaTIgaTEgaTAKLSAgICAgICAgTVZOICAgICAgdFZhbDIsICB0VmFsMiAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwxNCAgICA9IFUxJ1UwJ1VMJ0wxJwotICAgICAgICBPUlIgICAgICB0VmFsMSwgIHRWYWwxLCAgIExlZnQyICAgICAgICAgICAgICA7Ly8gdFZhbDEgICAgID0gVTAgVUwgTDAgTDIKLSAgICAgICAgT1JSICAgICAgT3V0MiwgICB0VmFsNiwgICB0VmFsNCAgICAgICAgICAgICAgOy8vIE91dDIgICAgICA9IGUxIGUwIGVMIGwxCi0gICAgICAgIFVIQUREOCAgIHRWYWwxLCAgdFZhbDEsICAgdFZhbDEyICAgICAgICAgICAgIDsvLyB0VmFsMSAgICAgPSBnMiBnMSBnMCBqMgotICAgICAgICBNX1NUUiAgICBPdXQxLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge2kzIHRvIGkwfSBhdCBwRHN0WzcgIHRvIDQgXQotICAgICAgICBNX1NUUiAgICBPdXQyLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge2UxIHRvIGwxfSBhdCBwRHN0WzExIHRvIDggXQotICAgICAgICBVSFNVQjggICB0VmFsOSwgIHRWYWwxLCAgIHRWYWwyICAgICAgICAgICAgICA7Ly8gdFZhbDkgICAgID0gaDIgaDEgaDAgazIKLSAgICAgICAgVUFERDggICAgT3V0MywgICB0VmFsOSwgICByMHg4MDgwODA4MCAgICAgICAgOy8vIE91dDMgICAgICA9IGkyIGkxIGkwIGwyCi0gICAgICAgIFNUUiAgICAgIE91dDMsICAgW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7aTIgdG8gbDJ9IGF0IHBEc3RbMTUgdG8gMTJdIAotICAgICAgICBNT1YgICAgICByZXR1cm4sICAjT01YX1N0c19Ob0VycgotICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKLSAgICAgICAgCi1PTVhfVkNfNHg0X0hECi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NAotICAgICAgICAKLSAgICAgICAgTERSICAgICAgQWJvdmUwMTIzLCAgW3BTcmNBYm92ZV0gICAgICAgICAgICAgOy8vIEFib3ZlMDEyMyA9IFUzIFUyIFUxIFUwCi0gICAgICAgIExEUkIgICAgIEFib3ZlTGVmdCwgIFtwU3JjQWJvdmVMZWZ0XSAgICAgICAgIDsvLyBBYm92ZUxlZnQgPSAwMCAwMCAwMCBVTAotICAgICAgICBNX0xEUkIgICBMZWZ0MCwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDAgPSAwMCAwMCAwMCBMMAotICAgICAgICBNX0xEUkIgICBMZWZ0MSwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDEgPSAwMCAwMCAwMCBMMQotICAgICAgICBNX0xEUkIgICBMZWZ0MiwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDIgPSAwMCAwMCAwMCBMMgotICAgICAgICBMRFJCICAgICBMZWZ0MywgIFtwU3JjTGVmdF0gICAgICAgICAgICAgICAgICA7Ly8gTGVmdDMgPSAwMCAwMCAwMCBMMwotICAgICAgICBMRFIgICAgICByMHg4MDgwODA4MCwgID1BRERfQ09OU1QxICAgICAgICAgICA7Ly8gMHg4MDgwODA4MAotICAgICAgICBPUlIgICAgICB0VmFsMiwgIEFib3ZlTGVmdCwgQWJvdmUwMTIzLCBMU0wgIzg7Ly8gdFZhbDIgPSBVMiBVMSBVMCBVTAotICAgICAgICBNVk4gICAgICB0VmFsMSwgIExlZnQwICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDEgPSAwMCAwMCAwMCBMMCcKLSAgICAgICAgT1JSICAgICAgdFZhbDQsICBMZWZ0MCwgIHRWYWwyLCAgTFNMICM4ICAgICAgOy8vIHRWYWw0ID0gVTEgVTAgVUwgTDAKLSAgICAgICAgTVZOICAgICAgdFZhbDIsICB0VmFsMiAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwyID0gVTInVTEnVTAnVUwnCi0gICAgICAgIFVIQUREOCAgIHRWYWw0LCAgdFZhbDQsICBBYm92ZTAxMjMgICAgICAgICAgIDsvLyB0VmFsNCA9IGczIGcyIGcxIGcwCi0gICAgICAgIFVIU1VCOCAgIHRWYWwxLCAgQWJvdmVMZWZ0LCAgdFZhbDEgICAgICAgICAgIDsvLyB0VmFsMSA9IDAwIDAwIDAwIGRMCi0gICAgICAgIFVIU1VCOCAgIHRWYWw0LCAgdFZhbDQsICB0VmFsMiAgICAgICAgICAgICAgIDsvLyB0VmFsNCA9IGgzIGgyIGgxIGgwCi0gICAgICAgIFVBREQ4ICAgIHRWYWwxLCAgdFZhbDEsICByMHg4MDgwODA4MCAgICAgICAgIDsvLyB0VmFsMSA9IDAwIDAwIDAwIGVMCi0gICAgICAgIFVBREQ4ICAgIHRWYWw0LCAgdFZhbDQsICByMHg4MDgwODA4MCAgICAgICAgIDsvLyB0VmFsNCA9IGkzIGkyIGkxIGkwCi0gICAgICAgIE9SUiAgICAgIHRWYWwyLCAgTGVmdDAsICBBYm92ZUxlZnQsICBMU0wgIzE2IDsvLyB0VmFsMiA9IDAwIFVMIDAwIEwwCi0gICAgICAgIE1PViAgICAgIHRWYWw0LCAgdFZhbDQsICBMU0wgIzggICAgICAgICAgICAgIDsvLyB0VmFsNCA9IGkyIGkxIGkwIDAwCi0gICAgICAgIE9SUiAgICAgIHRWYWwxMSwgTGVmdDEsICBMZWZ0MCwgIExTTCAjMTYgICAgIDsvLyB0VmFsMTE9IDAwIEwwIDAwIEwxCi0gICAgICAgIE9SUiAgICAgIHRWYWw3LCAgTGVmdDIsICBMZWZ0MSwgIExTTCAjMTYgICAgIDsvLyB0VmFsNyA9IDAwIEwxIDAwIEwyCi0gICAgICAgIE9SUiAgICAgIHRWYWwxMCwgTGVmdDMsICBMZWZ0MiwgIExTTCAjMTYgICAgIDsvLyB0VmFsMTA9IDAwIEwyIDAwIEwzCi0gICAgICAgIE9SUiAgICAgIE91dDAsICAgdFZhbDQsICB0VmFsMSAgICAgICAgICAgICAgIDsvLyBPdXQwICA9IGkyIGkxIGkwIGVMCi0gICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gIGF0IHBEc3QgWzAgIHRvIDMgXSAKLSAgICAgICAgTU9WICAgICAgdFZhbDQsICBPdXQwLCAgIExTTCAjMTYgICAgICAgICAgICAgOy8vIHRWYWw0ID0gaTEgaTAgMDAgMDAKLSAgICAgICAgVUhBREQ4ICAgdFZhbDIsICB0VmFsMiwgIHRWYWw3ICAgICAgICAgICAgICAgOy8vIHRWYWwyID0gMDAgajEgMDAgajIKLSAgICAgICAgVUhBREQ4ICAgdFZhbDYsICB0VmFsMTEsIHRWYWwxMCAgICAgICAgICAgICAgOy8vIHRWYWwxMT0gMDAgajIgMDAgajMKLSAgICAgICAgTVZOICAgICAgdFZhbDEyLCB0VmFsMTEgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwxMj0gMDAgTDAnMDAgTDEnCi0gICAgICAgIE1WTiAgICAgIHRWYWwxNCwgdFZhbDcgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMTQ9IDAwIEwxJzAwIEwyJwotICAgICAgICBVSFNVQjggICB0VmFsMiwgIHRWYWwyLCAgdFZhbDEyICAgICAgICAgICAgICA7Ly8gdFZhbDIgPSAwMCBrMSAwMCBrMgotICAgICAgICBVSFNVQjggICB0VmFsOCwgIHRWYWw3LCAgdFZhbDEyICAgICAgICAgICAgICA7Ly8gdFZhbDggPSAwMCBkMSAwMCBkMgotICAgICAgICBVSFNVQjggICB0VmFsMTEsIHRWYWw2LCAgdFZhbDE0ICAgICAgICAgICAgICA7Ly8gdFZhbDExPSAwMCBrMiAwMCBrMwotICAgICAgICBVSFNVQjggICB0VmFsOSwgIHRWYWwxMCwgdFZhbDE0ICAgICAgICAgICAgICA7Ly8gdFZhbDkgPSAwMCBkMiAwMCBkMwotICAgICAgICBVQUREOCAgICB0VmFsMiwgIHRWYWwyLCAgcjB4ODA4MDgwODAgICAgICAgICA7Ly8gdFZhbDIgPSAwMCBsMSAwMCBsMgotICAgICAgICBVQUREOCAgICB0VmFsOCwgIHRWYWw4LCAgcjB4ODA4MDgwODAgICAgICAgICA7Ly8gdFZhbDggPSAwMCBlMSAwMCBlMgotICAgICAgICBVQUREOCAgICB0VmFsMTEsIHRWYWwxMSwgcjB4ODA4MDgwODAgICAgICAgICA7Ly8gdFZhbDExPSAwMCBsMiAwMCBsMwotICAgICAgICBVQUREOCAgICB0VmFsOSwgIHRWYWw5LCAgcjB4ODA4MDgwODAgICAgICAgICA7Ly8gdFZhbDkgPSAwMCBlMiAwMCBlMwotICAgICAgICBPUlIgICAgICBPdXQyLCAgIHRWYWw4LCAgdFZhbDIsICBMU0wgIzggICAgICA7Ly8gT3V0MiAgPSBsMSBlMSBsMiBlMgotICAgICAgICBPUlIgICAgICBPdXQzLCAgIHRWYWw5LCAgdFZhbDExLCBMU0wgIzggICAgICA7Ly8gT3V0MyAgPSBsMiBlMiBsMyBlMwotICAgICAgICBQS0hUQiAgICBPdXQxLCAgIHRWYWw0LCAgT3V0MiwgICBBU1IgIzE2ICAgICA7Ly8gT3V0MSAgPSBpMSBpMCBsMSBlMQotICAgICAgICBNX1NUUiAgICBPdXQxLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDF9ICBhdCBwRHN0IFs0ICB0byA3IF0KLSAgICAgICAgTV9TVFIgICAgT3V0MiwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQyfSAgYXQgcERzdCBbOCAgdG8gMTFdCi0gICAgICAgIFNUUiAgICAgIE91dDMsICAgW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0M30gIGF0IHBEc3QgWzEyIHRvIDE1XQotICAgICAgICBNT1YgICAgICByZXR1cm4sICAjT01YX1N0c19Ob0VycgotICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKLSAgICAgICAgCi1PTVhfVkNfNHg0X1ZMCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MwotICAgICAgICAKLSAgICAgICAgTERNSUEgICAgcFNyY0Fib3ZlLCB7QWJvdmUwMTIzLCBBYm92ZTQ1Njd9ICAgOy8vIEFib3ZlMDEyMywgQWJvdmU0NTY3ID0gcFNyY0Fib3ZlWzAgdG8gN10KLSAgICAgICAgVFNUICAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX1VQUEVSX1JJR0hUCi0gICAgICAgIExEUiAgICAgIHIweDgwODA4MDgwLCAgPUFERF9DT05TVDEgICAgICAgICAgIDsvLyAweDgwODA4MDgwCi0gICAgICAgIExEUiAgICAgIHIweDAxMDEwMTAxLCAgPU1VTF9DT05TVDAgICAgICAgICAgIDsvLyAweDAxMDEwMTAxCi0gICAgICAgIE1PViAgICAgIHRWYWwxMSwgQWJvdmUwMTIzLCAgTFNSICMyNCAgICAgICAgIDsvLyB0VmFsMTE9IDAwIDAwIDAwIFUzCi0gICAgICAgIE1VTEVRICAgIEFib3ZlNDU2NywgdFZhbDExLCByMHgwMTAxMDEwMSAgICAgIDsvLyBBYm92ZTQ1NjcgPSBVMyBVMyBVMyBVMwotICAgICAgICBNT1YgICAgICB0VmFsOSwgIEFib3ZlMDEyMywgIExTUiAjOCAgICAgICAgICA7Ly8gdFZhbDkgPSAwMCBVMyBVMiBVMQotICAgICAgICBNVk4gICAgICB0VmFsMTAsIEFib3ZlMDEyMyAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDEwPSBVMydVMidVMSdVMCcKLSAgICAgICAgT1JSICAgICAgdFZhbDIsICB0VmFsOSwgIEFib3ZlNDU2NywgIExTTCAjMjQgOy8vIHRWYWwyID0gVTQgVTMgVTIgVTEKLSAgICAgICAgVUhTVUI4ICAgdFZhbDgsICB0VmFsMiwgIHRWYWwxMCAgICAgICAgICAgICAgOy8vIHRWYWw4ID0gZDQgZDMgZDIgZDEKLSAgICAgICAgVUFERDggICAgT3V0MCwgICB0VmFsOCwgIHIweDgwODA4MDgwICAgICAgICAgOy8vIE91dDAgPSBlNCBlMyBlMiBlMQotICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDB9ICBhdCBwRHN0IFswICB0byAzIF0KLSAgICAgICAgTU9WICAgICAgdFZhbDksICB0VmFsOSwgIExTUiAjOCAgICAgICAgICAgICAgOy8vIHRWYWw5ID0gMDAgMDAgVTMgVTIKLSAgICAgICAgTU9WICAgICAgdFZhbDEwLCBBYm92ZTQ1NjcsICBMU0wgIzggICAgICAgICAgOy8vIHRWYWwxMD0gVTYgVTUgVTQgMDAKLSAgICAgICAgUEtIQlQgICAgdFZhbDksICB0VmFsOSwgIEFib3ZlNDU2NywgTFNMICMxNiAgOy8vIHRWYWw5ID0gVTUgVTQgVTMgVTIKLSAgICAgICAgT1JSICAgICAgdFZhbDEwLCB0VmFsMTAsIHRWYWwxMSAgICAgICAgICAgICAgOy8vIHRWYWwxMD0gVTYgVTUgVTQgVTMKLSAgICAgICAgVUhBREQ4ICAgdFZhbDExLCB0VmFsOSwgIEFib3ZlMDEyMyAgICAgICAgICAgOy8vIHRWYWwxMT0gZzUgZzQgZzMgZzIKLSAgICAgICAgVUhBREQ4ICAgdFZhbDE0LCB0VmFsMiwgIHRWYWwxMCAgICAgICAgICAgICAgOy8vIHRWYWwxND0gZzYgZzUgZzQgZzMKLSAgICAgICAgTVZOICAgICAgdFZhbDgsICB0VmFsMiAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWw4ID0gVTQnVTMnVTInVTEnCi0gICAgICAgIE1WTiAgICAgIHRWYWw3LCAgdFZhbDkgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsNyA9IFU1J1U0J1UzJ1UyJwotICAgICAgICBVSFNVQjggICB0VmFsMTIsIHRWYWw5LCAgdFZhbDggICAgICAgICAgICAgICA7Ly8gdFZhbDEyPSBkNSBkNCBkMyBkMgotICAgICAgICBVSFNVQjggICB0VmFsMTEsIHRWYWwxMSwgdFZhbDggICAgICAgICAgICAgICA7Ly8gdFZhbDExPSBoNSBoNCBoMyBoMgotICAgICAgICBVSFNVQjggICB0VmFsMiwgIHRWYWwxNCwgdFZhbDcgICAgICAgICAgICAgICA7Ly8gdFZhbDIgPSBoNiBoNSBoNCBoMwotICAgICAgICBVQUREOCAgICBPdXQxLCAgIHRWYWwxMSwgcjB4ODA4MDgwODAgICAgICAgICA7Ly8gT3V0MSAgPSBpNSBpNCBpMyBpMgotICAgICAgICBVQUREOCAgICBPdXQyLCAgIHRWYWwxMiwgcjB4ODA4MDgwODAgICAgICAgICA7Ly8gT3V0MiAgPSBlNSBlNCBlMyBlMgotICAgICAgICBVQUREOCAgICBPdXQzLCAgIHRWYWwyLCAgcjB4ODA4MDgwODAgICAgICAgICA7Ly8gT3V0MyAgPSBpNiBpNSBpNCBpMwotICAgICAgICBNX1NUUiAgICBPdXQxLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDF9IGF0IHBEc3QgWzQgIHRvIDcgXQotICAgICAgICBNX1NUUiAgICBPdXQyLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDJ9IGF0IHBEc3QgWzggIHRvIDExXQotICAgICAgICBNX1NUUiAgICBPdXQzLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDN9IGF0IHBEc3QgWzEyIHRvIDE1XQotICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0gICAgICAgIE1fRVhJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBNYWNybyB0byBleGl0IG1pZHdheS1icmVhayBmcm0gY2FzZQotICAgICAgICAKLU9NWF9WQ180eDRfSFUKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0yCi0gICAgICAgIAotICAgICAgICBMRFIgICAgICByMHgwMTAxMDEwMSwgID1NVUxfQ09OU1QwICAgICAgICAgICA7Ly8gMHgwMTAxMDEwMQotICAgICAgICBNX0xEUkIgICBMZWZ0MCwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDAgPSBwU3JjTGVmdFswXQotICAgICAgICBNX0xEUkIgICBMZWZ0MSwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDEgPSBwU3JjTGVmdFsxXQotICAgICAgICBNX0xEUkIgICBMZWZ0MiwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDIgPSBwU3JjTGVmdFsyXQotICAgICAgICBMRFJCICAgICBMZWZ0MywgIFtwU3JjTGVmdF0gICAgICAgICAgICAgICAgICA7Ly8gTGVmdDMgPSBwU3JjTGVmdFszXQotICAgICAgICBNT1YgICAgICByMHg4MDgwODA4MCwgIHIweDAxMDEwMTAxLCBMU0wgIzcgICA7Ly8gMHg4MDgwODA4MAotICAgICAgICBPUlIgICAgICB0VmFsNiwgIExlZnQwLCAgTGVmdDEsICBMU0wgIzE2ICAgICA7Ly8gdFZhbDYgPSAwMCBMMSAwMCBMMAotICAgICAgICBPUlIgICAgICB0VmFsNywgIExlZnQxLCAgTGVmdDIsICBMU0wgIzE2ICAgICA7Ly8gdFZhbDcgPSAwMCBMMiAwMCBMMQotICAgICAgICBPUlIgICAgICB0VmFsMTEsIExlZnQyLCAgTGVmdDMsICBMU0wgIzE2ICAgICA7Ly8gdFZhbDExPSAwMCBMMyAwMCBMMgotICAgICAgICBNVUwgICAgICBPdXQzLCAgIExlZnQzLCAgcjB4MDEwMTAxMDEgICAgICAgICA7Ly8gT3V0MyAgPSBMMyBMMyBMMyBMMwotICAgICAgICBNVk4gICAgICB0VmFsOCwgIHRWYWw3ICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDggPSAwMCBMMicwMCBMMScKLSAgICAgICAgTVZOICAgICAgdFZhbDEwLCB0VmFsMTEgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwxMD0gMDAgTDMnMDAgTDInCi0gICAgICAgIFVIQUREOCAgIHRWYWw0LCAgdFZhbDYsICB0VmFsMTEgICAgICAgICAgICAgIDsvLyB0VmFsNCA9IDAwIGczIDAwIGcyCi0gICAgICAgIFVYVEIxNiAgIHRWYWwxMiwgT3V0MyAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMTI9IDAwIEwzIDAwIEwzCi0gICAgICAgIFVIU1VCOCAgIHRWYWw0LCAgdFZhbDQsICB0VmFsOCAgICAgICAgICAgICAgIDsvLyB0VmFsNCA9IDAwIGgzIDAwIGgyCi0gICAgICAgIFVIU1VCOCAgIHRWYWw2LCAgdFZhbDYsICB0VmFsOCAgICAgICAgICAgICAgIDsvLyB0VmFsNiA9IDAwIGQyIDAwIGQxCi0gICAgICAgIFVIU1VCOCAgIHRWYWwxMSwgdFZhbDExLCB0VmFsOCAgICAgICAgICAgICAgIDsvLyB0VmFsMTE9IDAwIGQzIDAwIGQyCi0gICAgICAgIFVIQUREOCAgIHRWYWwxMiwgdFZhbDEyLCB0VmFsNyAgICAgICAgICAgICAgIDsvLyB0VmFsMTI9IDAwIGc0IDAwIGczCi0gICAgICAgIFVBREQ4ICAgIHRWYWw0LCAgdFZhbDQsICByMHg4MDgwODA4MCAgICAgICAgIDsvLyB0VmFsNCA9IDAwIGkzIDAwIGkyCi0gICAgICAgIFVIU1VCOCAgIHRWYWwxMiwgdFZhbDEyLCB0VmFsMTAgICAgICAgICAgICAgIDsvLyB0VmFsMTI9IDAwIGg0IDAwIGgzCi0gICAgICAgIFVBREQ4ICAgIHRWYWw4LCAgdFZhbDYsICByMHg4MDgwODA4MCAgICAgICAgIDsvLyB0VmFsOCA9IDAwIGUyIDAwIGUxCi0gICAgICAgIFVBREQ4ICAgIHRWYWwxMSwgdFZhbDExLCByMHg4MDgwODA4MCAgICAgICAgIDsvLyB0VmFsMTE9IDAwIGUzIDAwIGUyCi0gICAgICAgIFVBREQ4ICAgIHRWYWwxMiwgdFZhbDEyLCByMHg4MDgwODA4MCAgICAgICAgIDsvLyB0VmFsMTI9IDAwIGk0IDAwIGkzCi0gICAgICAgIE9SUiAgICAgIE91dDAsICAgdFZhbDgsICB0VmFsNCwgIExTTCAjOCAgICAgIDsvLyBPdXQwICA9IGkzIGUyIGkyIGUxCi0gICAgICAgIE9SUiAgICAgIE91dDEsICAgdFZhbDExLCB0VmFsMTIsIExTTCAjOCAgICAgIDsvLyBPdXQxICA9IGk0IGUzIGkzIGUyCi0gICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gIGF0IHBEc3QgWzAgIHRvIDMgXQotICAgICAgICBQS0hUQiAgICBPdXQyLCAgIE91dDMsICAgT3V0MSwgICBBU1IgIzE2ICAgICA7Ly8gT3V0MiAgPSBMMyBMMyBpNCBlMwotICAgICAgICBNX1NUUiAgICBPdXQxLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDF9ICBhdCBwRHN0IFs0ICB0byA3IF0KLSAgICAgICAgTV9TVFIgICAgT3V0MiwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQyfSAgYXQgcERzdCBbOCAgdG8gMTFdCi0gICAgICAgIFNUUiAgICAgIE91dDMsICAgW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0M30gIGF0IHBEc3QgWzEyIHRvIDE1XQotICAgICAgICBNT1YgICAgICByZXR1cm4sICAjT01YX1N0c19Ob0VycgotICAgICAgICBNX0VORAotCi0gICAgICAgIEVORElGIDsvLyBBUk0xMTM2SlMKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBFTkQKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0IGVuZHMKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgzZDdmMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1FQRGl2VGFibGUKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGUKLSAgICAgICAgICAgIAotICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotICAgIAotCi0gICAgSUYgQVJNMTEzNkpTCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wcFNyYyAgICAgICBSTiAwCi1wRHN0ICAgICAgICBSTiAxCi1RUCAgICAgICAgICBSTiAyCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gU2NyYXRjaCB2YXJpYWJsZSBmb3IgVW5wYWNrMngyIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBTcmMgICAgICAgIFJOIDkKLVZhbHVlICAgICAgIFJOIDQKLVZhbHVlMiAgICAgIFJOIDUKLUZsYWcgICAgICAgIFJOIDYKLXN0ck9mZnNldCAgIFJOIDcKLWNzdE9mZnNldCAgIFJOIDgKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBTY3JhdGNoIHZhcmlhYmxlCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcjB3MCAgICAgICAgUk4gIDMKLXIwdzEgICAgICAgIFJOICA0Ci0KLWMwdzAgICAgICAgIFJOICA1Ci1jMXcwICAgICAgICBSTiAgNgotCi1yZXR1cm4gICAgICBSTiAgMAotcFFQRGl2VGFibGUgUk4gIDUKLXBRUE1vZFRhYmxlICAgIFJOICA2Ci1TaGlmdCAgICAgICAgUk4gIDkKLVNjYWxlICAgICAgICBSTiAgMgotCi1UZW1wMSAgICAgICBSTiAgMwotVGVtcDIgICAgICAgUk4gIDQKLVRlbXAzICAgICAgIFJOICA3Ci1UZW1wNCAgICAgICBSTiAgOAotCi0gICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyLCByOQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgcFNyYywgW3BwU3JjXSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHBTcmMKLSAgICAgICAgTU9WICAgICBjc3RPZmZzZXQsICMzMSAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRvIGJlIHVzZWQgaW4gdGhlIGxvb3AsIHRvIGNvbXB1dGUgb2Zmc2V0Ci0gICAgICAgIAotICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICA7Ly8gRmlyc3RseSwgZmlsbCBhbGwgdGhlIGNvZWZmaWNpZW50IHZhbHVlcyBvbiB0aGUgPHBEc3Q+IGJ1ZmZlciBieSB6ZXJvCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICBWYWx1ZSwgICMwICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSW5pdGlhbGl6ZSB0aGUgemVybyB2YWx1ZQotICAgICAgICBNT1YgICAgICBWYWx1ZTIsICAjMCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSW5pdGlhbGl6ZSB0aGUgemVybyB2YWx1ZQotICAgICAgICBMRFJCICAgICBGbGFnLCAgW3BTcmNdLCAjMSAgICAgICAgICAgICAgICAgICA7Ly8gUHJlbG9hZCA8RmxhZz4gYmVmb3JlIDx1bnBhY2tMb29wPgotICAgICAgICBTVFJEICAgICBWYWx1ZSwgW3BEc3QsICMwXSAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFswXSAgPSBwRHN0WzFdICA9IHBEc3RbMl0gID0gcERzdFszXSAgPSAwCi0gICAgICAgIAotCi11bnBhY2tMb29wCi0gICAgICAgIFRTVCAgICAgIEZsYWcsICAjMHgxMCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDb21wdXRpbmcgKEZsYWcgJiAweDEwKQotICAgICAgICBMRFJTQk5FICBWYWx1ZTIsW3BTcmMsIzFdICAgICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkJORSAgIFZhbHVlLCBbcFNyY10sICMyICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIGJ5dGUgd2lzZSB0byBhdm9pZCB1bmFsaWduZWQgYWNjZXNzCi0gICAgICAgIEFORCAgICAgIHN0ck9mZnNldCwgY3N0T2Zmc2V0LCBGbGFnLCBMU0wgIzEgIDsvLyBzdHJPZmZzZXQgPSAoRmxhZyAmIDE1KSA8IDE7Ci0gICAgICAgIExEUlNCRVEgIFZhbHVlLCBbcFNyY10sICMxICAgICAgICAgICAgICAgICAgIDsvLyBWYWx1ZSA9IChPTVhfVTgpICAqcFNyYysrCi0gICAgICAgIE9SUk5FICAgIFZhbHVlLFZhbHVlLFZhbHVlMiwgTFNMICM4ICAgICAgICAgIDsvLyBWYWx1ZSA9IChPTVhfVTE2KSAqcFNyYysrCi0gICAgICAgIAotICAgICAgICBUU1QgICAgICBGbGFnLCAgIzB4MjAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ29tcHV0aW5nIChGbGFnICYgMHgyMCkgdG8gY2hlY2ssIGlmIHdlJ3JlIGRvbmUKLSAgICAgICAgTERSQkVRICAgRmxhZywgIFtwU3JjXSwgIzEgICAgICAgICAgICAgICAgICAgOy8vIEZsYWcgID0gKE9NWF9VOCkgKnBTcmMrKywgZm9yIG5leHQgaXRlcmF0aW9uCi0gICAgICAgIFNUUkggICAgIFZhbHVlLCBbcERzdCwgc3RyT2Zmc2V0XSAgICAgICAgICAgIDsvLyBTdG9yZSA8VmFsdWU+IGF0IG9mZnNldCA8c3RyT2Zmc2V0PgotICAgICAgICBCRVEgICAgICB1bnBhY2tMb29wICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIHRoZSBsb29wIGJlZ2lubmluZwotICAgICAgICAKLSAgICAgICAgTERNSUEgICAgcERzdCwge3IwdzAsIHIwdzF9ICAgICAgICAgICAgICAgICAgOy8vIHIwdzAgPSB8YzF8YzB8ICYgcjB3MSA9IHxjM3xjMnwKLQotCi0gICAgICAgIFNUUiAgICAgIHBTcmMsIFtwcFNyY10gICAgICAgICAgICAgICAgICAgICAgIDsvLyBVcGRhdGUgdGhlIGJpdHN0cmVhbSBwb2ludGVyCi0gICAgICAgIAotICAgICAgICBMRFIgICAgICBwUVBEaXZUYWJsZSwgPWFybVZDTTRQMTBfUVBEaXZUYWJsZSA7Ly8gUVAgRGl2aXNpb24gbG9vay11cC10YWJsZSBiYXNlIHBvaW50ZXIKLSAgICAgICAgTERSICAgICAgcFFQTW9kVGFibGUsID1hcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlIDsvLyBRUCBNb2R1bG8gbG9vay11cC10YWJsZSBiYXNlIHBvaW50ZXIKLSAgICAgICAgCi0gICAgICAgIFNBRERTVUJYIHIwdzAsIHIwdzAsICByMHcwICAgICAgICAgICAgICAgICAgIDsvLyBbIGMwMCtjMDEsIGMwMC1jMDEgXQotICAgICAgICBTQUREU1VCWCByMHcxLCByMHcxLCAgcjB3MSAgICAgICAgICAgICAgICAgICA7Ly8gWyBjMTArYzExLCBjMTAtYzExIF0KLSAgICAgICAgCi0gICAgICAgIExEUlNCICAgIFNoaWZ0LCBbcFFQRGl2VGFibGUsIFFQXSAgICAgICAgICAgIDsvLyBTaGlmdCA9IHBRUERpdlRhYmxlW1FQXQotICAgICAgICBMRFJTQiAgICBTY2FsZSwgW3BRUE1vZFRhYmxlLCBRUF0gICAgICAgICAgICA7Ly8gU2NhbGUgPSBwUVBNb2RUYWJsZVtRUF0KLSAgICAgICAgCi0gICAgICAgIFNBREQxNiAgIGMwdzAsIHIwdzAsIHIwdzEgICAgICAgICAgICAgICAgICAgIDsvLyBbIGQwMCtkMTAsIGQwMStkMTEgXQotICAgICAgICBTU1VCMTYgICBjMXcwLCByMHcwLCByMHcxICAgICAgICAgICAgICAgICAgICA7Ly8gWyBkMDAtZDEwLCBkMDEtZDExIF0KLSAgICAgICAgCi0gICAgICAgIExTTCAgICAgIFNjYWxlLCBTY2FsZSwgU2hpZnQgICAgICAgICAgICAgICAgIDsvLyBTY2FsZSA9IFNjYWxlIDw8IFNoaWZ0Ci0gICAgICAgIAotICAgICAgICBTTVVMVEIgICBUZW1wMiwgYzB3MCwgIFNjYWxlICAgICAgICAgICAgICAgICA7Ly8gVGVtcDIgPSBUKGMwdzApICogU2NhbGUKLSAgICAgICAgU01VTFRCICAgVGVtcDQsIGMxdzAsICBTY2FsZSAgICAgICAgICAgICAgICAgOy8vIFRlbXA0ID0gVChjMXcwKSAqIFNjYWxlCi0gICAgICAgIFNNVUxCQiAgIFRlbXAxLCBjMHcwLCAgU2NhbGUgICAgICAgICAgICAgICAgIDsvLyBUZW1wMSA9IEIoYzB3MCkgKiBTY2FsZQotICAgICAgICBTTVVMQkIgICBUZW1wMywgYzF3MCwgIFNjYWxlICAgICAgICAgICAgICAgICA7Ly8gVGVtcDMgPSBCKGMxdzApICogU2NhbGUKLSAgICAgICAgTU9WICAgICAgVGVtcDIsIFRlbXAyLCBBU1IgIzEgICAgICAgICAgICAgICAgOy8vIFRlbXAyID0gVGVtcDIgPj4gMSAmIFRlbXAxID0gKFRlbXAxID4+IDEpIDw8IDE2Ci0gICAgICAgIE1PViAgICAgIFRlbXA0LCBUZW1wNCwgQVNSICMxICAgICAgICAgICAgICAgIDsvLyBUZW1wNCA9IFRlbXA0ID4+IDEgJiBUZW1wMyA9IChUZW1wMyA+PiAxKSA8PCAxNgotICAgICAgICBQS0hCVCAgICBjMHcwLCAgVGVtcDIsIFRlbXAxLCBMU0wgIzE1ICAgICAgICA7Ly8gYzB3MCAgPSB8IFRlbXAxIHwgVGVtcDIgfAotICAgICAgICBQS0hCVCAgICBjMXcwLCAgVGVtcDQsIFRlbXAzLCBMU0wgIzE1ICAgICAgICA7Ly8gYzF3MCAgPSB8IFRlbXAzIHwgVGVtcDQgfAotICAgICAgICBTVE1JQSAgICBwRHN0LCB7YzB3MCwgYzF3MH0gICAgICAgICAgICAgICAgICA7Ly8gU3RvcmluZyBhbGwgdGhlIGNvZWZmaWNpZW50cyBhdCBvbmNlCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgTV9FTkQKLSAgICAgICAgCi0gICAgRU5ESUYgOy8vIEFSTTExMzZKUwotICAgIAotICAgIAotICAgIAotICAgIAotICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk3NGNkMS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MucworKysgL2Rldi9udWxsCkBAIC0xLDQ4MyArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXJfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgOTY0MQotOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLTsvLyBEZXNjcmlwdGlvbjoKLTsvLyBILjI2NCBpbnZlcnNlIHF1YW50aXplIGFuZCB0cmFuc2Zvcm0gbW9kdWxlCi07Ly8gCi07Ly8gCi0KLTsvLyBJbmNsdWRlIHN0YW5kYXJkIGhlYWRlcnMKLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotOy8vIEltcG9ydC9FeHBvcnQgc3ltYm9scyByZXF1aXJlZCBmcm9tL3RvIG90aGVyIGZpbGVzCi07Ly8gKEZvciBleGFtcGxlIHRhYmxlcykKLSAgICAgICAgCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0IAotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9RUERpdlRhYmxlCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlCi0gICAgICAgIAotICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotCi07Ly8gU2V0IGRlYnVnZ2luZyBsZXZlbCAgICAgICAgCi07Ly9ERUJVR19PTiAgICBTRVRMIHtUUlVFfQotCi0KLTsvLyBTdGF0aWMgRnVuY3Rpb246IGFybVZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudEx1bWFEQzR4NAotICAgIAotCi07Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCi0gICAgCi0gICAgSUYgIEFSTTExMzZKUyAKLQotCi07Ly9JbnB1dCBSZWdpc3RlcnMKLXBEYXRhICAgICAgICAgICAgICAgUk4gIDAKLVFQICAgICAgICAgICAgICAgICAgUk4gIDEKLQotOy8vT3V0cHV0IFJlZ2lzdGVycwotCi0KLTsvL0xvY2FsIFNjcmF0Y2ggUmVnaXN0ZXJzCi0KLTsvLyBQYWNrZWQgSW5wdXQgcGl4ZWxzCi1pbjAwICAgICAgICAgICAgICAgIFJOICAyICAgICAgICAgICAgICAgICAgIDsvLyBTcmNbMF0gJiBTcmNbMV0gCi1pbjAyICAgICAgICAgICAgICAgIFJOICAzICAgICAgICAgICAgICAgICAgIDsvLyBTcmNbMl0gJiBTcmNbM10KLWluMTAgICAgICAgICAgICAgICAgUk4gIDQgICAgICAgICAgICAgICAgICAgOy8vIFNyY1s0XSAmIFNyY1s1XQotaW4xMiAgICAgICAgICAgICAgICBSTiAgNSAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzZdICYgU3JjWzddCi1pbjIwICAgICAgICAgICAgICAgIFJOICA2ICAgICAgICAgICAgICAgICAgIDsvLyBTcmNbOF0gJiBTcmNbOV0KLWluMjIgICAgICAgICAgICAgICAgUk4gIDcgICAgICAgICAgICAgICAgICAgOy8vIFNyY1sxMF0gJiBTcmNbMTFdCi1pbjMwICAgICAgICAgICAgICAgIFJOICA4ICAgICAgICAgICAgICAgICAgIDsvLyBTcmNbMTJdICYgU3JjWzEzXQotaW4zMiAgICAgICAgICAgICAgICBSTiAgOSAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzE0XSAmIFNyY1sxNV0KLQotOy8vIFRyYW5zcG9zZSBmb3IgUm93IG9wZXJhdGlvbnMgKFJvd3MgdG8gY29scykKLXRyUm93MDAgICAgICAgICAgICAgUk4gIDIKLXRyUm93MTAgICAgICAgICAgICAgUk4gIDEwCi10clJvdzAyICAgICAgICAgICAgIFJOICAzCi10clJvdzEyICAgICAgICAgICAgIFJOICA1Ci10clJvdzIwICAgICAgICAgICAgIFJOICAxMQotdHJSb3czMCAgICAgICAgICAgICBSTiAgMTIKLXRyUm93MzIgICAgICAgICAgICAgUk4gIDE0Ci10clJvdzIyICAgICAgICAgICAgIFJOICA3Ci0KLTsvLyBJbnRlcm1lZGlhdGUgY2FsY3VsYXRpb25zCi1yb3dTdW0xICAgICAgICAgICAgIFJOICA0Ci1yb3dTdW0yICAgICAgICAgICAgIFJOICA2Ci1yb3dEaWZmMSAgICAgICAgICAgIFJOICA4Ci1yb3dEaWZmMiAgICAgICAgICAgIFJOICA5Ci0KLQotOy8vIFJvdyBvcGVyYXRlZCBwaXhlbHMKLXJvd09wMDAgICAgICAgICAgICAgUk4gIDIKLXJvd09wMTAgICAgICAgICAgICAgUk4gIDEwCi1yb3dPcDIwICAgICAgICAgICAgIFJOICAxMQotcm93T3AzMCAgICAgICAgICAgICBSTiAgMTIKLXJvd09wMDIgICAgICAgICAgICAgUk4gIDMKLXJvd09wMTIgICAgICAgICAgICAgUk4gIDUKLXJvd09wMjIgICAgICAgICAgICAgUk4gIDcKLXJvd09wMzIgICAgICAgICAgICAgUk4gIDE0Ci0KLTsvLyBUcmFuc3Bvc2UgZm9yIGNvbHVsbW4gb3BlcmF0aW9ucwotdHJDb2wwMCAgICAgICAgICAgICBSTiAgMiAgICAgICAgICAgICAgICAgICAKLXRyQ29sMDIgICAgICAgICAgICAgUk4gIDMgICAgICAgICAgICAgICAgICAgCi10ckNvbDEwICAgICAgICAgICAgIFJOICA0ICAgICAgICAgICAgICAgICAgIAotdHJDb2wxMiAgICAgICAgICAgICBSTiAgNSAgICAgICAgICAgICAgICAgICAKLXRyQ29sMjAgICAgICAgICAgICAgUk4gIDYgICAgICAgICAgICAgICAgICAgCi10ckNvbDIyICAgICAgICAgICAgIFJOICA3ICAgICAgICAgICAgICAgICAgIAotdHJDb2wzMCAgICAgICAgICAgICBSTiAgOCAgICAgICAgICAgICAgICAgICAKLXRyQ29sMzIgICAgICAgICAgICAgUk4gIDkgIAotCi07Ly8gSW50ZXJtZWRpYXRlIGNhbGN1bGF0aW9ucwotY29sU3VtMSAgICAgICAgICAgICBSTiAgMTAKLWNvbFN1bTIgICAgICAgICAgICAgUk4gIDExCi1jb2xEaWZmMSAgICAgICAgICAgIFJOICAxMgotY29sRGlmZjIgICAgICAgICAgICBSTiAgMTQKLQotCi07Ly8gQ29sb3VtbiBvcGVyYXRlZCBwaXhlbHMKLWNvbE9wMDAgICAgICAgICAgICAgUk4gIDIgICAgICAgICAgICAgICAgICAgCi1jb2xPcDAyICAgICAgICAgICAgIFJOICAzICAgICAgICAgICAgICAgICAgIAotY29sT3AxMCAgICAgICAgICAgICBSTiAgNCAgICAgICAgICAgICAgICAgICAKLWNvbE9wMTIgICAgICAgICAgICAgUk4gIDUgICAgICAgICAgICAgICAgICAgCi1jb2xPcDIwICAgICAgICAgICAgIFJOICA2ICAgICAgICAgICAgICAgICAgIAotY29sT3AyMiAgICAgICAgICAgICBSTiAgNyAgICAgICAgICAgICAgICAgICAKLWNvbE9wMzAgICAgICAgICAgICAgUk4gIDggICAgICAgICAgICAgICAgICAgCi1jb2xPcDMyICAgICAgICAgICAgIFJOICA5ICAKLQotOy8vIFRlbXBvcmFyeSBzY3JhdGNoIHZhcmFpYmxlcwotcFFQRGl2VGFibGUgICAgICAgICBSTiAgMAotcFFQTW9kVGFibGUgICAgICAgICBSTiAgMTEKLVNoaWZ0ICAgICAgICAgICAgICAgUk4gIDEwCi1TY2FsZSAgICAgICAgICAgICAgIFJOICAxNAotUm91bmQgICAgICAgICAgICAgICBSTiAgMAotCi10ZW1wMSAgICAgICAgICAgICAgIFJOICAxMAotdGVtcDIgICAgICAgICAgICAgICAgUk4gIDExCi10ZW1wMyAgICAgICAgICAgICAgIFJOICAxMgotdGVtcDQgICAgICAgICAgICAgICBSTiAgMQotCi0KLQotOy8vIEludlRyYW5zZm9ybWVkIGFuZCBEZXF1YW50aXplZCBwaXhlbHMKLW91dDAwICAgICAgICAgICAgICAgUk4gIDIgICAgICAgICAgICAgICAgICAgCi1vdXQwMiAgICAgICAgICAgICAgIFJOICAzICAgICAgICAgICAgICAgICAgIAotb3V0MTAgICAgICAgICAgICAgICBSTiAgNCAgICAgICAgICAgICAgICAgICAKLW91dDEyICAgICAgICAgICAgICAgUk4gIDUgICAgICAgICAgICAgICAgICAgCi1vdXQyMCAgICAgICAgICAgICAgIFJOICA2ICAgICAgICAgICAgICAgICAgIAotb3V0MjIgICAgICAgICAgICAgICBSTiAgNyAgICAgICAgICAgICAgICAgICAKLW91dDMwICAgICAgICAgICAgICAgUk4gIDggICAgICAgICAgICAgICAgICAgCi1vdXQzMiAgICAgICAgICAgICAgIFJOICA5ICAKLSAgICAgIAotICAgICAgICAKLQotICAgICAgIAotICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgcmVxdWlyZWQgYnkgdGhlIGZ1bmN0aW9uCi0gICAgICAgIE1fQUxMT0M0ICAgIHBEYXRhT25TdGFjaywgNAotCi0gICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudEx1bWFEQzR4NCxyMTEKLSAgICAgICAgCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgOy8vIFRoZSBzdHJhdGVneSB1c2VkIGluIGltcGxlbWVudGluZyB0aGUgdHJhbnNmb3JtIGlzIGFzIGZvbGxvd3M6KgotICAgICAgICA7Ly8gTG9hZCB0aGUgNHg0IGJsb2NrIGludG8gOCByZWdpc3RlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAKLSAgICAgICAgOy8vIFRyYW5zcG9zZSB0aGUgNHg0IG1hdHJpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgCi0gICAgICAgIDsvLyBQZXJmb3JtIHRoZSByb3cgb3BlcmF0aW9ucyAob24gY29sdW1ucykgdXNpbmcgU0lNRCAgICAgICAgICAgICogIAotICAgICAgICA7Ly8gVHJhbnNwb3NlIHRoZSA0eDQgcmVzdWx0IG1hdHJpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAKLSAgICAgICAgOy8vIFBlcmZvcm0gdGhlIGNvbG91bW4gb3BlcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAgICA7Ly8gU3RvcmUgdGhlIDR4NCBibG9jayBhdCBvbmUgZ28gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgICAgIDsvLyBMb2FkIGFsbCB0aGUgNHg0IHBpeGVscwotICAgICAgICAKLSAgICAgICAgTERNSUEgICBwRGF0YSx7aW4wMCxpbjAyLGluMTAsaW4xMixpbjIwLGluMjIsaW4zMCxpbjMyfQotICAgICAgICAKLSAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBUcmFuc3Bvc2UgdGhlIG1hdHJpeCBpbm9yZGVyIHRvIHBlcmZvcm0gcm93IG9wcyBhcyBjb2xvdW1uIG9wcwotICAgICAgICA7Ly8gSW5wdXQ6ICAgaW5bXVtdID0gb3JpZ2luYWwgbWF0cml4Ci0gICAgICAgIDsvLyBPdXRwdXQ6ICB0clJvd1tdW109IHRyYW5zcG9zZWQgbWF0cml4Ci0gICAgICAgIDsvLyBTdGVwMTogT2J0YWluIHRoZSBMTCBwYXJ0IG9mIHRoZSB0cmFuc3Bvc2VkIG1hdHJpeAotICAgICAgICA7Ly8gU3RlcDI6IE9idGFpbiB0aGUgSEwgcGFydAotICAgICAgICA7Ly8gc3RlcDM6IE9idGFpbiB0aGUgTEggcGFydAotICAgICAgICA7Ly8gU3RlcDQ6IE9idGFpbiB0aGUgSEggcGFydAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgCi0gICAgICAgIDsvLyBMTCAyeDIgdHJhbnNwb3NlZCBtYXRyaXggCi0gICAgICAgIDsvLyAgIGQwIGQxIC0gLQotICAgICAgICA7Ly8gICBkNCBkNSAtIC0KLSAgICAgICAgOy8vICAgLSAgLSAgLSAtCi0gICAgICAgIDsvLyAgIC0gIC0gIC0gLQotICAgICAgICAKLSAgICAgICAgUEtIVEIgICB0clJvdzEwLGluMTAsaW4wMCxBU1IgIzE2ICAgICAgICAgICAgICAgOy8vIFs1IDRdID0gW2Y1OmYxXSAgICAKLSAgICAgICAgUEtIQlQgICB0clJvdzAwLGluMDAsaW4xMCxMU0wgIzE2ICAgICAgICAgICAgICAgOy8vIFsxIDBdID0gW2Y0OmYwXSAgCi0gICAgICAgIAotICAgICAgICA7Ly8gSEwgMngyIHRyYW5zcG9zZWQgbWF0cml4ICAKLSAgICAgICAgOy8vICAgIC0gICAtICAgLSAtCi0gICAgICAgIDsvLyAgICAtICAgLSAgIC0gLQotICAgICAgICA7Ly8gICAgZDggIGQ5ICAtIC0KLSAgICAgICAgOy8vICAgZDEyIGQxMyAgLSAtCi0gICAgICAgIAotICAgICAgICAgCi0gICAgICAgICBQS0hUQiAgIHRyUm93MzAsaW4xMixpbjAyLEFTUiAjMTYgICAgICAgICAgICAgIDsvLyBbMTMgMTJdID0gWzcgM10KLSAgICAgICAgIFBLSEJUICAgdHJSb3cyMCxpbjAyLGluMTIsTFNMICMxNiAgICAgICAgICAgICAgOy8vIFs5IDhdID0gWzYgMl0gCi0gICAgICAgIAotICAgICAgICA7Ly8gTEggMngyIHRyYW5zcG9zZWQgbWF0cml4IAotICAgICAgICA7Ly8gICAtIC0gZDIgZDMgCi0gICAgICAgIDsvLyAgIC0gLSBkNiBkNyAKLSAgICAgICAgOy8vICAgLSAtIC0gIC0KLSAgICAgICAgOy8vICAgLSAtIC0gIC0KLSAgICAgICAgCi0gICAgICAgIFBLSEJUICAgdHJSb3cwMixpbjIwLGluMzAsTFNMICMxNiAgICAgICAgICAgICAgIDsvLyBbMyAyXSA9IFtmMTI6ZjhdICAKLSAgICAgICAgUEtIVEIgICB0clJvdzEyLGluMzAsaW4yMCxBU1IgIzE2ICAgICAgICAgICAgICAgOy8vIFs3IDZdID0gW2YxMzpmOV0gCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAKLSAgICAgICAgOy8vIEhIIDJ4MiB0cmFuc3Bvc2VkIG1hdHJpeCAgCi0gICAgICAgIDsvLyAgICAtIC0gICAtICAgLQotICAgICAgICA7Ly8gICAgLSAtICAgLSAgIC0KLSAgICAgICAgOy8vICAgIC0gLSAgZDEwIGQxMQotICAgICAgICA7Ly8gICAgLSAtICBkMTQgZDE1Ci0gICAgICAgIAotICAgICAgICBQS0hUQiAgIHRyUm93MzIsaW4zMixpbjIyLEFTUiAjMTYgICAgICAgICAgICAgICA7Ly8gWzE1IDE0XSA9IFsxNSAxMV0KLSAgICAgICAgUEtIQlQgICB0clJvdzIyLGluMjIsaW4zMixMU0wgIzE2ICAgICAgICAgICAgICAgOy8vIFsxMSAxMF0gPSBbMTQgMTBdCi0gICAgICAgCi0gICAgICAgIAotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAgICAgICAgOy8vIFJvdyBPcGVyYXRpb25zIChQZXJmb3JtZWQgb24gY29sdW1ucykKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIFNJTUQgb3BlcmF0aW9ucyBvbiBmaXJzdCB0d28gY29sdW1ucyh0d28gcm93cyBvZiB0aGUgb3JpZ2luYWwgbWF0cml4KQotICAgICAgICAKLSAgICAgICAgU0FERDE2ICAgICAgcm93U3VtMSx0clJvdzAwLHRyUm93MTAgICAgICAgICAgICAgICAgOy8vIChjMCtjMSkKLSAgICAgICAgU0FERDE2ICAgICAgcm93U3VtMix0clJvdzIwLHRyUm93MzAgICAgICAgICAgICAgICAgOy8vIChjMitjMykKLSAgICAgICAgU1NVQjE2ICAgICAgcm93RGlmZjEsdHJSb3cwMCx0clJvdzEwICAgICAgICAgICAgICAgOy8vIChjMC1jMSkKLSAgICAgICAgU1NVQjE2ICAgICAgcm93RGlmZjIsdHJSb3cyMCx0clJvdzMwICAgICAgICAgICAgICAgOy8vIChjMi1jMykKLSAgICAgICAgU0FERDE2ICAgICAgcm93T3AwMCxyb3dTdW0xLHJvd1N1bTIgICAgICAgICAgICAgICAgOy8vIChjMCtjMStjMitjMykKLSAgICAgICAgU1NVQjE2ICAgICAgcm93T3AxMCxyb3dTdW0xLHJvd1N1bTIgICAgICAgICAgICAgICAgOy8vIChjMCtjMS1jMi1jMykKLSAgICAgICAgU1NVQjE2ICAgICAgcm93T3AyMCxyb3dEaWZmMSxyb3dEaWZmMiAgICAgICAgICAgICAgOy8vIChjMC1jMS1jMitjMykKLSAgICAgICAgU0FERDE2ICAgICAgcm93T3AzMCxyb3dEaWZmMSxyb3dEaWZmMiAgICAgICAgICAgICAgOy8vIChjMC1jMStjMi1jMykKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBTSU1EIG9wZXJhdGlvbnMgb24gbmV4dCB0d28gY29sdW1ucyhuZXh0IHR3byByb3dzIG9mIHRoZSBvcmlnaW5hbCBtYXRyaXgpCi0gICAgICAgIAotICAgICAgICBTQUREMTYgICAgICByb3dTdW0xLHRyUm93MDIsdHJSb3cxMiAgICAgICAgICAgICAgICA7Ly8gKGMwK2MxKQotICAgICAgICBTQUREMTYgICAgICByb3dTdW0yLHRyUm93MjIsdHJSb3czMiAgICAgICAgICAgICAgICA7Ly8gKGMyK2MzKQotICAgICAgICBTU1VCMTYgICAgICByb3dEaWZmMSx0clJvdzAyLHRyUm93MTIgICAgICAgICAgICAgICA7Ly8gKGMwLWMxKQotICAgICAgICBTU1VCMTYgICAgICByb3dEaWZmMix0clJvdzIyLHRyUm93MzIgICAgICAgICAgICAgICA7Ly8gKGMyLWMzKQotICAgICAgICBTQUREMTYgICAgICByb3dPcDAyLHJvd1N1bTEscm93U3VtMiAgICAgICAgICAgICAgICA7Ly8gKGMwK2MxK2MyK2MzKQotICAgICAgICBTU1VCMTYgICAgICByb3dPcDEyLHJvd1N1bTEscm93U3VtMiAgICAgICAgICAgICAgICA7Ly8gKGMwK2MxLWMyLWMzKQotICAgICAgICBTU1VCMTYgICAgICByb3dPcDIyLHJvd0RpZmYxLHJvd0RpZmYyICAgICAgICAgICAgICA7Ly8gKGMwLWMxLWMyK2MzKQotICAgICAgICBTQUREMTYgICAgICByb3dPcDMyLHJvd0RpZmYxLHJvd0RpZmYyICAgICAgICAgICAgICA7Ly8gKGMwLWMxK2MyLWMzKQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgOy8vIFRyYW5zcG9zZSB0aGUgcmVzdWx0YW50IG1hdHJpeAotICAgICAgICA7Ly8gSW5wdXQ6ICByb3dPcFtdW10KLSAgICAgICAgOy8vIE91dHB1dDogdHJDb2xbXVtdIAotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgCi0gICAgICAgIDsvLyBMTCAyeDIgdHJhbnNwb3NlZCBtYXRyaXggCi0gICAgICAgIDsvLyAgIGQwIGQxIC0gLQotICAgICAgICA7Ly8gICBkNCBkNSAtIC0KLSAgICAgICAgOy8vICAgLSAgLSAgLSAtCi0gICAgICAgIDsvLyAgIC0gIC0gIC0gLQotICAgICAgICAKLSAgICAgICAgUEtIVEIgICB0ckNvbDEwLHJvd09wMTAscm93T3AwMCxBU1IgIzE2ICAgICAgICAgICA7Ly8gWzUgNF0gPSBbZjU6ZjFdCi0gICAgICAgIFBLSEJUICAgdHJDb2wwMCxyb3dPcDAwLHJvd09wMTAsTFNMICMxNiAgICAgICAgICAgOy8vIFsxIDBdID0gW2Y0OmYwXSAgCi0gICAgICAgIAotICAgICAgICA7Ly8gSEwgMngyIHRyYW5zcG9zZWQgbWF0cml4ICAKLSAgICAgICAgOy8vICAgIC0gICAtICAgLSAtCi0gICAgICAgIDsvLyAgICAtICAgLSAgIC0gLQotICAgICAgICA7Ly8gICAgZDggIGQ5ICAtIC0KLSAgICAgICAgOy8vICAgZDEyIGQxMyAgLSAtCi0gICAgICAgIAotICAgICAgICAgCi0gICAgICAgICBQS0hUQiAgIHRyQ29sMzAscm93T3AxMixyb3dPcDAyLEFTUiAjMTYgICAgICAgICAgOy8vIFsxMyAxMl0gPSBbNyAzXQotICAgICAgICAgUEtIQlQgICB0ckNvbDIwLHJvd09wMDIscm93T3AxMixMU0wgIzE2ICAgICAgICAgIDsvLyBbOSA4XSA9IFs2IDJdIAotICAgICAgICAKLSAgICAgICAgOy8vIExIIDJ4MiB0cmFuc3Bvc2VkIG1hdHJpeCAKLSAgICAgICAgOy8vICAgLSAtIGQyIGQzIAotICAgICAgICA7Ly8gICAtIC0gZDYgZDcgCi0gICAgICAgIDsvLyAgIC0gLSAtICAtCi0gICAgICAgIDsvLyAgIC0gLSAtICAtCi0gICAgICAgIAotICAgICAgICBQS0hCVCAgIHRyQ29sMDIscm93T3AyMCxyb3dPcDMwLExTTCAjMTYgICAgICAgICAgIDsvLyBbMyAyXSA9IFtmMTI6ZjhdICAKLSAgICAgICAgUEtIVEIgICB0ckNvbDEyLHJvd09wMzAscm93T3AyMCxBU1IgIzE2ICAgICAgICAgICA7Ly8gWzcgNl0gPSBbZjEzOmY5XSAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgIAotICAgICAgICA7Ly8gSEggMngyIHRyYW5zcG9zZWQgbWF0cml4ICAKLSAgICAgICAgOy8vICAgIC0gLSAgIC0gICAtCi0gICAgICAgIDsvLyAgICAtIC0gICAtICAgLQotICAgICAgICA7Ly8gICAgLSAtICBkMTAgZDExCi0gICAgICAgIDsvLyAgICAtIC0gIGQxNCBkMTUKLSAgICAgICAgCi0gICAgICAgIFBLSFRCICAgdHJDb2wzMixyb3dPcDMyLHJvd09wMjIsQVNSICMxNiAgICAgICAgICAgIDsvLyBbMTUgMTRdID0gWzE1IDExXQotICAgICAgICBQS0hCVCAgIHRyQ29sMjIscm93T3AyMixyb3dPcDMyLExTTCAjMTYgICAgICAgICAgICA7Ly8gWzExIDEwXSA9IFsxNCAxMF0KLSAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICAgICAgICA7Ly8gQ29sb3VtbiBPcGVyYXRpb25zIAotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAgICAgICAgCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIDsvLyBTdG9yZSBwRGF0YShSTjApIG9uIHN0YWNrIGFuZCByZXN0b3JlIGl0IG9ubHkgYXQgdGhlIGZpbmFsIHN0b3JlIGJhY2sKLSAgICAgICAgOy8vIFRoaXMgZnJlZXMgdXAgYSByZWdpc3RlciAoUk4wKSB3aGljaCBpcyB1c2VkIHRvIHJlZHVjZSBudW1iZXIgb2YgaW50ZXJtZWRpYXRlIHN0YWxscyAKLSAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgTV9TVFIgICAgICAgcERhdGEscERhdGFPblN0YWNrCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIFNJTUQgb3BlcmF0aW9ucyBvbiBmaXJzdCB0d28gY29sdW1ucyh0d28gcm93cyBvZiB0aGUgb3JpZ2luYWwgbWF0cml4KQotICAgICAgICAgICAgICAgIAotICAgICAgICBTQUREMTYgICAgICBjb2xTdW0xLHRyQ29sMDAsdHJDb2wxMCAgICAgICAgICAgICAgICA7Ly8gKGMwK2MxKQotICAgICAgICBTQUREMTYgICAgICBjb2xTdW0yLHRyQ29sMjAsdHJDb2wzMCAgICAgICAgICAgICAgICA7Ly8gKGMyK2MzKQotICAgICAgICBTU1VCMTYgICAgICBjb2xEaWZmMSx0ckNvbDAwLHRyQ29sMTAgICAgICAgICAgICAgICA7Ly8gKGMwLWMxKQotICAgICAgICBTU1VCMTYgICAgICBjb2xEaWZmMix0ckNvbDIwLHRyQ29sMzAgICAgICAgICAgICAgICA7Ly8gKGMyLWMzKQotICAgICAgICBTQUREMTYgICAgICBjb2xPcDAwLGNvbFN1bTEsY29sU3VtMiAgICAgICAgICAgICAgICA7Ly8gKGMwK2MxK2MyK2MzKQotICAgICAgICBTU1VCMTYgICAgICBjb2xPcDEwLGNvbFN1bTEsY29sU3VtMiAgICAgICAgICAgICAgICA7Ly8gKGMwK2MxLWMyLWMzKQotICAgICAgICBTU1VCMTYgICAgICBjb2xPcDIwLGNvbERpZmYxLGNvbERpZmYyICAgICAgICAgICAgICA7Ly8gKGMwLWMxLWMyK2MzKQotICAgICAgICBTQUREMTYgICAgICBjb2xPcDMwLGNvbERpZmYxLGNvbERpZmYyICAgICAgICAgICAgICA7Ly8gKGMwLWMxK2MyLWMzKQotICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIFNJTUQgb3BlcmF0aW9ucyBvbiBuZXh0IHR3byBjb2x1bW5zKG5leHQgdHdvIHJvd3Mgb2YgdGhlIG9yaWdpbmFsIG1hdHJpeCkKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIHBRUERpdlRhYmxlLCA9YXJtVkNNNFAxMF9RUERpdlRhYmxlICAgIDsvLyBRUCBEaXZpc2lvbiBsb29rLXVwLXRhYmxlIGJhc2UgcG9pbnRlcgotICAgICAgICBTQUREMTYgICAgICBjb2xTdW0xLHRyQ29sMDIsdHJDb2wxMiAgICAgICAgICAgICAgICA7Ly8gKGMwK2MxKQotICAgICAgICBTQUREMTYgICAgICBjb2xTdW0yLHRyQ29sMjIsdHJDb2wzMiAgICAgICAgICAgICAgICA7Ly8gKGMyK2MzKQotICAgICAgICBTU1VCMTYgICAgICBjb2xEaWZmMSx0ckNvbDAyLHRyQ29sMTIgICAgICAgICAgICAgICA7Ly8gKGMwLWMxKQotICAgICAgICBTU1VCMTYgICAgICBjb2xEaWZmMix0ckNvbDIyLHRyQ29sMzIgICAgICAgICAgICAgICA7Ly8gKGMyLWMzKQotICAgICAgICBTQUREMTYgICAgICBjb2xPcDAyLGNvbFN1bTEsY29sU3VtMiAgICAgICAgICAgICAgICA7Ly8gKGMwK2MxK2MyK2MzKQotICAgICAgICBTU1VCMTYgICAgICBjb2xPcDEyLGNvbFN1bTEsY29sU3VtMiAgICAgICAgICAgICAgICA7Ly8gKGMwK2MxLWMyLWMzKQotICAgICAgICBMRFIgICAgICAgICBwUVBNb2RUYWJsZSwgPWFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGUgOy8vIFFQIE1vZHVsbyBsb29rLXVwLXRhYmxlIGJhc2UgcG9pbnRlcgotICAgICAgICBMRFJTQiAgICAgICBTaGlmdCwgW3BRUERpdlRhYmxlLCBRUF0gICAgICAgICAgICAgICA7Ly8gU2hpZnQgPSBwUVBEaXZUYWJsZVtRUF0KLSAgICAgICAgU1NVQjE2ICAgICAgY29sT3AyMixjb2xEaWZmMSxjb2xEaWZmMiAgICAgICAgICAgICAgOy8vIChjMC1jMS1jMitjMykKLSAgICAgICAgU0FERDE2ICAgICAgY29sT3AzMixjb2xEaWZmMSxjb2xEaWZmMiAgICAgICAgICAgICAgOy8vIChjMC1jMStjMi1jMykKLSAgICAgICAgCi0gICAgICAgICAgICAgICAKLSAgICAgICAgTERSU0IgICAgICAgU2NhbGUsIFtwUVBNb2RUYWJsZSwgUVBdICAgICAgICAgICAgICAgOy8vIFNjYWxlID0gcFFQTW9kVGFibGVbUVBdIAotICAgICAgICAKLSAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIDxEZXF1YW50aXplPiBpbXByb3ZlcyBvbiB0aGUgYy1yZWZlcmVuY2UgY29kZQotICAgICAgICA7Ly8gQm90aCB0aGUgIGNhc2VzIGkuZS4sIFNoaWZ0Pj0wIGFuZCBTaGlmdDwwIGNhc2VzIGFyZSBjb3ZlcmVkIHRvZ2V0aGVyCi0gICAgICAgIDsvLyBXZSBkbyBub3Qgc3VidHJhY3QgMiBmcm9tIFNoaWZ0IGFzIGluIEMgcmVmZXJlbmNlLCBpbnN0ZWFkIHBlcmZvcm0gYQotICAgICAgICA7Ly8gU2NhbGUgPDwgU2hpZnQgb25jZSBpbiB0aGUgYmVnaW5uaW5nIGFuZCBkbyBhIHJpZ2h0IHNoaWZ0IGJ5IGEgCi0gICAgICAgIDsvLyBjb25zdGFudCAyIGFmdGVyIHRoZSBNdWx0aXBsaWNhdGlvbi4gVGhlIHZhbHVlIG9mIFJvdW5kIHdvdWxkIGJlIDIgCi0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vIEJ5IGRvaW5nIHRoaXMgd2UgYXZpb2QgdGhlIEJyYW5jaGVzIHJlcXVpcmVkIGFuZCBhbHNvIAotICAgICAgICA7Ly8gcmVkdWNlIHRoZSBjb2RlIHNpemUgc3Vic3RhbnRpYWxseQotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgICAgIFJvdW5kLCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUm91bmQgPSAyCi0gICAgICAgIExTTCAgICAgICAgIFNjYWxlLCBTY2FsZSwgU2hpZnQgICAgICAgICAgICAgICAgICAgICA7Ly8gU2NhbGUgPSBTY2FsZSA8PCBTaGlmdAotICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIFJvdyAxCi0gICAgICAgIFNNTEFCQiAgdGVtcDEsIGNvbE9wMDAsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDEgPSBCKGMwdzApICogU2NhbGUgKyBSb3VuZAotICAgICAgICBTTUxBQkIgIHRlbXAzLCBjb2xPcDAyLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXAzID0gQihjMXcwKSAqIFNjYWxlICsgUm91bmQKLSAgICAgICAgU01MQVRCICB0ZW1wMiwgY29sT3AwMCwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wMiA9IFQoYzB3MCkgKiBTY2FsZSArIFJvdW5kCi0gICAgICAgIFNNTEFUQiAgdGVtcDQsIGNvbE9wMDIsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDQgPSBUKGMxdzApICogU2NhbGUgKyBSb3VuZAotICAgICAgICAKLSAgICAgICAgQVNSICAgICB0ZW1wMSwgdGVtcDEsICMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBUZW1wMSA9IFRlbXAxID4+IDIKLSAgICAgICAgQVNSICAgICB0ZW1wMywgdGVtcDMsICMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBUZW1wMyA9IFRlbXAzID4+IDIKLSAgICAgICAgUEtIQlQgICBvdXQwMCwgIHRlbXAxLCB0ZW1wMiwgTFNMICMxNCAgICAgICAgICAgICAgIDsvLyBjMHcwICA9IHwgVGVtcDIgfCBUZW1wMSB8Ci0gICAgICAgIFBLSEJUICAgb3V0MDIsICB0ZW1wMywgdGVtcDQsIExTTCAjMTQgICAgICAgICAgICAgICA7Ly8gYzF3MCAgPSB8IFRlbXAyIHwgVGVtcDEgfAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBSb3cgMgotICAgICAgICBTTUxBQkIgIHRlbXAxLCBjb2xPcDEwLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXAxID0gQihjMHcwKSAqIFNjYWxlICsgUm91bmQKLSAgICAgICAgU01MQUJCICB0ZW1wMywgY29sT3AxMiwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wMyA9IEIoYzF3MCkgKiBTY2FsZSArIFJvdW5kCi0gICAgICAgIFNNTEFUQiAgdGVtcDIsIGNvbE9wMTAsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDIgPSBUKGMwdzApICogU2NhbGUgKyBSb3VuZAotICAgICAgICBTTUxBVEIgIHRlbXA0LCBjb2xPcDEyLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXA0ID0gVChjMXcwKSAqIFNjYWxlICsgUm91bmQKLSAgICAgICAgCi0gICAgICAgIEFTUiAgICAgdGVtcDEsIHRlbXAxLCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVGVtcDEgPSBUZW1wMSA+PiAyCi0gICAgICAgIEFTUiAgICAgdGVtcDMsIHRlbXAzLCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVGVtcDMgPSBUZW1wMyA+PiAyCi0gICAgICAgIFBLSEJUICAgb3V0MTAsICB0ZW1wMSwgdGVtcDIsIExTTCAjMTQgICAgICAgICAgICAgICA7Ly8gYzB3MCAgPSB8IFRlbXAyIHwgVGVtcDEgfAotICAgICAgICBQS0hCVCAgIG91dDEyLCAgdGVtcDMsIHRlbXA0LCBMU0wgIzE0ICAgICAgICAgICAgICAgOy8vIGMxdzAgID0gfCBUZW1wMiB8IFRlbXAxIHwKLSAgICAgICAgCi0gICAgICAgIDsvLyBSb3cgMwotICAgICAgICBTTUxBQkIgIHRlbXAxLCBjb2xPcDIwLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXAxID0gQihjMHcwKSAqIFNjYWxlICsgUm91bmQKLSAgICAgICAgU01MQUJCICB0ZW1wMywgY29sT3AyMiwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wMyA9IEIoYzF3MCkgKiBTY2FsZSArIFJvdW5kCi0gICAgICAgIFNNTEFUQiAgdGVtcDIsIGNvbE9wMjAsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDIgPSBUKGMwdzApICogU2NhbGUgKyBSb3VuZAotICAgICAgICBTTUxBVEIgIHRlbXA0LCBjb2xPcDIyLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXA0ID0gVChjMXcwKSAqIFNjYWxlICsgUm91bmQKLSAgICAgICAgCi0gICAgICAgIEFTUiAgICAgdGVtcDEsIHRlbXAxLCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVGVtcDEgPSBUZW1wMSA+PiAyIAotICAgICAgICBBU1IgICAgIHRlbXAzLCB0ZW1wMywgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRlbXAzID0gVGVtcDMgPj4gMgotICAgICAgICBQS0hCVCAgIG91dDIwLCAgdGVtcDEsIHRlbXAyLCBMU0wgIzE0ICAgICAgICAgICAgICAgOy8vIGMwdzAgID0gfCBUZW1wMiB8IFRlbXAxIHwKLSAgICAgICAgUEtIQlQgICBvdXQyMiwgIHRlbXAzLCB0ZW1wNCwgTFNMICMxNCAgICAgICAgICAgICAgIDsvLyBjMXcwICA9IHwgVGVtcDIgfCBUZW1wMSB8Ci0gICAgICAgIAotICAgICAgICA7Ly8gUm93IDQKLSAgICAgICAgU01MQUJCICB0ZW1wMSwgY29sT3AzMCwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wMSA9IEIoYzB3MCkgKiBTY2FsZSArIFJvdW5kCi0gICAgICAgIFNNTEFCQiAgdGVtcDMsIGNvbE9wMzIsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDMgPSBCKGMxdzApICogU2NhbGUgKyBSb3VuZAotICAgICAgICBTTUxBVEIgIHRlbXAyLCBjb2xPcDMwLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXAyID0gVChjMHcwKSAqIFNjYWxlICsgUm91bmQKLSAgICAgICAgU01MQVRCICB0ZW1wNCwgY29sT3AzMiwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wNCA9IFQoYzF3MCkgKiBTY2FsZSArIFJvdW5kCi0gICAgICAgIAotICAgICAgICBNX0xEUiAgIHBEYXRhLHBEYXRhT25TdGFjayAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFJlc3RvcmUgcERhdGEgcG9pbnRlciBmcm9tIHN0YWNrCi0gICAgICAgIEFTUiAgICAgdGVtcDEsIHRlbXAxLCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVGVtcDEgPSBUZW1wMSA+PiAyCi0gICAgICAgIEFTUiAgICAgdGVtcDMsIHRlbXAzLCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVGVtcDMgPSBUZW1wMyA+PiAyCi0gICAgICAgIFBLSEJUICAgb3V0MzAsICB0ZW1wMSwgdGVtcDIsIExTTCAjMTQgICAgICAgICAgICAgICA7Ly8gYzB3MCAgPSB8IFRlbXAyIHwgVGVtcDEgfAotICAgICAgICBQS0hCVCAgIG91dDMyLCAgdGVtcDMsIHRlbXA0LCBMU0wgIzE0ICAgICAgICAgICAgICAgOy8vIGMxdzAgID0gfCBUZW1wMiB8IFRlbXAxIHwKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICA7Ly8gU3RvcmUgYWxsIHRoZSA0eDQgcGl4ZWxzCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotc3RvcmVfY29lZmYKLSAgICAgICAgCi0gICAgICAgIFNUTUlBICAgcERhdGEse291dDAwLG91dDAyLG91dDEwLG91dDEyLG91dDIwLG91dDIyLG91dDMwLG91dDMyfQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAKLSAgICAgICAgOy8vIFNldCByZXR1cm4gdmFsdWUKLSAgICAgICAgCi0gICAgICAgCi0gICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiB0YWlsCi0gICAgICAgIE1fRU5EICAgICAgICAKLSAgICAgICAgCi0gICAgRU5ESUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL0FSTTExMzZKUyAgICAgICAgCi0gICAgCi0KLTsvLyBTdGF0aWMgRnVuY3Rpb246IGFybVZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudEx1bWFEQzR4NAotCi07Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCi0gICAgCi0gICAgICAgIAotCi0KLTsvLyBGdW5jdGlvbjogb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIKLSAgICAKLTsvL0lucHV0IFJlZ2lzdGVycwotcHBTcmMgICAgICAgICAgICAgICBSTiAgMAotcERzdCAgICAgICAgICAgICAgICBSTiAgMQotUVBSMiAgICAgICAgICAgICAgICBSTiAgMgotCi07Ly9PdXRwdXQgUmVnaXN0ZXJzCi1yZXN1bHQgICAgICAgICAgICAgIFJOICAwCi0KLTsvL0xvY2FsIFNjcmF0Y2ggUmVnaXN0ZXJzCi1wRHN0UjQgICAgICAgICAgICAgIFJOICA0Ci1wRHN0UjAgICAgICAgICAgICAgIFJOICAwCi1RUFIxICAgICAgICAgICAgICAgIFJOICAxCi1RUFI1ICAgICAgICAgICAgICAgIFJOICA1Ci0KLTsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKLSAgICAKLSAgICBJRiBBUk0xMTM2SlMKLSAgICAgICAKLSAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHJlcXVpcmVkIGJ5IHRoZSBmdW5jdGlvbgotICAgICAgICAKLQotICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcixyNQotICAgICAgICAKLSAgICAgICAgTU9WICAgICBwRHN0UjQscERzdCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2F2aW5nIHJlZ2lzdGVyIHIxCi0gICAgICAgIE1PViAgICAgUVBSNSxRUFIyICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNhdmluZyByZWdpc3RlciByMgotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgcERzdFIwLHBEc3RSNCAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldHRpbmcgdXAgcmVnaXN0ZXIgcjAKLSAgICAgICAgTU9WICAgICBRUFIxLFFQUjUgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2V0dGluZyB1cCByZWdpc3RlciByMQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudEx1bWFEQzR4NAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIAotICAgICAgICA7Ly8gU2V0IHJldHVybiB2YWx1ZQotICAgICAgICBNT1YgICAgIHJlc3VsdCwjT01YX1N0c19Ob0VyciAgICAgICAgCi0gICAgICAgCi0gICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiB0YWlsCi0gICAgICAgIE1fRU5ECi0gICAgICAgIAotICAgICAgICAgICAgCi0gICAgRU5ESUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL0FSTTExMzZKUyAgCi0gICAgCi0KLSAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTllNzUyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICoKLSAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXMuaAotICogRGVzY3JpcHRpb246IERlY2xhcmVzIFRhYmxlcyB1c2VkIGZvciBIdWZmZm1hbiBjb2RpbmcgYW5kIGRlY29kaW5nIAotICogICAgICAgICAgICAgIGluIE1QNFAyIGNvZGVjLgotICoKLSAqLwotIAotI2lmbmRlZiBfT01YSFVGRlRBQl9IXwotI2RlZmluZSBfT01YSFVGRlRBQl9IXwotCi0KLWV4dGVybiBjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9JbnRyYVZsY0wwTDFbMjAwXTsKLQotCi1leHRlcm4gY29uc3QgT01YX1UxNiBhcm1WQ000UDJfSW50ZXJWbGNMMEwxWzIwMF07Ci0KLWV4dGVybiBjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9hSW50cmFEQ0x1bWFDaHJvbWFJbmRleFs2NF07Ci0vL2V4dGVybiBjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9hSW50cmFEQ0Nocm9tYUluZGV4WzMyXTsKLWV4dGVybiBjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9hVmxjTVZEWzEyNF07Ci0KLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDBMMUxNQVhbNzNdOwotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50ZXJMMEwxUk1BWFszNV07Ci1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwwTDFMTUFYWzUzXTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDBMMVJNQVhbNDBdCi0KLSNlbmRpZiAvKiBfT01YSFVGRlRBQl9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg2YmEwNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICoKLSAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfWmlnemFnX1RhYmxlcy5oCi0gKiBEZXNjcmlwdGlvbjogRGVjbGFyZXMgVGFibGVzIHVzZWQgZm9yIFppZ3phZyBzY2FuIGluIE1QNFAyIGNvZGVjLgotICoKLSAqLwotIAotI2lmbmRlZiBfT01YWklHWkFHVEFCX0gKLSNkZWZpbmUgX09NWFpJR1pBR1RBQl9ICi0KLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuIFsxOTJdOwotLy9leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9hSG9yaXpvbnRhbFppZ3phZ1NjYW4gWzY0XTsKLS8vZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfYVZlcnRpY2FsWmlnemFnU2NhbiBbNjRdOwotCi0jZW5kaWYgLyogX09NWFpJR1pBR1RBQl9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DbGlwOF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NsaXA4X3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQxZDQ0MS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NsaXA4X3MucworKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07IC8qKgotOyAqIAotOyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9DbGlwOF9zLnMKLTsgKiBPcGVuTUFYIERMOiB2MS4wLjIKLTsgKiBSZXZpc2lvbjogICA5NjQxCi07ICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsgKiAKLTsgKiAKLTsgKiAKLTsgKgotOyAqIERlc2NyaXB0aW9uOiAKLTsgKiBDb250YWlucyBtb2R1bGUgZm9yIENsaXBwaW5nIDE2IGJpdCB2YWx1ZSB0byBbMCwyNTVdIFJhbmdlCi07ICovIAotCi0gICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgCi0KLSAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLSAgICAgICAgCi0gICAgIAotICAgICAgSUYgQVJNMTEzNkpTCi0gCi07Ly9JbnB1dCBBcmd1bWVudHMKLQotcFNyYyAgICAgICAgICAgICAgICAgUk4gMAotcERzdCAgICAgICAgICAgICAgICAgUk4gMQotc3RlcCAgICAgICAgICAgICAgICAgUk4gMgotCi07Ly8gTG9jYWwgdmFyaWFibGVzCi0KLXgwICAgICAgICAgICAgICAgICAgIFJOIDMKLXgxICAgICAgICAgICAgICAgICAgIFJOIDQKLXgyICAgICAgICAgICAgICAgICAgIFJOIDUKLXgzICAgICAgICAgICAgICAgICAgIFJOIDYKLQotQ291bnQgICAgICAgICAgICAgICAgUk4gMTQKLSAgICAgCi0gICAgICAgIAotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMl9DbGlwOCxyNgotICAgICAgIAotCi0gICAgICAgIE1PViAgICAgICAgICBDb3VudCwjOAotbG9vcAotCi0gICAgICAgIExETUlBICAgICAgICBwU3JjISx7eDAsIHgxfQotICAgICAgICBTVUJTICAgICAgICAgQ291bnQsQ291bnQsICMxICAgICAgICAgIDsvLyBjb3VudCBkb3duCi0gICAgICAgIExETUlBICAgICAgICBwU3JjISx7eDIsIHgzfQotICAgICAgICBVU0FUMTYgICAgICAgeDAsICM4LCB4MCAgICAgICAgICAgICAgICAgOy8vIGNsaXAgdHdvIHNhbXBsZXMgdG8gWzAsMjU1XQotICAgICAgICBVU0FUMTYgICAgICAgeDEsICM4LCB4MSAgICAgICAgICAgICAgICAgOy8vIGNsaXAgdHdvIHNhbXBsZXMgdG8gWzAsMjU1XQotICAgICAgICBTVFJCICAgICAgICAgeDAsIFtwRHN0XQotICAgICAgICBNT1YgICAgICAgICAgeDAsIHgwLCBMU1IgIzE2Ci0gICAgICAgIFNUUkIgICAgICAgICB4MCwgW3BEc3QsIzFdCi0gICAgICAgIFNUUkIgICAgICAgICB4MSwgW3BEc3QsIzJdCi0gICAgICAgIE1PViAgICAgICAgICB4MSwgeDEsIExTUiAjMTYKLSAgICAgICAgU1RSQiAgICAgICAgIHgxLCBbcERzdCwjM10KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgVVNBVDE2ICAgICAgIHgyLCAjOCwgeDIgICAgICAgICAgICAgICAgIDsvLyBjbGlwIHR3byBzYW1wbGVzIHRvIFswLDI1NV0KLSAgICAgICAgVVNBVDE2ICAgICAgIHgzLCAjOCwgeDMgICAgICAgICAgICAgICAgIDsvLyBjbGlwIHR3byBzYW1wbGVzIHRvIFswLDI1NV0KLSAgICAgICAgU1RSQiAgICAgICAgIHgyLCBbcERzdCwjNF0KLSAgICAgICAgTU9WICAgICAgICAgIHgyLCB4MiwgTFNSICMxNgotICAgICAgICBTVFJCICAgICAgICAgeDIsIFtwRHN0LCM1XQotICAgICAgICBTVFJCICAgICAgICAgeDMsIFtwRHN0LCM2XQotICAgICAgICBNT1YgICAgICAgICAgeDMsIHgzLCBMU1IgIzE2Ci0gICAgICAgIFNUUkIgICAgICAgICB4MywgW3BEc3QsIzddCi0gICAgICAgIEFERCAgICAgICAgICBwRHN0LHBEc3Qsc3RlcCAgICAgICAgICAgICA7Ly8gSW5jcmVtZW50IHBEc3QgYnkgc3RlcCB2YWx1ZQotICAgICAgICAgCi0gICAgICAgIEJHVCAgICAgICAgICBsb29wICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ29udGludWUgbG9vcCB1bnRpbCBDb3VudCByZWFjaGVzIDY0IAotCi0gICAgICAgIE1fRU5ECi0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmVfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmY1YmVkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0MTIgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvKioKLTsgKiAKLTsgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZV9zLnMKLTsgKiBPcGVuTUFYIERMOiB2MS4wLjIKLTsgKiBSZXZpc2lvbjogICA5NjQxCi07ICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsgKiAKLTsgKiAKLTsgKiAKLTsgKgotOyAqIERlc2NyaXB0aW9uOiAKLTsgKiBDb250YWlucyBtb2R1bGVzIGZvciB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBkZWNvZGluZwotOyAqIGZvciBpbnRlciwgaW50cmEgYmxvY2suCi07ICoKLTsgKgotOyAqCi07ICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlCi07ICoKLTsgKiBEZXNjcmlwdGlvbjoKLTsgKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gCi07ICoKLTsgKiAKLTsgKgotOyAqIAotOyAqLwotCi0KLSAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICBJTkNMVURFIGFybUNPTU1fQml0RGVjX3MuaAotCi0KLSAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLSAgICAgCi0KLQotCi0gICAgIElGIEFSTTExMzZKUwotICAgICAKLSAgICAgICAgCi0KLQotCi07Ly9JbnB1dCBBcmd1bWVudHMKLQotcHBCaXRTdHJlYW0gICAgICAgICAgUk4gMAotcEJpdE9mZnNldCAgICAgICAgICAgUk4gMQotcERzdCAgICAgICAgICAgICAgICAgUk4gMgotc2hvcnRWaWRlb0hlYWRlciAgICAgUk4gMwotCi0KLTsvL0xvY2FsIFZhcmlhYmxlcwotCi1SZXR1cm4gICAgICAgICAgICAgICBSTiAwCi0KLXBWbGNUYWJsZUwwTDEgICAgICAgIFJOIDQKLXBMTUFYVGFibGVMMEwxICAgICAgIFJOIDQKLXBSTUFYVGFibGVMMEwxICAgICAgIFJOIDQKLXBaaWd6YWdUYWJsZSAgICAgICAgIFJOIDQKLQotZnR5cGUgICAgICAgICAgICAgICAgUk4gMAotdGVtcDMgICAgICAgICAgICAgICAgUk4gNAotdGVtcCAgICAgICAgICAgICAgICAgUk4gNQotQ291bnQgICAgICAgICAgICAgICAgUk4gNgotRXNjYXBlICAgICAgICAgICAgICAgUk4gNQotCi07Ly8gYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIKLXppZ3phZyAgICAgICAgICAgICAgIFJOIDAKLXN0b3JlTGV2ZWwgICAgICAgICAgIFJOIDEKLXRlbXAyICAgICAgICAgICAgICAgIFJOIDQKLXRlbXAxICAgICAgICAgICAgICAgIFJOIDUKLXNpZ24gICAgICAgICAgICAgICAgIFJOIDUKLUxhc3QgICAgICAgICAgICAgICAgIFJOIDcKLXN0b3JlUnVuICAgICAgICAgICAgIFJOIDE0Ci0KLQotcGFja1JldEluZGV4ICAgICAgICAgUk4gNQotCi0KLW1hcmtlcmJpdCAgICAgICAgICAgIFJOIDUKLQotOy8vIFNjcmF0Y2ggUmVnaXN0ZXJzCi0KLVJCaXRTdHJlYW0gICAgICAgICAgIFJOIDgKLVJCaXRCdWZmZXIgICAgICAgICAgIFJOIDkKLVJCaXRDb3VudCAgICAgICAgICAgIFJOIDEwCi0KLVQxICAgICAgICAgICAgICAgICAgIFJOIDExCi1UMiAgICAgICAgICAgICAgICAgICBSTiAxMgotTFIgICAgICAgICAgICAgICAgICAgUk4gMTQgICAgICAgIAotICAgICAgICAKLQotCi0gICAgICAgIE1fQUxMT0M0ICAgICAgICBwcHBCaXRTdHJlYW0sNAotICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBPZmZzZXQsNAotICAgICAgICBNX0FMTE9DNCAgICAgICAgcExpbmtSZWdpc3Rlciw0ICAgICAgIAotICAgICAgICAKLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZQotCi0gICAgICAgIDsvLyBnZXQgdGhlIHRhYmxlIGFkZHJlc3NlcyBmcm9tIHN0YWNrICAgICAgIAotICAgICAgICBNX0FSRyAgICAgICAgICAgcHBWbGNUYWJsZUwwTDEsNAotICAgICAgICBNX0FSRyAgICAgICAgICAgcHBMTUFYVGFibGVMMEwxLDQKLSAgICAgICAgTV9BUkcgICAgICAgICAgIHBwUk1BWFRhYmxlTDBMMSw0Ci0gICAgICAgIE1fQVJHICAgICAgICAgICBwcFppZ3phZ1RhYmxlLDQKLSAgICAgICAgCi0gICAgICAgIDsvLyBTdG9yZSBBTEwgemVyb3MgYXQgcERzdAotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgICAgICAgIHRlbXAxLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJbml0aWFsaXplIENvdW50IHRvIHplcm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBNT1YgICAgICAgICAgICAgTGFzdCwjMAotICAgICAgICBNX1NUUiAgICAgICAgICAgTFIscExpbmtSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIExpbmsgUmVnaXN0ZXIgb24gU3RhY2sKLSAgICAgICAgTU9WICAgICAgICAgICAgIHRlbXAyLCMwCi0gICAgICAgIE1PViAgICAgICAgICAgICBMUiwjMCAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBJbml0aWFsaXplIHRoZSBNYWNybyBhbmQgU3RvcmUgYWxsIHplcm9zIHRvIHBEc3QgCi0gIAotICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9ICAgICAgICAgICAgICAgICAgIAotICAgICAgICBNX0JEX0lOSVQwICAgICAgcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIFJCaXRTdHJlYW0sIFJCaXRCdWZmZXIsIFJCaXRDb3VudCAgCi0gICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KLSAgICAgICAgTV9CRF9JTklUMSAgICAgIFQxLCBUMiwgVDIKLSAgICAgICAgU1RNICAgICAgICAgICAgIHBEc3QhLHt0ZW1wMix0ZW1wMSxMYXN0LExSfQotICAgICAgICBNX0JEX0lOSVQyICAgICAgVDEsIFQyLCBUMgotICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9Ci0gICAgICAgIE1fU1RSICAgICAgICAgICBwcEJpdFN0cmVhbSxwcHBCaXRTdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcHBCaXRzdHJlYW0gb24gc3RhY2sgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KLSAgICAgICAgTV9TVFIgICAgICAgICAgIHBCaXRPZmZzZXQscHBPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBwQml0T2Zmc2V0IG9uIHN0YWNrCi0gICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KLSAgICAgICAgCi0gICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KLSAgICAgICAgU1RNICAgICAgICAgICAgIHBEc3QhLHt0ZW1wMix0ZW1wMSxMYXN0LExSfQotIAotICAgICAgICAKLSAgICAgICAgU1VCICAgICAgICAgICAgIHBEc3QscERzdCwjMTI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBSZXN0b3JlIHBEc3QKLQotICAgICAgICA7Ly8gVGhlIGFybVZDTTRQMl9HZXRWTENCaXRzIGJlZ2lucwotCi1nZXRWTENiaXRzCi0gICAgICAgIAotICAgICAgICBNX0JEX0xPT0s4ICAgICAgRXNjYXBlLDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgRXNjYXBlIFZhbHVlCi0gICAgICAgIExTUiAgICAgICAgICAgICBFc2NhcGUsRXNjYXBlLCMyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIENNUCAgICAgICAgICAgICBFc2NhcGUsIzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY2hlY2sgZm9yIGVzY2FwZSBtb2RlCi0gICAgICAgIE1PVk5FICAgICAgICAgICBmdHlwZSwjMAotICAgICAgICBCTkUgICAgICAgICAgICAgbm90RXNjYXBlbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCBpZiBub3QgaW4gRXNjYXBlIG1vZGUgMwotCi0gICAgICAgIE1fQkRfVlNLSVA4ICAgICAjNyxUMQotICAgICAgICBDTVAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlciwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIHNob3J0VmlkZW9IZWFkZXIgZmxhZyB0byBrbm93IHRoZSB0eXBlIG9mIEVzY2FwZSBtb2RlCi0gICAgICAgIEJFUSAgICAgICAgICAgICBlbmRGaWxsVkxEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gRXNjYXBlIE1vZGUgNAotCi0gICAgICAgIE1fQkRfUkVBRDggICAgICBMYXN0LDEsVDEKLSAgICAgICAgTV9CRF9SRUFEOCAgICAgIHN0b3JlUnVuLDYsVDEKLSAgICAgICAgTV9CRF9SRUFEOCAgICAgIHN0b3JlTGV2ZWwsOCxUMQotCi0gICAgICAgICAgIAotICAgICAgICA7Ly8gQ2hlY2sgd2hldGhlciB0aGUgUmVzZXJ2ZWQgdmFsdWVzIGZvciBMZXZlbCBhcmUgdXNlZCBhbmQgRXhpdCB3aXRoIGFuIEVycm9yIE1lc3NhZ2UgaWYgaXQgaXMgc28KLQotICAgICAgICBURVEgICAgICAgICAgICAgc3RvcmVMZXZlbCwjMAotICAgICAgICBURVFORSAgICAgICAgICAgc3RvcmVMZXZlbCwjMTI4ICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQkVRICAgICAgICAgICAgIEV4aXRFcnJvcgotCi0gICAgICAgIEFERCAgICAgICAgICAgICB0ZW1wMixzdG9yZVJ1bixDb3VudAotICAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDIsIzY0Ci0gICAgICAgIEJHRSAgICAgICAgICAgICBFeGl0RXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gZXJyb3IgaWYgQ291bnQrc3RvcmVSdW4gPj0gNjQKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBhZGRyZXNzIG9mIHppZ3phZ1RhYmxlCi0gICAgICAgIAotICAgICAgICBNX0xEUiAgICAgICAgICAgcFppZ3phZ1RhYmxlLHBwWmlnemFnVGFibGUgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWRpbmcgdGhlIEFkZHJlc3Mgb2YgWmlnemFnIHRhYmxlCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIFNYVEIgICAgICAgICAgICBzdG9yZUxldmVsLHN0b3JlTGV2ZWwgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2lnbiBFeHRlbmQgc3RvcmVMZXZlbCB0byAzMiBiaXRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBUbyBSZWZsZWN0IFJ1bmxlbmd0aAotCi0gICAgICAgIEFERCAgICAgICAgICAgICBDb3VudCxDb3VudCxzdG9yZVJ1bgotICAgICAgICBMRFJCICAgICAgICAgICAgemlnemFnLFtwWmlnemFnVGFibGUsQ291bnRdCi0gICAgICAgIEFERCAgICAgICAgICAgICBDb3VudCxDb3VudCwjMQotICAgICAgICBTVFJIICAgICAgICAgICAgc3RvcmVMZXZlbCxbcERzdCx6aWd6YWddICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIExldmVsCi0gICAgICAgICAgICAgIAotICAgICAgICBCICAgICAgICAgICAgICAgRXhpdE9rCi0gICAgICAgCi0gICAgICAgIAotCi1lbmRGaWxsVkxECi0gICAgICAgIAotICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBMb2FkIEZ0eXBlKCBFc2NhcGUgTW9kZSkgdmFsdWUgYmFzZWQgb24gdGhlIHR3byBzdWNjZXNzaXZlIGJpdHMgaW4gdGhlIGJpdHN0cmVhbQotICAgICAKLSAgICAgICAgTV9CRF9SRUFEOCAgICAgIHRlbXAxLDEsVDEgICAgICAgICAgIAotICAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzAgICAgCi0gICAgICAgIE1PVkVRICAgICAgICAgICBmdHlwZSwjMQotICAgICAgICBCRVEgICAgICAgICAgICAgbm90RXNjYXBlbW9kZQotICAgICAgICBNX0JEX1JFQUQ4ICAgICAgdGVtcDEsMSxUMQotICAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzEKLSAgICAgICAgTU9WRVEgICAgICAgICAgIGZ0eXBlLCMzCi0gICAgICAgIE1PVk5FICAgICAgICAgICBmdHlwZSwjMgotICAgICAgICAKLQotbm90RXNjYXBlbW9kZQotCi0gICAgICAgIDsvLyBMb2FkIG9wdGltaXplZCBwYWNrZWQgVkxDIHRhYmxlIHdpdGggbGFzdD0wIGFuZCBMYXN0PTEKLSAgICAgICAgCi0gICAgICAgIE1fTERSICAgICAgICAgICBwVmxjVGFibGVMMEwxLHBwVmxjVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBDb21iaW5lZCBWTEMgVGFibGUKLSAgICAgICAgICAgICAgICAKLSAgICAgICAKLSAgICAgICAgQ01QICAgICAgICAgICAgIGZ0eXBlLCMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBmdHlwZSA+PTMgZ2V0IHBlcmZvcm0gRml4ZWQgTGVuZ3RoIERlY29kaW5nIChFc2NhcGUgTW9kZSAzKQotICAgICAgICBCR0UgICAgICAgICAgICAgRXNjYXBlTW9kZTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEVsc2UgY29udGludWUgbm9ybWFsIFZMQyBEZWNvZGluZwotICAgICAgICAKLSAgICAgICAgOy8vIFZhcmlhYmxlIGxlbmdoIGRlY29kaW5nLCAiYXJtVW5QYWNrVkxDMzIiIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIE1fQkRfVkxEICAgICAgICBwYWNrUmV0SW5kZXgsVDEsVDIscFZsY1RhYmxlTDBMMSw0LDIKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBMRFIgICAgICAgICAgICAgdGVtcDMsPTB4RkZGCi0gICAgICAgIAotICAgICAgICBDTVAgICAgICAgICAgICAgcGFja1JldEluZGV4LHRlbXAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIGZvciBpbnZhbGlkIHN5bWJvbAotICAgICAgICBCRVEgICAgICAgICAgICAgRXhpdEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGlmIGludmFsaWQgc3ltYm9sIG9jY3VycyBleGl0IHdpdGggYW4gZXJyb3IgbWVzc2FnZQotICAgICAgICAKLSAgICAgICAgQU5EICAgICAgICAgICAgIExhc3QscGFja1JldEluZGV4LCMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBHZXQgTGFzdCBmcm9tIHBhY2tlZCBJbmRleAotICAgICAgICAgICAgICAKLSAgICAgICAgIAotICAgICAgICAKLQotICAgICAgICBMU1IgICAgICAgICAgICAgc3RvcmVSdW4scGFja1JldEluZGV4LCM3ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEdldCBSdW4gVmFsdWUgZnJvbSBQYWNrZWQgaW5kZXgKLSAgICAgICAgQU5EICAgICAgICAgICAgIHN0b3JlTGV2ZWwscGFja1JldEluZGV4LCMweDdjICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZUxldmVsPXBhY2tSZXRJbmRleFsyLTZdLHN0b3JlTGV2ZWxbMC0xXT0wIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgIAotICAgICAgICBNX0xEUiAgICAgICAgICAgcExNQVhUYWJsZUwwTDEscHBMTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgOy8vIExvYWQgTE1BWCB0YWJsZQotICAgICAgICAgICAgICAKLSAgICAgICAKLSAgICAgICAgTFNSICAgICAgICAgICAgIHN0b3JlTGV2ZWwsc3RvcmVMZXZlbCwjMiAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMZXZlbCB2YWx1ZQotCi0gICAgICAgIENNUCAgICAgICAgICAgICBmdHlwZSwjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBCTkUgICAgICAgICAgICAgZnR5cGUyCi0gICAgICAgIAotICAgICAgICA7Ly8gZnR5cGU9PTE7IEVzY2FwZSBtb2RlID0xCi0gICAgICAgICAgCi0gICAgICAgIAotICAgICAgICBBREQgICAgICAgICAgICB0ZW1wMSwgcExNQVhUYWJsZUwwTDEsIExhc3QsIExTTCM0ICAgICAgICAgICAgICA7Ly8gSWYgdGhlIExhc3Q9MSBhZGQgMzIgdG8gdGFibGUgYWRkcmVzcwotICAgICAgICBMRFJCICAgICAgICAgICAgdGVtcDEsW3RlbXAxLHN0b3JlUnVuXQotCi0gICAgICAgCi0gICAgICAgIEFERCAgICAgICAgICAgICBzdG9yZUxldmVsLHRlbXAxLHN0b3JlTGV2ZWwgICAgICAgICAgICAgICAgICAgICAKLQotZnR5cGUyCi0KLSAgICAgICAgOy8vIGZ0eXBlID0yOyBFc2NhcGUgbW9kZSA9MgotICAgICAgICAKLSAgICAgICAgTV9MRFIgICAgICAgICAgIHBSTUFYVGFibGVMMEwxLHBwUk1BWFRhYmxlTDBMMSAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIFJNQVggVGFibGUgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIENNUCAgICAgICAgICAgICBmdHlwZSwjMgotICAgICAgICBCTkUgICAgICAgICAgICAgRmlsbFZMREwxCi0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgICAgdGVtcDEsIHBSTUFYVGFibGVMMEwxLCBMYXN0LCBMU0wjNCAgICAgICAgICAgICAgIDsvLyBJZiBMYXN0PTEgYWRkIDMyIHRvIHRhYmxlIGFkZHJlc3MKLSAgICAgICAgU1VCICAgICAgICAgICAgIHRlbXAyLHN0b3JlTGV2ZWwsIzEKLSAgICAgICAgTERSQiAgICAgICAgICAgIHRlbXAxLFt0ZW1wMSx0ZW1wMl0KLQotICAgICAgIAotICAgICAgICBBREQgICAgICAgICAgICAgc3RvcmVSdW4sc3RvcmVSdW4sIzEKLSAgICAgICAgQUREICAgICAgICAgICAgIHN0b3JlUnVuLHRlbXAxCi0gICAgICAgIAotRmlsbFZMREwxICAgICAgICAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIKLQotICAgICAgICBNX0xEUiAgICAgICAgICAgcFppZ3phZ1RhYmxlLHBwWmlnemFnVGFibGUgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBhZGRyZXNzIG9mIHppZ3phZ1RhYmxlIAotICAgICAgICAgICAgICAgIAotICAgICAgICBNX0JEX1JFQUQ4ICAgICAgc2lnbiwxLFQxCi0KLSAgICAgICAgQ01QICAgICAgICAgICAgIHNpZ24sIzEKLSAgICAgICAgUlNCRVEgICAgICAgICAgIHN0b3JlTGV2ZWwsc3RvcmVMZXZlbCwjMAotIAotICAgICAgICBBREQgICAgICAgICAgICAgdGVtcDEsc3RvcmVSdW4sQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRXhpdCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgUnVuICsgQ291bnQgZXhjZWVkcyA2MwotICAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzY0Ci0gICAgICAgIEJHRSAgICAgICAgICAgICBFeGl0RXJyb3IKLQotICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gVG8gUmVmbGVjdCBSdW5sZW5naHQKLQotICAgICAgICBBREQgICAgICAgICAgICAgQ291bnQsQ291bnQsc3RvcmVSdW4KLSAKLXN0b3JlTGV2ZWxMMQotICAgICAgICAKLSAgICAgICAgTERSQiAgICAgICAgICAgIHppZ3phZyxbcFppZ3phZ1RhYmxlLENvdW50XQotICAgICAgICBDTVAgICAgICAgICAgICAgTGFzdCwjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIHRoZSBMZXZlbCB2YWwgaXMgTGFzdCBub24gemVybyB2YWwKLSAgICAgICAgQUREICAgICAgICAgICAgIENvdW50LENvdW50LCMxCi0gICAgICAgIExTUiAgICAgICAgICAgICBMYXN0LExhc3QsIzEKLSAgICAgICAgU1RSSCAgICAgICAgICAgIHN0b3JlTGV2ZWwsW3BEc3QsemlnemFnXSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAKLSAgICAgICAgQk5FICAgICAgICAgICAgIGVuZAotICAgICAgICAKLSAgICAgICAgQiAgICAgICAgICAgICAgIEV4aXRPawotIAotCi0KLSAgICAgICAgOy8vIEZpeGVkIExlbmdoIERlY29kaW5nIEVzY2FwZSBNb2RlIDMKLQotRXNjYXBlTW9kZTMKLQotICAgICAgICBNX0JEX1JFQUQ4ICAgICAgTGFzdCwxLFQxCi0gICAgICAgIE1fQkRfUkVBRDggICAgICBzdG9yZVJ1biw2LFQxCi0gICAgICAgIAotICAgICAgICBBREQgICAgICAgICAgICAgdGVtcDIsc3RvcmVSdW4sQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4aXQgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIFJ1biArIENvdW50IGV4Y2VlZHMgNjMKLSAgICAgICAgQ01QICAgICAgICAgICAgIHRlbXAyLCM2NAotICAgICAgICBCR0UgICAgICAgICAgICAgRXhpdEVycm9yCi0KLSAgICAgICAgTV9CRF9SRUFEOCAgICAgIG1hcmtlcmJpdCwxLFQxCi0gICAgICAgIFRFUSAgICAgICAgICAgICBtYXJrZXJiaXQsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRXhpdCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgbWFya2VyIGJpdCBpcyB6ZXJvCi0gICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0RXJyb3IKLSAgICAgICAgCi0gICAgICAgIE1fQkRfUkVBRDE2ICAgICBzdG9yZUxldmVsLDEyLFQxCi0KLSAgICAgICAgVFNUICAgICAgICAgICAgIHN0b3JlTGV2ZWwsIzB4ODAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZXN0IGlmIHRoZSBsZXZlbCBpcyBuZWdhdGl2ZQotICAgICAgICBTVUJORSAgICAgICAgICAgc3RvcmVMZXZlbCxzdG9yZUxldmVsLCM0MDk2Ci0gICAgICAgIENNUCAgICAgICAgICAgICBzdG9yZUxldmVsLCMwCi0gICAgICAgIENNUE5FICAgICAgICAgICBzdG9yZUxldmVsLCMtMjA0OAotICAgICAgICBCRVEgICAgICAgICAgICAgRXhpdEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4aXQgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIExldmVsPT0wIG9yICAtMjA0OCAKLQotICAgICAgICBNX0xEUiAgICAgICAgICAgcFppZ3phZ1RhYmxlLHBwWmlnemFnVGFibGUgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgYWRkcmVzcyBvZiB6aWd6YWdUYWJsZQotICAgICAgICAgICAgICAKLSAgICAgICAgTV9CRF9SRUFEOCAgICAgIG1hcmtlcmJpdCwxLFQxCi0gICAgICAgICAgIAotCi0gICAgICAgIDsvLyBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlciAoIFNpZ24gbm90IHVzZWQgYXMgc3RvcmVMZXZlbCBpcyBwcmVwcm9jZXNzZWQpCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIDsvLyBUbyBSZWZsZWN0IFJ1biBMZW5ndGgKLQotICAgICAgICBBREQgICAgICAgICAgICAgQ291bnQsQ291bnQsc3RvcmVSdW4KLQotCi0gCi1zdG9yZUxldmVsTGFzdAotICAgICAgICAKLSAgICAgICAgTERSQiAgICAgICAgICAgIHppZ3phZyxbcFppZ3phZ1RhYmxlLENvdW50XQotICAgICAgICBDTVAgICAgICAgICAgICAgTGFzdCwjMQotICAgICAgICBBREQgICAgICAgICAgICAgQ291bnQsQ291bnQsIzEKLSAgICAgICAgU1RSSCAgICAgICAgICAgIHN0b3JlTGV2ZWwsW3BEc3QsemlnemFnXSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIEJORSAgICAgICAgICAgICBlbmQgCi0gICAgICAKLSAgICAgICAgQiAgICAgICAgICAgICAgIEV4aXRPawotICAgICAgICAKLWVuZAotCi0gICAgICAgIENNUCAgICAgICAgICAgICBDb3VudCwjNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9SdW4gdGhlIExvb3AgdW50aWxsIENvdW50IHJlYWNoZXMgNjQKLQotICAgICAgICBCTFQgICAgICAgICAgICAgZ2V0VkxDYml0cwotCi0gICAgICAgIAotRXhpdE9rCi0gICAgICAgIDsvLyBFeGl0IFdoZW4gVkxDIERlY29kaW5nIGlzIGRvbmUgU3VjY2Vzc2Z1bGx5IAotICAgCi0gICAgICAgIDsvLyBMb2FkaW5nIHBwQml0U3RyZWFtIGFuZCBwQml0T2Zmc2V0IGZyb20gc3RhY2sKLSAgICAgICAgCi0gICAgICAgIENNUCAgICAgICAgICAgICBMYXN0LCMxCi0gICAgICAgIE1fTERSICAgICAgICAgICBwcEJpdFN0cmVhbSxwcHBCaXRTdHJlYW0KLSAgICAgICAgTV9MRFIgICAgICAgICAgIHBCaXRPZmZzZXQscHBPZmZzZXQKLQotICAgICAgICA7Ly9FbmRpbmcgdGhlIG1hY3JvCi0KLSAgICAgICAgTV9CRF9GSU5JICAgICAgIHBwQml0U3RyZWFtLHBCaXRPZmZzZXQKLSAgICAgICAgICAgICAKLSAgICAgICAgTU9WRVEgICAgICAgICAgIFJldHVybiwjT01YX1N0c19Ob0VycgotICAgICAgICBNT1ZORSAgICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX0VycgotICAgICAgICBNX0xEUiAgICAgICAgICAgTFIscExpbmtSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCB0aGUgTGluayBSZWdpc3RlciBCYWNrCi0gICAgICAgIEIgICAgICAgICAgICAgICBleGl0MgotCi1FeGl0RXJyb3IKLSAgICAgICAgOy8vIEV4aXQgV2hlbiBhbiBFcnJvciBvY2N1cnMgCi0KLSAgICAgICAgTV9MRFIgICAgICAgICAgIHBwQml0U3RyZWFtLHBwcEJpdFN0cmVhbQotICAgICAgICBNX0xEUiAgICAgICAgICAgcEJpdE9mZnNldCxwcE9mZnNldAotICAgICAgICA7Ly9FbmRpbmcgdGhlIG1hY3JvCi0KLSAgICAgICAgTV9CRF9GSU5JICAgICAgIHBwQml0U3RyZWFtLHBCaXRPZmZzZXQKLSAgICAgICAgTV9MRFIgICAgICAgICAgIExSLHBMaW5rUmVnaXN0ZXIKLSAgICAgICAgTU9WICAgICAgICAgICAgIFJldHVybiwjT01YX1N0c19FcnIKLQotZXhpdDIKLSAgICAgICAKLQotICAgICAgICBNX0VORAotICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRkODZlZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLSAvKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRmlsZTogICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYwotICogRGVzY3JpcHRpb246IENvbnRhaW5zIGFsbCB0aGUgSHVmZm1hbiB0YWJsZXMgdXNlZCBpbiBNUEVHNCBjb2RlYwotICoKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLQotI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCi0KLQotCi0KLS8vIENvbnRhaW5zIG9wdGltaXplZCBhbmQgUGFja2VkIFZMQyB0YWJsZXMgd2l0aCBMYXN0PTAgYW5kIExhc3Q9MQotCi0vLyAgICAgICAgICAgICAgb3B0aW1pemVkIFBhY2tlZCBWTEMgdGFibGUgRW50cnkgRm9ybWF0IAotLy8gICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gCi0vLyAgICAgICAgMTUgMTQgMTMgMTIgMTEgMTAgMDkgMDggMDcgMDYgMDUgMDQgMDMgMDIgMDEgMDAKLS8vICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0vLyAgICAgICB8ICBMZW4gICB8ICAgICAgIFJ1biAgICAgICB8ICAgICBMZXZlbCAgICB8TCB8IDEgfAotLy8gICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLS8vICAgICAgIHwgICAgICAgICAgICAgICAgT2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgIHwgMCB8Ci0vLyAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotLy8gSWYgdGhlIHRhYmxlIGVudHJ5IGlzIGEgbGVhZiBlbnRyeSB0aGVuIGJpdCAwIHNldDoKLS8vICAgIExlbiAgICA9IE51bWJlciBvZiBiaXRzIG92ZXJyZWFkICAoMCB0byA3KSAgMyBiaXRzCi0vLyAgICBSdW4gICAgPSBSdW5MZW5ndGggb2YgdGhlIFN5bWJvbCAgKDAgdG8gNjMpIDYgYml0cwotLy8gICAgTGV2ZWwgID0gTGV2ZWwgb2YgdGhlIFN5bWJvbCAgICAgICgwIHRvIDMxKSA1IGJpdHMKLS8vICAgIEwgICAgICA9IExhc3QgVmFsdWUgb2YgdGhlIFN5bWJvbCAoMCBvciAxKSAgMSBiaXQKLS8vCi0vLyBJZiB0aGUgdGFibGUgZW50cnkgaXMgYW4gaW50ZXJuYWwgbm9kZSB0aGVuIGJpdCAwIGlzIGNsZWFyOgotLy8gICAgT2Zmc2V0ID0gTnVtYmVyIG9mICgxNi1iaXQpIGhhbGYgd29yZHMgZnJvbSB0aGUgdGFibGUKLS8vICAgICAgICAgICAgIHN0YXJ0IHRvIHRoZSBuZXh0IHRhYmxlIG5vZGUKLS8vCi0vLyBUaGUgdGFibGUgaXMgYWNjZXNzZWQgYnkgc3VjY2Vzc2l2ZSBsb29rdXAgdXAgb24gdGhlCi0vLyBuZXh0IFN0ZXAgYml0cyBvZiB0aGUgaW5wdXQgYml0c3RyZWFtIHVudGlsIGEgbGVhZiBub2RlCi0vLyBpcyBvYnRhaW5lZC4gVGhlIFN0ZXAgc2l6ZXMgYXJlIHN1cHBsaWVkIHRvIHRoZSBWTEQgbWFjcm8uCi0KLS8vIFRoZSBWTEMgdGFibGVzIHVzZWQgZm9yIEludHJhIGFuZCBub24gaW50YSBjb2VmZmljaWVudHMgaW4gbm9uIEVzY2FwZSBtb2RlCi0vLyBjb250YWlucyBzeW1ib2xzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MS4KLS8vIElmIGEgc3ltYm9sIGlzIG5vdCBmb3VuZCBpbiB0aGUgdGFibGUgaXQgd2lsbCBiZSBjb2RlZCBhcyAweEZGRgotIAotCi1jb25zdCBPTVhfVTE2IGFybVZDTTRQMl9JbnRlclZsY0wwTDFbMjAwXSA9IHsKLSAgICAweDAwMjAsIDB4MDEwOCwgMHgwMTQ4LCAweDAxNzAsIDB4MDE3OCwgMHgwMTgwLCAweDAxODgsIDB4MWIwOSwKLSAgICAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4MjEwOSwgMHgyMTA5LCAweDAyMDksIDB4MDAxMSwKLSAgICAweDAwMjgsIDB4MDA2MCwgMHgwMGI4LCAweDAwZTAsIDB4MDAzMCwgMHgwMDQ4LCAweDAwNTAsIDB4MDA1OCwKLSAgICAweDNmZmYsIDB4M2ZmZiwgMHgwMDM4LCAweDAwNDAsIDB4MjExNSwgMHgyMTE1LCAweDIwMWQsIDB4MjAxZCwKLSAgICAweDIwNTksIDB4MjA1OSwgMHgyMDUxLCAweDIwNTEsIDB4MWMwZCwgMHgxYjBkLCAweDFhMGQsIDB4MTkwZCwKLSAgICAweDA5MTEsIDB4MDgxMSwgMHgwNzExLCAweDA2MTEsIDB4MDUxMSwgMHgwMzE5LCAweDAyMTksIDB4MDEyMSwKLSAgICAweDAwNjgsIDB4MDA5MCwgMHgzZmZmLCAweDNmZmYsIDB4MDA3MCwgMHgwMDc4LCAweDAwODAsIDB4MDA4OCwKLSAgICAweDIwNjEsIDB4MjA2MSwgMHgyMTI5LCAweDIxMjksIDB4MzcwOSwgMHgzNzA5LCAweDM4MDksIDB4MzgwOSwKLSAgICAweDNkMGQsIDB4M2QwZCwgMHgzZTBkLCAweDNlMGQsIDB4M2YwZCwgMHgzZjBkLCAweDIwMGQsIDB4MjAwZCwKLSAgICAweDAwOTgsIDB4MDBhMCwgMHgwMGE4LCAweDAwYjAsIDB4MDEzMSwgMHgwMjIxLCAweDA0MTksIDB4MDUxOSwKLSAgICAweDA2MTksIDB4MGExMSwgMHgxOTA5LCAweDFhMDksIDB4MjEwZCwgMHgyMjBkLCAweDIzMGQsIDB4MjQwZCwKLSAgICAweDI1MGQsIDB4MjYwZCwgMHgyNzBkLCAweDI4MGQsIDB4MDBjMCwgMHgwMGM4LCAweDAwZDAsIDB4MDBkOCwKLSAgICAweDAwNDksIDB4MDA0MSwgMHgzODBkLCAweDM4MGQsIDB4MzcwZCwgMHgzNzBkLCAweDM2MGQsIDB4MzYwZCwKLSAgICAweDM1MGQsIDB4MzUwZCwgMHgzNDBkLCAweDM0MGQsIDB4MzMwZCwgMHgzMzBkLCAweDMyMGQsIDB4MzIwZCwKLSAgICAweDAwZTgsIDB4MDBmMCwgMHgwMGY4LCAweDAxMDAsIDB4MzEwZCwgMHgzMTBkLCAweDIwMTUsIDB4MjAxNSwKLSAgICAweDM2MDksIDB4MzYwOSwgMHgzNTA5LCAweDM1MDksIDB4MzQwOSwgMHgzNDA5LCAweDMzMDksIDB4MzMwOSwKLSAgICAweDMyMDksIDB4MzIwOSwgMHgzMTA5LCAweDMxMDksIDB4MDExMCwgMHgwMTMwLCAweDAxMzgsIDB4MDE0MCwKLSAgICAweDAxMTgsIDB4MDEyMCwgMHgwMTI4LCAweDEwMGQsIDB4MzAwOSwgMHgzMDA5LCAweDJmMDksIDB4MmYwOSwKLSAgICAweDI0MTEsIDB4MjQxMSwgMHgyMzExLCAweDIzMTEsIDB4MjAzOSwgMHgyMDM5LCAweDIwMzEsIDB4MjAzMSwKLSAgICAweDBmMGQsIDB4MGUwZCwgMHgwZDBkLCAweDBjMGQsIDB4MGIwZCwgMHgwYTBkLCAweDA5MGQsIDB4MGUwOSwKLSAgICAweDBkMDksIDB4MDIxMSwgMHgwMTE5LCAweDAwMjksIDB4MDE1MCwgMHgwMTU4LCAweDAxNjAsIDB4MDE2OCwKLSAgICAweDI4MGQsIDB4MjgwZCwgMHgyNzBkLCAweDI3MGQsIDB4MjYwZCwgMHgyNjBkLCAweDI1MGQsIDB4MjUwZCwKLSAgICAweDJjMDksIDB4MmMwOSwgMHhiNzU5LCAweGI3NTksIDB4MmEwOSwgMHgyYTA5LCAweDIwMjEsIDB4MjAyMSwKLSAgICAweDA0MGQsIDB4MDMwZCwgMHgwYjM1LCAweDAxMGQsIDB4MDkwOSwgMHgwODA5LCAweDA3MDksIDB4MDYwOSwKLSAgICAweDAxMTEsIDB4MDAxOSwgMHgyNTA5LCAweDI1MDksIDB4MjQwOSwgMHgyNDA5LCAweDIzMDksIDB4MjMwOQotfTsKLQotCi1jb25zdCBPTVhfVTE2IGFybVZDTTRQMl9JbnRyYVZsY0wwTDFbMjAwXSA9IHsKLSAgICAweDAwMjAsIDB4MDEwOCwgMHgwMTQ4LCAweDAxNzAsIDB4MDE3OCwgMHgwMTgwLCAweDAxODgsIDB4MGYwOSwKLSAgICAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4MjAxMSwgMHgyMDExLCAweDAxMDksIDB4MDAxOSwKLSAgICAweDAwMjgsIDB4MDA2MCwgMHgwMGI4LCAweDAwZTAsIDB4MDAzMCwgMHgwMDQ4LCAweDAwNTAsIDB4MDA1OCwKLSAgICAweDNmZmYsIDB4M2ZmZiwgMHgwMDM4LCAweDAwNDAsIDB4MjAzZCwgMHgyMDNkLCAweDIwMzUsIDB4MjAzNSwKLSAgICAweDIwYjEsIDB4MjBiMSwgMHgyMGE5LCAweDIwYTksIDB4MDIxNSwgMHgwMTFkLCAweDAwMmQsIDB4MGQwOSwKLSAgICAweDA1MTksIDB4MDgxMSwgMHgwNDE5LCAweDAzMjEsIDB4MDIyMSwgMHgwMTM5LCAweDAwYTEsIDB4MDA5OSwKLSAgICAweDAwNjgsIDB4MDA5MCwgMHgzZmZmLCAweDNmZmYsIDB4MDA3MCwgMHgwMDc4LCAweDAwODAsIDB4MDA4OCwKLSAgICAweDIwYjksIDB4MjBiOSwgMHgyMGMxLCAweDIwYzEsIDB4MjE0MSwgMHgyMTQxLCAweDI5MTEsIDB4MjkxMSwKLSAgICAweDIzMTUsIDB4MjMxNSwgMHgyNDE1LCAweDI0MTUsIDB4MmYwZCwgMHgyZjBkLCAweDMwMGQsIDB4MzAwZCwKLSAgICAweDAwOTgsIDB4MDBhMCwgMHgwMGE4LCAweDAwYjAsIDB4MDBjOSwgMHgwMGQxLCAweDAwZDksIDB4MDE0OSwKLSAgICAweDA2MTksIDB4MDE1MSwgMHgwMjI5LCAweDA3MTksIDB4MGUwOSwgMHgwMDQ1LCAweDA1MTUsIDB4MDYxNSwKLSAgICAweDExMGQsIDB4MTIwZCwgMHgxMzBkLCAweDE0MGQsIDB4MDBjMCwgMHgwMGM4LCAweDAwZDAsIDB4MDBkOCwKLSAgICAweDAwOTEsIDB4MDA4OSwgMHgyZTBkLCAweDJlMGQsIDB4MmQwZCwgMHgyZDBkLCAweDJjMGQsIDB4MmMwZCwKLSAgICAweDJiMGQsIDB4MmIwZCwgMHgyYTBkLCAweDJhMGQsIDB4MjExNSwgMHgyMTE1LCAweDIwMjUsIDB4MjAyNSwKLSAgICAweDAwZTgsIDB4MDBmMCwgMHgwMGY4LCAweDAxMDAsIDB4MmMwOSwgMHgyYzA5LCAweDJiMDksIDB4MmIwOSwKLSAgICAweDI3MTEsIDB4MjcxMSwgMHgyNjExLCAweDI2MTEsIDB4MjUxMSwgMHgyNTExLCAweDIzMTksIDB4MjMxOSwKLSAgICAweDIyMTksIDB4MjIxOSwgMHgyMTMxLCAweDIxMzEsIDB4MDExMCwgMHgwMTMwLCAweDAxMzgsIDB4MDE0MCwKLSAgICAweDAxMTgsIDB4MDEyMCwgMHgwMTI4LCAweDA4MGQsIDB4MjEyOSwgMHgyMTI5LCAweDIwODEsIDB4MjA4MSwKLSAgICAweDI0MTEsIDB4MjQxMSwgMHgyMDc5LCAweDIwNzksIDB4MjA3MSwgMHgyMDcxLCAweDIwNjksIDB4MjA2OSwKLSAgICAweDFiYjUsIDB4MDYwZCwgMHgwMDFkLCAweGQzZjksIDB4MDkwOSwgMHgwODA5LCAweDA5MGQsIDB4MDMxMSwKLSAgICAweDAxMjEsIDB4MDA2MSwgMHgwMDU5LCAweDAwNTEsIDB4MDE1MCwgMHgwMTU4LCAweDAxNjAsIDB4MDE2OCwKLSAgICAweDI0MGQsIDB4MjQwZCwgMHgyMzBkLCAweDIzMGQsIDB4MjYwOSwgMHgyNjA5LCAweDI1MGQsIDB4MjUwZCwKLSAgICAweDI3MDksIDB4MjcwOSwgMHgyMjExLCAweDIyMTEsIDB4MjExOSwgMHgyMTE5LCAweDIwNDksIDB4MjA0OSwKLSAgICAweDAwMTUsIDB4MDUwOSwgMHgwMjBkLCAweDAxMGQsIDB4MDQwOSwgMHgwMzA5LCAweDAwNDEsIDB4MDAzOSwKLSAgICAweDAxMTEsIDB4MDAzMSwgMHgyMjA5LCAweDIyMDksIDB4MjAyOSwgMHgyMDI5LCAweDIwMjEsIDB4MjAyMQotfTsKLQotY29uc3QgT01YX1UxNiBhcm1WQ000UDJfYUludHJhRENMdW1hQ2hyb21hSW5kZXhbNjRdID0gewotICAgIDB4MDAyMCwgMHgwMDBiLCAweDIwMDksIDB4MjAwOSwgMHgyMDA3LCAweDIwMDcsIDB4MjAwMSwgMHgyMDAxLAotICAgIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsIDB4NDAwNSwgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLAotICAgIDB4MDAyOCwgMHgwMDBmLCAweDIwMGQsIDB4MjAwZCwgMHgwMDMwLCAweDAwMTMsIDB4MjAxMSwgMHgyMDExLAotICAgIDB4MDAzOCwgMHgwMDE3LCAweDIwMTUsIDB4MjAxNSwgMHgzZmZmLCAweDNmZmYsIDB4MjAxOSwgMHgyMDE5LAotCi0JMHgwMDIwLCAweDAwMDksIDB4MjAwNywgMHgyMDA3LCAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsCi0gICAgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsCi0gICAgMHgwMDI4LCAweDAwMGQsIDB4MjAwYiwgMHgyMDBiLCAweDAwMzAsIDB4MDAxMSwgMHgyMDBmLCAweDIwMGYsCi0gICAgMHgwMDM4LCAweDAwMTUsIDB4MjAxMywgMHgyMDEzLCAweDFmZmYsIDB4MDAxOSwgMHgyMDE3LCAweDIwMTcKLX07Ci0KLQotY29uc3QgT01YX1UxNiBhcm1WQ000UDJfYVZsY01WRFsxMjRdID0gewotICAgIDB4MDAxMCwgMHgwMGYwLCAweDAwNDMsIDB4MDAzZiwgMHg0MDQxLCAweDQwNDEsIDB4NDA0MSwgMHg0MDQxLAotICAgIDB4MDAxOCwgMHgwMGQ4LCAweDAwNDcsIDB4MDAzYiwgMHgwMDIwLCAweDAwODAsIDB4MDBhOCwgMHgwMGQwLAotICAgIDB4MDAyOCwgMHgwMDQ4LCAweDAwNzAsIDB4MDA3OCwgMHgxZmZmLCAweDAwMzAsIDB4MDAzOCwgMHgwMDQwLAotICAgIDB4MDA4MSwgMHgwMDAxLCAweDAwN2YsIDB4MDAwMywgMHgyMDdkLCAweDIwN2QsIDB4MjAwNSwgMHgyMDA1LAotICAgIDB4MjA3YiwgMHgyMDdiLCAweDIwMDcsIDB4MjAwNywgMHgwMDUwLCAweDAwNTgsIDB4MDA2MCwgMHgwMDY4LAotICAgIDB4MjA3OSwgMHgyMDc5LCAweDIwMDksIDB4MjAwOSwgMHgyMDc3LCAweDIwNzcsIDB4MjAwYiwgMHgyMDBiLAotICAgIDB4MjA3NSwgMHgyMDc1LCAweDIwMGQsIDB4MjAwZCwgMHgyMDczLCAweDIwNzMsIDB4MjAwZiwgMHgyMDBmLAotICAgIDB4MDA3MSwgMHgwMDExLCAweDAwNmYsIDB4MDAxMywgMHgwMDZkLCAweDAwMTUsIDB4MDA2YiwgMHgwMDE3LAotICAgIDB4MDA4OCwgMHgwMDkwLCAweDAwOTgsIDB4MDBhMCwgMHgwMDY5LCAweDAwMTksIDB4MDA2NywgMHgwMDFiLAotICAgIDB4MDA2NSwgMHgwMDFkLCAweDAwNjMsIDB4MDAxZiwgMHgwMDYxLCAweDAwMjEsIDB4MDA1ZiwgMHgwMDIzLAotICAgIDB4MDA1ZCwgMHgwMDI1LCAweDAwNWIsIDB4MDAyNywgMHgwMGIwLCAweDAwYjgsIDB4MDBjMCwgMHgwMGM4LAotICAgIDB4MDA1OSwgMHgwMDI5LCAweDAwNTcsIDB4MDAyYiwgMHgyMDU1LCAweDIwNTUsIDB4MjAyZCwgMHgyMDJkLAotICAgIDB4MjA1MywgMHgyMDUzLCAweDIwMmYsIDB4MjAyZiwgMHgyMDUxLCAweDIwNTEsIDB4MjAzMSwgMHgyMDMxLAotICAgIDB4MjA0ZiwgMHgyMDRmLCAweDIwMzMsIDB4MjAzMywgMHgwMGUwLCAweDAwZTgsIDB4MDA0OSwgMHgwMDM5LAotICAgIDB4MjA0ZCwgMHgyMDRkLCAweDIwMzUsIDB4MjAzNSwgMHgyMDRiLCAweDIwNGIsIDB4MjAzNywgMHgyMDM3LAotICAgIDB4MjA0NSwgMHgyMDQ1LCAweDIwM2QsIDB4MjAzZAotfTsKLQotLyogTE1BWCB0YWJsZSBmb3Igbm9uIEludGVyIChMYXN0ID09IDAgYW5kIExhc3Q9MSkKLSAgIExldmVsIC0gMSBJbmRleGVkCi0gICBwYWRkZWQgYXJtVkNNNFAyX0ludGVyTDBMMUxNQVhbMjctMzFdIHdpdGggemVyb3MgdG8gYWNlc3MgZW50cmllcyBmb3IgTGFzdD0xIGVmZmVjdGl2ZWx5Ci0KLSovCi1jb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDBMMUxNQVhbNzNdID0gCi17Ci0gICAxMiwgIDYsICA0LCAgMywgIDMsICAzLCAgMywgIDIsIAotICAgIDIsICAyLCAgMiwgIDEsICAxLCAgMSwgIDEsICAxLAotICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAotICAgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLAotICAgIDMsICAyLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAKLQkxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKLQkxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKLQkxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKLQkxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKLQkxCi19OwotCi0vKiBSTUFYIHRhYmxlIGZvciBub24gSW50ZXIgKExhc3QgPT0gMCBhbmQgTGFzdD0xKQotICAgTGV2ZWwgLSAxIEluZGV4ZWQgCi0gcGFkZGVkIGFybVZDTTRQMl9JbnRlckwwTDFSTUFYWzEyLTMxXSB3aXRoIHplcm9zIHRvIGFjY2VzcyBlbnRyaWVzIGZvciBMYXN0PTEgdGFibGUgZWZmZWN0aXZlbHkgKi8KLQotCi1jb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDBMMVJNQVhbMzVdID0gCi17Ci0gICAyNiwgMTAsICA2LCAgMiwgIDEsICAxLCAgIAotICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKLQkwLAkwLAkwLAkwLAkwLAkwLAotCTAsCTAsCTAsCTAsCTAsCTAsCi0JMCwJMCwJMCwJMCwKLSAgICAwLCAgMCwgIDAsICAwLCAgNDAsICAxLCAgMAotfTsKLQotLyogTE1BWCB0YWJsZSBmb3Igbm9uIEludHJhIChMYXN0ID09IDAgYW5kIExhc3Q9MSkKLSAgIExldmVsIC0gMSBJbmRleGVkCi0gICBwYWRkZWQgYXJtVkNNNFAyX0ludHJhTDBMMUxNQVhbMTUtMzFdIHdpdGggemVyb3MgdG8gYWNlc3MgZW50cmllcyBmb3IgTGFzdD0xIGVmZmVjdGl2ZWx5Ci0KLSovCi1jb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDBMMUxNQVhbNTNdID0gCi17Ci0gICAyNywgMTAsICA1LCAgNCwgIDMsICAzLCAgMywgIAotICAgIDMsICAyLCAgMiwgIDEsICAxLCAgMSwgIDEsICAxLAkwLAotCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCi0JMCwJMCwJMCwJMCwJMCwJMCwJMCwJMCwKLQotCTgsICAzLCAgMiwgIDIsICAyLCAgMiwgIDIsICAxLCAKLQkxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKLQkxLCAgMSwgIDEsICAxLCAgMQotfTsKLQotCi0vKiBSTUFYIHRhYmxlIGZvciBub24gSW50ZXIgKExhc3QgPT0gMCBhbmQgTGFzdD0xKQotICAgTGV2ZWwgLSAxIEluZGV4ZWQgCi0gcGFkZGVkIGFybVZDTTRQMl9JbnRyYUwwTDFSTUFYWzI3LTMxXSB3aXRoIHplcm9zIHRvIGFjY2VzcyBlbnRyaWVzIGZvciBMYXN0PTEgdGFibGUgZWZmZWN0aXZlbHkgKi8KLQotCi1jb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDBMMVJNQVhbNDBdID0KLXsKLSAgIDE0LCAgOSwgIDcsICAzLCAgMiwgIDEsCTEsICAKLSAgICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsIAkwLCAgCi0gICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIAotICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCi0JMCwJMCwJMCwJMCwKLQkKLQkyMCwgIDYsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAKLQotfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfTG9va3VwX1RhYmxlcy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9Mb29rdXBfVGFibGVzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NzM5YTUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9Mb29rdXBfVGFibGVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0gLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9Mb29rdXBfVGFibGVzLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBGaWxlOiAgICAgICAgYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYwotICogRGVzY3JpcHRpb246IENvbnRhaW5zIGFsbCB0aGUgTG9va3VwIHRhYmxlcyB1c2VkIGluIE1QRUc0IGNvZGVjCi0gKgotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotCi0gICAgLyogKiBUYWJsZSBFbnRyaWVzIGNvbnRhaW4gRGMgU2NhbGVyIHZhbHVlcwotICAgICAgICogYXJtVkNNNFAyX0RDU2NhbGVyW2ldPSA4ICAgICAgICAgICBmb3IgaT0xICB0byAgNCBhbmQgaT0zMyB0byAzNgotICAgICAgICogICAgICAgICAgICAgICAgICAgICAgPSAyKmkgICAgICAgICBmb3IgaT01ICB0byAgOAotICAgICAgICogICAgICAgICAgICAgICAgICAgICAgPSBpKzggICAgICAgICBmb3IgaT05ICB0byAgMjUKLSAgICAgICAqICAgICAgICAgICAgICAgICAgICAgID0gMippLTE2ICAgICAgZm9yIGk9MjYgdG8gIDMxCi0gICAgICAgKiAgICAgICAgICAgICAgICAgICAgICA9IChpLTMyKzEzKS8yIGZvciBpPTM3IHRvICA1OQotICAgICAgICogICAgICAgICAgICAgICAgICAgICAgPSBpLTYtMzIgICAgICBmb3IgaT02MCB0byAgNjMKLSAgICAgICAqICAgICAgICAgICAgICAgICAgICAgID0gMjU1ICAgICAgICAgZm9yIGk9MCBhbmQgaT0zMgotICAgICAgICovCi0gICAgICAgCi1jb25zdCBPTVhfVTggYXJtVkNNNFAyX0RDU2NhbGVyWzY0XT17Ci0JMHhmZiwgMHg4LCAgMHg4LCAgMHg4LCAgMHg4LCAgMHhhLCAgMHhjLCAgMHhlLCAgCi0gICAgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgCi0gICAgMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwKLSAgICAweDIwLCAweDIyLCAweDI0LCAweDI2LCAweDI4LCAweDJhLCAweDJjLCAweDJlLAotICAgIDB4ZmYsIDB4OCwgIDB4OCwgIDB4OCwgIDB4OCwgIDB4OSwgIDB4OSwgIDB4YSwgIAotICAgIDB4YSwgIDB4YiwgIDB4YiwgIDB4YywgIDB4YywgIDB4ZCwgIDB4ZCwgIDB4ZSwgIAotICAgIDB4ZSwgIDB4ZiwgIDB4ZiwgIDB4MTAsIDB4MTAsIDB4MTEsIDB4MTEsIDB4MTIsIAotICAgIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIDB4MTgsIDB4MTksCi0KLX07Ci0KLSAgICAgICAgICAgICAgCi0gICAgIC8qICBUYWJsZSBFbnRyaWVzIENvbnRhaW4gcmVjaXByb2NhbCBvZiAxIHRvIDYzCi0gICAgICAqICBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMTZbaV09cm91bmQoMzI3NjcvaSkKLSAgICAgICogIGFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MxNlswXT0gMAotICAgICAgKi8KLQotY29uc3QgT01YX1MxNiBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMTZbNjRdPXsKLQkweDAwMDAsMHg3ZmZmLDB4NDAwMCwweDJhYWEsMHgyMDAwLDB4MTk5OSwweDE1NTUsMHgxMjQ5LAotICAgIDB4MTAwMCwweDBlMzksMHgwY2NkLDB4MGJhMywweDBhYWIsMHgwOWQ5LDB4MDkyNSwweDA4ODgsCi0gICAgMHgwODAwLDB4MDc4NywweDA3MWMsMHgwNmJkLDB4MDY2NiwweDA2MTgsMHgwNWQxLDB4MDU5MSwKLSAgICAweDA1NTUsMHgwNTFmLDB4MDRlYywweDA0YmUsMHgwNDkyLDB4MDQ2YSwweDA0NDQsMHgwNDIxLAotICAgIDB4MDQwMCwweDAzZTEsMHgwM2M0LDB4MDNhOCwweDAzOGUsMHgwMzc2LDB4MDM1ZSwweDAzNDgsCi0gICAgMHgwMzMzLDB4MDMxZiwweDAzMGMsMHgwMmZhLDB4MDJlOSwweDAyZDgsMHgwMmM4LDB4MDJiOSwKLSAgICAweDAyYWIsMHgwMjlkLDB4MDI4ZiwweDAyODIsMHgwMjc2LDB4MDI2YSwweDAyNWYsMHgwMjU0LAotICAgIDB4MDI0OSwweDAyM2YsMHgwMjM1LDB4MDIyYiwweDAyMjIsMHgwMjE5LDB4MDIxMSwweDAyMDgKLQkgICAKLX07Ci0gICAgIAotICAgICAgLyogVGFibGUgRW50cmllcyBDb250YWluIHJlY2lwcm9jYWwgb2YgMSB0byA2MwotICAgICAgICogYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzMyW2ldPXJvdW5kKDEzMTA3MS9pKQotICAgICAgICogYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzMyWzBdPSAwCi0gICAgICAgKi8KLQotY29uc3QgT01YX1MzMiBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMzJbNjRdPXsKLQkweDAwMDAwMDAwLDB4MDAwMWZmZmYsMHgwMDAxMDAwMCwweDAwMDBhYWFhLCAweDAwMDA4MDAwLCAweDAwMDA2NjY2LCAweDAwMDA1NTU1LCAweDAwMDA0OTI0LAotICAgIDB4MDAwMDQwMDAsMHgwMDAwMzhlMywweDAwMDAzMzMzLDB4MDAwMDJlOGMsIDB4MDAwMDJhYWIsIDB4MDAwMDI3NjIsIDB4MDAwMDI0OTIsIDB4MDAwMDIyMjIsCi0gICAgMHgwMDAwMjAwMCwweDAwMDAxZTFlLDB4MDAwMDFjNzIsMHgwMDAwMWFmMiwgMHgwMDAwMTk5YSwgMHgwMDAwMTg2MSwgMHgwMDAwMTc0NiwgMHgwMDAwMTY0MywKLSAgICAweDAwMDAxNTU1LDB4MDAwMDE0N2IsMHgwMDAwMTNiMSwweDAwMDAxMmY2LCAweDAwMDAxMjQ5LCAweDAwMDAxMWE4LCAweDAwMDAxMTExLCAweDAwMDAxMDg0LAotICAgIDB4MDAwMDEwMDAsMHgwMDAwMGY4NCwweDAwMDAwZjBmLDB4MDAwMDBlYTEsIDB4MDAwMDBlMzksIDB4MDAwMDBkZDYsIDB4MDAwMDBkNzksIDB4MDAwMDBkMjEsCi0gICAgMHgwMDAwMGNjZCwweDAwMDAwYzdkLDB4MDAwMDBjMzEsMHgwMDAwMGJlOCwgMHgwMDAwMGJhMywgMHgwMDAwMGI2MSwgMHgwMDAwMGIyMSwgMHgwMDAwMGFlNSwKLSAgICAweDAwMDAwYWFiLDB4MDAwMDBhNzMsMHgwMDAwMGEzZCwweDAwMDAwYTBhLCAweDAwMDAwOWQ5LCAweDAwMDAwOWE5LCAweDAwMDAwOTdiLCAweDAwMDAwOTRmLAotICAgIDB4MDAwMDA5MjUsMHgwMDAwMDhmYiwweDAwMDAwOGQ0LDB4MDAwMDA4YWUsIDB4MDAwMDA4ODksIDB4MDAwMDA4NjUsIDB4MDAwMDA4NDIsIDB4MDAwMDA4MjAKLQkKLX07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1NldFByZWREaXJfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9TZXRQcmVkRGlyX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBkMTNkMS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1NldFByZWREaXJfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDJfU2V0UHJlZERpcl9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi07ICoqCi07ICogRnVuY3Rpb246IGFybVZDTTRQMl9TZXRQcmVkRGlyCi07ICoKLTsgKiBEZXNjcmlwdGlvbjoKLTsgKiBQZXJmb3JtcyBkZXRlY3RpbmcgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uCi07ICoKLTsgKiBSZW1hcmtzOgotOyAqCi07ICogUGFyYW1ldGVyczoKLTsgKiBbaW5dIGJsb2NrSW5kZXggIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZAotOyAqICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiBhcyBkZWZpbmVkIGluIHN1YmNsYXVzZSA2LjEuMy44LCBvZiBJU08vSUVDCi07ICogICAgICAgICAgICAgICAgICAgICAgICAgIDE0NDk2LTIuIEZ1cnRoZXJtb3JlLCBpbmRleGVzIDYgdG8gOSBpbmRpY2F0ZSB0aGUKLTsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgYmxvY2tzIHNwYXRpYWxseSBjb3JyZXNwb25kaW5nIHRvIGx1bWluYW5jZQotOyAqICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja3MgMCB0byAzIGluIHRoZSBzYW1lIG1hY3JvYmxvY2suCi07ICogW2luXSBwQ29lZkJ1ZlJvdyBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyCi07ICogW2luXSBwUXBCdWYgICAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlcgotOyAqIFtvdXRdcHJlZFFQICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrCi07ICogW291dF1wcmVkRGlyICAgICBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZQotOyAqICAgICAgICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Ci07ICogICAgICAgICAgICAgICAgICBPTVhfVkNfSE9SSVpPTlRBTCAgICBwcmVkaWN0IGhvcml6b250YWxseQotOyAqICAgICAgICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMICAgICAgcHJlZGljdCB2ZXJ0aWNhbGx5Ci07ICoKLTsgKiBSZXR1cm4gVmFsdWU6Ci07ICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi07ICoKLTsgKi8KLQotICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgIElOQ0xVREUgb214VkNfcy5oCi0KLQotICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLQotICAgICAgIElGIEFSTTExMzZKUwotIAotOy8vIElucHV0IEFyZ3VtZW50cwotQmxvY2tJbmRleCAgICAgICAgIFJOIDAKLXBDb2VmQnVmUm93ICAgICAgICBSTiAxCi1wQ29lZkJ1ZkNvbCAgICAgICAgUk4gMgotcHJlZERpciAgICAgICAgICAgIFJOIDMKLXByZWRRUCAgICAgICAgICAgICBSTiA0Ci1wUXBCdWYgICAgICAgICAgICAgUk4gNQotCi07Ly8gTG9jYWwgVmFyaWFibGVzCi0KLVJldHVybiAgICAgICAgICAgICBSTiAwCi1ibG9ja0RDTGVmdCAgICAgICAgUk4gNiAgCi1ibG9ja0RDVG9wICAgICAgICAgUk4gNwotYmxvY2tEQ1RvcExlZnQgICAgIFJOIDgKLXRlbXAxICAgICAgICAgICAgICBSTiA5Ci10ZW1wMiAgICAgICAgICAgICAgUk4gMTQKLQotICAgICAgIE1fU1RBUlQgICAgYXJtVkNNNFAyX1NldFByZWREaXIscjkKLQotICAgICAgIE1fQVJHICAgICAgIHBwcmVkUVAsNAotICAgICAgIE1fQVJHICAgICAgIHBwUXBCdWYsNAotICAgIAotICAgICAgIExEUkggICAgICAgIGJsb2NrRENUb3BMZWZ0LFtwQ29lZkJ1ZlJvdywjLTE2XQotICAgICAgIExEUkggICAgICAgIGJsb2NrRENMZWZ0LFtwQ29lZkJ1ZkNvbF0KLSAgICAgICAKLSAgICAgICBURVEgICAgICAgICBCbG9ja0luZGV4LCMzCi0gICAgICAgTERSRVFIICAgICAgYmxvY2tEQ1RvcCxbcENvZWZCdWZDb2wsIy0xNl0KLSAgICAgICBMRFJORUggICAgICBibG9ja0RDVG9wLFtwQ29lZkJ1ZlJvd10KLSAgICAgICAgICAgICAKLSAgICAgICBTVUJTICAgICAgICB0ZW1wMSxibG9ja0RDTGVmdCxibG9ja0RDVG9wTGVmdAotICAgICAgIFJTQkxUICAgICAgIHRlbXAxLHRlbXAxLCMwCi0gICAgICAgU1VCUyAgICAgICAgdGVtcDIsYmxvY2tEQ1RvcExlZnQsYmxvY2tEQ1RvcAotICAgICAgIFJTQkxUICAgICAgIHRlbXAyLHRlbXAyLCMwCi0gICAgICAKLSAgICAgICBNX0xEUiAgICAgICBwUXBCdWYscHBRcEJ1ZgotICAgICAgIE1fTERSICAgICAgIHByZWRRUCxwcHJlZFFQCi0gICAgICAgQ01QICAgICAgICAgdGVtcDEsdGVtcDIKLSAgICAgICBNT1YgICAgICAgICB0ZW1wMiwjT01YX1ZDX1ZFUlRJQ0FMCi0gICAgICAgTERSTFRCICAgICAgdGVtcDEsW3BRcEJ1ZiwjMV0KLSAgICAgICBTVFJMVCAgICAgICB0ZW1wMixbcHJlZERpcl0KLSAgICAgICBTVFJMVCAgICAgICB0ZW1wMSxbcHJlZFFQXQotICAgICAgIE1PViAgICAgICAgIHRlbXAyLCNPTVhfVkNfSE9SSVpPTlRBTCAgICAgICAgICAgCi0gICAgICAgTERSR0VCICAgICAgdGVtcDEsW3BRcEJ1Zl0KLSAgICAgICBTVFJHRSAgICAgICB0ZW1wMixbcHJlZERpcl0KLSAgICAgICBNT1YgICAgICAgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIKLSAgICAgICBTVFJHRSAgICAgICB0ZW1wMSxbcHJlZFFQXSAKLQotICAgICAgICAgCi0gICAgCi0gICAgICAgTV9FTkQKLSAKLSAgICAgICBFTkRJRgotCi0gICAgICAgRU5EICAgIAotICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY0NzU1OS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfWmlnemFnX1RhYmxlcy5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRmlsZTogICAgICAgIGFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmMKLSAqIERlc2NyaXB0aW9uOiBDb250YWlucyB0aGUgemlnemFnIHRhYmxlcwotICoKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLQotLyogQ29udGFpbnMgRG91YmxlIHRoZSB2YWx1ZXMgaW4gdGhlIHJlZmVyZW5jZSBaaWd6YWcgVGFibGUKLSAqIENvbnRhaW5zIENsYXNzaWNhbCxWZXRpY2FsIGFuZCBIb3Jpem9udGFsIFppZ3phZ3NjYW4gdGFibGVzIGluIG9uZSBhcnJheSAgCi0gKi8KLQotY29uc3QgT01YX1U4IGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiBbMTkyXSA9IAotewotICAgICAwLCAgMiwgIDE2LCAzMiwgIDE4LCAgNCwgIDYsIDIwLAotICAgIDM0LCA0OCwgNjQsIDUwLCAzNiwgMjIsICA4LCAgMTAsCi0gICAgMjQsIDM4LCA1MiwgNjYsIDgwLCA5NiwgODIsIDY4LAotICAgIDU0LCA0MCwgMjYsICAxMiwgIDE0LCAyOCwgNDIsIDU2LCAKLSAgICA3MCwgODQsIDk4LCAxMTIsIDExNCwgMTAwLCA4NiwgNzIsCi0gICAgNTgsIDQ0LCAzMCwgNDYsIDYwLCA3NCwgODgsIDEwMiwKLSAgICAxMTYsIDExOCwgMTA0LCA5MCwgNzYsIDYyLCA3OCwgOTIsCi0gICAgMTA2LCAxMjAsIDEyMiwgMTA0LCA5NCwgMTEwLCAxMjQsIDEyNiwKLQotCTAsICAxNiwgMzIsIDQ4LCAgMiwgIDE4LCAgNCwgMjAsCi0gICAgMzQsIDUwLCA2NCwgODAsIDk2LCAxMTIsIDExNCwgOTgsCi0gICAgODIsIDY2LCA1MiwgMzYsICA2LCAyMiwgIDgsIDI0LAotICAgIDM4LCA1NCwgNjgsIDg0LCAxMDAsIDExNiwgNzAsIDg2LAotICAgIDEwMiwgMTE4LCA0MCwgNTYsICAxMCwgMjYsICAxMiwgMjgsCi0gICAgNDIsIDU4LCA3MiwgODgsIDEwNCwgMTIwLCA3NCwgOTAsIAotICAgIDEwNiwgMTIyLCA0NCwgNjAsICAxNCwgMzAsIDQ2LCA2MiwKLSAgICA3NiwgOTIsIDEwOCwgMTI0LCA3OCwgOTQsIDExMCwgMTI2LAotCi0gICAgMCwgIDIsICA0LCAgNiwgIDE2LCAgMTgsIDMyLCAzNCwKLSAgICAyMCwgMjIsICA4LCAgMTAsICAxMiwgIDE0LCAzMCwgMjgsCi0gICAgMjYsIDI0LCAzOCwgMzYsIDQ4LCA1MCwgNjQsIDY2LAotICAgIDUyLCA1NCwgNDAsIDQyLCA0NCwgNDYsIDU2LCA1OCwKLSAgICA2MCwgNjIsIDY4LCA3MCwgODAsIDgyLCA5NiwgOTgsCi0gICAgODQsIDg2LCA3MiwgNzQsIDc2LCA3OCwgODgsIDkwLCAKLSAgICA5MiwgOTQsIDEwMCwgMTAyLCAxMTIsIDExNCwgMTE2LCAxMTgsCi0gICAgMTA0LCAxMDYsIDEwOCwgMTEwLCAxMjAsIDEyMiwgMTI0LCAxMjYKLQotCi19OwotCi0KLQotCi0KLS8qIEVuZCBvZiBmaWxlICovCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNzc3MmEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246IAotICogQ29udGFpbnMgbW9kdWxlcyBmb3IgaW50ZXIgcmVjb25zdHJ1Y3Rpb24KLSAqIAotICovCi0gCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlcgotICoKLSAqIERlc2NyaXB0aW9uOgotICogRGVjb2RlcyB0aGUgSU5URVIgYmxvY2sgY29lZmZpY2llbnRzLiBJbnZlcnNlIHF1YW50aXphdGlvbiwgaW52ZXJzZWx5IHppZ3phZwotICogcG9zaXRpb25pbmcgYW5kIElEQ1QsIHdpdGggYXBwcm9wcmlhdGUgY2xpcHBpbmcgb24gZWFjaCBzdGVwLCBhcmUgcGVyZm9ybWVkCi0gKiBvbiB0aGUgY29lZmZpY2llbnRzLiBUaGUgcmVzdWx0cyAocmVzaWR1YWxzKSBhcmUgcGxhY2VkIGluIGEgY29udGlndW91cyBhcnJheQotICogb2YgNjQgZWxlbWVudHMuIEZvciBJTlRFUiBibG9jaywgdGhlIG91dHB1dCBidWZmZXIgaG9sZHMgdGhlIHJlc2lkdWFscyBmb3IKLSAqIGZ1cnRoZXIgcmVjb25zdHJ1Y3Rpb24uCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi0gKgkJCQkJCQkJdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiBUaGVyZSBpcyBubyBib3VuZGFyeQotICoJCQkJCQkJCWNoZWNrIGZvciB0aGUgYml0IHN0cmVhbSBidWZmZXIuCi0gKiBbaW5dCXBCaXRPZmZzZXQJCXBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi0gKgkJCQkJCQkJdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4KLSAqCQkJCQkJCQlbMC03XQotICogW2luXQlRUAkJCQlxdWFudGl6YXRpb24gcGFyYW1ldGVyCi0gKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgICAgYSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOwotICogICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xIGluZGljYXRlcyB1c2luZyBxdWFudGl6YXRpb24gbWV0aG9kIGRlZmluZWQgaW4gc2hvcnQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8gaGVhZGVyIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIGluZGljYXRlcyBub3JtYWlsIHF1YW50aXphdGlvbiBtZXRob2QuCi0gKiBbb3V0XSBwcEJpdFN0cmVhbSAJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQsIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4KLSAqIFtvdXRdIHBCaXRPZmZzZXQJCSpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbQotICogW291dF0gcERzdAkJCXBvaW50ZXIgdG8gdGhlIGRlY29kZWQgcmVzaWR1YWwgYnVmZmVyIChhIGNvbnRpZ3VvdXMgYXJyYXkgb2YgNjQgZWxlbWVudHMgb2YKLSAqICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMTYgZGF0YSB0eXBlKS4gTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1N0c19Ob0VyciAtIG5vIGVycm9yCi0gKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKLSAqICAgLSBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOdWxsOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0ICwgcERzdAotICogICAtIEF0IGxlYXN0IG9uZSBvZiB0aGUgYmVsb3cgY2FzZToKLSAqICAgLSAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddLCBRUCA8PSAwOwotICoJIC0gcERzdCBub3QgMTYtYnl0ZSBhbGlnbmVkCi0gKiBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvcgotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIoCi0gICAgIGNvbnN0IE9NWF9VOCAqKiBwcEJpdFN0cmVhbSwKLSAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCi0gICAgIE9NWF9TMTYgKiBwRHN0LAotICAgICBPTVhfSU5UIFFQLAotICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSkKLXsKLSAgICAvKiA2NCBlbGVtZW50cyBhcmUgbmVlZGVkIGJ1dCB0byBhbGlnbiBpdCB0byAxNiBieXRlcyBuZWVkCi0gICAgMTUgbW9yZSBlbGVtZW50cyBvZiBwYWRkaW5nICovCi0gICAgT01YX1MxNiB0ZW1wQnVmWzc5XTsKLSAgICBPTVhfUzE2ICpwVGVtcEJ1ZjE7Ci0gICAgT01YUmVzdWx0IGVycm9yQ29kZTsKLSAgICAvKiBBbGlnbmluZyB0aGUgbG9jYWwgYnVmZmVycyAqLwotICAgIHBUZW1wQnVmMSA9IGFybUFsaWduVG8xNkJ5dGVzKHRlbXBCdWYpOwotICAgIAotICAgIAotICAgIC8qIFZMRCBhbmQgemlnemFnICovCi0gICAgZXJyb3JDb2RlID0gb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcihwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBCdWYxLHNob3J0VmlkZW9IZWFkZXIpOwotICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOwotICAgIAotICAgIC8qIERlcXVhbnRpemF0aW9uICovCi0gICAgZXJyb3JDb2RlID0gb214VkNNNFAyX1F1YW50SW52SW50ZXJfSSgKLSAgICAgcFRlbXBCdWYxLAotICAgICBRUCk7Ci0gICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7Ci0gICAgCi0gICAgLyogSW52ZXJzZSB0cmFuc2Zvcm0gKi8KLSAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfSURDVDh4OGJsayhwVGVtcEJ1ZjEsIHBEc3QpOwotICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOwotCSAgICAKLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI0ZmMwNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjogCi0gKiBDb250YWlucyBtb2R1bGVzIGZvciBpbnRyYSByZWNvbnN0cnVjdGlvbgotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBEZWNvZGVzIHRoZSBJTlRSQSBibG9jayBjb2VmZmljaWVudHMuIEludmVyc2UgcXVhbnRpemF0aW9uLCBpbnZlcnNlbHkgemlnemFnCi0gKiBwb3NpdGlvbmluZywgYW5kIElEQ1QsIHdpdGggYXBwcm9wcmlhdGUgY2xpcHBpbmcgb24gZWFjaCBzdGVwLCBhcmUgcGVyZm9ybWVkCi0gKiBvbiB0aGUgY29lZmZpY2llbnRzLiBUaGUgcmVzdWx0cyBhcmUgdGhlbiBwbGFjZWQgaW4gdGhlIG91dHB1dCBmcmFtZS9wbGFuZSBvbgotICogYSBwaXhlbCBiYXNpcy4gRm9yIElOVFJBIGJsb2NrLCB0aGUgb3V0cHV0IHZhbHVlcyBhcmUgY2xpcHBlZCB0byBbMCwgMjU1XSBhbmQKLSAqIHdyaXR0ZW4gdG8gY29ycmVzcG9uZGluZyBibG9jayBidWZmZXIgd2l0aGluIHRoZSBkZXN0aW5hdGlvbiBwbGFuZS4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KLSAqCQkJCQkJCQl0aGUgYml0IHN0cmVhbSBidWZmZXIuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5Ci0gKgkJCQkJCQkJY2hlY2sgZm9yIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4KLSAqIFtpbl0JcEJpdE9mZnNldAkJcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLSAqCQkJCQkJCQl0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbgotICoJCQkJCQkJCVswLTddLgotICogW2luXQlzdGVwCQkJd2lkdGggb2YgdGhlIGRlc3RpbmF0aW9uIHBsYW5lCi0gKiBbaW4vb3V0XQlwQ29lZkJ1ZlJvdwkJW2luXSAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgotICogICAgICAgICAgICAgICAgICAgICAgICBbb3V0XSB1cGRhdGVkIGNvZWZmaWNpZW50IHJ3byBidWZmZXIKLSAqIFtpbi9vdXRdCXBDb2VmQnVmQ29sCQlbaW5dICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIFtvdXRdIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcgotICogW2luXQljdXJRUAkJCXF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIG1hY3JvYmxvY2sgd2hpY2gKLSAqCQkJCQkJCQl0aGUgY3VycmVudCBibG9jayBiZWxvbmdzIHRvCi0gKiBbaW5dCXBRcEJ1ZgkJIFBvaW50ZXIgdG8gYSAyLWVsZW1lbnQgUVAgYXJyYXkuIHBRcEJ1ZlswXSBob2xkcyB0aGUgUVAgb2YgdGhlIDh4OCBibG9jayBsZWZ0IHRvCi0gKiAgICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBibG9jayhRUGEpLiBwUXBCdWZbMV0gaG9sZHMgdGhlIFFQIG9mIHRoZSA4eDggYmxvY2sganVzdCBhYm92ZSB0aGUKLSAqICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYmxvY2soUVBjKS4KLSAqICAgICAgICAgICAgICAgICAgIE5vdGUsIGluIGNhc2UgdGhlIGNvcnJlc3BvbmRpbmcgYmxvY2sgaXMgb3V0IG9mIFZPUCBib3VuZCwgdGhlIFFQIHZhbHVlIHdpbGwgaGF2ZQotICogICAgICAgICAgICAgICAgICAgbm8gZWZmZWN0IHRvIHRoZSBpbnRyYS1wcmVkaWN0aW9uIHByb2Nlc3MuIFJlZmVyIHRvIHN1YmNsYXVzZSAgIjcuNC4zLjMgQWRhcHRpdmUKLSAqICAgICAgICAgICAgICAgICAgIGFjIGNvZWZmaWNpZW50IHByZWRpY3Rpb24iIG9mIElTTy9JRUMgMTQ0OTYtMihNUEVHNCBQYXJ0MikgZm9yIGFjY3VyYXRlIGRlc2NyaXB0aW9uLgotICogW2luXQlibG9ja0luZGV4CQlibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQKLSAqCQkJCQkJCQlwb3NpdGlvbiBhcyBkZWZpbmVkIGluIHN1YmNsYXVzZSA2LjEuMy44LAotICoJCQkJCQkJCUZpZ3VyZSA2LTUgb2YgSVNPL0lFQyAxNDQ5Ni0yLiAKLSAqIFtpbl0JaW50cmFEQ1ZMQwkJYSBjb2RlIGRldGVybWluZWQgYnkgaW50cmFfZGNfdmxjX3RociBhbmQgUVAuCi0gKgkJCQkJCQkJVGhpcyBhbGxvd3MgYSBtZWNoYW5pc20gdG8gc3dpdGNoIGJldHdlZW4gdHdvIFZMQwotICoJCQkJCQkJCWZvciBjb2Rpbmcgb2YgSW50cmEgREMgY29lZmZpY2llbnRzIGFzIHBlciBUYWJsZQotICoJCQkJCQkJCTYtMjEgb2YgSVNPL0lFQyAxNDQ5Ni0yLiAKLSAqIFtpbl0JQUNQcmVkRmxhZwkJYSBmbGFnIGVxdWFsIHRvIGFjX3ByZWRfZmxhZyAob2YgbHVtaW5hbmNlKSBpbmRpY2F0aW5nCi0gKgkJCQkJCQkJaWYgdGhlIGFjIGNvZWZmaWNpZW50cyBvZiB0aGUgZmlyc3Qgcm93IG9yIGZpcnN0Ci0gKgkJCQkJCQkJY29sdW1uIGFyZSBkaWZmZXJlbnRpYWxseSBjb2RlZCBmb3IgaW50cmEgY29kZWQKLSAqCQkJCQkJCQltYWNyb2Jsb2NrLgotICogW2luXSBzaG9ydFZpZGVvSGVhZGVyICAgIGEgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyBtb2RlLAotICoJCQkJCQkJYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub25saW5lYXIgaW50cmEgREMgbW9kZS4KLSAqIFtvdXRdCXBwQml0U3RyZWFtCQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMKLSAqCQkJCQkJCQlkZWNvZGVkLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlCi0gKgkJCQkJCQkJaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyCi0gKiBbb3V0XQlwQml0T2Zmc2V0CQkqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotICoJCQkJCQkJCWN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLSAqCQkJCQkJCQkqcHBCaXRTdHJlYW0KLSAqIFtvdXRdCXBEc3QJCQlwb2ludGVyIHRvIHRoZSBibG9jayBpbiB0aGUgZGVzdGluYXRpb24gcGxhbmUuCi0gKgkJCQkJCQkJcERzdCBzaG91bGQgYmUgMTYtYnl0ZSBhbGlnbmVkLgotICogW291dF0JcENvZWZCdWZSb3cJCXBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlci4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKLSAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cwotICogICAtCUF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb2VmQnVmUm93LCBwQ29lZkJ1ZkNvbCwgcFFQQnVmLCBwRHN0LgotICogICAgICBvcgotICogICAtICBBdCBsZWFzdCBvbmUgb2YgdGhlIGJlbG93IGNhc2U6ICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10sIGN1clFQIGV4Y2VlZHMgKDEsIDMxKSwKLSAqICAgICAgYmxvY2tJbmRleCBleGNlZWRzIFswLDldLCBzdGVwIGlzIG5vdCB0aGUgbXVsdGlwbGUgb2YgOCwgaW50cmFEQ1ZMQyBpcyB6ZXJvIHdoaWxlCi0gKiAgICAgIGJsb2NrSW5kZXggZ3JlYXRlciB0aGFuIDUuCi0gKiAgICAgIG9yCi0gKiAgIC0JcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkCi0gKiBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvcgotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYSgKLSAgICAgY29uc3QgT01YX1U4ICoqIHBwQml0U3RyZWFtLAotICAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgICBPTVhfVTggKnBEc3QsCi0gICAgIE9NWF9JTlQgc3RlcCwKLSAgICAgT01YX1MxNiAqcENvZWZCdWZSb3csCi0gICAgIE9NWF9TMTYgKnBDb2VmQnVmQ29sLAotICAgICBPTVhfVTggY3VyUVAsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFFQQnVmLAotICAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCi0gICAgIE9NWF9JTlQgaW50cmFEQ1ZMQywKLSAgICAgT01YX0lOVCBBQ1ByZWRGbGFnLAotCSBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSApCi17Ci0gICAgT01YX1MxNiB0ZW1wQnVmMVs3OV0sIHRlbXBCdWYyWzc5XTsKLSAgICBPTVhfUzE2ICpwVGVtcEJ1ZjEsICpwVGVtcEJ1ZjI7Ci0gICAgT01YX0lOVCBwcmVkRGlyLCBwcmVkQUNEaXI7Ci0gICAgT01YX0lOVCAgcHJlZFFQOwotICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcDsKLSAgICBPTVhSZXN1bHQgZXJyb3JDb2RlOwotICAgIAotICAgIAotICAgIC8qIEFsaWduaW5nIHRoZSBsb2NhbCBidWZmZXJzICovCi0gICAgcFRlbXBCdWYxID0gYXJtQWxpZ25UbzE2Qnl0ZXModGVtcEJ1ZjEpOwotICAgIHBUZW1wQnVmMiA9IGFybUFsaWduVG8xNkJ5dGVzKHRlbXBCdWYyKTsKLSAgICAKLSAgICAvKiBTZXR0aW5nIHRoZSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiBhbmQgcHJlZGljdGlvbiBkaXJlY3Rpb24gKi8KLSAgICBhcm1WQ000UDJfU2V0UHJlZERpcigKLSAgICAgICAgYmxvY2tJbmRleCwKLSAgICAgICAgcENvZWZCdWZSb3csCi0gICAgICAgIHBDb2VmQnVmQ29sLAotICAgICAgICAmcHJlZERpciwKLSAgICAgICAgJnByZWRRUCwKLSAgICAgICAgcFFQQnVmKTsKLQotICAgIHByZWRBQ0RpciA9IHByZWREaXI7Ci0KLSAgICAKLSAgICBpZiAoQUNQcmVkRmxhZyA9PSAwKQotICAgIHsKLSAgICAgICAgcHJlZEFDRGlyID0gT01YX1ZDX05PTkU7Ci0gICAgfQotCi0gICAgLyogU2V0dGluZyB0aGUgdmlkZW9Db21wICovCi0gICAgaWYgKGJsb2NrSW5kZXggPD0gMykKLSAgICB7Ci0gICAgICAgIHZpZGVvQ29tcCA9IE9NWF9WQ19MVU1JTkFOQ0U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHZpZGVvQ29tcCA9IE9NWF9WQ19DSFJPTUlOQU5DRTsKLSAgICB9Ci0gICAgCi0KLSAgICAvKiBWTEQgYW5kIHppZ3phZyAqLwotICAgIGlmIChpbnRyYURDVkxDID09IDEpCi0gICAgewotICAgICAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMoCi0gICAgICAgICAgICBwcEJpdFN0cmVhbSwKLSAgICAgICAgICAgIHBCaXRPZmZzZXQsCi0gICAgICAgICAgICBwVGVtcEJ1ZjEsCi0gICAgICAgICAgICBwcmVkQUNEaXIsCi0gICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyLAotICAgICAgICAgICAgdmlkZW9Db21wKTsKLSAgICAgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQygKLSAgICAgICAgICAgIHBwQml0U3RyZWFtLAotICAgICAgICAgICAgcEJpdE9mZnNldCwKLSAgICAgICAgICAgIHBUZW1wQnVmMSwKLSAgICAgICAgICAgIHByZWRBQ0RpciwKLSAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIpOwotICAgICAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKLSAgICB9Ci0KLSAgICAvKiBBQyBEQyBwcmVkaWN0aW9uICovCi0gICAgZXJyb3JDb2RlID0gb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSgKLSAgICAgICAgcFRlbXBCdWYxLAotICAgICAgICBwQ29lZkJ1ZlJvdywKLSAgICAgICAgcENvZWZCdWZDb2wsCi0gICAgICAgIGN1clFQLAotICAgICAgICBwcmVkUVAsCi0gICAgICAgIHByZWREaXIsCi0gICAgICAgIEFDUHJlZEZsYWcsCi0gICAgICAgIHZpZGVvQ29tcCk7Ci0gICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7Ci0gICAgCi0gICAgLyogRGVxdWFudGl6YXRpb24gKi8KLSAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JKAotICAgICBwVGVtcEJ1ZjEsCi0gICAgIGN1clFQLAotICAgICB2aWRlb0NvbXAsCi0gICAgIHNob3J0VmlkZW9IZWFkZXIpOwotICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOwotICAgIAotICAgIC8qIEludmVyc2UgdHJhbnNmb3JtICovCi0gICAgZXJyb3JDb2RlID0gb214VkNNNFAyX0lEQ1Q4eDhibGsgKHBUZW1wQnVmMSwgcFRlbXBCdWYyKTsKLSAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKLSAgICAKLSAgICAvKiBQbGFjaW5nIHRoZSBsaW5lYXIgYXJyYXkgaW50byB0aGUgZGVzdGluYXRpb24gcGxhbmUgYW5kIGNsaXBwaW5nCi0gICAgICAgaXQgdG8gMCB0byAyNTUgKi8KLSAgICAKLQlhcm1WQ000UDJfQ2xpcDgocFRlbXBCdWYyLHBEc3Qsc3RlcCk7Ci0JCi0JCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qIEVuZCBvZiBmaWxlICovCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUF9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YTAxZDcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QX3MucworKysgL2Rldi9udWxsCkBAIC0xLDM3OCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOyAqKioqKioqKioqCi07ICogCi07ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1Bfcy5zCi07ICogT3Blbk1BWCBETDogdjEuMC4yCi07ICogUmV2aXNpb246ICAgOTY0MQotOyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07ICogCi07ICogCi07ICogCi07ICogCi07ICoqCi07ICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QCi07ICoKLTsgKiBEZXNjcmlwdGlvbjoKLTsgKiBEZWNvZGVzIGFuZCBwYWRzIGZvdXIgbW90aW9uIHZlY3RvcnMgb2YgdGhlIG5vbi1pbnRyYSBtYWNyb2Jsb2NrIGluIFAtVk9QLgotOyAqIFRoZSBtb3Rpb24gdmVjdG9yIHBhZGRpbmcgcHJvY2VzcyBpcyBzcGVjaWZpZWQgaW4gc3ViY2xhdXNlIDcuNi4xLjYgb2YKLTsgKiBJU08vSUVDIDE0NDk2LTIuCi07ICoKLTsgKiBSZW1hcmtzOgotOyAqCi07ICoKLTsgKiBQYXJhbWV0ZXJzOgotOyAqIFtpbl0gICAgcHBCaXRTdHJlYW0gICAgICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgotOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlcgotOyAqIFtpbl0gICAgcEJpdE9mZnNldCAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi07ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4KLTsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC03XS4KLTsgKiBbaW5dICAgIHBTcmNNVkxlZnRNQiAgICAgICBwb2ludGVycyB0byB0aGUgbW90aW9uIHZlY3RvciBidWZmZXJzIG9mIHRoZQotOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9ja3Mgc3BlY2lhbGx5IGF0IHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jawotOyAqICAgICAgICAgICAgICAgICAgICAgcmVzcGVjdGl2ZWx5LgotOyAqIFtpbl0gICAgcFNyY01WVXBwZXJNQiAgICAgIHBvaW50ZXJzIHRvIHRoZSBtb3Rpb24gdmVjdG9yIGJ1ZmZlcnMgb2YgdGhlCi07ICogICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrcyBzcGVjaWFsbHkgYXQgdGhlIHVwcGVyIHNpZGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jawotOyAqICAgICAgICAgICAgICAgICAgICAgcmVzcGVjdGl2ZWx5LgotOyAqIFtpbl0gICAgcFNyY01WVXBwZXJSaWdodE1CIHBvaW50ZXJzIHRvIHRoZSBtb3Rpb24gdmVjdG9yIGJ1ZmZlcnMgb2YgdGhlCi07ICogICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrcyBzcGVjaWFsbHkgYXQgdGhlIHVwcGVyLXJpZ2h0IHNpZGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jawotOyAqICAgICAgICAgICAgICAgICAgICAgcmVzcGVjdGl2ZWx5LgotOyAqIFtpbl0gICAgZmNvZGVGb3J3YXJkICAgICAgIGEgY29kZSBlcXVhbCB0byB2b3BfZmNvZGVfZm9yd2FyZCBpbiBNUEVHLTQKLTsgKiAgICAgICAgICAgICAgICAgICAgIGJpdCBzdHJlYW0gc3ludGF4Ci07ICogW2luXSAgICBNQlR5cGUgICAgICAgICB0aGUgdHlwZSBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLiBJZiBNQlR5cGUKLTsgKiAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCBlcXVhbCB0byBPTVhfVkNfSU5URVI0ViwgdGhlIGRlc3RpbmF0aW9uCi07ICogICAgICAgICAgICAgICAgICAgICBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBpcyBzdGlsbCBmaWxsZWQgd2l0aCB0aGUKLTsgKiAgICAgICAgICAgICAgICAgICAgIHNhbWUgZGVjb2RlZCB2ZWN0b3IuCi07ICogW291dF0gICBwcEJpdFN0cmVhbSAgICAgICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkLAotOyAqICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0Ci07ICogICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyCi07ICogW291dF0gICBwQml0T2Zmc2V0ICAgICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLTsgKiAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLTsgKiAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbQotOyAqIFtvdXRdICAgcERzdE1WQ3VyTUIgICAgICAgICBwb2ludGVyIHRvIHRoZSBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBvZiB0aGUgY3VycmVudAotOyAqICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9jayB3aGljaCBjb250YWlucyBmb3VyIGRlY29kZWQgbW90aW9uIHZlY3RvcnMKLTsgKgotOyAqIFJldHVybiBWYWx1ZToKLTsgKiBPTVhfU3RzX05vRXJyIC1ubyBlcnJvcgotOyAqIAotOyAqICAgICAgICAgICAgICAgICAgICAgCi07ICogT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IKLTsgKgotOyAqCi0gICAgIAotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9CaXREZWNfcy5oCi0gICAgICAgIElOQ0xVREUgb214VkNfcy5oCi0gICAgICAgIAotICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0gICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICBJRiBBUk0xMTM2SlMKLQotOy8vSW5wdXQgQXJndW1lbnRzCi0KLXBwQml0U3RyZWFtICAgICAgICAgICBSTiAwCi1wQml0T2Zmc2V0ICAgICAgICAgICAgUk4gMQotcFNyY01WTGVmdE1CICAgICAgICAgIFJOIDIKLXBTcmNNVlVwcGVyTUIgICAgICAgICBSTiAzCi1wU3JjTVZVcHBlclJpZ2h0TUIgICAgUk4gNAotcERzdE1WQ3VyTUIgICAgICAgICAgIFJOIDUKLWZjb2RlRm9yd2FyZCAgICAgICAgICBSTiA2Ci1NQlR5cGUgICAgICAgICAgICAgICAgUk4gNwotCi07Ly9Mb2NhbCBWYXJpYWJsZXMKLQotemVybyAgICAgICAgICAgICAgICAgIFJOIDQKLW9uZSAgICAgICAgICAgICAgICAgICBSTiA0Ci1zY2FsZUZhY3RvciAgICAgICAgICAgUk4gMQotCi0KLVJldHVybiAgICAgICAgICAgICAgICBSTiAwCi0KLVZsY01WRCAgICAgICAgICAgICAgICBSTiAwCi1pbmRleCAgICAgICAgICAgICAgICAgUk4gNAotQ291bnQgICAgICAgICAgICAgICAgIFJOIDcKLQotbXZIb3JEYXRhICAgICAgICAgICAgIFJOIDQKLW12SG9yUmVzaWR1YWwgICAgICAgICBSTiAwCi0KLW12VmVyRGF0YSAgICAgICAgICAgICBSTiA0ICAgICAgICAgICAgIAotbXZWZXJSZXNpZHVhbCAgICAgICAgIFJOIDAKLQotdGVtcCAgICAgICAgICAgICAgICAgIFJOIDEKLQotdGVtcDEgICAgICAgICAgICAgICAgIFJOIDMKLUhpZ2ggICAgICAgICAgICAgICAgICBSTiA0Ci1Mb3cgICAgICAgICAgICAgICAgICAgUk4gMgotUmFuZ2UgICAgICAgICAgICAgICAgIFJOIDEKLQotQmxrQ291bnQgICAgICAgICAgICAgIFJOIDE0Ci0KLWRpZmZNVmR4ICAgICAgICAgICAgICBSTiAwCi1kaWZmTVZkeSAgICAgICAgICAgICAgUk4gMQotCi07Ly8gU2NyYXRjaCBSZWdpc3RlcnMKLQotUkJpdFN0cmVhbSAgICAgICAgICAgIFJOIDgKLVJCaXRDb3VudCAgICAgICAgICAgICBSTiA5Ci1SQml0QnVmZmVyICAgICAgICAgICAgUk4gMTAKLQotVDEgICAgICAgICAgICAgICAgICAgIFJOIDExCi1UMiAgICAgICAgICAgICAgICAgICAgUk4gMTIKLUxSICAgICAgICAgICAgICAgICAgICBSTiAxNAotCi0gICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9hVmxjTVZECi0gICAgICAgSU1QT1JUICAgICAgICAgIG9teFZDTTRQMl9GaW5kTVZwcmVkCi0KLSAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5ICAgICAgICAKLSAgICAgICAKLSAgICAgICBNX0FMTE9DNCAgICAgICAgcHBEc3RNVkN1ck1CLDQKLSAgICAgICBNX0FMTE9DNCAgICAgICAgcERzdE1WUHJlZE1FLDQKLSAgICAgICBNX0FMTE9DNCAgICAgICAgcEJsa0NvdW50LDQKLSAgICAgICAKLSAgICAgICBNX0FMTE9DNCAgICAgICAgcHBwQml0U3RyZWFtLDQKLSAgICAgICBNX0FMTE9DNCAgICAgICAgcHBCaXRPZmZzZXQsNAotICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFNyY01WTGVmdE1CLDQKLSAgICAgICBNX0FMTE9DNCAgICAgICAgcHBTcmNNVlVwcGVyTUIsNAotICAgICAgIAotICAgICAgIE1fQUxMT0M0ICAgICAgICBwZGlmZk1WZHgsNAotICAgICAgIE1fQUxMT0M0ICAgICAgICBwZGlmZk1WZHksNAotICAgICAgIE1fQUxMT0M0ICAgICAgICBwSGlnaCw0Ci0gICAgICAgCi0gICAgICAgICAgICAgIAotCi0KLSAgICAgICBNX1NUQVJUICAgb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AscjExCi0gICAgICAgCi0gICAgICAgTV9BUkcgICAgICAgICAgIHBTcmNNVlVwcGVyUmlnaHRNQm9uU3RhY2ssNCAgICAgICAgICAgOy8vIHBvaW50ZXIgdG8gIHBTcmNNVlVwcGVyUmlnaHRNQiBvbiBzdGFjawotICAgICAgIE1fQVJHICAgICAgICAgICBwRHN0TVZDdXJNQm9uU3RhY2ssNCAgICAgICAgICAgICAgICAgIDsvLyBwb2ludGVyIHRvIHBEc3RNVkN1ck1CIG9uIHN0YWNrCi0gICAgICAgTV9BUkcgICAgICAgICAgIGZjb2RlRm9yd2FyZG9uU3RhY2ssNCAgICAgICAgICAgICAgICAgOy8vIHBvaW50ZXIgdG8gZmNvZGVGb3J3YXJkIG9uIHN0YWNrIAotICAgICAgIE1fQVJHICAgICAgICAgICBNQlR5cGVvblN0YWNrLDQgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwb2ludGVyIHRvIE1CVHlwZSBvbiBzdGFjawotCi0gICAgICAKLSAgICAgICAKLSAgICAgICAKLSAgICAgICAKLSAgICAgICA7Ly8gSW5pdGlhbGl6aW5nIHRoZSBCaXRTdHJlYW0gTWFjcm8KLQotICAgICAgIE1fQkRfSU5JVDAgICAgICBwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgUkJpdFN0cmVhbSwgUkJpdEJ1ZmZlciwgUkJpdENvdW50Ci0gICAgICAgTV9MRFIgICAgICAgICAgIE1CVHlwZSxNQlR5cGVvblN0YWNrICAgICAgICAgICAgICAgICAgOy8vIExvYWQgTUJUeXBlIGZyb20gc3RhY2sKLSAgICAgICBNX0xEUiAgICAgICAgICAgcERzdE1WQ3VyTUIscERzdE1WQ3VyTUJvblN0YWNrICAgICAgICA7Ly8gTG9hZCBwRHN0TVZDdXJNQiBmcm9tIHN0YWNrCi0gICAgICAgTU9WICAgICAgICAgICAgIHplcm8sIzAKLQotICAgICAgIFRFUSAgICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRSQSAgICAgICAgICAgICAgICAgIDsvLyBDaGVjayBpZiBNQlR5cGU9T01YX1ZDX0lOVFJBCi0gICAgICAgVEVRTkUgICAgICAgICAgIE1CVHlwZSwjT01YX1ZDX0lOVFJBX1EgICAgICAgICAgICAgICAgOy8vIGNoZWNrIGlmIE1CVHlwZT1PTVhfVkNfSU5UUkFfUQotICAgICAgIFNUUkVRICAgICAgICAgICB6ZXJvLFtwRHN0TVZDdXJNQl0KLSAgICAgICBNX0JEX0lOSVQxICAgICAgVDEsIFQyLCBUMgotICAgICAgIFNUUkVRICAgICAgICAgICB6ZXJvLFtwRHN0TVZDdXJNQiwjNF0KLSAgICAgICBNX0JEX0lOSVQyICAgICAgVDEsIFQyLCBUMgotICAgICAgIFNUUkVRICAgICAgICAgICB6ZXJvLFtwRHN0TVZDdXJNQiwjNF0KLSAgICAgICBNT1ZFUSAgICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyCi0gICAgICAgTU9WICAgICAgICAgICAgIEJsa0NvdW50LCMwCi0gICAgICAgU1RSRVEgICAgICAgICAgIHplcm8sW3BEc3RNVkN1ck1CLCM0XQotICAgICAgIAotICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0T0sKLQotICAgICAgIFRFUSAgICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRFUjRWICAgICAgICAgICAgICAgIDsvLyBDaGVjayBpZiBNQlR5cGU9T01YX1ZDX0lOVEVSNFYKLSAgICAgICBURVFORSAgICAgICAgICAgTUJUeXBlLCNPTVhfVkNfSU5URVI0Vl9RICAgICAgICAgICAgICA7Ly8gQ2hlY2sgaWYgTUJUeXBlPU9NWF9WQ19JTlRFUjRWX1EKLSAgICAgICBNT1ZFUSAgICAgICAgICAgQ291bnQsIzQKLQotICAgICAgIFRFUSAgICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRFUiAgICAgICAgICAgICAgICAgIDsvLyBDaGVjayBpZiBNQlR5cGU9T01YX1ZDX0lOVEVSCi0gICAgICAgVEVRTkUgICAgICAgICAgIE1CVHlwZSwjT01YX1ZDX0lOVEVSX1EgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIE1CVHlwZT1PTVhfVkNfSU5URVJfUQotICAgICAgIE1PVkVRICAgICAgICAgICBDb3VudCwjMQotICAgICAgIAotICAgICAgIE1fTERSICAgICAgICAgICBmY29kZUZvcndhcmQsZmNvZGVGb3J3YXJkb25TdGFjayAgICAgIDsvLyBMb2FkIGZjb2RlRm9yd2FyZCAgZnJvbSBzdGFjawotCi0gICAgICAgOy8vIFN0b3JpbmcgdGhlIHZhbHVlcyB0ZW1wb3JhcmlseSBvbiBzdGFjawotCi0gICAgICAgTV9TVFIgICAgICAgICAgIHBwQml0U3RyZWFtLHBwcEJpdFN0cmVhbSAgICAgICAgICAgICAgCi0gICAgICAgTV9TVFIgICAgICAgICAgIHBCaXRPZmZzZXQscHBCaXRPZmZzZXQKLSAgICAgICAgICAgIAotCi0gICAgICAgU1VCICAgICAgICAgICAgIHRlbXAsZmNvZGVGb3J3YXJkLCMxICAgICAgICAgICAgICAgICAgOy8vIHRlbXA9ZmNvZGVGb3J3YXJkLTEKLSAgICAgICBNT1YgICAgICAgICAgICAgb25lLCMxCi0gICAgICAgTV9TVFIgICAgICAgICAgIHBTcmNNVkxlZnRNQixwcFNyY01WTGVmdE1CCi0gICAgICAgTFNMICAgICAgICAgICAgIHNjYWxlRmFjdG9yLG9uZSx0ZW1wICAgICAgICAgICAgICAgICAgOy8vIHNjYWxlRmFjdG9yPTE8PChmY29kZUZvcndhcmQtMSkKLSAgICAgICBNX1NUUiAgICAgICAgICAgcFNyY01WVXBwZXJNQixwcFNyY01WVXBwZXJNQgotICAgICAgIExTTCAgICAgICAgICAgICBzY2FsZUZhY3RvcixzY2FsZUZhY3RvciwjNSAgICAgICAgICAgIAotICAgICAgIE1fU1RSICAgICAgICAgICBzY2FsZUZhY3RvcixwSGlnaCAgICAgICAgICAgICAgICAgICAgIDsvLyBbcEhpZ2hdPTMyKnNjYWxlRmFjdG9yCi0gICAgICAgICAgICAgIAotICAgICAgIDsvLyBWTEQgRGVjb2RpbmcKLQotCi1Mb29wCi0KLSAgICAgICBMRFIgICAgICAgICAgICAgVmxjTVZELCA9YXJtVkNNNFAyX2FWbGNNVkQgICAgICAgIDsvLyBMb2FkIHRoZSBvcHRpbWl6ZWQgTVZEIFZMQyB0YWJsZQotCi0gICAgICAgOy8vIEhvcml6b250YWwgRGF0YSBhbmQgUmVzaWR1YWwgY2FsY3VsYXRpb24KLQotICAgICAgIExEUiAgICAgICAgICAgICB0ZW1wLD0weEZGRiAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIE1fQkRfVkxEICAgICAgICBpbmRleCxUMSxUMixWbGNNVkQsMywyICAgICAgICAgICAgICAgIDsvLyB2YXJpYWJsZSBsZW5naHQgZGVjb2RpbmcgdXNpbmcgdGhlIG1hY3JvCi0gICAgICAKLSAgICAgICBURVEgICAgICAgICAgICAgaW5kZXgsdGVtcAotICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0RXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFeGl0IHdpdGggYW4gRXJyb3IgTWVzc2FnZSBpZiB0aGUgZGVjb2RlZCBzeW1ib2wgaXMgYW4gaW52YWxpZWQgc3ltYm9sIAotICAgICAgIAotICAgICAgIFNVQiAgICAgICAgICAgICBtdkhvckRhdGEsaW5kZXgsIzMyICAgICAgICAgICAgICAgICAgIDsvLyBtdkhvckRhdGE9aW5kZXgtMzIgICAgICAgICAgICAgCi0gICAgICAgTU9WICAgICAgICAgICAgIG12SG9yUmVzaWR1YWwsIzEgICAgICAgICAgICAgICAgICAgICAgOy8vIG12SG9yUmVzaWR1YWw9MQotICAgICAgIENNUCAgICAgICAgICAgICBmY29kZUZvcndhcmQsIzEKLSAgICAgICBURVFORSAgICAgICAgICAgbXZIb3JEYXRhLCMwCi0gICAgICAgTU9WRVEgICAgICAgICAgIGRpZmZNVmR4LG12SG9yRGF0YSAgICAgICAgICAgICAgICAgICAgOy8vIGlmIHNjYWxlRmFjdG9yPTEoZmNvZGVGb3J3YXJkPTEpIG9yIG12SG9yRGF0YT0wIGRpZmZNVmR4PW12SG9yRGF0YSAgICAgICAgIAotICAgICAgIEJFUSAgICAgICAgICAgICBWZXJ0aWNhbERhdGEKLSAgICAgICAKLSAgICAgICBTVUIgICAgICAgICAgICAgdGVtcCxmY29kZUZvcndhcmQsIzEKLSAgICAgICBNX0JEX1ZSRUFEOCAgICAgbXZIb3JSZXNpZHVhbCx0ZW1wLFQxLFQyICAgICAgICAgICAgICA7Ly8gZ2V0IG12SG9yUmVzaWR1YWwgZnJvbSBiaXRzdHJlYW0gaWYgZmNvZGVGb3J3YXJkPjEgYW5kIG12SG9yRGF0YSE9MCAgICAgICAgICAgICAgCi0gICAgICAgCi0gICAgICAgQ01QICAgICAgICAgICAgIG12SG9yRGF0YSwjMAotICAgICAgIFJTQkxUICAgICAgICAgICBtdkhvckRhdGEsbXZIb3JEYXRhLCMwICAgICAgICAgICAgICAgIDsvLyBtdkhvckRhdGE9YWJzKG12SG9yRGF0YSkKLSAgICAgICBTVUIgICAgICAgICAgICAgbXZIb3JSZXNpZHVhbCxtdkhvclJlc2lkdWFsLGZjb2RlRm9yd2FyZAotICAgICAgIFNNTEFCQiAgICAgICAgICBkaWZmTVZkeCxtdkhvckRhdGEsZmNvZGVGb3J3YXJkLG12SG9yUmVzaWR1YWwgOy8vIGRpZmZNVmR4PWFicyhtdkhvckRhdGEpKmZjb2RlRm9yd2FyZCttdkhvclJlc2lkdWFsLWZjb2RlRm9yd2FyZAotICAgICAgIEFERCAgICAgICAgICAgICBkaWZmTVZkeCxkaWZmTVZkeCwjMQotICAgICAgIFJTQkxUICAgICAgICAgICBkaWZmTVZkeCxkaWZmTVZkeCwjMAotICAgICAgIAotICAgICAgIDsvLyBWZXJ0aWNhbCBEYXRhIGFuZCBSZXNpZHVhbCBjYWxjdWxhdGlvbgotCi1WZXJ0aWNhbERhdGEKLQotICAgICAgIE1fU1RSICAgICAgICAgICBkaWZmTVZkeCxwZGlmZk1WZHggICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSB0aGUgZGlmZk1WZHggb24gc3RhY2sKLSAgICAgICBMRFIgICAgICAgICAgICAgVmxjTVZELCA9YXJtVkNNNFAyX2FWbGNNVkQgICAgICAgIDsvLyBMb2FkaW5nIHRoZSBhZGRyZXNzIG9mIG9wdGltaXplZCBWTEMgdGFibGVzCi0KLSAgICAgICBMRFIgICAgICAgICAgICAgdGVtcCw9MHhGRkYKLSAgICAgICBNX0JEX1ZMRCAgICAgICAgaW5kZXgsVDEsVDIsVmxjTVZELDMsMiAgICAgICAgICAgICAgICA7Ly8gVkxDIGRlY29kaW5nIHVzaW5nIHRoZSBtYWNybwotICAgICAgIAotICAgICAgIFRFUSAgICAgICAgICAgICBpbmRleCx0ZW1wCi0gICAgICAgQkVRICAgICAgICAgICAgIEV4aXRFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4aXQgd2l0aCBhbiBFcnJvciBNZXNzYWdlIGlmIGFuIEludmFsaWVkIFN5bWJvbCBvY2N1cnMKLSAgICAgICAKLSAgICAgICBTVUIgICAgICAgICAgICAgbXZWZXJEYXRhLGluZGV4LCMzMiAgICAgICAgICAgICAgICAgICA7Ly8gbXZWZXJEYXRhPWluZGV4LTMyICAgICAgICAgICAgIAotICAgICAgIE1PViAgICAgICAgICAgICBtdlZlclJlc2lkdWFsLCMxICAgICAKLSAgICAgICBDTVAgICAgICAgICAgICAgZmNvZGVGb3J3YXJkLCMxCi0gICAgICAgVEVRTkUgICAgICAgICAgIG12VmVyRGF0YSwjMAotICAgICAgIE1PVkVRICAgICAgICAgICBkaWZmTVZkeSxtdlZlckRhdGEgICAgICAgICAgICAgICAgICAgIDsvLyBkaWZmTVZkeSA9IG12VmVyRGF0YSBpZiBzY2FsZUZhY3Rvcj0xKGZjb2RlRm9yd2FyZD0xKSBvciBtdlZlckRhdGE9MAotICAgICAgIEJFUSAgICAgICAgICAgICBGaW5kTVZQcmVkCi0KLSAgICAgICBTVUIgICAgICAgICAgICAgdGVtcCxmY29kZUZvcndhcmQsIzEKLSAgICAgICBNX0JEX1ZSRUFEOCAgICAgbXZWZXJSZXNpZHVhbCx0ZW1wLFQxLFQyICAgICAgICAgICAgICA7Ly8gR2V0IG12VmVyUmVzaWR1YWwgZnJvbSBiaXQgc3RyZWFtIGlmIGZjb2RlRm9yd2FyZD4xIGFuZCBtblZlckRhdGEhPTAKLSAgICAgICAgICAgICAKLQotICAgICAgIENNUCAgICAgICAgICAgICBtdlZlckRhdGEsIzAKLSAgICAgICBSU0JMVCAgICAgICAgICAgbXZWZXJEYXRhLG12VmVyRGF0YSwjMAotICAgICAgIFNVQiAgICAgICAgICAgICBtdlZlclJlc2lkdWFsLG12VmVyUmVzaWR1YWwsZmNvZGVGb3J3YXJkCi0gICAgICAgU01MQUJCICAgICAgICAgIGRpZmZNVmR5LG12VmVyRGF0YSxmY29kZUZvcndhcmQsbXZWZXJSZXNpZHVhbCA7Ly8gZGlmZk1WZHk9YWJzKG12VmVyRGF0YSkqZmNvZGVGb3J3YXJkK212VmVyUmVzaWR1YWwtZmNvZGVGb3J3YXJkCi0gICAgICAgQUREICAgICAgICAgICAgIGRpZmZNVmR5LGRpZmZNVmR5LCMxCi0gICAgICAgUlNCTFQgICAgICAgICAgIGRpZmZNVmR5LGRpZmZNVmR5LCMwCi0KLSAgICAgICA7Ly9DYWxsaW5nIHRoZSBGdW5jdGlvbiBvbXhWQ000UDJfRmluZE1WcHJlZAotICAgICAgICAKLUZpbmRNVlByZWQKLQotICAgICAgIE1fU1RSICAgICAgICAgICBkaWZmTVZkeSxwZGlmZk1WZHkKLSAgICAgICBBREQgICAgICAgICAgICAgdGVtcCxwRHN0TVZDdXJNQixCbGtDb3VudCxMU0wgIzIgICAgICA7Ly8gdGVtcD1wRHN0TVZDdXJNQltCbGtDb3VudF0KLSAgICAgICBNX1NUUiAgICAgICAgICAgdGVtcCxwcERzdE1WQ3VyTUIgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUgdGVtcCBvbiBzdGFjayBmb3IgcGFzc2luZyBhcyBhbiBhcmd1bWVudCB0byBGaW5kTVZQcmVkCi0gICAgICAgCi0gICAgICAgTU9WICAgICAgICAgICAgIHRlbXAsIzAKLSAgICAgICBNX1NUUiAgICAgICAgICAgdGVtcCxwRHN0TVZQcmVkTUUgICAgICAgICAgICAgICAgICAgICA7Ly8gUGFzcyBwRHN0TVZQcmVkTUU9TlVMTCBhcyBhbiBhcmd1bWVudCAgICAgICAgIAotICAgICAgIE1fU1RSICAgICAgICAgICBCbGtDb3VudCxwQmxrQ291bnQgICAgICAgICAgICAgICAgICAgIDsvLyBQYXNzcyBCbGtDb3VudCBhcyBBcmd1bWVudCB0aHJvdWdoIHN0YWNrCi0KLSAgICAgICBNT1YgICAgICAgICAgICAgdGVtcCxwU3JjTVZMZWZ0TUIgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcCAoUk4gMSk9cFNyY01WTGVmdE1CCi0gICAgICAgTV9MRFIgICAgICAgICAgIHBTcmNNVlVwcGVyUmlnaHRNQixwU3JjTVZVcHBlclJpZ2h0TUJvblN0YWNrCi0gICAgICAgTU9WICAgICAgICAgICAgIHBTcmNNVkxlZnRNQixwU3JjTVZVcHBlck1CICAgICAgICAgICAgOy8vIHBTcmNNVkxlZnRNQiAoIFJOIDIpID0gcFNyY01WVXBwZXJNQgotICAgICAgIE1PViAgICAgICAgICAgICBwcEJpdFN0cmVhbSxwRHN0TVZDdXJNQiAgICAgICAgICAgICAgIDsvLyBwcEJpdFN0cmVhbSAgKCBSTiAwKSA9IHBEc3RNVkN1ck1CCi0gICAgICAgTU9WICAgICAgICAgICAgIHBTcmNNVlVwcGVyTUIscFNyY01WVXBwZXJSaWdodE1CICAgICAgOy8vIHBTcmNNVlVwcGVyTUIoIFJOIDMpID0gcFNyY01WVXBwZXJSaWdodE1CICAgICAgCi0gICAgICAgQkwgICAgICAgICAgICAgIG9teFZDTTRQMl9GaW5kTVZwcmVkICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIHN1YnJvdXRpbmUgb214VkNNNFAyX0ZpbmRNVnByZWQKLQotICAgICAgIDsvLyBTdG9yZSBIb3Jpem9udGFsIE1vdGlvbiBWZWN0b3IKLSAgICAgCi0gICAgICAgTV9MRFIgICAgICAgICAgIEJsa0NvdW50LHBCbGtDb3VudCAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgQmxrQ291bnQgZnJvbSBzdGFjawotICAgICAgIE1fTERSICAgICAgICAgICBIaWdoLHBIaWdoICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBIaWdoPTMyKnNjYWxlRmFjdG9yCi0gICAgICAgTFNMICAgICAgICAgICAgIHRlbXAxLEJsa0NvdW50LCMyICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXA9QmxrQ291bnQqNAotICAgICAgIE1fTERSICAgICAgICAgICBkaWZmTVZkeCxwZGlmZk1WZHggICAgICAgICAgICAgICAgICAgIDsvLyBMYWFkIGRpZmZNVmR4Ci0gICAgICAgCi0gICAgICAgTERSU0ggICAgICAgICAgIHRlbXAsW3BEc3RNVkN1ck1CLHRlbXAxXSAgICAgICAgICAgICAgOy8vIHRlbXA9cERzdE1WQ3VyTUJbQmxrQ291bnRdCi0gICAgICAgCi0gICAgICAgCi0gICAgICAgUlNCICAgICAgICAgICAgIExvdyxIaWdoLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvdyA9IC0zMipzY2FsZUZhY3RvcgotICAgICAgIEFERCAgICAgICAgICAgICBkaWZmTVZkeCx0ZW1wLGRpZmZNVmR4ICAgICAgICAgICAgICAgIDsvLyBkaWZmTVZkeD1wRHN0TVZDdXJNQltCbGtDb3VudF0rZGlmZk1WZHgKLSAgICAgICBBREQgICAgICAgICAgICAgUmFuZ2UsSGlnaCxIaWdoICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUmFuZ2U9NjQqU2NhbGVGYWN0b3IKLSAgICAgICBTVUIgICAgICAgICAgICAgSGlnaCxIaWdoLCMxICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSGlnaD0gMzIqc2NhbGVGYWN0b3ItMQotCi0gICAgICAgQ01QICAgICAgICAgICAgIGRpZmZNVmR4LExvdyAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIGRpZmZNVmR4PExvdyAgICAgICAgICAKLSAgICAgICBBRERMVCAgICAgICAgICAgZGlmZk1WZHgsZGlmZk1WZHgsUmFuZ2UgICAgICAgICAgICAgICA7Ly8gZGlmZk1WZHgrPVJhbmdlCi0gICAgICAgIAotICAgICAgIENNUCAgICAgICAgICAgICBkaWZmTVZkeCxIaWdoICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIFNVQkdUICAgICAgICAgICBkaWZmTVZkeCxkaWZmTVZkeCxSYW5nZSAgICAgICAgICAgICAgIDsvLyBJZiBkaWZmTVZkeCA+IEhpZ2ggZGlmZk1WZHgtPVJhbmdlCi0gICAgICAgU1RSSCAgICAgICAgICAgIGRpZmZNVmR4LFtwRHN0TVZDdXJNQix0ZW1wMV0KLQotICAgICAgIDsvLyBTdG9yZSBWZXJ0aWNhbAotCi0gICAgICAgQUREICAgICAgICAgICAgIHRlbXAxLHRlbXAxLCMyICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXAxPTQqQmxrQ291bnQrMgotICAgICAgIE1fTERSICAgICAgICAgICBkaWZmTVZkeCxwZGlmZk1WZHkgICAgICAgICAgICAgICAgICAgIDsvLyBMYWFkIGRpZmZNVmR5Ci0gICAgICAgTERSU0ggICAgICAgICAgIHRlbXAsW3BEc3RNVkN1ck1CLHRlbXAxXSAgICAgICAgICAgICAgOy8vIHRlbXA9cERzdE1WQ3VyTUJbQmxrQ291bnRdLmRpZmZNVmR5Ci0gICAgICAgQUREICAgICAgICAgICAgIEJsa0NvdW50LEJsa0NvdW50LCMxICAgICAgICAgICAgICAgICAgOy8vIEJsa0NvdW50PUJsa0NvdW50KzEKLSAgICAgICBBREQgICAgICAgICAgICAgZGlmZk1WZHgsdGVtcCxkaWZmTVZkeCAgICAgICAgICAgICAgICAKLSAgICAgICBDTVAgICAgICAgICAgICAgZGlmZk1WZHgsTG93Ci0gICAgICAgQURETFQgICAgICAgICAgIGRpZmZNVmR4LGRpZmZNVmR4LFJhbmdlICAgICAgICAgICAgICAgOy8vIElmIGRpZmZNVmR5PExvdyAgZGlmZk1WZHkrPVJhbmdlICAgICAgICAgICAgICAgIAotICAgICAgIENNUCAgICAgICAgICAgICBkaWZmTVZkeCxIaWdoCi0gICAgICAgU1VCR1QgICAgICAgICAgIGRpZmZNVmR4LGRpZmZNVmR4LFJhbmdlICAgICAgICAgICAgICAgOy8vIElmIGRpZmZNVmR5ID4gSGlnaCBkaWZmTVZkeS09UmFuZ2UKLSAgICAgICBTVFJIICAgICAgICAgICAgZGlmZk1WZHgsW3BEc3RNVkN1ck1CLHRlbXAxXSAgICAKLSAgICAgICAKLSAgICAgICBDTVAgICAgICAgICAgICAgQmxrQ291bnQsQ291bnQKLSAgICAgICBNX0xEUiAgICAgICAgICAgcFNyY01WTGVmdE1CLHBwU3JjTVZMZWZ0TUIKLSAgICAgICBNX0xEUiAgICAgICAgICAgcFNyY01WVXBwZXJNQixwcFNyY01WVXBwZXJNQgotCi0gICAgICAgQkxUICAgICAgICAgICAgIExvb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIEJsa0NvdW50PENvdW50IENvbnRpbnVlIHRoZSBMb29wCi0KLQotICAgICAgIDsvLyBJZiBNQlR5cGU9T01YX1ZDX0lOVEVSIG9yIE1CdHlwZT1PTVhfVkNfSU5URVJfUSBjb3B5IHBEc3RNVkN1ck1CWzBdIHRvCi0gICAgICAgOy8vIHBEc3RNVkN1ck1CWzFdLCBwRHN0TVZDdXJNQlsyXSwgcERzdE1WQ3VyTUJbM10gCi0KLSAgICAgICBNX0xEUiAgICAgICAgICAgTUJUeXBlLE1CVHlwZW9uU3RhY2sKLQotICAgICAgIFRFUSAgICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIFRFUU5FICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRFUl9RICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIExEUkVRICAgICAgICAgICB0ZW1wLFtwRHN0TVZDdXJNQl0KLSAgICAgICBNX0xEUiAgICAgICAgICAgcHBCaXRTdHJlYW0scHBwQml0U3RyZWFtCi0gICAgICAgU1RSRVEgICAgICAgICAgIHRlbXAsW3BEc3RNVkN1ck1CLCM0XQotICAgICAgIAotICAgICAgIFNUUkVRICAgICAgICAgICB0ZW1wLFtwRHN0TVZDdXJNQiwjOF0KLSAgICAgICBTVFJFUSAgICAgICAgICAgdGVtcCxbcERzdE1WQ3VyTUIsIzEyXQotICAgICAgIAotICAgICAgIAotICAgICAgIE1fTERSICAgICAgICAgICBwQml0T2Zmc2V0LHBwQml0T2Zmc2V0Ci0gICAgICAgOy8vRW5kaW5nIHRoZSBtYWNybwotICAgICAgIE1fQkRfRklOSSAgICAgICBwcEJpdFN0cmVhbSxwQml0T2Zmc2V0ICAgICAgICAgICAgICAgICA7Ly8gRmluaXNoaW5nIHRoZSBNYWNybyAgICAgICAKLQotICAgICAgIAotICAgICAgIE1PViAgICAgICAgICAgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIKLSAgICAgICBCICAgICAgICAgICAgICAgRXhpdE9LCi0gCi1FeGl0RXJyb3IKLQotICAgICAgIE1fTERSICAgICAgICAgICBwcEJpdFN0cmVhbSxwcHBCaXRTdHJlYW0KLSAgICAgICBNX0xEUiAgICAgICAgICAgcEJpdE9mZnNldCxwcEJpdE9mZnNldAotICAgICAgIDsvL0VuZGluZyB0aGUgbWFjcm8KLSAgICAgICBNX0JEX0ZJTkkgICAgICAgcHBCaXRTdHJlYW0scEJpdE9mZnNldAotICAgICAgIAotICAgICAgIE1PViAgICAgICAgICAgICBSZXR1cm4sI09NWF9TdHNfRXJyCi0KLUV4aXRPSyAgICAgICAgICAgICAKLQotICAgICAgIE1fRU5ECi0gICAgICAgRU5ESUYKLSAgICAgICBFTkQKLQotCi0gICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVlMzNkOC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcl9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvKioKLTsgKiAKLTsgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyX3MucwotOyAqIE9wZW5NQVggREw6IHYxLjAuMgotOyAqIFJldmlzaW9uOiAgIDk2NDEKLTsgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOyAqIAotOyAqIAotOyAqIAotOyAqCi07ICogRGVzY3JpcHRpb246IAotOyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGRlY29kaW5nCi07ICogZm9yIGludGVyIGJsb2NrLgotOyAqCi07ICoKLTsgKgotOyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyCi07ICoKLTsgKiBEZXNjcmlwdGlvbjoKLTsgKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIG9uZSBpbnRlciBjb2RlZCBibG9jay4KLTsgKgotOyAqIFJlbWFya3M6Ci07ICoKLTsgKiBQYXJhbWV0ZXJzOgotOyAqIFtpbl0gICAgcHBCaXRTdHJlYW0gICAgICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgotOyAqICAgICAgICAgICAgICAgICAgICB0aGUgYml0c3RyZWFtIGJ1ZmZlcgotOyAqIFtpbl0gICAgcEJpdE9mZnNldCAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLTsgKiAgICAgICAgICAgICAgICAgICAgdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gICAgWzAtN10uCi07ICogW2luXSBzaG9ydFZpZGVvSGVhZGVyICAgICBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsKLTsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKLTsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgotOyAqIFtvdXRdICAgIHBwQml0U3RyZWFtICAgICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMKLTsgKiAgICAgICAgICAgICAgICAgICAgZGVjb2RlZCwgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZQotOyAqICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIKLTsgKiBbb3V0XSAgICBwQml0T2Zmc2V0ICAgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotOyAqICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci07ICogICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbQotOyAqIFtvdXRdICAgIHBEc3QgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAotOyAqICAgICAgICAgICAgICAgICAgICBibG9jay4gTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQKLTsgKgotOyAqIFJldHVybiBWYWx1ZToKLTsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKLTsgKiAgIC1BdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0LCBvcgotOyAqICAgLXBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCwgb3IKLTsgKiAgIC0qcEJpdE9mZnNldCBleGNlZWRzIFswLDddLgotOyAqIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yCi07ICogICAtQXQgbGVhc3Qgb25lIG1hcmsgYml0IGlzIGVxdWFsIHRvIHplcm8KLTsgKiAgIC1FbmNvdW50ZXJlZCBhbiBpbGxlZ2FsIHN0cmVhbSBjb2RlIHRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBWTEMgdGFibGUKLTsgKiAgIC1FbmNvdW50ZXJlZCBhbmQgaWxsZWdhbCBjb2RlIGluIHRoZSBWTEMgRkxDIHRhYmxlCi07ICogICAtVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0Ci07ICoKLTsgKi8KLQotCi0gICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgSU5DTFVERSBhcm1DT01NX0JpdERlY19zLmgKLQotCi0gICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotCi0gICAgIAotCi0KLQotICAgICBJRiBBUk0xMTM2SlMKLSAgICAgCi0gICAgICAgIDsvLyBJbXBvcnQgdmFyaW91cyB0YWJsZXMgbmVlZGVkIGZvciB0aGUgZnVuY3Rpb24KLQotICAgICAgICAKLSAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9JbnRlclZsY0wwTDEgICAgICAgICAgICAgOy8vIENvbnRhaW5zIG9wdGltaXplZCBhbmQgcGFja2VkIFZMQyBUYWJsZXMgZm9yIGJvdGggTGFzdCA9MSBhbmQgbGFzdD0wCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUGFja2VkIGluIFJ1bjpMZXZlbDpMYXN0IGZvcm1hdAotICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludGVyTDBMMUxNQVggICAgICAgICAgICA7Ly8gQ29udGFpbnMgTE1BWCB0YWJsZSBlbnRyaWVzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MQotICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludGVyTDBMMVJNQVggICAgICAgICAgICA7Ly8gQ29udGFpbnMgUk1BWCB0YWJsZSBlbnRyaWVzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MQotICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuICAgICA7Ly8gY29udGFpbnMgY2xhc3NpY2FsIFppZ3phZyB0YWJsZSBlbnRyaWVzIHdpdGggZG91YmxlIHRoZSBvcmlnaW5hbCB2YWx1ZXMKLSAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlCi0KLQotCi07Ly9JbnB1dCBBcmd1bWVudHMKLQotcHBCaXRTdHJlYW0gICAgICAgICAgUk4gMAotcEJpdE9mZnNldCAgICAgICAgICAgUk4gMQotcERzdCAgICAgICAgICAgICAgICAgUk4gMgotc2hvcnRWaWRlb0hlYWRlciAgICAgUk4gMwotCi07Ly9Mb2NhbCBWYXJpYWJsZXMKLQotUmV0dXJuICAgICAgICAgICAgICAgUk4gMAotCi1wVmxjVGFibGVMMEwxICAgICAgICBSTiA0Ci1wTE1BWFRhYmxlTDBMMSAgICAgICBSTiA0Ci1wUk1BWFRhYmxlTDBMMSAgICAgICBSTiA0Ci1wWmlnemFnVGFibGUgICAgICAgICBSTiA0Ci1Db3VudCAgICAgICAgICAgICAgICBSTiA2Ci0KLQotICAgICAgICAKLSAgICAgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSB0byBzdG9yZSB0aGUgVkxDLFppZ3phZyxMTUFYIGFuZCBSTUFYIHRhYmxlcwotICAgICAKLSAgICAgICAgCi0gICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFZsY1RhYmxlTDBMMSw0Ci0gICAgICAgIE1fQUxMT0M0ICAgICAgICBwcExNQVhUYWJsZUwwTDEsNAotICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBSTUFYVGFibGVMMEwxLDQKLSAgICAgICAgTV9BTExPQzQgICAgICAgIHBwWmlnemFnVGFibGUsNAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIE1fU1RBUlQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcixyMTIKLQotICAgICAgICAKLQotICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgICAgIHBaaWd6YWdUYWJsZSwgPWFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiAgICAgICA7Ly8gTG9hZCB6aWd6YWcgdGFibGUKLSAgICAgICAgTV9TVFIgICAgICAgICAgIHBaaWd6YWdUYWJsZSxwcFppZ3phZ1RhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHppZ3phZyB0YWJsZSBvbiBzdGFjayB0byBwYXNzIGFzIGFyZ3VtZW50IHRvIHVuc2FmZSBmdW5jdGlvbgotICAgICAgICBMRFIgICAgICAgICAgICAgcFZsY1RhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRlclZsY0wwTDEgICAgICAgICAgICAgIDsvLyBMb2FkIG9wdGltaXplZCBWTEMgdGFibGUgd2l0aCBib3RoIEw9MCBhbmQgTD0xIGVudHJpZXMKLSAgICAgICAgTV9TVFIgICAgICAgICAgIHBWbGNUYWJsZUwwTDEscHBWbGNUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIG9wdGltaXplZCBWTEMgdGFibGUgYWRkcmVzcyBvbiBzdGFjawotICAgICAgICBMRFIgICAgICAgICAgICAgcExNQVhUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50ZXJMMEwxTE1BWCAgICAgICAgICAgIDsvLyBMb2FkIEludGVybGVhdmVkIEw9MCBhbmQgTD0xIExNQVggVGFibGVzCi0gICAgICAgIE1fU1RSICAgICAgICAgICBwTE1BWFRhYmxlTDBMMSxwcExNQVhUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBMTUFYIHRhYmxlIGFkZHJlc3Mgb24gc3RhY2sKLSAgICAgICAgTERSICAgICAgICAgICAgIHBSTUFYVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludGVyTDBMMVJNQVggICAgICAgICAgICA7Ly8gTG9hZCBJbnRlcmxlYXZlZCBMPTAgYW5kIEw9MSBSTUFYIFRhYmxlcwotICAgICAgICBNT1YgICAgICAgICAgICAgQ291bnQsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gc2V0IHN0YXJ0PTAKLSAgICAgICAgTV9TVFIgICAgICAgICAgIHBSTUFYVGFibGVMMEwxLHBwUk1BWFRhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIFJNQVggdGFibGUgYWRkcmVzcyBvbiBzdGFjawotICAgICAgICAgICAgICAgIAotCi0gICAgICAgIEJMICAgICAgICAgICAgICBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZSAgICAgICAgICAgICAgICAgOy8vIGNhbGwgVW5zYWZlIEZ1bmN0aW9uIGZvciBWTEMgWmlnemFnIERlY29kaW5nCi0gICAgICAgICAKLSAgICAgICAKLQotICAgICAgICBNX0VORAotICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTENfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDU5NDBjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTENfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07LyoqCi07ICogCi07ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDX3MucwotOyAqIE9wZW5NQVggREw6IHYxLjAuMgotOyAqIFJldmlzaW9uOiAgIDk2NDEKLTsgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOyAqIAotOyAqIAotOyAqIAotOyAqCi07ICogRGVzY3JpcHRpb246IAotOyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGRlY29kaW5nCi07ICogZm9yIGludGVyIGJsb2NrLgotOyAqCi07ICoKLTsgKgotOyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyCi07ICoKLTsgKiBEZXNjcmlwdGlvbjoKLTsgKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIG9uZSBpbnRyYSBjb2RlZCBibG9jay4KLTsgKgotOyAqIFJlbWFya3M6Ci07ICoKLTsgKiBQYXJhbWV0ZXJzOgotOyAqIFtpbl0gICAgcHBCaXRTdHJlYW0gICAgICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgotOyAqICAgICAgICAgICAgICAgICAgICB0aGUgYml0c3RyZWFtIGJ1ZmZlcgotOyAqIFtpbl0gICAgcEJpdE9mZnNldCAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLTsgKiAgICAgICAgICAgICAgICAgICAgdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gICAgWzAtN10uCi07ICogW2luXSBzaG9ydFZpZGVvSGVhZGVyICAgICBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsKLTsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKLTsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgotOyAqIFtvdXRdICAgIHBwQml0U3RyZWFtICAgICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMKLTsgKiAgICAgICAgICAgICAgICAgICAgZGVjb2RlZCwgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZQotOyAqICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIKLTsgKiBbb3V0XSAgICBwQml0T2Zmc2V0ICAgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotOyAqICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci07ICogICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbQotOyAqIFtvdXRdICAgIHBEc3QgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAotOyAqICAgICAgICAgICAgICAgICAgICBibG9jay4gTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQKLTsgKgotOyAqIFJldHVybiBWYWx1ZToKLTsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKLTsgKiAgIC1BdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0LCBvcgotOyAqICAgLXBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCwgb3IKLTsgKiAgIC0qcEJpdE9mZnNldCBleGNlZWRzIFswLDddLgotOyAqIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yCi07ICogICAtQXQgbGVhc3Qgb25lIG1hcmsgYml0IGlzIGVxdWFsIHRvIHplcm8KLTsgKiAgIC1FbmNvdW50ZXJlZCBhbiBpbGxlZ2FsIHN0cmVhbSBjb2RlIHRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBWTEMgdGFibGUKLTsgKiAgIC1FbmNvdW50ZXJlZCBhbmQgaWxsZWdhbCBjb2RlIGluIHRoZSBWTEMgRkxDIHRhYmxlCi07ICogICAtVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0Ci07ICoKLTsgKi8KLQotCi0gICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgSU5DTFVERSBhcm1DT01NX0JpdERlY19zLmgKLQotCi0gICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotCi0gICAgIAotCi0KLQotICAgICBJRiBBUk0xMTM2SlMKLSAgICAgCi0gICAgICAgIDsvLyBJbXBvcnQgdmFyaW91cyB0YWJsZXMgbmVlZGVkIGZvciB0aGUgZnVuY3Rpb24KLQotICAgICAgICAKLSAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9JbnRyYVZsY0wwTDEgICAgICAgICAgICAgOy8vIENvbnRhaW5zIG9wdGltaXplZCBhbmQgcGFja2VkIFZMQyBUYWJsZXMgZm9yIGJvdGggTGFzdCA9MSBhbmQgbGFzdD0wCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUGFja2VkIGluIFJ1bjpMZXZlbDpMYXN0IGZvcm1hdAotICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBMMUxNQVggICAgICAgICAgICA7Ly8gQ29udGFpbnMgTE1BWCB0YWJsZSBlbnRyaWVzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MQotICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBMMVJNQVggICAgICAgICAgICA7Ly8gQ29udGFpbnMgUk1BWCB0YWJsZSBlbnRyaWVzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MQotICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuICAgICA7Ly8gY29udGFpbnMgY2xhc3NpY2FsIFppZ3phZyB0YWJsZSBlbnRyaWVzIHdpdGggZG91YmxlIHRoZSBvcmlnaW5hbCB2YWx1ZXMKLSAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlCi0KLTsvL0lucHV0IEFyZ3VtZW50cwotCi1wcEJpdFN0cmVhbSAgICAgICAgICBSTiAwCi1wQml0T2Zmc2V0ICAgICAgICAgICBSTiAxCi1wRHN0ICAgICAgICAgICAgICAgICBSTiAyCi1QcmVkRGlyICAgICAgICAgICAgICBSTiAzCi1zaG9ydFZpZGVvSGVhZGVyICAgICBSTiAzCi0KLTsvL0xvY2FsIFZhcmlhYmxlcwotCi1SZXR1cm4gICAgICAgICAgICAgICBSTiAwCi0KLXBWbGNUYWJsZUwwTDEgICAgICAgIFJOIDQKLXBMTUFYVGFibGVMMEwxICAgICAgIFJOIDQKLXBSTUFYVGFibGVMMEwxICAgICAgIFJOIDQKLXBaaWd6YWdUYWJsZSAgICAgICAgIFJOIDQKLUNvdW50ICAgICAgICAgICAgICAgIFJOIDYKLQotCi0gICAgICAgIAotICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHRvIHN0b3JlIG9wdGltaXplZCBWTEMsWmlnemFnLCBSTUFYLCBMTUFYIFRhYmxlIEFkZHJlc3NlcyAKLSAgICAgCi0gICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFZsY1RhYmxlTDBMMSw0Ci0gICAgICAgIE1fQUxMT0M0ICAgICAgICBwcExNQVhUYWJsZUwwTDEsNAotICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBSTUFYVGFibGVMMEwxLDQKLSAgICAgICAgTV9BTExPQzQgICAgICAgIHBwWmlnemFnVGFibGUsNAotCi0gICAgICAgIAotICAgICAgICBNX1NUQVJUIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyxyMTIKLQotICAgICAgICBNX0FSRyAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcm9uU3RhY2ssNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBvaW50ZXIgdG8gSW5wdXQgQXJndW1lbnQgb24gc3RhY2sgICAgICAgICAgIAotCi0gICAgICAgIExEUiAgICAgICAgICAgICBwWmlnemFnVGFibGUsID1hcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gICAgIDsvLyBMb2FkIEFkZHJlc3Mgb2YgdGhlIFppZ3phZyB0YWJsZSAgICAKLSAgICAgICAgQUREICAgICAgICAgICAgIHBaaWd6YWdUYWJsZSwgcFppZ3phZ1RhYmxlLCBQcmVkRGlyLCBMU0wgIzYgICAgICAgICAgIDsvLyBMb2FkaW5nIERpZmZlcmVudCB0eXBlIG9mIHppZ3phZyB0YWJsZXMgYmFzZWQgb24gUHJlZERpcgotICAgICAgIAotICAgICAgICBNX1NUUiAgICAgICAgICAgcFppZ3phZ1RhYmxlLHBwWmlnemFnVGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIFppZ3phZyB0YWJsZSBhZGRyZXNzIG9uIHN0YWNrCi0gICAgICAgIExEUiAgICAgICAgICAgICBwVmxjVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludHJhVmxjTDBMMSAgICAgICAgICAgIDsvLyBMb2FkIG9wdGltaXplZCBwYWNrZWQgVkxDIFRhYmxlIHdpdGggYm90aCBMPTAgYW5kIEw9MSBlbnRyaWVzCi0gICAgICAgIE1fU1RSICAgICAgICAgICBwVmxjVGFibGVMMEwxLHBwVmxjVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgVkxDIFRhYmxlIGFkZHJlc3Mgb24gc3RhY2sKLSAgICAgICAgTERSICAgICAgICAgICAgIHBMTUFYVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludHJhTDBMMUxNQVggICAgICAgICAgOy8vIExvYWQgTE1BWCBUYWJsZQotICAgICAgICBNX1NUUiAgICAgICAgICAgcExNQVhUYWJsZUwwTDEscHBMTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIExNQVggVGFibGUgYWRkcmVzcyBvbiBTdGFjawotICAgICAgICBMRFIgICAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50cmFMMEwxUk1BWCAgICAgICAgICA7Ly8gTG9hZCBSTUFYIFRhYmxlCi0gICAgICAgIE1PViAgICAgICAgICAgICBDb3VudCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2V0IFN0YXJ0PTAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgTV9TVFIgICAgICAgICAgIHBSTUFYVGFibGVMMEwxLHBwUk1BWFRhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBSTUFYIFRhYmxlIGFkZHJlc3Mgb24gc3RhY2sKLSAgICAgICAgICAgICAgCi0KLSAgICAgICAKLSAgICAgICAgTV9MRFIgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIsc2hvcnRWaWRlb0hlYWRlcm9uU3RhY2sgICAgICAgICAgICAgIDsvLyBnZXQgdGhlIElucHV0IEFyZ3VtZW50IGZyb20gc3RhY2sKLQotICAgICAgICBCTCAgICAgICAgICAgICAgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmUgICAgICAgICAgICAgICA7Ly8gQ2FsbCBVbnNhZmUgRnVuY3Rpb24KLQotCi0KLSAgICAgICAgCi0gICAgICAgIE1fRU5ECi0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTENfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQ19zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NmE2MmIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQ19zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvKioKLTsgKiAKLTsgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTENfcy5zCi07ICogT3Blbk1BWCBETDogdjEuMC4yCi07ICogUmV2aXNpb246ICAgOTY0MQotOyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07ICogCi07ICogCi07ICogCi07ICoKLTsgKiBEZXNjcmlwdGlvbjogCi07ICogQ29udGFpbnMgbW9kdWxlcyBmb3IgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZGVjb2RpbmcKLTsgKiBmb3IgaW50ZXIgYmxvY2suCi07ICoKLTsgKgotOyAqCi07ICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIKLTsgKgotOyAqIERlc2NyaXB0aW9uOgotOyAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3Igb25lIGludHJhIGNvZGVkIGJsb2NrLgotOyAqCi07ICogUmVtYXJrczoKLTsgKgotOyAqIFBhcmFtZXRlcnM6Ci07ICogW2luXSAgICBwcEJpdFN0cmVhbSAgICAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi07ICogICAgICAgICAgICAgICAgICAgIHRoZSBiaXRzdHJlYW0gYnVmZmVyCi07ICogW2luXSAgICBwQml0T2Zmc2V0ICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotOyAqICAgICAgICAgICAgICAgICAgICB0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiAgICBbMC03XS4KLTsgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgICAgIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOwotOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAotOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCi07ICogW291dF0gICAgcHBCaXRTdHJlYW0gICAgICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcwotOyAqICAgICAgICAgICAgICAgICAgICBkZWNvZGVkLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlCi07ICogICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlcgotOyAqIFtvdXRdICAgIHBCaXRPZmZzZXQgICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi07ICogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLTsgKiAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtCi07ICogW291dF0gICAgcERzdCAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50Ci07ICogICAgICAgICAgICAgICAgICAgIGJsb2NrLiBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZAotOyAqCi07ICogUmV0dXJuIFZhbHVlOgotOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cwotOyAqICAgLUF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QsIG9yCi07ICogICAtcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLCBvcgotOyAqICAgLSpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10uCi07ICogT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IKLTsgKiAgIC1BdCBsZWFzdCBvbmUgbWFyayBiaXQgaXMgZXF1YWwgdG8gemVybwotOyAqICAgLUVuY291bnRlcmVkIGFuIGlsbGVnYWwgc3RyZWFtIGNvZGUgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIFZMQyB0YWJsZQotOyAqICAgLUVuY291bnRlcmVkIGFuZCBpbGxlZ2FsIGNvZGUgaW4gdGhlIFZMQyBGTEMgdGFibGUKLTsgKiAgIC1UaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQKLTsgKgotOyAqLwotCi0KLSAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICBJTkNMVURFIGFybUNPTU1fQml0RGVjX3MuaAotCi0KLSAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLSAgICAgCi0gICAgICAKLQotCi0gICAgICBJRiBBUk0xMTM2SlMgOkxPUjogQ29ydGV4QTgKLQotICAgICAKLSAgICAgICAgOy8vIEltcG9ydCB2YXJpb3VzIHRhYmxlcyBuZWVkZWQgZm9yIHRoZSBmdW5jdGlvbgotCi0gICAgICAgIAotICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludHJhVmxjTDBMMSAgICAgICAgICAgICA7Ly8gQ29udGFpbnMgb3B0aW1pemVkIGFuZCBwYWNrZWQgVkxDIFRhYmxlcyBmb3IgYm90aCBMYXN0ID0xIGFuZCBsYXN0PTAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBQYWNrZWQgaW4gUnVuOkxldmVsOkxhc3QgZm9ybWF0Ci0gICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMEwxTE1BWCAgICAgICAgICAgIDsvLyBDb250YWlucyBMTUFYIHRhYmxlIGVudHJpZXMgd2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xCi0gICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMEwxUk1BWCAgICAgICAgICAgIDsvLyBDb250YWlucyBSTUFYIHRhYmxlIGVudHJpZXMgd2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xCi0gICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gICAgIDsvLyBjb250YWlucyBDTGFzc2ljYWwsIEhvcml6b250YWwsIFZlcnRpY2FsIFppZ3phZyB0YWJsZSBlbnRyaWVzIHdpdGggZG91YmxlIHRoZSBvcmlnaW5hbCB2YWx1ZXMKLSAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9hSW50cmFEQ0x1bWFDaHJvbWFJbmRleCAgOy8vIENvbnRhaW5zIE9wdGltaXplZCBEQ0x1bWEgYW5kIERDQ2hyb21hIEluZGV4IHRhYmxlIEVudHJpZXMKLSAgICAgICAgCi0KLSAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlCi0KLTsvL0lucHV0IEFyZ3VtZW50cwotCi1wcEJpdFN0cmVhbSAgICAgICAgICBSTiAwCi1wQml0T2Zmc2V0ICAgICAgICAgICBSTiAxCi1wRHN0ICAgICAgICAgICAgICAgICBSTiAyCi1QcmVkRGlyICAgICAgICAgICAgICBSTiAzCi1zaG9ydFZpZGVvSGVhZGVyICAgICBSTiAzCi12aWRlb0NvbXAgICAgICAgICAgICBSTiA1Ci07Ly9Mb2NhbCBWYXJpYWJsZXMKLQotUmV0dXJuICAgICAgICAgICAgICAgUk4gMAotCi1wRENMdW1hQ2hyb21hSW5kZXggICBSTiA0Ci1wRENDaHJvbWFJbmRleCAgICAgICBSTiA3Ci1wVmxjVGFibGVMMEwxICAgICAgICBSTiA0Ci1wTE1BWFRhYmxlTDBMMSAgICAgICBSTiA0Ci1wUk1BWFRhYmxlTDBMMSAgICAgICBSTiA0Ci1wWmlnemFnVGFibGUgICAgICAgICBSTiA0Ci1Db3VudCAgICAgICAgICAgICAgICBSTiA2Ci1EQ1ZhbHVlU2l6ZSAgICAgICAgICBSTiA2Ci1wb3dPZlNpemUgICAgICAgICAgICBSTiA3Ci10ZW1wMSAgICAgICAgICAgICAgICBSTiA1Ci0KLQotOy8vIFNjcmF0Y2ggUmVnaXN0ZXJzCi0KLVJCaXRTdHJlYW0gICAgICAgICAgIFJOIDgKLVJCaXRCdWZmZXIgICAgICAgICAgIFJOIDkKLVJCaXRDb3VudCAgICAgICAgICAgIFJOIDEwCi0KLVQxICAgICAgICAgICAgICAgICAgIFJOIDExCi1UMiAgICAgICAgICAgICAgICAgICBSTiAxMgotRENWYWwgICAgICAgICAgICAgICAgUk4gMTQKLQotICAgICAgICAKLSAgICAgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSB0byBzdG9yZSBvcHRpbWl6ZWQgVkxDLFppZ3phZywgUk1BWCwgTE1BWCBUYWJsZSBBZGRyZXNzZXMgCi0gICAgIAotICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBWbGNUYWJsZUwwTDEsNAotICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBMTUFYVGFibGVMMEwxLDQKLSAgICAgICAgTV9BTExPQzQgICAgICAgIHBwUk1BWFRhYmxlTDBMMSw0Ci0gICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFppZ3phZ1RhYmxlLDQKLSAgICAgICAgTV9BTExPQzQgICAgICAgIHBEQ0NvZWZmLDQKLSAgICAgICAgCi0KLSAgICAgICAgCi0gICAgICAgIE1fU1RBUlQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLHIxMgotCi0gICAgICAgIE1fQVJHICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyb25TdGFjayw0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBQb2ludGVyIHRvIGFyZ3VtZW50IG9uIHN0YWNrICAKLSAgICAgICAgTV9BUkcgICAgICAgICAgIHZpZGVvQ29tcG9uc3RhY2ssNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFBvaW50ZXIgdG8gYXJndW1lbnQgb24gc3RhY2sKLQotICAgICAgICAKLSAgICAgICAgOy8vIERlY29kZSBEQyBDb2VmZmljaWVudAotCi0gICAgICAgIAotICAgICAgICBMRFIgICAgICAgICAgICAgcERDTHVtYUNocm9tYUluZGV4LCA9YXJtVkNNNFAyX2FJbnRyYURDTHVtYUNocm9tYUluZGV4IDsvLyBMb2FkIE9wdGltaXplZCBWTEMgVGFibGUgZm9yIEx1bWluYW5jZSBhbmQgQ2hyb21pbmFuY2UKLQotICAgICAgICA7Ly8gSW5pdGlhbGl6aW5nIHRoZSBCaXRzdHJlYW0gTWFjcm8KLQotICAgICAgICBNX0JEX0lOSVQwICAgICAgcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIFJCaXRTdHJlYW0sIFJCaXRCdWZmZXIsIFJCaXRDb3VudAotICAgICAgICBNX0xEUiAgICAgICAgICAgdmlkZW9Db21wLHZpZGVvQ29tcG9uc3RhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgTV9CRF9JTklUMSAgICAgIFQxLCBUMiwgVDIKLSAgICAgICAgQUREICAgICAgICAgICAgIHBEQ0x1bWFDaHJvbWFJbmRleCxwRENMdW1hQ2hyb21hSW5kZXgsdmlkZW9Db21wLCBMU0wgIzYgICAgICAgICAgICAgCi0gICAgICAgIE1fQkRfSU5JVDIgICAgICBUMSwgVDIsIFQyCi0gICAgCi0gICAgICAgIAotICAgICAgICBNX0JEX1ZMRCAgICAgICAgRENWYWx1ZVNpemUsVDEsVDIscERDTHVtYUNocm9tYUluZGV4LDQsMiAgICAgICAgICAgICAgICAgICAgOy8vIFZMQyBEZWNvZGUgdXNpbmcgb3B0aW1pemVkIEx1bWluYW5jZSBhbmQgQ2hyb21pbmFuY2UgVkxDIFRhYmxlCi0KLSAgICAKLSAgICAgICAKLQotRGVjb2RlREMKLSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQ01QICAgICAgICAgICAgIERDVmFsdWVTaXplLCMxMiAgICAgCi0gICAgICAgIEJHVCAgICAgICAgICAgICBFeGl0RXJyb3IKLSAgICAgICAgCi0gICAgICAgIENNUCAgICAgICAgICAgICBEQ1ZhbHVlU2l6ZSwjMAotICAgICAgICBNT1ZFUSAgICAgICAgICAgRENWYWwsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIERDVmFsdWVTaXplIGlzIHplcm8gdGhlbiBEQyBjb2VmZiA9MAotICAgICAgICBCRVEgICAgICAgICAgICAgQUNEZWNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byBwZXJmb3JtIEFDIENvZWZmIERlY29kaW5nCi0gICAgICAgIAotICAgICAgICBNX0JEX1ZSRUFEMTYgICAgRENWYWwsRENWYWx1ZVNpemUsVDEsVDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEdldCBEQyBWYWx1ZSBGcm9tIEJpdCBzdHJlYW0KLSAgICAgICAgIAotCi0gICAgICAgIE1PViAgICAgICAgICAgICBwb3dPZlNpemUsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgTFNMICAgICAgICAgICAgIHBvd09mU2l6ZSxEQ1ZhbHVlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwb3dPZlNpemU9cG93KDIsRENWYWx1ZVNpemUpCi0gICAgICAgIENNUCAgICAgICAgICAgICBEQ1ZhbCxwb3dPZlNpemUsTFNSICMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ29tcGFyZSBEQ1ZhbCB3aXRoIHBvd09mU2l6ZS8yIAotICAgICAgICBBRERMVCAgICAgICAgICAgRENWYWwsRENWYWwsIzEKLSAgICAgICAgU1VCTFQgICAgICAgICAgIERDVmFsLERDVmFsLHBvd09mU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBMZXNzdGhhbiBwb3dPZlNpemUvMiBEQ1ZhbD1EQ1ZhbC1wb3dPZlNpemUrMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEVsc2UgRENWYWw9IGZldGNoYml0cyBmcm9tIGJpdCBzdHJlYW0KLQotQ2hlY2tEQ1ZhbHVlU2l6ZQotICAgICAgICAKLSAgICAgICAgQ01QICAgICAgICAgICAgIERDVmFsdWVTaXplLCM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBEQ1ZhbHVlU2l6ZSBncmVhdGVyIHRoYW4gOCBjaGVjayBtYXJrZXIgYml0Ci0KLSAgICAgICAgQkxFICAgICAgICAgICAgIEFDRGVjb2RlCi0KLSAgICAgICAgTV9CRF9SRUFEOCAgICAgIHRlbXAxLDEsVDEKLSAgICAgICAgVEVRICAgICAgICAgICAgIHRlbXAxLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBNYXJrZXIgYml0IGlzIHplcm8gRXhpdCB3aXRoIGFuIEVycm9yIE1lc3NhZ2UKLSAgICAgICAgQkVRICAgICAgICAgICAgIEV4aXRFcnJvcgotCi0gICAgICAgIAotCi0gICAgICAgIDsvLyBEZWNvZGUgQUMgQ29lZmZpY2llbnQKLQotQUNEZWNvZGUKLQotICAgICAgICBNX1NUUiAgICAgICAgICAgRENWYWwscERDQ29lZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgRGVjb2RlZCBEQyBDb2VmZiBvbiBTdGFjawotICAgICAgICBNX0JEX0ZJTkkgICAgICAgcHBCaXRTdHJlYW0scEJpdE9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVGVybWluYXRpbmcgdGhlIEJpdCBzdHJlYW0gTWFjcm8KLSAgICAgICAgIAotICAgICAgICBMRFIgICAgICAgICAgICAgcFppZ3phZ1RhYmxlLCA9YXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuICAgICAgICAgIDsvLyBMb2FkIFppZ3phZyB0YWxiZSBhZGRyZXNzICAgCi0gICAgICAgIEFERCAgICAgICAgICAgICBwWmlnemFnVGFibGUsIHBaaWd6YWdUYWJsZSwgUHJlZERpciwgTFNMICM2ICAgICAgICAgICAgICAgIDsvLyBNb2RpZnkgdGhlIFppZ3phZyB0YWJsZSBhZHJlc3MgYmFzZWQgb24gUHJlZERpciAgICAgICAgICAgICAgICAKLSAgICAgICAKLSAgICAgICAgTV9TVFIgICAgICAgICAgIHBaaWd6YWdUYWJsZSxwcFppZ3phZ1RhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHppZ3phZyB0YWJsZSBvbiBzdGFjawotICAgICAgICBMRFIgICAgICAgICAgICAgcFZsY1RhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRyYVZsY0wwTDEgICAgICAgICAgICAgICAgIDsvLyBMb2FkIE9wdGltaXplZCBWTEMgVGFibGUgV2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xIEVudHJpZXMKLSAgICAgICAgTV9TVFIgICAgICAgICAgIHBWbGNUYWJsZUwwTDEscHBWbGNUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIE9wdGltaXplZCBWTEMgVGFibGUgb24gc3RhY2sKLSAgICAgICAgTERSICAgICAgICAgICAgIHBMTUFYVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludHJhTDBMMUxNQVggICAgICAgICAgICAgICA7Ly8gTG9hZCBMTUFYIFRhYmxlCi0gICAgICAgIE1fU1RSICAgICAgICAgICBwTE1BWFRhYmxlTDBMMSxwcExNQVhUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBMTUFYIHRhYmxlIG9uIHN0YWNrCi0gICAgICAgIExEUiAgICAgICAgICAgICBwUk1BWFRhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRyYUwwTDFSTUFYICAgICAgICAgICAgICAgOy8vIExvYWQgUk1BWCBUYWJsZQotICAgICAgICBNT1YgICAgICAgICAgICAgQ291bnQsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2V0IFN0YXJ0ID0xICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIE1fU1RSICAgICAgICAgICBwUk1BWFRhYmxlTDBMMSxwcFJNQVhUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBSTUFYIFRhYmxlIG9uIFN0YWNrCi0gICAgICAgIAotICAgICAgIAotICAgICAgICBNX0xEUiAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcixzaG9ydFZpZGVvSGVhZGVyb25TdGFjayAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCB0aGUgSW5wdXQgQXJndW1lbnQgRnJvbSBTdGFjawotICAgICAgICAKLSAgICAgICAgQkwgICAgICAgICAgICAgIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlICAgICAgICAgICAgICAgICAgICA7Ly8gQ2FsbCB0aGUgVW5zYWZlIEZ1bmN0aW9uCi0KLSAgICAgICAgTV9MRFIgICAgICAgICAgIERDVmFsLHBEQ0NvZWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEdldCB0aGUgRGVjb2RlZCBEQyBWYWx1ZSBGcm9tIFN0YWNrCi0gICAgICAgIFNUUkggICAgICAgICAgICBEQ1ZhbCxbcERzdF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSB0aGUgREMgVmFsdWUgCi0gICAgICAgIEIgICAgICAgICAgICAgICBFeGl0T0sKLSAgICAgICAgCi0gICAgICAgICAgICAgIAotCi1FeGl0RXJyb3IKLSAKLSAgICAgICAgTV9CRF9GSU5JICAgICAgIHBwQml0U3RyZWFtLHBCaXRPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRlcm1pbmF0aW5nIHRoZSBCaXQgU3RyZWFtIE1hY3JvIGluIGNhc2Ugb2YgYW4gRXJyb3IKLSAgICAgICAgTU9WICAgICAgICAgICAgIFJldHVybiwjT01YX1N0c19FcnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4aXQgd2l0aCBhbiBFcnJvciBNZXNzYWdlIAotRXhpdE9LCi0gICAgICAKLSAgICAgICAgTV9FTkQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgCi0gICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9GaW5kTVZwcmVkX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRmluZE1WcHJlZF9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyYWNkNTEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9GaW5kTVZwcmVkX3MucworKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAyX0ZpbmRNVnByZWRfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgOTY0MQotOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotOy8vIEZ1bmN0aW9uOgotOy8vICAgICBvbXhWQ000UDJfRmluZE1WcHJlZAotOy8vCi0gICAgICAgIDsvLyBJbmNsdWRlIGhlYWRlcnMKLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICBJTkNMVURFIGFybVZDQ09NTV9zLmgKLQotICAgICAgICA7Ly8gRGVmaW5lIGNwdSB2YXJpYW50cwotICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIElGIEFSTTExMzZKUwotICAgICAgICAKLSAgICAgICAgTV9UQUJMRSBhcm1WQ000UDJfcEJsa0luZGV4VGFibGUKLSAgICAgICAgRENEICBPTVhWQ0JsazAsIE9NWFZDQmxrMQotICAgICAgICBEQ0QgIE9NWFZDQmxrMiwgT01YVkNCbGszCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIAotcFNyY01WQ3VyTUIgICAgICAgICAgICBSTiAwCi1wU3JjQ2FuZE1WMSAgICAgICAgICAgIFJOIDEKLXBTcmNDYW5kTVYyICAgICAgICAgICAgUk4gMgotcFNyY0NhbmRNVjMgICAgICAgICAgICBSTiAzCi1wRHN0TVZQcmVkICAgICAgICAgICAgIFJOIDQKLXBEc3RNVlByZWRNRSAgICAgICAgICAgUk4gNQotaUJsayAgICAgICAgICAgICAgICAgICBSTiA2Ci0KLXBUYWJsZSAgICAgICAgICAgICAgICAgUk4gNAotQ2FuZE1WICAgICAgICAgICAgICAgICBSTiAxMgotCi1wQ2FuZE1WMSAgICAgICAgICAgICAgIFJOIDcKLXBDYW5kTVYyICAgICAgICAgICAgICAgUk4gOAotcENhbmRNVjMgICAgICAgICAgICAgICBSTiA5Ci0KLUNhbmRNVjFkeCAgICAgICAgICAgICAgUk4gMCAKLUNhbmRNVjFkeSAgICAgICAgICAgICAgUk4gMSAKLUNhbmRNVjJkeCAgICAgICAgICAgICAgUk4gMgotQ2FuZE1WMmR5ICAgICAgICAgICAgICBSTiAzCi1DYW5kTVYzZHggICAgICAgICAgICAgIFJOIDEwCi1DYW5kTVYzZHkgICAgICAgICAgICAgIFJOIDExCi0KLXRlbXAgICAgICAgICAgICAgICAgICAgUk4gMTQKLQotemVybyAgICAgICAgICAgICAgICAgICBSTiAxNAotcmV0dXJuICAgICAgICAgICAgICAgICBSTiAwCi0gICAgICAgIAotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IE1haW4gcm91dGluZQotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAKLQotICAgICAgICBNX0FMTE9DNCBNViwgNAotICAgICAgICAKLSAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlciAKLSAgICAgICAgTV9TVEFSVCBvbXhWQ000UDJfRmluZE1WcHJlZCwgcjExCi0gICAgICAgIAotICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cwotICAgICAgICBNX0FSRyAgIHBwRHN0TVZQcmVkLCAgNAotICAgICAgICBNX0FSRyAgIHBwRHN0TVZQcmVkTUUsIDQKLSAgICAgICAgTV9BUkcgICBCbGssIDQKLSAgICAgICAgCi0gICAgICAgIE1fQURSIENhbmRNViwgTVYKLSAgICAgICAgTU9WICAgemVybywgIzAKLSAgICAgICAgTV9MRFIgaUJsaywgQmxrCi0gICAgICAgIAotICAgICAgICA7Ly8gU2V0IHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGVzZQotICAgICAgICA7Ly8gdG8gYmUgdXNlZCBpZiBwU3JjQ2FuZE1WWzF8MnwzXSA9PSBOVUxMCi0gICAgICAgIE1PViAgIHBDYW5kTVYxLCBDYW5kTVYKLSAgICAgICAgTU9WICAgcENhbmRNVjIsIENhbmRNVgotICAgICAgICBNT1YgICBwQ2FuZE1WMywgQ2FuZE1WCi0gICAgCi0gICAgICAgIFNUUiAgIHplcm8sIFtDYW5kTVZdCi0KLSAgICAgICAgOy8vIEJyYW5jaCB0byB0aGUgY2FzZSBiYXNlZCBvbiBibGsgbnVtYmVyCi0gICAgICAgIE1fU1dJVENIIGlCbGsKLSAgICAgICAgTV9DQVNFICAgT01YVkNCbGswICAgICAgOy8vIGlCbGs9MAotICAgICAgICBNX0NBU0UgICBPTVhWQ0JsazEgICAgICA7Ly8gaUJsaz0wCi0gICAgICAgIE1fQ0FTRSAgIE9NWFZDQmxrMiAgICAgIDsvLyBpQmxrPTAKLSAgICAgICAgTV9DQVNFICAgT01YVkNCbGszICAgICAgOy8vIGlCbGs9MAotICAgICAgICBNX0VORFNXSVRDSAotICAgICAgICAKLU9NWFZDQmxrMAotICAgICAgICBDTVAgICBwU3JjQ2FuZE1WMSwgIzAKLSAgICAgICAgQURETkUgcENhbmRNVjEsIHBTcmNDYW5kTVYxLCAjNAotICAgICAgICAKLSAgICAgICAgQ01QICAgcFNyY0NhbmRNVjIsICMwCi0gICAgICAgIEFERE5FIHBDYW5kTVYyLCBwU3JjQ2FuZE1WMiwgIzgKLQotICAgICAgICBDTVAgICBwU3JjQ2FuZE1WMywgIzAKLSAgICAgICAgQURETkUgcENhbmRNVjMsIHBTcmNDYW5kTVYzLCAjOAotICAgICAgICBDTVBFUSBwU3JjQ2FuZE1WMSwgIzAKLSAgICAKLSAgICAgICAgTU9WRVEgcENhbmRNVjMsIHBDYW5kTVYyCi0gICAgICAgIE1PVkVRIHBDYW5kTVYxLCBwQ2FuZE1WMgotICAgICAgICAgICAgICAgIAotICAgICAgICBDTVAgICBwU3JjQ2FuZE1WMSwgIzAKLSAgICAgICAgQ01QRVEgcFNyY0NhbmRNVjIsICMwCi0gICAgCi0gICAgICAgIE1PVkVRIHBDYW5kTVYxLCBwQ2FuZE1WMwotICAgICAgICBNT1ZFUSBwQ2FuZE1WMiwgcENhbmRNVjMKLSAgICAgICAgCi0gICAgICAgIENNUCAgIHBTcmNDYW5kTVYyLCAjMAotICAgICAgICBDTVBFUSBwU3JjQ2FuZE1WMywgIzAKLSAgICAKLSAgICAgICAgTU9WRVEgcENhbmRNVjIsIHBDYW5kTVYxCi0gICAgICAgIE1PVkVRIHBDYW5kTVYzLCBwQ2FuZE1WMQotICAgICAgICAKLSAgICAgICAgQiAgICAgQmxrRW5kCi0gICAgCi1PTVhWQ0JsazEKLSAgICAgICAgTU9WICAgcENhbmRNVjEsIHBTcmNNVkN1ck1CCi0gICAgICAgIENNUCAgIHBTcmNDYW5kTVYzLCAjMAotICAgICAgICBBRERORSBwQ2FuZE1WMywgcFNyY0NhbmRNVjMsICM4Ci0gICAgICAgIAotICAgICAgICBDTVAgICBwU3JjQ2FuZE1WMiwgIzAKLSAgICAgICAgQURETkUgcENhbmRNVjIsIHBTcmNDYW5kTVYyLCAjMTIKLSAgICAKLSAgICAgICAgQ01QRVEgcFNyY0NhbmRNVjMsICMwCi0gICAgCi0gICAgICAgIE1PVkVRIHBDYW5kTVYyLCBwQ2FuZE1WMQotICAgICAgICBNT1ZFUSBwQ2FuZE1WMywgcENhbmRNVjEKLSAgICAgICAgICAgIAotICAgICAgICBCICAgICBCbGtFbmQKLQotT01YVkNCbGsyCi0gICAgICAgIENNUCAgIHBTcmNDYW5kTVYxLCAjMAotICAgICAgICBNT1YgICBwQ2FuZE1WMiwgcFNyY01WQ3VyTUIKLSAgICAgICAgQUREICAgcENhbmRNVjMsIHBTcmNNVkN1ck1CLCAjNAotICAgICAgICBBRERORSBwQ2FuZE1WMSwgcFNyY0NhbmRNVjEsICMxMgotICAgICAgICBCICAgICBCbGtFbmQKLQotT01YVkNCbGszCi0gICAgICAgIEFERCAgIHBDYW5kTVYxLCBwU3JjTVZDdXJNQiwgIzgKLSAgICAgICAgTU9WICAgcENhbmRNVjIsIHBTcmNNVkN1ck1CCi0gICAgICAgIEFERCAgIHBDYW5kTVYzLCBwU3JjTVZDdXJNQiwgIzQKLSAgICAKLUJsa0VuZAotCi0gICAgICAgIDsvLyBVc2luZyB0aGUgdHJhbnNwZXJhbmN5IGluZm8sIHplcm8KLSAgICAgICAgOy8vIG91dCB0aGUgY2FuZGlkYXRlIE1WIGlmIG5lY2Nlc2FyeQotICAgICAgICBMRFJTSCBDYW5kTVYxZHgsIFtwQ2FuZE1WMV0sICMyCi0gICAgICAgIExEUlNIIENhbmRNVjJkeCwgW3BDYW5kTVYyXSwgIzIKLSAgICAgICAgTERSU0ggQ2FuZE1WM2R4LCBbcENhbmRNVjNdLCAjMgotICAgIAotICAgICAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjawotICAgICAgICBNX0xEUiBwRHN0TVZQcmVkTUUsIHBwRHN0TVZQcmVkTUUKLQotICAgICAgICBMRFJTSCBDYW5kTVYxZHksIFtwQ2FuZE1WMV0KLSAgICAgICAgTERSU0ggQ2FuZE1WMmR5LCBbcENhbmRNVjJdCi0gICAgICAgIExEUlNIIENhbmRNVjNkeSwgW3BDYW5kTVYzXQotCi0gICAgICAgIENNUCBwRHN0TVZQcmVkTUUsICMwICAgICAgICAKLQotICAgICAgICA7Ly8gU3RvcmUgdGhlIGNhbmRpZGF0ZSBNVidzIGludG8gdGhlIHBEc3RNVlByZWRNRSwgCi0gICAgICAgIDsvLyB0aGVzZSBjYW4gYmUgdXNlZCBpbiB0aGUgZmFzdCBhbGdvcml0aG0gaWYgaW1wbGVtZW50ZWQgCi0KLSAgICAgICAgU1RSSE5FIENhbmRNVjFkeCwgW3BEc3RNVlByZWRNRV0sICMyCi0gICAgICAgIFNUUkhORSBDYW5kTVYxZHksIFtwRHN0TVZQcmVkTUVdLCAjMiAgICAgICAgCi0gICAgICAgIFNUUkhORSBDYW5kTVYyZHgsIFtwRHN0TVZQcmVkTUVdLCAjMgotICAgICAgICBTVFJITkUgQ2FuZE1WMmR5LCBbcERzdE1WUHJlZE1FXSwgIzIKLSAgICAgICAgU1RSSE5FIENhbmRNVjNkeCwgW3BEc3RNVlByZWRNRV0sICMyCi0gICAgICAgIFNUUkhORSBDYW5kTVYzZHksIFtwRHN0TVZQcmVkTUVdCi0gICAgICAgICAgIAotICAgICAgICA7IEZpbmQgdGhlIG1lZGlhbiBvZiB0aGUgMyBjYW5kaWRhdGUgTVYncwotICAgICAgICBNX01FRElBTjMgQ2FuZE1WMWR4LCBDYW5kTVYyZHgsIENhbmRNVjNkeCwgdGVtcAotCi0gICAgICAgIDsvLyBMb2FkIGFyZ3VtZW50IGZyb20gdGhlIHN0YWNrCi0gICAgICAgIE1fTERSIHBEc3RNVlByZWQsIHBwRHN0TVZQcmVkCi0KLSAgICAgICAgTV9NRURJQU4zIENhbmRNVjFkeSwgQ2FuZE1WMmR5LCBDYW5kTVYzZHksIHRlbXAKLSAgICAKLSAgICAgICAgU1RSSCBDYW5kTVYzZHgsIFtwRHN0TVZQcmVkXSwgIzIKLSAgICAgICAgU1RSSCBDYW5kTVYzZHksIFtwRHN0TVZQcmVkXQotCi0gICAgICAgIE1PViByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0gICAgCi0gICAgICAgIE1fRU5ECi0gICAgRU5ESUYgOy8vIEFSTTExMzZKUyA6TE9SOiBDb3J0ZXhBOAotICAgIAotICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfSURDVDh4OGJsa19zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZjkxZmIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrX3MucworKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDJfSURDVDh4OGJsa19zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi07Ly8gRnVuY3Rpb246Ci07Ly8gICAgIG9teFZDTTRQMl9JRENUOHg4YmxrCi07Ly8KLSAgICAgICAgOy8vIEluY2x1ZGUgaGVhZGVycwotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0KLSAgICAgICAgOy8vIERlZmluZSBjcHUgdmFyaWFudHMKLSAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLQotICAgICAgICBJTkNMVURFIGFybUNPTU1fSURDVF9zLmggICAgICAgIAotICAgICAgICAKLSAgICAgICAgSU1QT1JUIGFybUNPTU1fSURDVFByZVNjYWxlCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gRnVuY3Rpb24gcHJvdG90eXBlCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gICAgIE9NWFJlc3VsdAotICAgICAgICA7Ly8gICAgIG9teFZDTTRQMl9JRENUOHg4YmxrKGNvbnN0IE9NWF9TMTYqIHBTcmMsCi0gICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMTYqIHBEc3QpCi0gICAgICAgIDsvLyAgICAKLSAgICAgICAgCi0gICAgSUYgQVJNMTEzNkpTIDpMT1I6IENvcnRleEE4Ci0gICAgICAgIE1fQUxMT0M0ICBwcERlc3QsIDQKLSAgICAgICAgTV9BTExPQzQgIHBTdHJpZGUsIDQKLSAgICAgICAgTV9BTExPQzggIHBCbGssIDIqOCo4Ci0gICAgRU5ESUYKLSAgICAKLSAgICBJRiBBUk0xMTM2SlMKLSAgICAgICAgTV9TVEFSVCBvbXhWQ000UDJfSURDVDh4OGJsaywgcjExCi0gICAgRU5ESUYKLSAgICAKLSAgICAgICAgCi0gICAgSUYgQVJNMTEzNkpTIDpMT1I6IENvcnRleEE4Ci0gICAgICAgIAotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi1wU3JjICAgICAgICAgICAgUk4gMAotcERzdCAgICAgICAgICAgIFJOIDEKLQotOy8vIERlY2xhcmUgb3RoZXIgaW50ZXJtZWRpYXRlIHJlZ2lzdGVycwotUmVzdWx0ICAgICAgICAgIFJOIDAKLQotOy8vIFByb3RvdHlwZSBmb3IgbWFjcm8gTV9JRENUCi07Ly8gcFNyYyAgICAgICAgICAgIFJOIDAgIDsvLyBzb3VyY2UgZGF0YSBidWZmZXIKLTsvLyBTdHJpZGUgICAgICAgICAgUk4gMSAgOy8vIGRlc3RpbmF0aW9uIHN0cmlkZSBpbiBieXRlcwotOy8vIHBEZXN0ICAgICAgICAgICBSTiAyICA7Ly8gZGVzdGluYXRpb24gZGF0YSBidWZmZXIKLTsvLyBwU2NhbGUgICAgICAgICAgUk4gMyAgOy8vIHBvaW50ZXIgdG8gc2NhbGluZyB0YWJsZQotCi1wU3JjICAgIFJOIDAgICAgCi1TdHJpZGUgIFJOIDEgICAgCi1wRGVzdCAgIFJOIDIgICAgCi1wU2NhbGUgIFJOIDMgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIE1PViAgICAgICAgIHBEZXN0LCBwRHN0Ci0gICAgICAgIExEUiAgICAgICAgIHBTY2FsZSwgPWFybUNPTU1fSURDVFByZVNjYWxlICAgICAgICAKLSAgICAgICAgTV9JRENUICAgICAgczksIHMxNiwgMTYgICAgICAKLSAgICAgICAgTU9WICAgICAgICAgUmVzdWx0LCAjT01YX1N0c19Ob0VycgotICAgICAgICBNX0VORCAgICAgICAKLSAgICBFTkRJRiAgCi0gICAgICAgIDsvLyBBUk0xMTM2SlMgOkxPUjogQ29ydGV4QTgKLQotICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2tfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2tfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWM2ZmY5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUNSZWNvbkJsb2NrX3MucworKysgL2Rldi9udWxsCkBAIC0xLDcyNyArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAyX01DUmVjb25CbG9ja19zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotOy8vIERlc2NyaXB0aW9uOgotOy8vCi07Ly8KLQotOy8vIEluY2x1ZGUgc3RhbmRhcmQgaGVhZGVycwotICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgSU5DTFVERSBhcm1DT01NX3MuaAotCi07Ly8gSW1wb3J0IHN5bWJvbHMgcmVxdWlyZWQgZnJvbSBvdGhlciBmaWxlcwotCi0gICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLQotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOy8vIEFSTTExMzZKUyBpbXBsZW1lbnRhdGlvbgotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIElGICBBUk0xMTM2SlMKLSAgICAKLTsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsvLyBNQUNSTyBERUZJTklUSU9OUwotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIDsvLyBEZXNjcmlwdGlvbjoKLSAgICA7Ly8KLSAgICA7Ly8gICBkZXN0W2pdID0gKHhbal0gKyB5W2pdICsgcm91bmQpID4+IDEsICAgaj0wLi4zCi0gICAgOy8vCi0gICAgOy8vIFNpbWlsYXIgdG8gVUhBREQ4IGluc3RydWN0aW9uLCBidXQgd2l0aCBhIHJvdW5kaW5nIHZhbHVlIG9mIDEgYWRkZWQgdG8KLSAgICA7Ly8gZWFjaCBzdW0gYmVmb3JlIGRpdmlkaW5nIGJ5IHR3bywgaWYgcm91bmQgaXMgMQotICAgIDsvLwotICAgIDsvLyBTeW50YXg6Ci0gICAgOy8vIE1fVUhBREQ4UiAgICRkZXN0LCAkeCwgJHksICRyb3VuZCwgJG1hc2sKLSAgICA7Ly8KLSAgICA7Ly8gSW5wdXRzOgotICAgIDsvLyAkeCAgICAgICAgZm91ciBwYWNrZWQgYnl0ZXMsICAgeFszXSA6ICB4WzJdICA6ICB4WzFdICA6ICB4WzBdCi0gICAgOy8vICR5ICAgICAgICBmb3VyIHBhY2tlZCBieXRlcywgICB5WzNdIDogIHlbMl0gIDogIHlbMV0gIDogIHlbMF0KLSAgICA7Ly8gJHJvdW5kICAgIDAgaWYgbm8gcm91bmRpbmcgdG8gYmUgYWRkZWQsIDEgaWYgcm91bmRpbmcgdG8gYmUgZG9uZQotICAgIDsvLyAkbWFzayAgICAgc29tZSByZWdpc3RlciBzZXQgdG8gMHg4MDgwODA4MAotICAgIDsvLwotICAgIDsvLyBPdXRwdXRzOgotICAgIDsvLyAkZGVzdCAgICAgZm91ciBwYWNrZWQgYnl0ZXMsICAgelszXSA6ICB6WzJdICA6ICB6WzFdICA6ICB6WzBdCi0KLSAgICBNQUNSTwotICAgIE1fVUhBREQ4UiAgICRkZXN0LCAkeCwgJHksICRyb3VuZCwgJG1hc2sKLSAgICBJRiAkcm91bmQgPSAxCi0gICAgICAgIElGICAkZGVzdCAvPSAkeQotICAgICAgICAgICAgTVZOICAgICAgICAgJGRlc3QsICR4Ci0gICAgICAgICAgICBVSFNVQjggICAgICAkZGVzdCwgJHksICRkZXN0Ci0gICAgICAgICAgICBFT1IgICAgICAgICAkZGVzdCwgJGRlc3QsICRtYXNrCi0gICAgICAgIEVMU0UKLSAgICAgICAgICAgIE1WTiAgICAgICAgICRkZXN0LCAkeQotICAgICAgICAgICAgVUhTVUI4ICAgICAgJGRlc3QsICR4LCAkZGVzdAotICAgICAgICAgICAgRU9SICAgICAgICAgJGRlc3QsICRkZXN0LCAkbWFzawotICAgICAgICBFTkRJRgotICAgIEVMU0UKLSAgICAgICAgVUhBREQ4ICAgICAgJGRlc3QsICR4LCAkeQotICAgIEVORElGCi0gICAgTUVORAotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIDsvLyBEZXNjcmlwdGlvbjoKLSAgICA7Ly8gTG9hZCA4IGJ5dGVzIGZyb20gJHBTcmMgKGFsaWduZWQgb3IgdW5hbGlnbmVkIGxvY2F0aW9ucykKLSAgICA7Ly8KLSAgICA7Ly8gU3ludGF4OgotICAgIDsvLyBNX0xPQURfWCAgICAkcFNyYywgJHNyY1N0ZXAsICRvdXQwLCAkb3V0MSwgJHNjcmF0Y2gsICRvZmZzZXQKLSAgICA7Ly8gCi0gICAgOy8vIElucHV0czoKLSAgICA7Ly8gJHBTcmMgICAgICAgNCBieXRlIGFsaWduZWQgc291cmNlIHBvaW50ZXIgdG8gYW4gYWRkcmVzcyBqdXN0IGxlc3MgdGhhbiAKLSAgICA7Ly8gICAgICAgICAgICAgb3IgZXF1YWwgdG8gdGhlIGRhdGEgbG9jYXRpb24KLSAgICA7Ly8gJHNyY1N0ZXAgICAgVGhlIHN0cmlkZSBvbiBzb3VyY2UKLSAgICA7Ly8gJHNjcmF0Y2ggICAgQSBzY3JhdGNoIHJlZ2lzdGVyLCB1c2VkIGludGVybmFsbHkgZm9yIHRlbXAgY2FsY3VsYXRpb25zCi0gICAgOy8vICRvZmZzZXQgICAgIERpZmZlcmVuY2Ugb2Ygc291cmNlIGRhdGEgbG9jYXRpb24gdG8gdGhlIHNvdXJjZSBwb2ludGVyCi0gICAgOy8vICAgICAgICAgICAgIFVzZSB3aGVuICRvZmZzZXQgIT0gMCAodW5hbGlnbmVkIGxvYWQpCi0gICAgOy8vCi0gICAgOy8vIE91dHB1dHM6Ci0gICAgOy8vICRwU3JjICAgICAgIEluIGNhc2UgdGhlIG1hY3JvIGFjY2VwdHMgc3RyaWRlLCBpdCBpbmNyZW1lbnRzIHRoZSBwU3JjIGJ5IAotICAgIDsvLyAgICAgICAgICAgICB0aGF0IHZhbHVlLCBlbHNlIHVuY2hhbmdlZAotICAgIDsvLyAkb3V0MCAgICAgICBmb3VyIHBhY2tlZCBieXRlcywgICB6WzNdIDogIHpbMl0gIDogIHpbMV0gIDogIHpbMF0KLSAgICA7Ly8gJG91dDEgICAgICAgZm91ciBwYWNrZWQgYnl0ZXMsICAgels3XSA6ICB6WzZdICA6ICB6WzVdICA6ICB6WzRdCi0gICAgOy8vCi0gICAgOy8vIE5vdGU6IHskb3V0MCwgJG91dDEsICRzY3JhdGNofSBzaG91bGQgYmUgcmVnaXN0ZXJzIHdpdGggYXNjZW5kaW5nCi0gICAgOy8vIHJlZ2lzdGVyIG51bWJlcmluZy4gSW4gY2FzZSBvZmZzZXQgaXMgMCwgJHNjcmF0Y2ggaXMgbm90IG1vZGlmaWVkLgotCi0gICAgTUFDUk8KLSAgICBNX0xPQURfWCAgICAkcFNyYywgJHNyY1N0ZXAsICRvdXQwLCAkb3V0MSwgJHNjcmF0Y2gsICRvZmZzZXQKLSAgICAgICAgSUYgJG9mZnNldCA9IDAKLSAgICAgICAgICAgIExETSAgICAgICAgICRwU3JjLCB7JG91dDAsICRvdXQxfQotICAgICAgICAgICAgQUREICAgICAgICAgJHBTcmMsICRwU3JjLCAkc3JjU3RlcAotICAgICAgICBFTFNFCi0gICAgICAgICAgICBMRE0gICAgICAgICAkcFNyYywgeyRvdXQwLCAkb3V0MSwgJHNjcmF0Y2h9IAotICAgICAgICAgICAgQUREICAgICAgICAgJHBTcmMsICRwU3JjLCAkc3JjU3RlcAotICAgICAgICAgICAgCi0gICAgICAgICAgICBNT1YgICAgICAgICAkb3V0MCwgJG91dDAsIExTUiAjOCAqICRvZmZzZXQKLSAgICAgICAgICAgIE9SUiAgICAgICAgICRvdXQwLCAkb3V0MCwgJG91dDEsIExTTCAjKDMyIC0gOCAqICgkb2Zmc2V0KSkKLSAgICAgICAgICAgIE1PViAgICAgICAgICRvdXQxLCAkb3V0MSwgTFNSICM4ICogJG9mZnNldAotICAgICAgICAgICAgT1JSICAgICAgICAgJG91dDEsICRvdXQxLCAkc2NyYXRjaCwgTFNMICMoMzIgLSA4ICogKCRvZmZzZXQpKQotICAgICAgICBFTkRJRgotICAgIE1FTkQKLQotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIDsvLyBEZXNjcmlwdGlvbjoKLSAgICA7Ly8gTG9hZHMgdGhyZWUgd29yZHMgZm9yIFggaW50ZXJwb2xhdGlvbiwgdXBkYXRlIHBvaW50ZXIgdG8gbmV4dCByb3cuIEZvciAKLSAgICA7Ly8gWCBpbnRlcnBvbGF0aW9uLCBnaXZlbiBhIHRydW5jYXRlZC00Ynl0ZUFsaWduZWQgc291cmNlIHBvaW50ZXIsIAotICAgIDsvLyBpbnZhcmlhYmx5IHRocmVlIGNvbnRpbm91cyB3b3JkcyBhcmUgcmVxdWlyZWQgZnJvbSB0aGVyZSB0byBnZXQgdGhlCi0gICAgOy8vIG5pbmUgYnl0ZXMgZnJvbSB0aGUgc291cmNlIHBvaW50ZXIgZm9yIGZpbHRlcmluZy4gCi0gICAgOy8vCi0gICAgOy8vIFN5bnRheDoKLSAgICA7Ly8gTV9MT0FEX1hJTlQgJHBTcmMsICRzcmNTdGVwLCAkb2Zmc2V0LCAkd29yZDAsICR3b3JkMSwgJHdvcmQyLCAkd29yZDMKLSAgICA7Ly8gCi0gICAgOy8vIElucHV0czoKLSAgICA7Ly8gJHBTcmMgICAgICAgNCBieXRlIGFsaWduZWQgc291cmNlIHBvaW50ZXIgdG8gYW4gYWRkcmVzcyBqdXN0IGxlc3MgdGhhbiAKLSAgICA7Ly8gICAgICAgICAgICAgb3IgZXF1YWwgdG8gdGhlIGRhdGEgbG9jYXRpb24KLSAgICA7Ly8KLSAgICA7Ly8gJHNyY1N0ZXAgICAgVGhlIHN0cmlkZSBvbiBzb3VyY2UKLSAgICA7Ly8KLSAgICA7Ly8gJG9mZnNldCAgICAgRGlmZmVyZW5jZSBvZiBzb3VyY2UgZGF0YSBsb2NhdGlvbiB0byB0aGUgc291cmNlIHBvaW50ZXIKLSAgICA7Ly8gICAgICAgICAgICAgVXNlIHdoZW4gJG9mZnNldCAhPSAwICh1bmFsaWduZWQgbG9hZCkKLSAgICA7Ly8KLSAgICA7Ly8gT3V0cHV0czoKLSAgICA7Ly8gJHBTcmMgICAgICAgSW5jcmVtZW50ZWQgYnkgJHNyY1N0ZXAKLSAgICA7Ly8KLSAgICA7Ly8gJHdvcmQwLCAkd29yZDEsICR3b3JkMiwgJHdvcmQzCi0gICAgOy8vICAgICAgICAgICAgIFRocmVlIG9mIHRoZXNlIGFyZSBvdXRwdXRzIGJhc2VkIG9uIHRoZSAkb2Zmc2V0IHBhcmFtZXRlci4gCi0gICAgOy8vICAgICAgICAgICAgIFRoZSBvdXRwdXRzIGFyZSBzcGVjaWZpY2FsbHkgZ2VuZXJhdGVkIHRvIGJlIHByb2Nlc3NlZCBieSAKLSAgICA7Ly8gICAgICAgICAgICAgdGhlIE1fRVhUX1hJTlQgbWFjcm8uIEZvbGxvd2luZyBpcyB0aGUgaWxsdXN0cmF0aW9uIHRvIHNob3cgCi0gICAgOy8vICAgICAgICAgICAgIGhvdyB0aGUgbmluZSBieXRlcyBhcmUgc3Bhbm5lZCBmb3IgZGlmZmVyZW50IG9mZnNldHMgZnJvbSAKLSAgICA7Ly8gICAgICAgICAgICAgbm90VHJ1bmNhdGVkRm9yQWxpZ25tZW50U291cmNlUG9pbnRlci4KLSAgICA7Ly8KLSAgICA7Ly8gICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsvLyAgICAgICAgICAgICB8IE9mZnNldCB8IEFsaWduZWQgUHRyIHwgd29yZDAgfCB3b3JkMSB8IHdvcmQyIHwgd29yZDMgfAotICAgIDsvLyAgICAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAotICAgIDsvLyAgICAgICAgICAgICB8ICAgIDAgICB8ICAgICAgIDAgICAgIHwgMDEyMyAgfCA0NTY3ICB8IDh4eHggIHwgICAgICAgfAotICAgIDsvLyAgICAgICAgICAgICB8ICAgIDEgICB8ICAgICAgLTEgICAgIHwgeDAxMiAgfCAzNDU2ICB8IDc4eHggIHwgICAgICAgfAotICAgIDsvLyAgICAgICAgICAgICB8ICAgIDIgICB8ICAgICAgLTIgICAgIHwgeHgwMSAgfCAyMzQ1ICB8IDY3OHggIHwgICAgICAgfAotICAgIDsvLyAgICAgICAgICAgICB8ICAgIDMgICB8ICAgICAgLTMgICAgIHwgeHh4MCAgfCAgICAgICB8IDEyMzQgIHwgNTY3OCAgfAotICAgIDsvLyAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOy8vIAotICAgIDsvLyAgICAgICAgICAgICB3aGVyZSB0aGUgbnVtYmVyaW5nICgwLTgpIGlzIHRvIGRlc2lnbmF0ZSB0aGUgOSBieXRlcyBmcm9tCi0gICAgOy8vICAgICAgICAgICAgIHN0YXJ0IG9mIGEgcGFydGljdWxhciByb3cuIFRoZSBpbGx1c3RyYXRpb24gZG9lc24ndCB0YWtlIGluIAotICAgIDsvLyAgICAgICAgICAgICBhY2NvdW50IHRoZSBwb3NpdGlvbmluZyBvZiBieXRlcyB3aXRoIGluIHRoZSB3b3JkIGFuZCB0aGUgCi0gICAgOy8vICAgICAgICAgICAgIG1hY3JvIGNvbWJpbmF0aW9uIHdpdGggTV9FWFRfWElOVCB3aWxsIHdvcmsgb25seSBpbiBsaXR0bGUgCi0gICAgOy8vICAgICAgICAgICAgIGVuZGlhbiBlbnZpcm9ucwotICAgIDsvLyAKLSAgICA7Ly8gTm90ZTogeyR3b3JkMCwgJHdvcmQxLCAkd29yZDIsICR3b3JkM30gc2hvdWxkIGJlIHJlZ2lzdGVycyB3aXRoIGFzY2VuZGluZwotICAgIDsvLyByZWdpc3RlciBudW1iZXJpbmcKLQotICAgIE1BQ1JPCi0gICAgTV9MT0FEX1hJTlQgJHBTcmMsICRzcmNTdGVwLCAkb2Zmc2V0LCAkd29yZDAsICR3b3JkMSwgJHdvcmQyLCAkd29yZDMKLSAgICAgICAgSUYgJG9mZnNldCAvPSAzCi0gICAgICAgICAgICBMRE0gICAgICAgICAkcFNyYywgeyR3b3JkMCwgJHdvcmQxLCAkd29yZDJ9Ci0gICAgICAgIEVMU0UKLSAgICAgICAgICAgIExETSAgICAgICAgICRwU3JjLCB7JHdvcmQwLCAkd29yZDIsICR3b3JkM30KLSAgICAgICAgRU5ESUYKLSAgICAgICAgQUREICAgICAgICAgJHBTcmMsICRwU3JjLCAkc3JjU3RlcAotICAgIE1FTkQKLQotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIDsvLyBEZXNjcmlwdGlvbjoKLSAgICA7Ly8gRXh0cmFjdCBmb3VyIHJlZ2lzdGVycyBvZiBmb3VyIHBpeGVscyBmb3IgWCBpbnRlcnBvbGF0aW9uIAotICAgIDsvLyAKLSAgICA7Ly8gU3ludGF4OgotICAgIDsvLyBNX0VYVF9YSU5UICRvZmZzZXQsICR3b3JkMCwgJHdvcmQxLCAkd29yZDIsICR3b3JkMwotICAgIDsvLyAKLSAgICA7Ly8gSW5wdXRzOgotICAgIDsvLyAkb2Zmc2V0ICAgICBEaWZmZXJlbmNlIG9mIHNvdXJjZSBkYXRhIGxvY2F0aW9uIHRvIHRoZSBzb3VyY2UgcG9pbnRlcgotICAgIDsvLyAgICAgICAgICAgICBVc2Ugd2hlbiAkb2Zmc2V0ICE9IDAgKHVuYWxpZ25lZCBsb2FkKQotICAgIDsvLyAKLSAgICA7Ly8gJHdvcmQwLCAkd29yZDEsICR3b3JkMiwgJHdvcmQzCi0gICAgOy8vICAgICAgICAgICAgIFRocmVlIG9mIHRoZXNlIGFyZSBpbnB1dHMgYmFzZWQgb24gdGhlICRvZmZzZXQgcGFyYW1ldGVyLiAKLSAgICA7Ly8gICAgICAgICAgICAgVGhlIGlucHV0cyBhcmUgc3BlY2lmaWNhbGx5IHNlbGVjdGVkIHRvIGJlIHByb2Nlc3NlZCBieSAKLSAgICA7Ly8gICAgICAgICAgICAgdGhlIE1fRVhUX1hJTlQgbWFjcm8uCi0gICAgOy8vCi0gICAgOy8vICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7Ly8gICAgICAgICAgICAgfCBPZmZzZXQgfCBBbGlnbmVkIFB0ciB8IHdvcmQwIHwgd29yZDEgfCB3b3JkMiB8IHdvcmQzIHwKLSAgICA7Ly8gICAgICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKLSAgICA7Ly8gICAgICAgICAgICAgfCAgICAwICAgfCAgICAgICAwICAgICB8IDAxMjMgIHwgNDU2NyAgfCA4eHh4ICB8IHl5eXkgIHwKLSAgICA7Ly8gICAgICAgICAgICAgfCAgICAxICAgfCAgICAgIC0xICAgICB8IHgwMTIgIHwgMzQ1NiAgfCA3OHh4ICB8IHl5eXkgIHwKLSAgICA7Ly8gICAgICAgICAgICAgfCAgICAyICAgfCAgICAgIC0yICAgICB8IHh4MDEgIHwgMjM0NSAgfCA2Nzh4ICB8IHl5eXkgIHwKLSAgICA7Ly8gICAgICAgICAgICAgfCAgICAzICAgfCAgICAgIC0zICAgICB8IHh4eDAgIHwgeXl5eSAgfCAxMjM0ICB8IDU2NzggIHwKLSAgICA7Ly8gICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsvLyAKLSAgICA7Ly8gT3V0cHV0czoKLSAgICA7Ly8gJHdvcmQwLCAkd29yZDEsICR3b3JkMiwgJHdvcmQzCi0gICAgOy8vICAgICAgICAgICAgIEJ5dGVzIGZyb20gdGhlIG9yaWdpbmFsIHNvdXJjZSBwb2ludGVyIChub3QgdHJ1bmNhdGVkIGZvcgotICAgIDsvLyAgICAgICAgICAgICA0IGJ5dGUgYWxpZ25tZW50KSBhcyBzaG93biBpbiB0aGUgdGFibGUuIAotICAgIDsvLyAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsvLyAgICAgICAgICAgICB8IHdvcmQwIHwgd29yZDEgfCB3b3JkMiB8IHdvcmQzIHwKLSAgICA7Ly8gICAgICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Ci0gICAgOy8vICAgICAgICAgICAgIHwgMDEyMyAgfCA0NTY3ICB8IDEyMzQgIHwgNTY3OCAgfAotICAgIDsvLyAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsvLwotICAgIDsvLyBOb3RlOiB7JHdvcmQwLCAkd29yZDEsICR3b3JkMiwgJHdvcmQzfSBzaG91bGQgYmUgcmVnaXN0ZXJzIHdpdGggYXNjZW5kaW5nCi0gICAgOy8vIHJlZ2lzdGVyIG51bWJlcmluZwotCi0gICAgTUFDUk8KLSAgICBNX0VYVF9YSU5UICRvZmZzZXQsICR3b3JkMCwgJHdvcmQxLCAkd29yZDIsICR3b3JkMwotICAgICAgICBJRiAkb2Zmc2V0ID0gMAotICAgICAgICAgICAgOyAkd29yZDAgYW5kICR3b3JkMSBhcmUgb2sKLSAgICAgICAgICAgIDsgJHdvcmQyLCAkd29yZDMgYXJlIGp1c3QgOCBzaGlmdGVkIHZlcnNpb25zCi0gICAgICAgICAgICBNT1YgICAgICAgICAkd29yZDMsICR3b3JkMSwgTFNSICM4Ci0gICAgICAgICAgICBPUlIgICAgICAgICAkd29yZDMsICR3b3JkMywgJHdvcmQyLCBMU0wgIzI0Ci0gICAgICAgICAgICBNT1YgICAgICAgICAkd29yZDIsICR3b3JkMCwgTFNSICM4Ci0gICAgICAgICAgICBPUlIgICAgICAgICAkd29yZDIsICR3b3JkMiwgJHdvcmQxLCBMU0wgIzI0Ci0gICAgICAgIEVMSUYgJG9mZnNldCA9IDMKLSAgICAgICAgICAgIDsgJHdvcmQyIGFuZCAkd29yZDMgYXJlIG9rICh0YWtlbiBjYXJlIHdoaWxlIGxvYWRpbmcgaXRzZWxmKQotICAgICAgICAgICAgOyBzZXQgJHdvcmQwICYgJHdvcmQxCi0gICAgICAgICAgICBNT1YgICAgICAgICAkd29yZDAsICR3b3JkMCwgTFNSICMyNAotICAgICAgICAgICAgT1JSICAgICAgICAgJHdvcmQwLCAkd29yZDAsICR3b3JkMiwgTFNMICM4Ci0gICAgICAgICAgICBNT1YgICAgICAgICAkd29yZDEsICR3b3JkMiwgTFNSICMyNAotICAgICAgICAgICAgT1JSICAgICAgICAgJHdvcmQxLCAkd29yZDEsICR3b3JkMywgTFNMICM4Ci0gICAgICAgIEVMU0UKLSAgICAgICAgICAgIE1PViAgICAgICAgICR3b3JkMCwgJHdvcmQwLCBMU1IgIzggKiAkb2Zmc2V0Ci0gICAgICAgICAgICBPUlIgICAgICAgICAkd29yZDAsICR3b3JkMCwgJHdvcmQxLCBMU0wgIygzMiAtIDggKiAoJG9mZnNldCkpCi0gICAgICAgICAgICBNT1YgICAgICAgICAkd29yZDEsICR3b3JkMSwgTFNSICM4ICogJG9mZnNldAotICAgICAgICAgICAgT1JSICAgICAgICAgJHdvcmQxLCAkd29yZDEsICR3b3JkMiwgTFNMICMoMzIgLSA4ICogKCRvZmZzZXQpKQotCi0gICAgICAgICAgICBNT1YgICAgICAgICAkd29yZDMsICR3b3JkMSwgTFNSICM4Ci0gICAgICAgICAgICBPUlIgICAgICAgICAkd29yZDMsICR3b3JkMywgJHdvcmQyLCBMU0wgIygzMiAtIDggKiAoKCRvZmZzZXQpKzEpKQotICAgICAgICAgICAgTU9WICAgICAgICAgJHdvcmQyLCAkd29yZDAsIExTUiAjOAotICAgICAgICAgICAgT1JSICAgICAgICAgJHdvcmQyLCAkd29yZDIsICR3b3JkMSwgTFNMICMyNAotICAgICAgICBFTkRJRgotICAgIE1FTkQKLQotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIDsvLyBEZXNjcmlwdGlvbjoKLSAgICA7Ly8gQ29tcHV0ZXMgaGFsZi1zdW0gYW5kIHhvciBvZiB0d28gaW5wdXRzIGFuZCBwdXRzIHRoZW0gaW4gdGhlIGlucHV0IAotICAgIDsvLyByZWdpc3RlcnMgaW4gdGhhdCBvcmRlcgotICAgIDsvLwotICAgIDsvLyBTeW50YXg6Ci0gICAgOy8vIE1fSFNVTV9YT1IgICAgICAkdjAsICR2MSwgJHRtcAotICAgIDsvLyAKLSAgICA7Ly8gSW5wdXRzOgotICAgIDsvLyAkdjAgICAgICAgICBhLCBmaXJzdCBpbnB1dAotICAgIDsvLyAkdjEgICAgICAgICBiLCBzZWNvbmQgaW5wdXQKLSAgICA7Ly8gJHRtcCAgICAgICAgc2NyYXRjaCByZWdpc3RlcgotICAgIDsvLyAKLSAgICA7Ly8gT3V0cHV0czoKLSAgICA7Ly8gJHYwICAgICAgICAgKGEgKyBiKS8yCi0gICAgOy8vICR2MSAgICAgICAgIGEgXiBiCi0KLSAgICBNQUNSTwotICAgIE1fSFNVTV9YT1IgICAgICAkdjAsICR2MSwgJHRtcAotICAgICAgICBVSEFERDggICAgICAkdG1wLCAkdjAsICR2MSAgICAgOy8vIHMwID0gYSArIGIKLSAgICAgICAgRU9SICAgICAgICAgJHYxLCAkdjAsICR2MSAgICAgIDsvLyBsMCA9IGEgXiBiCi0gICAgICAgIE1PViAgICAgICAgICR2MCwgJHRtcCAgICAgICAgICA7Ly8gczAKLSAgICBNRU5ECi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgOy8vIERlc2NyaXB0aW9uOgotICAgIDsvLyBDYWxjdWxhdGVzIGF2ZXJhZ2Ugb2YgNCB2YWx1ZXMgKGEsYixjLGQpIGZvciBIYWxmUGl4ZWxYWSBwcmVkaWN0IHR5cGUgaW4gCi0gICAgOy8vIG1jUmVjb25CbG9jayBtb2R1bGUuIFZlcnkgc3BlY2lmaWMgdG8gdGhlIGltcGxlbWVudGF0aW9uIG9mIAotICAgIDsvLyBNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxYWSBkb25lIGhlcmUuIFVzZXMgInRtcCIgYXMgc2NyYXRjaCByZWdpc3RlciBhbmQgCi0gICAgOy8vICJ5TWFzayIgZm9yIG1hc2sgdmFyaWFibGUgIjB4MTAxMDEwMXgiIHNldCBpbiBpdC4gSW4geU1hc2sgNCBsc2JzIGFyZSAKLSAgICA7Ly8gbm90IHNpZ25pZmljYW50IGFuZCBhcmUgdXNlZCBieSB0aGUgY2FsbGVlIGZvciByb3cgY291bnRlciAoeSkKLSAgICA7Ly8KLSAgICA7Ly8gU29tZSBwb2ludHMgdG8gbm90ZSBhcmU6Ci0gICAgOy8vIDEuIElucHV0IGlzIHBhaXIgb2YgcGFpci1hdmVyYWdlcyBhbmQgWG9ycwotICAgIDsvLyAyLiAkc3VtMSBhbmQgJGxzYjEgYXJlIG5vdCBtb2RpZmllZCBhbmQgaGVuY2UgY2FuIGJlIHJldXNlZCBpbiBhbm90aGVyIAotICAgIDsvLyAgICBydW5uaW5nIGF2ZXJhZ2UKLSAgICA7Ly8gMy4gT3V0cHV0IGlzIGluIHRoZSBmaXJzdCBhcmd1bWVudAotICAgIDsvLwotICAgIDsvLyBTeW50YXg6Ci0gICAgOy8vIE1fQVZHNCAgICAgICAgICRzdW0wLCAkbHNiMCwgJHN1bTEsICRsc2IxLCAkcm5kVmFsCi0gICAgOy8vIAotICAgIDsvLyBJbnB1dHM6Ci0gICAgOy8vICRzdW0wICAgICAgIChhICsgYikgPj4gMSwgd2hlcmUgYSBhbmQgYiBhcmUgMXN0IGFuZCAybmQgaW5wdXRzIHRvIGJlIGF2ZXJhZ2VkCi0gICAgOy8vICRsc2IwICAgICAgIChhIF4gYikKLSAgICA7Ly8gJHN1bTEgICAgICAgKGMgKyBkKSA+PiAxLiBOb3QgbW9kaWZpZWQKLSAgICA7Ly8gJGxzYjEgICAgICAgKGMgXiBkKSAgICAgICBOb3QgbW9kaWZpZWQKLSAgICA7Ly8gJHJuZFZhbCAgICAgQXNzZW1ibGVyIFZhcmlhYmxlLiAwIGZvciByb3VuZGluZywgMSBmb3Igbm8gcm91bmRpbmcKLSAgICA7Ly8gCi0gICAgOy8vIE91dHB1dHM6Ci0gICAgOy8vICRzdW0wICAgICAgIChhICsgYiArIGMgKyBkICsgMSkgLyA0IDogSWYgbm8gcm91bmRpbmcKLSAgICA7Ly8gICAgICAgICAgICAgKGEgKyBiICsgYyArIGQgKyAyKSAvIDQgOiBJZiByb3VuZGluZwotCi0gICAgTUFDUk8KLSAgICBNX0FWRzQgICAgICAgICAgJHN1bTAsICRsc2IwLCAkc3VtMSwgJGxzYjEsICRybmRWYWwKLSAgICAgICAgTENMUyBPUDEKLSAgICAgICAgTENMUyBPUDIKLSAgICAgICAgSUYgJHJuZFZhbCA9IDAgOy8vIHJvdW5kaW5nIGNhc2UKLU9QMSBTRVRTICJBTkQiCi1PUDIgU0VUUyAiT1JSIgotICAgICAgICBFTFNFICAgICAgICAgICA7Ly8gTm90IHJvdW5kaW5nIGNhc2UKLU9QMSBTRVRTICJPUlIiCi1PUDIgU0VUUyAiQU5EIgotICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgICAgTENMUyBsc2IyCi0gICAgICAgIExDTFMgc3VtMgotICAgICAgICBMQ0xTIGRlc3QKLSAgICAKLWxzYjIgIFNFVFMgInRtcCIKLXN1bTIgIFNFVFMgIiRsc2IwIgotZGVzdCAgU0VUUyAiJHN1bTAiCi0KLSAgICAgICAgJE9QMSAgICAgICAgJGxzYjAsICRsc2IwLCAkbHNiMSAgICAgICAgICA7Ly8gZTAgPSBlMCAmIGUxCi0gICAgICAgIEVPUiAgICAgICAgICRsc2IyLCAkc3VtMCwgJHN1bTEgICAgICAgICAgOy8vIGUyID0gczAgXiBzMQotICAgICAgICAkT1AyICAgICAgICAkbHNiMiwgJGxzYjIsICRsc2IwICAgICAgICAgIDsvLyBlMiA9IGUyIHwgZTAKLSAgICAgICAgQU5EICAgICAgICAgJGxzYjIsICRsc2IyLCB5TWFzaywgTFNSICMgNCA7Ly8gZTIgPSBlMiAmIG1hc2sKLSAgICAgICAgVUhBREQ4ICAgICAgJHN1bTIsICRzdW0wLCAkc3VtMSAgICAgICAgICA7Ly8gczIgPSAoczAgKyBzMSkvMgotICAgICAgICBVQUREOCAgICAgICAkZGVzdCwgJHN1bTIsICRsc2IyICAgICAgICAgIDsvLyBkZXN0ID0gIHMyICsgZTIKLSAgICBNRU5ECi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07Ly8gTW90aW9uIGNvbXBlbnNhdGlvbiBoYW5kbGVyIG1hY3JvcwotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIDsvLyBEZXNjcmlwdGlvbjoKLSAgICA7Ly8gSW1wbGVtZW50IG1vdGlvbiBjb21wZW5zYXRpb24gcm91dGluZXMgdXNpbmcgdGhlIG5hbWVkIHJlZ2lzdGVycyBpbiAKLSAgICA7Ly8gY2FsbGVlIGZ1bmN0aW9uLiBFYWNoIG9mIHRoZSBmb2xsb3dpbmcgNCBpbXBsZW1lbnQgdGhlIDQgcHJlZGljdCB0eXBlCi0gICAgOy8vIEVhY2ggaGFuZGxlcyA4IGNhc2VzIGVhY2ggaWUgYWxsIHRoZSBjb21iaW5hdGlvbnMgb2YgNCB0eXBlcyBvZiBzb3VyY2UgCi0gICAgOy8vIGFsaWdubWVudCBvZmZzZXRzIGFuZCAyIHR5cGVzIG9mIHJvdW5kaW5nIGZsYWcKLSAgICA7Ly8KLSAgICA7Ly8gU3ludGF4OgotICAgIDsvLyBNX01DUkVDT05CTE9DS19JbnRlZ2VyUGl4ZWwgJHJuZFZhbCwgJG9mZnNldAotICAgIDsvLyBNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxYICAgJHJuZFZhbCwgJG9mZnNldAotICAgIDsvLyBNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxZICAgJHJuZFZhbCwgJG9mZnNldAotICAgIDsvLyBNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxYWSAgJHJuZFZhbCwgJG9mZnNldAotICAgIDsvLyAKLSAgICA7Ly8gSW5wdXRzOgotICAgIDsvLyAkcm5kVmFsICAgICBBc3NlbWJsZXIgVmFyaWFibGUuIDAgZm9yIHJvdW5kaW5nLCAxIGZvciBubyByb3VuZGluZwotICAgIDsvLyAkb2Zmc2V0ICAgICAkcFNyYyBNT0QgNCB2YWx1ZS4gT2Zmc2V0IGZyb20gNCBieXRlIGFsaWduZWQgbG9jYXRpb24uCi0gICAgOy8vIAotICAgIDsvLyBPdXRwdXRzOgotICAgIDsvLyBPdXRwdXRzIGNvbWUgaW4gdGhlIG5hbWVkIHJlZ2lzdGVycyBvZiB0aGUgY2FsbGVlIGZ1bmN0aW9ucwotICAgIDsvLyBUaGUgbWFjcm8gbG9hZHMgdGhlIGRhdGEgZnJvbSB0aGUgc291cmNlIHBvaW50ZXIsIHByb2Nlc3NlcyBpdCBhbmQgCi0gICAgOy8vIHN0b3JlcyBpbiB0aGUgZGVzdGluYXRpb24gcG9pbnRlci4gRG9lcyB0aGUgd2hvbGUgcHJlZGljdGlvbiBjeWNsZQotICAgIDsvLyBvZiBNb3Rpb24gQ29tcGVuc2F0aW9uIHJvdXRpbmUgZm9yIGEgcGFydGljdWxhciBwcmVkaWN0VHlwZQotICAgIDsvLyBBZnRlciB0aGlzIG9ubHkgcmVzaWR1ZSBhZGRpdGlvbiB0byB0aGUgcHJlZGljdGVkIHZhbHVlcyByZW1haW4KLQotICAgIE1BQ1JPCi0gICAgTV9NQ1JFQ09OQkxPQ0tfSW50ZWdlclBpeGVsICRybmRWYWwsICRvZmZzZXQKLSAgICA7Ly8gQWxnb3JpdGhtaWMgRGVzY3JpcHRpb246Ci0gICAgOy8vIFRoaXMgaGFuZGxlcyBtb3Rpb24gY29tcGVuc2F0aW9uIGZvciBJbnRlZ2VyUGl4ZWwgcHJlZGljdFR5cGUuIEJvdGgKLSAgICA7Ly8gcm91bmRpbmcgY2FzZXMgYXJlIGhhbmRsZWQgYnkgdGhlIHNhbWUgY29kZSBiYXNlLiBJdCBpcyBqdXN0IGEgY29weQotICAgIDsvLyBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbi4gVHdvIGxpbmVzIGFyZSBkb25lIHBlciBsb29wIHRvIHJlZHVjZSAKLSAgICA7Ly8gc3RhbGxzLiBMb29wIGhhcyBiZWVuIHNvZnR3YXJlIHBpcGVsaW5lZCBhcyB3ZWxsIGZvciB0aGF0IHB1cnBvc2UuCi0gICAgOy8vIAotICAgIDsvLyBNX0xPQURfWCBsb2FkcyBhIHdob2xlIHJvdyBpbiB0d28gcmVnaXN0ZXJzIGFuZCB0aGVuIHRoZXkgYXJlIHN0b3JlZAotICAgIAotQ2FzZUludGVnZXJQaXhlbFJuZDBPZmZzZXQkb2Zmc2V0Ci1DYXNlSW50ZWdlclBpeGVsUm5kMU9mZnNldCRvZmZzZXQKLSAgICBNX0xPQURfWCAgICBwU3JjLCBzcmNTdGVwLCB0bXAxLCB0bXAyLCB0bXAzLCAkb2Zmc2V0Ci0gICAgTV9MT0FEX1ggICAgcFNyYywgc3JjU3RlcCwgdG1wMywgdG1wNCwgdG1wNSwgJG9mZnNldAotWWxvb3BJbnRlZ2VyUGl4ZWxPZmZzZXQkb2Zmc2V0Ci0gICAgU1VCUyAgICAgICAgeSwgeSwgIzIKLSAgICBTVFJEICAgICAgICB0bXAxLCB0bXAyLCBbcERzdF0sIGRzdFN0ZXAKLSAgICBTVFJEICAgICAgICB0bXAzLCB0bXA0LCBbcERzdF0sIGRzdFN0ZXAKLSAgICBNX0xPQURfWCAgICBwU3JjLCBzcmNTdGVwLCB0bXAxLCB0bXAyLCB0bXAzLCAkb2Zmc2V0Ci0gICAgTV9MT0FEX1ggICAgcFNyYywgc3JjU3RlcCwgdG1wMywgdG1wNCwgdG1wNSwgJG9mZnNldAotICAgIEJHVCAgICAgICAgIFlsb29wSW50ZWdlclBpeGVsT2Zmc2V0JG9mZnNldAotCi0gICAgQiAgICAgICAgICAgU3dpdGNoUHJlZGljdFR5cGVFbmQKLSAgICBNRU5ECi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgTUFDUk8KLSAgICBNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxYICRybmRWYWwsICRvZmZzZXQKLSAgICA7Ly8gQWxnb3JpdGhtaWMgRGVzY3JpcHRpb246Ci0gICAgOy8vIFRoaXMgaGFuZGxlcyBtb3Rpb24gY29tcGVuc2F0aW9uIGZvciBIYWxmUGl4ZWxYIHByZWRpY3RUeXBlLiBUaGUgdHdvCi0gICAgOy8vIHJvdW5kaW5nIGNhc2VzIGFyZSBoYW5kbGVkIGJ5IHRoZSBkaWZmZXJlbnQgY29kZSBiYXNlIGFuZCBzcGFubmVkIGJ5IAotICAgIDsvLyBkaWZmZXJlbnQgbWFjcm8gY2FsbHMuIExvb3AgaGFzIGJlZW4gc29mdHdhcmUgcGlwZWxpbmVkIHRvIHJlZHVjZSAKLSAgICA7Ly8gc3RhbGxzLgotICAgIDsvLyAKLSAgICA7Ly8gRmlsdGVyaW5nIGludm9sdmVzIGF2ZXJhZ2luZyBhIHBpeGVsIHdpdGggdGhlIG5leHQgaG9yaXpvbnRhbCBwaXhlbC4KLSAgICA7Ly8gTV9MT0FEX1hJTlQgYW5kIE1fRVhUX1hJTlQgY29tYmluYXRpb24gZ2VuZXJhdGUgNCByZWdpc3RlcnMsIDIgd2l0aCAKLSAgICA7Ly8gYWxsIHBpeGVscyBpbiBhIHJvdyB3aXRoIDQgcGl4ZWwgaW4gZWFjaCByZWdpc3RlciBhbmQgYW5vdGhlciAyCi0gICAgOy8vIHJlZ2lzdGVycyB3aXRoIHBpeGVscyBjb3JyZXNwb25kaW5nIHRvIG9uZSBob3Jpem9udGFsbHkgc2hpZnRlZCBwaXhlbAotICAgIDsvLyBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbml0aWFsIHJvdyBwaXhlbHMuIFRoZXNlIGFyZSBzZXQgb2YgcGFja2VkIAotICAgIDsvLyByZWdpc3RlcnMgYXBwcm9wcmlhdGUgdG8gZG8gNCBsYW5lIFNJTUQuCi0gICAgOy8vIEFmdGVyIHRoYXQgTV9VSEFERDhSIG1hY3JvIGRvZXMgdGhlIGF2ZXJhZ2luZyB0YWtpbmcgY2FyZSBvZiB0aGUgCi0gICAgOy8vIHJvdW5kaW5nIGFzIHJlcXVpcmVkCi0gICAgCi1DYXNlSGFsZlBpeGVsWFJuZCRybmRWYWwuT2Zmc2V0JG9mZnNldAotICAgIElGICRybmRWYWwgPSAwCi0gICAgICAgIExEUiBtYXNrLCA9MHg4MDgwODA4MAotICAgIEVORElGCi0KLSAgICBNX0xPQURfWElOVCBwU3JjLCBzcmNTdGVwLCAkb2Zmc2V0LCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0Ci1ZbG9vcEhhbGZQaXhlbFhSbmQkcm5kVmFsLk9mZnNldCRvZmZzZXQKLSAgICBTVUJTICAgICAgICB5LCB5LCAjMQotICAgIE1fRVhUX1hJTlQgICRvZmZzZXQsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQKLSAgICBNX1VIQUREOFIgICB0bXA1LCB0bXAxLCB0bXAzLCAoMS0kcm5kVmFsKSwgbWFzawotICAgIE1fVUhBREQ4UiAgIHRtcDYsIHRtcDIsIHRtcDQsICgxLSRybmRWYWwpLCBtYXNrCi0gICAgU1RSRCAgICAgICAgdG1wNSwgdG1wNiwgW3BEc3RdLCBkc3RTdGVwCi0gICAgTV9MT0FEX1hJTlQgcFNyYywgc3JjU3RlcCwgJG9mZnNldCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNAotICAgIEJHVCAgICAgICAgIFlsb29wSGFsZlBpeGVsWFJuZCRybmRWYWwuT2Zmc2V0JG9mZnNldAotCi0gICAgQiAgICAgICAgICAgU3dpdGNoUHJlZGljdFR5cGVFbmQKLSAgICBNRU5ECi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgTUFDUk8KLSAgICBNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxZICRybmRWYWwsICRvZmZzZXQKLSAgICA7Ly8gQWxnb3JpdGhtaWMgRGVzY3JpcHRpb246Ci0gICAgOy8vIFRoaXMgaGFuZGxlcyBtb3Rpb24gY29tcGVuc2F0aW9uIGZvciBIYWxmUGl4ZWxZIHByZWRpY3RUeXBlLiBUaGUgdHdvCi0gICAgOy8vIHJvdW5kaW5nIGNhc2VzIGFyZSBoYW5kbGVkIGJ5IHRoZSBkaWZmZXJlbnQgY29kZSBiYXNlIGFuZCBzcGFubmVkIGJ5IAotICAgIDsvLyBkaWZmZXJlbnQgbWFjcm8gY2FsbHMuIFByZUxvYWRpbmcgaXMgdXNlZCB0byBhdm9pZCByZWxvYWQgb2Ygc2FtZSBkYXRhLiAKLSAgICA7Ly8gCi0gICAgOy8vIEZpbHRlcmluZyBpbnZvbHZlcyBhdmVyYWdpbmcgYSBwaXhlbCB3aXRoIHRoZSBuZXh0IHZlcnRpY2FsIHBpeGVsLgotICAgIDsvLyBNX0xPQURfWCBnZW5lcmF0ZXMgMiByZWdpc3RlcnMgd2l0aCBhbGwgcGl4ZWxzIGluIGEgcm93IHdpdGggNCBwaXhlbCBpbiAKLSAgICA7Ly8gZWFjaCByZWdpc3Rlci4gVGhlc2UgYXJlIHNldCBvZiBwYWNrZWQgcmVnaXN0ZXJzIGFwcHJvcHJpYXRlIHRvIGRvIAotICAgIDsvLyA0IGxhbmUgU0lNRC4gQWZ0ZXIgdGhhdCBNX1VIQUREOFIgbWFjcm8gZG9lcyB0aGUgYXZlcmFnaW5nIHRha2luZyBjYXJlIAotICAgIDsvLyBvZiB0aGUgcm91bmRpbmcgYXMgcmVxdWlyZWQKLSAgICAKLUNhc2VIYWxmUGl4ZWxZUm5kJHJuZFZhbC5PZmZzZXQkb2Zmc2V0Ci0gICAgSUYgJHJuZFZhbCA9IDAKLSAgICAgICAgTERSIG1hc2ssID0weDgwODA4MDgwCi0gICAgRU5ESUYKLQotICAgIE1fTE9BRF9YICAgIHBTcmMsIHNyY1N0ZXAsIHRtcDEsIHRtcDIsIHRtcDUsICRvZmZzZXQgOy8vIFByZS1sb2FkCi1ZbG9vcEhhbGZQaXhlbFlSbmQkcm5kVmFsLk9mZnNldCRvZmZzZXQKLSAgICBTVUJTICAgICAgICB5LCB5LCAjMgotICAgIDsvLyBQcm9jZXNzaW5nIG9uZSBsaW5lCi0gICAgTV9MT0FEX1ggICAgcFNyYywgc3JjU3RlcCwgdG1wMywgdG1wNCwgdG1wNSwgJG9mZnNldAotICAgIE1fVUhBREQ4UiAgIHRtcDEsIHRtcDEsIHRtcDMsICgxLSRybmRWYWwpLCBtYXNrCi0gICAgTV9VSEFERDhSICAgdG1wMiwgdG1wMiwgdG1wNCwgKDEtJHJuZFZhbCksIG1hc2sKLSAgICBTVFJEICAgICAgICB0bXAxLCB0bXAyLCBbcERzdF0sIGRzdFN0ZXAKLSAgICA7Ly8gUHJvY2Vzc2luZyBhbm90aGVyIGxpbmUKLSAgICBNX0xPQURfWCAgICBwU3JjLCBzcmNTdGVwLCB0bXAxLCB0bXAyLCB0bXA1LCAkb2Zmc2V0Ci0gICAgTV9VSEFERDhSICAgdG1wMywgdG1wMywgdG1wMSwgKDEtJHJuZFZhbCksIG1hc2sKLSAgICBNX1VIQUREOFIgICB0bXA0LCB0bXA0LCB0bXAyLCAoMS0kcm5kVmFsKSwgbWFzawotICAgIFNUUkQgICAgICAgIHRtcDMsIHRtcDQsIFtwRHN0XSwgZHN0U3RlcAotCi0gICAgQkdUICAgICAgICAgWWxvb3BIYWxmUGl4ZWxZUm5kJHJuZFZhbC5PZmZzZXQkb2Zmc2V0Ci0KLSAgICBCICAgICAgICAgICBTd2l0Y2hQcmVkaWN0VHlwZUVuZAotICAgIE1FTkQKLTsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICBNQUNSTwotICAgIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFhZICRybmRWYWwsICRvZmZzZXQKLSAgICA7Ly8gQWxnb3JpdGhtaWMgRGVzY3JpcHRpb246Ci0gICAgOy8vIFRoaXMgaGFuZGxlcyBtb3Rpb24gY29tcGVuc2F0aW9uIGZvciBIYWxmUGl4ZWxYWSBwcmVkaWN0VHlwZS4gVGhlIHR3bwotICAgIDsvLyByb3VuZGluZyBjYXNlcyBhcmUgaGFuZGxlZCBieSB0aGUgZGlmZmVyZW50IGNvZGUgYmFzZSBhbmQgc3Bhbm5lZCBieSAKLSAgICA7Ly8gZGlmZmVyZW50IG1hY3JvIGNhbGxzLiBQcmVMb2FkaW5nIGlzIHVzZWQgdG8gYXZvaWQgcmVsb2FkIG9mIHNhbWUgZGF0YS4gCi0gICAgOy8vIAotICAgIDsvLyBGaWx0ZXJpbmcgaW52b2x2ZXMgYXZlcmFnaW5nIGEgcGl4ZWwgd2l0aCB0aGUgbmV4dCB2ZXJ0aWNhbCwgaG9yaXpvbnRhbCAKLSAgICA7Ly8gYW5kIHJpZ2h0LWRvd24gZGlhZ29uYWwgcGl4ZWxzLiBKdXN0IGFzIGluIEhhbGZQaXhlbFggY2FzZSwgTV9MT0FEX1hJTlQKLSAgICA7Ly8gYW5kIE1fRVhUX1hJTlQgY29tYmluYXRpb24gZ2VuZXJhdGVzIDQgcmVnaXN0ZXJzIHdpdGggYSByb3cgYW5kIGl0cwotICAgIDsvLyAxIHBpeGVsIHJpZ2h0IHNoaWZ0ZWQgdmVyc2lvbiwgd2l0aCA0IHBpeGVscyBpbiBvbmUgcmVnaXN0ZXIuIEFub3RoZXIgCi0gICAgOy8vIGNhbGwgb2YgdGhhdCBtYWNyby1jb21iaW5hdGlvbiBnZXRzIGFub3RoZXIgcm93LiBUaGVuIE1fSFNVTV9YT1IgaXMgCi0gICAgOy8vIGNhbGxlZCB0byBnZXQgbXV0dWFsIGhhbGYtc3VtIGFuZCB4b3IgY29tYmluYXRpb25zIG9mIGEgcm93IHdpdGggaXRzCi0gICAgOy8vIHNoaWZ0ZWQgdmVyc2lvbiBhcyB0aGV5IGFyZSBpbnB1dHMgdG8gdGhlIE1fQVZHNCBtYWNybyB3aGljaCBjb21wdXRlcwotICAgIDsvLyB0aGUgNCBlbGVtZW50IGF2ZXJhZ2Ugd2l0aCByb3VuZGluZy4gTm90ZSB0aGF0IGl0IGlzIHRoZSBoYWxmLXN1bS94b3IgCi0gICAgOy8vIHZhbHVlcyB0aGF0IGFyZSBwcmVzZXJ2ZWQgZm9yIG5leHQgcm93IGFzIHRoZXkgY2FuIGJlIHJlLXVzZWQgaW4gdGhlIAotICAgIDsvLyBuZXh0IGNhbGwgdG8gdGhlIE1fQVZHNCBhbmQgc2F2ZXMgcmVjb21wdXRhdGlvbi4KLSAgICA7Ly8gRHVlIHRvIGxhY2sgb2YgcmVnaXN0ZXIsIHRoZSByb3cgY291bnRlciBhbmQgYSBtYXNraW5nIHZhbHVlIHJlcXVpcmVkIAotICAgIDsvLyBpbiBNX0FWRzQgYXJlIHBhY2tlZCBpbnRvIGEgc2luZ2xlIHJlZ2lzdGVyIHlNYXNrIHdoZXJlIHRoZSBsYXN0IG5pYmJsZQotICAgIDsvLyBob2xkcyB0aGUgcm93IGNvdW50ZXIgdmFsdWVzIGFuZCByZXN0IGhvbGRzIHRoZSBtYXNraW5nIHZhcmlhYmxlIGxlZnQgCi0gICAgOy8vIHNoaWZ0ZWQgYnkgNAotICAgIAotQ2FzZUhhbGZQaXhlbFhZUm5kJHJuZFZhbC5PZmZzZXQkb2Zmc2V0Ci0gICAgTERSICAgICAgICAgeU1hc2ssID0oKDB4MDEwMTAxMDEgPDwgNCkgKyA4KQotCi0gICAgTV9MT0FEX1hJTlQgcFNyYywgc3JjU3RlcCwgJG9mZnNldCwgdDAwLCB0MDEsIHQxMCwgdDExIDsvLyBMb2FkIGEsIGEnLCBiLCBiJwotICAgIE1fRVhUX1hJTlQgICRvZmZzZXQsIHQwMCwgdDAxLCB0MTAsIHQxMQotICAgIE1fSFNVTV9YT1IgIHQwMCwgdDEwLCB0bXAgICAgICAgICAgICAgICA7Ly8gczAsIGwwCi0gICAgTV9IU1VNX1hPUiAgdDAxLCB0MTEsIHRtcCAgICAgICAgICAgICAgIDsvLyBzMCcsIGwwJwotCi1ZbG9vcEhhbGZQaXhlbFhZUm5kJHJuZFZhbC5PZmZzZXQkb2Zmc2V0Ci0gICAgOy8vIFByb2Nlc3NzaW5nIG9uZSBsaW5lCi0gICAgOy8vIHQwMCwgdDAxLCB0MTAsIHQxMSByZXF1aXJlZCBmcm9tIHByZXZpb3VzIGxvb3AKLSAgICBNX0xPQURfWElOVCBwU3JjLCBzcmNTdGVwLCAkb2Zmc2V0LCB0MjAsIHQyMSwgdDMwLCB0MzEgOy8vIExvYWQgYywgYycsIGQsIGQnCi0gICAgU1VCICAgICAgICAgeU1hc2ssIHlNYXNrLCAjMgotICAgIE1fRVhUX1hJTlQgICRvZmZzZXQsIHQyMCwgdDIxLCB0MzAsIHQzMQotICAgIE1fSFNVTV9YT1IgIHQyMCwgdDMwLCB0bXAgICAgICAgICAgICAgICA7Ly8gczEsIGwxCi0gICAgTV9IU1VNX1hPUiAgdDIxLCB0MzEsIHRtcCAgICAgICAgICAgICAgIDsvLyBzMScsIGwxJwotICAgIE1fQVZHNCAgICAgIHQwMCwgdDEwLCB0MjAsIHQzMCwgJHJuZFZhbCA7Ly8gczAsIGwwLCBzMSwgbDEKLSAgICBNX0FWRzQgICAgICB0MDEsIHQxMSwgdDIxLCB0MzEsICRybmRWYWwgOy8vIHMwJywgbDAnLCBzMScsIGwxJwotICAgIFNUUkQgICAgICAgIHQwMCwgdDAxLCBbcERzdF0sIGRzdFN0ZXAgICA7Ly8gc3RvcmUgdGhlIGF2ZXJhZ2UKLSAgICAKLSAgICA7Ly8gUHJvY2Vzc3NpbmcgYW5vdGhlciBsaW5lCi0gICAgOy8vIHQyMCwgdDIxLCB0MzAsIHQzMSByZXF1aXJlZCBmcm9tIGFib3ZlCi0gICAgTV9MT0FEX1hJTlQgcFNyYywgc3JjU3RlcCwgJG9mZnNldCwgdDAwLCB0MDEsIHQxMCwgdDExIDsvLyBMb2FkIGEsIGEnLCBiLCBiJwotICAgIFRTVCAgICAgICAgIHlNYXNrLCAjNwotICAgIE1fRVhUX1hJTlQgICRvZmZzZXQsIHQwMCwgdDAxLCB0MTAsIHQxMQotICAgIE1fSFNVTV9YT1IgIHQwMCwgdDEwLCB0bXAKLSAgICBNX0hTVU1fWE9SICB0MDEsIHQxMSwgdG1wCi0gICAgTV9BVkc0ICAgICAgdDIwLCB0MzAsIHQwMCwgdDEwLCAkcm5kVmFsCi0gICAgTV9BVkc0ICAgICAgdDIxLCB0MzEsIHQwMSwgdDExLCAkcm5kVmFsCi0gICAgU1RSRCAgICAgICAgdDIwLCB0MjEsIFtwRHN0XSwgZHN0U3RlcAotCi0gICAgQkdUICAgICAgICAgWWxvb3BIYWxmUGl4ZWxYWVJuZCRybmRWYWwuT2Zmc2V0JG9mZnNldAotCi0gICAgSUYgJG9mZnNldC89MyA6TE9SOiAkcm5kVmFsLz0xCi0gICAgICAgIEIgICAgICAgICAgIFN3aXRjaFByZWRpY3RUeXBlRW5kCi0gICAgRU5ESUYKLSAgICBNRU5ECi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07Ly8gTW90aW9uIGNvbXBlbnNhdGlvbiBoYW5kbGVyIG1hY3JvcyBlbmQgaGVyZQotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIDsvLyBEZXNjcmlwdGlvbjoKLSAgICA7Ly8gUG9wdWxhdGVzIGFsbCA0IGtpbmRzIG9mIG9mZnNldHMgImNhc2VzIiBmb3IgZWFjaCBwcmVkaWN0VHlwZSBhbmQgcm5kVmFsCi0gICAgOy8vIGNvbWJpbmF0aW9uIGluIHRoZSAic3dpdGNoIiB0byBwcmVkaWN0aW9uIHByb2Nlc3NpbmcgY29kZSBzZWdtZW50Ci0gICAgOy8vCi0gICAgOy8vIFN5bnRheDoKLSAgICA7Ly8gTV9DQVNFX09GRlNFVCAkcm5kLCAkcHJlZGljdFR5cGUKLSAgICA7Ly8gCi0gICAgOy8vIElucHV0czoKLSAgICA7Ly8gJHJuZCAgICAgICAgICAgIDAgZm9yIHJvdW5kaW5nLCAxIGZvciBubyByb3VuZGluZwotICAgIDsvLyAkcHJlZGljdFR5cGUgICAgVGhlIHByZWRpY3Rpb24gbW9kZQotICAgIDsvLyAKLSAgICA7Ly8gT3V0cHV0czoKLSAgICA7Ly8gUG9wdWxhdGVkIGxpc3Qgb2YgIk1fQ0FTRSJzIGZvciB0aGUgIk1fU1dJVENIIiBtYWNybwotCi0gICAgTUFDUk8KLSAgICBNX0NBU0VfT0ZGU0VUICRybmQsICRwcmVkaWN0VHlwZQotICAgICAgICBNX0NBU0UgICAgICBDYXNlJHByZWRpY3RUeXBlLlJuZCRybmQuT2Zmc2V0MAotICAgICAgICBNX0NBU0UgICAgICBDYXNlJHByZWRpY3RUeXBlLlJuZCRybmQuT2Zmc2V0MQotICAgICAgICBNX0NBU0UgICAgICBDYXNlJHByZWRpY3RUeXBlLlJuZCRybmQuT2Zmc2V0MgotICAgICAgICBNX0NBU0UgICAgICBDYXNlJHByZWRpY3RUeXBlLlJuZCRybmQuT2Zmc2V0MwotICAgIE1FTkQKLTsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICA7Ly8gRGVzY3JpcHRpb246Ci0gICAgOy8vIFBvcHVsYXRlcyBhbGwgMiBraW5kcyBvZiByb3VuZGluZyAiY2FzZXMiIGZvciBlYWNoIHByZWRpY3RUeXBlIGluIHRoZSAKLSAgICA7Ly8gInN3aXRjaCIgdG8gcHJlZGljdGlvbiBwcm9jZXNzaW5nIGNvZGUgc2VnbWVudAotICAgIDsvLwotICAgIDsvLyBTeW50YXg6Ci0gICAgOy8vIE1fQ0FTRV9PRkZTRVQgJHByZWRpY3RUeXBlCi0gICAgOy8vIAotICAgIDsvLyBJbnB1dHM6Ci0gICAgOy8vICRwcmVkaWN0VHlwZSAgICBUaGUgcHJlZGljdGlvbiBtb2RlCi0gICAgOy8vIAotICAgIDsvLyBPdXRwdXRzOgotICAgIDsvLyBQb3B1bGF0ZWQgbGlzdCBvZiAiTV9DQVNFX09GRlNFVCIgbWFjcm9zCi0KLSAgICBNQUNSTwotICAgIE1fQ0FTRV9NQ1JFQ09OQkxPQ0sgJHByZWRpY3RUeXBlCi0gICAgICAgIE1fQ0FTRV9PRkZTRVQgIDAsICRwcmVkaWN0VHlwZSA7Ly8gMCBmb3Igcm91bmRpbmcKLSAgICAgICAgTV9DQVNFX09GRlNFVCAgMSwgJHByZWRpY3RUeXBlIDsvLyAxIGZvciBubyByb3VuZGluZwotICAgIE1FTkQKLTsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICA7Ly8gRGVzY3JpcHRpb246Ci0gICAgOy8vIFBvcHVsYXRlcyBhbGwgOCBraW5kcyBvZiByb3VuZGluZyBhbmQgb2Zmc2V0IGNvbWJpbmF0aW9ucyBoYW5kbGluZyBtYWNyb3MgCi0gICAgOy8vIGZvciB0aGUgc3BlY2lmaWVkIHByZWRpY3RUeXBlLiBJbiBjYXNlIG9mICJJbnRlZ2VyUGl4ZWwiIHByZWRpY3RUeXBlLCAKLSAgICA7Ly8gcm91bmRpbmcgaXMgbm90IHJlcXVpcmVkIHNvIHNhbWUgY29kZSBzZWdtZW50IGhhbmRsZXMgYm90aCBjYXNlcwotICAgIDsvLwotICAgIDsvLyBTeW50YXg6Ci0gICAgOy8vIE1fTUNSRUNPTkJMT0NLICAgICRwcmVkaWN0VHlwZQotICAgIDsvLyAKLSAgICA7Ly8gSW5wdXRzOgotICAgIDsvLyAkcHJlZGljdFR5cGUgICAgVGhlIHByZWRpY3Rpb24gbW9kZQotICAgIDsvLyAKLSAgICA7Ly8gT3V0cHV0czoKLSAgICA7Ly8gUG9wdWxhdGVkIGxpc3Qgb2YgIk1fTUNSRUNPTkJMT0NLXzxwcmVkaWN0VHlwZT4iIG1hY3JvcyBmb3Igc3BlY2lmaWVkIAotICAgIDsvLyBwcmVkaWN0VHlwZS4gRWFjaCAKLSAgICA7Ly8gICAgICAgICAgICAgICAgIE1fTUNSRUNPTkJMT0NLXzxwcmVkaWN0VHlwZT4gJHJuZCwgJG9mZnNldCAKLSAgICA7Ly8gaXMgYW4gY29kZSBzZWdtZW50IChzdGFydGluZyB3aXRoIGEgbGFiZWwgaW5kaWNhdGluZyB0aGUgcHJlZGljdFR5cGUsIAotICAgIDsvLyByb3VuZGluZyBhbmQgb2Zmc2V0IGNvbWJpbmF0aW9uKQotICAgIDsvLyBGb3VyIGNhbGxzIG9mIHRoaXMgbWFjcm8gd2l0aCB0aGUgNCBwcmVkaWN0aW9uIG1vZGVzIHBvcHVsYXRlIGFsbCB0aGUgMzIgCi0gICAgOy8vIGhhbmRsZXJzCi0KLSAgICBNQUNSTwotICAgIE1fTUNSRUNPTkJMT0NLICRwcmVkaWN0VHlwZQotICAgICAgICBNX01DUkVDT05CTE9DS18kcHJlZGljdFR5cGUgMCwgMAotICAgICAgICBNX01DUkVDT05CTE9DS18kcHJlZGljdFR5cGUgMCwgMQotICAgICAgICBNX01DUkVDT05CTE9DS18kcHJlZGljdFR5cGUgMCwgMgotICAgICAgICBNX01DUkVDT05CTE9DS18kcHJlZGljdFR5cGUgMCwgMwotICAgIElGICIkcHJlZGljdFR5cGUiIC89ICJJbnRlZ2VyUGl4ZWwiIDsvLyBJZiBub3QgSW50ZWdlclBpeGVsIHRoZW4gcm91bmRpbmcgbWFrZXMgYSBkaWZmZXJlbmNlCi0gICAgICAgIE1fTUNSRUNPTkJMT0NLXyRwcmVkaWN0VHlwZSAxLCAwCi0gICAgICAgIE1fTUNSRUNPTkJMT0NLXyRwcmVkaWN0VHlwZSAxLCAxCi0gICAgICAgIE1fTUNSRUNPTkJMT0NLXyRwcmVkaWN0VHlwZSAxLCAyCi0gICAgICAgIE1fTUNSRUNPTkJMT0NLXyRwcmVkaWN0VHlwZSAxLCAzCi0gICAgRU5ESUYKLSAgICBNRU5ECi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07Ly8gSW5wdXQvT3V0cHV0IFJlZ2lzdGVycwotcFNyYyAgICAgICAgICAgICAgICAgIFJOIDAKLXNyY1N0ZXAgICAgICAgICAgICAgICBSTiAxCi1hcmdfcFNyY1Jlc2lkdWUgICAgICAgUk4gMgotcFNyY1Jlc2lkdWUgICAgICAgICAgIFJOIDEyCi1wRHN0ICAgICAgICAgICAgICAgICAgUk4gMwotZHN0U3RlcCAgICAgICAgICAgICAgIFJOIDIKLXByZWRpY3RUeXBlICAgICAgICAgICBSTiAxMAotcm5kVmFsICAgICAgICAgICAgICAgIFJOIDExCi1tYXNrICAgICAgICAgICAgICAgICAgUk4gMTEKLQotOy8vIExvY2FsIFNjcmF0Y2ggUmVnaXN0ZXJzCi16ZXJvICAgICAgICAgICAgICAgICAgUk4gMTIKLXkgICAgICAgICAgICAgICAgICAgICBSTiAxNAotCi10bXAxICAgICAgICAgICAgICAgICAgUk4gNAotdG1wMiAgICAgICAgICAgICAgICAgIFJOIDUKLXRtcDMgICAgICAgICAgICAgICAgICBSTiA2Ci10bXA0ICAgICAgICAgICAgICAgICAgUk4gNwotdG1wNSAgICAgICAgICAgICAgICAgIFJOIDgKLXRtcDYgICAgICAgICAgICAgICAgICBSTiA5Ci10bXA3ICAgICAgICAgICAgICAgICAgUk4gMTAKLXRtcDggICAgICAgICAgICAgICAgICBSTiAxMQotdG1wOSAgICAgICAgICAgICAgICAgIFJOIDEyCi0KLXQwMCAgICAgICAgICAgICAgICAgICBSTiA0Ci10MDEgICAgICAgICAgICAgICAgICAgUk4gNQotdDEwICAgICAgICAgICAgICAgICAgIFJOIDYKLXQxMSAgICAgICAgICAgICAgICAgICBSTiA3Ci10MjAgICAgICAgICAgICAgICAgICAgUk4gOAotdDIxICAgICAgICAgICAgICAgICAgIFJOIDkKLXQzMCAgICAgICAgICAgICAgICAgICBSTiAxMAotdDMxICAgICAgICAgICAgICAgICAgIFJOIDExCi10bXAgICAgICAgICAgICAgICAgICAgUk4gMTIKLQoteU1hc2sgICAgICAgICAgICAgICAgIFJOIDE0Ci0KLWRzdCAgICAgICAgICAgICAgICAgICBSTiAxCi1yZXR1cm4gICAgICAgICAgICAgICAgUk4gMAotCi0gICAgOy8vIEFsbG9jYXRlIG1lbW9yeSBvbiBzdGFjawotICAgIE1fQUxMT0M0ICAgIFN0a19wRHN0LCAgICAgICAgICAgNAotICAgIE1fQUxMT0M0ICAgIFN0a19wU3JjUmVzaWR1ZSwgICAgNAotICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKLSAgICBNX1NUQVJUICAgICBvbXhWQ000UDJfTUNSZWNvbkJsb2NrLCByMTEKLSAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cwotICAgIE1fQVJHICAgICAgIEFyZ19kc3RTdGVwLCAgICAgICAgNAotICAgIE1fQVJHICAgICAgIEFyZ19wcmVkaWN0VHlwZSwgICAgNAotICAgIE1fQVJHICAgICAgIEFyZ19ybmRWYWwsICAgICAgICAgNAotICAgIDsvLyBTYXZlIG9uIHN0YWNrCi0gICAgTV9TVFIgICAgICAgcERzdCwgU3RrX3BEc3QKLSAgICBNX1NUUiAgICAgICBhcmdfcFNyY1Jlc2lkdWUsIFN0a19wU3JjUmVzaWR1ZQotICAgIDsvLyBMb2FkIGFyZ3VtZW50IGZyb20gdGhlIHN0YWNrCi0gICAgTV9MRFIgICAgICAgZHN0U3RlcCwgQXJnX2RzdFN0ZXAKLSAgICBNX0xEUiAgICAgICBwcmVkaWN0VHlwZSwgQXJnX3ByZWRpY3RUeXBlCi0gICAgTV9MRFIgICAgICAgcm5kVmFsLCBBcmdfcm5kVmFsCi0gICAgCi0gICAgTU9WICAgICAgICAgeSwgIzgKLSAgICAKLSAgICBBTkQgICAgICAgICB0bXAxLCBwU3JjLCAjMwotICAgIE9SUiAgICAgICAgIHByZWRpY3RUeXBlLCB0bXAxLCBwcmVkaWN0VHlwZSwgTFNMICMzCi0gICAgT1JSICAgICAgICAgcHJlZGljdFR5cGUsIHByZWRpY3RUeXBlLCBybmRWYWwsIExTTCAjMgotICAgIDsvLyBUcnVuY2F0aW5nIHNvdXJjZSBwb2ludGVyIHRvIGFsaWduIHRvIDQgYnl0ZSBsb2NhdGlvbgotICAgIEJJQyAgICAgICAgIHBTcmMsIHBTcmMsICMzCi0KLSAgICA7Ly8gSW1wbGVtZW50YXRpb24gdGFrZXMgY2FyZSBvZiBhbGwgY29tYmluYXRpb25zIG9mIGRpZmZlcmVudCAKLSAgICA7Ly8gcHJlZGljdFR5cGVzLCByb3VuZGluZyBjYXNlcyBhbmQgc291cmNlIHBvaW50ZXIgb2Zmc2V0cyB0byBhbGlnbm1lbnQgCi0gICAgOy8vIG9mIDQgYnl0ZXMgaW4gZGlmZmVyZW50IGNvZGUgYmFzZXMgdW5sZXNzIG9uZSBvZiB0aGVzZSBwYXJhbWV0ZXIgd2Fzbid0IAotICAgIDsvLyBtYWtpbmcgYW55IGRpZmZlcmVuY2UgdG8gdGhlIGltcGxlbWVudGF0aW9uLiBCZWxvdyBNX0NBU0VfTUNSRUNPTkJMT0NLCi0gICAgOy8vIG1hY3JvcyBicmFuY2ggaW50byA4IE1fQ0FTRSBtYWNyb3MgZm9yIGFsbCBjb21iaW5hdGlvbnMgb2YgdGhlIDIgCi0gICAgOy8vIHJvdW5kaW5nIGNhc2VzIGFuZCA0IG9mZnNldHMgb2YgdGhlIHBTcmMgcG9pbnRlciB0byB0aGUgNCBieXRlIAotICAgIDsvLyBhbGlnbm1lbnQuIAotICAgIE1fU1dJVENIICAgIHByZWRpY3RUeXBlCi0gICAgICAgIE1fQ0FTRV9NQ1JFQ09OQkxPQ0sgSW50ZWdlclBpeGVsCi0gICAgICAgIE1fQ0FTRV9NQ1JFQ09OQkxPQ0sgSGFsZlBpeGVsWAotICAgICAgICBNX0NBU0VfTUNSRUNPTkJMT0NLIEhhbGZQaXhlbFkKLSAgICAgICAgTV9DQVNFX01DUkVDT05CTE9DSyBIYWxmUGl4ZWxYWQotICAgIE1fRU5EU1dJVENICi0KLSAgICA7Ly8gVGhlIE1fTUNSRUNPTkJMT0NLIG1hY3JvcyBwb3B1bGF0ZSB0aGUgY29kZSBiYXNlcyBieSBjYWxsaW5nIGFsbCA4IAotICAgIDsvLyBwYXJ0aWN1bGFyIG1hY3JvcyAoNCBpbiBjYXNlIG9mIEludGVnZXJQaXhlbCBhcyByb3VuZGluZyBtYWtlcyBubyAKLSAgICA7Ly8gZGlmZmVyZW5jZSB0aGVyZSkgdG8gZ2VuZXJhdGUgdGhlIGNvZGUgZm9yIGFsbCBjYXNlcyBvZiByb3VuZGluZyBhbmQgCi0gICAgOy8vIG9mZnNldHMuIExUT1JHIGlzIHVzZWQgdG8gc2VnbWVudCB0aGUgY29kZSBhcyBjb2RlIHNpemUgYmxvYXRlZCBiZXlvbmQgCi0gICAgOy8vIDRLQi4KLSAgICBNX01DUkVDT05CTE9DSyBJbnRlZ2VyUGl4ZWwKLSAgICBNX01DUkVDT05CTE9DSyBIYWxmUGl4ZWxYCi0gICAgTFRPUkcKLSAgICBNX01DUkVDT05CTE9DSyBIYWxmUGl4ZWxZCi0gICAgTV9NQ1JFQ09OQkxPQ0sgSGFsZlBpeGVsWFkKLVN3aXRjaFByZWRpY3RUeXBlRW5kCi0KLSAgICA7Ly8gUmVzaWR1ZSBBZGRpdGlvbgotICAgIDsvLyBUaGlzIGlzIGRvbmUgaW4gMiBsYW5lIFNJTUQgdGhvdWdoIGxvYWRzIGFyZSBmdXJ0aGVyIG9wdGltaXplZCBhbmQKLSAgICA7Ly8gNCBieXRlcyBhcmUgbG9hZGVkIGluIGNhc2Ugb2YgZGVzdGluYXRpb24gYnVmZmVyLiBBbGdvcml0aG1pYyAKLSAgICA7Ly8gZGV0YWlscyBhcmUgaW4gaW5saW5lZCBjb21tZW50cwotICAgIE1fTERSICAgICAgIHBTcmNSZXNpZHVlLCBTdGtfcFNyY1Jlc2lkdWUKLSAgICBDTVAgICAgICAgICBwU3JjUmVzaWR1ZSwgIzAKLSAgICBCRVEgICAgICAgICBwU3JjUmVzaWR1ZUNvbmRpdGlvbkVuZAotcFNyY1Jlc2lkdWVOb3ROdWxsICAgIAotICAgIE1fTERSICAgICAgIHBEc3QsIFN0a19wRHN0Ci0gICAgTU9WICAgICAgICAgeSwgIzgKLSAgICBTVUIgICAgICAgICBkc3RTdGVwLCBkc3RTdGVwLCAjNAotWWxvb3BfcFNyY1Jlc2lkdWVOb3ROdWxsCi0gICAgU1VCUyAgICAgICAgeSwgeSwgIzEKLSAgICBMRFIgICAgICAgICBkc3QsIFtwRHN0XSAgICAgICAgICAgICAgICA7Ly8gZHN0ID0gW2RjYmFdCi0gICAgTERNSUEgICAgICAgcFNyY1Jlc2lkdWUhLCB7dG1wMSwgdG1wMn0gOy8vIHRtcDE9W0RDXSB0bXAyPVtCQV0KLSAgICBQS0hCVCAgICAgICB0bXAzLCB0bXAxLCB0bXAyLCBMU0wgIzE2ICA7Ly8gRGVsdGF2YWwxID0gW0MgQV0KLSAgICBQS0hUQiAgICAgICB0bXA0LCB0bXAyLCB0bXAxLCBBU1IgIzE2ICA7Ly8gRGVsdGFWYWwyID0gW0QgQl0KLSAgICBVWFRCMTYgICAgICB0bXAxLCBkc3QgICAgICAgICAgICAgICAgICA7Ly8gdG1wMSA9IFswYzBhXQotICAgIFVYVEIxNiAgICAgIHRtcDIsIGRzdCwgUk9SICM4ICAgICAgICAgIDsvLyB0bXAyID0gWzBkMGJdCi0gICAgUUFERDE2ICAgICAgdG1wMSwgdG1wMSwgdG1wMyAgICAgICAgICAgOy8vIEFkZCBhbmQgc2F0dXJhdGUgdG8gMTYgYml0cwotICAgIFFBREQxNiAgICAgIHRtcDIsIHRtcDIsIHRtcDQKLSAgICBVU0FUMTYgICAgICB0bXAxLCAjOCwgdG1wMQotICAgIFVTQVQxNiAgICAgIHRtcDIsICM4LCB0bXAyICAgICAgICAgICAgIDsvLyBhcm1DbGlwKDAsIDI1NSwgdG1wMikKLSAgICBPUlIgICAgICAgICB0bXAxLCB0bXAxLCB0bXAyLCBMU0wgIzggICA7Ly8gdG1wMSA9IFtkY2JhXQotICAgIFNUUiAgICAgICAgIHRtcDEsIFtwRHN0XSwgIzQKLSAgICAKLSAgICBMRFIgICAgICAgICBkc3QsIFtwRHN0XQotICAgIExETUlBICAgICAgIHBTcmNSZXNpZHVlISwge3RtcDEsIHRtcDJ9Ci0gICAgUEtIQlQgICAgICAgdG1wMywgdG1wMSwgdG1wMiwgTFNMICMxNgotICAgIFBLSFRCICAgICAgIHRtcDQsIHRtcDIsIHRtcDEsIEFTUiAjMTYKLSAgICBVWFRCMTYgICAgICB0bXAxLCBkc3QKLSAgICBVWFRCMTYgICAgICB0bXAyLCBkc3QsIFJPUiAjOAotICAgIFFBREQxNiAgICAgIHRtcDEsIHRtcDEsIHRtcDMKLSAgICBRQUREMTYgICAgICB0bXAyLCB0bXAyLCB0bXA0Ci0gICAgVVNBVDE2ICAgICAgdG1wMSwgIzgsIHRtcDEKLSAgICBVU0FUMTYgICAgICB0bXAyLCAjOCwgdG1wMgotICAgIE9SUiAgICAgICAgIHRtcDEsIHRtcDEsIHRtcDIsIExTTCAjOAotICAgIFNUUiAgICAgICAgIHRtcDEsIFtwRHN0XSwgZHN0U3RlcAotICAgIAotICAgIEJHVCAgICAgICAgIFlsb29wX3BTcmNSZXNpZHVlTm90TnVsbAotcFNyY1Jlc2lkdWVDb25kaXRpb25FbmQKLQotICAgIE1PViAgICAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKLQotICAgIE1fRU5ECi0gICAgRU5ESUYgOy8vIEFSTTExMzZKUwotCi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07Ly8gQ29ydGV4QTggaW1wbGVtZW50YXRpb24KLTsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICBFTkQKLTsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsvLyBvbXhWQ000UDJfTUNSZWNvbkJsb2NrIGVuZHMKLTsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE2YzgxZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTcgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsgKioqKioqKioqKgotOyAqIAotOyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmFfcy5zCi07ICogT3Blbk1BWCBETDogdjEuMC4yCi07ICogUmV2aXNpb246ICAgOTY0MQotOyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07ICogCi07ICogCi07ICogCi07ICogCi07ICogRGVzY3JpcHRpb246Ci07ICogQ29udGFpbnMgbW9kdWxlIGZvciBEQy9BQyBjb2VmZmljaWVudCBwcmVkaWN0aW9uCi07ICoKLTsgKiAKLTsgKiBGdW5jdGlvbjogb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYQotOyAqCi07ICogRGVzY3JpcHRpb246Ci07ICogUGVyZm9ybXMgYWRhcHRpdmUgREMvQUMgY29lZmZpY2llbnQgcHJlZGljdGlvbiBmb3IgYW4gaW50cmEgYmxvY2suIFByaW9yCi07ICogdG8gdGhlIGZ1bmN0aW9uIGNhbGwsIHByZWRpY3Rpb24gZGlyZWN0aW9uIChwcmVkRGlyKSBzaG91bGQgYmUgc2VsZWN0ZWQKLTsgKiBhcyBzcGVjaWZpZWQgaW4gc3ViY2xhdXNlIDcuNC4zLjEgb2YgSVNPL0lFQyAxNDQ5Ni0yLgotOyAqCi07ICogUmVtYXJrczoKLTsgKgotOyAqIFBhcmFtZXRlcnM6Ci07ICogW2luXSAgcFNyY0RzdCAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucyB0aGUgCi07ICogICAgICAgICAgICAgICAgICAgIHF1YW50aXplZCBjb2VmZmljaWVudCByZXNpZHVhbHMgKFBRRikgb2YgdGhlIGN1cnJlbnQgCi07ICogICAgICAgICAgICAgICAgICAgIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIFRoZSAKLTsgKiAgICAgICAgICAgICAgICAgICAgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIHRvIHRoZSByYW5nZSAKLTsgKiAgICAgICAgICAgICAgICAgICAgWy0yMDQ4LCAyMDQ3XS4KLTsgKiBbaW5dICBwUHJlZEJ1ZlJvdyAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkCi07ICogICAgICAgICAgICAgICAgICAgIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LgotOyAqIFtpbl0gIHBQcmVkQnVmQ29sICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyOyBtdXN0IGJlIAotOyAqICAgICAgICAgICAgICAgICAgICBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LgotOyAqIFtpbl0gIGN1clFQICAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBjdXJRUCBtYXkgCi07ICogICAgICAgICAgICAgICAgICAgIGVxdWFsIHRvIHByZWRRUCBlc3BlY2lhbGx5IHdoZW4gdGhlIGN1cnJlbnQgYmxvY2sgYW5kIAotOyAqICAgICAgICAgICAgICAgICAgICB0aGUgcHJlZGljdG9yIGJsb2NrIGFyZSBpbiB0aGUgc2FtZSBtYWNyb2Jsb2NrLgotOyAqIFtpbl0gIHByZWRRUCAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sKLTsgKiBbaW5dICBwcmVkRGlyICAgICAgaW5kaWNhdGVzIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCB0YWtlcyBvbmUKLTsgKiAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Ci07ICogICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19IT1JJWk9OVEFMICAgIHByZWRpY3QgaG9yaXpvbnRhbGx5Ci07ICogICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19WRVJUSUNBTCAgICAgICAgcHJlZGljdCB2ZXJ0aWNhbGx5Ci07ICogW2luXSAgQUNQcmVkRmxhZyAgIGEgZmxhZyBpbmRpY2F0aW5nIGlmIEFDIHByZWRpY3Rpb24gc2hvdWxkIGJlCi07ICogICAgICAgICAgICAgICAgICAgIHBlcmZvcm1lZC4gSXQgaXMgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIGluIHRoZSBiaXQKLTsgKiAgICAgICAgICAgICAgICAgICAgc3RyZWFtIHN5bnRheCBvZiBNUEVHLTQKLTsgKiBbaW5dICB2aWRlb0NvbXAgICAgdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSwgY2hyb21pbmFuY2Ugb3IKLTsgKiAgICAgICAgICAgICAgICAgICAgYWxwaGEpIG9mIHRoZSBjdXJyZW50IGJsb2NrCi07ICogW291dF0gcFNyY0RzdCAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucwotOyAqICAgICAgICAgICAgICAgICAgICB0aGUgcXVhbnRpemVkIGNvZWZmaWNpZW50cyAoUUYpIG9mIHRoZSBjdXJyZW50Ci07ICogICAgICAgICAgICAgICAgICAgIGJsb2NrCi07ICogW291dF0gcFByZWRCdWZSb3cgIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgotOyAqIFtvdXRdIHBQcmVkQnVmQ29sICBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIKLTsgKiBSZXR1cm4gVmFsdWU6Ci07ICogT01YX1N0c19Ob0VyciAtIG5vIGVycm9yCi07ICogT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzIAotOyAqIC0gQXQgbGVhc3Qgb25lIG9mIHRoZSBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwUHJlZEJ1ZlJvdywgb3IgcFByZWRCdWZDb2wuCi07ICogLSBBdCBsZWFzdCBvbmUgdGhlIGZvbGxvd2luZyBjYXNlczogY3VyUVAgPD0gMCwgcHJlZFFQIDw9IDAsIGN1clFQID4zMSwgCi07ICogICBwcmVkUVAgPiAzMSwgcHJlRGlyIGV4Y2VlZHMgWzEsMl0uCi07ICogLSBBdCBsZWFzdCBvbmUgb2YgdGhlIHBvaW50ZXJzIHBTcmNEc3QsIHBQcmVkQnVmUm93LCBvciBwUHJlZEJ1ZkNvbCBpcyBub3QgCi07ICogICA0LWJ5dGUgYWxpZ25lZC4KLTsgKgotOyAqKioqKioqKioKLSAgICAgCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi0gICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLSAgICAgICAKLSAgICAgICAgICAgICAKLQotICAgICAgIElNUE9SVCAgICAgICAgYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzMyCi0gICAgICAgSU1QT1JUICAgICAgICBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMTYKLSAgICAgICBJTVBPUlQgICAgICAgIGFybVZDTTRQMl9EQ1NjYWxlcgotICAgICAgIAotCi0KLSAgICAgICAgSUYgQVJNMTEzNkpTCi0KLQotOy8vIElucHV0IEFyZ3VtZW50cwotCi1wU3JjRHN0ICAgICAgICAgIFJOIDAKLXBQcmVkQnVmUm93ICAgICAgUk4gMQotcFByZWRCdWZDb2wgICAgICBSTiAyCi1jdXJRUCAgICAgICAgICAgIFJOIDMKLVFQICAgICAgICAgICAgICAgUk4gMwotcHJlZFFQICAgICAgICAgICBSTiA0Ci1wcmVkRGlyICAgICAgICAgIFJOIDUKLUFDUHJlZEZsYWcgICAgICAgUk4gNgotdmlkZW9Db21wICAgICAgICBSTiA3ICAKLQotOy8vIExvY2FsIFZhcmlhYmxlcwotCi10ZW1wMiAgICAgICAgICAgIFJOIDUKLW5lZ0N1clFQICAgICAgICAgUk4gNwotbmVnZGNTY2FsZXIgICAgICBSTiA3Ci10ZW1wUHJlZCAgICAgICAgIFJOIDgKLQotZGNTY2FsZXIgICAgICAgICBSTiA0Ci1Db2VmZlRhYmxlICAgICAgIFJOIDkKLWFic0NvZWZmREMgICAgICAgUk4gOQotdGVtcDMgICAgICAgICAgICBSTiA2Ci1hYnNDb2VmZkFDICAgICAgIFJOIDYKLQotc2hvcnRWaWRlb0hlYWRlciBSTiA5Ci1wcmVkQ29lZmZUYWJsZSAgIFJOIDEwCi1Db3VudCAgICAgICAgICAgIFJOIDEwCi10ZW1wMSAgICAgICAgICAgIFJOIDEyCi1pbmRleCAgICAgICAgICAgIFJOIDEyCi1SZW0gICAgICAgICAgICAgIFJOIDE0Ci10ZW1wICAgICAgICAgICAgIFJOIDExCi1SZXR1cm4gICAgICAgICAgIFJOIDAKLQotICAgICAgIAotCi0gICAgICAgTV9TVEFSVCAgIG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEscjEyCi0gICAgICAgCi0gICAgICAgOy8vIEFzc2lnbmluZyBwb2ludGVycyB0byBJbnB1dCBhcmd1bWVudHMgb24gU3RhY2sKLSAgICAKLSAgICAgICBNX0FSRyAgICAgICAgICAgcHJlZFFQb25TdGFjayw0ICAKLSAgICAgICBNX0FSRyAgICAgICAgICAgcHJlZERpcm9uU3RhY2ssNAotICAgICAgIE1fQVJHICAgICAgICAgICBBQ1ByZWRGbGFnb25TdGFjayw0Ci0gICAgICAgTV9BUkcgICAgICAgICAgIHZpZGVvQ29tcG9uU3RhY2ssNAotICAgICAgIAotICAgICAgIDsvLyBEQyBQcmVkaWN0aW9uCi0KLSAgICAgICBNX0xEUiAgICAgICAgICAgdmlkZW9Db21wLHZpZGVvQ29tcG9uU3RhY2sgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCB2aWRlb0NvbXAgRnJvbSBTdGFjayAgICAgICAgICAgICAgIAotICAgICAgIAotICAgICAgIE1fTERSICAgICAgICAgICBwcmVkRGlyLHByZWREaXJvblN0YWNrICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIFByZWRpY3Rpb24gZGlyZWN0aW9uCi0gICAgICAgCi0gICAgICAgOy8vIGRjU2NhbGVyIENhbGN1bGF0aW9uCi0KLSAgICAgICBMRFIgICAgICAgICAgICAgaW5kZXgsID1hcm1WQ000UDJfRENTY2FsZXIKLSAgICAgICBBREQgICAgICAgICAgICAgaW5kZXgsaW5kZXgsdmlkZW9Db21wLExTTCAjNQotICAgICAgIExEUkIgICAgICAgICAgICBkY1NjYWxlcixbaW5kZXgsUVBdCi0gICAgICAgICAgIAotICAgIAotY2FsRENWYWwKLSAgICAgIAotICAgICAgIAotICAgICAgIExEUiAgICAgICAgICAgICBwcmVkQ29lZmZUYWJsZSwgPWFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MxNiAgIDsvLyBMb2FkaW5nIHRoZSB0YWJsZSB3aXRoIGVudHJpZXMgMzI3NjcvKDEgdG8gNjMpIAotICAgICAgCi0gICAgICAgQ01QICAgICAgICAgICAgIHByZWREaXIsIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIHRoZSBQcmVkaWN0aW9uIGRpcmVjdGlvbiBpcyB2ZXJ0aWNhbAotCi0gICAgICAgOy8vIENhdWx1Y2F0ZSB0ZW1wIHByZWQgYnkgcGVyZm9ybWluZyBEaXZpc2lvbgotICAgICAgICAgICAgCi0gICAgICAgTERSRVFTSCAgICAgICAgIGFic0NvZWZmREMsW3BQcmVkQnVmUm93XSAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIHZldGljYWwgbG9hZCB0aGUgY29lZmYgZnJvbSBSb3cgUHJlZGljdGlvbiBCdWZmZXIKLSAgICAgICBMRFJORVNIICAgICAgICAgYWJzQ29lZmZEQyxbcFByZWRCdWZDb2xdICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgaG9yaXpvbnRhbCBsb2FkIHRoZSBjb2VmZiBmcm9tIGNvbHVtbiBQcmVkaWN0aW9uIEJ1ZmZlcgotICAgICAgIAotICAgICAgIFJTQiAgICAgICAgICAgICBuZWdkY1NjYWxlcixkY1NjYWxlciwjMCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBuZWdkY1NjYWxlcj0tZGNTY2FsZXIgIAotICAgICAgIAotICAgICAgIE1PViAgICAgICAgICAgICB0ZW1wMSxhYnNDb2VmZkRDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wMT1wcmVkaWN0aW9uIGNvZWZmCi0gICAgICAgQ01QICAgICAgICAgICAgIHRlbXAxLCMwCi0gICAgICAgUlNCTFQgICAgICAgICAgIGFic0NvZWZmREMsdGVtcDEsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vYWJzQ29lZmZEQz1hYnModGVtcDEpCi0gICAgICAgCi0gICAgICAgQUREICAgICAgICAgICAgIHRlbXAsZGNTY2FsZXIsZGNTY2FsZXIKLSAgICAgICBMRFJIICAgICAgICAgICAgdGVtcCxbcHJlZENvZWZmVGFibGUsdGVtcF0gICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCB2YWx1ZSBmcm9tIGNvZWZmIHRhYmxlIGZvciBwZXJmb3JtaW5nIGRpdmlzaW9uIHVzaW5nIG11bHRpcGxpY2F0aW9uCi0gICAgICAgCi0gICAgICAgU01VTEJCICAgICAgICAgIHRlbXBQcmVkLHRlbXAsYWJzQ29lZmZEQyAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXBQcmVkPXBQcmVkQnVmUm93KENvbClbMF0qMzI3NjcvZGNTY2FsZXIKLSAgICAgICBBREQgICAgICAgICAgICAgdGVtcDMsZGNTY2FsZXIsIzEKLSAgICAgICBMU1IgICAgICAgICAgICAgdGVtcFByZWQsdGVtcFByZWQsIzE1ICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcFByZWQ9cFByZWRCdWZSb3coQ29sKVswXS9kY1NjYWxlciAgICAgICAgICAKLSAgICAgICBMU1IgICAgICAgICAgICAgdGVtcDMsdGVtcDMsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcDM9cm91bmQoZGNTY2FsZXIvMikKLSAgICAgICAKLSAgICAgICBNTEEgICAgICAgICAgICAgUmVtLG5lZ2RjU2NhbGVyLHRlbXBQcmVkLGFic0NvZWZmREMgICAgICAgICAgICA7Ly8gUmVtID0gcFByZWRCdWZSb3coQ29sKVswXS10ZW1wUHJlZCpkY1NjYWxlciAgICAgIAotICAgICAgIAotICAgICAgIAotICAgICAgIExEUkggICAgICAgICAgICB0ZW1wLFtwUHJlZEJ1ZkNvbF0KLSAgICAgICBDTVAgICAgICAgICAgICAgUmVtLHRlbXAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICBBRERHRSAgICAgICAgICAgdGVtcFByZWQsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgUmVtPj1yb3VuZChkY1NjYWxlci8yKTt0ZW1wUHJlZD10ZW1wUHJlZCsxCi0gICAgICAgQ01QICAgICAgICAgICAgIHRlbXAxLCMwCi0gICAgICAgUlNCTFQgICAgICAgICAgIHRlbXBQcmVkLHRlbXBQcmVkLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvIGlmIHBQcmVkQnVmUm93KENvbClbMF08MDsgdGVtcFByZWQ9LXRlbXBQcmVkCi0gICAgICAgICAgICAgCi0gICAgICAgCi0gICAgICAgU1RSSCAgICAgICAgICAgIHRlbXAsW3BQcmVkQnVmUm93LCMtMTZdICAgICAgCi0KLSAgICAgICBMRFJIICAgICAgICAgICAgdGVtcCxbcFNyY0RzdF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcD1wU3JjRHN0WzBdCi0gICAgICAgTV9MRFIgICAgICAgICAgIEFDUHJlZEZsYWcsQUNQcmVkRmxhZ29uU3RhY2sKLSAgICAgICBBREQgICAgICAgICAgICAgdGVtcCx0ZW1wLHRlbXBQcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcD1wU3JjRHN0WzBdK3RlbXBQcmVkCi0gICAgICAgU1NBVDE2ICAgICAgICAgIHRlbXAsIzEyLHRlbXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGNsaXAgdGVtcCB0byBbLTIwNDgsMjA0N10KLSAgICAgICAKLSAgICAgICBTTVVMQkIgICAgICAgICAgdGVtcDEsdGVtcCxkY1NjYWxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcDE9Y2xpcHBlZChwU3JjRHN0WzBdKSpkY1NjYWxlciAgICAgICAgICAgCi0gICAgICAgTV9MRFIgICAgICAgICAgIHByZWRRUCxwcmVkUVBvblN0YWNrCi0gICAgICAgU1RSSCAgICAgICAgICAgIHRlbXAsW3BTcmNEc3RdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgQ01QICAgICAgICAgICAgIEFDUHJlZEZsYWcsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIHRoZSBBQyBwcmVkaWN0aW9uIGZsYWcgaXMgc2V0IG9yIG5vdAotICAgICAgIFNUUkggICAgICAgICAgICB0ZW1wMSxbcFByZWRCdWZDb2xdICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB0ZW1wMSB0byBwUHJlZEJ1ZkNvbAotIAotICAgICAgIDsvLyBBQyBQcmVkaWN0aW9uCi0KLSAgICAgICAgICAgICAgCi0gICAgICAgQk5FICAgICAgICAgICAgIEV4aXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIG5vdCBzZXQgRXhpdAotICAgICAgIAotICAgICAgIExEUiAgICAgICAgICAgICBwcmVkQ29lZmZUYWJsZSwgPWFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MzMiAgIDsvLyBMb2FkaW5nIHRoZSB0YWJsZSB3aXRoIGVudHJpZXMgMHgxZmZmZi8oMSB0byA2MykKLSAgICAgICBNT1YgICAgICAgICAgICAgdGVtcDEsIzQKLSAgICAgICBNVUwgICAgICAgICAgICAgdGVtcDEsY3VyUVAsdGVtcDEKLSAgICAgICBDTVAgICAgICAgICAgICAgcHJlZERpciwjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgdGhlIFByZWRpY3Rpb24gZGlyZWN0aW9uCi0gICAgICAgUlNCICAgICAgICAgICAgIG5lZ0N1clFQLGN1clFQLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIExEUiAgICAgICAgICAgICBDb2VmZlRhYmxlLFtwcmVkQ29lZmZUYWJsZSx0ZW1wMV0gICAgICAgICAgICAgIDsvLyBDb2VmZlRhYmxlPTB4MWZmZmYvY3VyUVAKLSAgICAgICBBREQgICAgICAgICAgICAgY3VyUVAsY3VyUVAsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY3VyUVA9Y3VyUVArMQotICAgICAgIExTUiAgICAgICAgICAgICBjdXJRUCxjdXJRUCwjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjdXJRUD1yb3VuZChjdXJRUC8yKSAgICAgICAgICAgICAgICAKLSAgICAgICBNT1YgICAgICAgICAgICAgQ291bnQsIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSW5pdGlhbGl6aW5nIHRoZSBMb29wIENvdW50Ci0gICAgICAgQk5FICAgICAgICAgICAgIEhvcml6b250YWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIHRoZSBQcmVkaWN0aW9uIGRpcmVjdGlvbiBpcyBob3Jpem9udGFsIGJyYW5jaCB0byBIb3Jpem9udGFsCi0KLSAgICAgICAKLQotbG9vcDEgICAgICAgCi0gICAgICAgOy8vIENhbGN1bGF0ZSB0ZW1wUHJlZAotICAgICAgIAotICAgICAgIExEUlNIICAgICAgICAgICBhYnNDb2VmZkFDLFtwUHJlZEJ1ZlJvdyxDb3VudF0gICAgICAgICAgICAgICAgIDsvLyBhYnNDb2VmZkFDPXBQcmVkQnVmUm93W2ldLCAxPTxpPD03Ci0gICAgICAgTU9WICAgICAgICAgICAgIHRlbXAxLGFic0NvZWZmQUMKLSAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY29tcGFyZSBwUHJlZEJ1ZlJvd1tpXSB3aXRoIHplcm8sIDE9PGk8PTcKLSAgICAgICBSU0JMVCAgICAgICAgICAgYWJzQ29lZmZBQyx0ZW1wMSwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gYWJzQ29lZmZBQz0gYWJzKHBQcmVkQnVmUm93W2ldKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICBTTVVMQkIgICAgICAgICAgYWJzQ29lZmZBQyxhYnNDb2VmZkFDLHByZWRRUCAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcDE9cFByZWRCdWZSb3dbaV0qcHJlZFFQCi0gICAgICAgTVVMICAgICAgICAgICAgIHRlbXBQcmVkLGFic0NvZWZmQUMsQ29lZmZUYWJsZSAgICAgICAgICAgICAgICAgOy8vIHRlbXBQcmVkPXBQcmVkQnVmUm93W2ldKnByZWRRUCoweDFmZmZmL2N1clFQCi0gICAgICAgTFNSICAgICAgICAgICAgIHRlbXBQcmVkLHRlbXBQcmVkLCMxNyAgICAgICAgICAKLSAgICAgICAgICAgICAKLSAgICAgICBNTEEgICAgICAgICAgICAgUmVtLG5lZ0N1clFQLHRlbXBQcmVkLGFic0NvZWZmQUMgICAgICAgICAgICAgICA7Ly8gUmVtPWFicyhwUHJlZEJ1ZlJvd1tpXSktdGVtcFByZWQqY3VyUVAKLSAgICAgICBMRFJIICAgICAgICAgICAgdGVtcCxbcFNyY0RzdCxDb3VudF0gICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcD1wU3JjRHN0W2ldLDE8PWk8OAotICAgICAgIAotICAgICAgIENNUCAgICAgICAgICAgICBSZW0sY3VyUVAKLSAgICAgICBBRERHRSAgICAgICAgICAgdGVtcFByZWQsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gaWYgUmVtPj1yb3VuZChjdXJRUC8yKTsgdGVtcFByZWQ9dGVtcFByZWQrMQotICAgICAgIENNUCAgICAgICAgICAgICB0ZW1wMSwjMAotICAgICAgIFJTQkxUICAgICAgICAgICB0ZW1wUHJlZCx0ZW1wUHJlZCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBpZiBwUHJlZEJ1ZlJvd1tpXTwwIDsgdGVtcFByZWQ9LXRlbXBQcmVkCi0gICAgICAgICAgICAgIAotICAgICAgIDsvLyBVcGRhdGUgc291cmNlIGFuZCBSb3cgUHJlZGljdGlvbiBidWZmZXJzCi0gICAgICAgCi0gICAgICAgQUREICAgICAgICAgICAgIHRlbXAsdGVtcCx0ZW1wUHJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXA9dGVtcFByZWQrcFNyY0RzdFtpXQotICAgICAgIFNTQVQxNiAgICAgICAgICB0ZW1wLCMxMix0ZW1wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDbGlwIHRlbXAgdG8gWy0yMDQ4LDIwNDddCi0gICAgICAgU1RSSCAgICAgICAgICAgIHRlbXAsW3BTcmNEc3QsQ291bnRdCi0gICAgICAgU1RSSCAgICAgICAgICAgIHRlbXAsW3BQcmVkQnVmUm93LENvdW50XSAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBQcmVkQnVmUm93W2ldPXRlbXAKLSAgICAgICBBREQgICAgICAgICAgICAgQ291bnQsQ291bnQsIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gaT1pKzEKLSAgICAgICBDTVAgICAgICAgICAgICAgQ291bnQsIzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY29tcGFyZSBpZiBpPTgKLSAgICAgICBCTFQgICAgICAgICAgICAgbG9vcDEKLSAgICAgICBCICAgICAgICAgICAgICAgRXhpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIGV4aXQKLQotSG9yaXpvbnRhbAotCi0gICAgICAgTU9WICAgICAgICAgICAgIENvdW50LCMxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEluaXRpYWxpemluZyBpPTgKLQotbG9vcDIgIAotICAgICAKLSAgICAgICBMU1IgICAgICAgICAgICAgdGVtcDIsQ291bnQsIzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcDI9aT4+MwotICAgICAgIAotICAgICAgIDsvLyBDYWxjdWxhdGUgdGVtcFByZWQKLSAgICAgICAKLSAgICAgICBMRFJIICAgICAgICAgICAgYWJzQ29lZmZBQyxbcFByZWRCdWZDb2wsdGVtcDJdICAgICAgICAgICAgICAgICA7Ly8gYWJzQ29lZkFDPXBQcmVkQnVmQ29sW2k+PjNdICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICBNT1YgICAgICAgICAgICAgdGVtcDEsYWJzQ29lZmZBQwotICAgICAgIENNUCAgICAgICAgICAgICB0ZW1wMSwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjb21wYXJlIHBQcmVkQnVmUm93W2ldIHdpdGggemVybywgMT08aTw9NwotICAgICAgIFJTQkxUICAgICAgICAgICBhYnNDb2VmZkFDLHRlbXAxLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBhYnNDb2VmZkFDPWFicyhwUHJlZEJ1ZkNvbFtpPj4zXSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgU01VTEJCICAgICAgICAgIGFic0NvZWZmQUMsYWJzQ29lZmZBQyxwcmVkUVAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXAxPXBQcmVkQnVmQ29sW2k+PjNdKnByZWRRUAotICAgICAgIE1VTCAgICAgICAgICAgICB0ZW1wUHJlZCxhYnNDb2VmZkFDLENvZWZmVGFibGUgICAgICAgICAgICAgICAgIDsvLyB0ZW1wUHJlZD1wUHJlZEJ1ZkNvbFtpPj4zXSpwcmVkUVAqMHgxZmZmZi9jdXJRUAotICAgICAgIExTUiAgICAgICAgICAgICB0ZW1wUHJlZCx0ZW1wUHJlZCwjMTcgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wUHJlZD1wUHJlZEJ1ZkNvbFtpPj4zXSpwcmVkUVAvY3VyUVAKLSAgICAgICAKLSAgICAgICBNTEEgICAgICAgICAgICAgUmVtLG5lZ0N1clFQLHRlbXBQcmVkLGFic0NvZWZmQUMKLSAgICAgICBMRFJIICAgICAgICAgICAgdGVtcCxbcFNyY0RzdCxDb3VudF0gICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcD1wU3JjRHN0W2ldCi0gICAgICAgCi0gICAgICAgQ01QICAgICAgICAgICAgIFJlbSxjdXJRUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENvbXBhcmUgUmVtIHdpdGggcm91bmQoY3VyUVAvMikKLSAgICAgICBBRERHRSAgICAgICAgICAgdGVtcFByZWQsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcFByZWQ9dGVtcFByZWQrMSBpZiBSZW0+PXJvdW5kKGN1clFQLzIpCi0gICAgICAgQ01QICAgICAgICAgICAgIHRlbXAxLCMwCi0gICAgICAgUlNCTFQgICAgICAgICAgIHRlbXBQcmVkLHRlbXBQcmVkLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGlmIHBQcmVkQnVmQ29sW2k+PjMgPDAgdGVtcFByZWQ9LXRlbXBQcmVkCi0gICAgICAgCi0gICAgICAgOy8vIFVwZGF0ZSBzb3VyY2UgYW5kIFJvdyBQcmVkaWN0aW9uIGJ1ZmZlcnMKLSAgICAgICAKLSAgICAgICBBREQgICAgICAgICAgICAgdGVtcCx0ZW1wLHRlbXBQcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcD1wU3JjRHN0W2ldK3RlbXBQcmVkCi0gICAgICAgU1NBVDE2ICAgICAgICAgIHRlbXAsIzEyLHRlbXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENsaXAgdGVtcCB0byBbLTIwNDgsMjA0N10KLSAgICAgICBTVFJIICAgICAgICAgICAgdGVtcCxbcFNyY0RzdCxDb3VudF0gICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFswXT0gY2xpcHBlZCB2YWx1ZQotICAgICAgIFNUUkggICAgICAgICAgICB0ZW1wLFtwUHJlZEJ1ZkNvbCx0ZW1wMl0gICAgICAgICAgICAgICAgICAgICAgIDsvLyBwUHJlZEJ1ZkNvbFtpPj4zXT10ZW1wCi0gICAgICAgQUREICAgICAgICAgICAgIENvdW50LENvdW50LCMxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGk9aSs4Ci0gICAgICAgQ01QICAgICAgICAgICAgIENvdW50LCMxMjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGNvbXBhcmUgaSB3aXRoIDY0Ci0gICAgICAgQkxUICAgICAgICAgICAgIGxvb3AyCi0KLSAgICAgICAgICAgICAKLUV4aXQKLSAgCi0gICAgICAgTU9WICAgICAgICAgICAgIFJldHVybiwjT01YX1N0c19Ob0VyciAKLQotICAgICAgIE1fRU5ECi0gICAgICAgRU5ESUYKLSAgICAgICBFTkQKLQotCi0gICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU3MTYwZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50ZXJfSV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvKioKLTsgKiAKLTsgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JX3MucwotOyAqIE9wZW5NQVggREw6IHYxLjAuMgotOyAqIFJldmlzaW9uOiAgIDk2NDEKLTsgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOyAqIAotOyAqIAotOyAqIAotOyAqCi07ICogRGVzY3JpcHRpb246IAotOyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGludGVyIHJlY29uc3RydWN0aW9uCi07ICogCi07ICoKLTsgKgotOyAqCi07ICoKLTsgKiBGdW5jdGlvbjogb214VkNNNFAyX1F1YW50SW52SW50ZXJfSQotOyAqCi07ICogRGVzY3JpcHRpb246Ci07ICogUGVyZm9ybXMgaW52ZXJzZSBxdWFudGl6YXRpb24gb24gaW50cmEvaW50ZXIgY29kZWQgYmxvY2suCi07ICogVGhpcyBmdW5jdGlvbiBzdXBwb3J0cyBiaXRzX3Blcl9waXhlbCA9IDguIE1pc21hdGNoIGNvbnRyb2wKLTsgKiBpcyBwZXJmb3JtZWQgZm9yIHRoZSBmaXJzdCBNUEVHLTQgbW9kZSBpbnZlcnNlIHF1YW50aXphdGlvbiBtZXRob2QuCi07ICogVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIGNsaXBwZWQgdG8gdGhlIHJhbmdlOiBbLTIwNDgsIDIwNDddLgotOyAqIE1pc21hdGNoIGNvbnRyb2wgaXMgcGVyZm9ybWVkIGZvciB0aGUgZmlyc3QgaW52ZXJzZSBxdWFudGl6YXRpb24gbWV0aG9kLgotOyAqCi07ICogUmVtYXJrczoKLTsgKgotOyAqIFBhcmFtZXRlcnM6Ci07ICogW2luXSBwU3JjRHN0ICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGlucHV0IChxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrLiBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4KLTsgKiBbaW5dIFFQICAgICAgICAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGlzZXJfc2NhbGUpCi07ICogW2luXSB2aWRlb0NvbXAgICAgICAoSW50cmEgdmVyc2lvbiBvbmx5LikgVmlkZW8gY29tcG9uZW50IHR5cGUgb2YgdGhlCi07ICogICAgICAgICAgICAgICAgICBjdXJyZW50IGJsb2NrLiBUYWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyBmbGFnczoKLTsgKiAgICAgICAgICAgICAgICAgIE9NWF9WQ19MVU1JTkFOQ0UsIE9NWF9WQ19DSFJPTUlOQU5DRSwKLTsgKiAgICAgICAgICAgICAgICAgIE9NWF9WQ19BTFBIQS4KLTsgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgYSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOwotOyAqICAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIG1vZGUsCi07ICogICAgICAgICAgICAgICAgICBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbmxpbmVhciBpbnRyYSBEQyBtb2RlLgotOyAqIFtvdXRdICAgIHBTcmNEc3QgICAgICBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKGRlcXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jay4gIE11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLgotOyAqCi07ICogUmV0dXJuIFZhbHVlOgotOyAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgotOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cwotOyAqICAgIC0gSWYgcFNyY0RzdCBpcyBOVUxMIG9yIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuCi07ICogICAgICBvcgotOyAqICAgIC0gSWYgUVAgPD0gMC4KLTsgKiAgICAgIG9yCi07ICogICAgLSB2aWRlb0NvbXAgaXMgbm9uZSBvZiBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UgYW5kIE9NWF9WQ19BTFBIQS4KLTsgKgotOyAqLwotCi0gICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgSU5DTFVERSBhcm1DT01NX3MuaAotCi0gICBNX1ZBUklBTlRTIEFSTTExMzZKUwotCi0gICAgICAgICAKLQotICAgICBJRiBBUk0xMTM2SlMKLQotOy8vSW5wdXQgQXJndW1lbnRzCi1wU3JjRHN0ICAgICAgICAgICAgUk4gMAotUVAgICAgICAgICAgICAgICAgIFJOIDEKLQotOy8vTG9jYWwgVmFyaWFibGVzCi1SZXR1cm4gICAgICAgICAgICAgUk4gMAotQ291bnQgICAgICAgICAgICAgIFJOIDQgICAgICAKLXRlbXBWYWwyMSAgICAgICAgICBSTiAyCi10ZW1wVmFsNDMgICAgICAgICAgUk4gMwotUVAxICAgICAgICAgICAgICAgIFJOIDUKLVgyICAgICAgICAgICAgICAgICBSTiA2Ci1YMyAgICAgICAgICAgICAgICAgUk4gMTQKLVJlc3VsdDEgICAgICAgICAgICBSTiA4Ci1SZXN1bHQyICAgICAgICAgICAgUk4gOQotdHdvICAgICAgICAgICAgICAgIFJOIDcKLQotICAgIE1fU1RBUlQgb214VkNNNFAyX1F1YW50SW52SW50ZXJfSSxyOQotICAgICAgIAotICAgICAgICBNT1YgICAgICBDb3VudCwjNjQKLSAgICAgICAgVFNUICAgICAgUVAsIzEKLSAgICAgICAgTERSRCAgICAgdGVtcFZhbDIxLFtwU3JjRHN0XSAgICAgIDsvLyBMb2FkcyBmaXJzdCB0d28gdmFsdWVzIG9mIHBTcmNEc3QgdG8gdGVtcFZhbDIxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIG5leHQgdHdvIHZhbHVlcyB0byB0ZW1wVmFsNDMKLSAgICAgICAgU1VCRVEgICAgUVAxLFFQLCMxICAgICAgICAgICAgICAgIDsvLyBRUDE9UVAgaWYgUVAgaXMgb2RkICwgUVAxPVFQLTEgaWYgUVAgaXMgZXZlbgotICAgICAgICBNT1ZORSAgICBRUDEsUVAKLSAgICAgICAgTU9WICAgICAgdHdvLCMyCi0gICAgICAgIAotICAgICAgICAKLQotTG9vcAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFNNVUxCQiAgIFgyLHRlbXBWYWwyMSx0d28gICAgICAgICA7Ly8gWDI9IGZpcnN0IHZhbChsb3dlciAxNiBiaXRzIG9mIHRhbXBWYWwyMSkqMgotICAgICAgICBDTVAgICAgICBYMiwjMAotICAgICAgICAKLSAgICAgICAgUlNCTFQgICAgWDIsWDIsIzAgICAgICAgICAgICAgICAgIDsvLyBYMj1hYnNvbHV0ZXZhbChmaXJzdCB2YWwpCi0gICAgICAgIFNNTEFCQk5FIFgyLFFQLFgyLFFQMSAgICAgICAgICAgICA7Ly8gWDI9MiphYnN2YWwoZmlyc3QgdmFsKSpRUCtRUCBpZiBRUCBpcyBvZGQgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gWDI9MiphYnN2YWwoZmlyc3QgdmFsKSpRUCtRUC0xIGlmIFFQIGlzIGV2ZW4gCi0gICAgICAgIFNNVUxUQiAgIFgzLHRlbXBWYWwyMSx0d28gICAgICAgICA7Ly8gWDM9IHNlY29uZCB2YWwodG9wIDE2IGJpdHMgb2YgdGFtcFZhbDIxKSoyCi0gICAgICAgIFJTQkxUICAgIFgyLFgyLCMwCi0gICAgICAgIAotICAgICAgICBDTVAgICAgICBYMywjMAotICAgICAgICAgICAgICAgCi0gICAgICAgIFJTQkxUICAgIFgzLFgzLCMwCi0gICAgICAgIFNNTEFCQk5FIFgzLFFQLFgzLFFQMQotICAgICAgICAKLSAgICAgICAgUlNCTFQgICAgWDMsWDMsIzAKLSAgICAgICAgUEtIQlQgICAgUmVzdWx0MSxYMixYMyxMU0wgIzE2ICAgIDsvLyBSZXN1bHQxWzAtMTVdPVgyWzAtMTVdLFJlc3VsdDFbMTYtMzFdPVgzWzE2LTMxXQotICAgICAgICBTTVVMQkIgICBYMix0ZW1wVmFsNDMsdHdvICAgICAgICAgOy8vIFgyPSBmaXJzdCB2YWwobG93ZXIgMTYgYml0cyBvZiB0YW1wVmFsNDMpKjIKLSAgICAgICAgU1NBVDE2ICAgUmVzdWx0MSwjMTIsUmVzdWx0MSAgICAgIDsvLyBjbGlwIHRvIHJhbmdlIFstMjA0OCwyMDQ3XQotICAgICAgICBDTVAgICAgICBYMiwjMAotICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgIAotICAgICAgICBSU0JMRSAgICBYMixYMiwjMAotICAgICAgICBTTUxBQkJORSBYMixRUCxYMixRUDEKLSAgICAgICAgU01VTFRCICAgWDMsdGVtcFZhbDQzLHR3byAgICAgICAgIDsvLyBYMj0gZmlyc3QgdmFsKHRvcCAxNiBiaXRzIG9mIHRhbXBWYWwyMSkqMgotICAgICAgICBSU0JMVCAgICBYMixYMiwjMAotICAgICAgICBDTVAgICAgICBYMywjMAotICAgICAgICAKLSAgICAgICAgTERSRCAgICAgdGVtcFZhbDIxLFtwU3JjRHN0LCM4XSAgIDsvLyBMb2FkIG5leHQgZm91ciBWYWx1ZXMgdG8gdGVtcFZhbDIxLHRlbXBWYWw0MwotICAgICAgICAgICAgICAgIAotICAgICAgICBSU0JMVCAgICBYMyxYMywjMAotICAgICAgICBTTUxBQkJORSBYMyxRUCxYMyxRUDEKLSAgICAgICAgUlNCTFQgICAgWDMsWDMsIzAKLSAgICAgICAgUEtIQlQgICAgUmVzdWx0MixYMixYMyxMU0wgIzE2ICAgIDsvLyBSZXN1bHQyWzAtMTVdPVgyWzAtMTVdLFJlc3VsdDJbMTYtMzFdPVgzWzAtMTVdCi0gICAgICAgIFNTQVQxNiAgIFJlc3VsdDIsIzEyLFJlc3VsdDIgICAgICA7Ly8gY2xpcCB0byByYW5nZSBbLTIwNDgsMjA0N10KLSAgICAgICAgCi0gICAgICAgIFNVQlMgICAgIENvdW50LENvdW50LCM0ICAgICAgICAgICA7Ly8gRGVjcmVtZW50IENvdW50IGJ5IDQgYW5kIGNvbnRpbnVlIGlmIGl0IGhhcyBub3QgcmVhY2hlZCAwICAgICAgICAgCi0gICAgICAgIFNUUkQgICAgIFJlc3VsdDEsW3BTcmNEc3RdLCM4ICAgICA7Ly8gU3RvcmUgRG91YmxlIHdvcmRzIGFuZCBpbmNyZW1lbnQgdGhlIHBvaW50ZXIgdG8gcG9pbnQgdGhlIG5leHQgc3RvcmUgYWRkcmVzcwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAKLSAgICAgICAgQkdUICAgICAgTG9vcAotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyCi0gICAgICAgIAotICAgICAgICBNX0VORAotICAgICAgICBFTkRJRiAgICAgICAgCi0gICAgICAgIEVORAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50cmFfSV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50cmFfSV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkODJkYTQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludHJhX0lfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07LyoqCi07ICogCi07ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX1F1YW50SW52SW50cmFfSV9zLnMKLTsgKiBPcGVuTUFYIERMOiB2MS4wLjIKLTsgKiBSZXZpc2lvbjogICA5NjQxCi07ICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsgKiAKLTsgKiAKLTsgKiAKLTsgKgotOyAqIERlc2NyaXB0aW9uOiAKLTsgKiBDb250YWlucyBtb2R1bGVzIGZvciBpbnRlciByZWNvbnN0cnVjdGlvbgotOyAqIAotOyAqCi07ICoKLTsgKgotOyAqCi07ICogCi07ICogRnVuY3Rpb246IG9teFZDTTRQMl9RdWFudEludkludHJhX0kKLTsgKgotOyAqIERlc2NyaXB0aW9uOgotOyAqIFBlcmZvcm1zIGludmVyc2UgcXVhbnRpemF0aW9uIG9uIGludHJhL2ludGVyIGNvZGVkIGJsb2NrLgotOyAqIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgYml0c19wZXJfcGl4ZWwgPSA4LiBNaXNtYXRjaCBjb250cm9sCi07ICogaXMgcGVyZm9ybWVkIGZvciB0aGUgZmlyc3QgTVBFRy00IG1vZGUgaW52ZXJzZSBxdWFudGl6YXRpb24gbWV0aG9kLgotOyAqIFRoZSBvdXRwdXQgY29lZmZpY2llbnRzIGFyZSBjbGlwcGVkIHRvIHRoZSByYW5nZTogWy0yMDQ4LCAyMDQ3XS4KLTsgKiBNaXNtYXRjaCBjb250cm9sIGlzIHBlcmZvcm1lZCBmb3IgdGhlIGZpcnN0IGludmVyc2UgcXVhbnRpemF0aW9uIG1ldGhvZC4KLTsgKgotOyAqIFJlbWFya3M6Ci07ICoKLTsgKiBQYXJhbWV0ZXJzOgotOyAqIFtpbl0gICAgcFNyY0RzdCAgICAgICAgcG9pbnRlciB0byB0aGUgaW5wdXQgKHF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2suIE11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLgotOyAqIFtpbl0gICAgUVAgICAgICAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGlzZXJfc2NhbGUpCi07ICogW2luXSAgICB2aWRlb0NvbXAgICAgICAgICAgKEludHJhIHZlcnNpb24gb25seS4pIFZpZGVvIGNvbXBvbmVudCB0eXBlIG9mIHRoZQotOyAqICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJsb2NrLiBUYWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyBmbGFnczoKLTsgKiAgICAgICAgICAgICAgICAgICAgT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFLAotOyAqICAgICAgICAgICAgICAgICAgICBPTVhfVkNfQUxQSEEuCi07ICogW2luXSAgICBzaG9ydFZpZGVvSGVhZGVyICBhIGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7Ci07ICogICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIG1vZGUsCi07ICogICAgICAgICAgICAgICAgICAgIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9ubGluZWFyIGludHJhIERDIG1vZGUuCi07ICogW291dF0gICAgcFNyY0RzdCAgICAgICAgcG9pbnRlciB0byB0aGUgb3V0cHV0IChkZXF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2suICBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4KLTsgKgotOyAqIFJldHVybiBWYWx1ZToKLTsgKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKLTsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKLTsgKiAgICAtICAgIElmIHBTcmNEc3QgaXMgTlVMTCBvciBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLgotOyAqICAgICAgb3IKLTsgKiAgICAtIElmIFFQIDw9IDAuCi07ICogICAgICBvcgotOyAqICAgIC0gdmlkZW9Db21wIGlzIG5vbmUgb2YgT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFIGFuZCBPTVhfVkNfQUxQSEEuCi07ICoKLSAKLQotICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgIAotICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLSAgIAotICAgCi0gICBJTVBPUlQgICAgICAgIGFybVZDTTRQMl9EQ1NjYWxlcgotIAotICAgICAgICAgCi0KLSAgICAgSUYgQVJNMTEzNkpTCi0KLTsvL0lucHV0IEFyZ3VtZW50cwotcFNyY0RzdCAgICAgICAgICAgIFJOIDAKLVFQICAgICAgICAgICAgICAgICBSTiAxCi12aWRlb0NvbXAgICAgICAgICAgUk4gMgotc2hvcnRWaWRlb0hlYWRlciAgIFJOIDMKLQotOy8vTG9jYWwgVmFyaWFibGVzCi1SZXR1cm4gICAgICAgICAgICAgUk4gMAotZGNTY2FsZXIgICAgICAgICAgIFJOIDQKLXRlbXAgICAgICAgICAgICAgICBSTiAxMgotaW5kZXggICAgICAgICAgICAgIFJOIDYKLSAgICAgIAotdGVtcFZhbDIxICAgICAgICAgIFJOIDQKLXRlbXBWYWw0MyAgICAgICAgICBSTiA1Ci1RUDEgICAgICAgICAgICAgICAgUk4gNgotWDIgICAgICAgICAgICAgICAgIFJOIDcKLVgzICAgICAgICAgICAgICAgICBSTiAxNAotUmVzdWx0MSAgICAgICAgICAgIFJOIDgKLVJlc3VsdDIgICAgICAgICAgICBSTiA5Ci10d28gICAgICAgICAgICAgICAgUk4gMTAKLUNvdW50ICAgICAgICAgICAgICBSTiAxMQotCi0KLQotICAgCi0gICAgTV9TVEFSVCBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JLHIxMQotCi0KLSAgICAgICAgCi0gICAgICAgIDsvLyBQZXJmb3JtIEludmVyc2UgUXVhbnRpemF0aW9uIGZvciBEQyBjb2VmZmljaWVudAotCi0gICAgICAgIFRFUSAgICAgICBzaG9ydFZpZGVvSGVhZGVyLCMwICAgICAgOy8vIFRlc3QgaWYgc2hvcnQgVmlkZW8gSGVhZGVyIGZsYWcgPTAgICAgICAgICAgICAgCi0gICAgICAgIE1PVk5FICAgICBkY1NjYWxlciwjOCAgICAgICAgICAgICAgOy8vIGlmIHNob3J0VmlkZW9IZWFkZXIgaXMgbm9uIHplcm8gZGNTY2FsZXI9OAotICAgICAgICBCTkUgICAgICAgY2FsRENWYWwKLSAgICAgICAgTERSICAgICAgIGluZGV4LCA9YXJtVkNNNFAyX0RDU2NhbGVyCi0gICAgICBBREQgICAgICAgaW5kZXgsaW5kZXgsdmlkZW9Db21wLExTTCAjNQotICAgICAgTERSQiAgICAgIGRjU2NhbGVyLFtpbmRleCxRUF0KLQotCi0gICAgICAgIDsvL01fQ2FsRENTY2FsYXIgIHNob3J0VmlkZW9IZWFkZXIsdmlkZW9Db21wLCBRUAotCi1jYWxEQ1ZhbAotCi0gICAgICAgIExEUkggICAgIHRlbXAsW3BTcmNEc3RdCi0gICAgICAgIFNNVUxCQiAgIHRlbXAsdGVtcCxkY1NjYWxlciAgICAgICA7Ly8gZGNDb2VmZiA9IGRjU2NhbGVyICogUXVhbnRpemVkIERDIGNvZWZmaWNpZW50KGZyb20gbWVtb3J5KQotICAgICAgICBTU0FUICAgICB0ZW1wLCMxMix0ZW1wICAgICAgICAgICAgOy8vIFNhdHVyYXRpbmcgdG8gMTIgYml0cwotICAgICAgICAKLQotICAgICAgICBNT1YgICAgICBDb3VudCwjNjQKLSAgICAgICAgVFNUICAgICAgUVAsIzEKLSAgICAgICAgTERSRCAgICAgdGVtcFZhbDIxLFtwU3JjRHN0XSAgICAgIDsvLyBMb2FkcyBmaXJzdCB0d28gdmFsdWVzIG9mIHBTcmNEc3QgdG8gdGVtcFZhbDIxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIG5leHQgdHdvIHZhbHVlcyB0byB0ZW1wVmFsNDMKLSAgICAgICAgU1VCRVEgICAgUVAxLFFQLCMxICAgICAgICAgICAgICAgIDsvLyBRUDE9UVAgaWYgUVAgaXMgb2RkICwgUVAxPVFQLTEgaWYgUVAgaXMgZXZlbgotICAgICAgICBNT1ZORSAgICBRUDEsUVAKLSAgICAgICAgTU9WICAgICAgdHdvLCMyCi0KLQotICAgICAgICAgICAgICAgIAotICAgICAgICAKLQotTG9vcAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFNNVUxCQiAgIFgyLHRlbXBWYWwyMSx0d28gICAgICAgICA7Ly8gWDI9IGZpcnN0IHZhbChsb3dlciAxNiBiaXRzIG9mIHRhbXBWYWwyMSkqMgotICAgICAgICBDTVAgICAgICBYMiwjMAotICAgICAgICAKLSAgICAgICAgUlNCTFQgICAgWDIsWDIsIzAgICAgICAgICAgICAgICAgIDsvLyBYMj1hYnNvbHV0ZXZhbChmaXJzdCB2YWwpCi0gICAgICAgIFNNTEFCQk5FIFgyLFFQLFgyLFFQMSAgICAgICAgICAgICA7Ly8gWDI9MiphYnN2YWwoZmlyc3QgdmFsKSpRUCtRUCBpZiBRUCBpcyBvZGQgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gWDI9MiphYnN2YWwoZmlyc3QgdmFsKSpRUCtRUC0xIGlmIFFQIGlzIGV2ZW4gCi0gICAgICAgIFNNVUxUQiAgIFgzLHRlbXBWYWwyMSx0d28gICAgICAgICA7Ly8gWDM9IHNlY29uZCB2YWwodG9wIDE2IGJpdHMgb2YgdGFtcFZhbDIxKSoyCi0gICAgICAgIFJTQkxUICAgIFgyLFgyLCMwCi0gICAgICAgIAotICAgICAgICBDTVAgICAgICBYMywjMAotICAgICAgICAgICAgICAgCi0gICAgICAgIFJTQkxUICAgIFgzLFgzLCMwCi0gICAgICAgIFNNTEFCQk5FIFgzLFFQLFgzLFFQMQotICAgICAgICAKLSAgICAgICAgUlNCTFQgICAgWDMsWDMsIzAKLSAgICAgICAgUEtIQlQgICAgUmVzdWx0MSxYMixYMyxMU0wgIzE2ICAgIDsvLyBSZXN1bHQxWzAtMTVdPVgyWzAtMTVdLFJlc3VsdDFbMTYtMzFdPVgzWzE2LTMxXQotICAgICAgICBTTVVMQkIgICBYMix0ZW1wVmFsNDMsdHdvICAgICAgICAgOy8vIFgyPSBmaXJzdCB2YWwobG93ZXIgMTYgYml0cyBvZiB0YW1wVmFsNDMpKjIKLSAgICAgICAgU1NBVDE2ICAgUmVzdWx0MSwjMTIsUmVzdWx0MSAgICAgIDsvLyBjbGlwIHRvIHJhbmdlIFstMjA0OCwyMDQ3XQotICAgICAgICBDTVAgICAgICBYMiwjMAotICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgIAotICAgICAgICBSU0JMRSAgICBYMixYMiwjMAotICAgICAgICBTTUxBQkJORSBYMixRUCxYMixRUDEKLSAgICAgICAgU01VTFRCICAgWDMsdGVtcFZhbDQzLHR3byAgICAgICAgIDsvLyBYMj0gZmlyc3QgdmFsKHRvcCAxNiBiaXRzIG9mIHRhbXBWYWwyMSkqMgotICAgICAgICBSU0JMVCAgICBYMixYMiwjMAotICAgICAgICBDTVAgICAgICBYMywjMAotICAgICAgICAKLSAgICAgICAgTERSRCAgICAgdGVtcFZhbDIxLFtwU3JjRHN0LCM4XSAgIDsvLyBMb2FkIG5leHQgZm91ciBWYWx1ZXMgdG8gdGVtcFZhbDIxLHRlbXBWYWw0MwotICAgICAgICAgICAgICAgIAotICAgICAgICBSU0JMVCAgICBYMyxYMywjMAotICAgICAgICBTTUxBQkJORSBYMyxRUCxYMyxRUDEKLSAgICAgICAgUlNCTFQgICAgWDMsWDMsIzAKLSAgICAgICAgUEtIQlQgICAgUmVzdWx0MixYMixYMyxMU0wgIzE2ICAgIDsvLyBSZXN1bHQyWzAtMTVdPVgyWzAtMTVdLFJlc3VsdDJbMTYtMzFdPVgzWzE2LTMxXQotICAgICAgICBTU0FUMTYgICBSZXN1bHQyLCMxMixSZXN1bHQyICAgICAgOy8vIGNsaXAgdG8gcmFuZ2UgWy0yMDQ4LDIwNDddCi0gICAgICAgIAotICAgICAgICBTVUJTICAgICBDb3VudCxDb3VudCwjNCAgICAgICAgICAgOy8vIERlY3JlbWVudCBDb3VudCBieSA0IGFuZCBjb250aW51ZSBpZiBpdCBoYXMgbm90IHJlYWNoZWQgMCAgICAgICAgIAotICAgICAgICBTVFJEICAgICBSZXN1bHQxLFtwU3JjRHN0XSwjOCAgICAgOy8vIFN0b3JlIERvdWJsZSB3b3JkcyBhbmQgaW5jcmVtZW50IHRoZSBwb2ludGVyIHRvIHBvaW50IHRoZSBuZXh0IHN0b3JlIGFkZHJlc3MKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgCi0gICAgICAgIEJHVCAgICAgIExvb3AKLQotICAgICAgICBTVUIgICAgICBwU3JjRHN0LHBTcmNEc3QsIzEyOAotICAgICAgICAKLSAgICAgICAgOy8vIFN0b3JpbmcgdGhlIEludmVyc2UgUXVhbnRpemVkIERDIGNvZWZmaWNpZW50Ci0KLSAgICAgICAgU1RSSCAgICAgdGVtcCxbcFNyY0RzdF0sIzIKLSAgICAgICAgCi0gIAotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyCi0gICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIE1fRU5ECi0gICAgICAgIEVORElGICAgICAgICAKLSAgICAgICAgRU5ECi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9zcmMvYXJtVkNfVmVyc2lvbi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOTM2ODEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybUNPTU1fVmVyc2lvbi5oIgotCi0jaWZkZWYgQVJNX0lOQ0xVREVfVkVSU0lPTl9ERVNDUklQVElPTlMKLWNvbnN0IGNoYXIgKiBjb25zdCBvbXhWQ19WZXJzaW9uRGVzY3JpcHRpb24gPSAiQVJNIE9wZW5NQVggREwgdiIgQVJNX1ZFUlNJT05fU1RSSU5HICIgICBSZWw9IiBPTVhfQVJNX1JFTEVBU0VfVEFHICIgICBBcmNoPSIgT01YX0FSTV9CVUlMRF9BUkNISVRFQ1RVUkUgIiAgIFRvb2xzPSIgIE9NWF9BUk1fQlVJTERfVE9PTENIQUlOIDsKLSNlbmRpZiAvKiBBUk1fSU5DTFVERV9WRVJTSU9OX0RFU0NSSVBUSU9OUyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL0FSTV9ERUxJVkVSWS5UWFQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vQVJNX0RFTElWRVJZLlRYVApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MyZDcwYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vQVJNX0RFTElWRVJZLlRYVAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLVRoZSBjb250ZW50cyBvZiB0aGlzIHRyYW5zYWN0aW9uIHdhcyBjcmVhdGVkIGJ5IEhlZGxleSBGcmFuY2lzCi1vZiBBUk0gb24gMTktRmViLTIwMDguCi0KLUl0IGNvbnRhaW5zIHRoZSBBUk0gZGF0YSB2ZXJzaW9ucyBsaXN0ZWQgYmVsb3cuCi0KLVRoaXMgZGF0YSwgdW5sZXNzIG90aGVyd2lzZSBzdGF0ZWQsIGlzIEFSTSBQcm9wcmlldGFyeSBhbmQgYWNjZXNzIHRvIGl0Ci1pcyBzdWJqZWN0IHRvIHRoZSBhZ3JlZW1lbnRzIGluZGljYXRlZCBiZWxvdy4KLQotSWYgeW91IGV4cGVyaWVuY2UgcHJvYmxlbXMgd2l0aCB0aGlzIGRhdGEsIHBsZWFzZSBjb250YWN0IEFSTSBzdXBwb3J0Ci1xdW90aW5nIHRyYW5zYWN0aW9uIHJlZmVyZW5jZSA8OTc0MTQ+LgotCi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCi0KLS0gT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEKLSAgVmlkZW8gY29kZWNzIC0gb3B0aW1pc2VkIGNvZGUKLSAgVjcgY29kZSByZWxlYXNlIGZvciBIYW50cm8gKFZlciAxLjAuMikKLSAgaW50ZXJuYWwgYWNjZXNzCi0KLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KLQotVGhpcyB0cmFuc2FjdGlvbiBjb250YWlucyBkZWxpdmVyYWJsZXMgd2hpY2ggYXJlIGRlc2lnbmF0ZWQgYXMgYmVpbmcgb2YKLWJldGEgcmVsZWFzZSBzdGF0dXMgKEJFVCkuCi0KLUJldGEgcmVsZWFzZSBzdGF0dXMgaGFzIGEgcGFydGljdWxhciBtZWFuaW5nIHRvIEFSTSBvZiB3aGljaCB0aGUgcmVjaXBpZW50Ci1tdXN0IGJlIGF3YXJlLiBCZXRhIGlzIGEgcHJlLXJlbGVhc2Ugc3RhdHVzIGluZGljYXRpbmcgdGhhdCB0aGUgZGVsaXZlcmFibGUKLXNvIGRlc2NyaWJlZCBpcyBiZWxpZXZlZCB0byByb2J1c3RseSBkZW1vbnN0cmF0ZSBzcGVjaWZpZWQgYmVoYXZpb3VyLCB0byBiZQotY29uc2lzdGVudCBhY3Jvc3MgaXRzIGluY2x1ZGVkIGFzcGVjdHMgYW5kIGJlIHJlYWR5IGZvciBnZW5lcmFsIGRlcGxveW1lbnQuCi1CdXQgQmV0YSBhbHNvIGluZGljYXRlcyB0aGF0IHByZS1yZWxlYXNlIHJlbGlhYmlsaXR5IHRyaWFscyBhcmUgb25nb2luZyBhbmQKLXRoYXQgaXQgaXMgcG9zc2libGUgcmVzaWR1YWwgZGVmZWN0cyBvciBlcnJvcnMgaW4gb3BlcmF0aW9uLCBjb25zaXN0ZW5jeQotYW5kIGRvY3VtZW50YXRpb24gbWF5IHN0aWxsIGJlIGVuY291bnRlcmVkLiBUaGUgcmVjaXBpZW50IHNob3VsZCBjb25zaWRlcgotdGhpcyBwb3NpdGlvbiB3aGVuIHVzaW5nIHRoaXMgQmV0YSBtYXRlcmlhbCBzdXBwbGllZC4gQVJNIHdpbGwgbm9ybWFsbHkKLWF0dGVtcHQgdG8gcHJvdmlkZSBmaXhlcyBvciBhIHdvcmstYXJvdW5kIGZvciBkZWZlY3RzIGlkZW50aWZpZWQgYnkgdGhlCi1yZWNpcGllbnQsIGJ1dCB0aGUgcHJvdmlzaW9uIG9yIHRpbWVsaW5lc3Mgb2YgdGhpcyBzdXBwb3J0IGNhbm5vdCBiZQotZ3VhcmFudGVlZC4gQVJNIHNoYWxsIG5vdCBiZSByZXNwb25zaWJsZSBmb3IgZGlyZWN0IG9yIGNvbnNlcXVlbnRpYWwKLWRhbWFnZXMgYXMgYSByZXN1bHQgb2YgZW5jb3VudGVyaW5nIG9uZSBvciBtb3JlIG9mIHRoZXNlIHJlc2lkdWFsIGRlZmVjdHMuCi1CeSBhY2NlcHRpbmcgYSBCZXRhIHJlbGVhc2UsIHRoZSByZWNpcGllbnQgYWdyZWVzIHRvIHRoZXNlIGNvbnN0cmFpbnRzIGFuZAotdG8gcHJvdmlkaW5nIHJlYXNvbmFibGUgaW5mb3JtYXRpb24gdG8gQVJNIHRvIGVuYWJsZSB0aGUgcmVwbGljYXRpb24gb2YgdGhlCi1kZWZlY3RzIGlkZW50aWZpZWQgYnkgdGhlIHJlY2lwaWVudC4gVGhlIHNwZWNpZmljIEJldGEgdmVyc2lvbiBzdXBwbGllZAotd2lsbCBub3QgYmUgc3VwcG9ydGVkIGFmdGVyIHJlbGVhc2Ugb2YgYSBsYXRlciBvciBoaWdoZXIgc3RhdHVzIHZlcnNpb24uCi1JdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBTdXBwb3J0IGZvciB0aGUgQmV0YSByZWxlYXNlIG9mIHRoZSBkZWxpdmVyYWJsZQotd2lsbCBvbmx5IGJlIHByb3ZpZGVkIGJ5IEFSTSB0byBhIHJlY2lwaWVudCB3aG8gaGFzIGEgY3VycmVudCBzdXBwb3J0IGFuZAotbWFpbnRlbmFuY2UgY29udHJhY3QgZm9yIHRoZSBkZWxpdmVyYWJsZS4KLQotCi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCi0KLUluIGFkZGl0aW9uIHRvIHRoZSBkYXRhIHZlcnNpb25zIGxpc3RlZCBhYm92ZSwgdGhpcyB0cmFuc2FjdGlvbiBjb250YWlucwotdHdvIGFkZGl0aW9uYWwgZmlsZXMgYXQgdGhlIHRvcCBsZXZlbC4KLQotVGhlIGZpcnN0IGlzIHRoaXMgZmlsZSwgQVJNX0RFTElWRVJZXzk3NDE0LlRYVCwgd2hpY2ggaXMgdGhlIGRlbGl2ZXJ5Ci1ub3RlLgotCi1UaGUgc2Vjb25kIGlzIEFSTV9NQU5JRkVTVF85NzQxNC5UWFQgd2hpY2ggY29udGFpbnMgYSBtYW5pZmVzdCBvZiBhbGwgdGhlCi1maWxlcyBpbmNsdWRlZCBpbiB0aGlzIHRyYW5zYWN0aW9uLCB0b2dldGhlciB3aXRoIHRoZWlyIGNoZWNrc3Vtcy4KLQotVGhlIGNoZWNrc3VtcyBwcm92aWRlZCBhcmUgY2FsY3VsYXRlZCB1c2luZyB0aGUgUlNBIERhdGEgU2VjdXJpdHksIEluYy4KLU1ENSBNZXNzYWdlLURpZ2VzdCBBbGdvcml0aG0uCi0KLVRoZSBjaGVja3N1bXMgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IHRoZSBpbnRlZ3JpdHkgb2YgdGhpcyBkYXRhIHVzaW5nIHRoZQotIm1kNXN1bSIgdG9vbCAod2hpY2ggaXMgcGFydCBvZiB0aGUgR05VICJ0ZXh0dXRpbHMiIHBhY2thZ2UpIGJ5IHJ1bm5pbmc6Ci0KLSAgJSBtZDVzdW0gLS1jaGVjayBBUk1fTUFOSUZFU1RfOTc0MTQuVFhUCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9BUk1fTUFOSUZFU1QuVFhUIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL0FSTV9NQU5JRkVTVC5UWFQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMTBmNjcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL0FSTV9NQU5JRkVTVC5UWFQKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0JCQkJICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS8KLQkJCQkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS8KLWUwNDk3OTFjZmFiNjA2MGEwOGNiYWM3YjNhZDc2N2Q2ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTV9zLmgKLWVkNzk4ZmFjZTI1NDk3YjI3MDNlZGU3MzZkNmQ1MmI2ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvb214dHlwZXNfcy5oCi00ZWViZDYzYWYwODczNzY4MTFkNjc0OWYwNjQ2Yjg2NCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU1fQml0RGVjX3MuaAotNDNjZjQ2YzJjZjJmZTFmOTNjNjE1YjU3YmNiZTQ4MDkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NLmgKLThmMjQ4Y2VhYWM4ZjYwMmUyNzdhNTIxYjY3OWRjYmJlICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTV9JRENUVGFibGUuaAotOGFjNWZhODBlYTk4ZTM5MWY1NzMwYTM3NTI4MGI1YmQgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX1ZlcnNpb24uaAotM2EyZjQyMGRkZjZhMWI5NTA0NzBiZDBmNWViZDVjNjIgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX0lEQ1Rfcy5oCi01MTFjMGJiNTM0ZmUyMjM1OTllMmM4NGVmZjI0YzllZCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU1fTWFza1RhYmxlLmgKLTg5NzE5MzJkNTZlZWQ2YjFhZDFiYTUwN2YwYmZmNWYwICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTV9CaXRzdHJlYW0uaAotZjg3ZmVkZDljYTQzMmZlZmE3NTcwMDgxNzY4NjRlZjggIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1PTVguaAotOGU0OTg5OWE0Mjg4MjJjMzZlZjlkZDk0ZTBlMDVmMTggIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9vbXh0eXBlcy5oCi0zMjMwMDhiNzJlOWYwNDA5OWE4Y2I0MmU5OWExZmFjZSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvYnVpbGRfdmMucGwKLWU3MmQ5NmMwYTQxNTQ1OTc0OGRmOTgwN2YzZGFlNzJmICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9maWxlbGlzdF92Yy50eHQKLQkJCQkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3NyYy8KLTVlZWFlNjU5YTI5NDc3ZjVjNTIyOTZkMjRhZmZmZDNjICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9zcmMvYXJtQ09NTV9JRENUVGFibGUuYwotZDY0Y2RjZjM4Zjc3NDlkYzdmNzc0NjVlNWI3ZDM1NmQgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3NyYy9hcm1DT01NX01hc2tUYWJsZS5jCi0JCQkJICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy8KLQkJCQkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwLwotCQkJCSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjLwotZTdlMGMzMjA5Nzg1NjRhN2M5YjJjNzIzNzQ5YTk4ZDYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKLTRhZGNkMGRmMDgxOTkwYmRmYzQ3MjkwNDFhMmE5MTUyICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCi04NTJlMDQwNDE0Mjk2NWRjMWYzYWE3ZjAwZWU1MTI3YiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5zCi03MDU0MTUxYzViZmVhNmI1ZTc0ZmVlZTg2YjJkN2IwMSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYwotNWY3MjEzYTRmMzc2MjdiM2M1OGY2Mjk0YmE0NzdlMzAgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5zCi0zMmZmNGI4YmU2MmUyZjBmM2U3NjRiODNjMWU1ZTJmZCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMKLWQwNjZlM2M4MWQ4MjYxNmYzN2VjMTgxMGVhNDllN2I3ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYV91bnNhZmVfcy5zCi1mZTYyOWEzZTlkNTUzOTVhNjA5OGJkZjI0MzFiNWYwMiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5zCi01YjEzZmI5NTRiNzY3OWRlMjAwNzZiYjZhN2Y0ZWUxZCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MucwotMDFiYTYwZWZmNjZlYTQ5YTRmODMzY2U2Mjc5ZjhlMmYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYwotZmExMDcyY2YxZDE3ZTk2NjZjOWYxZTIxNWZhMzAyYjEgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZV9zLnMKLWRiMzg3YjllNjZkMzI3ODdmNDdlZjljZjAzNDdkYTJhICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MucwotZWE1MzdlNGUyYWQwM2ExOTQwOTgxMDU1ZmEzYWNlMDEgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZV9zLnMKLTI5YTQyODM4ODViOTQ3M2EzNTUwYTgxZWZmMjU1OWQyICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcl9zLnMKLTJkZGNhZjYwYThlYTFlNmU2Yjc3NzM3Zjc2OGJmYjlkICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9RdWFudFRhYmxlc19zLnMKLWMzMDAyYWFkNTYwMGY4NzJiNzBhNWQ3ZmUzOTE1ODQ2ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MucwotYTI5MDBmMmM0N2YxYzYxZDIwYmQ2YzFlZGEzM2Q2ZDQgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLnMKLWM5MjFkZjczMzk3YTMyYzk0N2RjOTk2YmE2ODU4NTUzICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MucwotMzc2OWUxNGYyZmMzZjUxNGQwMjVmZTZhYjczZmY2N2EgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLnMKLWMwMjlkMWNlYmVhMGEwOWUxZDIzNWEzN2UyMTU1MDAyICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLnMKLTA3NmEwMzNmODE2MTc1MGE2ODU3NTZmOWY1MWYwNGM5ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MucwotYzViNWQyMjg0MjgyMmU2ZTVlMzEwOTQ4ODJjYmViNDYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNl9zLnMKLWY2YmRmNmQ5MTRhNGExNDc5ZjUyNDk1MWEzNDA5ODQ2ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSV9zLnMKLWViZWIwNzEzYTliMmVhMjU5ODYzNjBlZjI2MjEzOGM0ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5zCi03OGVkOWVhMjAwZmFhN2JlNjY1NDQ1YTcxMzg1OWFmMSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MucwotYzJkOTk1Zjc4N2I2ZjQ0ZWYxMGM3NTFjMTJkMTkzNWYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9EaWFnQ29weV91bnNhZmVfcy5zCi00MGJlZDY3OWE5ZjZlMGQzZWZlMjE2YjdkNGE5Y2Y0NSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLnMKLTRhNTJiM2U5ZTI2OGI4YThmMDc4MjliZjUwMGQwM2FmICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5zCi0xMTI0OWY4YTk4YzVkNGI4NGNiNTU3NWIwZTM3Y2E5YyAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5zCi0yNTEzYjYwNTU5YmE3MWFlNDk1YzYwNTNmYjc3OWZhOSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MucwotMmZiMWVlMTdjMzZlM2MxNDY5YzE3MGY2ZGFjMTFiZjEgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MucwotY2M0YTZmMzJkYjBiNzJhOTFkM2YyNzhmNjg1NWRmNjkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYwotCQkJCSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvYXBpLwotNmU1MzBkZGFhN2MyYjU3ZmZlODgxNjJjMDIwY2I2NjIgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKLQkJCQkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvCi0JCQkJICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy8KLWJlYzZkZTM0OGIxMTM0Mzg0OTg4NjdiODY5MDAxNjIyICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2xpcDhfcy5zCi1kYmE5ODI0ZTk1OWIyMWQ0MDFjYWM5MjVlNjhhMTFhNiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcl9zLnMKLWRmYTdlNWI1ODAyN2JlMzU0MmRkYTA1OTNiNzdiMmQzICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JX3MucwotNGZiYTRjNDMxYTc4M2E3OGEyZWI2NDk3YTk0YWM5NjcgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKLTM5OTkxOTYxMTc5Y2EwM2I2MzgxYjZlNjUzYjFmMTRiICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUNSZWNvbkJsb2NrX3MucwotMWIwYjI5OTBjMjY2OWRmYjg3Y2Y2YjgxMDYxMWMwMWIgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYwotMWM5Yjg3YWJmMzI4M2U5NTc4MTZiMzkzN2M2ODA3MDEgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QX3MucwotNGZlMWFmY2E2NTlhOTA1NWZjMTE3MmU1OGY3OGE1MDYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYwotMmVhMDY3ZjA0MzZmOTFiYTEzNTFlZGFmNDExY2I0ZWEgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9Mb29rdXBfVGFibGVzLmMKLTZjZTM2M2FhZGM5ZDY1YzMwOGI0MGNjYTg5MDJlNGY2ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfSURDVDh4OGJsa19zLnMKLWJmMjEyZjc4Njc3MmFlZDJiYzcwNWQyMmZmNGU3NGY1ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRmluZE1WcHJlZF9zLnMKLTI5M2E0OGE2NDhhMzA4NTQ1NmU2NjY1YmI3MzY2ZmFkICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpcl9zLnMKLTJiYjQ3ZWQ5YzllMjVjNTcwOWM2ZDliNGFkMzlhMzhhICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JX3MucwotNDM3ZGZhMjA0NTA4ODUwZDYxZDRiODcwOTE0NDZlOWYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQ19zLnMKLWJjOTc3ODg5OGRkNDExMDFkYzBmYjAxMzllYWY4M2NjICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTENfcy5zCi1mYzE5MWVlYWU0M2Y4Y2U3MzVkYmQzMTFjYzdiY2I4ZCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYV9zLnMKLWEwZDg1ZjRmNTE3Yzk0NWE0YzkzMTdhYzAyMWYyZDA4ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZV9zLnMKLTM4NjAyMGRlZThiNzI1YzdmZTI1MjZmMWZjMjExZDdkICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKLQkJCQkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvYXBpLwotNDYyNGU3YzgzOGUxMGEyNDlhYmNjM2QzZjRmNDA3NDggIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvYXBpL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaAotNjVlMTA1N2QwNGUyY2I4NDQ1NTlkYzlmNmUwOTc5NWEgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKLQkJCQkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL3NyYy8KLWU2MjdiMzM0NmIwZGM5YWZmMTQ0NDYwMDVjZTBmYTQzICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9zcmMvYXJtVkNfVmVyc2lvbi5jCi0JCQkJICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9hcGkvCi03Y2E5NGIxYzMzYWMwMjExZTE3ZDM4YmFhZGQ3ZDFkZCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvYXBpL2FybVZDLmgKLTEyY2Y3NTk2ZWRiYmY2MDQ4YjYyNmQxNWU4ZDBlZDQ4ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9hcGkvb214VkMuaAotMTE3MjZlMjg2YTgxMjU3Y2I0NWY1NTQ3ZmI0ZDM3NGMgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2FwaS9vbXhWQ19zLmgKLWE1YjJhZjYwNWMzMTljZDI0OTEzMTllNDMwNzQxMzc3ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9hcGkvYXJtVkNDT01NX3MuaAotCQkJCSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS8KLQkJCQkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjLwotMWY4MTE4N2I0ODQ4N2E4ZWE2ZGJjMzI3NjQ4ZTNlNGYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5MTZ4MTZfcy5zCi05MzZkM2YyMDM4YTZmODYxM2VjMjVlNTBjYzYwMWZlOCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHk4eDhfcy5zCi04ZjY3MDhhMjQ5MTMwOTYyZTBiYzVjMDQ0YWM2ZGQ5MyAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0lfcy5zCi1hYWI3NzEzNDE0NDI4ZTk1ZGUwYmE3OTlhMjY3OWIzNiAgQVJNX0RFTElWRVJZXzk3NDE0LlRYVApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk5Mjg4NS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU0uaAorKysgL2Rldi9udWxsCkBAIC0xLDgwMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtQ09NTS5oCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDEyMjkwCi0gKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLSAqIAotICogCi0gKiAKLSAqICAgCi0gKiBGaWxlOiBhcm1DT01NLmgKLSAqIEJyaWVmOiBEZWNsYXJlcyBDb21tb24gQVBJcy9EYXRhIFR5cGVzIHVzZWQgYWNyb3NzIE9wZW5NQVggQVBJJ3MKLSAqCi0gKi8KLSAKLSAgCi0jaWZuZGVmIF9hcm1Db21tb25fSF8KLSNkZWZpbmUgX2FybUNvbW1vbl9IXwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgT01YX0YzMiBSZTsgLyoqIFJlYWwgcGFydCAqLwotICBPTVhfRjMyIEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCi0gICAgICAgIAotfSBPTVhfRkMzMjsgLyoqIHNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgY29tcGxleCBudW1iZXIgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgT01YX0Y2NCBSZTsgLyoqIFJlYWwgcGFydCAqLwotICBPTVhfRjY0IEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCi0gICAgICAgIAotfSBPTVhfRkM2NDsgLyoqIGRvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgY29tcGxleCBudW1iZXIgKi8KLQotCi0vKiBVc2VkIGJ5IGJvdGggSVAgYW5kIElDIGRvbWFpbnMgZm9yIDh4OCBKUEVHIGJsb2Nrcy4gKi8KLXR5cGVkZWYgT01YX1MxNiBBUk1fQkxPQ0s4eDhbNjRdOwotCi0KLSNpbmNsdWRlICJhcm1PTVguaCIKLQotI2RlZmluZSAgYXJtUEkgKE9NWF9GNjQpKDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjc5NSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBDb21waWxlciBleHRlbnNpb25zICovCi0jaWZkZWYgQVJNX0RFQlVHCi0vKiBkZWJ1ZyB2ZXJzaW9uICovCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNkZWZpbmUgYXJtRXJyb3Ioc3RyKSB7cHJpbnRmKChzdHIpKTsgcHJpbnRmKCJcbiIpOyBleGl0KC0xKTt9Ci0jZGVmaW5lIGFybVdhcm4oc3RyKSB7cHJpbnRmKChzdHIpKTsgcHJpbnRmKCJcbiIpO30KLSNkZWZpbmUgYXJtSWdub3JlKGEpICgodm9pZClhKQotI2RlZmluZSBhcm1Bc3NlcnQoYSkgYXNzZXJ0KGEpCi0jZWxzZSAKLS8qIHJlbGVhc2UgdmVyc2lvbiAqLwotI2RlZmluZSBhcm1FcnJvcihzdHIpICgodm9pZCkgKHN0cikpCi0jZGVmaW5lIGFybVdhcm4oc3RyKSAgKCh2b2lkKSAoc3RyKSkKLSNkZWZpbmUgYXJtSWdub3JlKGEpICAoKHZvaWQpIChhKSkKLSNkZWZpbmUgYXJtQXNzZXJ0KGEpICAoKHZvaWQpIChhKSkKLSNlbmRpZiAvKiBBUk1fREVCVUcgKi8KLQotLyogQXJpdGhtZXRpYyBvcGVyYXRpb25zICovCi0KLSNkZWZpbmUgYXJtTWluKGEsYikgICAgICAgICAgICAgKCAoYSkgPiAoYikgPyAgKGIpOihhKSApCi0jZGVmaW5lIGFybU1heChhLGIpICAgICAgICAgICAgICggKGEpID4gKGIpID8gIChhKTooYikgKQotI2RlZmluZSBhcm1BYnMoYSkgICAgICAgICAgICAgICAoIChhKSA8ICAwICA/IC0oYSk6KGEpICkKLQotLyogQWxpZ25tZW50IG9wZXJhdGlvbiAqLwotCi0jZGVmaW5lIGFybUFsaWduVG9CeXRlcyhQdHIsTikgICAgICAoUHRyICsgKCAoKE4tKGludHB0cl90KVB0cikmKE4tMSkpIC8gc2l6ZW9mKCpQdHIpICkpCi0jZGVmaW5lIGFybUFsaWduVG8yQnl0ZXMoUHRyKSAgICAgICBhcm1BbGlnblRvQnl0ZXMoUHRyLDIpCi0jZGVmaW5lIGFybUFsaWduVG80Qnl0ZXMoUHRyKSAgICAgICBhcm1BbGlnblRvQnl0ZXMoUHRyLDQpCi0jZGVmaW5lIGFybUFsaWduVG84Qnl0ZXMoUHRyKSAgICAgICBhcm1BbGlnblRvQnl0ZXMoUHRyLDgpCi0jZGVmaW5lIGFybUFsaWduVG8xNkJ5dGVzKFB0cikgICAgICBhcm1BbGlnblRvQnl0ZXMoUHRyLDE2KQotCi0vKiBFcnJvciBhbmQgQWxpZ25tZW50IGNoZWNrICovCi0KLSNkZWZpbmUgYXJtUmV0QXJnRXJySWYoY29uZGl0aW9uLCBjb2RlKSAgaWYoY29uZGl0aW9uKSB7IHJldHVybiAoY29kZSk7IH0KLSNkZWZpbmUgYXJtUmV0RGF0YUVycklmKGNvbmRpdGlvbiwgY29kZSkgaWYoY29uZGl0aW9uKSB7IHJldHVybiAoY29kZSk7IH0KLQotI2lmbmRlZiBBTElHTk1FTlRfRE9FU05UX01BVFRFUgotI2RlZmluZSBhcm1Jc0J5dGVBbGlnbmVkKFB0cixOKSAgICAgKCgoKGludHB0cl90KShQdHIpKSAlIE4pPT0wKQotI2RlZmluZSBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsTikgICAgKCgoKGludHB0cl90KShQdHIpKSAlIE4pIT0wKQotI2Vsc2UKLSNkZWZpbmUgYXJtSXNCeXRlQWxpZ25lZChQdHIsTikgICAgICgxKQotI2RlZmluZSBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsTikgICAgKDApCi0jZW5kaWYKLQotI2RlZmluZSBhcm1JczJCeXRlQWxpZ25lZChQdHIpICAgICAgYXJtSXNCeXRlQWxpZ25lZChQdHIsMikKLSNkZWZpbmUgYXJtSXM0Qnl0ZUFsaWduZWQoUHRyKSAgICAgIGFybUlzQnl0ZUFsaWduZWQoUHRyLDQpCi0jZGVmaW5lIGFybUlzOEJ5dGVBbGlnbmVkKFB0cikgICAgICBhcm1Jc0J5dGVBbGlnbmVkKFB0ciw4KQotI2RlZmluZSBhcm1JczE2Qnl0ZUFsaWduZWQoUHRyKSAgICAgYXJtSXNCeXRlQWxpZ25lZChQdHIsMTYpCi0KLSNkZWZpbmUgYXJtTm90MkJ5dGVBbGlnbmVkKFB0cikgICAgIGFybU5vdEJ5dGVBbGlnbmVkKFB0ciwyKQotI2RlZmluZSBhcm1Ob3Q0Qnl0ZUFsaWduZWQoUHRyKSAgICAgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLDQpCi0jZGVmaW5lIGFybU5vdDhCeXRlQWxpZ25lZChQdHIpICAgICBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsOCkKLSNkZWZpbmUgYXJtTm90MTZCeXRlQWxpZ25lZChQdHIpICAgIGFybU5vdEJ5dGVBbGlnbmVkKFB0ciwxNikKLSNkZWZpbmUgYXJtTm90MzJCeXRlQWxpZ25lZChQdHIpICAgIGFybU5vdEJ5dGVBbGlnbmVkKFB0ciwzMikKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtUm91bmRGbG9hdFRvUzE2X3JlZi9hcm1Sb3VuZEZsb2F0VG9TMzJfcmVmL2FybVJvdW5kRmxvYXRUb1M2NAotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBzaG9ydCBpbnQvaW50IGFmdGVyIHJvdW5kaW5nCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MxNi9PTVhfUzMyIGZvcm1hdAotICoKLSAqLwotCi1PTVhfUzE2IGFybVJvdW5kRmxvYXRUb1MxNiAoT01YX0Y2NCBWYWx1ZSk7Ci1PTVhfUzMyIGFybVJvdW5kRmxvYXRUb1MzMiAoT01YX0Y2NCBWYWx1ZSk7Ci1PTVhfUzY0IGFybVJvdW5kRmxvYXRUb1M2NCAoT01YX0Y2NCBWYWx1ZSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1MxNl9yZWYvYXJtU2F0Um91bmRGbG9hdFRvUzMyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHNob3J0IGludC9pbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzE2L09NWF9TMzIgZm9ybWF0Ci0gKgotICovCi0KLU9NWF9TMTYgYXJtU2F0Um91bmRGbG9hdFRvUzE2IChPTVhfRjY0IFZhbHVlKTsKLU9NWF9TMzIgYXJtU2F0Um91bmRGbG9hdFRvUzMyIChPTVhfRjY0IFZhbHVlKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvVTE2X3JlZi9hcm1TYXRSb3VuZEZsb2F0VG9VMzIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgdW5zaWduZWQgc2hvcnQgaW50L2ludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9VMTYvT01YX1UzMiBmb3JtYXQKLSAqCi0gKi8KLQotT01YX1UxNiBhcm1TYXRSb3VuZEZsb2F0VG9VMTYgKE9NWF9GNjQgVmFsdWUpOwotT01YX1UzMiBhcm1TYXRSb3VuZEZsb2F0VG9VMzIgKE9NWF9GNjQgVmFsdWUpOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1TaWduQ2hlY2sKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENoZWNrcyB0aGUgc2lnbiBvZiBhIHZhcmlhYmxlOgotICogcmV0dXJucyAxIGlmIGl0IGlzIFBvc2l0aXZlCi0gKiByZXR1cm5zIDAgaWYgaXQgaXMgMAotICogcmV0dXJucyAtMSBpZiBpdCBpcyBOZWdhdGl2ZSAKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCSAgICB2YXIgICAgIFZhcmlhYmxlIHRvIGJlIGNoZWNrZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfSU5UIC0tICAgcmV0dXJucyAxIGlmIGl0IGlzIFBvc2l0aXZlCi0gKiAgICAgICAgICAgICAgcmV0dXJucyAwIGlmIGl0IGlzIDAKLSAqICAgICAgICAgICAgICByZXR1cm5zIC0xIGlmIGl0IGlzIE5lZ2F0aXZlIAotICovIAotIAotT01YX0lOVCBhcm1TaWduQ2hlY2sgKE9NWF9TMTYgdmFyKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtQ2xpcAotICoKLSAqIERlc2NyaXB0aW9uOiBDbGlwcyB0aGUgaW5wdXQgYmV0d2VlbiBNQVggYW5kIE1JTiB2YWx1ZQotICogCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBNaW4gICAgIGxvd2VyIGJvdW5kCi0gKiBbaW5dIE1heCAgICAgdXBwZXIgYm91bmQKLSAqIFtpbl0gc3JjICAgICB2YXJpYWJsZSB0byB0aGUgY2xpcHBlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TMzIgLS0gICByZXR1cm5zIGNsaXBwZWQgdmFsdWUKLSAqLyAKLSAKLU9NWF9TMzIgYXJtQ2xpcCAoCi0gICAgICAgIE9NWF9JTlQgbWluLAotICAgICAgICBPTVhfSU5UIG1heCwgCi0gICAgICAgIE9NWF9TMzIgc3JjCi0gICAgICAgICk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybUNsaXBfRjMyCi0gKgotICogRGVzY3JpcHRpb246IENsaXBzIHRoZSBpbnB1dCBiZXR3ZWVuIE1BWCBhbmQgTUlOIHZhbHVlCi0gKiAKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIE1pbiAgICAgbG93ZXIgYm91bmQKLSAqIFtpbl0gTWF4ICAgICB1cHBlciBib3VuZAotICogW2luXSBzcmMgICAgIHZhcmlhYmxlIHRvIHRoZSBjbGlwcGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX0YzMiAtLSAgIHJldHVybnMgY2xpcHBlZCB2YWx1ZQotICovIAotIAotT01YX0YzMiBhcm1DbGlwX0YzMiAoCi0gICAgICAgIE9NWF9GMzIgbWluLAotICAgICAgICBPTVhfRjMyIG1heCwgCi0gICAgICAgIE9NWF9GMzIgc3JjCi0gICAgICAgICk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVNoaWZ0U2F0X0YzMgotICoKLSAqIERlc2NyaXB0aW9uOiBEaXZpZGVzIGEgZmxvYXQgdmFsdWUgYnkgMl5zaGlmdCBhbmQgCi0gKiBzYXR1cmF0ZXMgaXQgZm9yIHVuc2lnbmVkIHZhbHVlIHJhbmdlIGZvciBzYXRCaXRzLgotICogU2Vjb25kIHBhcmFtZXRlciBpcyBsaWtlICJzaGlmdGluZyIgdGhlIGNvcnJlc3BvbmRpbmcgCi0gKiBpbnRlZ2VyIHZhbHVlLiBUYWtlcyBjYXJlIG9mIHJvdW5kaW5nIHdoaWxlIGNsaXBwaW5nIHRoZSBmaW5hbCAKLSAqIHZhbHVlLgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHYgICAgICAgICAgTnVtYmVyIHRvIGJlIG9wZXJhdGVkIHVwb24KLSAqIFtpbl0gc2hpZnQgICAgICBEaXZpZGVzIHRoZSBpbnB1dCAidiIgYnkgIjJec2hpZnQiCi0gKiBbaW5dIHNhdEJpdHMgICAgRmluYWwgcmFuZ2UgaXMgWzAsIDJec2F0Qml0cykKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfUzMyIC0tICAgcmV0dXJucyAic2hpZnRlZCIgc2F0dXJhdGVkIHZhbHVlCi0gKi8gCi0gCi1PTVhfVTMyIGFybVNoaWZ0U2F0X0YzMigKLSAgICAgICAgT01YX0YzMiB2LCAKLSAgICAgICAgT01YX0lOVCBzaGlmdCwgCi0gICAgICAgIE9NWF9JTlQgc2F0Qml0cwotICAgICAgICApOwotCi0vKioKLSAqIEZ1bmN0aW9uczogYXJtU3dhcEVsZW0KLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gc3dhcHMgdHdvIGVsZW1lbnRzIGF0IHRoZSBzcGVjaWZpZWQgcG9pbnRlciBsb2NhdGlvbnMuCi0gKiBUaGUgc2l6ZSBvZiBlYWNoIGVsZW1lbnQgY291bGQgYmUgYW55dGhpbmcgYXMgc3BlY2lmaWVkIGJ5IDxlbGVtU2l6ZT4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhSZXN1bHQgLS0gRXJyb3Igc3RhdHVzIGZyb20gdGhlIGZ1bmN0aW9uCi0gKi8KLU9NWFJlc3VsdCBhcm1Td2FwRWxlbShPTVhfVTggKnBCdWYxLCBPTVhfVTggKnBCdWYyLCBPTVhfSU5UIGVsZW1TaXplKTsKLQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1NZWRpYW5PZjMKLSAqCi0gKiBEZXNjcmlwdGlvbjogRmluZHMgdGhlIG1lZGlhbiBvZiB0aHJlZSBudW1iZXJzCi0gKiAKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gZkVudHJ5ICAgICBGaXJzdCBlbnRyeQotICogW2luXSBzRW50cnkgICAgIHNlY29uZCBlbnRyeQotICogW2luXSB0RW50cnkgICAgIFRoaXJkIGVudHJ5Ci0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1MzMiAtLSAgIHJldHVybnMgdGhlIG1lZGlhbiB2YWx1ZQotICovIAotIAotT01YX1MzMiBhcm1NZWRpYW5PZjMgKAotICAgIE9NWF9TMzIgZkVudHJ5LAotICAgIE9NWF9TMzIgc0VudHJ5LCAKLSAgICBPTVhfUzMyIHRFbnRyeSAKLSAgICApOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1Mb2dTaXplCi0gKgotICogRGVzY3JpcHRpb246IEZpbmRzIHRoZSBzaXplIG9mIGEgcG9zaXRpdmUgdmFsdWUgYW5kIHJldHVybnMgdGhlIHNhbWUKLSAqIAotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSB2YWx1ZSAgICBQb3NpdGl2ZSB2YWx1ZQotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9VOCAtLSAgIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIHBvc2l0aXZlIHZhbHVlCi0gKi8gCi0gCi1PTVhfVTggYXJtTG9nU2l6ZSAoCi0gICAgT01YX1UxNiB2YWx1ZSAKLSAgICApOyAgICAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgICAgIC8qIFNhdHVyYXRpbmcgQXJpdGhtZXRpYyBvcGVyYXRpb25zICovCi0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdEFkZF9TMzIoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBhZGRpdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKLSAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogCi0gKiAgICAKLSAqKi8KLQotT01YX1MzMiBhcm1TYXRBZGRfUzMyKAotICAgICAgICAgICAgICAgIE9NWF9TMzIgVmFsdWUxLAotICAgICAgICAgICAgICAgIE9NWF9TMzIgVmFsdWUyCi0gICAgICAgICAgICAgICAgKTsKLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0QWRkX1M2NCgpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIGFkZGl0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAotICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAKLSAqICAgIAotICoqLwotCi1PTVhfUzY0IGFybVNhdEFkZF9TNjQoCi0gICAgICAgICAgICAgICAgT01YX1M2NCBWYWx1ZTEsCi0gICAgICAgICAgICAgICAgT01YX1M2NCBWYWx1ZTIKLSAgICAgICAgICAgICAgICApOwotCi0vKiogRnVuY3Rpb24gOmFybVNhdFN1Yl9TMzIoKQotICogCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBzdWJzdHJhY3Rpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCi0gKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqIAotICoqLwotCi1PTVhfUzMyIGFybVNhdFN1Yl9TMzIoCi0gICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgVmFsdWUxLAotICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIFZhbHVlMgotICAgICAgICAgICAgICAgICAgICApOwotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRNYWNfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIE11bHRpcGxpY2F0aW9uIG9mIFZhbHVlMSBhbmQgVmFsdWUyIGFuZCBzdWJlc3F1ZW50IHNhdHVyYXRlZAotICogICAgIGFjY3VtdWxhdGlvbiB3aXRoIE1hYwotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKLSAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCi0gKiBbaW5dIE1hYyAgICAgICAgICBBY2N1bXVsYXRvcgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqKi8KLQotT01YX1MzMiBhcm1TYXRNYWNfUzMyKAotICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIE1hYywKLSAgICAgICAgICAgICAgICAgICAgT01YX1MxNiBWYWx1ZTEsCi0gICAgICAgICAgICAgICAgICAgIE9NWF9TMTYgVmFsdWUyCi0gICAgICAgICAgICAgICAgICAgICk7Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdE1hY19TMTZTMzJfUzMyCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIE1BQyBvcGVyYXRpb24gb2YgdGhlIHRocmVlIGlucHV0cyBkZWxheUVsZW0sIGZpbFRhcCAsIG1hYwotICoKLSAqICAgbWFjID0gbWFjICsgU2F0dXJhdGVfaW5fMzJCaXRzKGRlbGF5RWxlbSAqIGZpbFRhcCkKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIGRlbGF5RWxlbSAgICBGaXJzdCAzMiBiaXQgT3BlcmFuZAotICogW2luXSBmaWxUYXAgICAgICAgU2Vjb25kIDE2IGJpdCBPcGVyYW5kCi0gKiBbaW5dIG1hYyAgICAgICAgICBSZXN1bHQgb2YgTUFDIG9wZXJhdGlvbgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICBtYWMgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqICAgIAotICoqLwotIAotT01YX1MzMiBhcm1TYXRNYWNfUzE2UzMyX1MzMigKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgbWFjLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgZGVsYXlFbGVtLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMTYgZmlsVGFwICk7Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdFJvdW5kUmlnaHRTaGlmdF9TMzJfUzE2Ci0gKgotICogRGVzY3JpcHRpb24gOgotICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygcm91bmRlZCByaWdodCBzaGlmdCBvcGVyYXRpb24gb2YgaW5wdXQgYnkgdGhlIHNjYWxlZmFjdG9yCi0gKgotICogICBvdXRwdXQgPSBTYXR1cmF0ZV9pbl8xNkJpdHMoICggUmlnaHRTaGlmdCggKFJvdW5kKGlucHV0KSAsIHNjYWxlRmFjdG9yICkgKQotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gaW5wdXQgICAgICAgVGhlIGlucHV0IHRvIGJlIG9wZXJhdGVkIG9uCi0gKiBbaW5dIHNjYWxlRmFjdG9yIFRoZSBzaGlmdCBudW1iZXIKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqICAgIAotICoqLwotCi0KLU9NWF9TMTYgYXJtU2F0Um91bmRSaWdodFNoaWZ0X1MzMl9TMTYoCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIGlucHV0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTlQgc2NhbGVGYWN0b3IpOwotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZExlZnRTaGlmdF9TMzIoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGluZyBsZWZ0LXNoaWZ0IG9wZXJhdGlvbiBvbiBpbnB1dAotICogICAgIE9yIHJvdW5kZWQgUmlnaHQgc2hpZnQgaWYgdGhlIGlucHV0IFNoaWZ0IGlzIG5lZ2F0aXZlLgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUgICAgICAgIE9wZXJhbmQKLSAqIFtpbl0gc2hpZnQgICAgICAgIE9wZXJhbmQgZm9yIHNoaWZ0IG9wZXJhdGlvbgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqICAgIAotICoqLwotIAotT01YX1MzMiBhcm1TYXRSb3VuZExlZnRTaGlmdF9TMzIoCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOVCBzaGlmdAotICAgICAgICAgICAgICAgICAgICAgICAgKTsKLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRMZWZ0U2hpZnRfUzY0KCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRpbmcgbGVmdC1zaGlmdCBvcGVyYXRpb24gb24gaW5wdXQKLSAqICAgICBPciByb3VuZGVkIFJpZ2h0IHNoaWZ0IGlmIHRoZSBpbnB1dCBTaGlmdCBpcyBuZWdhdGl2ZS4KLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlICAgICAgICBPcGVyYW5kCi0gKiBbaW5dIHNoaWZ0ICAgICAgICBPcGVyYW5kIGZvciBzaGlmdCBvcGVyYXRpb24KLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLSAKLU9NWF9TNjQgYXJtU2F0Um91bmRMZWZ0U2hpZnRfUzY0KAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX1M2NCBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTlQgc2hpZnQKLSAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdE11bFMxNlMzMl9TMzIoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYSBTMTYgZGF0YSB0eXBlIG11bHRpcGxpZWQgd2l0aCBhbiBTMzIgZGF0YSB0eXBlCi0gKiAgICAgaW4gYSBTMzIgY29udGFpbmVyCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBpbnB1dDEgICAgICAgT3BlcmFuZCAxCi0gKiBbaW5dIGlucHV0MiAgICAgICBPcGVyYW5kIDIKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLQotCi1PTVhfUzMyIGFybVNhdE11bFMxNlMzMl9TMzIoCi0gICAgICAgICAgICAgICAgICAgIE9NWF9TMTYgaW5wdXQxLAotICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIGlucHV0Mik7Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdE11bFMzMlMzMl9TMzIoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYSBTMzIgZGF0YSB0eXBlIG11bHRpcGxpZWQgd2l0aCBhbiBTMzIgZGF0YSB0eXBlCi0gKiAgICAgaW4gYSBTMzIgY29udGFpbmVyCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBpbnB1dDEgICAgICAgT3BlcmFuZCAxCi0gKiBbaW5dIGlucHV0MiAgICAgICBPcGVyYW5kIDIKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLQotT01YX1MzMiBhcm1TYXRNdWxTMzJTMzJfUzMyKAotICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIGlucHV0MSwKLSAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBpbnB1dDIpOwotCi0KLS8qKgotICogRnVuY3Rpb24gOmFybUludERpdkF3YXlGcm9tWmVybygpCi0gKgotICogRGVzY3JpcHRpb24gOiBJbnRlZ2VyIGRpdmlzaW9uIHdpdGggcm91bmRpbmcgdG8gdGhlIG5lYXJlc3QgaW50ZWdlci4gCi0gKiAgICAgICAgICAgICAgIEhhbGYtaW50ZWdlciB2YWx1ZXMgYXJlIHJvdW5kZWQgYXdheSBmcm9tIHplcm8KLSAqICAgICAgICAgICAgICAgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQuIEZvciBleGFtcGxlIDMvLzIgaXMgcm91bmRlZCAKLSAqICAgICAgICAgICAgICAgdG8gMiwgYW5kIC0zLy8yIGlzIHJvdW5kZWQgdG8gLTIuCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBOdW0gICAgICAgIE9wZXJhbmQgMQotICogW2luXSBEZW5vICAgICAgIE9wZXJhbmQgMgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24gaW5wdXQxLy9pbnB1dDIKLSAqICAgIAotICoqLwotCi1PTVhfUzMyIGFybUludERpdkF3YXlGcm9tWmVybyAoT01YX1MzMiBOdW0sIE9NWF9TMzIgRGVubyk7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIERlYnVnZ2luZyBtYWNyb3MKLSAqCi0gKi8KLQotCi0vKgotICogRGVmaW5pdGlvbiBvZiBvdXRwdXQgc3RyZWFtIC0gY2hhbmdlIHRvIHN0ZGVyciBpZiBuZWNlc3NhcnkKLSAqLwotI2RlZmluZSBERUJVR19TVFJFQU0gc3Rkb3V0Ci0KLS8qCi0gKiBEZWJ1ZyBwcmludGYgbWFjcm9zLCBvbmUgZm9yIGVhY2ggYXJndW1lbnQgY291bnQuCi0gKiBBZGQgbW9yZSBpZiBuZWVkZWQuCi0gKi8KLSNpZmRlZiBERUJVR19PTgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNkZWZpbmUgREVCVUdfUFJJTlRGXzAoYSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhKQotI2RlZmluZSBERUJVR19QUklOVEZfMShhLCBiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIpCi0jZGVmaW5lIERFQlVHX1BSSU5URl8yKGEsIGIsIGMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYykKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzMoYSwgYiwgYywgZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkKQotI2RlZmluZSBERUJVR19QUklOVEZfNChhLCBiLCBjLCBkLCBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUpCi0jZGVmaW5lIERFQlVHX1BSSU5URl81KGEsIGIsIGMsIGQsIGUsIGYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZikKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzYoYSwgYiwgYywgZCwgZSwgZiwgZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnKQotI2RlZmluZSBERUJVR19QUklOVEZfNyhhLCBiLCBjLCBkLCBlLCBmLCBnLCBoKSAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgpCi0jZGVmaW5lIERFQlVHX1BSSU5URl84KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGkpICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSkKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzkoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaikgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqKQotI2RlZmluZSBERUJVR19QUklOVEZfMTAoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaykgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGspCi0jZGVmaW5lIERFQlVHX1BSSU5URl8xMShhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsKSAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCkKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzEyKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0pICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtKQotI2RlZmluZSBERUJVR19QUklOVEZfMTMoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbikgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4pCi0jZGVmaW5lIERFQlVHX1BSSU5URl8xNChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuLCBvKSAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbiwgbykKLSNlbHNlIC8qIERFQlVHX09OICovCi0jZGVmaW5lIERFQlVHX1BSSU5URl8wKGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfMShhLCBiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzIoYSwgYiwgYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl8zKGEsIGIsIGMsIGQpICAgICAgICAgICAgICAgICAgICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfNChhLCBiLCBjLCBkLCBlKSAgICAgICAgICAgICAgICAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzUoYSwgYiwgYywgZCwgZSwgZikgICAgICAgICAgICAgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl82KGEsIGIsIGMsIGQsIGUsIGYsIGcpICAgICAgICAgICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfNyhhLCBiLCBjLCBkLCBlLCBmLCBnLCBoKSAgICAgICAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzgoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSkgICAgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl85KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGopICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfMTAoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaykgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl8xMShhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsKSAgICAgICAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzEyKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0pICAgICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfMTMoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbikgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzE0KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4sIG8pICAgCi0jZW5kaWYgLyogREVCVUdfT04gKi8KLQotCi0vKgotICogRG9tYWluIGFuZCBzdWIgZG9tYWluIGRlZmluaXRpb25zCi0gKgotICogSW4gb3JkZXIgdG8gdHVybiBvbiBkZWJ1ZyBmb3IgYW4gZW50aXJlIGRvbWFpbiBvciBzdWItZG9tYWluCi0gKiBhdCBjb21waWxlIHRpbWUsIG9uZSBvZiB0aGUgREVCVUdfRE9NQUlOXyogYmVsb3cgbWF5IGJlIGRlZmluZWQsCi0gKiB3aGljaCB3aWxsIGFjdGl2YXRlIGRlYnVnIGluIGFsbCBvZiB0aGUgZGVmaW5lcyBpdCBjb250YWlucy4KLSAqLwotCi0jaWZkZWYgREVCVUdfRE9NQUlOX0FDCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERUNIQU5QQUlSRUxUX01QRUc0Ci0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERUNIQU5QQUlSRUxUCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERURBVFNUUkVMVAotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVGSUxMRUxUCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERUlTU1RFUkVPX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVNU1BOU19TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFTVNTVEVSRU9fUzMyX0kKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFUFJHQ0ZHRUxUCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERVROU19TMzJfSQotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUlOVEVSTEVBVkVTUEVDVFJVTV9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfRU5DT0RFVE5TX1MzMl9JCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0xPTkdURVJNUFJFRElDVF9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfTE9OR1RFUk1SRUNPTlNUUlVDVF9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfTURDVEZXRF9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfTURDVElOVl9TMzJfUzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDQUFDX05PSVNFTEVTU0RFQ09ERQotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19RVUFOVElOVl9TMzJfSQotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19VTlBBQ0tBRElGSEVBREVSCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX1VOUEFDS0FEVFNGUkFNRUhFQURFUgotI2RlZmluZSBERUJVR19PTVhBQ01QM19IVUZGTUFOREVDT0RFU0ZCTUJQX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ01QM19IVUZGTUFOREVDT0RFU0ZCX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ01QM19IVUZGTUFOREVDT0RFX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ01QM19NRENUSU5WX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ01QM19SRVFVQU5USVpFU0ZCX1MzMl9JCi0jZGVmaW5lIERFQlVHX09NWEFDTVAzX1JFUVVBTlRJWkVfUzMyX0kKLSNkZWZpbmUgREVCVUdfT01YQUNNUDNfU1lOVEhQUU1GX1MzMl9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNNUDNfVU5QQUNLRlJBTUVIRUFERVIKLSNkZWZpbmUgREVCVUdfT01YQUNNUDNfVU5QQUNLU0NBTEVGQUNUT1JTX1M4Ci0jZGVmaW5lIERFQlVHX09NWEFDTVAzX1VOUEFDS1NJREVJTkZPCi0jZW5kaWYgLyogREVCVUdfRE9NQUlOX0FDICovCi0KLQotI2lmZGVmIERFQlVHX0RPTUFJTl9WQwotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0FWRVJBR0VfMTZYCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfQVZFUkFHRV80WAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0FWRVJBR0VfOFgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9ERUJMT0NLQ0hST01BX1U4X0MxSVIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9ERUJMT0NLTFVNQV9VOF9DMUlSCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfREVDT0RFQ0hST01BRENDT0VGRlNUT1BBSVJDQVZMQ19VOAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0RFQ09ERUNPRUZGU1RPUEFJUkNBVkxDX1U4Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfREVRVUFOVFRSQU5TRk9STUFDRlJPTVBBSVJfVThfUzE2X0MxX0RMWAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0VYUEFOREZSQU1FCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfRklMVEVSREVCTE9DS0lOR0NIUk9NQV9IT1JFREdFX1U4X0MxSVIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9GSUxURVJERUJMT0NLSU5HQ0hST01BX1ZFUkVER0VfVThfQzFJUgotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0ZJTFRFUkRFQkxPQ0tJTkdMVU1BX0hPUkVER0VfVThfQzFJUgotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0ZJTFRFUkRFQkxPQ0tJTkdMVU1BX1ZFUkVER0VfVThfQzFJUgotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1BSRURJQ1RJTlRSQUNIUk9NQThYOF9VOF9DMVIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9QUkVESUNUSU5UUkFfMTZYMTZfVThfQzFSCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfUFJFRElDVElOVFJBXzRYNF9VOF9DMVIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURRVUFSXzE2WAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRFFVQVJfNFgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURRVUFSXzhYCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEXzE2WAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRF80WAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRF84WAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBVERfNFg0Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfVFJBTlNGT1JNREVRVUFOVENIUk9NQURDRlJPTVBBSVJfVThfUzE2X0MxCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfVFJBTlNGT1JNREVRVUFOVExVTUFEQ0ZST01QQUlSX1U4X1MxNl9DMQotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1RSQU5TRk9STVFVQU5UX0NIUk9NQURDCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfVFJBTlNGT1JNUVVBTlRfTFVNQURDCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9CTE9DS01BVENIX0hBTEZfMTZYMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0JMT0NLTUFUQ0hfSEFMRl84WDgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0JMT0NLTUFUQ0hfSU5URUdFUl8xNlgxNgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfQkxPQ0tNQVRDSF9JTlRFR0VSXzhYOAotI2RlZmluZSBERUJVR19PTVhWQ000UDJfQ09NUFVURVRFWFRVUkVFUlJPUkJMT0NLX1NBRF9VOF9TMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0NPTVBVVEVURVhUVVJFRVJST1JCTE9DS19VOF9TMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RDVDhYOEJMS0RMWAotI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFQkxPQ0tDT0VGX0lOVEVSX1MxNgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFUEFETVZfUFZPUAotI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFVkxDWklHWkFHX0lOVEVSX1MxNgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFVkxDWklHWkFHX0lOVFJBQUNWTENfUzE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9ERUNPREVWTENaSUdaQUdfSU5UUkFEQ1ZMQ19TMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0VOQ09ERU1WX1U4X1MxNgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfRU5DT0RFVkxDWklHWkFHX0lOVEVSX1MxNgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfRU5DT0RFVkxDWklHWkFHX0lOVFJBQUNWTENfUzE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9FTkNPREVWTENaSUdaQUdfSU5UUkFEQ1ZMQ19TMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0ZJTkRNVlBSRUQKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0lEQ1Q4WDhCTEtETFgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0xJTUlUTVZUT1JFQ1QKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX01PVElPTkVTVElNQVRJT05NQgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfUEFETUJHUkFZX1U4Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9QQURNQkhPUklaT05UQUxfVTgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1BBRE1CVkVSVElDQUxfVTgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1BBRE1WCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9RVUFOVElOVEVSX1MxNl9JCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9RVUFOVElOVFJBX1MxNl9JCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9RVUFOVElOVklOVEVSX1MxNl9JCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9RVUFOVElOVklOVFJBX1MxNl9JCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9UUkFOU1JFQ0JMT0NLQ0VPRl9JTlRFUgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfVFJBTlNSRUNCTE9DS0NFT0ZfSU5UUkEKLSNlbmRpZiAvKiBERUJVR19ET01BSU5fVkMgKi8KLQotCi0jaWZkZWYgREVCVUdfRE9NQUlOX0lDCi0vKiBUbyBiZSBmaWxsZWQgaW4gKi8KLSNlbmRpZiAvKiBERUJVR19ET01BSU5fSUMgKi8KLQotCi0jaWZkZWYgREVCVUdfRE9NQUlOX1NQCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRE9UUFJPRF9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9CTE9DS0VYUF9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9CTE9DS0VYUF9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9DT1BZX1MxNgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0RPVFBST0RfUzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDU1BfRE9UUFJPRF9TMTZfU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZURldEX0NUT0NfU0MxNl9TRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRGV0RfQ1RPQ19TQzMyX1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEZXRF9SVE9DQ1NfUzE2UzMyX1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEZXRF9SVE9DQ1NfUzMyX1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEdFVEJVRlNJWkVfQ19TQzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUR0VUQlVGU0laRV9DX1NDMzIKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRHRVRCVUZTSVpFX1JfUzE2X1MzMgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEdFVEJVRlNJWkVfUl9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTklUX0NfU0MxNgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOSVRfQ19TQzMyCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5JVF9SX1MxNl9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTklUX1JfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5WX0NDU1RPUl9TMzJTMTZfU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5WX0NDU1RPUl9TMzJfU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5WX0NUT0NfU0MxNl9TRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTlZfQ1RPQ19TQzMyX1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJTFRFUk1FRElBTl9TMzJfSQotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJTFRFUk1FRElBTl9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJPTkVfRElSRUNUX1MxNl9JU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRklST05FX0RJUkVDVF9TMTZfSQotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUk9ORV9ESVJFQ1RfUzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDU1BfRklST05FX0RJUkVDVF9TMTZfU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRklSX0RJUkVDVF9TMTZfSVNGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUl9ESVJFQ1RfUzE2X0kKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJfRElSRUNUX1MxNgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUl9ESVJFQ1RfUzE2X1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUk9ORV9CSVFVQURESVJFQ1RfUzE2X0kKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJPTkVfQklRVUFERElSRUNUX1MxNgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUk9ORV9ESVJFQ1RfUzE2X0kKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJPTkVfRElSRUNUX1MxNgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUl9CSVFVQURESVJFQ1RfUzE2X0kKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJfQklRVUFERElSRUNUX1MxNgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUl9ESVJFQ1RfUzE2X0kKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJfRElSRUNUX1MxNgotI2VuZGlmIC8qIERFQlVHX0RPTUFJTl9TUCAqLwotCi0KLSNpZmRlZiBERUJVR19ET01BSU5fSVAKLSNkZWZpbmUgREVCVUdfT01YSVBCTV9BRERDX1U4X0MxUl9TRlMKLSNkZWZpbmUgREVCVUdfT01YSVBCTV9DT1BZX1U4X0MxUgotI2RlZmluZSBERUJVR19PTVhJUEJNX0NPUFlfVThfQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQk1fTUlSUk9SX1U4X0MxUgotI2RlZmluZSBERUJVR19PTVhJUEJNX01VTENfVThfQzFSX1NGUwotI2RlZmluZSBERUJVR19PTVhJUENTX0NPTE9SVFdJU1RRMTRfVThfQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCNTY1VE9ZQ0JDUjQyMExTX01DVV9VMTZfUzE2X0MzUDNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCNTY1VE9ZQ0JDUjQyMkxTX01DVV9VMTZfUzE2X0MzUDNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCNTY1VE9ZQ0JDUjQ0NExTX01DVV9VMTZfUzE2X0MzUDNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCVE9ZQ0JDUjQyMExTX01DVV9VOF9TMTZfQzNQM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19SR0JUT1lDQkNSNDIyTFNfTUNVX1U4X1MxNl9DM1AzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1JHQlRPWUNCQ1I0NDRMU19NQ1VfVThfUzE2X0MzUDNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjBSU1pST1RfVThfUDNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjBUT1JHQjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjBUT1JHQjU2NV9VOF9VMTZfUDNDM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMFRPUkdCTFNfTUNVX1MxNl9VOF9QM0MzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyUlNaQ1NDUk9UUkdCX1U4X0MyUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyUlNaUk9UX1U4X1AzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9SR0I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9SR0I1NjVfVThfVTE2X0MyQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1JHQkxTX01DVV9TMTZfVThfUDNDM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPUkdCX1U4X0MyQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1lDQkNSNDIwUk9UQVRFX1U4X0MyUDNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1lDQkNSNDIwUk9UQVRFX1U4X1AzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDQ0VE9SR0I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDQ0VE9SR0JMU19NQ1VfUzE2X1U4X1AzQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1JUT1JHQjU2NV9VOF9VMTZfQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1JUT1JHQjU2NV9VOF9VMTZfUDNDM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUlRPUkdCX1U4X0MzUgotI2RlZmluZSBERUJVR19PTVhJUFBQX0dFVENFTlRSQUxNT01FTlRfUzY0Ci0jZGVmaW5lIERFQlVHX09NWElQUFBfR0VUU1BBVElBTE1PTUVOVF9TNjQKLSNkZWZpbmUgREVCVUdfT01YSVBQUF9NT01FTlRHRVRTVEFURVNJWkVfUzY0Ci0jZGVmaW5lIERFQlVHX09NWElQUFBfTU9NRU5USU5JVF9TNjQKLSNkZWZpbmUgREVCVUdfT01YSVBQUF9NT01FTlRTNjRTX1U4X0MxUgotI2RlZmluZSBERUJVR19PTVhJUFBQX01PTUVOVFM2NFNfVThfQzNSCi0jZW5kaWYgLyogREVCVUdfRE9NQUlOX0lQICovCi0KLQotI2VuZGlmIC8qIF9hcm1Db21tb25fSF8gKi8KLQotLypFbmQgb2YgRmlsZSovCi0KLQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9CaXREZWNfcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX0JpdERlY19zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MzQ0ZTMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX0JpdERlY19zLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ODQgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybUNPTU1fQml0RGVjX3MuaAotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDEyMjkwCi07Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8gCi07Ly8gT3Blbk1BWCBvcHRpbWl6ZWQgYml0c3RyZWFtIGRlY29kZSBtb2R1bGUKLTsvLwotOy8vIFlvdSBtdXN0IGluY2x1ZGUgYXJtQ09NTV9zLmggYmVmb3JlIGluY2x1ZGluZyB0aGlzIGZpbGUKLTsvLwotOy8vIFRoaXMgbW9kdWxlIHByb3ZpZGVzIG1hY3JvcyB0byBwZXJmb3JtIGFzc2VtYmx5IG9wdGltaXplZCBmaXhlZCBhbmQKLTsvLyB2YXJpYWJsZSBsZW5ndGggZGVjb2RpbmcgZnJvbSBhIHJlYWQtb25seSBiaXRzdHJlYW0uIFRoZSB2YXJpYWJsZQotOy8vIGxlbmd0aCBkZWNvZGUgbW9kdWxlcyB0YWtlIGFzIGlucHV0IGEgcG9pbnRlciB0byBhIHRhYmxlIG9mIDE2LWJpdAotOy8vIGVudHJpZXMgb2YgdGhlIGZvbGxvd2luZyBmb3JtYXQuCi07Ly8KLTsvLyBWTEQgVGFibGUgRW50cnkgZm9ybWF0Ci07Ly8KLTsvLyAgICAgICAgMTUgMTQgMTMgMTIgMTEgMTAgMDkgMDggMDcgMDYgMDUgMDQgMDMgMDIgMDEgMDAKLTsvLyAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotOy8vICAgICAgIHwgIExlbiAgIHwgICAgICAgICAgICAgICBTeW1ib2wgICAgICAgICAgICAgIHwgMSB8Ci07Ly8gICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLTsvLyAgICAgICB8ICAgICAgICAgICAgICAgIE9mZnNldCAgICAgICAgICAgICAgICAgICAgICB8IDAgfAotOy8vICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi07Ly8KLTsvLyBJZiB0aGUgdGFibGUgZW50cnkgaXMgYSBsZWFmIGVudHJ5IHRoZW4gYml0IDAgc2V0OgotOy8vICAgIExlbiAgICA9IE51bWJlciBvZiBiaXRzIG92ZXJyZWFkICgwIHRvIDcpCi07Ly8gICAgU3ltYm9sID0gU3ltYm9sIHBheWxvYWQgKHVuc2lnbmVkIDEyIGJpdHMpCi07Ly8KLTsvLyBJZiB0aGUgdGFibGUgZW50cnkgaXMgYW4gaW50ZXJuYWwgbm9kZSB0aGVuIGJpdCAwIGlzIGNsZWFyOgotOy8vICAgIE9mZnNldCA9IE51bWJlciBvZiAoMTYtYml0KSBoYWxmIHdvcmRzIGZyb20gdGhlIHRhYmxlCi07Ly8gICAgICAgICAgICAgc3RhcnQgdG8gdGhlIG5leHQgdGFibGUgbm9kZQotOy8vCi07Ly8gVGhlIHRhYmxlIGlzIGFjY2Vzc2VkIGJ5IHN1Y2Nlc3NpdmUgbG9va3VwIHVwIG9uIHRoZQotOy8vIG5leHQgU3RlcCBiaXRzIG9mIHRoZSBpbnB1dCBiaXRzdHJlYW0gdW50aWwgYSBsZWFmIG5vZGUKLTsvLyBpcyBvYnRhaW5lZC4gVGhlIFN0ZXAgc2l6ZXMgYXJlIHN1cHBsaWVkIHRvIHRoZSBWTEQgbWFjcm8uCi07Ly8KLTsvLyBVU0FHRToKLTsvLwotOy8vIFRvIHVzZSBhbnkgb2YgdGhlIG1hY3JvcyBpbiB0aGlzIHBhY2thZ2UsIGZpcnN0IGNhbGw6Ci07Ly8KLTsvLyAgICBNX0JEX0lOSVQgcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBCaXRTdHJlYW0sIFJCaXRCdWZmZXIsIFJCaXRDb3VudCwgVG1wCi07Ly8KLTsvLyBUaGlzIGNhY2hlcyB0aGUgY3VycmVudCBiaXRzdHJlYW0gcG9zaXRpb24gYW5kIG5leHQgYXZhaWxhYmxlCi07Ly8gYml0cyBpbiByZWdpc3RlcnMgcEJpdFN0cmVhbSwgUkJpdEJ1ZmZlciwgUkJpdENvdW50LiBUaGVzZSByZWdpc3RlcnMKLTsvLyBhcmUgcmVzZXJ2ZWQgZm9yIHVzZSBieSB0aGUgYml0c3RyZWFtIGRlY29kZSBwYWNrYWdlIHVudGlsIHlvdQotOy8vIGNhbGwgTV9CRF9GSU5JLgotOy8vCi07Ly8gTmV4dCBjYWxsIHRoZSBmb2xsb3dpbmcgbWFjcm8ocykgYXMgbWFueSB0aW1lcyBhcyB5b3UgbmVlZDoKLTsvLwotOy8vICAgIE1fQkRfTE9PSzggICAgICAgLSBMb29rIGFoZWFkIGNvbnN0YW50IDE8PU48PTggIGJpdHMgaW50byB0aGUgYml0c3RyZWFtCi07Ly8gICAgTV9CRF9MT09LMTYgICAgICAtIExvb2sgYWhlYWQgY29uc3RhbnQgMTw9Tjw9MTYgYml0cyBpbnRvIHRoZSBiaXRzdHJlYW0KLTsvLyAgICBNX0JEX1JFQUQ4ICAgICAgIC0gUmVhZCBjb25zdGFudCAxPD1OPD04ICBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbQotOy8vICAgIE1fQkRfUkVBRDE2ICAgICAgLSBSZWFkIGNvbnN0YW50IDE8PU48PTE2IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtCi07Ly8gICAgTV9CRF9WUkVBRDggICAgICAtIFJlYWQgdmFyaWFibGUgMTw9Tjw9OCAgYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KLTsvLyAgICBNX0JEX1ZSRUFEMTYgICAgIC0gUmVhZCB2YXJpYWJsZSAxPD1OPD0xNiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbQotOy8vICAgIE1fQkRfVkxEICAgICAgICAgLSBQZXJmb3JtIHZhcmlhYmxlIGxlbmd0aCBkZWNvZGUgdXNpbmcgbG9va3VwIHRhYmxlCi07Ly8KLTsvLyBGaW5hbGx5IGNhbGwgdGhlIG1hY3JvOgotOy8vCi07Ly8gICAgTV9CRF9GSU5JIHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0Ci07Ly8KLTsvLyBUaGlzIHdyaXRlcyB0aGUgYml0c3RyZWFtIHN0YXRlIGJhY2sgdG8gbWVtb3J5LgotOy8vCi07Ly8gVGhlIHRocmVlIGJpdHN0cmVhbSBjYWNoZSByZWdpc3RlciBuYW1lcyBhcmUgYXNzaWduZWQgdG8gdGhlIGZvbGxvd2luZyBnbG9iYWwKLTsvLyB2YXJpYWJsZXM6Ci07Ly8KLQotICAgICAgICBHQkxTICAgIHBCaXRTdHJlYW0gIDsvLyBSZWdpc3RlciBuYW1lIGZvciBwQml0U3RyZWFtCi0gICAgICAgIEdCTFMgICAgQml0QnVmZmVyICAgOy8vIFJlZ2lzdGVyIG5hbWUgZm9yIEJpdEJ1ZmZlcgotICAgICAgICBHQkxTICAgIEJpdENvdW50ICAgIDsvLyBSZWdpc3RlciBuYW1lIGZvciBCaXRDb3VudAotICAgCi07Ly8gICAgICAgIAotOy8vIFRoZXNlIHJlZ2lzdGVyIHZhcmlhYmxlcyBtdXN0IGhhdmUgYSBjZXJ0YWluIGRlZmluZWQgc3RhdGUgb24gZW50cnkgdG8gZXZlcnkgYml0c3RyZWFtCi07Ly8gbWFjcm8gKGV4Y2VwdCBNX0JEX0lOSVQpIGFuZCBvbiBleGl0IGZyb20gZXZlcnkgYml0c3RyZWFtIG1hY3JvIChleGNlcHQgTV9CRF9GSU5JKS4KLTsvLyBUaGUgc3RhdGUgbWF5IGRlcGVuZCBvbiBpbXBsZW1lbnRhdGlvbi4KLTsvLwotOy8vIEZvciB0aGUgZGVmYXVsdCAoQVJNMTEpIGltcGxlbWVudGF0aW9uIHRoZSBmb2xsb3dpbmcgaG9sZDoKLTsvLyAgICBwQml0U3RyZWFtIC0gcG9pbnRzIHRvIHRoZSBmaXJzdCBieXRlIG5vdCBoZWxkIGluIHRoZSBCaXRCdWZmZXIKLTsvLyAgICBCaXRCdWZmZXIgIC0gaXMgYSBjYWNoZSBvZiAoNCBieXRlcykgMzIgYml0cywgYml0IDMxIHRoZSBmaXJzdCBiaXQKLTsvLyAgICBCaXRDb3VudCAgIC0gaXMgb2Zmc2V0IChmcm9tIHRoZSB0b3AgYml0KSB0byB0aGUgbmV4dCB1bnVzZWQgYml0c3RyZWFtIGJpdAotOy8vICAgIDA8PUJpdENvdW50PD0xNSAoc28gQml0QnVmZmVyIGhvbGRzIGF0IGxlYXN0IDE3IHVudXNlZCBiaXRzKQotOy8vCi07Ly8KLQotICAgICAgICA7Ly8gQml0c3RyZWFtIERlY29kZSBpbml0aWFsaXNlCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5pdGlhbGlzZXMgdGhlIGJpdHN0cmVhbSBkZWNvZGUgZ2xvYmFsIHJlZ2lzdGVycyBmcm9tCi0gICAgICAgIDsvLyBiaXRzdHJlYW0gcG9pbnRlcnMuIFRoaXMgbWFjcm8gaXMgc3BsaXQgaW50byAzIHBhcnRzIHRvIGVuYWJsZQotICAgICAgICA7Ly8gc2NoZWR1bGluZy4KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJHBwQml0U3RyZWFtICAgIC0gcG9pbnRlciB0byBwb2ludGVyIHRvIHRoZSBuZXh0IGJpdHN0cmVhbSBieXRlCi0gICAgICAgIDsvLyAkcEJpdE9mZnNldCAgICAgLSBwb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgYml0cyB1c2VkIGluIHRoZSBjdXJyZW50IGJ5dGUgKDAuLjcpCi0gICAgICAgIDsvLyAkUkJpdFN0cmVhbSAgICAgLSByZWdpc3RlciB0byB1c2UgZm9yIHBCaXRTdHJlYW0gKGNhbiBiZSAkcHBCaXRTdHJlYW0pCi0gICAgICAgIDsvLyAkUkJpdEJ1ZmZlciAgICAgLSByZWdpc3RlciB0byB1c2UgZm9yIEJpdEJ1ZmZlcgotICAgICAgICA7Ly8gJFJCaXRDb3VudCAgICAgIC0gcmVnaXN0ZXIgdG8gdXNlIGZvciBCaXRDb3VudCAgIChjYW4gYmUgJHBCaXRPZmZzZXQpCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkVDEsJFQyLCRUMyAgICAgLSByZWdpc3RlcnMgdGhhdCBtdXN0IGJlIHByZXNlcnZlZCBiZXR3ZWVuIGNhbGxzIHRvCi0gICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBNX0JEX0lOSVQxIGFuZCBNX0JEX0lOSVQyCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfSU5JVDAgICRwcEJpdFN0cmVhbSwgJHBCaXRPZmZzZXQsICRSQml0U3RyZWFtLCAkUkJpdEJ1ZmZlciwgJFJCaXRDb3VudAotCi1wQml0U3RyZWFtICBTRVRTICIkUkJpdFN0cmVhbSIKLUJpdEJ1ZmZlciAgIFNFVFMgIiRSQml0QnVmZmVyIgotQml0Q291bnQgICAgU0VUUyAiJFJCaXRDb3VudCIgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIGxvYWQgaW5wdXRzCi0gICAgICAgIExEUiAgICAgJHBCaXRTdHJlYW0sIFskcHBCaXRTdHJlYW1dCi0gICAgICAgIExEUiAgICAgJEJpdENvdW50LCBbJHBCaXRPZmZzZXRdCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfSU5JVDEgICRUMSwgJFQyLCAkVDMKLSAgICAgICAgTERSQiAgICAkVDIsIFskcEJpdFN0cmVhbSwgIzJdCi0gICAgICAgIExEUkIgICAgJFQxLCBbJHBCaXRTdHJlYW0sICMxXQotICAgICAgICBMRFJCICAgICRCaXRCdWZmZXIsICBbJHBCaXRTdHJlYW1dLCAjMwotICAgICAgICBBREQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX0lOSVQyICAkVDEsICRUMiwgJFQzCi0gICAgICAgIE9SUiAgICAgJFQyLCAkVDIsICRUMSwgTFNMICM4Ci0gICAgICAgIE9SUiAgICAgJEJpdEJ1ZmZlciwgJFQyLCAkQml0QnVmZmVyLCBMU0wgIzE2Ci0gICAgICAgIE1FTkQgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIExvb2sgYWhlYWQgZml4ZWQgMTw9Tjw9OCBiaXRzIHdpdGhvdXQgY29uc3VtaW5nIGFueSBiaXRzCi0gICAgICAgIDsvLyBUaGUgbmV4dCBiaXRzIHdpbGwgYmUgcGxhY2VkIGF0IGJpdCAzMS4uMjQgb2YgZGVzdGluYXRpb24gcmVnaXN0ZXIKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMgdG8gbG9vawotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gdGhlIG5leHQgTiBiaXRzIG9mIHRoZSBiaXRzdHJlYW0KLSAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9MT09LOCAgJFN5bWJvbCwgJE4KLSAgICAgICAgQVNTRVJUICAoJE4+PTEpOkxBTkQ6KCROPD04KQotICAgICAgICBNT1YgICAgICRTeW1ib2wsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBMb29rIGFoZWFkIGZpeGVkIDE8PU48PTE2IGJpdHMgd2l0aG91dCBjb25zdW1pbmcgYW55IGJpdHMKLSAgICAgICAgOy8vIFRoZSBuZXh0IGJpdHMgd2lsbCBiZSBwbGFjZWQgYXQgYml0IDMxLi4xNiBvZiBkZXN0aW5hdGlvbiByZWdpc3RlcgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cyB0byBsb29rCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vIAotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbmV4dCBOIGJpdHMgb2YgdGhlIGJpdHN0cmVhbQotICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLwotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX0xPT0sxNiAgJFN5bWJvbCwgJE4sICRUMQotICAgICAgICBBU1NFUlQgICgkTiA+PSAxKTpMQU5EOigkTiA8PSAxNikKLSAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50Ci0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gU2tpcHMgZml4ZWQgMTw9Tjw9OCBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSwgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cwotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLwotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX1NLSVA4ICROLCAkVDEKLSAgICAgICAgQVNTRVJUICAoJE4+PTEpOkxBTkQ6KCROPD04KSAgICAgICAgCi0gICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICMoOC0kTikKLSAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgCi0gICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4Ci0gICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gUmVhZCBmaXhlZCAxPD1OPD04IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtLCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzIHRvIHJlYWQKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBuZXh0IE4gYml0cyBvZiB0aGUgYml0c3RyZWFtCi0gICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfUkVBRDggJFN5bWJvbCwgJE4sICRUMQotICAgICAgICBBU1NFUlQgICgkTj49MSk6TEFORDooJE48PTgpICAgICAgICAgICAgICAgIAotICAgICAgICBNT1ZTICAgICRTeW1ib2wsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQgICAgICAgIAotICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjKDgtJE4pCi0gICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgIAotICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAotICAgICAgICBNT1YgICAgICRTeW1ib2wsICRTeW1ib2wsIExTUiAjKDMyLSROKQotICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4Ci0gICAgICAgIE1FTkQKLQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFJlYWQgZml4ZWQgMTw9Tjw9MTYgYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0sIGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMgdG8gcmVhZAotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gdGhlIG5leHQgTiBiaXRzIG9mIHRoZSBiaXRzdHJlYW0KLSAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRUMiAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9SRUFEMTYgJFN5bWJvbCwgJE4sICRUMSwgJFQyCi0gICAgICAgIEFTU0VSVCAgKCROPj0xKTpMQU5EOigkTjw9MTYpCi0gICAgICAgIEFTU0VSVCAgJFN5bWJvbDw+JFQxCi0gICAgICAgIElGICgkTjw9OCkKLSAgICAgICAgICAgIE1fQkRfUkVBRDggICRTeW1ib2wsICROLCAkVDEKLSAgICAgICAgRUxTRSAgICAgICAgCi0gICAgICAgICAgICA7Ly8gTj44IHNvIHdlIHdpbGwgYmUgYWJsZSB0byByZWZpbGwgYXQgbGVhc3Qgb25lIGJ5dGUgICAgICAgICAgICAKLSAgICAgICAgICAgIExEUkIgICAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgICAgICAgICAgIAotICAgICAgICAgICAgTU9WUyAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50Ci0gICAgICAgICAgICBPUlIgICAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICMoMTYtJE4pCi0gICAgICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAgICAgICAgICAKLSAgICAgICAgICAgIE1PViAgICAgJFN5bWJvbCwgJFN5bWJvbCwgTFNSICMoMzItJE4pCi0gICAgICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAotICAgICAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAotICAgICAgICBFTkRJRgotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFNraXAgdmFyaWFibGUgMTw9Tjw9OCBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSwgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlci4KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMuIDE8PU48PTgKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRUMiAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9WU0tJUDggJE4sICRUMQotICAgICAgICBBREQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAkTgotICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAotICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAgICAgIAotICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAotICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4Ci0gICAgICAgIE1FTkQgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBTa2lwIHZhcmlhYmxlIDE8PU48PTE2IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtLCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyLgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cy4gMTw9Tjw9MTYKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRUMiAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9WU0tJUDE2ICROLCAkVDEsICRUMgotICAgICAgICBBREQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAkTgotICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAotICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAgICAgIAotICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4Ci0gICAgICAgIFNVQkNTUyAgJEJpdENvdW50LCAkQml0Q291bnQsICM4ICAgICAgICAKLSAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxCi0gICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4Ci0gICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKLSAgICAgICAgTUVORCAgICAgICAgCi0KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBSZWFkIHZhcmlhYmxlIDE8PU48PTggYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0sIGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIuCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzIHRvIHJlYWQuIDE8PU48PTgKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBuZXh0IE4gYml0cyBvZiB0aGUgYml0c3RyZWFtCi0gICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfVlJFQUQ4ICRTeW1ib2wsICROLCAkVDEsICRUMgotICAgICAgICBNT1YgICAgICRTeW1ib2wsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQgICAgICAgIAotICAgICAgICBBREQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAkTgotICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAotICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAgICAgIAotICAgICAgICBSU0IgICAgICRUMiwgJE4sICMzMiAgICAgICAgCi0gICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4Ci0gICAgICAgIE1PViAgICAgJFN5bWJvbCwgJFN5bWJvbCwgTFNSICRUMgotICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4Ci0gICAgICAgIE1FTkQKLQotCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gUmVhZCB2YXJpYWJsZSAxPD1OPD0xNiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSwgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlci4KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMgdG8gcmVhZC4gMTw9Tjw9MTYKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBuZXh0IE4gYml0cyBvZiB0aGUgYml0c3RyZWFtCi0gICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfVlJFQUQxNiAkU3ltYm9sLCAkTiwgJFQxLCAkVDIKLSAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50ICAgICAgICAKLSAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgJE4KLSAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKLSAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgICAgICAKLSAgICAgICAgUlNCICAgICAkVDIsICROLCAjMzIgICAgICAgIAotICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4Ci0gICAgICAgIFNVQkNTUyAgJEJpdENvdW50LCAkQml0Q291bnQsICM4ICAgICAgICAKLSAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxCi0gICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4Ci0gICAgICAgIE1PViAgICAgJFN5bWJvbCwgJFN5bWJvbCwgTFNSICRUMgotICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4Ci0gICAgICAgIE1FTkQKLQotCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gRGVjb2RlIGEgY29kZSBvZiB0aGUgZm9ybSAwMDAwLi4uMDAxIHdoZXJlIHRoZXJlCi0gICAgICAgIDsvLyBhcmUgTiB6ZXJvcyBiZWZvcmUgdGhlIDEgYW5kIE48PTE1IChjb2RlIGxlbmd0aDw9MTYpCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBudW1iZXIgb2YgemVyb3MgYmVmb3JlIHRoZSBuZXh0IDEKLSAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgID49MTYgaXMgYW4gaWxsZWdhbCBjb2RlCi0gICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9DTFoxNiAkU3ltYm9sLCAkVDEsICRUMgotICAgICAgICBNT1ZTICAgICRTeW1ib2wsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQKLSAgICAgICAgQ0xaICAgICAkU3ltYm9sLCAkU3ltYm9sICAgICAgICAgICAgICAgIAotICAgICAgICBBREQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAkU3ltYm9sCi0gICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM3ICAgICAgICA7Ly8gbGVuZ3RoIGlzIFN5bWJvbCsxCi0gICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMQotICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4Ci0gICAgICAgIFNVQkNTUyAgJEJpdENvdW50LCAkQml0Q291bnQsICM4ICAgICAgICAKLSAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxCi0gICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4Ci0gICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKLSAgICAgICAgTUVORCAgCi0KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBEZWNvZGUgYSBjb2RlIG9mIHRoZSBmb3JtIDExMTEuLi4xMTAgd2hlcmUgdGhlcmUKLSAgICAgICAgOy8vIGFyZSBOIG9uZXMgYmVmb3JlIHRoZSAwIGFuZCBOPD0xNSAoY29kZSBsZW5ndGg8PTE2KQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vIAotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbnVtYmVyIG9mIHplcm9zIGJlZm9yZSB0aGUgbmV4dCAxCi0gICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICA+PTE2IGlzIGFuIGlsbGVnYWwgY29kZQotICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLyAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfQ0xPMTYgJFN5bWJvbCwgJFQxLCAkVDIKLSAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50Ci0gICAgICAgIE1WTiAgICAgJFN5bWJvbCwgJFN5bWJvbAotICAgICAgICBDTFogICAgICRTeW1ib2wsICRTeW1ib2wgICAgICAgICAgICAgICAgCi0gICAgICAgIEFERCAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICRTeW1ib2wKLSAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzcgICAgICAgIDsvLyBsZW5ndGggaXMgU3ltYm9sKzEKLSAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxCi0gICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKLSAgICAgICAgU1VCQ1NTICAkQml0Q291bnQsICRCaXRDb3VudCwgIzggICAgICAgIAotICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEKLSAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKLSAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAotICAgICAgICBNRU5EICAKLQotCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gVmFyaWFibGUgTGVuZ3RoIERlY29kZSBtb2R1bGUKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBEZWNvZGVzIG9uZSBWTEQgU3ltYm9sIGZyb20gYSBiaXRzdHJlYW0gYW5kIHJlZmlsbCB0aGUgYml0c3RyZWFtCi0gICAgICAgIDsvLyBidWZmZXIuCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRwVkxEVGFibGUgICAgICAtIHBvaW50ZXIgdG8gVkxEIGRlY29kZSB0YWJsZSBvZiAxNi1iaXQgZW50cmllcy4KLSAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIFRoZSBmb3JtYXQgaXMgZGVzY3JpYmVkIGFib3ZlIGF0IHRoZSBzdGFydCBvZgotICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgdGhpcyBmaWxlLgotICAgICAgICA7Ly8gJFMwICAgICAgICAgICAgIC0gVGhlIG51bWJlciBvZiBiaXRzIHRvIGxvb2sgdXAgZm9yIHRoZSBmaXJzdCBzdGVwCi0gICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICAxPD0kUzA8PTgKLSAgICAgICAgOy8vICRTMSAgICAgICAgICAgICAtIFRoZSBudW1iZXIgb2YgYml0cyB0byBsb29rIHVwIGZvciBlYWNoIHN1YnNlcXVlbnQKLSAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIHN0ZXAgMTw9JFMxPD0kUzAuCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gZGVjb2RlZCBWTEQgc3ltYm9sIHZhbHVlCi0gICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfVkxEICRTeW1ib2wsICRUMSwgJFQyLCAkcFZMRFRhYmxlLCAkUzAsICRTMQotICAgICAgICBBU1NFUlQgKDE8PSRTMCk6TEFORDooJFMwPD04KQotICAgICAgICBBU1NFUlQgKDE8PSRTMSk6TEFORDooJFMxPD0kUzApCi0gICAgICAgIAotICAgICAgICA7Ly8gTm90ZSAwPD1CaXRDb3VudDw9MTUgb24gZW50cnkgYW5kIGV4aXQKLSAgICAgICAgCi0gICAgICAgIE1PVlMgICAgJFQxLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50ICAgICAgIDsvLyBsZWZ0IGFsaWduIG5leHQgYml0cwotICAgICAgICBNT1ZTICAgICRTeW1ib2wsICMoMjw8JFMwKS0yICAgICAgICAgICAgICAgICA7Ly8gY3JlYXRlIG1hc2sKLSAgICAgICAgQU5EICAgICAkU3ltYm9sLCAkU3ltYm9sLCAkVDEsIExTUiAjKDMxLSRTMCkgOy8vIDIqKG5leHQgJFMwIGJpdHMpCi0gICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4ICAgICAgICAgICAgIDsvLyBDUyBpZiBidWZmZXIgY2FuIGJlIGZpbGxlZAotMDEKLSAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgICAgICAgICAgICAgOy8vIGxvYWQgcmVmaWxsIGJ5dGUKLSAgICAgICAgTERSSCAgICAkU3ltYm9sLCBbJHBWTERUYWJsZSwgJFN5bWJvbF0gICAgICAgOy8vIGxvYWQgdGFibGUgZW50cnkKLSAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzggICAgICAgICAgICAgOy8vIHJlZmlsbCBub3QgcG9zc2libGUKLSAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIyRTMCAgICAgICAgICAgOy8vIGFzc3VtZSAkUzAgYml0cyB1c2VkCi0gICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzggIDsvLyBtZXJnZSBpbiByZWZpbGwgYnl0ZQotICAgICAgICBNT1ZTICAgICRUMSwgJFN5bWJvbCwgTFNSICMxICAgICAgICAgICAgICAgICA7Ly8gQ1M9bGVhZiBlbnRyeQotICAgICAgICBCQ1MgICAgICVGVDAyCi0gICAgICAgIAotICAgICAgICBNT1ZTICAgICRUMSwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudCAgICAgICA7Ly8gbGVmdCBhbGlnbiBuZXh0IGJpdAotICAgICAgICBJRiAoMiokUzAtJFMxPD04KQotICAgICAgICAgICAgOy8vIENhbiBjb21iaW5lIHJlZmlsbCBjaGVjayBhbmQgLVMwK1MxIGFuZCBrZWVwICRCaXRDb3VudDw9MTUKLSAgICAgICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4KygkUzAtJFMxKQotICAgICAgICBFTFNFCi0gICAgICAgICAgICA7Ly8gU2VwYXJhdGUgcmVmaWxsIGNoZWNrIGFuZCAtUzArUzEgb2Zmc2V0Ci0gICAgICAgICAgICBTVUJTICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKLSAgICAgICAgICAgIFNVQiAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjKCRTMC0kUzEpCi0gICAgICAgIEVORElGCi0gICAgICAgIEFERCAgICAgJFN5bWJvbCwgJFN5bWJvbCwgJFQxLCBMU1IgIygzMS0kUzEpIDsvLyBhZGQgMioobmV4dCAkUzEgYml0cykgdG8KLSAgICAgICAgQklDICAgICAkU3ltYm9sLCAkU3ltYm9sLCAjMSAgICAgICAgICAgICAgICAgOy8vICAgdGFibGUgb2Zmc2V0Ci0gICAgICAgIEIgICAgICAgJUJUMDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBsb2FkIG5leHQgdGFibGUgZW50cnkKLTAyCi0gICAgICAgIDsvLyBCaXRDb3VudCByYW5nZSBub3cgZGVwZW5kIG9uIHRoZSByb3V0ZSBoZXJlCi0gICAgICAgIDsvLyBpZiAoZmlyc3Qgc3RlcCkgICAgICAgUzAgPD0gQml0Q291bnQgPD0gNytTMCAgICAgICAgPD0xNQotICAgICAgICA7Ly8gZWxzZSBpZiAoMipTMC1TMTw9OCkgIFMwIDw9IEJpdENvdW50IDw9IDcrKDIqUzAtUzEpIDw9MTUKLSAgICAgICAgOy8vIGVsc2UgICAgICAgICAgICAgICAgICBTMSA8PSBCaXRDb3VudCA8PSA3K1MxICAgICAgICA8PTE1Ci0gICAgICAgIAotICAgICAgICBTVUIgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAkU3ltYm9sLCBMU1IjMTMKLSAgICAgICAgQklDICAgICAkU3ltYm9sLCAkVDEsICMweEYwMDAKLSAgICAgICAgTUVORAotICAgICAgICAKLQotICAgICAgICA7Ly8gQWRkIGFuIG9mZnNldCBudW1iZXIgb2YgYml0cwotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIE91dHB1dHMgZGVzdGluYXRpb24gYnl0ZSBhbmQgYml0IGluZGV4IHZhbHVlcyB3aGljaCBjb3JyZXNwb25kcyB0byBhbiBvZmZzZXQgbnVtYmVyIG9mIGJpdHMgCi0gICAgICAgIDsvLyBmcm9tIHRoZSBjdXJyZW50IGxvY2F0aW9uLiBUaGlzIGlzIHVzZWQgdG8gY29tcGFyZSBiaXRzdHJlYW0gcG9zaXRpb25zIHVzaW5nLiBNX0JEX0NNUC4KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJE9mZnNldCAgICAgICAgIC0gT2Zmc2V0IHRvIGJlIGFkZGVkIGluIGJpdHMuCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRCeXRlSW5kZXggICAgICAtIERlc3RpbmF0aW9uIHBCaXRTdHJlYW0gcG9pbnRlciBhZnRlciBhZGRpbmcgdGhlIE9mZnNldC4gCi0gICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIHdpbGwgYmUgNCBieXRlIGFoZWFkIGFuZCBuZWVkcyB0byBzdWJ0cmFjdCBieSA0IHRvIGdldCBleGFjdCAKLSAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgKGFzIGluIE1fQkRfRklOSSkuIEJ1dCBmb3IgdXNpbmcgd2l0aCBNX0JEX0NNUCBzdWJ0cmFjdCBpcyBub3QgbmVlZGVkLgotICAgICAgICA7Ly8gJEJpdEluZGV4ICAgICAgIC0gRGVzdGluYXRpb24gQml0Q291bnQgYWZ0ZXIgdGhlIGFkZGl0aW9uIG9mIE9mZnNldCBudW1iZXIgb2YgYml0cwotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9BREQgICRCeXRlSW5kZXgsICRCaXRJbmRleCwgJE9mZnNldAotCi0gICAgICAgIDsvLyAoJEJ5dGVJbmRleCwkQml0SW5kZXgpID0gQ3VycmVudCBwb3NpdGlvbiArICRPZmZzZXQgYml0cwotICAgICAgICBBREQgICAgICRPZmZzZXQsICRPZmZzZXQsICRCaXRDb3VudAotICAgICAgICBBTkQgICAgICRCaXRJbmRleCwgJE9mZnNldCwgIzcKLSAgICAgICAgQUREICAgICAkQnl0ZUluZGV4LCAkcEJpdFN0cmVhbSwgJE9mZnNldCwgQVNSICMzICAgICAgICAKLSAgICAgICAgTUVORAotCi0gICAgICAgIDsvLyBNb3ZlIGJpdHN0cmVhbSBwb2ludGVycyB0byB0aGUgbG9jYXRpb24gZ2l2ZW4KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBPdXRwdXRzIGRlc3RpbmF0aW9uIGJ5dGUgYW5kIGJpdCBpbmRleCB2YWx1ZXMgd2hpY2ggY29ycmVzcG9uZHMgdG8gIAotICAgICAgICA7Ly8gdGhlIGN1cnJlbnQgbG9jYXRpb24gZ2l2ZW4gKGNhbGN1bGF0ZWQgdXNpbmcgTV9CRF9BREQpLiAKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLyAkQnl0ZUluZGV4ICAgICAgLSBEZXN0aW5hdGlvbiBwQml0U3RyZWFtIHBvaW50ZXIgYWZ0ZXIgbW92ZS4gCi0gICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIHdpbGwgYmUgNCBieXRlIGFoZWFkIGFuZCBuZWVkcyB0byBzdWJ0cmFjdCBieSA0IHRvIGdldCBleGFjdCAKLSAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgKGFzIGluIE1fQkRfRklOSSkuCi0gICAgICAgIDsvLyAkQml0SW5kZXggICAgICAgLSBEZXN0aW5hdGlvbiBCaXRDb3VudCBhZnRlciB0aGUgbW92ZQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAgICAgICAgICAgICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLiAgCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfTU9WICAkQnl0ZUluZGV4LCAkQml0SW5kZXgKLQotICAgICAgICA7Ly8gKCRwQml0U3RyZWFtLCAkT2Zmc2V0KSA9ICgkQnl0ZUluZGV4LCRCaXRJbmRleCkKLSAgICAgICAgTU9WICAgICAkQml0Q291bnQsICRCaXRJbmRleAotICAgICAgICBNT1YgICAgICRwQml0U3RyZWFtLCAkQnl0ZUluZGV4Ci0gICAgICAgIE1FTkQKLQotICAgICAgICA7Ly8gQml0c3RyZWFtIENvbXBhcmUKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBDb21wYXJlcyBiaXRzdHJlYW0gcG9zaXRpb24gd2l0aCB0aGF0IG9mIGEgZGVzdGluYXRpb24gcG9zaXRpb24uIERlc3RpbmF0aW9uIHBvc2l0aW9uIAotICAgICAgICA7Ly8gaXMgaGVsZCBpbiB0d28gaW5wdXQgcmVnaXN0ZXJzIHdoaWNoIGFyZSBjYWxjdWxhdGVkIHVzaW5nIE1fQkRfQUREIG1hY3JvCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRCeXRlSW5kZXggICAgICAtIERlc3RpbmF0aW9uIHBCaXRTdHJlYW0gcG9pbnRlciwgKDQgYnl0ZSBhaGVhZCBhcyBkZXNjcmliZWQgaW4gTV9CRF9BREQpCi0gICAgICAgIDsvLyAkQml0SW5kZXggICAgICAgLSBEZXN0aW5hdGlvbiBCaXRDb3VudAotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBGTEFHUyAgICAgICAgICAgLSBHRSBpZiBkZXN0aW5hdGlvbiBpcyByZWFjaGVkLCBMVCA9IGlzIGRlc3RpbmF0aW9uIGlzIGFoZWFkCi0gICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLwotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX0NNUCAgJEJ5dGVJbmRleCwgJEJpdEluZGV4LCAkVDEKLSAgICAgICAgCi0gICAgICAgIDsvLyBSZXR1cm4gZmxhZ3Mgc2V0IGJ5IChjdXJyZW50IHBvc2l0b24pLSgkQnl0ZUluZGV4LCRCaXRJbmRleCkKLSAgICAgICAgOy8vIHNvIEdFIG1lYW5zIHRoYXQgd2UgaGF2ZSByZWFjaGVkIHRoZSBpbmRpY2F0ZWQgcG9zaXRpb24KLQotICAgICAgICBBREQgICAgICAgICAkVDEsICRwQml0U3RyZWFtLCAkQml0Q291bnQsIExTUiAjMwotICAgICAgICBDTVAgICAgICAgICAkVDEsICRCeXRlSW5kZXgKLSAgICAgICAgQU5EICAgICAgICAgJFQxLCAkQml0Q291bnQsICM3Ci0gICAgICAgIENNUEVRICAgICAgICRUMSwgJEJpdEluZGV4ICAgICAgICAKLSAgICAgICAgTUVORAotCi0gICAgICAgIAotICAgICAgICA7Ly8gQml0c3RyZWFtIERlY29kZSBmaW5hbGlzZQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFdyaXRlcyBiYWNrIHRoZSBiaXRzdHJlYW0gc3RhdGUgdG8gdGhlIGJpdHN0cmVhbSBwb2ludGVycwotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRwcEJpdFN0cmVhbSAgICAtIHBvaW50ZXIgdG8gcG9pbnRlciB0byB0aGUgbmV4dCBiaXRzdHJlYW0gYnl0ZQotICAgICAgICA7Ly8gJHBCaXRPZmZzZXQgICAgIC0gcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGJpdHMgdXNlZCBpbiB0aGUgY3VycmVudCBieXRlICgwLi43KQotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gdGhlc2UgcmVnaXN0ZXIgYXJlIGNvcnJ1cHRlZAotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLwotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX0ZJTkkgICRwcEJpdFN0cmVhbSwgJHBCaXRPZmZzZXQKLSAgICAgICAgCi0gICAgICAgIDsvLyBBZHZhbmNlIHBvaW50ZXIgYnkgdGhlIG51bWJlciBvZiBmcmVlIGJpdHMgaW4gdGhlIGJ1ZmZlcgotICAgICAgICBBREQgICAgICRwQml0U3RyZWFtLCAkcEJpdFN0cmVhbSwgJEJpdENvdW50LCBMU1IjMwotICAgICAgICBBTkQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjNwotICAgICAgICAKLSAgICAgICAgOy8vIE5vdyBtb3ZlIGJhY2sgMzIgYml0cyB0byByZWFjaCB0aGUgZmlyc3QgdXN1ZWQgYml0Ci0gICAgICAgIFNVQiAgICAgJHBCaXRTdHJlYW0sICRwQml0U3RyZWFtLCAjNAotICAgICAgICAKLSAgICAgICAgOy8vIFN0b3JlIG91dCBiaXRzdHJlYW0gc3RhdGUKLSAgICAgICAgU1RSICAgICAkQml0Q291bnQsIFskcEJpdE9mZnNldF0KLSAgICAgICAgU1RSICAgICAkcEJpdFN0cmVhbSwgWyRwcEJpdFN0cmVhbV0KLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgRU5ECi0gICAgICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzBlZjM3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9CaXRzdHJlYW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtQ09NTV9CaXRzdHJlYW0uaAotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICAxMjI5MAotICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRmlsZTogYXJtQ09NTV9CaXRzdHJlYW0uaAotICogQnJpZWY6IERlY2xhcmVzIGNvbW1vbiBBUEkncy9EYXRhIHR5cGVzIHVzZWQgYWNyb3NzIHRoZSBPcGVuTWF4IEVuY29kZXJzL0RlY29kZXJzLgotICoKLSAqLwotCi0jaWZuZGVmIF9hcm1Db2RlY19IXwotI2RlZmluZSBfYXJtQ29kZWNfSF8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBPTVhfVTggICBjb2RlTGVuOwotICAgIE9NWF9VMzIJIGNvZGVXb3JkOwotfSBBUk1fVkxDMzI7Ci0KLS8qIFRoZSBhYm92ZSBzaG91bGQgYmUgcmVuYW1lZCBhcyAiQVJNX1ZMQzMyIiAqLwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1Mb29rQWhlYWRCaXRzKCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEdldCB0aGUgbmV4dCBOIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtIHdpdGhvdXQgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICAgICAqKnBwQml0U3RyZWFtCi0gKiBbaW5dICAgICAqcE9mZnNldAotICogW2luXSAgICAgTj0xLi4uMzIKLSAqCi0gKiBSZXR1cm5zICBWYWx1ZQotICovCi0KLU9NWF9VMzIgYXJtTG9va0FoZWFkQml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwgT01YX0lOVCAqcE9mZnNldCwgT01YX0lOVCBOKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtR2V0Qml0cygpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBSZWFkIE4gYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KLSAqICAgIAotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQotICogW2luXSAgICAgKnBPZmZzZXQKLSAqIFtpbl0gICAgIE49MS4uMzIKLSAqCi0gKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KLSAqIFtvdXRdICAgICpwT2Zmc2V0Ci0gKiBSZXR1cm5zICBWYWx1ZQotICovCi0KLU9NWF9VMzIgYXJtR2V0Qml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwgT01YX0lOVCAqcE9mZnNldCwgT01YX0lOVCBOKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtQnl0ZUFsaWduKCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEFsaWduIHRoZSBwb2ludGVyICpwcEJpdFN0cmVhbSB0byB0aGUgbmV4dCBieXRlIGJvdW5kYXJ5Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQotICogW2luXSAgICAgKnBPZmZzZXQKLSAqCi0gKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KLSAqIFtvdXRdICAgICpwT2Zmc2V0Ci0gKgotICoqLwotIAotT01YVm9pZCBhcm1CeXRlQWxpZ24oY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCk7Ci0KLS8qKiAKLSAqIEZ1bmN0aW9uOiBhcm1Ta2lwQml0cygpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBTa2lwIE4gYml0cyBmcm9tIHRoZSB2YWx1ZSBhdCAqcHBCaXRTdHJlYW0KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgICAgKnBwQml0U3RyZWFtCi0gKiBbaW5dICAgICAqcE9mZnNldAotICogW2luXSAgICAgTgotICoKLSAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQotICogW291dF0gICAgKnBPZmZzZXQKLSAqCi0gKiovCi0KLU9NWFZvaWQgYXJtU2tpcEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCxPTVhfSU5UIE4pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBWYXJpYWJsZSBiaXQgbGVuZ3RoIERlY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVW5QYWNrVkxDMzIoKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVmFyaWFibGUgbGVuZ3RoIGRlY29kZSBvZiB2YXJpYWJsZSBsZW5ndGggc3ltYm9sIChtYXggc2l6ZSAzMiBiaXRzKSByZWFkIGZyb20KLSAqIHRoZSBiaXQgc3RyZWFtIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIGF0ICpwT2Zmc2V0IGJ5IHVzaW5nIHRoZSB0YWJsZQotICogcG9pbnRlZCBieSBwQ29kZUJvb2sKLSAqIAotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICoqcHBCaXRTdHJlYW0KLSAqIFtpbl0gICAgICpwT2Zmc2V0Ci0gKiBbaW5dICAgICBwQ29kZUJvb2sKLSAqIAotICogW291dF0gICAgKipwcEJpdFN0cmVhbQotICogW291dF0gICAgKnBPZmZzZXQKLSAqCi0gKiBSZXR1cm5zIDogQ29kZSBCb29rIEluZGV4IGlmIHN1Y2Nlc3NmdWxsLiAKLSAqICAgICAgICAgOiAiQVJNX05PX0NPREVCT09LX0lOREVYID0gMHhGRkZGIiBpZiBzZWFyY2ggZmFpbHMuCi0gKiovCi0KLSNkZWZpbmUgQVJNX05PX0NPREVCT09LX0lOREVYIChPTVhfVTE2KSgweEZGRkYpCi0KLU9NWF9VMTYgYXJtVW5QYWNrVkxDMzIoCi0gICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcE9mZnNldCwKLSAgICBjb25zdCBBUk1fVkxDMzIgKnBDb2RlQm9vawotKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRml4ZWQgYml0IGxlbmd0aCBFbmNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogRnVuY3Rpb246IGFybVBhY2tCaXRzCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQYWNrIGEgVkxDIGNvZGUgd29yZCBpbnRvIHRoZSBiaXRzdHJlYW0KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbS4KLSAqIFtpbl0JcE9mZnNldAkgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKLSAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAotICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KLSAqIFtpbl0JY29kZVdvcmQJCUNvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCi0gKiBbaW5dCWNvZGVMZW5ndGgJCUxlbmd0aCBvZiB0aGUgY29kZSB3b3JkIHZhbGlkIHJhbmdlIDEuLi4zMgotICoKLSAqIFtvdXRdIHBwQml0U3RyZWFtCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAotICoJICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0Ci0gKgkJCQkJCQlzdHJlYW0gYnVmZmVyLgotICogW291dF0gcEJpdE9mZnNldAkJKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLSAqCQkJCQkJCWN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLSAqCQkJCQkJCSpwcEJpdFN0cmVhbS4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0gCi1PTVhSZXN1bHQgYXJtUGFja0JpdHMgKAotICAgIE9NWF9VOCAgKipwcEJpdFN0cmVhbSwgCi0gICAgT01YX0lOVCAqcE9mZnNldCwKLSAgICBPTVhfVTMyIGNvZGVXb3JkLCAKLSAgICBPTVhfSU5UIGNvZGVMZW5ndGggCi0pOwotIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVmFyaWFibGUgYml0IGxlbmd0aCBFbmNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogRnVuY3Rpb246IGFybVBhY2tWTEMzMgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGFjayBhIFZMQyBjb2RlIHdvcmQgaW50byB0aGUgYml0c3RyZWFtCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIAotICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0uCi0gKiBbaW5dCXBCaXRPZmZzZXQJICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKLSAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAotICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KLSAqIFtpbl0JIGNvZGUgICAgIAkJVkxDIGNvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0KLSAqCi0gKiBbb3V0XSBwcEJpdFN0cmVhbQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKLSAqCSAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0Ci0gKgkJCQkJCXN0cmVhbSBidWZmZXIuCi0gKiBbb3V0XSBwQml0T2Zmc2V0CQkqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotICoJCQkJCQljdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci0gKgkJCQkJCSpwcEJpdFN0cmVhbS4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0gCi1PTVhSZXN1bHQgYXJtUGFja1ZMQzMyICgKLSAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwgCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBBUk1fVkxDMzIgY29kZSAKLSk7Ci0KLSNlbmRpZiAgICAgIC8qX2FybUNvZGVjX0hfKi8KLQotLypFbmQgb2YgRmlsZSovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fSURDVFRhYmxlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fSURDVFRhYmxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3NjFmNjEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX0lEQ1RUYWJsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1DT01NX0lEQ1RUYWJsZS5oCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDEyMjkwCi0gKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBGaWxlICAgICAgICAgOiBhcm1DT01NX0lEQ1RUYWJsZS5oCi0gKiBEZXNjcmlwdGlvbiAgOiBDb250YWlucyBkZWNsYXJhdGlvbnMgb2YgdGFibGVzIGZvciBJRENUIGNhbGN1bGF0aW9uLgotICoKLSAqLwotICAKLSNpZm5kZWYgX2FybUNPTU1fSURDVFRhYmxlX0hfCi0jZGVmaW5lIF9hcm1DT01NX0lEQ1RUYWJsZV9IXwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLQotICAgICAvKiAgVGFibGUgb2Ygcyh1KSpBKHUpKkEodikvMTYgYXQgUTE1Ci0gICAgICAqICBzKHUpPTEuMCAwIDw9IHUgPD0gNQotICAgICAgKiAgcyg2KT0yLjAKLSAgICAgICogIHMoNyk9NC4wCi0gICAgICAqICBBKDApID0gMipzcXJ0KDIpCi0gICAgICAqICBBKHUpID0gNCpjb3ModSpwaS8xNikgIGZvciAodSE9MCkKLQkgICovCi1leHRlcm4gY29uc3QgT01YX1UxNiBhcm1DT01NX0lEQ1RQcmVTY2FsZSBbNjRdOwotZXh0ZXJuIGNvbnN0IE9NWF9VMTYgYXJtQ09NTV9JRENUQ29lZiBbNF07Ci0KLSNlbmRpZiAvKiBfYXJtQ09NTV9JRENUVGFibGVfSF8gKi8KLQotCi0vKiBFbmQgb2YgRmlsZSAqLwotCi0KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fSURDVF9zLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fSURDVF9zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMzAyMjMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX0lEQ1Rfcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1OSArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vCi07Ly8gSURDVF9zLnMKLTsvLwotOy8vIEludmVyc2UgRENUIG1vZHVsZQotOy8vCi07Ly8gCi07Ly8gQUxHT1JJVEhNIERFU0NSSVBUSU9OCi07Ly8KLTsvLyBUaGUgOHg4IDJEIElEQ1QgaXMgcGVyZm9ybWVkIGJ5IGNhbGN1bGF0aW5nIGEgMUQgSURDVCBmb3IgZWFjaAotOy8vIGNvbHVtbiBhbmQgdGhlbiBhIDFEIElEQ1QgZm9yIGVhY2ggcm93LgotOy8vCi07Ly8gVGhlIDgtcG9pbnQgMUQgSURDVCBpcyBkZWZpbmVkIGJ5Ci07Ly8gICBmKHgpID0gKEMoMCkqVCgwKSpjKDAseCkgKyAuLi4gKyBDKDcpKlQoNykqYyg3LHgpKS8yCi07Ly8KLTsvLyAgIEModSkgPSAxL3NxcnQoMikgaWYgdT0wIG9yIDEgaWYgdSE9MAotOy8vICAgYyh1LHgpID0gY29zKCAoMngrMSkqdSpwaS8xNiApCi07Ly8KLTsvLyBXZSBjb21wdXRlIHRoZSA4LXBvaW50IDFEIElEQ1QgdXNpbmcgdGhlIHJldmVyc2Ugb2YKLTsvLyB0aGUgQXJhaS1BZ3VpLU5ha2FqaW1hIGZsb3cgZ3JhcGggd2hpY2ggd2Ugc3BsaXQgaW50bwotOy8vIDUgc3RhZ2VzIG5hbWVkIGluIHJldmVyc2Ugb3JkZXIgdG8gaWRlbnRpZnkgd2l0aCB0aGUKLTsvLyBmb3J3YXJkIERDVC4gRGlyZWN0IGludmVyc2lvbiBvZiB0aGUgZm9yd2FyZCBmb3JtdWxhZQotOy8vIGluIGZpbGUgRkRDVF9zLnMgZ2l2ZXM6Ci07Ly8KLTsvLyBJU3RhZ2UgNTogICBqKHUpID0gVCh1KSpBKHUpICBbIEEodSk9NCpDKHUpKmModSwwKSBdCi07Ly8gICAgICAgICAgICAgWyBBKDApID0gMipzcXJ0KDIpCi07Ly8gICAgICAgICAgICAgICBBKHUpID0gNCpjb3ModSpwaS8xNikgIGZvciAodSE9MCkgXQotOy8vCi07Ly8gSVN0YWdlIDQ6ICAgaTAgPSBqMCAgICAgICAgICAgICBpMSA9IGo0Ci07Ly8gICAgICAgICAgICAgaTMgPSAoajIrajYpLzIgICAgICBpMiA9IChqMi1qNikvMgotOy8vICAgICAgICAgICAgIGk3ID0gKGo1K2ozKS8yICAgICAgaTQgPSAoajUtajMpLzIKLTsvLyAgICAgICAgICAgICBpNSA9IChqMStqNykvMiAgICAgIGk2ID0gKGoxLWo3KS8yCi07Ly8KLTsvLyBJU3RhZ2UgMzogICBoMCA9IChpMCtpMSkvMiAgICAgIGgxID0gKGkwLWkxKS8yCi07Ly8gICAgICAgICAgICAgaDIgPSAoaTIqc3FydDIpLWkzICBoMyA9IGkzCi07Ly8gICAgICAgICAgICAgaDQgPSAgY29zKHBpLzgpKmk0ICsgc2luKHBpLzgpKmk2Ci07Ly8gICAgICAgICAgICAgaDYgPSAtc2luKHBpLzgpKmk0ICsgY29zKHBpLzgpKmk2Ci07Ly8gICAgICAgICAgICAgWyBUaGUgYWJvdmUgdHdvIGxpbmVzIHJvdGF0ZSBieSAtKHBpLzgpIF0KLTsvLyAgICAgICAgICAgICBoNSA9IChpNS1pNykvc3FydDIgIGg3ID0gKGk1K2k3KS8yIAotOy8vICAgICAgICAgICAgIAotOy8vIElTdGFnZSAyOiAgIGcwID0gKGgwK2gzKS8yICAgICAgZzMgPSAoaDAtaDMpLzIKLTsvLyAgICAgICAgICAgICBnMSA9IChoMStoMikvMiAgICAgIGcyID0gKGgxLWgyKS8yCi07Ly8gICAgICAgICAgICAgZzcgPSBoNyAgICAgICAgICAgICBnNiA9IGg2IC0gaDcKLTsvLyAgICAgICAgICAgICBnNSA9IGg1IC0gZzYgICAgICAgIGc0ID0gaDQgLSBnNQotOy8vCi07Ly8gSVN0YWdlIDE6ICAgZjAgPSAoZzArZzcpLzIgICAgICBmNyA9IChnMC1nNykvMgotOy8vICAgICAgICAgICAgIGYxID0gKGcxK2c2KS8yICAgICAgZjYgPSAoZzEtZzYpLzIKLTsvLyAgICAgICAgICAgICBmMiA9IChnMitnNSkvMiAgICAgIGY1ID0gKGcyLWc1KS8yCi07Ly8gICAgICAgICAgICAgZjMgPSAoZzMrZzQpLzIgICAgICBmNCA9IChnMy1nNCkvMgotOy8vCi07Ly8gTm90ZSB0aGF0IG1vc3QgY29lZmZpY2llbnRzIGFyZSBoYWx2ZWQgMyB0aW1lcyBkdXJpbmcgdGhlCi07Ly8gYWJvdmUgY2FsY3VsYXRpb24uIFdlIGNhbiByZXNjYWxlIHRoZSBhbGdvcml0aG0gZGl2aWRpbmcKLTsvLyB0aGUgaW5wdXQgYnkgOCB0byByZW1vdmUgdGhlIGhhbHZpbmdzLgotOy8vCi07Ly8gSVN0YWdlIDU6ICAgaih1KSA9IFQodSkqQSh1KS84Ci07Ly8KLTsvLyBJU3RhZ2UgNDogICBpMCA9IGowICAgICAgICAgICAgIGkxID0gajQKLTsvLyAgICAgICAgICAgICBpMyA9IGoyICsgajYgICAgICAgIGkyID0gajIgLSBqNgotOy8vICAgICAgICAgICAgIGk3ID0gajUgKyBqMyAgICAgICAgaTQgPSBqNSAtIGozCi07Ly8gICAgICAgICAgICAgaTUgPSBqMSArIGo3ICAgICAgICBpNiA9IGoxIC0gajcKLTsvLwotOy8vIElTdGFnZSAzOiAgIGgwID0gaTAgKyBpMSAgICAgICAgaDEgPSBpMCAtIGkxCi07Ly8gICAgICAgICAgICAgaDIgPSAoaTIqc3FydDIpLWkzICBoMyA9IGkzCi07Ly8gICAgICAgICAgICAgaDQgPSAyKiggY29zKHBpLzgpKmk0ICsgc2luKHBpLzgpKmk2KQotOy8vICAgICAgICAgICAgIGg2ID0gMiooLXNpbihwaS84KSppNCArIGNvcyhwaS84KSppNikKLTsvLyAgICAgICAgICAgICBoNSA9IChpNS1pNykqc3FydDIgIGg3ID0gaTUgKyBpNyAKLTsvLyAgICAgICAgICAgICAKLTsvLyBJU3RhZ2UgMjogICBnMCA9IGgwICsgaDMgICAgICAgIGczID0gaDAgLSBoMwotOy8vICAgICAgICAgICAgIGcxID0gaDEgKyBoMiAgICAgICAgZzIgPSBoMSAtIGgyCi07Ly8gICAgICAgICAgICAgZzcgPSBoNyAgICAgICAgICAgICBnNiA9IGg2IC0gaDcKLTsvLyAgICAgICAgICAgICBnNSA9IGg1IC0gZzYgICAgICAgIGc0ID0gaDQgLSBnNQotOy8vCi07Ly8gSVN0YWdlIDE6ICAgZjAgPSBnMCArIGc3ICAgICAgICBmNyA9IGcwIC0gZzcKLTsvLyAgICAgICAgICAgICBmMSA9IGcxICsgZzYgICAgICAgIGY2ID0gZzEgLSBnNgotOy8vICAgICAgICAgICAgIGYyID0gZzIgKyBnNSAgICAgICAgZjUgPSBnMiAtIGc1Ci07Ly8gICAgICAgICAgICAgZjMgPSBnMyArIGc0ICAgICAgICBmNCA9IGczIC0gZzQKLTsvLwotOy8vIE5vdGU6Ci07Ly8gMS4gVGhlIHNjYWxpbmcgYnkgQSh1KS84IGNhbiBvZnRlbiBiZSBjb21iaW5lZCB3aXRoIGludmVyc2UKLTsvLyAgICBxdWFudGl6YXRpb24uIFRoZSBjb2x1bW4gYW5kIHJvdyBzY2FsaW5ncyBjYW4gYmUgY29tYmluZWQuCi07Ly8gMi4gVGhlIGZsb3dncmFwaCBpbiB0aGUgQUFOIHBhcGVyIGhhcyBoNCxnNiBuZWdhdGVkIGNvbXBhcmVkCi07Ly8gICAgdG8gdGhlIGFib3ZlIGNvZGUgYnV0IGlzIG90aGVyd2lzZSBpZGVudGljYWwuCi07Ly8gMy4gVGhlIHJvdGF0aW9uIGJ5IC1waS84IGNhbiBiZSBwZWZvcm1lZCB1c2luZyB0aHJlZSBtdWx0aXBsaWVzCi07Ly8gICAgRWcgIGMqaTQrcyppNiA9IChpNi1pNCkqcyArIChjK3MpKmk0Ci07Ly8gICAgICAgLXMqaTQrYyppNiA9IChpNi1pNCkqcyArIChjLXMpKmk2Ci07Ly8gNC4gSWYgfFQodSl8PD0xIHRoZW4gZnJvbSB0aGUgSURDVCBkZWZpbml0aW9uLAotOy8vICAgIHxmKHgpfCA8PSAoKDEvc3FydDIpICsgfGMoMSx4KXwgKyAuLiArIHxjKDcseCl8KS8yCi07Ly8gICAgICAgICAgICA9ICgoMS9zcXJ0MikgKyBjb3MocGkvMTYpICsgLi4uICsgY29zKDcqcGkvMTYpKS8yCi07Ly8gICAgICAgICAgICA9ICgoMS9zcXJ0MikgKyAoY290KHBpLzMyKS0xKS8yKS8yCi07Ly8gICAgICAgICAgICA9ICgxICsgY29zKHBpLzE2KSArIGNvcygycGkvMTYpICsgY29zKDNwaS8xNikpL3NxcnQoMikKLTsvLyAgICAgICAgICAgID0gKGFwcHJveCkyLjY0Ci07Ly8gICAgU28gdGhlIG1heCBnYWluIG9mIHRoZSAyRCBJRENUIGlzIH54Ny4wID0gMyBiaXRzLgotOy8vICAgIFRoZSB0YWJsZSBiZWxvdyBzaG93cyBpbnB1dCBwYXR0ZXJucyBnZW5lcmF0aW5nIHRoZSBtYXhpbXVtCi07Ly8gICAgdmFsdWUgb2YgfGYodSl8IGZvciBpbnB1dCBpbiB0aGUgcmFuZ2UgfFQoeCl8PD0xLiBNPS0xLCBQPSsxCi07Ly8gICAgSW5wdXRQYXR0ZXJuICAgICAgTWF4IHxmKHgpfAotOy8vICAgICAgUFBQUFBQUFAgICAgICAgIHxmMHwgPSAgMi42NAotOy8vICAgICAgUFBQTU1NTU0gICAgICAgIHxmMXwgPSAgMi42NAotOy8vICAgICAgUFBNTU1QUFAgICAgICAgIHxmMnwgPSAgMi42NAotOy8vICAgICAgUFBNTVBQTU0gICAgICAgIHxmM3wgPSAgMi42NAotOy8vICAgICAgUE1NUFBNTVAgICAgICAgIHxmNHwgPSAgMi42NAotOy8vICAgICAgUE1NUE1NUE0gICAgICAgIHxmNXwgPSAgMi42NAotOy8vICAgICAgUE1QUE1QTVAgICAgICAgIHxmNnwgPSAgMi42NAotOy8vICAgICAgUE1QTVBNUE0gICAgICAgIHxmN3wgPSAgMi42NAotOy8vICAgTm90ZSB0aGF0IHRoaXMgaW5wdXQgcGF0dGVybiBpcyB0aGUgdHJhbnNwb3NlIG9mIHRoZQotOy8vICAgY29ycmVzcG9uZGluZyBtYXggaW5wdXQgcGF0dGVyIGZvciB0aGUgRkRDVC4KLQotOy8vIEFyZ3VtZW50cwotCi1wU3JjICAgIFJOIDAgICAgOy8vIHNvdXJjZSBkYXRhIGJ1ZmZlcgotU3RyaWRlICBSTiAxICAgIDsvLyBkZXN0aW5hdGlvbiBzdHJpZGUgaW4gYnl0ZXMKLXBEZXN0ICAgUk4gMiAgICA7Ly8gZGVzdGluYXRpb24gZGF0YSBidWZmZXIKLXBTY2FsZSAgUk4gMyAgICA7Ly8gcG9pbnRlciB0byBzY2FsaW5nIHRhYmxlCi0KLQotICAgICAgICA7Ly8gRENUIEludmVyc2UgTWFjcm8KLSAgICAgICAgOy8vIFRoZSBEQ1QgY29kZSBzaG91bGQgYmUgcGFyYW1ldHJpemVkIGFjY29yZGluZwotICAgICAgICA7Ly8gdG8gdGhlIGZvbGxvd2luZyBpbnB1dHM6Ci0gICAgICAgIDsvLyAkb3V0c2l6ZSA9ICJ1OCIgIDogIDgtYml0IHVuc2lnbmVkIGRhdGEgc2F0dXJhdGVkICgwIHRvICsyNTUpCi0gICAgICAgIDsvLyAgICAgICAgICAgICJzOSIgIDogMTYtYml0IHNpZ25lZCBkYXRhIHNhdHVyYXRlZCB0byA5LWJpdCAoLTI1NiB0byArMjU1KQotICAgICAgICA7Ly8gICAgICAgICAgICAiczE2IiA6IDE2LWJpdCBzaWduZWQgZGF0YSBub3Qgc2F0dXJhdGVkIChtYXggc2l6ZSB+Ky8tMTQyNzMpCi0gICAgICAgIDsvLyAkaW5zY2FsZSA9ICJzMTYiIDogc2lnbmVkIDE2LWJpdCBhYW4tc2NhbGUgdGFibGUsIFExNSBmb3JtYXQsIHdpdGggNCBieXRlIGFsaWdubWVudAotICAgICAgICA7Ly8gICAgICAgICAgICAiczMyIiA6IHNpZ25lZCAzMi1iaXQgYWFuLXNjYWxlIHRhYmxlLCBRMjMgZm9ybWF0LCB3aXRoIDQgYnl0ZSBhbGlnbm1lbnQKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dHM6Ci0gICAgICAgIDsvLyBwU3JjICAgPSByMCA9IFBvaW50ZXIgdG8gaW5wdXQgZGF0YQotICAgICAgICA7Ly8gICAgICAgICAgICAgICBSYW5nZSBpcyAtMjU2IHRvICsyNTUgKDktYml0KQotICAgICAgICA7Ly8gU3RyaWRlID0gcjEgPSBTdHJpZGUgYmV0d2VlbiBpbnB1dCBsaW5lcwotICAgICAgICA7Ly8gcERlc3QgID0gcjIgPSBQb2ludGVyIHRvIG91dHB1dCBkYXRhCi0gICAgICAgIDsvLyBwU2NhbGUgPSByMyA9IFBvaW50ZXIgdG8gYWFuLXNjYWxlIHRhYmxlIGluIHRoZSBmb3JtYXQgZGVmaW5lZCBieSAkaW5zY2FsZQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBNX0lEQ1QgICRvdXRzaXplLCAkaW5zY2FsZSwgJHN0cmlkZQotICAgICAgICBMQ0xBICAgIFNISUZUCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgSUYgQVJNMTEzNkpTCi0gICAgICAgIAotOy8vIFJFR0lTVEVSIEFMTE9DQVRJT04KLTsvLyBUaGlzIGlzIGhhcmQgc2luY2Ugd2UgaGF2ZSA4IHZhbHVlcywgOSBmcmVlIHJlZ2lzdGVycyBhbmQgZWFjaAotOy8vIGJ1dHRlcmZseSByZXF1aXJlcyBhIHRlbXBvcmFyeSByZWdpc3Rlci4gV2UgYWxzbyB3YW50IHRvIAotOy8vIG1haW50YWluIHJlZ2lzdGVyIG9yZGVyIHNvIHdlIGNhbiB1c2UgTERNL1NUTS4gVGhlIHRhYmxlIGJlbG93Ci07Ly8gc3VtbWFyaXNlcyB0aGUgcmVnaXN0ZXIgYWxsb2NhdGlvbiB0aGF0IG1lZXRzIGFsbCB0aGVzZSBjcml0ZXJpYS4KLTsvLyBhPTFzdGNvbCwgYj0ybmRjb2wsIGYsZyxoLGkgYXJlIGRhdGFmbG93IHBvaW50cyBkZXNjcmliZWQgYWJvdmUuCi07Ly8KLTsvLyByMSAgYTAxICAgICBnMCAgaDAKLTsvLyByNCAgYjAxIGYwICBnMSAgaDEgIGkwCi07Ly8gcjUgIGEyMyBmMSAgZzIgICAgICBpMQotOy8vIHI2ICBiMjMgZjIgIGczICBoMiAgaTIKLTsvLyByNyAgYTQ1IGYzICAgICAgaDMgIGkzCi07Ly8gcjggIGI0NSBmNCAgZzQgIGg0ICBpNAotOy8vIHI5ICBhNjcgZjUgIGc1ICBoNSAgaTUKLTsvLyByMTAgYjY3IGY2ICBnNiAgaDYgIGk2Ci07Ly8gcjExICAgICBmNyAgZzcgIGg3ICBpNwotOy8vCi1yYTAxICAgIFJOIDEKLXJiMDEgICAgUk4gNAotcmEyMyAgICBSTiA1Ci1yYjIzICAgIFJOIDYKLXJhNDUgICAgUk4gNwotcmI0NSAgICBSTiA4Ci1yYTY3ICAgIFJOIDkKLXJiNjcgICAgUk4gMTAKLXJ0bXAgICAgUk4gMTEKLWNzUGlCeTggUk4gMTIgICA7Ly8gWyAoU2luKHBpLzgpQFExNSksIChDb3MocGkvOClAUTE1KSBdCi1Mb29wUlIyIFJOIDE0ICAgOy8vIFsgTG9vcE51bWJlcjw8MTMgLCAoMS9TcXJ0KDIpKUBRMTUgXQotOy8vIFRyYW5zcG9zZSBhbGxvY2F0aW9uCi14ZnQgICAgIFJOIHJhMDEKLXhmMCAgICAgUk4gcmIwMQoteGYxICAgICBSTiByYTIzCi14ZjIgICAgIFJOIHJiMjMKLXhmMyAgICAgUk4gcmE0NQoteGY0ICAgICBSTiByYjQ1Ci14ZjUgICAgIFJOIHJhNjcKLXhmNiAgICAgUk4gcmI2NwoteGY3ICAgICBSTiBydG1wCi07Ly8gSVN0YWdlIDEgYWxsb2NhdGlvbgoteGcwICAgICBSTiB4ZnQKLXhnMSAgICAgUk4geGYwCi14ZzIgICAgIFJOIHhmMQoteGczICAgICBSTiB4ZjIKLXhndCAgICAgUk4geGYzCi14ZzQgICAgIFJOIHhmNAoteGc1ICAgICBSTiB4ZjUKLXhnNiAgICAgUk4geGY2Ci14ZzcgICAgIFJOIHhmNwotOy8vIElTdGFnZSAyIGFsbG9jYXRpb24KLXhoMCAgICAgUk4geGcwCi14aDEgICAgIFJOIHhnMQoteGh0ICAgICBSTiB4ZzIKLXhoMiAgICAgUk4geGczCi14aDMgICAgIFJOIHhndAoteGg0ICAgICBSTiB4ZzQKLXhoNSAgICAgUk4geGc1Ci14aDYgICAgIFJOIHhnNgoteGg3ICAgICBSTiB4ZzcKLTsvLyBJU3RhZ2UgMyw0IGFsbG9jYXRpb24KLXhpdCAgICAgUk4geGgwCi14aTAgICAgIFJOIHhoMQoteGkxICAgICBSTiB4aHQKLXhpMiAgICAgUk4geGgyCi14aTMgICAgIFJOIHhoMwoteGk0ICAgICBSTiB4aDQKLXhpNSAgICAgUk4geGg1Ci14aTYgICAgIFJOIHhoNgoteGk3ICAgICBSTiB4aDcKLSAgICAgICAgCi0gICAgICAgIE1fU1RSICAgcERlc3QsICBwcERlc3QKLSAgICAgICAgSUYgIiRzdHJpZGUiPSJzIgotICAgICAgICAgICAgTV9TVFIgICBTdHJpZGUsIHBTdHJpZGUKLSAgICAgICAgRU5ESUYKLSAgICAgICAgTV9BRFIgICBwRGVzdCwgIHBCbGsKLSAgICAgICAgTERSICAgICBjc1BpQnk4LCA9MHgzMGZjNzY0MgotICAgICAgICBMRFIgICAgIExvb3BSUjIsID0weDAwMDA1YTgyCi0gIAotdjZfaWRjdF9jb2wkX0YKLSAgICAgICAgOy8vIExvYWQgZXZlbiB2YWx1ZXMKLSAgICAgICAgTERSICAgICB4aTQsIFtwU3JjXSwgIzQgIDsvLyBqMAotICAgICAgICBMRFIgICAgIHhpNSwgW3BTcmMsICM0KjE2LTRdICA7Ly8gajQKLSAgICAgICAgTERSICAgICB4aTYsIFtwU3JjLCAjMioxNi00XSAgOy8vIGoyCi0gICAgICAgIExEUiAgICAgeGk3LCBbcFNyYywgIzYqMTYtNF0gIDsvLyBqNgotICAgICAgICAKLSAgICAgICAgOy8vIFNjYWxlIEV2ZW4gVmFsdWVzCi0gICAgICAgIElGICIkaW5zY2FsZSI9InMxNiIgOy8vIDE2eDE2IG11bAotU0hJRlQgICAgICAgU0VUQSAgICAxMgotICAgICAgICAgICAgTERSICAgICB4aTAsIFtwU2NhbGVdLCAjNAotICAgICAgICAgICAgTERSICAgICB4aTEsIFtwU2NhbGUsICM0KjE2LTRdICAgICAgICAKLSAgICAgICAgICAgIExEUiAgICAgeGkyLCBbcFNjYWxlLCAjMioxNi00XQotICAgICAgICAgICAgTU9WICAgICB4aXQsICMxPDwoU0hJRlQtMSkKLSAgICAgICAgICAgIFNNTEFCQiAgeGkzLCB4aTAsIHhpNCwgeGl0Ci0gICAgICAgICAgICBTTUxBVFQgIHhpNCwgeGkwLCB4aTQsIHhpdAotICAgICAgICAgICAgU01MQUJCICB4aTAsIHhpMSwgeGk1LCB4aXQKLSAgICAgICAgICAgIFNNTEFUVCAgeGk1LCB4aTEsIHhpNSwgeGl0Ci0gICAgICAgICAgICBNT1YgICAgIHhpMywgeGkzLCBBU1IgI1NISUZUCi0gICAgICAgICAgICBQS0hCVCAgIHhpNCwgeGkzLCB4aTQsIExTTCAjKDE2LVNISUZUKQotICAgICAgICAgICAgTERSICAgICB4aTMsIFtwU2NhbGUsICM2KjE2LTRdCi0gICAgICAgICAgICBTTUxBQkIgIHhpMSwgeGkyLCB4aTYsIHhpdAotICAgICAgICAgICAgU01MQVRUICB4aTYsIHhpMiwgeGk2LCB4aXQKLSAgICAgICAgICAgIE1PViAgICAgeGkwLCB4aTAsIEFTUiAjU0hJRlQKLSAgICAgICAgICAgIFBLSEJUICAgeGk1LCB4aTAsIHhpNSwgTFNMICMoMTYtU0hJRlQpCi0gICAgICAgICAgICBTTUxBQkIgIHhpMiwgeGkzLCB4aTcsIHhpdAotICAgICAgICAgICAgU01MQVRUICB4aTcsIHhpMywgeGk3LCB4aXQKLSAgICAgICAgICAgIE1PViAgICAgeGkxLCB4aTEsIEFTUiAjU0hJRlQKLSAgICAgICAgICAgIFBLSEJUICAgeGk2LCB4aTEsIHhpNiwgTFNMICMoMTYtU0hJRlQpCi0gICAgICAgICAgICBNT1YgICAgIHhpMiwgeGkyLCBBU1IgI1NISUZUCi0gICAgICAgICAgICBQS0hCVCAgIHhpNywgeGkyLCB4aTcsIExTTCAjKDE2LVNISUZUKQotICAgICAgICBFTkRJRgotICAgICAgICBJRiAiJGluc2NhbGUiPSJzMzIiIDsvLyAzMngxNiBtdWwKLVNISUZUICAgICAgIFNFVEEgICAgKDEyKzgtMTYpCi0gICAgICAgICAgICBNT1YgICAgIHhpdCwgIzE8PChTSElGVC0xKQotICAgICAgICAgICAgTERSICAgICB4aTAsIFtwU2NhbGVdLCAjOAotICAgICAgICAgICAgTERSICAgICB4aTEsIFtwU2NhbGUsICMwKjMyKzQtOF0KLSAgICAgICAgICAgIExEUiAgICAgeGkyLCBbcFNjYWxlLCAjNCozMi04XQotICAgICAgICAgICAgTERSICAgICB4aTMsIFtwU2NhbGUsICM0KjMyKzQtOF0gICAgICAgICAgICAKLSAgICAgICAgICAgIFNNTEFXQiAgeGkwLCB4aTAsIHhpNCwgeGl0Ci0gICAgICAgICAgICBTTUxBV1QgIHhpMSwgeGkxLCB4aTQsIHhpdAotICAgICAgICAgICAgU01MQVdCICB4aTIsIHhpMiwgeGk1LCB4aXQKLSAgICAgICAgICAgIFNNTEFXVCAgeGkzLCB4aTMsIHhpNSwgeGl0ICAgICAgICAgICAgCi0gICAgICAgICAgICBNT1YgICAgIHhpMCwgeGkwLCBBU1IgI1NISUZUCi0gICAgICAgICAgICBQS0hCVCAgIHhpNCwgeGkwLCB4aTEsIExTTCAjKDE2LVNISUZUKQotICAgICAgICAgICAgTU9WICAgICB4aTIsIHhpMiwgQVNSICNTSElGVCAgICAgICAgICAgIAotICAgICAgICAgICAgUEtIQlQgICB4aTUsIHhpMiwgeGkzLCBMU0wgIygxNi1TSElGVCkKLSAgICAgICAgICAgIExEUiAgICAgeGkwLCBbcFNjYWxlLCAjMiozMi04XQotICAgICAgICAgICAgTERSICAgICB4aTEsIFtwU2NhbGUsICMyKjMyKzQtOF0KLSAgICAgICAgICAgIExEUiAgICAgeGkyLCBbcFNjYWxlLCAjNiozMi04XQotICAgICAgICAgICAgTERSICAgICB4aTMsIFtwU2NhbGUsICM2KjMyKzQtOF0gICAgICAgICAgICAKLSAgICAgICAgICAgIFNNTEFXQiAgeGkwLCB4aTAsIHhpNiwgeGl0Ci0gICAgICAgICAgICBTTUxBV1QgIHhpMSwgeGkxLCB4aTYsIHhpdAotICAgICAgICAgICAgU01MQVdCICB4aTIsIHhpMiwgeGk3LCB4aXQKLSAgICAgICAgICAgIFNNTEFXVCAgeGkzLCB4aTMsIHhpNywgeGl0ICAgICAgICAgICAgCi0gICAgICAgICAgICBNT1YgICAgIHhpMCwgeGkwLCBBU1IgI1NISUZUCi0gICAgICAgICAgICBQS0hCVCAgIHhpNiwgeGkwLCB4aTEsIExTTCAjKDE2LVNISUZUKQotICAgICAgICAgICAgTU9WICAgICB4aTIsIHhpMiwgQVNSICNTSElGVCAgICAgICAgICAgIAotICAgICAgICAgICAgUEtIQlQgICB4aTcsIHhpMiwgeGkzLCBMU0wgIygxNi1TSElGVCkKLSAgICAgICAgRU5ESUYKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIExvYWQgb2RkIHZhbHVlcwotICAgICAgICBMRFIgICAgIHhpMCwgW3BTcmMsICMxKjE2LTRdICAgICAgOy8vIGoxCi0gICAgICAgIExEUiAgICAgeGkxLCBbcFNyYywgIzcqMTYtNF0gICAgICA7Ly8gajcKLSAgICAgICAgTERSICAgICB4aTIsIFtwU3JjLCAjNSoxNi00XSAgICAgIDsvLyBqNQotICAgICAgICBMRFIgICAgIHhpMywgW3BTcmMsICMzKjE2LTRdICAgICAgOy8vIGozCi0gICAgICAgIAotICAgICAgICBJRiAge1RSVUV9Ci0gICAgICAgICAgICA7Ly8gc2hvcnRjdXQgaWYgb2RkIHZhbHVlcyAwCi0gICAgICAgICAgICBURVEgICAgIHhpMCwgIzAKLSAgICAgICAgICAgIFRFUUVRICAgeGkxLCAjMAotICAgICAgICAgICAgVEVRRVEgICB4aTIsICMwCi0gICAgICAgICAgICBURVFFUSAgIHhpMywgIzAKLSAgICAgICAgICAgIEJFUSAgICAgdjZPZGRaZXJvJF9GCi0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICA7Ly8gU3RvcmUgc2NhbGVkIGV2ZW4gdmFsdWVzCi0gICAgICAgIFNUTUlBICAgcERlc3QsIHt4aTQsIHhpNSwgeGk2LCB4aTd9Ci0gICAgICAgIAotICAgICAgICA7Ly8gU2NhbGUgb2RkIHZhbHVlcwotICAgICAgICBJRiAiJGluc2NhbGUiPSJzMTYiCi0gICAgICAgICAgICA7Ly8gUGVyZm9ybSBBQU4gU2NhbGUKLSAgICAgICAgICAgIExEUiAgICAgeGk0LCBbcFNjYWxlLCAjMSoxNi00XQotICAgICAgICAgICAgTERSICAgICB4aTUsIFtwU2NhbGUsICM3KjE2LTRdICAgICAgICAKLSAgICAgICAgICAgIExEUiAgICAgeGk2LCBbcFNjYWxlLCAjNSoxNi00XQotICAgICAgICAgICAgU01MQUJCICB4aTcsIHhpMCwgeGk0LCB4aXQKLSAgICAgICAgICAgIFNNTEFUVCAgeGkwLCB4aTAsIHhpNCwgeGl0Ci0gICAgICAgICAgICBTTUxBQkIgIHhpNCwgeGkxLCB4aTUsIHhpdAotICAgICAgICAgICAgU01MQVRUICB4aTEsIHhpMSwgeGk1LCB4aXQKLSAgICAgICAgICAgIE1PViAgICAgeGk3LCB4aTcsIEFTUiAjU0hJRlQKLSAgICAgICAgICAgIFBLSEJUICAgeGkwLCB4aTcsIHhpMCwgTFNMICMoMTYtU0hJRlQpCi0gICAgICAgICAgICBMRFIgICAgIHhpNywgW3BTY2FsZSwgIzMqMTYtNF0KLSAgICAgICAgICAgIFNNTEFCQiAgeGk1LCB4aTIsIHhpNiwgeGl0Ci0gICAgICAgICAgICBTTUxBVFQgIHhpMiwgeGkyLCB4aTYsIHhpdAotICAgICAgICAgICAgTU9WICAgICB4aTQsIHhpNCwgQVNSICNTSElGVAotICAgICAgICAgICAgUEtIQlQgICB4aTEsIHhpNCwgeGkxLCBMU0wgIygxNi1TSElGVCkKLSAgICAgICAgICAgIFNNTEFCQiAgeGk2LCB4aTMsIHhpNywgeGl0Ci0gICAgICAgICAgICBTTUxBVFQgIHhpMywgeGkzLCB4aTcsIHhpdAotICAgICAgICAgICAgTU9WICAgICB4aTUsIHhpNSwgQVNSICNTSElGVAotICAgICAgICAgICAgUEtIQlQgICB4aTIsIHhpNSwgeGkyLCBMU0wgIygxNi1TSElGVCkKLSAgICAgICAgICAgIE1PViAgICAgeGk2LCB4aTYsIEFTUiAjU0hJRlQKLSAgICAgICAgICAgIFBLSEJUICAgeGkzLCB4aTYsIHhpMywgTFNMICMoMTYtU0hJRlQpCi0gICAgICAgIEVORElGCi0gICAgICAgIElGICIkaW5zY2FsZSI9InMzMiIgOy8vIDMyeDE2IG11bAotICAgICAgICAgICAgTERSICAgICB4aTQsIFtwU2NhbGUsICMxKjMyLThdCi0gICAgICAgICAgICBMRFIgICAgIHhpNSwgW3BTY2FsZSwgIzEqMzIrNC04XQotICAgICAgICAgICAgTERSICAgICB4aTYsIFtwU2NhbGUsICM3KjMyLThdCi0gICAgICAgICAgICBMRFIgICAgIHhpNywgW3BTY2FsZSwgIzcqMzIrNC04XSAgICAgICAgICAgIAotICAgICAgICAgICAgU01MQVdCICB4aTQsIHhpNCwgeGkwLCB4aXQKLSAgICAgICAgICAgIFNNTEFXVCAgeGk1LCB4aTUsIHhpMCwgeGl0Ci0gICAgICAgICAgICBTTUxBV0IgIHhpNiwgeGk2LCB4aTEsIHhpdAotICAgICAgICAgICAgU01MQVdUICB4aTcsIHhpNywgeGkxLCB4aXQgICAgICAgICAgICAKLSAgICAgICAgICAgIE1PViAgICAgeGk0LCB4aTQsIEFTUiAjU0hJRlQKLSAgICAgICAgICAgIFBLSEJUICAgeGkwLCB4aTQsIHhpNSwgTFNMICMoMTYtU0hJRlQpCi0gICAgICAgICAgICBNT1YgICAgIHhpNiwgeGk2LCBBU1IgI1NISUZUICAgICAgICAgICAgCi0gICAgICAgICAgICBQS0hCVCAgIHhpMSwgeGk2LCB4aTcsIExTTCAjKDE2LVNISUZUKQotICAgICAgICAgICAgTERSICAgICB4aTQsIFtwU2NhbGUsICM1KjMyLThdCi0gICAgICAgICAgICBMRFIgICAgIHhpNSwgW3BTY2FsZSwgIzUqMzIrNC04XQotICAgICAgICAgICAgTERSICAgICB4aTYsIFtwU2NhbGUsICMzKjMyLThdCi0gICAgICAgICAgICBMRFIgICAgIHhpNywgW3BTY2FsZSwgIzMqMzIrNC04XSAgICAgICAgICAgIAotICAgICAgICAgICAgU01MQVdCICB4aTQsIHhpNCwgeGkyLCB4aXQKLSAgICAgICAgICAgIFNNTEFXVCAgeGk1LCB4aTUsIHhpMiwgeGl0Ci0gICAgICAgICAgICBTTUxBV0IgIHhpNiwgeGk2LCB4aTMsIHhpdAotICAgICAgICAgICAgU01MQVdUICB4aTcsIHhpNywgeGkzLCB4aXQgICAgICAgICAgICAKLSAgICAgICAgICAgIE1PViAgICAgeGk0LCB4aTQsIEFTUiAjU0hJRlQKLSAgICAgICAgICAgIFBLSEJUICAgeGkyLCB4aTQsIHhpNSwgTFNMICMoMTYtU0hJRlQpCi0gICAgICAgICAgICBNT1YgICAgIHhpNiwgeGk2LCBBU1IgI1NISUZUICAgICAgICAgICAgCi0gICAgICAgICAgICBQS0hCVCAgIHhpMywgeGk2LCB4aTcsIExTTCAjKDE2LVNISUZUKQotICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgICAgTERSICAgICB4aXQsID0weDAwMDEwMDAxICAgICAgICA7Ly8gcm91bmRpbmcgY29uc3RhbnQKLSAgICAgICAgU0FERDE2IHhpNSwgeGkwLCB4aTEgICAgICAgICAgIDsvLyAoajErajcpLzIKLSAgICAgICAgU0hBREQxNiB4aTUsIHhpNSwgeGl0Ci0gICAgICAgIAotICAgICAgICBTU1VCMTYgIHhpNiwgeGkwLCB4aTEgICAgICAgICAgIDsvLyBqMS1qNwotICAgICAgICBTQUREMTYgeGk3LCB4aTIsIHhpMyAgICAgICAgICAgOy8vIChqNStqMykvMgotICAgICAgICBTSEFERDE2IHhpNywgeGk3LCB4aXQKLSAgICAgICAgCi0gICAgICAgIFNTVUIxNiAgeGk0LCB4aTIsIHhpMyAgICAgICAgICAgOy8vIGo1LWozCi0gICAgICAgIAotICAgICAgICBTU1VCMTYgIHhpMywgeGk1LCB4aTcgICAgICAgICAgIDsvLyAoaTUtaTcpLzIKLSAgICAgICAgCi0gICAgICAgIFBLSEJUICAgeGkwLCB4aTYsIHhpNCwgTFNMIzE2ICAgOy8vIFtpNCxpNl0gcm93IGEKLSAgICAgICAgUEtIVEIgICB4aTEsIHhpNCwgeGk2LCBBU1IjMTYgICA7Ly8gW2k0LGk2XSByb3cgYgotICAgICAgICAKLSAgICAgICAgU01VQURYICB4aTIsIHhpMCwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YSBieSBbYyxzXQotICAgICAgICBTTVVBRFggIHhpNCwgeGkxLCBjc1BpQnk4ICAgICAgIDsvLyByb3diIGJ5IFtjLHNdCi0gICAgICAgIFNNVVNEICAgeGkwLCB4aTAsIGNzUGlCeTggICAgICAgOy8vIHJvd2EgYnkgWy1zLGNdICAgCi0gICAgICAgIFNNVVNEICAgeGk2LCB4aTEsIGNzUGlCeTggICAgICAgOy8vIHJvd2IgYnkgWy1zLGNdCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIFNNVUxCQiAgeGkxLCB4aTMsIExvb3BSUjIKLSAgICAgICAgU01VTFRCICB4aTMsIHhpMywgTG9vcFJSMgotICAgICAgICAgICAgICAgIAotICAgICAgICBQS0hUQiAgIHhoNCwgeGk0LCB4aTIsIEFTUiMxNiAgIDsvLyBoNC80Ci0gICAgICAgIFBLSFRCICAgeGg2LCB4aTYsIHhpMCwgQVNSIzE2ICAgOy8vIGg2LzQKLSAgICAgICAgU0hBREQxNiB4aDcsIHhpNSwgeGk3ICAgICAgICAgICA7Ly8gKGk1K2k3KS80Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyB4aTAseGkxLHhpMix4aTMgbm93IGZyZWUKLSAgICAgICAgOy8vIElTdGFnZSA0LDMsIHJvd3MgMnRvMyB4MS8yCi0gICAgICAgIAotICAgICAgICBNT1YgICAgIHhpMywgeGkzLCBMU0wgIzEKLSAgICAgICAgUEtIVEIgICB4aDUsIHhpMywgeGkxLCBBU1IjMTUgICA7Ly8gaDUvNAotICAgICAgICBMRFJEICAgIHhpMCwgW3BEZXN0LCAjOF0gICAgICAgIDsvLyBqMixqNiBzY2FsZWQKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIElTdGFnZSAyLCByb3dzNHRvNwotICAgICAgICBTU1VCMTYgIHhnNiwgeGg2LCB4aDcKLSAgICAgICAgU1NVQjE2ICB4ZzUsIHhoNSwgeGc2ICAgICAgICAKLSAgICAgICAgU1NVQjE2ICB4ZzQsIHhoNCwgeGc1Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIFNTVUIxNiAgeGkyLCB4aTAsIHhpMSAgICAgICAgICAgOy8vIChqMi1qNikKLSAgICAgICAgCi0gICAgICAgIFNIQUREMTYgeGkzLCB4aTAsIHhpMSAgICAgICAgICAgOy8vIChqMitqNikvMgotICAgICAgICAKLSAgICAgICAgU01VTEJCICB4aTAsIHhpMiwgTG9vcFJSMgotICAgICAgICBTTVVMVEIgIHhpMiwgeGkyLCBMb29wUlIyCi0gICAgICAgIAotICAgICAgICBNT1YgICAgIHhpMiwgeGkyLCBMU0wgIzEKLSAgICAgICAgUEtIVEIgICB4aDIsIHhpMiwgeGkwLCBBU1IjMTUgICA7Ly8gaTIqc3FydCgyKS80Ci0gICAgICAgIAotICAgICAgICA7Ly8geGkwLCB4aTEgbm93IGZyZWUKLSAgICAgICAgOy8vIElTdGFnZSA0LDMgcm93cyAwdG8xIHggMS8yCi0gICAgICAgIExEUkQgICAgeGkwLCBbcERlc3RdICAgICAgICAgICAgOy8vIGowLCBqNCBzY2FsZWQKLSAgICAgICAgU1NVQjE2ICB4aDIsIHhoMiwgeGkzCi0gICAgICAgIEFERFMgICAgTG9vcFJSMiwgTG9vcFJSMiwgIzI8PDI5ICAgIDsvLyBkb25lIHR3byByb3dzCi0gICAgICAgIAotICAgICAgICBTSEFERDE2IHhoMCwgeGkwLCB4aTEKLSAgICAgICAgU0hTVUIxNiB4aDEsIHhpMCwgeGkxICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIElTdGFnZSAyIHJvd3MgMHRvMyB4IDEvMgotICAgICAgICBTSFNVQjE2IHhnMiwgeGgxLCB4aDIKLSAgICAgICAgU0hBREQxNiB4ZzEsIHhoMSwgeGgyCi0gICAgICAgIFNIU1VCMTYgeGczLCB4aDAsIHhoMwotICAgICAgICBTSEFERDE2IHhnMCwgeGgwLCB4aDMKLSAgICAgICAgCi0gICAgICAgIDsvLyBJU3RhZ2UgMSBhbGwgcm93cwotICAgICAgICBTQUREMTYgIHhmMywgeGczLCB4ZzQKLSAgICAgICAgU1NVQjE2ICB4ZjQsIHhnMywgeGc0Ci0gICAgICAgIFNBREQxNiAgeGYyLCB4ZzIsIHhnNQotICAgICAgICBTU1VCMTYgIHhmNSwgeGcyLCB4ZzUKLSAgICAgICAgU0FERDE2ICB4ZjEsIHhnMSwgeGc2Ci0gICAgICAgIFNTVUIxNiAgeGY2LCB4ZzEsIHhnNgotICAgICAgICBTQUREMTYgIHhmMCwgeGcwLCB4ZzcKLSAgICAgICAgU1NVQjE2ICB4ZjcsIHhnMCwgeGc3Ci0gICAgICAgIAotICAgICAgICA7Ly8gVHJhbnNwb3NlLCBzdG9yZSBhbmQgbG9vcAotICAgICAgICBQS0hCVCAgIHJhMDEsIHhmMCwgeGYxLCBMU0wgIzE2Ci0gICAgICAgIFBLSFRCICAgcmIwMSwgeGYxLCB4ZjAsIEFTUiAjMTYKLSAgICAgICAgCi0gICAgICAgIFBLSEJUICAgcmEyMywgeGYyLCB4ZjMsIExTTCAjMTYKLSAgICAgICAgUEtIVEIgICByYjIzLCB4ZjMsIHhmMiwgQVNSICMxNgotICAgICAgICAKLSAgICAgICAgUEtIQlQgICByYTQ1LCB4ZjQsIHhmNSwgTFNMICMxNgotICAgICAgICBQS0hUQiAgIHJiNDUsIHhmNSwgeGY0LCBBU1IgIzE2Ci0gICAgICAgIAotICAgICAgICBQS0hCVCAgIHJhNjcsIHhmNiwgeGY3LCBMU0wgIzE2Ci0gICAgICAgIFNUTUlBICAgcERlc3QhLCB7cmEwMSwgcmEyMywgcmE0NSwgcmE2N30gICAgICAKLSAgICAgICAgUEtIVEIgICByYjY3LCB4ZjcsIHhmNiwgQVNSICMxNgotICAgICAgICBTVE1JQSAgIHBEZXN0ISwge3JiMDEsIHJiMjMsIHJiNDUsIHJiNjd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIEJDQyAgICAgdjZfaWRjdF9jb2wkX0YKLSAgICAgICAgCi0gICAgICAgIFNVQiAgICAgcFNyYywgcERlc3QsICMoNjQqMikKLSAgICAgICAgTV9MRFIgICBwRGVzdCwgcHBEZXN0Ci0gICAgICAgIElGICIkc3RyaWRlIj0icyIKLSAgICAgICAgICAgIE1fTERSICAgcFNjYWxlLCBwU3RyaWRlIAotICAgICAgICBFTkRJRgotICAgICAgICBCICAgICAgIHY2X2lkY3Rfcm93JF9GCi0gICAgICAgIAotdjZPZGRaZXJvJF9GCi0gICAgICAgIFNTVUIxNiAgeGkyLCB4aTYsIHhpNyAgICAgICAgICAgOy8vIChqMi1qNikKLSAgICAgICAgU0hBREQxNiB4aTMsIHhpNiwgeGk3ICAgICAgICAgICA7Ly8gKGoyK2o2KS8yCi0gICAgICAgIAotICAgICAgICBTTVVMQkIgIHhpMCwgeGkyLCBMb29wUlIyCi0gICAgICAgIFNNVUxUQiAgeGkyLCB4aTIsIExvb3BSUjIKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgeGkyLCB4aTIsIExTTCAjMQotICAgICAgICBQS0hUQiAgIHhoMiwgeGkyLCB4aTAsIEFTUiMxNSAgIDsvLyBpMipzcXJ0KDIpLzQKLSAgICAgICAgU1NVQjE2ICB4aDIsIHhoMiwgeGkzCi0gICAgICAgIAotICAgICAgICA7Ly8geGkwLCB4aTEgbm93IGZyZWUKLSAgICAgICAgOy8vIElTdGFnZSA0LDMgcm93cyAwdG8xIHggMS8yCi0gICAgICAgIAotICAgICAgICBTSEFERDE2IHhoMCwgeGk0LCB4aTUKLSAgICAgICAgU0hTVUIxNiB4aDEsIHhpNCwgeGk1ICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIElTdGFnZSAyIHJvd3MgMHRvMyB4IDEvMgotICAgICAgICBTSFNVQjE2IHhnMiwgeGgxLCB4aDIKLSAgICAgICAgU0hBREQxNiB4ZzEsIHhoMSwgeGgyCi0gICAgICAgIFNIU1VCMTYgeGczLCB4aDAsIHhoMwotICAgICAgICBTSEFERDE2IHhnMCwgeGgwLCB4aDMKLSAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gSVN0YWdlIDEgYWxsIHJvd3MKLSAgICAgICAgTU9WICB4ZjMsIHhnMwotICAgICAgICBNT1YgIHhmNCwgeGczCi0gICAgICAgIE1PViAgeGYyLCB4ZzIKLSAgICAgICAgTU9WICB4ZjUsIHhnMgotICAgICAgICBNT1YgIHhmMSwgeGcxCi0gICAgICAgIE1PViAgeGY2LCB4ZzEKLSAgICAgICAgTU9WICB4ZjAsIHhnMAotICAgICAgICBNT1YgIHhmNywgeGcwCi0gICAgICAgIAotICAgICAgICA7Ly8gVHJhbnNwb3NlCi0gICAgICAgIFBLSEJUICAgcmEwMSwgeGYwLCB4ZjEsIExTTCAjMTYKLSAgICAgICAgUEtIVEIgICByYjAxLCB4ZjEsIHhmMCwgQVNSICMxNgotICAgICAgICAKLSAgICAgICAgUEtIQlQgICByYTIzLCB4ZjIsIHhmMywgTFNMICMxNgotICAgICAgICBQS0hUQiAgIHJiMjMsIHhmMywgeGYyLCBBU1IgIzE2Ci0gICAgICAgIAotICAgICAgICBQS0hCVCAgIHJhNDUsIHhmNCwgeGY1LCBMU0wgIzE2Ci0gICAgICAgIFBLSFRCICAgcmI0NSwgeGY1LCB4ZjQsIEFTUiAjMTYKLSAgICAgICAgCi0gICAgICAgIFBLSEJUICAgcmE2NywgeGY2LCB4ZjcsIExTTCAjMTYKLSAgICAgICAgUEtIVEIgICByYjY3LCB4ZjcsIHhmNiwgQVNSICMxNgotICAgICAgICAgICAgICAgIAotICAgICAgICBTVE1JQSAgIHBEZXN0ISwge3JhMDEsIHJhMjMsIHJhNDUsIHJhNjd9ICAgICAgCi0gICAgICAgIEFERFMgICAgTG9vcFJSMiwgTG9vcFJSMiwgIzI8PDI5ICAgIDsvLyBkb25lIHR3byByb3dzCi0gICAgICAgIFNUTUlBICAgcERlc3QhLCB7cmIwMSwgcmIyMywgcmI0NSwgcmI2N30gICAgICAKLSAgICAgICAgCi0gICAgICAgIEJDQyAgICAgdjZfaWRjdF9jb2wkX0YKLSAgICAgICAgU1VCICAgICBwU3JjLCBwRGVzdCwgIyg2NCoyKQotICAgICAgICBNX0xEUiAgIHBEZXN0LCBwcERlc3QKLSAgICAgICAgSUYgIiRzdHJpZGUiPSJzIgotICAgICAgICAgICAgTV9MRFIgICBwU2NhbGUsIHBTdHJpZGUgCi0gICAgICAgIEVORElGCi0gICAgICAgICAgICAgICAKLSAgICAgICAgCi12Nl9pZGN0X3JvdyRfRgotICAgICAgICA7Ly8gSVN0YWdlIDQsMywgcm93czR0bzcgeDEvNAotICAgICAgICBMRFIgICAgIHhpdCwgPTB4MDAwMTAwMDEgICAgICAgIDsvLyByb3VuZGluZyBjb25zdGFudAotICAgICAgICBMRFIgICAgIHhpMCwgW3BTcmMsICMxKjE2XSAgICAgIDsvLyBqMQotICAgICAgICBMRFIgICAgIHhpMSwgW3BTcmMsICM3KjE2XSAgICAgIDsvLyA0Kmo3Ci0gICAgICAgIExEUiAgICAgeGkyLCBbcFNyYywgIzUqMTZdICAgICAgOy8vIGo1Ci0gICAgICAgIExEUiAgICAgeGkzLCBbcFNyYywgIzMqMTZdICAgICAgOy8vIGozCi0gICAgICAgIAotICAgICAgICBTSEFERDE2IHhpMSwgeGkxLCB4aXQgICAgICAgICAgIDsvLyAyKmo3Ci0gICAgICAgIFNIQUREMTYgeGkxLCB4aTEsIHhpdCAgICAgICAgICAgOy8vIGo3ICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgU0hBREQxNiB4aTUsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gKGoxK2o3KS8yCi0gICAgICAgIFNTVUIxNiAgeGk2LCB4aTAsIHhpMSAgICAgICAgICAgOy8vIGoxLWo3Ci0gICAgICAgIFNIQUREMTYgeGk3LCB4aTIsIHhpMyAgICAgICAgICAgOy8vIChqNStqMykvMgotICAgICAgICBTU1VCMTYgIHhpNCwgeGkyLCB4aTMgICAgICAgICAgIDsvLyBqNS1qMwotICAgICAgICAKLSAgICAgICAgU1NVQjE2ICB4aTMsIHhpNSwgeGk3ICAgICAgICAgICA7Ly8gKGk1LWk3KS8yCi0gICAgICAgIAotICAgICAgICBQS0hCVCAgIHhpMCwgeGk2LCB4aTQsIExTTCMxNiAgIDsvLyBbaTQsaTZdIHJvdyBhCi0gICAgICAgIFBLSFRCICAgeGkxLCB4aTQsIHhpNiwgQVNSIzE2ICAgOy8vIFtpNCxpNl0gcm93IGIKLSAgICAgICAgCi0gICAgICAgIFNNVUFEWCAgeGkyLCB4aTAsIGNzUGlCeTggICAgICAgOy8vIHJvd2EgYnkgW2Msc10KLSAgICAgICAgU01VQURYICB4aTQsIHhpMSwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YiBieSBbYyxzXQotICAgICAgICBTTVVTRCAgIHhpMCwgeGkwLCBjc1BpQnk4ICAgICAgIDsvLyByb3dhIGJ5IFstcyxjXSAgIAotICAgICAgICBTTVVTRCAgIHhpNiwgeGkxLCBjc1BpQnk4ICAgICAgIDsvLyByb3diIGJ5IFstcyxjXQotICAgICAgICAgICAgICAgIAotICAgICAgICBTTVVMQkIgIHhpMSwgeGkzLCBMb29wUlIyCi0gICAgICAgIFNNVUxUQiAgeGkzLCB4aTMsIExvb3BSUjIKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgUEtIVEIgICB4aDQsIHhpNCwgeGkyLCBBU1IjMTYgICA7Ly8gaDQvNAotICAgICAgICBQS0hUQiAgIHhoNiwgeGk2LCB4aTAsIEFTUiMxNiAgIDsvLyBoNi80Ci0gICAgICAgIFNIQUREMTYgeGg3LCB4aTUsIHhpNyAgICAgICAgICAgOy8vIChpNStpNykvNAotICAgICAgICAKLSAgICAgICAgTU9WICAgICB4aTMsIHhpMywgTFNMICMxCi0gICAgICAgIFBLSFRCICAgeGg1LCB4aTMsIHhpMSwgQVNSIzE1ICAgOy8vIGg1LzQKLSAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8geGkwLHhpMSx4aTIseGkzIG5vdyBmcmVlCi0gICAgICAgIDsvLyBJU3RhZ2UgNCwzLCByb3dzIDJ0bzMgeDEvMgotICAgICAgICAKLSAgICAgICAgTERSICAgICB4aTAsIFtwU3JjLCAjMioxNl0gICAgICA7Ly8gajIKLSAgICAgICAgTERSICAgICB4aTEsIFtwU3JjLCAjNioxNl0gICAgICA7Ly8gMipqNgotICAgICAgICAKLSAgICAgICAgOy8vIElTdGFnZSAyLCByb3dzNHRvNwotICAgICAgICBTU1VCMTYgIHhnNiwgeGg2LCB4aDcKLSAgICAgICAgU1NVQjE2ICB4ZzUsIHhoNSwgeGc2Ci0gICAgICAgIFNTVUIxNiAgeGc0LCB4aDQsIHhnNQotICAgICAgICAKLSAgICAgICAgU0hBREQxNiB4aTEsIHhpMSwgeGl0ICAgICAgICAgICA7Ly8gajYKLSAgICAgICAgU1NVQjE2ICB4aTIsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gKGoyLWo2KSAgICAgICAgCi0gICAgICAgIFNIQUREMTYgeGkzLCB4aTAsIHhpMSAgICAgICAgICAgOy8vIChqMitqNikvMgotICAgICAgICAKLSAgICAgICAgU01VTEJCICB4aTAsIHhpMiwgTG9vcFJSMgotICAgICAgICBTTVVMVEIgIHhpMiwgeGkyLCBMb29wUlIyCi0gICAgICAgIAotICAgICAgICBNT1YgICAgIHhpMiwgeGkyLCBMU0wgIzEKLSAgICAgICAgCi0gICAgICAgIFBLSFRCICAgeGgyLCB4aTIsIHhpMCwgQVNSIzE1ICAgOy8vIGkyKnNxcnQoMikvNAotICAgICAgICAKLSAgICAgICAgOy8vIHhpMCwgeGkxIG5vdyBmcmVlCi0gICAgICAgIDsvLyBJU3RhZ2UgNCwzIHJvd3MgMHRvMSB4IDEvMgotICAgICAgICBMRFIgICAgIHhpMSwgW3BTcmMsICM0KjE2XSAgICAgIDsvLyBqNAotICAgICAgICBMRFIgICAgIHhpMCwgW3BTcmNdLCAjNCAgICAgICAgIDsvLyBqMAotCi0gICAgICAgIFNTVUIxNiAgeGgyLCB4aDIsIHhpMwotICAgICAgICBBRERTICAgIExvb3BSUjIsIExvb3BSUjIsICMyPDwyOSAgICA7Ly8gZG9uZSB0d28gcm93cwotICAgICAgICAKLSAgICAgICAgQUREICAgICB4aTAsIHhpMCwgeGl0LCBMU0wgIzIgICA7Ly8gZW5zdXJlIGNvcnJlY3Qgcm91bmQKLSAgICAgICAgU0hBREQxNiB4aDAsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gb2YgREMgcmVzdWx0Ci0gICAgICAgIFNIU1VCMTYgeGgxLCB4aTAsIHhpMQotICAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gSVN0YWdlIDIgcm93cyAwdG8zIHggMS8yCi0gICAgICAgIFNIU1VCMTYgeGcyLCB4aDEsIHhoMgotICAgICAgICBTSEFERDE2IHhnMSwgeGgxLCB4aDIKLSAgICAgICAgU0hTVUIxNiB4ZzMsIHhoMCwgeGgzCi0gICAgICAgIFNIQUREMTYgeGcwLCB4aDAsIHhoMwotICAgICAgICAKLSAgICAgICAgOy8vIElTdGFnZSAxIGFsbCByb3dzCi0gICAgICAgIFNIQUREMTYgeGYzLCB4ZzMsIHhnNAotICAgICAgICBTSFNVQjE2IHhmNCwgeGczLCB4ZzQKLSAgICAgICAgU0hBREQxNiB4ZjIsIHhnMiwgeGc1Ci0gICAgICAgIFNIU1VCMTYgeGY1LCB4ZzIsIHhnNQotICAgICAgICBTSEFERDE2IHhmMSwgeGcxLCB4ZzYKLSAgICAgICAgU0hTVUIxNiB4ZjYsIHhnMSwgeGc2Ci0gICAgICAgIFNIQUREMTYgeGYwLCB4ZzAsIHhnNwotICAgICAgICBTSFNVQjE2IHhmNywgeGcwLCB4ZzcKLSAgICAgICAgCi0gICAgICAgIDsvLyBTYXR1cmF0ZQotICAgICAgICBJRiAoIiRvdXRzaXplIj0idTgiKQotICAgICAgICAgICAgVVNBVDE2ICB4ZjAsICM4LCB4ZjAKLSAgICAgICAgICAgIFVTQVQxNiAgeGYxLCAjOCwgeGYxCi0gICAgICAgICAgICBVU0FUMTYgIHhmMiwgIzgsIHhmMgotICAgICAgICAgICAgVVNBVDE2ICB4ZjMsICM4LCB4ZjMKLSAgICAgICAgICAgIFVTQVQxNiAgeGY0LCAjOCwgeGY0Ci0gICAgICAgICAgICBVU0FUMTYgIHhmNSwgIzgsIHhmNQotICAgICAgICAgICAgVVNBVDE2ICB4ZjYsICM4LCB4ZjYKLSAgICAgICAgICAgIFVTQVQxNiAgeGY3LCAjOCwgeGY3ICAgICAgICAKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgKCIkb3V0c2l6ZSI9InM5IikKLSAgICAgICAgICAgIFNTQVQxNiAgeGYwLCAjOSwgeGYwCi0gICAgICAgICAgICBTU0FUMTYgIHhmMSwgIzksIHhmMQotICAgICAgICAgICAgU1NBVDE2ICB4ZjIsICM5LCB4ZjIKLSAgICAgICAgICAgIFNTQVQxNiAgeGYzLCAjOSwgeGYzCi0gICAgICAgICAgICBTU0FUMTYgIHhmNCwgIzksIHhmNAotICAgICAgICAgICAgU1NBVDE2ICB4ZjUsICM5LCB4ZjUKLSAgICAgICAgICAgIFNTQVQxNiAgeGY2LCAjOSwgeGY2Ci0gICAgICAgICAgICBTU0FUMTYgIHhmNywgIzksIHhmNyAgICAgICAgCi0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICA7Ly8gVHJhbnNwb3NlIHRvIFJvdywgUGFjayBhbmQgc3RvcmUKLSAgICAgICAgSUYgKCIkb3V0c2l6ZSI9InU4IikKLSAgICAgICAgICAgIE9SUiAgICAgeGYwLCB4ZjAsIHhmMSwgTFNMICM4IDsvLyBbIGIxIGIwIGExIGEwIF0KLSAgICAgICAgICAgIE9SUiAgICAgeGYyLCB4ZjIsIHhmMywgTFNMICM4IDsvLyBbIGIzIGIyIGEzIGEyIF0KLSAgICAgICAgICAgIE9SUiAgICAgeGY0LCB4ZjQsIHhmNSwgTFNMICM4IDsvLyBbIGI1IGI0IGE1IGE0IF0KLSAgICAgICAgICAgIE9SUiAgICAgeGY2LCB4ZjYsIHhmNywgTFNMICM4IDsvLyBbIGI3IGI2IGE3IGE2IF0KLSAgICAgICAgICAgIFBLSEJUICAgcmEwMSwgeGYwLCB4ZjIsIExTTCAjMTYKLSAgICAgICAgICAgIFBLSFRCICAgcmIwMSwgeGYyLCB4ZjAsIEFTUiAjMTYKLSAgICAgICAgICAgIFBLSEJUICAgcmEyMywgeGY0LCB4ZjYsIExTTCAjMTYKLSAgICAgICAgICAgIFBLSFRCICAgcmIyMywgeGY2LCB4ZjQsIEFTUiAjMTYKLSAgICAgICAgICAgIFNUTUlBICAgcERlc3QsIHtyYTAxLCByYTIzfQotICAgICAgICAgICAgSUYgIiRzdHJpZGUiPSJzIgotICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCBwU2NhbGUKLSAgICAgICAgICAgICAgICBTVE1JQSAgIHBEZXN0LCB7cmIwMSwgcmIyM30KLSAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgcFNjYWxlCi0gICAgICAgICAgICBFTFNFICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCAjKCRzdHJpZGUpCi0gICAgICAgICAgICAgICAgU1RNSUEgICBwRGVzdCwge3JiMDEsIHJiMjN9Ci0gICAgICAgICAgICAgICAgQUREICAgICBwRGVzdCwgcERlc3QsICMoJHN0cmlkZSkKLSAgICAgICAgICAgIEVORElGCi0gICAgICAgIEVORElGCi0gICAgICAgIElGICgiJG91dHNpemUiPSJzOSIpOkxPUjooIiRvdXRzaXplIj0iczE2IikgICAgICAgIAotICAgICAgICAgICAgUEtIQlQgICByYTAxLCB4ZjAsIHhmMSwgTFNMICMxNgotICAgICAgICAgICAgUEtIVEIgICByYjAxLCB4ZjEsIHhmMCwgQVNSICMxNgotICAgICAgICAKLSAgICAgICAgICAgIFBLSEJUICAgcmEyMywgeGYyLCB4ZjMsIExTTCAjMTYKLSAgICAgICAgICAgIFBLSFRCICAgcmIyMywgeGYzLCB4ZjIsIEFTUiAjMTYKLSAgICAgICAgICAgIAotICAgICAgICAgICAgUEtIQlQgICByYTQ1LCB4ZjQsIHhmNSwgTFNMICMxNgotICAgICAgICAgICAgUEtIVEIgICByYjQ1LCB4ZjUsIHhmNCwgQVNSICMxNgotICAgICAgICAgICAgCi0gICAgICAgICAgICBQS0hCVCAgIHJhNjcsIHhmNiwgeGY3LCBMU0wgIzE2Ci0gICAgICAgICAgICBQS0hUQiAgIHJiNjcsIHhmNywgeGY2LCBBU1IgIzE2Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFNUTUlBICAgcERlc3QsIHtyYTAxLCByYTIzLCByYTQ1LCByYTY3fSAgICAgIAotICAgICAgICAgICAgSUYgIiRzdHJpZGUiPSJzIgotICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCBwU2NhbGUKLSAgICAgICAgICAgICAgICBTVE1JQSAgIHBEZXN0LCB7cmIwMSwgcmIyMywgcmI0NSwgcmI2N30gICAgICAKLSAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgcFNjYWxlCi0gICAgICAgICAgICBFTFNFICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCAjKCRzdHJpZGUpCi0gICAgICAgICAgICAgICAgU1RNSUEgICBwRGVzdCwge3JiMDEsIHJiMjMsIHJiNDUsIHJiNjd9ICAgICAgCi0gICAgICAgICAgICAgICAgQUREICAgICBwRGVzdCwgcERlc3QsICMoJHN0cmlkZSkKLSAgICAgICAgICAgIEVORElGCi0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICBCQ0MgICAgIHY2X2lkY3Rfcm93JF9GCi0gICAgICAgIEVORElGIDsvLyBBUk0xMTM2SlMKLQotCi0gICAgICAgIElGIENvcnRleEE4Ci0gICAgICAgIAotU3JjMCAgICAgICAgICAgIEVRVSAgNyAgICAgICAgICAgICAgCi1TcmMxICAgICAgICAgICAgRVFVICA4ICAgICAgICAgICAgICAKLVNyYzIgICAgICAgICAgICBFUVUgIDkgICAgICAgICAgICAgIAotU3JjMyAgICAgICAgICAgIEVRVSAgMTAgICAgICAgICAgICAgIAotU3JjNCAgICAgICAgICAgIEVRVSAgMTEgICAgICAgICAgICAgIAotU3JjNSAgICAgICAgICAgIEVRVSAgMTIgICAgICAgICAgICAgIAotU3JjNiAgICAgICAgICAgIEVRVSAgMTMKLVNyYzcgICAgICAgICAgICBFUVUgIDE0Ci1UbXAgICAgICAgICAgICAgRVFVICAxNQotCi1xWGowICAgICAgICAgICAgUU4gU3JjMC5TMTYgCi1xWGoxICAgICAgICAgICAgUU4gU3JjMS5TMTYKLXFYajIgICAgICAgICAgICBRTiBTcmMyLlMxNgotcVhqMyAgICAgICAgICAgIFFOIFNyYzMuUzE2Ci1xWGo0ICAgICAgICAgICAgUU4gU3JjNC5TMTYKLXFYajUgICAgICAgICAgICBRTiBTcmM1LlMxNgotcVhqNiAgICAgICAgICAgIFFOIFNyYzYuUzE2Ci1xWGo3ICAgICAgICAgICAgUU4gU3JjNy5TMTYKLXFYanQgICAgICAgICAgICBRTiBUbXAuUzE2Ci0KLWRYajBsbyAgICAgICAgICBETiAoU3JjMCoyKS5TMTYKLWRYajBoaSAgICAgICAgICBETiAoU3JjMCoyKzEpLlMxNgotZFhqMWxvICAgICAgICAgIEROIChTcmMxKjIpLlMxNgotZFhqMWhpICAgICAgICAgIEROIChTcmMxKjIrMSkuUzE2Ci1kWGoybG8gICAgICAgICAgRE4gKFNyYzIqMikuUzE2Ci1kWGoyaGkgICAgICAgICAgRE4gKFNyYzIqMisxKS5TMTYKLWRYajNsbyAgICAgICAgICBETiAoU3JjMyoyKS5TMTYKLWRYajNoaSAgICAgICAgICBETiAoU3JjMyoyKzEpLlMxNgotZFhqNGxvICAgICAgICAgIEROIChTcmM0KjIpLlMxNgotZFhqNGhpICAgICAgICAgIEROIChTcmM0KjIrMSkuUzE2Ci1kWGo1bG8gICAgICAgICAgRE4gKFNyYzUqMikuUzE2Ci1kWGo1aGkgICAgICAgICAgRE4gKFNyYzUqMisxKS5TMTYKLWRYajZsbyAgICAgICAgICBETiAoU3JjNioyKS5TMTYKLWRYajZoaSAgICAgICAgICBETiAoU3JjNioyKzEpLlMxNgotZFhqN2xvICAgICAgICAgIEROIChTcmM3KjIpLlMxNgotZFhqN2hpICAgICAgICAgIEROIChTcmM3KjIrMSkuUzE2Ci1kWGp0bG8gICAgICAgICAgRE4gKFRtcCoyKS5TMTYKLWRYanRoaSAgICAgICAgICBETiAoVG1wKjIrMSkuUzE2Ci0KLXFYaTAgICAgICAgICAgICBRTiBxWGowCi1xWGkxICAgICAgICAgICAgUU4gcVhqNAotcVhpMiAgICAgICAgICAgIFFOIHFYajIKLXFYaTMgICAgICAgICAgICBRTiBxWGo3Ci1xWGk0ICAgICAgICAgICAgUU4gcVhqNQotcVhpNSAgICAgICAgICAgIFFOIHFYanQKLXFYaTYgICAgICAgICAgICBRTiBxWGoxCi1xWGk3ICAgICAgICAgICAgUU4gcVhqNgotcVhpdCAgICAgICAgICAgIFFOIHFYajMKLQotZFhpMGxvICAgICAgICAgIEROIGRYajBsbwotZFhpMGhpICAgICAgICAgIEROIGRYajBoaQotZFhpMWxvICAgICAgICAgIEROIGRYajRsbwotZFhpMWhpICAgICAgICAgIEROIGRYajRoaQotZFhpMmxvICAgICAgICAgIEROIGRYajJsbwotZFhpMmhpICAgICAgICAgIEROIGRYajJoaQotZFhpM2xvICAgICAgICAgIEROIGRYajdsbwotZFhpM2hpICAgICAgICAgIEROIGRYajdoaQotZFhpNGxvICAgICAgICAgIEROIGRYajVsbwotZFhpNGhpICAgICAgICAgIEROIGRYajVoaQotZFhpNWxvICAgICAgICAgIEROIGRYanRsbwotZFhpNWhpICAgICAgICAgIEROIGRYanRoaQotZFhpNmxvICAgICAgICAgIEROIGRYajFsbwotZFhpNmhpICAgICAgICAgIEROIGRYajFoaQotZFhpN2xvICAgICAgICAgIEROIGRYajZsbwotZFhpN2hpICAgICAgICAgIEROIGRYajZoaQotZFhpdGxvICAgICAgICAgIEROIGRYajNsbwotZFhpdGhpICAgICAgICAgIEROIGRYajNoaQotCi1xWGgwICAgICAgICAgICAgUU4gcVhpdAotcVhoMSAgICAgICAgICAgIFFOIHFYaTAKLXFYaDIgICAgICAgICAgICBRTiBxWGkyCi1xWGgzICAgICAgICAgICAgUU4gcVhpMwotcVhoNCAgICAgICAgICAgIFFOIHFYaTcKLXFYaDUgICAgICAgICAgICBRTiBxWGk1Ci1xWGg2ICAgICAgICAgICAgUU4gcVhpNAotcVhoNyAgICAgICAgICAgIFFOIHFYaTEKLXFYaHQgICAgICAgICAgICBRTiBxWGk2Ci0KLWRYaDBsbyAgICAgICAgICBETiBkWGl0bG8KLWRYaDBoaSAgICAgICAgICBETiBkWGl0aGkKLWRYaDFsbyAgICAgICAgICBETiBkWGkwbG8KLWRYaDFoaSAgICAgICAgICBETiBkWGkwaGkKLWRYaDJsbyAgICAgICAgICBETiBkWGkybG8KLWRYaDJoaSAgICAgICAgICBETiBkWGkyaGkKLWRYaDNsbyAgICAgICAgICBETiBkWGkzbG8KLWRYaDNoaSAgICAgICAgICBETiBkWGkzaGkKLWRYaDRsbyAgICAgICAgICBETiBkWGk3bG8KLWRYaDRoaSAgICAgICAgICBETiBkWGk3aGkKLWRYaDVsbyAgICAgICAgICBETiBkWGk1bG8KLWRYaDVoaSAgICAgICAgICBETiBkWGk1aGkKLWRYaDZsbyAgICAgICAgICBETiBkWGk0bG8KLWRYaDZoaSAgICAgICAgICBETiBkWGk0aGkKLWRYaDdsbyAgICAgICAgICBETiBkWGkxbG8KLWRYaDdoaSAgICAgICAgICBETiBkWGkxaGkKLWRYaHRsbyAgICAgICAgICBETiBkWGk2bG8KLWRYaHRoaSAgICAgICAgICBETiBkWGk2aGkKLQotcVhnMCAgICAgICAgICAgIFFOIHFYaDIKLXFYZzEgICAgICAgICAgICBRTiBxWGh0Ci1xWGcyICAgICAgICAgICAgUU4gcVhoMQotcVhnMyAgICAgICAgICAgIFFOIHFYaDAKLXFYZzQgICAgICAgICAgICBRTiBxWGg0Ci1xWGc1ICAgICAgICAgICAgUU4gcVhoNQotcVhnNiAgICAgICAgICAgIFFOIHFYaDYKLXFYZzcgICAgICAgICAgICBRTiBxWGg3Ci1xWGd0ICAgICAgICAgICAgUU4gcVhoMwotCi1xWGYwICAgICAgICAgICAgUU4gcVhnNgotcVhmMSAgICAgICAgICAgIFFOIHFYZzUKLXFYZjIgICAgICAgICAgICBRTiBxWGc0Ci1xWGYzICAgICAgICAgICAgUU4gcVhndAotcVhmNCAgICAgICAgICAgIFFOIHFYZzMKLXFYZjUgICAgICAgICAgICBRTiBxWGcyCi1xWGY2ICAgICAgICAgICAgUU4gcVhnMQotcVhmNyAgICAgICAgICAgIFFOIHFYZzAKLXFYZnQgICAgICAgICAgICBRTiBxWGc3Ci0KLQotcVh0MCAgICAgICAgICAgIFFOIDEuUzMyCi1xWHQxICAgICAgICAgICAgUU4gMi5TMzIKLXFUMGxvICAgICAgICAgICBRTiAxLlMzMiAgICAgICAgIAotcVQwaGkgICAgICAgICAgIFFOIDIuUzMyICAgICAgICAgCi1xVDFsbyAgICAgICAgICAgUU4gMy5TMzIgICAgICAgICAKLXFUMWhpICAgICAgICAgICBRTiA0LlMzMiAgICAgICAgIAotcVNjYWxlbG8gICAgICAgIFFOIDUuUzMyICAgICAgICA7Ly8gdXNlZCB0byByZWFkIHBvc3Qgc2NhbGUgdmFsdWVzCi1xU2NhbGVoaSAgICAgICAgUU4gNi5TMzIKLXFUZW1wMCAgICAgICAgICBRTiA1LlMzMiAgICAgICAgIAotcVRlbXAxICAgICAgICAgIFFOIDYuUzMyICAgIAotCi0KLVNjYWxlMSAgICAgICAgICBFUVUgNgotU2NhbGUyICAgICAgICAgIEVRVSAxNQotcVNjYWxlMSAgICAgICAgIFFOIFNjYWxlMS5TMTYgICAgIAotcVNjYWxlMiAgICAgICAgIFFOIFNjYWxlMi5TMTYgICAgIAotZFNjYWxlMWxvICAgICAgIEROIChTY2FsZTEqMikuUzE2ICAgICAKLWRTY2FsZTFoaSAgICAgICBETiAoU2NhbGUxKjIrMSkuUzE2Ci1kU2NhbGUybG8gICAgICAgRE4gKFNjYWxlMioyKS5TMTYgICAgIAotZFNjYWxlMmhpICAgICAgIEROIChTY2FsZTIqMisxKS5TMTYKLQotZENvZWZzICAgICAgICAgIEROIDAuUzE2ICAgICAgICA7Ly8gU2NhbGUgY29lZmZpY2llbnRzIGluIGZvcm1hdCB7WzBdIFtDXSBbU10gW0ludlNxcnQyXX0KLUludlNxcnQyICAgICAgICBETiBkQ29lZnNbMF0gICAgOy8vIDEvc3FydCgyKSBpbiBRMTUKLVMgICAgICAgICAgICAgICBETiBkQ29lZnNbMV0gICAgOy8vIFNpbihQSS84KSBpbiBRMTUKLUMgICAgICAgICAgICAgICBETiBkQ29lZnNbMl0gICAgOy8vIENvcyhQSS84KSBpbiBRMTUKLQotcFRlbXAgICAgICAgICAgIFJOIDEyCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgSU1QT1JUICBhcm1DT01NX0lEQ1RDb2VmCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICBWTEQxICAgICAgICB7cVhqMCxxWGoxfSwgW3BTcmMgQDY0XSEKLSAgICAgICAgVkxEMSAgICAgICAge3FYajIscVhqM30sIFtwU3JjIEA2NF0hCi0gICAgICAgIFZMRDEgICAgICAgIHtxWGo0LHFYajV9LCBbcFNyYyBANjRdIQotICAgICAgICBWTEQxICAgICAgICB7cVhqNixxWGo3fSwgW3BTcmMgQDY0XSEKLSAgICAgICAgCi0gICAgICAgIDsvLyBMb2FkIFByZVNjYWxlIGFuZCBtdWx0aXBseSB3aXRoIFNyYwotICAgICAgICA7Ly8gSVN0YWdlIDQKLSAgICAgICAgCi0gICAgICAgIElGICIkaW5zY2FsZSI9InMxNiIgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIDE2WDE2IE11bAotICAgICAgICAgICAgTV9JRENUX1BSRVNDQUxFMTYKLSAgICAgICAgRU5ESUYKLSAgICAgICAgCi0gICAgICAgIElGICIkaW5zY2FsZSI9InMzMiIgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIDMyWDMyICx1bAotICAgICAgICAgICAgTV9JRENUX1BSRVNDQUxFMzIKLSAgICAgICAgRU5ESUYKLQotICAgICAgICA7Ly8gSVN0YWdlIDMKLSAgICAgICAgVlFETVVMSCAgICAgcVhpMiwgcVhpMiwgSW52U3FydDIgICAgICAgICAgICA7Ly8gaTIvc3FydCgyKQotICAgICAgICBWSEFERCAgICAgICBxWGgwLCBxWGkwLCBxWGkxICAgICAgICAgICAgICAgIDsvLyAoaTAraTEpLzIKLSAgICAgICAgVkhTVUIgICAgICAgcVhoMSwgcVhpMCwgcVhpMSAgICAgICAgICAgICAgICA7Ly8gKGkwLWkxKS8yCi0gICAgICAgIFZIQUREICAgICAgIHFYaDcsIHFYaTUsIHFYaTcgICAgICAgICAgICAgICAgOy8vIChpNStpNykvNAotICAgICAgICBWU1VCICAgICAgICBxWGg1LCBxWGk1LCBxWGk3ICAgICAgICAgICAgICAgIDsvLyAoaTUtaTcpLzIKLSAgICAgICAgVlFETVVMSCAgICAgcVhoNSwgcVhoNSwgSW52U3FydDIgICAgICAgICAgICA7Ly8gaDUvc3FydCgyKQotICAgICAgICBWU1VCICAgICAgICBxWGgyLCBxWGkyLCBxWGkzICAgICAgICAgICAgICAgIDsvLyBoMiwgaDMKLQotICAgICAgICBWTVVMTCAgICAgICBxWHQwLCBkWGk0bG8sIEMgICAgICAgICAgICAgICAgIDsvLyBjKmk0Ci0gICAgICAgIFZNTEFMICAgICAgIHFYdDAsIGRYaTZsbywgUyAgICAgICAgICAgICAgICAgOy8vIGMqaTQrcyppNgotICAgICAgICBWTVVMTCAgICAgICBxWHQxLCBkWGk0aGksIEMKLSAgICAgICAgVk1MQUwgICAgICAgcVh0MSwgZFhpNmhpLCBTCi0gICAgICAgIFZTSFJOICAgICAgIGRYaDRsbywgcVh0MCwgIzE2ICAgICAgICAgICAgICAgOy8vIGg0Ci0gICAgICAgIFZTSFJOICAgICAgIGRYaDRoaSwgcVh0MSwgIzE2Ci0gICAgICAgIAotICAgICAgICBWTVVMTCAgICAgICBxWHQwLCBkWGk2bG8sIEMgICAgICAgICAgICAgICAgIDsvLyBjKmk2Ci0gICAgICAgIFZNTFNMICAgICAgIHFYdDAsIGRYaTRsbywgUyAgICAgICAgICAgICAgICAgOy8vIC1zKmk0ICsgYypoNgotICAgICAgICBWTVVMTCAgICAgICBxWHQxLCBkWGk2aGksIEMKLSAgICAgICAgVk1MU0wgICAgICAgcVh0MSwgZFhpNGhpLCBTCi0gICAgICAgIFZTSFJOICAgICAgIGRYaDZsbywgcVh0MCwgIzE2ICAgICAgICAgICAgICAgOy8vIGg2Ci0gICAgICAgIFZTSFJOICAgICAgIGRYaDZoaSwgcVh0MSwgIzE2Ci0gICAgICAgIAotICAgICAgICA7Ly8gSVN0YWdlIDIKLSAgICAgICAgVlNVQiAgICAgICAgcVhnNiwgcVhoNiwgcVhoNwotICAgICAgICBWU1VCICAgICAgICBxWGc1LCBxWGg1LCBxWGc2Ci0gICAgICAgIFZTVUIgICAgICAgIHFYZzQsIHFYaDQsIHFYZzUKLSAgICAgICAgVkhBREQgICAgICAgcVhnMSwgcVhoMSwgcVhoMiAgICAgICAgOy8vIChoMStoMikvMgotICAgICAgICBWSFNVQiAgICAgICBxWGcyLCBxWGgxLCBxWGgyICAgICAgICA7Ly8gKGgxLWgyKS8yCi0gICAgICAgIFZIQUREICAgICAgIHFYZzAsIHFYaDAsIHFYaDMgICAgICAgIDsvLyAoaDAraDMpLzIKLSAgICAgICAgVkhTVUIgICAgICAgcVhnMywgcVhoMCwgcVhoMyAgICAgICAgOy8vIChoMC1oMykvMgotCi0gICAgICAgIDsvLyBJU3RhZ2UgMSBhbGwgcm93cwotICAgICAgICBWQUREICAgICAgICBxWGYzLCBxWGczLCBxWGc0ICAgICAgICAKLSAgICAgICAgVlNVQiAgICAgICAgcVhmNCwgcVhnMywgcVhnNCAgICAgICAgCi0gICAgICAgIFZBREQgICAgICAgIHFYZjIsIHFYZzIsIHFYZzUgICAgICAgIAotICAgICAgICBWU1VCICAgICAgICBxWGY1LCBxWGcyLCBxWGc1ICAgICAgICAKLSAgICAgICAgVkFERCAgICAgICAgcVhmMSwgcVhnMSwgcVhnNgotICAgICAgICBWU1VCICAgICAgICBxWGY2LCBxWGcxLCBxWGc2ICAgICAgICAKLSAgICAgICAgVkFERCAgICAgICAgcVhmMCwgcVhnMCwgcVhnNwotICAgICAgICBWU1VCICAgICAgICBxWGY3LCBxWGcwLCBxWGc3ICAgICAgCi0KLSAgICAgICAgOy8vIFRyYW5zcG9zZSwgc3RvcmUgYW5kIGxvb3AKLVhUUjAgICAgICAgICAgICBFUVUgU3JjNQotWFRSMSAgICAgICAgICAgIEVRVSBUbXAKLVhUUjIgICAgICAgICAgICBFUVUgU3JjNgotWFRSMyAgICAgICAgICAgIEVRVSBTcmM3Ci1YVFI0ICAgICAgICAgICAgRVFVIFNyYzMKLVhUUjUgICAgICAgICAgICBFUVUgU3JjMAotWFRSNiAgICAgICAgICAgIEVRVSBTcmMxCi1YVFI3ICAgICAgICAgICAgRVFVIFNyYzIKLVhUUnQgICAgICAgICAgICBFUVUgU3JjNAotICAgICAgICAgICAgICAgIAotcUEwICAgICAgICAgICAgIFFOICBYVFIwLlMzMiAgOy8vIGZvciBYVFJwb3NlCi1xQTEgICAgICAgICAgICAgUU4gIFhUUjEuUzMyCi1xQTIgICAgICAgICAgICAgUU4gIFhUUjIuUzMyCi1xQTMgICAgICAgICAgICAgUU4gIFhUUjMuUzMyCi1xQTQgICAgICAgICAgICAgUU4gIFhUUjQuUzMyCi1xQTUgICAgICAgICAgICAgUU4gIFhUUjUuUzMyCi1xQTYgICAgICAgICAgICAgUU4gIFhUUjYuUzMyCi1xQTcgICAgICAgICAgICAgUU4gIFhUUjcuUzMyCi0KLWRCMCAgICAgICAgICAgICBETiAgWFRSMCoyKzEgICAgICA7Ly8gZm9yIHVzaW5nIFZTV1AKLWRCMSAgICAgICAgICAgICBETiAgWFRSMSoyKzEKLWRCMiAgICAgICAgICAgICBETiAgWFRSMioyKzEKLWRCMyAgICAgICAgICAgICBETiAgWFRSMyoyKzEKLWRCNCAgICAgICAgICAgICBETiAgWFRSNCoyCi1kQjUgICAgICAgICAgICAgRE4gIFhUUjUqMgotZEI2ICAgICAgICAgICAgIEROICBYVFI2KjIKLWRCNyAgICAgICAgICAgICBETiAgWFRSNyoyCi0KLSAgICAgICAgICAKLSAgICAgICAgVlRSTiAgICAgICAgcVhmMCwgcVhmMQotICAgICAgICBWVFJOICAgICAgICBxWGYyLCBxWGYzCi0gICAgICAgIFZUUk4gICAgICAgIHFYZjQsIHFYZjUKLSAgICAgICAgVlRSTiAgICAgICAgcVhmNiwgcVhmNwotICAgICAgICBWVFJOICAgICAgICBxQTAsIHFBMgotICAgICAgICBWVFJOICAgICAgICBxQTEsIHFBMwotICAgICAgICBWVFJOICAgICAgICBxQTQsIHFBNgotICAgICAgICBWVFJOICAgICAgICBxQTUsIHFBNyAgICAgICAgCi0gICAgICAgIFZTV1AgICAgICAgIGRCMCwgZEI0Ci0gICAgICAgIFZTV1AgICAgICAgIGRCMSwgZEI1Ci0gICAgICAgIFZTV1AgICAgICAgIGRCMiwgZEI2Ci0gICAgICAgIFZTV1AgICAgICAgIGRCMywgZEI3Ci0gICAgICAgIAotCi1xWWowICAgICAgICAgICAgUU4gcVhmMAotcVlqMSAgICAgICAgICAgIFFOIHFYZjEKLXFZajIgICAgICAgICAgICBRTiBxWGYyCi1xWWozICAgICAgICAgICAgUU4gcVhmMwotcVlqNCAgICAgICAgICAgIFFOIHFYZjQKLXFZajUgICAgICAgICAgICBRTiBxWGY1Ci1xWWo2ICAgICAgICAgICAgUU4gcVhmNgotcVlqNyAgICAgICAgICAgIFFOIHFYZjcKLXFZanQgICAgICAgICAgICBRTiBxWGZ0Ci0KLWRZajBsbyAgICAgICAgICBETiAoWFRSMCoyKS5TMTYKLWRZajBoaSAgICAgICAgICBETiAoWFRSMCoyKzEpLlMxNgotZFlqMWxvICAgICAgICAgIEROIChYVFIxKjIpLlMxNgotZFlqMWhpICAgICAgICAgIEROIChYVFIxKjIrMSkuUzE2Ci1kWWoybG8gICAgICAgICAgRE4gKFhUUjIqMikuUzE2Ci1kWWoyaGkgICAgICAgICAgRE4gKFhUUjIqMisxKS5TMTYKLWRZajNsbyAgICAgICAgICBETiAoWFRSMyoyKS5TMTYKLWRZajNoaSAgICAgICAgICBETiAoWFRSMyoyKzEpLlMxNgotZFlqNGxvICAgICAgICAgIEROIChYVFI0KjIpLlMxNgotZFlqNGhpICAgICAgICAgIEROIChYVFI0KjIrMSkuUzE2Ci1kWWo1bG8gICAgICAgICAgRE4gKFhUUjUqMikuUzE2Ci1kWWo1aGkgICAgICAgICAgRE4gKFhUUjUqMisxKS5TMTYKLWRZajZsbyAgICAgICAgICBETiAoWFRSNioyKS5TMTYKLWRZajZoaSAgICAgICAgICBETiAoWFRSNioyKzEpLlMxNgotZFlqN2xvICAgICAgICAgIEROIChYVFI3KjIpLlMxNgotZFlqN2hpICAgICAgICAgIEROIChYVFI3KjIrMSkuUzE2Ci1kWWp0bG8gICAgICAgICAgRE4gKFhUUnQqMikuUzE2Ci1kWWp0aGkgICAgICAgICAgRE4gKFhUUnQqMisxKS5TMTYKLQotcVlpMCAgICAgICAgICAgIFFOIHFZajAKLXFZaTEgICAgICAgICAgICBRTiBxWWo0Ci1xWWkyICAgICAgICAgICAgUU4gcVlqMgotcVlpMyAgICAgICAgICAgIFFOIHFZajcKLXFZaTQgICAgICAgICAgICBRTiBxWWo1Ci1xWWk1ICAgICAgICAgICAgUU4gcVlqdAotcVlpNiAgICAgICAgICAgIFFOIHFZajEKLXFZaTcgICAgICAgICAgICBRTiBxWWo2Ci1xWWl0ICAgICAgICAgICAgUU4gcVlqMwotCi1kWWkwbG8gICAgICAgICAgRE4gZFlqMGxvCi1kWWkwaGkgICAgICAgICAgRE4gZFlqMGhpCi1kWWkxbG8gICAgICAgICAgRE4gZFlqNGxvCi1kWWkxaGkgICAgICAgICAgRE4gZFlqNGhpCi1kWWkybG8gICAgICAgICAgRE4gZFlqMmxvCi1kWWkyaGkgICAgICAgICAgRE4gZFlqMmhpCi1kWWkzbG8gICAgICAgICAgRE4gZFlqN2xvCi1kWWkzaGkgICAgICAgICAgRE4gZFlqN2hpCi1kWWk0bG8gICAgICAgICAgRE4gZFlqNWxvCi1kWWk0aGkgICAgICAgICAgRE4gZFlqNWhpCi1kWWk1bG8gICAgICAgICAgRE4gZFlqdGxvCi1kWWk1aGkgICAgICAgICAgRE4gZFlqdGhpCi1kWWk2bG8gICAgICAgICAgRE4gZFlqMWxvCi1kWWk2aGkgICAgICAgICAgRE4gZFlqMWhpCi1kWWk3bG8gICAgICAgICAgRE4gZFlqNmxvCi1kWWk3aGkgICAgICAgICAgRE4gZFlqNmhpCi1kWWl0bG8gICAgICAgICAgRE4gZFlqM2xvCi1kWWl0aGkgICAgICAgICAgRE4gZFlqM2hpCi0KLXFZaDAgICAgICAgICAgICBRTiBxWWl0Ci1xWWgxICAgICAgICAgICAgUU4gcVlpMAotcVloMiAgICAgICAgICAgIFFOIHFZaTIKLXFZaDMgICAgICAgICAgICBRTiBxWWkzCi1xWWg0ICAgICAgICAgICAgUU4gcVlpNwotcVloNSAgICAgICAgICAgIFFOIHFZaTUKLXFZaDYgICAgICAgICAgICBRTiBxWWk0Ci1xWWg3ICAgICAgICAgICAgUU4gcVlpMQotcVlodCAgICAgICAgICAgIFFOIHFZaTYKLQotZFloMGxvICAgICAgICAgIEROIGRZaXRsbwotZFloMGhpICAgICAgICAgIEROIGRZaXRoaQotZFloMWxvICAgICAgICAgIEROIGRZaTBsbwotZFloMWhpICAgICAgICAgIEROIGRZaTBoaQotZFloMmxvICAgICAgICAgIEROIGRZaTJsbwotZFloMmhpICAgICAgICAgIEROIGRZaTJoaQotZFloM2xvICAgICAgICAgIEROIGRZaTNsbwotZFloM2hpICAgICAgICAgIEROIGRZaTNoaQotZFloNGxvICAgICAgICAgIEROIGRZaTdsbwotZFloNGhpICAgICAgICAgIEROIGRZaTdoaQotZFloNWxvICAgICAgICAgIEROIGRZaTVsbwotZFloNWhpICAgICAgICAgIEROIGRZaTVoaQotZFloNmxvICAgICAgICAgIEROIGRZaTRsbwotZFloNmhpICAgICAgICAgIEROIGRZaTRoaQotZFloN2xvICAgICAgICAgIEROIGRZaTFsbwotZFloN2hpICAgICAgICAgIEROIGRZaTFoaQotZFlodGxvICAgICAgICAgIEROIGRZaTZsbwotZFlodGhpICAgICAgICAgIEROIGRZaTZoaQotCi1xWWcwICAgICAgICAgICAgUU4gcVloMgotcVlnMSAgICAgICAgICAgIFFOIHFZaHQKLXFZZzIgICAgICAgICAgICBRTiBxWWgxCi1xWWczICAgICAgICAgICAgUU4gcVloMAotcVlnNCAgICAgICAgICAgIFFOIHFZaDQKLXFZZzUgICAgICAgICAgICBRTiBxWWg1Ci1xWWc2ICAgICAgICAgICAgUU4gcVloNgotcVlnNyAgICAgICAgICAgIFFOIHFZaDcKLXFZZ3QgICAgICAgICAgICBRTiBxWWgzCi0KLXFZZjAgICAgICAgICAgICBRTiBxWWc2Ci1xWWYxICAgICAgICAgICAgUU4gcVlnNQotcVlmMiAgICAgICAgICAgIFFOIHFZZzQKLXFZZjMgICAgICAgICAgICBRTiBxWWd0Ci1xWWY0ICAgICAgICAgICAgUU4gcVlnMwotcVlmNSAgICAgICAgICAgIFFOIHFZZzIKLXFZZjYgICAgICAgICAgICBRTiBxWWcxCi1xWWY3ICAgICAgICAgICAgUU4gcVlnMAotcVlmdCAgICAgICAgICAgIFFOIHFZZzcKLQotICAgICAgICBWUlNIUiAgICAgICBxWWo3LCBxWWo3LCAjMgotICAgICAgICBWUlNIUiAgICAgICBxWWo2LCBxWWo2LCAjMQotICAgICAgICAKLSAgICAgICAgVkhBREQgICAgICAgcVlpNSwgcVlqMSwgcVlqNyAgICAgICAgOy8vIGk1ID0gKGoxK2o3KS8yCi0gICAgICAgIFZTVUIgICAgICAgIHFZaTYsIHFZajEsIHFZajcgICAgICAgIDsvLyBpNiA9IGoxLWo3Ci0gICAgICAgIFZIQUREICAgICAgIHFZaTMsIHFZajIsIHFZajYgICAgICAgIDsvLyBpMyA9IChqMitqNikvMgotICAgICAgICBWU1VCICAgICAgICBxWWkyLCBxWWoyLCBxWWo2ICAgICAgICA7Ly8gaTIgPSBqMi1qNgotICAgICAgICBWSEFERCAgICAgICBxWWk3LCBxWWo1LCBxWWozICAgICAgICA7Ly8gaTcgPSAoajUrajMpLzIKLSAgICAgICAgVlNVQiAgICAgICAgcVlpNCwgcVlqNSwgcVlqMyAgICAgICAgOy8vIGk0ID0gajUtajMKLQotICAgICAgICBWUURNVUxIICAgICBxWWkyLCBxWWkyLCBJbnZTcXJ0MiAgICA7Ly8gaTIvc3FydCgyKQotICAgICAgICA7Ly8gSVN0YWdlIDQsMyByb3dzIDB0bzEgeCAxLzIKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgICAgIHBUZW1wLCAjMHg0ICAgICAgICAgICAgIDsvLyBlbnN1cmUgY29ycmVjdCByb3VuZAotICAgICAgICBWRFVQICAgICAgICBxU2NhbGUxLCBwVGVtcCAgICAgICAgICAgOy8vIG9mIERDIHJlc3VsdAotICAgICAgICBWQUREICAgICAgICBxWWkwLCBxWWkwLCBxU2NhbGUxCi0gICAgICAgIAotICAgICAgICBWSEFERCAgICAgICBxWWgwLCBxWWkwLCBxWWkxICAgICAgICA7Ly8gKGkwK2kxKS8yCi0gICAgICAgIFZIU1VCICAgICAgIHFZaDEsIHFZaTAsIHFZaTEgICAgICAgIDsvLyAoaTAtaTEpLzIKLQotICAgICAgICBWSEFERCAgICAgICBxWWg3LCBxWWk1LCBxWWk3ICAgICAgICA7Ly8gKGk1K2k3KS80Ci0gICAgICAgIFZTVUIgICAgICAgIHFZaDUsIHFZaTUsIHFZaTcgICAgICAgIDsvLyAoaTUtaTcpLzIKLSAgICAgICAgVlNVQiAgICAgICAgcVloMiwgcVlpMiwgcVlpMyAgICAgICAgOy8vIGgyLCBoMwotICAgICAgICBWUURNVUxIICAgICBxWWg1LCBxWWg1LCBJbnZTcXJ0MiAgICA7Ly8gaDUvc3FydCgyKQotCi0gICAgICAgIFZNVUxMICAgICAgIHFYdDAsIGRZaTRsbywgQyAgICAgICAgIDsvLyBjKmk0Ci0gICAgICAgIFZNTEFMICAgICAgIHFYdDAsIGRZaTZsbywgUyAgICAgICAgIDsvLyBjKmk0K3MqaTYKLSAgICAgICAgVk1VTEwgICAgICAgcVh0MSwgZFlpNGhpLCBDCi0gICAgICAgIFZNTEFMICAgICAgIHFYdDEsIGRZaTZoaSwgUwotICAgICAgICBWU0hSTiAgICAgICBkWWg0bG8sIHFYdDAsICMxNiAgICAgICA7Ly8gaDQKLSAgICAgICAgVlNIUk4gICAgICAgZFloNGhpLCBxWHQxLCAjMTYKLSAgICAgICAgCi0gICAgICAgIFZNVUxMICAgICAgIHFYdDAsIGRZaTZsbywgQyAgICAgICAgIDsvLyBjKmk2Ci0gICAgICAgIFZNTFNMICAgICAgIHFYdDAsIGRZaTRsbywgUyAgICAgICAgIDsvLyAtcyppNCArIGMqaDYKLSAgICAgICAgVk1VTEwgICAgICAgcVh0MSwgZFlpNmhpLCBDCi0gICAgICAgIFZNTFNMICAgICAgIHFYdDEsIGRZaTRoaSwgUwotICAgICAgICBWU0hSTiAgICAgICBkWWg2bG8sIHFYdDAsICMxNiAgICAgICA7Ly8gaDYKLSAgICAgICAgVlNIUk4gICAgICAgZFloNmhpLCBxWHQxLCAjMTYKLSAgICAgICAgCi0gICAgICAgIFZTVUIgICAgICAgIHFZZzYsIHFZaDYsIHFZaDcKLSAgICAgICAgVlNVQiAgICAgICAgcVlnNSwgcVloNSwgcVlnNgotICAgICAgICBWU1VCICAgICAgICBxWWc0LCBxWWg0LCBxWWc1Ci0gICAgICAgIAotICAgICAgICA7Ly8gSVN0YWdlIDIgcm93cyAwdG8zIHggMS8yCi0gICAgICAgIFZIQUREICAgICAgIHFZZzEsIHFZaDEsIHFZaDIgICAgICAgIDsvLyAoaDEraDIpLzIKLSAgICAgICAgVkhTVUIgICAgICAgcVlnMiwgcVloMSwgcVloMiAgICAgICAgOy8vIChoMS1oMikvMgotICAgICAgICBWSEFERCAgICAgICBxWWcwLCBxWWgwLCBxWWgzICAgICAgICA7Ly8gKGgwK2gzKS8yCi0gICAgICAgIFZIU1VCICAgICAgIHFZZzMsIHFZaDAsIHFZaDMgICAgICAgIDsvLyAoaDAtaDMpLzIKLSAgICAgICAgCi0KLSAgICAgICAgOy8vIElTdGFnZSAxIGFsbCByb3dzCi0gICAgICAgIFZIQUREICAgICAgICBxWWYzLCBxWWczLCBxWWc0ICAgICAgICAKLSAgICAgICAgVkhTVUIgICAgICAgIHFZZjQsIHFZZzMsIHFZZzQgICAgICAgIAotICAgICAgICBWSEFERCAgICAgICAgcVlmMiwgcVlnMiwgcVlnNSAgICAgICAgCi0gICAgICAgIFZIU1VCICAgICAgICBxWWY1LCBxWWcyLCBxWWc1ICAgICAgICAKLSAgICAgICAgVkhBREQgICAgICAgIHFZZjEsIHFZZzEsIHFZZzYKLSAgICAgICAgVkhTVUIgICAgICAgIHFZZjYsIHFZZzEsIHFZZzYgICAgICAgIAotICAgICAgICBWSEFERCAgICAgICAgcVlmMCwgcVlnMCwgcVlnNwotICAgICAgICBWSFNVQiAgICAgICAgcVlmNywgcVlnMCwgcVlnNyAgICAgIAotCi1ZVFIwICAgICAgICAgICAgRVFVIFNyYzAKLVlUUjEgICAgICAgICAgICBFUVUgU3JjNAotWVRSMiAgICAgICAgICAgIEVRVSBTcmMxCi1ZVFIzICAgICAgICAgICAgRVFVIFNyYzIKLVlUUjQgICAgICAgICAgICBFUVUgU3JjNwotWVRSNSAgICAgICAgICAgIEVRVSBTcmM1Ci1ZVFI2ICAgICAgICAgICAgRVFVIFRtcAotWVRSNyAgICAgICAgICAgIEVRVSBTcmM2Ci1ZVFJ0ICAgICAgICAgICAgRVFVIFNyYzMKLQotcUMwICAgICAgICAgICAgIFFOICBZVFIwLlMzMiAgICAgICAgICAgICAgICA7Ly8gZm9yIFlUUnBvc2UKLXFDMSAgICAgICAgICAgICBRTiAgWVRSMS5TMzIKLXFDMiAgICAgICAgICAgICBRTiAgWVRSMi5TMzIKLXFDMyAgICAgICAgICAgICBRTiAgWVRSMy5TMzIKLXFDNCAgICAgICAgICAgICBRTiAgWVRSNC5TMzIKLXFDNSAgICAgICAgICAgICBRTiAgWVRSNS5TMzIKLXFDNiAgICAgICAgICAgICBRTiAgWVRSNi5TMzIKLXFDNyAgICAgICAgICAgICBRTiAgWVRSNy5TMzIKLQotZEQwICAgICAgICAgICAgIEROICBZVFIwKjIrMSAgICAgICAgICAgICAgICA7Ly8gZm9yIHVzaW5nIFZTV1AKLWREMSAgICAgICAgICAgICBETiAgWVRSMSoyKzEKLWREMiAgICAgICAgICAgICBETiAgWVRSMioyKzEKLWREMyAgICAgICAgICAgICBETiAgWVRSMyoyKzEKLWRENCAgICAgICAgICAgICBETiAgWVRSNCoyCi1kRDUgICAgICAgICAgICAgRE4gIFlUUjUqMgotZEQ2ICAgICAgICAgICAgIEROICBZVFI2KjIKLWRENyAgICAgICAgICAgICBETiAgWVRSNyoyCi0gICAgICAgICAgCi0gICAgICAgIFZUUk4gICAgICAgIHFZZjAsIHFZZjEKLSAgICAgICAgVlRSTiAgICAgICAgcVlmMiwgcVlmMwotICAgICAgICBWVFJOICAgICAgICBxWWY0LCBxWWY1Ci0gICAgICAgIFZUUk4gICAgICAgIHFZZjYsIHFZZjcKLSAgICAgICAgVlRSTiAgICAgICAgcUMwLCBxQzIKLSAgICAgICAgVlRSTiAgICAgICAgcUMxLCBxQzMKLSAgICAgICAgVlRSTiAgICAgICAgcUM0LCBxQzYKLSAgICAgICAgVlRSTiAgICAgICAgcUM1LCBxQzcgICAgICAgIAotICAgICAgICBWU1dQICAgICAgICBkRDAsIGRENAotICAgICAgICBWU1dQICAgICAgICBkRDEsIGRENQotICAgICAgICBWU1dQICAgICAgICBkRDIsIGRENgotICAgICAgICBWU1dQICAgICAgICBkRDMsIGRENwotCi0gICAgICAgIAotZFlmMFU4ICAgICAgICAgIEROIFlUUjAqMi5VOAotZFlmMVU4ICAgICAgICAgIEROIFlUUjEqMi5VOAotZFlmMlU4ICAgICAgICAgIEROIFlUUjIqMi5VOAotZFlmM1U4ICAgICAgICAgIEROIFlUUjMqMi5VOAotZFlmNFU4ICAgICAgICAgIEROIFlUUjQqMi5VOAotZFlmNVU4ICAgICAgICAgIEROIFlUUjUqMi5VOAotZFlmNlU4ICAgICAgICAgIEROIFlUUjYqMi5VOAotZFlmN1U4ICAgICAgICAgIEROIFlUUjcqMi5VOAotICAgICAgICAKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBEbyBzYXR1cmF0aW9uIGlmIG91dHNpemUgaXMgb3RoZXIgdGhhbiBTMTYKLSAgICAgICAgOy8vCi0gICAgICAgIAotICAgICAgICBJRiAoIiRvdXRzaXplIj0idTgiKQotICAgICAgICAgICAgOy8vIE91dHB1dCByYW5nZSBbMC0yNTVdCi0gICAgICAgICAgICBWUU1PVk4gICAgICAgICAgICBkWWYwVTgsIHFZZjAKLSAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjFVOCwgcVlmMQotICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmMlU4LCBxWWYyCi0gICAgICAgICAgICBWUU1PVk4gICAgICAgICAgICBkWWYzVTgsIHFZZjMKLSAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjRVOCwgcVlmNAotICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmNVU4LCBxWWY1Ci0gICAgICAgICAgICBWUU1PVk4gICAgICAgICAgICBkWWY2VTgsIHFZZjYKLSAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjdVOCwgcVlmNwotICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgICAgSUYgKCIkb3V0c2l6ZSI9InM5IikKLSAgICAgICAgICAgIDsvLyBPdXRwdXQgcmFuZ2UgWy0yNTYgdG8gKzI1NV0KLSAgICAgICAgICAgIFZRU0hMICAgICAgICAgICAgcVlmMCwgcVlmMCwgIzE2LTkKLSAgICAgICAgICAgIFZRU0hMICAgICAgICAgICAgcVlmMSwgcVlmMSwgIzE2LTkKLSAgICAgICAgICAgIFZRU0hMICAgICAgICAgICAgcVlmMiwgcVlmMiwgIzE2LTkKLSAgICAgICAgICAgIFZRU0hMICAgICAgICAgICAgcVlmMywgcVlmMywgIzE2LTkKLSAgICAgICAgICAgIFZRU0hMICAgICAgICAgICAgcVlmNCwgcVlmNCwgIzE2LTkKLSAgICAgICAgICAgIFZRU0hMICAgICAgICAgICAgcVlmNSwgcVlmNSwgIzE2LTkKLSAgICAgICAgICAgIFZRU0hMICAgICAgICAgICAgcVlmNiwgcVlmNiwgIzE2LTkKLSAgICAgICAgICAgIFZRU0hMICAgICAgICAgICAgcVlmNywgcVlmNywgIzE2LTkKLSAgICAgICAgICAgIAotICAgICAgICAgICAgVlNIUiAgICAgICAgICAgICBxWWYwLCBxWWYwLCAjMTYtOQotICAgICAgICAgICAgVlNIUiAgICAgICAgICAgICBxWWYxLCBxWWYxLCAjMTYtOQotICAgICAgICAgICAgVlNIUiAgICAgICAgICAgICBxWWYyLCBxWWYyLCAjMTYtOQotICAgICAgICAgICAgVlNIUiAgICAgICAgICAgICBxWWYzLCBxWWYzLCAjMTYtOQotICAgICAgICAgICAgVlNIUiAgICAgICAgICAgICBxWWY0LCBxWWY0LCAjMTYtOQotICAgICAgICAgICAgVlNIUiAgICAgICAgICAgICBxWWY1LCBxWWY1LCAjMTYtOQotICAgICAgICAgICAgVlNIUiAgICAgICAgICAgICBxWWY2LCBxWWY2LCAjMTYtOQotICAgICAgICAgICAgVlNIUiAgICAgICAgICAgICBxWWY3LCBxWWY3LCAjMTYtOQotICAgICAgICBFTkRJRgotCi0gICAgICAgIDsvLyBTdG9yZSBvdXRwdXQgZGVwZW5kaW5nIG9uIHRoZSBTdHJpZGUgc2l6ZQotICAgICAgICBJRiAiJHN0cmlkZSI9InMiCi0gICAgICAgICAgICBWU1QxICAgICAgICBxWWYwLCBbcERlc3QgQDY0XSwgU3RyaWRlCi0gICAgICAgICAgICBWU1QxICAgICAgICBxWWYxLCBbcERlc3QgQDY0XSwgU3RyaWRlCi0gICAgICAgICAgICBWU1QxICAgICAgICBxWWYyLCBbcERlc3QgQDY0XSwgU3RyaWRlCi0gICAgICAgICAgICBWU1QxICAgICAgICBxWWYzLCBbcERlc3QgQDY0XSwgU3RyaWRlCi0gICAgICAgICAgICBWU1QxICAgICAgICBxWWY0LCBbcERlc3QgQDY0XSwgU3RyaWRlCi0gICAgICAgICAgICBWU1QxICAgICAgICBxWWY1LCBbcERlc3QgQDY0XSwgU3RyaWRlCi0gICAgICAgICAgICBWU1QxICAgICAgICBxWWY2LCBbcERlc3QgQDY0XSwgU3RyaWRlCi0gICAgICAgICAgICBWU1QxICAgICAgICBxWWY3LCBbcERlc3QgQDY0XSAgICAgICAgICAgIAotICAgICAgICBFTFNFCi0gICAgICAgICAgICBJRiAoIiRvdXRzaXplIj0idTgiKQotICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIGRZZjBVOCwgW3BEZXN0IEA2NF0sICM4Ci0gICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmMVU4LCBbcERlc3QgQDY0XSwgIzgKLSAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWYyVTgsIFtwRGVzdCBANjRdLCAjOAotICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIGRZZjNVOCwgW3BEZXN0IEA2NF0sICM4Ci0gICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmNFU4LCBbcERlc3QgQDY0XSwgIzgKLSAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWY1VTgsIFtwRGVzdCBANjRdLCAjOAotICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIGRZZjZVOCwgW3BEZXN0IEA2NF0sICM4Ci0gICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmN1U4LCBbcERlc3QgQDY0XQotICAgICAgICAgICAgRUxTRQotICAgICAgICAgICAgICAgIDsvLyAoIiRvdXRzaXplIj0iczkiKSBvciAoIiRvdXRzaXplIj0iczE2IikKLSAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWYwLCBbcERlc3QgQDY0XSwgIzE2Ci0gICAgICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmMSwgW3BEZXN0IEA2NF0sICMxNgotICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjIsIFtwRGVzdCBANjRdLCAjMTYKLSAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWYzLCBbcERlc3QgQDY0XSwgIzE2Ci0gICAgICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmNCwgW3BEZXN0IEA2NF0sICMxNgotICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjUsIFtwRGVzdCBANjRdLCAjMTYKLSAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWY2LCBbcERlc3QgQDY0XSwgIzE2Ci0gICAgICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmNywgW3BEZXN0IEA2NF0KLSAgICAgICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICBFTkRJRgotCi0KLQotICAgICAgICBFTkRJRiA7Ly8gQ29ydGV4QTgKLQotCi0KLSAgICAgICAgTUVORCAgICAgICAgCi0KLSAgICAgICAgOy8vIFNjYWxlIFRXTyBpbnB1dCByb3dzIHdpdGggVFdPIHJvd3Mgb2YgMTYgYml0IHNjYWxlIHZhbHVlcwotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFRoaXMgbWFjcm8gaXMgdXNlZCBieSBNX0lEQ1RfUFJFU0NBTEUxNiB0byBwcmUtc2NhbGUgb25lIHJvdwotICAgICAgICA7Ly8gaW5wdXQgKEVpZ2h0IGlucHV0IHZhbHVlcykgd2l0aCBvbmUgcm93IG9mIHNjYWxlIHZhbHVlcy4gQWxzbyAKLSAgICAgICAgOy8vIExvYWRzIG5leHQgc2NhbGUgdmFsdWVzIGZyb20gcFNjYWxlLCBpZiAkTGFzdFJvdyBmbGFnIGlzIG5vdCBzZXQuCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRkQWxvICAgICAgICAgICAtIElucHV0IEQgcmVnaXN0ZXIgd2l0aCBmaXJzdCBmb3VyIFMxNiB2YWx1ZXMgb2Ygcm93IG4KLSAgICAgICAgOy8vICRkQWhpICAgICAgICAgICAtIElucHV0IEQgcmVnaXN0ZXIgd2l0aCBuZXh0IGZvdXIgUzE2IHZhbHVlcyBvZiByb3cgbgotICAgICAgICA7Ly8gJGRCbG8gICAgICAgICAgIC0gSW5wdXQgRCByZWdpc3RlciB3aXRoIGZpcnN0IGZvdXIgUzE2IHZhbHVlcyBvZiByb3cgbisxCi0gICAgICAgIDsvLyAkZEJoaSAgICAgICAgICAgLSBJbnB1dCBEIHJlZ2lzdGVyIHdpdGggbmV4dCBmb3VyIFMxNiB2YWx1ZXMgb2Ygcm93IG4rMQotICAgICAgICA7Ly8gcFNjYWxlICAgICAgICAgIC0gUG9pbnRlciB0byBuZXh0IHJvdyBvZiBzY2FsZSB2YWx1ZXMKLSAgICAgICAgOy8vIHFUMGxvICAgICAgICAgICAtIFRlbXBvcmFyeSBzY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyBxVDBoaSAgICAgICAgICAgLSBUZW1wb3Jhcnkgc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gcVQxbG8gICAgICAgICAgIC0gVGVtcG9yYXJ5IHNjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vIHFUMWhpICAgICAgICAgICAtIFRlbXBvcmFyeSBzY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyBkU2NhbGUxbG8gICAgICAgLSBTY2FsZSB2YWx1ZSBvZiByb3cgbgotICAgICAgICA7Ly8gZFNjYWxlMWhpICAgICAgIC0gU2NhbGUgdmFsdWUgb2Ygcm93IG4KLSAgICAgICAgOy8vIGRTY2FsZTJsbyAgICAgICAtIFNjYWxlIHZhbHVlIG9mIHJvdyBuKzEKLSAgICAgICAgOy8vIGRTY2FsZTJoaSAgICAgICAtIFNjYWxlIHZhbHVlIG9mIHJvdyBuKzEKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBGbGFnCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJExhc3RSb3cgICAgICAgIC0gRmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIGN1cnJlbnQgcm93IGlzIGxhc3Qgcm93Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkZEFsbyAgICAgICAgICAgLSBTY2FsZWQgb3V0cHV0IHZhbHVlcyAoZmlyc3QgZm91ciBTMTYgb2Ygcm93IG4pCi0gICAgICAgIDsvLyAkZEFoaSAgICAgICAgICAgLSBTY2FsZWQgb3V0cHV0IHZhbHVlcyAobmV4dCBmb3VyIFMxNiBvZiByb3cgbikKLSAgICAgICAgOy8vICRkQmxvICAgICAgICAgICAtIFNjYWxlZCBvdXRwdXQgdmFsdWVzIChmaXJzdCBmb3VyIFMxNiBvZiByb3cgbisxKQotICAgICAgICA7Ly8gJGRCaGkgICAgICAgICAgIC0gU2NhbGVkIG91dHB1dCB2YWx1ZXMgKG5leHQgZm91ciBTMTYgb2Ygcm93IG4rMSkKLSAgICAgICAgOy8vIHFTY2FsZTEgICAgICAgICAtIFNjYWxlIHZhbHVlcyBmb3IgbmV4dCByb3cKLSAgICAgICAgOy8vIHFTY2FsZTIgICAgICAgICAtIFNjYWxlIHZhbHVlcyBmb3IgbmV4dCByb3crMQotICAgICAgICA7Ly8gcFNjYWxlICAgICAgICAgIC0gUG9pbnRlciB0byBuZXh0IHJvdyBvZiBzY2FsZSB2YWx1ZXMKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fSURDVF9TQ0FMRTE2ICRkQWxvLCAkZEFoaSwgJGRCbG8sICRkQmhpLCAkTGFzdFJvdwotICAgICAgICBWTVVMTCAgICAgICBxVDBsbywgJGRBbG8sIGRTY2FsZTFsbwotICAgICAgICBWTVVMTCAgICAgICBxVDBoaSwgJGRBaGksIGRTY2FsZTFoaQotICAgICAgICBWTVVMTCAgICAgICBxVDFsbywgJGRCbG8sIGRTY2FsZTJsbwotICAgICAgICBWTVVMTCAgICAgICBxVDFoaSwgJGRCaGksIGRTY2FsZTJoaQotICAgICAgICBJRiAiJExhc3RSb3ciPSIwIgotICAgICAgICAgICAgVkxEMSAgICAgICAgcVNjYWxlMSwgW3BTY2FsZV0sICMxNiAgOy8vIExvYWQgc2NhbGUgZm9yIHJvdyBuKzEKLSAgICAgICAgICAgIFZMRDEgICAgICAgIHFTY2FsZTIsIFtwU2NhbGVdLCAjMTYgIDsvLyBMb2FkIHNjYWxlIGZvciByb3cgbisyCi0gICAgICAgIEVORElGCi0gICAgICAgIFZRUlNIUk4gICAgICAgJGRBbG8sIHFUMGxvLCAjMTIgICAgICAgIAotICAgICAgICBWUVJTSFJOICAgICAgICRkQWhpLCBxVDBoaSwgIzEyICAgICAgICAKLSAgICAgICAgVlFSU0hSTiAgICAgICAkZEJsbywgcVQxbG8sICMxMiAgICAgICAgCi0gICAgICAgIFZRUlNIUk4gICAgICAgJGRCaGksIHFUMWhpLCAjMTIgICAgICAgIAotICAgICAgICBNRU5ECi0KLSAgICAgICAgOy8vIFNjYWxlIDh4OCBibG9jayBpbnB1dCB2YWx1ZXMgd2l0aCAxNiBiaXQgc2NhbGUgdmFsdWVzCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gVGhpcyBtYWNybyBpcyB1c2VkIHRvIHByZS1zY2FsZSBibG9jayBvZiA4eDggaW5wdXQuCi0gICAgICAgIDsvLyBUaGlzIGFsc28gZG8gdGhlIElzdCBzdGFnZSB0cmFuc2Zvcm1hdGlvbnMgb2YgSURDVC4KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gZFhqbmxvICAgICAgICAgIC0gbiB0aCBpbnB1dCBEIHJlZ2lzdGVyIHdpdGggZmlyc3QgZm91ciBTMTYgdmFsdWVzCi0gICAgICAgIDsvLyBkWGpuaGkgICAgICAgICAgLSBuIHRoIGlucHV0IEQgcmVnaXN0ZXIgd2l0aCBuZXh0IGZvdXIgUzE2IHZhbHVlcwotICAgICAgICA7Ly8gcVhqbiAgICAgICAgICAgIC0gbiB0aCBpbnB1dCBRIHJlZ2lzdGVyIHdpdGggZWlnaHQgUzE2IHZhbHVlcwotICAgICAgICA7Ly8gcFNjYWxlICAgICAgICAgIC0gUG9pbnRlciB0byBzY2FsZSB2YWx1ZXMKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIHFYaW4gICAgICAgICAgICAtIG4gdGggb3V0cHV0IFEgcmVnaXN0ZXIgd2l0aCBlaWdodCBTMTYgb3V0cHV0IHZhbHVlcyBvZiAxc3Qgc3RhZ2UKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fSURDVF9QUkVTQ0FMRTE2Ci0gICAgICAgIFZMRDEgICAgICAgIHFTY2FsZTEsIFtwU2NhbGVdLCAjMTYgICAgICA7Ly8gTG9hZCBQcmUgc2NhbGUgZm9yIHJvdyAwCi0gICAgICAgIFZMRDEgICAgICAgIHFTY2FsZTIsIFtwU2NhbGVdLCAjMTYgICAgICA7Ly8gTG9hZCBQcmUgc2NhbGUgZm9yIHJvdyAwCi0gICAgICAgIE1fSURDVF9TQ0FMRTE2IGRYajBsbywgZFhqMGhpLCBkWGoxbG8sIGRYajFoaSwgMCAgICAgICAgOy8vIFByZSBzY2FsZSByb3cgMCAmIDEKLSAgICAgICAgTV9JRENUX1NDQUxFMTYgZFhqMmxvLCBkWGoyaGksIGRYajNsbywgZFhqM2hpLCAwICAgICAgICAKLSAgICAgICAgTV9JRENUX1NDQUxFMTYgZFhqNGxvLCBkWGo0aGksIGRYajVsbywgZFhqNWhpLCAwICAgICAgICAKLSAgICAgICAgTV9JRENUX1NDQUxFMTYgZFhqNmxvLCBkWGo2aGksIGRYajdsbywgZFhqN2hpLCAxICAgICAgICAKLSAgICAgICAgVkhBREQgICAgICAgcVhpNSwgcVhqMSwgcVhqNyAgICAgICAgICAgIDsvLyAoajErajcpLzIKLSAgICAgICAgVlNVQiAgICAgICAgcVhpNiwgcVhqMSwgcVhqNyAgICAgICAgICAgIDsvLyBqMS1qNwotICAgICAgICBMRFIgICAgICAgICBwU3JjLCA9YXJtQ09NTV9JRENUQ29lZiA7Ly8gQWRkcmVzcyBvZiBEQ1QgaW52ZXJzZSBBQU4gY29uc3RhbnRzCi0gICAgICAgIFZIQUREICAgICAgIHFYaTMsIHFYajIsIHFYajYgICAgICAgICAgICA7Ly8gKGoyK2o2KS8yCi0gICAgICAgIFZTVUIgICAgICAgIHFYaTIsIHFYajIsIHFYajYgICAgICAgICAgICA7Ly8gajItajYKLSAgICAgICAgVkxEUiAgICAgICAgZENvZWZzLCBbcFNyY10gICAgICAgICAgICAgIDsvLyBMb2FkIERDVCBpbnZlcnNlIEFBTiBjb25zdGFudHMKLSAgICAgICAgVkhBREQgICAgICAgcVhpNywgcVhqNSwgcVhqMyAgICAgICAgICAgIDsvLyAoajUrajMpLzIKLSAgICAgICAgVlNVQiAgICAgICAgcVhpNCwgcVhqNSwgcVhqMyAgICAgICAgICAgIDsvLyBqNS1qMwotICAgICAgICBNRU5EICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBTY2FsZSA4eDggYmxvY2sgaW5wdXQgdmFsdWVzIHdpdGggMzIgYml0IHNjYWxlIHZhbHVlcwotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFRoaXMgbWFjcm8gaXMgdXNlZCB0byBwcmUtc2NhbGUgYmxvY2sgb2YgOHg4IGlucHV0LgotICAgICAgICA7Ly8gVGhpcyBhbHNvIGRvIHRoZSBJc3Qgc3RhZ2UgdHJhbnNmb3JtYXRpb25zIG9mIElEQ1QuCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIGRYam5sbyAgICAgICAgICAtIG4gdGggaW5wdXQgRCByZWdpc3RlciB3aXRoIGZpcnN0IGZvdXIgUzE2IHZhbHVlcwotICAgICAgICA7Ly8gZFhqbmhpICAgICAgICAgIC0gbiB0aCBpbnB1dCBEIHJlZ2lzdGVyIHdpdGggbmV4dCBmb3VyIFMxNiB2YWx1ZXMKLSAgICAgICAgOy8vIHFYam4gICAgICAgICAgICAtIG4gdGggaW5wdXQgUSByZWdpc3RlciB3aXRoIGVpZ2h0IFMxNiB2YWx1ZXMKLSAgICAgICAgOy8vIHBTY2FsZSAgICAgICAgICAtIFBvaW50ZXIgdG8gMzJiaXQgc2NhbGUgdmFsdWVzIGluIFEyMyBmb3JtYXQKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIGRYaW5sbyAgICAgICAgICAtIG4gdGggb3V0cHV0IEQgcmVnaXN0ZXIgd2l0aCBmaXJzdCBmb3VyIFMxNiBvdXRwdXQgdmFsdWVzIG9mIDFzdCBzdGFnZQotICAgICAgICA7Ly8gZFhpbmhpICAgICAgICAgIC0gbiB0aCBvdXRwdXQgRCByZWdpc3RlciB3aXRoIG5leHQgZm91ciBTMTYgb3V0cHV0IHZhbHVlcyBvZiAxc3Qgc3RhZ2UKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fSURDVF9QUkVTQ0FMRTMyCi1xU2NhbGUwbG8gICAgICAgUU4gMC5TMzIKLXFTY2FsZTBoaSAgICAgICBRTiAxLlMzMgotcVNjYWxlMWxvICAgICAgIFFOIDIuUzMyCi1xU2NhbGUxaGkgICAgICAgUU4gMy5TMzIKLXFTY2FsZTJsbyAgICAgICBRTiBxU2NhbGUxbG8KLXFTY2FsZTJoaSAgICAgICBRTiBxU2NhbGUxaGkKLXFTY2FsZTNsbyAgICAgICBRTiBxU2NhbGUxbG8KLXFTY2FsZTNoaSAgICAgICBRTiBxU2NhbGUxaGkKLXFTY2FsZTRsbyAgICAgICBRTiBxU2NhbGUxbG8KLXFTY2FsZTRoaSAgICAgICBRTiBxU2NhbGUxaGkKLXFTY2FsZTVsbyAgICAgICBRTiBxU2NhbGUwbG8KLXFTY2FsZTVoaSAgICAgICBRTiBxU2NhbGUwaGkKLXFTY2FsZTZsbyAgICAgICBRTiBxU2NhbGUwbG8KLXFTY2FsZTZoaSAgICAgICBRTiBxU2NhbGUwaGkKLXFTY2FsZTdsbyAgICAgICBRTiBxU2NhbGUwbG8KLXFTY2FsZTdoaSAgICAgICBRTiBxU2NhbGUwaGkKLQotcVNyYzBsbyAgICAgICAgIFFOIDQuUzMyCi1xU3JjMGhpICAgICAgICAgUU4gNS5TMzIKLXFTcmMxbG8gICAgICAgICBRTiA2LlMzMgotcVNyYzFoaSAgICAgICAgIFFOIFNyYzQuUzMyCi1xU3JjMmxvICAgICAgICAgUU4gcVNyYzBsbwotcVNyYzJoaSAgICAgICAgIFFOIHFTcmMwaGkKLXFTcmMzbG8gICAgICAgICBRTiBxU3JjMGxvCi1xU3JjM2hpICAgICAgICAgUU4gcVNyYzBoaQotcVNyYzRsbyAgICAgICAgIFFOIHFTcmMwbG8KLXFTcmM0aGkgICAgICAgICBRTiBxU3JjMGhpCi1xU3JjNWxvICAgICAgICAgUU4gcVNyYzFsbwotcVNyYzVoaSAgICAgICAgIFFOIHFTcmMxaGkKLXFTcmM2bG8gICAgICAgICBRTiBxU3JjMWxvCi1xU3JjNmhpICAgICAgICAgUU4gcVNyYzFoaQotcVNyYzdsbyAgICAgICAgIFFOIHFTcmMwbG8KLXFTcmM3aGkgICAgICAgICBRTiBxU3JjMGhpCi0KLXFSZXMxN2xvICAgICAgICBRTiBxU2NhbGUwbG8KLXFSZXMxN2hpICAgICAgICBRTiBxU2NhbGUwaGkKLXFSZXMyNmxvICAgICAgICBRTiBxU2NhbGUwbG8KLXFSZXMyNmhpICAgICAgICBRTiBxU2NhbGUwaGkKLXFSZXM1M2xvICAgICAgICBRTiBxU2NhbGUwbG8KLXFSZXM1M2hpICAgICAgICBRTiBxU2NhbGUwaGkKLQotICAgICAgICAgICAgQUREICAgICAgICAgcFRlbXAsIHBTY2FsZSwgIzQqOCo3ICAgICAgICAgICA7Ly8gQWRkcmVzcyBvZiAgcFNjYWxlWzddCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIDsvLyBSb3cgMAotICAgICAgICAgICAgVkxEMSAgICAgICAge3FTY2FsZTBsbywgcVNjYWxlMGhpfSwgW3BTY2FsZV0hCi0gICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjMGxvLCBkWGowbG8sICMoMTItMSkKLSAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmMwaGksIGRYajBoaSwgIygxMi0xKSAgICAgICAgICAgIAotICAgICAgICAgICAgVkxEMSAgICAgICAge3FTY2FsZTFsbywgcVNjYWxlMWhpfSwgW3BTY2FsZV0hCi0gICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjMGxvLCBxU2NhbGUwbG8sIHFTcmMwbG8KLSAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmMwaGksIHFTY2FsZTBoaSwgcVNyYzBoaQotICAgICAgICAgICAgVkxEMSAgICAgICAge3FTY2FsZTdsbywgcVNjYWxlN2hpfSwgW3BUZW1wXSEKLSAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmMxbG8sIGRYajFsbywgIygxMi0xKQotICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzFoaSwgZFhqMWhpLCAjKDEyLTEpICAgICAgICAgICAgCi0gICAgICAgICAgICBWTU9WTiAgICAgICBkWGkwbG8sIHFTcmMwbG8gICAgICAgICAgICAgICAgIDsvLyBPdXRwdXQgaTAKLSAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTBoaSwgcVNyYzBoaQotICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzdsbywgZFhqN2xvLCAjKDEyLTEpCi0gICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjN2hpLCBkWGo3aGksICMoMTItMSkKLSAgICAgICAgICAgIFNVQiAgICAgICAgIHBUZW1wLCBwVGVtcCwgIygoMTYqMikrKDQqOCoxKSkKLSAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmMxbG8sIHFTY2FsZTFsbywgcVNyYzFsbwotICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzFoaSwgcVNjYWxlMWhpLCBxU3JjMWhpCi0gICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjN2xvLCBxU2NhbGU3bG8sIHFTcmM3bG8KLSAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM3aGksIHFTY2FsZTdoaSwgcVNyYzdoaQotICAgICAgICAgICAgVkxEMSAgICAgICAge3FTY2FsZTJsbywgcVNjYWxlMmhpfSwgW3BTY2FsZV0hCi0KLSAgICAgICAgICAgIDsvLyBSb3cgMSAmIDcKLSAgICAgICAgICAgIFZIQUREICAgICAgIHFSZXMxN2xvLCBxU3JjMWxvLCBxU3JjN2xvICAgICAgOy8vIChqMStqNykvMgotICAgICAgICAgICAgVkhBREQgICAgICAgcVJlczE3aGksIHFTcmMxaGksIHFTcmM3aGkgICAgICA7Ly8gKGoxK2o3KS8yCi0gICAgICAgICAgICBWTU9WTiAgICAgICBkWGk1bG8sIHFSZXMxN2xvICAgICAgICAgICAgICAgIDsvLyBPdXRwdXQgaTUKLSAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTVoaSwgcVJlczE3aGkgICAgICAgICAgICAgIAotICAgICAgICAgICAgVlNVQiAgICAgICAgcVJlczE3bG8sIHFTcmMxbG8sIHFTcmM3bG8gICAgICA7Ly8gajEtajcKLSAgICAgICAgICAgIFZTVUIgICAgICAgIHFSZXMxN2hpLCBxU3JjMWhpLCBxU3JjN2hpICAgICAgOy8vIGoxLWo3Ci0gICAgICAgICAgICBWTU9WTiAgICAgICBkWGk2bG8sIHFSZXMxN2xvICAgICAgICAgICAgICAgIDsvLyBPdXRwdXQgaTYKLSAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTZoaSwgcVJlczE3aGkgICAgICAKLSAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmMybG8sIGRYajJsbywgIygxMi0xKQotICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzJoaSwgZFhqMmhpLCAjKDEyLTEpCi0gICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlNmxvLCBxU2NhbGU2aGl9LCBbcFRlbXBdIQotICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzZsbywgZFhqNmxvLCAjKDEyLTEpCi0gICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjNmhpLCBkWGo2aGksICMoMTItMSkKLSAgICAgICAgICAgIFNVQiAgICAgICAgIHBUZW1wLCBwVGVtcCwgIygoMTYqMikrKDQqOCoxKSkKLSAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmMybG8sIHFTY2FsZTJsbywgcVNyYzJsbwotICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzJoaSwgcVNjYWxlMmhpLCBxU3JjMmhpCi0gICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjNmxvLCBxU2NhbGU2bG8sIHFTcmM2bG8KLSAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM2aGksIHFTY2FsZTZoaSwgcVNyYzZoaQotICAgICAgICAgICAgVkxEMSAgICAgICAge3FTY2FsZTNsbywgcVNjYWxlM2hpfSwgW3BTY2FsZV0hCi0KLSAgICAgICAgICAgIDsvLyBSb3cgMiAmIDYKLSAgICAgICAgICAgIFZIQUREICAgICAgIHFSZXMyNmxvLCBxU3JjMmxvLCBxU3JjNmxvICAgICAgOy8vIChqMitqNikvMgotICAgICAgICAgICAgVkhBREQgICAgICAgcVJlczI2aGksIHFTcmMyaGksIHFTcmM2aGkgICAgICA7Ly8gKGoyK2o2KS8yCi0gICAgICAgICAgICBWTU9WTiAgICAgICBkWGkzbG8sIHFSZXMyNmxvICAgICAgICAgICAgICAgIDsvLyBPdXRwdXQgaTMKLSAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTNoaSwgcVJlczI2aGkgICAgICAgICAgICAgIAotICAgICAgICAgICAgVlNVQiAgICAgICAgcVJlczI2bG8sIHFTcmMybG8sIHFTcmM2bG8gICAgICA7Ly8gajItajYKLSAgICAgICAgICAgIFZTVUIgICAgICAgIHFSZXMyNmhpLCBxU3JjMmhpLCBxU3JjNmhpICAgICAgOy8vIGoyLWo2Ci0gICAgICAgICAgICBWTU9WTiAgICAgICBkWGkybG8sIHFSZXMyNmxvICAgICAgICAgICAgICAgIDsvLyBPdXRwdXQgaTIKLSAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTJoaSwgcVJlczI2aGkgICAgICAKLSAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmMzbG8sIGRYajNsbywgIygxMi0xKQotICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzNoaSwgZFhqM2hpLCAjKDEyLTEpCi0gICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlNWxvLCBxU2NhbGU1aGl9LCBbcFRlbXBdIQotICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzVsbywgZFhqNWxvLCAjKDEyLTEpCi0gICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjNWhpLCBkWGo1aGksICMoMTItMSkKLSAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmMzbG8sIHFTY2FsZTNsbywgcVNyYzNsbwotICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzNoaSwgcVNjYWxlM2hpLCBxU3JjM2hpCi0gICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjNWxvLCBxU2NhbGU1bG8sIHFTcmM1bG8KLSAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM1aGksIHFTY2FsZTVoaSwgcVNyYzVoaQotICAgICAgICAgICAgCi0gICAgICAgICAgICA7Ly8gUm93IDMgJiA1Ci0gICAgICAgICAgICBWSEFERCAgICAgICBxUmVzNTNsbywgcVNyYzVsbywgcVNyYzNsbyAgICAgIDsvLyAoajUrajMpLzIKLSAgICAgICAgICAgIFZIQUREICAgICAgIHFSZXM1M2hpLCBxU3JjNWhpLCBxU3JjM2hpICAgICAgOy8vIChqNStqMykvMgotICAgICAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgIzE2KjIqMgotICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpN2xvLCBxUmVzNTNsbyAgICAgICAgICAgICAgICA7Ly8gT3V0cHV0IGk3Ci0gICAgICAgICAgICBWTU9WTiAgICAgICBkWGk3aGksIHFSZXM1M2hpICAgICAgICAgICAgICAKLSAgICAgICAgICAgIFZTVUIgICAgICAgIHFSZXM1M2xvLCBxU3JjNWxvLCBxU3JjM2xvICAgICAgOy8vIGo1LWozCi0gICAgICAgICAgICBWU1VCICAgICAgICBxUmVzNTNoaSwgcVNyYzVoaSwgcVNyYzNoaSAgICAgIDsvLyBqNS1qMwotICAgICAgICAgICAgVkxEMSAgICAgICAgcVhqNCwgW3BTcmMgQDY0XQotICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpNGxvLCBxUmVzNTNsbyAgICAgICAgICAgICAgICA7Ly8gT3V0cHV0IGk0Ci0gICAgICAgICAgICBWTU9WTiAgICAgICBkWGk0aGksIHFSZXM1M2hpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjNGxvLCBkWGo0bG8sICMoMTItMSkKLSAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM0aGksIGRYajRoaSwgIygxMi0xKQotICAgICAgICAgICAgVkxEMSAgICAgICAge3FTY2FsZTRsbywgcVNjYWxlNGhpfSwgW3BTY2FsZV0gICAgICAgICAgICAKLSAgICAgICAgICAgIExEUiAgICAgICAgIHBTcmMsID1hcm1DT01NX0lEQ1RDb2VmICAgICA7Ly8gQWRkcmVzcyBvZiBEQ1QgaW52ZXJzZSBBQU4gY29uc3RhbnRzCi0gICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjNGxvLCBxU2NhbGU0bG8sIHFTcmM0bG8KLSAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM0aGksIHFTY2FsZTRoaSwgcVNyYzRoaQotICAgICAgICAgICAgVkxEUiAgICAgICAgZENvZWZzLCBbcFNyY10gICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBEQ1QgaW52ZXJzZSBBQU4gY29uc3RhbnRzCi0gICAgICAgICAgICA7Ly8gUm93IDQKLSAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTFsbywgcVNyYzRsbyAgICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpMQotICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpMWhpLCBxU3JjNGhpICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIE1FTkQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9NYXNrVGFibGUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9NYXNrVGFibGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZmYzgzNS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fTWFza1RhYmxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtQ09NTV9NYXNrVGFibGUuaAotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICAxMjI5MAotICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogTWFzayBUYWJsZSB0byBtYXNrIHRoZSBlbmQgb2YgYXJyYXkKLSAqLwotIAotCi0KLSNpZm5kZWYgX0FSTUNPTU1fTUFTS1RBQkxFX0hfCi0jZGVmaW5lIF9BUk1DT01NX01BU0tUQUJMRV9IXwotCi0jZGVmaW5lIE1hc2tUYWJsZVNpemUgNzIKLSAgCi0vKiBNYXNrIHRhYmxlICovCi0KLWV4dGVybiBjb25zdCBPTVhfVTE2IGFybUNPTU1fcU1hc2tUYWJsZTE2W01hc2tUYWJsZVNpemVdOwotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1DT01NX3FNYXNrVGFibGU4W01hc2tUYWJsZVNpemVdOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9WZXJzaW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fVmVyc2lvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWIzZTFlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9WZXJzaW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKiBHdWFyZCB0aGUgaGVhZGVyIGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9uLiAqLwotI2lmbmRlZiBfX0FSTV9DT01NX1ZFUlNJT05fSF9fCi0jZGVmaW5lIF9fQVJNX0NPTU1fVkVSU0lPTl9IX18KLQotCi0vKiBUaGUgZm9sbG93aW5nIGxpbmUgc2hvdWxkIGJlIGluIG9teHR5cGVzLmggYnV0IGhhc24ndCBiZWVuIGFwcHJvdmVkIGJ5IE9wZW5NQVggeWV0ICovCi0jZGVmaW5lIE9NWF9WRVJTSU9OIDEwMgotCi0vKiBXZSBuZWVkIHRvIGRlZmluZSB0aGVzZSBtYWNyb3MgaW4gb3JkZXIgdG8gY29udmVydCBhICNkZWZpbmUgbnVtYmVyIGludG8gYSAjZGVmaW5lIHN0cmluZy4gKi8KLSNkZWZpbmUgQVJNX1FVT1RFKGEpICNhCi0jZGVmaW5lIEFSTV9JTkRJUkVDVChBKSBBUk1fUVVPVEUoQSkKLQotLyogQ29udmVydCB0aGUgT01YX1ZFUlNJT04gbnVtYmVyIGludG8gYSBzdHJpbmcgdGhhdCBjYW4gYmUgdXNlZCwgZm9yIGV4YW1wbGUsIHRvIHByaW50IGl0IG91dC4gKi8KLSNkZWZpbmUgQVJNX1ZFUlNJT05fU1RSSU5HIEFSTV9JTkRJUkVDVChPTVhfVkVSU0lPTikKLQotCi0vKiBEZWZpbmUgdGhpcyBpbiBvcmRlciB0byB0dXJuIG9uIEFSTSB2ZXJzaW9uL3JlbGVhc2UvYnVpbGQgc3RyaW5ncyBpbiBlYWNoIGRvbWFpbiAqLwotI2RlZmluZSBBUk1fSU5DTFVERV9WRVJTSU9OX0RFU0NSSVBUSU9OUwotCi0jaWZkZWYgQVJNX0lOQ0xVREVfVkVSU0lPTl9ERVNDUklQVElPTlMKLSAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBvbXhBQ19WZXJzaW9uRGVzY3JpcHRpb247Ci0gIGV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgb214SUNfVmVyc2lvbkRlc2NyaXB0aW9uOwotICBleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IG9teElQX1ZlcnNpb25EZXNjcmlwdGlvbjsKLSAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBvbXhTUF9WZXJzaW9uRGVzY3JpcHRpb247Ci0gIGV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgb214VkNfVmVyc2lvbkRlc2NyaXB0aW9uOwotI2VuZGlmIC8qIEFSTV9JTkNMVURFX1ZFUlNJT05fREVTQ1JJUFRJT05TICovCi0KLQotLyogVGhlIGZvbGxvd2luZyBlbnRyaWVzIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgYnkgdGhlIHJlbGVhc2Ugc2NyaXB0ICovCi0vKiBUaGV5IGFyZSB1c2VkIGluIHRoZSBBUk0gdmVyc2lvbiBzdHJpbmdzIGRlZmluZWQgZm9yIGVhY2ggZG9tYWluLiAgICAgICAgICAgICAqLwotCi0vKiBUaGUgcmVsZWFzZSB0YWcgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVsZWFzZSBvZiB0aGUgbGlicmFyeS4gLSB1c2VkIGZvciBzb3VyY2UgYW5kIG9iamVjdCByZWxlYXNlcyAqLwotI2RlZmluZSBPTVhfQVJNX1JFTEVBU0VfVEFHICAicjFwMC0wMGJldDAiCi0KLS8qIFRoZSBBUk0gYXJjaGl0ZWN0dXJlIHVzZWQgdG8gYnVpbGQgYW55IG9iamVjdHMgb3IgZXhlY3V0YWJsZXMgaW4gdGhpcyByZWxlYXNlLiAqLwotI2RlZmluZSBPTVhfQVJNX0JVSUxEX0FSQ0hJVEVDVFVSRSAiQVJNIEFyY2hpdGVjdHVyZSBWNyB3aXRoIE5FT04iCi0KLS8qIFRoZSBBUk0gVG9vbGNoYWluIHVzZWQgdG8gYnVpbGQgYW55IG9iamVjdHMgb3IgZXhlY3V0YWJsZXMgaW4gdGhpcyByZWxlYXNlLiAqLwotI2RlZmluZSBPTVhfQVJNX0JVSUxEX1RPT0xDSEFJTiAgICAiQVJNIFJWQ1QgMy4xIgotCi0KLSNlbmRpZiAvKiBfX0FSTV9DT01NX1ZFUlNJT05fSF9fICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9zLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjFkMmQzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9zLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcxICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1DT01NX3MuaAotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDEyMjkwCi07Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLTsvLyBBUk0gb3B0aW1pemVkIE9wZW5NQVggY29tbW9uIGhlYWRlciBmaWxlCi07Ly8KLQotOy8vIFByb3RlY3QgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb24KLSBJRiA6TE5PVDo6REVGOkFSTUNPTU1fU19ICi0gR0JMTCBBUk1DT01NX1NfSAotCi0gICAgICAgIFJFUVVJUkU4ICAgICAgICAgICAgOy8vIFJlcXVpcmVzIDgtYnl0ZSBzdGFjayBhbGlnbm1lbnQKLSAgICAgICAgUFJFU0VSVkU4ICAgICAgICAgICA7Ly8gUHJlc2VydmVzIDgtYnl0ZSBzdGFjayBhbGlnbm1lbnQKLSAgICAgICAgCi0gICAgICAgIEdCTEwgICAgQVJNX0VSUk9SQ0hFQ0sKLUFSTV9FUlJPUkNIRUNLICBTRVRMIHtGQUxTRX0KLQotOy8vIEdsb2JhbHMKLQotICAgICAgICBHQkxTICAgIF9SUmVnTGlzdCAgIDsvLyBSIHNhdmVkIHJlZ2lzdGVyIGxpc3QKLSAgICAgICAgR0JMUyAgICBfRFJlZ0xpc3QgICA7Ly8gRCBzYXZlZCByZWdpc3RlciBsaXN0Ci0gICAgICAgIEdCTFMgICAgX1ZhcmlhbnQgICAgOy8vIFNlbGVjdGVkIHByb2Nlc3NvciB2YXJpYW50Ci0gICAgICAgIEdCTFMgICAgX0NQVSAgICAgICAgOy8vIENQVSBuYW1lCi0gICAgICAgIEdCTFMgICAgX1N0cnVjdCAgICAgOy8vIFN0cnVjdHVyZSBuYW1lCi0gICAgICAgIAotICAgICAgICBHQkxMICAgIF9JbkZ1bmMgICAgIDsvLyBJbnNpZGUgZnVuY3Rpb24gYXNzZW1ibHkgZmxhZwotICAgICAgICBHQkxMICAgIF9Td0xvbmcgICAgIDsvLyBMb25nIHN3aXRjaCBmbGFnCi0gICAgICAgIAotICAgICAgICBHQkxBICAgIF9SQnl0ZXMgICAgIDsvLyBOdW1iZXIgb2YgcmVnaXN0ZXIgYnl0ZXMgb24gc3RhY2sKLSAgICAgICAgR0JMQSAgICBfU0J5dGVzICAgICA7Ly8gTnVtYmVyIG9mIHNjcmF0Y2ggYnl0ZXMgb24gc3RhY2sgCi0gICAgICAgIEdCTEEgICAgX0FCeXRlcyAgICAgOy8vIFN0YWNrIG9mZnNldCBvZiBuZXh0IGFyZ3VtZW50Ci0gICAgICAgIEdCTEEgICAgX1dvcmtzcGFjZSAgOy8vIFN0YWNrIG9mZnNldCBvZiBzY3JhdGNoIHdvcmtzcGFjZQotICAgICAgICBHQkxBICAgIF9GICAgICAgICAgIDsvLyBGdW5jdGlvbiBudW1iZXIKLSAgICAgICAgR0JMQSAgICBfU3RPZmYgICAgICA7Ly8gU3RydWN0IG9mZnNldAotICAgICAgICBHQkxBICAgIF9Td051bSAgICAgIDsvLyBTd2l0Y2ggbnVtYmVyCi0gICAgICAgIEdCTFMgICAgXzMyICAgICAgICAgOy8vIFN1ZmZpeCBmb3IgMzIgYnl0ZSBhbGlnbm1uZXQKLSAgICAgICAgR0JMUyAgICBfMTYgICAgICAgICA7Ly8gU3VmZml4IGZvciAxNiBieXRlIGFsaWdubW5ldAotICAgICAgICAKLV9JbkZ1bmMgICAgICAgICBTRVRMICAgIHtGQUxTRX0KLV9TQnl0ZXMgICAgICAgICBTRVRBICAgIDAKLV9GICAgICAgICAgICAgICBTRVRBICAgIDAKLV9Td051bSAgICAgICAgICBTRVRBICAgIDAKLV8zMiAgICAgICAgICAgICBTRVRTICAgICJBTElHTjMyIgotXzE2ICAgICAgICAgICAgIFNFVFMgICAgIkFMSUdOMTYiCi0KLTsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLTsvLyBPdmVycmlkZSB0aGUgdG9vbHMgc2V0dGluZ3Mgb2YgdGhlIENQVSBpZiB0aGUgI2RlZmluZQotOy8vIFVTRUNQVSBpcyBzZXQsIG90aGVyd2lzZSB1c2UgdGhlIENQVSBkZWZpbmVkIGJ5IHRoZQotOy8vIGFzc2VtYmxlciBzZXR0aW5ncy4KLTsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgICAgIElGIDpERUY6IE9WRVJSSURFQ1BVCi1fQ1BVICAgICAgIFNFVFMgIE9WRVJSSURFQ1BVCi0gICAgICAgRUxTRQotX0NQVSAgICAgICBTRVRTICAgIHtDUFV9ICAgICAgIAotICAgICAgIEVORElGCi0KLQotCi07Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi07Ly8gV29yayBvdXQgd2hpY2ggY29kZSB0byBidWlsZAotOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgICAgIElGIDpERUY6QVJNMTEzNkpTOkxPUjo6REVGOkNvcnRleEE4OkxPUjo6REVGOkFSTV9HRU5FUklDCi0gICAgICAgICAgICBJTkZPIDEsIlBsZWFzZSBzd2l0Y2ggdG8gdXNpbmcgTV9WQVJJQU5UUyIKLSAgICAgICAgRU5ESUYKLQotICAgICAgICA7Ly8gRGVmaW5lIGFuZCByZXNldCBhbGwgb2ZmaWNpYWxseSByZWNvbmduaXNlZCB2YXJpYW50cwotICAgICAgICBNQUNSTwotICAgICAgICBfTV9ERUZfVkFSSUFOVFMKLSAgICAgICAgX01fREVGX1ZBUklBTlQgQVJNOTI2RUpTCi0gICAgICAgIF9NX0RFRl9WQVJJQU5UIEFSTTExMzZKUwotICAgICAgICBfTV9ERUZfVkFSSUFOVCBBUk0xMTM2SlNfVQotICAgICAgICBfTV9ERUZfVkFSSUFOVCBDb3J0ZXhBOAotICAgICAgICBfTV9ERUZfVkFSSUFOVCBBUk03VERNSQotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBfTV9ERUZfVkFSSUFOVCAkdmFyCi0gICAgICAgIEdCTEwgJHZhcgotICAgICAgICBHQkxMIF9vayR2YXIKLSR2YXIgICAgU0VUTCB7RkFMU0V9Ci0gICAgICAgIE1FTkQgICAgICAgIAotICAgICAgICAKLQotICAgICAgICA7Ly8gVmFyaWFudCBkZWNsYXJhdGlvbgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIERlZmluZSBhIGxpc3Qgb2YgY29kZSB2YXJpYW50cyBzdXBwb3J0ZWQgYnkgdGhpcwotICAgICAgICA7Ly8gc291cmNlIGZpbGUuIFRoaXMgbWFjcm8gdGhlbiBjaG9vc2VzIHRoZSBtb3N0Ci0gICAgICAgIDsvLyBhcHByb3ByaWF0ZSB2YXJpYW50IHRvIGJ1aWxkIGZvciB0aGUgY3VycmVudGx5IGNvbmZpZ3VyZWQKLSAgICAgICAgOy8vIGNvcmUuCi0gICAgICAgIDsvLyAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fVkFSSUFOVFMgJHYwLCR2MSwkdjIsJHYzLCR2NCwkdjUsJHY2LCR2NyAgICAgICAgCi0gICAgICAgIDsvLyBTZXQgdG8gVFJVRSB2YXJpYW50cyB0aGF0IGFyZSBzdXBwb3J0ZWQKLSAgICAgICAgX01fREVGX1ZBUklBTlRTCi0gICAgICAgIF9NX1ZBUklBTlQgJHYwCi0gICAgICAgIF9NX1ZBUklBTlQgJHYxCi0gICAgICAgIF9NX1ZBUklBTlQgJHYyCi0gICAgICAgIF9NX1ZBUklBTlQgJHYzCi0gICAgICAgIF9NX1ZBUklBTlQgJHY0Ci0gICAgICAgIF9NX1ZBUklBTlQgJHY1Ci0gICAgICAgIF9NX1ZBUklBTlQgJHY2Ci0gICAgICAgIF9NX1ZBUklBTlQgJHY3Ci0gICAgICAgIAotICAgICAgICA7Ly8gTG9vayBmb3IgZmlyc3QgYXZhaWxhYmxlIHZhcmlhbnQgdG8gbWF0Y2ggYSBDUFUKLSAgICAgICAgOy8vIF9NX1RSWSBjcHUsIHZhcmlhbnQgZmFsbCBiYWNrIGxpc3QKLV9WYXJpYW50IFNFVFMgIiIgICAgICAgICAgICAgICAgCi0gICAgICAgIF9NX1RSWSBBUk05MjZFSi1TLCAgIEFSTTkyNkVKUwotICAgICAgICBfTV9UUlkgQVJNMTE3NkpaLVMsICBBUk0xMTM2SlMKLSAgICAgICAgX01fVFJZIEFSTTExNzZKWkYtUywgQVJNMTEzNkpTCi0gICAgICAgIF9NX1RSWSBBUk0xMTU2VDItUywgIEFSTTExMzZKUwotICAgICAgICBfTV9UUlkgQVJNMTE1NlQyRi1TLCBBUk0xMTM2SlMKLSAgICAgICAgX01fVFJZIEFSTTExMzZKLVMsICAgQVJNMTEzNkpTCi0gICAgICAgIF9NX1RSWSBBUk0xMTM2SkYtUywgIEFSTTExMzZKUwotICAgICAgICBfTV9UUlkgTVBDb3JlLCAgICAgICBBUk0xMTM2SlMKLSAgICAgICAgX01fVFJZIGZhbGNvbi12ZnAsIEFSTTExMzZKUwotICAgICAgICBfTV9UUlkgZmFsY29uLWZ1bGwtbmVvbiwgQ29ydGV4QTgKLSAgICAgICAgX01fVFJZIENvcnRleC1BOE5vTmVvbiwgQVJNMTEzNkpTCi0gICAgICAgIF9NX1RSWSBDb3J0ZXgtQTgsICAgIENvcnRleEE4LCBBUk0xMTM2SlMKLSAgICAgICAgX01fVFJZIENvcnRleC1SNCwgICAgQVJNMTEzNkpTCi0gICAgICAgIF9NX1RSWSBBUk03VERNSQotICAgICAgICAKLSAgICAgICAgOy8vIFNlbGVjdCB0aGUgY29ycmVjdCB2YXJpYW50Ci0gICAgICAgIF9NX0RFRl9WQVJJQU5UUwotICAgICAgICBJRiBfVmFyaWFudD0iIgotICAgICAgICAgICAgSU5GTyAxLCAiTm8gbWF0Y2ggZm91bmQgZm9yIENQVSAnJF9DUFUnIgotICAgICAgICBFTFNFCi0kX1ZhcmlhbnQgICBTRVRMIHtUUlVFfQotICAgICAgICBFTkRJRgotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gUmVnaXN0ZXIgYSB2YXJpYW50IGFzIGF2YWlsYWJsZQotICAgICAgICBNQUNSTwotICAgICAgICBfTV9WQVJJQU5UICR2YXIKLSAgICAgICAgSUYgIiR2YXIiPSIiCi0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRgotICAgICAgICBJRiA6TE5PVDo6REVGOl9vayR2YXIKLSAgICAgICAgICAgIElORk8gMSwgIlVucmVjb2duaXplZCB2YXJpYW50ICckdmFyJyIKLSAgICAgICAgRU5ESUYKLSR2YXIgICAgU0VUTCB7VFJVRX0KLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIEZvciBhIGdpdmVuIENQVSwgc2VlIGlmIGFueSBvZiB0aGUgdmFyaWFudHMgc3VwcG9ydGluZwotICAgICAgICA7Ly8gdGhpcyBDUFUgYXJlIGF2YWlsYWJsZS4gVGhlIGZpcnN0IGF2YWlsYWJsZSB2YXJpYW50IGlzCi0gICAgICAgIDsvLyBjaG9zZW4KLSAgICAgICAgTUFDUk8KLSAgICAgICAgX01fVFJZICRjcHUsICR2MCwkdjEsJHYyLCR2MywkdjQsJHY1LCR2NiwkdjcKLSAgICAgICAgSUYgIiRjcHUiPD5fQ1BVCi0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRgotICAgICAgICBfTV9UUlkxICR2MAotICAgICAgICBfTV9UUlkxICR2MQotICAgICAgICBfTV9UUlkxICR2MgotICAgICAgICBfTV9UUlkxICR2MwotICAgICAgICBfTV9UUlkxICR2NAotICAgICAgICBfTV9UUlkxICR2NQotICAgICAgICBfTV9UUlkxICR2NgotICAgICAgICBfTV9UUlkxICR2NwotICAgICAgICA7Ly8gQ2hlY2sgYSBtYXRjaCB3YXMgZm91bmQKLSAgICAgICAgSUYgX1ZhcmlhbnQ9IiIKLSAgICAgICAgICAgIElORk8gMSwgIk5vIHZhcmlhbnQgbWF0Y2ggZm91bmQgZm9yIENQVSAnJF9DUFUnIgotICAgICAgICBFTkRJRgotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBfTV9UUlkxICR2YXIKLSAgICAgICAgSUYgIiR2YXIiPSIiCi0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRgotICAgICAgICBJRiAoX1ZhcmlhbnQ9IiIpOkxBTkQ6JHZhcgotX1ZhcmlhbnQgU0VUUyAiJHZhciIKLSAgICAgICAgRU5ESUYKLSAgICAgICAgTUVORAotICAgICAgICAKLTsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotOy8vIFN0cnVjdHVyZSBkZWZpbml0aW9uCi07Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgICAgICA7Ly8gRGVjbGFyZSBhIHN0cnVjdHVyZSBvZiBnaXZlbiBuYW1lCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fU1RSVUNUICRzbmFtZQotX1N0cnVjdCBTRVRTICIkc25hbWUiCi1fU3RPZmYgIFNFVEEgMAotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gRGVjbGFyZSBhIHN0cnVjdHVyZSBmaWVsZAotICAgICAgICA7Ly8gVGhlIGZpZWxkIGlzIGNhbGxlZCAkc25hbWVfJGZuYW1lCi0gICAgICAgIDsvLyAkc2l6ZSAgID0gdGhlIHNpemUgb2YgZWFjaCBlbnRyeSwgbXVzdCBiZSBwb3dlciBvZiAyIAotICAgICAgICA7Ly8gJG51bWJlciA9IChpZiBwcm92aWRlZCkgdGhlIG51bWJlciBvZiBlbnRyaWVzIGZvciBhbiBhcnJheQotICAgICAgICBNQUNSTwotICAgICAgICBNX0ZJRUxEICRmbmFtZSwgJHNpemUsICRudW1iZXIKLSAgICAgICAgSUYgKF9TdE9mZjpBTkQ6KCRzaXplLTEpKSE9MAotX1N0T2ZmICAgICAgU0VUQSBfU3RPZmYgKyAoJHNpemUgLSAoX1N0T2ZmOkFORDooJHNpemUtMSkpKQotICAgICAgICBFTkRJRgotJF9TdHJ1Y3QuXyRmbmFtZSBFUVUgX1N0T2ZmCi0gICAgICAgIElGICIkbnVtYmVyIjw+IiIKLV9TdE9mZiAgICAgIFNFVEEgX1N0T2ZmICsgJHNpemUqJG51bWJlcgotICAgICAgICBFTFNFCi1fU3RPZmYgICAgICBTRVRBIF9TdE9mZiArICRzaXplCi0gICAgICAgIEVORElGCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBNX0VORFNUUlVDVAotc2l6ZW9mXyRfU3RydWN0IEVRVSBfU3RPZmYKLV9TdHJ1Y3QgU0VUUyAiIgotICAgICAgICBNRU5ECi0KLTsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi07Ly8gU3dpdGNoIGFuZCB0YWJsZSBtYWNyb3MKLTsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAgICAgOy8vIFN0YXJ0IGEgcmVsYXRpdmUgc3dpdGNoIHRhYmxlIHdpdGggcmVnaXN0ZXIgdG8gc3dpdGNoIG9uCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJHYgPSB0aGUgcmVnaXN0ZXIgdG8gc3dpdGNoIG9uCi0gICAgICAgIDsvLyAkcyA9IGlmIHNwZWNpZmllZCBtdXN0IGJlICJMIiB0byBpbmRpY2F0ZSBsb25nCi0gICAgICAgIDsvLyAgICAgIHRoaXMgYWxsb3dzIGEgZ3JlYXRlciByYW5nZSB0byB0aGUgY2FzZSBjb2RlCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fU1dJVENIICR2LCAkcwotICAgICAgICBBU1NFUlQgIiRzIj0iIjpMT1I6IiRzIj0iTCIKLV9Td0xvbmcgU0VUTCB7RkFMU0V9Ci0gICAgICAgIElGICIkcyI9IkwiCi1fU3dMb25nICAgICBTRVRMIHtUUlVFfQotICAgICAgICBFTkRJRgotX1N3TnVtICBTRVRBIF9Td051bSsxICAgICAgICAKLSAgICAgICAgSUYge0NPTkZJR309MTYKLSAgICAgICAgICAgIDsvLyBUaHVtYgotICAgICAgICAgICAgSUYgX1N3TG9uZwotICAgICAgICAgICAgICAgIFRCSCBbcGMsICR2LCBMU0wjMV0KLSAgICAgICAgICAgIEVMU0UKLSAgICAgICAgICAgICAgICBUQkIgW3BjLCAkdl0KLSAgICAgICAgICAgIEVORElGCi1fU3dpdGNoJF9Td051bQotICAgICAgICBFTFNFCi0gICAgICAgICAgICA7Ly8gQVJNCi0gICAgICAgICAgICBBREQgcGMsIHBjLCAkdiwgTFNMICMyCi0gICAgICAgICAgICBOT1AKLSAgICAgICAgRU5ESUYKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIEFkZCBhIGNhc2UgdG8gdGhlIHN3aXRjaCBzdGF0ZW1lbnQKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9DQVNFICAkbGFiZWwKLSAgICAgICAgSUYge0NPTkZJR309MTYKLSAgICAgICAgICAgIDsvLyBUaHVtYgotICAgICAgICAgICAgSUYgX1N3TG9uZwotICAgICAgICAgICAgICAgIERDVyAoJGxhYmVsIC0gX1N3aXRjaCRfU3dOdW0pLzIKLSAgICAgICAgICAgIEVMU0UKLSAgICAgICAgICAgICAgICBEQ0IgKCRsYWJlbCAtIF9Td2l0Y2gkX1N3TnVtKS8yCi0gICAgICAgICAgICBFTkRJRgotICAgICAgICBFTFNFCi0gICAgICAgICAgICA7Ly8gQVJNCi0gICAgICAgICAgICBCICAgJGxhYmVsCi0gICAgICAgIEVORElGCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBFbmQgb2Ygc3dpdGNoIHN0YXRlbWVudAotICAgICAgICBNQUNSTwotICAgICAgICBNX0VORFNXSVRDSAotICAgICAgICBBTElHTiAyCi0gICAgICAgIE1FTkQgICAgICAgCi0KLQotOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi07Ly8gRGF0YSBhcmVhIGFsbG9jYXRpb24KLTsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgICAgIDsvLyBDb25zdGFudCB0YWJsZSBhbGxvY2F0b3IgbWFjcm8KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBDcmVhdGVzIGEgbmV3IHNlY3Rpb24gZm9yIGVhY2ggY29uc3RhbnQgdGFibGUKLSAgICAgICAgOy8vICRuYW1lIGlzIHN5bWJvbCB0aHJvdWdoIHdoaWNoIHRoZSB0YWJsZSBjYW4gYmUgYWNjZXNzZWQuCi0gICAgICAgIDsvLyAkYWxpZ24gaXMgdGhlIG9wdGlvbmFsIGFsaWdubWVudCBvZiB0aGUgdGFibGUsIGxvZzIgb2YgCi0gICAgICAgIDsvLyAgdGhlIGJ5dGUgYWxpZ25tZW50IC0gJGFsaWduPTQgaXMgMTYgYnl0ZSBhbGlnbmVkCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fVEFCTEUgICRuYW1lLCAkYWxpZ24KLSAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKLSAgICAgICAgSUYgIiRhbGlnbiI9IiIKLSAgICAgICAgICAgIEFSRUEgfC5jb25zdGRhdGF8LCBSRUFET05MWSwgREFUQQotICAgICAgICBFTFNFCi0gICAgICAgICAgICA7Ly8gQVJFQXMgaW5oZXJpdCB0aGUgYWxpZ25tZW50IG9mIHRoZSBmaXJzdCBkZWNsYXJhdGlvbi4KLSAgICAgICAgICAgIDsvLyBUaGVyZWZvcmUgZm9yIGVhY2ggYWxpZ25tZW50IHNpemUgd2UgbXVzdCBoYXZlIGFuIGFyZWEKLSAgICAgICAgICAgIDsvLyBvZiBhIGRpZmZlcmVudCBuYW1lLgotICAgICAgICAgICAgQVJFQSBjb25zdGRhdGFfYSRhbGlnbiwgUkVBRE9OTFksIERBVEEsIEFMSUdOPSRhbGlnbgotICAgICAgICAgICAgCi0gICAgICAgICAgICA7Ly8gV2UgYWxzbyBmb3JjZSBhbGlnbm1lbnQgaW5jYXNlIHdlIGFyZSB0YWdnaW5nIG9udG8KLSAgICAgICAgICAgIDsvLyBhbiBhbHJlYWR5IHN0YXJ0ZWQgYXJlYS4KLSAgICAgICAgICAgIEFMSUdOICgxPDwkYWxpZ24pCi0gICAgICAgIEVORElGCi0kbmFtZQotICAgICAgICBNRU5ECi0gICAgICAgIAotOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi07Ly8gTWFjcm9zIHRvIGFsbG9jYXRlIHNwYWNlIG9uIHRoZSBzdGFjawotOy8vCi07Ly8gVGhlc2UgYWxsIGFzc3VtZSB0aGF0IHRoZSBzdGFjayBpcyA4LWJ5dGUgYWxpZ25lZAotOy8vIGF0IGVudHJ5IHRvIHRoZSBmdW5jdGlvbiwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgCi07Ly8gMzItYnl0ZSBhbGlnbm1lbnQgbWFjcm8gbmVlZHMgdG8gd29yayBpbiBhCi07Ly8gYml0IG1vcmUgb2YgYSBzcGVjaWFsIHdheS4uLgotOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAgICAgCi0KLQotICAgICAgICA7Ly8gQWxsb2NhdGUgMS1ieXRlIGFsaWduZWQgYXJlYSBvZiBuYW1lCi0gICAgICAgIDsvLyAkbmFtZSBzaXplICRzaXplIGJ5dGVzLgotICAgICAgICBNQUNSTwotICAgICAgICBNX0FMTE9DMSAgJG5hbWUsICRzaXplCi0gICAgICAgIEFTU0VSVCA6TE5PVDpfSW5GdW5jCi0kbmFtZSRfRiAgIEVRVSBfU0J5dGVzCi1fU0J5dGVzIFNFVEEgX1NCeXRlcyArICgkc2l6ZSkKLSAgICAgICAgTUVORAotICAgICAgICAgICAgCi0gICAgICAgIDsvLyBBbGxvY2F0ZSAyLWJ5dGUgYWxpZ25lZCBhcmVhIG9mIG5hbWUKLSAgICAgICAgOy8vICRuYW1lIHNpemUgJHNpemUgYnl0ZXMuCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQUxMT0MyICAkbmFtZSwgJHNpemUKLSAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKLSAgICAgICAgSUYgKF9TQnl0ZXM6QU5EOjEpIT0wCi1fU0J5dGVzICAgICBTRVRBIF9TQnl0ZXMgKyAoMiAtIChfU0J5dGVzOkFORDoxKSkKLSAgICAgICAgRU5ESUYKLSRuYW1lJF9GICAgRVFVIF9TQnl0ZXMKLV9TQnl0ZXMgU0VUQSBfU0J5dGVzICsgKCRzaXplKQotICAgICAgICBNRU5ECi0gICAgICAgICAgICAKLSAgICAgICAgOy8vIEFsbG9jYXRlIDQtYnl0ZSBhbGlnbmVkIGFyZWEgb2YgbmFtZQotICAgICAgICA7Ly8gJG5hbWUgc2l6ZSAkc2l6ZSBieXRlcy4KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9BTExPQzQgICRuYW1lLCAkc2l6ZQotICAgICAgICBBU1NFUlQgOkxOT1Q6X0luRnVuYwotICAgICAgICBJRiAoX1NCeXRlczpBTkQ6MykhPTAKLV9TQnl0ZXMgICAgIFNFVEEgX1NCeXRlcyArICg0IC0gKF9TQnl0ZXM6QU5EOjMpKQotICAgICAgICBFTkRJRgotJG5hbWUkX0YgICBFUVUgX1NCeXRlcwotX1NCeXRlcyBTRVRBIF9TQnl0ZXMgKyAoJHNpemUpCi0gICAgICAgIE1FTkQKLSAgICAgICAgICAgIAotICAgICAgICA7Ly8gQWxsb2NhdGUgOC1ieXRlIGFsaWduZWQgYXJlYSBvZiBuYW1lCi0gICAgICAgIDsvLyAkbmFtZSBzaXplICRzaXplIGJ5dGVzLgotICAgICAgICBNQUNSTwotICAgICAgICBNX0FMTE9DOCAgJG5hbWUsICRzaXplCi0gICAgICAgIEFTU0VSVCA6TE5PVDpfSW5GdW5jCi0gICAgICAgIElGIChfU0J5dGVzOkFORDo3KSE9MAotX1NCeXRlcyAgICAgU0VUQSBfU0J5dGVzICsgKDggLSAoX1NCeXRlczpBTkQ6NykpCi0gICAgICAgIEVORElGCi0kbmFtZSRfRiAgIEVRVSBfU0J5dGVzCi1fU0J5dGVzIFNFVEEgX1NCeXRlcyArICgkc2l6ZSkKLSAgICAgICAgTUVORCAgICAgICAgCi0KLSAgICAgICAgCi0gICAgICAgIDsvLyBBbGxvY2F0ZSA4LWJ5dGUgYWxpZ25lZCBhcmVhIG9mIG5hbWUKLSAgICAgICAgOy8vICRuYW1lIHNpemUgKCRzaXplKzE2KSBieXRlcy4KLSAgICAgICAgOy8vIFRoZSBleHRyYSAxNiBieXRlcyBhcmUgbGF0ZXIgdXNlZCB0byBhbGlnbiB0aGUgcG9pbnRlciB0byAxNiBieXRlcwotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9BTExPQzE2ICAkbmFtZSwgJHNpemUKLSAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKLSAgICAgICAgSUYgKF9TQnl0ZXM6QU5EOjcpIT0wCi1fU0J5dGVzICAgICBTRVRBIF9TQnl0ZXMgKyAoOCAtIChfU0J5dGVzOkFORDo3KSkKLSAgICAgICAgRU5ESUYKLSRuYW1lJF9GJF8xNiAgIEVRVSAoX1NCeXRlcyArIDgpCi1fU0J5dGVzIFNFVEEgX1NCeXRlcyArICgkc2l6ZSkgKyA4Ci0gICAgICAgIE1FTkQgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIEFsbG9jYXRlIDgtYnl0ZSBhbGlnbmVkIGFyZWEgb2YgbmFtZQotICAgICAgICA7Ly8gJG5hbWUgc2l6ZSAoJHNpemUrMzIpIGJ5dGVzLgotICAgICAgICA7Ly8gVGhlIGV4dHJhIDMyIGJ5dGVzIGFyZSBsYXRlciB1c2VkIHRvIGFsaWduIHRoZSBwb2ludGVyIHRvIDMyIGJ5dGVzCi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBNX0FMTE9DMzIgICRuYW1lLCAkc2l6ZQotICAgICAgICBBU1NFUlQgOkxOT1Q6X0luRnVuYwotICAgICAgICBJRiAoX1NCeXRlczpBTkQ6NykhPTAKLV9TQnl0ZXMgICAgIFNFVEEgX1NCeXRlcyArICg4IC0gKF9TQnl0ZXM6QU5EOjcpKQotICAgICAgICBFTkRJRgotJG5hbWUkX0YkXzMyICAgRVFVIChfU0J5dGVzICsgMjQpCi1fU0J5dGVzIFNFVEEgX1NCeXRlcyArICgkc2l6ZSkgKyAyNAotICAgICAgICBNRU5EICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBBcmd1bWVudCBEZWNsYXJhdGlvbiBNYWNybwotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIEFsbG9jYXRlIGFuIGFyZ3VtZW50IG5hbWUgJG5hbWUKLSAgICAgICAgOy8vIHNpemUgJHNpemUgYnl0ZXMKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9BUkcgICAgICRuYW1lLCAkc2l6ZQotICAgICAgICBBU1NFUlQgX0luRnVuYwotJG5hbWUkX0YgICAgRVFVIF9BQnl0ZXMKLV9BQnl0ZXMgU0VUQSBfQUJ5dGVzICsgKCRzaXplKQotICAgICAgICBNRU5EICAgICAgICAKLSAgICAgICAgCi07Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLTsvLyBNYWNyb3MgdG8gYWNjZXNzIHN0YWNrZWQgdmFyaWFibGVzCi07Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgICAgICA7Ly8gTWFjcm8gdG8gcGVyZm9ybSBhIGRhdGEgcHJvY2Vzc2luZyBvcGVyYXRpb24KLSAgICAgICAgOy8vIHdpdGggYSBjb25zdGFudCBzZWNvbmQgb3BlcmFuZAotICAgICAgICBNQUNSTwotICAgICAgICBfTV9PUEMgJG9wLCRyZCwkcm4sJGNvbnN0Ci0gICAgICAgIExDTEEgICAgX3NoCi0gICAgICAgIExDTEEgICAgX2NzdAotX3NoICAgICBTRVRBICAgIDAKLV9jc3QgICAgU0VUQSAgICAkY29uc3QKLSAgICAgICAgSUYgX2NzdD0wCi0gICAgICAgICRvcCAkcmQsICRybiwgI19jc3QKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIFdISUxFIChfY3N0OkFORDozKT0wCi1fY3N0ICAgICAgICBTRVRBIF9jc3Q+PjIKLV9zaCAgICAgICAgIFNFVEEgX3NoKzIKLSAgICAgICAgV0VORAotICAgICAgICAkb3AgJHJkLCAkcm4sICMoX2NzdDpBTkQ6MHgwMDAwMDBGRik8PF9zaAotICAgICAgICBJRiBfY3N0Pj0yNTYKLSAgICAgICAgICAgICRvcCAkcmQsICRyZCwgIyhfY3N0OkFORDoweEZGRkZGRjAwKTw8X3NoCi0gICAgICAgIEVORElGCi0gICAgICAgIE1FTkQKLQotICAgICAgICA7Ly8gTWFjcm8gdG8gcGVyZm9ybSBhIGRhdGEgYWNjZXNzIG9wZXJhdGlvbgotICAgICAgICA7Ly8gU3VjaCBhcyBMRFIgb3IgU1RSCi0gICAgICAgIDsvLyBUaGUgYWRkcmVzc2luZyBtb2RlIGlzIG1vZGlmaWVkIHN1Y2ggdGhhdAotICAgICAgICA7Ly8gMS4gSWYgbm8gYWRkcmVzcyBpcyBnaXZlbiB0aGVuIHRoZSBuYW1lIGlzIHRha2VuCi0gICAgICAgIDsvLyAgICBhcyBhIHN0YWNrIG9mZnNldAotICAgICAgICA7Ly8gMi4gSWYgdGhlIGFkZHJlc3NpbmcgbW9kZSBpcyBub3QgYXZhaWxhYmxlIGZvciB0aGUKLSAgICAgICAgOy8vICAgIHN0YXRlIGJlaW5nIGFzc2VtYmxlZCBmb3IgKGVnIFRodW1iKSB0aGVuIGEgc3VpdGFibGUKLSAgICAgICAgOy8vICAgIGFkZHJlc3NpbmcgbW9kZSBpcyBzdWJzdGl0dXRlZC4KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBPbiBFbnRyeToKLSAgICAgICAgOy8vICRpID0gSW5zdHJ1Y3Rpb24gdG8gcGVyZm9ybSAoZWcgIkxEUkIiKQotICAgICAgICA7Ly8gJGEgPSBSZXF1aXJlZCBieXRlIGFsaWdubWVudAotICAgICAgICA7Ly8gJHIgPSBSZWdpc3RlcihzKSB0byB0cmFuc2ZlciAoZWcgInIxIikKLSAgICAgICAgOy8vICRhMCwkYTEsJGEyLiBBZGRyZXNzaW5nIG1vZGUgYW5kIGNvbmRpdGlvbi4gT25lIG9mOgotICAgICAgICA7Ly8gICAgIGxhYmVsIHssY2N9Ci0gICAgICAgIDsvLyAgICAgW2Jhc2VdICAgICAgICAgICAgICAgICAgICB7LCwsY2N9Ci0gICAgICAgIDsvLyAgICAgW2Jhc2UsIG9mZnNldF17IX0gICAgICAgICB7LCxjY30KLSAgICAgICAgOy8vICAgICBbYmFzZSwgb2Zmc2V0LCBzaGlmdF17IX0gIHssY2N9Ci0gICAgICAgIDsvLyAgICAgW2Jhc2VdLCBvZmZzZXQgICAgICAgICAgICB7LCxjY30KLSAgICAgICAgOy8vICAgICBbYmFzZV0sIG9mZnNldCwgc2hpZnQgICAgIHssY2N9Ci0gICAgICAgIE1BQ1JPCi0gICAgICAgIF9NX0RBVEEgJGksJGEsJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIElGICIkYTAiOkxFRlQ6MT0iWyIKLSAgICAgICAgICAgIElGICIkYTEiPSIiCi0gICAgICAgICAgICAgICAgJGkkYTMgICAkciwgJGEwCi0gICAgICAgICAgICBFTFNFCi0gICAgICAgICAgICAgICAgSUYgIiRhMCI6UklHSFQ6MT0iXSIKLSAgICAgICAgICAgICAgICAgICAgSUYgIiRhMiI9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgIF9NX1BPU1RJTkQgJGkkYTMsICIkciIsICRhMCwgJGExCi0gICAgICAgICAgICAgICAgICAgIEVMU0UKLSAgICAgICAgICAgICAgICAgICAgICAgIF9NX1BPU1RJTkQgJGkkYTMsICIkciIsICRhMCwgIiRhMSwkYTIiCi0gICAgICAgICAgICAgICAgICAgIEVORElGCi0gICAgICAgICAgICAgICAgRUxTRQotICAgICAgICAgICAgICAgICAgICBJRiAiJGEyIj0iIgotICAgICAgICAgICAgICAgICAgICAgICAgX01fUFJFSU5EICAkaSRhMywgIiRyIiwgJGEwLCAkYTEKLSAgICAgICAgICAgICAgICAgICAgRUxTRQotICAgICAgICAgICAgICAgICAgICAgICAgX01fUFJFSU5EICAkaSRhMywgIiRyIiwgJGEwLCAiJGExLCRhMiIKLSAgICAgICAgICAgICAgICAgICAgRU5ESUYKLSAgICAgICAgICAgICAgICBFTkRJRgotICAgICAgICAgICAgRU5ESUYKLSAgICAgICAgRUxTRQotICAgICAgICAgICAgTENMQSAgICBfT2Zmc2V0Ci1fT2Zmc2V0ICAgICBTRVRBICAgIF9Xb3Jrc3BhY2UgKyAkYTAkX0YKLSAgICAgICAgICAgIEFTU0VSVCAgKF9PZmZzZXQ6QU5EOigkYS0xKSk9MAotICAgICAgICAgICAgJGkkYTEgICAkciwgW3NwLCAjX09mZnNldF0KLSAgICAgICAgRU5ESUYKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIEhhbmRsZSBwb3N0IGluZGV4ZWQgbG9hZC9zdG9yZXMKLSAgICAgICAgOy8vIG9wICByZWcsIFtiYXNlXSwgb2Zmc2V0Ci0gICAgICAgIE1BQ1JPCi0gICAgICAgIF9NX1BPU1RJTkQgJGksJHIsJGEwLCRhMQotICAgICAgICBMQ0xTIF9iYXNlCi0gICAgICAgIExDTFMgX29mZnNldAotICAgICAgICBJRiB7Q09ORklHfT0xNiA7Ly8gVGh1bWIKLV9iYXNlICAgICAgIFNFVFMgKCIkYTAiOkxFRlQ6KDpMRU46IiRhMCItMSkpOlJJR0hUOig6TEVOOiIkYTAiLTIpICAgOy8vIHJlbW92ZSBbXQotX29mZnNldCAgICAgU0VUUyAiJGExIgotICAgICAgICAgICAgSUYgX29mZnNldDpMRUZUOjE9IisiCi1fb2Zmc2V0ICAgICAgICAgU0VUUyBfb2Zmc2V0OlJJR0hUOig6TEVOOl9vZmZzZXQtMSkKLSAgICAgICAgICAgIEVORElGCi0gICAgICAgICAgICAkaSAgJHIsICRhMAotICAgICAgICAgICAgSUYgX29mZnNldDpMRUZUOjE9Ii0iCi1fb2Zmc2V0ICAgICAgICAgU0VUUyBfb2Zmc2V0OlJJR0hUOig6TEVOOl9vZmZzZXQtMSkKLSAgICAgICAgICAgICAgICBTVUIgJF9iYXNlLCAkX2Jhc2UsICRfb2Zmc2V0Ci0gICAgICAgICAgICBFTFNFICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEFERCAkX2Jhc2UsICRfYmFzZSwgJF9vZmZzZXQKLSAgICAgICAgICAgIEVORElGCi0gICAgICAgIEVMU0UgOy8vIEFSTQotICAgICAgICAgICAgJGkgICRyLCAkYTAsICRhMQotICAgICAgICBFTkRJRgotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gSGFuZGxlIHByZSBpbmRleGVkIGxvYWQvc3RvcmUKLSAgICAgICAgOy8vIG9wICByZWcsIFtiYXNlLCBvZmZzZXRdeyF9Ci0gICAgICAgIE1BQ1JPCi0gICAgICAgIF9NX1BSRUlORCAkaSwkciwkYTAsJGExCi0gICAgICAgIExDTFMgX2Jhc2UKLSAgICAgICAgTENMUyBfb2Zmc2V0Ci0gICAgICAgIElGICh7Q09ORklHfT0xNik6TEFORDooKCIkYTEiOlJJR0hUOjIpPSJdISIpCi1fYmFzZSAgICAgICBTRVRTICIkYTAiOlJJR0hUOig6TEVOOigiJGEwIiktMSkKLV9vZmZzZXQgICAgIFNFVFMgIiRhMSI6TEVGVDooOkxFTjooIiRhMSIpLTIpCi0gICAgICAgICAgICAkaSAkciwgWyRfYmFzZSwgJF9vZmZzZXRdCi0gICAgICAgICAgICBBREQgJF9iYXNlLCAkX2Jhc2UsICRfb2Zmc2V0Ci0gICAgICAgIEVMU0UKLSAgICAgICAgICAgICRpICAkciwgJGEwLCAkYTEKLSAgICAgICAgRU5ESUYKLSAgICAgICAgTUVORAotCi0gICAgICAgIDsvLyBMb2FkIHVuc2lnbmVkIGJ5dGUgZnJvbSBzdGFjawotICAgICAgICBNQUNSTwotICAgICAgICBNX0xEUkIgICRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBfTV9EQVRBICJMRFJCIiwxLCRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBzaWduZWQgYnl0ZSBmcm9tIHN0YWNrCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fTERSU0IgJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIF9NX0RBVEEgIkxEUlNCIiwxLCRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gU3RvcmUgYnl0ZSB0byBzdGFjawotICAgICAgICBNQUNSTwotICAgICAgICBNX1NUUkIgICRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBfTV9EQVRBICJTVFJCIiwxLCRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gTG9hZCB1bnNpZ25lZCBoYWxmIHdvcmQgZnJvbSBzdGFjawotICAgICAgICBNQUNSTwotICAgICAgICBNX0xEUkggICRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBfTV9EQVRBICJMRFJIIiwyLCRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBzaWduZWQgaGFsZiB3b3JkIGZyb20gc3RhY2sKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9MRFJTSCAkciwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgX01fREFUQSAiTERSU0giLDIsJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBTdG9yZSBoYWxmIHdvcmQgdG8gc3RhY2sKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9TVFJIICAkciwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgX01fREFUQSAiU1RSSCIsMiwkciwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgTUVORAotCi0gICAgICAgIDsvLyBMb2FkIHdvcmQgZnJvbSBzdGFjawotICAgICAgICBNQUNSTwotICAgICAgICBNX0xEUiAgICRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBfTV9EQVRBICJMRFIiLDQsJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBTdG9yZSB3b3JkIHRvIHN0YWNrCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fU1RSICAgJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIF9NX0RBVEEgIlNUUiIsNCwkciwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgTUVORAotCi0gICAgICAgIDsvLyBMb2FkIGRvdWJsZSB3b3JkIGZyb20gc3RhY2sKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9MRFJEICAkcjAsJHIxLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBfTV9EQVRBICJMRFJEIiw4LCIkcjAsJHIxIiwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgTUVORAotICAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gU3RvcmUgZG91YmxlIHdvcmQgdG8gc3RhY2sKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9TVFJEICAkcjAsJHIxLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBfTV9EQVRBICJTVFJEIiw4LCIkcjAsJHIxIiwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIEdldCBhYnNvbHV0ZSBhZGRyZXNzIG9mIHN0YWNrIGFsbG9jYXRlZCBsb2NhdGlvbgotICAgICAgICBNQUNSTwotICAgICAgICBNX0FEUiAgICRhLCAkYiwgJGNjCi0gICAgICAgIF9NX09QQyAgQUREJGNjLCAkYSwgc3AsIChfV29ya3NwYWNlICsgJGIkX0YpCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBHZXQgYWJzb2x1dGUgYWRkcmVzcyBvZiBzdGFjayBhbGxvY2F0ZWQgbG9jYXRpb24gYW5kIGFsaWduIHRoZSBhZGRyZXNzIHRvIDE2IGJ5dGVzCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQURSMTYgJGEsICRiLCAkY2MKLSAgICAgICAgICAgIF9NX09QQyAgQUREJGNjLCAkYSwgc3AsIChfV29ya3NwYWNlICsgJGIkX0YkXzE2KQotICAgICAgICAKLSAgICAgICAgICAgIDsvLyBOb3cgYWxpZ24gJGEgdG8gMTYgYnl0ZXMKLSAgICAgICAgICAgIEJJQyRjYyAgJGEsJGEsIzB4MEYKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIEdldCBhYnNvbHV0ZSBhZGRyZXNzIG9mIHN0YWNrIGFsbG9jYXRlZCBsb2NhdGlvbiBhbmQgYWxpZ24gdGhlIGFkZHJlc3MgdG8gMzIgYnl0ZXMKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9BRFIzMiAkYSwgJGIsICRjYwotICAgICAgICAgICAgX01fT1BDICBBREQkY2MsICRhLCBzcCwgKF9Xb3Jrc3BhY2UgKyAkYiRfRiRfMzIpCi0gICAgICAgIAotICAgICAgICAgICAgOy8vIE5vdyBhbGlnbiAkYSB0byAzMiBieXRlcwotICAgICAgICAgICAgQklDJGNjICAkYSwkYSwjMHgxRgotICAgICAgICBNRU5ECi0KLTsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi07Ly8gRnVuY3Rpb24gaGVhZGVyIGFuZCBmb290ZXIgbWFjcm9zCi07Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIEZ1bmN0aW9uIEhlYWRlciBNYWNybyAgICAKLSAgICAgICAgOy8vIEdlbmVyYXRlcyB0aGUgZnVuY3Rpb24gcHJvbG9ndWUKLSAgICAgICAgOy8vIE5vdGUgdGhhdCBmdW5jdGlvbnMgc2hvdWxkIGFsbCBiZSAic3RhY2stbW92ZXMtb25jZSIKLSAgICAgICAgOy8vIFRoZSBGTlNUQVJUIGFuZCBGTkVORCBtYWNyb3Mgc2hvdWxkIGJlIHRoZSBvbmx5IHBsYWNlcwotICAgICAgICA7Ly8gd2hlcmUgdGhlIHN0YWNrIG1vdmVzLgotICAgICAgICA7Ly8gICAgCi0gICAgICAgIDsvLyAkbmFtZSAgPSBmdW5jdGlvbiBuYW1lCi0gICAgICAgIDsvLyAkcnJlZyAgPSAiIiAgIGRvbid0IHN0YWNrIGFueSByZWdpc3RlcnMKLSAgICAgICAgOy8vICAgICAgICAgICJsciIgc3RhY2sgImxyIiBvbmx5Ci0gICAgICAgIDsvLyAgICAgICAgICAick4iIHN0YWNrIHJlZ2lzdGVycyAicjQtck4sbHIiCi0gICAgICAgIDsvLyAkZHJlZyAgPSAiIiAgIGRvbid0IHN0YWNrIGFueSBEIHJlZ2lzdGVycwotICAgICAgICA7Ly8gICAgICAgICAgImROIiBzdGFjayByZWdpc3RlcnMgImQ4LWROIgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIE5vdGU6IEFSTSBBcmNoaWN0dXJlIHByb2NlZHVyZSBjYWxsIHN0YW5kYXJkIEFBUENTCi0gICAgICAgIDsvLyBzdGF0ZXMgdGhhdCByNC1yMTEsIHNwLCBkOC1kMTUgbXVzdCBiZSBwcmVzZXJ2ZWQgYnkKLSAgICAgICAgOy8vIGEgY29tcGxpYW50IGZ1bmN0aW9uLgotICAgICAgICBNQUNSTwotICAgICAgICBNX1NUQVJUICRuYW1lLCAkcnJlZywgJGRyZWcKLSAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKLSAgICAgICAgQVNTRVJUICIkbmFtZSIhPSIiCi1fSW5GdW5jIFNFVEwge1RSVUV9Ci1fUkJ5dGVzIFNFVEEgMAotX1dvcmtzcGFjZSBTRVRBIDAKLQotICAgICAgICA7Ly8gQ3JlYXRlIGFuIGFyZWEgZm9yIHRoZSBmdW5jdGlvbiAgICAgICAgCi0gICAgICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERQotICAgICAgICBFWFBPUlQgICRuYW1lCi0kbmFtZSAgIEZVTkNUSU9OCi0gICAgICAgIAotICAgICAgICA7Ly8gU2F2ZSBSIHJlZ2lzdGVycwotICAgICAgICBfTV9HRVRSUkVHTElTVCAkcnJlZwotICAgICAgICBJRiBfUlJlZ0xpc3Q8PiIiCi0gICAgICAgICAgICBTVE1GRCAgIHNwISwgeyRfUlJlZ0xpc3QsIGxyfQotICAgICAgICBFTkRJRgotICAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gU2F2ZSBEIHJlZ2lzdGVycwotICAgICAgICBfTV9HRVREUkVHTElTVCAgJGRyZWcgICAgICAgIAotICAgICAgICBJRiBfRFJlZ0xpc3Q8PiIiCi0gICAgICAgICAgICBWU1RNRkQgIHNwISwgeyRfRFJlZ0xpc3R9Ci0gICAgICAgIEVORElGICAgICAgICAgICAgCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBFbnN1cmUgc2l6ZSBjbGFpbWVkIG9uIHN0YWNrIGlzIDgtYnl0ZSBhbGlnbmVkCi0gICAgICAgIElGICgoX1NCeXRlczpBTkQ6NykhPTApCi1fU0J5dGVzICAgICBTRVRBIF9TQnl0ZXMgKyAoOCAtIChfU0J5dGVzOkFORDo3KSkKLSAgICAgICAgRU5ESUYKLSAgICAgICAgCi0gICAgICAgIElGIChfU0J5dGVzIT0wKQotICAgICAgICAgICAgX01fT1BDIFNVQiwgc3AsIHNwLCBfU0J5dGVzCi0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICAKLV9BQnl0ZXMgU0VUQSBfU0J5dGVzICsgX1JCeXRlcyAtIF9Xb3Jrc3BhY2UKLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBQcmludCBmdW5jdGlvbiBuYW1lIGlmIGRlYnVnIGVuYWJsZWQKLSAgICAgICAgTV9QUklOVEYgIiRuYW1lXG4iLAotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gV29yayBvdXQgYSBsaXN0IG9mIFIgc2F2ZWQgcmVnaXN0ZXJzCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIF9NX0dFVFJSRUdMSVNUICRycmVnCi0gICAgICAgIElGICIkcnJlZyI9IiIKLV9SUmVnTGlzdCAgIFNFVFMgIiIKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGICAgICAgICAKLSAgICAgICAgSUYgIiRycmVnIj0ibHIiOkxPUjoiJHJyZWciPSJyNCIKLV9SUmVnTGlzdCAgIFNFVFMgInI0IgotX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzgKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIElGICIkcnJlZyI9InI1IjpMT1I6IiRycmVnIj0icjYiCi1fUlJlZ0xpc3QgICBTRVRTICJyNC1yNiIKLV9SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcysxNgotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgIiRycmVnIj0icjciOkxPUjoiJHJyZWciPSJyOCIKLV9SUmVnTGlzdCAgIFNFVFMgInI0LXI4IgotX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzI0Ci0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRgotICAgICAgICBJRiAiJHJyZWciPSJyOSI6TE9SOiIkcnJlZyI9InIxMCIKLV9SUmVnTGlzdCAgIFNFVFMgInI0LXIxMCIKLV9SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcyszMgotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgIiRycmVnIj0icjExIjpMT1I6IiRycmVnIj0icjEyIgotX1JSZWdMaXN0ICAgU0VUUyAicjQtcjEyIgotX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzQwCi0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRgotICAgICAgICBJTkZPIDEsICJVbnJlY29nbml6ZWQgc2F2ZWQgciByZWdpc3RlciBsaW1pdCAnJHJyZWcnIgotICAgICAgICBNRU5EICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBXb3JrIG91dCBhIGxpc3Qgb2YgRCBzYXZlZCByZWdpc3RlcnMKLSAgICAgICAgTUFDUk8KLSAgICAgICAgX01fR0VURFJFR0xJU1QgJGRyZWcKLSAgICAgICAgSUYgIiRkcmVnIj0iIgotX0RSZWdMaXN0ICAgU0VUUyAiIgotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYgICAgICAgIAotICAgICAgICBJRiAiJGRyZWciPSJkOCIKLV9EUmVnTGlzdCAgIFNFVFMgImQ4IgotX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzgKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIElGICIkZHJlZyI9ImQ5IgotX0RSZWdMaXN0ICAgU0VUUyAiZDgtZDkiCi1fUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrMTYKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIElGICIkZHJlZyI9ImQxMCIKLV9EUmVnTGlzdCAgIFNFVFMgImQ4LWQxMCIKLV9SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcysyNAotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgIiRkcmVnIj0iZDExIgotX0RSZWdMaXN0ICAgU0VUUyAiZDgtZDExIgotX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzMyCi0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRgotICAgICAgICBJRiAiJGRyZWciPSJkMTIiCi1fRFJlZ0xpc3QgICBTRVRTICJkOC1kMTIiCi1fUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrNDAKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIElGICIkZHJlZyI9ImQxMyIKLV9EUmVnTGlzdCAgIFNFVFMgImQ4LWQxMyIKLV9SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcys0OAotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgIiRkcmVnIj0iZDE0IgotX0RSZWdMaXN0ICAgU0VUUyAiZDgtZDE0IgotX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzU2Ci0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRgotICAgICAgICBJRiAiJGRyZWciPSJkMTUiCi1fRFJlZ0xpc3QgICBTRVRTICJkOC1kMTUiCi1fUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrNjQKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIElORk8gMSwgIlVucmVjb2duaXplZCBzYXZlZCBkIHJlZ2lzdGVyIGxpbWl0ICckZHJlZyciCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBQcm9kdWNlIGZ1bmN0aW9uIHJldHVybiBpbnN0cnVjdGlvbnMKLSAgICAgICAgTUFDUk8KLSAgICAgICAgX01fUkVUICRjYwotICAgICAgICBJRiBfRFJlZ0xpc3Q8PiIiCi0gICAgICAgICAgICBWUE9QJGNjIHskX0RSZWdMaXN0fQotICAgICAgICBFTkRJRgotICAgICAgICBJRiBfUlJlZ0xpc3Q9IiIKLSAgICAgICAgICAgIEJYJGNjIGxyCi0gICAgICAgIEVMU0UKLSAgICAgICAgICAgIExETSRjYy5GRCBzcCEsIHskX1JSZWdMaXN0LCBwY30KLSAgICAgICAgRU5ESUYKLSAgICAgICAgTUVORCAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gRWFybHkgRnVuY3Rpb24gRXhpdCBNYWNybwotICAgICAgICA7Ly8gJGNjID0gY29uZGl0aW9uIHRvIGV4aXQgd2l0aAotICAgICAgICA7Ly8gKEV4YW1wbGU6IE1fRVhJVCBFUSkKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9FWElUICAkY2MKLSAgICAgICAgQVNTRVJUICBfSW5GdW5jCi0gICAgICAgIElGICBfU0J5dGVzIT0wCi0gICAgICAgICAgICA7Ly8gUmVzdG9yZSBzdGFjayBmcmFtZSBhbmQgZXhpdAotICAgICAgICAgICAgQiRjYyAgX0VuZCRfRgotICAgICAgICBFTFNFCi0gICAgICAgICAgICA7Ly8gQ2FuIHJldHVybiBkaXJlY3RseQotICAgICAgICAgICAgX01fUkVUICRjYwotICAgICAgICBFTkRJRiAgICAgICAgCi0gICAgICAgIE1FTkQgICAgICAgIAotCi0gICAgICAgIDsvLyBGdW5jdGlvbiBGb290ZXIgTWFjcm8gICAgICAgIAotICAgICAgICA7Ly8gR2VuZXJhdGVzIHRoZSBmdW5jdGlvbiBlcGlsb2d1ZQotICAgICAgICBNQUNSTwotICAgICAgICBNX0VORAotICAgICAgICBBU1NFUlQgX0luRnVuYwotX0luRnVuYyBTRVRMIHtGQUxTRX0KLV9FbmQkX0YKLQotICAgICAgICA7Ly8gUmVzdG9yZSB0aGUgc3RhY2sgcG9pbnRlciB0byBpdHMgb3JpZ2luYWwgdmFsdWUgb24gZnVuY3Rpb24gZW50cnkKLSAgICAgICAgSUYgX1NCeXRlcyE9MAotICAgICAgICAgICAgX01fT1BDIEFERCwgc3AsIHNwLCBfU0J5dGVzCi0gICAgICAgIEVORElGCi0gICAgICAgIF9NX1JFVAotICAgICAgICBFTkRGVU5DCi0KLSAgICAgICAgOy8vIFJlc2V0IHRoZSBnbG9iYWwgc3RhY2sgdHJhY2tpbmcgdmFyaWFibGVzIGJhY2sgdG8gdGhlaXIgCi0gICAgICAgIDsvLyBpbml0aWFsIHZhbHVlcywgYW5kIGluY3JlbWVudCB0aGUgZnVuY3Rpb24gY291bnQKLV9TQnl0ZXMgICAgICAgIFNFVEEgMAotX0YgICAgICAgICAgICAgU0VUQSBfRisxCi0gICAgICAgIE1FTkQKLQotICAgICAgICAgICAgICAgIAotOy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsvLyBEZWJ1ZyBNYWNyb3MKLTsvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICAgICAgR0JMTCAgICBERUJVR19PTgotREVCVUdfT04gU0VUTCAgIHtGQUxTRX0KLSAgICAgICAgR0JMTCAgICBERUJVR19TVEFMTFNfT04KLURFQlVHX1NUQUxMU19PTiBTRVRMIHtGQUxTRX0KLSAgICAgICAgCi0gICAgICAgIDsvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgIDsvLyBEZWJ1ZyBjYWxsIHRvIHByaW50ZgotICAgICAgICA7Ly8gIE1fUFJJTlRGICRmb3JtYXQsICR2YWwwLCAkdmFsMSwgJHZhbDIKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBFeGFtcGxlczoKLSAgICAgICAgOy8vICBNX1BSSU5URiAieD0lMDh4XG4iLCByMAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFRoaXMgbWFjcm8gcHJlc2VydmVzIHRoZSB2YWx1ZSBvZiBhbGwgcmVnaXN0ZXJzIGluY2x1ZGluZyB0aGUKLSAgICAgICAgOy8vIGZsYWdzLgotICAgICAgICA7Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fUFJJTlRGICAkZm9ybWF0LCAkdmFsMCwgJHZhbDEsICR2YWwyCi0gICAgICAgIElGIERFQlVHX09OCi0gICAgICAgIAotICAgICAgICBJTVBPUlQgIHByaW50ZgotICAgICAgICBMQ0xBICAgIG5BcmdzCi1uQXJncwlTRVRBICAgIDAKLSAgICAgICAgCi0gICAgICAgIDsvLyBzYXZlIHJlZ2lzdGVycyBzbyB3ZSBkb24ndCBjb3JydXB0IHRoZW0KLSAgICAgICAgU1RNRkQgICBzcCEsIHtyMC1yMTIsIGxyfQotICAgICAgICAKLSAgICAgICAgOy8vIERyb3Agc3RhY2sgdG8gZ2l2ZSB1cyBzb21lIHdvcmtzcGFjZQotICAgICAgICBTVUIgICAgIHNwLCBzcCwgIzE2Ci0gICAgICAgIAotICAgICAgICA7Ly8gU2F2ZSByZWdpc3RlcnMgd2UgbmVlZCB0byBwcmludCB0byB0aGUgc3RhY2sKLSAgICAgICAgSUYgIiR2YWwyIiA8PiAiIgotICAgICAgICAgICAgQVNTRVJUICIkdmFsMSIgPD4gIiIKLSAgICAgICAgICAgIFNUUiAgICAkdmFsMiwgW3NwLCAjOF0KLW5BcmdzICAgICAgIFNFVEEgICBuQXJncysxCi0gICAgICAgIEVORElGCi0gICAgICAgIElGICIkdmFsMSIgPD4gIiIKLSAgICAgICAgICAgIEFTU0VSVCAiJHZhbDAiIDw+ICIiCi0gICAgICAgICAgICBTVFIgICAgJHZhbDEsIFtzcCwgIzRdCi1uQXJncwkgICAgU0VUQSAgIG5BcmdzKzEKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgIiR2YWwwIjw+IiIKLSAgICAgICAgICAgIFNUUiAgICAkdmFsMCwgW3NwXQotbkFyZ3MJICAgIFNFVEEgICBuQXJncysxCi0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICA7Ly8gTm93IHdlIGFyZSBzYWZlIHRvIGNvcnJ1cHQgcmVnaXN0ZXJzCi0gICAgICAgIEFEUiAgICAgcjAsICVGVDAwCi0gICAgICAgIElGIG5BcmdzPTEKLSAgICAgICAgICBMRFIgICByMSwgW3NwXQotICAgICAgICBFTkRJRgotICAgICAgICBJRiBuQXJncz0yCi0gICAgICAgICAgTERNSUEgc3AsIHtyMSxyMn0KLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgbkFyZ3M9MwotICAgICAgICAgIExETUlBIHNwLCB7cjEscjIscjN9Ci0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICA7Ly8gcHJpbnQgdGhlIHZhbHVlcwotICAgICAgICBNUlMgICAgIHI0LCBjcHNyICAgICAgICA7Ly8gcHJlc2VydmUgZmxhZ3MKLSAgICAgICAgQkwgICAgICBwcmludGYKLSAgICAgICAgTVNSICAgICBjcHNyX2YsIHI0ICAgICAgOy8vIHJlc3RvcmUgZmxhZ3MKLSAgICAgICAgQiAgICAgICAlRlQwMQotMDAgICAgICA7Ly8gc3RyaW5nIHRvIHByaW50Ci0gICAgICAgIERDQiAgICAgIiRmb3JtYXQiLCAwCi0gICAgICAgIEFMSUdOCi0wMSAgICAgIDsvLyBGaW5pc2hlZAotICAgICAgICBBREQgICAgIHNwLCBzcCwgIzE2Ci0gICAgICAgIDsvLyBSZXN0b3JlIHJlZ2lzdGVycwotICAgICAgICBMRE1GRAlzcCEsIHtyMC1yMTIsbHJ9Ci0KLSAgICAgICAgRU5ESUYgICA7Ly8gREVCVUdfT04KLSAgICAgICAgTUVORAotCi0KLSAgICAgICAgOy8vIFN0YWxsIFNpbXVsYXRpb24gTWFjcm8KLSAgICAgICAgOy8vIEluc2VydHMgYSBnaXZlbiBudW1iZXIgb2YgTk9QcyBmb3IgdGhlIGN1cnJlbnRseQotICAgICAgICA7Ly8gIGRlZmluZWQgcGxhdGZvcm0KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9TVEFMTCAkcGxhdDFzdGFsbCwgJHBsYXQyc3RhbGwsICRwbGF0M3N0YWxsLCAkcGxhdDRzdGFsbCwgJHBsYXQ1c3RhbGwsICRwbGF0NnN0YWxsCi0gICAgICAgIElGIERFQlVHX1NUQUxMU19PTgotICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0MXN0YWxsICAgIAotICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0MnN0YWxsICAgIAotICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0M3N0YWxsICAgIAotICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0NHN0YWxsICAgIAotICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0NXN0YWxsICAgIAotICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0NnN0YWxsICAgIAotICAgICAgICBFTkRJRgotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBfTV9TVEFMTF9TVUIgJHBsYXRzdGFsbAotICAgICAgICBJRiAiJHBsYXRzdGFsbCIhPSIiCi0gICAgICAgICAgICBMQ0xBIF9wbGxlbgotICAgICAgICAgICAgTENMUyBfcGwKLSAgICAgICAgICAgIExDTEwgX3BsbG9nCi1fcGxsZW4gICAgICBTRVRBIDpMRU46IiRwbGF0c3RhbGwiCi1fcGwgICAgICAgICBTRVRTICIkcGxhdHN0YWxsIjpMRUZUOihfcGxsZW4gLSAyKQotICAgICAgICAgICAgSUYgOkRFRjokX3BsCi0gICAgICAgICAgICAgICAgSUYgJF9wbAotICAgICAgICAgICAgICAgICAgICBMQ0xTIF9zdAotICAgICAgICAgICAgICAgICAgICBMQ0xBIF9zdG51bQotX3N0ICAgICAgICAgICAgICAgICBTRVRTICIkcGxhdHN0YWxsIjpSSUdIVDoxICAgICAgICAKLV9zdG51bSAgICAgICAgICAgICAgU0VUQSAkX3N0Ci0gICAgICAgICAgICAgICAgICAgIFdISUxFIF9zdG51bT4wCi0JCQlNT1Ygc3AsIHNwCi1fc3RudW0gICAgICAgICAgICAgICAgICBTRVRBIF9zdG51bSAtIDEKLSAgICAgICAgICAgICAgICAgICAgV0VORAotICAgICAgICAgICAgICAgIEVORElGCi0gICAgICAgICAgICBFTkRJRgotICAgICAgICBFTkRJRgotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi07Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOy8vIEVuZGlhbiBJbnZhcmllbmNlIE1hY3JvcwotOy8vIAotOy8vIFRoZSBpZGVhIGJlaGluZCB0aGVzZSBtYWNyb3MgaXMgdGhhdCBpZiBhbiBhcnJheSBpcwotOy8vIGxvYWRlZCBhcyB3b3JkcyB0aGVuIHRoZSBTTVVMMDAgbWFjcm8gd2lsbCBtdWx0aXBseQotOy8vIGFycmF5IGVsZW1lbnRzIDAgcmVnYXJkbGVzcyBvZiB0aGUgZW5kaWFuZXNzIG9mIHRoZQotOy8vIHN5c3RlbS4gRm9yIGxpdHRsZSBlbmRpYW4gU01VTDAwPVNNVUxCQiwgZm9yIGJpZwotOy8vIGVuZGlhbiBTTVVMMDA9U01VTFRUIGFuZCBzaW1pbGFybHkgZm9yIG90aGVyIHBhY2tlZCBvcGVyYXRpb25zLgotOy8vCi07Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIExJQkk0ICAgJGNvbWxpLCAkY29tYmksICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgSUYge0VORElBTn09ImJpZyIKLSAgICAgICAgJGNvbWJpLiRjYyAkYSwgJGIsICRjLCAkZAotICAgICAgICBFTFNFCi0gICAgICAgICRjb21saS4kY2MgJGEsICRiLCAkYywgJGQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTElCSTMgICAkY29tbGksICRjb21iaSwgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIElGIHtFTkRJQU59PSJiaWciCi0gICAgICAgICRjb21iaS4kY2MgJGEsICRiLCAkYwotICAgICAgICBFTFNFCi0gICAgICAgICRjb21saS4kY2MgJGEsICRiLCAkYwotICAgICAgICBFTkRJRgotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gU01MQXh5IG1hY3JvcwotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQTAwICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFCQiwgU01MQVRULCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEEwMSAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBQlQsIFNNTEFUQiwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBMEIgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUJCLCBTTUxBVEIsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQTBUICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFCVCwgU01MQVRULCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEExMCAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBVEIsIFNNTEFCVCwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBMTEgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQVRULCBTTUxBQkIsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQTFCICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFUQiwgU01MQUJCLCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEExVCAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBVFQsIFNNTEFCVCwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBQjAgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUJCLCBTTUxBQlQsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQUIxICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFCVCwgU01MQUJCLCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFUMCAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBVEIsIFNNTEFUVCwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBVDEgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQVRULCBTTUxBVEIsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIFNNVUx4eSBtYWNyb3MKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNVUwwMCAgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIExJQkkzIFNNVUxCQiwgU01VTFRULCAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01VTDAxICAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTElCSTMgU01VTEJULCBTTVVMVEIsICRhLCAkYiwgJGMsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTVVMMEIgICRhLCAkYiwgJGMsICRjYwotICAgICAgICBMSUJJMyBTTVVMQkIsIFNNVUxUQiwgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNVUwwVCAgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIExJQkkzIFNNVUxCVCwgU01VTFRULCAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01VTDEwICAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTElCSTMgU01VTFRCLCBTTVVMQlQsICRhLCAkYiwgJGMsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTVVMMTEgICRhLCAkYiwgJGMsICRjYwotICAgICAgICBMSUJJMyBTTVVMVFQsIFNNVUxCQiwgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNVUwxQiAgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIExJQkkzIFNNVUxUQiwgU01VTEJCLCAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01VTDFUICAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTElCSTMgU01VTFRULCBTTVVMQlQsICRhLCAkYiwgJGMsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTVVMQjAgICRhLCAkYiwgJGMsICRjYwotICAgICAgICBMSUJJMyBTTVVMQkIsIFNNVUxCVCwgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNVUxCMSAgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIExJQkkzIFNNVUxCVCwgU01VTEJCLCAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01VTFQwICAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTElCSTMgU01VTFRCLCBTTVVMVFQsICRhLCAkYiwgJGMsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTVVMVDEgICRhLCAkYiwgJGMsICRjYwotICAgICAgICBMSUJJMyBTTVVMVFQsIFNNVUxUQiwgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBTTUxBV3gsIFNNVUxXeCBtYWNyb3MKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFXMCAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBV0IsIFNNTEFXVCwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBVzEgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQVdULCBTTUxBV0IsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01VTFcwICAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTElCSTMgU01VTFdCLCBTTVVMV1QsICRhLCAkYiwgJGMsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTVVMVzEgICRhLCAkYiwgJGMsICRjYwotICAgICAgICBMSUJJMyBTTVVMV1QsIFNNVUxXQiwgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIE1FTkQKLQotICAgICAgICA7Ly8gU01MQUx4eSBtYWNyb3MKLQotCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFMMDAgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUxCQiwgU01MQUxUVCwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBTDAxICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFMQlQsIFNNTEFMVEIsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQUwwQiAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBTEJCLCBTTUxBTFRCLCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFMMFQgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUxCVCwgU01MQUxUVCwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBTDEwICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFMVEIsIFNNTEFMQlQsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFMMTEgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUxUVCwgU01MQUxCQiwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBTDFCICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFMVEIsIFNNTEFMQkIsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQUwxVCAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBTFRULCBTTUxBTEJULCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFMQjAgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUxCQiwgU01MQUxCVCwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBTEIxICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFMQlQsIFNNTEFMQkIsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQUxUMCAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBTFRCLCBTTUxBTFRULCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFMVDEgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUxUVCwgU01MQUxUQiwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICBFTkRJRiA7Ly8gQVJNQ09NTV9TX0gKLSAgICAgICAgICAgIAotICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtT01YLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybU9NWC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDNhYmQ5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtT01YLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybU9NWF9SZWxlYXNlVmVyc2lvbi5oCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDEyMjkwCi0gKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBUaGlzIGZpbGUgYWxsb3dzIGEgdmVyc2lvbiBvZiB0aGUgT01YIERMIGxpYnJhcmllcyB0byBiZSBidWlsdCB3aGVyZSBzb21lIG9yCi0gKiBhbGwgb2YgdGhlIGZ1bmN0aW9uIG5hbWVzIGNhbiBiZSBnaXZlbiBhIHVzZXIgc3BlY2lmaWVkIHN1ZmZpeC4gCi0gKgotICogWW91IG1pZ2h0IHdhbnQgdG8gdXNlIGl0IHdoZXJlOgotICoKLSAqIC0geW91IHdhbnQgdG8gcmVuYW1lIGEgZnVuY3Rpb24gIm91dCBvZiB0aGUgd2F5IiBzbyB0aGF0IHlvdSBjb3VsZCByZXBsYWNlCi0gKiAgIGEgZnVuY3Rpb24gd2l0aCBhIGRpZmZlcmVudCB2ZXJzaW9uICh0aGUgb3JpZ2luYWwgdmVyc2lvbiB3b3VsZCBzdGlsbCBiZQotICogICBpbiB0aGUgbGlicmFyeSBqdXN0IHdpdGggYSBkaWZmZXJlbnQgbmFtZSAtIHNvIHlvdSBjb3VsZCBkZWJ1ZyB0aGUgbmV3Ci0gKiAgIHZlcnNpb24gYnkgY29tcGFyaW5nIGl0IHRvIHRoZSBvdXRwdXQgb2YgdGhlIG9sZCkKLSAqCi0gKiAtIHlvdSB3YW50IHRvIHJlbmFtZSBhbGwgdGhlIGZ1bmN0aW9ucyB0byB2ZXJzaW9ucyB3aXRoIGEgc3VmZml4IHNvIHRoYXQgCi0gKiAgIHlvdSBjYW4gaW5jbHVkZSB0d28gdmVyc2lvbnMgb2YgdGhlIGxpYnJhcnkgYW5kIGNob29zZSBiZXR3ZWVuIGZ1bmN0aW9ucwotICogICBhdCBydW50aW1lLgotICoKLSAqICAgICBlLmcuIG9teElQQk1fQ29weV9VOF9DMVIgY291bGQgYmUgcmVuYW1lZCBvbXhJUEJNX0NvcHlfVThfQzFSX0NvcnRleEE4Ci0gKiAKLSAqLwotCi0gIAotI2lmbmRlZiBfYXJtT01YX0hfCi0jZGVmaW5lIF9hcm1PTVhfSF8KLQotCi0vKiBXZSBuZWVkIHRvIGRlZmluZSB0aGVzZSB0d28gbWFjcm9zIGluIG9yZGVyIHRvIGV4cGFuZCBhbmQgY29uY2F0ZW5hdGUgdGhlIG5hbWVzICovCi0jZGVmaW5lIE9NWENBVDJCQVIoQSwgQikgb214ICMjIEEgIyMgQgotI2RlZmluZSBPTVhDQVRCQVIoQSwgQikgT01YQ0FUMkJBUihBLCBCKQotCi0vKiBEZWZpbmUgdGhlIHN1ZmZpeCB0byBhZGQgdG8gYWxsIGZ1bmN0aW9ucyAtIHRoZSBkZWZhdWx0IGlzIG5vIHN1ZmZpeCAqLwotI2RlZmluZSBCQVJFX1NVRkZJWCAKLQotCi0KLS8qIERlZmluZSB3aGF0IGhhcHBlbnMgdG8gdGhlIGJhcmUgc3VmZml4LWxlc3MgZnVuY3Rpb25zLCBkb3duIHRvIHRoZSBzdWItZG9tYWluIGFjY3VyYWN5ICovCi0jZGVmaW5lIE9NWEFDQUFDX1NVRkZJWCAgICBCQVJFX1NVRkZJWCAgIAotI2RlZmluZSBPTVhBQ01QM19TVUZGSVggICAgQkFSRV9TVUZGSVgKLSNkZWZpbmUgT01YSUNKUF9TVUZGSVggICAgIEJBUkVfU1VGRklYCi0jZGVmaW5lIE9NWElQQk1fU1VGRklYICAgICBCQVJFX1NVRkZJWAotI2RlZmluZSBPTVhJUENTX1NVRkZJWCAgICAgQkFSRV9TVUZGSVgKLSNkZWZpbmUgT01YSVBQUF9TVUZGSVggICAgIEJBUkVfU1VGRklYCi0jZGVmaW5lIE9NWFNQX1NVRkZJWCAgICAgICBCQVJFX1NVRkZJWAotI2RlZmluZSBPTVhWQ0NPTU1fU1VGRklYICAgQkFSRV9TVUZGSVgKLSNkZWZpbmUgT01YVkNNNFAxMF9TVUZGSVggIEJBUkVfU1VGRklYCi0jZGVmaW5lIE9NWFZDTTRQMl9TVUZGSVggICBCQVJFX1NVRkZJWAotCi0KLQotCi0vKiBEZWZpbmUgd2hhdCB0aGUgZWFjaCBiYXJlLCB1bi1zdWZmaXhlZCBPcGVuTUFYIEFQSSBmdW5jdGlvbiBuYW1lcyBpcyB0byBiZSByZW5hbWVkICovCi0jZGVmaW5lIG9teEFDQUFDX0RlY29kZUNoYW5QYWlyRWx0ICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZUNoYW5QYWlyRWx0LCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX0RlY29kZURhdFN0ckVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZURhdFN0ckVsdCwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVGaWxsRWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVGaWxsRWx0LCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX0RlY29kZUlzU3RlcmVvX1MzMiAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZUlzU3RlcmVvX1MzMiwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVNc1BOU19TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVNc1BOU19TMzJfSSwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVNc1N0ZXJlb19TMzJfSSAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVNc1N0ZXJlb19TMzJfSSwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVQcmdDZmdFbHQgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVQcmdDZmdFbHQsIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfRGVjb2RlVE5TX1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlVE5TX1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX0RlaW50ZXJsZWF2ZVNwZWN0cnVtX1MzMiAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlaW50ZXJsZWF2ZVNwZWN0cnVtX1MzMiwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19FbmNvZGVUTlNfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19FbmNvZGVUTlNfUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfTG9uZ1Rlcm1QcmVkaWN0X1MzMiAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfTG9uZ1Rlcm1QcmVkaWN0X1MzMiwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19Mb25nVGVybVJlY29uc3RydWN0X1MzMl9JICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19Mb25nVGVybVJlY29uc3RydWN0X1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX01EQ1RGd2RfUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX01EQ1RGd2RfUzMyLCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX01EQ1RJbnZfUzMyX1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX01EQ1RJbnZfUzMyX1MxNiwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19Ob2lzZWxlc3NEZWNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19Ob2lzZWxlc3NEZWNvZGUsIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfUXVhbnRJbnZfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfUXVhbnRJbnZfUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfVW5wYWNrQURJRkhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfVW5wYWNrQURJRkhlYWRlciwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19VbnBhY2tBRFRTRnJhbWVIZWFkZXIgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19VbnBhY2tBRFRTRnJhbWVIZWFkZXIsIE9NWEFDQUFDX1NVRkZJWCkKLQotCi0jZGVmaW5lIG9teEFDTVAzX0h1ZmZtYW5EZWNvZGVfUzMyICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX0h1ZmZtYW5EZWNvZGVfUzMyLCBPTVhBQ01QM19TVUZGSVgpCi0jZGVmaW5lIG9teEFDTVAzX0h1ZmZtYW5EZWNvZGVTZmJfUzMyICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX0h1ZmZtYW5EZWNvZGVTZmJfUzMyLCBPTVhBQ01QM19TVUZGSVgpCi0jZGVmaW5lIG9teEFDTVAzX0h1ZmZtYW5EZWNvZGVTZmJNYnBfUzMyICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX0h1ZmZtYW5EZWNvZGVTZmJNYnBfUzMyLCBPTVhBQ01QM19TVUZGSVgpCi0jZGVmaW5lIG9teEFDTVAzX01EQ1RJbnZfUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX01EQ1RJbnZfUzMyLCBPTVhBQ01QM19TVUZGSVgpCi0jZGVmaW5lIG9teEFDTVAzX1JlUXVhbnRpemVfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1JlUXVhbnRpemVfUzMyX0ksIE9NWEFDTVAzX1NVRkZJWCkKLSNkZWZpbmUgb214QUNNUDNfUmVRdWFudGl6ZVNmYl9TMzJfSSAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfUmVRdWFudGl6ZVNmYl9TMzJfSSwgT01YQUNNUDNfU1VGRklYKQotI2RlZmluZSBvbXhBQ01QM19TeW50aFBRTUZfUzMyX1MxNiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19TeW50aFBRTUZfUzMyX1MxNiwgT01YQUNNUDNfU1VGRklYKQotI2RlZmluZSBvbXhBQ01QM19VbnBhY2tGcmFtZUhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19VbnBhY2tGcmFtZUhlYWRlciwgT01YQUNNUDNfU1VGRklYKQotI2RlZmluZSBvbXhBQ01QM19VbnBhY2tTY2FsZUZhY3RvcnNfUzggICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19VbnBhY2tTY2FsZUZhY3RvcnNfUzgsIE9NWEFDTVAzX1NVRkZJWCkKLSNkZWZpbmUgb214QUNNUDNfVW5wYWNrU2lkZUluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfVW5wYWNrU2lkZUluZm8sIE9NWEFDTVAzX1NVRkZJWCkKLQotI2RlZmluZSBvbXhJQ0pQX0NvcHlFeHBhbmRfVThfQzMgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0NvcHlFeHBhbmRfVThfQzMsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVEZ3ZF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVEZ3ZF9TMTYsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVEZ3ZF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVEZ3ZF9TMTZfSSwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENUSW52X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUSW52X1MxNiwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENUSW52X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUSW52X1MxNl9JLCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEZ3ZF9NdWx0aXBsZV9TMTYgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEZ3ZF9NdWx0aXBsZV9TMTYsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50RndkX1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50RndkX1MxNiwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENUUXVhbnRGd2RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRGd2RfUzE2X0ksIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50RndkVGFibGVJbml0ICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50RndkVGFibGVJbml0LCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEludl9NdWx0aXBsZV9TMTYgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEludl9NdWx0aXBsZV9TMTYsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50SW52X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50SW52X1MxNiwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENUUXVhbnRJbnZfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRJbnZfUzE2X0ksIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50SW52VGFibGVJbml0ICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50SW52VGFibGVJbml0LCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EZWNvZGVIdWZmbWFuOHg4X0RpcmVjdF9TMTZfQzEgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EZWNvZGVIdWZmbWFuOHg4X0RpcmVjdF9TMTZfQzEsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RlY29kZUh1ZmZtYW5TcGVjR2V0QnVmU2l6ZV9VOCAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RlY29kZUh1ZmZtYW5TcGVjR2V0QnVmU2l6ZV9VOCwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRGVjb2RlSHVmZm1hblNwZWNJbml0X1U4ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRGVjb2RlSHVmZm1hblNwZWNJbml0X1U4LCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9FbmNvZGVIdWZmbWFuOHg4X0RpcmVjdF9TMTZfVTFfQzEgICAgICAgICBPTVhDQVRCQVIoSUNKUF9FbmNvZGVIdWZmbWFuOHg4X0RpcmVjdF9TMTZfVTFfQzEsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0VuY29kZUh1ZmZtYW5TcGVjR2V0QnVmU2l6ZV9VOCAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0VuY29kZUh1ZmZtYW5TcGVjR2V0QnVmU2l6ZV9VOCwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRW5jb2RlSHVmZm1hblNwZWNJbml0X1U4ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRW5jb2RlSHVmZm1hblNwZWNJbml0X1U4LCBPTVhJQ0pQX1NVRkZJWCkKLQotI2RlZmluZSBvbXhJUEJNX0FkZENfVThfQzFSX1NmcyAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUEJNX0FkZENfVThfQzFSX1NmcywgT01YSVBCTV9TVUZGSVgpCi0jZGVmaW5lIG9teElQQk1fQ29weV9VOF9DMVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQk1fQ29weV9VOF9DMVIsIE9NWElQQk1fU1VGRklYKQotI2RlZmluZSBvbXhJUEJNX0NvcHlfVThfQzNSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUEJNX0NvcHlfVThfQzNSLCBPTVhJUEJNX1NVRkZJWCkKLSNkZWZpbmUgb214SVBCTV9NaXJyb3JfVThfQzFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBCTV9NaXJyb3JfVThfQzFSLCBPTVhJUEJNX1NVRkZJWCkKLSNkZWZpbmUgb214SVBCTV9NdWxDX1U4X0MxUl9TZnMgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBCTV9NdWxDX1U4X0MxUl9TZnMsIE9NWElQQk1fU1VGRklYKQotCi0jZGVmaW5lIG9teElQQ1NfQ29sb3JUd2lzdFExNF9VOF9DM1IgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfQ29sb3JUd2lzdFExNF9VOF9DM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX0JHUjU2NVRvWUNiQ3I0MjBMU19NQ1VfVTE2X1MxNl9DM1AzUiAgICAgIE9NWENBVEJBUihJUENTX0JHUjU2NVRvWUNiQ3I0MjBMU19NQ1VfVTE2X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfQkdSNTY1VG9ZQ2JDcjQyMkxTX01DVV9VMTZfUzE2X0MzUDNSICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSNTY1VG9ZQ2JDcjQyMkxTX01DVV9VMTZfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19CR1I1NjVUb1lDYkNyNDQ0TFNfTUNVX1UxNl9TMTZfQzNQM1IgICAgICBPTVhDQVRCQVIoSVBDU19CR1I1NjVUb1lDYkNyNDQ0TFNfTUNVX1UxNl9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX0JHUjg4OFRvWUNiQ3I0MjBMU19NQ1VfVThfUzE2X0MzUDNSICAgICAgIE9NWENBVEJBUihJUENTX0JHUjg4OFRvWUNiQ3I0MjBMU19NQ1VfVThfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19CR1I4ODhUb1lDYkNyNDIyTFNfTUNVX1U4X1MxNl9DM1AzUiAgICAgICBPTVhDQVRCQVIoSVBDU19CR1I4ODhUb1lDYkNyNDIyTFNfTUNVX1U4X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfQkdSODg4VG9ZQ2JDcjQ0NExTX01DVV9VOF9TMTZfQzNQM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSODg4VG9ZQ2JDcjQ0NExTX01DVV9VOF9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwUnN6Q3NjUm90QkdSX1U4X1AzQzNSICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwUnN6Q3NjUm90QkdSX1U4X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMFJzelJvdF9VOF9QM1IgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMFJzelJvdF9VOF9QM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwVG9CR1I1NjVfVThfVTE2X1AzQzNSICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwVG9CR1I1NjVfVThfVTE2X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMFRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMFRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlJzekNzY1JvdEJHUl9VOF9QM0MzUiAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlJzekNzY1JvdEJHUl9VOF9QM0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfQ2JZQ3JZNDIyUnN6Q3NjUm90QkdSX1U4X1UxNl9DMlIgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfQ2JZQ3JZNDIyUnN6Q3NjUm90QkdSX1U4X1UxNl9DMlIsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyUnN6Um90X1U4X1AzUiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyUnN6Um90X1U4X1AzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiWUNyNDIyVG9CR1I1NjVfVThfVTE2X0MyQzNSICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiWUNyNDIyVG9CR1I1NjVfVThfVTE2X0MyQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYllDcjQyMlRvQkdSODg4X1U4X0MyQzNSICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYllDcjQyMlRvQkdSODg4X1U4X0MyQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX0NiWUNyWTQyMlRvWUNiQ3I0MjBSb3RhdGVfVThfQzJQM1IgICAgICAgIE9NWENBVEJBUihJUENTX0NiWUNyWTQyMlRvWUNiQ3I0MjBSb3RhdGVfVThfQzJQM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyVG9ZQ2JDcjQyMFJvdGF0ZV9VOF9QM1IgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyVG9ZQ2JDcjQyMFJvdGF0ZV9VOF9QM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDQ0VG9CR1I1NjVfVThfVTE2X0MzUiAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDQ0VG9CR1I1NjVfVThfVTE2X0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0NDRUb0JHUjU2NV9VOF9VMTZfUDNDM1IgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0NDRUb0JHUjU2NV9VOF9VMTZfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDQ0VG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDQ0VG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0NDRUb0JHUjg4OF9VOF9DM1IgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0NDRUb0JHUjg4OF9VOF9DM1IsIE9NWElQQ1NfU1VGRklYKQotCi0jZGVmaW5lIG9teElQUFBfRGVibG9ja19Ib3JFZGdlX1U4X0kgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfRGVibG9ja19Ib3JFZGdlX1U4X0ksIE9NWElQUFBfU1VGRklYKQotI2RlZmluZSBvbXhJUFBQX0RlYmxvY2tfVmVyRWRnZV9VOF9JICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0RlYmxvY2tfVmVyRWRnZV9VOF9JLCBPTVhJUFBQX1NVRkZJWCkKLSNkZWZpbmUgb214SVBQUF9GaWx0ZXJGSVJfVThfQzFSICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9GaWx0ZXJGSVJfVThfQzFSLCBPTVhJUFBQX1NVRkZJWCkKLSNkZWZpbmUgb214SVBQUF9GaWx0ZXJNZWRpYW5fVThfQzFSICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9GaWx0ZXJNZWRpYW5fVThfQzFSLCBPTVhJUFBQX1NVRkZJWCkKLSNkZWZpbmUgb214SVBQUF9HZXRDZW50cmFsTW9tZW50X1M2NCAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9HZXRDZW50cmFsTW9tZW50X1M2NCwgT01YSVBQUF9TVUZGSVgpCi0jZGVmaW5lIG9teElQUFBfR2V0U3BhdGlhbE1vbWVudF9TNjQgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfR2V0U3BhdGlhbE1vbWVudF9TNjQsIE9NWElQUFBfU1VGRklYKQotI2RlZmluZSBvbXhJUFBQX01vbWVudEdldFN0YXRlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX01vbWVudEdldFN0YXRlU2l6ZSwgT01YSVBQUF9TVUZGSVgpCi0jZGVmaW5lIG9teElQUFBfTW9tZW50SW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfTW9tZW50SW5pdCwgT01YSVBQUF9TVUZGSVgpCi0jZGVmaW5lIG9teElQUFBfTW9tZW50c19VOF9DMVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfTW9tZW50c19VOF9DMVIsIE9NWElQUFBfU1VGRklYKQotI2RlZmluZSBvbXhJUFBQX01vbWVudHNfVThfQzNSICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX01vbWVudHNfVThfQzNSLCBPTVhJUFBQX1NVRkZJWCkKLQotI2RlZmluZSBvbXhTUF9CbG9ja0V4cF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9CbG9ja0V4cF9TMTYsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfQmxvY2tFeHBfUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfQmxvY2tFeHBfUzMyLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0NvcHlfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0NvcHlfUzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0RvdFByb2RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0RvdFByb2RfUzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0RvdFByb2RfUzE2X1NmcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0RvdFByb2RfUzE2X1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRGd2RfQ1RvQ19TQzE2X1NmcyAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRGd2RfQ1RvQ19TQzE2X1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRGd2RfQ1RvQ19TQzMyX1NmcyAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRGd2RfQ1RvQ19TQzMyX1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRGd2RfUlRvQ0NTX1MxNlMzMl9TZnMgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRGd2RfUlRvQ0NTX1MxNlMzMl9TZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZURndkX1JUb0NDU19TMzJfU2ZzICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZURndkX1JUb0NDU19TMzJfU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEdldEJ1ZlNpemVfQ19TQzE2ICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEdldEJ1ZlNpemVfQ19TQzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEdldEJ1ZlNpemVfQ19TQzMyICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEdldEJ1ZlNpemVfQ19TQzMyLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEdldEJ1ZlNpemVfUl9TMTZTMzIgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEdldEJ1ZlNpemVfUl9TMTZTMzIsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZUR2V0QnVmU2l6ZV9SX1MzMiAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUR2V0QnVmU2l6ZV9SX1MzMiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRJbml0X0NfU0MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbml0X0NfU0MxNiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRJbml0X0NfU0MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbml0X0NfU0MzMiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRJbml0X1JfUzE2UzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbml0X1JfUzE2UzMyLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEluaXRfUl9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEluaXRfUl9TMzIsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZUSW52X0NDU1RvUl9TMzJfU2ZzICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW52X0NDU1RvUl9TMzJfU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEludl9DQ1NUb1JfUzMyUzE2X1NmcyAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEludl9DQ1NUb1JfUzMyUzE2X1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRJbnZfQ1RvQ19TQzE2X1NmcyAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbnZfQ1RvQ19TQzE2X1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRJbnZfQ1RvQ19TQzMyX1NmcyAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbnZfQ1RvQ19TQzMyX1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GaWx0ZXJNZWRpYW5fUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GaWx0ZXJNZWRpYW5fUzMyLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZpbHRlck1lZGlhbl9TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZpbHRlck1lZGlhbl9TMzJfSSwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GSVJfRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJfRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GSVJfRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJfRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZJUl9EaXJlY3RfUzE2X0lTZnMgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUl9EaXJlY3RfUzE2X0lTZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRklSX0RpcmVjdF9TMTZfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklSX0RpcmVjdF9TMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZJUk9uZV9EaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUk9uZV9EaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZJUk9uZV9EaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUk9uZV9EaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRklST25lX0RpcmVjdF9TMTZfSVNmcyAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklST25lX0RpcmVjdF9TMTZfSVNmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GSVJPbmVfRGlyZWN0X1MxNl9TZnMgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJPbmVfRGlyZWN0X1MxNl9TZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfSUlSX0JpUXVhZERpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlSX0JpUXVhZERpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfSUlSX0JpUXVhZERpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlSX0JpUXVhZERpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9JSVJfRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJfRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9JSVJfRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJfRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0lJUk9uZV9CaVF1YWREaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUk9uZV9CaVF1YWREaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0lJUk9uZV9CaVF1YWREaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUk9uZV9CaVF1YWREaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfSUlST25lX0RpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlST25lX0RpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfSUlST25lX0RpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlST25lX0RpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQotCi0jZGVmaW5lIG9teFZDQ09NTV9BdmVyYWdlXzE2eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9BdmVyYWdlXzE2eCwgT01YVkNDT01NX1NVRkZJWCkKLSNkZWZpbmUgb214VkNDT01NX0F2ZXJhZ2VfOHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0F2ZXJhZ2VfOHgsIE9NWFZDQ09NTV9TVUZGSVgpCi0jZGVmaW5lIG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2sgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2ssIE9NWFZDQ09NTV9TVUZGSVgpCi0jZGVmaW5lIG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FEICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FELCBPTVhWQ0NPTU1fU1VGRklYKQotI2RlZmluZSBvbXhWQ0NPTU1fQ29weTE2eDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQ29weTE2eDE2LCBPTVhWQ0NPTU1fU1VGRklYKQotI2RlZmluZSBvbXhWQ0NPTU1fQ29weTh4OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQ29weTh4OCwgT01YVkNDT01NX1NVRkZJWCkKLSNkZWZpbmUgb214VkNDT01NX0V4cGFuZEZyYW1lX0kgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0V4cGFuZEZyYW1lX0ksIE9NWFZDQ09NTV9TVUZGSVgpCi0jZGVmaW5lIG9teFZDQ09NTV9MaW1pdE1WVG9SZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9MaW1pdE1WVG9SZWN0LCBPTVhWQ0NPTU1fU1VGRklYKQotI2RlZmluZSBvbXhWQ0NPTU1fU0FEXzE2eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fU0FEXzE2eCwgT01YVkNDT01NX1NVRkZJWCkKLSNkZWZpbmUgb214VkNDT01NX1NBRF84eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX1NBRF84eCwgT01YVkNDT01NX1NVRkZJWCkKLQotI2RlZmluZSBvbXhWQ000UDEwX0F2ZXJhZ2VfNHggICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0F2ZXJhZ2VfNHgsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSSAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0RlYmxvY2tDaHJvbWFfSSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSSAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRGVibG9ja0x1bWFfSSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQyAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQywgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkIE9NWENBVEJBUihWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0ksIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9HZXRWTENJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9HZXRWTENJbmZvLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZCAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfTUVHZXRCdWZTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfTUVHZXRCdWZTaXplLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9NRUluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9NRUluaXQsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2ICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2LCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0ICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0LCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfU0FEXzR4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FEXzR4LCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9TQURRdWFyXzE2eCAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TQURRdWFyXzE2eCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfU0FEUXVhcl80eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FEUXVhcl80eCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfU0FEUXVhcl84eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FEUXVhcl84eCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfU0FURF80eDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FURF80eDQsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpciAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpciwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQyAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQywgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDLCBPTVhWQ000UDEwX1NVRkZJWCkKLQotI2RlZmluZSBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2ICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2LCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OCAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OCwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDggICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDgsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9EQ1Q4eDhibGsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EQ1Q4eDhibGssIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0VuY29kZU1WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0VuY29kZU1WLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0ZpbmRNVnByZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0ZpbmRNVnByZWQsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9JRENUOHg4YmxrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9JRENUOHg4YmxrLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfTUNSZWNvbkJsb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfTUNSZWNvbkJsb2NrLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfTUVHZXRCdWZTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfTUVHZXRCdWZTaXplLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfTUVJbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfTUVJbml0LCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfUXVhbnRJbnRlcl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUXVhbnRJbnRlcl9JLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfUXVhbnRJbnRyYV9JICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUXVhbnRJbnRyYV9JLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUXVhbnRJbnZJbnRlcl9JLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUXVhbnRJbnZJbnRyYV9JLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSwgT01YVkNNNFAyX1NVRkZJWCkKLQotCi0jZW5kaWYgLyogX2FybU9NWF9oXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9vbXh0eXBlcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9vbXh0eXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTJjYjBkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvb214dHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioKLSAqIEZpbGU6IG9teHR5cGVzLmgKLSAqIEJyaWVmOiBEZWZpbmVzIGJhc2ljIERhdGEgdHlwZXMgdXNlZCBpbiBPcGVuTUFYIHYxLjAuMiBoZWFkZXIgZmlsZXMuCi0gKgotICogQ29weXJpZ2h0IKkgMjAwNS0yMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0gKgotICogVGhlc2UgbWF0ZXJpYWxzIGFyZSBwcm90ZWN0ZWQgYnkgY29weXJpZ2h0IGxhd3MgYW5kIGNvbnRhaW4gbWF0ZXJpYWwgCi0gKiBwcm9wcmlldGFyeSB0byB0aGUgS2hyb25vcyBHcm91cCwgSW5jLiAgWW91IG1heSB1c2UgdGhlc2UgbWF0ZXJpYWxzIAotICogZm9yIGltcGxlbWVudGluZyBLaHJvbm9zIHNwZWNpZmljYXRpb25zLCB3aXRob3V0IGFsdGVyaW5nIG9yIHJlbW92aW5nIAotICogYW55IHRyYWRlbWFyaywgY29weXJpZ2h0IG9yIG90aGVyIG5vdGljZSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uLgotICogCi0gKiBLaHJvbm9zIEdyb3VwIG1ha2VzIG5vLCBhbmQgZXhwcmVzc2x5IGRpc2NsYWltcyBhbnksIHJlcHJlc2VudGF0aW9ucyAKLSAqIG9yIHdhcnJhbnRpZXMsIGV4cHJlc3Mgb3IgaW1wbGllZCwgcmVnYXJkaW5nIHRoZXNlIG1hdGVyaWFscywgaW5jbHVkaW5nLCAKLSAqIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcyAKLSAqIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBvciBub24taW5mcmluZ2VtZW50IG9mIGFueSBpbnRlbGxlY3R1YWwgcHJvcGVydHkuIAotICogS2hyb25vcyBHcm91cCBtYWtlcyBubywgYW5kIGV4cHJlc3NseSBkaXNjbGFpbXMgYW55LCB3YXJyYW50aWVzLCBleHByZXNzIAotICogb3IgaW1wbGllZCwgcmVnYXJkaW5nIHRoZSBjb3JyZWN0bmVzcywgYWNjdXJhY3ksIGNvbXBsZXRlbmVzcywgdGltZWxpbmVzcywgCi0gKiBhbmQgcmVsaWFiaWxpdHkgb2YgdGhlc2UgbWF0ZXJpYWxzLiAKLSAqCi0gKiBVbmRlciBubyBjaXJjdW1zdGFuY2VzIHdpbGwgdGhlIEtocm9ub3MgR3JvdXAsIG9yIGFueSBvZiBpdHMgUHJvbW90ZXJzLCAKLSAqIENvbnRyaWJ1dG9ycyBvciBNZW1iZXJzIG9yIHRoZWlyIHJlc3BlY3RpdmUgcGFydG5lcnMsIG9mZmljZXJzLCBkaXJlY3RvcnMsIAotICogZW1wbG95ZWVzLCBhZ2VudHMgb3IgcmVwcmVzZW50YXRpdmVzIGJlIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMsIHdoZXRoZXIgCi0gKiBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBmb3IgbG9zdCByZXZlbnVlcywgCi0gKiBsb3N0IHByb2ZpdHMsIG9yIG90aGVyd2lzZSwgYXJpc2luZyBmcm9tIG9yIGluIGNvbm5lY3Rpb24gd2l0aCB0aGVzZSAKLSAqIG1hdGVyaWFscy4KLSAqIAotICogS2hyb25vcyBhbmQgT3Blbk1BWCBhcmUgdHJhZGVtYXJrcyBvZiB0aGUgS2hyb25vcyBHcm91cCBJbmMuIAotICoKLSAqLwotICAKLSNpZm5kZWYgX09NWFRZUEVTX0hfCi0jZGVmaW5lIF9PTVhUWVBFU19IXwotCi0jaW5jbHVkZSA8bGltaXRzLmg+IAotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jZGVmaW5lIE9NWF9JTgotI2RlZmluZSBPTVhfT1VUCi0jZGVmaW5lIE9NWF9JTk9VVAotCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgCi0gICAgLyogTWFuZGF0b3J5IHJldHVybiBjb2RlcyAtIHVzZSBjYXNlcyBhcmUgZXhwbGljaXRseSBkZXNjcmliZWQgZm9yIGVhY2ggZnVuY3Rpb24gKi8KLSAgICBPTVhfU3RzX05vRXJyICAgICAgICAgICAgICAgICAgICA9ICAwLCAgICAvKiBObyBlcnJvciwgdGhlIGZ1bmN0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgKi8KLSAgICBPTVhfU3RzX0VyciAgICAgICAgICAgICAgICAgICAgICA9IC0yLCAgICAvKiBVbmtub3duL3Vuc3BlY2lmaWVkIGVycm9yICovICAgIAotICAgIE9NWF9TdHNfSW52YWxpZEJpdHN0cmVhbVZhbEVyciAgID0gLTE4MiwgIC8qIEludmFsaWQgdmFsdWUgZGV0ZWN0ZWQgZHVyaW5nIGJpdHN0cmVhbSBwcm9jZXNzaW5nICovICAgIAotICAgIE9NWF9TdHNfTWVtQWxsb2NFcnIgICAgICAgICAgICAgID0gLTksICAgIC8qIE5vdCBlbm91Z2ggbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIG9wZXJhdGlvbiAqLwotICAgIE9NWF9TdHNBQ0FBQ19HYWluQ3RyRXJyICAgIAkgICAgID0gLTE1OSwgIC8qIEFBQzogVW5zdXBwb3J0ZWQgZ2FpbiBjb250cm9sIGRhdGEgZGV0ZWN0ZWQgKi8KLSAgICBPTVhfU3RzQUNBQUNfUHJnTnVtRXJyICAgICAgICAgICA9IC0xNjcsICAvKiBBQUM6IEludmFsaWQgbnVtYmVyIG9mIGVsZW1lbnRzIGZvciBvbmUgcHJvZ3JhbSAgICovCi0gICAgT01YX1N0c0FDQUFDX0NvZWZWYWxFcnIgICAgICAgICAgPSAtMTYzLCAgLyogQUFDOiBJbnZhbGlkIHF1YW50aXplZCBjb2VmZmljaWVudCB2YWx1ZSAgICAgICAgICAqLyAgICAgCi0gICAgT01YX1N0c0FDQUFDX01heFNmYkVyciAgICAgICAgICAgPSAtMTYyLCAgLyogQUFDOiBJbnZhbGlkIG1heFNmYiB2YWx1ZSBpbiByZWxhdGlvbiB0byBudW1Td2IgKi8gICAgCi0JT01YX1N0c0FDQUFDX1Bsc0RhdGFFcnIJCSAgICAgPSAtMTYwLCAgLyogQUFDOiBwdWxzZSBlc2NhcGUgc2VxdWVuY2UgZGF0YSBlcnJvciAqLwotCi0gICAgLyogT3B0aW9uYWwgcmV0dXJuIGNvZGVzIC0gdXNlIGNhc2VzIGFyZSBleHBsaWNpdGx5IGRlc2NyaWJlZCBmb3IgZWFjaCBmdW5jdGlvbiovCi0gICAgT01YX1N0c19CYWRBcmdFcnIgICAgICAgICAgICAgICAgPSAtNSwgICAgLyogQmFkIEFyZ3VtZW50cyAqLwotCi0gICAgT01YX1N0c0FDQUFDX1Ruc051bUZpbHRFcnIgICAgICAgPSAtMTU3LCAgLyogQUFDOiBJbnZhbGlkIG51bWJlciBvZiBUTlMgZmlsdGVycyAgKi8KLSAgICBPTVhfU3RzQUNBQUNfVG5zTGVuRXJyICAgICAgICAgICA9IC0xNTYsICAvKiBBQUM6IEludmFsaWQgVE5TIHJlZ2lvbiBsZW5ndGggICovICAgCi0gICAgT01YX1N0c0FDQUFDX1Ruc09yZGVyRXJyICAgICAgICAgPSAtMTU1LCAgLyogQUFDOiBJbnZhbGlkIG9yZGVyIG9mIFROUyBmaWx0ZXIgICovICAgICAgICAgICAgICAgICAgCi0gICAgT01YX1N0c0FDQUFDX1Ruc0NvZWZSZXNFcnIgICAgICAgPSAtMTU0LCAgLyogQUFDOiBJbnZhbGlkIGJpdC1yZXNvbHV0aW9uIGZvciBUTlMgZmlsdGVyIGNvZWZmaWNpZW50cyAgKi8KLSAgICBPTVhfU3RzQUNBQUNfVG5zQ29lZkVyciAgICAgICAgICA9IC0xNTMsICAvKiBBQUM6IEludmFsaWQgVE5TIGZpbHRlciBjb2VmZmljaWVudHMgICovICAgICAgICAgICAgICAgICAgCi0gICAgT01YX1N0c0FDQUFDX1Ruc0RpcmVjdEVyciAgICAgICAgPSAtMTUyLCAgLyogQUFDOiBJbnZhbGlkIFROUyBmaWx0ZXIgZGlyZWN0aW9uICAqLyAgCi0KLSAgICBPTVhfU3RzSUNKUF9KUEVHTWFya2VyRXJyICAgICAgICA9IC0xODMsICAvKiBKUEVHIG1hcmtlciBlbmNvdW50ZXJlZCB3aXRoaW4gYW4gZW50cm9weS1jb2RlZCBibG9jazsgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIdWZmbWFuIGRlY29kaW5nIG9wZXJhdGlvbiB0ZXJtaW5hdGVkIGVhcmx5LiAgICAgICAgICAgKi8KLSAgICBPTVhfU3RzSUNKUF9KUEVHTWFya2VyICAgICAgICAgICA9IC0xODEsICAvKiBKUEVHIG1hcmtlciBlbmNvdW50ZXJlZDsgSHVmZm1hbiBkZWNvZGluZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9wZXJhdGlvbiB0ZXJtaW5hdGVkIGVhcmx5LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIE9NWF9TdHNJUFBQX0NvbnRleHRNYXRjaEVyciAgICAgID0gLTE3LCAgIC8qIENvbnRleHQgcGFyYW1ldGVyIGRvZXNuJ3QgbWF0Y2ggdG8gdGhlIG9wZXJhdGlvbiAqLwotCi0gICAgT01YX1N0c1NQX0V2ZW5NZWRpYW5NYXNrU2l6ZUVyciAgPSAtMTgwLCAgLyogRXZlbiBzaXplIG9mIHRoZSBNZWRpYW4gRmlsdGVyIG1hc2sgd2FzIHJlcGxhY2VkIGJ5IHRoZSBvZGQgb25lICovCi0KLSAgICBPTVhfU3RzX01heGltdW1FbnVtZXJhdGlvbiAgICAgICA9IElOVF9NQVggIC8qUGxhY2Vob2xkZXIsIGZvcmNlcyBlbnVtIG9mIHNpemUgT01YX0lOVCovCi0gICAgCi0gfSBPTVhSZXN1bHQ7ICAgICAgICAgIC8qKiBSZXR1cm4gdmFsdWUgb3IgZXJyb3IgdmFsdWUgcmV0dXJuZWQgZnJvbSBhIGZ1bmN0aW9uLiBJZGVudGljYWwgdG8gT01YX0lOVCAqLwotCi0gCi0vKiBPTVhfVTggKi8KLXR5cGVkZWYgdWludDhfdCBPTVhfVTg7Ci0gCi0vKiBPTVhfUzggKi8KLXR5cGVkZWYgaW50OF90IE9NWF9TODsKLSAKLS8qIE9NWF9VMTYgKi8KLXR5cGVkZWYgdWludDE2X3QgT01YX1UxNjsKLQotLyogT01YX1MxNiAqLwotdHlwZWRlZiBpbnQxNl90IE9NWF9TMTY7Ci0KLS8qIE9NWF9VMzIgKi8KLXR5cGVkZWYgdWludDMyX3QgT01YX1UzMjsKLQotLyogT01YX1MzMiAqLwotdHlwZWRlZiBpbnQzMl90IE9NWF9TMzI7Ci0KLS8qIE9NWF9VNjQgJiBPTVhfUzY0ICovCi0jaWYgZGVmaW5lZCggX1dJTjMyICkgfHwgZGVmaW5lZCAoIF9XSU42NCApCi0gICAgdHlwZWRlZiBfX2ludDY0IE9NWF9TNjQ7IC8qKiBTaWduZWQgNjQtYml0IGludGVnZXIgKi8KLSAgICB0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgT01YX1U2NDsgLyoqIFVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCi0gICAgI2RlZmluZSBPTVhfTUlOX1M2NAkJCSgweDgwMDAwMDAwMDAwMDAwMDBpNjQpCi0gICAgI2RlZmluZSBPTVhfTUlOX1U2NAkJCSgweDAwMDAwMDAwMDAwMDAwMDBpNjQpCi0gICAgI2RlZmluZSBPTVhfTUFYX1M2NAkJCSgweDdGRkZGRkZGRkZGRkZGRkZpNjQpCi0gICAgI2RlZmluZSBPTVhfTUFYX1U2NAkJCSgweEZGRkZGRkZGRkZGRkZGRkZpNjQpCi0jZWxzZQotICAgIHR5cGVkZWYgaW50NjRfdCBPTVhfUzY0OyAvKiogU2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCi0gICAgdHlwZWRlZiB1aW50NjRfdCBPTVhfVTY0OyAvKiogVW5zaWduZWQgNjQtYml0IGludGVnZXIgKi8KLSAgICAjZGVmaW5lIE9NWF9NSU5fUzY0CQkJKDB4ODAwMDAwMDAwMDAwMDAwMExMKQotICAgICNkZWZpbmUgT01YX01JTl9VNjQJCQkoMHgwMDAwMDAwMDAwMDAwMDAwTEwpCi0gICAgI2RlZmluZSBPTVhfTUFYX1M2NAkJCSgweDdGRkZGRkZGRkZGRkZGRkZMTCkKLSAgICAjZGVmaW5lIE9NWF9NQVhfVTY0CQkJKDB4RkZGRkZGRkZGRkZGRkZGRkxMKQotI2VuZGlmCi0KLS8qIE9NWF9TQzggKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIE9NWF9TOCBSZTsgLyoqIFJlYWwgcGFydCAqLwotICBPTVhfUzggSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKLQkKLX0gT01YX1NDODsgLyoqIFNpZ25lZCA4LWJpdCBjb21wbGV4IG51bWJlciAqLwotCi0KLS8qIE9NWF9TQzE2ICovCi10eXBlZGVmIHN0cnVjdAotewotICBPTVhfUzE2IFJlOyAvKiogUmVhbCBwYXJ0ICovCi0gIE9NWF9TMTYgSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKLQkKLX0gT01YX1NDMTY7IC8qKiBTaWduZWQgMTYtYml0IGNvbXBsZXggbnVtYmVyICovCi0KLQotLyogT01YX1NDMzIgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIE9NWF9TMzIgUmU7IC8qKiBSZWFsIHBhcnQgKi8KLSAgT01YX1MzMiBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQotCQotfSBPTVhfU0MzMjsgLyoqIFNpZ25lZCAzMi1iaXQgY29tcGxleCBudW1iZXIgKi8KLQotCi0vKiBPTVhfU0M2NCAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgT01YX1M2NCBSZTsgLyoqIFJlYWwgcGFydCAqLwotICBPTVhfUzY0IEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCi0JCi19IE9NWF9TQzY0OyAvKiogU2lnbmVkIDY0LWJpdCBjb21wbGV4IG51bWJlciAqLwotCi0KLS8qIE9NWF9GMzIgKi8KLXR5cGVkZWYgZmxvYXQgT01YX0YzMjsgLyoqIFNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQsSUVFRSA3NTQgKi8KLQotCi0vKiBPTVhfRjY0ICovCi10eXBlZGVmIGRvdWJsZSBPTVhfRjY0OyAvKiogRG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCxJRUVFIDc1NCAqLwotCi0KLS8qIE9NWF9JTlQgKi8KLXR5cGVkZWYgaW50IE9NWF9JTlQ7IC8qKiBzaWduZWQgaW50ZWdlciBjb3JyZXNwb25kaW5nIHRvIG1hY2hpbmUgd29yZCBsZW5ndGgsIGhhcyBtYXhpbXVtIHNpZ25lZCB2YWx1ZSBJTlRfTUFYKi8KLQotCi0jZGVmaW5lIE9NWF9NSU5fUzggIAkgICAJKC0xMjgpCi0jZGVmaW5lIE9NWF9NSU5fVTggIAkJMAotI2RlZmluZSBPTVhfTUlOX1MxNgkJIAkoLTMyNzY4KQotI2RlZmluZSBPTVhfTUlOX1UxNgkJCTAKLSNkZWZpbmUgT01YX01JTl9TMzIJCQkoLTIxNDc0ODM2NDctMSkKLSNkZWZpbmUgT01YX01JTl9VMzIJCQkwCi0KLSNkZWZpbmUgT01YX01BWF9TOAkJCSgxMjcpCi0jZGVmaW5lIE9NWF9NQVhfVTgJCQkoMjU1KQotI2RlZmluZSBPTVhfTUFYX1MxNgkJCSgzMjc2NykKLSNkZWZpbmUgT01YX01BWF9VMTYJCQkoMHhGRkZGKQotI2RlZmluZSBPTVhfTUFYX1MzMgkJCSgyMTQ3NDgzNjQ3KQotI2RlZmluZSBPTVhfTUFYX1UzMgkJCSgweEZGRkZGRkZGKQotCi10eXBlZGVmIHZvaWQgT01YVm9pZDsKLQotI2lmbmRlZiBOVUxMCi0jZGVmaW5lIE5VTEwgKCh2b2lkKikwKQotI2VuZGlmCi0KLS8qKiBEZWZpbmVzIHRoZSBnZW9tZXRyaWMgcG9zaXRpb24gYW5kIHNpemUgb2YgYSByZWN0YW5nbGUsIAotICAqIHdoZXJlIHgseSBkZWZpbmVzIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgdG9wIGxlZnQgY29ybmVyCi0gICogb2YgdGhlIHJlY3RhbmdsZSwgd2l0aCBkaW1lbnNpb25zIHdpZHRoIGluIHRoZSB4LWRpcmVjdGlvbiAKLSAgKiBhbmQgaGVpZ2h0IGluIHRoZSB5LWRpcmVjdGlvbiAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCU9NWF9JTlQgeDsgICAgICAvKiogeC1jb29yZGluYXRlIG9mIHRvcCBsZWZ0IGNvcm5lciBvZiByZWN0YW5nbGUgKi8KLQlPTVhfSU5UIHk7ICAgICAgLyoqIHktY29vcmRpbmF0ZSBvZiB0b3AgbGVmdCBjb3JuZXIgb2YgcmVjdGFuZ2xlICovCi0JT01YX0lOVCB3aWR0aDsgIC8qKiBXaWR0aCBpbiB0aGUgeC1kaXJlY3Rpb24uICovCi0JT01YX0lOVCBoZWlnaHQ7IC8qKiBIZWlnaHQgaW4gdGhlIHktZGlyZWN0aW9uLiAqLwotfU9NWFJlY3Q7Ci0KLQotLyoqIERlZmluZXMgdGhlIGdlb21ldHJpYyBwb3NpdGlvbiBvZiBhIHBvaW50LCAqLwotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gT01YX0lOVCB4OyAvKiogeC1jb29yZGluYXRlICovCi0gT01YX0lOVCB5OwkvKiogeS1jb29yZGluYXRlICovCi0JCi19IE9NWFBvaW50OwotCi0KLS8qKiBEZWZpbmVzIHRoZSBkaW1lbnNpb25zIG9mIGEgcmVjdGFuZ2xlLCBvciByZWdpb24gb2YgaW50ZXJlc3QgaW4gYW4gaW1hZ2UgKi8KLXR5cGVkZWYgc3RydWN0IAotewotIE9NWF9JTlQgd2lkdGg7ICAvKiogV2lkdGggb2YgdGhlIHJlY3RhbmdsZSwgaW4gdGhlIHgtZGlyZWN0aW9uICovCi0gT01YX0lOVCBoZWlnaHQ7IC8qKiBIZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSwgaW4gdGhlIHktZGlyZWN0aW9uICovCi0JCi19IE9NWFNpemU7Ci0KLSNlbmRpZiAvKiBfT01YVFlQRVNfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvb214dHlwZXNfcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9vbXh0eXBlc19zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNzQyYzcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9vbXh0eXBlc19zLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgb214dHlwZXNfcy5oCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi07Ly8gTWFuZGF0b3J5IHJldHVybiBjb2RlcyAtIHVzZSBjYXNlcyBhcmUgZXhwbGljaXRseSBkZXNjcmliZWQgZm9yIGVhY2ggZnVuY3Rpb24gCi1PTVhfU3RzX05vRXJyICAgICAgICAgICAgICAgICAgICBFUVUgIDAgICAgOy8vIE5vIGVycm9yIHRoZSBmdW5jdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IAotT01YX1N0c19FcnIgICAgICAgICAgICAgICAgICAgICAgRVFVIC0yICAgIDsvLyBVbmtub3duL3Vuc3BlY2lmaWVkIGVycm9yICAgICAKLU9NWF9TdHNfSW52YWxpZEJpdHN0cmVhbVZhbEVyciAgIEVRVSAtMTgyICA7Ly8gSW52YWxpZCB2YWx1ZSBkZXRlY3RlZCBkdXJpbmcgYml0c3RyZWFtIHByb2Nlc3NpbmcgICAgIAotT01YX1N0c19NZW1BbGxvY0VyciAgICAgICAgICAgICAgRVFVIC05ICAgIDsvLyBOb3QgZW5vdWdoIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSBvcGVyYXRpb24gCi1PTVhfU3RzQUNBQUNfR2FpbkN0ckVyciAgICAJICAgICBFUVUgLTE1OSAgOy8vIEFBQzogVW5zdXBwb3J0ZWQgZ2FpbiBjb250cm9sIGRhdGEgZGV0ZWN0ZWQgCi1PTVhfU3RzQUNBQUNfUHJnTnVtRXJyICAgICAgICAgICBFUVUgLTE2NyAgOy8vIEFBQzogSW52YWxpZCBudW1iZXIgb2YgZWxlbWVudHMgZm9yIG9uZSBwcm9ncmFtICAgCi1PTVhfU3RzQUNBQUNfQ29lZlZhbEVyciAgICAgICAgICBFUVUgLTE2MyAgOy8vIEFBQzogSW52YWxpZCBxdWFudGl6ZWQgY29lZmZpY2llbnQgdmFsdWUgICAgICAgICAgICAgICAKLU9NWF9TdHNBQ0FBQ19NYXhTZmJFcnIgICAgICAgICAgIEVRVSAtMTYyICA7Ly8gQUFDOiBJbnZhbGlkIG1heFNmYiB2YWx1ZSBpbiByZWxhdGlvbiB0byBudW1Td2IgICAgIAotT01YX1N0c0FDQUFDX1Bsc0RhdGFFcnIJCSAgICAgRVFVIC0xNjAgIDsvLyBBQUM6IHB1bHNlIGVzY2FwZSBzZXF1ZW5jZSBkYXRhIGVycm9yIAotCi07Ly8gT3B0aW9uYWwgcmV0dXJuIGNvZGVzIC0gdXNlIGNhc2VzIGFyZSBleHBsaWNpdGx5IGRlc2NyaWJlZCBmb3IgZWFjaCBmdW5jdGlvbgotT01YX1N0c19CYWRBcmdFcnIgICAgICAgICAgICAgICAgRVFVIC01ICAgIDsvLyBCYWQgQXJndW1lbnRzIAotCi1PTVhfU3RzQUNBQUNfVG5zTnVtRmlsdEVyciAgICAgICBFUVUgLTE1NyAgOy8vIEFBQzogSW52YWxpZCBudW1iZXIgb2YgVE5TIGZpbHRlcnMgIAotT01YX1N0c0FDQUFDX1Ruc0xlbkVyciAgICAgICAgICAgRVFVIC0xNTYgIDsvLyBBQUM6IEludmFsaWQgVE5TIHJlZ2lvbiBsZW5ndGggICAgIAotT01YX1N0c0FDQUFDX1Ruc09yZGVyRXJyICAgICAgICAgRVFVIC0xNTUgIDsvLyBBQUM6IEludmFsaWQgb3JkZXIgb2YgVE5TIGZpbHRlciAgICAgICAgICAgICAgICAgICAgCi1PTVhfU3RzQUNBQUNfVG5zQ29lZlJlc0VyciAgICAgICBFUVUgLTE1NCAgOy8vIEFBQzogSW52YWxpZCBiaXQtcmVzb2x1dGlvbiBmb3IgVE5TIGZpbHRlciBjb2VmZmljaWVudHMgIAotT01YX1N0c0FDQUFDX1Ruc0NvZWZFcnIgICAgICAgICAgRVFVIC0xNTMgIDsvLyBBQUM6IEludmFsaWQgVE5TIGZpbHRlciBjb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgIAotT01YX1N0c0FDQUFDX1Ruc0RpcmVjdEVyciAgICAgICAgRVFVIC0xNTIgIDsvLyBBQUM6IEludmFsaWQgVE5TIGZpbHRlciBkaXJlY3Rpb24gICAgCi0KLU9NWF9TdHNJQ0pQX0pQRUdNYXJrZXJFcnIgICAgICAgIEVRVSAtMTgzICA7Ly8gSlBFRyBtYXJrZXIgZW5jb3VudGVyZWQgd2l0aGluIGFuIGVudHJvcHktY29kZWQgYmxvY2s7IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSHVmZm1hbiBkZWNvZGluZyBvcGVyYXRpb24gdGVybWluYXRlZCBlYXJseS4gICAgICAgICAgIAotT01YX1N0c0lDSlBfSlBFR01hcmtlciAgICAgICAgICAgRVFVIC0xODEgIDsvLyBKUEVHIG1hcmtlciBlbmNvdW50ZXJlZDsgSHVmZm1hbiBkZWNvZGluZyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIG9wZXJhdGlvbiB0ZXJtaW5hdGVkIGVhcmx5LiAgICAgICAgICAgICAgICAgICAgICAgICAKLU9NWF9TdHNJUFBQX0NvbnRleHRNYXRjaEVyciAgICAgIEVRVSAtMTcgICA7Ly8gQ29udGV4dCBwYXJhbWV0ZXIgZG9lc24ndCBtYXRjaCB0byB0aGUgb3BlcmF0aW9uIAotCi1PTVhfU3RzU1BfRXZlbk1lZGlhbk1hc2tTaXplRXJyICBFUVUgLTE4MCAgOy8vIEV2ZW4gc2l6ZSBvZiB0aGUgTWVkaWFuIEZpbHRlciBtYXNrIHdhcyByZXBsYWNlZCBieSB0aGUgb2RkIG9uZSAKLQotT01YX1N0c19NYXhpbXVtRW51bWVyYXRpb24gICAgICAgRVFVIDB4N0ZGRkZGRkYKLQotCi0KLU9NWF9NSU5fUzggICAgICBFUVUgCSAgIAkoLTEyOCkKLU9NWF9NSU5fVTggIAlFUVUgICAgIAkwCi1PTVhfTUlOX1MxNgkJRVFVICAgICAgCSgtMzI3NjgpCi1PTVhfTUlOX1UxNgkJRVFVCSAgICAgICAgMAotCi0KLU9NWF9NSU5fUzMyCQlFUVUJKC0yMTQ3NDgzNjQ3LTEpCi1PTVhfTUlOX1UzMgkJRVFVCTAKLQotT01YX01BWF9TOAkJRVFVCSgxMjcpCi1PTVhfTUFYX1U4CQlFUVUJKDI1NSkKLU9NWF9NQVhfUzE2CQlFUVUJKDMyNzY3KQotT01YX01BWF9VMTYJCUVRVQkoMHhGRkZGKQotT01YX01BWF9TMzIJCUVRVQkoMjE0NzQ4MzY0NykKLU9NWF9NQVhfVTMyCQlFUVUJKDB4RkZGRkZGRkYpCi0KLU9NWF9WQ19VUFBFUiAgICBFUVUgMHgxICAgICAgICAgICAgICAgICA7Ly8gVXNlZCBieSB0aGUgUHJlZGljdEludHJhIGZ1bmN0aW9ucyAgIAotT01YX1ZDX0xFRlQgICAgIEVRVSAweDIgICAgICAgICAgICAgICAgIDsvLyBVc2VkIGJ5IHRoZSBQcmVkaWN0SW50cmEgZnVuY3Rpb25zIAotT01YX1ZDX1VQUEVSX1JJR0hUICAgIEVRVSAweDQwICAgICAgICAgIDsvLyBVc2VkIGJ5IHRoZSBQcmVkaWN0SW50cmEgZnVuY3Rpb25zICAgCi0KLU5VTEwgICAgRVFVIDAKLQotOy8vIFN0cnVjdHVyZXMKLQotICAgIElOQ0xVREUgICAgIGFybUNPTU1fcy5oCi0KLSAgICBNX1NUUlVDVCAgICBPTVhQb2ludAotICAgIE1fRklFTEQgICAgIHgsIDQKLSAgICBNX0ZJRUxEICAgICB5LCA0Ci0gICAgTV9FTkRTVFJVQ1QKLQotICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9idWlsZF92Yy5wbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9idWlsZF92Yy5wbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmEyMDZjMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYnVpbGRfdmMucGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotIyEvdXNyL2Jpbi9wZXJsCi0jCi0jIAotIyBGaWxlIE5hbWU6ICBidWlsZF92Yy5wbAotIyBPcGVuTUFYIERMOiB2MS4wLjIKLSMgUmV2aXNpb246ICAgMTIyOTAKLSMgRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci0jIAotIyAKLSMgCi0jCi0jIFRoaXMgZmlsZSBidWlsZHMgdGhlIE9wZW5NQVggREwgdmMgZG9tYWluIGxpYnJhcnkgb214VkMuby4KLSMKLQotdXNlIEZpbGU6OlNwZWM7Ci11c2Ugc3RyaWN0OwotCi1teSAoJENDLCAkQ0NfT1BUUywgJEFTLCAkQVNfT1BUUywgJExJQiwgJExJQl9PUFRTLCAkTElCX1RZUEUpOwotCi0kQ0MgICAgICAgPSAnYXJtY2MnOwotJENDX09QVFMgID0gJy0tbm9fdW5hbGlnbmVkX2FjY2VzcyAtLWNwdSBDb3J0ZXgtQTggLWMnOwotJEFTICAgICAgID0gJ2FybWFzbSc7Ci0kQVNfT1BUUyAgPSAnLS1ub191bmFsaWduZWRfYWNjZXNzIC0tY3B1IENvcnRleC1BOCc7Ci0jICRMSUIgICAgICA9ICdhcm1saW5rJzsKLSMgJExJQl9PUFRTID0gJy0tcGFydGlhbCAtbyc7Ci0jICRMSUJfVFlQRSA9ICcubyc7Ci0kTElCICAgICAgPSAnYXJtYXInOwotJExJQl9PUFRTID0gJy0tY3JlYXRlIC1yJzsKLSRMSUJfVFlQRSA9ICcuYSc7Ci0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbXkgKEBoZWFkZXJsaXN0LCBAZmlsZWxpc3QsICRoZCwgJGZpbGUsICRvZmlsZSwgJGNvbW1hbmQsICRvYmpsaXN0LCAkbGliZmlsZSwgJGgpOwotCi0jIERlZmluZSB0aGUgbGlzdCBvZiBkaXJlY3RvcmllcyBjb250YWluaW5nIGluY2x1ZGVkIGhlYWRlciBmaWxlcy4KLUBoZWFkZXJsaXN0ID0gcXcoYXBpIHZjL2FwaSB2Yy9tNHAyL2FwaSB2Yy9tNHAxMC9hcGkpOwotCi0jIERlZmluZSB0aGUgbGlzdCBvZiBzb3VyY2UgZmlsZXMgdG8gY29tcGlsZS4KLW9wZW4oRklMRVMsICc8ZmlsZWxpc3RfdmMudHh0Jykgb3IgZGllKCJDYW4ndCBvcGVuIHNvdXJjZSBmaWxlIGxpc3RcbiIpOwotQGZpbGVsaXN0ID0gPEZJTEVTPjsKLWNsb3NlKEZJTEVTKTsKLQotIyBGaXggdGhlIGZpbGUgc2VwYXJhdG9ycyBpbiB0aGUgaGVhZGVyIHBhdGhzCi1mb3JlYWNoICRoIChAaGVhZGVybGlzdCkKLXsKLSAgICAgICAgJGggPSBGaWxlOjpTcGVjLT5jYW5vbnBhdGgoJGgpOwotfQotCi0jIENyZWF0ZSB0aGUgaW5jbHVkZSBwYXRoIHRvIGJlIHBhc3NlZCB0byB0aGUgY29tcGlsZXIKLSRoZCA9ICctSScgLiBqb2luKCcgLUknLCBAaGVhZGVybGlzdCk7Ci0KLSMgQ3JlYXRlIHRoZSBidWlsZCBkaXJlY3RvcmllcyAiL2xpYi8iIGFuZCAiL29iai8iIChpZiB0aGV5IGFyZSBub3QgdGhlcmUgYWxyZWFkeSkKLW1rZGlyICJvYmoiLCAwNzc3IGlmICghIC1kICJvYmoiKTsKLW1rZGlyICJsaWIiLCAwNzc3IGlmICghIC1kICJsaWIiKTsKLQotJG9iamxpc3QgPSAnJzsKLQotIyBDb21waWxlIGVhY2ggZmlsZQotZm9yZWFjaCAkZmlsZSAoQGZpbGVsaXN0KQotewotCW15ICRmOwotCW15ICRiYXNlOwotCW15ICRleHQ7Ci0JbXkgJG9iamZpbGU7Ci0KLQljaG9tcCgkZmlsZSk7Ci0JJGZpbGUgPSBGaWxlOjpTcGVjLT5jYW5vbnBhdGgoJGZpbGUpOwotCi0JKHVuZGVmLCB1bmRlZiwgJGYpID0gRmlsZTo6U3BlYy0+c3BsaXRwYXRoKCRmaWxlKTsKLSAgICAkZj1+cy9bXG5cZlxyXS8vZzsgIyBSZW1vdmUgYW55IGVuZC1vZi1saW5lIGNoYXJhY3RlcnMKLQotCWlmKCgkYmFzZSwgJGV4dCkgPSAkZiA9fiAvKC4rKVwuKFx3KSQvKQotCXsKLQkJJG9iamZpbGUgPSBGaWxlOjpTcGVjLT5jYXRmaWxlKCdvYmonLCAkYmFzZS4nLm8nKTsKLQotCQlpZigkZXh0IGVxICdjJykKLQkJewotCQkJJG9iamxpc3QgLj0gIiRvYmpmaWxlICI7Ci0JCQkkY29tbWFuZCA9ICRDQy4nICcuJENDX09QVFMuJyAnLiRoZC4nIC1vICcuJG9iamZpbGUuJyAnLiRmaWxlOwotCQkJcHJpbnQgIiRjb21tYW5kXG4iOwotCQkJc3lzdGVtKCRjb21tYW5kKTsKLQkJfQotCQllbHNpZigkZXh0IGVxICdzJykKLQkJewotCQkJJG9iamxpc3QgLj0gIiRvYmpmaWxlICI7Ci0JCQkkY29tbWFuZCA9ICRBUy4nICcuJEFTX09QVFMuJyAnLiRoZC4nIC1vICcuJG9iamZpbGUuJyAnLiRmaWxlOwotCQkJcHJpbnQgIiRjb21tYW5kXG4iOwotCQkJc3lzdGVtKCRjb21tYW5kKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXByaW50ICJJZ25vcmluZyBmaWxlOiAkZlxuIjsKLQkJfQotCX0KLQllbHNlCi0JewotCQlkaWUgIk5vIGZpbGUgZXh0ZW5zaW9uIGZvdW5kOiAkZlxuIjsKLQl9Ci19Ci0KLSMgRG8gdGhlIGZpbmFsIGxpbmsgc3RhZ2UgdG8gY3JlYXRlIHRoZSBsaWJyYXJpZXMuCi0kbGliZmlsZSA9IEZpbGU6OlNwZWMtPmNhdGZpbGUoJ2xpYicsICdvbXhWQycuJExJQl9UWVBFKTsKLSRjb21tYW5kID0gJExJQi4nICcuJExJQl9PUFRTLicgJy4kbGliZmlsZS4nICcuJG9iamxpc3Q7Ci1wcmludCAiJGNvbW1hbmRcbiI7Ci0oc3lzdGVtKCRjb21tYW5kKSA9PSAwKSBhbmQgcHJpbnQgIkJ1aWxkIHN1Y2Nlc3NmdWxcbiI7Ci0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9maWxlbGlzdF92Yy50eHQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vZmlsZWxpc3RfdmMudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGI4ZWViLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9maWxlbGlzdF92Yy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0uL2FwaS9hcm1DT01NLmgKLS4vYXBpL2FybUNPTU1fQml0RGVjX3MuaAotLi9hcGkvYXJtQ09NTV9CaXRzdHJlYW0uaAotLi9hcGkvYXJtQ09NTV9JRENUX3MuaAotLi9hcGkvYXJtQ09NTV9JRENUVGFibGUuaAotLi9hcGkvYXJtQ09NTV9NYXNrVGFibGUuaAotLi9hcGkvYXJtQ09NTV9zLmgKLS4vYXBpL2FybUNPTU1fVmVyc2lvbi5oCi0uL2FwaS9hcm1PTVhfUmVsZWFzZVZlcnNpb24uaAotLi9hcGkvb214dHlwZXMuaAotLi9hcGkvb214dHlwZXNfcy5oCi0uL3NyYy9hcm1DT01NX0lEQ1RUYWJsZS5jCi0uL3NyYy9hcm1DT01NX01hc2tUYWJsZS5jCi0uL3ZjL2FwaS9hcm1WQy5oCi0uL3ZjL2FwaS9hcm1WQ0NPTU1fcy5oCi0uL3ZjL2FwaS9vbXhWQy5oCi0uL3ZjL2FwaS9vbXhWQ19zLmgKLS4vdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHkxNngxNl9zLnMKLS4vdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHk4eDhfcy5zCi0uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9FeHBhbmRGcmFtZV9JX3MucwotLi92Yy9tNHAxMC9hcGkvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0F2ZXJhZ2VfNHhfQWxpZ25fdW5zYWZlX3MucwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5jCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MucwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYV91bnNhZmVfcy5zCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLnMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlc19zLnMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MucwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MucwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weV91bnNhZmVfcy5zCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9EaWFnQ29weV91bnNhZmVfcy5zCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmVfcy5zCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmVfcy5zCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZV9zLnMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlX3MucwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9RdWFudFRhYmxlc19zLnMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDRfcy5zCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0X3MucwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGRfcy5zCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MucwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSV9zLnMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MucwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5zCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MucwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTZfcy5zCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5zCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDhfcy5zCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MucwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXJfcy5zCi0uL3ZjL200cDIvYXBpL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaAotLi92Yy9tNHAyL2FwaS9hcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oCi0uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DbGlwOF9zLnMKLS4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmVfcy5zCi0uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYwotLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfTG9va3VwX1RhYmxlcy5jCi0uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9TZXRQcmVkRGlyX3MucwotLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfWmlnemFnX1RhYmxlcy5jCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIuYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1Bfcy5zCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXJfcy5zCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQ19zLnMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDX3MucwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRmluZE1WcHJlZF9zLnMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0lEQ1Q4eDhibGtfcy5zCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2tfcy5zCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmFfcy5zCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludGVyX0lfcy5zCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludHJhX0lfcy5zCi0uL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vc3JjL2FybUNPTU0uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGRiZjQxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTUxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1DT01NLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZWZpbmVzIENvbW1vbiBBUElzIHVzZWQgYWNyb3NzIE9wZW5NQVggQVBJJ3MKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICAgICAvKiBNaXNjZWxsYW5lb3VzIEFyaXRobWV0aWMgb3BlcmF0aW9ucyAqLwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1Sb3VuZEZsb2F0VG9TMTYKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgc2hvcnQgaW50IGFmdGVyIHJvdW5kaW5nCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MxNiBmb3JtYXQKLSAqCi0gKi8KLQotT01YX1MxNiBhcm1Sb3VuZEZsb2F0VG9TMTYgKE9NWF9GNjQgVmFsdWUpCi17Ci0gICAgaWYgKFZhbHVlID4gMCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1MxNikoVmFsdWUgKyAuNSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1MxNikoVmFsdWUgLSAuNSk7Ci0gICAgfQotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1Sb3VuZEZsb2F0VG9TMzIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgaW50IGFmdGVyIHJvdW5kaW5nCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MzMiBmb3JtYXQKLSAqCi0gKi8KLQotT01YX1MzMiBhcm1Sb3VuZEZsb2F0VG9TMzIgKE9NWF9GNjQgVmFsdWUpCi17Ci0gICAgaWYgKFZhbHVlID4gMCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1MzMikoVmFsdWUgKyAuNSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1MzMikoVmFsdWUgLSAuNSk7Ci0gICAgfQotfQotLyoqCi0gKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvUzE2Ci0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHNob3J0IGludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMTYgZm9ybWF0Ci0gKgotICovCi0KLU9NWF9TMTYgYXJtU2F0Um91bmRGbG9hdFRvUzE2IChPTVhfRjY0IFZhbHVlKQotewotICAgIGlmIChWYWx1ZSA+IDApCi0gICAgewotICAgICAgICBWYWx1ZSArPSAwLjU7Ci0gICAgICAgIAotICAgICAgICBpZihWYWx1ZSA+IChPTVhfUzE2KU9NWF9NQVhfUzE2ICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChPTVhfUzE2KU9NWF9NQVhfUzE2OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChPTVhfUzE2KVZhbHVlOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIFZhbHVlIC09IDAuNTsKLQotICAgICAgICBpZihWYWx1ZSA8IChPTVhfUzE2KU9NWF9NSU5fUzE2ICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChPTVhfUzE2KU9NWF9NSU5fUzE2OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChPTVhfUzE2KVZhbHVlOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9TMzIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MzMiBmb3JtYXQKLSAqCi0gKi8KLQotT01YX1MzMiBhcm1TYXRSb3VuZEZsb2F0VG9TMzIgKE9NWF9GNjQgVmFsdWUpCi17Ci0gICAgaWYgKFZhbHVlID4gMCkKLSAgICB7Ci0gICAgICAgIFZhbHVlICs9IDAuNTsKLSAgICAgICAgCi0gICAgICAgIGlmKFZhbHVlID4gKE9NWF9TMzIpT01YX01BWF9TMzIgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKE9NWF9TMzIpT01YX01BWF9TMzI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKE9NWF9TMzIpVmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgVmFsdWUgLT0gMC41OwotCi0gICAgICAgIGlmKFZhbHVlIDwgKE9NWF9TMzIpT01YX01JTl9TMzIgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKE9NWF9TMzIpT01YX01JTl9TMzI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKE9NWF9TMzIpVmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1UxNgotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSB1bnNpZ25lZCBzaG9ydCBpbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfVTE2IGZvcm1hdAotICoKLSAqLwotCi1PTVhfVTE2IGFybVNhdFJvdW5kRmxvYXRUb1UxNiAoT01YX0Y2NCBWYWx1ZSkKLXsKLSAgICBWYWx1ZSArPSAwLjU7Ci0gICAgCi0gICAgaWYoVmFsdWUgPiAoT01YX1UxNilPTVhfTUFYX1UxNiApCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9VMTYpT01YX01BWF9VMTY7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1UxNilWYWx1ZTsKLSAgICB9Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1UzMgotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSB1bnNpZ25lZCBpbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfVTMyIGZvcm1hdAotICoKLSAqLwotCi1PTVhfVTMyIGFybVNhdFJvdW5kRmxvYXRUb1UzMiAoT01YX0Y2NCBWYWx1ZSkKLXsKLSAgICBWYWx1ZSArPSAwLjU7Ci0gICAgCi0gICAgaWYoVmFsdWUgPiAoT01YX1UzMilPTVhfTUFYX1UzMiApCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9VMzIpT01YX01BWF9VMzI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1UzMilWYWx1ZTsKLSAgICB9Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVJvdW5kRmxvYXRUb1M2NAotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSA2NCBiaXQgaW50IGFmdGVyIHJvdW5kaW5nCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1M2NCBmb3JtYXQKLSAqCi0gKi8KLQotT01YX1M2NCBhcm1Sb3VuZEZsb2F0VG9TNjQgKE9NWF9GNjQgVmFsdWUpCi17Ci0gICAgaWYgKFZhbHVlID4gMCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1M2NCkoVmFsdWUgKyAuNSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1M2NCkoVmFsdWUgLSAuNSk7Ci0gICAgfQotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1TaWduQ2hlY2sKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENoZWNrcyB0aGUgc2lnbiBvZiBhIHZhcmlhYmxlOgotICogcmV0dXJucyAxIGlmIGl0IGlzIFBvc2l0aXZlCi0gKiByZXR1cm5zIDAgaWYgaXQgaXMgMAotICogcmV0dXJucyAtMSBpZiBpdCBpcyBOZWdhdGl2ZSAKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCSAgICB2YXIgICAgIFZhcmlhYmxlIHRvIGJlIGNoZWNrZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfSU5UIC0tICAgcmV0dXJucyAxIGlmIGl0IGlzIFBvc2l0aXZlCi0gKiAgICAgICAgICAgICAgcmV0dXJucyAwIGlmIGl0IGlzIDAKLSAqICAgICAgICAgICAgICByZXR1cm5zIC0xIGlmIGl0IGlzIE5lZ2F0aXZlIAotICovIAotCi1PTVhfSU5UIGFybVNpZ25DaGVjayAoCi0gICAgT01YX1MxNiB2YXIKLSkKLQotewotICAgIE9NWF9JTlQgU2lnbjsKLSAgICAKLSAgICBpZiAodmFyIDwgMCkKLSAgICB7Ci0gICAgICAgIFNpZ24gPSAtMTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIHZhciA+IDApCi0gICAgewotICAgICAgICBTaWduID0gMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgU2lnbiA9IDA7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBTaWduOwotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1DbGlwCi0gKgotICogRGVzY3JpcHRpb246IENsaXBzIHRoZSBpbnB1dCBiZXR3ZWVuIE1BWCBhbmQgTUlOIHZhbHVlCi0gKiAKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIE1pbiAgICAgbG93ZXIgYm91bmQKLSAqIFtpbl0gTWF4ICAgICB1cHBlciBib3VuZAotICogW2luXSBzcmMgICAgIHZhcmlhYmxlIHRvIHRoZSBjbGlwcGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1MzMiAtLSAgIHJldHVybnMgY2xpcHBlZCB2YWx1ZQotICovIAotIAotT01YX1MzMiBhcm1DbGlwICgKLSAgICBPTVhfSU5UIG1pbiwKLSAgICBPTVhfSU5UIG1heCwgCi0gICAgT01YX1MzMiBzcmMgCi0pCi0gCi17Ci0gICAgaWYgKHNyYyA+IG1heCkKLSAgICB7Ci0gICAgICAgIHNyYyA9IG1heDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3JjIDwgbWluKQotICAgIHsKLSAgICAgICAgc3JjID0gbWluOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gc3JjOwotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1DbGlwX0YzMgotICoKLSAqIERlc2NyaXB0aW9uOiBDbGlwcyB0aGUgaW5wdXQgYmV0d2VlbiBNQVggYW5kIE1JTiB2YWx1ZQotICogCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBNaW4gICAgIGxvd2VyIGJvdW5kCi0gKiBbaW5dIE1heCAgICAgdXBwZXIgYm91bmQKLSAqIFtpbl0gc3JjICAgICB2YXJpYWJsZSB0byB0aGUgY2xpcHBlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9GMzIgLS0gICByZXR1cm5zIGNsaXBwZWQgdmFsdWUKLSAqLyAKLSAKLU9NWF9GMzIgYXJtQ2xpcF9GMzIgKAotICAgIE9NWF9GMzIgbWluLAotICAgIE9NWF9GMzIgbWF4LCAKLSAgICBPTVhfRjMyIHNyYyAKLSkKLSAKLXsKLSAgICBpZiAoc3JjID4gbWF4KQotICAgIHsKLSAgICAgICAgc3JjID0gbWF4OwotICAgIH0KLSAgICBlbHNlIGlmIChzcmMgPCBtaW4pCi0gICAgewotICAgICAgICBzcmMgPSBtaW47Ci0gICAgfQotICAgIAotICAgIHJldHVybiBzcmM7Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVNoaWZ0U2F0X0YzMgotICoKLSAqIERlc2NyaXB0aW9uOiBEaXZpZGVzIGEgZmxvYXQgdmFsdWUgYnkgMl5zaGlmdCBhbmQgCi0gKiBzYXR1cmF0ZXMgaXQgZm9yIHVuc2lnbmVkIHZhbHVlIHJhbmdlIGZvciBzYXRCaXRzLgotICogU2Vjb25kIHBhcmFtZXRlciBpcyBsaWtlICJzaGlmdGluZyIgdGhlIGNvcnJlc3BvbmRpbmcgCi0gKiBpbnRlZ2VyIHZhbHVlLiBUYWtlcyBjYXJlIG9mIHJvdW5kaW5nIHdoaWxlIGNsaXBwaW5nIHRoZSBmaW5hbCAKLSAqIHZhbHVlLgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHYgICAgICAgICAgTnVtYmVyIHRvIGJlIG9wZXJhdGVkIHVwb24KLSAqIFtpbl0gc2hpZnQgICAgICBEaXZpZGVzIHRoZSBpbnB1dCAidiIgYnkgIjJec2hpZnQiCi0gKiBbaW5dIHNhdEJpdHMgICAgRmluYWwgcmFuZ2UgaXMgWzAsIDJec2F0Qml0cykKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfUzMyIC0tICAgcmV0dXJucyAic2hpZnRlZCIgc2F0dXJhdGVkIHZhbHVlCi0gKi8gCi0gCi1PTVhfVTMyIGFybVNoaWZ0U2F0X0YzMihPTVhfRjMyIHYsIE9NWF9JTlQgc2hpZnQsIE9NWF9JTlQgc2F0Qml0cykgCi17Ci0gICAgT01YX1UzMiBhbGxPbmVzID0gKE9NWF9VMzIpKC0xKTsKLSAgICBPTVhfVTMyIG1heFYgPSBhbGxPbmVzID4+ICgzMi1zYXRCaXRzKTsKLSAgICBPTVhfRjMyIHZTaGlmdGVkLCB2Um91bmRlZCwgc2hpZnREaXYgPSAoT01YX0YzMikoMSA8PCBzaGlmdCk7Ci0gICAgT01YX1UzMiB2SW50OwotICAgIE9NWF9VMzIgdkludFNhdDsKLSAgICAKLSAgICBpZih2IDw9IDApCi0gICAgICAgIHJldHVybiAwOwotICAgIAotICAgIHZTaGlmdGVkID0gdiAvIHNoaWZ0RGl2OwotICAgIHZSb3VuZGVkID0gKE9NWF9GMzIpKHZTaGlmdGVkICsgMC41KTsKLSAgICB2SW50ID0gKE9NWF9VMzIpdlJvdW5kZWQ7Ci0gICAgdkludFNhdCA9IHZJbnQ7Ci0gICAgaWYodkludFNhdCA+IG1heFYpIAotICAgICAgICB2SW50U2F0ID0gbWF4VjsKLSAgICByZXR1cm4gdkludFNhdDsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbnM6IGFybVN3YXBFbGVtCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGVzZSBmdW5jdGlvbiBzd2FwcyB0d28gZWxlbWVudHMgYXQgdGhlIHNwZWNpZmllZCBwb2ludGVyIGxvY2F0aW9ucy4KLSAqIFRoZSBzaXplIG9mIGVhY2ggZWxlbWVudCBjb3VsZCBiZSBhbnl0aGluZyBhcyBzcGVjaWZpZWQgYnkgPGVsZW1TaXplPgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWFJlc3VsdCAtLSBFcnJvciBzdGF0dXMgZnJvbSB0aGUgZnVuY3Rpb24KLSAqLwotT01YUmVzdWx0IGFybVN3YXBFbGVtKAotICAgICAgICBPTVhfVTggKnBCdWYxLAotICAgICAgICBPTVhfVTggKnBCdWYyLAotICAgICAgICBPTVhfSU5UIGVsZW1TaXplCi0gICAgICAgKQotewotICAgIE9NWF9JTlQgaTsKLSAgICBPTVhfVTggdGVtcDsKLSAgICBhcm1SZXRBcmdFcnJJZighcEJ1ZjEgfHwgIXBCdWYyLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgCi0gICAgZm9yKGkgPSAwOyBpIDwgZWxlbVNpemU7IGkrKykKLSAgICB7Ci0gICAgICAgIHRlbXAgPSAqKHBCdWYxICsgaSk7Ci0gICAgICAgICoocEJ1ZjEgKyBpKSA9ICoocEJ1ZjIgKyBpKTsKLSAgICAgICAgKihwQnVmMiArIGkpID0gdGVtcDsKLSAgICB9Ci0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybU1lZGlhbk9mMwotICoKLSAqIERlc2NyaXB0aW9uOiBGaW5kcyB0aGUgbWVkaWFuIG9mIHRocmVlIG51bWJlcnMKLSAqIAotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBmRW50cnkgICAgIEZpcnN0IGVudHJ5Ci0gKiBbaW5dIHNFbnRyeSAgICAgc2Vjb25kIGVudHJ5Ci0gKiBbaW5dIHRFbnRyeSAgICAgVGhpcmQgZW50cnkKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfUzMyIC0tICAgcmV0dXJucyB0aGUgbWVkaWFuIHZhbHVlCi0gKi8gCi0gCi1PTVhfUzMyIGFybU1lZGlhbk9mMyAoCi0gICAgT01YX1MzMiBmRW50cnksCi0gICAgT01YX1MzMiBzRW50cnksIAotICAgIE9NWF9TMzIgdEVudHJ5IAotKQotewotICAgIE9NWF9TMzIgYSwgYiwgYzsKLSAgICAKLSAgICBhID0gYXJtTWluIChmRW50cnksIHNFbnRyeSk7Ci0gICAgYiA9IGFybU1heCAoZkVudHJ5LCBzRW50cnkpOwotICAgIGMgPSBhcm1NaW4gKGIsIHRFbnRyeSk7Ci0gICAgcmV0dXJuIChhcm1NYXggKGEsIGMpKTsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtTG9nU2l6ZQotICoKLSAqIERlc2NyaXB0aW9uOiBGaW5kcyB0aGUgc2l6ZSBvZiBhIHBvc2l0aXZlIHZhbHVlIGFuZCByZXR1cm5zIHRoZSBzYW1lCi0gKiAKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gdmFsdWUgICAgUG9zaXRpdmUgdmFsdWUKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfVTggLS0gICAgIFJldHVybnMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGJpdHMgcmVxdWlyZWQgdG8gcmVwcmVzZW50IHRoZSBwb3NpdGl2ZSB2YWx1ZS4gCi0gICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIHNtYWxsZXN0IGs+PTAgc3VjaCB0aGF0IHRoYXQgdmFsdWUgaXMgbGVzcyB0aGFuICgxPDxrKS4KLSAqLyAKLSAKLU9NWF9VOCBhcm1Mb2dTaXplICgKLSAgICBPTVhfVTE2IHZhbHVlIAotKQotewotICAgIE9NWF9VOCBpOyAgICAKLSAgICBmb3IgKCBpID0gMDsgdmFsdWUgPiAwOyB2YWx1ZSA9IHZhbHVlID4+IDEpIAotICAgIHsKLSAgICAgICAgaSsrOwotICAgIH0KLSAgICByZXR1cm4gaTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgICAgIC8qIFNhdHVyYXRpbmcgQXJpdGhtZXRpYyBvcGVyYXRpb25zICovCi0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdEFkZF9TMzIoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBhZGRpdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKLSAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogCi0gKiAgICAKLSAqKi8KLSAKLU9NWF9TMzIgYXJtU2F0QWRkX1MzMihPTVhfUzMyIFZhbHVlMSxPTVhfUzMyIFZhbHVlMikKLXsKLSAgICBPTVhfUzMyIFJlc3VsdDsKLSAgICAKLSAgICBSZXN1bHQgPSBWYWx1ZTEgKyBWYWx1ZTI7Ci0KLSAgICBpZiggKFZhbHVlMV5WYWx1ZTIpID49IDApCi0gICAgewotICAgICAgICAvKlNhbWUgc2lnbiovCi0gICAgICAgIGlmKCAoUmVzdWx0XlZhbHVlMSkgPj0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgLypSZXN1bHQgaGFzIG5vdCBzYXR1cmF0ZWQqLwotICAgICAgICAgICAgcmV0dXJuIFJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKFZhbHVlMSA+PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gcG9zaXRpdmUgc2lkZSovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9NQVhfUzMyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gbmVnYXRpdmUgc2lkZSovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9NSU5fUzMyOwotICAgICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgfQotICAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiBSZXN1bHQ7Ci0gICAgfQotICAgIAotfQotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRBZGRfUzY0KCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgYWRkaXRpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCi0gKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqIAotICogICAgCi0gKiovCi0gCi1PTVhfUzY0IGFybVNhdEFkZF9TNjQoT01YX1M2NCBWYWx1ZTEsT01YX1M2NCBWYWx1ZTIpCi17Ci0gICAgT01YX1M2NCBSZXN1bHQ7Ci0gICAgCi0gICAgUmVzdWx0ID0gVmFsdWUxICsgVmFsdWUyOwotCi0gICAgaWYoIChWYWx1ZTFeVmFsdWUyKSA+PSAwKQotICAgIHsKLSAgICAgICAgLypTYW1lIHNpZ24qLwotICAgICAgICBpZiggKFJlc3VsdF5WYWx1ZTEpID49IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBub3Qgc2F0dXJhdGVkKi8KLSAgICAgICAgICAgIHJldHVybiBSZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihWYWx1ZTEgPj0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIHBvc2l0aXZlIHNpZGUqLwotICAgICAgICAgICAgICAgIFJlc3VsdCA9IE9NWF9NQVhfUzY0OwotICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBuZWdhdGl2ZSBzaWRlKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX01JTl9TNjQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB9Ci0gICAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuIFJlc3VsdDsKLSAgICB9Ci0gICAgCi19Ci0KLS8qKiBGdW5jdGlvbiA6YXJtU2F0U3ViX1MzMigpCi0gKiAKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIHN1YnN0cmFjdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKLSAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogCi0gKiovCi0KLU9NWF9TMzIgYXJtU2F0U3ViX1MzMihPTVhfUzMyIFZhbHVlMSxPTVhfUzMyIFZhbHVlMikKLXsKLSAgICBPTVhfUzMyIFJlc3VsdDsKLSAgICAKLSAgICBSZXN1bHQgPSBWYWx1ZTEgLSBWYWx1ZTI7Ci0KLSAgICBpZiggKFZhbHVlMV5WYWx1ZTIpIDwgMCkKLSAgICB7Ci0gICAgICAgIC8qT3Bwb3NpdGUgc2lnbiovCi0gICAgICAgIGlmKCAoUmVzdWx0XlZhbHVlMSkgPj0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgLypSZXN1bHQgaGFzIG5vdCBzYXR1cmF0ZWQqLwotICAgICAgICAgICAgcmV0dXJuIFJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKFZhbHVlMSA+PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gcG9zaXRpdmUgc2lkZSovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9NQVhfUzMyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gbmVnYXRpdmUgc2lkZSovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9NSU5fUzMyOwotICAgICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgfQotICAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiBSZXN1bHQ7Ci0gICAgfQotICAgIAotfQotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRNYWNfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIE11bHRpcGxpY2F0aW9uIG9mIFZhbHVlMSBhbmQgVmFsdWUyIGFuZCBzdWJlc3F1ZW50IHNhdHVyYXRlZAotICogICAgIGFjY3VtdWxhdGlvbiB3aXRoIE1hYwotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKLSAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCi0gKiBbaW5dIE1hYyAgICAgICAgICBBY2N1bXVsYXRvcgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqKi8KLQotT01YX1MzMiBhcm1TYXRNYWNfUzMyKE9NWF9TMzIgTWFjLE9NWF9TMTYgVmFsdWUxLE9NWF9TMTYgVmFsdWUyKQotewotICAgIE9NWF9TMzIgUmVzdWx0OwotICAgIAotICAgIFJlc3VsdCA9IChPTVhfUzMyKShWYWx1ZTEqVmFsdWUyKTsKLSAgICBSZXN1bHQgPSBhcm1TYXRBZGRfUzMyKCBNYWMgLCBSZXN1bHQgKTsKLQotICAgIHJldHVybiBSZXN1bHQ7ICAgIAotfQotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRNYWNfUzE2UzMyX1MzMgotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBNQUMgb3BlcmF0aW9uIG9mIHRoZSB0aHJlZSBpbnB1dHMgZGVsYXlFbGVtLCBmaWxUYXAgLCBtYWMKLSAqCi0gKiAgIG1hYyA9IG1hYyArIFNhdHVyYXRlX2luXzMyQml0cyhkZWxheUVsZW0gKiBmaWxUYXApCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBkZWxheUVsZW0gICAgRmlyc3QgMzIgYml0IE9wZXJhbmQKLSAqIFtpbl0gZmlsVGFwICAgICAgIFNlY29uZCAxNiBiaXQgT3BlcmFuZAotICogW2luXSBtYWMgICAgICAgICAgUmVzdWx0IG9mIE1BQyBvcGVyYXRpb24KLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgbWFjICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLSAKLU9NWF9TMzIgYXJtU2F0TWFjX1MxNlMzMl9TMzIoT01YX1MzMiBtYWMsIE9NWF9TMzIgZGVsYXlFbGVtLCBPTVhfUzE2IGZpbFRhcCApCi17Ci0gICAgCi0gICAgT01YX1MzMiByZXN1bHQ7Ci0KLSAgICByZXN1bHQgPSBhcm1TYXRNdWxTMTZTMzJfUzMyKGZpbFRhcCxkZWxheUVsZW0pOyAKLQotICAgIGlmICggcmVzdWx0ID4gT01YX01BWF9TMTYgKQotICAgIHsKLSAgICAgICAgcmVzdWx0ID0gT01YX01BWF9TMzI7Ci0gICAgfQotICAgIGVsc2UgaWYoIHJlc3VsdCA8IE9NWF9NSU5fUzE2ICkKLSAgICB7Ci0gICAgICAgIHJlc3VsdCA9IE9NWF9NSU5fUzMyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXN1bHQgPSBkZWxheUVsZW0gKiBmaWxUYXA7Ci0gICAgfQotCi0gICAgbWFjID0gYXJtU2F0QWRkX1MzMihtYWMscmVzdWx0KTsKLSAgICAKLSAgICByZXR1cm4gbWFjOwotfQotCi0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdFJvdW5kUmlnaHRTaGlmdF9TMzJfUzE2Ci0gKgotICogRGVzY3JpcHRpb24gOgotICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygcm91bmRlZCByaWdodCBzaGlmdCBvcGVyYXRpb24gb2YgaW5wdXQgYnkgdGhlIHNjYWxlZmFjdG9yCi0gKgotICogICBvdXRwdXQgPSBTYXR1cmF0ZV9pbl8xNkJpdHMoICggUmlnaHQvTGVmdFNoaWZ0KCAoUm91bmQoaW5wdXQpICwgc2hpZnQgKSApCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBpbnB1dCAgICAgICBUaGUgaW5wdXQgdG8gYmUgb3BlcmF0ZWQgb24KLSAqIFtpbl0gc2hpZnQgVGhlIHNoaWZ0IG51bWJlcgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0KLQotT01YX1MxNiBhcm1TYXRSb3VuZFJpZ2h0U2hpZnRfUzMyX1MxNihPTVhfUzMyIGlucHV0LCBPTVhfSU5UIHNoaWZ0KQotewotICAgIGlucHV0ID0gYXJtU2F0Um91bmRMZWZ0U2hpZnRfUzMyKGlucHV0LC1zaGlmdCk7Ci0KLSAgICBpZiAoIGlucHV0ID4gT01YX01BWF9TMTYgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChPTVhfUzE2KU9NWF9NQVhfUzE2OwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCA8IE9NWF9NSU5fUzE2KQotICAgIHsKLSAgICAgICAgcmV0dXJuIChPTVhfUzE2KU9NWF9NSU5fUzE2OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgIHJldHVybiAoT01YX1MxNilpbnB1dDsKLSAgICB9Ci0KLX0KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRMZWZ0U2hpZnRfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRpbmcgbGVmdC1zaGlmdCBvcGVyYXRpb24gb24gaW5wdXQKLSAqICAgICBPciByb3VuZGVkIFJpZ2h0IHNoaWZ0IGlmIHRoZSBpbnB1dCBTaGlmdCBpcyBuZWdhdGl2ZS4KLSAqICAgICAKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUgICAgICAgIE9wZXJhbmQKLSAqIFtpbl0gU2hpZnQgICAgICAgIE9wZXJhbmQgZm9yIHNoaWZ0IG9wZXJhdGlvbgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqICAgIAotICoqLwotCi1PTVhfUzMyIGFybVNhdFJvdW5kTGVmdFNoaWZ0X1MzMihPTVhfUzMyIFZhbHVlLCBPTVhfSU5UIFNoaWZ0KQotewotICAgIE9NWF9JTlQgaTsKLSAgICAKLSAgICBpZiAoU2hpZnQgPCAwKQotICAgIHsKLSAgICAgICAgU2hpZnQgPSAtU2hpZnQ7Ci0gICAgICAgIFZhbHVlID0gYXJtU2F0QWRkX1MzMihWYWx1ZSwgKDEgPDwgKFNoaWZ0IC0gMSkpKTsKLSAgICAgICAgVmFsdWUgPSBWYWx1ZSA+PiBTaGlmdDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IFNoaWZ0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbHVlID0gYXJtU2F0QWRkX1MzMihWYWx1ZSwgVmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBWYWx1ZTsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRMZWZ0U2hpZnRfUzY0KCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRpbmcgbGVmdC1zaGlmdCBvcGVyYXRpb24gb24gaW5wdXQKLSAqICAgICBPciByb3VuZGVkIFJpZ2h0IHNoaWZ0IGlmIHRoZSBpbnB1dCBTaGlmdCBpcyBuZWdhdGl2ZS4KLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlICAgICAgICBPcGVyYW5kCi0gKiBbaW5dIHNoaWZ0ICAgICAgICBPcGVyYW5kIGZvciBzaGlmdCBvcGVyYXRpb24KLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLSAKLU9NWF9TNjQgYXJtU2F0Um91bmRMZWZ0U2hpZnRfUzY0KE9NWF9TNjQgVmFsdWUsIE9NWF9JTlQgU2hpZnQpCi17Ci0gICAgT01YX0lOVCBpOwotICAgIAotICAgIGlmIChTaGlmdCA8IDApCi0gICAgewotICAgICAgICBTaGlmdCA9IC1TaGlmdDsKLSAgICAgICAgVmFsdWUgPSBhcm1TYXRBZGRfUzY0KFZhbHVlLCAoKE9NWF9TNjQpMSA8PCAoU2hpZnQgLSAxKSkpOwotICAgICAgICBWYWx1ZSA9IFZhbHVlID4+IFNoaWZ0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgU2hpZnQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgVmFsdWUgPSBhcm1TYXRBZGRfUzY0KFZhbHVlLCBWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFZhbHVlOwotfQotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRNdWxTMTZTMzJfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGEgUzE2IGRhdGEgdHlwZSBtdWx0aXBsaWVkIHdpdGggYW4gUzMyIGRhdGEgdHlwZQotICogICAgIGluIGEgUzMyIGNvbnRhaW5lcgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gaW5wdXQxICAgICAgIE9wZXJhbmQgMQotICogW2luXSBpbnB1dDIgICAgICAgT3BlcmFuZCAyCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0KLQotT01YX1MzMiBhcm1TYXRNdWxTMTZTMzJfUzMyKE9NWF9TMTYgaW5wdXQxLE9NWF9TMzIgaW5wdXQyKQotewotICAgIE9NWF9TMTYgaGkyLGxvMTsKLSAgICBPTVhfVTE2IGxvMjsKLSAgICAKLSAgICBPTVhfUzMyIHRlbXAxLHRlbXAyOwotICAgIE9NWF9TMzIgcmVzdWx0OwotICAgIAotICAgIGxvMSAgPSBpbnB1dDE7Ci0KLSAgICBoaTIgID0gKCBpbnB1dDIgPj4gIDE2ICk7Ci0gICAgbG8yICA9ICggKE9NWF9VMzIpKCBpbnB1dDIgPDwgMTYgKSA+PiAxNiApOwotICAgIAotICAgIHRlbXAxID0gaGkyICogbG8xOwotICAgIHRlbXAyID0gKCBsbzIqIGxvMSApID4+IDE2OwotCi0gICAgcmVzdWx0ID0gIGFybVNhdEFkZF9TMzIodGVtcDEsdGVtcDIpOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0TXVsUzMyUzMyX1MzMigpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhIFMzMiBkYXRhIHR5cGUgbXVsdGlwbGllZCB3aXRoIGFuIFMzMiBkYXRhIHR5cGUKLSAqICAgICBpbiBhIFMzMiBjb250YWluZXIKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIGlucHV0MSAgICAgICBPcGVyYW5kIDEKLSAqIFtpbl0gaW5wdXQyICAgICAgIE9wZXJhbmQgMgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqICAgIAotICoqLwotCi1PTVhfUzMyIGFybVNhdE11bFMzMlMzMl9TMzIoT01YX1MzMiBpbnB1dDEsT01YX1MzMiBpbnB1dDIpCi17Ci0gICAgT01YX1MxNiBoaTEsaGkyOwotICAgIE9NWF9VMTYgbG8xLGxvMjsKLSAgICAKLSAgICBPTVhfUzMyIHRlbXAxLHRlbXAyLHRlbXAzOwotICAgIE9NWF9TMzIgcmVzdWx0OwotCi0gICAgaGkxICA9ICggaW5wdXQxID4+ICAxNiApOwotICAgIGxvMSAgPSAoIChPTVhfVTMyKSggaW5wdXQxIDw8IDE2ICkgPj4gMTYgKTsKLQotICAgIGhpMiAgPSAoIGlucHV0MiA+PiAgMTYgKTsKLSAgICBsbzIgID0gKCAoT01YX1UzMikoIGlucHV0MiA8PCAxNiApID4+IDE2ICk7Ci0gICAgCi0gICAgdGVtcDEgPSAgIGhpMSAqIGhpMjsKLSAgICB0ZW1wMiA9ICggaGkxKiBsbzIgKSA+PiAxNjsKLSAgICB0ZW1wMyA9ICggaGkyKiBsbzEgKSA+PiAxNjsKLQotICAgIHJlc3VsdCA9IGFybVNhdEFkZF9TMzIodGVtcDEsdGVtcDIpOwotICAgIHJlc3VsdCA9IGFybVNhdEFkZF9TMzIocmVzdWx0LHRlbXAzKTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybUludERpdkF3YXlGcm9tWmVybygpCi0gKgotICogRGVzY3JpcHRpb24gOiBJbnRlZ2VyIGRpdmlzaW9uIHdpdGggcm91bmRpbmcgdG8gdGhlIG5lYXJlc3QgaW50ZWdlci4gCi0gKiAgICAgICAgICAgICAgIEhhbGYtaW50ZWdlciB2YWx1ZXMgYXJlIHJvdW5kZWQgYXdheSBmcm9tIHplcm8KLSAqICAgICAgICAgICAgICAgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQuIEZvciBleGFtcGxlIDMvLzIgaXMgcm91bmRlZCAKLSAqICAgICAgICAgICAgICAgdG8gMiwgYW5kIC0zLy8yIGlzIHJvdW5kZWQgdG8gLTIuCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBOdW0gICAgICAgIE9wZXJhbmQgMQotICogW2luXSBEZW5vICAgICAgIE9wZXJhbmQgMgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24gaW5wdXQxLy9pbnB1dDIKLSAqICAgIAotICoqLwotCi1PTVhfUzMyIGFybUludERpdkF3YXlGcm9tWmVybyAoT01YX1MzMiBOdW0sIE9NWF9TMzIgRGVubykKLXsKLSAgICBPTVhfRjY0IHJlc3VsdDsKLSAgICAKLSAgICByZXN1bHQgPSAoKE9NWF9GNjQpTnVtKS8oKE9NWF9GNjQpRGVubyk7Ci0gICAgCi0gICAgaWYgKHJlc3VsdCA+PSAwKQotICAgIHsKLSAgICAgICAgcmVzdWx0ICs9IDAuNTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmVzdWx0IC09IDAuNTsKLSAgICB9Ci0KLSAgICByZXR1cm4gKE9NWF9TMzIpKHJlc3VsdCk7Ci19Ci0KLQotLypFbmQgb2YgRmlsZSovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTV9CaXRzdHJlYW0uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTV9CaXRzdHJlYW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlmNTNjYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vc3JjL2FybUNPTU1fQml0c3RyZWFtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybUNPTU1fQml0c3RyZWFtLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZWZpbmVzIGJpdHN0cmVhbSBlbmNvZGUgYW5kIGRlY29kZSBmdW5jdGlvbnMgY29tbW9uIHRvIGFsbCBjb2RlY3MKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRml4ZWQgYml0IGxlbmd0aCBEZWNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogRnVuY3Rpb246IGFybUxvb2tBaGVhZEJpdHMoKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogR2V0IHRoZSBuZXh0IE4gYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0gd2l0aG91dCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICoqcHBCaXRTdHJlYW0KLSAqIFtpbl0gICAgICpwT2Zmc2V0Ci0gKiBbaW5dICAgICBOPTEuLi4zMgotICoKLSAqIFJldHVybnMgIFZhbHVlCi0gKi8KLQotT01YX1UzMiBhcm1Mb29rQWhlYWRCaXRzKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLCBPTVhfSU5UICpwT2Zmc2V0LCBPTVhfSU5UIE4pCi17Ci0gICAgY29uc3QgT01YX1U4ICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOwotICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7Ci0gICAgT01YX1UzMiBWYWx1ZTsKLQotICAgIGFybUFzc2VydChPZmZzZXQ+PTAgJiYgT2Zmc2V0PD03KTsKLSAgICBhcm1Bc3NlcnQoTj49MSAmJiBOPD0zMik7Ci0KLSAgICAvKiBSZWFkIG5leHQgMzIgYml0cyBmcm9tIHN0cmVhbSAqLwotICAgIFZhbHVlID0gKHBCaXRTdHJlYW1bMF0gPDwgMjQgKSB8ICggcEJpdFN0cmVhbVsxXSA8PCAxNikgIHwgKHBCaXRTdHJlYW1bMl0gPDwgOCApIHwgKHBCaXRTdHJlYW1bM10pIDsKLSAgICBWYWx1ZSA9IChWYWx1ZSA8PCBPZmZzZXQgKSB8IChwQml0U3RyZWFtWzRdID4+ICg4LU9mZnNldCkpOwotCi0gICAgLyogUmV0dXJuIE4gYml0cyAqLwotICAgIHJldHVybiBWYWx1ZSA+PiAoMzItTik7Ci19Ci0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtR2V0Qml0cygpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBSZWFkIE4gYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KLSAqICAgIAotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQotICogW2luXSAgICAgKnBPZmZzZXQKLSAqIFtpbl0gICAgIE49MS4uMzIKLSAqCi0gKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KLSAqIFtvdXRdICAgICpwT2Zmc2V0Ci0gKiBSZXR1cm5zICBWYWx1ZQotICovCi0KLQotT01YX1UzMiBhcm1HZXRCaXRzKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLCBPTVhfSU5UICpwT2Zmc2V0LCBPTVhfSU5UIE4pCi17Ci0gICAgY29uc3QgT01YX1U4ICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOwotICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7Ci0gICAgT01YX1UzMiBWYWx1ZTsKLSAgICAKLSAgICBpZihOID09IDApCi0gICAgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgYXJtQXNzZXJ0KE9mZnNldD49MCAmJiBPZmZzZXQ8PTcpOwotICAgIGFybUFzc2VydChOPj0xICYmIE48PTMyKTsKLQotICAgIC8qIFJlYWQgbmV4dCAzMiBiaXRzIGZyb20gc3RyZWFtICovCi0gICAgVmFsdWUgPSAocEJpdFN0cmVhbVswXSA8PCAyNCApIHwgKCBwQml0U3RyZWFtWzFdIDw8IDE2KSAgfCAocEJpdFN0cmVhbVsyXSA8PCA4ICkgfCAocEJpdFN0cmVhbVszXSkgOwotICAgIFZhbHVlID0gKFZhbHVlIDw8IE9mZnNldCApIHwgKHBCaXRTdHJlYW1bNF0gPj4gKDgtT2Zmc2V0KSk7Ci0KLSAgICAvKiBBZHZhbmNlIGJpdHN0cmVhbSBwb2ludGVyIGJ5IE4gYml0cyAqLwotICAgIE9mZnNldCArPSBOOwotICAgICpwcEJpdFN0cmVhbSA9IHBCaXRTdHJlYW0gKyAoT2Zmc2V0Pj4zKTsKLSAgICAqcE9mZnNldCA9IE9mZnNldCAmIDc7Ci0KLSAgICAvKiBSZXR1cm4gTiBiaXRzICovCi0gICAgcmV0dXJuIFZhbHVlID4+ICgzMi1OKTsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtQnl0ZUFsaWduKCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEFsaWduIHRoZSBwb2ludGVyICpwcEJpdFN0cmVhbSB0byB0aGUgbmV4dCBieXRlIGJvdW5kYXJ5Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQotICogW2luXSAgICAgKnBPZmZzZXQKLSAqCi0gKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KLSAqIFtvdXRdICAgICpwT2Zmc2V0Ci0gKgotICoqLwotIAotT01YVm9pZCBhcm1CeXRlQWxpZ24oY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCkKLXsKLSAgICBpZigqcE9mZnNldCA+IDApCi0gICAgewotICAgICAgICAqcHBCaXRTdHJlYW0gKz0gMTsKLSAgICAgICAgKnBPZmZzZXQgPSAwOwotICAgIH0gICAgCi19Ci0KLS8qKiAKLSAqIEZ1bmN0aW9uOiBhcm1Ta2lwQml0cygpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBTa2lwIE4gYml0cyBmcm9tIHRoZSB2YWx1ZSBhdCAqcHBCaXRTdHJlYW0KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgICAgKnBwQml0U3RyZWFtCi0gKiBbaW5dICAgICAqcE9mZnNldAotICogW2luXSAgICAgTgotICoKLSAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQotICogW291dF0gICAgKnBPZmZzZXQKLSAqCi0gKiovCi0KLQotT01YVm9pZCBhcm1Ta2lwQml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSxPTVhfSU5UICpwT2Zmc2V0LE9NWF9JTlQgTikKLXsKLSAgICBPTVhfSU5UIE9mZnNldCA9ICpwT2Zmc2V0OwotICAgIGNvbnN0IE9NWF9VOCAqcEJpdFN0cmVhbSA9ICpwcEJpdFN0cmVhbTsKLSAgIAotICAgIC8qIEFkdmFuY2UgYml0c3RyZWFtIHBvaW50ZXIgYnkgTiBiaXRzICovCi0gICAgT2Zmc2V0ICs9IE47Ci0gICAgKnBwQml0U3RyZWFtID0gcEJpdFN0cmVhbSArIChPZmZzZXQ+PjMpOwotICAgICpwT2Zmc2V0ID0gT2Zmc2V0ICYgNzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVmFyaWFibGUgYml0IGxlbmd0aCBEZWNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogRnVuY3Rpb246IGFybVVuUGFja1ZMQzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFZhcmlhYmxlIGxlbmd0aCBkZWNvZGUgb2YgdmFyaWFibGUgbGVuZ3RoIHN5bWJvbCAobWF4IHNpemUgMzIgYml0cykgcmVhZCBmcm9tCi0gKiB0aGUgYml0IHN0cmVhbSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSBhdCAqcE9mZnNldCBieSB1c2luZyB0aGUgdGFibGUKLSAqIHBvaW50ZWQgYnkgcENvZGVCb29rCi0gKiAKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICAgICAqcEJpdFN0cmVhbQotICogW2luXSAgICAgKnBPZmZzZXQKLSAqIFtpbl0gICAgIHBDb2RlQm9vawotICogCi0gKiBbb3V0XSAgICAqcEJpdFN0cmVhbQotICogW291dF0gICAgKnBPZmZzZXQKLSAqCi0gKiBSZXR1cm5zIDogQ29kZSBCb29rIEluZGV4IGlmIHN1Y2Nlc3NmdWxsLiAKLSAqICAgICAgICAgOiBBUk1fTk9fQ09ERUJPT0tfSU5ERVggPSAtMSBpZiBzZWFyY2ggZmFpbHMuCi0gKiovCi0jaWZuZGVmIENfT1BUSU1JWkVEX0lNUExFTUVOVEFUSU9OIAotCi1PTVhfVTE2IGFybVVuUGFja1ZMQzMyKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBPZmZzZXQsCi0gICAgY29uc3QgQVJNX1ZMQzMyICpwQ29kZUJvb2sKLSkKLXsgICAgCi0gICAgY29uc3QgT01YX1U4ICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOwotICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7Ci0gICAgT01YX1UzMiBWYWx1ZTsKLSAgICBPTVhfSU5UIEluZGV4OwotICAgICAgICAKLSAgICBhcm1Bc3NlcnQoT2Zmc2V0Pj0wICYmIE9mZnNldDw9Nyk7Ci0KLSAgICAvKiBSZWFkIG5leHQgMzIgYml0cyBmcm9tIHN0cmVhbSAqLwotICAgIFZhbHVlID0gKHBCaXRTdHJlYW1bMF0gPDwgMjQgKSB8ICggcEJpdFN0cmVhbVsxXSA8PCAxNikgIHwgKHBCaXRTdHJlYW1bMl0gPDwgOCApIHwgKHBCaXRTdHJlYW1bM10pIDsKLSAgICBWYWx1ZSA9IChWYWx1ZSA8PCBPZmZzZXQgKSB8IChwQml0U3RyZWFtWzRdID4+ICg4LU9mZnNldCkpOwotCi0gICAgLyogU2VhcmNoIHRocm91Z2ggdGhlIGNvZGVib29rICovICAgIAotICAgIGZvciAoSW5kZXg9MDsgcENvZGVCb29rLT5jb2RlTGVuICE9IDA7IEluZGV4KyspCi0gICAgewotICAgICAgICBpZiAocENvZGVCb29rLT5jb2RlV29yZCA9PSAoVmFsdWUgPj4gKDMyIC0gcENvZGVCb29rLT5jb2RlTGVuKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9mZnNldCAgICAgICA9IE9mZnNldCArIHBDb2RlQm9vay0+Y29kZUxlbjsKLSAgICAgICAgICAgICpwcEJpdFN0cmVhbSA9IHBCaXRTdHJlYW0gKyAoT2Zmc2V0ID4+IDMpIDsKLSAgICAgICAgICAgICpwT2Zmc2V0ICAgICA9IE9mZnNldCAmIDc7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBJbmRleDsKLSAgICAgICAgfSAgICAgICAgCi0gICAgICAgIHBDb2RlQm9vaysrOwotICAgIH0KLQotICAgIC8qIE5vIGNvZGUgbWF0Y2ggZm91bmQgKi8KLSAgICByZXR1cm4gQVJNX05PX0NPREVCT09LX0lOREVYOwotfQotCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRml4ZWQgYml0IGxlbmd0aCBFbmNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogRnVuY3Rpb246IGFybVBhY2tCaXRzCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQYWNrIGEgVkxDIGNvZGUgd29yZCBpbnRvIHRoZSBiaXRzdHJlYW0KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHBwQml0U3RyZWFtICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbS4KLSAqIFtpbl0gcE9mZnNldCAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKLSAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAotICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KLSAqIFtpbl0gY29kZVdvcmQgICAgICAgIENvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCi0gKiBbaW5dIGNvZGVMZW5ndGggICAgICBMZW5ndGggb2YgdGhlIGNvZGUgd29yZCB2YWxpZCByYW5nZSAxLi4uMzIKLSAqCi0gKiBbb3V0XSBwcEJpdFN0cmVhbSAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyLgotICogW291dF0gcEJpdE9mZnNldCAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWF9SRVNVTFQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLSAKLU9NWFJlc3VsdCBhcm1QYWNrQml0cyAoCi0gICAgT01YX1U4ICAqKnBwQml0U3RyZWFtLCAKLSAgICBPTVhfSU5UICpwT2Zmc2V0LAotICAgIE9NWF9VMzIgY29kZVdvcmQsIAotICAgIE9NWF9JTlQgY29kZUxlbmd0aCAKLSkKLXsKLSAgICBPTVhfVTggICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOwotICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7Ci0gICAgT01YX1UzMiBWYWx1ZTsKLSAgICAgICAgCi0gICAgLyogY2hlY2tpbmcgYXJndW1lbnQgdmFsaWRpdHkgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihPZmZzZXQgPCAwLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoT2Zmc2V0ID4gNywgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGNvZGVMZW5ndGggPCAxLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoY29kZUxlbmd0aCA+IDMyLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLSAgICAvKiBQcmVwYXJlIHRoZSBmaXJzdCBieXRlICovCi0gICAgY29kZVdvcmQgPSBjb2RlV29yZCA8PCAoMzItY29kZUxlbmd0aCk7Ci0gICAgVmFsdWUgPSAocEJpdFN0cmVhbVswXSA+PiAoOC1PZmZzZXQpKSA8PCAoOC1PZmZzZXQpOwotICAgIFZhbHVlID0gVmFsdWUgfCAoY29kZVdvcmQgPj4gKDI0K09mZnNldCkpOwotCi0gICAgLyogV3JpdGUgb3V0IHdob2xlIGJ5dGVzICovCi0gICAgd2hpbGUgKDgtT2Zmc2V0IDw9IGNvZGVMZW5ndGgpCi0gICAgewotICAgICAgICAqcEJpdFN0cmVhbSsrID0gKE9NWF9VOClWYWx1ZTsKLSAgICAgICAgY29kZVdvcmQgICA9IGNvZGVXb3JkICA8PCAoOC1PZmZzZXQpOwotICAgICAgICBjb2RlTGVuZ3RoID0gY29kZUxlbmd0aCAtICg4LU9mZnNldCk7Ci0gICAgICAgIE9mZnNldCA9IDA7Ci0gICAgICAgIFZhbHVlID0gY29kZVdvcmQgPj4gMjQ7Ci0gICAgfQotCi0gICAgLyogV3JpdGUgb3V0IGZpbmFsIHBhcnRpYWwgYnl0ZSAqLwotICAgICpwQml0U3RyZWFtICA9IChPTVhfVTgpVmFsdWU7Ci0gICAgKnBwQml0U3RyZWFtID0gcEJpdFN0cmVhbTsKLSAgICAqcE9mZnNldCA9IE9mZnNldCArIGNvZGVMZW5ndGg7Ci0gICAgCi0gICAgcmV0dXJuICBPTVhfU3RzX05vRXJyOwotfQotIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVmFyaWFibGUgYml0IGxlbmd0aCBFbmNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogRnVuY3Rpb246IGFybVBhY2tWTEMzMgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGFjayBhIFZMQyBjb2RlIHdvcmQgaW50byB0aGUgYml0c3RyZWFtCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIAotICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0uCi0gKiBbaW5dCXBCaXRPZmZzZXQJICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKLSAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAotICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KLSAqIFtpbl0JIGNvZGUgICAgIAkJVkxDIGNvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0KLSAqCi0gKiBbb3V0XSBwcEJpdFN0cmVhbQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKLSAqCSAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0Ci0gKgkJCQkJCXN0cmVhbSBidWZmZXIuCi0gKiBbb3V0XSBwQml0T2Zmc2V0CQkqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotICoJCQkJCQljdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci0gKgkJCQkJCSpwcEJpdFN0cmVhbS4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0gCi1PTVhSZXN1bHQgYXJtUGFja1ZMQzMyICgKLSAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwgCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBBUk1fVkxDMzIgY29kZSAKLSkKLXsKLSAgICByZXR1cm4gKGFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBjb2RlLmNvZGVXb3JkLCBjb2RlLmNvZGVMZW4pKTsKLX0KLQotLypFbmQgb2YgRmlsZSovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vc3JjL2FybUNPTU1fSURDVFRhYmxlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vc3JjL2FybUNPTU1fSURDVFRhYmxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZDRjNjcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3NyYy9hcm1DT01NX0lEQ1RUYWJsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybUNPTU1fSURDVFRhYmxlLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgMTIyOTAKLSAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotICogCi0gKiAKLSAqIAotICogICAKLSAqIEZpbGU6IGFybUNPTU1fSURDVFRhYmxlLmMKLSAqIEJyaWVmOiBEZWZpbmVzIFRhYmxlcyB1c2VkIGluIElEQ1QgY29tcHV0YXRpb24KLSAqCi0gKi8KLQotI2luY2x1ZGUgImFybUNPTU1fSURDVFRhYmxlLmgiCi0KLSAgICAgLyogIFRhYmxlIG9mIHModSkqQSh1KSpBKHYpLzE2IGF0IFExNQotICAgICAgKiAgcyh1KT0xLjAgMCA8PSB1IDw9IDUKLSAgICAgICogIHMoNik9Mi4wCi0gICAgICAqICBzKDcpPTQuMAotICAgICAgKiAgQSgwKSA9IDIqc3FydCgyKQotICAgICAgKiAgQSh1KSA9IDQqY29zKHUqcGkvMTYpICBmb3IgKHUhPTApCi0JICAqLwotCSAgCi1fX2FsaWduKDQpIGNvbnN0IE9NWF9VMTYgYXJtQ09NTV9JRENUUHJlU2NhbGUgWzY0XSA9Ci17Ci0gICAgMHg0MDAwLCAweDU4YzUsIDB4NTM5ZiwgMHg0YjQyLCAweDQwMDAsIDB4MzI0OSwgMHg0NTQ2LCAweDQ2YTEsCi0gICAgMHg1OGM1LCAweDdiMjEsIDB4NzNmYywgMHg2ODYyLCAweDU4YzUsIDB4NDViZiwgMHg2MDE2LCAweDYxZjgsCi0gICAgMHg1MzlmLCAweDczZmMsIDB4NmQ0MSwgMHg2MjU0LCAweDUzOWYsIDB4NDFiMywgMHg1YTgyLCAweDVjNDgsCi0gICAgMHg0YjQyLCAweDY4NjIsIDB4NjI1NCwgMHg1ODdlLCAweDRiNDIsIDB4M2IyMSwgMHg1MTc1LCAweDUzMGQsCi0gICAgMHg0MDAwLCAweDU4YzUsIDB4NTM5ZiwgMHg0YjQyLCAweDQwMDAsIDB4MzI0OSwgMHg0NTQ2LCAweDQ2YTEsCi0gICAgMHgzMjQ5LCAweDQ1YmYsIDB4NDFiMywgMHgzYjIxLCAweDMyNDksIDB4Mjc4MiwgMHgzNjZkLCAweDM3N2UsCi0gICAgMHgyMmEzLCAweDMwMGIsIDB4MmQ0MSwgMHgyOGJhLCAweDIyYTMsIDB4MWIzNywgMHgyNTdlLCAweDI2M2EsCi0gICAgMHgxMWE4LCAweDE4N2UsIDB4MTcxMiwgMHgxNGMzLCAweDExYTgsIDB4MGRlMCwgMHgxMzFkLCAweDEzN2QgICAgCi19OwotICAgIC8qIEFib3ZlIGFycmF5IGFybUNPTU1fSURDVFByZVNjYWxlLCAgaW4gUTIzIGZvcm1hdCAqLwotY29uc3QgT01YX1UzMiBhcm1DT01NX0lEQ1RQcmVTY2FsZVUzMiBbNjRdID0KLXsKLSAgICAweDQwMDAwMCwgMHg1OGM1NDMsIDB4NTM5ZWJhLCAweDRiNDE4YywgMHg0MDAwMDAsIDB4MzI0OGQ0LCAweDQ1NDVlYSwgMHg0NmExNTcsCi0gICAgMHg1OGM1NDMsIDB4N2IyMGQ4LCAweDczZmJmYywgMHg2ODYyMTQsIDB4NThjNTQzLCAweDQ1YmYxZiwgMHg2MDE1YTUsIDB4NjFmNzhiLAotICAgIDB4NTM5ZWJhLCAweDczZmJmYywgMHg2ZDQxM2QsIDB4NjI1M2E2LCAweDUzOWViYSwgMHg0MWIzMjgsIDB4NWE4MjdhLCAweDVjNDg2OSwKLSAgICAweDRiNDE4YywgMHg2ODYyMTQsIDB4NjI1M2E2LCAweDU4N2RlMywgMHg0YjQxOGMsIDB4M2IyMGQ4LCAweDUxNzRlMCwgMHg1MzBkNjksCi0gICAgMHg0MDAwMDAsIDB4NThjNTQzLCAweDUzOWViYSwgMHg0YjQxOGMsIDB4NDAwMDAwLCAweDMyNDhkNCwgMHg0NTQ1ZWEsIDB4NDZhMTU3LAotICAgIDB4MzI0OGQ0LCAweDQ1YmYxZiwgMHg0MWIzMjgsIDB4M2IyMGQ4LCAweDMyNDhkNCwgMHgyNzgyMWQsIDB4MzY2ZDcyLCAweDM3N2U2YiwKLSAgICAweDIyYTJmNSwgMHgzMDBhZDMsIDB4MmQ0MTNkLCAweDI4YmE3MCwgMHgyMmEyZjUsIDB4MWIzNmI5LCAweDI1N2Q4NiwgMHgyNjM5OGQsCi0gICAgMHgxMWE4NTYsIDB4MTg3ZGUzLCAweDE3MTIxYSwgMHgxNGMzNWEsIDB4MTFhODU2LCAweDBkZGY5YiwgMHgxMzFjYzcsIDB4MTM3Y2EyCi19OwotICAgCi1jb25zdCBPTVhfVTE2IGFybUNPTU1fSURDVENvZWYgWzRdID0KLXsKLSAgICAweDVhODIsIC8qIEludlNxcnQyICovCi0gICAgMHgzMGZjLCAvKiBTaW5QSUJ5OCAqLwotICAgIDB4NzY0MiwgLyogQ29zUElCeTggKi8KLSAgICAweDAwMDAgICAgCi19OwotCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3NyYy9hcm1DT01NX01hc2tUYWJsZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3NyYy9hcm1DT01NX01hc2tUYWJsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTY5YTE2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTV9NYXNrVGFibGUuYworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybUNPTU1fTWFza1RhYmxlLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgMTIyOTAKLSAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIE1hc2sgVGFibGUgdG8gbWFzayB0aGUgZW5kIG9mIGFycmF5LgotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotCi0jZGVmaW5lIE1hc2tUYWJsZVNpemUgNzIKLQotY29uc3QgT01YX1UxNiBhcm1DT01NX3FNYXNrVGFibGUxNltNYXNrVGFibGVTaXplXSA9IAotewotICAgICAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAgICAgMHhGRkZGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgICAgIDB4RkZGRiwgMHhGRkZGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgICAgICAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAgICAgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgICAgIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAKLSAgICAgICAgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHgwMDAwLCAweDAwMDAsIAotICAgICAgICAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4MDAwMCwKLSAgICAgICAgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYgICAgCi19OwotCi1jb25zdCBPTVhfVTggYXJtQ09NTV9xTWFza1RhYmxlOFtNYXNrVGFibGVTaXplXSA9IAotewotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKLSAgICAgICAgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCi0gICAgICAgIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAotICAgICAgICAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKLSAgICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCi0gICAgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsICAKLSAgICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgIAotICAgICAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAKLSAgICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiAgICAKLX07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvYXBpL2FybVZDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvYXBpL2FybVZDLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMzdhNWQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2FwaS9hcm1WQy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE2OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkMuaAotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICAxMjI5MAotICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRmlsZTogYXJtVmlkZW8uaAotICogQnJpZWY6IERlY2xhcmVzIEFQSSdzL0Jhc2ljIERhdGEgdHlwZXMgdXNlZCBhY3Jvc3MgdGhlIE9wZW5NQVggVmlkZW8gZG9tYWluCi0gKgotICovCi0KLQotI2lmbmRlZiBfYXJtVmlkZW9fSF8KLSNkZWZpbmUgX2FybVZpZGVvX0hfCi0KLSNpbmNsdWRlICJvbXhWQy5oIgotI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCi0KLS8qKgotICogQVJNIHNwZWNpZmljIHN0YXRlIHN0cnVjdHVyZSB0byBob2xkIE1vdGlvbiBFc3RpbWF0aW9uIGluZm9ybWF0aW9uLgotICovCi0gCi1zdHJ1Y3QgbTRwMl9NRVNwZWMKLXsKLSAgICBPTVhWQ000UDJNRVBhcmFtcyBNRVBhcmFtczsKLSAgICBPTVhWQ000UDJNRU1vZGUgICBNRU1vZGU7Ci19OwotCi1zdHJ1Y3QgbTRwMTBfTUVTcGVjCi17Ci0gICAgT01YVkNNNFAxME1FUGFyYW1zIE1FUGFyYW1zOwotICAgIE9NWFZDTTRQMTBNRU1vZGUgICBNRU1vZGU7Ci19OwotCi10eXBlZGVmIHN0cnVjdCBtNHAyX01FU3BlYyAgQVJNVkNNNFAyX01FU3BlYzsKLXR5cGVkZWYgc3RydWN0IG00cDEwX01FU3BlYyBBUk1WQ000UDEwX01FU3BlYzsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0NvbXBhcmVNVgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgY29tcGFyaXNpb24gb2YgbW90aW9uIHZlY3RvcnMgYW5kIFNBRCdzIHRvIGRlY2lkZSB0aGUKLSAqIGJlc3QgTVYgYW5kIFNBRAotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgIG12WCAgICAgeCBjb29yZGluYXRlIG9mIHRoZSBjYW5kaWRhdGUgbW90aW9uIHZlY3RvcgotICogW2luXSAgICAgbXZZICAgICB5IGNvb3JkaW5hdGUgb2YgdGhlIGNhbmRpZGF0ZSBtb3Rpb24gdmVjdG9yCi0gKiBbaW5dICAgICBjYW5kU0FEIENhbmRpZGF0ZSBTQUQKLSAqIFtpbl0gICAgIGJlc3RNVlggeCBjb29yZGluYXRlIG9mIHRoZSBiZXN0IG1vdGlvbiB2ZWN0b3IKLSAqIFtpbl0gICAgIGJlc3RNVlkgeSBjb29yZGluYXRlIG9mIHRoZSBiZXN0IG1vdGlvbiB2ZWN0b3IKLSAqIFtpbl0gICAgIGJlc3RTQUQgYmVzdCBTQUQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfSU5UIC0tIDEgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY3VycmVudCBzYWQgaXMgdGhlIGJlc3QKLSAqICAgICAgICAgICAgMCB0byBpbmRpY2F0ZSB0aGF0IGl0IGlzIE5PVCB0aGUgYmVzdCBTQUQKLSAqLwotCi1PTVhfSU5UIGFybVZDTTRQMl9Db21wYXJlTVYgKAotICAgIE9NWF9TMTYgbXZYLAotICAgIE9NWF9TMTYgbXZZLAotICAgIE9NWF9JTlQgY2FuZFNBRCwKLSAgICBPTVhfUzE2IGJlc3RNVlgsCi0gICAgT01YX1MxNiBiZXN0TVZZLAotICAgIE9NWF9JTlQgYmVzdFNBRCk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9BQ0RDUHJlZGljdAotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYWRhcHRpdmUgREMvQUMgY29lZmZpY2llbnQgcHJlZGljdGlvbiBmb3IgYW4gaW50cmEgYmxvY2suIFByaW9yCi0gKiB0byB0aGUgZnVuY3Rpb24gY2FsbCwgcHJlZGljdGlvbiBkaXJlY3Rpb24gKHByZWREaXIpIHNob3VsZCBiZSBzZWxlY3RlZAotICogYXMgc3BlY2lmaWVkIGluIHN1YmNsYXVzZSA3LjQuMy4xIG9mIElTTy9JRUMgMTQ0OTYtMi4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHBTcmNEc3QgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucwotICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBxdWFudGl6ZWQgY29lZmZpY2llbnQgcmVzaWR1YWxzIChQUUYpIG9mIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sKLSAqIFtpbl0gcFByZWRCdWZSb3cgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgotICogW2luXSBwUHJlZEJ1ZkNvbCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyCi0gKiBbaW5dIGN1clFQICAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIGN1cnJlbnQgYmxvY2suIGN1clFQCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF5IGVxdWFsIHRvIHByZWRRUCBlc3BlY2lhbGx5IHdoZW4gdGhlIGN1cnJlbnQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jayBhbmQgdGhlIHByZWRpY3RvciBibG9jayBhcmUgaW4gdGhlIHNhbWUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrLgotICogW2luXSBwcmVkUVAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sKLSAqIFtpbl0gcHJlZERpciAgICAgaW5kaWNhdGVzIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCB0YWtlcyBvbmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fSE9SSVpPTlRBTCAgICBwcmVkaWN0IGhvcml6b250YWxseQotICogICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19WRVJUSUNBTCAgICAgIHByZWRpY3QgdmVydGljYWxseQotICogW2luXSBBQ1ByZWRGbGFnICBhIGZsYWcgaW5kaWNhdGluZyBpZiBBQyBwcmVkaWN0aW9uIHNob3VsZCBiZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1lZC4gSXQgaXMgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIGluIHRoZSBiaXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gc3ludGF4IG9mIE1QRUctNAotICogW2luXSB2aWRlb0NvbXAgICB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlLCBjaHJvbWluYW5jZSBvcgotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhKSBvZiB0aGUgY3VycmVudCBibG9jawotICogW2luXSBmbGFnICAgICAgICBUaGlzIGZsYWcgZGVmaW5lcyB0aGUgaWYgb25lIHdhbnRzIHRvIHVzZSB0aGlzIGZ1bmN0aW9ucyB0bwotICogICAgICAgICAgICAgICAgICBjYWxjdWxhdGUgUFFGIChzZXQgMSwgcHJlZGljdGlvbikgb3IgUUYgKHNldCAwLCByZWNvbnN0cnVjdGlvbikKLSAqIFtvdXRdICAgIHBQcmVBQ1ByZWRpY3QgICBwb2ludGVyIHRvIHRoZSBwcmVkaWN0ZWQgY29lZmZpY2llbnRzIGJ1ZmZlci4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxsZWQgT05MWSBpZiBpdCBpcyBub3QgTlVMTAotICogW291dF0gICAgcFNyY0RzdCAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHF1YW50aXplZCBjb2VmZmljaWVudHMgKFFGKSBvZiB0aGUgY3VycmVudAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrCi0gKiBbb3V0XSAgICBwUHJlZEJ1ZlJvdyBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIKLSAqIFtvdXRdICAgIHBQcmVkQnVmQ29sIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcgotICogW291dF0gICAgcFN1bUVyciAgICAgcG9pbnRlciB0byB0aGUgdXBkYXRlZCBzdW0gb2YgdGhlIGRpZmZlcmVuY2UKLSAqICAgICAgICAgICAgICAgICAgICAgIGJldHdlZW4gcHJlZGljdGVkIGFuZCB1bnByZWRpY3RlZCBjb2VmZmljaWVudHMKLSAqICAgICAgICAgICAgICAgICAgICAgIElmIHRoaXMgaXMgTlVMTCwgZG8gbm90IHVwZGF0ZQotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX0FDRENQcmVkaWN0KAotICAgICBPTVhfUzE2ICogcFNyY0RzdCwKLSAgICAgT01YX1MxNiAqIHBQcmVBQ1ByZWRpY3QsCi0gICAgIE9NWF9TMTYgKiBwUHJlZEJ1ZlJvdywKLSAgICAgT01YX1MxNiAqIHBQcmVkQnVmQ29sLAotICAgICBPTVhfSU5UIGN1clFQLAotICAgICBPTVhfSU5UIHByZWRRUCwKLSAgICAgT01YX0lOVCBwcmVkRGlyLAotICAgICBPTVhfSU5UIEFDUHJlZEZsYWcsCi0gICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50ICB2aWRlb0NvbXAsCi0gICAgIE9NWF9VOCBmbGFnLAotICAgICBPTVhfSU5UICpwU3VtRXJyCi0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfU2V0UHJlZERpcgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgZGV0ZWN0aW5nIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gYmxvY2tJbmRleCAgYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gYXMgZGVmaW5lZCBpbiBzdWJjbGF1c2UgNi4xLjMuOCwgb2YgSVNPL0lFQwotICogICAgICAgICAgICAgICAgICAgICAgICAgIDE0NDk2LTIuIEZ1cnRoZXJtb3JlLCBpbmRleGVzIDYgdG8gOSBpbmRpY2F0ZSB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSBibG9ja3Mgc3BhdGlhbGx5IGNvcnJlc3BvbmRpbmcgdG8gbHVtaW5hbmNlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzIDAgdG8gMyBpbiB0aGUgc2FtZSBtYWNyb2Jsb2NrLgotICogW2luXSBwQ29lZkJ1ZlJvdyBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyCi0gKiBbaW5dIHBRcEJ1ZiAgICAgIHBvaW50ZXIgdG8gdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYnVmZmVyCi0gKiBbb3V0XSAgICBwcmVkUVAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sKLSAqIFtvdXRdICAgIHByZWREaXIgICAgIGluZGljYXRlcyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggdGFrZXMgb25lCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX0hPUklaT05UQUwgICAgcHJlZGljdCBob3Jpem9udGFsbHkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fVkVSVElDQUwgICAgICBwcmVkaWN0IHZlcnRpY2FsbHkKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9TZXRQcmVkRGlyKAotICAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCi0gICAgIE9NWF9TMTYgKnBDb2VmQnVmUm93LAotICAgICBPTVhfUzE2ICpwQ29lZkJ1ZkNvbCwKLSAgICAgT01YX0lOVCAqcHJlZERpciwKLSAgICAgT01YX0lOVCAqcHJlZFFQLAotICAgICBjb25zdCBPTVhfVTggKnBRcEJ1ZgotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZW5jb2RpbmcgZm9yIG9uZSBpbnRyYSBibG9jay4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHBwQml0U3RyZWFtICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJpdCBzdHJlYW0KLSAqIFtpbl0gcEJpdE9mZnNldCAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNy4KLSAqIFtpbl0gcFFEY3RCbGtDb2VmICAgIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQKLSAqIFtpbl0gcHJlZERpciAgICAgICAgIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uLCB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgemlnemFnIHNjYW4gcGF0dGVybi4gVGhpcyB0YWtlcyBvbmUgb2YgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGxvd2luZyB2YWx1ZXM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19OT05FICAgICAgICAgIEFDIHByZWRpY3Rpb24gbm90IHVzZWQuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nhbi4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX0hPUklaT05UQUwgICAgSG9yaXpvbnRhbCBwcmVkaWN0aW9uLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlnemFnIHNjYW4uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19WRVJUSUNBTCAgICAgIFZlcnRpY2FsIHByZWRpY3Rpb24uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuLgotICogW2luXSBwYXR0ZXJuICAgICAgICAgYmxvY2sgcGF0dGVybiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgYmxvY2sgaXMgZW5jb2RlZAotICogW2luXSBzdGFydCAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIDB0aCBlbGVtZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgICBvciAxc3QuCi0gKiBbb3V0XSAgICBwcEJpdFN0cmVhbSAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyLgotICogW291dF0gICAgcEJpdE9mZnNldCAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYSgKLSAgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKLSAgICAgT01YX1U4IHByZWREaXIsCi0gICAgIE9NWF9VOCBwYXR0ZXJuLAotICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCi0gICAgIE9NWF9VOCBzdGFydAotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciBvbmUgaW50cmEgY29kZWQgYmxvY2suCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBwcEJpdFN0cmVhbSAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXRzdHJlYW0gYnVmZmVyCi0gKiBbaW5dIHBCaXRPZmZzZXQgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC03XS4KLSAqIFtpbl0gcHJlZERpciAgICAgICAgIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB6aWd6YWcgc2NhbiBwYXR0ZXJuLiBJdCB0YWtlcyBvbmUgb2YgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGxvd2luZyB2YWx1ZXM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19OT05FICBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkOwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybSBjbGFzc2ljYWwgemlnemFnIHNjYW47Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19IT1JJWk9OVEFMICAgIEhvcml6b250YWwgcHJlZGljdGlvbjsKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybSBhbHRlcm5hdGUtdmVydGljYWwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlnemFnIHNjYW47Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19WRVJUSUNBTCAgICAgIFZlcnRpY2FsIHByZWRpY3Rpb247Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRodXMgcGVyZm9ybQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRlcm5hdGUtaG9yaXpvbnRhbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aWd6YWcgc2Nhbi4KLSAqIFtpbl0gdmlkZW9Db21wICAgICAgIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2UsIGNocm9taW5hbmNlIG9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhKSBvZiB0aGUgY3VycmVudCBibG9jawotICogW2luXSBzaG9ydFZpZGVvSGVhZGVyIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgotICogW2luXSBzdGFydCAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIDB0aCBlbGVtZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgICBvciAxc3QuCi0gKiBbb3V0XSAgICBwcEJpdFN0cmVhbSAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWQsIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyCi0gKiBbb3V0XSAgICBwQml0T2Zmc2V0ICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0KLSAqIFtvdXRdICAgIHBEc3QgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jay4gU2hvdWxkIGJlIDMyLWJpdCBhbGlnbmVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhKAotICAgICBjb25zdCBPTVhfVTggKiogcHBCaXRTdHJlYW0sCi0gICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAotICAgICBPTVhfUzE2ICogcERzdCwKLSAgICAgT01YX1U4IHByZWREaXIsCi0gICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwgCi0gICAgIE9NWF9VOCAgc3RhcnQKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBmaWxsaW5nIG9mIHRoZSBjb2VmZmljaWVudCBidWZmZXIgYWNjb3JkaW5nIHRvIHRoZSBydW4sIGxldmVsCi0gKiBhbmQgc2lnbiwgYWxzbyB1cGRhdGVzIHRoZSBpbmRleAotICogCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgc3RvcmVSdW4gICAgICAgIFN0b3JlZCBSdW4gdmFsdWUgKGNvdW50IG9mIHplcm9zKSAgIAotICogW2luXSAgc3RvcmVMZXZlbCAgICAgIFN0b3JlZCBMZXZlbCB2YWx1ZSAobm9uLXplcm8gdmFsdWUpCi0gKiBbaW5dICBzaWduICAgICAgICAgICAgRmxhZyBpbmRpY2F0aW5nIHRoZSBzaWduIG9mIGxldmVsCi0gKiBbaW5dICBsYXN0ICAgICAgICAgICAgc3RhdHVzIG9mIHRoZSBsYXN0IGZsYWcKLSAqIFtpbl0gIHBJbmRleCAgICAgICAgICBwb2ludGVyIHRvIGNvZWZmaWNpZW50IGluZGV4IGluIDh4OCBtYXRyaXgKLSAqIFtvdXRdIHBJbmRleCAgICAgICAgICBwb2ludGVyIHRvIHVwZGF0ZWQgY29lZmZpY2llbnQgaW5kZXggaW4gOHg4IAotICogICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeAotICogW2luXSAgcFppZ3phZ1RhYmxlICAgIHBvaW50ZXIgdG8gdGhlIHppZ3phZyB0YWJsZXMKLSAqIFtvdXRdIHBEc3QgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAotICogICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLiBTaG91bGQgYmUgMzItYml0IGFsaWduZWQKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIoCi0gICAgT01YX1UzMiBzdG9yZVJ1biwKLSAgICBPTVhfUzE2ICogcERzdCwKLSAgICBPTVhfUzE2IHN0b3JlTGV2ZWwsCi0gICAgT01YX1U4ICBzaWduLAotICAgIE9NWF9VOCAgbGFzdCwKLSAgICBPTVhfVTggICogaW5kZXgsCi0gICAgY29uc3QgT01YX1U4ICogcFppZ3phZ1RhYmxlCi0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfR2V0VkxDQml0cwotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgZXNjYXBlIG1vZGUgZGVjaXNpb24gYmFzZWQgb24gdGhlIHJ1biwgcnVuKywgbGV2ZWwsIGxldmVsKyBhbmQgCi0gKiBsYXN0IGNvbWJpbmF0aW9ucy4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KLSAqCQkJCQkJCQl0aGUgYml0IHN0cmVhbQotICogW2luXQlwQml0T2Zmc2V0CQlwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotICoJCQkJCQkJCWJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNwotICogW2luXSBzaG9ydFZpZGVvSGVhZGVyIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgotICogW2luXSBzdGFydCAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIAotICogICAgICAgICAgICAgICAgICAgICAgMHRoIGVsZW1lbnQgb3IgMXN0LgotICogW2luL291dF0gcExhc3QgICAgICAgcG9pbnRlciB0byBsYXN0IHN0YXR1cyBmbGFnCi0gKiBbaW5dIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAgICAgICBUaGUgcnVuIHZhbHVlIGZyb20gd2hpY2ggbGV2ZWwgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IGxhc3QgPT0gMAotICogW2luXSBJbmRleEJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAgICAgQXJyYXkgaW5kZXggaW4gdGhlIFZMQyB0YWJsZSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50aW5nIHRvIHRoZSAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwIAotICogW2luXSBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wxICAgICAgVGhlIHJ1biB2YWx1ZSBmcm9tIHdoaWNoIGxldmVsIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiBsYXN0ID09IDEKLSAqIFtpbl0gSW5kZXhCZWdpblNpbmdsZUxldmVsRW50cmllc0wxICAgIEFycmF5IGluZGV4IGluIHRoZSBWTEMgdGFibGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGluZyB0byB0aGUgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCAKLSAqIFtpbl0gcFJ1bkluZGV4VGFibGVMMCAgICBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAotICogW2luXSBwVmxjVGFibGVMMCAgICAgICAgIFZMQyB0YWJsZSBmb3IgbGFzdCA9PSAwCi0gKiBbaW5dIHBSdW5JbmRleFRhYmxlTDEgICAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKLSAqIFtpbl0gcFZsY1RhYmxlTDEgICAgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMQotICogW2luXSBwTE1BWFRhYmxlTDAgICAgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCi0gKiBbaW5dIHBMTUFYVGFibGVMMSAgICAgICAgTGV2ZWwgTUFYIHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKLSAqIFtpbl0gcFJNQVhUYWJsZUwwICAgICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKLSAqIFtpbl0gcFJNQVhUYWJsZUwxICAgICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKLSAqIFtvdXRdcERzdAkJCSAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAotICoJCQkJCQkJYmxvY2suIFNob3VsZCBiZSAzMi1iaXQgYWxpZ25lZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX0dldFZMQ0JpdHMgKAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCi0JCQkgIE9NWF9TMTYgKiBwRHN0LAotCQkJICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCi0JCQkgIE9NWF9VOCAgICBzdGFydCwJCQkgIAotCQkJICBPTVhfVTggICogcExhc3QsCi0JCQkgIE9NWF9VOCAgICBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwLAotCQkJICBPTVhfVTggICAgbWF4SW5kZXhGb3JNdWx0aXBsZUVudHJpZXNMMCwKLQkJCSAgT01YX1U4ICAgIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wxLAotCQkJICBPTVhfVTggICAgbWF4SW5kZXhGb3JNdWx0aXBsZUVudHJpZXNMMSwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSdW5JbmRleFRhYmxlTDAsCi0gICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlTDAsCi0JCQkgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwxLAotICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwxLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwwLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwxLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwwLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwxLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFppZ3phZ1RhYmxlCi0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfUHV0VkxDQml0cwotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ2hlY2tzIHRoZSB0eXBlIG9mIEVzY2FwZSBNb2RlIGFuZCBwdXQgZW5jb2RlZCBiaXRzIGZvciAKLSAqIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnRzLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JIHBwQml0U3RyZWFtICAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi0gKgkJCQkJCSAgdGhlIGJpdCBzdHJlYW0KLSAqIFtpbl0JIHBCaXRPZmZzZXQgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3Ci0gKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCi0gKiBbaW5dICBzdGFydCAgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgMHRoIGVsZW1lbnQgb3IgMXN0LgotICogW2luXSAgbWF4U3RvcmVSdW5MMCAgICBNYXggc3RvcmUgcG9zc2libGUgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhKQotICogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbGFzdCA9IDAKLSAqIFtpbl0gIG1heFN0b3JlUnVuTDEgICAgTWF4IHN0b3JlIHBvc3NpYmxlIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGxhc3QgPSAxCi0gKiBbaW5dICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJ1biB2YWx1ZSBhZnRlciB3aGljaCBsZXZlbCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykgZm9yIGxhc3QgPSAwCi0gKiBbaW5dICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJ1biB2YWx1ZSBhZnRlciB3aGljaCBsZXZlbCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykgZm9yIGxhc3QgPSAxCi0gKiBbaW5dICBwUnVuSW5kZXhUYWJsZUwwIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAotICogW2luXSAgcFZsY1RhYmxlTDAgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMAotICogW2luXSAgcFJ1bkluZGV4VGFibGVMMSBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKLSAqIFtpbl0gIHBWbGNUYWJsZUwxICAgICAgVkxDIHRhYmxlIGZvciBsYXN0ID09IDEKLSAqIFtpbl0gIHBMTUFYVGFibGVMMCAgICAgTGV2ZWwgTUFYIHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCi0gKiBbaW5dICBwTE1BWFRhYmxlTDEgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQotICogW2luXSAgcFJNQVhUYWJsZUwwICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCi0gKiBbaW5dICBwUk1BWFRhYmxlTDEgICAgIFJ1biBNQVggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKLSAqIFtvdXRdIHBRRGN0QmxrQ29lZiAgICAgcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudAotICogW291dF0gcHBCaXRTdHJlYW0gICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZAotICogICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4KLSAqIFtvdXRdIHBCaXRPZmZzZXQgICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotICogICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0uCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLQotT01YUmVzdWx0IGFybVZDTTRQMl9QdXRWTENCaXRzICgKLSAgICAgICAgICAgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgICAgICAgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAotICAgICAgICAgICAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCi0gICAgICAgICAgICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKLSAgICAgICAgICAgICAgT01YX1U4IHN0YXJ0LAotICAgICAgICAgICAgICBPTVhfVTggbWF4U3RvcmVSdW5MMCwKLSAgICAgICAgICAgICAgT01YX1U4IG1heFN0b3JlUnVuTDEsCi0gICAgICAgICAgICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDAsCi0gICAgICAgICAgICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDEsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwwLAotICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwwLAotCQkJICBjb25zdCBPTVhfVTggICogcFJ1bkluZGV4VGFibGVMMSwKLSAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGVMMSwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMCwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMSwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMCwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMSwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBaaWd6YWdUYWJsZQotKTsKLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9GaWxsVkxDQnVmZmVyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBjYWxjdWxhdGluZyB0aGUgVkxDIGJpdHMgZGVwZW5kaW5nIG9uIHRoZSBlc2NhcGUgdHlwZSBhbmQgaW5zZXJ0IAotICogdGhlIHNhbWUgaW4gdGhlIGJpdHN0cmVhbQotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JIHBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KLSAqCSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXQgc3RyZWFtCi0gKiBbaW5dCSBwQml0T2Zmc2V0ICAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcKLSAqIFtpbl0gIHJ1biAgICAgICAgICAgICAgICBSdW4gdmFsdWUgKGNvdW50IG9mIHplcm9zKSB0byBiZSBlbmNvZGVkICAKLSAqIFtpbl0gIGxldmVsICAgICAgICAgICAgICBMZXZlbCB2YWx1ZSAobm9uLXplcm8gdmFsdWUpIHRvIGJlIGVuY29kZWQKLSAqIFtpbl0gIHJ1blBsdXMgICAgICAgICAgICBDYWxjdWxhdGVkIGFzIHJ1blBsdXMgPSBydW4gLSAoUk1BWCArIDEpICAKLSAqIFtpbl0gIGxldmVsUGx1cyAgICAgICAgICBDYWxjdWxhdGVkIGFzIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsUGx1cyA9IHNpZ24obGV2ZWwpKlthYnMobGV2ZWwpIC0gTE1BWF0KLSAqIFtpbl0gIGZNb2RlICAgICAgICAgICAgICBGbGFnIGluZGljYXRpbmcgdGhlIGVzY2FwZSBtb2RlcwotICogW2luXSAgbGFzdCAgICAgICAgICAgICAgIHN0YXR1cyBvZiB0aGUgbGFzdCBmbGFnCi0gKiBbaW5dICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJ1biB2YWx1ZSBhZnRlciB3aGljaCBsZXZlbCB3aWxsIGJlIGVxdWFsIHRvIDE6IAotICogICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpCi0gKiBbaW5dICBwUnVuSW5kZXhUYWJsZSAgICAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl90YWJsZXNfVkxDLmgKLSAqIFtpbl0gIHBWbGNUYWJsZSAgICAgICAgICBWTEMgdGFibGUgZGVmaW5lZCBpbiBhcm1WQ000UDJfSHVmZl90YWJsZXNfVkxDLmgKLSAqIFtvdXRdIHBwQml0U3RyZWFtCQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuCi0gKiBbb3V0XSBwQml0T2Zmc2V0ICAgICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX0ZpbGxWTENCdWZmZXIgKAotICAgICAgICAgICAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCi0gICAgICAgICAgICAgIE9NWF9VMzIgcnVuLAotICAgICAgICAgICAgICBPTVhfUzE2IGxldmVsLCAKLQkJCSAgT01YX1UzMiBydW5QbHVzLAotICAgICAgICAgICAgICBPTVhfUzE2IGxldmVsUGx1cywgCi0gICAgICAgICAgICAgIE9NWF9VOCAgZk1vZGUsCi0JCQkgIE9NWF9VOCAgbGFzdCwKLSAgICAgICAgICAgICAgT01YX1U4ICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMsIAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICpwUnVuSW5kZXhUYWJsZSwKLSAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGUKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9DaGVja1ZMQ0VzY2FwZU1vZGUKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGVzY2FwZSBtb2RlIGRlY2lzaW9uIGJhc2VkIG9uIHRoZSBydW4sIHJ1bissIGxldmVsLCBsZXZlbCsgYW5kIAotICogbGFzdCBjb21iaW5hdGlvbnMuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBydW4gICAgICAgICAgICAgUnVuIHZhbHVlIChjb3VudCBvZiB6ZXJvcykgdG8gYmUgZW5jb2RlZCAgCi0gKiBbaW5dIGxldmVsICAgICAgICAgICBMZXZlbCB2YWx1ZSAobm9uLXplcm8gdmFsdWUpIHRvIGJlIGVuY29kZWQKLSAqIFtpbl0gcnVuUGx1cyAgICAgICAgIENhbGN1bGF0ZWQgYXMgcnVuUGx1cyA9IHJ1biAtIChSTUFYICsgMSkgIAotICogW2luXSBsZXZlbFBsdXMgICAgICAgQ2FsY3VsYXRlZCBhcyAKLSAqICAgICAgICAgICAgICAgICAgICAgIGxldmVsUGx1cyA9IHNpZ24obGV2ZWwpKlthYnMobGV2ZWwpIC0gTE1BWF0KLSAqIFtpbl0gbWF4U3RvcmVSdW4gICAgIE1heCBzdG9yZSBwb3NzaWJsZSAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEpCi0gKiBbaW5dIG1heFJ1bkZvck11bHRpcGxlRW50cmllcyAKLSAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgCi0gKiAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IAotICogICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykKLSAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KLSAqIFtpbl0gcFJ1bkluZGV4VGFibGUgIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCi0gKiAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKQotICoKLSAqICAgICAgICAgICAgICAgICAgICAgIAotICogUmV0dXJuIFZhbHVlOgotICogUmV0dXJucyBhbiBFc2NhcGUgbW9kZSB3aGljaCBjYW4gdGFrZSB2YWx1ZXMgZnJvbSAwIHRvIDMKLSAqIDAgLS0+IG5vIGVzY2FwZSBtb2RlLCAxIC0tPiBlc2NhcGUgdHlwZSAxLAotICogMSAtLT4gZXNjYXBlIHR5cGUgMiwgMyAtLT4gZXNjYXBlIHR5cGUgMywgY2hlY2sgc2VjdGlvbiA3LjQuMS4zCi0gKiBpbiB0aGUgTVBFRyBJU08gc3RhbmRhcmQuCi0gKgotICovCi0KLU9NWF9VOCBhcm1WQ000UDJfQ2hlY2tWTENFc2NhcGVNb2RlKAotICAgICBPTVhfVTMyIHJ1biwKLSAgICAgT01YX1UzMiBydW5QbHVzLAotICAgICBPTVhfUzE2IGxldmVsLAotICAgICBPTVhfUzE2IGxldmVsUGx1cywKLSAgICAgT01YX1U4ICBtYXhTdG9yZVJ1biwKLSAgICAgT01YX1U4ICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMsCi0gICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKLSAgICAgY29uc3QgT01YX1U4ICAqcFJ1bkluZGV4VGFibGUKLSk7Ci0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYSAxNngxNiBibG9jayBzZWFyY2g7IGVzdGltYXRlcyBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgCi0gKiBCb3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IG1vdGlvbiB2ZWN0b3JzIGFyZSByZXByZXNlbnRlZCB1c2luZyBoYWxmLXBpeGVsIHVuaXRzLCBhbmQgCi0gKiB0aGVyZWZvcmUgYSBzaGlmdCBsZWZ0IG9yIHJpZ2h0IGJ5IDEgYml0IG1heSBiZSByZXF1aXJlZCwgcmVzcGVjdGl2ZWx5LCB0byBtYXRjaCB0aGUgCi0gKiBpbnB1dCBvciBvdXRwdXQgTVZzIHdpdGggb3RoZXIgZnVuY3Rpb25zIHRoYXQgZWl0aGVyIGdlbmVyYXRlIG91dHB1dCBNVnMgb3IgZXhwZWN0IAotICogaW5wdXQgTVZzIHJlcHJlc2VudGVkIHVzaW5nIGludGVnZXIgcGl4ZWwgdW5pdHMuIAotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcFNyY1JlZkJ1ZgkJcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIE1CIHRoYXQgCi0gKiAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgICAgICAgICAgcGxhbmUuCi0gKiBbaW5dCXJlZldpZHRoCQkgIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUKLSAqIFtpbl0JcFJlZlJlY3QJCSAgcG9pbnRlciB0byB0aGUgdmFsaWQgcmVjdGFuZ3VsYXIgaW4gcmVmZXJlbmNlIHBsYW5lLiBSZWxhdGl2ZSB0byBpbWFnZSBvcmlnaW4uIAotICogICAgICAgICAgICAgICAgICAgIEl0J3Mgbm90IGxpbWl0ZWQgdG8gdGhlIGltYWdlIGJvdW5kYXJ5LCBidXQgZGVwZW5kZWQgb24gdGhlIHBhZGRpbmcuIEZvciBleGFtcGxlLCAKLSAqICAgICAgICAgICAgICAgICAgICBpZiB5b3UgcGFkIDQgcGl4ZWxzIG91dHNpZGUgdGhlIGltYWdlIGJvcmRlciwgdGhlbiB0aGUgdmFsdWUgZm9yIGxlZnQgYm9yZGVyIAotICogICAgICAgICAgICAgICAgICAgIGNhbiBiZSAtNAotICogW2luXQlwU3JjQ3VyckJ1ZgkJcG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGV4dHJhY3RlZCBmcm9tIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIAotICogICAgICAgICAgICAgICAgICAgIDI1NiBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4KLSAqIFtpbl0gcEN1cnJQb2ludFBvcwlwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lCi0gKiBbaW5dIHBTcmNQcmVNVgkJICBwb2ludGVyIHRvIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yOyBOVUxMIGluZGljYXRlcyBubyBwcmVkaWN0ZWQgTVYKLSAqIFtpbl0gcFNyY1ByZVNBRAkJcG9pbnRlciB0byBTQUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVkaWN0ZWQgTVYgKHJlZmVyZW5jZWQgYnkgcFNyY1ByZU1WKQotICogW2luXSBzZWFyY2hSYW5nZQkJc2VhcmNoIHJhbmdlIGZvciAxNlgxNiBpbnRlZ2VyIGJsb2NrLHRoZSB1bml0cyBvZiBpdCBpcyBmdWxsIHBpeGVsLHRoZSBzZWFyY2ggcmFuZ2UgCi0gKiAgICAgICAgICAgICAgICAgICAgaXMgdGhlIHNhbWUgaW4gYWxsIGRpcmVjdGlvbnMuSXQgaXMgaW4gaW5jbHVzaXZlIG9mIHRoZSBib3VuZGFyeSBhbmQgc3BlY2lmaWVkIGluIAotICogICAgICAgICAgICAgICAgICAgIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMuCi0gKiBbaW5dIHBNRVNwZWMJCQkgIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAotICogICAgICAgICAgICAgICAgICAgIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgYmxvY2sgbWF0Y2hpbmcgCi0gKiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24uCi0gKiBbaW5dIEJsb2NrU2l6ZSAgICAgTWFjcm9CbG9jayBTaXplIGkuZSBlaXRoZXIgMTZ4MTYgb3IgOHg4LgotICogW291dF0JcERzdE1WCQkJcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYKLSAqIFtvdXRdCXBEc3RTQUQJCQlwb2ludGVyIHRvIG1pbmltdW0gU0FECi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1N0c19Ob0VyciCoQyBubyBlcnJvci4KLSAqIE9NWF9TdHNfQmFkQXJnRXJyIKhDIGJhZCBhcmd1bWVudHMKLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIoCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKLSAgICAgT01YX0lOVCByZWZXaWR0aCwKLSAgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCi0gICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCi0gICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjUHJlTVYsCi0gICAgIGNvbnN0IE9NWF9JTlQgKnBTcmNQcmVTQUQsCi0gICAgIHZvaWQgKnBNRVNwZWMsCi0gICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVYsCi0gICAgIE9NWF9JTlQgKnBEc3RTQUQsCi0gICAgIE9NWF9VOCBCbG9ja1NpemUKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgbWF0Y2ggd2l0aCBoYWxmLXBpeGVsIHJlc29sdXRpb24uICBSZXR1cm5zIHRoZSBlc3RpbWF0ZWQgCi0gKiBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgVGhpcyBmdW5jdGlvbiBlc3RpbWF0ZXMgdGhlIGhhbGYtcGl4ZWwgCi0gKiBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGludGVnZXIgcmVzb2x1dGlvbiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgCi0gKiBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RNViwgaS5lLiwgdGhlIGluaXRpYWwgaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgCi0gKiBleHRlcm5hbGx5LiAgVGhlIGlucHV0IHBhcmFtZXRlcnMgcFNyY1JlZkJ1ZiBhbmQgcFNlYXJjaFBvaW50UmVmUG9zIHNob3VsZCBiZSAKLSAqIHNoaWZ0ZWQgYnkgdGhlIHdpbm5pbmcgTVYgb2YgMTZ4MTYgaW50ZWdlciBzZWFyY2ggcHJpb3IgdG8gY2FsbGluZyBCbG9ja01hdGNoX0hhbGZfMTZ4MTYuICAKLSAqIFRoZSBmdW5jdGlvbiBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYgbWF5IGJlIHVzZWQgZm9yIGludGVnZXIgbW90aW9uIGVzdGltYXRpb24uCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwU3JjUmVmQnVmCQlwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgTUIgCi0gKiAgICAgICAgICAgICAgICAgICAgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiAKLSAqICAgICAgICAgICAgICAgICAgICB0aGUJY3VycmVudCBwbGFuZS4KLSAqIFtpbl0JcmVmV2lkdGgJCSAgd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZQotICogW2luXQlwUmVmUmVjdAkJICByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZQotICogW2luXQlwU3JjQ3VyckJ1ZgkJcG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGV4dHJhY3RlZCBmcm9tIG9yaWdpbmFsIHBsYW5lIAotICogICAgICAgICAgICAgICAgICAgIChsaW5lYXIgYXJyYXksIDI1NiBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiBbaW5dCXBTZWFyY2hQb2ludFJlZlBvcwlwb3NpdGlvbiBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGhhbGYgcGl4ZWwgc2VhcmNoIChzcGVjaWZpZWQgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGVybXMgb2YgaW50ZWdlciBwaXhlbCB1bml0cykgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZS4KLSAqIFtpbl0Jcm5kVmFsCQkJICByb3VuZGluZyBjb250cm9sIGJpdCBmb3IgaGFsZiBwaXhlbCBtb3Rpb24gZXN0aW1hdGlvbjsgCi0gKiAgICAgICAgICAgICAgICAgICAgMD1yb3VuZGluZyBjb250cm9sIGRpc2FibGVkOyAxPXJvdW5kaW5nIGNvbnRyb2wgZW5hYmxlZAotICogW2luXQlwU3JjRHN0TVYJCXBvaW50ZXIgdG8gdGhlIGluaXRpYWwgTVYgZXN0aW1hdGU7IHR5cGljYWxseSBnZW5lcmF0ZWQgZHVyaW5nIGEgcHJpb3IgCi0gKiAgICAgICAgICAgICAgICAgIDE2WDE2IGludGVnZXIgc2VhcmNoIGFuZCBpdHMgdW5pdCBpcyBoYWxmIHBpeGVsLgotICogW2luXSBCbG9ja1NpemUgICAgIE1hY3JvQmxvY2sgU2l6ZSBpLmUgZWl0aGVyIDE2eDE2IG9yIDh4OC4KLSAqIFtvdXRdcFNyY0RzdE1WCQlwb2ludGVyIHRvIGVzdGltYXRlZCBNVgotICogW291dF1wRHN0U0FECQkJcG9pbnRlciB0byBtaW5pbXVtIFNBRAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TdHNfTm9FcnIgqEMgbm8gZXJyb3IKLSAqIE9NWF9TdHNfQmFkQXJnRXJyIKhDIGJhZCBhcmd1bWVudHMKLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYoCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKLSAgICAgT01YX0lOVCByZWZXaWR0aCwKLSAgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCi0gICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBTZWFyY2hQb2ludFJlZlBvcywKLSAgICAgT01YX0lOVCBybmRWYWwsCi0gICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0TVYsCi0gICAgIE9NWF9JTlQgKnBEc3RTQUQsCi0gICAgIE9NWF9VOCBCbG9ja1NpemUKLSk7Ci0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfUGFkTVYKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIG1vdGlvbiB2ZWN0b3IgcGFkZGluZyBmb3IgYSBtYWNyb2Jsb2NrLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gcFNyY0RzdE1WICAgICAgIHBvaW50ZXIgdG8gbW90aW9uIHZlY3RvciBidWZmZXIgb2YgdGhlIGN1cnJlbnQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9jawotICogW2luXSBwVHJhbnNwICAgICAgICAgcG9pbnRlciB0byB0cmFuc3BhcmVudCBzdGF0dXMgYnVmZmVyIG9mIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IG1hY3JvYmxvY2sKLSAqIFtvdXRdICAgIHBTcmNEc3RNViAgICAgICBwb2ludGVyIHRvIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIGluIHdoaWNoIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb24gdmVjdG9ycyBoYXZlIGJlZW4gcGFkZGVkCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9QYWRNVigKLSAgICAgT01YVkNNb3Rpb25WZWN0b3IgKiBwU3JjRHN0TVYsCi0gICAgIE9NWF9VOCAqIHBUcmFuc3AKLSk7Ci0KLS8qIAotICogSC4yNjQgU3BlY2lmaWMgRGVjbGFyYXRpb25zIAotICovCi0vKiBEZWZpbmVzICovCi0jZGVmaW5lIEFSTV9NNFAxMF9RX09GRlNFVCAgICAgICAgKDE1KQotCi0KLS8qIERlcXVhbnQgdGFibGVzICovCi0KLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDRbMTZdOwotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1Bvc1RvVkNvbDJ4Mls0XTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9WTWF0cml4WzZdWzNdOwotZXh0ZXJuIGNvbnN0IE9NWF9VMzIgYXJtVkNNNFAxMF9NRk1hdHJpeFs2XVszXTsKLQotCi0vKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm0gdGhlIHdvcmsgcmVxdWlyZWQgYnkgdGhlIE9wZW5NQVgKLSAqIERlY29kZUNvZWZmc1RvUGFpciBmdW5jdGlvbiBhbmQgRGVjb2RlQ2hyb21hRENDb2VmZnNUb1BhaXIuCi0gKiBTaW5jZSBtb3N0IG9mIHRoZSBjb2RlIGlzIGNvbW1vbiB3ZSBzaGFyZSBpdCBoZXJlLgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwQml0U3RyZWFtCQlEb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbSBidWZmZXIKLSAqIFtpbl0JcE9mZnNldAkJCVBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotICoJCQkJCQkJCXRvIGJ5ICpwcEJpdFN0cmVhbQotICogW2luXQlzTWF4TnVtQ29lZmYJTWF4aW11bSBudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIGluIGN1cnJlbnQKLSAqCQkJCQkJCQlibG9jayAoNCwxNSBvciAxNikKLSAqIFtpbl0JblRhYmxlICAgICAgICAgIFRhYmxlIG51bWJlciAoMCB0byA0KSBhY2NvcmRpbmcgdG8gdGhlIGZpdmUgY29sdW1ucwotICogICAgICAgICAgICAgICAgICAgICAgb2YgVGFibGUgOS01IGluIHRoZSBILjI2NCBzcGVjCi0gKiBbb3V0XQlwcEJpdFN0cmVhbQkJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkCi0gKiBbb3V0XQlwT2Zmc2V0CQkJKnBPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKLSAqIFtvdXRdCXBOdW1Db2VmZgkJUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzIGluCi0gKgkJCQkJCQkJdGhpcyBibG9jawotICogW291dF0JcHBQb3NDb2VmYnVmCURvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsCi0gKgkJCQkJCQkJY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIG9teEVycm9yIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0KLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIoCi0gICAgIGNvbnN0IE9NWF9VOCoqIHBwQml0U3RyZWFtLAotICAgICBPTVhfUzMyKiBwT2Zmc2V0LAotICAgICBPTVhfVTgqIHBOdW1Db2VmZiwKLSAgICAgT01YX1U4KipwcFBvc0NvZWZidWYsCi0gICAgIE9NWF9JTlQgblRhYmxlLAotICAgICBPTVhfSU5UIHNNYXhOdW1Db2VmZiAgICAgICAgCi0gKTsKLQotLyoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybSBEQyBzdHlsZSBpbnRyYSBwcmVkaWN0aW9uLCBhdmVyYWdpbmcgdXBwZXIgYW5kIGxlZnQgYmxvY2sKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwU3JjTGVmdAkJUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGxlZnQgY29lZmZpY2llbnRzOgotICoJCQkJCQkJCXBbeCwgeV0gKHggPSAtMSwgeSA9IDAuLjMpCi0gKiBbaW5dCXBTcmNBYm92ZQkJUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGFib3ZlIGNvZWZmaWNpZW50czoKLSAqCQkJCQkJCQlwW3gseV0gKHggPSAwLi4zLCB5ID0gLTEpCi0gKiBbaW5dCWxlZnRTdGVwCQlTdGVwIG9mIGxlZnQgY29lZmZpY2llbnQgYnVmZmVyCi0gKiBbaW5dCWRzdFN0ZXAJCQlTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKLSAqIFtpbl0JYXZhaWxhYmlsaXR5CU5laWdoYm9yaW5nIDE2eDE2IE1CIGF2YWlsYWJpbGl0eSBmbGFnCi0gKiBbb3V0XQlwRHN0CQkJUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogTm9uZQotICovCi0KLXZvaWQgYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQzR4NCgKLSAgICAgY29uc3QgT01YX1U4KiBwU3JjTGVmdCwKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsCi0gICAgIE9NWF9VOCogcERzdCwKLSAgICAgT01YX0lOVCBsZWZ0U3RlcCwKLSAgICAgT01YX0lOVCBkc3RTdGVwLAotICAgICBPTVhfUzMyIGF2YWlsYWJpbGl0eSAgICAgICAgCi0pOwotCi0vKgotICogRGVzY3JpcHRpb24KLSAqIFVucGFjayBhIDR4NCBibG9jayBvZiBjb2VmZmljaWVudC1yZXNpZHVhbCBwYWlyIHZhbHVlcwotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwU3JjCURvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIKLSAqCQkJCQkJYnVmZmVyIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZwotICogW291dF0JcHBTcmMJKnBwU3JjIGlzIHVwZGF0ZWQgdG8gdGhlIHN0YXJ0IG9mIG5leHQgbm9uIGVtcHR5IGJsb2NrCi0gKiBbb3V0XQlwRHN0CVBvaW50ZXIgdG8gdW5wYWNrZWQgNHg0IGJsb2NrCi0gKi8KLQotdm9pZCBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0KAotICAgICBjb25zdCBPTVhfVTggKipwcFNyYywKLSAgICAgT01YX1MxNiogcERzdAotKTsKLQotLyoKLSAqIERlc2NyaXB0aW9uCi0gKiBVbnBhY2sgYSAyeDIgYmxvY2sgb2YgY29lZmZpY2llbnQtcmVzaWR1YWwgcGFpciB2YWx1ZXMKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcFNyYwlEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyCi0gKgkJCQkJCWJ1ZmZlciBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcKLSAqIFtvdXRdCXBwU3JjCSpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jawotICogW291dF0JcERzdAlQb2ludGVyIHRvIHVucGFja2VkIDR4NCBibG9jawotICovCi0KLXZvaWQgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazJ4MigKLSAgICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCi0gICAgIE9NWF9TMTYqIHBEc3QKLSk7Ci0KLS8qCi0gKiBEZXNjcmlwdGlvbgotICogRGVibG9jayBvbmUgYm91bmRhcnkgcGl4ZWwKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwUTAgICAgICAgICBQb2ludGVyIHRvIHBpeGVsIHEwCi0gKiBbaW5dIFN0ZXAgICAgICAgIFN0ZXAgYmV0d2VlbiBwaXhlbHMgcTAgYW5kIHExCi0gKiBbaW5dIHRDMCAgICAgICAgIEVkZ2UgdGhyZXNob2xkIHZhbHVlCi0gKiBbaW5dIGFscGhhICAgICAgIGFscGhhIHRocmVzaG9sZCB2YWx1ZQotICogW2luXSBiZXRhICAgICAgICBiZXRhIHRocmVzaG9sZCB2YWx1ZQotICogW2luXSBiUyAgICAgICAgICBkZWJsb2NraW5nIHN0cmVuZ3RoCi0gKiBbaW5dIENocm9tYUZsYWcgIFRydWUgZm9yIGNocm9tYSBibG9ja3MKLSAqIFtvdXRdIHBRMCAgICAgICAgRGVibG9ja2VkIHBpeGVscwotICogCi0gKi8KLQotdm9pZCBhcm1WQ000UDEwX0RlQmxvY2tQaXhlbCgKLSAgICBPTVhfVTggKnBRMCwgICAgLyogcG9pbnRlciB0byB0aGUgcGl4ZWwgcTAgKi8KLSAgICBpbnQgU3RlcCwgICAgICAgLyogc3RlcCBiZXR3ZWVuIHBpeGVscyBxMCBhbmQgcTEgKi8KLSAgICBpbnQgdEMwLCAgICAgICAgLyogZWRnZSB0aHJlc2hvbGQgdmFsdWUgKi8KLSAgICBpbnQgYWxwaGEsICAgICAgLyogYWxwaGEgKi8KLSAgICBpbnQgYmV0YSwgICAgICAgLyogYmV0YSAqLwotICAgIGludCBiUywgICAgICAgICAvKiBkZWJsb2NraW5nIHN0cmVuZ3RoICovCi0gICAgaW50IENocm9tYUZsYWcKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgaG9yaXpvbnRhbCAxLzItcGVsIHBvc2l0aW9ucwotICoKLSAqIFJlbWFya3M6Ci0gKgotICoJW2luXQlwU3JjCQkJUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSAKLSAJCQkJCQkJCQkJCQkJaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKLSAqCVtpbl0JaVNyY1N0ZXAJU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KLSAqCVtpbl0JaURzdFN0ZXAJU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgotICoJW2luXQlpV2lkdGgJCVdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKglbaW5dCWlIZWlnaHQJCUhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jawotICoJW291dF0JcERzdAkgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIDEvMi1wZWwgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSgKLSAgICAgICAgY29uc3QgT01YX1U4KgkJcFNyYywgCi0JCU9NWF9VMzIgCWlTcmNTdGVwLCAKLQkJT01YX1U4KiAJcERzdCwgCi0JCU9NWF9VMzIgCWlEc3RTdGVwLCAKLQkJT01YX1UzMiAJaVdpZHRoLCAKLQkJT01YX1UzMiAJaUhlaWdodAotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYQotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgdmVydGljYWwgMS8yLXBlbCBwb3NpdGlvbnMgCi0gKiBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqCVtpbl0JcFNyYwkJCVBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgCi0gKgkJCQkJCQkJCQkJCWluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCi0gKglbaW5dCWlTcmNTdGVwCVN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCi0gKglbaW5dCWlEc3RTdGVwCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KLSAqCVtpbl0JaVdpZHRoCQlXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jawotICoJW2luXQlpSGVpZ2h0CQlIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqCVtvdXRdCXBEc3QgICAgCVBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAxLzItcGVsCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSgJCi0JIGNvbnN0IE9NWF9VOCogCXBTcmMsIAotCSBPTVhfVTMyIAlpU3JjU3RlcCwgCi0gCSBPTVhfVTgqIAlwRHN0LAotIAkgT01YX1UzMiAJaURzdFN0ZXAsIAotIAkgT01YX1UzMiAJaVdpZHRoLCAKLSAJIE9NWF9VMzIgCWlIZWlnaHQKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmRGlhZ19MdW1hCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciAoMS8yLCAxLzIpICBwb3NpdGlvbnMgCi0gKiBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqICBbaW5dICAgIHBTcmMgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQotICogIFtpbl0gICAgaVNyY1N0ZXAgICAgU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KLSAqICBbaW5dICAgIGlEc3RTdGVwICAgIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KLSAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqICBbb3V0XSAgIHBEc3QgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAoMS8yLDEvMiktcGVsCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZEaWFnX0x1bWEoICAKLSAgICAgICAgY29uc3QgT01YX1U4KiAgICAgcFNyYywgCi0gICAgICAgIE9NWF9VMzIgICAgIGlTcmNTdGVwLCAKLSAgICAgICAgT01YX1U4KiAgICAgcERzdCwgCi0gICAgICAgIE9NWF9VMzIgICAgIGlEc3RTdGVwLAotICAgICAgICBPTVhfVTMyICAgICBpV2lkdGgsIAotICAgICAgICBPTVhfVTMyICAgICBpSGVpZ2h0Ci0pOwotCi0vKgotICogRGVzY3JpcHRpb246Ci0gKiBUcmFuc2Zvcm0gUmVzaWR1YWwgNHg0IENvZWZmaWNpZW50cwotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBwU3JjCQlTb3VyY2UgNHg0IGJsb2NrCi0gKiBbb3V0XSBwRHN0CQlEZXN0aW5hdGlvbiA0eDQgYmxvY2sKLSAqCi0gKi8KLQotdm9pZCBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0KE9NWF9TMTYqIHBEc3QsIE9NWF9TMTYgKnBTcmMpOwotCi0vKgotICogRGVzY3JpcHRpb246Ci0gKiBGb3J3YXJkIFRyYW5zZm9ybSBSZXNpZHVhbCA0eDQgQ29lZmZpY2llbnRzCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIHBTcmMJCVNvdXJjZSA0eDQgYmxvY2sKLSAqIFtvdXRdIHBEc3QJCURlc3RpbmF0aW9uIDR4NCBibG9jawotICoKLSAqLwotCi12b2lkIGFybVZDTTRQMTBfRndkVHJhbnNmb3JtUmVzaWR1YWw0eDQoT01YX1MxNiogcERzdCwgT01YX1MxNiAqcFNyYyk7Ci0KLU9NWF9JTlQgYXJtVkNNNFAxMF9Db21wYXJlTW90aW9uQ29zdFRvTVYgKAotICAgIE9NWF9TMTYgIG12WCwKLSAgICBPTVhfUzE2ICBtdlksCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgZGlmZk1WLCAKLSAgICBPTVhfSU5UIGNhbmRTQUQsIAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpiZXN0TVYsIAotICAgIE9NWF9VMzIgbkxhbWRhLAotICAgIE9NWF9TMzIgKnBCZXN0Q29zdCk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDQ09NTV9TQUQKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlIHRoZSBTQUQgZm9yIE54TSBibG9ja3MuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBbaW5dCQlwU3JjT3JnCQlQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jawotICogW2luXQkJaVN0ZXBPcmcJU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyCi0gKiBbaW5dCQlwU3JjUmVmCQlQb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sKLSAqIFtpbl0JCWlTdGVwUmVmCVN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXIKLSAqIFtpbl0JCWlIZWlnaHQJCUhlaWdodCBvZiB0aGUgYmxvY2sKLSAqIFtpbl0JCWlXaWR0aAkJV2lkdGggb2YgdGhlIGJsb2NrCi0gKiBbb3V0XQlwRHN0U0FECQlQb2ludGVyIG9mIHJlc3VsdCBTQUQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCi0gKgotICovCi1PTVhSZXN1bHQgYXJtVkNDT01NX1NBRCgJCi0JY29uc3QgT01YX1U4KiAJcFNyY09yZywKLQlPTVhfVTMyIAlpU3RlcE9yZywKLQljb25zdCBPTVhfVTgqIAlwU3JjUmVmLAotCU9NWF9VMzIgCWlTdGVwUmVmLAotCU9NWF9TMzIqCXBEc3RTQUQsCi0JT01YX1UzMgkJaUhlaWdodCwKLQlPTVhfVTMyCQlpV2lkdGgpOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ0NPTU1fQXZlcmFnZQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byBibG9ja3MgYW5kIHN0b3JlcyB0aGUgcmVzdWx0LgotICoKLSAqIFJlbWFya3M6Ci0gKgotICoJW2luXQlwUHJlZDAJCQlQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAKLSAqCVtpbl0JcFByZWQxCQkJUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAxCi0gKglbaW5dCWlQcmVkU3RlcDAJICAgIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAKLSAqCVtpbl0JaVByZWRTdGVwMQkgICAgU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMQotICoJW2luXQlpRHN0U3RlcCAJCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgotICoJW2luXQlpV2lkdGgJCQlXaWR0aCBvZiB0aGUgYmxvY2tzCi0gKglbaW5dCWlIZWlnaHQJCQlIZWlnaHQgb2YgdGhlIGJsb2NrcwotICoJW291dF0JcERzdFByZWQJCVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLSBPTVhSZXN1bHQgYXJtVkNDT01NX0F2ZXJhZ2UgKAotCSBjb25zdCBPTVhfVTgqIAkgICAgcFByZWQwLAotCSBjb25zdCBPTVhfVTgqIAkgICAgcFByZWQxLAkKLQkgT01YX1UzMgkJaVByZWRTdGVwMCwKLQkgT01YX1UzMgkJaVByZWRTdGVwMSwKLQkgT01YX1U4KgkJcERzdFByZWQsCi0JIE9NWF9VMzIJCWlEc3RTdGVwLCAKLQkgT01YX1UzMgkJaVdpZHRoLAotCSBPTVhfVTMyCQlpSGVpZ2h0Ci0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX1NBRFF1YXIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGJldHdlZW4gb25lIGJsb2NrIChwU3JjKSBhbmQgdGhlIAotICogYXZlcmFnZSBvZiB0aGUgb3RoZXIgdHdvIChwU3JjUmVmMCBhbmQgcFNyY1JlZjEpCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBbaW5dCQlwU3JjCQkJCVBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrCi0gKiBbaW5dCQlwU3JjUmVmMAkJUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMAotICogW2luXQkJcFNyY1JlZjEJCVBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEKLSAqIFtpbl0JCWlTcmNTdGVwIAkJU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyCi0gKiBbaW5dCQlpUmVmU3RlcDAJCVN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiBbaW5dCQlpUmVmU3RlcDEgCVN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiBbaW5dCQlpSGVpZ2h0CQkJSGVpZ2h0IG9mIHRoZSBibG9jawotICogW2luXQkJaVdpZHRoCQkJV2lkdGggb2YgdGhlIGJsb2NrCi0gKiBbb3V0XQlwRHN0U0FECQkJUG9pbnRlciBvZiByZXN1bHQgU0FECi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotT01YUmVzdWx0IGFybVZDTTRQMTBfU0FEUXVhcigKLQljb25zdCBPTVhfVTgqIAlwU3JjLAotICAgIGNvbnN0IE9NWF9VOCogCXBTcmNSZWYwLAotCWNvbnN0IE9NWF9VOCogCXBTcmNSZWYxLAkKLSAgICBPTVhfVTMyIAlpU3JjU3RlcCwKLSAgICBPTVhfVTMyCQlpUmVmU3RlcDAsCi0gICAgT01YX1UzMgkJaVJlZlN0ZXAxLAotICAgIE9NWF9VMzIqCXBEc3RTQUQsCi0gICAgT01YX1UzMiAgICAgaUhlaWdodCwKLSAgICBPTVhfVTMyICAgICBpV2lkdGgKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIGNocm9tYSBjb21wb25lbnRzLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogIFtpbl0gICAgcFNyYyAgICAgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnBvbGF0ZSBpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQotICogIFtpbl0gICAgaVNyY1N0ZXAgICAgU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KLSAqICBbaW5dICAgIGlEc3RTdGVwICAgIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KLSAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqICBbaW5dICAgIGR4ICAgICAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvOCBwaXhlbCB1bml0ICgwfjcpIAotICogIFtpbl0gICAgZHkgICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvOCBwaXhlbCB1bml0ICgwfjcpCi0gKiAgW291dF0gICBwRHN0ICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCi0gKgotICovCi0gT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hKAotICAgICAgICBPTVhfVTggICAgICAqcFNyYywKLSAgICAgICAgT01YX1UzMiAgICAgaVNyY1N0ZXAsCi0gICAgICAgIE9NWF9VOCAgICAgICpwRHN0LAotICAgICAgICBPTVhfVTMyICAgICBpRHN0U3RlcCwKLSAgICAgICAgT01YX1UzMiAgICAgaVdpZHRoLAotICAgICAgICBPTVhfVTMyICAgICBpSGVpZ2h0LAotICAgICAgICBPTVhfVTMyICAgICBkeCwKLSAgICAgICAgT01YX1UzMiAgICAgZHkKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciBsdW1hIGNvbXBvbmVudHMuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiAgW2luXSAgICBwU3JjICAgICAgICAgICAgUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sYXRlIGluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCi0gKiAgW2luXSAgICBpU3JjU3RlcCAgICBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgotICogIFtpbl0gICAgaURzdFN0ZXAgICAgU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgotICogIFtpbl0gICAgaVdpZHRoICAgICAgV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqICBbaW5dICAgIGlIZWlnaHQgICAgIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jawotICogIFtpbl0gICAgZHggICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS80IHBpeGVsIHVuaXQgKDB+MykgCi0gKiAgW2luXSAgICBkeSAgICAgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS80IHBpeGVsIHVuaXQgKDB+MykgCi0gKiAgW291dF0gICBwRHN0ICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCi0gKgotICovCi0KLSBPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hKAotICAgICBjb25zdCBPTVhfVTggICAgICpwU3JjLAotICAgICBPTVhfVTMyICAgIGlTcmNTdGVwLAotICAgICBPTVhfVTggICAgICpwRHN0LAotICAgICBPTVhfVTMyICAgIGlEc3RTdGVwLAotICAgICBPTVhfVTMyICAgIGlXaWR0aCwKLSAgICAgT01YX1UzMiAgICBpSGVpZ2h0LAotICAgICBPTVhfVTMyICAgIGR4LAotICAgICBPTVhfVTMyICAgIGR5Ci0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBvbXhWQ0gyNjRfRGVxdWFudFRyYW5zZm9ybUFDRnJvbVBhaXJfVThfUzE2X0MxX0RMeAotICoKLSAqIERlc2NyaXB0aW9uOgotICogUmVjb25zdHJ1Y3QgdGhlIDR4NCByZXNpZHVhbCBibG9jayBmcm9tIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyLAotICogcGVyZm9ybSBkZXF1YW50aXNhdGlvbiBhbmQgaW50ZWdlciBpbnZlcnNlIHRyYW5zZm9ybWF0aW9uIGZvciA0eDQgYmxvY2sgb2YKLSAqIHJlc2lkdWFscyBhbmQgdXBkYXRlIHRoZSBwYWlyIGJ1ZmZlciBwb2ludGVyIHRvIG5leHQgbm9uLWVtcHR5IGJsb2NrLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcHBTcmMJCURvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uCi0gKgkJCQkJCQlwYWlyIGJ1ZmZlciBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcKLSAqIFtpbl0JcERDCQkJUG9pbnRlciB0byB0aGUgREMgY29lZmZpY2llbnQgb2YgdGhpcyBibG9jaywgTlVMTAotICoJCQkJCQkJaWYgaXQgZG9lc24ndCBleGlzdAotICogW2luXQlRUAkJCVF1YW50aXphdGlvbiBwYXJhbWV0ZXIKLSAqIFtpbl0gQUMgICAgICAgICAgRmxhZyBpbmRpY2F0aW5nIGlmIGF0IGxlYXN0IG9uZSBub24temVybyBjb2VmZmljaWVudCBleGlzdHMKLSAqIFtvdXRdCXBEc3QJCXBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgNHg0IGJsb2NrIGRhdGEKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBvbXhFcnJvciByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtQUNGcm9tUGFpcl9VOF9TMTZfQzFfREx4KAotICAgICBPTVhfVTggKipwcFNyYywKLSAgICAgT01YX1MxNiAqcERzdCwKLSAgICAgT01YX0lOVCBRUCwKLSAgICAgT01YX1MxNiogcERDLAotICAgICBpbnQgQUMKLSk7Ci0KLSNlbmRpZiAgLypfYXJtVmlkZW9fSF8qLwotCi0vKkVuZCBvZiBGaWxlKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2FwaS9hcm1WQ0NPTU1fcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2FwaS9hcm1WQ0NPTU1fcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmMyYTNiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9hcGkvYXJtVkNDT01NX3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ0NPTU1fcy5oCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotOy8vIEFSTSBvcHRpbWl6ZWQgT3Blbk1BWCBBQyBoZWFkZXIgZmlsZQotOy8vIAotOy8vIEZvcm11bGEgdXNlZDoKLTsvLyBNQUNSTyBmb3IgY2FsY3VsYXRpbmcgbWVkaWFuIGZvciB0aHJlZSB2YWx1ZXMuCi0KLQotCi0gICAgSUYgOkxOT1Q6OkRFRjpBUk1WQ0NPTU1fU19ICi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICBNX1ZBUklBTlRTICAgICAgQ29ydGV4QTgsIEFSTTExMzZKUwotICAgIAotICAgIElGIEFSTTExMzZKUyA6TE9SOiBDb3J0ZXhBOCAKLSAgICAgCi0gICAgIDsvLy8qCi0gICAgIDsvLyAqIE1hY3JvOiBNX01FRElBTjMKLSAgICAgOy8vICoKLSAgICAgOy8vICogRGVzY3JpcHRpb246IEZpbmRzIHRoZSBtZWRpYW4gb2YgdGhyZWUgbnVtYmVycwotICAgICA7Ly8gKiAKLSAgICAgOy8vICogUmVtYXJrczoKLSAgICAgOy8vICoKLSAgICAgOy8vICogUGFyYW1ldGVyczoKLSAgICAgOy8vICogW2luXSB4ICAgICBGaXJzdCBlbnRyeSBmb3IgdGhlIGxpc3Qgb2YgdGhyZWUgbnVtYmVycy4KLSAgICAgOy8vICogW2luXSB5ICAgICBTZWNvbmQgZW50cnkgZm9yIHRoZSBsaXN0IG9mIHRocmVlIG51bWJlcnMuCi0gICAgIDsvLyAqICAgICAgICAgICAgSW5wdXQgdmFsdWUgbWF5IGJlIGNvcnJ1cHRlZCBhdCB0aGUgZW5kIG9mCi0gICAgIDsvLyAqICAgICAgICAgICAgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIG1hY3JvLgotICAgICA7Ly8gKiBbaW5dIHogICAgIFRoaXJkIGVudHJ5IG9mIHRoZSBsaXN0IG9mIHRocmVlIG51bWJlcnMuCi0gICAgIDsvLyAqICAgICAgICAgICAgSW5wdXQgdmFsdWUgY29ycnVwdGVkIGF0IHRoZSBlbmQgb2YgdGhlIAotICAgICA7Ly8gKiAgICAgICAgICAgIGV4ZWN1dGlvbiBvZiB0aGlzIG1hY3JvLgotICAgICA7Ly8gKiBbaW5dIHQgICAgIFRlbXBvcmFyeSBzY3JhdGNoICByZWdpc3Rlci4KLSAgICAgOy8vICogW291dF16ICAgICBNZWRpYW4gb2YgdGhlIHRocmVlIG51bWJlcnMuICAgICAgIAotICAgICA7Ly8gKi8KLSAgICAgCi0gICAgIE1BQ1JPCi0KLSAgICAgTV9NRURJQU4zICR4LCAkeSwgJHosICR0IAotICAgICAKLSAgICAgU1VCUyAgJHQsICR5LCAkejsgLy8gaWYgKHkgPCB6KQotICAgICBBRERMVCAkeiwgJHosICR0OyAvLyAgc3dhcCB5IGFuZCB6Ci0gICAgIFNVQkxUICR5LCAkeSwgJHQ7Ci0KLSAgICAgOy8vIE5vdyB6JyA8PSB5Jywgc28gdGhlcmUgYXJlIHRocmVlIGNhc2VzIGZvciB0aGUKLSAgICAgOy8vIG1lZGlhbiB2YWx1ZSwgZGVwZW5kaW5nIG9uIHguCi0KLSAgICAgOy8vIDEpIHggPD0geicgICAgICA8PSB5JyAgICAgIDogbWVkaWFuIHZhbHVlIGlzIHonCi0gICAgIDsvLyAyKSAgICAgIHonIDw9IHggPD0geScgICAgICA6IG1lZGlhbiB2YWx1ZSBpcyB4Ci0gICAgIDsvLyAzKSAgICAgIHonICAgICAgPD0geScgPD0geCA6IG1lZGlhbiB2YWx1ZSBpcyB5JwotCi0gICAgIENNUCAgICR6LCAkeDsgICAgIC8vIGlmICggeCA+IG1pbih5LHopICkKLSAgICAgTU9WTFQgJHosICR4OyAgICAgLy8gYW5zID0geCAKLQotICAgICBDTVAgICAkeCwgJHk7ICAgICAvLyBpZiAoIHggPiBtYXgoeSx6KSApCi0gICAgIE1PVkdUICR6LCAkeTsgICAgIC8vIGFucyA9IG1heCh5LHopCi0gICAgIAotICAgICBNRU5ECi0gICAgRU5ESUYgICAgICAKLSAgICAKLSAgICAKLSAgICAgICAgCi0gICAgRU5ESUYgOy8vIEFSTUFDQ09NTV9TX0gKLQotIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2FwaS9vbXhWQy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2FwaS9vbXhWQy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjNjYzcyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9hcGkvb214VkMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQzODEgKzAsMCBAQAotLyoqCi0gKiBGaWxlOiBvbXhWQy5oCi0gKiBCcmllZjogT3Blbk1BWCBETCB2MS4wLjIgLSBWaWRlbyBDb2RpbmcgbGlicmFyeQotICoKLSAqIENvcHlyaWdodCCpIDIwMDUtMjAwOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotICoKLSAqIFRoZXNlIG1hdGVyaWFscyBhcmUgcHJvdGVjdGVkIGJ5IGNvcHlyaWdodCBsYXdzIGFuZCBjb250YWluIG1hdGVyaWFsIAotICogcHJvcHJpZXRhcnkgdG8gdGhlIEtocm9ub3MgR3JvdXAsIEluYy4gIFlvdSBtYXkgdXNlIHRoZXNlIG1hdGVyaWFscyAKLSAqIGZvciBpbXBsZW1lbnRpbmcgS2hyb25vcyBzcGVjaWZpY2F0aW9ucywgd2l0aG91dCBhbHRlcmluZyBvciByZW1vdmluZyAKLSAqIGFueSB0cmFkZW1hcmssIGNvcHlyaWdodCBvciBvdGhlciBub3RpY2UgZnJvbSB0aGUgc3BlY2lmaWNhdGlvbi4KLSAqIAotICogS2hyb25vcyBHcm91cCBtYWtlcyBubywgYW5kIGV4cHJlc3NseSBkaXNjbGFpbXMgYW55LCByZXByZXNlbnRhdGlvbnMgCi0gKiBvciB3YXJyYW50aWVzLCBleHByZXNzIG9yIGltcGxpZWQsIHJlZ2FyZGluZyB0aGVzZSBtYXRlcmlhbHMsIGluY2x1ZGluZywgCi0gKiB3aXRob3V0IGxpbWl0YXRpb24sIGFueSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IG9yIGZpdG5lc3MgCi0gKiBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2Ugb3Igbm9uLWluZnJpbmdlbWVudCBvZiBhbnkgaW50ZWxsZWN0dWFsIHByb3BlcnR5LiAKLSAqIEtocm9ub3MgR3JvdXAgbWFrZXMgbm8sIGFuZCBleHByZXNzbHkgZGlzY2xhaW1zIGFueSwgd2FycmFudGllcywgZXhwcmVzcyAKLSAqIG9yIGltcGxpZWQsIHJlZ2FyZGluZyB0aGUgY29ycmVjdG5lc3MsIGFjY3VyYWN5LCBjb21wbGV0ZW5lc3MsIHRpbWVsaW5lc3MsIAotICogYW5kIHJlbGlhYmlsaXR5IG9mIHRoZXNlIG1hdGVyaWFscy4gCi0gKgotICogVW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyB3aWxsIHRoZSBLaHJvbm9zIEdyb3VwLCBvciBhbnkgb2YgaXRzIFByb21vdGVycywgCi0gKiBDb250cmlidXRvcnMgb3IgTWVtYmVycyBvciB0aGVpciByZXNwZWN0aXZlIHBhcnRuZXJzLCBvZmZpY2VycywgZGlyZWN0b3JzLCAKLSAqIGVtcGxveWVlcywgYWdlbnRzIG9yIHJlcHJlc2VudGF0aXZlcyBiZSBsaWFibGUgZm9yIGFueSBkYW1hZ2VzLCB3aGV0aGVyIAotICogZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgZm9yIGxvc3QgcmV2ZW51ZXMsIAotICogbG9zdCBwcm9maXRzLCBvciBvdGhlcndpc2UsIGFyaXNpbmcgZnJvbSBvciBpbiBjb25uZWN0aW9uIHdpdGggdGhlc2UgCi0gKiBtYXRlcmlhbHMuCi0gKiAKLSAqIEtocm9ub3MgYW5kIE9wZW5NQVggYXJlIHRyYWRlbWFya3Mgb2YgdGhlIEtocm9ub3MgR3JvdXAgSW5jLiAKLSAqCi0gKi8KLQotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX09NWFZDX0hfCi0jZGVmaW5lIF9PTVhWQ19IXwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0KLS8qIDYuMS4xLjEgTW90aW9uIFZlY3RvcnMgICovCi0vKiBJbiBvbXhWQywgbW90aW9uIHZlY3RvcnMgYXJlIHJlcHJlc2VudGVkIGFzIGZvbGxvd3M6ICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgT01YX1MxNiBkeDsKLSAgICBPTVhfUzE2IGR5OwotfSBPTVhWQ01vdGlvblZlY3RvcjsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQXZlcmFnZV84eCAgICg2LjEuMy4xLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGF2ZXJhZ2Ugb2YgdHdvIDh4NCwgOHg4LCBvciA4eDE2IGJsb2Nrcy4gIFRoZSAKLSAqIHJlc3VsdCBpcyByb3VuZGVkIGFjY29yZGluZyB0byAoYStiKzEpLzIuICBUaGUgYmxvY2sgYXZlcmFnZSBmdW5jdGlvbiBjYW4gCi0gKiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggaGFsZi1waXhlbCBpbnRlcnBvbGF0aW9uIHRvIG9idGFpbiBxdWFydGVyIAotICogcGl4ZWwgbW90aW9uIGVzdGltYXRlcywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0xMF0sIHN1YmNsYXVzZSA4LjQuMi4yLjEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBQcmVkMCAgICAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIHBQcmVkMSAgICAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlQcmVkU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogICBpUHJlZFN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaURzdFN0ZXAgICAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gCi0gKiAgIGlIZWlnaHQgICAgLSBIZWlnaHQgb2YgdGhlIGJsb2NrcyAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFByZWQgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuIDgtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCi0gKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwUHJlZDAsIHBQcmVkMSwgb3IgCi0gKiAgICAgICAgICAgICAgcERzdFByZWQuIAotICogICAgLSAgIHBEc3RQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgICAtICAgaVByZWRTdGVwMCA8PSAwIG9yIGlQcmVkU3RlcDAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgaVByZWRTdGVwMSA8PSAwIG9yIGlQcmVkU3RlcDEgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgaURzdFN0ZXAgICA8PSAwIG9yIGlEc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgIGlIZWlnaHQgaXMgbm90IDQsIDgsIG9yIDE2LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fQXZlcmFnZV84eCAoCi0gICAgY29uc3QgT01YX1U4ICpwUHJlZDAsCi0gICAgY29uc3QgT01YX1U4ICpwUHJlZDEsCi0gICAgT01YX1UzMiBpUHJlZFN0ZXAwLAotICAgIE9NWF9VMzIgaVByZWRTdGVwMSwKLSAgICBPTVhfVTggKnBEc3RQcmVkLAotICAgIE9NWF9VMzIgaURzdFN0ZXAsCi0gICAgT01YX1UzMiBpSGVpZ2h0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9BdmVyYWdlXzE2eCAgICg2LjEuMy4xLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGF2ZXJhZ2Ugb2YgdHdvIDE2eDE2IG9yIDE2eDggYmxvY2tzLiAgVGhlIAotICogcmVzdWx0IGlzIHJvdW5kZWQgYWNjb3JkaW5nIHRvIChhK2IrMSkvMi4gIFRoZSBibG9jayBhdmVyYWdlIGZ1bmN0aW9uIGNhbiAKLSAqIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBoYWxmLXBpeGVsIGludGVycG9sYXRpb24gdG8gb2J0YWluIHF1YXJ0ZXIgCi0gKiBwaXhlbCBtb3Rpb24gZXN0aW1hdGVzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTEwXSwgc3ViY2xhdXNlIDguNC4yLjIuMS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFByZWQwIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogICBwUHJlZDEgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlQcmVkU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogICBpUHJlZFN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIgCi0gKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrcyAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFByZWQgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuIDE2LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAotICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFByZWQwLCBwUHJlZDEsIG9yIAotICogICAgICAgICAgICAgIHBEc3RQcmVkLiAKLSAqICAgIC0gICBwRHN0UHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICAgLSAgIGlQcmVkU3RlcDAgPD0gMCBvciBpUHJlZFN0ZXAwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgIC0gICBpUHJlZFN0ZXAxIDw9IDAgb3IgaVByZWRTdGVwMSBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgICAtICAgaURzdFN0ZXAgPD0gMCBvciBpRHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgICAtICAgaUhlaWdodCBpcyBub3QgOCBvciAxNi4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNDT01NX0F2ZXJhZ2VfMTZ4ICgKLSAgICBjb25zdCBPTVhfVTggKnBQcmVkMCwKLSAgICBjb25zdCBPTVhfVTggKnBQcmVkMSwKLSAgICBPTVhfVTMyIGlQcmVkU3RlcDAsCi0gICAgT01YX1UzMiBpUHJlZFN0ZXAxLAotICAgIE9NWF9VOCAqcERzdFByZWQsCi0gICAgT01YX1UzMiBpRHN0U3RlcCwKLSAgICBPTVhfVTMyIGlIZWlnaHQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0V4cGFuZEZyYW1lX0kgICAoNi4xLjMuMi4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBleHBhbmRzIGEgcmVjb25zdHJ1Y3RlZCBmcmFtZSBpbi1wbGFjZS4gIFRoZSB1bmV4cGFuZGVkIAotICogc291cmNlIGZyYW1lIHNob3VsZCBiZSBzdG9yZWQgaW4gYSBwbGFuZSBidWZmZXIgd2l0aCBzdWZmaWNpZW50IHNwYWNlIAotICogcHJlLWFsbG9jYXRlZCBmb3IgZWRnZSBleHBhbnNpb24sIGFuZCB0aGUgaW5wdXQgZnJhbWUgc2hvdWxkIGJlIGxvY2F0ZWQgaW4gCi0gKiB0aGUgcGxhbmUgYnVmZmVyIGNlbnRlci4gIFRoaXMgZnVuY3Rpb24gZXhlY3V0ZXMgdGhlIHBpeGVsIGV4cGFuc2lvbiBieSAKLSAqIHJlcGxpY2F0aW5nIHNvdXJjZSBmcmFtZSBlZGdlIHBpeGVsIGludGVuc2l0aWVzIGluIHRoZSBlbXB0eSBwaXhlbCAKLSAqIGxvY2F0aW9ucyAoZXhwYW5zaW9uIHJlZ2lvbikgYmV0d2VlbiB0aGUgc291cmNlIGZyYW1lIGVkZ2UgYW5kIHRoZSBwbGFuZSAKLSAqIGJ1ZmZlciBlZGdlLiAgVGhlIHdpZHRoL2hlaWdodCBvZiB0aGUgZXhwYW5zaW9uIHJlZ2lvbnMgb24gdGhlIAotICogaG9yaXpvbnRhbC92ZXJ0aWNhbCBlZGdlcyBpcyBjb250cm9sbGVkIGJ5IHRoZSBwYXJhbWV0ZXIgaUV4cGFuZFBlbHMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3RQbGFuZSAtIHBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgZnJhbWUgdG8gYmUgCi0gKiAgICAgICAgICAgIGV4cGFuZGVkOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgaUZyYW1lV2lkdGggLSBmcmFtZSB3aWR0aDsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBpRnJhbWVIZWlnaHQgLWZyYW1lIGhlaWdodDsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBpRXhwYW5kUGVscyAtIG51bWJlciBvZiBwaXhlbHMgdG8gYmUgZXhwYW5kZWQgaW4gdGhlIGhvcml6b250YWwgYW5kIAotICogICAgICAgICAgICB2ZXJ0aWNhbCBkaXJlY3Rpb25zOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIGlQbGFuZVN0ZXAgLSBkaXN0YW5jZSwgaW4gYnl0ZXMsIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNvbnNlY3V0aXZlIGxpbmVzIAotICogICAgICAgICAgICBpbiB0aGUgcGxhbmUgYnVmZmVyOyBtdXN0IGJlIGxhcmdlciB0aGFuIG9yIGVxdWFsIHRvIAotICogICAgICAgICAgICAoaUZyYW1lV2lkdGggKyAyICogaUV4cGFuZFBlbHMpLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdFBsYW5lIC1Qb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGZyYW1lIChOT1QgdGhlIAotICogICAgICAgICAgICB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIHBsYW5lKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKLSAqICAgIC0gICAgcFNyY0RzdFBsYW5lIGlzIE5VTEwuIAotICogICAgLSAgICBwU3JjRHN0UGxhbmUgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgIC0gICAgb25lIG9mIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBpcyBlaXRoZXIgZXF1YWwgdG8gemVybyBvciBpcyBhIAotICogICAgICAgICAgICAgIG5vbi1tdWx0aXBsZSBvZiA4OiBpRnJhbWVIZWlnaHQsIGlGcmFtZVdpZHRoLCBpUGxhbmVTdGVwLCBvciAKLSAqICAgICAgICAgICAgICBpRXhwYW5kUGVscy4gCi0gKiAgICAtICAgIGlQbGFuZVN0ZXAgPCAoaUZyYW1lV2lkdGggKyAyICogaUV4cGFuZFBlbHMpLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSSAoCi0gICAgT01YX1U4ICpwU3JjRHN0UGxhbmUsCi0gICAgT01YX1UzMiBpRnJhbWVXaWR0aCwKLSAgICBPTVhfVTMyIGlGcmFtZUhlaWdodCwKLSAgICBPTVhfVTMyIGlFeHBhbmRQZWxzLAotICAgIE9NWF9VMzIgaVBsYW5lU3RlcAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQ29weTh4OCAgICg2LjEuMy4zLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb3BpZXMgdGhlIHJlZmVyZW5jZSA4eDggYmxvY2sgdG8gdGhlIGN1cnJlbnQgYmxvY2suIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgaW4gdGhlIHNvdXJjZSBmcmFtZTsgbXVzdCBiZSAKLSAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBzdGVwIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnRzIG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIGZyYW1lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDggYW5kIG11c3QgYmUgbGFyZ2VyIHRoYW4gCi0gKiAgICAgICAgICAgIG9yIGVxdWFsIHRvIDguIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCi0gKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwRHN0IAotICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIAotICogICAgICAgICAgICAgIGJvdW5kYXJ5OiBwU3JjLCBwRHN0IAotICogICAgLSAgICBzdGVwIDw4IG9yIHN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNDT01NX0NvcHk4eDggKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBPTVhfVTggKnBEc3QsCi0gICAgT01YX0lOVCBzdGVwCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9Db3B5MTZ4MTYgICAoNi4xLjMuMy4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29waWVzIHRoZSByZWZlcmVuY2UgMTZ4MTYgbWFjcm9ibG9jayB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIG1hY3JvYmxvY2sgaW4gdGhlIHNvdXJjZSBmcmFtZTsgbXVzdCBiZSAKLSAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBzdGVwIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnRzIG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIGZyYW1lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2IGFuZCBtdXN0IGJlIGxhcmdlciAKLSAqICAgICAgICAgICAgdGhhbiBvciBlcXVhbCB0byAxNi4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBtYWNyb2Jsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSAKLSAqICAgICAgICAgICAgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAotICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcERzdCAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKLSAqICAgICAgICAgICAgICBib3VuZGFyeTogcFNyYywgcERzdCAKLSAqICAgIC0gICAgc3RlcCA8MTYgb3Igc3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNDT01NX0NvcHkxNngxNiAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIE9NWF9VOCAqcERzdCwKLSAgICBPTVhfSU5UIHN0ZXAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQgICAoNi4xLjQuMS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29tcHV0ZXMgdGV4dHVyZSBlcnJvciBvZiB0aGUgYmxvY2s7IGFsc28gcmV0dXJucyBTQUQuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgcGxhbmU7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgc3JjU3RlcCAtIHN0ZXAgb2YgdGhlIHNvdXJjZSBwbGFuZSAKLSAqICAgcFNyY1JlZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBidWZmZXIsIGFuIDh4OCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLCBhbiA4eDggYmxvY2s7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gdGhlIFN1bSBvZiBBYnNvbHV0ZSBEaWZmZXJlbmNlcyAoU0FEKSB2YWx1ZSAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyAKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYsIHBEc3QgYW5kIHBEc3RTQUQuIAotICogICAgLSAgICBwU3JjIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIFNyY1N0ZXAgPD0gMCBvciBzcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgICBwU3JjUmVmIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHBEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIE9NWF9JTlQgc3JjU3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCi0gICAgT01YX1MxNiAqcERzdCwKLSAgICBPTVhfSU5UICpwRHN0U0FECi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2sgICAoNi4xLjQuMS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29tcHV0ZXMgdGhlIHRleHR1cmUgZXJyb3Igb2YgdGhlIGJsb2NrLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgc291cmNlIHBsYW5lLiBUaGlzIHNob3VsZCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBzcmNTdGVwIC0gc3RlcCBvZiB0aGUgc291cmNlIHBsYW5lIAotICogICBwU3JjUmVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJ1ZmZlciwgYW4gOHg4IGJsb2NrLiBUaGlzIHNob3VsZCBiZSAKLSAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLCBhbiA4eDggYmxvY2suIFRoaXMgc2hvdWxkIGJlIAotICogICAgICAgICAgICBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjLCBwU3JjUmVmLCBwRHN0LiAKLSAqICAgIC0gICAgcFNyYyBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBTcmNTdGVwIDw9IDAgb3Igc3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICAgcFNyY1JlZiBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBwRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgT01YX0lOVCBzcmNTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKLSAgICBPTVhfUzE2ICpwRHN0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9MaW1pdE1WVG9SZWN0ICAgKDYuMS40LjEuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIExpbWl0cyB0aGUgbW90aW9uIHZlY3RvciBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgYmxvY2svbWFjcm9ibG9jayB0byAKLSAqIHByZXZlbnQgdGhlIG1vdGlvbiBjb21wZW5zYXRlZCBibG9jay9tYWNyb2Jsb2NrIGZyb20gbW92aW5nIG91dHNpZGUgYSAKLSAqIGJvdW5kaW5nIHJlY3RhbmdsZSBhcyBzaG93biBpbiBGaWd1cmUgNi0xLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjTVYgLSBwb2ludGVyIHRvIHRoZSBtb3Rpb24gdmVjdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBibG9jayAKLSAqICAgICAgICAgICAgb3IgbWFjcm9ibG9jayAKLSAqICAgcFJlY3RWT1BSZWYgLSBwb2ludGVyIHRvIHRoZSBib3VuZGluZyByZWN0YW5nbGUgCi0gKiAgIFhjb29yZCwgWWNvb3JkICAtIGNvb3JkaW5hdGVzIG9mIHRoZSBjdXJyZW50IGJsb2NrIG9yIG1hY3JvYmxvY2sgCi0gKiAgIHNpemUgLSBzaXplIG9mIHRoZSBjdXJyZW50IGJsb2NrIG9yIG1hY3JvYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gOCBvciAKLSAqICAgICAgICAgICAgMTYuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0TVYgLSBwb2ludGVyIHRvIHRoZSBsaW1pdGVkIG1vdGlvbiB2ZWN0b3IgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCi0gKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjTVYsIHBEc3RNViwgb3IgcFJlY3RWT1BSZWYuIAotICogICAgLSAgICBzaXplIGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgOCBvciAxNi4gCi0gKiAgICAtICAgIHRoZSB3aWR0aCBvciBoZWlnaHQgb2YgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBpcyBsZXNzIHRoYW4gCi0gKiAgICAgICAgIHR3aWNlIHRoZSBibG9jayBzaXplLgotICovCi1PTVhSZXN1bHQgb214VkNDT01NX0xpbWl0TVZUb1JlY3QgKAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVYsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBEc3RNViwKLSAgICBjb25zdCBPTVhSZWN0ICpwUmVjdFZPUFJlZiwKLSAgICBPTVhfSU5UIFhjb29yZCwKLSAgICBPTVhfSU5UIFljb29yZCwKLSAgICBPTVhfSU5UIHNpemUKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX1NBRF8xNnggICAoNi4xLjQuMS40KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgZm9yIDE2eDE2IGFuZCAxNng4IGJsb2Nrcy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY09yZyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAotICogICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBpU3RlcE9yZyAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlciAKLSAqICAgcFNyY1JlZiAgLSBQb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgCi0gKiAgIGlTdGVwUmVmIC0gU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlciAKLSAqICAgaUhlaWdodCAgLSBIZWlnaHQgb2YgdGhlIGJsb2NrIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0U0FEIC0gUG9pbnRlciBvZiByZXN1bHQgU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9yIG1vcmUgb2YgdGhlIAotICogICAgICAgICAgICAgIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyY09yZywgcERzdFNBRCwgb3IgcFNyY1JlZiAKLSAqICAgIC0gICAgcFNyY09yZyBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgaVN0ZXBPcmcgIDw9IDAgb3IgaVN0ZXBPcmcgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYgCi0gKiAgICAtICAgIGlTdGVwUmVmIDw9IDAgb3IgaVN0ZXBSZWYgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYgCi0gKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IDggb3IgMTYgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNDT01NX1NBRF8xNnggKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZywKLSAgICBPTVhfVTMyIGlTdGVwT3JnLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKLSAgICBPTVhfVTMyIGlTdGVwUmVmLAotICAgIE9NWF9TMzIgKnBEc3RTQUQsCi0gICAgT01YX1UzMiBpSGVpZ2h0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9TQURfOHggICAoNi4xLjQuMS41KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgZm9yIDh4MTYsIDh4OCwgOHg0IGJsb2Nrcy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY09yZyAgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgOC1ieXRlIAotICogICAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgaVN0ZXBPcmcgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXIgCi0gKiAgIHBTcmNSZWYgIC0gUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIAotICogICBpU3RlcFJlZiAtIFN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXIgCi0gKiAgIGlIZWlnaHQgIC0gSGVpZ2h0IG9mIHRoZSBibG9jayAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFNBRCAtUG9pbnRlciBvZiByZXN1bHQgU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9yIG1vcmUgb2YgdGhlIAotICogICAgICAgICAgICAgIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyY09yZywgcERzdFNBRCwgb3IgcFNyY1JlZiAKLSAqICAgIC0gICAgcFNyY09yZyBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBpU3RlcE9yZyAgPD0gMCBvciBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiA4IAotICogICAgLSAgICBpU3RlcFJlZiA8PSAwIG9yIGlTdGVwUmVmIGlzIG5vdCBhIG11bHRpcGxlIG9mIDggCi0gKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IDQsIDggb3IgMTYgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNDT01NX1NBRF84eCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAotICAgIE9NWF9VMzIgaVN0ZXBPcmcsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAotICAgIE9NWF9VMzIgaVN0ZXBSZWYsCi0gICAgT01YX1MzMipwRHN0U0FELAotICAgIE9NWF9VMzIgaUhlaWdodAotKTsKLQotCi0KLS8qIDYuMi4xLjEgRGlyZWN0aW9uICAqLwotLyogVGhlIGRpcmVjdGlvbiBlbnVtZXJhdG9yIGlzIHVzZWQgd2l0aCBmdW5jdGlvbnMgdGhhdCBwZXJmb3JtIEFDL0RDIHByZWRpY3Rpb24gYW5kIHppZy16YWcgc2Nhbi4gICovCi0KLWVudW0gewotICAgIE9NWF9WQ19OT05FICAgICAgID0gMCwKLSAgICBPTVhfVkNfSE9SSVpPTlRBTCA9IDEsCi0gICAgT01YX1ZDX1ZFUlRJQ0FMICAgPSAyIAotfTsKLQotCi0KLS8qIDYuMi4xLjIgQmlsaW5lYXIgSW50ZXJwb2xhdGlvbiAgKi8KLS8qIFRoZSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIGVudW1lcmF0b3IgaXMgdXNlZCB3aXRoIG1vdGlvbiBlc3RpbWF0aW9uLCBtb3Rpb24gY29tcGVuc2F0aW9uLCBhbmQgcmVjb25zdHJ1Y3Rpb24gZnVuY3Rpb25zLiAgKi8KLQotZW51bSB7Ci0gICAgT01YX1ZDX0lOVEVHRVJfUElYRUwgPSAwLCAvKiBjYXNlIGEgKi8KLSAgICBPTVhfVkNfSEFMRl9QSVhFTF9YICA9IDEsIC8qIGNhc2UgYiAqLwotICAgIE9NWF9WQ19IQUxGX1BJWEVMX1kgID0gMiwgLyogY2FzZSBjICovCi0gICAgT01YX1ZDX0hBTEZfUElYRUxfWFkgPSAzICAvKiBjYXNlIGQgKi8gCi19OwotCi0KLQotLyogNi4yLjEuMyBOZWlnaGJvcmluZyBNYWNyb2Jsb2NrIEF2YWlsYWJpbGl0eSAgKi8KLS8qIE5laWdoYm9yaW5nIG1hY3JvYmxvY2sgYXZhaWxhYmlsaXR5IGlzIGluZGljYXRlZCB1c2luZyB0aGUgZm9sbG93aW5nIGZsYWdzOiAgICovCi0KLWVudW0gewotICAgIE9NWF9WQ19VUFBFUiA9IDEsICAgICAgICAvKiogYWJvdmUgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KLSAgICBPTVhfVkNfTEVGVCA9IDIsICAgICAgICAgLyoqIGxlZnQgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KLSAgICBPTVhfVkNfQ0VOVEVSID0gNCwKLSAgICBPTVhfVkNfUklHSFQgPSA4LAotICAgIE9NWF9WQ19MT1dFUiA9IDE2LAotICAgIE9NWF9WQ19VUFBFUl9MRUZUID0gMzIsICAvKiogYWJvdmUtbGVmdCBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLwotICAgIE9NWF9WQ19VUFBFUl9SSUdIVCA9IDY0LCAvKiogYWJvdmUtcmlnaHQgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KLSAgICBPTVhfVkNfTE9XRVJfTEVGVCA9IDEyOCwKLSAgICBPTVhfVkNfTE9XRVJfUklHSFQgPSAyNTYgCi19OwotCi0KLQotLyogNi4yLjEuNCBWaWRlbyBDb21wb25lbnRzICAqLwotLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIHZpZGVvIGNvbXBvbmVudHMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBPTVhfVkNfTFVNSU5BTkNFLCAgICAvKiogTHVtaW5hbmNlIGNvbXBvbmVudCAqLwotICAgIE9NWF9WQ19DSFJPTUlOQU5DRSAgIC8qKiBjaHJvbWluYW5jZSBjb21wb25lbnQgKi8gCi19IE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50OwotCi0KLQotLyogNi4yLjEuNSBNYWNyb2Jsb2NrVHlwZXMgICovCi0vKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgbWFjcm9ibG9jayB0eXBlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLwotCi10eXBlZGVmIGVudW0gewotICAgIE9NWF9WQ19JTlRFUiAgICAgPSAwLCAvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCi0gICAgT01YX1ZDX0lOVEVSX1EgICA9IDEsIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KLSAgICBPTVhfVkNfSU5URVI0ViAgID0gMiwgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLwotICAgIE9NWF9WQ19JTlRSQSAgICAgPSAzLCAvKiogSSBhbmQgUCBwaWN0dXJlLCBJLSBhbmQgUC1WT1AgKi8KLSAgICBPTVhfVkNfSU5UUkFfUSAgID0gNCwgLyoqIEkgYW5kIFAgcGljdHVyZSwgSS0gYW5kIFAtVk9QICovCi0gICAgT01YX1ZDX0lOVEVSNFZfUSA9IDUgIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKEguMjYzKSovCi19IE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlOwotCi0KLQotLyogNi4yLjEuNiBDb29yZGluYXRlcyAgKi8KLS8qIENvb3JkaW5hdGVzIGFyZSByZXByZXNlbnRlZCBhcyBmb2xsb3dzOiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE9NWF9JTlQgeDsKLSAgICBPTVhfSU5UIHk7Ci19IE9NWFZDTTRQMkNvb3JkaW5hdGU7Ci0KLQotCi0vKiA2LjIuMS43IE1vdGlvbiBFc3RpbWF0aW9uIEFsZ29yaXRobXMgICovCi0vKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgbW90aW9uIGVzdGltYXRpb24gc2VhcmNoIG1ldGhvZHMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBPTVhfVkNfTTRQMl9GQVNUX1NFQVJDSCA9IDAsICAvKiogRmFzdCBtb3Rpb24gc2VhcmNoICovCi0gICAgT01YX1ZDX000UDJfRlVMTF9TRUFSQ0ggPSAxICAgLyoqIEZ1bGwgbW90aW9uIHNlYXJjaCAqLyAKLX0gT01YVkNNNFAyTUVNb2RlOwotCi0KLQotLyogNi4yLjEuOCBNb3Rpb24gRXN0aW1hdGlvbiBQYXJhbWV0ZXJzICAqLwotLyogQSBkYXRhIHN0cnVjdHVyZSBjb250YWluaW5nIGNvbnRyb2wgcGFyYW1ldGVycyBmb3IgCi0gKiBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE9NWF9JTlQgc2VhcmNoRW5hYmxlOHg4OyAgICAgLyoqIGVuYWJsZXMgOHg4IHNlYXJjaCAqLwotICAgIE9NWF9JTlQgaGFsZlBlbFNlYXJjaEVuYWJsZTsgLyoqIGVuYWJsZXMgaGFsZi1wZWwgcmVzb2x1dGlvbiAqLwotICAgIE9NWF9JTlQgc2VhcmNoUmFuZ2U7ICAgICAgICAgLyoqIHNlYXJjaCByYW5nZSAqLwotICAgIE9NWF9JTlQgcm5kVmFsOyAgICAgICAgICAgICAgLyoqIHJvdW5kaW5nIGNvbnRyb2w7IDAtZGlzYWJsZWQsIDEtZW5hYmxlZCovCi19IE9NWFZDTTRQMk1FUGFyYW1zOwotCi0KLQotLyogNi4yLjEuOSBNYWNyb2Jsb2NrIEluZm9ybWF0aW9uICAgKi8KLS8qIEEgZGF0YSBzdHJ1Y3R1cmUgY29udGFpbmluZyBtYWNyb2Jsb2NrIHBhcmFtZXRlcnMgZm9yIAotICogbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zIGlzIGRlZmluZWQgYXMgZm9sbG93czogIAotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBPTVhfUzMyIHNsaWNlSWQ7ICAgICAgICAgICAgICAgICAvKiBzbGljZSBudW1iZXIgKi8KLSAgICBPTVhWQ000UDJNYWNyb2Jsb2NrVHlwZSBtYlR5cGU7ICAvKiBNQiB0eXBlOiBPTVhfVkNfSU5UUkEsIE9NWF9WQ19JTlRFUiwgb3IgT01YX1ZDX0lOVEVSNCAqLwotICAgIE9NWF9TMzIgcXA7ICAgICAgICAgICAgICAgICAgICAgIC8qIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIqLwotICAgIE9NWF9VMzIgY2JweTsgICAgICAgICAgICAgICAgICAgIC8qIENCUCBMdW1hICovCi0gICAgT01YX1UzMiBjYnBjOyAgICAgICAgICAgICAgICAgICAgLyogQ0JQIENocm9tYSAqLwotICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVjBbMl1bMl07ICAgIC8qIG1vdGlvbiB2ZWN0b3IsIHJlcHJlc2VudGVkIHVzaW5nIDEvMi1wZWwgdW5pdHMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBNVjBbYmxvY2t5XVtibG9ja3hdIChibG9ja3kgPSAwfjEsIGJsb2NreCA9MH4xKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBPTVhWQ01vdGlvblZlY3RvciBwTVZQcmVkWzJdWzJdOyAvKiBtb3Rpb24gdmVjdG9yIHByZWRpY3Rpb24sIHJlcHJlc2VudGVkIHVzaW5nIDEvMi1wZWwgdW5pdHMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBNVlByZWRbYmxvY2t5XVtibG9ja3hdIChibG9ja3kgPSAwfjEsIGJsb2NreCA9IDB+MSkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgT01YX1U4IHBQcmVkRGlyWzJdWzJdOyAgICAgICAgICAgLyogQUMgcHJlZGljdGlvbiBkaXJlY3Rpb246IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgT01YX1ZDX05PTkUsIE9NWF9WQ19WRVJUSUNBTCwgT01YX1ZDX0hPUklaT05UQUwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi19IE9NWFZDTTRQMk1CSW5mbywgKk9NWFZDTTRQMk1CSW5mb1B0cjsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRmluZE1WcHJlZCAgICg2LjIuMy4xLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQcmVkaWN0cyBhIG1vdGlvbiB2ZWN0b3IgZm9yIHRoZSBjdXJyZW50IGJsb2NrIHVzaW5nIHRoZSBwcm9jZWR1cmUgCi0gKiBzcGVjaWZpZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjUuICBUaGUgcmVzdWx0aW5nIHByZWRpY3RlZCBNViBpcyAKLSAqIHJldHVybmVkIGluIHBEc3RNVlByZWQuIElmIHRoZSBwYXJhbWV0ZXIgcERzdE1WUHJlZE1FIGlmIGlzIG5vdCBOVUxMIHRoZW4gCi0gKiB0aGUgc2V0IG9mIHRocmVlIE1WIGNhbmRpZGF0ZXMgdXNlZCBmb3IgcHJlZGljdGlvbiBpcyBhbHNvIHJldHVybmVkLCAKLSAqIG90aGVyd2lzZSBwRHN0TVZQcmVkTUVpcyBOVUxMIHVwb24gcmV0dXJuLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjTVZDdXJNQiAtIHBvaW50ZXIgdG8gdGhlIE1WIGJ1ZmZlciBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgWSAKLSAqICAgICAgICAgICAgbWFjcm9ibG9jazsgYSB2YWx1ZSBvZiBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCi0gKiAgIHBTcmNDYW5kTVYxIC0gcG9pbnRlciB0byB0aGUgTVYgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIDQgTVZzIGFzc29jaWF0ZWQgCi0gKiAgICAgICAgICAgIHdpdGggdGhlIE1CIGxvY2F0ZWQgdG8gdGhlIGxlZnQgb2YgdGhlIGN1cnJlbnQgTUI7IHNldCB0byBOVUxMIAotICogICAgICAgICAgICBpZiB0aGVyZSBpcyBubyBNQiB0byB0aGUgbGVmdC4gCi0gKiAgIHBTcmNDYW5kTVYyIC0gcG9pbnRlciB0byB0aGUgTVYgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIDQgTVZzIGFzc29jaWF0ZWQgCi0gKiAgICAgICAgICAgIHdpdGggdGhlIE1CIGxvY2F0ZWQgYWJvdmUgdGhlIGN1cnJlbnQgTUI7IHNldCB0byBOVUxMIGlmIHRoZXJlIAotICogICAgICAgICAgICBpcyBubyBNQiBsb2NhdGVkIGFib3ZlIHRoZSBjdXJyZW50IE1CLiAKLSAqICAgcFNyY0NhbmRNVjMgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgY29udGFpbmluZyB0aGUgNCBNVnMgYXNzb2NpYXRlZCAKLSAqICAgICAgICAgICAgd2l0aCB0aGUgTUIgbG9jYXRlZCB0byB0aGUgcmlnaHQgYW5kIGFib3ZlIHRoZSBjdXJyZW50IE1COyBzZXQgCi0gKiAgICAgICAgICAgIHRvIE5VTEwgaWYgdGhlcmUgaXMgbm8gTUIgbG9jYXRlZCB0byB0aGUgYWJvdmUtcmlnaHQuIAotICogICBpQmxrIC0gdGhlIGluZGV4IG9mIGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCi0gKiAgIHBEc3RNVlByZWRNRSAtIE1WIGNhbmRpZGF0ZSByZXR1cm4gYnVmZmVyOyAgaWYgc2V0IHRvIE5VTEwgdGhlbiAKLSAqICAgICAgICAgICAgcHJlZGljdGlvbiBjYW5kaWRhdGUgTVZzIGFyZSBub3QgcmV0dXJuZWQgYW5kIHBEc3RNVlByZWRNRSB3aWxsIAotICogICAgICAgICAgICBiZSBOVUxMIHVwb24gZnVuY3Rpb24gcmV0dXJuOyBpZiBwRHN0TVZQcmVkTUUgaXMgbm9uLU5VTEwgdGhlbiBpdCAKLSAqICAgICAgICAgICAgbXVzdCBwb2ludCB0byBhIGJ1ZmZlciBjb250YWluaW5nIHN1ZmZpY2llbnQgc3BhY2UgZm9yIHRocmVlIAotICogICAgICAgICAgICByZXR1cm4gTVZzLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdE1WUHJlZCAtIHBvaW50ZXIgdG8gdGhlIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yIAotICogICBwRHN0TVZQcmVkTUUgLSBpZiBub24tTlVMTCB1cG9uIGlucHV0IHRoZW4gcERzdE1WUHJlZE1FICBwb2ludHMgdXBvbiAKLSAqICAgICAgICAgICAgcmV0dXJuIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIHRocmVlIG1vdGlvbiB2ZWN0b3IgY2FuZGlkYXRlcyAKLSAqICAgICAgICAgICAgdXNlZCBmb3IgcHJlZGljdGlvbiBhcyBzcGVjaWZpZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgCi0gKiAgICAgICAgICAgIDcuNi41LCBvdGhlcndpc2UgaWYgTlVMTCB1cG9uIGlucHV0IHRoZW4gcERzdE1WUHJlZE1FIGlzIE5VTEwgCi0gKiAgICAgICAgICAgIHVwb24gb3V0cHV0LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCi0gKiAgICAtICAgIHRoZSBwb2ludGVyIHBEc3RNVlByZWQgaXMgTlVMTCAKLSAqICAgIC0gICAgdGhlIHBhcmFtZXRlciBpQmxrIGRvZXMgbm90IGZhbGwgaW50byB0aGUgcmFuZ2UgMCA8PSBpQmxrPD0zIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9GaW5kTVZwcmVkICgKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WQ3VyTUIsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNDYW5kTVYxLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjQ2FuZE1WMiwKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0NhbmRNVjMsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBEc3RNVlByZWQsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBEc3RNVlByZWRNRSwKLSAgICBPTVhfSU5UIGlCbGsKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0lEQ1Q4eDhibGsgICAoNi4yLjMuMi4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29tcHV0ZXMgYSAyRCBpbnZlcnNlIERDVCBmb3IgYSBzaW5nbGUgOHg4IGJsb2NrLCBhcyBkZWZpbmVkIGluIAotICogW0lTTzE0NDk2LTJdLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmVhcmx5IGFycmFuZ2VkIElEQ1QgaW5wdXQgYnVmZmVyOyAKLSAqICAgICAgICAgICAgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIEFjY29yZGluZyB0byAKLSAqICAgICAgICAgICAgW0lTTzE0NDk2LTJdLCB0aGUgaW5wdXQgY29lZmZpY2llbnQgdmFsdWVzIHNob3VsZCBsaWUgd2l0aGluIHRoZSAKLSAqICAgICAgICAgICAgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgSURDVCBvdXRwdXQgYnVmZmVyOyAKLSAqICAgICAgICAgICAgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKLSAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9JRENUOHg4YmxrICgKLSAgICBjb25zdCBPTVhfUzE2ICpwU3JjLAotICAgIE9NWF9TMTYgKnBEc3QKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01FR2V0QnVmU2l6ZSAgICg2LjIuNC4xLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb21wdXRlcyB0aGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3BlY2lmaWNhdGlvbiAKLSAqIHN0cnVjdHVyZSBmb3IgdGhlIGZvbGxvd2luZyBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnM6IAotICogQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCwgQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LCBhbmQgTW90aW9uRXN0aW1hdGlvbk1CLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBNRW1vZGUgLSBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlOyBhdmFpbGFibGUgbW9kZXMgYXJlIGRlZmluZWQgYnkgdGhlIAotICogICAgICAgICAgICBlbnVtZXJhdGVkIHR5cGUgT01YVkNNNFAyTUVNb2RlIAotICogICBwTUVQYXJhbXMgLSBtb3Rpb24gZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU2l6ZSAtIHBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIHNwZWNpZmljYXRpb24gCi0gKiAgICAgICAgICAgIHN0cnVjdHVyZSAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYW4gaW52YWxpZCB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgcGFyYW1ldGVyIE1FbW9kZSAKLSAqICAgIC0gICAgYSBuZWdhdGl2ZSBvciB6ZXJvIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSAKLSAqICAgICAgICAgcGFyYW1ldGVyIHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX01FR2V0QnVmU2l6ZSAoCi0gICAgT01YVkNNNFAyTUVNb2RlIE1FbW9kZSwKLSAgICBjb25zdCBPTVhWQ000UDJNRVBhcmFtcyAqcE1FUGFyYW1zLAotICAgIE9NWF9VMzIgKnBTaXplCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9NRUluaXQgICAoNi4yLjQuMS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogSW5pdGlhbGl6ZXMgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSByZXF1aXJlZCBmb3IgdGhlIAotICogZm9sbG93aW5nIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9uczogIEJsb2NrTWF0Y2hfSW50ZWdlcl84eDgsIAotICogQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LCBhbmQgTW90aW9uRXN0aW1hdGlvbk1CLiBNZW1vcnkgZm9yIHRoZSAKLSAqIHNwZWNpZmljYXRpb24gc3RydWN0dXJlICpwTUVTcGVjIG11c3QgYmUgYWxsb2NhdGVkIHByaW9yIHRvIGNhbGxpbmcgdGhlIAotICogZnVuY3Rpb24sIGFuZCBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIEZvbGxvd2luZyAKLSAqIGluaXRpYWxpemF0aW9uIGJ5IHRoaXMgZnVuY3Rpb24sIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3RydWN0dXJlICpwTUVTcGVjIAotICogc2hvdWxkIGNvbnRhaW4gYW4gaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgcmVwcmVzZW50YXRpb24gb2YgYWxsIG1vdGlvbiAKLSAqIGVzdGltYXRpb24gcGFyYW1ldGVycyByZWNlaXZlZCB2aWEgdGhlIHN0cnVjdHVyZSBwTUVQYXJhbXMsIGZvciBleGFtcGxlICAKLSAqIHJuZFZhbCwgc2VhcmNoUmFuZ2UsIGV0Yy4gIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSAKLSAqIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIGNhbiBiZSBkZXRlcm1pbmVkIHVzaW5nIHRoZSBmdW5jdGlvbiAKLSAqIG9teFZDTTRQMl9NRUdldEJ1ZlNpemUuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCi0gKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDJNRU1vZGUgCi0gKiAgIHBNRVBhcmFtcyAtIG1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCi0gKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSB1bmluaXRpYWxpemVkIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGFuIGludmFsaWQgdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBNRW1vZGUgCi0gKiAgICAtICAgIGEgbmVnYXRpdmUgb3IgemVybyB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgCi0gKiAgICAgICAgIHBhcmFtZXRlciBwTUVQYXJhbXMtPnNlYXJjaFJhbmdlIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9NRUluaXQgKAotICAgIE9NWFZDTTRQMk1FTW9kZSBNRW1vZGUsCi0gICAgY29uc3QgT01YVkNNNFAyTUVQYXJhbXMqcE1FUGFyYW1zLAotICAgIHZvaWQgKnBNRVNwZWMKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiAgICg2LjIuNC4yLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhIDE2eDE2IGJsb2NrIHNlYXJjaDsgZXN0aW1hdGVzIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgCi0gKiBtaW5pbXVtIFNBRC4gQm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgdXNpbmcgCi0gKiBoYWxmLXBpeGVsIHVuaXRzLCBhbmQgdGhlcmVmb3JlIGEgc2hpZnQgbGVmdCBvciByaWdodCBieSAxIGJpdCBtYXkgYmUgCi0gKiByZXF1aXJlZCwgcmVzcGVjdGl2ZWx5LCB0byBtYXRjaCB0aGUgaW5wdXQgb3Igb3V0cHV0IE1WcyB3aXRoIG90aGVyIAotICogZnVuY3Rpb25zIHRoYXQgZWl0aGVyIGdlbmVyYXRlIG91dHB1dCBNVnMgb3IgZXhwZWN0IGlucHV0IE1WcyByZXByZXNlbnRlZCAKLSAqIHVzaW5nIGludGVnZXIgcGl4ZWwgdW5pdHMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIE1CIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gCi0gKiAgICAgICAgICAgIHRoZSBjdXJyZW50IHBsYW5lLiAKLSAqICAgcmVmV2lkdGggLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lIAotICogICBwUmVmUmVjdCAtIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSBwbGFuZSByZWN0YW5nbGU7IGNvb3JkaW5hdGVzIAotICogICAgICAgICAgICBhcmUgc3BlY2lmaWVkIHJlbGF0aXZlIHRvIHRoZSBpbWFnZSBvcmlnaW4uICBSZWN0YW5nbGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJpZXMgbWF5IGV4dGVuZCBiZXlvbmQgaW1hZ2UgYm91bmRhcmllcyBpZiB0aGUgaW1hZ2UgaGFzIAotICogICAgICAgICAgICBiZWVuIHBhZGRlZC4gIEZvciBleGFtcGxlLCBpZiBwYWRkaW5nIGV4dGVuZHMgNCBwaXhlbHMgYmV5b25kIAotICogICAgICAgICAgICBmcmFtZSBib3JkZXIsIHRoZW4gdGhlIHZhbHVlIGZvciB0aGUgbGVmdCBib3JkZXIgY291bGQgYmUgc2V0IHRvIAotICogICAgICAgICAgICAtNC4gCi0gKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAotICogICAgICAgICAgICBidWZmZXIgZXh0cmFjdGVkIGZyb20gdGhlIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIDI1NiAKLSAqICAgICAgICAgICAgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIAotICogICAgICAgICAgICBieXRlcyBiZXR3ZWVuIGxpbmVzIChzdGVwKSBpcyAxNi4gCi0gKiAgIHBDdXJyUG9pbnRQb3MgLSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lIAotICogICBwU3JjUHJlTVYgLSBwb2ludGVyIHRvIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yOyBOVUxMIGluZGljYXRlcyBubyAKLSAqICAgICAgICAgICAgcHJlZGljdGVkIE1WIAotICogICBwU3JjUHJlU0FEIC0gcG9pbnRlciB0byBTQUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVkaWN0ZWQgTVYgKHJlZmVyZW5jZWQgCi0gKiAgICAgICAgICAgIGJ5IHBTcmNQcmVNVik7IG1heSBiZSBzZXQgdG8gTlVMTCBpZiB1bmF2YWlsYWJsZS4gCi0gKiAgIHBNRVNwZWMgLSB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IAotICogICAgICAgICAgICBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgYW5kIHRoZW4gaW5pdGlhbGl6ZWQgdXNpbmcgCi0gKiAgICAgICAgICAgIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgYmxvY2sgbWF0Y2hpbmcgZnVuY3Rpb24uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0TVYgLSBwb2ludGVyIHRvIGVzdGltYXRlZCBNViAKLSAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gbWluaW11bSBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjUmVmQnVmLCAKLSAqICAgICAgICAgICAgICBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwQ3VyclBvaW50UG9zLCBwRHN0TVYsIHBEc3RTQUQgb3IgCi0gKiAgICAgICAgICAgICAgcE1FU3BlYywgb3IgCi0gKiAgICAtICAgIHBTcmNDdXJyQnVmIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAotICAgIE9NWF9JTlQgcmVmV2lkdGgsCi0gICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKLSAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yKnBTcmNQcmVNViwKLSAgICBjb25zdCBPTVhfSU5UICpwU3JjUHJlU0FELAotICAgIHZvaWQgKnBNRVNwZWMsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IqcERzdE1WLAotICAgIE9NWF9JTlQgKnBEc3RTQUQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDggICAoNi4yLjQuMi4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYW4gOHg4IGJsb2NrIHNlYXJjaDsgZXN0aW1hdGVzIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgCi0gKiBtaW5pbXVtIFNBRC4gIEJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQgbW90aW9uIHZlY3RvcnMgYXJlIHJlcHJlc2VudGVkIAotICogdXNpbmcgaGFsZi1waXhlbCB1bml0cywgYW5kIHRoZXJlZm9yZSBhIHNoaWZ0IGxlZnQgb3IgcmlnaHQgYnkgMSBiaXQgbWF5IGJlIAotICogcmVxdWlyZWQsIHJlc3BlY3RpdmVseSwgdG8gbWF0Y2ggdGhlIGlucHV0IG9yIG91dHB1dCBNVnMgd2l0aCBvdGhlciAKLSAqIGZ1bmN0aW9ucyB0aGF0IGVpdGhlciBnZW5lcmF0ZSBvdXRwdXQgTVZzIG9yIGV4cGVjdCBpbnB1dCBNVnMgcmVwcmVzZW50ZWQgCi0gKiB1c2luZyBpbnRlZ2VyIHBpeGVsIHVuaXRzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAotICogICAgICAgICAgICBibG9jayB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCA4eDggYmxvY2sgCi0gKiAgICAgICAgICAgIGluIHRoZSBjdXJyZW50IHBsYW5lLiAKLSAqICAgcmVmV2lkdGggLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lIAotICogICBwUmVmUmVjdCAtIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSBwbGFuZSByZWN0YW5nbGU7IGNvb3JkaW5hdGVzIAotICogICAgICAgICAgICBhcmUgc3BlY2lmaWVkIHJlbGF0aXZlIHRvIHRoZSBpbWFnZSBvcmlnaW4uICBSZWN0YW5nbGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJpZXMgbWF5IGV4dGVuZCBiZXlvbmQgaW1hZ2UgYm91bmRhcmllcyBpZiB0aGUgaW1hZ2UgaGFzIAotICogICAgICAgICAgICBiZWVuIHBhZGRlZC4gCi0gKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAotICogICAgICAgICAgICBidWZmZXIgZXh0cmFjdGVkIGZyb20gdGhlIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIDEyOCAKLSAqICAgICAgICAgICAgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIAotICogICAgICAgICAgICBieXRlcyBiZXR3ZWVuIGxpbmVzIChzdGVwKSBpcyAxNiBieXRlcy4gCi0gKiAgIHBDdXJyUG9pbnRQb3MgLSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZSAKLSAqICAgcFNyY1ByZU1WIC0gcG9pbnRlciB0byBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcjsgTlVMTCBpbmRpY2F0ZXMgbm8gCi0gKiAgICAgICAgICAgIHByZWRpY3RlZCBNViAKLSAqICAgcFNyY1ByZVNBRCAtIHBvaW50ZXIgdG8gU0FEIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJlZGljdGVkIE1WIChyZWZlcmVuY2VkIAotICogICAgICAgICAgICBieSBwU3JjUHJlTVYpOyBtYXkgYmUgc2V0IHRvIE5VTEwgaWYgdW5hdmFpbGFibGUuIAotICogICBwTUVTcGVjIC0gdmVuZG9yLXNwZWNpZmljIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlOyAKLSAqICAgICAgICAgICAgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIAotICogICAgICAgICAgICBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhlIGJsb2NrIG1hdGNoaW5nIGZ1bmN0aW9uLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdE1WIC0gcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYgCi0gKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIG1pbmltdW0gU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY1JlZkJ1ZiwgCi0gKiAgICAgICAgICAgICAgcFJlZlJlY3QsIHBTcmNDdXJyQnVmZiwgcEN1cnJQb2ludFBvcywgcERzdE1WLCBwRHN0U0FEIG9yIAotICogICAgICAgICAgICAgIHBNRVNwZWMsIG9yIAotICogICAgLSAgICBwU3JjQ3VyckJ1ZiBpcyBub3QgOC1ieXRlIGFsaWduZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDggKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKLSAgICBPTVhfSU5UIHJlZldpZHRoLAotICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCi0gICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY1ByZU1WLAotICAgIGNvbnN0IE9NWF9JTlQgKnBTcmNQcmVTQUQsCi0gICAgdm9pZCAqcE1FU3BlYywKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WLAotICAgIE9NWF9JTlQgKnBEc3RTQUQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNiAgICg2LjIuNC4yLjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhIDE2eDE2IGJsb2NrIG1hdGNoIHdpdGggaGFsZi1waXhlbCByZXNvbHV0aW9uLiAgUmV0dXJucyB0aGUgCi0gKiBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIFRoaXMgZnVuY3Rpb24gCi0gKiBlc3RpbWF0ZXMgdGhlIGhhbGYtcGl4ZWwgbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIAotICogcmVzb2x1dGlvbiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0TVYsIGkuZS4sIAotICogdGhlIGluaXRpYWwgaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgZXh0ZXJuYWxseS4gIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIAotICogcFNyY1JlZkJ1ZiBhbmQgcFNlYXJjaFBvaW50UmVmUG9zIHNob3VsZCBiZSBzaGlmdGVkIGJ5IHRoZSB3aW5uaW5nIE1WIG9mIAotICogMTZ4MTYgaW50ZWdlciBzZWFyY2ggcHJpb3IgdG8gY2FsbGluZyBCbG9ja01hdGNoX0hhbGZfMTZ4MTYuIFRoZSBmdW5jdGlvbiAKLSAqIEJsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiBtYXkgYmUgdXNlZCBmb3IgaW50ZWdlciBtb3Rpb24gZXN0aW1hdGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgbWFjcm9ibG9jayB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZS4gCi0gKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKLSAqICAgcFJlZlJlY3QgLSByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZSAKLSAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCi0gKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMjU2IAotICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCi0gKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2LiAKLSAqICAgcFNlYXJjaFBvaW50UmVmUG9zIC0gcG9zaXRpb24gb2YgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciBoYWxmIHBpeGVsIAotICogICAgICAgICAgICBzZWFyY2ggKHNwZWNpZmllZCBpbiB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVsIHVuaXRzKSBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJlZmVyZW5jZSBwbGFuZSwgaS5lLiwgdGhlIHJlZmVyZW5jZSBwb3NpdGlvbiBwb2ludGVkIHRvIGJ5IHRoZSAKLSAqICAgICAgICAgICAgcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3IuIAotICogICBybmRWYWwgLSByb3VuZGluZyBjb250cm9sIHBhcmFtZXRlcjogMCAtIGRpc2FibGVkOyAxIC0gZW5hYmxlZC4gCi0gKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gdGhlIGluaXRpYWwgTVYgZXN0aW1hdGU7IHR5cGljYWxseSBnZW5lcmF0ZWQgCi0gKiAgICAgICAgICAgIGR1cmluZyBhIHByaW9yIDE2WDE2IGludGVnZXIgc2VhcmNoOyBzcGVjaWZpZWQgaW4gdGVybXMgb2YgCi0gKiAgICAgICAgICAgIGhhbGYtcGl4ZWwgdW5pdHMuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0TVYgLSBwb2ludGVyIHRvIGVzdGltYXRlZCBNViAKLSAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gbWluaW11bSBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjUmVmQnVmLCAKLSAqICAgICAgICAgcFJlZlJlY3QsIHBTcmNDdXJyQnVmZiwgcFNlYXJjaFBvaW50UmVmUG9zLCBwU3JjRHN0TVYuCi0gKiAgICAtICAgIHBTcmNDdXJyQnVmIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQsIG9yIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKLSAgICBPTVhfSU5UIHJlZldpZHRoLAotICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCi0gICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcFNlYXJjaFBvaW50UmVmUG9zLAotICAgIE9NWF9JTlQgcm5kVmFsLAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0TVYsCi0gICAgT01YX0lOVCAqcERzdFNBRAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OCAgICg2LjIuNC4yLjQpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhbiA4eDggYmxvY2sgbWF0Y2ggd2l0aCBoYWxmLXBpeGVsIHJlc29sdXRpb24uIFJldHVybnMgdGhlIAotICogZXN0aW1hdGVkIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgbWluaW11bSBTQUQuICBUaGlzIGZ1bmN0aW9uIAotICogZXN0aW1hdGVzIHRoZSBoYWxmLXBpeGVsIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaW50ZWdlciAKLSAqIHJlc29sdXRpb24gbW90aW9uIHZlY3RvciByZWZlcmVuY2VkIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdE1WLCBpLmUuLCAKLSAqIHRoZSBpbml0aWFsIGludGVnZXIgTVYgaXMgZ2VuZXJhdGVkIGV4dGVybmFsbHkuICBUaGUgaW5wdXQgcGFyYW1ldGVycyAKLSAqIHBTcmNSZWZCdWYgYW5kIHBTZWFyY2hQb2ludFJlZlBvcyBzaG91bGQgYmUgc2hpZnRlZCBieSB0aGUgd2lubmluZyBNViBvZiAKLSAqIDh4OCBpbnRlZ2VyIHNlYXJjaCBwcmlvciB0byBjYWxsaW5nIEJsb2NrTWF0Y2hfSGFsZl84eDguIFRoZSBmdW5jdGlvbiAKLSAqIEJsb2NrTWF0Y2hfSW50ZWdlcl84eDggbWF5IGJlIHVzZWQgZm9yIGludGVnZXIgbW90aW9uIGVzdGltYXRpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIGJsb2NrIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IDh4OCBibG9jayAKLSAqICAgICAgICAgICAgaW4gdGhlIGN1cnJlbnQgcGxhbmUuIAotICogICByZWZXaWR0aCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUgCi0gKiAgIHBSZWZSZWN0IC0gcmVmZXJlbmNlIHBsYW5lIHZhbGlkIHJlZ2lvbiByZWN0YW5nbGUgCi0gKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAotICogICAgICAgICAgICBidWZmZXIgZXh0cmFjdGVkIGZyb20gdGhlIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIDEyOCAKLSAqICAgICAgICAgICAgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCi0gKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2LiAKLSAqICAgcFNlYXJjaFBvaW50UmVmUG9zIC0gcG9zaXRpb24gb2YgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciBoYWxmIHBpeGVsIAotICogICAgICAgICAgICBzZWFyY2ggKHNwZWNpZmllZCBpbiB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVsIHVuaXRzKSBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJlZmVyZW5jZSBwbGFuZS4gCi0gKiAgIHJuZFZhbCAtIHJvdW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVyOiAwIC0gZGlzYWJsZWQ7IDEgLSBlbmFibGVkLiAKLSAqICAgcFNyY0RzdE1WIC0gcG9pbnRlciB0byB0aGUgaW5pdGlhbCBNViBlc3RpbWF0ZTsgdHlwaWNhbGx5IGdlbmVyYXRlZCAKLSAqICAgICAgICAgICAgZHVyaW5nIGEgcHJpb3IgOHg4IGludGVnZXIgc2VhcmNoLCBzcGVjaWZpZWQgaW4gdGVybXMgb2YgCi0gKiAgICAgICAgICAgIGhhbGYtcGl4ZWwgdW5pdHMuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0TVYgLSBwb2ludGVyIHRvIGVzdGltYXRlZCBNViAKLSAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gbWluaW11bSBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyY1JlZkJ1ZiwgcFJlZlJlY3QsIHBTcmNDdXJyQnVmZiwgcFNlYXJjaFBvaW50UmVmUG9zLCBwU3JjRHN0TVYKLSAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDgtYnl0ZSBhbGlnbmVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCi0gICAgT01YX0lOVCByZWZXaWR0aCwKLSAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAotICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBTZWFyY2hQb2ludFJlZlBvcywKLSAgICBPTVhfSU5UIHJuZFZhbCwKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdE1WLAotICAgIE9NWF9JTlQgKnBEc3RTQUQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01vdGlvbkVzdGltYXRpb25NQiAgICg2LjIuNC4zLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBtb3Rpb24gc2VhcmNoIGZvciBhIDE2eDE2IG1hY3JvYmxvY2suICBTZWxlY3RzIGJlc3QgbW90aW9uIHNlYXJjaCAKLSAqIHN0cmF0ZWd5IGZyb20gYW1vbmcgaW50ZXItMU1WLCBpbnRlci00TVYsIGFuZCBpbnRyYSBtb2Rlcy4gIFN1cHBvcnRzIAotICogaW50ZWdlciBhbmQgaGFsZiBwaXhlbCByZXNvbHV0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY3VycmVudCBNQiBpbiB0aGUgCi0gKiAgICAgICAgICAgIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmU7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICAKLSAqICAgICAgICAgICAgVGhlIGZ1bmN0aW9uIGRvZXMgbm90IGV4cGVjdCBzb3VyY2UgZGF0YSBvdXRzaWRlIHRoZSByZWdpb24gCi0gKiAgICAgICAgICAgIGJvdW5kZWQgYnkgdGhlIE1CIHRvIGJlIGF2YWlsYWJsZTsgZm9yIGV4YW1wbGUgaXQgaXMgbm90IAotICogICAgICAgICAgICBuZWNlc3NhcnkgZm9yIHRoZSBjYWxsZXIgdG8gZ3VhcmFudGVlIHRoZSBhdmFpbGFiaWxpdHkgb2YgCi0gKiAgICAgICAgICAgIHBTcmNDdXJyQnVmWy1TcmNDdXJyU3RlcF0sIGkuZS4sIHRoZSByb3cgb2YgcGl4ZWxzIGFib3ZlIHRoZSBNQiAKLSAqICAgICAgICAgICAgdG8gYmUgcHJvY2Vzc2VkLiAKLSAqICAgc3JjQ3VyclN0ZXAgLSB3aWR0aCBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSwgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAotICogICAgICAgICAgICBwbGFuZSBsb2NhdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBzcmNSZWZTdGVwIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lLCBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIHBSZWZSZWN0IC0gcmVmZXJlbmNlIHBsYW5lIHZhbGlkIHJlZ2lvbiByZWN0YW5nbGUsIHNwZWNpZmllZCByZWxhdGl2ZSB0byAKLSAqICAgICAgICAgICAgdGhlIGltYWdlIG9yaWdpbiAKLSAqICAgcEN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCi0gKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiAKLSAqICAgICAgICAgICAgc3RydWN0dXJlOyBtdXN0IGJlIGFsbG9jYXRlZCBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyAKLSAqICAgICAgICAgICAgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uIAotICogICBwTUJJbmZvIC0gYXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggZm91ciBuZWFyYnkgTUJzOiAKLSAqICAgICAgICAgICAgLSAgIHBNQkluZm9bMF0gLSBwb2ludGVyIHRvIGxlZnQgTUIgaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIC0gICBwTUJJbmZvWzFdIC0gcG9pbnRlciB0byB0b3AgTUIgaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIC0gICBwTUJJbmZvWzJdIC0gcG9pbnRlciB0byB0b3AtbGVmdCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgLSAgIHBNQkluZm9bM10gLSBwb2ludGVyIHRvIHRvcC1yaWdodCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgQW55IHBvaW50ZXIgaW4gdGhlIGFycmF5IG1heSBiZSBzZXQgZXF1YWwgdG8gTlVMTCBpZiB0aGUgCi0gKiAgICAgICAgICAgIGNvcnJlc3BvbmRpbmcgTUIgZG9lc24ndCBleGlzdC4gIEZvciBlYWNoIE1CLCB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZSAKLSAqICAgICAgICAgICAgbWVtYmVycyBhcmUgdXNlZDogICAgCi0gKiAgICAgICAgICAgIC0gICBtYlR5cGUgLSBtYWNyb2Jsb2NrIHR5cGUsIGVpdGhlciBPTVhfVkNfSU5UUkEsIE9NWF9WQ19JTlRFUiwgb3IgCi0gKiAgICAgICAgICAgICAgICBPTVhfVkNfSU5URVI0ViAKLSAqICAgICAgICAgICAgLSAgIHBNVjBbMl1bMl0gLSBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvcnM7IHJlcHJlc2VudGVkIAotICogICAgICAgICAgICAgICAgaW4gMS8yIHBpeGVsIHVuaXRzIAotICogICAgICAgICAgICAtICAgc2xpY2VJRCAtIG51bWJlciBvZiB0aGUgc2xpY2UgdG8gd2hpY2ggdGhlIE1CIGJlbG9uZ3MgCi0gKiAgIHBTcmNEc3RNQkN1cnIgLSBwb2ludGVyIHRvIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgTUIuICAKLSAqICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBlbnRyaWVzIHNob3VsZCBiZSBzZXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgCi0gKiAgICAgICAgICAgIGZ1bmN0aW9uOiBzbGljZUlEIC0gdGhlIG51bWJlciBvZiB0aGUgc2xpY2UgdGhlIHRvIHdoaWNoIHRoZSAKLSAqICAgICAgICAgICAgY3VycmVudCBNQiBiZWxvbmdzLiAgVGhlIHN0cnVjdHVyZSBlbGVtZW50cyBjYnB5IGFuZCBjYnBjIGFyZSAKLSAqICAgICAgICAgICAgaWdub3JlZC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3RNQkN1cnIgLSBwb2ludGVyIHRvIHVwZGF0ZWQgaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgTUIgYWZ0ZXIgTUItbGV2ZWwgbW90aW9uIGVzdGltYXRpb24gaGFzIGJlZW4gY29tcGxldGVkLiAgVGhlIAotICogICAgICAgICAgICBmb2xsb3dpbmcgc3RydWN0dXJlIG1lbWJlcnMgYXJlIHVwZGF0ZWQgYnkgdGhlIE1FIGZ1bmN0aW9uOiAgIAotICogICAgICAgICAgICAgIC0gIG1iVHlwZSAtIG1hY3JvYmxvY2sgdHlwZTogT01YX1ZDX0lOVFJBLCBPTVhfVkNfSU5URVIsIG9yIAotICogICAgICAgICAgICAgICAgIE9NWF9WQ19JTlRFUjRWLiAKLSAqICAgICAgICAgICAgICAtICBwTVYwWzJdWzJdIC0gZXN0aW1hdGVkIG1vdGlvbiB2ZWN0b3JzOyByZXByZXNlbnRlZCBpbiAKLSAqICAgICAgICAgICAgICAgICB0ZXJtcyBvZiAxLzIgcGVsIHVuaXRzLiAKLSAqICAgICAgICAgICAgICAtICBwTVZQcmVkWzJdWzJdIC0gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3JzOyByZXByZXNlbnRlZCAKLSAqICAgICAgICAgICAgICAgICBpbiB0ZXJtcyBvZiAxLzIgcGVsIHVuaXRzLiAKLSAqICAgICAgICAgICAgVGhlIHN0cnVjdHVyZSBtZW1iZXJzIGNicHkgYW5kIGNicGMgYXJlIG5vdCB1cGRhdGVkIGJ5IHRoZSBmdW5jdGlvbi4gCi0gKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIHRoZSBtaW5pbXVtIFNBRCBmb3IgSU5URVIxViwgb3Igc3VtIG9mIG1pbmltdW0gU0FEcyAKLSAqICAgICAgICAgICAgZm9yIElOVEVSNFYgCi0gKiAgIHBEc3RCbG9ja1NBRCAtIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgU0FEIHZhbHVlcyBmb3IgZWFjaCBvZiB0aGUgZm91ciAKLSAqICAgICAgICAgICAgOHg4IGx1bWEgYmxvY2tzIGluIHRoZSBNQi4gIFRoZSBibG9jayBTQURzIGFyZSBpbiBzY2FuIG9yZGVyIGZvciAKLSAqICAgICAgICAgICAgZWFjaCBNQi4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCi0gKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNDdXJyQnVmLCAKLSAqICAgICAgICAgICAgICBwU3JjUmVmQnVmLCBwUmVmUmVjdCwgcEN1cnJQb2ludFBvcywgcE1CSW50ZXIsIHBNQkludHJhLCAKLSAqICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLCBvciBwRHN0U0FELiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAotICAgIE9NWF9TMzIgc3JjQ3VyclN0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAotICAgIE9NWF9TMzIgc3JjUmVmU3RlcCwKLSAgICBjb25zdCBPTVhSZWN0KnBSZWZSZWN0LAotICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCi0gICAgdm9pZCAqcE1FU3BlYywKLSAgICBjb25zdCBPTVhWQ000UDJNQkluZm9QdHIgKnBNQkluZm8sCi0gICAgT01YVkNNNFAyTUJJbmZvICpwU3JjRHN0TUJDdXJyLAotICAgIE9NWF9VMTYgKnBEc3RTQUQsCi0gICAgT01YX1UxNiAqcERzdEJsb2NrU0FECi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EQ1Q4eDhibGsgICAoNi4yLjQuNC4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29tcHV0ZXMgYSAyRCBmb3J3YXJkIERDVCBmb3IgYSBzaW5nbGUgOHg4IGJsb2NrLCBhcyBkZWZpbmVkIGluIAotICogW0lTTzE0NDk2LTJdLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmVhcmx5IGFycmFuZ2VkIGlucHV0IGJ1ZmZlcjsgbXVzdCAKLSAqICAgICAgICAgICAgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICBJbnB1dCB2YWx1ZXMgKHBpeGVsIAotICogICAgICAgICAgICBpbnRlbnNpdGllcykgYXJlIHZhbGlkIGluIHRoZSByYW5nZSBbLTI1NSwyNTVdLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lYXJseSBhcnJhbmdlZCBvdXRwdXQgYnVmZmVyOyBtdXN0IAotICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIHJldHVybmVkIGlmOgotICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCi0gKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRENUOHg4YmxrICgKLSAgICBjb25zdCBPTVhfUzE2ICpwU3JjLAotICAgIE9NWF9TMTYgKnBEc3QKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1F1YW50SW50cmFfSSAgICg2LjIuNC40LjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBxdWFudGl6YXRpb24gb24gaW50cmEgYmxvY2sgY29lZmZpY2llbnRzLiBUaGlzIGZ1bmN0aW9uIHN1cHBvcnRzIAotICogYml0c19wZXJfcGl4ZWwgPT0gOC4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IGludHJhIGJsb2NrIGNvZWZmaWNpZW50czsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXplcl9zY2FsZSkuIAotICogICBibG9ja0luZGV4IC0gYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kIHBvc2l0aW9uLCAKLSAqICAgICAgICAgICAgdmFsaWQgaW4gdGhlIHJhbmdlIDAgdG8gNSwgYXMgZGVmaW5lZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSAKLSAqICAgICAgICAgICAgNi4xLjMuOC4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCi0gKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAocXVhbnRpemVkKSBpbnRlcmJsb2NrIGNvZWZmaWNpZW50cy4gIAotICogICAgICAgICAgICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTEsIEFDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKLSAqICAgICAgICAgICAgaW50ZXJ2YWwgWy0xMjcsIDEyN10sIGFuZCBEQyBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCBvbiB0aGUgCi0gKiAgICAgICAgICAgIGludGVydmFsIFsxLCAyNTRdLiAgV2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0wLCBBQyBjb2VmZmljaWVudHMgCi0gKiAgICAgICAgICAgIGFyZSBzYXR1cmF0ZWQgb24gdGhlIGludGVydmFsIFstMjA0NywgMjA0N10uIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgotICogICAgLSAgICBwU3JjRHN0IGlzIE5VTEwuIAotICogICAgLSAgICBibG9ja0luZGV4IDwgMCBvciBibG9ja0luZGV4ID49IDEwIAotICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49IDMyLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfUXVhbnRJbnRyYV9JICgKLSAgICBPTVhfUzE2ICpwU3JjRHN0LAotICAgIE9NWF9VOCBRUCwKLSAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludGVyX0kgICAoNi4yLjQuNC4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgcXVhbnRpemF0aW9uIG9uIGFuIGludGVyIGNvZWZmaWNpZW50IGJsb2NrOyBzdXBwb3J0cyAKLSAqIGJpdHNfcGVyX3BpeGVsID09IDguIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBpbnRlciBibG9jayBjb2VmZmljaWVudHM7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGl6ZXJfc2NhbGUpIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIG1vZGUsIGFuZCAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKHF1YW50aXplZCkgaW50ZXJibG9jayBjb2VmZmljaWVudHMuICAKLSAqICAgICAgICAgICAgV2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLCBBQyBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCBvbiB0aGUgCi0gKiAgICAgICAgICAgIGludGVydmFsIFstMTI3LCAxMjddLCBhbmQgREMgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgb24gdGhlIAotICogICAgICAgICAgICBpbnRlcnZhbCBbMSwgMjU0XS4gIFdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MCwgQUMgY29lZmZpY2llbnRzIAotICogICAgICAgICAgICBhcmUgc2F0dXJhdGVkIG9uIHRoZSBpbnRlcnZhbCBbLTIwNDcsIDIwNDddLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBOVUxMLiAKLSAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PSAzMi4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX1F1YW50SW50ZXJfSSAoCi0gICAgT01YX1MxNiAqcFNyY0RzdCwKLSAgICBPTVhfVTggUVAsCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSAgICg2LjIuNC40LjQpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBRdWFudGl6ZXMgdGhlIERDVCBjb2VmZmljaWVudHMsIGltcGxlbWVudHMgaW50cmEgYmxvY2sgQUMvREMgY29lZmZpY2llbnQgCi0gKiBwcmVkaWN0aW9uLCBhbmQgcmVjb25zdHJ1Y3RzIHRoZSBjdXJyZW50IGludHJhIGJsb2NrIHRleHR1cmUgZm9yIHByZWRpY3Rpb24gCi0gKiBvbiB0aGUgbmV4dCBmcmFtZS4gIFF1YW50aXplZCByb3cgYW5kIGNvbHVtbiBjb2VmZmljaWVudHMgYXJlIHJldHVybmVkIGluIAotICogdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgYnVmZmVycy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHBpeGVscyBvZiBjdXJyZW50IGludHJhIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gCi0gKiAgICAgICAgICAgIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlciBjb250YWluaW5nIAotICogICAgICAgICAgICAoKG51bV9tYl9wZXJfcm93ICogMiArIDEpICogOCkgZWxlbWVudHMgb2YgdHlwZSBPTVhfUzE2LiAKLSAqICAgICAgICAgICAgQ29lZmZpY2llbnRzIGFyZSBvcmdhbml6ZWQgaW50byBibG9ja3Mgb2YgZWlnaHQgYXMgZGVzY3JpYmVkIAotICogICAgICAgICAgICBiZWxvdyAoSW50ZXJuYWwgUHJlZGljdGlvbiBDb2VmZmljaWVudCBVcGRhdGUgUHJvY2VkdXJlcykuICBUaGUgCi0gKiAgICAgICAgICAgIERDIGNvZWZmaWNpZW50IGlzIGZpcnN0LCBhbmQgdGhlIHJlbWFpbmluZyBidWZmZXIgbG9jYXRpb25zIAotICogICAgICAgICAgICBjb250YWluIHRoZSBxdWFudGl6ZWQgQUMgY29lZmZpY2llbnRzLiBFYWNoIGdyb3VwIG9mIGVpZ2h0IHJvdyAKLSAqICAgICAgICAgICAgYnVmZmVyIGVsZW1lbnRzIGNvbWJpbmVkIHdpdGggb25lIGVsZW1lbnQgZWlnaHQgZWxlbWVudHMgYWhlYWQgCi0gKiAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBjb2VmZmljaWVudCBwcmVkaWN0b3JzIG9mIHRoZSBuZWlnaGJvcmluZyBibG9jayAKLSAqICAgICAgICAgICAgdGhhdCBpcyBzcGF0aWFsbHkgYWJvdmUgb3IgdG8gdGhlIGxlZnQgb2YgdGhlIGJsb2NrIGN1cnJlbnRseSB0byAKLSAqICAgICAgICAgICAgYmUgZGVjb2RlZC4gQSBuZWdhdGl2ZS12YWx1ZWQgREMgY29lZmZpY2llbnQgaW5kaWNhdGVzIHRoYXQgdGhpcyAKLSAqICAgICAgICAgICAgbmVpZ2hib3JpbmcgYmxvY2sgaXMgbm90IElOVFJBLWNvZGVkIG9yIG91dCBvZiBib3VuZHMsIGFuZCAKLSAqICAgICAgICAgICAgdGhlcmVmb3JlIHRoZSBBQyBhbmQgREMgY29lZmZpY2llbnRzIGFyZSBpbnZhbGlkLiAgUG9pbnRlciBtdXN0IAotICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBQcmVkQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgcHJlZGljdGlvbiBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyIAotICogICAgICAgICAgICBjb250YWluaW5nIDE2IGVsZW1lbnRzIG9mIHR5cGUgT01YX1MxNi4gQ29lZmZpY2llbnRzIGFyZSAKLSAqICAgICAgICAgICAgb3JnYW5pemVkIGFzIGRlc2NyaWJlZCBpbiBzZWN0aW9uIDYuMi4yLjUuICBQb2ludGVyIG11c3QgYmUgCi0gKiAgICAgICAgICAgIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFN1bUVyciAtIHBvaW50ZXIgdG8gYSBmbGFnIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgQUMgcHJlZGljdGlvbiBpcyAKLSAqICAgICAgICAgICAgcmVxdWlyZWQ7IEFDIHByZWRpY3Rpb24gaXMgZW5hYmxlZCBpZiAqcFN1bUVyciA+PTAsIGJ1dCB0aGUgCi0gKiAgICAgICAgICAgIHZhbHVlIGlzIG5vdCB1c2VkIGZvciBjb2VmZmljaWVudCBwcmVkaWN0aW9uLCBpLmUuLCB0aGUgc3VtIG9mIAotICogICAgICAgICAgICBhYnNvbHV0ZSBkaWZmZXJlbmNlcyBzdGFydHMgZnJvbSAwIGZvciBlYWNoIGNhbGwgdG8gdGhpcyAKLSAqICAgICAgICAgICAgZnVuY3Rpb24uICBPdGhlcndpc2UgQUMgcHJlZGljdGlvbiBpcyBkaXNhYmxlZCBpZiAqcFN1bUVyciA8IDAgLiAKLSAqICAgYmxvY2tJbmRleCAtIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZCBwb3NpdGlvbiwgYXMgCi0gKiAgICAgICAgICAgIGRlZmluZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNi4xLjMuOC4gCi0gKiAgIGN1clFwIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgbWFjcm9ibG9jayB0byB3aGljaCB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgYmxvY2sgYmVsb25ncyAKLSAqICAgcFFwQnVmIC0gcG9pbnRlciB0byBhIDItZWxlbWVudCBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlcjsgcFFwQnVmWzBdIAotICogICAgICAgICAgICBjb250YWlucyB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBhc3NvY2lhdGVkIHdpdGggdGhlIDh4OCAKLSAqICAgICAgICAgICAgYmxvY2sgbGVmdCBvZiB0aGUgY3VycmVudCBibG9jayAoUVBhKSwgYW5kIHBRcEJ1ZlsxXSBjb250YWlucyAKLSAqICAgICAgICAgICAgdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSA4eDggYmxvY2sgYWJvdmUgCi0gKiAgICAgICAgICAgIHRoZSBjdXJyZW50IGJsb2NrIChRUGMpLiAgSW4gdGhlIGV2ZW50IHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgCi0gKiAgICAgICAgICAgIGJsb2NrIGlzIG91dHNpZGUgb2YgdGhlIFZPUCBib3VuZCwgdGhlIFFwIHZhbHVlIHdpbGwgbm90IGFmZmVjdCAKLSAqICAgICAgICAgICAgdGhlIGludHJhIHByZWRpY3Rpb24gcHJvY2VzcywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgCi0gKiAgICAgICAgICAgIHN1Yi1jbGF1c2UgNy40LjMuMywgIEFkYXB0aXZlIEFDIENvZWZmaWNpZW50IFByZWRpY3Rpb24uICAKLSAqICAgc3JjU3RlcCAtIHdpZHRoIG9mIHRoZSBzb3VyY2UgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIGRzdFN0ZXAgLSB3aWR0aCBvZiB0aGUgcmVjb25zdHJ1Y3RlZCBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSAKLSAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgMTYuIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIAotICogICAgICAgICAgICBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50IGJ1ZmZlcjsgcERzdFswXSBjb250YWlucyAKLSAqICAgICAgICAgICAgdGhlIHByZWRpY3RlZCBEQyBjb2VmZmljaWVudDsgdGhlIHJlbWFpbmluZyBlbnRyaWVzIGNvbnRhaW4gdGhlIAotICogICAgICAgICAgICBxdWFudGl6ZWQgQUMgY29lZmZpY2llbnRzICh3aXRob3V0IHByZWRpY3Rpb24pLiAgVGhlIHBvaW50ZXIgCi0gKiAgICAgICAgICAgIHBEc3RtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFJlYyAtIHBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgdGV4dHVyZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIAotICogICAgICAgICAgICA4LWJ5dGUgYm91bmRhcnkuIAotICogICBwUHJlZEJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlciAKLSAqICAgcFByZWRCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgCi0gKiAgIHBQcmVBQ1ByZWRpY3QgLSBpZiBwcmVkaWN0aW9uIGlzIGVuYWJsZWQsIHRoZSBwYXJhbWV0ZXIgcG9pbnRzIHRvIHRoZSAKLSAqICAgICAgICAgICAgc3RhcnQgb2YgdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBjb2VmZmljaWVudCBkaWZmZXJlbmNlcyBmb3IgCi0gKiAgICAgICAgICAgIFZMQyBlbmNvZGluZy4gVGhlIGVudHJ5IHBQcmVBQ1ByZWRpY3RbMF1pbmRpY2F0ZXMgcHJlZGljdGlvbiAKLSAqICAgICAgICAgICAgZGlyZWN0aW9uIGZvciB0aGUgY3VycmVudCBibG9jayBhbmQgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgIHZhbHVlczogT01YX1ZDX05PTkUgKHByZWRpY3Rpb24gZGlzYWJsZWQpLCBPTVhfVkNfSE9SSVpPTlRBTCwgb3IgCi0gKiAgICAgICAgICAgIE9NWF9WQ19WRVJUSUNBTC4gIFRoZSBlbnRyaWVzIAotICogICAgICAgICAgICBwUHJlQUNQcmVkaWN0WzFdLXBQcmVBQ1ByZWRpY3RbN11jb250YWluIHByZWRpY3RlZCBBQyAKLSAqICAgICAgICAgICAgY29lZmZpY2llbnRzLiAgSWYgcHJlZGljdGlvbiBpcyBkaXNhYmxlZCAoKnBTdW1FcnI8MCkgdGhlbiB0aGUgCi0gKiAgICAgICAgICAgIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyIGFyZSB1bmRlZmluZWQgdXBvbiByZXR1cm4gZnJvbSB0aGUgCi0gKiAgICAgICAgICAgIGZ1bmN0aW9uIAotICogICBwU3VtRXJyIC0gcG9pbnRlciB0byB0aGUgdmFsdWUgb2YgdGhlIGFjY3VtdWxhdGVkIEFDIGNvZWZmaWNpZW50IGVycm9ycywgCi0gKiAgICAgICAgICAgIGkuZS4sIHN1bSBvZiB0aGUgYWJzb2x1dGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBwcmVkaWN0ZWQgYW5kIAotICogICAgICAgICAgICB1bnByZWRpY3RlZCBBQyBjb2VmZmljaWVudHMgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBEc3QsIHBSZWMsIAotICogICAgICAgICBwQ29lZkJ1ZlJvdywgcENvZWZCdWZDb2wsIHBRcEJ1ZiwgcFByZUFDUHJlZGljdCwgcFN1bUVyci4gCi0gKiAgICAtICAgIGJsb2NrSW5kZXggPCAwIG9yIGJsb2NrSW5kZXggPj0gMTA7IAotICogICAgLSAgICBjdXJRUCA8PSAwIG9yIGN1clFQID49IDMyLiAKLSAqICAgIC0gICAgc3JjU3RlcCwgb3IgZHN0U3RlcCA8PSAwIG9yIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgICBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQ6IC4gCi0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZDogCi0gKiAgICAgICAgIHBTcmMsIHBSZWMuICAKLSAqCi0gKiAgTm90ZTogVGhlIGNvZWZmaWNpZW50IGJ1ZmZlcnMgbXVzdCBiZSB1cGRhdGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgCi0gKiAgICAgICAgdXBkYXRlIHByb2NlZHVyZXMgZGVmaW5lZCBpbiBzZWN0aW9uIGluIDYuMi4yLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBPTVhfUzE2ICpwRHN0LAotICAgIE9NWF9VOCAqcFJlYywKLSAgICBPTVhfUzE2ICpwUHJlZEJ1ZlJvdywKLSAgICBPTVhfUzE2ICpwUHJlZEJ1ZkNvbCwKLSAgICBPTVhfUzE2ICpwUHJlQUNQcmVkaWN0LAotICAgIE9NWF9JTlQgKnBTdW1FcnIsCi0gICAgT01YX0lOVCBibG9ja0luZGV4LAotICAgIE9NWF9VOCBjdXJRcCwKLSAgICBjb25zdCBPTVhfVTggKnBRcEJ1ZiwKLSAgICBPTVhfSU5UIHNyY1N0ZXAsCi0gICAgT01YX0lOVCBkc3RTdGVwLAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIgICAoNi4yLjQuNC41KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogSW1wbGVtZW50cyBEQ1QsIGFuZCBxdWFudGl6ZXMgdGhlIERDVCBjb2VmZmljaWVudHMgb2YgdGhlIGludGVyIGJsb2NrIAotICogd2hpbGUgcmVjb25zdHJ1Y3RpbmcgdGhlIHRleHR1cmUgcmVzaWR1YWwuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5IGNoZWNrIGZvciAKLSAqIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtcG9pbnRlciB0byB0aGUgcmVzaWR1YWxzIHRvIGJlIGVuY29kZWQ7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiAKLSAqICAgICAgICAgICAgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlci4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgCi0gKiAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIG1vZGUsIGFuZCAKLSAqICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudHMgYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBSZWMgLSBwb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIHRleHR1cmUgcmVzaWR1YWxzOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIGVpdGhlciBOVUxMIG9yIAotICogICAgICAgICBub3QgMTYtYnl0ZSBhbGlnbmVkOiAKLSAqICAgICAgICAgICAgLSBwU3JjIAotICogICAgICAgICAgICAtIHBEc3QKLSAqICAgICAgICAgICAgLSBwUmVjCi0gKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0gMzIuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlciAoCi0gICAgY29uc3QgT01YX1MxNiAqcFNyYywKLSAgICBPTVhfUzE2ICpwRHN0LAotICAgIE9NWF9TMTYgKnBSZWMsCi0gICAgT01YX1U4IFFQLAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMgICAoNi4yLjQuNS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgemlnemFnIHNjYW4gYW5kIFZMQyBlbmNvZGluZyBvZiBBQyBhbmQgREMgY29lZmZpY2llbnRzIGZvciBvbmUgCi0gKiBpbnRyYSBibG9jay4gIFR3byB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24gKERDVkxDIGFuZCBBQ1ZMQykgYXJlIHByb3ZpZGVkIAotICogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgdHdvIGRpZmZlcmVudCBtZXRob2RzIG9mIHByb2Nlc3NpbmcgREMgCi0gKiBjb2VmZmljaWVudHMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMS40LCAiSW50cmEgREMgCi0gKiBDb2VmZmljaWVudCBEZWNvZGluZyBmb3IgdGhlIENhc2Ugb2YgU3dpdGNoZWQgVkxDIEVuY29kaW5nIi4gIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0c3RyZWFtIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNy4gCi0gKiAgIHBRRGN0QmxrQ29lZiAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgCi0gKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiwgd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgdGhlIHppZ3phZyAKLSAqICAgICAgICAgICAgc2NhbiBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IAotICogICAgICAgICAgICAtICBPTVhfVkNfTk9ORSAtIEFDIHByZWRpY3Rpb24gbm90IHVzZWQuICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW4uIAotICogICAgICAgICAgICAtICBPTVhfVkNfSE9SSVpPTlRBTCAtIEhvcml6b250YWwgcHJlZGljdGlvbi4gIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS12ZXJ0aWNhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19WRVJUSUNBTCAtIFZlcnRpY2FsIHByZWRpY3Rpb24uICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgIHBhdHRlcm4gLSBibG9jayBwYXR0ZXJuIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhpcyBibG9jayBpcyAKLSAqICAgICAgICAgICAgZW5jb2RlZCAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKLSAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSwgY2hyb21pbmFuY2UpIG9mIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBibG9jayAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwgc28gCi0gKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAotICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAKLSAqICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBRRGN0QmxrQ29lZi4gCi0gKiAgICAtICAgKnBCaXRPZmZzZXQgPCAwLCBvciAqcEJpdE9mZnNldCA+Ny4gCi0gKiAgICAtICAgIFByZWREaXIgaXMgbm90IG9uZSBvZjogT01YX1ZDX05PTkUsIE9NWF9WQ19IT1JJWk9OVEFMLCBvciAKLSAqICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMLiAKLSAqICAgIC0gICAgVmlkZW9Db21wIGlzIG5vdCBvbmUgY29tcG9uZW50IG9mIGVudW0gT01YVkNNNFAyVmlkZW9Db21wb25lbnQuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAoCi0gICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCi0gICAgT01YX1U4IHByZWREaXIsCi0gICAgT01YX1U4IHBhdHRlcm4sCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAotICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgICAoNi4yLjQuNS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgemlnemFnIHNjYW4gYW5kIFZMQyBlbmNvZGluZyBvZiBBQyBhbmQgREMgY29lZmZpY2llbnRzIGZvciBvbmUgCi0gKiBpbnRyYSBibG9jay4gIFR3byB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24gKERDVkxDIGFuZCBBQ1ZMQykgYXJlIHByb3ZpZGVkIAotICogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgdHdvIGRpZmZlcmVudCBtZXRob2RzIG9mIHByb2Nlc3NpbmcgREMgCi0gKiBjb2VmZmljaWVudHMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMS40LCAgSW50cmEgREMgCi0gKiBDb2VmZmljaWVudCBEZWNvZGluZyBmb3IgdGhlIENhc2Ugb2YgU3dpdGNoZWQgVkxDIEVuY29kaW5nLiAgCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBkb3VibGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXRzdHJlYW0gCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3LiAKLSAqICAgcFFEY3RCbGtDb2VmIC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudCAKLSAqICAgcHJlZERpciAtIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uLCB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB0aGUgemlnemFnIAotICogICAgICAgICAgICBzY2FuIHBhdHRlcm47IHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19OT05FIC0gQUMgcHJlZGljdGlvbiBub3QgdXNlZC4gIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uLiAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsIHppZ3phZyBzY2FuLiAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX1ZFUlRJQ0FMIC0gVmVydGljYWwgcHJlZGljdGlvbi4gIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsIHppZ3phZyBzY2FuLiAKLSAqICAgcGF0dGVybiAtIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0aGlzIGJsb2NrIGlzIAotICogICAgICAgICAgICBlbmNvZGVkIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLCBzbyAKLSAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIuIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCi0gKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sIAotICogICAgICAgICAgICAgICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcFFEY3RCbGtDb2VmLiAKLSAqICAgIC0gICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKLSAqICAgIC0gICAgUHJlZERpciBpcyBub3Qgb25lIG9mOiBPTVhfVkNfTk9ORSwgT01YX1ZDX0hPUklaT05UQUwsIG9yIAotICogICAgICAgICBPTVhfVkNfVkVSVElDQUwuIAotICogICAgLSAgICBWaWRlb0NvbXAgaXMgbm90IG9uZSBjb21wb25lbnQgb2YgZW51bSBPTVhWQ000UDJWaWRlb0NvbXBvbmVudC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICgKLSAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKLSAgICBPTVhfVTggcHJlZERpciwKLSAgICBPTVhfVTggcGF0dGVybiwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlciAgICg2LjIuNC41LjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZW5jb2RpbmcgZm9yIG9uZSBpbnRlciBibG9jay4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCAKLSAqICAgICAgICAgICAgc3RyZWFtIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNyAKLSAqICAgcFFEY3RCbGtDb2VmIC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudCAKLSAqICAgcGF0dGVybiAtIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0aGlzIGJsb2NrIGlzIAotICogICAgICAgICAgICBlbmNvZGVkIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkIHNvIHRoYXQgCi0gKiAgICAgICAgICAgIGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKLSAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzIAotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIHBvaW50ZXJzOiBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCAKLSAqICAgICAgICAgICAgICBwQml0T2Zmc2V0LCBwUURjdEJsa0NvZWYgCi0gKiAgICAtICAgKnBCaXRPZmZzZXQgPCAwLCBvciAqcEJpdE9mZnNldCA+Ny4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlciAoCi0gICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCi0gICAgT01YX1U4IHBhdHRlcm4sCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9FbmNvZGVNViAgICg2LjIuNC41LjQpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQcmVkaWN0cyBhIG1vdGlvbiB2ZWN0b3IgZm9yIHRoZSBjdXJyZW50IG1hY3JvYmxvY2ssIGVuY29kZXMgdGhlIAotICogZGlmZmVyZW5jZSwgYW5kIHdyaXRlcyB0aGUgb3V0cHV0IHRvIHRoZSBzdHJlYW0gYnVmZmVyLiBUaGUgaW5wdXQgTVZzIAotICogcE1WQ3VyTUIsIHBTcmNNVkxlZnRNQiwgcFNyY01WVXBwZXJNQiwgYW5kIHBTcmNNVlVwcGVyUmlnaHRNQiBzaG91bGQgbGllIAotICogd2l0aGluIHRoZSByYW5nZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnB1dCBwYXJhbWV0ZXIgZmNvZGVGb3J3YXJkLCBhcyAKLSAqIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuMy4gIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSAKLSAqIHN1cGVyc2V0IG9mIHRoZSBmdW5jdGlvbmFsaXR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgZnVuY3Rpb24gCi0gKiBvbXhWQ000UDJfRmluZE1WcHJlZC4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBkb3VibGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXRzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gaW5kZXggb2YgdGhlIGZpcnN0IGZyZWUgKG5leHQgYXZhaWxhYmxlKSBiaXQgaW4gdGhlIHN0cmVhbSAKLSAqICAgICAgICAgICAgYnVmZmVyIHJlZmVyZW5jZWQgYnkgKnBwQml0U3RyZWFtLCB2YWxpZCBpbiB0aGUgcmFuZ2UgMCB0byA3LiAKLSAqICAgcE1WQ3VyTUIgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgbW90aW9uIHZlY3RvcjsgYSB2YWx1ZSBvZiAKLSAqICAgICAgICAgICAgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAotICogICBwU3JjTVZMZWZ0TUIgLSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgbGVmdCBtYWNyb2Jsb2NrIG1vdGlvbiB2ZWN0b3I7IGEgCi0gKiAgICAgICAgICAgIHZhbHVlIG9mICBOVUxMaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKLSAqICAgcFNyY01WVXBwZXJNQiAtIHBvaW50ZXIgdG8gc291cmNlIHVwcGVyIG1hY3JvYmxvY2sgbW90aW9uIHZlY3RvcjsgYSAKLSAqICAgICAgICAgICAgdmFsdWUgb2YgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAotICogICBwU3JjTVZVcHBlclJpZ2h0TUIgLSBwb2ludGVyIHRvIHNvdXJjZSB1cHBlciByaWdodCBNQiBtb3Rpb24gdmVjdG9yOyBhIAotICogICAgICAgICAgICB2YWx1ZSBvZiBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCi0gKiAgIGZjb2RlRm9yd2FyZCAtIGFuIGludGVnZXIgd2l0aCB2YWx1ZXMgZnJvbSAxIHRvIDc7IHVzZWQgaW4gZW5jb2RpbmcgCi0gKiAgICAgICAgICAgIG1vdGlvbiB2ZWN0b3JzIHJlbGF0ZWQgdG8gc2VhcmNoIHJhbmdlLCBhcyBkZXNjcmliZWQgaW4gCi0gKiAgICAgICAgICAgIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi4zLiAKLSAqICAgTUJUeXBlIC0gbWFjcm8gYmxvY2sgdHlwZSwgdmFsaWQgaW4gdGhlIHJhbmdlIDAgdG8gNSAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSB1cGRhdGVkIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSAKLSAqICAgICAgICAgICAgYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gdXBkYXRlZCBpbmRleCBvZiB0aGUgbmV4dCBhdmFpbGFibGUgYml0IHBvc2l0aW9uIGluIHN0cmVhbSAKLSAqICAgICAgICAgICAgYnVmZmVyIHJlZmVyZW5jZWQgYnkgKnBwQml0U3RyZWFtIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIAotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgCi0gKiAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwTVZDdXJNQiAKLSAqICAgIC0gICAgKnBCaXRPZmZzZXQgPCAwLCBvciAqcEJpdE9mZnNldCA+Ny4gCi0gKiAgICAtICAgIGZjb2RlRm9yd2FyZCA8PSAwLCBvciBmY29kZUZvcndhcmQgPiA3LCBvciBNQlR5cGUgPCAwLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlTVYgKAotICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVkN1ck1CLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yKnBTcmNNVkxlZnRNQiwKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WVXBwZXJNQiwKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WVXBwZXJSaWdodE1CLAotICAgIE9NWF9JTlQgZmNvZGVGb3J3YXJkLAotICAgIE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlIE1CVHlwZQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUCAgICg2LjIuNS4xLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBEZWNvZGVzIGFuZCBwYWRzIHRoZSBmb3VyIG1vdGlvbiB2ZWN0b3JzIGFzc29jaWF0ZWQgd2l0aCBhIG5vbi1pbnRyYSBQLVZPUCAKLSAqIG1hY3JvYmxvY2suICBGb3IgbWFjcm9ibG9ja3Mgb2YgdHlwZSBPTVhfVkNfSU5URVI0ViwgdGhlIG91dHB1dCBNViBpcyAKLSAqIHBhZGRlZCBhcyBzcGVjaWZpZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjEuNi4gT3RoZXJ3aXNlLCBmb3IgCi0gKiBtYWNyb2Jsb2NrcyBvZiB0eXBlcyBvdGhlciB0aGFuIE9NWF9WQ19JTlRFUjRWLCB0aGUgZGVjb2RlZCBNViBpcyBjb3BpZWQgdG8gCi0gKiBhbGwgZm91ciBvdXRwdXQgTVYgYnVmZmVyIGVudHJpZXMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCi0gKiAgICAgICAgICAgIHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gWzAtN10uIAotICogICBwU3JjTVZMZWZ0TUIsIHBTcmNNVlVwcGVyTUIsIGFuZCBwU3JjTVZVcHBlclJpZ2h0TUIgLSBwb2ludGVycyB0byB0aGUgCi0gKiAgICAgICAgICAgIG1vdGlvbiB2ZWN0b3IgYnVmZmVycyBvZiB0aGUgbWFjcm9ibG9ja3Mgc3BlY2lhbGx5IGF0IHRoZSBsZWZ0LCAKLSAqICAgICAgICAgICAgdXBwZXIsIGFuZCB1cHBlci1yaWdodCBzaWRlIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2ssIAotICogICAgICAgICAgICByZXNwZWN0aXZlbHk7IGEgdmFsdWUgb2YgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuICBOb3RlOiAKLSAqICAgICAgICAgICAgQW55IG5laWdoYm9yaG9vZCBtYWNyb2Jsb2NrIG91dHNpZGUgdGhlIGN1cnJlbnQgVk9QIG9yIHZpZGVvIAotICogICAgICAgICAgICBwYWNrZXQgb3Igb3V0c2lkZSB0aGUgY3VycmVudCBHT0IgKHdoZW4gc2hvcnRfdmlkZW9faGVhZGVyIGlzIAotICogICAgICAgICAgICAgMSApIGZvciB3aGljaCBnb2JfaGVhZGVyX2VtcHR5IGlzICAwICBpcyB0cmVhdGVkIGFzIAotICogICAgICAgICAgICB0cmFuc3BhcmVudCwgYWNjb3JkaW5nIHRvIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi41LiAKLSAqICAgZmNvZGVGb3J3YXJkIC0gYSBjb2RlIGVxdWFsIHRvIHZvcF9mY29kZV9mb3J3YXJkIGluIE1QRUctNCBiaXQgc3RyZWFtIAotICogICAgICAgICAgICBzeW50YXggCi0gKiAgIE1CVHlwZSAtIHRoZSB0eXBlIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2suIElmIE1CVHlwZSBpcyBub3QgZXF1YWwgdG8gCi0gKiAgICAgICAgICAgIE9NWF9WQ19JTlRFUjRWLCB0aGUgZGVzdGluYXRpb24gbW90aW9uIHZlY3RvciBidWZmZXIgaXMgc3RpbGwgCi0gKiAgICAgICAgICAgIGZpbGxlZCB3aXRoIHRoZSBzYW1lIGRlY29kZWQgdmVjdG9yLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwgc28gCi0gKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCi0gKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAotICogICBwRHN0TVZDdXJNQiAtIHBvaW50ZXIgdG8gdGhlIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIGZvciB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgbWFjcm9ibG9jazsgY29udGFpbnMgZm91ciBkZWNvZGVkIG1vdGlvbiB2ZWN0b3JzIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdE1WQ3VyTUIgCi0gKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KLSAqICAgIC0gICAgZmNvZGVGb3J3YXJkIGV4Y2VlZHMgKDAsN10KLSAqICAgIC0gICAgTUJUeXBlIGxlc3MgdGhhbiB6ZXJvCi0gKiAgICAtICAgIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvciAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUCAoCi0gICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WTGVmdE1CLAotICAgIE9NWFZDTW90aW9uVmVjdG9yKnBTcmNNVlVwcGVyTUIsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNVlVwcGVyUmlnaHRNQiwKLSAgICBPTVhWQ01vdGlvblZlY3RvcipwRHN0TVZDdXJNQiwKLSAgICBPTVhfSU5UIGZjb2RlRm9yd2FyZCwKLSAgICBPTVhWQ000UDJNYWNyb2Jsb2NrVHlwZSBNQlR5cGUKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICAgKDYuMi41LjIuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBvZiBBQyBhbmQgREMgY29lZmZpY2llbnRzIAotICogZm9yIG9uZSBpbnRyYSBibG9jay4gIFR3byB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24gKERDVkxDIGFuZCBBQ1ZMQykgYXJlIAotICogcHJvdmlkZWQgaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgdHdvIGRpZmZlcmVudCBtZXRob2RzIG9mIHByb2Nlc3NpbmcgREMgCi0gKiBjb2VmZmljaWVudHMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMS40LCAgSW50cmEgREMgCi0gKiBDb2VmZmljaWVudCBEZWNvZGluZyBmb3IgdGhlIENhc2Ugb2YgU3dpdGNoZWQgVkxDIEVuY29kaW5nLiAgCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIAotICogICAgICAgICAgICBiaXRzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBjdXJyZW50IGJ5dGUgcmVmZXJlbmNlZCAKLSAqICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiAgVGhlIHBhcmFtZXRlciAqcEJpdE9mZnNldCBpcyB2YWxpZCBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJhbmdlIFswLTddLiAKLSAqICAgICAgICAgICAgQml0IFBvc2l0aW9uIGluIG9uZSBieXRlOiAgfE1vc3QgICAgICBMZWFzdHwgCi0gKiAgICAgICAgICAgICAgICAgICAgKnBCaXRPZmZzZXQgICAgICAgIHwwIDEgMiAzIDQgNSA2IDd8IAotICogICBwcmVkRGlyIC0gQUMgcHJlZGljdGlvbiBkaXJlY3Rpb247IHVzZWQgdG8gc2VsZWN0IHRoZSB6aWd6YWcgc2NhbiAKLSAqICAgICAgICAgICAgcGF0dGVybjsgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX05PTkUgLSBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkOyAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW4uIAotICogICAgICAgICAgICAtICBPTVhfVkNfSE9SSVpPTlRBTCAtIEhvcml6b250YWwgcHJlZGljdGlvbjsgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsIHppZ3phZyBzY2FuOyAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX1ZFUlRJQ0FMIC0gVmVydGljYWwgcHJlZGljdGlvbjsgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwgemlnemFnIHNjYW4uIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAotICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlIG9yIGNocm9taW5hbmNlKSBvZiB0aGUgCi0gKiAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQgc3VjaCAKLSAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHN1Y2ggdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAotICogICAgICAgICAgICA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIGlmOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdAotICogICAgLSAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddCi0gKiAgICAtICAgIHByZURpciBleGNlZWRzIFswLDJdCi0gKiAgICAtICAgIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkIAotICogICAgT01YX1N0c19FcnIgLSBpZjoKLSAqICAgIC0gICAgSW4gRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMsIGRjX3NpemUgPiAxMiAKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIG1hcmsgYml0cyBlcXVhbHMgemVybyAKLSAqICAgIC0gICAgSWxsZWdhbCBzdHJlYW0gZW5jb3VudGVyZWQ7IGNvZGUgY2Fubm90IGJlIGxvY2F0ZWQgaW4gVkxDIHRhYmxlIAotICogICAgLSAgICBGb3JiaWRkZW4gY29kZSBlbmNvdW50ZXJlZCBpbiB0aGUgVkxDIEZMQyB0YWJsZS4gCi0gKiAgICAtICAgIFRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMgKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgT01YX1MxNiAqcERzdCwKLSAgICBPTVhfVTggcHJlZERpciwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCi0gICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAgICg2LjIuNS4yLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gb2YgQUMgYW5kIERDIGNvZWZmaWNpZW50cyAKLSAqIGZvciBvbmUgaW50cmEgYmxvY2suICBUd28gdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uIChEQ1ZMQyBhbmQgQUNWTEMpIGFyZSAKLSAqIHByb3ZpZGVkIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIHR3byBkaWZmZXJlbnQgbWV0aG9kcyBvZiBwcm9jZXNzaW5nIERDIAotICogY29lZmZpY2llbnRzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjEuNCwgIEludHJhIERDIAotICogQ29lZmZpY2llbnQgRGVjb2RpbmcgZm9yIHRoZSBDYXNlIG9mIFN3aXRjaGVkIFZMQyBFbmNvZGluZy4gIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSAKLSAqICAgICAgICAgICAgYml0c3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgY3VycmVudCBieXRlIHJlZmVyZW5jZWQgCi0gKiAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gIFRoZSBwYXJhbWV0ZXIgKnBCaXRPZmZzZXQgaXMgdmFsaWQgaW4gdGhlIAotICogICAgICAgICAgICByYW5nZSBbMC03XS4gQml0IFBvc2l0aW9uIGluIG9uZSBieXRlOiAgfE1vc3QgTGVhc3R8ICpwQml0T2Zmc2V0IAotICogICAgICAgICAgICB8MCAxIDIgMyA0IDUgNiA3fCAKLSAqICAgcHJlZERpciAtIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uOyB1c2VkIHRvIHNlbGVjdCB0aGUgemlnemFnIHNjYW4gCi0gKiAgICAgICAgICAgIHBhdHRlcm47IHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogT01YX1ZDX05PTkUgLSBBQyAKLSAqICAgICAgICAgICAgcHJlZGljdGlvbiBub3QgdXNlZDsgcGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FuLiAKLSAqICAgICAgICAgICAgT01YX1ZDX0hPUklaT05UQUwgLSBIb3Jpem9udGFsIHByZWRpY3Rpb247IHBlcmZvcm1zIAotICogICAgICAgICAgICBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW47IE9NWF9WQ19WRVJUSUNBTCAtIFZlcnRpY2FsIAotICogICAgICAgICAgICBwcmVkaWN0aW9uOyBwZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCi0gKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2Ugb3IgY2hyb21pbmFuY2UpIG9mIHRoZSAKLSAqICAgICAgICAgICAgY3VycmVudCBibG9jayAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCBzdWNoIAotICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc3VjaCB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgCi0gKiAgICAgICAgICAgIDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0LCAKLSAqICAgICAgICAgICAgICBvciBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgICAgICAgICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10sIHByZURpciBleGNlZWRzIFswLDJdLCBvciBwRHN0IGlzIAotICogICAgICAgICAgICAgIG5vdCA0LWJ5dGUgYWxpZ25lZCAKLSAqICAgIE9NWF9TdHNfRXJyIEluIERlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLCBkY19zaXplID4gMTIgQXQgbGVhc3Qgb25lIG9mIAotICogICAgICAgICAgICAgIG1hcmsgYml0cyBlcXVhbHMgemVybyBJbGxlZ2FsIHN0cmVhbSBlbmNvdW50ZXJlZDsgY29kZSBjYW5ub3QgCi0gKiAgICAgICAgICAgICAgYmUgbG9jYXRlZCBpbiBWTEMgdGFibGUgRm9yYmlkZGVuIGNvZGUgZW5jb3VudGVyZWQgaW4gdGhlIFZMQyAKLSAqICAgICAgICAgICAgICBGTEMgdGFibGUgVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAoCi0gICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBPTVhfUzE2ICpwRHN0LAotICAgIE9NWF9VOCBwcmVkRGlyLAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyICAgKDYuMi41LjIuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3Igb25lIGludGVyLWNvZGVkIGJsb2NrLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIGRvdWJsZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSBiaXQgaW4gdGhlIGN1cnJlbnQgc3RyZWFtIAotICogICAgICAgICAgICBieXRlIHJlZmVyZW5jZWQgYnkgKnBwQml0U3RyZWFtLiBUaGUgcGFyYW1ldGVyICpwQml0T2Zmc2V0IGlzIAotICogICAgICAgICAgICB2YWxpZCB3aXRoaW4gdGhlIHJhbmdlIFswLTddLiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCBzdWNoIAotICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBkZWNvZGluZyBzdWNoIHRoYXQgaXQgcG9pbnRzIAotICogICAgICAgICAgICB0byB0aGUgbmV4dCBhdmFpbGFibGUgYml0IGluIHRoZSBzdHJlYW0gYnl0ZSByZWZlcmVuY2VkIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW0gCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudCBibG9jazsgbXVzdCBiZSAKLSAqICAgICAgICAgICAgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdAotICogICAgLSAgICBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZAotICogICAgLSAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KLSAqICAgIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yLCBpZjoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG1hcmsgYml0IGlzIGVxdWFsIHRvIHplcm8gCi0gKiAgICAtICAgIEVuY291bnRlcmVkIGFuIGlsbGVnYWwgc3RyZWFtIGNvZGUgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIFZMQyB0YWJsZSAKLSAqICAgIC0gICAgRW5jb3VudGVyZWQgYW4gaWxsZWdhbCBjb2RlIGluIHRoZSBWTEMgRkxDIHRhYmxlIAotICogICAgLSAgICBUaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlciAoCi0gICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBPTVhfUzE2ICpwRHN0LAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JICAgKDYuMi41LjMuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHRoZSBzZWNvbmQgaW52ZXJzZSBxdWFudGl6YXRpb24gbW9kZSBvbiBhbiBpbnRyYS9pbnRlciBjb2RlZCAKLSAqIGJsb2NrLiBTdXBwb3J0cyBiaXRzX3Blcl9waXhlbCA9IDguIFRoZSBvdXRwdXQgY29lZmZpY2llbnRzIGFyZSBjbGlwcGVkIHRvIAotICogdGhlIHJhbmdlIFstMjA0OCwgMjA0N10uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCAocXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jazsgbXVzdCBiZSAKLSAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXplcl9zY2FsZSkgCi0gKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBUYWtlcyBvbmUgb2YgdGhlIAotICogICAgICAgICAgICBmb2xsb3dpbmcgZmxhZ3M6IE9NWF9WQ19MVU1JTkFOQ0UsIE9NWF9WQ19DSFJPTUlOQU5DRSAoaW50cmEgCi0gKiAgICAgICAgICAgIHZlcnNpb24gb25seSkuIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXIgCi0gKiAgICAgICAgICAgIChpbnRyYSB2ZXJzaW9uIG9ubHkpLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAoZGVxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGlzIAotICogICAgICAgICAgICAgIHRydWU6IAotICogICAgLSAgICBwU3JjRHN0IGlzIE5VTEwgCi0gKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0zMSAKLSAqICAgIC0gICAgdmlkZW9Db21wIGlzIG5laXRoZXIgT01YX1ZDX0xVTUlOQU5DRSBub3IgT01YX1ZDX0NIUk9NSU5BTkNFLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JICgKLSAgICBPTVhfUzE2ICpwU3JjRHN0LAotICAgIE9NWF9JTlQgUVAsCi0gICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wLAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JICAgKDYuMi41LjMuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHRoZSBzZWNvbmQgaW52ZXJzZSBxdWFudGl6YXRpb24gbW9kZSBvbiBhbiBpbnRyYS9pbnRlciBjb2RlZCAKLSAqIGJsb2NrLiBTdXBwb3J0cyBiaXRzX3Blcl9waXhlbCA9IDguIFRoZSBvdXRwdXQgY29lZmZpY2llbnRzIGFyZSBjbGlwcGVkIHRvIAotICogdGhlIHJhbmdlIFstMjA0OCwgMjA0N10uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCAocXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jazsgbXVzdCBiZSAKLSAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXplcl9zY2FsZSkgCi0gKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBUYWtlcyBvbmUgb2YgdGhlIAotICogICAgICAgICAgICBmb2xsb3dpbmcgZmxhZ3M6IE9NWF9WQ19MVU1JTkFOQ0UsIE9NWF9WQ19DSFJPTUlOQU5DRSAoaW50cmEgCi0gKiAgICAgICAgICAgIHZlcnNpb24gb25seSkuIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXIgCi0gKiAgICAgICAgICAgIChpbnRyYSB2ZXJzaW9uIG9ubHkpLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAoZGVxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGlzIAotICogICAgICAgICAgICAgIHRydWU6IAotICogICAgLSAgICBwU3JjRHN0IGlzIE5VTEwgCi0gKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0zMSAKLSAqICAgIC0gICAgdmlkZW9Db21wIGlzIG5laXRoZXIgT01YX1ZDX0xVTUlOQU5DRSBub3IgT01YX1ZDX0NIUk9NSU5BTkNFLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JICgKLSAgICBPTVhfUzE2ICpwU3JjRHN0LAotICAgIE9NWF9JTlQgUVAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYSAgICg2LjIuNS40LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBEZWNvZGVzIHRoZSBJTlRSQSBibG9jayBjb2VmZmljaWVudHMuIEludmVyc2UgcXVhbnRpemF0aW9uLCBpbnZlcnNlbHkgCi0gKiB6aWd6YWcgcG9zaXRpb25pbmcsIGFuZCBJRENULCB3aXRoIGFwcHJvcHJpYXRlIGNsaXBwaW5nIG9uIGVhY2ggc3RlcCwgYXJlIAotICogcGVyZm9ybWVkIG9uIHRoZSBjb2VmZmljaWVudHMuIFRoZSByZXN1bHRzIGFyZSB0aGVuIHBsYWNlZCBpbiB0aGUgb3V0cHV0IAotICogZnJhbWUvcGxhbmUgb24gYSBwaXhlbCBiYXNpcy4gIE5vdGU6IFRoaXMgZnVuY3Rpb24gd2lsbCBiZSB1c2VkIG9ubHkgd2hlbiAKLSAqIGF0IGxlYXN0IG9uZSBub24temVybyBBQyBjb2VmZmljaWVudCBvZiBjdXJyZW50IGJsb2NrIGV4aXN0cyBpbiB0aGUgYml0IAotICogc3RyZWFtLiBUaGUgREMgb25seSBjb25kaXRpb24gd2lsbCBiZSBoYW5kbGVkIGluIGFub3RoZXIgZnVuY3Rpb24uIAotICoKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IAotICogICAgICAgICAgICBzdHJlYW0gYnVmZmVyLiBUaGVyZSBpcyBubyBib3VuZGFyeSBjaGVjayBmb3IgdGhlIGJpdCBzdHJlYW0gCi0gKiAgICAgICAgICAgIGJ1ZmZlci4gCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gWzAtN10uIAotICogICBzdGVwIC0gd2lkdGggb2YgdGhlIGRlc3RpbmF0aW9uIHBsYW5lIAotICogICBwQ29lZkJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiAKLSAqICAgICAgICAgICAgYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcENvZWZCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIGN1clFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgbWFjcm9ibG9jayB3aGljaCB0aGUgY3VycmVudCBibG9jayAKLSAqICAgICAgICAgICAgYmVsb25ncyB0byAKLSAqICAgcFFQQnVmIC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBidWZmZXIgCi0gKiAgIGJsb2NrSW5kZXggLSBibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQgcG9zaXRpb24gYXMgCi0gKiAgICAgICAgICAgIGRlZmluZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNi4xLjMuOCwgRmlndXJlIDYtNS4gCi0gKiAgIGludHJhRENWTEMgLSBhIGNvZGUgZGV0ZXJtaW5lZCBieSBpbnRyYV9kY192bGNfdGhyIGFuZCBRUC4gVGhpcyBhbGxvd3MgYSAKLSAqICAgICAgICAgICAgbWVjaGFuaXNtIHRvIHN3aXRjaCBiZXR3ZWVuIHR3byBWTEMgZm9yIGNvZGluZyBvZiBJbnRyYSBEQyAKLSAqICAgICAgICAgICAgY29lZmZpY2llbnRzIGFzIHBlciBbSVNPMTQ0OTYtMl0sIFRhYmxlIDYtMjEuIAotICogICBBQ1ByZWRGbGFnIC0gYSBmbGFnIGVxdWFsIHRvIGFjX3ByZWRfZmxhZyAob2YgbHVtaW5hbmNlKSBpbmRpY2F0aW5nIGlmIAotICogICAgICAgICAgICB0aGUgYWMgY29lZmZpY2llbnRzIG9mIHRoZSBmaXJzdCByb3cgb3IgZmlyc3QgY29sdW1uIGFyZSAKLSAqICAgICAgICAgICAgZGlmZmVyZW50aWFsbHkgY29kZWQgZm9yIGludHJhIGNvZGVkIG1hY3JvYmxvY2suIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIAotICogICAgICAgICAgICBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQsIHNvIAotICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAotICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGJsb2NrIGluIHRoZSBkZXN0aW5hdGlvbiBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIAotICogICAgICAgICAgICBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBwQ29lZkJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlci4gCi0gKiAgIHBDb2VmQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyICBOb3RlOiAKLSAqICAgICAgICAgICAgVGhlIGNvZWZmaWNpZW50IGJ1ZmZlcnMgbXVzdCBiZSB1cGRhdGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgCi0gKiAgICAgICAgICAgIHVwZGF0ZSBwcm9jZWR1cmUgZGVmaW5lZCBpbiBzZWN0aW9uIDYuMi4yLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgaWY6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwQ29lZkJ1ZlJvdywgcENvZWZCdWZDb2wsIAotICogICAgICAgICBwUVBCdWYsIHBEc3QuIAotICogICAgLSAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddIAotICogICAgLSAgICBjdXJRUCBleGNlZWRzICgxLCAzMSkKLSAqICAgIC0gICAgYmxvY2tJbmRleCBleGNlZWRzIFswLDVdCi0gKiAgICAtICAgIHN0ZXAgaXMgbm90IHRoZSBtdWx0aXBsZSBvZiA4Ci0gKiAgICAtICAgIGEgcG9pbnRlciBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgd2FzIHZpb2xhdGVkLiAKLSAqICAgIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yLiBSZWZlciB0byBPTVhfU3RzX0VyciBvZiBEZWNvZGVWTENaaWd6YWdfSW50cmEuICAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhICgKLSAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIE9NWF9VOCAqcERzdCwKLSAgICBPTVhfSU5UIHN0ZXAsCi0gICAgT01YX1MxNiAqcENvZWZCdWZSb3csCi0gICAgT01YX1MxNiAqcENvZWZCdWZDb2wsCi0gICAgT01YX1U4IGN1clFQLAotICAgIGNvbnN0IE9NWF9VOCAqcFFQQnVmLAotICAgIE9NWF9JTlQgYmxvY2tJbmRleCwKLSAgICBPTVhfSU5UIGludHJhRENWTEMsCi0gICAgT01YX0lOVCBBQ1ByZWRGbGFnLAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyICAgKDYuMi41LjQuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIERlY29kZXMgdGhlIElOVEVSIGJsb2NrIGNvZWZmaWNpZW50cy4gVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIAotICogcXVhbnRpemF0aW9uLCBpbnZlcnNlIHppZ3phZyBwb3NpdGlvbmluZywgYW5kIElEQ1QgKHdpdGggYXBwcm9wcmlhdGUgCi0gKiBjbGlwcGluZyBvbiBlYWNoIHN0ZXApIG9uIHRoZSBjb2VmZmljaWVudHMuIFRoZSByZXN1bHRzIChyZXNpZHVhbHMpIGFyZSAKLSAqIHBsYWNlZCBpbiBhIGNvbnRpZ3VvdXMgYXJyYXkgb2YgNjQgZWxlbWVudHMuIEZvciBJTlRFUiBibG9jaywgdGhlIG91dHB1dCAKLSAqIGJ1ZmZlciBob2xkcyB0aGUgcmVzaWR1YWxzIGZvciBmdXJ0aGVyIHJlY29uc3RydWN0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IAotICogICAgICAgICAgICBzdHJlYW0gYnVmZmVyLiBUaGVyZSBpcyBubyBib3VuZGFyeSBjaGVjayBmb3IgdGhlIGJpdCBzdHJlYW0gCi0gKiAgICAgICAgICAgIGJ1ZmZlci4gCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gWzAtN10gCi0gKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyAKLSAqICAgICAgICAgICAgbW9kZSwgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkLCBzbyAKLSAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKLSAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZWNvZGVkIHJlc2lkdWFsIGJ1ZmZlciAoYSBjb250aWd1b3VzIGFycmF5IG9mIDY0IAotICogICAgICAgICAgICBlbGVtZW50cyBvZiBPTVhfUzE2IGRhdGEgdHlwZSk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgaWY6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE51bGw6IAotICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0ICwgcERzdCAKLSAqICAgIC0gICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQotICogICAgLSAgICBRUCA8PSAwLiAKLSAqICAgIC0gICAgcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkIAotICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IuIFJlZmVyIHRvIE9NWF9TdHNfRXJyIG9mIERlY29kZVZMQ1ppZ3phZ19JbnRlciAuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIgKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgT01YX1MxNiAqcERzdCwKLSAgICBPTVhfSU5UIFFQLAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhICAgKDYuMi41LjQuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGFkYXB0aXZlIERDL0FDIGNvZWZmaWNpZW50IHByZWRpY3Rpb24gZm9yIGFuIGludHJhIGJsb2NrLiAgUHJpb3IgCi0gKiB0byB0aGUgZnVuY3Rpb24gY2FsbCwgcHJlZGljdGlvbiBkaXJlY3Rpb24gKHByZWREaXIpIHNob3VsZCBiZSBzZWxlY3RlZCBhcyAKLSAqIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMy4xLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zIHRoZSBxdWFudGl6ZWQgCi0gKiAgICAgICAgICAgIGNvZWZmaWNpZW50IHJlc2lkdWFscyAoUFFGKSBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSAKLSAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFRoZSBvdXRwdXQgY29lZmZpY2llbnRzIGFyZSAKLSAqICAgICAgICAgICAgc2F0dXJhdGVkIHRvIHRoZSByYW5nZSBbLTIwNDgsIDIwNDddLiAKLSAqICAgcFByZWRCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gCi0gKiAgICAgICAgICAgIGEgNC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFByZWRCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgY3VyUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBjdXJRUCBtYXkgZXF1YWwgdG8gCi0gKiAgICAgICAgICAgIHByZWRRUCBlc3BlY2lhbGx5IHdoZW4gdGhlIGN1cnJlbnQgYmxvY2sgYW5kIHRoZSBwcmVkaWN0b3IgYmxvY2sgCi0gKiAgICAgICAgICAgIGFyZSBpbiB0aGUgc2FtZSBtYWNyb2Jsb2NrLiAKLSAqICAgcHJlZFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrIAotICogICBwcmVkRGlyIC0gaW5kaWNhdGVzIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCB0YWtlcyBvbmUgb2YgdGhlIAotICogICAgICAgICAgICBmb2xsb3dpbmcgdmFsdWVzOiBPTVhfVkNfSE9SSVpPTlRBTCAtIHByZWRpY3QgaG9yaXpvbnRhbGx5IAotICogICAgICAgICAgICBPTVhfVkNfVkVSVElDQUwgLSBwcmVkaWN0IHZlcnRpY2FsbHkgCi0gKiAgIEFDUHJlZEZsYWcgLSBhIGZsYWcgaW5kaWNhdGluZyBpZiBBQyBwcmVkaWN0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWQuIEl0IAotICogICAgICAgICAgICBpcyBlcXVhbCB0byBhY19wcmVkX2ZsYWcgaW4gdGhlIGJpdCBzdHJlYW0gc3ludGF4IG9mIE1QRUctNCAKLSAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSBvciBjaHJvbWluYW5jZSkgb2YgdGhlIAotICogICAgICAgICAgICBjdXJyZW50IGJsb2NrIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zIHRoZSBxdWFudGl6ZWQgCi0gKiAgICAgICAgICAgIGNvZWZmaWNpZW50cyAoUUYpIG9mIHRoZSBjdXJyZW50IGJsb2NrIAotICogICBwUHJlZEJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlciAKLSAqICAgcFByZWRCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgIE5vdGU6IAotICogICAgICAgICAgICBCdWZmZXIgdXBkYXRlOiBVcGRhdGUgdGhlIEFDIHByZWRpY3Rpb24gYnVmZmVyIChib3RoIHJvdyBhbmQgCi0gKiAgICAgICAgICAgIGNvbHVtbiBidWZmZXIpLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgaWY6Ci0gKiAgICAgICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICAgICAgIHBTcmNEc3QsIHBQcmVkQnVmUm93LCBvciBwUHJlZEJ1ZkNvbC4gCi0gKiAgICAgICAgLSAgICBjdXJRUCA8PSAwLCAKLSAqICAgICAgICAtICAgIHByZWRRUCA8PSAwLCAKLSAqICAgICAgICAtICAgIGN1clFQID4zMSwgCi0gKiAgICAgICAgLSAgICBwcmVkUVAgPiAzMSwgCi0gKiAgICAgICAgLSAgICBwcmVEaXIgZXhjZWVkcyBbMSwyXQotICogICAgICAgIC0gICAgcFNyY0RzdCwgcFByZWRCdWZSb3csIG9yIHBQcmVkQnVmQ29sIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSAoCi0gICAgT01YX1MxNiAqcFNyY0RzdCwKLSAgICBPTVhfUzE2ICpwUHJlZEJ1ZlJvdywKLSAgICBPTVhfUzE2ICpwUHJlZEJ1ZkNvbCwKLSAgICBPTVhfSU5UIGN1clFQLAotICAgIE9NWF9JTlQgcHJlZFFQLAotICAgIE9NWF9JTlQgcHJlZERpciwKLSAgICBPTVhfSU5UIEFDUHJlZEZsYWcsCi0gICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9NQ1JlY29uQmxvY2sgICAoNi4yLjUuNS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgbW90aW9uIGNvbXBlbnNhdGlvbiBwcmVkaWN0aW9uIGZvciBhbiA4eDggYmxvY2sgdXNpbmcgCi0gKiBpbnRlcnBvbGF0aW9uIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuMi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIGJsb2NrIGluIHRoZSByZWZlcmVuY2UgcGxhbmUuIAotICogICBzcmNTdGVwIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIAotICogICAgICAgICAgICByZWZlcmVuY2UgcGxhbmUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIGRzdFN0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgCi0gKiAgICAgICAgICAgIGRlc3RpbmF0aW9uIHBsYW5lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBwU3JjUmVzaWR1ZSAtIHBvaW50ZXIgdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgMTYtYml0IHByZWRpY3Rpb24gCi0gKiAgICAgICAgICAgIHJlc2lkdWFsczsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIElmIHRoZSBwb2ludGVyIGlzIE5VTEwsIHRoZW4gCi0gKiAgICAgICAgICAgIG5vIHByZWRpY3Rpb24gaXMgZG9uZSwgb25seSBtb3Rpb24gY29tcGVuc2F0aW9uLCBpLmUuLCB0aGUgYmxvY2sgCi0gKiAgICAgICAgICAgIGlzIG1vdmVkIHdpdGggaW50ZXJwb2xhdGlvbi4gCi0gKiAgIHByZWRpY3RUeXBlIC0gYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiB0eXBlLCBhcyBkZWZpbmVkIGluIHNlY3Rpb24gCi0gKiAgICAgICAgICAgIDYuMi4xLjIuIAotICogICBybmRWYWwgLSByb3VuZGluZyBjb250cm9sIHBhcmFtZXRlcjogMCAtIGRpc2FibGVkOyAxIC0gZW5hYmxlZC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuICBJZiAKLSAqICAgICAgICAgICAgcHJlZGljdGlvbiByZXNpZHVhbHMgYXJlIGFkZGVkIHRoZW4gb3V0cHV0IGludGVuc2l0aWVzIGFyZSAKLSAqICAgICAgICAgICAgY2xpcHBlZCB0byB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAotICogICAgLSAgICBwRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHBTcmNSZXNpZHVlIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMgb3IgcERzdC4gCi0gKiAgICAtICAgIGVpdGhlciBzcmNTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgIGludmFsaWQgdHlwZSBzcGVjaWZpZWQgZm9yIHRoZSBwYXJhbWV0ZXIgcHJlZGljdFR5cGUuIAotICogICAgLSAgICB0aGUgcGFyYW1ldGVyIHJuZFZhbCBpcyBub3QgZXF1YWwgZWl0aGVyIHRvIDAgb3IgMS4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX01DUmVjb25CbG9jayAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIE9NWF9JTlQgc3JjU3RlcCwKLSAgICBjb25zdCBPTVhfUzE2ICpwU3JjUmVzaWR1ZSwKLSAgICBPTVhfVTggKnBEc3QsCi0gICAgT01YX0lOVCBkc3RTdGVwLAotICAgIE9NWF9JTlQgcHJlZGljdFR5cGUsCi0gICAgT01YX0lOVCBybmRWYWwKLSk7Ci0KLQotCi0vKiA2LjMuMS4xIEludHJhIDE2eDE2IFByZWRpY3Rpb24gTW9kZXMgICovCi0vKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgaW50cmFfMTZ4MTYgbWFjcm9ibG9jayBwcmVkaWN0aW9uIG1vZGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgT01YX1ZDXzE2WDE2X1ZFUlQgPSAwLCAgLyoqIEludHJhXzE2eDE2X1ZlcnRpY2FsICovCi0gICAgT01YX1ZDXzE2WDE2X0hPUiA9IDEsICAgLyoqIEludHJhXzE2eDE2X0hvcml6b250YWwgKi8KLSAgICBPTVhfVkNfMTZYMTZfREMgPSAyLCAgICAvKiogSW50cmFfMTZ4MTZfREMgKi8KLSAgICBPTVhfVkNfMTZYMTZfUExBTkUgPSAzICAvKiogSW50cmFfMTZ4MTZfUGxhbmUgKi8gCi19IE9NWFZDTTRQMTBJbnRyYTE2eDE2UHJlZE1vZGU7Ci0KLQotCi0vKiA2LjMuMS4yIEludHJhIDR4NCBQcmVkaWN0aW9uIE1vZGVzICAqLwotLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIGludHJhXzR4NCBtYWNyb2Jsb2NrIHByZWRpY3Rpb24gbW9kZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBPTVhfVkNfNFg0X1ZFUlQgPSAwLCAgICAgLyoqIEludHJhXzR4NF9WZXJ0aWNhbCAqLwotICAgIE9NWF9WQ180WDRfSE9SID0gMSwgICAgICAvKiogSW50cmFfNHg0X0hvcml6b250YWwgKi8KLSAgICBPTVhfVkNfNFg0X0RDID0gMiwgICAgICAgLyoqIEludHJhXzR4NF9EQyAqLwotICAgIE9NWF9WQ180WDRfRElBR19ETCA9IDMsICAvKiogSW50cmFfNHg0X0RpYWdvbmFsX0Rvd25fTGVmdCAqLwotICAgIE9NWF9WQ180WDRfRElBR19EUiA9IDQsICAvKiogSW50cmFfNHg0X0RpYWdvbmFsX0Rvd25fUmlnaHQgKi8KLSAgICBPTVhfVkNfNFg0X1ZSID0gNSwgICAgICAgLyoqIEludHJhXzR4NF9WZXJ0aWNhbF9SaWdodCAqLwotICAgIE9NWF9WQ180WDRfSEQgPSA2LCAgICAgICAvKiogSW50cmFfNHg0X0hvcml6b250YWxfRG93biAqLwotICAgIE9NWF9WQ180WDRfVkwgPSA3LCAgICAgICAvKiogSW50cmFfNHg0X1ZlcnRpY2FsX0xlZnQgKi8KLSAgICBPTVhfVkNfNFg0X0hVID0gOCAgICAgICAgLyoqIEludHJhXzR4NF9Ib3Jpem9udGFsX1VwICovIAotfSBPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZTsKLQotCi0KLS8qIDYuMy4xLjMgQ2hyb21hIFByZWRpY3Rpb24gTW9kZXMgICovCi0vKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgaW50cmEgY2hyb21hIHByZWRpY3Rpb24gbW9kZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBPTVhfVkNfQ0hST01BX0RDID0gMCwgICAgLyoqIEludHJhX0Nocm9tYV9EQyAqLwotICAgIE9NWF9WQ19DSFJPTUFfSE9SID0gMSwgICAvKiogSW50cmFfQ2hyb21hX0hvcml6b250YWwgKi8KLSAgICBPTVhfVkNfQ0hST01BX1ZFUlQgPSAyLCAgLyoqIEludHJhX0Nocm9tYV9WZXJ0aWNhbCAqLwotICAgIE9NWF9WQ19DSFJPTUFfUExBTkUgPSAzICAvKiogSW50cmFfQ2hyb21hX1BsYW5lICovIAotfSBPTVhWQ000UDEwSW50cmFDaHJvbWFQcmVkTW9kZTsKLQotCi0KLS8qIDYuMy4xLjQgTW90aW9uIEVzdGltYXRpb24gTW9kZXMgICovCi0vKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgSC4yNjQgbW90aW9uIGVzdGltYXRpb24gbW9kZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBPTVhfVkNfTTRQMTBfRkFTVF9TRUFSQ0ggPSAwLCAvKiogRmFzdCBtb3Rpb24gc2VhcmNoICovCi0gICAgT01YX1ZDX000UDEwX0ZVTExfU0VBUkNIID0gMSAgLyoqIEZ1bGwgbW90aW9uIHNlYXJjaCAqLyAKLX0gT01YVkNNNFAxME1FTW9kZTsKLQotCi0KLS8qIDYuMy4xLjUgTWFjcm9ibG9jayBUeXBlcyAgKi8KLS8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBILjI2NCBtYWNyb2Jsb2NrIHR5cGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgT01YX1ZDX1BfMTZ4MTYgID0gMCwgLyogZGVmaW5lZCBieSBbSVNPMTQ0OTYtMTBdICovCi0gICAgT01YX1ZDX1BfMTZ4OCAgPSAxLAotICAgIE9NWF9WQ19QXzh4MTYgID0gMiwKLSAgICBPTVhfVkNfUF84eDggID0gMywKLSAgICBPTVhfVkNfUFJFRjBfOHg4ICA9IDQsCi0gICAgT01YX1ZDX0lOVEVSX1NLSVAgID0gNSwKLSAgICBPTVhfVkNfSU5UUkFfNHg0ICA9IDgsCi0gICAgT01YX1ZDX0lOVFJBXzE2eDE2ICA9IDksCi0gICAgT01YX1ZDX0lOVFJBX1BDTSA9IDEwIAotfSBPTVhWQ000UDEwTWFjcm9ibG9ja1R5cGU7Ci0KLQotCi0vKiA2LjMuMS42IFN1Yi1NYWNyb2Jsb2NrIFR5cGVzICAqLwotLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIEguMjY0IHN1Yi1tYWNyb2Jsb2NrIHR5cGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgT01YX1ZDX1NVQl9QXzh4OCA9IDAsIC8qIGRlZmluZWQgYnkgW0lTTzE0NDk2LTEwXSAqLwotICAgIE9NWF9WQ19TVUJfUF84eDQgPSAxLAotICAgIE9NWF9WQ19TVUJfUF80eDggPSAyLAotICAgIE9NWF9WQ19TVUJfUF80eDQgPSAzIAotfSBPTVhWQ000UDEwU3ViTWFjcm9ibG9ja1R5cGU7Ci0KLQotCi0vKiA2LjMuMS43IFZhcmlhYmxlIExlbmd0aCBDb2RpbmcgKFZMQykgSW5mb3JtYXRpb24gICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBPTVhfVTggdVRyYWlsaW5nX09uZXM7ICAgICAgLyogVHJhaWxpbmcgb25lczsgMyBhdCBtb3N0ICovCi0gICAgT01YX1U4IHVUcmFpbGluZ19PbmVfU2lnbnM7IC8qIFRyYWlsaW5nIG9uZXMgc2lnbmFsICovCi0gICAgT01YX1U4IHVOdW1Db2VmZnM7ICAgICAgICAgIC8qIFRvdGFsIG51bWJlciBvZiBub24temVybyBjb2VmcywgaW5jbHVkaW5nIHRyYWlsaW5nIG9uZXMgKi8KLSAgICBPTVhfVTggdVRvdGFsWmVyb3M7ICAgICAgICAgLyogVG90YWwgbnVtYmVyIG9mIHplcm8gY29lZnMgKi8KLSAgICBPTVhfUzE2IGlMZXZlbHNbMTZdOyAgICAgICAgLyogTGV2ZWxzIG9mIG5vbi16ZXJvIGNvZWZzLCBpbiByZXZlcnNlIHppZy16YWcgb3JkZXIgKi8KLSAgICBPTVhfVTggdVJ1bnNbMTZdOyAgICAgICAgICAgLyogUnVucyBmb3IgbGV2ZWxzIGFuZCB0cmFpbGluZyBvbmVzLCBpbiByZXZlcnNlIHppZy16YWcgb3JkZXIgKi8KLX0gT01YVkNNNFAxMFZMQ0luZm87Ci0KLQotCi0vKiA2LjMuMS44IE1hY3JvYmxvY2sgSW5mb3JtYXRpb24gICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBPTVhfUzMyIHNsaWNlSWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzbGljZSBudW1iZXIgKi8KLSAgICBPTVhWQ000UDEwTWFjcm9ibG9ja1R5cGUgbWJUeXBlOyAgICAgICAgICAvKiBNQiB0eXBlICovCi0gICAgT01YVkNNNFAxMFN1Yk1hY3JvYmxvY2tUeXBlIHN1Yk1CVHlwZVs0XTsgLyogc3ViLWJsb2NrIHR5cGUgKi8KLSAgICBPTVhfUzMyIHFweTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBxcCBmb3IgbHVtYSAqLwotICAgIE9NWF9TMzIgcXBjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHFwIGZvciBjaHJvbWEgKi8KLSAgICBPTVhfVTMyIGNicHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDQlAgTHVtYSAqLwotICAgIE9NWF9VMzIgY2JwYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENCUCBDaHJvbWEgKi8KLSAgICBPTVhWQ01vdGlvblZlY3RvciBwTVYwWzRdWzRdOyAvKiBtb3Rpb24gdmVjdG9yLCByZXByZXNlbnRlZCB1c2luZyAxLzQtcGVsIHVuaXRzLCBwTVYwW2Jsb2NreV1bYmxvY2t4XSAoYmxvY2t5ID0gMH4zLCBibG9ja3ggPTB+MykgKi8KLSAgICBPTVhWQ01vdGlvblZlY3RvciBwTVZQcmVkWzRdWzRdOyAvKiBtb3Rpb24gdmVjdG9yIHByZWRpY3Rpb24sIFJlcHJlc2VudGVkIHVzaW5nIDEvNC1wZWwgdW5pdHMsIHBNVlByZWRbYmxvY2t5XVtibG9ja3hdIChibG9ja3kgPSAwfjMsIGJsb2NreCA9IDB+MykgKi8KLSAgICBPTVhfVTggcFJlZkwwSWR4WzRdOyAgICAgICAgICAgICAgICAgICAgICAvKiByZWZlcmVuY2UgcGljdHVyZSBpbmRpY2VzICovCi0gICAgT01YVkNNNFAxMEludHJhMTZ4MTZQcmVkTW9kZSBJbnRyYTE2eDE2UHJlZE1vZGU7IC8qIGJlc3QgaW50cmEgMTZ4MTYgcHJlZGljdGlvbiBtb2RlICovCi0gICAgT01YVkNNNFAxMEludHJhNHg0UHJlZE1vZGUgcEludHJhNHg0UHJlZE1vZGVbMTZdOyAvKiBiZXN0IGludHJhIDR4NCBwcmVkaWN0aW9uIG1vZGUgZm9yIGVhY2ggYmxvY2ssIHBNVjAgaW5kZXhlZCBhcyBhYm92ZSAqLwotfSBPTVhWQ000UDEwTUJJbmZvLCAqT01YVkNNNFAxME1CSW5mb1B0cjsKLQotCi0KLS8qIDYuMy4xLjkgTW90aW9uIEVzdGltYXRpb24gUGFyYW1ldGVycyAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE9NWF9TMzIgYmxvY2tTcGxpdEVuYWJsZTh4ODsgLyogZW5hYmxlcyAxNng4LCA4eDE2LCA4eDggKi8KLSAgICBPTVhfUzMyIGJsb2NrU3BsaXRFbmFibGU0eDQ7IC8qIGVuYWJsZSBzcGxpdHRpbmcgb2YgOHg0LCA0eDgsIDR4NCBibG9ja3MgKi8KLSAgICBPTVhfUzMyIGhhbGZTZWFyY2hFbmFibGU7Ci0gICAgT01YX1MzMiBxdWFydGVyU2VhcmNoRW5hYmxlOwotICAgIE9NWF9TMzIgaW50cmFFbmFibGU0eDQ7ICAgICAgLyogMT1lbmFibGUsIDA9ZGlzYWJsZSAqLwotICAgIE9NWF9TMzIgc2VhcmNoUmFuZ2UxNngxNjsgICAgLyogaW50ZWdlciBwaXhlbCB1bml0cyAqLwotICAgIE9NWF9TMzIgc2VhcmNoUmFuZ2U4eDg7Ci0gICAgT01YX1MzMiBzZWFyY2hSYW5nZTR4NDsKLX0gT01YVkNNNFAxME1FUGFyYW1zOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCAgICg2LjMuMy4xLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtIEludHJhXzR4NCBwcmVkaWN0aW9uIGZvciBsdW1hIHNhbXBsZXMuIElmIHRoZSB1cHBlci1yaWdodCBibG9jayBpcyAKLSAqIG5vdCBhdmFpbGFibGUsIHRoZW4gZHVwbGljYXRpb24gd29yayBzaG91bGQgYmUgaGFuZGxlZCBpbnNpZGUgdGhlIGZ1bmN0aW9uLiAKLSAqIFVzZXJzIG5lZWQgbm90IGRlZmluZSB0aGVtIG91dHNpZGUuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNMZWZ0IC0gIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiA0IGxlZnQgcGl4ZWxzOiAKLSAqICAgICAgICAgICAgICAgICAgcFt4LCB5XSAoeCA9IC0xLCB5ID0gMC4uMykgCi0gKiAgIHBTcmNBYm92ZSAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiA4IGFib3ZlIHBpeGVsczogCi0gKiAgICAgICAgICAgICAgICAgIHBbeCx5XSAoeCA9IDAuLjcsIHkgPS0xKTsgCi0gKiAgICAgICAgICAgICAgIG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBTcmNBYm92ZUxlZnQgLSBQb2ludGVyIHRvIHRoZSBhYm92ZSBsZWZ0IHBpeGVsczogcFt4LHldICh4ID0gLTEsIHkgPSAtMSkgCi0gKiAgIGxlZnRTdGVwIC0gU3RlcCBvZiBsZWZ0IHBpeGVsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAotICogICBkc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIHByZWRNb2RlIC0gSW50cmFfNHg0IHByZWRpY3Rpb24gbW9kZS4gCi0gKiAgIGF2YWlsYWJpbGl0eSAtIE5laWdoYm9yaW5nIDR4NCBibG9jayBhdmFpbGFiaWxpdHkgZmxhZywgcmVmZXIgdG8gCi0gKiAgICAgICAgICAgICAiTmVpZ2hib3JpbmcgTWFjcm9ibG9jayBBdmFpbGFiaWxpdHkiIC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCi0gKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAotICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKLSAqICAgIHBEc3QgaXMgTlVMTC4gCi0gKiAgICBkc3RTdGVwIDwgNCwgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgIGxlZnRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIAotICogICAgcHJlZE1vZGUgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSBvZiBlbnVtZXJhdGlvbiAKLSAqICAgICAgICAgICAgICBPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X1ZFUlQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX1VQUEVSIAotICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFt4LC0xXSAoeCA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9IT1IsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCi0gKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0RJQUdfREwsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCi0gKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSIGluZGljYXRpbmcgcFt4LCAtMV0gKHggPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfRElBR19EUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKLSAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKLSAqICAgICAgICAgICAgICBwW3gsLTFdICh4ID0gMC4uMyksIG9yIHBbLTEseV0gKHkgPSAwLi4zKSBvciBwWy0xLC0xXSBpcyBub3QgCi0gKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfVlIsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCi0gKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCi0gKiAgICAgICAgICAgICAgcFt4LC0xXSAoeCA9IDAuLjMpLCBvciBwWy0xLHldICh5ID0gMC4uMykgb3IgcFstMSwtMV0gaXMgbm90IAotICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0hELCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAotICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAotICogICAgICAgICAgICAgIHBbeCwtMV0gKHggPSAwLi4zKSwgb3IgcFstMSx5XSAoeSA9IDAuLjMpIG9yIHBbLTEsLTFdIGlzIG5vdCAKLSAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9WTCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfVVBQRVIgCi0gKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwW3gsLTFdICh4ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0hVLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19MRUZUIAotICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFstMSx5XSAoeSA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSLCBidXQgcFNyY0Fib3ZlIGlzIE5VTEwuIAotICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX0xFRlQsIGJ1dCBwU3JjTGVmdCBpcyBOVUxMLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUl9MRUZULCBidXQgcFNyY0Fib3ZlTGVmdCBpcyBOVUxMLiAKLSAqICAgIGVpdGhlciBwU3JjQWJvdmUgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIAotICoKLSAqIE5vdGU6IAotICogICAgIHBTcmNBYm92ZSwgcFNyY0Fib3ZlLCBwU3JjQWJvdmVMZWZ0IG1heSBiZSBpbnZhbGlkIHBvaW50ZXJzIGlmIAotICogICAgIHRoZXkgYXJlIG5vdCB1c2VkIGJ5IGludHJhIHByZWRpY3Rpb24gYXMgaW1wbGllZCBpbiBwcmVkTW9kZS4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNMZWZ0LAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlTGVmdCwKLSAgICBPTVhfVTggKnBEc3QsCi0gICAgT01YX0lOVCBsZWZ0U3RlcCwKLSAgICBPTVhfSU5UIGRzdFN0ZXAsCi0gICAgT01YVkNNNFAxMEludHJhNHg0UHJlZE1vZGUgcHJlZE1vZGUsCi0gICAgT01YX1MzMiBhdmFpbGFiaWxpdHkKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYgICAoNi4zLjMuMS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybSBJbnRyYV8xNngxNiBwcmVkaWN0aW9uIGZvciBsdW1hIHNhbXBsZXMuIElmIHRoZSB1cHBlci1yaWdodCBibG9jayAKLSAqIGlzIG5vdCBhdmFpbGFibGUsIHRoZW4gZHVwbGljYXRpb24gd29yayBzaG91bGQgYmUgaGFuZGxlZCBpbnNpZGUgdGhlIAotICogZnVuY3Rpb24uIFVzZXJzIG5lZWQgbm90IGRlZmluZSB0aGVtIG91dHNpZGUuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNMZWZ0IC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGxlZnQgcGl4ZWxzOiBwW3gsIHldICh4ID0gLTEsIHkgPSAKLSAqICAgICAgICAgICAgMC4uMTUpIAotICogICBwU3JjQWJvdmUgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgYWJvdmUgcGl4ZWxzOiBwW3gseV0gKHggPSAwLi4xNSwgCi0gKiAgICAgICAgICAgIHk9IC0xKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBTcmNBYm92ZUxlZnQgLSBQb2ludGVyIHRvIHRoZSBhYm92ZSBsZWZ0IHBpeGVsczogcFt4LHldICh4ID0gLTEsIHkgPSAtMSkgCi0gKiAgIGxlZnRTdGVwIC0gU3RlcCBvZiBsZWZ0IHBpeGVsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgZHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgcHJlZE1vZGUgLSBJbnRyYV8xNngxNiBwcmVkaWN0aW9uIG1vZGUsIHBsZWFzZSByZWZlciB0byBzZWN0aW9uIDMuNC4xLiAKLSAqICAgYXZhaWxhYmlsaXR5IC0gTmVpZ2hib3JpbmcgMTZ4MTYgTUIgYXZhaWxhYmlsaXR5IGZsYWcuIFJlZmVyIHRvIAotICogICAgICAgICAgICAgICAgICBzZWN0aW9uIDMuNC40LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKLSAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCi0gKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAotICogICAgcERzdCBpcyBOVUxMLiAKLSAqICAgIGRzdFN0ZXAgPCAxNi4gb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgICBsZWZ0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgICBwcmVkTW9kZSBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlIG9mIGVudW1lcmF0aW9uIAotICogICAgICAgICAgICAgIE9NWFZDTTRQMTBJbnRyYTE2eDE2UHJlZE1vZGUgCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfMTZYMTZfVkVSVCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKLSAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVIgaW5kaWNhdGluZyBwW3gsLTFdICh4ID0gMC4uMTUpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzE2WDE2X0hPUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfTEVGVCAKLSAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbLTEseV0gKHkgPSAwLi4xNSkgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfMTZYMTZfUExBTkUsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCi0gKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCi0gKiAgICAgICAgICAgICAgcFt4LC0xXSh4ID0gMC4uMTUpLCBvciBwWy0xLHldICh5ID0gMC4uMTUpLCBvciBwWy0xLC0xXSBpcyBub3QgCi0gKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUiwgYnV0IHBTcmNBYm92ZSBpcyBOVUxMLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19MRUZULCBidXQgcFNyY0xlZnQgaXMgTlVMTC4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVJfTEVGVCwgYnV0IHBTcmNBYm92ZUxlZnQgaXMgTlVMTC4gCi0gKiAgICBlaXRoZXIgcFNyY0Fib3ZlIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgCi0gKgotICogTm90ZTogCi0gKiAgICAgcFNyY0Fib3ZlLCBwU3JjQWJvdmUsIHBTcmNBYm92ZUxlZnQgbWF5IGJlIGludmFsaWQgcG9pbnRlcnMgaWYgCi0gKiAgICAgdGhleSBhcmUgbm90IHVzZWQgYnkgaW50cmEgcHJlZGljdGlvbiBpbXBsaWVkIGluIHByZWRNb2RlLiAKLSAqIE5vdGU6IAotICogICAgIE9NWF9WQ19VUFBFUl9SSUdIVCBpcyBub3QgdXNlZCBpbiBpbnRyYV8xNngxNiBsdW1hIHByZWRpY3Rpb24uIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNMZWZ0LAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlTGVmdCwKLSAgICBPTVhfVTggKnBEc3QsCi0gICAgT01YX0lOVCBsZWZ0U3RlcCwKLSAgICBPTVhfSU5UIGRzdFN0ZXAsCi0gICAgT01YVkNNNFAxMEludHJhMTZ4MTZQcmVkTW9kZSBwcmVkTW9kZSwKLSAgICBPTVhfUzMyIGF2YWlsYWJpbGl0eQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDggICAoNi4zLjMuMS4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgaW50cmEgcHJlZGljdGlvbiBmb3IgY2hyb21hIHNhbXBsZXMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNMZWZ0IC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDggbGVmdCBwaXhlbHM6IHBbeCwgeV0gKHggPSAtMSwgeT0gCi0gKiAgICAgICAgICAgIDAuLjcpLiAKLSAqICAgcFNyY0Fib3ZlIC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDggYWJvdmUgcGl4ZWxzOiBwW3gseV0gKHggPSAwLi43LCB5IAotICogICAgICAgICAgICA9IC0xKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBTcmNBYm92ZUxlZnQgLSBQb2ludGVyIHRvIHRoZSBhYm92ZSBsZWZ0IHBpeGVsczogcFt4LHldICh4ID0gLTEsIHkgPSAtMSkgCi0gKiAgIGxlZnRTdGVwIC0gU3RlcCBvZiBsZWZ0IHBpeGVsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBkc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIHByZWRNb2RlIC0gSW50cmEgY2hyb21hIHByZWRpY3Rpb24gbW9kZSwgcGxlYXNlIHJlZmVyIHRvIHNlY3Rpb24gMy40LjMuIAotICogICBhdmFpbGFiaWxpdHkgLSBOZWlnaGJvcmluZyBjaHJvbWEgYmxvY2sgYXZhaWxhYmlsaXR5IGZsYWcsIHBsZWFzZSByZWZlciAKLSAqICAgICAgICAgICAgdG8gICJOZWlnaGJvcmluZyBNYWNyb2Jsb2NrIEF2YWlsYWJpbGl0eSIuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKLSAqICAgIElmIGFueSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCi0gKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAotICogICAgcERzdCBpcyBOVUxMLiAKLSAqICAgIGRzdFN0ZXAgPCA4IG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICBsZWZ0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIHByZWRNb2RlIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgZW51bWVyYXRpb24gCi0gKiAgICAgICAgICAgICAgT01YVkNNNFAxMEludHJhQ2hyb21hUHJlZE1vZGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDX0NIUk9NQV9WRVJULCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAotICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUiBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi43KSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ19DSFJPTUFfSE9SLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19MRUZUIAotICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFstMSx5XSAoeSA9IDAuLjcpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDX0NIUk9NQV9QTEFORSwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKLSAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKLSAqICAgICAgICAgICAgICBwW3gsLTFdKHggPSAwLi43KSwgb3IgcFstMSx5XSAoeSA9IDAuLjcpLCBvciBwWy0xLC0xXSBpcyBub3QgCi0gKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUiwgYnV0IHBTcmNBYm92ZSBpcyBOVUxMLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19MRUZULCBidXQgcFNyY0xlZnQgaXMgTlVMTC4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVJfTEVGVCwgYnV0IHBTcmNBYm92ZUxlZnQgaXMgTlVMTC4gCi0gKiAgICBlaXRoZXIgcFNyY0Fib3ZlIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkuICAKLSAqCi0gKiAgTm90ZTogcFNyY0Fib3ZlLCBwU3JjQWJvdmUsIHBTcmNBYm92ZUxlZnQgbWF5IGJlIGludmFsaWQgcG9pbnRlciBpZiAKLSAqICB0aGV5IGFyZSBub3QgdXNlZCBieSBpbnRyYSBwcmVkaWN0aW9uIGltcGxpZWQgaW4gcHJlZE1vZGUuIAotICoKLSAqICBOb3RlOiBPTVhfVkNfVVBQRVJfUklHSFQgaXMgbm90IHVzZWQgaW4gaW50cmEgY2hyb21hIHByZWRpY3Rpb24uIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjTGVmdCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZUxlZnQsCi0gICAgT01YX1U4ICpwRHN0LAotICAgIE9NWF9JTlQgbGVmdFN0ZXAsCi0gICAgT01YX0lOVCBkc3RTdGVwLAotICAgIE9NWFZDTTRQMTBJbnRyYUNocm9tYVByZWRNb2RlIHByZWRNb2RlLAotICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hICAgKDYuMy4zLjIuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHF1YXJ0ZXItcGl4ZWwgaW50ZXJwb2xhdGlvbiBmb3IgaW50ZXIgbHVtYSBNQi4gSXQgaXMgYXNzdW1lZCB0aGF0IAotICogdGhlIGZyYW1lIGlzIGFscmVhZHkgcGFkZGVkIHdoZW4gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgc291cmNlIHJlZmVyZW5jZSBmcmFtZSBidWZmZXIgCi0gKiAgIHNyY1N0ZXAgLSByZWZlcmVuY2UgZnJhbWUgc3RlcCwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiByb2kud2lkdGggCi0gKiAgIGRzdFN0ZXAgLSBkZXN0aW5hdGlvbiBmcmFtZSBzdGVwLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIAotICogICAgICAgICAgICByb2kud2lkdGggCi0gKiAgIGR4IC0gRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvciBjb21wb25lbnQgaW4gMS80IHBpeGVsIAotICogICAgICAgICAgICB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsM10gCi0gKiAgIGR5IC0gRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgeSBjb21wb25lbnQgaW4gMS80IHBpeGVsIAotICogICAgICAgICAgICB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsM10gCi0gKiAgIHJvaSAtIERpbWVuc2lvbiBvZiB0aGUgaW50ZXJwb2xhdGlvbiByZWdpb247IHRoZSBwYXJhbWV0ZXJzIHJvaS53aWR0aCBhbmQgCi0gKiAgICAgICAgICAgIHJvaS5oZWlnaHQgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gZnJhbWUgYnVmZmVyOiAKLSAqICAgICAgICAgIGlmIHJvaS53aWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCi0gKiAgICAgICAgICBpZiByb2kud2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAotICogICAgICAgICAgaWYgcm9pLndpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKLSAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCi0gKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAotICogICAgcFNyYyBvciBwRHN0IGlzIE5VTEwuIAotICogICAgc3JjU3RlcCBvciBkc3RTdGVwIDwgcm9pLndpZHRoLiAKLSAqICAgIGR4IG9yIGR5IGlzIG91dCBvZiByYW5nZSBbMCwzXS4gCi0gKiAgICByb2kud2lkdGggb3Igcm9pLmhlaWdodCBpcyBvdXQgb2YgcmFuZ2UgezQsIDgsIDE2fS4gCi0gKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gNCwgYnV0IHBEc3QgaXMgbm90IDQgYnl0ZSBhbGlnbmVkLiAKLSAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byA4IG9yIDE2LCBidXQgcERzdCBpcyBub3QgOCBieXRlIGFsaWduZWQuIAotICogICAgc3JjU3RlcCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgT01YX1MzMiBzcmNTdGVwLAotICAgIE9NWF9VOCAqcERzdCwKLSAgICBPTVhfUzMyIGRzdFN0ZXAsCi0gICAgT01YX1MzMiBkeCwKLSAgICBPTVhfUzMyIGR5LAotICAgIE9NWFNpemUgcm9pCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEgICAoNi4zLjMuMi4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgMS84LXBpeGVsIGludGVycG9sYXRpb24gZm9yIGludGVyIGNocm9tYSBNQi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtUG9pbnRlciB0byB0aGUgc291cmNlIHJlZmVyZW5jZSBmcmFtZSBidWZmZXIgCi0gKiAgIHNyY1N0ZXAgLVJlZmVyZW5jZSBmcmFtZSBzdGVwIGluIGJ5dGVzIAotICogICBkc3RTdGVwIC1EZXN0aW5hdGlvbiBmcmFtZSBzdGVwIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgCi0gKiAgICAgICAgICAgIHJvaS53aWR0aC4gCi0gKiAgIGR4IC1GcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgCi0gKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw3XSAKLSAqICAgZHkgLUZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgCi0gKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw3XSAKLSAqICAgcm9pIC1EaW1lbnNpb24gb2YgdGhlIGludGVycG9sYXRpb24gcmVnaW9uOyB0aGUgcGFyYW1ldGVycyByb2kud2lkdGggYW5kIAotICogICAgICAgICAgICByb2kuaGVpZ2h0IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDIsIDQsIG9yIDguIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC1Qb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBmcmFtZSBidWZmZXI6Ci0gKiAgICAgICAgIGlmIHJvaS53aWR0aD09MiwgIDItYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCi0gKiAgICAgICAgIGlmIHJvaS53aWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCi0gKiAgICAgICAgIGlmIHJvaS53aWR0aD09OCwgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAotICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKLSAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCi0gKiAgICBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCi0gKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgPCA4LiAKLSAqICAgIGR4IG9yIGR5IGlzIG91dCBvZiByYW5nZSBbMC03XS4gCi0gKiAgICByb2kud2lkdGggb3Igcm9pLmhlaWdodCBpcyBvdXQgb2YgcmFuZ2UgezIsNCw4fS4gCi0gKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gMiwgYnV0IHBEc3QgaXMgbm90IDItYnl0ZSBhbGlnbmVkLiAKLSAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byA0LCBidXQgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDgsIGJ1dCBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4gCi0gKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIE9NWF9TMzIgc3JjU3RlcCwKLSAgICBPTVhfVTggKnBEc3QsCi0gICAgT01YX1MzMiBkc3RTdGVwLAotICAgIE9NWF9TMzIgZHgsCi0gICAgT01YX1MzMiBkeSwKLSAgICBPTVhTaXplIHJvaQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSAgICg2LjMuMy4zLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyBvbiBmb3VyIHZlcnRpY2FsIGVkZ2VzIG9mIHRoZSBsdW1hIAotICogbWFjcm9ibG9jayAoMTZ4MTYpLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAotICogICBzcmNkc3RTdGVwIC1TdGVwIG9mIHRoZSBhcnJheXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIHBBbHBoYSAtQXJyYXkgb2Ygc2l6ZSAyIG9mIGFscGhhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBhbHBoYSAKLSAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyAKLSAqICAgICAgICAgICAgZm9yIHRoZSBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlKTsgcGVyIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIAotICogICAgICAgICAgICBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgcEJldGEgLUFycmF5IG9mIHNpemUgMiBvZiBiZXRhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBiZXRhIAotICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIAotICogICAgICAgICAgICBmb3IgdGhlIGludGVybmFsIHZlcnRpY2FsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBiZXRhIHZhbHVlcyAKLSAqICAgICAgICAgICAgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgcFRocmVzaG9sZHMgLUFycmF5IG9mIHNpemUgMTYgb2YgVGhyZXNob2xkcyAoVEMwKSAodmFsdWVzIGZvciB0aGUgbGVmdCAKLSAqICAgICAgICAgICAgZWRnZSBvZiBlYWNoIDR4NCBibG9jaywgYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgb3JkZXIpOyBtdXN0IAotICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5Li4gIFBlciBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IAotICogICAgICAgICAgICBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgcEJTIC1BcnJheSBvZiBzaXplIDE2IG9mIEJTIHBhcmFtZXRlcnMgKGFycmFuZ2VkIGluIHZlcnRpY2FsIGJsb2NrIAotICogICAgICAgICAgICBvcmRlcik7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIAotICogICAgICAgICAgICBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC1Qb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAotICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKLSAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCi0gKiAgICBFaXRoZXIgb2YgdGhlIHBvaW50ZXJzIGluIHBTcmNEc3QsIHBBbHBoYSwgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMgCi0gKiAgICAgICAgICAgICAgaXMgTlVMTC4gCi0gKiAgICBFaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgIHBTcmNEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAotICogICAgcEJldGFbMF0gYW5kL29yIHBCZXRhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgICBPbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi4xNV1pcyBvdXRzaWRlIG9mIHRoZSAKLSAqICAgICAgICAgICAgICByYW5nZSBbMCwyNV0uIAotICogICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgKHBCU1tpXT09NCAmJiAKLSAqICAgICAgICAgICAgICBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JICgKLSAgICBPTVhfVTggKnBTcmNEc3QsCi0gICAgT01YX1MzMiBzcmNkc3RTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAotICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCi0gICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKLSAgICBjb25zdCBPTVhfVTggKnBCUwotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSAgICg2LjMuMy4zLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyBvbiBmb3VyIGhvcml6b250YWwgZWRnZXMgb2YgdGhlIGx1bWEgCi0gKiBtYWNyb2Jsb2NrICgxNngxNikuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgIHNyY2RzdFN0ZXAgLSBzdGVwIG9mIHRoZSBhcnJheXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIHBBbHBoYSAtIGFycmF5IG9mIHNpemUgMiBvZiBhbHBoYSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyB0aGUgYWxwaGEgCi0gKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCi0gKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlKTsgcGVyIFtJU08xNDQ5Ni0xMF0gYWxwaGEgCi0gKiAgICAgICAgICAgIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgcEJldGEgLSBhcnJheSBvZiBzaXplIDIgb2YgYmV0YSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyB0aGUgYmV0YSAKLSAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIAotICogICAgICAgICAgICBpcyBmb3IgdGhlIGludGVybmFsIGhvcml6b250YWwgZWRnZSkuIFBlciBbSVNPMTQ0OTYtMTBdIGJldGEgCi0gKiAgICAgICAgICAgIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAotICogICBwVGhyZXNob2xkcyAtIGFycmF5IG9mIHNpemUgMTYgY29udGFpbmluZyB0aHJlc2hvbGRzLCBUQzAsIGZvciB0aGUgdG9wIAotICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2Ugb2YgZWFjaCA0eDQgYmxvY2ssIGFycmFuZ2VkIGluIGhvcml6b250YWwgYmxvY2sgCi0gKiAgICAgICAgICAgIG9yZGVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgW0lTTzE0NDk2IDEwXSAKLSAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgIHBCUyAtIGFycmF5IG9mIHNpemUgMTYgb2YgQlMgcGFyYW1ldGVycyAoYXJyYW5nZWQgaW4gaG9yaXpvbnRhbCBibG9jayAKLSAqICAgICAgICAgICAgb3JkZXIpOyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSAKLSAqICAgICAgICAgICAgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IDQuICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtUG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciwgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwQWxwaGEsIAotICogICAgICAgICAgICAgIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTLiAKLSAqICAgIC0gICAgZWl0aGVyIHBUaHJlc2hvbGRzIG9yIHBCUyBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCi0gKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICogICAgLSAgICBwQWxwaGFbMF0gYW5kL29yIHBBbHBoYVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgIC0gICAgcEJldGFbMF0gYW5kL29yIHBCZXRhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgICAtICAgIE9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjE1XSBpcyAKLSAqICAgICAgICAgb3V0c2lkZSBvZiB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgIC0gICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgCi0gKiAgICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JICgKLSAgICBPTVhfVTggKnBTcmNEc3QsCi0gICAgT01YX1MzMiBzcmNkc3RTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAotICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCi0gICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKLSAgICBjb25zdCBPTVhfVTggKnBCUwotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JICAgKDYuMy4zLjMuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIGZvdXIgdmVydGljYWwgZWRnZXMgb2YgdGhlIGNocm9tYSAKLSAqIG1hY3JvYmxvY2sgKDh4OCkuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgc3JjZHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBwQWxwaGEgLSBBcnJheSBvZiBzaXplIDIgb2YgYWxwaGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgYWxwaGEgCi0gKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyBmb3IgCi0gKiAgICAgICAgICAgIGludGVybmFsIHZlcnRpY2FsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgbXVzdCBiZSAKLSAqICAgICAgICAgICAgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAotICogICBwQmV0YSAtIEFycmF5IG9mIHNpemUgMiBvZiBiZXRhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBiZXRhIAotICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIAotICogICAgICAgICAgICBmb3IgdGhlIGludGVybmFsIHZlcnRpY2FsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBiZXRhIHZhbHVlcyAKLSAqICAgICAgICAgICAgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgcFRocmVzaG9sZHMgLSBBcnJheSBvZiBzaXplIDggY29udGFpbmluZyB0aHJlc2hvbGRzLCBUQzAsIGZvciB0aGUgbGVmdCAKLSAqICAgICAgICAgICAgdmVydGljYWwgZWRnZSBvZiBlYWNoIDR4MiBjaHJvbWEgYmxvY2ssIGFycmFuZ2VkIGluIHZlcnRpY2FsIAotICogICAgICAgICAgICBibG9jayBvcmRlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgUGVyIAotICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAotICogICBwQlMgLSBBcnJheSBvZiBzaXplIDE2IG9mIEJTIHBhcmFtZXRlcnMgKHZhbHVlcyBmb3IgZWFjaCAyeDIgY2hyb21hIAotICogICAgICAgICAgICBibG9jaywgYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgb3JkZXIpLiBUaGlzIHBhcmFtZXRlciBpcyB0aGUgCi0gKiAgICAgICAgICAgIHNhbWUgYXMgdGhlIHBCUyBwYXJhbWV0ZXIgcGFzc2VkIGludG8gRmlsdGVyRGVibG9ja0x1bWFfVmVyRWRnZTsgCi0gKiAgICAgICAgICAgIHZhbGlkIGluIHRoZSByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSAKLSAqICAgICAgICAgICAgcEJTW2ldPT0gNCBtYXkgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIAotICogICAgICAgICAgICBvbmx5IGlmIHBCU1tpXjNdPT0gNC4gIE11c3QgYmUgNCBieXRlIGFsaWduZWQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC1Qb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwQWxwaGEsIAotICogICAgICAgICAgICAgIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTLiAKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgICBwVGhyZXNob2xkcyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBwQWxwaGFbMF0gYW5kL29yIHBBbHBoYVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgIC0gICAgcEJldGFbMF0gYW5kL29yIHBCZXRhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgICAtICAgIE9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjddIGlzIG91dHNpZGUgCi0gKiAgICAgICAgIG9mIHRoZSByYW5nZSBbMCwyNV0uIAotICogICAgLSAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgCi0gKiAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKLSAqICAgIC0gICAgcEJTIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSAoCi0gICAgT01YX1U4ICpwU3JjRHN0LAotICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBBbHBoYSwKLSAgICBjb25zdCBPTVhfVTggKnBCZXRhLAotICAgIGNvbnN0IE9NWF9VOCAqcFRocmVzaG9sZHMsCi0gICAgY29uc3QgT01YX1U4ICpwQlMKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSAgICg2LjMuMy4zLjQpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyBvbiB0aGUgaG9yaXpvbnRhbCBlZGdlcyBvZiB0aGUgY2hyb21hIAotICogbWFjcm9ibG9jayAoOHg4KS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuIAotICogICBzcmNkc3RTdGVwIC0gYXJyYXkgc3RlcDsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBwQWxwaGEgLSBhcnJheSBvZiBzaXplIDIgY29udGFpbmluZyBhbHBoYSB0aHJlc2hvbGRzOyB0aGUgZmlyc3QgZWxlbWVudCAKLSAqICAgICAgICAgICAgY29udGFpbnMgdGhlIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgYW5kIHRoZSAKLSAqICAgICAgICAgICAgc2Vjb25kIGVsZW1lbnQgY29udGFpbnMgdGhlIHRocmVzaG9sZCBmb3IgaW50ZXJuYWwgaG9yaXpvbnRhbCAKLSAqICAgICAgICAgICAgZWRnZS4gIFBlciBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSAKLSAqICAgICAgICAgICAgWzAsMjU1XS4gCi0gKiAgIHBCZXRhIC0gYXJyYXkgb2Ygc2l6ZSAyIGNvbnRhaW5pbmcgYmV0YSB0aHJlc2hvbGRzOyB0aGUgZmlyc3QgZWxlbWVudCAKLSAqICAgICAgICAgICAgY29udGFpbnMgdGhlIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgYW5kIHRoZSAKLSAqICAgICAgICAgICAgc2Vjb25kIGVsZW1lbnQgY29udGFpbnMgdGhlIHRocmVzaG9sZCBmb3IgdGhlIGludGVybmFsIAotICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2UuICBQZXIgW0lTTzE0NDk2LTEwXSBiZXRhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSAKLSAqICAgICAgICAgICAgcmFuZ2UgWzAsMThdLiAKLSAqICAgcFRocmVzaG9sZHMgLSBhcnJheSBvZiBzaXplIDggY29udGFpbmluZyB0aHJlc2hvbGRzLCBUQzAsIGZvciB0aGUgdG9wIAotICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2Ugb2YgZWFjaCAyeDQgY2hyb21hIGJsb2NrLCBhcnJhbmdlZCBpbiBob3Jpem9udGFsIAotICogICAgICAgICAgICBibG9jayBvcmRlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgUGVyIAotICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAotICogICBwQlMgLSBhcnJheSBvZiBzaXplIDE2IGNvbnRhaW5pbmcgQlMgcGFyYW1ldGVycyBmb3IgZWFjaCAyeDIgY2hyb21hIAotICogICAgICAgICAgICBibG9jaywgYXJyYW5nZWQgaW4gaG9yaXpvbnRhbCBibG9jayBvcmRlcjsgdmFsaWQgaW4gdGhlIHJhbmdlIAotICogICAgICAgICAgICBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciAKLSAqICAgICAgICAgICAgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSA0LiAKLSAqICAgICAgICAgICAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqIAotICogICAgT01YX1N0c19CYWRBcmdFcnIsIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIGFueSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjRHN0LCBwQWxwaGEsIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTLiAKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgICBwVGhyZXNob2xkcyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBwQWxwaGFbMF0gYW5kL29yIHBBbHBoYVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgIC0gICAgcEJldGFbMF0gYW5kL29yIHBCZXRhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgICAtICAgIE9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjddIGlzIG91dHNpZGUgCi0gKiAgICAgICAgIG9mIHRoZSByYW5nZSBbMCwyNV0uIAotICogICAgLSAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKLSAqICAgICAgICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4KLSAqICAgIC0gICAgcEJTIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSAoCi0gICAgT01YX1U4ICpwU3JjRHN0LAotICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBBbHBoYSwKLSAgICBjb25zdCBPTVhfVTggKnBCZXRhLAotICAgIGNvbnN0IE9NWF9VOCAqcFRocmVzaG9sZHMsCi0gICAgY29uc3QgT01YX1U4ICpwQlMKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JICAgKDYuMy4zLjMuNSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgdGhlIGhvcml6b250YWwgYW5kIAotICogdmVydGljYWwgZWRnZXMgb2YgYSBsdW1hIG1hY3JvYmxvY2sgKDE2eDE2KS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgc3JjZHN0U3RlcCAtIGltYWdlIHdpZHRoOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBwQWxwaGEgLSBwb2ludGVyIHRvIGEgMngyIHRhYmxlIG9mIGFscGhhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyAKLSAqICAgICAgICAgICAgZm9sbG93czoge2V4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIAotICogICAgICAgICAgICBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9LiAgUGVyIAotICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgcEJldGEgLSBwb2ludGVyIHRvIGEgMngyIHRhYmxlIG9mIGJldGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIGZvbGxvd3M6IAotICogICAgICAgICAgICB7ZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgZXh0ZXJuYWwgCi0gKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0uICBQZXIgW0lTTzE0NDk2LTEwXSAKLSAqICAgICAgICAgICAgYmV0YSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgcFRocmVzaG9sZHMgLSBwb2ludGVyIHRvIGEgMTZ4MiB0YWJsZSBvZiB0aHJlc2hvbGQgKFRDMCksIG9yZ2FuaXplZCBhcyAKLSAqICAgICAgICAgICAgZm9sbG93czoge3ZhbHVlcyBmb3IgdGhlIGxlZnQgb3IgYWJvdmUgZWRnZSBvZiBlYWNoIDR4NCBibG9jaywgCi0gKiAgICAgICAgICAgIGFycmFuZ2VkIGluIHZlcnRpY2FsIGJsb2NrIG9yZGVyIGFuZCB0aGVuIGluIGhvcml6b250YWwgYmxvY2sgCi0gKiAgICAgICAgICAgIG9yZGVyfTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgUGVyIFtJU08xNDQ5Ni0xMF0gCi0gKiAgICAgICAgICAgIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAotICogICBwQlMgLSBwb2ludGVyIHRvIGEgMTZ4MiB0YWJsZSBvZiBCUyBwYXJhbWV0ZXJzIGFycmFuZ2VkIGluIHNjYW4gYmxvY2sgCi0gKiAgICAgICAgICAgIG9yZGVyIGZvciB2ZXJ0aWNhbCBlZGdlcyBhbmQgdGhlbiBob3Jpem9udGFsIGVkZ2VzOyB2YWxpZCBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IAotICogICAgICAgICAgICBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IAotICogICAgICAgICAgICA0LiBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIAotICogICAgLSAgICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwQWxwaGEsIAotICogICAgICAgICAgICAgIHBCZXRhLCBwVGhyZXNob2xkcyBvciBwQlMuIAotICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBlaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgIC0gICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcEFscGhhWzAuLjNdIGlzIG91dHNpZGUgdGhlIHJhbmdlIAotICogICAgICAgICAgICAgIFswLDI1NV0uIAotICogICAgLSAgICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQmV0YVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKLSAqICAgICAgICAgICAgICBbMCwxOF0uIAotICogICAgLSAgICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi4zMV1pcyBvdXRzaWRlIG9mIAotICogICAgICAgICAgICAgIHRoZSByYW5nZSBbMCwyNV0uIAotICogICAgLSAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKLSAqICAgICAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKLSAqICAgIC0gICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JICgKLSAgICBPTVhfVTggKnBTcmNEc3QsCi0gICAgT01YX1MzMiBzcmNkc3RTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAotICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCi0gICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKLSAgICBjb25zdCBPTVhfVTggKnBCUwotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSSAgICg2LjMuMy4zLjYpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NraW5nIGZpbHRlcmluZyBvbiBhbGwgZWRnZXMgb2YgdGhlIGNocm9tYSAKLSAqIG1hY3JvYmxvY2sgKDE2eDE2KS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuIAotICogICBzcmNkc3RTdGVwIC0gc3RlcCBvZiB0aGUgYXJyYXlzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIHBBbHBoYSAtIHBvaW50ZXIgdG8gYSAyeDIgYXJyYXkgb2YgYWxwaGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIAotICogICAgICAgICAgICBmb2xsb3dzOiB7ZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgCi0gKiAgICAgICAgICAgIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0uICBQZXIgCi0gKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAotICogICBwQmV0YSAtIHBvaW50ZXIgdG8gYSAyeDIgYXJyYXkgb2YgQmV0YSBUaHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogCi0gKiAgICAgICAgICAgIHsgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgZXh0ZXJuYWwgCi0gKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0uICBQZXIgW0lTTzE0NDk2LTEwXSAKLSAqICAgICAgICAgICAgYmV0YSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgcFRocmVzaG9sZHMgLSBhcnJheSBvZiBzaXplIDh4MiBvZiBUaHJlc2hvbGRzIChUQzApICh2YWx1ZXMgZm9yIHRoZSBsZWZ0IAotICogICAgICAgICAgICBvciBhYm92ZSBlZGdlIG9mIGVhY2ggNHgyIG9yIDJ4NCBibG9jaywgYXJyYW5nZWQgaW4gdmVydGljYWwgCi0gKiAgICAgICAgICAgIGJsb2NrIG9yZGVyIGFuZCB0aGVuIGluIGhvcml6b250YWwgYmxvY2sgb3JkZXIpOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiBQZXIgW0lTTzE0NDk2LTEwXSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJhbmdlIFswLDI1XS4gCi0gKiAgIHBCUyAtIGFycmF5IG9mIHNpemUgMTZ4MiBvZiBCUyBwYXJhbWV0ZXJzIChhcnJhbmdlZCBpbiBzY2FuIGJsb2NrIG9yZGVyIAotICogICAgICAgICAgICBmb3IgdmVydGljYWwgZWRnZXMgYW5kIHRoZW4gaG9yaXpvbnRhbCBlZGdlcyk7IHZhbGlkIGluIHRoZSAKLSAqICAgICAgICAgICAgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgCi0gKiAgICAgICAgICAgIG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gCi0gKiAgICAgICAgICAgIDQuICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIAotICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCwgcEFscGhhLCAKLSAqICAgICAgICAgICAgICBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUy4gCi0gKiAgICAtICAgcFNyY0RzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgIGVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQWxwaGFbMC4uM10gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgCi0gKiAgICAgICAgICAgICAgWzAsMjU1XS4gCi0gKiAgICAtICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcEJldGFbMC4uM10gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgCi0gKiAgICAgICAgICAgICAgWzAsMThdLiAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi4xNV1pcyBvdXRzaWRlIG9mIAotICogICAgICAgICAgICAgIHRoZSByYW5nZSBbMCwyNV0uIAotICogICAgLSAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00ICBmb3IgaT49NCwgb3IgCi0gKiAgICAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKLSAqICAgIC0gICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JICgKLSAgICBPTVhfVTggKnBTcmNEc3QsCi0gICAgT01YX1MzMiBzcmNkc3RTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAotICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCi0gICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKLSAgICBjb25zdCBPTVhfVTggKnBCUwotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMgICAoNi4zLjQuMS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgQ0FWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgcmFzdGVyIHNjYW4gZm9yIGEgMngyIGJsb2NrIG9mIAotICogQ2hyb21hRENMZXZlbC4gIFRoZSBkZWNvZGVkIGNvZWZmaWNpZW50cyBpbiB0aGUgcGFja2VkIHBvc2l0aW9uLWNvZWZmaWNpZW50IAotICogYnVmZmVyIGFyZSBzdG9yZWQgaW4gcmV2ZXJzZSB6aWctemFnIG9yZGVyLCBpLmUuLCB0aGUgZmlyc3QgYnVmZmVyIGVsZW1lbnQgCi0gKiBjb250YWlucyB0aGUgbGFzdCBub24temVybyBwb3N0aW9uLWNvZWZmaWNpZW50IHBhaXIgb2YgdGhlIGJsb2NrLiBXaXRoaW4gCi0gKiBlYWNoIHBvc2l0aW9uLWNvZWZmaWNpZW50IHBhaXIsIHRoZSBwb3NpdGlvbiBlbnRyeSBpbmRpY2F0ZXMgdGhlIAotICogcmFzdGVyLXNjYW4gcG9zaXRpb24gb2YgdGhlIGNvZWZmaWNpZW50LCB3aGlsZSB0aGUgY29lZmZpY2llbnQgZW50cnkgCi0gKiBjb250YWlucyB0aGUgY29lZmZpY2llbnQgdmFsdWUuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0gYnVmZmVyIAotICogICBwT2Zmc2V0IC0gUG9pbnRlciB0byBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW07IHZhbGlkIGluIHRoZSByYW5nZSBbMCw3XS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkIAotICogICBwT2Zmc2V0IC0gKnBPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQgCi0gKiAgIHBOdW1Db2VmZiAtIFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGlzIGJsb2NrIAotICogICBwcFBvc0NvZWZCdWYgLSBEb3VibGUgcG9pbnRlciB0byBkZXN0aW5hdGlvbiByZXNpZHVhbCAKLSAqICAgICAgICAgICAgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIuICBCdWZmZXIgcG9zaXRpb24gCi0gKiAgICAgICAgICAgICgqcHBQb3NDb2VmQnVmKSBpcyB1cGRhdGVkIHVwb24gcmV0dXJuLCB1bmxlc3MgdGhlcmUgYXJlIG9ubHkgCi0gKiAgICAgICAgICAgIHplcm8gY29lZmZpY2llbnRzIGluIHRoZSBjdXJyZW50bHkgZGVjb2RlZCBibG9jay4gIEluIHRoaXMgY2FzZSAKLSAqICAgICAgICAgICAgdGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byBieXBhc3MgdGhlIHRyYW5zZm9ybS9kZXF1YW50aXphdGlvbiBvZiAKLSAqICAgICAgICAgICAgdGhlIGVtcHR5IGJsb2Nrcy4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICoKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgcHBCaXRTdHJlYW0gb3IgcE9mZnNldCBpcyBOVUxMLiAKLSAqICAgIC0gICAgcHBQb3NDb2VmQnVmIG9yIHBOdW1Db2VmZiBpcyBOVUxMLiAKLSAqICAgIE9NWF9TdHNfRXJyIC0gaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGFuIGlsbGVnYWwgY29kZSBpcyBlbmNvdW50ZXJlZCBpbiB0aGUgYml0c3RyZWFtIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQyAoCi0gICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX1MzMipwT2Zmc2V0LAotICAgIE9NWF9VOCAqcE51bUNvZWZmLAotICAgIE9NWF9VOCAqKnBwUG9zQ29lZmJ1ZgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDICAgKDYuMy40LjEuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIENBVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciA0eDQgYmxvY2sgb2YgCi0gKiBJbnRyYTE2eDE2RENMZXZlbCwgSW50cmExNngxNkFDTGV2ZWwsIEx1bWFMZXZlbCwgYW5kIENocm9tYUFDTGV2ZWwuIEludmVyc2UgCi0gKiBmaWVsZCBzY2FuIGlzIG5vdCBzdXBwb3J0ZWQuIFRoZSBkZWNvZGVkIGNvZWZmaWNpZW50cyBpbiB0aGUgcGFja2VkIAotICogcG9zaXRpb24tY29lZmZpY2llbnQgYnVmZmVyIGFyZSBzdG9yZWQgaW4gcmV2ZXJzZSB6aWctemFnIG9yZGVyLCBpLmUuLCB0aGUgCi0gKiBmaXJzdCBidWZmZXIgZWxlbWVudCBjb250YWlucyB0aGUgbGFzdCBub24temVybyBwb3N0aW9uLWNvZWZmaWNpZW50IHBhaXIgb2YgCi0gKiB0aGUgYmxvY2suIFdpdGhpbiBlYWNoIHBvc2l0aW9uLWNvZWZmaWNpZW50IHBhaXIsIHRoZSBwb3NpdGlvbiBlbnRyeSAKLSAqIGluZGljYXRlcyB0aGUgcmFzdGVyLXNjYW4gcG9zaXRpb24gb2YgdGhlIGNvZWZmaWNpZW50LCB3aGlsZSB0aGUgCi0gKiBjb2VmZmljaWVudCBlbnRyeSBjb250YWlucyB0aGUgY29lZmZpY2llbnQgdmFsdWUuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC1Eb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbSBidWZmZXIgCi0gKiAgIHBPZmZzZXQgLSBQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddLiAKLSAqICAgc01heE51bUNvZWZmIC0gTWF4aW11bSB0aGUgbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyBpbiBjdXJyZW50IAotICogICAgICAgICAgICBibG9jayAKLSAqICAgc1ZMQ1NlbGVjdCAtIFZMQyB0YWJsZSBzZWxlY3Rvciwgb2J0YWluZWQgZnJvbSB0aGUgbnVtYmVyIG9mIG5vbi16ZXJvIAotICogICAgICAgICAgICBjb2VmZmljaWVudHMgY29udGFpbmVkIGluIHRoZSBhYm92ZSBhbmQgbGVmdCA0eDQgYmxvY2tzLiAgSXQgaXMgCi0gKiAgICAgICAgICAgIGVxdWl2YWxlbnQgdG8gdGhlIHZhcmlhYmxlIG5DIGRlc2NyaWJlZCBpbiBILjI2NCBzdGFuZGFyZCB0YWJsZSAKLSAqICAgICAgICAgICAgOSA1LCBleGNlcHQgaXRzIHZhbHVlIGNhbiB0IGJlIGxlc3MgdGhhbiB6ZXJvLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQuICAKLSAqICAgICAgICAgICAgQnVmZmVyIHBvc2l0aW9uICgqcHBQb3NDb2VmQnVmKSBpcyB1cGRhdGVkIHVwb24gcmV0dXJuLCB1bmxlc3MgCi0gKiAgICAgICAgICAgIHRoZXJlIGFyZSBvbmx5IHplcm8gY29lZmZpY2llbnRzIGluIHRoZSBjdXJyZW50bHkgZGVjb2RlZCBibG9jay4gCi0gKiAgICAgICAgICAgICBJbiB0aGlzIGNhc2UgdGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byBieXBhc3MgdGhlIAotICogICAgICAgICAgICB0cmFuc2Zvcm0vZGVxdWFudGl6YXRpb24gb2YgdGhlIGVtcHR5IGJsb2Nrcy4gCi0gKiAgIHBPZmZzZXQgLSAqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZCAKLSAqICAgcE51bUNvZWZmIC0gUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzIGluIHRoaXMgYmxvY2sgCi0gKiAgIHBwUG9zQ29lZkJ1ZiAtIERvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsIAotICogICAgICAgICAgICBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIHBwQml0U3RyZWFtIG9yIHBPZmZzZXQgaXMgTlVMTC4gCi0gKiAgICAtICAgIHBwUG9zQ29lZkJ1ZiBvciBwTnVtQ29lZmYgaXMgTlVMTC4gCi0gKiAgICAtICAgIHNNYXhOdW1Db2VmZiBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDE1IG9yIDE2LiAKLSAqICAgIC0gICAgc1ZMQ1NlbGVjdCBpcyBsZXNzIHRoYW4gMC4gCi0gKgotICogICAgT01YX1N0c19FcnIgLSBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYW4gaWxsZWdhbCBjb2RlIGlzIGVuY291bnRlcmVkIGluIHRoZSBiaXRzdHJlYW0gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQyAoCi0gICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX1MzMiAqcE9mZnNldCwKLSAgICBPTVhfVTggKnBOdW1Db2VmZiwKLSAgICBPTVhfVTggKipwcFBvc0NvZWZidWYsCi0gICAgT01YX0lOVCBzVkxDU2VsZWN0LAotICAgIE9NWF9JTlQgc01heE51bUNvZWZmCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyICAgKDYuMy40LjIuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFJlY29uc3RydWN0cyB0aGUgNHg0IEx1bWFEQyBibG9jayBmcm9tIHRoZSBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIAotICogYnVmZmVyLCBwZXJmb3JtcyBpbnRlZ2VyIGludmVyc2UsIGFuZCBkZXF1YW50aXphdGlvbiBmb3IgNHg0IEx1bWFEQyAKLSAqIGNvZWZmaWNpZW50cywgYW5kIHVwZGF0ZXMgdGhlIHBhaXIgYnVmZmVyIHBvaW50ZXIgdG8gdGhlIG5leHQgbm9uLWVtcHR5IAotICogYmxvY2suIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwU3JjIC0gRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIgCi0gKiAgICAgICAgICAgIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZyAKLSAqICAgUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyIFFwWSAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBTcmMgLSAqcHBTcmMgaXMgdXBkYXRlZCB0byB0aGUgc3RhcnQgb2YgbmV4dCBub24gZW1wdHkgYmxvY2sgCi0gKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIDR4NCBMdW1hREMgY29lZmZpY2llbnRzIGJ1ZmZlcjsgbXVzdCAKLSAqICAgICAgICAgICAgYmUgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgcHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKLSAqICAgIC0gICAgcERzdCBpcyBub3QgOCBieXRlIGFsaWduZWQuIAotICogICAgLSAgICBRUCBpcyBub3QgaW4gdGhlIHJhbmdlIG9mIFswLTUxXS4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIgKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAotICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgT01YX0lOVCBRUAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyICAgKDYuMy40LjIuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFJlY29uc3RydWN0IHRoZSAyeDIgQ2hyb21hREMgYmxvY2sgZnJvbSBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciwgCi0gKiBwZXJmb3JtIGludGVnZXIgaW52ZXJzZSB0cmFuc2Zvcm1hdGlvbiwgYW5kIGRlcXVhbnRpemF0aW9uIGZvciAyeDIgY2hyb21hIAotICogREMgY29lZmZpY2llbnRzLCBhbmQgdXBkYXRlIHRoZSBwYWlyIGJ1ZmZlciBwb2ludGVyIHRvIG5leHQgbm9uLWVtcHR5IAotICogYmxvY2suIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwU3JjIC0gRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIgCi0gKiAgICAgICAgICAgIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZyAKLSAqICAgUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyIFFwQyAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBTcmMgLSAqcHBTcmMgaXMgdXBkYXRlZCB0byB0aGUgc3RhcnQgb2YgbmV4dCBub24gZW1wdHkgYmxvY2sgCi0gKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIDJ4MiBDaHJvbWFEQyBjb2VmZmljaWVudHMgYnVmZmVyOyAKLSAqICAgICAgICAgICAgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBwcFNyYyBvciBwRHN0IGlzIE5VTEwuIAotICogICAgLSAgICBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIFFQIGlzIG5vdCBpbiB0aGUgcmFuZ2Ugb2YgWzAtNTFdLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyICgKLSAgICBjb25zdCBPTVhfVTggKipwcFNyYywKLSAgICBPTVhfUzE2ICpwRHN0LAotICAgIE9NWF9JTlQgUVAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCAgICg2LjMuNC4yLjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBSZWNvbnN0cnVjdCB0aGUgNHg0IHJlc2lkdWFsIGJsb2NrIGZyb20gY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIsIAotICogcGVyZm9ybSBkZXF1YW50aXphdGlvbiBhbmQgaW50ZWdlciBpbnZlcnNlIHRyYW5zZm9ybWF0aW9uIGZvciA0eDQgYmxvY2sgb2YgCi0gKiByZXNpZHVhbHMgd2l0aCBwcmV2aW91cyBpbnRyYSBwcmVkaWN0aW9uIG9yIG1vdGlvbiBjb21wZW5zYXRpb24gZGF0YSwgYW5kIAotICogdXBkYXRlIHRoZSBwYWlyIGJ1ZmZlciBwb2ludGVyIHRvIG5leHQgbm9uLWVtcHR5IGJsb2NrLiBJZiBwREMgPT0gTlVMTCwgCi0gKiB0aGVyZSByZSAxNiBub24temVybyBBQyBjb2VmZmljaWVudHMgYXQgbW9zdCBpbiB0aGUgcGFja2VkIGJ1ZmZlciBzdGFydGluZyAKLSAqIGZyb20gNHg0IGJsb2NrIHBvc2l0aW9uIDA7IElmIHBEQyAhPSBOVUxMLCB0aGVyZSByZSAxNSBub24temVybyBBQyAKLSAqIGNvZWZmaWNpZW50cyBhdCBtb3N0IGluIHRoZSBwYWNrZXQgYnVmZmVyIHN0YXJ0aW5nIGZyb20gNHg0IGJsb2NrIHBvc2l0aW9uIAotICogMS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBTcmMgLSBEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKLSAqICAgICAgICAgICAgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nIAotICogICBwUHJlZCAtIFBvaW50ZXIgdG8gdGhlIHByZWRpY3RlZCA0eDQgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkgCi0gKiAgIHByZWRTdGVwIC0gUHJlZGljdGVkIGZyYW1lIHN0ZXAgc2l6ZSBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgCi0gKiAgIGRzdFN0ZXAgLSBEZXN0aW5hdGlvbiBmcmFtZSBzdGVwIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgcERDIC0gUG9pbnRlciB0byB0aGUgREMgY29lZmZpY2llbnQgb2YgdGhpcyBibG9jaywgTlVMTCBpZiBpdCBkb2Vzbid0IAotICogICAgICAgICAgICBleGlzdCAKLSAqICAgUVAgLSBRUCBRdWFudGl6YXRpb24gcGFyYW1ldGVyLiAgSXQgc2hvdWxkIGJlIFFwQyBpbiBjaHJvbWEgNHg0IGJsb2NrIAotICogICAgICAgICAgICBkZWNvZGluZywgb3RoZXJ3aXNlIGl0IHNob3VsZCBiZSBRcFkuIAotICogICBBQyAtIEZsYWcgaW5kaWNhdGluZyBpZiBhdCBsZWFzdCBvbmUgbm9uLXplcm8gQUMgY29lZmZpY2llbnQgZXhpc3RzIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCA0eDQgYmxvY2sgZGF0YTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgCi0gKiAgICAgICAgICAgIDQtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBwUHJlZCBvciBwRHN0IGlzIE5VTEwuIAotICogICAgLSAgICBwUHJlZCBvciBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHByZWRTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgICAtICAgIEFDICE9MCBhbmQgUXAgaXMgbm90IGluIHRoZSByYW5nZSBvZiBbMC01MV0gb3IgcHBTcmMgPT0gTlVMTC4gCi0gKiAgICAtICAgIEFDID09MCAmJiBwREMgPT1OVUxMLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkICgKLSAgICBjb25zdCBPTVhfVTggKipwcFNyYywKLSAgICBjb25zdCBPTVhfVTggKnBQcmVkLAotICAgIGNvbnN0IE9NWF9TMTYgKnBEQywKLSAgICBPTVhfVTggKnBEc3QsCi0gICAgT01YX0lOVCBwcmVkU3RlcCwKLSAgICBPTVhfSU5UIGRzdFN0ZXAsCi0gICAgT01YX0lOVCBRUCwKLSAgICBPTVhfSU5UIEFDCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfTUVHZXRCdWZTaXplICAgKDYuMy41LjEuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbXB1dGVzIHRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIAotICogc3RydWN0dXJlIGZvciB0aGUgb214VkNNNFAxMCBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnMgQmxvY2tNYXRjaF9JbnRlZ2VyIAotICogYW5kIE1vdGlvbkVzdGltYXRpb25NQi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgTUVtb2RlIC0gbW90aW9uIGVzdGltYXRpb24gbW9kZTsgYXZhaWxhYmxlIG1vZGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSAKLSAqICAgICAgICAgICAgZW51bWVyYXRlZCB0eXBlIE9NWFZDTTRQMTBNRU1vZGUgCi0gKiAgIHBNRVBhcmFtcyAtbW90aW9uIGVzdGltYXRpb24gcGFyYW1ldGVycyAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNpemUgLSBwb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBtb3Rpb24gCi0gKiAgICAgICAgICAgIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgcE1FUGFyYW1zIG9yIHBTaXplIGlzIE5VTEwuIAotICogICAgLSAgICBhbiBpbnZhbGlkIE1FTW9kZSBpcyBzcGVjaWZpZWQuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfTUVHZXRCdWZTaXplICgKLSAgICBPTVhWQ000UDEwTUVNb2RlIE1FbW9kZSwKLSAgICBjb25zdCBPTVhWQ000UDEwTUVQYXJhbXMgKnBNRVBhcmFtcywKLSAgICBPTVhfVTMyICpwU2l6ZQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX01FSW5pdCAgICg2LjMuNS4xLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBJbml0aWFsaXplcyB0aGUgdmVuZG9yLXNwZWNpZmljIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIHJlcXVpcmVkIGZvciB0aGUgCi0gKiBvbXhWQ000UDEwIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9uczogIEJsb2NrTWF0Y2hfSW50ZWdlciBhbmQgCi0gKiBNb3Rpb25Fc3RpbWF0aW9uTUIuIE1lbW9yeSBmb3IgdGhlIHNwZWNpZmljYXRpb24gc3RydWN0dXJlICpwTUVTcGVjIG11c3QgYmUgCi0gKiBhbGxvY2F0ZWQgcHJpb3IgdG8gY2FsbGluZyB0aGUgZnVuY3Rpb24sIGFuZCBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKLSAqIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIGNhbiAKLSAqIGJlIGRldGVybWluZWQgdXNpbmcgdGhlIGZ1bmN0aW9uIG9teFZDTTRQMTBfTUVHZXRCdWZTaXplLiBGb2xsb3dpbmcgCi0gKiBpbml0aWFsaXphdGlvbiBieSB0aGlzIGZ1bmN0aW9uLCB0aGUgdmVuZG9yLXNwZWNpZmljIHN0cnVjdHVyZSAqcE1FU3BlYyAKLSAqIHNob3VsZCBjb250YWluIGFuIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIHJlcHJlc2VudGF0aW9uIG9mIGFsbCBtb3Rpb24gCi0gKiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgcmVjZWl2ZWQgdmlhIHRoZSBzdHJ1Y3R1cmUgcE1FUGFyYW1zLCBmb3IgZXhhbXBsZSAgCi0gKiBzZWFyY2hSYW5nZTE2eDE2LCBzZWFyY2hSYW5nZTh4OCwgZXRjLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBNRW1vZGUgLSBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlOyBhdmFpbGFibGUgbW9kZXMgYXJlIGRlZmluZWQgYnkgdGhlIAotICogICAgICAgICAgICBlbnVtZXJhdGVkIHR5cGUgT01YVkNNNFAxME1FTW9kZSAKLSAqICAgcE1FUGFyYW1zIC0gbW90aW9uIGVzdGltYXRpb24gcGFyYW1ldGVycyAKLSAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIHVuaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsaXplZCBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBwTUVQYXJhbXMgb3IgcFNpemUgaXMgTlVMTC4gCi0gKiAgICAtICAgIGFuIGludmFsaWQgdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBNRW1vZGUgCi0gKiAgICAtICAgIGEgbmVnYXRpdmUgb3IgemVybyB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciBvbmUgb2YgdGhlIHNlYXJjaCByYW5nZXMgCi0gKiAgICAgICAgIChlLmcuLCAgcE1CUGFyYW1zID5zZWFyY2hSYW5nZTh4OCwgcE1FUGFyYW1zLT5zZWFyY2hSYW5nZTE2eDE2LCBldGMuKSAKLSAqICAgIC0gICAgZWl0aGVyIGluIGlzb2xhdGlvbiBvciBpbiBjb21iaW5hdGlvbiwgb25lIG9yIG1vcmUgb2YgdGhlIGVuYWJsZXMgb3IgCi0gKiAgICAgICAgIHNlYXJjaCByYW5nZXMgaW4gdGhlIHN0cnVjdHVyZSAqcE1FUGFyYW1zIHdlcmUgY29uZmlndXJlZCBzdWNoIAotICogICAgICAgICB0aGF0IHRoZSByZXF1ZXN0ZWQgYmVoYXZpb3IgZmFpbHMgdG8gY29tcGx5IHdpdGggW0lTTzE0NDk2LTEwXS4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9NRUluaXQgKAotICAgIE9NWFZDTTRQMTBNRU1vZGUgTUVtb2RlLAotICAgIGNvbnN0IE9NWFZDTTRQMTBNRVBhcmFtcyAqcE1FUGFyYW1zLAotICAgIHZvaWQgKnBNRVNwZWMKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIgICAoNi4zLjUuMi4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgaW50ZWdlciBibG9jayBtYXRjaC4gIFJldHVybnMgYmVzdCBNViBhbmQgYXNzb2NpYXRlZCBjb3N0LiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjT3JnWSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY3VycmVudCBibG9jazoKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIHBTcmNSZWZZIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIGJsb2NrIGluIHRoZSAKLSAqICAgICAgICAgICAgcmVmZXJlbmNlIHBpY3R1cmU6IAotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgCi0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBuU3JjT3JnU3RlcCAtIFN0cmlkZSBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSwgZXhwcmVzc2VkIGluIHRlcm1zIAotICogICAgICAgICAgICBvZiBpbnRlZ2VyIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGlCbG9ja1dpZHRoLiAKLSAqICAgblNyY1JlZlN0ZXAgLSBTdHJpZGUgb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lLCBleHByZXNzZWQgaW4gdGVybXMgCi0gKiAgICAgICAgICAgIG9mIGludGVnZXIgcGl4ZWxzIAotICogICBwUmVmUmVjdCAtIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSByZWN0YW5nbGUgaW5zaWRlIHRoZSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIHBpY3R1cmUgcGxhbmUgCi0gKiAgIG5DdXJyUG9pbnRQb3MgLSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZSAKLSAqICAgaUJsb2NrV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jaywgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGludGVnZXIgCi0gKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICogICBpQmxvY2tIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2ssIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiAKLSAqICAgICAgICAgICAgaW50ZWdlciBwaXhlbHM7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqICAgbkxhbWRhIC0gTGFtZGEgZmFjdG9yOyB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QgCi0gKiAgIHBNVlByZWQgLSBQcmVkaWN0ZWQgTVY7IHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCwgZXhwcmVzc2VkIGluIHRlcm1zIAotICogICAgICAgICAgICBvZiAxLzQtcGVsIHVuaXRzIAotICogICBwTVZDYW5kaWRhdGUgLSBDYW5kaWRhdGUgTVY7IHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgbW90aW9uIHNlYXJjaCwgCi0gKiAgICAgICAgICAgIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVscyAKLSAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0QmVzdE1WIC0gQmVzdCBNViByZXN1bHRpbmcgZnJvbSBpbnRlZ2VyIHNlYXJjaCwgZXhwcmVzc2VkIGluIHRlcm1zIAotICogICAgICAgICAgICBvZiAxLzQtcGVsIHVuaXRzIAotICogICBwQmVzdENvc3QgLSBNb3Rpb24gY29zdCBhc3NvY2lhdGVkIHdpdGggdGhlIGJlc3QgTVY7IGNvbXB1dGVkIGFzIAotICogICAgICAgICAgICBTQUQrTGFtZGEqQml0c1VzZWRCeU1WIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIGFueSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGFyZSBOVUxMOgotICogICAgICAgICBwU3JjT3JnWSwgcFNyY1JlZlksIHBSZWZSZWN0LCBwTVZQcmVkLCBwTVZDYW5kaWRhdGUsIG9yIHBNRVNwZWMuIAotICogICAgLSAgICBFaXRoZXIgaUJsb2NrV2lkdGggb3IgaUJsb2NrSGVpZ2h0IGFyZSB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNi4gCi0gKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjT3JnWSwKLSAgICBPTVhfUzMyIG5TcmNPcmdTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZlksCi0gICAgT01YX1MzMiBuU3JjUmVmU3RlcCwKLSAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLSAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAotICAgIE9NWF9VOCBpQmxvY2tXaWR0aCwKLSAgICBPTVhfVTggaUJsb2NrSGVpZ2h0LAotICAgIE9NWF9VMzIgbkxhbWRhLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZQcmVkLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZDYW5kaWRhdGUsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBCZXN0TVYsCi0gICAgT01YX1MzMiAqcEJlc3RDb3N0LAotICAgIHZvaWQgKnBNRVNwZWMKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYgICAoNi4zLjUuMi4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYSBoYWxmLXBlbCBibG9jayBtYXRjaCB1c2luZyByZXN1bHRzIGZyb20gYSBwcmlvciBpbnRlZ2VyIHNlYXJjaC4gCi0gKiAgUmV0dXJucyB0aGUgYmVzdCBNViBhbmQgYXNzb2NpYXRlZCBjb3N0LiAgVGhpcyBmdW5jdGlvbiBlc3RpbWF0ZXMgdGhlIAotICogaGFsZi1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGludGVnZXIgcmVzb2x1dGlvbiBtb3Rpb24gCi0gKiB2ZWN0b3IgcmVmZXJlbmNlZCBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RCZXN0TVYsIGkuZS4sIHRoZSBpbml0aWFsIAotICogaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgZXh0ZXJuYWxseS4gIFRoZSBmdW5jdGlvbiAKLSAqIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyIG1heSBiZSB1c2VkIGZvciBpbnRlZ2VyIG1vdGlvbiBlc3RpbWF0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjT3JnWSAtIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gb3JpZ2luYWwgcGljdHVyZSBwbGFuZToKLSAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIHBTcmNSZWZZIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIGJsb2NrIGluIHRoZSAKLSAqICAgICAgICAgICAgcmVmZXJlbmNlIHBpY3R1cmU6ICAKLSAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKLSAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKLSAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgblNyY09yZ1N0ZXAgLSBTdHJpZGUgb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgaUJsb2NrV2lkdGguIAotICogICBuU3JjUmVmU3RlcCAtIFN0cmlkZSBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzIAotICogICBpQmxvY2tXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRlcm1zIG9mIGZ1bGwgcGl4ZWxzOyBtdXN0IAotICogICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICogICBpQmxvY2tIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGVybXMgb2YgZnVsbCBwaXhlbHM7IG11c3QgCi0gKiAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKiAgIG5MYW1kYSAtIExhbWRhIGZhY3RvciwgdXNlZCB0byBjb21wdXRlIG1vdGlvbiBjb3N0IAotICogICBwTVZQcmVkIC0gUHJlZGljdGVkIE1WLCByZXByZXNlbnRlZCBpbiB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzOyB1c2VkIHRvIAotICogICAgICAgICAgICBjb21wdXRlIG1vdGlvbiBjb3N0IAotICogICBwU3JjRHN0QmVzdE1WIC0gVGhlIGJlc3QgTVYgcmVzdWx0aW5nIGZyb20gYSBwcmlvciBpbnRlZ2VyIHNlYXJjaCwgCi0gKiAgICAgICAgICAgIHJlcHJlc2VudGVkIGluIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHMgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3RCZXN0TVYgLSBCZXN0IE1WIHJlc3VsdGluZyBmcm9tIHRoZSBoYWxmLXBlbCBzZWFyY2gsIGV4cHJlc3NlZCBpbiAKLSAqICAgICAgICAgICAgdGVybXMgb2YgMS80LXBlbCB1bml0cyAKLSAqICAgcEJlc3RDb3N0IC0gTW90aW9uIGNvc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBiZXN0IE1WOyBjb21wdXRlZCBhcyAKLSAqICAgICAgICAgICAgU0FEK0xhbWRhKkJpdHNVc2VkQnlNViAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBhbnkgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjT3JnWSwgcFNyY1JlZlksIAotICogICAgICAgICAgICAgIHBTcmNEc3RCZXN0TVYsIHBNVlByZWQsIHBCZXN0Q29zdCAKLSAqICAgIC0gICAgaUJsb2NrV2lkdGggb3IgaUJsb2NrSGVpZ2h0IGFyZSBlcXVhbCB0byB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNi4gCi0gKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjT3JnWSwKLSAgICBPTVhfUzMyIG5TcmNPcmdTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZlksCi0gICAgT01YX1MzMiBuU3JjUmVmU3RlcCwKLSAgICBPTVhfVTggaUJsb2NrV2lkdGgsCi0gICAgT01YX1U4IGlCbG9ja0hlaWdodCwKLSAgICBPTVhfVTMyIG5MYW1kYSwKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcE1WUHJlZCwKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdEJlc3RNViwKLSAgICBPTVhfUzMyICpwQmVzdENvc3QKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIgICAoNi4zLjUuMi4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYSBxdWFydGVyLXBlbCBibG9jayBtYXRjaCB1c2luZyByZXN1bHRzIGZyb20gYSBwcmlvciBoYWxmLXBlbCAKLSAqIHNlYXJjaC4gIFJldHVybnMgdGhlIGJlc3QgTVYgYW5kIGFzc29jaWF0ZWQgY29zdC4gIFRoaXMgZnVuY3Rpb24gZXN0aW1hdGVzIAotICogdGhlIHF1YXJ0ZXItcGl4ZWwgbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBoYWxmLXBlbCByZXNvbHV0aW9uIAotICogbW90aW9uIHZlY3RvciByZWZlcmVuY2VkIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdEJlc3RNViwgaS5lLiwgdGhlIAotICogaW5pdGlhbCBoYWxmLXBlbCBNViBpcyBnZW5lcmF0ZWQgZXh0ZXJuYWxseS4gIFRoZSBmdW5jdGlvbiAKLSAqIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmIG1heSBiZSB1c2VkIGZvciBoYWxmLXBlbCBtb3Rpb24gZXN0aW1hdGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY09yZ1kgLSBQb2ludGVyIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmU6Ci0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBwU3JjUmVmWSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBibG9jayBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJlZmVyZW5jZSBwaWN0dXJlOgotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgCi0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBuU3JjT3JnU3RlcCAtIFN0cmlkZSBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiBpQmxvY2tXaWR0aC4gCi0gKiAgIG5TcmNSZWZTdGVwIC0gU3RyaWRlIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHMgCi0gKiAgIGlCbG9ja1dpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGVybXMgb2YgZnVsbCBwaXhlbHM7IG11c3QgCi0gKiAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKiAgIGlCbG9ja0hlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKLSAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqICAgbkxhbWRhIC0gTGFtZGEgZmFjdG9yLCB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QgCi0gKiAgIHBNVlByZWQgLSBQcmVkaWN0ZWQgTVYsIHJlcHJlc2VudGVkIGluIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHM7IHVzZWQgdG8gCi0gKiAgICAgICAgICAgIGNvbXB1dGUgbW90aW9uIGNvc3QgCi0gKiAgIHBTcmNEc3RCZXN0TVYgLSBUaGUgYmVzdCBNViByZXN1bHRpbmcgZnJvbSBhIHByaW9yIGhhbGYtcGVsIHNlYXJjaCwgCi0gKiAgICAgICAgICAgIHJlcHJlc2VudGVkIGluIHRlcm1zIG9mIDEvNCBwZWwgdW5pdHMgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3RCZXN0TVYgLSBCZXN0IE1WIHJlc3VsdGluZyBmcm9tIHRoZSBxdWFydGVyLXBlbCBzZWFyY2gsIGV4cHJlc3NlZCAKLSAqICAgICAgICAgICAgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0cyAKLSAqICAgcEJlc3RDb3N0IC0gTW90aW9uIGNvc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBiZXN0IE1WOyBjb21wdXRlZCBhcyAKLSAqICAgICAgICAgICAgU0FEK0xhbWRhKkJpdHNVc2VkQnlNViAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjT3JnWSwgcFNyY1JlZlksIHBTcmNEc3RCZXN0TVYsIHBNVlByZWQsIHBCZXN0Q29zdCAKLSAqICAgIC0gICAgaUJsb2NrV2lkdGggb3IgaUJsb2NrSGVpZ2h0IGFyZSBlcXVhbCB0byB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNi4gCi0gKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlciAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjT3JnWSwKLSAgICBPTVhfUzMyIG5TcmNPcmdTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZlksCi0gICAgT01YX1MzMiBuU3JjUmVmU3RlcCwKLSAgICBPTVhfVTggaUJsb2NrV2lkdGgsCi0gICAgT01YX1U4IGlCbG9ja0hlaWdodCwKLSAgICBPTVhfVTMyIG5MYW1kYSwKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcE1WUHJlZCwKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdEJlc3RNViwKLSAgICBPTVhfUzMyICpwQmVzdENvc3QKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIgICAoNi4zLjUuMy4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgTUItbGV2ZWwgbW90aW9uIGVzdGltYXRpb24gYW5kIHNlbGVjdHMgYmVzdCBtb3Rpb24gZXN0aW1hdGlvbiAKLSAqIHN0cmF0ZWd5IGZyb20gdGhlIHNldCBvZiBtb2RlcyBzdXBwb3J0ZWQgaW4gYmFzZWxpbmUgcHJvZmlsZSBbSVNPMTQ0OTYtMTBdLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjQ3VyckJ1ZiAtIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gb3JpZ2luYWwgcGljdHVyZSBwbGFuZTsgCi0gKiAgICAgICAgICAgIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAotICogICBwU3JjUmVmQnVmTGlzdCAtIFBvaW50ZXIgdG8gYW4gYXJyYXkgd2l0aCAxNiBlbnRyaWVzLiAgRWFjaCBlbnRyeSBwb2ludHMgCi0gKiAgICAgICAgICAgIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgTUIgaW4gYSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIHBpY3R1cmUuICBUaGUgYXJyYXkgaXMgZmlsbGVkIGZyb20gbG93LXRvLWhpZ2ggd2l0aCB2YWxpZCAKLSAqICAgICAgICAgICAgcmVmZXJlbmNlIGZyYW1lIHBvaW50ZXJzOyB0aGUgdW51c2VkIGhpZ2ggZW50cmllcyBzaG91bGQgYmUgc2V0IAotICogICAgICAgICAgICB0byBOVUxMLiAgT3JkZXJpbmcgb2YgdGhlIHJlZmVyZW5jZSBmcmFtZXMgc2hvdWxkIGZvbGxvdyAKLSAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSBzdWJjbGF1c2UgOC4yLjQgIERlY29kaW5nIFByb2Nlc3MgZm9yIFJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgUGljdHVyZSBMaXN0cy4gICBUaGUgZW50cmllcyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgIHBTcmNSZWNCdWYgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgTUIgaW4gdGhlIAotICogICAgICAgICAgICByZWNvbnN0cnVjdGVkIHBpY3R1cmU7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgU3JjQ3VyclN0ZXAgLSBXaWR0aCBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIFNyY1JlZlN0ZXAgLSBXaWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBTcmNSZWNTdGVwIC0gV2lkdGggb2YgdGhlIHJlY29uc3RydWN0ZWQgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIHBSZWZSZWN0IC0gUG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHJlY3RhbmdsZTsgcmVsYXRpdmUgdG8gdGhlIAotICogICAgICAgICAgICBpbWFnZSBvcmlnaW4uIAotICogICBwQ3VyclBvaW50UG9zIC0gUG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZS4gCi0gKiAgIExhbWJkYSAtIExhZ3JhbmdlIGZhY3RvciBmb3IgY29tcHV0aW5nIHRoZSBjb3N0IGZ1bmN0aW9uIAotICogICBwTUVTcGVjIC0gUG9pbnRlciB0byB0aGUgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IG11c3QgCi0gKiAgICAgICAgICAgIGhhdmUgYmVlbiBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkIHByaW9yIHRvIGNhbGxpbmcgdGhpcyAKLSAqICAgICAgICAgICAgZnVuY3Rpb24uIAotICogICBwTUJJbnRlciAtIEFycmF5LCBvZiBkaW1lbnNpb24gZm91ciwgY29udGFpbmluZyBwb2ludGVycyB0byBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIGZvdXIgYWRqYWNlbnQgdHlwZSBJTlRFUiBNQnMgKExlZnQsIFRvcCwgCi0gKiAgICAgICAgICAgIFRvcC1MZWZ0LCBUb3AtUmlnaHQpLiBBbnkgcG9pbnRlciBpbiB0aGUgYXJyYXkgbWF5IGJlIHNldCBlcXVhbCAKLSAqICAgICAgICAgICAgdG8gTlVMTCBpZiB0aGUgY29ycmVzcG9uZGluZyBNQiBkb2VzbiB0IGV4aXN0IG9yIGlzIG5vdCBvZiB0eXBlIAotICogICAgICAgICAgICBJTlRFUi4gCi0gKiAgICAgICAgICAgIC0gIHBNQkludGVyWzBdIC0gUG9pbnRlciB0byBsZWZ0IE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICAtICBwTUJJbnRlclsxXSAtIFBvaW50ZXIgdG8gdG9wIE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICAtICBwTUJJbnRlclsyXSAtIFBvaW50ZXIgdG8gdG9wLWxlZnQgTUIgaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIC0gIHBNQkludGVyWzNdIC0gUG9pbnRlciB0byB0b3AtcmlnaHQgTUIgaW5mb3JtYXRpb24gCi0gKiAgIHBNQkludHJhIC0gQXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggZm91ciBhZGphY2VudCB0eXBlIElOVFJBIE1CcyAoTGVmdCwgVG9wLCAKLSAqICAgICAgICAgICAgVG9wLUxlZnQsIFRvcC1SaWdodCkuIEFueSBwb2ludGVyIGluIHRoZSBhcnJheSBtYXkgYmUgc2V0IGVxdWFsIAotICogICAgICAgICAgICB0byBOVUxMIGlmIHRoZSBjb3JyZXNwb25kaW5nIE1CIGRvZXNuIHQgZXhpc3Qgb3IgaXMgbm90IG9mIHR5cGUgCi0gKiAgICAgICAgICAgIElOVFJBLiAKLSAqICAgICAgICAgICAgLSAgcE1CSW50cmFbMF0gLSBQb2ludGVyIHRvIGxlZnQgTUIgaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIC0gIHBNQkludHJhWzFdIC0gUG9pbnRlciB0byB0b3AgTUIgaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIC0gIHBNQkludHJhWzJdIC0gUG9pbnRlciB0byB0b3AtbGVmdCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgLSAgcE1CSW50cmFbM10gLSBQb2ludGVyIHRvIHRvcC1yaWdodCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgcFNyY0RzdE1CQ3VyciAtIFBvaW50ZXIgdG8gaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCBNQi4gIAotICogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGVudHJpZXMgc2hvdWxkIGJlIHNldCBwcmlvciB0byBjYWxsaW5nIHRoZSAKLSAqICAgICAgICAgICAgZnVuY3Rpb246ICBzbGljZUlEIC0gdGhlIG51bWJlciBvZiB0aGUgc2xpY2UgdGhlIHRvIHdoaWNoIHRoZSAKLSAqICAgICAgICAgICAgY3VycmVudCBNQiBiZWxvbmdzLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdENvc3QgLSBQb2ludGVyIHRvIHRoZSBtaW5pbXVtIG1vdGlvbiBjb3N0IGZvciB0aGUgY3VycmVudCBNQi4gCi0gKiAgIHBEc3RCbG9ja1NBRCAtIFBvaW50ZXIgdG8gdGhlIGFycmF5IG9mIFNBRHMgZm9yIGVhY2ggb2YgdGhlIHNpeHRlZW4gbHVtYSAKLSAqICAgICAgICAgICAgNHg0IGJsb2NrcyBpbiBlYWNoIE1CLiAgVGhlIGJsb2NrIFNBRHMgYXJlIGluIHNjYW4gb3JkZXIgZm9yIAotICogICAgICAgICAgICBlYWNoIE1CLiAgRm9yIGltcGxlbWVudGF0aW9ucyB0aGF0IGNhbm5vdCBjb21wdXRlIHRoZSBTQUQgdmFsdWVzIAotICogICAgICAgICAgICBpbmRpdmlkdWFsbHksIHRoZSBtYXhpbXVtIHBvc3NpYmxlIHZhbHVlICgweGZmZmYpIGlzIHJldHVybmVkIAotICogICAgICAgICAgICBmb3IgZWFjaCBvZiB0aGUgMTYgYmxvY2sgU0FEIGVudHJpZXMuIAotICogICBwU3JjRHN0TUJDdXJyIC0gUG9pbnRlciB0byB1cGRhdGVkIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIE1CIGFmdGVyIE1CLWxldmVsIG1vdGlvbiBlc3RpbWF0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZC4gIFRoZSAKLSAqICAgICAgICAgICAgZm9sbG93aW5nIGZpZWxkcyBhcmUgdXBkYXRlZCBieSB0aGUgTUUgZnVuY3Rpb24uICAgVGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgcGFyYW1ldGVyIHNldCBxdWFudGlmaWVzIHRoZSBNQi1sZXZlbCBNRSBzZWFyY2ggcmVzdWx0czogCi0gKiAgICAgICAgICAgIC0gIE1iVHlwZSAKLSAqICAgICAgICAgICAgLSAgc3ViTUJUeXBlWzRdIAotICogICAgICAgICAgICAtICBwTVYwWzRdWzRdIAotICogICAgICAgICAgICAtICBwTVZQcmVkWzRdWzRdIAotICogICAgICAgICAgICAtICBwUmVmTDBJZHhbNF0gCi0gKiAgICAgICAgICAgIC0gIEludHJhMTZ4MTZQcmVkTW9kZSAKLSAqICAgICAgICAgICAgLSAgcEludHJhNHg0UHJlZE1vZGVbNF1bNF0gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNDdXJyQnVmLCAKLSAqICAgICAgICAgICBwU3JjUmVmQnVmTGlzdCwgcFNyY1JlY0J1ZiwgcFJlZlJlY3QsIHBDdXJyUG9pbnRQb3MsIHBNRVNwZWMsIAotICogICAgICAgICAgIHBNQkludGVyLCBwTUJJbnRyYSxwU3JjRHN0TUJDdXJyLCBwRHN0Q29zdCwgcFNyY1JlZkJ1Zkxpc3RbMF0gCi0gKiAgICAtICAgIFNyY1JlZlN0ZXAsIFNyY1JlY1N0ZXAgYXJlIG5vdCBtdWx0aXBsZXMgb2YgMTYgCi0gKiAgICAtICAgIGlCbG9ja1dpZHRoIG9yIGlCbG9ja0hlaWdodCBhcmUgdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYuIAotICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCi0gICAgT01YX1MzMiBTcmNDdXJyU3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWZMaXN0WzE1XSwKLSAgICBPTVhfUzMyIFNyY1JlZlN0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVjQnVmLAotICAgIE9NWF9TMzIgU3JjUmVjU3RlcCwKLSAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLSAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAotICAgIE9NWF9VMzIgTGFtYmRhLAotICAgIHZvaWQgKnBNRVNwZWMsCi0gICAgY29uc3QgT01YVkNNNFAxME1CSW5mb1B0ciAqcE1CSW50ZXIsCi0gICAgY29uc3QgT01YVkNNNFAxME1CSW5mb1B0ciAqcE1CSW50cmEsCi0gICAgT01YVkNNNFAxME1CSW5mb1B0ciBwU3JjRHN0TUJDdXJyLAotICAgIE9NWF9JTlQgKnBEc3RDb3N0LAotICAgIE9NWF9VMTYgKnBEc3RCbG9ja1NBRAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBRF80eCAgICg2LjMuNS40LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBmb3IgNHg4IGFuZCA0eDQgYmxvY2tzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjT3JnIC1Qb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIGlTdGVwT3JnIC1TdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgcFNyY1JlZiAtUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIAotICogICBpU3RlcFJlZiAtU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlciAKLSAqICAgaUhlaWdodCAtSGVpZ2h0IG9mIHRoZSBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCBvciA4LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFNBRCAtUG9pbnRlciBvZiByZXN1bHQgU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmNPcmcsIHBTcmNSZWYsIG9yIHBEc3RTQUQgCi0gKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAotICogICAgLSAgICBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9TQURfNHggKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZywKLSAgICBPTVhfVTMyIGlTdGVwT3JnLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKLSAgICBPTVhfVTMyIGlTdGVwUmVmLAotICAgIE9NWF9TMzIgKnBEc3RTQUQsCi0gICAgT01YX1UzMiBpSGVpZ2h0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FEUXVhcl80eCAgICg2LjMuNS40LjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBiZXR3ZWVuIG9uZSBibG9jayAocFNyYykgYW5kIHRoZSBhdmVyYWdlIAotICogb2YgdGhlIG90aGVyIHR3byAocFNyY1JlZjAgYW5kIHBTcmNSZWYxKSBmb3IgNHg4IG9yIDR4NCBibG9ja3MuICBSb3VuZGluZyAKLSAqIGlzIGFwcGxpZWQgYWNjb3JkaW5nIHRvIHRoZSBjb252ZW50aW9uIChhK2IrMSk+PjEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIHBTcmNSZWYwIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgcFNyY1JlZjEgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAotICogICBpUmVmU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogICBpUmVmU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCBvciA4LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFNBRCAtIFBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgNCBvciA4LiAKLSAqICAgIC0gICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwU3JjUmVmMCwgCi0gKiAgICAgICAgICAgICAgcFNyY1JlZjEsIHBEc3RTQUQuIAotICogICAgLSAgICBpU3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9TQURRdWFyXzR4ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYxLAotICAgIE9NWF9VMzIgaVNyY1N0ZXAsCi0gICAgT01YX1UzMiBpUmVmU3RlcDAsCi0gICAgT01YX1UzMiBpUmVmU3RlcDEsCi0gICAgT01YX1UzMiAqcERzdFNBRCwKLSAgICBPTVhfVTMyIGlIZWlnaHQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQURRdWFyXzh4ICAgKDYuMy41LjQuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGJldHdlZW4gb25lIGJsb2NrIChwU3JjKSBhbmQgdGhlIGF2ZXJhZ2UgCi0gKiBvZiB0aGUgb3RoZXIgdHdvIChwU3JjUmVmMCBhbmQgcFNyY1JlZjEpIGZvciA4eDE2LCA4eDgsIG9yIDh4NCBibG9ja3MuICAKLSAqIFJvdW5kaW5nIGlzIGFwcGxpZWQgYWNjb3JkaW5nIHRvIHRoZSBjb252ZW50aW9uIChhK2IrMSk+PjEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBwU3JjUmVmMCAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIHBTcmNSZWYxIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgaVJlZlN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgaVJlZlN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2s7IG11c3QgYmUgZXF1YWwgZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFNBRCAtIFBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICogICAgLSAgICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYwLCAKLSAqICAgICAgICAgICAgICBwU3JjUmVmMSwgcERzdFNBRC4gCi0gKiAgICAtICAgIGlTcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDggCi0gKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1NBRFF1YXJfOHggKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjEsCi0gICAgT01YX1UzMiBpU3JjU3RlcCwKLSAgICBPTVhfVTMyIGlSZWZTdGVwMCwKLSAgICBPTVhfVTMyIGlSZWZTdGVwMSwKLSAgICBPTVhfVTMyICpwRHN0U0FELAotICAgIE9NWF9VMzIgaUhlaWdodAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBRFF1YXJfMTZ4ICAgKDYuMy41LjQuNCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGJldHdlZW4gb25lIGJsb2NrIChwU3JjKSBhbmQgdGhlIGF2ZXJhZ2UgCi0gKiBvZiB0aGUgb3RoZXIgdHdvIChwU3JjUmVmMCBhbmQgcFNyY1JlZjEpIGZvciAxNngxNiBvciAxNng4IGJsb2Nrcy4gIAotICogUm91bmRpbmcgaXMgYXBwbGllZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnZlbnRpb24gKGErYisxKT4+MS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIHBTcmNSZWYwIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgcFNyY1JlZjEgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2IAotICogICBpUmVmU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogICBpUmVmU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgOCBvciAxNiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFNBRCAtUG9pbnRlciBvZiByZXN1bHQgU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA4IG9yIDE2LiAKLSAqICAgIC0gICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwU3JjUmVmMCwgCi0gKiAgICAgICAgICAgICAgcFNyY1JlZjEsIHBEc3RTQUQuIAotICogICAgLSAgICBpU3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAKLSAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfU0FEUXVhcl8xNnggKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjEsCi0gICAgT01YX1UzMiBpU3JjU3RlcCwKLSAgICBPTVhfVTMyIGlSZWZTdGVwMCwKLSAgICBPTVhfVTMyIGlSZWZTdGVwMSwKLSAgICBPTVhfVTMyICpwRHN0U0FELAotICAgIE9NWF9VMzIgaUhlaWdodAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBVERfNHg0ICAgKDYuMy41LjQuNSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgc3VtIG9mIGFic29sdXRlIHRyYW5zZm9ybSBkaWZmZXJlbmNlcyAoU0FURCkgCi0gKiBmb3IgYSA0eDQgYmxvY2sgYnkgYXBwbHlpbmcgYSBIYWRhbWFyZCB0cmFuc2Zvcm0gdG8gdGhlIGRpZmZlcmVuY2UgYmxvY2sgCi0gKiBhbmQgdGhlbiBjYWxjdWxhdGluZyB0aGUgc3VtIG9mIGFic29sdXRlIGNvZWZmaWNpZW50IHZhbHVlcy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY09yZyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5IAotICogICBpU3RlcE9yZyAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgCi0gKiAgIHBTcmNSZWYgLSBQb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkgCi0gKiAgIGlTdGVwUmVmIC0gU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIHRoZSByZXN1bHRpbmcgU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmNPcmcsIHBTcmNSZWYsIG9yIHBEc3RTQUQgZWl0aGVyIHBTcmNPcmcgCi0gKiAgICAtICAgIHBTcmNSZWYgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGlTdGVwT3JnIDw9IDAgb3IgaVN0ZXBPcmcgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgIC0gICAgaVN0ZXBSZWYgPD0gMCBvciBpU3RlcFJlZiBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfU0FURF80eDQgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZywKLSAgICBPTVhfVTMyIGlTdGVwT3JnLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKLSAgICBPTVhfVTMyIGlTdGVwUmVmLAotICAgIE9NWF9VMzIgKnBEc3RTQUQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSAgICg2LjMuNS41LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIHR3byBob3Jpem9udGFsIDEvMi1wZWwgcG9zaXRpb25zIAotICogKC0xLzIsMCkgYW5kICgxLzIsIDApIC0gYXJvdW5kIGEgZnVsbC1wZWwgcG9zaXRpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgaW4gCi0gKiAgICAgICAgICAgIHRoZSByZWNvbnN0cnVjdGlvbiBmcmFtZSBwbGFuZS4gCi0gKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gCi0gKiAgIGlEc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyOyBtdXN0IGJlIGEgCi0gKiAgICAgICAgICAgIG11bHRpcGxlIG9mIGlXaWR0aC4gCi0gKiAgIGlXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNiAKLSAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSBlcXVhbCB0byA0LCA4LCBvciAxNiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdExlZnQgLVBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSBsZWZ0IC1wZWwgcG9zaXRpb24gCi0gKiAgICAgICAgICAgICgtMS8yLCAwKSAKLSAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIHBEc3RSaWdodCAtUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIHJpZ2h0IC1wZWwgCi0gKiAgICAgICAgICAgIHBvc2l0aW9uICgxLzIsIDApIAotICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICAgICAgcFNyYywgcERzdExlZnQsIG9yIHBEc3RSaWdodCAKLSAqICAgIC0gICAgaVdpZHRoIG9yIGlIZWlnaHQgaGF2ZSB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNiAKLSAqICAgIC0gICAgaVdpZHRoPT00IGJ1dCBwRHN0TGVmdCBhbmQvb3IgcERzdFJpZ2h0IGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgaVdpZHRoPT04IGJ1dCBwRHN0TGVmdCBhbmQvb3IgcERzdFJpZ2h0IGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgaVdpZHRoPT0xNiBidXQgcERzdExlZnQgYW5kL29yIHBEc3RSaWdodCBpcy9hcmUgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBhbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIE9NWF9VMzIgaVNyY1N0ZXAsCi0gICAgT01YX1U4ICpwRHN0TGVmdCwKLSAgICBPTVhfVTggKnBEc3RSaWdodCwKLSAgICBPTVhfVTMyIGlEc3RTdGVwLAotICAgIE9NWF9VMzIgaVdpZHRoLAotICAgIE9NWF9VMzIgaUhlaWdodAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hICAgKDYuMy41LjUuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgdHdvIHZlcnRpY2FsIDEvMi1wZWwgcG9zaXRpb25zIC0gCi0gKiAoMCwgLTEvMikgYW5kICgwLCAxLzIpIC0gYXJvdW5kIGEgZnVsbC1wZWwgcG9zaXRpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIGluIHRoZSAKLSAqICAgICAgICAgICAgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZSAKLSAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiAKLSAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiAoaW50ZXJwb2xhdGlvbikgYnVmZmVyOyBtdXN0IGJlIGEgCi0gKiAgICAgICAgICAgIG11bHRpcGxlIG9mIGlXaWR0aC4gCi0gKiAgIGlXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNiAKLSAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RVcCAtUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIC1wZWwgcG9zaXRpb24gYWJvdmUgCi0gKiAgICAgICAgICAgIHRoZSBjdXJyZW50IGZ1bGwtcGVsIHBvc2l0aW9uICgwLCAtMS8yKSAKLSAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09NCwgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTgsIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBwRHN0RG93biAtUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIC1wZWwgcG9zaXRpb24gYmVsb3cgCi0gKiAgICAgICAgICAgIHRoZSBjdXJyZW50IGZ1bGwtcGVsIHBvc2l0aW9uICgwLCAxLzIpIAotICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgICAgcFNyYywgcERzdFVwLCBvciBwRHN0RG93biAKLSAqICAgIC0gICAgaVdpZHRoIG9yIGlIZWlnaHQgaGF2ZSB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNiAKLSAqICAgIC0gICAgaVdpZHRoPT00IGJ1dCBwRHN0VXAgYW5kL29yIHBEc3REb3duIGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgaVdpZHRoPT04IGJ1dCBwRHN0VXAgYW5kL29yIHBEc3REb3duIGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgaVdpZHRoPT0xNiBidXQgcERzdFVwIGFuZC9vciBwRHN0RG93biBpcy9hcmUgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBPTVhfVTMyIGlTcmNTdGVwLAotICAgIE9NWF9VOCAqcERzdFVwLAotICAgIE9NWF9VOCAqcERzdERvd24sCi0gICAgT01YX1UzMiBpRHN0U3RlcCwKLSAgICBPTVhfVTMyIGlXaWR0aCwKLSAgICBPTVhfVTMyIGlIZWlnaHQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9BdmVyYWdlXzR4ICAgKDYuMy41LjUuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gNHg0LCA0eDggYmxvY2tzLiAgVGhlIHJlc3VsdCAKLSAqIGlzIHJvdW5kZWQgYWNjb3JkaW5nIHRvIChhK2IrMSkvMi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFByZWQwIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogICBwUHJlZDEgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlQcmVkU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIGlQcmVkU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIGlEc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrczsgbXVzdCBiZSBlaXRoZXIgNCBvciA4LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFByZWQgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgICAgcFByZWQwLCBwUHJlZDEsIG9yIHBEc3RQcmVkIAotICogICAgLSAgICBwRHN0UHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgaVByZWRTdGVwMCA8PSAwIG9yIGlQcmVkU3RlcDAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgIC0gICAgaVByZWRTdGVwMSA8PSAwIG9yIGlQcmVkU3RlcDEgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgIC0gICAgaURzdFN0ZXAgPD0gMCBvciBpRHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgNCBvciA4IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfQXZlcmFnZV80eCAoCi0gICAgY29uc3QgT01YX1U4ICpwUHJlZDAsCi0gICAgY29uc3QgT01YX1U4ICpwUHJlZDEsCi0gICAgT01YX1UzMiBpUHJlZFN0ZXAwLAotICAgIE9NWF9VMzIgaVByZWRTdGVwMSwKLSAgICBPTVhfVTggKnBEc3RQcmVkLAotICAgIE9NWF9VMzIgaURzdFN0ZXAsCi0gICAgT01YX1UzMiBpSGVpZ2h0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMgICAoNi4zLjUuNi4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyAyeDIgSGFkYW1hcmQgdHJhbnNmb3JtIG9mIGNocm9tYSBEQyBjb2VmZmljaWVudHMgCi0gKiBhbmQgdGhlbiBxdWFudGl6ZXMgdGhlIGNvZWZmaWNpZW50cy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdGhlIDJ4MiBhcnJheSBvZiBjaHJvbWEgREMgY29lZmZpY2llbnRzLiAgOC1ieXRlIAotICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAotICogICBiSW50cmEgLSBJbmRpY2F0ZSB3aGV0aGVyIHRoaXMgaXMgYW4gSU5UUkEgYmxvY2suIDEtSU5UUkEsIDAtSU5URVIgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRyYW5zZm9ybWVkIGFuZCBxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgOC1ieXRlIAotICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgICAgICBwU3JjRHN0IAotICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDICgKLSAgICBPTVhfUzE2ICpwU3JjRHN0LAotICAgIE9NWF9VMzIgaVFQLAotICAgIE9NWF9VOCBiSW50cmEKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMgICAoNi4zLjUuNi4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBhIDR4NCBIYWRhbWFyZCB0cmFuc2Zvcm0gb2YgbHVtYSBEQyBjb2VmZmljaWVudHMgCi0gKiBhbmQgdGhlbiBxdWFudGl6ZXMgdGhlIGNvZWZmaWNpZW50cy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdGhlIDR4NCBhcnJheSBvZiBsdW1hIERDIGNvZWZmaWNpZW50cy4gIDE2LWJ5dGUgCi0gKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRyYW5zZm9ybWVkIGFuZCBxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgMTYtYnl0ZSAKLSAqICAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0IAotICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGFuIDE2LWJ5dGUgYm91bmRhcnkgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMgKAotICAgIE9NWF9TMTYgKnBTcmNEc3QsCi0gICAgT01YX1UzMiBpUVAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQyAgICg2LjMuNS42LjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgNHg0IEhhZGFtYXJkIHRyYW5zZm9ybSBhbmQgdGhlbiBkZXF1YW50aXplcyAKLSAqIHRoZSBjb2VmZmljaWVudHMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSA0eDQgYXJyYXkgb2YgdGhlIDR4NCBIYWRhbWFyZC10cmFuc2Zvcm1lZCBhbmQgCi0gKiAgICAgICAgICAgIHF1YW50aXplZCBjb2VmZmljaWVudHMuICAxNiBieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBQb2ludGVyIHRvIGludmVyc2UtdHJhbnNmb3JtZWQgYW5kIGRlcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIAotICogICAgICAgICAgICAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjIAotICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMgKAotICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCi0gICAgT01YX1MxNiAqcERzdCwKLSAgICBPTVhfVTMyIGlRUAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMgICAoNi4zLjUuNi40KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIDJ4MiBIYWRhbWFyZCB0cmFuc2Zvcm0gYW5kIHRoZW4gZGVxdWFudGl6ZXMgCi0gKiB0aGUgY29lZmZpY2llbnRzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgMngyIGFycmF5IG9mIHRoZSAyeDIgSGFkYW1hcmQtdHJhbnNmb3JtZWQgYW5kIAotICogICAgICAgICAgICBxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgOCBieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBQb2ludGVyIHRvIGludmVyc2UtdHJhbnNmb3JtZWQgYW5kIGRlcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIAotICogICAgICAgICAgICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMgCi0gKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDICgKLSAgICBjb25zdCBPTVhfUzE2ICpwU3JjLAotICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgT01YX1UzMiBpUVAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZCAgICg2LjMuNS43LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgYW4gNHg0IGludGVnZXIgdHJhbnNmb3JtYXRpb24gdG8gcHJvZHVjZSAKLSAqIHRoZSBkaWZmZXJlbmNlIHNpZ25hbCBhbmQgdGhlbiBhZGRzIHRoZSBkaWZmZXJlbmNlIHRvIHRoZSBwcmVkaWN0aW9uIHRvIGdldCAKLSAqIHRoZSByZWNvbnN0cnVjdGVkIHNpZ25hbC4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY1ByZWQgLSBQb2ludGVyIHRvIHByZWRpY3Rpb24gc2lnbmFsLiAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIHBEZXF1YW50Q29lZmYgLSBQb2ludGVyIHRvIHRoZSB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMuICA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIGlTcmNQcmVkU3RlcCAtIFN0ZXAgb2YgdGhlIHByZWRpY3Rpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIGlEc3RSZWNvblN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiByZWNvbnN0cnVjdGlvbiBidWZmZXI7IG11c3QgYmUgYSAKLSAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIGJBQyAtIEluZGljYXRlIHdoZXRoZXIgdGhlcmUgaXMgQUMgY29lZmZpY2llbnRzIGluIHRoZSBjb2VmZmljaWVudHMgCi0gKiAgICAgICAgICAgIG1hdHJpeC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RSZWNvbiAtUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gcmVjb25zdHJ1Y3Rpb24gYnVmZmVyLiAgNC1ieXRlIAotICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgICAgIHBTcmNQcmVkLCBwRGVxdWFudENvZWZmLCBwRHN0UmVjb24gCi0gKiAgICAtICAgIHBTcmNQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBpU3JjUHJlZFN0ZXAgb3IgaURzdFJlY29uU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgIC0gICAgcERlcXVhbnRDb2VmZiBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUHJlZCwKLSAgICBjb25zdCBPTVhfUzE2ICpwRGVxdWFudENvZWZmLAotICAgIE9NWF9VOCAqcERzdFJlY29uLAotICAgIE9NWF9VMzIgaVNyY1ByZWRTdGVwLAotICAgIE9NWF9VMzIgaURzdFJlY29uU3RlcCwKLSAgICBPTVhfVTggYkFDCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwgICAoNi4zLjUuOC4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBzdWJ0cmFjdHMgdGhlIHByZWRpY3Rpb24gc2lnbmFsIGZyb20gdGhlIG9yaWdpbmFsIHNpZ25hbCB0byAKLSAqIHByb2R1Y2UgdGhlIGRpZmZlcmVuY2Ugc2lnbmFsIGFuZCB0aGVuIHBlcmZvcm1zIGEgNHg0IGludGVnZXIgdHJhbnNmb3JtIGFuZCAKLSAqIHF1YW50aXphdGlvbi4gVGhlIHF1YW50aXplZCB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMgYXJlIHN0b3JlZCBhcyAKLSAqIHBEc3RRdWFudENvZWZmLiBUaGlzIGZ1bmN0aW9uIGNhbiBhbHNvIG91dHB1dCBkZXF1YW50aXplZCBjb2VmZmljaWVudHMgb3IgCi0gKiB1bnF1YW50aXplZCBEQyBjb2VmZmljaWVudHMgb3B0aW9uYWxseSBieSBzZXR0aW5nIHRoZSBwb2ludGVycyAKLSAqIHBEc3REZVF1YW50Q29lZmYsIHBEQ0NvZWZmLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjT3JnIC0gUG9pbnRlciB0byBvcmlnaW5hbCBzaWduYWwuIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBwU3JjUHJlZCAtIFBvaW50ZXIgdG8gcHJlZGljdGlvbiBzaWduYWwuIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBpU3JjT3JnU3RlcCAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIHNpZ25hbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAKLSAqICAgICAgICAgICAgNC4gCi0gKiAgIGlTcmNQcmVkU3RlcCAtIFN0ZXAgb2YgdGhlIHByZWRpY3Rpb24gc2lnbmFsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIAotICogICAgICAgICAgICBvZiA0LiAKLSAqICAgcE51bUNvZWZmIC1OdW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIGFmdGVyIHF1YW50aXphdGlvbi4gSWYgdGhpcyAKLSAqICAgICAgICAgICAgcGFyYW1ldGVyIGlzIG5vdCByZXF1aXJlZCwgaXQgaXMgc2V0IHRvIE5VTEwuIAotICogICBuVGhyZXNoU0FEIC0gWmVyby1ibG9jayBlYXJseSBkZXRlY3Rpb24gdGhyZXNob2xkLiBJZiB0aGlzIHBhcmFtZXRlciBpcyAKLSAqICAgICAgICAgICAgbm90IHJlcXVpcmVkLCBpdCBpcyBzZXQgdG8gMC4gCi0gKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCi0gKiAgIGJJbnRyYSAtIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgaXMgYW4gSU5UUkEgYmxvY2ssIGVpdGhlciAxLUlOVFJBIG9yIAotICogICAgICAgICAgICAwLUlOVEVSIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0UXVhbnRDb2VmZiAtIFBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMuICAKLSAqICAgICAgICAgICAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIHBEc3REZVF1YW50Q29lZmYgLSBQb2ludGVyIHRvIHRoZSBkZXF1YW50aXplZCB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMgCi0gKiAgICAgICAgICAgIGlmIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCBlcXVhbCB0byBOVUxMLiAgOC1ieXRlIGFsaWdubWVudCAKLSAqICAgICAgICAgICAgcmVxdWlyZWQuIAotICogICBwRENDb2VmZiAtIFBvaW50ZXIgdG8gdGhlIHVucXVhbnRpemVkIERDIGNvZWZmaWNpZW50IGlmIHRoaXMgcGFyYW1ldGVyIAotICogICAgICAgICAgICBpcyBub3QgZXF1YWwgdG8gTlVMTC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgICAgcFNyY09yZywgcFNyY1ByZWQsIHBOdW1Db2VmZiwgcERzdFF1YW50Q29lZmYsIAotICogICAgICAgICAgICBwRHN0RGVRdWFudENvZWZmLCBwRENDb2VmZiAKLSAqICAgIC0gICAgcFNyY09yZyBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgcFNyY1ByZWQgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGlTcmNPcmdTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKiAgICAtICAgIGlTcmNQcmVkU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICogICAgLSAgICBwRHN0UXVhbnRDb2VmZiBvciBwRHN0RGVRdWFudENvZWZmIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNPcmcsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUHJlZCwKLSAgICBPTVhfVTMyIGlTcmNPcmdTdGVwLAotICAgIE9NWF9VMzIgaVNyY1ByZWRTdGVwLAotICAgIE9NWF9TMTYgKnBEc3RRdWFudENvZWZmLAotICAgIE9NWF9TMTYgKnBEc3REZVF1YW50Q29lZmYsCi0gICAgT01YX1MxNiAqcERDQ29lZmYsCi0gICAgT01YX1M4ICpwTnVtQ29lZmYsCi0gICAgT01YX1UzMiBuVGhyZXNoU0FELAotICAgIE9NWF9VMzIgaVFQLAotICAgIE9NWF9VOCBiSW50cmEKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9HZXRWTENJbmZvICAgKDYuMy41LjkuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gZXh0cmFjdHMgcnVuLWxlbmd0aCBlbmNvZGluZyAoUkxFKSBpbmZvcm1hdGlvbiBmcm9tIHRoZSAKLSAqIGNvZWZmaWNpZW50IG1hdHJpeC4gIFRoZSByZXN1bHRzIGFyZSByZXR1cm5lZCBpbiBhbiBPTVhWQ000UDEwVkxDSW5mbyAKLSAqIHN0cnVjdHVyZS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0NvZWZmIC0gcG9pbnRlciB0byB0aGUgdHJhbnNmb3JtIGNvZWZmaWNpZW50IG1hdHJpeC4gIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgcFNjYW5NYXRyaXggLSBwb2ludGVyIHRvIHRoZSBzY2FuIG9yZGVyIGRlZmluaXRpb24gbWF0cml4LiAgRm9yIGEgbHVtYSAKLSAqICAgICAgICAgICAgYmxvY2sgdGhlIHNjYW4gbWF0cml4IHNob3VsZCBmb2xsb3cgW0lTTzE0NDk2LTEwXSBzZWN0aW9uIDguNS40LCAKLSAqICAgICAgICAgICAgYW5kIHNob3VsZCBjb250YWluIHRoZSB2YWx1ZXMgMCwgMSwgNCwgOCwgNSwgMiwgMywgNiwgOSwgMTIsIDEzLCAKLSAqICAgICAgICAgICAgMTAsIDcsIDExLCAxNCwgMTUuICBGb3IgYSBjaHJvbWEgYmxvY2ssIHRoZSBzY2FuIG1hdHJpeCBzaG91bGQgCi0gKiAgICAgICAgICAgIGNvbnRhaW4gdGhlIHZhbHVlcyAwLCAxLCAyLCAzLiAKLSAqICAgYkFDIC0gaW5kaWNhdGVzIHByZXNlbmNlIG9mIGEgREMgY29lZmZpY2llbnQ7IDAgPSBEQyBjb2VmZmljaWVudCAKLSAqICAgICAgICAgICAgcHJlc2VudCwgMT0gREMgY29lZmZpY2llbnQgYWJzZW50LiAKLSAqICAgTWF4TnVtQ29lZiAtIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBjb250YWluZWQgaW4gdGhlIAotICogICAgICAgICAgICB0cmFuc2Zvcm0gY29lZmZpY2llbnQgbWF0cml4LCBwU3JjQ29lZmYuIFRoZSB2YWx1ZSBzaG91bGQgYmUgMTYgCi0gKiAgICAgICAgICAgIGZvciBibG9ja3Mgb2YgdHlwZSBMVU1BREMsIExVTUFBQywgTFVNQUxFVkVMLCBhbmQgQ0hST01BQUMuIFRoZSAKLSAqICAgICAgICAgICAgdmFsdWUgc2hvdWxkIGJlIDQgZm9yIGJsb2NrcyBvZiB0eXBlIENIUk9NQURDLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFZMQ0luZm8gLSBwb2ludGVyIHRvIHN0cnVjdHVyZSB0aGF0IHN0b3JlcyBpbmZvcm1hdGlvbiBmb3IgCi0gKiAgICAgICAgICAgIHJ1bi1sZW5ndGggY29kaW5nLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICAgICBwU3JjQ29lZmYsIHBTY2FuTWF0cml4LCBwRHN0VkxDSW5mbyAKLSAqICAgIC0gICAgcFNyY0NvZWZmIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0dldFZMQ0luZm8gKAotICAgIGNvbnN0IE9NWF9TMTYgKnBTcmNDb2VmZiwKLSAgICBjb25zdCBPTVhfVTggKnBTY2FuTWF0cml4LAotICAgIE9NWF9VOCBiQUMsCi0gICAgT01YX1UzMiBNYXhOdW1Db2VmLAotICAgIE9NWFZDTTRQMTBWTENJbmZvKnBEc3RWTENJbmZvCi0pOwotCi0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qKiBlbmQgb2YgI2RlZmluZSBfT01YVkNfSF8gKi8KLQotLyoqIEVPRiAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvYXBpL29teFZDX3MuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9hcGkvb214VkNfcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWYzMDQwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9hcGkvb214VkNfcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLTsvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07Ly8gQ29weXJpZ2h0IChjKSAxOTk5LTIwMDUgVGhlIEtocm9ub3MgR3JvdXAgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkCi07Ly8KLTsvLwotOy8vCi07Ly8KLTsvLwotOy8vCi07Ly8KLTsvLwotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotOy8qKiA9PT09PT09PT09PT09PT0gU3RydWN0dXJlIERlZmluaXRpb24gZm9yIFNhbXBsZSBHZW5lcmF0aW9uID09PT09PT09PT09PT09ICovCi07LyoqIHRyYW5zcGFyZW50IHN0YXR1cyAqLwotCi07ZW51bSB7Ci1PTVhfVklERU9fVFJBTlNQQVJFTlQJRVFVIDA7CS8qKiBXaG9sbHkgdHJhbnNwYXJlbnQgKi8KLU9NWF9WSURFT19QQVJUSUFMCQlFUVUgMTsJLyoqIFBhcnRpYWxseSB0cmFuc3BhcmVudCAqLwotT01YX1ZJREVPX09QQVFVRQkJRVFVIDI7CS8qKiBPcGFxdWUgKi8KLTt9Ci0KLTsvKiogZGlyZWN0aW9uICovCi07ZW51bSB7Ci1PTVhfVklERU9fTk9ORQkJCUVRVSAwOwotT01YX1ZJREVPX0hPUklaT05UQUwJRVFVIDE7Ci1PTVhfVklERU9fVkVSVElDQUwJCUVRVSAyOwotO30KLQotOy8qKiBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIHR5cGUgKi8KLTtlbnVtIHsKLU9NWF9WSURFT19JTlRFR0VSX1BJWEVMIEVRVSAwOwkvKiogY2FzZSBhICovCi1PTVhfVklERU9fSEFMRl9QSVhFTF9YICBFUVUgMTsJLyoqIGNhc2UgYiAqLwotT01YX1ZJREVPX0hBTEZfUElYRUxfWSAgRVFVIDI7CS8qKiBjYXNlIGMgKi8KLU9NWF9WSURFT19IQUxGX1BJWEVMX1hZIEVRVSAzOwkvKiogY2FzZSBkICovCi07fQotCi07ZW51bSB7Ci1PTVhfVVBQRVIgIAkJCQlFUVUgMTsJCS8qKiBzZXQgaWYgdGhlIGFib3ZlIG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCi1PTVhfTEVGVCAgIAkJCQlFUVUgMjsJCS8qKiBzZXQgaWYgdGhlIGxlZnQgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KLU9NWF9DRU5URVIgCQkJCUVRVSA0OwotT01YX1JJR0hUCQkJCUVRVSA4OwotT01YX0xPV0VSICAJCQkJRVFVCTE2OwotT01YX1VQUEVSX0xFRlQgIAkJRVFVIDMyOwkJLyoqIHNldCBpZiB0aGUgYWJvdmUtbGVmdCBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLwotT01YX1VQUEVSX1JJR0hUIAkJRVFVIDY0OwkJLyoqIHNldCBpZiB0aGUgYWJvdmUtcmlnaHQgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KLU9NWF9MT1dFUl9MRUZUICAJCUVRVSAxMjg7Ci1PTVhfTE9XRVJfUklHSFQgCQlFUVUgMjU2Ci07fQotCi07ZW51bSB7Ci1PTVhfVklERU9fTFVNSU5BTkNFICAJRVFVIDA7CS8qKiBMdW1pbmFuY2UgY29tcG9uZW50ICovCi1PTVhfVklERU9fQ0hST01JTkFOQ0UgIAlFUVUgMTsJLyoqIGNocm9taW5hbmNlIGNvbXBvbmVudCAqLwotT01YX1ZJREVPX0FMUEhBICAJCUVRVSAyOwkvKiogQWxwaGEgY29tcG9uZW50ICovCi07fQotCi07ZW51bSB7Ci1PTVhfVklERU9fSU5URVIJCQlFUVUgMDsJLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLwotT01YX1ZJREVPX0lOVEVSX1EJCUVRVSAxOwkvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCi1PTVhfVklERU9fSU5URVI0VgkJRVFVIDI7CS8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KLU9NWF9WSURFT19JTlRSQQkJCUVRVSAzOwkvKiogSSBhbmQgUCBwaWN0dXJlOyBJLSBhbmQgUC1WT1AgKi8KLU9NWF9WSURFT19JTlRSQV9RCQlFUVUgNDsJLyoqIEkgYW5kIFAgcGljdHVyZTsgSS0gYW5kIFAtVk9QICovCi1PTVhfVklERU9fSU5URVI0Vl9RCQlFUVUgNTsJLyoqIFAgcGljdHVyZSBvciBQLVZPUCAoSC4yNjMpKi8KLU9NWF9WSURFT19ESVJFQ1QJCUVRVSA2OwkvKiogQiBwaWN0dXJlIG9yIEItVk9QIChNUEVHLTQgb25seSkgKi8KLU9NWF9WSURFT19JTlRFUlBPTEFURQlFUVUgNzsJLyoqIEIgcGljdHVyZSBvciBCLVZPUCAqLwotT01YX1ZJREVPX0JBQ0tXQVJECQlFUVUgODsJLyoqIEIgcGljdHVyZSBvciBCLVZPUCAqLwotT01YX1ZJREVPX0ZPUldBUkQJCUVRVSA5OwkvKiogQiBwaWN0dXJlIG9yIEItVk9QICovCi1PTVhfVklERU9fTk9UQ09ERUQJCUVRVSAxMDsJLyoqIEIgcGljdHVyZSBvciBCLVZPUCAqLwotO30KLQotO2VudW0gewotT01YXzE2WDE2X1ZFUlQgCQkJRVFVIDA7CQkvKiogSW50cmFfMTZ4MTZfVmVydGljYWwgKHByZWRpY3Rpb24gbW9kZSkgKi8KLU9NWF8xNlgxNl9IT1IgCQkJRVFVIDE7CQkvKiogSW50cmFfMTZ4MTZfSG9yaXpvbnRhbCAocHJlZGljdGlvbiBtb2RlKSAqLwotT01YXzE2WDE2X0RDIAkJCUVRVSAyOwkJLyoqIEludHJhXzE2eDE2X0RDIChwcmVkaWN0aW9uIG1vZGUpICovCi1PTVhfMTZYMTZfUExBTkUgCQlFUVUgMzsJLyoqIEludHJhXzE2eDE2X1BsYW5lIChwcmVkaWN0aW9uIG1vZGUpICovCi07fQotCi07ZW51bSB7Ci1PTVhfNHg0X1ZFUlQgCQkJRVFVIDA7CQkvKiogSW50cmFfNHg0X1ZlcnRpY2FsIChwcmVkaWN0aW9uIG1vZGUpICovCi1PTVhfNHg0X0hPUiAgCQkJRVFVIDE7CQkvKiogSW50cmFfNHg0X0hvcml6b250YWwgKHByZWRpY3Rpb24gbW9kZSkgKi8KLU9NWF80eDRfREMgICAJCQlFUVUgMjsJCS8qKiBJbnRyYV80eDRfREMgKHByZWRpY3Rpb24gbW9kZSkgKi8KLU9NWF80eDRfRElBR19ETCAJCUVRVSAzOwkvKiogSW50cmFfNHg0X0RpYWdvbmFsX0Rvd25fTGVmdCAocHJlZGljdGlvbiBtb2RlKSAqLwotT01YXzR4NF9ESUFHX0RSIAkJRVFVIDQ7CS8qKiBJbnRyYV80eDRfRGlhZ29uYWxfRG93bl9SaWdodCAocHJlZGljdGlvbiBtb2RlKSAqLwotT01YXzR4NF9WUiAJCQkJRVFVIDU7CQkJLyoqIEludHJhXzR4NF9WZXJ0aWNhbF9SaWdodCAocHJlZGljdGlvbiBtb2RlKSAqLwotT01YXzR4NF9IRCAJCQkJRVFVIDY7CQkJLyoqIEludHJhXzR4NF9Ib3Jpem9udGFsX0Rvd24gKHByZWRpY3Rpb24gbW9kZSkgKi8KLU9NWF80eDRfVkwgCQkJCUVRVSA3OwkJCS8qKiBJbnRyYV80eDRfVmVydGljYWxfTGVmdCAocHJlZGljdGlvbiBtb2RlKSAqLwotT01YXzR4NF9IVSAJCQkJRVFVIDg7CQkJLyoqIEludHJhXzR4NF9Ib3Jpem9udGFsX1VwIChwcmVkaWN0aW9uIG1vZGUpICovCi07fQotCi07ZW51bSB7Ci1PTVhfQ0hST01BX0RDIAkJCUVRVSAwOwkJLyoqIEludHJhX0Nocm9tYV9EQyAocHJlZGljdGlvbiBtb2RlKSAqLwotT01YX0NIUk9NQV9IT1IgCQkJRVFVIDE7CQkvKiogSW50cmFfQ2hyb21hX0hvcml6b250YWwgKHByZWRpY3Rpb24gbW9kZSkgKi8KLU9NWF9DSFJPTUFfVkVSVCAJCUVRVSAyOwkvKiogSW50cmFfQ2hyb21hX1ZlcnRpY2FsIChwcmVkaWN0aW9uIG1vZGUpICovCi1PTVhfQ0hST01BX1BMQU5FIAkJRVFVIDM7CS8qKiBJbnRyYV9DaHJvbWFfUGxhbmUgKHByZWRpY3Rpb24gbW9kZSkgKi8KLTt9Ci0KLTt0eXBlZGVmCXN0cnVjdCB7CQoteAlFUVUJMDsKLXkJRVFVCTQ7Ci07fU9NWENvb3JkaW5hdGU7Ci0KLTt0eXBlZGVmIHN0cnVjdCB7Ci1keAlFUVUJMDsKLWR5CUVRVQkyOwotO31PTVhNb3Rpb25WZWN0b3I7Ci0KLTt0eXBlZGVmIHN0cnVjdCB7Ci14eAkJRVFVCTA7Ci15eQkJRVFVCTQ7Ci13aWR0aAlFUVUJODsKLWhlaWdodAlFUVUJMTI7Ci07fU9NWGlSZWN0OwotCi07dHlwZWRlZiBlbnVtIHsKLU9NWF9WQ19JTlRFUiAgICAgICAgIEVRVSAwOyAgICAgICAgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLwotT01YX1ZDX0lOVEVSX1EgICAgICAgRVFVIDE7ICAgICAgIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KLU9NWF9WQ19JTlRFUjRWICAgICAgIEVRVSAyOyAgICAgICAvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCi1PTVhfVkNfSU5UUkEgICAgICAgICBFUVUgMzsgICAgICAgIC8qKiBJIGFuZCBQIHBpY3R1cmUsIEktIGFuZCBQLVZPUCAqLwotT01YX1ZDX0lOVFJBX1EgICAgICAgRVFVIDQ7ICAgICAgIC8qKiBJIGFuZCBQIHBpY3R1cmUsIEktIGFuZCBQLVZPUCAqLwotT01YX1ZDX0lOVEVSNFZfUSAgICAgRVFVIDU7ICAgIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKEguMjYzKSovCi07fSBPTVhWQ000UDJNYWNyb2Jsb2NrVHlwZTsKLQotO2VudW0gewotT01YX1ZDX05PTkUgICAgICAgICAgRVFVIDAKLU9NWF9WQ19IT1JJWk9OVEFMICAgIEVRVSAxCi1PTVhfVkNfVkVSVElDQUwgICAgICBFUVUgMiAKLTt9OwotCi0KLQlFTkQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5MTZ4MTZfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5MTZ4MTZfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTZkNTlkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTE2eDE2X3MucworKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLSA7LyoqCi0gOyAqIEZ1bmN0aW9uOiBvbXhWQ0NPTU1fQ29weTE2eDE2Ci0gOyAqCi0gOyAqIERlc2NyaXB0aW9uOgotIDsgKiBDb3BpZXMgdGhlIHJlZmVyZW5jZSAxNngxNiBibG9jayB0byB0aGUgY3VycmVudCBibG9jay4KLSA7ICogUGFyYW1ldGVyczoKLSA7ICogW2luXSBwU3JjICAgICAgICAgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgaW4gdGhlIHNvdXJjZSBmcmFtZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDE2LWJ5dGUgYm91bmRhcnkuCi0gOyAqIFtpbl0gc3RlcCAgICAgICAgIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnRzIG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSByZWZlcmVuY2UgZnJhbWUsIGluIGJ5dGVzOwotIDsgKiAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNiBhbmQgbXVzdCBiZSBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byAxNi4KLSA7ICogW291dF0gcERzdCAgICAgICAgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4KLSA7ICogUmV0dXJuIFZhbHVlOgotIDsgKiBPTVhfU3RzX05vRXJyICAgICAtIG5vIGVycm9yCi0gOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSA7ICogICAgICAgICAgICAgICAgICAgLSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6ICBwU3JjLCBwRHN0Ci0gOyAqICAgICAgICAgICAgICAgICAgIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBub3QgYWxpZ25lZCBvbiBhbiAxNi1ieXRlIGJvdW5kYXJ5OiAgcFNyYywgcERzdAotIDsgKiAgICAgICAgICAgICAgICAgICAtIHN0ZXAgPDE2IG9yIHN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuICAKLSA7ICovCi0KLSAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAKLSAgICAgCi0gICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKLSAgICAgCi0gICAgIElGIENvcnRleEE4Ci0gICAgIAotICAgICAKLSA7Ly9JbnB1dCBBcmd1bWVudHMKLXBTcmMgICAgUk4gMCAgICAgICAgCi1wRHN0ICAgIFJOIDEgICAgICAgIAotc3RlcCAgICBSTiAyCi0KLTsvL0xvY2FsIFZhcmlhYmxlcwotUmV0dXJuICBSTiAwCi07Ly8gTmVvbiBSZWdpc3RlcnMKLQotWDAgICAgICBETiBEMC5TOCAKLVgxICAgICAgRE4gRDEuUzggCi1YMiAgICAgIEROIEQyLlM4Ci1YMyAgICAgIEROIEQzLlM4Ci1YNCAgICAgIEROIEQ0LlM4Ci1YNSAgICAgIEROIEQ1LlM4Ci1YNiAgICAgIEROIEQ2LlM4Ci1YNyAgICAgIEROIEQ3LlM4IAotIAotICAgICBNX1NUQVJUIG9teFZDQ09NTV9Db3B5MTZ4MTYKLSAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgVkxEMSAge1gwLFgxfSxbcFNyY0AxMjhdLHN0ZXAgICAgICAgOy8vIExvYWQgMTYgYnl0ZXMgZnJvbSAxNiBieXRlIGFsaWduZWQgcFNyYyBhbmQgcFNyYz1wU3JjICsgc3RlcCBhZnRlciBsb2FkaW5nCi0gICAgICAgIFZMRDEgIHtYMixYM30sW3BTcmNAMTI4XSxzdGVwCi0gICAgICAgIFZMRDEgIHtYNCxYNX0sW3BTcmNAMTI4XSxzdGVwCi0gICAgICAgIFZMRDEgIHtYNixYN30sW3BTcmNAMTI4XSxzdGVwCi0gICAgICAgIAotICAgICAgICBWU1QxICB7WDAsWDEsWDIsWDN9LFtwRHN0QDEyOF0hICAgICA7Ly8gU3RvcmUgMzIgYnl0ZXMgdG8gMTYgYnl0ZSBhbGlnbmVkIHBEc3QgICAKLSAgICAgICAgVlNUMSAge1g0LFg1LFg2LFg3fSxbcERzdEAxMjhdISAgICAgICAgCi0gICAgICAgICAgICAgICAKLSAgICAgICAgIAotICAgICAgICBWTEQxICB7WDAsWDF9LFtwU3JjQDEyOF0sc3RlcAotICAgICAgICBWTEQxICB7WDIsWDN9LFtwU3JjQDEyOF0sc3RlcAotICAgICAgICBWTEQxICB7WDQsWDV9LFtwU3JjQDEyOF0sc3RlcAotICAgICAgICBWTEQxICB7WDYsWDd9LFtwU3JjQDEyOF0sc3RlcAotICAgICAgICAKLSAgICAgICAgVlNUMSAge1gwLFgxLFgyLFgzfSxbcERzdEAxMjhdIQotICAgICAgICBWU1QxICB7WDQsWDUsWDYsWDd9LFtwRHN0QDEyOF0hCi0gICAgICAgICAKLSAgICAgIAotICAgICAgICBWTEQxICB7WDAsWDF9LFtwU3JjQDEyOF0sc3RlcAotICAgICAgICBWTEQxICB7WDIsWDN9LFtwU3JjQDEyOF0sc3RlcAotICAgICAgICBWTEQxICB7WDQsWDV9LFtwU3JjQDEyOF0sc3RlcAotICAgICAgICBWTEQxICB7WDYsWDd9LFtwU3JjQDEyOF0sc3RlcAotICAgICAgICAKLSAgICAgICAgVlNUMSAge1gwLFgxLFgyLFgzfSxbcERzdEAxMjhdISAgICAgICAgICAgICAgCi0gICAgICAgIFZTVDEgIHtYNCxYNSxYNixYN30sW3BEc3RAMTI4XSEgICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFZMRDEgIHtYMCxYMX0sW3BTcmNAMTI4XSxzdGVwCi0gICAgICAgIFZMRDEgIHtYMixYM30sW3BTcmNAMTI4XSxzdGVwCi0gICAgICAgIFZMRDEgIHtYNCxYNX0sW3BTcmNAMTI4XSxzdGVwCi0gICAgICAgIFZMRDEgIHtYNixYN30sW3BTcmNAMTI4XSxzdGVwCi0gICAgICAgIAotICAgICAgICBWU1QxICB7WDAsWDEsWDIsWDN9LFtwRHN0QDEyOF0hCi0gICAgICAgIFZTVDEgIHtYNCxYNSxYNixYN30sW3BEc3RAMTI4XSEKLQotICAgICAgICAKLSAgICAgICAgTU9WICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyCi0KLSAgICAgCi0gICAgICAgIAotICAgICAgICBNX0VORAotICAgICAgICBFTkRJRgotCi0KLQotICAgICAgICAKLSAgICAgICAgRU5ECi0gICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5OHg4X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OF9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiOWU1ZWYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5OHg4X3MucworKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLSA7LyoqCi0gOyAqIEZ1bmN0aW9uOiBvbXhWQ0NPTU1fQ29weTh4OAotIDsgKgotIDsgKiBEZXNjcmlwdGlvbjoKLSA7ICogQ29waWVzIHRoZSByZWZlcmVuY2UgOHg4IGJsb2NrIHRvIHRoZSBjdXJyZW50IGJsb2NrLgotIDsgKiBQYXJhbWV0ZXJzOgotIDsgKiBbaW5dIHBTcmMgICAgICAgICAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayBpbiB0aGUgc291cmNlIGZyYW1lOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LgotIDsgKiBbaW5dIHN0ZXAgICAgICAgICAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0cyBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgcmVmZXJlbmNlIGZyYW1lLCBpbiBieXRlczsKLSA7ICogICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOCBhbmQgbXVzdCBiZSBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byA4LgotIDsgKiBbb3V0XSBwRHN0ICAgICAgICAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LgotIDsgKiBSZXR1cm4gVmFsdWU6Ci0gOyAqIE9NWF9TdHNfTm9FcnIgICAgIC0gbm8gZXJyb3IKLSA7ICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotIDsgKiAgICAgICAgICAgICAgICAgICAtIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogIHBTcmMsIHBEc3QKLSA7ICogICAgICAgICAgICAgICAgICAgLSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeTogIHBTcmMsIHBEc3QKLSA7ICogICAgICAgICAgICAgICAgICAgLSBzdGVwIDw4IG9yIHN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gIAotIDsgKi8KLQotICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgIAotICAgICAKLSAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAotICAgICAKLSAgICAgSUYgQ29ydGV4QTgKLSAgICAgCi0gICAgIAotIDsvL0lucHV0IEFyZ3VtZW50cwotcFNyYyAgICBSTiAwICAgICAgICAKLXBEc3QgICAgUk4gMSAgICAgICAgCi1zdGVwICAgIFJOIDIKLQotOy8vTG9jYWwgVmFyaWFibGVzCi1Db3VudCAgIFJOIDMKLVJldHVybiAgUk4gMAotOy8vIE5lb24gUmVnaXN0ZXJzCi0KLVgwICAgICAgRE4gRDAuUzggCi1YMSAgICAgIEROIEQxLlM4Ci1YMiAgICAgIEROIEQyLlM4Ci1YMyAgICAgIEROIEQzLlM4Ci0gICAgIE1fU1RBUlQgb214VkNDT01NX0NvcHk4eDgKLSAgICAgICAgCi0gICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFZMRDEgIHtYMH0sW3BTcmNdLHN0ZXAgICAgICAgICAgICA7Ly8gTG9hZCA4IGJ5dGVzIGZyb20gOCBieXRlIGFsaWduZWQgcFNyYywgcFNyYz1wU3JjK3N0ZXAgYWZ0ZXIgbG9hZAotICAgICAgICBWTEQxICB7WDF9LFtwU3JjXSxzdGVwCi0gICAgICAgIFZMRDEgIHtYMn0sW3BTcmNdLHN0ZXAKLSAgICAgICAgVkxEMSAge1gzfSxbcFNyY10sc3RlcAotICAgICAgICAKLSAgICAgICAgVlNUMSAge1gwLFgxfSxbcERzdF0hICAgICAgICAgICAgOy8vIFN0b3JlIDE2IGJ5dGVzIHRvIDggYnl0ZSBhbGlnbmVkIHBEc3QgIAotICAgICAgICBWU1QxICB7WDIsWDN9LFtwRHN0XSEgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgVkxEMSAge1gwfSxbcFNyY10sc3RlcAotICAgICAgICBWTEQxICB7WDF9LFtwU3JjXSxzdGVwCi0gICAgICAgIFZMRDEgIHtYMn0sW3BTcmNdLHN0ZXAKLSAgICAgICAgVkxEMSAge1gzfSxbcFNyY10sc3RlcAotICAgICAgICAKLSAgICAgICAgVlNUMSAge1gwLFgxfSxbcERzdF0hICAgICAgICAgICAgICAKLSAgICAgICAgVlNUMSAge1gyLFgzfSxbcERzdF0hICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICBNT1YgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIKLSAgICAgICAgICAgICAKLSAgICAgICAgTV9FTkQKLSAgICAgICAgRU5ESUYKLQotCi0KLSAgICAgICAgCi0gICAgICAgIEVORAotICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0lfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9FeHBhbmRGcmFtZV9JX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q2YjY2OS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0lfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBvbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi07Ly8gRGVzY3JpcHRpb246Ci07Ly8gVGhpcyBmdW5jdGlvbiB3aWxsIEV4cGFuZCBGcmFtZSBib3VuZGFyeSBwaXhlbHMgaW50byBQbGFuZQotOy8vIAotOy8vIAotCi07Ly8gSW5jbHVkZSBzdGFuZGFyZCBoZWFkZXJzCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLSAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAotCi07Ly8gSW1wb3J0IHN5bWJvbHMgcmVxdWlyZWQgZnJvbSBvdGhlciBmaWxlcwotOy8vIChGb3IgZXhhbXBsZSB0YWJsZXMpCi0gICAgCi0gIAotOy8vIFNldCBkZWJ1Z2dpbmcgbGV2ZWwgICAgICAgIAotREVCVUdfT04gICAgU0VUTCB7RkFMU0V9Ci0KLQotICAgIAotICAgIElGIENvcnRleEE4Ci0gICAgCi0gICAgICAgIE1fU1RBUlQgb214VkNDT01NX0V4cGFuZEZyYW1lX0kscjExCi0KLTsvL0lucHV0IHJlZ2lzdGVycwotCi1wU3JjRHN0UGxhbmUgICAgUk4gIDAKLWlGcmFtZVdpZHRoICAgICBSTiAgMQotaUZyYW1lSGVpZ2h0ICAgIFJOICAyICAgIAotaUV4cGFuZFBlbHMgICAgIFJOICAzCi1pUGxhbmVTdGVwICAgICAgUk4gIDQKLXBUb3AgICAgICAgICAgICBSTiAgNQotcEJvdCAgICAgICAgICAgIFJOICA2Ci1wRHN0VG9wICAgICAgICAgUk4gIDcKLXBEc3RCb3QgICAgICAgICBSTiAgOAotcExlZnQgICAgICAgICAgIFJOICA1Ci1wUmlnaHQgICAgICAgICAgUk4gIDYKLXBEc3RMZWZ0ICAgICAgICBSTiAgOQotcERzdFJpZ2h0ICAgICAgIFJOICAxMAotT2Zmc2V0ICAgICAgICAgIFJOICAxMQotVGVtcCAgICAgICAgICAgIFJOICAxNAotQ291bnRlciAgICAgICAgIFJOICAxMgotVG1wICAgICAgICAgICAgIFJOICA3Ci07Ly9PdXRwdXQgcmVnaXN0ZXJzCi0KLXJlc3VsdCAgICAgICAgICBSTiAgMAotOy8vIE5lb24gcmVnaXN0ZXJzCi1xRGF0YTAgICAgICAgICAgUU4gIDAuVTgKLXFEYXRhMSAgICAgICAgICBRTiAgMS5VOAotZERhdGEwICAgICAgICAgIEROICAwLlU4Ci1kRGF0YTEgICAgICAgICAgRE4gIDEuVTgKLWREYXRhMiAgICAgICAgICBETiAgMi5VOAotZERhdGEzICAgICAgICAgIEROICAzLlU4Ci0KLSAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKLSAgICAgICAgTV9BUkcgICAgICAgcFBsYW5lU3RlcCwgNAotICAgICAgICAKLSAgICAgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKLSAgICAgICAgTV9MRFIgICAgICAgaVBsYW5lU3RlcCwgcFBsYW5lU3RlcAotICAgICAgICAKLSAgICAgICAgU1VCICAgICAgICAgcFRvcCwgcFNyY0RzdFBsYW5lLCAjMCAgICAgICAgICAgICAgOy8vIFRvcCByb3cgcG9pbnRlciBvZiB0aGUgZnJhbWUKLSAgICAgICAgTVVMICAgICAgICAgT2Zmc2V0LCBpRXhwYW5kUGVscywgaVBsYW5lU3RlcCAgICAgOy8vIEUqU3RlcCAgICAgICAgCi0gICAgICAgIFNVQiAgICAgICAgIFRlbXAsIGlGcmFtZUhlaWdodCwgIzEgICAgICAgICAgICAgIDsvLyBILTEKLSAgICAgICAgTVVMICAgICAgICAgVGVtcCwgaVBsYW5lU3RlcCwgVGVtcCAgICAgICAgICAgICAgOy8vIChILTEpKlN0ZXAKLSAgICAgICAgQUREICAgICAgICAgcEJvdCwgVGVtcCwgcFNyY0RzdFBsYW5lICAgICAgICAgICAgOy8vIEJQdHIgPSBUUHRyICsgKEgtMSkqU3RlcAotICAgICAgICBNT1YgICAgICAgICBUZW1wLCBpRnJhbWVXaWR0aCAgICAgICAgICAgICAgICAgICA7Ly8gT3V0ZXIgbG9vcCBjb3VudGVyCi0gICAgICAgIAotICAgICAgICA7Ly8gQ2hlY2sgaWYgcFNyY0RzdFBsYW5lIGFuZCBpUGxhbmVTdGVwIGFyZSAxNiBieXRlIGFsaWduZWQKLSAgICAgICAgVFNUICAgICAgICAgcFNyY0RzdFBsYW5lLCAjMHhmCi0gICAgICAgIFRTVEVRICAgICAgIGlQbGFuZVN0ZXAsICMweGYgICAgICAgIAotICAgICAgICBCTkUgICAgICAgICBIb3I4TG9vcDAwCi0gICAgICAgIAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIENvcHkgdG9wIGFuZCBib3R0b20gcmVnaW9uIG9mIHRoZSBwbGFuZSBhcyBmb2xsb3dzCi0gICAgICAgIDsvLyB0b3AgcmVnaW9uID0gdG9wIHJvdyBlbGVtZW50cyBmcm9tIHRoZSBmcmFtZQotICAgICAgICA7Ly8gYm90dG9tIHJlZ2lvbiA9IGxhc3Qgcm93IGVsZW1lbnRzIGZyb20gdGhlIGZyYW1lCi0gICAgICAgIDsvLwotCi0gICAgICAgIDsvLyBDYXNlIGZvciAxNiBieXRlIGFsaWdubWVudAotSG9yMTZMb29wMDAKLSAgICAgICAgU1VCICAgICAgICAgcERzdFRvcCwgcFRvcCwgT2Zmc2V0Ci0gICAgICAgIFZMRDEgICAgICAgIHFEYXRhMCwgW3BUb3AgQDEyOF0hCi0gICAgICAgIE1PViAgICAgICAgIENvdW50ZXIsIGlFeHBhbmRQZWxzICAgICAgICAgICAgICAgIDsvLyBJbm5lciBsb29wIGNvdW50ZXIKLSAgICAgICAgQUREICAgICAgICAgcERzdEJvdCwgcEJvdCwgaVBsYW5lU3RlcAotICAgICAgICBWTEQxICAgICAgICBxRGF0YTEsIFtwQm90IEAxMjhdIQotVmVyMTZMb29wMAotICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEAxMjhdLCBpUGxhbmVTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDEyOF0sIGlQbGFuZVN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBAMTI4XSwgaVBsYW5lU3RlcAotICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEAxMjhdLCBpUGxhbmVTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDEyOF0sIGlQbGFuZVN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBAMTI4XSwgaVBsYW5lU3RlcAotICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEAxMjhdLCBpUGxhbmVTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDEyOF0sIGlQbGFuZVN0ZXAKLSAgICAgICAgU1VCUyAgICAgICAgQ291bnRlciwgQ291bnRlciwgIzgKLSAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBAMTI4XSwgaVBsYW5lU3RlcAotICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEAxMjhdLCBpUGxhbmVTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDEyOF0sIGlQbGFuZVN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBAMTI4XSwgaVBsYW5lU3RlcAotICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEAxMjhdLCBpUGxhbmVTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDEyOF0sIGlQbGFuZVN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBAMTI4XSwgaVBsYW5lU3RlcAotICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEAxMjhdLCBpUGxhbmVTdGVwICAgICAgICAKLSAgICAgICAgQkdUICAgICAgICAgVmVyMTZMb29wMAotCi0gICAgICAgIFNVQlMgICAgICAgIFRlbXAsIFRlbXAsICMxNgotICAgICAgICBCR1QgICAgICAgICBIb3IxNkxvb3AwMAotICAgICAgICBCICAgICAgICAgICBFbmRBbGlnbmVkTG9vcAotICAgICAgICAKLSAgICAgICAgOy8vIENhc2UgZm9yIDggYnl0ZSBhbGlnbm1lbnQKLUhvcjhMb29wMDAKLSAgICAgICAgU1VCICAgICAgICAgcERzdFRvcCwgcFRvcCwgT2Zmc2V0Ci0gICAgICAgIFZMRDEgICAgICAgIHFEYXRhMCwgW3BUb3AgQDY0XSEKLSAgICAgICAgTU9WICAgICAgICAgQ291bnRlciwgaUV4cGFuZFBlbHMgICAgICAgICAgICAgICAgOy8vIElubmVyIGxvb3AgY291bnRlcgotICAgICAgICBBREQgICAgICAgICBwRHN0Qm90LCBwQm90LCBpUGxhbmVTdGVwCi0gICAgICAgIFZMRDEgICAgICAgIHFEYXRhMSwgW3BCb3QgQDY0XSEKLVZlcjhMb29wMAotICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEA2NF0sIGlQbGFuZVN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBANjRdLCBpUGxhbmVTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDY0XSwgaVBsYW5lU3RlcAotICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEA2NF0sIGlQbGFuZVN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBANjRdLCBpUGxhbmVTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDY0XSwgaVBsYW5lU3RlcAotICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEA2NF0sIGlQbGFuZVN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBANjRdLCBpUGxhbmVTdGVwCi0gICAgICAgIFNVQlMgICAgICAgIENvdW50ZXIsIENvdW50ZXIsICM4Ci0gICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDY0XSwgaVBsYW5lU3RlcAotICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEA2NF0sIGlQbGFuZVN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBANjRdLCBpUGxhbmVTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDY0XSwgaVBsYW5lU3RlcAotICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEA2NF0sIGlQbGFuZVN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBANjRdLCBpUGxhbmVTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDY0XSwgaVBsYW5lU3RlcAotICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEA2NF0sIGlQbGFuZVN0ZXAgICAgICAgIAotICAgICAgICBCR1QgICAgICAgICBWZXI4TG9vcDAKLQotICAgICAgICBTVUJTICAgICAgICBUZW1wLCBUZW1wLCAjMTYKLSAgICAgICAgQkdUICAgICAgICAgSG9yOExvb3AwMAotCi1FbmRBbGlnbmVkTG9vcAotICAgICAgICBBREQgICAgICAgICBUZW1wLCBwU3JjRHN0UGxhbmUsIGlGcmFtZVdpZHRoCi0gICAgICAgIFNVQiAgICAgICAgIHBEc3RSaWdodCwgVGVtcCwgT2Zmc2V0Ci0gICAgICAgIFNVQiAgICAgICAgIHBSaWdodCwgVGVtcCwgIzEKLSAgICAgICAgU1VCICAgICAgICAgcERzdExlZnQsIHBTcmNEc3RQbGFuZSwgT2Zmc2V0ICAgIAotICAgICAgICBTVUIgICAgICAgICBwRHN0TGVmdCwgcERzdExlZnQsIGlFeHBhbmRQZWxzICAgIAotICAgICAgICBBREQgICAgICAgICBwTGVmdCwgcFNyY0RzdFBsYW5lLCAjMAotICAgICAgICAKLSAgICAgICAgVkxEMSAgICAgICAge2REYXRhMCBbXX0sIFtwTGVmdF0sIGlQbGFuZVN0ZXAgICAgICAgIDsvLyBUb3AtTGVmdCBjb3JuZXIgcGl4ZWwgZnJvbSBmcmFtZSBkdXBsaWNhdGVkIGluIGREYXRhMAotICAgICAgICBTVUIgICAgICAgICBPZmZzZXQsIGlQbGFuZVN0ZXAsIGlFeHBhbmRQZWxzCi0gICAgICAgIFZMRDEgICAgICAgIHtkRGF0YTEgW119LCBbcFJpZ2h0XSwgaVBsYW5lU3RlcCAgICAgICA7Ly8gVG9wLVJpZ2h0IGNvcm5lciBwaXhlbCBmcm9tIGZyYW1lIGR1cGxpY2F0ZWQgaW4gZERhdGExCi0gICAgICAgIE1PViAgICAgICAgIFRlbXAsIGlFeHBhbmRQZWxzCi0KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBDb3B5IHRvcC1sZWZ0IGFuZCB0b3AtcmlnaHQgcmVnaW9uIG9mIHRoZSBwbGFuZSBhcyBmb2xsb3dzCi0gICAgICAgIDsvLyB0b3AtbGVmdCByZWdpb24gPSB0b3AtbGVmdCBjb3JuZXIgcGl4ZWwgZnJvbSB0aGUgZnJhbWUKLSAgICAgICAgOy8vIHRvcC1yaWdodCByZWdpb24gPSB0b3AtcmlnaHQgY29ybmVyIHBpeGVsIGZyb20gdGhlIGZyYW1lCi0gICAgICAgIDsvLwotSG9yTG9vcDExCi0gICAgICAgIE1PViAgICAgICAgIENvdW50ZXIsIGlFeHBhbmRQZWxzCi1WZXJMb29wMQotICAgICAgICBWU1QxICAgICAgICBkRGF0YTAsIFtwRHN0TGVmdF0sICM4Ci0gICAgICAgIFNVQlMgICAgICAgIENvdW50ZXIsIENvdW50ZXIsICM4Ci0gICAgICAgIFZTVDEgICAgICAgIGREYXRhMSwgW3BEc3RSaWdodF0sICM4ICAgICAgICAKLSAgICAgICAgQkdUICAgICAgICAgVmVyTG9vcDEKLQotICAgICAgICBTVUJTICAgICAgICBUZW1wLCBUZW1wLCAjMQotICAgICAgICBBREQgICAgICAgICBwRHN0TGVmdCwgcERzdExlZnQsIE9mZnNldAotICAgICAgICBBREQgICAgICAgICBwRHN0UmlnaHQsIHBEc3RSaWdodCwgT2Zmc2V0Ci0gICAgICAgIEJQTCAgICAgICAgIEhvckxvb3AxMQotCi0gICAgICAgIFNVQiAgICAgICAgIGlGcmFtZUhlaWdodCwgaUZyYW1lSGVpZ2h0LCAjMQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIENvcHkgbGVmdCBhbmQgcmlnaHQgcmVnaW9uIG9mIHRoZSBwbGFuZSBhcyBmb2xsb3dzCi0gICAgICAgIDsvLyBMZWZ0IHJlZ2lvbiA9IGNvcHkgdGhlIHJvdyB3aXRoIGxlZnQgc3RhcnQgcGl4ZWwgZnJvbSB0aGUgZnJhbWUKLSAgICAgICAgOy8vIFJpZ2h0IHJlZ2lvbiA9IGNvcHkgdGhlIHJvdyB3aXRoIHJpZ2h0IGVuZCBwaXhlbCBmcm9tIHRoZSBmcmFtZQotICAgICAgICA7Ly8KLUhvckxvb3AyMgotICAgICAgICBWTEQxICAgICAgICB7ZERhdGEwIFtdfSwgW3BMZWZ0XSwgaVBsYW5lU3RlcAotICAgICAgICBNT1YgICAgICAgICBDb3VudGVyLCBpRXhwYW5kUGVscwotICAgICAgICBWTEQxICAgICAgICB7ZERhdGExIFtdfSwgW3BSaWdodF0sIGlQbGFuZVN0ZXAKLVZlckxvb3AyCi0gICAgICAgIFZTVDEgICAgICAgIGREYXRhMCwgW3BEc3RMZWZ0XSwgIzgKLSAgICAgICAgU1VCUyAgICAgICAgQ291bnRlciwgQ291bnRlciwgIzgKLSAgICAgICAgVlNUMSAgICAgICAgZERhdGExLCBbcERzdFJpZ2h0XSwgIzggICAgICAgIAotICAgICAgICBCR1QgICAgICAgICBWZXJMb29wMgotCi0gICAgICAgIFNVQlMgICAgICAgIGlGcmFtZUhlaWdodCwgaUZyYW1lSGVpZ2h0LCAjMQotICAgICAgICBBREQgICAgICAgICBwRHN0TGVmdCwgcERzdExlZnQsIE9mZnNldAotICAgICAgICBBREQgICAgICAgICBwRHN0UmlnaHQsIHBEc3RSaWdodCwgT2Zmc2V0Ci0gICAgICAgIEJHVCAgICAgICAgIEhvckxvb3AyMgotICAgICAgICAgICAgICAgIAotICAgICAgICBNT1YgICAgICAgICBUZW1wLCBpRXhwYW5kUGVscwotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIENvcHkgYm90dG9tLWxlZnQgYW5kIGJvdHRvbS1yaWdodCByZWdpb24gb2YgdGhlIHBsYW5lIGFzIGZvbGxvd3MKLSAgICAgICAgOy8vIGJvdHRvbS1sZWZ0IHJlZ2lvbiA9IGJvdHRvbS1sZWZ0IGNvcm5lciBwaXhlbCBmcm9tIHRoZSBmcmFtZQotICAgICAgICA7Ly8gYm90dG9tLXJpZ2h0IHJlZ2lvbiA9IGJvdHRvbS1yaWdodCBjb3JuZXIgcGl4ZWwgZnJvbSB0aGUgZnJhbWUKLSAgICAgICAgOy8vCi1Ib3JMb29wMzMKLSAgICAgICAgTU9WICAgICAgICAgQ291bnRlciwgaUV4cGFuZFBlbHMKLVZlckxvb3AzCi0gICAgICAgIFZTVDEgICAgICAgIGREYXRhMCwgW3BEc3RMZWZ0XSwgIzgKLSAgICAgICAgU1VCUyAgICAgICAgQ291bnRlciwgQ291bnRlciwgIzgKLSAgICAgICAgVlNUMSAgICAgICAgZERhdGExLCBbcERzdFJpZ2h0XSwgIzggICAgICAgIAotICAgICAgICBCR1QgICAgICAgICBWZXJMb29wMwotCi0gICAgICAgIFNVQlMgICAgICAgIFRlbXAsIFRlbXAsICMxCi0gICAgICAgIEFERCAgICAgICAgIHBEc3RMZWZ0LCBwRHN0TGVmdCwgT2Zmc2V0Ci0gICAgICAgIEFERCAgICAgICAgIHBEc3RSaWdodCwgcERzdFJpZ2h0LCBPZmZzZXQKLSAgICAgICAgQkdUICAgICAgICAgSG9yTG9vcDMzCi1FbmQKLSAgICAgICAgTU9WICAgICAgICAgcjAsICNPTVhfU3RzX05vRXJyCi0gICAgICAgIAotICAgICAgICBNX0VORCAgICAKLSAgICAKLSAgICBFTkRJRgotCi0KLQotICAgICAgICAKLTsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKLSAgICAKLSAKLSAgICAgICAgICAgIAotICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvYXBpL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RkZTlhNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvYXBpL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIAotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgMTIyOTAKLSAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotICogCi0gKiAKLSAqIAotICogCi0gKiBIZWFkZXIgZmlsZSBmb3Igb3B0aW1pemVkIEguMjY0IENBTFZDIHRhYmxlcwotICogCi0gKi8KLSAKLSNpZm5kZWYgQVJNVkNNNFAxMF9DQVZMQ1RBQkxFU19ICi0jZGVmaW5lIEFSTVZDTTRQMTBfQ0FWTENUQUJMRVNfSAotICAKLS8qIENBVkxDIHRhYmxlcyAqLwotCi1leHRlcm4gY29uc3QgT01YX1UxNiAqYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNbMThdOwotZXh0ZXJuIGNvbnN0IE9NWF9VMTYgKmFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNbMTVdOwotZXh0ZXJuIGNvbnN0IE9NWF9VMTYgKmFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzWzNdOwotZXh0ZXJuIGNvbnN0IE9NWF9VMTYgKmFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNbMTVdOwotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1ppZ1phZ180eDRbMTZdOwotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1ppZ1phZ18yeDJbNF07Ci1leHRlcm4gY29uc3QgT01YX1M4IGFybVZDTTRQMTBfU3VmZml4VG9MZXZlbFs3XTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0F2ZXJhZ2VfNHhfQWxpZ25fdW5zYWZlX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYzZWI5Yi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjM2ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHhfQWxpZ25fdW5zYWZlX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDEyMjkwCi07Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotCi07Ly8gRnVuY3Rpb25zOgotOy8vICAgICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduPEFMSUdOTUVOVD5fdW5zYWZlICAKLTsvLwotOy8vIEltcGxlbWVudHMgQXZlcmFnZSBvZiA0eDQgd2l0aCBlcXVhdGlvbiBjID0gKGErYisxKT4+MS4KLTsvLyBGaXJzdCBvcGVyYW5kIHdpbGwgYmUgYXQgb2Zmc2V0IEFMSUdOTUVOVCBmcm9tIGFsaWduZWQgYWRkcmVzcwotOy8vIFNlY29uZCBvcGVyYW5kIHdpbGwgYmUgYXQgYWxpZ25lZCBsb2NhdGlvbiBhbmQgd2lsbCBiZSB1c2VkIGFzIG91dHB1dC4KLTsvLyBkZXN0aW5hdGlvbiBwb2ludGVkIGJ5IChwRHN0KSBmb3IgdmVydGljYWwgaW50ZXJwb2xhdGlvbi4KLTsvLyBUaGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGNvcHkgNCBieXRlcyBpbiBob3Jpem9udGFsIGRpcmVjdGlvbiAKLTsvLwotOy8vIFJlZ2lzdGVycyB1c2VkIGFzIGlucHV0IGZvciB0aGlzIGZ1bmN0aW9uCi07Ly8gcjAscjEscjIscjMgd2hlcmUgcjIgY29udGFpbmluZ3MgYWxpZ25lZCBtZW1vcnkgcG9pbnRlciBhbmQgcjMgc3RlcCBzaXplCi07Ly8KLTsvLyBSZWdpc3RlcnMgcHJlc2VydmVkIGZvciB0b3AgbGV2ZWwgZnVuY3Rpb24KLTsvLyByNCxyNSxyNixyOCxyOSxyMTQKLTsvLwotOy8vIFJlZ2lzdGVycyBtb2RpZmllZCBieSB0aGUgZnVuY3Rpb24KLTsvLyByNyxyMTAscjExLHIxMgotOy8vCi07Ly8gT3V0cHV0IHJlZ2lzdGVycwotOy8vIHIyIC0gcG9pbnRlciB0byB0aGUgYWxpZ25lZCBsb2NhdGlvbgotOy8vIHIzIC0gc3RlcCBzaXplIHRvIHRoaXMgYWxpZ25lZCBsb2NhdGlvbgotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi0gICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLSAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZQotICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjJfdW5zYWZlCi0gICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduM191bnNhZmUKLQotREVCVUdfT04gICAgU0VUTCB7RkFMU0V9Ci0KLTsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycwotcFByZWQwICAgICAgICAgIFJOIDAKLWlQcmVkU3RlcDAgICAgICBSTiAxCi1wUHJlZDEgICAgICAgICAgUk4gMgotaVByZWRTdGVwMSAgICAgIFJOIDMKLXBEc3RQcmVkICAgICAgICBSTiAyCi1pRHN0U3RlcCAgICAgICAgUk4gMwotCi07Ly8gRGVjbGFyZSBvdGhlciBpbnRlcm1lZGlhdGUgcmVnaXN0ZXJzCi1pUHJlZEEwICAgICAgICAgUk4gMTAKLWlQcmVkQTEgICAgICAgICBSTiAxMQotaVByZWRCMCAgICAgICAgIFJOIDEyCi1pUHJlZEIxICAgICAgICAgUk4gMTQKLVRlbXAxICAgICAgICAgICBSTiA0Ci1UZW1wMiAgICAgICAgICAgUk4gNQotUmVzdWx0QSAgICAgICAgIFJOIDUKLVJlc3VsdEIgICAgICAgICBSTiA0Ci1yMHg4MDgwODA4MCAgICAgUk4gNwotCi0gICAgSUYgQVJNMTEzNkpTCi0gICAgICAgIAotICAgICAgICA7Ly8gVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIGF2ZXJhZ2Ugb2YgNHg0IGJsb2NrIAotICAgICAgICA7Ly8gcFByZWQwIGlzIGF0IGFsaWdubWVudCBvZmZzZXQgMCBhbmQgcFByZWQxIGlzIGFsaWdubWVudCA0Ci0KLSAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZSwgcjYKLQotICAgICAgICA7Ly8gQ29kZSBzdGFydCAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIHIweDgwODA4MDgwLCA9MHg4MDgwODA4MAotCi0gICAgICAgIDsvLyAxc3QgbG9hZAotICAgICAgICBNX0xEUiAgICAgICBpUHJlZEIwLCBbcFByZWQxXQotICAgICAgICBNX0xEUiAgICAgICBpUHJlZEEwLCBbcFByZWQwXSwgaVByZWRTdGVwMCAgICAgICAgCi0gICAgICAgIE1fTERSICAgICAgIGlQcmVkQjEsIFtwUHJlZDEsIGlQcmVkU3RlcDFdCi0gICAgICAgIE1fTERSICAgICAgIGlQcmVkQTEsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwCi0KLSAgICAgICAgOy8vIChhK2IrMSkvMiA9IChhKzI1Ni0oMjU1LWIpKS8yID0gKGEtKDI1NS1iKSkvMiArIDEyOAotICAgICAgICBNVk4gICAgICAgICBpUHJlZEIwLCBpUHJlZEIwCi0gICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjEsIGlQcmVkQjEKLSAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QSwgaVByZWRBMCwgaVByZWRCMAotICAgICAgICBVSFNVQjggICAgICBSZXN1bHRCLCBpUHJlZEExLCBpUHJlZEIxCi0gICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEEsIFJlc3VsdEEsIHIweDgwODA4MDgwCi0gICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEEsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKLSAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QiwgUmVzdWx0QiwgcjB4ODA4MDgwODAKLSAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QiwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIDJuZCBsb2FkCi0gICAgICAgIE1fTERSICAgICAgIGlQcmVkQTAsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwICAgICAgICAKLSAgICAgICAgTV9MRFIgICAgICAgaVByZWRCMCwgW3BQcmVkMV0KLSAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMSwgW3BQcmVkMF0sIGlQcmVkU3RlcDAKLSAgICAgICAgTV9MRFIgICAgICAgaVByZWRCMSwgW3BQcmVkMSwgaVByZWRTdGVwMV0KLQotICAgICAgICBNVk4gICAgICAgICBpUHJlZEIwLCBpUHJlZEIwCi0gICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEEsIGlQcmVkQTAsIGlQcmVkQjAKLSAgICAgICAgTVZOICAgICAgICAgaVByZWRCMSwgaVByZWRCMQotICAgICAgICBVSFNVQjggICAgICBSZXN1bHRCLCBpUHJlZEExLCBpUHJlZEIxCi0gICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEEsIFJlc3VsdEEsIHIweDgwODA4MDgwICAgICAgICAKLSAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QSwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAotICAgICAgICBFT1IgICAgICAgICBSZXN1bHRCLCBSZXN1bHRCLCByMHg4MDgwODA4MAotICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRCLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgICAgICAgICAKLUVuZDAKLSAgICAgICAgTV9FTkQKLQotICAgICAgICA7Ly8gVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIGF2ZXJhZ2Ugb2YgNHg0IGJsb2NrIAotICAgICAgICA7Ly8gcFByZWQwIGlzIGF0IGFsaWdubWVudCBvZmZzZXQgMiBhbmQgcFByZWQxIGlzIGFsaWdubWVudCA0Ci0KLSAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24yX3Vuc2FmZSwgcjYKLQotICAgICAgICA7Ly8gQ29kZSBzdGFydCAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIHIweDgwODA4MDgwLCA9MHg4MDgwODA4MAotCi0gICAgICAgIDsvLyAxc3QgbG9hZAotICAgICAgICBMRFIgICAgICAgICBUZW1wMSwgW3BQcmVkMCwgIzRdCi0gICAgICAgIE1fTERSICAgICAgIGlQcmVkQTAsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwICAgICAgICAKLSAgICAgICAgTV9MRFIgICAgICAgaVByZWRCMCwgW3BQcmVkMV0KLSAgICAgICAgTV9MRFIgICAgICAgaVByZWRCMSwgW3BQcmVkMSwgaVByZWRTdGVwMV0KLSAgICAgICAgTV9MRFIgICAgICAgVGVtcDIsIFtwUHJlZDAsICM0XQotICAgICAgICBNX0xEUiAgICAgICBpUHJlZEExLCBbcFByZWQwXSwgaVByZWRTdGVwMAotICAgICAgICBNVk4gICAgICAgICBpUHJlZEIwLCBpUHJlZEIwCi0gICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjEsIGlQcmVkQjEgICAgICAgIAotICAgICAgICBNT1YgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBMU1IgIzE2Ci0gICAgICAgIE9SUiAgICAgICAgIGlQcmVkQTAsIGlQcmVkQTAsIFRlbXAxLCBMU0wgIzE2ICAgICAgICAKLSAgICAgICAgTU9WICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgTFNSICMxNgotICAgICAgICBPUlIgICAgICAgICBpUHJlZEExLCBpUHJlZEExLCBUZW1wMiwgTFNMICMxNgotCi0gICAgICAgIDsvLyAoYStiKzEpLzIgPSAoYSsyNTYtKDI1NS1iKSkvMiA9IChhLSgyNTUtYikpLzIgKyAxMjgKLSAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QSwgaVByZWRBMCwgaVByZWRCMAotICAgICAgICBVSFNVQjggICAgICBSZXN1bHRCLCBpUHJlZEExLCBpUHJlZEIxCi0gICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEEsIFJlc3VsdEEsIHIweDgwODA4MDgwCi0gICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEEsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKLSAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QiwgUmVzdWx0QiwgcjB4ODA4MDgwODAKLSAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QiwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIDJuZCBsb2FkCi0gICAgICAgIExEUiAgICAgICAgIFRlbXAxLCBbcFByZWQwLCAjNF0KLSAgICAgICAgTV9MRFIgICAgICAgICBpUHJlZEEwLCBbcFByZWQwXSwgaVByZWRTdGVwMCAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIGlQcmVkQjAsIFtwUHJlZDFdCi0gICAgICAgIExEUiAgICAgICAgIGlQcmVkQjEsIFtwUHJlZDEsIGlQcmVkU3RlcDFdCi0gICAgICAgIExEUiAgICAgICAgIFRlbXAyLCBbcFByZWQwLCAjNF0KLSAgICAgICAgTV9MRFIgICAgICAgICBpUHJlZEExLCBbcFByZWQwXSwgaVByZWRTdGVwMAotICAgICAgICBNVk4gICAgICAgICBpUHJlZEIwLCBpUHJlZEIwCi0gICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjEsIGlQcmVkQjEKLSAgICAgICAgTU9WICAgICAgICAgaVByZWRBMCwgaVByZWRBMCwgTFNSICMxNgotICAgICAgICBPUlIgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBUZW1wMSwgTFNMICMxNiAgICAgICAgCi0gICAgICAgIE1PViAgICAgICAgIGlQcmVkQTEsIGlQcmVkQTEsIExTUiAjMTYKLSAgICAgICAgT1JSICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgVGVtcDIsIExTTCAjMTYKLQotICAgICAgICBVSFNVQjggICAgICBSZXN1bHRBLCBpUHJlZEEwLCBpUHJlZEIwCi0gICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEIsIGlQcmVkQTEsIGlQcmVkQjEKLSAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QSwgUmVzdWx0QSwgcjB4ODA4MDgwODAgICAgICAgIAotICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRBLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCi0gICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEIsIFJlc3VsdEIsIHIweDgwODA4MDgwCi0gICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEIsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAgICAgICAgIAotRW5kMgotICAgICAgICBNX0VORAotCi0KLSAgICAgICAgOy8vIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyBhdmVyYWdlIG9mIDR4NCBibG9jayAKLSAgICAgICAgOy8vIHBQcmVkMCBpcyBhdCBhbGlnbm1lbnQgb2Zmc2V0IDMgYW5kIHBQcmVkMSBpcyBhbGlnbm1lbnQgNAotCi0gICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduM191bnNhZmUsIHI2Ci0KLSAgICAgICAgOy8vIENvZGUgc3RhcnQgICAgICAgIAotICAgICAgICBMRFIgICAgICAgICByMHg4MDgwODA4MCwgPTB4ODA4MDgwODAKLQotICAgICAgICA7Ly8gMXN0IGxvYWQKLSAgICAgICAgTERSICAgICAgICAgVGVtcDEsIFtwUHJlZDAsICM0XQotICAgICAgICBNX0xEUiAgICAgICBpUHJlZEEwLCBbcFByZWQwXSwgaVByZWRTdGVwMCAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIGlQcmVkQjAsIFtwUHJlZDFdCi0gICAgICAgIExEUiAgICAgICAgIGlQcmVkQjEsIFtwUHJlZDEsIGlQcmVkU3RlcDFdCi0gICAgICAgIExEUiAgICAgICAgIFRlbXAyLCBbcFByZWQwLCAjNF0KLSAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMSwgW3BQcmVkMF0sIGlQcmVkU3RlcDAKLQotICAgICAgICBNVk4gICAgICAgICBpUHJlZEIwLCBpUHJlZEIwCi0gICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjEsIGlQcmVkQjEKLSAgICAgICAgTU9WICAgICAgICAgaVByZWRBMCwgaVByZWRBMCwgTFNSICMyNAotICAgICAgICBPUlIgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBUZW1wMSwgTFNMICM4ICAgICAgICAgICAgICAgIAotICAgICAgICBNT1YgICAgICAgICBpUHJlZEExLCBpUHJlZEExLCBMU1IgIzI0Ci0gICAgICAgIE9SUiAgICAgICAgIGlQcmVkQTEsIGlQcmVkQTEsIFRlbXAyLCBMU0wgIzgKLSAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QSwgaVByZWRBMCwgaVByZWRCMAotICAgICAgICBVSFNVQjggICAgICBSZXN1bHRCLCBpUHJlZEExLCBpUHJlZEIxCi0gICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEEsIFJlc3VsdEEsIHIweDgwODA4MDgwCi0gICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEEsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKLSAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QiwgUmVzdWx0QiwgcjB4ODA4MDgwODAKLSAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QiwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIDJuZCBsb2FkCi0gICAgICAgIExEUiAgICAgICAgIFRlbXAxLCBbcFByZWQwLCAjNF0KLSAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMCwgW3BQcmVkMF0sIGlQcmVkU3RlcDAgICAgICAgIAotICAgICAgICBMRFIgICAgICAgICBpUHJlZEIwLCBbcFByZWQxXQotICAgICAgICBMRFIgICAgICAgICBpUHJlZEIxLCBbcFByZWQxLCBpUHJlZFN0ZXAxXQotICAgICAgICBMRFIgICAgICAgICBUZW1wMiwgW3BQcmVkMCwgIzRdCi0gICAgICAgIE1fTERSICAgICAgIGlQcmVkQTEsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwCi0KLSAgICAgICAgTVZOICAgICAgICAgaVByZWRCMCwgaVByZWRCMAotICAgICAgICBNVk4gICAgICAgICBpUHJlZEIxLCBpUHJlZEIxCi0gICAgICAgIE1PViAgICAgICAgIGlQcmVkQTAsIGlQcmVkQTAsIExTUiAjMjQKLSAgICAgICAgT1JSICAgICAgICAgaVByZWRBMCwgaVByZWRBMCwgVGVtcDEsIExTTCAjOCAgICAgICAgCi0gICAgICAgIE1PViAgICAgICAgIGlQcmVkQTEsIGlQcmVkQTEsIExTUiAjMjQKLSAgICAgICAgT1JSICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgVGVtcDIsIExTTCAjOAotCi0gICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEEsIGlQcmVkQTAsIGlQcmVkQjAKLSAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QiwgaVByZWRBMSwgaVByZWRCMQotICAgICAgICBFT1IgICAgICAgICBSZXN1bHRBLCBSZXN1bHRBLCByMHg4MDgwODA4MCAgICAgICAgCi0gICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEEsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKLSAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QiwgUmVzdWx0QiwgcjB4ODA4MDgwODAKLSAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QiwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgICAgICAgICAgCi1FbmQzCi0gICAgICAgIE1fRU5ECi0KLSAgICBFTkRJRgotICAgIAotICAgIEVORAotICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI0YmQ5ZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDM0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgMTIyOTAKLSAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotICogCi0gKiAKLSAqIAotICogCi0gKiBPcHRpbWl6ZWQgQ0FWTEMgdGFibGVzIGZvciBILjI2NAotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotCi0jaW5jbHVkZSAiYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oIgotCi0vKiA0eDQgRGVaaWdaYWcgdGFibGUgKi8KLQotY29uc3QgT01YX1U4IGFybVZDTTRQMTBfWmlnWmFnXzR4NFsxNl0gPQotewotICAgIDAsIDEsIDQsIDgsIDUsIDIsIDMsIDYsIDksIDEyLCAxMywgMTAsIDcsIDExLCAxNCwgMTUKLX07Ci0KLS8qIDJ4MiBEZVppZ1phZyB0YWJsZSAqLwotCi1jb25zdCBPTVhfVTggYXJtVkNNNFAxMF9aaWdaYWdfMngyWzRdID0KLXsKLSAgICAwLCAxLCAyLCAzCi19OwotCi0KLS8qCi0gKiBTdWZmaXggVG8gTGV2ZWwgdGFibGUKLSAqIFdlIGluY3JlbWVudCB0aGUgc3VmZml4IGxlbmd0aCBpZiAKLSAqICgoTGV2ZWxDb2RlPj4xKSsxKT4oMzw8KFN1ZmZpeExlbmd0aC0xKSkgJiYgU3VmZml4TGVuZ3RoPDYKLSAqIChMZXZlbENvZGU+PjEpPj0oMzw8KFN1ZmZpeExlbmd0aC0xKSkgICAgJiYgU3VmZml4TGVuZ3RoPDYKLSAqICBMZXZlbENvZGUgICAgPj0gMzw8U3VmZml4TGVuZ3RoICAgICAgICAgJiYgU3VmZml4TGVuZ3RoPDYKLSAqIChMZXZlbENvZGUrMikgPj0gKDM8PFN1ZmZpeExlbmd0aCkrMiAgICAgJiYgU3VmZml4TGVuZ3RoPDYKLSAqLwotY29uc3QgT01YX1M4IGFybVZDTTRQMTBfU3VmZml4VG9MZXZlbFs3XSA9Ci17Ci0gICAgKDM8PDEpKzIsICAgICAgIC8qIFN1ZmZpeExlbmd0aD0xICovCi0gICAgKDM8PDEpKzIsICAgICAgIC8qIFN1ZmZpeExlbmd0aD0xICovCi0gICAgKDM8PDIpKzIsICAgICAgIC8qIFN1ZmZpeExlbmd0aD0yICovCi0gICAgKDM8PDMpKzIsICAgICAgIC8qIFN1ZmZpeExlbmd0aD0zICovCi0gICAgKDM8PDQpKzIsICAgICAgIC8qIFN1ZmZpeExlbmd0aD00ICovCi0gICAgKDM8PDUpKzIsICAgICAgIC8qIFN1ZmZpeExlbmd0aD01ICovCi0gICAgLTEgICAgICAgICAgICAgIC8qIFN1ZmZpeExlbmd0aD02IC0gbmV2ZXIgaW5jcmVtZW50ICovCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18wWzEzMl0gPSB7Ci0gICAgMHgwMDIwLCAweDAxMDAsIDB4MjAxNSwgMHgyMDE1LCAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsCi0gICAgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsCi0gICAgMHgwMDI4LCAweDAwZjAsIDB4MDBmOCwgMHgwMDI3LCAweDAwMzAsIDB4MDBkOCwgMHgwMGUwLCAweDAwZTgsCi0gICAgMHgwMDM4LCAweDAwYTAsIDB4MDBjOCwgMHgwMGQwLCAweDAwNDAsIDB4MDA2OCwgMHgwMDkwLCAweDAwOTgsCi0gICAgMHgwMDQ4LCAweDAwNTAsIDB4MDA1OCwgMHgwMDYwLCAweDI3ZmYsIDB4MjdmZiwgMHgyMDZiLCAweDIwNmIsCi0gICAgMHgwMDgxLCAweDAwODUsIDB4MDA4MywgMHgwMDc5LCAweDAwODcsIDB4MDA3ZCwgMHgwMDdiLCAweDAwNzEsCi0gICAgMHgwMDdmLCAweDAwNzUsIDB4MDA3MywgMHgwMDY5LCAweDAwNzAsIDB4MDA3OCwgMHgwMDgwLCAweDAwODgsCi0gICAgMHgyMDc3LCAweDIwNzcsIDB4MjA2ZCwgMHgyMDZkLCAweDIwNjMsIDB4MjA2MywgMHgyMDYxLCAweDIwNjEsCi0gICAgMHgyMDZmLCAweDIwNmYsIDB4MjA2NSwgMHgyMDY1LCAweDIwNWIsIDB4MjA1YiwgMHgyMDU5LCAweDIwNTksCi0gICAgMHgwMDY3LCAweDAwNWQsIDB4MDA1MywgMHgwMDUxLCAweDAwNWYsIDB4MDA1NSwgMHgwMDRiLCAweDAwNDksCi0gICAgMHgwMGE4LCAweDAwYjAsIDB4MDBiOCwgMHgwMGMwLCAweDIwNDEsIDB4MjA0MSwgMHgyMDRkLCAweDIwNGQsCi0gICAgMHgyMDQzLCAweDIwNDMsIDB4MjAzOSwgMHgyMDM5LCAweDIwNTcsIDB4MjA1NywgMHgyMDQ1LCAweDIwNDUsCi0gICAgMHgyMDNiLCAweDIwM2IsIDB4MjAzMSwgMHgyMDMxLCAweDIwNGYsIDB4MjA0ZiwgMHgyMDNkLCAweDIwM2QsCi0gICAgMHgyMDMzLCAweDIwMzMsIDB4MjAyOSwgMHgyMDI5LCAweDAwNDcsIDB4MDAzNSwgMHgwMDJiLCAweDAwMjEsCi0gICAgMHgyMDNmLCAweDIwM2YsIDB4MjAyZCwgMHgyMDJkLCAweDIwMjMsIDB4MjAyMywgMHgyMDE5LCAweDIwMTksCi0gICAgMHgwMDM3LCAweDAwMjUsIDB4MDAxYiwgMHgwMDExLCAweDIwMmYsIDB4MjAyZiwgMHgyMDFkLCAweDIwMWQsCi0gICAgMHgwMDEzLCAweDAwMDksIDB4MjAxZiwgMHgyMDFmCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18xWzEyOF0gPSB7Ci0gICAgMHgwMDIwLCAweDAwZTgsIDB4MDBmMCwgMHgwMGY4LCAweDAwMjcsIDB4MDAxZiwgMHgyMDE1LCAweDIwMTUsCi0gICAgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsCi0gICAgMHgwMDI4LCAweDAwZDAsIDB4MDBkOCwgMHgwMGUwLCAweDAwMzAsIDB4MDA5OCwgMHgwMGMwLCAweDAwYzgsCi0gICAgMHgwMDM4LCAweDAwNjAsIDB4MDA4OCwgMHgwMDkwLCAweDAwNDAsIDB4MDA0OCwgMHgwMDUwLCAweDAwNTgsCi0gICAgMHgyN2ZmLCAweDI3ZmYsIDB4MjA3ZiwgMHgyMDdmLCAweDAwODcsIDB4MDA4NSwgMHgwMDgzLCAweDAwODEsCi0gICAgMHgwMDdiLCAweDAwNzksIDB4MDA3ZCwgMHgwMDczLCAweDIwNzUsIDB4MjA3NSwgMHgyMDcxLCAweDIwNzEsCi0gICAgMHgwMDY4LCAweDAwNzAsIDB4MDA3OCwgMHgwMDgwLCAweDIwNzcsIDB4MjA3NywgMHgyMDZkLCAweDIwNmQsCi0gICAgMHgyMDZiLCAweDIwNmIsIDB4MjA2OSwgMHgyMDY5LCAweDIwNmYsIDB4MjA2ZiwgMHgyMDY1LCAweDIwNjUsCi0gICAgMHgyMDYzLCAweDIwNjMsIDB4MjA2MSwgMHgyMDYxLCAweDAwNTksIDB4MDA1ZCwgMHgwMDViLCAweDAwNTEsCi0gICAgMHgwMDY3LCAweDAwNTUsIDB4MDA1MywgMHgwMDQ5LCAweDAwYTAsIDB4MDBhOCwgMHgwMGIwLCAweDAwYjgsCi0gICAgMHgyMDVmLCAweDIwNWYsIDB4MjA0ZCwgMHgyMDRkLCAweDIwNGIsIDB4MjA0YiwgMHgyMDQxLCAweDIwNDEsCi0gICAgMHgyMDU3LCAweDIwNTcsIDB4MjA0NSwgMHgyMDQ1LCAweDIwNDMsIDB4MjA0MywgMHgyMDM5LCAweDIwMzksCi0gICAgMHgyMDRmLCAweDIwNGYsIDB4MjAzZCwgMHgyMDNkLCAweDIwM2IsIDB4MjAzYiwgMHgyMDMxLCAweDIwMzEsCi0gICAgMHgwMDI5LCAweDAwMzUsIDB4MDAzMywgMHgwMDIxLCAweDIwNDcsIDB4MjA0NywgMHgyMDJkLCAweDIwMmQsCi0gICAgMHgyMDJiLCAweDIwMmIsIDB4MjAxOSwgMHgyMDE5LCAweDAwM2YsIDB4MDAyNSwgMHgwMDIzLCAweDAwMTEsCi0gICAgMHgwMDM3LCAweDAwMWQsIDB4MDAxYiwgMHgwMDA5LCAweDIwMmYsIDB4MjAyZiwgMHgyMDEzLCAweDIwMTMKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzJbMTEyXSA9IHsKLSAgICAweDAwMjAsIDB4MDA4OCwgMHgwMGIwLCAweDAwYjgsIDB4MDBjMCwgMHgwMGM4LCAweDAwZDAsIDB4MDBkOCwKLSAgICAweDAwM2YsIDB4MDAzNywgMHgwMDJmLCAweDAwMjcsIDB4MDAxZiwgMHgwMDE1LCAweDAwMGIsIDB4MDAwMSwKLSAgICAweDAwMjgsIDB4MDA1MCwgMHgwMDc4LCAweDAwODAsIDB4MDAzMCwgMHgwMDM4LCAweDAwNDAsIDB4MDA0OCwKLSAgICAweDA3ZmYsIDB4MDA4MSwgMHgwMDg3LCAweDAwODUsIDB4MDA4MywgMHgwMDc5LCAweDAwN2YsIDB4MDA3ZCwKLSAgICAweDAwN2IsIDB4MDA3MSwgMHgwMDc3LCAweDAwNzUsIDB4MDA3MywgMHgwMDY5LCAweDIwNmIsIDB4MjA2YiwKLSAgICAweDAwNTgsIDB4MDA2MCwgMHgwMDY4LCAweDAwNzAsIDB4MjA2MSwgMHgyMDYxLCAweDIwNmQsIDB4MjA2ZCwKLSAgICAweDIwNjMsIDB4MjA2MywgMHgyMDU5LCAweDIwNTksIDB4MjA2ZiwgMHgyMDZmLCAweDIwNjUsIDB4MjA2NSwKLSAgICAweDIwNWIsIDB4MjA1YiwgMHgyMDUxLCAweDIwNTEsIDB4MDA2NywgMHgwMDVkLCAweDAwNTMsIDB4MDA0OSwKLSAgICAweDAwNWYsIDB4MDA1NSwgMHgwMDRiLCAweDAwNDEsIDB4MDA5MCwgMHgwMDk4LCAweDAwYTAsIDB4MDBhOCwKLSAgICAweDIwMzksIDB4MjAzOSwgMHgyMDMxLCAweDIwMzEsIDB4MjA0ZCwgMHgyMDRkLCAweDIwMjksIDB4MjAyOSwKLSAgICAweDIwNTcsIDB4MjA1NywgMHgyMDQ1LCAweDIwNDUsIDB4MjA0MywgMHgyMDQzLCAweDIwMjEsIDB4MjAyMSwKLSAgICAweDAwMTksIDB4MDAzZCwgMHgwMDNiLCAweDAwMTEsIDB4MDA0ZiwgMHgwMDM1LCAweDAwMzMsIDB4MDAwOSwKLSAgICAweDIwMmIsIDB4MjAyYiwgMHgyMDJkLCAweDIwMmQsIDB4MjAyMywgMHgyMDIzLCAweDIwMjUsIDB4MjAyNSwKLSAgICAweDIwMWIsIDB4MjAxYiwgMHgyMDQ3LCAweDIwNDcsIDB4MjAxZCwgMHgyMDFkLCAweDIwMTMsIDB4MjAxMwotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfM1s4MF0gPSB7Ci0gICAgMHgwMDIwLCAweDAwMjgsIDB4MDAzMCwgMHgwMDM4LCAweDAwNDAsIDB4MDA0OCwgMHgwMDUwLCAweDAwNTgsCi0gICAgMHgwMDYwLCAweDAwNjgsIDB4MDA3MCwgMHgwMDc4LCAweDAwODAsIDB4MDA4OCwgMHgwMDkwLCAweDAwOTgsCi0gICAgMHgwMDA5LCAweDAwMGIsIDB4MDdmZiwgMHgwMDAxLCAweDAwMTEsIDB4MDAxMywgMHgwMDE1LCAweDA3ZmYsCi0gICAgMHgwMDE5LCAweDAwMWIsIDB4MDAxZCwgMHgwMDFmLCAweDAwMjEsIDB4MDAyMywgMHgwMDI1LCAweDAwMjcsCi0gICAgMHgwMDI5LCAweDAwMmIsIDB4MDAyZCwgMHgwMDJmLCAweDAwMzEsIDB4MDAzMywgMHgwMDM1LCAweDAwMzcsCi0gICAgMHgwMDM5LCAweDAwM2IsIDB4MDAzZCwgMHgwMDNmLCAweDAwNDEsIDB4MDA0MywgMHgwMDQ1LCAweDAwNDcsCi0gICAgMHgwMDQ5LCAweDAwNGIsIDB4MDA0ZCwgMHgwMDRmLCAweDAwNTEsIDB4MDA1MywgMHgwMDU1LCAweDAwNTcsCi0gICAgMHgwMDU5LCAweDAwNWIsIDB4MDA1ZCwgMHgwMDVmLCAweDAwNjEsIDB4MDA2MywgMHgwMDY1LCAweDAwNjcsCi0gICAgMHgwMDY5LCAweDAwNmIsIDB4MDA2ZCwgMHgwMDZmLCAweDAwNzEsIDB4MDA3MywgMHgwMDc1LCAweDAwNzcsCi0gICAgMHgwMDc5LCAweDAwN2IsIDB4MDA3ZCwgMHgwMDdmLCAweDAwODEsIDB4MDA4MywgMHgwMDg1LCAweDAwODcKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzRbMzJdID0gewotICAgIDB4MDAyMCwgMHgwMDM4LCAweDIwMTUsIDB4MjAxNSwgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLAotICAgIDB4NjAwYiwgMHg2MDBiLCAweDYwMGIsIDB4NjAwYiwgMHg2MDBiLCAweDYwMGIsIDB4NjAwYiwgMHg2MDBiLAotICAgIDB4MDAyOCwgMHgwMDMwLCAweDAwMjEsIDB4MDAxOSwgMHgyMDI3LCAweDIwMjcsIDB4MDAyNSwgMHgwMDIzLAotICAgIDB4MjAxZCwgMHgyMDFkLCAweDIwMWIsIDB4MjAxYiwgMHgwMDExLCAweDAwMWYsIDB4MDAxMywgMHgwMDA5Ci19OwotCi1jb25zdCBPTVhfVTE2ICogYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNbMThdID0gewotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzAsIC8qIG5DPTAgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18wLCAvKiBuQz0xICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMSwgLyogbkM9MiAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzEsIC8qIG5DPTMgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18yLCAvKiBuQz00ICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMiwgLyogbkM9NSAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzIsIC8qIG5DPTYgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18yLCAvKiBuQz03ICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9OCAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTkgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz0xMCAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTExICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9MTIgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz0xMyAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTE0ICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9MTUgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz0xNiAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzQgIC8qIG5DPS0xICovCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzBbNDBdID0gewotICAgIDB4MDAyMCwgMHgwMDQ4LCAweDAwMDksIDB4MDAwNywgMHgyMDA1LCAweDIwMDUsIDB4MjAwMywgMHgyMDAzLAotICAgIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLAotICAgIDB4MDAyOCwgMHgwMDQwLCAweDAwMTEsIDB4MDAwZiwgMHgwMDMwLCAweDAwMzgsIDB4MDAxOSwgMHgwMDE3LAotICAgIDB4MjdmZiwgMHgyN2ZmLCAweDIwMWYsIDB4MjAxZiwgMHgyMDFkLCAweDIwMWQsIDB4MjAxYiwgMHgyMDFiLAotICAgIDB4MjAxNSwgMHgyMDE1LCAweDIwMTMsIDB4MjAxMywgMHgyMDBkLCAweDIwMGQsIDB4MjAwYiwgMHgyMDBiCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzFbMjRdID0gewotICAgIDB4MDAyMCwgMHgwMDI4LCAweDAwMTEsIDB4MDAwZiwgMHgwMDBkLCAweDAwMGIsIDB4MjAwOSwgMHgyMDA5LAotICAgIDB4MjAwNywgMHgyMDA3LCAweDIwMDUsIDB4MjAwNSwgMHgyMDAzLCAweDIwMDMsIDB4MjAwMSwgMHgyMDAxLAotICAgIDB4MDAxZCwgMHgwMDFiLCAweDAwMTksIDB4MDAxNywgMHgyMDE1LCAweDIwMTUsIDB4MjAxMywgMHgyMDEzCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzJbMjRdID0gewotICAgIDB4MDAyMCwgMHgwMDI4LCAweDAwMTEsIDB4MDAwYiwgMHgwMDA5LCAweDAwMDEsIDB4MjAwZiwgMHgyMDBmLAotICAgIDB4MjAwZCwgMHgyMDBkLCAweDIwMDcsIDB4MjAwNywgMHgyMDA1LCAweDIwMDUsIDB4MjAwMywgMHgyMDAzLAotICAgIDB4MDAxYiwgMHgwMDE3LCAweDIwMTksIDB4MjAxOSwgMHgyMDE1LCAweDIwMTUsIDB4MjAxMywgMHgyMDEzCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzNbMjRdID0gewotICAgIDB4MDAyMCwgMHgwMDI4LCAweDAwMTMsIDB4MDAwZiwgMHgwMDA3LCAweDAwMDUsIDB4MjAxMSwgMHgyMDExLAotICAgIDB4MjAwZCwgMHgyMDBkLCAweDIwMGIsIDB4MjAwYiwgMHgyMDA5LCAweDIwMDksIDB4MjAwMywgMHgyMDAzLAotICAgIDB4MjAxOSwgMHgyMDE5LCAweDIwMTcsIDB4MjAxNywgMHgyMDE1LCAweDIwMTUsIDB4MjAwMSwgMHgyMDAxCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzRbMjBdID0gewotICAgIDB4MDAyMCwgMHgwMDE1LCAweDAwMTEsIDB4MDAwNSwgMHgwMDAzLCAweDAwMDEsIDB4MjAwZiwgMHgyMDBmLAotICAgIDB4MjAwZCwgMHgyMDBkLCAweDIwMGIsIDB4MjAwYiwgMHgyMDA5LCAweDIwMDksIDB4MjAwNywgMHgyMDA3LAotICAgIDB4MjAxNywgMHgyMDE3LCAweDIwMTMsIDB4MjAxMwotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc181WzIwXSA9IHsKLSAgICAweDAwMjAsIDB4MDAxMSwgMHgyMDEzLCAweDIwMTMsIDB4MjAwZiwgMHgyMDBmLCAweDIwMGQsIDB4MjAwZCwKLSAgICAweDIwMGIsIDB4MjAwYiwgMHgyMDA5LCAweDIwMDksIDB4MjAwNywgMHgyMDA3LCAweDIwMDUsIDB4MjAwNSwKLSAgICAweDAwMTUsIDB4MDAwMSwgMHgyMDAzLCAweDIwMDMKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfNlsyMF0gPSB7Ci0gICAgMHgwMDIwLCAweDAwMGYsIDB4MjAxMSwgMHgyMDExLCAweDIwMGQsIDB4MjAwZCwgMHgyMDA5LCAweDIwMDksCi0gICAgMHgyMDA3LCAweDIwMDcsIDB4MjAwNSwgMHgyMDA1LCAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsCi0gICAgMHgwMDEzLCAweDAwMDEsIDB4MjAwMywgMHgyMDAzCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzdbMjBdID0gewotICAgIDB4MDAyMCwgMHgwMDAzLCAweDIwMGYsIDB4MjAwZiwgMHgyMDBkLCAweDIwMGQsIDB4MjAwNywgMHgyMDA3LAotICAgIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHg0MDA5LAotICAgIDB4MDAxMSwgMHgwMDAxLCAweDIwMDUsIDB4MjAwNQotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc184WzIwXSA9IHsKLSAgICAweDAwMjAsIDB4MDAwNSwgMHgyMDBiLCAweDIwMGIsIDB4NDAwZCwgMHg0MDBkLCAweDQwMGQsIDB4NDAwZCwKLSAgICAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4NDAwNywgMHg0MDA3LCAweDQwMDcsIDB4NDAwNywKLSAgICAweDAwMDMsIDB4MDAwMSwgMHgyMDBmLCAweDIwMGYKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfOVsyMF0gPSB7Ci0gICAgMHgwMDIwLCAweDAwMGQsIDB4MjAwNSwgMHgyMDA1LCAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsCi0gICAgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDQwMDcsIDB4NDAwNywgMHg0MDA3LCAweDQwMDcsCi0gICAgMHgyMDAzLCAweDIwMDMsIDB4MjAwMSwgMHgyMDAxCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzEwWzE2XSA9IHsKLSAgICAweDAwMDEsIDB4MDAwMywgMHgyMDA1LCAweDIwMDUsIDB4MjAwNywgMHgyMDA3LCAweDIwMGIsIDB4MjAwYiwKLSAgICAweDYwMDksIDB4NjAwOSwgMHg2MDA5LCAweDYwMDksIDB4NjAwOSwgMHg2MDA5LCAweDYwMDksIDB4NjAwOQotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xMVsxNl0gPSB7Ci0gICAgMHgwMDAxLCAweDAwMDMsIDB4MjAwOSwgMHgyMDA5LCAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsCi0gICAgMHg2MDA3LCAweDYwMDcsIDB4NjAwNywgMHg2MDA3LCAweDYwMDcsIDB4NjAwNywgMHg2MDA3LCAweDYwMDcKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTJbMTZdID0gewotICAgIDB4MjAwMSwgMHgyMDAxLCAweDIwMDMsIDB4MjAwMywgMHg0MDA3LCAweDQwMDcsIDB4NDAwNywgMHg0MDA3LAotICAgIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1Ci19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzEzWzE2XSA9IHsKLSAgICAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywKLSAgICAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNQotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xNFsxNl0gPSB7Ci0gICAgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsCi0gICAgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMKLX07Ci0KLWNvbnN0IE9NWF9VMTYgKiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzWzE1XSA9IHsKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzAsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xLAotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMiwKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzMsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc180LAotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfNSwKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzYsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc183LAotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfOCwKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzksCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xMCwKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzExLAotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTIsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xMywKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzE0Ci19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc18wWzE2XSA9IHsKLSAgICAweDIwMDcsIDB4MjAwNywgMHgyMDA1LCAweDIwMDUsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywKLSAgICAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMQotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNfMVsxNl0gPSB7Ci0gICAgMHg0MDA1LCAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsCi0gICAgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzXzJbMTZdID0gewotICAgIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLAotICAgIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxCi19OwotCi1jb25zdCBPTVhfVTE2ICogYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNbM10gPSB7Ci0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNfMCwKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc18xLAotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzXzIKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfMFs4XSA9IHsKLSAgICAweDQwMDMsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsIDB4NDAwMQotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18xWzhdID0gewotICAgIDB4MjAwNSwgMHgyMDA1LCAweDIwMDMsIDB4MjAwMywgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzJbOF0gPSB7Ci0gICAgMHgyMDA3LCAweDIwMDcsIDB4MjAwNSwgMHgyMDA1LCAweDIwMDMsIDB4MjAwMywgMHgyMDAxLCAweDIwMDEKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfM1s4XSA9IHsKLSAgICAweDAwMDksIDB4MDAwNywgMHgyMDA1LCAweDIwMDUsIDB4MjAwMywgMHgyMDAzLCAweDIwMDEsIDB4MjAwMQotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc180WzhdID0gewotICAgIDB4MDAwYiwgMHgwMDA5LCAweDAwMDcsIDB4MDAwNSwgMHgyMDAzLCAweDIwMDMsIDB4MjAwMSwgMHgyMDAxCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzVbOF0gPSB7Ci0gICAgMHgwMDAzLCAweDAwMDUsIDB4MDAwOSwgMHgwMDA3LCAweDAwMGQsIDB4MDAwYiwgMHgyMDAxLCAweDIwMDEKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNlsyNF0gPSB7Ci0gICAgMHgwMDEwLCAweDAwMGQsIDB4MDAwYiwgMHgwMDA5LCAweDAwMDcsIDB4MDAwNSwgMHgwMDAzLCAweDAwMDEsCi0gICAgMHgwMDE4LCAweDAwMTEsIDB4MjAwZiwgMHgyMDBmLCAweDAwMjAsIDB4MDAxNSwgMHgyMDEzLCAweDIwMTMsCi0gICAgMHgwMDI4LCAweDAwMTksIDB4MjAxNywgMHgyMDE3LCAweDA3ZmYsIDB4MDAxZCwgMHgyMDFiLCAweDIwMWIKLX07Ci0KLS8qIFRhYmxlcyA3IHRvIDE0IGFyZSBkdXBsaWNhdGVzIG9mIHRhYmxlIDYgKi8KLQotY29uc3QgT01YX1UxNiAqIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNbMTVdID0gewotICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfMCwgIC8qIFplcm9zTGVmdD0xICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18xLAotICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfMiwKLSAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzMsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc180LAotICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNSwgIC8qIFplcm9zTGVmdD02ICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182LCAgLyogWmVyb3NMZWZ0PTcgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9OCAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNiwgIC8qIFplcm9zTGVmdD05ICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182LCAgLyogWmVyb3NMZWZ0PTEwICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182LCAgLyogWmVyb3NMZWZ0PTExICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182LCAgLyogWmVyb3NMZWZ0PTEyICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182LCAgLyogWmVyb3NMZWZ0PTEzICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182LCAgLyogWmVyb3NMZWZ0PTE0ICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182ICAgLyogWmVyb3NMZWZ0PTE1ICovCi19OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hX3Vuc2FmZV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzODEzZDMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MucworKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hX3Vuc2FmZV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLSAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAotCi0KLSAgICBJRiAgQ29ydGV4QTgKLSAgICAgICAgCi1wQWxwaGEgICAgICBSTiAyCi1wQmV0YSAgICAgICBSTiAzCi0KLXBUaHJlc2hvbGRzIFJOIDUKLXBCUyAgICAgICAgIFJOIDQKLWJTMzIxMCAgICAgIFJOIDYKLQotOy8vIFBpeGVscwotZFBfMCAgICAgICAgRE4gRDQuVTgKLWRQXzEgICAgICAgIEROIEQ1LlU4ICAKLWRQXzIgICAgICAgIEROIEQ2LlU4ICAKLWRQXzMgICAgICAgIEROIEQ3LlU4ICAKLWRRXzAgICAgICAgIEROIEQ4LlU4ICAKLWRRXzEgICAgICAgIEROIEQ5LlU4ICAKLWRRXzIgICAgICAgIEROIEQxMC5VOCAKLWRRXzMgICAgICAgIEROIEQxMS5VOCAKLQotCi07Ly8gRmlsdGVyaW5nIERlY2lzaW9uCi1kQWxwaGEgICAgICBETiBEMC5VOAotZEJldGEgICAgICAgRE4gRDIuVTgKLQotZEZpbHQgICAgICAgRE4gRDE2LlU4Ci1kQXFmbGcgICAgICBETiBEMTIuVTgKLWRBcGZsZyAgICAgIEROIEQxNy5VOCAKLQotZEFwMHEwICAgICAgRE4gRDEzLlU4Ci0KLTsvLyBiU0xUNAotZFRDMzIxMCAgICAgRE4gRDE4LlU4ICAgCi1kVENzICAgICAgICBETiBEMzEuUzgKLWRUQyAgICAgICAgIEROIEQzMS5VOAotCi1kTWFza18wICAgICBETiBEMTQuVTgKLWRNYXNrXzEgICAgIEROIEQxNS5VOCAgICAKLWRNYXNrXzQgICAgIEROIEQyNi5VMTYKLQotZFRlbXAgICAgICAgRE4gRDI4LlU4Ci1kRHVtbXkgICAgICBETiBEMTcuVTgKLQotOy8vIENvbXB1dGluZyBQMCxRMAotcURxMHAwICAgICAgUU4gUTEwLlMxNgotcURwMXExICAgICAgUU4gUTExLlMxNgotcURlbHRhICAgICAgUU4gUTEwLlMxNiAgOyByZXVzZSBxRHEwcDAKLWREZWx0YSAgICAgIEROIEQyMC5TOAotCi0KLTsvLyBDb21wdXRpbmcgUDEsUTEKLXFQXzBuICAgICAgIFFOIFExNC5TMTYKLXFRXzBuICAgICAgIFFOIFExMi5TMTYKLQotZFFfMG4gICAgICAgRE4gRDI0LlU4Ci1kUF8wbiAgICAgICBETiBEMjkuVTgKLQotOy8vIGJTR0U0Ci0KLWRIU3AwcTEgICAgIEROIEQxMy5VOAotZEhTcTBwMSAgICAgRE4gRDMxLlU4ICAgCi0KLWRCUzMyMTAgICAgIEROIEQyOC5VMTYKLQotZFBfMHQgICAgICAgRE4gRDEzLlU4ICAgO2RIU3AwcTEgICAgICAgIAotZFFfMHQgICAgICAgRE4gRDMxLlU4ICAgO1RlbXAxICAgICAgICAKLQotZFBfMG4gICAgICAgRE4gRDI5LlU4Ci1kUV8wbiAgICAgICBETiBEMjQuVTggICA7VGVtcDIgICAgICAgIAotCi07Ly8gUmVnaXN0ZXIgdXNhZ2UgZm9yIC0gYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQotOy8vCi07Ly8gSW5wdXRzIC0gUGl4ZWxzICAgICAgICAgICAgIC0gcDAtcDM6IEQ0LUQ3LCBxMC1xMzogRDgtRDExCi07Ly8gICAgICAgIC0gRmlsdGVyIG1hc2tzICAgICAgIC0gZmlsdDogRDE2LCBhcWZsZzogRDEyLCBhcGZsZzogRDE3Ci07Ly8gICAgICAgIC0gQWRkaXRpb25hbCBQYXJhbXMgIC0gcFRocmVzaG9sZHM6IHI1Ci07Ly8gICAgICAgICAKLTsvLyBPdXRwdXRzIC0gUGl4ZWxzICAgICAgICAgICAgLSBQMC1QMTogRDI5LUQzMCwgUTAtUTE6IEQyNC1EMjUKLTsvLyAgICAgICAgIC0gQWRkaXRpb25hbCBQYXJhbXMgLSBwVGhyZXNob2xkczogcjUKLQotOy8vIFJlZ2lzdGVycyBDb3JydXB0ZWQgICAgICAgICAtIEQxOC1EMzEKLQotCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNMVDRfdW5zYWZlCi0KLSAgICAgICAgCi0gICAgICAgIDtkVEMzMjEwIC0xOAotICAgICAgICA7ZFRlbXAtMjgKLQotICAgICAgICBWTEQxICAgICAgICBkMTguVTMyWzBdLCBbcFRocmVzaG9sZHNdISA7aGVyZQotCi0gICAgICAgIDsvLyBkZWx0YSA9ICgoKHEwLXAwKTw8MikgKyAocDEtcTEpICsgNCkgPj4gMzsKLSAgICAgICAgOy8vIGREZWx0YSA9IChxRHAxcTEgPj4gMiArIHFEcTBwMCArIDEpPj4gMQotCi0gICAgICAgIDsvLyBxRHAxcTEtMTEKLSAgICAgICAgOy8vIHFEcTBwMC0xMAotICAgICAgICBWU1VCTCAgICAgICBxRHAxcTEsIGRQXzEsIGRRXzEgICAgICAKLSAgICAgICAgVk1PViAgICAgICAgZFRlbXAsIGRUQzMyMTAKLSAgICAgICAgVlNVQkwgICAgICAgcURxMHAwLCBkUV8wLCBkUF8wICAgICAgCi0gICAgICAgIFZTSFIgICAgICAgIHFEcDFxMSwgcURwMXExLCAjMiAgICAgIAotICAgICAgICBWWklQLjggICAgICBkVEMzMjEwLCBkVGVtcAotICAgIAotICAgICAgICA7Ly8gcURlbHRhLXFEcTBwMC0xMAotCi0gICAgICAgIDsvLyBkVEMgPSBkVEMwMSArIChkQXBsZyAmIDEpICsgKGRBcWZsZyAmIDEpCi0KLSAgICAgICAgOy8vIGRUQzMyMTAtMTgKLSAgICAgICAgOy8vIGRUZW1wLTI4Ci0gICAgICAgIDsvLyBkVEMtMzEKLSAgICAgICAgVkJJRiAgICAgICAgZFRDMzIxMCwgZE1hc2tfMCwgZEZpbHQKLSAgICAgICAgVlJIQUREICAgICAgcURlbHRhLCBxRHAxcTEsIHFEcTBwMCAgCi0gICAgICAgIFZBREQgICAgICAgIGRUQywgZFRDMzIxMCwgZE1hc2tfMQotICAgICAgICBWUU1PVk4gICAgICBkRGVsdGEsIHFEZWx0YQotICAgICAgICA7Ly8gZERlbHRhLWQyMAotCi0gICAgICAgIDsvLyBkRGVsdGEgPSAoT01YX1U4KWFybUNsaXAoMCwgMjU1LCBxMCAtIGRlbHRhKTsKLSAgICAgICAgVkxEMSAgICAgICAge2RBbHBoYVtdfSwgW3BBbHBoYV0KLSAgICAgICAgVk1JTiAgICAgICAgZERlbHRhLCBkRGVsdGEsIGRUQ3MKLSAgICAgICAgVk5FRyAgICAgICAgZFRDcywgZFRDcwotICAgICAgICBWTEQxICAgICAgICB7ZEJldGFbXX0sIFtwQmV0YV0KLSAgICAgICAgOzEKLSAgICAgICAgVk1BWCAgICAgICAgZERlbHRhLCBkRGVsdGEsIGRUQ3MKLQotICAgICAgICA7Ly8gZFBfMG4gLSAyOQotICAgICAgICA7Ly8gZFFfMG4gLSAyNAotCi0gICAgICAgIDsvLyBwUTBbLTEqU3RlcF0gPSAoT01YX1U4KWFybUNsaXAoMCwgMjU1LCBkUF8wIC0gZGVsdGEpOwotICAgICAgICA7Ly8gcFEwWzAqU3RlcF0gPSAoT01YX1U4KWFybUNsaXAoMCwgMjU1LCBkUV8wIC0gZGVsdGEpOwotCi0gICAgICAgIDsvLyBkUF8wbiA9IChPTVhfVTgpYXJtQ2xpcCgwLCAyNTUsIGRQXzAgLSBkRGVsdGEpOwotICAgICAgICA7Ly8gZFFfMG4gPSAoT01YX1U4KWFybUNsaXAoMCwgMjU1LCBkUF8wIC0gZERlbHRhKTsKLSAgICAgICAgCi0gICAgICAgIDsvLyBxUF8wbiAtIDE0Ci0gICAgICAgIDsvLyBxUV8wbiAtIDEyCi0gICAgICAgIAotICAgICAgICBWTU9WTCAgICAgICBxUF8wbiwgZFBfMAotICAgICAgICBWTU9WTCAgICAgICBxUV8wbiwgZFFfMAotCi0gICAgICAgIDsxCi0gICAgICAgIFZBRERXICAgICAgIHFQXzBuLCBxUF8wbiwgZERlbHRhCi0gICAgICAgIFZTVUJXICAgICAgIHFRXzBuLCBxUV8wbiwgZERlbHRhCi0gICAgICAgIAotICAgICAgICBWUU1PVlVOICAgICBkUF8wbiwgcVBfMG4KLSAgICAgICAgVlFNT1ZVTiAgICAgZFFfMG4sIHFRXzBuCi0KLSAgICAgICAgTV9FTkQKLQotOy8vIFJlZ2lzdGVyIHVzYWdlIGZvciAtIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUoKQotOy8vCi07Ly8gSW5wdXRzIC0gUGl4ZWxzICAgICAgICAgICAgIC0gcDAtcDM6IEQ0LUQ3LCBxMC1xMzogRDgtRDExCi07Ly8gICAgICAgIC0gRmlsdGVyIG1hc2tzICAgICAgIC0gZmlsdDogRDE2LCBhcWZsZzogRDEyLCBhcGZsZzogRDE3Ci07Ly8gICAgICAgIC0gQWRkaXRpb25hbCBQYXJhbXMgIC0gYWxwaGE6IEQwLCBkTWFza18xOiBEMTUKLTsvLyAgICAgICAgIAotOy8vIE91dHB1dHMgLSBQaXhlbHMgICAgICAgICAgICAtIFAwLVAyOiBEMjktRDMxLCBRMC1RMjogRDI0LEQyNSxEMjgKLQotOy8vIFJlZ2lzdGVycyBDb3JydXB0ZWQgICAgICAgICAtIEQxOC1EMzEKLQotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTR0U0X3Vuc2FmZQotICAgIAotICAgICAgICA7ZEhTcTBwMSAtIDMxCi0gICAgICAgIDtkSFNwMHExIC0gMTMKLSAgICAgICAgVkhBREQgICAgICAgZEhTcDBxMSwgZFBfMCwgZFFfMSAgICAgCi0gICAgICAgIFZIQUREICAgICAgIGRIU3EwcDEsIGRRXzAsIGRQXzEgICAgICAgICAKLQotICAgICAgICA7Ly8gUHJlcGFyZSB0aGUgYlMgbWFzawotCi0gICAgICAgIDsvLyBkSFNwMHExLTEzCi0gICAgICAgIDsvLyBkUF8wdC1kSFNwMHExLTEzCi0gICAgICAgIDsvLyBkSFNxMHAxLTMxCi0gICAgICAgIDsvLyBkUV8wdC1UZW1wMS0zMQotICAgICAgICBWTEQxICAgICAgICB7ZEFscGhhW119LCBbcEFscGhhXQotICAgICAgICBBREQgICAgICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICM0Ci0gICAgICAgIFZMRDEgICAgICAgIHtkQmV0YVtdfSwgW3BCZXRhXQotCi0gICAgICAgIFZSSEFERCAgICAgIGRQXzB0LCBkSFNwMHExLCBkUF8xICAgIAotICAgICAgICBWUkhBREQgICAgICBkUV8wdCwgZEhTcTBwMSwgZFFfMQotICAgICAgICAKLSAgICAgICAgTV9FTkQKLSAgICAgICAgCi0gICAgICAgIEVORElGICAKLQotICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYV91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjYzAxZGQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0MTAgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFfdW5zYWZlX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDEyMjkwCi07Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4Ci0KLQotICAgIElGICBDb3J0ZXhBOAotICAgICAgICAKLXBUaHJlc2hvbGRzIFJOIDUKLQotOy8vIFBpeGVscwotZFBfMCAgICAgICAgRE4gRDQuVTgKLWRQXzEgICAgICAgIEROIEQ1LlU4ICAKLWRQXzIgICAgICAgIEROIEQ2LlU4ICAKLWRQXzMgICAgICAgIEROIEQ3LlU4ICAKLWRRXzAgICAgICAgIEROIEQ4LlU4ICAKLWRRXzEgICAgICAgIEROIEQ5LlU4ICAKLWRRXzIgICAgICAgIEROIEQxMC5VOCAKLWRRXzMgICAgICAgIEROIEQxMS5VOCAKLQotCi07Ly8gRmlsdGVyaW5nIERlY2lzaW9uCi1kQWxwaGEgICAgICBETiBEMC5VOAotCi1kRmlsdCAgICAgICBETiBEMTYuVTgKLWRBcWZsZyAgICAgIEROIEQxMi5VOAotZEFwZmxnICAgICAgRE4gRDE3LlU4IAotCi1kQXAwcTAgICAgICBETiBEMTMuVTgKLQotOy8vIGJTTFQ0Ci1kVEMwICAgICAgICBETiBEMTguVTggICAKLWRUQzEgICAgICAgIEROIEQxOS5VOCAgIAotZFRDMDEgICAgICAgRE4gRDE4LlU4ICAgCi0KLWRUQ3MgICAgICAgIEROIEQzMS5TOAotZFRDICAgICAgICAgRE4gRDMxLlU4Ci0KLWRNYXNrXzAgICAgIEROIEQxNC5VOAotZE1hc2tfMSAgICAgRE4gRDE1LlU4ICAgIAotCi1kVGVtcCAgICAgICBETiBEMTkuVTgKLQotOy8vIENvbXB1dGluZyBQMCxRMAotcURxMHAwICAgICAgUU4gUTEwLlMxNgotcURwMXExICAgICAgUU4gUTExLlMxNgotcURlbHRhICAgICAgUU4gUTEwLlMxNiAgOyByZXVzZSBxRHEwcDAKLWREZWx0YSAgICAgIEROIEQyMC5TOAotCi0KLTsvLyBDb21wdXRpbmcgUDEsUTEKLWRScDBxMCAgICAgIEROIEQyNC5VOAotCi1kTWF4UCAgICAgICBETiBEMjMuVTgKLWRNaW5QICAgICAgIEROIEQyMi5VOAotCi1kTWF4USAgICAgICBETiBEMTkuVTgKLWRNaW5RICAgICAgIEROIEQyMS5VOAotCi1kRGVsdGFQICAgICBETiBEMjYuVTgKLWREZWx0YVEgICAgIEROIEQyNy5VOAotCi1xUF8wbiAgICAgICBRTiBRMTQuUzE2Ci1xUV8wbiAgICAgICBRTiBRMTIuUzE2Ci0KLWRRXzBuICAgICAgIEROIEQyNC5VOAotZFFfMW4gICAgICAgRE4gRDI1LlU4Ci1kUF8wbiAgICAgICBETiBEMjkuVTgKLWRQXzFuICAgICAgIEROIEQzMC5VOAotCi07Ly8gYlNHRTQKLQotcVNwMHEwICAgICAgUU4gUTEwLlUxNgotCi1xU3AycTEgICAgICBRTiBRMTEuVTE2Ci1xU3AwcTBwMSAgICBRTiBRMTIuVTE2Ci1xU3AzcDIgICAgICBRTiBRMTMuVTE2Ci1kSFNwMHExICAgICBETiBEMjguVTgKLQotcVNxMnAxICAgICAgUU4gUTExLlUxNgotcVNwMHEwcTEgICAgUU4gUTEyLlUxNgotcVNxM3EyICAgICAgUU4gUTEzLlUxNiAgOyEhCi1kSFNxMHAxICAgICBETiBEMjguVTggICA7ISEKLQotcVRlbXAxICAgICAgUU4gUTExLlUxNiAgOyEhO3FTcDJxMSAKLXFUZW1wMiAgICAgIFFOIFExMi5VMTYgIDshITtxU3AwcTBwMSAgICAgICAgCi0KLWRQXzB0ICAgICAgIEROIEQyOC5VOCAgIDshITtkSFNwMHExICAgICAgICAKLWRRXzB0ICAgICAgIEROIEQyMi5VOCAgIDshITtUZW1wMSAgICAgICAgCi0KLWRQXzBuICAgICAgIEROIEQyOS5VOAotZFBfMW4gICAgICAgRE4gRDMwLlU4Ci1kUF8ybiAgICAgICBETiBEMzEuVTgKLQotZFFfMG4gICAgICAgRE4gRDI0LlU4ICAgOyEhO1RlbXAyICAgICAgICAKLWRRXzFuICAgICAgIEROIEQyNS5VOCAgIDshITtUZW1wMiAgICAgICAgCi1kUV8ybiAgICAgICBETiBEMjguVTggICA7ISE7ZFFfMHQgICAgICAgIAotCi07Ly8gUmVnaXN0ZXIgdXNhZ2UgZm9yIC0gYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQotOy8vCi07Ly8gSW5wdXRzIC0gUGl4ZWxzICAgICAgICAgICAgIC0gcDAtcDM6IEQ0LUQ3LCBxMC1xMzogRDgtRDExCi07Ly8gICAgICAgIC0gRmlsdGVyIG1hc2tzICAgICAgIC0gZmlsdDogRDE2LCBhcWZsZzogRDEyLCBhcGZsZzogRDE3Ci07Ly8gICAgICAgIC0gQWRkaXRpb25hbCBQYXJhbXMgIC0gcFRocmVzaG9sZHM6IHI1Ci07Ly8gICAgICAgICAKLTsvLyBPdXRwdXRzIC0gUGl4ZWxzICAgICAgICAgICAgLSBQMC1QMTogRDI5LUQzMCwgUTAtUTE6IEQyNC1EMjUKLTsvLyAgICAgICAgIC0gQWRkaXRpb25hbCBQYXJhbXMgLSBwVGhyZXNob2xkczogcjUKLQotOy8vIFJlZ2lzdGVycyBDb3JydXB0ZWQgICAgICAgICAtIEQxOC1EMzEKLQotCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQotCi0gICAgICAgIAotICAgICAgICA7Ly8gcURxMHAwLTEwCi0gICAgICAgIFZTVUJMICAgICAgIHFEcDFxMSwgZFBfMSwgZFFfMSAgICAgIAotICAgICAgICBWTEQxICAgICAgICB7ZFRDMFtdfSwgW3BUaHJlc2hvbGRzXSEKLSAgICAgICAgOy8vIHFEcDFxMS0xMQotICAgICAgICBWU1VCTCAgICAgICBxRHEwcDAsIGRRXzAsIGRQXzAgICAgICAKLSAgICAgICAgVkxEMSAgICAgICAge2RUQzFbXX0sIFtwVGhyZXNob2xkc10hCi0KLSAgICAgICAgOy8vIGRScDBxMC0yNAotICAgICAgICBWU0hSICAgICAgICBxRHAxcTEsIHFEcDFxMSwgIzIgICAgICAKLSAgICAKLSAgICAgICAgOy8vIGRUQzAxID0gKGRUQzEgPDwgNCkgfCBkVEMwCi0gICAgICAgIDsvLyBkVEMwMS0xOAotICAgICAgICBWRVhUICAgICAgICBkVEMwMSwgZFRDMCwgZFRDMSwgIzQKLSAgICAgICAgOy8vIGRUZW1wLTE5Ci0gICAgICAgIFZBTkQgICAgICAgIGRUZW1wLCBkQXBmbGcsIGRNYXNrXzEKLSAgICAgICAgCi0gICAgICAgIFZCSUYgICAgICAgIGRUQzAxLCBkTWFza18wLCBkRmlsdAotICAgIAotCi0gICAgICAgIDsvLyBkZWx0YSA9ICgoKHEwLXAwKTw8MikgKyAocDEtcTEpICsgNCkgPj4gMzsKLSAgICAgICAgOy8vIGREZWx0YSA9IChxRHAxcTEgPj4gMiArIHFEcTBwMCArIDEpPj4gMQotCi0gICAgICAgIDsvLyBxRGVsdGEtcURxMHAwLTEwCi0gICAgICAgIFZSSEFERCAgICAgIHFEZWx0YSwgcURwMXExLCBxRHEwcDAgIAotICAgICAgICBWUkhBREQgICAgICBkUnAwcTAsIGRQXzAsIGRRXzAgICAgICAKLSAgICAgICAgVkFERCAgICAgICAgZFRDLCBkVEMwMSwgZFRlbXAKLQotICAgICAgICA7Ly8gZFRDID0gZFRDMDEgKyAoZEFwbGcgJiAxKSArIChkQXFmbGcgJiAxKQotICAgICAgICAKLSAgICAgICAgVkFORCAgICAgICAgZFRlbXAsIGRBcWZsZywgZE1hc2tfMQotICAgICAgICBWUUFERCAgICAgICBkTWF4UCwgZFBfMSwgZFRDMDEgICAgICAKLSAgICAgICAgVlFNT1ZOICAgICAgZERlbHRhLCBxRGVsdGEKLSAgICAgICAgVkFERCAgICAgICAgZFRDLCBkVEMsIGRUZW1wCi0KLSAgICAgICAgOy8vIGRNYXhQID0gUUFERChkUF8xLCBkVEMwMSkKLSAgICAgICAgOy8vIGRNaW5QID0gUVNVQihkUF8xLCBkVEMwMSkKLSAKLSAgICAgICAgOy8vIGRNYXhQLWQyMwotICAgICAgICA7Ly8gZE1pblAtZDIyCi0gICAgICAgIFZRU1VCICAgICAgIGRNaW5QLCBkUF8xLCBkVEMwMSAgICAgIAotCi0gICAgICAgIDsvLyBkRGVsdGEtZDIwCi0KLSAgICAgICAgOy8vIGRNYXhRID0gUUFERChkUV8xLCBkVEMwMSkKLSAgICAgICAgOy8vIGRNaW5RID0gUVNVQihkUV8xLCBkVEMwMSkKLSAKLSAgICAgICAgOy8vIGRNYXhRLTE5Ci0gICAgICAgIDsvLyBkTWluUS0yMQotICAgICAgICBWUUFERCAgICAgICBkTWF4USwgZFFfMSwgZFRDMDEKLSAgICAgICAgVkhBREQgICAgICAgZERlbHRhUCwgZFJwMHEwLCBkUF8yICAgCi0gICAgICAgIFZNSU4gICAgICAgIGREZWx0YSwgZERlbHRhLCBkVENzCi0KLSAgICAgICAgOy8vIGREZWx0YSA9IChPTVhfVTgpYXJtQ2xpcCgwLCAyNTUsIHEwIC0gZGVsdGEpOwotICAgICAgICBWTkVHICAgICAgICBkVENzLCBkVENzCi0gICAgICAgIAotICAgICAgICBWUVNVQiAgICAgICBkTWluUSwgZFFfMSwgZFRDMDEKLQotICAgICAgICA7Ly8gZGVsdGEgPSAocDIgKyAoKHAwK3EwKzEpPj4xKSAtIChwMTw8MSkpPj4xOwotICAgICAgICA7Ly8gZGVsdGEgPSBhcm1DbGlwKC10QzAsIHRDMCwgZGVsdGEpOwotICAgICAgICA7Ly8gcFEwWy0yKlN0ZXBdID0gKE9NWF9VOCkocDEgKyBkZWx0YSk7Ci0KLSAgICAgICAgOy8vIGREZWx0YVAgPSAoZFBfMiArIGRScDBxMCk+PjE7Ci0gICAgICAgIDsvLyBkUF8xbiA9IGFybUNsaXAoZFBfMSAtIGRUQzAxLCBkUF8xICsgZFRDMDEsIGREZWx0YVApOwotICAgICAgICA7Ly8gZFBfMW4gPSBhcm1DbGlwKE1pblAsIE1heFAsIGREZWx0YVApOwotICAgICAgICAKLSAgICAgICAgOy8vIGRlbHRhID0gKHEyICsgKChwMCtxMCsxKT4+MSkgLSAocTE8PDEpKT4+MTsKLSAgICAgICAgOy8vIGRlbHRhID0gYXJtQ2xpcCgtdEMwLCB0QzAsIGRlbHRhKTsKLSAgICAgICAgOy8vIHBRMFsxKlN0ZXBdID0gKE9NWF9VOCkocTEgKyBkZWx0YSk7Ci0KLSAgICAgICAgOy8vIGREZWx0YVEgPSAoZFFfMiArIGRScDBxMCk+PjE7Ci0gICAgICAgIDsvLyBkUV8xbiA9IGFybUNsaXAoZFFfMSAtIGRUQzAxLCBkUV8xICsgZFRDMDEsIGREZWx0YVEpOwotICAgICAgICA7Ly8gZFFfMW4gPSBhcm1DbGlwKE1pblEsIE1heFEsIGREZWx0YVEpOwotICAgICAgICAKLSAgICAgICAgOy8vIGREZWx0YVAtMjYKLSAgICAgICAgVkhBREQgICAgICAgZERlbHRhUSwgZFJwMHEwLCBkUV8yICAgCi0KLSAgICAgICAgOy8vIGREZWx0YVEtMjcKLSAgICAgICAgCi0gICAgICAgIDsvLyBkUF8wbiAtIDI5Ci0gICAgICAgIDsvLyBkUF8xbiAtIDMwCi0gICAgICAgIDsvLyBkUV8wbiAtIDI0Ci0gICAgICAgIDsvLyBkUV8xbiAtIDI1Ci0gICAgICAgIAotICAgICAgICA7Ly8gZGVsdGEgPSAocTIgKyAoKHAwK3EwKzEpPj4xKSAtIChxMTw8MSkpPj4xOwotICAgICAgICA7Ly8gZERlbHRhUSA9IChkUV8yICsgZFJwMHEwKT4+MTsKLQotICAgICAgICBWTUFYICAgICAgICBkUF8xbiwgZERlbHRhUCwgZE1pblAgICAKLSAgICAgICAgVk1BWCAgICAgICAgZERlbHRhLCBkRGVsdGEsIGRUQ3MKLQotICAgICAgICA7Ly8gcFEwWy0xKlN0ZXBdID0gKE9NWF9VOClhcm1DbGlwKDAsIDI1NSwgZFBfMCAtIGRlbHRhKTsKLSAgICAgICAgOy8vIHBRMFswKlN0ZXBdID0gKE9NWF9VOClhcm1DbGlwKDAsIDI1NSwgZFFfMCAtIGRlbHRhKTsKLQotICAgICAgICA7Ly8gZFBfMG4gPSAoT01YX1U4KWFybUNsaXAoMCwgMjU1LCBkUF8wIC0gZERlbHRhKTsKLSAgICAgICAgOy8vIGRRXzBuID0gKE9NWF9VOClhcm1DbGlwKDAsIDI1NSwgZFBfMCAtIGREZWx0YSk7Ci0gICAgICAgIAotICAgICAgICA7Ly8gcVBfMG4gLSAxNAotICAgICAgICA7Ly8gcVFfMG4gLSAxMgotICAgICAgICAKLSAgICAgICAgVk1PVkwgICAgICAgcVBfMG4sIGRQXzAKLSAgICAgICAgVk1PVkwgICAgICAgcVFfMG4sIGRRXzAKLQotICAgICAgICBWQUREVyAgICAgICBxUF8wbiwgcVBfMG4sIGREZWx0YQotICAgICAgICBWU1VCVyAgICAgICBxUV8wbiwgcVFfMG4sIGREZWx0YQotICAgICAgICAKLSAgICAgICAgVlFNT1ZVTiAgICAgZFBfMG4sIHFQXzBuCi0gICAgICAgIFZRTU9WVU4gICAgIGRRXzBuLCBxUV8wbgotICAgICAgICAKLSAgICAgICAgVk1BWCAgICAgICAgZFFfMW4sIGREZWx0YVEsIGRNaW5RCi0KLSAgICAgICAgVk1JTiAgICAgICAgZFBfMW4sIGRQXzFuLCBkTWF4UAotICAgICAgICBWTUlOICAgICAgICBkUV8xbiwgZFFfMW4sIGRNYXhRCi0gICAgICAgIFZCSUYgICAgICAgIGRQXzBuLCBkUF8wLCBkRmlsdCAgICAgIAotCi0gICAgICAgIFZCSUYgICAgICAgIGRQXzFuLCBkUF8xLCBkQXBmbGcKLSAgICAgICAgVkJJRiAgICAgICAgZFFfMG4sIGRRXzAsIGRGaWx0ICAKLSAgICAgICAgVkJJRiAgICAgICAgZFFfMW4sIGRRXzEsIGRBcWZsZwotCi0gICAgICAgIE1fRU5ECi0KLTsvLyBSZWdpc3RlciB1c2FnZSBmb3IgLSBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlKCkKLTsvLwotOy8vIElucHV0cyAtIFBpeGVscyAgICAgICAgICAgICAtIHAwLXAzOiBENC1ENywgcTAtcTM6IEQ4LUQxMQotOy8vICAgICAgICAtIEZpbHRlciBtYXNrcyAgICAgICAtIGZpbHQ6IEQxNiwgYXFmbGc6IEQxMiwgYXBmbGc6IEQxNwotOy8vICAgICAgICAtIEFkZGl0aW9uYWwgUGFyYW1zICAtIGFscGhhOiBEMCwgZE1hc2tfMTogRDE1Ci07Ly8gICAgICAgICAKLTsvLyBPdXRwdXRzIC0gUGl4ZWxzICAgICAgICAgICAgLSBQMC1QMjogRDI5LUQzMSwgUTAtUTI6IEQyNCxEMjUsRDI4Ci0KLTsvLyBSZWdpc3RlcnMgQ29ycnVwdGVkICAgICAgICAgLSBEMTgtRDMxCi0KLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlCi0gICAgCi0KLSAgICAgICAgOy8vIGFwPGJldGEgJiYgYXJtQWJzKHAwLXEwKTwoKGFscGhhPj4yKSsyKSAgICAgICAgCi0gICAgICAgIDsvLyBhcTxiZXRhICYmIGFybUFicyhwMC1xMCk8KChhbHBoYT4+MikrMikgICAgICAgIAotCi0gICAgICAgIDsvLyAoIGRBcGZsZyAmIGRBcDBxMCA8IChkQWxwaGEgPj4gMiArIDIpICkKLSAgICAgICAgOy8vICggZEFxZmxnICYgZEFwMHEwIDwgKGRBbHBoYSA+PiAyICsgMikgKQotCi0gICAgICAgIDsvLyAoIGRBcGZsZyA9IGRBcGZsZyAmIGRBcDBxMCA8IChkVGVtcCArIGRNYXNrXzEgKyBkTWFza18xKSApCi0gICAgICAgIDsvLyAoIGRBcWZsZyA9IGRBcWZsZyAmIGRBcDBxMCA8IChkVGVtcCArIGRNYXNrXzEgKyBkTWFza18xKSApCi0KLSAgICAgICAgOy8vIFAgRmlsdGVyCi0KLSAgICAgICAgVlNIUiAgICAgICAgZFRlbXAsIGRBbHBoYSwgIzIKLSAgICAgICAgVkFERCAgICAgICAgZFRlbXAsIGRUZW1wLCBkTWFza18xCi0KLSAgICAgICAgOy8vIHFTcDBxMC0xMAotICAgICAgICBWQURETCAgICAgICBxU3AwcTAsIGRRXzAsIGRQXzAgICAgICAKLSAgICAgICAgVkFERCAgICAgICAgZFRlbXAsIGRUZW1wLCBkTWFza18xCi0KLSAgICAgICAgOy8vIHFTcDJxMS0xMQotICAgICAgICA7Ly8gcVNwMHEwcDEtMTIKLSAgICAgICAgVkFEREwgICAgICAgcVNwMnExLCBkUF8yLCBkUV8xICAgICAgCi0gICAgICAgIFZBRERXICAgICAgIHFTcDBxMHAxLCBxU3AwcTAsIGRQXzEgIAotCi0gICAgICAgIFZDR1QgICAgICAgIGRUZW1wLCBkVGVtcCwgZEFwMHEwCi0gICAgICAgIFZTSFIgICAgICAgIHFTcDJxMSwgIzEgICAgICAgICAgICAgIAotCi0gICAgICAgIDsvLyBwUTBbLTEqU3RlcF0gPSAoT01YX1U4KSgocDIgKyAyKnAxICsgMipwMCArIDIqcTAgKyBxMSArIDQpPj4zKTsKLSAgICAgICAgOy8vIHBRMFstMSpTdGVwXSA9ICggKCAocDAgKyBxMCArIHAxKSArIChwMiArIHExKT4+MSApID4+IDEgKyAxICkgPj4gMQotCi0gICAgICAgIDsvLyBkUF8wbiA9ICggKCAocVNwMHEwICsgZFBfMSkgKyBxU3AycTE+PjEgKSA+PiAxICsgMSApID4+IDEKLSAgICAgICAgOy8vIGRQXzBuID0gKCAoIHFTcDBxMHAxICsgcVNwMnExPj4xICkgPj4gMSArIDEgKSA+PiAxCi0gICAgICAgIDsvLyBkUF8wbiA9ICggcVRlbXAxICsgMSApID4+IDEKLSAgICAgICAgCi0gICAgICAgIDsvLyBwUTBbLTIqU3RlcF0gPSAoT01YX1U4KSgocDIgKyBwMSArIHAwICsgcTAgKyAyKT4+Mik7Ci0gICAgICAgIAotICAgICAgICA7Ly8gZFBfMW4gPSAoT01YX1U4KSgoZFBfMiArIHFTcDBxMHAxICsgMik+PjIpOwotICAgICAgICA7Ly8gZFBfMW4gPSAoT01YX1U4KSgocVRlbXAyICsgMik+PjIpOwotICAgICAgICAKLSAgICAgICAgOy8vIHBRMFstMypTdGVwXSA9IChPTVhfVTgpKCgyKnAzICsgMypwMiArIHAxICsgcDAgKyBxMCArIDQpPj4zKTsKLSAgICAgICAgOy8vIHBRMFstMypTdGVwXSA9IChPTVhfVTgpKCggKHAzICsgcDIpICsgKHAxICsgcDAgKyBxMCArIHAyKSA+PiAxICsgMik+PjIpOwotCi0gICAgICAgIDsvLyBkUF8ybiA9IChPTVhfVTgpKCggcVNwM3AyICsgKGRQXzIgKyBxU3AwcTBwMSkgPj4gMSArIDIpID4+IDIpOwotICAgICAgICA7Ly8gZFBfMm4gPSAoT01YX1U4KSgoIHFTcDNwMiArIHFUZW1wMiA+PiAxICsgMikgPj4gMik7Ci0KLSAgICAgICAgOy8vIHFUZW1wMS1xU3AycTEtMTEKLSAgICAgICAgOy8vIHFUZW1wMi1xU3AwcTBwMS0xMgotICAgICAgICBWSEFERCAgICAgICBxVGVtcDEsIHFTcDBxMHAxLCBxU3AycTEKLSAgICAgICAgVkFERFcgICAgICAgcVRlbXAyLCBxU3AwcTBwMSwgZFBfMiAgCi0gICAgICAgIAotICAgICAgICA7Ly8gcVNwM3AyLTEzCi0gICAgICAgIFZBRERMICAgICAgIHFTcDNwMiwgZFBfMywgZFBfMiAgICAgIAotCi0gICAgICAgIFZBTkQgICAgICAgIGRBcGZsZywgZEFwZmxnLCBkVGVtcAotICAgICAgICBWSEFERCAgICAgICBkSFNwMHExLCBkUF8wLCBkUV8xICAgICAKLSAgICAgICAgVlNSQSAgICAgICAgcVNwM3AyLCBxVGVtcDIsICMxICAgICAgCi0gICAgICAgIDsvLyBkSFNwMHExLTI4Ci0gICAgICAgIFZBTkQgICAgICAgIGRBcWZsZywgZEFxZmxnLCBkVGVtcAotCi0gICAgICAgIDsvLyBkUF8wbi0yOQotICAgICAgICA7Ly8gZFBfMHQtZEhTcDBxMS0yOAotICAgICAgICBWUVJTSFJOICAgICBkUF8wbiwgcVRlbXAxLCAjMQotICAgICAgICBWUkhBREQgICAgICBkUF8wdCwgZEhTcDBxMSwgZFBfMSAgICAKLQotICAgICAgICA7Ly8gZFBfMW4tMzAKLSAgICAgICAgVlFSU0hSTiAgICAgZFBfMW4sIHFUZW1wMiwgIzIKLSAgICAgICAgCi0gICAgICAgIFZBRERMICAgICAgIHFTcTJwMSwgZFFfMiwgZFBfMSAgICAgICAgICAKLSAgICAgICAgVkFERFcgICAgICAgcVNwMHEwcTEsIHFTcDBxMCwgZFFfMSAgICAgIAotICAgICAgICAKLSAgICAgICAgVkJJRiAgICAgICAgZFBfMG4sIGRQXzB0LCBkQXBmbGcgICAgCi0KLSAgICAgICAgOy8vIFEgRmlsdGVyCi0KLSAgICAgICAgOy8vIHBRMFswKlN0ZXBdID0gKE9NWF9VOCkoKHEyICsgMipxMSArIDIqcTAgKyAyKnAwICsgcDEgKyA0KT4+Myk7Ci0gICAgICAgIDsvLyBwUTBbMCpTdGVwXSA9ICggKCAocDAgKyBxMCArIHExKSArIChxMiArIHAxKT4+MSApID4+IDEgKyAxICkgPj4gMQotCi0gICAgICAgIDsvLyBkUV8wbiA9ICggKCAocVNwMHEwICsgZFFfMSkgKyBxU3EycDE+PjEgKSA+PiAxICsgMSApID4+IDEKLSAgICAgICAgOy8vIGRRXzBuID0gKCAoIHFTcDBxMHExICsgcVNxMnAxPj4xICkgPj4gMSArIDEgKSA+PiAxCi0gICAgICAgIDsvLyBkUV8wbiA9ICggcVRlbXAxICsgMSApID4+IDEKLSAgICAgICAgCi0gICAgICAgIDsvLyBwUTBbMSpTdGVwXSA9IChPTVhfVTgpKChxMiArIHExICsgcTAgKyBxMCArIDIpPj4yKTsKLSAgICAgICAgCi0gICAgICAgIDsvLyBkUV8xbiA9IChPTVhfVTgpKChkUV8yICsgcVNwMHEwcTEgKyAyKT4+Mik7Ci0gICAgICAgIDsvLyBkUV8xbiA9IChPTVhfVTgpKChxVGVtcDIgKyAyKT4+Mik7Ci0gICAgICAgIAotICAgICAgICA7Ly8gcFEwWzIqU3RlcF0gPSAoT01YX1U4KSgoMipxMyArIDMqcTIgKyBxMSArIHEwICsgcDAgKyA0KT4+Myk7Ci0gICAgICAgIDsvLyBwUTBbMipTdGVwXSA9IChPTVhfVTgpKCggKHEzICsgcTIpICsgKHExICsgcDAgKyBxMCArIHEyKSA+PiAxICsgMik+PjIpOwotCi0gICAgICAgIDsvLyBkUV8ybiA9IChPTVhfVTgpKCggcVNxM3EyICsgKGRRXzIgKyBxU3AwcTBxMSkgPj4gMSArIDIpID4+IDIpOwotICAgICAgICA7Ly8gZFFfMm4gPSAoT01YX1U4KSgoIHFTcTNxMiArIHFUZW1wMiA+PiAxICsgMikgPj4gMik7Ci0KLSAgICAgICAgOy8vIHFUZW1wMS1xU3AycTEtMTEKLSAgICAgICAgOy8vIHFUZW1wMi1xU3AwcTBwMS0xMgotICAgICAgICA7Ly8gcVNxMnAxLTExCi0gICAgICAgIDsvLyBxU3AwcTBxMS0xMgotCi0KLSAgICAgICAgOy8vIHFUZW1wMi1xU3AwcTBwMS0xMgotICAgICAgICA7Ly8gcVRlbXAxLXFTcTJwMS0xMQotICAgICAgICA7Ly8gcVNxM3EyLTEzCi0gICAgICAgIDsvLyBkUF8ybi0zMQotICAgICAgICAKLSAgICAgICAgVlFSU0hSTiAgICAgZFBfMm4sIHFTcDNwMiwgIzIKLSAgICAgICAgVkFEREwgICAgICAgcVNxM3EyLCBkUV8zLCBkUV8yICAgICAgICAgIAotCi0gICAgICAgIFZTSFIgICAgICAgIHFTcTJwMSwgIzEgICAgICAgICAgICAgICAgICAKLQotICAgICAgICBWSEFERCAgICAgICBxVGVtcDEsIHFTcDBxMHExLCBxU3EycDEKLSAgICAgICAgVkFERFcgICAgICAgcVRlbXAyLCBxU3AwcTBxMSwgZFFfMiAgICAgIAotCi0gICAgICAgIDsvLyBkSFNxMHAxLTI4Ci0gICAgICAgIFZIQUREICAgICAgIGRIU3EwcDEsIGRRXzAsIGRQXzEgICAgICAgICAKLQotICAgICAgICBWQklGICAgICAgICBkUF8wbiwgZFBfMCwgZEZpbHQKLSAgICAgICAgVkJJRiAgICAgICAgZFBfMW4sIGRQXzEsIGRBcGZsZwotCi0gICAgICAgIFZTUkEgICAgICAgIHFTcTNxMiwgcVRlbXAyLCAjMSAgICAgICAgICAKLQotICAgICAgICA7Ly8gZFFfMS1UZW1wMi0yNQotICAgICAgICA7Ly8gZFFfMC1UZW1wMi0yNAotICAgICAgICBWUVJTSFJOICAgICBkUV8xbiwgcVRlbXAyLCAjMgotICAgICAgICBWUVJTSFJOICAgICBkUV8wbiwgcVRlbXAxLCAjMQotCi0gICAgICAgIDsvLyBkUV8wdC1UZW1wMS0yMgotICAgICAgICBWUkhBREQgICAgICBkUV8wdCwgZEhTcTBwMSwgZFFfMQotICAgICAgICBWQklGICAgICAgICBkUV8xbiwgZFFfMSwgZEFxZmxnICAgICAgICAgCi0KLSAgICAgICAgVkJJRiAgICAgICAgZFBfMm4sIGRQXzIsIGRBcGZsZyAgICAgICAgCi0gICAgICAgIFZCSUYgICAgICAgIGRRXzBuLCBkUV8wdCwgZEFxZmxnICAgICAgICAKLSAgICAgICAgVlFSU0hSTiAgICAgZFFfMm4sIHFTcTNxMiwgIzIKLSAgICAgICAgVkJJRiAgICAgICAgZFFfMG4sIGRRXzAsIGRGaWx0Ci0gICAgICAgIFZCSUYgICAgICAgIGRRXzJuLCBkUV8yLCBkQXFmbGcgICAgICAgCi0KLSAgICAgICAgTV9FTkQKLSAgICAgICAgCi0gICAgRU5ESUYgIAotCi0KLSAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTNhMGQ1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMzM5ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fQml0RGVjX3MuaAotICAgICAgICAKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlcwotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlcwotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9TdWZmaXhUb0xldmVsCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1ppZ1phZ180eDQKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfWmlnWmFnXzJ4MgotICAgICAgICAKLSAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLSAgICAgICAgCi07Ly9ERUJVR19PTiAgICBTRVRMIHtUUlVFfQotICAgICAgICAKLUxBU1RfQ09FRkYgICAgICAgICAgICAgICBFUVUgMHgyMCAgICAgICAgOy8vIEVuZCBvZiBibG9jayBmbGFnCi1UV09fQllURV9DT0VGRiAgICAgICAgICAgRVFVIDB4MTAKLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi0KLXBwQml0U3RyZWFtICAgICBSTiAwCi1wT2Zmc2V0ICAgICAgICAgUk4gMQotcE51bUNvZWZmICAgICAgIFJOIDIKLXBwUG9zQ29lZmJ1ZiAgICBSTiAzCi1uQyAgICAgICAgICAgICAgUk4gNCA7Ly8gbnVtYmVyIG9mIGNvZWZmcyBvciAxNyBmb3IgY2hyb21hCi1zTWF4TnVtQ29lZmYgICAgUk4gNQotCi07Ly8gRGVjbGFyZSBpbm5lciBsb29wIHJlZ2lzdGVycwotCi07Ly8gTGV2ZWwgbG9vcAotQ291bnQgICAgICAgICAgIFJOIDAKLVRyYWlsaW5nT25lcyAgICBSTiAxCi1wTGV2ZWwgICAgICAgICAgUk4gMgotTGV2ZWxTdWZmaXggICAgIFJOIDMKLVN1ZmZpeExlbmd0aCAgICBSTiA0Ci1Ub3RhbENvZWZmICAgICAgUk4gNQotCi1wVkxEVGFibGUgICAgICAgUk4gNgotU3ltYm9sICAgICAgICAgIFJOIDcKLVQxICAgICAgICAgICAgICBSTiA4Ci1UMiAgICAgICAgICAgICAgUk4gOQotUkJpdFN0cmVhbSAgICAgIFJOIDEwCi1SQml0QnVmZmVyICAgICAgUk4gMTEKLVJCaXRDb3VudCAgICAgICBSTiAxMgotbHIgICAgICAgICAgICAgIFJOIDE0Ci0KLTsvLyBSdW4gbG9vcAotQ291bnQgICAgICAgICAgIFJOIDAKLVplcm9zTGVmdCAgICAgICBSTiAxCi1wTGV2ZWwgICAgICAgICAgUk4gMgotcHBSdW5UYWJsZSAgICAgIFJOIDMKLXBSdW4gICAgICAgICAgICBSTiA0Ci1Ub3RhbENvZWZmICAgICAgUk4gNQotCi1wVkxEVGFibGUgICAgICAgUk4gNgotU3ltYm9sICAgICAgICAgIFJOIDcKLVQxICAgICAgICAgICAgICBSTiA4Ci1UMiAgICAgICAgICAgICAgUk4gOQotUkJpdFN0cmVhbSAgICAgIFJOIDEwCi1SQml0QnVmZmVyICAgICAgUk4gMTEKLVJCaXRDb3VudCAgICAgICBSTiAxMgotbHIgICAgICAgICAgICAgIFJOIDE0Ci0KLTsvLyBGaWxsIGluIGNvZWZmaWNpZW50cyBsb29wCi1wUG9zQ29lZmJ1ZiAgICAgUk4gMAotdGVtcCAgICAgICAgICAgIFJOIDEKLXBMZXZlbCAgICAgICAgICBSTiAyCi1wcFBvc0NvZWZidWYgICAgUk4gMwotcFJ1biAgICAgICAgICAgIFJOIDQKLVRvdGFsQ29lZmYgICAgICBSTiA1Ci1wWmlnWmFnICAgICAgICAgUk4gNgotCi1UMSAgICAgICAgICAgICAgUk4gOAotVDIgICAgICAgICAgICAgIFJOIDkKLVJCaXRTdHJlYW0gICAgICBSTiAxMAotUkJpdEJ1ZmZlciAgICAgIFJOIDExCi1SQml0Q291bnQgICAgICAgUk4gMTIKLUNvZWZmTnVtICAgICAgICBSTiAxNAotCi0KLQotICAgIElGIEFSTTExMzZKUwotICAgICAgICAKLSAgICAgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSByZXF1aXJlZCBieSB0aGUgZnVuY3Rpb24KLSAgICAgICAgTV9BTExPQzQgcHBwQml0U3RyZWFtLCA0Ci0gICAgICAgIE1fQUxMT0M0IHBwT2Zmc2V0LCA0Ci0gICAgICAgIE1fQUxMT0M0IHBwcFBvc0NvZWZidWYsIDQKLSAgICAgICAgTV9BTExPQzQgcHBMZXZlbCwgMTYqMgotICAgICAgICBNX0FMTE9DNCBwcFJ1biwgMTYKLSAgICAgICAgCi0gICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpciwgcjExCi0gICAgICAgIAotICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cwotICAgICAgICBNX0FSRyAgIHBOQywgNAotICAgICAgICBNX0FSRyAgIHBTTWF4TnVtQ29lZmYsNAotICAgICAgICAKLSAgICAgICAgOy8vIENvZGUgc3RhcnQgICAgICAgIAotICAgICAgICBNX0JEX0lOSVQwIHBwQml0U3RyZWFtLCBwT2Zmc2V0LCBSQml0U3RyZWFtLCBSQml0QnVmZmVyLCBSQml0Q291bnQKLSAgICAgICAgTERSICAgICAgICBwVkxEVGFibGUsID1hcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlcwotICAgICAgICBNX0xEUiAgICAgIG5DLCBwTkMKLSAgICAgICAgCi0gICAgICAgIE1fQkRfSU5JVDEgVDEsIFQyLCBscgotICAgICAgICBMRFIgICAgIHBWTERUYWJsZSwgW3BWTERUYWJsZSwgbkMsIExTTCAjMl0gIDsvLyBGaW5kIFZMRCB0YWJsZSAgICAKLSAgICAgICAgCi0gICAgICAgIE1fQkRfSU5JVDIgVDEsIFQyLCBscgotCi0gICAgICAgIDsvLyBEZWNvZGUgU3ltYm9sID0gVG90YWxDb2VmZio0ICsgVHJhaWxpbmdPbmVzCi0gICAgICAgIE1fQkRfVkxEICBTeW1ib2wsIFQxLCBUMiwgcFZMRFRhYmxlLCA0LCAyCi0gICAgCi0gICAgICAgIE1PVlMgICAgVG90YWxDb2VmZiwgU3ltYm9sLCBMU1IgIzIgICAgCi0gICAgICAgIFNUUkIgICAgVG90YWxDb2VmZiwgW3BOdW1Db2VmZl0gICAgCi0gICAgICAgIE1fUFJJTlRGICJUb3RhbENvZWZmPSVkXG4iLCBUb3RhbENvZWZmCi0gICAgICAgIEJFUS5XICAgRW5kTm9FcnJvciAgICAgICAgICAgICAgICAgIDsvLyBGaW5pc2hlZCBpZiBubyBjb2VmZmljaWVudHMKLQotICAgICAgICBDTVAgICAgIFN5bWJvbCwgIzE3KjQKLSAgICAgICAgQkdFLlcgICBFbmRCYWRTeW1ib2wgICAgICAgICAgICAgICAgOy8vIEVycm9yIGlmIGJhZCBzeW1ib2wKLSAgICAgICAgCi0gICAgICAgIDsvLyBTYXZlIGJpdHN0cmVhbSBwb2ludGVycwotICAgICAgICBNX1NUUiAgIHBwQml0U3RyZWFtLCAgcHBwQml0U3RyZWFtCi0gICAgICAgIE1fU1RSICAgcE9mZnNldCwgICAgICBwcE9mZnNldAotICAgICAgICBNX1NUUiAgIHBwUG9zQ29lZmJ1ZiwgcHBwUG9zQ29lZmJ1ZiAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBEZWNvZGUgVHJhaWxpbmcgT25lcwotICAgICAgICBBTkRTICAgIFRyYWlsaW5nT25lcywgU3ltYm9sLCAjMwotICAgICAgICBNX0FEUiAgIHBMZXZlbCwgcHBMZXZlbCAgICAgICAgICAgIAotICAgICAgICBNX1BSSU5URiAiVHJhaWxpbmdPbmVzPSVkXG4iLCBUcmFpbGluZ09uZXMKLSAgICAgICAgQkVRICAgICBUcmFpbGluZ09uZXNEb25lICAgIAotICAgICAgICBNT1YgICAgIENvdW50LCBUcmFpbGluZ09uZXMKLVRyYWlsaW5nT25lc0xvb3AgICAgCi0gICAgICAgIE1fQkRfUkVBRDggU3ltYm9sLCAxLCBUMQotICAgICAgICBTVUJTICAgIENvdW50LCBDb3VudCwgIzEKLSAgICAgICAgTU9WICAgICBUMSwgIzEKLSAgICAgICAgU1VCICAgICBUMSwgVDEsIFN5bWJvbCwgTFNMICMxCi0gICAgICAgIE1fUFJJTlRGICJMZXZlbD0lZFxuIiwgVDEKLSAgICAgICAgU1RSSCAgICBUMSwgW3BMZXZlbF0sICMyCi0gICAgICAgIEJHVCAgICAgVHJhaWxpbmdPbmVzTG9vcAotVHJhaWxpbmdPbmVzRG9uZSAgICAKLSAgICAKLSAgICAgICAgOy8vIERlY29kZSBsZXZlbCB2YWx1ZXMgICAgCi0gICAgICAgIFNVQlMgICAgQ291bnQsIFRvdGFsQ29lZmYsIFRyYWlsaW5nT25lcyAgICAgOy8vIE51bWJlciBvZiBsZXZlbHMgdG8gcmVhZAotICAgICAgICBCRVEgICAgIERlY29kZVJ1bnMgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBOb25lIGxlZnQKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgU3VmZml4TGVuZ3RoLCAjMQotICAgICAgICBDTVAgICAgIFRvdGFsQ29lZmYsICMxMAotICAgICAgICBNT1ZMRSAgIFN1ZmZpeExlbmd0aCwgIzAKLSAgICAgICAgQ01QICAgICBUcmFpbGluZ09uZXMsICMzICAgIDsvLyBpZiAoVHJhaWxpbmdPbmVzPDMpCi0gICAgICAgIE1PVkxUICAgVHJhaWxpbmdPbmVzLCAjNCAgICA7Ly8gdGhlbiBUcmFpbGluZ09uZXMgPSArNAotICAgICAgICBNT1ZHRSAgIFRyYWlsaW5nT25lcywgIzIgICAgOy8vIGVsc2UgVHJhaWxpbmdPbmVzID0gKzIKLSAgICAgICAgTU9WR0UgICBTdWZmaXhMZW5ndGgsICMwICAgIDsvLyAgICAgIFN1ZmZpeExlbmd0aCA9IDAKLSAgICAgICAgCi1MZXZlbExvb3AKLSAgICAgICAgTV9CRF9DTFoxNiBTeW1ib2wsIFQxLCBUMiAgIDsvLyBTeW1ib2w9TGV2ZWxQcmVmaXgKLSAgICAgICAgQ01QICAgICBTeW1ib2wsIzE2Ci0gICAgICAgIEJHRSAgICAgRW5kQmFkU3ltYm9sCi0gICAgICAgIAotICAgICAgICBNT1ZTICAgIGxyLCBTdWZmaXhMZW5ndGggICAgOy8vIGlmIExldmVsU3VmZml4U2l6ZT09MAotICAgICAgICBURVFFUSAgIFN5bWJvbCwgIzE0ICAgICAgICAgOy8vICAgYW5kICBMZXZlbFByZWZpeD09MTQKLSAgICAgICAgTU9WRVEgICBsciwgIzQgICAgICAgICAgICAgIDsvLyAgIHRoZW4gTGV2ZWxTdWZmaXhTaXplPTQKLSAgICAgICAgVEVRICAgICBTeW1ib2wsICMxNSAgICAgICAgIDsvLyBpZiBMZXZlbFN1ZmZpeFNpemU9PTE1Ci0gICAgICAgIE1PVkVRICAgbHIsICMxMiAgICAgICAgICAgICA7Ly8gICB0aGVuIExldmVsU3VmZml4U2l6ZT0xMgotICAgICAgICAKLSAgICAgICAgVEVRRVEgICBTdWZmaXhMZW5ndGgsIzAKLSAgICAgICAgQURERVEgICBTeW1ib2wsU3ltYm9sLCMxNQotICAgICAgICAKLSAgICAgICAgVEVRICAgICBsciwgIzAgICAgICAgICAgICAgIDsvLyBpZiBMZXZlbFN1ZmZpeFNpemU9PTAKLSAgICAgICAgQkVRICAgICBMZXZlbENvZGVSZWFkICAgICAgIDsvLyBMZXZlbENvZGUgPSBMZXZlbFByZWZpeAotICAgICAgICAKLSAgICAgICAgTV9CRF9WUkVBRDE2IExldmVsU3VmZml4LCBsciwgVDEsIFQyICA7Ly8gUmVhZCBMZXZlbCBTdWZmaXgKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgU3ltYm9sLCBTeW1ib2wsIExTTCBTdWZmaXhMZW5ndGgKLSAgICAgICAgQUREICAgICBTeW1ib2wsIExldmVsU3VmZml4LCBTeW1ib2wKLSAgICAgICAgICAgICAKLUxldmVsQ29kZVJlYWQgICAgICAgIAotICAgICAgICA7Ly8gU3ltYm9sID0gTGV2ZWxDb2RlCi0gICAgICAgIEFERCAgICAgU3ltYm9sLCBTeW1ib2wsIFRyYWlsaW5nT25lcyA7Ly8gKzQgaWYgbGV2ZWwgY2Fubm90IGJlICsvLTEsICsyIG8vdwotICAgICAgICBNT1YgICAgIFRyYWlsaW5nT25lcywgIzIKLSAgICAgICAgTU9WUyAgICBUMSwgU3ltYm9sLCBMU1IgIzEKLSAgICAgICAgUlNCQ1MgICBUMSwgVDEsICMwICAgICAgICAgICAgICAgICAgOy8vIElmIFN5bWJvbCBvZGQgdGhlbiBuZWdhdGUKLSAgICAgICAgTV9QUklOVEYgIkxldmVsPSVkXG4iLCBUMQotICAgICAgICBTVFJIICAgIFQxLCBbcExldmVsXSwgIzIgICAgICAgICAgICA7Ly8gU3RvcmUgbGV2ZWwuCi0gICAgICAgIAotICAgICAgICBMRFIgICAgIFQyLCA9YXJtVkNNNFAxMF9TdWZmaXhUb0xldmVsCi0gICAgICAgIExEUlNCICAgVDEsIFtUMiwgU3VmZml4TGVuZ3RoXSAgICAgIDsvLyBGaW5kIGluY3JlbWVudCBsZXZlbCAgICAgICAgCi0gICAgICAgIFRFUSAgICAgU3VmZml4TGVuZ3RoLCAjMAotICAgICAgICBNT1ZFUSAgIFN1ZmZpeExlbmd0aCwgIzEKLSAgICAgICAgQ01QICAgICBTeW1ib2wsIFQxCi0gICAgICAgIEFERENTICAgU3VmZml4TGVuZ3RoLCBTdWZmaXhMZW5ndGgsICMxICAgICAgICAKLSAgICAgICAgU1VCUyAgICBDb3VudCwgQ291bnQsICMxICAgICAgICAKLSAgICAgICAgQkdUICAgICBMZXZlbExvb3AKLSAgICAgICAgCi1EZWNvZGVSdW5zICAgICAgICAKLSAgICAgICAgOy8vIEZpbmQgbnVtYmVyIG9mIHplcm9zCi0gICAgICAgIE1fTERSICAgVDEsIHBTTWF4TnVtQ29lZmYgICAgICAgICAgIDsvLyBzTWF4TnVtQ29lZmYKLSAgICAgICAgU1VCICAgICBDb3VudCwgVG90YWxDb2VmZiwgIzEgICAgICAgOy8vIE51bWJlciBvZiBydW5zIGV4Y2x1ZGluZyBsYXN0Ci0gICAgICAgIFNVQlMgICAgWmVyb3NMZWZ0LCBUMSwgVG90YWxDb2VmZiAgIDsvLyBNYXhpbXVtIG51bWJlciBvZiB6ZXJvcyB0aGVyZSBjb3VsZCBiZQotICAgICAgICBNX0FEUiAgIHBSdW4sIHBwUnVuCi0gICAgICAgIE1PViAgICAgQ29lZmZOdW0sVG90YWxDb2VmZgotICAgICAgICBTVUIgICAgIENvZWZmTnVtLENvZWZmTnVtLCMxCi0gICAgICAgIEJFUSAgICAgTm9aZXJvc0xlZnQKLSAgICAgICAgCi0gICAgICAgIDsvLyBVbnBhY2sgbnVtYmVyIG9mIHplcm9zIGZyb20gYml0c3RyZWFtCi0gICAgICAgIFRFUSAgICAgVDEsICM0ICAgICAgICAKLSAgICAgICAgTERSRVEgICBwVkxEVGFibGUsID0oYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXMtNCkKLSAgICAgICAgTERSTkUgICBwVkxEVGFibGUsID0oYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlcy00KQotICAgICAgICBMRFIgICAgIHBWTERUYWJsZSwgW3BWTERUYWJsZSwgVG90YWxDb2VmZiwgTFNMICMyXQotICAgICAgICAKLSAgICAgICAgTV9CRF9WTEQgIFN5bWJvbCwgVDEsIFQyLCBwVkxEVGFibGUsIDQsIDIgOy8vIFN5bWJvbCA9IFplcm9zTGVmdAotICAgICAgICBDTVAgICAgIFN5bWJvbCwjMTYKLSAgICAgICAgQkdFICAgICBFbmRCYWRTeW1ib2wKLQotICAgICAgICBMRFIgICAgIHBwUnVuVGFibGUsID0oYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlcy00KQotICAgICAgICBNX0FEUiAgIHBSdW4sIHBwUnVuCi0gICAgICAgIE1PVlMgICAgWmVyb3NMZWZ0LCBTeW1ib2wKLQotICAgICAgICBBREQgICAgIENvZWZmTnVtLENvZWZmTnVtLFplcm9zTGVmdCAgICAgICAgCi0KLSAgICAgICAgQkVRICAgICBOb1plcm9zTGVmdAotICAgICAgICAKLSAgICAgICAgOy8vIERlY29kZSBydW5zIHdoaWxlIHplcm9zIGFyZSBsZWZ0IGFuZCBtb3JlIHRoYW4gb25lIGNvZWZmaWNpZW50Ci1SdW5Mb29wIAotICAgICAgICBTVUJTICAgIENvdW50LCBDb3VudCwgIzEKLSAgICAgICAgTERSICAgICBwVkxEVGFibGUsIFtwcFJ1blRhYmxlLCBaZXJvc0xlZnQsIExTTCMyXQotICAgICAgICBCTFQgICAgIExhc3RSdW4KLSAgICAgICAgTV9CRF9WTEQgIFN5bWJvbCwgVDEsIFQyLCBwVkxEVGFibGUsIDMsIDIgOy8vIFN5bWJvbCA9IFJ1bgotICAgICAgICBDTVAgICAgIFN5bWJvbCwjMTUgICAgICAgICAKLSAgICAgICAgQkdFICAgICBFbmRCYWRTeW1ib2wgICAgICAgIAotCi0gICAgICAgIFNVQlMgICAgWmVyb3NMZWZ0LCBaZXJvc0xlZnQsIFN5bWJvbAotICAgICAgICBNX1BSSU5URiAiUnVuPSVkXG4iLCBTeW1ib2wKLSAgICAgICAgU1RSQiAgICBTeW1ib2wsIFtwUnVuXSwgIzEKLSAgICAgICAgQkdUICAgICBSdW5Mb29wCi0gICAgICAgIAotICAgICAgICA7Ly8gRGVjb2RlIHJ1bnMgd2hpbGUgbm8gemVyb3MgYXJlIGxlZnQKLU5vWmVyb3NMZWZ0IAotICAgICAgICBTVUJTICAgIENvdW50LCBDb3VudCwgIzEKLSAgICAgICAgTV9QUklOVEYgIlJ1bj0lZFxuIiwgWmVyb3NMZWZ0Ci0gICAgICAgIFNUUkdFQiAgWmVyb3NMZWZ0LCBbcFJ1bl0sICMxCi0gICAgICAgIEJHVCAgICAgTm9aZXJvc0xlZnQKLQotTGFzdFJ1biAgICAgICAgCi0gICAgICAgIDsvLyBGaW5hbCBydW4gbGVuZ3RoIGlzIHJlbWFpbmluZyB6ZXJvcwotICAgICAgICBNX1BSSU5URiAiTGFzdFJ1bj0lZFxuIiwgWmVyb3NMZWZ0Ci0gICAgICAgIFNUUkIgICAgWmVyb3NMZWZ0LCBbcFJ1bl0sICMxICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBXcml0ZSBjb2VmZmljaWVudHMgdG8gb3V0cHV0IGFycmF5Ci0gICAgICAgIE1fTERSICAgVDEsIHBTTWF4TnVtQ29lZmYgICAgICAgICAgICAgICAgICAgIDsvLyBzTWF4TnVtQ29lZmYKLSAgICAgICAgVEVRICAgICBUMSwgIzE1Ci0gICAgICAgIEFEREVRICAgQ29lZmZOdW0sQ29lZmZOdW0sIzEKLSAgICAgICAgCi0KLSAgICAgICAgU1VCICAgICBwUnVuLHBSdW4sVG90YWxDb2VmZgotICAgICAgICBTVUIgICAgIHBMZXZlbCxwTGV2ZWwsVG90YWxDb2VmZiAgCi0gICAgICAgIFNVQiAgICAgcExldmVsLHBMZXZlbCxUb3RhbENvZWZmICAgCi0KLSAgICAgICAgTV9MRFIgICBwcFBvc0NvZWZidWYsIHBwcFBvc0NvZWZidWYKLSAgICAgICAgTERSICAgICBwUG9zQ29lZmJ1ZiwgW3BwUG9zQ29lZmJ1Zl0KLSAgICAgICAgVEVRICAgICBUMSwgIzQKLSAgICAgICAgTERSRVEgICBwWmlnWmFnLCA9YXJtVkNNNFAxMF9aaWdaYWdfMngyCi0gICAgICAgIExEUk5FICAgcFppZ1phZywgPWFybVZDTTRQMTBfWmlnWmFnXzR4NAotCi0gICAgICAgIAotICAgICAgICAKLU91dHB1dExvb3AKLSAgICAgICAgCi0gICAgICAgIExEUkIgICAgVDIsIFtwUnVuXSwjMQotICAgICAgICBMRFJCICAgIFQxLCBbcFppZ1phZywgQ29lZmZOdW1dCi0gICAgICAgIFNVQiAgICAgQ29lZmZOdW0sIENvZWZmTnVtLCAjMSAgICAgIDsvLyBTa2lwIE5vbiB6ZXJvCi0gICAgICAgIFNVQiAgICAgQ29lZmZOdW0sIENvZWZmTnVtLCBUMiAgICAgIDsvLyBTa2lwIFplcm8gcnVuCi0gICAgICAgIAotICAgICAgICBMRFJTSCAgIFQyLCBbcExldmVsXSwjMgotICAgICAgICAKLSAgICAgICAgU1VCUyAgICBUb3RhbENvZWZmLCBUb3RhbENvZWZmLCAjMSAgICAgICAKLSAgICAgICAgT1JSRVEgICBUMSwgVDEsICNMQVNUX0NPRUZGCi0gICAgICAgIAotICAgICAgICBBREQgICAgIHRlbXAsIFQyLCAjMTI4Ci0gICAgICAgIENNUCAgICAgdGVtcCwgIzI1NgotICAgICAgICBPUlJDUyAgIFQxLCBUMSwgI1RXT19CWVRFX0NPRUZGCi0KLSAgICAgICAgCi0gICAgICAgIFRFUSAgICAgVG90YWxDb2VmZiwgIzAgICAgICAgICAgICAgIDsvLyBQcmVzZXJ2ZXMgY2FycnkgICAgICAgIAotICAgICAgICAKLSAgICAgICAgTV9QUklOVEYgIk91dHB1dD0lMDJ4ICUwNHhcbiIsIFQxLCBUMgotICAgICAgICBTVFJCICAgIFQxLCBbcFBvc0NvZWZidWZdLCAjMQotICAgICAgICBTVFJCICAgIFQyLCBbcFBvc0NvZWZidWZdLCAjMQotICAgICAgICBNT1YgICAgIFQyLCBUMiwgTFNSICM4Ci0gICAgICAgIFNUUkNTQiAgVDIsIFtwUG9zQ29lZmJ1Zl0sICMxICAgICAgICAgICAgICAgIAotICAgICAgICBCTkUgICAgIE91dHB1dExvb3AKLSAgICAgICAgCi0gICAgICAgIDsvLyBGaW5pc2hlZAotICAgICAgICBTVFIgICAgIHBQb3NDb2VmYnVmLCBbcHBQb3NDb2VmYnVmXQotICAgICAgICBNX0xEUiAgIHBwQml0U3RyZWFtLCBwcHBCaXRTdHJlYW0KLSAgICAgICAgTV9MRFIgICBwT2Zmc2V0LCBwcE9mZnNldAotICAgICAgICBCICAgICAgIEVuZE5vRXJyb3IKLSAgICAgICAgICAgIAotRW5kQmFkU3ltYm9sCi0gICAgICAgIE1PViAgICAgcjAsICNPTVhfU3RzX0VycgotICAgICAgICBCICAgICAgIEVuZCAgICAKLSAgICAgICAgCi1FbmROb0Vycm9yCi0gICAgICAgIDsvLyBGaW5pc2hlZCByZWFkaW5nIGZyb20gdGhlIGJpdHN0cmVhbSAgICAgICAgICAgICAgICAKLSAgICAgICAgTV9CRF9GSU5JIHBwQml0U3RyZWFtLCBwT2Zmc2V0Ci0gICAgICAgIAotICAgICAgICA7Ly8gU2V0IHJldHVybiB2YWx1ZQotICAgICAgICBNT1YgICAgIHIwLCAjT01YX1N0c19Ob0VyciAgICAKLUVuZAotICAgICAgICBNX0VORAotICAgIAotICAgIEVORElGCi0gICAgCi0gICAgRU5ECi0gICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlc19zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlc19zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZThjODkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gICAgICAgIAotCi0gICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAKLSAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1FQRGl2VGFibGUKLSAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlCi0gICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDQKLSAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1Bvc1RvVkNvbDJ4MgotICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfVk1hdHJpeCAKLSAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1FQTW9kdWxvVGFibGUKLSAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1ZNYXRyaXhVMTYKLSAgICAgICAgIAotOy8vIERlZmluZSB0aGUgcHJvY2Vzc29yIHZhcmlhbnRzIHN1cHBvcnRlZCBieSB0aGlzIGZpbGUKLSAgICAgICAgIAotICAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAotICAgICAgICAgICAKLSAgICAgICAgIAotOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQotCi0gICAgCi0gICAgSUYgQ29ydGV4QTgKLSAgICAgICAgICAgCi0gCi0gICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfUG9zVG9WQ29sNHg0Ci0gICAgICAgICBEQ0IgIDAsIDIsIDAsIDIKLSAgICAgICAgIERDQiAgMiwgMSwgMiwgMQotICAgICAgICAgRENCICAwLCAyLCAwLCAyCi0gICAgICAgICBEQ0IgIDIsIDEsIDIsIDEKLQotCi0gICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfUG9zVG9WQ29sMngyCi0gICAgICAgICBEQ0IgIDAsIDIKLSAgICAgICAgIERDQiAgMiwgMQotCi0KLSAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9WTWF0cml4Ci0gICAgICAgICBEQ0IgIDEwLCAxNiwgMTMKLSAgICAgICAgIERDQiAgMTEsIDE4LCAxNAotICAgICAgICAgRENCICAxMywgMjAsIDE2Ci0gICAgICAgICBEQ0IgIDE0LCAyMywgMTgKLSAgICAgICAgIERDQiAgMTYsIDI1LCAyMAotICAgICAgICAgRENCICAxOCwgMjksIDIzCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBUaGlzIHRhYmxlIGV2YWx1YXRlcyB0aGUgZXhwcmVzc2lvbiBbKElOVCkoUVAvNildLAotOy8vIGZvciB2YWx1ZXMgb2YgUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLiAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1FQRGl2VGFibGUKLSAgICAgICAgIERDQiAgMCwgIDAsICAwLCAgMCwgIDAsICAwCi0gICAgICAgICBEQ0IgIDEsICAxLCAgMSwgIDEsICAxLCAgMQotICAgICAgICAgRENCICAyLCAgMiwgIDIsICAyLCAgMiwgIDIKLSAgICAgICAgIERDQiAgMywgIDMsICAzLCAgMywgIDMsICAzCi0gICAgICAgICBEQ0IgIDQsICA0LCAgNCwgIDQsICA0LCAgNAotICAgICAgICAgRENCICA1LCAgNSwgIDUsICA1LCAgNSwgIDUKLSAgICAgICAgIERDQiAgNiwgIDYsICA2LCAgNiwgIDYsICA2Ci0gICAgICAgICBEQ0IgIDcsICA3LCAgNywgIDcsICA3LCAgNwotICAgICAgICAgRENCICA4LCAgOCwgIDgsICA4LCAgOCwgIDgKLSAgICAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBUaGlzIHRhYmxlIGNvbnRhaW5zIGFybVZDTTRQMTBfVk1hdHJpeFtRUCU2XVswXSBlbnRpcmVzLAotOy8vIGZvciB2YWx1ZXMgb2YgUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLiAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlCi0gICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAotICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKLSAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4Ci0gICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAotICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKLSAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4Ci0gICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAotICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKLSAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4Ci0gICAgCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gVGhpcyB0YWJsZSBldmFsdWF0ZXMgdGhlIG1vZHVsdXMgZXhwcmVzc2lvbiBbUVAlNl0qNiwKLTsvLyBmb3IgdmFsdWVzIG9mIFFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4gCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9RUE1vZHVsb1RhYmxlCi0gICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKLSAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAotICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCi0gICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKLSAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAotICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCi0gICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKLSAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAotICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCi0gICAgICAgIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIGludmlkdWFsIGJ5dGUgdmFsdWVzIHN0b3JlZCBhcwotOy8vIGhhbGZ3b3Jkcy4gVGhpcyBhdm9pZHMgdW5wYWNraW5nIGluc2lkZSB0aGUgZnVuY3Rpb24KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgCi0gICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfVk1hdHJpeFUxNgotICAgICAgICAgRENXIDEwLCAxNiwgMTMgCi0gICAgICAgICBEQ1cgMTEsIDE4LCAxNAotICAgICAgICAgRENXIDEzLCAyMCwgMTYKLSAgICAgICAgIERDVyAxNCwgMjMsIDE4Ci0gICAgICAgICBEQ1cgMTYsIDI1LCAyMAotICAgICAgICAgRENXIDE4LCAyOSwgMjMgCi0gICAgICAgICAKLSAgICBFTkRJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vQVJNMTEzNkpTICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgCi0gICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBiM2UyMi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLSAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLQotICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKLSAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckFsaWduNHhfdW5zYWZlCi0KLURFQlVHX09OICAgIFNFVEwge0ZBTFNFfQotCi0gICAgSUYgQVJNMTEzNkpTIAotCi07Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKLXBTcmMgICAgICAgICAgICBSTiAwCi1zcmNTdGVwICAgICAgICAgUk4gMQotcERzdCAgICAgICAgICAgIFJOIDgKLWlIZWlnaHQgICAgICAgICBSTiA5Ci0KLTsvLyBEZWNsYXJlIGlubmVyIGxvb3AgcmVnaXN0ZXJzCi14ICAgICAgICAgICAgICAgUk4gNwoteDAgICAgICAgICAgICAgIFJOIDcKLXgxICAgICAgICAgICAgICBSTiAxMAoteDIgICAgICAgICAgICAgIFJOIDExCi1TY3JhdGNoICAgICAgICAgUk4gMTIKLQotOy8vIEZ1bmN0aW9uOiAKLTsvLyAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKLTsvLwotOy8vIEltcGxlbWVudHMgY29weSBmcm9tIGFuIGFyYml0cmFyeSBhbGlnbmVkIHNvdXJjZSBtZW1vcnkgbG9jYXRpb24gKHBTcmMpIHRvIGEgNCBieXRlIGFsaWduZWQKLTsvLyBkZXN0aW5hdGlvbiBwb2ludGVkIGJ5IChwRHN0KSBmb3IgaG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uLgotOy8vIFRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gY29weSA5IGJ5dGVzIGluIGhvcml6b250YWwgZGlyZWN0aW9uLiAKLTsvLwotOy8vIFJlZ2lzdGVycyB1c2VkIGFzIGlucHV0IGZvciB0aGlzIGZ1bmN0aW9uCi07Ly8gcjAscjEscjgscjkgd2hlcmUgcjggY29udGFpbmluZ3MgYWxpZ25lZCBtZW1vcnkgcG9pbnRlciBhbmQgcjkgbm8gcm93cyB0byBjb3B5Ci07Ly8KLTsvLyBSZWdpc3RlcnMgcHJlc2VydmVkIGZvciB0b3AgbGV2ZWwgZnVuY3Rpb24KLTsvLyByMixyMyxyNCxyNSxyNgotOy8vCi07Ly8gUmVnaXN0ZXJzIG1vZGlmaWVkIGJ5IHRoZSBmdW5jdGlvbgotOy8vIHI3LHI4LHI5LHIxMCxyMTEscjEyCi07Ly8KLTsvLyBPdXRwdXQgcmVnaXN0ZXJzCi07Ly8gcjAgLSBwb2ludGVyIHRvIHRoZSBuZXcgYWxpZ25lZCBsb2NhdGlvbiB3aGljaCB3aWxsIGJlIHVzZWQgYXMgcFNyYwotOy8vIHIxIC0gc3RlcCBzaXplIHRvIHRoaXMgYWxpZ25lZCBsb2NhdGlvbgotCi0gICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZSAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gQ29weSBwRHN0IHRvIHNjcmF0Y2gKLSAgICAgICAgTU9WICAgICBTY3JhdGNoLCBwRHN0Ci0KLVN0YXJ0QWxpZ25lZFN0YWNrQ29weQotICAgICAgICBBTkQgICAgIHgsIHBTcmMsICMzCi0gICAgICAgIEJJQyAgICAgcFNyYywgcFNyYywgIzMKLSAgICAgICAgCi0gICAgICAgIE1fU1dJVENIIHgKLSAgICAgICAgTV9DQVNFICAgQ29weTB0b0FsaWduZWQKLSAgICAgICAgTV9DQVNFICAgQ29weTF0b0FsaWduZWQKLSAgICAgICAgTV9DQVNFICAgQ29weTJ0b0FsaWduZWQKLSAgICAgICAgTV9DQVNFICAgQ29weTN0b0FsaWduZWQKLSAgICAgICAgTV9FTkRTV0lUQ0gKLQotQ29weTB0b0FsaWduZWQgIAotICAgICAgICBMRE0gICAgIHBTcmMsIHt4MCwgeDEsIHgyfQotICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxCi0gICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcAotICAgICAgICAKLSAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAotCi0gICAgICAgIFNUTSAgICAgcERzdCEsIHt4MCwgeDEsIHgyfSAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKLSAgICAgICAgQkdUICAgICBDb3B5MHRvQWxpZ25lZAotICAgICAgICBCICAgICAgIENvcHlFbmQgIAotICAgICAgCi1Db3B5MXRvQWxpZ25lZCAgICAgICAgCi0gICAgICAgIExETSAgICAgcFNyYywge3gwLCB4MSwgeDJ9Ci0gICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEKLSAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwCi0gICAgICAgIAotICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCi0KLSAgICAgICAgTU9WICAgICB4MCwgeDAsIExTUiAjOAotICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjMjQKLSAgICAgICAgTU9WICAgICB4MSwgeDEsIExTUiAjOAotICAgICAgICBPUlIgICAgIHgxLCB4MSwgeDIsIExTTCAjMjQKLSAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjOAotICAgICAgICBTVE0gICAgIHBEc3QhLCB7eDAsIHgxLCB4Mn0gICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93Ci0gICAgICAgIEJHVCAgICAgQ29weTF0b0FsaWduZWQKLSAgICAgICAgQiAgICAgICBDb3B5RW5kICAKLQotQ29weTJ0b0FsaWduZWQgICAgICAgIAotICAgICAgICBMRE0gICAgIHBTcmMsIHt4MCwgeDEsIHgyfQotICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxCi0gICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcAotICAgICAgICAKLSAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAotCi0gICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzE2Ci0gICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICMxNgotICAgICAgICBNT1YgICAgIHgxLCB4MSwgTFNSICMxNgotICAgICAgICBPUlIgICAgIHgxLCB4MSwgeDIsIExTTCAjMTYKLSAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjMTYKLSAgICAgICAgU1RNICAgICBwRHN0ISwge3gwLCB4MSwgeDJ9ICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIGFsaWduZWQgb3V0cHV0IHJvdwotICAgICAgICBCR1QgICAgIENvcHkydG9BbGlnbmVkCi0gICAgICAgIEIgICAgICAgQ29weUVuZCAgCi0KLUNvcHkzdG9BbGlnbmVkICAgICAgICAKLSAgICAgICAgTERNICAgICBwU3JjLCB7eDAsIHgxLCB4Mn0KLSAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMQotICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAKLSAgICAgICAgCi0gICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKLQotICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICMyNAotICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjOAotICAgICAgICBNT1YgICAgIHgxLCB4MSwgTFNSICMyNAotICAgICAgICBPUlIgICAgIHgxLCB4MSwgeDIsIExTTCAjOAotICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICMyNAotICAgICAgICBTVE0gICAgIHBEc3QhLCB7eDAsIHgxLCB4Mn0gICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93Ci0gICAgICAgIEJHVCAgICAgQ29weTN0b0FsaWduZWQKLQotQ29weUVuZCAgCi0gICAgICAgIAotICAgICAgICBNT1YgICAgIHBTcmMsIFNjcmF0Y2gKLSAgICAgICAgTU9WICAgICBzcmNTdGVwLCAjMTIKLQotICAgICAgICBNX0VORAotICAgIAotCi07Ly8gRnVuY3Rpb246Ci07Ly8gICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckFsaWduNHhfdW5zYWZlCi07Ly8KLTsvLyBJbXBsZW1lbnRzIGNvcHkgZnJvbSBhbiBhcmJpdHJhcnkgYWxpZ25lZCBzb3VyY2UgbWVtb3J5IGxvY2F0aW9uIChwU3JjKSB0byBhbiBhbGlnbmVkCi07Ly8gZGVzdGluYXRpb24gcG9pbnRlZCBieSAocERzdCkgZm9yIHZlcnRpY2FsIGludGVycG9sYXRpb24uCi07Ly8gVGhpcyBmdW5jdGlvbiBuZWVkcyB0byBjb3B5IDQgYnl0ZXMgaW4gaG9yaXpvbnRhbCBkaXJlY3Rpb24gCi07Ly8KLTsvLyBSZWdpc3RlcnMgdXNlZCBhcyBpbnB1dCBmb3IgdGhpcyBmdW5jdGlvbgotOy8vIHIwLHIxLHI4LHI5IHdoZXJlIHI4IGNvbnRhaW5pbmdzIGFsaWduZWQgbWVtb3J5IHBvaW50ZXIgYW5kIHI5IG5vIG9mIHJvd3MgdG8gY29weQotOy8vCi07Ly8gUmVnaXN0ZXJzIHByZXNlcnZlZCBmb3IgdG9wIGxldmVsIGZ1bmN0aW9uCi07Ly8gcjIscjMscjQscjUscjYKLTsvLwotOy8vIFJlZ2lzdGVycyBtb2RpZmllZCBieSB0aGUgZnVuY3Rpb24KLTsvLyByNyxyOCxyOSxyMTAscjExLHIxMgotOy8vCi07Ly8gT3V0cHV0IHJlZ2lzdGVycwotOy8vIHIwIC0gcG9pbnRlciB0byB0aGUgbmV3IGFsaWduZWQgbG9jYXRpb24gd2hpY2ggd2lsbCBiZSB1c2VkIGFzIHBTcmMKLTsvLyByMSAtIHN0ZXAgc2l6ZSB0byB0aGlzIGFsaWduZWQgbG9jYXRpb24KLQotICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmUgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIENvcHkgcFNyYyB0byBzdGFjawotU3RhcnRWQWxpZ25lZFN0YWNrQ29weQotICAgICAgICBBTkQgICAgIHgsIHBTcmMsICMzCi0gICAgICAgIEJJQyAgICAgcFNyYywgcFNyYywgIzMgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBNX1NXSVRDSCB4Ci0gICAgICAgIE1fQ0FTRSAgIENvcHkwdG9WQWxpZ25lZAotICAgICAgICBNX0NBU0UgICBDb3B5MXRvVkFsaWduZWQKLSAgICAgICAgTV9DQVNFICAgQ29weTJ0b1ZBbGlnbmVkCi0gICAgICAgIE1fQ0FTRSAgIENvcHkzdG9WQWxpZ25lZAotICAgICAgICBNX0VORFNXSVRDSAotICAgICAgICAKLUNvcHkwdG9WQWxpZ25lZCAgCi0gICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxCi0gICAgICAgIAotICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCi0KLSAgICAgICAgU1RSICAgICB4MCwgW3BEc3RdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKLSAgICAgICAgQkdUICAgICBDb3B5MHRvVkFsaWduZWQKLSAgICAgICAgQiAgICAgICBDb3B5VkVuZCAgCi0gICAgICAKLUNvcHkxdG9WQWxpZ25lZCAgICAgICAgCi0gICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KLSAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAotCi0gICAgICAgIE1PViAgICAgeDEsIHgxLCBMU0wgIzI0Ci0gICAgICAgIE9SUiAgICAgeDAsIHgxLCB4MCwgTFNSICM4Ci0gICAgICAgIFNUUiAgICAgeDAsIFtwRHN0XSwgIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93Ci0gICAgICAgIEJHVCAgICAgQ29weTF0b1ZBbGlnbmVkCi0gICAgICAgIEIgICAgICAgQ29weVZFbmQgIAotCi1Db3B5MnRvVkFsaWduZWQgICAgICAgIAotICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCi0gICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKLQotICAgICAgICBNT1YgICAgIHgxLCB4MSwgTFNMICMxNgotICAgICAgICBPUlIgICAgIHgwLCB4MSwgeDAsIExTUiAjMTYKLSAgICAgICAgU1RSICAgICB4MCwgW3BEc3RdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKLSAgICAgICAgQkdUICAgICBDb3B5MnRvVkFsaWduZWQKLSAgICAgICAgQiAgICAgICBDb3B5VkVuZCAgCi0KLUNvcHkzdG9WQWxpZ25lZCAgICAgICAgCi0gICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KLSAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAotCi0gICAgICAgIE1PViAgICAgeDEsIHgxLCBMU0wgIzgKLSAgICAgICAgT1JSICAgICB4MCwgeDEsIHgwLCBMU1IgIzI0Ci0gICAgICAgIFNUUiAgICAgeDAsIFtwRHN0XSwgIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93Ci0gICAgICAgIEJHVCAgICAgQ29weTN0b1ZBbGlnbmVkCi0KLUNvcHlWRW5kICAKLQotICAgICAgICBTVUIgICAgIHBTcmMsIHBEc3QsICMyOAotICAgICAgICBNT1YgICAgIHNyY1N0ZXAsICM0Ci0KLSAgICAgICAgTV9FTkQKLQotCi0gICAgRU5ESUYKLQotICAgIEVORAotICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHlfdW5zYWZlX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQxNWJlYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHlfdW5zYWZlX3MucworKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weV91bnNhZmVfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi07Ly8gRnVuY3Rpb246Ci07Ly8gICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHk0eDRfdW5zYWZlIAotOy8vCi07Ly8gSW1wbGVtZW50cyBjb3B5IGZyb20gYW4gYXJiaXRyYXJ5IGFsaWduZWQgc291cmNlIG1lbW9yeSBsb2NhdGlvbiAocFNyYykgdG8gYW4gYWxpZ25lZAotOy8vIGRlc3RpbmF0aW9uIHBvaW50ZWQgYnkgKHBEc3QpCi07Ly8KLTsvLyBSZWdpc3RlcnMgcHJlc2VydmVkIGZvciB0b3AgbGV2ZWwgZnVuY3Rpb24KLTsvLyByMSxyMyxyNCxyNSxyNixyNyxyMTAscjExLHIxNAotOy8vCi07Ly8gUmVnaXN0ZXJzIG1vZGlmaWVkIGJ5IHRoZSBmdW5jdGlvbgotOy8vIHIwLHIyLHI4LHI5LHIxMgotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi0gICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLSAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHk0eDRfdW5zYWZlCi0gICAgICAgIAotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi1wU3JjICAgICAgICAgICAgUk4gMAotc3JjU3RlcCAgICAgICAgIFJOIDEKLXBEc3QgICAgICAgICAgICBSTiAyCi1kc3RTdGVwICAgICAgICAgUk4gMwotCi07Ly8gRGVjbGFyZSBvdGhlciBpbnRlcm1lZGlhdGUgcmVnaXN0ZXJzCi14MCAgICAgICAgICAgICAgUk4gNAoteDEgICAgICAgICAgICAgIFJOIDUKLXgyICAgICAgICAgICAgICBSTiA4Ci14MyAgICAgICAgICAgICAgUk4gOQotVGVtcCAgICAgICAgICAgIFJOIDEyCi0KLSAgICBJRiBBUk0xMTM2SlMKLQotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHk0eDRfdW5zYWZlLCByNgotCi1Db3B5NHg0U3RhcnQKLSAgICAgICAgOy8vIERvIENvcHkgYW5kIGJyYW5jaCB0byBFbmRPZkludGVycG9sYXRpb24KLSAgICAgICAgQU5EICAgICBUZW1wLCBwU3JjLCAjMwotICAgICAgICBCSUMgICAgIHBTcmMsIHBTcmMsICMzICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgTV9TV0lUQ0ggVGVtcAotICAgICAgICBNX0NBU0UgIENvcHk0eDRBbGlnbjAKLSAgICAgICAgTV9DQVNFICBDb3B5NHg0QWxpZ24xCi0gICAgICAgIE1fQ0FTRSAgQ29weTR4NEFsaWduMgotICAgICAgICBNX0NBU0UgIENvcHk0eDRBbGlnbjMKLSAgICAgICAgTV9FTkRTV0lUQ0gKLQotQ29weTR4NEFsaWduMAotICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgTV9MRFIgICB4MSwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIE1fU1RSICAgeDAsIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBNX0xEUiAgIHgyLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgTV9TVFIgICB4MSwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIE1fTERSICAgeDMsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBNX1NUUiAgIHgyLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgTV9TVFIgICB4MywgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIEIgICAgICAgQ29weTR4NEVuZCAgCi0KLUNvcHk0eDRBbGlnbjEKLSAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQotICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgTERSICAgICB4MywgW3BTcmMsICM0XQotICAgICAgICBNX0xEUiAgIHgyLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgTU9WICAgICB4MCwgeDAsIExTUiAjOAotICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjMjQKLSAgICAgICAgTV9TVFIgICB4MCwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIE1PViAgICAgeDIsIHgyLCBMU1IgIzgKLSAgICAgICAgT1JSICAgICB4MiwgeDIsIHgzLCBMU0wgIzI0Ci0gICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KLSAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIE1fU1RSICAgeDIsIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBMRFIgICAgIHgzLCBbcFNyYywgIzRdCi0gICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICM4Ci0gICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICMyNAotICAgICAgICBNX1NUUiAgIHgwLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjOAotICAgICAgICBPUlIgICAgIHgyLCB4MiwgeDMsIExTTCAjMjQKLSAgICAgICAgTV9TVFIgICB4MiwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIEIgICAgICAgQ29weTR4NEVuZCAgCi0gICAgICAKLUNvcHk0eDRBbGlnbjIKLSAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQotICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgTERSICAgICB4MywgW3BTcmMsICM0XQotICAgICAgICBNX0xEUiAgIHgyLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgTU9WICAgICB4MCwgeDAsIExTUiAjMTYKLSAgICAgICAgT1JSICAgICB4MCwgeDAsIHgxLCBMU0wgIzE2Ci0gICAgICAgIE1fU1RSICAgeDAsIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICMxNgotICAgICAgICBPUlIgICAgIHgyLCB4MiwgeDMsIExTTCAjMTYKLSAgICAgICAgTV9TVFIgICB4MiwgW3BEc3RdLCBkc3RTdGVwICAgICAgICAKLQotICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCi0gICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBMRFIgICAgIHgzLCBbcFNyYywgIzRdCi0gICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICMxNgotICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjMTYKLSAgICAgICAgTV9TVFIgICB4MCwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIE1PViAgICAgeDIsIHgyLCBMU1IgIzE2Ci0gICAgICAgIE9SUiAgICAgeDIsIHgyLCB4MywgTFNMICMxNgotICAgICAgICBNX1NUUiAgIHgyLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgIAotICAgICAgICBCICAgICAgIENvcHk0eDRFbmQgIAotCi1Db3B5NHg0QWxpZ24zIAotICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCi0gICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBMRFIgICAgIHgzLCBbcFNyYywgIzRdCi0gICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICMyNAotICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjOAotICAgICAgICBNX1NUUiAgIHgwLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjMjQKLSAgICAgICAgT1JSICAgICB4MiwgeDIsIHgzLCBMU0wgIzgKLSAgICAgICAgTV9TVFIgICB4MiwgW3BEc3RdLCBkc3RTdGVwCi0KLSAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQotICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgTERSICAgICB4MywgW3BTcmMsICM0XQotICAgICAgICBNX0xEUiAgIHgyLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgTU9WICAgICB4MCwgeDAsIExTUiAjMjQKLSAgICAgICAgT1JSICAgICB4MCwgeDAsIHgxLCBMU0wgIzgKLSAgICAgICAgTV9TVFIgICB4MCwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIE1PViAgICAgeDIsIHgyLCBMU1IgIzI0Ci0gICAgICAgIE9SUiAgICAgeDIsIHgyLCB4MywgTFNMICM4Ci0gICAgICAgIE1fU1RSICAgeDIsIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBCICAgICAgIENvcHk0eDRFbmQgIAotCi1Db3B5NHg0RW5kCi0gICAgICAgIE1fRU5ECi0KLSAgICBFTkRJRgotCi0gICAgRU5ECi0gICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YTczMjYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9EaWFnQ29weV91bnNhZmVfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9EaWFnQ29weV91bnNhZmVfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi0gICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLSAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckRpYWdDb3B5X3Vuc2FmZQotICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyRGlhZ0NvcHlfdW5zYWZlCi0KLTsvLyBGdW5jdGlvbnM6IAotOy8vICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JEaWFnQ29weV91bnNhZmUgYW5kCi07Ly8gICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckRpYWdDb3B5X3Vuc2FmZSAKLTsvLwotOy8vIEltcGxlbWVudHMgcmUtYXJyYW5nZW1lbnQgb2YgZGF0YSBmcm9tIHRlbXBvcmFyeSBidWZmZXIgdG8gYSBidWZmZXIgcG9pbnRlZCBieSBwQnVmLgotOy8vIFRoaXMgd2lsbCBkbyB0aGUgY29udmVydGlvbiBvZiBkYXRhIGZyb20gMTYgYml0IHRvIDggYml0IGFuZCBpdCBhbHNvCi07Ly8gcmVtb3ZlIG9mZnNldCBhbmQgY2hlY2sgZm9yIHNhdHVyYXRpb24uCi07Ly8KLTsvLyBSZWdpc3RlcnMgdXNlZCBhcyBpbnB1dCBmb3IgdGhpcyBmdW5jdGlvbgotOy8vIHIwLHIxLHI3IHdoZXJlIHIwIGlzIGlucHV0IHBvaW50ZXIgYW5kIHIyIGl0cyBzdGVwIHNpemUsIHI3IGlzIG91dHB1dCBwb2ludGVyCi07Ly8KLTsvLyBSZWdpc3RlcnMgcHJlc2VydmVkIGZvciB0b3AgbGV2ZWwgZnVuY3Rpb24KLTsvLyByNCxyNSxyNixyOCxyOSxyMTQKLTsvLwotOy8vIFJlZ2lzdGVycyBtb2RpZmllZCBieSB0aGUgZnVuY3Rpb24KLTsvLyByNyxyMTAscjExLHIxMgotOy8vCi07Ly8gT3V0cHV0IHJlZ2lzdGVycwotOy8vIHIwIC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gbG9jYXRpb24KLTsvLyByMSAtIHN0ZXAgc2l6ZSB0byB0aGlzIGRlc3RpbmF0aW9uIGxvY2F0aW9uCi0KLQotREVCVUdfT04gICAgU0VUTCB7RkFMU0V9Ci0gICAgICAgIAotTUFTSyAgICAgICAgICAgIEVRVSAweDgwODA4MDgwICA7Ly8gTWFzayBpcyB1c2VkIHRvIGltcGxlbWVudCAoYStiKzEpLzIKLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi0KLXBTcmMwICAgICAgICAgICBSTiAwCi1zcmNTdGVwMCAgICAgICAgUk4gMQotCi07Ly8gRGVjbGFyZSBvdGhlciBpbnRlcm1lZGlhdGUgcmVnaXN0ZXJzCi1UZW1wMSAgICAgICAgICAgUk4gNAotVGVtcDIgICAgICAgICAgIFJOIDUKLVRlbXAzICAgICAgICAgICBSTiAxMAotVGVtcDQgICAgICAgICAgIFJOIDExCi1wQnVmICAgICAgICAgICAgUk4gNwotcjB4MGZlMDBmZTAgICAgIFJOIDYKLXIweDAwZmYwMGZmICAgICBSTiAxMgotQ291bnQgICAgICAgICAgIFJOIDE0Ci1WYWx1ZUEwICAgICAgICAgUk4gMTAKLVZhbHVlQTEgICAgICAgICBSTiAxMQotCi0gICAgSUYgQVJNMTEzNkpTCi0KLQotICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yRGlhZ0NvcHlfdW5zYWZlLCByNgotCi0gICAgICAgIDsvLyBDb2RlIHN0YXJ0ICAgICAKLSAgICAgICAgTU9WICAgICAgICAgQ291bnQsICM0ICAgCi0gICAgICAgIExEUiAgICAgICAgIHIweDBmZTAwZmUwLCA9MHgwZmUwMGZlMAotICAgICAgICBMRFIgICAgICAgICByMHgwMGZmMDBmZiwgPTB4MDBmZjAwZmYgICAgICAgIAotTG9vcFN0YXJ0MQotICAgICAgICBMRFIgICAgICAgICBUZW1wNCwgW3BTcmMwLCAjMTJdCi0gICAgICAgIExEUiAgICAgICAgIFRlbXAzLCBbcFNyYzAsICM4XSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIFRlbXAyLCBbcFNyYzAsICM0XQotICAgICAgICBNX0xEUiAgICAgICBUZW1wMSwgW3BTcmMwXSwgc3JjU3RlcDAgICAgICAgICAgICAgIAotICAgICAgICBVUVNVQjE2ICAgICBUZW1wNCwgVGVtcDQsIHIweDBmZTAwZmUwICAgICAgICAKLSAgICAgICAgVVFTVUIxNiAgICAgVGVtcDMsIFRlbXAzLCByMHgwZmUwMGZlMCAgICAgICAgICAgICAgICAgCi0gICAgICAgIFVRU1VCMTYgICAgIFRlbXAyLCBUZW1wMiwgcjB4MGZlMDBmZTAgICAgICAgIAotICAgICAgICBVUVNVQjE2ICAgICBUZW1wMSwgVGVtcDEsIHIweDBmZTAwZmUwICAgICAgICAgICAgICAgICAKLSAgICAgICAgVVNBVDE2ICAgICAgVGVtcDQsICMxMywgVGVtcDQKLSAgICAgICAgVVNBVDE2ICAgICAgVGVtcDMsICMxMywgVGVtcDMgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBVU0FUMTYgICAgICBUZW1wMiwgIzEzLCBUZW1wMgotICAgICAgICBVU0FUMTYgICAgICBUZW1wMSwgIzEzLCBUZW1wMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQU5EICAgICAgICAgVGVtcDQsIHIweDAwZmYwMGZmLCBUZW1wNCwgTFNSICM1ICAgICAgICAgCi0gICAgICAgIEFORCAgICAgICAgIFRlbXAzLCByMHgwMGZmMDBmZiwgVGVtcDMsIExTUiAjNSAgICAgICAgIAotICAgICAgICBBTkQgICAgICAgICBUZW1wMiwgcjB4MDBmZjAwZmYsIFRlbXAyLCBMU1IgIzUgICAgICAgICAKLSAgICAgICAgQU5EICAgICAgICAgVGVtcDEsIHIweDAwZmYwMGZmLCBUZW1wMSwgTFNSICM1ICAgICAgICAgCi0gICAgICAgIE9SUiAgICAgICAgIFZhbHVlQTEsIFRlbXAzLCBUZW1wNCwgTFNMICM4ICAgICAgICAgICAgIAotICAgICAgICBPUlIgICAgICAgICBWYWx1ZUEwLCBUZW1wMSwgVGVtcDIsIExTTCAjOCAgICAgICAgICAgICAKLSAgICAgICAgU1VCUyAgICAgICAgQ291bnQsIENvdW50LCAjMSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgU1RSRCAgICAgICAgVmFsdWVBMCwgW3BCdWZdLCAjOCAKLSAgICAgICAgQkdUICAgICAgICAgTG9vcFN0YXJ0MQotRW5kMQotICAgICAgICBTVUIgICAgICAgIHBTcmMwLCBwQnVmLCAjMzIKLSAgICAgICAgTU9WICAgICAgICBzcmNTdGVwMCwgIzgKLQotICAgICAgICBNX0VORAotCi0KLSAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckRpYWdDb3B5X3Vuc2FmZSwgcjYKLSAgICAgICAgCi0gICAgICAgIDsvLyBDb2RlIHN0YXJ0ICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgcjB4MGZlMDBmZTAsID0weDBmZTAwZmUwCi0gICAgICAgIExEUiAgICAgICAgIHIweDAwZmYwMGZmLCA9MHgwMGZmMDBmZgotICAgICAgICBNT1YgICAgICAgICBDb3VudCwgIzIKLQotTG9vcFN0YXJ0ICAgIAotICAgICAgICBMRFIgICAgICAgICBUZW1wNCwgW3BTcmMwLCAjMTJdCi0gICAgICAgIExEUiAgICAgICAgIFRlbXAzLCBbcFNyYzAsICM4XSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIFRlbXAyLCBbcFNyYzAsICM0XQotICAgICAgICBNX0xEUiAgICAgICBUZW1wMSwgW3BTcmMwXSwgc3JjU3RlcDAKLSAgICAgICAgCi0gICAgICAgIFVRU1VCMTYgICAgIFRlbXA0LCBUZW1wNCwgcjB4MGZlMDBmZTAgICAgICAgIAotICAgICAgICBVUVNVQjE2ICAgICBUZW1wMywgVGVtcDMsIHIweDBmZTAwZmUwICAgICAgICAgICAgICAgICAKLSAgICAgICAgVVFTVUIxNiAgICAgVGVtcDIsIFRlbXAyLCByMHgwZmUwMGZlMCAgICAgICAgCi0gICAgICAgIFVRU1VCMTYgICAgIFRlbXAxLCBUZW1wMSwgcjB4MGZlMDBmZTAgICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgVVNBVDE2ICAgICAgVGVtcDQsICMxMywgVGVtcDQKLSAgICAgICAgVVNBVDE2ICAgICAgVGVtcDMsICMxMywgVGVtcDMgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBVU0FUMTYgICAgICBUZW1wMiwgIzEzLCBUZW1wMgotICAgICAgICBVU0FUMTYgICAgICBUZW1wMSwgIzEzLCBUZW1wMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBBTkQgICAgICAgICBUZW1wNCwgcjB4MDBmZjAwZmYsIFRlbXA0LCBMU1IgIzUgICAgICAgICAKLSAgICAgICAgQU5EICAgICAgICAgVGVtcDMsIHIweDAwZmYwMGZmLCBUZW1wMywgTFNSICM1ICAgICAgICAgCi0gICAgICAgIEFORCAgICAgICAgIFRlbXAyLCByMHgwMGZmMDBmZiwgVGVtcDIsIExTUiAjNSAgICAgICAgIAotICAgICAgICBBTkQgICAgICAgICBUZW1wMSwgcjB4MDBmZjAwZmYsIFRlbXAxLCBMU1IgIzUgICAgICAgICAKLSAgICAgICAgT1JSICAgICAgICAgVmFsdWVBMSwgVGVtcDMsIFRlbXA0LCBMU0wgIzggICAgICAgIDsvLyBbZDIgYzIgZDAgYzBdICAgICAgICAgICAgIAotICAgICAgICBPUlIgICAgICAgICBWYWx1ZUEwLCBUZW1wMSwgVGVtcDIsIExTTCAjOCAgICAgICAgOy8vIFtiMiBhMiBiMCBhMF0gICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFBLSEJUICAgICAgIFRlbXAxLCBWYWx1ZUEwLCBWYWx1ZUExLCBMU0wgIzE2ICAgICA7Ly8gW2QwIGMwIGIwIGEwXQotCi0gICAgICAgIFNUUiAgICAgICAgIFRlbXAxLCBbcEJ1Zl0sICM4IAotICAgICAgICBQS0hUQiAgICAgICBUZW1wMiwgVmFsdWVBMSwgVmFsdWVBMCwgQVNSICMxNiAgICAgOy8vIFtkMiBjMiBiMiBhMl0KLSAgICAgICAgU1RSICAgICAgICAgVGVtcDIsIFtwQnVmXSwgIy00ICAKLQotICAgICAgICBMRFIgICAgICAgICBUZW1wNCwgW3BTcmMwLCAjMTJdCi0gICAgICAgIExEUiAgICAgICAgIFRlbXAzLCBbcFNyYzAsICM4XSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIFRlbXAyLCBbcFNyYzAsICM0XQotICAgICAgICBNX0xEUiAgICAgICBUZW1wMSwgW3BTcmMwXSwgc3JjU3RlcDAKLSAgICAgICAgCi0gICAgICAgIFVRU1VCMTYgICAgIFRlbXA0LCBUZW1wNCwgcjB4MGZlMDBmZTAgICAgICAgIAotICAgICAgICBVUVNVQjE2ICAgICBUZW1wMywgVGVtcDMsIHIweDBmZTAwZmUwICAgICAgICAgICAgICAgICAKLSAgICAgICAgVVFTVUIxNiAgICAgVGVtcDIsIFRlbXAyLCByMHgwZmUwMGZlMCAgICAgICAgCi0gICAgICAgIFVRU1VCMTYgICAgIFRlbXAxLCBUZW1wMSwgcjB4MGZlMDBmZTAgICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgVVNBVDE2ICAgICAgVGVtcDQsICMxMywgVGVtcDQKLSAgICAgICAgVVNBVDE2ICAgICAgVGVtcDMsICMxMywgVGVtcDMgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBVU0FUMTYgICAgICBUZW1wMiwgIzEzLCBUZW1wMgotICAgICAgICBVU0FUMTYgICAgICBUZW1wMSwgIzEzLCBUZW1wMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBBTkQgICAgICAgICBUZW1wNCwgcjB4MDBmZjAwZmYsIFRlbXA0LCBMU1IgIzUgICAgICAgICAKLSAgICAgICAgQU5EICAgICAgICAgVGVtcDMsIHIweDAwZmYwMGZmLCBUZW1wMywgTFNSICM1ICAgICAgICAgCi0gICAgICAgIEFORCAgICAgICAgIFRlbXAyLCByMHgwMGZmMDBmZiwgVGVtcDIsIExTUiAjNSAgICAgICAgIAotICAgICAgICBBTkQgICAgICAgICBUZW1wMSwgcjB4MDBmZjAwZmYsIFRlbXAxLCBMU1IgIzUgICAgICAgICAKLSAgICAgICAgT1JSICAgICAgICAgVmFsdWVBMSwgVGVtcDMsIFRlbXA0LCBMU0wgIzggICAgICAgIDsvLyBbZDIgYzIgZDAgYzBdICAgICAgICAgICAgIAotICAgICAgICBPUlIgICAgICAgICBWYWx1ZUEwLCBUZW1wMSwgVGVtcDIsIExTTCAjOCAgICAgICAgOy8vIFtiMiBhMiBiMCBhMF0gICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFBLSEJUICAgICAgIFRlbXAxLCBWYWx1ZUEwLCBWYWx1ZUExLCBMU0wgIzE2ICAgICA7Ly8gW2QwIGMwIGIwIGEwXQotICAgICAgICBTVUJTICAgICAgICBDb3VudCwgQ291bnQsICMxCi0gICAgICAgIFNUUiAgICAgICAgIFRlbXAxLCBbcEJ1Zl0sICM4IAotICAgICAgICBQS0hUQiAgICAgICBUZW1wMiwgVmFsdWVBMSwgVmFsdWVBMCwgQVNSICMxNiAgICAgOy8vIFtkMiBjMiBiMiBhMl0KLSAgICAgICAgU1RSICAgICAgICAgVGVtcDIsIFtwQnVmXSwgIzQgIAotICAgICAgICAKLSAgICAgICAgQkdUICAgICAgICAgTG9vcFN0YXJ0Ci1FbmQyCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMwLCBwQnVmLCAjMzItOAotICAgICAgICBNT1YgICAgICAgICBzcmNTdGVwMCwgIzQKLQotICAgICAgICBNX0VORAotCi0gICAgRU5ESUYKLSAgICAKLSAgICBFTkQKLSAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ4Njc4Mi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzMjcgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLSAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZQotCi0gICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKLQotICAgIElGIENvcnRleEE4Ci0KLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUsIHIxMQotCi07Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKLXBTcmMgICAgICAgICAgICBSTiAwCi1zcmNTdGVwICAgICAgICAgUk4gMQotcERzdCAgICAgICAgICAgIFJOIDIKLWRzdFN0ZXAgICAgICAgICBSTiAzCi0KLTsvLyBEZWNsYXJlIE5lb24gcmVnaXN0ZXJzCi1kQ29lZmY1ICAgICAgICAgRE4gMzAuUzE2Ci1kQ29lZmYyMCAgICAgICAgRE4gMzEuUzE2Ci1xQ29lZmY1ICAgICAgICAgUU4gMTQuUzMyCi1xQ29lZmYyMCAgICAgICAgUU4gMTUuUzMyCi0gICAgICAgIAotcVNyYzAxICAgICAgICAgIFFOIDAuVTgKLWRTcmMwICAgICAgICAgICBETiAwLlU4Ci1kU3JjMSAgICAgICAgICAgRE4gMS5VOCAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLWRTcmNiICAgICAgICAgICBETiA0LlU4Ci1kU3JjYyAgICAgICAgICAgRE4gMi5VOAotZFNyY2QgICAgICAgICAgIEROIDMuVTgKLWRTcmNlICAgICAgICAgICBETiA1LlU4Ci1kU3JjZiAgICAgICAgICAgRE4gMS5VOAotCi1xU3JjYiAgICAgICAgICAgUU4gMi5TMTYKLXFTcmNjICAgICAgICAgICBRTiAxLlMxNgotZFNyY0IgICAgICAgICAgIEROIDQuUzE2Ci1kU3JjQyAgICAgICAgICAgRE4gMi5TMTYKLQotcVJlczAgICAgICAgICAgIFFOIDUuUzE2Ci1xUmVzMSAgICAgICAgICAgUU4gNi5TMTYKLXFSZXMyICAgICAgICAgICBRTiA3LlMxNgotcVJlczMgICAgICAgICAgIFFOIDguUzE2Ci1xUmVzNCAgICAgICAgICAgUU4gOS5TMTYKLXFSZXM1ICAgICAgICAgICBRTiAxMC5TMTYKLXFSZXM2ICAgICAgICAgICBRTiAxMS5TMTYKLXFSZXM3ICAgICAgICAgICBRTiAxMi5TMTYKLXFSZXM4ICAgICAgICAgICBRTiAxMy5TMTYKLSAgICAKLWRSZXMwICAgICAgICAgICBETiAxMC5TMTYKLWRSZXMxICAgICAgICAgICBETiAxMi5TMTYKLWRSZXMyICAgICAgICAgICBETiAxNC5TMTYKLWRSZXMzICAgICAgICAgICBETiAxNi5TMTYKLWRSZXM0ICAgICAgICAgICBETiAxOC5TMTYKLWRSZXM1ICAgICAgICAgICBETiAyMC5TMTYKLWRSZXM2ICAgICAgICAgICBETiAyMi5TMTYKLWRSZXM3ICAgICAgICAgICBETiAyNC5TMTYKLWRSZXM4ICAgICAgICAgICBETiAyNi5TMTYKLSAgICAKLXFBY2MwMSAgICAgICAgICBRTiA1LlMzMgotcUFjYzIzICAgICAgICAgIFFOIDYuUzMyCi1xQWNjNDUgICAgICAgICAgUU4gMi5TMzIKLXFBY2M2NyAgICAgICAgICBRTiAzLlMzMgotcVN1bUJFICAgICAgICAgIFFOIDAuUzMyCi1xU3VtQ0QgICAgICAgICAgUU4gMS5TMzIKLQotZFRlbXBBY2MwICAgICAgIEROIDAuVTE2Ci1kVGVtcEFjYzEgICAgICAgRE4gMi5VMTYKLWRUZW1wQWNjMiAgICAgICBETiA0LlUxNgotZFRlbXBBY2MzICAgICAgIEROIDYuVTE2Ci0KLXFUQWNjMCAgICAgICAgICBRTiAwLlUxNgotcVRBY2MxICAgICAgICAgIFFOIDEuVTE2Ci1xVEFjYzIgICAgICAgICAgUU4gMi5VMTYKLXFUQWNjMyAgICAgICAgICBRTiAzLlUxNgotCi1kQWNjMCAgICAgICAgICAgRE4gMC5VOAotZEFjYzEgICAgICAgICAgIEROIDIuVTgKLWRBY2MyICAgICAgICAgICBETiA0LlU4Ci1kQWNjMyAgICAgICAgICAgRE4gNi5VOAotCi1kVG1wMCAgICAgICAgICAgRE4gOC5TMTYKLWRUbXAxICAgICAgICAgICBETiA5LlMxNgotcVRtcDAgICAgICAgICAgIFFOIDQuUzMyCi0KLSAgICAgICAgVkxEMSAgICAgICAgcVNyYzAxLCBbcFNyY10sIHNyY1N0ZXAgICAgIDsvLyBbYTAgYTEgYTIgYTMgLi5dCi0gICAgICAgIFZNT1YgICAgICAgIGRDb2VmZjIwLCAjMjAKLSAgICAgICAgVk1PViAgICAgICAgZENvZWZmNSwgIzUKLQotICAgICAgICA7Ly8gUm93MAotICAgICAgICBWRVhUICAgICAgICBkU3JjYiwgZFNyYzAsIGRTcmMxLCAjMSAgICAgOy8vIFtiMCBiMSBiMiBiMyAuLl0KLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2MsIGRTcmMwLCBkU3JjMSwgIzIKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2QsIGRTcmMwLCBkU3JjMSwgIzMKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2UsIGRTcmMwLCBkU3JjMSwgIzQKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2YsIGRTcmMwLCBkU3JjMSwgIzUgICAgIDsvLyBbZjAgZjEgZjIgZjMgLi5dCi0gICAgICAgIFZBRERMICAgICAgIHFTcmNjLCBkU3JjYywgZFNyY2QgICAgICAgICA7Ly8gYytkICAgICAgICAgICAgICAgIAotICAgICAgICBWQURETCAgICAgICBxU3JjYiwgZFNyY2IsIGRTcmNlICAgICAgICAgOy8vIGIrZSAgICAgICAgCi0gICAgICAgIFZBRERMICAgICAgIHFSZXMwLCBkU3JjMCwgZFNyY2YgICAgICAgICA7Ly8gQWNjPWErZgotICAgICAgICBWTEQxICAgICAgICBxU3JjMDEsIFtwU3JjXSwgc3JjU3RlcCAgICAgOy8vIFthMCBhMSBhMiBhMyAuLl0KLSAgICAgICAgVk1MQSAgICAgICAgZFJlczAsIGRTcmNDLCBkQ29lZmYyMCAgICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKLTsgICAgICAgIFZNTFMgICAgICAgIGRSZXMwLCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKLSAgICAgICAgVk1VTCAgICAgICAgZFRtcDAsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQotICAgICAgICAKLSAgICAgICAgOy8vIFJvdzEKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2IsIGRTcmMwLCBkU3JjMSwgIzEgICAgIDsvLyBbYjAgYjEgYjIgYjMgLi5dCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNjLCBkU3JjMCwgZFNyYzEsICMyCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNkLCBkU3JjMCwgZFNyYzEsICMzCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNlLCBkU3JjMCwgZFNyYzEsICM0Ci0gICAgICAgIFZFWFQgICAgICAgIGRTcmNmLCBkU3JjMCwgZFNyYzEsICM1ICAgICA7Ly8gW2YwIGYxIGYyIGYzIC4uXQotICAgICAgICBWQURETCAgICAgICBxU3JjYywgZFNyY2MsIGRTcmNkICAgICAgICAgOy8vIGMrZCAgICAgICAgICAgICAgICAKLSAgICAgICAgVkFEREwgICAgICAgcVNyY2IsIGRTcmNiLCBkU3JjZSAgICAgICAgIDsvLyBiK2UgICAgICAgIAotICAgICAgICBWQURETCAgICAgICBxUmVzMSwgZFNyYzAsIGRTcmNmICAgICAgICAgOy8vIEFjYz1hK2YKLSAgICAgICAgVkxEMSAgICAgICAgcVNyYzAxLCBbcFNyY10sIHNyY1N0ZXAgICAgIDsvLyBbYTAgYTEgYTIgYTMgLi5dCi0gICAgICAgIAotICAgICAgICBWU1VCICAgICAgICBkUmVzMCwgZFJlczAsIGRUbXAwIDsvLyBUZVJpCi0gICAgICAgIAotICAgICAgICBWTUxBICAgICAgICBkUmVzMSwgZFNyY0MsIGRDb2VmZjIwICAgICAgOy8vIEFjYyArPSAyMCooYytkKQotOyAgICAgICAgVk1MUyAgICAgICAgZFJlczEsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQotICAgICAgICBWTVVMICAgICAgICBkVG1wMCwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCi0KLSAgICAgICAgOy8vIFJvdzIKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2IsIGRTcmMwLCBkU3JjMSwgIzEgICAgIDsvLyBbYjAgYjEgYjIgYjMgLi5dCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNjLCBkU3JjMCwgZFNyYzEsICMyCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNkLCBkU3JjMCwgZFNyYzEsICMzCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNlLCBkU3JjMCwgZFNyYzEsICM0Ci0gICAgICAgIFZFWFQgICAgICAgIGRTcmNmLCBkU3JjMCwgZFNyYzEsICM1ICAgICA7Ly8gW2YwIGYxIGYyIGYzIC4uXQotICAgICAgICBWQURETCAgICAgICBxU3JjYywgZFNyY2MsIGRTcmNkICAgICAgICAgOy8vIGMrZCAgICAgICAgICAgICAgICAKLSAgICAgICAgVkFEREwgICAgICAgcVNyY2IsIGRTcmNiLCBkU3JjZSAgICAgICAgIDsvLyBiK2UgICAgICAgIAotICAgICAgICBWQURETCAgICAgICBxUmVzMiwgZFNyYzAsIGRTcmNmICAgICAgICAgOy8vIEFjYz1hK2YKLSAgICAgICAgVkxEMSAgICAgICAgcVNyYzAxLCBbcFNyY10sIHNyY1N0ZXAgICAgIDsvLyBbYTAgYTEgYTIgYTMgLi5dCi0gICAgICAgIAotICAgICAgICBWU1VCICAgICAgICBkUmVzMSwgZFJlczEsIGRUbXAwCi0KLSAgICAgICAgVk1MQSAgICAgICAgZFJlczIsIGRTcmNDLCBkQ29lZmYyMCAgICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKLTsgICAgICAgIFZNTFMgICAgICAgIGRSZXMyLCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKLSAgICAgICAgVk1VTCAgICAgICAgZFRtcDAsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQotCi0gICAgICAgIDsvLyBSb3czCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNiLCBkU3JjMCwgZFNyYzEsICMxICAgICA7Ly8gW2IwIGIxIGIyIGIzIC4uXQotICAgICAgICBWRVhUICAgICAgICBkU3JjYywgZFNyYzAsIGRTcmMxLCAjMgotICAgICAgICBWRVhUICAgICAgICBkU3JjZCwgZFNyYzAsIGRTcmMxLCAjMwotICAgICAgICBWRVhUICAgICAgICBkU3JjZSwgZFNyYzAsIGRTcmMxLCAjNAotICAgICAgICBWRVhUICAgICAgICBkU3JjZiwgZFNyYzAsIGRTcmMxLCAjNSAgICAgOy8vIFtmMCBmMSBmMiBmMyAuLl0KLSAgICAgICAgVkFEREwgICAgICAgcVNyY2MsIGRTcmNjLCBkU3JjZCAgICAgICAgIDsvLyBjK2QgICAgICAgICAgICAgICAgCi0gICAgICAgIFZBRERMICAgICAgIHFTcmNiLCBkU3JjYiwgZFNyY2UgICAgICAgICA7Ly8gYitlICAgICAgICAKLSAgICAgICAgVkFEREwgICAgICAgcVJlczMsIGRTcmMwLCBkU3JjZiAgICAgICAgIDsvLyBBY2M9YStmCi0gICAgICAgIFZMRDEgICAgICAgIHFTcmMwMSwgW3BTcmNdLCBzcmNTdGVwICAgICA7Ly8gW2EwIGExIGEyIGEzIC4uXQotCi0gICAgICAgIFZTVUIgICAgICAgIGRSZXMyLCBkUmVzMiwgZFRtcDAKLQotICAgICAgICBWTUxBICAgICAgICBkUmVzMywgZFNyY0MsIGRDb2VmZjIwICAgICAgOy8vIEFjYyArPSAyMCooYytkKQotOyAgICAgICAgVk1MUyAgICAgICAgZFJlczMsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQotICAgICAgICBWTVVMICAgICAgICBkVG1wMCwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCi0KLSAgICAgICAgOy8vIFJvdzQKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2IsIGRTcmMwLCBkU3JjMSwgIzEgICAgIDsvLyBbYjAgYjEgYjIgYjMgLi5dCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNjLCBkU3JjMCwgZFNyYzEsICMyCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNkLCBkU3JjMCwgZFNyYzEsICMzCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNlLCBkU3JjMCwgZFNyYzEsICM0Ci0gICAgICAgIFZFWFQgICAgICAgIGRTcmNmLCBkU3JjMCwgZFNyYzEsICM1ICAgICA7Ly8gW2YwIGYxIGYyIGYzIC4uXQotICAgICAgICBWQURETCAgICAgICBxU3JjYywgZFNyY2MsIGRTcmNkICAgICAgICAgOy8vIGMrZCAgICAgICAgICAgICAgICAKLSAgICAgICAgVkFEREwgICAgICAgcVNyY2IsIGRTcmNiLCBkU3JjZSAgICAgICAgIDsvLyBiK2UgICAgICAgIAotICAgICAgICBWQURETCAgICAgICBxUmVzNCwgZFNyYzAsIGRTcmNmICAgICAgICAgOy8vIEFjYz1hK2YKLSAgICAgICAgVkxEMSAgICAgICAgcVNyYzAxLCBbcFNyY10sIHNyY1N0ZXAgICAgIDsvLyBbYTAgYTEgYTIgYTMgLi5dCi0KLSAgICAgICAgVlNVQiAgICAgICAgZFJlczMsIGRSZXMzLCBkVG1wMAotCi0gICAgICAgIFZNTEEgICAgICAgIGRSZXM0LCBkU3JjQywgZENvZWZmMjAgICAgICA7Ly8gQWNjICs9IDIwKihjK2QpCi07ICAgICAgICBWTUxTICAgICAgICBkUmVzNCwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCi0gICAgICAgIFZNVUwgICAgICAgIGRUbXAwLCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKLQotICAgICAgICA7Ly8gUm93NQotICAgICAgICBWRVhUICAgICAgICBkU3JjYiwgZFNyYzAsIGRTcmMxLCAjMSAgICAgOy8vIFtiMCBiMSBiMiBiMyAuLl0KLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2MsIGRTcmMwLCBkU3JjMSwgIzIKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2QsIGRTcmMwLCBkU3JjMSwgIzMKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2UsIGRTcmMwLCBkU3JjMSwgIzQKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2YsIGRTcmMwLCBkU3JjMSwgIzUgICAgIDsvLyBbZjAgZjEgZjIgZjMgLi5dCi0gICAgICAgIFZBRERMICAgICAgIHFTcmNjLCBkU3JjYywgZFNyY2QgICAgICAgICA7Ly8gYytkICAgICAgICAgICAgICAgIAotICAgICAgICBWQURETCAgICAgICBxU3JjYiwgZFNyY2IsIGRTcmNlICAgICAgICAgOy8vIGIrZSAgICAgICAgCi0gICAgICAgIFZBRERMICAgICAgIHFSZXM1LCBkU3JjMCwgZFNyY2YgICAgICAgICA7Ly8gQWNjPWErZgotICAgICAgICBWTEQxICAgICAgICBxU3JjMDEsIFtwU3JjXSwgc3JjU3RlcCAgICAgOy8vIFthMCBhMSBhMiBhMyAuLl0KLQotICAgICAgICBWU1VCICAgICAgICBkUmVzNCwgZFJlczQsIGRUbXAwCi0KLSAgICAgICAgVk1MQSAgICAgICAgZFJlczUsIGRTcmNDLCBkQ29lZmYyMCAgICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKLTsgICAgICAgIFZNTFMgICAgICAgIGRSZXM1LCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKLSAgICAgICAgVk1VTCAgICAgICAgZFRtcDAsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQotCi0gICAgICAgIDsvLyBSb3c2Ci0gICAgICAgIFZFWFQgICAgICAgIGRTcmNiLCBkU3JjMCwgZFNyYzEsICMxICAgICA7Ly8gW2IwIGIxIGIyIGIzIC4uXQotICAgICAgICBWRVhUICAgICAgICBkU3JjYywgZFNyYzAsIGRTcmMxLCAjMgotICAgICAgICBWRVhUICAgICAgICBkU3JjZCwgZFNyYzAsIGRTcmMxLCAjMwotICAgICAgICBWRVhUICAgICAgICBkU3JjZSwgZFNyYzAsIGRTcmMxLCAjNAotICAgICAgICBWRVhUICAgICAgICBkU3JjZiwgZFNyYzAsIGRTcmMxLCAjNSAgICAgOy8vIFtmMCBmMSBmMiBmMyAuLl0KLSAgICAgICAgVkFEREwgICAgICAgcVNyY2MsIGRTcmNjLCBkU3JjZCAgICAgICAgIDsvLyBjK2QgICAgICAgICAgICAgICAgCi0gICAgICAgIFZBRERMICAgICAgIHFTcmNiLCBkU3JjYiwgZFNyY2UgICAgICAgICA7Ly8gYitlICAgICAgICAKLSAgICAgICAgVkFEREwgICAgICAgcVJlczYsIGRTcmMwLCBkU3JjZiAgICAgICAgIDsvLyBBY2M9YStmCi0gICAgICAgIFZMRDEgICAgICAgIHFTcmMwMSwgW3BTcmNdLCBzcmNTdGVwICAgICA7Ly8gW2EwIGExIGEyIGEzIC4uXQotCi0gICAgICAgIFZTVUIgICAgICAgIGRSZXM1LCBkUmVzNSwgZFRtcDAKLQotICAgICAgICBWTUxBICAgICAgICBkUmVzNiwgZFNyY0MsIGRDb2VmZjIwICAgICAgOy8vIEFjYyArPSAyMCooYytkKQotOyAgICAgICAgVk1MUyAgICAgICAgZFJlczYsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQotICAgICAgICBWTVVMICAgICAgICBkVG1wMCwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCi0KLSAgICAgICAgOy8vIFJvdzcKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2IsIGRTcmMwLCBkU3JjMSwgIzEgICAgIDsvLyBbYjAgYjEgYjIgYjMgLi5dCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNjLCBkU3JjMCwgZFNyYzEsICMyCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNkLCBkU3JjMCwgZFNyYzEsICMzCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNlLCBkU3JjMCwgZFNyYzEsICM0Ci0gICAgICAgIFZFWFQgICAgICAgIGRTcmNmLCBkU3JjMCwgZFNyYzEsICM1ICAgICA7Ly8gW2YwIGYxIGYyIGYzIC4uXQotICAgICAgICBWQURETCAgICAgICBxU3JjYywgZFNyY2MsIGRTcmNkICAgICAgICAgOy8vIGMrZCAgICAgICAgICAgICAgICAKLSAgICAgICAgVkFEREwgICAgICAgcVNyY2IsIGRTcmNiLCBkU3JjZSAgICAgICAgIDsvLyBiK2UgICAgICAgIAotICAgICAgICBWQURETCAgICAgICBxUmVzNywgZFNyYzAsIGRTcmNmICAgICAgICAgOy8vIEFjYz1hK2YKLSAgICAgICAgVkxEMSAgICAgICAgcVNyYzAxLCBbcFNyY10sIHNyY1N0ZXAgICAgIDsvLyBbYTAgYTEgYTIgYTMgLi5dCi0KLSAgICAgICAgVlNVQiAgICAgICAgZFJlczYsIGRSZXM2LCBkVG1wMAotCi0gICAgICAgIFZNTEEgICAgICAgIGRSZXM3LCBkU3JjQywgZENvZWZmMjAgICAgICA7Ly8gQWNjICs9IDIwKihjK2QpCi07ICAgICAgICBWTUxTICAgICAgICBkUmVzNywgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCi0gICAgICAgIFZNVUwgICAgICAgIGRUbXAwLCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKLQotICAgICAgICA7Ly8gUm93OAotICAgICAgICBWRVhUICAgICAgICBkU3JjYiwgZFNyYzAsIGRTcmMxLCAjMSAgICAgOy8vIFtiMCBiMSBiMiBiMyAuLl0KLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2MsIGRTcmMwLCBkU3JjMSwgIzIKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2QsIGRTcmMwLCBkU3JjMSwgIzMKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2UsIGRTcmMwLCBkU3JjMSwgIzQKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2YsIGRTcmMwLCBkU3JjMSwgIzUgICAgIDsvLyBbZjAgZjEgZjIgZjMgLi5dCi0gICAgICAgIFZBRERMICAgICAgIHFTcmNjLCBkU3JjYywgZFNyY2QgICAgICAgICA7Ly8gYytkICAgICAgICAgICAgICAgIAotICAgICAgICBWQURETCAgICAgICBxU3JjYiwgZFNyY2IsIGRTcmNlICAgICAgICAgOy8vIGIrZSAgICAgICAgCi0gICAgICAgIFZBRERMICAgICAgIHFSZXM4LCBkU3JjMCwgZFNyY2YgICAgICAgICA7Ly8gQWNjPWErZgotCi0gICAgICAgIFZTVUIgICAgICAgIGRSZXM3LCBkUmVzNywgZFRtcDAKLQotICAgICAgICBWTUxBICAgICAgICBkUmVzOCwgZFNyY0MsIGRDb2VmZjIwICAgICAgOy8vIEFjYyArPSAyMCooYytkKQotOyAgICAgICAgVk1MUyAgICAgICAgZFJlczgsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQotICAgICAgICBWTVVMICAgICAgICBkVG1wMCwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCi0KLSAgICAgICAgVk1PViAgICAgICAgcUNvZWZmMjAsICMyMAotICAgICAgICBWTU9WICAgICAgICBxQ29lZmY1LCAjNQotCi0gICAgICAgIDsvLyBDb2wwCi0gICAgICAgIFZBRERMICAgICAgIHFBY2MwMSwgZFJlczAsIGRSZXM1ICAgICAgICA7Ly8gQWNjID0gYStmCi0gICAgICAgIFZBRERMICAgICAgIHFTdW1DRCwgZFJlczIsIGRSZXMzICAgICAgICA7Ly8gYytkCi0gICAgICAgIFZBRERMICAgICAgIHFTdW1CRSwgZFJlczEsIGRSZXM0ICAgICAgICA7Ly8gYitlCi0KLSAgICAgICAgVlNVQiAgICAgICAgZFJlczgsIGRSZXM4LCBkVG1wMAotCi0gICAgICAgIFZNTEEgICAgICAgIHFBY2MwMSwgcVN1bUNELCBxQ29lZmYyMCAgICA7Ly8gQWNjICs9IDIwKihjK2QpCi07ICAgICAgICBWTUxTICAgICAgICBxQWNjMDEsIHFTdW1CRSwgcUNvZWZmNSAgICAgOy8vIEFjYyAtPSAyMCooYitlKSAgICAgICAgCi0gICAgICAgIFZNVUwgICAgICAgIHFUbXAwLCBxU3VtQkUsIHFDb2VmZjUgICAgIDsvLyBBY2MgLT0gMjAqKGIrZSkgICAgICAgIAotCi0gICAgICAgIDsvLyBDb2wxCi0gICAgICAgIFZBRERMICAgICAgIHFBY2MyMywgZFJlczEsIGRSZXM2ICAgICAgICA7Ly8gQWNjID0gYStmCi0gICAgICAgIFZBRERMICAgICAgIHFTdW1DRCwgZFJlczMsIGRSZXM0ICAgICAgICA7Ly8gYytkCi0gICAgICAgIFZBRERMICAgICAgIHFTdW1CRSwgZFJlczIsIGRSZXM1ICAgICAgICA7Ly8gYitlCi0gICAgICAgIFZNTEEgICAgICAgIHFBY2MyMywgcVN1bUNELCBxQ29lZmYyMCAgICA7Ly8gQWNjICs9IDIwKihjK2QpCi0KLSAgICAgICAgVlNVQiAgICAgICAgcUFjYzAxLCBxQWNjMDEsIHFUbXAwCi0KLTsgICAgICAgIFZNTFMgICAgICAgIHFBY2MyMywgcVN1bUJFLCBxQ29lZmY1ICAgICA7Ly8gQWNjIC09IDIwKihiK2UpICAgICAgICAKLSAgICAgICAgVk1VTCAgICAgICAgcVRtcDAsIHFTdW1CRSwgcUNvZWZmNSAgICAgOy8vIEFjYyAtPSAyMCooYitlKSAgICAgICAgCi0KLSAgICAgICAgOy8vIENvbDIKLSAgICAgICAgVkFEREwgICAgICAgcUFjYzQ1LCBkUmVzMiwgZFJlczcgICAgICAgIDsvLyBBY2MgPSBhK2YKLSAgICAgICAgVkFEREwgICAgICAgcVN1bUNELCBkUmVzNCwgZFJlczUgICAgICAgIDsvLyBjK2QKLSAgICAgICAgVkFEREwgICAgICAgcVN1bUJFLCBkUmVzMywgZFJlczYgICAgICAgIDsvLyBiK2UKLSAgICAgICAgVk1MQSAgICAgICAgcUFjYzQ1LCBxU3VtQ0QsIHFDb2VmZjIwICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKLQotICAgICAgICBWU1VCICAgICAgICBxQWNjMjMsIHFBY2MyMywgcVRtcDAKLQotOyAgICAgICAgVk1MUyAgICAgICAgcUFjYzQ1LCBxU3VtQkUsIHFDb2VmZjUgICAgIDsvLyBBY2MgLT0gMjAqKGIrZSkgICAgICAgIAotICAgICAgICBWTVVMICAgICAgICBxVG1wMCwgcVN1bUJFLCBxQ29lZmY1ICAgICA7Ly8gQWNjIC09IDIwKihiK2UpICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBDb2wzCi0gICAgICAgIFZBRERMICAgICAgIHFBY2M2NywgZFJlczMsIGRSZXM4ICAgICAgICA7Ly8gQWNjID0gYStmCi0gICAgICAgIFZBRERMICAgICAgIHFTdW1DRCwgZFJlczUsIGRSZXM2ICAgICAgICA7Ly8gYytkCi0gICAgICAgIFZBRERMICAgICAgIHFTdW1CRSwgZFJlczQsIGRSZXM3ICAgICAgICA7Ly8gYitlCi0gICAgICAgIFZNTEEgICAgICAgIHFBY2M2NywgcVN1bUNELCBxQ29lZmYyMCAgICA7Ly8gQWNjICs9IDIwKihjK2QpCi0KLSAgICAgICAgVlNVQiAgICAgICAgcUFjYzQ1LCBxQWNjNDUsIHFUbXAwCi0KLSAgICAgICAgVk1MUyAgICAgICAgcUFjYzY3LCBxU3VtQkUsIHFDb2VmZjUgICAgIDsvLyBBY2MgLT0gMjAqKGIrZSkgICAgICAgIAotCi0gICAgICAgIFZRUlNIUlVOICAgIGRUZW1wQWNjMCwgcUFjYzAxLCAjMTAKLSAgICAgICAgVlFSU0hSVU4gICAgZFRlbXBBY2MxLCBxQWNjMjMsICMxMAotICAgICAgICBWUVJTSFJVTiAgICBkVGVtcEFjYzIsIHFBY2M0NSwgIzEwCi0gICAgICAgIFZRUlNIUlVOICAgIGRUZW1wQWNjMywgcUFjYzY3LCAjMTAKLSAgICAgICAgCi0gICAgICAgIFZRTU9WTiAgICAgIGRBY2MwLCBxVEFjYzAKLSAgICAgICAgVlFNT1ZOICAgICAgZEFjYzEsIHFUQWNjMQotICAgICAgICBWUU1PVk4gICAgICBkQWNjMiwgcVRBY2MyCi0gICAgICAgIFZRTU9WTiAgICAgIGRBY2MzLCBxVEFjYzMKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgTV9FTkQKLSAgICAKLSAgICBFTkRJRgotCi0KLSAgICAKLSAgICBFTkQKLSAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JjOTUzNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotCi0gICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKLQotICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4Ci0KLSAgICBJRiBDb3J0ZXhBOAotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZSwgcjExCi0KLTsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycwotcFNyYyAgICAgICAgICAgIFJOIDAKLXNyY1N0ZXAgICAgICAgICBSTiAxCi1wRHN0ICAgICAgICAgICAgUk4gMgotZHN0U3RlcCAgICAgICAgIFJOIDMKLQotOy8vIERlY2xhcmUgTmVvbiByZWdpc3RlcnMKLWRUQ29lZmY1ICAgICAgICBETiAzMC5VOAotZFRDb2VmZjIwICAgICAgIEROIDMxLlU4Ci1kQ29lZmY1ICAgICAgICAgRE4gMzAuUzE2Ci1kQ29lZmYyMCAgICAgICAgRE4gMzEuUzE2Ci0KLXFTcmNBMDEgICAgICAgICBRTiAwLlU4Ci1xU3JjQjIzICAgICAgICAgUU4gMS5VOAotcVNyY0M0NSAgICAgICAgIFFOIDIuVTgKLXFTcmNENjcgICAgICAgICBRTiAzLlU4Ci1xU3JjRTg5ICAgICAgICAgUU4gNC5VOAotcVNyY0YxMDExICAgICAgIFFOIDUuVTgKLXFTcmNHMTIxMyAgICAgICBRTiA2LlU4Ci1xU3JjSDE0MTUgICAgICAgUU4gNy5VOAotcVNyY0kxNjE3ICAgICAgIFFOIDguVTgKLQotZFNyY0EwICAgICAgICAgIEROIDAuVTgKLWRTcmNCMiAgICAgICAgICBETiAyLlU4Ci1kU3JjQzQgICAgICAgICAgRE4gNC5VOAotZFNyY0Q2ICAgICAgICAgIEROIDYuVTgKLWRTcmNFOCAgICAgICAgICBETiA4LlU4Ci1kU3JjRjEwICAgICAgICAgRE4gMTAuVTgKLWRTcmNHMTIgICAgICAgICBETiAxMi5VOAotZFNyY0gxNCAgICAgICAgIEROIDE0LlU4Ci1kU3JjSTE2ICAgICAgICAgRE4gMTYuVTgKLQotZFNyY0ExICAgICAgICAgIEROIDEuVTgKLWRTcmNCMyAgICAgICAgICBETiAzLlU4Ci1kU3JjQzUgICAgICAgICAgRE4gNS5VOAotZFNyY0Q3ICAgICAgICAgIEROIDcuVTgKLWRTcmNFOSAgICAgICAgICBETiA5LlU4Ci1kU3JjRjExICAgICAgICAgRE4gMTEuVTgKLWRTcmNHMTMgICAgICAgICBETiAxMy5VOAotZFNyY0gxNSAgICAgICAgIEROIDE1LlU4Ci1kU3JjSTE3ICAgICAgICAgRE4gMTcuVTgKLQotcVRlbXBQMDEgICAgICAgIFFOIDkuUzE2Ci1xVGVtcFEwMSAgICAgICAgUU4gMTAuUzE2Ci1xVGVtcFIwMSAgICAgICAgUU4gMTEuUzE2Ci1xVGVtcFMwMSAgICAgICAgUU4gMTIuUzE2Ci0KLXFUZW1wUDIzICAgICAgICBRTiAwLlMxNgotcVRlbXBRMjMgICAgICAgIFFOIDEuUzE2Ci1xVGVtcFIyMyAgICAgICAgUU4gMi5TMTYKLXFUZW1wUzIzICAgICAgICBRTiAzLlMxNgotCi1kVGVtcFAwICAgICAgICAgRE4gMTguUzE2Ci1kVGVtcFAxICAgICAgICAgRE4gMTkuUzE2Ci1kVGVtcFAyICAgICAgICAgRE4gMC5TMTYKLQotZFRlbXBRMCAgICAgICAgIEROIDIwLlMxNgotZFRlbXBRMSAgICAgICAgIEROIDIxLlMxNgotZFRlbXBRMiAgICAgICAgIEROIDIuUzE2Ci0KLWRUZW1wUjAgICAgICAgICBETiAyMi5TMTYKLWRUZW1wUjEgICAgICAgICBETiAyMy5TMTYKLWRUZW1wUjIgICAgICAgICBETiA0LlMxNgotCi1kVGVtcFMwICAgICAgICAgRE4gMjQuUzE2Ci1kVGVtcFMxICAgICAgICAgRE4gMjUuUzE2Ci1kVGVtcFMyICAgICAgICAgRE4gNi5TMTYKLSAKLWRUZW1wQjAgICAgICAgICBETiAyNi5TMTYKLWRUZW1wQzAgICAgICAgICBETiAyNy5TMTYKLWRUZW1wRDAgICAgICAgICBETiAyOC5TMTYKLWRUZW1wRjAgICAgICAgICBETiAyOS5TMTYKLQotZFRlbXBBY2MwICAgICAgIEROIDAuVTE2Ci1kVGVtcEFjYzEgICAgICAgRE4gMi5VMTYKLWRUZW1wQWNjMiAgICAgICBETiA0LlUxNgotZFRlbXBBY2MzICAgICAgIEROIDYuVTE2Ci0KLWRBY2MwICAgICAgICAgICBETiAwLlU4Ci1kQWNjMSAgICAgICAgICAgRE4gMi5VOAotZEFjYzIgICAgICAgICAgIEROIDQuVTgKLWRBY2MzICAgICAgICAgICBETiA2LlU4Ci0KLXFBY2MwICAgICAgICAgICBRTiAwLlMzMgotcUFjYzEgICAgICAgICAgIFFOIDEuUzMyCi1xQWNjMiAgICAgICAgICAgUU4gMi5TMzIKLXFBY2MzICAgICAgICAgICBRTiAzLlMzMgotCi1xVEFjYzAgICAgICAgICAgUU4gMC5VMTYKLXFUQWNjMSAgICAgICAgICBRTiAxLlUxNgotcVRBY2MyICAgICAgICAgIFFOIDIuVTE2Ci1xVEFjYzMgICAgICAgICAgUU4gMy5VMTYgICAgICAgICAgICAgICAgCi0KLXFUbXAgICAgICAgICAgICBRTiA0LlMxNgotZFRtcCAgICAgICAgICAgIEROIDguUzE2Ci0KLSAgICAgICAgVkxEMSAgICAgICAgcVNyY0EwMSwgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgICA7Ly8gW2EwIGExIGEyIGEzIC4uIGExNV0gICAKLSAgICAgICAgQUREICAgICAgICAgcjEyLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzIKLSAgICAgICAgVk1PViAgICAgICAgZFRDb2VmZjUsICM1Ci0gICAgICAgIFZNT1YgICAgICAgIGRUQ29lZmYyMCwgIzIwCi0gICAgICAgIFZMRDEgICAgICAgIHFTcmNGMTAxMSwgW3IxMl0sIHNyY1N0ZXAKLSAgICAgICAgVkxEMSAgICAgICAgcVNyY0IyMywgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgICA7Ly8gW2IwIGIxIGIyIGIzIC4uIGIxNV0KLSAgICAgICAgCi0gICAgICAgIFZMRDEgICAgICAgIHFTcmNHMTIxMywgW3IxMl0sIHNyY1N0ZXAKLSAgICAgICAgVkFEREwgICAgICAgcVRlbXBQMDEsIGRTcmNBMCwgZFNyY0YxMCAgICAgICAgICAgCi0gICAgICAgIFZMRDEgICAgICAgIHFTcmNDNDUsIFtwU3JjXSwgc3JjU3RlcCAgICAgICAgICAgICAgICAgOy8vIFtjMCBjMSBjMiBjMyAuLiBjMTVdCi0gICAgICAgIFZBRERMICAgICAgIHFUZW1wUDIzLCBkU3JjQTEsIGRTcmNGMTEgICAKLSAgICAgICAgVkxEMSAgICAgICAgcVNyY0Q2NywgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIFZBRERMICAgICAgIHFUZW1wUTAxLCBkU3JjQjIsIGRTcmNHMTIgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFZMRDEgICAgICAgIHFTcmNFODksIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICAKLSAgICAgICAgOy8vdDAKLSAgICAgICAgVk1MQUwgICAgICAgcVRlbXBQMDEsIGRTcmNDNCwgZFRDb2VmZjIwCi0gICAgICAgIAotICAgICAgICBWTEQxICAgICAgICBxU3JjSDE0MTUsIFtyMTJdLCBzcmNTdGVwCi0KLSAgICAgICAgVk1MQUwgICAgICAgcVRlbXBQMjMsIGRTcmNDNSwgZFRDb2VmZjIwCi0gICAgICAgIAotICAgICAgICBWTEQxICAgICAgICBxU3JjSTE2MTcsIFtyMTJdLCBzcmNTdGVwICAgICAgICAgICAgICAgICA7Ly8gW2kwIGkxIGkyIGkzIC4uIF0KLSAgICAgICAgCi0gICAgICAgIFZNTEFMICAgICAgIHFUZW1wUDAxLCBkU3JjRDYsIGRUQ29lZmYyMAotICAgICAgICBWTUxBTCAgICAgICBxVGVtcFEwMSwgZFNyY0Q2LCBkVENvZWZmMjAKLSAgICAgICAgVk1MU0wgICAgICAgcVRlbXBQMjMsIGRTcmNCMywgZFRDb2VmZjUKLSAgICAgICAgCi0gICAgICAgIFZBRERMICAgICAgIHFUZW1wUjAxLCBkU3JjQzQsIGRTcmNIMTQgICAKLSAgICAgICAgCi0gICAgICAgIFZNTFNMICAgICAgIHFUZW1wUDAxLCBkU3JjQjIsIGRUQ29lZmY1Ci0KLSAgICAgICAgVkFEREwgICAgICAgcVRlbXBRMjMsIGRTcmNCMywgZFNyY0cxMyAgIAotCi0gICAgICAgIFZNTEFMICAgICAgIHFUZW1wUDIzLCBkU3JjRDcsIGRUQ29lZmYyMAotICAgICAgICBWTUxBTCAgICAgICBxVGVtcFEwMSwgZFNyY0U4LCBkVENvZWZmMjAKLQotICAgICAgICBWTUxTTCAgICAgICBxVGVtcFAwMSwgZFNyY0U4LCBkVENvZWZmNQotICAgICAgICBWTUxBTCAgICAgICBxVGVtcFEyMywgZFNyY0Q3LCBkVENvZWZmMjAKLQotICAgICAgICBWTUxTTCAgICAgICBxVGVtcFAyMywgZFNyY0U5LCBkVENvZWZmNQotCi0gICAgICAgIDsvL3QxCi0KLSAgICAgICAgVk1MQUwgICAgICAgcVRlbXBSMDEsIGRTcmNFOCwgZFRDb2VmZjIwCi0gICAgICAgIFZNTFNMICAgICAgIHFUZW1wUTAxLCBkU3JjQzQsIGRUQ29lZmY1Ci0gICAgICAgIFZNTFNMICAgICAgIHFUZW1wUTIzLCBkU3JjQzUsIGRUQ29lZmY1Ci0gICAgICAgIFZBRERMICAgICAgIHFUZW1wUjIzLCBkU3JjQzUsIGRTcmNIMTUgICAKLQotICAgICAgICBWTUxBTCAgICAgICBxVGVtcFIwMSwgZFNyY0YxMCwgZFRDb2VmZjIwCi0gICAgICAgIFZNTFNMICAgICAgIHFUZW1wUTAxLCBkU3JjRjEwLCBkVENvZWZmNQotICAgICAgICBWTUxBTCAgICAgICBxVGVtcFEyMywgZFNyY0U5LCBkVENvZWZmMjAKLSAgICAgICAgVk1MQUwgICAgICAgcVRlbXBSMjMsIGRTcmNFOSwgZFRDb2VmZjIwCi0gICAgICAgIFZBRERMICAgICAgIHFUZW1wUzAxLCBkU3JjRDYsIGRTcmNJMTYgICAKLQotCi0gICAgICAgIFZNTFNMICAgICAgIHFUZW1wUjAxLCBkU3JjRDYsIGRUQ29lZmY1Ci0gICAgICAgIFZNTFNMICAgICAgIHFUZW1wUTIzLCBkU3JjRjExLCBkVENvZWZmNQotICAgICAgICBWTUxTTCAgICAgICBxVGVtcFIyMywgZFNyY0Q3LCBkVENvZWZmNQotCi0gICAgICAgIDsvL3QyCi0gICAgICAgIFZBRERMICAgICAgIHFUZW1wUzIzLCBkU3JjRDcsIGRTcmNJMTcgICAKLSAgICAgICAgVk1MQUwgICAgICAgcVRlbXBTMDEsIGRTcmNGMTAsIGRUQ29lZmYyMAotICAgICAgICBWTUxTTCAgICAgICBxVGVtcFIwMSwgZFNyY0cxMiwgZFRDb2VmZjUKLSAgICAgICAgVk1MU0wgICAgICAgcVRlbXBSMjMsIGRTcmNHMTMsIGRUQ29lZmY1Ci0KLSAgICAgICAgVk1MQUwgICAgICAgcVRlbXBTMjMsIGRTcmNGMTEsIGRUQ29lZmYyMAotICAgICAgICBWTUxBTCAgICAgICBxVGVtcFMwMSwgZFNyY0cxMiwgZFRDb2VmZjIwCi0gICAgICAgIFZFWFQgICAgICAgIGRUZW1wQjAsIGRUZW1wUDAsIGRUZW1wUDEsICMxCi0gICAgICAgIFZNTEFMICAgICAgIHFUZW1wUjIzLCBkU3JjRjExLCBkVENvZWZmMjAKLQotCi0gICAgICAgIDsvL3QzCi0gICAgICAgIFZNTEFMICAgICAgIHFUZW1wUzIzLCBkU3JjRzEzLCBkVENvZWZmMjAKLSAgICAgICAgVk1MU0wgICAgICAgcVRlbXBTMDEsIGRTcmNFOCwgZFRDb2VmZjUKLSAgICAgICAgVkVYVCAgICAgICAgZFRlbXBDMCwgZFRlbXBQMCwgZFRlbXBQMSwgIzIKLSAgICAgICAgVk1PViAgICAgICAgZENvZWZmMjAsICMyMAotICAgICAgICBWTUxTTCAgICAgICBxVGVtcFMyMywgZFNyY0U5LCBkVENvZWZmNQotICAgICAgICBWTUxTTCAgICAgICBxVGVtcFMwMSwgZFNyY0gxNCwgZFRDb2VmZjUKLSAgICAgICAgVkVYVCAgICAgICAgZFRlbXBGMCwgZFRlbXBQMSwgZFRlbXBQMiwgIzEKLSAgICAgICAgVkVYVCAgICAgICAgZFRlbXBEMCwgZFRlbXBQMCwgZFRlbXBQMSwgIzMKLSAgICAgICAgVk1MU0wgICAgICAgcVRlbXBTMjMsIGRTcmNIMTUsIGRUQ29lZmY1Ci0gICAgICAgIAotICAgICAgICBWQURETCAgICAgICBxQWNjMCwgZFRlbXBQMCwgZFRlbXBGMAotICAgICAgICBWQUREICAgICAgICBkVGVtcEMwLCBkVGVtcEMwLCBkVGVtcEQwCi0gICAgICAgIDsvL2ggCi0gICAgICAgIFZNT1YgICAgICAgIGRDb2VmZjUsICM1Ci0gICAgICAgIAotICAgICAgICA7Ly8gcmVzMAotICAgICAgICBWQUREICAgICAgICBkVGVtcEIwLCBkVGVtcEIwLCBkVGVtcFAxCi0gICAgICAgIFZNTEFMICAgICAgIHFBY2MwLCBkVGVtcEMwLCBkQ29lZmYyMAotICAgICAgICBWRVhUICAgICAgICBkVGVtcEMwLCBkVGVtcFEwLCBkVGVtcFExLCAjMgotICAgICAgICBWRVhUICAgICAgICBkVGVtcEQwLCBkVGVtcFEwLCBkVGVtcFExLCAjMwotICAgICAgICBWRVhUICAgICAgICBkVGVtcEYwLCBkVGVtcFExLCBkVGVtcFEyLCAjMQotICAgICAgICBWTUxTTCAgICAgICBxQWNjMCwgZFRlbXBCMCwgZENvZWZmNQotCi0gICAgICAgIDsvLyByZXMxCi0gICAgICAgIFZFWFQgICAgICAgIGRUZW1wQjAsIGRUZW1wUTAsIGRUZW1wUTEsICMxCi0gICAgICAgIFZBRERMICAgICAgIHFBY2MxLCBkVGVtcFEwLCBkVGVtcEYwCi0gICAgICAgIFZBREQgICAgICAgIGRUZW1wQzAsIGRUZW1wQzAsIGRUZW1wRDAKLSAgICAgICAgVkFERCAgICAgICAgZFRlbXBCMCwgZFRlbXBCMCwgZFRlbXBRMQotICAgICAgICBWRVhUICAgICAgICBkVGVtcEQwLCBkVGVtcFIwLCBkVGVtcFIxLCAjMwotICAgICAgICBWTUxBTCAgICAgICBxQWNjMSwgZFRlbXBDMCwgZENvZWZmMjAKLSAgICAgICAgVkVYVCAgICAgICAgZFRlbXBGMCwgZFRlbXBSMSwgZFRlbXBSMiwgIzEKLSAgICAgICAgVkVYVCAgICAgICAgZFRlbXBDMCwgZFRlbXBSMCwgZFRlbXBSMSwgIzIKLSAgICAgICAgVkVYVCAgICAgICAgZFRtcCwgZFRlbXBSMCwgZFRlbXBSMSwgIzEKLSAgICAgICAgVkFEREwgICAgICAgcUFjYzIsIGRUZW1wUjAsIGRUZW1wRjAKLSAgICAgICAgVk1MU0wgICAgICAgcUFjYzEsIGRUZW1wQjAsIGRDb2VmZjUKLTsgICAgICAgIFZFWFQgICAgICAgIGRUZW1wQjAsIGRUZW1wUjAsIGRUZW1wUjEsICMxCi0gICAgICAgIFZBREQgICAgICAgIGRUZW1wQzAsIGRUZW1wQzAsIGRUZW1wRDAKLSAgICAgICAgCi0gICAgICAgIDsvLyByZXMyCi0gICAgICAgIFZBREQgICAgICAgIGRUZW1wQjAsIGRUbXAsIGRUZW1wUjEKLSAgICAgICAgVkVYVCAgICAgICAgZFRlbXBEMCwgZFRlbXBTMCwgZFRlbXBTMSwgIzMKLSAgICAgICAgVk1MQUwgICAgICAgcUFjYzIsIGRUZW1wQzAsIGRDb2VmZjIwCi07ICAgICAgICBWQUREICAgICAgICBkVGVtcEIwLCBkVGVtcEIwLCBkVGVtcFIxCi0gICAgICAgIAotICAgICAgICA7Ly8gcmVzMwotICAgICAgICBWRVhUICAgICAgICBkVGVtcEMwLCBkVGVtcFMwLCBkVGVtcFMxLCAjMgotICAgICAgICBWRVhUICAgICAgICBkVGVtcEYwLCBkVGVtcFMxLCBkVGVtcFMyLCAjMQotICAgICAgICBWQUREICAgICAgICBkVGVtcEMwLCBkVGVtcEMwLCBkVGVtcEQwCi0gICAgICAgIFZFWFQgICAgICAgIGRUbXAsIGRUZW1wUzAsIGRUZW1wUzEsICMxCi0gICAgICAgIFZBRERMICAgICAgIHFBY2MzLCBkVGVtcFMwLCBkVGVtcEYwCi0gICAgICAgIFZNTFNMICAgICAgIHFBY2MyLCBkVGVtcEIwLCBkQ29lZmY1Ci0gICAgICAgIFZNTEFMICAgICAgIHFBY2MzLCBkVGVtcEMwLCBkQ29lZmYyMAotICAgICAgICBWQUREICAgICAgICBkVG1wLCBkVG1wLCBkVGVtcFMxCi0gICAgICAgIFZNTFNMICAgICAgIHFBY2MzLCBkVG1wLCBkQ29lZmY1Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIFZRUlNIUlVOICAgIGRUZW1wQWNjMCwgcUFjYzAsICMxMAotICAgICAgICBWUVJTSFJVTiAgICBkVGVtcEFjYzEsIHFBY2MxLCAjMTAKLSAgICAgICAgVlFSU0hSVU4gICAgZFRlbXBBY2MyLCBxQWNjMiwgIzEwCi0gICAgICAgIFZRUlNIUlVOICAgIGRUZW1wQWNjMywgcUFjYzMsICMxMAotCi0gICAgICAgIFZRTU9WTiAgICAgIGRBY2MwLCBxVEFjYzAKLSAgICAgICAgVlFNT1ZOICAgICAgZEFjYzEsIHFUQWNjMQotICAgICAgICBWUU1PVk4gICAgICBkQWNjMiwgcVRBY2MyCi0gICAgICAgIFZRTU9WTiAgICAgIGRBY2MzLCBxVEFjYzMKLSAgICAgICAgCi0gICAgICAgIE1fRU5ECi0gICAgCi0gICAgRU5ESUYKLSAgICAKLSAgICAKLSAgICAKLQotICAgIAotICAgIEVORAotICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWExYzM0NS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MucworKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmVfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLQotICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4Ci0gICAgICAgIAotICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKLQotREVCVUdfT04gICAgU0VUTCB7RkFMU0V9Ci0KLSAgICBJRiBDb3J0ZXhBOAotICAgICAgICAKLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZSwgcjExCi0KLTsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycwotcFNyYyAgICAgICAgICAgIFJOIDAKLXNyY1N0ZXAgICAgICAgICBSTiAxCi1wRHN0ICAgICAgICAgICAgUk4gMgotZHN0U3RlcCAgICAgICAgIFJOIDMKLQotOy8vIERlY2xhcmUgTmVvbiByZWdpc3RlcnMKLWRDb2VmZjUgICAgICAgICBETiAzMC5TMTYKLWRDb2VmZjIwICAgICAgICBETiAzMS5TMTYKLQotcVNyY0EwMSAgICAgICAgIFFOIDExLlU4Ci1xU3JjQjAxICAgICAgICAgUU4gMTIuVTgKLXFTcmNDMDEgICAgICAgICBRTiAxMy5VOAotcVNyY0QwMSAgICAgICAgIFFOIDE0LlU4Ci0KLWRTcmNBMCAgICAgICAgICBETiAyMi5VOAotZFNyY0ExICAgICAgICAgIEROIDIzLlU4Ci1kU3JjQjAgICAgICAgICAgRE4gMjQuVTgKLWRTcmNCMSAgICAgICAgICBETiAyNS5VOAotZFNyY0MwICAgICAgICAgIEROIDI2LlU4Ci1kU3JjQzEgICAgICAgICAgRE4gMjcuVTgKLWRTcmNEMCAgICAgICAgICBETiAyOC5VOAotZFNyY0QxICAgICAgICAgIEROIDI5LlU4Ci0KLWRTcmNiICAgICAgICAgICBETiAxMi5VOAotZFNyY2UgICAgICAgICAgIEROIDEzLlU4Ci1kU3JjZiAgICAgICAgICAgRE4gMTAuVTgKLQotZFNyYzBjICAgICAgICAgIEROIDE0LlU4Ci1kU3JjMWMgICAgICAgICAgRE4gMTYuVTgKLWRTcmMyYyAgICAgICAgICBETiAxOC5VOAotZFNyYzNjICAgICAgICAgIEROIDIwLlU4Ci0gICAgICAgICAgICAgICAgICAgCi1kU3JjMGQgICAgICAgICAgRE4gMTUuVTgKLWRTcmMxZCAgICAgICAgICBETiAxNy5VOAotZFNyYzJkICAgICAgICAgIEROIDE5LlU4Ci1kU3JjM2QgICAgICAgICAgRE4gMjEuVTgKLQotcVRlbXAwMSAgICAgICAgIFFOIDQuUzE2Ci1xVGVtcDIzICAgICAgICAgUU4gNi5TMTYKLWRUZW1wMCAgICAgICAgICBETiA4LlMxNgotZFRlbXAyICAgICAgICAgIEROIDEyLlMxNgotCi1xUmVzMDEgICAgICAgICAgUU4gMTEuUzE2Ci1xUmVzMjMgICAgICAgICAgUU4gMTIuUzE2Ci1xUmVzNDUgICAgICAgICAgUU4gMTMuUzE2Ci1xUmVzNjcgICAgICAgICAgUU4gMTQuUzE2Ci0KLWRSZXMwICAgICAgICAgICBETiAyMi5TMTYKLWRSZXMyICAgICAgICAgICBETiAyNC5TMTYKLWRSZXM0ICAgICAgICAgICBETiAyNi5TMTYKLWRSZXM2ICAgICAgICAgICBETiAyOC5TMTYKLQotZEFjYzAgICAgICAgICAgIEROIDIyLlU4Ci1kQWNjMiAgICAgICAgICAgRE4gMjQuVTgKLWRBY2M0ICAgICAgICAgICBETiAyNi5VOAotZEFjYzYgICAgICAgICAgIEROIDI4LlU4Ci0KLWRSZXN1bHQwICAgICAgICBETiAyMi5VMzIKLWRSZXN1bHQyICAgICAgICBETiAyNC5VMzIKLWRSZXN1bHQ0ICAgICAgICBETiAyNi5VMzIKLWRSZXN1bHQ2ICAgICAgICBETiAyOC5VMzIKLQotICAgICAgICBWTEQxICAgICAgICBxU3JjQTAxLCBbcFNyY10sIHNyY1N0ZXAgICAgOy8vIExvYWQgQSByZWdpc3RlciBbYTAgYTEgYTIgYTMgLi5dCi0gICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2YsIGRTcmNBMCwgZFNyY0ExLCAjNSAgIDsvLyBbZjAgZjEgZjIgZjMgLi5dCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNiLCBkU3JjQTAsIGRTcmNBMSwgIzEgICA7Ly8gW2IwIGIxIGIyIGIzIC4uXQotOyAgICAgICAgVkxEMSAgICAgICAgcVNyY0IwMSwgW3BTcmNdLCBzcmNTdGVwICAgIDsvLyBMb2FkIEIgcmVnaXN0ZXIgW2EwIGExIGEyIGEzIC4uXQotICAgICAgICBWRVhUICAgICAgICBkU3JjMGMsIGRTcmNBMCwgZFNyY0ExLCAjMgotICAgICAgICBWRVhUICAgICAgICBkU3JjMGQsIGRTcmNBMCwgZFNyY0ExLCAjMwotICAgICAgICBWRVhUICAgICAgICBkU3JjZSwgZFNyY0EwLCBkU3JjQTEsICM0Ci0gICAgICAgIFZBRERMICAgICAgIHFSZXMwMSwgZFNyY0EwLCBkU3JjZiAgICAgICA7Ly8gQWNjPWErZgotICAgICAgICBWQURETCAgICAgICBxVGVtcDAxLCBkU3JjMGMsIGRTcmMwZCAgICAgOy8vIGMrZCAgICAgICAgICAgICAgICAKLSAgICAgICAgVkFEREwgICAgICAgcVRlbXAyMywgZFNyY2IsIGRTcmNlICAgICAgIDsvLyBiK2UKLSAgICAgICAgCi0gICAgICAgIFZMRDEgICAgICAgIHFTcmNCMDEsIFtwU3JjXSwgc3JjU3RlcCAgICA7Ly8gTG9hZCBCIHJlZ2lzdGVyIFthMCBhMSBhMiBhMyAuLl0KLTsgICAgICAgIFZMRDEgICAgICAgIHFTcmNDMDEsIFtwU3JjXSwgc3JjU3RlcCAgICA7Ly8gTG9hZCBDIHJlZ2lzdGVyIFthMCBhMSBhMiBhMyAuLl0gICAgICAgICAgIAotICAgICAgICBWTUxBICAgICAgICBkUmVzMCwgZFRlbXAwLCBkQ29lZmYyMCAgICAgOy8vIEFjYyArPSAyMCooYytkKQotOyAgICAgICAgVk1MUyAgICAgICAgZFJlczAsIGRUZW1wMiwgZENvZWZmNSAgICAgIDsvLyBBY2MgLT0gNSooYitlKQotICAgICAgICBWTVVMICAgICAgICBkVGVtcDAsIGRUZW1wMiwgZENvZWZmNSA7Ly8gVGVSaQotICAgICAgICAKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2YsIGRTcmNCMCwgZFNyY0IxLCAjNSAgIDsvLyBbZjAgZjEgZjIgZjMgLi5dCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNiLCBkU3JjQjAsIGRTcmNCMSwgIzEgICA7Ly8gW2IwIGIxIGIyIGIzIC4uXQotICAgICAgICBWRVhUICAgICAgICBkU3JjMWMsIGRTcmNCMCwgZFNyY0IxLCAjMgotICAgICAgICBWRVhUICAgICAgICBkU3JjMWQsIGRTcmNCMCwgZFNyY0IxLCAjMwotICAgICAgICBWRVhUICAgICAgICBkU3JjZSwgZFNyY0IwLCBkU3JjQjEsICM0Ci0gICAgICAgIFZBRERMICAgICAgIHFSZXMyMywgZFNyY0IwLCBkU3JjZiAgICAgICA7Ly8gQWNjPWErZgotCi0gICAgICAgIFZTVUIgICAgICAgIGRSZXMwLCBkUmVzMCwgZFRlbXAwICAgIDsvLyBUZVJpCi0KLSAgICAgICAgVkFEREwgICAgICAgcVRlbXAwMSwgZFNyYzFjLCBkU3JjMWQgICAgIDsvLyBjK2QgICAgICAgICAgICAgICAgCi0gICAgICAgIFZBRERMICAgICAgIHFUZW1wMjMsIGRTcmNiLCBkU3JjZSAgICAgICA7Ly8gYitlCi0gICAgICAgIAotICAgICAgICBWTEQxICAgICAgICBxU3JjQzAxLCBbcFNyY10sIHNyY1N0ZXAgICAgOy8vIExvYWQgQyByZWdpc3RlciBbYTAgYTEgYTIgYTMgLi5dICAgICAgICAgICAKLTsgICAgICAgIFZMRDEgICAgICAgIHFTcmNEMDEsIFtwU3JjXSwgc3JjU3RlcCAgICA7Ly8gTG9hZCBEIHJlZ2lzdGVyIFthMCBhMSBhMiBhMyAuLl0gIAotICAgICAgICAKLSAgICAgICAgVk1MQSAgICAgICAgZFJlczIsIGRUZW1wMCwgZENvZWZmMjAgICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKLTsgICAgICAgIFZNTFMgICAgICAgIGRSZXMyLCBkVGVtcDIsIGRDb2VmZjUgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKLSAgICAgICAgVk1VTCAgICAgICAgZFRlbXAwLCBkVGVtcDIsIGRDb2VmZjUgOy8vIFRlUmkKLQotICAgICAgICBWRVhUICAgICAgICBkU3JjZiwgZFNyY0MwLCBkU3JjQzEsICM1ICAgOy8vIFtmMCBmMSBmMiBmMyAuLl0KLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2IsIGRTcmNDMCwgZFNyY0MxLCAjMSAgIDsvLyBbYjAgYjEgYjIgYjMgLi5dCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmMyYywgZFNyY0MwLCBkU3JjQzEsICMyCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmMyZCwgZFNyY0MwLCBkU3JjQzEsICMzCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNlLCBkU3JjQzAsIGRTcmNDMSwgIzQKLSAgICAgICAgVkFEREwgICAgICAgcVJlczQ1LCBkU3JjQzAsIGRTcmNmICAgICAgIDsvLyBBY2M9YStmCi0gICAgICAgIAotICAgICAgICBWU1VCICAgICAgICBkUmVzMiwgZFJlczIsIGRUZW1wMCAgOy8vIFRlUmkKLSAgICAgICAgCi0gICAgICAgIFZBRERMICAgICAgIHFUZW1wMDEsIGRTcmMyYywgZFNyYzJkICAgICA7Ly8gYytkICAgICAgICAgICAgICAgIAotICAgICAgICBWQURETCAgICAgICBxVGVtcDIzLCBkU3JjYiwgZFNyY2UgICAgICAgOy8vIGIrZQotCi0gICAgICAgIFZMRDEgICAgICAgIHFTcmNEMDEsIFtwU3JjXSwgc3JjU3RlcCAgICA7Ly8gTG9hZCBEIHJlZ2lzdGVyIFthMCBhMSBhMiBhMyAuLl0gIAotCi0gICAgICAgIFZNTEEgICAgICAgIGRSZXM0LCBkVGVtcDAsIGRDb2VmZjIwICAgICA7Ly8gQWNjICs9IDIwKihjK2QpCi07ICAgICAgICBWTUxTICAgICAgICBkUmVzNCwgZFRlbXAyLCBkQ29lZmY1ICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCi0gICAgICAgIFZNVUwgICAgICAgIGRUZW1wMCwgZFRlbXAyLCBkQ29lZmY1ICAgICAgOy8vIEFjYyAtPSA1KihiK2UpIFRlUmkKLSAgICAgICAgCi0KLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2YsIGRTcmNEMCwgZFNyY0QxLCAjNSAgIDsvLyBbZjAgZjEgZjIgZjMgLi5dCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNiLCBkU3JjRDAsIGRTcmNEMSwgIzEgICA7Ly8gW2IwIGIxIGIyIGIzIC4uXQotICAgICAgICBWRVhUICAgICAgICBkU3JjM2MsIGRTcmNEMCwgZFNyY0QxLCAjMgotICAgICAgICBWRVhUICAgICAgICBkU3JjM2QsIGRTcmNEMCwgZFNyY0QxLCAjMwotICAgICAgICBWRVhUICAgICAgICBkU3JjZSwgZFNyY0QwLCBkU3JjRDEsICM0Ci0gICAgICAgIFZBRERMICAgICAgIHFSZXM2NywgZFNyY0QwLCBkU3JjZiAgICAgICA7Ly8gQWNjPWErZgotCi0gICAgICAgIFZTVUIgICAgICAgIGRSZXM0LCBkUmVzNCwgZFRlbXAwIDsvLyBUZVJpCi0KLSAgICAgICAgVkFEREwgICAgICAgcVRlbXAwMSwgZFNyYzNjLCBkU3JjM2QgICAgIDsvLyBjK2QgICAgICAgICAgICAgICAgCi0gICAgICAgIFZBRERMICAgICAgIHFUZW1wMjMsIGRTcmNiLCBkU3JjZSAgICAgICA7Ly8gYitlCi0gICAgICAgIFZNTEEgICAgICAgIGRSZXM2LCBkVGVtcDAsIGRDb2VmZjIwICAgICA7Ly8gQWNjICs9IDIwKihjK2QpCi0gICAgICAgIFZNTFMgICAgICAgIGRSZXM2LCBkVGVtcDIsIGRDb2VmZjUgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKLQotICAgICAgICBWUVJTSFJVTiAgICBkQWNjMCwgcVJlczAxLCAjNSAgICAgICAgICAgOy8vIEFjYyA9IFNhdCAoKEFjYyArIDE2KSAvIDMyKQotICAgICAgICBWUVJTSFJVTiAgICBkQWNjMiwgcVJlczIzLCAjNSAgICAgICAgICAgOy8vIEFjYyA9IFNhdCAoKEFjYyArIDE2KSAvIDMyKQotICAgICAgICBWUVJTSFJVTiAgICBkQWNjNCwgcVJlczQ1LCAjNSAgICAgICAgICAgOy8vIEFjYyA9IFNhdCAoKEFjYyArIDE2KSAvIDMyKQotICAgICAgICBWUVJTSFJVTiAgICBkQWNjNiwgcVJlczY3LCAjNSAgICAgICAgICAgOy8vIEFjYyA9IFNhdCAoKEFjYyArIDE2KSAvIDMyKQotICAgICAgICAKLSAgICAgICAgTV9FTkQKLSAgICAKLSAgICBFTkRJRgotCi0KLSAgICBFTkQKLSAgICAKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQxNGQ0Ny4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlX3MucworKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAKLSAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAotICAgICAgIAotICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKLQotICAgIElGIENvcnRleEE4Ci0gICAgICAgIAotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlLCByMTEKLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi1wU3JjICAgICAgICAgICAgUk4gMAotc3JjU3RlcCAgICAgICAgIFJOIDEKLXBEc3QgICAgICAgICAgICBSTiAyCi1kc3RTdGVwICAgICAgICAgUk4gMwotCi1UZW1wICAgICAgICAgICAgUk4gMTIKLQotOy8vIERlY2xhcmUgTmVvbiByZWdpc3RlcnMKLWRDb2VmZjUgICAgICAgICBETiAzMC5TMTYKLWRDb2VmZjIwICAgICAgICBETiAzMS5TMTYKLQotZFNyYzAgICAgICAgICAgIEROIDcuVTgKLWRTcmMxICAgICAgICAgICBETiA4LlU4Ci1kU3JjMiAgICAgICAgICAgRE4gOS5VOAotZFNyYzMgICAgICAgICAgIEROIDEwLlU4Ci1kU3JjNCAgICAgICAgICAgRE4gMTEuVTgKLWRTcmM1ICAgICAgICAgICBETiAxMi5VOAotZFNyYzYgICAgICAgICAgIEROIDEzLlU4Ci1kU3JjNyAgICAgICAgICAgRE4gMTQuVTgKLWRTcmM4ICAgICAgICAgICBETiAxNS5VOAotCi1xU3VtQkUwMSAgICAgICAgUU4gOC5TMTYKLXFTdW1DRDAxICAgICAgICBRTiA5LlMxNgotZFN1bUJFMCAgICAgICAgIEROIDE2LlMxNgotZFN1bUNEMCAgICAgICAgIEROIDE4LlMxNgotCi1xQWNjMDEgICAgICAgICAgUU4gMC5TMTYKLXFBY2MyMyAgICAgICAgICBRTiAxLlMxNgotcUFjYzQ1ICAgICAgICAgIFFOIDIuUzE2Ci1xQWNjNjcgICAgICAgICAgUU4gMy5TMTYKLQotZFJlczAgICAgICAgICAgIEROIDAuUzE2Ci1kUmVzMSAgICAgICAgICAgRE4gMi5TMTYKLWRSZXMyICAgICAgICAgICBETiA0LlMxNgotZFJlczMgICAgICAgICAgIEROIDYuUzE2Ci0KLWRBY2MwICAgICAgICAgICBETiAwLlU4Ci1kQWNjMSAgICAgICAgICAgRE4gMi5VOAotZEFjYzIgICAgICAgICAgIEROIDQuVTgKLWRBY2MzICAgICAgICAgICBETiA2LlU4ICAgICAgICAKLSAgICAgICAgCi0KLWRUbXAwICAgICAgICAgICBETiAyMC5TMTYKLWRUbXAxICAgICAgICAgICBETiAyMS5TMTYKLWRUbXAyICAgICAgICAgICBETiAyMi5TMTYKLWRUbXAzICAgICAgICAgICBETiAyMy5TMTYKLQotCi0gICAgICAgIFZMRDEgICAgICAgIGRTcmMwLCBbcFNyY10sIHNyY1N0ZXAgICAgIDsvLyBbYTAgYTEgYTIgYTMgLi4gXSAKLSAgICAgICAgQUREICAgICAgICAgVGVtcCwgcFNyYywgc3JjU3RlcCwgTFNMICMyCi0gICAgICAgIFZMRDEgICAgICAgIGRTcmMxLCBbcFNyY10sIHNyY1N0ZXAgICAgIDsvLyBbYjAgYjEgYjIgYjMgLi4gXQotICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCi0gICAgICAgIFZMRDEgICAgICAgIGRTcmM1LCBbVGVtcF0sIHNyY1N0ZXAgICAgICAgIAotICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCi0gICAgICAgIFZMRDEgICAgICAgIGRTcmMyLCBbcFNyY10sIHNyY1N0ZXAgICAgIDsvLyBbYzAgYzEgYzIgYzMgLi4gXQotICAgICAgICBWQURETCAgICAgICBxQWNjMDEsIGRTcmMwLCBkU3JjNSAgICAgICA7Ly8gQWNjID0gYStmCi0gICAgICAgIFZMRDEgICAgICAgIGRTcmMzLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAotICAgICAgICBWTEQxICAgICAgICBkU3JjNiwgW1RlbXBdLCBzcmNTdGVwIDsvLyBUZVJpCi0gICAgICAgIAotICAgICAgICBWTEQxICAgICAgICBkU3JjNCwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIFZMRDEgICAgICAgIGRTcmM3LCBbVGVtcF0sIHNyY1N0ZXAgOy8vIFRlUmkKLSAgICAgICAgVkFEREwgICAgICAgcVN1bUJFMDEsIGRTcmMxLCBkU3JjNCAgICAgOy8vIGIrZQotICAgICAgICBWQURETCAgICAgICBxU3VtQ0QwMSwgZFNyYzIsIGRTcmMzICAgICA7Ly8gYytkICAgICAgICAKLSAgICAgICAgVkxEMSAgICAgICAgZFNyYzgsIFtUZW1wXSwgc3JjU3RlcCA7Ly8gVGVSaQotICAgICAgICBWTUxTICAgICAgICBkUmVzMCwgZFN1bUJFMCwgZENvZWZmNSAgICA7Ly8gQWNjIC09IDIwKihiK2UpICAgICAgICAKLTsgICAgICAgIFZNTEEgICAgICAgIGRSZXMwLCBkU3VtQ0QwLCBkQ29lZmYyMCAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKLSAgICAgICAgVk1VTCAgICAgICAgZFRtcDAsIGRTdW1DRDAsIGRDb2VmZjIwICAgOy8vIEFjYyArPSAyMCooYytkKQotICAgICAgICAKLTsgICAgICAgIFZMRDEgICAgICAgIGRTcmM2LCBbVGVtcF0sIHNyY1N0ZXAKLSAgICAgICAgVkFEREwgICAgICAgcVN1bUJFMDEsIGRTcmMyLCBkU3JjNSAgICAgOy8vIGIrZQotICAgICAgICBWQURETCAgICAgICBxU3VtQ0QwMSwgZFNyYzMsIGRTcmM0ICAgICA7Ly8gYytkCi0gICAgICAgIFZBRERMICAgICAgIHFBY2MyMywgZFNyYzEsIGRTcmM2ICAgICAgIDsvLyBBY2MgPSBhK2YKLSAgICAgICAgVk1MUyAgICAgICAgZFJlczEsIGRTdW1CRTAsIGRDb2VmZjUgICAgOy8vIEFjYyAtPSAyMCooYitlKQotOyAgICAgICAgVk1MQSAgICAgICAgZFJlczEsIGRTdW1DRDAsIGRDb2VmZjIwICAgOy8vIEFjYyArPSAyMCooYytkKQotICAgICAgICBWTVVMICAgICAgICBkVG1wMSwgZFN1bUNEMCwgZENvZWZmMjAgICA7Ly8gQWNjICs9IDIwKihjK2QpCi0KLTsgICAgICAgIFZMRDEgICAgICAgIGRTcmM3LCBbVGVtcF0sIHNyY1N0ZXAKLSAgICAgICAgVkFEREwgICAgICAgcVN1bUJFMDEsIGRTcmMzLCBkU3JjNiAgICAgOy8vIGIrZQotICAgICAgICBWQURETCAgICAgICBxU3VtQ0QwMSwgZFNyYzQsIGRTcmM1ICAgICA7Ly8gYytkCi0gICAgICAgIFZBRERMICAgICAgIHFBY2M0NSwgZFNyYzIsIGRTcmM3ICAgICAgIDsvLyBBY2MgPSBhK2YKLSAgICAgICAgVk1MUyAgICAgICAgZFJlczIsIGRTdW1CRTAsIGRDb2VmZjUgICAgOy8vIEFjYyAtPSAyMCooYitlKSAgICAgICAgCi07ICAgICAgICBWTUxBICAgICAgICBkUmVzMiwgZFN1bUNEMCwgZENvZWZmMjAgICA7Ly8gQWNjICs9IDIwKihjK2QpCi0gICAgICAgIFZNVUwgICAgICAgIGRUbXAyLCBkU3VtQ0QwLCBkQ29lZmYyMCAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKLQotOyAgICAgICAgVkxEMSAgICAgICAgZFNyYzgsIFtUZW1wXSwgc3JjU3RlcCAgICAgOy8vIFtpMCBpMSBpMiBpMyAuLiBdICAgICAgICAKLSAgICAgICAgVkFEREwgICAgICAgcVN1bUJFMDEsIGRTcmM0LCBkU3JjNyAgICAgOy8vIGIrZQotICAgICAgICBWQURETCAgICAgICBxQWNjNjcsIGRTcmMzLCBkU3JjOCAgICAgICA7Ly8gQWNjID0gYStmCi0gICAgICAgIFZBRERMICAgICAgIHFTdW1DRDAxLCBkU3JjNSwgZFNyYzYgICAgIDsvLyBjK2QKLSAgICAgICAgVk1MUyAgICAgICAgZFJlczMsIGRTdW1CRTAsIGRDb2VmZjUgICAgOy8vIEFjYyAtPSAyMCooYitlKSAgICAgICAgCi0gICAgICAgIFZBREQgICAgICAgIGRSZXMwLCBkUmVzMCwgZFRtcDAKLSAgICAgICAgVkFERCAgICAgICAgZFJlczEsIGRSZXMxLCBkVG1wMQotICAgICAgICBWQUREICAgICAgICBkUmVzMiwgZFJlczIsIGRUbXAyCi0gICAgICAgIFZNTEEgICAgICAgIGRSZXMzLCBkU3VtQ0QwLCBkQ29lZmYyMCAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKLTsgICAgICAgIFZNVUwgICAgICAgIGRUbXAzLCBkU3VtQ0QwLCBkQ29lZmYyMCAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKLTsgICAgICAgIFZBREQgICAgICAgIGRSZXMzLCBkUmVzMywgZFRtcDMKLQotICAgICAgICBWUVJTSFJVTiAgICBkQWNjMCwgcUFjYzAxLCAjNSAgICAgICAgCi0gICAgICAgIFZRUlNIUlVOICAgIGRBY2MxLCBxQWNjMjMsICM1ICAgICAgICAKLSAgICAgICAgVlFSU0hSVU4gICAgZEFjYzIsIHFBY2M0NSwgIzUgICAgICAgIAotICAgICAgICBWUVJTSFJVTiAgICBkQWNjMywgcUFjYzY3LCAjNSAgICAgICAgCi0KLSAgICAgICAgTV9FTkQKLSAgICAKLSAgICBFTkRJRgotCi0gICAgCi0gICAgCi0gICAgRU5ECi0gICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmI5NTY1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMzMyICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLSAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAotICAgICAgICAKLQotICAgIElGIENvcnRleEE4Ci0KLSAgICBNX1RBQkxFIGFybVZDTTRQMTBfV2lkdGhCcmFuY2hUYWJsZU1WSXNOb3RaZXJvICAgICAgCi0gICAgCi0gICAgRENEICAgV2lkdGhJczJNVklzTm90WmVybywgV2lkdGhJczJNVklzTm90WmVybwotICAgIERDRCAgIFdpZHRoSXM0TVZJc05vdFplcm8sIFdpZHRoSXM0TVZJc05vdFplcm8KLSAgICBEQ0QgICBXaWR0aElzOE1WSXNOb3RaZXJvCi0gICAgCi0gICAgTV9UQUJMRSBhcm1WQ000UDEwX1dpZHRoQnJhbmNoVGFibGVNVklzWmVybyAgICAgIAotICAgIAotICAgIERDRCAgIFdpZHRoSXMyTVZJc1plcm8sIFdpZHRoSXMyTVZJc1plcm8KLSAgICBEQ0QgICBXaWR0aElzNE1WSXNaZXJvLCBXaWR0aElzNE1WSXNaZXJvCi0gICAgRENEICAgV2lkdGhJczhNVklzWmVybwotICAgIAotICAgIAotOy8vIGlucHV0IHJlZ2lzdGVycwotCi1wU3JjICAgICAgICAgICAgICAgICBSTiAwCi1pU3JjU3RlcCAgICAgICAgICAgICBSTiAxCi1wRHN0ICAgICAgICAgICAgICAgICBSTiAyCi1pRHN0U3RlcCAgICAgICAgICAgICBSTiAzCi1pV2lkdGggICAgICAgICAgICAgICBSTiA0Ci1pSGVpZ2h0ICAgICAgICAgICAgICBSTiA1Ci1keCAgICAgICAgICAgICAgICAgICBSTiA2Ci1keSAgICAgICAgICAgICAgICAgICBSTiA3Ci0KLTsvLyBsb2NhbCB2YXJpYWJsZSByZWdpc3RlcnMKLXBjICAgICAgICAgICAgICAgICAgIFJOIDE1Ci1yZXR1cm4gICAgICAgICAgICAgICBSTiAwCi1FaWdodE1pbnVzZHggICAgICAgICBSTiA4IAotRWlnaHRNaW51c2R5ICAgICAgICAgUk4gOQotCi1BQ29lZmYgICAgICAgICAgICAgICBSTiAxMgotQkNvZWZmICAgICAgICAgICAgICAgUk4gOQotQ0NvZWZmICAgICAgICAgICAgICAgUk4gOAotRENvZWZmICAgICAgICAgICAgICAgUk4gNgotCi1wVGFibGUgICAgICAgICAgICAgICBSTiAxMQotCi1TdGVwMSAgICAgICAgICAgICAgICBSTiAxMAotU3JjU3RlcE1pbnVzMSAgICAgICAgUk4gMTQKLQotZEFDb2VmZiAgICAgICAgICAgICAgRE4gRDEyLlU4Ci1kQkNvZWZmICAgICAgICAgICAgICBETiBEMTMuVTgKLWRDQ29lZmYgICAgICAgICAgICAgIEROIEQxNC5VOAotZERDb2VmZiAgICAgICAgICAgICAgRE4gRDE1LlU4Ci0KLWRSb3cwYSAgICAgICAgICAgICAgIEROIEQwLlU4Ci1kUm93MGIgICAgICAgICAgICAgICBETiBEMS5VOAotZFJvdzFhICAgICAgICAgICAgICAgRE4gRDIuVTgKLWRSb3cxYiAgICAgICAgICAgICAgIEROIEQzLlU4Ci0KLXFSb3cwYSAgICAgICAgICAgICAgIFFOIFEyLlMxNgotcVJvdzBiICAgICAgICAgICAgICAgUU4gUTMuUzE2Ci0KLTsvL2RJbmRleCAgICAgICAgICAgICAgIEROICAgIEQxNi5VOCAgICAgICAgICAgICAgICAgCi1xUm93MWEgICAgICAgICAgICAgICBRTiBRMTEuUzE2Ci1xUm93MWIgICAgICAgICAgICAgICBRTiBRMTIuUzE2Ci0KLWRSb3cyYSAgICAgICAgICAgICAgIEROIEQxNi5VOAotZFJvdzJiICAgICAgICAgICAgICAgRE4gRDE3LlU4Ci1kUm93M2EgICAgICAgICAgICAgICBETiBEMTguVTgKLWRSb3czYiAgICAgICAgICAgICAgIEROIEQxOS5VOAotCi1xT3V0Um93MiAgICAgICAgICAgICBRTiBRMTEuVTE2Ci1xT3V0Um93MyAgICAgICAgICAgICBRTiBRMTIuVTE2Ci1kT3V0Um93MiAgICAgICAgICAgICBETiBEMjAuVTgKLWRPdXRSb3czICAgICAgICAgICAgIEROIEQyMS5VOAotZE91dFJvdzJVNjQgICAgICAgICAgRE4gRDIwLlU2NAotZE91dFJvdzNVNjQgICAgICAgICAgRE4gRDIxLlU2NAotCi1xT3V0Um93MCAgICAgICAgICAgICBRTiBRMi5VMTYKLXFPdXRSb3cxICAgICAgICAgICAgIFFOIFEzLlUxNgotZE91dFJvdzAgICAgICAgICAgICAgRE4gRDguVTgKLWRPdXRSb3cxICAgICAgICAgICAgIEROIEQ5LlU4Ci0KLWRPdXRSb3cwVTY0ICAgICAgICAgIEROIEQ4LlU2NAotZE91dFJvdzFVNjQgICAgICAgICAgRE4gRDkuVTY0Ci0KLWRPdXRSb3cwVTMyICAgICAgICAgIEROIEQ4LlUzMgotZE91dFJvdzFVMzIgICAgICAgICAgRE4gRDkuVTMyCi0KLWRPdXRSb3cwVTE2ICAgICAgICAgIEROIEQ4LlUxNgotZE91dFJvdzFVMTYgICAgICAgICAgRE4gRDkuVTE2Ci0KLQotZE91dDBVNjQgICAgICAgICAgICAgRE4gRDAuVTY0Ci1kT3V0MVU2NCAgICAgICAgICAgICBETiBEMS5VNjQKLQotZE91dDAwVTMyICAgICAgICAgICAgRE4gRDAuVTMyCi1kT3V0MDFVMzIgICAgICAgICAgICBETiBEMS5VMzIKLWRPdXQxMFUzMiAgICAgICAgICAgIEROIEQyLlUzMgotZE91dDExVTMyICAgICAgICAgICAgRE4gRDMuVTMyCi0KLWRPdXQwVTE2ICAgICAgICAgICAgIEROIEQwLlUxNgotZE91dDFVMTYgICAgICAgICAgICAgRE4gRDEuVTE2Ci0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfYXNtIHN0YXJ0cwotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgCi0gICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYSwgcjExLCBkMTUKLSAgICAgICAgCi0gICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCi0gICAgICAgIE1fQVJHICAgV2lkdGgsICAgICAgNAotICAgICAgICBNX0FSRyAgIEhlaWdodCwgICAgIDQKLSAgICAgICAgTV9BUkcgICBEeCwgICAgICAgICA0Ci0gICAgICAgIE1fQVJHICAgRHksICAgICAgICAgNAotICAgICAgICAKLSAgICAgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTQKLSAgICAgICAgCi0gICAgICAgIE1fTERSRCAgIGR4LCBkeSwgRHgKLSAgICAgICAgTV9MRFJEICAgaVdpZHRoLCBpSGVpZ2h0LCBXaWR0aAotICAgICAgICAKLSAgICAgICAgOy8vIEVpZ2h0TWludXNkeCA9IDggLSBkeAotICAgICAgICA7Ly8gRWlnaHRNaW51c2R5ID0gOCAtIGR5Ci0gICAgICAgIAotICAgICAgICA7Ly8gQUNvZWZmID0gRWlnaHRNaW51c2R4ICogRWlnaHRNaW51c2R5Ci0gICAgICAgIDsvLyBCQ29lZmYgPSBkeCAqIEVpZ2h0TWludXNkeQotICAgICAgICA7Ly8gQ0NvZWZmID0gRWlnaHRNaW51c2R4ICogZHkKLSAgICAgICAgOy8vIERDb2VmZiA9IGR4ICogZHkKLSAgICAgICAgCi0gICAgICAgIFJTQiAgICAgRWlnaHRNaW51c2R4LCBkeCwgIzggCi0gICAgICAgIFJTQiAgICAgRWlnaHRNaW51c2R5LCBkeSwgIzgKLSAgICAgICAgQ01OICAgICBkeCxkeQotICAgICAgICBNT1YgICAgIFN0ZXAxLCAjMQotICAgICAgICBMRFJFUSAgIHBUYWJsZSwgPWFybVZDTTRQMTBfV2lkdGhCcmFuY2hUYWJsZU1WSXNaZXJvCi0gICAgICAgIFNVQiAgICAgU3JjU3RlcE1pbnVzMSwgaVNyY1N0ZXAsIFN0ZXAxCi0gICAgICAgIExEUk5FICAgcFRhYmxlLCA9YXJtVkNNNFAxMF9XaWR0aEJyYW5jaFRhYmxlTVZJc05vdFplcm8KLSAgICAgICAgCi0gICAgICAgIFZMRDEgICAgZFJvdzBhLCBbcFNyY10sIFN0ZXAxICAgICAgICAgICAgICAgICAgIDsvLyAwYQotICAgICAgICAKLSAgICAgICAgU01VTEJCICBBQ29lZmYsIEVpZ2h0TWludXNkeCwgRWlnaHRNaW51c2R5Ci0gICAgICAgIFNNVUxCQiAgQkNvZWZmLCBkeCwgRWlnaHRNaW51c2R5Ci0gICAgICAgIFZMRDEgICAgZFJvdzBiLCBbcFNyY10sIFNyY1N0ZXBNaW51czEgICAgICAgICAgIDsvLyAwYgotICAgICAgICBTTVVMQkIgIENDb2VmZiwgRWlnaHRNaW51c2R4LCBkeQotICAgICAgICBTTVVMQkIgIERDb2VmZiwgZHgsIGR5Ci0gICAgICAgIAotICAgICAgICBWRFVQICAgIGRBQ29lZmYsIEFDb2VmZgotICAgICAgICBWRFVQICAgIGRCQ29lZmYsIEJDb2VmZgotICAgICAgICBWRFVQICAgIGRDQ29lZmYsIENDb2VmZgotICAgICAgICBWRFVQICAgIGREQ29lZmYsIERDb2VmZgotICAgICAgICAKLSAgICAgICAgTERSICAgICBwYywgW3BUYWJsZSwgaVdpZHRoLCBMU0wgIzFdICAgICAgOy8vIEJyYW5jaCB0byB0aGUgY2FzZSBiYXNlZCBvbiBpV2lkdGgKLSAgICAgICAgCi07Ly8gUGl4ZWwgbGF5b3V0OgotOy8vCi07Ly8gICB4MDAgeDAxIHgwMgotOy8vICAgeDEwIHgxMSB4MTIKLTsvLyAgIHgyMCB4MjEgeDIyCi0KLTsvLyBJZiBmcmFjdGlvbmwgbXYgaXMgbm90ICgwLCAwKQotV2lkdGhJczhNVklzTm90WmVybwotCi0gICAgICAgICAgICAgICAgVkxEMSAgIGRSb3cxYSwgW3BTcmNdLCBTdGVwMSAgICAgICAgICAgIDsvLyAxYQotICAgICAgICAgICAgICAgIFZNVUxMICBxUm93MGEsIGRSb3cwYSwgZEFDb2VmZgotICAgICAgICAgICAgICAgIFZMRDEgICBkUm93MWIsIFtwU3JjXSwgU3JjU3RlcE1pbnVzMSAgICA7Ly8gMWIKLSAgICAgICAgICAgICAgICBWTVVMTCAgcVJvdzBiLCBkUm93MWEsIGRBQ29lZmYKLSAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzJhLCBbcFNyY10sIFN0ZXAxICAgICAgICAgICAgOy8vIDJhCi0gICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYSwgZFJvdzBiLCBkQkNvZWZmCi0gICAgICAgICAgICAgICAgVkxEMSAgIGRSb3cyYiwgW3BTcmNdLCBTcmNTdGVwTWludXMxICAgIDsvLyAyYgotICAgICAgICAgICAgICAgIFZNVUxMICBxUm93MWEsIGRSb3cyYSwgZEFDb2VmZgotICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGIsIGRSb3cxYiwgZEJDb2VmZgotICAgICAgICAgICAgICAgIFZMRDEgICBkUm93M2EsIFtwU3JjXSwgU3RlcDEgICAgICAgICAgICA7Ly8gM2EKLSAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBhLCBkUm93MWEsIGRDQ29lZmYKLSAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzFhLCBkUm93MmIsIGRCQ29lZmYKLSAgICAgICAgICAgICAgICBWTVVMTCAgcVJvdzFiLCBkUm93M2EsIGRBQ29lZmYKLSAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzNiLCBbcFNyY10sIFNyY1N0ZXBNaW51czEgICAgOy8vIDNiCi0gICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYiwgZFJvdzJhLCBkQ0NvZWZmCi0gICAgICAgICAgICAgICAgVkxEMSAgIGRSb3cwYSwgW3BTcmNdLCBTdGVwMSAgICAgICAgICAgIDsvLyAwYQotICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MWIsIGRSb3czYiwgZEJDb2VmZgotICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MWEsIGRSb3czYSwgZENDb2VmZgotICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGEsIGRSb3cxYiwgZERDb2VmZgotICAgICAgICAgICAgICAgIFZMRDEgICBkUm93MGIsIFtwU3JjXSwgU3JjU3RlcE1pbnVzMSAgICA7Ly8gMGIKLSAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzFiLCBkUm93MGEsIGRDQ29lZmYKLSAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBiLCBkUm93MmIsIGREQ29lZmYKLSAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzFhLCBkUm93M2IsIGREQ29lZmYKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTVUJTICAgaUhlaWdodCwgaUhlaWdodCwgIzQKLSAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzFiLCBkUm93MGIsIGREQ29lZmYKLQotICAgICAgICAgICAgICAgIFZRUlNIUk4gZE91dFJvdzAsIHFPdXRSb3cwLCAjNgotICAgICAgICAgICAgICAgIFZRUlNIUk4gZE91dFJvdzEsIHFPdXRSb3cxLCAjNgotICAgICAgICAgICAgICAgIFZRUlNIUk4gZE91dFJvdzIsIHFPdXRSb3cyLCAjNgotICAgICAgICAgICAgICAgIFZTVDEgICBkT3V0Um93MFU2NCwgW3BEc3RdLCBpRHN0U3RlcAotICAgICAgICAgICAgICAgIFZRUlNIUk4gZE91dFJvdzMsIHFPdXRSb3czLCAjNgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFZTVDEgICBkT3V0Um93MVU2NCwgW3BEc3RdLCBpRHN0U3RlcCAgCi0gICAgICAgICAgICAgICAgVlNUMSAgIGRPdXRSb3cyVTY0LCBbcERzdF0sIGlEc3RTdGVwCi0gICAgICAgICAgICAgICAgVlNUMSAgIGRPdXRSb3czVTY0LCBbcERzdF0sIGlEc3RTdGVwICAKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIEJHVCAgICAgV2lkdGhJczhNVklzTm90WmVybwotICAgICAgICAgICAgICAgIE1PViAgICAgcmV0dXJuLCAgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgICAgICAgICBNX0VYSVQKLQotV2lkdGhJczRNVklzTm90WmVybwotCi0gICAgICAgICAgICAgICAgVkxEMSAgIGRSb3cxYSwgW3BTcmNdLCBTdGVwMQotICAgICAgICAgICAgICAgIFZNVUxMICBxUm93MGEsIGRSb3cwYSwgZEFDb2VmZgotICAgICAgICAgICAgICAgIFZNVUxMICBxUm93MGIsIGRSb3cxYSwgZEFDb2VmZgotICAgICAgICAgICAgICAgIFZMRDEgICBkUm93MWIsIFtwU3JjXSwgU3JjU3RlcE1pbnVzMQotICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGEsIGRSb3cwYiwgZEJDb2VmZgotICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGIsIGRSb3cxYiwgZEJDb2VmZgotICAgICAgICAgICAgICAgIFZMRDEgICBkUm93MGEsIFtwU3JjXSwgU3RlcDEKLSAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBhLCBkUm93MWEsIGRDQ29lZmYKLSAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBiLCBkUm93MGEsIGRDQ29lZmYKLSAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzBiLCBbcFNyY10sIFNyY1N0ZXBNaW51czEKLSAgICAgICAgICAgICAgICBTVUJTICAgaUhlaWdodCwgaUhlaWdodCwgIzIKLSAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBiLCBkUm93MGIsIGREQ29lZmYKLSAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBhLCBkUm93MWIsIGREQ29lZmYKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBWUVJTSFJOIGRPdXRSb3cxLCBxT3V0Um93MSwgIzYKLSAgICAgICAgICAgICAgICBWUVJTSFJOIGRPdXRSb3cwLCBxT3V0Um93MCwgIzYKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBWU1QxICAgZE91dFJvdzBVMzJbMF0sIFtwRHN0XSwgaURzdFN0ZXAKLSAgICAgICAgICAgICAgICBWU1QxICAgZE91dFJvdzFVMzJbMF0sIFtwRHN0XSwgaURzdFN0ZXAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEJHVCAgICAgV2lkdGhJczRNVklzTm90WmVybwotICAgICAgICAgICAgICAgIE1PViAgICAgcmV0dXJuLCAgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgICAgICAgICBNX0VYSVQKLQotV2lkdGhJczJNVklzTm90WmVybwotCi0gICAgICAgICAgICAgICAgVkxEMSAgIGRSb3cxYSwgW3BTcmNdLCBTdGVwMQotICAgICAgICAgICAgICAgIFZNVUxMICBxUm93MGEsIGRSb3cwYSwgZEFDb2VmZgotICAgICAgICAgICAgICAgIFZNVUxMICBxUm93MGIsIGRSb3cxYSwgZEFDb2VmZgotICAgICAgICAgICAgICAgIFZMRDEgICBkUm93MWIsIFtwU3JjXSwgU3JjU3RlcE1pbnVzMQotICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGEsIGRSb3cwYiwgZEJDb2VmZgotICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGIsIGRSb3cxYiwgZEJDb2VmZgotICAgICAgICAgICAgICAgIFZMRDEgICBkUm93MGEsIFtwU3JjXSwgU3RlcDEKLSAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBhLCBkUm93MWEsIGRDQ29lZmYKLSAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBiLCBkUm93MGEsIGRDQ29lZmYKLSAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzBiLCBbcFNyY10sIFNyY1N0ZXBNaW51czEKLSAgICAgICAgICAgICAgICBTVUJTICAgaUhlaWdodCwgaUhlaWdodCwgIzIKLSAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBiLCBkUm93MGIsIGREQ29lZmYKLSAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBhLCBkUm93MWIsIGREQ29lZmYKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBWUVJTSFJOIGRPdXRSb3cxLCBxT3V0Um93MSwgIzYKLSAgICAgICAgICAgICAgICBWUVJTSFJOIGRPdXRSb3cwLCBxT3V0Um93MCwgIzYKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBWU1QxICAgZE91dFJvdzBVMTZbMF0sIFtwRHN0XSwgaURzdFN0ZXAKLSAgICAgICAgICAgICAgICBWU1QxICAgZE91dFJvdzFVMTZbMF0sIFtwRHN0XSwgaURzdFN0ZXAgIAotCi0gICAgICAgICAgICAgICAgQkdUICAgICBXaWR0aElzMk1WSXNOb3RaZXJvIAotICAgICAgICAgICAgICAgIE1PViAgICAgcmV0dXJuLCAgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi07Ly8gSWYgZnJhY3Rpb25sIG12IGlzICgwLCAwKQotV2lkdGhJczhNVklzWmVybwotICAgICAgICAgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgaVNyY1N0ZXAKLQotV2lkdGhJczhMb29wTVZJc1plcm8KLSAgICAgICAgICAgICAgICBWTEQxICAgIGRSb3cwYSwgW3BTcmNdLCBpU3JjU3RlcAotICAgICAgICAgICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzIKLSAgICAgICAgICAgICAgICBWTEQxICAgIGRSb3cwYiwgW3BTcmNdLCBpU3JjU3RlcAotICAgICAgICAgICAgICAgIFZTVDEgICAgZE91dDBVNjQsIFtwRHN0XSwgaURzdFN0ZXAKLSAgICAgICAgICAgICAgICBWU1QxICAgIGRPdXQxVTY0LCBbcERzdF0sIGlEc3RTdGVwCi0gICAgICAgICAgICAgICAgQkdUICAgICBXaWR0aElzOExvb3BNVklzWmVybwotCi0gICAgICAgICAgICAgICAgTU9WICAgICByZXR1cm4sICAjT01YX1N0c19Ob0VycgotICAgICAgICAgICAgICAgIE1fRVhJVAotCi1XaWR0aElzNE1WSXNaZXJvICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFZMRDEgICAgZFJvdzBiLCBbcFNyY10sIGlTcmNTdGVwCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFZTVDEgICAgZE91dDAwVTMyWzBdLCBbcERzdF0sIGlEc3RTdGVwCi0gICAgICAgICAgICAgICAgVkxEMSAgICBkUm93MGEsIFtwU3JjXSwgaVNyY1N0ZXAKLSAgICAgICAgICAgICAgICBWU1QxICAgIGRPdXQwMVUzMlswXSwgW3BEc3RdLCBpRHN0U3RlcAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEJHVCAgICAgV2lkdGhJczRNVklzWmVybyAKLSAgICAgICAgICAgICAgICBNT1YgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCi0gICAgICAgICAgICAgICAgTV9FWElUCi0gICAgICAgICAgICAgICAgCi1XaWR0aElzMk1WSXNaZXJvICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFZMRDEgICAgZFJvdzBiLCBbcFNyY10sIGlTcmNTdGVwCi0gICAgICAgICAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFZTVDEgICAgZE91dDBVMTZbMF0sIFtwRHN0XSwgaURzdFN0ZXAKLSAgICAgICAgICAgICAgICBWTEQxICAgIGRSb3cwYSwgW3BTcmNdLCBpU3JjU3RlcAotICAgICAgICAgICAgICAgIFZTVDEgICAgZE91dDFVMTZbMF0sIFtwRHN0XSwgaURzdFN0ZXAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBCR1QgICAgIFdpZHRoSXMyTVZJc1plcm8gCi0gICAgICAgICAgICAgICAgTU9WICAgICByZXR1cm4sICAjT01YX1N0c19Ob0VyciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgTV9FTkQKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIEVORElGIDsvLyBDb3J0ZXhBOAotICAgICAgICAKLSAgICAgICAgRU5ECi0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfYXNtIGVuZHMKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9RdWFudFRhYmxlc19zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXNfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2QzM2E0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9RdWFudFRhYmxlc19zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9RdWFudFRhYmxlc19zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vIERlc2NyaXB0aW9uOgotOy8vIFRoaXMgZmlsZSBjb250YWlucyBxdWFudGl6YXRpb24gdGFibGVzCi07Ly8gCi07Ly8gCi0KLSAgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgIAotICAgICAgICAgCi0gICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9NRk1hdHJpeFFQTW9kVGFibGUKLSAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1FQRGl2SW50cmFUYWJsZQotICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfUVBEaXZQbHVzT25lVGFibGUgIAotICAgICAgICAgCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFRoaXMgdGFibGUgY29udGFpbnMgYXJtVkNNNFAxMF9NRk1hdHJpeCBbaVFQICUgNl1bMF0gZW50aXJlcywKLTsvLyBmb3IgdmFsdWVzIG9mIGlRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX01GTWF0cml4UVBNb2RUYWJsZQotICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKLSAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCi0gICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgotICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKLSAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCi0gICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgotICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKLSAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCi0gICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgotICAgICAgICAgCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBUaGlzIHRhYmxlIGNvbnRhaW5zIEFSTV9NNFAxMF9RX09GRlNFVCArIDEgKyAoaVFQIC8gNikgdmFsdWVzLAotOy8vIGZvciB2YWx1ZXMgb2YgaVFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4gCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1FQRGl2UGx1c09uZVRhYmxlCi0gICAgICAgICBEQ0IgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNgotICAgICAgICAgRENCIDE3LCAxNywgMTcsIDE3LCAxNywgMTcKLSAgICAgICAgIERDQiAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4Ci0gICAgICAgICBEQ0IgMTksIDE5LCAxOSwgMTksIDE5LCAxOQotICAgICAgICAgRENCIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAKLSAgICAgICAgIERDQiAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxCi0gICAgICAgICBEQ0IgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMgotICAgICAgICAgRENCIDIzLCAyMywgMjMsIDIzLCAyMywgMjMKLSAgICAgICAgIERDQiAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0Ci0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFRoaXMgdGFibGUgY29udGFpbnMgKDEgPDwgUWJpdHNQbHVzT25lKSAvIDMgVmFsdWVzIChJbnRyYSBjYXNlKSAsCi07Ly8gZm9yIHZhbHVlcyBvZiBpUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLiAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIAotICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1FQRGl2SW50cmFUYWJsZSwgMgotICAgICAgICAgRENEIDIxODQ1LCAyMTg0NSwgMjE4NDUsIDIxODQ1LCAyMTg0NSwgMjE4NDUKLSAgICAgICAgIERDRCA0MzY5MCwgNDM2OTAsIDQzNjkwLCA0MzY5MCwgNDM2OTAsIDQzNjkwCi0gICAgICAgICBEQ0QgODczODEsIDg3MzgxLCA4NzM4MSwgODczODEsIDg3MzgxLCA4NzM4MQotICAgICAgICAgRENEIDE3NDc2MiwgMTc0NzYyLCAxNzQ3NjIsIDE3NDc2MiwgMTc0NzYyLCAxNzQ3NjIKLSAgICAgICAgIERDRCAzNDk1MjUsIDM0OTUyNSwgMzQ5NTI1LCAzNDk1MjUsIDM0OTUyNSwgMzQ5NTI1Ci0gICAgICAgICBEQ0QgNjk5MDUwLCA2OTkwNTAsIDY5OTA1MCwgNjk5MDUwLCA2OTkwNTAsIDY5OTA1MAotICAgICAgICAgRENEIDEzOTgxMDEsIDEzOTgxMDEsIDEzOTgxMDEsIDEzOTgxMDEsIDEzOTgxMDEsIDEzOTgxMDEKLSAgICAgICAgIERDRCAyNzk2MjAyLCAyNzk2MjAyLCAyNzk2MjAyLCAyNzk2MjAyLCAyNzk2MjAyLCAyNzk2MjAyCi0gICAgICAgICBEQ0QgNTU5MjQwNSwgNTU5MjQwNSwgNTU5MjQwNSwgNTU5MjQwNSwgNTU5MjQwNSwgNTU5MjQwNSAgICAgICAgICAgICAgICAKLSAgICAgICAgIAotICAgICAgICAgCi0gICAgICAgICBFTkQKLSAgICAgICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMTZlNDkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MucworKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi07Ly8gRGVzY3JpcHRpb246Ci07Ly8gVHJhbnNmb3JtIFJlc2lkdWFsIDR4NCBDb2VmZmljaWVudHMKLTsvLyAKLTsvLyAKLQotICAgICAgICAKLTsvLyBJbmNsdWRlIHN0YW5kYXJkIGhlYWRlcnMKLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4Ci0gICAgICAgIAotOy8vIEltcG9ydCBzeW1ib2xzIHJlcXVpcmVkIGZyb20gb3RoZXIgZmlsZXMKLTsvLyAoRm9yIGV4YW1wbGUgdGFibGVzKQotICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotOy8vIFNldCBkZWJ1Z2dpbmcgbGV2ZWwgICAgICAgIAotOy8vREVCVUdfT04gICAgU0VUTCB7VFJVRX0KLQotCi0KLTsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKLSAgICAKLSAgICAKLSAgICAKLQotCi0KLQotCi07Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCi0gICAgCi0gICAgSUYgIENvcnRleEE4Ci0KLTsvLyBBUk0gUmVnaXN0ZXJzCi0gICAgCi07Ly9JbnB1dCBSZWdpc3RlcnMKLXBEc3QgICAgICAgICAgICAgICAgUk4gIDAKLXBTcmMgICAgICAgICAgICAgICAgUk4gIDEKLQotCi07Ly8gTmVvbiBSZWdpc3RlcnMKLSAgICAgIAotOy8vIFBhY2tlZCBJbnB1dCBwaXhlbHMKLWRJbjAgICAgICAgICAgICAgICAgRE4gIEQwLlMxNiAgICAgICAKLWRJbjEgICAgICAgICAgICAgICAgRE4gIEQxLlMxNiAgICAgICAKLWRJbjIgICAgICAgICAgICAgICAgRE4gIEQyLlMxNiAgICAgICAKLWRJbjMgICAgICAgICAgICAgICAgRE4gIEQzLlMxNgotCi07Ly8gSW50ZXJtZWRpYXRlIGNhbGN1bGF0aW9ucyAgICAgICAKLWRaZXJvICAgICAgICAgICAgICAgRE4gIEQ0LlMxNgotZGUwICAgICAgICAgICAgICAgICBETiAgRDUuUzE2Ci1kZTEgICAgICAgICAgICAgICAgIEROICBENi5TMTYKLWRlMiAgICAgICAgICAgICAgICAgRE4gIEQ3LlMxNgotZGUzICAgICAgICAgICAgICAgICBETiAgRDguUzE2Ci1kSW4xUlMgICAgICAgICAgICAgIEROICBENy5TMTYKLWRJbjNSUyAgICAgICAgICAgICAgRE4gIEQ4LlMxNgotZGYwICAgICAgICAgICAgICAgICBETiAgRDAuUzE2Ci1kZjEgICAgICAgICAgICAgICAgIEROICBEMS5TMTYKLWRmMiAgICAgICAgICAgICAgICAgRE4gIEQyLlMxNgotZGYzICAgICAgICAgICAgICAgICBETiAgRDMuUzE2Ci1xZjAxICAgICAgICAgICAgICAgIFFOICBRMC4zMgotcWYyMyAgICAgICAgICAgICAgICBRTiAgUTEuMzIKLWRnMCAgICAgICAgICAgICAgICAgRE4gIEQ1LlMxNgotZGcxICAgICAgICAgICAgICAgICBETiAgRDYuUzE2Ci1kZzIgICAgICAgICAgICAgICAgIEROICBENy5TMTYKLWRnMyAgICAgICAgICAgICAgICAgRE4gIEQ4LlMxNgotZGYxUlMgICAgICAgICAgICAgICBETiAgRDcuUzE2Ci1kZjNSUyAgICAgICAgICAgICAgIEROICBEOC5TMTYKLQotOy8vIE91dHB1dCBwaXhlbHMKLWRoMCAgICAgICAgICAgICAgICAgRE4gIEQwLlMxNgotZGgxICAgICAgICAgICAgICAgICBETiAgRDEuUzE2Ci1kaDIgICAgICAgICAgICAgICAgIEROICBEMi5TMTYKLWRoMyAgICAgICAgICAgICAgICAgRE4gIEQzLlMxNgotCi0gICAgICAgCi0gICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSByZXF1aXJlZCBieSB0aGUgZnVuY3Rpb24KLSAgICAgICAgCi0KLSAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NCwgLGQ4Ci0gICAgICAgIAotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIDsvLyBUaGUgc3RyYXRlZ3kgdXNlZCBpbiBpbXBsZW1lbnRpbmcgdGhlIHRyYW5zZm9ybSBpcyBhcyBmb2xsb3dzOioKLSAgICAgICAgOy8vIExvYWQgdGhlIDR4NCBibG9jayBpbnRvIDggcmVnaXN0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgCi0gICAgICAgIDsvLyBUcmFuc3Bvc2UgdGhlIDR4NCBtYXRyaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIAotICAgICAgICA7Ly8gUGVyZm9ybSB0aGUgcm93IG9wZXJhdGlvbnMgKG9uIGNvbHVtbnMpIHVzaW5nIFNJTUQgICAgICAgICAgICAqICAKLSAgICAgICAgOy8vIFRyYW5zcG9zZSB0aGUgNHg0IHJlc3VsdCBtYXRyaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgCi0gICAgICAgIDsvLyBQZXJmb3JtIHRoZSBjb2xvdW1uIG9wZXJhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgICAgOy8vIFN0b3JlIHRoZSA0eDQgYmxvY2sgYXQgb25lIGdvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgICAgICA7Ly8gTG9hZCBhbGwgdGhlIDR4NCBwaXhlbHMgaW4gdHJhbnNwb3NlZCBmb3JtCi0gICAgICAgIAotICAgICAgICBWTEQ0ICAgIHtkSW4wLGRJbjEsZEluMixkSW4zfSxbcFNyY10KLSAgICAgICAgCi0gICAgICAgIFZNT1YgICAgZFplcm8sIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVXNlZCB0byByaWdodCBzaGlmdCBieSAxIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICAgICAgICA7Ly8gUm93IE9wZXJhdGlvbnMgKFBlcmZvcm1lZCBvbiBjb2x1bW5zKQotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBWQUREICAgICAgICBkZTAsZEluMCxkSW4yICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUwID0gZDAgKyBkMiAKLSAgICAgICAgVlNVQiAgICAgICAgZGUxLGRJbjAsZEluMiAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTEgPSBkMCAtIGQyIAotICAgICAgICBWSEFERCAgICAgICBkSW4xUlMsZEluMSxkWmVybyAgICAgICAgICAgICAgICAgICA7Ly8gKGYxPj4xKSBjb25zdFplcm8gaXMgYSByZWdpc3RlciBob2xkaW5nIDAKLSAgICAgICAgVkhBREQgICAgICAgZEluM1JTLGRJbjMsZFplcm8KLSAgICAgICAgVlNVQiAgICAgICAgZGUyLGRJbjFSUyxkSW4zICAgICAgICAgICAgICAgICAgICAgOy8vICBlMiA9IChkMT4+MSkgLSBkMyAKLSAgICAgICAgVkFERCAgICAgICAgZGUzLGRJbjEsZEluM1JTICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMyA9IGQxICsgKGQzPj4xKSAKLSAgICAgICAgVkFERCAgICAgICAgZGYwLGRlMCxkZTMgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMCA9IGUwICsgZTMKLSAgICAgICAgVkFERCAgICAgICAgZGYxLGRlMSxkZTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMSA9IGUxICsgZTIKLSAgICAgICAgVlNVQiAgICAgICAgZGYyLGRlMSxkZTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMiA9IGUxIC0gZTIKLSAgICAgICAgVlNVQiAgICAgICAgZGYzLGRlMCxkZTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMyA9IGUwIC0gZTMKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIDsvLyBUcmFuc3Bvc2UgdGhlIHJlc3VsdGFudCBtYXRyaXgKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIAotICAgICAgICBWVFJOICAgIGRmMCxkZjEKLSAgICAgICAgVlRSTiAgICBkZjIsZGYzCi0gICAgICAgIFZUUk4gICAgcWYwMSxxZjIzIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICAgICAgICA7Ly8gQ29sb3VtbiBPcGVyYXRpb25zIAotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBWQUREICAgICAgICBkZzAsZGYwLGRmMiAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUwID0gZDAgKyBkMiAKLSAgICAgICAgVlNVQiAgICAgICAgZGcxLGRmMCxkZjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMSA9IGQwIC0gZDIgCi0gICAgICAgIFZIQUREICAgICAgIGRmMVJTLGRmMSxkWmVybyAgICAgICAgICAgICAgICAgICAgIDsvLyAoZjE+PjEpIGNvbnN0WmVybyBpcyBhIHJlZ2lzdGVyIGhvbGRpbmcgMAotICAgICAgICBWSEFERCAgICAgICBkZjNSUyxkZjMsZFplcm8KLSAgICAgICAgVlNVQiAgICAgICAgZGcyLGRmMVJTLGRmMyAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMiA9IChkMT4+MSkgLSBkMyAKLSAgICAgICAgVkFERCAgICAgICAgZGczLGRmMSxkZjNSUyAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTMgPSBkMSArIChkMz4+MSkgCi0gICAgICAgIFZBREQgICAgICAgIGRoMCxkZzAsZGczICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjAgPSBlMCArIGUzCi0gICAgICAgIFZBREQgICAgICAgIGRoMSxkZzEsZGcyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjEgPSBlMSArIGUyCi0gICAgICAgIFZTVUIgICAgICAgIGRoMixkZzEsZGcyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjIgPSBlMSAtIGUyCi0gICAgICAgIFZTVUIgICAgICAgIGRoMyxkZzAsZGczICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjMgPSBlMCAtIGUzCi0gICAgICAgIAotICAgICAgICAgICAgIAotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIDsvLyBDYWxjdWxhdGUgZmluYWwgdmFsdWUgKGNvbE9wW2ldW2pdICsgMzIpPj42Ci0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgCi0gICAgICAgIFZSU0hSICAgICAgIGRoMCwjNgotICAgICAgICBWUlNIUiAgICAgICBkaDEsIzYKLSAgICAgICAgVlJTSFIgICAgICAgZGgyLCM2Ci0gICAgICAgIFZSU0hSICAgICAgIGRoMywjNgotICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICA7Ly8gU3RvcmUgYWxsIHRoZSA0eDQgcGl4ZWxzCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgCi0gICAgICAgIFZTVDEgICB7ZGgwLGRoMSxkaDIsZGgzfSxbcERzdF0KLSAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIFNldCByZXR1cm4gdmFsdWUKLSAgICAgICAgCi1FbmQgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgCi0gICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiB0YWlsCi0gICAgICAgIE1fRU5ECi0gICAgICAgIAotICAgIEVORElGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9Db3J0ZXhBOCAgICAgICAgICAgIAotICAgICAgICAgICAgCi0gICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0X3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI0YzdkNS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0X3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDEyMjkwCi07Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotICAgICAgICAKLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLTsvLyBEZWZpbmUgdGhlIHByb2Nlc3NvciB2YXJpYW50cyBzdXBwb3J0ZWQgYnkgdGhpcyBmaWxlCi0KLSAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBJRiBBUk0xMTM2SlMKLSAgICAgICAgCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIElucHV0IEFyZ3VtZW50cyBhbmQgdGhlaXIgc2NvcGUvdXNhZ2UKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wcFNyYyAgICAgICAgICAgUk4gMCAgICA7Ly8gUGVyc2lzdGVudCB2YXJpYWJsZQotcERzdCAgICAgICAgICAgIFJOIDEgICAgOy8vIFBlcnNpc3RlbnQgdmFyaWFibGUKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBWYXJpYWJsZXMgYW5kIHRoZWlyIHNjb3BlL3VzYWdlCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcFNyYyAgICAgICAgICAgIFJOIDIgICAgOy8vIFBlcnNpc3RlbnQgdmFyaWFibGVzCi1GbGFnICAgICAgICAgICAgUk4gMyAgICAKLVZhbHVlICAgICAgICAgICBSTiA0ICAgIAotVmFsdWUyICAgICAgICAgIFJOIDUgICAgCi1zdHJPZmZzZXQgICAgICAgUk4gNiAgICAKLWNzdE9mZnNldCAgICAgICBSTiA3ICAgIAotCi0gICAgICAgIAotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQsIHI3Ci0gICAgICAgIAotICAgICAgICBMRFIgICAgIHBTcmMsIFtwcFNyY10gICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHBTcmMKLSAgICAgICAgTU9WICAgICBjc3RPZmZzZXQsICMzMSAgICAgICAgICAgICAgICAgICAgICA7Ly8gVG8gYmUgdXNlZCBpbiB0aGUgbG9vcCwgdG8gY29tcHV0ZSBvZmZzZXQKLSAgICAgICAgCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIDsgRmlyc3RseSwgZmlsbCBhbGwgdGhlIGNvZWZmaWNpZW50IHZhbHVlcyBvbiB0aGUgPHBEc3Q+IGJ1ZmZlciBieSB6ZXJvCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICBWYWx1ZSwgICMwICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJbml0aWFsaXplIHRoZSB6ZXJvIHZhbHVlCi0gICAgICAgIE1PViAgICAgIFZhbHVlMiwgIzAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEluaXRpYWxpemUgdGhlIHplcm8gdmFsdWUKLSAgICAgICAgTERSQiAgICAgRmxhZywgIFtwU3JjXSwgIzEgICAgICAgICAgICAgICAgICA7Ly8gUHJlbG9hZCA8RmxhZz4gYmVmb3JlIDx1bnBhY2tMb29wPgotICAgICAgICAKLSAgICAgICAgU1RSRCAgICAgVmFsdWUsIFtwRHN0LCAjMF0gICAgICAgICAgICAgICAgICA7Ly8gcERzdFswXSAgPSBwRHN0WzFdICA9IHBEc3RbMl0gID0gcERzdFszXSAgPSAwCi0gICAgICAgIFNUUkQgICAgIFZhbHVlLCBbcERzdCwgIzhdICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbNF0gID0gcERzdFs1XSAgPSBwRHN0WzZdICA9IHBEc3RbN10gID0gMAotICAgICAgICBTVFJEICAgICBWYWx1ZSwgW3BEc3QsICMxNl0gICAgICAgICAgICAgICAgIDsvLyBwRHN0WzhdICA9IHBEc3RbOV0gID0gcERzdFsxMF0gPSBwRHN0WzExXSA9IDAKLSAgICAgICAgU1RSRCAgICAgVmFsdWUsIFtwRHN0LCAjMjRdICAgICAgICAgICAgICAgICA7Ly8gcERzdFsxMl0gPSBwRHN0WzEzXSA9IHBEc3RbMTRdID0gcERzdFsxNV0gPSAwCi0gICAgICAgIAotICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIDsvLyBUaGUgbG9vcCBiZWxvdyBwYXJzZXMgYW5kIHVucGFja3MgdGhlIGlucHV0IHN0cmVhbS4gVGhlIEMtbW9kZWwgaGFzIAotICAgICAgICA7Ly8gYSBzb21ld2hhdCBjb21wbGljYXRlZCBsb2dpYyBmb3Igc2lnbiBleHRlbnNpb24uICBCdXQgaW4gdGhlIHY2IHZlcnNpb24sCi0gICAgICAgIDsvLyB0aGF0IGNhbiBiZSBlYXNpbHkgdGFrZW4gY2FyZSBieSBsb2FkaW5nIHRoZSBkYXRhIGZyb20gPHBTcmM+IHN0cmVhbSBhcyAKLSAgICAgICAgOy8vIFNJR05FRCBieXRlL2hhbGZ3b3JkLiBTbywgYmFzZWQgb24gdGhlIGZpcnN0IFRTVCBpbnN0cnVjdGlvbiwgOC1iaXRzIG9yIAotICAgICAgICA7Ly8gMTYtYml0cyBhcmUgcmVhZC4KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBOZXh0LCB0byBjb21wdXRlIHRoZSBvZmZzZXQsIHdoZXJlIHRoZSB1bnBhY2tlZCB2YWx1ZSBuZWVkcyB0byBiZSBzdG9yZWQsCi0gICAgICAgIDsvLyB3ZSBtb2RpZnkgdGhlIGNvbXB1dGF0aW9uIHRvIHBlcmZvcm0gWyhGbGFnICYgMTUpIDwgMV0gYXMgWyhGbGFnIDwgMSkgJiAzMV0KLSAgICAgICAgOy8vIFRoaXMgcmVzdWx0cyBpbiBhIHNhdmluZyBvZiBvbmUgY3ljbGUuCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgCi11bnBhY2tMb29wCi0gICAgICAgIFRTVCAgICAgIEZsYWcsICAjMHgxMCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDb21wdXRpbmcgKEZsYWcgJiAweDEwKQotICAgICAgICBMRFJTQk5FICBWYWx1ZTIsW3BTcmMsIzFdICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBieXRlIHdpc2UgdG8gYXZvaWQgdW5hbGlnbmVkIGFjY2VzcyAgIAotICAgICAgICBMRFJCTkUgICBWYWx1ZSwgW3BTcmNdLCAjMiAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQU5EICAgICAgc3RyT2Zmc2V0LCBjc3RPZmZzZXQsIEZsYWcsIExTTCAjMSAgOy8vIHN0ck9mZnNldCA9IChGbGFnICYgMTUpIDwgMTsKLSAgICAgICAgTERSU0JFUSAgVmFsdWUsIFtwU3JjXSwgIzEgICAgICAgICAgICAgICAgICAgOy8vIFZhbHVlID0gKE9NWF9VOCkgICpwU3JjKysKLSAgICAgICAgT1JSTkUgICAgVmFsdWUsVmFsdWUsVmFsdWUyLCBMU0wgIzggICAgICAgICAgOy8vIFZhbHVlID0gKE9NWF9VMTYpICpwU3JjKysKLSAgICAgICAgCi0gICAgICAgIFRTVCAgICAgIEZsYWcsICAjMHgyMCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDb21wdXRpbmcgKEZsYWcgJiAweDIwKSB0byBjaGVjaywgaWYgd2UncmUgZG9uZQotICAgICAgICBMRFJCRVEgICBGbGFnLCAgW3BTcmNdLCAjMSAgICAgICAgICAgICAgICAgICA7Ly8gRmxhZyAgPSAoT01YX1U4KSAqcFNyYysrLCBmb3IgbmV4dCBpdGVyYXRpb24KLSAgICAgICAgU1RSSCAgICAgVmFsdWUsIFtwRHN0LCBzdHJPZmZzZXRdICAgICAgICAgICAgOy8vIFN0b3JlIDxWYWx1ZT4gYXQgb2Zmc2V0IDxzdHJPZmZzZXQ+Ci0gICAgICAgIEJFUSAgICAgIHVucGFja0xvb3AgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBCcmFuY2ggdG8gdGhlIGxvb3AgYmVnaW5uaW5nCi0gICAgICAgIAotICAgICAgICBTVFIgICAgICBwU3JjLCBbcHBTcmNdICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVXBkYXRlIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgotICAgICAgICBNX0VORAotICAgIAotICAgIEVORElGCi0gICAgCi0gICAgCi0gICAgCi0gICAgRU5ECi0gICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNjQ0OGQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgMTIyOTAKLSAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEguMjY0IGludHJhIGNocm9tYSBkZWJsb2NrCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgZGVibG9ja2luZyBmaWx0ZXJpbmcgb24gYWxsIGVkZ2VzIG9mIHRoZSBjaHJvbWEgbWFjcm9ibG9jayAoMTZ4MTYpLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcFNyY0RzdCAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2suIE11c3QgYmUgOC1ieXRlIGFsaWduZWQuCi0gKiBbaW5dCXNyY2RzdFN0ZXAgICAgICBTdGVwIG9mIHRoZSBhcnJheXMKLSAqIFtpbl0JcEFscGhhICAgICAgICAgIHBvaW50ZXIgdG8gYSAyeDIgYXJyYXkgb2YgYWxwaGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIGZvbGxvd3M6IHsgZXh0ZXJuYWwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCAgdmVydGljYWwgZWRnZSwgZXh0ZXJuYWwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0KLSAqIFtpbl0JcEJldGEJCQlwb2ludGVyIHRvIGEgMngyIGFycmF5IG9mIGJldGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIGZvbGxvd3M6IHsgZXh0ZXJuYWwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgZXh0ZXJuYWwgIGhvcml6b250YWwgZWRnZSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwgIGhvcml6b250YWwgZWRnZSB9Ci0gKiBbaW5dCXBUaHJlc2hvbGRzCQlBQXJyYXkgb2Ygc2l6ZSAgOHgyIG9mIFRocmVzaG9sZHMgKFRDMCkgKHZhbHVlcyBmb3IgdGhlIGxlZnQgb3IKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3ZlIGVkZ2Ugb2YgZWFjaCA0eDIgb3IgMng0IGJsb2NrLCBhcnJhbmdlZCBpbiAgdmVydGljYWwgYmxvY2sgb3JkZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGVuIGluICBob3Jpem9udGFsIGJsb2NrIG9yZGVyKQotICogW2luXQlwQlMJCQkJYXJyYXkgb2Ygc2l6ZSAxNngyIG9mIEJTIHBhcmFtZXRlcnMgKGFycmFuZ2VkIGluIHNjYW4gYmxvY2sgb3JkZXIgZm9yIHZlcnRpY2FsIGVkZ2VzIGFuZCB0aGVuIGhvcml6b250YWwgZWRnZXMpOwotICogICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjFdPT0gNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuCi0gKiBbb3V0XQlwU3JjRHN0CQlwb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1N0c19Ob0VyciAtIG5vIGVycm9yCi0gKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKLSAqICAgLSBFaXRoZXIgb2YgdGhlIHBvaW50ZXJzIGluIHBTcmNEc3QsIHBBbHBoYSwgcEJldGEsIHBUcmVzaG9sZHMsIG9yIHBCUyBpcyBOVUxMLgotICogICAtIHBTcmNEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLgotICogICAtIGVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLgotICogICAtIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIChwQlNbaV09PTQgJiYgcEJTW2leMV0hPTQpIGZvciAwPD1pPD0zLgotICogICAtIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4KLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSSgKLQlPTVhfVTgqIHBTcmNEc3QsIAotCU9NWF9TMzIgc3JjZHN0U3RlcCwgCi0JY29uc3QgT01YX1U4KiBwQWxwaGEsIAotCWNvbnN0IE9NWF9VOCogcEJldGEsIAotCWNvbnN0IE9NWF9VOCogcFRocmVzaG9sZHMsCi0gICAgY29uc3QgT01YX1U4ICpwQlMKLSkKLXsKLSAgICBPTVhSZXN1bHQgZXJyb3JDb2RlOwotICAgIAotICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocFNyY0RzdCksICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoc3JjZHN0U3RlcCAmIDcsICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBBbHBoYSA9PSBOVUxMLCAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQmV0YSA9PSBOVUxMLCAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFRocmVzaG9sZHMgPT0gTlVMTCwgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwVGhyZXNob2xkcyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQlMgPT0gTlVMTCwgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBCUyksICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotCi0gICAgZXJyb3JDb2RlID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSgKLSAgICAgICAgcFNyY0RzdCwgc3JjZHN0U3RlcCwgcEFscGhhLCBwQmV0YSwgcFRocmVzaG9sZHMsIHBCUyk7Ci0KLSAgICBhcm1SZXRBcmdFcnJJZihlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciwgZXJyb3JDb2RlKQotICAgIAotICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0koCi0gICAgICAgIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIHBBbHBoYSsyLCBwQmV0YSsyLCBwVGhyZXNob2xkcys4LCBwQlMrMTYpOwotCi0gICAgcmV0dXJuIGVycm9yQ29kZTsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Yjg5YmU3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgMTIyOTAKLSAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEguMjY0IGx1bWEgZGVibG9jawotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSAKLQotLyoqCi0gKiBGdW5jdGlvbjogb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGRlYmxvY2sgZmlsdGVyaW5nIHRoZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBlZGdlcyBvZiBhIGx1bWEgbWFjcm9ibG9jawotICooMTZ4MTYpLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcFNyY0RzdCAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2suIE11c3QgYmUgOC1ieXRlIGFsaWduZWQuCi0gKiBbaW5dCXNyY2RzdFN0ZXAgICAgICBpbWFnZSB3aWR0aAotICogW2luXQlwQWxwaGEgICAgICAgICAgcG9pbnRlciB0byBhIDJ4MiB0YWJsZSBvZiBhbHBoYSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogeyBleHRlcm5hbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsIGhvcml6b250YWwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfQotICogW2luXQlwQmV0YQkJCXBvaW50ZXIgdG8gYSAyeDIgdGFibGUgb2YgYmV0YSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogeyBleHRlcm5hbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbCAgaG9yaXpvbnRhbCBlZGdlLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbCAgaG9yaXpvbnRhbCBlZGdlIH0KLSAqIFtpbl0JcFRocmVzaG9sZHMJCXBvaW50ZXIgdG8gYSAxNngyIHRhYmxlIG9mIHRocmVzaG9sZCAoVEMwKSwgb3JnYW5pemVkIGFzIGZvbGxvd3M6IHsgdmFsdWVzIGZvcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgIGxlZnQgb3IgYWJvdmUgZWRnZSBvZiBlYWNoIDR4NCBibG9jaywgYXJyYW5nZWQgaW4gIHZlcnRpY2FsIGJsb2NrIG9yZGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGVuIGluIGhvcml6b250YWwgYmxvY2sgb3JkZXIpCi0gKiBbaW5dCXBCUwkJCQkgcG9pbnRlciB0byBhIDE2eDIgdGFibGUgb2YgQlMgcGFyYW1ldGVycyBhcnJhbmdlZCBpbiBzY2FuIGJsb2NrIG9yZGVyIGZvciB2ZXJ0aWNhbCBlZGdlcyBhbmQgdGhlbiBob3Jpem9udGFsIGVkZ2VzOwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjFdPT0gNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuCi0gKiBbb3V0XQlwU3JjRHN0CQlwb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgotICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCi0gKiAgICAtIEVpdGhlciBvZiB0aGUgcG9pbnRlcnMgaW4gcFNyY0RzdCwgcEFscGhhLCBwQmV0YSwgcFRyZXNob2xkcyBvciBwQlMgaXMgTlVMTC4KLSAqICAgIC0gcFNyY0RzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuCi0gKiAgICAtIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOAotICogICAgLSBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAocEJTW2ldPT00ICYmIHBCU1tpXjFdIT00KSBmb3IgMDw9aTw9My4KLS4KLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSSgKLQlPTVhfVTgqIHBTcmNEc3QsIAotCU9NWF9TMzIgc3JjZHN0U3RlcCwgCi0JY29uc3QgT01YX1U4KiBwQWxwaGEsIAotCWNvbnN0IE9NWF9VOCogcEJldGEsIAotCWNvbnN0IE9NWF9VOCogcFRocmVzaG9sZHMsIAotCWNvbnN0IE9NWF9VOCAqcEJTCi0pCi17Ci0gICAgT01YUmVzdWx0IGVycm9yQ29kZTsKLSAgICAKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocFNyY0RzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihzcmNkc3RTdGVwICYgNywgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsgICAgCi0gICAgYXJtUmV0QXJnRXJySWYocEFscGhhID09IE5VTEwsICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJldGEgPT0gTlVMTCwgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFRocmVzaG9sZHMgPT0gTlVMTCwgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBUaHJlc2hvbGRzKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCUyA9PSBOVUxMLCAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocEJTKSwgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLSAgICBlcnJvckNvZGUgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSgKLSAgICAgICAgcFNyY0RzdCwgc3JjZHN0U3RlcCwgcEFscGhhLCBwQmV0YSwgcFRocmVzaG9sZHMsIHBCUyk7Ci0KLSAgICBhcm1SZXRBcmdFcnJJZihlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciwgZXJyb3JDb2RlKQotICAgIAotICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JKAotICAgICAgICBwU3JjRHN0LCBzcmNkc3RTdGVwLCBwQWxwaGErMiwgcEJldGErMiwgcFRocmVzaG9sZHMrMTYsIHBCUysxNik7Ci0KLSAgICByZXR1cm4gZXJyb3JDb2RlOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MGYzNDguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYworKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDEyMjkwCi0gKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBILjI2NCBkZWNvZGUgY29lZmZpY2llbnRzIG1vZHVsZQotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBDQVZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSByYXN0ZXIgc2NhbiBmb3IgMngyIGJsb2NrIG9mIAotICogQ2hyb21hRENMZXZlbC4gVGhlIGRlY29kZWQgY29lZmZpY2llbnRzIGluIHBhY2tlZCBwb3NpdGlvbi1jb2VmZmljaWVudCAKLSAqIGJ1ZmZlciBhcmUgc3RvcmVkIGluIGluY3JlYXNpbmcgcmFzdGVyIHNjYW4gb3JkZXIsIG5hbWVseSBwb3NpdGlvbiBvcmRlci4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwQml0U3RyZWFtCQlEb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbQotICoJCQkJCQkJCWJ1ZmZlcgotICogW2luXQlwT2Zmc2V0CQkJUG9pbnRlciB0byBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKLSAqCQkJCQkJCQlwb2ludGVkIHRvIGJ5ICpwcEJpdFN0cmVhbQotICogW291dF0JcHBCaXRTdHJlYW0JCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAotICogW291dF0JcE9mZnNldAkJCSpwT2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkCi0gKiBbb3V0XQlwTnVtQ29lZmYJCVBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cwotICoJCQkJCQkJCWluIHRoaXMgYmxvY2sKLSAqIFtvdXRdCXBwUG9zQ29lZmJ1ZglEb3VibGUgcG9pbnRlciB0byBkZXN0aW5hdGlvbiByZXNpZHVhbAotICoJCQkJCQkJCWNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgb214RXJyb3IgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQyAoCi0gICAgIGNvbnN0IE9NWF9VOCoqIHBwQml0U3RyZWFtLAotICAgICBPTVhfUzMyKiBwT2Zmc2V0LAotICAgICBPTVhfVTgqIHBOdW1Db2VmZiwKLSAgICAgT01YX1U4KiogcHBQb3NDb2VmYnVmICAgICAgICAKLSApCi0KLXsKLSAgICByZXR1cm4gYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIocHBCaXRTdHJlYW0sIHBPZmZzZXQsIHBOdW1Db2VmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBQb3NDb2VmYnVmLCAxNywgNCk7Ci0KLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNzhiNGMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgMTIyOTAKLSAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEguMjY0IGRlY29kZSBjb2VmZmljaWVudHMgbW9kdWxlCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBDQVZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3IgNHg0IGJsb2NrIG9mIAotICogSW50cmExNngxNkRDTGV2ZWwsIEludHJhMTZ4MTZBQ0xldmVsLEx1bWFMZXZlbCwgYW5kIENocm9tYUFDTGV2ZWwuIAotICogSW52ZXJzZSBmaWVsZCBzY2FuIGlzIG5vdCBzdXBwb3J0ZWQuIFRoZSBkZWNvZGVkIGNvZWZmaWNpZW50cyBpbiBwYWNrZWQgCi0gKiBwb3NpdGlvbi1jb2VmZmljaWVudCBidWZmZXIgYXJlIHN0b3JlZCBpbiBpbmNyZWFzaW5nIHppZ3phZyBvcmRlciBpbnN0ZWFkIAotICogb2YgcG9zaXRpb24gb3JkZXIuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcEJpdFN0cmVhbQkJRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0gYnVmZmVyCi0gKiBbaW5dCXBPZmZzZXQJCQlQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLSAqCQkJCQkJCQl0byBieSAqcHBCaXRTdHJlYW0KLSAqIFtpbl0Jc01heE51bUNvZWZmCU1heGltdW0gbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyBpbiBjdXJyZW50Ci0gKgkJCQkJCQkJYmxvY2sKLSAqIFtpbl0Jc1ZMQ1NlbGVjdAkJVkxDIHRhYmxlIHNlbGVjdG9yLCBvYnRhaW5lZCBmcm9tIG51bWJlciBvZiBub24temVybwotICoJCQkJCQkJCUFDIGNvZWZmaWNpZW50cyBvZiBhYm92ZSBhbmQgbGVmdCA0eDQgYmxvY2tzLiBJdCBpcyAKLSAqCQkJCQkJCQllcXVpdmFsZW50IHRvIHRoZSB2YXJpYWJsZSBuQyBkZXNjcmliZWQgaW4gSC4yNjQgc3RhbmRhcmQgCi0gKgkJCQkJCQkJdGFibGUgOS01LCBleGNlcHQgaXRzIHZhbHVlIGNhbqGvdCBiZSBsZXNzIHRoYW4gemVyby4KLSAqIFtvdXRdCXBwQml0U3RyZWFtCQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKLSAqIFtvdXRdCXBPZmZzZXQJCQkqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAotICogW291dF0JcE51bUNvZWZmCQlQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMgaW4KLSAqCQkJCQkJCQl0aGlzIGJsb2NrCi0gKiBbb3V0XQlwcFBvc0NvZWZidWYJRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwKLSAqCQkJCQkJCQljb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlcgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgb214RXJyb3IgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMoCi0gICAgIGNvbnN0IE9NWF9VOCoqIHBwQml0U3RyZWFtLAotICAgICBPTVhfUzMyKiBwT2Zmc2V0LAotICAgICBPTVhfVTgqIHBOdW1Db2VmZiwKLSAgICAgT01YX1U4KipwcFBvc0NvZWZidWYsCi0gICAgIE9NWF9JTlQgc1ZMQ1NlbGVjdCwKLSAgICAgT01YX0lOVCBzTWF4TnVtQ29lZmYgICAgICAgIAotICkKLXsKLSAgICByZXR1cm4gYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIocHBCaXRTdHJlYW0sIHBPZmZzZXQsIHBOdW1Db2VmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBQb3NDb2VmYnVmLCBzVkxDU2VsZWN0LCBzTWF4TnVtQ29lZmYpOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZF9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ODc5ODIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkX3MucworKysgL2Rldi9udWxsCkBAIC0xLDQxMCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZF9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi07Ly8gRGVzY3JpcHRpb246Ci07Ly8gSC4yNjQgaW52ZXJzZSBxdWFudGl6ZSBhbmQgdHJhbnNmb3JtIG1vZHVsZQotOy8vIAotOy8vIAotCi0gICAgICAgIAotCi07Ly8gSW5jbHVkZSBzdGFuZGFyZCBoZWFkZXJzCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLTsvLyBJbXBvcnQgc3ltYm9scyByZXF1aXJlZCBmcm9tIG90aGVyIGZpbGVzCi07Ly8gKEZvciBleGFtcGxlIHRhYmxlcykKLSAgICAKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfUVBEaXZUYWJsZQotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9WTWF0cml4VTE2Ci0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1FQTW9kdWxvVGFibGUgCi0gICAgICAgIAotICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4Ci0gICAgICAgIAotOy8vIFNldCBkZWJ1Z2dpbmcgbGV2ZWwgICAgICAgIAotOy8vREVCVUdfT04gICAgU0VUTCB7VFJVRX0KLQotCi07Ly8gU3RhdGljIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0RlcXVhbnRMdW1hQUM0eDQKLQotOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQotICAgIAotIAotCi07Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCi0gICAgCi0KLQotCi0KLQotOy8vIEZ1bmN0aW9uOiBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkICAgICAgICAgICAgCi0gICAgCi07Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCi0gICAgCi0gICAgCi0gICAgCi07Ly8gRnVuY3Rpb246IG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQgICAgICAgICAgICAKLSAgICAKLTsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKLSAgICAKLSAgICBJRiAgQ29ydGV4QTgKLSAgICAKLQotOy8vIEFSTSBSZWdpc3RlcnMKLQotOy8vSW5wdXQgUmVnaXN0ZXJzCi1wcFNyYyAgICAgICBSTiAgMAotcFByZWQgICAgICAgUk4gIDEKLXBEQyAgICAgICAgIFJOICAyCi1wRHN0ICAgICAgICBSTiAgMwotICAgCi0KLTsvL091dHB1dCBSZWdpc3RlcnMKLXJlc3VsdCAgICAgIFJOICAwCi0KLTsvL0xvY2FsIFNjcmF0Y2ggUmVnaXN0ZXJzCi0KLTsvL1JlZ2lzdGVycyB1c2VkIGluIGFybVZDTTRQMTBfRGVxdWFudEx1bWFBQzR4NAotcFFQZGl2ICAgICAgUk4gIDEwCi1wUVBtb2QgICAgICBSTiAgMTEKLXBWUm93ICAgICAgIFJOICAyCi1RUG1vZCAgICAgICBSTiAgMTIKLXNoaWZ0ICAgICAgIFJOICAxNAotaW5kZXgwICAgICAgUk4gIDEgCi1pbmRleDEgICAgICBSTiAgMTAgCi0KLTsvL1JlZ2lzdGVycyB1c2VkIGluIERlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkCi1wRGVsdGEgICAgICBSTiAgNAotcERlbHRhVG1wICAgUk4gIDYKLUFDICAgICAgICAgIFJOICA1ICAgICAgICAgICAgICAgICAgIDsvL0xvYWQgZnJvbSBzdGFjawotcFByZWRUZW1wICAgUk4gIDcKLXBEQ1RlbXAgICAgIFJOICA4Ci1wRHN0VGVtcCAgICBSTiAgOQotcERlbHRhQXJnMSAgUk4gIDEKLXBEZWx0YUFyZzAgIFJOICAwCi1RUCAgICAgICAgICBSTiAgMSAgICAgICAgICAgICAgICAgICA7Ly9Mb2FkIGZyb20gc3RhY2sKLURDdmFsICAgICAgIFJOICAxMCAgCi1wcmVkc3RlcCAgICBSTiAgMQotZHN0U3RlcCAgICAgUk4gIDEwCi1QcmVkVmFsMSAgICBSTiAgMwotUHJlZFZhbDIgICAgUk4gIDUKLQotCi0KLQotOy8vIE5lb24gUmVnaXN0ZXJzCi0KLTsvLyBSZWdpc3RlcnMgdXNlZCBpbiBhcm1WQ000UDEwX0RlcXVhbnRMdW1hQUM0eDQKLQotZFZtYXRyaXggICAgICAgICAgICBETiAgRDYuOCAgCi1kaW5kZXhSb3cwICAgICAgICAgIEROICBENy4zMiAKLWRpbmRleFJvdzEgICAgICAgICAgRE4gIEQ5LjMyIAotZEJ5dGVJbmRleFJvdzAgICAgICBETiAgRDcuOAotZEJ5dGVJbmRleFJvdzEgICAgICBETiAgRDkuOAotZFZSb3cwICAgICAgICAgICAgICBETiAgRDguOCAgCi1kVlJvdzEgICAgICAgICAgICAgIEROICBENC44Ci1kVlJvdzBVMTYgICAgICAgICAgIEROICBEOC5VMTYKLWRWUm93MVUxNiAgICAgICAgICAgRE4gIEQ0LlUxNgotZFZSb3cyVTE2ICAgICAgICAgICBETiAgRDguVTE2Ci1kVlJvdzNVMTYgICAgICAgICAgIEROICBENC5VMTYKLQotZFNoaWZ0ICAgICAgICAgICAgICBETiAgRDUuVTE2Ci1kU3JjUm93MCAgICAgICAgICAgIEROICBEMC5JMTYKLWRTcmNSb3cxICAgICAgICAgICAgRE4gIEQxLkkxNgotZFNyY1JvdzIgICAgICAgICAgICBETiAgRDIuSTE2ICAgIAotZFNyY1JvdzMgICAgICAgICAgICBETiAgRDMuSTE2Ci1kRHFudFJvdzAgICAgICAgICAgIEROICBEMC5JMTYgIAotZERxbnRSb3cxICAgICAgICAgICBETiAgRDEuSTE2IAotZERxbnRSb3cyICAgICAgICAgICBETiAgRDIuSTE2IAotZERxbnRSb3czICAgICAgICAgICBETiAgRDMuSTE2ICAKLQotOy8vIFJlZ2lzdGVycyB1c2VkIGluIFRyYW5zZm9ybVJlc2lkdWFsNHg0Ci0KLTsvLyBQYWNrZWQgSW5wdXQgcGl4ZWxzCi1kSW4wICAgICAgICAgICAgICAgIEROICBEMC5TMTYgICAgICAgCi1kSW4xICAgICAgICAgICAgICAgIEROICBEMS5TMTYgICAgICAgCi1kSW4yICAgICAgICAgICAgICAgIEROICBEMi5TMTYgICAgICAgCi1kSW4zICAgICAgICAgICAgICAgIEROICBEMy5TMTYKLXFJbjAxICAgICAgICAgICAgICAgUU4gIFEwLjMyCi1xSW4yMyAgICAgICAgICAgICAgIFFOICBRMS4zMgotCi07Ly8gSW50ZXJtZWRpYXRlIGNhbGN1bGF0aW9ucyAgICAgICAKLWRaZXJvICAgICAgICAgICAgICAgRE4gIEQ0LlMxNgotZGUwICAgICAgICAgICAgICAgICBETiAgRDUuUzE2Ci1kZTEgICAgICAgICAgICAgICAgIEROICBENi5TMTYKLWRlMiAgICAgICAgICAgICAgICAgRE4gIEQ3LlMxNgotZGUzICAgICAgICAgICAgICAgICBETiAgRDguUzE2Ci1kSW4xUlMgICAgICAgICAgICAgIEROICBENy5TMTYKLWRJbjNSUyAgICAgICAgICAgICAgRE4gIEQ4LlMxNgotZGYwICAgICAgICAgICAgICAgICBETiAgRDAuUzE2Ci1kZjEgICAgICAgICAgICAgICAgIEROICBEMS5TMTYKLWRmMiAgICAgICAgICAgICAgICAgRE4gIEQyLlMxNgotZGYzICAgICAgICAgICAgICAgICBETiAgRDMuUzE2Ci1xZjAxICAgICAgICAgICAgICAgIFFOICBRMC4zMgotcWYyMyAgICAgICAgICAgICAgICBRTiAgUTEuMzIKLWRnMCAgICAgICAgICAgICAgICAgRE4gIEQ1LlMxNgotZGcxICAgICAgICAgICAgICAgICBETiAgRDYuUzE2Ci1kZzIgICAgICAgICAgICAgICAgIEROICBENy5TMTYKLWRnMyAgICAgICAgICAgICAgICAgRE4gIEQ4LlMxNgotZGYxUlMgICAgICAgICAgICAgICBETiAgRDcuUzE2Ci1kZjNSUyAgICAgICAgICAgICAgIEROICBEOC5TMTYKLQotOy8vIE91dHB1dCBwaXhlbHMKLWRoMCAgICAgICAgICAgICAgICAgRE4gIEQwLlMxNgotZGgxICAgICAgICAgICAgICAgICBETiAgRDEuUzE2Ci1kaDIgICAgICAgICAgICAgICAgIEROICBEMi5TMTYKLWRoMyAgICAgICAgICAgICAgICAgRE4gIEQzLlMxNiAKLQotOy8vIFJlZ2lzdGVycyB1c2VkIGluIERlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkCi0KLWREZWx0YVJvdzAgICAgICAgICAgRE4gIEQwLlMxNgotZERlbHRhUm93MSAgICAgICAgICBETiAgRDEuUzE2Ci1kRGVsdGFSb3cyICAgICAgICAgIEROICBEMi5TMTYKLWREZWx0YVJvdzMgICAgICAgICAgRE4gIEQzLlMxNgotcURlbHRhUm93MDEgICAgICAgICBRTiAgUTAuUzE2Ci1xRGVsdGFSb3cyMyAgICAgICAgIFFOICBRMS5TMTYKLQotZFByZWRWYWxSb3cwMSAgICAgICBETiAgRDQuVTgKLWRQcmVkVmFsUm93MjMgICAgICAgRE4gIEQ1LlU4Ci0KLXFTdW1Sb3cwMSAgICAgICAgICAgUU4gIFEzLlMxNgotcVN1bVJvdzIzICAgICAgICAgICBRTiAgUTQuUzE2Ci1kRHN0Um93MDEgICAgICAgICAgIEROICBEMC5VOAotZERzdFJvdzIzICAgICAgICAgICBETiAgRDEuVTgKLWREc3RSb3cwICAgICAgICAgICAgRE4gIEQwLjMyWzBdCi1kRHN0Um93MSAgICAgICAgICAgIEROICBEMC4zMlsxXQotZERzdFJvdzIgICAgICAgICAgICBETiAgRDEuMzJbMF0KLWREc3RSb3czICAgICAgICAgICAgRE4gIEQxLjMyWzFdCi0gICAgCi0gICAgICAgICAgIAotICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgcmVxdWlyZWQgYnkgdGhlIGZ1bmN0aW9uCi0gICAgICAgIE1fQUxMT0M4IHBCdWZmZXIsIDMyCi0gICAgICAgICAgICAgICAKLQotICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkLHIxMSxkOQotICAgICAgICAKLSAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKLSAgICAgICAgTV9BUkcgICBwcmVkU3RlcE9uU3RhY2ssIDQKLSAgICAgICAgTV9BUkcgICBkc3RTdGVwT25TdGFjayw0Ci0gICAgICAgIE1fQVJHICAgUVBPblN0YWNrLCA0Ci0gICAgICAgIE1fQVJHICAgQUNPblN0YWNrLDQKLSAgCi0gICAgICAgIAotICAgICAgICBNX0FEUiAgIHBEZWx0YSxwQnVmZmVyIAotICAgICAgICBNX0xEUiAgIEFDLEFDT25TdGFjayAKLSAgICAgICAgCi0gICAgICAgICAKLSAgICAgICAgOy8vIFNhdmUgcmVnaXN0ZXJzIHIxLHIyLHIzIGJlZm9yZSBmdW5jdGlvbiBjYWxsICAgIAotICAgICAgICBNT1YgICAgIHBQcmVkVGVtcCxwUHJlZAotICAgICAgICBNT1YgICAgIHBEQ1RlbXAscERDCi0gICAgICAgIE1PViAgICAgcERzdFRlbXAscERzdAotICAgICAgICAKLSAgICAgICAgQ01QICAgICBBQywjMAotICAgICAgICBCRVEgICAgIERDY2FzZQotICAgICAgICBNT1YgICAgIHBEZWx0YUFyZzEscERlbHRhICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldCB1cCByMSBmb3IgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NAotICAgIAotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQKLSAgICAKLSAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgOy8vIGFybVZDTTRQMTBfRGVxdWFudEx1bWFBQzR4NCA6IHN0YXRpYyBmdW5jdGlvbiBpbmxpbmVkCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIAotICAgICAgICA7Ly9CTCAgICAgIGFybVZDTTRQMTBfRGVxdWFudEx1bWFBQzR4NAotICAgICAgICBNX0xEUiAgIFFQLFFQT25TdGFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldCB1cCByMSBmb3IgYXJtVkNNNFAxMF9EZXF1YW50THVtYUFDNHg0Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIExEUiAgICBwUVBtb2QsPWFybVZDTTRQMTBfUVBNb2R1bG9UYWJsZQotICAgICAgICBMRFIgICAgcFFQZGl2LD1hcm1WQ000UDEwX1FQRGl2VGFibGUgICAgICAgIAotICAgICAgICBMRFIgICAgcFZSb3csPWFybVZDTTRQMTBfVk1hdHJpeFUxNgotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIExEUlNCICBRUG1vZCxbcFFQbW9kLFFQXSAgICAgICAgICAgICAgICAgICAgOy8vIChRUCU2KSAqIDYKLSAgICAgICAgTERSU0IgIHNoaWZ0LFtwUVBkaXYsUVBdICAgICAgICAgICAgICAgICAgICA7Ly8gU2hpZnQgPSBRUCAvIDYKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgTERSICAgIGluZGV4MSw9MHgwMzAyMDUwNCAKLSAgICAgICAgTERSICAgIGluZGV4MCw9MHgwNTA0MDEwMCAgICAgICAgICAgICAgICAgICA7Ly8gSW5kZXhlcyBpbnRvIGRWbWF0cml4Ci0gICAgICAgIEFERCAgICBwVlJvdyxwVlJvdyxRUG1vZAotICAgICAgICBWRFVQICAgZGluZGV4Um93MCxpbmRleDAgCi0gICAgICAgIFZEVVAgICBkaW5kZXhSb3cxLGluZGV4MQotICAgICAgICBWRFVQICAgZFNoaWZ0LHNoaWZ0IAotICAgICAgICAKLSAgICAgICAgOy8vIExvYWQgYWxsIDR4NCBwVlJvd1tdIHZhbHVlcwotICAgICAgICBWTEQxICAgZFZtYXRyaXgsW3BWUm93XSAgICAgICAgICAgICAgICAgICAgIDsvLyBkVm1hdHJpeCA9IFswZHwwY3wwYnwwYV0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBWVEJMICAgZFZSb3cwLGRWbWF0cml4LGRCeXRlSW5kZXhSb3cwICAgICAgIDsvLyByb3cwID0gcm93MiA9IFtwVlJvd1syXSB8IHBWUm93WzBdIHwgcFZSb3dbMl0gfCBwVlJvd1swXV0KLSAgICAgICAgVlRCTCAgIGRWUm93MSxkVm1hdHJpeCxkQnl0ZUluZGV4Um93MSAgICAgICA7Ly8gcm93MSA9IHJvdzMgPSBbcFZSb3dbMV0gfCBwVlJvd1syXSB8IHBWUm93WzFdIHwgcFZSb3dbMl1dCi0gICAgICAgIENNUCAgICAgcERDVGVtcCwjMAotICAgICAgICA7Ly8gTG9hZCBhbGwgdGhlIDR4NCAnc3JjJyB2YWx1ZXMgIAotICAgICAgICBWTEQxICAgeyBkU3JjUm93MCxkU3JjUm93MSxkU3JjUm93MixkU3JjUm93MyB9LFtwRGVsdGFdIAotICAgICAgICAKLSAgICAgICAgVlNITCAgIGRWUm93MFUxNixkVlJvdzBVMTYsZFNoaWZ0IAotICAgICAgICBWU0hMICAgZFZSb3cxVTE2LGRWUm93MVUxNixkU2hpZnQgCi0gICAgICAgIExEUlNITkUgREN2YWwsW3BEQ1RlbXBdCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIE11bHRpcGx5IHNyY1tdIHdpdGggcFZSb3dbXQotICAgICAgICBWTVVMICAgIGREcW50Um93MCxkU3JjUm93MCxkVlJvdzBVMTYKLSAgICAgICAgVk1VTCAgICBkRHFudFJvdzEsZFNyY1JvdzEsZFZSb3cxVTE2Ci0gICAgICAgIFZNVUwgICAgZERxbnRSb3cyLGRTcmNSb3cyLGRWUm93MlUxNgotICAgICAgICBWTVVMICAgIGREcW50Um93MyxkU3JjUm93MyxkVlJvdzNVMTYKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICA7Ly8gVHJhbnNmb3JtUmVzaWR1YWw0eDQgOiBJbmxpbmVkIHRvIGF2b2lkIExvYWQvU3RvcmVzCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly9CTCAgICAgIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQKLSAgICAgICAgOy8vU1RSSE5FICBEQ3ZhbCxbcERlbHRhXQotICAgICAgICBWTU9WTkUgICAgZEluMFswXSxEQ3ZhbAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICA7Ly8gVHJhbnNwb3NlIHRoZSBpbnB1dCBwaXhlbHMgOiBwZXJmb3JtIFJvdyBvcHMgYXMgQ29sIG9wcwotICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAKLSAgICAgICAgVlRSTiAgICBkSW4wLGRJbjEKLSAgICAgICAgVlRSTiAgICBkSW4yLGRJbjMKLSAgICAgICAgVlRSTiAgICBxSW4wMSxxSW4yMyAKLSAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgVk1PViAgICBkWmVybywjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBVc2VkIHRvIHJpZ2h0IHNoaWZ0IGJ5IDEgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAgICAgICAgOy8vIFJvdyBPcGVyYXRpb25zIChQZXJmb3JtZWQgb24gY29sdW1ucykKLSAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBWQUREICAgICAgICBkZTAsZEluMCxkSW4yICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUwID0gZDAgKyBkMiAKLSAgICAgICAgVlNVQiAgICAgICAgZGUxLGRJbjAsZEluMiAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTEgPSBkMCAtIGQyIAotICAgICAgICBWSEFERCAgICAgICBkSW4xUlMsZEluMSxkWmVybyAgICAgICAgICAgICAgICAgICA7Ly8gKGYxPj4xKSBjb25zdFplcm8gaXMgYSByZWdpc3RlciBob2xkaW5nIDAKLSAgICAgICAgVkhBREQgICAgICAgZEluM1JTLGRJbjMsZFplcm8KLSAgICAgICAgVlNVQiAgICAgICAgZGUyLGRJbjFSUyxkSW4zICAgICAgICAgICAgICAgICAgICAgOy8vICBlMiA9IChkMT4+MSkgLSBkMyAKLSAgICAgICAgVkFERCAgICAgICAgZGUzLGRJbjEsZEluM1JTICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMyA9IGQxICsgKGQzPj4xKSAKLSAgICAgICAgVkFERCAgICAgICAgZGYwLGRlMCxkZTMgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMCA9IGUwICsgZTMKLSAgICAgICAgVkFERCAgICAgICAgZGYxLGRlMSxkZTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMSA9IGUxICsgZTIKLSAgICAgICAgVlNVQiAgICAgICAgZGYyLGRlMSxkZTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMiA9IGUxIC0gZTIKLSAgICAgICAgVlNVQiAgICAgICAgZGYzLGRlMCxkZTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMyA9IGUwIC0gZTMKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgOy8vIFRyYW5zcG9zZSB0aGUgcmVzdWx0YW50IG1hdHJpeAotICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAKLSAgICAgICAgVlRSTiAgICBkZjAsZGYxCi0gICAgICAgIFZUUk4gICAgZGYyLGRmMwotICAgICAgICBWVFJOICAgIHFmMDEscWYyMyAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICAgICAgICA7Ly8gQ29sb3VtbiBPcGVyYXRpb25zIAotICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFZBREQgICAgICAgIGRnMCxkZjAsZGYyICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTAgPSBkMCArIGQyIAotICAgICAgICBWU1VCICAgICAgICBkZzEsZGYwLGRmMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUxID0gZDAgLSBkMiAKLSAgICAgICAgVkhBREQgICAgICAgZGYxUlMsZGYxLGRaZXJvICAgICAgICAgICAgICAgICAgICAgOy8vIChmMT4+MSkgY29uc3RaZXJvIGlzIGEgcmVnaXN0ZXIgaG9sZGluZyAwCi0gICAgICAgIFZIQUREICAgICAgIGRmM1JTLGRmMyxkWmVybwotICAgICAgICBWU1VCICAgICAgICBkZzIsZGYxUlMsZGYzICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUyID0gKGQxPj4xKSAtIGQzIAotICAgICAgICBWQUREICAgICAgICBkZzMsZGYxLGRmM1JTICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMyA9IGQxICsgKGQzPj4xKSAKLSAgICAgICAgVkFERCAgICAgICAgZGgwLGRnMCxkZzMgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMCA9IGUwICsgZTMKLSAgICAgICAgVkFERCAgICAgICAgZGgxLGRnMSxkZzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMSA9IGUxICsgZTIKLSAgICAgICAgVlNVQiAgICAgICAgZGgyLGRnMSxkZzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMiA9IGUxIC0gZTIKLSAgICAgICAgVlNVQiAgICAgICAgZGgzLGRnMCxkZzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMyA9IGUwIC0gZTMKLSAgICAgICAgCi0gICAgICAgICAgICAgCi0gICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICA7Ly8gQ2FsY3VsYXRlIGZpbmFsIHZhbHVlIChjb2xPcFtpXVtqXSArIDMyKT4+NgotICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgCi0gICAgICAgIFZSU0hSICAgICAgIGRoMCwjNgotICAgICAgICBWUlNIUiAgICAgICBkaDEsIzYKLSAgICAgICAgVlJTSFIgICAgICAgZGgyLCM2Ci0gICAgICAgIFZSU0hSICAgICAgIGRoMywjNgotICAgICAgICAKLSAgICAgICAgICAgICAgIAotICAgICAgICBCICAgICAgIE91dERDY2FzZSAKLSAgICAgICAgCi0KLURDY2FzZQotICAgICAgICA7Ly8gQ2FsY3VsYXRlIHRoZSBUcmFuc2Zvcm1lZCBEQ3ZhbHVlIDogKERDdmFsKzMyKT4+NgotICAgICAgICBMRFJTSCAgIERDdmFsLFtwRENUZW1wXSAKLSAgICAgICAgQUREICAgICBEQ3ZhbCxEQ3ZhbCwjMzIgCi0gICAgICAgIEFTUiAgICAgREN2YWwsREN2YWwsIzYKLSAgICAgICAgCi0gICAgICAgIFZEVVAgICAgZERlbHRhUm93MCwgREN2YWwgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwRGVsdGFbMF0gID0gcERlbHRhWzFdICA9IHBEZWx0YVsyXSAgPSBwRGVsdGFbM10gPSBEQ3ZhbAotICAgICAgICBWRFVQICAgIGREZWx0YVJvdzEsIERDdmFsICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBEZWx0YVs0XSAgPSBwRGVsdGFbNV0gID0gcERlbHRhWzZdICA9IHBEZWx0YVs3XSA9IERDdmFsCi0gICAgICAgIFZEVVAgICAgZERlbHRhUm93MiwgREN2YWwgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcERlbHRhWzhdICA9IHBEZWx0YVs5XSAgPSBwRGVsdGFbMTBdID0gcERlbHRhWzExXSA9IERDdmFsCi0gICAgICAgIFZEVVAgICAgZERlbHRhUm93MywgREN2YWwKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotT3V0RENjYXNlICAgICAgCi0gICAgICAgIE1fTERSICAgcHJlZHN0ZXAscHJlZFN0ZXBPblN0YWNrCi0gICAgICAgIE1fTERSICAgZHN0U3RlcCxkc3RTdGVwT25TdGFjawotICAgICAgICAKLSAgICAgICAgTERSICAgICBQcmVkVmFsMSxbcFByZWRUZW1wXSxwcmVkc3RlcAotICAgICAgICBMRFIgICAgIFByZWRWYWwyLFtwUHJlZFRlbXBdLHByZWRzdGVwCi0gICAgICAgIFZNT1YgICAgZFByZWRWYWxSb3cwMSxQcmVkVmFsMSxQcmVkVmFsMgotICAgICAgICAKLSAgICAgICAgTERSICAgICBQcmVkVmFsMSxbcFByZWRUZW1wXSxwcmVkc3RlcAotICAgICAgICBMRFIgICAgIFByZWRWYWwyLFtwUHJlZFRlbXBdCi0gICAgICAgIFZNT1YgICAgZFByZWRWYWxSb3cyMyxQcmVkVmFsMSxQcmVkVmFsMgotIAotICAgICAgICAKLSAgICAgICAgVkFERFcgICBxU3VtUm93MDEscURlbHRhUm93MDEsZFByZWRWYWxSb3cwMQotICAgICAgICBWQUREVyAgIHFTdW1Sb3cyMyxxRGVsdGFSb3cyMyxkUHJlZFZhbFJvdzIzCi0gICAgICAgIFZRTU9WVU4gZERzdFJvdzAxLHFTdW1Sb3cwMQotICAgICAgICBWUU1PVlVOIGREc3RSb3cyMyxxU3VtUm93MjMKLSAgICAgICAgCi0gCi0gICAgICAgIFZTVDEgICAgZERzdFJvdzAsW3BEc3RUZW1wXSxkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgZERzdFJvdzEsW3BEc3RUZW1wXSxkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgZERzdFJvdzIsW3BEc3RUZW1wXSxkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgZERzdFJvdzMsW3BEc3RUZW1wXQotICAgICAgICAKLSAgICAgICAgOy8vIFNldCByZXR1cm4gdmFsdWUKLSAgICAgICAgTU9WICAgICByZXN1bHQsI09NWF9TdHNfTm9FcnIKLSAgICAgICAgCi1FbmQgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgCi0gICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiB0YWlsCi0gICAgICAgIAotICAgICAgICBNX0VORAotICAgICAgICAKLSAgICBFTkRJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9DT1JURVhBOCAgIAotICAgIAotICAgICAgICAgCi0gICAgICAgICAgICAKLSAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0lfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDk5ZGNiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0lfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotCi0gICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKLQotICAgICAgICBJRiBDb3J0ZXhBOAotCi0gICAgICAgIElNUE9SVCAgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNHRTRfdW5zYWZlCi0gICAgICAgIElNUE9SVCAgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNMVDRfdW5zYWZlCi0gICAgICAgIAotTE9PUF9DT1VOVCAgRVFVIDB4NDAwMDAwMDAKLU1BU0tfMyAgICAgIEVRVSAweDAzMDMwMzAzCi1NQVNLXzQgICAgICBFUVUgMHgwNDA0MDQwNAotCi07Ly8gRnVuY3Rpb24gYXJndW1lbnRzCi0KLXBTcmNEc3QgICAgIFJOIDAKLXNyY2RzdFN0ZXAgIFJOIDEKLXBBbHBoYSAgICAgIFJOIDIKLXBCZXRhICAgICAgIFJOIDMKLQotcFRocmVzaG9sZHMgUk4gNQotcEJTICAgICAgICAgUk4gNAotYlMzMjEwICAgICAgUk4gNgotCi07Ly8gTG9vcCAKLQotWFkgICAgICAgICAgUk4gNwotCi07Ly8gUGl4ZWxzCi1kUF8wICAgICAgICBETiBENC5VOAotZFBfMSAgICAgICAgRE4gRDUuVTggIAotZFBfMiAgICAgICAgRE4gRDYuVTggIAotZFFfMCAgICAgICAgRE4gRDguVTggIAotZFFfMSAgICAgICAgRE4gRDkuVTggIAotZFFfMiAgICAgICAgRE4gRDEwLlU4IAotCi07Ly8gRmlsdGVyaW5nIERlY2lzaW9uCi1kQWxwaGEgICAgICBETiBEMC5VOAotZEJldGEgICAgICAgRE4gRDIuVTgKLQotZEZpbHQgICAgICAgRE4gRDE2LlU4Ci1kQXFmbGcgICAgICBETiBEMTIuVTgKLWRBcGZsZyAgICAgIEROIEQxNy5VOCAKLQotZEFwMHEwICAgICAgRE4gRDEzLlU4Ci1kQXAxcDAgICAgICBETiBEMTIuVTgKLWRBcTFxMCAgICAgIEROIEQxOC5VOAotZEFwMnAwICAgICAgRE4gRDE5LlU4Ci1kQXEycTAgICAgICBETiBEMTcuVTgKLQotcUJTMzIxMCAgICAgUU4gUTEzLlUxNgotZEJTMzIxMCAgICAgRE4gRDI2Ci1kTWFza19icyAgICBETiBEMjcKLWRGaWx0X2JzICAgIEROIEQyNi5VMTYKLQotOy8vIGJTTFQ0Ci1kTWFza18wICAgICBETiBEMTQuVTgKLWRNYXNrXzEgICAgIEROIEQxNS5VOCAgICAKLWRNYXNrXzQgICAgIEROIEQxLlUxNgotCi1NYXNrXzQgICAgICBSTiA4Ci1NYXNrXzMgICAgICBSTiA5Ci0KLWRUZW1wICAgICAgIEROIEQxOS5VOAotCi07Ly8gUmVzdWx0Ci1kUF8wdCAgICAgICBETiBEMTMuVTggICAKLWRRXzB0ICAgICAgIEROIEQzMS5VOCAgIAotCi1kUF8wbiAgICAgICBETiBEMjkuVTgKLWRRXzBuICAgICAgIEROIEQyNC5VOAotCi0gICAgICAgIAotICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSwgcjksIGQxNQotICAgICAgICAKLSAgICAgICAgOy8vQXJndW1lbnRzIG9uIHRoZSBzdGFjawotICAgICAgICBNX0FSRyAgIHBwVGhyZXNob2xkcywgNAotICAgICAgICBNX0FSRyAgIHBwQlMsIDQKLSAgICAgICAgCi0gICAgICAgIDsvLyBkMC1kQWxwaGFfMAotICAgICAgICA7Ly8gZDItZEJldGFfMAotCi0gICAgICAgIDtsb2FkIGFscGhhMSxiZXRhMSBzb21ld2hlcmUgdG8gYXZvaWQgbW9yZSBsb2FkcwotICAgICAgICBWTEQxICAgICAgICB7ZEFscGhhW119LCBbcEFscGhhXSEKLSAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMxIDs/Ci0gICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAKLSAgICAgICAgVkxEMSAgICAgICAge2RCZXRhW119LCBbcEJldGFdISAKLSAgICAgICAgCi0gICAgICAgIE1fTERSICAgICAgIHBCUywgcHBCUwotICAgICAgICBNX0xEUiAgICAgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzIAotCi0gICAgICAgIExEUiAgICAgICAgIE1hc2tfMywgPU1BU0tfMwotICAgICAgICBMRFIgICAgICAgICBNYXNrXzQsID1NQVNLXzQKLQotICAgICAgICBWTU9WICAgICAgICBkTWFza18wLCAjMCAgICAgCi0gICAgICAgIFZNT1YgICAgICAgIGRNYXNrXzEsICMxICAgICAKLSAgICAgICAgVk1PViAgICAgICAgZE1hc2tfNCwgIzQgICAgIAotICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgWFksID1MT09QX0NPVU5UCi0KLSAgICAgICAgOy8vIHAwLXAzIC0gZDQtZDcKLSAgICAgICAgOy8vIHEwLXEzIC0gZDgtZDExCi1Mb29wWSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIGJTMzIxMCwgW3BCU10sICM4Ci0gICAgICAgIAotICAgICAgICBWTEQxICAgICAgICBkUF8yLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKLSAgICAgICAgOzEKLSAgICAgICAgVkxEMSAgICAgICAgZFBfMSwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCi0gICAgICAgIENNUCAgICAgICAgIGJTMzIxMCwgIzAKLSAgICAgICAgVkxEMSAgICAgICAgZFBfMCwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCi0gICAgICAgIDsxCi0gICAgICAgIFZMRDEgICAgICAgIGRRXzAsIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAotICAgICAgICBWQUJEICAgICAgICBkQXAycDAsIGRQXzIsIGRQXzAKLSAgICAgICAgVkxEMSAgICAgICAgZFFfMSwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCi0gICAgICAgIFZBQkQgICAgICAgIGRBcDBxMCwgZFBfMCwgZFFfMAotICAgICAgICBWTEQxICAgICAgICBkUV8yLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKLSAgICAgICAgQkVRICAgICAgICAgTm9GaWx0ZXJCUzAKLQotICAgICAgICBWQUJEICAgICAgICBkQXAxcDAsIGRQXzEsIGRQXzAKLSAgICAgICAgVkFCRCAgICAgICAgZEFxMXEwLCBkUV8xLCBkUV8wCi0KLSAgICAgICAgVkNHVCAgICAgICAgZEZpbHQsIGRBbHBoYSwgZEFwMHEwCi0gICAgICAgIFZNT1YuVTMyICAgIGRCUzMyMTBbMF0sIGJTMzIxMAotICAgICAgICBWTUFYICAgICAgICBkQXAxcDAsIGRBcTFxMCwgZEFwMXAwCi0gICAgICAgIFZNT1ZMICAgICAgIHFCUzMyMTAsIGRCUzMyMTAuVTgKLSAgICAgICAgVkFCRCAgICAgICAgZEFxMnEwLCBkUV8yLCBkUV8wCi0gICAgICAgIFZDR1QgICAgICAgIGRNYXNrX2JzLlMxNiwgZEJTMzIxMC5TMTYsICMwCi0KLSAgICAgICAgVkNHVCAgICAgICAgZEFwMXAwLCBkQmV0YSwgZEFwMXAwIAotICAgICAgICBWQ0dUICAgICAgICBkQXAycDAsIGRCZXRhLCBkQXAycDAKLSAgICAgICAgCi0gICAgICAgIFZBTkQgICAgICAgIGRGaWx0LCBkTWFza19icy5VOAotCi0gICAgICAgIFRTVCAgICAgICAgIGJTMzIxMCwgTWFza18zCi0KLSAgICAgICAgVkNHVCAgICAgICAgZEFxMnEwLCBkQmV0YSwgZEFxMnEwCi0gICAgICAgIFZBTkQgICAgICAgIGRGaWx0LCBkRmlsdCwgZEFwMXAwCi0KLSAgICAgICAgVkFORCAgICAgICAgZEFxZmxnLCBkRmlsdCwgZEFxMnEwCi0gICAgICAgIFZBTkQgICAgICAgIGRBcGZsZywgZEZpbHQsIGRBcDJwMAotICAgICAgICAKLSAgICAgICAgOy8vIGJTIDwgNCBGaWx0ZXJpbmcKLSAgICAgICAgQkxORSAgICAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNMVDRfdW5zYWZlCi0KLSAgICAgICAgVFNUICAgICAgICAgYlMzMjEwLCBNYXNrXzQgICAgICAgIAotCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMgotICAgICAgICBWVFNUICAgICAgICBkRmlsdF9icywgZEZpbHRfYnMsIGRNYXNrXzQKLQotICAgICAgICA7Ly8gYlMgPT0gNCBGaWx0ZXJpbmcKLSAgICAgICAgQkxORSAgICAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNHRTRfdW5zYWZlCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICBWQklUICAgICAgICBkUF8wbiwgZFBfMHQsIGRGaWx0X2JzCi0gICAgICAgIFZCSVQgICAgICAgIGRRXzBuLCBkUV8wdCwgZEZpbHRfYnMKLSAgICAgICAgCi0gICAgICAgIFZCSUYgICAgICAgIGRQXzBuLCBkUF8wLCBkRmlsdCAgICAgIAotICAgICAgICBWQklGICAgICAgICBkUV8wbiwgZFFfMCwgZEZpbHQgIAotCi0gICAgICAgIDsvLyBSZXN1bHQgU3RvcmFnZQotICAgICAgICBWU1QxICAgICAgICBkUF8wbiwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCi0gICAgICAgIEFERFMgICAgICAgIFhZLCBYWSwgWFkKLSAgICAgICAgVlNUMSAgICAgICAgZFFfMG4sIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAotCi0gICAgICAgIEJORSAgICAgICAgIExvb3BZICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgICAgIHIwLCAjT01YX1N0c19Ob0VycgotCi0gICAgICAgIE1fRVhJVAotICAgICAgICAKLU5vRmlsdGVyQlMwCi0KLSAgICAgICAgVkxEMSAgICAgICAge2RBbHBoYVtdfSwgW3BBbHBoYV0KLSAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMxCi0gICAgICAgIEFERFMgICAgICAgIFhZLCBYWSwgWFkKLSAgICAgICAgVkxEMSAgICAgICAge2RCZXRhW119LCBbcEJldGFdCi0gICAgICAgIEFERCAgICAgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzQKLSAgICAgICAgQk5FICAgICAgICAgTG9vcFkgICAgICAgIAotCi0gICAgICAgIE1PViAgICAgICAgIHIwLCAjT01YX1N0c19Ob0VycgotICAgICAgICBNX0VORAotICAgICAgICAKLSAgICAgICAgRU5ESUYKLSAgICAgICAgCi0KLSAgICAgICAgRU5ECi0gICAgICAgIAotICAgICAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjIxNTJjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTYgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLQotICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4Ci0KLSAgICAgICAgSUYgQ29ydGV4QTgKLQotICAgICAgICBJTVBPUlQgIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTR0U0X3Vuc2FmZQotICAgICAgICBJTVBPUlQgIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTTFQ0X3Vuc2FmZQotICAgICAgICAKLUxPT1BfQ09VTlQgIEVRVSAweDQwMDAwMDAwCi1NQVNLXzMgICAgICBFUVUgMHgwMzAzMDMwMwotTUFTS180ICAgICAgRVFVIDB4MDQwNDA0MDQKLQotOy8vIEZ1bmN0aW9uIGFyZ3VtZW50cwotCi1wU3JjRHN0ICAgICBSTiAwCi1zcmNkc3RTdGVwICBSTiAxCi1wQWxwaGEgICAgICBSTiAyCi1wQmV0YSAgICAgICBSTiAzCi0KLXBUaHJlc2hvbGRzIFJOIDUKLXBCUyAgICAgICAgIFJOIDQKLWJTMzIxMCAgICAgIFJOIDYKLXBTcmNEc3RfUCAgIFJOIDEwCi1wU3JjRHN0X1EgICBSTiAxMgotCi1wVG1wICAgICAgICBSTiAxMAotcFRtcDIgICAgICAgUk4gMTIKLXN0ZXAgICAgICAgIFJOIDE0Ci0KLTsvLyBMb29wIAotCi1YWSAgICAgICAgICBSTiA3Ci0KLTsvLyBSb3dzIGlucHV0Ci1kUm93MCAgICAgICBETiBENy5VOAotZFJvdzEgICAgICAgRE4gRDguVTggIAotZFJvdzIgICAgICAgRE4gRDUuVTggIAotZFJvdzMgICAgICAgRE4gRDEwLlU4ICAKLWRSb3c0ICAgICAgIEROIEQ2LlU4ICAKLWRSb3c1ICAgICAgIEROIEQ5LlU4ICAKLWRSb3c2ICAgICAgIEROIEQ0LlU4IAotZFJvdzcgICAgICAgRE4gRDExLlU4IAotCi0KLTsvLyBQaXhlbHMKLWRQXzAgICAgICAgIEROIEQ0LlU4Ci1kUF8xICAgICAgICBETiBENS5VOCAgCi1kUF8yICAgICAgICBETiBENi5VOCAgCi1kUV8wICAgICAgICBETiBEOC5VOCAgCi1kUV8xICAgICAgICBETiBEOS5VOCAgCi1kUV8yICAgICAgICBETiBEMTAuVTggCi0KLTsvLyBGaWx0ZXJpbmcgRGVjaXNpb24KLWRBbHBoYSAgICAgIEROIEQwLlU4Ci1kQmV0YSAgICAgICBETiBEMi5VOAotCi1kRmlsdCAgICAgICBETiBEMTYuVTgKLWRBcWZsZyAgICAgIEROIEQxMi5VOAotZEFwZmxnICAgICAgRE4gRDE3LlU4IAotCi1kQXAwcTAgICAgICBETiBEMTMuVTgKLWRBcDFwMCAgICAgIEROIEQxMi5VOAotZEFxMXEwICAgICAgRE4gRDE4LlU4Ci1kQXAycDAgICAgICBETiBEMTkuVTgKLWRBcTJxMCAgICAgIEROIEQxNy5VOAotCi1xQlMzMjEwICAgICBRTiBRMTMuVTE2Ci1kQlMzMjEwICAgICBETiBEMjYKLWRNYXNrX2JzICAgIEROIEQyNwotZEZpbHRfYnMgICAgRE4gRDI2LlUxNgotCi07Ly8gYlNMVDQKLWRNYXNrXzAgICAgIEROIEQxNC5VOAotZE1hc2tfMSAgICAgRE4gRDE1LlU4ICAgIAotZE1hc2tfNCAgICAgRE4gRDEuVTE2Ci0KLU1hc2tfNCAgICAgIFJOIDgKLU1hc2tfMyAgICAgIFJOIDkKLQotZFRlbXAgICAgICAgRE4gRDE5LlU4Ci0KLTsvLyBSZXN1bHQKLWRQXzB0ICAgICAgIEROIEQxMy5VOCAgIAotZFFfMHQgICAgICAgRE4gRDMxLlU4ICAgCi0KLWRQXzBuICAgICAgIEROIEQyOS5VOAotZFFfMG4gICAgICAgRE4gRDI0LlU4Ci0KLSAgICAgICAgCi0gICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JLCByMTIsIGQxNQotICAgICAgICAKLSAgICAgICAgOy8vQXJndW1lbnRzIG9uIHRoZSBzdGFjawotICAgICAgICBNX0FSRyAgIHBwVGhyZXNob2xkcywgNAotICAgICAgICBNX0FSRyAgIHBwQlMsIDQKLSAgICAgICAgCi0gICAgICAgIDsvLyBkMC1kQWxwaGFfMAotICAgICAgICA7Ly8gZDItZEJldGFfMAotCi0gICAgICAgIDtsb2FkIGFscGhhMSxiZXRhMSBzb21ld2hlcmUgdG8gYXZvaWQgbW9yZSBsb2FkcwotICAgICAgICBWTEQxICAgICAgICB7ZEFscGhhW119LCBbcEFscGhhXSEKLSAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgIzQKLSAgICAgICAgVkxEMSAgICAgICAge2RCZXRhW119LCBbcEJldGFdISAKLSAgICAgICAgCi0gICAgICAgIE1fTERSICAgICAgIHBCUywgcHBCUwotICAgICAgICBNX0xEUiAgICAgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzIAotCi0gICAgICAgIExEUiAgICAgICAgIE1hc2tfNCwgPU1BU0tfNAotICAgICAgICBMRFIgICAgICAgICBNYXNrXzMsID1NQVNLXzMKLQotICAgICAgICA7ZE1hc2tfMC0xNAotICAgICAgICA7ZE1hc2tfMS0xNQotICAgICAgICA7ZE1hc2tfNC0xOQotCi0gICAgICAgIFZNT1YgICAgICAgIGRNYXNrXzAsICMwICAgICAKLSAgICAgICAgVk1PViAgICAgICAgZE1hc2tfMSwgIzEgICAgIAotICAgICAgICBWTU9WICAgICAgICBkTWFza180LCAjNCAgICAgCi0gICAgICAgIAotICAgICAgICBMRFIgICAgICAgICBYWSwgPUxPT1BfQ09VTlQKLQotICAgICAgICA7Ly8gcDAtcDMgLSBkNC1kNwotICAgICAgICA7Ly8gcTAtcTMgLSBkOC1kMTEKLQotCi1Mb29wWSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIGJTMzIxMCwgW3BCU10sICM4Ci0gICAgICAgIEFERCAgICAgICAgIHBUbXAsIHBTcmNEc3QsIHNyY2RzdFN0ZXAKLSAgICAgICAgQUREICAgICAgICAgc3RlcCwgc3JjZHN0U3RlcCwgc3JjZHN0U3RlcAotICAgICAgICAKLSAgICAgICAgOzEKLSAgICAgICAgVkxEMSAgICAgICAgZFJvdzAsIFtwU3JjRHN0XSwgc3RlcAotICAgICAgICA7MQotICAgICAgICBWTEQxICAgICAgICBkUm93MSwgW3BUbXBdLCBzdGVwCi0gICAgICAgIFZMRDEgICAgICAgIGRSb3cyLCBbcFNyY0RzdF0sIHN0ZXAKLSAgICAgICAgVkxEMSAgICAgICAgZFJvdzMsIFtwVG1wXSwgc3RlcAotICAgICAgICBWTEQxICAgICAgICBkUm93NCwgW3BTcmNEc3RdLCBzdGVwCi0gICAgICAgIFZMRDEgICAgICAgIGRSb3c1LCBbcFRtcF0sIHN0ZXAKLSAgICAgICAgVkxEMSAgICAgICAgZFJvdzYsIFtwU3JjRHN0XSwgc3RlcAotICAgICAgICBWTEQxICAgICAgICBkUm93NywgW3BUbXBdLCBzdGVwCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIGRSb3cwID0gW3EzcjAgcTJyMCBxMXIwIHEwcjAgcDByMCBwMXIwIHAycjAgcDNyMF0KLSAgICAgICAgOy8vIGRSb3cxID0gW3EzcjEgcTJyMSBxMXIxIHEwcjEgcDByMSBwMXIxIHAycjEgcDNyMV0KLSAgICAgICAgOy8vIGRSb3cyID0gW3EzcjIgcTJyMiBxMXIyIHEwcjIgcDByMiBwMXIyIHAycjIgcDNyMl0KLSAgICAgICAgOy8vIGRSb3czID0gW3EzcjMgcTJyMyBxMXIzIHEwcjMgcDByMyBwMXIzIHAycjMgcDNyM10KLSAgICAgICAgOy8vIGRSb3c0ID0gW3EzcjQgcTJyNCBxMXI0IHEwcjQgcDByNCBwMXI0IHAycjQgcDNyNF0KLSAgICAgICAgOy8vIGRSb3c1ID0gW3EzcjUgcTJyNSBxMXI1IHEwcjUgcDByNSBwMXI1IHAycjUgcDNyNV0KLSAgICAgICAgOy8vIGRSb3c2ID0gW3EzcjYgcTJyNiBxMXI2IHEwcjYgcDByNiBwMXI2IHAycjYgcDNyNl0KLSAgICAgICAgOy8vIGRSb3c3ID0gW3EzcjcgcTJyNyBxMXI3IHEwcjcgcDByNyBwMXI3IHAycjcgcDNyN10KLQotICAgICAgICA7Ly8gOHg4IFRyYW5zcG9zZQotICAgICAgICBWWklQLjggICAgICBkUm93MCwgZFJvdzEKLSAgICAgICAgVlpJUC44ICAgICAgZFJvdzIsIGRSb3czCi0gICAgICAgIFZaSVAuOCAgICAgIGRSb3c0LCBkUm93NQotICAgICAgICBWWklQLjggICAgICBkUm93NiwgZFJvdzcKLQotICAgICAgICBWWklQLjE2ICAgICBkUm93MCwgZFJvdzIKLSAgICAgICAgVlpJUC4xNiAgICAgZFJvdzEsIGRSb3czCi0gICAgICAgIFZaSVAuMTYgICAgIGRSb3c0LCBkUm93NgotICAgICAgICBWWklQLjE2ICAgICBkUm93NSwgZFJvdzcKLQotICAgICAgICBWWklQLjMyICAgICBkUm93MCwgZFJvdzQKLSAgICAgICAgVlpJUC4zMiAgICAgZFJvdzIsIGRSb3c2Ci0gICAgICAgIFZaSVAuMzIgICAgIGRSb3czLCBkUm93NwotICAgICAgICBWWklQLjMyICAgICBkUm93MSwgZFJvdzUKLQotCi0gICAgICAgIDtSZWFsaWduIHRoZSBwb2ludGVycwotCi0gICAgICAgIENNUCAgICAgICAgIGJTMzIxMCwgIzAKLSAgICAgICAgVkFCRCAgICAgICAgZEFwMnAwLCBkUF8yLCBkUF8wCi0gICAgICAgIFZBQkQgICAgICAgIGRBcDBxMCwgZFBfMCwgZFFfMAotICAgICAgICBCRVEgICAgICAgICBOb0ZpbHRlckJTMAotCi0gICAgICAgIFZBQkQgICAgICAgIGRBcDFwMCwgZFBfMSwgZFBfMAotICAgICAgICBWQUJEICAgICAgICBkQXExcTAsIGRRXzEsIGRRXzAKLQotICAgICAgICBWTU9WLlUzMiAgICBkQlMzMjEwWzBdLCBiUzMyMTAKLSAgICAgICAgVkNHVCAgICAgICAgZEZpbHQsIGRBbHBoYSwgZEFwMHEwCi0gICAgICAgIFZNQVggICAgICAgIGRBcDFwMCwgZEFxMXEwLCBkQXAxcDAKLSAgICAgICAgVk1PVkwgICAgICAgcUJTMzIxMCwgZEJTMzIxMC5VOAotICAgICAgICBWQUJEICAgICAgICBkQXEycTAsIGRRXzIsIGRRXzAKLSAgICAgICAgVkNHVCAgICAgICAgZE1hc2tfYnMuUzE2LCBkQlMzMjEwLlMxNiwgIzAKLQotICAgICAgICBWQ0dUICAgICAgICBkQXAxcDAsIGRCZXRhLCBkQXAxcDAKLSAgICAgICAgVkNHVCAgICAgICAgZEFwMnAwLCBkQmV0YSwgZEFwMnAwCi0gICAgICAgIFZBTkQgICAgICAgIGRGaWx0LCBkTWFza19icy5VOAotCi0gICAgICAgIFRTVCAgICAgICAgIGJTMzIxMCwgTWFza18zCi0KLSAgICAgICAgVkNHVCAgICAgICAgZEFxMnEwLCBkQmV0YSwgZEFxMnEwCi0gICAgICAgIFZBTkQgICAgICAgIGRGaWx0LCBkRmlsdCwgZEFwMXAwCi0KLSAgICAgICAgVkFORCAgICAgICAgZEFxZmxnLCBkRmlsdCwgZEFxMnEwCi0gICAgICAgIFZBTkQgICAgICAgIGRBcGZsZywgZEZpbHQsIGRBcDJwMAotCi0gICAgICAgIDsvLyBiUyA8IDQgRmlsdGVyaW5nCi0gICAgICAgIEJMTkUgICAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTTFQ0X3Vuc2FmZQotCi0gICAgICAgIFRTVCAgICAgICAgIGJTMzIxMCwgTWFza180ICAgICAgICAKLQotICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwLCBMU0wgIzMKLSAgICAgICAgVlRTVCAgICAgICAgZEZpbHRfYnMsIGRGaWx0X2JzLCBkTWFza180Ci0KLSAgICAgICAgOy8vIGJTID09IDQgRmlsdGVyaW5nCi0gICAgICAgIEJMTkUgICAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTR0U0X3Vuc2FmZQotCi0gICAgICAgIFZCSVQgICAgICAgIGRQXzBuLCBkUF8wdCwgZEZpbHRfYnMKLSAgICAgICAgVkJJVCAgICAgICAgZFFfMG4sIGRRXzB0LCBkRmlsdF9icwotCi0gICAgICAgIDsvLyBSZXN1bHQgU3RvcmFnZQotICAgICAgICBBREQgICAgICAgICBwU3JjRHN0X1AsIHBTcmNEc3QsICMzCi0gICAgICAgIFZCSUYgICAgICAgIGRQXzBuLCBkUF8wLCBkRmlsdCAgICAgIAotICAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgcFRtcDIsIHBTcmNEc3RfUCwgc3JjZHN0U3RlcAotICAgICAgICBBREQgICAgICAgICBzdGVwLCBzcmNkc3RTdGVwLCBzcmNkc3RTdGVwCi0gICAgICAgIFZCSUYgICAgICAgIGRRXzBuLCBkUV8wLCBkRmlsdCAgCi0KLSAgICAgICAgQUREUyAgICAgICAgWFksIFhZLCBYWQotICAgICAgICAKLSAgICAgICAgVlNUMSAgICAgICAge2RQXzBuWzBdfSwgW3BTcmNEc3RfUF0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAge2RQXzBuWzFdfSwgW3BUbXAyXSwgc3RlcAotICAgICAgICBWU1QxICAgICAgICB7ZFBfMG5bMl19LCBbcFNyY0RzdF9QXSwgc3RlcAotICAgICAgICBWU1QxICAgICAgICB7ZFBfMG5bM119LCBbcFRtcDJdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHtkUF8wbls0XX0sIFtwU3JjRHN0X1BdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHtkUF8wbls1XX0sIFtwVG1wMl0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAge2RQXzBuWzZdfSwgW3BTcmNEc3RfUF0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAge2RQXzBuWzddfSwgW3BUbXAyXSwgc3RlcAotICAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgcFNyY0RzdF9RLCBwU3JjRHN0LCAjNAotICAgICAgICBBREQgICAgICAgICBwVG1wLCBwU3JjRHN0X1EsIHNyY2RzdFN0ZXAKLSAgICAgICAgCi0gICAgICAgIFZTVDEgICAgICAgIHtkUV8wblswXX0sIFtwU3JjRHN0X1FdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHtkUV8wblsxXX0sIFtwVG1wXSwgc3RlcAotICAgICAgICBWU1QxICAgICAgICB7ZFFfMG5bMl19LCBbcFNyY0RzdF9RXSwgc3RlcAotICAgICAgICBWU1QxICAgICAgICB7ZFFfMG5bM119LCBbcFRtcF0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAge2RRXzBuWzRdfSwgW3BTcmNEc3RfUV0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAge2RRXzBuWzVdfSwgW3BUbXBdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHtkUV8wbls2XX0sIFtwU3JjRHN0X1FdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHtkUV8wbls3XX0sIFtwVG1wXSwgc3RlcAotICAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgIzQKLQotICAgICAgICBCTkUgICAgICAgICBMb29wWSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICAgICByMCwgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgCi0gICAgICAgIE1fRVhJVAotICAgICAgICAKLU5vRmlsdGVyQlMwCi0gICAgICAgIFZMRDEgICAgICAgIHtkQWxwaGFbXX0sIFtwQWxwaGFdCi0gICAgICAgIEFERCAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsICM0Ci0gICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMwotICAgICAgICBBRERTICAgICAgICBYWSwgWFksIFhZCi0gICAgICAgIFZMRDEgICAgICAgIHtkQmV0YVtdfSwgW3BCZXRhXQotICAgICAgICBBREQgICAgICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICM0Ci0gICAgICAgIEJORSAgICAgICAgIExvb3BZICAgICAgICAKLQotICAgICAgICBNT1YgICAgICAgICByMCwgI09NWF9TdHNfTm9FcnIKLQotICAgICAgICBNX0VORAotICAgICAgICAKLSAgICAgICAgRU5ESUYKLQotCi0gICAgICAgIEVORAotICAgICAgICAKLSAgICAgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Njc4NjcwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMzAyICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotCi0gICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKLQotICAgICAgICBJTVBPUlQgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKLSAgICAgICAgSU1QT1JUICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlCi0KLSAgICAgICAgSUYgQ29ydGV4QTgKLQotTE9PUF9DT1VOVCAgRVFVIDB4NTUwMDAwMDAKLQotCi07Ly8gRnVuY3Rpb24gYXJndW1lbnRzCi0KLXBTcmNEc3QgICAgIFJOIDAKLXNyY2RzdFN0ZXAgIFJOIDEKLXBBbHBoYSAgICAgIFJOIDIKLXBCZXRhICAgICAgIFJOIDMKLQotcFRocmVzaG9sZHMgUk4gNQotcEJTICAgICAgICAgUk4gNAotYlMxMCAgICAgICAgUk4gMTIKLQotcEFscGhhXzAgICAgUk4gMgotcEJldGFfMCAgICAgUk4gMwotCi1wQWxwaGFfMSAgICBSTiA3Ci1wQmV0YV8xICAgICBSTiA4Ci0KLQotCi07Ly8gTG9vcCAKLQotWFkgICAgICAgICAgUk4gOQotCi1wVG1wICAgICAgICBSTiA2Ci1zdGVwICAgICAgICBSTiAxMAotCi07Ly8gUGl4ZWxzCi1kUF8wICAgICAgICBETiBENC5VOAotZFBfMSAgICAgICAgRE4gRDUuVTggIAotZFBfMiAgICAgICAgRE4gRDYuVTggIAotZFBfMyAgICAgICAgRE4gRDcuVTggIAotZFFfMCAgICAgICAgRE4gRDguVTggIAotZFFfMSAgICAgICAgRE4gRDkuVTggIAotZFFfMiAgICAgICAgRE4gRDEwLlU4IAotZFFfMyAgICAgICAgRE4gRDExLlU4IAotCi0KLTsvLyBGaWx0ZXJpbmcgRGVjaXNpb24KLWRBbHBoYSAgICAgIEROIEQwLlU4Ci1kQmV0YSAgICAgICBETiBEMi5VOAotCi1kRmlsdCAgICAgICBETiBEMTYuVTgKLWRBcWZsZyAgICAgIEROIEQxMi5VOAotZEFwZmxnICAgICAgRE4gRDE3LlU4IAotCi1kQXAwcTAgICAgICBETiBEMTMuVTgKLWRBcDFwMCAgICAgIEROIEQxMi5VOAotZEFxMXEwICAgICAgRE4gRDE4LlU4Ci1kQXAycDAgICAgICBETiBEMTkuVTgKLWRBcTJxMCAgICAgIEROIEQxNy5VOAotCi07Ly8gYlNMVDQKLWRUQzAgICAgICAgIEROIEQxOC5VOCAgIAotZFRDMSAgICAgICAgRE4gRDE5LlU4ICAgCi1kVEMwMSAgICAgICBETiBEMTguVTggICAKLQotZFRDcyAgICAgICAgRE4gRDMxLlM4Ci1kVEMgICAgICAgICBETiBEMzEuVTgKLQotZE1hc2tfMCAgICAgRE4gRDE0LlU4Ci1kTWFza18xICAgICBETiBEMTUuVTggICAgCi0KLU1hc2tfMCAgICAgIFJOIDExCi0KLWRUZW1wICAgICAgIEROIEQxOS5VOAotCi07Ly8gQ29tcHV0aW5nIFAwLFEwCi1xRHEwcDAgICAgICBRTiBRMTAuUzE2Ci1xRHAxcTEgICAgICBRTiBRMTEuUzE2Ci1xRGVsdGEgICAgICBRTiBRMTAuUzE2ICA7IHJldXNlIHFEcTBwMAotZERlbHRhICAgICAgRE4gRDIwLlM4Ci0KLQotOy8vIENvbXB1dGluZyBQMSxRMQotZFJwMHEwICAgICAgRE4gRDI0LlU4Ci0KLWRNYXhQICAgICAgIEROIEQyMy5VOAotZE1pblAgICAgICAgRE4gRDIyLlU4Ci0KLWRNYXhRICAgICAgIEROIEQxOS5VOAotZE1pblEgICAgICAgRE4gRDIxLlU4Ci0KLWREZWx0YVAgICAgIEROIEQyNi5VOAotZERlbHRhUSAgICAgRE4gRDI3LlU4Ci0KLXFQXzBuICAgICAgIFFOIFExNC5TMTYKLXFRXzBuICAgICAgIFFOIFExMi5TMTYKLQotZFFfMG4gICAgICAgRE4gRDI0LlU4Ci1kUV8xbiAgICAgICBETiBEMjUuVTgKLWRQXzBuICAgICAgIEROIEQyOS5VOAotZFBfMW4gICAgICAgRE4gRDMwLlU4Ci0KLTsvLyBiU0dFNAotCi1xU3AwcTAgICAgICBRTiBRMTAuVTE2Ci0KLXFTcDJxMSAgICAgIFFOIFExMS5VMTYKLXFTcDBxMHAxICAgIFFOIFExMi5VMTYKLXFTcDNwMiAgICAgIFFOIFExMy5VMTYKLWRIU3AwcTEgICAgIEROIEQyOC5VOAotCi1xU3EycDEgICAgICBRTiBRMTEuVTE2Ci1xU3AwcTBxMSAgICBRTiBRMTIuVTE2Ci1xU3EzcTIgICAgICBRTiBRMTMuVTE2ICA7ISEKLWRIU3EwcDEgICAgIEROIEQyOC5VOCAgIDshIQotCi1xVGVtcDEgICAgICBRTiBRMTEuVTE2ICA7ISE7cVNwMnExIAotcVRlbXAyICAgICAgUU4gUTEyLlUxNiAgOyEhO3FTcDBxMHAxICAgICAgICAKLQotZFBfMHQgICAgICAgRE4gRDI4LlU4ICAgOyEhO2RIU3AwcTEgICAgICAgIAotZFFfMHQgICAgICAgRE4gRDIyLlU4ICAgOyEhO1RlbXAxICAgICAgICAKLQotZFBfMG4gICAgICAgRE4gRDI5LlU4Ci1kUF8xbiAgICAgICBETiBEMzAuVTgKLWRQXzJuICAgICAgIEROIEQzMS5VOAotCi1kUV8wbiAgICAgICBETiBEMjQuVTggICA7ISE7VGVtcDIgICAgICAgIAotZFFfMW4gICAgICAgRE4gRDI1LlU4ICAgOyEhO1RlbXAyICAgICAgICAKLWRRXzJuICAgICAgIEROIEQyOC5VOCAgIDshITtkUV8wdCAgICAgICAgCi0KLSAgICAgICAgCi0gICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSwgcjExLCBkMTUKLSAgICAgICAgCi0gICAgICAgIDsvL0FyZ3VtZW50cyBvbiB0aGUgc3RhY2sKLSAgICAgICAgTV9BUkcgICBwcFRocmVzaG9sZHMsIDQKLSAgICAgICAgTV9BUkcgICBwcEJTLCA0Ci0gICAgICAgIAotICAgICAgICA7Ly8gZDAtZEFscGhhXzAKLSAgICAgICAgOy8vIGQyLWRCZXRhXzAKLQotICAgICAgICBBREQgICAgICAgICBwQWxwaGFfMSwgcEFscGhhXzAsICMxCi0gICAgICAgIEFERCAgICAgICAgIHBCZXRhXzEsIHBCZXRhXzAsICMxCi0gICAgICAgIAotICAgICAgICBWTEQxICAgICAgICB7ZEFscGhhW119LCBbcEFscGhhXzBdCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMgotICAgICAgICBWTEQxICAgICAgICB7ZEJldGFbXX0sIFtwQmV0YV8wXSAKLSAgICAgICAgCi0gICAgICAgIE1fTERSICAgICAgIHBCUywgcHBCUwotICAgICAgICBNX0xEUiAgICAgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzIAotCi0gICAgICAgIE1PViAgICAgICAgIE1hc2tfMCwjMAotCi0gICAgICAgIDtkTWFza18wLTE0Ci0gICAgICAgIDtkTWFza18xLTE1Ci0KLSAgICAgICAgVk1PViAgICAgICAgZE1hc2tfMCwgIzAgICAgIAotICAgICAgICBWTU9WICAgICAgICBkTWFza18xLCAjMSAgICAgCi0gICAgICAgIAotICAgICAgICBBREQgICAgICAgICBzdGVwLCBzcmNkc3RTdGVwLCBzcmNkc3RTdGVwCi0KLSAgICAgICAgTERSICAgICAgICAgWFksPUxPT1BfQ09VTlQKLQotICAgICAgICA7Ly8gcDAtcDMgLSBkNC1kNwotICAgICAgICA7Ly8gcTAtcTMgLSBkOC1kMTEKLUxvb3BZICAgICAgICAKLUxvb3BYICAgICAgICAKLSAgICAgICAgTERSSCAgICAgICAgYlMxMCwgW3BCU10sICMyCi0gICAgICAgIEFERCAgICAgICAgIHBUbXAsIHBTcmNEc3QsIHNyY2RzdFN0ZXAKLSAgICAgICAgQ01QICAgICAgICAgYlMxMCwgIzAKLSAgICAgICAgQkVRICAgICAgICAgTm9GaWx0ZXJCUzAKLQotICAgICAgICBWTEQxICAgICAgICBkUF8zLCBbcFNyY0RzdF0sIHN0ZXAKLSAgICAgICAgVkxEMSAgICAgICAgZFBfMiwgW3BUbXBdLCBzdGVwCi0gICAgICAgIFZMRDEgICAgICAgIGRQXzEsIFtwU3JjRHN0XSwgc3RlcAotICAgICAgICBWTEQxICAgICAgICBkUF8wLCBbcFRtcF0sIHN0ZXAKLSAgICAgICAgVkxEMSAgICAgICAgZFFfMCwgW3BTcmNEc3RdLCBzdGVwCi0gICAgICAgIFZBQkQgICAgICAgIGRBcDFwMCwgZFBfMCwgZFBfMQotICAgICAgICBWTEQxICAgICAgICBkUV8xLCBbcFRtcF0KLSAgICAgICAgVkFCRCAgICAgICAgZEFwMHEwLCBkUV8wLCBkUF8wCi0gICAgICAgIFZMRDEgICAgICAgIGRRXzIsIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAotICAgICAgICAKLSAgICAgICAgVkFCRCAgICAgICAgZEFxMXEwLCBkUV8xLCBkUV8wCi0gICAgICAgIFZBQkQgICAgICAgIGRBcDJwMCwgZFBfMiwgZFBfMAotICAgICAgICBWQ0dUICAgICAgICBkRmlsdCwgZEFscGhhLCBkQXAwcTAKLQotICAgICAgICBUU1QgICAgICAgICBiUzEwLCAjMHhmZgotICAgICAgICBWTUFYICAgICAgICBkQXAxcDAsIGRBcTFxMCwgZEFwMXAwCi0gICAgICAgIFZBQkQgICAgICAgIGRBcTJxMCwgZFFfMiwgZFFfMAotCi0gICAgICAgIFZNT1ZFUS5VMzIgIGRGaWx0WzBdLCBNYXNrXzAKLSAgICAgICAgVFNUICAgICAgICAgYlMxMCwgIzB4ZmYwMAotCi0gICAgICAgIFZDR1QgICAgICAgIGRBcDJwMCwgZEJldGEsIGRBcDJwMAotICAgICAgICBWQ0dUICAgICAgICBkQXAxcDAsIGRCZXRhLCBkQXAxcDAKLQotICAgICAgICBWTU9WRVEuVTMyICBkRmlsdFsxXSwgTWFza18wCi0KLSAgICAgICAgVkNHVCAgICAgICAgZEFxMnEwLCBkQmV0YSwgZEFxMnEwCi0gICAgICAgIFZMRDEgICAgICAgIGRRXzMsIFtwU3JjRHN0XQotICAgICAgICBWQU5EICAgICAgICBkRmlsdCwgZEZpbHQsIGRBcDFwMAotICAgICAgICBUU1QgICAgICAgICBiUzEwLCAjNCAKLQotICAgICAgICBWQU5EICAgICAgICBkQXFmbGcsIGRGaWx0LCBkQXEycTAKLSAgICAgICAgVkFORCAgICAgICAgZEFwZmxnLCBkRmlsdCwgZEFwMnAwCi0gICAgCi0gICAgICAgIEJORSAgICAgICAgIGJTR0U0ICAgICAgICAKLWJTTFQ0Ci0gICAgICAgIDsvLyBiUyA8IDQgRmlsdGVyaW5nCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMgotICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwCi0KLSAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQotCi0gICAgICAgIDsvLyBSZXN1bHQgU3RvcmFnZQotICAgICAgICBWU1QxICAgICAgICBkUF8xbiwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRQXzBuLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKLSAgICAgICAgU1VCICAgICAgICAgcFRtcCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMyCi0gICAgICAgIFZTVDEgICAgICAgIGRRXzBuLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKLSAgICAgICAgQUREUyAgICAgICAgWFksIFhZLCBYWQotICAgICAgICBWU1QxICAgICAgICBkUV8xbiwgW3BTcmNEc3RdCi0gICAgICAgIEFERCAgICAgICAgIHBTcmNEc3QsIHBUbXAsICM4Ci0KLSAgICAgICAgQkNDICAgICAgICAgTG9vcFgKLSAgICAgICAgQiAgICAgICAgICAgRXhpdExvb3BZICAgICAgICAKLQotTm9GaWx0ZXJCUzAKLSAgICAgICAgQUREICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgIzgKLSAgICAgICAgQUREUyAgICAgICAgWFksIFhZLCBYWQotICAgICAgICBBREQgICAgICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICMyCi0gICAgICAgIEJDQyAgICAgICAgIExvb3BYCi0gICAgICAgIEIgICAgICAgICAgIEV4aXRMb29wWSAgICAgICAgCi1iU0dFNCAgICAgICAgCi0gICAgICAgIDsvLyBiUyA+PSA0IEZpbHRlcmluZwotICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwLCBMU0wgIzIKLSAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMxCi0gICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUKLQotICAgICAgICA7Ly8gUmVzdWx0IFN0b3JhZ2UKLSAgICAgICAgVlNUMSAgICAgICAgZFBfMm4sIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkUF8xbiwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRQXzBuLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKLSAgICAgICAgU1VCICAgICAgICAgcFRtcCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMyCi0gICAgICAgIFZTVDEgICAgICAgIGRRXzBuLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKLSAgICAgICAgQUREUyAgICAgICAgWFksWFksWFkKLSAgICAgICAgVlNUMSAgICAgICAgZFFfMW4sIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAotICAgICAgICBBREQgICAgICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICMyCi0gICAgICAgIFZTVDEgICAgICAgIGRRXzJuLCBbcFNyY0RzdF0KLSAgICAgICAgCi0gICAgICAgIEFERCAgICAgICAgIHBTcmNEc3QsIHBUbXAsICM4Ci0gICAgICAgIEJDQyAgICAgICAgIExvb3BYCi0KLUV4aXRMb29wWSAgICAgICAgCi0KLSAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgIzE2Ci0gICAgICAgIFZMRDEgICAgICAgIHtkQWxwaGFbXX0sIFtwQWxwaGFfMV0KLSAgICAgICAgQUREICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMyIAotICAgICAgICBWTEQxICAgICAgICB7ZEJldGFbXX0sIFtwQmV0YV8xXQotICAgICAgICBCTkUgICAgICAgICBMb29wWQotCi0gICAgICAgIE1PViAgICAgICAgIHIwLCAjT01YX1N0c19Ob0VycgotCi0gICAgICAgIE1fRU5ECi0gICAgICAgIAotICAgIEVORElGCi0gICAgCi0KLSAgICAgICAgCi0KLSAgICAgICAgRU5ECi0gICAgICAgIAotICAgICAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYTEzNGUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0NTAgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDEyMjkwCi07Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0KLSAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAotCi0gICAgICAgIElNUE9SVCAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQotICAgICAgICBJTVBPUlQgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUKLSAgICAgICAgCi0gICAgICAgIElGIENvcnRleEE4Ci0KLUxPT1BfQ09VTlQgIEVRVSAweDExMDAwMDAwCi0KLQotOy8vIEZ1bmN0aW9uIGFyZ3VtZW50cwotCi1wU3JjRHN0ICAgICBSTiAwCi1zcmNkc3RTdGVwICBSTiAxCi1wQWxwaGEgICAgICBSTiAyCi1wQmV0YSAgICAgICBSTiAzCi0KLXBUaHJlc2hvbGRzIFJOIDUKLXBCUyAgICAgICAgIFJOIDQKLWJTMTAgICAgICAgIFJOIDEyCi0KLXBBbHBoYV8wICAgIFJOIDIKLXBCZXRhXzAgICAgIFJOIDMKLQotcEFscGhhXzEgICAgUk4gNwotcEJldGFfMSAgICAgUk4gOAotCi1wVG1wICAgICAgICBSTiAxMAotcFRtcFN0ZXAgICAgUk4gMTEKLQotOy8vIExvb3AgCi0KLVhZICAgICAgICAgIFJOIDkKLQotOy8vIFJvd3MgaW5wdXQKLWRSb3cwICAgICAgIEROIEQ3LlU4Ci1kUm93MSAgICAgICBETiBEOC5VOCAgCi1kUm93MiAgICAgICBETiBENS5VOCAgCi1kUm93MyAgICAgICBETiBEMTAuVTggIAotZFJvdzQgICAgICAgRE4gRDYuVTggIAotZFJvdzUgICAgICAgRE4gRDkuVTggIAotZFJvdzYgICAgICAgRE4gRDQuVTggCi1kUm93NyAgICAgICBETiBEMTEuVTggCi0KLTsvLyBkUm93MCAtIGRQXzMsIGRSb3cxIC0gZFFfMCwgZFJvdzIgLSBkUF8xLCBkUm93MyAtIGRRXzIKLTsvLyBkUm93NCAtIGRQXzIsIGRSb3c1IC0gZFFfMSwgZFJvdzYgLSBkUF8wLCBkUm93NyAtIGRRXzMKLQotOy8vIFJvd3Mgb3V0cHV0Ci1kUm93bjAgICAgICBETiBENy5VOAotZFJvd24xICAgICAgRE4gRDI0LlU4Ci1kUm93bjIgICAgICBETiBEMzAuVTgKLWRSb3duMyAgICAgIEROIEQxMC5VOAotZFJvd240ICAgICAgRE4gRDYuVTgKLWRSb3duNSAgICAgIEROIEQyNS5VOAotZFJvd242ICAgICAgRE4gRDI5LlU4Ci1kUm93bjcgICAgICBETiBEMTEuVTgKLQotOy8vIGRQXzBuICAgICAgIEROIEQyOS5VOAotOy8vIGRQXzFuICAgICAgIEROIEQzMC5VOAotOy8vIGRQXzJuICAgICAgIEROIEQzMS5VOAotOy8vIAotOy8vIGRRXzBuICAgICAgIEROIEQyNC5VOCAgIDshITtUZW1wMiAgICAgICAgCi07Ly8gZFFfMW4gICAgICAgRE4gRDI1LlU4ICAgOyEhO1RlbXAyICAgICAgICAKLTsvLyBkUV8ybiAgICAgICBETiBEMjguVTggICA7ISE7ZFFfMHQgICAgICAgIAotOy8vIAotOy8vIGRSb3duMCAtIGRQXzMsICBkUm93bjEgLSBkUV8wbgotOy8vIGRSb3duMiAtIGRQXzFuLCBkUm93bjMgLSBkUV8yCi07Ly8gZFJvd240IC0gZFBfMiwgIGRSb3duNSAtIGRRXzFuCi07Ly8gZFJvd242IC0gZFBfMG4sIGRSb3duNyAtIGRRXzMKLQotZFJvdzBuICAgICAgRE4gRDcuVTgKLWRSb3cxbiAgICAgIEROIEQyNC5VOAotZFJvdzJuICAgICAgRE4gRDMwLlU4Ci1kUm93M24gICAgICBETiBEMjguVTgKLWRSb3c0biAgICAgIEROIEQzMS5VOAotZFJvdzVuICAgICAgRE4gRDI1LlU4Ci1kUm93Nm4gICAgICBETiBEMjkuVTgKLWRSb3c3biAgICAgIEROIEQxMS5VOAotCi07Ly8gZFJvdzBuIC0gZFBfMywgZFJvdzFuIC0gZFFfMG4sIGRSb3cybiAtIGRQXzFuLCBkUm93M24gLSBkUV8ybgotOy8vIGRSb3c0biAtIGRQXzIsIGRSb3c1biAtIGRRXzFuLCBkUm93Nm4gLSBkUF8wbiwgZFJvdzduIC0gZFFfMwotCi07Ly8gUGl4ZWxzCi1kUF8wICAgICAgICBETiBENC5VOAotZFBfMSAgICAgICAgRE4gRDUuVTggIAotZFBfMiAgICAgICAgRE4gRDYuVTggIAotZFBfMyAgICAgICAgRE4gRDcuVTggIAotZFFfMCAgICAgICAgRE4gRDguVTggIAotZFFfMSAgICAgICAgRE4gRDkuVTggIAotZFFfMiAgICAgICAgRE4gRDEwLlU4IAotZFFfMyAgICAgICAgRE4gRDExLlU4IAotCi0KLTsvLyBGaWx0ZXJpbmcgRGVjaXNpb24KLWRBbHBoYSAgICAgIEROIEQwLlU4Ci1kQmV0YSAgICAgICBETiBEMi5VOAotCi1kRmlsdCAgICAgICBETiBEMTYuVTgKLWRBcWZsZyAgICAgIEROIEQxMi5VOAotZEFwZmxnICAgICAgRE4gRDE3LlU4IAotCi1kQXAwcTAgICAgICBETiBEMTMuVTgKLWRBcDFwMCAgICAgIEROIEQxMi5VOAotZEFxMXEwICAgICAgRE4gRDE4LlU4Ci1kQXAycDAgICAgICBETiBEMTkuVTgKLWRBcTJxMCAgICAgIEROIEQxNy5VOAotCi07Ly8gYlNMVDQKLWRUQzAgICAgICAgIEROIEQxOC5VOCAgIAotZFRDMSAgICAgICAgRE4gRDE5LlU4ICAgCi1kVEMwMSAgICAgICBETiBEMTguVTggICAKLQotZFRDcyAgICAgICAgRE4gRDMxLlM4Ci1kVEMgICAgICAgICBETiBEMzEuVTgKLQotZE1hc2tfMCAgICAgRE4gRDE0LlU4Ci1kTWFza18xICAgICBETiBEMTUuVTggICAgCi0KLU1hc2tfMCAgICAgIFJOIDYKLQotZFRlbXAgICAgICAgRE4gRDE5LlU4Ci0KLTsvLyBDb21wdXRpbmcgUDAsUTAKLXFEcTBwMCAgICAgIFFOIFExMC5TMTYKLXFEcDFxMSAgICAgIFFOIFExMS5TMTYKLXFEZWx0YSAgICAgIFFOIFExMC5TMTYgIDsgcmV1c2UgcURxMHAwCi1kRGVsdGEgICAgICBETiBEMjAuUzgKLQotCi07Ly8gQ29tcHV0aW5nIFAxLFExCi1kUnAwcTAgICAgICBETiBEMjQuVTgKLQotZE1heFAgICAgICAgRE4gRDIzLlU4Ci1kTWluUCAgICAgICBETiBEMjIuVTgKLQotZE1heFEgICAgICAgRE4gRDE5LlU4Ci1kTWluUSAgICAgICBETiBEMjEuVTgKLQotZERlbHRhUCAgICAgRE4gRDI2LlU4Ci1kRGVsdGFRICAgICBETiBEMjcuVTgKLQotcVBfMG4gICAgICAgUU4gUTE0LlMxNgotcVFfMG4gICAgICAgUU4gUTEyLlMxNgotCi1kUV8wbiAgICAgICBETiBEMjQuVTgKLWRRXzFuICAgICAgIEROIEQyNS5VOAotZFBfMG4gICAgICAgRE4gRDI5LlU4Ci1kUF8xbiAgICAgICBETiBEMzAuVTgKLQotOy8vIGJTR0U0Ci0KLXFTcDBxMCAgICAgIFFOIFExMC5VMTYKLQotcVNwMnExICAgICAgUU4gUTExLlUxNgotcVNwMHEwcDEgICAgUU4gUTEyLlUxNgotcVNwM3AyICAgICAgUU4gUTEzLlUxNgotZEhTcDBxMSAgICAgRE4gRDI4LlU4Ci0KLXFTcTJwMSAgICAgIFFOIFExMS5VMTYKLXFTcDBxMHExICAgIFFOIFExMi5VMTYKLXFTcTNxMiAgICAgIFFOIFExMy5VMTYgIDshIQotZEhTcTBwMSAgICAgRE4gRDI4LlU4ICAgOyEhCi0KLXFUZW1wMSAgICAgIFFOIFExMS5VMTYgIDshITtxU3AycTEgCi1xVGVtcDIgICAgICBRTiBRMTIuVTE2ICA7ISE7cVNwMHEwcDEgICAgICAgIAotCi1kUF8wdCAgICAgICBETiBEMjguVTggICA7ISE7ZEhTcDBxMSAgICAgICAgCi1kUV8wdCAgICAgICBETiBEMjIuVTggICA7ISE7VGVtcDEgICAgICAgIAotCi1kUF8wbiAgICAgICBETiBEMjkuVTgKLWRQXzFuICAgICAgIEROIEQzMC5VOAotZFBfMm4gICAgICAgRE4gRDMxLlU4Ci0KLWRRXzBuICAgICAgIEROIEQyNC5VOCAgIDshITtUZW1wMiAgICAgICAgCi1kUV8xbiAgICAgICBETiBEMjUuVTggICA7ISE7VGVtcDIgICAgICAgIAotZFFfMm4gICAgICAgRE4gRDI4LlU4ICAgOyEhO2RRXzB0ICAgICAgICAKLQotICAgICAgICAKLSAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JLCByMTEsIGQxNQotICAgICAgICAKLSAgICAgICAgOy8vQXJndW1lbnRzIG9uIHRoZSBzdGFjawotICAgICAgICBNX0FSRyAgIHBwVGhyZXNob2xkcywgNAotICAgICAgICBNX0FSRyAgIHBwQlMsIDQKLSAgICAgICAgCi0gICAgICAgIDsvLyBkMC1kQWxwaGFfMAotICAgICAgICA7Ly8gZDItZEJldGFfMAotCi0gICAgICAgIEFERCAgICAgICAgIHBBbHBoYV8xLCBwQWxwaGFfMCwgIzEKLSAgICAgICAgQUREICAgICAgICAgcEJldGFfMSwgcEJldGFfMCwgIzEKLSAgICAgICAgCi0gICAgICAgIFZMRDEgICAgICAgIHtkQWxwaGFbXX0sIFtwQWxwaGFfMF0KLSAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgIzQKLSAgICAgICAgVkxEMSAgICAgICAge2RCZXRhW119LCBbcEJldGFfMF0gCi0gICAgICAgIAotICAgICAgICBNX0xEUiAgICAgICBwQlMsIHBwQlMKLSAgICAgICAgTV9MRFIgICAgICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcyAKLQotICAgICAgICBNT1YgICAgICAgICBNYXNrXzAsIzAKLQotICAgICAgICA7ZE1hc2tfMC0xNAotICAgICAgICA7ZE1hc2tfMS0xNQotCi0gICAgICAgIFZNT1YgICAgICAgIGRNYXNrXzAsICMwICAgICAKLSAgICAgICAgVk1PViAgICAgICAgZE1hc2tfMSwgIzEgICAgIAotCi0gICAgICAgIExEUiAgICAgICAgIFhZLD1MT09QX0NPVU5UCi0gICAgCi0gICAgICAgIEFERCAgICAgICAgIHBUbXBTdGVwLCBzcmNkc3RTdGVwLCBzcmNkc3RTdGVwCi0KLSAgICAgICAgOy8vIHAwLXAzIC0gZDQtZDcKLSAgICAgICAgOy8vIHEwLXEzIC0gZDgtZDExCi1Mb29wWSAgICAgICAgCi1Mb29wWCAgICAgICAgCi0gICAgICAgIExEUkggICAgICAgIGJTMTAsIFtwQlNdLCAjNAotCi0gICAgICAgIENNUCAgICAgICAgIGJTMTAsICMwCi0gICAgICAgIEJFUSAgICAgICAgIE5vRmlsdGVyQlMwCi0KLSAgICAgICAgOy8vIExvYWQgOCByb3dzIG9mIGRhdGEKLSAgICAgICAgQUREICAgICAgICAgcFRtcCwgcFNyY0RzdCwgc3JjZHN0U3RlcAotICAgICAgICBWTEQxICAgICAgICBkUm93MCwgW3BTcmNEc3RdLCBwVG1wU3RlcAotICAgICAgICBWTEQxICAgICAgICBkUm93MSwgW3BUbXBdLCBwVG1wU3RlcAotICAgICAgICBWTEQxICAgICAgICBkUm93MiwgW3BTcmNEc3RdLCBwVG1wU3RlcAotICAgICAgICBWWklQLjggICAgICBkUm93MCwgZFJvdzEKLSAgICAgICAgVkxEMSAgICAgICAgZFJvdzMsIFtwVG1wXSwgcFRtcFN0ZXAKLSAgICAgICAgVkxEMSAgICAgICAgZFJvdzQsIFtwU3JjRHN0XSwgcFRtcFN0ZXAKLSAgICAgICAgVlpJUC44ICAgICAgZFJvdzIsIGRSb3czCi0gICAgICAgIFZMRDEgICAgICAgIGRSb3c1LCBbcFRtcF0sIHBUbXBTdGVwCi0gICAgICAgIFZMRDEgICAgICAgIGRSb3c2LCBbcFNyY0RzdF0sIHBUbXBTdGVwCi0gICAgICAgIFZMRDEgICAgICAgIGRSb3c3LCBbcFRtcF0sIHBUbXBTdGVwCi0gICAgICAgIFZaSVAuOCAgICAgIGRSb3c0LCBkUm93NQotICAgICAgICBWWklQLjE2ICAgICBkUm93MSwgZFJvdzMKLSAgICAKLQotICAgICAgICA7Ly8gZFJvdzAgPSBbcTNyMCBxMnIwIHExcjAgcTByMCBwMHIwIHAxcjAgcDJyMCBwM3IwXQotICAgICAgICA7Ly8gZFJvdzEgPSBbcTNyMSBxMnIxIHExcjEgcTByMSBwMHIxIHAxcjEgcDJyMSBwM3IxXQotICAgICAgICA7Ly8gZFJvdzIgPSBbcTNyMiBxMnIyIHExcjIgcTByMiBwMHIyIHAxcjIgcDJyMiBwM3IyXQotICAgICAgICA7Ly8gZFJvdzMgPSBbcTNyMyBxMnIzIHExcjMgcTByMyBwMHIzIHAxcjMgcDJyMyBwM3IzXQotICAgICAgICA7Ly8gZFJvdzQgPSBbcTNyNCBxMnI0IHExcjQgcTByNCBwMHI0IHAxcjQgcDJyNCBwM3I0XQotICAgICAgICA7Ly8gZFJvdzUgPSBbcTNyNSBxMnI1IHExcjUgcTByNSBwMHI1IHAxcjUgcDJyNSBwM3I1XQotICAgICAgICA7Ly8gZFJvdzYgPSBbcTNyNiBxMnI2IHExcjYgcTByNiBwMHI2IHAxcjYgcDJyNiBwM3I2XQotICAgICAgICA7Ly8gZFJvdzcgPSBbcTNyNyBxMnI3IHExcjcgcTByNyBwMHI3IHAxcjcgcDJyNyBwM3I3XQotCi0gICAgICAgIDsvLyA4eDggVHJhbnNwb3NlCi0KLSAgICAgICAgVlpJUC44ICAgICAgZFJvdzYsIGRSb3c3Ci0KLSAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMzCi0gICAgICAgIFZaSVAuMTYgICAgIGRSb3cwLCBkUm93MgotICAgICAgICBWWklQLjE2ICAgICBkUm93NSwgZFJvdzcKLSAgICAgICAgCi0KLSAgICAgICAgVlpJUC4xNiAgICAgZFJvdzQsIGRSb3c2Ci0gICAgICAgIFZaSVAuMzIgICAgIGRSb3cxLCBkUm93NQotICAgICAgICBWWklQLjMyICAgICBkUm93MiwgZFJvdzYKLSAgICAgICAgVlpJUC4zMiAgICAgZFJvdzMsIGRSb3c3Ci0gICAgICAgIFZaSVAuMzIgICAgIGRSb3cwLCBkUm93NAotICAgICAgICAKLQotICAgICAgICA7Ly8gZFJvdzAgLSBkUF8zLCBkUm93MSAtIGRRXzAsIGRSb3cyIC0gZFBfMSwgZFJvdzMgLSBkUV8yCi0gICAgICAgIDsvLyBkUm93NCAtIGRQXzIsIGRSb3c1IC0gZFFfMSwgZFJvdzYgLSBkUF8wLCBkUm93NyAtIGRRXzMKLQotICAgICAgICA7Ly8gZFFfMCA9IFtxMHI3IHEwcjYgcTByNSBxMHI0IHEwcjMgcTByMiBxMHIxIHEwcjBdCi0gICAgICAgIDsvLyBkUV8xID0gW3ExcjcgcTFyNiBxMXI1IHExcjQgcTFyMyBxMXIyIHExcjEgcTFyMF0KLSAgICAgICAgOy8vIGRRXzIgPSBbcTJyNyBxMnI2IHEycjUgcTJyNCBxMnIzIHEycjIgcTJyMSBxMnIwXQotICAgICAgICA7Ly8gZFFfMyA9IFtxM3I3IHEzcjYgcTNyNSBxM3I0IHEzcjMgcTNyMiBxM3IxIHEzcjBdCi0KLSAgICAgICAgOy8vIGRQXzAgPSBbcDByNyBwMHI2IHAwcjUgcDByNCBwMHIzIHAwcjIgcDByMSBwMHIwXQotICAgICAgICA7Ly8gZFBfMSA9IFtwMXI3IHAxcjYgcDFyNSBwMXI0IHAxcjMgcDFyMiBwMXIxIHAxcjBdCi0gICAgICAgIDsvLyBkUF8yID0gW3AycjcgcDJyNiBwMnI1IHAycjQgcDJyMyBwMnIyIHAycjEgcDJyMF0KLSAgICAgICAgOy8vIGRQXzMgPSBbcDNyNyBwM3I2IHAzcjUgcDNyNCBwM3IzIHAzcjIgcDNyMSBwM3IwXQotCi0gICAgICAgIFZBQkQgICAgICAgIGRBcDBxMCwgZFBfMCwgZFFfMAotICAgICAgICBWQUJEICAgICAgICBkQXAxcDAsIGRQXzEsIGRQXzAKLQotICAgICAgICBWQUJEICAgICAgICBkQXExcTAsIGRRXzEsIGRRXzAKLSAgICAgICAgVkFCRCAgICAgICAgZEFwMnAwLCBkUF8yLCBkUF8wCi0gICAgICAgIAotICAgICAgICBUU1QgICAgICAgICBiUzEwLCAjMHhmZgotICAgICAgICBWQ0dUICAgICAgICBkRmlsdCwgZEFscGhhLCBkQXAwcTAKLQotICAgICAgICBWTUFYICAgICAgICBkQXAxcDAsIGRBcTFxMCwgZEFwMXAwCi0gICAgICAgIFZBQkQgICAgICAgIGRBcTJxMCwgZFFfMiwgZFFfMAotCi0gICAgICAgIFZNT1ZFUS5VMzIgIGRGaWx0WzBdLCBNYXNrXzAKLSAgICAgICAgVFNUICAgICAgICAgYlMxMCwgIzB4ZmYwMAotCi0gICAgICAgIFZDR1QgICAgICAgIGRBcDJwMCwgZEJldGEsIGRBcDJwMAotICAgICAgICBWQ0dUICAgICAgICBkQXAxcDAsIGRCZXRhLCBkQXAxcDAKLQotICAgICAgICBWTU9WRVEuVTMyICBkRmlsdFsxXSwgTWFza18wCi0KLSAgICAgICAgVkNHVCAgICAgICAgZEFxMnEwLCBkQmV0YSwgZEFxMnEwCi0gICAgICAgIFZBTkQgICAgICAgIGRGaWx0LCBkRmlsdCwgZEFwMXAwCi0gICAgICAgIFRTVCAgICAgICAgIGJTMTAsICM0IAotCi0gICAgICAgIFZBTkQgICAgICAgIGRBcWZsZywgZEZpbHQsIGRBcTJxMAotICAgICAgICBWQU5EICAgICAgICBkQXBmbGcsIGRGaWx0LCBkQXAycDAKLSAgICAKLSAgICAgICAgQk5FICAgICAgICAgYlNHRTQgICAgICAgIAotYlNMVDQKLSAgICAgICAgOy8vIGJTIDwgNCBGaWx0ZXJpbmcKLQotICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlCi0KLSAgICAgICAgOy8vIFRyYW5zcG9zZQotCi0gICAgICAgIFZaSVAuOCAgICAgIGRQXzMsICBkUF8yICAKLSAgICAgICAgVlpJUC44ICAgICAgZFBfMW4sIGRQXzBuCi0gICAgICAgIFZaSVAuOCAgICAgIGRRXzBuLCBkUV8xbgotICAgICAgICBWWklQLjggICAgICBkUV8yLCAgZFFfMwotCi0gICAgICAgIAotICAgICAgICBWWklQLjE2ICAgICBkUF8zLCAgZFBfMW4KLSAgICAgICAgQUREICAgICAgICAgcFRtcCwgcFNyY0RzdCwgc3JjZHN0U3RlcAotICAgICAgICBWWklQLjE2ICAgICBkUV8wbiwgZFFfMgotICAgICAgICBWWklQLjE2ICAgICBkUV8xbiwgZFFfMwotICAgICAgICBWWklQLjE2ICAgICBkUF8yLCAgZFBfMG4KLQotICAgICAgICBWWklQLjMyICAgICBkUF8zLCAgZFFfMG4KLSAgICAgICAgVlpJUC4zMiAgICAgZFBfMW4sIGRRXzIKLSAgICAgICAgVlpJUC4zMiAgICAgZFBfMiwgIGRRXzFuCi0gICAgICAgIFZaSVAuMzIgICAgIGRQXzBuLCBkUV8zCi0KLSAgICAgICAgOy8vIGRSb3duMCAtIGRQXzMsICBkUm93bjEgLSBkUV8wbgotICAgICAgICA7Ly8gZFJvd24yIC0gZFBfMW4sIGRSb3duMyAtIGRRXzIKLSAgICAgICAgOy8vIGRSb3duNCAtIGRQXzIsICBkUm93bjUgLSBkUV8xbgotICAgICAgICA7Ly8gZFJvd242IC0gZFBfMG4sIGRSb3duNyAtIGRRXzMKLQotICAgICAgICBWU1QxICAgICAgICBkUm93bjAsIFtwU3JjRHN0XSwgcFRtcFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFJvd24xLCBbcFRtcF0sIHBUbXBTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRSb3duMiwgW3BTcmNEc3RdLCBwVG1wU3RlcAotICAgICAgICBWU1QxICAgICAgICBkUm93bjMsIFtwVG1wXSwgcFRtcFN0ZXAKLSAgICAgICAgOzEKLSAgICAgICAgVlNUMSAgICAgICAgZFJvd240LCBbcFNyY0RzdF0sIHBUbXBTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRSb3duNSwgW3BUbXBdLCBwVG1wU3RlcAotICAgICAgICBBRERTICAgICAgICBYWSwgWFksIFhZCi0gICAgICAgIFZTVDEgICAgICAgIGRSb3duNiwgW3BTcmNEc3RdLCBwVG1wU3RlcAotICAgICAgICBBREQgICAgICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICMyCi0gICAgICAgIFZTVDEgICAgICAgIGRSb3duNywgW3BUbXBdLCBzcmNkc3RTdGVwCi0KLSAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMzCi0gICAgICAgIFZMRDEgICAgICAgIHtkQWxwaGFbXX0sIFtwQWxwaGFfMV0KLSAgICAgICAgQUREICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgIzQKLSAgICAgICAgVkxEMSAgICAgICAge2RCZXRhW119LCBbcEJldGFfMV0KLQotICAgICAgICBCQ0MgICAgICAgICBMb29wWAotICAgICAgICBCICAgICAgICAgICBFeGl0TG9vcFkgICAgICAgIAotCi1Ob0ZpbHRlckJTMAotICAgICAgICBBREQgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCAjNAotICAgICAgICBBRERTICAgICAgICBYWSwgWFksIFhZCi0gICAgICAgIFZMRDEgICAgICAgIHtkQWxwaGFbXX0sIFtwQWxwaGFfMV0KLSAgICAgICAgQUREICAgICAgICAgcFRocmVzaG9sZHMsIHBUaHJlc2hvbGRzLCAjNAotICAgICAgICBWTEQxICAgICAgICB7ZEJldGFbXX0sIFtwQmV0YV8xXQotICAgICAgICBCQ0MgICAgICAgICBMb29wWAotICAgICAgICBCICAgICAgICAgICBFeGl0TG9vcFkgICAgICAgIAotYlNHRTQgICAgICAgIAotICAgICAgICA7Ly8gYlMgPj0gNCBGaWx0ZXJpbmcKLSAgICAgICAgCi0gICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUKLQotICAgICAgICA7Ly8gVHJhbnNwb3NlCi0KLSAgICAgICAgVlpJUC44ICAgICAgZFBfMywgIGRQXzJuICAgCi0gICAgICAgIFZaSVAuOCAgICAgIGRQXzFuLCBkUF8wbgotICAgICAgICBWWklQLjggICAgICBkUV8wbiwgZFFfMW4KLSAgICAgICAgVlpJUC44ICAgICAgZFFfMm4sIGRRXzMKLQotICAgICAgICBWWklQLjE2ICAgICBkUF8zLCAgZFBfMW4KLSAgICAgICAgQUREICAgICAgICAgcFRtcCwgcFNyY0RzdCwgc3JjZHN0U3RlcAotICAgICAgICBWWklQLjE2ICAgICBkUV8wbiwgZFFfMm4KLSAgICAgICAgVlpJUC4xNiAgICAgZFFfMW4sIGRRXzMKLSAgICAgICAgVlpJUC4xNiAgICAgZFBfMm4sIGRQXzBuCi0KLSAgICAgICAgVlpJUC4zMiAgICAgZFBfMywgIGRRXzBuCi0gICAgICAgIFZaSVAuMzIgICAgIGRQXzFuLCBkUV8ybgotICAgICAgICBWWklQLjMyICAgICBkUF8ybiwgZFFfMW4KLSAgICAgICAgVlpJUC4zMiAgICAgZFBfMG4sIGRRXzMKLQotICAgICAgICA7Ly8gZFJvdzBuIC0gZFBfMywgZFJvdzFuIC0gZFFfMG4sIGRSb3cybiAtIGRQXzFuLCBkUm93M24gLSBkUV8ybgotICAgICAgICA7Ly8gZFJvdzRuIC0gZFBfMiwgZFJvdzVuIC0gZFFfMW4sIGRSb3c2biAtIGRQXzBuLCBkUm93N24gLSBkUV8zCi0gICAgICAgIAotICAgICAgICBWU1QxICAgICAgICBkUm93MG4sIFtwU3JjRHN0XSwgcFRtcFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFJvdzFuLCBbcFRtcF0sIHBUbXBTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRSb3cybiwgW3BTcmNEc3RdLCBwVG1wU3RlcAotICAgICAgICBWU1QxICAgICAgICBkUm93M24sIFtwVG1wXSwgcFRtcFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFJvdzRuLCBbcFNyY0RzdF0sIHBUbXBTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRSb3c1biwgW3BUbXBdLCBwVG1wU3RlcAotICAgICAgICBBRERTICAgICAgICBYWSxYWSxYWQotICAgICAgICBWU1QxICAgICAgICBkUm93Nm4sIFtwU3JjRHN0XSwgcFRtcFN0ZXAKLSAgICAgICAgQUREICAgICAgICAgcFRocmVzaG9sZHMsIHBUaHJlc2hvbGRzLCAjNAotICAgICAgICBWU1QxICAgICAgICBkUm93N24sIFtwVG1wXSwgcFRtcFN0ZXAKLQotICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwLCBMU0wgIzMKLSAgICAgICAgVkxEMSAgICAgICAge2RBbHBoYVtdfSwgW3BBbHBoYV8xXQotICAgICAgICBBREQgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCAjNAotICAgICAgICBWTEQxICAgICAgICB7ZEJldGFbXX0sIFtwQmV0YV8xXQotCi0gICAgICAgIEJDQyAgICAgICAgIExvb3BYCi0KLUV4aXRMb29wWSAgICAgICAgCi0gICAgICAgIFNVQiAgICAgICAgIHBCUywgcEJTLCAjMTQKLSAgICAgICAgU1VCICAgICAgICAgcFRocmVzaG9sZHMsIHBUaHJlc2hvbGRzLCAjMTQKLSAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgIzE2Ci0gICAgICAgIFZMRDEgICAgICAgIHtkQWxwaGFbXX0sIFtwQWxwaGFfMF0KLSAgICAgICAgQUREICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMzIAotICAgICAgICBWTEQxICAgICAgICB7ZEJldGFbXX0sIFtwQmV0YV8wXQotICAgICAgICBCTkUgICAgICAgICBMb29wWQotCi0gICAgICAgIE1PViAgICAgICAgIHIwLCAjT01YX1N0c19Ob0VycgotCi0gICAgICAgIE1fRU5ECi0gICAgICAgIAotICAgIEVORElGCi0gICAgCi0gICAgICAgIAotICAgICAgICBFTkQKLSAgICAgICAgCi0gICAgICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZiM2Y0MS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEuYworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgMTIyOTAKLSAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIDEvOCBQaXhlbCBpbnRlcnBvbGF0aW9uIGZvciBDaHJvbWEgQmxvY2sKLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotCi0vKioKLSAqIEZ1bmN0aW9uOiBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLAotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgMS84LXBpeGVsIGludGVycG9sYXRpb24gZm9yIGludGVyIGNocm9tYSBNQi4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBTcmMJUG9pbnRlciB0byB0aGUgc291cmNlIHJlZmVyZW5jZSBmcmFtZSBidWZmZXIKLSAqIFtpbl0Jc3JjU3RlcCBSZWZlcmVuY2UgZnJhbWUgc3RlcCBpbiBieXRlCi0gKiBbaW5dCWRzdFN0ZXAgRGVzdGluYXRpb24gZnJhbWUgc3RlcCBpbiBieXRlLiBNdXN0IGJlIG11bHRpcGxlIG9mIHJvaS53aWR0aC4KLSAqIFtpbl0JZHgJCUZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50Ci0gKgkJCQkJCWluIDEvOCBwaXhlbCB1bml0O3ZhbGlkIGluIHRoZSByYW5nZSBbMCw3XQotICogW2luXQlkeQkJRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50Ci0gKgkJCQkJCWluIDEvOCBwaXhlbCB1bml0O3ZhbGlkIGluIHRoZSByYW5nZSBbMCw3XQotICogW2luXQlyb2kJCURpbWVuc2lvbiBvZiB0aGUgaW50ZXJwb2xhdGlvbiByZWdpb247dGhlIHBhcmFtZXRlcnMgcm9pLndpZHRoIGFuZCByb2kuaGVpZ2h0IG11c3QKLSAqICAgICAgICAgICAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciAyLCA0LCBvciA4LgotICogW291dF0JcERzdAlQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBmcmFtZSBidWZmZXIuCi0gKiAgICAgICAgICAgICAgICAgICBpZiByb2kud2lkdGg9PTIsICAyLWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkCi0gKiAgICAgICAgICAgICAgICAgICBpZiByb2kud2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkCi0gKiAgICAgICAgICAgICAgICAgICBpZiByb2kud2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLgotICogSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBPTVhfU3RzX0JhZEFyZ0VycjoKLSAqCXBTcmMgb3IgcERzdCBpcyBOVUxMLgotICoJc3JjU3RlcCBvciBkc3RTdGVwIDwgOC4KLSAqCWR4IG9yIGR5IGlzIG91dCBvZiByYW5nZSBbMC03XS4KLSAqCXJvaS53aWR0aCBvciByb2kuaGVpZ2h0IGlzIG91dCBvZiByYW5nZSB7Miw0LDh9LgotICoJcm9pLndpZHRoIGlzIGVxdWFsIHRvIDIsIGJ1dCBwRHN0IGlzIG5vdCAyLWJ5dGUgYWxpZ25lZC4KLSAqCXJvaS53aWR0aCBpcyBlcXVhbCB0byA0LCBidXQgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQuCi0gKglyb2kud2lkdGggaXMgZXF1YWwgdG8gOCwgYnV0IHBEc3QgaXMgbm90IDggYnl0ZSBhbGlnbmVkLgotICoJc3JjU3RlcCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hICgKLSAgICAgY29uc3QgT01YX1U4KiBwU3JjLAotICAgICBPTVhfUzMyIHNyY1N0ZXAsCi0gICAgIE9NWF9VOCogcERzdCwKLSAgICAgT01YX1MzMiBkc3RTdGVwLAotICAgICBPTVhfUzMyIGR4LAotICAgICBPTVhfUzMyIGR5LAotICAgICBPTVhTaXplIHJvaQotICkKLXsKLSAgICByZXR1cm4gYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEgCi0gICAgICAgICgoT01YX1U4KilwU3JjLCBzcmNTdGVwLCBwRHN0LCBkc3RTdGVwLCByb2kud2lkdGgsIHJvaS5oZWlnaHQsIGR4LCBkeSk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmOGY2OWUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NjcgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDEyMjkwCi07Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotOy8vIEZ1bmN0aW9uOgotOy8vICAgICBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYQotOy8vCi07Ly8gVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hIGluIHY2IGFzc2VtYmx5LgotOy8vIFBlcmZvcm1zIHF1YXJ0ZXIgcGVsIGludGVycG9sYXRpb24gb2YgaW50ZXIgbHVtYSBNQi4KLTsvLyBJdCdzIGFzc3VtZWQgdGhhdCB0aGUgZnJhbWUgaXMgYWxyZWFkeSBwYWRkZWQgd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCi07Ly8gUGFyYW1ldGVyczoKLTsvLyBbaW5dICAgIHBTcmMgICAgICAgIFBvaW50ZXIgdG8gdGhlIHNvdXJjZSByZWZlcmVuY2UgZnJhbWUgYnVmZmVyCi07Ly8gW2luXSAgICBzcmNTdGVwICAgICBSZWZlcmVuY2UgZnJhbWUgc3RlcCBpbiBieXRlCi07Ly8gW2luXSAgICBkc3RTdGVwICAgICBEZXN0aW5hdGlvbiBmcmFtZSBzdGVwIGluIGJ5dGUuIE11c3QgYmUgbXVsdGlwbGUgb2Ygcm9pLndpZHRoCi07Ly8gW2luXSAgICBkeCAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yCi07Ly8gICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvNCBwaXhlbCB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsM10KLTsvLyBbaW5dICAgIGR5ICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yCi07Ly8gICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvNCBwaXhlbCB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsM10KLTsvLyBbaW5dICAgIHJvaSAgICAgICAgIERpbWVuc2lvbiBvZiB0aGUgaW50ZXJwb2xhdGlvbiByZWdpb247dGhlIHBhcmFtZXRlcnMgcm9pLndpZHRoIGFuZCByb2kuaGVpZ2h0IG11c3QKLTsvLyAgICAgICAgICAgICAgICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuCi07Ly8gW291dF0gICBwRHN0ICAgICAgICBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBmcmFtZSBidWZmZXIuCi07Ly8gICAgICAgICAgICAgICAgICAgaWYgcm9pLndpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZAotOy8vICAgICAgICAgICAgICAgICAgIGlmIHJvaS53aWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQKLTsvLyAgICAgICAgICAgICAgICAgICBpZiByb2kud2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZAotOy8vCi07Ly8gUmV0dXJuIFZhbHVlOgotOy8vIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4KLTsvLyBJdCBpcyBhc3N1ZWQgdGhhdCBmb2xsb3dpbmcgY2FzZXMgYXJlIHNhdGlzZmllZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uOgotOy8vICBwU3JjIG9yIHBEc3QgaXMgbm90IE5VTEwuCi07Ly8gIHNyY1N0ZXAgb3IgZHN0U3RlcCA+PSByb2kud2lkdGguCi07Ly8gICAgIGR4IG9yIGR5IGlzIGluIHRoZSByYW5nZSBbMC0zXS4KLTsvLyAgICAgcm9pLndpZHRoIG9yIHJvaS5oZWlnaHQgaXMgbm90IG91dCBvZiByYW5nZSB7NCwgOCwgMTZ9LgotOy8vICAgICBJZiByb2kud2lkdGggaXMgZXF1YWwgdG8gNCwgRHN0IGlzIDQgYnl0ZSBhbGlnbmVkLgotOy8vICAgICBJZiByb2kud2lkdGggaXMgZXF1YWwgdG8gOCwgcERzdCBpcyA4IGJ5dGUgYWxpZ25lZC4KLTsvLyAgICAgSWYgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDE2LCBwRHN0IGlzIDE2IGJ5dGUgYWxpZ25lZC4KLTsvLyAgICAgc3JjU3RlcCBhbmQgZHN0U3RlcCBpcyBtdWx0aXBsZSBvZiA4LgotOy8vCi07Ly8KLQotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLQotICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4Ci0KLSAgICAgICAgRVhQT1JUIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hCi0gICAgICAgIAotCi0gICAgSUYgQ29ydGV4QTgKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKLSAgICBFTkRJRgotICAgIAotICAgIAotCi07Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKLXBTcmMgICAgICAgICAgICBSTiAwCi1zcmNTdGVwICAgICAgICAgUk4gMQotcERzdCAgICAgICAgICAgIFJOIDIKLWRzdFN0ZXAgICAgICAgICBSTiAzCi1pSGVpZ2h0ICAgICAgICAgUk4gNAotaVdpZHRoICAgICAgICAgIFJOIDUKLQotOy8vIERlY2xhcmUgb3RoZXIgaW50ZXJtZWRpYXRlIHJlZ2lzdGVycwotaWR4ICAgICAgICAgICAgIFJOIDYKLWlkeSAgICAgICAgICAgICBSTiA3Ci1pbmRleCAgICAgICAgICAgUk4gNgotVGVtcCAgICAgICAgICAgIFJOIDEyCi1wQXJncyAgICAgICAgICAgUk4gMTEKLQotCi0gICAgSUYgQ29ydGV4QTgKLQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIEludGVycG9sYXRpb24gb2YgbHVtYSBpcyBpbXBsZW1lbnRlZCBieSBwcm9jZXNzaW5nIGJsb2NrIG9mIHBpeGVscywgc2l6ZSA0eDQgYXQgYSB0aW1lLgotICAgICAgICA7Ly8KLSAgICAgICAgTV9BTExPQzQgICAgcHBBcmdzLCAxNgotICAgICAgICAKLSAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hLCByMTEsIGQxNQotCi1wU3JjQksgICAgICAgICAgUk4gOAotCi07Ly8gRGVjbGFyZSBOZW9uIHJlZ2lzdGVycwotZENvZWZmNSAgICAgICAgIEROIDMwLlMxNgotZENvZWZmMjAgICAgICAgIEROIDMxLlMxNgotCi07Ly8gUmVnaXN0ZXJzIHVzZWQgZm9yIGltcGxlbWVudGluZyBIb3Jpem9udGFsIGludGVycG9sYXRpb24KLWRTcmMwYyAgICAgICAgICBETiAxNC5VOAotZFNyYzFjICAgICAgICAgIEROIDE2LlU4Ci1kU3JjMmMgICAgICAgICAgRE4gMTguVTgKLWRTcmMzYyAgICAgICAgICBETiAyMC5VOCAgICAgICAgICAgICAgICAgICAKLWRTcmMwZCAgICAgICAgICBETiAxNS5VOAotZFNyYzFkICAgICAgICAgIEROIDE3LlU4Ci1kU3JjMmQgICAgICAgICAgRE4gMTkuVTgKLWRTcmMzZCAgICAgICAgICBETiAyMS5VOAotZEFjY0gwICAgICAgICAgIEROIDIyLlU4Ci1kQWNjSDEgICAgICAgICAgRE4gMjQuVTgKLWRBY2NIMiAgICAgICAgICBETiAyNi5VOAotZEFjY0gzICAgICAgICAgIEROIDI4LlU4Ci1kUmVzdWx0SDAgICAgICAgRE4gMjIuVTMyCi1kUmVzdWx0SDEgICAgICAgRE4gMjQuVTMyCi1kUmVzdWx0SDIgICAgICAgRE4gMjYuVTMyCi1kUmVzdWx0SDMgICAgICAgRE4gMjguVTMyCi0KLTsvLyBSZWdpc3RlcnMgdXNlZCBmb3IgaW1wbGVtZW50aW5nIFZlcnRpY2FsIGludGVycG9sYXRpb24KLWRTcmMwICAgICAgICAgICBETiA5LlU4Ci1kU3JjMSAgICAgICAgICAgRE4gMTAuVTgKLWRTcmMyICAgICAgICAgICBETiAxMS5VOAotZFNyYzMgICAgICAgICAgIEROIDEyLlU4Ci1kU3JjNCAgICAgICAgICAgRE4gMTMuVTgKLWRBY2NWMCAgICAgICAgICBETiAwLlU4Ci1kQWNjVjEgICAgICAgICAgRE4gMi5VOAotZEFjY1YyICAgICAgICAgIEROIDQuVTgKLWRBY2NWMyAgICAgICAgICBETiA2LlU4Ci1kUmVzdWx0VjAgICAgICAgRE4gMC5VMzIKLWRSZXN1bHRWMSAgICAgICBETiAyLlUzMgotZFJlc3VsdFYyICAgICAgIEROIDQuVTMyCi1kUmVzdWx0VjMgICAgICAgRE4gNi5VMzIKLSAgICAgICAgCi07Ly8gUmVnaXN0ZXJzIHVzZWQgZm9yIGltcGxlbWVudGluZyBEaWFnb25hbCBpbnRlcnBvbGF0aW9uCi1kVEFjYzAgICAgICAgICAgRE4gMC5VOAotZFRBY2MxICAgICAgICAgIEROIDIuVTgKLWRUQWNjMiAgICAgICAgICBETiA0LlU4Ci1kVEFjYzMgICAgICAgICAgRE4gNi5VOAotZFRSZXMwICAgICAgICAgIEROIDAuMzIKLWRUUmVzMSAgICAgICAgICBETiAyLjMyCi1kVFJlczIgICAgICAgICAgRE4gNC4zMgotZFRSZXMzICAgICAgICAgIEROIDYuMzIKLWRUUmVzdWx0MCAgICAgICBETiAxNC5VOAotZFRSZXN1bHQxICAgICAgIEROIDE2LlU4Ci1kVFJlc3VsdDIgICAgICAgRE4gMTguVTgKLWRUUmVzdWx0MyAgICAgICBETiAyMC5VOAotZFRlbXBQMCAgICAgICAgIEROIDE4LlMxNgotZFRlbXBQMSAgICAgICAgIEROIDE5LlMxNgotZFRlbXBRMCAgICAgICAgIEROIDIwLlMxNgotZFRlbXBRMSAgICAgICAgIEROIDIxLlMxNgotZFRlbXBSMCAgICAgICAgIEROIDIyLlMxNgotZFRlbXBSMSAgICAgICAgIEROIDIzLlMxNgotZFRlbXBTMCAgICAgICAgIEROIDI0LlMxNgotZFRlbXBTMSAgICAgICAgIEROIDI1LlMxNgotcVRlbXBQMDEgICAgICAgIFFOIDkuUzE2Ci1xVGVtcFEwMSAgICAgICAgUU4gMTAuUzE2Ci1xVGVtcFIwMSAgICAgICAgUU4gMTEuUzE2Ci1xVGVtcFMwMSAgICAgICAgUU4gMTIuUzE2Ci0KLTsvLyBJbnRlcm1lZGlhdGUgdmFsdWVzIGZvciBhdmVyYWdpbmcKLXFSZXMyICAgICAgICAgICBRTiA3LlMxNgotcVJlczMgICAgICAgICAgIFFOIDguUzE2Ci1xUmVzNCAgICAgICAgICAgUU4gOS5TMTYKLXFSZXM1ICAgICAgICAgICBRTiAxMC5TMTYKLXFSZXM2ICAgICAgICAgICBRTiAxMS5TMTYKLSAgICAgICAKLTsvLyBGb3IgaW1wbGVtZW50aW5nIGNvcHkKLWREc3QwICAgICAgICAgICAgRE4gOS4zMgotZERzdDEgICAgICAgICAgICBETiAxMC4zMgotZERzdDIgICAgICAgICAgICBETiAxMS4zMgotZERzdDMgICAgICAgICAgICBETiAxMi4zMgotCi0gICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCi0gICAgICAgIE1fQVJHICAgICAgIHB0cmlkeCwgNAotICAgICAgICBNX0FSRyAgICAgICBwdHJpZHksIDQgICAgICAgIAotICAgICAgICBNX0FSRyAgICAgICBwdHJXaWR0aCwgNAotICAgICAgICBNX0FSRyAgICAgICBwdHJIZWlnaHQsIDQgICAgICAgIAotCi0gICAgICAgIDsvLyBMb2FkIHN0cnVjdHVyZSBlbGVtZW50cyBvZiByb2kgCi0gICAgICAgIE1fTERSICAgICAgIGlkeCwgcHRyaWR4Ci0gICAgICAgIE1fTERSICAgICAgIGlkeSwgcHRyaWR5Ci0gICAgICAgIE1fTERSICAgICAgIGlXaWR0aCwgcHRyV2lkdGgKLSAgICAgICAgTV9MRFIgICAgICAgaUhlaWdodCwgcHRySGVpZ2h0Ci0gICAgICAgIAotICAgICAgICBBREQgICAgICAgICBpbmRleCwgaWR4LCBpZHksIExTTCAjMiAgICAgICAgICAgICAgICAgOy8vICBbaW5kZXhdID0gW2lkeV1baWR4XQotICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gTW92ZSBjb2VmZmljaWVudHMgTmVvbiByZWdpc3RlcnMKLSAgICAgICAgVk1PViAgICAgICAgZENvZWZmMjAsICMyMAotICAgICAgICBWTU9WICAgICAgICBkQ29lZmY1LCAjNQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotQmxvY2s0eDRXaWR0aExvb3AKLUJsb2NrNHg0SGVpZ2h0TG9vcAotCi0gICAgICAgIFNUTSAgICAgICAgIHBBcmdzLCB7cFNyYyxzcmNTdGVwLHBEc3QsZHN0U3RlcH0gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIHN3aXRjaCB0YWJsZSB1c2luZyBtb3Rpb24gdmVjdG9yIGFzIGluZGV4Ci0gICAgICAgIEFERCAgICAgICAgIHBjLCBwYywgaW5kZXgsIExTTCAjMgotICAgICAgICBCICAgICAgICAgICBDYXNlX2YKLSAgICAgICAgQiAgICAgICAgICAgQ2FzZV8wICAgICAgICAKLSAgICAgICAgQiAgICAgICAgICAgQ2FzZV8xICAgICAgICAKLSAgICAgICAgQiAgICAgICAgICAgQ2FzZV8yICAgICAgICAKLSAgICAgICAgQiAgICAgICAgICAgQ2FzZV8zICAgICAgICAKLSAgICAgICAgQiAgICAgICAgICAgQ2FzZV80ICAgICAgICAKLSAgICAgICAgQiAgICAgICAgICAgQ2FzZV81ICAgICAgICAKLSAgICAgICAgQiAgICAgICAgICAgQ2FzZV82ICAgICAgICAKLSAgICAgICAgQiAgICAgICAgICAgQ2FzZV83ICAgICAgICAKLSAgICAgICAgQiAgICAgICAgICAgQ2FzZV84ICAgICAgICAKLSAgICAgICAgQiAgICAgICAgICAgQ2FzZV85ICAgICAgICAKLSAgICAgICAgQiAgICAgICAgICAgQ2FzZV9hICAgICAgICAKLSAgICAgICAgQiAgICAgICAgICAgQ2FzZV9iICAgICAgICAKLSAgICAgICAgQiAgICAgICAgICAgQ2FzZV9jICAgICAgICAKLSAgICAgICAgQiAgICAgICAgICAgQ2FzZV9kCi0gICAgICAgIEIgICAgICAgICAgIENhc2VfZSAgICAgICAgCi0gICAgICAgIEIgICAgICAgICAgIENhc2VfZgotICAgICAgICAgICAgICAgICAgICAKLUNhc2VfMCAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIENhc2UgRwotICAgICAgICBNX1BSSU5URiAiQ2FzZSAwIFxuIgotICAgICAgICAKLSAgICAgICAgOy8vIExvYWRzIGEgNHg0IGJsb2NrIG9mIC44IGFuZCBzdG9yZXMgYXMgLjMyCi0gICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMSAKLSAgICAgICAgVkxEMSAgICAgICAgZFNyYzAsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBWTEQxICAgICAgICBkU3JjMiwgW1RlbXBdLCBzcmNTdGVwCi0gICAgICAgIFZMRDEgICAgICAgIGRTcmMxLCBbcFNyY10KLSAgICAgICAgVkxEMSAgICAgICAgZFNyYzMsIFtUZW1wXQotICAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAotICAgICAgICBWU1QxICAgICAgICBkRHN0MFswXSwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGREc3QyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZERzdDFbMF0sIFtwRHN0XQotICAgICAgICBWU1QxICAgICAgICBkRHN0M1swXSwgW1RlbXBdCi0gICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKLSAgICAgICAgQiAgICAgICAgICAgQmxvY2s0eDRMb29wRW5kCi1DYXNlXzEKLSAgICAgICAgOy8vIENhc2UgYQotICAgICAgICBNX1BSSU5URiAiQ2FzZSAxIFxuIgotCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsICMyCi0gICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlICAgICAgICAKLSAgICAgICAgVlJIQUREICAgICAgZEFjY0gwLCBkQWNjSDAsIGRTcmMwYwotICAgICAgICBWUkhBREQgICAgICBkQWNjSDIsIGRBY2NIMiwgZFNyYzJjCi0gICAgICAgIFZSSEFERCAgICAgIGRBY2NIMSwgZEFjY0gxLCBkU3JjMWMKLSAgICAgICAgVlJIQUREICAgICAgZEFjY0gzLCBkQWNjSDMsIGRTcmMzYwotICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMFswXSwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMlswXSwgW1RlbXBdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMVswXSwgW3BEc3RdCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIM1swXSwgW1RlbXBdCi0gICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKLSAgICAgICAgQiAgICAgICAgICAgQmxvY2s0eDRMb29wRW5kICAgICAgICAKLUNhc2VfMgotICAgICAgICA7Ly8gQ2FzZSBiCi0gICAgICAgIE1fUFJJTlRGICJDYXNlIDIgXG4iCi0KLSAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgIzIgICAgICAgIAotICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQotICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMFswXSwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMlswXSwgW1RlbXBdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMVswXSwgW3BEc3RdCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIM1swXSwgW1RlbXBdCi0gICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKLSAgICAgICAgQiAgICAgICAgICAgQmxvY2s0eDRMb29wRW5kICAgICAgICAKLUNhc2VfMwotICAgICAgICA7Ly8gQ2FzZSBjCi0gICAgICAgIE1fUFJJTlRGICJDYXNlIDMgXG4iCi0KLSAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgIzIKLSAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUgICAgICAgIAotICAgICAgICBWUkhBREQgICAgICBkQWNjSDAsIGRBY2NIMCwgZFNyYzBkCi0gICAgICAgIFZSSEFERCAgICAgIGRBY2NIMiwgZEFjY0gyLCBkU3JjMmQKLSAgICAgICAgVlJIQUREICAgICAgZEFjY0gxLCBkQWNjSDEsIGRTcmMxZAotICAgICAgICBWUkhBREQgICAgICBkQWNjSDMsIGRBY2NIMywgZFNyYzNkCi0gICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAKLSAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgwWzBdLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgxWzBdLCBbcERzdF0KLSAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgzWzBdLCBbVGVtcF0KLSAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncwotICAgICAgICBCICAgICAgICAgICBCbG9jazR4NExvb3BFbmQgICAgICAgIAotQ2FzZV80Ci0gICAgICAgIDsvLyBDYXNlIGQKLSAgICAgICAgTV9QUklOVEYgIkNhc2UgNCBcbiIKLQotICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUgICAgICAgIAotICAgICAgICBWUkhBREQgICAgICBkQWNjVjAsIGRBY2NWMCwgZFNyYzAKLSAgICAgICAgVlJIQUREICAgICAgZEFjY1YyLCBkQWNjVjIsIGRTcmMyCi0gICAgICAgIFZSSEFERCAgICAgIGRBY2NWMSwgZEFjY1YxLCBkU3JjMQotICAgICAgICBWUkhBREQgICAgICBkQWNjVjMsIGRBY2NWMywgZFNyYzMKLSAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0VjBbMF0sIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0VjJbMF0sIFtUZW1wXSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0VjFbMF0sIFtwRHN0XQotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0VjNbMF0sIFtUZW1wXQotICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCi0gICAgICAgIEIgICAgICAgICAgIEJsb2NrNHg0TG9vcEVuZCAgICAgICAgCi1DYXNlXzUKLSAgICAgICAgOy8vIENhc2UgZQotICAgICAgICBNX1BSSU5URiAiQ2FzZSA1IFxuIgotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgICAgcFNyY0JLLCBwU3JjCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZSAgICAgICAgCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmNCSywgIzIKLSAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUgICAgICAgIAotICAgICAgICBWUkhBREQgICAgICBkQWNjSDAsIGRBY2NIMCwgZEFjY1YwCi0gICAgICAgIFZSSEFERCAgICAgIGRBY2NIMiwgZEFjY0gyLCBkQWNjVjIKLSAgICAgICAgVlJIQUREICAgICAgZEFjY0gxLCBkQWNjSDEsIGRBY2NWMQotICAgICAgICBWUkhBREQgICAgICBkQWNjSDMsIGRBY2NIMywgZEFjY1YzICAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDBbMF0sIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDJbMF0sIFtUZW1wXSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDFbMF0sIFtwRHN0XQotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDNbMF0sIFtUZW1wXQotICAgICAgICAKLSAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncwotICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZCAgICAgICAgCi1DYXNlXzYKLSAgICAgICAgOy8vIENhc2UgZgotICAgICAgICBNX1BSSU5URiAiQ2FzZSA2IFxuIgotCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCAjMgotICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKLSAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQwLCBxUmVzMiwgIzUgICAgICAgIAotICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDEsIHFSZXMzLCAjNSAgICAgICAgCi0gICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MiwgcVJlczQsICM1ICAgICAgICAKLSAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQzLCBxUmVzNSwgIzUgICAgICAgIAotICAgICAgICBWUkhBREQgICAgICBkVEFjYzAsIGRUQWNjMCwgZFRSZXN1bHQwCi0gICAgICAgIFZSSEFERCAgICAgIGRUQWNjMiwgZFRBY2MyLCBkVFJlc3VsdDIKLSAgICAgICAgVlJIQUREICAgICAgZFRBY2MxLCBkVEFjYzEsIGRUUmVzdWx0MQotICAgICAgICBWUkhBREQgICAgICBkVEFjYzMsIGRUQWNjMywgZFRSZXN1bHQzCi0gICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAKLSAgICAgICAgVlNUMSAgICAgICAgZFRSZXMwWzBdLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFRSZXMyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFRSZXMxWzBdLCBbcERzdF0KLSAgICAgICAgVlNUMSAgICAgICAgZFRSZXMzWzBdLCBbVGVtcF0KLSAgICAgICAgCi0gICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKLSAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQgICAgICAgIAotQ2FzZV83Ci0gICAgICAgIDsvLyBDYXNlIGcKLSAgICAgICAgTV9QUklOVEYgIkNhc2UgNyBcbiIKLSAgICAgICAgTU9WICAgICAgICAgcFNyY0JLLCBwU3JjCi0gICAgICAgIEFERCAgICAgICAgIHBTcmMsIHBTcmMsICMxCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZSAgICAgICAgCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmNCSywgIzIKLSAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUgICAgICAgIAotICAgICAgICBWUkhBREQgICAgICBkQWNjSDAsIGRBY2NIMCwgZEFjY1YwCi0gICAgICAgIFZSSEFERCAgICAgIGRBY2NIMiwgZEFjY0gyLCBkQWNjVjIKLSAgICAgICAgVlJIQUREICAgICAgZEFjY0gxLCBkQWNjSDEsIGRBY2NWMQotICAgICAgICBWUkhBREQgICAgICBkQWNjSDMsIGRBY2NIMywgZEFjY1YzICAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDBbMF0sIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDJbMF0sIFtUZW1wXSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDFbMF0sIFtwRHN0XQotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDNbMF0sIFtUZW1wXQotICAgICAgICAKLSAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncwotICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAotQ2FzZV84Ci0gICAgICAgIDsvLyBDYXNlIGgKLSAgICAgICAgTV9QUklOVEYgIkNhc2UgOCBcbiIKLQotICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUgICAgICAgIAotICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRWMFswXSwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRWMlswXSwgW1RlbXBdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRWMVswXSwgW3BEc3RdCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRWM1swXSwgW1RlbXBdCi0gICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKLSAgICAgICAgQiAgICAgICAgICAgQmxvY2s0eDRMb29wRW5kCi1DYXNlXzkKLSAgICAgICAgOy8vIENhc2UgaQotICAgICAgICBNX1BSSU5URiAiQ2FzZSA5IFxuIgotICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgIzIKLSAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlCi0gICAgICAgIFZFWFQgICAgICAgIGRUZW1wUDAsIGRUZW1wUDAsIGRUZW1wUDEsICMyCi0gICAgICAgIFZFWFQgICAgICAgIGRUZW1wUTAsIGRUZW1wUTAsIGRUZW1wUTEsICMyCi0gICAgICAgIFZFWFQgICAgICAgIGRUZW1wUjAsIGRUZW1wUjAsIGRUZW1wUjEsICMyCi0gICAgICAgIFZFWFQgICAgICAgIGRUZW1wUzAsIGRUZW1wUzAsIGRUZW1wUzEsICMyCi0gICAgICAgIAotICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDAsIHFUZW1wUDAxLCAjNSAgICAgICAgCi0gICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MSwgcVRlbXBRMDEsICM1ICAgICAgICAKLSAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQyLCBxVGVtcFIwMSwgIzUgICAgICAgIAotICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDMsIHFUZW1wUzAxLCAjNSAgICAgICAgCi0KLSAgICAgICAgVlJIQUREICAgICAgZFRBY2MwLCBkVEFjYzAsIGRUUmVzdWx0MAotICAgICAgICBWUkhBREQgICAgICBkVEFjYzIsIGRUQWNjMiwgZFRSZXN1bHQyCi0gICAgICAgIFZSSEFERCAgICAgIGRUQWNjMSwgZFRBY2MxLCBkVFJlc3VsdDEKLSAgICAgICAgVlJIQUREICAgICAgZFRBY2MzLCBkVEFjYzMsIGRUUmVzdWx0MwotICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCi0gICAgICAgIFZTVDEgICAgICAgIGRUUmVzMFswXSwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRUUmVzMlswXSwgW1RlbXBdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRUUmVzMVswXSwgW3BEc3RdCi0gICAgICAgIFZTVDEgICAgICAgIGRUUmVzM1swXSwgW1RlbXBdCi0gICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKLSAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKLUNhc2VfYQotICAgICAgICA7Ly8gQ2FzZSBqCi0gICAgICAgIE1fUFJJTlRGICJDYXNlIGEgXG4iCi0KLSAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsICMyCi0gICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZQotICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCi0gICAgICAgIFZTVDEgICAgICAgIGRUUmVzMFswXSwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRUUmVzMlswXSwgW1RlbXBdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRUUmVzMVswXSwgW3BEc3RdCi0gICAgICAgIFZTVDEgICAgICAgIGRUUmVzM1swXSwgW1RlbXBdCi0gICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKLSAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKLUNhc2VfYgotICAgICAgICA7Ly8gQ2FzZSBrCi0gICAgICAgIE1fUFJJTlRGICJDYXNlIGIgXG4iCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCAjMgotICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKLSAgICAgICAgVkVYVCAgICAgICAgZFRlbXBQMCwgZFRlbXBQMCwgZFRlbXBQMSwgIzMKLSAgICAgICAgVkVYVCAgICAgICAgZFRlbXBRMCwgZFRlbXBRMCwgZFRlbXBRMSwgIzMKLSAgICAgICAgVkVYVCAgICAgICAgZFRlbXBSMCwgZFRlbXBSMCwgZFRlbXBSMSwgIzMKLSAgICAgICAgVkVYVCAgICAgICAgZFRlbXBTMCwgZFRlbXBTMCwgZFRlbXBTMSwgIzMKLSAgICAgICAgCi0gICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MCwgcVRlbXBQMDEsICM1ICAgICAgICAKLSAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQxLCBxVGVtcFEwMSwgIzUgICAgICAgIAotICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDIsIHFUZW1wUjAxLCAjNSAgICAgICAgCi0gICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MywgcVRlbXBTMDEsICM1ICAgICAgICAKLQotICAgICAgICBWUkhBREQgICAgICBkVEFjYzAsIGRUQWNjMCwgZFRSZXN1bHQwCi0gICAgICAgIFZSSEFERCAgICAgIGRUQWNjMiwgZFRBY2MyLCBkVFJlc3VsdDIKLSAgICAgICAgVlJIQUREICAgICAgZFRBY2MxLCBkVEFjYzEsIGRUUmVzdWx0MQotICAgICAgICBWUkhBREQgICAgICBkVEFjYzMsIGRUQWNjMywgZFRSZXN1bHQzCi0gICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAKLSAgICAgICAgVlNUMSAgICAgICAgZFRSZXMwWzBdLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFRSZXMyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFRSZXMxWzBdLCBbcERzdF0KLSAgICAgICAgVlNUMSAgICAgICAgZFRSZXMzWzBdLCBbVGVtcF0KLSAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncwotICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAotQ2FzZV9jCi0gICAgICAgIDsvLyBDYXNlIG4KLSAgICAgICAgTV9QUklOVEYgIkNhc2UgYyBcbiIKLQotICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUgICAgICAgIAotICAgICAgICBWUkhBREQgICAgICBkQWNjVjAsIGRBY2NWMCwgZFNyYzEKLSAgICAgICAgVlJIQUREICAgICAgZEFjY1YyLCBkQWNjVjIsIGRTcmMzCi0gICAgICAgIFZSSEFERCAgICAgIGRBY2NWMSwgZEFjY1YxLCBkU3JjMgotICAgICAgICBWUkhBREQgICAgICBkQWNjVjMsIGRBY2NWMywgZFNyYzQKLSAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0VjBbMF0sIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0VjJbMF0sIFtUZW1wXSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0VjFbMF0sIFtwRHN0XQotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0VjNbMF0sIFtUZW1wXQotICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCi0gICAgICAgIEIgICAgICAgICAgIEJsb2NrNHg0TG9vcEVuZAotQ2FzZV9kCi0gICAgICAgIDsvLyBDYXNlIHAKLSAgICAgICAgTV9QUklOVEYgIkNhc2UgZCBcbiIKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgICAgIHBTcmNCSywgcFNyYwotICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUgICAgICAgIAotICAgICAgICBBREQgICAgICAgICBwU3JjLCBwU3JjQkssIHNyY1N0ZXAKLSAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgIzIKLSAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUgICAgICAgIAotICAgICAgICBWUkhBREQgICAgICBkQWNjSDAsIGRBY2NIMCwgZEFjY1YwCi0gICAgICAgIFZSSEFERCAgICAgIGRBY2NIMiwgZEFjY0gyLCBkQWNjVjIKLSAgICAgICAgVlJIQUREICAgICAgZEFjY0gxLCBkQWNjSDEsIGRBY2NWMQotICAgICAgICBWUkhBREQgICAgICBkQWNjSDMsIGRBY2NIMywgZEFjY1YzICAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDBbMF0sIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDJbMF0sIFtUZW1wXSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDFbMF0sIFtwRHN0XQotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDNbMF0sIFtUZW1wXQotICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCi0gICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCi1DYXNlX2UKLSAgICAgICAgOy8vIENhc2UgcQotICAgICAgICBNX1BSSU5URiAiQ2FzZSBlIFxuIgotICAgICAgICAKLSAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsICMyCi0gICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZQotICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDAsIHFSZXMzLCAjNSAgICAgICAgCi0gICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MSwgcVJlczQsICM1ICAgICAgICAKLSAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQyLCBxUmVzNSwgIzUgICAgICAgIAotICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDMsIHFSZXM2LCAjNSAgICAgICAgCi0KLSAgICAgICAgVlJIQUREICAgICAgZFRBY2MwLCBkVEFjYzAsIGRUUmVzdWx0MAotICAgICAgICBWUkhBREQgICAgICBkVEFjYzIsIGRUQWNjMiwgZFRSZXN1bHQyCi0gICAgICAgIFZSSEFERCAgICAgIGRUQWNjMSwgZFRBY2MxLCBkVFJlc3VsdDEKLSAgICAgICAgVlJIQUREICAgICAgZFRBY2MzLCBkVEFjYzMsIGRUUmVzdWx0MwotICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCi0gICAgICAgIFZTVDEgICAgICAgIGRUUmVzMFswXSwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRUUmVzMlswXSwgW1RlbXBdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRUUmVzMVswXSwgW3BEc3RdCi0gICAgICAgIFZTVDEgICAgICAgIGRUUmVzM1swXSwgW1RlbXBdCi0gICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKLSAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKLUNhc2VfZgotICAgICAgICA7Ly8gQ2FzZSByCi0gICAgICAgIE1fUFJJTlRGICJDYXNlIGYgXG4iCi0gICAgICAgIE1PViAgICAgICAgIHBTcmNCSywgcFNyYwotICAgICAgICBBREQgICAgICAgICBwU3JjLCBwU3JjLCAjMQotICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUgICAgICAgIAotICAgICAgICBBREQgICAgICAgICBwU3JjLCBwU3JjQkssIHNyY1N0ZXAKLSAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgIzIKLSAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUgICAgICAgIAotICAgICAgICBWUkhBREQgICAgICBkQWNjSDAsIGRBY2NIMCwgZEFjY1YwCi0gICAgICAgIFZSSEFERCAgICAgIGRBY2NIMiwgZEFjY0gyLCBkQWNjVjIKLSAgICAgICAgVlJIQUREICAgICAgZEFjY0gxLCBkQWNjSDEsIGRBY2NWMQotICAgICAgICBWUkhBREQgICAgICBkQWNjSDMsIGRBY2NIMywgZEFjY1YzICAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDBbMF0sIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDJbMF0sIFtUZW1wXSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDFbMF0sIFtwRHN0XQotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDNbMF0sIFtUZW1wXQotICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCi0KLQotQmxvY2s0eDRMb29wRW5kCi0KLSAgICAgICAgOy8vIFdpZHRoIExvb3AKLSAgICAgICAgOy8vTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncwotICAgICAgICBMRE0gICAgICAgICBwQXJncywge3BTcmMsc3JjU3RlcCxwRHN0LGRzdFN0ZXB9ICA7Ly8gTG9hZCBhcmd1bWVudHMKLSAgICAgICAgU1VCUyAgICAgICAgaVdpZHRoLCBpV2lkdGgsICM0Ci0gICAgICAgIEFERCAgICAgICAgIHBTcmMsIHBTcmMsICM0ICAgICAgCi0gICAgICAgIEFERCAgICAgICAgIHBEc3QsIHBEc3QsICM0Ci0gICAgICAgIEJHVCAgICAgICAgIEJsb2NrNHg0V2lkdGhMb29wCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gSGVpZ2h0IExvb3AKLSAgICAgICAgU1VCUyAgICAgICAgaUhlaWdodCwgaUhlaWdodCwgIzQKLSAgICAgICAgTV9MRFIgICAgICAgaVdpZHRoLCBwdHJXaWR0aAotICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCi0gICAgICAgIEFERCAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMiAgICAgIAotICAgICAgICBBREQgICAgICAgICBwRHN0LCBwRHN0LCBkc3RTdGVwLCBMU0wgIzIKLSAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgaVdpZHRoCi0gICAgICAgIFNVQiAgICAgICAgIHBEc3QsIHBEc3QsIGlXaWR0aAotICAgICAgICBCR1QgICAgICAgICBCbG9jazR4NEhlaWdodExvb3AKLQotRW5kT2ZJbnRlcnBvbGF0aW9uCi0gICAgICAgIE1PViAgICAgICAgIHIwLCAjMAotICAgICAgICBNX0VORCAgICAgICAKLQotICAgIEVORElGICAKLSAgICAgICAgOy8vIEVuZCBvZiBDb3J0ZXhBOAotICAgICAgICAgICAgICAgICAgICAKLSAgICBFTkQKLSAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZmNDE4Zi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0NTAgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi0gICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX3BJbmRleFRhYmxlOHg4Ci0gICAgICAgIAotOy8vIERlZmluZSB0aGUgcHJvY2Vzc29yIHZhcmlhbnRzIHN1cHBvcnRlZCBieSB0aGlzIGZpbGUKLSAgICAgICAgIAotICAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAotICAgICAKLSAgICAgQVJFQSB0YWJsZSwgREFUQSAgICAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBUaGlzIHRhYmxlIGZvciBpbXBsZW1lbnRpbmcgc3dpdGNoIGNhc2Ugb2YgQyBpbiBhc20gYnkKLTsvLyB0aGUgbWVodG9kIG9mIHR3byBsZXZlbHMgb2YgaW5kZXhpbmcuCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBNX1RBQkxFIGFybVZDTTRQMTBfcEluZGV4VGFibGU4eDgKLSAgICBEQ0QgIE9NWF9WQ19DSFJPTUFfREMsICAgICBPTVhfVkNfQ0hST01BX0hPUiAKLSAgICBEQ0QgIE9NWF9WQ19DSFJPTUFfVkVSVCwgICBPTVhfVkNfQ0hST01BX1BMQU5FICAKLSAgICAKLSAgICBNX1RBQkxFIGFybVZDTTRQMTBfTXVsdGlwbGllclRhYmxlQ2hyb21hOHg4LDEKLSAgICBEQ1cgICAzLCAyLCAxLDQgCi0gICAgRENXICAtMywtMiwtMSwwCi0gICAgRENXICAgMSwgMiwgMyw0Ci0gICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICBJRiBDb3J0ZXhBOAotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFNjcmF0Y2ggdmFyaWFibGUKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gCi1wYyAgICAgICAgICAgICAgUk4gMTUgICAKLXJldHVybiAgICAgICAgICBSTiAwICAKLXBUYWJsZSAgICAgICAgICBSTiA4IAotICAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gSW5wdXQgQXJndW1lbnRzCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcFNyY0xlZnQgICAgICAgIFJOIDAgICAgOy8vIGlucHV0IHBvaW50ZXIKLXBTcmNBYm92ZSAgICAgICBSTiAxICAgIDsvLyBpbnB1dCBwb2ludGVyCi1wU3JjQWJvdmVMZWZ0ICAgUk4gMiAgICA7Ly8gaW5wdXQgcG9pbnRlcgotcERzdCAgICAgICAgICAgIFJOIDMgICAgOy8vIG91dHB1dCBwb2ludGVyCi1sZWZ0U3RlcCAgICAgICAgUk4gNCAgICA7Ly8gaW5wdXQgdmFyaWFibGUKLWRzdFN0ZXAgICAgICAgICBSTiA1ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQotcHJlZE1vZGUgICAgICAgIFJOIDYgICAgOy8vIGlucHV0IHZhcmlhYmxlCi1hdmFpbGFiaWxpdHkgICAgUk4gNyAgICA7Ly8gaW5wdXQgdmFyaWFibGUKLXBNdWx0aXBsaWVyVGFibGUgICAgUk4gIDIgICAgIAotCi1wVG1wICAgICAgICAgICAgUk4gOQotc3RlcCAgICAgICAgICAgIFJOIDEwCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIE5lb24gUmVnaXN0ZXJzCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotOy8vIE9NWF9WQ19DSFJPTUFfSE9SCi0KLWRMZWZ0VmFsMCAgICAgICBETiAgRDAuOAotZExlZnRWYWwxICAgICAgIEROICBEMS44Ci1kTGVmdFZhbDIgICAgICAgRE4gIEQyLjgKLWRMZWZ0VmFsMyAgICAgICBETiAgRDMuOAotZExlZnRWYWw0ICAgICAgIEROICBENC44Ci1kTGVmdFZhbDUgICAgICAgRE4gIEQ1LjgKLWRMZWZ0VmFsNiAgICAgICBETiAgRDYuOAotZExlZnRWYWw3ICAgICAgIEROICBENy44Ci0KLTsvLyBPTVhfVkNfQ0hST01BX1ZFUlQKLQotZEFib3ZlVmFsICAgICAgIEROICBEMC5VOAotCi07Ly8gT01YX1ZDX0NIUk9NQV9EQwotCi1kTGVmdFZhbCAgICAgICAgRE4gIEQxLlU4Ci1kU3VtQWJvdmVWYWxVMTYgRE4gIEQyLlUxNgotZFN1bUFib3ZlVmFsVTMyIEROICBEMy5VMzIKLWRTdW1BYm92ZVZhbFU4ICBETiAgRDMuVTgKLWRTdW1MZWZ0VmFsVTE2ICBETiAgRDIuVTE2Ci1kU3VtTGVmdFZhbFUzMiAgRE4gIEQxLlUzMgotZFN1bUxlZnRWYWxVOCAgIEROICBEMS5VOAotZFN1bUFib3ZlTGVmdCAgIEROICBEMi5VMzIKLWRTdW1BYm92ZUxlZnRVOCBETiAgRDIuVTgKLWRJbmRleFJvdzBVOCAgICBETiAgRDUuVTgKLWRJbmRleFJvdzAgICAgICBETiAgRDUuVTY0Ci1kSW5kZXhSb3c0VTggICAgRE4gIEQ2LlU4Ci1kSW5kZXhSb3c0ICAgICAgRE4gIEQ2LlU2NAotZERzdFJvdzAgICAgICAgIEROICBEMC5VOAotZERzdFJvdzQgICAgICAgIEROICBENC5VOAotZENvbnN0MTI4VTggICAgIEROICBEMC5VOAotCi07Ly8gT01YX1ZDX0NIUk9NQV9QTEFORQotCi1kUmV2QWJvdmVWYWwgICAgRE4gIEQzLlU4ICAKLWRSZXZBYm92ZVZhbFU2NCBETiAgRDMuVTY0ICAKLWRBYm92ZUxlZnRWYWwgICBETiAgRDIuVTgKLXFBYm92ZTdtaW51czAgICBRTiAgUTMuUzE2IAotcUFib3ZlRGlmZiAgICAgIFFOICBRMi5TMTYgCi1kSW5kZXggICAgICAgICAgRE4gIEQ4LlU4ICAKLWREaWZmQWJvdmVVOCAgICBETiAgRDkuVTggIAotZERpZmZBYm92ZVMxNiAgIEROICBEOS5TMTYgCi1kQWJvdmVEaWZmMFU4ICAgRE4gIEQ0LlU4ICAKLWRBYm92ZURpZmYwVTY0ICBETiAgRDQuVTY0Ci1kQWJvdmU3bWludXMwVTggRE4gIEQ2LlU4ICAKLWRNdWx0aXBsaWVyICAgICBETiAgRDEwLlMxNiAKLWRIb3JQcmVkICAgICAgICBETiAgRDExLlMxNiAKLWRSZXZMZWZ0VmFsICAgICBETiAgRDMuVTgKLWRSZXZMZWZ0VmFsVTY0ICBETiAgRDMuVTY0Ci1xTGVmdDdtaW51czAgICAgUU4gIFE3LlMxNgotcUxlZnREaWZmICAgICAgIFFOICBRNi5TMTYKLWREaWZmTGVmdFU4ICAgICBETiAgRDE2LlU4Ci1kRGlmZkxlZnRTMTYgICAgRE4gIEQxNi5TMTYKLWRMZWZ0RGlmZjBVOCAgICBETiAgRDEyLlU4Ci1kTGVmdERpZmYwVTY0ICAgRE4gIEQxMi5VNjQKLWRMZWZ0N21pbnVzMFU4ICBETiAgRDE0LlU4Ci1kVmVyUHJlZCAgICAgICAgRE4gIEQzLlMxNiAKLWRIVlZhbFMxNiAgICAgICBETiAgRDMuUzE2Ci1kSFZWYWxTMzIgICAgICAgRE4gIEQzLlMzMgotZEhWVGVtcFMzMiAgICAgIEROICBEMi5TMzIKLXFBICAgICAgICAgICAgICBRTiAgUTAuUzE2Ci1xQiAgICAgICAgICAgICAgUU4gIFEyLlMxNgotcUMgICAgICAgICAgICAgIFFOICBRMy5TMTYKLXFNdWx0aXBsaWVyICAgICBRTiAgUTUuUzE2Ci1kTXVsdGlwbGllcjAgICAgRE4gIEQxMC5TMTYKLWRNdWx0aXBsaWVyMSAgICBETiAgRDExLlMxNgotcUMwICAgICAgICAgICAgIFFOICBRMC5TMTYKLXFDMSAgICAgICAgICAgICBRTiAgUTEuUzE2Ci1xQzIgICAgICAgICAgICAgUU4gIFE0LlMxNgotcUMzICAgICAgICAgICAgIFFOICBRNS5TMTYKLXFDNCAgICAgICAgICAgICBRTiAgUTYuUzE2Ci1xQzUgICAgICAgICAgICAgUU4gIFE3LlMxNgotcUM2ICAgICAgICAgICAgIFFOICBROC5TMTYKLXFDNyAgICAgICAgICAgICBRTiAgUTkuUzE2Ci1xU3VtMCAgICAgICAgICAgUU4gIFEwLlMxNgotcVN1bTEgICAgICAgICAgIFFOICBRMS5TMTYKLXFTdW0yICAgICAgICAgICBRTiAgUTQuUzE2Ci1xU3VtMyAgICAgICAgICAgUU4gIFE1LlMxNgotcVN1bTQgICAgICAgICAgIFFOICBRNi5TMTYKLXFTdW01ICAgICAgICAgICBRTiAgUTcuUzE2Ci1xU3VtNiAgICAgICAgICAgUU4gIFE4LlMxNgotcVN1bTcgICAgICAgICAgIFFOICBROS5TMTYKLWRTdW0wICAgICAgICAgICBETiAgRDAuVTgKLWRTdW0xICAgICAgICAgICBETiAgRDEuVTgKLWRTdW0yICAgICAgICAgICBETiAgRDIuVTgKLWRTdW0zICAgICAgICAgICBETiAgRDMuVTgKLWRTdW00ICAgICAgICAgICBETiAgRDQuVTgKLWRTdW01ICAgICAgICAgICBETiAgRDUuVTgKLWRTdW02ICAgICAgICAgICBETiAgRDYuVTgKLWRTdW03ICAgICAgICAgICBETiAgRDcuVTgKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDggc3RhcnRzCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAKLSAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCwgcjEwLCBkMTUKLSAgICAgICAgCi0gICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCi0gICAgICAgIE1fQVJHICAgIExlZnRTdGVwLCAgICAgNAotICAgICAgICBNX0FSRyAgICBEc3RTdGVwLCAgICAgIDQKLSAgICAgICAgTV9BUkcgICAgUHJlZE1vZGUsICAgICA0Ci0gICAgICAgIE1fQVJHICAgIEF2YWlsYWJpbGl0eSwgNAotICAgICAgICAKLSAgICAgICAgTERSICAgICAgcFRhYmxlLD1hcm1WQ000UDEwX3BJbmRleFRhYmxlOHg4ICAgOy8vIExvYWQgaW5kZXggdGFibGUgZm9yIHN3aXRjaCBjYXNlCi0gICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjawotICAgICAgICBNX0xEUiAgICBwcmVkTW9kZSwgUHJlZE1vZGUgICAgICAgICAgICAgICAgICA7Ly8gQXJnIHByZWRNb2RlIGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAKLSAgICAgICAgTV9MRFIgICAgbGVmdFN0ZXAsIExlZnRTdGVwICAgICAgICAgICAgICAgICAgOy8vIEFyZyBsZWZ0U3RlcCBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCi0gICAgICAgIE1fTERSICAgIGRzdFN0ZXAsICBEc3RTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBBcmcgZHN0U3RlcCBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgICAgICAgICAKLSAgICAgICAgTV9MRFIgICAgYXZhaWxhYmlsaXR5LCBBdmFpbGFiaWxpdHkgICAgICAgICAgOy8vIEFyZyBhdmFpbGFiaWxpdHkgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgIHBjLCBbcFRhYmxlLCBwcmVkTW9kZSwgTFNMICMyXSAgICAgIDsvLyBCcmFuY2ggdG8gdGhlIGNhc2UgYmFzZWQgb24gcHJlTW9kZQotCi1PTVhfVkNfQ0hST01BX0RDCi0gICAgICAgIAotICAgICAgICBUU1QgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19MRUZUCi0gICAgICAgIEJFUSAgICAgRENDaHJvbWE4eDhMZWZ0Tm90QXZhaWxhYmxlCi0KLSAgICAgICAgQUREICAgICBwVG1wLCBwU3JjTGVmdCwgbGVmdFN0ZXAKLSAgICAgICAgQUREICAgICBzdGVwLCBsZWZ0U3RlcCwgbGVmdFN0ZXAKLQotICAgICAgICA7Ly8gTG9hZCBMZWZ0IEVkZ2UKLSAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbMF19LFtwU3JjTGVmdF0sc3RlcCAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFswKmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFsxXX0sW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzEqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzJdfSxbcFNyY0xlZnRdLHN0ZXAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMipsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbM119LFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFszKmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFs0XX0sW3BTcmNMZWZ0XSxzdGVwICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzQqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzVdfSxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNSpsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbNl19LFtwU3JjTGVmdF0sc3RlcCAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs2KmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFs3XX0sW3BUbXBdICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzcqbGVmdFN0ZXBdICAgICAgCi0gICAgICAgIAotICAgICAgICBUU1QgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19VUFBFUgotICAgICAgICBCRVEgICAgIERDQ2hyb21hOHg4TGVmdE9ubHlBdmFpbGFibGUKLQotICAgICAgICA7Ly8gTG9hZCBVcHBlciBFZGdlIGFsc28KLSAgICAgICAgVkxEMSAgICAgZEFib3ZlVmFsLFtwU3JjQWJvdmVdICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCB0byA3XSAgCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyICAgICAgICAgICAgICAgICAgICAgOy8vIHJldHVybk5vRXJyb3IKLSAgICAgICAgCi0gICAgICAgIFZQQURETCAgIGRTdW1BYm92ZVZhbFUxNiwgZEFib3ZlVmFsICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWyA2KzcgfCA0KzUgfCAyKzMgfCAwKzEgXSAgICAgICAgICAgICAKLSAgICAgICAgVlBBRERMICAgZFN1bUFib3ZlVmFsVTMyLCBkU3VtQWJvdmVWYWxVMTYgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbIDQrNSs2KzcgfCAgMCsxKzIrMyBdIAotICAgICAgICAgICAgICAgIAotICAgICAgICBWUEFEREwgICBkU3VtTGVmdFZhbFUxNiwgZExlZnRWYWwgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WyA2KzcgfCA0KzUgfCAyKzMgfCAwKzEgXSAgICAgICAgICAgICAKLSAgICAgICAgVlBBRERMICAgZFN1bUxlZnRWYWxVMzIsIGRTdW1MZWZ0VmFsVTE2ICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsgNCs1KzYrNyB8ICAwKzErMiszIF0gICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICBWQUREICAgICBkU3VtQWJvdmVMZWZ0LGRTdW1BYm92ZVZhbFUzMixkU3VtTGVmdFZhbFUzMgotICAgICAgICBWUlNIUiAgICBkU3VtQWJvdmVMZWZ0LGRTdW1BYm92ZUxlZnQsIzMgICAgICAgICAgICAgOy8vIFN1bSA9IChTdW0gKyA0KSA+PiAzCi0gICAgICAgIFZSU0hSICAgIGRTdW1BYm92ZVZhbFUzMixkU3VtQWJvdmVWYWxVMzIsIzIgICAgICAgICA7Ly8gU3VtID0gKFN1bSArIDIpID4+IDIKLSAgICAgICAgVlJTSFIgICAgZFN1bUxlZnRWYWxVMzIsZFN1bUxlZnRWYWxVMzIsIzIgICAgICAgICAgIDsvLyBTdW0gPSAoU3VtICsgMikgPj4gMgotICAgICAgICAKLSAgICAgICAgVk1PViAgICAgZEluZGV4Um93MFU4LCMweDBjICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBWTU9WICAgICBkSW5kZXhSb3c0VTgsIzB4MDQKLSAgICAgICAgVlNITCAgICAgZEluZGV4Um93MCxkSW5kZXhSb3cwLCMzMiAgICAgICAgICAgICAgICAgIDsvLyBpbmRleDAgPSAweDBjMGMwYzBjMDAwMDAwMDAgCi0gICAgICAgIFZTSFIgICAgIGRJbmRleFJvdzQsZEluZGV4Um93NCwjMzIgICAgICAgICAgICAgICAgICA7Ly8gaW5kZXg0ID0gMHgwMDAwMDAwMDA0MDQwNDA0Ci0gICAgICAgIFZBREQgICAgIGRJbmRleFJvdzRVOCxkSW5kZXhSb3c0VTgsZEluZGV4Um93MFU4ICAgICA7Ly8gaW5kZXg0ID0gMHgwYzBjMGMwYzA0MDQwNDA0Ci0gICAgICAgIFZUQkwgICAgIGREc3RSb3cwLHtkU3VtQWJvdmVMZWZ0VTgsZFN1bUFib3ZlVmFsVTh9LGRJbmRleFJvdzBVOAotICAgICAgICBWVEJMICAgICBkRHN0Um93NCx7ZFN1bUxlZnRWYWxVOCxkU3VtQWJvdmVMZWZ0VTh9LGRJbmRleFJvdzRVOAotIAotRENDaHJvbWE4eDhMZWZ0U3RvcmUgICAgICAgCi0gICAgICAgIEFERCAgICAgcFRtcCwgcERzdCwgZHN0U3RlcAotICAgICAgICBBREQgICAgIHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKLSAgICAgICAgCi0gICAgICAgIFZTVDEgICAgIGREc3RSb3cwLFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFswKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKLSAgICAgICAgVlNUMSAgICAgZERzdFJvdzAsW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzEqZHN0U3RlcCt4XSA6MDw9IHggPD0gNwotICAgICAgICBWU1QxICAgICBkRHN0Um93MCxbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMipkc3RTdGVwK3hdIDowPD0geCA8PSA3Ci0gICAgICAgIFZTVDEgICAgIGREc3RSb3cwLFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFszKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKLSAgICAgICAgVlNUMSAgICAgZERzdFJvdzQsW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzQqZHN0U3RlcCt4XSA6MDw9IHggPD0gNwotICAgICAgICBWU1QxICAgICBkRHN0Um93NCxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbNSpkc3RTdGVwK3hdIDowPD0geCA8PSA3Ci0gICAgICAgIFZTVDEgICAgIGREc3RSb3c0LFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFs2KmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKLSAgICAgICAgVlNUMSAgICAgZERzdFJvdzQsW3BUbXBdICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzcqZHN0U3RlcCt4XSA6MDw9IHggPD0gNwotCi0gICAgICAgIE1fRVhJVAotICAgICAgICAKLQotRENDaHJvbWE4eDhMZWZ0T25seUF2YWlsYWJsZQotCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgCi0gICAgICAgIFZQQURETCAgIGRTdW1MZWZ0VmFsVTE2LCBkTGVmdFZhbCAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbIDYrNyB8IDQrNSB8IDIrMyB8IDArMSBdICAgICAgICAgICAgIAotICAgICAgICBWUEFEREwgICBkU3VtTGVmdFZhbFUzMiwgZFN1bUxlZnRWYWxVMTYgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WyA0KzUrNis3IHwgIDArMSsyKzMgXSAgIAotICAgICAgICBWUlNIUiAgICBkU3VtTGVmdFZhbFUzMixkU3VtTGVmdFZhbFUzMiwjMiAgICAgICAgICAgOy8vIFN1bSA9IChTdW0gKyAyKSA+PiAyCi0gICAgICAgIAotICAgICAgICBWRFVQICAgICBkRHN0Um93MCxkU3VtTGVmdFZhbFU4WzBdCi0gICAgICAgIFZEVVAgICAgIGREc3RSb3c0LGRTdW1MZWZ0VmFsVThbNF0KLSAgICAgICAgCi0gICAgICAgIEIgICAgICAgIERDQ2hyb21hOHg4TGVmdFN0b3JlICAKLSAgICAgICAgCi0KLURDQ2hyb21hOHg4TGVmdE5vdEF2YWlsYWJsZQotICAgICAgICAgICAgICAgICAKLSAgICAgICAgVFNUICAgICBhdmFpbGFiaWxpdHksICNPTVhfVkNfVVBQRVIKLSAgICAgICAgQkVRICAgICBEQ0Nocm9tYTh4OE5vbmVBdmFpbGFibGUKLQotICAgICAgICA7Ly8gTG9hZCBVcHBlciBFZGdlIAotICAgICAgICBWTEQxICAgICBkQWJvdmVWYWwsW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswIHRvIDddICAKLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VyciAgICAgICAgICAgICAgICAgICAgIDsvLyByZXR1cm5Ob0Vycm9yCi0gICAgICAgIAotICAgICAgICBWUEFEREwgICBkU3VtQWJvdmVWYWxVMTYsIGRBYm92ZVZhbCAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVsgNis3IHwgNCs1IHwgMiszIHwgMCsxIF0gICAgICAgICAgICAgCi0gICAgICAgIFZQQURETCAgIGRTdW1BYm92ZVZhbFUzMiwgZFN1bUFib3ZlVmFsVTE2ICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWyA0KzUrNis3IHwgIDArMSsyKzMgXSAKLSAgICAgICAgVlJTSFIgICAgZFN1bUFib3ZlVmFsVTMyLGRTdW1BYm92ZVZhbFUzMiwjMiAgICAgICAgIDsvLyBTdW0gPSAoU3VtICsgMikgPj4gMgotICAgICAgICBWTU9WICAgICBkSW5kZXhSb3cwVTgsIzB4MDQKLSAgICAgICAgVlNITCAgICAgZEluZGV4Um93MCxkSW5kZXhSb3cwLCMzMiAgICAgICAgICAgICAgICAgIDsvLyBpbmRleCA9IDB4MDQwNDA0MDQwMDAwMDAwMAotICAgICAgICBWVEJMICAgICBkRHN0Um93MCx7ZFN1bUFib3ZlVmFsVTh9LGRJbmRleFJvdzBVOCAKLSAgICAgICAgCi0gICAgICAgIEIgICAgICAgIERDQ2hyb21hOHg4VXBwZXJTdG9yZQotICAgICAgICAKLQotRENDaHJvbWE4eDhOb25lQXZhaWxhYmxlICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFZNT1YgICAgIGRDb25zdDEyOFU4LCMweDgwICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gMHg4MDgwODA4MDgwODA4MDgwIGlmKGNvdW50ID09IDApCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIgICAgICAgICAgICAgICAgICAgICA7Ly8gcmV0dXJuTm9FcnJvcgotCi1EQ0Nocm9tYTh4OFVwcGVyU3RvcmUgICAgICAgIAotICAgICAgICAKLSAgICAgICAgQUREICAgICBwVG1wLCBwRHN0LCBkc3RTdGVwCi0gICAgICAgIEFERCAgICAgc3RlcCwgZHN0U3RlcCwgZHN0U3RlcAotICAgICAgICAKLSAgICAgICAgVlNUMSAgICAgZERzdFJvdzAsW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzAqZHN0U3RlcCt4XSA6MDw9IHggPD0gNwotICAgICAgICBWU1QxICAgICBkRHN0Um93MCxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMSpkc3RTdGVwK3hdIDowPD0geCA8PSA3Ci0gICAgICAgIFZTVDEgICAgIGREc3RSb3cwLFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFsyKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKLSAgICAgICAgVlNUMSAgICAgZERzdFJvdzAsW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzMqZHN0U3RlcCt4XSA6MDw9IHggPD0gNwotICAgICAgICBWU1QxICAgICBkRHN0Um93MCxbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbNCpkc3RTdGVwK3hdIDowPD0geCA8PSA3Ci0gICAgICAgIFZTVDEgICAgIGREc3RSb3cwLFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFs1KmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKLSAgICAgICAgVlNUMSAgICAgZERzdFJvdzAsW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzYqZHN0U3RlcCt4XSA6MDw9IHggPD0gNwotICAgICAgICBWU1QxICAgICBkRHN0Um93MCxbcFRtcF0gICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbNypkc3RTdGVwK3hdIDowPD0geCA8PSA3Ci0gICAgICAgIAotICAgICAgICBNX0VYSVQKLQotCi1PTVhfVkNfQ0hST01BX1ZFUlQKLSAgICAgICAgCi0gICAgICAgIFZMRDEgICAgIGRBYm92ZVZhbCxbcFNyY0Fib3ZlXSAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlW3hdICAgICAgOjA8PSB4IDw9IDcgICAKLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgotICAgICAgICAKLSAgICAgICAgQiAgICAgICAgRENDaHJvbWE4eDhVcHBlclN0b3JlCi0gICAgICAgIAotCi1PTVhfVkNfQ0hST01BX0hPUgotICAgICAgICAKLSAgICAgICAgQUREICAgICBwVG1wLCBwU3JjTGVmdCwgbGVmdFN0ZXAKLSAgICAgICAgQUREICAgICBzdGVwLCBsZWZ0U3RlcCwgbGVmdFN0ZXAKLSAgICAgICAgCi0gICAgICAgIFZMRDEgICAge2RMZWZ0VmFsMFtdfSxbcFNyY0xlZnRdLHN0ZXAgICAgICAgICAgIDsvLyBwU3JjTGVmdFswKmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFZhbDFbXX0sW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMSpsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRWYWwyW119LFtwU3JjTGVmdF0sc3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzIqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0VmFsM1tdfSxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFszKmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFZhbDRbXX0sW3BTcmNMZWZ0XSxzdGVwICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNCpsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRWYWw1W119LFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzUqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0VmFsNltdfSxbcFNyY0xlZnRdLHN0ZXAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs2KmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFZhbDdbXX0sW3BUbXBdICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNypsZWZ0U3RlcF0KLSAgICAgICAgCi0gICAgICAgIEIgICAgICAgIERDQ2hyb21hOHg4UGxhbmVTdG9yZQotICAgICAgICAKLSAgICAgICAgCi1PTVhfVkNfQ0hST01BX1BMQU5FCi0gICAgICAgIEFERCAgICAgcFRtcCwgcFNyY0xlZnQsIGxlZnRTdGVwCi0gICAgICAgIEFERCAgICAgc3RlcCwgbGVmdFN0ZXAsIGxlZnRTdGVwCi0gICAgICAgIAotICAgICAgICBWTEQxICAgIGRBYm92ZVZhbCxbcFNyY0Fib3ZlXSAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVt4XSAgICAgIDowPD0geCA8PSA3ICAgCi0gICAgICAgIFZMRDEgICAgZEFib3ZlTGVmdFZhbFswXSxbcFNyY0Fib3ZlTGVmdF0KLSAgICAgICAgCi0gICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzBdfSxbcFNyY0xlZnRdLHN0ZXAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMCpsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbMV19LFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsxKmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFsyXX0sW3BTcmNMZWZ0XSxzdGVwICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzIqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzNdfSxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMypsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbNF19LFtwU3JjTGVmdF0sc3RlcCAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs0KmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFs1XX0sW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzUqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzZdfSxbcFNyY0xlZnRdLHN0ZXAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNipsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbN119LFtwVG1wXSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs3KmxlZnRTdGVwXSAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBWUkVWNjQgIGRSZXZBYm92ZVZhbCxkQWJvdmVWYWwgICAgICAgICAgICAgICAgICAgICAgOy8vIFJldmVyc2Ugb3JkZXIgb2YgYnl0ZXMgPSBwU3JjQWJvdmVbMDoxOjI6Mzo0OjU6Njo3XQotICAgICAgICBWU1VCTCAgIHFBYm92ZTdtaW51czAsZFJldkFib3ZlVmFsLGRBYm92ZUxlZnRWYWwgICAgOy8vIHFBYm92ZTdtaW51czBbMF0gPSBwU3JjQWJvdmVbN10gLSBwU3JjQWJvdmVMZWZ0WzBdCi0gICAgICAgIFZTSFIgICAgZFJldkFib3ZlVmFsVTY0LGRSZXZBYm92ZVZhbFU2NCwjOCAgICAgICAgICA7Ly8gcFNyY0Fib3ZlW1g6MDoxOjI6Mzo0OjU6Nl0KLSAgICAgICAgVlNVQkwgICBxQWJvdmVEaWZmLGRSZXZBYm92ZVZhbCxkQWJvdmVWYWwgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNl0gLSBwU3JjQWJvdmVbMF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNV0gLSBwU3JjQWJvdmVbMV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNF0gLSBwU3JjQWJvdmVbMl0KLSAgICAgICAgCi0gICAgICAgIFZSRVY2NCAgZFJldkxlZnRWYWwsZExlZnRWYWwgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUmV2ZXJzZSBvcmRlciBvZiBieXRlcyA9IHBTcmNMZWZ0WzA6MToyOjM6NDo1OjY6N10KLSAgICAgICAgVlNVQkwgICBxTGVmdDdtaW51czAsZFJldkxlZnRWYWwsZEFib3ZlTGVmdFZhbCAgICAgIDsvLyBxQWJvdmU3bWludXMwWzBdID0gcFNyY0xlZnRbN10gLSBwU3JjQWJvdmVMZWZ0WzBdCi0gICAgICAgIFZTSFIgICAgZFJldkxlZnRWYWxVNjQsZFJldkxlZnRWYWxVNjQsIzggICAgICAgICAgICA7Ly8gcFNyY0xlZnRbWDowOjE6MjozOjQ6NTo2XQotICAgICAgICBWU1VCTCAgIHFMZWZ0RGlmZixkUmV2TGVmdFZhbCxkTGVmdFZhbCAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzZdIC0gcFNyY0xlZnRbMF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs1XSAtIHBTcmNMZWZ0WzFdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNF0gLSBwU3JjTGVmdFsyXQotICAgICAgICAKLSAgICAgICAgTERSICAgICBwTXVsdGlwbGllclRhYmxlLD1hcm1WQ000UDEwX011bHRpcGxpZXJUYWJsZUNocm9tYTh4OCAgIDsvLyBVc2VkIHRvIGNhbGN1bGF0ZSBIdmFsICYgVnZhbCAgCi0gICAgICAgIFZTSEwgICAgZEFib3ZlRGlmZjBVNjQsZEFib3ZlRGlmZjBVNjQsIzE2ICAKLSAgICAgICAgVkVYVCAgICBkRGlmZkFib3ZlVTgsZEFib3ZlRGlmZjBVOCxkQWJvdmU3bWludXMwVTgsIzIgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbIDctMCB8IDQtMiB8IDUtMSB8IDYtMCBdCi0gICAgICAgIFZMRDEgICAgZE11bHRpcGxpZXIsW3BNdWx0aXBsaWVyVGFibGVdISAKLSAgICAgICAgVlNITCAgICBkTGVmdERpZmYwVTY0LGRMZWZ0RGlmZjBVNjQsIzE2ICAKLSAgICAgICAgVkVYVCAgICBkRGlmZkxlZnRVOCxkTGVmdERpZmYwVTgsZExlZnQ3bWludXMwVTgsIzIgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsgNy0wIHwgNC0yIHwgNS0xIHwgNi0wIF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICBWTVVMICAgIGRIb3JQcmVkLGREaWZmQWJvdmVTMTYsZE11bHRpcGxpZXIgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVsgNCooNy0wKSB8IDEqKDQtMikgfCAyKig1LTEpIHwgMyooNi0wKSBdCi0gICAgICAgIFZNVUwgICAgZFZlclByZWQsZERpZmZMZWZ0UzE2LGRNdWx0aXBsaWVyCi0gICAgICAgIFZQQUREICAgZEhWVmFsUzE2LGRIb3JQcmVkLGRWZXJQcmVkCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgVlBBRERMICBkSFZWYWxTMzIsZEhWVmFsUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbVnxIXSBpbiAzMiBiaXRzIGVhY2gKLSAgICAgICAgVlNITCAgICBkSFZUZW1wUzMyLGRIVlZhbFMzMiwjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAxNypIID0gMTYqSCArIEggPSAoSDw8NCkrSAotICAgICAgICBWQUREICAgIGRIVlZhbFMzMixkSFZWYWxTMzIsZEhWVGVtcFMzMiAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFsgMTcqViAgfCAxNypIIF1pbiAzMiBiaXRzIGVhY2gKLSAgICAgICAgVkxEMSAgICB7ZE11bHRpcGxpZXIwLGRNdWx0aXBsaWVyMX0sW3BNdWx0aXBsaWVyVGFibGVdICAgICAgICAgIDsvLyBxTXVsdGlwbGllciA9IFsgNHwzfDJ8MXwwfC0xfC0yfC0zIF0gIAotICAgICAgICBWUlNIUiAgIGRIVlZhbFMzMixkSFZWYWxTMzIsIzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFtjfGJdIGluIDE2Yml0cyBlYWNoCi0gICAgICAgIFZBRERMICAgcUEsZEFib3ZlVmFsLGRMZWZ0VmFsCi0gICAgICAgIFZEVVAgICAgcUEscUFbN10KLSAgICAgICAgVlNITCAgICBxQSxxQSwjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbYXxhfGF8YXxhfGF8YXxhXQotICAgICAgICBWRFVQICAgIHFCLGRIVlZhbFMxNlswXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFtifGJ8YnxifGJ8YnxifGJdCi0gICAgICAgIFZEVVAgICAgcUMsZEhWVmFsUzE2WzJdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gW2N8Y3xjfGN8Y3xjfGN8Y10KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBWTVVMICAgIHFCLHFCLHFNdWx0aXBsaWVyCi0gICAgICAgIFZNVUwgICAgcUMscUMscU11bHRpcGxpZXIKLSAgICAgICAgVkFERCAgICBxQixxQixxQSAKLSAgICAgICAgCi0gICAgICAgIFZEVVAgICAgcUMwLHFDWzBdCi0gICAgICAgIFZEVVAgICAgcUMxLHFDWzFdCi0gICAgICAgIFZEVVAgICAgcUMyLHFDWzJdCi0gICAgICAgIFZEVVAgICAgcUMzLHFDWzNdCi0gICAgICAgIFZEVVAgICAgcUM0LHFDWzRdCi0gICAgICAgIFZEVVAgICAgcUM1LHFDWzVdCi0gICAgICAgIFZEVVAgICAgcUM2LHFDWzZdCi0gICAgICAgIFZEVVAgICAgcUM3LHFDWzddCi0gICAgICAgIAotICAgICAgICBWQUREICAgIHFTdW0wLHFCLHFDMAotICAgICAgICBWQUREICAgIHFTdW0xLHFCLHFDMQotICAgICAgICBWQUREICAgIHFTdW0yLHFCLHFDMgotICAgICAgICBWQUREICAgIHFTdW0zLHFCLHFDMwotICAgICAgICBWQUREICAgIHFTdW00LHFCLHFDNAotICAgICAgICBWQUREICAgIHFTdW01LHFCLHFDNQotICAgICAgICBWQUREICAgIHFTdW02LHFCLHFDNgotICAgICAgICBWQUREICAgIHFTdW03LHFCLHFDNwotICAgICAgICAKLSAgICAgICAgVlFSU0hSVU4gZFN1bTAscVN1bTAsIzUgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIChPTVhfVTgpYXJtQ2xpcCgwLDI1NSwoU3VtKzE2KT4+NSkKLSAgICAgICAgVlFSU0hSVU4gZFN1bTEscVN1bTEsIzUKLSAgICAgICAgVlFSU0hSVU4gZFN1bTIscVN1bTIsIzUKLSAgICAgICAgVlFSU0hSVU4gZFN1bTMscVN1bTMsIzUKLSAgICAgICAgVlFSU0hSVU4gZFN1bTQscVN1bTQsIzUKLSAgICAgICAgVlFSU0hSVU4gZFN1bTUscVN1bTUsIzUKLSAgICAgICAgVlFSU0hSVU4gZFN1bTYscVN1bTYsIzUKLSAgICAgICAgVlFSU0hSVU4gZFN1bTcscVN1bTcsIzUgICAgICAKLQotRENDaHJvbWE4eDhQbGFuZVN0b3JlICAgICAgICAKLSAgICAgICAgQUREICAgICBwVG1wLCBwRHN0LCBkc3RTdGVwCi0gICAgICAgIEFERCAgICAgc3RlcCwgZHN0U3RlcCwgZHN0U3RlcAotICAgICAgICAKLSAgICAgICAgVlNUMSAgICBkU3VtMCxbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMCpkc3RTdGVwK3hdIDowPD0geCA8PSA3Ci0gICAgICAgIFZTVDEgICAgZFN1bTEsW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzEqZHN0U3RlcCt4XSA6MDw9IHggPD0gNwotICAgICAgICBWU1QxICAgIGRTdW0yLFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFsyKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKLSAgICAgICAgVlNUMSAgICBkU3VtMyxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMypkc3RTdGVwK3hdIDowPD0geCA8PSA3Ci0gICAgICAgIFZTVDEgICAgZFN1bTQsW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzQqZHN0U3RlcCt4XSA6MDw9IHggPD0gNwotICAgICAgICBWU1QxICAgIGRTdW01LFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFs1KmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKLSAgICAgICAgVlNUMSAgICBkU3VtNixbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbNipkc3RTdGVwK3hdIDowPD0geCA8PSA3Ci0gICAgICAgIFZTVDEgICAgZFN1bTcsW3BUbXBdICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzcqZHN0U3RlcCt4XSA6MDw9IHggPD0gNyAgICAgICAKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgotICAgICAgICBNX0VORAotICAgICAgICAKLSAgICAgICAgRU5ESUYgOy8vIENvcnRleEE4Ci0gICAgICAgIAotICAgICAgICBFTkQKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4IGVuZHMKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTZfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTMzMWY0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTZfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsNDM4ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNl9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLSAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAotICAgICAKLSAgCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gVGhpcyB0YWJsZSBmb3IgaW1wbGVtZW50aW5nIHN3aXRjaCBjYXNlIG9mIEMgaW4gYXNtIGJ5Ci07Ly8gdGhlIG1laHRvZCBvZiB0d28gbGV2ZWxzIG9mIGluZGV4aW5nLgotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgTV9UQUJMRSBhcm1WQ000UDEwX3BJbmRleFRhYmxlMTZ4MTYKLSAgICBEQ0QgIE9NWF9WQ18xNlgxNl9WRVJULCBPTVhfVkNfMTZYMTZfSE9SIAotICAgIERDRCAgT01YX1ZDXzE2WDE2X0RDLCAgIE9NWF9WQ18xNlgxNl9QTEFORQotICAgIAotCi0gICAgSUYgQ29ydGV4QTgKLQotICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9NdWx0aXBsaWVyVGFibGUxNngxNiwxCi0gICAgRENXICAgNywgIDYsICA1LCAgNCwgIDMsICAyLCAgMSwgIDggCi0gICAgRENXICAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcKLSAgICBEQ1cgICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNQotICAgICAgICAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gQ29uc3RhbnRzIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAotQkxLX1NJWkUgICAgICAgIEVRVSAweDEwCi1NVUxfQ09OU1QwICAgICAgRVFVIDB4MDEwMTAxMDEKLU1VTF9DT05TVDEgICAgICBFUVUgMHgwMDA2MDAwNAotTVVMX0NPTlNUMiAgICAgIEVRVSAweDAwMDcwMDA1Ci1NVUxfQ09OU1QzICAgICAgRVFVIDB4MDAwMzAwMDEKLU1BU0tfQ09OU1QgICAgICBFUVUgMHgwMEZGMDBGRgotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFNjcmF0Y2ggdmFyaWFibGUKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi15ICAgICAgICAgICAgICAgUk4gMTIgICAKLXBjICAgICAgICAgICAgICBSTiAxNSAgIAotCi1yZXR1cm4gICAgICAgICAgUk4gMCAgICAKLXBUYWJsZSAgICAgICAgICBSTiA5ICAgIAotY291bnQgICAgICAgICAgIFJOIDExICAgCi1wTXVsdFRhYmxlICAgICAgUk4gOQotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IE5lb24gcmVnaXN0ZXJzCi07IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXFBYm92ZSAgICAgICAgICBRTiBRMC5VOAotcUxlZnQgICAgICAgICAgIFFOIFExLlU4Ci1xU3VtOCAgICAgICAgICAgUU4gUTAuVTE2Ci1kU3VtODAgICAgICAgICAgRE4gRDAuVTE2Ci1kU3VtODEgICAgICAgICAgRE4gRDEuVTE2Ci1kU3VtNCAgICAgICAgICAgRE4gRDAuVTE2Ci1kU3VtMiAgICAgICAgICAgRE4gRDAuVTMyCi1kU3VtMSAgICAgICAgICAgRE4gRDAuVTY0Ci1xT3V0ICAgICAgICAgICAgUU4gUTMuVTgKLWRTdW1MZWZ0ICAgICAgICBETiBENi5VNjQKLWRTdW1BYm92ZSAgICAgICBETiBENy5VNjQKLWRTdW0gICAgICAgICAgICBETiBEOC5VNjQKLWRTdW0wICAgICAgICAgICBETiBEOC5VOFswXQotCi1xSCAgICAgICAgICAgICAgUU4gUTExLlMzMgotcVYgICAgICAgICAgICAgIFFOIFExMi5TMzIKLXFBICAgICAgICAgICAgICBRTiBRMTEuUzE2Ci1xQiAgICAgICAgICAgICAgUU4gUTYuUzE2Ci1xQyAgICAgICAgICAgICAgUU4gUTcuUzE2Ci0KLXFCMCAgICAgICAgICAgICBRTiBRNS5TMTYKLXFCMSAgICAgICAgICAgICBRTiBRNi5TMTYKLWRBMSAgICAgICAgICAgICBETiBEMjMuUzE2Ci0KLWRIMCAgICAgICAgICAgICBETiBEMjIuUzMyCi1kSDEgICAgICAgICAgICAgRE4gRDIzLlMzMgotZFYwICAgICAgICAgICAgIEROIEQyNC5TMzIKLWRWMSAgICAgICAgICAgICBETiBEMjUuUzMyCi0KLXFIViAgICAgICAgICAgICBRTiBRMTEuUzY0Ci1xSFYwICAgICAgICAgICAgUU4gUTExLlMzMgotcUhWMSAgICAgICAgICAgIFFOIFExMi5TNjQKLQotZEhWMDAgICAgICAgICAgIEROIEQyMi5TMzIKLWRIVjAxICAgICAgICAgICBETiBEMjMuUzMyCi0KLWRIVjAgICAgICAgICAgICBETiBEMjIuUzE2WzBdCi1kSFYxICAgICAgICAgICAgRE4gRDIzLlMxNlswXQotZEhWMTAgICAgICAgICAgIEROIEQyNC5TNjQKLWRIVjExICAgICAgICAgICBETiBEMjUuUzY0Ci0KLXFTdW0wICAgICAgICAgICBRTiBRMC5TMTYKLXFTdW0xICAgICAgICAgICBRTiBRMS5TMTYKLQotZE91dDAgICAgICAgICAgIEROIEQ2LlU4Ci1kT3V0MSAgICAgICAgICAgRE4gRDcuVTgKLQotZExlZnQwICAgICAgICAgIEROIEQyLlU4Ci1kTGVmdDEgICAgICAgICAgRE4gRDMuVTgKLXFDb25zdCAgICAgICAgICBRTiBRMTMuUzE2Ci0KLWRBYm92ZTAgICAgICAgICBETiBEMC5VOAotZEFib3ZlMSAgICAgICAgIEROIEQxLlU4Ci0KLWRSZXZMZWZ0NjQgICAgICBETiBEMTIuVTY0Ci1kUmV2TGVmdCAgICAgICAgRE4gRDEyLlU4Ci1kUmV2QWJvdmU2NCAgICAgRE4gRDUuVTY0Ci1kUmV2QWJvdmUgICAgICAgRE4gRDUuVTgKLXFMZWZ0RGlmZiAgICAgICBRTiBROC5TMTYKLWRMZWZ0RGlmZjEgICAgICBETiBEMTcuUzE2Ci1kTGVmdERpZmY2NCAgICAgRE4gRDE3LlM2NAotcURpZmZMZWZ0ICAgICAgIFFOIFE4LlMxNgotcURpZmZBYm92ZSAgICAgIFFOIFE0LlMxNgotZEFib3ZlRGlmZjEgICAgIEROIEQ5LlMxNgotZEFib3ZlRGlmZjY0ICAgIEROIEQ5LlM2NAotcUFib3ZlRGlmZiAgICAgIFFOIFE0LlMxNgotCi1kQWJvdmVMZWZ0ICAgICAgRE4gRDQuVTgKLQotZERpZmZMZWZ0MCAgICAgIEROIEQxNi5TMTYKLWREaWZmTGVmdDEgICAgICBETiBEMTcuUzE2Ci1kRGlmZkFib3ZlMCAgICAgRE4gRDguUzE2Ci1kRGlmZkFib3ZlMSAgICAgRE4gRDkuUzE2Ci0KLXFMZWZ0MTVtaW51czAgICBRTiBRNy5TMTYKLWRMZWZ0MTVtaW51czAgICBETiBEMTQuUzE2Ci1xQWJvdmUxNW1pbnVzMCAgUU4gUTMuUzE2Ci1kQWJvdmUxNW1pbnVzMCAgRE4gRDYuUzE2Ci0KLXFNdWx0aXBsaWVyICAgICBRTiBRMTAuUzE2Ci1xTXVsdGlwbGllcjAgICAgUU4gUTEwLlMxNgotcU11bHRpcGxpZXIxICAgIFFOIFExMi5TMTYKLWRNdWx0aXBsaWVyMCAgICBETiBEMjAuUzE2Ci1kTXVsdGlwbGllcjEgICAgRE4gRDIxLlMxNgotCi1kQlBsdXNDTXVsdDcgICAgRE4gRDEuUzY0Ci1kQlBsdXNDTXVsdDdTMTYgRE4gRDEuUzE2Ci0KLXFUbXAgICAgICAgICAgICBRTiBRMC5VOAotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcFNyY0xlZnQgICAgICAgIFJOIDAgICAgOy8vIGlucHV0IHBvaW50ZXIKLXBTcmNBYm92ZSAgICAgICBSTiAxICAgIDsvLyBpbnB1dCBwb2ludGVyCi1wU3JjQWJvdmVMZWZ0ICAgUk4gMiAgICA7Ly8gaW5wdXQgcG9pbnRlcgotcERzdCAgICAgICAgICAgIFJOIDMgICAgOy8vIG91dHB1dCBwb2ludGVyCi1sZWZ0U3RlcCAgICAgICAgUk4gNCAgICA7Ly8gaW5wdXQgdmFyaWFibGUKLWRzdFN0ZXAgICAgICAgICBSTiA1ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQotcHJlZE1vZGUgICAgICAgIFJOIDYgICAgOy8vIGlucHV0IHZhcmlhYmxlCi1hdmFpbGFiaWxpdHkgICAgUk4gNyAgICA7Ly8gaW5wdXQgdmFyaWFibGUKLQotcFRtcCAgICAgICAgICAgIFJOIDgKLXN0ZXAgICAgICAgICAgICBSTiAxMAotcFRtcDIgICAgICAgICAgIFJOIDExCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYgc3RhcnRzCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAKLSAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2LCByMTEsIGQxNQotICAgICAgICAKLSAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKLSAgICAgICAgTV9BUkcgICAgTGVmdFN0ZXAsICAgICA0Ci0gICAgICAgIE1fQVJHICAgIERzdFN0ZXAsICAgICAgNAotICAgICAgICBNX0FSRyAgICBQcmVkTW9kZSwgICAgIDQKLSAgICAgICAgTV9BUkcgICAgQXZhaWxhYmlsaXR5LCA0Ci0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NAotICAgICAgICAKLSAgICAgICAgTERSICAgICAgcFRhYmxlLD1hcm1WQ000UDEwX3BJbmRleFRhYmxlMTZ4MTYgOy8vIExvYWQgaW5kZXggdGFibGUgZm9yIHN3aXRjaCBjYXNlCi0gICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjawotICAgICAgICBNX0xEUiAgICBwcmVkTW9kZSwgUHJlZE1vZGUgICAgICAgICAgICAgICAgICA7Ly8gQXJnIHByZWRNb2RlIGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAKLSAgICAgICAgTV9MRFIgICAgbGVmdFN0ZXAsIExlZnRTdGVwICAgICAgICAgICAgICAgICAgOy8vIEFyZyBsZWZ0U3RlcCBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCi0gICAgICAgIE1fTERSICAgIGRzdFN0ZXAsICBEc3RTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBBcmcgZHN0U3RlcCBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgICAgICAgICAKLSAgICAgICAgTV9MRFIgICAgYXZhaWxhYmlsaXR5LCBBdmFpbGFiaWxpdHkgICAgICAgICAgOy8vIEFyZyBhdmFpbGFiaWxpdHkgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICB5LCAjQkxLX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gT3V0ZXIgTG9vcCBDb3VudAotICAgICAgICBMRFIgICAgICBwYywgW3BUYWJsZSwgcHJlZE1vZGUsIExTTCAjMl0gICAgICA7Ly8gQnJhbmNoIHRvIHRoZSBjYXNlIGJhc2VkIG9uIHByZU1vZGUKLSAgICAgICAgCi1PTVhfVkNfMTZYMTZfVkVSVAotICAgICAgICBWTEQxICAgIHFBYm92ZSwgIFtwU3JjQWJvdmVdCi0gICAgICAgIEFERCAgICAgcFRtcCwgcERzdCwgZHN0U3RlcAotICAgICAgICBBREQgICAgIHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwRHN0XSwgc3RlcAotICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BUbXBdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcERzdF0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwVG1wXSwgc3RlcAotICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BEc3RdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcFRtcF0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwRHN0XSwgc3RlcAotICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BUbXBdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcERzdF0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwVG1wXSwgc3RlcAotICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BEc3RdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcFRtcF0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwRHN0XSwgc3RlcAotICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BUbXBdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcERzdF0KLSAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwVG1wXQotICAgICAgICBNT1YgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIgICAgICAgICAgICAgICA7Ly8gcmV0dXJuTm9FcnJvcgotICAgICAgICBNX0VYSVQKLSAgICAgICAgCi1PTVhfVkNfMTZYMTZfSE9SCi0gICAgICAgIEFERCAgICAgcFRtcCwgcFNyY0xlZnQsIGxlZnRTdGVwCi0gICAgICAgIEFERCAgICAgbGVmdFN0ZXAsIGxlZnRTdGVwLCBsZWZ0U3RlcAotICAgICAgICBBREQgICAgIHBUbXAyLCBwRHN0LCBkc3RTdGVwCi0gICAgICAgIEFERCAgICAgZHN0U3RlcCwgZHN0U3RlcCwgZHN0U3RlcAotTG9vcEhvciAKLSAgICAgICAgVkxEMSAgICAge3FMZWZ0W119LCBbcFNyY0xlZnRdLCBsZWZ0U3RlcCAgICAgICAKLSAgICAgICAgVkxEMSAgICAge3FUbXBbXX0sIFtwVG1wXSwgbGVmdFN0ZXAgICAgICAgCi0gICAgICAgIFNVQlMgICAgIHksIHksICM4Ci0gICAgICAgIFZTVDEgICAgIHFMZWZ0LCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgcVRtcCwgW3BUbXAyXSwgZHN0U3RlcAotICAgICAgICBWTEQxICAgICB7cUxlZnRbXX0sIFtwU3JjTGVmdF0sIGxlZnRTdGVwICAgICAgIAotICAgICAgICBWTEQxICAgICB7cVRtcFtdfSwgW3BUbXBdLCBsZWZ0U3RlcCAgICAgICAKLSAgICAgICAgVlNUMSAgICAgcUxlZnQsIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICBxVG1wLCBbcFRtcDJdLCBkc3RTdGVwCi0gICAgICAgIFZMRDEgICAgIHtxTGVmdFtdfSwgW3BTcmNMZWZ0XSwgbGVmdFN0ZXAgICAgICAgCi0gICAgICAgIFZMRDEgICAgIHtxVG1wW119LCBbcFRtcF0sIGxlZnRTdGVwICAgICAgIAotICAgICAgICBWU1QxICAgICBxTGVmdCwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgIHFUbXAsIFtwVG1wMl0sIGRzdFN0ZXAKLSAgICAgICAgVkxEMSAgICAge3FMZWZ0W119LCBbcFNyY0xlZnRdLCBsZWZ0U3RlcCAgICAgICAKLSAgICAgICAgVkxEMSAgICAge3FUbXBbXX0sIFtwVG1wXSwgbGVmdFN0ZXAgICAgICAgCi0gICAgICAgIFZTVDEgICAgIHFMZWZ0LCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgcVRtcCwgW3BUbXAyXSwgZHN0U3RlcAotICAgICAgICAKLSAgICAgICAgQk5FICAgICAgTG9vcEhvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9vcCBmb3IgMTYgdGltZXMKLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgotICAgICAgICBNX0VYSVQKLSAgICAgICAgCi1PTVhfVkNfMTZYMTZfREMKLSAgICAgICAgTU9WICAgICAgY291bnQsICMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGNvdW50ID0gMAotICAgICAgICBUU1QgICAgICBhdmFpbGFiaWxpdHksICNPTVhfVkNfTEVGVAotICAgICAgICBCRVEgICAgICBVcHBlck9yTm9uZUF2YWlsYWJsZSAgICAgICAgICAgICAgICAgICAgICA7Ly8gSnVtcCB0byBVcHBlciBpZiBub3QgbGVmdAotCi0gICAgICAgIEFERCAgICAgcFRtcCwgcFNyY0xlZnQsIGxlZnRTdGVwCi0gICAgICAgIEFERCAgICAgc3RlcCwgbGVmdFN0ZXAsIGxlZnRTdGVwCi0KLSAgICAgICAgVkxEMSAgICB7cUxlZnRbMF19LCBbcFNyY0xlZnRdLHN0ZXAgICAgCi0gICAgICAgIFZMRDEgICAge3FMZWZ0WzFdfSwgW3BUbXBdLHN0ZXAgICAKLSAgICAgICAgVkxEMSAgICB7cUxlZnRbMl19LCBbcFNyY0xlZnRdLHN0ZXAgICAKLSAgICAgICAgVkxEMSAgICB7cUxlZnRbM119LCBbcFRtcF0sc3RlcAotICAgICAgICBWTEQxICAgIHtxTGVmdFs0XX0sIFtwU3JjTGVmdF0sc3RlcCAgIAotICAgICAgICBWTEQxICAgIHtxTGVmdFs1XX0sIFtwVG1wXSxzdGVwICAgCi0gICAgICAgIFZMRDEgICAge3FMZWZ0WzZdfSwgW3BTcmNMZWZ0XSxzdGVwICAgIAotICAgICAgICBWTEQxICAgIHtxTGVmdFs3XX0sIFtwVG1wXSxzdGVwCi0gICAgICAgIFZMRDEgICAge3FMZWZ0WzhdfSwgW3BTcmNMZWZ0XSxzdGVwICAgIAotICAgICAgICBWTEQxICAgIHtxTGVmdFs5XX0sIFtwVG1wXSxzdGVwICAgCi0gICAgICAgIFZMRDEgICAge3FMZWZ0WzEwXX0sW3BTcmNMZWZ0XSxzdGVwICAgCi0gICAgICAgIFZMRDEgICAge3FMZWZ0WzExXX0sW3BUbXBdLHN0ZXAgICAgCi0gICAgICAgIFZMRDEgICAge3FMZWZ0WzEyXX0sW3BTcmNMZWZ0XSxzdGVwICAgCi0gICAgICAgIFZMRDEgICAge3FMZWZ0WzEzXX0sW3BUbXBdLHN0ZXAgICAKLSAgICAgICAgVkxEMSAgICB7cUxlZnRbMTRdfSxbcFNyY0xlZnRdLHN0ZXAgICAgCi0gICAgICAgIFZMRDEgICAge3FMZWZ0WzE1XX0sW3BUbXBdIAotICAgICAgICAKLSAgICAgICAgVlBBRERMICAgcVN1bTgsIHFMZWZ0Ci0gICAgICAgIEFERCAgICAgY291bnQsIGNvdW50LCAjMSAgICAKLSAgICAgICAgVlBBREQgICAgZFN1bTQsIGRTdW04MCwgZFN1bTgxCi0gICAgICAgIFZQQURETCAgIGRTdW0yLCBkU3VtNAotICAgICAgICBWUEFEREwgICBkU3VtTGVmdCwgZFN1bTIKLSAgICAgICAgVlJTSFIgICAgZFN1bSwgZFN1bUxlZnQsICM0Ci0gICAgICAgIAotVXBwZXJPck5vbmVBdmFpbGFibGUKLSAgICAgICAgVFNUICAgICAgYXZhaWxhYmlsaXR5LCAgI09NWF9WQ19VUFBFUiAgICAgICAgICAgICAgOy8vIGlmKGF2YWlsYWJpbGl0eSAmICNPTVhfVkNfVVBQRVIpCi0gICAgICAgIEJFUSAgICAgIEJvdGhPck5vbmVBdmFpbGFibGUgICAgICAgICAgICAgICAgICAgICAgIDsvLyBKdW1wIHRvIExlZnQgaWYgbm90IHVwcGVyCi0gICAgICAgIFZMRDEgICAgIHFBYm92ZSwgW3BTcmNBYm92ZV0KLSAgICAgICAgQUREICAgICAgY291bnQsIGNvdW50LCAjMSAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGlmIHVwcGVyIGluYyBjb3VudCBieSAxCi0gICAgICAgIFZQQURETCAgIHFTdW04LCBxQWJvdmUKLSAgICAgICAgVlBBREQgICAgZFN1bTQsIGRTdW04MCwgZFN1bTgxCi0gICAgICAgIFZQQURETCAgIGRTdW0yLCBkU3VtNAotICAgICAgICBWUEFEREwgICBkU3VtQWJvdmUsIGRTdW0yCi0gICAgICAgIFZSU0hSICAgIGRTdW0sIGRTdW1BYm92ZSwgIzQKLSAgICAgICAgCi1Cb3RoT3JOb25lQXZhaWxhYmxlCi0gICAgICAgIENNUCAgICAgIGNvdW50LCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY2hlY2sgaWYgYm90aCBhdmFpbGFibGUKLSAgICAgICAgQk5FICAgICAgTm9uZUF2YWlsYWJsZQotICAgICAgICBWQUREICAgICBkU3VtLCBkU3VtQWJvdmUsIGRTdW1MZWZ0Ci0gICAgICAgIFZSU0hSICAgIGRTdW0sIGRTdW0sICM1Ci0gICAgICAgIAotCi1Ob25lQXZhaWxhYmxlCi0gICAgICAgIFZEVVAgICAgIHFPdXQsIGRTdW0wICAgICAgICAKLSAgICAgICAgQ01QICAgICAgY291bnQsICMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjaGVjayBpZiBub25lIGF2YWlsYWJsZQotICAgICAgICBBREQgICAgICBwVG1wLCBwRHN0LCBkc3RTdGVwCi0gICAgICAgIEFERCAgICAgIHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKLSAgICAgICAgQk5FICAgICAgTG9vcERDCi0gICAgICAgIFZNT1YgICAgIHFPdXQsICMxMjgKLUxvb3BEQyAgICAgICAgCi0gICAgICAgIFZTVDEgICAgcU91dCwgW3BEc3RdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcU91dCwgW3BUbXBdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcU91dCwgW3BEc3RdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcU91dCwgW3BUbXBdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcU91dCwgW3BEc3RdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcU91dCwgW3BUbXBdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcU91dCwgW3BEc3RdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcU91dCwgW3BUbXBdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcU91dCwgW3BEc3RdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcU91dCwgW3BUbXBdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcU91dCwgW3BEc3RdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcU91dCwgW3BUbXBdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcU91dCwgW3BEc3RdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcU91dCwgW3BUbXBdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcU91dCwgW3BEc3RdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcU91dCwgW3BUbXBdLCBzdGVwCi0gICAgICAgIE1PViAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgotICAgICAgICBNX0VYSVQKLQotT01YX1ZDXzE2WDE2X1BMQU5FCi0gICAgICAgIExEUiAgICAgcE11bHRUYWJsZSwgPWFybVZDTTRQMTBfTXVsdGlwbGllclRhYmxlMTZ4MTYKLSAgICAgICAgVkxEMSAgICBxQWJvdmUsIFtwU3JjQWJvdmVdICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbeF0gICAgICA6MDw9IHggPD0gNyAgICAKLSAgICAgICAgVkxEMSAgICBkQWJvdmVMZWZ0WzBdLFtwU3JjQWJvdmVMZWZ0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIEFERCAgICAgcFRtcCwgcFNyY0xlZnQsIGxlZnRTdGVwCi0gICAgICAgIEFERCAgICAgc3RlcCwgbGVmdFN0ZXAsIGxlZnRTdGVwCi0gICAgICAgIFZMRDEgICAge3FMZWZ0WzBdfSwgIFtwU3JjTGVmdF0sc3RlcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBWTEQxICAgIHtxTGVmdFsxXX0sICBbcFRtcF0sc3RlcCAgICAgIAotICAgICAgICBWTEQxICAgIHtxTGVmdFsyXX0sICBbcFNyY0xlZnRdLHN0ZXAgIAotICAgICAgICBWTEQxICAgIHtxTGVmdFszXX0sICBbcFRtcF0sc3RlcCAgICAgICAKLSAgICAgICAgVkxEMSAgICB7cUxlZnRbNF19LCAgW3BTcmNMZWZ0XSxzdGVwICAKLSAgICAgICAgVkxEMSAgICB7cUxlZnRbNV19LCAgW3BUbXBdLHN0ZXAgICAgICAKLSAgICAgICAgVkxEMSAgICB7cUxlZnRbNl19LCAgW3BTcmNMZWZ0XSxzdGVwICAgCi0gICAgICAgIFZMRDEgICAge3FMZWZ0WzddfSwgIFtwVG1wXSxzdGVwCi0gICAgICAgIFZMRDEgICAge3FMZWZ0WzhdfSwgIFtwU3JjTGVmdF0sc3RlcCAgIAotICAgICAgICBWTEQxICAgIHtxTGVmdFs5XX0sICBbcFRtcF0sc3RlcCAgICAgIAotICAgICAgICBWTEQxICAgIHtxTGVmdFsxMF19LCBbcFNyY0xlZnRdLHN0ZXAgIAotICAgICAgICBWTEQxICAgIHtxTGVmdFsxMV19LCBbcFRtcF0sc3RlcCAgICAgICAKLSAgICAgICAgVkxEMSAgICB7cUxlZnRbMTJdfSwgW3BTcmNMZWZ0XSxzdGVwICAKLSAgICAgICAgVkxEMSAgICB7cUxlZnRbMTNdfSwgW3BUbXBdLHN0ZXAgICAgICAKLSAgICAgICAgVkxEMSAgICB7cUxlZnRbMTRdfSwgW3BTcmNMZWZ0XSxzdGVwICAgCi0gICAgICAgIFZMRDEgICAge3FMZWZ0WzE1XX0sIFtwVG1wXSAgIAotCi0gICAgICAgIFZSRVY2NCAgZFJldkFib3ZlLCBkQWJvdmUxICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzE1OjE0OjEzOjEyOjExOjEwOjk6OF0gCi0gICAgICAgIFZTVUJMICAgcUFib3ZlMTVtaW51czAsIGRSZXZBYm92ZSwgZEFib3ZlTGVmdCAgICAgICA7Ly8gcUFib3ZlN21pbnVzMFswXSA9IHBTcmNBYm92ZVsxNV0gLSBwU3JjQWJvdmVMZWZ0WzBdIAotICAgICAgICBWU0hSICAgIGRSZXZBYm92ZTY0LCBkUmV2QWJvdmU2NCwgIzggICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVsxNDoxMzoxMjoxMToxMDo5Ojg6WF0gCi0gICAgICAgIFZTVUJMICAgcUFib3ZlRGlmZiwgZFJldkFib3ZlLCBkQWJvdmUwICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFZTSEwgICAgZEFib3ZlRGlmZjY0LCBkQWJvdmVEaWZmNjQsICMxNiAKLSAgICAgICAgVkVYVCAgICBkRGlmZkFib3ZlMSwgZEFib3ZlRGlmZjEsIGRBYm92ZTE1bWludXMwLCAjMSAgCi0KLSAgICAgICAgVlJFVjY0ICBkUmV2TGVmdCxkTGVmdDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsxNToxNDoxMzoxMjoxMToxMDo5OjhdIAotICAgICAgICBWU1VCTCAgIHFMZWZ0MTVtaW51czAsZFJldkxlZnQsIGRBYm92ZUxlZnQgICAgICAgICAgOy8vIHFBYm92ZTdtaW51czBbMF0gPSBwU3JjTGVmdFs3XSAtIHBTcmNBYm92ZUxlZnRbMF0gCi0gICAgICAgIFZTSFIgICAgZFJldkxlZnQ2NCwgZFJldkxlZnQ2NCwgIzggICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMTQ6MTM6MTI6MTE6MTA6OTo4OlhdIAotICAgICAgICBWU1VCTCAgIHFMZWZ0RGlmZixkUmV2TGVmdCwgZExlZnQwICAgICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gTXVsdGlwbGllciA9IFs4fDF8MnwuLi58Nnw3XQotICAgICAgICBWTEQxICAgIHFNdWx0aXBsaWVyLCBbcE11bHRUYWJsZV0hICAgICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICBWU0hMICAgIGRMZWZ0RGlmZjY0LCBkTGVmdERpZmY2NCwgIzE2Ci0gICAgICAgIFZFWFQgICAgZERpZmZMZWZ0MSwgZExlZnREaWZmMSwgZExlZnQxNW1pbnVzMCwgIzEgICAgIAotICAgICAgICAKLSAgICAgICAgVk1VTEwgICBxSCxkRGlmZkFib3ZlMCwgZE11bHRpcGxpZXIwICAgICAgICAgICAgICAgIAotICAgICAgICBWTVVMTCAgIHFWLGREaWZmTGVmdDAsICBkTXVsdGlwbGllcjAgICAgICAgICAgICAgICAgCi0gICAgICAgIFZNTEFMICAgcUgsZERpZmZBYm92ZTEsIGRNdWx0aXBsaWVyMSAKLSAgICAgICAgVk1MQUwgICBxVixkRGlmZkxlZnQxLCAgZE11bHRpcGxpZXIxCi0gICAgICAgIAotICAgICAgICBWUEFERCAgIGRIVjAwLGRIMSxkSDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgVlBBREQgICBkSFYwMSxkVjEsZFYwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFZQQURETCAgcUhWLCBxSFYwCi0gICAgICAgIFZTSEwgICAgcUhWMSxxSFYsIzIKLSAgICAgICAgVkFERCAgICBxSFYscUhWLHFIVjEgCi0gICAgICAgIAotICAgICAgICA7Ly8gSFYgPSBbYyA9ICgoNSpWKzMyKT4+NikgfCBiID0gKCg1KkgrMzIpPj42KV0KLSAgICAgICAgVlJTSFIgICBxSFYscUhWLCM2Ci0gICAgICAgIAotICAgICAgICA7Ly8gSFYxID0gW2MqN3xiKjddCi0gICAgICAgIFZTSEwgICAgcUhWMSxxSFYsIzMKLSAgICAgICAgVlNVQiAgICBxSFYxLHFIVjEscUhWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBNdWx0aXBsaWVyMSA9IFswfDF8MnwuLi58N10KLSAgICAgICAgVkxEMSAgICBxTXVsdGlwbGllcjAsIFtwTXVsdFRhYmxlXSEgICAgCi0gICAgICAgIFZEVVAgICAgcUIsIGRIVjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFZEVVAgICAgcUMsIGRIVjEgCi0gICAgICAgIAotICAgICAgICBWQURETCAgIHFBLGRBYm92ZTEsZExlZnQxCi0gICAgICAgIFZTSEwgICAgcUEscUEsICM0Ci0gICAgICAgIFZEVVAgICAgcUEsZEExWzNdICAKLSAgICAgICAgVkFERCAgICBkQlBsdXNDTXVsdDcsIGRIVjEwLCBkSFYxMQotICAgICAgICAKLSAgICAgICAgOy8vIE11bHRpcGxpZXIxID0gWzh8OXwxMHwuLi58MTVdCi0gICAgICAgIFZMRDEgICAgcU11bHRpcGxpZXIxLCBbcE11bHRUYWJsZV0KLSAgICAgICAgOy8vIENvbnN0ID0gYSAtIDcqKGIrYykKLSAgICAgICAgVkRVUCAgICBxQ29uc3QsIGRCUGx1c0NNdWx0N1MxNlswXQotICAgICAgICBWU1VCICAgIHFDb25zdCwgcUEsIHFDb25zdAotICAgICAgICAKLSAgICAgICAgOy8vIEIwID0gWzAqYnwxKmJ8MipifDMqYnwuLi4uLi58NypiXQotICAgICAgICBWTVVMICAgIHFCMCxxQixxTXVsdGlwbGllcjAKLSAgICAgICAgCi0gICAgICAgIDsvLyBCMCA9IFs4KmJ8OSpifDEwKmJ8MTEqYnwuLi4ufDE1KmJdCi0gICAgICAgIFZNVUwgICAgcUIxLHFCLHFNdWx0aXBsaWVyMQotICAgICAgICAKLSAgICAgICAgVkFERCAgICBxU3VtMCwgcUIwLCBxQ29uc3QKLSAgICAgICAgVkFERCAgICBxU3VtMSwgcUIxLCBxQ29uc3QgIAotICAgICAgICAKLSAgICAgICAgOy8vIExvb3BzIGZvciAxNiB0aW1lcwotTG9vcFBsYW5lICAgICAgIAotICAgICAgICA7Ly8gKGIqeCArIGMqeSArIEMpPj41Ci0gICAgICAgIFZRUlNIUlVOIGRPdXQwLCBxU3VtMCwjNQotICAgICAgICBWUVJTSFJVTiBkT3V0MSwgcVN1bTEsIzUgICAgICAKLSAgICAgICAgU1VCUyAgICAgeSwgeSwgIzEKLSAgICAgICAgVlNUMSAgICAgcU91dCxbcERzdF0sZHN0U3RlcAotICAgICAgICBWQUREICAgICBxU3VtMCxxU3VtMCxxQyAKLSAgICAgICAgVkFERCAgICAgcVN1bTEscVN1bTEscUMgCi0gICAgICAgIEJORSAgICAgIExvb3BQbGFuZQotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgotCi0gICAgICAgIE1fRU5ECi0gICAgICAgIAotICAgICAgICBFTkRJRiA7Ly8gQ29ydGV4QTgKLSAgICAgICAgICAgIAotICAgICAgICBFTkQKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiBlbmRzCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU3ODBlZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NF9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NDUgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NF9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi07Ly8gRGVmaW5lIHRoZSBwcm9jZXNzb3IgdmFyaWFudHMgc3VwcG9ydGVkIGJ5IHRoaXMgZmlsZQotICAgICAgICAgCi0gICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4Ci0gICAgICAgIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFRoaXMgdGFibGUgZm9yIGltcGxlbWVudGluZyBzd2l0Y2ggY2FzZSBvZiBDIGluIGFzbSBieQotOy8vIHRoZSBtZWh0b2Qgb2YgdHdvIGxldmVscyBvZiBpbmRleGluZy4KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9wU3dpdGNoVGFibGU0eDQKLSAgICBEQ0QgIE9NWF9WQ180eDRfVkVSVCwgICAgIE9NWF9WQ180eDRfSE9SIAotICAgIERDRCAgT01YX1ZDXzR4NF9EQywgICAgICAgT01YX1ZDXzR4NF9ESUFHX0RMCi0gICAgRENEICBPTVhfVkNfNHg0X0RJQUdfRFIsICBPTVhfVkNfNHg0X1ZSCi0gICAgRENEICBPTVhfVkNfNHg0X0hELCAgICAgICBPTVhfVkNfNHg0X1ZMCi0gICAgRENEICBPTVhfVkNfNHg0X0hVICAgCi0gICAgCi0gICAgICAgIAotICAgICAgICBJRiBDb3J0ZXhBOAotICAgICAgICAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gU2NyYXRjaCB2YXJpYWJsZQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXJldHVybiAgICAgICAgICBSTiAwCi1wVGFibGUgICAgICAgICAgUk4gOAotcGMgICAgICAgICAgICAgIFJOIDE1Ci0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wU3JjTGVmdCAgICAgICAgUk4gMCAgICA7Ly8gaW5wdXQgcG9pbnRlcgotcFNyY0Fib3ZlICAgICAgIFJOIDEgICAgOy8vIGlucHV0IHBvaW50ZXIKLXBTcmNBYm92ZUxlZnQgICBSTiAyICAgIDsvLyBpbnB1dCBwb2ludGVyCi1wRHN0ICAgICAgICAgICAgUk4gMyAgICA7Ly8gb3V0cHV0IHBvaW50ZXIKLWxlZnRTdGVwICAgICAgICBSTiA0ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQotZHN0U3RlcCAgICAgICAgIFJOIDUgICAgOy8vIGlucHV0IHZhcmlhYmxlCi1wcmVkTW9kZSAgICAgICAgUk4gNiAgICA7Ly8gaW5wdXQgdmFyaWFibGUKLWF2YWlsYWJpbGl0eSAgICBSTiA3ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQotcERzdDEgICAgICAgICAgIFJOIDEgCi1wRHN0MiAgICAgICAgICAgUk4gNCAKLXBEc3QzICAgICAgICAgICBSTiA2IAotCi1wU3JjVG1wICAgICAgICAgUk4gOQotc3JjU3RlcCAgICAgICAgIFJOIDEwCi1wRHN0VG1wICAgICAgICAgUk4gMTEKLWRzdGVwICAgICAgICAgICBSTiAxMgotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gTmVvbiByZWdpc3RlcnMKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0KLQotOy8vIE9NWF9WQ19DSFJPTUFfVkVSVAotZEFib3ZlVTMyICAgICAgIEROICBEMC5VMzIKLQotOy8vIE9NWF9WQ19DSFJPTUFfSE9SCi1kTGVmdFZhbDAgICAgICAgRE4gIEQwLjgKLWRMZWZ0VmFsMSAgICAgICBETiAgRDEuOAotZExlZnRWYWwyICAgICAgIEROICBEMi44Ci1kTGVmdFZhbDMgICAgICAgRE4gIEQzLjgKLWRMZWZ0VmFsMFUzMiAgICBETiAgRDAuVTMyCi1kTGVmdFZhbDFVMzIgICAgRE4gIEQxLlUzMgotZExlZnRWYWwyVTMyICAgIEROICBEMi5VMzIKLWRMZWZ0VmFsM1UzMiAgICBETiAgRDMuVTMyCi0KLTsvLyBPTVhfVkNfNHg0X0RDCi1kTGVmdFZhbCAgICAgICAgRE4gIEQwLlU4Ci1kTGVmdFZhbFUzMiAgICAgRE4gIEQwLlUzMgotZFN1bUFib3ZlTGVmdFUxNiAgRE4gIEQxLlUxNgotZFN1bUFib3ZlTGVmdFUzMiAgRE4gIEQxLlUzMgotZFN1bUFib3ZlTGVmdFU2NCAgRE4gIEQxLlU2NAotZFN1bUFib3ZlTGVmdFU4IEROICBEMS5VOAotZFN1bSAgICAgICAgICAgIEROICBEMC5VOAotCi1kU3VtTGVmdFZhbFUxNiAgRE4gIEQxLlUxNgotZFN1bUxlZnRWYWxVMzIgIEROICBEMS5VMzIKLWRTdW1MZWZ0VmFsVTY0ICBETiAgRDEuVTY0Ci1kU3VtTGVmdFZhbFU4ICAgRE4gIEQxLlU4Ci0KLWRBYm92ZVZhbCAgICAgICBETiAgRDAuVTgKLWRTdW1BYm92ZVZhbFUxNiAgRE4gIEQxLlUxNgotZFN1bUFib3ZlVmFsVTMyICBETiAgRDEuVTMyCi1kU3VtQWJvdmVWYWxVNjQgIEROICBEMS5VNjQKLWRTdW1BYm92ZVZhbFU4ICAgRE4gIEQxLlU4Ci1kQ29uc3QxMjhVOCAgICAgRE4gIEQwLlU4Ci0KLQotOy8vT01YX1ZDXzR4NF9ESUFHX0RMCi0KLWRBYm92ZSAgICAgICAgICBETiAgRDAuVTgKLWRVNyAgICAgICAgICAgICBETiAgRDIuVTgKLWRVMyAgICAgICAgICAgICBETiAgRDIuVTgKLWRBYm92ZTAgICAgICAgICBETiAgRDMuVTgKLWRBYm92ZTEgICAgICAgICBETiAgRDQuVTgKLWRBYm92ZTIgICAgICAgICBETiAgRDUuVTgKLWRUbXAgICAgICAgICAgICBETiAgRDYuVTgKLWRUbXAwICAgICAgICAgICBETiAgRDcuVTgKLWRUbXAxICAgICAgICAgICBETiAgRDguVTgKLWRUbXAyICAgICAgICAgICAgRE4gIEQ5LlU4Ci1kVG1wMyAgICAgICAgICAgIEROICBEMTAuVTgKLWRUbXBVMzIgICAgICAgICBETiAgRDYuVTMyCi0KLQotOy8vT01YX1ZDXzR4NF9ESUFHX0RSCi1kTGVmdCAgICAgICAgICAgRE4gIEQxLlU4Ci1kVUwgICAgICAgICAgICAgRE4gIEQyLlU4Ci0KLTsvL09NWF9WQ180eDRfVlIKLWRMZWZ0MCAgICAgICAgICBETiAgRDEuVTgKLWRMZWZ0MSAgICAgICAgICBETiAgRDIuVTgKLWRFdmVuMCAgICAgICAgICBETiAgRDMuVTgKLWRFdmVuMSAgICAgICAgICBETiAgRDQuVTgKLWRFdmVuMiAgICAgICAgICBETiAgRDUuVTgKLWRPZGQwICAgICAgICAgICBETiAgRDYuVTgKLWRPZGQxICAgICAgICAgICBETiAgRDExLlU4Ci1kT2RkMiAgICAgICAgICAgRE4gIEQxMi5VOAotZFRtcDNVMzIgICAgICAgIEROICBEMTAuVTMyICAgIAotZFRtcDJVMzIgICAgICAgIEROICBEOS5VMzIKLQotCi07Ly9PTVhfVkNfNHg0X0hECi1kVG1wMVU2NCAgICAgICAgRE4gIEQ4LlU2NAotZFRtcDBVNjQgICAgICAgIEROICBENy5VNjQKLWRUbXBVNjQgICAgICAgICBETiAgRDYuVTY0Ci1kVG1wVTMyICAgICAgICAgRE4gIEQ2LlUzMgotZFRtcDFVMzIgICAgICAgIEROICBEOC5VMzIKLQotOy8vT01YX1ZDXzR4NF9IVQotZEwzICAgICAgICAgICAgIEROICBEMi5VOAotZExlZnRIVTAgICAgICAgIEROICBEMy5VOAotZExlZnRIVTEgICAgICAgIEROICBENC5VOAotZExlZnRIVTIgICAgICAgIEROICBENS5VOAotZFRtcDBVMzIgICAgICAgIEROICBENy5VMzIKLQotCi0KLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQgc3RhcnRzCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAKLSAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCwgcjEyLGQxMgotICAgICAgICAKLSAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKLSAgICAgICAgTV9BUkcgICAgTGVmdFN0ZXAsICAgICA0Ci0gICAgICAgIE1fQVJHICAgIERzdFN0ZXAsICAgICAgNAotICAgICAgICBNX0FSRyAgICBQcmVkTW9kZSwgICAgIDQKLSAgICAgICAgTV9BUkcgICAgQXZhaWxhYmlsaXR5LCA0Ci0gICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICBMRFIgICAgICBwVGFibGUsPWFybVZDTTRQMTBfcFN3aXRjaFRhYmxlNHg0ICA7Ly8gTG9hZCBpbmRleCB0YWJsZSBmb3Igc3dpdGNoIGNhc2UKLSAgICAgICAgCi0gICAgICAgIDsvLyBMb2FkIGFyZ3VtZW50IGZyb20gdGhlIHN0YWNrCi0gICAgICAgIE1fTERSRCAgIHByZWRNb2RlLGF2YWlsYWJpbGl0eSxQcmVkTW9kZSAgICAgOy8vIEFyZyBwcmVkTW9kZSAmIGF2YWlsYWJpbGl0eSBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCi0gICAgICAgIE1fTERSRCAgIGxlZnRTdGVwLGRzdFN0ZXAsTGVmdFN0ZXAgICAgICAgICAgOy8vIEFyZyBsZWZ0U3RlcCAmIGRzdFN0ZXAgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgIHBjLCBbcFRhYmxlLCBwcmVkTW9kZSwgTFNMICMyXSAgICAgIDsvLyBCcmFuY2ggdG8gdGhlIGNhc2UgYmFzZWQgb24gcHJlTW9kZQotCi0KLU9NWF9WQ180eDRfSE9SCi0gICAgICAgIAotICAgICAgICBBREQgICAgIHBTcmNUbXAsIHBTcmNMZWZ0LCBsZWZ0U3RlcAotICAgICAgICBBREQgICAgIHNyY1N0ZXAsIGxlZnRTdGVwLCBsZWZ0U3RlcAotICAgICAgICA7Ly8gTG9hZCBMZWZ0IEVkZ2UKLSAgICAgICAgVkxEMSAgICB7ZExlZnRWYWwwW119LFtwU3JjTGVmdF0sc3JjU3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzAqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0VmFsMVtdfSxbcFNyY1RtcF0sc3JjU3RlcCAgICAgICAgICAgIDsvLyAgICBwU3JjTGVmdFsxKmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFZhbDJbXX0sW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgICA7Ly8gICAgcFNyY0xlZnRbMipsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRWYWwzW119LFtwU3JjVG1wXSAgICAgICAgICAgICAgICAgICAgOy8vICAgIHBTcmNMZWZ0WzMqbGVmdFN0ZXBdCi0gICAgICAgIAotICAgICAgICBBREQgICAgIHBEc3RUbXAsIHBEc3QsIGRzdFN0ZXAKLSAgICAgICAgQUREICAgICBkc3RlcCwgZHN0U3RlcCwgZHN0U3RlcAotICAgICAgICAKLSAgICAgICAgVlNUMSAgICBkTGVmdFZhbDBVMzJbMF0sW3BEc3RdLGRzdGVwICAgICAgICAgICAgICAgIDsvLyBwRHN0WzAqZHN0U3RlcCt4XSA6MDw9IHggPD0gNwotICAgICAgICBWU1QxICAgIGRMZWZ0VmFsMVUzMlswXSxbcERzdFRtcF0sZHN0ZXAgICAgICAgICAgICAgOy8vIHBEc3RbMSpkc3RTdGVwK3hdIDowPD0geCA8PSA3Ci0gICAgICAgIFZTVDEgICAgZExlZnRWYWwyVTMyWzBdLFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFsyKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKLSAgICAgICAgVlNUMSAgICBkTGVmdFZhbDNVMzJbMF0sW3BEc3RUbXBdICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzMqZHN0U3RlcCt4XSA6MDw9IHggPD0gNwotICAgICAgICAKLSAgICAgICAgQiAgICAgICAgRXhpdFByZWRpY3Q0eDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBCcmFuY2ggdG8gZXhpdCBjb2RlCi0gICAgICAgIAotT01YX1ZDXzR4NF9WRVJUCi0gICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBVcHBlciBFZGdlCi0gICAgICAgIFZMRDEgICAgIGRBYm92ZVUzMlswXSxbcFNyY0Fib3ZlXQotICAgICAgICBBREQgICAgIHBEc3RUbXAsIHBEc3QsIGRzdFN0ZXAKLSAgICAgICAgQUREICAgICBkc3RlcCwgZHN0U3RlcCwgZHN0U3RlcAotICAgICAgICAKLURDUHJlZGljdDR4NFZlcnRTdG9yZSAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgVlNUMSAgICAgZEFib3ZlVTMyWzBdLFtwRHN0XSxkc3RlcAotICAgICAgICBWU1QxICAgICBkQWJvdmVVMzJbMF0sW3BEc3RUbXBdLGRzdGVwCi0gICAgICAgIFZTVDEgICAgIGRBYm92ZVUzMlswXSxbcERzdF0KLSAgICAgICAgVlNUMSAgICAgZEFib3ZlVTMyWzBdLFtwRHN0VG1wXQotCi0gICAgICAgIEIgICAgICAgIEV4aXRQcmVkaWN0NHg0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIGV4aXQgY29kZQotCi1PTVhfVkNfNHg0X0RDCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgVFNUICAgICBhdmFpbGFiaWxpdHksICNPTVhfVkNfTEVGVAotICAgICAgICBCRVEgICAgIERDUHJlZGljdDR4NExlZnROb3RBdmFpbGFibGUKLQotICAgICAgICBBREQgICAgIHBTcmNUbXAsIHBTcmNMZWZ0LCBsZWZ0U3RlcAotICAgICAgICBBREQgICAgIHNyY1N0ZXAsIGxlZnRTdGVwLCBsZWZ0U3RlcAotICAgICAgICA7Ly8gTG9hZCBMZWZ0IEVkZ2UKLSAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbMF19LFtwU3JjTGVmdF0sc3JjU3RlcCAgICAgICAgICAgIDsvLyBwU3JjTGVmdFswKmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFsxXX0sW3BTcmNUbXBdLHNyY1N0ZXAgICAgICAgICAgICAgOy8vICAgIHBTcmNMZWZ0WzEqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzJdfSxbcFNyY0xlZnRdICAgICAgICAgICAgICAgICAgICA7Ly8gICAgcFNyY0xlZnRbMipsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbM119LFtwU3JjVG1wXSAgICAgICAgICAgICAgICAgICAgIDsvLyAgICBwU3JjTGVmdFszKmxlZnRTdGVwXQotICAgICAgICAKLSAgICAgICAgVFNUICAgICBhdmFpbGFiaWxpdHksICNPTVhfVkNfVVBQRVIKLSAgICAgICAgQkVRICAgICBEQ1ByZWRpY3Q0eDRMZWZ0T25seUF2YWlsYWJsZQotCi0gICAgICAgIDsvLyBMb2FkIFVwcGVyIEVkZ2UgYWxzbwotICAgICAgICBWTEQxICAgICBkTGVmdFZhbFUzMlsxXSxbcFNyY0Fib3ZlXSAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswIHRvIDNdCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgCi0gICAgICAgIFZQQURETCAgIGRTdW1BYm92ZUxlZnRVMTYsIGRMZWZ0VmFsICAgICAgICAgICAgICAgICA7Ly8gW3BTcmNBYm92ZVsyKzMgfCAwKzFdIHwgcFNyY0xlZnRbMiszIHwgMCsxXV0gICAgICAgICAgICAgCi0gICAgICAgIFZQQURETCAgIGRTdW1BYm92ZUxlZnRVMzIsIGRTdW1BYm92ZUxlZnRVMTYgICAgICAgICA7Ly8gW3BTcmNBYm92ZVsyKzMrMCsxXSB8IHBTcmNMZWZ0WzIrMyswKzFdXSAKLSAgICAgICAgVlBBRERMICAgZFN1bUFib3ZlTGVmdFU2NCwgZFN1bUFib3ZlTGVmdFUzMiAgICAgICAgIDsvLyBbcFNyY0Fib3ZlWzIrMyswKzFdICsgcFNyY0xlZnRbMiszKzArMV1dICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgVlJTSFIgICAgZFN1bUFib3ZlTGVmdFU2NCxkU3VtQWJvdmVMZWZ0VTY0LCMzICAgICAgIDsvLyBTdW0gPSAoU3VtICsgNCkgPj4gMwotICAgICAgICBBREQgICAgIHBEc3RUbXAsIHBEc3QsIGRzdFN0ZXAKLSAgICAgICAgQUREICAgICBkc3RlcCwgZHN0U3RlcCwgZHN0U3RlcAotICAgICAgICBWRFVQICAgICBkU3VtLGRTdW1BYm92ZUxlZnRVOFswXQotICAgICAgICAKLSAgICAgICAgQiAgICAgICAgRENQcmVkaWN0NHg0VmVydFN0b3JlICAKLSAgICAgICAgCi1EQ1ByZWRpY3Q0eDRMZWZ0T25seUF2YWlsYWJsZQotCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIgICAgICAgICAgICAgICAgICAgICA7Ly8gcmV0dXJuTm9FcnJvcgotICAgICAgICAKLSAgICAgICAgVlBBRERMICAgZFN1bUxlZnRWYWxVMTYsIGRMZWZ0VmFsICAgICAgICAgICAgICAgICAgIDsvLyBbIFhYIHwgcFNyY0xlZnRbMiszIHwgMCsxXV0gICAgICAgICAgICAgCi0gICAgICAgIFZQQURETCAgIGRTdW1MZWZ0VmFsVTMyLCBkU3VtTGVmdFZhbFUxNiAgICAgICAgICAgICA7Ly8gWyBYWFhYIHwgcFNyY0xlZnRbMiszKzArMV1dIAotICAgICAgICAKLSAgICAgICAgVlJTSFIgICAgZFN1bUxlZnRWYWxVMzIsZFN1bUxlZnRWYWxVMzIsIzIgICAgICAgICAgIDsvLyBTdW0gPSAoU3VtICsgMikgPj4gMgotICAgICAgICBBREQgICAgIHBEc3RUbXAsIHBEc3QsIGRzdFN0ZXAKLSAgICAgICAgQUREICAgICBkc3RlcCwgZHN0U3RlcCwgZHN0U3RlcAotICAgICAgICBWRFVQICAgICBkU3VtLGRTdW1MZWZ0VmFsVThbMF0KLSAgICAgICAgCi0gICAgICAgIEIgICAgICAgIERDUHJlZGljdDR4NFZlcnRTdG9yZSAgIAotICAgICAgICAKLURDUHJlZGljdDR4NExlZnROb3RBdmFpbGFibGUKLSAgICAgICAgICAgICAgICAgCi0gICAgICAgIFRTVCAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX1VQUEVSCi0gICAgICAgIEJFUSAgICAgRENQcmVkaWN0NHg0Tm9uZUF2YWlsYWJsZQotCi0gICAgICAgIDsvLyBMb2FkIFVwcGVyIEVkZ2UgCi0gICAgICAgIFZMRDEgICAgIGRBYm92ZVUzMlswXSxbcFNyY0Fib3ZlXSAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAgdG8gM10gIAotICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0gICAgICAgIAotICAgICAgICBWUEFEREwgICBkU3VtQWJvdmVWYWxVMTYsIGRBYm92ZVZhbCAgICAgICAgICAgICAgICAgOy8vIFsgWFggfCBwU3JjQWJvdmVbMiszIHwgMCsxXV0gICAgICAgICAgICAgCi0gICAgICAgIFZQQURETCAgIGRTdW1BYm92ZVZhbFUzMiwgZFN1bUFib3ZlVmFsVTE2ICAgICAgICAgICA7Ly8gWyBYWFhYIHwgcFNyY0Fib3ZlWzIrMyswKzFdXSAKLSAgICAgICAgCi0gICAgICAgIFZSU0hSICAgIGRTdW1BYm92ZVZhbFUzMixkU3VtQWJvdmVWYWxVMzIsIzIgICAgICAgICA7Ly8gU3VtID0gKFN1bSArIDIpID4+IDIKLSAgICAgICAgQUREICAgICBwRHN0VG1wLCBwRHN0LCBkc3RTdGVwCi0gICAgICAgIEFERCAgICAgZHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKLSAgICAgICAgVkRVUCAgICAgZFN1bSxkU3VtQWJvdmVWYWxVOFswXQotICAgICAgICAKLSAgICAgICAgQiAgICAgICAgRENQcmVkaWN0NHg0VmVydFN0b3JlICAgCi0gICAgICAgIAotRENQcmVkaWN0NHg0Tm9uZUF2YWlsYWJsZSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBWTU9WICAgICBkQ29uc3QxMjhVOCwjMHg4MCAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIDB4ODA4MDgwODA4MDgwODA4MCBpZihjb3VudCA9PSAwKQotICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0gICAgICAgIAotICAgICAgICBBREQgICAgIHBEc3RUbXAsIHBEc3QsIGRzdFN0ZXAKLSAgICAgICAgQUREICAgICBkc3RlcCwgZHN0U3RlcCwgZHN0U3RlcAotICAgICAgICBCICAgICAgICBEQ1ByZWRpY3Q0eDRWZXJ0U3RvcmUgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLU9NWF9WQ180eDRfRElBR19ETAotICAgICAgICAKLSAgICAgICAgVFNUICAgICBhdmFpbGFiaWxpdHksICNPTVhfVkNfVVBQRVJfUklHSFQKLSAgICAgICAgQkVRICAgICBEaWFnRExVcHBlclJpZ2h0Tm90QXZhaWxhYmxlCi0gICAgICAgCi0gICAgICAgIFZMRDEgICAgZEFib3ZlMCxbcFNyY0Fib3ZlXSAgICAgICAgICAgICAgICAgICAgIDsvLyBbVTd8VTZ8VTV8VTR8VTN8VTJ8VTF8VTBdIAotICAgICAgICBWRFVQICAgIGRVNywgZEFib3ZlMFs3XSAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gW1U3fFU3fFU3fFU3fFU3fFU3fFU3fFU3XQotICAgICAgICBWRVhUICAgIGRBYm92ZTEsIGRBYm92ZTAsIGRVNywgIzEgICAgICAgICAgICAgICA7Ly8gW1U3fFU3fFU2fFU1fFU0fFUzfFUyfFUxXQotICAgICAgICBWRVhUICAgIGRBYm92ZTIsIGRBYm92ZTAsIGRVNywgIzIgICAgICAgICAgICAgICA7Ly8gW1U3fFU3fFU3fFU2fFU1fFU0fFUzfFUyXSAKLSAgICAgICAgQiAgICAgICBEaWFnRExQcmVkaWN0NHg0U3RvcmUgICAgICAgICAKLSAgICAgICAKLURpYWdETFVwcGVyUmlnaHROb3RBdmFpbGFibGUKLSAgICAgICAgVkxEMSAgICBkQWJvdmVVMzJbMV0sW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgOy8vIFtVM3xVMnxVMXxVMHwtfC18LXwtXSAKLSAgICAgICAgVkRVUCAgICBkVTMsIGRBYm92ZVs3XSAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFtVMyBVMyBVMyBVMyBVMyBVMyBVMyBVM10KLQotICAgICAgICBWRVhUICAgIGRBYm92ZTAsIGRBYm92ZSwgZFUzLCAjNCAgICAgICAgICAgICAgICA7Ly8gW1UzIFUzIFUzIFUzIFUzIFUyIFUxIFUwXQotICAgICAgICBWRVhUICAgIGRBYm92ZTEsIGRBYm92ZSwgZFUzLCAjNSAgICAgICAgICAgICAgICA7Ly8gW1UzIFUzIFUzIFUzIFUzIFUzIFUyIFUxXQotICAgICAgICBWRVhUICAgIGRBYm92ZTIsIGRBYm92ZSwgZFUzLCAjNiAgICAgICAgICAgICAgICA7Ly8gW1UzIFUzIFUzIFUzIFUzIFUzIFUzIFUyXQotICAgICAgIAotRGlhZ0RMUHJlZGljdDR4NFN0b3JlICAKLSAgICAgICAgCi0gICAgICAgIFZIQUREICAgZFRtcCwgZEFib3ZlMCwgZEFib3ZlMgotICAgICAgICBWUkhBREQgIGRUbXAsIGRUbXAsIGRBYm92ZTEgICAgICAgICAgICAgICAgICAgICA7Ly8gKGErMipiK2MrMik+PjIKLSAgICAgICAgCi0KLSAgICAgICAgVlNUMSAgICBkVG1wVTMyWzBdLFtwRHN0XSxkc3RTdGVwCi0gICAgICAgIFZFWFQgICAgZFRtcCxkVG1wLGRUbXAsIzEKLSAgICAgICAgVlNUMSAgICBkVG1wVTMyWzBdLFtwRHN0XSxkc3RTdGVwCi0gICAgICAgIFZFWFQgICAgZFRtcCxkVG1wLGRUbXAsIzEKLSAgICAgICAgVlNUMSAgICBkVG1wVTMyWzBdLFtwRHN0XSxkc3RTdGVwCi0gICAgICAgIFZFWFQgICAgZFRtcCxkVG1wLGRUbXAsIzEKLSAgICAgICAgVlNUMSAgICBkVG1wVTMyWzBdLFtwRHN0XQotICAgICAgICAKLSAgICAgICAgQiAgICAgICAgRXhpdFByZWRpY3Q0eDQgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byBleGl0IGNvZGUKLSAgICAgICAgCi0KLU9NWF9WQ180eDRfRElBR19EUgotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBMb2FkIFUwLFUxLFUyLFUzCi0gICAgICAgIAotICAgICAgICBWTEQxICAgIGRBYm92ZVUzMlswXSxbcFNyY0Fib3ZlXSAgICAgICAgICAgICAgICA7Ly8gW1h8WHxYfFh8VTN8VTJ8VTF8VTBdCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBMb2FkIFVMLEwwLEwxLEwyLEwzICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBkTGVmdCA9IFtVTHxMMHxMMXxMMnxMM3xYfFh8WF0gICAgCi0gICAgICAgIFZMRDEgICAge2RMZWZ0WzddfSxbcFNyY0Fib3ZlTGVmdF0gICAgICAgICAgICAgIAotICAgICAgICBBREQgICAgIHBTcmNUbXAsIHBTcmNMZWZ0LCBsZWZ0U3RlcAotICAgICAgICBBREQgICAgIHNyY1N0ZXAsIGxlZnRTdGVwLCBsZWZ0U3RlcAotICAgICAgICBBREQgICAgIHBEc3QxLHBEc3QsZHN0U3RlcAotICAgICAgICAKLSAgICAgICAgVkxEMSAgICB7ZExlZnRbNl19LFtwU3JjTGVmdF0sc3JjU3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzAqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0WzVdfSxbcFNyY1RtcF0sc3JjU3RlcCAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsxKmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFs0XX0sW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMipsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRbM119LFtwU3JjVG1wXSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzMqbGVmdFN0ZXBdCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgVkVYVCAgICBkQWJvdmUwLGRMZWZ0LGRBYm92ZSwjMyAgICAgICAgICAgICAgICAgOy8vIFtVMnxVMXxVMHxVTHxMMHxMMXxMMnxMM10gICAKLSAgICAgICAgQUREICAgICBwRHN0MixwRHN0MSxkc3RTdGVwCi0gICAgICAgIFZFWFQgICAgZEFib3ZlMSxkTGVmdCxkQWJvdmUsIzQgICAgICAgICAgICAgICAgIDsvLyBbVTN8VTJ8VTF8VTB8VUx8TDB8TDF8TDJdICAgCi0gICAgICAgIEFERCAgICAgcERzdDMscERzdDIsZHN0U3RlcAotICAgICAgICBWRVhUICAgIGRBYm92ZTIsZExlZnQsZEFib3ZlLCM1ICAgICAgICAgICAgICAgICA7Ly8gWyBYfFUzfFUyfFUxfFUwfFVMfEwwfEwxXSAgIAotICAgICAgICAKLSAgICAgICAgVkhBREQgICBkVG1wLCBkQWJvdmUwLCBkQWJvdmUyCi0gICAgICAgIFZSSEFERCAgZFRtcCwgZFRtcCwgZEFib3ZlMSAgICAgICAgICAgICAgICAgICAgIDsvLyAoYSsyKmIrYysyKT4+MgotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFZTVDEgICAgZFRtcFUzMlswXSxbcERzdDNdICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBwVG1wWzBdLFsxXSxbMl0sWzNdIEAgcERzdDMKLSAgICAgICAgVkVYVCAgICBkVG1wLGRUbXAsZFRtcCwjMQotICAgICAgICBWU1QxICAgIGRUbXBVMzJbMF0sW3BEc3QyXSAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcFRtcFsxXSxbMl0sWzNdLFs0XSBAIHBEc3QyCi0gICAgICAgIFZFWFQgICAgZFRtcCxkVG1wLGRUbXAsIzEKLSAgICAgICAgVlNUMSAgICBkVG1wVTMyWzBdLFtwRHN0MV0gICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHBUbXBbMl0sWzNdLFs0XSxbNV0gQCBwRHN0MQotICAgICAgICBWRVhUICAgIGRUbXAsZFRtcCxkVG1wLCMxCi0gICAgICAgIFZTVDEgICAgZFRtcFUzMlswXSxbcERzdF0gICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBwVG1wWzNdLFs0XSxbNV0sWzZdIEAgcERzdAotICAgICAgICAKLSAgICAgICAgQiAgICAgICAgRXhpdFByZWRpY3Q0eDQgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byBleGl0IGNvZGUKLQotT01YX1ZDXzR4NF9WUgotCi0gICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBVTCxVMCxVMSxVMixVMwotICAgICAgICBWTEQxICAgIGRBYm92ZVUzMlswXSxbcFNyY0Fib3ZlXQotICAgICAgICBWTEQxICAgIGRBYm92ZVs3XSxbcFNyY0Fib3ZlTGVmdF0gICAgICAgICAgICAgICA7Ly8gW1VMfFh8WHxYfFUzfFUyfFUxfFUwXQotICAgICAgICAKLSAgICAgICAgOy8vIExvYWQgTDAsTDEsTDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGRMZWZ0MCA9IFtMMHxMMnxYfFh8WHxYfFh8WF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGRMZWZ0MSA9IFtMMXwgWHxYfFh8WHxYfFh8WF0gICAgCi0gICAgICAgIFZMRDEgICAge2RMZWZ0MFs3XX0sW3BTcmNMZWZ0XSxsZWZ0U3RlcCAgICAgICAgIDsvLyBwU3JjTGVmdFswKmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdDFbN119LFtwU3JjTGVmdF0sbGVmdFN0ZXAgICAgICAgICA7Ly8gcFNyY0xlZnRbMSpsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnQwWzZdfSxbcFNyY0xlZnRdICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzIqbGVmdFN0ZXBdCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgVkVYVCAgICBkT2RkMixkQWJvdmUsZEFib3ZlLCM3ICAgICAgICAgICAgICAgICAgOy8vIFsgeCB4IHggVTMgVTIgVTEgVTAgVUwgXQotICAgICAgICBWRVhUICAgIGRFdmVuMCxkTGVmdDAsZE9kZDIsIzYgICAgICAgICAgICAgICAgICA7Ly8gWyB4IHggeCBVMSBVMCBVTCBMMCBMMiBdCi0gICAgICAgIFZFWFQgICAgZEV2ZW4xLGRMZWZ0MSxkT2RkMiwjNyAgICAgICAgICAgICAgICAgIDsvLyBbIHggeCB4IFUyIFUxIFUwIFVMIEwxIF0KLSAgICAgICAgVkVYVCAgICBkRXZlbjIsZExlZnQwLGRBYm92ZSwjNyAgICAgICAgICAgICAgICAgOy8vIFsgeCB4IHggVTMgVTIgVTEgVTAgTDAgXQotICAgICAgICBWRVhUICAgIGRPZGQwLGRMZWZ0MSxkQWJvdmUsIzcgICAgICAgICAgICAgICAgICA7Ly8gWyB4IHggeCBVMyBVMiBVMSBVMCBMMSBdCi0gICAgICAgIFZFWFQgICAgZE9kZDEsZExlZnQwLGRPZGQyLCM3ICAgICAgICAgICAgICAgICAgIDsvLyBbIHggeCB4IFUyIFUxIFUwIFVMIEwwIF0KLSAgICAgICAgCi0gICAgICAgIFZIQUREICAgZFRtcDEsIGRPZGQwLCBkT2RkMgotICAgICAgICBWUkhBREQgIGRUbXAxLCBkVG1wMSwgZE9kZDEgICAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWyB4IHggeCA5IDcgNSAzIDEgXQotICAgICAgICAKLSAgICAgICAgVkhBREQgICBkVG1wMCwgZEV2ZW4wLCBkRXZlbjIKLSAgICAgICAgVlJIQUREICBkVG1wMCwgZFRtcDAsIGRFdmVuMSAgICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgeCB4IHggOCA2IDQgMiAwIF0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBWRVhUICAgIGRUbXAzLGRUbXAxLGRUbXAxLCMxICAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWyB4IHggeCB4IDkgNyA1IDMgXSAKLSAgICAgICAgQUREICAgICBwRHN0VG1wLCBwRHN0LCBkc3RTdGVwCi0gICAgICAgIEFERCAgICAgZHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKLSAgICAgICAgVkVYVCAgICBkVG1wMixkVG1wMCxkVG1wMCwjMSAgICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgeCB4IHggeCA4IDYgNCAyIF0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBWU1QxICAgIGRUbXAzVTMyWzBdLFtwRHN0XSxkc3RlcCAgICAgICAgICAgICAgICA7Ly8gVG1wWzldLFs3XSxbNV0sWzNdCi0gICAgICAgIFZTVDEgICAgZFRtcDJVMzJbMF0sW3BEc3RUbXBdLGRzdGVwICAgICAgICAgICAgIDsvLyBUbXBbOF0sWzZdLFs0XSxbMl0KLSAgICAgICAgVlNUMSAgICBkVG1wMVUzMlswXSxbcERzdF0sZHN0ZXAgICAgICAgICAgICAgICAgOy8vIFRtcFs3XSxbNV0sWzNdLFsxXQotICAgICAgICBWU1QxICAgIGRUbXAwVTMyWzBdLFtwRHN0VG1wXSAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWzZdLFs0XSxbMl0sWzBdCi0gICAgICAgIAotICAgICAgICBCICAgICAgICBFeGl0UHJlZGljdDR4NCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIGV4aXQgY29kZQotICAgICAgICAKLU9NWF9WQ180eDRfSEQKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBVMCxVMSxVMixVMwotICAgICAgICBWTEQxICAgIGRBYm92ZSxbcFNyY0Fib3ZlXSAgICAgICAgICAgICAgICAgICAgICA7Ly9kQWJvdmVMZWZ0VmFsID0gW1U3fFU2fFU1fFU0fFUzfFUyfFUxfFUwXQotICAgICAgICAKLSAgICAgICAgOy8vIExvYWQgVUwsTDAsTDEsTDIsTDMgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGRMZWZ0ID0gW1VMfEwwfEwxfEwyfEwzfFh8WHxYXSAKLSAgICAgICAgVkxEMSAgICB7ZExlZnRbN119LFtwU3JjQWJvdmVMZWZ0XSAgIAotICAgICAgICBBREQgICAgIHBTcmNUbXAsIHBTcmNMZWZ0LCBsZWZ0U3RlcAotICAgICAgICBBREQgICAgIHNyY1N0ZXAsIGxlZnRTdGVwLCBsZWZ0U3RlcAotICAgICAgICAKLSAgICAgICAgVkxEMSAgICB7ZExlZnRbNl19LFtwU3JjTGVmdF0sc3JjU3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzAqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0WzVdfSxbcFNyY1RtcF0sc3JjU3RlcCAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsxKmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFs0XX0sW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMipsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRbM119LFtwU3JjVG1wXSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzMqbGVmdFN0ZXBdCi0gICAgICAgIAotICAgICAgICBWRVhUICAgIGRBYm92ZTAsZExlZnQsZEFib3ZlLCMzICAgICAgICAgICAgICAgICA7Ly8gWyBVMnxVMXxVMHxVTHxMMHxMMXxMMnxMMyBdICAKLSAgICAgICAgVkVYVCAgICBkQWJvdmUxLGRMZWZ0LGRBYm92ZSwjMiAgICAgICAgICAgICAgICAgOy8vIFsgVTF8VTB8VUx8TDB8TDF8TDJ8TDN8WCBdICAgCi0gICAgICAgIFZFWFQgICAgZEFib3ZlMixkTGVmdCxkQWJvdmUsIzEgICAgICAgICAgICAgICAgIDsvLyBbIFUwfFVMfEwwfEwxfEwyfEwzfFh8WCBdICAgICAKLSAgICAgICAgCi0gICAgICAgIFZIQUREICAgZFRtcDAsIGRBYm92ZTAsIGRBYm92ZTIKLSAgICAgICAgVlJIQUREICBkVG1wMCwgZFRtcDAsIGRBYm92ZTEgICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgMCB8IDEgfCAyIHwgNCB8IDYgfCA4IHwgWCB8IFggXQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFZSSEFERCAgZFRtcDEsIGRBYm92ZTEsIGRBYm92ZTAgICAgICAgICAgICAgICAgIDsvLyAoYStiKzEpPj4xCi0gICAgICAgIFZTSEwgICAgZFRtcDFVNjQsZFRtcDFVNjQsIzI0ICAgICAgICAgICAgICAgICAgIDsvLyBUbXBbIDN8NXwgNyB8OSB8IFggfCBYIHwgWCB8IFggXQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFZTSEwgICAgZFRtcFU2NCxkVG1wMFU2NCwjMTYgICAgICAgICAgICAgICAgICAgIDsvLyBUbXBbIDJ8NHw2fDh8IFggfCBYIHwgWCB8IFggXQotICAgICAgICBWWklQICAgIGRUbXAxLGRUbXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gZFRtcCA9IFsgMiB8IDMgfCA0IHwgNSB8IDYgfCA3IHwgOCB8IDkgXQotICAgICAgICBWRVhUICAgIGRUbXAwLGRUbXAwLGRUbXAwLCM2ICAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWyAgWHwgWHwgWHwgWHwgWHwgWHwgMCB8IDEgXQotICAgICAgICBWRVhUICAgIGRUbXAxLGRUbXAsZFRtcDAsIzIgICAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWyAwIHwgMSB8IDIgfCAzIHwgNCB8IDUgfCA2IHw3IF0KLSAgICAgICAKLSAgICAgICAgQUREICAgICBwRHN0VG1wLCBwRHN0LCBkc3RTdGVwCi0gICAgICAgIEFERCAgICAgZHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKLSAgICAgICAgCi0gICAgICAgIFZTVDEgICAgZFRtcDFVMzJbMV0sW3BEc3RdLGRzdGVwICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBwVG1wWzB8MXwyfDNdCi0gICAgICAgIFZTVDEgICAgZFRtcFUzMlsxXSxbcERzdFRtcF0sZHN0ZXAgICAgICAgICAgICAgIDsvLyBTdG9yZSBwVG1wWzJ8M3w0fDVdCi0gICAgICAgIFZTVDEgICAgZFRtcDFVMzJbMF0sW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBwVG1wWzR8NXw2fDddCi0gICAgICAgIFZTVDEgICAgZFRtcFUzMlswXSxbcERzdFRtcF0gICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBwVG1wWzZ8N3w4fDldCi0gICAgICAgIAotICAgICAgICBCICAgICAgICBFeGl0UHJlZGljdDR4NCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIGV4aXQgY29kZQotICAgICAgICAKLU9NWF9WQ180eDRfVkwKLQotICAgICAgICAKLSAgICAgICAgVFNUICAgICBhdmFpbGFiaWxpdHksICNPTVhfVkNfVVBQRVJfUklHSFQKLSAgICAgICAgQkVRICAgICBEaWFnVkxVcHBlclJpZ2h0Tm90QXZhaWxhYmxlCi0gICAgICAgCi0gICAgICAgIFZMRDEgICAgZEFib3ZlMCxbcFNyY0Fib3ZlXSAgICAgICAgICAgICAgICAgICAgICA7Ly8gW1U3fFU2fFU1fFU0fFUzfFUyfFUxfFUwXSAKLSAgICAgICAgVkVYVCAgICBkQWJvdmUxLGRBYm92ZTAsZEFib3ZlMCwjMSAgICAgICAgICAgICAgIDsvLyBbIFh8VTd8VTZ8VTV8VTR8VTN8VTJ8VTFdCi0gICAgICAgIFZFWFQgICAgZEFib3ZlMixkQWJvdmUxLGRBYm92ZTEsIzEgICAgICAgICAgICAgICA7Ly8gWyBYfCBYfFU3fFU2fFU1fFU0fFUzfFUyXQotICAgICAgICAKLSAgICAgICAgQiAgICAgICBEaWFnVkxQcmVkaWN0NHg0U3RvcmUgICAgICAgICAKLSAgICAgICAKLURpYWdWTFVwcGVyUmlnaHROb3RBdmFpbGFibGUKLSAgICAgICAgVkxEMSAgICBkQWJvdmVVMzJbMV0sW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgIDsvLyBbVTN8VTJ8VTF8VTB8LXwtfC18LV0gCi0gICAgICAgIFZEVVAgICAgZFUzLCBkQWJvdmVbN10gICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gW1UzIFUzIFUzIFUzIFUzIFUzIFUzIFUzXQotCi0gICAgICAgIFZFWFQgICAgZEFib3ZlMCwgZEFib3ZlLCBkVTMsICM0ICAgICAgICAgICAgICAgICA7Ly8gW1UzIFUzIFUzIFUzIFUzIFUyIFUxIFUwXQotICAgICAgICBWRVhUICAgIGRBYm92ZTEsIGRBYm92ZSwgZFUzLCAjNSAgICAgICAgICAgICAgICAgOy8vIFtVMyBVMyBVMyBVMyBVMyBVMyBVMiBVMV0KLSAgICAgICAgVkVYVCAgICBkQWJvdmUyLCBkQWJvdmUsIGRVMywgIzYgICAgICAgICAgICAgICAgIDsvLyBbVTMgVTMgVTMgVTMgVTMgVTMgVTMgVTJdCi0gICAgICAgCi1EaWFnVkxQcmVkaWN0NHg0U3RvcmUgIAotICAgICAgICAKLSAgICAgICAgVlJIQUREICBkVG1wMCwgZEFib3ZlMSwgZEFib3ZlMCAgICAgICAgICAgICAgICAgOy8vIChhK2IrMSk+PjEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgWHwgWHwgWHwgOHwgNnwgNHwgMnwgMCBdCi0gICAgICAgIAotICAgICAgICBWSEFERCAgIGRUbXAzLCBkQWJvdmUwLCBkQWJvdmUyCi0gICAgICAgIFZSSEFERCAgZFRtcDMsIGRUbXAzLCBkQWJvdmUxICAgICAgICAgICAgICAgICAgIDsvLyAoYSsyKmIrYysyKT4+MgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWyBYfCBYfCBYfCA5fCA3fCA1fCAzfCAxIF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBWRVhUICAgIGRUbXAxLGRUbXAwLGRUbXAwLCMxICAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWyBYfCBYfCBYfCBYfCA4fCA2fCA0fCAyIF0KLSAgICAgICAgQUREICAgICBwRHN0VG1wLCBwRHN0LCBkc3RTdGVwCi0gICAgICAgIEFERCAgICAgZHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKLSAgICAgICAgVkVYVCAgICBkVG1wMixkVG1wMyxkVG1wMSwjMSAgICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgWHwgWHwgWHwgWHwgOXwgN3wgNXwgMyBdCi0gICAgICAgIAotICAgICAgICBWU1QxICAgIGRUbXAwVTMyWzBdLFtwRHN0XSxkc3RlcCAgICAgICAgICAgICAgICA7Ly8gVG1wWzZdLFs0XSxbMl0sWzBdCi0gICAgICAgIFZTVDEgICAgZFRtcDNVMzJbMF0sW3BEc3RUbXBdLGRzdGVwICAgICAgICAgICAgIDsvLyBUbXBbN10sWzVdLFszXSxbMV0KLSAgICAgICAgVlNUMSAgICBkVG1wMVUzMlswXSxbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIFRtcFs4XSxbNl0sWzRdLFsyXQotICAgICAgICBWU1QxICAgIGRUbXAyVTMyWzBdLFtwRHN0VG1wXSAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWzldLFs3XSxbNV0sWzNdCi0gICAgICAgIAotICAgICAgICBCICAgICAgICBFeGl0UHJlZGljdDR4NCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIGV4aXQgY29kZQotICAgICAgICAKLU9NWF9WQ180eDRfSFUKLSAgICAgICAgQUREICAgICBwU3JjVG1wLCBwU3JjTGVmdCwgbGVmdFN0ZXAKLSAgICAgICAgQUREICAgICBzcmNTdGVwLCBsZWZ0U3RlcCwgbGVmdFN0ZXAKLQotICAgICAgICA7Ly8gTG9hZCBMZWZ0IEVkZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gW0wzfEwyfEwxfEwwfFh8WHxYfFhdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0WzRdfSxbcFNyY0xlZnRdLHNyY1N0ZXAgICAgICAgICAgIDsvLyBwU3JjTGVmdFswKmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFs1XX0sW3BTcmNUbXBdLHNyY1N0ZXAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMSpsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRbNl19LFtwU3JjTGVmdF0gICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzIqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0WzddfSxbcFNyY1RtcF0gICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFszKmxlZnRTdGVwXQotICAgICAgICAKLSAgICAgICAgVkRVUCAgICBkTDMsZExlZnRbN10gICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFtMM3xMM3xMM3xMM3xMM3xMM3xMM3xMM10KLSAgICAgICAgCi0gICAgICAgIFZFWFQgICAgZExlZnRIVTAsZExlZnQsZEwzLCM0ICAgICAgICAgICAgICAgICAgIDsvLyBbTDN8TDN8TDN8TDN8TDN8TDJ8TDF8TDBdCi0gICAgICAgIFZFWFQgICAgZExlZnRIVTEsZExlZnQsZEwzLCM1ICAgICAgICAgICAgICAgICAgIDsvLyBbTDN8TDN8TDN8TDN8TDN8TDN8TDJ8TDFdCi0gICAgICAgIFZFWFQgICAgZExlZnRIVTIsZExlZnQsZEwzLCM2ICAgICAgICAgICAgICAgICAgIDsvLyBbTDN8TDN8TDN8TDN8TDN8TDN8TDN8TDJdCi0gICAgICAgIAotICAgICAgICBWSEFERCAgIGRUbXAwLCBkTGVmdEhVMCwgZExlZnRIVTIKLSAgICAgICAgVlJIQUREICBkVG1wMCwgZFRtcDAsIGRMZWZ0SFUxICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgTDMgfCBMMyB8IEwzIHwgTDMgfCBMMyB8IDUgfCAzIHwgMSBdCi0gICAgICAgIAotICAgICAgICBWUkhBREQgIGRUbXAxLCBkTGVmdEhVMSwgZExlZnRIVTAgICAgICAgICAgICAgICA7Ly8gKGErYisxKT4+MSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBUbXBbIEwzIHwgTDMgfCBMMyB8IEwzIHwgTDMgfCA0IHwgMiB8IDAgXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFZaSVAgICAgZFRtcDEsZFRtcDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBkVG1wMSA9IFRtcFs3fCA2fCA1fCA0fCAzfCAyfCAxfCAwXSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBkVG1wMCA9IFtMM3xMM3xMM3xMM3xMM3xMM3xMM3xMM10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFZTVDEgICAgZFRtcDFVMzJbMF0sW3BEc3RdLGRzdFN0ZXAgICAgICAgICAgICAgIDsvLyBbM3wyfDF8MF0gCi0gICAgICAgIFZFWFQgICAgZFRtcDEsZFRtcDEsZFRtcDEsIzIKLSAgICAgICAgVlNUMSAgICBkVG1wMVUzMlswXSxbcERzdF0sZHN0U3RlcCAgICAgICAgICAgICAgOy8vIFs1fDR8M3wyXSAKLSAgICAgICAgVkVYVCAgICBkVG1wMSxkVG1wMSxkVG1wMSwjMgotICAgICAgICBWU1QxICAgIGRUbXAxVTMyWzBdLFtwRHN0XSxkc3RTdGVwICAgICAgICAgICAgICA7Ly8gWzd8Nnw1fDRdICAKLSAgICAgICAgVlNUMSAgICBkVG1wMFUzMlswXSxbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIFs5fDh8N3w2XSAKLSAgICAgICAgCi0gICAgICAgIAotRXhpdFByZWRpY3Q0eDQKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCi0gICAgICAgIE1fRU5ECi0KLSAgICAgICAgRU5ESUYgOy8vIENvcnRleEE4Ci0gICAgICAgIAotICAgICAgICBFTkQKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0IGVuZHMKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk4MTc5NS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDEyMjkwCi07Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotICAgICAgICAKLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfUVBEaXZUYWJsZQotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZQotICAgICAgICAgICAgCi0gICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKLSAgICAKLQotICAgIAotICAgIAotICAgIElGIENvcnRleEE4Ci0KLTsvLyBBUk0gUmVnaXN0ZXJzCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcHBTcmMgICAgICAgUk4gMAotcERzdCAgICAgICAgUk4gMQotUVAgICAgICAgICAgUk4gMgotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFNjcmF0Y2ggdmFyaWFibGUgZm9yIFVucGFjazJ4MiAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wU3JjICAgICAgICBSTiA5Ci1WYWx1ZSAgICAgICBSTiA0Ci1WYWx1ZTIgICAgICBSTiA1Ci1GbGFnICAgICAgICBSTiA2Ci1zdHJPZmZzZXQgICBSTiA3Ci1jc3RPZmZzZXQgICBSTiA4Ci0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gU2NyYXRjaCB2YXJpYWJsZQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXIwdzAgICAgICAgIFJOICAzCi1yMHcxICAgICAgICBSTiAgNAotCi1jMHcwICAgICAgICBSTiAgNQotYzF3MCAgICAgICAgUk4gIDYKLQotcmV0dXJuICAgICAgUk4gIDAKLXBRUERpdlRhYmxlIFJOICA1Ci1wUVBNb2RUYWJsZSAgICBSTiAgNgotU2hpZnQgICAgICAgIFJOICA5Ci1TY2FsZSAgICAgICAgUk4gIDIKLQotCi0KLTsvLyBOZW9uIFJlZ2lzdGVycwotCi1kWmVybyAgICAgICBETiAgRDAuVTE2Ci1kSW52VHJDb2VmZiBETiAgRDAuUzE2Ci1kU2NhbGUgICAgICBETiAgRDEuUzE2Ci1xRHFudENvZWZmICBRTiAgUTEuUzMyCi1kRHFudENvZWZmICBETiAgRDIuUzE2Ci0KLQotICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpciwgcjkKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgcFNyYywgW3BwU3JjXSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHBTcmMKLSAgICAgICAgVk1PViAgICBkWmVybywgIzAKLSAgICAgICAgTU9WICAgICBjc3RPZmZzZXQsICMzMSAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRvIGJlIHVzZWQgaW4gdGhlIGxvb3AsIHRvIGNvbXB1dGUgb2Zmc2V0Ci0gICAgICAgIAotICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICA7Ly8gRmlyc3RseSwgZmlsbCBhbGwgdGhlIGNvZWZmaWNpZW50IHZhbHVlcyBvbiB0aGUgPHBEc3Q+IGJ1ZmZlciBieSB6ZXJvCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIAotICAgICAgICBWU1QxICAgIGRaZXJvLFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFswXSAgPSBwRHN0WzFdICA9IHBEc3RbMl0gID0gcERzdFszXSAgPSAwICAgCi0gICAgICAgIExEUkIgICAgIEZsYWcsICBbcFNyY10sICMxICAgICAgICAgICAgICAgICAgIDsvLyBQcmVsb2FkIDxGbGFnPiBiZWZvcmUgPHVucGFja0xvb3A+Ci0KLQotdW5wYWNrTG9vcAotICAgICAgICBUU1QgICAgICBGbGFnLCAgIzB4MTAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ29tcHV0aW5nIChGbGFnICYgMHgxMCkKLSAgICAgICAgTERSU0JORSAgVmFsdWUyLFtwU3JjLCMxXSAgICAgICAgICAgICAgICAgIAotICAgICAgICBMRFJCTkUgICBWYWx1ZSwgW3BTcmNdLCAjMiAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBieXRlIHdpc2UgdG8gYXZvaWQgdW5hbGlnbmVkIGFjY2VzcwotICAgICAgICBBTkQgICAgICBzdHJPZmZzZXQsIGNzdE9mZnNldCwgRmxhZywgTFNMICMxICA7Ly8gc3RyT2Zmc2V0ID0gKEZsYWcgJiAxNSkgPCAxOwotICAgICAgICBMRFJTQkVRICBWYWx1ZSwgW3BTcmNdLCAjMSAgICAgICAgICAgICAgICAgICA7Ly8gVmFsdWUgPSAoT01YX1U4KSAgKnBTcmMrKwotICAgICAgICBPUlJORSAgICBWYWx1ZSxWYWx1ZSxWYWx1ZTIsIExTTCAjOCAgICAgICAgICA7Ly8gVmFsdWUgPSAoT01YX1UxNikgKnBTcmMrKwotICAgICAgICAKLSAgICAgICAgVFNUICAgICAgRmxhZywgICMweDIwICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENvbXB1dGluZyAoRmxhZyAmIDB4MjApIHRvIGNoZWNrLCBpZiB3ZSdyZSBkb25lCi0gICAgICAgIExEUkJFUSAgIEZsYWcsICBbcFNyY10sICMxICAgICAgICAgICAgICAgICAgIDsvLyBGbGFnICA9IChPTVhfVTgpICpwU3JjKyssIGZvciBuZXh0IGl0ZXJhdGlvbgotICAgICAgICBTVFJIICAgICBWYWx1ZSwgW3BEc3QsIHN0ck9mZnNldF0gICAgICAgICAgICA7Ly8gU3RvcmUgPFZhbHVlPiBhdCBvZmZzZXQgPHN0ck9mZnNldD4KLSAgICAgICAgQkVRICAgICAgdW5wYWNrTG9vcCAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byB0aGUgbG9vcCBiZWdpbm5pbmcKLSAgICAgICAgCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIDsvL0ludlRyYW5zZm9ybURDMngyOiBJbmxpbmVkIChJbXBsZW1lbnRlZCBpbiBBUk0gVjYpCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIAotICAgICAgICBMRE1JQSAgICBwRHN0LCB7cjB3MCwgcjB3MX0gICAgICAgICAgICAgICAgICA7Ly8gcjB3MCA9IHxjMXxjMHwgJiByMHcxID0gfGMzfGMyfAotCi0gICAgICAgIFNUUiAgICAgIHBTcmMsIFtwcFNyY10gICAgICAgICAgICAgICAgICAgICAgIDsvLyBVcGRhdGUgdGhlIGJpdHN0cmVhbSBwb2ludGVyCi0gICAgICAgIAotICAgICAgICBMRFIgICAgICBwUVBEaXZUYWJsZSwgPWFybVZDTTRQMTBfUVBEaXZUYWJsZSA7Ly8gUVAgRGl2aXNpb24gbG9vay11cC10YWJsZSBiYXNlIHBvaW50ZXIKLSAgICAgICAgTERSICAgICAgcFFQTW9kVGFibGUsID1hcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlIDsvLyBRUCBNb2R1bG8gbG9vay11cC10YWJsZSBiYXNlIHBvaW50ZXIKLSAgICAgICAgCi0gICAgICAgIFNBRERTVUJYIHIwdzAsIHIwdzAsICByMHcwICAgICAgICAgICAgICAgICAgIDsvLyBbIGMwMCtjMDEsIGMwMC1jMDEgXQotICAgICAgICBTQUREU1VCWCByMHcxLCByMHcxLCAgcjB3MSAgICAgICAgICAgICAgICAgICA7Ly8gWyBjMTArYzExLCBjMTAtYzExIF0KLSAgICAgICAgCi0gICAgICAgIExEUlNCICAgIFNoaWZ0LCBbcFFQRGl2VGFibGUsIFFQXSAgICAgICAgICAgIDsvLyBTaGlmdCA9IHBRUERpdlRhYmxlW1FQXQotICAgICAgICBMRFJTQiAgICBTY2FsZSwgW3BRUE1vZFRhYmxlLCBRUF0gICAgICAgICAgICA7Ly8gU2NhbGUgPSBwUVBNb2RUYWJsZVtRUF0KLSAgICAgICAgCi0gICAgICAgIFNBREQxNiAgIGMwdzAsIHIwdzAsIHIwdzEgICAgICAgICAgICAgICAgICAgIDsvLyBbIGQwMCtkMTAsIGQwMStkMTEgXQotICAgICAgICBTU1VCMTYgICBjMXcwLCByMHcwLCByMHcxICAgICAgICAgICAgICAgICAgICA7Ly8gWyBkMDAtZDEwLCBkMDEtZDExIF0KLSAgICAgICAgCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgOy8vRGVxdWFudENocm9tYURDMngyOiBJbmxpbmVkIChOZW9uIEltcGxlbWVudGF0aW9uKQotICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIAotICAgICAgICBMU0wgICAgICBTY2FsZSwgU2NhbGUsIFNoaWZ0ICAgICAgICAgICAgICAgICA7Ly8gU2NhbGUgPSBTY2FsZSA8PCBTaGlmdAotICAgICAgICBWTU9WICAgICBkSW52VHJDb2VmZiwgYzB3MCwgYzF3MCAgCi0gICAgICAgIFZSRVYzMiAgIGRJbnZUckNvZWZmLGRJbnZUckNvZWZmICAKLSAgICAgICAgVkRVUCAgICAgZFNjYWxlLFNjYWxlIAotICAgICAgICAKLSAgICAgICAgVk1VTEwgICAgcURxbnRDb2VmZixkSW52VHJDb2VmZixkU2NhbGUKLSAgICAgICAgVlNIUk4gICAgZERxbnRDb2VmZixxRHFudENvZWZmLCMxCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgVlNUMSAgICAgZERxbnRDb2VmZixbcERzdF0gICAgICAgICAgICAgICAgICAgOy8vIFN0b3JpbmcgYWxsIHRoZSBjb2VmZmljaWVudHMgYXQgb25jZQotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgotICAgICAgICBNX0VORAotICAgICAgICAKLSAgICBFTkRJRiA7Ly8gQ29ydGV4QTgKLSAgICAKLSAgICAKLSAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXJfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4YzI0MzEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzggKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDEyMjkwCi07Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLTsvLyBEZXNjcmlwdGlvbjoKLTsvLyBILjI2NCBpbnZlcnNlIHF1YW50aXplIGFuZCB0cmFuc2Zvcm0gbW9kdWxlCi07Ly8gCi07Ly8gCi0KLTsvLyBJbmNsdWRlIHN0YW5kYXJkIGhlYWRlcnMKLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotOy8vIEltcG9ydC9FeHBvcnQgc3ltYm9scyByZXF1aXJlZCBmcm9tL3RvIG90aGVyIGZpbGVzCi07Ly8gKEZvciBleGFtcGxlIHRhYmxlcykKLSAgICAgICAgCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0IAotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9RUERpdlRhYmxlCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlCi0gICAgICAgIAotICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4Ci0KLTsvLyBTZXQgZGVidWdnaW5nIGxldmVsICAgICAgICAKLTsvL0RFQlVHX09OICAgIFNFVEwge1RSVUV9Ci0KLQotOy8vIFN0YXRpYyBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50THVtYURDNHg0Ci0gICAgCi0KLTsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKLSAgICAKLSAgICAKLQotOy8vIFN0YXRpYyBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50THVtYURDNHg0Ci0KLTsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKLSAgICAKLSAgICBJRiAgQ29ydGV4QTgKLSAgICAKLTsvL0lucHV0IFJlZ2lzdGVycwotcERhdGEgICAgICAgICAgICAgICBSTiAgMAotUVAgICAgICAgICAgICAgICAgICBSTiAgMSAgICAKLQotCi07Ly9Mb2NhbCBTY3JhdGNoIFJlZ2lzdGVycwotCi07Ly8gQVJNIFJlZ2lzdGVycwotCi1wUVBEaXZUYWJsZSAgICAgICAgIFJOICAyCi1wUVBNb2RUYWJsZSAgICAgICAgIFJOICAzCi1TaGlmdCAgICAgICAgICAgICAgIFJOICA0Ci1TY2FsZSAgICAgICAgICAgICAgIFJOICA1Ci0KLTsvLyBORU9OIFJlZ2lzdGVycwotCi07Ly8gUGFja2VkIElucHV0IHBpeGVscwotZEluMCAgICAgICAgICAgICAgICBETiAgRDAuUzE2Ci1kSW4xICAgICAgICAgICAgICAgIEROICBEMS5TMTYKLWRJbjIgICAgICAgICAgICAgICAgRE4gIEQyLlMxNgotZEluMyAgICAgICAgICAgICAgICBETiAgRDMuUzE2ICAgCi0KLTsvLyBJbnRlcm1lZGlhdGUgY2FsY3VsYXRpb25zCi1kUm93U3VtMSAgICAgICAgICAgIEROICBENC5TMTYKLWRSb3dTdW0yICAgICAgICAgICAgRE4gIEQ1LlMxNgotZFJvd0RpZmYxICAgICAgICAgICBETiAgRDYuUzE2Ci1kUm93RGlmZjIgICAgICAgICAgIEROICBENy5TMTYKLQotOy8vIFJvdyBvcGVyYXRlZCBwaXhlbHMKLWRSb3dPcDAgICAgICAgICAgICAgRE4gIEQwLlMxNgotZFJvd09wMSAgICAgICAgICAgICAgICBETiAgRDEuUzE2Ci1kUm93T3AyICAgICAgICAgICAgICAgIEROICBEMi5TMTYKLWRSb3dPcDMgICAgICAgICAgICAgICAgRE4gIEQzLlMxNgotcVJvd09wMDEgICAgICAgICAgICBRTiAgUTAuMzIKLXFSb3dPcDIzICAgICAgICAgICAgUU4gIFExLjMyCi0KLTsvLyBJbnRlcm1lZGlhdGUgY2FsY3VsYXRpb25zCi1kQ29sU3VtMSAgICAgICAgICAgIEROICBENC5TMTYKLWRDb2xTdW0yICAgICAgICAgICAgRE4gIEQ1LlMxNgotZENvbERpZmYxICAgICAgICAgICBETiAgRDYuUzE2Ci1kQ29sRGlmZjIgICAgICAgICAgIEROICBENy5TMTYKLQotOy8vIENvbG91bW4gb3BlcmF0ZWQgcGl4ZWxzCi1kQ29sT3AwICAgICAgICAgICAgIEROICBEMC5TMTYKLWRDb2xPcDEgICAgICAgICAgICAgICAgRE4gIEQxLlMxNgotZENvbE9wMiAgICAgICAgICAgICAgICBETiAgRDIuUzE2Ci1kQ29sT3AzICAgICAgICAgICAgICAgIEROICBEMy5TMTYKLQotOy8vIFRlbXBvcmFyeSBzY3JhdGNoIHZhcmFpYmxlcwotCi1kU2NhbGUgICAgICAgICAgICAgIEROICBENS5TMTYKLXFSb3VuZDAgICAgICAgICAgICAgUU4gIFEzLlMzMgotcVJvdW5kMSAgICAgICAgICAgICBRTiAgUTQuUzMyCi1xUm91bmQyICAgICAgICAgICAgIFFOICBRNS5TMzIKLXFSb3VuZDMgICAgICAgICAgICAgUU4gIFE2LlMzMgotCi07Ly8gSW52VHJhbnNmb3JtZWQgYW5kIERlcXVhbnRpemVkIHBpeGVscwotZE91dDAgICAgICAgICAgICAgICBETiAgRDAuUzE2Ci1kT3V0MSAgICAgICAgICAgICAgICBETiAgRDEuUzE2Ci1kT3V0MiAgICAgICAgICAgICAgICBETiAgRDIuUzE2Ci1kT3V0MyAgICAgICAgICAgICAgICBETiAgRDMuUzE2Ci0KLSAgICAgICAKLSAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHJlcXVpcmVkIGJ5IHRoZSBmdW5jdGlvbgotICAgICAgICAKLQotICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKLSAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudEx1bWFEQzR4NCxyNSxkMTMKLSAgICAKLSAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgOy8vIFRoZSBzdHJhdGVneSB1c2VkIGluIGltcGxlbWVudGluZyB0aGUgdHJhbnNmb3JtIGlzIGFzIGZvbGxvd3M6KgotICAgIDsvLyBMb2FkIHRoZSA0eDQgYmxvY2sgaW50byA0IEQtcmVnaXN0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICogIAotICAgIDsvLyBUcmFuc3Bvc2UgdGhlIDR4NCBtYXRyaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIAotICAgIDsvLyBQZXJmb3JtIHRoZSByb3cgb3BlcmF0aW9ucyAob24gY29sdW1ucykgdXNpbmcgU0lNRCAgICAgICAgICAgICogIAotICAgIDsvLyBUcmFuc3Bvc2UgdGhlIDR4NCByZXN1bHQgbWF0cml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIAotICAgIDsvLyBQZXJmb3JtIHRoZSBjb2xvdW1uIG9wZXJhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICAgICAgOy8vIExvYWQgYWxsIHRoZSA0eDQgcGl4ZWxzIGluIFRyYW5zcG9zZWQgZm9ybQotICAgICAgICAKLSAgICAgICAgVkxENCAgICB7ZEluMCxkSW4xLGRJbjIsZEluM30sW3BEYXRhXQotICAgICAgICBMRFIgICAgIHBRUERpdlRhYmxlLCA9YXJtVkNNNFAxMF9RUERpdlRhYmxlICAgICAgICA7Ly8gUVAgRGl2aXNpb24gbG9vay11cC10YWJsZSBiYXNlIHBvaW50ZXIKLSAgICAgICAgTERSICAgICBwUVBNb2RUYWJsZSwgPWFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGUgOy8vIFFQIE1vZHVsbyBsb29rLXVwLXRhYmxlIGJhc2UgcG9pbnRlcgotICAgICAgICAKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gICAgICAgIDsvLyBSb3cgT3BlcmF0aW9ucyAoUGVyZm9ybWVkIG9uIGNvbHVtbnMpCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICAgICAgICA7Ly8gU2NhbGUgZmFjdG9yIGNhbGN1bGF0aW9uIGlzIGRvbmUgdXNpbmcgQVJNIGluc3RydWN0aW9ucwotICAgICAgICA7Ly8gSW50ZXJsZWF2ZWQgd2l0aCBORU9OIGluc3RydWN0aW9ucyBpbm9yZGVyIHRvIER1YWwgaXNzdWUKLSAgICAgICAgCi0gICAgICAgIFZBREQgICAgZFJvd1N1bTEsZEluMCxkSW4xCi0gICAgICAgIFZBREQgICAgZFJvd1N1bTIsZEluMixkSW4zCi0gICAgICAgIFZTVUIgICAgZFJvd0RpZmYxLGRJbjAsZEluMQotICAgICAgICBMRFJTQiAgIFNoaWZ0LCBbcFFQRGl2VGFibGUsIFFQXSAgICAgICAgICAgICAgIDsvLyBBUk0gQ09ERTogU2hpZnQgPSBwUVBEaXZUYWJsZVtRUF0KLSAgICAgICAgVlNVQiAgICBkUm93RGlmZjIsZEluMixkSW4zCi0gICAgICAgIExEUlNCICAgU2NhbGUsIFtwUVBNb2RUYWJsZSwgUVBdICAgICAgICAgICAgICAgOy8vIEFSTSBDT0RFOiBTY2FsZSA9IHBRUE1vZFRhYmxlW1FQXSAKLSAgICAgICAgVkFERCAgICBkUm93T3AwLGRSb3dTdW0xLGRSb3dTdW0yCi0gICAgICAgIFZTVUIgICAgZFJvd09wMSxkUm93U3VtMSxkUm93U3VtMgotICAgICAgICBWU1VCICAgIGRSb3dPcDIsZFJvd0RpZmYxLGRSb3dEaWZmMgotICAgICAgICBMU0wgICAgIFNjYWxlLCBTY2FsZSwgU2hpZnQgICAgICAgICAgICAgICAgICAgIDsvLyBBUk0gQ09ERTogU2NhbGUgPSBTY2FsZSA8PCBTaGlmdAotICAgICAgICBWQUREICAgIGRSb3dPcDMsZFJvd0RpZmYxLGRSb3dEaWZmMgotICAgICAgICAKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgOy8vIFRyYW5zcG9zZSB0aGUgcmVzdWx0YW50IG1hdHJpeAotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAKLSAgICAgICAgVlRSTiAgICBkUm93T3AwLGRSb3dPcDEKLSAgICAgICAgVlRSTiAgICBkUm93T3AyLGRSb3dPcDMKLSAgICAgICAgVlRSTiAgICBxUm93T3AwMSxxUm93T3AyMyAKLSAgICAgICAgCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICAgICAgICA7Ly8gQ29sb3VtbiBPcGVyYXRpb25zIAotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAgICAgICAgCi0gICAgICAgIFZBREQgICAgZENvbFN1bTEsZFJvd09wMCxkUm93T3AxCi0gICAgICAgIFZBREQgICAgZENvbFN1bTIsZFJvd09wMixkUm93T3AzCi0gICAgICAgIFZTVUIgICAgZENvbERpZmYxLGRSb3dPcDAsZFJvd09wMQotICAgICAgICBWU1VCICAgIGRDb2xEaWZmMixkUm93T3AyLGRSb3dPcDMKLSAgICAgICAgVkFERCAgICBkQ29sT3AwLGRDb2xTdW0xLGRDb2xTdW0yCi0gICAgICAgIFZTVUIgICAgZENvbE9wMSxkQ29sU3VtMSxkQ29sU3VtMgotICAgICAgICBWU1VCICAgIGRDb2xPcDIsZENvbERpZmYxLGRDb2xEaWZmMgotICAgICAgICBWQUREICAgIGRDb2xPcDMsZENvbERpZmYxLGRDb2xEaWZmMgotICAgICAgICAKLSAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIDxEZXF1YW50aXplPiBpbXByb3ZlcyBvbiB0aGUgYy1yZWZlcmVuY2UgY29kZQotICAgICAgICA7Ly8gQm90aCB0aGUgIGNhc2VzIGkuZS4sIFNoaWZ0Pj0wIGFuZCBTaGlmdDwwIGNhc2VzIGFyZSBjb3ZlcmVkIHRvZ2V0aGVyCi0gICAgICAgIDsvLyBXZSBkbyBub3Qgc3VidHJhY3QgMiBmcm9tIFNoaWZ0IGFzIGluIEMgcmVmZXJlbmNlLCBpbnN0ZWFkIHBlcmZvcm0gYQotICAgICAgICA7Ly8gU2NhbGUgPDwgU2hpZnQgb25jZSBpbiB0aGUgYmVnaW5uaW5nIGFuZCBkbyBhIHJpZ2h0IHNoaWZ0IGJ5IGEgCi0gICAgICAgIDsvLyBjb25zdGFudCAyIGFmdGVyIHRoZSBNdWx0aXBsaWNhdGlvbi4gVGhlIHZhbHVlIG9mIFJvdW5kIHdvdWxkIGJlIDIgCi0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vIEJ5IGRvaW5nIHRoaXMgd2UgYXZpb2QgdGhlIEJyYW5jaGVzIHJlcXVpcmVkIGFuZCBhbHNvIAotICAgICAgICA7Ly8gcmVkdWNlIHRoZSBjb2RlIHNpemUgc3Vic3RhbnRpYWxseQotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBWRFVQICAgIGRTY2FsZSwgU2NhbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEFSTSAtPiBORU9OICBjb3B5ICdzY2FsZScgdG8gdmVjdG9yCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgVk1PViAgICBxUm91bmQwLCMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXQgdGhlIFJvdW5kIFZhbHVlIAotICAgICAgICBWTU9WICAgIHFSb3VuZDEsIzIKLSAgICAgICAgVk1PViAgICBxUm91bmQyLCMyCi0gICAgICAgIFZNT1YgICAgcVJvdW5kMywjMgotICAgICAgICAKLSAgICAgICAgVk1MQUwgICBxUm91bmQwLGRDb2xPcDAsZFNjYWxlICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0W2ldICogU2NhbGUgKyBSb3VuZCAKLSAgICAgICAgVk1MQUwgICBxUm91bmQxLGRDb2xPcDEsZFNjYWxlCi0gICAgICAgIFZNTEFMICAgcVJvdW5kMixkQ29sT3AyLGRTY2FsZQotICAgICAgICBWTUxBTCAgIHFSb3VuZDMsZENvbE9wMyxkU2NhbGUKLSAgICAgICAgCi0gICAgICAgIFZTSFJOICAgZE91dDAscVJvdW5kMCwjMiAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFJpZ2h0IHNoaWZ0IGJ5IDIgJiAoT01YX1MxNilWYWx1ZQotICAgICAgICBWU0hSTiAgIGRPdXQxLHFSb3VuZDEsIzIKLSAgICAgICAgVlNIUk4gICBkT3V0MixxUm91bmQyLCMyCi0gICAgICAgIFZTSFJOICAgZE91dDMscVJvdW5kMywjMgotICAgICAgICAKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICA7Ly8gU3RvcmUgYWxsIHRoZSA0eDQgcGl4ZWxzCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgCi0gICAgICAgIFZTVDEgIHtkT3V0MCxkT3V0MSxkT3V0MixkT3V0M30sIFtwRGF0YV0KLQotICAgICAgICAKLSAgICAgICAgOy8vIFNldCByZXR1cm4gdmFsdWUKLSAgICAgICAgCi0gICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiB0YWlsCi0gICAgICAgIE1fRU5EICAgICAgICAKLSAgICAgICAgCi0gICAgRU5ESUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL0NPUlRFWEE4ICAgCi0gICAgICAgIAotCi0KLTsvLyBGdW5jdGlvbjogb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIKLSAgICAKLTsvL0lucHV0IFJlZ2lzdGVycwotcHBTcmMgICAgICAgICAgICAgICBSTiAgMAotcERzdCAgICAgICAgICAgICAgICBSTiAgMQotUVBSMiAgICAgICAgICAgICAgICBSTiAgMgotCi07Ly9PdXRwdXQgUmVnaXN0ZXJzCi1yZXN1bHQgICAgICAgICAgICAgIFJOICAwCi0KLTsvL0xvY2FsIFNjcmF0Y2ggUmVnaXN0ZXJzCi1wRHN0UjQgICAgICAgICAgICAgIFJOICA0Ci1wRHN0UjAgICAgICAgICAgICAgIFJOICAwCi1RUFIxICAgICAgICAgICAgICAgIFJOICAxCi1RUFI1ICAgICAgICAgICAgICAgIFJOICA1Ci0KLTsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKLSAgICAKLSAgICBJRiBDb3J0ZXhBOAotICAgICAgIAotICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgcmVxdWlyZWQgYnkgdGhlIGZ1bmN0aW9uCi0gICAgICAgIAotCi0gICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyLHI1Ci0gICAgICAgIAotICAgICAgICBNT1YgICAgIHBEc3RSNCxwRHN0ICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTYXZpbmcgcmVnaXN0ZXIgcjEKLSAgICAgICAgTU9WICAgICBRUFI1LFFQUjIgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2F2aW5nIHJlZ2lzdGVyIHIyCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NAotICAgICAgICAKLSAgICAgICAgTU9WICAgICBwRHN0UjAscERzdFI0ICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2V0dGluZyB1cCByZWdpc3RlciByMAotICAgICAgICBNT1YgICAgIFFQUjEsUVBSNSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXR0aW5nIHVwIHJlZ2lzdGVyIHIxCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50THVtYURDNHg0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgCi0gICAgICAgIDsvLyBTZXQgcmV0dXJuIHZhbHVlCi0gICAgICAgIE1PViAgICAgcmVzdWx0LCNPTVhfU3RzX05vRXJyICAgICAgICAKLSAgICAgICAKLSAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIHRhaWwKLSAgICAgICAgTV9FTkQKLSAgICAgICAgCi0gICAgICAgICAgICAKLSAgICBFTkRJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vQVJNMTEzNkpTICAKLSAgICAKLQotICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9BdmVyYWdlXzR4X0FsaWduX3Vuc2FmZV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0F2ZXJhZ2VfNHhfQWxpZ25fdW5zYWZlX3MuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFmZmIwOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0F2ZXJhZ2VfNHhfQWxpZ25fdW5zYWZlX3MuUworKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKgotICoKLSAqLwotCi0gICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCi0gICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCi0KLSAgICAuYXJtCi0gICAgLmZwdSBuZW9uCi0gICAgLnRleHQKLQotICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlCi1hcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMF91bnNhZmU6Ci0gICAgUFVTSCAgICAge3I0LXI2LGxyfQotICAgIExEUiAgICAgIHI3LCA9MHg4MDgwODA4MAotICAgIExEUiAgICAgIHIxMixbcjIsIzBdCi0gICAgTERSICAgICAgcjEwLFtyMF0scjEKLSAgICBMRFIgICAgICBscixbcjIscjNdCi0gICAgTERSICAgICAgcjExLFtyMF0scjEKLSAgICBNVk4gICAgICByMTIscjEyCi0gICAgTVZOICAgICAgbHIsbHIKLSAgICBVSFNVQjggICByNSxyMTAscjEyCi0gICAgVUhTVUI4ICAgcjQscjExLGxyCi0gICAgRU9SICAgICAgcjUscjUscjcKLSAgICBTVFIgICAgICByNSxbcjJdLHIzCi0gICAgRU9SICAgICAgcjQscjQscjcKLSAgICBTVFIgICAgICByNCxbcjJdLHIzCi0gICAgTERSICAgICAgcjEwLFtyMF0scjEKLSAgICBMRFIgICAgICByMTIsW3IyLCMwXQotICAgIExEUiAgICAgIHIxMSxbcjBdLHIxCi0gICAgTERSICAgICAgbHIsW3IyLHIzXQotICAgIE1WTiAgICAgIHIxMixyMTIKLSAgICBVSFNVQjggICByNSxyMTAscjEyCi0gICAgTVZOICAgICAgbHIsbHIKLSAgICBVSFNVQjggICByNCxyMTEsbHIKLSAgICBFT1IgICAgICByNSxyNSxyNwotICAgIFNUUiAgICAgIHI1LFtyMl0scjMKLSAgICBFT1IgICAgICByNCxyNCxyNwotICAgIFNUUiAgICAgIHI0LFtyMl0scjMKLSAgICBQT1AgICAgICB7cjQtcjYscGN9Ci0KLSAgICAuZ2xvYmFsIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24yX3Vuc2FmZQotYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjJfdW5zYWZlOgotICAgIFBVU0ggICAgIHtyNC1yNixscn0KLSAgICBMRFIgICAgICByNywgPTB4ODA4MDgwODAKLSAgICBMRFIgICAgICByNCxbcjAsIzRdCi0gICAgTERSICAgICAgcjEwLFtyMF0scjEKLSAgICBMRFIgICAgICByMTIsW3IyLCMwXQotICAgIExEUiAgICAgIGxyLFtyMixyM10KLSAgICBMRFIgICAgICByNSxbcjAsIzRdCi0gICAgTERSICAgICAgcjExLFtyMF0scjEKLSAgICBNVk4gICAgICByMTIscjEyCi0gICAgTVZOICAgICAgbHIsbHIKLSAgICBMU1IgICAgICByMTAscjEwLCMxNgotICAgIE9SUiAgICAgIHIxMCxyMTAscjQsTFNMICMxNgotICAgIExTUiAgICAgIHIxMSxyMTEsIzE2Ci0gICAgT1JSICAgICAgcjExLHIxMSxyNSxMU0wgIzE2Ci0gICAgVUhTVUI4ICAgcjUscjEwLHIxMgotICAgIFVIU1VCOCAgIHI0LHIxMSxscgotICAgIEVPUiAgICAgIHI1LHI1LHI3Ci0gICAgU1RSICAgICAgcjUsW3IyXSxyMwotICAgIEVPUiAgICAgIHI0LHI0LHI3Ci0gICAgU1RSICAgICAgcjQsW3IyXSxyMwotICAgIExEUiAgICAgIHI0LFtyMCwjNF0KLSAgICBMRFIgICAgICByMTAsW3IwXSxyMQotICAgIExEUiAgICAgIHIxMixbcjIsIzBdCi0gICAgTERSICAgICAgbHIsW3IyLHIzXQotICAgIExEUiAgICAgIHI1LFtyMCwjNF0KLSAgICBMRFIgICAgICByMTEsW3IwXSxyMQotICAgIE1WTiAgICAgIHIxMixyMTIKLSAgICBNVk4gICAgICBscixscgotICAgIExTUiAgICAgIHIxMCxyMTAsIzE2Ci0gICAgT1JSICAgICAgcjEwLHIxMCxyNCxMU0wgIzE2Ci0gICAgTFNSICAgICAgcjExLHIxMSwjMTYKLSAgICBPUlIgICAgICByMTEscjExLHI1LExTTCAjMTYKLSAgICBVSFNVQjggICByNSxyMTAscjEyCi0gICAgVUhTVUI4ICAgcjQscjExLGxyCi0gICAgRU9SICAgICAgcjUscjUscjcKLSAgICBTVFIgICAgICByNSxbcjJdLHIzCi0gICAgRU9SICAgICAgcjQscjQscjcKLSAgICBTVFIgICAgICByNCxbcjJdLHIzCi0gICAgUE9QICAgICAge3I0LXI2LHBjfQotCi0gICAgLmdsb2JhbCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduM191bnNhZmUKLWFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24zX3Vuc2FmZToKLSAgICBQVVNIICAgICB7cjQtcjYsbHJ9Ci0gICAgTERSICAgICAgcjcsID0weDgwODA4MDgwCi0gICAgTERSICAgICAgcjQsW3IwLCM0XQotICAgIExEUiAgICAgIHIxMCxbcjBdLHIxCi0gICAgTERSICAgICAgcjEyLFtyMiwjMF0KLSAgICBMRFIgICAgICBscixbcjIscjNdCi0gICAgTERSICAgICAgcjUsW3IwLCM0XQotICAgIExEUiAgICAgIHIxMSxbcjBdLHIxCi0gICAgTVZOICAgICAgcjEyLHIxMgotICAgIE1WTiAgICAgIGxyLGxyCi0gICAgTFNSICAgICAgcjEwLHIxMCwjMjQKLSAgICBPUlIgICAgICByMTAscjEwLHI0LExTTCAjOAotICAgIExTUiAgICAgIHIxMSxyMTEsIzI0Ci0gICAgT1JSICAgICAgcjExLHIxMSxyNSxMU0wgIzgKLSAgICBVSFNVQjggICByNSxyMTAscjEyCi0gICAgVUhTVUI4ICAgcjQscjExLGxyCi0gICAgRU9SICAgICAgcjUscjUscjcKLSAgICBTVFIgICAgICByNSxbcjJdLHIzCi0gICAgRU9SICAgICAgcjQscjQscjcKLSAgICBTVFIgICAgICByNCxbcjJdLHIzCi0gICAgTERSICAgICAgcjQsW3IwLCM0XQotICAgIExEUiAgICAgIHIxMCxbcjBdLHIxCi0gICAgTERSICAgICAgcjEyLFtyMiwjMF0KLSAgICBMRFIgICAgICBscixbcjIscjNdCi0gICAgTERSICAgICAgcjUsW3IwLCM0XQotICAgIExEUiAgICAgIHIxMSxbcjBdLHIxCi0gICAgTVZOICAgICAgcjEyLHIxMgotICAgIE1WTiAgICAgIGxyLGxyCi0gICAgTFNSICAgICAgcjEwLHIxMCwjMjQKLSAgICBPUlIgICAgICByMTAscjEwLHI0LExTTCAjOAotICAgIExTUiAgICAgIHIxMSxyMTEsIzI0Ci0gICAgT1JSICAgICAgcjExLHIxMSxyNSxMU0wgIzgKLSAgICBVSFNVQjggICByNSxyMTAscjEyCi0gICAgVUhTVUI4ICAgcjQscjExLGxyCi0gICAgRU9SICAgICAgcjUscjUscjcKLSAgICBTVFIgICAgICByNSxbcjJdLHIzCi0gICAgRU9SICAgICAgcjQscjQscjcKLSAgICBTVFIgICAgICByNCxbcjJdLHIzCi0gICAgUE9QICAgICAge3I0LXI2LHBjfQotCi0gICAgLmVuZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGVhNGE5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5TCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoKLSAqCi0gKi8KLQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQotCi0gICAgLmFybQotICAgIC5mcHUgbmVvbgotICAgIC50ZXh0Ci0KLSAgICAuZ2xvYmFsIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTTFQ0X3Vuc2FmZQotYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNMVDRfdW5zYWZlOgotICAgIFZMRDEuMzIgIHtkMThbMF19LFtyNV0hCi0gICAgVlNVQkwuVTggcTExLGQ1LGQ5Ci0gICAgVk1PViAgICAgZDI4LGQxOAotICAgIFZTVUJMLlU4IHExMCxkOCxkNAotICAgIFZTSFIuUzE2IHExMSxxMTEsIzIKLSAgICBWWklQLjggICBkMTgsZDI4Ci0gICAgVkJJRiAgICAgZDE4LGQxNCxkMTYKLSAgICBWUkhBREQuUzE2IHExMCxxMTEscTEwCi0gICAgVkFERC5JOCAgZDMxLGQxOCxkMTUKLSAgICBWUU1PVk4uUzE2IGQyMCxxMTAKLSAgICBWTEQxLjggICB7ZDBbXX0sW3IyXQotICAgIFZNSU4uUzggIGQyMCxkMjAsZDMxCi0gICAgVk5FRy5TOCAgZDMxLGQzMQotICAgIFZMRDEuOCAgIHtkMltdfSxbcjNdCi0gICAgVk1BWC5TOCAgZDIwLGQyMCxkMzEKLSAgICBWTU9WTC5VOCBxMTQsZDQKLSAgICBWTU9WTC5VOCBxMTIsZDgKLSAgICBWQUREVy5TOCBxMTQscTE0LGQyMAotICAgIFZTVUJXLlM4IHExMixxMTIsZDIwCi0gICAgVlFNT1ZVTi5TMTYgZDI5LHExNAotICAgIFZRTU9WVU4uUzE2IGQyNCxxMTIKLSAgICBCWCAgICAgICBscgotCi0gICAgLmdsb2JhbCBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0dFNF91bnNhZmUKLWFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTR0U0X3Vuc2FmZToKLSAgICBWSEFERC5VOCBkMTMsZDQsZDkKLSAgICBWSEFERC5VOCBkMzEsZDgsZDUKLSAgICBWTEQxLjggICB7ZDBbXX0sW3IyXQotICAgIEFERCAgICAgIHI1LHI1LCM0Ci0gICAgVkxEMS44ICAge2QyW119LFtyM10KLSAgICBWUkhBREQuVTggZDEzLGQxMyxkNQotICAgIFZSSEFERC5VOCBkMzEsZDMxLGQ5Ci0gICAgQlggICAgICAgbHIKLQotICAgIC5lbmQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYV91bnNhZmVfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYV91bnNhZmVfcy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWZiMmM1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFfdW5zYWZlX3MuUworKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKgotICoKLSAqLwotCi0gICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCi0gICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCi0KLSAgICAuYXJtCi0gICAgLmZwdSBuZW9uCi0gICAgLnRleHQKLQotICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQotYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZToKLSAgICBWU1VCTC5VOCBxMTEsZDUsZDkKLSAgICBWTEQxLjggICB7ZDE4W119LFtyNV0hCi0gICAgVlNVQkwuVTggcTEwLGQ4LGQ0Ci0gICAgVkxEMS44ICAge2QxOVtdfSxbcjVdIQotICAgIFZTSFIuUzE2IHExMSxxMTEsIzIKLSAgICBWRVhULjggICBkMTgsZDE4LGQxOSwjNAotICAgIFZBTkQgICAgIGQxOSxkMTcsZDE1Ci0gICAgVkJJRiAgICAgZDE4LGQxNCxkMTYKLSAgICBWUkhBREQuUzE2IHExMCxxMTEscTEwCi0gICAgVlJIQURELlU4IGQyNCxkNCxkOAotICAgIFZBREQuSTggIGQzMSxkMTgsZDE5Ci0gICAgVkFORCAgICAgZDE5LGQxMixkMTUKLSAgICBWUUFERC5VOCBkMjMsZDUsZDE4Ci0gICAgVlFNT1ZOLlMxNiBkMjAscTEwCi0gICAgVkFERC5JOCAgZDMxLGQzMSxkMTkKLSAgICBWUVNVQi5VOCBkMjIsZDUsZDE4Ci0gICAgVlFBREQuVTggZDE5LGQ5LGQxOAotICAgIFZIQURELlU4IGQyNixkMjQsZDYKLSAgICBWTUlOLlM4ICBkMjAsZDIwLGQzMQotICAgIFZORUcuUzggIGQzMSxkMzEKLSAgICBWUVNVQi5VOCBkMjEsZDksZDE4Ci0gICAgVkhBREQuVTggZDI3LGQyNCxkMTAKLSAgICBWTUFYLlU4ICBkMzAsZDI2LGQyMgotICAgIFZNQVguUzggIGQyMCxkMjAsZDMxCi0gICAgVk1PVkwuVTggcTE0LGQ0Ci0gICAgVk1PVkwuVTggcTEyLGQ4Ci0gICAgVkFERFcuUzggcTE0LHExNCxkMjAKLSAgICBWU1VCVy5TOCBxMTIscTEyLGQyMAotICAgIFZRTU9WVU4uUzE2IGQyOSxxMTQKLSAgICBWUU1PVlVOLlMxNiBkMjQscTEyCi0gICAgVk1BWC5VOCAgZDI1LGQyNyxkMjEKLSAgICBWTUlOLlU4ICBkMzAsZDMwLGQyMwotICAgIFZNSU4uVTggIGQyNSxkMjUsZDE5Ci0gICAgVkJJRiAgICAgZDI5LGQ0LGQxNgotICAgIFZCSUYgICAgIGQzMCxkNSxkMTcKLSAgICBWQklGICAgICBkMjQsZDgsZDE2Ci0gICAgVkJJRiAgICAgZDI1LGQ5LGQxMgotICAgIEJYICAgICAgIGxyCi0KLSAgICAuZ2xvYmFsIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUKLWFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmU6Ci0gICAgVlNIUi5VOCAgZDE5LGQwLCMyCi0gICAgVkFERC5JOCAgZDE5LGQxOSxkMTUKLSAgICBWQURETC5VOCBxMTAsZDgsZDQKLSAgICBWQURELkk4ICBkMTksZDE5LGQxNQotICAgIFZBRERMLlU4IHExMSxkNixkOQotICAgIFZBRERXLlU4IHExMixxMTAsZDUKLSAgICBWQ0dULlU4ICBkMTksZDE5LGQxMwotICAgIFZTSFIuVTE2IHExMSxxMTEsIzEKLSAgICBWSEFERC5VMTYgcTExLHExMixxMTEKLSAgICBWQUREVy5VOCBxMTIscTEyLGQ2Ci0gICAgVkFEREwuVTggcTEzLGQ3LGQ2Ci0gICAgVkFORCAgICAgZDE3LGQxNyxkMTkKLSAgICBWSEFERC5VOCBkMjgsZDQsZDkKLSAgICBWU1JBLlUxNiBxMTMscTEyLCMxCi0gICAgVkFORCAgICAgZDEyLGQxMixkMTkKLSAgICBWUVJTSFJOLlUxNiBkMjkscTExLCMxCi0gICAgVlJIQURELlU4IGQyOCxkMjgsZDUKLSAgICBWUVJTSFJOLlUxNiBkMzAscTEyLCMyCi0gICAgVkFEREwuVTggcTExLGQxMCxkNQotICAgIFZBRERXLlU4IHExMixxMTAsZDkKLSAgICBWQklGICAgICBkMjksZDI4LGQxNwotICAgIFZRUlNIUk4uVTE2IGQzMSxxMTMsIzIKLSAgICBWQURETC5VOCBxMTMsZDExLGQxMAotICAgIFZTSFIuVTE2IHExMSxxMTEsIzEKLSAgICBWSEFERC5VMTYgcTExLHExMixxMTEKLSAgICBWQUREVy5VOCBxMTIscTEyLGQxMAotICAgIFZIQURELlU4IGQyOCxkOCxkNQotICAgIFZCSUYgICAgIGQyOSxkNCxkMTYKLSAgICBWQklGICAgICBkMzAsZDUsZDE3Ci0gICAgVlNSQS5VMTYgcTEzLHExMiwjMQotICAgIFZRUlNIUk4uVTE2IGQyNSxxMTIsIzIKLSAgICBWUVJTSFJOLlUxNiBkMjQscTExLCMxCi0gICAgVlJIQURELlU4IGQyMixkMjgsZDkKLSAgICBWQklGICAgICBkMjUsZDksZDEyCi0gICAgVkJJRiAgICAgZDMxLGQ2LGQxNwotICAgIFZCSUYgICAgIGQyNCxkMjIsZDEyCi0gICAgVlFSU0hSTi5VMTYgZDI4LHExMywjMgotICAgIFZCSUYgICAgIGQyNCxkOCxkMTYKLSAgICBWQklGICAgICBkMjgsZDEwLGQxMgotICAgIEJYICAgICAgIGxyCi0KLSAgICAuZW5kCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdjMDQ1Mi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLlMKKysrIC9kZXYvbnVsbApAQCAtMSwzMjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoKLSAqCi0gKi8KLQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQotCi0gICAgLmFybQotICAgIC5mcHUgbmVvbgotICAgIC50ZXh0Ci0KLSAgICAuZXh0ZXJuICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXMKLSAgICAuZXh0ZXJuICAgYXJtVkNNNFAxMF9TdWZmaXhUb0xldmVsCi0gICAgLmV4dGVybiAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzCi0gICAgLmV4dGVybiAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXMKLSAgICAuZXh0ZXJuICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlcwotICAgIC5leHRlcm4gICBhcm1WQ000UDEwX1ppZ1phZ18yeDIKLSAgICAuZXh0ZXJuICAgYXJtVkNNNFAxMF9aaWdaYWdfNHg0Ci0KLSAgICAuaGlkZGVuICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXMKLSAgICAuaGlkZGVuICAgYXJtVkNNNFAxMF9TdWZmaXhUb0xldmVsCi0gICAgLmhpZGRlbiAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzCi0gICAgLmhpZGRlbiAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXMKLSAgICAuaGlkZGVuICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlcwotICAgIC5oaWRkZW4gICBhcm1WQ000UDEwX1ppZ1phZ18yeDIKLSAgICAuaGlkZGVuICAgYXJtVkNNNFAxMF9aaWdaYWdfNHg0Ci0KLSAgICAuZ2xvYmFsIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyCi1hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcjoKLSAgICBQVVNIICAgICB7cjQtcjEyLGxyfQotICAgIFNVQiAgICAgIHNwLHNwLCMweDQwCi0gICAgTERSICAgICAgcjEwLFtyMCwjMF0KLSAgICBMRFIgICAgICByMTIsW3IxLCMwXQotICAgIExEUiAgICAgIHI2LCAuTGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzCi1QMDogQUREICAgICAgcjYsIHBjCi0gICAgTERSICAgICAgcjQsW3NwLCMweDY4XQotICAgIExEUkIgICAgIHI5LFtyMTAsIzJdCi0gICAgTERSQiAgICAgcjgsW3IxMCwjMV0KLSAgICBMRFJCICAgICByMTEsW3IxMF0sIzMKLSAgICBBREQgICAgICByMTIscjEyLCM4Ci0gICAgTERSICAgICAgcjYsW3I2LHI0LExTTCAjMl0KLSAgICBPUlIgICAgICByOSxyOSxyOCxMU0wgIzgKLSAgICBPUlIgICAgICByMTEscjkscjExLExTTCAjMTYKLSAgICBMU0xTICAgICByOCxyMTEscjEyCi0gICAgTU9WUyAgICAgcjcsIzB4MWUKLSAgICBBTkQgICAgICByNyxyNyxyOCxMU1IgIzI3Ci0gICAgU1VCUyAgICAgcjEyLHIxMiwjOAotTDB4NDQ6Ci0gICAgQkNDICAgICAgTDEKLSAgICBMRFJCICAgICByOCxbcjEwXSwjMQotTDE6Ci0gICAgTERSSCAgICAgcjcsW3I2LHI3XQotICAgIEFERENDICAgIHIxMixyMTIsIzgKLSAgICBBREQgICAgICByMTIscjEyLCM0Ci0gICAgT1JSQ1MgICAgcjExLHI4LHIxMSxMU0wgIzgKLSAgICBMU1JTICAgICByOCxyNywjMQotICAgIEJDUyAgICAgIEwweDc0Ci0gICAgTFNMUyAgICAgcjgscjExLHIxMgotICAgIFNVQlMgICAgIHIxMixyMTIsIzB4YQotICAgIEFERCAgICAgIHI3LHI3LHI4LExTUiAjMjkKLSAgICBCSUMgICAgICByNyxyNywjMQotICAgIEIgICAgICAgIEwweDQ0Ci1MMHg3NDoKLSAgICBTVUIgICAgICByMTIscjEyLHI3LExTUiAjMTMKLSAgICBCSUMgICAgICByNyxyOCwjMHhmMDAwCi0gICAgTFNSUyAgICAgcjUscjcsIzIKLSAgICBTVFJCICAgICByNSxbcjIsIzBdCi0gICAgQkVRICAgICAgTDB4MzQ0Ci0gICAgQ01QICAgICAgcjcsIzB4NDQKLSAgICBCR0UgICAgICBMMHgzM2MKLSAgICBTVFIgICAgICByMCxbc3AsIzBdCi0gICAgU1RSICAgICAgcjEsW3NwLCM0XQotICAgIFNUUiAgICAgIHIzLFtzcCwjOF0KLSAgICBBTkRTICAgICByMSxyNywjMwotICAgIEFERCAgICAgIHIyLHNwLCMweGMKLSAgICBCRVEgICAgICBMMHhkOAotICAgIE1PViAgICAgIHIwLHIxCi1MMHhhYzoKLSAgICBMU0xTICAgICByNyxyMTEscjEyCi0gICAgU1VCUyAgICAgcjEyLHIxMiwjNwotICAgIEJDQyAgICAgIEwyCi0gICAgTERSQiAgICAgcjgsW3IxMF0sIzEKLUwyOgotICAgIEFERENDICAgIHIxMixyMTIsIzgKLSAgICBMU1IgICAgICByNyxyNywjMzEKLSAgICBPUlJDUyAgICByMTEscjgscjExLExTTCAjOAotICAgIFNVQlMgICAgIHIwLHIwLCMxCi0gICAgTU9WICAgICAgcjgsIzEKLSAgICBTVUIgICAgICByOCxyOCxyNyxMU0wgIzEKLSAgICBTVFJIICAgICByOCxbcjJdLCMyCi0gICAgQkdUICAgICAgTDB4YWMKLUwweGQ4OgotICAgIFNVQlMgICAgIHIwLHI1LHIxCi0gICAgQkVRICAgICAgTDB4MWI4Ci0gICAgTU9WICAgICAgcjQsIzEKLSAgICBDTVAgICAgICByNSwjMHhhCi0gICAgTU9WTEUgICAgcjQsIzAKLSAgICBDTVAgICAgICByMSwjMwotICAgIE1PVkxUICAgIHIxLCM0Ci0gICAgTU9WR0UgICAgcjEsIzIKLSAgICBNT1ZHRSAgICByNCwjMAotTDB4ZmM6Ci0gICAgTFNMUyAgICAgcjcscjExLHIxMgotICAgIENMWiAgICAgIHI3LHI3Ci0gICAgQUREICAgICAgcjEyLHIxMixyNwotICAgIFNVQlMgICAgIHIxMixyMTIsIzcKLSAgICBCQ0MgICAgICBMMwotICAgIExEUkIgICAgIHI4LFtyMTBdLCMxCi0gICAgT1JSICAgICAgcjExLHI4LHIxMSxMU0wgIzgKLSAgICBTVUJTICAgICByMTIscjEyLCM4Ci0gICAgQkNDICAgICAgTDMKLSAgICBMRFJCICAgICByOCxbcjEwXSwjMQotTDM6Ci0gICAgQUREQ0MgICAgcjEyLHIxMiwjOAotICAgIE9SUkNTICAgIHIxMSxyOCxyMTEsTFNMICM4Ci0gICAgQ01QICAgICAgcjcsIzB4MTAKLSAgICBCR0UgICAgICBMMHgzM2MKLSAgICBNT1ZTICAgICBscixyNAotICAgIFRFUUVRICAgIHI3LCMweGUKLSAgICBNT1ZFUSAgICBsciwjNAotICAgIFRFUSAgICAgIHI3LCMweGYKLSAgICBNT1ZFUSAgICBsciwjMHhjCi0gICAgVEVRRVEgICAgcjQsIzAKLSAgICBBRERFUSAgICByNyxyNywjMHhmCi0gICAgVEVRICAgICAgbHIsIzAKLSAgICBCRVEgICAgICBMMHgxODQKLSAgICBMU0wgICAgICByMyxyMTEscjEyCi0gICAgQUREICAgICAgcjEyLHIxMixscgotICAgIFNVQlMgICAgIHIxMixyMTIsIzgKLSAgICBSU0IgICAgICByOSxsciwjMHgyMAotICAgIEJDQyAgICAgIEw0Ci0gICAgTERSQiAgICAgcjgsW3IxMF0sIzEKLSAgICBPUlIgICAgICByMTEscjgscjExLExTTCAjOAotICAgIFNVQlMgICAgIHIxMixyMTIsIzgKLSAgICBCQ0MgICAgICBMNAotICAgIExEUkIgICAgIHI4LFtyMTBdLCMxCi1MNDoKLSAgICBBRERDQyAgICByMTIscjEyLCM4Ci0gICAgTFNSICAgICAgcjMscjMscjkKLSAgICBPUlJDUyAgICByMTEscjgscjExLExTTCAjOAotICAgIExTTCAgICAgIHI3LHI3LHI0Ci0gICAgQUREICAgICAgcjcscjMscjcKLUwweDE4NDoKLSAgICBBREQgICAgICByNyxyNyxyMQotICAgIE1PViAgICAgIHIxLCMyCi0gICAgTFNSUyAgICAgcjgscjcsIzEKLSAgICBSU0JDUyAgICByOCxyOCwjMAotICAgIFNUUkggICAgIHI4LFtyMl0sIzIKLSAgICBMRFIgICAgICByOSwgLkxhcm1WQ000UDEwX1N1ZmZpeFRvTGV2ZWwKLVAxOiBBREQgICAgICByOSwgcGMKLSAgICBMRFJTQiAgICByOCxbcjkscjRdCi0gICAgVEVRICAgICAgcjQsIzAKLSAgICBNT1ZFUSAgICByNCwjMQotICAgIENNUCAgICAgIHI3LHI4Ci0gICAgQUREQ1MgICAgcjQscjQsIzEKLSAgICBTVUJTICAgICByMCxyMCwjMQotICAgIEJHVCAgICAgIEwweGZjCi1MMHgxYjg6Ci0gICAgTERSICAgICAgcjgsW3NwLCMweDZjXQotICAgIFNVQiAgICAgIHIwLHI1LCMxCi0gICAgU1VCUyAgICAgcjEscjgscjUKLSAgICBBREQgICAgICByNCxzcCwjMHgyYwotICAgIE1PViAgICAgIGxyLHI1Ci0gICAgU1VCICAgICAgbHIsbHIsIzEKLSAgICBCRVEgICAgICBMMHgyYjAKLSAgICBURVEgICAgICByOCwjNAotICAgIExEUkVRICAgIHI2LCAuTGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzCi0gICAgTERSTkUgICAgcjYsIC5MYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlcwotUDI6IEFERCAgICAgIHI2LCBwYwotICAgIExEUiAgICAgIHI2LFtyNixyNSxMU0wgIzJdCi0gICAgTFNMUyAgICAgcjgscjExLHIxMgotICAgIE1PVlMgICAgIHI3LCMweDFlCi0gICAgQU5EICAgICAgcjcscjcscjgsTFNSICMyNwotICAgIFNVQlMgICAgIHIxMixyMTIsIzgKLUwweDFmNDoKLSAgICBCQ0MgICAgICBMNQotICAgIExEUkIgICAgIHI4LFtyMTBdLCMxCi1MNToKLSAgICBMRFJIICAgICByNyxbcjYscjddCi0gICAgQUREQ0MgICAgcjEyLHIxMiwjOAotICAgIEFERCAgICAgIHIxMixyMTIsIzQKLSAgICBPUlJDUyAgICByMTEscjgscjExLExTTCAjOAotICAgIExTUlMgICAgIHI4LHI3LCMxCi0gICAgQkNTICAgICAgTDB4MjI0Ci0gICAgTFNMUyAgICAgcjgscjExLHIxMgotICAgIFNVQlMgICAgIHIxMixyMTIsIzB4YQotICAgIEFERCAgICAgIHI3LHI3LHI4LExTUiAjMjkKLSAgICBCSUMgICAgICByNyxyNywjMQotICAgIEIgICAgICAgIEwweDFmNAotTDB4MjI0OgotICAgIFNVQiAgICAgIHIxMixyMTIscjcsTFNSICMxMwotICAgIEJJQyAgICAgIHI3LHI4LCMweGYwMDAKLSAgICBDTVAgICAgICByNywjMHgxMAotICAgIEJHRSAgICAgIEwweDMzYwotICAgIExEUiAgICAgIHIzLCAuTGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXMKLVAzOiBBREQgICAgICByMywgcGMKLSAgICBBREQgICAgICByNCxzcCwjMHgyYwotICAgIE1PVlMgICAgIHIxLHI3Ci0gICAgQUREICAgICAgbHIsbHIscjEKLSAgICBCRVEgICAgICBMMHgyYjAKLUwweDI0ODoKLSAgICBTVUJTICAgICByMCxyMCwjMQotICAgIExEUiAgICAgIHI2LFtyMyxyMSxMU0wgIzJdCi0gICAgQkxUICAgICAgTDB4MmJjCi0gICAgTFNMUyAgICAgcjgscjExLHIxMgotICAgIE1PVlMgICAgIHI3LCMweGUKLSAgICBBTkQgICAgICByNyxyNyxyOCxMU1IgIzI4Ci0gICAgU1VCUyAgICAgcjEyLHIxMiwjOAotTDB4MjY0OgotICAgIEJDQyAgICAgIEw2Ci0gICAgTERSQiAgICAgcjgsW3IxMF0sIzEKLUw2OgotICAgIExEUkggICAgIHI3LFtyNixyN10KLSAgICBBRERDQyAgICByMTIscjEyLCM4Ci0gICAgQUREICAgICAgcjEyLHIxMiwjMwotICAgIE9SUkNTICAgIHIxMSxyOCxyMTEsTFNMICM4Ci0gICAgTFNSUyAgICAgcjgscjcsIzEKLSAgICBCQ1MgICAgICBMMHgyOTQKLSAgICBMU0xTICAgICByOCxyMTEscjEyCi0gICAgU1VCUyAgICAgcjEyLHIxMiwjOQotICAgIEFERCAgICAgIHI3LHI3LHI4LExTUiAjMjkKLSAgICBCSUMgICAgICByNyxyNywjMQotICAgIEIgICAgICAgIEwweDI2NAotTDB4Mjk0OgotICAgIFNVQiAgICAgIHIxMixyMTIscjcsTFNSICMxMwotICAgIEJJQyAgICAgIHI3LHI4LCMweGYwMDAKLSAgICBDTVAgICAgICByNywjMHhmCi0gICAgQkdFICAgICAgTDB4MzNjCi0gICAgU1VCUyAgICAgcjEscjEscjcKLSAgICBTVFJCICAgICByNyxbcjRdLCMxCi0gICAgQkdUICAgICAgTDB4MjQ4Ci1MMHgyYjA6Ci0gICAgU1VCUyAgICAgcjAscjAsIzEKLSAgICBCTFQgICAgICBMNwotICAgIFNUUkIgICAgIHIxLFtyNF0sIzEKLUw3OgotICAgIEJHVCAgICAgIEwweDJiMAotTDB4MmJjOgotICAgIFNUUkIgICAgIHIxLFtyNF0sIzEKLSAgICBMRFIgICAgICByOCxbc3AsIzB4NmNdCi0gICAgVEVRICAgICAgcjgsIzB4ZgotICAgIEFEREVRICAgIGxyLGxyLCMxCi0gICAgU1VCICAgICAgcjQscjQscjUKLSAgICBTVUIgICAgICByMixyMixyNQotICAgIFNVQiAgICAgIHIyLHIyLHI1Ci0gICAgTERSICAgICAgcjMsW3NwLCM4XQotICAgIExEUiAgICAgIHIwLFtyMywjMF0KLSAgICBURVEgICAgICByOCwjNAotICAgIExEUkVRICAgIHI2LCAuTGFybVZDTTRQMTBfWmlnWmFnXzJ4MgotICAgIExEUk5FICAgIHI2LCAuTGFybVZDTTRQMTBfWmlnWmFnXzR4NAotUDQ6IEFERCAgICAgIHI2LCBwYwotTDB4MmVjOgotICAgIExEUkIgICAgIHI5LFtyNF0sIzEKLSAgICBMRFJCICAgICByOCxbcjYsbHJdCi0gICAgU1VCICAgICAgbHIsbHIsIzEKLSAgICBTVUIgICAgICBscixscixyOQotICAgIExEUlNIICAgIHI5LFtyMl0sIzIKLSAgICBTVUJTICAgICByNSxyNSwjMQotICAgIE9SUkVRICAgIHI4LHI4LCMweDIwCi0gICAgQUREICAgICAgcjEscjksIzB4ODAKLSAgICBDTVAgICAgICByMSwjMHgxMDAKLSAgICBPUlJDUyAgICByOCxyOCwjMHgxMAotICAgIFRFUSAgICAgIHI1LCMwCi0gICAgU1RSQiAgICAgcjgsW3IwXSwjMQotICAgIFNUUkIgICAgIHI5LFtyMF0sIzEKLSAgICBMU1IgICAgICByOSxyOSwjOAotICAgIEJDQyAgICAgIEw4Ci0gICAgU1RSQiAgICAgcjksW3IwXSwjMQotTDg6Ci0gICAgQk5FICAgICAgTDB4MmVjCi0gICAgU1RSICAgICAgcjAsW3IzLCMwXQotICAgIExEUiAgICAgIHIwLFtzcCwjMF0KLSAgICBMRFIgICAgICByMSxbc3AsIzRdCi0gICAgQiAgICAgICAgTDB4MzQ0Ci1MMHgzM2M6Ci0gICAgTVZOICAgICAgcjAsIzEKLSAgICBCICAgICAgICBMMHgzNWMKLUwweDM0NDoKLSAgICBBREQgICAgICByMTAscjEwLHIxMixMU1IgIzMKLSAgICBBTkQgICAgICByMTIscjEyLCM3Ci0gICAgU1VCICAgICAgcjEwLHIxMCwjNAotICAgIFNUUiAgICAgIHIxMixbcjEsIzBdCi0gICAgU1RSICAgICAgcjEwLFtyMCwjMF0KLSAgICBNT1YgICAgICByMCwjMAotTDB4MzVjOgotICAgIEFERCAgICAgIHNwLHNwLCMweDQwCi0gICAgUE9QICAgICAge3I0LXIxMixwY30KLQotLkxhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlczoKLSAgICAud29yZCAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzLShQMCs4KQotLkxhcm1WQ000UDEwX1N1ZmZpeFRvTGV2ZWw6Ci0gICAgLndvcmQgICBhcm1WQ000UDEwX1N1ZmZpeFRvTGV2ZWwtKFAxKzgpCi0uTGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzOgotICAgIC53b3JkICAgKGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzIC0gNCktKFAyKzgpCi0uTGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXM6Ci0gICAgLndvcmQgICAoYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlcyAtIDQpLShQMis4KQotLkxhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzOgotICAgIC53b3JkICAgKGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXMgLSA0KS0oUDMrOCkKLS5MYXJtVkNNNFAxMF9aaWdaYWdfMngyOgotICAgIC53b3JkICAgYXJtVkNNNFAxMF9aaWdaYWdfMngyLShQNCs4KQotLkxhcm1WQ000UDEwX1ppZ1phZ180eDQ6Ci0gICAgLndvcmQgICBhcm1WQ000UDEwX1ppZ1phZ180eDQtKFA0KzgpCi0KLSAgICAuZW5kCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZlYmYyZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5TCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi0vKgotICoKLSAqLwotCi0gICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCi0gICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCi0KLSAgICAuYXJtCi0gICAgLmZwdSBuZW9uCi0gICAgLnNlY3Rpb24gLnJvZGF0YQotICAgIC5hbGlnbiA0Ci0KLQotICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9RUERpdlRhYmxlCi0gICAgLmdsb2JhbCBhcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlCi0gICAgLmdsb2JhbCBhcm1WQ000UDEwX1Bvc1RvVkNvbDR4NAotICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9Qb3NUb1ZDb2wyeDIKLSAgICAuZ2xvYmFsIGFybVZDTTRQMTBfVk1hdHJpeAotICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9RUE1vZHVsb1RhYmxlCi0gICAgLmdsb2JhbCBhcm1WQ000UDEwX1ZNYXRyaXhVMTYKLQotICAgIC5oaWRkZW4gYXJtVkNNNFAxMF9RUERpdlRhYmxlCi0gICAgLmhpZGRlbiBhcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlCi0gICAgLmhpZGRlbiBhcm1WQ000UDEwX1Bvc1RvVkNvbDR4NAotICAgIC5oaWRkZW4gYXJtVkNNNFAxMF9Qb3NUb1ZDb2wyeDIKLSAgICAuaGlkZGVuIGFybVZDTTRQMTBfVk1hdHJpeAotICAgIC5oaWRkZW4gYXJtVkNNNFAxMF9RUE1vZHVsb1RhYmxlCi0gICAgLmhpZGRlbiBhcm1WQ000UDEwX1ZNYXRyaXhVMTYKLQotYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDQ6Ci0gICAgLmJ5dGUgIDAsIDIsIDAsIDIKLSAgICAuYnl0ZSAgMiwgMSwgMiwgMQotICAgIC5ieXRlICAwLCAyLCAwLCAyCi0gICAgLmJ5dGUgIDIsIDEsIDIsIDEKLQotYXJtVkNNNFAxMF9Qb3NUb1ZDb2wyeDI6Ci0gICAgLmJ5dGUgIDAsIDIKLSAgICAuYnl0ZSAgMiwgMQotCi1hcm1WQ000UDEwX1ZNYXRyaXg6Ci0gICAgLmJ5dGUgIDEwLCAxNiwgMTMKLSAgICAuYnl0ZSAgMTEsIDE4LCAxNAotICAgIC5ieXRlICAxMywgMjAsIDE2Ci0gICAgLmJ5dGUgIDE0LCAyMywgMTgKLSAgICAuYnl0ZSAgMTYsIDI1LCAyMAotICAgIC5ieXRlICAxOCwgMjksIDIzCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBUaGlzIHRhYmxlIGV2YWx1YXRlcyB0aGUgZXhwcmVzc2lvbiBbKElOVCkoUVAvNildLAotOy8vIGZvciB2YWx1ZXMgb2YgUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLgotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1hcm1WQ000UDEwX1FQRGl2VGFibGU6Ci0gICAgLmJ5dGUgIDAsICAwLCAgMCwgIDAsICAwLCAgMAotICAgIC5ieXRlICAxLCAgMSwgIDEsICAxLCAgMSwgIDEKLSAgICAuYnl0ZSAgMiwgIDIsICAyLCAgMiwgIDIsICAyCi0gICAgLmJ5dGUgIDMsICAzLCAgMywgIDMsICAzLCAgMwotICAgIC5ieXRlICA0LCAgNCwgIDQsICA0LCAgNCwgIDQKLSAgICAuYnl0ZSAgNSwgIDUsICA1LCAgNSwgIDUsICA1Ci0gICAgLmJ5dGUgIDYsICA2LCAgNiwgIDYsICA2LCAgNgotICAgIC5ieXRlICA3LCAgNywgIDcsICA3LCAgNywgIDcKLSAgICAuYnl0ZSAgOCwgIDgsICA4LCAgOCwgIDgsICA4Ci0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBUaGlzIHRhYmxlIGNvbnRhaW5zIGFybVZDTTRQMTBfVk1hdHJpeFtRUCU2XVswXSBlbnRpcmVzLAotOy8vIGZvciB2YWx1ZXMgb2YgUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLgotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1hcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlOgotICAgIC5ieXRlIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKLSAgICAuYnl0ZSAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4Ci0gICAgLmJ5dGUgMTAsIDExLCAxMywgMTQsIDE2LCAxOAotICAgIC5ieXRlIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKLSAgICAuYnl0ZSAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4Ci0gICAgLmJ5dGUgMTAsIDExLCAxMywgMTQsIDE2LCAxOAotICAgIC5ieXRlIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKLSAgICAuYnl0ZSAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4Ci0gICAgLmJ5dGUgMTAsIDExLCAxMywgMTQsIDE2LCAxOAotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gVGhpcyB0YWJsZSBldmFsdWF0ZXMgdGhlIG1vZHVsdXMgZXhwcmVzc2lvbiBbUVAlNl0qNiwKLTsvLyBmb3IgdmFsdWVzIG9mIFFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotYXJtVkNNNFAxMF9RUE1vZHVsb1RhYmxlOgotICAgIC5ieXRlIDAsIDYsIDEyLCAxOCwgMjQsIDMwCi0gICAgLmJ5dGUgMCwgNiwgMTIsIDE4LCAyNCwgMzAKLSAgICAuYnl0ZSAwLCA2LCAxMiwgMTgsIDI0LCAzMAotICAgIC5ieXRlIDAsIDYsIDEyLCAxOCwgMjQsIDMwCi0gICAgLmJ5dGUgMCwgNiwgMTIsIDE4LCAyNCwgMzAKLSAgICAuYnl0ZSAwLCA2LCAxMiwgMTgsIDI0LCAzMAotICAgIC5ieXRlIDAsIDYsIDEyLCAxOCwgMjQsIDMwCi0gICAgLmJ5dGUgMCwgNiwgMTIsIDE4LCAyNCwgMzAKLSAgICAuYnl0ZSAwLCA2LCAxMiwgMTgsIDI0LCAzMAotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gVGhpcyB0YWJsZSBjb250YWlucyB0aGUgaW52aWR1YWwgYnl0ZSB2YWx1ZXMgc3RvcmVkIGFzCi07Ly8gaGFsZndvcmRzLiBUaGlzIGF2b2lkcyB1bnBhY2tpbmcgaW5zaWRlIHRoZSBmdW5jdGlvbgotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1hcm1WQ000UDEwX1ZNYXRyaXhVMTY6Ci0gICAgLmh3b3JkIDEwLCAxNiwgMTMKLSAgICAuaHdvcmQgMTEsIDE4LCAxNAotICAgIC5od29yZCAxMywgMjAsIDE2Ci0gICAgLmh3b3JkIDE0LCAyMywgMTgKLSAgICAuaHdvcmQgMTYsIDI1LCAyMAotICAgIC5od29yZCAxOCwgMjksIDIzCi0KLSAgICAuZW5kCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9BbGlnbl91bnNhZmVfcy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGU5MDA0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLlMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoKLSAqCi0gKi8KLQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQotCi0gICAgLmFybQotICAgIC5mcHUgbmVvbgotICAgIC50ZXh0Ci0KLSAgICAuZ2xvYmFsIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlCi1hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZToKLSAgICBNT1YgICAgICByMTIscjgKLSAgICBBTkQgICAgICByNyxyMCwjMwotICAgIEJJQyAgICAgIHIwLHIwLCMzCi0gICAgQUREICAgICAgcGMscGMscjcsTFNMICMyCi0gICAgTk9QCi0gICAgQiAgICAgICAgQ29weTB0b0FsaWduZWQKLSAgICBCICAgICAgICBDb3B5MXRvQWxpZ25lZAotICAgIEIgICAgICAgIENvcHkydG9BbGlnbmVkCi0gICAgQiAgICAgICAgQ29weTN0b0FsaWduZWQKLUNvcHkwdG9BbGlnbmVkOgotICAgIExETSAgICAgIHIwLHtyNyxyMTAscjExfQotICAgIFNVQlMgICAgIHI5LHI5LCMxCi0gICAgQUREICAgICAgcjAscjAscjEKLSAgICBTVE0gICAgICByOCEse3I3LHIxMCxyMTF9Ci0gICAgQkdUICAgICAgQ29weTB0b0FsaWduZWQKLSAgICBCICAgICAgICBDb3B5RW5kCi1Db3B5MXRvQWxpZ25lZDoKLSAgICBMRE0gICAgICByMCx7cjcscjEwLHIxMX0KLSAgICBTVUJTICAgICByOSxyOSwjMQotICAgIEFERCAgICAgIHIwLHIwLHIxCi0gICAgTFNSICAgICAgcjcscjcsIzgKLSAgICBPUlIgICAgICByNyxyNyxyMTAsTFNMICMyNAotICAgIExTUiAgICAgIHIxMCxyMTAsIzgKLSAgICBPUlIgICAgICByMTAscjEwLHIxMSxMU0wgIzI0Ci0gICAgTFNSICAgICAgcjExLHIxMSwjOAotICAgIFNUTSAgICAgIHI4ISx7cjcscjEwLHIxMX0KLSAgICBCR1QgICAgICBDb3B5MXRvQWxpZ25lZAotICAgIEIgICAgICAgIENvcHlFbmQKLUNvcHkydG9BbGlnbmVkOgotICAgIExETSAgICAgIHIwLHtyNyxyMTAscjExfQotICAgIFNVQlMgICAgIHI5LHI5LCMxCi0gICAgQUREICAgICAgcjAscjAscjEKLSAgICBMU1IgICAgICByNyxyNywjMTYKLSAgICBPUlIgICAgICByNyxyNyxyMTAsTFNMICMxNgotICAgIExTUiAgICAgIHIxMCxyMTAsIzE2Ci0gICAgT1JSICAgICAgcjEwLHIxMCxyMTEsTFNMICMxNgotICAgIExTUiAgICAgIHIxMSxyMTEsIzE2Ci0gICAgU1RNICAgICAgcjghLHtyNyxyMTAscjExfQotICAgIEJHVCAgICAgIENvcHkydG9BbGlnbmVkCi0gICAgQiAgICAgICAgQ29weUVuZAotQ29weTN0b0FsaWduZWQ6Ci0gICAgTERNICAgICAgcjAse3I3LHIxMCxyMTF9Ci0gICAgU1VCUyAgICAgcjkscjksIzEKLSAgICBBREQgICAgICByMCxyMCxyMQotICAgIExTUiAgICAgIHI3LHI3LCMyNAotICAgIE9SUiAgICAgIHI3LHI3LHIxMCxMU0wgIzgKLSAgICBMU1IgICAgICByMTAscjEwLCMyNAotICAgIE9SUiAgICAgIHIxMCxyMTAscjExLExTTCAjOAotICAgIExTUiAgICAgIHIxMSxyMTEsIzI0Ci0gICAgU1RNICAgICAgcjghLHtyNyxyMTAscjExfQotICAgIEJHVCAgICAgIENvcHkzdG9BbGlnbmVkCi1Db3B5RW5kOgotICAgIE1PViAgICAgIHIwLHIxMgotICAgIE1PViAgICAgIHIxLCMweGMKLSAgICBCWCAgICAgICBscgotCi0gICAgLmdsb2JhbCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQotYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmU6Ci0gICAgQU5EICAgICAgcjcscjAsIzMKLSAgICBCSUMgICAgICByMCxyMCwjMwotICAgIEFERCAgICAgIHBjLHBjLHI3LExTTCAjMgotICAgIE5PUAotICAgIEIgICAgICAgIENvcHkwdG9WQWxpZ25lZAotICAgIEIgICAgICAgIENvcHkxdG9WQWxpZ25lZAotICAgIEIgICAgICAgIENvcHkydG9WQWxpZ25lZAotICAgIEIgICAgICAgIENvcHkzdG9WQWxpZ25lZAotQ29weTB0b1ZBbGlnbmVkOgotICAgIExEUiAgICAgIHI3LFtyMF0scjEKLSAgICBTVUJTICAgICByOSxyOSwjMQotICAgIFNUUiAgICAgIHI3LFtyOF0sIzQKLSAgICBCR1QgICAgICBDb3B5MHRvVkFsaWduZWQKLSAgICBCICAgICAgICBDb3B5VkVuZAotQ29weTF0b1ZBbGlnbmVkOgotICAgIExEUiAgICAgIHIxMCxbcjAsIzRdCi0gICAgTERSICAgICAgcjcsW3IwXSxyMQotICAgIFNVQlMgICAgIHI5LHI5LCMxCi0gICAgTFNMICAgICAgcjEwLHIxMCwjMjQKLSAgICBPUlIgICAgICByNyxyMTAscjcsTFNSICM4Ci0gICAgU1RSICAgICAgcjcsW3I4XSwjNAotICAgIEJHVCAgICAgIENvcHkxdG9WQWxpZ25lZAotICAgIEIgICAgICAgIENvcHlWRW5kCi1Db3B5MnRvVkFsaWduZWQ6Ci0gICAgTERSICAgICAgcjEwLFtyMCwjNF0KLSAgICBMRFIgICAgICByNyxbcjBdLHIxCi0gICAgU1VCUyAgICAgcjkscjksIzEKLSAgICBMU0wgICAgICByMTAscjEwLCMxNgotICAgIE9SUiAgICAgIHI3LHIxMCxyNyxMU1IgIzE2Ci0gICAgU1RSICAgICAgcjcsW3I4XSwjNAotICAgIEJHVCAgICAgIENvcHkydG9WQWxpZ25lZAotICAgIEIgICAgICAgIENvcHlWRW5kCi1Db3B5M3RvVkFsaWduZWQ6Ci0gICAgTERSICAgICAgcjEwLFtyMCwjNF0KLSAgICBMRFIgICAgICByNyxbcjBdLHIxCi0gICAgU1VCUyAgICAgcjkscjksIzEKLSAgICBMU0wgICAgICByMTAscjEwLCM4Ci0gICAgT1JSICAgICAgcjcscjEwLHI3LExTUiAjMjQKLSAgICBTVFIgICAgICByNyxbcjhdLCM0Ci0gICAgQkdUICAgICAgQ29weTN0b1ZBbGlnbmVkCi1Db3B5VkVuZDoKLSAgICBTVUIgICAgICByMCxyOCwjMHgxYwotICAgIE1PViAgICAgIHIxLCM0Ci0gICAgQlggICAgICAgbHIKLQotICAgIC5lbmQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weV91bnNhZmVfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weV91bnNhZmVfcy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmEyODkwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHlfdW5zYWZlX3MuUworKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKgotICoKLSAqLwotCi0gICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCi0gICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCi0KLSAgICAuYXJtCi0gICAgLmZwdSBuZW9uCi0gICAgLnRleHQKLQotICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weTR4NF91bnNhZmUKLWFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHk0eDRfdW5zYWZlOgotICAgIFBVU0ggICAgIHtyNC1yNixscn0KLSAgICBBTkQgICAgICByMTIscjAsIzMKLSAgICBCSUMgICAgICByMCxyMCwjMwotICAgIEFERCAgICAgIHBjLHBjLHIxMixMU0wgIzIKLSAgICBOT1AKLSAgICBCICAgICAgICBDb3B5NHg0QWxpZ24wCi0gICAgQiAgICAgICAgQ29weTR4NEFsaWduMQotICAgIEIgICAgICAgIENvcHk0eDRBbGlnbjIKLSAgICBCICAgICAgICBDb3B5NHg0QWxpZ24zCi1Db3B5NHg0QWxpZ24wOgotICAgIExEUiAgICAgIHI0LFtyMF0scjEKLSAgICBMRFIgICAgICByNSxbcjBdLHIxCi0gICAgU1RSICAgICAgcjQsW3IyXSxyMwotICAgIExEUiAgICAgIHI4LFtyMF0scjEKLSAgICBTVFIgICAgICByNSxbcjJdLHIzCi0gICAgTERSICAgICAgcjksW3IwXSxyMQotICAgIFNUUiAgICAgIHI4LFtyMl0scjMKLSAgICBTVFIgICAgICByOSxbcjJdLHIzCi0gICAgQiAgICAgICAgQ29weTR4NEVuZAotQ29weTR4NEFsaWduMToKLSAgICBMRFIgICAgICByNSxbcjAsIzRdCi0gICAgTERSICAgICAgcjQsW3IwXSxyMQotICAgIExEUiAgICAgIHI5LFtyMCwjNF0KLSAgICBMRFIgICAgICByOCxbcjBdLHIxCi0gICAgTFNSICAgICAgcjQscjQsIzgKLSAgICBPUlIgICAgICByNCxyNCxyNSxMU0wgIzI0Ci0gICAgU1RSICAgICAgcjQsW3IyXSxyMwotICAgIExTUiAgICAgIHI4LHI4LCM4Ci0gICAgT1JSICAgICAgcjgscjgscjksTFNMICMyNAotICAgIExEUiAgICAgIHI1LFtyMCwjNF0KLSAgICBMRFIgICAgICByNCxbcjBdLHIxCi0gICAgU1RSICAgICAgcjgsW3IyXSxyMwotICAgIExEUiAgICAgIHI5LFtyMCwjNF0KLSAgICBMRFIgICAgICByOCxbcjBdLHIxCi0gICAgTFNSICAgICAgcjQscjQsIzgKLSAgICBPUlIgICAgICByNCxyNCxyNSxMU0wgIzI0Ci0gICAgU1RSICAgICAgcjQsW3IyXSxyMwotICAgIExTUiAgICAgIHI4LHI4LCM4Ci0gICAgT1JSICAgICAgcjgscjgscjksTFNMICMyNAotICAgIFNUUiAgICAgIHI4LFtyMl0scjMKLSAgICBCICAgICAgICBDb3B5NHg0RW5kCi1Db3B5NHg0QWxpZ24yOgotICAgIExEUiAgICAgIHI1LFtyMCwjNF0KLSAgICBMRFIgICAgICByNCxbcjBdLHIxCi0gICAgTERSICAgICAgcjksW3IwLCM0XQotICAgIExEUiAgICAgIHI4LFtyMF0scjEKLSAgICBMU1IgICAgICByNCxyNCwjMTYKLSAgICBPUlIgICAgICByNCxyNCxyNSxMU0wgIzE2Ci0gICAgU1RSICAgICAgcjQsW3IyXSxyMwotICAgIExTUiAgICAgIHI4LHI4LCMxNgotICAgIE9SUiAgICAgIHI4LHI4LHI5LExTTCAjMTYKLSAgICBTVFIgICAgICByOCxbcjJdLHIzCi0gICAgTERSICAgICAgcjUsW3IwLCM0XQotICAgIExEUiAgICAgIHI0LFtyMF0scjEKLSAgICBMRFIgICAgICByOSxbcjAsIzRdCi0gICAgTERSICAgICAgcjgsW3IwXSxyMQotICAgIExTUiAgICAgIHI0LHI0LCMxNgotICAgIE9SUiAgICAgIHI0LHI0LHI1LExTTCAjMTYKLSAgICBTVFIgICAgICByNCxbcjJdLHIzCi0gICAgTFNSICAgICAgcjgscjgsIzE2Ci0gICAgT1JSICAgICAgcjgscjgscjksTFNMICMxNgotICAgIFNUUiAgICAgIHI4LFtyMl0scjMKLSAgICBCICAgICAgICBDb3B5NHg0RW5kCi1Db3B5NHg0QWxpZ24zOgotICAgIExEUiAgICAgIHI1LFtyMCwjNF0KLSAgICBMRFIgICAgICByNCxbcjBdLHIxCi0gICAgTERSICAgICAgcjksW3IwLCM0XQotICAgIExEUiAgICAgIHI4LFtyMF0scjEKLSAgICBMU1IgICAgICByNCxyNCwjMjQKLSAgICBPUlIgICAgICByNCxyNCxyNSxMU0wgIzgKLSAgICBTVFIgICAgICByNCxbcjJdLHIzCi0gICAgTFNSICAgICAgcjgscjgsIzI0Ci0gICAgT1JSICAgICAgcjgscjgscjksTFNMICM4Ci0gICAgU1RSICAgICAgcjgsW3IyXSxyMwotICAgIExEUiAgICAgIHI1LFtyMCwjNF0KLSAgICBMRFIgICAgICByNCxbcjBdLHIxCi0gICAgTERSICAgICAgcjksW3IwLCM0XQotICAgIExEUiAgICAgIHI4LFtyMF0scjEKLSAgICBMU1IgICAgICByNCxyNCwjMjQKLSAgICBPUlIgICAgICByNCxyNCxyNSxMU0wgIzgKLSAgICBTVFIgICAgICByNCxbcjJdLHIzCi0gICAgTFNSICAgICAgcjgscjgsIzI0Ci0gICAgT1JSICAgICAgcjgscjgscjksTFNMICM4Ci0gICAgU1RSICAgICAgcjgsW3IyXSxyMwotQ29weTR4NEVuZDoKLSAgICBQT1AgICAgICB7cjQtcjYscGN9Ci0KLSAgICAuZW5kCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9EaWFnQ29weV91bnNhZmVfcy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjJjNjc4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLlMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoKLSAqCi0gKi8KLQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQotCi0gICAgLmFybQotICAgIC5mcHUgbmVvbgotICAgIC50ZXh0Ci0KLSAgICAuZ2xvYmFsIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckRpYWdDb3B5X3Vuc2FmZQotYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yRGlhZ0NvcHlfdW5zYWZlOgotICAgIFBVU0ggICAgIHtyNC1yNixscn0KLSAgICBNT1YgICAgICBsciwjNAotICAgIExEUiAgICAgIHI2LCA9MHhmZTAwZmUwCi0gICAgTERSICAgICAgcjEyLCA9MHhmZjAwZmYKLUxvb3BTdGFydDE6Ci0gICAgTERSICAgICAgcjExLFtyMCwjMHhjXQotICAgIExEUiAgICAgIHIxMCxbcjAsIzhdCi0gICAgTERSICAgICAgcjUsW3IwLCM0XQotICAgIExEUiAgICAgIHI0LFtyMF0scjEKLSAgICBVUVNVQjE2ICByMTEscjExLHI2Ci0gICAgVVFTVUIxNiAgcjEwLHIxMCxyNgotICAgIFVRU1VCMTYgIHI1LHI1LHI2Ci0gICAgVVFTVUIxNiAgcjQscjQscjYKLSAgICBVU0FUMTYgICByMTEsIzEzLHIxMQotICAgIFVTQVQxNiAgIHIxMCwjMTMscjEwCi0gICAgVVNBVDE2ICAgcjUsIzEzLHI1Ci0gICAgVVNBVDE2ICAgcjQsIzEzLHI0Ci0gICAgQU5EICAgICAgcjExLHIxMixyMTEsTFNSICM1Ci0gICAgQU5EICAgICAgcjEwLHIxMixyMTAsTFNSICM1Ci0gICAgQU5EICAgICAgcjUscjEyLHI1LExTUiAjNQotICAgIEFORCAgICAgIHI0LHIxMixyNCxMU1IgIzUKLSAgICBPUlIgICAgICByMTEscjEwLHIxMSxMU0wgIzgKLSAgICBPUlIgICAgICByMTAscjQscjUsTFNMICM4Ci0gICAgU1VCUyAgICAgbHIsbHIsIzEKLSAgICBTVFJEICAgICByMTAscjExLFtyN10sIzgKLSAgICBCR1QgICAgICBMb29wU3RhcnQxCi0gICAgU1VCICAgICAgcjAscjcsIzB4MjAKLSAgICBNT1YgICAgICByMSwjOAotICAgIFBPUCAgICAgIHtyNC1yNixwY30KLQotICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyRGlhZ0NvcHlfdW5zYWZlCi1hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJEaWFnQ29weV91bnNhZmU6Ci0gICAgUFVTSCAgICAge3I0LXI2LGxyfQotICAgIExEUiAgICAgIHI2LCA9MHhmZTAwZmUwCi0gICAgTERSICAgICAgcjEyLCA9MHhmZjAwZmYKLSAgICBNT1YgICAgICBsciwjMgotTG9vcFN0YXJ0OgotICAgIExEUiAgICAgIHIxMSxbcjAsIzB4Y10KLSAgICBMRFIgICAgICByMTAsW3IwLCM4XQotICAgIExEUiAgICAgIHI1LFtyMCwjNF0KLSAgICBMRFIgICAgICByNCxbcjBdLHIxCi0gICAgVVFTVUIxNiAgcjExLHIxMSxyNgotICAgIFVRU1VCMTYgIHIxMCxyMTAscjYKLSAgICBVUVNVQjE2ICByNSxyNSxyNgotICAgIFVRU1VCMTYgIHI0LHI0LHI2Ci0gICAgVVNBVDE2ICAgcjExLCMxMyxyMTEKLSAgICBVU0FUMTYgICByMTAsIzEzLHIxMAotICAgIFVTQVQxNiAgIHI1LCMxMyxyNQotICAgIFVTQVQxNiAgIHI0LCMxMyxyNAotICAgIEFORCAgICAgIHIxMSxyMTIscjExLExTUiAjNQotICAgIEFORCAgICAgIHIxMCxyMTIscjEwLExTUiAjNQotICAgIEFORCAgICAgIHI1LHIxMixyNSxMU1IgIzUKLSAgICBBTkQgICAgICByNCxyMTIscjQsTFNSICM1Ci0gICAgT1JSICAgICAgcjExLHIxMCxyMTEsTFNMICM4Ci0gICAgT1JSICAgICAgcjEwLHI0LHI1LExTTCAjOAotICAgIFBLSEJUICAgIHI0LHIxMCxyMTEsTFNMICMxNgotICAgIFNUUiAgICAgIHI0LFtyN10sIzgKLSAgICBQS0hUQiAgICByNSxyMTEscjEwLEFTUiAjMTYKLSAgICBTVFIgICAgICByNSxbcjddLCMtNAotICAgIExEUiAgICAgIHIxMSxbcjAsIzB4Y10KLSAgICBMRFIgICAgICByMTAsW3IwLCM4XQotICAgIExEUiAgICAgIHI1LFtyMCwjNF0KLSAgICBMRFIgICAgICByNCxbcjBdLHIxCi0gICAgVVFTVUIxNiAgcjExLHIxMSxyNgotICAgIFVRU1VCMTYgIHIxMCxyMTAscjYKLSAgICBVUVNVQjE2ICByNSxyNSxyNgotICAgIFVRU1VCMTYgIHI0LHI0LHI2Ci0gICAgVVNBVDE2ICAgcjExLCMxMyxyMTEKLSAgICBVU0FUMTYgICByMTAsIzEzLHIxMAotICAgIFVTQVQxNiAgIHI1LCMxMyxyNQotICAgIFVTQVQxNiAgIHI0LCMxMyxyNAotICAgIEFORCAgICAgIHIxMSxyMTIscjExLExTUiAjNQotICAgIEFORCAgICAgIHIxMCxyMTIscjEwLExTUiAjNQotICAgIEFORCAgICAgIHI1LHIxMixyNSxMU1IgIzUKLSAgICBBTkQgICAgICByNCxyMTIscjQsTFNSICM1Ci0gICAgT1JSICAgICAgcjExLHIxMCxyMTEsTFNMICM4Ci0gICAgT1JSICAgICAgcjEwLHI0LHI1LExTTCAjOAotICAgIFBLSEJUICAgIHI0LHIxMCxyMTEsTFNMICMxNgotICAgIFNVQlMgICAgIGxyLGxyLCMxCi0gICAgU1RSICAgICAgcjQsW3I3XSwjOAotICAgIFBLSFRCICAgIHI1LHIxMSxyMTAsQVNSICMxNgotICAgIFNUUiAgICAgIHI1LFtyN10sIzQKLSAgICBCR1QgICAgICBMb29wU3RhcnQKLSAgICBTVUIgICAgICByMCxyNywjMHgxOAotICAgIE1PViAgICAgIHIxLCM0Ci0gICAgUE9QICAgICAge3I0LXI2LHBjfQotCi0gICAgLmVuZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmVfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdhYTkyNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmVfcy5TCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qCi0gKgotICovCi0KLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKLQotICAgIC5hcm0KLSAgICAuZnB1IG5lb24KLSAgICAudGV4dAotCi0gICAgLmdsb2JhbCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKLWFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZToKLSAgICBQVVNIICAgICB7cjQtcjEyLGxyfQotICAgIFZMRDEuOCAgIHtkMCxkMX0sW3IwXSxyMQotICAgIFZNT1YuSTE2IGQzMSwjMHgxNAotICAgIFZNT1YuSTE2IGQzMCwjMHg1Ci0gICAgVkVYVC44ICAgZDQsZDAsZDEsIzEKLSAgICBWRVhULjggICBkMixkMCxkMSwjMgotICAgIFZFWFQuOCAgIGQzLGQwLGQxLCMzCi0gICAgVkVYVC44ICAgZDUsZDAsZDEsIzQKLSAgICBWRVhULjggICBkMSxkMCxkMSwjNQotICAgIFZBRERMLlU4IHExLGQyLGQzCi0gICAgVkFEREwuVTggcTIsZDQsZDUKLSAgICBWQURETC5VOCBxNSxkMCxkMQotICAgIFZMRDEuOCAgIHtkMCxkMX0sW3IwXSxyMQotICAgIFZNTEEuSTE2IGQxMCxkMixkMzEKLSAgICBWTVVMLkkxNiBkOCxkNCxkMzAKLSAgICBWRVhULjggICBkNCxkMCxkMSwjMQotICAgIFZFWFQuOCAgIGQyLGQwLGQxLCMyCi0gICAgVkVYVC44ICAgZDMsZDAsZDEsIzMKLSAgICBWRVhULjggICBkNSxkMCxkMSwjNAotICAgIFZFWFQuOCAgIGQxLGQwLGQxLCM1Ci0gICAgVkFEREwuVTggcTEsZDIsZDMKLSAgICBWQURETC5VOCBxMixkNCxkNQotICAgIFZBRERMLlU4IHE2LGQwLGQxCi0gICAgVkxEMS44ICAge2QwLGQxfSxbcjBdLHIxCi0gICAgVlNVQi5JMTYgZDEwLGQxMCxkOAotICAgIFZNTEEuSTE2IGQxMixkMixkMzEKLSAgICBWTVVMLkkxNiBkOCxkNCxkMzAKLSAgICBWRVhULjggICBkNCxkMCxkMSwjMQotICAgIFZFWFQuOCAgIGQyLGQwLGQxLCMyCi0gICAgVkVYVC44ICAgZDMsZDAsZDEsIzMKLSAgICBWRVhULjggICBkNSxkMCxkMSwjNAotICAgIFZFWFQuOCAgIGQxLGQwLGQxLCM1Ci0gICAgVkFEREwuVTggcTEsZDIsZDMKLSAgICBWQURETC5VOCBxMixkNCxkNQotICAgIFZBRERMLlU4IHE3LGQwLGQxCi0gICAgVkxEMS44ICAge2QwLGQxfSxbcjBdLHIxCi0gICAgVlNVQi5JMTYgZDEyLGQxMixkOAotICAgIFZNTEEuSTE2IGQxNCxkMixkMzEKLSAgICBWTVVMLkkxNiBkOCxkNCxkMzAKLSAgICBWRVhULjggICBkNCxkMCxkMSwjMQotICAgIFZFWFQuOCAgIGQyLGQwLGQxLCMyCi0gICAgVkVYVC44ICAgZDMsZDAsZDEsIzMKLSAgICBWRVhULjggICBkNSxkMCxkMSwjNAotICAgIFZFWFQuOCAgIGQxLGQwLGQxLCM1Ci0gICAgVkFEREwuVTggcTEsZDIsZDMKLSAgICBWQURETC5VOCBxMixkNCxkNQotICAgIFZBRERMLlU4IHE4LGQwLGQxCi0gICAgVkxEMS44ICAge2QwLGQxfSxbcjBdLHIxCi0gICAgVlNVQi5JMTYgZDE0LGQxNCxkOAotICAgIFZNTEEuSTE2IGQxNixkMixkMzEKLSAgICBWTVVMLkkxNiBkOCxkNCxkMzAKLSAgICBWRVhULjggICBkNCxkMCxkMSwjMQotICAgIFZFWFQuOCAgIGQyLGQwLGQxLCMyCi0gICAgVkVYVC44ICAgZDMsZDAsZDEsIzMKLSAgICBWRVhULjggICBkNSxkMCxkMSwjNAotICAgIFZFWFQuOCAgIGQxLGQwLGQxLCM1Ci0gICAgVkFEREwuVTggcTEsZDIsZDMKLSAgICBWQURETC5VOCBxMixkNCxkNQotICAgIFZBRERMLlU4IHE5LGQwLGQxCi0gICAgVkxEMS44ICAge2QwLGQxfSxbcjBdLHIxCi0gICAgVlNVQi5JMTYgZDE2LGQxNixkOAotICAgIFZNTEEuSTE2IGQxOCxkMixkMzEKLSAgICBWTVVMLkkxNiBkOCxkNCxkMzAKLSAgICBWRVhULjggICBkNCxkMCxkMSwjMQotICAgIFZFWFQuOCAgIGQyLGQwLGQxLCMyCi0gICAgVkVYVC44ICAgZDMsZDAsZDEsIzMKLSAgICBWRVhULjggICBkNSxkMCxkMSwjNAotICAgIFZFWFQuOCAgIGQxLGQwLGQxLCM1Ci0gICAgVkFEREwuVTggcTEsZDIsZDMKLSAgICBWQURETC5VOCBxMixkNCxkNQotICAgIFZBRERMLlU4IHExMCxkMCxkMQotICAgIFZMRDEuOCAgIHtkMCxkMX0sW3IwXSxyMQotICAgIFZTVUIuSTE2IGQxOCxkMTgsZDgKLSAgICBWTUxBLkkxNiBkMjAsZDIsZDMxCi0gICAgVk1VTC5JMTYgZDgsZDQsZDMwCi0gICAgVkVYVC44ICAgZDQsZDAsZDEsIzEKLSAgICBWRVhULjggICBkMixkMCxkMSwjMgotICAgIFZFWFQuOCAgIGQzLGQwLGQxLCMzCi0gICAgVkVYVC44ICAgZDUsZDAsZDEsIzQKLSAgICBWRVhULjggICBkMSxkMCxkMSwjNQotICAgIFZBRERMLlU4IHExLGQyLGQzCi0gICAgVkFEREwuVTggcTIsZDQsZDUKLSAgICBWQURETC5VOCBxMTEsZDAsZDEKLSAgICBWTEQxLjggICB7ZDAsZDF9LFtyMF0scjEKLSAgICBWU1VCLkkxNiBkMjAsZDIwLGQ4Ci0gICAgVk1MQS5JMTYgZDIyLGQyLGQzMQotICAgIFZNVUwuSTE2IGQ4LGQ0LGQzMAotICAgIFZFWFQuOCAgIGQ0LGQwLGQxLCMxCi0gICAgVkVYVC44ICAgZDIsZDAsZDEsIzIKLSAgICBWRVhULjggICBkMyxkMCxkMSwjMwotICAgIFZFWFQuOCAgIGQ1LGQwLGQxLCM0Ci0gICAgVkVYVC44ICAgZDEsZDAsZDEsIzUKLSAgICBWQURETC5VOCBxMSxkMixkMwotICAgIFZBRERMLlU4IHEyLGQ0LGQ1Ci0gICAgVkFEREwuVTggcTEyLGQwLGQxCi0gICAgVkxEMS44ICAge2QwLGQxfSxbcjBdLHIxCi0gICAgVlNVQi5JMTYgZDIyLGQyMixkOAotICAgIFZNTEEuSTE2IGQyNCxkMixkMzEKLSAgICBWTVVMLkkxNiBkOCxkNCxkMzAKLSAgICBWRVhULjggICBkNCxkMCxkMSwjMQotICAgIFZFWFQuOCAgIGQyLGQwLGQxLCMyCi0gICAgVkVYVC44ICAgZDMsZDAsZDEsIzMKLSAgICBWRVhULjggICBkNSxkMCxkMSwjNAotICAgIFZFWFQuOCAgIGQxLGQwLGQxLCM1Ci0gICAgVkFEREwuVTggcTEsZDIsZDMKLSAgICBWQURETC5VOCBxMixkNCxkNQotICAgIFZBRERMLlU4IHExMyxkMCxkMQotICAgIFZTVUIuSTE2IGQyNCxkMjQsZDgKLSAgICBWTUxBLkkxNiBkMjYsZDIsZDMxCi0gICAgVk1VTC5JMTYgZDgsZDQsZDMwCi0gICAgVk1PVi5JMzIgcTE1LCMweDE0Ci0gICAgVk1PVi5JMzIgcTE0LCMweDUKLSAgICBWQURETC5TMTYgcTUsZDEwLGQyMAotICAgIFZBRERMLlMxNiBxMSxkMTQsZDE2Ci0gICAgVkFEREwuUzE2IHEwLGQxMixkMTgKLSAgICBWU1VCLkkxNiBkMjYsZDI2LGQ4Ci0gICAgVk1MQS5JMzIgcTUscTEscTE1Ci0gICAgVk1VTC5JMzIgcTQscTAscTE0Ci0gICAgVkFEREwuUzE2IHE2LGQxMixkMjIKLSAgICBWQURETC5TMTYgcTEsZDE2LGQxOAotICAgIFZBRERMLlMxNiBxMCxkMTQsZDIwCi0gICAgVk1MQS5JMzIgcTYscTEscTE1Ci0gICAgVlNVQi5JMzIgcTUscTUscTQKLSAgICBWTVVMLkkzMiBxNCxxMCxxMTQKLSAgICBWQURETC5TMTYgcTIsZDE0LGQyNAotICAgIFZBRERMLlMxNiBxMSxkMTgsZDIwCi0gICAgVkFEREwuUzE2IHEwLGQxNixkMjIKLSAgICBWTUxBLkkzMiBxMixxMSxxMTUKLSAgICBWU1VCLkkzMiBxNixxNixxNAotICAgIFZNVUwuSTMyIHE0LHEwLHExNAotICAgIFZBRERMLlMxNiBxMyxkMTYsZDI2Ci0gICAgVkFEREwuUzE2IHExLGQyMCxkMjIKLSAgICBWQURETC5TMTYgcTAsZDE4LGQyNAotICAgIFZNTEEuSTMyIHEzLHExLHExNQotICAgIFZTVUIuSTMyIHEyLHEyLHE0Ci0gICAgVk1MUy5JMzIgcTMscTAscTE0Ci0gICAgVlFSU0hSVU4uUzMyIGQwLHE1LCMxMAotICAgIFZRUlNIUlVOLlMzMiBkMixxNiwjMTAKLSAgICBWUVJTSFJVTi5TMzIgZDQscTIsIzEwCi0gICAgVlFSU0hSVU4uUzMyIGQ2LHEzLCMxMAotICAgIFZRTU9WTi5VMTYgZDAscTAKLSAgICBWUU1PVk4uVTE2IGQyLHExCi0gICAgVlFNT1ZOLlUxNiBkNCxxMgotICAgIFZRTU9WTi5VMTYgZDYscTMKLSAgICBQT1AgICAgICB7cjQtcjEyLHBjfQotCi0gICAgLmVuZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmVfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVmN2YxYy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmVfcy5TCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qCi0gKgotICovCi0KLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKLQotICAgIC5hcm0KLSAgICAuZnB1IG5lb24KLSAgICAudGV4dAotCi0gICAgLmdsb2JhbCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKLWFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZToKLSAgICBQVVNIICAgICB7cjQtcjEyLGxyfQotICAgIFZMRDEuOCAgIHtkMCxkMX0sW3IwXSxyMQotICAgIEFERCAgICAgIHIxMixyMCxyMSxMU0wgIzIKLSAgICBWTU9WLkk4ICBkMzAsIzB4NQotICAgIFZNT1YuSTggIGQzMSwjMHgxNAotICAgIFZMRDEuOCAgIHtkMTAsZDExfSxbcjEyXSxyMQotICAgIFZMRDEuOCAgIHtkMixkM30sW3IwXSxyMQotICAgIFZMRDEuOCAgIHtkMTIsZDEzfSxbcjEyXSxyMQotICAgIFZBRERMLlU4IHE5LGQwLGQxMAotICAgIFZMRDEuOCAgIHtkNCxkNX0sW3IwXSxyMQotICAgIFZBRERMLlU4IHEwLGQxLGQxMQotICAgIFZMRDEuOCAgIHtkNixkN30sW3IwXSxyMQotICAgIFZBRERMLlU4IHExMCxkMixkMTIKLSAgICBWTEQxLjggICB7ZDgsZDl9LFtyMF0scjEKLSAgICBWTUxBTC5VOCBxOSxkNCxkMzEKLSAgICBWTEQxLjggICB7ZDE0LGQxNX0sW3IxMl0scjEKLSAgICBWTUxBTC5VOCBxMCxkNSxkMzEKLSAgICBWTEQxLjggICB7ZDE2LGQxN30sW3IxMl0scjEKLSAgICBWTUxBTC5VOCBxOSxkNixkMzEKLSAgICBWTUxBTC5VOCBxMTAsZDYsZDMxCi0gICAgVk1MU0wuVTggcTAsZDMsZDMwCi0gICAgVkFEREwuVTggcTExLGQ0LGQxNAotICAgIFZNTFNMLlU4IHE5LGQyLGQzMAotICAgIFZBRERMLlU4IHExLGQzLGQxMwotICAgIFZNTEFMLlU4IHEwLGQ3LGQzMQotICAgIFZNTEFMLlU4IHExMCxkOCxkMzEKLSAgICBWTUxTTC5VOCBxOSxkOCxkMzAKLSAgICBWTUxBTC5VOCBxMSxkNyxkMzEKLSAgICBWTUxTTC5VOCBxMCxkOSxkMzAKLSAgICBWTUxBTC5VOCBxMTEsZDgsZDMxCi0gICAgVk1MU0wuVTggcTEwLGQ0LGQzMAotICAgIFZNTFNMLlU4IHExLGQ1LGQzMAotICAgIFZBRERMLlU4IHEyLGQ1LGQxNQotICAgIFZNTEFMLlU4IHExMSxkMTAsZDMxCi0gICAgVk1MU0wuVTggcTEwLGQxMCxkMzAKLSAgICBWTUxBTC5VOCBxMSxkOSxkMzEKLSAgICBWTUxBTC5VOCBxMixkOSxkMzEKLSAgICBWQURETC5VOCBxMTIsZDYsZDE2Ci0gICAgVk1MU0wuVTggcTExLGQ2LGQzMAotICAgIFZNTFNMLlU4IHExLGQxMSxkMzAKLSAgICBWTUxTTC5VOCBxMixkNyxkMzAKLSAgICBWQURETC5VOCBxMyxkNyxkMTcKLSAgICBWTUxBTC5VOCBxMTIsZDEwLGQzMQotICAgIFZNTFNMLlU4IHExMSxkMTIsZDMwCi0gICAgVk1MU0wuVTggcTIsZDEzLGQzMAotICAgIFZNTEFMLlU4IHEzLGQxMSxkMzEKLSAgICBWTUxBTC5VOCBxMTIsZDEyLGQzMQotICAgIFZFWFQuOCAgIGQyNixkMTgsZDE5LCMyCi0gICAgVk1MQUwuVTggcTIsZDExLGQzMQotICAgIFZNTEFMLlU4IHEzLGQxMyxkMzEKLSAgICBWTUxTTC5VOCBxMTIsZDgsZDMwCi0gICAgVkVYVC44ICAgZDI3LGQxOCxkMTksIzQKLSAgICBWTU9WLkkxNiBkMzEsIzB4MTQKLSAgICBWTUxTTC5VOCBxMyxkOSxkMzAKLSAgICBWTUxTTC5VOCBxMTIsZDE0LGQzMAotICAgIFZFWFQuOCAgIGQyOSxkMTksZDAsIzIKLSAgICBWRVhULjggICBkMjgsZDE4LGQxOSwjNgotICAgIFZNTFNMLlU4IHEzLGQxNSxkMzAKLSAgICBWQURETC5TMTYgcTAsZDE4LGQyOQotICAgIFZBREQuSTE2IGQyNyxkMjcsZDI4Ci0gICAgVk1PVi5JMTYgZDMwLCMweDUKLSAgICBWQURELkkxNiBkMjYsZDI2LGQxOQotICAgIFZNTEFMLlMxNiBxMCxkMjcsZDMxCi0gICAgVkVYVC44ICAgZDI3LGQyMCxkMjEsIzQKLSAgICBWRVhULjggICBkMjgsZDIwLGQyMSwjNgotICAgIFZFWFQuOCAgIGQyOSxkMjEsZDIsIzIKLSAgICBWTUxTTC5TMTYgcTAsZDI2LGQzMAotICAgIFZFWFQuOCAgIGQyNixkMjAsZDIxLCMyCi0gICAgVkFEREwuUzE2IHExLGQyMCxkMjkKLSAgICBWQURELkkxNiBkMjcsZDI3LGQyOAotICAgIFZBREQuSTE2IGQyNixkMjYsZDIxCi0gICAgVkVYVC44ICAgZDI4LGQyMixkMjMsIzYKLSAgICBWTUxBTC5TMTYgcTEsZDI3LGQzMQotICAgIFZFWFQuOCAgIGQyOSxkMjMsZDQsIzIKLSAgICBWRVhULjggICBkMjcsZDIyLGQyMywjNAotICAgIFZFWFQuOCAgIGQ4LGQyMixkMjMsIzIKLSAgICBWQURETC5TMTYgcTIsZDIyLGQyOQotICAgIFZNTFNMLlMxNiBxMSxkMjYsZDMwCi0gICAgVkFERC5JMTYgZDI3LGQyNyxkMjgKLSAgICBWQURELkkxNiBkMjYsZDgsZDIzCi0gICAgVkVYVC44ICAgZDI4LGQyNCxkMjUsIzYKLSAgICBWTUxBTC5TMTYgcTIsZDI3LGQzMQotICAgIFZFWFQuOCAgIGQyNyxkMjQsZDI1LCM0Ci0gICAgVkVYVC44ICAgZDI5LGQyNSxkNiwjMgotICAgIFZBREQuSTE2IGQyNyxkMjcsZDI4Ci0gICAgVkVYVC44ICAgZDgsZDI0LGQyNSwjMgotICAgIFZBRERMLlMxNiBxMyxkMjQsZDI5Ci0gICAgVk1MU0wuUzE2IHEyLGQyNixkMzAKLSAgICBWTUxBTC5TMTYgcTMsZDI3LGQzMQotICAgIFZBREQuSTE2IGQ4LGQ4LGQyNQotICAgIFZNTFNMLlMxNiBxMyxkOCxkMzAKLSAgICBWUVJTSFJVTi5TMzIgZDAscTAsIzEwCi0gICAgVlFSU0hSVU4uUzMyIGQyLHExLCMxMAotICAgIFZRUlNIUlVOLlMzMiBkNCxxMiwjMTAKLSAgICBWUVJTSFJVTi5TMzIgZDYscTMsIzEwCi0gICAgVlFNT1ZOLlUxNiBkMCxxMAotICAgIFZRTU9WTi5VMTYgZDIscTEKLSAgICBWUU1PVk4uVTE2IGQ0LHEyCi0gICAgVlFNT1ZOLlUxNiBkNixxMwotICAgIFBPUCAgICAgIHtyNC1yMTIscGN9Ci0KLSAgICAuZW5kCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkzZDM4NS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZV9zLlMKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKgotICoKLSAqLwotCi0gICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCi0gICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCi0KLSAgICAuYXJtCi0gICAgLmZwdSBuZW9uCi0gICAgLnRleHQKLQotICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKLWFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlOgotICAgIFBVU0ggICAgIHtyNC1yMTIsbHJ9Ci0gICAgVkxEMS44ICAge2QyMixkMjN9LFtyMF0scjEKLSAgICBWRVhULjggICBkMTAsZDIyLGQyMywjNQotICAgIFZFWFQuOCAgIGQxMixkMjIsZDIzLCMxCi0gICAgVkVYVC44ICAgZDE0LGQyMixkMjMsIzIKLSAgICBWRVhULjggICBkMTUsZDIyLGQyMywjMwotICAgIFZFWFQuOCAgIGQxMyxkMjIsZDIzLCM0Ci0gICAgVkFEREwuVTggcTExLGQyMixkMTAKLSAgICBWQURETC5VOCBxNCxkMTQsZDE1Ci0gICAgVkFEREwuVTggcTYsZDEyLGQxMwotICAgIFZMRDEuOCAgIHtkMjQsZDI1fSxbcjBdLHIxCi0gICAgVk1MQS5JMTYgZDIyLGQ4LGQzMQotICAgIFZNVUwuSTE2IGQ4LGQxMixkMzAKLSAgICBWRVhULjggICBkMTAsZDI0LGQyNSwjNQotICAgIFZFWFQuOCAgIGQxMixkMjQsZDI1LCMxCi0gICAgVkVYVC44ICAgZDE2LGQyNCxkMjUsIzIKLSAgICBWRVhULjggICBkMTcsZDI0LGQyNSwjMwotICAgIFZFWFQuOCAgIGQxMyxkMjQsZDI1LCM0Ci0gICAgVkFEREwuVTggcTEyLGQyNCxkMTAKLSAgICBWU1VCLkkxNiBkMjIsZDIyLGQ4Ci0gICAgVkFEREwuVTggcTQsZDE2LGQxNwotICAgIFZBRERMLlU4IHE2LGQxMixkMTMKLSAgICBWTEQxLjggICB7ZDI2LGQyN30sW3IwXSxyMQotICAgIFZNTEEuSTE2IGQyNCxkOCxkMzEKLSAgICBWTVVMLkkxNiBkOCxkMTIsZDMwCi0gICAgVkVYVC44ICAgZDEwLGQyNixkMjcsIzUKLSAgICBWRVhULjggICBkMTIsZDI2LGQyNywjMQotICAgIFZFWFQuOCAgIGQxOCxkMjYsZDI3LCMyCi0gICAgVkVYVC44ICAgZDE5LGQyNixkMjcsIzMKLSAgICBWRVhULjggICBkMTMsZDI2LGQyNywjNAotICAgIFZBRERMLlU4IHExMyxkMjYsZDEwCi0gICAgVlNVQi5JMTYgZDI0LGQyNCxkOAotICAgIFZBRERMLlU4IHE0LGQxOCxkMTkKLSAgICBWQURETC5VOCBxNixkMTIsZDEzCi0gICAgVkxEMS44ICAge2QyOCxkMjl9LFtyMF0scjEKLSAgICBWTUxBLkkxNiBkMjYsZDgsZDMxCi0gICAgVk1VTC5JMTYgZDgsZDEyLGQzMAotICAgIFZFWFQuOCAgIGQxMCxkMjgsZDI5LCM1Ci0gICAgVkVYVC44ICAgZDEyLGQyOCxkMjksIzEKLSAgICBWRVhULjggICBkMjAsZDI4LGQyOSwjMgotICAgIFZFWFQuOCAgIGQyMSxkMjgsZDI5LCMzCi0gICAgVkVYVC44ICAgZDEzLGQyOCxkMjksIzQKLSAgICBWQURETC5VOCBxMTQsZDI4LGQxMAotICAgIFZTVUIuSTE2IGQyNixkMjYsZDgKLSAgICBWQURETC5VOCBxNCxkMjAsZDIxCi0gICAgVkFEREwuVTggcTYsZDEyLGQxMwotICAgIFZNTEEuSTE2IGQyOCxkOCxkMzEKLSAgICBWTUxTLkkxNiBkMjgsZDEyLGQzMAotICAgIFZRUlNIUlVOLlMxNiBkMjIscTExLCM1Ci0gICAgVlFSU0hSVU4uUzE2IGQyNCxxMTIsIzUKLSAgICBWUVJTSFJVTi5TMTYgZDI2LHExMywjNQotICAgIFZRUlNIUlVOLlMxNiBkMjgscTE0LCM1Ci0gICAgUE9QICAgICAge3I0LXIxMixwY30KLQotICAgIC5lbmQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OThlN2I1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlX3MuUworKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qCi0gKgotICovCi0KLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKLQotICAgIC5hcm0KLSAgICAuZnB1IG5lb24KLSAgICAudGV4dAotCi0gICAgLmdsb2JhbCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQotYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmU6Ci0gICAgUFVTSCAgICAge3I0LXIxMixscn0KLSAgICBWTEQxLjggICB7ZDd9LFtyMF0scjEKLSAgICBBREQgICAgICByMTIscjAscjEsTFNMICMyCi0gICAgVkxEMS44ICAge2Q4fSxbcjBdLHIxCi0gICAgVkxEMS44ICAge2QxMn0sW3IxMl0scjEKLSAgICBWTEQxLjggICB7ZDl9LFtyMF0scjEKLSAgICBWQURETC5VOCBxMCxkNyxkMTIKLSAgICBWTEQxLjggICB7ZDEwfSxbcjBdLHIxCi0gICAgVkxEMS44ICAge2QxM30sW3IxMl0scjEKLSAgICBWTEQxLjggICB7ZDExfSxbcjBdLHIxCi0gICAgVkxEMS44ICAge2QxNH0sW3IxMl0scjEKLSAgICBWQURETC5VOCBxOCxkOCxkMTEKLSAgICBWQURETC5VOCBxOSxkOSxkMTAKLSAgICBWTEQxLjggICB7ZDE1fSxbcjEyXSxyMQotICAgIFZNTFMuSTE2IGQwLGQxNixkMzAKLSAgICBWTVVMLkkxNiBkMjAsZDE4LGQzMQotICAgIFZBRERMLlU4IHE4LGQ5LGQxMgotICAgIFZBRERMLlU4IHE5LGQxMCxkMTEKLSAgICBWQURETC5VOCBxMSxkOCxkMTMKLSAgICBWTUxTLkkxNiBkMixkMTYsZDMwCi0gICAgVk1VTC5JMTYgZDIxLGQxOCxkMzEKLSAgICBWQURETC5VOCBxOCxkMTAsZDEzCi0gICAgVkFEREwuVTggcTksZDExLGQxMgotICAgIFZBRERMLlU4IHEyLGQ5LGQxNAotICAgIFZNTFMuSTE2IGQ0LGQxNixkMzAKLSAgICBWTVVMLkkxNiBkMjIsZDE4LGQzMQotICAgIFZBRERMLlU4IHE4LGQxMSxkMTQKLSAgICBWQURETC5VOCBxMyxkMTAsZDE1Ci0gICAgVkFEREwuVTggcTksZDEyLGQxMwotICAgIFZNTFMuSTE2IGQ2LGQxNixkMzAKLSAgICBWQURELkkxNiBkMCxkMCxkMjAKLSAgICBWQURELkkxNiBkMixkMixkMjEKLSAgICBWQURELkkxNiBkNCxkNCxkMjIKLSAgICBWTUxBLkkxNiBkNixkMTgsZDMxCi0gICAgVlFSU0hSVU4uUzE2IGQwLHEwLCM1Ci0gICAgVlFSU0hSVU4uUzE2IGQyLHExLCM1Ci0gICAgVlFSU0hSVU4uUzE2IGQ0LHEyLCM1Ci0gICAgVlFSU0hSVU4uUzE2IGQ2LHEzLCM1Ci0gICAgUE9QICAgICAge3I0LXIxMixwY30KLQotICAgIC5lbmQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDY5NTE2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MuUworKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKgotICoKLSAqLwotCi0gICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCi0gICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCi0KLSAgICAuYXJtCi0gICAgLmZwdSBuZW9uCi0KLSAgICAudGV4dAotICAgIC5hbGlnbiA0Ci0KLWFybVZDTTRQMTBfV2lkdGhCcmFuY2hUYWJsZU1WSXNOb3RaZXJvOgotICAgIC53b3JkICAgV2lkdGhJczJNVklzTm90WmVyby0oUDArOCksIFdpZHRoSXMyTVZJc05vdFplcm8tKFAwKzgpCi0gICAgLndvcmQgICBXaWR0aElzNE1WSXNOb3RaZXJvLShQMCs4KSwgV2lkdGhJczRNVklzTm90WmVyby0oUDArOCkKLSAgICAud29yZCAgIFdpZHRoSXM4TVZJc05vdFplcm8tKFAwKzgpCi0KLWFybVZDTTRQMTBfV2lkdGhCcmFuY2hUYWJsZU1WSXNaZXJvOgotICAgIC53b3JkICAgV2lkdGhJczJNVklzWmVyby0oUDArOCksIFdpZHRoSXMyTVZJc1plcm8tKFAwKzgpCi0gICAgLndvcmQgICBXaWR0aElzNE1WSXNaZXJvLShQMCs4KSwgV2lkdGhJczRNVklzWmVyby0oUDArOCkKLSAgICAud29yZCAgIFdpZHRoSXM4TVZJc1plcm8tKFAwKzgpCi0KLSAgICAuZ2xvYmFsIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hCi1hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYToKLSAgICBQVVNIICAgICB7cjQtcjEyLGxyfQotICAgIFZQVVNIICAgIHtkOC1kMTV9Ci0gICAgTERSRCAgICAgcjYscjcsW3NwLCMweDcwXQotICAgIExEUkQgICAgIHI0LHI1LFtzcCwjMHg2OF0KLSAgICBSU0IgICAgICByOCxyNiwjOAotICAgIFJTQiAgICAgIHI5LHI3LCM4Ci0gICAgQ01OICAgICAgcjYscjcKLSAgICBNT1YgICAgICByMTAsIzEKLSAgICBBRFJFUSAgICByMTEsIGFybVZDTTRQMTBfV2lkdGhCcmFuY2hUYWJsZU1WSXNaZXJvCi0gICAgU1VCICAgICAgbHIscjEscjEwCi0gICAgQURSTkUgICAgcjExLCBhcm1WQ000UDEwX1dpZHRoQnJhbmNoVGFibGVNVklzTm90WmVybwotICAgIFZMRDEuOCAgIHtkMH0sW3IwXSxyMTAKLSAgICBTTVVMQkIgICByMTIscjgscjkKLSAgICBTTVVMQkIgICByOSxyNixyOQotICAgIFZMRDEuOCAgIHtkMX0sW3IwXSxscgotICAgIFNNVUxCQiAgIHI4LHI4LHI3Ci0gICAgU01VTEJCICAgcjYscjYscjcKLSAgICBWRFVQLjggICBkMTIscjEyCi0gICAgVkRVUC44ICAgZDEzLHI5Ci0gICAgVkRVUC44ICAgZDE0LHI4Ci0gICAgVkRVUC44ICAgZDE1LHI2Ci0gICAgTERSICAgICAgcjExLFtyMTEsIHI0LCBsc2wgIzFdCi1QMDogQUREICAgICAgcGMscjExCi0KLVdpZHRoSXM4TVZJc05vdFplcm86Ci0gICAgVkxEMS44ICAge2QyfSxbcjBdLHIxMAotICAgIFZNVUxMLlU4IHEyLGQwLGQxMgotICAgIFZMRDEuOCAgIHtkM30sW3IwXSxscgotICAgIFZNVUxMLlU4IHEzLGQyLGQxMgotICAgIFZMRDEuOCAgIHtkMTZ9LFtyMF0scjEwCi0gICAgVk1MQUwuVTggcTIsZDEsZDEzCi0gICAgVkxEMS44ICAge2QxN30sW3IwXSxscgotICAgIFZNVUxMLlU4IHExMSxkMTYsZDEyCi0gICAgVk1MQUwuVTggcTMsZDMsZDEzCi0gICAgVkxEMS44ICAge2QxOH0sW3IwXSxyMTAKLSAgICBWTUxBTC5VOCBxMixkMixkMTQKLSAgICBWTUxBTC5VOCBxMTEsZDE3LGQxMwotICAgIFZNVUxMLlU4IHExMixkMTgsZDEyCi0gICAgVkxEMS44ICAge2QxOX0sW3IwXSxscgotICAgIFZNTEFMLlU4IHEzLGQxNixkMTQKLSAgICBWTEQxLjggICB7ZDB9LFtyMF0scjEwCi0gICAgVk1MQUwuVTggcTEyLGQxOSxkMTMKLSAgICBWTUxBTC5VOCBxMTEsZDE4LGQxNAotICAgIFZNTEFMLlU4IHEyLGQzLGQxNQotICAgIFZMRDEuOCAgIHtkMX0sW3IwXSxscgotICAgIFZNTEFMLlU4IHExMixkMCxkMTQKLSAgICBWTUxBTC5VOCBxMyxkMTcsZDE1Ci0gICAgVk1MQUwuVTggcTExLGQxOSxkMTUKLSAgICBTVUJTICAgICByNSxyNSwjNAotICAgIFZNTEFMLlU4IHExMixkMSxkMTUKLSAgICBWUVJTSFJOLlUxNiBkOCxxMiwjNgotICAgIFZRUlNIUk4uVTE2IGQ5LHEzLCM2Ci0gICAgVlFSU0hSTi5VMTYgZDIwLHExMSwjNgotICAgIFZTVDEuNjQgIHtkOH0sW3IyXSxyMwotICAgIFZRUlNIUk4uVTE2IGQyMSxxMTIsIzYKLSAgICBWU1QxLjY0ICB7ZDl9LFtyMl0scjMKLSAgICBWU1QxLjY0ICB7ZDIwfSxbcjJdLHIzCi0gICAgVlNUMS42NCAge2QyMX0sW3IyXSxyMwotICAgIEJHVCAgICAgIFdpZHRoSXM4TVZJc05vdFplcm8KLSAgICBNT1YgICAgICByMCwjMAotICAgIFZQT1AgICAgIHtkOC1kMTV9Ci0gICAgUE9QICAgICAge3I0LXIxMixwY30KLQotV2lkdGhJczRNVklzTm90WmVybzoKLSAgICBWTEQxLjggICB7ZDJ9LFtyMF0scjEwCi0gICAgVk1VTEwuVTggcTIsZDAsZDEyCi0gICAgVk1VTEwuVTggcTMsZDIsZDEyCi0gICAgVkxEMS44ICAge2QzfSxbcjBdLGxyCi0gICAgVk1MQUwuVTggcTIsZDEsZDEzCi0gICAgVk1MQUwuVTggcTMsZDMsZDEzCi0gICAgVkxEMS44ICAge2QwfSxbcjBdLHIxMAotICAgIFZNTEFMLlU4IHEyLGQyLGQxNAotICAgIFZNTEFMLlU4IHEzLGQwLGQxNAotICAgIFZMRDEuOCAgIHtkMX0sW3IwXSxscgotICAgIFNVQlMgICAgIHI1LHI1LCMyCi0gICAgVk1MQUwuVTggcTMsZDEsZDE1Ci0gICAgVk1MQUwuVTggcTIsZDMsZDE1Ci0gICAgVlFSU0hSTi5VMTYgZDkscTMsIzYKLSAgICBWUVJTSFJOLlUxNiBkOCxxMiwjNgotICAgIFZTVDEuMzIgIHtkOFswXX0sW3IyXSxyMwotICAgIFZTVDEuMzIgIHtkOVswXX0sW3IyXSxyMwotICAgIEJHVCAgICAgIFdpZHRoSXM0TVZJc05vdFplcm8KLSAgICBNT1YgICAgICByMCwjMAotICAgIFZQT1AgICAgIHtkOC1kMTV9Ci0gICAgUE9QICAgICAge3I0LXIxMixwY30KLQotV2lkdGhJczJNVklzTm90WmVybzoKLSAgICBWTEQxLjggICB7ZDJ9LFtyMF0scjEwCi0gICAgVk1VTEwuVTggcTIsZDAsZDEyCi0gICAgVk1VTEwuVTggcTMsZDIsZDEyCi0gICAgVkxEMS44ICAge2QzfSxbcjBdLGxyCi0gICAgVk1MQUwuVTggcTIsZDEsZDEzCi0gICAgVk1MQUwuVTggcTMsZDMsZDEzCi0gICAgVkxEMS44ICAge2QwfSxbcjBdLHIxMAotICAgIFZNTEFMLlU4IHEyLGQyLGQxNAotICAgIFZNTEFMLlU4IHEzLGQwLGQxNAotICAgIFZMRDEuOCAgIHtkMX0sW3IwXSxscgotICAgIFNVQlMgICAgIHI1LHI1LCMyCi0gICAgVk1MQUwuVTggcTMsZDEsZDE1Ci0gICAgVk1MQUwuVTggcTIsZDMsZDE1Ci0gICAgVlFSU0hSTi5VMTYgZDkscTMsIzYKLSAgICBWUVJTSFJOLlUxNiBkOCxxMiwjNgotICAgIFZTVDEuMTYgIHtkOFswXX0sW3IyXSxyMwotICAgIFZTVDEuMTYgIHtkOVswXX0sW3IyXSxyMwotICAgIEJHVCAgICAgIFdpZHRoSXMyTVZJc05vdFplcm8KLSAgICBNT1YgICAgICByMCwjMAotICAgIFZQT1AgICAgIHtkOC1kMTV9Ci0gICAgUE9QICAgICAge3I0LXIxMixwY30KLQotV2lkdGhJczhNVklzWmVybzoKLSAgICBTVUIgICAgICByMCxyMCxyMQotV2lkdGhJczhMb29wTVZJc1plcm86Ci0gICAgVkxEMS44ICAge2QwfSxbcjBdLHIxCi0gICAgU1VCUyAgICAgcjUscjUsIzIKLSAgICBWTEQxLjggICB7ZDF9LFtyMF0scjEKLSAgICBWU1QxLjY0ICB7ZDB9LFtyMl0scjMKLSAgICBWU1QxLjY0ICB7ZDF9LFtyMl0scjMKLSAgICBCR1QgICAgICBXaWR0aElzOExvb3BNVklzWmVybwotICAgIE1PViAgICAgIHIwLCMwCi0gICAgVlBPUCAgICAge2Q4LWQxNX0KLSAgICBQT1AgICAgICB7cjQtcjEyLHBjfQotCi1XaWR0aElzNE1WSXNaZXJvOgotICAgIFZMRDEuOCAgIHtkMX0sW3IwXSxyMQotICAgIFNVQlMgICAgIHI1LHI1LCMyCi0gICAgVlNUMS4zMiAge2QwWzBdfSxbcjJdLHIzCi0gICAgVkxEMS44ICAge2QwfSxbcjBdLHIxCi0gICAgVlNUMS4zMiAge2QxWzBdfSxbcjJdLHIzCi0gICAgQkdUICAgICAgV2lkdGhJczRNVklzWmVybwotICAgIE1PViAgICAgIHIwLCMwCi0gICAgVlBPUCAgICAge2Q4LWQxNX0KLSAgICBQT1AgICAgICB7cjQtcjEyLHBjfQotCi1XaWR0aElzMk1WSXNaZXJvOgotICAgIFZMRDEuOCAgIHtkMX0sW3IwXSxyMQotICAgIFNVQlMgICAgIHI1LHI1LCMyCi0gICAgVlNUMS4xNiAge2QwWzBdfSxbcjJdLHIzCi0gICAgVkxEMS44ICAge2QwfSxbcjBdLHIxCi0gICAgVlNUMS4xNiAge2QxWzBdfSxbcjJdLHIzCi0gICAgQkdUICAgICAgV2lkdGhJczJNVklzWmVybwotICAgIE1PViAgICAgIHIwLCMwCi0gICAgVlBPUCAgICAge2Q4LWQxNX0KLSAgICBQT1AgICAgICB7cjQtcjEyLHBjfQotCi0gICAgLmVuZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX1F1YW50VGFibGVzX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXNfcy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGU2MDEwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXNfcy5TCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLS8qCi0gKgotICovCi0KLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKLQotICAgIC5hcm0KLSAgICAuZnB1IG5lb24KLSAgICAuc2VjdGlvbiAucm9kYXRhCi0gICAgLmFsaWduIDQKLQotICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9NRk1hdHJpeFFQTW9kVGFibGUKLSAgICAuZ2xvYmFsIGFybVZDTTRQMTBfUVBEaXZJbnRyYVRhYmxlCi0gICAgLmdsb2JhbCBhcm1WQ000UDEwX1FQRGl2UGx1c09uZVRhYmxlCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFRoaXMgdGFibGUgY29udGFpbnMgKDEgPDwgUWJpdHNQbHVzT25lKSAvIDMgVmFsdWVzIChJbnRyYSBjYXNlKSAsCi07Ly8gZm9yIHZhbHVlcyBvZiBpUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLgotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotYXJtVkNNNFAxMF9RUERpdkludHJhVGFibGU6Ci0gICAgLndvcmQgMjE4NDUsIDIxODQ1LCAyMTg0NSwgMjE4NDUsIDIxODQ1LCAyMTg0NQotICAgIC53b3JkIDQzNjkwLCA0MzY5MCwgNDM2OTAsIDQzNjkwLCA0MzY5MCwgNDM2OTAKLSAgICAud29yZCA4NzM4MSwgODczODEsIDg3MzgxLCA4NzM4MSwgODczODEsIDg3MzgxCi0gICAgLndvcmQgMTc0NzYyLCAxNzQ3NjIsIDE3NDc2MiwgMTc0NzYyLCAxNzQ3NjIsIDE3NDc2MgotICAgIC53b3JkIDM0OTUyNSwgMzQ5NTI1LCAzNDk1MjUsIDM0OTUyNSwgMzQ5NTI1LCAzNDk1MjUKLSAgICAud29yZCA2OTkwNTAsIDY5OTA1MCwgNjk5MDUwLCA2OTkwNTAsIDY5OTA1MCwgNjk5MDUwCi0gICAgLndvcmQgMTM5ODEwMSwgMTM5ODEwMSwgMTM5ODEwMSwgMTM5ODEwMSwgMTM5ODEwMSwgMTM5ODEwMQotICAgIC53b3JkIDI3OTYyMDIsIDI3OTYyMDIsIDI3OTYyMDIsIDI3OTYyMDIsIDI3OTYyMDIsIDI3OTYyMDIKLQotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFRoaXMgdGFibGUgY29udGFpbnMgYXJtVkNNNFAxMF9NRk1hdHJpeCBbaVFQICUgNl1bMF0gZW50aXJlcywKLTsvLyBmb3IgdmFsdWVzIG9mIGlRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1hcm1WQ000UDEwX01GTWF0cml4UVBNb2RUYWJsZToKLSAgICAuaHdvcmQgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgotICAgIC5od29yZCAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCi0gICAgLmh3b3JkIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKLSAgICAuaHdvcmQgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgotICAgIC5od29yZCAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCi0gICAgLmh3b3JkIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKLSAgICAuaHdvcmQgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgotICAgIC5od29yZCAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCi0gICAgLmh3b3JkIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gVGhpcyB0YWJsZSBjb250YWlucyBBUk1fTTRQMTBfUV9PRkZTRVQgKyAxICsgKGlRUCAvIDYpIHZhbHVlcywKLTsvLyBmb3IgdmFsdWVzIG9mIGlRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotYXJtVkNNNFAxMF9RUERpdlBsdXNPbmVUYWJsZToKLSAgICAuYnl0ZSAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2Ci0gICAgLmJ5dGUgMTcsIDE3LCAxNywgMTcsIDE3LCAxNwotICAgIC5ieXRlIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgKLSAgICAuYnl0ZSAxOSwgMTksIDE5LCAxOSwgMTksIDE5Ci0gICAgLmJ5dGUgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMAotICAgIC5ieXRlIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEKLSAgICAuYnl0ZSAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyCi0gICAgLmJ5dGUgMjMsIDIzLCAyMywgMjMsIDIzLCAyMwotICAgIC5ieXRlIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQKLQotICAgIC5lbmQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE4YmVjNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MuUworKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qCi0gKgotICovCi0KLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKLQotICAgIC5hcm0KLSAgICAuZnB1IG5lb24KLSAgICAudGV4dAotCi0gICAgLmdsb2JhbCBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0Ci1hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0OgotICAgIFZQVVNIICAgIHtkOH0KLSAgICBWTEQ0LjE2ICB7ZDAsZDEsZDIsZDN9LFtyMV0KLSAgICBWTU9WLkkxNiBkNCwjMAotICAgIFZBREQuSTE2IGQ1LGQwLGQyCi0gICAgVlNVQi5JMTYgZDYsZDAsZDIKLSAgICBWSEFERC5TMTYgZDcsZDEsZDQKLSAgICBWSEFERC5TMTYgZDgsZDMsZDQKLSAgICBWU1VCLkkxNiBkNyxkNyxkMwotICAgIFZBREQuSTE2IGQ4LGQxLGQ4Ci0gICAgVkFERC5JMTYgZDAsZDUsZDgKLSAgICBWQURELkkxNiBkMSxkNixkNwotICAgIFZTVUIuSTE2IGQyLGQ2LGQ3Ci0gICAgVlNVQi5JMTYgZDMsZDUsZDgKLSAgICBWVFJOLjE2ICBkMCxkMQotICAgIFZUUk4uMTYgIGQyLGQzCi0gICAgVlRSTi4zMiAgcTAscTEKLSAgICBWQURELkkxNiBkNSxkMCxkMgotICAgIFZTVUIuSTE2IGQ2LGQwLGQyCi0gICAgVkhBREQuUzE2IGQ3LGQxLGQ0Ci0gICAgVkhBREQuUzE2IGQ4LGQzLGQ0Ci0gICAgVlNVQi5JMTYgZDcsZDcsZDMKLSAgICBWQURELkkxNiBkOCxkMSxkOAotICAgIFZBREQuSTE2IGQwLGQ1LGQ4Ci0gICAgVkFERC5JMTYgZDEsZDYsZDcKLSAgICBWU1VCLkkxNiBkMixkNixkNwotICAgIFZTVUIuSTE2IGQzLGQ1LGQ4Ci0gICAgVlJTSFIuUzE2IGQwLGQwLCM2Ci0gICAgVlJTSFIuUzE2IGQxLGQxLCM2Ci0gICAgVlJTSFIuUzE2IGQyLGQyLCM2Ci0gICAgVlJTSFIuUzE2IGQzLGQzLCM2Ci0gICAgVlNUMS4xNiAge2QwLGQxLGQyLGQzfSxbcjBdCi0gICAgVlBPUCAgICAge2Q4fQotICAgIEJYICAgICAgIGxyCi0KLSAgICAuZW5kCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NF9zLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5N2VmY2IuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NF9zLlMKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKgotICoKLSAqLwotCi0gICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCi0gICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCi0KLSAgICAuYXJtCi0gICAgLmZwdSBuZW9uCi0gICAgLnRleHQKLSAgICAuc3ludGF4IHVuaWZpZWQKLQotICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NAotYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NDoKLSAgICBQVVNIICAgICB7cjQtcjgsbHJ9Ci0gICAgTERSICAgICAgcjIsW3IwLCMwXQotICAgIE1PViAgICAgIHI3LCMweDFmCi0gICAgTU9WICAgICAgcjQsIzAKLSAgICBNT1YgICAgICByNSwjMAotICAgIExEUkIgICAgIHIzLFtyMl0sIzEKLSAgICBTVFJEICAgICByNCxyNSxbcjEsIzBdCi0gICAgU1RSRCAgICAgcjQscjUsW3IxLCM4XQotICAgIFNUUkQgICAgIHI0LHI1LFtyMSwjMHgxMF0KLSAgICBTVFJEICAgICByNCxyNSxbcjEsIzB4MThdCi11bnBhY2tMb29wOgotICAgIFRTVCAgICAgIHIzLCMweDEwCi0gICAgTERSU0JORSAgcjUsW3IyLCMxXQotICAgIExEUkJORSAgIHI0LFtyMl0sIzIKLSAgICBBTkQgICAgICByNixyNyxyMyxMU0wgIzEKLSAgICBMRFJTQkVRICByNCxbcjJdLCMxCi0gICAgT1JSTkUgICAgcjQscjQscjUsTFNMICM4Ci0gICAgVFNUICAgICAgcjMsIzB4MjAKLSAgICBMRFJCRVEgICByMyxbcjJdLCMxCi0gICAgU1RSSCAgICAgcjQsW3IxLHI2XQotICAgIEJFUSAgICAgIHVucGFja0xvb3AKLSAgICBTVFIgICAgICByMixbcjAsIzBdCi0gICAgUE9QICAgICAge3I0LXI4LHBjfQotICAgIC5lbmQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhOTliZGUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLlMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKgotICoKLSAqLwotCi0gICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCi0gICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCi0KLSAgICAuYXJtCi0gICAgLmZwdSBuZW9uCi0gICAgLnRleHQKLQotICAgIC5nbG9iYWwgb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JCi1vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0k6Ci0gICAgUFVTSCAgICAge3I0LXI5LGxyfQotICAgIE1PVlMgICAgIHI2LHIwCi0gICAgU1VCICAgICAgc3Asc3AsIzB4YwotICAgIE1PViAgICAgIHI5LHIxCi0gICAgTU9WICAgICAgcjcscjIKLSAgICBNT1YgICAgICByOCxyMwotICAgIExEUiAgICAgIHI0LFtzcCwjMHgyOF0KLSAgICBMRFIgICAgICByNSxbc3AsIzB4MmNdCi0gICAgQkVRICAgICAgTDB4NTgKLSAgICBUU1QgICAgICByNiwjNwotICAgIFRTVEVRICAgIHI5LCM3Ci0gICAgQk5FICAgICAgTDB4NTgKLSAgICBDTVAgICAgICByNywjMAotICAgIENNUE5FICAgIHI4LCMwCi0gICAgQ01QTkUgICAgcjQsIzAKLSAgICBCRVEgICAgICBMMHg1OAotICAgIFRTVCAgICAgIHI0LCMzCi0gICAgQk5FICAgICAgTDB4NTgKLSAgICBDTVAgICAgICByNSwjMAotICAgIEJFUSAgICAgIEwweDU4Ci0gICAgVFNUICAgICAgcjUsIzMKLSAgICBCRVEgICAgICBMMHg2NAotTDB4NTg6Ci0gICAgTVZOICAgICAgcjAsIzQKLUwweDVjOgotICAgIEFERCAgICAgIHNwLHNwLCMweGMKLSAgICBQT1AgICAgICB7cjQtcjkscGN9Ci1MMHg2NDoKLSAgICBTVFIgICAgICByNCxbc3AsIzBdCi0gICAgTU9WICAgICAgcjMscjgKLSAgICBTVFIgICAgICByNSxbc3AsIzRdCi0gICAgTU9WICAgICAgcjIscjcKLSAgICBNT1YgICAgICByMSxyOQotICAgIE1PViAgICAgIHIwLHI2Ci0gICAgQkwgICAgICAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kKLSAgICBDTVAgICAgICByMCwjMAotICAgIEJORSAgICAgIEwweDVjCi0gICAgQUREICAgICAgcjMscjUsIzB4MTAKLSAgICBBREQgICAgICByMixyNCwjMHgxMAotICAgIFNUUiAgICAgIHIzLFtzcCwjNF0KLSAgICBTVFIgICAgICByMixbc3AsIzBdCi0gICAgQUREICAgICAgcjMscjgsIzIKLSAgICBBREQgICAgICByMixyNywjMgotICAgIE1PViAgICAgIHIxLHI5Ci0gICAgTU9WICAgICAgcjAscjYKLSAgICBCTCAgICAgICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSQotICAgIEFERCAgICAgIHNwLHNwLCMweGMKLSAgICBQT1AgICAgICB7cjQtcjkscGN9Ci0KLSAgICAuZW5kCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGRfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZF9zLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YzVkOGIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZF9zLlMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoKLSAqCi0gKi8KLQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQotCi0gICAgLmFybQotICAgIC5mcHUgbmVvbgotICAgIC50ZXh0Ci0KLSAgICAuZ2xvYmFsIG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQKLW9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQ6Ci0gICAgUFVTSCAgICAge3I0LXIxMixscn0KLSAgICBWUFVTSCAgICB7ZDgtZDl9Ci0gICAgU1VCICAgICAgc3Asc3AsIzB4MjAKLSAgICBBREQgICAgICByNCxzcCwjMAotICAgIExEUiAgICAgIHI1LFtzcCwjMHg2NF0KLSAgICBNT1YgICAgICByNyxyMQotICAgIE1PViAgICAgIHI4LHIyCi0gICAgTU9WICAgICAgcjkscjMKLSAgICBDTVAgICAgICByNSwjMAotICAgIEJFUSAgICAgIEwweDExNAotICAgIE1PViAgICAgIHIxLHI0Ci0gICAgQkwgICAgICAgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NCAgOy8vCi0gICAgTERSICAgICAgcjEsW3NwLCMweDYwXQotICAgIExEUiAgICAgIHIxMSwgLkxhcm1WQ000UDEwX1FQTW9kdWxvVGFibGUKLVAwOiBBREQgICAgICByMTEsIHBjCi0gICAgTERSICAgICAgcjEwLCAuTGFybVZDTTRQMTBfUVBEaXZUYWJsZQotUDE6IEFERCAgICAgIHIxMCwgcGMKLSAgICBMRFIgICAgICByMiwgLkxhcm1WQ000UDEwX1ZNYXRyaXhVMTYKLVAyOiBBREQgICAgICByMiwgcGMKLSAgICBMRFJTQiAgICByMTIsW3IxMSxyMV0KLSAgICBMRFJTQiAgICBscixbcjEwLHIxXQotICAgIExEUiAgICAgIHIxMCwgPTB4MzAyMDUwNAotICAgIExEUiAgICAgIHIxLCA9MHg1MDQwMTAwCi0gICAgQUREICAgICAgcjIscjIscjEyCi0gICAgVkRVUC4zMiAgZDcscjEKLSAgICBWRFVQLjMyICBkOSxyMTAKLSAgICBWRFVQLjE2ICBkNSxscgotICAgIFZMRDEuOCAgIHtkNn0sW3IyXQotICAgIFZUQkwuOCAgIGQ4LHtkNn0sZDcKLSAgICBWVEJMLjggICBkNCx7ZDZ9LGQ5Ci0gICAgQ01QICAgICAgcjgsIzAKLSAgICBWTEQxLjE2ICB7ZDAsZDEsZDIsZDN9LFtyNF0KLSAgICBWU0hMLlUxNiBkOCxkOCxkNQotICAgIFZTSEwuVTE2IGQ0LGQ0LGQ1Ci0gICAgQkVRICAgICAgTDEKLSAgICBMRFJTSCAgICByMTAsW3I4LCMwXQotTDE6Ci0gICAgVk1VTC5JMTYgZDAsZDAsZDgKLSAgICBWTVVMLkkxNiBkMSxkMSxkNAotICAgIFZNVUwuSTE2IGQyLGQyLGQ4Ci0gICAgVk1VTC5JMTYgZDMsZDMsZDQKLSAgICBWTU9WTkUuMTYgZDBbMF0scjEwCi0gICAgVlRSTi4xNiAgZDAsZDEKLSAgICBWVFJOLjE2ICBkMixkMwotICAgIFZUUk4uMzIgIHEwLHExCi0gICAgVk1PVi5JMTYgZDQsIzAKLSAgICBWQURELkkxNiBkNSxkMCxkMgotICAgIFZTVUIuSTE2IGQ2LGQwLGQyCi0gICAgVkhBREQuUzE2IGQ3LGQxLGQ0Ci0gICAgVkhBREQuUzE2IGQ4LGQzLGQ0Ci0gICAgVlNVQi5JMTYgZDcsZDcsZDMKLSAgICBWQURELkkxNiBkOCxkMSxkOAotICAgIFZBREQuSTE2IGQwLGQ1LGQ4Ci0gICAgVkFERC5JMTYgZDEsZDYsZDcKLSAgICBWU1VCLkkxNiBkMixkNixkNwotICAgIFZTVUIuSTE2IGQzLGQ1LGQ4Ci0gICAgVlRSTi4xNiAgZDAsZDEKLSAgICBWVFJOLjE2ICBkMixkMwotICAgIFZUUk4uMzIgIHEwLHExCi0gICAgVkFERC5JMTYgZDUsZDAsZDIKLSAgICBWU1VCLkkxNiBkNixkMCxkMgotICAgIFZIQURELlMxNiBkNyxkMSxkNAotICAgIFZIQURELlMxNiBkOCxkMyxkNAotICAgIFZTVUIuSTE2IGQ3LGQ3LGQzCi0gICAgVkFERC5JMTYgZDgsZDEsZDgKLSAgICBWQURELkkxNiBkMCxkNSxkOAotICAgIFZBREQuSTE2IGQxLGQ2LGQ3Ci0gICAgVlNVQi5JMTYgZDIsZDYsZDcKLSAgICBWU1VCLkkxNiBkMyxkNSxkOAotICAgIFZSU0hSLlMxNiBkMCxkMCwjNgotICAgIFZSU0hSLlMxNiBkMSxkMSwjNgotICAgIFZSU0hSLlMxNiBkMixkMiwjNgotICAgIFZSU0hSLlMxNiBkMyxkMywjNgotICAgIEIgICAgICAgIEwweDEzMAotTDB4MTE0OgotICAgIExEUlNIICAgIHIxMCxbcjgsIzBdCi0gICAgQUREICAgICAgcjEwLHIxMCwjMHgyMAotICAgIEFTUiAgICAgIHIxMCxyMTAsIzYKLSAgICBWRFVQLjE2ICBkMCxyMTAKLSAgICBWRFVQLjE2ICBkMSxyMTAKLSAgICBWRFVQLjE2ICBkMixyMTAKLSAgICBWRFVQLjE2ICBkMyxyMTAKLUwweDEzMDoKLSAgICBMRFIgICAgICByMSxbc3AsIzB4NThdCi0gICAgTERSICAgICAgcjEwLFtzcCwjMHg1Y10KLSAgICBMRFIgICAgICByMyxbcjddLHIxCi0gICAgTERSICAgICAgcjUsW3I3XSxyMQotICAgIFZNT1YgICAgIGQ0LHIzLHI1Ci0gICAgTERSICAgICAgcjMsW3I3XSxyMQotICAgIExEUiAgICAgIHI1LFtyNywjMF0KLSAgICBWTU9WICAgICBkNSxyMyxyNQotICAgIFZBRERXLlU4IHEzLHEwLGQ0Ci0gICAgVkFERFcuVTggcTQscTEsZDUKLSAgICBWUU1PVlVOLlMxNiBkMCxxMwotICAgIFZRTU9WVU4uUzE2IGQxLHE0Ci0gICAgVlNUMS4zMiAge2QwWzBdfSxbcjldLHIxMAotICAgIFZTVDEuMzIgIHtkMFsxXX0sW3I5XSxyMTAKLSAgICBWU1QxLjMyICB7ZDFbMF19LFtyOV0scjEwCi0gICAgVlNUMS4zMiAge2QxWzFdfSxbcjldCi0gICAgTU9WICAgICAgcjAsIzAKLSAgICBBREQgICAgICBzcCxzcCwjMHgyMAotICAgIFZQT1AgICAgIHtkOC1kOX0KLSAgICBQT1AgICAgICB7cjQtcjEyLHBjfQotCi0uTGFybVZDTTRQMTBfUVBNb2R1bG9UYWJsZToKLSAgICAud29yZCAgIGFybVZDTTRQMTBfUVBNb2R1bG9UYWJsZS0oUDArOCkKLS5MYXJtVkNNNFAxMF9RUERpdlRhYmxlOgotICAgIC53b3JkICAgYXJtVkNNNFAxMF9RUERpdlRhYmxlLShQMSs4KQotLkxhcm1WQ000UDEwX1ZNYXRyaXhVMTY6Ci0gICAgLndvcmQgICBhcm1WQ000UDEwX1ZNYXRyaXhVMTYtKFAyKzgpCi0KLSAgICAuZW5kCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0lfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhODM1MTYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLlMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoKLSAqCi0gKi8KLQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQotCi0gICAgLmFybQotICAgIC5mcHUgbmVvbgotICAgIC50ZXh0Ci0KLSAgICAuZ2xvYmFsIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0kKLW9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0k6Ci0gICAgUFVTSCAgICAge3I0LXIxMCxscn0KLSAgICBWUFVTSCAgICB7ZDgtZDE1fQotICAgIFZMRDEuOCAgIHtkMFtdfSxbcjJdIQotICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMQotICAgIFNVQiAgICAgIHIwLHIwLHIxCi0gICAgVkxEMS44ICAge2QyW119LFtyM10hCi0gICAgTERSICAgICAgcjQsW3NwLCMweDY0XQotICAgIExEUiAgICAgIHI1LFtzcCwjMHg2MF0KLSAgICBMRFIgICAgICByOSwgPTB4MzAzMDMwMwotICAgIExEUiAgICAgIHI4LCA9MHg0MDQwNDA0Ci0gICAgVk1PVi5JOCAgZDE0LCMwCi0gICAgVk1PVi5JOCAgZDE1LCMweDEKLSAgICBWTU9WLkkxNiBkMSwjMHg0Ci0gICAgTU9WICAgICAgcjcsIzB4NDAwMDAwMDAKLUwweDM4OgotICAgIExEUiAgICAgIHI2LFtyNF0sIzgKLSAgICBWTEQxLjggICB7ZDZ9LFtyMF0scjEKLSAgICBWTEQxLjggICB7ZDV9LFtyMF0scjEKLSAgICBDTVAgICAgICByNiwjMAotICAgIFZMRDEuOCAgIHtkNH0sW3IwXSxyMQotICAgIFZMRDEuOCAgIHtkOH0sW3IwXSxyMQotICAgIFZBQkQuVTggIGQxOSxkNixkNAotICAgIFZMRDEuOCAgIHtkOX0sW3IwXSxyMQotICAgIFZBQkQuVTggIGQxMyxkNCxkOAotICAgIFZMRDEuOCAgIHtkMTB9LFtyMF0scjEKLSAgICBCRVEgICAgICBMMHhlNAotICAgIFZBQkQuVTggIGQxMixkNSxkNAotICAgIFZBQkQuVTggIGQxOCxkOSxkOAotICAgIFZDR1QuVTggIGQxNixkMCxkMTMKLSAgICBWTU9WLjMyICBkMjZbMF0scjYKLSAgICBWTUFYLlU4ICBkMTIsZDE4LGQxMgotICAgIFZNT1ZMLlU4IHExMyxkMjYKLSAgICBWQUJELlU4ICBkMTcsZDEwLGQ4Ci0gICAgVkNHVC5TMTYgZDI3LGQyNiwjMAotICAgIFZDR1QuVTggIGQxMixkMixkMTIKLSAgICBWQ0dULlU4ICBkMTksZDIsZDE5Ci0gICAgVkFORCAgICAgZDE2LGQxNixkMjcKLSAgICBUU1QgICAgICByNixyOQotICAgIFZDR1QuVTggIGQxNyxkMixkMTcKLSAgICBWQU5EICAgICBkMTYsZDE2LGQxMgotICAgIFZBTkQgICAgIGQxMixkMTYsZDE3Ci0gICAgVkFORCAgICAgZDE3LGQxNixkMTkKLSAgICBCTE5FICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0xUNF91bnNhZmUKLSAgICBUU1QgICAgICByNixyOAotICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMgotICAgIFZUU1QuMTYgIGQyNixkMjYsZDEKLSAgICBCTE5FICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0dFNF91bnNhZmUKLSAgICBWQklUICAgICBkMjksZDEzLGQyNgotICAgIFZCSVQgICAgIGQyNCxkMzEsZDI2Ci0gICAgVkJJRiAgICAgZDI5LGQ0LGQxNgotICAgIFZCSUYgICAgIGQyNCxkOCxkMTYKLSAgICBWU1QxLjggICB7ZDI5fSxbcjBdLHIxCi0gICAgQUREUyAgICAgcjcscjcscjcKLSAgICBWU1QxLjggICB7ZDI0fSxbcjBdLHIxCi0gICAgQk5FICAgICAgTDB4MzgKLSAgICBNT1YgICAgICByMCwjMAotICAgIFZQT1AgICAgIHtkOC1kMTV9Ci0gICAgUE9QICAgICAge3I0LXIxMCxwY30KLUwweGU0OgotICAgIFZMRDEuOCAgIHtkMFtdfSxbcjJdCi0gICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCi0gICAgQUREUyAgICAgcjcscjcscjcKLSAgICBWTEQxLjggICB7ZDJbXX0sW3IzXQotICAgIEFERCAgICAgIHI1LHI1LCM0Ci0gICAgQk5FICAgICAgTDB4MzgKLSAgICBNT1YgICAgICByMCwjMAotICAgIFZQT1AgICAgIHtkOC1kMTV9Ci0gICAgUE9QICAgICAge3I0LXIxMCxwY30KLQotICAgIC5lbmQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUxMDkzMS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MuUworKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKgotICoKLSAqLwotCi0gICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCi0gICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCi0KLSAgICAuYXJtCi0gICAgLmZwdSBuZW9uCi0gICAgLnRleHQKLQotICAgIC5nbG9iYWwgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSQotb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSToKLSAgICBQVVNIICAgICB7cjQtcjEyLGxyfQotICAgIFZQVVNIICAgIHtkOC1kMTV9Ci0gICAgVkxEMS44ICAge2QwW119LFtyMl0hCi0gICAgU1VCICAgICAgcjAscjAsIzQKLSAgICBWTEQxLjggICB7ZDJbXX0sW3IzXSEKLSAgICBMRFIgICAgICByNCxbc3AsIzB4NmNdCi0gICAgTERSICAgICAgcjUsW3NwLCMweDY4XQotICAgIExEUiAgICAgIHI4LCA9MHg0MDQwNDA0Ci0gICAgTERSICAgICAgcjksID0weDMwMzAzMDMKLSAgICBWTU9WLkk4ICBkMTQsIzAKLSAgICBWTU9WLkk4ICBkMTUsIzB4MQotICAgIFZNT1YuSTE2IGQxLCMweDQKLSAgICBNT1YgICAgICByNywjMHg0MDAwMDAwMAotTDB4MzQ6Ci0gICAgTERSICAgICAgcjYsW3I0XSwjOAotICAgIEFERCAgICAgIHIxMCxyMCxyMQotICAgIEFERCAgICAgIGxyLHIxLHIxCi0gICAgVkxEMS44ICAge2Q3fSxbcjBdLGxyCi0gICAgVkxEMS44ICAge2Q4fSxbcjEwXSxscgotICAgIFZMRDEuOCAgIHtkNX0sW3IwXSxscgotICAgIFZMRDEuOCAgIHtkMTB9LFtyMTBdLGxyCi0gICAgVkxEMS44ICAge2Q2fSxbcjBdLGxyCi0gICAgVkxEMS44ICAge2Q5fSxbcjEwXSxscgotICAgIFZMRDEuOCAgIHtkNH0sW3IwXSxscgotICAgIFZMRDEuOCAgIHtkMTF9LFtyMTBdLGxyCi0gICAgVlpJUC44ICAgZDcsZDgKLSAgICBWWklQLjggICBkNSxkMTAKLSAgICBWWklQLjggICBkNixkOQotICAgIFZaSVAuOCAgIGQ0LGQxMQotICAgIFZaSVAuMTYgIGQ3LGQ1Ci0gICAgVlpJUC4xNiAgZDgsZDEwCi0gICAgVlpJUC4xNiAgZDYsZDQKLSAgICBWWklQLjE2ICBkOSxkMTEKLSAgICBWVFJOLjMyICBkNyxkNgotICAgIFZUUk4uMzIgIGQ1LGQ0Ci0gICAgVlRSTi4zMiAgZDEwLGQxMQotICAgIFZUUk4uMzIgIGQ4LGQ5Ci0gICAgQ01QICAgICAgcjYsIzAKLSAgICBWQUJELlU4ICBkMTksZDYsZDQKLSAgICBWQUJELlU4ICBkMTMsZDQsZDgKLSAgICBCRVEgICAgICBMMHgxNzAKLSAgICBWQUJELlU4ICBkMTIsZDUsZDQKLSAgICBWQUJELlU4ICBkMTgsZDksZDgKLSAgICBWTU9WLjMyICBkMjZbMF0scjYKLSAgICBWQ0dULlU4ICBkMTYsZDAsZDEzCi0gICAgVk1BWC5VOCAgZDEyLGQxOCxkMTIKLSAgICBWTU9WTC5VOCBxMTMsZDI2Ci0gICAgVkFCRC5VOCAgZDE3LGQxMCxkOAotICAgIFZDR1QuUzE2IGQyNyxkMjYsIzAKLSAgICBWQ0dULlU4ICBkMTIsZDIsZDEyCi0gICAgVkNHVC5VOCAgZDE5LGQyLGQxOQotICAgIFZBTkQgICAgIGQxNixkMTYsZDI3Ci0gICAgVFNUICAgICAgcjYscjkKLSAgICBWQ0dULlU4ICBkMTcsZDIsZDE3Ci0gICAgVkFORCAgICAgZDE2LGQxNixkMTIKLSAgICBWQU5EICAgICBkMTIsZDE2LGQxNwotICAgIFZBTkQgICAgIGQxNyxkMTYsZDE5Ci0gICAgQkxORSAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNMVDRfdW5zYWZlCi0gICAgVFNUICAgICAgcjYscjgKLSAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzMKLSAgICBWVFNULjE2ICBkMjYsZDI2LGQxCi0gICAgQkxORSAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNHRTRfdW5zYWZlCi0gICAgVkJJVCAgICAgZDI5LGQxMyxkMjYKLSAgICBWQklUICAgICBkMjQsZDMxLGQyNgotICAgIEFERCAgICAgIHIxMCxyMCwjMwotICAgIFZCSUYgICAgIGQyOSxkNCxkMTYKLSAgICBBREQgICAgICByMTIscjEwLHIxCi0gICAgQUREICAgICAgbHIscjEscjEKLSAgICBWQklGICAgICBkMjQsZDgsZDE2Ci0gICAgQUREUyAgICAgcjcscjcscjcKLSAgICBWU1QxLjggICB7ZDI5WzBdfSxbcjEwXSxscgotICAgIFZTVDEuOCAgIHtkMjlbMV19LFtyMTJdLGxyCi0gICAgVlNUMS44ICAge2QyOVsyXX0sW3IxMF0sbHIKLSAgICBWU1QxLjggICB7ZDI5WzNdfSxbcjEyXSxscgotICAgIFZTVDEuOCAgIHtkMjlbNF19LFtyMTBdLGxyCi0gICAgVlNUMS44ICAge2QyOVs1XX0sW3IxMl0sbHIKLSAgICBWU1QxLjggICB7ZDI5WzZdfSxbcjEwXSxscgotICAgIFZTVDEuOCAgIHtkMjlbN119LFtyMTJdLGxyCi0gICAgQUREICAgICAgcjEyLHIwLCM0Ci0gICAgQUREICAgICAgcjEwLHIxMixyMQotICAgIFZTVDEuOCAgIHtkMjRbMF19LFtyMTJdLGxyCi0gICAgVlNUMS44ICAge2QyNFsxXX0sW3IxMF0sbHIKLSAgICBWU1QxLjggICB7ZDI0WzJdfSxbcjEyXSxscgotICAgIFZTVDEuOCAgIHtkMjRbM119LFtyMTBdLGxyCi0gICAgVlNUMS44ICAge2QyNFs0XX0sW3IxMl0sbHIKLSAgICBWU1QxLjggICB7ZDI0WzVdfSxbcjEwXSxscgotICAgIFZTVDEuOCAgIHtkMjRbNl19LFtyMTJdLGxyCi0gICAgVlNUMS44ICAge2QyNFs3XX0sW3IxMF0sbHIKLSAgICBBREQgICAgICByMCxyMCwjNAotICAgIEJORSAgICAgIEwweDM0Ci0gICAgTU9WICAgICAgcjAsIzAKLSAgICBWUE9QICAgICB7ZDgtZDE1fQotICAgIFBPUCAgICAgIHtyNC1yMTIscGN9Ci1MMHgxNzA6Ci0gICAgVkxEMS44ICAge2QwW119LFtyMl0KLSAgICBBREQgICAgICByMCxyMCwjNAotICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMwotICAgIEFERFMgICAgIHI3LHI3LHI3Ci0gICAgVkxEMS44ICAge2QyW119LFtyM10KLSAgICBBREQgICAgICByNSxyNSwjNAotICAgIEJORSAgICAgIEwweDM0Ci0gICAgTU9WICAgICAgcjAsIzAKLSAgICBWUE9QICAgICB7ZDgtZDE1fQotICAgIFBPUCAgICAgIHtyNC1yMTIscGN9Ci0KLSAgICAuZW5kCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRmZmFkMi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSV9zLlMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoKLSAqCi0gKi8KLQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQotCi0gICAgLmFybQotICAgIC5mcHUgbmVvbgotICAgIC50ZXh0Ci0KLSAgICAuZ2xvYmFsIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JCi1vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSToKLSAgICBQVVNIICAgICB7cjQtcjEyLGxyfQotICAgIFZQVVNIICAgIHtkOC1kMTV9Ci0gICAgQUREICAgICAgcjcscjIsIzEKLSAgICBBREQgICAgICByOCxyMywjMQotICAgIFZMRDEuOCAgIHtkMFtdfSxbcjJdCi0gICAgU1VCICAgICAgcjAscjAscjEsTFNMICMyCi0gICAgVkxEMS44ICAge2QyW119LFtyM10KLSAgICBMRFIgICAgICByNCxbc3AsIzB4NmNdCi0gICAgTERSICAgICAgcjUsW3NwLCMweDY4XQotICAgIE1PViAgICAgIHIxMSwjMAotICAgIFZNT1YuSTggIGQxNCwjMAotICAgIFZNT1YuSTggIGQxNSwjMHgxCi0gICAgQUREICAgICAgcjEwLHIxLHIxCi0gICAgTU9WICAgICAgcjksIzB4NTUwMDAwMDAKLUwweDM4OgotICAgIExEUkggICAgIHIxMixbcjRdLCMyCi0gICAgQUREICAgICAgcjYscjAscjEKLSAgICBDTVAgICAgICByMTIsIzAKLSAgICBCRVEgICAgICBMMHhlNAotICAgIFZMRDEuOCAgIHtkN30sW3IwXSxyMTAKLSAgICBWTEQxLjggICB7ZDZ9LFtyNl0scjEwCi0gICAgVkxEMS44ICAge2Q1fSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkNH0sW3I2XSxyMTAKLSAgICBWTEQxLjggICB7ZDh9LFtyMF0scjEwCi0gICAgVkFCRC5VOCAgZDEyLGQ0LGQ1Ci0gICAgVkxEMS44ICAge2Q5fSxbcjZdCi0gICAgVkFCRC5VOCAgZDEzLGQ4LGQ0Ci0gICAgVkxEMS44ICAge2QxMH0sW3IwXSxyMQotICAgIFZBQkQuVTggIGQxOCxkOSxkOAotICAgIFZBQkQuVTggIGQxOSxkNixkNAotICAgIFZDR1QuVTggIGQxNixkMCxkMTMKLSAgICBUU1QgICAgICByMTIsIzB4ZmYKLSAgICBWTUFYLlU4ICBkMTIsZDE4LGQxMgotICAgIFZBQkQuVTggIGQxNyxkMTAsZDgKLSAgICBWTU9WRVEuMzIgZDE2WzBdLHIxMQotICAgIFRTVCAgICAgIHIxMiwjMHhmZjAwCi0gICAgVkNHVC5VOCAgZDE5LGQyLGQxOQotICAgIFZDR1QuVTggIGQxMixkMixkMTIKLSAgICBWTU9WRVEuMzIgZDE2WzFdLHIxMQotICAgIFZDR1QuVTggIGQxNyxkMixkMTcKLSAgICBWTEQxLjggICB7ZDExfSxbcjBdCi0gICAgVkFORCAgICAgZDE2LGQxNixkMTIKLSAgICBUU1QgICAgICByMTIsIzQKLSAgICBWQU5EICAgICBkMTIsZDE2LGQxNwotICAgIFZBTkQgICAgIGQxNyxkMTYsZDE5Ci0gICAgQk5FICAgICAgTDB4ZjgKLSAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzIKLSAgICBTVUIgICAgICByMCxyMCxyMQotICAgIEJMICAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKLSAgICBWU1QxLjggICB7ZDMwfSxbcjBdLHIxCi0gICAgVlNUMS44ICAge2QyOX0sW3IwXSxyMQotICAgIFNVQiAgICAgIHI2LHIwLHIxLExTTCAjMgotICAgIFZTVDEuOCAgIHtkMjR9LFtyMF0scjEKLSAgICBBRERTICAgICByOSxyOSxyOQotICAgIFZTVDEuOCAgIHtkMjV9LFtyMF0KLSAgICBBREQgICAgICByMCxyNiwjOAotICAgIEJDQyAgICAgIEwweDM4Ci0gICAgQiAgICAgICAgTDB4MTMwCi1MMHhlNDoKLSAgICBBREQgICAgICByMCxyMCwjOAotICAgIEFERFMgICAgIHI5LHI5LHI5Ci0gICAgQUREICAgICAgcjUscjUsIzIKLSAgICBCQ0MgICAgICBMMHgzOAotICAgIEIgICAgICAgIEwweDEzMAotTDB4Zjg6Ci0gICAgU1VCICAgICAgcjAscjAscjEsTFNMICMyCi0gICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCi0gICAgQkwgICAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZQotICAgIFZTVDEuOCAgIHtkMzF9LFtyMF0scjEKLSAgICBWU1QxLjggICB7ZDMwfSxbcjBdLHIxCi0gICAgVlNUMS44ICAge2QyOX0sW3IwXSxyMQotICAgIFNVQiAgICAgIHI2LHIwLHIxLExTTCAjMgotICAgIFZTVDEuOCAgIHtkMjR9LFtyMF0scjEKLSAgICBBRERTICAgICByOSxyOSxyOQotICAgIFZTVDEuOCAgIHtkMjV9LFtyMF0scjEKLSAgICBBREQgICAgICByNSxyNSwjMgotICAgIFZTVDEuOCAgIHtkMjh9LFtyMF0KLSAgICBBREQgICAgICByMCxyNiwjOAotICAgIEJDQyAgICAgIEwweDM4Ci1MMHgxMzA6Ci0gICAgU1VCICAgICAgcjAscjAsIzB4MTAKLSAgICBWTEQxLjggICB7ZDBbXX0sW3I3XQotICAgIEFERCAgICAgIHIwLHIwLHIxLExTTCAjMgotICAgIFZMRDEuOCAgIHtkMltdfSxbcjhdCi0gICAgQk5FICAgICAgTDB4MzgKLSAgICBNT1YgICAgICByMCwjMAotICAgIFZQT1AgICAgIHtkOC1kMTV9Ci0gICAgUE9QICAgICAge3I0LXIxMixwY30KLQotICAgIC5lbmQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmEzNjgyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MuUworKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKgotICoKLSAqLwotCi0gICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCi0gICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCi0KLSAgICAuYXJtCi0gICAgLmZwdSBuZW9uCi0gICAgLnRleHQKLQotICAgIC5nbG9iYWwgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kKLW9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JOgotICAgIFBVU0ggICAgIHtyNC1yMTIsbHJ9Ci0gICAgVlBVU0ggICAge2Q4LWQxNX0KLSAgICBBREQgICAgICByNyxyMiwjMQotICAgIEFERCAgICAgIHI4LHIzLCMxCi0gICAgVkxEMS44ICAge2QwW119LFtyMl0KLSAgICBTVUIgICAgICByMCxyMCwjNAotICAgIFZMRDEuOCAgIHtkMltdfSxbcjNdCi0gICAgTERSICAgICAgcjQsW3NwLCMweDZjXQotICAgIExEUiAgICAgIHI1LFtzcCwjMHg2OF0KLSAgICBNT1YgICAgICByNiwjMAotICAgIFZNT1YuSTggIGQxNCwjMAotICAgIFZNT1YuSTggIGQxNSwjMHgxCi0gICAgTU9WICAgICAgcjksIzB4MTEwMDAwMDAKLSAgICBBREQgICAgICByMTEscjEscjEKLUwweDM4OgotICAgIExEUkggICAgIHIxMixbcjRdLCM0Ci0gICAgQ01QICAgICAgcjEyLCMwCi0gICAgQkVRICAgICAgTDB4MTYwCi0gICAgQUREICAgICAgcjEwLHIwLHIxCi0gICAgVkxEMS44ICAge2Q3fSxbcjBdLHIxMQotICAgIFZMRDEuOCAgIHtkOH0sW3IxMF0scjExCi0gICAgVkxEMS44ICAge2Q1fSxbcjBdLHIxMQotICAgIFZaSVAuOCAgIGQ3LGQ4Ci0gICAgVkxEMS44ICAge2QxMH0sW3IxMF0scjExCi0gICAgVkxEMS44ICAge2Q2fSxbcjBdLHIxMQotICAgIFZaSVAuOCAgIGQ1LGQxMAotICAgIFZMRDEuOCAgIHtkOX0sW3IxMF0scjExCi0gICAgVkxEMS44ICAge2Q0fSxbcjBdLHIxMQotICAgIFZMRDEuOCAgIHtkMTF9LFtyMTBdLHIxMQotICAgIFZaSVAuOCAgIGQ2LGQ5Ci0gICAgVlpJUC4xNiAgZDgsZDEwCi0gICAgVlpJUC44ICAgZDQsZDExCi0gICAgU1VCICAgICAgcjAscjAscjEsTFNMICMzCi0gICAgVlpJUC4xNiAgZDcsZDUKLSAgICBWWklQLjE2ICBkOSxkMTEKLSAgICBWWklQLjE2ICBkNixkNAotICAgIFZUUk4uMzIgIGQ4LGQ5Ci0gICAgVlRSTi4zMiAgZDUsZDQKLSAgICBWVFJOLjMyICBkMTAsZDExCi0gICAgVlRSTi4zMiAgZDcsZDYKLSAgICBWQUJELlU4ICBkMTMsZDQsZDgKLSAgICBWQUJELlU4ICBkMTIsZDUsZDQKLSAgICBWQUJELlU4ICBkMTgsZDksZDgKLSAgICBWQUJELlU4ICBkMTksZDYsZDQKLSAgICBUU1QgICAgICByMTIsIzB4ZmYKLSAgICBWQ0dULlU4ICBkMTYsZDAsZDEzCi0gICAgVk1BWC5VOCAgZDEyLGQxOCxkMTIKLSAgICBWQUJELlU4ICBkMTcsZDEwLGQ4Ci0gICAgVk1PVkVRLjMyIGQxNlswXSxyNgotICAgIFRTVCAgICAgIHIxMiwjMHhmZjAwCi0gICAgVkNHVC5VOCAgZDE5LGQyLGQxOQotICAgIFZDR1QuVTggIGQxMixkMixkMTIKLSAgICBWTU9WRVEuMzIgZDE2WzFdLHI2Ci0gICAgVkNHVC5VOCAgZDE3LGQyLGQxNwotICAgIFZBTkQgICAgIGQxNixkMTYsZDEyCi0gICAgVFNUICAgICAgcjEyLCM0Ci0gICAgVkFORCAgICAgZDEyLGQxNixkMTcKLSAgICBWQU5EICAgICBkMTcsZDE2LGQxOQotICAgIEJORSAgICAgIEwweDE3YwotICAgIEJMICAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKLSAgICBWWklQLjggICBkNyxkNgotICAgIFZaSVAuOCAgIGQzMCxkMjkKLSAgICBWWklQLjggICBkMjQsZDI1Ci0gICAgVlpJUC44ICAgZDEwLGQxMQotICAgIFZaSVAuMTYgIGQ3LGQzMAotICAgIEFERCAgICAgIHIxMCxyMCxyMQotICAgIFZaSVAuMTYgIGQyNCxkMTAKLSAgICBWWklQLjE2ICBkMjUsZDExCi0gICAgVlpJUC4xNiAgZDYsZDI5Ci0gICAgVlRSTi4zMiAgZDcsZDI0Ci0gICAgVlRSTi4zMiAgZDMwLGQxMAotICAgIFZUUk4uMzIgIGQ2LGQyNQotICAgIFZUUk4uMzIgIGQyOSxkMTEKLSAgICBWU1QxLjggICB7ZDd9LFtyMF0scjExCi0gICAgVlNUMS44ICAge2QyNH0sW3IxMF0scjExCi0gICAgVlNUMS44ICAge2QzMH0sW3IwXSxyMTEKLSAgICBWU1QxLjggICB7ZDEwfSxbcjEwXSxyMTEKLSAgICBWU1QxLjggICB7ZDZ9LFtyMF0scjExCi0gICAgVlNUMS44ICAge2QyNX0sW3IxMF0scjExCi0gICAgQUREUyAgICAgcjkscjkscjkKLSAgICBWU1QxLjggICB7ZDI5fSxbcjBdLHIxMQotICAgIEFERCAgICAgIHI1LHI1LCMyCi0gICAgVlNUMS44ICAge2QxMX0sW3IxMF0scjEKLSAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzMKLSAgICBWTEQxLjggICB7ZDBbXX0sW3I3XQotICAgIEFERCAgICAgIHIwLHIwLCM0Ci0gICAgVkxEMS44ICAge2QyW119LFtyOF0KLSAgICBCQ0MgICAgICBMMHgzOAotICAgIEIgICAgICAgIEwweDFmMAotTDB4MTYwOgotICAgIEFERCAgICAgIHIwLHIwLCM0Ci0gICAgQUREUyAgICAgcjkscjkscjkKLSAgICBWTEQxLjggICB7ZDBbXX0sW3I3XQotICAgIEFERCAgICAgIHI1LHI1LCM0Ci0gICAgVkxEMS44ICAge2QyW119LFtyOF0KLSAgICBCQ0MgICAgICBMMHgzOAotICAgIEIgICAgICAgIEwweDFmMAotTDB4MTdjOgotICAgIEJMICAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUKLSAgICBWWklQLjggICBkNyxkMzEKLSAgICBWWklQLjggICBkMzAsZDI5Ci0gICAgVlpJUC44ICAgZDI0LGQyNQotICAgIFZaSVAuOCAgIGQyOCxkMTEKLSAgICBWWklQLjE2ICBkNyxkMzAKLSAgICBBREQgICAgICByMTAscjAscjEKLSAgICBWWklQLjE2ICBkMjQsZDI4Ci0gICAgVlpJUC4xNiAgZDI1LGQxMQotICAgIFZaSVAuMTYgIGQzMSxkMjkKLSAgICBWVFJOLjMyICBkNyxkMjQKLSAgICBWVFJOLjMyICBkMzAsZDI4Ci0gICAgVlRSTi4zMiAgZDMxLGQyNQotICAgIFZUUk4uMzIgIGQyOSxkMTEKLSAgICBWU1QxLjggICB7ZDd9LFtyMF0scjExCi0gICAgVlNUMS44ICAge2QyNH0sW3IxMF0scjExCi0gICAgVlNUMS44ICAge2QzMH0sW3IwXSxyMTEKLSAgICBWU1QxLjggICB7ZDI4fSxbcjEwXSxyMTEKLSAgICBWU1QxLjggICB7ZDMxfSxbcjBdLHIxMQotICAgIFZTVDEuOCAgIHtkMjV9LFtyMTBdLHIxMQotICAgIEFERFMgICAgIHI5LHI5LHI5Ci0gICAgVlNUMS44ICAge2QyOX0sW3IwXSxyMTEKLSAgICBBREQgICAgICByNSxyNSwjNAotICAgIFZTVDEuOCAgIHtkMTF9LFtyMTBdLHIxMQotICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMwotICAgIFZMRDEuOCAgIHtkMFtdfSxbcjddCi0gICAgQUREICAgICAgcjAscjAsIzQKLSAgICBWTEQxLjggICB7ZDJbXX0sW3I4XQotICAgIEJDQyAgICAgIEwweDM4Ci1MMHgxZjA6Ci0gICAgU1VCICAgICAgcjQscjQsIzB4ZQotICAgIFNVQiAgICAgIHI1LHI1LCMweGUKLSAgICBTVUIgICAgICByMCxyMCwjMHgxMAotICAgIFZMRDEuOCAgIHtkMFtdfSxbcjJdCi0gICAgQUREICAgICAgcjAscjAscjEsTFNMICMzCi0gICAgVkxEMS44ICAge2QyW119LFtyM10KLSAgICBCTkUgICAgICBMMHgzOAotICAgIE1PViAgICAgIHIwLCMwCi0gICAgVlBPUCAgICAge2Q4LWQxNX0KLSAgICBQT1AgICAgICB7cjQtcjEyLHBjfQotCi0gICAgLmVuZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYV9zLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNGVhYmQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5TCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qCi0gKgotICovCi0KLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKLQotICAgIC5hcm0KLSAgICAuZnB1IG5lb24KLSAgICAudGV4dAotCi0gICAgLmdsb2JhbCBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYQotb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWE6Ci0gICAgUFVTSCAgICAge3I0LXIxMixscn0KLSAgICBWUFVTSCAgICB7ZDgtZDE1fQotICAgIFNVQiAgICAgIHNwLHNwLCMweDEwCi0gICAgTERSICAgICAgcjYsW3NwLCMweDc4XQotICAgIExEUiAgICAgIHI3LFtzcCwjMHg3Y10KLSAgICBMRFIgICAgICByNSxbc3AsIzB4ODBdCi0gICAgTERSICAgICAgcjQsW3NwLCMweDg0XQotICAgIEFERCAgICAgIHI2LHI2LHI3LExTTCAjMgotICAgIEFERCAgICAgIHIxMSxzcCwjMAotICAgIFZNT1YuSTE2IGQzMSwjMHgxNAotICAgIFZNT1YuSTE2IGQzMCwjMHg1Ci1MMHgyYzoKLSAgICBTVE0gICAgICByMTEse3IwLXIzfQotICAgIEFERCAgICAgIHBjLHBjLHI2LExTTCAjMgotICAgIEIgICAgICAgIEwweDNmMAotICAgIEIgICAgICAgIEwweDc4Ci0gICAgQiAgICAgICAgTDB4YTgKLSAgICBCICAgICAgICBMMHhkYwotICAgIEIgICAgICAgIEwweDEwMAotICAgIEIgICAgICAgIEwweDEzNAotICAgIEIgICAgICAgIEwweDE2OAotICAgIEIgICAgICAgIEwweDFhOAotICAgIEIgICAgICAgIEwweDFmMAotICAgIEIgICAgICAgIEwweDIzNAotICAgIEIgICAgICAgIEwweDI1OAotICAgIEIgICAgICAgIEwweDJiMAotICAgIEIgICAgICAgIEwweDJkOAotICAgIEIgICAgICAgIEwweDMzMAotICAgIEIgICAgICAgIEwweDM2NAotICAgIEIgICAgICAgIEwweDNhOAotICAgIEIgICAgICAgIEwweDNmMAotTDB4Nzg6Ci0gICAgQUREICAgICAgcjEyLHIwLHIxLExTTCAjMQotICAgIFZMRDEuOCAgIHtkOX0sW3IwXSxyMQotICAgIFZMRDEuOCAgIHtkMTF9LFtyMTJdLHIxCi0gICAgVkxEMS44ICAge2QxMH0sW3IwXQotICAgIFZMRDEuOCAgIHtkMTJ9LFtyMTJdCi0gICAgQUREICAgICAgcjEyLHIyLHIzLExTTCAjMQotICAgIFZTVDEuMzIgIHtkOVswXX0sW3IyXSxyMwotICAgIFZTVDEuMzIgIHtkMTFbMF19LFtyMTJdLHIzCi0gICAgVlNUMS4zMiAge2QxMFswXX0sW3IyXQotICAgIFZTVDEuMzIgIHtkMTJbMF19LFtyMTJdCi0gICAgQUREICAgICAgcjExLHNwLCMwCi0gICAgQiAgICAgICAgTDB4NDM0Ci1MMHhhODoKLSAgICBTVUIgICAgICByMCxyMCwjMgotICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCi0gICAgVlJIQURELlU4IGQyMixkMjIsZDE0Ci0gICAgVlJIQURELlU4IGQyNixkMjYsZDE4Ci0gICAgVlJIQURELlU4IGQyNCxkMjQsZDE2Ci0gICAgVlJIQURELlU4IGQyOCxkMjgsZDIwCi0gICAgQUREICAgICAgcjEyLHIyLHIzLExTTCAjMQotICAgIFZTVDEuMzIgIHtkMjJbMF19LFtyMl0scjMKLSAgICBWU1QxLjMyICB7ZDI2WzBdfSxbcjEyXSxyMwotICAgIFZTVDEuMzIgIHtkMjRbMF19LFtyMl0KLSAgICBWU1QxLjMyICB7ZDI4WzBdfSxbcjEyXQotICAgIEFERCAgICAgIHIxMSxzcCwjMAotICAgIEIgICAgICAgIEwweDQzNAotTDB4ZGM6Ci0gICAgU1VCICAgICAgcjAscjAsIzIKLSAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQotICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKLSAgICBWU1QxLjMyICB7ZDIyWzBdfSxbcjJdLHIzCi0gICAgVlNUMS4zMiAge2QyNlswXX0sW3IxMl0scjMKLSAgICBWU1QxLjMyICB7ZDI0WzBdfSxbcjJdCi0gICAgVlNUMS4zMiAge2QyOFswXX0sW3IxMl0KLSAgICBBREQgICAgICByMTEsc3AsIzAKLSAgICBCICAgICAgICBMMHg0MzQKLUwweDEwMDoKLSAgICBTVUIgICAgICByMCxyMCwjMgotICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCi0gICAgVlJIQURELlU4IGQyMixkMjIsZDE1Ci0gICAgVlJIQURELlU4IGQyNixkMjYsZDE5Ci0gICAgVlJIQURELlU4IGQyNCxkMjQsZDE3Ci0gICAgVlJIQURELlU4IGQyOCxkMjgsZDIxCi0gICAgQUREICAgICAgcjEyLHIyLHIzLExTTCAjMQotICAgIFZTVDEuMzIgIHtkMjJbMF19LFtyMl0scjMKLSAgICBWU1QxLjMyICB7ZDI2WzBdfSxbcjEyXSxyMwotICAgIFZTVDEuMzIgIHtkMjRbMF19LFtyMl0KLSAgICBWU1QxLjMyICB7ZDI4WzBdfSxbcjEyXQotICAgIEFERCAgICAgIHIxMSxzcCwjMAotICAgIEIgICAgICAgIEwweDQzNAotTDB4MTM0OgotICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMQotICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCi0gICAgVlJIQURELlU4IGQwLGQwLGQ5Ci0gICAgVlJIQURELlU4IGQ0LGQ0LGQxMQotICAgIFZSSEFERC5VOCBkMixkMixkMTAKLSAgICBWUkhBREQuVTggZDYsZDYsZDEyCi0gICAgQUREICAgICAgcjEyLHIyLHIzLExTTCAjMQotICAgIFZTVDEuMzIgIHtkMFswXX0sW3IyXSxyMwotICAgIFZTVDEuMzIgIHtkNFswXX0sW3IxMl0scjMKLSAgICBWU1QxLjMyICB7ZDJbMF19LFtyMl0KLSAgICBWU1QxLjMyICB7ZDZbMF19LFtyMTJdCi0gICAgQUREICAgICAgcjExLHNwLCMwCi0gICAgQiAgICAgICAgTDB4NDM0Ci1MMHgxNjg6Ci0gICAgTU9WICAgICAgcjgscjAKLSAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzEKLSAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQotICAgIFNVQiAgICAgIHIwLHI4LCMyCi0gICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKLSAgICBWUkhBREQuVTggZDIyLGQyMixkMAotICAgIFZSSEFERC5VOCBkMjYsZDI2LGQ0Ci0gICAgVlJIQURELlU4IGQyNCxkMjQsZDIKLSAgICBWUkhBREQuVTggZDI4LGQyOCxkNgotICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKLSAgICBWU1QxLjMyICB7ZDIyWzBdfSxbcjJdLHIzCi0gICAgVlNUMS4zMiAge2QyNlswXX0sW3IxMl0scjMKLSAgICBWU1QxLjMyICB7ZDI0WzBdfSxbcjJdCi0gICAgVlNUMS4zMiAge2QyOFswXX0sW3IxMl0KLSAgICBBREQgICAgICByMTEsc3AsIzAKLSAgICBCICAgICAgICBMMHg0MzQKLUwweDFhODoKLSAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzEKLSAgICBTVUIgICAgICByMCxyMCwjMgotICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZQotICAgIFZRUlNIUlVOLlMxNiBkMTQscTcsIzUKLSAgICBWUVJTSFJVTi5TMTYgZDE2LHE4LCM1Ci0gICAgVlFSU0hSVU4uUzE2IGQxOCxxOSwjNQotICAgIFZRUlNIUlVOLlMxNiBkMjAscTEwLCM1Ci0gICAgVlJIQURELlU4IGQwLGQwLGQxNAotICAgIFZSSEFERC5VOCBkNCxkNCxkMTgKLSAgICBWUkhBREQuVTggZDIsZDIsZDE2Ci0gICAgVlJIQURELlU4IGQ2LGQ2LGQyMAotICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKLSAgICBWU1QxLjMyICB7ZDBbMF19LFtyMl0scjMKLSAgICBWU1QxLjMyICB7ZDRbMF19LFtyMTJdLHIzCi0gICAgVlNUMS4zMiAge2QyWzBdfSxbcjJdCi0gICAgVlNUMS4zMiAge2Q2WzBdfSxbcjEyXQotICAgIEFERCAgICAgIHIxMSxzcCwjMAotICAgIEIgICAgICAgIEwweDQzNAotTDB4MWYwOgotICAgIE1PViAgICAgIHI4LHIwCi0gICAgQUREICAgICAgcjAscjAsIzEKLSAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzEKLSAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQotICAgIFNVQiAgICAgIHIwLHI4LCMyCi0gICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKLSAgICBWUkhBREQuVTggZDIyLGQyMixkMAotICAgIFZSSEFERC5VOCBkMjYsZDI2LGQ0Ci0gICAgVlJIQURELlU4IGQyNCxkMjQsZDIKLSAgICBWUkhBREQuVTggZDI4LGQyOCxkNgotICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKLSAgICBWU1QxLjMyICB7ZDIyWzBdfSxbcjJdLHIzCi0gICAgVlNUMS4zMiAge2QyNlswXX0sW3IxMl0scjMKLSAgICBWU1QxLjMyICB7ZDI0WzBdfSxbcjJdCi0gICAgVlNUMS4zMiAge2QyOFswXX0sW3IxMl0KLSAgICBBREQgICAgICByMTEsc3AsIzAKLSAgICBCICAgICAgICBMMHg0MzQKLUwweDIzNDoKLSAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzEKLSAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQotICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKLSAgICBWU1QxLjMyICB7ZDBbMF19LFtyMl0scjMKLSAgICBWU1QxLjMyICB7ZDRbMF19LFtyMTJdLHIzCi0gICAgVlNUMS4zMiAge2QyWzBdfSxbcjJdCi0gICAgVlNUMS4zMiAge2Q2WzBdfSxbcjEyXQotICAgIEFERCAgICAgIHIxMSxzcCwjMAotICAgIEIgICAgICAgIEwweDQzNAotTDB4MjU4OgotICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMQotICAgIFNVQiAgICAgIHIwLHIwLCMyCi0gICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlCi0gICAgVkVYVC44ICAgZDE4LGQxOCxkMTksIzQKLSAgICBWRVhULjggICBkMjAsZDIwLGQyMSwjNAotICAgIFZFWFQuOCAgIGQyMixkMjIsZDIzLCM0Ci0gICAgVkVYVC44ICAgZDI0LGQyNCxkMjUsIzQKLSAgICBWUVJTSFJVTi5TMTYgZDE0LHE5LCM1Ci0gICAgVlFSU0hSVU4uUzE2IGQxNixxMTAsIzUKLSAgICBWUVJTSFJVTi5TMTYgZDE4LHExMSwjNQotICAgIFZRUlNIUlVOLlMxNiBkMjAscTEyLCM1Ci0gICAgVlJIQURELlU4IGQwLGQwLGQxNAotICAgIFZSSEFERC5VOCBkNCxkNCxkMTgKLSAgICBWUkhBREQuVTggZDIsZDIsZDE2Ci0gICAgVlJIQURELlU4IGQ2LGQ2LGQyMAotICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKLSAgICBWU1QxLjMyICB7ZDBbMF19LFtyMl0scjMKLSAgICBWU1QxLjMyICB7ZDRbMF19LFtyMTJdLHIzCi0gICAgVlNUMS4zMiAge2QyWzBdfSxbcjJdCi0gICAgVlNUMS4zMiAge2Q2WzBdfSxbcjEyXQotICAgIEFERCAgICAgIHIxMSxzcCwjMAotICAgIEIgICAgICAgIEwweDQzNAotTDB4MmIwOgotICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMQotICAgIFNVQiAgICAgIHIwLHIwLCMyCi0gICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlCi0gICAgQUREICAgICAgcjEyLHIyLHIzLExTTCAjMQotICAgIFZTVDEuMzIgIHtkMFswXX0sW3IyXSxyMwotICAgIFZTVDEuMzIgIHtkNFswXX0sW3IxMl0scjMKLSAgICBWU1QxLjMyICB7ZDJbMF19LFtyMl0KLSAgICBWU1QxLjMyICB7ZDZbMF19LFtyMTJdCi0gICAgQUREICAgICAgcjExLHNwLCMwCi0gICAgQiAgICAgICAgTDB4NDM0Ci1MMHgyZDg6Ci0gICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCi0gICAgU1VCICAgICAgcjAscjAsIzIKLSAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKLSAgICBWRVhULjggICBkMTgsZDE4LGQxOSwjNgotICAgIFZFWFQuOCAgIGQyMCxkMjAsZDIxLCM2Ci0gICAgVkVYVC44ICAgZDIyLGQyMixkMjMsIzYKLSAgICBWRVhULjggICBkMjQsZDI0LGQyNSwjNgotICAgIFZRUlNIUlVOLlMxNiBkMTQscTksIzUKLSAgICBWUVJTSFJVTi5TMTYgZDE2LHExMCwjNQotICAgIFZRUlNIUlVOLlMxNiBkMTgscTExLCM1Ci0gICAgVlFSU0hSVU4uUzE2IGQyMCxxMTIsIzUKLSAgICBWUkhBREQuVTggZDAsZDAsZDE0Ci0gICAgVlJIQURELlU4IGQ0LGQ0LGQxOAotICAgIFZSSEFERC5VOCBkMixkMixkMTYKLSAgICBWUkhBREQuVTggZDYsZDYsZDIwCi0gICAgQUREICAgICAgcjEyLHIyLHIzLExTTCAjMQotICAgIFZTVDEuMzIgIHtkMFswXX0sW3IyXSxyMwotICAgIFZTVDEuMzIgIHtkNFswXX0sW3IxMl0scjMKLSAgICBWU1QxLjMyICB7ZDJbMF19LFtyMl0KLSAgICBWU1QxLjMyICB7ZDZbMF19LFtyMTJdCi0gICAgQUREICAgICAgcjExLHNwLCMwCi0gICAgQiAgICAgICAgTDB4NDM0Ci1MMHgzMzA6Ci0gICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCi0gICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKLSAgICBWUkhBREQuVTggZDAsZDAsZDEwCi0gICAgVlJIQURELlU4IGQ0LGQ0LGQxMgotICAgIFZSSEFERC5VOCBkMixkMixkMTEKLSAgICBWUkhBREQuVTggZDYsZDYsZDEzCi0gICAgQUREICAgICAgcjEyLHIyLHIzLExTTCAjMQotICAgIFZTVDEuMzIgIHtkMFswXX0sW3IyXSxyMwotICAgIFZTVDEuMzIgIHtkNFswXX0sW3IxMl0scjMKLSAgICBWU1QxLjMyICB7ZDJbMF19LFtyMl0KLSAgICBWU1QxLjMyICB7ZDZbMF19LFtyMTJdCi0gICAgQUREICAgICAgcjExLHNwLCMwCi0gICAgQiAgICAgICAgTDB4NDM0Ci1MMHgzNjQ6Ci0gICAgTU9WICAgICAgcjgscjAKLSAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzEKLSAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQotICAgIEFERCAgICAgIHIwLHI4LHIxCi0gICAgU1VCICAgICAgcjAscjAsIzIKLSAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQotICAgIFZSSEFERC5VOCBkMjIsZDIyLGQwCi0gICAgVlJIQURELlU4IGQyNixkMjYsZDQKLSAgICBWUkhBREQuVTggZDI0LGQyNCxkMgotICAgIFZSSEFERC5VOCBkMjgsZDI4LGQ2Ci0gICAgQUREICAgICAgcjEyLHIyLHIzLExTTCAjMQotICAgIFZTVDEuMzIgIHtkMjJbMF19LFtyMl0scjMKLSAgICBWU1QxLjMyICB7ZDI2WzBdfSxbcjEyXSxyMwotICAgIFZTVDEuMzIgIHtkMjRbMF19LFtyMl0KLSAgICBWU1QxLjMyICB7ZDI4WzBdfSxbcjEyXQotICAgIEFERCAgICAgIHIxMSxzcCwjMAotICAgIEIgICAgICAgIEwweDQzNAotTDB4M2E4OgotICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMQotICAgIFNVQiAgICAgIHIwLHIwLCMyCi0gICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlCi0gICAgVlFSU0hSVU4uUzE2IGQxNCxxOCwjNQotICAgIFZRUlNIUlVOLlMxNiBkMTYscTksIzUKLSAgICBWUVJTSFJVTi5TMTYgZDE4LHExMCwjNQotICAgIFZRUlNIUlVOLlMxNiBkMjAscTExLCM1Ci0gICAgVlJIQURELlU4IGQwLGQwLGQxNAotICAgIFZSSEFERC5VOCBkNCxkNCxkMTgKLSAgICBWUkhBREQuVTggZDIsZDIsZDE2Ci0gICAgVlJIQURELlU4IGQ2LGQ2LGQyMAotICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKLSAgICBWU1QxLjMyICB7ZDBbMF19LFtyMl0scjMKLSAgICBWU1QxLjMyICB7ZDRbMF19LFtyMTJdLHIzCi0gICAgVlNUMS4zMiAge2QyWzBdfSxbcjJdCi0gICAgVlNUMS4zMiAge2Q2WzBdfSxbcjEyXQotICAgIEFERCAgICAgIHIxMSxzcCwjMAotICAgIEIgICAgICAgIEwweDQzNAotTDB4M2YwOgotICAgIE1PViAgICAgIHI4LHIwCi0gICAgQUREICAgICAgcjAscjAsIzEKLSAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzEKLSAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQotICAgIEFERCAgICAgIHIwLHI4LHIxCi0gICAgU1VCICAgICAgcjAscjAsIzIKLSAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQotICAgIFZSSEFERC5VOCBkMjIsZDIyLGQwCi0gICAgVlJIQURELlU4IGQyNixkMjYsZDQKLSAgICBWUkhBREQuVTggZDI0LGQyNCxkMgotICAgIFZSSEFERC5VOCBkMjgsZDI4LGQ2Ci0gICAgQUREICAgICAgcjEyLHIyLHIzLExTTCAjMQotICAgIFZTVDEuMzIgIHtkMjJbMF19LFtyMl0scjMKLSAgICBWU1QxLjMyICB7ZDI2WzBdfSxbcjEyXSxyMwotICAgIFZTVDEuMzIgIHtkMjRbMF19LFtyMl0KLSAgICBWU1QxLjMyICB7ZDI4WzBdfSxbcjEyXQotICAgIEFERCAgICAgIHIxMSxzcCwjMAotTDB4NDM0OgotICAgIExETSAgICAgIHIxMSx7cjAtcjN9Ci0gICAgU1VCUyAgICAgcjUscjUsIzQKLSAgICBBREQgICAgICByMCxyMCwjNAotICAgIEFERCAgICAgIHIyLHIyLCM0Ci0gICAgQkdUICAgICAgTDB4MmMKLSAgICBTVUJTICAgICByNCxyNCwjNAotICAgIExEUiAgICAgIHI1LFtzcCwjMHg4MF0KLSAgICBBREQgICAgICByMTEsc3AsIzAKLSAgICBBREQgICAgICByMCxyMCxyMSxMU0wgIzIKLSAgICBBREQgICAgICByMixyMixyMyxMU0wgIzIKLSAgICBTVUIgICAgICByMCxyMCxyNQotICAgIFNVQiAgICAgIHIyLHIyLHI1Ci0gICAgQkdUICAgICAgTDB4MmMKLSAgICBNT1YgICAgICByMCwjMAotICAgIEFERCAgICAgIHNwLHNwLCMweDEwCi0gICAgVlBPUCAgICAge2Q4LWQxNX0KLSAgICBQT1AgICAgICB7cjQtcjEyLHBjfQotCi0gICAgLmVuZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDhfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBkMTM1MC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDhfcy5TCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qCi0gKgotICovCi0KLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKLQotICAgIC5hcm0KLSAgICAuZnB1IG5lb24KLSAgICAudGV4dAotICAgIC5hbGlnbiA0Ci0KLWFybVZDTTRQMTBfcEluZGV4VGFibGU4eDg6Ci0gICAgLndvcmQgIE9NWF9WQ19DSFJPTUFfREMtKFAwKzgpLCAgICBPTVhfVkNfQ0hST01BX0hPUi0oUDArOCkKLSAgICAud29yZCAgT01YX1ZDX0NIUk9NQV9WRVJULShQMCs4KSwgIE9NWF9WQ19DSFJPTUFfUExBTkUtKFAwKzgpCi0KLWFybVZDTTRQMTBfTXVsdGlwbGllclRhYmxlQ2hyb21hOHg4OgotICAgIC5od29yZCAgIDMsIDIsIDEsNAotICAgIC5od29yZCAgLTMsLTIsLTEsMAotICAgIC5od29yZCAgIDEsIDIsIDMsNAotCi0gICAgLmdsb2JhbCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDgKLW9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4ODoKLSAgICBQVVNIICAgICB7cjQtcjEwLGxyfQotICAgIFZQVVNIICAgIHtkOC1kMTV9Ci0gICAgQURSICAgICAgcjgsIGFybVZDTTRQMTBfcEluZGV4VGFibGU4eDgKLSAgICBMRFIgICAgICByNixbc3AsIzB4NjhdCi0gICAgTERSICAgICAgcjQsW3NwLCMweDYwXQotICAgIExEUiAgICAgIHI1LFtzcCwjMHg2NF0KLSAgICBMRFIgICAgICByNyxbc3AsIzB4NmNdCi0gICAgTERSICAgICAgcjgsW3I4LHI2LExTTCAjMl0KLVAwOiBBREQgICAgICBwYyxyOAotCi1PTVhfVkNfQ0hST01BX0RDOgotICAgIFRTVCAgICAgIHI3LCMyCi0gICAgQkVRICAgICAgTDB4ZTgKLSAgICBBREQgICAgICByOSxyMCxyNAotICAgIEFERCAgICAgIHIxMCxyNCxyNAotICAgIFZMRDEuOCAgIHtkMVswXX0sW3IwXSxyMTAKLSAgICBWTEQxLjggICB7ZDFbMV19LFtyOV0scjEwCi0gICAgVkxEMS44ICAge2QxWzJdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkMVszXX0sW3I5XSxyMTAKLSAgICBWTEQxLjggICB7ZDFbNF19LFtyMF0scjEwCi0gICAgVkxEMS44ICAge2QxWzVdfSxbcjldLHIxMAotICAgIFZMRDEuOCAgIHtkMVs2XX0sW3IwXSxyMTAKLSAgICBWTEQxLjggICB7ZDFbN119LFtyOV0KLSAgICBUU1QgICAgICByNywjMQotICAgIEJFUSAgICAgIEwweGNjCi0gICAgVkxEMS44ICAge2QwfSxbcjFdCi0gICAgTU9WICAgICAgcjAsIzAKLSAgICBWUEFEREwuVTggZDIsZDAKLSAgICBWUEFEREwuVTE2IGQzLGQyCi0gICAgVlBBRERMLlU4IGQyLGQxCi0gICAgVlBBRERMLlUxNiBkMSxkMgotICAgIFZBREQuSTMyIGQyLGQzLGQxCi0gICAgVlJTSFIuVTMyIGQyLGQyLCMzCi0gICAgVlJTSFIuVTMyIGQzLGQzLCMyCi0gICAgVlJTSFIuVTMyIGQxLGQxLCMyCi0gICAgVk1PVi5JOCAgZDUsIzB4YwotICAgIFZNT1YuSTggIGQ2LCMweDQKLSAgICBWU0hMLkk2NCBkNSxkNSwjMzIKLSAgICBWU0hSLlU2NCBkNixkNiwjMzIKLSAgICBWQURELkk4ICBkNixkNixkNQotICAgIFZUQkwuOCAgIGQwLHtkMi1kM30sZDUKLSAgICBWVEJMLjggICBkNCx7ZDEtZDJ9LGQ2Ci1MMHg5YzoKLSAgICBBREQgICAgICByOSxyMyxyNQotICAgIEFERCAgICAgIHIxMCxyNSxyNQotICAgIFZTVDEuOCAgIHtkMH0sW3IzXSxyMTAKLSAgICBWU1QxLjggICB7ZDB9LFtyOV0scjEwCi0gICAgVlNUMS44ICAge2QwfSxbcjNdLHIxMAotICAgIFZTVDEuOCAgIHtkMH0sW3I5XSxyMTAKLSAgICBWU1QxLjggICB7ZDR9LFtyM10scjEwCi0gICAgVlNUMS44ICAge2Q0fSxbcjldLHIxMAotICAgIFZTVDEuOCAgIHtkNH0sW3IzXSxyMTAKLSAgICBWU1QxLjggICB7ZDR9LFtyOV0KLSAgICBWUE9QICAgICB7ZDgtZDE1fQotICAgIFBPUCAgICAgIHtyNC1yMTAscGN9Ci1MMHhjYzoKLSAgICBNT1YgICAgICByMCwjMAotICAgIFZQQURETC5VOCBkMixkMQotICAgIFZQQURETC5VMTYgZDEsZDIKLSAgICBWUlNIUi5VMzIgZDEsZDEsIzIKLSAgICBWRFVQLjggICBkMCxkMVswXQotICAgIFZEVVAuOCAgIGQ0LGQxWzRdCi0gICAgQiAgICAgICAgTDB4OWMKLUwweGU4OgotICAgIFRTVCAgICAgIHI3LCMxCi0gICAgQkVRICAgICAgTDB4MTE0Ci0gICAgVkxEMS44ICAge2QwfSxbcjFdCi0gICAgTU9WICAgICAgcjAsIzAKLSAgICBWUEFEREwuVTggZDIsZDAKLSAgICBWUEFEREwuVTE2IGQzLGQyCi0gICAgVlJTSFIuVTMyIGQzLGQzLCMyCi0gICAgVk1PVi5JOCAgZDUsIzB4NAotICAgIFZTSEwuSTY0IGQ1LGQ1LCMzMgotICAgIFZUQkwuOCAgIGQwLHtkM30sZDUKLSAgICBCICAgICAgICBMMHgxMWMKLUwweDExNDoKLSAgICBWTU9WLkk4ICBkMCwjMHg4MAotICAgIE1PViAgICAgIHIwLCMwCi1MMHgxMWM6Ci0gICAgQUREICAgICAgcjkscjMscjUKLSAgICBBREQgICAgICByMTAscjUscjUKLSAgICBWU1QxLjggICB7ZDB9LFtyM10scjEwCi0gICAgVlNUMS44ICAge2QwfSxbcjldLHIxMAotICAgIFZTVDEuOCAgIHtkMH0sW3IzXSxyMTAKLSAgICBWU1QxLjggICB7ZDB9LFtyOV0scjEwCi0gICAgVlNUMS44ICAge2QwfSxbcjNdLHIxMAotICAgIFZTVDEuOCAgIHtkMH0sW3I5XSxyMTAKLSAgICBWU1QxLjggICB7ZDB9LFtyM10scjEwCi0gICAgVlNUMS44ICAge2QwfSxbcjldCi0gICAgVlBPUCAgICAge2Q4LWQxNX0KLSAgICBQT1AgICAgICB7cjQtcjEwLHBjfQotT01YX1ZDX0NIUk9NQV9WRVJUOgotICAgIFZMRDEuOCAgIHtkMH0sW3IxXQotICAgIE1PViAgICAgIHIwLCMwCi0gICAgQiAgICAgICAgTDB4MTFjCi1PTVhfVkNfQ0hST01BX0hPUjoKLSAgICBBREQgICAgICByOSxyMCxyNAotICAgIEFERCAgICAgIHIxMCxyNCxyNAotICAgIFZMRDEuOCAgIHtkMFtdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkMVtdfSxbcjldLHIxMAotICAgIFZMRDEuOCAgIHtkMltdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkM1tdfSxbcjldLHIxMAotICAgIFZMRDEuOCAgIHtkNFtdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkNVtdfSxbcjldLHIxMAotICAgIFZMRDEuOCAgIHtkNltdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkN1tdfSxbcjldCi0gICAgQiAgICAgICAgTDB4MjhjCi1PTVhfVkNfQ0hST01BX1BMQU5FOgotICAgIEFERCAgICAgIHI5LHIwLHI0Ci0gICAgQUREICAgICAgcjEwLHI0LHI0Ci0gICAgVkxEMS44ICAge2QwfSxbcjFdCi0gICAgVkxEMS44ICAge2QyWzBdfSxbcjJdCi0gICAgVkxEMS44ICAge2QxWzBdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkMVsxXX0sW3I5XSxyMTAKLSAgICBWTEQxLjggICB7ZDFbMl19LFtyMF0scjEwCi0gICAgVkxEMS44ICAge2QxWzNdfSxbcjldLHIxMAotICAgIFZMRDEuOCAgIHtkMVs0XX0sW3IwXSxyMTAKLSAgICBWTEQxLjggICB7ZDFbNV19LFtyOV0scjEwCi0gICAgVkxEMS44ICAge2QxWzZdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkMVs3XX0sW3I5XQotICAgIFZSRVY2NC44IGQzLGQwCi0gICAgVlNVQkwuVTggcTMsZDMsZDIKLSAgICBWU0hSLlU2NCBkMyxkMywjOAotICAgIFZTVUJMLlU4IHEyLGQzLGQwCi0gICAgVlJFVjY0LjggZDMsZDEKLSAgICBWU1VCTC5VOCBxNyxkMyxkMgotICAgIFZTSFIuVTY0IGQzLGQzLCM4Ci0gICAgVlNVQkwuVTggcTYsZDMsZDEKLSAgICBBRFIgICAgICByMiwgYXJtVkNNNFAxMF9NdWx0aXBsaWVyVGFibGVDaHJvbWE4eDgKLSAgICBWU0hMLkk2NCBkNCxkNCwjMTYKLSAgICBWRVhULjggICBkOSxkNCxkNiwjMgotICAgIFZMRDEuMTYgIHtkMTB9LFtyMl0hCi0gICAgVlNITC5JNjQgZDEyLGQxMiwjMTYKLSAgICBWRVhULjggICBkMTYsZDEyLGQxNCwjMgotICAgIFZNVUwuSTE2IGQxMSxkOSxkMTAKLSAgICBWTVVMLkkxNiBkMyxkMTYsZDEwCi0gICAgVlBBREQuSTE2IGQzLGQxMSxkMwotICAgIFZQQURETC5TMTYgZDMsZDMKLSAgICBWU0hMLkkzMiBkMixkMywjNAotICAgIFZBREQuSTMyIGQzLGQzLGQyCi0gICAgVkxEMS4xNiAge2QxMCxkMTF9LFtyMl0KLSAgICBWUlNIUi5TMzIgZDMsZDMsIzUKLSAgICBWQURETC5VOCBxMCxkMCxkMQotICAgIFZEVVAuMTYgIHEwLGQxWzNdCi0gICAgVlNITC5JMTYgcTAscTAsIzQKLSAgICBWRFVQLjE2ICBxMixkM1swXQotICAgIFZEVVAuMTYgIHEzLGQzWzJdCi0gICAgVk1VTC5JMTYgcTIscTIscTUKLSAgICBWTVVMLkkxNiBxMyxxMyxxNQotICAgIFZBREQuSTE2IHEyLHEyLHEwCi0gICAgVkRVUC4xNiAgcTAsZDZbMF0KLSAgICBWRFVQLjE2ICBxMSxkNlsxXQotICAgIFZEVVAuMTYgIHE0LGQ2WzJdCi0gICAgVkRVUC4xNiAgcTUsZDZbM10KLSAgICBWRFVQLjE2ICBxNixkN1swXQotICAgIFZEVVAuMTYgIHE3LGQ3WzFdCi0gICAgVkRVUC4xNiAgcTgsZDdbMl0KLSAgICBWRFVQLjE2ICBxOSxkN1szXQotICAgIFZBREQuSTE2IHEwLHEyLHEwCi0gICAgVkFERC5JMTYgcTEscTIscTEKLSAgICBWQURELkkxNiBxNCxxMixxNAotICAgIFZBREQuSTE2IHE1LHEyLHE1Ci0gICAgVkFERC5JMTYgcTYscTIscTYKLSAgICBWQURELkkxNiBxNyxxMixxNwotICAgIFZBREQuSTE2IHE4LHEyLHE4Ci0gICAgVkFERC5JMTYgcTkscTIscTkKLSAgICBWUVJTSFJVTi5TMTYgZDAscTAsIzUKLSAgICBWUVJTSFJVTi5TMTYgZDEscTEsIzUKLSAgICBWUVJTSFJVTi5TMTYgZDIscTQsIzUKLSAgICBWUVJTSFJVTi5TMTYgZDMscTUsIzUKLSAgICBWUVJTSFJVTi5TMTYgZDQscTYsIzUKLSAgICBWUVJTSFJVTi5TMTYgZDUscTcsIzUKLSAgICBWUVJTSFJVTi5TMTYgZDYscTgsIzUKLSAgICBWUVJTSFJVTi5TMTYgZDcscTksIzUKLUwweDI4YzoKLSAgICBBREQgICAgICByOSxyMyxyNQotICAgIEFERCAgICAgIHIxMCxyNSxyNQotICAgIFZTVDEuOCAgIHtkMH0sW3IzXSxyMTAKLSAgICBWU1QxLjggICB7ZDF9LFtyOV0scjEwCi0gICAgVlNUMS44ICAge2QyfSxbcjNdLHIxMAotICAgIFZTVDEuOCAgIHtkM30sW3I5XSxyMTAKLSAgICBWU1QxLjggICB7ZDR9LFtyM10scjEwCi0gICAgVlNUMS44ICAge2Q1fSxbcjldLHIxMAotICAgIFZTVDEuOCAgIHtkNn0sW3IzXSxyMTAKLSAgICBWU1QxLjggICB7ZDd9LFtyOV0KLSAgICBNT1YgICAgICByMCwjMAotICAgIFZQT1AgICAgIHtkOC1kMTV9Ci0gICAgUE9QICAgICAge3I0LXIxMCxwY30KLQotICAgIC5lbmQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTZfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTZfcy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDQ0NjM2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MuUworKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotLyoKLSAqCi0gKi8KLQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQotCi0gICAgLmFybQotICAgIC5mcHUgbmVvbgotCi0gICAgLnRleHQKLSAgICAuYWxpZ24gNAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFRoaXMgdGFibGUgZm9yIGltcGxlbWVudGluZyBzd2l0Y2ggY2FzZSBvZiBDIGluIGFzbSBieQotOy8vIHRoZSBtZWh0b2Qgb2YgdHdvIGxldmVscyBvZiBpbmRleGluZy4KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotYXJtVkNNNFAxMF9wSW5kZXhUYWJsZTE2eDE2OgotICAgIC53b3JkICBPTVhfVkNfMTZYMTZfVkVSVC0oUDArOCksIE9NWF9WQ18xNlgxNl9IT1ItKFAwKzgpCi0gICAgLndvcmQgIE9NWF9WQ18xNlgxNl9EQy0oUDArOCksICAgT01YX1ZDXzE2WDE2X1BMQU5FLShQMCs4KQotCi0KLWFybVZDTTRQMTBfTXVsdGlwbGllclRhYmxlMTZ4MTY6Ci0gICAgLmh3b3JkICAgNywgIDYsICA1LCAgNCwgIDMsICAyLCAgMSwgIDgKLSAgICAuaHdvcmQgICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNwotICAgIC5od29yZCAgIDgsICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1Ci0KLQotICAgIC5nbG9iYWwgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYKLW9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2OgotICAgIFBVU0ggICAgIHtyNC1yMTIsbHJ9Ci0gICAgVlBVU0ggICAge2Q4LWQxNX0KLSAgICBBRFIgICAgICByOSwgYXJtVkNNNFAxMF9wSW5kZXhUYWJsZTE2eDE2Ci0gICAgTERSICAgICAgcjYsW3NwLCMweDcwXQotICAgIExEUiAgICAgIHI0LFtzcCwjMHg2OF0KLSAgICBMRFIgICAgICByNSxbc3AsIzB4NmNdCi0gICAgTERSICAgICAgcjcsW3NwLCMweDc0XQotICAgIE1PViAgICAgIHIxMiwjMHgxMAotICAgIExEUiAgICAgIHI5LFtyOSxyNixMU0wgIzJdCi1QMDogQUREICAgICAgcGMscjkKLU9NWF9WQ18xNlgxNl9WRVJUOgotICAgIFZMRDEuOCAgIHtkMCxkMX0sW3IxXQotICAgIEFERCAgICAgIHI4LHIzLHI1Ci0gICAgQUREICAgICAgcjEwLHI1LHI1Ci0gICAgVlNUMS44ICAge2QwLGQxfSxbcjNdLHIxMAotICAgIFZTVDEuOCAgIHtkMCxkMX0sW3I4XSxyMTAKLSAgICBWU1QxLjggICB7ZDAsZDF9LFtyM10scjEwCi0gICAgVlNUMS44ICAge2QwLGQxfSxbcjhdLHIxMAotICAgIFZTVDEuOCAgIHtkMCxkMX0sW3IzXSxyMTAKLSAgICBWU1QxLjggICB7ZDAsZDF9LFtyOF0scjEwCi0gICAgVlNUMS44ICAge2QwLGQxfSxbcjNdLHIxMAotICAgIFZTVDEuOCAgIHtkMCxkMX0sW3I4XSxyMTAKLSAgICBWU1QxLjggICB7ZDAsZDF9LFtyM10scjEwCi0gICAgVlNUMS44ICAge2QwLGQxfSxbcjhdLHIxMAotICAgIFZTVDEuOCAgIHtkMCxkMX0sW3IzXSxyMTAKLSAgICBWU1QxLjggICB7ZDAsZDF9LFtyOF0scjEwCi0gICAgVlNUMS44ICAge2QwLGQxfSxbcjNdLHIxMAotICAgIFZTVDEuOCAgIHtkMCxkMX0sW3I4XSxyMTAKLSAgICBWU1QxLjggICB7ZDAsZDF9LFtyM10KLSAgICBWU1QxLjggICB7ZDAsZDF9LFtyOF0KLSAgICBNT1YgICAgICByMCwjMAotICAgIFZQT1AgICAgIHtkOC1kMTV9Ci0gICAgUE9QICAgICAge3I0LXIxMixwY30KLU9NWF9WQ18xNlgxNl9IT1I6Ci0gICAgQUREICAgICAgcjgscjAscjQKLSAgICBBREQgICAgICByNCxyNCxyNAotICAgIEFERCAgICAgIHIxMSxyMyxyNQotICAgIEFERCAgICAgIHI1LHI1LHI1Ci1MMHg4YzoKLSAgICBWTEQxLjggICB7ZDJbXSxkM1tdfSxbcjBdLHI0Ci0gICAgVkxEMS44ICAge2QwW10sZDFbXX0sW3I4XSxyNAotICAgIFNVQlMgICAgIHIxMixyMTIsIzgKLSAgICBWU1QxLjggICB7ZDIsZDN9LFtyM10scjUKLSAgICBWU1QxLjggICB7ZDAsZDF9LFtyMTFdLHI1Ci0gICAgVkxEMS44ICAge2QyW10sZDNbXX0sW3IwXSxyNAotICAgIFZMRDEuOCAgIHtkMFtdLGQxW119LFtyOF0scjQKLSAgICBWU1QxLjggICB7ZDIsZDN9LFtyM10scjUKLSAgICBWU1QxLjggICB7ZDAsZDF9LFtyMTFdLHI1Ci0gICAgVkxEMS44ICAge2QyW10sZDNbXX0sW3IwXSxyNAotICAgIFZMRDEuOCAgIHtkMFtdLGQxW119LFtyOF0scjQKLSAgICBWU1QxLjggICB7ZDIsZDN9LFtyM10scjUKLSAgICBWU1QxLjggICB7ZDAsZDF9LFtyMTFdLHI1Ci0gICAgVkxEMS44ICAge2QyW10sZDNbXX0sW3IwXSxyNAotICAgIFZMRDEuOCAgIHtkMFtdLGQxW119LFtyOF0scjQKLSAgICBWU1QxLjggICB7ZDIsZDN9LFtyM10scjUKLSAgICBWU1QxLjggICB7ZDAsZDF9LFtyMTFdLHI1Ci0gICAgQk5FICAgICAgTDB4OGMKLSAgICBNT1YgICAgICByMCwjMAotICAgIFZQT1AgICAgIHtkOC1kMTV9Ci0gICAgUE9QICAgICAge3I0LXIxMixwY30KLU9NWF9WQ18xNlgxNl9EQzoKLSAgICBNT1YgICAgICByMTEsIzAKLSAgICBUU1QgICAgICByNywjMgotICAgIEJFUSAgICAgIEwweDE0YwotICAgIEFERCAgICAgIHI4LHIwLHI0Ci0gICAgQUREICAgICAgcjEwLHI0LHI0Ci0gICAgVkxEMS44ICAge2QyWzBdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkMlsxXX0sW3I4XSxyMTAKLSAgICBWTEQxLjggICB7ZDJbMl19LFtyMF0scjEwCi0gICAgVkxEMS44ICAge2QyWzNdfSxbcjhdLHIxMAotICAgIFZMRDEuOCAgIHtkMls0XX0sW3IwXSxyMTAKLSAgICBWTEQxLjggICB7ZDJbNV19LFtyOF0scjEwCi0gICAgVkxEMS44ICAge2QyWzZdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkMls3XX0sW3I4XSxyMTAKLSAgICBWTEQxLjggICB7ZDNbMF19LFtyMF0scjEwCi0gICAgVkxEMS44ICAge2QzWzFdfSxbcjhdLHIxMAotICAgIFZMRDEuOCAgIHtkM1syXX0sW3IwXSxyMTAKLSAgICBWTEQxLjggICB7ZDNbM119LFtyOF0scjEwCi0gICAgVkxEMS44ICAge2QzWzRdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkM1s1XX0sW3I4XSxyMTAKLSAgICBWTEQxLjggICB7ZDNbNl19LFtyMF0scjEwCi0gICAgVkxEMS44ICAge2QzWzddfSxbcjhdCi0gICAgVlBBRERMLlU4IHEwLHExCi0gICAgQUREICAgICAgcjExLHIxMSwjMQotICAgIFZQQURELkkxNiBkMCxkMCxkMQotICAgIFZQQURETC5VMTYgZDAsZDAKLSAgICBWUEFEREwuVTMyIGQ2LGQwCi0gICAgVlJTSFIuVTY0IGQ4LGQ2LCM0Ci1MMHgxNGM6Ci0gICAgVFNUICAgICAgcjcsIzEKLSAgICBCRVEgICAgICBMMHgxNzAKLSAgICBWTEQxLjggICB7ZDAsZDF9LFtyMV0KLSAgICBBREQgICAgICByMTEscjExLCMxCi0gICAgVlBBRERMLlU4IHEwLHEwCi0gICAgVlBBREQuSTE2IGQwLGQwLGQxCi0gICAgVlBBRERMLlUxNiBkMCxkMAotICAgIFZQQURETC5VMzIgZDcsZDAKLSAgICBWUlNIUi5VNjQgZDgsZDcsIzQKLUwweDE3MDoKLSAgICBDTVAgICAgICByMTEsIzIKLSAgICBCTkUgICAgICBMMHgxODAKLSAgICBWQURELkk2NCBkOCxkNyxkNgotICAgIFZSU0hSLlU2NCBkOCxkOCwjNQotTDB4MTgwOgotICAgIFZEVVAuOCAgIHEzLGQ4WzBdCi0gICAgQ01QICAgICAgcjExLCMwCi0gICAgQUREICAgICAgcjgscjMscjUKLSAgICBBREQgICAgICByMTAscjUscjUKLSAgICBCTkUgICAgICBMMHgxOTgKLSAgICBWTU9WLkk4ICBxMywjMHg4MAotTDB4MTk4OgotICAgIFZTVDEuOCAgIHtkNixkN30sW3IzXSxyMTAKLSAgICBWU1QxLjggICB7ZDYsZDd9LFtyOF0scjEwCi0gICAgVlNUMS44ICAge2Q2LGQ3fSxbcjNdLHIxMAotICAgIFZTVDEuOCAgIHtkNixkN30sW3I4XSxyMTAKLSAgICBWU1QxLjggICB7ZDYsZDd9LFtyM10scjEwCi0gICAgVlNUMS44ICAge2Q2LGQ3fSxbcjhdLHIxMAotICAgIFZTVDEuOCAgIHtkNixkN30sW3IzXSxyMTAKLSAgICBWU1QxLjggICB7ZDYsZDd9LFtyOF0scjEwCi0gICAgVlNUMS44ICAge2Q2LGQ3fSxbcjNdLHIxMAotICAgIFZTVDEuOCAgIHtkNixkN30sW3I4XSxyMTAKLSAgICBWU1QxLjggICB7ZDYsZDd9LFtyM10scjEwCi0gICAgVlNUMS44ICAge2Q2LGQ3fSxbcjhdLHIxMAotICAgIFZTVDEuOCAgIHtkNixkN30sW3IzXSxyMTAKLSAgICBWU1QxLjggICB7ZDYsZDd9LFtyOF0scjEwCi0gICAgVlNUMS44ICAge2Q2LGQ3fSxbcjNdLHIxMAotICAgIFZTVDEuOCAgIHtkNixkN30sW3I4XSxyMTAKLSAgICBNT1YgICAgICByMCwjMAotICAgIFZQT1AgICAgIHtkOC1kMTV9Ci0gICAgUE9QICAgICAge3I0LXIxMixwY30KLU9NWF9WQ18xNlgxNl9QTEFORToKLSAgICBBRFIgICAgICByOSwgYXJtVkNNNFAxMF9NdWx0aXBsaWVyVGFibGUxNngxNgotICAgIFZMRDEuOCAgIHtkMCxkMX0sW3IxXQotICAgIFZMRDEuOCAgIHtkNFswXX0sW3IyXQotICAgIEFERCAgICAgIHI4LHIwLHI0Ci0gICAgQUREICAgICAgcjEwLHI0LHI0Ci0gICAgVkxEMS44ICAge2QyWzBdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkMlsxXX0sW3I4XSxyMTAKLSAgICBWTEQxLjggICB7ZDJbMl19LFtyMF0scjEwCi0gICAgVkxEMS44ICAge2QyWzNdfSxbcjhdLHIxMAotICAgIFZMRDEuOCAgIHtkMls0XX0sW3IwXSxyMTAKLSAgICBWTEQxLjggICB7ZDJbNV19LFtyOF0scjEwCi0gICAgVkxEMS44ICAge2QyWzZdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkMls3XX0sW3I4XSxyMTAKLSAgICBWTEQxLjggICB7ZDNbMF19LFtyMF0scjEwCi0gICAgVkxEMS44ICAge2QzWzFdfSxbcjhdLHIxMAotICAgIFZMRDEuOCAgIHtkM1syXX0sW3IwXSxyMTAKLSAgICBWTEQxLjggICB7ZDNbM119LFtyOF0scjEwCi0gICAgVkxEMS44ICAge2QzWzRdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkM1s1XX0sW3I4XSxyMTAKLSAgICBWTEQxLjggICB7ZDNbNl19LFtyMF0scjEwCi0gICAgVkxEMS44ICAge2QzWzddfSxbcjhdCi0gICAgVlJFVjY0LjggZDUsZDEKLSAgICBWU1VCTC5VOCBxMyxkNSxkNAotICAgIFZTSFIuVTY0IGQ1LGQ1LCM4Ci0gICAgVlNVQkwuVTggcTQsZDUsZDAKLSAgICBWU0hMLkk2NCBkOSxkOSwjMTYKLSAgICBWRVhULjggICBkOSxkOSxkNiwjMgotICAgIFZSRVY2NC44IGQxMixkMwotICAgIFZTVUJMLlU4IHE3LGQxMixkNAotICAgIFZTSFIuVTY0IGQxMixkMTIsIzgKLSAgICBWU1VCTC5VOCBxOCxkMTIsZDIKLSAgICBWTEQxLjE2ICB7ZDIwLGQyMX0sW3I5XSEKLSAgICBWU0hMLkk2NCBkMTcsZDE3LCMxNgotICAgIFZFWFQuOCAgIGQxNyxkMTcsZDE0LCMyCi0gICAgVk1VTEwuUzE2IHExMSxkOCxkMjAKLSAgICBWTVVMTC5TMTYgcTEyLGQxNixkMjAKLSAgICBWTUxBTC5TMTYgcTExLGQ5LGQyMQotICAgIFZNTEFMLlMxNiBxMTIsZDE3LGQyMQotICAgIFZQQURELkkzMiBkMjIsZDIzLGQyMgotICAgIFZQQURELkkzMiBkMjMsZDI1LGQyNAotICAgIFZQQURETC5TMzIgcTExLHExMQotICAgIFZTSEwuSTY0IHExMixxMTEsIzIKLSAgICBWQURELkk2NCBxMTEscTExLHExMgotICAgIFZSU0hSLlM2NCBxMTEscTExLCM2Ci0gICAgVlNITC5JNjQgcTEyLHExMSwjMwotICAgIFZTVUIuSTY0IHExMixxMTIscTExCi0gICAgVkxEMS4xNiAge2QyMCxkMjF9LFtyOV0hCi0gICAgVkRVUC4xNiAgcTYsZDIyWzBdCi0gICAgVkRVUC4xNiAgcTcsZDIzWzBdCi0gICAgVkFEREwuVTggcTExLGQxLGQzCi0gICAgVlNITC5JMTYgcTExLHExMSwjNAotICAgIFZEVVAuMTYgIHExMSxkMjNbM10KLSAgICBWQURELkk2NCBkMSxkMjQsZDI1Ci0gICAgVkxEMS4xNiAge2QyNCxkMjV9LFtyOV0KLSAgICBWRFVQLjE2ICBxMTMsZDFbMF0KLSAgICBWU1VCLkkxNiBxMTMscTExLHExMwotICAgIFZNVUwuSTE2IHE1LHE2LHExMAotICAgIFZNVUwuSTE2IHE2LHE2LHExMgotICAgIFZBREQuSTE2IHEwLHE1LHExMwotICAgIFZBREQuSTE2IHExLHE2LHExMwotTDB4MmQ0OgotICAgIFZRUlNIUlVOLlMxNiBkNixxMCwjNQotICAgIFZRUlNIUlVOLlMxNiBkNyxxMSwjNQotICAgIFNVQlMgICAgIHIxMixyMTIsIzEKLSAgICBWU1QxLjggICB7ZDYsZDd9LFtyM10scjUKLSAgICBWQURELkkxNiBxMCxxMCxxNwotICAgIFZBREQuSTE2IHExLHExLHE3Ci0gICAgQk5FICAgICAgTDB4MmQ0Ci0gICAgTU9WICAgICAgcjAsIzAKLSAgICBWUE9QICAgICB7ZDgtZDE1fQotICAgIFBPUCAgICAgIHtyNC1yMTIscGN9Ci0KLSAgICAuZW5kCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NF9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGM4NDg1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NF9zLlMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoKLSAqCi0gKi8KLQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQotCi0gICAgLmFybQotICAgIC5mcHUgbmVvbgotCi0gICAgLnRleHQKLSAgICAuYWxpZ24gNAotCi1hcm1WQ000UDEwX3BTd2l0Y2hUYWJsZTR4NDoKLSAgICAud29yZCBPTVhfVkNfNHg0X1ZFUlQtKFAwKzgpLCAgICAgT01YX1ZDXzR4NF9IT1ItKFAwKzgpCi0gICAgLndvcmQgT01YX1ZDXzR4NF9EQy0oUDArOCksICAgICAgIE9NWF9WQ180eDRfRElBR19ETC0oUDArOCkKLSAgICAud29yZCBPTVhfVkNfNHg0X0RJQUdfRFItKFAwKzgpLCAgT01YX1ZDXzR4NF9WUi0oUDArOCkKLSAgICAud29yZCBPTVhfVkNfNHg0X0hELShQMCs4KSwgICAgICAgT01YX1ZDXzR4NF9WTC0oUDArOCkKLSAgICAud29yZCBPTVhfVkNfNHg0X0hVLShQMCs4KQotCi0gICAgLmdsb2JhbCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQKLW9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NDoKLSAgICBQVVNIICAgICB7cjQtcjEyLGxyfQotICAgIFZQVVNIICAgIHtkOC1kMTJ9Ci0gICAgQURSICAgICAgcjgsIGFybVZDTTRQMTBfcFN3aXRjaFRhYmxlNHg0Ci0gICAgTERSRCAgICAgcjYscjcsW3NwLCMweDU4XQotICAgIExEUkQgICAgIHI0LHI1LFtzcCwjMHg1MF0KLSAgICBMRFIgICAgICByOCxbcjgscjYsTFNMICMyXQotUDA6IEFERCAgICAgIHBjLCByOAotCi1PTVhfVkNfNHg0X0hPUjoKLSAgICBBREQgICAgICByOSxyMCxyNAotICAgIEFERCAgICAgIHIxMCxyNCxyNAotICAgIFZMRDEuOCAgIHtkMFtdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkMVtdfSxbcjldLHIxMAotICAgIFZMRDEuOCAgIHtkMltdfSxbcjBdCi0gICAgVkxEMS44ICAge2QzW119LFtyOV0KLSAgICBBREQgICAgICByMTEscjMscjUKLSAgICBBREQgICAgICByMTIscjUscjUKLSAgICBWU1QxLjMyICB7ZDBbMF19LFtyM10scjEyCi0gICAgVlNUMS4zMiAge2QxWzBdfSxbcjExXSxyMTIKLSAgICBWU1QxLjMyICB7ZDJbMF19LFtyM10KLSAgICBWU1QxLjMyICB7ZDNbMF19LFtyMTFdCi0gICAgQiAgICAgICAgTDB4MzQ4Ci1PTVhfVkNfNHg0X1ZFUlQ6Ci0gICAgVkxEMS4zMiAge2QwWzBdfSxbcjFdCi0gICAgQUREICAgICAgcjExLHIzLHI1Ci0gICAgQUREICAgICAgcjEyLHI1LHI1Ci1MMHg1ODoKLSAgICBWU1QxLjMyICB7ZDBbMF19LFtyM10scjEyCi0gICAgVlNUMS4zMiAge2QwWzBdfSxbcjExXSxyMTIKLSAgICBWU1QxLjMyICB7ZDBbMF19LFtyM10KLSAgICBWU1QxLjMyICB7ZDBbMF19LFtyMTFdCi0gICAgQiAgICAgICAgTDB4MzQ4Ci1PTVhfVkNfNHg0X0RDOgotICAgIFRTVCAgICAgIHI3LCMyCi0gICAgQkVRICAgICAgTDB4ZGMKLSAgICBBREQgICAgICByOSxyMCxyNAotICAgIEFERCAgICAgIHIxMCxyNCxyNAotICAgIFZMRDEuOCAgIHtkMFswXX0sW3IwXSxyMTAKLSAgICBWTEQxLjggICB7ZDBbMV19LFtyOV0scjEwCi0gICAgVkxEMS44ICAge2QwWzJdfSxbcjBdCi0gICAgVkxEMS44ICAge2QwWzNdfSxbcjldCi0gICAgVFNUICAgICAgcjcsIzEKLSAgICBCRVEgICAgICBMMHhiYwotICAgIFZMRDEuMzIgIHtkMFsxXX0sW3IxXQotICAgIE1PViAgICAgIHIwLCMwCi0gICAgVlBBRERMLlU4IGQxLGQwCi0gICAgVlBBRERMLlUxNiBkMSxkMQotICAgIFZQQURETC5VMzIgZDEsZDEKLSAgICBWUlNIUi5VNjQgZDEsZDEsIzMKLSAgICBBREQgICAgICByMTEscjMscjUKLSAgICBBREQgICAgICByMTIscjUscjUKLSAgICBWRFVQLjggICBkMCxkMVswXQotICAgIEIgICAgICAgIEwweDU4Ci1MMHhiYzoKLSAgICBNT1YgICAgICByMCwjMAotICAgIFZQQURETC5VOCBkMSxkMAotICAgIFZQQURETC5VMTYgZDEsZDEKLSAgICBWUlNIUi5VMzIgZDEsZDEsIzIKLSAgICBBREQgICAgICByMTEscjMscjUKLSAgICBBREQgICAgICByMTIscjUscjUKLSAgICBWRFVQLjggICBkMCxkMVswXQotICAgIEIgICAgICAgIEwweDU4Ci1MMHhkYzoKLSAgICBUU1QgICAgICByNywjMQotICAgIEJFUSAgICAgIEwweDEwOAotICAgIFZMRDEuMzIgIHtkMFswXX0sW3IxXQotICAgIE1PViAgICAgIHIwLCMwCi0gICAgVlBBRERMLlU4IGQxLGQwCi0gICAgVlBBRERMLlUxNiBkMSxkMQotICAgIFZSU0hSLlUzMiBkMSxkMSwjMgotICAgIEFERCAgICAgIHIxMSxyMyxyNQotICAgIEFERCAgICAgIHIxMixyNSxyNQotICAgIFZEVVAuOCAgIGQwLGQxWzBdCi0gICAgQiAgICAgICAgTDB4NTgKLUwweDEwODoKLSAgICBWTU9WLkk4ICBkMCwjMHg4MAotICAgIE1PViAgICAgIHIwLCMwCi0gICAgQUREICAgICAgcjExLHIzLHI1Ci0gICAgQUREICAgICAgcjEyLHI1LHI1Ci0gICAgQiAgICAgICAgTDB4NTgKLU9NWF9WQ180eDRfRElBR19ETDoKLSAgICBUU1QgICAgICByNywjMHg0MAotICAgIEJFUSAgICAgIEwweDEzOAotICAgIFZMRDEuOCAgIHtkM30sW3IxXQotICAgIFZEVVAuOCAgIGQyLGQzWzddCi0gICAgVkVYVC44ICAgZDQsZDMsZDIsIzEKLSAgICBWRVhULjggICBkNSxkMyxkMiwjMgotICAgIEIgICAgICAgIEwweDE0YwotTDB4MTM4OgotICAgIFZMRDEuMzIgIHtkMFsxXX0sW3IxXQotICAgIFZEVVAuOCAgIGQyLGQwWzddCi0gICAgVkVYVC44ICAgZDMsZDAsZDIsIzQKLSAgICBWRVhULjggICBkNCxkMCxkMiwjNQotICAgIFZFWFQuOCAgIGQ1LGQwLGQyLCM2Ci1MMHgxNGM6Ci0gICAgVkhBREQuVTggZDYsZDMsZDUKLSAgICBWUkhBREQuVTggZDYsZDYsZDQKLSAgICBWU1QxLjMyICB7ZDZbMF19LFtyM10scjUKLSAgICBWRVhULjggICBkNixkNixkNiwjMQotICAgIFZTVDEuMzIgIHtkNlswXX0sW3IzXSxyNQotICAgIFZFWFQuOCAgIGQ2LGQ2LGQ2LCMxCi0gICAgVlNUMS4zMiAge2Q2WzBdfSxbcjNdLHI1Ci0gICAgVkVYVC44ICAgZDYsZDYsZDYsIzEKLSAgICBWU1QxLjMyICB7ZDZbMF19LFtyM10KLSAgICBCICAgICAgICBMMHgzNDgKLU9NWF9WQ180eDRfRElBR19EUjoKLSAgICBWTEQxLjMyICB7ZDBbMF19LFtyMV0KLSAgICBWTEQxLjggICB7ZDFbN119LFtyMl0KLSAgICBBREQgICAgICByOSxyMCxyNAotICAgIEFERCAgICAgIHIxMCxyNCxyNAotICAgIEFERCAgICAgIHIxLHIzLHI1Ci0gICAgVkxEMS44ICAge2QxWzZdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkMVs1XX0sW3I5XSxyMTAKLSAgICBWTEQxLjggICB7ZDFbNF19LFtyMF0KLSAgICBWTEQxLjggICB7ZDFbM119LFtyOV0KLSAgICBWRVhULjggICBkMyxkMSxkMCwjMwotICAgIEFERCAgICAgIHI0LHIxLHI1Ci0gICAgVkVYVC44ICAgZDQsZDEsZDAsIzQKLSAgICBBREQgICAgICByNixyNCxyNQotICAgIFZFWFQuOCAgIGQ1LGQxLGQwLCM1Ci0gICAgVkhBREQuVTggZDYsZDMsZDUKLSAgICBWUkhBREQuVTggZDYsZDYsZDQKLSAgICBWU1QxLjMyICB7ZDZbMF19LFtyNl0KLSAgICBWRVhULjggICBkNixkNixkNiwjMQotICAgIFZTVDEuMzIgIHtkNlswXX0sW3I0XQotICAgIFZFWFQuOCAgIGQ2LGQ2LGQ2LCMxCi0gICAgVlNUMS4zMiAge2Q2WzBdfSxbcjFdCi0gICAgVkVYVC44ICAgZDYsZDYsZDYsIzEKLSAgICBWU1QxLjMyICB7ZDZbMF19LFtyM10KLSAgICBCICAgICAgICBMMHgzNDgKLU9NWF9WQ180eDRfVlI6Ci0gICAgVkxEMS4zMiAge2QwWzBdfSxbcjFdCi0gICAgVkxEMS44ICAge2QwWzddfSxbcjJdCi0gICAgVkxEMS44ICAge2QxWzddfSxbcjBdLHI0Ci0gICAgVkxEMS44ICAge2QyWzddfSxbcjBdLHI0Ci0gICAgVkxEMS44ICAge2QxWzZdfSxbcjBdCi0gICAgVkVYVC44ICAgZDEyLGQwLGQwLCM3Ci0gICAgVkVYVC44ICAgZDMsZDEsZDEyLCM2Ci0gICAgVkVYVC44ICAgZDQsZDIsZDEyLCM3Ci0gICAgVkVYVC44ICAgZDUsZDEsZDAsIzcKLSAgICBWRVhULjggICBkNixkMixkMCwjNwotICAgIFZFWFQuOCAgIGQxMSxkMSxkMTIsIzcKLSAgICBWSEFERC5VOCBkOCxkNixkMTIKLSAgICBWUkhBREQuVTggZDgsZDgsZDExCi0gICAgVkhBREQuVTggZDcsZDMsZDUKLSAgICBWUkhBREQuVTggZDcsZDcsZDQKLSAgICBWRVhULjggICBkMTAsZDgsZDgsIzEKLSAgICBBREQgICAgICByMTEscjMscjUKLSAgICBBREQgICAgICByMTIscjUscjUKLSAgICBWRVhULjggICBkOSxkNyxkNywjMQotICAgIFZTVDEuMzIgIHtkMTBbMF19LFtyM10scjEyCi0gICAgVlNUMS4zMiAge2Q5WzBdfSxbcjExXSxyMTIKLSAgICBWU1QxLjMyICB7ZDhbMF19LFtyM10scjEyCi0gICAgVlNUMS4zMiAge2Q3WzBdfSxbcjExXQotICAgIEIgICAgICAgIEwweDM0OAotT01YX1ZDXzR4NF9IRDoKLSAgICBWTEQxLjggICB7ZDB9LFtyMV0KLSAgICBWTEQxLjggICB7ZDFbN119LFtyMl0KLSAgICBBREQgICAgICByOSxyMCxyNAotICAgIEFERCAgICAgIHIxMCxyNCxyNAotICAgIFZMRDEuOCAgIHtkMVs2XX0sW3IwXSxyMTAKLSAgICBWTEQxLjggICB7ZDFbNV19LFtyOV0scjEwCi0gICAgVkxEMS44ICAge2QxWzRdfSxbcjBdCi0gICAgVkxEMS44ICAge2QxWzNdfSxbcjldCi0gICAgVkVYVC44ICAgZDMsZDEsZDAsIzMKLSAgICBWRVhULjggICBkNCxkMSxkMCwjMgotICAgIFZFWFQuOCAgIGQ1LGQxLGQwLCMxCi0gICAgVkhBREQuVTggZDcsZDMsZDUKLSAgICBWUkhBREQuVTggZDcsZDcsZDQKLSAgICBWUkhBREQuVTggZDgsZDQsZDMKLSAgICBWU0hMLkk2NCBkOCxkOCwjMjQKLSAgICBWU0hMLkk2NCBkNixkNywjMTYKLSAgICBWWklQLjggICBkOCxkNgotICAgIFZFWFQuOCAgIGQ3LGQ3LGQ3LCM2Ci0gICAgVkVYVC44ICAgZDgsZDYsZDcsIzIKLSAgICBBREQgICAgICByMTEscjMscjUKLSAgICBBREQgICAgICByMTIscjUscjUKLSAgICBWU1QxLjMyICB7ZDhbMV19LFtyM10scjEyCi0gICAgVlNUMS4zMiAge2Q2WzFdfSxbcjExXSxyMTIKLSAgICBWU1QxLjMyICB7ZDhbMF19LFtyM10KLSAgICBWU1QxLjMyICB7ZDZbMF19LFtyMTFdCi0gICAgQiAgICAgICAgTDB4MzQ4Ci1PTVhfVkNfNHg0X1ZMOgotICAgIFRTVCAgICAgIHI3LCMweDQwCi0gICAgQkVRICAgICAgTDB4MmI0Ci0gICAgVkxEMS44ICAge2QzfSxbcjFdCi0gICAgVkVYVC44ICAgZDQsZDMsZDMsIzEKLSAgICBWRVhULjggICBkNSxkNCxkNCwjMQotICAgIEIgICAgICAgIEwweDJjOAotTDB4MmI0OgotICAgIFZMRDEuMzIgIHtkMFsxXX0sW3IxXQotICAgIFZEVVAuOCAgIGQyLGQwWzddCi0gICAgVkVYVC44ICAgZDMsZDAsZDIsIzQKLSAgICBWRVhULjggICBkNCxkMCxkMiwjNQotICAgIFZFWFQuOCAgIGQ1LGQwLGQyLCM2Ci1MMHgyYzg6Ci0gICAgVlJIQURELlU4IGQ3LGQ0LGQzCi0gICAgVkhBREQuVTggZDEwLGQzLGQ1Ci0gICAgVlJIQURELlU4IGQxMCxkMTAsZDQKLSAgICBWRVhULjggICBkOCxkNyxkNywjMQotICAgIEFERCAgICAgIHIxMSxyMyxyNQotICAgIEFERCAgICAgIHIxMixyNSxyNQotICAgIFZFWFQuOCAgIGQ5LGQxMCxkOCwjMQotICAgIFZTVDEuMzIgIHtkN1swXX0sW3IzXSxyMTIKLSAgICBWU1QxLjMyICB7ZDEwWzBdfSxbcjExXSxyMTIKLSAgICBWU1QxLjMyICB7ZDhbMF19LFtyM10KLSAgICBWU1QxLjMyICB7ZDlbMF19LFtyMTFdCi0gICAgQiAgICAgICAgTDB4MzQ4Ci1PTVhfVkNfNHg0X0hVOgotICAgIEFERCAgICAgIHI5LHIwLHI0Ci0gICAgQUREICAgICAgcjEwLHI0LHI0Ci0gICAgVkxEMS44ICAge2QxWzRdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkMVs1XX0sW3I5XSxyMTAKLSAgICBWTEQxLjggICB7ZDFbNl19LFtyMF0KLSAgICBWTEQxLjggICB7ZDFbN119LFtyOV0KLSAgICBWRFVQLjggICBkMixkMVs3XQotICAgIFZFWFQuOCAgIGQzLGQxLGQyLCM0Ci0gICAgVkVYVC44ICAgZDQsZDEsZDIsIzUKLSAgICBWRVhULjggICBkNSxkMSxkMiwjNgotICAgIFZIQURELlU4IGQ3LGQzLGQ1Ci0gICAgVlJIQURELlU4IGQ3LGQ3LGQ0Ci0gICAgVlJIQURELlU4IGQ4LGQ0LGQzCi0gICAgVlpJUC44ICAgZDgsZDcKLSAgICBWU1QxLjMyICB7ZDhbMF19LFtyM10scjUKLSAgICBWRVhULjggICBkOCxkOCxkOCwjMgotICAgIFZTVDEuMzIgIHtkOFswXX0sW3IzXSxyNQotICAgIFZFWFQuOCAgIGQ4LGQ4LGQ4LCMyCi0gICAgVlNUMS4zMiAge2Q4WzBdfSxbcjNdLHI1Ci0gICAgVlNUMS4zMiAge2Q3WzBdfSxbcjNdCi1MMHgzNDg6Ci0gICAgTU9WICAgICAgcjAsIzAKLSAgICBWUE9QICAgICB7ZDgtZDEyfQotICAgIFBPUCAgICAgIHtyNC1yMTIscGN9Ci0KLSAgICAuZW5kCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGY1MTAzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5TCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoKLSAqCi0gKi8KLQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQotCi0gICAgLmFybQotICAgIC5mcHUgbmVvbgotICAgIC50ZXh0Ci0gICAgLnN5bnRheCB1bmlmaWVkCi0KLSAgICAuZ2xvYmFsIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIKLW9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXI6Ci0gICAgcHVzaCAgICB7cjQtcjEwLCBscn0KLSAgICBsZHIgICAgIHI5LCBbcjAsIzBdCi0gICAgdm1vdi5pMTYgICAgZDAsICMwCi0gICAgbW92ICAgICByOCwgIzB4MWYKLSAgICB2c3QxLjE2ICAgIHtkMH0sIFtyMV0KLSAgICBsZHJiICAgIHI2LCBbcjldLCAjMQotdW5wYWNrTG9vcDoKLSAgICB0c3QgICAgIHI2LCAjMHgxMAotICAgIGxkcnNibmUgcjUsIFtyOSwgIzFdCi0gICAgbGRyYm5lICByNCwgW3I5XSwgIzIKLSAgICBhbmQgICAgIHI3LCByOCwgcjYsIGxzbCAjMQotICAgIGxkcnNiZXEgcjQsIFtyOV0sICMxCi0gICAgb3JybmUgICByNCwgcjQsIHI1LCBsc2wgIzgKLSAgICB0c3QgICAgIHI2LCAjMHgyMAotICAgIGxkcmJlcSAgcjYsIFtyOV0sICMxCi0gICAgc3RyaCAgICByNCwgW3IxLCByN10KLSAgICBiZXEgICAgIHVucGFja0xvb3AKLSAgICBsZG1pYSAgIHIxLCB7cjMsIHI0fQotICAgIHN0ciAgICAgcjksIFtyMCwgIzBdCi0gICAgbGRyICAgICByNSwgLkxhcm1WQ000UDEwX1FQRGl2VGFibGUKLVAwOiBhZGQgICAgIHI1LCBwYwotICAgIGxkciAgICAgcjYsIC5MYXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZQotUDE6IGFkZCAgICAgcjYsIHBjCi0gICAgc2FkZHN1YnggICAgICAgIHIzLCByMywgcjMKLSAgICBzYWRkc3VieCAgICAgICAgcjQsIHI0LCByNAotICAgIGxkcnNiICAgcjksIFtyNSwgcjJdCi0gICAgbGRyc2IgICByMiwgW3I2LCByMl0KLSAgICBzYWRkMTYgIHI1LCByMywgcjQKLSAgICBzc3ViMTYgIHI2LCByMywgcjQKLSAgICBsc2wgICAgIHIyLCByMiwgcjkKLSAgICB2bW92ICAgIGQwLCByNSwgcjYKLSAgICB2cmV2MzIuMTYgIGQwLCBkMAotICAgIHZkdXAuMTYgICAgZDEsIHIyCi0gICAgdm11bGwuczE2ICAgcTEsIGQwLCBkMQotICAgIHZzaHJuLmkzMiAgIGQyLCBxMSwgIzEKLSAgICB2c3QxLjE2ICAgIHtkMn0sIFtyMV0KLSAgICBtb3YgICAgIHIwLCAjMAotICAgIHBvcCAgICAge3I0LXIxMCwgcGN9Ci0KLS5MYXJtVkNNNFAxMF9RUERpdlRhYmxlOgotICAgIC53b3JkIGFybVZDTTRQMTBfUVBEaXZUYWJsZS0oUDArOCkKLS5MYXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZToKLSAgICAud29yZCBhcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlLShQMSs4KQotCi0gICAgLmVuZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXJfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXJfcy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDEwMzBhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MuUworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qCi0gKgotICovCi0KLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKLQotICAgIC5hcm0KLSAgICAuZnB1IG5lb24KLSAgICAudGV4dAotCi0gICAgLmdsb2JhbCBhcm1WQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRMdW1hREM0eDQKLWFybVZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudEx1bWFEQzR4NDoKLSAgICBQVVNIICAgICB7cjQtcjYsbHJ9Ci0gICAgVlBVU0ggICAge2Q4LWQxM30KLSAgICBWTEQ0LjE2ICB7ZDAsZDEsZDIsZDN9LFtyMF0KLSAgICBMRFIgICAgICByMiwgLkxhcm1WQ000UDEwX1FQRGl2VGFibGUKLVAwOiBBREQgICAgICByMiwgcGMKLSAgICBMRFIgICAgICByMywgLkxhcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlCi1QMTogQUREICAgICAgcjMsIHBjCi0gICAgVkFERC5JMTYgZDQsZDAsZDEKLSAgICBWQURELkkxNiBkNSxkMixkMwotICAgIFZTVUIuSTE2IGQ2LGQwLGQxCi0gICAgTERSU0IgICAgcjQsW3IyLHIxXQotICAgIFZTVUIuSTE2IGQ3LGQyLGQzCi0gICAgTERSU0IgICAgcjUsW3IzLHIxXQotICAgIFZBREQuSTE2IGQwLGQ0LGQ1Ci0gICAgVlNVQi5JMTYgZDEsZDQsZDUKLSAgICBWU1VCLkkxNiBkMixkNixkNwotICAgIExTTCAgICAgIHI1LHI1LHI0Ci0gICAgVkFERC5JMTYgZDMsZDYsZDcKLSAgICBWVFJOLjE2ICBkMCxkMQotICAgIFZUUk4uMTYgIGQyLGQzCi0gICAgVlRSTi4zMiAgcTAscTEKLSAgICBWQURELkkxNiBkNCxkMCxkMQotICAgIFZBREQuSTE2IGQ1LGQyLGQzCi0gICAgVlNVQi5JMTYgZDYsZDAsZDEKLSAgICBWU1VCLkkxNiBkNyxkMixkMwotICAgIFZBREQuSTE2IGQwLGQ0LGQ1Ci0gICAgVlNVQi5JMTYgZDEsZDQsZDUKLSAgICBWU1VCLkkxNiBkMixkNixkNwotICAgIFZBREQuSTE2IGQzLGQ2LGQ3Ci0gICAgVkRVUC4xNiAgZDUscjUKLSAgICBWTU9WLkkzMiBxMywjMHgyCi0gICAgVk1PVi5JMzIgcTQsIzB4MgotICAgIFZNT1YuSTMyIHE1LCMweDIKLSAgICBWTU9WLkkzMiBxNiwjMHgyCi0gICAgVk1MQUwuUzE2IHEzLGQwLGQ1Ci0gICAgVk1MQUwuUzE2IHE0LGQxLGQ1Ci0gICAgVk1MQUwuUzE2IHE1LGQyLGQ1Ci0gICAgVk1MQUwuUzE2IHE2LGQzLGQ1Ci0gICAgVlNIUk4uSTMyIGQwLHEzLCMyCi0gICAgVlNIUk4uSTMyIGQxLHE0LCMyCi0gICAgVlNIUk4uSTMyIGQyLHE1LCMyCi0gICAgVlNIUk4uSTMyIGQzLHE2LCMyCi0gICAgVlNUMS4xNiAge2QwLGQxLGQyLGQzfSxbcjBdCi0gICAgVlBPUCAgICAge2Q4LWQxM30KLSAgICBQT1AgICAgICB7cjQtcjYscGN9Ci0KLS5MYXJtVkNNNFAxMF9RUERpdlRhYmxlOgotICAgIC53b3JkIGFybVZDTTRQMTBfUVBEaXZUYWJsZS0oUDArOCkKLS5MYXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZToKLSAgICAud29yZCBhcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlLShQMSs4KQotCi0uZ2xvYmFsIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyCi1vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcjoKLSAgICBQVVNIICAgICB7cjQtcjYsbHJ9Ci0gICAgTU9WICAgICAgcjQscjEKLSAgICBNT1YgICAgICByNSxyMgotICAgIEJMICAgICAgIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQKLSAgICBNT1YgICAgICByMCxyNAotICAgIE1PViAgICAgIHIxLHI1Ci0gICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50THVtYURDNHg0Ci0gICAgTU9WICAgICAgcjAsIzAKLSAgICBQT1AgICAgICB7cjQtcjYscGN9Ci0KLSAgICAuZW5kCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL2FwaS9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2JjNWZmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL2FwaS9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDEyMjkwCi0gKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKgotICogRmlsZTogICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlcy5oCi0gKiBEZXNjcmlwdGlvbjogRGVjbGFyZXMgVGFibGVzIHVzZWQgZm9yIEh1ZmZmbWFuIGNvZGluZyBhbmQgZGVjb2RpbmcgCi0gKiAgICAgICAgICAgICAgaW4gTVA0UDIgY29kZWMuCi0gKgotICovCi0gCi0jaWZuZGVmIF9PTVhIVUZGVEFCX0hfCi0jZGVmaW5lIF9PTVhIVUZGVEFCX0hfCi0KLQotZXh0ZXJuIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAyX0ludHJhVmxjTDBMMVsyMDBdOwotCi0KLWV4dGVybiBjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9JbnRlclZsY0wwTDFbMjAwXTsKLQotZXh0ZXJuIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAyX2FJbnRyYURDTHVtYUNocm9tYUluZGV4WzY0XTsKLS8vZXh0ZXJuIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAyX2FJbnRyYURDQ2hyb21hSW5kZXhbMzJdOwotZXh0ZXJuIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAyX2FWbGNNVkRbMTI0XTsKLQotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50ZXJMMEwxTE1BWFs3M107Ci1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwwTDFSTUFYWzM1XTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDBMMUxNQVhbNTNdOwotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50cmFMMEwxUk1BWFs0MF0KLQotI2VuZGlmIC8qIF9PTVhIVUZGVEFCX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9hcGkvYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL2FwaS9hcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDY0YTY4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL2FwaS9hcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgMTIyOTAKLSAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqCi0gKiBGaWxlOiAgICAgICAgYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuaAotICogRGVzY3JpcHRpb246IERlY2xhcmVzIFRhYmxlcyB1c2VkIGZvciBaaWd6YWcgc2NhbiBpbiBNUDRQMiBjb2RlYy4KLSAqCi0gKi8KLSAKLSNpZm5kZWYgX09NWFpJR1pBR1RBQl9ICi0jZGVmaW5lIF9PTVhaSUdaQUdUQUJfSAotCi1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiBbMTkyXTsKLS8vZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfYUhvcml6b250YWxaaWd6YWdTY2FuIFs2NF07Ci0vL2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX2FWZXJ0aWNhbFppZ3phZ1NjYW4gWzY0XTsKLQotI2VuZGlmIC8qIF9PTVhaSUdaQUdUQUJfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2xpcDhfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DbGlwOF9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmODMwZmMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DbGlwOF9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOyAvKioKLTsgKiAKLTsgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfQ2xpcDhfcy5zCi07ICogT3Blbk1BWCBETDogdjEuMC4yCi07ICogUmV2aXNpb246ICAgMTIyOTAKLTsgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsgKiAKLTsgKiAKLTsgKiAKLTsgKgotOyAqIERlc2NyaXB0aW9uOiAKLTsgKiBDb250YWlucyBtb2R1bGUgZm9yIENsaXBwaW5nIDE2IGJpdCB2YWx1ZSB0byBbMCwyNTVdIFJhbmdlCi07ICovIAotCi0gICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgCi0KLSAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKLQotICAgICAgSUYgQ29ydGV4QTgKLTsvL0lucHV0IEFyZ3VtZW50cwotCi1wU3JjICAgICAgICAgICAgICAgICBSTiAwCi1wRHN0ICAgICAgICAgICAgICAgICBSTiAxCi1zdGVwICAgICAgICAgICAgICAgICBSTiAyCi0KLTsvLyBOZW9uIFJlZ2lzdGVycwotCi1xeDAgICAgICAgICAgICAgICAgICBRTiAgUTAuUzE2ICAgICAgICAgICAgICAgICAgCi1keDAwICAgICAgICAgICAgICAgICBETiAgRDAuUzE2Ci1keDAxICAgICAgICAgICAgICAgICBETiAgRDEuUzE2Ci1xeDEgICAgICAgICAgICAgICAgICBRTiAgUTEuUzE2Ci1keDEwICAgICAgICAgICAgICAgICBETiAgRDIuUzE2Ci1keDExICAgICAgICAgICAgICAgICBETiAgRDMuUzE2Ci0KLXF4MiAgICAgICAgICAgICAgICAgIFFOICBRMi5TMTYgICAgICAgICAgICAgICAgICAKLWR4MjAgICAgICAgICAgICAgICAgIEROICBENC5TMTYKLWR4MjEgICAgICAgICAgICAgICAgIEROICBENS5TMTYKLXF4MyAgICAgICAgICAgICAgICAgIFFOICBRMy5TMTYKLWR4MzAgICAgICAgICAgICAgICAgIEROICBENi5TMTYKLWR4MzEgICAgICAgICAgICAgICAgIEROICBENy5TMTYKLQotCi1kY2xpcDAgICAgICAgICAgICAgICBETiAgRDAuVTgKLWRjbGlwMSAgICAgICAgICAgICAgIEROICBEMi5VOCAKLWRjbGlwMiAgICAgICAgICAgICAgIEROICBENC5VOAotZGNsaXAzICAgICAgICAgICAgICAgRE4gIEQ2LlU4Ci0gCi0gICAgICAgTV9TVEFSVCBhcm1WQ000UDJfQ2xpcDgKLQotICAgICAgIFZMRDEgICAgICAgICAge2R4MDAsZHgwMSxkeDEwLGR4MTF9LFtwU3JjXSEgICAgICAgICAgOy8vIExvYWQgMTYgZW50cmllcyBmcm9tIHBTcmMKLSAgICAgICBWTEQxICAgICAgICAgIHtkeDIwLGR4MjEsZHgzMCxkeDMxfSxbcFNyY10hICAgICAgICAgIDsvLyBMb2FkIG5leHQgMTYgZW50cmllcyBmcm9tIHBTcmMgIAotICAgICAgIFZRU0hSVU4gICAgICAgZGNsaXAwLHF4MCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGRjbGlwMFtpXT1jbGlwIHF4MFtpXSB0byBbMCwyNTVdCi0gICAgICAgVlFTSFJVTiAgICAgICBkY2xpcDEscXgxLCMwICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gZGNsaXAxW2ldPWNsaXAgcXgxW2ldIHRvIFswLDI1NV0KLSAgICAgICBWU1QxICAgICAgICAgIHtkY2xpcDB9LFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSA4IGJ5dGVzIGFuZCBwRHN0PXBEc3Qrc3RlcAotICAgICAgIFZTVDEgICAgICAgICAge2RjbGlwMX0sW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIDggYnl0ZXMgYW5kIHBEc3Q9cERzdCtzdGVwCi0gICAgICAgVlFTSFJVTiAgICAgICBkY2xpcDIscXgyLCMwCi0gICAgICAgVlFTSFJVTiAgICAgICBkY2xpcDMscXgzLCMwCi0gICAgICAgVlNUMSAgICAgICAgICB7ZGNsaXAyfSxbcERzdF0sc3RlcAotICAgICAgIFZTVDEgICAgICAgICAge2RjbGlwM30sW3BEc3RdLHN0ZXAKLSAgICAgICAKLSAgICAgICBWTEQxICAgICAgICAgIHtkeDAwLGR4MDEsZHgxMCxkeDExfSxbcFNyY10hICAgICAgICAgIDsvLyBMb2FkIDE2IGVudHJpZXMgZnJvbSBwU3JjCi0gICAgICAgVkxEMSAgICAgICAgICB7ZHgyMCxkeDIxLGR4MzAsZHgzMX0sW3BTcmNdISAgICAgICAgICA7Ly8gTG9hZCBuZXh0IDE2IGVudHJpZXMgZnJvbSBwU3JjICAKLSAgICAgICBWUVNIUlVOICAgICAgIGRjbGlwMCxxeDAsIzAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBkY2xpcDBbaV09Y2xpcCBxeDBbaV0gdG8gWzAsMjU1XQotICAgICAgIFZRU0hSVU4gICAgICAgZGNsaXAxLHF4MSwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGRjbGlwMVtpXT1jbGlwIHF4MVtpXSB0byBbMCwyNTVdCi0gICAgICAgVlNUMSAgICAgICAgICB7ZGNsaXAwfSxbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUgOCBieXRlcyBhbmQgcERzdD1wRHN0K3N0ZXAKLSAgICAgICBWU1QxICAgICAgICAgIHtkY2xpcDF9LFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSA4IGJ5dGVzIGFuZCBwRHN0PXBEc3Qrc3RlcAotICAgICAgIFZRU0hSVU4gICAgICAgZGNsaXAyLHF4MiwjMAotICAgICAgIFZRU0hSVU4gICAgICAgZGNsaXAzLHF4MywjMAotICAgICAgIFZTVDEgICAgICAgICAge2RjbGlwMn0sW3BEc3RdLHN0ZXAKLSAgICAgICBWU1QxICAgICAgICAgIHtkY2xpcDN9LFtwRHN0XSxzdGVwCi0KLQotICAgICAgIAotICAgICAgICBNX0VORAotICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgCi0gICAgICAgIAotICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmVfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTZlNjViLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0MTIgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvKioKLTsgKiAKLTsgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZV9zLnMKLTsgKiBPcGVuTUFYIERMOiB2MS4wLjIKLTsgKiBSZXZpc2lvbjogICAxMjI5MAotOyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOyAqIAotOyAqIAotOyAqIAotOyAqCi07ICogRGVzY3JpcHRpb246IAotOyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGRlY29kaW5nCi07ICogZm9yIGludGVyLCBpbnRyYSBibG9jay4KLTsgKgotOyAqCi07ICoKLTsgKiBGdW5jdGlvbjogb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmUKLTsgKgotOyAqIERlc2NyaXB0aW9uOgotOyAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiAKLTsgKgotOyAqIAotOyAqCi07ICogCi07ICovCi0KLQotICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgIElOQ0xVREUgYXJtQ09NTV9CaXREZWNfcy5oCi0KLQotICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLQotICAgICAKLQotCi0KLSAgICAgSUYgQVJNMTEzNkpTCi0gICAgIAotICAgICAgICAKLQotCi0KLTsvL0lucHV0IEFyZ3VtZW50cwotCi1wcEJpdFN0cmVhbSAgICAgICAgICBSTiAwCi1wQml0T2Zmc2V0ICAgICAgICAgICBSTiAxCi1wRHN0ICAgICAgICAgICAgICAgICBSTiAyCi1zaG9ydFZpZGVvSGVhZGVyICAgICBSTiAzCi0KLQotOy8vTG9jYWwgVmFyaWFibGVzCi0KLVJldHVybiAgICAgICAgICAgICAgIFJOIDAKLQotcFZsY1RhYmxlTDBMMSAgICAgICAgUk4gNAotcExNQVhUYWJsZUwwTDEgICAgICAgUk4gNAotcFJNQVhUYWJsZUwwTDEgICAgICAgUk4gNAotcFppZ3phZ1RhYmxlICAgICAgICAgUk4gNAotCi1mdHlwZSAgICAgICAgICAgICAgICBSTiAwCi10ZW1wMyAgICAgICAgICAgICAgICBSTiA0Ci10ZW1wICAgICAgICAgICAgICAgICBSTiA1Ci1Db3VudCAgICAgICAgICAgICAgICBSTiA2Ci1Fc2NhcGUgICAgICAgICAgICAgICBSTiA1Ci0KLTsvLyBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlcgotemlnemFnICAgICAgICAgICAgICAgUk4gMAotc3RvcmVMZXZlbCAgICAgICAgICAgUk4gMQotdGVtcDIgICAgICAgICAgICAgICAgUk4gNAotdGVtcDEgICAgICAgICAgICAgICAgUk4gNQotc2lnbiAgICAgICAgICAgICAgICAgUk4gNQotTGFzdCAgICAgICAgICAgICAgICAgUk4gNwotc3RvcmVSdW4gICAgICAgICAgICAgUk4gMTQKLQotCi1wYWNrUmV0SW5kZXggICAgICAgICBSTiA1Ci0KLQotbWFya2VyYml0ICAgICAgICAgICAgUk4gNQotCi07Ly8gU2NyYXRjaCBSZWdpc3RlcnMKLQotUkJpdFN0cmVhbSAgICAgICAgICAgUk4gOAotUkJpdEJ1ZmZlciAgICAgICAgICAgUk4gOQotUkJpdENvdW50ICAgICAgICAgICAgUk4gMTAKLQotVDEgICAgICAgICAgICAgICAgICAgUk4gMTEKLVQyICAgICAgICAgICAgICAgICAgIFJOIDEyCi1MUiAgICAgICAgICAgICAgICAgICBSTiAxNCAgICAgICAgCi0gICAgICAgIAotCi0KLSAgICAgICAgTV9BTExPQzQgICAgICAgIHBwcEJpdFN0cmVhbSw0Ci0gICAgICAgIE1fQUxMT0M0ICAgICAgICBwcE9mZnNldCw0Ci0gICAgICAgIE1fQUxMT0M0ICAgICAgICBwTGlua1JlZ2lzdGVyLDQgICAgICAgCi0gICAgICAgIAotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlCi0KLSAgICAgICAgOy8vIGdldCB0aGUgdGFibGUgYWRkcmVzc2VzIGZyb20gc3RhY2sgICAgICAgCi0gICAgICAgIE1fQVJHICAgICAgICAgICBwcFZsY1RhYmxlTDBMMSw0Ci0gICAgICAgIE1fQVJHICAgICAgICAgICBwcExNQVhUYWJsZUwwTDEsNAotICAgICAgICBNX0FSRyAgICAgICAgICAgcHBSTUFYVGFibGVMMEwxLDQKLSAgICAgICAgTV9BUkcgICAgICAgICAgIHBwWmlnemFnVGFibGUsNAotICAgICAgICAKLSAgICAgICAgOy8vIFN0b3JlIEFMTCB6ZXJvcyBhdCBwRHN0Ci0gICAgICAgIAotICAgICAgICBNT1YgICAgICAgICAgICAgdGVtcDEsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEluaXRpYWxpemUgQ291bnQgdG8gemVybyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIE1PViAgICAgICAgICAgICBMYXN0LCMwCi0gICAgICAgIE1fU1RSICAgICAgICAgICBMUixwTGlua1JlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgTGluayBSZWdpc3RlciBvbiBTdGFjawotICAgICAgICBNT1YgICAgICAgICAgICAgdGVtcDIsIzAKLSAgICAgICAgTU9WICAgICAgICAgICAgIExSLCMwICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIEluaXRpYWxpemUgdGhlIE1hY3JvIGFuZCBTdG9yZSBhbGwgemVyb3MgdG8gcERzdCAKLSAgCi0gICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgIE1fQkRfSU5JVDAgICAgICBwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgUkJpdFN0cmVhbSwgUkJpdEJ1ZmZlciwgUkJpdENvdW50ICAKLSAgICAgICAgU1RNICAgICAgICAgICAgIHBEc3QhLHt0ZW1wMix0ZW1wMSxMYXN0LExSfQotICAgICAgICBNX0JEX0lOSVQxICAgICAgVDEsIFQyLCBUMgotICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9Ci0gICAgICAgIE1fQkRfSU5JVDIgICAgICBUMSwgVDIsIFQyCi0gICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KLSAgICAgICAgTV9TVFIgICAgICAgICAgIHBwQml0U3RyZWFtLHBwcEJpdFN0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBwcEJpdHN0cmVhbSBvbiBzdGFjayAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgU1RNICAgICAgICAgICAgIHBEc3QhLHt0ZW1wMix0ZW1wMSxMYXN0LExSfQotICAgICAgICBNX1NUUiAgICAgICAgICAgcEJpdE9mZnNldCxwcE9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHBCaXRPZmZzZXQgb24gc3RhY2sKLSAgICAgICAgU1RNICAgICAgICAgICAgIHBEc3QhLHt0ZW1wMix0ZW1wMSxMYXN0LExSfQotICAgICAgICAKLSAgICAgICAgU1RNICAgICAgICAgICAgIHBEc3QhLHt0ZW1wMix0ZW1wMSxMYXN0LExSfQotICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9Ci0gCi0gICAgICAgIAotICAgICAgICBTVUIgICAgICAgICAgICAgcERzdCxwRHN0LCMxMjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFJlc3RvcmUgcERzdAotCi0gICAgICAgIDsvLyBUaGUgYXJtVkNNNFAyX0dldFZMQ0JpdHMgYmVnaW5zCi0KLWdldFZMQ2JpdHMKLSAgICAgICAgCi0gICAgICAgIE1fQkRfTE9PSzggICAgICBFc2NhcGUsNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBFc2NhcGUgVmFsdWUKLSAgICAgICAgTFNSICAgICAgICAgICAgIEVzY2FwZSxFc2NhcGUsIzI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQ01QICAgICAgICAgICAgIEVzY2FwZSwjMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjaGVjayBmb3IgZXNjYXBlIG1vZGUKLSAgICAgICAgTU9WTkUgICAgICAgICAgIGZ0eXBlLCMwCi0gICAgICAgIEJORSAgICAgICAgICAgICBub3RFc2NhcGVtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIGlmIG5vdCBpbiBFc2NhcGUgbW9kZSAzCi0KLSAgICAgICAgTV9CRF9WU0tJUDggICAgICM3LFQxCi0gICAgICAgIENNUCAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgc2hvcnRWaWRlb0hlYWRlciBmbGFnIHRvIGtub3cgdGhlIHR5cGUgb2YgRXNjYXBlIG1vZGUKLSAgICAgICAgQkVRICAgICAgICAgICAgIGVuZEZpbGxWTEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBFc2NhcGUgTW9kZSA0Ci0KLSAgICAgICAgTV9CRF9SRUFEOCAgICAgIExhc3QsMSxUMQotICAgICAgICBNX0JEX1JFQUQ4ICAgICAgc3RvcmVSdW4sNixUMQotICAgICAgICBNX0JEX1JFQUQ4ICAgICAgc3RvcmVMZXZlbCw4LFQxCi0KLSAgICAgICAgICAgCi0gICAgICAgIDsvLyBDaGVjayB3aGV0aGVyIHRoZSBSZXNlcnZlZCB2YWx1ZXMgZm9yIExldmVsIGFyZSB1c2VkIGFuZCBFeGl0IHdpdGggYW4gRXJyb3IgTWVzc2FnZSBpZiBpdCBpcyBzbwotCi0gICAgICAgIFRFUSAgICAgICAgICAgICBzdG9yZUxldmVsLCMwCi0gICAgICAgIFRFUU5FICAgICAgICAgICBzdG9yZUxldmVsLCMxMjggICAgICAgICAgICAgICAgICAgIAotICAgICAgICBCRVEgICAgICAgICAgICAgRXhpdEVycm9yCi0KLSAgICAgICAgQUREICAgICAgICAgICAgIHRlbXAyLHN0b3JlUnVuLENvdW50Ci0gICAgICAgIENNUCAgICAgICAgICAgICB0ZW1wMiwjNjQKLSAgICAgICAgQkdFICAgICAgICAgICAgIEV4aXRFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBlcnJvciBpZiBDb3VudCtzdG9yZVJ1biA+PSA2NAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBMb2FkIGFkZHJlc3Mgb2YgemlnemFnVGFibGUKLSAgICAgICAgCi0gICAgICAgIE1fTERSICAgICAgICAgICBwWmlnemFnVGFibGUscHBaaWd6YWdUYWJsZSAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZGluZyB0aGUgQWRkcmVzcyBvZiBaaWd6YWcgdGFibGUKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgU1hUQiAgICAgICAgICAgIHN0b3JlTGV2ZWwsc3RvcmVMZXZlbCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTaWduIEV4dGVuZCBzdG9yZUxldmVsIHRvIDMyIGJpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIFRvIFJlZmxlY3QgUnVubGVuZ3RoCi0KLSAgICAgICAgQUREICAgICAgICAgICAgIENvdW50LENvdW50LHN0b3JlUnVuCi0gICAgICAgIExEUkIgICAgICAgICAgICB6aWd6YWcsW3BaaWd6YWdUYWJsZSxDb3VudF0KLSAgICAgICAgQUREICAgICAgICAgICAgIENvdW50LENvdW50LCMxCi0gICAgICAgIFNUUkggICAgICAgICAgICBzdG9yZUxldmVsLFtwRHN0LHppZ3phZ10gICAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUgTGV2ZWwKLSAgICAgICAgICAgICAgCi0gICAgICAgIEIgICAgICAgICAgICAgICBFeGl0T2sKLSAgICAgICAKLSAgICAgICAgCi0KLWVuZEZpbGxWTEQKLSAgICAgICAgCi0gICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIExvYWQgRnR5cGUoIEVzY2FwZSBNb2RlKSB2YWx1ZSBiYXNlZCBvbiB0aGUgdHdvIHN1Y2Nlc3NpdmUgYml0cyBpbiB0aGUgYml0c3RyZWFtCi0gICAgIAotICAgICAgICBNX0JEX1JFQUQ4ICAgICAgdGVtcDEsMSxUMSAgICAgICAgICAgCi0gICAgICAgIENNUCAgICAgICAgICAgICB0ZW1wMSwjMCAgICAKLSAgICAgICAgTU9WRVEgICAgICAgICAgIGZ0eXBlLCMxCi0gICAgICAgIEJFUSAgICAgICAgICAgICBub3RFc2NhcGVtb2RlCi0gICAgICAgIE1fQkRfUkVBRDggICAgICB0ZW1wMSwxLFQxCi0gICAgICAgIENNUCAgICAgICAgICAgICB0ZW1wMSwjMQotICAgICAgICBNT1ZFUSAgICAgICAgICAgZnR5cGUsIzMKLSAgICAgICAgTU9WTkUgICAgICAgICAgIGZ0eXBlLCMyCi0gICAgICAgIAotCi1ub3RFc2NhcGVtb2RlCi0KLSAgICAgICAgOy8vIExvYWQgb3B0aW1pemVkIHBhY2tlZCBWTEMgdGFibGUgd2l0aCBsYXN0PTAgYW5kIExhc3Q9MQotICAgICAgICAKLSAgICAgICAgTV9MRFIgICAgICAgICAgIHBWbGNUYWJsZUwwTDEscHBWbGNUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIENvbWJpbmVkIFZMQyBUYWJsZQotICAgICAgICAgICAgICAgIAotICAgICAgIAotICAgICAgICBDTVAgICAgICAgICAgICAgZnR5cGUsIzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIGZ0eXBlID49MyBnZXQgcGVyZm9ybSBGaXhlZCBMZW5ndGggRGVjb2RpbmcgKEVzY2FwZSBNb2RlIDMpCi0gICAgICAgIEJHRSAgICAgICAgICAgICBFc2NhcGVNb2RlMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRWxzZSBjb250aW51ZSBub3JtYWwgVkxDIERlY29kaW5nCi0gICAgICAgIAotICAgICAgICA7Ly8gVmFyaWFibGUgbGVuZ2ggZGVjb2RpbmcsICJhcm1VblBhY2tWTEMzMiIgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgTV9CRF9WTEQgICAgICAgIHBhY2tSZXRJbmRleCxUMSxUMixwVmxjVGFibGVMMEwxLDQsMgotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgICAgICB0ZW1wMyw9MHhGRkYKLSAgICAgICAgCi0gICAgICAgIENNUCAgICAgICAgICAgICBwYWNrUmV0SW5kZXgsdGVtcDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgZm9yIGludmFsaWQgc3ltYm9sCi0gICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0RXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gaWYgaW52YWxpZCBzeW1ib2wgb2NjdXJzIGV4aXQgd2l0aCBhbiBlcnJvciBtZXNzYWdlCi0gICAgICAgIAotICAgICAgICBBTkQgICAgICAgICAgICAgTGFzdCxwYWNrUmV0SW5kZXgsIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEdldCBMYXN0IGZyb20gcGFja2VkIEluZGV4Ci0gICAgICAgICAgICAgIAotICAgICAgICAgCi0gICAgICAgIAotCi0gICAgICAgIExTUiAgICAgICAgICAgICBzdG9yZVJ1bixwYWNrUmV0SW5kZXgsIzcgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gR2V0IFJ1biBWYWx1ZSBmcm9tIFBhY2tlZCBpbmRleAotICAgICAgICBBTkQgICAgICAgICAgICAgc3RvcmVMZXZlbCxwYWNrUmV0SW5kZXgsIzB4N2MgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlTGV2ZWw9cGFja1JldEluZGV4WzItNl0sc3RvcmVMZXZlbFswLTFdPTAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgCi0gICAgICAgIE1fTERSICAgICAgICAgICBwTE1BWFRhYmxlTDBMMSxwcExNQVhUYWJsZUwwTDEgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBMTUFYIHRhYmxlCi0gICAgICAgICAgICAgIAotICAgICAgIAotICAgICAgICBMU1IgICAgICAgICAgICAgc3RvcmVMZXZlbCxzdG9yZUxldmVsLCMyICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExldmVsIHZhbHVlCi0KLSAgICAgICAgQ01QICAgICAgICAgICAgIGZ0eXBlLCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIEJORSAgICAgICAgICAgICBmdHlwZTIKLSAgICAgICAgCi0gICAgICAgIDsvLyBmdHlwZT09MTsgRXNjYXBlIG1vZGUgPTEKLSAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIEFERCAgICAgICAgICAgIHRlbXAxLCBwTE1BWFRhYmxlTDBMMSwgTGFzdCwgTFNMIzQgICAgICAgICAgICAgIDsvLyBJZiB0aGUgTGFzdD0xIGFkZCAzMiB0byB0YWJsZSBhZGRyZXNzCi0gICAgICAgIExEUkIgICAgICAgICAgICB0ZW1wMSxbdGVtcDEsc3RvcmVSdW5dCi0KLSAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgICAgIHN0b3JlTGV2ZWwsdGVtcDEsc3RvcmVMZXZlbCAgICAgICAgICAgICAgICAgICAgIAotCi1mdHlwZTIKLQotICAgICAgICA7Ly8gZnR5cGUgPTI7IEVzY2FwZSBtb2RlID0yCi0gICAgICAgIAotICAgICAgICBNX0xEUiAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEscHBSTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgOy8vIExvYWQgUk1BWCBUYWJsZSAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgQ01QICAgICAgICAgICAgIGZ0eXBlLCMyCi0gICAgICAgIEJORSAgICAgICAgICAgICBGaWxsVkxETDEKLSAgICAgICAgICAgICAgICAgIAotICAgICAgICBBREQgICAgICAgICAgICB0ZW1wMSwgcFJNQVhUYWJsZUwwTDEsIExhc3QsIExTTCM0ICAgICAgICAgICAgICAgOy8vIElmIExhc3Q9MSBhZGQgMzIgdG8gdGFibGUgYWRkcmVzcwotICAgICAgICBTVUIgICAgICAgICAgICAgdGVtcDIsc3RvcmVMZXZlbCwjMQotICAgICAgICBMRFJCICAgICAgICAgICAgdGVtcDEsW3RlbXAxLHRlbXAyXQotCi0gICAgICAgCi0gICAgICAgIEFERCAgICAgICAgICAgICBzdG9yZVJ1bixzdG9yZVJ1biwjMQotICAgICAgICBBREQgICAgICAgICAgICAgc3RvcmVSdW4sdGVtcDEKLSAgICAgICAgCi1GaWxsVkxETDEgICAgICAgIAotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlcgotCi0gICAgICAgIE1fTERSICAgICAgICAgICBwWmlnemFnVGFibGUscHBaaWd6YWdUYWJsZSAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIGFkZHJlc3Mgb2YgemlnemFnVGFibGUgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIE1fQkRfUkVBRDggICAgICBzaWduLDEsVDEKLQotICAgICAgICBDTVAgICAgICAgICAgICAgc2lnbiwjMQotICAgICAgICBSU0JFUSAgICAgICAgICAgc3RvcmVMZXZlbCxzdG9yZUxldmVsLCMwCi0gCi0gICAgICAgIEFERCAgICAgICAgICAgICB0ZW1wMSxzdG9yZVJ1bixDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFeGl0IHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiBSdW4gKyBDb3VudCBleGNlZWRzIDYzCi0gICAgICAgIENNUCAgICAgICAgICAgICB0ZW1wMSwjNjQKLSAgICAgICAgQkdFICAgICAgICAgICAgIEV4aXRFcnJvcgotCi0gICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBUbyBSZWZsZWN0IFJ1bmxlbmdodAotCi0gICAgICAgIEFERCAgICAgICAgICAgICBDb3VudCxDb3VudCxzdG9yZVJ1bgotIAotc3RvcmVMZXZlbEwxCi0gICAgICAgIAotICAgICAgICBMRFJCICAgICAgICAgICAgemlnemFnLFtwWmlnemFnVGFibGUsQ291bnRdCi0gICAgICAgIENNUCAgICAgICAgICAgICBMYXN0LCMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgaWYgdGhlIExldmVsIHZhbCBpcyBMYXN0IG5vbiB6ZXJvIHZhbAotICAgICAgICBBREQgICAgICAgICAgICAgQ291bnQsQ291bnQsIzEKLSAgICAgICAgTFNSICAgICAgICAgICAgIExhc3QsTGFzdCwjMQotICAgICAgICBTVFJIICAgICAgICAgICAgc3RvcmVMZXZlbCxbcERzdCx6aWd6YWddICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgIAotICAgICAgICBCTkUgICAgICAgICAgICAgZW5kCi0gICAgICAgIAotICAgICAgICBCICAgICAgICAgICAgICAgRXhpdE9rCi0gCi0KLQotICAgICAgICA7Ly8gRml4ZWQgTGVuZ2ggRGVjb2RpbmcgRXNjYXBlIE1vZGUgMwotCi1Fc2NhcGVNb2RlMwotCi0gICAgICAgIE1fQkRfUkVBRDggICAgICBMYXN0LDEsVDEKLSAgICAgICAgTV9CRF9SRUFEOCAgICAgIHN0b3JlUnVuLDYsVDEKLSAgICAgICAgCi0gICAgICAgIEFERCAgICAgICAgICAgICB0ZW1wMixzdG9yZVJ1bixDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRXhpdCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgUnVuICsgQ291bnQgZXhjZWVkcyA2MwotICAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDIsIzY0Ci0gICAgICAgIEJHRSAgICAgICAgICAgICBFeGl0RXJyb3IKLQotICAgICAgICBNX0JEX1JFQUQ4ICAgICAgbWFya2VyYml0LDEsVDEKLSAgICAgICAgVEVRICAgICAgICAgICAgIG1hcmtlcmJpdCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFeGl0IHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiBtYXJrZXIgYml0IGlzIHplcm8KLSAgICAgICAgQkVRICAgICAgICAgICAgIEV4aXRFcnJvcgotICAgICAgICAKLSAgICAgICAgTV9CRF9SRUFEMTYgICAgIHN0b3JlTGV2ZWwsMTIsVDEKLQotICAgICAgICBUU1QgICAgICAgICAgICAgc3RvcmVMZXZlbCwjMHg4MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlc3QgaWYgdGhlIGxldmVsIGlzIG5lZ2F0aXZlCi0gICAgICAgIFNVQk5FICAgICAgICAgICBzdG9yZUxldmVsLHN0b3JlTGV2ZWwsIzQwOTYKLSAgICAgICAgQ01QICAgICAgICAgICAgIHN0b3JlTGV2ZWwsIzAKLSAgICAgICAgQ01QTkUgICAgICAgICAgIHN0b3JlTGV2ZWwsIy0yMDQ4Ci0gICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0RXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRXhpdCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgTGV2ZWw9PTAgb3IgIC0yMDQ4IAotCi0gICAgICAgIE1fTERSICAgICAgICAgICBwWmlnemFnVGFibGUscHBaaWd6YWdUYWJsZSAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBhZGRyZXNzIG9mIHppZ3phZ1RhYmxlCi0gICAgICAgICAgICAgIAotICAgICAgICBNX0JEX1JFQUQ4ICAgICAgbWFya2VyYml0LDEsVDEKLSAgICAgICAgICAgCi0KLSAgICAgICAgOy8vIGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyICggU2lnbiBub3QgdXNlZCBhcyBzdG9yZUxldmVsIGlzIHByZXByb2Nlc3NlZCkKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgOy8vIFRvIFJlZmxlY3QgUnVuIExlbmd0aAotCi0gICAgICAgIEFERCAgICAgICAgICAgICBDb3VudCxDb3VudCxzdG9yZVJ1bgotCi0KLSAKLXN0b3JlTGV2ZWxMYXN0Ci0gICAgICAgIAotICAgICAgICBMRFJCICAgICAgICAgICAgemlnemFnLFtwWmlnemFnVGFibGUsQ291bnRdCi0gICAgICAgIENNUCAgICAgICAgICAgICBMYXN0LCMxCi0gICAgICAgIEFERCAgICAgICAgICAgICBDb3VudCxDb3VudCwjMQotICAgICAgICBTVFJIICAgICAgICAgICAgc3RvcmVMZXZlbCxbcERzdCx6aWd6YWddICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgQk5FICAgICAgICAgICAgIGVuZCAKLSAgICAgIAotICAgICAgICBCICAgICAgICAgICAgICAgRXhpdE9rCi0gICAgICAgIAotZW5kCi0KLSAgICAgICAgQ01QICAgICAgICAgICAgIENvdW50LCM2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL1J1biB0aGUgTG9vcCB1bnRpbGwgQ291bnQgcmVhY2hlcyA2NAotCi0gICAgICAgIEJMVCAgICAgICAgICAgICBnZXRWTENiaXRzCi0KLSAgICAgICAgCi1FeGl0T2sKLSAgICAgICAgOy8vIEV4aXQgV2hlbiBWTEMgRGVjb2RpbmcgaXMgZG9uZSBTdWNjZXNzZnVsbHkgCi0gICAKLSAgICAgICAgOy8vIExvYWRpbmcgcHBCaXRTdHJlYW0gYW5kIHBCaXRPZmZzZXQgZnJvbSBzdGFjawotICAgICAgICAKLSAgICAgICAgQ01QICAgICAgICAgICAgIExhc3QsIzEKLSAgICAgICAgTV9MRFIgICAgICAgICAgIHBwQml0U3RyZWFtLHBwcEJpdFN0cmVhbQotICAgICAgICBNX0xEUiAgICAgICAgICAgcEJpdE9mZnNldCxwcE9mZnNldAotCi0gICAgICAgIDsvL0VuZGluZyB0aGUgbWFjcm8KLQotICAgICAgICBNX0JEX0ZJTkkgICAgICAgcHBCaXRTdHJlYW0scEJpdE9mZnNldAotICAgICAgICAgICAgIAotICAgICAgICBNT1ZFUSAgICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyCi0gICAgICAgIE1PVk5FICAgICAgICAgICBSZXR1cm4sI09NWF9TdHNfRXJyCi0gICAgICAgIE1fTERSICAgICAgICAgICBMUixwTGlua1JlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHRoZSBMaW5rIFJlZ2lzdGVyIEJhY2sKLSAgICAgICAgQiAgICAgICAgICAgICAgIGV4aXQyCi0KLUV4aXRFcnJvcgotICAgICAgICA7Ly8gRXhpdCBXaGVuIGFuIEVycm9yIG9jY3VycyAKLQotICAgICAgICBNX0xEUiAgICAgICAgICAgcHBCaXRTdHJlYW0scHBwQml0U3RyZWFtCi0gICAgICAgIE1fTERSICAgICAgICAgICBwQml0T2Zmc2V0LHBwT2Zmc2V0Ci0gICAgICAgIDsvL0VuZGluZyB0aGUgbWFjcm8KLQotICAgICAgICBNX0JEX0ZJTkkgICAgICAgcHBCaXRTdHJlYW0scEJpdE9mZnNldAotICAgICAgICBNX0xEUiAgICAgICAgICAgTFIscExpbmtSZWdpc3RlcgotICAgICAgICBNT1YgICAgICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX0VycgotCi1leGl0MgotICAgICAgIAotCi0gICAgICAgIE1fRU5ECi0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTc3ODMyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotIC8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgMTIyOTAKLSAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKLSAqIERlc2NyaXB0aW9uOiBDb250YWlucyBhbGwgdGhlIEh1ZmZtYW4gdGFibGVzIHVzZWQgaW4gTVBFRzQgY29kZWMKLSAqCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgotCi0KLQotCi0vLyBDb250YWlucyBvcHRpbWl6ZWQgYW5kIFBhY2tlZCBWTEMgdGFibGVzIHdpdGggTGFzdD0wIGFuZCBMYXN0PTEKLQotLy8gICAgICAgICAgICAgIG9wdGltaXplZCBQYWNrZWQgVkxDIHRhYmxlIEVudHJ5IEZvcm1hdCAKLS8vICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIAotLy8gICAgICAgIDE1IDE0IDEzIDEyIDExIDEwIDA5IDA4IDA3IDA2IDA1IDA0IDAzIDAyIDAxIDAwCi0vLyAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotLy8gICAgICAgfCAgTGVuICAgfCAgICAgICBSdW4gICAgICAgfCAgICAgTGV2ZWwgICAgfEwgfCAxIHwKLS8vICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0vLyAgICAgICB8ICAgICAgICAgICAgICAgIE9mZnNldCAgICAgICAgICAgICAgICAgICAgICB8IDAgfAotLy8gICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLS8vIElmIHRoZSB0YWJsZSBlbnRyeSBpcyBhIGxlYWYgZW50cnkgdGhlbiBiaXQgMCBzZXQ6Ci0vLyAgICBMZW4gICAgPSBOdW1iZXIgb2YgYml0cyBvdmVycmVhZCAgKDAgdG8gNykgIDMgYml0cwotLy8gICAgUnVuICAgID0gUnVuTGVuZ3RoIG9mIHRoZSBTeW1ib2wgICgwIHRvIDYzKSA2IGJpdHMKLS8vICAgIExldmVsICA9IExldmVsIG9mIHRoZSBTeW1ib2wgICAgICAoMCB0byAzMSkgNSBiaXRzCi0vLyAgICBMICAgICAgPSBMYXN0IFZhbHVlIG9mIHRoZSBTeW1ib2wgKDAgb3IgMSkgIDEgYml0Ci0vLwotLy8gSWYgdGhlIHRhYmxlIGVudHJ5IGlzIGFuIGludGVybmFsIG5vZGUgdGhlbiBiaXQgMCBpcyBjbGVhcjoKLS8vICAgIE9mZnNldCA9IE51bWJlciBvZiAoMTYtYml0KSBoYWxmIHdvcmRzIGZyb20gdGhlIHRhYmxlCi0vLyAgICAgICAgICAgICBzdGFydCB0byB0aGUgbmV4dCB0YWJsZSBub2RlCi0vLwotLy8gVGhlIHRhYmxlIGlzIGFjY2Vzc2VkIGJ5IHN1Y2Nlc3NpdmUgbG9va3VwIHVwIG9uIHRoZQotLy8gbmV4dCBTdGVwIGJpdHMgb2YgdGhlIGlucHV0IGJpdHN0cmVhbSB1bnRpbCBhIGxlYWYgbm9kZQotLy8gaXMgb2J0YWluZWQuIFRoZSBTdGVwIHNpemVzIGFyZSBzdXBwbGllZCB0byB0aGUgVkxEIG1hY3JvLgotCi0vLyBUaGUgVkxDIHRhYmxlcyB1c2VkIGZvciBJbnRyYSBhbmQgbm9uIGludGEgY29lZmZpY2llbnRzIGluIG5vbiBFc2NhcGUgbW9kZQotLy8gY29udGFpbnMgc3ltYm9scyB3aXRoIGJvdGggTGFzdD0wIGFuZCBMYXN0PTEuCi0vLyBJZiBhIHN5bWJvbCBpcyBub3QgZm91bmQgaW4gdGhlIHRhYmxlIGl0IHdpbGwgYmUgY29kZWQgYXMgMHhGRkYKLSAKLQotY29uc3QgT01YX1UxNiBhcm1WQ000UDJfSW50ZXJWbGNMMEwxWzIwMF0gPSB7Ci0gICAgMHgwMDIwLCAweDAxMDgsIDB4MDE0OCwgMHgwMTcwLCAweDAxNzgsIDB4MDE4MCwgMHgwMTg4LCAweDFiMDksCi0gICAgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDIxMDksIDB4MjEwOSwgMHgwMjA5LCAweDAwMTEsCi0gICAgMHgwMDI4LCAweDAwNjAsIDB4MDBiOCwgMHgwMGUwLCAweDAwMzAsIDB4MDA0OCwgMHgwMDUwLCAweDAwNTgsCi0gICAgMHgzZmZmLCAweDNmZmYsIDB4MDAzOCwgMHgwMDQwLCAweDIxMTUsIDB4MjExNSwgMHgyMDFkLCAweDIwMWQsCi0gICAgMHgyMDU5LCAweDIwNTksIDB4MjA1MSwgMHgyMDUxLCAweDFjMGQsIDB4MWIwZCwgMHgxYTBkLCAweDE5MGQsCi0gICAgMHgwOTExLCAweDA4MTEsIDB4MDcxMSwgMHgwNjExLCAweDA1MTEsIDB4MDMxOSwgMHgwMjE5LCAweDAxMjEsCi0gICAgMHgwMDY4LCAweDAwOTAsIDB4M2ZmZiwgMHgzZmZmLCAweDAwNzAsIDB4MDA3OCwgMHgwMDgwLCAweDAwODgsCi0gICAgMHgyMDYxLCAweDIwNjEsIDB4MjEyOSwgMHgyMTI5LCAweDM3MDksIDB4MzcwOSwgMHgzODA5LCAweDM4MDksCi0gICAgMHgzZDBkLCAweDNkMGQsIDB4M2UwZCwgMHgzZTBkLCAweDNmMGQsIDB4M2YwZCwgMHgyMDBkLCAweDIwMGQsCi0gICAgMHgwMDk4LCAweDAwYTAsIDB4MDBhOCwgMHgwMGIwLCAweDAxMzEsIDB4MDIyMSwgMHgwNDE5LCAweDA1MTksCi0gICAgMHgwNjE5LCAweDBhMTEsIDB4MTkwOSwgMHgxYTA5LCAweDIxMGQsIDB4MjIwZCwgMHgyMzBkLCAweDI0MGQsCi0gICAgMHgyNTBkLCAweDI2MGQsIDB4MjcwZCwgMHgyODBkLCAweDAwYzAsIDB4MDBjOCwgMHgwMGQwLCAweDAwZDgsCi0gICAgMHgwMDQ5LCAweDAwNDEsIDB4MzgwZCwgMHgzODBkLCAweDM3MGQsIDB4MzcwZCwgMHgzNjBkLCAweDM2MGQsCi0gICAgMHgzNTBkLCAweDM1MGQsIDB4MzQwZCwgMHgzNDBkLCAweDMzMGQsIDB4MzMwZCwgMHgzMjBkLCAweDMyMGQsCi0gICAgMHgwMGU4LCAweDAwZjAsIDB4MDBmOCwgMHgwMTAwLCAweDMxMGQsIDB4MzEwZCwgMHgyMDE1LCAweDIwMTUsCi0gICAgMHgzNjA5LCAweDM2MDksIDB4MzUwOSwgMHgzNTA5LCAweDM0MDksIDB4MzQwOSwgMHgzMzA5LCAweDMzMDksCi0gICAgMHgzMjA5LCAweDMyMDksIDB4MzEwOSwgMHgzMTA5LCAweDAxMTAsIDB4MDEzMCwgMHgwMTM4LCAweDAxNDAsCi0gICAgMHgwMTE4LCAweDAxMjAsIDB4MDEyOCwgMHgxMDBkLCAweDMwMDksIDB4MzAwOSwgMHgyZjA5LCAweDJmMDksCi0gICAgMHgyNDExLCAweDI0MTEsIDB4MjMxMSwgMHgyMzExLCAweDIwMzksIDB4MjAzOSwgMHgyMDMxLCAweDIwMzEsCi0gICAgMHgwZjBkLCAweDBlMGQsIDB4MGQwZCwgMHgwYzBkLCAweDBiMGQsIDB4MGEwZCwgMHgwOTBkLCAweDBlMDksCi0gICAgMHgwZDA5LCAweDAyMTEsIDB4MDExOSwgMHgwMDI5LCAweDAxNTAsIDB4MDE1OCwgMHgwMTYwLCAweDAxNjgsCi0gICAgMHgyODBkLCAweDI4MGQsIDB4MjcwZCwgMHgyNzBkLCAweDI2MGQsIDB4MjYwZCwgMHgyNTBkLCAweDI1MGQsCi0gICAgMHgyYzA5LCAweDJjMDksIDB4Yjc1OSwgMHhiNzU5LCAweDJhMDksIDB4MmEwOSwgMHgyMDIxLCAweDIwMjEsCi0gICAgMHgwNDBkLCAweDAzMGQsIDB4MGIzNSwgMHgwMTBkLCAweDA5MDksIDB4MDgwOSwgMHgwNzA5LCAweDA2MDksCi0gICAgMHgwMTExLCAweDAwMTksIDB4MjUwOSwgMHgyNTA5LCAweDI0MDksIDB4MjQwOSwgMHgyMzA5LCAweDIzMDkKLX07Ci0KLQotY29uc3QgT01YX1UxNiBhcm1WQ000UDJfSW50cmFWbGNMMEwxWzIwMF0gPSB7Ci0gICAgMHgwMDIwLCAweDAxMDgsIDB4MDE0OCwgMHgwMTcwLCAweDAxNzgsIDB4MDE4MCwgMHgwMTg4LCAweDBmMDksCi0gICAgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDIwMTEsIDB4MjAxMSwgMHgwMTA5LCAweDAwMTksCi0gICAgMHgwMDI4LCAweDAwNjAsIDB4MDBiOCwgMHgwMGUwLCAweDAwMzAsIDB4MDA0OCwgMHgwMDUwLCAweDAwNTgsCi0gICAgMHgzZmZmLCAweDNmZmYsIDB4MDAzOCwgMHgwMDQwLCAweDIwM2QsIDB4MjAzZCwgMHgyMDM1LCAweDIwMzUsCi0gICAgMHgyMGIxLCAweDIwYjEsIDB4MjBhOSwgMHgyMGE5LCAweDAyMTUsIDB4MDExZCwgMHgwMDJkLCAweDBkMDksCi0gICAgMHgwNTE5LCAweDA4MTEsIDB4MDQxOSwgMHgwMzIxLCAweDAyMjEsIDB4MDEzOSwgMHgwMGExLCAweDAwOTksCi0gICAgMHgwMDY4LCAweDAwOTAsIDB4M2ZmZiwgMHgzZmZmLCAweDAwNzAsIDB4MDA3OCwgMHgwMDgwLCAweDAwODgsCi0gICAgMHgyMGI5LCAweDIwYjksIDB4MjBjMSwgMHgyMGMxLCAweDIxNDEsIDB4MjE0MSwgMHgyOTExLCAweDI5MTEsCi0gICAgMHgyMzE1LCAweDIzMTUsIDB4MjQxNSwgMHgyNDE1LCAweDJmMGQsIDB4MmYwZCwgMHgzMDBkLCAweDMwMGQsCi0gICAgMHgwMDk4LCAweDAwYTAsIDB4MDBhOCwgMHgwMGIwLCAweDAwYzksIDB4MDBkMSwgMHgwMGQ5LCAweDAxNDksCi0gICAgMHgwNjE5LCAweDAxNTEsIDB4MDIyOSwgMHgwNzE5LCAweDBlMDksIDB4MDA0NSwgMHgwNTE1LCAweDA2MTUsCi0gICAgMHgxMTBkLCAweDEyMGQsIDB4MTMwZCwgMHgxNDBkLCAweDAwYzAsIDB4MDBjOCwgMHgwMGQwLCAweDAwZDgsCi0gICAgMHgwMDkxLCAweDAwODksIDB4MmUwZCwgMHgyZTBkLCAweDJkMGQsIDB4MmQwZCwgMHgyYzBkLCAweDJjMGQsCi0gICAgMHgyYjBkLCAweDJiMGQsIDB4MmEwZCwgMHgyYTBkLCAweDIxMTUsIDB4MjExNSwgMHgyMDI1LCAweDIwMjUsCi0gICAgMHgwMGU4LCAweDAwZjAsIDB4MDBmOCwgMHgwMTAwLCAweDJjMDksIDB4MmMwOSwgMHgyYjA5LCAweDJiMDksCi0gICAgMHgyNzExLCAweDI3MTEsIDB4MjYxMSwgMHgyNjExLCAweDI1MTEsIDB4MjUxMSwgMHgyMzE5LCAweDIzMTksCi0gICAgMHgyMjE5LCAweDIyMTksIDB4MjEzMSwgMHgyMTMxLCAweDAxMTAsIDB4MDEzMCwgMHgwMTM4LCAweDAxNDAsCi0gICAgMHgwMTE4LCAweDAxMjAsIDB4MDEyOCwgMHgwODBkLCAweDIxMjksIDB4MjEyOSwgMHgyMDgxLCAweDIwODEsCi0gICAgMHgyNDExLCAweDI0MTEsIDB4MjA3OSwgMHgyMDc5LCAweDIwNzEsIDB4MjA3MSwgMHgyMDY5LCAweDIwNjksCi0gICAgMHgxYmI1LCAweDA2MGQsIDB4MDAxZCwgMHhkM2Y5LCAweDA5MDksIDB4MDgwOSwgMHgwOTBkLCAweDAzMTEsCi0gICAgMHgwMTIxLCAweDAwNjEsIDB4MDA1OSwgMHgwMDUxLCAweDAxNTAsIDB4MDE1OCwgMHgwMTYwLCAweDAxNjgsCi0gICAgMHgyNDBkLCAweDI0MGQsIDB4MjMwZCwgMHgyMzBkLCAweDI2MDksIDB4MjYwOSwgMHgyNTBkLCAweDI1MGQsCi0gICAgMHgyNzA5LCAweDI3MDksIDB4MjIxMSwgMHgyMjExLCAweDIxMTksIDB4MjExOSwgMHgyMDQ5LCAweDIwNDksCi0gICAgMHgwMDE1LCAweDA1MDksIDB4MDIwZCwgMHgwMTBkLCAweDA0MDksIDB4MDMwOSwgMHgwMDQxLCAweDAwMzksCi0gICAgMHgwMTExLCAweDAwMzEsIDB4MjIwOSwgMHgyMjA5LCAweDIwMjksIDB4MjAyOSwgMHgyMDIxLCAweDIwMjEKLX07Ci0KLWNvbnN0IE9NWF9VMTYgYXJtVkNNNFAyX2FJbnRyYURDTHVtYUNocm9tYUluZGV4WzY0XSA9IHsKLSAgICAweDAwMjAsIDB4MDAwYiwgMHgyMDA5LCAweDIwMDksIDB4MjAwNywgMHgyMDA3LCAweDIwMDEsIDB4MjAwMSwKLSAgICAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywKLSAgICAweDAwMjgsIDB4MDAwZiwgMHgyMDBkLCAweDIwMGQsIDB4MDAzMCwgMHgwMDEzLCAweDIwMTEsIDB4MjAxMSwKLSAgICAweDAwMzgsIDB4MDAxNywgMHgyMDE1LCAweDIwMTUsIDB4M2ZmZiwgMHgzZmZmLCAweDIwMTksIDB4MjAxOSwKLQotCTB4MDAyMCwgMHgwMDA5LCAweDIwMDcsIDB4MjAwNywgMHg0MDA1LCAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LAotICAgIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLAotICAgIDB4MDAyOCwgMHgwMDBkLCAweDIwMGIsIDB4MjAwYiwgMHgwMDMwLCAweDAwMTEsIDB4MjAwZiwgMHgyMDBmLAotICAgIDB4MDAzOCwgMHgwMDE1LCAweDIwMTMsIDB4MjAxMywgMHgxZmZmLCAweDAwMTksIDB4MjAxNywgMHgyMDE3Ci19OwotCi0KLWNvbnN0IE9NWF9VMTYgYXJtVkNNNFAyX2FWbGNNVkRbMTI0XSA9IHsKLSAgICAweDAwMTAsIDB4MDBmMCwgMHgwMDQzLCAweDAwM2YsIDB4NDA0MSwgMHg0MDQxLCAweDQwNDEsIDB4NDA0MSwKLSAgICAweDAwMTgsIDB4MDBkOCwgMHgwMDQ3LCAweDAwM2IsIDB4MDAyMCwgMHgwMDgwLCAweDAwYTgsIDB4MDBkMCwKLSAgICAweDAwMjgsIDB4MDA0OCwgMHgwMDcwLCAweDAwNzgsIDB4MWZmZiwgMHgwMDMwLCAweDAwMzgsIDB4MDA0MCwKLSAgICAweDAwODEsIDB4MDAwMSwgMHgwMDdmLCAweDAwMDMsIDB4MjA3ZCwgMHgyMDdkLCAweDIwMDUsIDB4MjAwNSwKLSAgICAweDIwN2IsIDB4MjA3YiwgMHgyMDA3LCAweDIwMDcsIDB4MDA1MCwgMHgwMDU4LCAweDAwNjAsIDB4MDA2OCwKLSAgICAweDIwNzksIDB4MjA3OSwgMHgyMDA5LCAweDIwMDksIDB4MjA3NywgMHgyMDc3LCAweDIwMGIsIDB4MjAwYiwKLSAgICAweDIwNzUsIDB4MjA3NSwgMHgyMDBkLCAweDIwMGQsIDB4MjA3MywgMHgyMDczLCAweDIwMGYsIDB4MjAwZiwKLSAgICAweDAwNzEsIDB4MDAxMSwgMHgwMDZmLCAweDAwMTMsIDB4MDA2ZCwgMHgwMDE1LCAweDAwNmIsIDB4MDAxNywKLSAgICAweDAwODgsIDB4MDA5MCwgMHgwMDk4LCAweDAwYTAsIDB4MDA2OSwgMHgwMDE5LCAweDAwNjcsIDB4MDAxYiwKLSAgICAweDAwNjUsIDB4MDAxZCwgMHgwMDYzLCAweDAwMWYsIDB4MDA2MSwgMHgwMDIxLCAweDAwNWYsIDB4MDAyMywKLSAgICAweDAwNWQsIDB4MDAyNSwgMHgwMDViLCAweDAwMjcsIDB4MDBiMCwgMHgwMGI4LCAweDAwYzAsIDB4MDBjOCwKLSAgICAweDAwNTksIDB4MDAyOSwgMHgwMDU3LCAweDAwMmIsIDB4MjA1NSwgMHgyMDU1LCAweDIwMmQsIDB4MjAyZCwKLSAgICAweDIwNTMsIDB4MjA1MywgMHgyMDJmLCAweDIwMmYsIDB4MjA1MSwgMHgyMDUxLCAweDIwMzEsIDB4MjAzMSwKLSAgICAweDIwNGYsIDB4MjA0ZiwgMHgyMDMzLCAweDIwMzMsIDB4MDBlMCwgMHgwMGU4LCAweDAwNDksIDB4MDAzOSwKLSAgICAweDIwNGQsIDB4MjA0ZCwgMHgyMDM1LCAweDIwMzUsIDB4MjA0YiwgMHgyMDRiLCAweDIwMzcsIDB4MjAzNywKLSAgICAweDIwNDUsIDB4MjA0NSwgMHgyMDNkLCAweDIwM2QKLX07Ci0KLS8qIExNQVggdGFibGUgZm9yIG5vbiBJbnRlciAoTGFzdCA9PSAwIGFuZCBMYXN0PTEpCi0gICBMZXZlbCAtIDEgSW5kZXhlZAotICAgcGFkZGVkIGFybVZDTTRQMl9JbnRlckwwTDFMTUFYWzI3LTMxXSB3aXRoIHplcm9zIHRvIGFjZXNzIGVudHJpZXMgZm9yIExhc3Q9MSBlZmZlY3RpdmVseQotCi0qLwotY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwwTDFMTUFYWzczXSA9IAotewotICAgMTIsICA2LCAgNCwgIDMsICAzLCAgMywgIDMsICAyLCAKLSAgICAyLCAgMiwgIDIsICAxLCAgMSwgIDEsICAxLCAgMSwKLSAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKLSAgICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwKLSAgICAzLCAgMiwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgCi0JMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCi0JMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCi0JMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCi0JMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCi0JMQotfTsKLQotLyogUk1BWCB0YWJsZSBmb3Igbm9uIEludGVyIChMYXN0ID09IDAgYW5kIExhc3Q9MSkKLSAgIExldmVsIC0gMSBJbmRleGVkIAotIHBhZGRlZCBhcm1WQ000UDJfSW50ZXJMMEwxUk1BWFsxMi0zMV0gd2l0aCB6ZXJvcyB0byBhY2Nlc3MgZW50cmllcyBmb3IgTGFzdD0xIHRhYmxlIGVmZmVjdGl2ZWx5ICovCi0KLQotY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwwTDFSTUFYWzM1XSA9IAotewotICAgMjYsIDEwLCAgNiwgIDIsICAxLCAgMSwgICAKLSAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCi0JMCwJMCwJMCwJMCwJMCwJMCwKLQkwLAkwLAkwLAkwLAkwLAkwLAotCTAsCTAsCTAsCTAsCi0gICAgMCwgIDAsICAwLCAgMCwgIDQwLCAgMSwgIDAKLX07Ci0KLS8qIExNQVggdGFibGUgZm9yIG5vbiBJbnRyYSAoTGFzdCA9PSAwIGFuZCBMYXN0PTEpCi0gICBMZXZlbCAtIDEgSW5kZXhlZAotICAgcGFkZGVkIGFybVZDTTRQMl9JbnRyYUwwTDFMTUFYWzE1LTMxXSB3aXRoIHplcm9zIHRvIGFjZXNzIGVudHJpZXMgZm9yIExhc3Q9MSBlZmZlY3RpdmVseQotCi0qLwotY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwwTDFMTUFYWzUzXSA9IAotewotICAgMjcsIDEwLCAgNSwgIDQsICAzLCAgMywgIDMsICAKLSAgICAzLCAgMiwgIDIsICAxLCAgMSwgIDEsICAxLCAgMSwJMCwKLQkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAotCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCi0KLQk4LCAgMywgIDIsICAyLCAgMiwgIDIsICAyLCAgMSwgCi0JMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCi0JMSwgIDEsICAxLCAgMSwgIDEKLX07Ci0KLQotLyogUk1BWCB0YWJsZSBmb3Igbm9uIEludGVyIChMYXN0ID09IDAgYW5kIExhc3Q9MSkKLSAgIExldmVsIC0gMSBJbmRleGVkIAotIHBhZGRlZCBhcm1WQ000UDJfSW50cmFMMEwxUk1BWFsyNy0zMV0gd2l0aCB6ZXJvcyB0byBhY2Nlc3MgZW50cmllcyBmb3IgTGFzdD0xIHRhYmxlIGVmZmVjdGl2ZWx5ICovCi0KLQotY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwwTDFSTUFYWzQwXSA9Ci17Ci0gICAxNCwgIDksICA3LCAgMywgIDIsICAxLAkxLCAgCi0gICAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAJMCwgIAotICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAKLSAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAotCTAsCTAsCTAsCTAsCi0JCi0JMjAsICA2LCAgMSwgIDAsICAwLCAgMCwgIDAsICAwCi0KLX07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfTG9va3VwX1RhYmxlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTE1ZDNjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfTG9va3VwX1RhYmxlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotIC8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfTG9va3VwX1RhYmxlcy5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDEyMjkwCi0gKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBGaWxlOiAgICAgICAgYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYwotICogRGVzY3JpcHRpb246IENvbnRhaW5zIGFsbCB0aGUgTG9va3VwIHRhYmxlcyB1c2VkIGluIE1QRUc0IGNvZGVjCi0gKgotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotCi0gICAgLyogKiBUYWJsZSBFbnRyaWVzIGNvbnRhaW4gRGMgU2NhbGVyIHZhbHVlcwotICAgICAgICogYXJtVkNNNFAyX0RDU2NhbGVyW2ldPSA4ICAgICAgICAgICBmb3IgaT0xICB0byAgNCBhbmQgaT0zMyB0byAzNgotICAgICAgICogICAgICAgICAgICAgICAgICAgICAgPSAyKmkgICAgICAgICBmb3IgaT01ICB0byAgOAotICAgICAgICogICAgICAgICAgICAgICAgICAgICAgPSBpKzggICAgICAgICBmb3IgaT05ICB0byAgMjUKLSAgICAgICAqICAgICAgICAgICAgICAgICAgICAgID0gMippLTE2ICAgICAgZm9yIGk9MjYgdG8gIDMxCi0gICAgICAgKiAgICAgICAgICAgICAgICAgICAgICA9IChpLTMyKzEzKS8yIGZvciBpPTM3IHRvICA1OQotICAgICAgICogICAgICAgICAgICAgICAgICAgICAgPSBpLTYtMzIgICAgICBmb3IgaT02MCB0byAgNjMKLSAgICAgICAqICAgICAgICAgICAgICAgICAgICAgID0gMjU1ICAgICAgICAgZm9yIGk9MCBhbmQgaT0zMgotICAgICAgICovCi0gICAgICAgCi1jb25zdCBPTVhfVTggYXJtVkNNNFAyX0RDU2NhbGVyWzY0XT17Ci0JMHhmZiwgMHg4LCAgMHg4LCAgMHg4LCAgMHg4LCAgMHhhLCAgMHhjLCAgMHhlLCAgCi0gICAgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgCi0gICAgMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwKLSAgICAweDIwLCAweDIyLCAweDI0LCAweDI2LCAweDI4LCAweDJhLCAweDJjLCAweDJlLAotICAgIDB4ZmYsIDB4OCwgIDB4OCwgIDB4OCwgIDB4OCwgIDB4OSwgIDB4OSwgIDB4YSwgIAotICAgIDB4YSwgIDB4YiwgIDB4YiwgIDB4YywgIDB4YywgIDB4ZCwgIDB4ZCwgIDB4ZSwgIAotICAgIDB4ZSwgIDB4ZiwgIDB4ZiwgIDB4MTAsIDB4MTAsIDB4MTEsIDB4MTEsIDB4MTIsIAotICAgIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIDB4MTgsIDB4MTksCi0KLX07Ci0KLSAgICAgICAgICAgICAgCi0gICAgIC8qICBUYWJsZSBFbnRyaWVzIENvbnRhaW4gcmVjaXByb2NhbCBvZiAxIHRvIDYzCi0gICAgICAqICBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMTZbaV09cm91bmQoMzI3NjcvaSkKLSAgICAgICogIGFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MxNlswXT0gMAotICAgICAgKi8KLQotY29uc3QgT01YX1MxNiBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMTZbNjRdPXsKLQkweDAwMDAsMHg3ZmZmLDB4NDAwMCwweDJhYWEsMHgyMDAwLDB4MTk5OSwweDE1NTUsMHgxMjQ5LAotICAgIDB4MTAwMCwweDBlMzksMHgwY2NkLDB4MGJhMywweDBhYWIsMHgwOWQ5LDB4MDkyNSwweDA4ODgsCi0gICAgMHgwODAwLDB4MDc4NywweDA3MWMsMHgwNmJkLDB4MDY2NiwweDA2MTgsMHgwNWQxLDB4MDU5MSwKLSAgICAweDA1NTUsMHgwNTFmLDB4MDRlYywweDA0YmUsMHgwNDkyLDB4MDQ2YSwweDA0NDQsMHgwNDIxLAotICAgIDB4MDQwMCwweDAzZTEsMHgwM2M0LDB4MDNhOCwweDAzOGUsMHgwMzc2LDB4MDM1ZSwweDAzNDgsCi0gICAgMHgwMzMzLDB4MDMxZiwweDAzMGMsMHgwMmZhLDB4MDJlOSwweDAyZDgsMHgwMmM4LDB4MDJiOSwKLSAgICAweDAyYWIsMHgwMjlkLDB4MDI4ZiwweDAyODIsMHgwMjc2LDB4MDI2YSwweDAyNWYsMHgwMjU0LAotICAgIDB4MDI0OSwweDAyM2YsMHgwMjM1LDB4MDIyYiwweDAyMjIsMHgwMjE5LDB4MDIxMSwweDAyMDgKLQkgICAKLX07Ci0gICAgIAotICAgICAgLyogVGFibGUgRW50cmllcyBDb250YWluIHJlY2lwcm9jYWwgb2YgMSB0byA2MwotICAgICAgICogYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzMyW2ldPXJvdW5kKDEzMTA3MS9pKQotICAgICAgICogYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzMyWzBdPSAwCi0gICAgICAgKi8KLQotY29uc3QgT01YX1MzMiBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMzJbNjRdPXsKLQkweDAwMDAwMDAwLDB4MDAwMWZmZmYsMHgwMDAxMDAwMCwweDAwMDBhYWFhLCAweDAwMDA4MDAwLCAweDAwMDA2NjY2LCAweDAwMDA1NTU1LCAweDAwMDA0OTI0LAotICAgIDB4MDAwMDQwMDAsMHgwMDAwMzhlMywweDAwMDAzMzMzLDB4MDAwMDJlOGMsIDB4MDAwMDJhYWIsIDB4MDAwMDI3NjIsIDB4MDAwMDI0OTIsIDB4MDAwMDIyMjIsCi0gICAgMHgwMDAwMjAwMCwweDAwMDAxZTFlLDB4MDAwMDFjNzIsMHgwMDAwMWFmMiwgMHgwMDAwMTk5YSwgMHgwMDAwMTg2MSwgMHgwMDAwMTc0NiwgMHgwMDAwMTY0MywKLSAgICAweDAwMDAxNTU1LDB4MDAwMDE0N2IsMHgwMDAwMTNiMSwweDAwMDAxMmY2LCAweDAwMDAxMjQ5LCAweDAwMDAxMWE4LCAweDAwMDAxMTExLCAweDAwMDAxMDg0LAotICAgIDB4MDAwMDEwMDAsMHgwMDAwMGY4NCwweDAwMDAwZjBmLDB4MDAwMDBlYTEsIDB4MDAwMDBlMzksIDB4MDAwMDBkZDYsIDB4MDAwMDBkNzksIDB4MDAwMDBkMjEsCi0gICAgMHgwMDAwMGNjZCwweDAwMDAwYzdkLDB4MDAwMDBjMzEsMHgwMDAwMGJlOCwgMHgwMDAwMGJhMywgMHgwMDAwMGI2MSwgMHgwMDAwMGIyMSwgMHgwMDAwMGFlNSwKLSAgICAweDAwMDAwYWFiLDB4MDAwMDBhNzMsMHgwMDAwMGEzZCwweDAwMDAwYTBhLCAweDAwMDAwOWQ5LCAweDAwMDAwOWE5LCAweDAwMDAwOTdiLCAweDAwMDAwOTRmLAotICAgIDB4MDAwMDA5MjUsMHgwMDAwMDhmYiwweDAwMDAwOGQ0LDB4MDAwMDA4YWUsIDB4MDAwMDA4ODksIDB4MDAwMDA4NjUsIDB4MDAwMDA4NDIsIDB4MDAwMDA4MjAKLQkKLX07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1NldFByZWREaXJfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9TZXRQcmVkRGlyX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYzZjM2My4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1NldFByZWREaXJfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDJfU2V0UHJlZERpcl9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLTsgKioKLTsgKiBGdW5jdGlvbjogYXJtVkNNNFAyX1NldFByZWREaXIKLTsgKgotOyAqIERlc2NyaXB0aW9uOgotOyAqIFBlcmZvcm1zIGRldGVjdGluZyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24KLTsgKgotOyAqIFJlbWFya3M6Ci07ICoKLTsgKiBQYXJhbWV0ZXJzOgotOyAqIFtpbl0gYmxvY2tJbmRleCAgYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kCi07ICogICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uIGFzIGRlZmluZWQgaW4gc3ViY2xhdXNlIDYuMS4zLjgsIG9mIElTTy9JRUMKLTsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ0OTYtMi4gRnVydGhlcm1vcmUsIGluZGV4ZXMgNiB0byA5IGluZGljYXRlIHRoZQotOyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSBibG9ja3Mgc3BhdGlhbGx5IGNvcnJlc3BvbmRpbmcgdG8gbHVtaW5hbmNlCi07ICogICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrcyAwIHRvIDMgaW4gdGhlIHNhbWUgbWFjcm9ibG9jay4KLTsgKiBbaW5dIHBDb2VmQnVmUm93IHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXIKLTsgKiBbaW5dIHBRcEJ1ZiAgICAgIHBvaW50ZXIgdG8gdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYnVmZmVyCi07ICogW291dF1wcmVkUVAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sKLTsgKiBbb3V0XXByZWREaXIgICAgIGluZGljYXRlcyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggdGFrZXMgb25lCi07ICogICAgICAgICAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKLTsgKiAgICAgICAgICAgICAgICAgIE9NWF9WQ19IT1JJWk9OVEFMICAgIHByZWRpY3QgaG9yaXpvbnRhbGx5Ci07ICogICAgICAgICAgICAgICAgICBPTVhfVkNfVkVSVElDQUwgICAgICBwcmVkaWN0IHZlcnRpY2FsbHkKLTsgKgotOyAqIFJldHVybiBWYWx1ZToKLTsgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLTsgKgotOyAqLwotCi0gICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgSU5DTFVERSBvbXhWQ19zLmgKLQotCi0gICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLQotCi0gICAgICAgSUYgQVJNMTEzNkpTCi0gCi07Ly8gSW5wdXQgQXJndW1lbnRzCi1CbG9ja0luZGV4ICAgICAgICAgUk4gMAotcENvZWZCdWZSb3cgICAgICAgIFJOIDEKLXBDb2VmQnVmQ29sICAgICAgICBSTiAyCi1wcmVkRGlyICAgICAgICAgICAgUk4gMwotcHJlZFFQICAgICAgICAgICAgIFJOIDQKLXBRcEJ1ZiAgICAgICAgICAgICBSTiA1Ci0KLTsvLyBMb2NhbCBWYXJpYWJsZXMKLQotUmV0dXJuICAgICAgICAgICAgIFJOIDAKLWJsb2NrRENMZWZ0ICAgICAgICBSTiA2ICAKLWJsb2NrRENUb3AgICAgICAgICBSTiA3Ci1ibG9ja0RDVG9wTGVmdCAgICAgUk4gOAotdGVtcDEgICAgICAgICAgICAgIFJOIDkKLXRlbXAyICAgICAgICAgICAgICBSTiAxNAotCi0gICAgICAgTV9TVEFSVCAgICBhcm1WQ000UDJfU2V0UHJlZERpcixyOQotCi0gICAgICAgTV9BUkcgICAgICAgcHByZWRRUCw0Ci0gICAgICAgTV9BUkcgICAgICAgcHBRcEJ1Ziw0Ci0gICAgCi0gICAgICAgTERSSCAgICAgICAgYmxvY2tEQ1RvcExlZnQsW3BDb2VmQnVmUm93LCMtMTZdCi0gICAgICAgTERSSCAgICAgICAgYmxvY2tEQ0xlZnQsW3BDb2VmQnVmQ29sXQotICAgICAgIAotICAgICAgIFRFUSAgICAgICAgIEJsb2NrSW5kZXgsIzMKLSAgICAgICBMRFJFUUggICAgICBibG9ja0RDVG9wLFtwQ29lZkJ1ZkNvbCwjLTE2XQotICAgICAgIExEUk5FSCAgICAgIGJsb2NrRENUb3AsW3BDb2VmQnVmUm93XQotICAgICAgICAgICAgIAotICAgICAgIFNVQlMgICAgICAgIHRlbXAxLGJsb2NrRENMZWZ0LGJsb2NrRENUb3BMZWZ0Ci0gICAgICAgUlNCTFQgICAgICAgdGVtcDEsdGVtcDEsIzAKLSAgICAgICBTVUJTICAgICAgICB0ZW1wMixibG9ja0RDVG9wTGVmdCxibG9ja0RDVG9wCi0gICAgICAgUlNCTFQgICAgICAgdGVtcDIsdGVtcDIsIzAKLSAgICAgIAotICAgICAgIE1fTERSICAgICAgIHBRcEJ1ZixwcFFwQnVmCi0gICAgICAgTV9MRFIgICAgICAgcHJlZFFQLHBwcmVkUVAKLSAgICAgICBDTVAgICAgICAgICB0ZW1wMSx0ZW1wMgotICAgICAgIE1PViAgICAgICAgIHRlbXAyLCNPTVhfVkNfVkVSVElDQUwKLSAgICAgICBMRFJMVEIgICAgICB0ZW1wMSxbcFFwQnVmLCMxXQotICAgICAgIFNUUkxUICAgICAgIHRlbXAyLFtwcmVkRGlyXQotICAgICAgIFNUUkxUICAgICAgIHRlbXAxLFtwcmVkUVBdCi0gICAgICAgTU9WICAgICAgICAgdGVtcDIsI09NWF9WQ19IT1JJWk9OVEFMICAgICAgICAgICAKLSAgICAgICBMRFJHRUIgICAgICB0ZW1wMSxbcFFwQnVmXQotICAgICAgIFNUUkdFICAgICAgIHRlbXAyLFtwcmVkRGlyXQotICAgICAgIE1PViAgICAgICAgIFJldHVybiwjT01YX1N0c19Ob0VycgotICAgICAgIFNUUkdFICAgICAgIHRlbXAxLFtwcmVkUVBdIAotCi0gICAgICAgICAKLSAgICAKLSAgICAgICBNX0VORAotIAotICAgICAgIEVORElGCi0KLSAgICAgICBFTkQgICAgCi0gICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfWmlnemFnX1RhYmxlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTliNDM0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfWmlnemFnX1RhYmxlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgMTIyOTAKLSAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5jCi0gKiBEZXNjcmlwdGlvbjogQ29udGFpbnMgdGhlIHppZ3phZyB0YWJsZXMKLSAqCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0KLS8qIENvbnRhaW5zIERvdWJsZSB0aGUgdmFsdWVzIGluIHRoZSByZWZlcmVuY2UgWmlnemFnIFRhYmxlCi0gKiBDb250YWlucyBDbGFzc2ljYWwsVmV0aWNhbCBhbmQgSG9yaXpvbnRhbCBaaWd6YWdzY2FuIHRhYmxlcyBpbiBvbmUgYXJyYXkgIAotICovCi0KLWNvbnN0IE9NWF9VOCBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gWzE5Ml0gPSAKLXsKLSAgICAgMCwgIDIsICAxNiwgMzIsICAxOCwgIDQsICA2LCAyMCwKLSAgICAzNCwgNDgsIDY0LCA1MCwgMzYsIDIyLCAgOCwgIDEwLAotICAgIDI0LCAzOCwgNTIsIDY2LCA4MCwgOTYsIDgyLCA2OCwKLSAgICA1NCwgNDAsIDI2LCAgMTIsICAxNCwgMjgsIDQyLCA1NiwgCi0gICAgNzAsIDg0LCA5OCwgMTEyLCAxMTQsIDEwMCwgODYsIDcyLAotICAgIDU4LCA0NCwgMzAsIDQ2LCA2MCwgNzQsIDg4LCAxMDIsCi0gICAgMTE2LCAxMTgsIDEwNCwgOTAsIDc2LCA2MiwgNzgsIDkyLAotICAgIDEwNiwgMTIwLCAxMjIsIDEwNCwgOTQsIDExMCwgMTI0LCAxMjYsCi0KLQkwLCAgMTYsIDMyLCA0OCwgIDIsICAxOCwgIDQsIDIwLAotICAgIDM0LCA1MCwgNjQsIDgwLCA5NiwgMTEyLCAxMTQsIDk4LAotICAgIDgyLCA2NiwgNTIsIDM2LCAgNiwgMjIsICA4LCAyNCwKLSAgICAzOCwgNTQsIDY4LCA4NCwgMTAwLCAxMTYsIDcwLCA4NiwKLSAgICAxMDIsIDExOCwgNDAsIDU2LCAgMTAsIDI2LCAgMTIsIDI4LAotICAgIDQyLCA1OCwgNzIsIDg4LCAxMDQsIDEyMCwgNzQsIDkwLCAKLSAgICAxMDYsIDEyMiwgNDQsIDYwLCAgMTQsIDMwLCA0NiwgNjIsCi0gICAgNzYsIDkyLCAxMDgsIDEyNCwgNzgsIDk0LCAxMTAsIDEyNiwKLQotICAgIDAsICAyLCAgNCwgIDYsICAxNiwgIDE4LCAzMiwgMzQsCi0gICAgMjAsIDIyLCAgOCwgIDEwLCAgMTIsICAxNCwgMzAsIDI4LAotICAgIDI2LCAyNCwgMzgsIDM2LCA0OCwgNTAsIDY0LCA2NiwKLSAgICA1MiwgNTQsIDQwLCA0MiwgNDQsIDQ2LCA1NiwgNTgsCi0gICAgNjAsIDYyLCA2OCwgNzAsIDgwLCA4MiwgOTYsIDk4LAotICAgIDg0LCA4NiwgNzIsIDc0LCA3NiwgNzgsIDg4LCA5MCwgCi0gICAgOTIsIDk0LCAxMDAsIDEwMiwgMTEyLCAxMTQsIDExNiwgMTE4LAotICAgIDEwNCwgMTA2LCAxMDgsIDExMCwgMTIwLCAxMjIsIDEyNCwgMTI2Ci0KLQotfTsKLQotCi0KLQotCi0vKiBFbmQgb2YgZmlsZSAqLwotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTM0NmFkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICAxMjI5MAotICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246IAotICogQ29udGFpbnMgbW9kdWxlcyBmb3IgaW50ZXIgcmVjb25zdHJ1Y3Rpb24KLSAqIAotICovCi0gCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlcgotICoKLSAqIERlc2NyaXB0aW9uOgotICogRGVjb2RlcyB0aGUgSU5URVIgYmxvY2sgY29lZmZpY2llbnRzLiBJbnZlcnNlIHF1YW50aXphdGlvbiwgaW52ZXJzZWx5IHppZ3phZwotICogcG9zaXRpb25pbmcgYW5kIElEQ1QsIHdpdGggYXBwcm9wcmlhdGUgY2xpcHBpbmcgb24gZWFjaCBzdGVwLCBhcmUgcGVyZm9ybWVkCi0gKiBvbiB0aGUgY29lZmZpY2llbnRzLiBUaGUgcmVzdWx0cyAocmVzaWR1YWxzKSBhcmUgcGxhY2VkIGluIGEgY29udGlndW91cyBhcnJheQotICogb2YgNjQgZWxlbWVudHMuIEZvciBJTlRFUiBibG9jaywgdGhlIG91dHB1dCBidWZmZXIgaG9sZHMgdGhlIHJlc2lkdWFscyBmb3IKLSAqIGZ1cnRoZXIgcmVjb25zdHJ1Y3Rpb24uCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi0gKgkJCQkJCQkJdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiBUaGVyZSBpcyBubyBib3VuZGFyeQotICoJCQkJCQkJCWNoZWNrIGZvciB0aGUgYml0IHN0cmVhbSBidWZmZXIuCi0gKiBbaW5dCXBCaXRPZmZzZXQJCXBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi0gKgkJCQkJCQkJdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4KLSAqCQkJCQkJCQlbMC03XQotICogW2luXQlRUAkJCQlxdWFudGl6YXRpb24gcGFyYW1ldGVyCi0gKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgICAgYSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOwotICogICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xIGluZGljYXRlcyB1c2luZyBxdWFudGl6YXRpb24gbWV0aG9kIGRlZmluZWQgaW4gc2hvcnQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8gaGVhZGVyIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIGluZGljYXRlcyBub3JtYWlsIHF1YW50aXphdGlvbiBtZXRob2QuCi0gKiBbb3V0XSBwcEJpdFN0cmVhbSAJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQsIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4KLSAqIFtvdXRdIHBCaXRPZmZzZXQJCSpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbQotICogW291dF0gcERzdAkJCXBvaW50ZXIgdG8gdGhlIGRlY29kZWQgcmVzaWR1YWwgYnVmZmVyIChhIGNvbnRpZ3VvdXMgYXJyYXkgb2YgNjQgZWxlbWVudHMgb2YKLSAqICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMTYgZGF0YSB0eXBlKS4gTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1N0c19Ob0VyciAtIG5vIGVycm9yCi0gKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKLSAqICAgLSBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOdWxsOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0ICwgcERzdAotICogICAtIEF0IGxlYXN0IG9uZSBvZiB0aGUgYmVsb3cgY2FzZToKLSAqICAgLSAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddLCBRUCA8PSAwOwotICoJIC0gcERzdCBub3QgMTYtYnl0ZSBhbGlnbmVkCi0gKiBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvcgotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIoCi0gICAgIGNvbnN0IE9NWF9VOCAqKiBwcEJpdFN0cmVhbSwKLSAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCi0gICAgIE9NWF9TMTYgKiBwRHN0LAotICAgICBPTVhfSU5UIFFQLAotICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSkKLXsKLSAgICAvKiA2NCBlbGVtZW50cyBhcmUgbmVlZGVkIGJ1dCB0byBhbGlnbiBpdCB0byAxNiBieXRlcyBuZWVkCi0gICAgMTUgbW9yZSBlbGVtZW50cyBvZiBwYWRkaW5nICovCi0gICAgT01YX1MxNiB0ZW1wQnVmWzc5XTsKLSAgICBPTVhfUzE2ICpwVGVtcEJ1ZjE7Ci0gICAgT01YUmVzdWx0IGVycm9yQ29kZTsKLSAgICAvKiBBbGlnbmluZyB0aGUgbG9jYWwgYnVmZmVycyAqLwotICAgIHBUZW1wQnVmMSA9IGFybUFsaWduVG8xNkJ5dGVzKHRlbXBCdWYpOwotICAgIAotICAgIAotICAgIC8qIFZMRCBhbmQgemlnemFnICovCi0gICAgZXJyb3JDb2RlID0gb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcihwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBCdWYxLHNob3J0VmlkZW9IZWFkZXIpOwotICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOwotICAgIAotICAgIC8qIERlcXVhbnRpemF0aW9uICovCi0gICAgZXJyb3JDb2RlID0gb214VkNNNFAyX1F1YW50SW52SW50ZXJfSSgKLSAgICAgcFRlbXBCdWYxLAotICAgICBRUCk7Ci0gICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7Ci0gICAgCi0gICAgLyogSW52ZXJzZSB0cmFuc2Zvcm0gKi8KLSAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfSURDVDh4OGJsayhwVGVtcEJ1ZjEsIHBEc3QpOwotICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOwotCSAgICAKLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFlYzVkMi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgMTIyOTAKLSAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOiAKLSAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGludHJhIHJlY29uc3RydWN0aW9uCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qIEZ1bmN0aW9uIGZvciBzYXR1cmF0aW5nIDE2IGJpdCB2YWx1ZXMgdG8gdGhlIFswLDI1NV0gcmFuZ2UgYW5kICAqLwotLyogd3JpdGluZyBvdXQgYXMgOCBiaXQgdmFsdWVzLiAgRG9lcyA2NCBlbnRyaWVzICAgICAgICAgICAgICAgICAgICovCi12b2lkIGFybVZDTTRQMl9DbGlwOChPTVhfUzE2ICpwU3JjLCBPTVhfVTggKnBEc3QsIE9NWF9JTlQgZHN0U3RlcCApOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYQotICoKLSAqIERlc2NyaXB0aW9uOgotICogRGVjb2RlcyB0aGUgSU5UUkEgYmxvY2sgY29lZmZpY2llbnRzLiBJbnZlcnNlIHF1YW50aXphdGlvbiwgaW52ZXJzZWx5IHppZ3phZwotICogcG9zaXRpb25pbmcsIGFuZCBJRENULCB3aXRoIGFwcHJvcHJpYXRlIGNsaXBwaW5nIG9uIGVhY2ggc3RlcCwgYXJlIHBlcmZvcm1lZAotICogb24gdGhlIGNvZWZmaWNpZW50cy4gVGhlIHJlc3VsdHMgYXJlIHRoZW4gcGxhY2VkIGluIHRoZSBvdXRwdXQgZnJhbWUvcGxhbmUgb24KLSAqIGEgcGl4ZWwgYmFzaXMuIEZvciBJTlRSQSBibG9jaywgdGhlIG91dHB1dCB2YWx1ZXMgYXJlIGNsaXBwZWQgdG8gWzAsIDI1NV0gYW5kCi0gKiB3cml0dGVuIHRvIGNvcnJlc3BvbmRpbmcgYmxvY2sgYnVmZmVyIHdpdGhpbiB0aGUgZGVzdGluYXRpb24gcGxhbmUuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi0gKgkJCQkJCQkJdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiBUaGVyZSBpcyBubyBib3VuZGFyeQotICoJCQkJCQkJCWNoZWNrIGZvciB0aGUgYml0IHN0cmVhbSBidWZmZXIuCi0gKiBbaW5dCXBCaXRPZmZzZXQJCXBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi0gKgkJCQkJCQkJdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4KLSAqCQkJCQkJCQlbMC03XS4KLSAqIFtpbl0Jc3RlcAkJCXdpZHRoIG9mIHRoZSBkZXN0aW5hdGlvbiBwbGFuZQotICogW2luL291dF0JcENvZWZCdWZSb3cJCVtpbl0gIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgW291dF0gdXBkYXRlZCBjb2VmZmljaWVudCByd28gYnVmZmVyCi0gKiBbaW4vb3V0XQlwQ29lZkJ1ZkNvbAkJW2luXSAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcgotICogICAgICAgICAgICAgICAgICAgICAgICBbb3V0XSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIKLSAqIFtpbl0JY3VyUVAJCQlxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBtYWNyb2Jsb2NrIHdoaWNoCi0gKgkJCQkJCQkJdGhlIGN1cnJlbnQgYmxvY2sgYmVsb25ncyB0bwotICogW2luXQlwUXBCdWYJCSBQb2ludGVyIHRvIGEgMi1lbGVtZW50IFFQIGFycmF5LiBwUXBCdWZbMF0gaG9sZHMgdGhlIFFQIG9mIHRoZSA4eDggYmxvY2sgbGVmdCB0bwotICogICAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgYmxvY2soUVBhKS4gcFFwQnVmWzFdIGhvbGRzIHRoZSBRUCBvZiB0aGUgOHg4IGJsb2NrIGp1c3QgYWJvdmUgdGhlCi0gKiAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJsb2NrKFFQYykuCi0gKiAgICAgICAgICAgICAgICAgICBOb3RlLCBpbiBjYXNlIHRoZSBjb3JyZXNwb25kaW5nIGJsb2NrIGlzIG91dCBvZiBWT1AgYm91bmQsIHRoZSBRUCB2YWx1ZSB3aWxsIGhhdmUKLSAqICAgICAgICAgICAgICAgICAgIG5vIGVmZmVjdCB0byB0aGUgaW50cmEtcHJlZGljdGlvbiBwcm9jZXNzLiBSZWZlciB0byBzdWJjbGF1c2UgICI3LjQuMy4zIEFkYXB0aXZlCi0gKiAgICAgICAgICAgICAgICAgICBhYyBjb2VmZmljaWVudCBwcmVkaWN0aW9uIiBvZiBJU08vSUVDIDE0NDk2LTIoTVBFRzQgUGFydDIpIGZvciBhY2N1cmF0ZSBkZXNjcmlwdGlvbi4KLSAqIFtpbl0JYmxvY2tJbmRleAkJYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kCi0gKgkJCQkJCQkJcG9zaXRpb24gYXMgZGVmaW5lZCBpbiBzdWJjbGF1c2UgNi4xLjMuOCwKLSAqCQkJCQkJCQlGaWd1cmUgNi01IG9mIElTTy9JRUMgMTQ0OTYtMi4gCi0gKiBbaW5dCWludHJhRENWTEMJCWEgY29kZSBkZXRlcm1pbmVkIGJ5IGludHJhX2RjX3ZsY190aHIgYW5kIFFQLgotICoJCQkJCQkJCVRoaXMgYWxsb3dzIGEgbWVjaGFuaXNtIHRvIHN3aXRjaCBiZXR3ZWVuIHR3byBWTEMKLSAqCQkJCQkJCQlmb3IgY29kaW5nIG9mIEludHJhIERDIGNvZWZmaWNpZW50cyBhcyBwZXIgVGFibGUKLSAqCQkJCQkJCQk2LTIxIG9mIElTTy9JRUMgMTQ0OTYtMi4gCi0gKiBbaW5dCUFDUHJlZEZsYWcJCWEgZmxhZyBlcXVhbCB0byBhY19wcmVkX2ZsYWcgKG9mIGx1bWluYW5jZSkgaW5kaWNhdGluZwotICoJCQkJCQkJCWlmIHRoZSBhYyBjb2VmZmljaWVudHMgb2YgdGhlIGZpcnN0IHJvdyBvciBmaXJzdAotICoJCQkJCQkJCWNvbHVtbiBhcmUgZGlmZmVyZW50aWFsbHkgY29kZWQgZm9yIGludHJhIGNvZGVkCi0gKgkJCQkJCQkJbWFjcm9ibG9jay4KLSAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciAgICBhIGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgbW9kZSwKLSAqCQkJCQkJCWFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9ubGluZWFyIGludHJhIERDIG1vZGUuCi0gKiBbb3V0XQlwcEJpdFN0cmVhbQkJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzCi0gKgkJCQkJCQkJZGVjb2RlZCwgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZQotICoJCQkJCQkJCWluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlcgotICogW291dF0JcEJpdE9mZnNldAkJKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLSAqCQkJCQkJCQljdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci0gKgkJCQkJCQkJKnBwQml0U3RyZWFtCi0gKiBbb3V0XQlwRHN0CQkJcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIGRlc3RpbmF0aW9uIHBsYW5lLgotICoJCQkJCQkJCXBEc3Qgc2hvdWxkIGJlIDE2LWJ5dGUgYWxpZ25lZC4KLSAqIFtvdXRdCXBDb2VmQnVmUm93CQlwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIuCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1N0c19Ob0VyciAtIG5vIGVycm9yCi0gKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKLSAqICAgLQlBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29lZkJ1ZlJvdywgcENvZWZCdWZDb2wsIHBRUEJ1ZiwgcERzdC4KLSAqICAgICAgb3IKLSAqICAgLSAgQXQgbGVhc3Qgb25lIG9mIHRoZSBiZWxvdyBjYXNlOiAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddLCBjdXJRUCBleGNlZWRzICgxLCAzMSksCi0gKiAgICAgIGJsb2NrSW5kZXggZXhjZWVkcyBbMCw5XSwgc3RlcCBpcyBub3QgdGhlIG11bHRpcGxlIG9mIDgsIGludHJhRENWTEMgaXMgemVybyB3aGlsZQotICogICAgICBibG9ja0luZGV4IGdyZWF0ZXIgdGhhbiA1LgotICogICAgICBvcgotICogICAtCXBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZAotICogT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEoCi0gICAgIGNvbnN0IE9NWF9VOCAqKiBwcEJpdFN0cmVhbSwKLSAgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICAgT01YX1U4ICpwRHN0LAotICAgICBPTVhfSU5UIHN0ZXAsCi0gICAgIE9NWF9TMTYgKnBDb2VmQnVmUm93LAotICAgICBPTVhfUzE2ICpwQ29lZkJ1ZkNvbCwKLSAgICAgT01YX1U4IGN1clFQLAotICAgICBjb25zdCBPTVhfVTggKnBRUEJ1ZiwKLSAgICAgT01YX0lOVCBibG9ja0luZGV4LAotICAgICBPTVhfSU5UIGludHJhRENWTEMsCi0gICAgIE9NWF9JTlQgQUNQcmVkRmxhZywKLQkgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0gKQotewotICAgIE9NWF9TMTYgdGVtcEJ1ZjFbNzldLCB0ZW1wQnVmMls3OV07Ci0gICAgT01YX1MxNiAqcFRlbXBCdWYxLCAqcFRlbXBCdWYyOwotICAgIE9NWF9JTlQgcHJlZERpciwgcHJlZEFDRGlyOwotICAgIE9NWF9JTlQgIHByZWRRUDsKLSAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXA7Ci0gICAgT01YUmVzdWx0IGVycm9yQ29kZTsKLSAgICAKLSAgICAKLSAgICAvKiBBbGlnbmluZyB0aGUgbG9jYWwgYnVmZmVycyAqLwotICAgIHBUZW1wQnVmMSA9IGFybUFsaWduVG8xNkJ5dGVzKHRlbXBCdWYxKTsKLSAgICBwVGVtcEJ1ZjIgPSBhcm1BbGlnblRvMTZCeXRlcyh0ZW1wQnVmMik7Ci0gICAgCi0gICAgLyogU2V0dGluZyB0aGUgQUMgcHJlZGljdGlvbiBkaXJlY3Rpb24gYW5kIHByZWRpY3Rpb24gZGlyZWN0aW9uICovCi0gICAgYXJtVkNNNFAyX1NldFByZWREaXIoCi0gICAgICAgIGJsb2NrSW5kZXgsCi0gICAgICAgIHBDb2VmQnVmUm93LAotICAgICAgICBwQ29lZkJ1ZkNvbCwKLSAgICAgICAgJnByZWREaXIsCi0gICAgICAgICZwcmVkUVAsCi0gICAgICAgIHBRUEJ1Zik7Ci0KLSAgICBwcmVkQUNEaXIgPSBwcmVkRGlyOwotCi0gICAgCi0gICAgaWYgKEFDUHJlZEZsYWcgPT0gMCkKLSAgICB7Ci0gICAgICAgIHByZWRBQ0RpciA9IE9NWF9WQ19OT05FOwotICAgIH0KLQotICAgIC8qIFNldHRpbmcgdGhlIHZpZGVvQ29tcCAqLwotICAgIGlmIChibG9ja0luZGV4IDw9IDMpCi0gICAgewotICAgICAgICB2aWRlb0NvbXAgPSBPTVhfVkNfTFVNSU5BTkNFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB2aWRlb0NvbXAgPSBPTVhfVkNfQ0hST01JTkFOQ0U7Ci0gICAgfQotICAgIAotCi0gICAgLyogVkxEIGFuZCB6aWd6YWcgKi8KLSAgICBpZiAoaW50cmFEQ1ZMQyA9PSAxKQotICAgIHsKLSAgICAgICAgZXJyb3JDb2RlID0gb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDKAotICAgICAgICAgICAgcHBCaXRTdHJlYW0sCi0gICAgICAgICAgICBwQml0T2Zmc2V0LAotICAgICAgICAgICAgcFRlbXBCdWYxLAotICAgICAgICAgICAgcHJlZEFDRGlyLAotICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlciwKLSAgICAgICAgICAgIHZpZGVvQ29tcCk7Ci0gICAgICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMoCi0gICAgICAgICAgICBwcEJpdFN0cmVhbSwKLSAgICAgICAgICAgIHBCaXRPZmZzZXQsCi0gICAgICAgICAgICBwVGVtcEJ1ZjEsCi0gICAgICAgICAgICBwcmVkQUNEaXIsCi0gICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyKTsKLSAgICAgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7Ci0gICAgfQotCi0gICAgLyogQUMgREMgcHJlZGljdGlvbiAqLwotICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEoCi0gICAgICAgIHBUZW1wQnVmMSwKLSAgICAgICAgcENvZWZCdWZSb3csCi0gICAgICAgIHBDb2VmQnVmQ29sLAotICAgICAgICBjdXJRUCwKLSAgICAgICAgcHJlZFFQLAotICAgICAgICBwcmVkRGlyLAotICAgICAgICBBQ1ByZWRGbGFnLAotICAgICAgICB2aWRlb0NvbXApOwotICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOwotICAgIAotICAgIC8qIERlcXVhbnRpemF0aW9uICovCi0gICAgZXJyb3JDb2RlID0gb214VkNNNFAyX1F1YW50SW52SW50cmFfSSgKLSAgICAgcFRlbXBCdWYxLAotICAgICBjdXJRUCwKLSAgICAgdmlkZW9Db21wLAotICAgICBzaG9ydFZpZGVvSGVhZGVyKTsKLSAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKLSAgICAKLSAgICAvKiBJbnZlcnNlIHRyYW5zZm9ybSAqLwotICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9JRENUOHg4YmxrIChwVGVtcEJ1ZjEsIHBUZW1wQnVmMik7Ci0gICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7Ci0gICAgCi0gICAgLyogUGxhY2luZyB0aGUgbGluZWFyIGFycmF5IGludG8gdGhlIGRlc3RpbmF0aW9uIHBsYW5lIGFuZCBjbGlwcGluZwotICAgICAgIGl0IHRvIDAgdG8gMjU1ICovCi0gICAgCi0JYXJtVkNNNFAyX0NsaXA4KHBUZW1wQnVmMixwRHN0LHN0ZXApOwotCQotCQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1Bfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGU5NTM4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUF9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsgKioqKioqKioqKgotOyAqIAotOyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QX3MucwotOyAqIE9wZW5NQVggREw6IHYxLjAuMgotOyAqIFJldmlzaW9uOiAgIDEyMjkwCi07ICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07ICogCi07ICogCi07ICogCi07ICogCi07ICoqCi07ICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QCi07ICoKLTsgKiBEZXNjcmlwdGlvbjoKLTsgKiBEZWNvZGVzIGFuZCBwYWRzIGZvdXIgbW90aW9uIHZlY3RvcnMgb2YgdGhlIG5vbi1pbnRyYSBtYWNyb2Jsb2NrIGluIFAtVk9QLgotOyAqIFRoZSBtb3Rpb24gdmVjdG9yIHBhZGRpbmcgcHJvY2VzcyBpcyBzcGVjaWZpZWQgaW4gc3ViY2xhdXNlIDcuNi4xLjYgb2YKLTsgKiBJU08vSUVDIDE0NDk2LTIuCi07ICoKLTsgKiBSZW1hcmtzOgotOyAqCi07ICoKLTsgKiBQYXJhbWV0ZXJzOgotOyAqIFtpbl0gICAgcHBCaXRTdHJlYW0gICAgICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgotOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlcgotOyAqIFtpbl0gICAgcEJpdE9mZnNldCAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi07ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4KLTsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC03XS4KLTsgKiBbaW5dICAgIHBTcmNNVkxlZnRNQiAgICAgICBwb2ludGVycyB0byB0aGUgbW90aW9uIHZlY3RvciBidWZmZXJzIG9mIHRoZQotOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9ja3Mgc3BlY2lhbGx5IGF0IHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jawotOyAqICAgICAgICAgICAgICAgICAgICAgcmVzcGVjdGl2ZWx5LgotOyAqIFtpbl0gICAgcFNyY01WVXBwZXJNQiAgICAgIHBvaW50ZXJzIHRvIHRoZSBtb3Rpb24gdmVjdG9yIGJ1ZmZlcnMgb2YgdGhlCi07ICogICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrcyBzcGVjaWFsbHkgYXQgdGhlIHVwcGVyIHNpZGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jawotOyAqICAgICAgICAgICAgICAgICAgICAgcmVzcGVjdGl2ZWx5LgotOyAqIFtpbl0gICAgcFNyY01WVXBwZXJSaWdodE1CIHBvaW50ZXJzIHRvIHRoZSBtb3Rpb24gdmVjdG9yIGJ1ZmZlcnMgb2YgdGhlCi07ICogICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrcyBzcGVjaWFsbHkgYXQgdGhlIHVwcGVyLXJpZ2h0IHNpZGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jawotOyAqICAgICAgICAgICAgICAgICAgICAgcmVzcGVjdGl2ZWx5LgotOyAqIFtpbl0gICAgZmNvZGVGb3J3YXJkICAgICAgIGEgY29kZSBlcXVhbCB0byB2b3BfZmNvZGVfZm9yd2FyZCBpbiBNUEVHLTQKLTsgKiAgICAgICAgICAgICAgICAgICAgIGJpdCBzdHJlYW0gc3ludGF4Ci07ICogW2luXSAgICBNQlR5cGUgICAgICAgICB0aGUgdHlwZSBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLiBJZiBNQlR5cGUKLTsgKiAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCBlcXVhbCB0byBPTVhfVkNfSU5URVI0ViwgdGhlIGRlc3RpbmF0aW9uCi07ICogICAgICAgICAgICAgICAgICAgICBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBpcyBzdGlsbCBmaWxsZWQgd2l0aCB0aGUKLTsgKiAgICAgICAgICAgICAgICAgICAgIHNhbWUgZGVjb2RlZCB2ZWN0b3IuCi07ICogW291dF0gICBwcEJpdFN0cmVhbSAgICAgICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkLAotOyAqICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0Ci07ICogICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyCi07ICogW291dF0gICBwQml0T2Zmc2V0ICAgICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLTsgKiAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLTsgKiAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbQotOyAqIFtvdXRdICAgcERzdE1WQ3VyTUIgICAgICAgICBwb2ludGVyIHRvIHRoZSBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBvZiB0aGUgY3VycmVudAotOyAqICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9jayB3aGljaCBjb250YWlucyBmb3VyIGRlY29kZWQgbW90aW9uIHZlY3RvcnMKLTsgKgotOyAqIFJldHVybiBWYWx1ZToKLTsgKiBPTVhfU3RzX05vRXJyIC1ubyBlcnJvcgotOyAqIAotOyAqICAgICAgICAgICAgICAgICAgICAgCi07ICogT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IKLTsgKgotOyAqCi0gICAgIAotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9CaXREZWNfcy5oCi0gICAgICAgIElOQ0xVREUgb214VkNfcy5oCi0gICAgICAgIAotICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0gICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICBJRiBBUk0xMTM2SlMKLQotOy8vSW5wdXQgQXJndW1lbnRzCi0KLXBwQml0U3RyZWFtICAgICAgICAgICBSTiAwCi1wQml0T2Zmc2V0ICAgICAgICAgICAgUk4gMQotcFNyY01WTGVmdE1CICAgICAgICAgIFJOIDIKLXBTcmNNVlVwcGVyTUIgICAgICAgICBSTiAzCi1wU3JjTVZVcHBlclJpZ2h0TUIgICAgUk4gNAotcERzdE1WQ3VyTUIgICAgICAgICAgIFJOIDUKLWZjb2RlRm9yd2FyZCAgICAgICAgICBSTiA2Ci1NQlR5cGUgICAgICAgICAgICAgICAgUk4gNwotCi07Ly9Mb2NhbCBWYXJpYWJsZXMKLQotemVybyAgICAgICAgICAgICAgICAgIFJOIDQKLW9uZSAgICAgICAgICAgICAgICAgICBSTiA0Ci1zY2FsZUZhY3RvciAgICAgICAgICAgUk4gMQotCi0KLVJldHVybiAgICAgICAgICAgICAgICBSTiAwCi0KLVZsY01WRCAgICAgICAgICAgICAgICBSTiAwCi1pbmRleCAgICAgICAgICAgICAgICAgUk4gNAotQ291bnQgICAgICAgICAgICAgICAgIFJOIDcKLQotbXZIb3JEYXRhICAgICAgICAgICAgIFJOIDQKLW12SG9yUmVzaWR1YWwgICAgICAgICBSTiAwCi0KLW12VmVyRGF0YSAgICAgICAgICAgICBSTiA0ICAgICAgICAgICAgIAotbXZWZXJSZXNpZHVhbCAgICAgICAgIFJOIDAKLQotdGVtcCAgICAgICAgICAgICAgICAgIFJOIDEKLQotdGVtcDEgICAgICAgICAgICAgICAgIFJOIDMKLUhpZ2ggICAgICAgICAgICAgICAgICBSTiA0Ci1Mb3cgICAgICAgICAgICAgICAgICAgUk4gMgotUmFuZ2UgICAgICAgICAgICAgICAgIFJOIDEKLQotQmxrQ291bnQgICAgICAgICAgICAgIFJOIDE0Ci0KLWRpZmZNVmR4ICAgICAgICAgICAgICBSTiAwCi1kaWZmTVZkeSAgICAgICAgICAgICAgUk4gMQotCi07Ly8gU2NyYXRjaCBSZWdpc3RlcnMKLQotUkJpdFN0cmVhbSAgICAgICAgICAgIFJOIDgKLVJCaXRDb3VudCAgICAgICAgICAgICBSTiA5Ci1SQml0QnVmZmVyICAgICAgICAgICAgUk4gMTAKLQotVDEgICAgICAgICAgICAgICAgICAgIFJOIDExCi1UMiAgICAgICAgICAgICAgICAgICAgUk4gMTIKLUxSICAgICAgICAgICAgICAgICAgICBSTiAxNAotCi0gICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9hVmxjTVZECi0gICAgICAgSU1QT1JUICAgICAgICAgIG9teFZDTTRQMl9GaW5kTVZwcmVkCi0KLSAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5ICAgICAgICAKLSAgICAgICAKLSAgICAgICBNX0FMTE9DNCAgICAgICAgcHBEc3RNVkN1ck1CLDQKLSAgICAgICBNX0FMTE9DNCAgICAgICAgcERzdE1WUHJlZE1FLDQKLSAgICAgICBNX0FMTE9DNCAgICAgICAgcEJsa0NvdW50LDQKLSAgICAgICAKLSAgICAgICBNX0FMTE9DNCAgICAgICAgcHBwQml0U3RyZWFtLDQKLSAgICAgICBNX0FMTE9DNCAgICAgICAgcHBCaXRPZmZzZXQsNAotICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFNyY01WTGVmdE1CLDQKLSAgICAgICBNX0FMTE9DNCAgICAgICAgcHBTcmNNVlVwcGVyTUIsNAotICAgICAgIAotICAgICAgIE1fQUxMT0M0ICAgICAgICBwZGlmZk1WZHgsNAotICAgICAgIE1fQUxMT0M0ICAgICAgICBwZGlmZk1WZHksNAotICAgICAgIE1fQUxMT0M0ICAgICAgICBwSGlnaCw0Ci0gICAgICAgCi0gICAgICAgICAgICAgIAotCi0KLSAgICAgICBNX1NUQVJUICAgb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AscjExCi0gICAgICAgCi0gICAgICAgTV9BUkcgICAgICAgICAgIHBTcmNNVlVwcGVyUmlnaHRNQm9uU3RhY2ssNCAgICAgICAgICAgOy8vIHBvaW50ZXIgdG8gIHBTcmNNVlVwcGVyUmlnaHRNQiBvbiBzdGFjawotICAgICAgIE1fQVJHICAgICAgICAgICBwRHN0TVZDdXJNQm9uU3RhY2ssNCAgICAgICAgICAgICAgICAgIDsvLyBwb2ludGVyIHRvIHBEc3RNVkN1ck1CIG9uIHN0YWNrCi0gICAgICAgTV9BUkcgICAgICAgICAgIGZjb2RlRm9yd2FyZG9uU3RhY2ssNCAgICAgICAgICAgICAgICAgOy8vIHBvaW50ZXIgdG8gZmNvZGVGb3J3YXJkIG9uIHN0YWNrIAotICAgICAgIE1fQVJHICAgICAgICAgICBNQlR5cGVvblN0YWNrLDQgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwb2ludGVyIHRvIE1CVHlwZSBvbiBzdGFjawotCi0gICAgICAKLSAgICAgICAKLSAgICAgICAKLSAgICAgICAKLSAgICAgICA7Ly8gSW5pdGlhbGl6aW5nIHRoZSBCaXRTdHJlYW0gTWFjcm8KLQotICAgICAgIE1fQkRfSU5JVDAgICAgICBwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgUkJpdFN0cmVhbSwgUkJpdEJ1ZmZlciwgUkJpdENvdW50Ci0gICAgICAgTV9MRFIgICAgICAgICAgIE1CVHlwZSxNQlR5cGVvblN0YWNrICAgICAgICAgICAgICAgICAgOy8vIExvYWQgTUJUeXBlIGZyb20gc3RhY2sKLSAgICAgICBNX0xEUiAgICAgICAgICAgcERzdE1WQ3VyTUIscERzdE1WQ3VyTUJvblN0YWNrICAgICAgICA7Ly8gTG9hZCBwRHN0TVZDdXJNQiBmcm9tIHN0YWNrCi0gICAgICAgTU9WICAgICAgICAgICAgIHplcm8sIzAKLQotICAgICAgIFRFUSAgICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRSQSAgICAgICAgICAgICAgICAgIDsvLyBDaGVjayBpZiBNQlR5cGU9T01YX1ZDX0lOVFJBCi0gICAgICAgVEVRTkUgICAgICAgICAgIE1CVHlwZSwjT01YX1ZDX0lOVFJBX1EgICAgICAgICAgICAgICAgOy8vIGNoZWNrIGlmIE1CVHlwZT1PTVhfVkNfSU5UUkFfUQotICAgICAgIFNUUkVRICAgICAgICAgICB6ZXJvLFtwRHN0TVZDdXJNQl0KLSAgICAgICBNX0JEX0lOSVQxICAgICAgVDEsIFQyLCBUMgotICAgICAgIFNUUkVRICAgICAgICAgICB6ZXJvLFtwRHN0TVZDdXJNQiwjNF0KLSAgICAgICBNX0JEX0lOSVQyICAgICAgVDEsIFQyLCBUMgotICAgICAgIFNUUkVRICAgICAgICAgICB6ZXJvLFtwRHN0TVZDdXJNQiwjNF0KLSAgICAgICBNT1ZFUSAgICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyCi0gICAgICAgTU9WICAgICAgICAgICAgIEJsa0NvdW50LCMwCi0gICAgICAgU1RSRVEgICAgICAgICAgIHplcm8sW3BEc3RNVkN1ck1CLCM0XQotICAgICAgIAotICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0T0sKLQotICAgICAgIFRFUSAgICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRFUjRWICAgICAgICAgICAgICAgIDsvLyBDaGVjayBpZiBNQlR5cGU9T01YX1ZDX0lOVEVSNFYKLSAgICAgICBURVFORSAgICAgICAgICAgTUJUeXBlLCNPTVhfVkNfSU5URVI0Vl9RICAgICAgICAgICAgICA7Ly8gQ2hlY2sgaWYgTUJUeXBlPU9NWF9WQ19JTlRFUjRWX1EKLSAgICAgICBNT1ZFUSAgICAgICAgICAgQ291bnQsIzQKLQotICAgICAgIFRFUSAgICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRFUiAgICAgICAgICAgICAgICAgIDsvLyBDaGVjayBpZiBNQlR5cGU9T01YX1ZDX0lOVEVSCi0gICAgICAgVEVRTkUgICAgICAgICAgIE1CVHlwZSwjT01YX1ZDX0lOVEVSX1EgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIE1CVHlwZT1PTVhfVkNfSU5URVJfUQotICAgICAgIE1PVkVRICAgICAgICAgICBDb3VudCwjMQotICAgICAgIAotICAgICAgIE1fTERSICAgICAgICAgICBmY29kZUZvcndhcmQsZmNvZGVGb3J3YXJkb25TdGFjayAgICAgIDsvLyBMb2FkIGZjb2RlRm9yd2FyZCAgZnJvbSBzdGFjawotCi0gICAgICAgOy8vIFN0b3JpbmcgdGhlIHZhbHVlcyB0ZW1wb3JhcmlseSBvbiBzdGFjawotCi0gICAgICAgTV9TVFIgICAgICAgICAgIHBwQml0U3RyZWFtLHBwcEJpdFN0cmVhbSAgICAgICAgICAgICAgCi0gICAgICAgTV9TVFIgICAgICAgICAgIHBCaXRPZmZzZXQscHBCaXRPZmZzZXQKLSAgICAgICAgICAgIAotCi0gICAgICAgU1VCICAgICAgICAgICAgIHRlbXAsZmNvZGVGb3J3YXJkLCMxICAgICAgICAgICAgICAgICAgOy8vIHRlbXA9ZmNvZGVGb3J3YXJkLTEKLSAgICAgICBNT1YgICAgICAgICAgICAgb25lLCMxCi0gICAgICAgTV9TVFIgICAgICAgICAgIHBTcmNNVkxlZnRNQixwcFNyY01WTGVmdE1CCi0gICAgICAgTFNMICAgICAgICAgICAgIHNjYWxlRmFjdG9yLG9uZSx0ZW1wICAgICAgICAgICAgICAgICAgOy8vIHNjYWxlRmFjdG9yPTE8PChmY29kZUZvcndhcmQtMSkKLSAgICAgICBNX1NUUiAgICAgICAgICAgcFNyY01WVXBwZXJNQixwcFNyY01WVXBwZXJNQgotICAgICAgIExTTCAgICAgICAgICAgICBzY2FsZUZhY3RvcixzY2FsZUZhY3RvciwjNSAgICAgICAgICAgIAotICAgICAgIE1fU1RSICAgICAgICAgICBzY2FsZUZhY3RvcixwSGlnaCAgICAgICAgICAgICAgICAgICAgIDsvLyBbcEhpZ2hdPTMyKnNjYWxlRmFjdG9yCi0gICAgICAgICAgICAgIAotICAgICAgIDsvLyBWTEQgRGVjb2RpbmcKLQotCi1Mb29wCi0KLSAgICAgICBMRFIgICAgICAgICAgICAgVmxjTVZELCA9YXJtVkNNNFAyX2FWbGNNVkQgICAgICAgIDsvLyBMb2FkIHRoZSBvcHRpbWl6ZWQgTVZEIFZMQyB0YWJsZQotCi0gICAgICAgOy8vIEhvcml6b250YWwgRGF0YSBhbmQgUmVzaWR1YWwgY2FsY3VsYXRpb24KLQotICAgICAgIExEUiAgICAgICAgICAgICB0ZW1wLD0weEZGRiAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIE1fQkRfVkxEICAgICAgICBpbmRleCxUMSxUMixWbGNNVkQsMywyICAgICAgICAgICAgICAgIDsvLyB2YXJpYWJsZSBsZW5naHQgZGVjb2RpbmcgdXNpbmcgdGhlIG1hY3JvCi0gICAgICAKLSAgICAgICBURVEgICAgICAgICAgICAgaW5kZXgsdGVtcAotICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0RXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFeGl0IHdpdGggYW4gRXJyb3IgTWVzc2FnZSBpZiB0aGUgZGVjb2RlZCBzeW1ib2wgaXMgYW4gaW52YWxpZWQgc3ltYm9sIAotICAgICAgIAotICAgICAgIFNVQiAgICAgICAgICAgICBtdkhvckRhdGEsaW5kZXgsIzMyICAgICAgICAgICAgICAgICAgIDsvLyBtdkhvckRhdGE9aW5kZXgtMzIgICAgICAgICAgICAgCi0gICAgICAgTU9WICAgICAgICAgICAgIG12SG9yUmVzaWR1YWwsIzEgICAgICAgICAgICAgICAgICAgICAgOy8vIG12SG9yUmVzaWR1YWw9MQotICAgICAgIENNUCAgICAgICAgICAgICBmY29kZUZvcndhcmQsIzEKLSAgICAgICBURVFORSAgICAgICAgICAgbXZIb3JEYXRhLCMwCi0gICAgICAgTU9WRVEgICAgICAgICAgIGRpZmZNVmR4LG12SG9yRGF0YSAgICAgICAgICAgICAgICAgICAgOy8vIGlmIHNjYWxlRmFjdG9yPTEoZmNvZGVGb3J3YXJkPTEpIG9yIG12SG9yRGF0YT0wIGRpZmZNVmR4PW12SG9yRGF0YSAgICAgICAgIAotICAgICAgIEJFUSAgICAgICAgICAgICBWZXJ0aWNhbERhdGEKLSAgICAgICAKLSAgICAgICBTVUIgICAgICAgICAgICAgdGVtcCxmY29kZUZvcndhcmQsIzEKLSAgICAgICBNX0JEX1ZSRUFEOCAgICAgbXZIb3JSZXNpZHVhbCx0ZW1wLFQxLFQyICAgICAgICAgICAgICA7Ly8gZ2V0IG12SG9yUmVzaWR1YWwgZnJvbSBiaXRzdHJlYW0gaWYgZmNvZGVGb3J3YXJkPjEgYW5kIG12SG9yRGF0YSE9MCAgICAgICAgICAgICAgCi0gICAgICAgCi0gICAgICAgQ01QICAgICAgICAgICAgIG12SG9yRGF0YSwjMAotICAgICAgIFJTQkxUICAgICAgICAgICBtdkhvckRhdGEsbXZIb3JEYXRhLCMwICAgICAgICAgICAgICAgIDsvLyBtdkhvckRhdGE9YWJzKG12SG9yRGF0YSkKLSAgICAgICBTVUIgICAgICAgICAgICAgbXZIb3JSZXNpZHVhbCxtdkhvclJlc2lkdWFsLGZjb2RlRm9yd2FyZAotICAgICAgIFNNTEFCQiAgICAgICAgICBkaWZmTVZkeCxtdkhvckRhdGEsZmNvZGVGb3J3YXJkLG12SG9yUmVzaWR1YWwgOy8vIGRpZmZNVmR4PWFicyhtdkhvckRhdGEpKmZjb2RlRm9yd2FyZCttdkhvclJlc2lkdWFsLWZjb2RlRm9yd2FyZAotICAgICAgIEFERCAgICAgICAgICAgICBkaWZmTVZkeCxkaWZmTVZkeCwjMQotICAgICAgIFJTQkxUICAgICAgICAgICBkaWZmTVZkeCxkaWZmTVZkeCwjMAotICAgICAgIAotICAgICAgIDsvLyBWZXJ0aWNhbCBEYXRhIGFuZCBSZXNpZHVhbCBjYWxjdWxhdGlvbgotCi1WZXJ0aWNhbERhdGEKLQotICAgICAgIE1fU1RSICAgICAgICAgICBkaWZmTVZkeCxwZGlmZk1WZHggICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSB0aGUgZGlmZk1WZHggb24gc3RhY2sKLSAgICAgICBMRFIgICAgICAgICAgICAgVmxjTVZELCA9YXJtVkNNNFAyX2FWbGNNVkQgICAgICAgIDsvLyBMb2FkaW5nIHRoZSBhZGRyZXNzIG9mIG9wdGltaXplZCBWTEMgdGFibGVzCi0KLSAgICAgICBMRFIgICAgICAgICAgICAgdGVtcCw9MHhGRkYKLSAgICAgICBNX0JEX1ZMRCAgICAgICAgaW5kZXgsVDEsVDIsVmxjTVZELDMsMiAgICAgICAgICAgICAgICA7Ly8gVkxDIGRlY29kaW5nIHVzaW5nIHRoZSBtYWNybwotICAgICAgIAotICAgICAgIFRFUSAgICAgICAgICAgICBpbmRleCx0ZW1wCi0gICAgICAgQkVRICAgICAgICAgICAgIEV4aXRFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4aXQgd2l0aCBhbiBFcnJvciBNZXNzYWdlIGlmIGFuIEludmFsaWVkIFN5bWJvbCBvY2N1cnMKLSAgICAgICAKLSAgICAgICBTVUIgICAgICAgICAgICAgbXZWZXJEYXRhLGluZGV4LCMzMiAgICAgICAgICAgICAgICAgICA7Ly8gbXZWZXJEYXRhPWluZGV4LTMyICAgICAgICAgICAgIAotICAgICAgIE1PViAgICAgICAgICAgICBtdlZlclJlc2lkdWFsLCMxICAgICAKLSAgICAgICBDTVAgICAgICAgICAgICAgZmNvZGVGb3J3YXJkLCMxCi0gICAgICAgVEVRTkUgICAgICAgICAgIG12VmVyRGF0YSwjMAotICAgICAgIE1PVkVRICAgICAgICAgICBkaWZmTVZkeSxtdlZlckRhdGEgICAgICAgICAgICAgICAgICAgIDsvLyBkaWZmTVZkeSA9IG12VmVyRGF0YSBpZiBzY2FsZUZhY3Rvcj0xKGZjb2RlRm9yd2FyZD0xKSBvciBtdlZlckRhdGE9MAotICAgICAgIEJFUSAgICAgICAgICAgICBGaW5kTVZQcmVkCi0KLSAgICAgICBTVUIgICAgICAgICAgICAgdGVtcCxmY29kZUZvcndhcmQsIzEKLSAgICAgICBNX0JEX1ZSRUFEOCAgICAgbXZWZXJSZXNpZHVhbCx0ZW1wLFQxLFQyICAgICAgICAgICAgICA7Ly8gR2V0IG12VmVyUmVzaWR1YWwgZnJvbSBiaXQgc3RyZWFtIGlmIGZjb2RlRm9yd2FyZD4xIGFuZCBtblZlckRhdGEhPTAKLSAgICAgICAgICAgICAKLQotICAgICAgIENNUCAgICAgICAgICAgICBtdlZlckRhdGEsIzAKLSAgICAgICBSU0JMVCAgICAgICAgICAgbXZWZXJEYXRhLG12VmVyRGF0YSwjMAotICAgICAgIFNVQiAgICAgICAgICAgICBtdlZlclJlc2lkdWFsLG12VmVyUmVzaWR1YWwsZmNvZGVGb3J3YXJkCi0gICAgICAgU01MQUJCICAgICAgICAgIGRpZmZNVmR5LG12VmVyRGF0YSxmY29kZUZvcndhcmQsbXZWZXJSZXNpZHVhbCA7Ly8gZGlmZk1WZHk9YWJzKG12VmVyRGF0YSkqZmNvZGVGb3J3YXJkK212VmVyUmVzaWR1YWwtZmNvZGVGb3J3YXJkCi0gICAgICAgQUREICAgICAgICAgICAgIGRpZmZNVmR5LGRpZmZNVmR5LCMxCi0gICAgICAgUlNCTFQgICAgICAgICAgIGRpZmZNVmR5LGRpZmZNVmR5LCMwCi0KLSAgICAgICA7Ly9DYWxsaW5nIHRoZSBGdW5jdGlvbiBvbXhWQ000UDJfRmluZE1WcHJlZAotICAgICAgICAKLUZpbmRNVlByZWQKLQotICAgICAgIE1fU1RSICAgICAgICAgICBkaWZmTVZkeSxwZGlmZk1WZHkKLSAgICAgICBBREQgICAgICAgICAgICAgdGVtcCxwRHN0TVZDdXJNQixCbGtDb3VudCxMU0wgIzIgICAgICA7Ly8gdGVtcD1wRHN0TVZDdXJNQltCbGtDb3VudF0KLSAgICAgICBNX1NUUiAgICAgICAgICAgdGVtcCxwcERzdE1WQ3VyTUIgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUgdGVtcCBvbiBzdGFjayBmb3IgcGFzc2luZyBhcyBhbiBhcmd1bWVudCB0byBGaW5kTVZQcmVkCi0gICAgICAgCi0gICAgICAgTU9WICAgICAgICAgICAgIHRlbXAsIzAKLSAgICAgICBNX1NUUiAgICAgICAgICAgdGVtcCxwRHN0TVZQcmVkTUUgICAgICAgICAgICAgICAgICAgICA7Ly8gUGFzcyBwRHN0TVZQcmVkTUU9TlVMTCBhcyBhbiBhcmd1bWVudCAgICAgICAgIAotICAgICAgIE1fU1RSICAgICAgICAgICBCbGtDb3VudCxwQmxrQ291bnQgICAgICAgICAgICAgICAgICAgIDsvLyBQYXNzcyBCbGtDb3VudCBhcyBBcmd1bWVudCB0aHJvdWdoIHN0YWNrCi0KLSAgICAgICBNT1YgICAgICAgICAgICAgdGVtcCxwU3JjTVZMZWZ0TUIgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcCAoUk4gMSk9cFNyY01WTGVmdE1CCi0gICAgICAgTV9MRFIgICAgICAgICAgIHBTcmNNVlVwcGVyUmlnaHRNQixwU3JjTVZVcHBlclJpZ2h0TUJvblN0YWNrCi0gICAgICAgTU9WICAgICAgICAgICAgIHBTcmNNVkxlZnRNQixwU3JjTVZVcHBlck1CICAgICAgICAgICAgOy8vIHBTcmNNVkxlZnRNQiAoIFJOIDIpID0gcFNyY01WVXBwZXJNQgotICAgICAgIE1PViAgICAgICAgICAgICBwcEJpdFN0cmVhbSxwRHN0TVZDdXJNQiAgICAgICAgICAgICAgIDsvLyBwcEJpdFN0cmVhbSAgKCBSTiAwKSA9IHBEc3RNVkN1ck1CCi0gICAgICAgTU9WICAgICAgICAgICAgIHBTcmNNVlVwcGVyTUIscFNyY01WVXBwZXJSaWdodE1CICAgICAgOy8vIHBTcmNNVlVwcGVyTUIoIFJOIDMpID0gcFNyY01WVXBwZXJSaWdodE1CICAgICAgCi0gICAgICAgQkwgICAgICAgICAgICAgIG9teFZDTTRQMl9GaW5kTVZwcmVkICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIHN1YnJvdXRpbmUgb214VkNNNFAyX0ZpbmRNVnByZWQKLQotICAgICAgIDsvLyBTdG9yZSBIb3Jpem9udGFsIE1vdGlvbiBWZWN0b3IKLSAgICAgCi0gICAgICAgTV9MRFIgICAgICAgICAgIEJsa0NvdW50LHBCbGtDb3VudCAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgQmxrQ291bnQgZnJvbSBzdGFjawotICAgICAgIE1fTERSICAgICAgICAgICBIaWdoLHBIaWdoICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBIaWdoPTMyKnNjYWxlRmFjdG9yCi0gICAgICAgTFNMICAgICAgICAgICAgIHRlbXAxLEJsa0NvdW50LCMyICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXA9QmxrQ291bnQqNAotICAgICAgIE1fTERSICAgICAgICAgICBkaWZmTVZkeCxwZGlmZk1WZHggICAgICAgICAgICAgICAgICAgIDsvLyBMYWFkIGRpZmZNVmR4Ci0gICAgICAgCi0gICAgICAgTERSU0ggICAgICAgICAgIHRlbXAsW3BEc3RNVkN1ck1CLHRlbXAxXSAgICAgICAgICAgICAgOy8vIHRlbXA9cERzdE1WQ3VyTUJbQmxrQ291bnRdCi0gICAgICAgCi0gICAgICAgCi0gICAgICAgUlNCICAgICAgICAgICAgIExvdyxIaWdoLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvdyA9IC0zMipzY2FsZUZhY3RvcgotICAgICAgIEFERCAgICAgICAgICAgICBkaWZmTVZkeCx0ZW1wLGRpZmZNVmR4ICAgICAgICAgICAgICAgIDsvLyBkaWZmTVZkeD1wRHN0TVZDdXJNQltCbGtDb3VudF0rZGlmZk1WZHgKLSAgICAgICBBREQgICAgICAgICAgICAgUmFuZ2UsSGlnaCxIaWdoICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUmFuZ2U9NjQqU2NhbGVGYWN0b3IKLSAgICAgICBTVUIgICAgICAgICAgICAgSGlnaCxIaWdoLCMxICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSGlnaD0gMzIqc2NhbGVGYWN0b3ItMQotCi0gICAgICAgQ01QICAgICAgICAgICAgIGRpZmZNVmR4LExvdyAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIGRpZmZNVmR4PExvdyAgICAgICAgICAKLSAgICAgICBBRERMVCAgICAgICAgICAgZGlmZk1WZHgsZGlmZk1WZHgsUmFuZ2UgICAgICAgICAgICAgICA7Ly8gZGlmZk1WZHgrPVJhbmdlCi0gICAgICAgIAotICAgICAgIENNUCAgICAgICAgICAgICBkaWZmTVZkeCxIaWdoICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIFNVQkdUICAgICAgICAgICBkaWZmTVZkeCxkaWZmTVZkeCxSYW5nZSAgICAgICAgICAgICAgIDsvLyBJZiBkaWZmTVZkeCA+IEhpZ2ggZGlmZk1WZHgtPVJhbmdlCi0gICAgICAgU1RSSCAgICAgICAgICAgIGRpZmZNVmR4LFtwRHN0TVZDdXJNQix0ZW1wMV0KLQotICAgICAgIDsvLyBTdG9yZSBWZXJ0aWNhbAotCi0gICAgICAgQUREICAgICAgICAgICAgIHRlbXAxLHRlbXAxLCMyICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXAxPTQqQmxrQ291bnQrMgotICAgICAgIE1fTERSICAgICAgICAgICBkaWZmTVZkeCxwZGlmZk1WZHkgICAgICAgICAgICAgICAgICAgIDsvLyBMYWFkIGRpZmZNVmR5Ci0gICAgICAgTERSU0ggICAgICAgICAgIHRlbXAsW3BEc3RNVkN1ck1CLHRlbXAxXSAgICAgICAgICAgICAgOy8vIHRlbXA9cERzdE1WQ3VyTUJbQmxrQ291bnRdLmRpZmZNVmR5Ci0gICAgICAgQUREICAgICAgICAgICAgIEJsa0NvdW50LEJsa0NvdW50LCMxICAgICAgICAgICAgICAgICAgOy8vIEJsa0NvdW50PUJsa0NvdW50KzEKLSAgICAgICBBREQgICAgICAgICAgICAgZGlmZk1WZHgsdGVtcCxkaWZmTVZkeCAgICAgICAgICAgICAgICAKLSAgICAgICBDTVAgICAgICAgICAgICAgZGlmZk1WZHgsTG93Ci0gICAgICAgQURETFQgICAgICAgICAgIGRpZmZNVmR4LGRpZmZNVmR4LFJhbmdlICAgICAgICAgICAgICAgOy8vIElmIGRpZmZNVmR5PExvdyAgZGlmZk1WZHkrPVJhbmdlICAgICAgICAgICAgICAgIAotICAgICAgIENNUCAgICAgICAgICAgICBkaWZmTVZkeCxIaWdoCi0gICAgICAgU1VCR1QgICAgICAgICAgIGRpZmZNVmR4LGRpZmZNVmR4LFJhbmdlICAgICAgICAgICAgICAgOy8vIElmIGRpZmZNVmR5ID4gSGlnaCBkaWZmTVZkeS09UmFuZ2UKLSAgICAgICBTVFJIICAgICAgICAgICAgZGlmZk1WZHgsW3BEc3RNVkN1ck1CLHRlbXAxXSAgICAKLSAgICAgICAKLSAgICAgICBDTVAgICAgICAgICAgICAgQmxrQ291bnQsQ291bnQKLSAgICAgICBNX0xEUiAgICAgICAgICAgcFNyY01WTGVmdE1CLHBwU3JjTVZMZWZ0TUIKLSAgICAgICBNX0xEUiAgICAgICAgICAgcFNyY01WVXBwZXJNQixwcFNyY01WVXBwZXJNQgotCi0gICAgICAgQkxUICAgICAgICAgICAgIExvb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIEJsa0NvdW50PENvdW50IENvbnRpbnVlIHRoZSBMb29wCi0KLQotICAgICAgIDsvLyBJZiBNQlR5cGU9T01YX1ZDX0lOVEVSIG9yIE1CdHlwZT1PTVhfVkNfSU5URVJfUSBjb3B5IHBEc3RNVkN1ck1CWzBdIHRvCi0gICAgICAgOy8vIHBEc3RNVkN1ck1CWzFdLCBwRHN0TVZDdXJNQlsyXSwgcERzdE1WQ3VyTUJbM10gCi0KLSAgICAgICBNX0xEUiAgICAgICAgICAgTUJUeXBlLE1CVHlwZW9uU3RhY2sKLQotICAgICAgIFRFUSAgICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIFRFUU5FICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRFUl9RICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIExEUkVRICAgICAgICAgICB0ZW1wLFtwRHN0TVZDdXJNQl0KLSAgICAgICBNX0xEUiAgICAgICAgICAgcHBCaXRTdHJlYW0scHBwQml0U3RyZWFtCi0gICAgICAgU1RSRVEgICAgICAgICAgIHRlbXAsW3BEc3RNVkN1ck1CLCM0XQotICAgICAgIAotICAgICAgIFNUUkVRICAgICAgICAgICB0ZW1wLFtwRHN0TVZDdXJNQiwjOF0KLSAgICAgICBTVFJFUSAgICAgICAgICAgdGVtcCxbcERzdE1WQ3VyTUIsIzEyXQotICAgICAgIAotICAgICAgIAotICAgICAgIE1fTERSICAgICAgICAgICBwQml0T2Zmc2V0LHBwQml0T2Zmc2V0Ci0gICAgICAgOy8vRW5kaW5nIHRoZSBtYWNybwotICAgICAgIE1fQkRfRklOSSAgICAgICBwcEJpdFN0cmVhbSxwQml0T2Zmc2V0ICAgICAgICAgICAgICAgICA7Ly8gRmluaXNoaW5nIHRoZSBNYWNybyAgICAgICAKLQotICAgICAgIAotICAgICAgIE1PViAgICAgICAgICAgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIKLSAgICAgICBCICAgICAgICAgICAgICAgRXhpdE9LCi0gCi1FeGl0RXJyb3IKLQotICAgICAgIE1fTERSICAgICAgICAgICBwcEJpdFN0cmVhbSxwcHBCaXRTdHJlYW0KLSAgICAgICBNX0xEUiAgICAgICAgICAgcEJpdE9mZnNldCxwcEJpdE9mZnNldAotICAgICAgIDsvL0VuZGluZyB0aGUgbWFjcm8KLSAgICAgICBNX0JEX0ZJTkkgICAgICAgcHBCaXRTdHJlYW0scEJpdE9mZnNldAotICAgICAgIAotICAgICAgIE1PViAgICAgICAgICAgICBSZXR1cm4sI09NWF9TdHNfRXJyCi0KLUV4aXRPSyAgICAgICAgICAgICAKLQotICAgICAgIE1fRU5ECi0gICAgICAgRU5ESUYKLSAgICAgICBFTkQKLQotCi0gICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM2ZGZlNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcl9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvKioKLTsgKiAKLTsgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyX3MucwotOyAqIE9wZW5NQVggREw6IHYxLjAuMgotOyAqIFJldmlzaW9uOiAgIDEyMjkwCi07ICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07ICogCi07ICogCi07ICogCi07ICoKLTsgKiBEZXNjcmlwdGlvbjogCi07ICogQ29udGFpbnMgbW9kdWxlcyBmb3IgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZGVjb2RpbmcKLTsgKiBmb3IgaW50ZXIgYmxvY2suCi07ICoKLTsgKgotOyAqCi07ICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIKLTsgKgotOyAqIERlc2NyaXB0aW9uOgotOyAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3Igb25lIGludGVyIGNvZGVkIGJsb2NrLgotOyAqCi07ICogUmVtYXJrczoKLTsgKgotOyAqIFBhcmFtZXRlcnM6Ci07ICogW2luXSAgICBwcEJpdFN0cmVhbSAgICAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi07ICogICAgICAgICAgICAgICAgICAgIHRoZSBiaXRzdHJlYW0gYnVmZmVyCi07ICogW2luXSAgICBwQml0T2Zmc2V0ICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotOyAqICAgICAgICAgICAgICAgICAgICB0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiAgICBbMC03XS4KLTsgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgICAgIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOwotOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAotOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCi07ICogW291dF0gICAgcHBCaXRTdHJlYW0gICAgICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcwotOyAqICAgICAgICAgICAgICAgICAgICBkZWNvZGVkLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlCi07ICogICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlcgotOyAqIFtvdXRdICAgIHBCaXRPZmZzZXQgICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi07ICogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLTsgKiAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtCi07ICogW291dF0gICAgcERzdCAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50Ci07ICogICAgICAgICAgICAgICAgICAgIGJsb2NrLiBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZAotOyAqCi07ICogUmV0dXJuIFZhbHVlOgotOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cwotOyAqICAgLUF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QsIG9yCi07ICogICAtcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLCBvcgotOyAqICAgLSpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10uCi07ICogT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IKLTsgKiAgIC1BdCBsZWFzdCBvbmUgbWFyayBiaXQgaXMgZXF1YWwgdG8gemVybwotOyAqICAgLUVuY291bnRlcmVkIGFuIGlsbGVnYWwgc3RyZWFtIGNvZGUgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIFZMQyB0YWJsZQotOyAqICAgLUVuY291bnRlcmVkIGFuZCBpbGxlZ2FsIGNvZGUgaW4gdGhlIFZMQyBGTEMgdGFibGUKLTsgKiAgIC1UaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQKLTsgKgotOyAqLwotCi0KLSAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICBJTkNMVURFIGFybUNPTU1fQml0RGVjX3MuaAotCi0KLSAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLSAgICAgCi0KLQotCi0gICAgIElGIEFSTTExMzZKUwotICAgICAKLSAgICAgICAgOy8vIEltcG9ydCB2YXJpb3VzIHRhYmxlcyBuZWVkZWQgZm9yIHRoZSBmdW5jdGlvbgotCi0gICAgICAgIAotICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludGVyVmxjTDBMMSAgICAgICAgICAgICA7Ly8gQ29udGFpbnMgb3B0aW1pemVkIGFuZCBwYWNrZWQgVkxDIFRhYmxlcyBmb3IgYm90aCBMYXN0ID0xIGFuZCBsYXN0PTAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBQYWNrZWQgaW4gUnVuOkxldmVsOkxhc3QgZm9ybWF0Ci0gICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50ZXJMMEwxTE1BWCAgICAgICAgICAgIDsvLyBDb250YWlucyBMTUFYIHRhYmxlIGVudHJpZXMgd2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xCi0gICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50ZXJMMEwxUk1BWCAgICAgICAgICAgIDsvLyBDb250YWlucyBSTUFYIHRhYmxlIGVudHJpZXMgd2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xCi0gICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gICAgIDsvLyBjb250YWlucyBjbGFzc2ljYWwgWmlnemFnIHRhYmxlIGVudHJpZXMgd2l0aCBkb3VibGUgdGhlIG9yaWdpbmFsIHZhbHVlcwotICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmUKLQotCi0KLTsvL0lucHV0IEFyZ3VtZW50cwotCi1wcEJpdFN0cmVhbSAgICAgICAgICBSTiAwCi1wQml0T2Zmc2V0ICAgICAgICAgICBSTiAxCi1wRHN0ICAgICAgICAgICAgICAgICBSTiAyCi1zaG9ydFZpZGVvSGVhZGVyICAgICBSTiAzCi0KLTsvL0xvY2FsIFZhcmlhYmxlcwotCi1SZXR1cm4gICAgICAgICAgICAgICBSTiAwCi0KLXBWbGNUYWJsZUwwTDEgICAgICAgIFJOIDQKLXBMTUFYVGFibGVMMEwxICAgICAgIFJOIDQKLXBSTUFYVGFibGVMMEwxICAgICAgIFJOIDQKLXBaaWd6YWdUYWJsZSAgICAgICAgIFJOIDQKLUNvdW50ICAgICAgICAgICAgICAgIFJOIDYKLQotCi0gICAgICAgIAotICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHRvIHN0b3JlIHRoZSBWTEMsWmlnemFnLExNQVggYW5kIFJNQVggdGFibGVzCi0gICAgIAotICAgICAgICAKLSAgICAgICAgTV9BTExPQzQgICAgICAgIHBwVmxjVGFibGVMMEwxLDQKLSAgICAgICAgTV9BTExPQzQgICAgICAgIHBwTE1BWFRhYmxlTDBMMSw0Ci0gICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFJNQVhUYWJsZUwwTDEsNAotICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBaaWd6YWdUYWJsZSw0Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgTV9TVEFSVCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyLHIxMgotCi0gICAgICAgIAotCi0gICAgICAgIAotICAgICAgICBMRFIgICAgICAgICAgICAgcFppZ3phZ1RhYmxlLCA9YXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuICAgICAgIDsvLyBMb2FkIHppZ3phZyB0YWJsZQotICAgICAgICBNX1NUUiAgICAgICAgICAgcFppZ3phZ1RhYmxlLHBwWmlnemFnVGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgemlnemFnIHRhYmxlIG9uIHN0YWNrIHRvIHBhc3MgYXMgYXJndW1lbnQgdG8gdW5zYWZlIGZ1bmN0aW9uCi0gICAgICAgIExEUiAgICAgICAgICAgICBwVmxjVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludGVyVmxjTDBMMSAgICAgICAgICAgICAgOy8vIExvYWQgb3B0aW1pemVkIFZMQyB0YWJsZSB3aXRoIGJvdGggTD0wIGFuZCBMPTEgZW50cmllcwotICAgICAgICBNX1NUUiAgICAgICAgICAgcFZsY1RhYmxlTDBMMSxwcFZsY1RhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgb3B0aW1pemVkIFZMQyB0YWJsZSBhZGRyZXNzIG9uIHN0YWNrCi0gICAgICAgIExEUiAgICAgICAgICAgICBwTE1BWFRhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRlckwwTDFMTUFYICAgICAgICAgICAgOy8vIExvYWQgSW50ZXJsZWF2ZWQgTD0wIGFuZCBMPTEgTE1BWCBUYWJsZXMKLSAgICAgICAgTV9TVFIgICAgICAgICAgIHBMTUFYVGFibGVMMEwxLHBwTE1BWFRhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIExNQVggdGFibGUgYWRkcmVzcyBvbiBzdGFjawotICAgICAgICBMRFIgICAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50ZXJMMEwxUk1BWCAgICAgICAgICAgIDsvLyBMb2FkIEludGVybGVhdmVkIEw9MCBhbmQgTD0xIFJNQVggVGFibGVzCi0gICAgICAgIE1PViAgICAgICAgICAgICBDb3VudCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBzZXQgc3RhcnQ9MAotICAgICAgICBNX1NUUiAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEscHBSTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUgUk1BWCB0YWJsZSBhZGRyZXNzIG9uIHN0YWNrCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgQkwgICAgICAgICAgICAgIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlICAgICAgICAgICAgICAgICA7Ly8gY2FsbCBVbnNhZmUgRnVuY3Rpb24gZm9yIFZMQyBaaWd6YWcgRGVjb2RpbmcKLSAgICAgICAgIAotICAgICAgIAotCi0gICAgICAgIE1fRU5ECi0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTENfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQ19zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1Y2M1YjQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQ19zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvKioKLTsgKiAKLTsgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTENfcy5zCi07ICogT3Blbk1BWCBETDogdjEuMC4yCi07ICogUmV2aXNpb246ICAgMTIyOTAKLTsgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsgKiAKLTsgKiAKLTsgKiAKLTsgKgotOyAqIERlc2NyaXB0aW9uOiAKLTsgKiBDb250YWlucyBtb2R1bGVzIGZvciB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBkZWNvZGluZwotOyAqIGZvciBpbnRlciBibG9jay4KLTsgKgotOyAqCi07ICoKLTsgKiBGdW5jdGlvbjogb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcgotOyAqCi07ICogRGVzY3JpcHRpb246Ci07ICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciBvbmUgaW50cmEgY29kZWQgYmxvY2suCi07ICoKLTsgKiBSZW1hcmtzOgotOyAqCi07ICogUGFyYW1ldGVyczoKLTsgKiBbaW5dICAgIHBwQml0U3RyZWFtICAgICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KLTsgKiAgICAgICAgICAgICAgICAgICAgdGhlIGJpdHN0cmVhbSBidWZmZXIKLTsgKiBbaW5dICAgIHBCaXRPZmZzZXQgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi07ICogICAgICAgICAgICAgICAgICAgIHRvIGJ5ICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluICAgIFswLTddLgotOyAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciAgICAgYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7Ci07ICogICAgICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCi07ICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KLTsgKiBbb3V0XSAgICBwcEJpdFN0cmVhbSAgICAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzCi07ICogICAgICAgICAgICAgICAgICAgIGRlY29kZWQsIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUKLTsgKiAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyCi07ICogW291dF0gICAgcEJpdE9mZnNldCAgICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLTsgKiAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotOyAqICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0KLTsgKiBbb3V0XSAgICBwRHN0ICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKLTsgKiAgICAgICAgICAgICAgICAgICAgYmxvY2suIE11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkCi07ICoKLTsgKiBSZXR1cm4gVmFsdWU6Ci07ICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCi07ICogICAtQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdCwgb3IKLTsgKiAgIC1wRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQsIG9yCi07ICogICAtKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XS4KLTsgKiBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvcgotOyAqICAgLUF0IGxlYXN0IG9uZSBtYXJrIGJpdCBpcyBlcXVhbCB0byB6ZXJvCi07ICogICAtRW5jb3VudGVyZWQgYW4gaWxsZWdhbCBzdHJlYW0gY29kZSB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgVkxDIHRhYmxlCi07ICogICAtRW5jb3VudGVyZWQgYW5kIGlsbGVnYWwgY29kZSBpbiB0aGUgVkxDIEZMQyB0YWJsZQotOyAqICAgLVRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NAotOyAqCi07ICovCi0KLQotICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgIElOQ0xVREUgYXJtQ09NTV9CaXREZWNfcy5oCi0KLQotICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLQotICAgICAKLQotCi0KLSAgICAgSUYgQVJNMTEzNkpTCi0gICAgIAotICAgICAgICA7Ly8gSW1wb3J0IHZhcmlvdXMgdGFibGVzIG5lZWRlZCBmb3IgdGhlIGZ1bmN0aW9uCi0KLSAgICAgICAgCi0gICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50cmFWbGNMMEwxICAgICAgICAgICAgIDsvLyBDb250YWlucyBvcHRpbWl6ZWQgYW5kIHBhY2tlZCBWTEMgVGFibGVzIGZvciBib3RoIExhc3QgPTEgYW5kIGxhc3Q9MAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFBhY2tlZCBpbiBSdW46TGV2ZWw6TGFzdCBmb3JtYXQKLSAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9JbnRyYUwwTDFMTUFYICAgICAgICAgICAgOy8vIENvbnRhaW5zIExNQVggdGFibGUgZW50cmllcyB3aXRoIGJvdGggTGFzdD0wIGFuZCBMYXN0PTEKLSAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9JbnRyYUwwTDFSTUFYICAgICAgICAgICAgOy8vIENvbnRhaW5zIFJNQVggdGFibGUgZW50cmllcyB3aXRoIGJvdGggTGFzdD0wIGFuZCBMYXN0PTEKLSAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiAgICAgOy8vIGNvbnRhaW5zIGNsYXNzaWNhbCBaaWd6YWcgdGFibGUgZW50cmllcyB3aXRoIGRvdWJsZSB0aGUgb3JpZ2luYWwgdmFsdWVzCi0gICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZQotCi07Ly9JbnB1dCBBcmd1bWVudHMKLQotcHBCaXRTdHJlYW0gICAgICAgICAgUk4gMAotcEJpdE9mZnNldCAgICAgICAgICAgUk4gMQotcERzdCAgICAgICAgICAgICAgICAgUk4gMgotUHJlZERpciAgICAgICAgICAgICAgUk4gMwotc2hvcnRWaWRlb0hlYWRlciAgICAgUk4gMwotCi07Ly9Mb2NhbCBWYXJpYWJsZXMKLQotUmV0dXJuICAgICAgICAgICAgICAgUk4gMAotCi1wVmxjVGFibGVMMEwxICAgICAgICBSTiA0Ci1wTE1BWFRhYmxlTDBMMSAgICAgICBSTiA0Ci1wUk1BWFRhYmxlTDBMMSAgICAgICBSTiA0Ci1wWmlnemFnVGFibGUgICAgICAgICBSTiA0Ci1Db3VudCAgICAgICAgICAgICAgICBSTiA2Ci0KLQotICAgICAgICAKLSAgICAgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSB0byBzdG9yZSBvcHRpbWl6ZWQgVkxDLFppZ3phZywgUk1BWCwgTE1BWCBUYWJsZSBBZGRyZXNzZXMgCi0gICAgIAotICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBWbGNUYWJsZUwwTDEsNAotICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBMTUFYVGFibGVMMEwxLDQKLSAgICAgICAgTV9BTExPQzQgICAgICAgIHBwUk1BWFRhYmxlTDBMMSw0Ci0gICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFppZ3phZ1RhYmxlLDQKLQotICAgICAgICAKLSAgICAgICAgTV9TVEFSVCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMscjEyCi0KLSAgICAgICAgTV9BUkcgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXJvblN0YWNrLDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwb2ludGVyIHRvIElucHV0IEFyZ3VtZW50IG9uIHN0YWNrICAgICAgICAgICAKLQotICAgICAgICBMRFIgICAgICAgICAgICAgcFppZ3phZ1RhYmxlLCA9YXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuICAgICA7Ly8gTG9hZCBBZGRyZXNzIG9mIHRoZSBaaWd6YWcgdGFibGUgICAgCi0gICAgICAgIEFERCAgICAgICAgICAgICBwWmlnemFnVGFibGUsIHBaaWd6YWdUYWJsZSwgUHJlZERpciwgTFNMICM2ICAgICAgICAgICA7Ly8gTG9hZGluZyBEaWZmZXJlbnQgdHlwZSBvZiB6aWd6YWcgdGFibGVzIGJhc2VkIG9uIFByZWREaXIKLSAgICAgICAKLSAgICAgICAgTV9TVFIgICAgICAgICAgIHBaaWd6YWdUYWJsZSxwcFppZ3phZ1RhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBaaWd6YWcgdGFibGUgYWRkcmVzcyBvbiBzdGFjawotICAgICAgICBMRFIgICAgICAgICAgICAgcFZsY1RhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRyYVZsY0wwTDEgICAgICAgICAgICA7Ly8gTG9hZCBvcHRpbWl6ZWQgcGFja2VkIFZMQyBUYWJsZSB3aXRoIGJvdGggTD0wIGFuZCBMPTEgZW50cmllcwotICAgICAgICBNX1NUUiAgICAgICAgICAgcFZsY1RhYmxlTDBMMSxwcFZsY1RhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIFZMQyBUYWJsZSBhZGRyZXNzIG9uIHN0YWNrCi0gICAgICAgIExEUiAgICAgICAgICAgICBwTE1BWFRhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRyYUwwTDFMTUFYICAgICAgICAgIDsvLyBMb2FkIExNQVggVGFibGUKLSAgICAgICAgTV9TVFIgICAgICAgICAgIHBMTUFYVGFibGVMMEwxLHBwTE1BWFRhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBMTUFYIFRhYmxlIGFkZHJlc3Mgb24gU3RhY2sKLSAgICAgICAgTERSICAgICAgICAgICAgIHBSTUFYVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludHJhTDBMMVJNQVggICAgICAgICAgOy8vIExvYWQgUk1BWCBUYWJsZQotICAgICAgICBNT1YgICAgICAgICAgICAgQ291bnQsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldCBTdGFydD0wICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIE1fU1RSICAgICAgICAgICBwUk1BWFRhYmxlTDBMMSxwcFJNQVhUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgUk1BWCBUYWJsZSBhZGRyZXNzIG9uIHN0YWNrCi0gICAgICAgICAgICAgIAotCi0gICAgICAgCi0gICAgICAgIE1fTERSICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyLHNob3J0VmlkZW9IZWFkZXJvblN0YWNrICAgICAgICAgICAgICA7Ly8gZ2V0IHRoZSBJbnB1dCBBcmd1bWVudCBmcm9tIHN0YWNrCi0KLSAgICAgICAgQkwgICAgICAgICAgICAgIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlICAgICAgICAgICAgICAgOy8vIENhbGwgVW5zYWZlIEZ1bmN0aW9uCi0KLQotCi0gICAgICAgIAotICAgICAgICBNX0VORAotICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTENfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWZlZDgwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTENfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07LyoqCi07ICogCi07ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDX3MucwotOyAqIE9wZW5NQVggREw6IHYxLjAuMgotOyAqIFJldmlzaW9uOiAgIDEyMjkwCi07ICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07ICogCi07ICogCi07ICogCi07ICoKLTsgKiBEZXNjcmlwdGlvbjogCi07ICogQ29udGFpbnMgbW9kdWxlcyBmb3IgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZGVjb2RpbmcKLTsgKiBmb3IgaW50ZXIgYmxvY2suCi07ICoKLTsgKgotOyAqCi07ICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIKLTsgKgotOyAqIERlc2NyaXB0aW9uOgotOyAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3Igb25lIGludHJhIGNvZGVkIGJsb2NrLgotOyAqCi07ICogUmVtYXJrczoKLTsgKgotOyAqIFBhcmFtZXRlcnM6Ci07ICogW2luXSAgICBwcEJpdFN0cmVhbSAgICAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi07ICogICAgICAgICAgICAgICAgICAgIHRoZSBiaXRzdHJlYW0gYnVmZmVyCi07ICogW2luXSAgICBwQml0T2Zmc2V0ICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotOyAqICAgICAgICAgICAgICAgICAgICB0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiAgICBbMC03XS4KLTsgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgICAgIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOwotOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAotOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCi07ICogW291dF0gICAgcHBCaXRTdHJlYW0gICAgICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcwotOyAqICAgICAgICAgICAgICAgICAgICBkZWNvZGVkLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlCi07ICogICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlcgotOyAqIFtvdXRdICAgIHBCaXRPZmZzZXQgICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi07ICogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLTsgKiAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtCi07ICogW291dF0gICAgcERzdCAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50Ci07ICogICAgICAgICAgICAgICAgICAgIGJsb2NrLiBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZAotOyAqCi07ICogUmV0dXJuIFZhbHVlOgotOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cwotOyAqICAgLUF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QsIG9yCi07ICogICAtcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLCBvcgotOyAqICAgLSpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10uCi07ICogT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IKLTsgKiAgIC1BdCBsZWFzdCBvbmUgbWFyayBiaXQgaXMgZXF1YWwgdG8gemVybwotOyAqICAgLUVuY291bnRlcmVkIGFuIGlsbGVnYWwgc3RyZWFtIGNvZGUgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIFZMQyB0YWJsZQotOyAqICAgLUVuY291bnRlcmVkIGFuZCBpbGxlZ2FsIGNvZGUgaW4gdGhlIFZMQyBGTEMgdGFibGUKLTsgKiAgIC1UaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQKLTsgKgotOyAqLwotCi0KLSAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICBJTkNMVURFIGFybUNPTU1fQml0RGVjX3MuaAotCi0KLSAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKLQotICAgICAKLSAgICAgIAotCi0KLSAgICAgIElGIENvcnRleEE4Ci0KLSAgICAgCi0gICAgICAgIDsvLyBJbXBvcnQgdmFyaW91cyB0YWJsZXMgbmVlZGVkIGZvciB0aGUgZnVuY3Rpb24KLQotICAgICAgICAKLSAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9JbnRyYVZsY0wwTDEgICAgICAgICAgICAgOy8vIENvbnRhaW5zIG9wdGltaXplZCBhbmQgcGFja2VkIFZMQyBUYWJsZXMgZm9yIGJvdGggTGFzdCA9MSBhbmQgbGFzdD0wCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUGFja2VkIGluIFJ1bjpMZXZlbDpMYXN0IGZvcm1hdAotICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBMMUxNQVggICAgICAgICAgICA7Ly8gQ29udGFpbnMgTE1BWCB0YWJsZSBlbnRyaWVzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MQotICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBMMVJNQVggICAgICAgICAgICA7Ly8gQ29udGFpbnMgUk1BWCB0YWJsZSBlbnRyaWVzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MQotICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuICAgICA7Ly8gY29udGFpbnMgQ0xhc3NpY2FsLCBIb3Jpem9udGFsLCBWZXJ0aWNhbCBaaWd6YWcgdGFibGUgZW50cmllcyB3aXRoIGRvdWJsZSB0aGUgb3JpZ2luYWwgdmFsdWVzCi0gICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfYUludHJhRENMdW1hQ2hyb21hSW5kZXggIDsvLyBDb250YWlucyBPcHRpbWl6ZWQgRENMdW1hIGFuZCBEQ0Nocm9tYSBJbmRleCB0YWJsZSBFbnRyaWVzCi0gICAgICAgIAotCi0gICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZQotCi07Ly9JbnB1dCBBcmd1bWVudHMKLQotcHBCaXRTdHJlYW0gICAgICAgICAgUk4gMAotcEJpdE9mZnNldCAgICAgICAgICAgUk4gMQotcERzdCAgICAgICAgICAgICAgICAgUk4gMgotUHJlZERpciAgICAgICAgICAgICAgUk4gMwotc2hvcnRWaWRlb0hlYWRlciAgICAgUk4gMwotdmlkZW9Db21wICAgICAgICAgICAgUk4gNQotOy8vTG9jYWwgVmFyaWFibGVzCi0KLVJldHVybiAgICAgICAgICAgICAgIFJOIDAKLQotcERDTHVtYUNocm9tYUluZGV4ICAgUk4gNAotcERDQ2hyb21hSW5kZXggICAgICAgUk4gNwotcFZsY1RhYmxlTDBMMSAgICAgICAgUk4gNAotcExNQVhUYWJsZUwwTDEgICAgICAgUk4gNAotcFJNQVhUYWJsZUwwTDEgICAgICAgUk4gNAotcFppZ3phZ1RhYmxlICAgICAgICAgUk4gNAotQ291bnQgICAgICAgICAgICAgICAgUk4gNgotRENWYWx1ZVNpemUgICAgICAgICAgUk4gNgotcG93T2ZTaXplICAgICAgICAgICAgUk4gNwotdGVtcDEgICAgICAgICAgICAgICAgUk4gNQotCi0KLTsvLyBTY3JhdGNoIFJlZ2lzdGVycwotCi1SQml0U3RyZWFtICAgICAgICAgICBSTiA4Ci1SQml0QnVmZmVyICAgICAgICAgICBSTiA5Ci1SQml0Q291bnQgICAgICAgICAgICBSTiAxMAotCi1UMSAgICAgICAgICAgICAgICAgICBSTiAxMQotVDIgICAgICAgICAgICAgICAgICAgUk4gMTIKLURDVmFsICAgICAgICAgICAgICAgIFJOIDE0Ci0KLSAgICAgICAgCi0gICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgdG8gc3RvcmUgb3B0aW1pemVkIFZMQyxaaWd6YWcsIFJNQVgsIExNQVggVGFibGUgQWRkcmVzc2VzIAotICAgICAKLSAgICAgICAgTV9BTExPQzQgICAgICAgIHBwVmxjVGFibGVMMEwxLDQKLSAgICAgICAgTV9BTExPQzQgICAgICAgIHBwTE1BWFRhYmxlTDBMMSw0Ci0gICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFJNQVhUYWJsZUwwTDEsNAotICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBaaWd6YWdUYWJsZSw0Ci0gICAgICAgIE1fQUxMT0M0ICAgICAgICBwRENDb2VmZiw0Ci0gICAgICAgIAotCi0gICAgICAgIAotICAgICAgICBNX1NUQVJUIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyxyMTIKLQotICAgICAgICBNX0FSRyAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcm9uU3RhY2ssNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUG9pbnRlciB0byBhcmd1bWVudCBvbiBzdGFjayAgCi0gICAgICAgIE1fQVJHICAgICAgICAgICB2aWRlb0NvbXBvbnN0YWNrLDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBQb2ludGVyIHRvIGFyZ3VtZW50IG9uIHN0YWNrCi0KLSAgICAgICAgCi0gICAgICAgIDsvLyBEZWNvZGUgREMgQ29lZmZpY2llbnQKLQotICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgICAgIHBEQ0x1bWFDaHJvbWFJbmRleCwgPWFybVZDTTRQMl9hSW50cmFEQ0x1bWFDaHJvbWFJbmRleCA7Ly8gTG9hZCBPcHRpbWl6ZWQgVkxDIFRhYmxlIGZvciBMdW1pbmFuY2UgYW5kIENocm9taW5hbmNlCi0KLSAgICAgICAgOy8vIEluaXRpYWxpemluZyB0aGUgQml0c3RyZWFtIE1hY3JvCi0KLSAgICAgICAgTV9CRF9JTklUMCAgICAgIHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBSQml0U3RyZWFtLCBSQml0QnVmZmVyLCBSQml0Q291bnQKLSAgICAgICAgTV9MRFIgICAgICAgICAgIHZpZGVvQ29tcCx2aWRlb0NvbXBvbnN0YWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIE1fQkRfSU5JVDEgICAgICBUMSwgVDIsIFQyCi0gICAgICAgIEFERCAgICAgICAgICAgICBwRENMdW1hQ2hyb21hSW5kZXgscERDTHVtYUNocm9tYUluZGV4LHZpZGVvQ29tcCwgTFNMICM2ICAgICAgICAgICAgIAotICAgICAgICBNX0JEX0lOSVQyICAgICAgVDEsIFQyLCBUMgotICAgIAotICAgICAgICAKLSAgICAgICAgTV9CRF9WTEQgICAgICAgIERDVmFsdWVTaXplLFQxLFQyLHBEQ0x1bWFDaHJvbWFJbmRleCw0LDIgICAgICAgICAgICAgICAgICAgIDsvLyBWTEMgRGVjb2RlIHVzaW5nIG9wdGltaXplZCBMdW1pbmFuY2UgYW5kIENocm9taW5hbmNlIFZMQyBUYWJsZQotCi0gICAgCi0gICAgICAgCi0KLURlY29kZURDCi0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIENNUCAgICAgICAgICAgICBEQ1ZhbHVlU2l6ZSwjMTIgICAgIAotICAgICAgICBCR1QgICAgICAgICAgICAgRXhpdEVycm9yCi0gICAgICAgIAotICAgICAgICBDTVAgICAgICAgICAgICAgRENWYWx1ZVNpemUsIzAKLSAgICAgICAgTU9WRVEgICAgICAgICAgIERDVmFsLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBEQ1ZhbHVlU2l6ZSBpcyB6ZXJvIHRoZW4gREMgY29lZmYgPTAKLSAgICAgICAgQkVRICAgICAgICAgICAgIEFDRGVjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBCcmFuY2ggdG8gcGVyZm9ybSBBQyBDb2VmZiBEZWNvZGluZwotICAgICAgICAKLSAgICAgICAgTV9CRF9WUkVBRDE2ICAgIERDVmFsLERDVmFsdWVTaXplLFQxLFQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBHZXQgREMgVmFsdWUgRnJvbSBCaXQgc3RyZWFtCi0gICAgICAgICAKLQotICAgICAgICBNT1YgICAgICAgICAgICAgcG93T2ZTaXplLCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIExTTCAgICAgICAgICAgICBwb3dPZlNpemUsRENWYWx1ZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcG93T2ZTaXplPXBvdygyLERDVmFsdWVTaXplKQotICAgICAgICBDTVAgICAgICAgICAgICAgRENWYWwscG93T2ZTaXplLExTUiAjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENvbXBhcmUgRENWYWwgd2l0aCBwb3dPZlNpemUvMiAKLSAgICAgICAgQURETFQgICAgICAgICAgIERDVmFsLERDVmFsLCMxCi0gICAgICAgIFNVQkxUICAgICAgICAgICBEQ1ZhbCxEQ1ZhbCxwb3dPZlNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgTGVzc3RoYW4gcG93T2ZTaXplLzIgRENWYWw9RENWYWwtcG93T2ZTaXplKzEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFbHNlIERDVmFsPSBmZXRjaGJpdHMgZnJvbSBiaXQgc3RyZWFtCi0KLUNoZWNrRENWYWx1ZVNpemUKLSAgICAgICAgCi0gICAgICAgIENNUCAgICAgICAgICAgICBEQ1ZhbHVlU2l6ZSwjOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgRENWYWx1ZVNpemUgZ3JlYXRlciB0aGFuIDggY2hlY2sgbWFya2VyIGJpdAotCi0gICAgICAgIEJMRSAgICAgICAgICAgICBBQ0RlY29kZQotCi0gICAgICAgIE1fQkRfUkVBRDggICAgICB0ZW1wMSwxLFQxCi0gICAgICAgIFRFUSAgICAgICAgICAgICB0ZW1wMSwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgTWFya2VyIGJpdCBpcyB6ZXJvIEV4aXQgd2l0aCBhbiBFcnJvciBNZXNzYWdlCi0gICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0RXJyb3IKLQotICAgICAgICAKLQotICAgICAgICA7Ly8gRGVjb2RlIEFDIENvZWZmaWNpZW50Ci0KLUFDRGVjb2RlCi0KLSAgICAgICAgTV9TVFIgICAgICAgICAgIERDVmFsLHBEQ0NvZWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIERlY29kZWQgREMgQ29lZmYgb24gU3RhY2sKLSAgICAgICAgTV9CRF9GSU5JICAgICAgIHBwQml0U3RyZWFtLHBCaXRPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRlcm1pbmF0aW5nIHRoZSBCaXQgc3RyZWFtIE1hY3JvCi0gICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgICAgIHBaaWd6YWdUYWJsZSwgPWFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiAgICAgICAgICA7Ly8gTG9hZCBaaWd6YWcgdGFsYmUgYWRkcmVzcyAgIAotICAgICAgICBBREQgICAgICAgICAgICAgcFppZ3phZ1RhYmxlLCBwWmlnemFnVGFibGUsIFByZWREaXIsIExTTCAjNiAgICAgICAgICAgICAgICA7Ly8gTW9kaWZ5IHRoZSBaaWd6YWcgdGFibGUgYWRyZXNzIGJhc2VkIG9uIFByZWREaXIgICAgICAgICAgICAgICAgCi0gICAgICAgCi0gICAgICAgIE1fU1RSICAgICAgICAgICBwWmlnemFnVGFibGUscHBaaWd6YWdUYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSB6aWd6YWcgdGFibGUgb24gc3RhY2sKLSAgICAgICAgTERSICAgICAgICAgICAgIHBWbGNUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50cmFWbGNMMEwxICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBPcHRpbWl6ZWQgVkxDIFRhYmxlIFdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MSBFbnRyaWVzCi0gICAgICAgIE1fU1RSICAgICAgICAgICBwVmxjVGFibGVMMEwxLHBwVmxjVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBPcHRpbWl6ZWQgVkxDIFRhYmxlIG9uIHN0YWNrCi0gICAgICAgIExEUiAgICAgICAgICAgICBwTE1BWFRhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRyYUwwTDFMTUFYICAgICAgICAgICAgICAgOy8vIExvYWQgTE1BWCBUYWJsZQotICAgICAgICBNX1NUUiAgICAgICAgICAgcExNQVhUYWJsZUwwTDEscHBMTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgTE1BWCB0YWJsZSBvbiBzdGFjawotICAgICAgICBMRFIgICAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50cmFMMEwxUk1BWCAgICAgICAgICAgICAgIDsvLyBMb2FkIFJNQVggVGFibGUKLSAgICAgICAgTU9WICAgICAgICAgICAgIENvdW50LCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldCBTdGFydCA9MSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBNX1NUUiAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEscHBSTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgUk1BWCBUYWJsZSBvbiBTdGFjawotICAgICAgICAKLSAgICAgICAKLSAgICAgICAgTV9MRFIgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIsc2hvcnRWaWRlb0hlYWRlcm9uU3RhY2sgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgdGhlIElucHV0IEFyZ3VtZW50IEZyb20gU3RhY2sKLSAgICAgICAgCi0gICAgICAgIEJMICAgICAgICAgICAgICBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZSAgICAgICAgICAgICAgICAgICAgOy8vIENhbGwgdGhlIFVuc2FmZSBGdW5jdGlvbgotCi0gICAgICAgIE1fTERSICAgICAgICAgICBEQ1ZhbCxwRENDb2VmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBHZXQgdGhlIERlY29kZWQgREMgVmFsdWUgRnJvbSBTdGFjawotICAgICAgICBTVFJIICAgICAgICAgICAgRENWYWwsW3BEc3RdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgdGhlIERDIFZhbHVlIAotICAgICAgICBCICAgICAgICAgICAgICAgRXhpdE9LCi0gICAgICAgIAotICAgICAgICAgICAgICAKLQotRXhpdEVycm9yCi0gCi0gICAgICAgIE1fQkRfRklOSSAgICAgICBwcEJpdFN0cmVhbSxwQml0T2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBUZXJtaW5hdGluZyB0aGUgQml0IFN0cmVhbSBNYWNybyBpbiBjYXNlIG9mIGFuIEVycm9yCi0gICAgICAgIE1PViAgICAgICAgICAgICBSZXR1cm4sI09NWF9TdHNfRXJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFeGl0IHdpdGggYW4gRXJyb3IgTWVzc2FnZSAKLUV4aXRPSwotICAgICAgCi0gICAgICAgIE1fRU5ECi0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRmluZE1WcHJlZF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0ZpbmRNVnByZWRfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzQ0MTIwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRmluZE1WcHJlZF9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMl9GaW5kTVZwcmVkX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDEyMjkwCi07Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotOy8vIEZ1bmN0aW9uOgotOy8vICAgICBvbXhWQ000UDJfRmluZE1WcHJlZAotOy8vCi0gICAgICAgIDsvLyBJbmNsdWRlIGhlYWRlcnMKLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICBJTkNMVURFIGFybVZDQ09NTV9zLmgKLQotICAgICAgICA7Ly8gRGVmaW5lIGNwdSB2YXJpYW50cwotICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgSUYgQ29ydGV4QTgKLSAgICAgICAgCi0gICAgICAgIE1fVEFCTEUgYXJtVkNNNFAyX3BCbGtJbmRleFRhYmxlCi0gICAgICAgIERDRCAgT01YVkNCbGswLCBPTVhWQ0JsazEKLSAgICAgICAgRENEICBPTVhWQ0JsazIsIE9NWFZDQmxrMwotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAKLXBTcmNNVkN1ck1CICAgICAgICAgICAgUk4gMAotcFNyY0NhbmRNVjEgICAgICAgICAgICBSTiAxCi1wU3JjQ2FuZE1WMiAgICAgICAgICAgIFJOIDIKLXBTcmNDYW5kTVYzICAgICAgICAgICAgUk4gMwotcERzdE1WUHJlZCAgICAgICAgICAgICBSTiA0Ci1wRHN0TVZQcmVkTUUgICAgICAgICAgIFJOIDUKLWlCbGsgICAgICAgICAgICAgICAgICAgUk4gNgotCi1wVGFibGUgICAgICAgICAgICAgICAgIFJOIDQKLUNhbmRNViAgICAgICAgICAgICAgICAgUk4gMTIKLQotcENhbmRNVjEgICAgICAgICAgICAgICBSTiA3Ci1wQ2FuZE1WMiAgICAgICAgICAgICAgIFJOIDgKLXBDYW5kTVYzICAgICAgICAgICAgICAgUk4gOQotCi1DYW5kTVYxZHggICAgICAgICAgICAgIFJOIDAgCi1DYW5kTVYxZHkgICAgICAgICAgICAgIFJOIDEgCi1DYW5kTVYyZHggICAgICAgICAgICAgIFJOIDIKLUNhbmRNVjJkeSAgICAgICAgICAgICAgUk4gMwotQ2FuZE1WM2R4ICAgICAgICAgICAgICBSTiAxMAotQ2FuZE1WM2R5ICAgICAgICAgICAgICBSTiAxMQotCi10ZW1wICAgICAgICAgICAgICAgICAgIFJOIDE0Ci0KLXplcm8gICAgICAgICAgICAgICAgICAgUk4gMTQKLXJldHVybiAgICAgICAgICAgICAgICAgUk4gMAotICAgICAgICAKLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBNYWluIHJvdXRpbmUKLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgCi0KLSAgICAgICAgTV9BTExPQzQgTVYsIDQKLSAgICAgICAgCi0gICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIgCi0gICAgICAgIE1fU1RBUlQgb214VkNNNFAyX0ZpbmRNVnByZWQsIHIxMQotICAgICAgICAKLSAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKLSAgICAgICAgTV9BUkcgICBwcERzdE1WUHJlZCwgIDQKLSAgICAgICAgTV9BUkcgICBwcERzdE1WUHJlZE1FLCA0Ci0gICAgICAgIE1fQVJHICAgQmxrLCA0Ci0gICAgICAgIAotICAgICAgICBNX0FEUiBDYW5kTVYsIE1WCi0gICAgICAgIE1PViAgIHplcm8sICMwCi0gICAgICAgIE1fTERSIGlCbGssIEJsawotICAgICAgICAKLSAgICAgICAgOy8vIFNldCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlc2UKLSAgICAgICAgOy8vIHRvIGJlIHVzZWQgaWYgcFNyY0NhbmRNVlsxfDJ8M10gPT0gTlVMTAotICAgICAgICBNT1YgICBwQ2FuZE1WMSwgQ2FuZE1WCi0gICAgICAgIE1PViAgIHBDYW5kTVYyLCBDYW5kTVYKLSAgICAgICAgTU9WICAgcENhbmRNVjMsIENhbmRNVgotICAgIAotICAgICAgICBTVFIgICB6ZXJvLCBbQ2FuZE1WXQotCi0gICAgICAgIDsvLyBCcmFuY2ggdG8gdGhlIGNhc2UgYmFzZWQgb24gYmxrIG51bWJlcgotICAgICAgICBNX1NXSVRDSCBpQmxrCi0gICAgICAgIE1fQ0FTRSAgIE9NWFZDQmxrMCAgICAgIDsvLyBpQmxrPTAKLSAgICAgICAgTV9DQVNFICAgT01YVkNCbGsxICAgICAgOy8vIGlCbGs9MAotICAgICAgICBNX0NBU0UgICBPTVhWQ0JsazIgICAgICA7Ly8gaUJsaz0wCi0gICAgICAgIE1fQ0FTRSAgIE9NWFZDQmxrMyAgICAgIDsvLyBpQmxrPTAKLSAgICAgICAgTV9FTkRTV0lUQ0gKLSAgICAgICAgCi1PTVhWQ0JsazAKLSAgICAgICAgQ01QICAgcFNyY0NhbmRNVjEsICMwCi0gICAgICAgIEFERE5FIHBDYW5kTVYxLCBwU3JjQ2FuZE1WMSwgIzQKLSAgICAgICAgCi0gICAgICAgIENNUCAgIHBTcmNDYW5kTVYyLCAjMAotICAgICAgICBBRERORSBwQ2FuZE1WMiwgcFNyY0NhbmRNVjIsICM4Ci0KLSAgICAgICAgQ01QICAgcFNyY0NhbmRNVjMsICMwCi0gICAgICAgIEFERE5FIHBDYW5kTVYzLCBwU3JjQ2FuZE1WMywgIzgKLSAgICAgICAgQ01QRVEgcFNyY0NhbmRNVjEsICMwCi0gICAgCi0gICAgICAgIE1PVkVRIHBDYW5kTVYzLCBwQ2FuZE1WMgotICAgICAgICBNT1ZFUSBwQ2FuZE1WMSwgcENhbmRNVjIKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgQ01QICAgcFNyY0NhbmRNVjEsICMwCi0gICAgICAgIENNUEVRIHBTcmNDYW5kTVYyLCAjMAotICAgIAotICAgICAgICBNT1ZFUSBwQ2FuZE1WMSwgcENhbmRNVjMKLSAgICAgICAgTU9WRVEgcENhbmRNVjIsIHBDYW5kTVYzCi0gICAgICAgIAotICAgICAgICBDTVAgICBwU3JjQ2FuZE1WMiwgIzAKLSAgICAgICAgQ01QRVEgcFNyY0NhbmRNVjMsICMwCi0gICAgCi0gICAgICAgIE1PVkVRIHBDYW5kTVYyLCBwQ2FuZE1WMQotICAgICAgICBNT1ZFUSBwQ2FuZE1WMywgcENhbmRNVjEKLSAgICAgICAgCi0gICAgICAgIEIgICAgIEJsa0VuZAotICAgIAotT01YVkNCbGsxCi0gICAgICAgIE1PViAgIHBDYW5kTVYxLCBwU3JjTVZDdXJNQgotICAgICAgICBDTVAgICBwU3JjQ2FuZE1WMywgIzAKLSAgICAgICAgQURETkUgcENhbmRNVjMsIHBTcmNDYW5kTVYzLCAjOAotICAgICAgICAKLSAgICAgICAgQ01QICAgcFNyY0NhbmRNVjIsICMwCi0gICAgICAgIEFERE5FIHBDYW5kTVYyLCBwU3JjQ2FuZE1WMiwgIzEyCi0gICAgCi0gICAgICAgIENNUEVRIHBTcmNDYW5kTVYzLCAjMAotICAgIAotICAgICAgICBNT1ZFUSBwQ2FuZE1WMiwgcENhbmRNVjEKLSAgICAgICAgTU9WRVEgcENhbmRNVjMsIHBDYW5kTVYxCi0gICAgICAgICAgICAKLSAgICAgICAgQiAgICAgQmxrRW5kCi0KLU9NWFZDQmxrMgotICAgICAgICBDTVAgICBwU3JjQ2FuZE1WMSwgIzAKLSAgICAgICAgTU9WICAgcENhbmRNVjIsIHBTcmNNVkN1ck1CCi0gICAgICAgIEFERCAgIHBDYW5kTVYzLCBwU3JjTVZDdXJNQiwgIzQKLSAgICAgICAgQURETkUgcENhbmRNVjEsIHBTcmNDYW5kTVYxLCAjMTIKLSAgICAgICAgQiAgICAgQmxrRW5kCi0KLU9NWFZDQmxrMwotICAgICAgICBBREQgICBwQ2FuZE1WMSwgcFNyY01WQ3VyTUIsICM4Ci0gICAgICAgIE1PViAgIHBDYW5kTVYyLCBwU3JjTVZDdXJNQgotICAgICAgICBBREQgICBwQ2FuZE1WMywgcFNyY01WQ3VyTUIsICM0Ci0gICAgCi1CbGtFbmQKLQotICAgICAgICA7Ly8gVXNpbmcgdGhlIHRyYW5zcGVyYW5jeSBpbmZvLCB6ZXJvCi0gICAgICAgIDsvLyBvdXQgdGhlIGNhbmRpZGF0ZSBNViBpZiBuZWNjZXNhcnkKLSAgICAgICAgTERSU0ggQ2FuZE1WMWR4LCBbcENhbmRNVjFdLCAjMgotICAgICAgICBMRFJTSCBDYW5kTVYyZHgsIFtwQ2FuZE1WMl0sICMyCi0gICAgICAgIExEUlNIIENhbmRNVjNkeCwgW3BDYW5kTVYzXSwgIzIKLSAgICAKLSAgICAgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKLSAgICAgICAgTV9MRFIgcERzdE1WUHJlZE1FLCBwcERzdE1WUHJlZE1FCi0KLSAgICAgICAgTERSU0ggQ2FuZE1WMWR5LCBbcENhbmRNVjFdCi0gICAgICAgIExEUlNIIENhbmRNVjJkeSwgW3BDYW5kTVYyXQotICAgICAgICBMRFJTSCBDYW5kTVYzZHksIFtwQ2FuZE1WM10KLQotICAgICAgICBDTVAgcERzdE1WUHJlZE1FLCAjMCAgICAgICAgCi0KLSAgICAgICAgOy8vIFN0b3JlIHRoZSBjYW5kaWRhdGUgTVYncyBpbnRvIHRoZSBwRHN0TVZQcmVkTUUsIAotICAgICAgICA7Ly8gdGhlc2UgY2FuIGJlIHVzZWQgaW4gdGhlIGZhc3QgYWxnb3JpdGhtIGlmIGltcGxlbWVudGVkIAotCi0gICAgICAgIFNUUkhORSBDYW5kTVYxZHgsIFtwRHN0TVZQcmVkTUVdLCAjMgotICAgICAgICBTVFJITkUgQ2FuZE1WMWR5LCBbcERzdE1WUHJlZE1FXSwgIzIgICAgICAgIAotICAgICAgICBTVFJITkUgQ2FuZE1WMmR4LCBbcERzdE1WUHJlZE1FXSwgIzIKLSAgICAgICAgU1RSSE5FIENhbmRNVjJkeSwgW3BEc3RNVlByZWRNRV0sICMyCi0gICAgICAgIFNUUkhORSBDYW5kTVYzZHgsIFtwRHN0TVZQcmVkTUVdLCAjMgotICAgICAgICBTVFJITkUgQ2FuZE1WM2R5LCBbcERzdE1WUHJlZE1FXQotICAgICAgICAgICAKLSAgICAgICAgOyBGaW5kIHRoZSBtZWRpYW4gb2YgdGhlIDMgY2FuZGlkYXRlIE1WJ3MKLSAgICAgICAgTV9NRURJQU4zIENhbmRNVjFkeCwgQ2FuZE1WMmR4LCBDYW5kTVYzZHgsIHRlbXAKLQotICAgICAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjawotICAgICAgICBNX0xEUiBwRHN0TVZQcmVkLCBwcERzdE1WUHJlZAotCi0gICAgICAgIE1fTUVESUFOMyBDYW5kTVYxZHksIENhbmRNVjJkeSwgQ2FuZE1WM2R5LCB0ZW1wCi0gICAgCi0gICAgICAgIFNUUkggQ2FuZE1WM2R4LCBbcERzdE1WUHJlZF0sICMyCi0gICAgICAgIFNUUkggQ2FuZE1WM2R5LCBbcERzdE1WUHJlZF0KLQotICAgICAgICBNT1YgcmV0dXJuLCAjT01YX1N0c19Ob0VycgotICAgIAotICAgICAgICBNX0VORAotICAgIEVORElGIDsvLyBBUk0xMTM2SlMgOkxPUjogQ29ydGV4QTgKLSAgICAKLSAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfSURDVDh4OGJsa19zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0lEQ1Q4eDhibGtfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWI5MjVlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfSURDVDh4OGJsa19zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAyX0lEQ1Q4eDhibGtfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi07Ly8gRnVuY3Rpb246Ci07Ly8gICAgIG9teFZDTTRQMl9JRENUOHg4YmxrCi07Ly8KLSAgICAgICAgOy8vIEluY2x1ZGUgaGVhZGVycwotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0KLSAgICAgICAgOy8vIERlZmluZSBjcHUgdmFyaWFudHMKLSAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAotCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9JRENUX3MuaCAgICAgICAgCi0gICAgICAgIAotICAgICAgICBJTVBPUlQgYXJtQ09NTV9JRENUUHJlU2NhbGUKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBGdW5jdGlvbiBwcm90b3R5cGUKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAgICAgT01YUmVzdWx0Ci0gICAgICAgIDsvLyAgICAgb214VkNNNFAyX0lEQ1Q4eDhibGsoY29uc3QgT01YX1MxNiogcFNyYywKLSAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1MxNiogcERzdCkKLSAgICAgICAgOy8vICAgIAotICAgICAgICAKLSAgICBJRiBDb3J0ZXhBOAotICAgICAgICBNX0FMTE9DNCAgcHBEZXN0LCA0Ci0gICAgICAgIE1fQUxMT0M0ICBwU3RyaWRlLCA0Ci0gICAgICAgIE1fQUxMT0M4ICBwQmxrLCAyKjgqOAotICAgIEVORElGCi0gICAgCi0gICAgCi0gICAgSUYgQ29ydGV4QTgKLSAgICAgICAgTV9TVEFSVCBvbXhWQ000UDJfSURDVDh4OGJsaywgcjExLCBkMTUKLSAgICBFTkRJRgotICAgICAgICAKLSAgICBJRiBDb3J0ZXhBOAotICAgICAgICAKLTsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycwotcFNyYyAgICAgICAgICAgIFJOIDAKLXBEc3QgICAgICAgICAgICBSTiAxCi0KLTsvLyBEZWNsYXJlIG90aGVyIGludGVybWVkaWF0ZSByZWdpc3RlcnMKLVJlc3VsdCAgICAgICAgICBSTiAwCi0KLTsvLyBQcm90b3R5cGUgZm9yIG1hY3JvIE1fSURDVAotOy8vIHBTcmMgICAgICAgICAgICBSTiAwICA7Ly8gc291cmNlIGRhdGEgYnVmZmVyCi07Ly8gU3RyaWRlICAgICAgICAgIFJOIDEgIDsvLyBkZXN0aW5hdGlvbiBzdHJpZGUgaW4gYnl0ZXMKLTsvLyBwRGVzdCAgICAgICAgICAgUk4gMiAgOy8vIGRlc3RpbmF0aW9uIGRhdGEgYnVmZmVyCi07Ly8gcFNjYWxlICAgICAgICAgIFJOIDMgIDsvLyBwb2ludGVyIHRvIHNjYWxpbmcgdGFibGUKLQotcFNyYyAgICBSTiAwICAgIAotU3RyaWRlICBSTiAxICAgIAotcERlc3QgICBSTiAyICAgIAotcFNjYWxlICBSTiAzICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICBNT1YgICAgICAgICBwRGVzdCwgcERzdAotICAgICAgICBMRFIgICAgICAgICBwU2NhbGUsID1hcm1DT01NX0lEQ1RQcmVTY2FsZSAgICAgICAgCi0gICAgICAgIE1fSURDVCAgICAgIHM5LCBzMTYsIDE2ICAgICAgCi0gICAgICAgIE1PViAgICAgICAgIFJlc3VsdCwgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgTV9FTkQgICAgICAgCi0gICAgRU5ESUYgIAotICAgICAgICA7Ly8gQVJNMTEzNkpTIDpMT1I6IENvcnRleEE4Ci0KLSAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUNSZWNvbkJsb2NrX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUNSZWNvbkJsb2NrX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MxYWVjMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX01DUmVjb25CbG9ja19zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0NTggKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMl9NQ1JlY29uQmxvY2tfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotOy8vIERlc2NyaXB0aW9uOgotOy8vCi07Ly8KLQotOy8vIEluY2x1ZGUgc3RhbmRhcmQgaGVhZGVycwotICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgSU5DTFVERSBhcm1DT01NX3MuaAotCi07Ly8gSW1wb3J0IHN5bWJvbHMgcmVxdWlyZWQgZnJvbSBvdGhlciBmaWxlcwotCi0gICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAotCi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07Ly8gQVJNMTEzNkpTIGltcGxlbWVudGF0aW9uCi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLTsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsvLyBDb3J0ZXhBOCBpbXBsZW1lbnRhdGlvbgotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIElGICBDb3J0ZXhBOAotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOy8vIE1BQ1JPIERFRklOSVRJT05TCi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgOy8vIERlc2NyaXB0aW9uOgotICAgIDsvLyBEb2VzIGludGVycG9sYXRpb24gZm9yIHRoZSBjYXNlIG9mICJJbnRlZ2VyUGl4ZWwiIHByZWRpY3RUeXBlLiBCb3RoIAotICAgIDsvLyByb3VuZGluZyBjYXNlcyBhcmUgaGFuZGxlZC4gSnVzdCBjb3BpZXMgYSBibG9jayBmcm9tIHBTcmMgdG8gcERzdAotICAgIDsvLwotICAgIDsvLyBTeW50YXg6Ci0gICAgOy8vIE1fTUNSRUNPTkJMT0NLX0ludGVnZXJQaXhlbAotICAgIDsvLyAKLSAgICA7Ly8gSW5wdXRzOiBOb25lCi0gICAgOy8vIE91dHB1dHM6IE5vbmUKLQotICAgIE1BQ1JPIAotICAgIE1fTUNSRUNPTkJMT0NLX0ludGVnZXJQaXhlbAotQ2FzZUludGVnZXJQaXhlbF9SbmQwCi1DYXNlSW50ZWdlclBpeGVsX1JuZDEKLQotICAgIFZMRDEgICAgICAgIGRSb3cwLCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWTEQxICAgICAgICBkUm93MSwgW3BTcmNdLCBzcmNTdGVwCi0gICAgVkxEMSAgICAgICAgZFJvdzIsIFtwU3JjXSwgc3JjU3RlcAotICAgIFZMRDEgICAgICAgIGRSb3czLCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWTEQxICAgICAgICBkUm93NCwgW3BTcmNdLCBzcmNTdGVwCi0gICAgVkxEMSAgICAgICAgZFJvdzUsIFtwU3JjXSwgc3JjU3RlcAotICAgIFZMRDEgICAgICAgIGRSb3c2LCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWTEQxICAgICAgICBkUm93NywgW3BTcmNdLCBzcmNTdGVwCi0KLSAgICBWU1QxICAgICAgICBkUm93MCwgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgVlNUMSAgICAgICAgZFJvdzEsIFtwRHN0QDY0XSwgZHN0U3RlcAotICAgIFZTVDEgICAgICAgIGRSb3cyLCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICBWU1QxICAgICAgICBkUm93MywgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgVlNUMSAgICAgICAgZFJvdzQsIFtwRHN0QDY0XSwgZHN0U3RlcAotICAgIFZTVDEgICAgICAgIGRSb3c1LCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICBWU1QxICAgICAgICBkUm93NiwgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgVlNUMSAgICAgICAgZFJvdzcsIFtwRHN0QDY0XSwgZHN0U3RlcAotCi0gICAgQiAgICAgICAgICAgU3dpdGNoUHJlZGljdFR5cGVFbmQKLSAgICBNRU5ECi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgOy8vIERlc2NyaXB0aW9uOgotICAgIDsvLyBEb2VzIGludGVycG9sYXRpb24gZm9yIHRoZSBjYXNlIG9mICJIYWxmUGl4ZWxYIiBwcmVkaWN0VHlwZS4gVGhlIHR3byAKLSAgICA7Ly8gcm91bmRpbmcgY2FzZXMgYXJlIGhhbmRsZWQgYnkgdGhlIHBhcmFtZXRlciAiJHJuZFZhbCIuIEF2ZXJhZ2VzIGJldHdlZW4KLSAgICA7Ly8gYSBwaXhlbCBhbmQgcGl4ZWwgcmlnaHQgdG8gaXQsIHJvdW5kaW5nIGl0IGJhc2VkIG9uICRybmRWYWwuIFRoZSAKLSAgICA7Ly8gcm91bmRpbmcgaXMgaW1wbGVtZW50ZWQgYnkgdXNpbmcgb3BDb2RlIHN3aXRjaGluZyBiZXR3ZWVuICJWUkhBREQiIGFuZCAKLSAgICA7Ly8gIlZIQUREIiBpbnN0cnVjdGlvbnMuCi0gICAgOy8vCi0gICAgOy8vIFN5bnRheDoKLSAgICA7Ly8gTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWCAkcm5kVmFsCi0gICAgOy8vIAotICAgIDsvLyBJbnB1dHM6IAotICAgIDsvLyAgICAgJHJuZFZhbDogMCBmb3Igcm91bmRpbmcgYW5kIDEgZm9yIG5vIHJvdW5kaW5nCi0gICAgOy8vIE91dHB1dHM6IE5vbmUKLQotICAgIE1BQ1JPIAotICAgIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFggJHJuZFZhbAotCi0gICAgTENMUyBNX1ZIQUREUgotICAgIElGICRybmRWYWwgPSAwCi1NX1ZIQUREUiBTRVRTICJWUkhBREQiCi0gICAgRUxTRQotTV9WSEFERFIgU0VUUyAiVkhBREQiCi0gICAgRU5ESUYKLQotQ2FzZUhhbGZQaXhlbFhfUm5kJHJuZFZhbAotCi0gICAgVkxEMSAgICAgICAge2RSb3cwLCBkUm93MFNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWRVhUICAgICAgICBkUm93MFNoZnQsIGRSb3cwLCBkUm93MFNoZnQsICMxCi0gICAgVkxEMSAgICAgICAge2RSb3cxLCBkUm93MVNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWRVhUICAgICAgICBkUm93MVNoZnQsIGRSb3cxLCBkUm93MVNoZnQsICMxCi0gICAgVkxEMSAgICAgICAge2RSb3cyLCBkUm93MlNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWRVhUICAgICAgICBkUm93MlNoZnQsIGRSb3cyLCBkUm93MlNoZnQsICMxCi0gICAgVkxEMSAgICAgICAge2RSb3czLCBkUm93M1NoZnR9LCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWRVhUICAgICAgICBkUm93M1NoZnQsIGRSb3czLCBkUm93M1NoZnQsICMxCi0gICAgVkxEMSAgICAgICAge2RSb3c0LCBkUm93NFNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWRVhUICAgICAgICBkUm93NFNoZnQsIGRSb3c0LCBkUm93NFNoZnQsICMxCi0gICAgVkxEMSAgICAgICAge2RSb3c1LCBkUm93NVNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWRVhUICAgICAgICBkUm93NVNoZnQsIGRSb3c1LCBkUm93NVNoZnQsICMxCi0gICAgVkxEMSAgICAgICAge2RSb3c2LCBkUm93NlNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWRVhUICAgICAgICBkUm93NlNoZnQsIGRSb3c2LCBkUm93NlNoZnQsICMxCi0gICAgVkxEMSAgICAgICAge2RSb3c3LCBkUm93N1NoZnR9LCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWRVhUICAgICAgICBkUm93N1NoZnQsIGRSb3c3LCBkUm93N1NoZnQsICMxCi0gICAgJE1fVkhBRERSICAgZFJvdzAsIGRSb3cwLCBkUm93MFNoZnQKLSAgICAkTV9WSEFERFIgICBkUm93MSwgZFJvdzEsIGRSb3cxU2hmdAotICAgIFZTVDEgICAgICAgIGRSb3cwLCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICAkTV9WSEFERFIgICBkUm93MiwgZFJvdzIsIGRSb3cyU2hmdAotICAgIFZTVDEgICAgICAgIGRSb3cxLCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICAkTV9WSEFERFIgICBkUm93MywgZFJvdzMsIGRSb3czU2hmdAotICAgIFZTVDEgICAgICAgIGRSb3cyLCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICAkTV9WSEFERFIgICBkUm93NCwgZFJvdzQsIGRSb3c0U2hmdAotICAgIFZTVDEgICAgICAgIGRSb3czLCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICAkTV9WSEFERFIgICBkUm93NSwgZFJvdzUsIGRSb3c1U2hmdAotICAgIFZTVDEgICAgICAgIGRSb3c0LCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICAkTV9WSEFERFIgICBkUm93NiwgZFJvdzYsIGRSb3c2U2hmdAotICAgIFZTVDEgICAgICAgIGRSb3c1LCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICAkTV9WSEFERFIgICBkUm93NywgZFJvdzcsIGRSb3c3U2hmdAotICAgIFZTVDEgICAgICAgIGRSb3c2LCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICBWU1QxICAgICAgICBkUm93NywgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgCi0gICAgQiAgICAgICAgICAgU3dpdGNoUHJlZGljdFR5cGVFbmQKLSAgICBNRU5ECi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgOy8vIERlc2NyaXB0aW9uOgotICAgIDsvLyBEb2VzIGludGVycG9sYXRpb24gZm9yIHRoZSBjYXNlIG9mICJIYWxmUGl4ZWxZIiBwcmVkaWN0VHlwZS4gVGhlIHR3byAKLSAgICA7Ly8gcm91bmRpbmcgY2FzZXMgYXJlIGhhbmRsZWQgYnkgdGhlIHBhcmFtZXRlciAiJHJuZFZhbCIuIEF2ZXJhZ2VzIGJldHdlZW4KLSAgICA7Ly8gYSBwaXhlbCBhbmQgcGl4ZWwgYmVsb3cgaXQsIHJvdW5kaW5nIGl0IGJhc2VkIG9uICRybmRWYWwuIFRoZSAKLSAgICA7Ly8gcm91bmRpbmcgaXMgaW1wbGVtZW50ZWQgYnkgdXNpbmcgb3BDb2RlIHN3aXRjaGluZyBiZXR3ZWVuICJWUkhBREQiIGFuZCAKLSAgICA7Ly8gIlZIQUREIiBpbnN0cnVjdGlvbnMuCi0gICAgOy8vCi0gICAgOy8vIFN5bnRheDoKLSAgICA7Ly8gTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWSAkcm5kVmFsCi0gICAgOy8vIAotICAgIDsvLyBJbnB1dHM6IAotICAgIDsvLyAgICAgJHJuZFZhbDogMCBmb3Igcm91bmRpbmcgYW5kIDEgZm9yIG5vIHJvdW5kaW5nCi0gICAgOy8vIE91dHB1dHM6IE5vbmUKLQotICAgIE1BQ1JPIAotICAgIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFkgJHJuZFZhbAotCi0gICAgTENMUyBNX1ZIQUREUgotICAgIElGICRybmRWYWwgPSAwCi1NX1ZIQUREUiBTRVRTICJWUkhBREQiCi0gICAgRUxTRQotTV9WSEFERFIgU0VUUyAiVkhBREQiCi0gICAgRU5ESUYKLQotQ2FzZUhhbGZQaXhlbFlfUm5kJHJuZFZhbAotICAgIFZMRDEgICAgICAgIGRSb3cwLCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWTEQxICAgICAgICBkUm93MSwgW3BTcmNdLCBzcmNTdGVwCi0gICAgVkxEMSAgICAgICAgZFJvdzIsIFtwU3JjXSwgc3JjU3RlcAotICAgIFZMRDEgICAgICAgIGRSb3czLCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWTEQxICAgICAgICBkUm93NCwgW3BTcmNdLCBzcmNTdGVwCi0gICAgVkxEMSAgICAgICAgZFJvdzUsIFtwU3JjXSwgc3JjU3RlcAotICAgIFZMRDEgICAgICAgIGRSb3c2LCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWTEQxICAgICAgICBkUm93NywgW3BTcmNdLCBzcmNTdGVwCi0gICAgJE1fVkhBRERSICAgZFJvdzAsIGRSb3cwLCBkUm93MQotICAgIFZMRDEgICAgICAgIGRSb3c4LCBbcFNyY10sIHNyY1N0ZXAKLSAgICAkTV9WSEFERFIgICBkUm93MSwgZFJvdzEsIGRSb3cyCi0gICAgVlNUMSAgICAgICAgZFJvdzAsIFtwRHN0QDY0XSwgZHN0U3RlcAotICAgICRNX1ZIQUREUiAgIGRSb3cyLCBkUm93MiwgZFJvdzMKLSAgICBWU1QxICAgICAgICBkUm93MSwgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgJE1fVkhBRERSICAgZFJvdzMsIGRSb3czLCBkUm93NAotICAgIFZTVDEgICAgICAgIGRSb3cyLCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICAkTV9WSEFERFIgICBkUm93NCwgZFJvdzQsIGRSb3c1Ci0gICAgVlNUMSAgICAgICAgZFJvdzMsIFtwRHN0QDY0XSwgZHN0U3RlcAotICAgICRNX1ZIQUREUiAgIGRSb3c1LCBkUm93NSwgZFJvdzYKLSAgICBWU1QxICAgICAgICBkUm93NCwgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgJE1fVkhBRERSICAgZFJvdzYsIGRSb3c2LCBkUm93NwotICAgIFZTVDEgICAgICAgIGRSb3c1LCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICAkTV9WSEFERFIgICBkUm93NywgZFJvdzcsIGRSb3c4Ci0gICAgVlNUMSAgICAgICAgZFJvdzYsIFtwRHN0QDY0XSwgZHN0U3RlcAotICAgIFZTVDEgICAgICAgIGRSb3c3LCBbcERzdEA2NF0sIGRzdFN0ZXAKLQotICAgIEIgICAgICAgICAgIFN3aXRjaFByZWRpY3RUeXBlRW5kCi0gICAgTUVORAotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIDsvLyBEZXNjcmlwdGlvbjoKLSAgICA7Ly8gRG9lcyBpbnRlcnBvbGF0aW9uIGZvciB0aGUgY2FzZSBvZiAiSW50ZWdlclBpeGVsIiBwcmVkaWN0VHlwZS4gQm90aCAKLSAgICA7Ly8gcm91bmRpbmcgY2FzZXMgYXJlIGhhbmRsZWQuIAotICAgIDsvLyBUeXBpY2FsIGNvbXB1dGF0aW9uIGZvciBhIHJvdyBnb2VzIGxpa2UgdGhpcwotICAgIDsvLyAgICAgMS4gVkxEMSAgICAgICAge2RSb3cwLCBkUm93MFNoZnR9LCBbcFNyY10sIHNyY1N0ZXAgOy8vIExvYWQgdGhlIHJvdyBhbmQgbmV4dCA4IGJ5dGVzCi0gICAgOy8vICAgICAyLiBWRVhUICAgICAgICBkUm93MFNoZnQsIGRSb3cwLCBkUm93MFNoZnQsICMxICAgICA7Ly8gR2VuZXJhdGUgdGhlIHNoaWZ0ZWQgcm93Ci0gICAgOy8vICAgICAzLiBWQURETCAgICAgICBxU3VtMCwgZFJvdzAsIGRSb3cwU2hmdCAgICAgICAgICAgICA7Ly8gR2VuZXJhdGUgdGhlIHN1bSBvZiByb3cgYW5kIHNoaWZ0ZWQgcm93Ci0gICAgOy8vICAgICA1LiBWQUREICAgICAgICBxU3VtMCwgcVN1bTAsIHFTdW0xICAgICAgICAgICAgICAgICA7Ly8gQWRkIHRvIHRoZSBzdW0gb2YgbmV4dCByb3cgKG9kZCByb3cgc3VtIGhhcyByb3VuZGluZyB2YWx1ZSBhZGRlZCB0byBpdCkKLSAgICA7Ly8gICAgIDYuIFZTSFJOICAgICAgIGRSb3cwLCBxU3VtMCwgIzIgICAgICAgICAgICAgICAgICAgIDsvLyBEaXZpZGUgYnkgNAotICAgIDsvLyAgICAgNy4gVlNUMSAgICAgICAgZFJvdzAsIFtwRHN0QDY0XSwgZHN0U3RlcCAgICAgICAgICAgOy8vIFN0b3JlCi0gICAgOy8vIE9kZCByb3dzIHVuZGVyZ28gZm9sbG93aW5nIGNvbXB1dGF0aW9uIGFmdGVyIHN0ZXAgMwotICAgIDsvLyAgICAgNC4gVkFERCAgICAgICAgcVN1bTEsIHFTdW0xLCBxUm91bmQKLSAgICA7Ly8gVGhpcyBzYXZlcyBmb3IgYWRkaW5nIHJvdW5kaW5nIHZhbHVlIHRvIGVhY2ggZmluYWwgc3VtIChvdmVyYWxsIHNhdmVzIDQgCi0gICAgOy8vIGluc3RydWN0aW9ucykuCi0gICAgOy8vIFRoZXJlIGlzIHJldXNlIG9mIHJlZ2lzdGVycyBmb3IgcVN1bTYsIHFTdW03ICYgcVN1bTguIE92ZXJhbGwgc2NoZWR1bGluZyB0YWtlcyAKLSAgICA7Ly8gY2FyZSBvZiB0aGlzIGFuZCBhbHNvIG1pbmltaXplcyBzdGFsbHMuIFJvdW5kaW5nIHZhbHVlIHdhcyBtb2RpZmllZCBpbiAKLSAgICA7Ly8gQVJNIHJlZ2lzdGVyIHJuZFZhbCAob3JpZ2luYWxseSB1c2VkIGZvciByb3VuZGluZyBmbGFnKSBiZWZvcmUgdGhlIHN3aXRjaC4KLSAgICA7Ly8gSXQgaXMgdGhlbiBwb3B1bGF0ZWQgaW50byBhbGwgbGFuZXMgaW4gdGhpcyBtYWNyby4gTm8gYnJhbmNoaW5nIG91dCB0byAKLSAgICA7Ly8gbGFiZWwgIlN3aXRjaFByZWRpY3RUeXBlRW5kIiBpcyByZXF1aXJlZCBpbiB0aGUgZW5kIG9mIHRoZSBtYWNybyBhcyB0aGVzZSAKLSAgICA7Ly8gYXJlIHRoZSBsYXN0IG9mIHN3aXRjaCBjYXNlcy4KLSAgICA7Ly8gCi0gICAgOy8vIFN5bnRheDoKLSAgICA7Ly8gTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWFkKLSAgICA7Ly8gCi0gICAgOy8vIElucHV0czogTm9uZQotICAgIDsvLyBPdXRwdXRzOiBOb25lCi0KLSAgICBNQUNSTyAKLSAgICBNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxYWQotCi1DYXNlSGFsZlBpeGVsWFlfUm5kMAotQ2FzZUhhbGZQaXhlbFhZX1JuZDEKLSAgICBWTEQxICAgICAgICB7ZFJvdzAsIGRSb3cwU2hmdH0sIFtwU3JjXSwgc3JjU3RlcAotICAgIFZEVVAgICAgICAgIHFSb3VuZCwgcm5kVmFsCi0gICAgVkxEMSAgICAgICAge2RSb3cxLCBkUm93MVNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWRVhUICAgICAgICBkUm93MFNoZnQsIGRSb3cwLCBkUm93MFNoZnQsICMxCi0gICAgVkxEMSAgICAgICAge2RSb3cyLCBkUm93MlNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWRVhUICAgICAgICBkUm93MVNoZnQsIGRSb3cxLCBkUm93MVNoZnQsICMxCi0gICAgVkxEMSAgICAgICAge2RSb3czLCBkUm93M1NoZnR9LCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWRVhUICAgICAgICBkUm93MlNoZnQsIGRSb3cyLCBkUm93MlNoZnQsICMxCi0gICAgVkxEMSAgICAgICAge2RSb3c0LCBkUm93NFNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWQURETCAgICAgICBxU3VtMCwgZFJvdzAsIGRSb3cwU2hmdAotICAgIFZMRDEgICAgICAgIHtkUm93NSwgZFJvdzVTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwCi0gICAgVkFEREwgICAgICAgcVN1bTEsIGRSb3cxLCBkUm93MVNoZnQKLSAgICBWTEQxICAgICAgICB7ZFJvdzYsIGRSb3c2U2hmdH0sIFtwU3JjXSwgc3JjU3RlcAotICAgIFZFWFQgICAgICAgIGRSb3czU2hmdCwgZFJvdzMsIGRSb3czU2hmdCwgIzEKLSAgICBWTEQxICAgICAgICB7ZFJvdzcsIGRSb3c3U2hmdH0sIFtwU3JjXSwgc3JjU3RlcAotICAgIFZFWFQgICAgICAgIGRSb3c0U2hmdCwgZFJvdzQsIGRSb3c0U2hmdCwgIzEKLSAgICBWTEQxICAgICAgICB7ZFJvdzgsIGRSb3c4U2hmdH0sIFtwU3JjXSwgc3JjU3RlcAotICAgIFZBREQgICAgICAgIHFTdW0xLCBxU3VtMSwgcVJvdW5kCi0gICAgVkFEREwgICAgICAgcVN1bTIsIGRSb3cyLCBkUm93MlNoZnQKLSAgICBWRVhUICAgICAgICBkUm93NVNoZnQsIGRSb3c1LCBkUm93NVNoZnQsICMxCi0gICAgVkFERCAgICAgICAgcVN1bTAsIHFTdW0wLCBxU3VtMQotICAgIFZBRERMICAgICAgIHFTdW0zLCBkUm93MywgZFJvdzNTaGZ0Ci0gICAgVkVYVCAgICAgICAgZFJvdzZTaGZ0LCBkUm93NiwgZFJvdzZTaGZ0LCAjMQotICAgIFZBREQgICAgICAgIHFTdW0xLCBxU3VtMSwgcVN1bTIKLSAgICBWU0hSTiAgICAgICBkUm93MCwgcVN1bTAsICMyCi0gICAgVkFEREwgICAgICAgcVN1bTQsIGRSb3c0LCBkUm93NFNoZnQKLSAgICBWU0hSTiAgICAgICBkUm93MSwgcVN1bTEsICMyCi0gICAgVkFERCAgICAgICAgcVN1bTMsIHFTdW0zLCBxUm91bmQKLSAgICBWQURETCAgICAgICBxU3VtNSwgZFJvdzUsIGRSb3c1U2hmdAotICAgIFZTVDEgICAgICAgIGRSb3cwLCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICBWRVhUICAgICAgICBkUm93N1NoZnQsIGRSb3c3LCBkUm93N1NoZnQsICMxCi0gICAgVlNUMSAgICAgICAgZFJvdzEsIFtwRHN0QDY0XSwgZHN0U3RlcAotICAgIFZFWFQgICAgICAgIGRSb3c4U2hmdCwgZFJvdzgsIGRSb3c4U2hmdCwgIzEKLSAgICBWQUREICAgICAgICBxU3VtNSwgcVN1bTUsIHFSb3VuZAotICAgIFZBREQgICAgICAgIHFTdW0yLCBxU3VtMiwgcVN1bTMKLSAgICBWQUREICAgICAgICBxU3VtMywgcVN1bTMsIHFTdW00Ci0gICAgVkFERCAgICAgICAgcVN1bTQsIHFTdW00LCBxU3VtNQotICAgIFZTSFJOICAgICAgIGRSb3cyLCBxU3VtMiwgIzIKLSAgICBWU0hSTiAgICAgICBkUm93MywgcVN1bTMsICMyCi0gICAgVlNIUk4gICAgICAgZFJvdzQsIHFTdW00LCAjMgotICAgIFZBRERMICAgICAgIHFTdW02LCBkUm93NiwgZFJvdzZTaGZ0Ci0gICAgVkFEREwgICAgICAgcVN1bTcsIGRSb3c3LCBkUm93N1NoZnQKLSAgICBWU1QxICAgICAgICBkUm93MiwgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgVkFEREwgICAgICAgcVN1bTgsIGRSb3c4LCBkUm93OFNoZnQKLSAgICBWQUREICAgICAgICBxU3VtNywgcVN1bTcsIHFSb3VuZAotICAgIFZTVDEgICAgICAgIGRSb3czLCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICBWU1QxICAgICAgICBkUm93NCwgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgVkFERCAgICAgICAgcVN1bTUsIHFTdW01LCBxU3VtNgotICAgIFZBREQgICAgICAgIHFTdW02LCBxU3VtNiwgcVN1bTcKLSAgICBWQUREICAgICAgICBxU3VtNywgcVN1bTcsIHFTdW04Ci0gICAgVlNIUk4gICAgICAgZFJvdzUsIHFTdW01LCAjMgotICAgIFZTSFJOICAgICAgIGRSb3c2LCBxU3VtNiwgIzIKLSAgICBWU0hSTiAgICAgICBkUm93NywgcVN1bTcsICMyCi0gICAgVlNUMSAgICAgICAgZFJvdzUsIFtwRHN0QDY0XSwgZHN0U3RlcAotICAgIFZTVDEgICAgICAgIGRSb3c2LCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICBWU1QxICAgICAgICBkUm93NywgW3BEc3RANjRdLCBkc3RTdGVwCi0KLSAgICBNRU5ECi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLTsvLyBJbnB1dC9PdXRwdXQgUmVnaXN0ZXJzCi1wU3JjICAgICAgICAgICAgICAgICAgUk4gMAotc3JjU3RlcCAgICAgICAgICAgICAgIFJOIDEKLXBTcmNSZXNpZHVlICAgICAgICAgICBSTiAyCi1wRHN0ICAgICAgICAgICAgICAgICAgUk4gMwotZHN0U3RlcCAgICAgICAgICAgICAgIFJOIDQKLXByZWRpY3RUeXBlICAgICAgICAgICBSTiA1Ci1ybmRWYWwgICAgICAgICAgICAgICAgUk4gNgotCi07Ly8gTG9jYWwgU2NyYXRjaCBSZWdpc3RlcnMKLXBEc3RDb3B5ICAgICAgICAgICAgICBSTiAwCi1yZXR1cm4gICAgICAgICAgICAgICAgUk4gMAotCi07Ly8gTmVvbiBSZWdpc3RlcnMKLWRSb3cwICAgICAgICAgICAgICAgICBETiBEMC5VOAotZFJvdzBTaGZ0ICAgICAgICAgICAgIEROIEQxLlU4Ci1kUm93MSAgICAgICAgICAgICAgICAgRE4gRDIuVTgKLWRSb3cxU2hmdCAgICAgICAgICAgICBETiBEMy5VOAotZFJvdzIgICAgICAgICAgICAgICAgIEROIEQ0LlU4Ci1kUm93MlNoZnQgICAgICAgICAgICAgRE4gRDUuVTgKLWRSb3czICAgICAgICAgICAgICAgICBETiBENi5VOAotZFJvdzNTaGZ0ICAgICAgICAgICAgIEROIEQ3LlU4Ci1kUm93NCAgICAgICAgICAgICAgICAgRE4gRDguVTgKLWRSb3c0U2hmdCAgICAgICAgICAgICBETiBEOS5VOAotZFJvdzUgICAgICAgICAgICAgICAgIEROIEQxMC5VOAotZFJvdzVTaGZ0ICAgICAgICAgICAgIEROIEQxMS5VOAotZFJvdzYgICAgICAgICAgICAgICAgIEROIEQxMi5VOAotZFJvdzZTaGZ0ICAgICAgICAgICAgIEROIEQxMy5VOAotZFJvdzcgICAgICAgICAgICAgICAgIEROIEQxNC5VOAotZFJvdzdTaGZ0ICAgICAgICAgICAgIEROIEQxNS5VOAotZFJvdzggICAgICAgICAgICAgICAgIEROIEQxNi5VOAotZFJvdzhTaGZ0ICAgICAgICAgICAgIEROIEQxNy5VOAotCi0KLXFTdW0wICAgICAgICAgICAgICAgICBRTiBROS5VMTYKLXFTdW0xICAgICAgICAgICAgICAgICBRTiBRMTAuVTE2Ci1xU3VtMiAgICAgICAgICAgICAgICAgUU4gUTExLlUxNgotcVN1bTMgICAgICAgICAgICAgICAgIFFOIFExMi5VMTYKLXFTdW00ICAgICAgICAgICAgICAgICBRTiBRMTMuVTE2Ci1xU3VtNSAgICAgICAgICAgICAgICAgUU4gUTE0LlUxNgotcVN1bTYgICAgICAgICAgICAgICAgIFFOIFEwLlUxNgotcVN1bTcgICAgICAgICAgICAgICAgIFFOIFExLlUxNgotcVN1bTggICAgICAgICAgICAgICAgIFFOIFEyLlUxNgotCi1xUm91bmQgICAgICAgICAgICAgICAgUU4gUTE1LlUxNgotCi1kRHN0MCAgICAgICAgICAgICAgICAgRE4gRDAuVTgKLWREc3QxICAgICAgICAgICAgICAgICBETiBEMS5VOAotZERzdDIgICAgICAgICAgICAgICAgIEROIEQyLlU4Ci1kRHN0MyAgICAgICAgICAgICAgICAgRE4gRDMuVTgKLWREc3Q0ICAgICAgICAgICAgICAgICBETiBENC5VOAotZERzdDUgICAgICAgICAgICAgICAgIEROIEQ1LlU4Ci1kRHN0NiAgICAgICAgICAgICAgICAgRE4gRDYuVTgKLWREc3Q3ICAgICAgICAgICAgICAgICBETiBENy5VOAotCi1xUmVzMCAgICAgICAgICAgICAgICAgUU4gUTQuUzE2Ci1xUmVzMSAgICAgICAgICAgICAgICAgUU4gUTUuUzE2Ci1xUmVzMiAgICAgICAgICAgICAgICAgUU4gUTYuUzE2Ci1xUmVzMyAgICAgICAgICAgICAgICAgUU4gUTcuUzE2Ci1xUmVzNCAgICAgICAgICAgICAgICAgUU4gUTguUzE2Ci1xUmVzNSAgICAgICAgICAgICAgICAgUU4gUTkuUzE2Ci1xUmVzNiAgICAgICAgICAgICAgICAgUU4gUTEwLlMxNgotcVJlczcgICAgICAgICAgICAgICAgIFFOIFExMS5TMTYKLQotICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKLSAgICBNX1NUQVJUICAgICBvbXhWQ000UDJfTUNSZWNvbkJsb2NrLCByNiwgZDE1Ci0gICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKLSAgICBNX0FSRyAgICAgICBBcmdfZHN0U3RlcCwgICAgICAgIDQKLSAgICBNX0FSRyAgICAgICBBcmdfcHJlZGljdFR5cGUsICAgIDQKLSAgICBNX0FSRyAgICAgICBBcmdfcm5kVmFsLCAgICAgICAgIDQKLSAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjawotICAgIE1fTERSICAgICAgIGRzdFN0ZXAsIEFyZ19kc3RTdGVwCi0gICAgTV9MRFIgICAgICAgcHJlZGljdFR5cGUsIEFyZ19wcmVkaWN0VHlwZQotICAgIE1fTERSICAgICAgIHJuZFZhbCwgQXJnX3JuZFZhbAotICAgIEFERCAgICAgICAgIHByZWRpY3RUeXBlLCBybmRWYWwsIHByZWRpY3RUeXBlLCBMU0wgIzEKLSAgICBSU0IgICAgICAgICBybmRWYWwsIHJuZFZhbCwgIzIgICAgICAgICAgICAgIDsvLyBwcmVwYXJpbmcgcm5kVmFsIGZvciBIYWxmUGl4ZWxYWQotICAgIAotICAgIDsvLyBUaGUgZm9sbG93aW5nIGlzIGltcGxlbWVudGF0aW9uIG9mIHN3aXRjaGluZyB0byBkaWZmZXJlbnQgY29kZSBzZWdtZW50cwotICAgIDsvLyBiYXNlZCBvbiBkaWZmZXJlbnQgcHJlZGljdFR5cGUgYW5kIHJuZFZhbCBmbGFncy4gVGhlIGNvcnJlc3BvbmRpbmcgCi0gICAgOy8vIGxhYmVscyAoZS5nLiBDYXNlSW50ZWdlclBpeGVsX1JuZDApIGFyZSBlbWJlZGRlZCBpbiB0aGUgbWFjcm9zIGZvbGxvd2luZwotICAgIDsvLyBNX0VORFNXSVRDSCAoZS5nLiBNX01DUkVDT05CTE9DS19JbnRlZ2VyUGl4ZWwpLiBXaGlsZSAiTV9NQ1JFQ09OQkxPQ0tfSW50ZWdlclBpeGVsIiAKLSAgICA7Ly8gYW5kICJNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxYWSIgaGFuZGxlIGZvciBib3RoIHJvdW5kaW5nIGNhc2VzOyAKLSAgICA7Ly8gIk1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFgiIGFuZCAiTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWSIgbWFjcm9zIGhhbmRsZSAKLSAgICA7Ly8gdGhlIHR3byByb3VuZGluZyBjYXNlcyBpbiBzZXBhcmF0ZSBjb2RlIGJhc2VzLgotICAgIDsvLyBBbGwgdGhlc2UgdG9nZXRoZXIgaW1wbGVtZW50IHRoZSBpbnRlcnBvbGF0aW9uIGZ1bmN0aW9uYWxpdHkKLSAgICAKLSAgICBNX1NXSVRDSCAgICBwcmVkaWN0VHlwZQotICAgICAgICBNX0NBU0UgICAgICBDYXNlSW50ZWdlclBpeGVsX1JuZDAKLSAgICAgICAgTV9DQVNFICAgICAgQ2FzZUludGVnZXJQaXhlbF9SbmQxCi0gICAgICAgIE1fQ0FTRSAgICAgIENhc2VIYWxmUGl4ZWxYX1JuZDAKLSAgICAgICAgTV9DQVNFICAgICAgQ2FzZUhhbGZQaXhlbFhfUm5kMQotICAgICAgICBNX0NBU0UgICAgICBDYXNlSGFsZlBpeGVsWV9SbmQwCi0gICAgICAgIE1fQ0FTRSAgICAgIENhc2VIYWxmUGl4ZWxZX1JuZDEKLSAgICAgICAgTV9DQVNFICAgICAgQ2FzZUhhbGZQaXhlbFhZX1JuZDAKLSAgICAgICAgTV9DQVNFICAgICAgQ2FzZUhhbGZQaXhlbFhZX1JuZDEKLSAgICBNX0VORFNXSVRDSAotCi0gICAgTV9NQ1JFQ09OQkxPQ0tfSW50ZWdlclBpeGVsCi0gICAgTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWCAwCi0gICAgTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWCAxCi0gICAgTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWSAwCi0gICAgTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWSAxCi0gICAgTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWFkKLVN3aXRjaFByZWRpY3RUeXBlRW5kCi0KLSAgICA7Ly8gQWZ0ZXIgaW50ZXJwb2xhdGlvbiBpcyBkb25lLCByZXNpZHVlIG5lZWRzIHRvIGJlIGFkZGVkLiBUaGlzIGlzIGRvbmUgCi0gICAgOy8vIG9ubHkgaW4gY2FzZSAicFNyY1Jlc2lkdWUiIHBhcmFtZXRlciB0byB0aGUgZnVuY3Rpb24gaXMgbm90IE5VTEwuCi0gICAgOy8vIEZvbGxvd2luZyBpcyBhIGNvbXBsZXRlbHkgdW5yb2xsZWQgY29kZSB0byBkbyBzby4gRWFjaCByb3cgYW5kIAotICAgIDsvLyBjb3JyZXNwb25kaW5nIHJlc2lkdWUgaXMgbG9hZGVkIGFuZCByZXNpZHVlIGlzIGFkZGVkIGFuZCB2YWx1ZSAKLSAgICA7Ly8gc3RvcmVkCi0gICAgCi0gICAgQ01QICAgICAgICAgcFNyY1Jlc2lkdWUsICMwCi0gICAgU1VCTkUgICAgICAgcERzdCwgcERzdCwgZHN0U3RlcCwgTFNMICMzICAgICA7Ly8gUmVzdG9yaW5nIHBEc3QKLSAgICBNT1ZORSAgICAgICBwRHN0Q29weSwgcERzdAotICAgIEJFUSAgICAgICAgIHBTcmNSZXNpZHVlQ29uZGl0aW9uRW5kCi1wU3JjUmVzaWR1ZU5vdE51bGwgICAgCi0gICAgVkxEMSAgICAgICAgZERzdDAsIFtwRHN0QDY0XSwgZHN0U3RlcAotICAgIFZMRDEgICAgICAgIHFSZXMwLCBbcFNyY1Jlc2lkdWVAMTI4XSEKLSAgICBWTEQxICAgICAgICBkRHN0MSwgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgVkxEMSAgICAgICAgcVJlczEsIFtwU3JjUmVzaWR1ZUAxMjhdIQotICAgIFZMRDEgICAgICAgIGREc3QyLCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICBWTEQxICAgICAgICBxUmVzMiwgW3BTcmNSZXNpZHVlQDEyOF0hCi0gICAgVkFERFcgICAgICAgcVJlczAsIHFSZXMwLCBkRHN0MAotICAgIFZMRDEgICAgICAgIGREc3QzLCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICBWQUREVyAgICAgICBxUmVzMSwgcVJlczEsIGREc3QxCi0gICAgVkxEMSAgICAgICAgcVJlczMsIFtwU3JjUmVzaWR1ZUAxMjhdIQotICAgIFZBRERXICAgICAgIHFSZXMyLCBxUmVzMiwgZERzdDIKLSAgICBWTEQxICAgICAgICBkRHN0NCwgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgVlFNT1ZVTiAgICAgZERzdDAsIHFSZXMwCi0gICAgVkxEMSAgICAgICAgcVJlczQsIFtwU3JjUmVzaWR1ZUAxMjhdIQotICAgIFZBRERXICAgICAgIHFSZXMzLCBxUmVzMywgZERzdDMKLSAgICBWTEQxICAgICAgICBkRHN0NSwgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgVlFNT1ZVTiAgICAgZERzdDEsIHFSZXMxCi0gICAgVkxEMSAgICAgICAgcVJlczUsIFtwU3JjUmVzaWR1ZUAxMjhdIQotICAgIFZBRERXICAgICAgIHFSZXM0LCBxUmVzNCwgZERzdDQKLSAgICBWTEQxICAgICAgICBkRHN0NiwgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgVlFNT1ZVTiAgICAgZERzdDIsIHFSZXMyCi0gICAgVkxEMSAgICAgICAgcVJlczYsIFtwU3JjUmVzaWR1ZUAxMjhdIQotICAgIFZBRERXICAgICAgIHFSZXM1LCBxUmVzNSwgZERzdDUKLSAgICBWTEQxICAgICAgICBkRHN0NywgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgVlFNT1ZVTiAgICAgZERzdDMsIHFSZXMzCi0gICAgVkxEMSAgICAgICAgcVJlczcsIFtwU3JjUmVzaWR1ZUAxMjhdIQotICAgIFZBRERXICAgICAgIHFSZXM2LCBxUmVzNiwgZERzdDYKLSAgICBWU1QxICAgICAgICBkRHN0MCwgW3BEc3RDb3B5QDY0XSwgZHN0U3RlcAotICAgIFZRTU9WVU4gICAgIGREc3Q0LCBxUmVzNAotICAgIFZTVDEgICAgICAgIGREc3QxLCBbcERzdENvcHlANjRdLCBkc3RTdGVwCi0gICAgVkFERFcgICAgICAgcVJlczcsIHFSZXM3LCBkRHN0NwotICAgIFZTVDEgICAgICAgIGREc3QyLCBbcERzdENvcHlANjRdLCBkc3RTdGVwCi0gICAgVlFNT1ZVTiAgICAgZERzdDUsIHFSZXM1Ci0gICAgVlNUMSAgICAgICAgZERzdDMsIFtwRHN0Q29weUA2NF0sIGRzdFN0ZXAKLSAgICBWUU1PVlVOICAgICBkRHN0NiwgcVJlczYKLSAgICBWU1QxICAgICAgICBkRHN0NCwgW3BEc3RDb3B5QDY0XSwgZHN0U3RlcAotICAgIFZRTU9WVU4gICAgIGREc3Q3LCBxUmVzNwotICAgIFZTVDEgICAgICAgIGREc3Q1LCBbcERzdENvcHlANjRdLCBkc3RTdGVwCi0gICAgVlNUMSAgICAgICAgZERzdDYsIFtwRHN0Q29weUA2NF0sIGRzdFN0ZXAKLSAgICBWU1QxICAgICAgICBkRHN0NywgW3BEc3RDb3B5QDY0XSwgZHN0U3RlcAotICAgIAotcFNyY1Jlc2lkdWVDb25kaXRpb25FbmQKLSAgICBNT1YgICAgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0KLSAgICBNX0VORAotICAgIEVORElGIDsvLyBDb3J0ZXhBOAotICAgIEVORAotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOy8vIG9teFZDTTRQMl9NQ1JlY29uQmxvY2sgZW5kcwotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmFfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmFfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjRlYjI4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhX3MucworKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOyAqKioqKioqKioqCi07ICogCi07ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYV9zLnMKLTsgKiBPcGVuTUFYIERMOiB2MS4wLjIKLTsgKiBSZXZpc2lvbjogICAxMjI5MAotOyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOyAqIAotOyAqIAotOyAqIAotOyAqIAotOyAqIERlc2NyaXB0aW9uOgotOyAqIENvbnRhaW5zIG1vZHVsZSBmb3IgREMvQUMgY29lZmZpY2llbnQgcHJlZGljdGlvbgotOyAqCi07ICogCi07ICogRnVuY3Rpb246IG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEKLTsgKgotOyAqIERlc2NyaXB0aW9uOgotOyAqIFBlcmZvcm1zIGFkYXB0aXZlIERDL0FDIGNvZWZmaWNpZW50IHByZWRpY3Rpb24gZm9yIGFuIGludHJhIGJsb2NrLiBQcmlvcgotOyAqIHRvIHRoZSBmdW5jdGlvbiBjYWxsLCBwcmVkaWN0aW9uIGRpcmVjdGlvbiAocHJlZERpcikgc2hvdWxkIGJlIHNlbGVjdGVkCi07ICogYXMgc3BlY2lmaWVkIGluIHN1YmNsYXVzZSA3LjQuMy4xIG9mIElTTy9JRUMgMTQ0OTYtMi4KLTsgKgotOyAqIFJlbWFya3M6Ci07ICoKLTsgKiBQYXJhbWV0ZXJzOgotOyAqIFtpbl0gIHBTcmNEc3QgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMgdGhlIAotOyAqICAgICAgICAgICAgICAgICAgICBxdWFudGl6ZWQgY29lZmZpY2llbnQgcmVzaWR1YWxzIChQUUYpIG9mIHRoZSBjdXJyZW50IAotOyAqICAgICAgICAgICAgICAgICAgICBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiBUaGUgCi07ICogICAgICAgICAgICAgICAgICAgIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCB0byB0aGUgcmFuZ2UgCi07ICogICAgICAgICAgICAgICAgICAgIFstMjA0OCwgMjA0N10uCi07ICogW2luXSAgcFByZWRCdWZSb3cgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXI7IG11c3QgYmUgYWxpZ25lZAotOyAqICAgICAgICAgICAgICAgICAgICBvbiBhIDQtYnl0ZSBib3VuZGFyeS4KLTsgKiBbaW5dICBwUHJlZEJ1ZkNvbCAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcjsgbXVzdCBiZSAKLTsgKiAgICAgICAgICAgICAgICAgICAgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4KLTsgKiBbaW5dICBjdXJRUCAgICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgY3VycmVudCBibG9jay4gY3VyUVAgbWF5IAotOyAqICAgICAgICAgICAgICAgICAgICBlcXVhbCB0byBwcmVkUVAgZXNwZWNpYWxseSB3aGVuIHRoZSBjdXJyZW50IGJsb2NrIGFuZCAKLTsgKiAgICAgICAgICAgICAgICAgICAgdGhlIHByZWRpY3RvciBibG9jayBhcmUgaW4gdGhlIHNhbWUgbWFjcm9ibG9jay4KLTsgKiBbaW5dICBwcmVkUVAgICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrCi07ICogW2luXSAgcHJlZERpciAgICAgIGluZGljYXRlcyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggdGFrZXMgb25lCi07ICogICAgICAgICAgICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgotOyAqICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fSE9SSVpPTlRBTCAgICBwcmVkaWN0IGhvcml6b250YWxseQotOyAqICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fVkVSVElDQUwgICAgICAgIHByZWRpY3QgdmVydGljYWxseQotOyAqIFtpbl0gIEFDUHJlZEZsYWcgICBhIGZsYWcgaW5kaWNhdGluZyBpZiBBQyBwcmVkaWN0aW9uIHNob3VsZCBiZQotOyAqICAgICAgICAgICAgICAgICAgICBwZXJmb3JtZWQuIEl0IGlzIGVxdWFsIHRvIGFjX3ByZWRfZmxhZyBpbiB0aGUgYml0Ci07ICogICAgICAgICAgICAgICAgICAgIHN0cmVhbSBzeW50YXggb2YgTVBFRy00Ci07ICogW2luXSAgdmlkZW9Db21wICAgIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2UsIGNocm9taW5hbmNlIG9yCi07ICogICAgICAgICAgICAgICAgICAgIGFscGhhKSBvZiB0aGUgY3VycmVudCBibG9jawotOyAqIFtvdXRdIHBTcmNEc3QgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMKLTsgKiAgICAgICAgICAgICAgICAgICAgdGhlIHF1YW50aXplZCBjb2VmZmljaWVudHMgKFFGKSBvZiB0aGUgY3VycmVudAotOyAqICAgICAgICAgICAgICAgICAgICBibG9jawotOyAqIFtvdXRdIHBQcmVkQnVmUm93ICBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIKLTsgKiBbb3V0XSBwUHJlZEJ1ZkNvbCAgcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyCi07ICogUmV0dXJuIFZhbHVlOgotOyAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgotOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50cyAKLTsgKiAtIEF0IGxlYXN0IG9uZSBvZiB0aGUgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCwgcFByZWRCdWZSb3csIG9yIHBQcmVkQnVmQ29sLgotOyAqIC0gQXQgbGVhc3Qgb25lIHRoZSBmb2xsb3dpbmcgY2FzZXM6IGN1clFQIDw9IDAsIHByZWRRUCA8PSAwLCBjdXJRUCA+MzEsIAotOyAqICAgcHJlZFFQID4gMzEsIHByZURpciBleGNlZWRzIFsxLDJdLgotOyAqIC0gQXQgbGVhc3Qgb25lIG9mIHRoZSBwb2ludGVycyBwU3JjRHN0LCBwUHJlZEJ1ZlJvdywgb3IgcFByZWRCdWZDb2wgaXMgbm90IAotOyAqICAgNC1ieXRlIGFsaWduZWQuCi07ICoKLTsgKioqKioqKioqCi0gICAgIAotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKLSAgICAgICAKLSAgICAgICAgICAgICAKLQotICAgICAgIElNUE9SVCAgICAgICAgYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzMyCi0gICAgICAgSU1QT1JUICAgICAgICBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMTYKLSAgICAgICBJTVBPUlQgICAgICAgIGFybVZDTTRQMl9EQ1NjYWxlcgotICAgICAgIAotICAgICAgICBJRiBDb3J0ZXhBOAotOy8vIElucHV0IEFyZ3VtZW50cwotCi1wU3JjRHN0ICAgICAgICAgIFJOIDAKLXBQcmVkQnVmUm93ICAgICAgUk4gMQotcFByZWRCdWZDb2wgICAgICBSTiAyCi1jdXJRUCAgICAgICAgICAgIFJOIDMKLVFQICAgICAgICAgICAgICAgUk4gMwotcHJlZFFQICAgICAgICAgICBSTiA0Ci1wcmVkRGlyICAgICAgICAgIFJOIDUKLUFDUHJlZEZsYWcgICAgICAgUk4gNgotdmlkZW9Db21wICAgICAgICBSTiA3Ci0KLTsvLyBMb2NhbCBWYXJpYWJsZXMKLQotc2hvcnRWaWRlb0hlYWRlciBSTiA0Ci1kY1NjYWxlciAgICAgICAgIFJOIDQKLWluZGV4ICAgICAgICAgICAgUk4gNgotcHJlZENvZWZmVGFibGUgICBSTiA3Ci10ZW1wMSAgICAgICAgICAgIFJOIDYKLXRlbXAyICAgICAgICAgICAgUk4gOQotdGVtcCAgICAgICAgICAgICBSTiAxNAotQ29uc3QgICAgICAgICAgICBSTiA4Ci10ZW1wcFByZWRDb2xCdWYgIFJOIDgKLXRlbXBQcmVkICAgICAgICAgUk4gOQotCi1hYnNDb2VmZkRDICAgICAgIFJOIDgKLW5lZ2RjU2NhbGVyICAgICAgUk4gMTAKLVJlbSAgICAgICAgICAgICAgUk4gMTEKLXRlbXAzICAgICAgICAgICAgUk4gMTIKLQotZGNSb3didWZDb2VmZiAgICBSTiAxMAotZGNDb2xCdWZmQ29lZmYgICBSTiAxMQotUmV0dXJuICAgICAgICAgICBSTiAwCi0KLTsvL05FT04gUmVnaXN0ZXJzCi0KLXFQcmVkUm93QnVmICAgICAgIFFOIFEwLlMxNgotZFByZWRSb3dCdWYwICAgICAgRE4gRDAuUzE2Ci1kUHJlZFJvd0J1ZjEgICAgICBETiBEMS5TMTYKLQotCi0KLQotcUNvZWZmVGFiICAgICAgICAgUU4gUTEuUzMyCi0KLXFQcmVkUVAgICAgICAgICAgIFFOIFEyLlMxNgotZFByZWRRUDAgICAgICAgICAgRE4gRDQuUzE2Ci1kUHJlZFFQMSAgICAgICAgICBETiBENS5TMTYKLQotCi1xdGVtcDEgICAgICAgICAgICBRTiBRMy5TMzIKLXF0ZW1wICAgICAgICAgICAgIFFOIFEzLlMxNgotCi1kdGVtcDAgICAgICAgICAgICBETiBENi5TMTYKLWR0ZW1wMSAgICAgICAgICAgIEROIEQ3LlMxNgotCi1kdGVtcDIgICAgICAgICAgICBETiBEOC5TMTYKLWR0ZW1wMyAgICAgICAgICAgIEROIEQ5LlMxNgotCi1kdGVtcDQgICAgICAgICAgICBETiBEMi5TMTYKLWR0ZW1wNSAgICAgICAgICAgIEROIEQzLlMxNgotZHRlbXA2ICAgICAgICAgICAgRE4gRDQuUzE2Ci1kdGVtcDcgICAgICAgICAgICBETiBENS5TMTYKLSAKLXF0ZW1wUHJlZDEgICAgICAgIFFOIFE1LlMzMgotcXRlbXBQcmVkICAgICAgICAgUU4gUTUuUzE2Ci0KLWR0ZW1wUHJlZDAgICAgICAgIEROIEQxMC5TMTYKLWR0ZW1wUHJlZDEgICAgICAgIEROIEQxMS5TMTYKLSAKLSAgCi0KLSAgICAgIE1fU1RBUlQgICBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhLHIxMSxkMTEKLQotICAgICAgOy8vIEFzc2lnbmluZyBwb2ludGVycyB0byBJbnB1dCBhcmd1bWVudHMgb24gU3RhY2sKLSAgICAKLSAgICAgIE1fQVJHICAgICAgICAgICBwcmVkUVBvblN0YWNrLDQgIAotICAgICAgTV9BUkcgICAgICAgICAgIHByZWREaXJvblN0YWNrLDQKLSAgICAgIE1fQVJHICAgICAgICAgICBBQ1ByZWRGbGFnb25TdGFjayw0Ci0gICAgICBNX0FSRyAgICAgICAgICAgdmlkZW9Db21wb25TdGFjayw0Ci0gICAgICAKLSAgICAgIDsvLyBEQyBQcmVkaWN0aW9uCi0KLSAgICAgIE1fTERSICAgICAgICAgICB2aWRlb0NvbXAsdmlkZW9Db21wb25TdGFjayAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHZpZGVvQ29tcCBGcm9tIFN0YWNrICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAKLSAgICAgIE1fTERSICAgICAgICAgICBwcmVkRGlyLHByZWREaXJvblN0YWNrICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIFByZWRpY3Rpb24gZGlyZWN0aW9uCi0gICAgICA7Ly8gREMgU2NhbGVyIGNhbGN1bGF0aW9uICAgCi0gICAgICBMRFIgICAgICAgICAgICAgaW5kZXgsID1hcm1WQ000UDJfRENTY2FsZXIKLSAgICAgIEFERCAgICAgICAgICAgICBpbmRleCxpbmRleCx2aWRlb0NvbXAsTFNMICM1Ci0gICAgICBMRFJCICAgICAgICAgICAgZGNTY2FsZXIsW2luZGV4LFFQXQotCi0gICAgICAgCi0gICAgICBMRFIgICAgICAgICAgICAgcHJlZENvZWZmVGFibGUsID1hcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMTYgICA7Ly8gTG9hZGluZyB0aGUgdGFibGUgd2l0aCBlbnRyaWVzIDMyNzY3LygxIHRvIDYzKSAKLSAgICAgIENNUCAgICAgICAgICAgICBwcmVkRGlyLCMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDaGVjayBpZiB0aGUgUHJlZGljdGlvbiBkaXJlY3Rpb24gaXMgdmVydGljYWwKLQotICAgICAgOy8vIENhdWx1Y2F0ZSB0ZW1wUHJlZAotICAgICAgICAgICAgCi0gICAgICBMRFJFUVNIICAgICAgICAgYWJzQ29lZmZEQyxbcFByZWRCdWZSb3ddICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgdmV0aWNhbCBsb2FkIHRoZSBjb2VmZiBmcm9tIFJvdyBQcmVkaWN0aW9uIEJ1ZmZlcgotICAgICAgTERSTkVTSCAgICAgICAgIGFic0NvZWZmREMsW3BQcmVkQnVmQ29sXSAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIGhvcml6b250YWwgbG9hZCB0aGUgY29lZmYgZnJvbSBjb2x1bW4gUHJlZGljdGlvbiBCdWZmZXIKLSAgICAgIAotICAgICAgUlNCICAgICAgICAgICAgIG5lZ2RjU2NhbGVyLGRjU2NhbGVyLCMwICAgICAgICAgICAgICAgICAgICAgICAgOy8vIG5lZ2RjU2NhbGVyPS1kY1NjYWxlciAgIAotICAgICAgTU9WICAgICAgICAgICAgIHRlbXAxLGFic0NvZWZmREMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgdGhlIFByZWRpY3Rpb24gY29lZmYgdG8gdGVtcCBmb3IgY29tcGFyaXNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIFJTQkxUICAgICAgICAgICBhYnNDb2VmZkRDLHRlbXAxLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjYWxjdWxhdGUgYWJzb2x1dGUgdmFsIG9mIHByZWRpY3Rpb24gY29lZmYKLSAgICAgIAotICAgICAgQUREICAgICAgICAgICAgIHRlbXAsZGNTY2FsZXIsZGNTY2FsZXIKLSAgICAgIExEUkggICAgICAgICAgICB0ZW1wLFtwcmVkQ29lZmZUYWJsZSx0ZW1wXSAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHZhbHVlIGZyb20gY29lZmYgdGFibGUgZm9yIHBlcmZvcm1pbmcgZGl2aXNpb24gdXNpbmcgbXVsdGlwbGljYXRpb24KLSAgICAgIFNNVUxCQiAgICAgICAgICB0ZW1wUHJlZCx0ZW1wLGFic0NvZWZmREMgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wcGVkPXBQcmVkQnVmUm93KENvbClbMF0qMzI3NjcvZGNTY2FsZXIKLSAgICAgIEFERCAgICAgICAgICAgICB0ZW1wMyxkY1NjYWxlciwjMQotICAgICAgTFNSICAgICAgICAgICAgIHRlbXBQcmVkLHRlbXBQcmVkLCMxNSAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXBwZWQ9cFByZWRCdWZSb3coQ29sKVswXS9kY1NjYWxlciAgICAgICAgICAgICAgICAgIAotICAgICAgTFNSICAgICAgICAgICAgIHRlbXAzLHRlbXAzLCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXAzPXJvdW5kKGRjU2NhbGVyLzIpICAgICAgICAgICAKLSAgICAgIE1MQSAgICAgICAgICAgICBSZW0sbmVnZGNTY2FsZXIsdGVtcFByZWQsYWJzQ29lZmZEQyAgICAgICAgICAgIDsvLyBSZW1haW5kZXIgUmVtPWFicyhwUHJlZEJ1ZlJvdyhDb2wpWzBdKS10ZW1wUHJlZCpkY1NjYWxlcgotICAgICAgCi0gICAgICBMRFJIICAgICAgICAgICAgZGNSb3didWZDb2VmZixbcFByZWRCdWZDb2xdICAgICAgICAgICAgCi0gICAgICAKLSAgICAgIENNUCAgICAgICAgICAgICBSZW0sdGVtcDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjb21wYXJlIFJlbSB3aXRoIChkY1NjYWxlci8yKQotICAgICAgQURER0UgICAgICAgICAgIHRlbXBQcmVkLCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXBQcmVkPXRlbXBQcmVkKzEgaWYgUmVtPj0oZGNTY2FsZXIvMikKLSAgICAgIENNUCAgICAgICAgICAgICB0ZW1wMSwjMAotICAgICAgUlNCTFQgICAgICAgICAgIHRlbXBQcmVkLHRlbXBQcmVkLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXBQcmVkPS10ZW1wUHJlZCBpZiAKLSAgICAgICAKLSAgICAgIFNUUkggICAgICAgICAgICBkY1Jvd2J1ZkNvZWZmLFtwUHJlZEJ1ZlJvdywjLTE2XSAgICAgIAotICAgICAgIAotCi0gICAgICBMRFJIICAgICAgICAgICAgdGVtcCxbcFNyY0RzdF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcD1wU3JjRHN0WzBdCi0gICAgICBBREQgICAgICAgICAgICAgdGVtcCx0ZW1wLHRlbXBQcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcD1wU3JjRHN0WzBdK3RlbXBQcmVkCi0gICAgICBTU0FUMTYgICAgICAgICAgdGVtcCwjMTIsdGVtcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY2xpcCB0ZW1wIHRvIFstMjA0OCwyMDQ3XQotICAgICAgU01VTEJCICAgICAgICAgIGRjQ29sQnVmZkNvZWZmLHRlbXAsZGNTY2FsZXIgICAgICAgICAgICAgICAgICAgOy8vIHRlbXAxPWNsaXBwZWQocFNyY0RzdFswXSkqZGNTY2FsZXIgICAgICAgICAgIAotICAgICAgTV9MRFIgICAgICAgICAgIEFDUHJlZEZsYWcsQUNQcmVkRmxhZ29uU3RhY2sKLSAgICAgIFNUUkggICAgICAgICAgICBkY0NvbEJ1ZmZDb2VmZixbcFByZWRCdWZDb2xdICAgICAgCi0gICAgICAKLQotICAgICAgIDsvLyBBQyBQcmVkaWN0aW9uCi0gICAgICAKLSAgICAgIE1fTERSICAgICAgICAgICBwcmVkUVAscHJlZFFQb25TdGFjawotICAgICAgCi0gICAgICBDTVAgICAgICAgICAgICAgQUNQcmVkRmxhZywjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgaWYgdGhlIEFDIHByZWRpY3Rpb24gZmxhZyBpcyBzZXQgb3Igbm90Ci0gICAgICBCTkUgICAgICAgICAgICAgRXhpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgbm90IHNldCBFeGl0Ci0gICAgICBDTVAgICAgICAgICAgICAgcHJlZERpciwjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgdGhlIFByZWRpY3Rpb24gZGlyZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIExEUiAgICAgICAgICAgICBwcmVkQ29lZmZUYWJsZSwgPWFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MzMiAgIDsvLyBMb2FkaW5nIHRoZSB0YWJsZSB3aXRoIGVudHJpZXMgMHgxZmZmZi8oMSB0byA2MykgCi0gICAgICBNT1YgICAgICAgICAgICAgQ29uc3QsIzQKLSAgICAgIE1VTCAgICAgICAgICAgICBjdXJRUCxjdXJRUCxDb25zdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjdXJRUD00KmN1clFQCi0gICAgICBWRFVQICAgICAgICAgICAgZFByZWRRUDAscHJlZFFQCi0gICAgICBMRFIgICAgICAgICAgICAgdGVtcDIsW3ByZWRDb2VmZlRhYmxlLGN1clFQXSAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcD0weDFmZmZmL2N1clFQCi0gICAgICBWRFVQICAgICAgICAgICAgcUNvZWZmVGFiLHRlbXAyCi0gICAgICBCTkUgICAgICAgICAgICAgSG9yaXpvbnRhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgdGhlIFByZWRpY3Rpb24gZGlyZWN0aW9uIGlzIGhvcml6b250YWwgYnJhbmNoIHRvIEhvcml6b250YWwKLSAgICAgIAotICAgICAKLSAgICAgIAotICAgICAgOy8vIFZlcnRpY2FsCi0gICAgICA7Ly9DYWxjdWxhdGluZyB0ZW1wUHJlZAotCi0gICAgICBWTEQxICAgICAgICAgICAge2RQcmVkUm93QnVmMCxkUHJlZFJvd0J1ZjF9LFtwUHJlZEJ1ZlJvd10gICAgICA7Ly8gTG9hZGluZyBwUHJlZEJ1ZlJvd1tpXTppPTAgdDAgNwotICAgICAgCi0gICAgICBWTVVMTCAgICAgICAgICAgcXRlbXAxLGRQcmVkUm93QnVmMCxkUHJlZFFQMCAgICAgICAgICAgICAgICAgICA7Ly9xdGVtcDFbaV09cFByZWRCdWZSb3dbaV0qZFByZWRRUFtpXTogaT0wIHQwIDMKLSAgICAgIFZNVUwgICAgICAgICAgICBxdGVtcFByZWQxLHF0ZW1wMSxxQ29lZmZUYWIgICAgICAgICAgICAgICAgICAgIDsvL3F0ZW1wUHJlZDFbaV09cFByZWRCdWZSb3dbaV0qZFByZWRRUFtpXSoweDFmZmZmL2N1clFQIDogaT0wIHQwIDMKLSAgICAgIAotICAgICAgVk1VTEwgICAgICAgICAgIHF0ZW1wMSxkUHJlZFJvd0J1ZjEsZFByZWRRUDAgICAgICAgICAgICAgICAgICAgOy8vcXRlbXAxW2ldPXBQcmVkQnVmUm93W2ldKmRQcmVkUVBbaV0gOiBpPTQgdDAgNyAgICAgIAotCi0gICAgICBWUlNIUiAgICAgICAgICAgcXRlbXBQcmVkMSxxdGVtcFByZWQxLCMxNyAgICAgICAgICAgICAgICAgICAgICA7Ly9xdGVtcFByZWQxW2ldPXJvdW5kKHBQcmVkQnVmUm93W2ldKmRQcmVkUVBbaV0vY3VyUVApIDogaT0wIHQwIDMKLSAgICAgIFZTSFJOICAgICAgICAgICBkUHJlZFFQMSxxdGVtcFByZWQxLCMwICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBuYXJyb3cgcXRlbXBQcmVkMVtpXSB0byAxNiBiaXRzCi0gICAgICAKLSAgICAgIAotICAgICAgVk1VTCAgICAgICAgICAgIHF0ZW1wUHJlZDEscXRlbXAxLHFDb2VmZlRhYiAgICAgICAgICAgICAgICAgICAgOy8vcXRlbXBQcmVkMVtpXT1wUHJlZEJ1ZlJvd1tpXSpkUHJlZFFQW2ldKjB4MWZmZmYvY3VyUVAgOiBpPTQgdDAgNwotICAgICAgVlJTSFIgICAgICAgICAgIHF0ZW1wUHJlZDEscXRlbXBQcmVkMSwjMTcgICAgICAgICAgICAgICAgICAgICAgOy8vcXRlbXBQcmVkMVtpXT1yb3VuZChwUHJlZEJ1ZlJvd1tpXSpkUHJlZFFQW2ldL2N1clFQKSAgOiBpPTQgdDAgNwotICAgICAgVkxEMSAgICAgICAgICAgIHtkdGVtcDAsZHRlbXAxfSxbcFNyY0RzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vTG9hZGluZyBwU3JjRHN0W2ldIDogaT0wIHRvIDcKLSAgICAgIFZTSFJOICAgICAgICAgICBkdGVtcFByZWQxLHF0ZW1wUHJlZDEsIzAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBuYXJyb3cgcXRlbXBQcmVkMVtpXSB0byAxNiBiaXRzCi0gICAgICBWTU9WICAgICAgICAgICAgZHRlbXBQcmVkMCxkUHJlZFFQMQotICAgICAgCi0gICAgICA7Ly91cGRhdGluZyBzb3VyY2UgYW5kIHJvdyBwcmVkaWN0aW9uIGJ1ZmZlciBjb250ZW50cyAgICAgIAotICAgICAgVkFERCAgICAgICAgICAgIHF0ZW1wLHF0ZW1wLHF0ZW1wUHJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vcFNyY0RzdFtpXT1wU3JjRHN0W2ldK3F0ZW1wUHJlZFtpXTogaT0wIHRvIDcgCi0gICAgICBWUVNITCAgICAgICAgICAgcXRlbXAscXRlbXAsIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9DbGlwIHRvIFstMjA0OCwyMDQ3XQotICAgICAgTERSSCAgICAgICAgICAgIGRjUm93YnVmQ29lZmYsW3BQcmVkQnVmUm93XSAgICAgICAgICAgICAgICAgICAgOy8vTG9hZGluZyBEYyBWYWx1ZSBvZiBSb3cgUHJlZGljdGlvbiBidWZmZXIKLSAgICAgIFZTSFIgICAgICAgICAgICBxdGVtcCxxdGVtcCwjNAotICAgICAgCi0gICAgICBWU1QxICAgICAgICAgICAge2R0ZW1wMCxkdGVtcDF9LFtwU3JjRHN0XSAgICAgICAgICAgICAgICAgICAgICA7Ly9zdG9yaW5nIGJhY2sgdGhlIHVwZGF0ZWQgdmFsdWVzIAotICAgICAgVlNUMSAgICAgICAgICAgIHtkdGVtcDAsZHRlbXAxfSxbcFByZWRCdWZSb3ddICAgICAgICAgICAgICAgICAgOy8vc3RvcmluZyBiYWNrIHRoZSB1cGRhdGVkIHJvdyBwcmVkaWN0aW9uIHZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIFNUUkggICAgICAgICAgICBkY1Jvd2J1ZkNvZWZmLFtwUHJlZEJ1ZlJvd10gICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yaW5nIHRoZSB1cGRhdGVkIERDIFJvdyBQcmVkaWN0aW9uIGNvZWZmCi0gICAgICAKLSAgICAgIEIgICAgICAgICAgICAgICBFeGl0Ci0KLUhvcml6b250YWwKLQotICAgICAgOy8vIENhbGN1bGF0aW5nIFRlbXBwcmVkCi0KLSAgICAgICAgICAgIAotCi0gICAgICBWTEQxICAgICAgICAgICAge2RQcmVkUm93QnVmMCxkUHJlZFJvd0J1ZjF9LFtwUHJlZEJ1ZkNvbF0gICAgICA7Ly8gTG9hZGluZyBwUHJlZEJ1ZkNvbFtpXTppPTAgdDAgNwotICAgICAgVk1VTEwgICAgICAgICAgIHF0ZW1wMSxkUHJlZFJvd0J1ZjAsZFByZWRRUDAgICAgICAgICAgICAgICAgICAgOy8vcXRlbXAxW2ldPXBQcmVkQnVmQ29sW2ldKmRQcmVkUVBbaV06IGk9MCB0MCAzCi0gICAgICBWTVVMICAgICAgICAgICAgcXRlbXBQcmVkMSxxdGVtcDEscUNvZWZmVGFiICAgICAgICAgICAgICAgICAgICA7Ly9xdGVtcFByZWQxW2ldPXBQcmVkQnVmQ29sW2ldKmRQcmVkUVBbaV0qMHgxZmZmZi9jdXJRUCA6IGk9MCB0MCAzCi0gICAgICAKLSAgICAgIFZNVUxMICAgICAgICAgICBxdGVtcDEsZFByZWRSb3dCdWYxLGRQcmVkUVAwICAgICAgICAgICAgICAgICAgIDsvL3F0ZW1wMVtpXT1wUHJlZEJ1ZkNvbFtpXSpkUHJlZFFQW2ldIDogaT00IHQwIDcgICAgICAKLQotICAgICAgVlJTSFIgICAgICAgICAgIHF0ZW1wUHJlZDEscXRlbXBQcmVkMSwjMTcgICAgICAgICAgICAgICAgICAgICAgOy8vcXRlbXBQcmVkMVtpXT1yb3VuZChwUHJlZEJ1ZkNvbFtpXSpkUHJlZFFQW2ldL2N1clFQKSA6IGk9MCB0MCAzCi0gICAgICBWU0hSTiAgICAgICAgICAgZFByZWRRUDEscXRlbXBQcmVkMSwjMCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gbmFycm93IHF0ZW1wUHJlZDFbaV0gdG8gMTYgYml0cwotICAgICAgCi0gICAgICAKLSAgICAgIFZNVUwgICAgICAgICAgICBxdGVtcFByZWQxLHF0ZW1wMSxxQ29lZmZUYWIgICAgICAgICAgICAgICAgICAgIDsvL3F0ZW1wUHJlZDFbaV09cFByZWRCdWZDb2xbaV0qZFByZWRRUFtpXSoweDFmZmZmL2N1clFQIDogaT00IHQwIDcKLSAgICAgIAotICAgICAgTU9WICAgICAgICAgICAgIHRlbXBwUHJlZENvbEJ1ZixwUHJlZEJ1ZkNvbAotICAgICAgVlJTSFIgICAgICAgICAgIHF0ZW1wUHJlZDEscXRlbXBQcmVkMSwjMTcgICAgICAgICAgICAgICAgICAgICAgOy8vcXRlbXBQcmVkMVtpXT1yb3VuZChwUHJlZEJ1ZkNvbFtpXSpkUHJlZFFQW2ldL2N1clFQKSAgOiBpPTQgdDAgNwotICAgICAgVkxENCAgICAgICAgICAgIHtkdGVtcDAsZHRlbXAxLGR0ZW1wMixkdGVtcDN9LFtwU3JjRHN0XSAgICAgICAgOy8vIExvYWRpbmcgY29lZmZpY2llbnRzIEludGVybGVhdmluZyBieSA0Ci0gICAgICBWU0hSTiAgICAgICAgICAgZHRlbXBQcmVkMSxxdGVtcFByZWQxLCMwICAgICAgICAgICAgICAgICAgICAgICA7Ly8gbmFycm93IHF0ZW1wUHJlZDFbaV0gdG8gMTYgYml0cwotICAgICAgVk1PViAgICAgICAgICAgIGR0ZW1wUHJlZDAsZFByZWRRUDEKLSAgICAgIAotICAgICAgOy8vIFVwZGF0aW5nIHNvdXJjZSBhbmQgY29sdW1uIHByZWRpY3Rpb24gYnVmZmVyIGNvbnRlbnRzICAgICAKLSAgICAgIEFERCAgICAgICAgICAgICB0ZW1wMixwU3JjRHN0LCMzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIFZMRDQgICAgICAgICAgICB7ZHRlbXA0LGR0ZW1wNSxkdGVtcDYsZHRlbXA3fSxbdGVtcDJdICAgICAgICAgIDsvLyBMb2FkaW5nIG5leHQgMTYgY29lZmZpY2llbnRzIEludGVybGVhdmluZyBieSA0Ci0gICAgICBWVVpQICAgICAgICAgICAgZHRlbXAwLGR0ZW1wNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSW50ZXJsZWF2aW5nIGJ5IDgKLSAgICAgIFZBREQgICAgICAgICAgICBkdGVtcDAsZHRlbXAwLGR0ZW1wUHJlZDAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBBZGRpbmcgdGVtcFByZWQgdG8gY29lZmZzCi0gICAgICBWUVNITCAgICAgICAgICAgZHRlbXAwLGR0ZW1wMCwjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ2xpcCB0byBbLTIwNDgsMjA0N10KLSAgICAgIFZTSFIgICAgICAgICAgICBkdGVtcDAsZHRlbXAwLCM0Ci0gICAgICBWU1QxICAgICAgICAgICAge2R0ZW1wMH0sW3BQcmVkQnVmQ29sXSEgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVXBkYXRpbmcgUHJpZGljdGlvbiBjb2x1bW4gYnVmZmVyCi0gICAgICBWWklQICAgICAgICAgICAgZHRlbXAwLGR0ZW1wNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gZGVpbnRlcmxlYXZpbmcKLSAgICAgIFZTVDQgICAgICAgICAgICB7ZHRlbXAwLGR0ZW1wMSxkdGVtcDIsZHRlbXAzfSxbcFNyY0RzdF0gICAgICAgIDsvLyBVcGRhdGluZyBzb3VyY2UgY29lZmZzICAgICAgICAgCi0gICAgICBWU1Q0ICAgICAgICAgICAge2R0ZW1wNCxkdGVtcDUsZHRlbXA2LGR0ZW1wN30sW3RlbXAyXSEKLSAgICAgIAotICAgICAgTU9WICAgICAgICAgICAgIHRlbXAxLHRlbXAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgVkxENCAgICAgICAgICAgIHtkdGVtcDAsZHRlbXAxLGR0ZW1wMixkdGVtcDN9LFt0ZW1wMl0hICAgICAgICAgOy8vIExvYWRpbmcgIGNvZWZmaWNpZW50cyBJbnRlcmxlYXZpbmcgYnkgNAotICAgICAgCi0gICAgICBWTEQ0ICAgICAgICAgICAge2R0ZW1wNCxkdGVtcDUsZHRlbXA2LGR0ZW1wN30sW3RlbXAyXQotICAgICAgVlVaUCAgICAgICAgICAgIGR0ZW1wMCxkdGVtcDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEludGVybGVhdmluZyBieSA4Ci0gICAgICBWQUREICAgICAgICAgICAgZHRlbXAwLGR0ZW1wMCxkdGVtcFByZWQxCi0gICAgICBWUVNITCAgICAgICAgICAgZHRlbXAwLGR0ZW1wMCwjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ2xpcCB0byBbLTIwNDgsMjA0N10KLSAgICAgIFZTSFIgICAgICAgICAgICBkdGVtcDAsZHRlbXAwLCM0Ci0gICAgICBWU1QxICAgICAgICAgICAge2R0ZW1wMH0sW3BQcmVkQnVmQ29sXSEKLSAgICAgIFZaSVAgICAgICAgICAgICBkdGVtcDAsZHRlbXA0Ci0gICAgICBWU1Q0ICAgICAgICAgICAge2R0ZW1wMCxkdGVtcDEsZHRlbXAyLGR0ZW1wM30sW3RlbXAxXQotICAgICAgU1RSSCAgICAgICAgICAgIGRjQ29sQnVmZkNvZWZmLFt0ZW1wcFByZWRDb2xCdWZdIAotICAgICAgVlNUNCAgICAgICAgICAgIHtkdGVtcDQsZHRlbXA1LGR0ZW1wNixkdGVtcDd9LFt0ZW1wMl0KLSAgICAgIAotRXhpdAotCi0gICAgICBTVFJIICAgICAgICAgICAgdGVtcCxbcFNyY0RzdF0KLSAgICAgICAgICAKLSAKLSAgICAgIE1PViAgICAgICAgICAgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIgCi0gCi0gICAgICBNX0VORAotICAgICAgRU5ESUYKLQotCi0gICAgICAgRU5ECi0KLQotICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50ZXJfSV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50ZXJfSV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NDU3MWYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludGVyX0lfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07LyoqCi07ICogCi07ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX1F1YW50SW52SW50ZXJfSV9zLnMKLTsgKiBPcGVuTUFYIERMOiB2MS4wLjIKLTsgKiBSZXZpc2lvbjogICAxMjI5MAotOyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOyAqIAotOyAqIAotOyAqIAotOyAqCi07ICogRGVzY3JpcHRpb246IAotOyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGludGVyIHJlY29uc3RydWN0aW9uCi07ICogCi07ICoKLTsgKgotOyAqCi07ICoKLTsgKiBGdW5jdGlvbjogb214VkNNNFAyX1F1YW50SW52SW50ZXJfSQotOyAqCi07ICogRGVzY3JpcHRpb246Ci07ICogUGVyZm9ybXMgaW52ZXJzZSBxdWFudGl6YXRpb24gb24gaW50cmEvaW50ZXIgY29kZWQgYmxvY2suCi07ICogVGhpcyBmdW5jdGlvbiBzdXBwb3J0cyBiaXRzX3Blcl9waXhlbCA9IDguIE1pc21hdGNoIGNvbnRyb2wKLTsgKiBpcyBwZXJmb3JtZWQgZm9yIHRoZSBmaXJzdCBNUEVHLTQgbW9kZSBpbnZlcnNlIHF1YW50aXphdGlvbiBtZXRob2QuCi07ICogVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIGNsaXBwZWQgdG8gdGhlIHJhbmdlOiBbLTIwNDgsIDIwNDddLgotOyAqIE1pc21hdGNoIGNvbnRyb2wgaXMgcGVyZm9ybWVkIGZvciB0aGUgZmlyc3QgaW52ZXJzZSBxdWFudGl6YXRpb24gbWV0aG9kLgotOyAqCi07ICogUmVtYXJrczoKLTsgKgotOyAqIFBhcmFtZXRlcnM6Ci07ICogW2luXSBwU3JjRHN0ICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGlucHV0IChxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrLiBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4KLTsgKiBbaW5dIFFQICAgICAgICAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGlzZXJfc2NhbGUpCi07ICogW2luXSB2aWRlb0NvbXAgICAgICAoSW50cmEgdmVyc2lvbiBvbmx5LikgVmlkZW8gY29tcG9uZW50IHR5cGUgb2YgdGhlCi07ICogICAgICAgICAgICAgICAgICBjdXJyZW50IGJsb2NrLiBUYWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyBmbGFnczoKLTsgKiAgICAgICAgICAgICAgICAgIE9NWF9WQ19MVU1JTkFOQ0UsIE9NWF9WQ19DSFJPTUlOQU5DRSwKLTsgKiAgICAgICAgICAgICAgICAgIE9NWF9WQ19BTFBIQS4KLTsgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgYSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOwotOyAqICAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIG1vZGUsCi07ICogICAgICAgICAgICAgICAgICBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbmxpbmVhciBpbnRyYSBEQyBtb2RlLgotOyAqIFtvdXRdICAgIHBTcmNEc3QgICAgICBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKGRlcXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jay4gIE11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLgotOyAqCi07ICogUmV0dXJuIFZhbHVlOgotOyAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgotOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cwotOyAqICAgIC0gSWYgcFNyY0RzdCBpcyBOVUxMIG9yIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuCi07ICogICAgICBvcgotOyAqICAgIC0gSWYgUVAgPD0gMC4KLTsgKiAgICAgIG9yCi07ICogICAgLSB2aWRlb0NvbXAgaXMgbm9uZSBvZiBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UgYW5kIE9NWF9WQ19BTFBIQS4KLTsgKgotOyAqLwotCi0gICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgSU5DTFVERSBhcm1DT01NX3MuaAotCi0gICBNX1ZBUklBTlRTIENvcnRleEE4Ci0KLSAgICAgSUYgQ29ydGV4QTgKLSAgICAgCi0gICAgIAotOy8vSW5wdXQgQXJndW1lbnRzCi1wU3JjRHN0ICAgICAgICAgICAgUk4gMAotUVAgICAgICAgICAgICAgICAgIFJOIDEKLSAgICAgCi0KLTsvL0xvY2FsIFZhcmlhYmxlcwotQ291bnQgICAgICAgICAgICAgIFJOIDMKLWRvdWJsZVFQICAgICAgICAgICBSTiA0Ci1SZXR1cm4gICAgICAgICAgICAgUk4gMAotOy8vIE5lb24gcmVnaXN0ZXJzCi0KLQotZFFQMTAgICAgICAgICAgICAgIEROIEQwLlMzMlswXQotcVFQMSAgICAgICAgICAgICAgIFFOIFEwLlMzMgotCi1kUVAxICAgICAgICAgICAgICAgRE4gRDAuUzE2Ci1kTWludXNRUDEgICAgICAgICAgRE4gRDEuUzE2Ci0KLWRDb2VmZjAgICAgICAgICAgICBETiBEMi5TMTYKLWRDb2VmZjEgICAgICAgICAgICBETiBEMy5TMTYgICAKLQotcVJlc3VsdDAgICAgICAgICAgIFFOIFEzLlMzMgotZFJlc3VsdDAgICAgICAgICAgIEROIEQ3LlMxNgotcVNpZ24wICAgICAgICAgICAgIFFOIFEzLlMzMgotZFNpZ24wICAgICAgICAgICAgIEROIEQ2LlMxNgotCi1xUmVzdWx0MSAgICAgICAgICAgUU4gUTQuUzMyCi1kUmVzdWx0MSAgICAgICAgICAgRE4gRDguUzE2Ci1xU2lnbjEgICAgICAgICAgICAgUU4gUTQuUzMyCi1kU2lnbjEgICAgICAgICAgICAgRE4gRDguUzE2Ci0KLWQyUVAwICAgICAgICAgICAgICBETiBEMTAuUzMyWzBdCi1xMlFQMCAgICAgICAgICAgICAgUU4gUTUuUzMyCi1kMlFQICAgICAgICAgICAgICAgRE4gRDEwLlMxNgotCi1kWmVybzAgICAgICAgICAgICAgRE4gRDExLlMxNgotZFplcm8xICAgICAgICAgICAgIEROIEQxMi5TMTYKLWRDb25zdDAgICAgICAgICAgICBETiBEMTMuUzE2Ci0KLSAgICAKLSAgICAgTV9TVEFSVCBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JLHI0LGQxMwotICAgICAKLSAgICAgICAgIAotICAgICAgICAgCi0gICAgICAgICBBREQgICAgICBkb3VibGVRUCxRUCxRUCAgICAgICAgICAgICAgICAgICA7Ly8gZG91YmxlUVA9IDIqUVAKLSAgICAgICAgIFZNT1YgICAgIGQyUVAwLGRvdWJsZVFQCi0gICAgICAgICBWRFVQICAgICBxMlFQMCxkMlFQMCAgICAgICAgICAgICAgICAgICAgICA7Ly8gTW92ZSBkb3VibGVRUCBpbiB0byBhIHNjYWxhcgotICAgICAgICAgVFNUICAgICAgUVAsIzEgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICBWTEQxICAgICB7ZENvZWZmMCxkQ29lZmYxfSxbcFNyY0RzdF0gICAgICA7Ly8gTG9hZCBmaXJzdCA4IHZhbHVlcyB0byBDb2VmZjAsQ29lZmYxCi0gICAgICAgICBTVUJFUSAgICBRUCxRUCwjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgIFZNT1YgICAgIGRRUDEwLFFQICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBRUCBpcyBldmVuIHRoZW4gUVAxPVFQLTEgZWxzZSBRUDE9UVAgICAgIAotICAgICAgICAgTU9WICAgICAgQ291bnQsIzY0Ci0gICAgICAgICBWRFVQICAgICBxUVAxLGRRUDEwICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRHVwbGljYXRlIHRlbXBSZXN1bHQgd2l0aCBRUDEKLSAgICAgICAgIFZTSFJOICAgIGQyUVAscTJRUDAsIzAKLSAgICAgICAgIFZFT1IgICAgIGRDb25zdDAsZENvbnN0MCxkQ29uc3QwCi0gICAgICAgICBWU0hSTiAgICBkUVAxLHFRUDEsIzAgICAgICAgICAgICAgICAgICAgICA7Ly8gUVAxIHRydW5jYXRlZCB0byAxNiBiaXRzCi0gICAgICAgICBWU1VCICAgICBkTWludXNRUDEsZENvbnN0MCxkUVAxICAgICAgICAgICA7Ly8gZE1pbnVzUVAxPS1RUDEKLQotTG9vcCAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAKLSAgICAgICAgOy8vUGVyZm9ybWluZyBJbnZlcnNlIFF1YW50aXphdGlvbgotICAgICAgICAgCi0gICAgICAgICBWQ0xUICAgICBkU2lnbjAsZENvZWZmMCwgIzAgICAgICAgICAgICAgICA7Ly8gQ29tcGFyZSBDb2VmZmljaWVudCAwIGFnYWluc3QgMAotICAgICAgICAgVkNMVCAgICAgZFNpZ24xLGRDb2VmZjEsICMwICAgICAgICAgICAgICAgOy8vIENvbXBhcmUgQ29lZmZpY2llbnQgMSBhZ2FpbnN0IDAKLSAgICAgICAgIFZDRVEgICAgIGRaZXJvMCxkQ29lZmYwLCMwICAgICAgICAgICAgICAgIDsvLyBDb21wYXJlIENvZWZmaWNpZW50IDAgYWdhaW5zdCB6ZXJvCi0gICAgICAgICBWQlNMICAgICBkU2lnbjAsZE1pbnVzUVAxLGRRUDEgICAgICAgICAgICA7Ly8gZFNpZ24wID0gLVFQMSBpZiBDb2VmZjA8IDAgZWxzZSBRUDEKLSAgICAgICAgIFZDRVEgICAgIGRaZXJvMSxkQ29lZmYxLCMwICAgICAgICAgICAgICAgIDsvLyBDb21wYXJlIENvZWZmaWNpZW50IDEgYWdhaW5zdCB6ZXJvCi0gICAgICAgICBWQlNMICAgICBkU2lnbjEsZE1pbnVzUVAxLGRRUDEgICAgICAgICAgICA7Ly8gZFNpZ24xID0gLVFQMSBpZiBDb2VmZjE8IDAgZWxzZSBRUDEKLSAgICAgICAgIFZNT1ZMICAgIHFTaWduMCxkU2lnbjAgICAgICAgICAgICAgICAgICAgIDsvLyBTaWduIGV4dGVuZCBxU2lnbjAgdG8gMzIgYml0cwotICAgICAgICAgVk1PVkwgICAgcVNpZ24xLGRTaWduMQotICAgICAgICAgVk1MQUwgICAgcVJlc3VsdDAsZENvZWZmMCxkMlFQICAgICAgICAgICAgOy8vIHFSZXN1bHQwW2ldPSBxQ29lZmYwW2ldK3FDb2VmZjBbaV0qKC0yKSBpZiBDb2VmZiA8MCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBxUmVzdWx0MFtpXT0gcUNvZWZmMFtpXSAgICAgICAgICAgICAgICAgaWYgQ29lZmYgPj0wIAotICAgICAgICAgVk1MQUwgICAgcVJlc3VsdDEsZENvZWZmMSxkMlFQICAgICAgICAgICAgOy8vIHFSZXN1bHQxW2ldPSBxQ29lZmYxW2ldK3FDb2VmZjFbaV0qKC0yKSBpZiBDb2VmZiA8MCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBxUmVzdWx0MVtpXT0gcUNvZWZmMVtpXSAgICAgICAgICAgICAgICAgaWYgQ29lZmYgPj0wIAotICAgICAgICAgOy8vIENsaXAgUmVzdWx0IHRvIFstMjA0OCwyMDQ3XSAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgCi0gICAgICAgICBWUVNITCAgICBxUmVzdWx0MCxxUmVzdWx0MCwjMjAgICAgICAgICAgICA7Ly8gY2xpcCB0byBbLTIwNDgsMjA0N10KLSAgICAgICAgIFZRU0hMICAgIHFSZXN1bHQxLHFSZXN1bHQxLCMyMAotICAgICAgICAgICAgICAgICAKLSAgICAgICAgIFZTSFIgICAgIHFSZXN1bHQwLHFSZXN1bHQwLCM0ICAKLSAgICAgICAgIFZTSFIgICAgIHFSZXN1bHQxLHFSZXN1bHQxLCM0Ci0gICAgICAgICBWU0hSTiAgICBkUmVzdWx0MCxxUmVzdWx0MCwjMTYgICAgICAgICAgICA7Ly8gTmFycm93IHRoZSBjbGlwcGVkIFZhbHVlIHRvIEhhbGZ3b3JkCi0gICAgICAgICBWU0hSTiAgICBkUmVzdWx0MSxxUmVzdWx0MSwjMTYgCi0gICAgICAgICBWQklUICAgICBkUmVzdWx0MCxkQ29uc3QwLGRaZXJvMCAgCi0gICAgICAgICBWQklUICAgICBkUmVzdWx0MSxkQ29uc3QwLGRaZXJvMSAgICAgCi0gICAgICAgICAKLSAgICAgICAgIFZTVDEgICAgIHtkUmVzdWx0MCxkUmVzdWx0MX0sW3BTcmNEc3RdISAgIDsvLyBTdG9yZSB0aGUgcmVzdWx0Ci0gICAgICAgICBTVUJTICAgICBDb3VudCxDb3VudCwjOAotICAgICAgICAgVkxEMSAgICAge2RDb2VmZjAsZENvZWZmMX0sW3BTcmNEc3RdCi0gICAgICAgICAKLSAgICAgICAgIAotICAgICAgICAgQkdUICAgICAgTG9vcAotCi0gICAgICAgICBNT1YgICAgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIKLQotCi0gICAgICAgICBNX0VORAotICAgICAgICAgRU5ESUYKLSAgICAgICAgIAotCi0gICAgICAgIEVORAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50cmFfSV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50cmFfSV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYTdmZDQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludHJhX0lfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07LyoqCi07ICogCi07ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX1F1YW50SW52SW50cmFfSV9zLnMKLTsgKiBPcGVuTUFYIERMOiB2MS4wLjIKLTsgKiBSZXZpc2lvbjogICAxMjI5MAotOyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOyAqIAotOyAqIAotOyAqIAotOyAqCi07ICogRGVzY3JpcHRpb246IAotOyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGludGVyIHJlY29uc3RydWN0aW9uCi07ICogCi07ICoKLTsgKgotOyAqCi07ICoKLTsgKiAKLTsgKiBGdW5jdGlvbjogb214VkNNNFAyX1F1YW50SW52SW50cmFfSQotOyAqCi07ICogRGVzY3JpcHRpb246Ci07ICogUGVyZm9ybXMgaW52ZXJzZSBxdWFudGl6YXRpb24gb24gaW50cmEvaW50ZXIgY29kZWQgYmxvY2suCi07ICogVGhpcyBmdW5jdGlvbiBzdXBwb3J0cyBiaXRzX3Blcl9waXhlbCA9IDguIE1pc21hdGNoIGNvbnRyb2wKLTsgKiBpcyBwZXJmb3JtZWQgZm9yIHRoZSBmaXJzdCBNUEVHLTQgbW9kZSBpbnZlcnNlIHF1YW50aXphdGlvbiBtZXRob2QuCi07ICogVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIGNsaXBwZWQgdG8gdGhlIHJhbmdlOiBbLTIwNDgsIDIwNDddLgotOyAqIE1pc21hdGNoIGNvbnRyb2wgaXMgcGVyZm9ybWVkIGZvciB0aGUgZmlyc3QgaW52ZXJzZSBxdWFudGl6YXRpb24gbWV0aG9kLgotOyAqCi07ICogUmVtYXJrczoKLTsgKgotOyAqIFBhcmFtZXRlcnM6Ci07ICogW2luXSAgICBwU3JjRHN0ICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnB1dCAocXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jay4gTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuCi07ICogW2luXSAgICBRUCAgICAgICAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXNlcl9zY2FsZSkKLTsgKiBbaW5dICAgIHZpZGVvQ29tcCAgICAgICAgICAoSW50cmEgdmVyc2lvbiBvbmx5LikgVmlkZW8gY29tcG9uZW50IHR5cGUgb2YgdGhlCi07ICogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYmxvY2suIFRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZsYWdzOgotOyAqICAgICAgICAgICAgICAgICAgICBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UsCi07ICogICAgICAgICAgICAgICAgICAgIE9NWF9WQ19BTFBIQS4KLTsgKiBbaW5dICAgIHNob3J0VmlkZW9IZWFkZXIgIGEgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsKLTsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgbW9kZSwKLTsgKiAgICAgICAgICAgICAgICAgICAgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub25saW5lYXIgaW50cmEgREMgbW9kZS4KLTsgKiBbb3V0XSAgICBwU3JjRHN0ICAgICAgICBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKGRlcXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jay4gIE11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLgotOyAqCi07ICogUmV0dXJuIFZhbHVlOgotOyAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgotOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cwotOyAqICAgIC0gICAgSWYgcFNyY0RzdCBpcyBOVUxMIG9yIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuCi07ICogICAgICBvcgotOyAqICAgIC0gSWYgUVAgPD0gMC4KLTsgKiAgICAgIG9yCi07ICogICAgLSB2aWRlb0NvbXAgaXMgbm9uZSBvZiBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UgYW5kIE9NWF9WQ19BTFBIQS4KLTsgKgotIAotCi0gICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgCi0gICBNX1ZBUklBTlRTIENvcnRleEE4Ci0gICAKLSAgIAotICAgSU1QT1JUICAgICAgICBhcm1WQ000UDJfRENTY2FsZXIKLSAKLSAgICAgSUYgQ29ydGV4QTgKLSAgICAgCi0gICAgIAotOy8vSW5wdXQgQXJndW1lbnRzCi1wU3JjRHN0ICAgICAgICAgICAgUk4gMAotUVAgICAgICAgICAgICAgICAgIFJOIDEKLXZpZGVvQ29tcCAgICAgICAgICBSTiAyCi1zaG9ydFZpZGVvSGVhZGVyICAgUk4gMwotICAgICAKLQotOy8vTG9jYWwgVmFyaWFibGVzCi0KLWRjU2NhbGVyICAgICAgICAgICBSTiA0Ci10ZW1wICAgICAgICAgICAgICAgUk4gMTQKLWluZGV4ICAgICAgICAgICAgICBSTiA1Ci0KLQotQ291bnQgICAgICAgICAgICAgIFJOIDUKLWRvdWJsZVFQICAgICAgICAgICBSTiA0Ci1SZXR1cm4gICAgICAgICAgICAgUk4gMAotCi0KLTsvLyBOZW9uIHJlZ2lzdGVycwotCi0KLWRRUDEwICAgICAgICAgICAgICBETiBEMC5TMzJbMF0KLXFRUDEgICAgICAgICAgICAgICBRTiBRMC5TMzIKLQotZFFQMSAgICAgICAgICAgICAgIEROIEQwLlMxNgotZE1pbnVzUVAxICAgICAgICAgIEROIEQxLlMxNgotCi1kQ29lZmYwICAgICAgICAgICAgRE4gRDIuUzE2Ci1kQ29lZmYxICAgICAgICAgICAgRE4gRDMuUzE2ICAgCi0KLXFSZXN1bHQwICAgICAgICAgICBRTiBRMy5TMzIKLWRSZXN1bHQwICAgICAgICAgICBETiBENy5TMTYKLXFTaWduMCAgICAgICAgICAgICBRTiBRMy5TMzIKLWRTaWduMCAgICAgICAgICAgICBETiBENi5TMTYKLQotcVJlc3VsdDEgICAgICAgICAgIFFOIFE0LlMzMgotZFJlc3VsdDEgICAgICAgICAgIEROIEQ4LlMxNgotcVNpZ24xICAgICAgICAgICAgIFFOIFE0LlMzMgotZFNpZ24xICAgICAgICAgICAgIEROIEQ4LlMxNgotCi1kMlFQMCAgICAgICAgICAgICAgRE4gRDEwLlMzMlswXQotcTJRUDAgICAgICAgICAgICAgIFFOIFE1LlMzMgotZDJRUCAgICAgICAgICAgICAgIEROIEQxMC5TMTYKLQotZFplcm8wICAgICAgICAgICAgIEROIEQxMS5TMTYKLWRaZXJvMSAgICAgICAgICAgICBETiBENC5TMTYKLWRDb25zdDAgICAgICAgICAgICBETiBENS5TMTYKLQotCi0KLQotICAgICAKLSAgICAgCi0gICAgIE1fU1RBUlQgb214VkNNNFAyX1F1YW50SW52SW50cmFfSSxyNSxkMTEKLQotCi0gICAgICAgIDsvLyBQZXJmb3JtIEludmVyc2UgUXVhbnRpemF0aW9uIGZvciBEQyBjb2VmZmljaWVudAotCi0gICAgICAgIFRFUSAgICAgICBzaG9ydFZpZGVvSGVhZGVyLCMwICAgICAgOy8vIFRlc3QgaWYgc2hvcnQgVmlkZW8gSGVhZGVyIGZsYWcgPTAgICAgICAgICAgICAgCi0gICAgICAgIE1PVk5FICAgICBkY1NjYWxlciwjOCAgICAgICAgICAgICAgOy8vIGlmIHNob3J0VmlkZW9IZWFkZXIgaXMgbm9uIHplcm8gZGNTY2FsZXI9OAotICAgICAgICBCTkUgICAgICAgY2FsRENWYWwKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICBpbmRleCwgPWFybVZDTTRQMl9EQ1NjYWxlcgotICAgICAgQUREICAgICAgIGluZGV4LGluZGV4LHZpZGVvQ29tcCxMU0wgIzUKLSAgICAgIExEUkIgICAgICBkY1NjYWxlcixbaW5kZXgsUVBdCi0KLSAgICAgICAgOy8vTV9DYWxEQ1NjYWxhciAgc2hvcnRWaWRlb0hlYWRlcix2aWRlb0NvbXAsIFFQCi0KLWNhbERDVmFsCi0KLSAgICAgICAgTERSSCAgICAgdGVtcCxbcFNyY0RzdF0KLSAgICAgICAgU01VTEJCICAgdGVtcCx0ZW1wLGRjU2NhbGVyICAgICAgIDsvLyBkY0NvZWZmID0gZGNTY2FsZXIgKiBRdWFudGl6ZWQgREMgY29lZmZpY2llbnQoZnJvbSBtZW1vcnkpCi0gICAgICAgIFNTQVQgICAgIHRlbXAsIzEyLHRlbXAgICAgICAgICAgICA7Ly8gU2F0dXJhdGluZyB0byAxMiBiaXRzCi0gICAgICAKLQotCi0gICAgICAgIDsvLyBQZXJmb3JtIEludmVyc2UgUXVhbnRpemF0aW9uIGZvciBBYyBDb2VmZmljaWVudHMKLSAgICAgCi0gICAgICAgICAKLSAgICAgICAgIAotICAgICAgICAgQUREICAgICAgZG91YmxlUVAsUVAsUVAgICAgICAgICAgICAgICAgICAgOy8vIGRvdWJsZVFQPSAyKlFQCi0gICAgICAgICBWTU9WICAgICBkMlFQMCxkb3VibGVRUAotICAgICAgICAgVkRVUCAgICAgcTJRUDAsZDJRUDAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1vdmUgZG91YmxlUVAgaW4gdG8gYSBzY2FsYXIKLSAgICAgICAgIFRTVCAgICAgIFFQLCMxICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgVkxEMSAgICAge2RDb2VmZjAsZENvZWZmMX0sW3BTcmNEc3RdICAgICAgOy8vIExvYWQgZmlyc3QgOCB2YWx1ZXMgdG8gQ29lZmYwLENvZWZmMQotICAgICAgICAgU1VCRVEgICAgUVAsUVAsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICBWTU9WICAgICBkUVAxMCxRUCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgUVAgaXMgZXZlbiB0aGVuIFFQMT1RUC0xIGVsc2UgUVAxPVFQICAgICAKLSAgICAgICAgIE1PViAgICAgIENvdW50LCM2NAotICAgICAgICAgVkRVUCAgICAgcVFQMSxkUVAxMCAgICAgICAgICAgICAgICAgICAgICAgOy8vIER1cGxpY2F0ZSB0ZW1wUmVzdWx0IHdpdGggUVAxCi0gICAgICAgICBWU0hSTiAgICBkMlFQLHEyUVAwLCMwCi0gICAgICAgICBWRU9SICAgICBkQ29uc3QwLGRDb25zdDAsZENvbnN0MAotICAgICAgICAgVlNIUk4gICAgZFFQMSxxUVAxLCMwICAgICAgICAgICAgICAgICAgICAgOy8vIFFQMSB0cnVuY2F0ZWQgdG8gMTYgYml0cwotICAgICAgICAgVlNVQiAgICAgZE1pbnVzUVAxLGRDb25zdDAsZFFQMSAgICAgICAgICAgOy8vIGRNaW51c1FQMT0tUVAxCi0KLUxvb3AgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgCi0gICAgICAgIDsvL1BlcmZvcm1pbmcgSW52ZXJzZSBRdWFudGl6YXRpb24KLSAgICAgICAgIAotICAgICAgICAgVkNMVCAgICAgZFNpZ24wLGRDb2VmZjAsICMwICAgICAgICAgICAgICAgOy8vIENvbXBhcmUgQ29lZmZpY2llbnQgMCBhZ2FpbnN0IDAKLSAgICAgICAgIFZDTFQgICAgIGRTaWduMSxkQ29lZmYxLCAjMCAgICAgICAgICAgICAgIDsvLyBDb21wYXJlIENvZWZmaWNpZW50IDEgYWdhaW5zdCAwCi0gICAgICAgICBWQ0VRICAgICBkWmVybzAsZENvZWZmMCwjMCAgICAgICAgICAgICAgICA7Ly8gQ29tcGFyZSBDb2VmZmljaWVudCAwIGFnYWluc3QgemVybwotICAgICAgICAgVkJTTCAgICAgZFNpZ24wLGRNaW51c1FQMSxkUVAxICAgICAgICAgICAgOy8vIGRTaWduMCA9IC1RUDEgaWYgQ29lZmYwPCAwIGVsc2UgUVAxCi0gICAgICAgICBWQ0VRICAgICBkWmVybzEsZENvZWZmMSwjMCAgICAgICAgICAgICAgICA7Ly8gQ29tcGFyZSBDb2VmZmljaWVudCAxIGFnYWluc3QgemVybwotICAgICAgICAgVkJTTCAgICAgZFNpZ24xLGRNaW51c1FQMSxkUVAxICAgICAgICAgICAgOy8vIGRTaWduMSA9IC1RUDEgaWYgQ29lZmYxPCAwIGVsc2UgUVAxCi0gICAgICAgICBWTU9WTCAgICBxU2lnbjAsZFNpZ24wICAgICAgICAgICAgICAgICAgICA7Ly8gU2lnbiBleHRlbmQgcVNpZ24wIHRvIDMyIGJpdHMKLSAgICAgICAgIFZNT1ZMICAgIHFTaWduMSxkU2lnbjEKLSAgICAgICAgIFZNTEFMICAgIHFSZXN1bHQwLGRDb2VmZjAsZDJRUCAgICAgICAgICAgIDsvLyBxUmVzdWx0MFtpXT0gcUNvZWZmMFtpXStxQ29lZmYwW2ldKigtMikgaWYgQ29lZmYgPDAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcVJlc3VsdDBbaV09IHFDb2VmZjBbaV0gICAgICAgICAgICAgICAgIGlmIENvZWZmID49MCAKLSAgICAgICAgIFZNTEFMICAgIHFSZXN1bHQxLGRDb2VmZjEsZDJRUCAgICAgICAgICAgIDsvLyBxUmVzdWx0MVtpXT0gcUNvZWZmMVtpXStxQ29lZmYxW2ldKigtMikgaWYgQ29lZmYgPDAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcVJlc3VsdDFbaV09IHFDb2VmZjFbaV0gICAgICAgICAgICAgICAgIGlmIENvZWZmID49MCAKLSAgICAgICAgIDsvLyBDbGlwIFJlc3VsdCB0byBbLTIwNDgsMjA0N10gICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgIAotICAgICAgICAgVlFTSEwgICAgcVJlc3VsdDAscVJlc3VsdDAsIzIwICAgICAgICAgICAgOy8vIGNsaXAgdG8gWy0yMDQ4LDIwNDddCi0gICAgICAgICBWUVNITCAgICBxUmVzdWx0MSxxUmVzdWx0MSwjMjAKLSAgICAgICAgICAgICAgICAgCi0gICAgICAgICBWU0hSICAgICBxUmVzdWx0MCxxUmVzdWx0MCwjNCAgCi0gICAgICAgICBWU0hSICAgICBxUmVzdWx0MSxxUmVzdWx0MSwjNAotICAgICAgICAgVlNIUk4gICAgZFJlc3VsdDAscVJlc3VsdDAsIzE2ICAgICAgICAgICAgOy8vIE5hcnJvdyB0aGUgY2xpcHBlZCBWYWx1ZSB0byBIYWxmd29yZAotICAgICAgICAgVlNIUk4gICAgZFJlc3VsdDEscVJlc3VsdDEsIzE2IAotICAgICAgICAgVkJJVCAgICAgZFJlc3VsdDAsZENvbnN0MCxkWmVybzAgIAotICAgICAgICAgVkJJVCAgICAgZFJlc3VsdDEsZENvbnN0MCxkWmVybzEgICAgIAotICAgICAgICAgCi0gICAgICAgICBWU1QxICAgICB7ZFJlc3VsdDAsZFJlc3VsdDF9LFtwU3JjRHN0XSEgICA7Ly8gU3RvcmUgdGhlIHJlc3VsdAotICAgICAgICAgU1VCUyAgICAgQ291bnQsQ291bnQsIzgKLSAgICAgICAgIFZMRDEgICAgIHtkQ29lZmYwLGRDb2VmZjF9LFtwU3JjRHN0XQotICAgICAgICAgCi0gICAgICAgICAKLSAgICAgICAgIEJHVCAgICAgIExvb3AKLSAgICAgICAgIAotICAgICAgICAgU1VCICAgICAgcFNyY0RzdCxwU3JjRHN0LCMxMjgKLSAgICAgICAgIAotICAgICAgICAgOy8vIFN0b3JlIHRoZSBJbnZlcnNlIHF1YW50aXplZCBEYyBjb2VmZmljaWVudAotICAgICAgICAgCi0gICAgICAgICBTVFJIICAgICB0ZW1wLFtwU3JjRHN0XSwjMgotICAgICAgICAKLSAgICAgICAgIE1PViAgICAgIFJldHVybiwjT01YX1N0c19Ob0VycgotICAgICAgICAgCi0KLQotICAgICAgICAgTV9FTkQKLSAgICAgICAgIEVORElGCi0gICAgICAgICAKLQotICAgICAgICBFTkQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvc3JjL2FybVZDX1ZlcnNpb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ5MzY4MS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvc3JjL2FybVZDX1ZlcnNpb24uYworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtQ09NTV9WZXJzaW9uLmgiCi0KLSNpZmRlZiBBUk1fSU5DTFVERV9WRVJTSU9OX0RFU0NSSVBUSU9OUwotY29uc3QgY2hhciAqIGNvbnN0IG9teFZDX1ZlcnNpb25EZXNjcmlwdGlvbiA9ICJBUk0gT3Blbk1BWCBETCB2IiBBUk1fVkVSU0lPTl9TVFJJTkcgIiAgIFJlbD0iIE9NWF9BUk1fUkVMRUFTRV9UQUcgIiAgIEFyY2g9IiBPTVhfQVJNX0JVSUxEX0FSQ0hJVEVDVFVSRSAiICAgVG9vbHM9IiAgT01YX0FSTV9CVUlMRF9UT09MQ0hBSU4gOwotI2VuZGlmIC8qIEFSTV9JTkNMVURFX1ZFUlNJT05fREVTQ1JJUFRJT05TICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL0FSTV9ERUxJVkVSWS5UWFQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL0FSTV9ERUxJVkVSWS5UWFQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MDFmM2QuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9BUk1fREVMSVZFUlkuVFhUCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotVGhlIGNvbnRlbnRzIG9mIHRoaXMgdHJhbnNhY3Rpb24gd2FzIGNyZWF0ZWQgYnkgSGVkbGV5IEZyYW5jaXMKLW9mIEFSTSBvbiAxOS1GZWItMjAwOC4KLQotSXQgY29udGFpbnMgdGhlIEFSTSBkYXRhIHZlcnNpb25zIGxpc3RlZCBiZWxvdy4KLQotVGhpcyBkYXRhLCB1bmxlc3Mgb3RoZXJ3aXNlIHN0YXRlZCwgaXMgQVJNIFByb3ByaWV0YXJ5IGFuZCBhY2Nlc3MgdG8gaXQKLWlzIHN1YmplY3QgdG8gdGhlIGFncmVlbWVudHMgaW5kaWNhdGVkIGJlbG93LgotCi1JZiB5b3UgZXhwZXJpZW5jZSBwcm9ibGVtcyB3aXRoIHRoaXMgZGF0YSwgcGxlYXNlIGNvbnRhY3QgQVJNIHN1cHBvcnQKLXF1b3RpbmcgdHJhbnNhY3Rpb24gcmVmZXJlbmNlIDw5NzQxMj4uCi0KLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KLQotLSBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MQotICBWaWRlbyBjb2RlY3MgLSBzYW1wbGUgY29kZQotICBTYW1wbGUgY29kZSByZWxlYXNlIGZvciBIYW50cm8gKFZlciAxLjAuMikKLSAgaW50ZXJuYWwgYWNjZXNzCi0KLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KLQotVGhpcyB0cmFuc2FjdGlvbiBjb250YWlucyBkZWxpdmVyYWJsZXMgd2hpY2ggYXJlIGRlc2lnbmF0ZWQgYXMgYmVpbmcgb2YKLWJldGEgcmVsZWFzZSBzdGF0dXMgKEJFVCkuCi0KLUJldGEgcmVsZWFzZSBzdGF0dXMgaGFzIGEgcGFydGljdWxhciBtZWFuaW5nIHRvIEFSTSBvZiB3aGljaCB0aGUgcmVjaXBpZW50Ci1tdXN0IGJlIGF3YXJlLiBCZXRhIGlzIGEgcHJlLXJlbGVhc2Ugc3RhdHVzIGluZGljYXRpbmcgdGhhdCB0aGUgZGVsaXZlcmFibGUKLXNvIGRlc2NyaWJlZCBpcyBiZWxpZXZlZCB0byByb2J1c3RseSBkZW1vbnN0cmF0ZSBzcGVjaWZpZWQgYmVoYXZpb3VyLCB0byBiZQotY29uc2lzdGVudCBhY3Jvc3MgaXRzIGluY2x1ZGVkIGFzcGVjdHMgYW5kIGJlIHJlYWR5IGZvciBnZW5lcmFsIGRlcGxveW1lbnQuCi1CdXQgQmV0YSBhbHNvIGluZGljYXRlcyB0aGF0IHByZS1yZWxlYXNlIHJlbGlhYmlsaXR5IHRyaWFscyBhcmUgb25nb2luZyBhbmQKLXRoYXQgaXQgaXMgcG9zc2libGUgcmVzaWR1YWwgZGVmZWN0cyBvciBlcnJvcnMgaW4gb3BlcmF0aW9uLCBjb25zaXN0ZW5jeQotYW5kIGRvY3VtZW50YXRpb24gbWF5IHN0aWxsIGJlIGVuY291bnRlcmVkLiBUaGUgcmVjaXBpZW50IHNob3VsZCBjb25zaWRlcgotdGhpcyBwb3NpdGlvbiB3aGVuIHVzaW5nIHRoaXMgQmV0YSBtYXRlcmlhbCBzdXBwbGllZC4gQVJNIHdpbGwgbm9ybWFsbHkKLWF0dGVtcHQgdG8gcHJvdmlkZSBmaXhlcyBvciBhIHdvcmstYXJvdW5kIGZvciBkZWZlY3RzIGlkZW50aWZpZWQgYnkgdGhlCi1yZWNpcGllbnQsIGJ1dCB0aGUgcHJvdmlzaW9uIG9yIHRpbWVsaW5lc3Mgb2YgdGhpcyBzdXBwb3J0IGNhbm5vdCBiZQotZ3VhcmFudGVlZC4gQVJNIHNoYWxsIG5vdCBiZSByZXNwb25zaWJsZSBmb3IgZGlyZWN0IG9yIGNvbnNlcXVlbnRpYWwKLWRhbWFnZXMgYXMgYSByZXN1bHQgb2YgZW5jb3VudGVyaW5nIG9uZSBvciBtb3JlIG9mIHRoZXNlIHJlc2lkdWFsIGRlZmVjdHMuCi1CeSBhY2NlcHRpbmcgYSBCZXRhIHJlbGVhc2UsIHRoZSByZWNpcGllbnQgYWdyZWVzIHRvIHRoZXNlIGNvbnN0cmFpbnRzIGFuZAotdG8gcHJvdmlkaW5nIHJlYXNvbmFibGUgaW5mb3JtYXRpb24gdG8gQVJNIHRvIGVuYWJsZSB0aGUgcmVwbGljYXRpb24gb2YgdGhlCi1kZWZlY3RzIGlkZW50aWZpZWQgYnkgdGhlIHJlY2lwaWVudC4gVGhlIHNwZWNpZmljIEJldGEgdmVyc2lvbiBzdXBwbGllZAotd2lsbCBub3QgYmUgc3VwcG9ydGVkIGFmdGVyIHJlbGVhc2Ugb2YgYSBsYXRlciBvciBoaWdoZXIgc3RhdHVzIHZlcnNpb24uCi1JdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBTdXBwb3J0IGZvciB0aGUgQmV0YSByZWxlYXNlIG9mIHRoZSBkZWxpdmVyYWJsZQotd2lsbCBvbmx5IGJlIHByb3ZpZGVkIGJ5IEFSTSB0byBhIHJlY2lwaWVudCB3aG8gaGFzIGEgY3VycmVudCBzdXBwb3J0IGFuZAotbWFpbnRlbmFuY2UgY29udHJhY3QgZm9yIHRoZSBkZWxpdmVyYWJsZS4KLQotCi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCi0KLUluIGFkZGl0aW9uIHRvIHRoZSBkYXRhIHZlcnNpb25zIGxpc3RlZCBhYm92ZSwgdGhpcyB0cmFuc2FjdGlvbiBjb250YWlucwotdHdvIGFkZGl0aW9uYWwgZmlsZXMgYXQgdGhlIHRvcCBsZXZlbC4KLQotVGhlIGZpcnN0IGlzIHRoaXMgZmlsZSwgQVJNX0RFTElWRVJZXzk3NDEyLlRYVCwgd2hpY2ggaXMgdGhlIGRlbGl2ZXJ5Ci1ub3RlLgotCi1UaGUgc2Vjb25kIGlzIEFSTV9NQU5JRkVTVF85NzQxMi5UWFQgd2hpY2ggY29udGFpbnMgYSBtYW5pZmVzdCBvZiBhbGwgdGhlCi1maWxlcyBpbmNsdWRlZCBpbiB0aGlzIHRyYW5zYWN0aW9uLCB0b2dldGhlciB3aXRoIHRoZWlyIGNoZWNrc3Vtcy4KLQotVGhlIGNoZWNrc3VtcyBwcm92aWRlZCBhcmUgY2FsY3VsYXRlZCB1c2luZyB0aGUgUlNBIERhdGEgU2VjdXJpdHksIEluYy4KLU1ENSBNZXNzYWdlLURpZ2VzdCBBbGdvcml0aG0uCi0KLVRoZSBjaGVja3N1bXMgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IHRoZSBpbnRlZ3JpdHkgb2YgdGhpcyBkYXRhIHVzaW5nIHRoZQotIm1kNXN1bSIgdG9vbCAod2hpY2ggaXMgcGFydCBvZiB0aGUgR05VICJ0ZXh0dXRpbHMiIHBhY2thZ2UpIGJ5IHJ1bm5pbmc6Ci0KLSAgJSBtZDVzdW0gLS1jaGVjayBBUk1fTUFOSUZFU1RfOTc0MTIuVFhUCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvQVJNX01BTklGRVNULlRYVCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvQVJNX01BTklGRVNULlRYVApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUwMWIxZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL0FSTV9NQU5JRkVTVC5UWFQKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotCQkJCSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvCi0JCQkJICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvCi04OTcxOTMyZDU2ZWVkNmIxYWQxYmE1MDdmMGJmZjVmMCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU1fQml0c3RyZWFtLmgKLWU4OGVjODRlMTIyNTM0MDkyYjkwYzY3ODQxNTQ5ZDZmICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTV9WZXJzaW9uLmgKLTQzY2Y0NmMyY2YyZmUxZjkzYzYxNWI1N2JjYmU0ODA5ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTS5oCi1mODdmZWRkOWNhNDMyZmVmYTc1NzAwODE3Njg2NGVmOCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybU9NWC5oCi04ZTQ5ODk5YTQyODgyMmMzNmVmOWRkOTRlMGUwNWYxOCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL29teHR5cGVzLmgKLWEwNjk4M2FiYjM5YzQ3NmIwODFlODdlYTI3MTM2MWE1ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS9idWlsZF92Yy5wbAotYzAxZjhiOTNhYjczZDhjMDBkZGYyNDk5ZjAxZGE1ZmYgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2ZpbGVsaXN0X3ZjLnR4dAotCQkJCSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvc3JjLwotMjZlMmZmM2Y2MzM3NjRlYjcyMGRlYjM0MDk3OGRjMmQgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3NyYy9hcm1DT01NX0JpdHN0cmVhbS5jCi03OWFhMjNkOTgxN2VmZDExZDBjNGMyYmUzNmVjMWU1YyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvc3JjL2FybUNPTU0uYwotCQkJCSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvCi0JCQkJICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC8KLQkJCQkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy8KLWU0NTI5NzcwNGQ3MjMwMmQ0YTk0N2QwNzk4YzY2NmZiICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5jCi0yMDVkZmFmZTFmZTdiYjE2MGJmMzZkMjYwMGUxMTAwYSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jCi1iZjkyNjQxZTg1NDg1NzdiNzdlMDRlMDNlYzA0YzM1OCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfTUVHZXRCdWZTaXplLmMKLWY1ZWU2ZjdiZTgyMmQ4NzQ3MWNlZjNiMTgwMWRiZmMyICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSS5jCi0yODExMGIzYTEzY2VjZjRmMjE2ZDEwYmNjNzYxYzQwMSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hLmMKLTlhMWEyNTI0NWM5NzVkNjQxZTFjNjM3ODgzNGFlYTRkICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYS5jCi0zYTY0M2VhYWFlYjEyZThkMjc0ZGM1OWE3MzU3YTU4NiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JLmMKLTRjNGRlNTk3M2E2Yjc0MjUwY2U5MWFjMGIzMTdhNjE3ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQy5jCi00ZWNkYmU5MTkzYWFiYTFmOWJiMGUyNGM5MzhiMzRmOSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2syeDIuYwotNjZlOTEyZjhjODhmNjAxOWNiYTNlZGUyNzE1MGE0MDcgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYS5jCi0yNjZkYTQyZjRlMzAxNWU2N2IyY2JiNTgxNjlkNDM3ZiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmRGlhZ19MdW1hLmMKLWQ5MDUyNDdlZWFhNTJkNGUyY2Y1ZjZiYzNmNjFiMzQ4ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIuYwotNWIyOTQ0OGRiMDQ5NWNkMTcxN2E0YjkyNWYxMzM3N2MgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNi5jCi1mNjQ1MWRmMjdmNmRjYzk5MDM2YjRiMTI1M2MyM2JiNiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0kuYwotODkyNzg3ZDg1MGVlZjA5ZGMyMTQ4ZDQ1YjQxNmIwNjIgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDLmMKLTMzZGExYzAxYTMxZjQ3YzBmM2FlYTlhN2E1ZWFhOWJlICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIuYwotZTlmYjExYjA2Njc3NTI4M2RjZmVhZThkMTJhNmM5N2EgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hLmMKLWFkZDk3YmVjMDhlNWUxYTUzOGFhODYwNzE2OGU2MWJhICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4LmMKLWI2OTVlY2ZjOTE3YjM5NDcwZDFmNDA3NzNiOTIzOTcyICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQzR4NC5jCi01MWJjNTk2ZmQyZmY2MWFkNTQ1MGQ3MTM4NDYxZjRhMSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfTUVJbml0LmMKLWRjNmJhYTBhMzg4ZGM1ZWE4ZmY2NWMyNGIxNzllNjcwICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9HZXRWTENJbmZvLmMKLWE1NDk5OTAyOTk2NTc2ZjY3MTI4NDlkYjM0ZDVhZDY1ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kuYwotMGMzYjc2NzQ1ZDUzZTc0YThlNjRlODBkZWYzMWZhYmEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQuYwotNGYyNzQyYmE1YTNjMjIwOGY1M2JjMGY2YTQ0M2JlMTQgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRFF1YXJfNHguYwotYjRhZTJkYzk0OGU4Y2E2NDgzMWZlM2JiZmJkODk1MjMgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKLWUxNTExOGNiZTM3MmRiN2NhZGJhMjI1Yzk0NTZmMTg5ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9TQURRdWFyLmMKLTYyM2NmMzM2Y2ZjZTdkMDE3NGY0ZTU0MDcyNDU2ZjMzICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZC5jCi04OWU0NTJjODBlMzAzNTdjYWRmYjA0YzA1YjZmZTAwYyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEuYwotM2E1NTUxY2M1NGU4NWJiZTM0ZmM5NjZjN2RjMDBmMWMgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlci5jCi0xMTQwMzBmYTBkOGYwMGFmNmQzMjg5ZjQ3YTVlODViZiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYwotOWUzNzNhYjI5NmZiODViYjQ1NTY1YTZjMzg0ZjZlZDggIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXMuYwotMmQyMDBmN2NjMjMwZjMwMmRhNDhjNTg5ZGE0MmMwMmYgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0LmMKLWVhM2YxZDFkMTUwN2I1NTYxMGIxMzQ5YzdiNTk0NmU4ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpci5jCi1iZDJiZjE3NDNhZWYyYTkzOTY1NDVlZDAyNTM2MmJlMiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQXZlcmFnZV80eC5jCi1jYTY4ZTgwOTU2N2JmODkwNDQ2MzFiNjdkMjI4YzdjZSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMKLTc3Y2FmMmI1Y2JlZTk2ZDM2MGE5MTlmMjdlMWYxNGY0ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9RdWFudFRhYmxlcy5jCi0yNjA4MWUzODRlYzYyN2ZlZGFkNDc0YTBlN2RhZDg3NyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEUXVhcl84eC5jCi0xYzgzYWU5MjA3YTU0OTQ0OTM2ZjRhNjNjNjY1YmQ5OSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CLmMKLTRjMzZlMDRkYjIwMjAwZjRlYzcyZTVhYmE1NzQ0NmZkICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQVREXzR4NC5jCi1mNzViN2M1YTgwZDhiZjMzZTMxNTM4MGU0ZWYwYWI4YSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEuYwotNDg4OTI1YmI3YWVlYWUwY2NmOTNlYzQ0YWY5ZmNlMzUgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRFF1YXJfMTZ4LmMKLWM5MWE1MzQ1YjVmODc3YjM4MzFlZDFhYmNjNjBkNTc5ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYuYwotMzU1MTVhMTE1YTMyZmNhYzg0NzkwNzJhOWE1YjBkYjkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEuYwotZmRjZjQ2MjJiYzVmMGFlNzViZGIwYTUxZGNkMDMzOTcgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQy5jCi03NGM5Mjc4MTc3NDAwYTFmN2NjNmQ3OTlhOGM4YWIzNCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEXzR4LmMKLTU2YWEyZDUwNmQwY2ZkYjRlYmQzNjZjMDdhZGIyZDg1ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZUJsb2NrUGl4ZWwuYwotMzZiMjE2NWZkNGQyYTdmM2YzZTFmOGRhZmY0Zjk0ZTUgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsLmMKLTRiNmIxYjkzM2ZjN2JjOGYxNGExODRjMDJjMDI4MDg1ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NC5jCi1jZjBmZjA5M2E5YjM3MmRkMzI3MWUzZTVjMjg5ODRkNCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyLmMKLTljY2FkOWY4OTRmYmQzMjE5NGY1YjUzZGEyMTcwNzJhICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDLmMKLTQ5NDNhN2EyZGY3ZTlkNzAwNjc1ZjhjMWRlYmY0ZDkwICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9Db21wYXJlTW90aW9uQ29zdFRvTVYuYwotMjllNGE3ZjM4ZjhjMmU4MjQ2ZWQ3NTZkYjAzYzAxMmUgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0Z3ZFRyYW5zZm9ybVJlc2lkdWFsNHg0LmMKLTI3YmM2NGU3YzE4ZGEwYWFiOWM5ODdhMzg4ZjYxNjA4ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMKLTg1OTE4NTYxNGJiOWQwMDEzODYxZTQ1NGQ3YjkxOGYyICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZC5jCi0JCQkJICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9hcGkvCi02M2UzYjY0Yjk2Y2M0MmEyMzVjMDRmM2EwZjk5MTMxNiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvYXBpL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuaAotCQkJCSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi8KLQkJCQkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjLwotMGFhZTRmNjgzZDg5MDNjYmE5OTU2ZDMzMDFlZDlmZmUgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9BQ0RDUHJlZGljdC5jCi04ZDZjMWI0NDkxNTMyOTE2NWRmNjQzMDgxY2MxMWE5NyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX01DUmVjb25CbG9jay5jCi0wNDM1ZWNhOTMwZWFjZGEwZjJhNTllODQzZDQwNWVmZiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX01vdGlvbkVzdGltYXRpb25NQi5jCi05YTgyZGQwYjFmMDVmNzk4NTY3NDM2YTAwOWQwMjk2OSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AuYwotZTFlMjQ2NDZjNGJkMDNmNWRmNzgyOTU0NTJkZDRlYjIgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4LmMKLTc0NmU2YjMzNGU0YTI2ZDRhOWJmYWU2ZDczNTgyNmY2ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRENUOHg4YmxrLmMKLThiMWQ4N2I3NGQ4MGZmMTNhMTYyMTViNjFkNWU1MmJhICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfSURDVDh4OGJsay5jCi0zMDkzNThkMzU3YmFhZmMzOGQyYjM3YmYxZTk3NjhhOSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50ZXJfSS5jCi1jYzc3YzcyNDJiNTNjMTUzZjhkMDk1Mjc1ODNmMjc3MSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0ZpbmRNVnByZWQuYwotN2NkOGU3Nzk2MDE3ZTNkZDAwYjQ5NGQzNGY2MjlmM2YgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9NRUdldEJ1ZlNpemUuYwotYTQ5MDVjYjVmOGQ0YjI0NDQ1NGVlNGY2MGQxODM1OGIgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9QdXRWTENCaXRzLmMKLTU1OTZiMzFlNDMzMjIyYzFlNDg2MGRlZWJmYTk4ZWYyICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRENUX1RhYmxlLmMKLTM2NWQwNzJiZTZlYWIyMDFmNmUwNDAwNThhM2JhY2ZjICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyLmMKLTc4ZWQyMjEyNTg1YjBjY2E3NTkxM2E0NzNiMmVjNDMwICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMuYwotNTBiMmQ4ZGE4ZjIwZjZiMWQzOWI4ZDNkZjM4YWY1NWQgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVNVi5jCi00YTg1MWEyYWQ2ZDM1N2NkYzIzM2Q5YzBiZjQ3NWUwMiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZi5jCi0wZDZkNjM4NzhmMjgyN2UwMGU1Zjg1YjFlOGUyNjAxNyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYwotNDhiODY1YTk4M2ZlNWJmMzA3NWVkZGY2NTI5NTA3MjIgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEuYwotNWY0OGZhNzk0MTgzNWM0NmFjNzY3ZTYzZmMyOTQwM2IgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQy5jCi1iYmFmNDU0YjY0YjMyYjJjNDJhNzZhN2VjMzkzZDk3NyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NvbXBhcmVNVi5jCi1lZWJmZjc3MmY4N2E0MTQ0MzZjNWM1Mjg2ZjJjZDIxMyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX01FSW5pdC5jCi02NWFlMjQyZWI4Y2I2ZDEwMjc2NzdjOGVmOGY3N2NhMCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0ZpbGxWTENCdWZmZXIuYwotMTI1NjQyYjFlYTBjMTI1NmQ3OWFmMWUwZGRlY2FlOTMgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludGVyX0kuYwotY2UyNGJhM2Q4M2RhNGNiNzkxNDg1ZDMxMjgyNjhiZjYgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYS5jCi0wOWJjMDlhMmU2ZmQ5NjJlNzE5OTQ0NTgyZTM4YThmZCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jCi02YjBlZTdhMTE2NDcxYTRkYWRiZTViYzhkYmY0MjViMCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIuYwotMjEzMjJkY2EwMjdjMjgzNTNlM2U3ZWI4ZjM2MjAwNjIgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DaGVja1ZMQ0VzY2FwZU1vZGUuYwotZWYzNTNkODMyNDQyODhkOGMzN2UwZjcwMjQ5MTc3Y2MgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9HZXRWTENCaXRzLmMKLTU0MWRlODI0ZjhhZWJlNGE1Y2FjNmYxNWRhOTQzZWZhICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OC5jCi0wYjQwYjE1NGI1OTFjN2Y4ODQyY2ZmZTQwNDJkMTdjNSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCi0yZmZjZWM4OGQzZmNiMzcyNTQzYThmNDUwOGVhMWFjNiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW50cmFfSS5jCi1lMDZkODVjYTAwMGFmY2JiNTA1ODBmOThmMDIwM2FjOCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLmMKLWFlODJiNmZjZmNmNzMxYTYxZDcwZTFhYTQyZTYyNzdhICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LmMKLTFkMDQzOTVlMjMxYjU5NzU2MjI1N2U5OGNkYTZjZmIwICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKLTcyYzBhMzYzMjdiNmI5YjQzNmQzYmNlN2M4OTZjNTIwICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMuYwotMWI2NWFhN2YzMTExMjRlYTZmYjQ3ZTM4NGVjMDZhNTAgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludHJhX0kuYwotNzE0OTU3MTA0YTZlZjcxMzQxZmJlNmE5ZWM2NWMxMzYgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9TZXRQcmVkRGlyLmMKLTg2NDkzZjBlZTg1M2Y2NTMzNTRhNzM4OWYxNzI3ZjczICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIuYwotNWRlOGFmY2ZiMzA1Mjk2ODc5NDc4MmE3YzNhMGI0MWEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIuYwotNTBiY2MyMjhjYzY2MGRiZGEwMzc3MjUzMDlkZTNmOGIgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9FbmNvZGVWTENaaWd6YWdfaW50cmEuYwotNGY1Y2ZhMWVjYzY2ODkxM2RkZTk0ZTNjYWY5N2EyZTEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfaW50cmEuYwotYzJlYzgwNGRkZjY0ZWU4NDExNDZlMzljM2E3ODM0NTEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYuYwotNDA4N2Y2YTgyNzkxMmVlNWI0NWVkNDIxN2YxYTZkNzcgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIuYwotCQkJCSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9hcGkvCi01YzcxMTcwMmRkZGNlYzg1Mjk4MDAzODYwZDc2MGNlYyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0RDVF9UYWJsZS5oCi0xYjkyYzk0Yjc4NWMwM2VjNzZkNGZhZTJmMmJiZGI4YSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaAotYWQ5YzY5ODZkMmEzMjAwZGQ1ZTFmNjEwM2E1NGE5OWIgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvYXBpL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaAotCQkJCSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvc3JjLwotZTYyN2IzMzQ2YjBkYzlhZmYxNDQ0NjAwNWNlMGZhNDMgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMKLQkJCQkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2FwaS8KLTdjYTk0YjFjMzNhYzAyMTFlMTdkMzhiYWFkZDdkMWRkICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9hcGkvYXJtVkMuaAotMTJjZjc1OTZlZGJiZjYwNDhiNjI2ZDE1ZThkMGVkNDggIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2FwaS9vbXhWQy5oCi0JCQkJICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tLwotCQkJCSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvCi0zYTZkZjAwODU3MzZjYmNiZTJlM2Y0NWQwOGFmNDIyMSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvYXJtVkNDT01NX0F2ZXJhZ2UuYwotMGJmM2NiNTI4NjNjODI5YjI4YzAzNTI4MzUxNzAyMTEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5OHg4LmMKLTUzOGI2MmY1MTBiNWE4YmRjZWQ0YTM5ZmExMmQ5YTIzICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRC5jCi02Njk5M2VkZDlkNDQxYmYzYjViNmM5MTJmNjQwMGI2ZSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0kuYwotOGU1MjZhOTAwN2ViMGQ0M2ViZjM2MmM0OThiMzc0MTUgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9MaW1pdE1WVG9SZWN0LmMKLTg3ZjhmMjZlNmU5MTc4ZGYwYWI3NDE5MzM0ZDVhM2RiICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fU0FEXzE2eC5jCi0xYTg1Nzc2NDYxMzJhZDliNjNhMTQ3N2ZkYWVjMjQ2NCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX0F2ZXJhZ2VfMTZ4LmMKLTQ4NTI5YzRmNzBjN2U5NTRlODMyZWVjZTFhZWU1N2JkICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fU0FEXzh4LmMKLTI1Mjk3Nzc2NGQ0ZjM4MjgyYjZhNTZjNTljY2Y0ZjA5ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy9hcm1WQ0NPTU1fU0FELmMKLWNjNzhjZmFlZDk1MDJjMmUwMjgyYzkxZmI5NWVlYWM0ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQXZlcmFnZV84eC5jCi1lNDY4NzUxYzE1YTU4MWViZDIyZGEwMzFlMjIxMTdkMSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHkxNngxNi5jCi0zZjQ0OGQxOTFlYWViODJlY2I3ZTI3ZWY4YmEyNzg3NSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jay5jCi1iMTI5MWMzMDc4MDg2MzFmYTgzMzY4NGFiYjljMzRjZSAgQVJNX0RFTElWRVJZXzk3NDEyLlRYVApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9hcGkvYXJtQ09NTS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9hcGkvYXJtQ09NTS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzA0ODYzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL2FybUNPTU0uaAorKysgL2Rldi9udWxsCkBAIC0xLDgwMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtQ09NTS5oCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiAgIAotICogRmlsZTogYXJtQ09NTS5oCi0gKiBCcmllZjogRGVjbGFyZXMgQ29tbW9uIEFQSXMvRGF0YSBUeXBlcyB1c2VkIGFjcm9zcyBPcGVuTUFYIEFQSSdzCi0gKgotICovCi0gCi0gIAotI2lmbmRlZiBfYXJtQ29tbW9uX0hfCi0jZGVmaW5lIF9hcm1Db21tb25fSF8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIE9NWF9GMzIgUmU7IC8qKiBSZWFsIHBhcnQgKi8KLSAgT01YX0YzMiBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQotICAgICAgICAKLX0gT01YX0ZDMzI7IC8qKiBzaW5nbGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IGNvbXBsZXggbnVtYmVyICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIE9NWF9GNjQgUmU7IC8qKiBSZWFsIHBhcnQgKi8KLSAgT01YX0Y2NCBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQotICAgICAgICAKLX0gT01YX0ZDNjQ7IC8qKiBkb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IGNvbXBsZXggbnVtYmVyICovCi0KLQotLyogVXNlZCBieSBib3RoIElQIGFuZCBJQyBkb21haW5zIGZvciA4eDggSlBFRyBibG9ja3MuICovCi10eXBlZGVmIE9NWF9TMTYgQVJNX0JMT0NLOHg4WzY0XTsKLQotCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0KLSNkZWZpbmUgIGFybVBJIChPTVhfRjY0KSgzLjE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3OTUpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogQ29tcGlsZXIgZXh0ZW5zaW9ucyAqLwotI2lmZGVmIEFSTV9ERUJVRwotLyogZGVidWcgdmVyc2lvbiAqLwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jZGVmaW5lIGFybUVycm9yKHN0cikge3ByaW50Zigoc3RyKSk7IHByaW50ZigiXG4iKTsgZXhpdCgtMSk7fQotI2RlZmluZSBhcm1XYXJuKHN0cikge3ByaW50Zigoc3RyKSk7IHByaW50ZigiXG4iKTt9Ci0jZGVmaW5lIGFybUlnbm9yZShhKSAoKHZvaWQpYSkKLSNkZWZpbmUgYXJtQXNzZXJ0KGEpIGFzc2VydChhKQotI2Vsc2UgCi0vKiByZWxlYXNlIHZlcnNpb24gKi8KLSNkZWZpbmUgYXJtRXJyb3Ioc3RyKSAoKHZvaWQpIChzdHIpKQotI2RlZmluZSBhcm1XYXJuKHN0cikgICgodm9pZCkgKHN0cikpCi0jZGVmaW5lIGFybUlnbm9yZShhKSAgKCh2b2lkKSAoYSkpCi0jZGVmaW5lIGFybUFzc2VydChhKSAgKCh2b2lkKSAoYSkpCi0jZW5kaWYgLyogQVJNX0RFQlVHICovCi0KLS8qIEFyaXRobWV0aWMgb3BlcmF0aW9ucyAqLwotCi0jZGVmaW5lIGFybU1pbihhLGIpICAgICAgICAgICAgICggKGEpID4gKGIpID8gIChiKTooYSkgKQotI2RlZmluZSBhcm1NYXgoYSxiKSAgICAgICAgICAgICAoIChhKSA+IChiKSA/ICAoYSk6KGIpICkKLSNkZWZpbmUgYXJtQWJzKGEpICAgICAgICAgICAgICAgKCAoYSkgPCAgMCAgPyAtKGEpOihhKSApCi0KLS8qIEFsaWdubWVudCBvcGVyYXRpb24gKi8KLQotI2RlZmluZSBhcm1BbGlnblRvQnl0ZXMoUHRyLE4pICAgICAgKFB0ciArICggKChOLShpbnRwdHJfdClQdHIpJihOLTEpKSAvIHNpemVvZigqUHRyKSApKQotI2RlZmluZSBhcm1BbGlnblRvMkJ5dGVzKFB0cikgICAgICAgYXJtQWxpZ25Ub0J5dGVzKFB0ciwyKQotI2RlZmluZSBhcm1BbGlnblRvNEJ5dGVzKFB0cikgICAgICAgYXJtQWxpZ25Ub0J5dGVzKFB0ciw0KQotI2RlZmluZSBhcm1BbGlnblRvOEJ5dGVzKFB0cikgICAgICAgYXJtQWxpZ25Ub0J5dGVzKFB0ciw4KQotI2RlZmluZSBhcm1BbGlnblRvMTZCeXRlcyhQdHIpICAgICAgYXJtQWxpZ25Ub0J5dGVzKFB0ciwxNikKLQotLyogRXJyb3IgYW5kIEFsaWdubWVudCBjaGVjayAqLwotCi0jZGVmaW5lIGFybVJldEFyZ0VycklmKGNvbmRpdGlvbiwgY29kZSkgIGlmKGNvbmRpdGlvbikgeyByZXR1cm4gKGNvZGUpOyB9Ci0jZGVmaW5lIGFybVJldERhdGFFcnJJZihjb25kaXRpb24sIGNvZGUpIGlmKGNvbmRpdGlvbikgeyByZXR1cm4gKGNvZGUpOyB9Ci0KLSNpZm5kZWYgQUxJR05NRU5UX0RPRVNOVF9NQVRURVIKLSNkZWZpbmUgYXJtSXNCeXRlQWxpZ25lZChQdHIsTikgICAgICgoKChpbnRwdHJfdCkoUHRyKSkgJSBOKT09MCkKLSNkZWZpbmUgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLE4pICAgICgoKChpbnRwdHJfdCkoUHRyKSkgJSBOKSE9MCkKLSNlbHNlCi0jZGVmaW5lIGFybUlzQnl0ZUFsaWduZWQoUHRyLE4pICAgICAoMSkKLSNkZWZpbmUgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLE4pICAgICgwKQotI2VuZGlmCi0KLSNkZWZpbmUgYXJtSXMyQnl0ZUFsaWduZWQoUHRyKSAgICAgIGFybUlzQnl0ZUFsaWduZWQoUHRyLDIpCi0jZGVmaW5lIGFybUlzNEJ5dGVBbGlnbmVkKFB0cikgICAgICBhcm1Jc0J5dGVBbGlnbmVkKFB0ciw0KQotI2RlZmluZSBhcm1JczhCeXRlQWxpZ25lZChQdHIpICAgICAgYXJtSXNCeXRlQWxpZ25lZChQdHIsOCkKLSNkZWZpbmUgYXJtSXMxNkJ5dGVBbGlnbmVkKFB0cikgICAgIGFybUlzQnl0ZUFsaWduZWQoUHRyLDE2KQotCi0jZGVmaW5lIGFybU5vdDJCeXRlQWxpZ25lZChQdHIpICAgICBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsMikKLSNkZWZpbmUgYXJtTm90NEJ5dGVBbGlnbmVkKFB0cikgICAgIGFybU5vdEJ5dGVBbGlnbmVkKFB0ciw0KQotI2RlZmluZSBhcm1Ob3Q4Qnl0ZUFsaWduZWQoUHRyKSAgICAgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLDgpCi0jZGVmaW5lIGFybU5vdDE2Qnl0ZUFsaWduZWQoUHRyKSAgICBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsMTYpCi0jZGVmaW5lIGFybU5vdDMyQnl0ZUFsaWduZWQoUHRyKSAgICBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsMzIpCi0KLS8qKgotICogRnVuY3Rpb246IGFybVJvdW5kRmxvYXRUb1MxNl9yZWYvYXJtUm91bmRGbG9hdFRvUzMyX3JlZi9hcm1Sb3VuZEZsb2F0VG9TNjQKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgc2hvcnQgaW50L2ludCBhZnRlciByb3VuZGluZwotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMTYvT01YX1MzMiBmb3JtYXQKLSAqCi0gKi8KLQotT01YX1MxNiBhcm1Sb3VuZEZsb2F0VG9TMTYgKE9NWF9GNjQgVmFsdWUpOwotT01YX1MzMiBhcm1Sb3VuZEZsb2F0VG9TMzIgKE9NWF9GNjQgVmFsdWUpOwotT01YX1M2NCBhcm1Sb3VuZEZsb2F0VG9TNjQgKE9NWF9GNjQgVmFsdWUpOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9TMTZfcmVmL2FybVNhdFJvdW5kRmxvYXRUb1MzMgotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBzaG9ydCBpbnQvaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MxNi9PTVhfUzMyIGZvcm1hdAotICoKLSAqLwotCi1PTVhfUzE2IGFybVNhdFJvdW5kRmxvYXRUb1MxNiAoT01YX0Y2NCBWYWx1ZSk7Ci1PTVhfUzMyIGFybVNhdFJvdW5kRmxvYXRUb1MzMiAoT01YX0Y2NCBWYWx1ZSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1UxNl9yZWYvYXJtU2F0Um91bmRGbG9hdFRvVTMyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHVuc2lnbmVkIHNob3J0IGludC9pbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfVTE2L09NWF9VMzIgZm9ybWF0Ci0gKgotICovCi0KLU9NWF9VMTYgYXJtU2F0Um91bmRGbG9hdFRvVTE2IChPTVhfRjY0IFZhbHVlKTsKLU9NWF9VMzIgYXJtU2F0Um91bmRGbG9hdFRvVTMyIChPTVhfRjY0IFZhbHVlKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtU2lnbkNoZWNrCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDaGVja3MgdGhlIHNpZ24gb2YgYSB2YXJpYWJsZToKLSAqIHJldHVybnMgMSBpZiBpdCBpcyBQb3NpdGl2ZQotICogcmV0dXJucyAwIGlmIGl0IGlzIDAKLSAqIHJldHVybnMgLTEgaWYgaXQgaXMgTmVnYXRpdmUgCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQkgICAgdmFyICAgICBWYXJpYWJsZSB0byBiZSBjaGVja2VkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX0lOVCAtLSAgIHJldHVybnMgMSBpZiBpdCBpcyBQb3NpdGl2ZQotICogICAgICAgICAgICAgIHJldHVybnMgMCBpZiBpdCBpcyAwCi0gKiAgICAgICAgICAgICAgcmV0dXJucyAtMSBpZiBpdCBpcyBOZWdhdGl2ZSAKLSAqLyAKLSAKLU9NWF9JTlQgYXJtU2lnbkNoZWNrIChPTVhfUzE2IHZhcik7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybUNsaXAKLSAqCi0gKiBEZXNjcmlwdGlvbjogQ2xpcHMgdGhlIGlucHV0IGJldHdlZW4gTUFYIGFuZCBNSU4gdmFsdWUKLSAqIAotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gTWluICAgICBsb3dlciBib3VuZAotICogW2luXSBNYXggICAgIHVwcGVyIGJvdW5kCi0gKiBbaW5dIHNyYyAgICAgdmFyaWFibGUgdG8gdGhlIGNsaXBwZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfUzMyIC0tICAgcmV0dXJucyBjbGlwcGVkIHZhbHVlCi0gKi8gCi0gCi1PTVhfUzMyIGFybUNsaXAgKAotICAgICAgICBPTVhfSU5UIG1pbiwKLSAgICAgICAgT01YX0lOVCBtYXgsIAotICAgICAgICBPTVhfUzMyIHNyYwotICAgICAgICApOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1DbGlwX0YzMgotICoKLSAqIERlc2NyaXB0aW9uOiBDbGlwcyB0aGUgaW5wdXQgYmV0d2VlbiBNQVggYW5kIE1JTiB2YWx1ZQotICogCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBNaW4gICAgIGxvd2VyIGJvdW5kCi0gKiBbaW5dIE1heCAgICAgdXBwZXIgYm91bmQKLSAqIFtpbl0gc3JjICAgICB2YXJpYWJsZSB0byB0aGUgY2xpcHBlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9GMzIgLS0gICByZXR1cm5zIGNsaXBwZWQgdmFsdWUKLSAqLyAKLSAKLU9NWF9GMzIgYXJtQ2xpcF9GMzIgKAotICAgICAgICBPTVhfRjMyIG1pbiwKLSAgICAgICAgT01YX0YzMiBtYXgsIAotICAgICAgICBPTVhfRjMyIHNyYwotICAgICAgICApOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1TaGlmdFNhdF9GMzIKLSAqCi0gKiBEZXNjcmlwdGlvbjogRGl2aWRlcyBhIGZsb2F0IHZhbHVlIGJ5IDJec2hpZnQgYW5kIAotICogc2F0dXJhdGVzIGl0IGZvciB1bnNpZ25lZCB2YWx1ZSByYW5nZSBmb3Igc2F0Qml0cy4KLSAqIFNlY29uZCBwYXJhbWV0ZXIgaXMgbGlrZSAic2hpZnRpbmciIHRoZSBjb3JyZXNwb25kaW5nIAotICogaW50ZWdlciB2YWx1ZS4gVGFrZXMgY2FyZSBvZiByb3VuZGluZyB3aGlsZSBjbGlwcGluZyB0aGUgZmluYWwgCi0gKiB2YWx1ZS4KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSB2ICAgICAgICAgIE51bWJlciB0byBiZSBvcGVyYXRlZCB1cG9uCi0gKiBbaW5dIHNoaWZ0ICAgICAgRGl2aWRlcyB0aGUgaW5wdXQgInYiIGJ5ICIyXnNoaWZ0IgotICogW2luXSBzYXRCaXRzICAgIEZpbmFsIHJhbmdlIGlzIFswLCAyXnNhdEJpdHMpCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1MzMiAtLSAgIHJldHVybnMgInNoaWZ0ZWQiIHNhdHVyYXRlZCB2YWx1ZQotICovIAotIAotT01YX1UzMiBhcm1TaGlmdFNhdF9GMzIoCi0gICAgICAgIE9NWF9GMzIgdiwgCi0gICAgICAgIE9NWF9JTlQgc2hpZnQsIAotICAgICAgICBPTVhfSU5UIHNhdEJpdHMKLSAgICAgICAgKTsKLQotLyoqCi0gKiBGdW5jdGlvbnM6IGFybVN3YXBFbGVtCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHN3YXBzIHR3byBlbGVtZW50cyBhdCB0aGUgc3BlY2lmaWVkIHBvaW50ZXIgbG9jYXRpb25zLgotICogVGhlIHNpemUgb2YgZWFjaCBlbGVtZW50IGNvdWxkIGJlIGFueXRoaW5nIGFzIHNwZWNpZmllZCBieSA8ZWxlbVNpemU+Ci0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YUmVzdWx0IC0tIEVycm9yIHN0YXR1cyBmcm9tIHRoZSBmdW5jdGlvbgotICovCi1PTVhSZXN1bHQgYXJtU3dhcEVsZW0oT01YX1U4ICpwQnVmMSwgT01YX1U4ICpwQnVmMiwgT01YX0lOVCBlbGVtU2l6ZSk7Ci0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtTWVkaWFuT2YzCi0gKgotICogRGVzY3JpcHRpb246IEZpbmRzIHRoZSBtZWRpYW4gb2YgdGhyZWUgbnVtYmVycwotICogCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIGZFbnRyeSAgICAgRmlyc3QgZW50cnkKLSAqIFtpbl0gc0VudHJ5ICAgICBzZWNvbmQgZW50cnkKLSAqIFtpbl0gdEVudHJ5ICAgICBUaGlyZCBlbnRyeQotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TMzIgLS0gICByZXR1cm5zIHRoZSBtZWRpYW4gdmFsdWUKLSAqLyAKLSAKLU9NWF9TMzIgYXJtTWVkaWFuT2YzICgKLSAgICBPTVhfUzMyIGZFbnRyeSwKLSAgICBPTVhfUzMyIHNFbnRyeSwgCi0gICAgT01YX1MzMiB0RW50cnkgCi0gICAgKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtTG9nU2l6ZQotICoKLSAqIERlc2NyaXB0aW9uOiBGaW5kcyB0aGUgc2l6ZSBvZiBhIHBvc2l0aXZlIHZhbHVlIGFuZCByZXR1cm5zIHRoZSBzYW1lCi0gKiAKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gdmFsdWUgICAgUG9zaXRpdmUgdmFsdWUKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfVTggLS0gICByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBwb3NpdGl2ZSB2YWx1ZQotICovIAotIAotT01YX1U4IGFybUxvZ1NpemUgKAotICAgIE9NWF9VMTYgdmFsdWUgCi0gICAgKTsgICAgCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICAgICAvKiBTYXR1cmF0aW5nIEFyaXRobWV0aWMgb3BlcmF0aW9ucyAqLwotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRBZGRfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgYWRkaXRpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCi0gKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqIAotICogICAgCi0gKiovCi0KLU9NWF9TMzIgYXJtU2F0QWRkX1MzMigKLSAgICAgICAgICAgICAgICBPTVhfUzMyIFZhbHVlMSwKLSAgICAgICAgICAgICAgICBPTVhfUzMyIFZhbHVlMgotICAgICAgICAgICAgICAgICk7Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdEFkZF9TNjQoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBhZGRpdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKLSAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogCi0gKiAgICAKLSAqKi8KLQotT01YX1M2NCBhcm1TYXRBZGRfUzY0KAotICAgICAgICAgICAgICAgIE9NWF9TNjQgVmFsdWUxLAotICAgICAgICAgICAgICAgIE9NWF9TNjQgVmFsdWUyCi0gICAgICAgICAgICAgICAgKTsKLQotLyoqIEZ1bmN0aW9uIDphcm1TYXRTdWJfUzMyKCkKLSAqIAotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgc3Vic3RyYWN0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAotICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAKLSAqKi8KLQotT01YX1MzMiBhcm1TYXRTdWJfUzMyKAotICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIFZhbHVlMSwKLSAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBWYWx1ZTIKLSAgICAgICAgICAgICAgICAgICAgKTsKLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0TWFjX1MzMigpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBNdWx0aXBsaWNhdGlvbiBvZiBWYWx1ZTEgYW5kIFZhbHVlMiBhbmQgc3ViZXNxdWVudCBzYXR1cmF0ZWQKLSAqICAgICBhY2N1bXVsYXRpb24gd2l0aCBNYWMKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCi0gKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAotICogW2luXSBNYWMgICAgICAgICAgQWNjdW11bGF0b3IKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiovCi0KLU9NWF9TMzIgYXJtU2F0TWFjX1MzMigKLSAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBNYWMsCi0gICAgICAgICAgICAgICAgICAgIE9NWF9TMTYgVmFsdWUxLAotICAgICAgICAgICAgICAgICAgICBPTVhfUzE2IFZhbHVlMgotICAgICAgICAgICAgICAgICAgICApOwotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRNYWNfUzE2UzMyX1MzMgotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBNQUMgb3BlcmF0aW9uIG9mIHRoZSB0aHJlZSBpbnB1dHMgZGVsYXlFbGVtLCBmaWxUYXAgLCBtYWMKLSAqCi0gKiAgIG1hYyA9IG1hYyArIFNhdHVyYXRlX2luXzMyQml0cyhkZWxheUVsZW0gKiBmaWxUYXApCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBkZWxheUVsZW0gICAgRmlyc3QgMzIgYml0IE9wZXJhbmQKLSAqIFtpbl0gZmlsVGFwICAgICAgIFNlY29uZCAxNiBiaXQgT3BlcmFuZAotICogW2luXSBtYWMgICAgICAgICAgUmVzdWx0IG9mIE1BQyBvcGVyYXRpb24KLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgbWFjICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLSAKLU9NWF9TMzIgYXJtU2F0TWFjX1MxNlMzMl9TMzIoCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIG1hYywgCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIGRlbGF5RWxlbSwgCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzE2IGZpbFRhcCApOwotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZFJpZ2h0U2hpZnRfUzMyX1MxNgotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHJvdW5kZWQgcmlnaHQgc2hpZnQgb3BlcmF0aW9uIG9mIGlucHV0IGJ5IHRoZSBzY2FsZWZhY3RvcgotICoKLSAqICAgb3V0cHV0ID0gU2F0dXJhdGVfaW5fMTZCaXRzKCAoIFJpZ2h0U2hpZnQoIChSb3VuZChpbnB1dCkgLCBzY2FsZUZhY3RvciApICkKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIGlucHV0ICAgICAgIFRoZSBpbnB1dCB0byBiZSBvcGVyYXRlZCBvbgotICogW2luXSBzY2FsZUZhY3RvciBUaGUgc2hpZnQgbnVtYmVyCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLQotCi1PTVhfUzE2IGFybVNhdFJvdW5kUmlnaHRTaGlmdF9TMzJfUzE2KAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBpbnB1dCwgCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU5UIHNjYWxlRmFjdG9yKTsKLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRMZWZ0U2hpZnRfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRpbmcgbGVmdC1zaGlmdCBvcGVyYXRpb24gb24gaW5wdXQKLSAqICAgICBPciByb3VuZGVkIFJpZ2h0IHNoaWZ0IGlmIHRoZSBpbnB1dCBTaGlmdCBpcyBuZWdhdGl2ZS4KLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlICAgICAgICBPcGVyYW5kCi0gKiBbaW5dIHNoaWZ0ICAgICAgICBPcGVyYW5kIGZvciBzaGlmdCBvcGVyYXRpb24KLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLSAKLU9NWF9TMzIgYXJtU2F0Um91bmRMZWZ0U2hpZnRfUzMyKAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTlQgc2hpZnQKLSAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdFJvdW5kTGVmdFNoaWZ0X1M2NCgpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0aW5nIGxlZnQtc2hpZnQgb3BlcmF0aW9uIG9uIGlucHV0Ci0gKiAgICAgT3Igcm91bmRlZCBSaWdodCBzaGlmdCBpZiB0aGUgaW5wdXQgU2hpZnQgaXMgbmVnYXRpdmUuCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBWYWx1ZSAgICAgICAgT3BlcmFuZAotICogW2luXSBzaGlmdCAgICAgICAgT3BlcmFuZCBmb3Igc2hpZnQgb3BlcmF0aW9uCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0gCi1PTVhfUzY0IGFybVNhdFJvdW5kTGVmdFNoaWZ0X1M2NCgKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TNjQgVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU5UIHNoaWZ0Ci0gICAgICAgICAgICAgICAgICAgICAgICApOwotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRNdWxTMTZTMzJfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGEgUzE2IGRhdGEgdHlwZSBtdWx0aXBsaWVkIHdpdGggYW4gUzMyIGRhdGEgdHlwZQotICogICAgIGluIGEgUzMyIGNvbnRhaW5lcgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gaW5wdXQxICAgICAgIE9wZXJhbmQgMQotICogW2luXSBpbnB1dDIgICAgICAgT3BlcmFuZCAyCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0KLQotT01YX1MzMiBhcm1TYXRNdWxTMTZTMzJfUzMyKAotICAgICAgICAgICAgICAgICAgICBPTVhfUzE2IGlucHV0MSwKLSAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBpbnB1dDIpOwotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRNdWxTMzJTMzJfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGEgUzMyIGRhdGEgdHlwZSBtdWx0aXBsaWVkIHdpdGggYW4gUzMyIGRhdGEgdHlwZQotICogICAgIGluIGEgUzMyIGNvbnRhaW5lcgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gaW5wdXQxICAgICAgIE9wZXJhbmQgMQotICogW2luXSBpbnB1dDIgICAgICAgT3BlcmFuZCAyCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0KLU9NWF9TMzIgYXJtU2F0TXVsUzMyUzMyX1MzMigKLSAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBpbnB1dDEsCi0gICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgaW5wdXQyKTsKLQotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1JbnREaXZBd2F5RnJvbVplcm8oKQotICoKLSAqIERlc2NyaXB0aW9uIDogSW50ZWdlciBkaXZpc2lvbiB3aXRoIHJvdW5kaW5nIHRvIHRoZSBuZWFyZXN0IGludGVnZXIuIAotICogICAgICAgICAgICAgICBIYWxmLWludGVnZXIgdmFsdWVzIGFyZSByb3VuZGVkIGF3YXkgZnJvbSB6ZXJvCi0gKiAgICAgICAgICAgICAgIHVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLiBGb3IgZXhhbXBsZSAzLy8yIGlzIHJvdW5kZWQgCi0gKiAgICAgICAgICAgICAgIHRvIDIsIGFuZCAtMy8vMiBpcyByb3VuZGVkIHRvIC0yLgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gTnVtICAgICAgICBPcGVyYW5kIDEKLSAqIFtpbl0gRGVubyAgICAgICBPcGVyYW5kIDIKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uIGlucHV0MS8vaW5wdXQyCi0gKiAgICAKLSAqKi8KLQotT01YX1MzMiBhcm1JbnREaXZBd2F5RnJvbVplcm8gKE9NWF9TMzIgTnVtLCBPTVhfUzMyIERlbm8pOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBEZWJ1Z2dpbmcgbWFjcm9zCi0gKgotICovCi0KLQotLyoKLSAqIERlZmluaXRpb24gb2Ygb3V0cHV0IHN0cmVhbSAtIGNoYW5nZSB0byBzdGRlcnIgaWYgbmVjZXNzYXJ5Ci0gKi8KLSNkZWZpbmUgREVCVUdfU1RSRUFNIHN0ZG91dAotCi0vKgotICogRGVidWcgcHJpbnRmIG1hY3Jvcywgb25lIGZvciBlYWNoIGFyZ3VtZW50IGNvdW50LgotICogQWRkIG1vcmUgaWYgbmVlZGVkLgotICovCi0jaWZkZWYgREVCVUdfT04KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jZGVmaW5lIERFQlVHX1BSSU5URl8wKGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSkKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzEoYSwgYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiKQotI2RlZmluZSBERUJVR19QUklOVEZfMihhLCBiLCBjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMpCi0jZGVmaW5lIERFQlVHX1BSSU5URl8zKGEsIGIsIGMsIGQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCkKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzQoYSwgYiwgYywgZCwgZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlKQotI2RlZmluZSBERUJVR19QUklOVEZfNShhLCBiLCBjLCBkLCBlLCBmKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYpCi0jZGVmaW5lIERFQlVHX1BSSU5URl82KGEsIGIsIGMsIGQsIGUsIGYsIGcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZykKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzcoYSwgYiwgYywgZCwgZSwgZiwgZywgaCkgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoKQotI2RlZmluZSBERUJVR19QUklOVEZfOChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpKSAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGkpCi0jZGVmaW5lIERFQlVHX1BSSU5URl85KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGopICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaikKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzEwKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGspICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrKQotI2RlZmluZSBERUJVR19QUklOVEZfMTEoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCkgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwpCi0jZGVmaW5lIERFQlVHX1BSSU5URl8xMihhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtKSAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSkKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzEzKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4pICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuKQotI2RlZmluZSBERUJVR19QUklOVEZfMTQoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbiwgbykgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4sIG8pCi0jZWxzZSAvKiBERUJVR19PTiAqLwotI2RlZmluZSBERUJVR19QUklOVEZfMChhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzEoYSwgYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl8yKGEsIGIsIGMpICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfMyhhLCBiLCBjLCBkKSAgICAgICAgICAgICAgICAgICAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzQoYSwgYiwgYywgZCwgZSkgICAgICAgICAgICAgICAgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl81KGEsIGIsIGMsIGQsIGUsIGYpICAgICAgICAgICAgICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfNihhLCBiLCBjLCBkLCBlLCBmLCBnKSAgICAgICAgICAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzcoYSwgYiwgYywgZCwgZSwgZiwgZywgaCkgICAgICAgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl84KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGkpICAgICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfOShhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqKSAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzEwKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGspICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfMTEoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCkgICAgICAgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl8xMihhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtKSAgICAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzEzKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4pICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl8xNChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuLCBvKSAgIAotI2VuZGlmIC8qIERFQlVHX09OICovCi0KLQotLyoKLSAqIERvbWFpbiBhbmQgc3ViIGRvbWFpbiBkZWZpbml0aW9ucwotICoKLSAqIEluIG9yZGVyIHRvIHR1cm4gb24gZGVidWcgZm9yIGFuIGVudGlyZSBkb21haW4gb3Igc3ViLWRvbWFpbgotICogYXQgY29tcGlsZSB0aW1lLCBvbmUgb2YgdGhlIERFQlVHX0RPTUFJTl8qIGJlbG93IG1heSBiZSBkZWZpbmVkLAotICogd2hpY2ggd2lsbCBhY3RpdmF0ZSBkZWJ1ZyBpbiBhbGwgb2YgdGhlIGRlZmluZXMgaXQgY29udGFpbnMuCi0gKi8KLQotI2lmZGVmIERFQlVHX0RPTUFJTl9BQwotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVDSEFOUEFJUkVMVF9NUEVHNAotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVDSEFOUEFJUkVMVAotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVEQVRTVFJFTFQKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFRklMTEVMVAotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVJU1NURVJFT19TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFTVNQTlNfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERU1TU1RFUkVPX1MzMl9JCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERVBSR0NGR0VMVAotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVUTlNfUzMyX0kKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVJTlRFUkxFQVZFU1BFQ1RSVU1fUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0VOQ09ERVROU19TMzJfSQotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19MT05HVEVSTVBSRURJQ1RfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0xPTkdURVJNUkVDT05TVFJVQ1RfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX01EQ1RGV0RfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX01EQ1RJTlZfUzMyX1MxNgotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19OT0lTRUxFU1NERUNPREUKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfUVVBTlRJTlZfUzMyX0kKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfVU5QQUNLQURJRkhFQURFUgotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19VTlBBQ0tBRFRTRlJBTUVIRUFERVIKLSNkZWZpbmUgREVCVUdfT01YQUNNUDNfSFVGRk1BTkRFQ09ERVNGQk1CUF9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNNUDNfSFVGRk1BTkRFQ09ERVNGQl9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNNUDNfSFVGRk1BTkRFQ09ERV9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNNUDNfTURDVElOVl9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNNUDNfUkVRVUFOVElaRVNGQl9TMzJfSQotI2RlZmluZSBERUJVR19PTVhBQ01QM19SRVFVQU5USVpFX1MzMl9JCi0jZGVmaW5lIERFQlVHX09NWEFDTVAzX1NZTlRIUFFNRl9TMzJfUzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDTVAzX1VOUEFDS0ZSQU1FSEVBREVSCi0jZGVmaW5lIERFQlVHX09NWEFDTVAzX1VOUEFDS1NDQUxFRkFDVE9SU19TOAotI2RlZmluZSBERUJVR19PTVhBQ01QM19VTlBBQ0tTSURFSU5GTwotI2VuZGlmIC8qIERFQlVHX0RPTUFJTl9BQyAqLwotCi0KLSNpZmRlZiBERUJVR19ET01BSU5fVkMKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9BVkVSQUdFXzE2WAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0FWRVJBR0VfNFgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9BVkVSQUdFXzhYCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfREVCTE9DS0NIUk9NQV9VOF9DMUlSCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfREVCTE9DS0xVTUFfVThfQzFJUgotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0RFQ09ERUNIUk9NQURDQ09FRkZTVE9QQUlSQ0FWTENfVTgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9ERUNPREVDT0VGRlNUT1BBSVJDQVZMQ19VOAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0RFUVVBTlRUUkFOU0ZPUk1BQ0ZST01QQUlSX1U4X1MxNl9DMV9ETFgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9FWFBBTkRGUkFNRQotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0ZJTFRFUkRFQkxPQ0tJTkdDSFJPTUFfSE9SRURHRV9VOF9DMUlSCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfRklMVEVSREVCTE9DS0lOR0NIUk9NQV9WRVJFREdFX1U4X0MxSVIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9GSUxURVJERUJMT0NLSU5HTFVNQV9IT1JFREdFX1U4X0MxSVIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9GSUxURVJERUJMT0NLSU5HTFVNQV9WRVJFREdFX1U4X0MxSVIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9QUkVESUNUSU5UUkFDSFJPTUE4WDhfVThfQzFSCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfUFJFRElDVElOVFJBXzE2WDE2X1U4X0MxUgotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1BSRURJQ1RJTlRSQV80WDRfVThfQzFSCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEUVVBUl8xNlgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURRVUFSXzRYCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEUVVBUl84WAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRF8xNlgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURfNFgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURfOFgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQVREXzRYNAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1RSQU5TRk9STURFUVVBTlRDSFJPTUFEQ0ZST01QQUlSX1U4X1MxNl9DMQotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1RSQU5TRk9STURFUVVBTlRMVU1BRENGUk9NUEFJUl9VOF9TMTZfQzEKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9UUkFOU0ZPUk1RVUFOVF9DSFJPTUFEQwotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1RSQU5TRk9STVFVQU5UX0xVTUFEQwotI2RlZmluZSBERUJVR19PTVhWQ000UDJfQkxPQ0tNQVRDSF9IQUxGXzE2WDE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9CTE9DS01BVENIX0hBTEZfOFg4Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9CTE9DS01BVENIX0lOVEVHRVJfMTZYMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0JMT0NLTUFUQ0hfSU5URUdFUl84WDgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0NPTVBVVEVURVhUVVJFRVJST1JCTE9DS19TQURfVThfUzE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9DT01QVVRFVEVYVFVSRUVSUk9SQkxPQ0tfVThfUzE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9EQ1Q4WDhCTEtETFgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RFQ09ERUJMT0NLQ09FRl9JTlRFUl9TMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RFQ09ERVBBRE1WX1BWT1AKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RFQ09ERVZMQ1pJR1pBR19JTlRFUl9TMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RFQ09ERVZMQ1pJR1pBR19JTlRSQUFDVkxDX1MxNgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFVkxDWklHWkFHX0lOVFJBRENWTENfUzE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9FTkNPREVNVl9VOF9TMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0VOQ09ERVZMQ1pJR1pBR19JTlRFUl9TMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0VOQ09ERVZMQ1pJR1pBR19JTlRSQUFDVkxDX1MxNgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfRU5DT0RFVkxDWklHWkFHX0lOVFJBRENWTENfUzE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9GSU5ETVZQUkVECi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9JRENUOFg4QkxLRExYCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9MSU1JVE1WVE9SRUNUCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9NT1RJT05FU1RJTUFUSU9OTUIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1BBRE1CR1JBWV9VOAotI2RlZmluZSBERUJVR19PTVhWQ000UDJfUEFETUJIT1JJWk9OVEFMX1U4Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9QQURNQlZFUlRJQ0FMX1U4Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9QQURNVgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfUVVBTlRJTlRFUl9TMTZfSQotI2RlZmluZSBERUJVR19PTVhWQ000UDJfUVVBTlRJTlRSQV9TMTZfSQotI2RlZmluZSBERUJVR19PTVhWQ000UDJfUVVBTlRJTlZJTlRFUl9TMTZfSQotI2RlZmluZSBERUJVR19PTVhWQ000UDJfUVVBTlRJTlZJTlRSQV9TMTZfSQotI2RlZmluZSBERUJVR19PTVhWQ000UDJfVFJBTlNSRUNCTE9DS0NFT0ZfSU5URVIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1RSQU5TUkVDQkxPQ0tDRU9GX0lOVFJBCi0jZW5kaWYgLyogREVCVUdfRE9NQUlOX1ZDICovCi0KLQotI2lmZGVmIERFQlVHX0RPTUFJTl9JQwotLyogVG8gYmUgZmlsbGVkIGluICovCi0jZW5kaWYgLyogREVCVUdfRE9NQUlOX0lDICovCi0KLQotI2lmZGVmIERFQlVHX0RPTUFJTl9TUAotI2RlZmluZSBERUJVR19PTVhBQ1NQX0RPVFBST0RfUzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDU1BfQkxPQ0tFWFBfUzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDU1BfQkxPQ0tFWFBfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfQ09QWV9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9ET1RQUk9EX1MxNgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0RPVFBST0RfUzE2X1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEZXRF9DVE9DX1NDMTZfU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZURldEX0NUT0NfU0MzMl9TRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRGV0RfUlRPQ0NTX1MxNlMzMl9TRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRGV0RfUlRPQ0NTX1MzMl9TRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRHRVRCVUZTSVpFX0NfU0MxNgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEdFVEJVRlNJWkVfQ19TQzMyCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUR0VUQlVGU0laRV9SX1MxNl9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRHRVRCVUZTSVpFX1JfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5JVF9DX1NDMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTklUX0NfU0MzMgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOSVRfUl9TMTZfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5JVF9SX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOVl9DQ1NUT1JfUzMyUzE2X1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOVl9DQ1NUT1JfUzMyX1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOVl9DVE9DX1NDMTZfU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5WX0NUT0NfU0MzMl9TRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GSUxURVJNRURJQU5fUzMyX0kKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GSUxURVJNRURJQU5fUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRklST05FX0RJUkVDVF9TMTZfSVNGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUk9ORV9ESVJFQ1RfUzE2X0kKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJPTkVfRElSRUNUX1MxNgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUk9ORV9ESVJFQ1RfUzE2X1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUl9ESVJFQ1RfUzE2X0lTRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJfRElSRUNUX1MxNl9JCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRklSX0RJUkVDVF9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJfRElSRUNUX1MxNl9TRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJPTkVfQklRVUFERElSRUNUX1MxNl9JCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfSUlST05FX0JJUVVBRERJUkVDVF9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJPTkVfRElSRUNUX1MxNl9JCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfSUlST05FX0RJUkVDVF9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJfQklRVUFERElSRUNUX1MxNl9JCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfSUlSX0JJUVVBRERJUkVDVF9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJfRElSRUNUX1MxNl9JCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfSUlSX0RJUkVDVF9TMTYKLSNlbmRpZiAvKiBERUJVR19ET01BSU5fU1AgKi8KLQotCi0jaWZkZWYgREVCVUdfRE9NQUlOX0lQCi0jZGVmaW5lIERFQlVHX09NWElQQk1fQUREQ19VOF9DMVJfU0ZTCi0jZGVmaW5lIERFQlVHX09NWElQQk1fQ09QWV9VOF9DMVIKLSNkZWZpbmUgREVCVUdfT01YSVBCTV9DT1BZX1U4X0MzUgotI2RlZmluZSBERUJVR19PTVhJUEJNX01JUlJPUl9VOF9DMVIKLSNkZWZpbmUgREVCVUdfT01YSVBCTV9NVUxDX1U4X0MxUl9TRlMKLSNkZWZpbmUgREVCVUdfT01YSVBDU19DT0xPUlRXSVNUUTE0X1U4X0MzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1JHQjU2NVRPWUNCQ1I0MjBMU19NQ1VfVTE2X1MxNl9DM1AzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1JHQjU2NVRPWUNCQ1I0MjJMU19NQ1VfVTE2X1MxNl9DM1AzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1JHQjU2NVRPWUNCQ1I0NDRMU19NQ1VfVTE2X1MxNl9DM1AzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1JHQlRPWUNCQ1I0MjBMU19NQ1VfVThfUzE2X0MzUDNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCVE9ZQ0JDUjQyMkxTX01DVV9VOF9TMTZfQzNQM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19SR0JUT1lDQkNSNDQ0TFNfTUNVX1U4X1MxNl9DM1AzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIwUlNaUk9UX1U4X1AzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIwVE9SR0I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIwVE9SR0I1NjVfVThfVTE2X1AzQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjBUT1JHQkxTX01DVV9TMTZfVThfUDNDM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlJTWkNTQ1JPVFJHQl9VOF9DMlIKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlJTWlJPVF9VOF9QM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPUkdCNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPUkdCNTY1X1U4X1UxNl9DMkMzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9SR0JMU19NQ1VfUzE2X1U4X1AzQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1JHQl9VOF9DMkMzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9ZQ0JDUjQyMFJPVEFURV9VOF9DMlAzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9ZQ0JDUjQyMFJPVEFURV9VOF9QM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQ0NFRPUkdCNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQ0NFRPUkdCTFNfTUNVX1MxNl9VOF9QM0MzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSVE9SR0I1NjVfVThfVTE2X0MzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSVE9SR0I1NjVfVThfVTE2X1AzQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1JUT1JHQl9VOF9DM1IKLSNkZWZpbmUgREVCVUdfT01YSVBQUF9HRVRDRU5UUkFMTU9NRU5UX1M2NAotI2RlZmluZSBERUJVR19PTVhJUFBQX0dFVFNQQVRJQUxNT01FTlRfUzY0Ci0jZGVmaW5lIERFQlVHX09NWElQUFBfTU9NRU5UR0VUU1RBVEVTSVpFX1M2NAotI2RlZmluZSBERUJVR19PTVhJUFBQX01PTUVOVElOSVRfUzY0Ci0jZGVmaW5lIERFQlVHX09NWElQUFBfTU9NRU5UUzY0U19VOF9DMVIKLSNkZWZpbmUgREVCVUdfT01YSVBQUF9NT01FTlRTNjRTX1U4X0MzUgotI2VuZGlmIC8qIERFQlVHX0RPTUFJTl9JUCAqLwotCi0KLSNlbmRpZiAvKiBfYXJtQ29tbW9uX0hfICovCi0KLS8qRW5kIG9mIEZpbGUqLwotCi0KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9hcGkvYXJtQ09NTV9CaXRzdHJlYW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc2YjY2ZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1DT01NX0JpdHN0cmVhbS5oCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRmlsZTogYXJtQ09NTV9CaXRzdHJlYW0uaAotICogQnJpZWY6IERlY2xhcmVzIGNvbW1vbiBBUEkncy9EYXRhIHR5cGVzIHVzZWQgYWNyb3NzIHRoZSBPcGVuTWF4IEVuY29kZXJzL0RlY29kZXJzLgotICoKLSAqLwotCi0jaWZuZGVmIF9hcm1Db2RlY19IXwotI2RlZmluZSBfYXJtQ29kZWNfSF8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBPTVhfVTggICBjb2RlTGVuOwotICAgIE9NWF9VMzIJIGNvZGVXb3JkOwotfSBBUk1fVkxDMzI7Ci0KLS8qIFRoZSBhYm92ZSBzaG91bGQgYmUgcmVuYW1lZCBhcyAiQVJNX1ZMQzMyIiAqLwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1Mb29rQWhlYWRCaXRzKCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEdldCB0aGUgbmV4dCBOIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtIHdpdGhvdXQgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICAgICAqKnBwQml0U3RyZWFtCi0gKiBbaW5dICAgICAqcE9mZnNldAotICogW2luXSAgICAgTj0xLi4uMzIKLSAqCi0gKiBSZXR1cm5zICBWYWx1ZQotICovCi0KLU9NWF9VMzIgYXJtTG9va0FoZWFkQml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwgT01YX0lOVCAqcE9mZnNldCwgT01YX0lOVCBOKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtR2V0Qml0cygpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBSZWFkIE4gYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KLSAqICAgIAotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQotICogW2luXSAgICAgKnBPZmZzZXQKLSAqIFtpbl0gICAgIE49MS4uMzIKLSAqCi0gKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KLSAqIFtvdXRdICAgICpwT2Zmc2V0Ci0gKiBSZXR1cm5zICBWYWx1ZQotICovCi0KLU9NWF9VMzIgYXJtR2V0Qml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwgT01YX0lOVCAqcE9mZnNldCwgT01YX0lOVCBOKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtQnl0ZUFsaWduKCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEFsaWduIHRoZSBwb2ludGVyICpwcEJpdFN0cmVhbSB0byB0aGUgbmV4dCBieXRlIGJvdW5kYXJ5Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQotICogW2luXSAgICAgKnBPZmZzZXQKLSAqCi0gKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KLSAqIFtvdXRdICAgICpwT2Zmc2V0Ci0gKgotICoqLwotIAotT01YVm9pZCBhcm1CeXRlQWxpZ24oY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCk7Ci0KLS8qKiAKLSAqIEZ1bmN0aW9uOiBhcm1Ta2lwQml0cygpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBTa2lwIE4gYml0cyBmcm9tIHRoZSB2YWx1ZSBhdCAqcHBCaXRTdHJlYW0KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgICAgKnBwQml0U3RyZWFtCi0gKiBbaW5dICAgICAqcE9mZnNldAotICogW2luXSAgICAgTgotICoKLSAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQotICogW291dF0gICAgKnBPZmZzZXQKLSAqCi0gKiovCi0KLU9NWFZvaWQgYXJtU2tpcEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCxPTVhfSU5UIE4pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBWYXJpYWJsZSBiaXQgbGVuZ3RoIERlY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVW5QYWNrVkxDMzIoKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVmFyaWFibGUgbGVuZ3RoIGRlY29kZSBvZiB2YXJpYWJsZSBsZW5ndGggc3ltYm9sIChtYXggc2l6ZSAzMiBiaXRzKSByZWFkIGZyb20KLSAqIHRoZSBiaXQgc3RyZWFtIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIGF0ICpwT2Zmc2V0IGJ5IHVzaW5nIHRoZSB0YWJsZQotICogcG9pbnRlZCBieSBwQ29kZUJvb2sKLSAqIAotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICoqcHBCaXRTdHJlYW0KLSAqIFtpbl0gICAgICpwT2Zmc2V0Ci0gKiBbaW5dICAgICBwQ29kZUJvb2sKLSAqIAotICogW291dF0gICAgKipwcEJpdFN0cmVhbQotICogW291dF0gICAgKnBPZmZzZXQKLSAqCi0gKiBSZXR1cm5zIDogQ29kZSBCb29rIEluZGV4IGlmIHN1Y2Nlc3NmdWxsLiAKLSAqICAgICAgICAgOiAiQVJNX05PX0NPREVCT09LX0lOREVYID0gMHhGRkZGIiBpZiBzZWFyY2ggZmFpbHMuCi0gKiovCi0KLSNkZWZpbmUgQVJNX05PX0NPREVCT09LX0lOREVYIChPTVhfVTE2KSgweEZGRkYpCi0KLU9NWF9VMTYgYXJtVW5QYWNrVkxDMzIoCi0gICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcE9mZnNldCwKLSAgICBjb25zdCBBUk1fVkxDMzIgKnBDb2RlQm9vawotKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRml4ZWQgYml0IGxlbmd0aCBFbmNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogRnVuY3Rpb246IGFybVBhY2tCaXRzCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQYWNrIGEgVkxDIGNvZGUgd29yZCBpbnRvIHRoZSBiaXRzdHJlYW0KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbS4KLSAqIFtpbl0JcE9mZnNldAkgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKLSAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAotICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KLSAqIFtpbl0JY29kZVdvcmQJCUNvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCi0gKiBbaW5dCWNvZGVMZW5ndGgJCUxlbmd0aCBvZiB0aGUgY29kZSB3b3JkIHZhbGlkIHJhbmdlIDEuLi4zMgotICoKLSAqIFtvdXRdIHBwQml0U3RyZWFtCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAotICoJICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0Ci0gKgkJCQkJCQlzdHJlYW0gYnVmZmVyLgotICogW291dF0gcEJpdE9mZnNldAkJKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLSAqCQkJCQkJCWN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLSAqCQkJCQkJCSpwcEJpdFN0cmVhbS4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0gCi1PTVhSZXN1bHQgYXJtUGFja0JpdHMgKAotICAgIE9NWF9VOCAgKipwcEJpdFN0cmVhbSwgCi0gICAgT01YX0lOVCAqcE9mZnNldCwKLSAgICBPTVhfVTMyIGNvZGVXb3JkLCAKLSAgICBPTVhfSU5UIGNvZGVMZW5ndGggCi0pOwotIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVmFyaWFibGUgYml0IGxlbmd0aCBFbmNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogRnVuY3Rpb246IGFybVBhY2tWTEMzMgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGFjayBhIFZMQyBjb2RlIHdvcmQgaW50byB0aGUgYml0c3RyZWFtCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIAotICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0uCi0gKiBbaW5dCXBCaXRPZmZzZXQJICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKLSAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAotICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KLSAqIFtpbl0JIGNvZGUgICAgIAkJVkxDIGNvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0KLSAqCi0gKiBbb3V0XSBwcEJpdFN0cmVhbQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKLSAqCSAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0Ci0gKgkJCQkJCXN0cmVhbSBidWZmZXIuCi0gKiBbb3V0XSBwQml0T2Zmc2V0CQkqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotICoJCQkJCQljdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci0gKgkJCQkJCSpwcEJpdFN0cmVhbS4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0gCi1PTVhSZXN1bHQgYXJtUGFja1ZMQzMyICgKLSAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwgCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBBUk1fVkxDMzIgY29kZSAKLSk7Ci0KLSNlbmRpZiAgICAgIC8qX2FybUNvZGVjX0hfKi8KLQotLypFbmQgb2YgRmlsZSovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9hcm1DT01NX1ZlcnNpb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL2FybUNPTU1fVmVyc2lvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTlhNDUwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL2FybUNPTU1fVmVyc2lvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyogR3VhcmQgdGhlIGhlYWRlciBhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbi4gKi8KLSNpZm5kZWYgX19BUk1fQ09NTV9WRVJTSU9OX0hfXwotI2RlZmluZSBfX0FSTV9DT01NX1ZFUlNJT05fSF9fCi0KLQotLyogVGhlIGZvbGxvd2luZyBsaW5lIHNob3VsZCBiZSBpbiBvbXh0eXBlcy5oIGJ1dCBoYXNuJ3QgYmVlbiBhcHByb3ZlZCBieSBPcGVuTUFYIHlldCAqLwotI2RlZmluZSBPTVhfVkVSU0lPTiAxMDIKLQotLyogV2UgbmVlZCB0byBkZWZpbmUgdGhlc2UgbWFjcm9zIGluIG9yZGVyIHRvIGNvbnZlcnQgYSAjZGVmaW5lIG51bWJlciBpbnRvIGEgI2RlZmluZSBzdHJpbmcuICovCi0jZGVmaW5lIEFSTV9RVU9URShhKSAjYQotI2RlZmluZSBBUk1fSU5ESVJFQ1QoQSkgQVJNX1FVT1RFKEEpCi0KLS8qIENvbnZlcnQgdGhlIE9NWF9WRVJTSU9OIG51bWJlciBpbnRvIGEgc3RyaW5nIHRoYXQgY2FuIGJlIHVzZWQsIGZvciBleGFtcGxlLCB0byBwcmludCBpdCBvdXQuICovCi0jZGVmaW5lIEFSTV9WRVJTSU9OX1NUUklORyBBUk1fSU5ESVJFQ1QoT01YX1ZFUlNJT04pCi0KLQotLyogRGVmaW5lIHRoaXMgaW4gb3JkZXIgdG8gdHVybiBvbiBBUk0gdmVyc2lvbi9yZWxlYXNlL2J1aWxkIHN0cmluZ3MgaW4gZWFjaCBkb21haW4gKi8KLSNkZWZpbmUgQVJNX0lOQ0xVREVfVkVSU0lPTl9ERVNDUklQVElPTlMKLQotI2lmZGVmIEFSTV9JTkNMVURFX1ZFUlNJT05fREVTQ1JJUFRJT05TCi0gIGV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgb214QUNfVmVyc2lvbkRlc2NyaXB0aW9uOwotICBleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IG9teElDX1ZlcnNpb25EZXNjcmlwdGlvbjsKLSAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBvbXhJUF9WZXJzaW9uRGVzY3JpcHRpb247Ci0gIGV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgb214U1BfVmVyc2lvbkRlc2NyaXB0aW9uOwotICBleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IG9teFZDX1ZlcnNpb25EZXNjcmlwdGlvbjsKLSNlbmRpZiAvKiBBUk1fSU5DTFVERV9WRVJTSU9OX0RFU0NSSVBUSU9OUyAqLwotCi0KLS8qIFRoZSBmb2xsb3dpbmcgZW50cmllcyBzaG91bGQgYmUgYXV0b21hdGljYWxseSB1cGRhdGVkIGJ5IHRoZSByZWxlYXNlIHNjcmlwdCAqLwotLyogVGhleSBhcmUgdXNlZCBpbiB0aGUgQVJNIHZlcnNpb24gc3RyaW5ncyBkZWZpbmVkIGZvciBlYWNoIGRvbWFpbi4gICAgICAgICAgICAgKi8KLQotLyogVGhlIHJlbGVhc2UgdGFnIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlbGVhc2Ugb2YgdGhlIGxpYnJhcnkuIC0gdXNlZCBmb3Igc291cmNlIGFuZCBvYmplY3QgcmVsZWFzZXMgKi8KLSNkZWZpbmUgT01YX0FSTV9SRUxFQVNFX1RBRyAgInIwcDAtMDBiZXQxIgotCi0vKiBUaGUgQVJNIGFyY2hpdGVjdHVyZSB1c2VkIHRvIGJ1aWxkIGFueSBvYmplY3RzIG9yIGV4ZWN1dGFibGVzIGluIHRoaXMgcmVsZWFzZS4gKi8KLSNkZWZpbmUgT01YX0FSTV9CVUlMRF9BUkNISVRFQ1RVUkUgIkFOU0kgQyIKLQotLyogVGhlIEFSTSBUb29sY2hhaW4gdXNlZCB0byBidWlsZCBhbnkgb2JqZWN0cyBvciBleGVjdXRhYmxlcyBpbiB0aGlzIHJlbGVhc2UuICovCi0jZGVmaW5lIE9NWF9BUk1fQlVJTERfVE9PTENIQUlOICAgICJBUk0gUlZDVCAzLjEiCi0KLQotI2VuZGlmIC8qIF9fQVJNX0NPTU1fVkVSU0lPTl9IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9hcGkvYXJtT01YLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9hcm1PTVguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdjMGMyNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9hcm1PTVguaAorKysgL2Rldi9udWxsCkBAIC0xLDI4OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtT01YX1JlbGVhc2VWZXJzaW9uLmgKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBUaGlzIGZpbGUgYWxsb3dzIGEgdmVyc2lvbiBvZiB0aGUgT01YIERMIGxpYnJhcmllcyB0byBiZSBidWlsdCB3aGVyZSBzb21lIG9yCi0gKiBhbGwgb2YgdGhlIGZ1bmN0aW9uIG5hbWVzIGNhbiBiZSBnaXZlbiBhIHVzZXIgc3BlY2lmaWVkIHN1ZmZpeC4gCi0gKgotICogWW91IG1pZ2h0IHdhbnQgdG8gdXNlIGl0IHdoZXJlOgotICoKLSAqIC0geW91IHdhbnQgdG8gcmVuYW1lIGEgZnVuY3Rpb24gIm91dCBvZiB0aGUgd2F5IiBzbyB0aGF0IHlvdSBjb3VsZCByZXBsYWNlCi0gKiAgIGEgZnVuY3Rpb24gd2l0aCBhIGRpZmZlcmVudCB2ZXJzaW9uICh0aGUgb3JpZ2luYWwgdmVyc2lvbiB3b3VsZCBzdGlsbCBiZQotICogICBpbiB0aGUgbGlicmFyeSBqdXN0IHdpdGggYSBkaWZmZXJlbnQgbmFtZSAtIHNvIHlvdSBjb3VsZCBkZWJ1ZyB0aGUgbmV3Ci0gKiAgIHZlcnNpb24gYnkgY29tcGFyaW5nIGl0IHRvIHRoZSBvdXRwdXQgb2YgdGhlIG9sZCkKLSAqCi0gKiAtIHlvdSB3YW50IHRvIHJlbmFtZSBhbGwgdGhlIGZ1bmN0aW9ucyB0byB2ZXJzaW9ucyB3aXRoIGEgc3VmZml4IHNvIHRoYXQgCi0gKiAgIHlvdSBjYW4gaW5jbHVkZSB0d28gdmVyc2lvbnMgb2YgdGhlIGxpYnJhcnkgYW5kIGNob29zZSBiZXR3ZWVuIGZ1bmN0aW9ucwotICogICBhdCBydW50aW1lLgotICoKLSAqICAgICBlLmcuIG9teElQQk1fQ29weV9VOF9DMVIgY291bGQgYmUgcmVuYW1lZCBvbXhJUEJNX0NvcHlfVThfQzFSX0NvcnRleEE4Ci0gKiAKLSAqLwotCi0gIAotI2lmbmRlZiBfYXJtT01YX0hfCi0jZGVmaW5lIF9hcm1PTVhfSF8KLQotCi0vKiBXZSBuZWVkIHRvIGRlZmluZSB0aGVzZSB0d28gbWFjcm9zIGluIG9yZGVyIHRvIGV4cGFuZCBhbmQgY29uY2F0ZW5hdGUgdGhlIG5hbWVzICovCi0jZGVmaW5lIE9NWENBVDJCQVIoQSwgQikgb214ICMjIEEgIyMgQgotI2RlZmluZSBPTVhDQVRCQVIoQSwgQikgT01YQ0FUMkJBUihBLCBCKQotCi0vKiBEZWZpbmUgdGhlIHN1ZmZpeCB0byBhZGQgdG8gYWxsIGZ1bmN0aW9ucyAtIHRoZSBkZWZhdWx0IGlzIG5vIHN1ZmZpeCAqLwotI2RlZmluZSBCQVJFX1NVRkZJWCAKLQotCi0KLS8qIERlZmluZSB3aGF0IGhhcHBlbnMgdG8gdGhlIGJhcmUgc3VmZml4LWxlc3MgZnVuY3Rpb25zLCBkb3duIHRvIHRoZSBzdWItZG9tYWluIGFjY3VyYWN5ICovCi0jZGVmaW5lIE9NWEFDQUFDX1NVRkZJWCAgICBCQVJFX1NVRkZJWCAgIAotI2RlZmluZSBPTVhBQ01QM19TVUZGSVggICAgQkFSRV9TVUZGSVgKLSNkZWZpbmUgT01YSUNKUF9TVUZGSVggICAgIEJBUkVfU1VGRklYCi0jZGVmaW5lIE9NWElQQk1fU1VGRklYICAgICBCQVJFX1NVRkZJWAotI2RlZmluZSBPTVhJUENTX1NVRkZJWCAgICAgQkFSRV9TVUZGSVgKLSNkZWZpbmUgT01YSVBQUF9TVUZGSVggICAgIEJBUkVfU1VGRklYCi0jZGVmaW5lIE9NWFNQX1NVRkZJWCAgICAgICBCQVJFX1NVRkZJWAotI2RlZmluZSBPTVhWQ0NPTU1fU1VGRklYICAgQkFSRV9TVUZGSVgKLSNkZWZpbmUgT01YVkNNNFAxMF9TVUZGSVggIEJBUkVfU1VGRklYCi0jZGVmaW5lIE9NWFZDTTRQMl9TVUZGSVggICBCQVJFX1NVRkZJWAotCi0KLQotCi0vKiBEZWZpbmUgd2hhdCB0aGUgZWFjaCBiYXJlLCB1bi1zdWZmaXhlZCBPcGVuTUFYIEFQSSBmdW5jdGlvbiBuYW1lcyBpcyB0byBiZSByZW5hbWVkICovCi0jZGVmaW5lIG9teEFDQUFDX0RlY29kZUNoYW5QYWlyRWx0ICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZUNoYW5QYWlyRWx0LCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX0RlY29kZURhdFN0ckVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZURhdFN0ckVsdCwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVGaWxsRWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVGaWxsRWx0LCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX0RlY29kZUlzU3RlcmVvX1MzMiAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZUlzU3RlcmVvX1MzMiwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVNc1BOU19TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVNc1BOU19TMzJfSSwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVNc1N0ZXJlb19TMzJfSSAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVNc1N0ZXJlb19TMzJfSSwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVQcmdDZmdFbHQgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVQcmdDZmdFbHQsIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfRGVjb2RlVE5TX1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlVE5TX1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX0RlaW50ZXJsZWF2ZVNwZWN0cnVtX1MzMiAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlaW50ZXJsZWF2ZVNwZWN0cnVtX1MzMiwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19FbmNvZGVUTlNfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19FbmNvZGVUTlNfUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfTG9uZ1Rlcm1QcmVkaWN0X1MzMiAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfTG9uZ1Rlcm1QcmVkaWN0X1MzMiwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19Mb25nVGVybVJlY29uc3RydWN0X1MzMl9JICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19Mb25nVGVybVJlY29uc3RydWN0X1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX01EQ1RGd2RfUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX01EQ1RGd2RfUzMyLCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX01EQ1RJbnZfUzMyX1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX01EQ1RJbnZfUzMyX1MxNiwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19Ob2lzZWxlc3NEZWNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19Ob2lzZWxlc3NEZWNvZGUsIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfUXVhbnRJbnZfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfUXVhbnRJbnZfUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfVW5wYWNrQURJRkhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfVW5wYWNrQURJRkhlYWRlciwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19VbnBhY2tBRFRTRnJhbWVIZWFkZXIgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19VbnBhY2tBRFRTRnJhbWVIZWFkZXIsIE9NWEFDQUFDX1NVRkZJWCkKLQotCi0jZGVmaW5lIG9teEFDTVAzX0h1ZmZtYW5EZWNvZGVfUzMyICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX0h1ZmZtYW5EZWNvZGVfUzMyLCBPTVhBQ01QM19TVUZGSVgpCi0jZGVmaW5lIG9teEFDTVAzX0h1ZmZtYW5EZWNvZGVTZmJfUzMyICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX0h1ZmZtYW5EZWNvZGVTZmJfUzMyLCBPTVhBQ01QM19TVUZGSVgpCi0jZGVmaW5lIG9teEFDTVAzX0h1ZmZtYW5EZWNvZGVTZmJNYnBfUzMyICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX0h1ZmZtYW5EZWNvZGVTZmJNYnBfUzMyLCBPTVhBQ01QM19TVUZGSVgpCi0jZGVmaW5lIG9teEFDTVAzX01EQ1RJbnZfUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX01EQ1RJbnZfUzMyLCBPTVhBQ01QM19TVUZGSVgpCi0jZGVmaW5lIG9teEFDTVAzX1JlUXVhbnRpemVfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1JlUXVhbnRpemVfUzMyX0ksIE9NWEFDTVAzX1NVRkZJWCkKLSNkZWZpbmUgb214QUNNUDNfUmVRdWFudGl6ZVNmYl9TMzJfSSAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfUmVRdWFudGl6ZVNmYl9TMzJfSSwgT01YQUNNUDNfU1VGRklYKQotI2RlZmluZSBvbXhBQ01QM19TeW50aFBRTUZfUzMyX1MxNiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19TeW50aFBRTUZfUzMyX1MxNiwgT01YQUNNUDNfU1VGRklYKQotI2RlZmluZSBvbXhBQ01QM19VbnBhY2tGcmFtZUhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19VbnBhY2tGcmFtZUhlYWRlciwgT01YQUNNUDNfU1VGRklYKQotI2RlZmluZSBvbXhBQ01QM19VbnBhY2tTY2FsZUZhY3RvcnNfUzggICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19VbnBhY2tTY2FsZUZhY3RvcnNfUzgsIE9NWEFDTVAzX1NVRkZJWCkKLSNkZWZpbmUgb214QUNNUDNfVW5wYWNrU2lkZUluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfVW5wYWNrU2lkZUluZm8sIE9NWEFDTVAzX1NVRkZJWCkKLQotI2RlZmluZSBvbXhJQ0pQX0NvcHlFeHBhbmRfVThfQzMgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0NvcHlFeHBhbmRfVThfQzMsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVEZ3ZF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVEZ3ZF9TMTYsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVEZ3ZF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVEZ3ZF9TMTZfSSwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENUSW52X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUSW52X1MxNiwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENUSW52X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUSW52X1MxNl9JLCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEZ3ZF9NdWx0aXBsZV9TMTYgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEZ3ZF9NdWx0aXBsZV9TMTYsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50RndkX1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50RndkX1MxNiwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENUUXVhbnRGd2RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRGd2RfUzE2X0ksIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50RndkVGFibGVJbml0ICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50RndkVGFibGVJbml0LCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEludl9NdWx0aXBsZV9TMTYgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEludl9NdWx0aXBsZV9TMTYsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50SW52X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50SW52X1MxNiwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENUUXVhbnRJbnZfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRJbnZfUzE2X0ksIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50SW52VGFibGVJbml0ICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50SW52VGFibGVJbml0LCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EZWNvZGVIdWZmbWFuOHg4X0RpcmVjdF9TMTZfQzEgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EZWNvZGVIdWZmbWFuOHg4X0RpcmVjdF9TMTZfQzEsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RlY29kZUh1ZmZtYW5TcGVjR2V0QnVmU2l6ZV9VOCAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RlY29kZUh1ZmZtYW5TcGVjR2V0QnVmU2l6ZV9VOCwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRGVjb2RlSHVmZm1hblNwZWNJbml0X1U4ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRGVjb2RlSHVmZm1hblNwZWNJbml0X1U4LCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9FbmNvZGVIdWZmbWFuOHg4X0RpcmVjdF9TMTZfVTFfQzEgICAgICAgICBPTVhDQVRCQVIoSUNKUF9FbmNvZGVIdWZmbWFuOHg4X0RpcmVjdF9TMTZfVTFfQzEsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0VuY29kZUh1ZmZtYW5TcGVjR2V0QnVmU2l6ZV9VOCAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0VuY29kZUh1ZmZtYW5TcGVjR2V0QnVmU2l6ZV9VOCwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRW5jb2RlSHVmZm1hblNwZWNJbml0X1U4ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRW5jb2RlSHVmZm1hblNwZWNJbml0X1U4LCBPTVhJQ0pQX1NVRkZJWCkKLQotI2RlZmluZSBvbXhJUEJNX0FkZENfVThfQzFSX1NmcyAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUEJNX0FkZENfVThfQzFSX1NmcywgT01YSVBCTV9TVUZGSVgpCi0jZGVmaW5lIG9teElQQk1fQ29weV9VOF9DMVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQk1fQ29weV9VOF9DMVIsIE9NWElQQk1fU1VGRklYKQotI2RlZmluZSBvbXhJUEJNX0NvcHlfVThfQzNSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUEJNX0NvcHlfVThfQzNSLCBPTVhJUEJNX1NVRkZJWCkKLSNkZWZpbmUgb214SVBCTV9NaXJyb3JfVThfQzFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBCTV9NaXJyb3JfVThfQzFSLCBPTVhJUEJNX1NVRkZJWCkKLSNkZWZpbmUgb214SVBCTV9NdWxDX1U4X0MxUl9TZnMgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBCTV9NdWxDX1U4X0MxUl9TZnMsIE9NWElQQk1fU1VGRklYKQotCi0jZGVmaW5lIG9teElQQ1NfQ29sb3JUd2lzdFExNF9VOF9DM1IgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfQ29sb3JUd2lzdFExNF9VOF9DM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX0JHUjU2NVRvWUNiQ3I0MjBMU19NQ1VfVTE2X1MxNl9DM1AzUiAgICAgIE9NWENBVEJBUihJUENTX0JHUjU2NVRvWUNiQ3I0MjBMU19NQ1VfVTE2X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfQkdSNTY1VG9ZQ2JDcjQyMkxTX01DVV9VMTZfUzE2X0MzUDNSICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSNTY1VG9ZQ2JDcjQyMkxTX01DVV9VMTZfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19CR1I1NjVUb1lDYkNyNDQ0TFNfTUNVX1UxNl9TMTZfQzNQM1IgICAgICBPTVhDQVRCQVIoSVBDU19CR1I1NjVUb1lDYkNyNDQ0TFNfTUNVX1UxNl9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX0JHUjg4OFRvWUNiQ3I0MjBMU19NQ1VfVThfUzE2X0MzUDNSICAgICAgIE9NWENBVEJBUihJUENTX0JHUjg4OFRvWUNiQ3I0MjBMU19NQ1VfVThfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19CR1I4ODhUb1lDYkNyNDIyTFNfTUNVX1U4X1MxNl9DM1AzUiAgICAgICBPTVhDQVRCQVIoSVBDU19CR1I4ODhUb1lDYkNyNDIyTFNfTUNVX1U4X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfQkdSODg4VG9ZQ2JDcjQ0NExTX01DVV9VOF9TMTZfQzNQM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSODg4VG9ZQ2JDcjQ0NExTX01DVV9VOF9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwUnN6Q3NjUm90QkdSX1U4X1AzQzNSICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwUnN6Q3NjUm90QkdSX1U4X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMFJzelJvdF9VOF9QM1IgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMFJzelJvdF9VOF9QM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwVG9CR1I1NjVfVThfVTE2X1AzQzNSICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwVG9CR1I1NjVfVThfVTE2X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMFRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMFRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlJzekNzY1JvdEJHUl9VOF9QM0MzUiAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlJzekNzY1JvdEJHUl9VOF9QM0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfQ2JZQ3JZNDIyUnN6Q3NjUm90QkdSX1U4X1UxNl9DMlIgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfQ2JZQ3JZNDIyUnN6Q3NjUm90QkdSX1U4X1UxNl9DMlIsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyUnN6Um90X1U4X1AzUiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyUnN6Um90X1U4X1AzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiWUNyNDIyVG9CR1I1NjVfVThfVTE2X0MyQzNSICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiWUNyNDIyVG9CR1I1NjVfVThfVTE2X0MyQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYllDcjQyMlRvQkdSODg4X1U4X0MyQzNSICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYllDcjQyMlRvQkdSODg4X1U4X0MyQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX0NiWUNyWTQyMlRvWUNiQ3I0MjBSb3RhdGVfVThfQzJQM1IgICAgICAgIE9NWENBVEJBUihJUENTX0NiWUNyWTQyMlRvWUNiQ3I0MjBSb3RhdGVfVThfQzJQM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyVG9ZQ2JDcjQyMFJvdGF0ZV9VOF9QM1IgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyVG9ZQ2JDcjQyMFJvdGF0ZV9VOF9QM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDQ0VG9CR1I1NjVfVThfVTE2X0MzUiAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDQ0VG9CR1I1NjVfVThfVTE2X0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0NDRUb0JHUjU2NV9VOF9VMTZfUDNDM1IgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0NDRUb0JHUjU2NV9VOF9VMTZfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDQ0VG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDQ0VG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0NDRUb0JHUjg4OF9VOF9DM1IgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0NDRUb0JHUjg4OF9VOF9DM1IsIE9NWElQQ1NfU1VGRklYKQotCi0jZGVmaW5lIG9teElQUFBfRGVibG9ja19Ib3JFZGdlX1U4X0kgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfRGVibG9ja19Ib3JFZGdlX1U4X0ksIE9NWElQUFBfU1VGRklYKQotI2RlZmluZSBvbXhJUFBQX0RlYmxvY2tfVmVyRWRnZV9VOF9JICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0RlYmxvY2tfVmVyRWRnZV9VOF9JLCBPTVhJUFBQX1NVRkZJWCkKLSNkZWZpbmUgb214SVBQUF9GaWx0ZXJGSVJfVThfQzFSICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9GaWx0ZXJGSVJfVThfQzFSLCBPTVhJUFBQX1NVRkZJWCkKLSNkZWZpbmUgb214SVBQUF9GaWx0ZXJNZWRpYW5fVThfQzFSICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9GaWx0ZXJNZWRpYW5fVThfQzFSLCBPTVhJUFBQX1NVRkZJWCkKLSNkZWZpbmUgb214SVBQUF9HZXRDZW50cmFsTW9tZW50X1M2NCAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9HZXRDZW50cmFsTW9tZW50X1M2NCwgT01YSVBQUF9TVUZGSVgpCi0jZGVmaW5lIG9teElQUFBfR2V0U3BhdGlhbE1vbWVudF9TNjQgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfR2V0U3BhdGlhbE1vbWVudF9TNjQsIE9NWElQUFBfU1VGRklYKQotI2RlZmluZSBvbXhJUFBQX01vbWVudEdldFN0YXRlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX01vbWVudEdldFN0YXRlU2l6ZSwgT01YSVBQUF9TVUZGSVgpCi0jZGVmaW5lIG9teElQUFBfTW9tZW50SW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfTW9tZW50SW5pdCwgT01YSVBQUF9TVUZGSVgpCi0jZGVmaW5lIG9teElQUFBfTW9tZW50c19VOF9DMVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfTW9tZW50c19VOF9DMVIsIE9NWElQUFBfU1VGRklYKQotI2RlZmluZSBvbXhJUFBQX01vbWVudHNfVThfQzNSICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX01vbWVudHNfVThfQzNSLCBPTVhJUFBQX1NVRkZJWCkKLQotI2RlZmluZSBvbXhTUF9CbG9ja0V4cF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9CbG9ja0V4cF9TMTYsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfQmxvY2tFeHBfUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfQmxvY2tFeHBfUzMyLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0NvcHlfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0NvcHlfUzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0RvdFByb2RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0RvdFByb2RfUzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0RvdFByb2RfUzE2X1NmcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0RvdFByb2RfUzE2X1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRGd2RfQ1RvQ19TQzE2X1NmcyAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRGd2RfQ1RvQ19TQzE2X1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRGd2RfQ1RvQ19TQzMyX1NmcyAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRGd2RfQ1RvQ19TQzMyX1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRGd2RfUlRvQ0NTX1MxNlMzMl9TZnMgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRGd2RfUlRvQ0NTX1MxNlMzMl9TZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZURndkX1JUb0NDU19TMzJfU2ZzICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZURndkX1JUb0NDU19TMzJfU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEdldEJ1ZlNpemVfQ19TQzE2ICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEdldEJ1ZlNpemVfQ19TQzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEdldEJ1ZlNpemVfQ19TQzMyICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEdldEJ1ZlNpemVfQ19TQzMyLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEdldEJ1ZlNpemVfUl9TMTZTMzIgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEdldEJ1ZlNpemVfUl9TMTZTMzIsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZUR2V0QnVmU2l6ZV9SX1MzMiAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUR2V0QnVmU2l6ZV9SX1MzMiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRJbml0X0NfU0MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbml0X0NfU0MxNiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRJbml0X0NfU0MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbml0X0NfU0MzMiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRJbml0X1JfUzE2UzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbml0X1JfUzE2UzMyLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEluaXRfUl9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEluaXRfUl9TMzIsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZUSW52X0NDU1RvUl9TMzJfU2ZzICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW52X0NDU1RvUl9TMzJfU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEludl9DQ1NUb1JfUzMyUzE2X1NmcyAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEludl9DQ1NUb1JfUzMyUzE2X1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRJbnZfQ1RvQ19TQzE2X1NmcyAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbnZfQ1RvQ19TQzE2X1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRJbnZfQ1RvQ19TQzMyX1NmcyAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbnZfQ1RvQ19TQzMyX1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GaWx0ZXJNZWRpYW5fUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GaWx0ZXJNZWRpYW5fUzMyLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZpbHRlck1lZGlhbl9TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZpbHRlck1lZGlhbl9TMzJfSSwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GSVJfRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJfRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GSVJfRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJfRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZJUl9EaXJlY3RfUzE2X0lTZnMgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUl9EaXJlY3RfUzE2X0lTZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRklSX0RpcmVjdF9TMTZfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklSX0RpcmVjdF9TMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZJUk9uZV9EaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUk9uZV9EaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZJUk9uZV9EaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUk9uZV9EaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRklST25lX0RpcmVjdF9TMTZfSVNmcyAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklST25lX0RpcmVjdF9TMTZfSVNmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GSVJPbmVfRGlyZWN0X1MxNl9TZnMgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJPbmVfRGlyZWN0X1MxNl9TZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfSUlSX0JpUXVhZERpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlSX0JpUXVhZERpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfSUlSX0JpUXVhZERpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlSX0JpUXVhZERpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9JSVJfRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJfRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9JSVJfRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJfRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0lJUk9uZV9CaVF1YWREaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUk9uZV9CaVF1YWREaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0lJUk9uZV9CaVF1YWREaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUk9uZV9CaVF1YWREaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfSUlST25lX0RpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlST25lX0RpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfSUlST25lX0RpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlST25lX0RpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQotCi0jZGVmaW5lIG9teFZDQ09NTV9BdmVyYWdlXzE2eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9BdmVyYWdlXzE2eCwgT01YVkNDT01NX1NVRkZJWCkKLSNkZWZpbmUgb214VkNDT01NX0F2ZXJhZ2VfOHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0F2ZXJhZ2VfOHgsIE9NWFZDQ09NTV9TVUZGSVgpCi0jZGVmaW5lIG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2sgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2ssIE9NWFZDQ09NTV9TVUZGSVgpCi0jZGVmaW5lIG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FEICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FELCBPTVhWQ0NPTU1fU1VGRklYKQotI2RlZmluZSBvbXhWQ0NPTU1fQ29weTE2eDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQ29weTE2eDE2LCBPTVhWQ0NPTU1fU1VGRklYKQotI2RlZmluZSBvbXhWQ0NPTU1fQ29weTh4OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQ29weTh4OCwgT01YVkNDT01NX1NVRkZJWCkKLSNkZWZpbmUgb214VkNDT01NX0V4cGFuZEZyYW1lX0kgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0V4cGFuZEZyYW1lX0ksIE9NWFZDQ09NTV9TVUZGSVgpCi0jZGVmaW5lIG9teFZDQ09NTV9MaW1pdE1WVG9SZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9MaW1pdE1WVG9SZWN0LCBPTVhWQ0NPTU1fU1VGRklYKQotI2RlZmluZSBvbXhWQ0NPTU1fU0FEXzE2eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fU0FEXzE2eCwgT01YVkNDT01NX1NVRkZJWCkKLSNkZWZpbmUgb214VkNDT01NX1NBRF84eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX1NBRF84eCwgT01YVkNDT01NX1NVRkZJWCkKLQotI2RlZmluZSBvbXhWQ000UDEwX0F2ZXJhZ2VfNHggICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0F2ZXJhZ2VfNHgsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSSAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0RlYmxvY2tDaHJvbWFfSSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSSAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRGVibG9ja0x1bWFfSSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQyAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQywgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkIE9NWENBVEJBUihWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0ksIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9HZXRWTENJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9HZXRWTENJbmZvLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZCAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfTUVHZXRCdWZTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfTUVHZXRCdWZTaXplLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9NRUluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9NRUluaXQsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2ICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2LCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0ICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0LCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfU0FEXzR4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FEXzR4LCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9TQURRdWFyXzE2eCAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TQURRdWFyXzE2eCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfU0FEUXVhcl80eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FEUXVhcl80eCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfU0FEUXVhcl84eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FEUXVhcl84eCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfU0FURF80eDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FURF80eDQsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpciAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpciwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQyAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQywgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDLCBPTVhWQ000UDEwX1NVRkZJWCkKLQotI2RlZmluZSBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2ICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2LCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OCAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OCwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDggICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDgsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9EQ1Q4eDhibGsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EQ1Q4eDhibGssIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0VuY29kZU1WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0VuY29kZU1WLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0ZpbmRNVnByZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0ZpbmRNVnByZWQsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9JRENUOHg4YmxrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9JRENUOHg4YmxrLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfTUNSZWNvbkJsb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfTUNSZWNvbkJsb2NrLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfTUVHZXRCdWZTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfTUVHZXRCdWZTaXplLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfTUVJbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfTUVJbml0LCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfUXVhbnRJbnRlcl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUXVhbnRJbnRlcl9JLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfUXVhbnRJbnRyYV9JICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUXVhbnRJbnRyYV9JLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUXVhbnRJbnZJbnRlcl9JLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUXVhbnRJbnZJbnRyYV9JLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSwgT01YVkNNNFAyX1NVRkZJWCkKLQotCi0jZW5kaWYgLyogX2FybU9NWF9oXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9hcGkvb214dHlwZXMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL29teHR5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMmNiMGQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9hcGkvb214dHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioKLSAqIEZpbGU6IG9teHR5cGVzLmgKLSAqIEJyaWVmOiBEZWZpbmVzIGJhc2ljIERhdGEgdHlwZXMgdXNlZCBpbiBPcGVuTUFYIHYxLjAuMiBoZWFkZXIgZmlsZXMuCi0gKgotICogQ29weXJpZ2h0IKkgMjAwNS0yMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0gKgotICogVGhlc2UgbWF0ZXJpYWxzIGFyZSBwcm90ZWN0ZWQgYnkgY29weXJpZ2h0IGxhd3MgYW5kIGNvbnRhaW4gbWF0ZXJpYWwgCi0gKiBwcm9wcmlldGFyeSB0byB0aGUgS2hyb25vcyBHcm91cCwgSW5jLiAgWW91IG1heSB1c2UgdGhlc2UgbWF0ZXJpYWxzIAotICogZm9yIGltcGxlbWVudGluZyBLaHJvbm9zIHNwZWNpZmljYXRpb25zLCB3aXRob3V0IGFsdGVyaW5nIG9yIHJlbW92aW5nIAotICogYW55IHRyYWRlbWFyaywgY29weXJpZ2h0IG9yIG90aGVyIG5vdGljZSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uLgotICogCi0gKiBLaHJvbm9zIEdyb3VwIG1ha2VzIG5vLCBhbmQgZXhwcmVzc2x5IGRpc2NsYWltcyBhbnksIHJlcHJlc2VudGF0aW9ucyAKLSAqIG9yIHdhcnJhbnRpZXMsIGV4cHJlc3Mgb3IgaW1wbGllZCwgcmVnYXJkaW5nIHRoZXNlIG1hdGVyaWFscywgaW5jbHVkaW5nLCAKLSAqIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcyAKLSAqIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBvciBub24taW5mcmluZ2VtZW50IG9mIGFueSBpbnRlbGxlY3R1YWwgcHJvcGVydHkuIAotICogS2hyb25vcyBHcm91cCBtYWtlcyBubywgYW5kIGV4cHJlc3NseSBkaXNjbGFpbXMgYW55LCB3YXJyYW50aWVzLCBleHByZXNzIAotICogb3IgaW1wbGllZCwgcmVnYXJkaW5nIHRoZSBjb3JyZWN0bmVzcywgYWNjdXJhY3ksIGNvbXBsZXRlbmVzcywgdGltZWxpbmVzcywgCi0gKiBhbmQgcmVsaWFiaWxpdHkgb2YgdGhlc2UgbWF0ZXJpYWxzLiAKLSAqCi0gKiBVbmRlciBubyBjaXJjdW1zdGFuY2VzIHdpbGwgdGhlIEtocm9ub3MgR3JvdXAsIG9yIGFueSBvZiBpdHMgUHJvbW90ZXJzLCAKLSAqIENvbnRyaWJ1dG9ycyBvciBNZW1iZXJzIG9yIHRoZWlyIHJlc3BlY3RpdmUgcGFydG5lcnMsIG9mZmljZXJzLCBkaXJlY3RvcnMsIAotICogZW1wbG95ZWVzLCBhZ2VudHMgb3IgcmVwcmVzZW50YXRpdmVzIGJlIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMsIHdoZXRoZXIgCi0gKiBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBmb3IgbG9zdCByZXZlbnVlcywgCi0gKiBsb3N0IHByb2ZpdHMsIG9yIG90aGVyd2lzZSwgYXJpc2luZyBmcm9tIG9yIGluIGNvbm5lY3Rpb24gd2l0aCB0aGVzZSAKLSAqIG1hdGVyaWFscy4KLSAqIAotICogS2hyb25vcyBhbmQgT3Blbk1BWCBhcmUgdHJhZGVtYXJrcyBvZiB0aGUgS2hyb25vcyBHcm91cCBJbmMuIAotICoKLSAqLwotICAKLSNpZm5kZWYgX09NWFRZUEVTX0hfCi0jZGVmaW5lIF9PTVhUWVBFU19IXwotCi0jaW5jbHVkZSA8bGltaXRzLmg+IAotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jZGVmaW5lIE9NWF9JTgotI2RlZmluZSBPTVhfT1VUCi0jZGVmaW5lIE9NWF9JTk9VVAotCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgCi0gICAgLyogTWFuZGF0b3J5IHJldHVybiBjb2RlcyAtIHVzZSBjYXNlcyBhcmUgZXhwbGljaXRseSBkZXNjcmliZWQgZm9yIGVhY2ggZnVuY3Rpb24gKi8KLSAgICBPTVhfU3RzX05vRXJyICAgICAgICAgICAgICAgICAgICA9ICAwLCAgICAvKiBObyBlcnJvciwgdGhlIGZ1bmN0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgKi8KLSAgICBPTVhfU3RzX0VyciAgICAgICAgICAgICAgICAgICAgICA9IC0yLCAgICAvKiBVbmtub3duL3Vuc3BlY2lmaWVkIGVycm9yICovICAgIAotICAgIE9NWF9TdHNfSW52YWxpZEJpdHN0cmVhbVZhbEVyciAgID0gLTE4MiwgIC8qIEludmFsaWQgdmFsdWUgZGV0ZWN0ZWQgZHVyaW5nIGJpdHN0cmVhbSBwcm9jZXNzaW5nICovICAgIAotICAgIE9NWF9TdHNfTWVtQWxsb2NFcnIgICAgICAgICAgICAgID0gLTksICAgIC8qIE5vdCBlbm91Z2ggbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIG9wZXJhdGlvbiAqLwotICAgIE9NWF9TdHNBQ0FBQ19HYWluQ3RyRXJyICAgIAkgICAgID0gLTE1OSwgIC8qIEFBQzogVW5zdXBwb3J0ZWQgZ2FpbiBjb250cm9sIGRhdGEgZGV0ZWN0ZWQgKi8KLSAgICBPTVhfU3RzQUNBQUNfUHJnTnVtRXJyICAgICAgICAgICA9IC0xNjcsICAvKiBBQUM6IEludmFsaWQgbnVtYmVyIG9mIGVsZW1lbnRzIGZvciBvbmUgcHJvZ3JhbSAgICovCi0gICAgT01YX1N0c0FDQUFDX0NvZWZWYWxFcnIgICAgICAgICAgPSAtMTYzLCAgLyogQUFDOiBJbnZhbGlkIHF1YW50aXplZCBjb2VmZmljaWVudCB2YWx1ZSAgICAgICAgICAqLyAgICAgCi0gICAgT01YX1N0c0FDQUFDX01heFNmYkVyciAgICAgICAgICAgPSAtMTYyLCAgLyogQUFDOiBJbnZhbGlkIG1heFNmYiB2YWx1ZSBpbiByZWxhdGlvbiB0byBudW1Td2IgKi8gICAgCi0JT01YX1N0c0FDQUFDX1Bsc0RhdGFFcnIJCSAgICAgPSAtMTYwLCAgLyogQUFDOiBwdWxzZSBlc2NhcGUgc2VxdWVuY2UgZGF0YSBlcnJvciAqLwotCi0gICAgLyogT3B0aW9uYWwgcmV0dXJuIGNvZGVzIC0gdXNlIGNhc2VzIGFyZSBleHBsaWNpdGx5IGRlc2NyaWJlZCBmb3IgZWFjaCBmdW5jdGlvbiovCi0gICAgT01YX1N0c19CYWRBcmdFcnIgICAgICAgICAgICAgICAgPSAtNSwgICAgLyogQmFkIEFyZ3VtZW50cyAqLwotCi0gICAgT01YX1N0c0FDQUFDX1Ruc051bUZpbHRFcnIgICAgICAgPSAtMTU3LCAgLyogQUFDOiBJbnZhbGlkIG51bWJlciBvZiBUTlMgZmlsdGVycyAgKi8KLSAgICBPTVhfU3RzQUNBQUNfVG5zTGVuRXJyICAgICAgICAgICA9IC0xNTYsICAvKiBBQUM6IEludmFsaWQgVE5TIHJlZ2lvbiBsZW5ndGggICovICAgCi0gICAgT01YX1N0c0FDQUFDX1Ruc09yZGVyRXJyICAgICAgICAgPSAtMTU1LCAgLyogQUFDOiBJbnZhbGlkIG9yZGVyIG9mIFROUyBmaWx0ZXIgICovICAgICAgICAgICAgICAgICAgCi0gICAgT01YX1N0c0FDQUFDX1Ruc0NvZWZSZXNFcnIgICAgICAgPSAtMTU0LCAgLyogQUFDOiBJbnZhbGlkIGJpdC1yZXNvbHV0aW9uIGZvciBUTlMgZmlsdGVyIGNvZWZmaWNpZW50cyAgKi8KLSAgICBPTVhfU3RzQUNBQUNfVG5zQ29lZkVyciAgICAgICAgICA9IC0xNTMsICAvKiBBQUM6IEludmFsaWQgVE5TIGZpbHRlciBjb2VmZmljaWVudHMgICovICAgICAgICAgICAgICAgICAgCi0gICAgT01YX1N0c0FDQUFDX1Ruc0RpcmVjdEVyciAgICAgICAgPSAtMTUyLCAgLyogQUFDOiBJbnZhbGlkIFROUyBmaWx0ZXIgZGlyZWN0aW9uICAqLyAgCi0KLSAgICBPTVhfU3RzSUNKUF9KUEVHTWFya2VyRXJyICAgICAgICA9IC0xODMsICAvKiBKUEVHIG1hcmtlciBlbmNvdW50ZXJlZCB3aXRoaW4gYW4gZW50cm9weS1jb2RlZCBibG9jazsgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIdWZmbWFuIGRlY29kaW5nIG9wZXJhdGlvbiB0ZXJtaW5hdGVkIGVhcmx5LiAgICAgICAgICAgKi8KLSAgICBPTVhfU3RzSUNKUF9KUEVHTWFya2VyICAgICAgICAgICA9IC0xODEsICAvKiBKUEVHIG1hcmtlciBlbmNvdW50ZXJlZDsgSHVmZm1hbiBkZWNvZGluZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9wZXJhdGlvbiB0ZXJtaW5hdGVkIGVhcmx5LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIE9NWF9TdHNJUFBQX0NvbnRleHRNYXRjaEVyciAgICAgID0gLTE3LCAgIC8qIENvbnRleHQgcGFyYW1ldGVyIGRvZXNuJ3QgbWF0Y2ggdG8gdGhlIG9wZXJhdGlvbiAqLwotCi0gICAgT01YX1N0c1NQX0V2ZW5NZWRpYW5NYXNrU2l6ZUVyciAgPSAtMTgwLCAgLyogRXZlbiBzaXplIG9mIHRoZSBNZWRpYW4gRmlsdGVyIG1hc2sgd2FzIHJlcGxhY2VkIGJ5IHRoZSBvZGQgb25lICovCi0KLSAgICBPTVhfU3RzX01heGltdW1FbnVtZXJhdGlvbiAgICAgICA9IElOVF9NQVggIC8qUGxhY2Vob2xkZXIsIGZvcmNlcyBlbnVtIG9mIHNpemUgT01YX0lOVCovCi0gICAgCi0gfSBPTVhSZXN1bHQ7ICAgICAgICAgIC8qKiBSZXR1cm4gdmFsdWUgb3IgZXJyb3IgdmFsdWUgcmV0dXJuZWQgZnJvbSBhIGZ1bmN0aW9uLiBJZGVudGljYWwgdG8gT01YX0lOVCAqLwotCi0gCi0vKiBPTVhfVTggKi8KLXR5cGVkZWYgdWludDhfdCBPTVhfVTg7Ci0gCi0vKiBPTVhfUzggKi8KLXR5cGVkZWYgaW50OF90IE9NWF9TODsKLSAKLS8qIE9NWF9VMTYgKi8KLXR5cGVkZWYgdWludDE2X3QgT01YX1UxNjsKLQotLyogT01YX1MxNiAqLwotdHlwZWRlZiBpbnQxNl90IE9NWF9TMTY7Ci0KLS8qIE9NWF9VMzIgKi8KLXR5cGVkZWYgdWludDMyX3QgT01YX1UzMjsKLQotLyogT01YX1MzMiAqLwotdHlwZWRlZiBpbnQzMl90IE9NWF9TMzI7Ci0KLS8qIE9NWF9VNjQgJiBPTVhfUzY0ICovCi0jaWYgZGVmaW5lZCggX1dJTjMyICkgfHwgZGVmaW5lZCAoIF9XSU42NCApCi0gICAgdHlwZWRlZiBfX2ludDY0IE9NWF9TNjQ7IC8qKiBTaWduZWQgNjQtYml0IGludGVnZXIgKi8KLSAgICB0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgT01YX1U2NDsgLyoqIFVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCi0gICAgI2RlZmluZSBPTVhfTUlOX1M2NAkJCSgweDgwMDAwMDAwMDAwMDAwMDBpNjQpCi0gICAgI2RlZmluZSBPTVhfTUlOX1U2NAkJCSgweDAwMDAwMDAwMDAwMDAwMDBpNjQpCi0gICAgI2RlZmluZSBPTVhfTUFYX1M2NAkJCSgweDdGRkZGRkZGRkZGRkZGRkZpNjQpCi0gICAgI2RlZmluZSBPTVhfTUFYX1U2NAkJCSgweEZGRkZGRkZGRkZGRkZGRkZpNjQpCi0jZWxzZQotICAgIHR5cGVkZWYgaW50NjRfdCBPTVhfUzY0OyAvKiogU2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCi0gICAgdHlwZWRlZiB1aW50NjRfdCBPTVhfVTY0OyAvKiogVW5zaWduZWQgNjQtYml0IGludGVnZXIgKi8KLSAgICAjZGVmaW5lIE9NWF9NSU5fUzY0CQkJKDB4ODAwMDAwMDAwMDAwMDAwMExMKQotICAgICNkZWZpbmUgT01YX01JTl9VNjQJCQkoMHgwMDAwMDAwMDAwMDAwMDAwTEwpCi0gICAgI2RlZmluZSBPTVhfTUFYX1M2NAkJCSgweDdGRkZGRkZGRkZGRkZGRkZMTCkKLSAgICAjZGVmaW5lIE9NWF9NQVhfVTY0CQkJKDB4RkZGRkZGRkZGRkZGRkZGRkxMKQotI2VuZGlmCi0KLS8qIE9NWF9TQzggKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIE9NWF9TOCBSZTsgLyoqIFJlYWwgcGFydCAqLwotICBPTVhfUzggSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKLQkKLX0gT01YX1NDODsgLyoqIFNpZ25lZCA4LWJpdCBjb21wbGV4IG51bWJlciAqLwotCi0KLS8qIE9NWF9TQzE2ICovCi10eXBlZGVmIHN0cnVjdAotewotICBPTVhfUzE2IFJlOyAvKiogUmVhbCBwYXJ0ICovCi0gIE9NWF9TMTYgSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKLQkKLX0gT01YX1NDMTY7IC8qKiBTaWduZWQgMTYtYml0IGNvbXBsZXggbnVtYmVyICovCi0KLQotLyogT01YX1NDMzIgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIE9NWF9TMzIgUmU7IC8qKiBSZWFsIHBhcnQgKi8KLSAgT01YX1MzMiBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQotCQotfSBPTVhfU0MzMjsgLyoqIFNpZ25lZCAzMi1iaXQgY29tcGxleCBudW1iZXIgKi8KLQotCi0vKiBPTVhfU0M2NCAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgT01YX1M2NCBSZTsgLyoqIFJlYWwgcGFydCAqLwotICBPTVhfUzY0IEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCi0JCi19IE9NWF9TQzY0OyAvKiogU2lnbmVkIDY0LWJpdCBjb21wbGV4IG51bWJlciAqLwotCi0KLS8qIE9NWF9GMzIgKi8KLXR5cGVkZWYgZmxvYXQgT01YX0YzMjsgLyoqIFNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQsSUVFRSA3NTQgKi8KLQotCi0vKiBPTVhfRjY0ICovCi10eXBlZGVmIGRvdWJsZSBPTVhfRjY0OyAvKiogRG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCxJRUVFIDc1NCAqLwotCi0KLS8qIE9NWF9JTlQgKi8KLXR5cGVkZWYgaW50IE9NWF9JTlQ7IC8qKiBzaWduZWQgaW50ZWdlciBjb3JyZXNwb25kaW5nIHRvIG1hY2hpbmUgd29yZCBsZW5ndGgsIGhhcyBtYXhpbXVtIHNpZ25lZCB2YWx1ZSBJTlRfTUFYKi8KLQotCi0jZGVmaW5lIE9NWF9NSU5fUzggIAkgICAJKC0xMjgpCi0jZGVmaW5lIE9NWF9NSU5fVTggIAkJMAotI2RlZmluZSBPTVhfTUlOX1MxNgkJIAkoLTMyNzY4KQotI2RlZmluZSBPTVhfTUlOX1UxNgkJCTAKLSNkZWZpbmUgT01YX01JTl9TMzIJCQkoLTIxNDc0ODM2NDctMSkKLSNkZWZpbmUgT01YX01JTl9VMzIJCQkwCi0KLSNkZWZpbmUgT01YX01BWF9TOAkJCSgxMjcpCi0jZGVmaW5lIE9NWF9NQVhfVTgJCQkoMjU1KQotI2RlZmluZSBPTVhfTUFYX1MxNgkJCSgzMjc2NykKLSNkZWZpbmUgT01YX01BWF9VMTYJCQkoMHhGRkZGKQotI2RlZmluZSBPTVhfTUFYX1MzMgkJCSgyMTQ3NDgzNjQ3KQotI2RlZmluZSBPTVhfTUFYX1UzMgkJCSgweEZGRkZGRkZGKQotCi10eXBlZGVmIHZvaWQgT01YVm9pZDsKLQotI2lmbmRlZiBOVUxMCi0jZGVmaW5lIE5VTEwgKCh2b2lkKikwKQotI2VuZGlmCi0KLS8qKiBEZWZpbmVzIHRoZSBnZW9tZXRyaWMgcG9zaXRpb24gYW5kIHNpemUgb2YgYSByZWN0YW5nbGUsIAotICAqIHdoZXJlIHgseSBkZWZpbmVzIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgdG9wIGxlZnQgY29ybmVyCi0gICogb2YgdGhlIHJlY3RhbmdsZSwgd2l0aCBkaW1lbnNpb25zIHdpZHRoIGluIHRoZSB4LWRpcmVjdGlvbiAKLSAgKiBhbmQgaGVpZ2h0IGluIHRoZSB5LWRpcmVjdGlvbiAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCU9NWF9JTlQgeDsgICAgICAvKiogeC1jb29yZGluYXRlIG9mIHRvcCBsZWZ0IGNvcm5lciBvZiByZWN0YW5nbGUgKi8KLQlPTVhfSU5UIHk7ICAgICAgLyoqIHktY29vcmRpbmF0ZSBvZiB0b3AgbGVmdCBjb3JuZXIgb2YgcmVjdGFuZ2xlICovCi0JT01YX0lOVCB3aWR0aDsgIC8qKiBXaWR0aCBpbiB0aGUgeC1kaXJlY3Rpb24uICovCi0JT01YX0lOVCBoZWlnaHQ7IC8qKiBIZWlnaHQgaW4gdGhlIHktZGlyZWN0aW9uLiAqLwotfU9NWFJlY3Q7Ci0KLQotLyoqIERlZmluZXMgdGhlIGdlb21ldHJpYyBwb3NpdGlvbiBvZiBhIHBvaW50LCAqLwotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gT01YX0lOVCB4OyAvKiogeC1jb29yZGluYXRlICovCi0gT01YX0lOVCB5OwkvKiogeS1jb29yZGluYXRlICovCi0JCi19IE9NWFBvaW50OwotCi0KLS8qKiBEZWZpbmVzIHRoZSBkaW1lbnNpb25zIG9mIGEgcmVjdGFuZ2xlLCBvciByZWdpb24gb2YgaW50ZXJlc3QgaW4gYW4gaW1hZ2UgKi8KLXR5cGVkZWYgc3RydWN0IAotewotIE9NWF9JTlQgd2lkdGg7ICAvKiogV2lkdGggb2YgdGhlIHJlY3RhbmdsZSwgaW4gdGhlIHgtZGlyZWN0aW9uICovCi0gT01YX0lOVCBoZWlnaHQ7IC8qKiBIZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSwgaW4gdGhlIHktZGlyZWN0aW9uICovCi0JCi19IE9NWFNpemU7Ci0KLSNlbmRpZiAvKiBfT01YVFlQRVNfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYnVpbGRfdmMucGwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2J1aWxkX3ZjLnBsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNTljZGVkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYnVpbGRfdmMucGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotIyEvdXNyL2Jpbi9wZXJsCi0jCi0jIAotIyBGaWxlIE5hbWU6ICBidWlsZF92Yy5wbAotIyBPcGVuTUFYIERMOiB2MS4wLjIKLSMgUmV2aXNpb246ICAgOTY0MQotIyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotIyAKLSMgCi0jIAotIwotIyBUaGlzIGZpbGUgYnVpbGRzIHRoZSBPcGVuTUFYIERMIHZjIGRvbWFpbiBsaWJyYXJ5IG9teFZDLm8uCi0jCi0KLXVzZSBGaWxlOjpTcGVjOwotdXNlIHN0cmljdDsKLQotbXkgKCRDQywgJENDX09QVFMsICRBUywgJEFTX09QVFMsICRMSUIsICRMSUJfT1BUUywgJExJQl9UWVBFKTsKLQotJENDICAgICAgID0gJ2FybWNjJzsKLSRDQ19PUFRTICA9ICctLW5vX3VuYWxpZ25lZF9hY2Nlc3MgLS1jcHUgQVJNN1RETUkgLWMnOwotJEFTICAgICAgID0gJ2FybWFzbSc7Ci0kQVNfT1BUUyAgPSAnLS1ub191bmFsaWduZWRfYWNjZXNzIC0tY3B1IEFSTTdURE1JJzsKLSMgJExJQiAgICAgID0gJ2FybWxpbmsnOwotIyAkTElCX09QVFMgPSAnLS1wYXJ0aWFsIC1vJzsKLSMgJExJQl9UWVBFID0gJy5vJzsKLSRMSUIgICAgICA9ICdhcm1hcic7Ci0kTElCX09QVFMgPSAnLS1jcmVhdGUgLXInOwotJExJQl9UWVBFID0gJy5hJzsKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1teSAoQGhlYWRlcmxpc3QsIEBmaWxlbGlzdCwgJGhkLCAkZmlsZSwgJG9maWxlLCAkY29tbWFuZCwgJG9iamxpc3QsICRsaWJmaWxlLCAkaCk7Ci0KLSMgRGVmaW5lIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgaW5jbHVkZWQgaGVhZGVyIGZpbGVzLgotQGhlYWRlcmxpc3QgPSBxdyhhcGkgdmMvYXBpIHZjL200cDIvYXBpIHZjL200cDEwL2FwaSk7Ci0KLSMgRGVmaW5lIHRoZSBsaXN0IG9mIHNvdXJjZSBmaWxlcyB0byBjb21waWxlLgotb3BlbihGSUxFUywgJzxmaWxlbGlzdF92Yy50eHQnKSBvciBkaWUoIkNhbid0IG9wZW4gc291cmNlIGZpbGUgbGlzdFxuIik7Ci1AZmlsZWxpc3QgPSA8RklMRVM+OwotY2xvc2UoRklMRVMpOwotCi0jIEZpeCB0aGUgZmlsZSBzZXBhcmF0b3JzIGluIHRoZSBoZWFkZXIgcGF0aHMKLWZvcmVhY2ggJGggKEBoZWFkZXJsaXN0KQotewotICAgICAgICAkaCA9IEZpbGU6OlNwZWMtPmNhbm9ucGF0aCgkaCk7Ci19Ci0KLSMgQ3JlYXRlIHRoZSBpbmNsdWRlIHBhdGggdG8gYmUgcGFzc2VkIHRvIHRoZSBjb21waWxlcgotJGhkID0gJy1JJyAuIGpvaW4oJyAtSScsIEBoZWFkZXJsaXN0KTsKLQotIyBDcmVhdGUgdGhlIGJ1aWxkIGRpcmVjdG9yaWVzICIvbGliLyIgYW5kICIvb2JqLyIgKGlmIHRoZXkgYXJlIG5vdCB0aGVyZSBhbHJlYWR5KQotbWtkaXIgIm9iaiIsIDA3NzcgaWYgKCEgLWQgIm9iaiIpOwotbWtkaXIgImxpYiIsIDA3NzcgaWYgKCEgLWQgImxpYiIpOwotCi0kb2JqbGlzdCA9ICcnOwotCi0jIENvbXBpbGUgZWFjaCBmaWxlCi1mb3JlYWNoICRmaWxlIChAZmlsZWxpc3QpCi17Ci0JbXkgJGY7Ci0JbXkgJGJhc2U7Ci0JbXkgJGV4dDsKLQlteSAkb2JqZmlsZTsKLQotCWNob21wKCRmaWxlKTsKLQkkZmlsZSA9IEZpbGU6OlNwZWMtPmNhbm9ucGF0aCgkZmlsZSk7Ci0KLQkodW5kZWYsIHVuZGVmLCAkZikgPSBGaWxlOjpTcGVjLT5zcGxpdHBhdGgoJGZpbGUpOwotCWlmKCgkYmFzZSwgJGV4dCkgPSAkZiA9fiAvKC4rKVwuKFx3KSQvKQotCXsKLQkJJG9iamZpbGUgPSBGaWxlOjpTcGVjLT5jYXRmaWxlKCdvYmonLCAkYmFzZS4nLm8nKTsKLQotCQlpZigkZXh0IGVxICdjJykKLQkJewotCQkJJG9iamxpc3QgLj0gIiRvYmpmaWxlICI7Ci0JCQkkY29tbWFuZCA9ICRDQy4nICcuJENDX09QVFMuJyAnLiRoZC4nIC1vICcuJG9iamZpbGUuJyAnLiRmaWxlOwotCQkJcHJpbnQgIiRjb21tYW5kXG4iOwotCQkJc3lzdGVtKCRjb21tYW5kKTsKLQkJfQotCQllbHNpZigkZXh0IGVxICdzJykKLQkJewotCQkJJG9iamxpc3QgLj0gIiRvYmpmaWxlICI7Ci0JCQkkY29tbWFuZCA9ICRBUy4nICcuJEFTX09QVFMuJyAnLiRoZC4nIC1vICcuJG9iamZpbGUuJyAnLiRmaWxlOwotCQkJcHJpbnQgIiRjb21tYW5kXG4iOwotCQkJc3lzdGVtKCRjb21tYW5kKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXByaW50ICJJZ25vcmluZyBmaWxlOiAkZlxuIjsKLQkJfQotCX0KLQllbHNlCi0JewotCQlkaWUgIk5vIGZpbGUgZXh0ZW5zaW9uIGZvdW5kOiAkZlxuIjsKLQl9Ci19Ci0KLSMgRG8gdGhlIGZpbmFsIGxpbmsgc3RhZ2UgdG8gY3JlYXRlIHRoZSBsaWJyYXJpZXMuCi0kbGliZmlsZSA9IEZpbGU6OlNwZWMtPmNhdGZpbGUoJ2xpYicsICdvbXhWQycuJExJQl9UWVBFKTsKLSRjb21tYW5kID0gJExJQi4nICcuJExJQl9PUFRTLicgJy4kbGliZmlsZS4nICcuJG9iamxpc3Q7Ci1wcmludCAiJGNvbW1hbmRcbiI7Ci0oc3lzdGVtKCRjb21tYW5kKSA9PSAwKSBhbmQgcHJpbnQgIkJ1aWxkIHN1Y2Nlc3NmdWxcbiI7Ci0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvZmlsZWxpc3RfdmMudHh0IGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9maWxlbGlzdF92Yy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZjM0YWMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9maWxlbGlzdF92Yy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLi9hcGkvYXJtQ09NTS5oCi0uL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oCi0uL2FwaS9hcm1DT01NX1ZlcnNpb24uaAotLi9hcGkvYXJtT01YX1JlbGVhc2VWZXJzaW9uLmgKLS4vYXBpL29teHR5cGVzLmgKLS4vc3JjL2FybUNPTU0uYwotLi9zcmMvYXJtQ09NTV9CaXRzdHJlYW0uYwotLi92Yy9hcGkvYXJtVkMuaAotLi92Yy9hcGkvb214VkMuaAotLi92Yy9jb21tL3NyYy9hcm1WQ0NPTU1fQXZlcmFnZS5jCi0uL3ZjL2NvbW0vc3JjL2FybVZDQ09NTV9TQUQuYwotLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQXZlcmFnZV8xNnguYwotLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQXZlcmFnZV84eC5jCi0uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2suYwotLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRC5jCi0uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5MTZ4MTYuYwotLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OC5jCi0uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9FeHBhbmRGcmFtZV9JLmMKLS4vdmMvY29tbS9zcmMvb214VkNDT01NX0xpbWl0TVZUb1JlY3QuYwotLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fU0FEXzE2eC5jCi0uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9TQURfOHguYwotLi92Yy9tNHAxMC9hcGkvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ29tcGFyZU1vdGlvbkNvc3RUb01WLmMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVCbG9ja1BpeGVsLmMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyLmMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlcy5jCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0Z3ZFRyYW5zZm9ybVJlc2lkdWFsNHg0LmMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hLmMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYS5jCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkRpYWdfTHVtYS5jCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLmMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEuYwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQzR4NC5jCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1F1YW50VGFibGVzLmMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfU0FEUXVhci5jCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0LmMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2syeDIuYwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NC5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0F2ZXJhZ2VfNHguYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSS5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfR2V0VkxDSW5mby5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYS5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYS5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQy5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfTUVHZXRCdWZTaXplLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfTUVJbml0LmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2LmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NC5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDguYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURfNHguYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURRdWFyXzE2eC5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRFF1YXJfNHguYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURRdWFyXzh4LmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FURF80eDQuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbC5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMuYwotLi92Yy9tNHAyL2FwaS9hcm1WQ000UDJfRENUX1RhYmxlLmgKLS4vdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCi0uL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKLS4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0FDRENQcmVkaWN0LmMKLS4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZi5jCi0uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIuYwotLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2hlY2tWTENFc2NhcGVNb2RlLmMKLS4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NvbXBhcmVNVi5jCi0uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EQ1RfVGFibGUuYwotLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX2ludHJhLmMKLS4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19pbnRyYS5jCi0uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9GaWxsVkxDQnVmZmVyLmMKLS4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIuYwotLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfR2V0VkxDQml0cy5jCi0uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYwotLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfUHV0VkxDQml0cy5jCi0uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9TZXRQcmVkRGlyLmMKLS4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2LmMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDguYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LmMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDguYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRENUOHg4YmxrLmMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUC5jCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIuYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMuYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMuYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlTVYuYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyLmMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLmMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLmMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0ZpbmRNVnByZWQuYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfSURDVDh4OGJsay5jCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2suYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUVHZXRCdWZTaXplLmMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX01FSW5pdC5jCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIuYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhLmMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW50ZXJfSS5jCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludHJhX0kuYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JLmMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50cmFfSS5jCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlci5jCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYS5jCi0uL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3NyYy9hcm1DT01NLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3NyYy9hcm1DT01NLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZGJmNDEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9zcmMvYXJtQ09NTS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTUxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1DT01NLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZWZpbmVzIENvbW1vbiBBUElzIHVzZWQgYWNyb3NzIE9wZW5NQVggQVBJJ3MKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICAgICAvKiBNaXNjZWxsYW5lb3VzIEFyaXRobWV0aWMgb3BlcmF0aW9ucyAqLwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1Sb3VuZEZsb2F0VG9TMTYKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgc2hvcnQgaW50IGFmdGVyIHJvdW5kaW5nCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MxNiBmb3JtYXQKLSAqCi0gKi8KLQotT01YX1MxNiBhcm1Sb3VuZEZsb2F0VG9TMTYgKE9NWF9GNjQgVmFsdWUpCi17Ci0gICAgaWYgKFZhbHVlID4gMCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1MxNikoVmFsdWUgKyAuNSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1MxNikoVmFsdWUgLSAuNSk7Ci0gICAgfQotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1Sb3VuZEZsb2F0VG9TMzIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgaW50IGFmdGVyIHJvdW5kaW5nCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MzMiBmb3JtYXQKLSAqCi0gKi8KLQotT01YX1MzMiBhcm1Sb3VuZEZsb2F0VG9TMzIgKE9NWF9GNjQgVmFsdWUpCi17Ci0gICAgaWYgKFZhbHVlID4gMCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1MzMikoVmFsdWUgKyAuNSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1MzMikoVmFsdWUgLSAuNSk7Ci0gICAgfQotfQotLyoqCi0gKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvUzE2Ci0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHNob3J0IGludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMTYgZm9ybWF0Ci0gKgotICovCi0KLU9NWF9TMTYgYXJtU2F0Um91bmRGbG9hdFRvUzE2IChPTVhfRjY0IFZhbHVlKQotewotICAgIGlmIChWYWx1ZSA+IDApCi0gICAgewotICAgICAgICBWYWx1ZSArPSAwLjU7Ci0gICAgICAgIAotICAgICAgICBpZihWYWx1ZSA+IChPTVhfUzE2KU9NWF9NQVhfUzE2ICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChPTVhfUzE2KU9NWF9NQVhfUzE2OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChPTVhfUzE2KVZhbHVlOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIFZhbHVlIC09IDAuNTsKLQotICAgICAgICBpZihWYWx1ZSA8IChPTVhfUzE2KU9NWF9NSU5fUzE2ICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChPTVhfUzE2KU9NWF9NSU5fUzE2OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChPTVhfUzE2KVZhbHVlOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9TMzIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MzMiBmb3JtYXQKLSAqCi0gKi8KLQotT01YX1MzMiBhcm1TYXRSb3VuZEZsb2F0VG9TMzIgKE9NWF9GNjQgVmFsdWUpCi17Ci0gICAgaWYgKFZhbHVlID4gMCkKLSAgICB7Ci0gICAgICAgIFZhbHVlICs9IDAuNTsKLSAgICAgICAgCi0gICAgICAgIGlmKFZhbHVlID4gKE9NWF9TMzIpT01YX01BWF9TMzIgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKE9NWF9TMzIpT01YX01BWF9TMzI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKE9NWF9TMzIpVmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgVmFsdWUgLT0gMC41OwotCi0gICAgICAgIGlmKFZhbHVlIDwgKE9NWF9TMzIpT01YX01JTl9TMzIgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKE9NWF9TMzIpT01YX01JTl9TMzI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKE9NWF9TMzIpVmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1UxNgotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSB1bnNpZ25lZCBzaG9ydCBpbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfVTE2IGZvcm1hdAotICoKLSAqLwotCi1PTVhfVTE2IGFybVNhdFJvdW5kRmxvYXRUb1UxNiAoT01YX0Y2NCBWYWx1ZSkKLXsKLSAgICBWYWx1ZSArPSAwLjU7Ci0gICAgCi0gICAgaWYoVmFsdWUgPiAoT01YX1UxNilPTVhfTUFYX1UxNiApCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9VMTYpT01YX01BWF9VMTY7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1UxNilWYWx1ZTsKLSAgICB9Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1UzMgotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSB1bnNpZ25lZCBpbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfVTMyIGZvcm1hdAotICoKLSAqLwotCi1PTVhfVTMyIGFybVNhdFJvdW5kRmxvYXRUb1UzMiAoT01YX0Y2NCBWYWx1ZSkKLXsKLSAgICBWYWx1ZSArPSAwLjU7Ci0gICAgCi0gICAgaWYoVmFsdWUgPiAoT01YX1UzMilPTVhfTUFYX1UzMiApCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9VMzIpT01YX01BWF9VMzI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1UzMilWYWx1ZTsKLSAgICB9Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVJvdW5kRmxvYXRUb1M2NAotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSA2NCBiaXQgaW50IGFmdGVyIHJvdW5kaW5nCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1M2NCBmb3JtYXQKLSAqCi0gKi8KLQotT01YX1M2NCBhcm1Sb3VuZEZsb2F0VG9TNjQgKE9NWF9GNjQgVmFsdWUpCi17Ci0gICAgaWYgKFZhbHVlID4gMCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1M2NCkoVmFsdWUgKyAuNSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1M2NCkoVmFsdWUgLSAuNSk7Ci0gICAgfQotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1TaWduQ2hlY2sKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENoZWNrcyB0aGUgc2lnbiBvZiBhIHZhcmlhYmxlOgotICogcmV0dXJucyAxIGlmIGl0IGlzIFBvc2l0aXZlCi0gKiByZXR1cm5zIDAgaWYgaXQgaXMgMAotICogcmV0dXJucyAtMSBpZiBpdCBpcyBOZWdhdGl2ZSAKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCSAgICB2YXIgICAgIFZhcmlhYmxlIHRvIGJlIGNoZWNrZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfSU5UIC0tICAgcmV0dXJucyAxIGlmIGl0IGlzIFBvc2l0aXZlCi0gKiAgICAgICAgICAgICAgcmV0dXJucyAwIGlmIGl0IGlzIDAKLSAqICAgICAgICAgICAgICByZXR1cm5zIC0xIGlmIGl0IGlzIE5lZ2F0aXZlIAotICovIAotCi1PTVhfSU5UIGFybVNpZ25DaGVjayAoCi0gICAgT01YX1MxNiB2YXIKLSkKLQotewotICAgIE9NWF9JTlQgU2lnbjsKLSAgICAKLSAgICBpZiAodmFyIDwgMCkKLSAgICB7Ci0gICAgICAgIFNpZ24gPSAtMTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIHZhciA+IDApCi0gICAgewotICAgICAgICBTaWduID0gMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgU2lnbiA9IDA7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBTaWduOwotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1DbGlwCi0gKgotICogRGVzY3JpcHRpb246IENsaXBzIHRoZSBpbnB1dCBiZXR3ZWVuIE1BWCBhbmQgTUlOIHZhbHVlCi0gKiAKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIE1pbiAgICAgbG93ZXIgYm91bmQKLSAqIFtpbl0gTWF4ICAgICB1cHBlciBib3VuZAotICogW2luXSBzcmMgICAgIHZhcmlhYmxlIHRvIHRoZSBjbGlwcGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1MzMiAtLSAgIHJldHVybnMgY2xpcHBlZCB2YWx1ZQotICovIAotIAotT01YX1MzMiBhcm1DbGlwICgKLSAgICBPTVhfSU5UIG1pbiwKLSAgICBPTVhfSU5UIG1heCwgCi0gICAgT01YX1MzMiBzcmMgCi0pCi0gCi17Ci0gICAgaWYgKHNyYyA+IG1heCkKLSAgICB7Ci0gICAgICAgIHNyYyA9IG1heDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3JjIDwgbWluKQotICAgIHsKLSAgICAgICAgc3JjID0gbWluOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gc3JjOwotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1DbGlwX0YzMgotICoKLSAqIERlc2NyaXB0aW9uOiBDbGlwcyB0aGUgaW5wdXQgYmV0d2VlbiBNQVggYW5kIE1JTiB2YWx1ZQotICogCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBNaW4gICAgIGxvd2VyIGJvdW5kCi0gKiBbaW5dIE1heCAgICAgdXBwZXIgYm91bmQKLSAqIFtpbl0gc3JjICAgICB2YXJpYWJsZSB0byB0aGUgY2xpcHBlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9GMzIgLS0gICByZXR1cm5zIGNsaXBwZWQgdmFsdWUKLSAqLyAKLSAKLU9NWF9GMzIgYXJtQ2xpcF9GMzIgKAotICAgIE9NWF9GMzIgbWluLAotICAgIE9NWF9GMzIgbWF4LCAKLSAgICBPTVhfRjMyIHNyYyAKLSkKLSAKLXsKLSAgICBpZiAoc3JjID4gbWF4KQotICAgIHsKLSAgICAgICAgc3JjID0gbWF4OwotICAgIH0KLSAgICBlbHNlIGlmIChzcmMgPCBtaW4pCi0gICAgewotICAgICAgICBzcmMgPSBtaW47Ci0gICAgfQotICAgIAotICAgIHJldHVybiBzcmM7Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVNoaWZ0U2F0X0YzMgotICoKLSAqIERlc2NyaXB0aW9uOiBEaXZpZGVzIGEgZmxvYXQgdmFsdWUgYnkgMl5zaGlmdCBhbmQgCi0gKiBzYXR1cmF0ZXMgaXQgZm9yIHVuc2lnbmVkIHZhbHVlIHJhbmdlIGZvciBzYXRCaXRzLgotICogU2Vjb25kIHBhcmFtZXRlciBpcyBsaWtlICJzaGlmdGluZyIgdGhlIGNvcnJlc3BvbmRpbmcgCi0gKiBpbnRlZ2VyIHZhbHVlLiBUYWtlcyBjYXJlIG9mIHJvdW5kaW5nIHdoaWxlIGNsaXBwaW5nIHRoZSBmaW5hbCAKLSAqIHZhbHVlLgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHYgICAgICAgICAgTnVtYmVyIHRvIGJlIG9wZXJhdGVkIHVwb24KLSAqIFtpbl0gc2hpZnQgICAgICBEaXZpZGVzIHRoZSBpbnB1dCAidiIgYnkgIjJec2hpZnQiCi0gKiBbaW5dIHNhdEJpdHMgICAgRmluYWwgcmFuZ2UgaXMgWzAsIDJec2F0Qml0cykKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfUzMyIC0tICAgcmV0dXJucyAic2hpZnRlZCIgc2F0dXJhdGVkIHZhbHVlCi0gKi8gCi0gCi1PTVhfVTMyIGFybVNoaWZ0U2F0X0YzMihPTVhfRjMyIHYsIE9NWF9JTlQgc2hpZnQsIE9NWF9JTlQgc2F0Qml0cykgCi17Ci0gICAgT01YX1UzMiBhbGxPbmVzID0gKE9NWF9VMzIpKC0xKTsKLSAgICBPTVhfVTMyIG1heFYgPSBhbGxPbmVzID4+ICgzMi1zYXRCaXRzKTsKLSAgICBPTVhfRjMyIHZTaGlmdGVkLCB2Um91bmRlZCwgc2hpZnREaXYgPSAoT01YX0YzMikoMSA8PCBzaGlmdCk7Ci0gICAgT01YX1UzMiB2SW50OwotICAgIE9NWF9VMzIgdkludFNhdDsKLSAgICAKLSAgICBpZih2IDw9IDApCi0gICAgICAgIHJldHVybiAwOwotICAgIAotICAgIHZTaGlmdGVkID0gdiAvIHNoaWZ0RGl2OwotICAgIHZSb3VuZGVkID0gKE9NWF9GMzIpKHZTaGlmdGVkICsgMC41KTsKLSAgICB2SW50ID0gKE9NWF9VMzIpdlJvdW5kZWQ7Ci0gICAgdkludFNhdCA9IHZJbnQ7Ci0gICAgaWYodkludFNhdCA+IG1heFYpIAotICAgICAgICB2SW50U2F0ID0gbWF4VjsKLSAgICByZXR1cm4gdkludFNhdDsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbnM6IGFybVN3YXBFbGVtCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGVzZSBmdW5jdGlvbiBzd2FwcyB0d28gZWxlbWVudHMgYXQgdGhlIHNwZWNpZmllZCBwb2ludGVyIGxvY2F0aW9ucy4KLSAqIFRoZSBzaXplIG9mIGVhY2ggZWxlbWVudCBjb3VsZCBiZSBhbnl0aGluZyBhcyBzcGVjaWZpZWQgYnkgPGVsZW1TaXplPgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWFJlc3VsdCAtLSBFcnJvciBzdGF0dXMgZnJvbSB0aGUgZnVuY3Rpb24KLSAqLwotT01YUmVzdWx0IGFybVN3YXBFbGVtKAotICAgICAgICBPTVhfVTggKnBCdWYxLAotICAgICAgICBPTVhfVTggKnBCdWYyLAotICAgICAgICBPTVhfSU5UIGVsZW1TaXplCi0gICAgICAgKQotewotICAgIE9NWF9JTlQgaTsKLSAgICBPTVhfVTggdGVtcDsKLSAgICBhcm1SZXRBcmdFcnJJZighcEJ1ZjEgfHwgIXBCdWYyLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgCi0gICAgZm9yKGkgPSAwOyBpIDwgZWxlbVNpemU7IGkrKykKLSAgICB7Ci0gICAgICAgIHRlbXAgPSAqKHBCdWYxICsgaSk7Ci0gICAgICAgICoocEJ1ZjEgKyBpKSA9ICoocEJ1ZjIgKyBpKTsKLSAgICAgICAgKihwQnVmMiArIGkpID0gdGVtcDsKLSAgICB9Ci0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybU1lZGlhbk9mMwotICoKLSAqIERlc2NyaXB0aW9uOiBGaW5kcyB0aGUgbWVkaWFuIG9mIHRocmVlIG51bWJlcnMKLSAqIAotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBmRW50cnkgICAgIEZpcnN0IGVudHJ5Ci0gKiBbaW5dIHNFbnRyeSAgICAgc2Vjb25kIGVudHJ5Ci0gKiBbaW5dIHRFbnRyeSAgICAgVGhpcmQgZW50cnkKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfUzMyIC0tICAgcmV0dXJucyB0aGUgbWVkaWFuIHZhbHVlCi0gKi8gCi0gCi1PTVhfUzMyIGFybU1lZGlhbk9mMyAoCi0gICAgT01YX1MzMiBmRW50cnksCi0gICAgT01YX1MzMiBzRW50cnksIAotICAgIE9NWF9TMzIgdEVudHJ5IAotKQotewotICAgIE9NWF9TMzIgYSwgYiwgYzsKLSAgICAKLSAgICBhID0gYXJtTWluIChmRW50cnksIHNFbnRyeSk7Ci0gICAgYiA9IGFybU1heCAoZkVudHJ5LCBzRW50cnkpOwotICAgIGMgPSBhcm1NaW4gKGIsIHRFbnRyeSk7Ci0gICAgcmV0dXJuIChhcm1NYXggKGEsIGMpKTsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtTG9nU2l6ZQotICoKLSAqIERlc2NyaXB0aW9uOiBGaW5kcyB0aGUgc2l6ZSBvZiBhIHBvc2l0aXZlIHZhbHVlIGFuZCByZXR1cm5zIHRoZSBzYW1lCi0gKiAKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gdmFsdWUgICAgUG9zaXRpdmUgdmFsdWUKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfVTggLS0gICAgIFJldHVybnMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGJpdHMgcmVxdWlyZWQgdG8gcmVwcmVzZW50IHRoZSBwb3NpdGl2ZSB2YWx1ZS4gCi0gICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIHNtYWxsZXN0IGs+PTAgc3VjaCB0aGF0IHRoYXQgdmFsdWUgaXMgbGVzcyB0aGFuICgxPDxrKS4KLSAqLyAKLSAKLU9NWF9VOCBhcm1Mb2dTaXplICgKLSAgICBPTVhfVTE2IHZhbHVlIAotKQotewotICAgIE9NWF9VOCBpOyAgICAKLSAgICBmb3IgKCBpID0gMDsgdmFsdWUgPiAwOyB2YWx1ZSA9IHZhbHVlID4+IDEpIAotICAgIHsKLSAgICAgICAgaSsrOwotICAgIH0KLSAgICByZXR1cm4gaTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgICAgIC8qIFNhdHVyYXRpbmcgQXJpdGhtZXRpYyBvcGVyYXRpb25zICovCi0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdEFkZF9TMzIoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBhZGRpdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKLSAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogCi0gKiAgICAKLSAqKi8KLSAKLU9NWF9TMzIgYXJtU2F0QWRkX1MzMihPTVhfUzMyIFZhbHVlMSxPTVhfUzMyIFZhbHVlMikKLXsKLSAgICBPTVhfUzMyIFJlc3VsdDsKLSAgICAKLSAgICBSZXN1bHQgPSBWYWx1ZTEgKyBWYWx1ZTI7Ci0KLSAgICBpZiggKFZhbHVlMV5WYWx1ZTIpID49IDApCi0gICAgewotICAgICAgICAvKlNhbWUgc2lnbiovCi0gICAgICAgIGlmKCAoUmVzdWx0XlZhbHVlMSkgPj0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgLypSZXN1bHQgaGFzIG5vdCBzYXR1cmF0ZWQqLwotICAgICAgICAgICAgcmV0dXJuIFJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKFZhbHVlMSA+PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gcG9zaXRpdmUgc2lkZSovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9NQVhfUzMyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gbmVnYXRpdmUgc2lkZSovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9NSU5fUzMyOwotICAgICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgfQotICAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiBSZXN1bHQ7Ci0gICAgfQotICAgIAotfQotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRBZGRfUzY0KCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgYWRkaXRpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCi0gKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqIAotICogICAgCi0gKiovCi0gCi1PTVhfUzY0IGFybVNhdEFkZF9TNjQoT01YX1M2NCBWYWx1ZTEsT01YX1M2NCBWYWx1ZTIpCi17Ci0gICAgT01YX1M2NCBSZXN1bHQ7Ci0gICAgCi0gICAgUmVzdWx0ID0gVmFsdWUxICsgVmFsdWUyOwotCi0gICAgaWYoIChWYWx1ZTFeVmFsdWUyKSA+PSAwKQotICAgIHsKLSAgICAgICAgLypTYW1lIHNpZ24qLwotICAgICAgICBpZiggKFJlc3VsdF5WYWx1ZTEpID49IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBub3Qgc2F0dXJhdGVkKi8KLSAgICAgICAgICAgIHJldHVybiBSZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihWYWx1ZTEgPj0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIHBvc2l0aXZlIHNpZGUqLwotICAgICAgICAgICAgICAgIFJlc3VsdCA9IE9NWF9NQVhfUzY0OwotICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBuZWdhdGl2ZSBzaWRlKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX01JTl9TNjQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB9Ci0gICAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuIFJlc3VsdDsKLSAgICB9Ci0gICAgCi19Ci0KLS8qKiBGdW5jdGlvbiA6YXJtU2F0U3ViX1MzMigpCi0gKiAKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIHN1YnN0cmFjdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKLSAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogCi0gKiovCi0KLU9NWF9TMzIgYXJtU2F0U3ViX1MzMihPTVhfUzMyIFZhbHVlMSxPTVhfUzMyIFZhbHVlMikKLXsKLSAgICBPTVhfUzMyIFJlc3VsdDsKLSAgICAKLSAgICBSZXN1bHQgPSBWYWx1ZTEgLSBWYWx1ZTI7Ci0KLSAgICBpZiggKFZhbHVlMV5WYWx1ZTIpIDwgMCkKLSAgICB7Ci0gICAgICAgIC8qT3Bwb3NpdGUgc2lnbiovCi0gICAgICAgIGlmKCAoUmVzdWx0XlZhbHVlMSkgPj0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgLypSZXN1bHQgaGFzIG5vdCBzYXR1cmF0ZWQqLwotICAgICAgICAgICAgcmV0dXJuIFJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKFZhbHVlMSA+PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gcG9zaXRpdmUgc2lkZSovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9NQVhfUzMyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gbmVnYXRpdmUgc2lkZSovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9NSU5fUzMyOwotICAgICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgfQotICAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiBSZXN1bHQ7Ci0gICAgfQotICAgIAotfQotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRNYWNfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIE11bHRpcGxpY2F0aW9uIG9mIFZhbHVlMSBhbmQgVmFsdWUyIGFuZCBzdWJlc3F1ZW50IHNhdHVyYXRlZAotICogICAgIGFjY3VtdWxhdGlvbiB3aXRoIE1hYwotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKLSAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCi0gKiBbaW5dIE1hYyAgICAgICAgICBBY2N1bXVsYXRvcgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqKi8KLQotT01YX1MzMiBhcm1TYXRNYWNfUzMyKE9NWF9TMzIgTWFjLE9NWF9TMTYgVmFsdWUxLE9NWF9TMTYgVmFsdWUyKQotewotICAgIE9NWF9TMzIgUmVzdWx0OwotICAgIAotICAgIFJlc3VsdCA9IChPTVhfUzMyKShWYWx1ZTEqVmFsdWUyKTsKLSAgICBSZXN1bHQgPSBhcm1TYXRBZGRfUzMyKCBNYWMgLCBSZXN1bHQgKTsKLQotICAgIHJldHVybiBSZXN1bHQ7ICAgIAotfQotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRNYWNfUzE2UzMyX1MzMgotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBNQUMgb3BlcmF0aW9uIG9mIHRoZSB0aHJlZSBpbnB1dHMgZGVsYXlFbGVtLCBmaWxUYXAgLCBtYWMKLSAqCi0gKiAgIG1hYyA9IG1hYyArIFNhdHVyYXRlX2luXzMyQml0cyhkZWxheUVsZW0gKiBmaWxUYXApCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBkZWxheUVsZW0gICAgRmlyc3QgMzIgYml0IE9wZXJhbmQKLSAqIFtpbl0gZmlsVGFwICAgICAgIFNlY29uZCAxNiBiaXQgT3BlcmFuZAotICogW2luXSBtYWMgICAgICAgICAgUmVzdWx0IG9mIE1BQyBvcGVyYXRpb24KLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgbWFjICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLSAKLU9NWF9TMzIgYXJtU2F0TWFjX1MxNlMzMl9TMzIoT01YX1MzMiBtYWMsIE9NWF9TMzIgZGVsYXlFbGVtLCBPTVhfUzE2IGZpbFRhcCApCi17Ci0gICAgCi0gICAgT01YX1MzMiByZXN1bHQ7Ci0KLSAgICByZXN1bHQgPSBhcm1TYXRNdWxTMTZTMzJfUzMyKGZpbFRhcCxkZWxheUVsZW0pOyAKLQotICAgIGlmICggcmVzdWx0ID4gT01YX01BWF9TMTYgKQotICAgIHsKLSAgICAgICAgcmVzdWx0ID0gT01YX01BWF9TMzI7Ci0gICAgfQotICAgIGVsc2UgaWYoIHJlc3VsdCA8IE9NWF9NSU5fUzE2ICkKLSAgICB7Ci0gICAgICAgIHJlc3VsdCA9IE9NWF9NSU5fUzMyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXN1bHQgPSBkZWxheUVsZW0gKiBmaWxUYXA7Ci0gICAgfQotCi0gICAgbWFjID0gYXJtU2F0QWRkX1MzMihtYWMscmVzdWx0KTsKLSAgICAKLSAgICByZXR1cm4gbWFjOwotfQotCi0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdFJvdW5kUmlnaHRTaGlmdF9TMzJfUzE2Ci0gKgotICogRGVzY3JpcHRpb24gOgotICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygcm91bmRlZCByaWdodCBzaGlmdCBvcGVyYXRpb24gb2YgaW5wdXQgYnkgdGhlIHNjYWxlZmFjdG9yCi0gKgotICogICBvdXRwdXQgPSBTYXR1cmF0ZV9pbl8xNkJpdHMoICggUmlnaHQvTGVmdFNoaWZ0KCAoUm91bmQoaW5wdXQpICwgc2hpZnQgKSApCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBpbnB1dCAgICAgICBUaGUgaW5wdXQgdG8gYmUgb3BlcmF0ZWQgb24KLSAqIFtpbl0gc2hpZnQgVGhlIHNoaWZ0IG51bWJlcgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0KLQotT01YX1MxNiBhcm1TYXRSb3VuZFJpZ2h0U2hpZnRfUzMyX1MxNihPTVhfUzMyIGlucHV0LCBPTVhfSU5UIHNoaWZ0KQotewotICAgIGlucHV0ID0gYXJtU2F0Um91bmRMZWZ0U2hpZnRfUzMyKGlucHV0LC1zaGlmdCk7Ci0KLSAgICBpZiAoIGlucHV0ID4gT01YX01BWF9TMTYgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChPTVhfUzE2KU9NWF9NQVhfUzE2OwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCA8IE9NWF9NSU5fUzE2KQotICAgIHsKLSAgICAgICAgcmV0dXJuIChPTVhfUzE2KU9NWF9NSU5fUzE2OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgIHJldHVybiAoT01YX1MxNilpbnB1dDsKLSAgICB9Ci0KLX0KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRMZWZ0U2hpZnRfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRpbmcgbGVmdC1zaGlmdCBvcGVyYXRpb24gb24gaW5wdXQKLSAqICAgICBPciByb3VuZGVkIFJpZ2h0IHNoaWZ0IGlmIHRoZSBpbnB1dCBTaGlmdCBpcyBuZWdhdGl2ZS4KLSAqICAgICAKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUgICAgICAgIE9wZXJhbmQKLSAqIFtpbl0gU2hpZnQgICAgICAgIE9wZXJhbmQgZm9yIHNoaWZ0IG9wZXJhdGlvbgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqICAgIAotICoqLwotCi1PTVhfUzMyIGFybVNhdFJvdW5kTGVmdFNoaWZ0X1MzMihPTVhfUzMyIFZhbHVlLCBPTVhfSU5UIFNoaWZ0KQotewotICAgIE9NWF9JTlQgaTsKLSAgICAKLSAgICBpZiAoU2hpZnQgPCAwKQotICAgIHsKLSAgICAgICAgU2hpZnQgPSAtU2hpZnQ7Ci0gICAgICAgIFZhbHVlID0gYXJtU2F0QWRkX1MzMihWYWx1ZSwgKDEgPDwgKFNoaWZ0IC0gMSkpKTsKLSAgICAgICAgVmFsdWUgPSBWYWx1ZSA+PiBTaGlmdDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IFNoaWZ0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbHVlID0gYXJtU2F0QWRkX1MzMihWYWx1ZSwgVmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBWYWx1ZTsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRMZWZ0U2hpZnRfUzY0KCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRpbmcgbGVmdC1zaGlmdCBvcGVyYXRpb24gb24gaW5wdXQKLSAqICAgICBPciByb3VuZGVkIFJpZ2h0IHNoaWZ0IGlmIHRoZSBpbnB1dCBTaGlmdCBpcyBuZWdhdGl2ZS4KLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlICAgICAgICBPcGVyYW5kCi0gKiBbaW5dIHNoaWZ0ICAgICAgICBPcGVyYW5kIGZvciBzaGlmdCBvcGVyYXRpb24KLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLSAKLU9NWF9TNjQgYXJtU2F0Um91bmRMZWZ0U2hpZnRfUzY0KE9NWF9TNjQgVmFsdWUsIE9NWF9JTlQgU2hpZnQpCi17Ci0gICAgT01YX0lOVCBpOwotICAgIAotICAgIGlmIChTaGlmdCA8IDApCi0gICAgewotICAgICAgICBTaGlmdCA9IC1TaGlmdDsKLSAgICAgICAgVmFsdWUgPSBhcm1TYXRBZGRfUzY0KFZhbHVlLCAoKE9NWF9TNjQpMSA8PCAoU2hpZnQgLSAxKSkpOwotICAgICAgICBWYWx1ZSA9IFZhbHVlID4+IFNoaWZ0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgU2hpZnQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgVmFsdWUgPSBhcm1TYXRBZGRfUzY0KFZhbHVlLCBWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFZhbHVlOwotfQotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRNdWxTMTZTMzJfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGEgUzE2IGRhdGEgdHlwZSBtdWx0aXBsaWVkIHdpdGggYW4gUzMyIGRhdGEgdHlwZQotICogICAgIGluIGEgUzMyIGNvbnRhaW5lcgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gaW5wdXQxICAgICAgIE9wZXJhbmQgMQotICogW2luXSBpbnB1dDIgICAgICAgT3BlcmFuZCAyCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0KLQotT01YX1MzMiBhcm1TYXRNdWxTMTZTMzJfUzMyKE9NWF9TMTYgaW5wdXQxLE9NWF9TMzIgaW5wdXQyKQotewotICAgIE9NWF9TMTYgaGkyLGxvMTsKLSAgICBPTVhfVTE2IGxvMjsKLSAgICAKLSAgICBPTVhfUzMyIHRlbXAxLHRlbXAyOwotICAgIE9NWF9TMzIgcmVzdWx0OwotICAgIAotICAgIGxvMSAgPSBpbnB1dDE7Ci0KLSAgICBoaTIgID0gKCBpbnB1dDIgPj4gIDE2ICk7Ci0gICAgbG8yICA9ICggKE9NWF9VMzIpKCBpbnB1dDIgPDwgMTYgKSA+PiAxNiApOwotICAgIAotICAgIHRlbXAxID0gaGkyICogbG8xOwotICAgIHRlbXAyID0gKCBsbzIqIGxvMSApID4+IDE2OwotCi0gICAgcmVzdWx0ID0gIGFybVNhdEFkZF9TMzIodGVtcDEsdGVtcDIpOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0TXVsUzMyUzMyX1MzMigpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhIFMzMiBkYXRhIHR5cGUgbXVsdGlwbGllZCB3aXRoIGFuIFMzMiBkYXRhIHR5cGUKLSAqICAgICBpbiBhIFMzMiBjb250YWluZXIKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIGlucHV0MSAgICAgICBPcGVyYW5kIDEKLSAqIFtpbl0gaW5wdXQyICAgICAgIE9wZXJhbmQgMgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqICAgIAotICoqLwotCi1PTVhfUzMyIGFybVNhdE11bFMzMlMzMl9TMzIoT01YX1MzMiBpbnB1dDEsT01YX1MzMiBpbnB1dDIpCi17Ci0gICAgT01YX1MxNiBoaTEsaGkyOwotICAgIE9NWF9VMTYgbG8xLGxvMjsKLSAgICAKLSAgICBPTVhfUzMyIHRlbXAxLHRlbXAyLHRlbXAzOwotICAgIE9NWF9TMzIgcmVzdWx0OwotCi0gICAgaGkxICA9ICggaW5wdXQxID4+ICAxNiApOwotICAgIGxvMSAgPSAoIChPTVhfVTMyKSggaW5wdXQxIDw8IDE2ICkgPj4gMTYgKTsKLQotICAgIGhpMiAgPSAoIGlucHV0MiA+PiAgMTYgKTsKLSAgICBsbzIgID0gKCAoT01YX1UzMikoIGlucHV0MiA8PCAxNiApID4+IDE2ICk7Ci0gICAgCi0gICAgdGVtcDEgPSAgIGhpMSAqIGhpMjsKLSAgICB0ZW1wMiA9ICggaGkxKiBsbzIgKSA+PiAxNjsKLSAgICB0ZW1wMyA9ICggaGkyKiBsbzEgKSA+PiAxNjsKLQotICAgIHJlc3VsdCA9IGFybVNhdEFkZF9TMzIodGVtcDEsdGVtcDIpOwotICAgIHJlc3VsdCA9IGFybVNhdEFkZF9TMzIocmVzdWx0LHRlbXAzKTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybUludERpdkF3YXlGcm9tWmVybygpCi0gKgotICogRGVzY3JpcHRpb24gOiBJbnRlZ2VyIGRpdmlzaW9uIHdpdGggcm91bmRpbmcgdG8gdGhlIG5lYXJlc3QgaW50ZWdlci4gCi0gKiAgICAgICAgICAgICAgIEhhbGYtaW50ZWdlciB2YWx1ZXMgYXJlIHJvdW5kZWQgYXdheSBmcm9tIHplcm8KLSAqICAgICAgICAgICAgICAgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQuIEZvciBleGFtcGxlIDMvLzIgaXMgcm91bmRlZCAKLSAqICAgICAgICAgICAgICAgdG8gMiwgYW5kIC0zLy8yIGlzIHJvdW5kZWQgdG8gLTIuCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBOdW0gICAgICAgIE9wZXJhbmQgMQotICogW2luXSBEZW5vICAgICAgIE9wZXJhbmQgMgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24gaW5wdXQxLy9pbnB1dDIKLSAqICAgIAotICoqLwotCi1PTVhfUzMyIGFybUludERpdkF3YXlGcm9tWmVybyAoT01YX1MzMiBOdW0sIE9NWF9TMzIgRGVubykKLXsKLSAgICBPTVhfRjY0IHJlc3VsdDsKLSAgICAKLSAgICByZXN1bHQgPSAoKE9NWF9GNjQpTnVtKS8oKE9NWF9GNjQpRGVubyk7Ci0gICAgCi0gICAgaWYgKHJlc3VsdCA+PSAwKQotICAgIHsKLSAgICAgICAgcmVzdWx0ICs9IDAuNTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmVzdWx0IC09IDAuNTsKLSAgICB9Ci0KLSAgICByZXR1cm4gKE9NWF9TMzIpKHJlc3VsdCk7Ci19Ci0KLQotLypFbmQgb2YgRmlsZSovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2Uvc3JjL2FybUNPTU1fQml0c3RyZWFtLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3NyYy9hcm1DT01NX0JpdHN0cmVhbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWY1M2NhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2Uvc3JjL2FybUNPTU1fQml0c3RyZWFtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybUNPTU1fQml0c3RyZWFtLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZWZpbmVzIGJpdHN0cmVhbSBlbmNvZGUgYW5kIGRlY29kZSBmdW5jdGlvbnMgY29tbW9uIHRvIGFsbCBjb2RlY3MKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRml4ZWQgYml0IGxlbmd0aCBEZWNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogRnVuY3Rpb246IGFybUxvb2tBaGVhZEJpdHMoKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogR2V0IHRoZSBuZXh0IE4gYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0gd2l0aG91dCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICoqcHBCaXRTdHJlYW0KLSAqIFtpbl0gICAgICpwT2Zmc2V0Ci0gKiBbaW5dICAgICBOPTEuLi4zMgotICoKLSAqIFJldHVybnMgIFZhbHVlCi0gKi8KLQotT01YX1UzMiBhcm1Mb29rQWhlYWRCaXRzKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLCBPTVhfSU5UICpwT2Zmc2V0LCBPTVhfSU5UIE4pCi17Ci0gICAgY29uc3QgT01YX1U4ICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOwotICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7Ci0gICAgT01YX1UzMiBWYWx1ZTsKLQotICAgIGFybUFzc2VydChPZmZzZXQ+PTAgJiYgT2Zmc2V0PD03KTsKLSAgICBhcm1Bc3NlcnQoTj49MSAmJiBOPD0zMik7Ci0KLSAgICAvKiBSZWFkIG5leHQgMzIgYml0cyBmcm9tIHN0cmVhbSAqLwotICAgIFZhbHVlID0gKHBCaXRTdHJlYW1bMF0gPDwgMjQgKSB8ICggcEJpdFN0cmVhbVsxXSA8PCAxNikgIHwgKHBCaXRTdHJlYW1bMl0gPDwgOCApIHwgKHBCaXRTdHJlYW1bM10pIDsKLSAgICBWYWx1ZSA9IChWYWx1ZSA8PCBPZmZzZXQgKSB8IChwQml0U3RyZWFtWzRdID4+ICg4LU9mZnNldCkpOwotCi0gICAgLyogUmV0dXJuIE4gYml0cyAqLwotICAgIHJldHVybiBWYWx1ZSA+PiAoMzItTik7Ci19Ci0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtR2V0Qml0cygpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBSZWFkIE4gYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KLSAqICAgIAotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQotICogW2luXSAgICAgKnBPZmZzZXQKLSAqIFtpbl0gICAgIE49MS4uMzIKLSAqCi0gKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KLSAqIFtvdXRdICAgICpwT2Zmc2V0Ci0gKiBSZXR1cm5zICBWYWx1ZQotICovCi0KLQotT01YX1UzMiBhcm1HZXRCaXRzKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLCBPTVhfSU5UICpwT2Zmc2V0LCBPTVhfSU5UIE4pCi17Ci0gICAgY29uc3QgT01YX1U4ICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOwotICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7Ci0gICAgT01YX1UzMiBWYWx1ZTsKLSAgICAKLSAgICBpZihOID09IDApCi0gICAgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgYXJtQXNzZXJ0KE9mZnNldD49MCAmJiBPZmZzZXQ8PTcpOwotICAgIGFybUFzc2VydChOPj0xICYmIE48PTMyKTsKLQotICAgIC8qIFJlYWQgbmV4dCAzMiBiaXRzIGZyb20gc3RyZWFtICovCi0gICAgVmFsdWUgPSAocEJpdFN0cmVhbVswXSA8PCAyNCApIHwgKCBwQml0U3RyZWFtWzFdIDw8IDE2KSAgfCAocEJpdFN0cmVhbVsyXSA8PCA4ICkgfCAocEJpdFN0cmVhbVszXSkgOwotICAgIFZhbHVlID0gKFZhbHVlIDw8IE9mZnNldCApIHwgKHBCaXRTdHJlYW1bNF0gPj4gKDgtT2Zmc2V0KSk7Ci0KLSAgICAvKiBBZHZhbmNlIGJpdHN0cmVhbSBwb2ludGVyIGJ5IE4gYml0cyAqLwotICAgIE9mZnNldCArPSBOOwotICAgICpwcEJpdFN0cmVhbSA9IHBCaXRTdHJlYW0gKyAoT2Zmc2V0Pj4zKTsKLSAgICAqcE9mZnNldCA9IE9mZnNldCAmIDc7Ci0KLSAgICAvKiBSZXR1cm4gTiBiaXRzICovCi0gICAgcmV0dXJuIFZhbHVlID4+ICgzMi1OKTsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtQnl0ZUFsaWduKCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEFsaWduIHRoZSBwb2ludGVyICpwcEJpdFN0cmVhbSB0byB0aGUgbmV4dCBieXRlIGJvdW5kYXJ5Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQotICogW2luXSAgICAgKnBPZmZzZXQKLSAqCi0gKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KLSAqIFtvdXRdICAgICpwT2Zmc2V0Ci0gKgotICoqLwotIAotT01YVm9pZCBhcm1CeXRlQWxpZ24oY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCkKLXsKLSAgICBpZigqcE9mZnNldCA+IDApCi0gICAgewotICAgICAgICAqcHBCaXRTdHJlYW0gKz0gMTsKLSAgICAgICAgKnBPZmZzZXQgPSAwOwotICAgIH0gICAgCi19Ci0KLS8qKiAKLSAqIEZ1bmN0aW9uOiBhcm1Ta2lwQml0cygpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBTa2lwIE4gYml0cyBmcm9tIHRoZSB2YWx1ZSBhdCAqcHBCaXRTdHJlYW0KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgICAgKnBwQml0U3RyZWFtCi0gKiBbaW5dICAgICAqcE9mZnNldAotICogW2luXSAgICAgTgotICoKLSAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQotICogW291dF0gICAgKnBPZmZzZXQKLSAqCi0gKiovCi0KLQotT01YVm9pZCBhcm1Ta2lwQml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSxPTVhfSU5UICpwT2Zmc2V0LE9NWF9JTlQgTikKLXsKLSAgICBPTVhfSU5UIE9mZnNldCA9ICpwT2Zmc2V0OwotICAgIGNvbnN0IE9NWF9VOCAqcEJpdFN0cmVhbSA9ICpwcEJpdFN0cmVhbTsKLSAgIAotICAgIC8qIEFkdmFuY2UgYml0c3RyZWFtIHBvaW50ZXIgYnkgTiBiaXRzICovCi0gICAgT2Zmc2V0ICs9IE47Ci0gICAgKnBwQml0U3RyZWFtID0gcEJpdFN0cmVhbSArIChPZmZzZXQ+PjMpOwotICAgICpwT2Zmc2V0ID0gT2Zmc2V0ICYgNzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVmFyaWFibGUgYml0IGxlbmd0aCBEZWNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogRnVuY3Rpb246IGFybVVuUGFja1ZMQzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFZhcmlhYmxlIGxlbmd0aCBkZWNvZGUgb2YgdmFyaWFibGUgbGVuZ3RoIHN5bWJvbCAobWF4IHNpemUgMzIgYml0cykgcmVhZCBmcm9tCi0gKiB0aGUgYml0IHN0cmVhbSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSBhdCAqcE9mZnNldCBieSB1c2luZyB0aGUgdGFibGUKLSAqIHBvaW50ZWQgYnkgcENvZGVCb29rCi0gKiAKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICAgICAqcEJpdFN0cmVhbQotICogW2luXSAgICAgKnBPZmZzZXQKLSAqIFtpbl0gICAgIHBDb2RlQm9vawotICogCi0gKiBbb3V0XSAgICAqcEJpdFN0cmVhbQotICogW291dF0gICAgKnBPZmZzZXQKLSAqCi0gKiBSZXR1cm5zIDogQ29kZSBCb29rIEluZGV4IGlmIHN1Y2Nlc3NmdWxsLiAKLSAqICAgICAgICAgOiBBUk1fTk9fQ09ERUJPT0tfSU5ERVggPSAtMSBpZiBzZWFyY2ggZmFpbHMuCi0gKiovCi0jaWZuZGVmIENfT1BUSU1JWkVEX0lNUExFTUVOVEFUSU9OIAotCi1PTVhfVTE2IGFybVVuUGFja1ZMQzMyKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBPZmZzZXQsCi0gICAgY29uc3QgQVJNX1ZMQzMyICpwQ29kZUJvb2sKLSkKLXsgICAgCi0gICAgY29uc3QgT01YX1U4ICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOwotICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7Ci0gICAgT01YX1UzMiBWYWx1ZTsKLSAgICBPTVhfSU5UIEluZGV4OwotICAgICAgICAKLSAgICBhcm1Bc3NlcnQoT2Zmc2V0Pj0wICYmIE9mZnNldDw9Nyk7Ci0KLSAgICAvKiBSZWFkIG5leHQgMzIgYml0cyBmcm9tIHN0cmVhbSAqLwotICAgIFZhbHVlID0gKHBCaXRTdHJlYW1bMF0gPDwgMjQgKSB8ICggcEJpdFN0cmVhbVsxXSA8PCAxNikgIHwgKHBCaXRTdHJlYW1bMl0gPDwgOCApIHwgKHBCaXRTdHJlYW1bM10pIDsKLSAgICBWYWx1ZSA9IChWYWx1ZSA8PCBPZmZzZXQgKSB8IChwQml0U3RyZWFtWzRdID4+ICg4LU9mZnNldCkpOwotCi0gICAgLyogU2VhcmNoIHRocm91Z2ggdGhlIGNvZGVib29rICovICAgIAotICAgIGZvciAoSW5kZXg9MDsgcENvZGVCb29rLT5jb2RlTGVuICE9IDA7IEluZGV4KyspCi0gICAgewotICAgICAgICBpZiAocENvZGVCb29rLT5jb2RlV29yZCA9PSAoVmFsdWUgPj4gKDMyIC0gcENvZGVCb29rLT5jb2RlTGVuKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9mZnNldCAgICAgICA9IE9mZnNldCArIHBDb2RlQm9vay0+Y29kZUxlbjsKLSAgICAgICAgICAgICpwcEJpdFN0cmVhbSA9IHBCaXRTdHJlYW0gKyAoT2Zmc2V0ID4+IDMpIDsKLSAgICAgICAgICAgICpwT2Zmc2V0ICAgICA9IE9mZnNldCAmIDc7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBJbmRleDsKLSAgICAgICAgfSAgICAgICAgCi0gICAgICAgIHBDb2RlQm9vaysrOwotICAgIH0KLQotICAgIC8qIE5vIGNvZGUgbWF0Y2ggZm91bmQgKi8KLSAgICByZXR1cm4gQVJNX05PX0NPREVCT09LX0lOREVYOwotfQotCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRml4ZWQgYml0IGxlbmd0aCBFbmNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogRnVuY3Rpb246IGFybVBhY2tCaXRzCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQYWNrIGEgVkxDIGNvZGUgd29yZCBpbnRvIHRoZSBiaXRzdHJlYW0KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHBwQml0U3RyZWFtICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbS4KLSAqIFtpbl0gcE9mZnNldCAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKLSAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAotICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KLSAqIFtpbl0gY29kZVdvcmQgICAgICAgIENvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCi0gKiBbaW5dIGNvZGVMZW5ndGggICAgICBMZW5ndGggb2YgdGhlIGNvZGUgd29yZCB2YWxpZCByYW5nZSAxLi4uMzIKLSAqCi0gKiBbb3V0XSBwcEJpdFN0cmVhbSAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyLgotICogW291dF0gcEJpdE9mZnNldCAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWF9SRVNVTFQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLSAKLU9NWFJlc3VsdCBhcm1QYWNrQml0cyAoCi0gICAgT01YX1U4ICAqKnBwQml0U3RyZWFtLCAKLSAgICBPTVhfSU5UICpwT2Zmc2V0LAotICAgIE9NWF9VMzIgY29kZVdvcmQsIAotICAgIE9NWF9JTlQgY29kZUxlbmd0aCAKLSkKLXsKLSAgICBPTVhfVTggICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOwotICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7Ci0gICAgT01YX1UzMiBWYWx1ZTsKLSAgICAgICAgCi0gICAgLyogY2hlY2tpbmcgYXJndW1lbnQgdmFsaWRpdHkgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihPZmZzZXQgPCAwLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoT2Zmc2V0ID4gNywgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGNvZGVMZW5ndGggPCAxLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoY29kZUxlbmd0aCA+IDMyLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLSAgICAvKiBQcmVwYXJlIHRoZSBmaXJzdCBieXRlICovCi0gICAgY29kZVdvcmQgPSBjb2RlV29yZCA8PCAoMzItY29kZUxlbmd0aCk7Ci0gICAgVmFsdWUgPSAocEJpdFN0cmVhbVswXSA+PiAoOC1PZmZzZXQpKSA8PCAoOC1PZmZzZXQpOwotICAgIFZhbHVlID0gVmFsdWUgfCAoY29kZVdvcmQgPj4gKDI0K09mZnNldCkpOwotCi0gICAgLyogV3JpdGUgb3V0IHdob2xlIGJ5dGVzICovCi0gICAgd2hpbGUgKDgtT2Zmc2V0IDw9IGNvZGVMZW5ndGgpCi0gICAgewotICAgICAgICAqcEJpdFN0cmVhbSsrID0gKE9NWF9VOClWYWx1ZTsKLSAgICAgICAgY29kZVdvcmQgICA9IGNvZGVXb3JkICA8PCAoOC1PZmZzZXQpOwotICAgICAgICBjb2RlTGVuZ3RoID0gY29kZUxlbmd0aCAtICg4LU9mZnNldCk7Ci0gICAgICAgIE9mZnNldCA9IDA7Ci0gICAgICAgIFZhbHVlID0gY29kZVdvcmQgPj4gMjQ7Ci0gICAgfQotCi0gICAgLyogV3JpdGUgb3V0IGZpbmFsIHBhcnRpYWwgYnl0ZSAqLwotICAgICpwQml0U3RyZWFtICA9IChPTVhfVTgpVmFsdWU7Ci0gICAgKnBwQml0U3RyZWFtID0gcEJpdFN0cmVhbTsKLSAgICAqcE9mZnNldCA9IE9mZnNldCArIGNvZGVMZW5ndGg7Ci0gICAgCi0gICAgcmV0dXJuICBPTVhfU3RzX05vRXJyOwotfQotIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVmFyaWFibGUgYml0IGxlbmd0aCBFbmNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogRnVuY3Rpb246IGFybVBhY2tWTEMzMgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGFjayBhIFZMQyBjb2RlIHdvcmQgaW50byB0aGUgYml0c3RyZWFtCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIAotICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0uCi0gKiBbaW5dCXBCaXRPZmZzZXQJICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKLSAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAotICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KLSAqIFtpbl0JIGNvZGUgICAgIAkJVkxDIGNvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0KLSAqCi0gKiBbb3V0XSBwcEJpdFN0cmVhbQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKLSAqCSAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0Ci0gKgkJCQkJCXN0cmVhbSBidWZmZXIuCi0gKiBbb3V0XSBwQml0T2Zmc2V0CQkqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotICoJCQkJCQljdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci0gKgkJCQkJCSpwcEJpdFN0cmVhbS4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0gCi1PTVhSZXN1bHQgYXJtUGFja1ZMQzMyICgKLSAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwgCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBBUk1fVkxDMzIgY29kZSAKLSkKLXsKLSAgICByZXR1cm4gKGFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBjb2RlLmNvZGVXb3JkLCBjb2RlLmNvZGVMZW4pKTsKLX0KLQotLypFbmQgb2YgRmlsZSovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2FwaS9hcm1WQy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9hcGkvYXJtVkMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRiZThiNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2FwaS9hcm1WQy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE2OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkMuaAotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEZpbGU6IGFybVZpZGVvLmgKLSAqIEJyaWVmOiBEZWNsYXJlcyBBUEkncy9CYXNpYyBEYXRhIHR5cGVzIHVzZWQgYWNyb3NzIHRoZSBPcGVuTUFYIFZpZGVvIGRvbWFpbgotICoKLSAqLwotCi0KLSNpZm5kZWYgX2FybVZpZGVvX0hfCi0jZGVmaW5lIF9hcm1WaWRlb19IXwotCi0jaW5jbHVkZSAib214VkMuaCIKLSNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgotCi0vKioKLSAqIEFSTSBzcGVjaWZpYyBzdGF0ZSBzdHJ1Y3R1cmUgdG8gaG9sZCBNb3Rpb24gRXN0aW1hdGlvbiBpbmZvcm1hdGlvbi4KLSAqLwotIAotc3RydWN0IG00cDJfTUVTcGVjCi17Ci0gICAgT01YVkNNNFAyTUVQYXJhbXMgTUVQYXJhbXM7Ci0gICAgT01YVkNNNFAyTUVNb2RlICAgTUVNb2RlOwotfTsKLQotc3RydWN0IG00cDEwX01FU3BlYwotewotICAgIE9NWFZDTTRQMTBNRVBhcmFtcyBNRVBhcmFtczsKLSAgICBPTVhWQ000UDEwTUVNb2RlICAgTUVNb2RlOwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgbTRwMl9NRVNwZWMgIEFSTVZDTTRQMl9NRVNwZWM7Ci10eXBlZGVmIHN0cnVjdCBtNHAxMF9NRVNwZWMgQVJNVkNNNFAxMF9NRVNwZWM7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9Db21wYXJlTVYKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGNvbXBhcmlzaW9uIG9mIG1vdGlvbiB2ZWN0b3JzIGFuZCBTQUQncyB0byBkZWNpZGUgdGhlCi0gKiBiZXN0IE1WIGFuZCBTQUQKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICAgICBtdlggICAgIHggY29vcmRpbmF0ZSBvZiB0aGUgY2FuZGlkYXRlIG1vdGlvbiB2ZWN0b3IKLSAqIFtpbl0gICAgIG12WSAgICAgeSBjb29yZGluYXRlIG9mIHRoZSBjYW5kaWRhdGUgbW90aW9uIHZlY3RvcgotICogW2luXSAgICAgY2FuZFNBRCBDYW5kaWRhdGUgU0FECi0gKiBbaW5dICAgICBiZXN0TVZYIHggY29vcmRpbmF0ZSBvZiB0aGUgYmVzdCBtb3Rpb24gdmVjdG9yCi0gKiBbaW5dICAgICBiZXN0TVZZIHkgY29vcmRpbmF0ZSBvZiB0aGUgYmVzdCBtb3Rpb24gdmVjdG9yCi0gKiBbaW5dICAgICBiZXN0U0FEIGJlc3QgU0FECi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX0lOVCAtLSAxIHRvIGluZGljYXRlIHRoYXQgdGhlIGN1cnJlbnQgc2FkIGlzIHRoZSBiZXN0Ci0gKiAgICAgICAgICAgIDAgdG8gaW5kaWNhdGUgdGhhdCBpdCBpcyBOT1QgdGhlIGJlc3QgU0FECi0gKi8KLQotT01YX0lOVCBhcm1WQ000UDJfQ29tcGFyZU1WICgKLSAgICBPTVhfUzE2IG12WCwKLSAgICBPTVhfUzE2IG12WSwKLSAgICBPTVhfSU5UIGNhbmRTQUQsCi0gICAgT01YX1MxNiBiZXN0TVZYLAotICAgIE9NWF9TMTYgYmVzdE1WWSwKLSAgICBPTVhfSU5UIGJlc3RTQUQpOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQUNEQ1ByZWRpY3QKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGFkYXB0aXZlIERDL0FDIGNvZWZmaWNpZW50IHByZWRpY3Rpb24gZm9yIGFuIGludHJhIGJsb2NrLiBQcmlvcgotICogdG8gdGhlIGZ1bmN0aW9uIGNhbGwsIHByZWRpY3Rpb24gZGlyZWN0aW9uIChwcmVkRGlyKSBzaG91bGQgYmUgc2VsZWN0ZWQKLSAqIGFzIHNwZWNpZmllZCBpbiBzdWJjbGF1c2UgNy40LjMuMSBvZiBJU08vSUVDIDE0NDk2LTIuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBwU3JjRHN0ICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcXVhbnRpemVkIGNvZWZmaWNpZW50IHJlc2lkdWFscyAoUFFGKSBvZiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJsb2NrCi0gKiBbaW5dIHBQcmVkQnVmUm93IHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXIKLSAqIFtpbl0gcFByZWRCdWZDb2wgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcgotICogW2luXSBjdXJRUCAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBjdXJRUAotICogICAgICAgICAgICAgICAgICAgICAgICAgIG1heSBlcXVhbCB0byBwcmVkUVAgZXNwZWNpYWxseSB3aGVuIHRoZSBjdXJyZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sgYW5kIHRoZSBwcmVkaWN0b3IgYmxvY2sgYXJlIGluIHRoZSBzYW1lCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9jay4KLSAqIFtpbl0gcHJlZFFQICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrCi0gKiBbaW5dIHByZWREaXIgICAgIGluZGljYXRlcyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggdGFrZXMgb25lCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX0hPUklaT05UQUwgICAgcHJlZGljdCBob3Jpem9udGFsbHkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fVkVSVElDQUwgICAgICBwcmVkaWN0IHZlcnRpY2FsbHkKLSAqIFtpbl0gQUNQcmVkRmxhZyAgYSBmbGFnIGluZGljYXRpbmcgaWYgQUMgcHJlZGljdGlvbiBzaG91bGQgYmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtZWQuIEl0IGlzIGVxdWFsIHRvIGFjX3ByZWRfZmxhZyBpbiB0aGUgYml0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIHN5bnRheCBvZiBNUEVHLTQKLSAqIFtpbl0gdmlkZW9Db21wICAgdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSwgY2hyb21pbmFuY2Ugb3IKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSkgb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqIFtpbl0gZmxhZyAgICAgICAgVGhpcyBmbGFnIGRlZmluZXMgdGhlIGlmIG9uZSB3YW50cyB0byB1c2UgdGhpcyBmdW5jdGlvbnMgdG8KLSAqICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlIFBRRiAoc2V0IDEsIHByZWRpY3Rpb24pIG9yIFFGIChzZXQgMCwgcmVjb25zdHJ1Y3Rpb24pCi0gKiBbb3V0XSAgICBwUHJlQUNQcmVkaWN0ICAgcG9pbnRlciB0byB0aGUgcHJlZGljdGVkIGNvZWZmaWNpZW50cyBidWZmZXIuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsbGVkIE9OTFkgaWYgaXQgaXMgbm90IE5VTEwKLSAqIFtvdXRdICAgIHBTcmNEc3QgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucwotICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBxdWFudGl6ZWQgY29lZmZpY2llbnRzIChRRikgb2YgdGhlIGN1cnJlbnQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jawotICogW291dF0gICAgcFByZWRCdWZSb3cgcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyCi0gKiBbb3V0XSAgICBwUHJlZEJ1ZkNvbCBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIKLSAqIFtvdXRdICAgIHBTdW1FcnIgICAgIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgc3VtIG9mIHRoZSBkaWZmZXJlbmNlCi0gKiAgICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuIHByZWRpY3RlZCBhbmQgdW5wcmVkaWN0ZWQgY29lZmZpY2llbnRzCi0gKiAgICAgICAgICAgICAgICAgICAgICBJZiB0aGlzIGlzIE5VTEwsIGRvIG5vdCB1cGRhdGUKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9BQ0RDUHJlZGljdCgKLSAgICAgT01YX1MxNiAqIHBTcmNEc3QsCi0gICAgIE9NWF9TMTYgKiBwUHJlQUNQcmVkaWN0LAotICAgICBPTVhfUzE2ICogcFByZWRCdWZSb3csCi0gICAgIE9NWF9TMTYgKiBwUHJlZEJ1ZkNvbCwKLSAgICAgT01YX0lOVCBjdXJRUCwKLSAgICAgT01YX0lOVCBwcmVkUVAsCi0gICAgIE9NWF9JTlQgcHJlZERpciwKLSAgICAgT01YX0lOVCBBQ1ByZWRGbGFnLAotICAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCAgdmlkZW9Db21wLAotICAgICBPTVhfVTggZmxhZywKLSAgICAgT01YX0lOVCAqcFN1bUVycgotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX1NldFByZWREaXIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGRldGVjdGluZyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIGJsb2NrSW5kZXggIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uIGFzIGRlZmluZWQgaW4gc3ViY2xhdXNlIDYuMS4zLjgsIG9mIElTTy9JRUMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAxNDQ5Ni0yLiBGdXJ0aGVybW9yZSwgaW5kZXhlcyA2IHRvIDkgaW5kaWNhdGUgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgYmxvY2tzIHNwYXRpYWxseSBjb3JyZXNwb25kaW5nIHRvIGx1bWluYW5jZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrcyAwIHRvIDMgaW4gdGhlIHNhbWUgbWFjcm9ibG9jay4KLSAqIFtpbl0gcENvZWZCdWZSb3cgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgotICogW2luXSBwUXBCdWYgICAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlcgotICogW291dF0gICAgcHJlZFFQICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrCi0gKiBbb3V0XSAgICBwcmVkRGlyICAgICBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgotICogICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19IT1JJWk9OVEFMICAgIHByZWRpY3QgaG9yaXpvbnRhbGx5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX1ZFUlRJQ0FMICAgICAgcHJlZGljdCB2ZXJ0aWNhbGx5Ci0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfU2V0UHJlZERpcigKLSAgICAgT01YX0lOVCBibG9ja0luZGV4LAotICAgICBPTVhfUzE2ICpwQ29lZkJ1ZlJvdywKLSAgICAgT01YX1MxNiAqcENvZWZCdWZDb2wsCi0gICAgIE9NWF9JTlQgKnByZWREaXIsCi0gICAgIE9NWF9JTlQgKnByZWRRUCwKLSAgICAgY29uc3QgT01YX1U4ICpwUXBCdWYKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmEKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGVuY29kaW5nIGZvciBvbmUgaW50cmEgYmxvY2suCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBwcEJpdFN0cmVhbSAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXQgc3RyZWFtCi0gKiBbaW5dIHBCaXRPZmZzZXQgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcuCi0gKiBbaW5dIHBRRGN0QmxrQ29lZiAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50Ci0gKiBbaW5dIHByZWREaXIgICAgICAgICBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiwgd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHppZ3phZyBzY2FuIHBhdHRlcm4uIFRoaXMgdGFrZXMgb25lIG9mIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgdmFsdWVzOgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fTk9ORSAgICAgICAgICBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW4uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19IT1JJWk9OVEFMICAgIEhvcml6b250YWwgcHJlZGljdGlvbi4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fVkVSVElDQUwgICAgICBWZXJ0aWNhbCBwcmVkaWN0aW9uLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aWd6YWcgc2Nhbi4KLSAqIFtpbl0gcGF0dGVybiAgICAgICAgIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGJsb2NrIGlzIGVuY29kZWQKLSAqIFtpbl0gc3RhcnQgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAwdGggZWxlbWVudAotICogICAgICAgICAgICAgICAgICAgICAgb3IgMXN0LgotICogW291dF0gICAgcHBCaXRTdHJlYW0gICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4KLSAqIFtvdXRdICAgIHBCaXRPZmZzZXQgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmEoCi0gICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCi0gICAgIE9NWF9VOCBwcmVkRGlyLAotICAgICBPTVhfVTggcGF0dGVybiwKLSAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAotICAgICBPTVhfVTggc3RhcnQKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmEKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3Igb25lIGludHJhIGNvZGVkIGJsb2NrLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gcHBCaXRTdHJlYW0gICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0c3RyZWFtIGJ1ZmZlcgotICogW2luXSBwQml0T2Zmc2V0ICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAtN10uCi0gKiBbaW5dIHByZWREaXIgICAgICAgICBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgemlnemFnIHNjYW4gcGF0dGVybi4gSXQgdGFrZXMgb25lIG9mIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgdmFsdWVzOgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fTk9ORSAgQUMgcHJlZGljdGlvbiBub3QgdXNlZDsKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm0gY2xhc3NpY2FsIHppZ3phZyBzY2FuOwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fSE9SSVpPTlRBTCAgICBIb3Jpem9udGFsIHByZWRpY3Rpb247Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm0gYWx0ZXJuYXRlLXZlcnRpY2FsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuOwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fVkVSVElDQUwgICAgICBWZXJ0aWNhbCBwcmVkaWN0aW9uOwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHVzIHBlcmZvcm0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0ZXJuYXRlLWhvcml6b250YWwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlnemFnIHNjYW4uCi0gKiBbaW5dIHZpZGVvQ29tcCAgICAgICB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlLCBjaHJvbWluYW5jZSBvcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSkgb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KLSAqIFtpbl0gc3RhcnQgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAwdGggZWxlbWVudAotICogICAgICAgICAgICAgICAgICAgICAgb3IgMXN0LgotICogW291dF0gICAgcHBCaXRTdHJlYW0gICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlcgotICogW291dF0gICAgcEJpdE9mZnNldCAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtCi0gKiBbb3V0XSAgICBwRHN0ICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2suIFNob3VsZCBiZSAzMi1iaXQgYWxpZ25lZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYSgKLSAgICAgY29uc3QgT01YX1U4ICoqIHBwQml0U3RyZWFtLAotICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKLSAgICAgT01YX1MxNiAqIHBEc3QsCi0gICAgIE9NWF9VOCBwcmVkRGlyLAotICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsIAotICAgICBPTVhfVTggIHN0YXJ0Ci0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlcgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgZmlsbGluZyBvZiB0aGUgY29lZmZpY2llbnQgYnVmZmVyIGFjY29yZGluZyB0byB0aGUgcnVuLCBsZXZlbAotICogYW5kIHNpZ24sIGFsc28gdXBkYXRlcyB0aGUgaW5kZXgKLSAqIAotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIHN0b3JlUnVuICAgICAgICBTdG9yZWQgUnVuIHZhbHVlIChjb3VudCBvZiB6ZXJvcykgICAKLSAqIFtpbl0gIHN0b3JlTGV2ZWwgICAgICBTdG9yZWQgTGV2ZWwgdmFsdWUgKG5vbi16ZXJvIHZhbHVlKQotICogW2luXSAgc2lnbiAgICAgICAgICAgIEZsYWcgaW5kaWNhdGluZyB0aGUgc2lnbiBvZiBsZXZlbAotICogW2luXSAgbGFzdCAgICAgICAgICAgIHN0YXR1cyBvZiB0aGUgbGFzdCBmbGFnCi0gKiBbaW5dICBwSW5kZXggICAgICAgICAgcG9pbnRlciB0byBjb2VmZmljaWVudCBpbmRleCBpbiA4eDggbWF0cml4Ci0gKiBbb3V0XSBwSW5kZXggICAgICAgICAgcG9pbnRlciB0byB1cGRhdGVkIGNvZWZmaWNpZW50IGluZGV4IGluIDh4OCAKLSAqICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXgKLSAqIFtpbl0gIHBaaWd6YWdUYWJsZSAgICBwb2ludGVyIHRvIHRoZSB6aWd6YWcgdGFibGVzCi0gKiBbb3V0XSBwRHN0ICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKLSAqICAgICAgICAgICAgICAgICAgICAgICBibG9jay4gU2hvdWxkIGJlIDMyLWJpdCBhbGlnbmVkCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyKAotICAgIE9NWF9VMzIgc3RvcmVSdW4sCi0gICAgT01YX1MxNiAqIHBEc3QsCi0gICAgT01YX1MxNiBzdG9yZUxldmVsLAotICAgIE9NWF9VOCAgc2lnbiwKLSAgICBPTVhfVTggIGxhc3QsCi0gICAgT01YX1U4ICAqIGluZGV4LAotICAgIGNvbnN0IE9NWF9VOCAqIHBaaWd6YWdUYWJsZQotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0dldFZMQ0JpdHMKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGVzY2FwZSBtb2RlIGRlY2lzaW9uIGJhc2VkIG9uIHRoZSBydW4sIHJ1bissIGxldmVsLCBsZXZlbCsgYW5kIAotICogbGFzdCBjb21iaW5hdGlvbnMuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi0gKgkJCQkJCQkJdGhlIGJpdCBzdHJlYW0KLSAqIFtpbl0JcEJpdE9mZnNldAkJcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLSAqCQkJCQkJCQlieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcKLSAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KLSAqIFtpbl0gc3RhcnQgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAKLSAqICAgICAgICAgICAgICAgICAgICAgIDB0aCBlbGVtZW50IG9yIDFzdC4KLSAqIFtpbi9vdXRdIHBMYXN0ICAgICAgIHBvaW50ZXIgdG8gbGFzdCBzdGF0dXMgZmxhZwotICogW2luXSBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwICAgICAgVGhlIHJ1biB2YWx1ZSBmcm9tIHdoaWNoIGxldmVsIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiBsYXN0ID09IDAKLSAqIFtpbl0gSW5kZXhCZWdpblNpbmdsZUxldmVsRW50cmllc0wwICAgIEFycmF5IGluZGV4IGluIHRoZSBWTEMgdGFibGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGluZyB0byB0aGUgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCAKLSAqIFtpbl0gcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMSAgICAgIFRoZSBydW4gdmFsdWUgZnJvbSB3aGljaCBsZXZlbCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogbGFzdCA9PSAxCi0gKiBbaW5dIEluZGV4QmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMSAgICBBcnJheSBpbmRleCBpbiB0aGUgVkxDIHRhYmxlIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRpbmcgdG8gdGhlICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAgCi0gKiBbaW5dIHBSdW5JbmRleFRhYmxlTDAgICAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKLSAqIFtpbl0gcFZsY1RhYmxlTDAgICAgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMAotICogW2luXSBwUnVuSW5kZXhUYWJsZUwxICAgIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCi0gKiBbaW5dIHBWbGNUYWJsZUwxICAgICAgICAgVkxDIHRhYmxlIGZvciBsYXN0ID09IDEKLSAqIFtpbl0gcExNQVhUYWJsZUwwICAgICAgICBMZXZlbCBNQVggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAotICogW2luXSBwTE1BWFRhYmxlTDEgICAgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCi0gKiBbaW5dIHBSTUFYVGFibGVMMCAgICAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCi0gKiBbaW5dIHBSTUFYVGFibGVMMSAgICAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCi0gKiBbb3V0XXBEc3QJCQkgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKLSAqCQkJCQkJCWJsb2NrLiBTaG91bGQgYmUgMzItYml0IGFsaWduZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9HZXRWTENCaXRzICgKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgICAgICAgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAotCQkJICBPTVhfUzE2ICogcERzdCwKLQkJCSAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAotCQkJICBPTVhfVTggICAgc3RhcnQsCQkJICAKLQkJCSAgT01YX1U4ICAqIHBMYXN0LAotCQkJICBPTVhfVTggICAgcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCwKLQkJCSAgT01YX1U4ICAgIG1heEluZGV4Rm9yTXVsdGlwbGVFbnRyaWVzTDAsCi0JCQkgIE9NWF9VOCAgICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMSwKLQkJCSAgT01YX1U4ICAgIG1heEluZGV4Rm9yTXVsdGlwbGVFbnRyaWVzTDEsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwwLAotICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwwLAotCQkJICBjb25zdCBPTVhfVTggICogcFJ1bkluZGV4VGFibGVMMSwKLSAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGVMMSwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMCwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMSwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMCwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMSwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBaaWd6YWdUYWJsZQotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX1B1dFZMQ0JpdHMKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENoZWNrcyB0aGUgdHlwZSBvZiBFc2NhcGUgTW9kZSBhbmQgcHV0IGVuY29kZWQgYml0cyBmb3IgCi0gKiBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50cy4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCSBwcEJpdFN0cmVhbSAgICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgotICoJCQkJCQkgIHRoZSBiaXQgc3RyZWFtCi0gKiBbaW5dCSBwQml0T2Zmc2V0ICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNwotICogW2luXSBzaG9ydFZpZGVvSGVhZGVyIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgotICogW2luXSAgc3RhcnQgICAgICAgICAgICBzdGFydCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZW5jb2RpbmcgYmVnaW5zIHdpdGggCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIDB0aCBlbGVtZW50IG9yIDFzdC4KLSAqIFtpbl0gIG1heFN0b3JlUnVuTDAgICAgTWF4IHN0b3JlIHBvc3NpYmxlIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGxhc3QgPSAwCi0gKiBbaW5dICBtYXhTdG9yZVJ1bkwxICAgIE1heCBzdG9yZSBwb3NzaWJsZSAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsYXN0ID0gMQotICogW2luXSAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpIGZvciBsYXN0ID0gMAotICogW2luXSAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDEgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpIGZvciBsYXN0ID0gMQotICogW2luXSAgcFJ1bkluZGV4VGFibGVMMCBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKLSAqIFtpbl0gIHBWbGNUYWJsZUwwICAgICAgVkxDIHRhYmxlIGZvciBsYXN0ID09IDAKLSAqIFtpbl0gIHBSdW5JbmRleFRhYmxlTDEgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCi0gKiBbaW5dICBwVmxjVGFibGVMMSAgICAgIFZMQyB0YWJsZSBmb3IgbGFzdCA9PSAxCi0gKiBbaW5dICBwTE1BWFRhYmxlTDAgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAotICogW2luXSAgcExNQVhUYWJsZUwxICAgICBMZXZlbCBNQVggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKLSAqIFtpbl0gIHBSTUFYVGFibGVMMCAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAotICogW2luXSAgcFJNQVhUYWJsZUwxICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCi0gKiBbb3V0XSBwUURjdEJsa0NvZWYgICAgIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQKLSAqIFtvdXRdIHBwQml0U3RyZWFtICAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuCi0gKiBbb3V0XSBwQml0T2Zmc2V0ICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfUHV0VkxDQml0cyAoCi0gICAgICAgICAgICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgICAgICAgICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAotICAgICAgICAgICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCi0gICAgICAgICAgICAgIE9NWF9VOCBzdGFydCwKLSAgICAgICAgICAgICAgT01YX1U4IG1heFN0b3JlUnVuTDAsCi0gICAgICAgICAgICAgIE9NWF9VOCBtYXhTdG9yZVJ1bkwxLAotICAgICAgICAgICAgICBPTVhfVTggIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wwLAotICAgICAgICAgICAgICBPTVhfVTggIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wxLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJ1bkluZGV4VGFibGVMMCwKLSAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGVMMCwKLQkJCSAgY29uc3QgT01YX1U4ICAqIHBSdW5JbmRleFRhYmxlTDEsCi0gICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlTDEsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwTE1BWFRhYmxlTDAsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwTE1BWFRhYmxlTDEsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUk1BWFRhYmxlTDAsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUk1BWFRhYmxlTDEsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwWmlnemFnVGFibGUKLSk7Ci0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfRmlsbFZMQ0J1ZmZlcgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgY2FsY3VsYXRpbmcgdGhlIFZMQyBiaXRzIGRlcGVuZGluZyBvbiB0aGUgZXNjYXBlIHR5cGUgYW5kIGluc2VydCAKLSAqIHRoZSBzYW1lIGluIHRoZSBiaXRzdHJlYW0KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCSBwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi0gKgkgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0IHN0cmVhbQotICogW2luXQkgcEJpdE9mZnNldCAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3Ci0gKiBbaW5dICBydW4gICAgICAgICAgICAgICAgUnVuIHZhbHVlIChjb3VudCBvZiB6ZXJvcykgdG8gYmUgZW5jb2RlZCAgCi0gKiBbaW5dICBsZXZlbCAgICAgICAgICAgICAgTGV2ZWwgdmFsdWUgKG5vbi16ZXJvIHZhbHVlKSB0byBiZSBlbmNvZGVkCi0gKiBbaW5dICBydW5QbHVzICAgICAgICAgICAgQ2FsY3VsYXRlZCBhcyBydW5QbHVzID0gcnVuIC0gKFJNQVggKyAxKSAgCi0gKiBbaW5dICBsZXZlbFBsdXMgICAgICAgICAgQ2FsY3VsYXRlZCBhcyAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFBsdXMgPSBzaWduKGxldmVsKSpbYWJzKGxldmVsKSAtIExNQVhdCi0gKiBbaW5dICBmTW9kZSAgICAgICAgICAgICAgRmxhZyBpbmRpY2F0aW5nIHRoZSBlc2NhcGUgbW9kZXMKLSAqIFtpbl0gIGxhc3QgICAgICAgICAgICAgICBzdGF0dXMgb2YgdGhlIGxhc3QgZmxhZwotICogW2luXSAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgd2lsbCBiZSBlcXVhbCB0byAxOiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKQotICogW2luXSAgcFJ1bkluZGV4VGFibGUgICAgIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfdGFibGVzX1ZMQy5oCi0gKiBbaW5dICBwVmxjVGFibGUgICAgICAgICAgVkxDIHRhYmxlIGRlZmluZWQgaW4gYXJtVkNNNFAyX0h1ZmZfdGFibGVzX1ZMQy5oCi0gKiBbb3V0XSBwcEJpdFN0cmVhbQkJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyLgotICogW291dF0gcEJpdE9mZnNldCAgICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotICogICAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9GaWxsVkxDQnVmZmVyICgKLSAgICAgICAgICAgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgICAgICAgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAotICAgICAgICAgICAgICBPTVhfVTMyIHJ1biwKLSAgICAgICAgICAgICAgT01YX1MxNiBsZXZlbCwgCi0JCQkgIE9NWF9VMzIgcnVuUGx1cywKLSAgICAgICAgICAgICAgT01YX1MxNiBsZXZlbFBsdXMsIAotICAgICAgICAgICAgICBPTVhfVTggIGZNb2RlLAotCQkJICBPTVhfVTggIGxhc3QsCi0gICAgICAgICAgICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzLCAKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqcFJ1bkluZGV4VGFibGUsCi0gICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlCi0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQ2hlY2tWTENFc2NhcGVNb2RlCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBlc2NhcGUgbW9kZSBkZWNpc2lvbiBiYXNlZCBvbiB0aGUgcnVuLCBydW4rLCBsZXZlbCwgbGV2ZWwrIGFuZCAKLSAqIGxhc3QgY29tYmluYXRpb25zLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gcnVuICAgICAgICAgICAgIFJ1biB2YWx1ZSAoY291bnQgb2YgemVyb3MpIHRvIGJlIGVuY29kZWQgIAotICogW2luXSBsZXZlbCAgICAgICAgICAgTGV2ZWwgdmFsdWUgKG5vbi16ZXJvIHZhbHVlKSB0byBiZSBlbmNvZGVkCi0gKiBbaW5dIHJ1blBsdXMgICAgICAgICBDYWxjdWxhdGVkIGFzIHJ1blBsdXMgPSBydW4gLSAoUk1BWCArIDEpICAKLSAqIFtpbl0gbGV2ZWxQbHVzICAgICAgIENhbGN1bGF0ZWQgYXMgCi0gKiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFBsdXMgPSBzaWduKGxldmVsKSpbYWJzKGxldmVsKSAtIExNQVhdCi0gKiBbaW5dIG1heFN0b3JlUnVuICAgICBNYXggc3RvcmUgcG9zc2libGUgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhKQotICogW2luXSBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMgCi0gKiAgICAgICAgICAgICAgICAgICAgICBUaGUgcnVuIHZhbHVlIGFmdGVyIHdoaWNoIGxldmVsIAotICogICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiAKLSAqICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpCi0gKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCi0gKiBbaW5dIHBSdW5JbmRleFRhYmxlICBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYwotICogICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykKLSAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAKLSAqIFJldHVybiBWYWx1ZToKLSAqIFJldHVybnMgYW4gRXNjYXBlIG1vZGUgd2hpY2ggY2FuIHRha2UgdmFsdWVzIGZyb20gMCB0byAzCi0gKiAwIC0tPiBubyBlc2NhcGUgbW9kZSwgMSAtLT4gZXNjYXBlIHR5cGUgMSwKLSAqIDEgLS0+IGVzY2FwZSB0eXBlIDIsIDMgLS0+IGVzY2FwZSB0eXBlIDMsIGNoZWNrIHNlY3Rpb24gNy40LjEuMwotICogaW4gdGhlIE1QRUcgSVNPIHN0YW5kYXJkLgotICoKLSAqLwotCi1PTVhfVTggYXJtVkNNNFAyX0NoZWNrVkxDRXNjYXBlTW9kZSgKLSAgICAgT01YX1UzMiBydW4sCi0gICAgIE9NWF9VMzIgcnVuUGx1cywKLSAgICAgT01YX1MxNiBsZXZlbCwKLSAgICAgT01YX1MxNiBsZXZlbFBsdXMsCi0gICAgIE9NWF9VOCAgbWF4U3RvcmVSdW4sCi0gICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzLAotICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCi0gICAgIGNvbnN0IE9NWF9VOCAgKnBSdW5JbmRleFRhYmxlCi0pOwotCi0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgc2VhcmNoOyBlc3RpbWF0ZXMgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIAotICogQm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgdXNpbmcgaGFsZi1waXhlbCB1bml0cywgYW5kIAotICogdGhlcmVmb3JlIGEgc2hpZnQgbGVmdCBvciByaWdodCBieSAxIGJpdCBtYXkgYmUgcmVxdWlyZWQsIHJlc3BlY3RpdmVseSwgdG8gbWF0Y2ggdGhlIAotICogaW5wdXQgb3Igb3V0cHV0IE1WcyB3aXRoIG90aGVyIGZ1bmN0aW9ucyB0aGF0IGVpdGhlciBnZW5lcmF0ZSBvdXRwdXQgTVZzIG9yIGV4cGVjdCAKLSAqIGlucHV0IE1WcyByZXByZXNlbnRlZCB1c2luZyBpbnRlZ2VyIHBpeGVsIHVuaXRzLiAKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBTcmNSZWZCdWYJCXBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSBNQiB0aGF0IAotICogICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICAgICAgICAgIHBsYW5lLgotICogW2luXQlyZWZXaWR0aAkJICB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lCi0gKiBbaW5dCXBSZWZSZWN0CQkgIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlY3Rhbmd1bGFyIGluIHJlZmVyZW5jZSBwbGFuZS4gUmVsYXRpdmUgdG8gaW1hZ2Ugb3JpZ2luLiAKLSAqICAgICAgICAgICAgICAgICAgICBJdCdzIG5vdCBsaW1pdGVkIHRvIHRoZSBpbWFnZSBib3VuZGFyeSwgYnV0IGRlcGVuZGVkIG9uIHRoZSBwYWRkaW5nLiBGb3IgZXhhbXBsZSwgCi0gKiAgICAgICAgICAgICAgICAgICAgaWYgeW91IHBhZCA0IHBpeGVscyBvdXRzaWRlIHRoZSBpbWFnZSBib3JkZXIsIHRoZW4gdGhlIHZhbHVlIGZvciBsZWZ0IGJvcmRlciAKLSAqICAgICAgICAgICAgICAgICAgICBjYW4gYmUgLTQKLSAqIFtpbl0JcFNyY0N1cnJCdWYJCXBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBleHRyYWN0ZWQgZnJvbSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAKLSAqICAgICAgICAgICAgICAgICAgICAyNTYgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuCi0gKiBbaW5dIHBDdXJyUG9pbnRQb3MJcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZQotICogW2luXSBwU3JjUHJlTVYJCSAgcG9pbnRlciB0byBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcjsgTlVMTCBpbmRpY2F0ZXMgbm8gcHJlZGljdGVkIE1WCi0gKiBbaW5dIHBTcmNQcmVTQUQJCXBvaW50ZXIgdG8gU0FEIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJlZGljdGVkIE1WIChyZWZlcmVuY2VkIGJ5IHBTcmNQcmVNVikKLSAqIFtpbl0gc2VhcmNoUmFuZ2UJCXNlYXJjaCByYW5nZSBmb3IgMTZYMTYgaW50ZWdlciBibG9jayx0aGUgdW5pdHMgb2YgaXQgaXMgZnVsbCBwaXhlbCx0aGUgc2VhcmNoIHJhbmdlIAotICogICAgICAgICAgICAgICAgICAgIGlzIHRoZSBzYW1lIGluIGFsbCBkaXJlY3Rpb25zLkl0IGlzIGluIGluY2x1c2l2ZSBvZiB0aGUgYm91bmRhcnkgYW5kIHNwZWNpZmllZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVsIHVuaXRzLgotICogW2luXSBwTUVTcGVjCQkJICB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKLSAqICAgICAgICAgICAgICAgICAgICBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhlIGJsb2NrIG1hdGNoaW5nIAotICogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLgotICogW2luXSBCbG9ja1NpemUgICAgIE1hY3JvQmxvY2sgU2l6ZSBpLmUgZWl0aGVyIDE2eDE2IG9yIDh4OC4KLSAqIFtvdXRdCXBEc3RNVgkJCXBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WCi0gKiBbb3V0XQlwRHN0U0FECQkJcG9pbnRlciB0byBtaW5pbXVtIFNBRAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TdHNfTm9FcnIgqEMgbm8gZXJyb3IuCi0gKiBPTVhfU3RzX0JhZEFyZ0VyciCoQyBiYWQgYXJndW1lbnRzCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyKAotICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCi0gICAgIE9NWF9JTlQgcmVmV2lkdGgsCi0gICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotICAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAotICAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAotICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY1ByZU1WLAotICAgICBjb25zdCBPTVhfSU5UICpwU3JjUHJlU0FELAotICAgICB2b2lkICpwTUVTcGVjLAotICAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WLAotICAgICBPTVhfSU5UICpwRHN0U0FELAotICAgICBPTVhfVTggQmxvY2tTaXplCi0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQmxvY2tNYXRjaF9IYWxmCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhIDE2eDE2IGJsb2NrIG1hdGNoIHdpdGggaGFsZi1waXhlbCByZXNvbHV0aW9uLiAgUmV0dXJucyB0aGUgZXN0aW1hdGVkIAotICogbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIFRoaXMgZnVuY3Rpb24gZXN0aW1hdGVzIHRoZSBoYWxmLXBpeGVsIAotICogbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIHJlc29sdXRpb24gbW90aW9uIHZlY3RvciByZWZlcmVuY2VkIAotICogYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0TVYsIGkuZS4sIHRoZSBpbml0aWFsIGludGVnZXIgTVYgaXMgZ2VuZXJhdGVkIAotICogZXh0ZXJuYWxseS4gIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIHBTcmNSZWZCdWYgYW5kIHBTZWFyY2hQb2ludFJlZlBvcyBzaG91bGQgYmUgCi0gKiBzaGlmdGVkIGJ5IHRoZSB3aW5uaW5nIE1WIG9mIDE2eDE2IGludGVnZXIgc2VhcmNoIHByaW9yIHRvIGNhbGxpbmcgQmxvY2tNYXRjaF9IYWxmXzE2eDE2LiAgCi0gKiBUaGUgZnVuY3Rpb24gQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2IG1heSBiZSB1c2VkIGZvciBpbnRlZ2VyIG1vdGlvbiBlc3RpbWF0aW9uLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcFNyY1JlZkJ1ZgkJcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIE1CIAotICogICAgICAgICAgICAgICAgICAgIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgdGhlCWN1cnJlbnQgcGxhbmUuCi0gKiBbaW5dCXJlZldpZHRoCQkgIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUKLSAqIFtpbl0JcFJlZlJlY3QJCSAgcmVmZXJlbmNlIHBsYW5lIHZhbGlkIHJlZ2lvbiByZWN0YW5nbGUKLSAqIFtpbl0JcFNyY0N1cnJCdWYJCXBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBleHRyYWN0ZWQgZnJvbSBvcmlnaW5hbCBwbGFuZSAKLSAqICAgICAgICAgICAgICAgICAgICAobGluZWFyIGFycmF5LCAyNTYgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogW2luXQlwU2VhcmNoUG9pbnRSZWZQb3MJcG9zaXRpb24gb2YgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciBoYWxmIHBpeGVsIHNlYXJjaCAoc3BlY2lmaWVkIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMpIGluIHRoZSByZWZlcmVuY2UgcGxhbmUuCi0gKiBbaW5dCXJuZFZhbAkJCSAgcm91bmRpbmcgY29udHJvbCBiaXQgZm9yIGhhbGYgcGl4ZWwgbW90aW9uIGVzdGltYXRpb247IAotICogICAgICAgICAgICAgICAgICAgIDA9cm91bmRpbmcgY29udHJvbCBkaXNhYmxlZDsgMT1yb3VuZGluZyBjb250cm9sIGVuYWJsZWQKLSAqIFtpbl0JcFNyY0RzdE1WCQlwb2ludGVyIHRvIHRoZSBpbml0aWFsIE1WIGVzdGltYXRlOyB0eXBpY2FsbHkgZ2VuZXJhdGVkIGR1cmluZyBhIHByaW9yIAotICogICAgICAgICAgICAgICAgICAxNlgxNiBpbnRlZ2VyIHNlYXJjaCBhbmQgaXRzIHVuaXQgaXMgaGFsZiBwaXhlbC4KLSAqIFtpbl0gQmxvY2tTaXplICAgICBNYWNyb0Jsb2NrIFNpemUgaS5lIGVpdGhlciAxNngxNiBvciA4eDguCi0gKiBbb3V0XXBTcmNEc3RNVgkJcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYKLSAqIFtvdXRdcERzdFNBRAkJCXBvaW50ZXIgdG8gbWluaW11bSBTQUQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfU3RzX05vRXJyIKhDIG5vIGVycm9yCi0gKiBPTVhfU3RzX0JhZEFyZ0VyciCoQyBiYWQgYXJndW1lbnRzCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfQmxvY2tNYXRjaF9IYWxmKAotICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCi0gICAgIE9NWF9JTlQgcmVmV2lkdGgsCi0gICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotICAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAotICAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwU2VhcmNoUG9pbnRSZWZQb3MsCi0gICAgIE9NWF9JTlQgcm5kVmFsLAotICAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdE1WLAotICAgICBPTVhfSU5UICpwRHN0U0FELAotICAgICBPTVhfVTggQmxvY2tTaXplCi0pOwotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX1BhZE1WCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBtb3Rpb24gdmVjdG9yIHBhZGRpbmcgZm9yIGEgbWFjcm9ibG9jay4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHBTcmNEc3RNViAgICAgICBwb2ludGVyIHRvIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIG9mIHRoZSBjdXJyZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2sKLSAqIFtpbl0gcFRyYW5zcCAgICAgICAgIHBvaW50ZXIgdG8gdHJhbnNwYXJlbnQgc3RhdHVzIGJ1ZmZlciBvZiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBtYWNyb2Jsb2NrCi0gKiBbb3V0XSAgICBwU3JjRHN0TVYgICAgICAgcG9pbnRlciB0byBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBpbiB3aGljaCB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uIHZlY3RvcnMgaGF2ZSBiZWVuIHBhZGRlZAotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfUGFkTVYoCi0gICAgIE9NWFZDTW90aW9uVmVjdG9yICogcFNyY0RzdE1WLAotICAgICBPTVhfVTggKiBwVHJhbnNwCi0pOwotCi0vKiAKLSAqIEguMjY0IFNwZWNpZmljIERlY2xhcmF0aW9ucyAKLSAqLwotLyogRGVmaW5lcyAqLwotI2RlZmluZSBBUk1fTTRQMTBfUV9PRkZTRVQgICAgICAgICgxNSkKLQotCi0vKiBEZXF1YW50IHRhYmxlcyAqLwotCi1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMTBfUG9zVG9WQ29sNHg0WzE2XTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9Qb3NUb1ZDb2wyeDJbNF07Ci1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMTBfVk1hdHJpeFs2XVszXTsKLWV4dGVybiBjb25zdCBPTVhfVTMyIGFybVZDTTRQMTBfTUZNYXRyaXhbNl1bM107Ci0KLQotLyoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtIHRoZSB3b3JrIHJlcXVpcmVkIGJ5IHRoZSBPcGVuTUFYCi0gKiBEZWNvZGVDb2VmZnNUb1BhaXIgZnVuY3Rpb24gYW5kIERlY29kZUNocm9tYURDQ29lZmZzVG9QYWlyLgotICogU2luY2UgbW9zdCBvZiB0aGUgY29kZSBpcyBjb21tb24gd2Ugc2hhcmUgaXQgaGVyZS4KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcEJpdFN0cmVhbQkJRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0gYnVmZmVyCi0gKiBbaW5dCXBPZmZzZXQJCQlQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLSAqCQkJCQkJCQl0byBieSAqcHBCaXRTdHJlYW0KLSAqIFtpbl0Jc01heE51bUNvZWZmCU1heGltdW0gbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyBpbiBjdXJyZW50Ci0gKgkJCQkJCQkJYmxvY2sgKDQsMTUgb3IgMTYpCi0gKiBbaW5dCW5UYWJsZSAgICAgICAgICBUYWJsZSBudW1iZXIgKDAgdG8gNCkgYWNjb3JkaW5nIHRvIHRoZSBmaXZlIGNvbHVtbnMKLSAqICAgICAgICAgICAgICAgICAgICAgIG9mIFRhYmxlIDktNSBpbiB0aGUgSC4yNjQgc3BlYwotICogW291dF0JcHBCaXRTdHJlYW0JCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAotICogW291dF0JcE9mZnNldAkJCSpwT2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkCi0gKiBbb3V0XQlwTnVtQ29lZmYJCVBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cyBpbgotICoJCQkJCQkJCXRoaXMgYmxvY2sKLSAqIFtvdXRdCXBwUG9zQ29lZmJ1ZglEb3VibGUgcG9pbnRlciB0byBkZXN0aW5hdGlvbiByZXNpZHVhbAotICoJCQkJCQkJCWNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBvbXhFcnJvciByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyKAotICAgICBjb25zdCBPTVhfVTgqKiBwcEJpdFN0cmVhbSwKLSAgICAgT01YX1MzMiogcE9mZnNldCwKLSAgICAgT01YX1U4KiBwTnVtQ29lZmYsCi0gICAgIE9NWF9VOCoqcHBQb3NDb2VmYnVmLAotICAgICBPTVhfSU5UIG5UYWJsZSwKLSAgICAgT01YX0lOVCBzTWF4TnVtQ29lZmYgICAgICAgIAotICk7Ci0KLS8qCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm0gREMgc3R5bGUgaW50cmEgcHJlZGljdGlvbiwgYXZlcmFnaW5nIHVwcGVyIGFuZCBsZWZ0IGJsb2NrCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcFNyY0xlZnQJCVBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBsZWZ0IGNvZWZmaWNpZW50czoKLSAqCQkJCQkJCQlwW3gsIHldICh4ID0gLTEsIHkgPSAwLi4zKQotICogW2luXQlwU3JjQWJvdmUJCVBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBhYm92ZSBjb2VmZmljaWVudHM6Ci0gKgkJCQkJCQkJcFt4LHldICh4ID0gMC4uMywgeSA9IC0xKQotICogW2luXQlsZWZ0U3RlcAkJU3RlcCBvZiBsZWZ0IGNvZWZmaWNpZW50IGJ1ZmZlcgotICogW2luXQlkc3RTdGVwCQkJU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyCi0gKiBbaW5dCWF2YWlsYWJpbGl0eQlOZWlnaGJvcmluZyAxNngxNiBNQiBhdmFpbGFiaWxpdHkgZmxhZwotICogW291dF0JcERzdAkJCVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE5vbmUKLSAqLwotCi12b2lkIGFybVZDTTRQMTBfUHJlZGljdEludHJhREM0eDQoCi0gICAgIGNvbnN0IE9NWF9VOCogcFNyY0xlZnQsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAotICAgICBPTVhfVTgqIHBEc3QsCi0gICAgIE9NWF9JTlQgbGVmdFN0ZXAsCi0gICAgIE9NWF9JTlQgZHN0U3RlcCwKLSAgICAgT01YX1MzMiBhdmFpbGFiaWxpdHkgICAgICAgIAotKTsKLQotLyoKLSAqIERlc2NyaXB0aW9uCi0gKiBVbnBhY2sgYSA0eDQgYmxvY2sgb2YgY29lZmZpY2llbnQtcmVzaWR1YWwgcGFpciB2YWx1ZXMKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcFNyYwlEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyCi0gKgkJCQkJCWJ1ZmZlciBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcKLSAqIFtvdXRdCXBwU3JjCSpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jawotICogW291dF0JcERzdAlQb2ludGVyIHRvIHVucGFja2VkIDR4NCBibG9jawotICovCi0KLXZvaWQgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NCgKLSAgICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCi0gICAgIE9NWF9TMTYqIHBEc3QKLSk7Ci0KLS8qCi0gKiBEZXNjcmlwdGlvbgotICogVW5wYWNrIGEgMngyIGJsb2NrIG9mIGNvZWZmaWNpZW50LXJlc2lkdWFsIHBhaXIgdmFsdWVzCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcHBTcmMJRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpcgotICoJCQkJCQlidWZmZXIgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nCi0gKiBbb3V0XQlwcFNyYwkqcHBTcmMgaXMgdXBkYXRlZCB0byB0aGUgc3RhcnQgb2YgbmV4dCBub24gZW1wdHkgYmxvY2sKLSAqIFtvdXRdCXBEc3QJUG9pbnRlciB0byB1bnBhY2tlZCA0eDQgYmxvY2sKLSAqLwotCi12b2lkIGFybVZDTTRQMTBfVW5wYWNrQmxvY2syeDIoCi0gICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAotICAgICBPTVhfUzE2KiBwRHN0Ci0pOwotCi0vKgotICogRGVzY3JpcHRpb24KLSAqIERlYmxvY2sgb25lIGJvdW5kYXJ5IHBpeGVsCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcFEwICAgICAgICAgUG9pbnRlciB0byBwaXhlbCBxMAotICogW2luXSBTdGVwICAgICAgICBTdGVwIGJldHdlZW4gcGl4ZWxzIHEwIGFuZCBxMQotICogW2luXSB0QzAgICAgICAgICBFZGdlIHRocmVzaG9sZCB2YWx1ZQotICogW2luXSBhbHBoYSAgICAgICBhbHBoYSB0aHJlc2hvbGQgdmFsdWUKLSAqIFtpbl0gYmV0YSAgICAgICAgYmV0YSB0aHJlc2hvbGQgdmFsdWUKLSAqIFtpbl0gYlMgICAgICAgICAgZGVibG9ja2luZyBzdHJlbmd0aAotICogW2luXSBDaHJvbWFGbGFnICBUcnVlIGZvciBjaHJvbWEgYmxvY2tzCi0gKiBbb3V0XSBwUTAgICAgICAgIERlYmxvY2tlZCBwaXhlbHMKLSAqIAotICovCi0KLXZvaWQgYXJtVkNNNFAxMF9EZUJsb2NrUGl4ZWwoCi0gICAgT01YX1U4ICpwUTAsICAgIC8qIHBvaW50ZXIgdG8gdGhlIHBpeGVsIHEwICovCi0gICAgaW50IFN0ZXAsICAgICAgIC8qIHN0ZXAgYmV0d2VlbiBwaXhlbHMgcTAgYW5kIHExICovCi0gICAgaW50IHRDMCwgICAgICAgIC8qIGVkZ2UgdGhyZXNob2xkIHZhbHVlICovCi0gICAgaW50IGFscGhhLCAgICAgIC8qIGFscGhhICovCi0gICAgaW50IGJldGEsICAgICAgIC8qIGJldGEgKi8KLSAgICBpbnQgYlMsICAgICAgICAgLyogZGVibG9ja2luZyBzdHJlbmd0aCAqLwotICAgIGludCBDaHJvbWFGbGFnCi0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIGhvcml6b250YWwgMS8yLXBlbCBwb3NpdGlvbnMKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqCVtpbl0JcFNyYwkJCVBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgCi0gCQkJCQkJCQkJCQkJCWluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCi0gKglbaW5dCWlTcmNTdGVwCVN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCi0gKglbaW5dCWlEc3RTdGVwCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KLSAqCVtpbl0JaVdpZHRoCQlXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jawotICoJW2luXQlpSGVpZ2h0CQlIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqCVtvdXRdCXBEc3QJICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAxLzItcGVsIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEoCi0gICAgICAgIGNvbnN0IE9NWF9VOCoJCXBTcmMsIAotCQlPTVhfVTMyIAlpU3JjU3RlcCwgCi0JCU9NWF9VOCogCXBEc3QsIAotCQlPTVhfVTMyIAlpRHN0U3RlcCwgCi0JCU9NWF9VMzIgCWlXaWR0aCwgCi0JCU9NWF9VMzIgCWlIZWlnaHQKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIHZlcnRpY2FsIDEvMi1wZWwgcG9zaXRpb25zIAotICogYXJvdW5kIGEgZnVsbC1wZWwgcG9zaXRpb24uCi0gKgotICogUmVtYXJrczoKLSAqCi0gKglbaW5dCXBTcmMJCQlQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIAotICoJCQkJCQkJCQkJCQlpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQotICoJW2luXQlpU3JjU3RlcAlTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgotICoJW2luXQlpRHN0U3RlcAlTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCi0gKglbaW5dCWlXaWR0aAkJV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqCVtpbl0JaUhlaWdodAkJSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKglbb3V0XQlwRHN0ICAgIAlQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgMS8yLXBlbAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEoCQotCSBjb25zdCBPTVhfVTgqIAlwU3JjLCAKLQkgT01YX1UzMiAJaVNyY1N0ZXAsIAotIAkgT01YX1U4KiAJcERzdCwKLSAJIE9NWF9VMzIgCWlEc3RTdGVwLCAKLSAJIE9NWF9VMzIgCWlXaWR0aCwgCi0gCSBPTVhfVTMyIAlpSGVpZ2h0Ci0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkRpYWdfTHVtYQotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgKDEvMiwgMS8yKSAgcG9zaXRpb25zIAotICogYXJvdW5kIGEgZnVsbC1wZWwgcG9zaXRpb24uCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiAgW2luXSAgICBwU3JjICAgICAgICBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIAotICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKLSAqICBbaW5dICAgIGlTcmNTdGVwICAgIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCi0gKiAgW2luXSAgICBpRHN0U3RlcCAgICBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCi0gKiAgW2luXSAgICBpV2lkdGggICAgICBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jawotICogIFtpbl0gICAgaUhlaWdodCAgICAgSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiAgW291dF0gICBwRHN0ICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgKDEvMiwxLzIpLXBlbAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmRGlhZ19MdW1hKCAgCi0gICAgICAgIGNvbnN0IE9NWF9VOCogICAgIHBTcmMsIAotICAgICAgICBPTVhfVTMyICAgICBpU3JjU3RlcCwgCi0gICAgICAgIE9NWF9VOCogICAgIHBEc3QsIAotICAgICAgICBPTVhfVTMyICAgICBpRHN0U3RlcCwKLSAgICAgICAgT01YX1UzMiAgICAgaVdpZHRoLCAKLSAgICAgICAgT01YX1UzMiAgICAgaUhlaWdodAotKTsKLQotLyoKLSAqIERlc2NyaXB0aW9uOgotICogVHJhbnNmb3JtIFJlc2lkdWFsIDR4NCBDb2VmZmljaWVudHMKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgcFNyYwkJU291cmNlIDR4NCBibG9jawotICogW291dF0gcERzdAkJRGVzdGluYXRpb24gNHg0IGJsb2NrCi0gKgotICovCi0KLXZvaWQgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NChPTVhfUzE2KiBwRHN0LCBPTVhfUzE2ICpwU3JjKTsKLQotLyoKLSAqIERlc2NyaXB0aW9uOgotICogRm9yd2FyZCBUcmFuc2Zvcm0gUmVzaWR1YWwgNHg0IENvZWZmaWNpZW50cwotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBwU3JjCQlTb3VyY2UgNHg0IGJsb2NrCi0gKiBbb3V0XSBwRHN0CQlEZXN0aW5hdGlvbiA0eDQgYmxvY2sKLSAqCi0gKi8KLQotdm9pZCBhcm1WQ000UDEwX0Z3ZFRyYW5zZm9ybVJlc2lkdWFsNHg0KE9NWF9TMTYqIHBEc3QsIE9NWF9TMTYgKnBTcmMpOwotCi1PTVhfSU5UIGFybVZDTTRQMTBfQ29tcGFyZU1vdGlvbkNvc3RUb01WICgKLSAgICBPTVhfUzE2ICBtdlgsCi0gICAgT01YX1MxNiAgbXZZLAotICAgIE9NWFZDTW90aW9uVmVjdG9yIGRpZmZNViwgCi0gICAgT01YX0lOVCBjYW5kU0FELCAKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqYmVzdE1WLCAKLSAgICBPTVhfVTMyIG5MYW1kYSwKLSAgICBPTVhfUzMyICpwQmVzdENvc3QpOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ0NPTU1fU0FECi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZSB0aGUgU0FEIGZvciBOeE0gYmxvY2tzLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogW2luXQkJcFNyY09yZwkJUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2sKLSAqIFtpbl0JCWlTdGVwT3JnCVN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcgotICogW2luXQkJcFNyY1JlZgkJUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrCi0gKiBbaW5dCQlpU3RlcFJlZglTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyCi0gKiBbaW5dCQlpSGVpZ2h0CQlIZWlnaHQgb2YgdGhlIGJsb2NrCi0gKiBbaW5dCQlpV2lkdGgJCVdpZHRoIG9mIHRoZSBibG9jawotICogW291dF0JcERzdFNBRAkJUG9pbnRlciBvZiByZXN1bHQgU0FECi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotT01YUmVzdWx0IGFybVZDQ09NTV9TQUQoCQotCWNvbnN0IE9NWF9VOCogCXBTcmNPcmcsCi0JT01YX1UzMiAJaVN0ZXBPcmcsCi0JY29uc3QgT01YX1U4KiAJcFNyY1JlZiwKLQlPTVhfVTMyIAlpU3RlcFJlZiwKLQlPTVhfUzMyKglwRHN0U0FELAotCU9NWF9VMzIJCWlIZWlnaHQsCi0JT01YX1UzMgkJaVdpZHRoKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNDT01NX0F2ZXJhZ2UKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gYmxvY2tzIGFuZCBzdG9yZXMgdGhlIHJlc3VsdC4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqCVtpbl0JcFByZWQwCQkJUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAwCi0gKglbaW5dCXBQcmVkMQkJCVBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMQotICoJW2luXQlpUHJlZFN0ZXAwCSAgICBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwCi0gKglbaW5dCWlQcmVkU3RlcDEJICAgIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEKLSAqCVtpbl0JaURzdFN0ZXAgCQlTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKLSAqCVtpbl0JaVdpZHRoCQkJV2lkdGggb2YgdGhlIGJsb2NrcwotICoJW2luXQlpSGVpZ2h0CQkJSGVpZ2h0IG9mIHRoZSBibG9ja3MKLSAqCVtvdXRdCXBEc3RQcmVkCQlQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCi0gKgotICovCi0gT01YUmVzdWx0IGFybVZDQ09NTV9BdmVyYWdlICgKLQkgY29uc3QgT01YX1U4KiAJICAgIHBQcmVkMCwKLQkgY29uc3QgT01YX1U4KiAJICAgIHBQcmVkMSwJCi0JIE9NWF9VMzIJCWlQcmVkU3RlcDAsCi0JIE9NWF9VMzIJCWlQcmVkU3RlcDEsCi0JIE9NWF9VOCoJCXBEc3RQcmVkLAotCSBPTVhfVTMyCQlpRHN0U3RlcCwgCi0JIE9NWF9VMzIJCWlXaWR0aCwKLQkgT01YX1UzMgkJaUhlaWdodAotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9TQURRdWFyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBiZXR3ZWVuIG9uZSBibG9jayAocFNyYykgYW5kIHRoZSAKLSAqIGF2ZXJhZ2Ugb2YgdGhlIG90aGVyIHR3byAocFNyY1JlZjAgYW5kIHBTcmNSZWYxKQotICoKLSAqIFJlbWFya3M6Ci0gKgotICogW2luXQkJcFNyYwkJCQlQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jawotICogW2luXQkJcFNyY1JlZjAJCVBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDAKLSAqIFtpbl0JCXBTcmNSZWYxCQlQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxCi0gKiBbaW5dCQlpU3JjU3RlcCAJCVN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcgotICogW2luXQkJaVJlZlN0ZXAwCQlTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogW2luXQkJaVJlZlN0ZXAxIAlTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogW2luXQkJaUhlaWdodAkJCUhlaWdodCBvZiB0aGUgYmxvY2sKLSAqIFtpbl0JCWlXaWR0aAkJCVdpZHRoIG9mIHRoZSBibG9jawotICogW291dF0JcERzdFNBRAkJCVBvaW50ZXIgb2YgcmVzdWx0IFNBRAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLU9NWFJlc3VsdCBhcm1WQ000UDEwX1NBRFF1YXIoCi0JY29uc3QgT01YX1U4KiAJcFNyYywKLSAgICBjb25zdCBPTVhfVTgqIAlwU3JjUmVmMCwKLQljb25zdCBPTVhfVTgqIAlwU3JjUmVmMSwJCi0gICAgT01YX1UzMiAJaVNyY1N0ZXAsCi0gICAgT01YX1UzMgkJaVJlZlN0ZXAwLAotICAgIE9NWF9VMzIJCWlSZWZTdGVwMSwKLSAgICBPTVhfVTMyKglwRHN0U0FELAotICAgIE9NWF9VMzIgICAgIGlIZWlnaHQsCi0gICAgT01YX1UzMiAgICAgaVdpZHRoCi0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciBjaHJvbWEgY29tcG9uZW50cy4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqICBbaW5dICAgIHBTcmMgICAgICAgICAgICBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGUgaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKLSAqICBbaW5dICAgIGlTcmNTdGVwICAgIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCi0gKiAgW2luXSAgICBpRHN0U3RlcCAgICBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCi0gKiAgW2luXSAgICBpV2lkdGggICAgICBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jawotICogIFtpbl0gICAgaUhlaWdodCAgICAgSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiAgW2luXSAgICBkeCAgICAgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvciAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgdW5pdCAoMH43KSAKLSAqICBbaW5dICAgIGR5ICAgICAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgdW5pdCAoMH43KQotICogIFtvdXRdICAgcERzdCAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotIE9NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYSgKLSAgICAgICAgT01YX1U4ICAgICAgKnBTcmMsCi0gICAgICAgIE9NWF9VMzIgICAgIGlTcmNTdGVwLAotICAgICAgICBPTVhfVTggICAgICAqcERzdCwKLSAgICAgICAgT01YX1UzMiAgICAgaURzdFN0ZXAsCi0gICAgICAgIE9NWF9VMzIgICAgIGlXaWR0aCwKLSAgICAgICAgT01YX1UzMiAgICAgaUhlaWdodCwKLSAgICAgICAgT01YX1UzMiAgICAgZHgsCi0gICAgICAgIE9NWF9VMzIgICAgIGR5Ci0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgbHVtYSBjb21wb25lbnRzLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogIFtpbl0gICAgcFNyYyAgICAgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnBvbGF0ZSBpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQotICogIFtpbl0gICAgaVNyY1N0ZXAgICAgU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KLSAqICBbaW5dICAgIGlEc3RTdGVwICAgIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KLSAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqICBbaW5dICAgIGR4ICAgICAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvNCBwaXhlbCB1bml0ICgwfjMpIAotICogIFtpbl0gICAgZHkgICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvNCBwaXhlbCB1bml0ICgwfjMpIAotICogIFtvdXRdICAgcERzdCAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotCi0gT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYSgKLSAgICAgY29uc3QgT01YX1U4ICAgICAqcFNyYywKLSAgICAgT01YX1UzMiAgICBpU3JjU3RlcCwKLSAgICAgT01YX1U4ICAgICAqcERzdCwKLSAgICAgT01YX1UzMiAgICBpRHN0U3RlcCwKLSAgICAgT01YX1UzMiAgICBpV2lkdGgsCi0gICAgIE9NWF9VMzIgICAgaUhlaWdodCwKLSAgICAgT01YX1UzMiAgICBkeCwKLSAgICAgT01YX1UzMiAgICBkeQotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogb214VkNIMjY0X0RlcXVhbnRUcmFuc2Zvcm1BQ0Zyb21QYWlyX1U4X1MxNl9DMV9ETHgKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFJlY29uc3RydWN0IHRoZSA0eDQgcmVzaWR1YWwgYmxvY2sgZnJvbSBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciwKLSAqIHBlcmZvcm0gZGVxdWFudGlzYXRpb24gYW5kIGludGVnZXIgaW52ZXJzZSB0cmFuc2Zvcm1hdGlvbiBmb3IgNHg0IGJsb2NrIG9mCi0gKiByZXNpZHVhbHMgYW5kIHVwZGF0ZSB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byBuZXh0IG5vbi1lbXB0eSBibG9jay4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwU3JjCQlEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbgotICoJCQkJCQkJcGFpciBidWZmZXIgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nCi0gKiBbaW5dCXBEQwkJCVBvaW50ZXIgdG8gdGhlIERDIGNvZWZmaWNpZW50IG9mIHRoaXMgYmxvY2ssIE5VTEwKLSAqCQkJCQkJCWlmIGl0IGRvZXNuJ3QgZXhpc3QKLSAqIFtpbl0JUVAJCQlRdWFudGl6YXRpb24gcGFyYW1ldGVyCi0gKiBbaW5dIEFDICAgICAgICAgIEZsYWcgaW5kaWNhdGluZyBpZiBhdCBsZWFzdCBvbmUgbm9uLXplcm8gY29lZmZpY2llbnQgZXhpc3RzCi0gKiBbb3V0XQlwRHN0CQlwb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIDR4NCBibG9jayBkYXRhCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgb214RXJyb3IgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybUFDRnJvbVBhaXJfVThfUzE2X0MxX0RMeCgKLSAgICAgT01YX1U4ICoqcHBTcmMsCi0gICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgIE9NWF9JTlQgUVAsCi0gICAgIE9NWF9TMTYqIHBEQywKLSAgICAgaW50IEFDCi0pOwotCi0jZW5kaWYgIC8qX2FybVZpZGVvX0hfKi8KLQotLypFbmQgb2YgRmlsZSovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvYXBpL29teFZDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2FwaS9vbXhWQy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjNjYzcyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvYXBpL29teFZDLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MzgxICswLDAgQEAKLS8qKgotICogRmlsZTogb214VkMuaAotICogQnJpZWY6IE9wZW5NQVggREwgdjEuMC4yIC0gVmlkZW8gQ29kaW5nIGxpYnJhcnkKLSAqCi0gKiBDb3B5cmlnaHQgqSAyMDA1LTIwMDggVGhlIEtocm9ub3MgR3JvdXAgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSAqCi0gKiBUaGVzZSBtYXRlcmlhbHMgYXJlIHByb3RlY3RlZCBieSBjb3B5cmlnaHQgbGF3cyBhbmQgY29udGFpbiBtYXRlcmlhbCAKLSAqIHByb3ByaWV0YXJ5IHRvIHRoZSBLaHJvbm9zIEdyb3VwLCBJbmMuICBZb3UgbWF5IHVzZSB0aGVzZSBtYXRlcmlhbHMgCi0gKiBmb3IgaW1wbGVtZW50aW5nIEtocm9ub3Mgc3BlY2lmaWNhdGlvbnMsIHdpdGhvdXQgYWx0ZXJpbmcgb3IgcmVtb3ZpbmcgCi0gKiBhbnkgdHJhZGVtYXJrLCBjb3B5cmlnaHQgb3Igb3RoZXIgbm90aWNlIGZyb20gdGhlIHNwZWNpZmljYXRpb24uCi0gKiAKLSAqIEtocm9ub3MgR3JvdXAgbWFrZXMgbm8sIGFuZCBleHByZXNzbHkgZGlzY2xhaW1zIGFueSwgcmVwcmVzZW50YXRpb25zIAotICogb3Igd2FycmFudGllcywgZXhwcmVzcyBvciBpbXBsaWVkLCByZWdhcmRpbmcgdGhlc2UgbWF0ZXJpYWxzLCBpbmNsdWRpbmcsIAotICogd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBvciBmaXRuZXNzIAotICogZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIG9yIG5vbi1pbmZyaW5nZW1lbnQgb2YgYW55IGludGVsbGVjdHVhbCBwcm9wZXJ0eS4gCi0gKiBLaHJvbm9zIEdyb3VwIG1ha2VzIG5vLCBhbmQgZXhwcmVzc2x5IGRpc2NsYWltcyBhbnksIHdhcnJhbnRpZXMsIGV4cHJlc3MgCi0gKiBvciBpbXBsaWVkLCByZWdhcmRpbmcgdGhlIGNvcnJlY3RuZXNzLCBhY2N1cmFjeSwgY29tcGxldGVuZXNzLCB0aW1lbGluZXNzLCAKLSAqIGFuZCByZWxpYWJpbGl0eSBvZiB0aGVzZSBtYXRlcmlhbHMuIAotICoKLSAqIFVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgd2lsbCB0aGUgS2hyb25vcyBHcm91cCwgb3IgYW55IG9mIGl0cyBQcm9tb3RlcnMsIAotICogQ29udHJpYnV0b3JzIG9yIE1lbWJlcnMgb3IgdGhlaXIgcmVzcGVjdGl2ZSBwYXJ0bmVycywgb2ZmaWNlcnMsIGRpcmVjdG9ycywgCi0gKiBlbXBsb3llZXMsIGFnZW50cyBvciByZXByZXNlbnRhdGl2ZXMgYmUgbGlhYmxlIGZvciBhbnkgZGFtYWdlcywgd2hldGhlciAKLSAqIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIGZvciBsb3N0IHJldmVudWVzLCAKLSAqIGxvc3QgcHJvZml0cywgb3Igb3RoZXJ3aXNlLCBhcmlzaW5nIGZyb20gb3IgaW4gY29ubmVjdGlvbiB3aXRoIHRoZXNlIAotICogbWF0ZXJpYWxzLgotICogCi0gKiBLaHJvbm9zIGFuZCBPcGVuTUFYIGFyZSB0cmFkZW1hcmtzIG9mIHRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCi0gKgotICovCi0KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9PTVhWQ19IXwotI2RlZmluZSBfT01YVkNfSF8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotCi0vKiA2LjEuMS4xIE1vdGlvbiBWZWN0b3JzICAqLwotLyogSW4gb214VkMsIG1vdGlvbiB2ZWN0b3JzIGFyZSByZXByZXNlbnRlZCBhcyBmb2xsb3dzOiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE9NWF9TMTYgZHg7Ci0gICAgT01YX1MxNiBkeTsKLX0gT01YVkNNb3Rpb25WZWN0b3I7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0F2ZXJhZ2VfOHggICAoNi4xLjMuMS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byA4eDQsIDh4OCwgb3IgOHgxNiBibG9ja3MuICBUaGUgCi0gKiByZXN1bHQgaXMgcm91bmRlZCBhY2NvcmRpbmcgdG8gKGErYisxKS8yLiAgVGhlIGJsb2NrIGF2ZXJhZ2UgZnVuY3Rpb24gY2FuIAotICogYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGhhbGYtcGl4ZWwgaW50ZXJwb2xhdGlvbiB0byBvYnRhaW4gcXVhcnRlciAKLSAqIHBpeGVsIG1vdGlvbiBlc3RpbWF0ZXMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMTBdLCBzdWJjbGF1c2UgOC40LjIuMi4xLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwUHJlZDAgICAgIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogICBwUHJlZDEgICAgIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpUHJlZFN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgaVByZWRTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlEc3RTdGVwICAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuIAotICogICBpSGVpZ2h0ICAgIC0gSGVpZ2h0IG9mIHRoZSBibG9ja3MgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RQcmVkIC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiA4LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAotICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFByZWQwLCBwUHJlZDEsIG9yIAotICogICAgICAgICAgICAgIHBEc3RQcmVkLiAKLSAqICAgIC0gICBwRHN0UHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICAgLSAgIGlQcmVkU3RlcDAgPD0gMCBvciBpUHJlZFN0ZXAwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgIGlQcmVkU3RlcDEgPD0gMCBvciBpUHJlZFN0ZXAxIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgIGlEc3RTdGVwICAgPD0gMCBvciBpRHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICBpSGVpZ2h0IGlzIG5vdCA0LCA4LCBvciAxNi4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNDT01NX0F2ZXJhZ2VfOHggKAotICAgIGNvbnN0IE9NWF9VOCAqcFByZWQwLAotICAgIGNvbnN0IE9NWF9VOCAqcFByZWQxLAotICAgIE9NWF9VMzIgaVByZWRTdGVwMCwKLSAgICBPTVhfVTMyIGlQcmVkU3RlcDEsCi0gICAgT01YX1U4ICpwRHN0UHJlZCwKLSAgICBPTVhfVTMyIGlEc3RTdGVwLAotICAgIE9NWF9VMzIgaUhlaWdodAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQXZlcmFnZV8xNnggICAoNi4xLjMuMS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byAxNngxNiBvciAxNng4IGJsb2Nrcy4gIFRoZSAKLSAqIHJlc3VsdCBpcyByb3VuZGVkIGFjY29yZGluZyB0byAoYStiKzEpLzIuICBUaGUgYmxvY2sgYXZlcmFnZSBmdW5jdGlvbiBjYW4gCi0gKiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggaGFsZi1waXhlbCBpbnRlcnBvbGF0aW9uIHRvIG9idGFpbiBxdWFydGVyIAotICogcGl4ZWwgbW90aW9uIGVzdGltYXRlcywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0xMF0sIHN1YmNsYXVzZSA4LjQuMi4yLjEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBQcmVkMCAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgcFByZWQxIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpUHJlZFN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgaVByZWRTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlEc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyIAotICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9ja3MgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RQcmVkIC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAxNi1ieXRlIGFsaWduZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBQcmVkMCwgcFByZWQxLCBvciAKLSAqICAgICAgICAgICAgICBwRHN0UHJlZC4gCi0gKiAgICAtICAgcERzdFByZWQgaXMgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgIC0gICBpUHJlZFN0ZXAwIDw9IDAgb3IgaVByZWRTdGVwMCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgICAtICAgaVByZWRTdGVwMSA8PSAwIG9yIGlQcmVkU3RlcDEgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICogICAgLSAgIGlEc3RTdGVwIDw9IDAgb3IgaURzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICogICAgLSAgIGlIZWlnaHQgaXMgbm90IDggb3IgMTYuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDQ09NTV9BdmVyYWdlXzE2eCAoCi0gICAgY29uc3QgT01YX1U4ICpwUHJlZDAsCi0gICAgY29uc3QgT01YX1U4ICpwUHJlZDEsCi0gICAgT01YX1UzMiBpUHJlZFN0ZXAwLAotICAgIE9NWF9VMzIgaVByZWRTdGVwMSwKLSAgICBPTVhfVTggKnBEc3RQcmVkLAotICAgIE9NWF9VMzIgaURzdFN0ZXAsCi0gICAgT01YX1UzMiBpSGVpZ2h0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9FeHBhbmRGcmFtZV9JICAgKDYuMS4zLjIuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gZXhwYW5kcyBhIHJlY29uc3RydWN0ZWQgZnJhbWUgaW4tcGxhY2UuICBUaGUgdW5leHBhbmRlZCAKLSAqIHNvdXJjZSBmcmFtZSBzaG91bGQgYmUgc3RvcmVkIGluIGEgcGxhbmUgYnVmZmVyIHdpdGggc3VmZmljaWVudCBzcGFjZSAKLSAqIHByZS1hbGxvY2F0ZWQgZm9yIGVkZ2UgZXhwYW5zaW9uLCBhbmQgdGhlIGlucHV0IGZyYW1lIHNob3VsZCBiZSBsb2NhdGVkIGluIAotICogdGhlIHBsYW5lIGJ1ZmZlciBjZW50ZXIuICBUaGlzIGZ1bmN0aW9uIGV4ZWN1dGVzIHRoZSBwaXhlbCBleHBhbnNpb24gYnkgCi0gKiByZXBsaWNhdGluZyBzb3VyY2UgZnJhbWUgZWRnZSBwaXhlbCBpbnRlbnNpdGllcyBpbiB0aGUgZW1wdHkgcGl4ZWwgCi0gKiBsb2NhdGlvbnMgKGV4cGFuc2lvbiByZWdpb24pIGJldHdlZW4gdGhlIHNvdXJjZSBmcmFtZSBlZGdlIGFuZCB0aGUgcGxhbmUgCi0gKiBidWZmZXIgZWRnZS4gIFRoZSB3aWR0aC9oZWlnaHQgb2YgdGhlIGV4cGFuc2lvbiByZWdpb25zIG9uIHRoZSAKLSAqIGhvcml6b250YWwvdmVydGljYWwgZWRnZXMgaXMgY29udHJvbGxlZCBieSB0aGUgcGFyYW1ldGVyIGlFeHBhbmRQZWxzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0UGxhbmUgLSBwb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGZyYW1lIHRvIGJlIAotICogICAgICAgICAgICBleHBhbmRlZDsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIGlGcmFtZVdpZHRoIC0gZnJhbWUgd2lkdGg7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgaUZyYW1lSGVpZ2h0IC1mcmFtZSBoZWlnaHQ7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgaUV4cGFuZFBlbHMgLSBudW1iZXIgb2YgcGl4ZWxzIHRvIGJlIGV4cGFuZGVkIGluIHRoZSBob3Jpem9udGFsIGFuZCAKLSAqICAgICAgICAgICAgdmVydGljYWwgZGlyZWN0aW9uczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBpUGxhbmVTdGVwIC0gZGlzdGFuY2UsIGluIGJ5dGVzLCBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcyAKLSAqICAgICAgICAgICAgaW4gdGhlIHBsYW5lIGJ1ZmZlcjsgbXVzdCBiZSBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byAKLSAqICAgICAgICAgICAgKGlGcmFtZVdpZHRoICsgMiAqIGlFeHBhbmRQZWxzKS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3RQbGFuZSAtUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBmcmFtZSAoTk9UIHRoZSAKLSAqICAgICAgICAgICAgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBwbGFuZSk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCi0gKiAgICAtICAgIHBTcmNEc3RQbGFuZSBpcyBOVUxMLiAKLSAqICAgIC0gICAgcFNyY0RzdFBsYW5lIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgICAtICAgIG9uZSBvZiB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgaXMgZWl0aGVyIGVxdWFsIHRvIHplcm8gb3IgaXMgYSAKLSAqICAgICAgICAgICAgICBub24tbXVsdGlwbGUgb2YgODogaUZyYW1lSGVpZ2h0LCBpRnJhbWVXaWR0aCwgaVBsYW5lU3RlcCwgb3IgCi0gKiAgICAgICAgICAgICAgaUV4cGFuZFBlbHMuIAotICogICAgLSAgICBpUGxhbmVTdGVwIDwgKGlGcmFtZVdpZHRoICsgMiAqIGlFeHBhbmRQZWxzKS4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNDT01NX0V4cGFuZEZyYW1lX0kgKAotICAgIE9NWF9VOCAqcFNyY0RzdFBsYW5lLAotICAgIE9NWF9VMzIgaUZyYW1lV2lkdGgsCi0gICAgT01YX1UzMiBpRnJhbWVIZWlnaHQsCi0gICAgT01YX1UzMiBpRXhwYW5kUGVscywKLSAgICBPTVhfVTMyIGlQbGFuZVN0ZXAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvcHk4eDggICAoNi4xLjMuMy4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29waWVzIHRoZSByZWZlcmVuY2UgOHg4IGJsb2NrIHRvIHRoZSBjdXJyZW50IGJsb2NrLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIGluIHRoZSBzb3VyY2UgZnJhbWU7IG11c3QgYmUgCi0gKiAgICAgICAgICAgIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgc3RlcCAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0cyBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgcmVmZXJlbmNlIAotICogICAgICAgICAgICBmcmFtZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4IGFuZCBtdXN0IGJlIGxhcmdlciB0aGFuIAotICogICAgICAgICAgICBvciBlcXVhbCB0byA4LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAotICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcERzdCAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKLSAqICAgICAgICAgICAgICBib3VuZGFyeTogcFNyYywgcERzdCAKLSAqICAgIC0gICAgc3RlcCA8OCBvciBzdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDQ09NTV9Db3B5OHg4ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgT01YX1U4ICpwRHN0LAotICAgIE9NWF9JTlQgc3RlcAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQ29weTE2eDE2ICAgKDYuMS4zLjMuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvcGllcyB0aGUgcmVmZXJlbmNlIDE2eDE2IG1hY3JvYmxvY2sgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jay4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBtYWNyb2Jsb2NrIGluIHRoZSBzb3VyY2UgZnJhbWU7IG11c3QgYmUgCi0gKiAgICAgICAgICAgIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgc3RlcCAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0cyBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgcmVmZXJlbmNlIAotICogICAgICAgICAgICBmcmFtZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNiBhbmQgbXVzdCBiZSBsYXJnZXIgCi0gKiAgICAgICAgICAgIHRoYW4gb3IgZXF1YWwgdG8gMTYuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gbWFjcm9ibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgCi0gKiAgICAgICAgICAgIDE2LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBEc3QgCi0gKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCi0gKiAgICAgICAgICAgICAgYm91bmRhcnk6IHBTcmMsIHBEc3QgCi0gKiAgICAtICAgIHN0ZXAgPDE2IG9yIHN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDQ09NTV9Db3B5MTZ4MTYgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBPTVhfVTggKnBEc3QsCi0gICAgT01YX0lOVCBzdGVwCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FEICAgKDYuMS40LjEuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbXB1dGVzIHRleHR1cmUgZXJyb3Igb2YgdGhlIGJsb2NrOyBhbHNvIHJldHVybnMgU0FELiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgc291cmNlIHBsYW5lOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIHNyY1N0ZXAgLSBzdGVwIG9mIHRoZSBzb3VyY2UgcGxhbmUgCi0gKiAgIHBTcmNSZWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYnVmZmVyLCBhbiA4eDggYmxvY2s7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgYW4gOHg4IGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIHRoZSBTdW0gb2YgQWJzb2x1dGUgRGlmZmVyZW5jZXMgKFNBRCkgdmFsdWUgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCi0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwU3JjUmVmLCBwRHN0IGFuZCBwRHN0U0FELiAKLSAqICAgIC0gICAgcFNyYyBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBTcmNTdGVwIDw9IDAgb3Igc3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICAgcFNyY1JlZiBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBwRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBPTVhfSU5UIHNyY1N0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAotICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgT01YX0lOVCAqcERzdFNBRAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrICAgKDYuMS40LjEuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbXB1dGVzIHRoZSB0ZXh0dXJlIGVycm9yIG9mIHRoZSBibG9jay4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBwbGFuZS4gVGhpcyBzaG91bGQgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgc3JjU3RlcCAtIHN0ZXAgb2YgdGhlIHNvdXJjZSBwbGFuZSAKLSAqICAgcFNyY1JlZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBidWZmZXIsIGFuIDh4OCBibG9jay4gVGhpcyBzaG91bGQgYmUgCi0gKiAgICAgICAgICAgIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgYW4gOHg4IGJsb2NrLiBUaGlzIHNob3VsZCBiZSAKLSAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyYywgcFNyY1JlZiwgcERzdC4gCi0gKiAgICAtICAgIHBTcmMgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgU3JjU3RlcCA8PSAwIG9yIHNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgIHBTcmNSZWYgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgcERzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jayAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIE9NWF9JTlQgc3JjU3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCi0gICAgT01YX1MxNiAqcERzdAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fTGltaXRNVlRvUmVjdCAgICg2LjEuNC4xLjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBMaW1pdHMgdGhlIG1vdGlvbiB2ZWN0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IGJsb2NrL21hY3JvYmxvY2sgdG8gCi0gKiBwcmV2ZW50IHRoZSBtb3Rpb24gY29tcGVuc2F0ZWQgYmxvY2svbWFjcm9ibG9jayBmcm9tIG1vdmluZyBvdXRzaWRlIGEgCi0gKiBib3VuZGluZyByZWN0YW5nbGUgYXMgc2hvd24gaW4gRmlndXJlIDYtMS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY01WIC0gcG9pbnRlciB0byB0aGUgbW90aW9uIHZlY3RvciBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgYmxvY2sgCi0gKiAgICAgICAgICAgIG9yIG1hY3JvYmxvY2sgCi0gKiAgIHBSZWN0Vk9QUmVmIC0gcG9pbnRlciB0byB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIAotICogICBYY29vcmQsIFljb29yZCAgLSBjb29yZGluYXRlcyBvZiB0aGUgY3VycmVudCBibG9jayBvciBtYWNyb2Jsb2NrIAotICogICBzaXplIC0gc2l6ZSBvZiB0aGUgY3VycmVudCBibG9jayBvciBtYWNyb2Jsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIDggb3IgCi0gKiAgICAgICAgICAgIDE2LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdE1WIC0gcG9pbnRlciB0byB0aGUgbGltaXRlZCBtb3Rpb24gdmVjdG9yIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9yIG1vcmUgb2YgdGhlIAotICogICAgICAgICAgICAgIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyY01WLCBwRHN0TVYsIG9yIHBSZWN0Vk9QUmVmLiAKLSAqICAgIC0gICAgc2l6ZSBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDggb3IgMTYuIAotICogICAgLSAgICB0aGUgd2lkdGggb3IgaGVpZ2h0IG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUgaXMgbGVzcyB0aGFuIAotICogICAgICAgICB0d2ljZSB0aGUgYmxvY2sgc2l6ZS4KLSAqLwotT01YUmVzdWx0IG9teFZDQ09NTV9MaW1pdE1WVG9SZWN0ICgKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WLAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVYsCi0gICAgY29uc3QgT01YUmVjdCAqcFJlY3RWT1BSZWYsCi0gICAgT01YX0lOVCBYY29vcmQsCi0gICAgT01YX0lOVCBZY29vcmQsCi0gICAgT01YX0lOVCBzaXplCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9TQURfMTZ4ICAgKDYuMS40LjEuNCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGZvciAxNngxNiBhbmQgMTZ4OCBibG9ja3MuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNPcmcgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKLSAqICAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgaVN0ZXBPcmcgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXIgCi0gKiAgIHBTcmNSZWYgIC0gUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIAotICogICBpU3RlcFJlZiAtIFN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXIgCi0gKiAgIGlIZWlnaHQgIC0gSGVpZ2h0IG9mIHRoZSBibG9jayAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFNBRCAtIFBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKLSAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmNPcmcsIHBEc3RTQUQsIG9yIHBTcmNSZWYgCi0gKiAgICAtICAgIHBTcmNPcmcgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIGlTdGVwT3JnICA8PSAwIG9yIGlTdGVwT3JnIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2IAotICogICAgLSAgICBpU3RlcFJlZiA8PSAwIG9yIGlTdGVwUmVmIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2IAotICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCA4IG9yIDE2IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDQ09NTV9TQURfMTZ4ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNPcmcsCi0gICAgT01YX1UzMiBpU3RlcE9yZywKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCi0gICAgT01YX1UzMiBpU3RlcFJlZiwKLSAgICBPTVhfUzMyICpwRHN0U0FELAotICAgIE9NWF9VMzIgaUhlaWdodAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fU0FEXzh4ICAgKDYuMS40LjEuNSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGZvciA4eDE2LCA4eDgsIDh4NCBibG9ja3MuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNPcmcgIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDgtYnl0ZSAKLSAqICAgICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIGlTdGVwT3JnIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyIAotICogICBwU3JjUmVmICAtIFBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayAKLSAqICAgaVN0ZXBSZWYgLSBTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyIAotICogICBpSGVpZ2h0ICAtIEhlaWdodCBvZiB0aGUgYmxvY2sgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RTQUQgLVBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKLSAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmNPcmcsIHBEc3RTQUQsIG9yIHBTcmNSZWYgCi0gKiAgICAtICAgIHBTcmNPcmcgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgaVN0ZXBPcmcgIDw9IDAgb3IgaVN0ZXBPcmcgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCAKLSAqICAgIC0gICAgaVN0ZXBSZWYgPD0gMCBvciBpU3RlcFJlZiBpcyBub3QgYSBtdWx0aXBsZSBvZiA4IAotICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCA0LCA4IG9yIDE2IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDQ09NTV9TQURfOHggKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZywKLSAgICBPTVhfVTMyIGlTdGVwT3JnLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKLSAgICBPTVhfVTMyIGlTdGVwUmVmLAotICAgIE9NWF9TMzIqcERzdFNBRCwKLSAgICBPTVhfVTMyIGlIZWlnaHQKLSk7Ci0KLQotCi0vKiA2LjIuMS4xIERpcmVjdGlvbiAgKi8KLS8qIFRoZSBkaXJlY3Rpb24gZW51bWVyYXRvciBpcyB1c2VkIHdpdGggZnVuY3Rpb25zIHRoYXQgcGVyZm9ybSBBQy9EQyBwcmVkaWN0aW9uIGFuZCB6aWctemFnIHNjYW4uICAqLwotCi1lbnVtIHsKLSAgICBPTVhfVkNfTk9ORSAgICAgICA9IDAsCi0gICAgT01YX1ZDX0hPUklaT05UQUwgPSAxLAotICAgIE9NWF9WQ19WRVJUSUNBTCAgID0gMiAKLX07Ci0KLQotCi0vKiA2LjIuMS4yIEJpbGluZWFyIEludGVycG9sYXRpb24gICovCi0vKiBUaGUgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBlbnVtZXJhdG9yIGlzIHVzZWQgd2l0aCBtb3Rpb24gZXN0aW1hdGlvbiwgbW90aW9uIGNvbXBlbnNhdGlvbiwgYW5kIHJlY29uc3RydWN0aW9uIGZ1bmN0aW9ucy4gICovCi0KLWVudW0gewotICAgIE9NWF9WQ19JTlRFR0VSX1BJWEVMID0gMCwgLyogY2FzZSBhICovCi0gICAgT01YX1ZDX0hBTEZfUElYRUxfWCAgPSAxLCAvKiBjYXNlIGIgKi8KLSAgICBPTVhfVkNfSEFMRl9QSVhFTF9ZICA9IDIsIC8qIGNhc2UgYyAqLwotICAgIE9NWF9WQ19IQUxGX1BJWEVMX1hZID0gMyAgLyogY2FzZSBkICovIAotfTsKLQotCi0KLS8qIDYuMi4xLjMgTmVpZ2hib3JpbmcgTWFjcm9ibG9jayBBdmFpbGFiaWxpdHkgICovCi0vKiBOZWlnaGJvcmluZyBtYWNyb2Jsb2NrIGF2YWlsYWJpbGl0eSBpcyBpbmRpY2F0ZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBmbGFnczogICAqLwotCi1lbnVtIHsKLSAgICBPTVhfVkNfVVBQRVIgPSAxLCAgICAgICAgLyoqIGFib3ZlIG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCi0gICAgT01YX1ZDX0xFRlQgPSAyLCAgICAgICAgIC8qKiBsZWZ0IG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCi0gICAgT01YX1ZDX0NFTlRFUiA9IDQsCi0gICAgT01YX1ZDX1JJR0hUID0gOCwKLSAgICBPTVhfVkNfTE9XRVIgPSAxNiwKLSAgICBPTVhfVkNfVVBQRVJfTEVGVCA9IDMyLCAgLyoqIGFib3ZlLWxlZnQgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KLSAgICBPTVhfVkNfVVBQRVJfUklHSFQgPSA2NCwgLyoqIGFib3ZlLXJpZ2h0IG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCi0gICAgT01YX1ZDX0xPV0VSX0xFRlQgPSAxMjgsCi0gICAgT01YX1ZDX0xPV0VSX1JJR0hUID0gMjU2IAotfTsKLQotCi0KLS8qIDYuMi4xLjQgVmlkZW8gQ29tcG9uZW50cyAgKi8KLS8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyB2aWRlbyBjb21wb25lbnRzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgT01YX1ZDX0xVTUlOQU5DRSwgICAgLyoqIEx1bWluYW5jZSBjb21wb25lbnQgKi8KLSAgICBPTVhfVkNfQ0hST01JTkFOQ0UgICAvKiogY2hyb21pbmFuY2UgY29tcG9uZW50ICovIAotfSBPTVhWQ000UDJWaWRlb0NvbXBvbmVudDsKLQotCi0KLS8qIDYuMi4xLjUgTWFjcm9ibG9ja1R5cGVzICAqLwotLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIG1hY3JvYmxvY2sgdHlwZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBPTVhfVkNfSU5URVIgICAgID0gMCwgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLwotICAgIE9NWF9WQ19JTlRFUl9RICAgPSAxLCAvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCi0gICAgT01YX1ZDX0lOVEVSNFYgICA9IDIsIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KLSAgICBPTVhfVkNfSU5UUkEgICAgID0gMywgLyoqIEkgYW5kIFAgcGljdHVyZSwgSS0gYW5kIFAtVk9QICovCi0gICAgT01YX1ZDX0lOVFJBX1EgICA9IDQsIC8qKiBJIGFuZCBQIHBpY3R1cmUsIEktIGFuZCBQLVZPUCAqLwotICAgIE9NWF9WQ19JTlRFUjRWX1EgPSA1ICAvKiogUCBwaWN0dXJlIG9yIFAtVk9QIChILjI2MykqLwotfSBPTVhWQ000UDJNYWNyb2Jsb2NrVHlwZTsKLQotCi0KLS8qIDYuMi4xLjYgQ29vcmRpbmF0ZXMgICovCi0vKiBDb29yZGluYXRlcyBhcmUgcmVwcmVzZW50ZWQgYXMgZm9sbG93czogICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBPTVhfSU5UIHg7Ci0gICAgT01YX0lOVCB5OwotfSBPTVhWQ000UDJDb29yZGluYXRlOwotCi0KLQotLyogNi4yLjEuNyBNb3Rpb24gRXN0aW1hdGlvbiBBbGdvcml0aG1zICAqLwotLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIG1vdGlvbiBlc3RpbWF0aW9uIHNlYXJjaCBtZXRob2RzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgT01YX1ZDX000UDJfRkFTVF9TRUFSQ0ggPSAwLCAgLyoqIEZhc3QgbW90aW9uIHNlYXJjaCAqLwotICAgIE9NWF9WQ19NNFAyX0ZVTExfU0VBUkNIID0gMSAgIC8qKiBGdWxsIG1vdGlvbiBzZWFyY2ggKi8gCi19IE9NWFZDTTRQMk1FTW9kZTsKLQotCi0KLS8qIDYuMi4xLjggTW90aW9uIEVzdGltYXRpb24gUGFyYW1ldGVycyAgKi8KLS8qIEEgZGF0YSBzdHJ1Y3R1cmUgY29udGFpbmluZyBjb250cm9sIHBhcmFtZXRlcnMgZm9yIAotICogbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zIGlzIGRlZmluZWQgYXMgZm9sbG93czogIAotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBPTVhfSU5UIHNlYXJjaEVuYWJsZTh4ODsgICAgIC8qKiBlbmFibGVzIDh4OCBzZWFyY2ggKi8KLSAgICBPTVhfSU5UIGhhbGZQZWxTZWFyY2hFbmFibGU7IC8qKiBlbmFibGVzIGhhbGYtcGVsIHJlc29sdXRpb24gKi8KLSAgICBPTVhfSU5UIHNlYXJjaFJhbmdlOyAgICAgICAgIC8qKiBzZWFyY2ggcmFuZ2UgKi8KLSAgICBPTVhfSU5UIHJuZFZhbDsgICAgICAgICAgICAgIC8qKiByb3VuZGluZyBjb250cm9sOyAwLWRpc2FibGVkLCAxLWVuYWJsZWQqLwotfSBPTVhWQ000UDJNRVBhcmFtczsKLQotCi0KLS8qIDYuMi4xLjkgTWFjcm9ibG9jayBJbmZvcm1hdGlvbiAgICovCi0vKiBBIGRhdGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgbWFjcm9ibG9jayBwYXJhbWV0ZXJzIGZvciAKLSAqIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9ucyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAKLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgT01YX1MzMiBzbGljZUlkOyAgICAgICAgICAgICAgICAgLyogc2xpY2UgbnVtYmVyICovCi0gICAgT01YVkNNNFAyTWFjcm9ibG9ja1R5cGUgbWJUeXBlOyAgLyogTUIgdHlwZTogT01YX1ZDX0lOVFJBLCBPTVhfVkNfSU5URVIsIG9yIE9NWF9WQ19JTlRFUjQgKi8KLSAgICBPTVhfUzMyIHFwOyAgICAgICAgICAgICAgICAgICAgICAvKiBxdWFudGl6YXRpb24gcGFyYW1ldGVyKi8KLSAgICBPTVhfVTMyIGNicHk7ICAgICAgICAgICAgICAgICAgICAvKiBDQlAgTHVtYSAqLwotICAgIE9NWF9VMzIgY2JwYzsgICAgICAgICAgICAgICAgICAgIC8qIENCUCBDaHJvbWEgKi8KLSAgICBPTVhWQ01vdGlvblZlY3RvciBwTVYwWzJdWzJdOyAgICAvKiBtb3Rpb24gdmVjdG9yLCByZXByZXNlbnRlZCB1c2luZyAxLzItcGVsIHVuaXRzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwTVYwW2Jsb2NreV1bYmxvY2t4XSAoYmxvY2t5ID0gMH4xLCBibG9ja3ggPTB+MSkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgcE1WUHJlZFsyXVsyXTsgLyogbW90aW9uIHZlY3RvciBwcmVkaWN0aW9uLCByZXByZXNlbnRlZCB1c2luZyAxLzItcGVsIHVuaXRzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwTVZQcmVkW2Jsb2NreV1bYmxvY2t4XSAoYmxvY2t5ID0gMH4xLCBibG9ja3ggPSAwfjEpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIE9NWF9VOCBwUHJlZERpclsyXVsyXTsgICAgICAgICAgIC8qIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uOiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIE9NWF9WQ19OT05FLCBPTVhfVkNfVkVSVElDQUwsIE9NWF9WQ19IT1JJWk9OVEFMIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotfSBPTVhWQ000UDJNQkluZm8sICpPTVhWQ000UDJNQkluZm9QdHI7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0ZpbmRNVnByZWQgICAoNi4yLjMuMS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUHJlZGljdHMgYSBtb3Rpb24gdmVjdG9yIGZvciB0aGUgY3VycmVudCBibG9jayB1c2luZyB0aGUgcHJvY2VkdXJlIAotICogc3BlY2lmaWVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi41LiAgVGhlIHJlc3VsdGluZyBwcmVkaWN0ZWQgTVYgaXMgCi0gKiByZXR1cm5lZCBpbiBwRHN0TVZQcmVkLiBJZiB0aGUgcGFyYW1ldGVyIHBEc3RNVlByZWRNRSBpZiBpcyBub3QgTlVMTCB0aGVuIAotICogdGhlIHNldCBvZiB0aHJlZSBNViBjYW5kaWRhdGVzIHVzZWQgZm9yIHByZWRpY3Rpb24gaXMgYWxzbyByZXR1cm5lZCwgCi0gKiBvdGhlcndpc2UgcERzdE1WUHJlZE1FaXMgTlVMTCB1cG9uIHJldHVybi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY01WQ3VyTUIgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IFkgCi0gKiAgICAgICAgICAgIG1hY3JvYmxvY2s7IGEgdmFsdWUgb2YgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAotICogICBwU3JjQ2FuZE1WMSAtIHBvaW50ZXIgdG8gdGhlIE1WIGJ1ZmZlciBjb250YWluaW5nIHRoZSA0IE1WcyBhc3NvY2lhdGVkIAotICogICAgICAgICAgICB3aXRoIHRoZSBNQiBsb2NhdGVkIHRvIHRoZSBsZWZ0IG9mIHRoZSBjdXJyZW50IE1COyBzZXQgdG8gTlVMTCAKLSAqICAgICAgICAgICAgaWYgdGhlcmUgaXMgbm8gTUIgdG8gdGhlIGxlZnQuIAotICogICBwU3JjQ2FuZE1WMiAtIHBvaW50ZXIgdG8gdGhlIE1WIGJ1ZmZlciBjb250YWluaW5nIHRoZSA0IE1WcyBhc3NvY2lhdGVkIAotICogICAgICAgICAgICB3aXRoIHRoZSBNQiBsb2NhdGVkIGFib3ZlIHRoZSBjdXJyZW50IE1COyBzZXQgdG8gTlVMTCBpZiB0aGVyZSAKLSAqICAgICAgICAgICAgaXMgbm8gTUIgbG9jYXRlZCBhYm92ZSB0aGUgY3VycmVudCBNQi4gCi0gKiAgIHBTcmNDYW5kTVYzIC0gcG9pbnRlciB0byB0aGUgTVYgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIDQgTVZzIGFzc29jaWF0ZWQgCi0gKiAgICAgICAgICAgIHdpdGggdGhlIE1CIGxvY2F0ZWQgdG8gdGhlIHJpZ2h0IGFuZCBhYm92ZSB0aGUgY3VycmVudCBNQjsgc2V0IAotICogICAgICAgICAgICB0byBOVUxMIGlmIHRoZXJlIGlzIG5vIE1CIGxvY2F0ZWQgdG8gdGhlIGFib3ZlLXJpZ2h0LiAKLSAqICAgaUJsayAtIHRoZSBpbmRleCBvZiBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAotICogICBwRHN0TVZQcmVkTUUgLSBNViBjYW5kaWRhdGUgcmV0dXJuIGJ1ZmZlcjsgIGlmIHNldCB0byBOVUxMIHRoZW4gCi0gKiAgICAgICAgICAgIHByZWRpY3Rpb24gY2FuZGlkYXRlIE1WcyBhcmUgbm90IHJldHVybmVkIGFuZCBwRHN0TVZQcmVkTUUgd2lsbCAKLSAqICAgICAgICAgICAgYmUgTlVMTCB1cG9uIGZ1bmN0aW9uIHJldHVybjsgaWYgcERzdE1WUHJlZE1FIGlzIG5vbi1OVUxMIHRoZW4gaXQgCi0gKiAgICAgICAgICAgIG11c3QgcG9pbnQgdG8gYSBidWZmZXIgY29udGFpbmluZyBzdWZmaWNpZW50IHNwYWNlIGZvciB0aHJlZSAKLSAqICAgICAgICAgICAgcmV0dXJuIE1Wcy4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RNVlByZWQgLSBwb2ludGVyIHRvIHRoZSBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvciAKLSAqICAgcERzdE1WUHJlZE1FIC0gaWYgbm9uLU5VTEwgdXBvbiBpbnB1dCB0aGVuIHBEc3RNVlByZWRNRSAgcG9pbnRzIHVwb24gCi0gKiAgICAgICAgICAgIHJldHVybiB0byBhIGJ1ZmZlciBjb250YWluaW5nIHRoZSB0aHJlZSBtb3Rpb24gdmVjdG9yIGNhbmRpZGF0ZXMgCi0gKiAgICAgICAgICAgIHVzZWQgZm9yIHByZWRpY3Rpb24gYXMgc3BlY2lmaWVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIAotICogICAgICAgICAgICA3LjYuNSwgb3RoZXJ3aXNlIGlmIE5VTEwgdXBvbiBpbnB1dCB0aGVuIHBEc3RNVlByZWRNRSBpcyBOVUxMIAotICogICAgICAgICAgICB1cG9uIG91dHB1dC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAotICogICAgLSAgICB0aGUgcG9pbnRlciBwRHN0TVZQcmVkIGlzIE5VTEwgCi0gKiAgICAtICAgIHRoZSBwYXJhbWV0ZXIgaUJsayBkb2VzIG5vdCBmYWxsIGludG8gdGhlIHJhbmdlIDAgPD0gaUJsazw9MyAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRmluZE1WcHJlZCAoCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNVkN1ck1CLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjQ2FuZE1WMSwKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0NhbmRNVjIsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNDYW5kTVYzLAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVZQcmVkLAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVZQcmVkTUUsCi0gICAgT01YX0lOVCBpQmxrCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9JRENUOHg4YmxrICAgKDYuMi4zLjIuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbXB1dGVzIGEgMkQgaW52ZXJzZSBEQ1QgZm9yIGEgc2luZ2xlIDh4OCBibG9jaywgYXMgZGVmaW5lZCBpbiAKLSAqIFtJU08xNDQ5Ni0yXS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lYXJseSBhcnJhbmdlZCBJRENUIGlucHV0IGJ1ZmZlcjsgCi0gKiAgICAgICAgICAgIG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICBBY2NvcmRpbmcgdG8gCi0gKiAgICAgICAgICAgIFtJU08xNDQ5Ni0yXSwgdGhlIGlucHV0IGNvZWZmaWNpZW50IHZhbHVlcyBzaG91bGQgbGllIHdpdGhpbiB0aGUgCi0gKiAgICAgICAgICAgIHJhbmdlIFstMjA0OCwgMjA0N10uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmVhcmx5IGFycmFuZ2VkIElEQ1Qgb3V0cHV0IGJ1ZmZlcjsgCi0gKiAgICAgICAgICAgIG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgotICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCi0gKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfSURDVDh4OGJsayAoCi0gICAgY29uc3QgT01YX1MxNiAqcFNyYywKLSAgICBPTVhfUzE2ICpwRHN0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9NRUdldEJ1ZlNpemUgICAoNi4yLjQuMS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29tcHV0ZXMgdGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgdmVuZG9yLXNwZWNpZmljIHNwZWNpZmljYXRpb24gCi0gKiBzdHJ1Y3R1cmUgZm9yIHRoZSBmb2xsb3dpbmcgbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zOiAKLSAqIEJsb2NrTWF0Y2hfSW50ZWdlcl84eDgsIEJsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiwgYW5kIE1vdGlvbkVzdGltYXRpb25NQi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgTUVtb2RlIC0gbW90aW9uIGVzdGltYXRpb24gbW9kZTsgYXZhaWxhYmxlIG1vZGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSAKLSAqICAgICAgICAgICAgZW51bWVyYXRlZCB0eXBlIE9NWFZDTTRQMk1FTW9kZSAKLSAqICAgcE1FUGFyYW1zIC0gbW90aW9uIGVzdGltYXRpb24gcGFyYW1ldGVycyAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNpemUgLSBwb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBzcGVjaWZpY2F0aW9uIAotICogICAgICAgICAgICBzdHJ1Y3R1cmUgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGFuIGludmFsaWQgdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBNRW1vZGUgCi0gKiAgICAtICAgIGEgbmVnYXRpdmUgb3IgemVybyB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgCi0gKiAgICAgICAgIHBhcmFtZXRlciBwTUVQYXJhbXMtPnNlYXJjaFJhbmdlIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9NRUdldEJ1ZlNpemUgKAotICAgIE9NWFZDTTRQMk1FTW9kZSBNRW1vZGUsCi0gICAgY29uc3QgT01YVkNNNFAyTUVQYXJhbXMgKnBNRVBhcmFtcywKLSAgICBPTVhfVTMyICpwU2l6ZQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfTUVJbml0ICAgKDYuMi40LjEuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEluaXRpYWxpemVzIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgcmVxdWlyZWQgZm9yIHRoZSAKLSAqIGZvbGxvd2luZyBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnM6ICBCbG9ja01hdGNoX0ludGVnZXJfOHg4LCAKLSAqIEJsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiwgYW5kIE1vdGlvbkVzdGltYXRpb25NQi4gTWVtb3J5IGZvciB0aGUgCi0gKiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAqcE1FU3BlYyBtdXN0IGJlIGFsbG9jYXRlZCBwcmlvciB0byBjYWxsaW5nIHRoZSAKLSAqIGZ1bmN0aW9uLCBhbmQgc2hvdWxkIGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBGb2xsb3dpbmcgCi0gKiBpbml0aWFsaXphdGlvbiBieSB0aGlzIGZ1bmN0aW9uLCB0aGUgdmVuZG9yLXNwZWNpZmljIHN0cnVjdHVyZSAqcE1FU3BlYyAKLSAqIHNob3VsZCBjb250YWluIGFuIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIHJlcHJlc2VudGF0aW9uIG9mIGFsbCBtb3Rpb24gCi0gKiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgcmVjZWl2ZWQgdmlhIHRoZSBzdHJ1Y3R1cmUgcE1FUGFyYW1zLCBmb3IgZXhhbXBsZSAgCi0gKiBybmRWYWwsIHNlYXJjaFJhbmdlLCBldGMuICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgCi0gKiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSBjYW4gYmUgZGV0ZXJtaW5lZCB1c2luZyB0aGUgZnVuY3Rpb24gCi0gKiBvbXhWQ000UDJfTUVHZXRCdWZTaXplLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBNRW1vZGUgLSBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlOyBhdmFpbGFibGUgbW9kZXMgYXJlIGRlZmluZWQgYnkgdGhlIAotICogICAgICAgICAgICBlbnVtZXJhdGVkIHR5cGUgT01YVkNNNFAyTUVNb2RlIAotICogICBwTUVQYXJhbXMgLSBtb3Rpb24gZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIAotICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgdW5pbml0aWFsaXplZCBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIGluaXRpYWxpemVkIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAotICogICAgLSAgICBhbiBpbnZhbGlkIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSBwYXJhbWV0ZXIgTUVtb2RlIAotICogICAgLSAgICBhIG5lZ2F0aXZlIG9yIHplcm8gdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIAotICogICAgICAgICBwYXJhbWV0ZXIgcE1FUGFyYW1zLT5zZWFyY2hSYW5nZSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfTUVJbml0ICgKLSAgICBPTVhWQ000UDJNRU1vZGUgTUVtb2RlLAotICAgIGNvbnN0IE9NWFZDTTRQMk1FUGFyYW1zKnBNRVBhcmFtcywKLSAgICB2b2lkICpwTUVTcGVjCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYgICAoNi4yLjQuMi4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYSAxNngxNiBibG9jayBzZWFyY2g7IGVzdGltYXRlcyBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIAotICogbWluaW11bSBTQUQuIEJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQgbW90aW9uIHZlY3RvcnMgYXJlIHJlcHJlc2VudGVkIHVzaW5nIAotICogaGFsZi1waXhlbCB1bml0cywgYW5kIHRoZXJlZm9yZSBhIHNoaWZ0IGxlZnQgb3IgcmlnaHQgYnkgMSBiaXQgbWF5IGJlIAotICogcmVxdWlyZWQsIHJlc3BlY3RpdmVseSwgdG8gbWF0Y2ggdGhlIGlucHV0IG9yIG91dHB1dCBNVnMgd2l0aCBvdGhlciAKLSAqIGZ1bmN0aW9ucyB0aGF0IGVpdGhlciBnZW5lcmF0ZSBvdXRwdXQgTVZzIG9yIGV4cGVjdCBpbnB1dCBNVnMgcmVwcmVzZW50ZWQgCi0gKiB1c2luZyBpbnRlZ2VyIHBpeGVsIHVuaXRzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAotICogICAgICAgICAgICBNQiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIAotICogICAgICAgICAgICB0aGUgY3VycmVudCBwbGFuZS4gCi0gKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKLSAqICAgcFJlZlJlY3QgLSBwb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcGxhbmUgcmVjdGFuZ2xlOyBjb29yZGluYXRlcyAKLSAqICAgICAgICAgICAgYXJlIHNwZWNpZmllZCByZWxhdGl2ZSB0byB0aGUgaW1hZ2Ugb3JpZ2luLiAgUmVjdGFuZ2xlIAotICogICAgICAgICAgICBib3VuZGFyaWVzIG1heSBleHRlbmQgYmV5b25kIGltYWdlIGJvdW5kYXJpZXMgaWYgdGhlIGltYWdlIGhhcyAKLSAqICAgICAgICAgICAgYmVlbiBwYWRkZWQuICBGb3IgZXhhbXBsZSwgaWYgcGFkZGluZyBleHRlbmRzIDQgcGl4ZWxzIGJleW9uZCAKLSAqICAgICAgICAgICAgZnJhbWUgYm9yZGVyLCB0aGVuIHRoZSB2YWx1ZSBmb3IgdGhlIGxlZnQgYm9yZGVyIGNvdWxkIGJlIHNldCB0byAKLSAqICAgICAgICAgICAgLTQuIAotICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKLSAqICAgICAgICAgICAgYnVmZmVyIGV4dHJhY3RlZCBmcm9tIHRoZSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAyNTYgCi0gKiAgICAgICAgICAgIGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKLSAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYuIAotICogICBwQ3VyclBvaW50UG9zIC0gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZSAKLSAqICAgcFNyY1ByZU1WIC0gcG9pbnRlciB0byBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcjsgTlVMTCBpbmRpY2F0ZXMgbm8gCi0gKiAgICAgICAgICAgIHByZWRpY3RlZCBNViAKLSAqICAgcFNyY1ByZVNBRCAtIHBvaW50ZXIgdG8gU0FEIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJlZGljdGVkIE1WIChyZWZlcmVuY2VkIAotICogICAgICAgICAgICBieSBwU3JjUHJlTVYpOyBtYXkgYmUgc2V0IHRvIE5VTEwgaWYgdW5hdmFpbGFibGUuIAotICogICBwTUVTcGVjIC0gdmVuZG9yLXNwZWNpZmljIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlOyAKLSAqICAgICAgICAgICAgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIAotICogICAgICAgICAgICBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhlIGJsb2NrIG1hdGNoaW5nIGZ1bmN0aW9uLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdE1WIC0gcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYgCi0gKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIG1pbmltdW0gU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY1JlZkJ1ZiwgCi0gKiAgICAgICAgICAgICAgcFJlZlJlY3QsIHBTcmNDdXJyQnVmZiwgcEN1cnJQb2ludFBvcywgcERzdE1WLCBwRHN0U0FEIG9yIAotICogICAgICAgICAgICAgIHBNRVNwZWMsIG9yIAotICogICAgLSAgICBwU3JjQ3VyckJ1ZiBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKLSAgICBPTVhfSU5UIHJlZldpZHRoLAotICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCi0gICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvcipwU3JjUHJlTVYsCi0gICAgY29uc3QgT01YX0lOVCAqcFNyY1ByZVNBRCwKLSAgICB2b2lkICpwTUVTcGVjLAotICAgIE9NWFZDTW90aW9uVmVjdG9yKnBEc3RNViwKLSAgICBPTVhfSU5UICpwRHN0U0FECi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4ICAgKDYuMi40LjIuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGFuIDh4OCBibG9jayBzZWFyY2g7IGVzdGltYXRlcyBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIAotICogbWluaW11bSBTQUQuICBCb3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IG1vdGlvbiB2ZWN0b3JzIGFyZSByZXByZXNlbnRlZCAKLSAqIHVzaW5nIGhhbGYtcGl4ZWwgdW5pdHMsIGFuZCB0aGVyZWZvcmUgYSBzaGlmdCBsZWZ0IG9yIHJpZ2h0IGJ5IDEgYml0IG1heSBiZSAKLSAqIHJlcXVpcmVkLCByZXNwZWN0aXZlbHksIHRvIG1hdGNoIHRoZSBpbnB1dCBvciBvdXRwdXQgTVZzIHdpdGggb3RoZXIgCi0gKiBmdW5jdGlvbnMgdGhhdCBlaXRoZXIgZ2VuZXJhdGUgb3V0cHV0IE1WcyBvciBleHBlY3QgaW5wdXQgTVZzIHJlcHJlc2VudGVkIAotICogdXNpbmcgaW50ZWdlciBwaXhlbCB1bml0cy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgYmxvY2sgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgOHg4IGJsb2NrIAotICogICAgICAgICAgICBpbiB0aGUgY3VycmVudCBwbGFuZS4gCi0gKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKLSAqICAgcFJlZlJlY3QgLSBwb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcGxhbmUgcmVjdGFuZ2xlOyBjb29yZGluYXRlcyAKLSAqICAgICAgICAgICAgYXJlIHNwZWNpZmllZCByZWxhdGl2ZSB0byB0aGUgaW1hZ2Ugb3JpZ2luLiAgUmVjdGFuZ2xlIAotICogICAgICAgICAgICBib3VuZGFyaWVzIG1heSBleHRlbmQgYmV5b25kIGltYWdlIGJvdW5kYXJpZXMgaWYgdGhlIGltYWdlIGhhcyAKLSAqICAgICAgICAgICAgYmVlbiBwYWRkZWQuIAotICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKLSAqICAgICAgICAgICAgYnVmZmVyIGV4dHJhY3RlZCBmcm9tIHRoZSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAxMjggCi0gKiAgICAgICAgICAgIGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKLSAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYgYnl0ZXMuIAotICogICBwQ3VyclBvaW50UG9zIC0gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCi0gKiAgIHBTcmNQcmVNViAtIHBvaW50ZXIgdG8gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3I7IE5VTEwgaW5kaWNhdGVzIG5vIAotICogICAgICAgICAgICBwcmVkaWN0ZWQgTVYgCi0gKiAgIHBTcmNQcmVTQUQgLSBwb2ludGVyIHRvIFNBRCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWRpY3RlZCBNViAocmVmZXJlbmNlZCAKLSAqICAgICAgICAgICAgYnkgcFNyY1ByZU1WKTsgbWF5IGJlIHNldCB0byBOVUxMIGlmIHVuYXZhaWxhYmxlLiAKLSAqICAgcE1FU3BlYyAtIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgCi0gKiAgICAgICAgICAgIG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyAKLSAqICAgICAgICAgICAgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoZSBibG9jayBtYXRjaGluZyBmdW5jdGlvbi4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAotICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNSZWZCdWYsIAotICogICAgICAgICAgICAgIHBSZWZSZWN0LCBwU3JjQ3VyckJ1ZmYsIHBDdXJyUG9pbnRQb3MsIHBEc3RNViwgcERzdFNBRCBvciAKLSAqICAgICAgICAgICAgICBwTUVTcGVjLCBvciAKLSAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDgtYnl0ZSBhbGlnbmVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCi0gICAgT01YX0lOVCByZWZXaWR0aCwKLSAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAotICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNQcmVNViwKLSAgICBjb25zdCBPTVhfSU5UICpwU3JjUHJlU0FELAotICAgIHZvaWQgKnBNRVNwZWMsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBEc3RNViwKLSAgICBPTVhfSU5UICpwRHN0U0FECi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYgICAoNi4yLjQuMi4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYSAxNngxNiBibG9jayBtYXRjaCB3aXRoIGhhbGYtcGl4ZWwgcmVzb2x1dGlvbi4gIFJldHVybnMgdGhlIAotICogZXN0aW1hdGVkIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgbWluaW11bSBTQUQuICBUaGlzIGZ1bmN0aW9uIAotICogZXN0aW1hdGVzIHRoZSBoYWxmLXBpeGVsIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaW50ZWdlciAKLSAqIHJlc29sdXRpb24gbW90aW9uIHZlY3RvciByZWZlcmVuY2VkIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdE1WLCBpLmUuLCAKLSAqIHRoZSBpbml0aWFsIGludGVnZXIgTVYgaXMgZ2VuZXJhdGVkIGV4dGVybmFsbHkuICBUaGUgaW5wdXQgcGFyYW1ldGVycyAKLSAqIHBTcmNSZWZCdWYgYW5kIHBTZWFyY2hQb2ludFJlZlBvcyBzaG91bGQgYmUgc2hpZnRlZCBieSB0aGUgd2lubmluZyBNViBvZiAKLSAqIDE2eDE2IGludGVnZXIgc2VhcmNoIHByaW9yIHRvIGNhbGxpbmcgQmxvY2tNYXRjaF9IYWxmXzE2eDE2LiBUaGUgZnVuY3Rpb24gCi0gKiBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYgbWF5IGJlIHVzZWQgZm9yIGludGVnZXIgbW90aW9uIGVzdGltYXRpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIG1hY3JvYmxvY2sgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUuIAotICogICByZWZXaWR0aCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUgCi0gKiAgIHBSZWZSZWN0IC0gcmVmZXJlbmNlIHBsYW5lIHZhbGlkIHJlZ2lvbiByZWN0YW5nbGUgCi0gKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAotICogICAgICAgICAgICBidWZmZXIgZXh0cmFjdGVkIGZyb20gdGhlIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIDI1NiAKLSAqICAgICAgICAgICAgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIAotICogICAgICAgICAgICBieXRlcyBiZXR3ZWVuIGxpbmVzIChzdGVwKSBpcyAxNi4gCi0gKiAgIHBTZWFyY2hQb2ludFJlZlBvcyAtIHBvc2l0aW9uIG9mIHRoZSBzdGFydGluZyBwb2ludCBmb3IgaGFsZiBwaXhlbCAKLSAqICAgICAgICAgICAgc2VhcmNoIChzcGVjaWZpZWQgaW4gdGVybXMgb2YgaW50ZWdlciBwaXhlbCB1bml0cykgaW4gdGhlIAotICogICAgICAgICAgICByZWZlcmVuY2UgcGxhbmUsIGkuZS4sIHRoZSByZWZlcmVuY2UgcG9zaXRpb24gcG9pbnRlZCB0byBieSB0aGUgCi0gKiAgICAgICAgICAgIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yLiAKLSAqICAgcm5kVmFsIC0gcm91bmRpbmcgY29udHJvbCBwYXJhbWV0ZXI6IDAgLSBkaXNhYmxlZDsgMSAtIGVuYWJsZWQuIAotICogICBwU3JjRHN0TVYgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsIE1WIGVzdGltYXRlOyB0eXBpY2FsbHkgZ2VuZXJhdGVkIAotICogICAgICAgICAgICBkdXJpbmcgYSBwcmlvciAxNlgxNiBpbnRlZ2VyIHNlYXJjaDsgc3BlY2lmaWVkIGluIHRlcm1zIG9mIAotICogICAgICAgICAgICBoYWxmLXBpeGVsIHVuaXRzLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdE1WIC0gcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYgCi0gKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIG1pbmltdW0gU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY1JlZkJ1ZiwgCi0gKiAgICAgICAgIHBSZWZSZWN0LCBwU3JjQ3VyckJ1ZmYsIHBTZWFyY2hQb2ludFJlZlBvcywgcFNyY0RzdE1WLgotICogICAgLSAgICBwU3JjQ3VyckJ1ZiBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLCBvciAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCi0gICAgT01YX0lOVCByZWZXaWR0aCwKLSAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAotICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBTZWFyY2hQb2ludFJlZlBvcywKLSAgICBPTVhfSU5UIHJuZFZhbCwKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdE1WLAotICAgIE9NWF9JTlQgKnBEc3RTQUQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDggICAoNi4yLjQuMi40KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYW4gOHg4IGJsb2NrIG1hdGNoIHdpdGggaGFsZi1waXhlbCByZXNvbHV0aW9uLiBSZXR1cm5zIHRoZSAKLSAqIGVzdGltYXRlZCBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgVGhpcyBmdW5jdGlvbiAKLSAqIGVzdGltYXRlcyB0aGUgaGFsZi1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGludGVnZXIgCi0gKiByZXNvbHV0aW9uIG1vdGlvbiB2ZWN0b3IgcmVmZXJlbmNlZCBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RNViwgaS5lLiwgCi0gKiB0aGUgaW5pdGlhbCBpbnRlZ2VyIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGlucHV0IHBhcmFtZXRlcnMgCi0gKiBwU3JjUmVmQnVmIGFuZCBwU2VhcmNoUG9pbnRSZWZQb3Mgc2hvdWxkIGJlIHNoaWZ0ZWQgYnkgdGhlIHdpbm5pbmcgTVYgb2YgCi0gKiA4eDggaW50ZWdlciBzZWFyY2ggcHJpb3IgdG8gY2FsbGluZyBCbG9ja01hdGNoX0hhbGZfOHg4LiBUaGUgZnVuY3Rpb24gCi0gKiBCbG9ja01hdGNoX0ludGVnZXJfOHg4IG1heSBiZSB1c2VkIGZvciBpbnRlZ2VyIG1vdGlvbiBlc3RpbWF0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAotICogICAgICAgICAgICBibG9jayB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCA4eDggYmxvY2sgCi0gKiAgICAgICAgICAgIGluIHRoZSBjdXJyZW50IHBsYW5lLiAKLSAqICAgcmVmV2lkdGggLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lIAotICogICBwUmVmUmVjdCAtIHJlZmVyZW5jZSBwbGFuZSB2YWxpZCByZWdpb24gcmVjdGFuZ2xlIAotICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKLSAqICAgICAgICAgICAgYnVmZmVyIGV4dHJhY3RlZCBmcm9tIHRoZSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAxMjggCi0gKiAgICAgICAgICAgIGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIAotICogICAgICAgICAgICBieXRlcyBiZXR3ZWVuIGxpbmVzIChzdGVwKSBpcyAxNi4gCi0gKiAgIHBTZWFyY2hQb2ludFJlZlBvcyAtIHBvc2l0aW9uIG9mIHRoZSBzdGFydGluZyBwb2ludCBmb3IgaGFsZiBwaXhlbCAKLSAqICAgICAgICAgICAgc2VhcmNoIChzcGVjaWZpZWQgaW4gdGVybXMgb2YgaW50ZWdlciBwaXhlbCB1bml0cykgaW4gdGhlIAotICogICAgICAgICAgICByZWZlcmVuY2UgcGxhbmUuIAotICogICBybmRWYWwgLSByb3VuZGluZyBjb250cm9sIHBhcmFtZXRlcjogMCAtIGRpc2FibGVkOyAxIC0gZW5hYmxlZC4gCi0gKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gdGhlIGluaXRpYWwgTVYgZXN0aW1hdGU7IHR5cGljYWxseSBnZW5lcmF0ZWQgCi0gKiAgICAgICAgICAgIGR1cmluZyBhIHByaW9yIDh4OCBpbnRlZ2VyIHNlYXJjaCwgc3BlY2lmaWVkIGluIHRlcm1zIG9mIAotICogICAgICAgICAgICBoYWxmLXBpeGVsIHVuaXRzLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdE1WIC0gcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYgCi0gKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIG1pbmltdW0gU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmNSZWZCdWYsIHBSZWZSZWN0LCBwU3JjQ3VyckJ1ZmYsIHBTZWFyY2hQb2ludFJlZlBvcywgcFNyY0RzdE1WCi0gKiAgICAtICAgIHBTcmNDdXJyQnVmIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAotICAgIE9NWF9JTlQgcmVmV2lkdGgsCi0gICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKLSAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwU2VhcmNoUG9pbnRSZWZQb3MsCi0gICAgT01YX0lOVCBybmRWYWwsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RNViwKLSAgICBPTVhfSU5UICpwRHN0U0FECi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIgICAoNi4yLjQuMy4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgbW90aW9uIHNlYXJjaCBmb3IgYSAxNngxNiBtYWNyb2Jsb2NrLiAgU2VsZWN0cyBiZXN0IG1vdGlvbiBzZWFyY2ggCi0gKiBzdHJhdGVneSBmcm9tIGFtb25nIGludGVyLTFNViwgaW50ZXItNE1WLCBhbmQgaW50cmEgbW9kZXMuICBTdXBwb3J0cyAKLSAqIGludGVnZXIgYW5kIGhhbGYgcGl4ZWwgcmVzb2x1dGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGN1cnJlbnQgTUIgaW4gdGhlIAotICogICAgICAgICAgICBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgCi0gKiAgICAgICAgICAgIFRoZSBmdW5jdGlvbiBkb2VzIG5vdCBleHBlY3Qgc291cmNlIGRhdGEgb3V0c2lkZSB0aGUgcmVnaW9uIAotICogICAgICAgICAgICBib3VuZGVkIGJ5IHRoZSBNQiB0byBiZSBhdmFpbGFibGU7IGZvciBleGFtcGxlIGl0IGlzIG5vdCAKLSAqICAgICAgICAgICAgbmVjZXNzYXJ5IGZvciB0aGUgY2FsbGVyIHRvIGd1YXJhbnRlZSB0aGUgYXZhaWxhYmlsaXR5IG9mIAotICogICAgICAgICAgICBwU3JjQ3VyckJ1ZlstU3JjQ3VyclN0ZXBdLCBpLmUuLCB0aGUgcm93IG9mIHBpeGVscyBhYm92ZSB0aGUgTUIgCi0gKiAgICAgICAgICAgIHRvIGJlIHByb2Nlc3NlZC4gCi0gKiAgIHNyY0N1cnJTdGVwIC0gd2lkdGggb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUsIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgcGxhbmUgbG9jYXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmU7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgc3JjUmVmU3RlcCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSwgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBwUmVmUmVjdCAtIHJlZmVyZW5jZSBwbGFuZSB2YWxpZCByZWdpb24gcmVjdGFuZ2xlLCBzcGVjaWZpZWQgcmVsYXRpdmUgdG8gCi0gKiAgICAgICAgICAgIHRoZSBpbWFnZSBvcmlnaW4gCi0gKiAgIHBDdXJyUG9pbnRQb3MgLSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lIAotICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgdmVuZG9yLXNwZWNpZmljIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gCi0gKiAgICAgICAgICAgIHN0cnVjdHVyZTsgbXVzdCBiZSBhbGxvY2F0ZWQgYW5kIHRoZW4gaW5pdGlhbGl6ZWQgdXNpbmcgCi0gKiAgICAgICAgICAgIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAKLSAqICAgcE1CSW5mbyAtIGFycmF5LCBvZiBkaW1lbnNpb24gZm91ciwgY29udGFpbmluZyBwb2ludGVycyB0byBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIGZvdXIgbmVhcmJ5IE1CczogCi0gKiAgICAgICAgICAgIC0gICBwTUJJbmZvWzBdIC0gcG9pbnRlciB0byBsZWZ0IE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICAtICAgcE1CSW5mb1sxXSAtIHBvaW50ZXIgdG8gdG9wIE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICAtICAgcE1CSW5mb1syXSAtIHBvaW50ZXIgdG8gdG9wLWxlZnQgTUIgaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIC0gICBwTUJJbmZvWzNdIC0gcG9pbnRlciB0byB0b3AtcmlnaHQgTUIgaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIEFueSBwb2ludGVyIGluIHRoZSBhcnJheSBtYXkgYmUgc2V0IGVxdWFsIHRvIE5VTEwgaWYgdGhlIAotICogICAgICAgICAgICBjb3JyZXNwb25kaW5nIE1CIGRvZXNuJ3QgZXhpc3QuICBGb3IgZWFjaCBNQiwgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgCi0gKiAgICAgICAgICAgIG1lbWJlcnMgYXJlIHVzZWQ6ICAgIAotICogICAgICAgICAgICAtICAgbWJUeXBlIC0gbWFjcm9ibG9jayB0eXBlLCBlaXRoZXIgT01YX1ZDX0lOVFJBLCBPTVhfVkNfSU5URVIsIG9yIAotICogICAgICAgICAgICAgICAgT01YX1ZDX0lOVEVSNFYgCi0gKiAgICAgICAgICAgIC0gICBwTVYwWzJdWzJdIC0gZXN0aW1hdGVkIG1vdGlvbiB2ZWN0b3JzOyByZXByZXNlbnRlZCAKLSAqICAgICAgICAgICAgICAgIGluIDEvMiBwaXhlbCB1bml0cyAKLSAqICAgICAgICAgICAgLSAgIHNsaWNlSUQgLSBudW1iZXIgb2YgdGhlIHNsaWNlIHRvIHdoaWNoIHRoZSBNQiBiZWxvbmdzIAotICogICBwU3JjRHN0TUJDdXJyIC0gcG9pbnRlciB0byBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IE1CLiAgCi0gKiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZW50cmllcyBzaG91bGQgYmUgc2V0IHByaW9yIHRvIGNhbGxpbmcgdGhlIAotICogICAgICAgICAgICBmdW5jdGlvbjogc2xpY2VJRCAtIHRoZSBudW1iZXIgb2YgdGhlIHNsaWNlIHRoZSB0byB3aGljaCB0aGUgCi0gKiAgICAgICAgICAgIGN1cnJlbnQgTUIgYmVsb25ncy4gIFRoZSBzdHJ1Y3R1cmUgZWxlbWVudHMgY2JweSBhbmQgY2JwYyBhcmUgCi0gKiAgICAgICAgICAgIGlnbm9yZWQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0TUJDdXJyIC0gcG9pbnRlciB0byB1cGRhdGVkIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIE1CIGFmdGVyIE1CLWxldmVsIG1vdGlvbiBlc3RpbWF0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZC4gIFRoZSAKLSAqICAgICAgICAgICAgZm9sbG93aW5nIHN0cnVjdHVyZSBtZW1iZXJzIGFyZSB1cGRhdGVkIGJ5IHRoZSBNRSBmdW5jdGlvbjogICAKLSAqICAgICAgICAgICAgICAtICBtYlR5cGUgLSBtYWNyb2Jsb2NrIHR5cGU6IE9NWF9WQ19JTlRSQSwgT01YX1ZDX0lOVEVSLCBvciAKLSAqICAgICAgICAgICAgICAgICBPTVhfVkNfSU5URVI0Vi4gCi0gKiAgICAgICAgICAgICAgLSAgcE1WMFsyXVsyXSAtIGVzdGltYXRlZCBtb3Rpb24gdmVjdG9yczsgcmVwcmVzZW50ZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgdGVybXMgb2YgMS8yIHBlbCB1bml0cy4gCi0gKiAgICAgICAgICAgICAgLSAgcE1WUHJlZFsyXVsyXSAtIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yczsgcmVwcmVzZW50ZWQgCi0gKiAgICAgICAgICAgICAgICAgaW4gdGVybXMgb2YgMS8yIHBlbCB1bml0cy4gCi0gKiAgICAgICAgICAgIFRoZSBzdHJ1Y3R1cmUgbWVtYmVycyBjYnB5IGFuZCBjYnBjIGFyZSBub3QgdXBkYXRlZCBieSB0aGUgZnVuY3Rpb24uIAotICogICBwRHN0U0FEIC0gcG9pbnRlciB0byB0aGUgbWluaW11bSBTQUQgZm9yIElOVEVSMVYsIG9yIHN1bSBvZiBtaW5pbXVtIFNBRHMgCi0gKiAgICAgICAgICAgIGZvciBJTlRFUjRWIAotICogICBwRHN0QmxvY2tTQUQgLSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIFNBRCB2YWx1ZXMgZm9yIGVhY2ggb2YgdGhlIGZvdXIgCi0gKiAgICAgICAgICAgIDh4OCBsdW1hIGJsb2NrcyBpbiB0aGUgTUIuICBUaGUgYmxvY2sgU0FEcyBhcmUgaW4gc2NhbiBvcmRlciBmb3IgCi0gKiAgICAgICAgICAgIGVhY2ggTUIuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9yIG1vcmUgb2YgdGhlIAotICogICAgICAgICAgICAgIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjQ3VyckJ1ZiwgCi0gKiAgICAgICAgICAgICAgcFNyY1JlZkJ1ZiwgcFJlZlJlY3QsIHBDdXJyUG9pbnRQb3MsIHBNQkludGVyLCBwTUJJbnRyYSwgCi0gKiAgICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyciwgb3IgcERzdFNBRC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX01vdGlvbkVzdGltYXRpb25NQiAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKLSAgICBPTVhfUzMyIHNyY0N1cnJTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKLSAgICBPTVhfUzMyIHNyY1JlZlN0ZXAsCi0gICAgY29uc3QgT01YUmVjdCpwUmVmUmVjdCwKLSAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAotICAgIHZvaWQgKnBNRVNwZWMsCi0gICAgY29uc3QgT01YVkNNNFAyTUJJbmZvUHRyICpwTUJJbmZvLAotICAgIE9NWFZDTTRQMk1CSW5mbyAqcFNyY0RzdE1CQ3VyciwKLSAgICBPTVhfVTE2ICpwRHN0U0FELAotICAgIE9NWF9VMTYgKnBEc3RCbG9ja1NBRAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRENUOHg4YmxrICAgKDYuMi40LjQuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbXB1dGVzIGEgMkQgZm9yd2FyZCBEQ1QgZm9yIGEgc2luZ2xlIDh4OCBibG9jaywgYXMgZGVmaW5lZCBpbiAKLSAqIFtJU08xNDQ5Ni0yXS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lYXJseSBhcnJhbmdlZCBpbnB1dCBidWZmZXI7IG11c3QgCi0gKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgSW5wdXQgdmFsdWVzIChwaXhlbCAKLSAqICAgICAgICAgICAgaW50ZW5zaXRpZXMpIGFyZSB2YWxpZCBpbiB0aGUgcmFuZ2UgWy0yNTUsMjU1XS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgb3V0cHV0IGJ1ZmZlcjsgbXVzdCAKLSAqICAgICAgICAgICAgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCByZXR1cm5lZCBpZjoKLSAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIE5VTEwuIAotICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0RDVDh4OGJsayAoCi0gICAgY29uc3QgT01YX1MxNiAqcFNyYywKLSAgICBPTVhfUzE2ICpwRHN0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludHJhX0kgICAoNi4yLjQuNC4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgcXVhbnRpemF0aW9uIG9uIGludHJhIGJsb2NrIGNvZWZmaWNpZW50cy4gVGhpcyBmdW5jdGlvbiBzdXBwb3J0cyAKLSAqIGJpdHNfcGVyX3BpeGVsID09IDguIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBpbnRyYSBibG9jayBjb2VmZmljaWVudHM7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGl6ZXJfc2NhbGUpLiAKLSAqICAgYmxvY2tJbmRleCAtIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZCBwb3NpdGlvbiwgCi0gKiAgICAgICAgICAgIHZhbGlkIGluIHRoZSByYW5nZSAwIHRvIDUsIGFzIGRlZmluZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgCi0gKiAgICAgICAgICAgIDYuMS4zLjguIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIAotICogICAgICAgICAgICBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKHF1YW50aXplZCkgaW50ZXJibG9jayBjb2VmZmljaWVudHMuICAKLSAqICAgICAgICAgICAgV2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLCBBQyBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCBvbiB0aGUgCi0gKiAgICAgICAgICAgIGludGVydmFsIFstMTI3LCAxMjddLCBhbmQgREMgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgb24gdGhlIAotICogICAgICAgICAgICBpbnRlcnZhbCBbMSwgMjU0XS4gIFdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MCwgQUMgY29lZmZpY2llbnRzIAotICogICAgICAgICAgICBhcmUgc2F0dXJhdGVkIG9uIHRoZSBpbnRlcnZhbCBbLTIwNDcsIDIwNDddLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBOVUxMLiAKLSAqICAgIC0gICAgYmxvY2tJbmRleCA8IDAgb3IgYmxvY2tJbmRleCA+PSAxMCAKLSAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PSAzMi4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX1F1YW50SW50cmFfSSAoCi0gICAgT01YX1MxNiAqcFNyY0RzdCwKLSAgICBPTVhfVTggUVAsCi0gICAgT01YX0lOVCBibG9ja0luZGV4LAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfUXVhbnRJbnRlcl9JICAgKDYuMi40LjQuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHF1YW50aXphdGlvbiBvbiBhbiBpbnRlciBjb2VmZmljaWVudCBibG9jazsgc3VwcG9ydHMgCi0gKiBiaXRzX3Blcl9waXhlbCA9PSA4LiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgaW50ZXIgYmxvY2sgY29lZmZpY2llbnRzOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKSAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyBtb2RlLCBhbmQgCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChxdWFudGl6ZWQpIGludGVyYmxvY2sgY29lZmZpY2llbnRzLiAgCi0gKiAgICAgICAgICAgIFdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MSwgQUMgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgb24gdGhlIAotICogICAgICAgICAgICBpbnRlcnZhbCBbLTEyNywgMTI3XSwgYW5kIERDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKLSAqICAgICAgICAgICAgaW50ZXJ2YWwgWzEsIDI1NF0uICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTAsIEFDIGNvZWZmaWNpZW50cyAKLSAqICAgICAgICAgICAgYXJlIHNhdHVyYXRlZCBvbiB0aGUgaW50ZXJ2YWwgWy0yMDQ3LCAyMDQ3XS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTC4gCi0gKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0gMzIuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludGVyX0kgKAotICAgIE9NWF9TMTYgKnBTcmNEc3QsCi0gICAgT01YX1U4IFFQLAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEgICAoNi4yLjQuNC40KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUXVhbnRpemVzIHRoZSBEQ1QgY29lZmZpY2llbnRzLCBpbXBsZW1lbnRzIGludHJhIGJsb2NrIEFDL0RDIGNvZWZmaWNpZW50IAotICogcHJlZGljdGlvbiwgYW5kIHJlY29uc3RydWN0cyB0aGUgY3VycmVudCBpbnRyYSBibG9jayB0ZXh0dXJlIGZvciBwcmVkaWN0aW9uIAotICogb24gdGhlIG5leHQgZnJhbWUuICBRdWFudGl6ZWQgcm93IGFuZCBjb2x1bW4gY29lZmZpY2llbnRzIGFyZSByZXR1cm5lZCBpbiAKLSAqIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGJ1ZmZlcnMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBwaXhlbHMgb2YgY3VycmVudCBpbnRyYSBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIAotICogICAgICAgICAgICBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBwUHJlZEJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXIgY29udGFpbmluZyAKLSAqICAgICAgICAgICAgKChudW1fbWJfcGVyX3JvdyAqIDIgKyAxKSAqIDgpIGVsZW1lbnRzIG9mIHR5cGUgT01YX1MxNi4gCi0gKiAgICAgICAgICAgIENvZWZmaWNpZW50cyBhcmUgb3JnYW5pemVkIGludG8gYmxvY2tzIG9mIGVpZ2h0IGFzIGRlc2NyaWJlZCAKLSAqICAgICAgICAgICAgYmVsb3cgKEludGVybmFsIFByZWRpY3Rpb24gQ29lZmZpY2llbnQgVXBkYXRlIFByb2NlZHVyZXMpLiAgVGhlIAotICogICAgICAgICAgICBEQyBjb2VmZmljaWVudCBpcyBmaXJzdCwgYW5kIHRoZSByZW1haW5pbmcgYnVmZmVyIGxvY2F0aW9ucyAKLSAqICAgICAgICAgICAgY29udGFpbiB0aGUgcXVhbnRpemVkIEFDIGNvZWZmaWNpZW50cy4gRWFjaCBncm91cCBvZiBlaWdodCByb3cgCi0gKiAgICAgICAgICAgIGJ1ZmZlciBlbGVtZW50cyBjb21iaW5lZCB3aXRoIG9uZSBlbGVtZW50IGVpZ2h0IGVsZW1lbnRzIGFoZWFkIAotICogICAgICAgICAgICBjb250YWlucyB0aGUgY29lZmZpY2llbnQgcHJlZGljdG9ycyBvZiB0aGUgbmVpZ2hib3JpbmcgYmxvY2sgCi0gKiAgICAgICAgICAgIHRoYXQgaXMgc3BhdGlhbGx5IGFib3ZlIG9yIHRvIHRoZSBsZWZ0IG9mIHRoZSBibG9jayBjdXJyZW50bHkgdG8gCi0gKiAgICAgICAgICAgIGJlIGRlY29kZWQuIEEgbmVnYXRpdmUtdmFsdWVkIERDIGNvZWZmaWNpZW50IGluZGljYXRlcyB0aGF0IHRoaXMgCi0gKiAgICAgICAgICAgIG5laWdoYm9yaW5nIGJsb2NrIGlzIG5vdCBJTlRSQS1jb2RlZCBvciBvdXQgb2YgYm91bmRzLCBhbmQgCi0gKiAgICAgICAgICAgIHRoZXJlZm9yZSB0aGUgQUMgYW5kIERDIGNvZWZmaWNpZW50cyBhcmUgaW52YWxpZC4gIFBvaW50ZXIgbXVzdCAKLSAqICAgICAgICAgICAgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIHByZWRpY3Rpb24gY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlciAKLSAqICAgICAgICAgICAgY29udGFpbmluZyAxNiBlbGVtZW50cyBvZiB0eXBlIE9NWF9TMTYuIENvZWZmaWNpZW50cyBhcmUgCi0gKiAgICAgICAgICAgIG9yZ2FuaXplZCBhcyBkZXNjcmliZWQgaW4gc2VjdGlvbiA2LjIuMi41LiAgUG9pbnRlciBtdXN0IGJlIAotICogICAgICAgICAgICBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBTdW1FcnIgLSBwb2ludGVyIHRvIGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IEFDIHByZWRpY3Rpb24gaXMgCi0gKiAgICAgICAgICAgIHJlcXVpcmVkOyBBQyBwcmVkaWN0aW9uIGlzIGVuYWJsZWQgaWYgKnBTdW1FcnIgPj0wLCBidXQgdGhlIAotICogICAgICAgICAgICB2YWx1ZSBpcyBub3QgdXNlZCBmb3IgY29lZmZpY2llbnQgcHJlZGljdGlvbiwgaS5lLiwgdGhlIHN1bSBvZiAKLSAqICAgICAgICAgICAgYWJzb2x1dGUgZGlmZmVyZW5jZXMgc3RhcnRzIGZyb20gMCBmb3IgZWFjaCBjYWxsIHRvIHRoaXMgCi0gKiAgICAgICAgICAgIGZ1bmN0aW9uLiAgT3RoZXJ3aXNlIEFDIHByZWRpY3Rpb24gaXMgZGlzYWJsZWQgaWYgKnBTdW1FcnIgPCAwIC4gCi0gKiAgIGJsb2NrSW5kZXggLSBibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQgcG9zaXRpb24sIGFzIAotICogICAgICAgICAgICBkZWZpbmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDYuMS4zLjguIAotICogICBjdXJRcCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIG1hY3JvYmxvY2sgdG8gd2hpY2ggdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIGJsb2NrIGJlbG9uZ3MgCi0gKiAgIHBRcEJ1ZiAtIHBvaW50ZXIgdG8gYSAyLWVsZW1lbnQgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBidWZmZXI7IHBRcEJ1ZlswXSAKLSAqICAgICAgICAgICAgY29udGFpbnMgdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSA4eDggCi0gKiAgICAgICAgICAgIGJsb2NrIGxlZnQgb2YgdGhlIGN1cnJlbnQgYmxvY2sgKFFQYSksIGFuZCBwUXBCdWZbMV0gY29udGFpbnMgCi0gKiAgICAgICAgICAgIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgOHg4IGJsb2NrIGFib3ZlIAotICogICAgICAgICAgICB0aGUgY3VycmVudCBibG9jayAoUVBjKS4gIEluIHRoZSBldmVudCB0aGF0IHRoZSBjb3JyZXNwb25kaW5nIAotICogICAgICAgICAgICBibG9jayBpcyBvdXRzaWRlIG9mIHRoZSBWT1AgYm91bmQsIHRoZSBRcCB2YWx1ZSB3aWxsIG5vdCBhZmZlY3QgCi0gKiAgICAgICAgICAgIHRoZSBpbnRyYSBwcmVkaWN0aW9uIHByb2Nlc3MsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIAotICogICAgICAgICAgICBzdWItY2xhdXNlIDcuNC4zLjMsICBBZGFwdGl2ZSBBQyBDb2VmZmljaWVudCBQcmVkaWN0aW9uLiAgCi0gKiAgIHNyY1N0ZXAgLSB3aWR0aCBvZiB0aGUgc291cmNlIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBkc3RTdGVwIC0gd2lkdGggb2YgdGhlIHJlY29uc3RydWN0ZWQgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgCi0gKiAgICAgICAgICAgIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyAKLSAqICAgICAgICAgICAgbW9kZSwgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudCBidWZmZXI7IHBEc3RbMF0gY29udGFpbnMgCi0gKiAgICAgICAgICAgIHRoZSBwcmVkaWN0ZWQgREMgY29lZmZpY2llbnQ7IHRoZSByZW1haW5pbmcgZW50cmllcyBjb250YWluIHRoZSAKLSAqICAgICAgICAgICAgcXVhbnRpemVkIEFDIGNvZWZmaWNpZW50cyAod2l0aG91dCBwcmVkaWN0aW9uKS4gIFRoZSBwb2ludGVyIAotICogICAgICAgICAgICBwRHN0bXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBSZWMgLSBwb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIHRleHR1cmU7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiAKLSAqICAgICAgICAgICAgOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFByZWRCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIgCi0gKiAgIHBQcmVkQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyIAotICogICBwUHJlQUNQcmVkaWN0IC0gaWYgcHJlZGljdGlvbiBpcyBlbmFibGVkLCB0aGUgcGFyYW1ldGVyIHBvaW50cyB0byB0aGUgCi0gKiAgICAgICAgICAgIHN0YXJ0IG9mIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgY29lZmZpY2llbnQgZGlmZmVyZW5jZXMgZm9yIAotICogICAgICAgICAgICBWTEMgZW5jb2RpbmcuIFRoZSBlbnRyeSBwUHJlQUNQcmVkaWN0WzBdaW5kaWNhdGVzIHByZWRpY3Rpb24gCi0gKiAgICAgICAgICAgIGRpcmVjdGlvbiBmb3IgdGhlIGN1cnJlbnQgYmxvY2sgYW5kIHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICB2YWx1ZXM6IE9NWF9WQ19OT05FIChwcmVkaWN0aW9uIGRpc2FibGVkKSwgT01YX1ZDX0hPUklaT05UQUwsIG9yIAotICogICAgICAgICAgICBPTVhfVkNfVkVSVElDQUwuICBUaGUgZW50cmllcyAKLSAqICAgICAgICAgICAgcFByZUFDUHJlZGljdFsxXS1wUHJlQUNQcmVkaWN0WzddY29udGFpbiBwcmVkaWN0ZWQgQUMgCi0gKiAgICAgICAgICAgIGNvZWZmaWNpZW50cy4gIElmIHByZWRpY3Rpb24gaXMgZGlzYWJsZWQgKCpwU3VtRXJyPDApIHRoZW4gdGhlIAotICogICAgICAgICAgICBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlciBhcmUgdW5kZWZpbmVkIHVwb24gcmV0dXJuIGZyb20gdGhlIAotICogICAgICAgICAgICBmdW5jdGlvbiAKLSAqICAgcFN1bUVyciAtIHBvaW50ZXIgdG8gdGhlIHZhbHVlIG9mIHRoZSBhY2N1bXVsYXRlZCBBQyBjb2VmZmljaWVudCBlcnJvcnMsIAotICogICAgICAgICAgICBpLmUuLCBzdW0gb2YgdGhlIGFic29sdXRlIGRpZmZlcmVuY2VzIGJldHdlZW4gcHJlZGljdGVkIGFuZCAKLSAqICAgICAgICAgICAgdW5wcmVkaWN0ZWQgQUMgY29lZmZpY2llbnRzIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwRHN0LCBwUmVjLCAKLSAqICAgICAgICAgcENvZWZCdWZSb3csIHBDb2VmQnVmQ29sLCBwUXBCdWYsIHBQcmVBQ1ByZWRpY3QsIHBTdW1FcnIuIAotICogICAgLSAgICBibG9ja0luZGV4IDwgMCBvciBibG9ja0luZGV4ID49IDEwOyAKLSAqICAgIC0gICAgY3VyUVAgPD0gMCBvciBjdXJRUCA+PSAzMi4gCi0gKiAgICAtICAgIHNyY1N0ZXAsIG9yIGRzdFN0ZXAgPD0gMCBvciBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICAgcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkOiAuIAotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBub3QgOC1ieXRlIGFsaWduZWQ6IAotICogICAgICAgICBwU3JjLCBwUmVjLiAgCi0gKgotICogIE5vdGU6IFRoZSBjb2VmZmljaWVudCBidWZmZXJzIG11c3QgYmUgdXBkYXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIAotICogICAgICAgIHVwZGF0ZSBwcm9jZWR1cmVzIGRlZmluZWQgaW4gc2VjdGlvbiBpbiA2LjIuMi4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgT01YX1MxNiAqcERzdCwKLSAgICBPTVhfVTggKnBSZWMsCi0gICAgT01YX1MxNiAqcFByZWRCdWZSb3csCi0gICAgT01YX1MxNiAqcFByZWRCdWZDb2wsCi0gICAgT01YX1MxNiAqcFByZUFDUHJlZGljdCwKLSAgICBPTVhfSU5UICpwU3VtRXJyLAotICAgIE9NWF9JTlQgYmxvY2tJbmRleCwKLSAgICBPTVhfVTggY3VyUXAsCi0gICAgY29uc3QgT01YX1U4ICpwUXBCdWYsCi0gICAgT01YX0lOVCBzcmNTdGVwLAotICAgIE9NWF9JTlQgZHN0U3RlcCwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyICAgKDYuMi40LjQuNSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEltcGxlbWVudHMgRENULCBhbmQgcXVhbnRpemVzIHRoZSBEQ1QgY29lZmZpY2llbnRzIG9mIHRoZSBpbnRlciBibG9jayAKLSAqIHdoaWxlIHJlY29uc3RydWN0aW5nIHRoZSB0ZXh0dXJlIHJlc2lkdWFsLiBUaGVyZSBpcyBubyBib3VuZGFyeSBjaGVjayBmb3IgCi0gKiB0aGUgYml0IHN0cmVhbSBidWZmZXIuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLXBvaW50ZXIgdG8gdGhlIHJlc2lkdWFscyB0byBiZSBlbmNvZGVkOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gCi0gKiAgICAgICAgICAgIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIuIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IAotICogICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyBtb2RlLCBhbmQgCi0gKiAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnRzIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBwUmVjIC0gcG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCB0ZXh0dXJlIHJlc2lkdWFsczsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBlaXRoZXIgTlVMTCBvciAKLSAqICAgICAgICAgbm90IDE2LWJ5dGUgYWxpZ25lZDogCi0gKiAgICAgICAgICAgIC0gcFNyYyAKLSAqICAgICAgICAgICAgLSBwRHN0Ci0gKiAgICAgICAgICAgIC0gcFJlYwotICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49IDMyLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIgKAotICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCi0gICAgT01YX1MxNiAqcERzdCwKLSAgICBPTVhfUzE2ICpwUmVjLAotICAgIE9NWF9VOCBRUCwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICAgKDYuMi40LjUuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHppZ3phZyBzY2FuIGFuZCBWTEMgZW5jb2Rpbmcgb2YgQUMgYW5kIERDIGNvZWZmaWNpZW50cyBmb3Igb25lIAotICogaW50cmEgYmxvY2suICBUd28gdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uIChEQ1ZMQyBhbmQgQUNWTEMpIGFyZSBwcm92aWRlZCAKLSAqIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIHR3byBkaWZmZXJlbnQgbWV0aG9kcyBvZiBwcm9jZXNzaW5nIERDIAotICogY29lZmZpY2llbnRzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjEuNCwgIkludHJhIERDIAotICogQ29lZmZpY2llbnQgRGVjb2RpbmcgZm9yIHRoZSBDYXNlIG9mIFN3aXRjaGVkIFZMQyBFbmNvZGluZyIuICAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIGRvdWJsZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdHN0cmVhbSAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcuIAotICogICBwUURjdEJsa0NvZWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50IAotICogICBwcmVkRGlyIC0gQUMgcHJlZGljdGlvbiBkaXJlY3Rpb24sIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHRoZSB6aWd6YWcgCi0gKiAgICAgICAgICAgIHNjYW4gcGF0dGVybjsgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX05PTkUgLSBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkLiAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FuLiAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX0hPUklaT05UQUwgLSBIb3Jpem9udGFsIHByZWRpY3Rpb24uICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW4uIAotICogICAgICAgICAgICAtICBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCBwcmVkaWN0aW9uLiAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwgemlnemFnIHNjYW4uIAotICogICBwYXR0ZXJuIC0gYmxvY2sgcGF0dGVybiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRoaXMgYmxvY2sgaXMgCi0gKiAgICAgICAgICAgIGVuY29kZWQgCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCi0gKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2UsIGNocm9taW5hbmNlKSBvZiB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgYmxvY2sgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsIHNvIAotICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKLSAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgCi0gKiAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwUURjdEJsa0NvZWYuIAotICogICAgLSAgICpwQml0T2Zmc2V0IDwgMCwgb3IgKnBCaXRPZmZzZXQgPjcuIAotICogICAgLSAgICBQcmVkRGlyIGlzIG5vdCBvbmUgb2Y6IE9NWF9WQ19OT05FLCBPTVhfVkNfSE9SSVpPTlRBTCwgb3IgCi0gKiAgICAgICAgIE9NWF9WQ19WRVJUSUNBTC4gCi0gKiAgICAtICAgIFZpZGVvQ29tcCBpcyBub3Qgb25lIGNvbXBvbmVudCBvZiBlbnVtIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMgKAotICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAotICAgIE9NWF9VOCBwcmVkRGlyLAotICAgIE9NWF9VOCBwYXR0ZXJuLAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKLSAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICAgKDYuMi40LjUuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHppZ3phZyBzY2FuIGFuZCBWTEMgZW5jb2Rpbmcgb2YgQUMgYW5kIERDIGNvZWZmaWNpZW50cyBmb3Igb25lIAotICogaW50cmEgYmxvY2suICBUd28gdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uIChEQ1ZMQyBhbmQgQUNWTEMpIGFyZSBwcm92aWRlZCAKLSAqIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIHR3byBkaWZmZXJlbnQgbWV0aG9kcyBvZiBwcm9jZXNzaW5nIERDIAotICogY29lZmZpY2llbnRzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjEuNCwgIEludHJhIERDIAotICogQ29lZmZpY2llbnQgRGVjb2RpbmcgZm9yIHRoZSBDYXNlIG9mIFN3aXRjaGVkIFZMQyBFbmNvZGluZy4gIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0c3RyZWFtIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNy4gCi0gKiAgIHBRRGN0QmxrQ29lZiAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgCi0gKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiwgd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgdGhlIHppZ3phZyAKLSAqICAgICAgICAgICAgc2NhbiBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IAotICogICAgICAgICAgICAtICBPTVhfVkNfTk9ORSAtIEFDIHByZWRpY3Rpb24gbm90IHVzZWQuICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW4uIAotICogICAgICAgICAgICAtICBPTVhfVkNfSE9SSVpPTlRBTCAtIEhvcml6b250YWwgcHJlZGljdGlvbi4gIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS12ZXJ0aWNhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19WRVJUSUNBTCAtIFZlcnRpY2FsIHByZWRpY3Rpb24uICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgIHBhdHRlcm4gLSBibG9jayBwYXR0ZXJuIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhpcyBibG9jayBpcyAKLSAqICAgICAgICAgICAgZW5jb2RlZCAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwgc28gCi0gKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAotICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAKLSAqICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBRRGN0QmxrQ29lZi4gCi0gKiAgICAtICAgKnBCaXRPZmZzZXQgPCAwLCBvciAqcEJpdE9mZnNldCA+Ny4gCi0gKiAgICAtICAgIFByZWREaXIgaXMgbm90IG9uZSBvZjogT01YX1ZDX05PTkUsIE9NWF9WQ19IT1JJWk9OVEFMLCBvciAKLSAqICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMLiAKLSAqICAgIC0gICAgVmlkZW9Db21wIGlzIG5vdCBvbmUgY29tcG9uZW50IG9mIGVudW0gT01YVkNNNFAyVmlkZW9Db21wb25lbnQuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAoCi0gICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCi0gICAgT01YX1U4IHByZWREaXIsCi0gICAgT01YX1U4IHBhdHRlcm4sCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIgICAoNi4yLjQuNS4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGVuY29kaW5nIGZvciBvbmUgaW50ZXIgYmxvY2suIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCi0gKiAgICAgICAgICAgIHN0cmVhbSAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcgCi0gKiAgIHBRRGN0QmxrQ29lZiAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgCi0gKiAgIHBhdHRlcm4gLSBibG9jayBwYXR0ZXJuIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhpcyBibG9jayBpcyAKLSAqICAgICAgICAgICAgZW5jb2RlZCAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCBzbyB0aGF0IAotICogICAgICAgICAgICBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIuIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCi0gKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50cyAKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBwb2ludGVyczogaXMgTlVMTDogcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgCi0gKiAgICAgICAgICAgICAgcEJpdE9mZnNldCwgcFFEY3RCbGtDb2VmIAotICogICAgLSAgICpwQml0T2Zmc2V0IDwgMCwgb3IgKnBCaXRPZmZzZXQgPjcuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIgKAotICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAotICAgIE9NWF9VOCBwYXR0ZXJuLAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRW5jb2RlTVYgICAoNi4yLjQuNS40KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUHJlZGljdHMgYSBtb3Rpb24gdmVjdG9yIGZvciB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLCBlbmNvZGVzIHRoZSAKLSAqIGRpZmZlcmVuY2UsIGFuZCB3cml0ZXMgdGhlIG91dHB1dCB0byB0aGUgc3RyZWFtIGJ1ZmZlci4gVGhlIGlucHV0IE1WcyAKLSAqIHBNVkN1ck1CLCBwU3JjTVZMZWZ0TUIsIHBTcmNNVlVwcGVyTUIsIGFuZCBwU3JjTVZVcHBlclJpZ2h0TUIgc2hvdWxkIGxpZSAKLSAqIHdpdGhpbiB0aGUgcmFuZ2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5wdXQgcGFyYW1ldGVyIGZjb2RlRm9yd2FyZCwgYXMgCi0gKiBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjMuICBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgCi0gKiBzdXBlcnNldCBvZiB0aGUgZnVuY3Rpb25hbGl0eSBhc3NvY2lhdGVkIHdpdGggdGhlIGZ1bmN0aW9uIAotICogb214VkNNNFAyX0ZpbmRNVnByZWQuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0c3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtIGluZGV4IG9mIHRoZSBmaXJzdCBmcmVlIChuZXh0IGF2YWlsYWJsZSkgYml0IGluIHRoZSBzdHJlYW0gCi0gKiAgICAgICAgICAgIGJ1ZmZlciByZWZlcmVuY2VkIGJ5ICpwcEJpdFN0cmVhbSwgdmFsaWQgaW4gdGhlIHJhbmdlIDAgdG8gNy4gCi0gKiAgIHBNVkN1ck1CIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIG1vdGlvbiB2ZWN0b3I7IGEgdmFsdWUgb2YgCi0gKiAgICAgICAgICAgIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKLSAqICAgcFNyY01WTGVmdE1CIC0gcG9pbnRlciB0byB0aGUgc291cmNlIGxlZnQgbWFjcm9ibG9jayBtb3Rpb24gdmVjdG9yOyBhIAotICogICAgICAgICAgICB2YWx1ZSBvZiAgTlVMTGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCi0gKiAgIHBTcmNNVlVwcGVyTUIgLSBwb2ludGVyIHRvIHNvdXJjZSB1cHBlciBtYWNyb2Jsb2NrIG1vdGlvbiB2ZWN0b3I7IGEgCi0gKiAgICAgICAgICAgIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKLSAqICAgcFNyY01WVXBwZXJSaWdodE1CIC0gcG9pbnRlciB0byBzb3VyY2UgdXBwZXIgcmlnaHQgTUIgbW90aW9uIHZlY3RvcjsgYSAKLSAqICAgICAgICAgICAgdmFsdWUgb2YgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAotICogICBmY29kZUZvcndhcmQgLSBhbiBpbnRlZ2VyIHdpdGggdmFsdWVzIGZyb20gMSB0byA3OyB1c2VkIGluIGVuY29kaW5nIAotICogICAgICAgICAgICBtb3Rpb24gdmVjdG9ycyByZWxhdGVkIHRvIHNlYXJjaCByYW5nZSwgYXMgZGVzY3JpYmVkIGluIAotICogICAgICAgICAgICBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuMy4gCi0gKiAgIE1CVHlwZSAtIG1hY3JvIGJsb2NrIHR5cGUsIHZhbGlkIGluIHRoZSByYW5nZSAwIHRvIDUgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gdXBkYXRlZCBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gCi0gKiAgICAgICAgICAgIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtIHVwZGF0ZWQgaW5kZXggb2YgdGhlIG5leHQgYXZhaWxhYmxlIGJpdCBwb3NpdGlvbiBpbiBzdHJlYW0gCi0gKiAgICAgICAgICAgIGJ1ZmZlciByZWZlcmVuY2VkIGJ5ICpwcEJpdFN0cmVhbSAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyAKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sIAotICogICAgICAgICAgICAgICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcE1WQ3VyTUIgCi0gKiAgICAtICAgICpwQml0T2Zmc2V0IDwgMCwgb3IgKnBCaXRPZmZzZXQgPjcuIAotICogICAgLSAgICBmY29kZUZvcndhcmQgPD0gMCwgb3IgZmNvZGVGb3J3YXJkID4gNywgb3IgTUJUeXBlIDwgMC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0VuY29kZU1WICgKLSAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZDdXJNQiwKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvcipwU3JjTVZMZWZ0TUIsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNVlVwcGVyTUIsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNVlVwcGVyUmlnaHRNQiwKLSAgICBPTVhfSU5UIGZjb2RlRm9yd2FyZCwKLSAgICBPTVhWQ000UDJNYWNyb2Jsb2NrVHlwZSBNQlR5cGUKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AgICAoNi4yLjUuMS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogRGVjb2RlcyBhbmQgcGFkcyB0aGUgZm91ciBtb3Rpb24gdmVjdG9ycyBhc3NvY2lhdGVkIHdpdGggYSBub24taW50cmEgUC1WT1AgCi0gKiBtYWNyb2Jsb2NrLiAgRm9yIG1hY3JvYmxvY2tzIG9mIHR5cGUgT01YX1ZDX0lOVEVSNFYsIHRoZSBvdXRwdXQgTVYgaXMgCi0gKiBwYWRkZWQgYXMgc3BlY2lmaWVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi4xLjYuIE90aGVyd2lzZSwgZm9yIAotICogbWFjcm9ibG9ja3Mgb2YgdHlwZXMgb3RoZXIgdGhhbiBPTVhfVkNfSU5URVI0ViwgdGhlIGRlY29kZWQgTVYgaXMgY29waWVkIHRvIAotICogYWxsIGZvdXIgb3V0cHV0IE1WIGJ1ZmZlciBlbnRyaWVzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IAotICogICAgICAgICAgICBzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluIFswLTddLiAKLSAqICAgcFNyY01WTGVmdE1CLCBwU3JjTVZVcHBlck1CLCBhbmQgcFNyY01WVXBwZXJSaWdodE1CIC0gcG9pbnRlcnMgdG8gdGhlIAotICogICAgICAgICAgICBtb3Rpb24gdmVjdG9yIGJ1ZmZlcnMgb2YgdGhlIG1hY3JvYmxvY2tzIHNwZWNpYWxseSBhdCB0aGUgbGVmdCwgCi0gKiAgICAgICAgICAgIHVwcGVyLCBhbmQgdXBwZXItcmlnaHQgc2lkZSBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLCAKLSAqICAgICAgICAgICAgcmVzcGVjdGl2ZWx5OyBhIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAgTm90ZTogCi0gKiAgICAgICAgICAgIEFueSBuZWlnaGJvcmhvb2QgbWFjcm9ibG9jayBvdXRzaWRlIHRoZSBjdXJyZW50IFZPUCBvciB2aWRlbyAKLSAqICAgICAgICAgICAgcGFja2V0IG9yIG91dHNpZGUgdGhlIGN1cnJlbnQgR09CICh3aGVuIHNob3J0X3ZpZGVvX2hlYWRlciBpcyAKLSAqICAgICAgICAgICAgIDEgKSBmb3Igd2hpY2ggZ29iX2hlYWRlcl9lbXB0eSBpcyAgMCAgaXMgdHJlYXRlZCBhcyAKLSAqICAgICAgICAgICAgdHJhbnNwYXJlbnQsIGFjY29yZGluZyB0byBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuNS4gCi0gKiAgIGZjb2RlRm9yd2FyZCAtIGEgY29kZSBlcXVhbCB0byB2b3BfZmNvZGVfZm9yd2FyZCBpbiBNUEVHLTQgYml0IHN0cmVhbSAKLSAqICAgICAgICAgICAgc3ludGF4IAotICogICBNQlR5cGUgLSB0aGUgdHlwZSBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLiBJZiBNQlR5cGUgaXMgbm90IGVxdWFsIHRvIAotICogICAgICAgICAgICBPTVhfVkNfSU5URVI0ViwgdGhlIGRlc3RpbmF0aW9uIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIGlzIHN0aWxsIAotICogICAgICAgICAgICBmaWxsZWQgd2l0aCB0aGUgc2FtZSBkZWNvZGVkIHZlY3Rvci4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQsIHNvIAotICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAotICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKLSAqICAgcERzdE1WQ3VyTUIgLSBwb2ludGVyIHRvIHRoZSBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBmb3IgdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIG1hY3JvYmxvY2s7IGNvbnRhaW5zIGZvdXIgZGVjb2RlZCBtb3Rpb24gdmVjdG9ycyAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3RNVkN1ck1CIAotICogICAgLSAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddCi0gKiAgICAtICAgIGZjb2RlRm9yd2FyZCBleGNlZWRzICgwLDddCi0gKiAgICAtICAgIE1CVHlwZSBsZXNzIHRoYW4gemVybwotICogICAgLSAgICBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AgKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNVkxlZnRNQiwKLSAgICBPTVhWQ01vdGlvblZlY3RvcipwU3JjTVZVcHBlck1CLAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZVcHBlclJpZ2h0TUIsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IqcERzdE1WQ3VyTUIsCi0gICAgT01YX0lOVCBmY29kZUZvcndhcmQsCi0gICAgT01YVkNNNFAyTWFjcm9ibG9ja1R5cGUgTUJUeXBlCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAgICg2LjIuNS4yLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gb2YgQUMgYW5kIERDIGNvZWZmaWNpZW50cyAKLSAqIGZvciBvbmUgaW50cmEgYmxvY2suICBUd28gdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uIChEQ1ZMQyBhbmQgQUNWTEMpIGFyZSAKLSAqIHByb3ZpZGVkIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIHR3byBkaWZmZXJlbnQgbWV0aG9kcyBvZiBwcm9jZXNzaW5nIERDIAotICogY29lZmZpY2llbnRzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjEuNCwgIEludHJhIERDIAotICogQ29lZmZpY2llbnQgRGVjb2RpbmcgZm9yIHRoZSBDYXNlIG9mIFN3aXRjaGVkIFZMQyBFbmNvZGluZy4gIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSAKLSAqICAgICAgICAgICAgYml0c3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgY3VycmVudCBieXRlIHJlZmVyZW5jZWQgCi0gKiAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gIFRoZSBwYXJhbWV0ZXIgKnBCaXRPZmZzZXQgaXMgdmFsaWQgaW4gdGhlIAotICogICAgICAgICAgICByYW5nZSBbMC03XS4gCi0gKiAgICAgICAgICAgIEJpdCBQb3NpdGlvbiBpbiBvbmUgYnl0ZTogIHxNb3N0ICAgICAgTGVhc3R8IAotICogICAgICAgICAgICAgICAgICAgICpwQml0T2Zmc2V0ICAgICAgICB8MCAxIDIgMyA0IDUgNiA3fCAKLSAqICAgcHJlZERpciAtIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uOyB1c2VkIHRvIHNlbGVjdCB0aGUgemlnemFnIHNjYW4gCi0gKiAgICAgICAgICAgIHBhdHRlcm47IHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19OT05FIC0gQUMgcHJlZGljdGlvbiBub3QgdXNlZDsgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FuLiAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX0hPUklaT05UQUwgLSBIb3Jpem9udGFsIHByZWRpY3Rpb247IAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1zIGFsdGVybmF0ZS12ZXJ0aWNhbCB6aWd6YWcgc2NhbjsgCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19WRVJUSUNBTCAtIFZlcnRpY2FsIHByZWRpY3Rpb247IAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsIHppZ3phZyBzY2FuLiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKLSAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSBvciBjaHJvbWluYW5jZSkgb2YgdGhlIAotICogICAgICAgICAgICBjdXJyZW50IGJsb2NrIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkIHN1Y2ggCi0gKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzdWNoIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudCBibG9jazsgbXVzdCBiZSAKLSAqICAgICAgICAgICAgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QKLSAqICAgIC0gICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQotICogICAgLSAgICBwcmVEaXIgZXhjZWVkcyBbMCwyXQotICogICAgLSAgICBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZCAKLSAqICAgIE9NWF9TdHNfRXJyIC0gaWY6Ci0gKiAgICAtICAgIEluIERlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLCBkY19zaXplID4gMTIgCi0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiBtYXJrIGJpdHMgZXF1YWxzIHplcm8gCi0gKiAgICAtICAgIElsbGVnYWwgc3RyZWFtIGVuY291bnRlcmVkOyBjb2RlIGNhbm5vdCBiZSBsb2NhdGVkIGluIFZMQyB0YWJsZSAKLSAqICAgIC0gICAgRm9yYmlkZGVuIGNvZGUgZW5jb3VudGVyZWQgaW4gdGhlIFZMQyBGTEMgdGFibGUuIAotICogICAgLSAgICBUaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICgKLSAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgT01YX1U4IHByZWREaXIsCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAotICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgICAoNi4yLjUuMi4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgCi0gKiBmb3Igb25lIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgCi0gKiBwcm92aWRlZCBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKLSAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICBJbnRyYSBEQyAKLSAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmcuICAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgCi0gKiAgICAgICAgICAgIGJpdHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGN1cnJlbnQgYnl0ZSByZWZlcmVuY2VkIAotICogICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uICBUaGUgcGFyYW1ldGVyICpwQml0T2Zmc2V0IGlzIHZhbGlkIGluIHRoZSAKLSAqICAgICAgICAgICAgcmFuZ2UgWzAtN10uIEJpdCBQb3NpdGlvbiBpbiBvbmUgYnl0ZTogIHxNb3N0IExlYXN0fCAqcEJpdE9mZnNldCAKLSAqICAgICAgICAgICAgfDAgMSAyIDMgNCA1IDYgN3wgCi0gKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbjsgdXNlZCB0byBzZWxlY3QgdGhlIHppZ3phZyBzY2FuIAotICogICAgICAgICAgICBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IE9NWF9WQ19OT05FIC0gQUMgCi0gKiAgICAgICAgICAgIHByZWRpY3Rpb24gbm90IHVzZWQ7IHBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgICAgICAgICAgIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uOyBwZXJmb3JtcyAKLSAqICAgICAgICAgICAgYWx0ZXJuYXRlLXZlcnRpY2FsIHppZ3phZyBzY2FuOyBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCAKLSAqICAgICAgICAgICAgcHJlZGljdGlvbjsgcGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwgemlnemFnIHNjYW4uIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAotICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlIG9yIGNocm9taW5hbmNlKSBvZiB0aGUgCi0gKiAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQgc3VjaCAKLSAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHN1Y2ggdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAotICogICAgICAgICAgICA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdCwgCi0gKiAgICAgICAgICAgICAgb3IgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgICAgICAgICAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddLCBwcmVEaXIgZXhjZWVkcyBbMCwyXSwgb3IgcERzdCBpcyAKLSAqICAgICAgICAgICAgICBub3QgNC1ieXRlIGFsaWduZWQgCi0gKiAgICBPTVhfU3RzX0VyciBJbiBEZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgZGNfc2l6ZSA+IDEyIEF0IGxlYXN0IG9uZSBvZiAKLSAqICAgICAgICAgICAgICBtYXJrIGJpdHMgZXF1YWxzIHplcm8gSWxsZWdhbCBzdHJlYW0gZW5jb3VudGVyZWQ7IGNvZGUgY2Fubm90IAotICogICAgICAgICAgICAgIGJlIGxvY2F0ZWQgaW4gVkxDIHRhYmxlIEZvcmJpZGRlbiBjb2RlIGVuY291bnRlcmVkIGluIHRoZSBWTEMgCi0gKiAgICAgICAgICAgICAgRkxDIHRhYmxlIFRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgT01YX1MxNiAqcERzdCwKLSAgICBPTVhfVTggcHJlZERpciwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlciAgICg2LjIuNS4yLjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIG9uZSBpbnRlci1jb2RlZCBibG9jay4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBkb3VibGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgbmV4dCBhdmFpbGFibGUgYml0IGluIHRoZSBjdXJyZW50IHN0cmVhbSAKLSAqICAgICAgICAgICAgYnl0ZSByZWZlcmVuY2VkIGJ5ICpwcEJpdFN0cmVhbS4gVGhlIHBhcmFtZXRlciAqcEJpdE9mZnNldCBpcyAKLSAqICAgICAgICAgICAgdmFsaWQgd2l0aGluIHRoZSByYW5nZSBbMC03XS4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQgc3VjaCAKLSAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZGVjb2Rpbmcgc3VjaCB0aGF0IGl0IHBvaW50cyAKLSAqICAgICAgICAgICAgdG8gdGhlIG5leHQgYXZhaWxhYmxlIGJpdCBpbiB0aGUgc3RyZWFtIGJ5dGUgcmVmZXJlbmNlZCBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgCi0gKiAgICAgICAgICAgIDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QKLSAqICAgIC0gICAgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQKLSAqICAgIC0gICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddCi0gKiAgICBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvciwgaWY6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBtYXJrIGJpdCBpcyBlcXVhbCB0byB6ZXJvIAotICogICAgLSAgICBFbmNvdW50ZXJlZCBhbiBpbGxlZ2FsIHN0cmVhbSBjb2RlIHRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBWTEMgdGFibGUgCi0gKiAgICAtICAgIEVuY291bnRlcmVkIGFuIGlsbGVnYWwgY29kZSBpbiB0aGUgVkxDIEZMQyB0YWJsZSAKLSAqICAgIC0gICAgVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIgKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgT01YX1MxNiAqcERzdCwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1F1YW50SW52SW50cmFfSSAgICg2LjIuNS4zLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyB0aGUgc2Vjb25kIGludmVyc2UgcXVhbnRpemF0aW9uIG1vZGUgb24gYW4gaW50cmEvaW50ZXIgY29kZWQgCi0gKiBibG9jay4gU3VwcG9ydHMgYml0c19wZXJfcGl4ZWwgPSA4LiBUaGUgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgY2xpcHBlZCB0byAKLSAqIHRoZSByYW5nZSBbLTIwNDgsIDIwNDddLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgKHF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2s7IG11c3QgYmUgCi0gKiAgICAgICAgICAgIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGl6ZXJfc2NhbGUpIAotICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSBvZiB0aGUgY3VycmVudCBibG9jay4gVGFrZXMgb25lIG9mIHRoZSAKLSAqICAgICAgICAgICAgZm9sbG93aW5nIGZsYWdzOiBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UgKGludHJhIAotICogICAgICAgICAgICB2ZXJzaW9uIG9ubHkpLiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyIAotICogICAgICAgICAgICAoaW50cmEgdmVyc2lvbiBvbmx5KS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKGRlcXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jayAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBpcyAKLSAqICAgICAgICAgICAgICB0cnVlOiAKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBOVUxMIAotICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49MzEgCi0gKiAgICAtICAgIHZpZGVvQ29tcCBpcyBuZWl0aGVyIE9NWF9WQ19MVU1JTkFOQ0Ugbm9yIE9NWF9WQ19DSFJPTUlOQU5DRS4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX1F1YW50SW52SW50cmFfSSAoCi0gICAgT01YX1MxNiAqcFNyY0RzdCwKLSAgICBPTVhfSU5UIFFQLAotICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcCwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1F1YW50SW52SW50ZXJfSSAgICg2LjIuNS4zLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyB0aGUgc2Vjb25kIGludmVyc2UgcXVhbnRpemF0aW9uIG1vZGUgb24gYW4gaW50cmEvaW50ZXIgY29kZWQgCi0gKiBibG9jay4gU3VwcG9ydHMgYml0c19wZXJfcGl4ZWwgPSA4LiBUaGUgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgY2xpcHBlZCB0byAKLSAqIHRoZSByYW5nZSBbLTIwNDgsIDIwNDddLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgKHF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2s7IG11c3QgYmUgCi0gKiAgICAgICAgICAgIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGl6ZXJfc2NhbGUpIAotICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSBvZiB0aGUgY3VycmVudCBibG9jay4gVGFrZXMgb25lIG9mIHRoZSAKLSAqICAgICAgICAgICAgZm9sbG93aW5nIGZsYWdzOiBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UgKGludHJhIAotICogICAgICAgICAgICB2ZXJzaW9uIG9ubHkpLiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyIAotICogICAgICAgICAgICAoaW50cmEgdmVyc2lvbiBvbmx5KS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKGRlcXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jayAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBpcyAKLSAqICAgICAgICAgICAgICB0cnVlOiAKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBOVUxMIAotICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49MzEgCi0gKiAgICAtICAgIHZpZGVvQ29tcCBpcyBuZWl0aGVyIE9NWF9WQ19MVU1JTkFOQ0Ugbm9yIE9NWF9WQ19DSFJPTUlOQU5DRS4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX1F1YW50SW52SW50ZXJfSSAoCi0gICAgT01YX1MxNiAqcFNyY0RzdCwKLSAgICBPTVhfSU5UIFFQCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEgICAoNi4yLjUuNC4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogRGVjb2RlcyB0aGUgSU5UUkEgYmxvY2sgY29lZmZpY2llbnRzLiBJbnZlcnNlIHF1YW50aXphdGlvbiwgaW52ZXJzZWx5IAotICogemlnemFnIHBvc2l0aW9uaW5nLCBhbmQgSURDVCwgd2l0aCBhcHByb3ByaWF0ZSBjbGlwcGluZyBvbiBlYWNoIHN0ZXAsIGFyZSAKLSAqIHBlcmZvcm1lZCBvbiB0aGUgY29lZmZpY2llbnRzLiBUaGUgcmVzdWx0cyBhcmUgdGhlbiBwbGFjZWQgaW4gdGhlIG91dHB1dCAKLSAqIGZyYW1lL3BsYW5lIG9uIGEgcGl4ZWwgYmFzaXMuICBOb3RlOiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgdXNlZCBvbmx5IHdoZW4gCi0gKiBhdCBsZWFzdCBvbmUgbm9uLXplcm8gQUMgY29lZmZpY2llbnQgb2YgY3VycmVudCBibG9jayBleGlzdHMgaW4gdGhlIGJpdCAKLSAqIHN0cmVhbS4gVGhlIERDIG9ubHkgY29uZGl0aW9uIHdpbGwgYmUgaGFuZGxlZCBpbiBhbm90aGVyIGZ1bmN0aW9uLiAKLSAqCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCAKLSAqICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4gVGhlcmUgaXMgbm8gYm91bmRhcnkgY2hlY2sgZm9yIHRoZSBiaXQgc3RyZWFtIAotICogICAgICAgICAgICBidWZmZXIuIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluIFswLTddLiAKLSAqICAgc3RlcCAtIHdpZHRoIG9mIHRoZSBkZXN0aW5hdGlvbiBwbGFuZSAKLSAqICAgcENvZWZCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gCi0gKiAgICAgICAgICAgIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBDb2VmQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBjdXJRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIG1hY3JvYmxvY2sgd2hpY2ggdGhlIGN1cnJlbnQgYmxvY2sgCi0gKiAgICAgICAgICAgIGJlbG9uZ3MgdG8gCi0gKiAgIHBRUEJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYnVmZmVyIAotICogICBibG9ja0luZGV4IC0gYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kIHBvc2l0aW9uIGFzIAotICogICAgICAgICAgICBkZWZpbmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDYuMS4zLjgsIEZpZ3VyZSA2LTUuIAotICogICBpbnRyYURDVkxDIC0gYSBjb2RlIGRldGVybWluZWQgYnkgaW50cmFfZGNfdmxjX3RociBhbmQgUVAuIFRoaXMgYWxsb3dzIGEgCi0gKiAgICAgICAgICAgIG1lY2hhbmlzbSB0byBzd2l0Y2ggYmV0d2VlbiB0d28gVkxDIGZvciBjb2Rpbmcgb2YgSW50cmEgREMgCi0gKiAgICAgICAgICAgIGNvZWZmaWNpZW50cyBhcyBwZXIgW0lTTzE0NDk2LTJdLCBUYWJsZSA2LTIxLiAKLSAqICAgQUNQcmVkRmxhZyAtIGEgZmxhZyBlcXVhbCB0byBhY19wcmVkX2ZsYWcgKG9mIGx1bWluYW5jZSkgaW5kaWNhdGluZyBpZiAKLSAqICAgICAgICAgICAgdGhlIGFjIGNvZWZmaWNpZW50cyBvZiB0aGUgZmlyc3Qgcm93IG9yIGZpcnN0IGNvbHVtbiBhcmUgCi0gKiAgICAgICAgICAgIGRpZmZlcmVudGlhbGx5IGNvZGVkIGZvciBpbnRyYSBjb2RlZCBtYWNyb2Jsb2NrLiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyAKLSAqICAgICAgICAgICAgbW9kZSwgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkLCBzbyAKLSAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKLSAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBibG9jayBpbiB0aGUgZGVzdGluYXRpb24gcGxhbmU7IG11c3QgYmUgYWxpZ25lZCBvbiAKLSAqICAgICAgICAgICAgYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcENvZWZCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIuIAotICogICBwQ29lZkJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlciAgTm90ZTogCi0gKiAgICAgICAgICAgIFRoZSBjb2VmZmljaWVudCBidWZmZXJzIG11c3QgYmUgdXBkYXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIAotICogICAgICAgICAgICB1cGRhdGUgcHJvY2VkdXJlIGRlZmluZWQgaW4gc2VjdGlvbiA2LjIuMi4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIGlmOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcENvZWZCdWZSb3csIHBDb2VmQnVmQ29sLCAKLSAqICAgICAgICAgcFFQQnVmLCBwRHN0LiAKLSAqICAgIC0gICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XSAKLSAqICAgIC0gICAgY3VyUVAgZXhjZWVkcyAoMSwgMzEpCi0gKiAgICAtICAgIGJsb2NrSW5kZXggZXhjZWVkcyBbMCw1XQotICogICAgLSAgICBzdGVwIGlzIG5vdCB0aGUgbXVsdGlwbGUgb2YgOAotICogICAgLSAgICBhIHBvaW50ZXIgYWxpZ25tZW50IHJlcXVpcmVtZW50IHdhcyB2aW9sYXRlZC4gCi0gKiAgICBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvci4gUmVmZXIgdG8gT01YX1N0c19FcnIgb2YgRGVjb2RlVkxDWmlnemFnX0ludHJhLiAgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYSAoCi0gICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBPTVhfVTggKnBEc3QsCi0gICAgT01YX0lOVCBzdGVwLAotICAgIE9NWF9TMTYgKnBDb2VmQnVmUm93LAotICAgIE9NWF9TMTYgKnBDb2VmQnVmQ29sLAotICAgIE9NWF9VOCBjdXJRUCwKLSAgICBjb25zdCBPTVhfVTggKnBRUEJ1ZiwKLSAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCi0gICAgT01YX0lOVCBpbnRyYURDVkxDLAotICAgIE9NWF9JTlQgQUNQcmVkRmxhZywKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlciAgICg2LjIuNS40LjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBEZWNvZGVzIHRoZSBJTlRFUiBibG9jayBjb2VmZmljaWVudHMuIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSAKLSAqIHF1YW50aXphdGlvbiwgaW52ZXJzZSB6aWd6YWcgcG9zaXRpb25pbmcsIGFuZCBJRENUICh3aXRoIGFwcHJvcHJpYXRlIAotICogY2xpcHBpbmcgb24gZWFjaCBzdGVwKSBvbiB0aGUgY29lZmZpY2llbnRzLiBUaGUgcmVzdWx0cyAocmVzaWR1YWxzKSBhcmUgCi0gKiBwbGFjZWQgaW4gYSBjb250aWd1b3VzIGFycmF5IG9mIDY0IGVsZW1lbnRzLiBGb3IgSU5URVIgYmxvY2ssIHRoZSBvdXRwdXQgCi0gKiBidWZmZXIgaG9sZHMgdGhlIHJlc2lkdWFscyBmb3IgZnVydGhlciByZWNvbnN0cnVjdGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCAKLSAqICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4gVGhlcmUgaXMgbm8gYm91bmRhcnkgY2hlY2sgZm9yIHRoZSBiaXQgc3RyZWFtIAotICogICAgICAgICAgICBidWZmZXIuIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluIFswLTddIAotICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCi0gKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwgc28gCi0gKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCi0gKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVjb2RlZCByZXNpZHVhbCBidWZmZXIgKGEgY29udGlndW91cyBhcnJheSBvZiA2NCAKLSAqICAgICAgICAgICAgZWxlbWVudHMgb2YgT01YX1MxNiBkYXRhIHR5cGUpOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIGlmOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOdWxsOiAKLSAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCAsIHBEc3QgCi0gKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KLSAqICAgIC0gICAgUVAgPD0gMC4gCi0gKiAgICAtICAgIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCAKLSAqICAgIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yLiBSZWZlciB0byBPTVhfU3RzX0VyciBvZiBEZWNvZGVWTENaaWd6YWdfSW50ZXIgLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyICgKLSAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgT01YX0lOVCBRUCwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSAgICg2LjIuNS40LjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhZGFwdGl2ZSBEQy9BQyBjb2VmZmljaWVudCBwcmVkaWN0aW9uIGZvciBhbiBpbnRyYSBibG9jay4gIFByaW9yIAotICogdG8gdGhlIGZ1bmN0aW9uIGNhbGwsIHByZWRpY3Rpb24gZGlyZWN0aW9uIChwcmVkRGlyKSBzaG91bGQgYmUgc2VsZWN0ZWQgYXMgCi0gKiBzcGVjaWZpZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjMuMS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucyB0aGUgcXVhbnRpemVkIAotICogICAgICAgICAgICBjb2VmZmljaWVudCByZXNpZHVhbHMgKFBRRikgb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgCi0gKiAgICAgICAgICAgIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBUaGUgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgCi0gKiAgICAgICAgICAgIHNhdHVyYXRlZCB0byB0aGUgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCi0gKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIAotICogICAgICAgICAgICBhIDQtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBQcmVkQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIGN1clFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgY3VycmVudCBibG9jay4gY3VyUVAgbWF5IGVxdWFsIHRvIAotICogICAgICAgICAgICBwcmVkUVAgZXNwZWNpYWxseSB3aGVuIHRoZSBjdXJyZW50IGJsb2NrIGFuZCB0aGUgcHJlZGljdG9yIGJsb2NrIAotICogICAgICAgICAgICBhcmUgaW4gdGhlIHNhbWUgbWFjcm9ibG9jay4gCi0gKiAgIHByZWRRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIHByZWRpY3RvciBibG9jayAKLSAqICAgcHJlZERpciAtIGluZGljYXRlcyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggdGFrZXMgb25lIG9mIHRoZSAKLSAqICAgICAgICAgICAgZm9sbG93aW5nIHZhbHVlczogT01YX1ZDX0hPUklaT05UQUwgLSBwcmVkaWN0IGhvcml6b250YWxseSAKLSAqICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMIC0gcHJlZGljdCB2ZXJ0aWNhbGx5IAotICogICBBQ1ByZWRGbGFnIC0gYSBmbGFnIGluZGljYXRpbmcgaWYgQUMgcHJlZGljdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkLiBJdCAKLSAqICAgICAgICAgICAgaXMgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIGluIHRoZSBiaXQgc3RyZWFtIHN5bnRheCBvZiBNUEVHLTQgCi0gKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2Ugb3IgY2hyb21pbmFuY2UpIG9mIHRoZSAKLSAqICAgICAgICAgICAgY3VycmVudCBibG9jayAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucyB0aGUgcXVhbnRpemVkIAotICogICAgICAgICAgICBjb2VmZmljaWVudHMgKFFGKSBvZiB0aGUgY3VycmVudCBibG9jayAKLSAqICAgcFByZWRCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIgCi0gKiAgIHBQcmVkQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyICBOb3RlOiAKLSAqICAgICAgICAgICAgQnVmZmVyIHVwZGF0ZTogVXBkYXRlIHRoZSBBQyBwcmVkaWN0aW9uIGJ1ZmZlciAoYm90aCByb3cgYW5kIAotICogICAgICAgICAgICBjb2x1bW4gYnVmZmVyKS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIGlmOgotICogICAgICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgICAgICBwU3JjRHN0LCBwUHJlZEJ1ZlJvdywgb3IgcFByZWRCdWZDb2wuIAotICogICAgICAgIC0gICAgY3VyUVAgPD0gMCwgCi0gKiAgICAgICAgLSAgICBwcmVkUVAgPD0gMCwgCi0gKiAgICAgICAgLSAgICBjdXJRUCA+MzEsIAotICogICAgICAgIC0gICAgcHJlZFFQID4gMzEsIAotICogICAgICAgIC0gICAgcHJlRGlyIGV4Y2VlZHMgWzEsMl0KLSAqICAgICAgICAtICAgIHBTcmNEc3QsIHBQcmVkQnVmUm93LCBvciBwUHJlZEJ1ZkNvbCBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEgKAotICAgIE9NWF9TMTYgKnBTcmNEc3QsCi0gICAgT01YX1MxNiAqcFByZWRCdWZSb3csCi0gICAgT01YX1MxNiAqcFByZWRCdWZDb2wsCi0gICAgT01YX0lOVCBjdXJRUCwKLSAgICBPTVhfSU5UIHByZWRRUCwKLSAgICBPTVhfSU5UIHByZWREaXIsCi0gICAgT01YX0lOVCBBQ1ByZWRGbGFnLAotICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfTUNSZWNvbkJsb2NrICAgKDYuMi41LjUuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIG1vdGlvbiBjb21wZW5zYXRpb24gcHJlZGljdGlvbiBmb3IgYW4gOHg4IGJsb2NrIHVzaW5nIAotICogaW50ZXJwb2xhdGlvbiBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjIuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBibG9jayBpbiB0aGUgcmVmZXJlbmNlIHBsYW5lLiAKLSAqICAgc3JjU3RlcCAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSAKLSAqICAgICAgICAgICAgcmVmZXJlbmNlIHBsYW5lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBkc3RTdGVwIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIAotICogICAgICAgICAgICBkZXN0aW5hdGlvbiBwbGFuZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgcFNyY1Jlc2lkdWUgLSBwb2ludGVyIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIDE2LWJpdCBwcmVkaWN0aW9uIAotICogICAgICAgICAgICByZXNpZHVhbHM7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiBJZiB0aGUgcG9pbnRlciBpcyBOVUxMLCB0aGVuIAotICogICAgICAgICAgICBubyBwcmVkaWN0aW9uIGlzIGRvbmUsIG9ubHkgbW90aW9uIGNvbXBlbnNhdGlvbiwgaS5lLiwgdGhlIGJsb2NrIAotICogICAgICAgICAgICBpcyBtb3ZlZCB3aXRoIGludGVycG9sYXRpb24uIAotICogICBwcmVkaWN0VHlwZSAtIGJpbGluZWFyIGludGVycG9sYXRpb24gdHlwZSwgYXMgZGVmaW5lZCBpbiBzZWN0aW9uIAotICogICAgICAgICAgICA2LjIuMS4yLiAKLSAqICAgcm5kVmFsIC0gcm91bmRpbmcgY29udHJvbCBwYXJhbWV0ZXI6IDAgLSBkaXNhYmxlZDsgMSAtIGVuYWJsZWQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLiAgSWYgCi0gKiAgICAgICAgICAgIHByZWRpY3Rpb24gcmVzaWR1YWxzIGFyZSBhZGRlZCB0aGVuIG91dHB1dCBpbnRlbnNpdGllcyBhcmUgCi0gKiAgICAgICAgICAgIGNsaXBwZWQgdG8gdGhlIHJhbmdlIFswLDI1NV0uIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKLSAqICAgIC0gICAgcERzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBwU3JjUmVzaWR1ZSBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjIG9yIHBEc3QuIAotICogICAgLSAgICBlaXRoZXIgc3JjU3RlcCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgICBpbnZhbGlkIHR5cGUgc3BlY2lmaWVkIGZvciB0aGUgcGFyYW1ldGVyIHByZWRpY3RUeXBlLiAKLSAqICAgIC0gICAgdGhlIHBhcmFtZXRlciBybmRWYWwgaXMgbm90IGVxdWFsIGVpdGhlciB0byAwIG9yIDEuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9NQ1JlY29uQmxvY2sgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBPTVhfSU5UIHNyY1N0ZXAsCi0gICAgY29uc3QgT01YX1MxNiAqcFNyY1Jlc2lkdWUsCi0gICAgT01YX1U4ICpwRHN0LAotICAgIE9NWF9JTlQgZHN0U3RlcCwKLSAgICBPTVhfSU5UIHByZWRpY3RUeXBlLAotICAgIE9NWF9JTlQgcm5kVmFsCi0pOwotCi0KLQotLyogNi4zLjEuMSBJbnRyYSAxNngxNiBQcmVkaWN0aW9uIE1vZGVzICAqLwotLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIGludHJhXzE2eDE2IG1hY3JvYmxvY2sgcHJlZGljdGlvbiBtb2RlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLwotCi10eXBlZGVmIGVudW0gewotICAgIE9NWF9WQ18xNlgxNl9WRVJUID0gMCwgIC8qKiBJbnRyYV8xNngxNl9WZXJ0aWNhbCAqLwotICAgIE9NWF9WQ18xNlgxNl9IT1IgPSAxLCAgIC8qKiBJbnRyYV8xNngxNl9Ib3Jpem9udGFsICovCi0gICAgT01YX1ZDXzE2WDE2X0RDID0gMiwgICAgLyoqIEludHJhXzE2eDE2X0RDICovCi0gICAgT01YX1ZDXzE2WDE2X1BMQU5FID0gMyAgLyoqIEludHJhXzE2eDE2X1BsYW5lICovIAotfSBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlOwotCi0KLQotLyogNi4zLjEuMiBJbnRyYSA0eDQgUHJlZGljdGlvbiBNb2RlcyAgKi8KLS8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBpbnRyYV80eDQgbWFjcm9ibG9jayBwcmVkaWN0aW9uIG1vZGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgT01YX1ZDXzRYNF9WRVJUID0gMCwgICAgIC8qKiBJbnRyYV80eDRfVmVydGljYWwgKi8KLSAgICBPTVhfVkNfNFg0X0hPUiA9IDEsICAgICAgLyoqIEludHJhXzR4NF9Ib3Jpem9udGFsICovCi0gICAgT01YX1ZDXzRYNF9EQyA9IDIsICAgICAgIC8qKiBJbnRyYV80eDRfREMgKi8KLSAgICBPTVhfVkNfNFg0X0RJQUdfREwgPSAzLCAgLyoqIEludHJhXzR4NF9EaWFnb25hbF9Eb3duX0xlZnQgKi8KLSAgICBPTVhfVkNfNFg0X0RJQUdfRFIgPSA0LCAgLyoqIEludHJhXzR4NF9EaWFnb25hbF9Eb3duX1JpZ2h0ICovCi0gICAgT01YX1ZDXzRYNF9WUiA9IDUsICAgICAgIC8qKiBJbnRyYV80eDRfVmVydGljYWxfUmlnaHQgKi8KLSAgICBPTVhfVkNfNFg0X0hEID0gNiwgICAgICAgLyoqIEludHJhXzR4NF9Ib3Jpem9udGFsX0Rvd24gKi8KLSAgICBPTVhfVkNfNFg0X1ZMID0gNywgICAgICAgLyoqIEludHJhXzR4NF9WZXJ0aWNhbF9MZWZ0ICovCi0gICAgT01YX1ZDXzRYNF9IVSA9IDggICAgICAgIC8qKiBJbnRyYV80eDRfSG9yaXpvbnRhbF9VcCAqLyAKLX0gT01YVkNNNFAxMEludHJhNHg0UHJlZE1vZGU7Ci0KLQotCi0vKiA2LjMuMS4zIENocm9tYSBQcmVkaWN0aW9uIE1vZGVzICAqLwotLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIGludHJhIGNocm9tYSBwcmVkaWN0aW9uIG1vZGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgT01YX1ZDX0NIUk9NQV9EQyA9IDAsICAgIC8qKiBJbnRyYV9DaHJvbWFfREMgKi8KLSAgICBPTVhfVkNfQ0hST01BX0hPUiA9IDEsICAgLyoqIEludHJhX0Nocm9tYV9Ib3Jpem9udGFsICovCi0gICAgT01YX1ZDX0NIUk9NQV9WRVJUID0gMiwgIC8qKiBJbnRyYV9DaHJvbWFfVmVydGljYWwgKi8KLSAgICBPTVhfVkNfQ0hST01BX1BMQU5FID0gMyAgLyoqIEludHJhX0Nocm9tYV9QbGFuZSAqLyAKLX0gT01YVkNNNFAxMEludHJhQ2hyb21hUHJlZE1vZGU7Ci0KLQotCi0vKiA2LjMuMS40IE1vdGlvbiBFc3RpbWF0aW9uIE1vZGVzICAqLwotLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIEguMjY0IG1vdGlvbiBlc3RpbWF0aW9uIG1vZGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgT01YX1ZDX000UDEwX0ZBU1RfU0VBUkNIID0gMCwgLyoqIEZhc3QgbW90aW9uIHNlYXJjaCAqLwotICAgIE9NWF9WQ19NNFAxMF9GVUxMX1NFQVJDSCA9IDEgIC8qKiBGdWxsIG1vdGlvbiBzZWFyY2ggKi8gCi19IE9NWFZDTTRQMTBNRU1vZGU7Ci0KLQotCi0vKiA2LjMuMS41IE1hY3JvYmxvY2sgVHlwZXMgICovCi0vKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgSC4yNjQgbWFjcm9ibG9jayB0eXBlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLwotCi10eXBlZGVmIGVudW0gewotICAgIE9NWF9WQ19QXzE2eDE2ICA9IDAsIC8qIGRlZmluZWQgYnkgW0lTTzE0NDk2LTEwXSAqLwotICAgIE9NWF9WQ19QXzE2eDggID0gMSwKLSAgICBPTVhfVkNfUF84eDE2ICA9IDIsCi0gICAgT01YX1ZDX1BfOHg4ICA9IDMsCi0gICAgT01YX1ZDX1BSRUYwXzh4OCAgPSA0LAotICAgIE9NWF9WQ19JTlRFUl9TS0lQICA9IDUsCi0gICAgT01YX1ZDX0lOVFJBXzR4NCAgPSA4LAotICAgIE9NWF9WQ19JTlRSQV8xNngxNiAgPSA5LAotICAgIE9NWF9WQ19JTlRSQV9QQ00gPSAxMCAKLX0gT01YVkNNNFAxME1hY3JvYmxvY2tUeXBlOwotCi0KLQotLyogNi4zLjEuNiBTdWItTWFjcm9ibG9jayBUeXBlcyAgKi8KLS8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBILjI2NCBzdWItbWFjcm9ibG9jayB0eXBlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLwotCi10eXBlZGVmIGVudW0gewotICAgIE9NWF9WQ19TVUJfUF84eDggPSAwLCAvKiBkZWZpbmVkIGJ5IFtJU08xNDQ5Ni0xMF0gKi8KLSAgICBPTVhfVkNfU1VCX1BfOHg0ID0gMSwKLSAgICBPTVhfVkNfU1VCX1BfNHg4ID0gMiwKLSAgICBPTVhfVkNfU1VCX1BfNHg0ID0gMyAKLX0gT01YVkNNNFAxMFN1Yk1hY3JvYmxvY2tUeXBlOwotCi0KLQotLyogNi4zLjEuNyBWYXJpYWJsZSBMZW5ndGggQ29kaW5nIChWTEMpIEluZm9ybWF0aW9uICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgT01YX1U4IHVUcmFpbGluZ19PbmVzOyAgICAgIC8qIFRyYWlsaW5nIG9uZXM7IDMgYXQgbW9zdCAqLwotICAgIE9NWF9VOCB1VHJhaWxpbmdfT25lX1NpZ25zOyAvKiBUcmFpbGluZyBvbmVzIHNpZ25hbCAqLwotICAgIE9NWF9VOCB1TnVtQ29lZmZzOyAgICAgICAgICAvKiBUb3RhbCBudW1iZXIgb2Ygbm9uLXplcm8gY29lZnMsIGluY2x1ZGluZyB0cmFpbGluZyBvbmVzICovCi0gICAgT01YX1U4IHVUb3RhbFplcm9zOyAgICAgICAgIC8qIFRvdGFsIG51bWJlciBvZiB6ZXJvIGNvZWZzICovCi0gICAgT01YX1MxNiBpTGV2ZWxzWzE2XTsgICAgICAgIC8qIExldmVscyBvZiBub24temVybyBjb2VmcywgaW4gcmV2ZXJzZSB6aWctemFnIG9yZGVyICovCi0gICAgT01YX1U4IHVSdW5zWzE2XTsgICAgICAgICAgIC8qIFJ1bnMgZm9yIGxldmVscyBhbmQgdHJhaWxpbmcgb25lcywgaW4gcmV2ZXJzZSB6aWctemFnIG9yZGVyICovCi19IE9NWFZDTTRQMTBWTENJbmZvOwotCi0KLQotLyogNi4zLjEuOCBNYWNyb2Jsb2NrIEluZm9ybWF0aW9uICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgT01YX1MzMiBzbGljZUlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2xpY2UgbnVtYmVyICovCi0gICAgT01YVkNNNFAxME1hY3JvYmxvY2tUeXBlIG1iVHlwZTsgICAgICAgICAgLyogTUIgdHlwZSAqLwotICAgIE9NWFZDTTRQMTBTdWJNYWNyb2Jsb2NrVHlwZSBzdWJNQlR5cGVbNF07IC8qIHN1Yi1ibG9jayB0eXBlICovCi0gICAgT01YX1MzMiBxcHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcXAgZm9yIGx1bWEgKi8KLSAgICBPTVhfUzMyIHFwYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBxcCBmb3IgY2hyb21hICovCi0gICAgT01YX1UzMiBjYnB5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ0JQIEx1bWEgKi8KLSAgICBPTVhfVTMyIGNicGM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDQlAgQ2hyb21hICovCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgcE1WMFs0XVs0XTsgLyogbW90aW9uIHZlY3RvciwgcmVwcmVzZW50ZWQgdXNpbmcgMS80LXBlbCB1bml0cywgcE1WMFtibG9ja3ldW2Jsb2NreF0gKGJsb2NreSA9IDB+MywgYmxvY2t4ID0wfjMpICovCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgcE1WUHJlZFs0XVs0XTsgLyogbW90aW9uIHZlY3RvciBwcmVkaWN0aW9uLCBSZXByZXNlbnRlZCB1c2luZyAxLzQtcGVsIHVuaXRzLCBwTVZQcmVkW2Jsb2NreV1bYmxvY2t4XSAoYmxvY2t5ID0gMH4zLCBibG9ja3ggPSAwfjMpICovCi0gICAgT01YX1U4IHBSZWZMMElkeFs0XTsgICAgICAgICAgICAgICAgICAgICAgLyogcmVmZXJlbmNlIHBpY3R1cmUgaW5kaWNlcyAqLwotICAgIE9NWFZDTTRQMTBJbnRyYTE2eDE2UHJlZE1vZGUgSW50cmExNngxNlByZWRNb2RlOyAvKiBiZXN0IGludHJhIDE2eDE2IHByZWRpY3Rpb24gbW9kZSAqLwotICAgIE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlIHBJbnRyYTR4NFByZWRNb2RlWzE2XTsgLyogYmVzdCBpbnRyYSA0eDQgcHJlZGljdGlvbiBtb2RlIGZvciBlYWNoIGJsb2NrLCBwTVYwIGluZGV4ZWQgYXMgYWJvdmUgKi8KLX0gT01YVkNNNFAxME1CSW5mbywgKk9NWFZDTTRQMTBNQkluZm9QdHI7Ci0KLQotCi0vKiA2LjMuMS45IE1vdGlvbiBFc3RpbWF0aW9uIFBhcmFtZXRlcnMgICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBPTVhfUzMyIGJsb2NrU3BsaXRFbmFibGU4eDg7IC8qIGVuYWJsZXMgMTZ4OCwgOHgxNiwgOHg4ICovCi0gICAgT01YX1MzMiBibG9ja1NwbGl0RW5hYmxlNHg0OyAvKiBlbmFibGUgc3BsaXR0aW5nIG9mIDh4NCwgNHg4LCA0eDQgYmxvY2tzICovCi0gICAgT01YX1MzMiBoYWxmU2VhcmNoRW5hYmxlOwotICAgIE9NWF9TMzIgcXVhcnRlclNlYXJjaEVuYWJsZTsKLSAgICBPTVhfUzMyIGludHJhRW5hYmxlNHg0OyAgICAgIC8qIDE9ZW5hYmxlLCAwPWRpc2FibGUgKi8KLSAgICBPTVhfUzMyIHNlYXJjaFJhbmdlMTZ4MTY7ICAgIC8qIGludGVnZXIgcGl4ZWwgdW5pdHMgKi8KLSAgICBPTVhfUzMyIHNlYXJjaFJhbmdlOHg4OwotICAgIE9NWF9TMzIgc2VhcmNoUmFuZ2U0eDQ7Ci19IE9NWFZDTTRQMTBNRVBhcmFtczsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQgICAoNi4zLjMuMS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybSBJbnRyYV80eDQgcHJlZGljdGlvbiBmb3IgbHVtYSBzYW1wbGVzLiBJZiB0aGUgdXBwZXItcmlnaHQgYmxvY2sgaXMgCi0gKiBub3QgYXZhaWxhYmxlLCB0aGVuIGR1cGxpY2F0aW9uIHdvcmsgc2hvdWxkIGJlIGhhbmRsZWQgaW5zaWRlIHRoZSBmdW5jdGlvbi4gCi0gKiBVc2VycyBuZWVkIG5vdCBkZWZpbmUgdGhlbSBvdXRzaWRlLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjTGVmdCAtICBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgNCBsZWZ0IHBpeGVsczogCi0gKiAgICAgICAgICAgICAgICAgIHBbeCwgeV0gKHggPSAtMSwgeSA9IDAuLjMpIAotICogICBwU3JjQWJvdmUgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgOCBhYm92ZSBwaXhlbHM6IAotICogICAgICAgICAgICAgICAgICBwW3gseV0gKHggPSAwLi43LCB5ID0tMSk7IAotICogICAgICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAotICogICBwU3JjQWJvdmVMZWZ0IC0gUG9pbnRlciB0byB0aGUgYWJvdmUgbGVmdCBwaXhlbHM6IHBbeCx5XSAoeCA9IC0xLCB5ID0gLTEpIAotICogICBsZWZ0U3RlcCAtIFN0ZXAgb2YgbGVmdCBwaXhlbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgZHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAotICogICBwcmVkTW9kZSAtIEludHJhXzR4NCBwcmVkaWN0aW9uIG1vZGUuIAotICogICBhdmFpbGFiaWxpdHkgLSBOZWlnaGJvcmluZyA0eDQgYmxvY2sgYXZhaWxhYmlsaXR5IGZsYWcsIHJlZmVyIHRvIAotICogICAgICAgICAgICAgIk5laWdoYm9yaW5nIE1hY3JvYmxvY2sgQXZhaWxhYmlsaXR5IiAuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAotICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKLSAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCi0gKiAgICBwRHN0IGlzIE5VTEwuIAotICogICAgZHN0U3RlcCA8IDQsIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgICBsZWZ0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgIHByZWRNb2RlIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgZW51bWVyYXRpb24gCi0gKiAgICAgICAgICAgICAgT01YVkNNNFAxMEludHJhNHg0UHJlZE1vZGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9WRVJULCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19VUFBFUiAKLSAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfSE9SLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19MRUZUIAotICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFstMSx5XSAoeSA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9ESUFHX0RMLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAotICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUiBpbmRpY2F0aW5nIHBbeCwgLTFdICh4ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0RJQUdfRFIsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCi0gKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCi0gKiAgICAgICAgICAgICAgcFt4LC0xXSAoeCA9IDAuLjMpLCBvciBwWy0xLHldICh5ID0gMC4uMykgb3IgcFstMSwtMV0gaXMgbm90IAotICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X1ZSLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAotICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAotICogICAgICAgICAgICAgIHBbeCwtMV0gKHggPSAwLi4zKSwgb3IgcFstMSx5XSAoeSA9IDAuLjMpIG9yIHBbLTEsLTFdIGlzIG5vdCAKLSAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9IRCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKLSAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKLSAqICAgICAgICAgICAgICBwW3gsLTFdICh4ID0gMC4uMyksIG9yIHBbLTEseV0gKHkgPSAwLi4zKSBvciBwWy0xLC0xXSBpcyBub3QgCi0gKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfVkwsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX1VQUEVSIAotICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFt4LC0xXSAoeCA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9IVSwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfTEVGVCAKLSAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbLTEseV0gKHkgPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUiwgYnV0IHBTcmNBYm92ZSBpcyBOVUxMLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19MRUZULCBidXQgcFNyY0xlZnQgaXMgTlVMTC4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVJfTEVGVCwgYnV0IHBTcmNBYm92ZUxlZnQgaXMgTlVMTC4gCi0gKiAgICBlaXRoZXIgcFNyY0Fib3ZlIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICAKLSAqCi0gKiBOb3RlOiAKLSAqICAgICBwU3JjQWJvdmUsIHBTcmNBYm92ZSwgcFNyY0Fib3ZlTGVmdCBtYXkgYmUgaW52YWxpZCBwb2ludGVycyBpZiAKLSAqICAgICB0aGV5IGFyZSBub3QgdXNlZCBieSBpbnRyYSBwcmVkaWN0aW9uIGFzIGltcGxpZWQgaW4gcHJlZE1vZGUuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjTGVmdCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZUxlZnQsCi0gICAgT01YX1U4ICpwRHN0LAotICAgIE9NWF9JTlQgbGVmdFN0ZXAsCi0gICAgT01YX0lOVCBkc3RTdGVwLAotICAgIE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlIHByZWRNb2RlLAotICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2ICAgKDYuMy4zLjEuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm0gSW50cmFfMTZ4MTYgcHJlZGljdGlvbiBmb3IgbHVtYSBzYW1wbGVzLiBJZiB0aGUgdXBwZXItcmlnaHQgYmxvY2sgCi0gKiBpcyBub3QgYXZhaWxhYmxlLCB0aGVuIGR1cGxpY2F0aW9uIHdvcmsgc2hvdWxkIGJlIGhhbmRsZWQgaW5zaWRlIHRoZSAKLSAqIGZ1bmN0aW9uLiBVc2VycyBuZWVkIG5vdCBkZWZpbmUgdGhlbSBvdXRzaWRlLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBsZWZ0IHBpeGVsczogcFt4LCB5XSAoeCA9IC0xLCB5ID0gCi0gKiAgICAgICAgICAgIDAuLjE1KSAKLSAqICAgcFNyY0Fib3ZlIC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGFib3ZlIHBpeGVsczogcFt4LHldICh4ID0gMC4uMTUsIAotICogICAgICAgICAgICB5PSAtMSk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBwU3JjQWJvdmVMZWZ0IC0gUG9pbnRlciB0byB0aGUgYWJvdmUgbGVmdCBwaXhlbHM6IHBbeCx5XSAoeCA9IC0xLCB5ID0gLTEpIAotICogICBsZWZ0U3RlcCAtIFN0ZXAgb2YgbGVmdCBwaXhlbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIGRzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIHByZWRNb2RlIC0gSW50cmFfMTZ4MTYgcHJlZGljdGlvbiBtb2RlLCBwbGVhc2UgcmVmZXIgdG8gc2VjdGlvbiAzLjQuMS4gCi0gKiAgIGF2YWlsYWJpbGl0eSAtIE5laWdoYm9yaW5nIDE2eDE2IE1CIGF2YWlsYWJpbGl0eSBmbGFnLiBSZWZlciB0byAKLSAqICAgICAgICAgICAgICAgICAgc2VjdGlvbiAzLjQuNC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCi0gKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAotICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKLSAqICAgIHBEc3QgaXMgTlVMTC4gCi0gKiAgICBkc3RTdGVwIDwgMTYuIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICogICAgbGVmdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICogICAgcHJlZE1vZGUgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSBvZiBlbnVtZXJhdGlvbiAKLSAqICAgICAgICAgICAgICBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzE2WDE2X1ZFUlQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCi0gKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSIGluZGljYXRpbmcgcFt4LC0xXSAoeCA9IDAuLjE1KSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ18xNlgxNl9IT1IsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCi0gKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uMTUpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzE2WDE2X1BMQU5FLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAotICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAotICogICAgICAgICAgICAgIHBbeCwtMV0oeCA9IDAuLjE1KSwgb3IgcFstMSx5XSAoeSA9IDAuLjE1KSwgb3IgcFstMSwtMV0gaXMgbm90IAotICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVIsIGJ1dCBwU3JjQWJvdmUgaXMgTlVMTC4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfTEVGVCwgYnV0IHBTcmNMZWZ0IGlzIE5VTEwuIAotICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSX0xFRlQsIGJ1dCBwU3JjQWJvdmVMZWZ0IGlzIE5VTEwuIAotICogICAgZWl0aGVyIHBTcmNBYm92ZSBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIAotICoKLSAqIE5vdGU6IAotICogICAgIHBTcmNBYm92ZSwgcFNyY0Fib3ZlLCBwU3JjQWJvdmVMZWZ0IG1heSBiZSBpbnZhbGlkIHBvaW50ZXJzIGlmIAotICogICAgIHRoZXkgYXJlIG5vdCB1c2VkIGJ5IGludHJhIHByZWRpY3Rpb24gaW1wbGllZCBpbiBwcmVkTW9kZS4gCi0gKiBOb3RlOiAKLSAqICAgICBPTVhfVkNfVVBQRVJfUklHSFQgaXMgbm90IHVzZWQgaW4gaW50cmFfMTZ4MTYgbHVtYSBwcmVkaWN0aW9uLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjTGVmdCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZUxlZnQsCi0gICAgT01YX1U4ICpwRHN0LAotICAgIE9NWF9JTlQgbGVmdFN0ZXAsCi0gICAgT01YX0lOVCBkc3RTdGVwLAotICAgIE9NWFZDTTRQMTBJbnRyYTE2eDE2UHJlZE1vZGUgcHJlZE1vZGUsCi0gICAgT01YX1MzMiBhdmFpbGFiaWxpdHkKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4ICAgKDYuMy4zLjEuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGludHJhIHByZWRpY3Rpb24gZm9yIGNocm9tYSBzYW1wbGVzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiA4IGxlZnQgcGl4ZWxzOiBwW3gsIHldICh4ID0gLTEsIHk9IAotICogICAgICAgICAgICAwLi43KS4gCi0gKiAgIHBTcmNBYm92ZSAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiA4IGFib3ZlIHBpeGVsczogcFt4LHldICh4ID0gMC4uNywgeSAKLSAqICAgICAgICAgICAgPSAtMSk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBwU3JjQWJvdmVMZWZ0IC0gUG9pbnRlciB0byB0aGUgYWJvdmUgbGVmdCBwaXhlbHM6IHBbeCx5XSAoeCA9IC0xLCB5ID0gLTEpIAotICogICBsZWZ0U3RlcCAtIFN0ZXAgb2YgbGVmdCBwaXhlbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgZHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBwcmVkTW9kZSAtIEludHJhIGNocm9tYSBwcmVkaWN0aW9uIG1vZGUsIHBsZWFzZSByZWZlciB0byBzZWN0aW9uIDMuNC4zLiAKLSAqICAgYXZhaWxhYmlsaXR5IC0gTmVpZ2hib3JpbmcgY2hyb21hIGJsb2NrIGF2YWlsYWJpbGl0eSBmbGFnLCBwbGVhc2UgcmVmZXIgCi0gKiAgICAgICAgICAgIHRvICAiTmVpZ2hib3JpbmcgTWFjcm9ibG9jayBBdmFpbGFiaWxpdHkiLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCi0gKiAgICBJZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAotICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKLSAqICAgIHBEc3QgaXMgTlVMTC4gCi0gKiAgICBkc3RTdGVwIDwgOCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgbGVmdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICBwcmVkTW9kZSBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlIG9mIGVudW1lcmF0aW9uIAotICogICAgICAgICAgICAgIE9NWFZDTTRQMTBJbnRyYUNocm9tYVByZWRNb2RlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ19DSFJPTUFfVkVSVCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKLSAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVIgaW5kaWNhdGluZyBwW3gsLTFdICh4ID0gMC4uNykgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfQ0hST01BX0hPUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfTEVGVCAKLSAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbLTEseV0gKHkgPSAwLi43KSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ19DSFJPTUFfUExBTkUsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCi0gKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCi0gKiAgICAgICAgICAgICAgcFt4LC0xXSh4ID0gMC4uNyksIG9yIHBbLTEseV0gKHkgPSAwLi43KSwgb3IgcFstMSwtMV0gaXMgbm90IAotICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVIsIGJ1dCBwU3JjQWJvdmUgaXMgTlVMTC4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfTEVGVCwgYnV0IHBTcmNMZWZ0IGlzIE5VTEwuIAotICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSX0xFRlQsIGJ1dCBwU3JjQWJvdmVMZWZ0IGlzIE5VTEwuIAotICogICAgZWl0aGVyIHBTcmNBYm92ZSBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5LiAgCi0gKgotICogIE5vdGU6IHBTcmNBYm92ZSwgcFNyY0Fib3ZlLCBwU3JjQWJvdmVMZWZ0IG1heSBiZSBpbnZhbGlkIHBvaW50ZXIgaWYgCi0gKiAgdGhleSBhcmUgbm90IHVzZWQgYnkgaW50cmEgcHJlZGljdGlvbiBpbXBsaWVkIGluIHByZWRNb2RlLiAKLSAqCi0gKiAgTm90ZTogT01YX1ZDX1VQUEVSX1JJR0hUIGlzIG5vdCB1c2VkIGluIGludHJhIGNocm9tYSBwcmVkaWN0aW9uLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDggKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0xlZnQsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmVMZWZ0LAotICAgIE9NWF9VOCAqcERzdCwKLSAgICBPTVhfSU5UIGxlZnRTdGVwLAotICAgIE9NWF9JTlQgZHN0U3RlcCwKLSAgICBPTVhWQ000UDEwSW50cmFDaHJvbWFQcmVkTW9kZSBwcmVkTW9kZSwKLSAgICBPTVhfUzMyIGF2YWlsYWJpbGl0eQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYSAgICg2LjMuMy4yLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBxdWFydGVyLXBpeGVsIGludGVycG9sYXRpb24gZm9yIGludGVyIGx1bWEgTUIuIEl0IGlzIGFzc3VtZWQgdGhhdCAKLSAqIHRoZSBmcmFtZSBpcyBhbHJlYWR5IHBhZGRlZCB3aGVuIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIHNvdXJjZSByZWZlcmVuY2UgZnJhbWUgYnVmZmVyIAotICogICBzcmNTdGVwIC0gcmVmZXJlbmNlIGZyYW1lIHN0ZXAsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2Ygcm9pLndpZHRoIAotICogICBkc3RTdGVwIC0gZGVzdGluYXRpb24gZnJhbWUgc3RlcCwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAKLSAqICAgICAgICAgICAgcm9pLndpZHRoIAotICogICBkeCAtIEZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50IGluIDEvNCBwaXhlbCAKLSAqICAgICAgICAgICAgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDNdIAotICogICBkeSAtIEZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIHkgY29tcG9uZW50IGluIDEvNCBwaXhlbCAKLSAqICAgICAgICAgICAgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDNdIAotICogICByb2kgLSBEaW1lbnNpb24gb2YgdGhlIGludGVycG9sYXRpb24gcmVnaW9uOyB0aGUgcGFyYW1ldGVycyByb2kud2lkdGggYW5kIAotICogICAgICAgICAgICByb2kuaGVpZ2h0IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGZyYW1lIGJ1ZmZlcjogCi0gKiAgICAgICAgICBpZiByb2kud2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAotICogICAgICAgICAgaWYgcm9pLndpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKLSAqICAgICAgICAgIGlmIHJvaS53aWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCi0gKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAotICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKLSAqICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKLSAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCA8IHJvaS53aWR0aC4gCi0gKiAgICBkeCBvciBkeSBpcyBvdXQgb2YgcmFuZ2UgWzAsM10uIAotICogICAgcm9pLndpZHRoIG9yIHJvaS5oZWlnaHQgaXMgb3V0IG9mIHJhbmdlIHs0LCA4LCAxNn0uIAotICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDQsIGJ1dCBwRHN0IGlzIG5vdCA0IGJ5dGUgYWxpZ25lZC4gCi0gKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gOCBvciAxNiwgYnV0IHBEc3QgaXMgbm90IDggYnl0ZSBhbGlnbmVkLiAKLSAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYSAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIE9NWF9TMzIgc3JjU3RlcCwKLSAgICBPTVhfVTggKnBEc3QsCi0gICAgT01YX1MzMiBkc3RTdGVwLAotICAgIE9NWF9TMzIgZHgsCi0gICAgT01YX1MzMiBkeSwKLSAgICBPTVhTaXplIHJvaQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hICAgKDYuMy4zLjIuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIDEvOC1waXhlbCBpbnRlcnBvbGF0aW9uIGZvciBpbnRlciBjaHJvbWEgTUIuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLVBvaW50ZXIgdG8gdGhlIHNvdXJjZSByZWZlcmVuY2UgZnJhbWUgYnVmZmVyIAotICogICBzcmNTdGVwIC1SZWZlcmVuY2UgZnJhbWUgc3RlcCBpbiBieXRlcyAKLSAqICAgZHN0U3RlcCAtRGVzdGluYXRpb24gZnJhbWUgc3RlcCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIAotICogICAgICAgICAgICByb2kud2lkdGguIAotICogICBkeCAtRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvciBjb21wb25lbnQgaW4gMS84IHBpeGVsIAotICogICAgICAgICAgICB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10gCi0gKiAgIGR5IC1GcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciBjb21wb25lbnQgaW4gMS84IHBpeGVsIAotICogICAgICAgICAgICB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10gCi0gKiAgIHJvaSAtRGltZW5zaW9uIG9mIHRoZSBpbnRlcnBvbGF0aW9uIHJlZ2lvbjsgdGhlIHBhcmFtZXRlcnMgcm9pLndpZHRoIGFuZCAKLSAqICAgICAgICAgICAgcm9pLmhlaWdodCBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciAyLCA0LCBvciA4LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gZnJhbWUgYnVmZmVyOgotICogICAgICAgICBpZiByb2kud2lkdGg9PTIsICAyLWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAotICogICAgICAgICBpZiByb2kud2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAotICogICAgICAgICBpZiByb2kud2lkdGg9PTgsIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKLSAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCi0gKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAotICogICAgcFNyYyBvciBwRHN0IGlzIE5VTEwuIAotICogICAgc3JjU3RlcCBvciBkc3RTdGVwIDwgOC4gCi0gKiAgICBkeCBvciBkeSBpcyBvdXQgb2YgcmFuZ2UgWzAtN10uIAotICogICAgcm9pLndpZHRoIG9yIHJvaS5oZWlnaHQgaXMgb3V0IG9mIHJhbmdlIHsyLDQsOH0uIAotICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDIsIGJ1dCBwRHN0IGlzIG5vdCAyLWJ5dGUgYWxpZ25lZC4gCi0gKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gNCwgYnV0IHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byA4LCBidXQgcERzdCBpcyBub3QgOCBieXRlIGFsaWduZWQuIAotICogICAgc3JjU3RlcCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBPTVhfUzMyIHNyY1N0ZXAsCi0gICAgT01YX1U4ICpwRHN0LAotICAgIE9NWF9TMzIgZHN0U3RlcCwKLSAgICBPTVhfUzMyIGR4LAotICAgIE9NWF9TMzIgZHksCi0gICAgT01YU2l6ZSByb2kKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kgICAoNi4zLjMuMy4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgb24gZm91ciB2ZXJ0aWNhbCBlZGdlcyBvZiB0aGUgbHVtYSAKLSAqIG1hY3JvYmxvY2sgKDE2eDE2KS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgc3JjZHN0U3RlcCAtU3RlcCBvZiB0aGUgYXJyYXlzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBwQWxwaGEgLUFycmF5IG9mIHNpemUgMiBvZiBhbHBoYSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyB0aGUgYWxwaGEgCi0gKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCi0gKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyAKLSAqICAgICAgICAgICAgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgIHBCZXRhIC1BcnJheSBvZiBzaXplIDIgb2YgYmV0YSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyB0aGUgYmV0YSAKLSAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyAKLSAqICAgICAgICAgICAgZm9yIHRoZSBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlKTsgcGVyIFtJU08xNDQ5Ni0xMF0gYmV0YSB2YWx1ZXMgCi0gKiAgICAgICAgICAgIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgIHBUaHJlc2hvbGRzIC1BcnJheSBvZiBzaXplIDE2IG9mIFRocmVzaG9sZHMgKFRDMCkgKHZhbHVlcyBmb3IgdGhlIGxlZnQgCi0gKiAgICAgICAgICAgIGVkZ2Ugb2YgZWFjaCA0eDQgYmxvY2ssIGFycmFuZ2VkIGluIHZlcnRpY2FsIGJsb2NrIG9yZGVyKTsgbXVzdCAKLSAqICAgICAgICAgICAgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4uICBQZXIgW0lTTzE0NDk2LTEwXSB2YWx1ZXMgbXVzdCAKLSAqICAgICAgICAgICAgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgIHBCUyAtQXJyYXkgb2Ygc2l6ZSAxNiBvZiBCUyBwYXJhbWV0ZXJzIChhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayAKLSAqICAgICAgICAgICAgb3JkZXIpOyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSAKLSAqICAgICAgICAgICAgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IDQuICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtUG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKLSAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCi0gKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAotICogICAgRWl0aGVyIG9mIHRoZSBwb2ludGVycyBpbiBwU3JjRHN0LCBwQWxwaGEsIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTIAotICogICAgICAgICAgICAgIGlzIE5VTEwuIAotICogICAgRWl0aGVyIHBUaHJlc2hvbGRzIG9yIHBCUyBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCi0gKiAgICBwU3JjRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAotICogICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgICBwQWxwaGFbMF0gYW5kL29yIHBBbHBoYVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgIHBCZXRhWzBdIGFuZC9vciBwQmV0YVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwxOF0uIAotICogICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uMTVdaXMgb3V0c2lkZSBvZiB0aGUgCi0gKiAgICAgICAgICAgICAgcmFuZ2UgWzAsMjVdLiAKLSAqICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIChwQlNbaV09PTQgJiYgCi0gKiAgICAgICAgICAgICAgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSAoCi0gICAgT01YX1U4ICpwU3JjRHN0LAotICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBBbHBoYSwKLSAgICBjb25zdCBPTVhfVTggKnBCZXRhLAotICAgIGNvbnN0IE9NWF9VOCAqcFRocmVzaG9sZHMsCi0gICAgY29uc3QgT01YX1U4ICpwQlMKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kgICAoNi4zLjMuMy4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgb24gZm91ciBob3Jpem9udGFsIGVkZ2VzIG9mIHRoZSBsdW1hIAotICogbWFjcm9ibG9jayAoMTZ4MTYpLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAotICogICBzcmNkc3RTdGVwIC0gc3RlcCBvZiB0aGUgYXJyYXlzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBwQWxwaGEgLSBhcnJheSBvZiBzaXplIDIgb2YgYWxwaGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGFscGhhIAotICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIAotICogICAgICAgICAgICBmb3IgdGhlIGludGVybmFsIGhvcml6b250YWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGFscGhhIAotICogICAgICAgICAgICB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgIHBCZXRhIC0gYXJyYXkgb2Ygc2l6ZSAyIG9mIGJldGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGJldGEgCi0gKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSAKLSAqICAgICAgICAgICAgaXMgZm9yIHRoZSBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UpLiBQZXIgW0lTTzE0NDk2LTEwXSBiZXRhIAotICogICAgICAgICAgICB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgcFRocmVzaG9sZHMgLSBhcnJheSBvZiBzaXplIDE2IGNvbnRhaW5pbmcgdGhyZXNob2xkcywgVEMwLCBmb3IgdGhlIHRvcCAKLSAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlIG9mIGVhY2ggNHg0IGJsb2NrLCBhcnJhbmdlZCBpbiBob3Jpem9udGFsIGJsb2NrIAotICogICAgICAgICAgICBvcmRlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgUGVyIFtJU08xNDQ5NiAxMF0gCi0gKiAgICAgICAgICAgIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAotICogICBwQlMgLSBhcnJheSBvZiBzaXplIDE2IG9mIEJTIHBhcmFtZXRlcnMgKGFycmFuZ2VkIGluIGhvcml6b250YWwgYmxvY2sgCi0gKiAgICAgICAgICAgIG9yZGVyKTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgCi0gKiAgICAgICAgICAgIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSA0LiAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqIAotICogICAgT01YX1N0c19CYWRBcmdFcnIsIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCwgcEFscGhhLCAKLSAqICAgICAgICAgICAgICBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUy4gCi0gKiAgICAtICAgIGVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAotICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgIC0gICAgcEFscGhhWzBdIGFuZC9vciBwQWxwaGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgICAtICAgIHBCZXRhWzBdIGFuZC9vciBwQmV0YVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwxOF0uIAotICogICAgLSAgICBPbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi4xNV0gaXMgCi0gKiAgICAgICAgIG91dHNpZGUgb2YgdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAotICogICAgICAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSAoCi0gICAgT01YX1U4ICpwU3JjRHN0LAotICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBBbHBoYSwKLSAgICBjb25zdCBPTVhfVTggKnBCZXRhLAotICAgIGNvbnN0IE9NWF9VOCAqcFRocmVzaG9sZHMsCi0gICAgY29uc3QgT01YX1U4ICpwQlMKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSAgICg2LjMuMy4zLjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyBvbiBmb3VyIHZlcnRpY2FsIGVkZ2VzIG9mIHRoZSBjaHJvbWEgCi0gKiBtYWNyb2Jsb2NrICg4eDgpLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgIHNyY2RzdFN0ZXAgLSBTdGVwIG9mIHRoZSBhcnJheXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgcEFscGhhIC0gQXJyYXkgb2Ygc2l6ZSAyIG9mIGFscGhhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIGFscGhhIAotICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgZm9yIAotICogICAgICAgICAgICBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlKTsgcGVyIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgCi0gKiAgICAgICAgICAgIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgcEJldGEgLSBBcnJheSBvZiBzaXplIDIgb2YgYmV0YSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyB0aGUgYmV0YSAKLSAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyAKLSAqICAgICAgICAgICAgZm9yIHRoZSBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlKTsgcGVyIFtJU08xNDQ5Ni0xMF0gYmV0YSB2YWx1ZXMgCi0gKiAgICAgICAgICAgIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgIHBUaHJlc2hvbGRzIC0gQXJyYXkgb2Ygc2l6ZSA4IGNvbnRhaW5pbmcgdGhyZXNob2xkcywgVEMwLCBmb3IgdGhlIGxlZnQgCi0gKiAgICAgICAgICAgIHZlcnRpY2FsIGVkZ2Ugb2YgZWFjaCA0eDIgY2hyb21hIGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCAKLSAqICAgICAgICAgICAgYmxvY2sgb3JkZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFBlciAKLSAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgcEJTIC0gQXJyYXkgb2Ygc2l6ZSAxNiBvZiBCUyBwYXJhbWV0ZXJzICh2YWx1ZXMgZm9yIGVhY2ggMngyIGNocm9tYSAKLSAqICAgICAgICAgICAgYmxvY2ssIGFycmFuZ2VkIGluIHZlcnRpY2FsIGJsb2NrIG9yZGVyKS4gVGhpcyBwYXJhbWV0ZXIgaXMgdGhlIAotICogICAgICAgICAgICBzYW1lIGFzIHRoZSBwQlMgcGFyYW1ldGVyIHBhc3NlZCBpbnRvIEZpbHRlckRlYmxvY2tMdW1hX1ZlckVkZ2U7IAotICogICAgICAgICAgICB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgCi0gKiAgICAgICAgICAgIHBCU1tpXT09IDQgbWF5IG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCAKLSAqICAgICAgICAgICAgb25seSBpZiBwQlNbaV4zXT09IDQuICBNdXN0IGJlIDQgYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtUG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCwgcEFscGhhLCAKLSAqICAgICAgICAgICAgICBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUy4gCi0gKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICAgcFRocmVzaG9sZHMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgcEFscGhhWzBdIGFuZC9vciBwQWxwaGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgICAtICAgIHBCZXRhWzBdIGFuZC9vciBwQmV0YVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwxOF0uIAotICogICAgLSAgICBPbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi43XSBpcyBvdXRzaWRlIAotICogICAgICAgICBvZiB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgIC0gICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAotICogICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCi0gKiAgICAtICAgIHBCUyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kgKAotICAgIE9NWF9VOCAqcFNyY0RzdCwKLSAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCi0gICAgY29uc3QgT01YX1U4ICpwQmV0YSwKLSAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAotICAgIGNvbnN0IE9NWF9VOCAqcEJTCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0kgICAoNi4zLjMuMy40KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgb24gdGhlIGhvcml6b250YWwgZWRnZXMgb2YgdGhlIGNocm9tYSAKLSAqIG1hY3JvYmxvY2sgKDh4OCkuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgc3JjZHN0U3RlcCAtIGFycmF5IHN0ZXA7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgcEFscGhhIC0gYXJyYXkgb2Ygc2l6ZSAyIGNvbnRhaW5pbmcgYWxwaGEgdGhyZXNob2xkczsgdGhlIGZpcnN0IGVsZW1lbnQgCi0gKiAgICAgICAgICAgIGNvbnRhaW5zIHRoZSB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGFuZCB0aGUgCi0gKiAgICAgICAgICAgIHNlY29uZCBlbGVtZW50IGNvbnRhaW5zIHRoZSB0aHJlc2hvbGQgZm9yIGludGVybmFsIGhvcml6b250YWwgCi0gKiAgICAgICAgICAgIGVkZ2UuICBQZXIgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgCi0gKiAgICAgICAgICAgIFswLDI1NV0uIAotICogICBwQmV0YSAtIGFycmF5IG9mIHNpemUgMiBjb250YWluaW5nIGJldGEgdGhyZXNob2xkczsgdGhlIGZpcnN0IGVsZW1lbnQgCi0gKiAgICAgICAgICAgIGNvbnRhaW5zIHRoZSB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGFuZCB0aGUgCi0gKiAgICAgICAgICAgIHNlY29uZCBlbGVtZW50IGNvbnRhaW5zIHRoZSB0aHJlc2hvbGQgZm9yIHRoZSBpbnRlcm5hbCAKLSAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlLiAgUGVyIFtJU08xNDQ5Ni0xMF0gYmV0YSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJhbmdlIFswLDE4XS4gCi0gKiAgIHBUaHJlc2hvbGRzIC0gYXJyYXkgb2Ygc2l6ZSA4IGNvbnRhaW5pbmcgdGhyZXNob2xkcywgVEMwLCBmb3IgdGhlIHRvcCAKLSAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlIG9mIGVhY2ggMng0IGNocm9tYSBibG9jaywgYXJyYW5nZWQgaW4gaG9yaXpvbnRhbCAKLSAqICAgICAgICAgICAgYmxvY2sgb3JkZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFBlciAKLSAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgcEJTIC0gYXJyYXkgb2Ygc2l6ZSAxNiBjb250YWluaW5nIEJTIHBhcmFtZXRlcnMgZm9yIGVhY2ggMngyIGNocm9tYSAKLSAqICAgICAgICAgICAgYmxvY2ssIGFycmFuZ2VkIGluIGhvcml6b250YWwgYmxvY2sgb3JkZXI7IHZhbGlkIGluIHRoZSByYW5nZSAKLSAqICAgICAgICAgICAgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgb2NjdXIgCi0gKiAgICAgICAgICAgIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gNC4gCi0gKiAgICAgICAgICAgIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC1Qb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyLCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBhbnkgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyY0RzdCwgcEFscGhhLCBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUy4gCi0gKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICAgcFRocmVzaG9sZHMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgcEFscGhhWzBdIGFuZC9vciBwQWxwaGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgICAtICAgIHBCZXRhWzBdIGFuZC9vciBwQmV0YVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwxOF0uIAotICogICAgLSAgICBPbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi43XSBpcyBvdXRzaWRlIAotICogICAgICAgICBvZiB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgIC0gICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgCi0gKiAgICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuCi0gKiAgICAtICAgIHBCUyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0kgKAotICAgIE9NWF9VOCAqcFNyY0RzdCwKLSAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCi0gICAgY29uc3QgT01YX1U4ICpwQmV0YSwKLSAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAotICAgIGNvbnN0IE9NWF9VOCAqcEJTCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSSAgICg2LjMuMy4zLjUpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIHRoZSBob3Jpem9udGFsIGFuZCAKLSAqIHZlcnRpY2FsIGVkZ2VzIG9mIGEgbHVtYSBtYWNyb2Jsb2NrICgxNngxNikuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgIHNyY2RzdFN0ZXAgLSBpbWFnZSB3aWR0aDsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgcEFscGhhIC0gcG9pbnRlciB0byBhIDJ4MiB0YWJsZSBvZiBhbHBoYSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgCi0gKiAgICAgICAgICAgIGZvbGxvd3M6IHtleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCAKLSAqICAgICAgICAgICAgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciAKLSAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgIHBCZXRhIC0gcG9pbnRlciB0byBhIDJ4MiB0YWJsZSBvZiBiZXRhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiAKLSAqICAgICAgICAgICAge2V4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsIAotICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9LiAgUGVyIFtJU08xNDQ5Ni0xMF0gCi0gKiAgICAgICAgICAgIGJldGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgIHBUaHJlc2hvbGRzIC0gcG9pbnRlciB0byBhIDE2eDIgdGFibGUgb2YgdGhyZXNob2xkIChUQzApLCBvcmdhbml6ZWQgYXMgCi0gKiAgICAgICAgICAgIGZvbGxvd3M6IHt2YWx1ZXMgZm9yIHRoZSBsZWZ0IG9yIGFib3ZlIGVkZ2Ugb2YgZWFjaCA0eDQgYmxvY2ssIAotICogICAgICAgICAgICBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayBvcmRlciBhbmQgdGhlbiBpbiBob3Jpem9udGFsIGJsb2NrIAotICogICAgICAgICAgICBvcmRlcn07IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFBlciBbSVNPMTQ0OTYtMTBdIAotICogICAgICAgICAgICB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgcEJTIC0gcG9pbnRlciB0byBhIDE2eDIgdGFibGUgb2YgQlMgcGFyYW1ldGVycyBhcnJhbmdlZCBpbiBzY2FuIGJsb2NrIAotICogICAgICAgICAgICBvcmRlciBmb3IgdmVydGljYWwgZWRnZXMgYW5kIHRoZW4gaG9yaXpvbnRhbCBlZGdlczsgdmFsaWQgaW4gdGhlIAotICogICAgICAgICAgICByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSAKLSAqICAgICAgICAgICAgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSAKLSAqICAgICAgICAgICAgNC4gTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyAKLSAqICAgIC0gICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCwgcEFscGhhLCAKLSAqICAgICAgICAgICAgICBwQmV0YSwgcFRocmVzaG9sZHMgb3IgcEJTLiAKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgZWl0aGVyIHBUaHJlc2hvbGRzIG9yIHBCUyBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCi0gKiAgICAtICAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBBbHBoYVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKLSAqICAgICAgICAgICAgICBbMCwyNTVdLiAKLSAqICAgIC0gICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcEJldGFbMC4uM10gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgCi0gKiAgICAgICAgICAgICAgWzAsMThdLiAKLSAqICAgIC0gICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uMzFdaXMgb3V0c2lkZSBvZiAKLSAqICAgICAgICAgICAgICB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgIC0gICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgCi0gKiAgICAgICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCi0gKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSSAoCi0gICAgT01YX1U4ICpwU3JjRHN0LAotICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBBbHBoYSwKLSAgICBjb25zdCBPTVhfVTggKnBCZXRhLAotICAgIGNvbnN0IE9NWF9VOCAqcFRocmVzaG9sZHMsCi0gICAgY29uc3QgT01YX1U4ICpwQlMKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kgICAoNi4zLjMuMy42KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9ja2luZyBmaWx0ZXJpbmcgb24gYWxsIGVkZ2VzIG9mIHRoZSBjaHJvbWEgCi0gKiBtYWNyb2Jsb2NrICgxNngxNikuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgc3JjZHN0U3RlcCAtIHN0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBwQWxwaGEgLSBwb2ludGVyIHRvIGEgMngyIGFycmF5IG9mIGFscGhhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyAKLSAqICAgICAgICAgICAgZm9sbG93czoge2V4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIAotICogICAgICAgICAgICBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9LiAgUGVyIAotICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgcEJldGEgLSBwb2ludGVyIHRvIGEgMngyIGFycmF5IG9mIEJldGEgVGhyZXNob2xkcywgb3JnYW5pemVkIGFzIGZvbGxvd3M6IAotICogICAgICAgICAgICB7IGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsIAotICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9LiAgUGVyIFtJU08xNDQ5Ni0xMF0gCi0gKiAgICAgICAgICAgIGJldGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgIHBUaHJlc2hvbGRzIC0gYXJyYXkgb2Ygc2l6ZSA4eDIgb2YgVGhyZXNob2xkcyAoVEMwKSAodmFsdWVzIGZvciB0aGUgbGVmdCAKLSAqICAgICAgICAgICAgb3IgYWJvdmUgZWRnZSBvZiBlYWNoIDR4MiBvciAyeDQgYmxvY2ssIGFycmFuZ2VkIGluIHZlcnRpY2FsIAotICogICAgICAgICAgICBibG9jayBvcmRlciBhbmQgdGhlbiBpbiBob3Jpem9udGFsIGJsb2NrIG9yZGVyKTsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gUGVyIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgYmUgaW4gdGhlIAotICogICAgICAgICAgICByYW5nZSBbMCwyNV0uIAotICogICBwQlMgLSBhcnJheSBvZiBzaXplIDE2eDIgb2YgQlMgcGFyYW1ldGVycyAoYXJyYW5nZWQgaW4gc2NhbiBibG9jayBvcmRlciAKLSAqICAgICAgICAgICAgZm9yIHZlcnRpY2FsIGVkZ2VzIGFuZCB0aGVuIGhvcml6b250YWwgZWRnZXMpOyB2YWxpZCBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IAotICogICAgICAgICAgICBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IAotICogICAgICAgICAgICA0LiAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCi0gKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAotICogICAgLSAgIHBTcmNEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICBlaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcEFscGhhWzAuLjNdIGlzIG91dHNpZGUgdGhlIHJhbmdlIAotICogICAgICAgICAgICAgIFswLDI1NV0uIAotICogICAgLSAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBCZXRhWzAuLjNdIGlzIG91dHNpZGUgdGhlIHJhbmdlIAotICogICAgICAgICAgICAgIFswLDE4XS4gCi0gKiAgICAtICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uMTVdaXMgb3V0c2lkZSBvZiAKLSAqICAgICAgICAgICAgICB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgIC0gICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCAgZm9yIGk+PTQsIG9yIAotICogICAgICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCi0gKiAgICAtICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSSAoCi0gICAgT01YX1U4ICpwU3JjRHN0LAotICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBBbHBoYSwKLSAgICBjb25zdCBPTVhfVTggKnBCZXRhLAotICAgIGNvbnN0IE9NWF9VOCAqcFRocmVzaG9sZHMsCi0gICAgY29uc3QgT01YX1U4ICpwQlMKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDICAgKDYuMy40LjEuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIENBVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHJhc3RlciBzY2FuIGZvciBhIDJ4MiBibG9jayBvZiAKLSAqIENocm9tYURDTGV2ZWwuICBUaGUgZGVjb2RlZCBjb2VmZmljaWVudHMgaW4gdGhlIHBhY2tlZCBwb3NpdGlvbi1jb2VmZmljaWVudCAKLSAqIGJ1ZmZlciBhcmUgc3RvcmVkIGluIHJldmVyc2UgemlnLXphZyBvcmRlciwgaS5lLiwgdGhlIGZpcnN0IGJ1ZmZlciBlbGVtZW50IAotICogY29udGFpbnMgdGhlIGxhc3Qgbm9uLXplcm8gcG9zdGlvbi1jb2VmZmljaWVudCBwYWlyIG9mIHRoZSBibG9jay4gV2l0aGluIAotICogZWFjaCBwb3NpdGlvbi1jb2VmZmljaWVudCBwYWlyLCB0aGUgcG9zaXRpb24gZW50cnkgaW5kaWNhdGVzIHRoZSAKLSAqIHJhc3Rlci1zY2FuIHBvc2l0aW9uIG9mIHRoZSBjb2VmZmljaWVudCwgd2hpbGUgdGhlIGNvZWZmaWNpZW50IGVudHJ5IAotICogY29udGFpbnMgdGhlIGNvZWZmaWNpZW50IHZhbHVlLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIERvdWJsZSBwb2ludGVyIHRvIGN1cnJlbnQgYnl0ZSBpbiBiaXQgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcE9mZnNldCAtIFBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtOyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZCAKLSAqICAgcE9mZnNldCAtICpwT2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkIAotICogICBwTnVtQ29lZmYgLSBQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMgaW4gdGhpcyBibG9jayAKLSAqICAgcHBQb3NDb2VmQnVmIC0gRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwgCi0gKiAgICAgICAgICAgIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyLiAgQnVmZmVyIHBvc2l0aW9uIAotICogICAgICAgICAgICAoKnBwUG9zQ29lZkJ1ZikgaXMgdXBkYXRlZCB1cG9uIHJldHVybiwgdW5sZXNzIHRoZXJlIGFyZSBvbmx5IAotICogICAgICAgICAgICB6ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGUgY3VycmVudGx5IGRlY29kZWQgYmxvY2suICBJbiB0aGlzIGNhc2UgCi0gKiAgICAgICAgICAgIHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gYnlwYXNzIHRoZSB0cmFuc2Zvcm0vZGVxdWFudGl6YXRpb24gb2YgCi0gKiAgICAgICAgICAgIHRoZSBlbXB0eSBibG9ja3MuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqCi0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIHBwQml0U3RyZWFtIG9yIHBPZmZzZXQgaXMgTlVMTC4gCi0gKiAgICAtICAgIHBwUG9zQ29lZkJ1ZiBvciBwTnVtQ29lZmYgaXMgTlVMTC4gCi0gKiAgICBPTVhfU3RzX0VyciAtIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAotICogICAgLSAgICBhbiBpbGxlZ2FsIGNvZGUgaXMgZW5jb3VudGVyZWQgaW4gdGhlIGJpdHN0cmVhbSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMgKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9TMzIqcE9mZnNldCwKLSAgICBPTVhfVTggKnBOdW1Db2VmZiwKLSAgICBPTVhfVTggKipwcFBvc0NvZWZidWYKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQyAgICg2LjMuNC4xLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBDQVZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3IgNHg0IGJsb2NrIG9mIAotICogSW50cmExNngxNkRDTGV2ZWwsIEludHJhMTZ4MTZBQ0xldmVsLCBMdW1hTGV2ZWwsIGFuZCBDaHJvbWFBQ0xldmVsLiBJbnZlcnNlIAotICogZmllbGQgc2NhbiBpcyBub3Qgc3VwcG9ydGVkLiBUaGUgZGVjb2RlZCBjb2VmZmljaWVudHMgaW4gdGhlIHBhY2tlZCAKLSAqIHBvc2l0aW9uLWNvZWZmaWNpZW50IGJ1ZmZlciBhcmUgc3RvcmVkIGluIHJldmVyc2UgemlnLXphZyBvcmRlciwgaS5lLiwgdGhlIAotICogZmlyc3QgYnVmZmVyIGVsZW1lbnQgY29udGFpbnMgdGhlIGxhc3Qgbm9uLXplcm8gcG9zdGlvbi1jb2VmZmljaWVudCBwYWlyIG9mIAotICogdGhlIGJsb2NrLiBXaXRoaW4gZWFjaCBwb3NpdGlvbi1jb2VmZmljaWVudCBwYWlyLCB0aGUgcG9zaXRpb24gZW50cnkgCi0gKiBpbmRpY2F0ZXMgdGhlIHJhc3Rlci1zY2FuIHBvc2l0aW9uIG9mIHRoZSBjb2VmZmljaWVudCwgd2hpbGUgdGhlIAotICogY29lZmZpY2llbnQgZW50cnkgY29udGFpbnMgdGhlIGNvZWZmaWNpZW50IHZhbHVlLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0gYnVmZmVyIAotICogICBwT2Zmc2V0IC0gUG9pbnRlciB0byBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW07IHZhbGlkIGluIHRoZSByYW5nZSBbMCw3XS4gCi0gKiAgIHNNYXhOdW1Db2VmZiAtIE1heGltdW0gdGhlIG51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMgaW4gY3VycmVudCAKLSAqICAgICAgICAgICAgYmxvY2sgCi0gKiAgIHNWTENTZWxlY3QgLSBWTEMgdGFibGUgc2VsZWN0b3IsIG9idGFpbmVkIGZyb20gdGhlIG51bWJlciBvZiBub24temVybyAKLSAqICAgICAgICAgICAgY29lZmZpY2llbnRzIGNvbnRhaW5lZCBpbiB0aGUgYWJvdmUgYW5kIGxlZnQgNHg0IGJsb2Nrcy4gIEl0IGlzIAotICogICAgICAgICAgICBlcXVpdmFsZW50IHRvIHRoZSB2YXJpYWJsZSBuQyBkZXNjcmliZWQgaW4gSC4yNjQgc3RhbmRhcmQgdGFibGUgCi0gKiAgICAgICAgICAgIDkgNSwgZXhjZXB0IGl0cyB2YWx1ZSBjYW4gdCBiZSBsZXNzIHRoYW4gemVyby4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkLiAgCi0gKiAgICAgICAgICAgIEJ1ZmZlciBwb3NpdGlvbiAoKnBwUG9zQ29lZkJ1ZikgaXMgdXBkYXRlZCB1cG9uIHJldHVybiwgdW5sZXNzIAotICogICAgICAgICAgICB0aGVyZSBhcmUgb25seSB6ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGUgY3VycmVudGx5IGRlY29kZWQgYmxvY2suIAotICogICAgICAgICAgICAgSW4gdGhpcyBjYXNlIHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gYnlwYXNzIHRoZSAKLSAqICAgICAgICAgICAgdHJhbnNmb3JtL2RlcXVhbnRpemF0aW9uIG9mIHRoZSBlbXB0eSBibG9ja3MuIAotICogICBwT2Zmc2V0IC0gKnBPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQgCi0gKiAgIHBOdW1Db2VmZiAtIFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGlzIGJsb2NrIAotICogICBwcFBvc0NvZWZCdWYgLSBEb3VibGUgcG9pbnRlciB0byBkZXN0aW5hdGlvbiByZXNpZHVhbCAKLSAqICAgICAgICAgICAgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBwcEJpdFN0cmVhbSBvciBwT2Zmc2V0IGlzIE5VTEwuIAotICogICAgLSAgICBwcFBvc0NvZWZCdWYgb3IgcE51bUNvZWZmIGlzIE5VTEwuIAotICogICAgLSAgICBzTWF4TnVtQ29lZmYgaXMgbm90IGVxdWFsIHRvIGVpdGhlciAxNSBvciAxNi4gCi0gKiAgICAtICAgIHNWTENTZWxlY3QgaXMgbGVzcyB0aGFuIDAuIAotICoKLSAqICAgIE9NWF9TdHNfRXJyIC0gaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGFuIGlsbGVnYWwgY29kZSBpcyBlbmNvdW50ZXJlZCBpbiB0aGUgYml0c3RyZWFtIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMgKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9TMzIgKnBPZmZzZXQsCi0gICAgT01YX1U4ICpwTnVtQ29lZmYsCi0gICAgT01YX1U4ICoqcHBQb3NDb2VmYnVmLAotICAgIE9NWF9JTlQgc1ZMQ1NlbGVjdCwKLSAgICBPTVhfSU5UIHNNYXhOdW1Db2VmZgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpciAgICg2LjMuNC4yLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBSZWNvbnN0cnVjdHMgdGhlIDR4NCBMdW1hREMgYmxvY2sgZnJvbSB0aGUgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciAKLSAqIGJ1ZmZlciwgcGVyZm9ybXMgaW50ZWdlciBpbnZlcnNlLCBhbmQgZGVxdWFudGl6YXRpb24gZm9yIDR4NCBMdW1hREMgCi0gKiBjb2VmZmljaWVudHMsIGFuZCB1cGRhdGVzIHRoZSBwYWlyIGJ1ZmZlciBwb2ludGVyIHRvIHRoZSBuZXh0IG5vbi1lbXB0eSAKLSAqIGJsb2NrLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcFNyYyAtIERvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyIAotICogICAgICAgICAgICBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcgCi0gKiAgIFFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlciBRcFkgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwU3JjIC0gKnBwU3JjIGlzIHVwZGF0ZWQgdG8gdGhlIHN0YXJ0IG9mIG5leHQgbm9uIGVtcHR5IGJsb2NrIAotICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCA0eDQgTHVtYURDIGNvZWZmaWNpZW50cyBidWZmZXI7IG11c3QgCi0gKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIHBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCi0gKiAgICAtICAgIHBEc3QgaXMgbm90IDggYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgUVAgaXMgbm90IGluIHRoZSByYW5nZSBvZiBbMC01MV0uIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyICgKLSAgICBjb25zdCBPTVhfVTggKipwcFNyYywKLSAgICBPTVhfUzE2ICpwRHN0LAotICAgIE9NWF9JTlQgUVAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpciAgICg2LjMuNC4yLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBSZWNvbnN0cnVjdCB0aGUgMngyIENocm9tYURDIGJsb2NrIGZyb20gY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIsIAotICogcGVyZm9ybSBpbnRlZ2VyIGludmVyc2UgdHJhbnNmb3JtYXRpb24sIGFuZCBkZXF1YW50aXphdGlvbiBmb3IgMngyIGNocm9tYSAKLSAqIERDIGNvZWZmaWNpZW50cywgYW5kIHVwZGF0ZSB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byBuZXh0IG5vbi1lbXB0eSAKLSAqIGJsb2NrLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcFNyYyAtIERvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyIAotICogICAgICAgICAgICBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcgCi0gKiAgIFFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlciBRcEMgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwU3JjIC0gKnBwU3JjIGlzIHVwZGF0ZWQgdG8gdGhlIHN0YXJ0IG9mIG5leHQgbm9uIGVtcHR5IGJsb2NrIAotICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCAyeDIgQ2hyb21hREMgY29lZmZpY2llbnRzIGJ1ZmZlcjsgCi0gKiAgICAgICAgICAgIG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgcHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKLSAqICAgIC0gICAgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBRUCBpcyBub3QgaW4gdGhlIHJhbmdlIG9mIFswLTUxXS4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpciAoCi0gICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCi0gICAgT01YX1MxNiAqcERzdCwKLSAgICBPTVhfSU5UIFFQCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQgICAoNi4zLjQuMi4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUmVjb25zdHJ1Y3QgdGhlIDR4NCByZXNpZHVhbCBibG9jayBmcm9tIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyLCAKLSAqIHBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludGVnZXIgaW52ZXJzZSB0cmFuc2Zvcm1hdGlvbiBmb3IgNHg0IGJsb2NrIG9mIAotICogcmVzaWR1YWxzIHdpdGggcHJldmlvdXMgaW50cmEgcHJlZGljdGlvbiBvciBtb3Rpb24gY29tcGVuc2F0aW9uIGRhdGEsIGFuZCAKLSAqIHVwZGF0ZSB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byBuZXh0IG5vbi1lbXB0eSBibG9jay4gSWYgcERDID09IE5VTEwsIAotICogdGhlcmUgcmUgMTYgbm9uLXplcm8gQUMgY29lZmZpY2llbnRzIGF0IG1vc3QgaW4gdGhlIHBhY2tlZCBidWZmZXIgc3RhcnRpbmcgCi0gKiBmcm9tIDR4NCBibG9jayBwb3NpdGlvbiAwOyBJZiBwREMgIT0gTlVMTCwgdGhlcmUgcmUgMTUgbm9uLXplcm8gQUMgCi0gKiBjb2VmZmljaWVudHMgYXQgbW9zdCBpbiB0aGUgcGFja2V0IGJ1ZmZlciBzdGFydGluZyBmcm9tIDR4NCBibG9jayBwb3NpdGlvbiAKLSAqIDEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwU3JjIC0gRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIgCi0gKiAgICAgICAgICAgIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZyAKLSAqICAgcFByZWQgLSBQb2ludGVyIHRvIHRoZSBwcmVkaWN0ZWQgNHg0IGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5IAotICogICBwcmVkU3RlcCAtIFByZWRpY3RlZCBmcmFtZSBzdGVwIHNpemUgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IAotICogICBkc3RTdGVwIC0gRGVzdGluYXRpb24gZnJhbWUgc3RlcCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgCi0gKiAgIHBEQyAtIFBvaW50ZXIgdG8gdGhlIERDIGNvZWZmaWNpZW50IG9mIHRoaXMgYmxvY2ssIE5VTEwgaWYgaXQgZG9lc24ndCAKLSAqICAgICAgICAgICAgZXhpc3QgCi0gKiAgIFFQIC0gUVAgUXVhbnRpemF0aW9uIHBhcmFtZXRlci4gIEl0IHNob3VsZCBiZSBRcEMgaW4gY2hyb21hIDR4NCBibG9jayAKLSAqICAgICAgICAgICAgZGVjb2RpbmcsIG90aGVyd2lzZSBpdCBzaG91bGQgYmUgUXBZLiAKLSAqICAgQUMgLSBGbGFnIGluZGljYXRpbmcgaWYgYXQgbGVhc3Qgb25lIG5vbi16ZXJvIEFDIGNvZWZmaWNpZW50IGV4aXN0cyAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgNHg0IGJsb2NrIGRhdGE7IG11c3QgYmUgYWxpZ25lZCBvbiBhIAotICogICAgICAgICAgICA0LWJ5dGUgYm91bmRhcnkgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgcFByZWQgb3IgcERzdCBpcyBOVUxMLiAKLSAqICAgIC0gICAgcFByZWQgb3IgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBwcmVkU3RlcCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIAotICogICAgLSAgICBBQyAhPTAgYW5kIFFwIGlzIG5vdCBpbiB0aGUgcmFuZ2Ugb2YgWzAtNTFdIG9yIHBwU3JjID09IE5VTEwuIAotICogICAgLSAgICBBQyA9PTAgJiYgcERDID09TlVMTC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCAoCi0gICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCi0gICAgY29uc3QgT01YX1U4ICpwUHJlZCwKLSAgICBjb25zdCBPTVhfUzE2ICpwREMsCi0gICAgT01YX1U4ICpwRHN0LAotICAgIE9NWF9JTlQgcHJlZFN0ZXAsCi0gICAgT01YX0lOVCBkc3RTdGVwLAotICAgIE9NWF9JTlQgUVAsCi0gICAgT01YX0lOVCBBQwotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX01FR2V0QnVmU2l6ZSAgICg2LjMuNS4xLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb21wdXRlcyB0aGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3BlY2lmaWNhdGlvbiAKLSAqIHN0cnVjdHVyZSBmb3IgdGhlIG9teFZDTTRQMTAgbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zIEJsb2NrTWF0Y2hfSW50ZWdlciAKLSAqIGFuZCBNb3Rpb25Fc3RpbWF0aW9uTUIuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCi0gKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDEwTUVNb2RlIAotICogICBwTUVQYXJhbXMgLW1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTaXplIC0gcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgbW90aW9uIAotICogICAgICAgICAgICBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIHBNRVBhcmFtcyBvciBwU2l6ZSBpcyBOVUxMLiAKLSAqICAgIC0gICAgYW4gaW52YWxpZCBNRU1vZGUgaXMgc3BlY2lmaWVkLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX01FR2V0QnVmU2l6ZSAoCi0gICAgT01YVkNNNFAxME1FTW9kZSBNRW1vZGUsCi0gICAgY29uc3QgT01YVkNNNFAxME1FUGFyYW1zICpwTUVQYXJhbXMsCi0gICAgT01YX1UzMiAqcFNpemUKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9NRUluaXQgICAoNi4zLjUuMS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogSW5pdGlhbGl6ZXMgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSByZXF1aXJlZCBmb3IgdGhlIAotICogb214VkNNNFAxMCBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnM6ICBCbG9ja01hdGNoX0ludGVnZXIgYW5kIAotICogTW90aW9uRXN0aW1hdGlvbk1CLiBNZW1vcnkgZm9yIHRoZSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAqcE1FU3BlYyBtdXN0IGJlIAotICogYWxsb2NhdGVkIHByaW9yIHRvIGNhbGxpbmcgdGhlIGZ1bmN0aW9uLCBhbmQgc2hvdWxkIGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCi0gKiBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSBjYW4gCi0gKiBiZSBkZXRlcm1pbmVkIHVzaW5nIHRoZSBmdW5jdGlvbiBvbXhWQ000UDEwX01FR2V0QnVmU2l6ZS4gRm9sbG93aW5nIAotICogaW5pdGlhbGl6YXRpb24gYnkgdGhpcyBmdW5jdGlvbiwgdGhlIHZlbmRvci1zcGVjaWZpYyBzdHJ1Y3R1cmUgKnBNRVNwZWMgCi0gKiBzaG91bGQgY29udGFpbiBhbiBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyByZXByZXNlbnRhdGlvbiBvZiBhbGwgbW90aW9uIAotICogZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIHJlY2VpdmVkIHZpYSB0aGUgc3RydWN0dXJlIHBNRVBhcmFtcywgZm9yIGV4YW1wbGUgIAotICogc2VhcmNoUmFuZ2UxNngxNiwgc2VhcmNoUmFuZ2U4eDgsIGV0Yy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgTUVtb2RlIC0gbW90aW9uIGVzdGltYXRpb24gbW9kZTsgYXZhaWxhYmxlIG1vZGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSAKLSAqICAgICAgICAgICAgZW51bWVyYXRlZCB0eXBlIE9NWFZDTTRQMTBNRU1vZGUgCi0gKiAgIHBNRVBhcmFtcyAtIG1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCi0gKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSB1bmluaXRpYWxpemVkIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgcE1FUGFyYW1zIG9yIHBTaXplIGlzIE5VTEwuIAotICogICAgLSAgICBhbiBpbnZhbGlkIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSBwYXJhbWV0ZXIgTUVtb2RlIAotICogICAgLSAgICBhIG5lZ2F0aXZlIG9yIHplcm8gdmFsdWUgd2FzIHNwZWNpZmllZCBmb3Igb25lIG9mIHRoZSBzZWFyY2ggcmFuZ2VzIAotICogICAgICAgICAoZS5nLiwgIHBNQlBhcmFtcyA+c2VhcmNoUmFuZ2U4eDgsIHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UxNngxNiwgZXRjLikgCi0gKiAgICAtICAgIGVpdGhlciBpbiBpc29sYXRpb24gb3IgaW4gY29tYmluYXRpb24sIG9uZSBvciBtb3JlIG9mIHRoZSBlbmFibGVzIG9yIAotICogICAgICAgICBzZWFyY2ggcmFuZ2VzIGluIHRoZSBzdHJ1Y3R1cmUgKnBNRVBhcmFtcyB3ZXJlIGNvbmZpZ3VyZWQgc3VjaCAKLSAqICAgICAgICAgdGhhdCB0aGUgcmVxdWVzdGVkIGJlaGF2aW9yIGZhaWxzIHRvIGNvbXBseSB3aXRoIFtJU08xNDQ5Ni0xMF0uIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfTUVJbml0ICgKLSAgICBPTVhWQ000UDEwTUVNb2RlIE1FbW9kZSwKLSAgICBjb25zdCBPTVhWQ000UDEwTUVQYXJhbXMgKnBNRVBhcmFtcywKLSAgICB2b2lkICpwTUVTcGVjCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyICAgKDYuMy41LjIuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGludGVnZXIgYmxvY2sgbWF0Y2guICBSZXR1cm5zIGJlc3QgTVYgYW5kIGFzc29jaWF0ZWQgY29zdC4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY09yZ1kgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGN1cnJlbnQgYmxvY2s6Ci0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBwU3JjUmVmWSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBibG9jayBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJlZmVyZW5jZSBwaWN0dXJlOiAKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgCi0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgblNyY09yZ1N0ZXAgLSBTdHJpZGUgb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUsIGV4cHJlc3NlZCBpbiB0ZXJtcyAKLSAqICAgICAgICAgICAgb2YgaW50ZWdlciBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiBpQmxvY2tXaWR0aC4gCi0gKiAgIG5TcmNSZWZTdGVwIC0gU3RyaWRlIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSwgZXhwcmVzc2VkIGluIHRlcm1zIAotICogICAgICAgICAgICBvZiBpbnRlZ2VyIHBpeGVscyAKLSAqICAgcFJlZlJlY3QgLSBwb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcmVjdGFuZ2xlIGluc2lkZSB0aGUgcmVmZXJlbmNlIAotICogICAgICAgICAgICBwaWN0dXJlIHBsYW5lIAotICogICBuQ3VyclBvaW50UG9zIC0gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCi0gKiAgIGlCbG9ja1dpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2ssIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBpbnRlZ2VyIAotICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqICAgaUJsb2NrSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrLCBleHByZXNzZWQgaW4gdGVybXMgb2YgCi0gKiAgICAgICAgICAgIGludGVnZXIgcGl4ZWxzOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKiAgIG5MYW1kYSAtIExhbWRhIGZhY3RvcjsgdXNlZCB0byBjb21wdXRlIG1vdGlvbiBjb3N0IAotICogICBwTVZQcmVkIC0gUHJlZGljdGVkIE1WOyB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QsIGV4cHJlc3NlZCBpbiB0ZXJtcyAKLSAqICAgICAgICAgICAgb2YgMS80LXBlbCB1bml0cyAKLSAqICAgcE1WQ2FuZGlkYXRlIC0gQ2FuZGlkYXRlIE1WOyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIG1vdGlvbiBzZWFyY2gsIAotICogICAgICAgICAgICBleHByZXNzZWQgaW4gdGVybXMgb2YgaW50ZWdlciBwaXhlbHMgCi0gKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdEJlc3RNViAtIEJlc3QgTVYgcmVzdWx0aW5nIGZyb20gaW50ZWdlciBzZWFyY2gsIGV4cHJlc3NlZCBpbiB0ZXJtcyAKLSAqICAgICAgICAgICAgb2YgMS80LXBlbCB1bml0cyAKLSAqICAgcEJlc3RDb3N0IC0gTW90aW9uIGNvc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBiZXN0IE1WOyBjb21wdXRlZCBhcyAKLSAqICAgICAgICAgICAgU0FEK0xhbWRhKkJpdHNVc2VkQnlNViAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBhbnkgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBhcmUgTlVMTDoKLSAqICAgICAgICAgcFNyY09yZ1ksIHBTcmNSZWZZLCBwUmVmUmVjdCwgcE1WUHJlZCwgcE1WQ2FuZGlkYXRlLCBvciBwTUVTcGVjLiAKLSAqICAgIC0gICAgRWl0aGVyIGlCbG9ja1dpZHRoIG9yIGlCbG9ja0hlaWdodCBhcmUgdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYuIAotICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZ1ksCi0gICAgT01YX1MzMiBuU3JjT3JnU3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZZLAotICAgIE9NWF9TMzIgblNyY1JlZlN0ZXAsCi0gICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0gICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKLSAgICBPTVhfVTggaUJsb2NrV2lkdGgsCi0gICAgT01YX1U4IGlCbG9ja0hlaWdodCwKLSAgICBPTVhfVTMyIG5MYW1kYSwKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcE1WUHJlZCwKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcE1WQ2FuZGlkYXRlLAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwQmVzdE1WLAotICAgIE9NWF9TMzIgKnBCZXN0Q29zdCwKLSAgICB2b2lkICpwTUVTcGVjCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmICAgKDYuMy41LjIuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGEgaGFsZi1wZWwgYmxvY2sgbWF0Y2ggdXNpbmcgcmVzdWx0cyBmcm9tIGEgcHJpb3IgaW50ZWdlciBzZWFyY2guIAotICogIFJldHVybnMgdGhlIGJlc3QgTVYgYW5kIGFzc29jaWF0ZWQgY29zdC4gIFRoaXMgZnVuY3Rpb24gZXN0aW1hdGVzIHRoZSAKLSAqIGhhbGYtcGl4ZWwgbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIHJlc29sdXRpb24gbW90aW9uIAotICogdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0QmVzdE1WLCBpLmUuLCB0aGUgaW5pdGlhbCAKLSAqIGludGVnZXIgTVYgaXMgZ2VuZXJhdGVkIGV4dGVybmFsbHkuICBUaGUgZnVuY3Rpb24gCi0gKiBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciBtYXkgYmUgdXNlZCBmb3IgaW50ZWdlciBtb3Rpb24gZXN0aW1hdGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY09yZ1kgLSBQb2ludGVyIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmU6Ci0gKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBwU3JjUmVmWSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBibG9jayBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJlZmVyZW5jZSBwaWN0dXJlOiAgCi0gKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgCi0gKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgCi0gKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIG5TcmNPcmdTdGVwIC0gU3RyaWRlIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGlCbG9ja1dpZHRoLiAKLSAqICAgblNyY1JlZlN0ZXAgLSBTdHJpZGUgb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVscyAKLSAqICAgaUJsb2NrV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKLSAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqICAgaUJsb2NrSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRlcm1zIG9mIGZ1bGwgcGl4ZWxzOyBtdXN0IAotICogICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICogICBuTGFtZGEgLSBMYW1kYSBmYWN0b3IsIHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCAKLSAqICAgcE1WUHJlZCAtIFByZWRpY3RlZCBNViwgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0czsgdXNlZCB0byAKLSAqICAgICAgICAgICAgY29tcHV0ZSBtb3Rpb24gY29zdCAKLSAqICAgcFNyY0RzdEJlc3RNViAtIFRoZSBiZXN0IE1WIHJlc3VsdGluZyBmcm9tIGEgcHJpb3IgaW50ZWdlciBzZWFyY2gsIAotICogICAgICAgICAgICByZXByZXNlbnRlZCBpbiB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0QmVzdE1WIC0gQmVzdCBNViByZXN1bHRpbmcgZnJvbSB0aGUgaGFsZi1wZWwgc2VhcmNoLCBleHByZXNzZWQgaW4gCi0gKiAgICAgICAgICAgIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHMgCi0gKiAgIHBCZXN0Q29zdCAtIE1vdGlvbiBjb3N0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYmVzdCBNVjsgY29tcHV0ZWQgYXMgCi0gKiAgICAgICAgICAgIFNBRCtMYW1kYSpCaXRzVXNlZEJ5TVYgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgYW55IG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY09yZ1ksIHBTcmNSZWZZLCAKLSAqICAgICAgICAgICAgICBwU3JjRHN0QmVzdE1WLCBwTVZQcmVkLCBwQmVzdENvc3QgCi0gKiAgICAtICAgIGlCbG9ja1dpZHRoIG9yIGlCbG9ja0hlaWdodCBhcmUgZXF1YWwgdG8gdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYuIAotICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZ1ksCi0gICAgT01YX1MzMiBuU3JjT3JnU3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZZLAotICAgIE9NWF9TMzIgblNyY1JlZlN0ZXAsCi0gICAgT01YX1U4IGlCbG9ja1dpZHRoLAotICAgIE9NWF9VOCBpQmxvY2tIZWlnaHQsCi0gICAgT01YX1UzMiBuTGFtZGEsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVlByZWQsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RCZXN0TVYsCi0gICAgT01YX1MzMiAqcEJlc3RDb3N0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyICAgKDYuMy41LjIuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGEgcXVhcnRlci1wZWwgYmxvY2sgbWF0Y2ggdXNpbmcgcmVzdWx0cyBmcm9tIGEgcHJpb3IgaGFsZi1wZWwgCi0gKiBzZWFyY2guICBSZXR1cm5zIHRoZSBiZXN0IE1WIGFuZCBhc3NvY2lhdGVkIGNvc3QuICBUaGlzIGZ1bmN0aW9uIGVzdGltYXRlcyAKLSAqIHRoZSBxdWFydGVyLXBpeGVsIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaGFsZi1wZWwgcmVzb2x1dGlvbiAKLSAqIG1vdGlvbiB2ZWN0b3IgcmVmZXJlbmNlZCBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RCZXN0TVYsIGkuZS4sIHRoZSAKLSAqIGluaXRpYWwgaGFsZi1wZWwgTVYgaXMgZ2VuZXJhdGVkIGV4dGVybmFsbHkuICBUaGUgZnVuY3Rpb24gCi0gKiBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiBtYXkgYmUgdXNlZCBmb3IgaGFsZi1wZWwgbW90aW9uIGVzdGltYXRpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNPcmdZIC0gUG9pbnRlciB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lOgotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgcFNyY1JlZlkgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgYmxvY2sgaW4gdGhlIAotICogICAgICAgICAgICByZWZlcmVuY2UgcGljdHVyZToKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgCi0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgblNyY09yZ1N0ZXAgLSBTdHJpZGUgb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgaUJsb2NrV2lkdGguIAotICogICBuU3JjUmVmU3RlcCAtIFN0cmlkZSBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzIAotICogICBpQmxvY2tXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRlcm1zIG9mIGZ1bGwgcGl4ZWxzOyBtdXN0IAotICogICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICogICBpQmxvY2tIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGVybXMgb2YgZnVsbCBwaXhlbHM7IG11c3QgCi0gKiAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKiAgIG5MYW1kYSAtIExhbWRhIGZhY3RvciwgdXNlZCB0byBjb21wdXRlIG1vdGlvbiBjb3N0IAotICogICBwTVZQcmVkIC0gUHJlZGljdGVkIE1WLCByZXByZXNlbnRlZCBpbiB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzOyB1c2VkIHRvIAotICogICAgICAgICAgICBjb21wdXRlIG1vdGlvbiBjb3N0IAotICogICBwU3JjRHN0QmVzdE1WIC0gVGhlIGJlc3QgTVYgcmVzdWx0aW5nIGZyb20gYSBwcmlvciBoYWxmLXBlbCBzZWFyY2gsIAotICogICAgICAgICAgICByZXByZXNlbnRlZCBpbiB0ZXJtcyBvZiAxLzQgcGVsIHVuaXRzIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0QmVzdE1WIC0gQmVzdCBNViByZXN1bHRpbmcgZnJvbSB0aGUgcXVhcnRlci1wZWwgc2VhcmNoLCBleHByZXNzZWQgCi0gKiAgICAgICAgICAgIGluIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHMgCi0gKiAgIHBCZXN0Q29zdCAtIE1vdGlvbiBjb3N0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYmVzdCBNVjsgY29tcHV0ZWQgYXMgCi0gKiAgICAgICAgICAgIFNBRCtMYW1kYSpCaXRzVXNlZEJ5TVYgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyY09yZ1ksIHBTcmNSZWZZLCBwU3JjRHN0QmVzdE1WLCBwTVZQcmVkLCBwQmVzdENvc3QgCi0gKiAgICAtICAgIGlCbG9ja1dpZHRoIG9yIGlCbG9ja0hlaWdodCBhcmUgZXF1YWwgdG8gdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYuIAotICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZ1ksCi0gICAgT01YX1MzMiBuU3JjT3JnU3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZZLAotICAgIE9NWF9TMzIgblNyY1JlZlN0ZXAsCi0gICAgT01YX1U4IGlCbG9ja1dpZHRoLAotICAgIE9NWF9VOCBpQmxvY2tIZWlnaHQsCi0gICAgT01YX1UzMiBuTGFtZGEsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVlByZWQsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RCZXN0TVYsCi0gICAgT01YX1MzMiAqcEJlc3RDb3N0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CICAgKDYuMy41LjMuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIE1CLWxldmVsIG1vdGlvbiBlc3RpbWF0aW9uIGFuZCBzZWxlY3RzIGJlc3QgbW90aW9uIGVzdGltYXRpb24gCi0gKiBzdHJhdGVneSBmcm9tIHRoZSBzZXQgb2YgbW9kZXMgc3VwcG9ydGVkIGluIGJhc2VsaW5lIHByb2ZpbGUgW0lTTzE0NDk2LTEwXS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0N1cnJCdWYgLSBQb2ludGVyIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmU7IAotICogICAgICAgICAgICAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKLSAqICAgcFNyY1JlZkJ1Zkxpc3QgLSBQb2ludGVyIHRvIGFuIGFycmF5IHdpdGggMTYgZW50cmllcy4gIEVhY2ggZW50cnkgcG9pbnRzIAotICogICAgICAgICAgICB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIE1CIGluIGEgcmVmZXJlbmNlIAotICogICAgICAgICAgICBwaWN0dXJlLiAgVGhlIGFycmF5IGlzIGZpbGxlZCBmcm9tIGxvdy10by1oaWdoIHdpdGggdmFsaWQgCi0gKiAgICAgICAgICAgIHJlZmVyZW5jZSBmcmFtZSBwb2ludGVyczsgdGhlIHVudXNlZCBoaWdoIGVudHJpZXMgc2hvdWxkIGJlIHNldCAKLSAqICAgICAgICAgICAgdG8gTlVMTC4gIE9yZGVyaW5nIG9mIHRoZSByZWZlcmVuY2UgZnJhbWVzIHNob3VsZCBmb2xsb3cgCi0gKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gc3ViY2xhdXNlIDguMi40ICBEZWNvZGluZyBQcm9jZXNzIGZvciBSZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIFBpY3R1cmUgTGlzdHMuICAgVGhlIGVudHJpZXMgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAotICogICBwU3JjUmVjQnVmIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIE1CIGluIHRoZSAKLSAqICAgICAgICAgICAgcmVjb25zdHJ1Y3RlZCBwaWN0dXJlOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgIFNyY0N1cnJTdGVwIC0gV2lkdGggb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBTcmNSZWZTdGVwIC0gV2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgU3JjUmVjU3RlcCAtIFdpZHRoIG9mIHRoZSByZWNvbnN0cnVjdGVkIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBwUmVmUmVjdCAtIFBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSByZWN0YW5nbGU7IHJlbGF0aXZlIHRvIHRoZSAKLSAqICAgICAgICAgICAgaW1hZ2Ugb3JpZ2luLiAKLSAqICAgcEN1cnJQb2ludFBvcyAtIFBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUuIAotICogICBMYW1iZGEgLSBMYWdyYW5nZSBmYWN0b3IgZm9yIGNvbXB1dGluZyB0aGUgY29zdCBmdW5jdGlvbiAKLSAqICAgcE1FU3BlYyAtIFBvaW50ZXIgdG8gdGhlIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlOyBtdXN0IAotICogICAgICAgICAgICBoYXZlIGJlZW4gYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZCBwcmlvciB0byBjYWxsaW5nIHRoaXMgCi0gKiAgICAgICAgICAgIGZ1bmN0aW9uLiAKLSAqICAgcE1CSW50ZXIgLSBBcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBmb3VyIGFkamFjZW50IHR5cGUgSU5URVIgTUJzIChMZWZ0LCBUb3AsIAotICogICAgICAgICAgICBUb3AtTGVmdCwgVG9wLVJpZ2h0KS4gQW55IHBvaW50ZXIgaW4gdGhlIGFycmF5IG1heSBiZSBzZXQgZXF1YWwgCi0gKiAgICAgICAgICAgIHRvIE5VTEwgaWYgdGhlIGNvcnJlc3BvbmRpbmcgTUIgZG9lc24gdCBleGlzdCBvciBpcyBub3Qgb2YgdHlwZSAKLSAqICAgICAgICAgICAgSU5URVIuIAotICogICAgICAgICAgICAtICBwTUJJbnRlclswXSAtIFBvaW50ZXIgdG8gbGVmdCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgLSAgcE1CSW50ZXJbMV0gLSBQb2ludGVyIHRvIHRvcCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgLSAgcE1CSW50ZXJbMl0gLSBQb2ludGVyIHRvIHRvcC1sZWZ0IE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICAtICBwTUJJbnRlclszXSAtIFBvaW50ZXIgdG8gdG9wLXJpZ2h0IE1CIGluZm9ybWF0aW9uIAotICogICBwTUJJbnRyYSAtIEFycmF5LCBvZiBkaW1lbnNpb24gZm91ciwgY29udGFpbmluZyBwb2ludGVycyB0byBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIGZvdXIgYWRqYWNlbnQgdHlwZSBJTlRSQSBNQnMgKExlZnQsIFRvcCwgCi0gKiAgICAgICAgICAgIFRvcC1MZWZ0LCBUb3AtUmlnaHQpLiBBbnkgcG9pbnRlciBpbiB0aGUgYXJyYXkgbWF5IGJlIHNldCBlcXVhbCAKLSAqICAgICAgICAgICAgdG8gTlVMTCBpZiB0aGUgY29ycmVzcG9uZGluZyBNQiBkb2VzbiB0IGV4aXN0IG9yIGlzIG5vdCBvZiB0eXBlIAotICogICAgICAgICAgICBJTlRSQS4gCi0gKiAgICAgICAgICAgIC0gIHBNQkludHJhWzBdIC0gUG9pbnRlciB0byBsZWZ0IE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICAtICBwTUJJbnRyYVsxXSAtIFBvaW50ZXIgdG8gdG9wIE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICAtICBwTUJJbnRyYVsyXSAtIFBvaW50ZXIgdG8gdG9wLWxlZnQgTUIgaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIC0gIHBNQkludHJhWzNdIC0gUG9pbnRlciB0byB0b3AtcmlnaHQgTUIgaW5mb3JtYXRpb24gCi0gKiAgIHBTcmNEc3RNQkN1cnIgLSBQb2ludGVyIHRvIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgTUIuICAKLSAqICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBlbnRyaWVzIHNob3VsZCBiZSBzZXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgCi0gKiAgICAgICAgICAgIGZ1bmN0aW9uOiAgc2xpY2VJRCAtIHRoZSBudW1iZXIgb2YgdGhlIHNsaWNlIHRoZSB0byB3aGljaCB0aGUgCi0gKiAgICAgICAgICAgIGN1cnJlbnQgTUIgYmVsb25ncy4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RDb3N0IC0gUG9pbnRlciB0byB0aGUgbWluaW11bSBtb3Rpb24gY29zdCBmb3IgdGhlIGN1cnJlbnQgTUIuIAotICogICBwRHN0QmxvY2tTQUQgLSBQb2ludGVyIHRvIHRoZSBhcnJheSBvZiBTQURzIGZvciBlYWNoIG9mIHRoZSBzaXh0ZWVuIGx1bWEgCi0gKiAgICAgICAgICAgIDR4NCBibG9ja3MgaW4gZWFjaCBNQi4gIFRoZSBibG9jayBTQURzIGFyZSBpbiBzY2FuIG9yZGVyIGZvciAKLSAqICAgICAgICAgICAgZWFjaCBNQi4gIEZvciBpbXBsZW1lbnRhdGlvbnMgdGhhdCBjYW5ub3QgY29tcHV0ZSB0aGUgU0FEIHZhbHVlcyAKLSAqICAgICAgICAgICAgaW5kaXZpZHVhbGx5LCB0aGUgbWF4aW11bSBwb3NzaWJsZSB2YWx1ZSAoMHhmZmZmKSBpcyByZXR1cm5lZCAKLSAqICAgICAgICAgICAgZm9yIGVhY2ggb2YgdGhlIDE2IGJsb2NrIFNBRCBlbnRyaWVzLiAKLSAqICAgcFNyY0RzdE1CQ3VyciAtIFBvaW50ZXIgdG8gdXBkYXRlZCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBNQiBhZnRlciBNQi1sZXZlbCBtb3Rpb24gZXN0aW1hdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQuICBUaGUgCi0gKiAgICAgICAgICAgIGZvbGxvd2luZyBmaWVsZHMgYXJlIHVwZGF0ZWQgYnkgdGhlIE1FIGZ1bmN0aW9uLiAgIFRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgIHBhcmFtZXRlciBzZXQgcXVhbnRpZmllcyB0aGUgTUItbGV2ZWwgTUUgc2VhcmNoIHJlc3VsdHM6IAotICogICAgICAgICAgICAtICBNYlR5cGUgCi0gKiAgICAgICAgICAgIC0gIHN1Yk1CVHlwZVs0XSAKLSAqICAgICAgICAgICAgLSAgcE1WMFs0XVs0XSAKLSAqICAgICAgICAgICAgLSAgcE1WUHJlZFs0XVs0XSAKLSAqICAgICAgICAgICAgLSAgcFJlZkwwSWR4WzRdIAotICogICAgICAgICAgICAtICBJbnRyYTE2eDE2UHJlZE1vZGUgCi0gKiAgICAgICAgICAgIC0gIHBJbnRyYTR4NFByZWRNb2RlWzRdWzRdIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjQ3VyckJ1ZiwgCi0gKiAgICAgICAgICAgcFNyY1JlZkJ1Zkxpc3QsIHBTcmNSZWNCdWYsIHBSZWZSZWN0LCBwQ3VyclBvaW50UG9zLCBwTUVTcGVjLCAKLSAqICAgICAgICAgICBwTUJJbnRlciwgcE1CSW50cmEscFNyY0RzdE1CQ3VyciwgcERzdENvc3QsIHBTcmNSZWZCdWZMaXN0WzBdIAotICogICAgLSAgICBTcmNSZWZTdGVwLCBTcmNSZWNTdGVwIGFyZSBub3QgbXVsdGlwbGVzIG9mIDE2IAotICogICAgLSAgICBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKLSAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAotICAgIE9NWF9TMzIgU3JjQ3VyclN0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmTGlzdFsxNV0sCi0gICAgT01YX1MzMiBTcmNSZWZTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlY0J1ZiwKLSAgICBPTVhfUzMyIFNyY1JlY1N0ZXAsCi0gICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0gICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKLSAgICBPTVhfVTMyIExhbWJkYSwKLSAgICB2b2lkICpwTUVTcGVjLAotICAgIGNvbnN0IE9NWFZDTTRQMTBNQkluZm9QdHIgKnBNQkludGVyLAotICAgIGNvbnN0IE9NWFZDTTRQMTBNQkluZm9QdHIgKnBNQkludHJhLAotICAgIE9NWFZDTTRQMTBNQkluZm9QdHIgcFNyY0RzdE1CQ3VyciwKLSAgICBPTVhfSU5UICpwRHN0Q29zdCwKLSAgICBPTVhfVTE2ICpwRHN0QmxvY2tTQUQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQURfNHggICAoNi4zLjUuNC4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgZm9yIDR4OCBhbmQgNHg0IGJsb2Nrcy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY09yZyAtUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBpU3RlcE9yZyAtU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIHBTcmNSZWYgLVBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayAKLSAqICAgaVN0ZXBSZWYgLVN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXIgCi0gKiAgIGlIZWlnaHQgLUhlaWdodCBvZiB0aGUgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RTQUQgLVBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjT3JnLCBwU3JjUmVmLCBvciBwRHN0U0FEIAotICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgNCBvciA4LiAKLSAqICAgIC0gICAgaVN0ZXBPcmcgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfU0FEXzR4ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNPcmcsCi0gICAgT01YX1UzMiBpU3RlcE9yZywKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCi0gICAgT01YX1UzMiBpU3RlcFJlZiwKLSAgICBPTVhfUzMyICpwRHN0U0FELAotICAgIE9NWF9VMzIgaUhlaWdodAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBRFF1YXJfNHggICAoNi4zLjUuNC4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgYmV0d2VlbiBvbmUgYmxvY2sgKHBTcmMpIGFuZCB0aGUgYXZlcmFnZSAKLSAqIG9mIHRoZSBvdGhlciB0d28gKHBTcmNSZWYwIGFuZCBwU3JjUmVmMSkgZm9yIDR4OCBvciA0eDQgYmxvY2tzLiAgUm91bmRpbmcgCi0gKiBpcyBhcHBsaWVkIGFjY29yZGluZyB0byB0aGUgY29udmVudGlvbiAoYStiKzEpPj4xLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBwU3JjUmVmMCAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIHBTcmNSZWYxIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgaVJlZlN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgaVJlZlN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RTQUQgLSBQb2ludGVyIG9mIHJlc3VsdCBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOC4gCi0gKiAgICAtICAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZjAsIAotICogICAgICAgICAgICAgIHBTcmNSZWYxLCBwRHN0U0FELiAKLSAqICAgIC0gICAgaVNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfU0FEUXVhcl80eCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjAsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMSwKLSAgICBPTVhfVTMyIGlTcmNTdGVwLAotICAgIE9NWF9VMzIgaVJlZlN0ZXAwLAotICAgIE9NWF9VMzIgaVJlZlN0ZXAxLAotICAgIE9NWF9VMzIgKnBEc3RTQUQsCi0gICAgT01YX1UzMiBpSGVpZ2h0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FEUXVhcl84eCAgICg2LjMuNS40LjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBiZXR3ZWVuIG9uZSBibG9jayAocFNyYykgYW5kIHRoZSBhdmVyYWdlIAotICogb2YgdGhlIG90aGVyIHR3byAocFNyY1JlZjAgYW5kIHBTcmNSZWYxKSBmb3IgOHgxNiwgOHg4LCBvciA4eDQgYmxvY2tzLiAgCi0gKiBSb3VuZGluZyBpcyBhcHBsaWVkIGFjY29yZGluZyB0byB0aGUgY29udmVudGlvbiAoYStiKzEpPj4xLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgcFNyY1JlZjAgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAwIAotICogICBwU3JjUmVmMSAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIGlSZWZTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIGlSZWZTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RTQUQgLSBQb2ludGVyIG9mIHJlc3VsdCBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqICAgIC0gICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwU3JjUmVmMCwgCi0gKiAgICAgICAgICAgICAgcFNyY1JlZjEsIHBEc3RTQUQuIAotICogICAgLSAgICBpU3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4IAotICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9TQURRdWFyXzh4ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYxLAotICAgIE9NWF9VMzIgaVNyY1N0ZXAsCi0gICAgT01YX1UzMiBpUmVmU3RlcDAsCi0gICAgT01YX1UzMiBpUmVmU3RlcDEsCi0gICAgT01YX1UzMiAqcERzdFNBRCwKLSAgICBPTVhfVTMyIGlIZWlnaHQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQURRdWFyXzE2eCAgICg2LjMuNS40LjQpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBiZXR3ZWVuIG9uZSBibG9jayAocFNyYykgYW5kIHRoZSBhdmVyYWdlIAotICogb2YgdGhlIG90aGVyIHR3byAocFNyY1JlZjAgYW5kIHBTcmNSZWYxKSBmb3IgMTZ4MTYgb3IgMTZ4OCBibG9ja3MuICAKLSAqIFJvdW5kaW5nIGlzIGFwcGxpZWQgYWNjb3JkaW5nIHRvIHRoZSBjb252ZW50aW9uIChhK2IrMSk+PjEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBwU3JjUmVmMCAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIHBTcmNSZWYxIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNiAKLSAqICAgaVJlZlN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgaVJlZlN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDggb3IgMTYgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RTQUQgLVBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgOCBvciAxNi4gCi0gKiAgICAtICAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZjAsIAotICogICAgICAgICAgICAgIHBTcmNSZWYxLCBwRHN0U0FELiAKLSAqICAgIC0gICAgaVNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYgCi0gKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1NBRFF1YXJfMTZ4ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYxLAotICAgIE9NWF9VMzIgaVNyY1N0ZXAsCi0gICAgT01YX1UzMiBpUmVmU3RlcDAsCi0gICAgT01YX1UzMiBpUmVmU3RlcDEsCi0gICAgT01YX1UzMiAqcERzdFNBRCwKLSAgICBPTVhfVTMyIGlIZWlnaHQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQVREXzR4NCAgICg2LjMuNS40LjUpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIHN1bSBvZiBhYnNvbHV0ZSB0cmFuc2Zvcm0gZGlmZmVyZW5jZXMgKFNBVEQpIAotICogZm9yIGEgNHg0IGJsb2NrIGJ5IGFwcGx5aW5nIGEgSGFkYW1hcmQgdHJhbnNmb3JtIHRvIHRoZSBkaWZmZXJlbmNlIGJsb2NrIAotICogYW5kIHRoZW4gY2FsY3VsYXRpbmcgdGhlIHN1bSBvZiBhYnNvbHV0ZSBjb2VmZmljaWVudCB2YWx1ZXMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNPcmcgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeSAKLSAqICAgaVN0ZXBPcmcgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IAotICogICBwU3JjUmVmIC0gUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5IAotICogICBpU3RlcFJlZiAtIFN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0U0FEIC0gcG9pbnRlciB0byB0aGUgcmVzdWx0aW5nIFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjT3JnLCBwU3JjUmVmLCBvciBwRHN0U0FEIGVpdGhlciBwU3JjT3JnIAotICogICAgLSAgICBwU3JjUmVmIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBpU3RlcE9yZyA8PSAwIG9yIGlTdGVwT3JnIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKiAgICAtICAgIGlTdGVwUmVmIDw9IDAgb3IgaVN0ZXBSZWYgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1NBVERfNHg0ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNPcmcsCi0gICAgT01YX1UzMiBpU3RlcE9yZywKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCi0gICAgT01YX1UzMiBpU3RlcFJlZiwKLSAgICBPTVhfVTMyICpwRHN0U0FECi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEgICAoNi4zLjUuNS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciB0d28gaG9yaXpvbnRhbCAxLzItcGVsIHBvc2l0aW9ucyAKLSAqICgtMS8yLDApIGFuZCAoMS8yLCAwKSAtIGFyb3VuZCBhIGZ1bGwtcGVsIHBvc2l0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIGluIAotICogICAgICAgICAgICB0aGUgcmVjb25zdHJ1Y3Rpb24gZnJhbWUgcGxhbmUuIAotICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuIAotICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlcjsgbXVzdCBiZSBhIAotICogICAgICAgICAgICBtdWx0aXBsZSBvZiBpV2lkdGguIAotICogICBpV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYgCi0gKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gNCwgOCwgb3IgMTYgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RMZWZ0IC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgbGVmdCAtcGVsIHBvc2l0aW9uIAotICogICAgICAgICAgICAoLTEvMiwgMCkgCi0gKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBwRHN0UmlnaHQgLVBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSByaWdodCAtcGVsIAotICogICAgICAgICAgICBwb3NpdGlvbiAoMS8yLCAwKSAKLSAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgICAgIHBTcmMsIHBEc3RMZWZ0LCBvciBwRHN0UmlnaHQgCi0gKiAgICAtICAgIGlXaWR0aCBvciBpSGVpZ2h0IGhhdmUgdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYgCi0gKiAgICAtICAgIGlXaWR0aD09NCBidXQgcERzdExlZnQgYW5kL29yIHBEc3RSaWdodCBpcy9hcmUgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGlXaWR0aD09OCBidXQgcERzdExlZnQgYW5kL29yIHBEc3RSaWdodCBpcy9hcmUgbm90IGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGlXaWR0aD09MTYgYnV0IHBEc3RMZWZ0IGFuZC9vciBwRHN0UmlnaHQgaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgYW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBPTVhfVTMyIGlTcmNTdGVwLAotICAgIE9NWF9VOCAqcERzdExlZnQsCi0gICAgT01YX1U4ICpwRHN0UmlnaHQsCi0gICAgT01YX1UzMiBpRHN0U3RlcCwKLSAgICBPTVhfVTMyIGlXaWR0aCwKLSAgICBPTVhfVTMyIGlIZWlnaHQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSAgICg2LjMuNS41LjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIHR3byB2ZXJ0aWNhbCAxLzItcGVsIHBvc2l0aW9ucyAtIAotICogKDAsIC0xLzIpIGFuZCAoMCwgMS8yKSAtIGFyb3VuZCBhIGZ1bGwtcGVsIHBvc2l0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUgCi0gKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gCi0gKiAgIGlEc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gKGludGVycG9sYXRpb24pIGJ1ZmZlcjsgbXVzdCBiZSBhIAotICogICAgICAgICAgICBtdWx0aXBsZSBvZiBpV2lkdGguIAotICogICBpV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYgCi0gKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2IAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0VXAgLVBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAtcGVsIHBvc2l0aW9uIGFib3ZlIAotICogICAgICAgICAgICB0aGUgY3VycmVudCBmdWxsLXBlbCBwb3NpdGlvbiAoMCwgLTEvMikgCi0gKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTQsIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT04LCA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgcERzdERvd24gLVBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAtcGVsIHBvc2l0aW9uIGJlbG93IAotICogICAgICAgICAgICB0aGUgY3VycmVudCBmdWxsLXBlbCBwb3NpdGlvbiAoMCwgMS8yKSAKLSAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09NCwgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTgsIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgICAgIHBTcmMsIHBEc3RVcCwgb3IgcERzdERvd24gCi0gKiAgICAtICAgIGlXaWR0aCBvciBpSGVpZ2h0IGhhdmUgdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYgCi0gKiAgICAtICAgIGlXaWR0aD09NCBidXQgcERzdFVwIGFuZC9vciBwRHN0RG93biBpcy9hcmUgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGlXaWR0aD09OCBidXQgcERzdFVwIGFuZC9vciBwRHN0RG93biBpcy9hcmUgbm90IGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGlXaWR0aD09MTYgYnV0IHBEc3RVcCBhbmQvb3IgcERzdERvd24gaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgT01YX1UzMiBpU3JjU3RlcCwKLSAgICBPTVhfVTggKnBEc3RVcCwKLSAgICBPTVhfVTggKnBEc3REb3duLAotICAgIE9NWF9VMzIgaURzdFN0ZXAsCi0gICAgT01YX1UzMiBpV2lkdGgsCi0gICAgT01YX1UzMiBpSGVpZ2h0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfQXZlcmFnZV80eCAgICg2LjMuNS41LjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGF2ZXJhZ2Ugb2YgdHdvIDR4NCwgNHg4IGJsb2Nrcy4gIFRoZSByZXN1bHQgCi0gKiBpcyByb3VuZGVkIGFjY29yZGluZyB0byAoYStiKzEpLzIuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBQcmVkMCAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgcFByZWQxIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpUHJlZFN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMDsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAotICogICBpUHJlZFN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMTsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAotICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAotICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9ja3M7IG11c3QgYmUgZWl0aGVyIDQgb3IgOC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RQcmVkIC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICAgIHBQcmVkMCwgcFByZWQxLCBvciBwRHN0UHJlZCAKLSAqICAgIC0gICAgcERzdFByZWQgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGlQcmVkU3RlcDAgPD0gMCBvciBpUHJlZFN0ZXAwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKiAgICAtICAgIGlQcmVkU3RlcDEgPD0gMCBvciBpUHJlZFN0ZXAxIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKiAgICAtICAgIGlEc3RTdGVwIDw9IDAgb3IgaURzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0F2ZXJhZ2VfNHggKAotICAgIGNvbnN0IE9NWF9VOCAqcFByZWQwLAotICAgIGNvbnN0IE9NWF9VOCAqcFByZWQxLAotICAgIE9NWF9VMzIgaVByZWRTdGVwMCwKLSAgICBPTVhfVTMyIGlQcmVkU3RlcDEsCi0gICAgT01YX1U4ICpwRHN0UHJlZCwKLSAgICBPTVhfVTMyIGlEc3RTdGVwLAotICAgIE9NWF9VMzIgaUhlaWdodAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDICAgKDYuMy41LjYuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgMngyIEhhZGFtYXJkIHRyYW5zZm9ybSBvZiBjaHJvbWEgREMgY29lZmZpY2llbnRzIAotICogYW5kIHRoZW4gcXVhbnRpemVzIHRoZSBjb2VmZmljaWVudHMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRoZSAyeDIgYXJyYXkgb2YgY2hyb21hIERDIGNvZWZmaWNpZW50cy4gIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKLSAqICAgYkludHJhIC0gSW5kaWNhdGUgd2hldGhlciB0aGlzIGlzIGFuIElOVFJBIGJsb2NrLiAxLUlOVFJBLCAwLUlOVEVSIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0cmFuc2Zvcm1lZCBhbmQgcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICAgICAgcFNyY0RzdCAKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQyAoCi0gICAgT01YX1MxNiAqcFNyY0RzdCwKLSAgICBPTVhfVTMyIGlRUCwKLSAgICBPTVhfVTggYkludHJhCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDICAgKDYuMy41LjYuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgYSA0eDQgSGFkYW1hcmQgdHJhbnNmb3JtIG9mIGx1bWEgREMgY29lZmZpY2llbnRzIAotICogYW5kIHRoZW4gcXVhbnRpemVzIHRoZSBjb2VmZmljaWVudHMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRoZSA0eDQgYXJyYXkgb2YgbHVtYSBEQyBjb2VmZmljaWVudHMuICAxNi1ieXRlIAotICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0cmFuc2Zvcm1lZCBhbmQgcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIDE2LWJ5dGUgCi0gKiAgICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCAKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgYWxpZ25lZCBvbiBhbiAxNi1ieXRlIGJvdW5kYXJ5IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDICgKLSAgICBPTVhfUzE2ICpwU3JjRHN0LAotICAgIE9NWF9VMzIgaVFQCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMgICAoNi4zLjUuNi4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIDR4NCBIYWRhbWFyZCB0cmFuc2Zvcm0gYW5kIHRoZW4gZGVxdWFudGl6ZXMgCi0gKiB0aGUgY29lZmZpY2llbnRzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgNHg0IGFycmF5IG9mIHRoZSA0eDQgSGFkYW1hcmQtdHJhbnNmb3JtZWQgYW5kIAotICogICAgICAgICAgICBxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgMTYgYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gUG9pbnRlciB0byBpbnZlcnNlLXRyYW5zZm9ybWVkIGFuZCBkZXF1YW50aXplZCBjb2VmZmljaWVudHMuICAKLSAqICAgICAgICAgICAgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYyAKLSAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDICgKLSAgICBjb25zdCBPTVhfUzE2ICpwU3JjLAotICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgT01YX1UzMiBpUVAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDICAgKDYuMy41LjYuNCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSAyeDIgSGFkYW1hcmQgdHJhbnNmb3JtIGFuZCB0aGVuIGRlcXVhbnRpemVzIAotICogdGhlIGNvZWZmaWNpZW50cy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIDJ4MiBhcnJheSBvZiB0aGUgMngyIEhhZGFtYXJkLXRyYW5zZm9ybWVkIGFuZCAKLSAqICAgICAgICAgICAgcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIDggYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gUG9pbnRlciB0byBpbnZlcnNlLXRyYW5zZm9ybWVkIGFuZCBkZXF1YW50aXplZCBjb2VmZmljaWVudHMuICAKLSAqICAgICAgICAgICAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjIAotICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQyAoCi0gICAgY29uc3QgT01YX1MxNiAqcFNyYywKLSAgICBPTVhfUzE2ICpwRHN0LAotICAgIE9NWF9VMzIgaVFQCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQgICAoNi4zLjUuNy4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIGFuIDR4NCBpbnRlZ2VyIHRyYW5zZm9ybWF0aW9uIHRvIHByb2R1Y2UgCi0gKiB0aGUgZGlmZmVyZW5jZSBzaWduYWwgYW5kIHRoZW4gYWRkcyB0aGUgZGlmZmVyZW5jZSB0byB0aGUgcHJlZGljdGlvbiB0byBnZXQgCi0gKiB0aGUgcmVjb25zdHJ1Y3RlZCBzaWduYWwuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNQcmVkIC0gUG9pbnRlciB0byBwcmVkaWN0aW9uIHNpZ25hbC4gIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBwRGVxdWFudENvZWZmIC0gUG9pbnRlciB0byB0aGUgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzLiAgOC1ieXRlIAotICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBpU3JjUHJlZFN0ZXAgLSBTdGVwIG9mIHRoZSBwcmVkaWN0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAotICogICBpRHN0UmVjb25TdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gcmVjb25zdHJ1Y3Rpb24gYnVmZmVyOyBtdXN0IGJlIGEgCi0gKiAgICAgICAgICAgIG11bHRpcGxlIG9mIDQuIAotICogICBiQUMgLSBJbmRpY2F0ZSB3aGV0aGVyIHRoZXJlIGlzIEFDIGNvZWZmaWNpZW50cyBpbiB0aGUgY29lZmZpY2llbnRzIAotICogICAgICAgICAgICBtYXRyaXguIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0UmVjb24gLVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIHJlY29uc3RydWN0aW9uIGJ1ZmZlci4gIDQtYnl0ZSAKLSAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICAgICBwU3JjUHJlZCwgcERlcXVhbnRDb2VmZiwgcERzdFJlY29uIAotICogICAgLSAgICBwU3JjUHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgaVNyY1ByZWRTdGVwIG9yIGlEc3RSZWNvblN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgICAtICAgIHBEZXF1YW50Q29lZmYgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1ByZWQsCi0gICAgY29uc3QgT01YX1MxNiAqcERlcXVhbnRDb2VmZiwKLSAgICBPTVhfVTggKnBEc3RSZWNvbiwKLSAgICBPTVhfVTMyIGlTcmNQcmVkU3RlcCwKLSAgICBPTVhfVTMyIGlEc3RSZWNvblN0ZXAsCi0gICAgT01YX1U4IGJBQwotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsICAgKDYuMy41LjguMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gc3VidHJhY3RzIHRoZSBwcmVkaWN0aW9uIHNpZ25hbCBmcm9tIHRoZSBvcmlnaW5hbCBzaWduYWwgdG8gCi0gKiBwcm9kdWNlIHRoZSBkaWZmZXJlbmNlIHNpZ25hbCBhbmQgdGhlbiBwZXJmb3JtcyBhIDR4NCBpbnRlZ2VyIHRyYW5zZm9ybSBhbmQgCi0gKiBxdWFudGl6YXRpb24uIFRoZSBxdWFudGl6ZWQgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzIGFyZSBzdG9yZWQgYXMgCi0gKiBwRHN0UXVhbnRDb2VmZi4gVGhpcyBmdW5jdGlvbiBjYW4gYWxzbyBvdXRwdXQgZGVxdWFudGl6ZWQgY29lZmZpY2llbnRzIG9yIAotICogdW5xdWFudGl6ZWQgREMgY29lZmZpY2llbnRzIG9wdGlvbmFsbHkgYnkgc2V0dGluZyB0aGUgcG9pbnRlcnMgCi0gKiBwRHN0RGVRdWFudENvZWZmLCBwRENDb2VmZi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY09yZyAtIFBvaW50ZXIgdG8gb3JpZ2luYWwgc2lnbmFsLiA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgcFNyY1ByZWQgLSBQb2ludGVyIHRvIHByZWRpY3Rpb24gc2lnbmFsLiA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgaVNyY09yZ1N0ZXAgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBzaWduYWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgCi0gKiAgICAgICAgICAgIDQuIAotICogICBpU3JjUHJlZFN0ZXAgLSBTdGVwIG9mIHRoZSBwcmVkaWN0aW9uIHNpZ25hbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSAKLSAqICAgICAgICAgICAgb2YgNC4gCi0gKiAgIHBOdW1Db2VmZiAtTnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyBhZnRlciBxdWFudGl6YXRpb24uIElmIHRoaXMgCi0gKiAgICAgICAgICAgIHBhcmFtZXRlciBpcyBub3QgcmVxdWlyZWQsIGl0IGlzIHNldCB0byBOVUxMLiAKLSAqICAgblRocmVzaFNBRCAtIFplcm8tYmxvY2sgZWFybHkgZGV0ZWN0aW9uIHRocmVzaG9sZC4gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgCi0gKiAgICAgICAgICAgIG5vdCByZXF1aXJlZCwgaXQgaXMgc2V0IHRvIDAuIAotICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAotICogICBiSW50cmEgLSBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGlzIGFuIElOVFJBIGJsb2NrLCBlaXRoZXIgMS1JTlRSQSBvciAKLSAqICAgICAgICAgICAgMC1JTlRFUiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFF1YW50Q29lZmYgLSBQb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzLiAgCi0gKiAgICAgICAgICAgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBwRHN0RGVRdWFudENvZWZmIC0gUG9pbnRlciB0byB0aGUgZGVxdWFudGl6ZWQgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzIAotICogICAgICAgICAgICBpZiB0aGlzIHBhcmFtZXRlciBpcyBub3QgZXF1YWwgdG8gTlVMTC4gIDgtYnl0ZSBhbGlnbm1lbnQgCi0gKiAgICAgICAgICAgIHJlcXVpcmVkLiAKLSAqICAgcERDQ29lZmYgLSBQb2ludGVyIHRvIHRoZSB1bnF1YW50aXplZCBEQyBjb2VmZmljaWVudCBpZiB0aGlzIHBhcmFtZXRlciAKLSAqICAgICAgICAgICAgaXMgbm90IGVxdWFsIHRvIE5VTEwuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgICAgIHBTcmNPcmcsIHBTcmNQcmVkLCBwTnVtQ29lZmYsIHBEc3RRdWFudENvZWZmLCAKLSAqICAgICAgICAgICAgcERzdERlUXVhbnRDb2VmZiwgcERDQ29lZmYgCi0gKiAgICAtICAgIHBTcmNPcmcgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIHBTcmNQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBpU3JjT3JnU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICogICAgLSAgICBpU3JjUHJlZFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgIC0gICAgcERzdFF1YW50Q29lZmYgb3IgcERzdERlUXVhbnRDb2VmZiBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1ByZWQsCi0gICAgT01YX1UzMiBpU3JjT3JnU3RlcCwKLSAgICBPTVhfVTMyIGlTcmNQcmVkU3RlcCwKLSAgICBPTVhfUzE2ICpwRHN0UXVhbnRDb2VmZiwKLSAgICBPTVhfUzE2ICpwRHN0RGVRdWFudENvZWZmLAotICAgIE9NWF9TMTYgKnBEQ0NvZWZmLAotICAgIE9NWF9TOCAqcE51bUNvZWZmLAotICAgIE9NWF9VMzIgblRocmVzaFNBRCwKLSAgICBPTVhfVTMyIGlRUCwKLSAgICBPTVhfVTggYkludHJhCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfR2V0VkxDSW5mbyAgICg2LjMuNS45LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGV4dHJhY3RzIHJ1bi1sZW5ndGggZW5jb2RpbmcgKFJMRSkgaW5mb3JtYXRpb24gZnJvbSB0aGUgCi0gKiBjb2VmZmljaWVudCBtYXRyaXguICBUaGUgcmVzdWx0cyBhcmUgcmV0dXJuZWQgaW4gYW4gT01YVkNNNFAxMFZMQ0luZm8gCi0gKiBzdHJ1Y3R1cmUuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNDb2VmZiAtIHBvaW50ZXIgdG8gdGhlIHRyYW5zZm9ybSBjb2VmZmljaWVudCBtYXRyaXguICA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIHBTY2FuTWF0cml4IC0gcG9pbnRlciB0byB0aGUgc2NhbiBvcmRlciBkZWZpbml0aW9uIG1hdHJpeC4gIEZvciBhIGx1bWEgCi0gKiAgICAgICAgICAgIGJsb2NrIHRoZSBzY2FuIG1hdHJpeCBzaG91bGQgZm9sbG93IFtJU08xNDQ5Ni0xMF0gc2VjdGlvbiA4LjUuNCwgCi0gKiAgICAgICAgICAgIGFuZCBzaG91bGQgY29udGFpbiB0aGUgdmFsdWVzIDAsIDEsIDQsIDgsIDUsIDIsIDMsIDYsIDksIDEyLCAxMywgCi0gKiAgICAgICAgICAgIDEwLCA3LCAxMSwgMTQsIDE1LiAgRm9yIGEgY2hyb21hIGJsb2NrLCB0aGUgc2NhbiBtYXRyaXggc2hvdWxkIAotICogICAgICAgICAgICBjb250YWluIHRoZSB2YWx1ZXMgMCwgMSwgMiwgMy4gCi0gKiAgIGJBQyAtIGluZGljYXRlcyBwcmVzZW5jZSBvZiBhIERDIGNvZWZmaWNpZW50OyAwID0gREMgY29lZmZpY2llbnQgCi0gKiAgICAgICAgICAgIHByZXNlbnQsIDE9IERDIGNvZWZmaWNpZW50IGFic2VudC4gCi0gKiAgIE1heE51bUNvZWYgLSBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgY29udGFpbmVkIGluIHRoZSAKLSAqICAgICAgICAgICAgdHJhbnNmb3JtIGNvZWZmaWNpZW50IG1hdHJpeCwgcFNyY0NvZWZmLiBUaGUgdmFsdWUgc2hvdWxkIGJlIDE2IAotICogICAgICAgICAgICBmb3IgYmxvY2tzIG9mIHR5cGUgTFVNQURDLCBMVU1BQUMsIExVTUFMRVZFTCwgYW5kIENIUk9NQUFDLiBUaGUgCi0gKiAgICAgICAgICAgIHZhbHVlIHNob3VsZCBiZSA0IGZvciBibG9ja3Mgb2YgdHlwZSBDSFJPTUFEQy4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RWTENJbmZvIC0gcG9pbnRlciB0byBzdHJ1Y3R1cmUgdGhhdCBzdG9yZXMgaW5mb3JtYXRpb24gZm9yIAotICogICAgICAgICAgICBydW4tbGVuZ3RoIGNvZGluZy4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgICAgcFNyY0NvZWZmLCBwU2Nhbk1hdHJpeCwgcERzdFZMQ0luZm8gCi0gKiAgICAtICAgIHBTcmNDb2VmZiBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9HZXRWTENJbmZvICgKLSAgICBjb25zdCBPTVhfUzE2ICpwU3JjQ29lZmYsCi0gICAgY29uc3QgT01YX1U4ICpwU2Nhbk1hdHJpeCwKLSAgICBPTVhfVTggYkFDLAotICAgIE9NWF9VMzIgTWF4TnVtQ29lZiwKLSAgICBPTVhWQ000UDEwVkxDSW5mbypwRHN0VkxDSW5mbwotKTsKLQotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiogZW5kIG9mICNkZWZpbmUgX09NWFZDX0hfICovCi0KLS8qKiBFT0YgKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9hcm1WQ0NPTU1fQXZlcmFnZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9hcm1WQ0NPTU1fQXZlcmFnZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2IzN2JmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvYXJtVkNDT01NX0F2ZXJhZ2UuYworKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ0NPTU1fQXZlcmFnZS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgQXZlcmFnZSBvZiB0d28gYmxvY2tzIGlmIHNpemUgaVdpZHRoIFggaUhlaWdodAotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ0NPTU1fQXZlcmFnZQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byBibG9ja3MgYW5kIHN0b3JlcyB0aGUgcmVzdWx0LgotICoKLSAqIFJlbWFya3M6Ci0gKgotICoJW2luXQlwUHJlZDAJCQlQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAKLSAqCVtpbl0JcFByZWQxCQkJUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAxCi0gKglbaW5dCWlQcmVkU3RlcDAJICAgIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAKLSAqCVtpbl0JaVByZWRTdGVwMQkgICAgU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMQotICoJW2luXQlpRHN0U3RlcCAJCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgotICoJW2luXQlpV2lkdGgJCQlXaWR0aCBvZiB0aGUgYmxvY2tzCi0gKglbaW5dCWlIZWlnaHQJCQlIZWlnaHQgb2YgdGhlIGJsb2NrcwotICoJW291dF0JcERzdFByZWQJCVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLSBPTVhSZXN1bHQgYXJtVkNDT01NX0F2ZXJhZ2UgKAotCSBjb25zdCBPTVhfVTgqIAkgICAgcFByZWQwLAotCSBjb25zdCBPTVhfVTgqIAkgICAgcFByZWQxLAkKLQkgT01YX1UzMgkJaVByZWRTdGVwMCwKLQkgT01YX1UzMgkJaVByZWRTdGVwMSwKLQkgT01YX1U4KgkJcERzdFByZWQsCi0JIE9NWF9VMzIJCWlEc3RTdGVwLCAKLQkgT01YX1UzMgkJaVdpZHRoLAotCSBPTVhfVTMyCQlpSGVpZ2h0Ci0pCi17Ci0gICAgT01YX1UzMiAgICAgeCwgeTsKLQotICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLwotICAgIGFybVJldEFyZ0VycklmKHBQcmVkMCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwUHJlZDEgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocERzdFByZWQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0KLSAgICBmb3IgKHkgPSAwOyB5IDwgaUhlaWdodDsgeSsrKQotICAgIHsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IGlXaWR0aDsgeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwRHN0UHJlZCBbeSAqIGlEc3RTdGVwICsgeF0gPSAKLSAgICAgICAgICAgICAgICAoT01YX1U4KSgoKE9NWF9VMzIpcFByZWQwIFt5ICogaVByZWRTdGVwMCArIHhdICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByZWQxIFt5ICogaVByZWRTdGVwMSArIHhdICsgMSkgPj4gMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvYXJtVkNDT01NX1NBRC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9hcm1WQ0NPTU1fU0FELmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1Yjk2ZGMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9hcm1WQ0NPTU1fU0FELmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNDT01NX1NBRC5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgU0FEIGZvciBOeE0gYmxvY2tzCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ0NPTU1fU0FECi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZSB0aGUgU0FEIGZvciBOeE0gYmxvY2tzLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogW2luXQkJcFNyY09yZwkJUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2sKLSAqIFtpbl0JCWlTdGVwT3JnCVN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcgotICogW2luXQkJcFNyY1JlZgkJUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrCi0gKiBbaW5dCQlpU3RlcFJlZglTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyCi0gKiBbaW5dCQlpSGVpZ2h0CQlIZWlnaHQgb2YgdGhlIGJsb2NrCi0gKiBbaW5dCQlpV2lkdGgJCVdpZHRoIG9mIHRoZSBibG9jawotICogW291dF0JcERzdFNBRAkJUG9pbnRlciBvZiByZXN1bHQgU0FECi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotT01YUmVzdWx0IGFybVZDQ09NTV9TQUQoCQotCWNvbnN0IE9NWF9VOCogCXBTcmNPcmcsCi0JT01YX1UzMiAJaVN0ZXBPcmcsCi0JY29uc3QgT01YX1U4KiAJcFNyY1JlZiwKLQlPTVhfVTMyIAlpU3RlcFJlZiwKLQlPTVhfUzMyKglwRHN0U0FELAotCU9NWF9VMzIJCWlIZWlnaHQsCi0JT01YX1UzMgkJaVdpZHRoCi0pCi17Ci0gICAgT01YX0lOVCAgICAgeCwgeTsKLSAgICAKLSAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjT3JnID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocERzdFNBRCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICAKLSAgICAqcERzdFNBRCA9IDA7Ci0gICAgZm9yICh5ID0gMDsgeSA8IGlIZWlnaHQ7IHkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoeCA9IDA7IHggPCBpV2lkdGg7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgKnBEc3RTQUQgKz0gYXJtQWJzKHBTcmNPcmcgWyh5ICogaVN0ZXBPcmcpICsgeF0gLSAKLSAgICAgICAgICAgICAgICAgICAgICAgcFNyY1JlZiBbKHkgKiBpU3RlcFJlZikgKyB4XSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9BdmVyYWdlXzE2eC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQXZlcmFnZV8xNnguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc1YmNhOC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9BdmVyYWdlXzE2eC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ0NPTU1fQXZlcmFnZV8xNnguYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIEF2ZXJhZ2Ugb2YgdHdvIDE2eDE2IG9yIDE2eDggYmxvY2tzCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQXZlcmFnZV8xNnggICAoNi4xLjMuMS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byAxNngxNiBvciAxNng4IGJsb2Nrcy4gIFRoZSAKLSAqIHJlc3VsdCBpcyByb3VuZGVkIGFjY29yZGluZyB0byAoYStiKzEpLzIuICBUaGUgYmxvY2sgYXZlcmFnZSBmdW5jdGlvbiBjYW4gCi0gKiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggaGFsZi1waXhlbCBpbnRlcnBvbGF0aW9uIHRvIG9idGFpbiBxdWFydGVyIAotICogcGl4ZWwgbW90aW9uIGVzdGltYXRlcywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0xMF0sIHN1YmNsYXVzZSA4LjQuMi4yLjEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBQcmVkMCAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgcFByZWQxIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpUHJlZFN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgaVByZWRTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlEc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyIAotICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9ja3MgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RQcmVkIC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAxNi1ieXRlIGFsaWduZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBQcmVkMCwgcFByZWQxLCBvciAKLSAqICAgICAgICAgICAgICBwRHN0UHJlZC4gCi0gKiAgICAtICAgcERzdFByZWQgaXMgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgIC0gICBpUHJlZFN0ZXAwIDw9IDAgb3IgaVByZWRTdGVwMCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgICAtICAgaVByZWRTdGVwMSA8PSAwIG9yIGlQcmVkU3RlcDEgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICogICAgLSAgIGlEc3RTdGVwIDw9IDAgb3IgaURzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICogICAgLSAgIGlIZWlnaHQgaXMgbm90IDggb3IgMTYuIAotICoKLSAqLwotIE9NWFJlc3VsdCBvbXhWQ0NPTU1fQXZlcmFnZV8xNnggKAotCSBjb25zdCBPTVhfVTgqIAkgICAgcFByZWQwLAotCSBjb25zdCBPTVhfVTgqIAkgICAgcFByZWQxLAkKLQkgT01YX1UzMgkJaVByZWRTdGVwMCwKLQkgT01YX1UzMgkJaVByZWRTdGVwMSwKLQkgT01YX1U4KgkJcERzdFByZWQsCi0JIE9NWF9VMzIJCWlEc3RTdGVwLCAKLQkgT01YX1UzMgkJaUhlaWdodAotKQotewotICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLwotICAgIGFybVJldEFyZ0VycklmKHBQcmVkMCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwUHJlZDEgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocERzdFByZWQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlIZWlnaHQgIT0gOCkgJiYgKGlIZWlnaHQgIT0gMTYpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBEc3RQcmVkKSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlQcmVkU3RlcDAgPT0gMCkgfHwgKGlQcmVkU3RlcDAgJiAxNSksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChpUHJlZFN0ZXAxID09IDApIHx8IChpUHJlZFN0ZXAxICYgMTUpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigoaURzdFN0ZXAgPT0gMCkgfHwgKGlEc3RTdGVwICYgMTUpLCBPTVhfU3RzX0JhZEFyZ0VycikKLQotICAgIHJldHVybiBhcm1WQ0NPTU1fQXZlcmFnZSAKLSAgICAgICAgKHBQcmVkMCwgcFByZWQxLCBpUHJlZFN0ZXAwLCBpUHJlZFN0ZXAxLCBwRHN0UHJlZCwgaURzdFN0ZXAsIDE2LCBpSGVpZ2h0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0F2ZXJhZ2VfOHguYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0F2ZXJhZ2VfOHguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMxNGY0My4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9BdmVyYWdlXzh4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDQ09NTV9BdmVyYWdlXzh4LmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSBBdmVyYWdlIG9mIHR3byA4eDQgb3IgOHg4IG9yIDh4MTYgYmxvY2tzCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQXZlcmFnZV84eCAgICg2LjEuMy4xLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGF2ZXJhZ2Ugb2YgdHdvIDh4NCwgOHg4LCBvciA4eDE2IGJsb2Nrcy4gIFRoZSAKLSAqIHJlc3VsdCBpcyByb3VuZGVkIGFjY29yZGluZyB0byAoYStiKzEpLzIuICBUaGUgYmxvY2sgYXZlcmFnZSBmdW5jdGlvbiBjYW4gCi0gKiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggaGFsZi1waXhlbCBpbnRlcnBvbGF0aW9uIHRvIG9idGFpbiBxdWFydGVyIAotICogcGl4ZWwgbW90aW9uIGVzdGltYXRlcywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0xMF0sIHN1YmNsYXVzZSA4LjQuMi4yLjEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBQcmVkMCAgICAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIHBQcmVkMSAgICAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlQcmVkU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogICBpUHJlZFN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaURzdFN0ZXAgICAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gCi0gKiAgIGlIZWlnaHQgICAgLSBIZWlnaHQgb2YgdGhlIGJsb2NrcyAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFByZWQgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuIDgtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCi0gKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwUHJlZDAsIHBQcmVkMSwgb3IgCi0gKiAgICAgICAgICAgICAgcERzdFByZWQuIAotICogICAgLSAgIHBEc3RQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgICAtICAgaVByZWRTdGVwMCA8PSAwIG9yIGlQcmVkU3RlcDAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgaVByZWRTdGVwMSA8PSAwIG9yIGlQcmVkU3RlcDEgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgaURzdFN0ZXAgICA8PSAwIG9yIGlEc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgIGlIZWlnaHQgaXMgbm90IDQsIDgsIG9yIDE2LiAKLSAqCi0gKi8KLSBPTVhSZXN1bHQgb214VkNDT01NX0F2ZXJhZ2VfOHggKAkKLQkgY29uc3QgT01YX1U4KiAJICAgIHBQcmVkMCwKLQkgY29uc3QgT01YX1U4KiAJICAgIHBQcmVkMSwJCi0gICAgIE9NWF9VMzIJCWlQcmVkU3RlcDAsCi0gICAgIE9NWF9VMzIJCWlQcmVkU3RlcDEsCi0JIE9NWF9VOCoJCXBEc3RQcmVkLAotICAgICBPTVhfVTMyCQlpRHN0U3RlcCwgCi0JIE9NWF9VMzIJCWlIZWlnaHQKLSkKLXsKLSAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwUHJlZDAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocFByZWQxID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBEc3RQcmVkID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChpUHJlZFN0ZXAwID09IDApIHx8IChpUHJlZFN0ZXAwICYgNyksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChpUHJlZFN0ZXAxID09IDApIHx8IChpUHJlZFN0ZXAxICYgNyksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChpRHN0U3RlcCA9PSAwKSB8fCAoaURzdFN0ZXAgJiA3KSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlIZWlnaHQgIT0gNCkgJiYgKGlIZWlnaHQgIT0gOCkgJiYgKGlIZWlnaHQgIT0gMTYpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocERzdFByZWQpLCBPTVhfU3RzX0JhZEFyZ0VycikKLQotICAgIHJldHVybiBhcm1WQ0NPTU1fQXZlcmFnZSAKLSAgICAgICAgKHBQcmVkMCwgcFByZWQxLCBpUHJlZFN0ZXAwLCBpUHJlZFN0ZXAxLCBwRHN0UHJlZCwgaURzdFN0ZXAsIDgsIGlIZWlnaHQpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2suYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWY1MjQwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jay5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnRhaW5zIG1vZHVsZSBjb21wdXRpbmcgdGhlIGVycm9yIGZvciBhIE1CIG9mIHNpemUgOHg4Ci0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2sgICAoNi4xLjQuMS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29tcHV0ZXMgdGhlIHRleHR1cmUgZXJyb3Igb2YgdGhlIGJsb2NrLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgc291cmNlIHBsYW5lLiBUaGlzIHNob3VsZCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBzcmNTdGVwIC0gc3RlcCBvZiB0aGUgc291cmNlIHBsYW5lIAotICogICBwU3JjUmVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJ1ZmZlciwgYW4gOHg4IGJsb2NrLiBUaGlzIHNob3VsZCBiZSAKLSAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLCBhbiA4eDggYmxvY2suIFRoaXMgc2hvdWxkIGJlIAotICogICAgICAgICAgICBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjLCBwU3JjUmVmLCBwRHN0LiAKLSAqICAgIC0gICAgcFNyYyBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBTcmNTdGVwIDw9IDAgb3Igc3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICAgcFNyY1JlZiBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBwRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZCAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2soCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICAgT01YX0lOVCBzcmNTdGVwLAotICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCi0gICAgIE9NWF9TMTYgKiBwRHN0Ci0pCi17Ci0KLSAgICBPTVhfSU5UICAgICB4LCB5LCBjb3VudDsKLQotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczhCeXRlQWxpZ25lZChwU3JjKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczhCeXRlQWxpZ25lZChwU3JjUmVmKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczhCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChzcmNTdGVwIDw9IDApIHx8IChzcmNTdGVwICYgNyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQotICAgIC8qIENhbGN1bGF0ZSB0aGUgZXJyb3IgYmxvY2sgKi8KLSAgICBmb3IgKHkgPSAwLCBjb3VudCA9IDA7Ci0gICAgICAgICB5IDwgODsKLSAgICAgICAgIHkrKywgcFNyYyArPSBzcmNTdGVwKQotICAgIHsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKywgY291bnQrKykKLSAgICAgICAgewotICAgICAgICAgICAgcERzdFtjb3VudF0gPSBwU3JjW3hdIC0gcFNyY1JlZltjb3VudF07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLQotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2Y0OGM5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQuYworKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udGFpbnMgbW9kdWxlIGNvbXB1dGluZyB0aGUgZXJyb3IgZm9yIGEgTUIgb2Ygc2l6ZSA4eDgKLSAqIAotICovCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRCAgICg2LjEuNC4xLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb21wdXRlcyB0ZXh0dXJlIGVycm9yIG9mIHRoZSBibG9jazsgYWxzbyByZXR1cm5zIFNBRC4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBzcmNTdGVwIC0gc3RlcCBvZiB0aGUgc291cmNlIHBsYW5lIAotICogICBwU3JjUmVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJ1ZmZlciwgYW4gOHg4IGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIGFuIDh4OCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBwRHN0U0FEIC0gcG9pbnRlciB0byB0aGUgU3VtIG9mIEFic29sdXRlIERpZmZlcmVuY2VzIChTQUQpIHZhbHVlIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIAotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZiwgcERzdCBhbmQgcERzdFNBRC4gCi0gKiAgICAtICAgIHBTcmMgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgU3JjU3RlcCA8PSAwIG9yIHNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgIHBTcmNSZWYgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgcERzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQoCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICAgT01YX0lOVCBzcmNTdGVwLAotICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCi0gICAgIE9NWF9TMTYgKiBwRHN0LAotICAgICBPTVhfSU5UICpwRHN0U0FECi0pCi17Ci0KLSAgICBPTVhfSU5UICAgICB4LCB5LCBjb3VudDsKLQotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBEc3RTQUQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczhCeXRlQWxpZ25lZChwU3JjKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczhCeXRlQWxpZ25lZChwU3JjUmVmKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczhCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChzcmNTdGVwIDw9IDApIHx8IChzcmNTdGVwICYgNyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQotICAgIC8qIENhbGN1bGF0ZSB0aGUgZXJyb3IgYmxvY2sgKi8KLSAgICBmb3IgKHkgPSAwLCBjb3VudCA9IDAsICpwRHN0U0FEID0gMDsKLSAgICAgICAgIHkgPCA4OwotICAgICAgICAgeSsrLCBwU3JjICs9IHNyY1N0ZXApCi0gICAgewotICAgICAgICBmb3IgKHggPSAwOyB4IDwgODsgeCsrLCBjb3VudCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwRHN0W2NvdW50XSA9IHBTcmNbeF0gLSBwU3JjUmVmW2NvdW50XTsKLSAgICAgICAgICAgICpwRHN0U0FEICs9IGFybUFicyhwRHN0W2NvdW50XSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLQotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTE2eDE2LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5MTZ4MTYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU0NjdhNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5MTZ4MTYuYworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ0NPTU1fQ29weTE2eDE2LmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogTVBFRzQgMTZ4MTYgQ29weSBtb2R1bGUKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvcHkxNngxNiAgICg2LjEuMy4zLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb3BpZXMgdGhlIHJlZmVyZW5jZSAxNngxNiBtYWNyb2Jsb2NrIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2suIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgbWFjcm9ibG9jayBpbiB0aGUgc291cmNlIGZyYW1lOyBtdXN0IGJlIAotICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHN0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydHMgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgZnJhbWUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYgYW5kIG11c3QgYmUgbGFyZ2VyIAotICogICAgICAgICAgICB0aGFuIG9yIGVxdWFsIHRvIDE2LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIG1hY3JvYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIAotICogICAgICAgICAgICAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCi0gKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwRHN0IAotICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIAotICogICAgICAgICAgICAgIGJvdW5kYXJ5OiBwU3JjLCBwRHN0IAotICogICAgLSAgICBzdGVwIDwxNiBvciBzdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDQ09NTV9Db3B5MTZ4MTYoCi0JCWNvbnN0IE9NWF9VOCAqcFNyYywgCi0JCU9NWF9VOCAqcERzdCwgCi0JCU9NWF9JTlQgc3RlcCkKLSB7Ci0gICAgLyogRGVmaW5pdGlvbnMgYW5kIEluaXRpYWxpemF0aW9ucyovCi0KLSAgICBPTVhfSU5UIGNvdW50LGluZGV4LCB4LCB5OwotICAgIAotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczE2Qnl0ZUFsaWduZWQocFNyYyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXMxNkJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKChzdGVwIDwgMTYpIHx8IChzdGVwICUgMTYpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIAotICAgIAotICAgIC8qIENvcHlpbmcgdGhlIHJlZiAxNngxNiBibGsgdG8gdGhlIGN1cnIgYmxrICovCi0gICAgZm9yICh5ID0gMCwgY291bnQgPSAwLCBpbmRleCA9IDA7IHkgPCAxNjsgeSsrLCBjb3VudCA9IGNvdW50ICsgc3RlcCAtIDE2KQotICAgIHsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IDE2OyB4KyssIGNvdW50KyssIGluZGV4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBEc3RbaW5kZXhdID0gcFNyY1tjb3VudF07Ci0gICAgICAgIH0gICAgICAgCi0gICAgfQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHk4eDguYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHk4eDguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y1OTY5Yi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5OHg4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNDT01NX0NvcHk4eDguYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBNUEVHNCA4eDggQ29weSBtb2R1bGUKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvcHk4eDggICAoNi4xLjMuMy4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29waWVzIHRoZSByZWZlcmVuY2UgOHg4IGJsb2NrIHRvIHRoZSBjdXJyZW50IGJsb2NrLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIGluIHRoZSBzb3VyY2UgZnJhbWU7IG11c3QgYmUgCi0gKiAgICAgICAgICAgIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgc3RlcCAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0cyBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgcmVmZXJlbmNlIAotICogICAgICAgICAgICBmcmFtZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4IGFuZCBtdXN0IGJlIGxhcmdlciB0aGFuIAotICogICAgICAgICAgICBvciBlcXVhbCB0byA4LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAotICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcERzdCAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKLSAqICAgICAgICAgICAgICBib3VuZGFyeTogcFNyYywgcERzdCAKLSAqICAgIC0gICAgc3RlcCA8OCBvciBzdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNDT01NX0NvcHk4eDgoCi0JCWNvbnN0IE9NWF9VOCAqcFNyYywgCi0JCU9NWF9VOCAqcERzdCwgCi0JCU9NWF9JTlQgc3RlcCkKLSB7Ci0gICAgLyogRGVmaW5pdGlvbnMgYW5kIEluaXRpYWxpemF0aW9ucyovCi0KLSAgICBPTVhfSU5UIGNvdW50LGluZGV4LCB4LCB5OwotICAgIAotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczhCeXRlQWxpZ25lZChwU3JjKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczhCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCgoc3RlcCA8IDgpIHx8IChzdGVwICUgOCkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgCi0gICAgCi0gICAgLyogQ29weWluZyB0aGUgcmVmIDh4OCBibGsgdG8gdGhlIGN1cnIgYmxrICovCi0gICAgZm9yICh5ID0gMCwgY291bnQgPSAwLCBpbmRleCA9IDA7IHkgPCA4OyB5KyssIGNvdW50ID0gY291bnQgKyBzdGVwIC0gOCkKLSAgICB7Ci0gICAgICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyssIGNvdW50KyssIGluZGV4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBEc3RbaW5kZXhdID0gcFNyY1tjb3VudF07Ci0gICAgICAgIH0gICAgICAgCi0gICAgfQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0kuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0kuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM3OWZkMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9FeHBhbmRGcmFtZV9JLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDQ09NTV9FeHBhbmRGcmFtZV9JLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiB3aWxsIEV4cGFuZCBGcmFtZSBib3VuZGFyeSBwaXhlbHMgaW50byBQbGFuZQotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9FeHBhbmRGcmFtZV9JICAgKDYuMS4zLjIuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gZXhwYW5kcyBhIHJlY29uc3RydWN0ZWQgZnJhbWUgaW4tcGxhY2UuICBUaGUgdW5leHBhbmRlZCAKLSAqIHNvdXJjZSBmcmFtZSBzaG91bGQgYmUgc3RvcmVkIGluIGEgcGxhbmUgYnVmZmVyIHdpdGggc3VmZmljaWVudCBzcGFjZSAKLSAqIHByZS1hbGxvY2F0ZWQgZm9yIGVkZ2UgZXhwYW5zaW9uLCBhbmQgdGhlIGlucHV0IGZyYW1lIHNob3VsZCBiZSBsb2NhdGVkIGluIAotICogdGhlIHBsYW5lIGJ1ZmZlciBjZW50ZXIuICBUaGlzIGZ1bmN0aW9uIGV4ZWN1dGVzIHRoZSBwaXhlbCBleHBhbnNpb24gYnkgCi0gKiByZXBsaWNhdGluZyBzb3VyY2UgZnJhbWUgZWRnZSBwaXhlbCBpbnRlbnNpdGllcyBpbiB0aGUgZW1wdHkgcGl4ZWwgCi0gKiBsb2NhdGlvbnMgKGV4cGFuc2lvbiByZWdpb24pIGJldHdlZW4gdGhlIHNvdXJjZSBmcmFtZSBlZGdlIGFuZCB0aGUgcGxhbmUgCi0gKiBidWZmZXIgZWRnZS4gIFRoZSB3aWR0aC9oZWlnaHQgb2YgdGhlIGV4cGFuc2lvbiByZWdpb25zIG9uIHRoZSAKLSAqIGhvcml6b250YWwvdmVydGljYWwgZWRnZXMgaXMgY29udHJvbGxlZCBieSB0aGUgcGFyYW1ldGVyIGlFeHBhbmRQZWxzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0UGxhbmUgLSBwb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGZyYW1lIHRvIGJlIAotICogICAgICAgICAgICBleHBhbmRlZDsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIGlGcmFtZVdpZHRoIC0gZnJhbWUgd2lkdGg7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgaUZyYW1lSGVpZ2h0IC1mcmFtZSBoZWlnaHQ7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgaUV4cGFuZFBlbHMgLSBudW1iZXIgb2YgcGl4ZWxzIHRvIGJlIGV4cGFuZGVkIGluIHRoZSBob3Jpem9udGFsIGFuZCAKLSAqICAgICAgICAgICAgdmVydGljYWwgZGlyZWN0aW9uczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBpUGxhbmVTdGVwIC0gZGlzdGFuY2UsIGluIGJ5dGVzLCBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcyAKLSAqICAgICAgICAgICAgaW4gdGhlIHBsYW5lIGJ1ZmZlcjsgbXVzdCBiZSBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byAKLSAqICAgICAgICAgICAgKGlGcmFtZVdpZHRoICsgMiAqIGlFeHBhbmRQZWxzKS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3RQbGFuZSAtUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBmcmFtZSAoTk9UIHRoZSAKLSAqICAgICAgICAgICAgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBwbGFuZSk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCi0gKiAgICAtICAgIHBTcmNEc3RQbGFuZSBpcyBOVUxMLiAKLSAqICAgIC0gICAgcFNyY0RzdFBsYW5lIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgICAtICAgIG9uZSBvZiB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgaXMgZWl0aGVyIGVxdWFsIHRvIHplcm8gb3IgaXMgYSAKLSAqICAgICAgICAgICAgICBub24tbXVsdGlwbGUgb2YgODogaUZyYW1lSGVpZ2h0LCBpRnJhbWVXaWR0aCwgaVBsYW5lU3RlcCwgb3IgCi0gKiAgICAgICAgICAgICAgaUV4cGFuZFBlbHMuIAotICogICAgLSAgICBpUGxhbmVTdGVwIDwgKGlGcmFtZVdpZHRoICsgMiAqIGlFeHBhbmRQZWxzKS4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNDT01NX0V4cGFuZEZyYW1lX0koCi0JT01YX1U4KglwU3JjRHN0UGxhbmUsIAotCU9NWF9VMzIJaUZyYW1lV2lkdGgsIAotCU9NWF9VMzIJaUZyYW1lSGVpZ2h0LCAKLQlPTVhfVTMyCWlFeHBhbmRQZWxzLCAKLQlPTVhfVTMyCWlQbGFuZVN0ZXAKLSkKLXsKLSAgICBPTVhfSU5UICAgICB4LCB5OwotICAgIE9NWF9VOCogICAgIHBMZWZ0OwotICAgIE9NWF9VOCogICAgIHBSaWdodDsKLSAgICBPTVhfVTgqICAgICBwVG9wOwotICAgIE9NWF9VOCogICAgIHBCb3R0b207Ci0KLSAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0UGxhbmUgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBTcmNEc3RQbGFuZSksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGlGcmFtZVdpZHRoID09IDAgfHwgaUZyYW1lV2lkdGggJiA3LCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihpRnJhbWVIZWlnaHQ9PSAwIHx8IGlGcmFtZUhlaWdodCAmIDcsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGlFeHBhbmRQZWxzID09IDAgfHwgaUV4cGFuZFBlbHMgJiA3LCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihpUGxhbmVTdGVwID09IDAgfHwgaVBsYW5lU3RlcCAmIDcsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGlQbGFuZVN0ZXAgPCAoaUZyYW1lV2lkdGggKyAyICogaUV4cGFuZFBlbHMpLCAKLSAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycikKLQotICAgIC8qIFRvcCBhbmQgQm90dG9tICovCi0gICAgcFRvcCA9IHBTcmNEc3RQbGFuZSAtIChpRXhwYW5kUGVscyAqIGlQbGFuZVN0ZXApOwotICAgIHBCb3R0b20gPSBwU3JjRHN0UGxhbmUgKyAoaUZyYW1lSGVpZ2h0ICogaVBsYW5lU3RlcCk7Ci0KLSAgICBmb3IgKHkgPSAwOyB5IDwgKE9NWF9JTlQpaUV4cGFuZFBlbHM7IHkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoeCA9IDA7IHggPCAoT01YX0lOVClpRnJhbWVXaWR0aDsgeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwVG9wIFt5ICogaVBsYW5lU3RlcCArIHhdID0gCi0gICAgICAgICAgICAgICAgcFNyY0RzdFBsYW5lIFt4XTsKLSAgICAgICAgICAgIHBCb3R0b20gW3kgKiBpUGxhbmVTdGVwICsgeF0gPSAKLSAgICAgICAgICAgICAgICBwU3JjRHN0UGxhbmUgWyhpRnJhbWVIZWlnaHQgLSAxKSAqIGlQbGFuZVN0ZXAgKyB4XTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIExlZnQsIFJpZ2h0IGFuZCBDb3JuZXJzICovCi0gICAgcExlZnQgPSBwU3JjRHN0UGxhbmUgLSBpRXhwYW5kUGVsczsKLSAgICBwUmlnaHQgPSBwU3JjRHN0UGxhbmUgKyBpRnJhbWVXaWR0aDsKLQotICAgIGZvciAoeSA9IC0oT01YX0lOVClpRXhwYW5kUGVsczsgeSA8IChPTVhfSU5UKShpRnJhbWVIZWlnaHQgKyBpRXhwYW5kUGVscyk7IHkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoeCA9IDA7IHggPCAoT01YX0lOVClpRXhwYW5kUGVsczsgeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwTGVmdCBbeSAqIGlQbGFuZVN0ZXAgKyB4XSA9IAotICAgICAgICAgICAgICAgIHBTcmNEc3RQbGFuZSBbeSAqIGlQbGFuZVN0ZXAgKyAwXTsKLSAgICAgICAgICAgIHBSaWdodCBbeSAqIGlQbGFuZVN0ZXAgKyB4XSA9IAotICAgICAgICAgICAgICAgIHBTcmNEc3RQbGFuZSBbeSAqIGlQbGFuZVN0ZXAgKyAoaUZyYW1lV2lkdGggLSAxKV07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0xpbWl0TVZUb1JlY3QuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0xpbWl0TVZUb1JlY3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJhOTA5My4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9MaW1pdE1WVG9SZWN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNDT01NX0xpbWl0TVZUb1JlY3QuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udGFpbnMgbW9kdWxlIGZvciBsaW1pdGluZyB0aGUgTVYKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0xpbWl0TVZUb1JlY3QgICAoNi4xLjQuMS4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogTGltaXRzIHRoZSBtb3Rpb24gdmVjdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBibG9jay9tYWNyb2Jsb2NrIHRvIAotICogcHJldmVudCB0aGUgbW90aW9uIGNvbXBlbnNhdGVkIGJsb2NrL21hY3JvYmxvY2sgZnJvbSBtb3Zpbmcgb3V0c2lkZSBhIAotICogYm91bmRpbmcgcmVjdGFuZ2xlIGFzIHNob3duIGluIEZpZ3VyZSA2LTEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNNViAtIHBvaW50ZXIgdG8gdGhlIG1vdGlvbiB2ZWN0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IGJsb2NrIAotICogICAgICAgICAgICBvciBtYWNyb2Jsb2NrIAotICogICBwUmVjdFZPUFJlZiAtIHBvaW50ZXIgdG8gdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSAKLSAqICAgWGNvb3JkLCBZY29vcmQgIC0gY29vcmRpbmF0ZXMgb2YgdGhlIGN1cnJlbnQgYmxvY2sgb3IgbWFjcm9ibG9jayAKLSAqICAgc2l6ZSAtIHNpemUgb2YgdGhlIGN1cnJlbnQgYmxvY2sgb3IgbWFjcm9ibG9jazsgbXVzdCBiZSBlcXVhbCB0byA4IG9yIAotICogICAgICAgICAgICAxNi4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RNViAtIHBvaW50ZXIgdG8gdGhlIGxpbWl0ZWQgbW90aW9uIHZlY3RvciAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKLSAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmNNViwgcERzdE1WLCBvciBwUmVjdFZPUFJlZi4gCi0gKiAgICAtICAgIHNpemUgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA4IG9yIDE2LiAKLSAqICAgIC0gICAgdGhlIHdpZHRoIG9yIGhlaWdodCBvZiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIGlzIGxlc3MgdGhhbiAKLSAqICAgICAgICAgdHdpY2UgdGhlIGJsb2NrIHNpemUuCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fTGltaXRNVlRvUmVjdCgKLSAgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKiBwU3JjTVYsCi0gICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVYsCi0gICAgIGNvbnN0IE9NWFJlY3QgKiBwUmVjdFZPUFJlZiwKLSAgICAgT01YX0lOVCBYY29vcmQsCi0gICAgIE9NWF9JTlQgWWNvb3JkLAotICAgICBPTVhfSU5UIHNpemUKLSkKLXsKLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjTVYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBEc3RNViA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFJlY3RWT1BSZWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChzaXplICE9IDgpICYmIChzaXplICE9IDE2KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChwUmVjdFZPUFJlZi0+d2lkdGggPCAoMiogc2l6ZSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKHBSZWN0Vk9QUmVmLT5oZWlnaHQgPCAoMiogc2l6ZSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgCi0gICAgcERzdE1WLT5keCA9IGFybU1pbiAoYXJtTWF4IChwU3JjTVYtPmR4LCAyKnBSZWN0Vk9QUmVmLT54IC0gWGNvb3JkKSwKLSAgICAgICAgICAgICAgICAgICAgKDIqcFJlY3RWT1BSZWYtPnggKyBwUmVjdFZPUFJlZi0+d2lkdGggLSBYY29vcmQgLSBzaXplKSk7Ci0gICAgcERzdE1WLT5keSA9IGFybU1pbiAoYXJtTWF4IChwU3JjTVYtPmR5LCAyKnBSZWN0Vk9QUmVmLT55IC0gWWNvb3JkKSwKLSAgICAgICAgICAgICAgICAgICAgKDIqcFJlY3RWT1BSZWYtPnkgKyBwUmVjdFZPUFJlZi0+aGVpZ2h0IC0gWWNvb3JkIC0gc2l6ZSkpOwotCi0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX1NBRF8xNnguYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX1NBRF8xNnguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNkYmJkMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9TQURfMTZ4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNDT01NX1NBRF8xNnguYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIFNBRCBmb3IgMTZ4MTYgYW5kIDE2eDggYmxvY2tzCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fU0FEXzE2eCAgICg2LjEuNC4xLjQpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBmb3IgMTZ4MTYgYW5kIDE2eDggYmxvY2tzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjT3JnIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCi0gKiAgICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIGlTdGVwT3JnIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyIAotICogICBwU3JjUmVmICAtIFBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayAKLSAqICAgaVN0ZXBSZWYgLSBTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyIAotICogICBpSGVpZ2h0ICAtIEhlaWdodCBvZiB0aGUgYmxvY2sgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RTQUQgLSBQb2ludGVyIG9mIHJlc3VsdCBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCi0gKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjT3JnLCBwRHN0U0FELCBvciBwU3JjUmVmIAotICogICAgLSAgICBwU3JjT3JnIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBpU3RlcE9yZyAgPD0gMCBvciBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAKLSAqICAgIC0gICAgaVN0ZXBSZWYgPD0gMCBvciBpU3RlcFJlZiBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAKLSAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgOCBvciAxNiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fU0FEXzE2eCgKLQkJCWNvbnN0IE9NWF9VOCogCXBTcmNPcmcsCi0JCQlPTVhfVTMyIAlpU3RlcE9yZywKLQkJCWNvbnN0IE9NWF9VOCogCXBTcmNSZWYsCi0JCQlPTVhfVTMyIAlpU3RlcFJlZiwKLQkJCU9NWF9TMzIqCXBEc3RTQUQsCi0JCQlPTVhfVTMyCQlpSGVpZ2h0Ci0pCi17Ci0gICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY09yZyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBEc3RTQUQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlIZWlnaHQgIT0gMTYpICYmIChpSGVpZ2h0ICE9IDgpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBTcmNPcmcpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigoaVN0ZXBPcmcgPT0gMCkgfHwgKGlTdGVwT3JnICYgMTUpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigoaVN0ZXBSZWYgPT0gMCkgfHwgKGlTdGVwUmVmICYgMTUpLCBPTVhfU3RzX0JhZEFyZ0VycikKLQotICAgIHJldHVybiBhcm1WQ0NPTU1fU0FEIAotICAgICAgICAocFNyY09yZywgaVN0ZXBPcmcsIHBTcmNSZWYsIGlTdGVwUmVmLCBwRHN0U0FELCBpSGVpZ2h0LCAxNik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9TQURfOHguYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX1NBRF84eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmZkMWVjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX1NBRF84eC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDQ09NTV9TQURfOHguYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIFNBRCBmb3IgOHgxNiwgOHg4LCA4eDQgYmxvY2tzCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fU0FEXzh4ICAgKDYuMS40LjEuNSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGZvciA4eDE2LCA4eDgsIDh4NCBibG9ja3MuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNPcmcgIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDgtYnl0ZSAKLSAqICAgICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIGlTdGVwT3JnIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyIAotICogICBwU3JjUmVmICAtIFBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayAKLSAqICAgaVN0ZXBSZWYgLSBTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyIAotICogICBpSGVpZ2h0ICAtIEhlaWdodCBvZiB0aGUgYmxvY2sgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RTQUQgLVBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKLSAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmNPcmcsIHBEc3RTQUQsIG9yIHBTcmNSZWYgCi0gKiAgICAtICAgIHBTcmNPcmcgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgaVN0ZXBPcmcgIDw9IDAgb3IgaVN0ZXBPcmcgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCAKLSAqICAgIC0gICAgaVN0ZXBSZWYgPD0gMCBvciBpU3RlcFJlZiBpcyBub3QgYSBtdWx0aXBsZSBvZiA4IAotICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCA0LCA4IG9yIDE2IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDQ09NTV9TQURfOHgoCQotCWNvbnN0IE9NWF9VOCogCXBTcmNPcmcsCi0JT01YX1UzMiAJaVN0ZXBPcmcsCi0JY29uc3QgT01YX1U4KiAJcFNyY1JlZiwKLQlPTVhfVTMyIAlpU3RlcFJlZiwKLQlPTVhfUzMyKglwRHN0U0FELAotCU9NWF9VMzIJCWlIZWlnaHQKLSkKLXsKLSAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjT3JnID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocERzdFNBRCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigoaUhlaWdodCAhPSAxNikgJiYgKGlIZWlnaHQgIT0gOCkgJiYgKGlIZWlnaHQgIT0gNCksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwU3JjT3JnKSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlTdGVwT3JnID09IDApIHx8IChpU3RlcE9yZyAmIDcpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigoaVN0ZXBSZWYgPT0gMCkgfHwgKGlTdGVwUmVmICYgNyksIE9NWF9TdHNfQmFkQXJnRXJyKQotCi0gICAgcmV0dXJuIGFybVZDQ09NTV9TQUQgCi0gICAgICAgIChwU3JjT3JnLCBpU3RlcE9yZywgcFNyY1JlZiwgaVN0ZXBSZWYsIHBEc3RTQUQsIGlIZWlnaHQsIDgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9hcGkvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9hcGkvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzI0MWNhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvYXBpL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIAotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBGaWxlOiAgICAgYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAKLSAqIEhlYWRlciBmaWxlIGZvciBBUk0gaW1wbGVtZW50YXRpb24gb2YgT3Blbk1BWCBWQ000UDEwCi0gKiAKLSAqLwotIAotI2lmbmRlZiBBUk1WQ000UDEwX0NBVkxDVEFCTEVTX0gKLSNkZWZpbmUgQVJNVkNNNFAxMF9DQVZMQ1RBQkxFU19ICi0gIAotLyogQ0FWTEMgdGFibGVzICovCi0KLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9DQVZMQ1RyYWlsaW5nT25lc1s2Ml07Ci1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMTBfQ0FWTENUb3RhbENvZWZmWzYyXTsKLWV4dGVybiBjb25zdCBBUk1fVkxDMzIgKmFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzWzVdOwotZXh0ZXJuIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDTGV2ZWxQcmVmaXhbMTddOwotZXh0ZXJuIGNvbnN0IEFSTV9WTEMzMiAqYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc1sxNV07Ci1leHRlcm4gY29uc3QgQVJNX1ZMQzMyICphcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc1szXTsKLWV4dGVybiBjb25zdCBBUk1fVkxDMzIgKmFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNbN107Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGEzMDc0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDcxOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIAotICogQ0FWTEMgdGFibGVzIGZvciBILjI2NAotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oIgotCi0vKiBUYWJsZXMgbWFwcGluZyBhIGNvZGUgdG8gVHJhaWxpbmdPbmVzIGFuZCBUb3RhbENvZWZmICovCi0KLWNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX0NBVkxDVHJhaWxpbmdPbmVzWzYyXSA9IHsKLSAwLAotIDAsIDEsCi0gMCwgMSwgMiwKLSAwLCAxLCAyLCAzLAotIDAsIDEsIDIsIDMsCi0gMCwgMSwgMiwgMywKLSAwLCAxLCAyLCAzLAotIDAsIDEsIDIsIDMsCi0gMCwgMSwgMiwgMywKLSAwLCAxLCAyLCAzLAotIDAsIDEsIDIsIDMsCi0gMCwgMSwgMiwgMywKLSAwLCAxLCAyLCAzLAotIDAsIDEsIDIsIDMsCi0gMCwgMSwgMiwgMywKLSAwLCAxLCAyLCAzLAotIDAsIDEsIDIsIDMKLX07Ci0KLWNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX0NBVkxDVG90YWxDb2VmZls2Ml0gPSB7Ci0gMCwKLSAxLCAxLAotIDIsIDIsIDIsCi0gMywgMywgMywgMywKLSA0LCA0LCA0LCA0LAotIDUsIDUsIDUsIDUsCi0gNiwgNiwgNiwgNiwKLSA3LCA3LCA3LCA3LAotIDgsIDgsIDgsIDgsCi0gOSwgOSwgOSwgOSwKLSAxMCwgMTAsIDEwLCAxMCwKLSAxMSwgMTEsIDExLCAxMSwKLSAxMiwgMTIsIDEyLCAxMiwKLSAxMywgMTMsIDEzLCAxMywKLSAxNCwgMTQsIDE0LCAxNCwKLSAxNSwgMTUsIDE1LCAxNSwKLSAxNiwgMTYsIDE2LCAxNgotfTsKLQotc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlbjBbNjNdID0gewotICAgIHsgIDEsIDB4MDAwMSB9LAotICAgIHsgIDYsIDB4MDAwNSB9LAotICAgIHsgIDIsIDB4MDAwMSB9LAotICAgIHsgIDgsIDB4MDAwNyB9LAotICAgIHsgIDYsIDB4MDAwNCB9LAotICAgIHsgIDMsIDB4MDAwMSB9LAotICAgIHsgIDksIDB4MDAwNyB9LAotICAgIHsgIDgsIDB4MDAwNiB9LAotICAgIHsgIDcsIDB4MDAwNSB9LAotICAgIHsgIDUsIDB4MDAwMyB9LAotICAgIHsgMTAsIDB4MDAwNyB9LAotICAgIHsgIDksIDB4MDAwNiB9LAotICAgIHsgIDgsIDB4MDAwNSB9LAotICAgIHsgIDYsIDB4MDAwMyB9LAotICAgIHsgMTEsIDB4MDAwNyB9LAotICAgIHsgMTAsIDB4MDAwNiB9LAotICAgIHsgIDksIDB4MDAwNSB9LAotICAgIHsgIDcsIDB4MDAwNCB9LAotICAgIHsgMTMsIDB4MDAwZiB9LAotICAgIHsgMTEsIDB4MDAwNiB9LAotICAgIHsgMTAsIDB4MDAwNSB9LAotICAgIHsgIDgsIDB4MDAwNCB9LAotICAgIHsgMTMsIDB4MDAwYiB9LAotICAgIHsgMTMsIDB4MDAwZSB9LAotICAgIHsgMTEsIDB4MDAwNSB9LAotICAgIHsgIDksIDB4MDAwNCB9LAotICAgIHsgMTMsIDB4MDAwOCB9LAotICAgIHsgMTMsIDB4MDAwYSB9LAotICAgIHsgMTMsIDB4MDAwZCB9LAotICAgIHsgMTAsIDB4MDAwNCB9LAotICAgIHsgMTQsIDB4MDAwZiB9LAotICAgIHsgMTQsIDB4MDAwZSB9LAotICAgIHsgMTMsIDB4MDAwOSB9LAotICAgIHsgMTEsIDB4MDAwNCB9LAotICAgIHsgMTQsIDB4MDAwYiB9LAotICAgIHsgMTQsIDB4MDAwYSB9LAotICAgIHsgMTQsIDB4MDAwZCB9LAotICAgIHsgMTMsIDB4MDAwYyB9LAotICAgIHsgMTUsIDB4MDAwZiB9LAotICAgIHsgMTUsIDB4MDAwZSB9LAotICAgIHsgMTQsIDB4MDAwOSB9LAotICAgIHsgMTQsIDB4MDAwYyB9LAotICAgIHsgMTUsIDB4MDAwYiB9LAotICAgIHsgMTUsIDB4MDAwYSB9LAotICAgIHsgMTUsIDB4MDAwZCB9LAotICAgIHsgMTQsIDB4MDAwOCB9LAotICAgIHsgMTYsIDB4MDAwZiB9LAotICAgIHsgMTUsIDB4MDAwMSB9LAotICAgIHsgMTUsIDB4MDAwOSB9LAotICAgIHsgMTUsIDB4MDAwYyB9LAotICAgIHsgMTYsIDB4MDAwYiB9LAotICAgIHsgMTYsIDB4MDAwZSB9LAotICAgIHsgMTYsIDB4MDAwZCB9LAotICAgIHsgMTUsIDB4MDAwOCB9LAotICAgIHsgMTYsIDB4MDAwNyB9LAotICAgIHsgMTYsIDB4MDAwYSB9LAotICAgIHsgMTYsIDB4MDAwOSB9LAotICAgIHsgMTYsIDB4MDAwYyB9LAotICAgIHsgMTYsIDB4MDAwNCB9LAotICAgIHsgMTYsIDB4MDAwNiB9LAotICAgIHsgMTYsIDB4MDAwNSB9LAotICAgIHsgMTYsIDB4MDAwOCB9LAotICAgIHsgIDAsIDB4MDAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuMVs2M10gPSB7Ci0gICAgeyAgMiwgMHgwMDAzIH0sCi0gICAgeyAgNiwgMHgwMDBiIH0sCi0gICAgeyAgMiwgMHgwMDAyIH0sCi0gICAgeyAgNiwgMHgwMDA3IH0sCi0gICAgeyAgNSwgMHgwMDA3IH0sCi0gICAgeyAgMywgMHgwMDAzIH0sCi0gICAgeyAgNywgMHgwMDA3IH0sCi0gICAgeyAgNiwgMHgwMDBhIH0sCi0gICAgeyAgNiwgMHgwMDA5IH0sCi0gICAgeyAgNCwgMHgwMDA1IH0sCi0gICAgeyAgOCwgMHgwMDA3IH0sCi0gICAgeyAgNiwgMHgwMDA2IH0sCi0gICAgeyAgNiwgMHgwMDA1IH0sCi0gICAgeyAgNCwgMHgwMDA0IH0sCi0gICAgeyAgOCwgMHgwMDA0IH0sCi0gICAgeyAgNywgMHgwMDA2IH0sCi0gICAgeyAgNywgMHgwMDA1IH0sCi0gICAgeyAgNSwgMHgwMDA2IH0sCi0gICAgeyAgOSwgMHgwMDA3IH0sCi0gICAgeyAgOCwgMHgwMDA2IH0sCi0gICAgeyAgOCwgMHgwMDA1IH0sCi0gICAgeyAgNiwgMHgwMDA4IH0sCi0gICAgeyAxMSwgMHgwMDBmIH0sCi0gICAgeyAgOSwgMHgwMDA2IH0sCi0gICAgeyAgOSwgMHgwMDA1IH0sCi0gICAgeyAgNiwgMHgwMDA0IH0sCi0gICAgeyAxMSwgMHgwMDBiIH0sCi0gICAgeyAxMSwgMHgwMDBlIH0sCi0gICAgeyAxMSwgMHgwMDBkIH0sCi0gICAgeyAgNywgMHgwMDA0IH0sCi0gICAgeyAxMiwgMHgwMDBmIH0sCi0gICAgeyAxMSwgMHgwMDBhIH0sCi0gICAgeyAxMSwgMHgwMDA5IH0sCi0gICAgeyAgOSwgMHgwMDA0IH0sCi0gICAgeyAxMiwgMHgwMDBiIH0sCi0gICAgeyAxMiwgMHgwMDBlIH0sCi0gICAgeyAxMiwgMHgwMDBkIH0sCi0gICAgeyAxMSwgMHgwMDBjIH0sCi0gICAgeyAxMiwgMHgwMDA4IH0sCi0gICAgeyAxMiwgMHgwMDBhIH0sCi0gICAgeyAxMiwgMHgwMDA5IH0sCi0gICAgeyAxMSwgMHgwMDA4IH0sCi0gICAgeyAxMywgMHgwMDBmIH0sCi0gICAgeyAxMywgMHgwMDBlIH0sCi0gICAgeyAxMywgMHgwMDBkIH0sCi0gICAgeyAxMiwgMHgwMDBjIH0sCi0gICAgeyAxMywgMHgwMDBiIH0sCi0gICAgeyAxMywgMHgwMDBhIH0sCi0gICAgeyAxMywgMHgwMDA5IH0sCi0gICAgeyAxMywgMHgwMDBjIH0sCi0gICAgeyAxMywgMHgwMDA3IH0sCi0gICAgeyAxNCwgMHgwMDBiIH0sCi0gICAgeyAxMywgMHgwMDA2IH0sCi0gICAgeyAxMywgMHgwMDA4IH0sCi0gICAgeyAxNCwgMHgwMDA5IH0sCi0gICAgeyAxNCwgMHgwMDA4IH0sCi0gICAgeyAxNCwgMHgwMDBhIH0sCi0gICAgeyAxMywgMHgwMDAxIH0sCi0gICAgeyAxNCwgMHgwMDA3IH0sCi0gICAgeyAxNCwgMHgwMDA2IH0sCi0gICAgeyAxNCwgMHgwMDA1IH0sCi0gICAgeyAxNCwgMHgwMDA0IH0sCi0gICAgeyAgMCwgMHgwMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW4yWzYzXSA9IHsKLSAgICB7ICA0LCAweDAwMGYgfSwKLSAgICB7ICA2LCAweDAwMGYgfSwKLSAgICB7ICA0LCAweDAwMGUgfSwKLSAgICB7ICA2LCAweDAwMGIgfSwKLSAgICB7ICA1LCAweDAwMGYgfSwKLSAgICB7ICA0LCAweDAwMGQgfSwKLSAgICB7ICA2LCAweDAwMDggfSwKLSAgICB7ICA1LCAweDAwMGMgfSwKLSAgICB7ICA1LCAweDAwMGUgfSwKLSAgICB7ICA0LCAweDAwMGMgfSwKLSAgICB7ICA3LCAweDAwMGYgfSwKLSAgICB7ICA1LCAweDAwMGEgfSwKLSAgICB7ICA1LCAweDAwMGIgfSwKLSAgICB7ICA0LCAweDAwMGIgfSwKLSAgICB7ICA3LCAweDAwMGIgfSwKLSAgICB7ICA1LCAweDAwMDggfSwKLSAgICB7ICA1LCAweDAwMDkgfSwKLSAgICB7ICA0LCAweDAwMGEgfSwKLSAgICB7ICA3LCAweDAwMDkgfSwKLSAgICB7ICA2LCAweDAwMGUgfSwKLSAgICB7ICA2LCAweDAwMGQgfSwKLSAgICB7ICA0LCAweDAwMDkgfSwKLSAgICB7ICA3LCAweDAwMDggfSwKLSAgICB7ICA2LCAweDAwMGEgfSwKLSAgICB7ICA2LCAweDAwMDkgfSwKLSAgICB7ICA0LCAweDAwMDggfSwKLSAgICB7ICA4LCAweDAwMGYgfSwKLSAgICB7ICA3LCAweDAwMGUgfSwKLSAgICB7ICA3LCAweDAwMGQgfSwKLSAgICB7ICA1LCAweDAwMGQgfSwKLSAgICB7ICA4LCAweDAwMGIgfSwKLSAgICB7ICA4LCAweDAwMGUgfSwKLSAgICB7ICA3LCAweDAwMGEgfSwKLSAgICB7ICA2LCAweDAwMGMgfSwKLSAgICB7ICA5LCAweDAwMGYgfSwKLSAgICB7ICA4LCAweDAwMGEgfSwKLSAgICB7ICA4LCAweDAwMGQgfSwKLSAgICB7ICA3LCAweDAwMGMgfSwKLSAgICB7ICA5LCAweDAwMGIgfSwKLSAgICB7ICA5LCAweDAwMGUgfSwKLSAgICB7ICA4LCAweDAwMDkgfSwKLSAgICB7ICA4LCAweDAwMGMgfSwKLSAgICB7ICA5LCAweDAwMDggfSwKLSAgICB7ICA5LCAweDAwMGEgfSwKLSAgICB7ICA5LCAweDAwMGQgfSwKLSAgICB7ICA4LCAweDAwMDggfSwKLSAgICB7IDEwLCAweDAwMGQgfSwKLSAgICB7ICA5LCAweDAwMDcgfSwKLSAgICB7ICA5LCAweDAwMDkgfSwKLSAgICB7ICA5LCAweDAwMGMgfSwKLSAgICB7IDEwLCAweDAwMDkgfSwKLSAgICB7IDEwLCAweDAwMGMgfSwKLSAgICB7IDEwLCAweDAwMGIgfSwKLSAgICB7IDEwLCAweDAwMGEgfSwKLSAgICB7IDEwLCAweDAwMDUgfSwKLSAgICB7IDEwLCAweDAwMDggfSwKLSAgICB7IDEwLCAweDAwMDcgfSwKLSAgICB7IDEwLCAweDAwMDYgfSwKLSAgICB7IDEwLCAweDAwMDEgfSwKLSAgICB7IDEwLCAweDAwMDQgfSwKLSAgICB7IDEwLCAweDAwMDMgfSwKLSAgICB7IDEwLCAweDAwMDIgfSwKLSAgICB7ICAwLCAweDAwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlbjNbNjNdID0gewotICAgIHsgIDYsIDB4MDAwMyB9LAotICAgIHsgIDYsIDB4MDAwMCB9LAotICAgIHsgIDYsIDB4MDAwMSB9LAotICAgIHsgIDYsIDB4MDAwNCB9LAotICAgIHsgIDYsIDB4MDAwNSB9LAotICAgIHsgIDYsIDB4MDAwNiB9LAotICAgIHsgIDYsIDB4MDAwOCB9LAotICAgIHsgIDYsIDB4MDAwOSB9LAotICAgIHsgIDYsIDB4MDAwYSB9LAotICAgIHsgIDYsIDB4MDAwYiB9LAotICAgIHsgIDYsIDB4MDAwYyB9LAotICAgIHsgIDYsIDB4MDAwZCB9LAotICAgIHsgIDYsIDB4MDAwZSB9LAotICAgIHsgIDYsIDB4MDAwZiB9LAotICAgIHsgIDYsIDB4MDAxMCB9LAotICAgIHsgIDYsIDB4MDAxMSB9LAotICAgIHsgIDYsIDB4MDAxMiB9LAotICAgIHsgIDYsIDB4MDAxMyB9LAotICAgIHsgIDYsIDB4MDAxNCB9LAotICAgIHsgIDYsIDB4MDAxNSB9LAotICAgIHsgIDYsIDB4MDAxNiB9LAotICAgIHsgIDYsIDB4MDAxNyB9LAotICAgIHsgIDYsIDB4MDAxOCB9LAotICAgIHsgIDYsIDB4MDAxOSB9LAotICAgIHsgIDYsIDB4MDAxYSB9LAotICAgIHsgIDYsIDB4MDAxYiB9LAotICAgIHsgIDYsIDB4MDAxYyB9LAotICAgIHsgIDYsIDB4MDAxZCB9LAotICAgIHsgIDYsIDB4MDAxZSB9LAotICAgIHsgIDYsIDB4MDAxZiB9LAotICAgIHsgIDYsIDB4MDAyMCB9LAotICAgIHsgIDYsIDB4MDAyMSB9LAotICAgIHsgIDYsIDB4MDAyMiB9LAotICAgIHsgIDYsIDB4MDAyMyB9LAotICAgIHsgIDYsIDB4MDAyNCB9LAotICAgIHsgIDYsIDB4MDAyNSB9LAotICAgIHsgIDYsIDB4MDAyNiB9LAotICAgIHsgIDYsIDB4MDAyNyB9LAotICAgIHsgIDYsIDB4MDAyOCB9LAotICAgIHsgIDYsIDB4MDAyOSB9LAotICAgIHsgIDYsIDB4MDAyYSB9LAotICAgIHsgIDYsIDB4MDAyYiB9LAotICAgIHsgIDYsIDB4MDAyYyB9LAotICAgIHsgIDYsIDB4MDAyZCB9LAotICAgIHsgIDYsIDB4MDAyZSB9LAotICAgIHsgIDYsIDB4MDAyZiB9LAotICAgIHsgIDYsIDB4MDAzMCB9LAotICAgIHsgIDYsIDB4MDAzMSB9LAotICAgIHsgIDYsIDB4MDAzMiB9LAotICAgIHsgIDYsIDB4MDAzMyB9LAotICAgIHsgIDYsIDB4MDAzNCB9LAotICAgIHsgIDYsIDB4MDAzNSB9LAotICAgIHsgIDYsIDB4MDAzNiB9LAotICAgIHsgIDYsIDB4MDAzNyB9LAotICAgIHsgIDYsIDB4MDAzOCB9LAotICAgIHsgIDYsIDB4MDAzOSB9LAotICAgIHsgIDYsIDB4MDAzYSB9LAotICAgIHsgIDYsIDB4MDAzYiB9LAotICAgIHsgIDYsIDB4MDAzYyB9LAotICAgIHsgIDYsIDB4MDAzZCB9LAotICAgIHsgIDYsIDB4MDAzZSB9LAotICAgIHsgIDYsIDB4MDAzZiB9LAotICAgIHsgIDAsIDB4MDAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuNFsxNV0gPSB7Ci0gICAgeyAgMiwgMHgwMDAxIH0sCi0gICAgeyAgNiwgMHgwMDA3IH0sCi0gICAgeyAgMSwgMHgwMDAxIH0sCi0gICAgeyAgNiwgMHgwMDA0IH0sCi0gICAgeyAgNiwgMHgwMDA2IH0sCi0gICAgeyAgMywgMHgwMDAxIH0sCi0gICAgeyAgNiwgMHgwMDAzIH0sCi0gICAgeyAgNywgMHgwMDAzIH0sCi0gICAgeyAgNywgMHgwMDAyIH0sCi0gICAgeyAgNiwgMHgwMDA1IH0sCi0gICAgeyAgNiwgMHgwMDAyIH0sCi0gICAgeyAgOCwgMHgwMDAzIH0sCi0gICAgeyAgOCwgMHgwMDAyIH0sCi0gICAgeyAgNywgMHgwMDAwIH0sCi0gICAgeyAgMCwgMHgwMDAwIH0KLX07Ci0KLQotY29uc3QgQVJNX1ZMQzMyICphcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc1s1XSA9IHsKLSAgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW4wLCAKLSAgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW4xLAotICAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlbjIsIAotICAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlbjMsIAotICAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlbjQKLX07Ci0KLS8qIFRhYmxlIGZvciBsZXZlbF9wcmVmaXggKi8KLQotY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENMZXZlbFByZWZpeFsxN10gPSB7Ci0gICAgeyAgMSwgMX0sCi0gICAgeyAgMiwgMX0sCi0gICAgeyAgMywgMX0sCi0gICAgeyAgNCwgMX0sCi0gICAgeyAgNSwgMX0sCi0gICAgeyAgNiwgMX0sCi0gICAgeyAgNywgMX0sCi0gICAgeyAgOCwgMX0sCi0gICAgeyAgOSwgMX0sCi0gICAgeyAxMCwgMX0sCi0gICAgeyAxMSwgMX0sCi0gICAgeyAxMiwgMX0sCi0gICAgeyAxMywgMX0sCi0gICAgeyAxNCwgMX0sCi0gICAgeyAxNSwgMX0sCi0gICAgeyAxNiwgMX0sCi0gICAgeyAgMCwgMH0KLX07Ci0KLS8qIFRhYmxlcyBmb3IgdG90YWxfemVyb3MgKi8KLQotc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczFbMTddID0gewotICAgIHsgIDEsIDB4MDAwMSB9LAotICAgIHsgIDMsIDB4MDAwMyB9LAotICAgIHsgIDMsIDB4MDAwMiB9LAotICAgIHsgIDQsIDB4MDAwMyB9LAotICAgIHsgIDQsIDB4MDAwMiB9LAotICAgIHsgIDUsIDB4MDAwMyB9LAotICAgIHsgIDUsIDB4MDAwMiB9LAotICAgIHsgIDYsIDB4MDAwMyB9LAotICAgIHsgIDYsIDB4MDAwMiB9LAotICAgIHsgIDcsIDB4MDAwMyB9LAotICAgIHsgIDcsIDB4MDAwMiB9LAotICAgIHsgIDgsIDB4MDAwMyB9LAotICAgIHsgIDgsIDB4MDAwMiB9LAotICAgIHsgIDksIDB4MDAwMyB9LAotICAgIHsgIDksIDB4MDAwMiB9LAotICAgIHsgIDksIDB4MDAwMSB9LAotICAgIHsgIDAsIDB4MDAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMlsxNl0gPSB7Ci0gICAgeyAgMywgMHgwMDA3IH0sCi0gICAgeyAgMywgMHgwMDA2IH0sCi0gICAgeyAgMywgMHgwMDA1IH0sCi0gICAgeyAgMywgMHgwMDA0IH0sCi0gICAgeyAgMywgMHgwMDAzIH0sCi0gICAgeyAgNCwgMHgwMDA1IH0sCi0gICAgeyAgNCwgMHgwMDA0IH0sCi0gICAgeyAgNCwgMHgwMDAzIH0sCi0gICAgeyAgNCwgMHgwMDAyIH0sCi0gICAgeyAgNSwgMHgwMDAzIH0sCi0gICAgeyAgNSwgMHgwMDAyIH0sCi0gICAgeyAgNiwgMHgwMDAzIH0sCi0gICAgeyAgNiwgMHgwMDAyIH0sCi0gICAgeyAgNiwgMHgwMDAxIH0sCi0gICAgeyAgNiwgMHgwMDAwIH0sCi0gICAgeyAgMCwgMHgwMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MzWzE1XSA9IHsKLSAgICB7ICA0LCAweDAwMDUgfSwKLSAgICB7ICAzLCAweDAwMDcgfSwKLSAgICB7ICAzLCAweDAwMDYgfSwKLSAgICB7ICAzLCAweDAwMDUgfSwKLSAgICB7ICA0LCAweDAwMDQgfSwKLSAgICB7ICA0LCAweDAwMDMgfSwKLSAgICB7ICAzLCAweDAwMDQgfSwKLSAgICB7ICAzLCAweDAwMDMgfSwKLSAgICB7ICA0LCAweDAwMDIgfSwKLSAgICB7ICA1LCAweDAwMDMgfSwKLSAgICB7ICA1LCAweDAwMDIgfSwKLSAgICB7ICA2LCAweDAwMDEgfSwKLSAgICB7ICA1LCAweDAwMDEgfSwKLSAgICB7ICA2LCAweDAwMDAgfSwKLSAgICB7ICAwLCAweDAwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczRbMTRdID0gewotICAgIHsgIDUsIDB4MDAwMyB9LAotICAgIHsgIDMsIDB4MDAwNyB9LAotICAgIHsgIDQsIDB4MDAwNSB9LAotICAgIHsgIDQsIDB4MDAwNCB9LAotICAgIHsgIDMsIDB4MDAwNiB9LAotICAgIHsgIDMsIDB4MDAwNSB9LAotICAgIHsgIDMsIDB4MDAwNCB9LAotICAgIHsgIDQsIDB4MDAwMyB9LAotICAgIHsgIDMsIDB4MDAwMyB9LAotICAgIHsgIDQsIDB4MDAwMiB9LAotICAgIHsgIDUsIDB4MDAwMiB9LAotICAgIHsgIDUsIDB4MDAwMSB9LAotICAgIHsgIDUsIDB4MDAwMCB9LAotICAgIHsgIDAsIDB4MDAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zNVsxM10gPSB7Ci0gICAgeyAgNCwgMHgwMDA1IH0sCi0gICAgeyAgNCwgMHgwMDA0IH0sCi0gICAgeyAgNCwgMHgwMDAzIH0sCi0gICAgeyAgMywgMHgwMDA3IH0sCi0gICAgeyAgMywgMHgwMDA2IH0sCi0gICAgeyAgMywgMHgwMDA1IH0sCi0gICAgeyAgMywgMHgwMDA0IH0sCi0gICAgeyAgMywgMHgwMDAzIH0sCi0gICAgeyAgNCwgMHgwMDAyIH0sCi0gICAgeyAgNSwgMHgwMDAxIH0sCi0gICAgeyAgNCwgMHgwMDAxIH0sCi0gICAgeyAgNSwgMHgwMDAwIH0sCi0gICAgeyAgMCwgMHgwMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3M2WzEyXSA9IHsKLSAgICB7ICA2LCAweDAwMDEgfSwKLSAgICB7ICA1LCAweDAwMDEgfSwKLSAgICB7ICAzLCAweDAwMDcgfSwKLSAgICB7ICAzLCAweDAwMDYgfSwKLSAgICB7ICAzLCAweDAwMDUgfSwKLSAgICB7ICAzLCAweDAwMDQgfSwKLSAgICB7ICAzLCAweDAwMDMgfSwKLSAgICB7ICAzLCAweDAwMDIgfSwKLSAgICB7ICA0LCAweDAwMDEgfSwKLSAgICB7ICAzLCAweDAwMDEgfSwKLSAgICB7ICA2LCAweDAwMDAgfSwKLSAgICB7ICAwLCAweDAwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczdbMTFdID0gewotICAgIHsgIDYsIDB4MDAwMSB9LAotICAgIHsgIDUsIDB4MDAwMSB9LAotICAgIHsgIDMsIDB4MDAwNSB9LAotICAgIHsgIDMsIDB4MDAwNCB9LAotICAgIHsgIDMsIDB4MDAwMyB9LAotICAgIHsgIDIsIDB4MDAwMyB9LAotICAgIHsgIDMsIDB4MDAwMiB9LAotICAgIHsgIDQsIDB4MDAwMSB9LAotICAgIHsgIDMsIDB4MDAwMSB9LAotICAgIHsgIDYsIDB4MDAwMCB9LAotICAgIHsgIDAsIDB4MDAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zOFsxMF0gPSB7Ci0gICAgeyAgNiwgMHgwMDAxIH0sCi0gICAgeyAgNCwgMHgwMDAxIH0sCi0gICAgeyAgNSwgMHgwMDAxIH0sCi0gICAgeyAgMywgMHgwMDAzIH0sCi0gICAgeyAgMiwgMHgwMDAzIH0sCi0gICAgeyAgMiwgMHgwMDAyIH0sCi0gICAgeyAgMywgMHgwMDAyIH0sCi0gICAgeyAgMywgMHgwMDAxIH0sCi0gICAgeyAgNiwgMHgwMDAwIH0sCi0gICAgeyAgMCwgMHgwMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3M5WzldID0gewotICAgIHsgIDYsIDB4MDAwMSB9LAotICAgIHsgIDYsIDB4MDAwMCB9LAotICAgIHsgIDQsIDB4MDAwMSB9LAotICAgIHsgIDIsIDB4MDAwMyB9LAotICAgIHsgIDIsIDB4MDAwMiB9LAotICAgIHsgIDMsIDB4MDAwMSB9LAotICAgIHsgIDIsIDB4MDAwMSB9LAotICAgIHsgIDUsIDB4MDAwMSB9LAotICAgIHsgIDAsIDB4MDAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMTBbOF0gPSB7Ci0gICAgeyAgNSwgMHgwMDAxIH0sCi0gICAgeyAgNSwgMHgwMDAwIH0sCi0gICAgeyAgMywgMHgwMDAxIH0sCi0gICAgeyAgMiwgMHgwMDAzIH0sCi0gICAgeyAgMiwgMHgwMDAyIH0sCi0gICAgeyAgMiwgMHgwMDAxIH0sCi0gICAgeyAgNCwgMHgwMDAxIH0sCi0gICAgeyAgMCwgMHgwMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MxMVs3XSA9IHsKLSAgICB7ICA0LCAweDAwMDAgfSwKLSAgICB7ICA0LCAweDAwMDEgfSwKLSAgICB7ICAzLCAweDAwMDEgfSwKLSAgICB7ICAzLCAweDAwMDIgfSwKLSAgICB7ICAxLCAweDAwMDEgfSwKLSAgICB7ICAzLCAweDAwMDMgfSwKLSAgICB7ICAwLCAweDAwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczEyWzZdID0gewotICAgIHsgIDQsIDB4MDAwMCB9LAotICAgIHsgIDQsIDB4MDAwMSB9LAotICAgIHsgIDIsIDB4MDAwMSB9LAotICAgIHsgIDEsIDB4MDAwMSB9LAotICAgIHsgIDMsIDB4MDAwMSB9LAotICAgIHsgIDAsIDB4MDAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMTNbNV0gPSB7Ci0gICAgeyAgMywgMHgwMDAwIH0sCi0gICAgeyAgMywgMHgwMDAxIH0sCi0gICAgeyAgMSwgMHgwMDAxIH0sCi0gICAgeyAgMiwgMHgwMDAxIH0sCi0gICAgeyAgMCwgMHgwMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MxNFs0XSA9IHsKLSAgICB7ICAyLCAweDAwMDAgfSwKLSAgICB7ICAyLCAweDAwMDEgfSwKLSAgICB7ICAxLCAweDAwMDEgfSwKLSAgICB7ICAwLCAweDAwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczE1WzNdID0gewotICAgIHsgIDEsIDB4MDAwMCB9LAotICAgIHsgIDEsIDB4MDAwMSB9LAotICAgIHsgIDAsIDB4MDAwMCB9Ci19OwotCi1jb25zdCBBUk1fVkxDMzIgKmFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNbMTVdID0gewotICAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczEsIAotICAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczIsCi0gICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMywgCi0gICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zNCwgCi0gICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zNSwgCi0gICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zNiwgCi0gICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zNywgCi0gICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zOCwgCi0gICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zOSwgCi0gICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMTAsIAotICAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczExLCAKLSAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MxMiwgCi0gICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMTMsIAotICAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczE0LCAKLSAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MxNSAKLX07Ci0KLXN0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJfMVs1XSA9IHsKLSAgICB7ICAxLCAxIH0sCi0gICAgeyAgMiwgMSB9LAotICAgIHsgIDMsIDEgfSwKLSAgICB7ICAzLCAwIH0sCi0gICAgeyAgMCwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyXzJbNF0gPSB7Ci0gICAgeyAgMSwgMSB9LAotICAgIHsgIDIsIDEgfSwKLSAgICB7ICAyLCAwIH0sCi0gICAgeyAgMCwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyXzNbM10gPSB7Ci0gICAgeyAgMSwgMSB9LAotICAgIHsgIDEsIDAgfSwKLSAgICB7ICAwLCAwIH0KLX07Ci0KLWNvbnN0IEFSTV9WTEMzMiAqYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNbM10gPSB7Ci0gICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyXzEsIAotICAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4Ml8yLCAKLSAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJfMwotfTsKLQotCi0vKiBUYWJsZXMgZm9yIHJ1bl9iZWZvcmUgKi8KLQotc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlMVszXSA9IHsKLSAgICB7ICAxLCAweDAwMDEgfSwKLSAgICB7ICAxLCAweDAwMDAgfSwKLSAgICB7ICAwLCAweDAwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlMls0XSA9IHsKLSAgICB7ICAxLCAweDAwMDEgfSwKLSAgICB7ICAyLCAweDAwMDEgfSwKLSAgICB7ICAyLCAweDAwMDAgfSwKLSAgICB7ICAwLCAweDAwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlM1s1XSA9IHsKLSAgICB7ICAyLCAweDAwMDMgfSwKLSAgICB7ICAyLCAweDAwMDIgfSwKLSAgICB7ICAyLCAweDAwMDEgfSwKLSAgICB7ICAyLCAweDAwMDAgfSwKLSAgICB7ICAwLCAweDAwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlNFs2XSA9IHsKLSAgICB7ICAyLCAweDAwMDMgfSwKLSAgICB7ICAyLCAweDAwMDIgfSwKLSAgICB7ICAyLCAweDAwMDEgfSwKLSAgICB7ICAzLCAweDAwMDEgfSwKLSAgICB7ICAzLCAweDAwMDAgfSwKLSAgICB7ICAwLCAweDAwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlNVs3XSA9IHsKLSAgICB7ICAyLCAweDAwMDMgfSwKLSAgICB7ICAyLCAweDAwMDIgfSwKLSAgICB7ICAzLCAweDAwMDMgfSwKLSAgICB7ICAzLCAweDAwMDIgfSwKLSAgICB7ICAzLCAweDAwMDEgfSwKLSAgICB7ICAzLCAweDAwMDAgfSwKLSAgICB7ICAwLCAweDAwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlNls4XSA9IHsKLSAgICB7ICAyLCAweDAwMDMgfSwKLSAgICB7ICAzLCAweDAwMDAgfSwKLSAgICB7ICAzLCAweDAwMDEgfSwKLSAgICB7ICAzLCAweDAwMDMgfSwKLSAgICB7ICAzLCAweDAwMDIgfSwKLSAgICB7ICAzLCAweDAwMDUgfSwKLSAgICB7ICAzLCAweDAwMDQgfSwKLSAgICB7ICAwLCAweDAwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlN1sxNl0gPSB7Ci0gICAgeyAgMywgMHgwMDA3IH0sCi0gICAgeyAgMywgMHgwMDA2IH0sCi0gICAgeyAgMywgMHgwMDA1IH0sCi0gICAgeyAgMywgMHgwMDA0IH0sCi0gICAgeyAgMywgMHgwMDAzIH0sCi0gICAgeyAgMywgMHgwMDAyIH0sCi0gICAgeyAgMywgMHgwMDAxIH0sCi0gICAgeyAgNCwgMHgwMDAxIH0sCi0gICAgeyAgNSwgMHgwMDAxIH0sCi0gICAgeyAgNiwgMHgwMDAxIH0sCi0gICAgeyAgNywgMHgwMDAxIH0sCi0gICAgeyAgOCwgMHgwMDAxIH0sCi0gICAgeyAgOSwgMHgwMDAxIH0sCi0gICAgeyAxMCwgMHgwMDAxIH0sCi0gICAgeyAxMSwgMHgwMDAxIH0sCi0gICAgeyAgMCwgMHgwMDAwIH0KLX07Ci0KLWNvbnN0IEFSTV9WTEMzMiAqYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc1s3XSA9IHsKLSAgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZTEsIAotICAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlMiwgCi0gICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmUzLCAKLSAgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZTQsIAotICAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlNSwgCi0gICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmU2LCAKLSAgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZTcKLX07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NvbXBhcmVNb3Rpb25Db3N0VG9NVi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9Db21wYXJlTW90aW9uQ29zdFRvTVYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYxMWEzNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NvbXBhcmVNb3Rpb25Db3N0VG9NVi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0NvbXBhcmVNb3Rpb25Db3N0VG9NVi5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogQ29udGFpbnMgbW9kdWxlIGZvciBjb21wYXJpbmcgbW90aW9uIHZlY3RvcnMgYW5kIFNBRCdzIHRvIGRlY2lkZSAKLSAqIHRoZSBiZXN0IE1WIGFuZCBTQUQKLSAqCi0gKi8KLSAgCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0V4cEdvbEJpdHNVc2VkCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBjYWxjdWxhdGluZyBFeHAtR29sb21iIGNvZGUgbGVuZ3RoIGZvciBhIGdpdmVuIHZhbHVlcwotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JICAgICAgICAgdmFsCVNpZ25lZCBudW1iZXIgZm9yIHdoaWNoIEV4cC1Hb2xvbWIgY29kZSBsZW5ndGggaGFzCi0gKiAgICAgICAgICAgICAgICAgICAgICB0byBiZSBjYWxjdWxhdGVkCi0gKgotICogUmV0dXJuIFZhbHVlOiAKLSAqICAgICAgICAgICAgIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgRXhwLUdvbG9tYiBjb2RlIGZvciB2YWwKLSAqLwotCi1zdGF0aWMgT01YX1UxNiBhcm1WQ000UDEwX0V4cEdvbEJpdHNVc2VkIChPTVhfUzE2IHZhbCkKLXsKLSAgICBPTVhfVTE2IHNpemVDb2RlTnVtLCBjb2RlTnVtOwotICAgIAotICAgIC8qIE1hcHBpbmcgdmFsIHRvIGNvZGVOdW0gKi8KLSAgICBjb2RlTnVtID0gYXJtQWJzICh2YWwpOwotICAgIGlmICh2YWwgPiAwKQotICAgIHsKLSAgICAgICAgY29kZU51bSA9ICgyICogY29kZU51bSkgLSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBjb2RlTnVtID0gMiAqIGNvZGVOdW07Ci0gICAgfQotICAgIAotICAgIC8qIFNpemUgb2YgdGhlIGV4cC1nb2xvbWIgY29kZSAqLwotICAgIHNpemVDb2RlTnVtID0gKDIgKiBhcm1Mb2dTaXplIChjb2RlTnVtICsgMSkpIC0gMTsKLSAgICAKLSAgICByZXR1cm4gc2l6ZUNvZGVOdW07Ci19Ci0gICAgICAgICAgICAgICAgCi0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfQ29tcGFyZU1vdGlvbkNvc3RUb01WCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBjb21wYXJpc2lvbiBvZiBtb3Rpb24gdmVjdG9ycyBhbmQgTW90aW9uIGNvc3QgdG8gZGVjaWRlIHRoZSAKLSAqIGJlc3QgTVYgYW5kIGJlc3QgTUMKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCSAgICAgICAgIG12WAl4IGNvb3JkaW5hdGUgb2YgdGhlIGNhbmRpZGF0ZSBtb3Rpb24gdmVjdG9yIGluIDEvNCBwZWwgdW5pdHMKLSAqIFtpbl0JICAgICAgICAgbXZZCXkgY29vcmRpbmF0ZSBvZiB0aGUgY2FuZGlkYXRlIG1vdGlvbiB2ZWN0b3IgaW4gMS80IHBlbCB1bml0cwotICogW2luXQkgICAgICBkaWZmTVYJZGlmZmVyZW50aWFsIE1WCi0gKiBbaW5dCSAgICAgY2FuZFNBRAlDYW5kaWRhdGUgU0FECi0gKiBbaW5dCSAgICAgIGJlc3RNVglCZXN0IE1WLCBjb250YWlucyBiZXN0IE1WIHRpbGwgdGhlIHByZXZpb3VzIGludGVyYXRpb24uCi0gKiBbaW5dICAgICAgIG5MYW1kYSAgICBMYW1kYSBmYWN0b3I7IHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCAKLSAqIFtpbl0gICAqcEJlc3RDb3N0ICAgIENvbnRhaW5zIHRoZSBjdXJyZW50IGJlc3QgbW90aW9uIGNvc3QuCi0gKiBbb3V0XSAgKnBCZXN0Q29zdCAgICBwQmVzdENvc3QgTW90aW9uIGNvc3Qgd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGJlc3QgTVYgCi0gKiAgICAgICAgICAgICAgICAgICAgICBhZnRlciBqdWRnZW1lbnQ7IAotICogICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZWQgYXMgU0FEK0xhbWRhKkJpdHNVc2VkQnlNViwgaWYgdGhlIGNhbmRDb3N0IGlzIGxlc3MgCi0gKiAgICAgICAgICAgICAgICAgICAgICB0aGFuIHRoZSBiZXN0IGNvc3QgcGFzc2VkIHRoZW4gdGhlICpwQmVzdENvc3Qgd2lsbCBiZSBlcXVhbCB0byBjYW5kQ29zdAotICogW291dF0JICBiZXN0TVYJRmluYWxseSB3aWxsIGhhdmUgdGhlIGJlc3QgTVYgYWZ0ZXIgdGhlIGp1ZGdlbWVudC4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfSU5UIC0tIDEgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY3VycmVudCBtb3Rpb24gY29zdCBpcyB0aGUgYmVzdCAKLSAqICAgICAgICAgICAgMCB0byBpbmRpY2F0ZSB0aGF0IGl0IGlzIE5PVCB0aGUgYmVzdCBtb3Rpb24gY29zdAotICovCi0KLU9NWF9JTlQgYXJtVkNNNFAxMF9Db21wYXJlTW90aW9uQ29zdFRvTVYgKAotICAgIE9NWF9TMTYgIG12WCwKLSAgICBPTVhfUzE2ICBtdlksCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgZGlmZk1WLCAKLSAgICBPTVhfSU5UIGNhbmRTQUQsIAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpiZXN0TVYsIAotICAgIE9NWF9VMzIgbkxhbWRhLAotICAgIE9NWF9TMzIgKnBCZXN0Q29zdAotKSAKLXsKLSAgICBPTVhfUzMyIGNhbmRDb3N0OwotICAgIE9NWF9VMTYgc2l6ZUNvZGVOdW07Ci0gICAgCi0gICAgc2l6ZUNvZGVOdW0gPSBhcm1WQ000UDEwX0V4cEdvbEJpdHNVc2VkIChkaWZmTVYuZHgpOwotICAgIHNpemVDb2RlTnVtICs9IGFybVZDTTRQMTBfRXhwR29sQml0c1VzZWQgKGRpZmZNVi5keSk7Ci0gICAgCi0gICAgLyogTW90aW9uIGNvc3QgPSBTQUQgKyAgbGFtZGEgKiAoKGJpdHN1c2VkKGRpZmZNVngpICsgKGJpdHN1c2VkKGRpZmZNVnkpKSovCi0gICAgY2FuZENvc3QgPSBjYW5kU0FEICsgKG5MYW1kYSAqIHNpemVDb2RlTnVtKTsKLSAgICAgICAgCi0gICAgLyogQ2FsY3VsYXRlIGNhbmRDb3N0ICovCi0gICAgaWYgKGNhbmRDb3N0IDwgKnBCZXN0Q29zdCkKLSAgICB7Ci0gICAgICAgICpwQmVzdENvc3QgPSBjYW5kQ29zdDsKLSAgICAgICAgYmVzdE1WLT5keCA9IG12WDsKLSAgICAgICAgYmVzdE1WLT5keSA9IG12WTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGlmIChjYW5kQ29zdCA+ICpwQmVzdENvc3QpCi0gICAgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgLyogc2hvcnRlciBtb3Rpb24gdmVjdG9yICovCi0gICAgaWYgKCAobXZYICogbXZYICsgbXZZICogbXZZKSA8ICgoYmVzdE1WLT5keCAqIGJlc3RNVi0+ZHgpICsgKGJlc3RNVi0+ZHkgKiBiZXN0TVYtPmR5KSkgKQotICAgIHsKLSAgICAgICAgKnBCZXN0Q29zdCA9IGNhbmRDb3N0OwotICAgICAgICBiZXN0TVYtPmR4ID0gbXZYOwotICAgICAgICBiZXN0TVYtPmR5ID0gbXZZOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qRW5kIG9mIEZpbGUqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZUJsb2NrUGl4ZWwuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVCbG9ja1BpeGVsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZGE4YWIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZUJsb2NrUGl4ZWwuYworKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0RlQmxvY2tQaXhlbC5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiAKLSAqIEguMjY0IGx1bWEgZGVibG9jayBtb2R1bGUKLSAqIAotICovCi0KLSNpZmRlZiBERUJVR19BUk1WQ000UDEwX0RFQkxPQ0tQSVhFTAotI3VuZGVmIERFQlVHX09OCi0jZGVmaW5lIERFQlVHX09OCi0jZW5kaWYgLyogREVCVUdfQVJNVkNNNFAxMF9ERUJMT0NLUElYRUwgKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKgotICogRGVzY3JpcHRpb24KLSAqIERlYmxvY2sgb25lIGJvdW5kYXJ5IHBpeGVsCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcFEwICAgICAgICAgUG9pbnRlciB0byBwaXhlbCBxMAotICogW2luXSBTdGVwICAgICAgICBTdGVwIGJldHdlZW4gcGl4ZWxzIHEwIGFuZCBxMQotICogW2luXSB0QzAgICAgICAgICBFZGdlIHRocmVzaG9sZCB2YWx1ZQotICogW2luXSBhbHBoYSAgICAgICBhbHBoYSB0aHJlc2hvbGQgdmFsdWUKLSAqIFtpbl0gYmV0YSAgICAgICAgYmV0YSB0aHJlc2hvbGQgdmFsdWUKLSAqIFtpbl0gYlMgICAgICAgICAgZGVibG9ja2luZyBzdHJlbmd0aAotICogW2luXSBDaHJvbWFGbGFnICBUcnVlIGZvciBjaHJvbWEgYmxvY2tzCi0gKiBbb3V0XSBwUTAgICAgICAgIERlYmxvY2tlZCBwaXhlbHMKLSAqIAotICovCi0KLXZvaWQgYXJtVkNNNFAxMF9EZUJsb2NrUGl4ZWwoCi0gICAgT01YX1U4ICpwUTAsICAgIC8qIHBvaW50ZXIgdG8gdGhlIHBpeGVsIHEwICovCi0gICAgaW50IFN0ZXAsICAgICAgIC8qIHN0ZXAgYmV0d2VlbiBwaXhlbHMgcTAgYW5kIHExICovCi0gICAgaW50IHRDMCwgICAgICAgIC8qIGVkZ2UgdGhyZXNob2xkIHZhbHVlICovCi0gICAgaW50IGFscGhhLCAgICAgIC8qIGFscGhhICovCi0gICAgaW50IGJldGEsICAgICAgIC8qIGJldGEgKi8KLSAgICBpbnQgYlMsICAgICAgICAgLyogZGVibG9ja2luZyBzdHJlbmd0aCAqLwotICAgIGludCBDaHJvbWFGbGFnCi0pCi17Ci0gICAgaW50IHAzLCBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBxMzsKLSAgICBpbnQgYXAsIGFxLCBkZWx0YTsKLQotICAgIGlmIChiUz09MCkKLSAgICB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBwMyA9IHBRMFstNCpTdGVwXTsKLSAgICBwMiA9IHBRMFstMypTdGVwXTsKLSAgICBwMSA9IHBRMFstMipTdGVwXTsKLSAgICBwMCA9IHBRMFstMSpTdGVwXTsKLSAgICBxMCA9IHBRMFsgMCpTdGVwXTsKLSAgICBxMSA9IHBRMFsgMSpTdGVwXTsKLSAgICBxMiA9IHBRMFsgMipTdGVwXTsKLSAgICBxMyA9IHBRMFsgMypTdGVwXTsKLQotICAgIGlmIChhcm1BYnMocDAtcTApPj1hbHBoYSB8fCBhcm1BYnMocDEtcDApPj1iZXRhIHx8IGFybUFicyhxMS1xMCk+PWJldGEpCi0gICAgewotICAgICAgICBERUJVR19QUklOVEZfMTAoIkRlQmxvY2tQaXhlbDogJTAyeCAlMDJ4ICUwMnggJTAyeCB8ICUwMnggJTAyeCAlMDJ4ICUwMnggYWxwaGE9JWQgYmV0YT0lZFxuIiwKLSAgICAgICAgICAgIHAzLCBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBxMywgYWxwaGEsIGJldGEpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYXAgPSBhcm1BYnMocDIgLSBwMCk7Ci0gICAgYXEgPSBhcm1BYnMocTIgLSBxMCk7Ci0KLSAgICBpZiAoYlMgPCA0KQotICAgIHsKLSAgICAgICAgaW50IHRDID0gdEMwOwotCi0gICAgICAgIGlmIChDaHJvbWFGbGFnKQotICAgICAgICB7Ci0gICAgICAgICAgICB0QysrOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGFwIDwgYmV0YSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0QysrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGFxIDwgYmV0YSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0QysrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgCi0gICAgICAgIGRlbHRhID0gKCgocTAtcDApPDwyKSArIChwMS1xMSkgKyA0KSA+PiAzOwotICAgICAgICBkZWx0YSA9IGFybUNsaXAoLXRDLCB0QywgZGVsdGEpOwotCi0gICAgICAgIHBRMFstMSpTdGVwXSA9IChPTVhfVTgpYXJtQ2xpcCgwLCAyNTUsIHAwICsgZGVsdGEpOwotICAgICAgICBwUTBbIDAqU3RlcF0gPSAoT01YX1U4KWFybUNsaXAoMCwgMjU1LCBxMCAtIGRlbHRhKTsKLQotICAgICAgICBpZiAoQ2hyb21hRmxhZz09MCAmJiBhcDxiZXRhKQotICAgICAgICB7Ci0gICAgICAgICAgICBkZWx0YSA9IChwMiArICgocDArcTArMSk+PjEpIC0gKHAxPDwxKSk+PjE7Ci0gICAgICAgICAgICBkZWx0YSA9IGFybUNsaXAoLXRDMCwgdEMwLCBkZWx0YSk7Ci0gICAgICAgICAgICBwUTBbLTIqU3RlcF0gPSAoT01YX1U4KShwMSArIGRlbHRhKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChDaHJvbWFGbGFnPT0wICYmIGFxPGJldGEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRlbHRhID0gKHEyICsgKChwMCtxMCsxKT4+MSkgLSAocTE8PDEpKT4+MTsKLSAgICAgICAgICAgIGRlbHRhID0gYXJtQ2xpcCgtdEMwLCB0QzAsIGRlbHRhKTsKLSAgICAgICAgICAgIHBRMFsgMSpTdGVwXSA9IChPTVhfVTgpKHExICsgZGVsdGEpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgLyogYlM9PTQgKi8KLSAgICB7Ci0gICAgICAgIGlmIChDaHJvbWFGbGFnPT0wICYmIGFwPGJldGEgJiYgYXJtQWJzKHAwLXEwKTwoKGFscGhhPj4yKSsyKSkKLSAgICAgICAgewotICAgICAgICAgICAgcFEwWy0xKlN0ZXBdID0gKE9NWF9VOCkoKHAyICsgMipwMSArIDIqcDAgKyAyKnEwICsgcTEgKyA0KT4+Myk7Ci0gICAgICAgICAgICBwUTBbLTIqU3RlcF0gPSAoT01YX1U4KSgocDIgKyBwMSArIHAwICsgcTAgKyAyKT4+Mik7Ci0gICAgICAgICAgICBwUTBbLTMqU3RlcF0gPSAoT01YX1U4KSgoMipwMyArIDMqcDIgKyBwMSArIHAwICsgcTAgKyA0KT4+Myk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwUTBbLTEqU3RlcF0gPSAoT01YX1U4KSgoMipwMSArIHAwICsgcTEgKyAyKT4+Mik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoQ2hyb21hRmxhZz09MCAmJiBhcTxiZXRhICYmIGFybUFicyhwMC1xMCk8KChhbHBoYT4+MikrMikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBRMFsgMCpTdGVwXSA9IChPTVhfVTgpKChxMiArIDIqcTEgKyAyKnEwICsgMipwMCArIHAxICsgNCk+PjMpOwotICAgICAgICAgICAgcFEwWyAxKlN0ZXBdID0gKE9NWF9VOCkoKHEyICsgcTEgKyBwMCArIHEwICsgMik+PjIpOwotICAgICAgICAgICAgcFEwWyAyKlN0ZXBdID0gKE9NWF9VOCkoKDIqcTMgKyAzKnEyICsgcTEgKyBxMCArIHAwICsgNCk+PjMpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcFEwWyAwKlN0ZXBdID0gKE9NWF9VOCkoKDIqcTEgKyBxMCArIHAxICsgMik+PjIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgREVCVUdfUFJJTlRGXzEzKCJEZUJsb2NrUGl4ZWw6ICUwMnggJTAyeCAlMDJ4ICUwMnggfCAlMDJ4ICUwMnggJTAyeCAlMDJ4IGJTPSVkIC0+ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCi0gICAgICAgIHAzLCBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBxMywgYlMsCi0gICAgICAgIHBRMFstMipTdGVwXSwgcFEwWy0xKlN0ZXBdLHBRMFswKlN0ZXBdLHBRMFsxKlN0ZXBdKTsKLQotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMWQ1M2IuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIuYworKysgL2Rldi9udWxsCkBAIC0xLDI4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpci5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiAKLSAqIEguMjY0IGRlY29kZSBjb2VmZmljaWVudHMgbW9kdWxlCi0gKiAKLSAqLwotIAotI2lmZGVmIERFQlVHX0FSTVZDTTRQMTBfREVDT0RFQ09FRkZTVE9QQUlSCi0jdW5kZWYgREVCVUdfT04KLSNkZWZpbmUgREVCVUdfT04KLSNlbmRpZgotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgotI2luY2x1ZGUgImFybVZDTTRQMTBfQ0FWTENUYWJsZXMuaCIKLQotLyogNHg0IERlWmlnWmFnIHRhYmxlICovCi0KLXN0YXRpYyBjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9aaWdaYWdbMTZdID0KLXsKLSAgICAwLCAxLCA0LCA4LCA1LCAyLCAzLCA2LCA5LCAxMiwgMTMsIDEwLCA3LCAxMSwgMTQsIDE1Ci19OwotCi0vKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm0gdGhlIHdvcmsgcmVxdWlyZWQgYnkgdGhlIE9wZW5NQVgKLSAqIERlY29kZUNvZWZmc1RvUGFpciBmdW5jdGlvbiBhbmQgRGVjb2RlQ2hyb21hRENDb2VmZnNUb1BhaXIuCi0gKiBTaW5jZSBtb3N0IG9mIHRoZSBjb2RlIGlzIGNvbW1vbiB3ZSBzaGFyZSBpdCBoZXJlLgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwQml0U3RyZWFtCQlEb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbSBidWZmZXIKLSAqIFtpbl0JcE9mZnNldAkJCVBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotICoJCQkJCQkJCXRvIGJ5ICpwcEJpdFN0cmVhbQotICogW2luXQlzTWF4TnVtQ29lZmYJTWF4aW11bSBudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIGluIGN1cnJlbnQKLSAqCQkJCQkJCQlibG9jayAoNCwxNSBvciAxNikKLSAqIFtpbl0JblRhYmxlICAgICAgICAgIFRhYmxlIG51bWJlciAoMCB0byA0KSBhY2NvcmRpbmcgdG8gdGhlIGZpdmUgY29sdW1ucwotICogICAgICAgICAgICAgICAgICAgICAgb2YgVGFibGUgOS01IGluIHRoZSBILjI2NCBzcGVjCi0gKiBbb3V0XQlwcEJpdFN0cmVhbQkJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkCi0gKiBbb3V0XQlwT2Zmc2V0CQkJKnBPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKLSAqIFtvdXRdCXBOdW1Db2VmZgkJUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzIGluCi0gKgkJCQkJCQkJdGhpcyBibG9jawotICogW291dF0JcHBQb3NDb2VmYnVmCURvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsCi0gKgkJCQkJCQkJY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIG9teEVycm9yIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0KLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIoCi0gICAgIGNvbnN0IE9NWF9VOCoqIHBwQml0U3RyZWFtLAotICAgICBPTVhfUzMyKiBwT2Zmc2V0LAotICAgICBPTVhfVTgqIHBOdW1Db2VmZiwKLSAgICAgT01YX1U4ICAqKnBwUG9zQ29lZmJ1ZiwKLSAgICAgT01YX0lOVCBuVGFibGUsCi0gICAgIE9NWF9JTlQgc01heE51bUNvZWZmICAgICAgICAKLSApCi17Ci0gICAgaW50IENvZWZmVG9rZW4sIFRvdGFsQ29lZmYsIFRyYWlsaW5nT25lczsKLSAgICBpbnQgTGV2ZWwsIExldmVsQ29kZSwgTGV2ZWxQcmVmaXgsIExldmVsU3VmZml4LCBMZXZlbFN1ZmZpeFNpemU7Ci0gICAgaW50IFN1ZmZpeExlbmd0aCwgUnVuLCBaZXJvc0xlZnQsQ29lZmZOdW07Ci0gICAgaW50IGksIEZsYWdzOwotICAgIE9NWF9VOCAqcFBvc0NvZWZidWYgPSAqcHBQb3NDb2VmYnVmOwotICAgIE9NWF9TMTYgcExldmVsWzE2XTsKLSAgICBPTVhfVTggIHBSdW5bMTZdOwotCi0gICAgQ29lZmZUb2tlbiA9IGFybVVuUGFja1ZMQzMyKHBwQml0U3RyZWFtLCBwT2Zmc2V0LCBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc1tuVGFibGVdKTsKLSAgICBhcm1SZXREYXRhRXJySWYoQ29lZmZUb2tlbiA9PSBBUk1fTk9fQ09ERUJPT0tfSU5ERVgsIE9NWF9TdHNfRXJyKTsKLQotICAgIFRyYWlsaW5nT25lcyA9IGFybVZDTTRQMTBfQ0FWTENUcmFpbGluZ09uZXNbQ29lZmZUb2tlbl07Ci0gICAgVG90YWxDb2VmZiAgID0gYXJtVkNNNFAxMF9DQVZMQ1RvdGFsQ29lZmZbQ29lZmZUb2tlbl07Ci0gICAgKnBOdW1Db2VmZiAgID0gKE9NWF9VOClUb3RhbENvZWZmOwotCi0gICAgREVCVUdfUFJJTlRGXzIoIlRvdGFsQ29lZmYgPSAlZCwgVHJhaWxpbmdPbmVzID0gJWRcbiIsIFRvdGFsQ29lZmYsIFRyYWlsaW5nT25lcyk7Ci0KLSAgICBpZiAoVG90YWxDb2VmZiA9PSAwKQotICAgIHsKLSAgICAgICAgLyogTm90aGluZyB0byBkbyAqLwotICAgICAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLSAgICB9Ci0KLSAgICAvKiBEZWNvZGUgdHJhaWxpbmcgb25lcyAqLwotICAgIGZvciAoaT1Ub3RhbENvZWZmLTE7IGk+PVRvdGFsQ29lZmYtVHJhaWxpbmdPbmVzOyBpLS0pCi0gICAgewotICAgICAgICBpZiAoYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwgcE9mZnNldCwgMSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExldmVsID0gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBMZXZlbCA9ICsxOwotICAgICAgICB9Ci0gICAgICAgIHBMZXZlbFtpXSA9IChPTVhfUzE2KUxldmVsOwotCi0gICAgICAgIERFQlVHX1BSSU5URl8yKCJMZXZlbFslZF0gPSAlZFxuIiwgaSwgcExldmVsW2ldKTsKLSAgICB9Ci0KLSAgICAvKiBEZWNvZGUgKG5vbiB6ZXJvKSBsZXZlbCB2YWx1ZXMgKi8KLSAgICBTdWZmaXhMZW5ndGggPSAwOwotICAgIGlmIChUb3RhbENvZWZmPjEwICYmIFRyYWlsaW5nT25lczwzKQotICAgIHsKLSAgICAgICAgU3VmZml4TGVuZ3RoPTE7Ci0gICAgfQotICAgIGZvciAoIDsgaT49MDsgaS0tKQotICAgIHsKLSAgICAgICAgTGV2ZWxQcmVmaXggPSBhcm1VblBhY2tWTEMzMihwcEJpdFN0cmVhbSwgcE9mZnNldCwgYXJtVkNNNFAxMF9DQVZMQ0xldmVsUHJlZml4KTsKLSAgICAgICAgYXJtUmV0RGF0YUVycklmKExldmVsUHJlZml4ID09IEFSTV9OT19DT0RFQk9PS19JTkRFWCwgT01YX1N0c19FcnIpOwotCi0gICAgICAgIExldmVsU3VmZml4U2l6ZSA9IFN1ZmZpeExlbmd0aDsKLSAgICAgICAgaWYgKExldmVsUHJlZml4PT0xNCAmJiBTdWZmaXhMZW5ndGg9PTApCi0gICAgICAgIHsKLSAgICAgICAgICAgIExldmVsU3VmZml4U2l6ZSA9IDQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKExldmVsUHJlZml4PT0xNSkKLSAgICAgICAgewotICAgICAgICAgICAgTGV2ZWxTdWZmaXhTaXplID0gMTI7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIExldmVsU3VmZml4ID0gMDsKLSAgICAgICAgaWYgKExldmVsU3VmZml4U2l6ZSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIExldmVsU3VmZml4ID0gYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwgcE9mZnNldCwgTGV2ZWxTdWZmaXhTaXplKTsKLSAgICAgICAgfQotCi0gICAgICAgIExldmVsQ29kZSA9IChMZXZlbFByZWZpeCA8PCBTdWZmaXhMZW5ndGgpICsgTGV2ZWxTdWZmaXg7Ci0KLQotICAgICAgICBpZiAoTGV2ZWxQcmVmaXg9PTE1ICYmIFN1ZmZpeExlbmd0aD09MCkKLSAgICAgICAgewotICAgICAgICAgICAgTGV2ZWxDb2RlICs9IDE1OwotICAgICAgICB9Ci0KLSAgICAgICAgLyogTGV2ZWxDb2RlID0gMioobWFnbml0dWRlLTEpICsgc2lnbiAqLwotCi0gICAgICAgIGlmIChpPT1Ub3RhbENvZWZmLTEtVHJhaWxpbmdPbmVzICYmIFRyYWlsaW5nT25lczwzKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBMZXZlbCBtYWduaXR1ZGUgY2FuJ3QgYmUgMSAqLwotICAgICAgICAgICAgTGV2ZWxDb2RlICs9IDI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKExldmVsQ29kZSAmIDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIDJhKzEgbWFwcyB0byAtYS0xICovCi0gICAgICAgICAgICBMZXZlbCA9ICgtTGV2ZWxDb2RlLTEpPj4xOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogMmErMCBtYXBzIHRvICthKzEgKi8KLSAgICAgICAgICAgIExldmVsID0gKExldmVsQ29kZSsyKT4+MTsKLSAgICAgICAgfQotICAgICAgICBwTGV2ZWxbaV0gPSAoT01YX1MxNilMZXZlbDsKLQotICAgICAgICBERUJVR19QUklOVEZfMigiTGV2ZWxbJWRdID0gJWRcbiIsIGksIHBMZXZlbFtpXSk7Ci0KLSAgICAgICAgaWYgKFN1ZmZpeExlbmd0aD09MCkKLSAgICAgICAgewotICAgICAgICAgICAgU3VmZml4TGVuZ3RoPTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCAoKExldmVsQ29kZT4+MSkrMSk+KDM8PChTdWZmaXhMZW5ndGgtMSkpICYmIFN1ZmZpeExlbmd0aDw2ICkKLSAgICAgICAgewotICAgICAgICAgICAgU3VmZml4TGVuZ3RoKys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBEZWNvZGUgcnVuIHZhbHVlcyAqLwotICAgIFplcm9zTGVmdCA9IDA7Ci0gICAgaWYgKFRvdGFsQ29lZmYgPCBzTWF4TnVtQ29lZmYpCi0gICAgewotICAgICAgICAvKiBEZWNvZGUgVG90YWxaZXJvcyBWTEMgKi8KLSAgICAgICAgaWYgKHNNYXhOdW1Db2VmZj09NCkKLSAgICAgICAgewotICAgICAgICAgICAgWmVyb3NMZWZ0ID0gYXJtVW5QYWNrVkxDMzIocHBCaXRTdHJlYW0sIHBPZmZzZXQsIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzW1RvdGFsQ29lZmYtMV0pOwotICAgICAgICAgICAgYXJtUmV0RGF0YUVycklmKFplcm9zTGVmdCA9PUFSTV9OT19DT0RFQk9PS19JTkRFWCAsIE9NWF9TdHNfRXJyKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIFplcm9zTGVmdCA9IGFybVVuUGFja1ZMQzMyKHBwQml0U3RyZWFtLCBwT2Zmc2V0LCBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzW1RvdGFsQ29lZmYtMV0pOwotICAgICAgICAgICAgIGFybVJldERhdGFFcnJJZihaZXJvc0xlZnQgPT1BUk1fTk9fQ09ERUJPT0tfSU5ERVggLCBPTVhfU3RzX0Vycik7Ci0JICAgIH0KLSAgICB9Ci0KLSAgICBERUJVR19QUklOVEZfMSgiVG90YWxaZXJvcyA9ICVkXG4iLCBaZXJvc0xlZnQpOwotCi0JQ29lZmZOdW09WmVyb3NMZWZ0K1RvdGFsQ29lZmYtMTsKLQotICAgIGZvciAoaT1Ub3RhbENvZWZmLTE7IGk+MDsgaS0tKQotICAgIHsKLSAgICAgICAgUnVuID0gMDsKLSAgICAgICAgaWYgKFplcm9zTGVmdCA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBUYWJsZSA9IFplcm9zTGVmdDsKLSAgICAgICAgICAgIGlmIChUYWJsZSA+IDYpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVGFibGUgPSA3OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUnVuID0gYXJtVW5QYWNrVkxDMzIocHBCaXRTdHJlYW0sIHBPZmZzZXQsIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNbVGFibGUtMV0pOwotICAgICAgICAgICAgYXJtUmV0RGF0YUVycklmKFJ1biA9PSBBUk1fTk9fQ09ERUJPT0tfSU5ERVgsIE9NWF9TdHNfRXJyKTsKLSAgICAgICAgfQotICAgICAgICBwUnVuW2ldID0gKE9NWF9VOClSdW47Ci0KLSAgICAgICAgREVCVUdfUFJJTlRGXzIoIlJ1blslZF0gPSAlZFxuIiwgaSwgcFJ1bltpXSk7Ci0KLSAgICAgICAgWmVyb3NMZWZ0IC09IFJ1bjsKLSAgICB9Ci0gICAgcFJ1blswXSA9IChPTVhfVTgpWmVyb3NMZWZ0OwotCi0gICAgREVCVUdfUFJJTlRGXzEoIlJ1blswXSA9ICVkXG4iLCBwUnVuW2ldKTsKLQotCi0gICAgLyogRmlsbCBpbiBjb2VmZmljaWVudHMgKi8KLQkgICAgCi0gICAgaWYgKHNNYXhOdW1Db2VmZj09MTUpCi0gICAgewotICAgICAgICBDb2VmZk51bSsrOyAvKiBTa2lwIHRoZSBEQyBwb3NpdGlvbiAqLwotICAgIH0KLQkKLQkvKmZvciAoaT0wO2k8VG90YWxDb2VmZjtpKyspCi0JCUNvZWZmTnVtICs9IHBSdW5baV0rMTsqLwotICAgIAotCWZvciAoaT0oVG90YWxDb2VmZi0xKTsgaT49MDsgaS0tKQotICAgIHsKLSAgICAgICAgLypDb2VmZk51bSArPSBwUnVuW2ldKzE7Ki8KLSAgICAgICAgTGV2ZWwgICAgID0gcExldmVsW2ldOwotCi0gICAgICAgIERFQlVHX1BSSU5URl8yKCJDb2VmWyVkXSA9ICVkXG4iLCBDb2VmZk51bSwgTGV2ZWwpOwotCi0gICAgICAgIEZsYWdzID0gQ29lZmZOdW07Ci0JCUNvZWZmTnVtIC09IChwUnVuW2ldKzEpOwotICAgICAgICBpZiAoc01heE51bUNvZWZmPjQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFBlcmZvcm0gNHg0IERlWmlnWmFnICovCi0gICAgICAgICAgICBGbGFncyA9IGFybVZDTTRQMTBfWmlnWmFnW0ZsYWdzXTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaT09MCkKLSAgICAgICAgeyAgIAotICAgICAgICAgICAgLyogRW5kIG9mIGJsb2NrIGZsYWcgKi8KLSAgICAgICAgICAgIEZsYWdzICs9IDB4MjA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKExldmVsPC0xMjggfHwgTGV2ZWw+MTI3KQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBPdmVyZmxvdyBmbGFnICovCi0gICAgICAgICAgICBGbGFncyArPSAweDEwOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAqcFBvc0NvZWZidWYrKyA9IChPTVhfVTgpKEZsYWdzKTsKLSAgICAgICAgKnBQb3NDb2VmYnVmKysgPSAoT01YX1U4KShMZXZlbCAmIDB4RkYpOwotICAgICAgICBpZiAoRmxhZ3MgJiAweDEwKQotICAgICAgICB7Ci0gICAgICAgICAgICAqcFBvc0NvZWZidWYrKyA9IChPTVhfVTgpKExldmVsPj44KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgICpwcFBvc0NvZWZidWYgPSBwUG9zQ29lZmJ1ZjsKLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ2Y2VmMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfRGVxdWFudFRhYmxlcy5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogSC4yNjQgaW52ZXJzZSBxdWFudGl6ZSB0YWJsZXMKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLQotY29uc3QgT01YX1U4IGFybVZDTTRQMTBfUG9zVG9WQ29sNHg0WzE2XSA9IAotewotICAgIDAsIDIsIDAsIDIsCi0gICAgMiwgMSwgMiwgMSwKLSAgICAwLCAyLCAwLCAyLAotICAgIDIsIDEsIDIsIDEKLX07Ci0KLWNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1Bvc1RvVkNvbDJ4Mls0XSA9IAotewotICAgIDAsIDIsCi0gICAgMiwgMQotfTsKLQotY29uc3QgT01YX1U4IGFybVZDTTRQMTBfVk1hdHJpeFs2XVszXSA9Ci17Ci0gICAgeyAxMCwgMTYsIDEzIH0sCi0gICAgeyAxMSwgMTgsIDE0IH0sCi0gICAgeyAxMywgMjAsIDE2IH0sCi0gICAgeyAxNCwgMjMsIDE4IH0sCi0gICAgeyAxNiwgMjUsIDIwIH0sCi0gICAgeyAxOCwgMjksIDIzIH0KLX07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0Z3ZFRyYW5zZm9ybVJlc2lkdWFsNHg0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0Z3ZFRyYW5zZm9ybVJlc2lkdWFsNHg0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZDZjMGYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9Gd2RUcmFuc2Zvcm1SZXNpZHVhbDR4NC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9Gd2RUcmFuc2Zvcm1SZXNpZHVhbDR4NC5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogSC4yNjQgdHJhbnNmb3JtIG1vZHVsZQotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSAKLS8qCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEZvcndhcmQgVHJhbnNmb3JtIFJlc2lkdWFsIDR4NCBDb2VmZmljaWVudHMKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgcFNyYwkJU291cmNlIDR4NCBibG9jawotICogW291dF0gcERzdAkJRGVzdGluYXRpb24gNHg0IGJsb2NrCi0gKgotICovCi12b2lkIGFybVZDTTRQMTBfRndkVHJhbnNmb3JtUmVzaWR1YWw0eDQoT01YX1MxNiogcERzdCwgT01YX1MxNiAqcFNyYykKLXsKLSAgICBpbnQgaTsKLQotICAgIC8qIFRyYW5zZm9ybSByb3dzICovCi0gICAgZm9yIChpPTA7IGk8MTY7IGkrPTQpCi0gICAgewotICAgICAgICBpbnQgZDAgPSBwU3JjW2krMF07Ci0gICAgICAgIGludCBkMSA9IHBTcmNbaSsxXTsKLSAgICAgICAgaW50IGQyID0gcFNyY1tpKzJdOwotICAgICAgICBpbnQgZDMgPSBwU3JjW2krM107Ci0gICAgICAgIGludCBlMCA9IGQwICsgZDM7Ci0gICAgICAgIGludCBlMSA9IGQwIC0gZDM7Ci0gICAgICAgIGludCBlMiA9IGQxICsgZDI7Ci0gICAgICAgIGludCBlMyA9IGQxIC0gZDI7Ci0gICAgICAgIGludCBmMCA9IGUwICsgZTI7Ci0gICAgICAgIGludCBmMSA9IChlMSA8PCAxKSArIGUzOwotICAgICAgICBpbnQgZjIgPSBlMCAtIGUyOwotICAgICAgICBpbnQgZjMgPSBlMSAtIChlMyA8PCAxKTsKLSAgICAgICAgcERzdFtpKzBdID0gKE9NWF9TMTYpZjA7Ci0gICAgICAgIHBEc3RbaSsxXSA9IChPTVhfUzE2KWYxOwotICAgICAgICBwRHN0W2krMl0gPSAoT01YX1MxNilmMjsKLSAgICAgICAgcERzdFtpKzNdID0gKE9NWF9TMTYpZjM7Ci0gICAgfQotCi0gICAgLyogVHJhbnNmb3JtIGNvbHVtbnMgKi8KLSAgICBmb3IgKGk9MDsgaTw0OyBpKyspCi0gICAgewotICAgICAgICBpbnQgZjAgPSBwRHN0W2krMF07Ci0gICAgICAgIGludCBmMSA9IHBEc3RbaSs0XTsKLSAgICAgICAgaW50IGYyID0gcERzdFtpKzhdOwotICAgICAgICBpbnQgZjMgPSBwRHN0W2krMTJdOwotICAgICAgICBpbnQgZzAgPSBmMCArIGYzOwotICAgICAgICBpbnQgZzEgPSBmMCAtIGYzOwotICAgICAgICBpbnQgZzIgPSBmMSArIGYyOwotICAgICAgICBpbnQgZzMgPSBmMSAtIGYyOwotICAgICAgICBpbnQgaDAgPSBnMCArIGcyOwotICAgICAgICBpbnQgaDEgPSAoZzEgPDwgMSkgKyBnMzsKLSAgICAgICAgaW50IGgyID0gZzAgLSBnMjsKLSAgICAgICAgaW50IGgzID0gZzEgLSAoZzMgPDwgMSk7Ci0gICAgICAgIHBEc3RbaSswXSA9IChPTVhfUzE2KSBoMDsKLSAgICAgICAgcERzdFtpKzRdID0gKE9NWF9TMTYpIGgxOwotICAgICAgICBwRHN0W2krOF0gPSAoT01YX1MxNikgaDI7Ci0gICAgICAgIHBEc3RbaSsxMl0gPSAoT01YX1MxNikgaDM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZEaWFnX0x1bWEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmRGlhZ19MdW1hLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlOWRmNDkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZEaWFnX0x1bWEuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZEaWFnX0x1bWEuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9ucyB3aWxsIGhlbHAgdG8gY2FsY3VsYXRlIEhhbGYgUGVsIGx1bWEgaW50ZXJwb2xhdGlvbgotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmRGlhZ19MdW1hCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciAoMS8yLCAxLzIpICBwb3NpdGlvbnMgCi0gKiBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqICBbaW5dICAgIHBTcmMgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQotICogIFtpbl0gICAgaVNyY1N0ZXAgICAgU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KLSAqICBbaW5dICAgIGlEc3RTdGVwICAgIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KLSAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqICBbb3V0XSAgIHBEc3QgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAoMS8yLDEvMiktcGVsCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZEaWFnX0x1bWEoICAKLSAgICAgICAgY29uc3QgT01YX1U4KiAgICAgcFNyYywgCi0gICAgICAgIE9NWF9VMzIgICAgIGlTcmNTdGVwLCAKLSAgICAgICAgT01YX1U4KiAgICAgcERzdCwgCi0gICAgICAgIE9NWF9VMzIgICAgIGlEc3RTdGVwLAotICAgICAgICBPTVhfVTMyICAgICBpV2lkdGgsIAotICAgICAgICBPTVhfVTMyICAgICBpSGVpZ2h0Ci0pCi17Ci0gICAgT01YX1MzMiAgICAgSGFsZkNvZWZmLCBwb3M7Ci0gICAgT01YX1MxNiAgICAgQnVmIFsyMSAqIDE2XTsgIC8qIDIxIHJvd3MgYnkgMTYgcGl4ZWxzIHBlciByb3cgKi8KLSAgICBPTVhfVTMyICAgICB5LCB4OwotCi0gICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotCi0gICAgLyoKLSAgICAgKiBJbnRlcm1lZGlhdGUgdmFsdWVzIHdpbGwgYmUgMS8yIHBlbCBhdCBIb3Jpem9udGFsIGRpcmVjdGlvbgotICAgICAqIFN0YXJ0aW5nIGF0ICgwLjUsIC0yKSBhdCB0b3AgZXh0ZW5kaW5nIHRvICgwLjUsIGhlaWdodCArIDMpIGF0IGJvdHRvbQotICAgICAqIEJ1ZiBjb250YWlucyBhIDJEIGFycmF5IG9mIHNpemUgKGlXaWR0aClYKGlIZWlnaHQgKyA1KQotICAgICAqLwotICAgIGZvciAoeSA9IDA7IHkgPCBpSGVpZ2h0ICsgNTsgeSsrKQotICAgIHsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IGlXaWR0aDsgeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwb3MgPSAoeS0yKSAqIGlTcmNTdGVwICsgeDsKLSAgICAgICAgICAgIEhhbGZDb2VmZiA9IAotICAgICAgICAgICAgICAgIHBTcmMgW3BvcyAtIDJdIC0gCi0gICAgICAgICAgICAgICAgNSAqIHBTcmMgW3BvcyAtIDFdICsgCi0gICAgICAgICAgICAgICAgMjAgKiBwU3JjIFtwb3NdICsgCi0gICAgICAgICAgICAgICAgMjAgKiBwU3JjIFtwb3MgKyAxXSAtIAotICAgICAgICAgICAgICAgIDUgKiBwU3JjIFtwb3MgKyAyXSArIAotICAgICAgICAgICAgICAgIHBTcmMgW3BvcyArIDNdOwotICAgICAgICAgICAgQnVmIFt5ICogaVdpZHRoICsgeF0gPSAoT01YX1MxNilIYWxmQ29lZmY7Ci0gICAgICAgIH0gLyogeCAqLwotICAgIH0gLyogeSAqLwotCi0gICAgLyogVmVydGljYWwgaW50ZXJwb2xhdGUgKi8KLSAgICBmb3IgKHkgPSAwOyB5IDwgaUhlaWdodDsgeSsrKQotICAgIHsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IGlXaWR0aDsgeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwb3MgPSB5ICogaVdpZHRoICsgeDsKLSAgICAgICAgICAgIEhhbGZDb2VmZiA9IAotICAgICAgICAgICAgICAgIEJ1ZiBbcG9zXSAtIAotICAgICAgICAgICAgICAgIDUgKiBCdWYgW3BvcyArIDEgKiBpV2lkdGhdICsgCi0gICAgICAgICAgICAgICAgMjAgKiBCdWYgW3BvcyArIDIgKiBpV2lkdGhdICsgCi0gICAgICAgICAgICAgICAgMjAgKiBCdWYgW3BvcyArIDMgKiBpV2lkdGhdIC0gCi0gICAgICAgICAgICAgICAgNSAqIEJ1ZiBbcG9zICsgNCAqIGlXaWR0aF0gKyAKLSAgICAgICAgICAgICAgICBCdWYgW3BvcyArIDUgKiBpV2lkdGhdOwotCi0gICAgICAgICAgICBIYWxmQ29lZmYgPSAoSGFsZkNvZWZmICsgNTEyKSA+PiAxMDsKLSAgICAgICAgICAgIEhhbGZDb2VmZiA9IGFybUNsaXAoMCwgMjU1LCBIYWxmQ29lZmYpOwotCi0gICAgICAgICAgICBwRHN0IFt5ICogaURzdFN0ZXAgKyB4XSA9IChPTVhfVTgpIEhhbGZDb2VmZjsKLSAgICAgICAgfQotICAgIH0KLSAgICAgICAgCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NDYyYjIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9ucyB3aWxsIGhlbHAgdG8gY2FsY3VsYXRlIEhhbGYgUGVsIGx1bWEgaW50ZXJwb2xhdGlvbgotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIGhvcml6b250YWwgMS8yLXBlbCBwb3NpdGlvbnMKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqICBbaW5dICAgIHBTcmMgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQotICogIFtpbl0gICAgaVNyY1N0ZXAgICAgU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KLSAqICBbaW5dICAgIGlEc3RTdGVwICAgIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KLSAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqICBbb3V0XSAgIHBEc3QgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAxLzItcGVsIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEoCi0gICAgICAgIGNvbnN0IE9NWF9VOCogICAgIHBTcmMsIAotICAgICAgICBPTVhfVTMyICAgICBpU3JjU3RlcCwgCi0gICAgICAgIE9NWF9VOCogICAgIHBEc3QsIAotICAgICAgICBPTVhfVTMyICAgICBpRHN0U3RlcCwgCi0gICAgICAgIE9NWF9VMzIgICAgIGlXaWR0aCwgCi0gICAgICAgIE9NWF9VMzIgICAgIGlIZWlnaHQKLSkKLXsKLSAgICBPTVhfSU5UICAgICB4LCB5OwotICAgIE9NWF9TMzIgICAgIEhhbGZDb2VmZiwgcG9zOwotCi0gICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotCi0gICAgZm9yICh5ID0gMDsgeSA8IGlIZWlnaHQ7IHkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoeCA9IDA7IHggPCBpV2lkdGg7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgcG9zID0geSAqIGlTcmNTdGVwICsgeDsKLSAgICAgICAgICAgIEhhbGZDb2VmZiA9IAotICAgICAgICAgICAgICAgIHBTcmMgW3BvcyAtIDJdIC0gCi0gICAgICAgICAgICAgICAgNSAqIHBTcmMgW3BvcyAtIDFdICsgCi0gICAgICAgICAgICAgICAgMjAgKiBwU3JjIFtwb3NdICsgCi0gICAgICAgICAgICAgICAgMjAgKiBwU3JjIFtwb3MgKyAxXSAtIAotICAgICAgICAgICAgICAgIDUgKiBwU3JjIFtwb3MgKyAyXSArIAotICAgICAgICAgICAgICAgIHBTcmMgW3BvcyArIDNdOwotCi0gICAgICAgICAgICBIYWxmQ29lZmYgPSAoSGFsZkNvZWZmICsgMTYpID4+IDU7Ci0gICAgICAgICAgICBIYWxmQ29lZmYgPSBhcm1DbGlwKDAsIDI1NSwgSGFsZkNvZWZmKTsKLQotICAgICAgICAgICAgcERzdCBbeSAqIGlEc3RTdGVwICsgeF0gPSBIYWxmQ29lZmY7Ci0gICAgICAgIH0gLyogeCAqLwotICAgIH0gLyogeSAqLwotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThhZGY0NS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb25zIHdpbGwgaGVscCB0byBjYWxjdWxhdGUgSGFsZiBQZWwgbHVtYSBpbnRlcnBvbGF0aW9uCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIHZlcnRpY2FsIDEvMi1wZWwgcG9zaXRpb25zIAotICogYXJvdW5kIGEgZnVsbC1wZWwgcG9zaXRpb24uCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiAgW2luXSAgICBwU3JjICAgICAgICBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIAotICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKLSAqICBbaW5dICAgIGlTcmNTdGVwICAgIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCi0gKiAgW2luXSAgICBpRHN0U3RlcCAgICBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCi0gKiAgW2luXSAgICBpV2lkdGggICAgICBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jawotICogIFtpbl0gICAgaUhlaWdodCAgICAgSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiAgW291dF0gICBwRHN0ICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgMS8yLXBlbAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEoICAgCi0gICAgIGNvbnN0IE9NWF9VOCogICAgcFNyYywgCi0gICAgIE9NWF9VMzIgICAgaVNyY1N0ZXAsIAotICAgICBPTVhfVTgqICAgIHBEc3QsCi0gICAgIE9NWF9VMzIgICAgaURzdFN0ZXAsIAotICAgICBPTVhfVTMyICAgIGlXaWR0aCwgCi0gICAgIE9NWF9VMzIgICAgaUhlaWdodAotKQotewotICAgIE9NWF9TMzIgICAgIEhhbGZDb2VmZiwgcG9zOwotICAgIE9NWF9JTlQgICAgIHksIHg7Ci0KLSAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0KLQotICAgIGZvciAoeSA9IDA7IHkgPCBpSGVpZ2h0OyB5KyspCi0gICAgewotICAgICAgICBmb3IgKHggPSAwOyB4IDwgaVdpZHRoOyB4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBvcyA9IHkgKiBpU3JjU3RlcCArIHg7Ci0gICAgICAgICAgICBIYWxmQ29lZmYgPSAKLSAgICAgICAgICAgICAgICBwU3JjIFtwb3MgLSAyICogaVNyY1N0ZXBdIC0gCi0gICAgICAgICAgICAgICAgNSAqIHBTcmMgW3BvcyAtIDEgKiBpU3JjU3RlcF0gKyAKLSAgICAgICAgICAgICAgICAyMCAqIHBTcmMgW3Bvc10gKyAKLSAgICAgICAgICAgICAgICAyMCAqIHBTcmMgW3BvcyArIDEgKiBpU3JjU3RlcF0gLSAKLSAgICAgICAgICAgICAgICA1ICogcFNyYyBbcG9zICsgMiAqIGlTcmNTdGVwXSArIAotICAgICAgICAgICAgICAgIHBTcmMgW3BvcyArIDMgKiBpU3JjU3RlcF07Ci0KLSAgICAgICAgICAgIEhhbGZDb2VmZiA9IChIYWxmQ29lZmYgKyAxNikgPj4gNTsKLSAgICAgICAgICAgIEhhbGZDb2VmZiA9IGFybUNsaXAoMCwgMjU1LCBIYWxmQ29lZmYpOwotCi0gICAgICAgICAgICBwRHN0IFt5ICogaURzdFN0ZXAgKyB4XSA9IChPTVhfVTgpIEhhbGZDb2VmZjsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NzMwZjguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEuYworKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIGludGVycG9sYXRpb24gZm9yIGNocm9tYSBjb21wb25lbnRzCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgY2hyb21hIGNvbXBvbmVudHMuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiAgW2luXSAgICBwU3JjICAgICAgICAgICAgUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sYXRlIGluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCi0gKiAgW2luXSAgICBpU3JjU3RlcCAgICBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgotICogIFtpbl0gICAgaURzdFN0ZXAgICAgU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgotICogIFtpbl0gICAgaVdpZHRoICAgICAgV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqICBbaW5dICAgIGlIZWlnaHQgICAgIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jawotICogIFtpbl0gICAgZHggICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS84IHBpeGVsIHVuaXQgKDB+NykgCi0gKiAgW2luXSAgICBkeSAgICAgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS84IHBpeGVsIHVuaXQgKDB+NykKLSAqICBbb3V0XSAgIHBEc3QgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlcgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLSBPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEoCi0gICAgICAgIE9NWF9VOCAgICAgICpwU3JjLAotICAgICAgICBPTVhfVTMyICAgICBpU3JjU3RlcCwKLSAgICAgICAgT01YX1U4ICAgICAgKnBEc3QsCi0gICAgICAgIE9NWF9VMzIgICAgIGlEc3RTdGVwLAotICAgICAgICBPTVhfVTMyICAgICBpV2lkdGgsCi0gICAgICAgIE9NWF9VMzIgICAgIGlIZWlnaHQsCi0gICAgICAgIE9NWF9VMzIgICAgIGR4LAotICAgICAgICBPTVhfVTMyICAgICBkeQotKQotewotICAgIE9NWF9VMzIgICAgIEVpZ2h0TWludXNkeCA9IDggLSBkeDsKLSAgICBPTVhfVTMyICAgICBFaWdodE1pbnVzZHkgPSA4IC0gZHk7Ci0gICAgT01YX1UzMiAgICAgQUNvZWZmLCBCQ29lZmYsIENDb2VmZiwgRENvZWZmOwotICAgIE9NWF9VMzIgICAgIHgsIHk7Ci0KLSAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoZHggPiA3LCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihkeSA+IDcsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGlTcmNTdGVwID09IDAsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGlEc3RTdGVwID09IDAsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGlXaWR0aCA9PSAwLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihpSGVpZ2h0ID09IDAsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIAotICAgIC8qIGlmIGZyYWN0aW9ubCBtdiBpcyBub3QgKDAsIDApICovCi0gICAgaWYgKGR4ICE9IDAgfHwgZHkgIT0gMCkKLSAgICB7Ci0gICAgICAgIEFDb2VmZiA9IEVpZ2h0TWludXNkeCAqIEVpZ2h0TWludXNkeTsKLSAgICAgICAgQkNvZWZmID0gZHggKiBFaWdodE1pbnVzZHk7Ci0gICAgICAgIENDb2VmZiA9IEVpZ2h0TWludXNkeCAqIGR5OwotICAgICAgICBEQ29lZmYgPSBkeCAqIGR5OwotCi0gICAgICAgIGZvciAoeSA9IDA7IHkgPCBpSGVpZ2h0OyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBpV2lkdGg7IHgrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwRHN0IFt5ICogaURzdFN0ZXAgKyB4XSA9ICgKLSAgICAgICAgICAgICAgICAgICAgQUNvZWZmICogcFNyYyBbeSAqIGlTcmNTdGVwICsgeF0gKwotICAgICAgICAgICAgICAgICAgICBCQ29lZmYgKiBwU3JjIFt5ICogaVNyY1N0ZXAgKyB4ICsgMV0gKwotICAgICAgICAgICAgICAgICAgICBDQ29lZmYgKiBwU3JjIFsoeSArIDEpICogaVNyY1N0ZXAgKyB4XSArCi0gICAgICAgICAgICAgICAgICAgIERDb2VmZiAqIHBTcmMgWyh5ICsgMSkgKiBpU3JjU3RlcCArIHggKyAxXSArCi0gICAgICAgICAgICAgICAgICAgIDMyKSA+PiA2OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGZvciAoeSA9IDA7IHkgPCBpSGVpZ2h0OyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBpV2lkdGg7IHgrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwRHN0IFt5ICogaURzdFN0ZXAgKyB4XSA9IHBTcmMgW3kgKiBpU3JjU3RlcCArIHhdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzhkNjJlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIGludGVycG9sYXRpb24gZm9yIGx1bWEgY29tcG9uZW50cwotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1NNFAxMF9Db3B5Ci0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGNvcHkgYSBibG9jayBvZiBkYXRhIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiAgW2luXSAgICBwU3JjICAgICAgICAgICAgUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sKLSAqICBbaW5dICAgIGlTcmNTdGVwICAgIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCi0gKiAgW2luXSAgICBpRHN0U3RlcCAgICBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiAgYnVmZmVyLgotICogIFtpbl0gICAgaVdpZHRoICAgICAgV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqICBbaW5dICAgIGlIZWlnaHQgICAgIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jawotICogIFtvdXRdICAgcERzdCAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotc3RhdGljIE9NWFJlc3VsdCBhcm1NNFAxMF9Db3B5KCAgCi0gICAgY29uc3QgT01YX1U4KiAgICAgcFNyYywKLSAgICBPTVhfVTMyICAgICBpU3JjU3RlcCwKLSAgICBPTVhfVTgqICAgICBwRHN0LAotICAgIE9NWF9VMzIgICAgIGlEc3RTdGVwLCAKLSAgICBPTVhfVTMyICAgICBpV2lkdGgsCi0gICAgT01YX1UzMiAgICAgaUhlaWdodAotKQotewotICAgIE9NWF9VMzIgICAgIHgsIHk7Ci0KLSAgICBmb3IgKHkgPSAwOyB5IDwgaUhlaWdodDsgeSsrKQotICAgIHsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IGlXaWR0aDsgeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwRHN0IFt5ICogaURzdFN0ZXAgKyB4XSA9IHBTcmMgW3kgKiBpU3JjU3RlcCArIHhdOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciBsdW1hIGNvbXBvbmVudHMuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiAgW2luXSAgICBwU3JjICAgICAgICAgICAgUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sYXRlIGluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCi0gKiAgW2luXSAgICBpU3JjU3RlcCAgICBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgotICogIFtpbl0gICAgaURzdFN0ZXAgICAgU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgotICogIFtpbl0gICAgaVdpZHRoICAgICAgV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqICBbaW5dICAgIGlIZWlnaHQgICAgIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jawotICogIFtpbl0gICAgZHggICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS80IHBpeGVsIHVuaXQgKDB+MykgCi0gKiAgW2luXSAgICBkeSAgICAgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS80IHBpeGVsIHVuaXQgKDB+MykgCi0gKiAgW291dF0gICBwRHN0ICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCi0gKgotICovCi0KLSBPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hKAotICAgICBjb25zdCBPTVhfVTggICAgICpwU3JjLAotICAgICBPTVhfVTMyICAgIGlTcmNTdGVwLAotICAgICBPTVhfVTggICAgICpwRHN0LAotICAgICBPTVhfVTMyICAgIGlEc3RTdGVwLAotICAgICBPTVhfVTMyICAgIGlXaWR0aCwKLSAgICAgT01YX1UzMiAgICBpSGVpZ2h0LAotICAgICBPTVhfVTMyICAgIGR4LAotICAgICBPTVhfVTMyICAgIGR5Ci0pCi17Ci0gICAgT01YX1U4ICAgICAgcEJ1ZjEgWzE2KjE2XTsKLSAgICBjb25zdCBPTVhfVTggICAgICAqcFNyY0hhbGZIb3IgPSBwU3JjOwotICAgIGNvbnN0IE9NWF9VOCAgICAgICpwU3JjSGFsZlZlciA9IHBTcmM7Ci0KLSAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoZHggPiAzLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihkeSA+IDMsIE9NWF9TdHNfQmFkQXJnRXJyKQotCi0gICAgLyogV29yayBvdXQgcG9zaXRpb25zIGZvciBoYWxmIHBpeGVsIGludGVycG9sYXRpb24gKi8KLSAgICBpZiAoZHggPT0gMykKLSAgICB7Ci0gICAgICAgIHBTcmNIYWxmVmVyICs9IDE7Ci0gICAgfQotICAgIGlmIChkeSA9PSAzKQotICAgIHsKLSAgICAgICAgcFNyY0hhbGZIb3IgKz0gaVNyY1N0ZXA7Ci0gICAgfQotCi0gICAgLyogU3dpdGNoIG9uIHR5cGUgb2YgcGl4ZWwKLSAgICAgKiBQaXhlbHMgYXJlIG5hbWVkICdhJyB0byAncycgYXMgaW4gdGhlIEguMjY0IHN0YW5kYXJkCi0gICAgICovCi0gICAgaWYgKGR4ID09IDAgJiYgZHkgPT0gMCkKLSAgICB7Ci0gICAgICAgIC8qIEcgKi8KLSAgICAgICAgYXJtTTRQMTBfQ29weShwU3JjLCBpU3JjU3RlcCwgcERzdCwgaURzdFN0ZXAsIGlXaWR0aCwgaUhlaWdodCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGR5ID09IDApCi0gICAgewotICAgICAgICAvKiBhLCBiLCBjICovCi0gICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEKLSAgICAgICAgICAgIChwU3JjSGFsZkhvciwgaVNyY1N0ZXAsIHBEc3QsIGlEc3RTdGVwLCBpV2lkdGgsIGlIZWlnaHQpOyAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgaWYgKGR4ID09IDEgfHwgZHggPT0gMykKLSAgICAgICAgewotICAgICAgICAgICAgYXJtVkNDT01NX0F2ZXJhZ2UgCi0gICAgICAgICAgICAgICAgKHBEc3QsIHBTcmNIYWxmVmVyLCBpRHN0U3RlcCwgaVNyY1N0ZXAsIHBEc3QsIGlEc3RTdGVwLCBpV2lkdGgsIGlIZWlnaHQpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGR4ID09IDApCi0gICAgewotICAgICAgICAvKiBkLCBoLCBuICovCi0gICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEKLSAgICAgICAgICAgIChwU3JjSGFsZlZlciwgaVNyY1N0ZXAsIHBEc3QsIGlEc3RTdGVwLCBpV2lkdGgsIGlIZWlnaHQpOwotCi0gICAgICAgIGlmIChkeSA9PSAxIHx8IGR5ID09IDMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFybVZDQ09NTV9BdmVyYWdlIAotICAgICAgICAgICAgICAgIChwRHN0LCBwU3JjSGFsZkhvciwgaURzdFN0ZXAsIGlTcmNTdGVwLCBwRHN0LCBpRHN0U3RlcCwgaVdpZHRoLCBpSGVpZ2h0KTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChkeCA9PSAyIHx8IGR5ID09IDIpCi0gICAgewotICAgICAgICAvKiBqICovCi0gICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmRGlhZ19MdW1hCi0gICAgICAgICAgICAocFNyYywgaVNyY1N0ZXAsIHBEc3QsIGlEc3RTdGVwLCBpV2lkdGgsIGlIZWlnaHQpOwotCi0gICAgICAgIGlmIChkeCA9PSAxIHx8IGR4ID09IDMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIGksIGsgKi8KLSAgICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEKLSAgICAgICAgICAgICAgICAocFNyY0hhbGZWZXIsIGlTcmNTdGVwLCBwQnVmMSwgaVdpZHRoLCBpV2lkdGgsIGlIZWlnaHQpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgYXJtVkNDT01NX0F2ZXJhZ2UgCi0gICAgICAgICAgICAgICAgKHBEc3QsIHBCdWYxLCBpRHN0U3RlcCwgaVdpZHRoLCBwRHN0LCBpRHN0U3RlcCwgaVdpZHRoLCBpSGVpZ2h0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZHkgPT0gMSB8fCBkeSA9PSAzKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBmLHEgKi8KLSAgICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEKLSAgICAgICAgICAgICAgICAocFNyY0hhbGZIb3IsIGlTcmNTdGVwLCBwQnVmMSwgaVdpZHRoLCBpV2lkdGgsIGlIZWlnaHQpOwotCi0gICAgICAgICAgICBhcm1WQ0NPTU1fQXZlcmFnZSAKLSAgICAgICAgICAgICAgICAocERzdCwgcEJ1ZjEsIGlEc3RTdGVwLCBpV2lkdGgsIHBEc3QsIGlEc3RTdGVwLCBpV2lkdGgsIGlIZWlnaHQpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgLyogZHg9MSwzIGFuZCBkeT0xLDMgKi8KLSAgICB7Ci0gICAgICAgIC8qIGUsIGcsIHAsIHIgKi8KLSAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYQotICAgICAgICAgICAgKHBTcmNIYWxmSG9yLCBpU3JjU3RlcCwgcEJ1ZjEsIGlXaWR0aCwgaVdpZHRoLCBpSGVpZ2h0KTsKLQotICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hCi0gICAgICAgICAgICAocFNyY0hhbGZWZXIsIGlTcmNTdGVwLCBwRHN0LCBpRHN0U3RlcCwgaVdpZHRoLCBpSGVpZ2h0KTsKLQotICAgICAgICBhcm1WQ0NPTU1fQXZlcmFnZSAKLSAgICAgICAgICAgIChwQnVmMSwgcERzdCwgaVdpZHRoLCBpRHN0U3RlcCwgcERzdCwgaURzdFN0ZXAsIGlXaWR0aCwgaUhlaWdodCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQzR4NC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQzR4NC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjAwZDU1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUHJlZGljdEludHJhREM0eDQuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX1ByZWRpY3RJbnRyYURDNHg0LmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBILjI2NCA0eDQgaW50cmEgcHJlZGljdGlvbiBtb2R1bGUKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm0gREMgc3R5bGUgaW50cmEgcHJlZGljdGlvbiwgYXZlcmFnaW5nIHVwcGVyIGFuZCBsZWZ0IGJsb2NrCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcFNyY0xlZnQJCVBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBsZWZ0IGNvZWZmaWNpZW50czoKLSAqCQkJCQkJCQlwW3gsIHldICh4ID0gLTEsIHkgPSAwLi4zKQotICogW2luXQlwU3JjQWJvdmUJCVBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBhYm92ZSBjb2VmZmljaWVudHM6Ci0gKgkJCQkJCQkJcFt4LHldICh4ID0gMC4uMywgeSA9IC0xKQotICogW2luXQlsZWZ0U3RlcAkJU3RlcCBvZiBsZWZ0IGNvZWZmaWNpZW50IGJ1ZmZlcgotICogW2luXQlkc3RTdGVwCQkJU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyCi0gKiBbaW5dCWF2YWlsYWJpbGl0eQlOZWlnaGJvcmluZyAxNngxNiBNQiBhdmFpbGFiaWxpdHkgZmxhZwotICogW291dF0JcERzdAkJCVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE5vbmUKLSAqLwotCi12b2lkIGFybVZDTTRQMTBfUHJlZGljdEludHJhREM0eDQoCi0gICAgIGNvbnN0IE9NWF9VOCogcFNyY0xlZnQsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAotICAgICBPTVhfVTgqIHBEc3QsCi0gICAgIE9NWF9JTlQgbGVmdFN0ZXAsCi0gICAgIE9NWF9JTlQgZHN0U3RlcCwKLSAgICAgT01YX1MzMiBhdmFpbGFiaWxpdHkgICAgICAgIAotKQotewotICAgIGludCB4LCB5LCBTdW09MCwgQ291bnQgPSAwOwotCi0gICAgaWYgKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19MRUZUKQotICAgIHsKLSAgICAgICAgZm9yICh5PTA7IHk8NDsgeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdW0gKz0gcFNyY0xlZnRbeSpsZWZ0U3RlcF07Ci0gICAgICAgIH0KLSAgICAgICAgQ291bnQrKzsKLSAgICB9Ci0gICAgaWYgKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUikKLSAgICB7Ci0gICAgICAgIGZvciAoeD0wOyB4PDQ7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgU3VtICs9IHBTcmNBYm92ZVt4XTsKLSAgICAgICAgfQotICAgICAgICBDb3VudCsrOwotICAgIH0KLSAgICBpZiAoQ291bnQ9PTApCi0gICAgewotICAgICAgICBTdW0gPSAxMjg7Ci0gICAgfQotICAgIGVsc2UgaWYgKENvdW50PT0xKQotICAgIHsKLSAgICAgICAgU3VtID0gKFN1bSArIDIpID4+IDI7Ci0gICAgfQotICAgIGVsc2UgLyogQ291bnQgPSAyICovCi0gICAgewotICAgICAgICBTdW0gPSAoU3VtICsgNCkgPj4gMzsKLSAgICB9Ci0gICAgZm9yICh5PTA7IHk8NDsgeSsrKQotICAgIHsKLSAgICAgICAgZm9yICh4PTA7IHg8NDsgeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCt4XSA9IChPTVhfVTgpU3VtOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9RdWFudFRhYmxlcy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9RdWFudFRhYmxlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDFkNGY2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfUXVhbnRUYWJsZXMuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEguMjY0IGludmVyc2UgcXVhbnRpemUgdGFibGVzCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0KLWNvbnN0IE9NWF9VMzIgYXJtVkNNNFAxMF9NRk1hdHJpeFs2XVszXSA9Ci17Ci0gICAgezEzMTA3LCA1MjQzLCA4MDY2fSwKLSAgICB7MTE5MTYsIDQ2NjAsIDc0OTB9LAotICAgIHsxMDA4MiwgNDE5NCwgNjU1NH0sCi0gICAgeyA5MzYyLCAzNjQ3LCA1ODI1fSwKLSAgICB7IDgxOTIsIDMzNTUsIDUyNDN9LAotICAgIHsgNzI4MiwgMjg5MywgNDU1OX0KLX07IApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9TQURRdWFyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1NBRFF1YXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVmOGFmNS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1NBRFF1YXIuYworKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX1NBRFF1YXIuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIFNBRCBvZiBwU3JjIHdpdGggYXZlcmFnZSBvZiB0d28gUmVmIGJsb2NrcwotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9TQURRdWFyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBiZXR3ZWVuIG9uZSBibG9jayAocFNyYykgYW5kIHRoZSAKLSAqIGF2ZXJhZ2Ugb2YgdGhlIG90aGVyIHR3byAocFNyY1JlZjAgYW5kIHBTcmNSZWYxKQotICoKLSAqIFJlbWFya3M6Ci0gKgotICogW2luXQkJcFNyYwkJCQlQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jawotICogW2luXQkJcFNyY1JlZjAJCVBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDAKLSAqIFtpbl0JCXBTcmNSZWYxCQlQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxCi0gKiBbaW5dCQlpU3JjU3RlcCAJCVN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcgotICogW2luXQkJaVJlZlN0ZXAwCQlTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogW2luXQkJaVJlZlN0ZXAxIAlTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogW2luXQkJaUhlaWdodAkJCUhlaWdodCBvZiB0aGUgYmxvY2sKLSAqIFtpbl0JCWlXaWR0aAkJCVdpZHRoIG9mIHRoZSBibG9jawotICogW291dF0JcERzdFNBRAkJCVBvaW50ZXIgb2YgcmVzdWx0IFNBRAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLU9NWFJlc3VsdCBhcm1WQ000UDEwX1NBRFF1YXIoCi0JY29uc3QgT01YX1U4KiAJcFNyYywKLSAgICBjb25zdCBPTVhfVTgqIAlwU3JjUmVmMCwKLQljb25zdCBPTVhfVTgqIAlwU3JjUmVmMSwJCi0gICAgT01YX1UzMiAJaVNyY1N0ZXAsCi0gICAgT01YX1UzMgkJaVJlZlN0ZXAwLAotICAgIE9NWF9VMzIJCWlSZWZTdGVwMSwKLSAgICBPTVhfVTMyKglwRHN0U0FELAotICAgIE9NWF9VMzIgICAgIGlIZWlnaHQsCi0gICAgT01YX1UzMiAgICAgaVdpZHRoCi0pCi17Ci0gICAgT01YX0lOVCAgICAgeCwgeTsKLSAgICBPTVhfUzMyICAgICBTQUQgPSAwOwotCi0gICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmMCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmMSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0U0FEID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotCi0gICAgZm9yICh5ID0gMDsgeSA8IGlIZWlnaHQ7IHkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoeCA9IDA7IHggPCBpV2lkdGg7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgU0FEICs9IGFybUFicyhwU3JjIFt5ICogaVNyY1N0ZXAgKyB4XSAtICgoCi0gICAgICAgICAgICAgICAgICAgIHBTcmNSZWYwIFt5ICogaVJlZlN0ZXAwICsgeF0gKyAKLSAgICAgICAgICAgICAgICAgICAgcFNyY1JlZjEgW3kgKiBpUmVmU3RlcDEgKyB4XSArIDEpID4+IDEpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAgICAgCi0gICAgKnBEc3RTQUQgPSBTQUQ7Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM1MzczMS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0LmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBILjI2NCB0cmFuc2Zvcm0gbW9kdWxlCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotIAotLyoKLSAqIERlc2NyaXB0aW9uOgotICogVHJhbnNmb3JtIFJlc2lkdWFsIDR4NCBDb2VmZmljaWVudHMKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgcFNyYwkJU291cmNlIDR4NCBibG9jawotICogW291dF0gcERzdAkJRGVzdGluYXRpb24gNHg0IGJsb2NrCi0gKgotICovCi0KLXZvaWQgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NChPTVhfUzE2KiBwRHN0LCBPTVhfUzE2ICpwU3JjKQotewotICAgIGludCBpOwotCi0gICAgLyogVHJhbnNmb3JtIHJvd3MgKi8KLSAgICBmb3IgKGk9MDsgaTwxNjsgaSs9NCkKLSAgICB7Ci0gICAgICAgIGludCBkMCA9IHBTcmNbaSswXTsKLSAgICAgICAgaW50IGQxID0gcFNyY1tpKzFdOwotICAgICAgICBpbnQgZDIgPSBwU3JjW2krMl07Ci0gICAgICAgIGludCBkMyA9IHBTcmNbaSszXTsKLSAgICAgICAgaW50IGUwID0gZDAgKyBkMjsKLSAgICAgICAgaW50IGUxID0gZDAgLSBkMjsKLSAgICAgICAgaW50IGUyID0gKGQxPj4xKSAtIGQzOwotICAgICAgICBpbnQgZTMgPSBkMSArIChkMz4+MSk7Ci0gICAgICAgIGludCBmMCA9IGUwICsgZTM7Ci0gICAgICAgIGludCBmMSA9IGUxICsgZTI7Ci0gICAgICAgIGludCBmMiA9IGUxIC0gZTI7Ci0gICAgICAgIGludCBmMyA9IGUwIC0gZTM7Ci0gICAgICAgIHBEc3RbaSswXSA9IChPTVhfUzE2KWYwOwotICAgICAgICBwRHN0W2krMV0gPSAoT01YX1MxNilmMTsKLSAgICAgICAgcERzdFtpKzJdID0gKE9NWF9TMTYpZjI7Ci0gICAgICAgIHBEc3RbaSszXSA9IChPTVhfUzE2KWYzOwotICAgIH0KLQotICAgIC8qIFRyYW5zZm9ybSBjb2x1bW5zICovCi0gICAgZm9yIChpPTA7IGk8NDsgaSsrKQotICAgIHsKLSAgICAgICAgaW50IGYwID0gcERzdFtpKzBdOwotICAgICAgICBpbnQgZjEgPSBwRHN0W2krNF07Ci0gICAgICAgIGludCBmMiA9IHBEc3RbaSs4XTsKLSAgICAgICAgaW50IGYzID0gcERzdFtpKzEyXTsKLSAgICAgICAgaW50IGcwID0gZjAgKyBmMjsKLSAgICAgICAgaW50IGcxID0gZjAgLSBmMjsKLSAgICAgICAgaW50IGcyID0gKGYxPj4xKSAtIGYzOwotICAgICAgICBpbnQgZzMgPSBmMSArIChmMz4+MSk7Ci0gICAgICAgIGludCBoMCA9IGcwICsgZzM7Ci0gICAgICAgIGludCBoMSA9IGcxICsgZzI7Ci0gICAgICAgIGludCBoMiA9IGcxIC0gZzI7Ci0gICAgICAgIGludCBoMyA9IGcwIC0gZzM7Ci0gICAgICAgIHBEc3RbaSswXSA9IChPTVhfUzE2KSgoaDArMzIpPj42KTsKLSAgICAgICAgcERzdFtpKzRdID0gKE9NWF9TMTYpKChoMSszMik+PjYpOwotICAgICAgICBwRHN0W2krOF0gPSAoT01YX1MxNikoKGgyKzMyKT4+Nik7Ci0gICAgICAgIHBEc3RbaSsxMl0gPSAoT01YX1MxNikoKGgzKzMyKT4+Nik7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrMngyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrMngyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMDA0ZTUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazJ4Mi5jCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfVW5wYWNrQmxvY2syeDIuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEguMjY0IGludmVyc2UgcXVhbnRpemUgYW5kIHRyYW5zZm9ybSBoZWxwZXIgbW9kdWxlCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qCi0gKiBEZXNjcmlwdGlvbgotICogVW5wYWNrIGEgMngyIGJsb2NrIG9mIGNvZWZmaWNpZW50LXJlc2lkdWFsIHBhaXIgdmFsdWVzCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcHBTcmMJRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpcgotICoJCQkJCQlidWZmZXIgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nCi0gKiBbb3V0XQlwcFNyYwkqcHBTcmMgaXMgdXBkYXRlZCB0byB0aGUgc3RhcnQgb2YgbmV4dCBub24gZW1wdHkgYmxvY2sKLSAqIFtvdXRdCXBEc3QJUG9pbnRlciB0byB1bnBhY2tlZCA0eDQgYmxvY2sKLSAqLwotCi12b2lkIGFybVZDTTRQMTBfVW5wYWNrQmxvY2syeDIoCi0gICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAotICAgICBPTVhfUzE2KiBwRHN0Ci0pCi17Ci0gICAgY29uc3QgT01YX1U4ICpwU3JjID0gKnBwU3JjOwotICAgIGludCBpOwotICAgIGludCBGbGFnLCBWYWx1ZTsKLQotICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKLSAgICB7Ci0gICAgICAgIHBEc3RbaV0gPSAwOwotICAgIH0KLQotICAgIGRvCi0gICAgewotICAgICAgICBGbGFnICA9ICpwU3JjKys7Ci0gICAgICAgIGlmIChGbGFnICYgMHgxMCkKLSAgICAgICAgewotICAgICAgICAgICAgLyogMTYgYml0ICovCi0gICAgICAgICAgICBWYWx1ZSA9ICpwU3JjKys7Ci0gICAgICAgICAgICBWYWx1ZSA9IFZhbHVlIHwgKCgqcFNyYysrKTw8OCk7Ci0gICAgICAgICAgICBpZiAoVmFsdWUgJiAweDgwMDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVmFsdWUgLT0gMHgxMDAwMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIDggYml0ICovCi0gICAgICAgICAgICBWYWx1ZSA9ICpwU3JjKys7Ci0gICAgICAgICAgICBpZiAoVmFsdWUgJiAweDgwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFZhbHVlIC09IDB4MTAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGkgPSBGbGFnICYgMTU7Ci0gICAgICAgIHBEc3RbaV0gPSAoT01YX1MxNilWYWx1ZTsKLSAgICB9Ci0gICAgd2hpbGUgKChGbGFnICYgMHgyMCk9PTApOwotCi0gICAgKnBwU3JjID0gcFNyYzsKLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQwYzkzMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0LmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBILjI2NCBpbnZlcnNlIHF1YW50aXplIGFuZCB0cmFuc2Zvcm0gaGVscGVyIG1vZHVsZQotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKgotICogRGVzY3JpcHRpb24KLSAqIFVucGFjayBhIDR4NCBibG9jayBvZiBjb2VmZmljaWVudC1yZXNpZHVhbCBwYWlyIHZhbHVlcwotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwU3JjCURvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIKLSAqCQkJCQkJYnVmZmVyIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZwotICogW291dF0JcHBTcmMJKnBwU3JjIGlzIHVwZGF0ZWQgdG8gdGhlIHN0YXJ0IG9mIG5leHQgbm9uIGVtcHR5IGJsb2NrCi0gKiBbb3V0XQlwRHN0CVBvaW50ZXIgdG8gdW5wYWNrZWQgNHg0IGJsb2NrCi0gKi8KLQotdm9pZCBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0KAotICAgICBjb25zdCBPTVhfVTggKipwcFNyYywKLSAgICAgT01YX1MxNiogcERzdAotKQotewotICAgIGNvbnN0IE9NWF9VOCAqcFNyYyA9ICpwcFNyYzsKLSAgICBpbnQgaTsKLSAgICBpbnQgRmxhZywgVmFsdWU7Ci0KLSAgICBmb3IgKGk9MDsgaTwxNjsgaSsrKQotICAgIHsKLSAgICAgICAgcERzdFtpXSA9IDA7Ci0gICAgfQotCi0gICAgZG8KLSAgICB7Ci0gICAgICAgIEZsYWcgID0gKnBTcmMrKzsKLSAgICAgICAgaWYgKEZsYWcgJiAweDEwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiAxNiBiaXQgKi8KLSAgICAgICAgICAgIFZhbHVlID0gKnBTcmMrKzsKLSAgICAgICAgICAgIFZhbHVlID0gVmFsdWUgfCAoKCpwU3JjKyspPDw4KTsKLSAgICAgICAgICAgIGlmIChWYWx1ZSAmIDB4ODAwMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWYWx1ZSAtPSAweDEwMDAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogOCBiaXQgKi8KLSAgICAgICAgICAgIFZhbHVlID0gKnBTcmMrKzsKLSAgICAgICAgICAgIGlmIChWYWx1ZSAmIDB4ODApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVmFsdWUgLT0gMHgxMDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaSA9IEZsYWcgJiAxNTsKLSAgICAgICAgcERzdFtpXSA9IChPTVhfUzE2KVZhbHVlOwotICAgIH0KLSAgICB3aGlsZSAoKEZsYWcgJiAweDIwKT09MCk7Ci0KLSAgICAqcHBTcmMgPSBwU3JjOwotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9BdmVyYWdlXzR4LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0F2ZXJhZ2VfNHguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM4NjA1ZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0F2ZXJhZ2VfNHguYworKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0F2ZXJhZ2VfNHguYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIEF2ZXJhZ2Ugb2YgdHdvIDR4NCBvciA0eDggYmxvY2tzCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0F2ZXJhZ2VfNHggICAoNi4zLjUuNS4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byA0eDQsIDR4OCBibG9ja3MuICBUaGUgcmVzdWx0IAotICogaXMgcm91bmRlZCBhY2NvcmRpbmcgdG8gKGErYisxKS8yLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwUHJlZDAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIHBQcmVkMSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaVByZWRTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDA7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgaVByZWRTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDE7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2tzOyBtdXN0IGJlIGVpdGhlciA0IG9yIDguIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0UHJlZCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgICBwUHJlZDAsIHBQcmVkMSwgb3IgcERzdFByZWQgCi0gKiAgICAtICAgIHBEc3RQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBpUHJlZFN0ZXAwIDw9IDAgb3IgaVByZWRTdGVwMCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICogICAgLSAgICBpUHJlZFN0ZXAxIDw9IDAgb3IgaVByZWRTdGVwMSBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICogICAgLSAgICBpRHN0U3RlcCA8PSAwIG9yIGlEc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0IG9yIDggCi0gKgotICovCi0gT01YUmVzdWx0IG9teFZDTTRQMTBfQXZlcmFnZV80eCAoCi0JIGNvbnN0IE9NWF9VOCogCSAgICBwUHJlZDAsCi0JIGNvbnN0IE9NWF9VOCogCSAgICBwUHJlZDEsCQotCSBPTVhfVTMyCQlpUHJlZFN0ZXAwLAotCSBPTVhfVTMyCQlpUHJlZFN0ZXAxLAotCSBPTVhfVTgqCQlwRHN0UHJlZCwKLQkgT01YX1UzMgkJaURzdFN0ZXAsIAotCSBPTVhfVTMyCQlpSGVpZ2h0Ci0pCi17Ci0gICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCi0gICAgYXJtUmV0QXJnRXJySWYocFByZWQwID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBQcmVkMSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0UHJlZCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigoaUhlaWdodCAhPSA0KSAmJiAoaUhlaWdodCAhPSA4KSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlQcmVkU3RlcDAgPT0gMCkgfHwgKGlQcmVkU3RlcDAgJiAzKSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlQcmVkU3RlcDEgPT0gMCkgfHwgKGlQcmVkU3RlcDEgJiAzKSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlEc3RTdGVwID09IDApIHx8IChpRHN0U3RlcCAmIDMpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocERzdFByZWQpLCBPTVhfU3RzX0JhZEFyZ0VycikKLQotICAgIHJldHVybiBhcm1WQ0NPTU1fQXZlcmFnZSAKLSAgICAgICAgKHBQcmVkMCwgcFByZWQxLCBpUHJlZFN0ZXAwLCBpUHJlZFN0ZXAxLCBwRHN0UHJlZCwgaURzdFN0ZXAsIDQsIGlIZWlnaHQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjZmRiNjQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYuYworKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udGFpbnMgbW9kdWxlcyBmb3IgaGFsZiBwZWwgQmxvY2sgbWF0Y2hpbmcsIAotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotICAgIAotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmICAgKDYuMy41LjIuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGEgaGFsZi1wZWwgYmxvY2sgbWF0Y2ggdXNpbmcgcmVzdWx0cyBmcm9tIGEgcHJpb3IgaW50ZWdlciBzZWFyY2guIAotICogIFJldHVybnMgdGhlIGJlc3QgTVYgYW5kIGFzc29jaWF0ZWQgY29zdC4gIFRoaXMgZnVuY3Rpb24gZXN0aW1hdGVzIHRoZSAKLSAqIGhhbGYtcGl4ZWwgbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIHJlc29sdXRpb24gbW90aW9uIAotICogdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0QmVzdE1WLCBpLmUuLCB0aGUgaW5pdGlhbCAKLSAqIGludGVnZXIgTVYgaXMgZ2VuZXJhdGVkIGV4dGVybmFsbHkuICBUaGUgZnVuY3Rpb24gCi0gKiBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciBtYXkgYmUgdXNlZCBmb3IgaW50ZWdlciBtb3Rpb24gZXN0aW1hdGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY09yZ1kgLSBQb2ludGVyIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUuIElmIAotICogICAgICAgICAgICBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIElmIGlCbG9ja1dpZHRoPT04LCAgCi0gKiAgICAgICAgICAgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgCi0gKiAgICAgICAgICAgIHJlcXVpcmVkLiAKLSAqICAgcFNyY1JlZlkgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgYmxvY2sgaW4gdGhlIAotICogICAgICAgICAgICByZWZlcmVuY2UgcGljdHVyZSAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IAotICogICAgICAgICAgICByZXF1aXJlZC4gIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIElmIAotICogICAgICAgICAgICBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgblNyY09yZ1N0ZXAgLSBTdHJpZGUgb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgaUJsb2NrV2lkdGguIAotICogICBuU3JjUmVmU3RlcCAtIFN0cmlkZSBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzIAotICogICBpQmxvY2tXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRlcm1zIG9mIGZ1bGwgcGl4ZWxzOyBtdXN0IAotICogICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICogICBpQmxvY2tIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGVybXMgb2YgZnVsbCBwaXhlbHM7IG11c3QgCi0gKiAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKiAgIG5MYW1kYSAtIExhbWRhIGZhY3RvciwgdXNlZCB0byBjb21wdXRlIG1vdGlvbiBjb3N0IAotICogICBwTVZQcmVkIC0gUHJlZGljdGVkIE1WLCByZXByZXNlbnRlZCBpbiB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzOyB1c2VkIHRvIAotICogICAgICAgICAgICBjb21wdXRlIG1vdGlvbiBjb3N0IAotICogICBwU3JjRHN0QmVzdE1WIC0gVGhlIGJlc3QgTVYgcmVzdWx0aW5nIGZyb20gYSBwcmlvciBpbnRlZ2VyIHNlYXJjaCwgCi0gKiAgICAgICAgICAgIHJlcHJlc2VudGVkIGluIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHMgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3RCZXN0TVYgLSBCZXN0IE1WIHJlc3VsdGluZyBmcm9tIHRoZSBoYWxmLXBlbCBzZWFyY2gsIGV4cHJlc3NlZCBpbiAKLSAqICAgICAgICAgICAgdGVybXMgb2YgMS80LXBlbCB1bml0cyAKLSAqICAgcEJlc3RDb3N0IC0gTW90aW9uIGNvc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBiZXN0IE1WOyBjb21wdXRlZCBhcyAKLSAqICAgICAgICAgICAgU0FEK0xhbWRhKkJpdHNVc2VkQnlNViAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBhbnkgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjT3JnWSwgcFNyY1JlZlksIAotICogICAgICAgICAgICAgIHBTcmNEc3RCZXN0TVYsIHBNVlByZWQsIHBCZXN0Q29zdCAKLSAqICAgIC0gICAgaUJsb2NrV2lkdGggb3IgaUJsb2NrSGVpZ2h0IGFyZSBlcXVhbCB0byB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNi4gCi0gKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLSAKLU9NWFJlc3VsdCBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZigKLSAgICBjb25zdCBPTVhfVTgqIHBTcmNPcmdZLCAKLSAgICBPTVhfUzMyIG5TcmNPcmdTdGVwLCAKLSAgICBjb25zdCBPTVhfVTgqIHBTcmNSZWZZLCAKLSAgICBPTVhfUzMyIG5TcmNSZWZTdGVwLCAKLSAgICBPTVhfVTggaUJsb2NrV2lkdGgsIAotICAgIE9NWF9VOCBpQmxvY2tIZWlnaHQsIAotICAgIE9NWF9VMzIgbkxhbWRhLCAKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciogcE1WUHJlZCwgCi0gICAgT01YVkNNb3Rpb25WZWN0b3IqIHBTcmNEc3RCZXN0TVYsIAotICAgIE9NWF9TMzIqIHBCZXN0Q29zdAotKQotewotICAgIC8qIERlZmluaXRpb25zIGFuZCBJbml0aWFsaXphdGlvbnMqLwotICAgIE9NWF9JTlQgICAgIGNhbmRTQUQ7Ci0gICAgT01YX0lOVCAgICAgZnJvbVgsIHRvWCwgZnJvbVksIHRvWTsKLSAgICAvKiBPZmZzZXQgdG8gdGhlIHJlZmVyZW5jZSBhdCB0aGUgYmVnaW5pbmcgb2YgdGhlIGJvdW5kaW5nIGJveCAqLwotICAgIGNvbnN0IE9NWF9VOCAgICAgICpwVGVtcFNyY1JlZlksICpwVGVtcFNyY09yZ1k7Ci0gICAgT01YX1MxNiAgICAgeCwgeTsKLSAgICBPTVhWQ01vdGlvblZlY3RvciBkaWZmTVYsIGNhbmRNViwgaW50ZWdlck1WOwotICAgIE9NWF9VOCAgICAgIGludGVycG9sWVsyNTZdOwotCi0gICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCi0gICAgYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09ICA0KSAmJiAoIWFybUlzNEJ5dGVBbGlnbmVkKHBTcmNPcmdZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gIDgpICYmICghYXJtSXM4Qnl0ZUFsaWduZWQocFNyY09yZ1kpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAxNikgJiYgKCFhcm1JczE2Qnl0ZUFsaWduZWQocFNyY09yZ1kpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotCWFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAgNCkgJiYgKCFhcm1JczRCeXRlQWxpZ25lZChwU3JjUmVmWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09ICA4KSAmJiAoIWFybUlzOEJ5dGVBbGlnbmVkKHBTcmNSZWZZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gMTYpICYmICghYXJtSXMxNkJ5dGVBbGlnbmVkKHBTcmNSZWZZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoblNyY09yZ1N0ZXAgJSBpQmxvY2tXaWR0aCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjT3JnWSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZlkgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBNVlByZWQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3RCZXN0TVYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCZXN0Q29zdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0JYXJtUmV0QXJnRXJySWYoKChpQmxvY2tXaWR0aCE9NCkmJihpQmxvY2tXaWR0aCE9OCkmJihpQmxvY2tXaWR0aCE9MTYpKSAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQlhcm1SZXRBcmdFcnJJZigoKGlCbG9ja0hlaWdodCE9NCkmJihpQmxvY2tIZWlnaHQhPTgpJiYoaUJsb2NrSGVpZ2h0IT0xNikpICwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgICAgICAKLSAgICAgICAgICAgIAotICAgIC8qIENoZWNrIGZvciB2YWxpZCByZWdpb24gKi8gCi0gICAgZnJvbVggPSAxOwotICAgIHRvWCAgID0gMTsKLSAgICBmcm9tWSA9IDE7Ci0gICAgdG9ZICAgPSAxOwotICAgIAotICAgIC8qIEluaXRpYWxpemUgdG8gbWF4IHZhbHVlIGFzIGEgc3RhcnQgcG9pbnQgKi8KLSAgICAqcEJlc3RDb3N0ID0gMHg3ZmZmZmZmZjsKLSAgICAKLSAgICBpbnRlZ2VyTVYuZHggPSBwU3JjRHN0QmVzdE1WLT5keDsKLSAgICBpbnRlZ2VyTVYuZHkgPSBwU3JjRHN0QmVzdE1WLT5keTsKLSAgICAKLSAgICAvKiBMb29waW5nIG9uIHktIGF4aXMgKi8KLSAgICBmb3IgKHkgPSAtZnJvbVk7IHkgPD0gdG9ZOyB5KyspCi0gICAgewotICAgICAgICAvKiBMb29waW5nIG9uIHgtIGF4aXMgKi8KLSAgICAgICAgZm9yICh4ID0gLWZyb21YOyB4IDw9IHRvWDsgeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBQb3NpdGlvbmluZyB0aGUgcG9pbnRlciAqLwotICAgICAgICAgICAgcFRlbXBTcmNSZWZZID0gcFNyY1JlZlkgKyAoblNyY1JlZlN0ZXAgKiAoaW50ZWdlck1WLmR5LzQpKSArIChpbnRlZ2VyTVYuZHgvNCk7Ci0gICAgICAgICAgICBpZiAoeCA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFRlbXBTcmNSZWZZID0gcFRlbXBTcmNSZWZZICsgeDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh5IDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwVGVtcFNyY1JlZlkgPSBwVGVtcFNyY1JlZlkgKyAoeSAqIG5TcmNSZWZTdGVwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBUZW1wU3JjT3JnWSA9IHBTcmNPcmdZOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiBQcmVwYXJlIGNhbmQgTVYgKi8KLSAgICAgICAgICAgIGNhbmRNVi5keCA9IGludGVnZXJNVi5keCArIHggKiAyOwotICAgICAgICAgICAgY2FuZE1WLmR5ID0gaW50ZWdlck1WLmR5ICsgeSAqIDI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qIEludGVycG9sYXRlIGhhbGYgcGVsIGZvciB0aGUgY3VycmVudCBwb3NpdGlvbiovCi0gICAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEoCi0gICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFNyY1JlZlksCi0gICAgICAgICAgICAgICAgICAgICAgICBuU3JjUmVmU3RlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sWSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlCbG9ja1dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgaUJsb2NrV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBpQmxvY2tIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBhcm1BYnMoeCkgKiAyLAotICAgICAgICAgICAgICAgICAgICAgICAgYXJtQWJzKHkpICogMik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qIENhbGN1bGF0ZSB0aGUgU0FEICovCi0gICAgICAgICAgICBhcm1WQ0NPTU1fU0FEKAkKLSAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wU3JjT3JnWSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5TcmNPcmdTdGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwb2xZLAotICAgICAgICAgICAgICAgICAgICAgICAgaUJsb2NrV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAmY2FuZFNBRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlCbG9ja0hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlCbG9ja1dpZHRoKTsKLSAKLSAgICAgICAgICAgIGRpZmZNVi5keCA9IGNhbmRNVi5keCAtIHBNVlByZWQtPmR4OwotICAgICAgICAgICAgZGlmZk1WLmR5ID0gY2FuZE1WLmR5IC0gcE1WUHJlZC0+ZHk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qIFJlc3VsdCBjYWxjdWxhdGlvbnMgKi8KLSAgICAgICAgICAgIGFybVZDTTRQMTBfQ29tcGFyZU1vdGlvbkNvc3RUb01WICgKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbmRNVi5keCwgCi0gICAgICAgICAgICAgICAgICAgICAgICBjYW5kTVYuZHksIAotICAgICAgICAgICAgICAgICAgICAgICAgZGlmZk1WLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbmRTQUQsIAotICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0RzdEJlc3RNViwgCi0gICAgICAgICAgICAgICAgICAgICAgICBuTGFtZGEsIAotICAgICAgICAgICAgICAgICAgICAgICAgcEJlc3RDb3N0KTsKLQotICAgICAgICB9IC8qIEVuZCBvZiB4LSBheGlzICovCi0gICAgfSAvKiBFbmQgb2YgeS1heGlzICovCi0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLQotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MDIwMGYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udGFpbnMgbW9kdWxlcyBmb3IgQmxvY2sgbWF0Y2hpbmcsIGEgZnVsbCBzZWFyY2ggYWxnb3JpdGhtCi0gKiBpcyBpbXBsZW1lbnRlZAotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyICAgKDYuMy41LjIuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGludGVnZXIgYmxvY2sgbWF0Y2guICBSZXR1cm5zIGJlc3QgTVYgYW5kIGFzc29jaWF0ZWQgY29zdC4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY09yZ1kgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGN1cnJlbnQgYmxvY2suIElmIAotICogICAgICAgICAgICBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIElmIGlCbG9ja1dpZHRoPT04LCAgCi0gKiAgICAgICAgICAgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgCi0gKiAgICAgICAgICAgIHJlcXVpcmVkLiAKLSAqICAgcFNyY1JlZlkgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgYmxvY2sgaW4gdGhlIAotICogICAgICAgICAgICByZWZlcmVuY2UgcGljdHVyZS4gSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IAotICogICAgICAgICAgICByZXF1aXJlZC4gIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIElmIAotICogICAgICAgICAgICBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgblNyY09yZ1N0ZXAgLSBTdHJpZGUgb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUsIGV4cHJlc3NlZCBpbiB0ZXJtcyAKLSAqICAgICAgICAgICAgb2YgaW50ZWdlciBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiBpQmxvY2tXaWR0aC4gCi0gKiAgIG5TcmNSZWZTdGVwIC0gU3RyaWRlIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSwgZXhwcmVzc2VkIGluIHRlcm1zIAotICogICAgICAgICAgICBvZiBpbnRlZ2VyIHBpeGVscyAKLSAqICAgcFJlZlJlY3QgLSBwb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcmVjdGFuZ2xlIGluc2lkZSB0aGUgcmVmZXJlbmNlIAotICogICAgICAgICAgICBwaWN0dXJlIHBsYW5lIAotICogICBuQ3VyclBvaW50UG9zIC0gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCi0gKiAgIGlCbG9ja1dpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2ssIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBpbnRlZ2VyIAotICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqICAgaUJsb2NrSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrLCBleHByZXNzZWQgaW4gdGVybXMgb2YgCi0gKiAgICAgICAgICAgIGludGVnZXIgcGl4ZWxzOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKiAgIG5MYW1kYSAtIExhbWRhIGZhY3RvcjsgdXNlZCB0byBjb21wdXRlIG1vdGlvbiBjb3N0IAotICogICBwTVZQcmVkIC0gUHJlZGljdGVkIE1WOyB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QsIGV4cHJlc3NlZCBpbiB0ZXJtcyAKLSAqICAgICAgICAgICAgb2YgMS80LXBlbCB1bml0cyAKLSAqICAgcE1WQ2FuZGlkYXRlIC0gQ2FuZGlkYXRlIE1WOyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIG1vdGlvbiBzZWFyY2gsIAotICogICAgICAgICAgICBleHByZXNzZWQgaW4gdGVybXMgb2YgaW50ZWdlciBwaXhlbHMgCi0gKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdEJlc3RNViAtIEJlc3QgTVYgcmVzdWx0aW5nIGZyb20gaW50ZWdlciBzZWFyY2gsIGV4cHJlc3NlZCBpbiB0ZXJtcyAKLSAqICAgICAgICAgICAgb2YgMS80LXBlbCB1bml0cyAKLSAqICAgcEJlc3RDb3N0IC0gTW90aW9uIGNvc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBiZXN0IE1WOyBjb21wdXRlZCBhcyAKLSAqICAgICAgICAgICAgU0FEK0xhbWRhKkJpdHNVc2VkQnlNViAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBhbnkgb2YgdGhlIGZvbGxvd2luZyBwb2l0bmVycyBhcmUgTlVMTDoKLSAqICAgICAgICAgcFNyY09yZ1ksIHBTcmNSZWZZLCBwUmVmUmVjdCwgcE1WUHJlZCwgcE1WQ2FuZGlkYXRlLCBvciBwTUVTcGVjLiAKLSAqICAgIC0gICAgRWl0aGVyIGlCbG9ja1dpZHRoIG9yIGlCbG9ja0hlaWdodCBhcmUgdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYuIAotICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi0gCi0gT01YUmVzdWx0IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyICgKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjT3JnWSwKLSAgICAgT01YX1MzMiBuU3JjT3JnU3RlcCwKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmWSwKLSAgICAgT01YX1MzMiBuU3JjUmVmU3RlcCwKLQkgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0JIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCi0gICAgIE9NWF9VOCBpQmxvY2tXaWR0aCwKLSAgICAgT01YX1U4IGlCbG9ja0hlaWdodCwKLSAgICAgT01YX1UzMiBuTGFtZGEsCi0gICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZQcmVkLAotICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcE1WQ2FuZGlkYXRlLAotICAgICBPTVhWQ01vdGlvblZlY3RvciAqcEJlc3RNViwKLSAgICAgT01YX1MzMiAqcEJlc3RDb3N0LAotICAgICB2b2lkICpwTUVTcGVjCi0pCi17Ci0gICAgLyogRGVmaW5pdGlvbnMgYW5kIEluaXRpYWxpemF0aW9ucyovCi0gICAgT01YX0lOVCBjYW5kU0FEOwotICAgIE9NWF9JTlQgZnJvbVgsIHRvWCwgZnJvbVksIHRvWTsKLSAgICAvKiBPZmZzZXQgdG8gdGhlIHJlZmVyZW5jZSBhdCB0aGUgYmVnaW5pbmcgb2YgdGhlIGJvdW5kaW5nIGJveCAqLwotICAgIGNvbnN0IE9NWF9VOCAqcFRlbXBTcmNSZWZZLCAqcFRlbXBTcmNPcmdZOwotICAgIE9NWF9TMTYgeCwgeTsKLSAgICBPTVhWQ01vdGlvblZlY3RvciBkaWZmTVY7Ci0gICAgT01YX1MzMiBuU2VhcmNoUmFuZ2U7Ci0gICAgQVJNVkNNNFAxMF9NRVNwZWMgKmFybU1FU3BlYyA9IChBUk1WQ000UDEwX01FU3BlYyAqKSBwTUVTcGVjOwotCi0gICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCi0gICAgYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09ICA0KSAmJiAoIWFybUlzNEJ5dGVBbGlnbmVkKHBTcmNPcmdZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gIDgpICYmICghYXJtSXM4Qnl0ZUFsaWduZWQocFNyY09yZ1kpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAxNikgJiYgKCFhcm1JczE2Qnl0ZUFsaWduZWQocFNyY09yZ1kpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotCWFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAgNCkgJiYgKCFhcm1JczRCeXRlQWxpZ25lZChwU3JjUmVmWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09ICA4KSAmJiAoIWFybUlzOEJ5dGVBbGlnbmVkKHBTcmNSZWZZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gMTYpICYmICghYXJtSXMxNkJ5dGVBbGlnbmVkKHBTcmNSZWZZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjT3JnWSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZlkgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBNVlByZWQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBNVkNhbmRpZGF0ZSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJlc3RNViA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJlc3RDb3N0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQlhcm1SZXRBcmdFcnJJZigoKGlCbG9ja1dpZHRoIT00KSYmKGlCbG9ja1dpZHRoIT04KSYmKGlCbG9ja1dpZHRoIT0xNikpICwgT01YX1N0c19CYWRBcmdFcnIpOwotCWFybVJldEFyZ0VycklmKCgoaUJsb2NrSGVpZ2h0IT00KSYmKGlCbG9ja0hlaWdodCE9OCkmJihpQmxvY2tIZWlnaHQhPTE2KSkgLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtSWdub3JlIChwTUVTcGVjKTsKLQotICAgIGlmKGlCbG9ja1dpZHRoID09IDQpCi0gICAgewotICAgICAgICBuU2VhcmNoUmFuZ2UgPSBhcm1NRVNwZWMtPk1FUGFyYW1zLnNlYXJjaFJhbmdlNHg0OwotICAgIH0KLSAgICBlbHNlIGlmKGlCbG9ja1dpZHRoID09IDgpCi0gICAgewotICAgICAgICBuU2VhcmNoUmFuZ2UgPSBhcm1NRVNwZWMtPk1FUGFyYW1zLnNlYXJjaFJhbmdlOHg4OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBuU2VhcmNoUmFuZ2UgPSBhcm1NRVNwZWMtPk1FUGFyYW1zLnNlYXJjaFJhbmdlMTZ4MTY7Ci0gICAgfQotICAgIC8qIENoZWNrIGZvciB2YWxpZCByZWdpb24gKi8gCi0gICAgZnJvbVggPSBuU2VhcmNoUmFuZ2U7Ci0gICAgdG9YICAgPSBuU2VhcmNoUmFuZ2U7Ci0gICAgZnJvbVkgPSBuU2VhcmNoUmFuZ2U7Ci0gICAgdG9ZICAgPSBuU2VhcmNoUmFuZ2U7Ci0gICAgCi0gICAgaWYgKChwQ3VyclBvaW50UG9zLT54IC0gblNlYXJjaFJhbmdlKSA8IHBSZWZSZWN0LT54KQotICAgIHsKLSAgICAgICAgZnJvbVggPSAgcEN1cnJQb2ludFBvcy0+eCAtIHBSZWZSZWN0LT54OwotICAgIH0KLQotICAgIGlmICgocEN1cnJQb2ludFBvcy0+eCArIGlCbG9ja1dpZHRoICsgblNlYXJjaFJhbmdlKSA+IChwUmVmUmVjdC0+eCArIHBSZWZSZWN0LT53aWR0aCkpCi0gICAgewotICAgICAgICB0b1ggICA9IHBSZWZSZWN0LT53aWR0aCAtIChwQ3VyclBvaW50UG9zLT54IC0gcFJlZlJlY3QtPngpIC0gaUJsb2NrV2lkdGg7Ci0gICAgfQotCi0gICAgaWYgKChwQ3VyclBvaW50UG9zLT55IC0gblNlYXJjaFJhbmdlKSA8IHBSZWZSZWN0LT55KQotICAgIHsKLSAgICAgICAgZnJvbVkgPSBwQ3VyclBvaW50UG9zLT55IC0gcFJlZlJlY3QtPnk7Ci0gICAgfQotCi0gICAgaWYgKChwQ3VyclBvaW50UG9zLT55ICsgaUJsb2NrV2lkdGggKyBuU2VhcmNoUmFuZ2UpID4gKHBSZWZSZWN0LT55ICsgcFJlZlJlY3QtPmhlaWdodCkpCi0gICAgewotICAgICAgICB0b1kgICA9IHBSZWZSZWN0LT53aWR0aCAtIChwQ3VyclBvaW50UG9zLT55IC0gcFJlZlJlY3QtPnkpIC0gaUJsb2NrV2lkdGg7Ci0gICAgfQotICAgIAotICAgIHBCZXN0TVYtPmR4ID0gLWZyb21YICogNDsKLSAgICBwQmVzdE1WLT5keSA9IC1mcm9tWSAqIDQ7Ci0gICAgLyogSW5pdGlhbGl6ZSB0byBtYXggdmFsdWUgYXMgYSBzdGFydCBwb2ludCAqLwotICAgICpwQmVzdENvc3QgPSAweDdmZmZmZmZmOwotICAgIAotICAgIC8qIExvb3Bpbmcgb24geS0gYXhpcyAqLwotICAgIGZvciAoeSA9IC1mcm9tWTsgeSA8PSB0b1k7IHkrKykKLSAgICB7Ci0gICAgICAgIC8qIExvb3Bpbmcgb24geC0gYXhpcyAqLwotICAgICAgICBmb3IgKHggPSAtZnJvbVg7IHggPD0gdG9YOyB4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFBvc2l0aW9uaW5nIHRoZSBwb2ludGVyICovCi0gICAgICAgICAgICBwVGVtcFNyY1JlZlkgPSBwU3JjUmVmWSArIChuU3JjUmVmU3RlcCAqIHkpICsgeDsKLSAgICAgICAgICAgIHBUZW1wU3JjT3JnWSA9IHBTcmNPcmdZOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiBDYWxjdWxhdGUgdGhlIFNBRCAqLwotICAgICAgICAgICAgYXJtVkNDT01NX1NBRCgJCi0gICAgCSAgICAgICAgcFRlbXBTcmNPcmdZLAotICAgIAkgICAgICAgIG5TcmNPcmdTdGVwLAotICAgIAkgICAgICAgIHBUZW1wU3JjUmVmWSwKLSAgICAJICAgICAgICBuU3JjUmVmU3RlcCwKLSAgICAJICAgICAgICAmY2FuZFNBRCwKLSAgICAJICAgICAgICBpQmxvY2tIZWlnaHQsCi0gICAgCSAgICAgICAgaUJsb2NrV2lkdGgpOwotICAgIAkgICAgCi0gICAgICAgICAgICBkaWZmTVYuZHggPSAoeCAqIDQpIC0gcE1WUHJlZC0+ZHg7Ci0gICAgICAgICAgICBkaWZmTVYuZHkgPSAoeSAqIDQpIC0gcE1WUHJlZC0+ZHk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qIFJlc3VsdCBjYWxjdWxhdGlvbnMgKi8KLSAgICAgICAgICAgIGFybVZDTTRQMTBfQ29tcGFyZU1vdGlvbkNvc3RUb01WICgoeCAqIDQpLCAoeSAqIDQpLCBkaWZmTVYsIGNhbmRTQUQsIHBCZXN0TVYsIG5MYW1kYSwgcEJlc3RDb3N0KTsKLQotICAgICAgICB9IC8qIEVuZCBvZiB4LSBheGlzICovCi0gICAgfSAvKiBFbmQgb2YgeS1heGlzICovCi0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLQotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NTBkMmMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udGFpbnMgbW9kdWxlcyBmb3IgcXVhdGVyIHBlbCBCbG9jayBtYXRjaGluZywgCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotIAotICAgIAotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyICAgKDYuMy41LjIuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGEgcXVhcnRlci1wZWwgYmxvY2sgbWF0Y2ggdXNpbmcgcmVzdWx0cyBmcm9tIGEgcHJpb3IgaGFsZi1wZWwgCi0gKiBzZWFyY2guICBSZXR1cm5zIHRoZSBiZXN0IE1WIGFuZCBhc3NvY2lhdGVkIGNvc3QuICBUaGlzIGZ1bmN0aW9uIGVzdGltYXRlcyAKLSAqIHRoZSBxdWFydGVyLXBpeGVsIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaGFsZi1wZWwgcmVzb2x1dGlvbiAKLSAqIG1vdGlvbiB2ZWN0b3IgcmVmZXJlbmNlZCBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RCZXN0TVYsIGkuZS4sIHRoZSAKLSAqIGluaXRpYWwgaGFsZi1wZWwgTVYgaXMgZ2VuZXJhdGVkIGV4dGVybmFsbHkuICBUaGUgZnVuY3Rpb24gCi0gKiBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiBtYXkgYmUgdXNlZCBmb3IgaGFsZi1wZWwgbW90aW9uIGVzdGltYXRpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNPcmdZIC0gUG9pbnRlciB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lLiBJZiAKLSAqICAgICAgICAgICAgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiBJZiBpQmxvY2tXaWR0aD09OCwgIAotICogICAgICAgICAgICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IAotICogICAgICAgICAgICByZXF1aXJlZC4gCi0gKiAgIHBTcmNSZWZZIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIGJsb2NrIGluIHRoZSAKLSAqICAgICAgICAgICAgcmVmZXJlbmNlIHBpY3R1cmUgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCAKLSAqICAgICAgICAgICAgcmVxdWlyZWQuICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICBJZiAKLSAqICAgICAgICAgICAgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIG5TcmNPcmdTdGVwIC0gU3RyaWRlIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGlCbG9ja1dpZHRoLiAKLSAqICAgblNyY1JlZlN0ZXAgLSBTdHJpZGUgb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVscyAKLSAqICAgaUJsb2NrV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKLSAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqICAgaUJsb2NrSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRlcm1zIG9mIGZ1bGwgcGl4ZWxzOyBtdXN0IAotICogICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICogICBuTGFtZGEgLSBMYW1kYSBmYWN0b3IsIHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCAKLSAqICAgcE1WUHJlZCAtIFByZWRpY3RlZCBNViwgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0czsgdXNlZCB0byAKLSAqICAgICAgICAgICAgY29tcHV0ZSBtb3Rpb24gY29zdCAKLSAqICAgcFNyY0RzdEJlc3RNViAtIFRoZSBiZXN0IE1WIHJlc3VsdGluZyBmcm9tIGEgcHJpb3IgaGFsZi1wZWwgc2VhcmNoLCAKLSAqICAgICAgICAgICAgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80IHBlbCB1bml0cyAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdEJlc3RNViAtIEJlc3QgTVYgcmVzdWx0aW5nIGZyb20gdGhlIHF1YXJ0ZXItcGVsIHNlYXJjaCwgZXhwcmVzc2VkIAotICogICAgICAgICAgICBpbiB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzIAotICogICBwQmVzdENvc3QgLSBNb3Rpb24gY29zdCBhc3NvY2lhdGVkIHdpdGggdGhlIGJlc3QgTVY7IGNvbXB1dGVkIGFzIAotICogICAgICAgICAgICBTQUQrTGFtZGEqQml0c1VzZWRCeU1WIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIE9uZSBvZiBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmNPcmdZLCBwU3JjUmVmWSwgcFNyY0RzdEJlc3RNViwgcE1WUHJlZCwgcEJlc3RDb3N0IAotICogICAgLSAgICBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIGVxdWFsIHRvIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKLSAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotIAotT01YUmVzdWx0IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyKAotICAgIGNvbnN0IE9NWF9VOCogcFNyY09yZ1ksIAotICAgIE9NWF9TMzIgblNyY09yZ1N0ZXAsIAotICAgIGNvbnN0IE9NWF9VOCogcFNyY1JlZlksIAotICAgIE9NWF9TMzIgblNyY1JlZlN0ZXAsIAotICAgIE9NWF9VOCBpQmxvY2tXaWR0aCwgCi0gICAgT01YX1U4IGlCbG9ja0hlaWdodCwgCi0gICAgT01YX1UzMiBuTGFtZGEsIAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yKiBwTVZQcmVkLCAKLSAgICBPTVhWQ01vdGlvblZlY3RvciogcFNyY0RzdEJlc3RNViwgCi0gICAgT01YX1MzMiogcEJlc3RDb3N0Ci0pCi17Ci0gICAgLyogRGVmaW5pdGlvbnMgYW5kIEluaXRpYWxpemF0aW9ucyovCi0gICAgT01YX0lOVCAgICAgY2FuZFNBRDsKLSAgICBPTVhfSU5UICAgICBmcm9tWCwgdG9YLCBmcm9tWSwgdG9ZOwotICAgIC8qIE9mZnNldCB0byB0aGUgcmVmZXJlbmNlIGF0IHRoZSBiZWdpbmluZyBvZiB0aGUgYm91bmRpbmcgYm94ICovCi0gICAgY29uc3QgT01YX1U4ICAgICAgKnBUZW1wU3JjUmVmWSwgKnBUZW1wU3JjT3JnWTsKLSAgICBPTVhfUzE2ICAgICB4LCB5OwotICAgIE9NWFZDTW90aW9uVmVjdG9yIGRpZmZNViwgY2FuZE1WLCBpbml0aWFsTVY7Ci0gICAgT01YX1U4ICAgICAgaW50ZXJwb2xZWzI1Nl07Ci0gICAgT01YX1MzMiAgICAgcGVsUG9zWCwgcGVsUG9zWTsKLQotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLwotICAgIGFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAgNCkgJiYgKCFhcm1JczRCeXRlQWxpZ25lZChwU3JjT3JnWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09ICA4KSAmJiAoIWFybUlzOEJ5dGVBbGlnbmVkKHBTcmNPcmdZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gMTYpICYmICghYXJtSXMxNkJ5dGVBbGlnbmVkKHBTcmNPcmdZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQlhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gIDQpICYmICghYXJtSXM0Qnl0ZUFsaWduZWQocFNyY1JlZlkpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAgOCkgJiYgKCFhcm1JczhCeXRlQWxpZ25lZChwU3JjUmVmWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09IDE2KSAmJiAoIWFybUlzMTZCeXRlQWxpZ25lZChwU3JjUmVmWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKG5TcmNPcmdTdGVwICUgaUJsb2NrV2lkdGgpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFNyY09yZ1kgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWZZID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwTVZQcmVkID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0QmVzdE1WID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQmVzdENvc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotCWFybVJldEFyZ0VycklmKCgoaUJsb2NrV2lkdGghPTQpJiYoaUJsb2NrV2lkdGghPTgpJiYoaUJsb2NrV2lkdGghPTE2KSkgLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0JYXJtUmV0QXJnRXJySWYoKChpQmxvY2tIZWlnaHQhPTQpJiYoaUJsb2NrSGVpZ2h0IT04KSYmKGlCbG9ja0hlaWdodCE9MTYpKSAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAgICAgCi0gICAgICAgICAgICAKLSAgICAvKiBDaGVjayBmb3IgdmFsaWQgcmVnaW9uICovIAotICAgIGZyb21YID0gMTsKLSAgICB0b1ggICA9IDE7Ci0gICAgZnJvbVkgPSAxOwotICAgIHRvWSAgID0gMTsKLSAgICAKLSAgICAvKiBJbml0aWFsaXplIHRvIG1heCB2YWx1ZSBhcyBhIHN0YXJ0IHBvaW50ICovCi0gICAgKnBCZXN0Q29zdCA9IDB4N2ZmZmZmZmY7Ci0gICAgCi0gICAgaW5pdGlhbE1WLmR4ID0gcFNyY0RzdEJlc3RNVi0+ZHg7Ci0gICAgaW5pdGlhbE1WLmR5ID0gcFNyY0RzdEJlc3RNVi0+ZHk7Ci0gICAgCi0gICAgLyogTG9vcGluZyBvbiB5LSBheGlzICovCi0gICAgZm9yICh5ID0gLWZyb21ZOyB5IDw9IHRvWTsgeSsrKQotICAgIHsKLSAgICAgICAgLyogTG9vcGluZyBvbiB4LSBheGlzICovCi0gICAgICAgIGZvciAoeCA9IC1mcm9tWDsgeCA8PSB0b1g7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgLyogUG9zaXRpb25pbmcgdGhlIHBvaW50ZXIgKi8KLSAgICAgICAgICAgIHBUZW1wU3JjUmVmWSA9IHBTcmNSZWZZICsgKG5TcmNSZWZTdGVwICogKGluaXRpYWxNVi5keS80KSkgKyAoaW5pdGlhbE1WLmR4LzQpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiBDYWxjdWxhdGluZyB0aGUgZnJhY3QgcGVsIHBvc2l0aW9uICovCi0gICAgICAgICAgICBwZWxQb3NYID0gKGluaXRpYWxNVi5keCAlIDQpICsgeDsKLSAgICAgICAgICAgIGlmIChwZWxQb3NYIDwgMCkgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFRlbXBTcmNSZWZZID0gcFRlbXBTcmNSZWZZIC0gMTsKLSAgICAgICAgICAgICAgICBwZWxQb3NYICs9IDQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwZWxQb3NZID0gKGluaXRpYWxNVi5keSAlIDQpICsgeTsKLSAgICAgICAgICAgIGlmIChwZWxQb3NZIDwgMCkgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFRlbXBTcmNSZWZZID0gcFRlbXBTcmNSZWZZIC0gKDEgKiBuU3JjUmVmU3RlcCk7Ci0gICAgICAgICAgICAgICAgcGVsUG9zWSArPSA0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBwVGVtcFNyY09yZ1kgPSBwU3JjT3JnWTsgCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qIFByZXBhcmUgY2FuZCBNViAqLwotICAgICAgICAgICAgY2FuZE1WLmR4ID0gaW5pdGlhbE1WLmR4ICsgeDsKLSAgICAgICAgICAgIGNhbmRNVi5keSA9IGluaXRpYWxNVi5keSArIHk7Ci0gICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiBJbnRlcnBvbGF0ZSBRdWF0ZXIgcGVsIGZvciB0aGUgY3VycmVudCBwb3NpdGlvbiovCi0gICAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEoCi0gICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFNyY1JlZlksCi0gICAgICAgICAgICAgICAgICAgICAgICBuU3JjUmVmU3RlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sWSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlCbG9ja1dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgaUJsb2NrV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBpQmxvY2tIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBwZWxQb3NYLAotICAgICAgICAgICAgICAgICAgICAgICAgcGVsUG9zWSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qIENhbGN1bGF0ZSB0aGUgU0FEICovCi0gICAgICAgICAgICBhcm1WQ0NPTU1fU0FEKAkKLSAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wU3JjT3JnWSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5TcmNPcmdTdGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwb2xZLAotICAgICAgICAgICAgICAgICAgICAgICAgaUJsb2NrV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAmY2FuZFNBRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlCbG9ja0hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlCbG9ja1dpZHRoKTsKLSAKLSAgICAgICAgICAgIGRpZmZNVi5keCA9IGNhbmRNVi5keCAtIHBNVlByZWQtPmR4OwotICAgICAgICAgICAgZGlmZk1WLmR5ID0gY2FuZE1WLmR5IC0gcE1WUHJlZC0+ZHk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qIFJlc3VsdCBjYWxjdWxhdGlvbnMgKi8KLSAgICAgICAgICAgIGFybVZDTTRQMTBfQ29tcGFyZU1vdGlvbkNvc3RUb01WICgKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbmRNVi5keCwgCi0gICAgICAgICAgICAgICAgICAgICAgICBjYW5kTVYuZHksIAotICAgICAgICAgICAgICAgICAgICAgICAgZGlmZk1WLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbmRTQUQsIAotICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0RzdEJlc3RNViwgCi0gICAgICAgICAgICAgICAgICAgICAgICBuTGFtZGEsIAotICAgICAgICAgICAgICAgICAgICAgICAgcEJlc3RDb3N0KTsKLQotICAgICAgICB9IC8qIEVuZCBvZiB4LSBheGlzICovCi0gICAgfSAvKiBFbmQgb2YgeS1heGlzICovCi0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLQotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZWNmM2YuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogSC4yNjQgaW50cmEgY2hyb21hIGRlYmxvY2sKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSSAgICg2LjMuMy4zLjYpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NraW5nIGZpbHRlcmluZyBvbiBhbGwgZWRnZXMgb2YgdGhlIGNocm9tYSAKLSAqIG1hY3JvYmxvY2sgKDE2eDE2KS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuIAotICogICBzcmNkc3RTdGVwIC0gc3RlcCBvZiB0aGUgYXJyYXlzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIHBBbHBoYSAtIHBvaW50ZXIgdG8gYSAyeDIgYXJyYXkgb2YgYWxwaGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIAotICogICAgICAgICAgICBmb2xsb3dzOiB7ZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgCi0gKiAgICAgICAgICAgIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0uICBQZXIgCi0gKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAotICogICBwQmV0YSAtIHBvaW50ZXIgdG8gYSAyeDIgYXJyYXkgb2YgQmV0YSBUaHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogCi0gKiAgICAgICAgICAgIHsgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgZXh0ZXJuYWwgCi0gKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0uICBQZXIgW0lTTzE0NDk2LTEwXSAKLSAqICAgICAgICAgICAgYmV0YSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgcFRocmVzaG9sZHMgLSBhcnJheSBvZiBzaXplIDh4MiBvZiBUaHJlc2hvbGRzIChUQzApICh2YWx1ZXMgZm9yIHRoZSBsZWZ0IAotICogICAgICAgICAgICBvciBhYm92ZSBlZGdlIG9mIGVhY2ggNHgyIG9yIDJ4NCBibG9jaywgYXJyYW5nZWQgaW4gdmVydGljYWwgCi0gKiAgICAgICAgICAgIGJsb2NrIG9yZGVyIGFuZCB0aGVuIGluIGhvcml6b250YWwgYmxvY2sgb3JkZXIpOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiBQZXIgW0lTTzE0NDk2LTEwXSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJhbmdlIFswLDI1XS4gCi0gKiAgIHBCUyAtIGFycmF5IG9mIHNpemUgMTZ4MiBvZiBCUyBwYXJhbWV0ZXJzIChhcnJhbmdlZCBpbiBzY2FuIGJsb2NrIG9yZGVyIAotICogICAgICAgICAgICBmb3IgdmVydGljYWwgZWRnZXMgYW5kIHRoZW4gaG9yaXpvbnRhbCBlZGdlcyk7IHZhbGlkIGluIHRoZSAKLSAqICAgICAgICAgICAgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgCi0gKiAgICAgICAgICAgIG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gCi0gKiAgICAgICAgICAgIDQuICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIAotICogICAgLSAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCi0gKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIHBTcmNEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgICAgICAgICAgICBlaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcEFscGhhWzAuLjNdIGlzIG91dHNpZGUgdGhlIHJhbmdlIAotICogICAgICAgICAgICAgIFswLDI1NV0uIAotICogICAgLSAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBCZXRhWzAuLjNdIGlzIG91dHNpZGUgdGhlIHJhbmdlIAotICogICAgICAgICAgICAgIFswLDE4XS4gCi0gKiAgICAtICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uMTVdaXMgb3V0c2lkZSBvZiAKLSAqICAgICAgICAgICAgICB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgIC0gICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCAgZm9yIGk+PTQsIG9yIAotICogICAgICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCi0gKiAgICAtICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSSgKLQlPTVhfVTgqIHBTcmNEc3QsIAotCU9NWF9TMzIgc3JjZHN0U3RlcCwgCi0JY29uc3QgT01YX1U4KiBwQWxwaGEsIAotCWNvbnN0IE9NWF9VOCogcEJldGEsIAotCWNvbnN0IE9NWF9VOCogcFRocmVzaG9sZHMsCi0gICAgY29uc3QgT01YX1U4ICpwQlMKLSkKLXsKLSAgICBPTVhSZXN1bHQgZXJyb3JDb2RlOwotICAgIAotICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocFNyY0RzdCksICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoc3JjZHN0U3RlcCAmIDcsICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBBbHBoYSA9PSBOVUxMLCAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQmV0YSA9PSBOVUxMLCAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFRocmVzaG9sZHMgPT0gTlVMTCwgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwVGhyZXNob2xkcyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQlMgPT0gTlVMTCwgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBCUyksICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotCi0gICAgZXJyb3JDb2RlID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSgKLSAgICAgICAgcFNyY0RzdCwgc3JjZHN0U3RlcCwgcEFscGhhLCBwQmV0YSwgcFRocmVzaG9sZHMsIHBCUyk7Ci0KLSAgICBhcm1SZXRBcmdFcnJJZihlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciwgZXJyb3JDb2RlKQotICAgIAotICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0koCi0gICAgICAgIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIHBBbHBoYSsyLCBwQmV0YSsyLCBwVGhyZXNob2xkcys4LCBwQlMrMTYpOwotCi0gICAgcmV0dXJuIGVycm9yQ29kZTsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNTk2MzEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBILjI2NCBsdW1hIGRlYmxvY2sKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0gCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kgICAoNi4zLjMuMy41KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyB0aGUgaG9yaXpvbnRhbCBhbmQgCi0gKiB2ZXJ0aWNhbCBlZGdlcyBvZiBhIGx1bWEgbWFjcm9ibG9jayAoMTZ4MTYpLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAotICogICBzcmNkc3RTdGVwIC0gaW1hZ2Ugd2lkdGg7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIHBBbHBoYSAtIHBvaW50ZXIgdG8gYSAyeDIgdGFibGUgb2YgYWxwaGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIAotICogICAgICAgICAgICBmb2xsb3dzOiB7ZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgCi0gKiAgICAgICAgICAgIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0uICBQZXIgCi0gKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAotICogICBwQmV0YSAtIHBvaW50ZXIgdG8gYSAyeDIgdGFibGUgb2YgYmV0YSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogCi0gKiAgICAgICAgICAgIHtleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbCAKLSAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciBbSVNPMTQ0OTYtMTBdIAotICogICAgICAgICAgICBiZXRhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAotICogICBwVGhyZXNob2xkcyAtIHBvaW50ZXIgdG8gYSAxNngyIHRhYmxlIG9mIHRocmVzaG9sZCAoVEMwKSwgb3JnYW5pemVkIGFzIAotICogICAgICAgICAgICBmb2xsb3dzOiB7dmFsdWVzIGZvciB0aGUgbGVmdCBvciBhYm92ZSBlZGdlIG9mIGVhY2ggNHg0IGJsb2NrLCAKLSAqICAgICAgICAgICAgYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgb3JkZXIgYW5kIHRoZW4gaW4gaG9yaXpvbnRhbCBibG9jayAKLSAqICAgICAgICAgICAgb3JkZXJ9OyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgW0lTTzE0NDk2LTEwXSAKLSAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgIHBCUyAtIHBvaW50ZXIgdG8gYSAxNngyIHRhYmxlIG9mIEJTIHBhcmFtZXRlcnMgYXJyYW5nZWQgaW4gc2NhbiBibG9jayAKLSAqICAgICAgICAgICAgb3JkZXIgZm9yIHZlcnRpY2FsIGVkZ2VzIGFuZCB0aGVuIGhvcml6b250YWwgZWRnZXM7IHZhbGlkIGluIHRoZSAKLSAqICAgICAgICAgICAgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgCi0gKiAgICAgICAgICAgIG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gCi0gKiAgICAgICAgICAgIDQuIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCi0gKiAgICAtICAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCi0gKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzIG9yIHBCUy4gcFNyY0RzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgICAgICAgICAgICBlaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgIC0gICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcEFscGhhWzAuLjNdIGlzIG91dHNpZGUgdGhlIHJhbmdlIAotICogICAgICAgICAgICAgIFswLDI1NV0uIAotICogICAgLSAgICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQmV0YVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKLSAqICAgICAgICAgICAgICBbMCwxOF0uIAotICogICAgLSAgICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi4zMV1pcyBvdXRzaWRlIG9mIAotICogICAgICAgICAgICAgIHRoZSByYW5nZSBbMCwyNV0uIAotICogICAgLSAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKLSAqICAgICAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKLSAqICAgIC0gICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0koCi0JT01YX1U4KiBwU3JjRHN0LCAKLQlPTVhfUzMyIHNyY2RzdFN0ZXAsIAotCWNvbnN0IE9NWF9VOCogcEFscGhhLCAKLQljb25zdCBPTVhfVTgqIHBCZXRhLCAKLQljb25zdCBPTVhfVTgqIHBUaHJlc2hvbGRzLCAKLQljb25zdCBPTVhfVTggKnBCUwotKQotewotICAgIE9NWFJlc3VsdCBlcnJvckNvZGU7Ci0gICAgCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90MTZCeXRlQWxpZ25lZChwU3JjRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHNyY2RzdFN0ZXAgJiAxNSwgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsgICAgCi0gICAgYXJtUmV0QXJnRXJySWYocEFscGhhID09IE5VTEwsICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJldGEgPT0gTlVMTCwgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFRocmVzaG9sZHMgPT0gTlVMTCwgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBUaHJlc2hvbGRzKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCUyA9PSBOVUxMLCAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocEJTKSwgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLSAgICBlcnJvckNvZGUgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSgKLSAgICAgICAgcFNyY0RzdCwgc3JjZHN0U3RlcCwgcEFscGhhLCBwQmV0YSwgcFRocmVzaG9sZHMsIHBCUyk7Ci0KLSAgICBhcm1SZXRBcmdFcnJJZihlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciwgZXJyb3JDb2RlKQotICAgIAotICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JKAotICAgICAgICBwU3JjRHN0LCBzcmNkc3RTdGVwLCBwQWxwaGErMiwgcEJldGErMiwgcFRocmVzaG9sZHMrMTYsIHBCUysxNik7Ci0KLSAgICByZXR1cm4gZXJyb3JDb2RlOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkzMWVlYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEguMjY0IGRlY29kZSBjb2VmZmljaWVudHMgbW9kdWxlCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDICAgKDYuMy40LjEuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIENBVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHJhc3RlciBzY2FuIGZvciBhIDJ4MiBibG9jayBvZiAKLSAqIENocm9tYURDTGV2ZWwuICBUaGUgZGVjb2RlZCBjb2VmZmljaWVudHMgaW4gdGhlIHBhY2tlZCBwb3NpdGlvbi1jb2VmZmljaWVudCAKLSAqIGJ1ZmZlciBhcmUgc3RvcmVkIGluIHJldmVyc2UgemlnLXphZyBvcmRlciwgaS5lLiwgdGhlIGZpcnN0IGJ1ZmZlciBlbGVtZW50IAotICogY29udGFpbnMgdGhlIGxhc3Qgbm9uLXplcm8gcG9zdGlvbi1jb2VmZmljaWVudCBwYWlyIG9mIHRoZSBibG9jay4gV2l0aGluIAotICogZWFjaCBwb3NpdGlvbi1jb2VmZmljaWVudCBwYWlyLCB0aGUgcG9zaXRpb24gZW50cnkgaW5kaWNhdGVzIHRoZSAKLSAqIHJhc3Rlci1zY2FuIHBvc2l0aW9uIG9mIHRoZSBjb2VmZmljaWVudCwgd2hpbGUgdGhlIGNvZWZmaWNpZW50IGVudHJ5IAotICogY29udGFpbnMgdGhlIGNvZWZmaWNpZW50IHZhbHVlLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIERvdWJsZSBwb2ludGVyIHRvIGN1cnJlbnQgYnl0ZSBpbiBiaXQgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcE9mZnNldCAtIFBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtOyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZCAKLSAqICAgcE9mZnNldCAtICpwT2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkIAotICogICBwTnVtQ29lZmYgLSBQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMgaW4gdGhpcyBibG9jayAKLSAqICAgcHBQb3NDb2VmQnVmIC0gRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwgCi0gKiAgICAgICAgICAgIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyLiAgQnVmZmVyIHBvc2l0aW9uIAotICogICAgICAgICAgICAoKnBwUG9zQ29lZkJ1ZikgaXMgdXBkYXRlZCB1cG9uIHJldHVybiwgdW5sZXNzIHRoZXJlIGFyZSBvbmx5IAotICogICAgICAgICAgICB6ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGUgY3VycmVudGx5IGRlY29kZWQgYmxvY2suICBJbiB0aGlzIGNhc2UgCi0gKiAgICAgICAgICAgIHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gYnlwYXNzIHRoZSB0cmFuc2Zvcm0vZGVxdWFudGl6YXRpb24gb2YgCi0gKiAgICAgICAgICAgIHRoZSBlbXB0eSBibG9ja3MuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqCi0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIHBwQml0U3RyZWFtIG9yIHBPZmZzZXQgaXMgTlVMTC4gCi0gKiAgICAtICAgIHBwUG9zQ29lZkJ1ZiBvciBwTnVtQ29lZmYgaXMgTlVMTC4gCi0gKiAgICBPTVhfU3RzX0VyciAtIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAotICogICAgLSAgICBhbiBpbGxlZ2FsIGNvZGUgaXMgZW5jb3VudGVyZWQgaW4gdGhlIGJpdHN0cmVhbSAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQyAoCi0gICAgIGNvbnN0IE9NWF9VOCoqIHBwQml0U3RyZWFtLAotICAgICBPTVhfUzMyKiBwT2Zmc2V0LAotICAgICBPTVhfVTgqIHBOdW1Db2VmZiwKLSAgICAgT01YX1U4KiogcHBQb3NDb2VmYnVmICAgICAgICAKLSApCi0KLXsKLSAgICBhcm1SZXRBcmdFcnJJZihwcEJpdFN0cmVhbT09TlVMTCAgICwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCpwcEJpdFN0cmVhbT09TlVMTCAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocE9mZnNldD09TlVMTCAgICAgICAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigqcE9mZnNldDwwICAgICAgICAgICwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCpwT2Zmc2V0PjcgICAgICAgICAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocE51bUNvZWZmPT1OVUxMICAgICAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwcFBvc0NvZWZidWY9PU5VTEwgICwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCpwcFBvc0NvZWZidWY9PU5VTEwgLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLSAgICByZXR1cm4gYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIocHBCaXRTdHJlYW0sIHBPZmZzZXQsIHBOdW1Db2VmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBQb3NDb2VmYnVmLCA0LCA0KTsKLQotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGFiODE5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYworKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBILjI2NCBkZWNvZGUgY29lZmZpY2llbnRzIG1vZHVsZQotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDICAgKDYuMy40LjEuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIENBVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciA0eDQgYmxvY2sgb2YgCi0gKiBJbnRyYTE2eDE2RENMZXZlbCwgSW50cmExNngxNkFDTGV2ZWwsIEx1bWFMZXZlbCwgYW5kIENocm9tYUFDTGV2ZWwuIEludmVyc2UgCi0gKiBmaWVsZCBzY2FuIGlzIG5vdCBzdXBwb3J0ZWQuIFRoZSBkZWNvZGVkIGNvZWZmaWNpZW50cyBpbiB0aGUgcGFja2VkIAotICogcG9zaXRpb24tY29lZmZpY2llbnQgYnVmZmVyIGFyZSBzdG9yZWQgaW4gcmV2ZXJzZSB6aWctemFnIG9yZGVyLCBpLmUuLCB0aGUgCi0gKiBmaXJzdCBidWZmZXIgZWxlbWVudCBjb250YWlucyB0aGUgbGFzdCBub24temVybyBwb3N0aW9uLWNvZWZmaWNpZW50IHBhaXIgb2YgCi0gKiB0aGUgYmxvY2suIFdpdGhpbiBlYWNoIHBvc2l0aW9uLWNvZWZmaWNpZW50IHBhaXIsIHRoZSBwb3NpdGlvbiBlbnRyeSAKLSAqIGluZGljYXRlcyB0aGUgcmFzdGVyLXNjYW4gcG9zaXRpb24gb2YgdGhlIGNvZWZmaWNpZW50LCB3aGlsZSB0aGUgCi0gKiBjb2VmZmljaWVudCBlbnRyeSBjb250YWlucyB0aGUgY29lZmZpY2llbnQgdmFsdWUuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC1Eb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbSBidWZmZXIgCi0gKiAgIHBPZmZzZXQgLSBQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddLiAKLSAqICAgc01heE51bUNvZWZmIC0gTWF4aW11bSB0aGUgbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyBpbiBjdXJyZW50IAotICogICAgICAgICAgICBibG9jayAKLSAqICAgc1ZMQ1NlbGVjdCAtIFZMQyB0YWJsZSBzZWxlY3Rvciwgb2J0YWluZWQgZnJvbSB0aGUgbnVtYmVyIG9mIG5vbi16ZXJvIAotICogICAgICAgICAgICBjb2VmZmljaWVudHMgY29udGFpbmVkIGluIHRoZSBhYm92ZSBhbmQgbGVmdCA0eDQgYmxvY2tzLiAgSXQgaXMgCi0gKiAgICAgICAgICAgIGVxdWl2YWxlbnQgdG8gdGhlIHZhcmlhYmxlIG5DIGRlc2NyaWJlZCBpbiBILjI2NCBzdGFuZGFyZCB0YWJsZSAKLSAqICAgICAgICAgICAgOSA1LCBleGNlcHQgaXRzIHZhbHVlIGNhbiB0IGJlIGxlc3MgdGhhbiB6ZXJvLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQuICAKLSAqICAgICAgICAgICAgQnVmZmVyIHBvc2l0aW9uICgqcHBQb3NDb2VmQnVmKSBpcyB1cGRhdGVkIHVwb24gcmV0dXJuLCB1bmxlc3MgCi0gKiAgICAgICAgICAgIHRoZXJlIGFyZSBvbmx5IHplcm8gY29lZmZpY2llbnRzIGluIHRoZSBjdXJyZW50bHkgZGVjb2RlZCBibG9jay4gCi0gKiAgICAgICAgICAgICBJbiB0aGlzIGNhc2UgdGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byBieXBhc3MgdGhlIAotICogICAgICAgICAgICB0cmFuc2Zvcm0vZGVxdWFudGl6YXRpb24gb2YgdGhlIGVtcHR5IGJsb2Nrcy4gCi0gKiAgIHBPZmZzZXQgLSAqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZCAKLSAqICAgcE51bUNvZWZmIC0gUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzIGluIHRoaXMgYmxvY2sgCi0gKiAgIHBwUG9zQ29lZkJ1ZiAtIERvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsIAotICogICAgICAgICAgICBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIHBwQml0U3RyZWFtIG9yIHBPZmZzZXQgaXMgTlVMTC4gCi0gKiAgICAtICAgIHBwUG9zQ29lZkJ1ZiBvciBwTnVtQ29lZmYgaXMgTlVMTC4gCi0gKiAgICAtICAgIHNNYXhOdW1Db2VmZiBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDE1IG9yIDE2LiAKLSAqICAgIC0gICAgc1ZMQ1NlbGVjdCBpcyBsZXNzIHRoYW4gMC4gCi0gKgotICogICAgT01YX1N0c19FcnIgLSBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYW4gaWxsZWdhbCBjb2RlIGlzIGVuY291bnRlcmVkIGluIHRoZSBiaXRzdHJlYW0gCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDKAotICAgICBjb25zdCBPTVhfVTgqKiBwcEJpdFN0cmVhbSwKLSAgICAgT01YX1MzMiogcE9mZnNldCwKLSAgICAgT01YX1U4KiBwTnVtQ29lZmYsCi0gICAgIE9NWF9VOCoqcHBQb3NDb2VmYnVmLAotICAgICBPTVhfSU5UIHNWTENTZWxlY3QsCi0gICAgIE9NWF9JTlQgc01heE51bUNvZWZmICAgICAgICAKLSApCi17Ci0gICAgaW50IG5UYWJsZTsKLQotICAgIGFybVJldEFyZ0VycklmKHBwQml0U3RyZWFtPT1OVUxMICAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKnBwQml0U3RyZWFtPT1OVUxMICAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwT2Zmc2V0PT1OVUxMICAgICAgICwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCpwT2Zmc2V0PDAgICAgICAgICAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKnBPZmZzZXQ+NyAgICAgICAgICAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwTnVtQ29lZmY9PU5VTEwgICAgICwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBwUG9zQ29lZmJ1Zj09TlVMTCAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKnBwUG9zQ29lZmJ1Zj09TlVMTCAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihzVkxDU2VsZWN0PDAgICAgICAgICwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHNNYXhOdW1Db2VmZjwxNSAgICAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoc01heE51bUNvZWZmPjE2ICAgICAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAKLSAgICAvKiBGaW5kIFZMQyB0YWJsZSBudW1iZXIgKi8KLSAgICBpZiAoc1ZMQ1NlbGVjdDwyKQotICAgIHsKLSAgICAgICAgblRhYmxlID0gMDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc1ZMQ1NlbGVjdDw0KQotICAgIHsKLSAgICAgICAgblRhYmxlID0gMTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc1ZMQ1NlbGVjdDw4KQotICAgIHsKLSAgICAgICAgblRhYmxlID0gMjsKLSAgICB9Ci0gICAgZWxzZSAvKiBzVkxDU2VsZWN0ID49IDggKi8KLSAgICB7Ci0gICAgICAgIG5UYWJsZSA9IDM7Ci0gICAgfQotCi0gICAgcmV0dXJuIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyKHBwQml0U3RyZWFtLCBwT2Zmc2V0LCBwTnVtQ29lZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwUG9zQ29lZmJ1ZiwgblRhYmxlLCBzTWF4TnVtQ29lZmYpOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTAyMmJhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQuYworKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBILjI2NCBpbnZlcnNlIHF1YW50aXplIGFuZCB0cmFuc2Zvcm0gbW9kdWxlCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKgotICogRGVzY3JpcHRpb246Ci0gKiBEZXF1YW50aXplIEx1bWEgQUMgYmxvY2sKLSAqLwotCi1zdGF0aWMgdm9pZCBEZXF1YW50THVtYUFDNHg0KAotICAgICBPTVhfUzE2KiBwU3JjRHN0LAotICAgICBPTVhfSU5UIFFQICAgICAgICAKLSkKLXsKLSAgICBjb25zdCBPTVhfVTggKnBWUm93ID0gJmFybVZDTTRQMTBfVk1hdHJpeFtRUCU2XVswXTsKLSAgICBpbnQgU2hpZnQgPSBRUCAvIDY7Ci0gICAgaW50IGk7Ci0gICAgT01YX1MzMiBWYWx1ZTsKLQotICAgIGZvciAoaT0wOyBpPDE2OyBpKyspCi0gICAgewotCi0gICAgICAgIFZhbHVlID0gKHBTcmNEc3RbaV0gKiBwVlJvd1thcm1WQ000UDEwX1Bvc1RvVkNvbDR4NFtpXV0pIDw8IFNoaWZ0OwotICAgICAgICBwU3JjRHN0W2ldID0gKE9NWF9TMTYpVmFsdWU7Ci0gICAgfQotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCAgICg2LjMuNC4yLjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBSZWNvbnN0cnVjdCB0aGUgNHg0IHJlc2lkdWFsIGJsb2NrIGZyb20gY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIsIAotICogcGVyZm9ybSBkZXF1YW50aXphdGlvbiBhbmQgaW50ZWdlciBpbnZlcnNlIHRyYW5zZm9ybWF0aW9uIGZvciA0eDQgYmxvY2sgb2YgCi0gKiByZXNpZHVhbHMgd2l0aCBwcmV2aW91cyBpbnRyYSBwcmVkaWN0aW9uIG9yIG1vdGlvbiBjb21wZW5zYXRpb24gZGF0YSwgYW5kIAotICogdXBkYXRlIHRoZSBwYWlyIGJ1ZmZlciBwb2ludGVyIHRvIG5leHQgbm9uLWVtcHR5IGJsb2NrLiBJZiBwREMgPT0gTlVMTCwgCi0gKiB0aGVyZSByZSAxNiBub24temVybyBBQyBjb2VmZmljaWVudHMgYXQgbW9zdCBpbiB0aGUgcGFja2VkIGJ1ZmZlciBzdGFydGluZyAKLSAqIGZyb20gNHg0IGJsb2NrIHBvc2l0aW9uIDA7IElmIHBEQyAhPSBOVUxMLCB0aGVyZSByZSAxNSBub24temVybyBBQyAKLSAqIGNvZWZmaWNpZW50cyBhdCBtb3N0IGluIHRoZSBwYWNrZXQgYnVmZmVyIHN0YXJ0aW5nIGZyb20gNHg0IGJsb2NrIHBvc2l0aW9uIAotICogMS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBTcmMgLSBEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKLSAqICAgICAgICAgICAgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nIAotICogICBwUHJlZCAtIFBvaW50ZXIgdG8gdGhlIHByZWRpY3RlZCA0eDQgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkgCi0gKiAgIHByZWRTdGVwIC0gUHJlZGljdGVkIGZyYW1lIHN0ZXAgc2l6ZSBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgCi0gKiAgIGRzdFN0ZXAgLSBEZXN0aW5hdGlvbiBmcmFtZSBzdGVwIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgcERDIC0gUG9pbnRlciB0byB0aGUgREMgY29lZmZpY2llbnQgb2YgdGhpcyBibG9jaywgTlVMTCBpZiBpdCBkb2Vzbid0IAotICogICAgICAgICAgICBleGlzdCAKLSAqICAgUVAgLSBRUCBRdWFudGl6YXRpb24gcGFyYW1ldGVyLiAgSXQgc2hvdWxkIGJlIFFwQyBpbiBjaHJvbWEgNHg0IGJsb2NrIAotICogICAgICAgICAgICBkZWNvZGluZywgb3RoZXJ3aXNlIGl0IHNob3VsZCBiZSBRcFkuIAotICogICBBQyAtIEZsYWcgaW5kaWNhdGluZyBpZiBhdCBsZWFzdCBvbmUgbm9uLXplcm8gQUMgY29lZmZpY2llbnQgZXhpc3RzIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCA0eDQgYmxvY2sgZGF0YTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgCi0gKiAgICAgICAgICAgIDQtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBwUHJlZCBvciBwRHN0IGlzIE5VTEwuIAotICogICAgLSAgICBwUHJlZCBvciBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHByZWRTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgICAtICAgIEFDICE9MCBhbmQgUXAgaXMgbm90IGluIHRoZSByYW5nZSBvZiBbMC01MV0gb3IgcHBTcmMgPT0gTlVMTC4gCi0gKiAgICAtICAgIEFDID09MCAmJiBwREMgPT1OVUxMLiAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQoCi0gICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAotICAgICBjb25zdCBPTVhfVTggKnBQcmVkLAotICAgICBjb25zdCBPTVhfUzE2ICpwREMsCi0gICAgIE9NWF9VOCAqcERzdCwKLSAgICAgT01YX0lOVCBwcmVkU3RlcCwKLSAgICAgT01YX0lOVCBkc3RTdGVwLAotICAgICBPTVhfSU5UIFFQLAotICAgICBPTVhfSU5UIEFDICAgICAgICAKLSkKLXsKLSAgICBPTVhfUzE2IHBCdWZmZXJbMTYrNF07Ci0gICAgT01YX1MxNiAqcERlbHRhOwotICAgIGludCBpLHgseTsKLSAgICAKLSAgICBhcm1SZXRBcmdFcnJJZihwUHJlZCA9PSBOVUxMLCAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFByZWQpLE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0ICAgPT0gTlVMTCwgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwcmVkU3RlcCAmIDMsICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihkc3RTdGVwICYgMywgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihBQyE9MCAmJiAoUVA8MCksICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihBQyE9MCAmJiAoUVA+NTEpLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihBQyE9MCAmJiBwcFNyYz09TlVMTCwgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihBQyE9MCAmJiAqcHBTcmM9PU5VTEwsICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihBQz09MCAmJiBwREM9PU5VTEwsICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAKLSAgICBwRGVsdGEgPSBhcm1BbGlnblRvOEJ5dGVzKHBCdWZmZXIpOyAgICAKLQotICAgIGZvciAoaT0wOyBpPDE2OyBpKyspCi0gICAgewotICAgICAgICBwRGVsdGFbaV0gPSAwOwotICAgIH0KLSAgICBpZiAoQUMpCi0gICAgewotICAgICAgICBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0KHBwU3JjLCBwRGVsdGEpOwotICAgICAgICBEZXF1YW50THVtYUFDNHg0KHBEZWx0YSwgUVApOwotICAgIH0KLSAgICBpZiAocERDKQotICAgIHsKLSAgICAgICAgcERlbHRhWzBdID0gcERDWzBdOwotICAgIH0KLSAgICBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0KHBEZWx0YSxwRGVsdGEpOwotCi0gICAgZm9yICh5PTA7IHk8NDsgeSsrKQotICAgIHsKLSAgICAgICAgZm9yICh4PTA7IHg8NDsgeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCt4XSA9IChPTVhfVTgpYXJtQ2xpcCgwLDI1NSxwUHJlZFt5KnByZWRTdGVwK3hdICsgcERlbHRhWzQqeSt4XSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0kuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0kuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYzNGE5Ni4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogSC4yNjQgY2hyb21hIGRlYmxvY2sgbW9kdWxlCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSAgICg2LjMuMy4zLjQpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyBvbiB0aGUgaG9yaXpvbnRhbCBlZGdlcyBvZiB0aGUgY2hyb21hIAotICogbWFjcm9ibG9jayAoOHg4KS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuIAotICogICBzcmNkc3RTdGVwIC0gYXJyYXkgc3RlcDsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBwQWxwaGEgLSBhcnJheSBvZiBzaXplIDIgY29udGFpbmluZyBhbHBoYSB0aHJlc2hvbGRzOyB0aGUgZmlyc3QgZWxlbWVudCAKLSAqICAgICAgICAgICAgY29udGFpbnMgdGhlIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgYW5kIHRoZSAKLSAqICAgICAgICAgICAgc2Vjb25kIGVsZW1lbnQgY29udGFpbnMgdGhlIHRocmVzaG9sZCBmb3IgaW50ZXJuYWwgaG9yaXpvbnRhbCAKLSAqICAgICAgICAgICAgZWRnZS4gIFBlciBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSAKLSAqICAgICAgICAgICAgWzAsMjU1XS4gCi0gKiAgIHBCZXRhIC0gYXJyYXkgb2Ygc2l6ZSAyIGNvbnRhaW5pbmcgYmV0YSB0aHJlc2hvbGRzOyB0aGUgZmlyc3QgZWxlbWVudCAKLSAqICAgICAgICAgICAgY29udGFpbnMgdGhlIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgYW5kIHRoZSAKLSAqICAgICAgICAgICAgc2Vjb25kIGVsZW1lbnQgY29udGFpbnMgdGhlIHRocmVzaG9sZCBmb3IgdGhlIGludGVybmFsIAotICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2UuICBQZXIgW0lTTzE0NDk2LTEwXSBiZXRhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSAKLSAqICAgICAgICAgICAgcmFuZ2UgWzAsMThdLiAKLSAqICAgcFRocmVzaG9sZHMgLSBhcnJheSBvZiBzaXplIDggY29udGFpbmluZyB0aHJlc2hvbGRzLCBUQzAsIGZvciB0aGUgdG9wIAotICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2Ugb2YgZWFjaCAyeDQgY2hyb21hIGJsb2NrLCBhcnJhbmdlZCBpbiBob3Jpem9udGFsIAotICogICAgICAgICAgICBibG9jayBvcmRlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgUGVyIAotICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAotICogICBwQlMgLSBhcnJheSBvZiBzaXplIDE2IGNvbnRhaW5pbmcgQlMgcGFyYW1ldGVycyBmb3IgZWFjaCAyeDIgY2hyb21hIAotICogICAgICAgICAgICBibG9jaywgYXJyYW5nZWQgaW4gaG9yaXpvbnRhbCBibG9jayBvcmRlcjsgdmFsaWQgaW4gdGhlIHJhbmdlIAotICogICAgICAgICAgICBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciAKLSAqICAgICAgICAgICAgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSA0LiAKLSAqICAgICAgICAgICAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqIAotICogICAgT01YX1N0c19CYWRBcmdFcnIsIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIGFueSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjRHN0LCBwQWxwaGEsIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTLiAKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgICBwVGhyZXNob2xkcyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBwQWxwaGFbMF0gYW5kL29yIHBBbHBoYVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgIC0gICAgcEJldGFbMF0gYW5kL29yIHBCZXRhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgICAtICAgIE9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjddIGlzIG91dHNpZGUgCi0gKiAgICAgICAgIG9mIHRoZSByYW5nZSBbMCwyNV0uIAotICogICAgLSAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKLSAqICAgICAgICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4KLSAqICAgIC0gICAgcEJTIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JKAotICAgICBPTVhfVTgqIHBTcmNEc3QsCi0gICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKLSAgICAgY29uc3QgT01YX1U4KiBwQWxwaGEsCi0gICAgIGNvbnN0IE9NWF9VOCogcEJldGEsCi0gICAgIGNvbnN0IE9NWF9VOCogcFRocmVzaG9sZHMsCi0gICAgIGNvbnN0IE9NWF9VOCAqcEJTICAgICAgICAKLSApCi17Ci0gICAgaW50IEksIFgsIFksIEludGVybmFsPTA7Ci0KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBTcmNEc3QpLCAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHNyY2RzdFN0ZXAgJiA3LCAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQWxwaGEgPT0gTlVMTCwgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJldGEgPT0gTlVMTCwgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBUaHJlc2hvbGRzID09IE5VTEwsICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFRocmVzaG9sZHMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJTID09IE5VTEwsICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwQlMpLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQotICAgIGZvciAoWT0wOyBZPDg7IFkrPTQsIEludGVybmFsPTEpCi0gICAgewotICAgICAgICBmb3IgKFg9MDsgWDw4OyBYKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIEkgPSAoWD4+MSkrNCooWT4+MSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFybVJldEFyZ0VycklmKHBCU1tJXSA+IDQsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgICAgICAgICAgCi0gICAgICAgICAgICBhcm1SZXRBcmdFcnJJZiggKEkgPiAzKSAmJiAocEJTW0ldID09IDQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgICAgICAgICAgCi0gICAgICAgICAgICBhcm1SZXRBcmdFcnJJZiggKEkgPCA0KSAgICAgICAmJiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKCAocEJTW0ldID09IDQpICYmIChwQlNbSV4xXSAhPSA0KSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qIEZpbHRlciBob3Jpem9udGFsIGVkZ2Ugd2l0aCBxMCBhdCAoWCxZKSAqLwotICAgICAgICAgICAgYXJtVkNNNFAxMF9EZUJsb2NrUGl4ZWwoCi0gICAgICAgICAgICAgICAgcFNyY0RzdCArIFkqc3JjZHN0U3RlcCArIFgsCi0gICAgICAgICAgICAgICAgc3JjZHN0U3RlcCwKLSAgICAgICAgICAgICAgICBwVGhyZXNob2xkc1soWD4+MSkrNCooWT4+MildLAotICAgICAgICAgICAgICAgIHBBbHBoYVtJbnRlcm5hbF0sCi0gICAgICAgICAgICAgICAgcEJldGFbSW50ZXJuYWxdLAotICAgICAgICAgICAgICAgIHBCU1tJXSwKLSAgICAgICAgICAgICAgICAxKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGIwZTg3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kuYworKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBILjI2NCBkZWJsb2NraW5nIG1vZHVsZQotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kgICAoNi4zLjMuMy4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgb24gZm91ciB2ZXJ0aWNhbCBlZGdlcyBvZiB0aGUgY2hyb21hIAotICogbWFjcm9ibG9jayAoOHg4KS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuIAotICogICBzcmNkc3RTdGVwIC0gU3RlcCBvZiB0aGUgYXJyYXlzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIHBBbHBoYSAtIEFycmF5IG9mIHNpemUgMiBvZiBhbHBoYSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyBhbHBoYSAKLSAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIGZvciAKLSAqICAgICAgICAgICAgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyBtdXN0IGJlIAotICogICAgICAgICAgICBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgIHBCZXRhIC0gQXJyYXkgb2Ygc2l6ZSAyIG9mIGJldGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGJldGEgCi0gKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCi0gKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGJldGEgdmFsdWVzIAotICogICAgICAgICAgICBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAotICogICBwVGhyZXNob2xkcyAtIEFycmF5IG9mIHNpemUgOCBjb250YWluaW5nIHRocmVzaG9sZHMsIFRDMCwgZm9yIHRoZSBsZWZ0IAotICogICAgICAgICAgICB2ZXJ0aWNhbCBlZGdlIG9mIGVhY2ggNHgyIGNocm9tYSBibG9jaywgYXJyYW5nZWQgaW4gdmVydGljYWwgCi0gKiAgICAgICAgICAgIGJsb2NrIG9yZGVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgCi0gKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgIHBCUyAtIEFycmF5IG9mIHNpemUgMTYgb2YgQlMgcGFyYW1ldGVycyAodmFsdWVzIGZvciBlYWNoIDJ4MiBjaHJvbWEgCi0gKiAgICAgICAgICAgIGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayBvcmRlcikuIFRoaXMgcGFyYW1ldGVyIGlzIHRoZSAKLSAqICAgICAgICAgICAgc2FtZSBhcyB0aGUgcEJTcGFyYW1ldGVyIHBhc3NlZCBpbnRvIEZpbHRlckRlYmxvY2tMdW1hX1ZlckVkZ2U7IAotICogICAgICAgICAgICB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgCi0gKiAgICAgICAgICAgIHBCU1tpXT09IDQgbWF5IG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCAKLSAqICAgICAgICAgICAgb25seSBpZiBwQlNbaV4zXT09IDQuICBNdXN0IGJlIDQgYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtUG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCwgcEFscGhhLCAKLSAqICAgICAgICAgICAgICBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUy4gCi0gKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICAgcFRocmVzaG9sZHMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgcEFscGhhWzBdIGFuZC9vciBwQWxwaGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgICAtICAgIHBCZXRhWzBdIGFuZC9vciBwQmV0YVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwxOF0uIAotICogICAgLSAgICBPbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi43XSBpcyBvdXRzaWRlIAotICogICAgICAgICBvZiB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgIC0gICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAotICogICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCi0gKiAgICAtICAgIHBCUyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSgKLSAgICAgT01YX1U4KiBwU3JjRHN0LAotICAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCi0gICAgIGNvbnN0IE9NWF9VOCogcEFscGhhLAotICAgICBjb25zdCBPTVhfVTgqIHBCZXRhLAotICAgICBjb25zdCBPTVhfVTgqIHBUaHJlc2hvbGRzLAotICAgICBjb25zdCBPTVhfVTggKnBCUyAgICAgICAgCi0gKQotewotICAgIGludCBJLCBYLCBZLCBJbnRlcm5hbD0wOwotCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwU3JjRHN0KSwgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihzcmNkc3RTdGVwICYgNywgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEFscGhhID09IE5VTEwsICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCZXRhID09IE5VTEwsICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwVGhyZXNob2xkcyA9PSBOVUxMLCAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBUaHJlc2hvbGRzKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCUyA9PSBOVUxMLCAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocEJTKSwgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJldGFbMF0gPiAxOCwgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQmV0YVsxXSA+IDE4LCAgT01YX1N0c19CYWRBcmdFcnIpOwotCi0gICAgZm9yIChYPTA7IFg8ODsgWCs9NCwgSW50ZXJuYWw9MSkKLSAgICB7Ci0gICAgICAgIGZvciAoWT0wOyBZPDg7IFkrKykKLSAgICAgICAgewotICAgICAgICAgICAgSSA9IChZPj4xKSs0KihYPj4xKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYXJtUmV0QXJnRXJySWYocEJTW0ldID4gNCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBhcm1SZXRBcmdFcnJJZiggKEkgPiAzKSAmJiAocEJTW0ldID09IDQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYXJtUmV0QXJnRXJySWYoICggKHBCU1tJXSA9PSA0KSAmJiAocEJTW0leM10gIT0gNCkgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgICAgICAgICBhcm1SZXRBcmdFcnJJZihwVGhyZXNob2xkc1tZXSA+IDI1LCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyogRmlsdGVyIHZlcnRpY2FsIGVkZ2Ugd2l0aCBxMCBhdCAoWCxZKSAqLwotICAgICAgICAgICAgYXJtVkNNNFAxMF9EZUJsb2NrUGl4ZWwoCi0gICAgICAgICAgICAgICAgcFNyY0RzdCArIFkqc3JjZHN0U3RlcCArIFgsCi0gICAgICAgICAgICAgICAgMSwKLSAgICAgICAgICAgICAgICBwVGhyZXNob2xkc1soWT4+MSkrNCooWD4+MildLAotICAgICAgICAgICAgICAgIHBBbHBoYVtJbnRlcm5hbF0sCi0gICAgICAgICAgICAgICAgcEJldGFbSW50ZXJuYWxdLAotICAgICAgICAgICAgICAgIHBCU1tJXSwKLSAgICAgICAgICAgICAgICAxKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5Mjk0ZjguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kuYworKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogSC4yNjQgbHVtYSBkZWJsb2NrIG1vZHVsZQotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JICAgKDYuMy4zLjMuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIGZvdXIgaG9yaXpvbnRhbCBlZGdlcyBvZiB0aGUgbHVtYSAKLSAqIG1hY3JvYmxvY2sgKDE2eDE2KS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgc3JjZHN0U3RlcCAtcyB0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgcEFscGhhIC0gYXJyYXkgb2Ygc2l6ZSAyIG9mIGFscGhhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBhbHBoYSAKLSAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyAKLSAqICAgICAgICAgICAgZm9yIHRoZSBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBhbHBoYSAKLSAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAotICogICBwQmV0YSAtIGFycmF5IG9mIHNpemUgMiBvZiBiZXRhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBiZXRhIAotICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gCi0gKiAgICAgICAgICAgIGlzIGZvciB0aGUgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlKS4gUGVyIFtJU08xNDQ5Ni0xMF0gYmV0YSAKLSAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgIHBUaHJlc2hvbGRzIC0gYXJyYXkgb2Ygc2l6ZSAxNiBjb250YWluaW5nIHRocmVzaG9sZHMsIFRDMCwgZm9yIHRoZSB0b3AgCi0gKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSBvZiBlYWNoIDR4NCBibG9jaywgYXJyYW5nZWQgaW4gaG9yaXpvbnRhbCBibG9jayAKLSAqICAgICAgICAgICAgb3JkZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFBlciBbSVNPMTQ0OTYgMTBdIAotICogICAgICAgICAgICB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgcEJTIC0gYXJyYXkgb2Ygc2l6ZSAxNiBvZiBCUyBwYXJhbWV0ZXJzIChhcnJhbmdlZCBpbiBob3Jpem9udGFsIGJsb2NrIAotICogICAgICAgICAgICBvcmRlcik7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIAotICogICAgICAgICAgICBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC1Qb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyLCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCi0gKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAotICogICAgLSAgICBlaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgICAtICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAotICogICAgLSAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgIC0gICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uMTVdIGlzIAotICogICAgICAgICBvdXRzaWRlIG9mIHRoZSByYW5nZSBbMCwyNV0uIAotICogICAgLSAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKLSAqICAgICAgICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSgKLSAgICAgT01YX1U4KiBwU3JjRHN0LAotICAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCi0gICAgIGNvbnN0IE9NWF9VOCogcEFscGhhLAotICAgICBjb25zdCBPTVhfVTgqIHBCZXRhLAotICAgICBjb25zdCBPTVhfVTgqIHBUaHJlc2hvbGRzLAotICAgICBjb25zdCBPTVhfVTggKnBCUyAgICAgICAgCi0gKQotewotICAgIGludCBJLCBYLCBZLCBJbnRlcm5hbD0wOwotCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBTcmNEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoc3JjZHN0U3RlcCAmIDcsICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7ICAgIAotICAgIGFybVJldEFyZ0VycklmKHBBbHBoYSA9PSBOVUxMLCAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCZXRhID09IE5VTEwsICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBUaHJlc2hvbGRzID09IE5VTEwsICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwVGhyZXNob2xkcyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQlMgPT0gTlVMTCwgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBCUyksICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIAotICAgIGZvciAoWT0wOyBZPDE2OyBZKz00LCBJbnRlcm5hbD0xKQotICAgIHsKLSAgICAgICAgZm9yIChYPTA7IFg8MTY7IFgrKykKLSAgICAgICAgewotICAgICAgICAgICAgSSA9IChYPj4yKSs0KihZPj4yKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYXJtUmV0QXJnRXJySWYocEJTW0ldID4gNCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFybVJldEFyZ0VycklmKCAoSSA+IDMpICYmIChwQlNbSV0gPT0gNCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFybVJldEFyZ0VycklmKCAoSSA8IDQpICAgICAgICYmIAotICAgICAgICAgICAgICAgICAgICAgICAgICAoIChwQlNbSV0gPT0gNCkgJiYgKHBCU1tJXjFdICE9IDQpICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qIEZpbHRlciBob3Jpem9udGFsIGVkZ2Ugd2l0aCBxMCBhdCAoWCxZKSAqLwotICAgICAgICAgICAgYXJtVkNNNFAxMF9EZUJsb2NrUGl4ZWwoCi0gICAgICAgICAgICAgICAgcFNyY0RzdCArIFkqc3JjZHN0U3RlcCArIFgsCi0gICAgICAgICAgICAgICAgc3JjZHN0U3RlcCwKLSAgICAgICAgICAgICAgICBwVGhyZXNob2xkc1tJXSwKLSAgICAgICAgICAgICAgICBwQWxwaGFbSW50ZXJuYWxdLAotICAgICAgICAgICAgICAgIHBCZXRhW0ludGVybmFsXSwKLSAgICAgICAgICAgICAgICBwQlNbSV0sCi0gICAgICAgICAgICAgICAgMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2UyMzJhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEguMjY0IGx1bWEgZGVibG9jayBtb2R1bGUKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSAgICg2LjMuMy4zLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyBvbiBmb3VyIHZlcnRpY2FsIGVkZ2VzIG9mIHRoZSBsdW1hIAotICogbWFjcm9ibG9jayAoMTZ4MTYpLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAotICogICBzcmNkc3RTdGVwIC1TdGVwIG9mIHRoZSBhcnJheXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIHBBbHBoYSAtQXJyYXkgb2Ygc2l6ZSAyIG9mIGFscGhhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBhbHBoYSAKLSAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyAKLSAqICAgICAgICAgICAgZm9yIHRoZSBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlKTsgcGVyIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIAotICogICAgICAgICAgICBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgcEJldGEgLUFycmF5IG9mIHNpemUgMiBvZiBiZXRhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBiZXRhIAotICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIAotICogICAgICAgICAgICBmb3IgdGhlIGludGVybmFsIHZlcnRpY2FsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBiZXRhIHZhbHVlcyAKLSAqICAgICAgICAgICAgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgcFRocmVzaG9sZHMgLUFycmF5IG9mIHNpemUgMTYgb2YgVGhyZXNob2xkcyAoVEMwKSAodmFsdWVzIGZvciB0aGUgbGVmdCAKLSAqICAgICAgICAgICAgZWRnZSBvZiBlYWNoIDR4NCBibG9jaywgYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgb3JkZXIpOyBtdXN0IAotICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5Li4gIFBlciBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IAotICogICAgICAgICAgICBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgcEJTIC1BcnJheSBvZiBzaXplIDE2IG9mIEJTIHBhcmFtZXRlcnMgKGFycmFuZ2VkIGluIHZlcnRpY2FsIGJsb2NrIAotICogICAgICAgICAgICBvcmRlcik7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIAotICogICAgICAgICAgICBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC1Qb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAotICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKLSAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCi0gKiAgICBFaXRoZXIgb2YgdGhlIHBvaW50ZXJzIGluIHBTcmNEc3QsIHBBbHBoYSwgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMgCi0gKiAgICAgICAgICAgICAgaXMgTlVMTC4gCi0gKiAgICBFaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgIHBTcmNEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAotICogICAgcEJldGFbMF0gYW5kL29yIHBCZXRhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgICBPbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi4xNV1pcyBvdXRzaWRlIG9mIHRoZSAKLSAqICAgICAgICAgICAgICByYW5nZSBbMCwyNV0uIAotICogICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgKHBCU1tpXT09NCAmJiAKLSAqICAgICAgICAgICAgICBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0koCi0gICAgIE9NWF9VOCogcFNyY0RzdCwKLSAgICAgT01YX1MzMiBzcmNkc3RTdGVwLAotICAgICBjb25zdCBPTVhfVTgqIHBBbHBoYSwKLSAgICAgY29uc3QgT01YX1U4KiBwQmV0YSwKLSAgICAgY29uc3QgT01YX1U4KiBwVGhyZXNob2xkcywKLSAgICAgY29uc3QgT01YX1U4ICpwQlMgICAgICAgIAotICkKLXsKLSAgICBpbnQgWCwgWSwgSSwgSW50ZXJuYWw9MDsKLQotICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDE2Qnl0ZUFsaWduZWQocFNyY0RzdCksT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHNyY2RzdFN0ZXAgJiAxNSwgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOyAgICAKLSAgICBhcm1SZXRBcmdFcnJJZihwQWxwaGEgPT0gTlVMTCwgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQmV0YSA9PSBOVUxMLCAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwVGhyZXNob2xkcyA9PSBOVUxMLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFRocmVzaG9sZHMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJTID09IE5VTEwsICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwQlMpLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQmV0YVswXSA+IDE4LCAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCZXRhWzFdID4gMTgsICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgCi0KLSAgICBmb3IgKFg9MDsgWDwxNjsgWCs9NCwgSW50ZXJuYWw9MSkKLSAgICB7Ci0gICAgICAgIGZvciAoWT0wOyBZPDE2OyBZKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIEkgPSAoWT4+MikrNCooWD4+Mik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFybVJldEFyZ0VycklmKHBCU1tZXSA+IDQsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYXJtUmV0QXJnRXJySWYoKHBCU1tZXSA9PSA0KSAmJiAoWSA+IDMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYXJtUmV0QXJnRXJySWYoKCAocEJTW1ldID09IDQpICYmIChwQlNbWV4zXSAhPSA0KSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGFybVJldEFyZ0VycklmKHBUaHJlc2hvbGRzW1ldID4gMjUsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyogRmlsdGVyIHZlcnRpY2FsIGVkZ2Ugd2l0aCBxMCBhdCAoWCxZKSAqLwotICAgICAgICAgICAgYXJtVkNNNFAxMF9EZUJsb2NrUGl4ZWwoCi0gICAgICAgICAgICAgICAgcFNyY0RzdCArIFkqc3JjZHN0U3RlcCArIFgsCi0gICAgICAgICAgICAgICAgMSwKLSAgICAgICAgICAgICAgICBwVGhyZXNob2xkc1tJXSwKLSAgICAgICAgICAgICAgICBwQWxwaGFbSW50ZXJuYWxdLAotICAgICAgICAgICAgICAgIHBCZXRhW0ludGVybmFsXSwKLSAgICAgICAgICAgICAgICBwQlNbSV0sCi0gICAgICAgICAgICAgICAgMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfR2V0VkxDSW5mby5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9HZXRWTENJbmZvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MDU1MmEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9HZXRWTENJbmZvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfR2V0VkxDSW5mby5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIAotICogVGhpcyBmdW5jdGlvbiBleHRyYWN0cyBydW4tbGVuZ3RoIGVuY29kaW5nIChSTEUpIGluZm9ybWF0aW9uCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9HZXRWTENJbmZvICAgKDYuMy41LjkuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gZXh0cmFjdHMgcnVuLWxlbmd0aCBlbmNvZGluZyAoUkxFKSBpbmZvcm1hdGlvbiBmcm9tIHRoZSAKLSAqIGNvZWZmaWNpZW50IG1hdHJpeC4gIFRoZSByZXN1bHRzIGFyZSByZXR1cm5lZCBpbiBhbiBPTVhWQ000UDEwVkxDSW5mbyAKLSAqIHN0cnVjdHVyZS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0NvZWZmIC0gcG9pbnRlciB0byB0aGUgdHJhbnNmb3JtIGNvZWZmaWNpZW50IG1hdHJpeC4gIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgcFNjYW5NYXRyaXggLSBwb2ludGVyIHRvIHRoZSBzY2FuIG9yZGVyIGRlZmluaXRpb24gbWF0cml4LiAgRm9yIGEgbHVtYSAKLSAqICAgICAgICAgICAgYmxvY2sgdGhlIHNjYW4gbWF0cml4IHNob3VsZCBmb2xsb3cgW0lTTzE0NDk2LTEwXSBzZWN0aW9uIDguNS40LCAKLSAqICAgICAgICAgICAgYW5kIHNob3VsZCBjb250YWluIHRoZSB2YWx1ZXMgMCwgMSwgNCwgOCwgNSwgMiwgMywgNiwgOSwgMTIsIDEzLCAKLSAqICAgICAgICAgICAgMTAsIDcsIDExLCAxNCwgMTUuICBGb3IgYSBjaHJvbWEgYmxvY2ssIHRoZSBzY2FuIG1hdHJpeCBzaG91bGQgCi0gKiAgICAgICAgICAgIGNvbnRhaW4gdGhlIHZhbHVlcyAwLCAxLCAyLCAzLiAKLSAqICAgYkFDIC0gaW5kaWNhdGVzIHByZXNlbmNlIG9mIGEgREMgY29lZmZpY2llbnQ7IDAgPSBEQyBjb2VmZmljaWVudCAKLSAqICAgICAgICAgICAgcHJlc2VudCwgMT0gREMgY29lZmZpY2llbnQgYWJzZW50LiAKLSAqICAgTWF4TnVtQ29lZiAtIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBjb250YWluZWQgaW4gdGhlIAotICogICAgICAgICAgICB0cmFuc2Zvcm0gY29lZmZpY2llbnQgbWF0cml4LCBwU3JjQ29lZmYuIFRoZSB2YWx1ZSBzaG91bGQgYmUgMTYgCi0gKiAgICAgICAgICAgIGZvciBibG9ja3Mgb2YgdHlwZSBMVU1BREMsIExVTUFBQywgTFVNQUxFVkVMLCBhbmQgQ0hST01BQUMuIFRoZSAKLSAqICAgICAgICAgICAgdmFsdWUgc2hvdWxkIGJlIDQgZm9yIGJsb2NrcyBvZiB0eXBlIENIUk9NQURDLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFZMQ0luZm8gLSBwb2ludGVyIHRvIHN0cnVjdHVyZSB0aGF0IHN0b3JlcyBpbmZvcm1hdGlvbiBmb3IgCi0gKiAgICAgICAgICAgIHJ1bi1sZW5ndGggY29kaW5nLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICAgICBwU3JjQ29lZmYsIHBTY2FuTWF0cml4LCBwRHN0VkxDSW5mbyAKLSAqICAgIC0gICAgcFNyY0NvZWZmIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0dldFZMQ0luZm8gKAotCWNvbnN0IE9NWF9TMTYqCQkgICAgcFNyY0NvZWZmLAotCWNvbnN0IE9NWF9VOCoJCQkgICAgcFNjYW5NYXRyaXgsCi0JT01YX1U4CQkJICAgIGJBQywKLQlPTVhfVTMyCQkJICAgIE1heE51bUNvZWYsCi0JT01YVkNNNFAxMFZMQ0luZm8qCXBEc3RWTENJbmZvCi0pCi17Ci0gICAgT01YX0lOVCAgICAgaSwgTWluSW5kZXg7Ci0gICAgT01YX1MzMiAgICAgVmFsdWU7Ci0gICAgT01YX1UzMiAgICAgTWFzayA9IDQsIFJ1bkJlZm9yZTsKLSAgICBPTVhfUzE2ICAgICAqcExldmVsOwotICAgIE9NWF9VOCAgICAgICpwUnVuOwotICAgIE9NWF9TMTYgICAgIEJ1ZiBbMTZdOwotCi0gICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY0NvZWZmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwU3JjQ29lZmYpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwU2Nhbk1hdHJpeCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0VkxDSW5mbyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihiQUMgPiAxLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihNYXhOdW1Db2VmID4gMTYsIE9NWF9TdHNfQmFkQXJnRXJyKQotCi0gICAgLyogSW5pdGlhbGl6ZSBSTEUgSW5mbyBzdHJ1Y3R1cmUgKi8KLSAgICBwRHN0VkxDSW5mby0+dVRyYWlsaW5nX09uZXMgPSAwOwotICAgIHBEc3RWTENJbmZvLT51VHJhaWxpbmdfT25lX1NpZ25zID0gMDsKLSAgICBwRHN0VkxDSW5mby0+dU51bUNvZWZmcyA9IDA7Ci0gICAgcERzdFZMQ0luZm8tPnVUb3RhbFplcm9zID0gMDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgIHsKLSAgICAgICAgcERzdFZMQ0luZm8tPmlMZXZlbHMgW2ldID0gMDsKLSAgICAgICAgcERzdFZMQ0luZm8tPnVSdW5zIFtpXSA9IDA7Ci0gICAgfQotICAgIAotICAgIE1pbkluZGV4ID0gKGJBQyA9PSAwICYmIE1heE51bUNvZWYgPT0gMTUpID8gMSA6IDA7Ci0gICAgZm9yIChpID0gTWluSW5kZXg7IGkgPCAoTWF4TnVtQ29lZiArIE1pbkluZGV4KTsgaSsrKQotICAgIHsgICAgICAgIAotICAgICAgICAvKiBTY2FuICovCi0gICAgICAgIEJ1ZiBbaSAtIE1pbkluZGV4XSA9IHBTcmNDb2VmZiBbcFNjYW5NYXRyaXggW2ldXTsKLSAgICB9Ci0KLSAgICAvKiBza2lwIHplcm9zIGF0IHRoZSBlbmQgKi8KLSAgICBpID0gTWF4TnVtQ29lZiAtIDE7Ci0gICAgd2hpbGUgKCFCdWYgW2ldICYmIGkgPj0gMCkKLSAgICB7Ci0gICAgICAgIGktLTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGkgPCAwKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci0gICAgfQotCi0gICAgLyogRmlsbCBSTEUgSW5mbyBzdHJ1Y3R1cmUgKi8KLSAgICBwTGV2ZWwgPSBwRHN0VkxDSW5mby0+aUxldmVsczsKLSAgICBwUnVuID0gcERzdFZMQ0luZm8tPnVSdW5zOwotICAgIFJ1bkJlZm9yZSA9IDA7Ci0KLSAgICAvKiBIYW5kbGUgZmlyc3Qgbm9uIHplcm8gc2VwYXJhdGUgKi8KLSAgICBwRHN0VkxDSW5mby0+dU51bUNvZWZmcysrOwotICAgIFZhbHVlID0gQnVmIFtpXTsKLSAgICBpZiAoVmFsdWUgPT0gMSB8fCBWYWx1ZSA9PSAtMSkKLSAgICB7Ci0gICAgICAgIHBEc3RWTENJbmZvLT51VHJhaWxpbmdfT25lcysrOwotICAgICAgICAKLSAgICAgICAgcERzdFZMQ0luZm8tPnVUcmFpbGluZ19PbmVfU2lnbnMgfD0gCi0gICAgICAgICAgICBWYWx1ZSA9PSAtMSA/IE1hc2sgOiAwOwotICAgICAgICBNYXNrID4+PSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBWYWx1ZSAtPSAoVmFsdWUgPiAwID8gMSA6IC0xKTsKLSAgICAgICAgKnBMZXZlbCsrID0gVmFsdWU7Ci0gICAgICAgIE1hc2sgPSAwOwotICAgIH0KLQotICAgIC8qIFJlbWFpbmluZyBub24gemVybyAqLwotICAgIHdoaWxlICgtLWkgPj0gMCkKLSAgICB7Ci0gICAgICAgIFZhbHVlID0gQnVmIFtpXTsKLSAgICAgICAgaWYgKFZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBwRHN0VkxDSW5mby0+dU51bUNvZWZmcysrOwotCi0gICAgICAgICAgICAvKiBNYXNrIGJlY29tZXMgemVybyBhZnRlciBlbnRlcmluZyAqLwotICAgICAgICAgICAgaWYgKE1hc2sgJiYKLSAgICAgICAgICAgICAgICAoVmFsdWUgPT0gMSB8fCAKLSAgICAgICAgICAgICAgICAgVmFsdWUgPT0gLTEpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBEc3RWTENJbmZvLT51VHJhaWxpbmdfT25lcysrOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBEc3RWTENJbmZvLT51VHJhaWxpbmdfT25lX1NpZ25zIHw9IAotICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PSAtMSA/IE1hc2sgOiAwOwotICAgICAgICAgICAgICAgIE1hc2sgPj49IDE7Ci0gICAgICAgICAgICAgICAgKnBSdW4rKyA9IFJ1bkJlZm9yZTsKLSAgICAgICAgICAgICAgICBSdW5CZWZvcmUgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIElmIDMgdHJhaWxpbmcgb25lcyBhcmUgbm90IGNvbXBsZXRlZCAqLwotICAgICAgICAgICAgICAgIGlmIChNYXNrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTWFzayA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIFZhbHVlIC09IChWYWx1ZSA+IDAgPyAxIDogLTEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAqcExldmVsKysgPSBWYWx1ZTsKLSAgICAgICAgICAgICAgICAqcFJ1bisrID0gUnVuQmVmb3JlOwotICAgICAgICAgICAgICAgIFJ1bkJlZm9yZSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwRHN0VkxDSW5mby0+dVRvdGFsWmVyb3MrKzsKLSAgICAgICAgICAgIFJ1bkJlZm9yZSsrOwotICAgICAgICB9ICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgLyogVXBkYXRlIGxhc3QgcnVuICovCi0gICAgaWYgKFJ1bkJlZm9yZSkKLSAgICB7Ci0gICAgICAgICpwUnVuKysgPSBSdW5CZWZvcmU7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ODI0ZDguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSAxLzggUGl4ZWwgaW50ZXJwb2xhdGlvbiBmb3IgQ2hyb21hIEJsb2NrCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEgICAoNi4zLjMuMi4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgMS84LXBpeGVsIGludGVycG9sYXRpb24gZm9yIGludGVyIGNocm9tYSBNQi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtUG9pbnRlciB0byB0aGUgc291cmNlIHJlZmVyZW5jZSBmcmFtZSBidWZmZXIgCi0gKiAgIHNyY1N0ZXAgLVJlZmVyZW5jZSBmcmFtZSBzdGVwIGluIGJ5dGVzIAotICogICBkc3RTdGVwIC1EZXN0aW5hdGlvbiBmcmFtZSBzdGVwIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgCi0gKiAgICAgICAgICAgIHJvaS53aWR0aC4gCi0gKiAgIGR4IC1GcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgCi0gKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw3XSAKLSAqICAgZHkgLUZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgCi0gKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw3XSAKLSAqICAgcm9pIC1EaW1lbnNpb24gb2YgdGhlIGludGVycG9sYXRpb24gcmVnaW9uOyB0aGUgcGFyYW1ldGVycyByb2kud2lkdGggYW5kIAotICogICAgICAgICAgICByb2kuaGVpZ2h0IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDIsIDQsIG9yIDguIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC1Qb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBmcmFtZSBidWZmZXIgaWYgcm9pLndpZHRoPT0yLCAgMi1ieXRlIAotICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQgaWYgcm9pLndpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKLSAqICAgICAgICAgICAgaWYgcm9pLndpZHRoPT04LCA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCi0gKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAotICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKLSAqICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKLSAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCA8IDguIAotICogICAgZHggb3IgZHkgaXMgb3V0IG9mIHJhbmdlIFswLTddLiAKLSAqICAgIHJvaS53aWR0aCBvciByb2kuaGVpZ2h0IGlzIG91dCBvZiByYW5nZSB7Miw0LDh9LiAKLSAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byAyLCBidXQgcERzdCBpcyBub3QgMi1ieXRlIGFsaWduZWQuIAotICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDQsIGJ1dCBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gOCwgYnV0IHBEc3QgaXMgbm90IDggYnl0ZSBhbGlnbmVkLiAKLSAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEgKAotICAgICBjb25zdCBPTVhfVTgqIHBTcmMsCi0gICAgIE9NWF9TMzIgc3JjU3RlcCwKLSAgICAgT01YX1U4KiBwRHN0LAotICAgICBPTVhfUzMyIGRzdFN0ZXAsCi0gICAgIE9NWF9TMzIgZHgsCi0gICAgIE9NWF9TMzIgZHksCi0gICAgIE9NWFNpemUgcm9pCi0gKQotewotICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihzcmNTdGVwIDwgOCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoZHN0U3RlcCA8IDgsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGR4IDwgMCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoZHggPiA3LCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihkeSA8IDAsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGR5ID4gNywgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKHJvaS53aWR0aCAhPSAyKSAmJiAocm9pLndpZHRoICE9IDQpICYmIChyb2kud2lkdGggIT0gOCksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChyb2kuaGVpZ2h0ICE9IDIpICYmIChyb2kuaGVpZ2h0ICE9IDQpICYmIChyb2kuaGVpZ2h0ICE9IDgpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigocm9pLndpZHRoID09IDIpICYmIGFybU5vdDJCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKHJvaS53aWR0aCA9PSA0KSAmJiBhcm1Ob3Q0Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChyb2kud2lkdGggPT0gOCkgJiYgYXJtTm90OEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihzcmNTdGVwICYgNywgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoZHN0U3RlcCAmIDcsIE9NWF9TdHNfQmFkQXJnRXJyKQotCi0gICAgcmV0dXJuIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hIAotICAgICAgICAoKE9NWF9VOCopcFNyYywgc3JjU3RlcCwgcERzdCwgZHN0U3RlcCwgcm9pLndpZHRoLCByb2kuaGVpZ2h0LCBkeCwgZHkpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YzgyMDguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSBIYWxmIGhvcml6b250YWwgbHVtYSBpbnRlcnBvbGF0aW9uCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hICAgKDYuMy41LjUuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgdHdvIGhvcml6b250YWwgMS8yLXBlbCBwb3NpdGlvbnMgCi0gKiAoLTEvMiwwKSBhbmQgKDEvMiwgMCkgLSBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSBpbiAKLSAqICAgICAgICAgICAgdGhlIHJlY29uc3RydWN0aW9uIGZyYW1lIHBsYW5lLiAKLSAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiAKLSAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXI7IG11c3QgYmUgYSAKLSAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgaVdpZHRoLiAKLSAqICAgaVdpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2IAotICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIDQsIDgsIG9yIDE2IAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0TGVmdCAtUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIGxlZnQgLXBlbCBwb3NpdGlvbiAKLSAqICAgICAgICAgICAgKC0xLzIsIDApIAotICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgcERzdFJpZ2h0IC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgcmlnaHQgLXBlbCAKLSAqICAgICAgICAgICAgcG9zaXRpb24gKDEvMiwgMCkgCi0gKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgICAgICBwU3JjLCBwRHN0TGVmdCwgb3IgcERzdFJpZ2h0IAotICogICAgLSAgICBpV2lkdGggb3IgaUhlaWdodCBoYXZlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2IAotICogICAgLSAgICBpV2lkdGg9PTQgYnV0IHBEc3RMZWZ0IGFuZC9vciBwRHN0UmlnaHQgaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBpV2lkdGg9PTggYnV0IHBEc3RMZWZ0IGFuZC9vciBwRHN0UmlnaHQgaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBpV2lkdGg9PTE2IGJ1dCBwRHN0TGVmdCBhbmQvb3IgcERzdFJpZ2h0IGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEoCi0gICAgICAgIGNvbnN0IE9NWF9VOCogICAgIHBTcmMsIAotICAgICAgICBPTVhfVTMyICAgICBpU3JjU3RlcCwgCi0gICAgICAgIE9NWF9VOCogICAgIHBEc3RMZWZ0LCAKLSAgICAgICAgT01YX1U4KiAgICAgcERzdFJpZ2h0LCAKLSAgICAgICAgT01YX1UzMiAgICAgaURzdFN0ZXAsIAotICAgICAgICBPTVhfVTMyICAgICBpV2lkdGgsIAotICAgICAgICBPTVhfVTMyICAgICBpSGVpZ2h0Ci0pCi17Ci0gICAgT01YUmVzdWx0ICAgUmV0VmFsdWU7ICAgIAotCi0gICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0TGVmdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0UmlnaHQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlXaWR0aCA9PSA0KSAmJiAKLSAgICAgICAgICAgICAgICAgICBhcm1Ob3Q0Qnl0ZUFsaWduZWQocERzdExlZnQpICYmCi0gICAgICAgICAgICAgICAgICAgYXJtTm90NEJ5dGVBbGlnbmVkKHBEc3RSaWdodCksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChpV2lkdGggPT0gOCkgJiYgCi0gICAgICAgICAgICAgICAgICAgYXJtTm90OEJ5dGVBbGlnbmVkKHBEc3RMZWZ0KSAmJgotICAgICAgICAgICAgICAgICAgIGFybU5vdDhCeXRlQWxpZ25lZChwRHN0UmlnaHQpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigoaVdpZHRoID09IDE2KSAmJiAKLSAgICAgICAgICAgICAgICAgICBhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBEc3RMZWZ0KSAmJgotICAgICAgICAgICAgICAgICAgIGFybU5vdDE2Qnl0ZUFsaWduZWQocERzdFJpZ2h0KSwgT01YX1N0c19CYWRBcmdFcnIpCi0KLSAgICBhcm1SZXRBcmdFcnJJZigoaUhlaWdodCAhPSAxNikgJiYgKGlIZWlnaHQgIT0gOCkmJiAoaUhlaWdodCAhPSA0KSwgT01YX1N0c19CYWRBcmdFcnIpCi0JYXJtUmV0QXJnRXJySWYoKGlXaWR0aCAhPSAxNikgJiYgKGlXaWR0aCAhPSA4KSYmIChpV2lkdGggIT0gNCksIE9NWF9TdHNfQmFkQXJnRXJyKQotCi0gICAgUmV0VmFsdWUgPSBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hICgKLSAgICAgICAgcFNyYyAtIDEsICAgICAKLSAgICAgICAgaVNyY1N0ZXAsIAotICAgICAgICBwRHN0TGVmdCwgICAgIAotICAgICAgICBpRHN0U3RlcCwgCi0gICAgICAgIGlXaWR0aCwgICAKLSAgICAgICAgaUhlaWdodCk7Ci0KLSAgICBpZiAoUmV0VmFsdWUgIT0gT01YX1N0c19Ob0VycikKLSAgICB7Ci0gICAgICAgIHJldHVybiBSZXRWYWx1ZTsKLSAgICB9Ci0KLSAgICBSZXRWYWx1ZSA9IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEgKAotICAgICAgICBwU3JjLCAgICAgCi0gICAgICAgIGlTcmNTdGVwLCAKLSAgICAgICAgcERzdFJpZ2h0LCAgICAgCi0gICAgICAgIGlEc3RTdGVwLCAKLSAgICAgICAgaVdpZHRoLCAgIAotICAgICAgICBpSGVpZ2h0KTsKLQotICAgIHJldHVybiBSZXRWYWx1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZjMTg2Yi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIFNBRCBmb3IgNHg0IGJsb2NrcwotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hICAgKDYuMy41LjUuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgdHdvIHZlcnRpY2FsIDEvMi1wZWwgcG9zaXRpb25zIC0gCi0gKiAoMCwgLTEvMikgYW5kICgwLCAxLzIpIC0gYXJvdW5kIGEgZnVsbC1wZWwgcG9zaXRpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIGluIHRoZSAKLSAqICAgICAgICAgICAgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZSAKLSAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiAKLSAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiAoaW50ZXJwb2xhdGlvbikgYnVmZmVyOyBtdXN0IGJlIGEgCi0gKiAgICAgICAgICAgIG11bHRpcGxlIG9mIGlXaWR0aC4gCi0gKiAgIGlXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNiAKLSAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RVcCAtUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIC1wZWwgcG9zaXRpb24gYWJvdmUgCi0gKiAgICAgICAgICAgIHRoZSBjdXJyZW50IGZ1bGwtcGVsIHBvc2l0aW9uICgwLCAtMS8yKSAKLSAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09NCwgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTgsIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBwRHN0RG93biAtUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIC1wZWwgcG9zaXRpb24gYmVsb3cgCi0gKiAgICAgICAgICAgIHRoZSBjdXJyZW50IGZ1bGwtcGVsIHBvc2l0aW9uICgwLCAxLzIpIAotICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgICAgcFNyYywgcERzdFVwLCBvciBwRHN0RG93biAKLSAqICAgIC0gICAgaVdpZHRoIG9yIGlIZWlnaHQgaGF2ZSB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNiAKLSAqICAgIC0gICAgaVdpZHRoPT00IGJ1dCBwRHN0VXAgYW5kL29yIHBEc3REb3duIGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgaVdpZHRoPT04IGJ1dCBwRHN0VXAgYW5kL29yIHBEc3REb3duIGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgaVdpZHRoPT0xNiBidXQgcERzdFVwIGFuZC9vciBwRHN0RG93biBpcy9hcmUgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5IAotICoKLSAqLwotIE9NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hKCAgCi0gICAgIGNvbnN0IE9NWF9VOCogICAgcFNyYywgCi0gICAgIE9NWF9VMzIgICAgaVNyY1N0ZXAsIAotICAgICBPTVhfVTgqICAgIHBEc3RVcCwgCi0gICAgIE9NWF9VOCogICAgcERzdERvd24sIAotICAgICBPTVhfVTMyICAgIGlEc3RTdGVwLCAKLSAgICAgT01YX1UzMiAgICBpV2lkdGgsIAotICAgICBPTVhfVTMyICAgIGlIZWlnaHQKLSkKLXsKLSAgICBPTVhSZXN1bHQgICBSZXRWYWx1ZTsKLQotICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocERzdFVwID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBEc3REb3duID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChpV2lkdGggPT0gNCkgJiYgCi0gICAgICAgICAgICAgICAgICAgYXJtTm90NEJ5dGVBbGlnbmVkKHBEc3RVcCkgJiYKLSAgICAgICAgICAgICAgICAgICBhcm1Ob3Q0Qnl0ZUFsaWduZWQocERzdERvd24pLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigoaVdpZHRoID09IDgpICYmIAotICAgICAgICAgICAgICAgICAgIGFybU5vdDhCeXRlQWxpZ25lZChwRHN0VXApICYmCi0gICAgICAgICAgICAgICAgICAgYXJtTm90OEJ5dGVBbGlnbmVkKHBEc3REb3duKSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlXaWR0aCA9PSAxNikgJiYgCi0gICAgICAgICAgICAgICAgICAgYXJtTm90MTZCeXRlQWxpZ25lZChwRHN0VXApICYmCi0gICAgICAgICAgICAgICAgICAgYXJtTm90MTZCeXRlQWxpZ25lZChwRHN0RG93biksIE9NWF9TdHNfQmFkQXJnRXJyKQotCi0gICAgYXJtUmV0QXJnRXJySWYoKGlIZWlnaHQgIT0gMTYpICYmIChpSGVpZ2h0ICE9IDgpJiYgKGlIZWlnaHQgIT0gNCksIE9NWF9TdHNfQmFkQXJnRXJyKQotCWFybVJldEFyZ0VycklmKChpV2lkdGggIT0gMTYpICYmIChpV2lkdGggIT0gOCkmJiAoaVdpZHRoICE9IDQpLCBPTVhfU3RzX0JhZEFyZ0VycikKLQotICAgIFJldFZhbHVlID0gYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSggIAotICAgICAgICBwU3JjIC0gaVNyY1N0ZXAsIAotICAgICAgICBpU3JjU3RlcCwgCi0gICAgICAgIHBEc3RVcCwKLSAgICAgICAgaURzdFN0ZXAsIAotICAgICAgICBpV2lkdGgsIAotICAgICAgICBpSGVpZ2h0KTsKLSAgICAKLSAgICBpZiAoUmV0VmFsdWUgIT0gT01YX1N0c19Ob0VycikKLSAgICB7Ci0gICAgICAgIHJldHVybiBSZXRWYWx1ZTsKLSAgICB9Ci0KLSAgICBSZXRWYWx1ZSA9IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEoICAKLSAgICAgICAgcFNyYywgCi0gICAgICAgIGlTcmNTdGVwLCAKLSAgICAgICAgcERzdERvd24sCi0gICAgICAgIGlEc3RTdGVwLCAKLSAgICAgICAgaVdpZHRoLCAKLSAgICAgICAgaUhlaWdodCk7Ci0gICAgCi0gICAgcmV0dXJuIFJldFZhbHVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyYTgxNjMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEuYworKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIFBlcmZvcm1zIHF1YXJ0ZXItcGl4ZWwgaW50ZXJwb2xhdGlvbiAKLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hICAgKDYuMy4zLjIuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHF1YXJ0ZXItcGl4ZWwgaW50ZXJwb2xhdGlvbiBmb3IgaW50ZXIgbHVtYSBNQi4gSXQgaXMgYXNzdW1lZCB0aGF0IAotICogdGhlIGZyYW1lIGlzIGFscmVhZHkgcGFkZGVkIHdoZW4gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC1Qb2ludGVyIHRvIHRoZSBzb3VyY2UgcmVmZXJlbmNlIGZyYW1lIGJ1ZmZlciAKLSAqICAgc3JjU3RlcCAtcmVmZXJlbmNlIGZyYW1lIHN0ZXAsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2Ygcm9pLndpZHRoIAotICogICBkc3RTdGVwIC1kZXN0aW5hdGlvbiBmcmFtZSBzdGVwLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIAotICogICAgICAgICAgICByb2kud2lkdGggCi0gKiAgIGR4IC1GcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgCi0gKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCwzXSAKLSAqICAgZHkgLUZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIHkgY29tcG9uZW50IGluIDEvNCBwaXhlbCAKLSAqICAgICAgICAgICAgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDNdIAotICogICByb2kgLURpbWVuc2lvbiBvZiB0aGUgaW50ZXJwb2xhdGlvbiByZWdpb247IHRoZSBwYXJhbWV0ZXJzIHJvaS53aWR0aCBhbmQgCi0gKiAgICAgICAgICAgIHJvaS5oZWlnaHQgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC1Qb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBmcmFtZSBidWZmZXIgaWYgcm9pLndpZHRoPT00LCAgNC1ieXRlIAotICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQgaWYgcm9pLndpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKLSAqICAgICAgICAgICAgaWYgcm9pLndpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKLSAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCi0gKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAotICogICAgcFNyYyBvciBwRHN0IGlzIE5VTEwuIAotICogICAgc3JjU3RlcCBvciBkc3RTdGVwIDwgcm9pLndpZHRoLiAKLSAqICAgIGR4IG9yIGR5IGlzIG91dCBvZiByYW5nZSBbMCwzXS4gCi0gKiAgICByb2kud2lkdGggb3Igcm9pLmhlaWdodCBpcyBvdXQgb2YgcmFuZ2UgezQsIDgsIDE2fS4gCi0gKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gNCwgYnV0IHBEc3QgaXMgbm90IDQgYnl0ZSBhbGlnbmVkLiAKLSAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byA4IG9yIDE2LCBidXQgcERzdCBpcyBub3QgOCBieXRlIGFsaWduZWQuIAotICogICAgc3JjU3RlcCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEgKAotICAgICBjb25zdCBPTVhfVTgqIHBTcmMsCi0gICAgIE9NWF9TMzIgc3JjU3RlcCwKLSAgICAgT01YX1U4KiBwRHN0LAotICAgICBPTVhfUzMyIGRzdFN0ZXAsCi0gICAgIE9NWF9TMzIgZHgsCi0gICAgIE9NWF9TMzIgZHksCi0gICAgIE9NWFNpemUgcm9pICAgICAgICAKLSApCi17Ci0gICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHNyY1N0ZXAgPCByb2kud2lkdGgsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGRzdFN0ZXAgPCByb2kud2lkdGgsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGR4IDwgMCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoZHggPiAzLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihkeSA8IDAsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGR5ID4gMywgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKHJvaS53aWR0aCAhPSA0KSAmJiAocm9pLndpZHRoICE9IDgpICYmIChyb2kud2lkdGggIT0gMTYpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigocm9pLmhlaWdodCAhPSA0KSAmJiAocm9pLmhlaWdodCAhPSA4KSAmJiAocm9pLmhlaWdodCAhPSAxNiksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChyb2kud2lkdGggPT0gNCkgJiYgYXJtTm90NEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigocm9pLndpZHRoID09IDgpICYmIGFybU5vdDhCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKHJvaS53aWR0aCA9PSAxNikgJiYgYXJtTm90MTZCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoc3JjU3RlcCAmIDcsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGRzdFN0ZXAgJiA3LCBPTVhfU3RzX0JhZEFyZ0VycikgCi0KLSAgICByZXR1cm4gYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hIAotICAgICAgICAocFNyYywgc3JjU3RlcCwgcERzdCwgZHN0U3RlcCwgcm9pLndpZHRoLCByb2kuaGVpZ2h0LCBkeCwgZHkpOwotCi19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2OWU3NjguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQy5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgNHg0IGhhZGFtYXJkIHRyYW5zZm9ybSBvZiBjaHJvbWEgREMgIAotICogY29lZmZpY2llbnRzIGFuZCBxdWFudGl6YXRpb24KLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQyAgICg2LjMuNS42LjQpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgMngyIEhhZGFtYXJkIHRyYW5zZm9ybSBhbmQgdGhlbiBkZXF1YW50aXplcyAKLSAqIHRoZSBjb2VmZmljaWVudHMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSAyeDIgYXJyYXkgb2YgdGhlIDJ4MiBIYWRhbWFyZC10cmFuc2Zvcm1lZCBhbmQgCi0gKiAgICAgICAgICAgIHF1YW50aXplZCBjb2VmZmljaWVudHMuICA4IGJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIFBvaW50ZXIgdG8gaW52ZXJzZS10cmFuc2Zvcm1lZCBhbmQgZGVxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgCi0gKiAgICAgICAgICAgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYyAKLSAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMoCi0JY29uc3QgT01YX1MxNiogCXBTcmMsCi0JT01YX1MxNioJcERzdCwKLQlPTVhfVTMyCQlpUVAKLSkKLXsKLSAgICBPTVhfSU5UICAgICBpLCBqOwotICAgIE9NWF9TMzIgICAgIG1bMl1bMl07Ci0gICAgT01YX1MzMiAgICAgUVBlciwgVjAwLCBWYWx1ZTsKLQotICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBTcmMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihpUVAgPiA1MSwgT01YX1N0c19CYWRBcmdFcnIpCi0KLSAgICAvKiBJbnYgSGFkYW1hcmQgVHJhbnNmb3JtIGZvciAyeDIgYmxvY2sgKi8KLSAgICBtWzBdWzBdID0gcFNyY1swXSArIHBTcmNbMV0gKyAgcFNyY1syXSArIHBTcmNbM107Ci0gICAgbVswXVsxXSA9IHBTcmNbMF0gLSBwU3JjWzFdICsgIHBTcmNbMl0gLSBwU3JjWzNdOwotICAgIG1bMV1bMF0gPSBwU3JjWzBdICsgcFNyY1sxXSAtICBwU3JjWzJdIC0gcFNyY1szXTsKLSAgICBtWzFdWzFdID0gcFNyY1swXSAtIHBTcmNbMV0gLSAgcFNyY1syXSArIHBTcmNbM107Ci0KLSAgICAvKiBRdWFudGl6YXRpb24gKi8KLSAgICAvKiBTY2FsaW5nICovCi0gICAgUVBlciA9IGlRUCAvIDY7Ci0gICAgVjAwID0gYXJtVkNNNFAxMF9WTWF0cml4IFtpUVAgJSA2XVswXTsKLQotICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspCi0gICAgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoUVBlciA8IDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVmFsdWUgPSAobVtqXVtpXSAqIFYwMCkgPj4gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWYWx1ZSA9IChtW2pdW2ldICogVjAwKSA8PCAoUVBlciAtIDEpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwRHN0W2ogKiAyICsgaV0gPSAoT01YX1MxNikgVmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVmMTVjZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIDR4NCBoYWRhbWFyZCB0cmFuc2Zvcm0gb2YgbHVtYSBEQyBjb2VmZmljaWVudHMgCi0gKiBhbmQgcXVhbnRpemF0aW9uCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDICAgKDYuMy41LjYuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSA0eDQgSGFkYW1hcmQgdHJhbnNmb3JtIGFuZCB0aGVuIGRlcXVhbnRpemVzIAotICogdGhlIGNvZWZmaWNpZW50cy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIDR4NCBhcnJheSBvZiB0aGUgNHg0IEhhZGFtYXJkLXRyYW5zZm9ybWVkIGFuZCAKLSAqICAgICAgICAgICAgcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIDE2IGJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIFBvaW50ZXIgdG8gaW52ZXJzZS10cmFuc2Zvcm1lZCBhbmQgZGVxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgCi0gKiAgICAgICAgICAgIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMgCi0gKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQygJCi0JY29uc3QgT01YX1MxNiogCXBTcmMsCi0JT01YX1MxNioJcERzdCwKLQlPTVhfVTMyCQlpUVAKLSkKLXsKLSAgICBPTVhfSU5UICAgICBpLCBqOwotICAgIE9NWF9TMzIgICAgIG0xWzRdWzRdLCBtMls0XVs0XSwgVmFsdWU7Ci0gICAgT01YX1MzMiAgICAgUVBlciwgVjsKLQotICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihpUVAgPiA1MSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90MTZCeXRlQWxpZ25lZChwU3JjKSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90MTZCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpCi0KLSAgICAvKiBJbnYgSGFkYW1hcmQgVHJhbnNmb3JtIGZvciBEQyBMdW1hIDR4NCBibG9jayAqLwotICAgIC8qIEhvcml6b250YWwgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgIHsKLSAgICAgICAgaiA9IGkgKiA0OwotICAgICAgICAKLSAgICAgICAgbTFbaV1bMF0gPSBwU3JjW2ogKyAwXSArIHBTcmNbaiArIDJdOyAvKiBhK2MgKi8KLSAgICAgICAgbTFbaV1bMV0gPSBwU3JjW2ogKyAxXSArIHBTcmNbaiArIDNdOyAvKiBiK2QgKi8KLSAgICAgICAgbTFbaV1bMl0gPSBwU3JjW2ogKyAwXSAtIHBTcmNbaiArIDJdOyAvKiBhLWMgKi8KLSAgICAgICAgbTFbaV1bM10gPSBwU3JjW2ogKyAxXSAtIHBTcmNbaiArIDNdOyAvKiBiLWQgKi8KLQotICAgICAgICBtMltpXVswXSA9IG0xW2ldWzBdICsgbTFbaV1bMV07IC8qIGErYitjK2QgKi8KLSAgICAgICAgbTJbaV1bMV0gPSBtMVtpXVsyXSArIG0xW2ldWzNdOyAvKiBhK2ItYy1kICovCi0gICAgICAgIG0yW2ldWzJdID0gbTFbaV1bMl0gLSBtMVtpXVszXTsgLyogYS1iLWMrZCAqLwotICAgICAgICBtMltpXVszXSA9IG0xW2ldWzBdIC0gbTFbaV1bMV07IC8qIGEtYitjLWQgKi8KLQotICAgIH0KLQotICAgIC8qIFZlcnRpY2FsICovCi0gICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICB7Ci0gICAgICAgIG0xWzBdW2ldID0gbTJbMF1baV0gKyBtMlsyXVtpXTsKLSAgICAgICAgbTFbMV1baV0gPSBtMlsxXVtpXSArIG0yWzNdW2ldOwotICAgICAgICBtMVsyXVtpXSA9IG0yWzBdW2ldIC0gbTJbMl1baV07Ci0gICAgICAgIG0xWzNdW2ldID0gbTJbMV1baV0gLSBtMlszXVtpXTsKLQotICAgICAgICBtMlswXVtpXSA9IG0xWzBdW2ldICsgbTFbMV1baV07Ci0gICAgICAgIG0yWzFdW2ldID0gbTFbMl1baV0gKyBtMVszXVtpXTsKLSAgICAgICAgbTJbMl1baV0gPSBtMVsyXVtpXSAtIG0xWzNdW2ldOwotICAgICAgICBtMlszXVtpXSA9IG0xWzBdW2ldIC0gbTFbMV1baV07Ci0gICAgfQotCi0gICAgCi0gICAgLyogU2NhbGluZyAqLwotICAgIFFQZXIgPSBpUVAgLyA2OwotICAgIFYgPSBhcm1WQ000UDEwX1ZNYXRyaXggW2lRUCAlIDZdWzBdOwotCi0gICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChRUGVyIDwgMikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWYWx1ZSA9IChtMltqXVtpXSAqIFYgKyAoMSA8PCAoMSAtIFFQZXIpKSkgPj4gKDIgLSBRUGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWYWx1ZSA9IG0yW2pdW2ldICogViAqICgxIDw8IChRUGVyIC0gMikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBwRHN0W2ogKiA0ICsgaV0gPSAoT01YX1MxNikgVmFsdWU7Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNlNDUxOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgaW52ZXJzZSBpbnRlZ2VyIDR4NCB0cmFuc2Zvcm0KLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQgICAoNi4zLjUuNy4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIGFuIDR4NCBpbnRlZ2VyIHRyYW5zZm9ybWF0aW9uIHRvIHByb2R1Y2UgCi0gKiB0aGUgZGlmZmVyZW5jZSBzaWduYWwgYW5kIHRoZW4gYWRkcyB0aGUgZGlmZmVyZW5jZSB0byB0aGUgcHJlZGljdGlvbiB0byBnZXQgCi0gKiB0aGUgcmVjb25zdHJ1Y3RlZCBzaWduYWwuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNQcmVkIC0gUG9pbnRlciB0byBwcmVkaWN0aW9uIHNpZ25hbC4gIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBwRGVxdWFudENvZWZmIC0gUG9pbnRlciB0byB0aGUgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzLiAgOC1ieXRlIAotICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBpU3JjUHJlZFN0ZXAgLSBTdGVwIG9mIHRoZSBwcmVkaWN0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAotICogICBpRHN0UmVjb25TdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gcmVjb25zdHJ1Y3Rpb24gYnVmZmVyOyBtdXN0IGJlIGEgCi0gKiAgICAgICAgICAgIG11bHRpcGxlIG9mIDQuIAotICogICBiQUMgLSBJbmRpY2F0ZSB3aGV0aGVyIHRoZXJlIGlzIEFDIGNvZWZmaWNpZW50cyBpbiB0aGUgY29lZmZpY2llbnRzIAotICogICAgICAgICAgICBtYXRyaXguIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0UmVjb24gLVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIHJlY29uc3RydWN0aW9uIGJ1ZmZlci4gIDQtYnl0ZSAKLSAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICAgICBwU3JjUHJlZCwgcERlcXVhbnRDb2VmZiwgcERzdFJlY29uIAotICogICAgLSAgICBwU3JjUHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgaVNyY1ByZWRTdGVwIG9yIGlEc3RSZWNvblN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgICAtICAgIHBEZXF1YW50Q29lZmYgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQoCi0JY29uc3QgT01YX1U4KiAJcFNyY1ByZWQsIAotCWNvbnN0IE9NWF9TMTYqIAlwRGVxdWFudENvZWZmLCAKLQlPTVhfVTgqIAlwRHN0UmVjb24sCi0JT01YX1UzMiAJaVNyY1ByZWRTdGVwLCAKLQlPTVhfVTMyCQlpRHN0UmVjb25TdGVwLCAKLQlPTVhfVTgJCWJBQwotKQotewotICAgIE9NWF9JTlQgICAgIGksIGo7Ci0gICAgT01YX1MxNiAgICAgSW5bMTZdLCBPdXRbMTZdOwotICAgIE9NWF9TMzIgICAgIFZhbHVlOwotCi0gICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY1ByZWQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBTcmNQcmVkKSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocERlcXVhbnRDb2VmZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocERlcXVhbnRDb2VmZiksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBEc3RSZWNvbiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocERzdFJlY29uKSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoYkFDID4gMSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoaVNyY1ByZWRTdGVwID09IDAgfHwgaVNyY1ByZWRTdGVwICYgMywgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoaURzdFJlY29uU3RlcCA9PSAwIHx8IGlEc3RSZWNvblN0ZXAgJiAzLCBPTVhfU3RzX0JhZEFyZ0VycikKLQotICAgIGlmIChiQUMpCi0gICAgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgSW5baV0gPSBwRGVxdWFudENvZWZmIFtpXTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBDb3B5IERDICovCi0gICAgICAgIEluWzBdID0gcERlcXVhbnRDb2VmZiBbMF07Ci0gICAgCi0gICAgICAgIGZvciAoaSA9IDE7IGkgPCAxNjsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBJbltpXSA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBSZXNpZHVhbCBUcmFuc2Zvcm0gKi8KLSAgICBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0IChPdXQsIEluKTsgICAgCi0gICAgCi0gICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEFkZCBwcmVkaXRpb24gKi8KLSAgICAgICAgICAgIFZhbHVlID0gKE9NWF9TMzIpIE91dCBbaiAqIDQgKyBpXSArIHBTcmNQcmVkIFtqICogaVNyY1ByZWRTdGVwICsgaV07Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qIFNhdHVyYXRlIFZhbHVlIHRvIE9NWF9VOCAqLwotICAgICAgICAgICAgVmFsdWUgPSBhcm1DbGlwICgwLCAyNTUsIFZhbHVlKTsKLQotICAgICAgICAgICAgcERzdFJlY29uW2ogKiBpRHN0UmVjb25TdGVwICsgaV0gPSAoT01YX1U4KSBWYWx1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9NRUdldEJ1ZlNpemUuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfTUVHZXRCdWZTaXplLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMjQ1ZTEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9NRUdldEJ1ZlNpemUuYworKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX01FR2V0QnVmU2l6ZS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBJbml0aWFsaXphdGlvbiBtb2R1bGVzIGZvciB0aGUgdmVuZG9yIHNwZWNpZmljIE1vdGlvbiBFc3RpbWF0aW9uIHN0cnVjdHVyZS4KLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfTUVHZXRCdWZTaXplICAgKDYuMy41LjEuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbXB1dGVzIHRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIAotICogc3RydWN0dXJlIGZvciB0aGUgb214VkNNNFAxMCBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnMgQmxvY2tNYXRjaF9JbnRlZ2VyIAotICogYW5kIE1vdGlvbkVzdGltYXRpb25NQi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgTUVtb2RlIC0gbW90aW9uIGVzdGltYXRpb24gbW9kZTsgYXZhaWxhYmxlIG1vZGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSAKLSAqICAgICAgICAgICAgZW51bWVyYXRlZCB0eXBlIE9NWFZDTTRQMTBNRU1vZGUgCi0gKiAgIHBNRVBhcmFtcyAtbW90aW9uIGVzdGltYXRpb24gcGFyYW1ldGVycyAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNpemUgLSBwb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBtb3Rpb24gCi0gKiAgICAgICAgICAgIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgcE1FUGFyYW1zIG9yIHBTaXplIGlzIE5VTEwuIAotICogICAgLSAgICBhbiBpbnZhbGlkIE1FTW9kZSBpcyBzcGVjaWZpZWQuIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAxMF9NRUdldEJ1ZlNpemUoCi0gICAgT01YVkNNNFAxME1FTW9kZSBNRU1vZGUsCi0gICAgY29uc3QgT01YVkNNNFAxME1FUGFyYW1zICpwTUVQYXJhbXMsCi0gICAgT01YX1UzMiAqcFNpemUKLSAgICApCi17Ci0gICAgYXJtUmV0QXJnRXJySWYoIXBNRVBhcmFtcywgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFwU2l6ZSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChNRU1vZGUgIT0gT01YX1ZDX000UDEwX0ZBU1RfU0VBUkNIKSAmJiAKLSAgICAgICAgICAgICAgICAgICAoTUVNb2RlICE9IE9NWF9WQ19NNFAxMF9GVUxMX1NFQVJDSCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigocE1FUGFyYW1zLT5zZWFyY2hSYW5nZTE2eDE2IDw9IDApIHx8IAotICAgICAgICAgICAgICAgICAgIChwTUVQYXJhbXMtPnNlYXJjaFJhbmdlOHg4IDw9IDApIHx8IAotICAgICAgICAgICAgICAgICAgIChwTUVQYXJhbXMtPnNlYXJjaFJhbmdlNHg0IDw9IDApLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgICAgICAgICAgICAgICAgCi0gICAgKnBTaXplID0gKE9NWF9JTlQpIHNpemVvZihBUk1WQ000UDEwX01FU3BlYyk7Ci0gICAgCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX01FSW5pdC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9NRUluaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ2MzM1My4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX01FSW5pdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX01FSW5pdC5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBJbml0aWFsaXphdGlvbiBtb2R1bGVzIGZvciB0aGUgdmVuZG9yIHNwZWNpZmljIE1vdGlvbiBFc3RpbWF0aW9uIHN0cnVjdHVyZS4KLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX01FSW5pdCAgICg2LjMuNS4xLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBJbml0aWFsaXplcyB0aGUgdmVuZG9yLXNwZWNpZmljIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIHJlcXVpcmVkIGZvciB0aGUgCi0gKiBvbXhWQ000UDEwIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9uczogIEJsb2NrTWF0Y2hfSW50ZWdlciBhbmQgCi0gKiBNb3Rpb25Fc3RpbWF0aW9uTUIuIE1lbW9yeSBmb3IgdGhlIHNwZWNpZmljYXRpb24gc3RydWN0dXJlICpwTUVTcGVjIG11c3QgYmUgCi0gKiBhbGxvY2F0ZWQgcHJpb3IgdG8gY2FsbGluZyB0aGUgZnVuY3Rpb24sIGFuZCBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKLSAqIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIGNhbiAKLSAqIGJlIGRldGVybWluZWQgdXNpbmcgdGhlIGZ1bmN0aW9uIG9teFZDTTRQMTBfTUVHZXRCdWZTaXplLiBGb2xsb3dpbmcgCi0gKiBpbml0aWFsaXphdGlvbiBieSB0aGlzIGZ1bmN0aW9uLCB0aGUgdmVuZG9yLXNwZWNpZmljIHN0cnVjdHVyZSAqcE1FU3BlYyAKLSAqIHNob3VsZCBjb250YWluIGFuIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIHJlcHJlc2VudGF0aW9uIG9mIGFsbCBtb3Rpb24gCi0gKiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgcmVjZWl2ZWQgdmlhIHRoZSBzdHJ1Y3R1cmUgcE1FUGFyYW1zLCBmb3IgZXhhbXBsZSAgCi0gKiBzZWFyY2hSYW5nZTE2eDE2LCBzZWFyY2hSYW5nZTh4OCwgZXRjLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBNRW1vZGUgLSBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlOyBhdmFpbGFibGUgbW9kZXMgYXJlIGRlZmluZWQgYnkgdGhlIAotICogICAgICAgICAgICBlbnVtZXJhdGVkIHR5cGUgT01YVkNNNFAxME1FTW9kZSAKLSAqICAgcE1FUGFyYW1zIC0gbW90aW9uIGVzdGltYXRpb24gcGFyYW1ldGVycyAKLSAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIHVuaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsaXplZCBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBwTUVQYXJhbXMgb3IgcFNpemUgaXMgTlVMTC4gCi0gKiAgICAtICAgIGFuIGludmFsaWQgdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBNRW1vZGUgCi0gKiAgICAtICAgIGEgbmVnYXRpdmUgb3IgemVybyB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciBvbmUgb2YgdGhlIHNlYXJjaCByYW5nZXMgCi0gKiAgICAgICAgIChlLmcuLCAgcE1CUGFyYW1zID5zZWFyY2hSYW5nZTh4OCwgcE1FUGFyYW1zLT5zZWFyY2hSYW5nZTE2eDE2LCBldGMuKSAKLSAqICAgIC0gICAgZWl0aGVyIGluIGlzb2xhdGlvbiBvciBpbiBjb21iaW5hdGlvbiwgb25lIG9yIG1vcmUgb2YgdGhlIGVuYWJsZXMgb3IgCi0gKiAgICAgICAgIHNlYXJjaCByYW5nZXMgaW4gdGhlIHN0cnVjdHVyZSAqcE1FUGFyYW1zIHdlcmUgY29uZmlndXJlZCBzdWNoIAotICogICAgICAgICB0aGF0IHRoZSByZXF1ZXN0ZWQgYmVoYXZpb3IgZmFpbHMgdG8gY29tcGx5IHdpdGggW0lTTzE0NDk2LTEwXS4gCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDEwX01FSW5pdCgKLSAgICAgICAgT01YVkNNNFAxME1FTW9kZSBNRU1vZGUsCi0gICAgICAgIGNvbnN0IE9NWFZDTTRQMTBNRVBhcmFtcyAqcE1FUGFyYW1zLAotICAgICAgICB2b2lkICpwTUVTcGVjCi0gICAgICAgKQotewotICAgIEFSTVZDTTRQMTBfTUVTcGVjICphcm1NRVNwZWMgPSAoQVJNVkNNNFAxMF9NRVNwZWMgKikgcE1FU3BlYzsKLSAgICAKLSAgICBhcm1SZXRBcmdFcnJJZighcE1FUGFyYW1zLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIXBNRVNwZWMsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoTUVNb2RlICE9IE9NWF9WQ19NNFAxMF9GQVNUX1NFQVJDSCkgJiYgCi0gICAgICAgICAgICAgICAgICAgKE1FTW9kZSAhPSBPTVhfVkNfTTRQMTBfRlVMTF9TRUFSQ0gpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UxNngxNiA8PSAwKSB8fCAKLSAgICAgICAgICAgICAgICAgICAocE1FUGFyYW1zLT5zZWFyY2hSYW5nZTh4OCA8PSAwKSB8fCAKLSAgICAgICAgICAgICAgICAgICAocE1FUGFyYW1zLT5zZWFyY2hSYW5nZTR4NCA8PSAwKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIAotICAgIGFybU1FU3BlYy0+TUVQYXJhbXMuYmxvY2tTcGxpdEVuYWJsZTh4OCA9IHBNRVBhcmFtcy0+YmxvY2tTcGxpdEVuYWJsZTh4ODsKLSAgICBhcm1NRVNwZWMtPk1FUGFyYW1zLmJsb2NrU3BsaXRFbmFibGU0eDQgPSBwTUVQYXJhbXMtPmJsb2NrU3BsaXRFbmFibGU0eDQ7Ci0gICAgYXJtTUVTcGVjLT5NRVBhcmFtcy5oYWxmU2VhcmNoRW5hYmxlICAgID0gcE1FUGFyYW1zLT5oYWxmU2VhcmNoRW5hYmxlOwotICAgIGFybU1FU3BlYy0+TUVQYXJhbXMucXVhcnRlclNlYXJjaEVuYWJsZSA9IHBNRVBhcmFtcy0+cXVhcnRlclNlYXJjaEVuYWJsZTsKLSAgICBhcm1NRVNwZWMtPk1FUGFyYW1zLmludHJhRW5hYmxlNHg0ICAgICAgPSBwTUVQYXJhbXMtPmludHJhRW5hYmxlNHg0OyAgICAgCi0gICAgYXJtTUVTcGVjLT5NRVBhcmFtcy5zZWFyY2hSYW5nZTE2eDE2ICAgID0gcE1FUGFyYW1zLT5zZWFyY2hSYW5nZTE2eDE2OyAgIAotICAgIGFybU1FU3BlYy0+TUVQYXJhbXMuc2VhcmNoUmFuZ2U4eDggICAgICA9IHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2U4eDg7Ci0gICAgYXJtTUVTcGVjLT5NRVBhcmFtcy5zZWFyY2hSYW5nZTR4NCAgICAgID0gcE1FUGFyYW1zLT5zZWFyY2hSYW5nZTR4NDsKLSAgICBhcm1NRVNwZWMtPk1FTW9kZSAgICAgICAgICAgICAgICAgICAgICAgPSBNRU1vZGU7Ci0gICAgCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI2NDM5NC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTkwNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeAotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQi5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybSBNQiBsZXZlbCBtb3Rpb24gZXN0aW1hdGlvbgotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0jZGVmaW5lICBBUk1fVkNNNFAxMF9NQVhfRlJBTUVTICAgICAoMTUpCi0jZGVmaW5lICBBUk1fVkNNNFAxMF9NQVhfNHg0X1NBRAkJKDB4ZmZmZikKLSNkZWZpbmUgIEFSTV9WQ000UDEwX01BWF9NT0RFX1ZBTFVFICAgICAoMHhmZmZmZmZmZikKLSNkZWZpbmUgIEFSTV9WQ000UDEwX01BWF9NT0RFUyAgICAgICAgICAoMTYpCi0jZGVmaW5lICBBUk1fVkNNNFAxMF9NQl9CTE9DS19TSVpFICAgICAgKDE2KQotI2RlZmluZSAgQVJNX1ZDTTRQMTBfTUVESUFOKGEsYixjKSAgICAgIChhPmI/YT5jP2I+Yz9iOmM6YTpiPmM/YT5jP2E6YzpiKQotI2RlZmluZSAgQVJNX1ZDTTRQMTBfU0hJRlRfUVAgICAgICAgICAgICgxMikKLQotI2RlZmluZSAgQVJNX1ZDTTRQMTBfTVZQUkVEX01FRElBTiAgICAgICgwKQotI2RlZmluZSAgQVJNX1ZDTTRQMTBfTVZQUkVEX0wgICAgICAgICAgICgxKQotI2RlZmluZSAgQVJNX1ZDTTRQMTBfTVZQUkVEX1UgICAgICAgICAgICgyKQotI2RlZmluZSAgQVJNX1ZDTTRQMTBfTVZQUkVEX1VSICAgICAgICAgICgzKQotCi0jZGVmaW5lIEFSTV9WQ000UDEwX01CX0JMT0NLX1NJWkUgICAgICAgKDE2KQotI2RlZmluZSBBUk1fVkNNNFAxMF9CTE9DS19TSVpFICAgICAgICAgICg0KQotI2RlZmluZSBBUk1fVkNNNFAxMF9NQVhfQ09TVCAgICAgICAgICAgICgxIDw8IDMwKQotI2RlZmluZSAgQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSyAgICAgICgtMikKLQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0NhbGN1bGF0ZUJsb2NrU0FECi0gKgotICogRGVzY3JpcHRpb246Ci0gKiAgICBDYWxjdWxhdGUgU0FEIHZhbHVlIGZvciB0aGUgc2VsZWN0ZWQgTUIgZW5jb2RpbmcgbW9kZSBhbmQgdXBkYXRlIAotICogcERzdEJsb2NrU0FEIHBhcmFtZXRlci4gVGhlc2UgU0FEIHZhbHVlcyBhcmUgY2FsY3VsYXRlZCA0eDQgYmxvY2tzIGF0Ci0gKiBhIHRpbWUgYW5kIGluIHRoZSBzY2FuIG9yZGVyLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gcFNyY01CSW5mbyAgICAtIAotICogW2luXSBwU3JjQ3VyckJ1ZiAgIC0gCi0gKiBbaW5dIFNyY0N1cnJTdGVwICAgLSAKLSAqIFtpbl0gcFNyY1JlZkJ1Zkxpc3QtIAotICogW2luXSBTcmNSZWZTdGVwICAgIC0gCi0gKiBbaW5dIHBTcmNSZWNCdWYgICAgLSAKLSAqIFtpbl0gU3JjUmVjU3RlcCAgICAtIAotICogW2luXSBwUmVmUmVjdCAgICAgIC0gCi0gKiBbaW5dIHBDdXJyUG9pbnRQb3MgLSAKLSAqIFtpbl0gTGFtYmRhICAgICAgICAtIAotICogW2luXSBwTUVTcGVjICAgICAgIC0gCi0gKiBbaW5dIHBNQkludGVyICAgICAgLSAKLSAqIFtpbl0gcE1CSW50cmEgICAgICAtIAotICogW291dF0gcERzdEJsb2NrU0FEIC0gcG9pbnRlciB0byAxNiBlbGVtZW50IGFycmF5IGZvciBTQUQgY29ycmVzcG9uZGluZyB0byA0eDQgYmxvY2tzCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBOb25lCi0gKgotICovCi0KLXN0YXRpYyBPTVhSZXN1bHQgYXJtVkNNNFAxMF9DYWxjdWxhdGVCbG9ja1NBRCgKLQlPTVhWQ000UDEwTUJJbmZvICpwU3JjTUJJbmZvLCAKLSAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQlPTVhfUzMyIFNyY0N1cnJTdGVwLCAKLQljb25zdCBPTVhfVTggKnBTcmNSZWZCdWZMaXN0W0FSTV9WQ000UDEwX01BWF9GUkFNRVNdLAotCU9NWF9TMzIgU3JjUmVmU3RlcCwKLQljb25zdCBPTVhfVTggKnBTcmNSZWNCdWYsIAotCU9NWF9TMzIgU3JjUmVjU3RlcCwKLQljb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLQljb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAotCWNvbnN0IE9NWFZDTTRQMTBNQkluZm9QdHIgKnBNQkludGVyLCAKLQljb25zdCBPTVhWQ000UDEwTUJJbmZvUHRyICpwTUJJbnRyYSwKLQlPTVhfVTE2ICpwRHN0QmxvY2tTQUQpCi17Ci0JT01YX0lOVAkJSW52YWxpZFNBRCA9IDA7Ci0JT01YX0lOVAkJaTsKLQotCU9NWF9VOAkJQnVmZmVyIFsxNioxNiArIDE1XTsKLQlPTVhfVTgJCSpwVGVtcERzdEJ1ZjsKLQlPTVhfUzMyCQlUZW1wRHN0U3RlcDsKLQlPTVhfVTgJCSpwVGVtcFJlZkJ1ZjsKLQlPTVhfUzMyCQlUZW1wUmVmU3RlcDsgCi0KLQkvKiBUZW1wb3JhcnkgYnVmZmVyIHRvIHN0b3JlIHRoZSBwcmVkaWN0ZWQgbWIgY29lZmZpY2llbnRzICovCi0JcFRlbXBEc3RCdWYgPSBhcm1BbGlnblRvMTZCeXRlcyhCdWZmZXIpOwotCVRlbXBEc3RTdGVwID0gMTY7Ci0KLQkvKiBVcGRhdGUgcERzdEJsb2NrU0FEIGlmIE1CIGlzIGEgdmFsaWQgdHlwZSAqLwotCWlmIChwU3JjTUJJbmZvKQotCXsKLQkgICAgT01YX1UzMiAgICAgV2lkdGg9MCwgSGVpZ2h0PTAsIE1heFhQYXJ0LCBNYXhZUGFydCxNYXhTdWJYUGFydCxNYXhTdWJZUGFydDsKLQkgICAgCi0JCS8qIERlcGVuZGluZyBvbiB0eXBlIG9mIE1CLCBkbyBwcmVkaWN0aW9uIGFuZCBmaWxsIHRlbXAgYnVmZmVyICovCi0JCXN3aXRjaCAocFNyY01CSW5mby0+bWJUeXBlKQotCQl7Ci0JCWNhc2UgT01YX1ZDX1BfMTZ4MTY6Ci0JCQkJV2lkdGggPSAxNjsKLQkJCQlIZWlnaHQgPSAxNjsKLQkJCQlicmVhazsKLQkJY2FzZSBPTVhfVkNfUF8xNng4OgotCQkJCVdpZHRoID0gMTY7Ci0JCQkJSGVpZ2h0ID0gODsKLQkJCQlicmVhazsKLQkJY2FzZSBPTVhfVkNfUF84eDE2OgotCQkJCVdpZHRoID0gODsKLQkJCQlIZWlnaHQgPSAxNjsKLQkJCQlicmVhazsKLQkJY2FzZSBPTVhfVkNfUF84eDg6Ci0JCQkJV2lkdGggPSA4OwotCQkJCUhlaWdodCA9IDg7Ci0JCQkJYnJlYWs7Ci0JCWNhc2UgT01YX1ZDX0lOVFJBXzR4NDoKLQkJCXsKLQkJCQkvKiBDcmVhdGUgcHJlZGljdGVkIE1CIEludHJhNHg0IG1vZGUgKi8KLQkJCQlPTVhfUzMyICAgICBQcmVkSW50cmE0eDRNb2RlIFs1XVs5XTsKLQkJCQlPTVhfUzMyCQl4LCB5LCBCbG9jazh4OCwgQmxvY2s0eDQsIEJsb2NrWCwgQmxvY2tZOwotCQkJCU9NWF9VOCAgICAgIHBTcmNZQnVmZiBbKDE2KjMpKigxNioyKV07Ci0JCQkJT01YX1U4CQkqcFNyY1k7Ci0JCQkJT01YX1MzMiAgICAgU3RlcFNyY1k7Ci0JCQkJT01YX1MzMgkJYXZhaWxhYmlsaXR5OwotCi0JCQkJZm9yICh5ID0gMDsgeSA8IDU7IHkrKykKLQkJCQl7Ci0JCQkJCWZvciAoeCA9IDA7IHggPCA5OyB4KyspCi0JCQkJCXsKLQkJCQkJCS8qIAotCQkJCQkJICogSW5pdGlhbGl6ZSB3aXRoIHZhbHVlIG9mIEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0ssIHRvIG1lYW4gdGhpcyAKLQkJCQkJCSAqIDR4NCBibG9jayBpcyBub3QgYXZhaWxhYmxlIAotCQkJCQkJICovCi0JCQkJCQlQcmVkSW50cmE0eDRNb2RlIFt5XVt4XSA9IEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0s7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvKiBSZXBsYWNlIEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0sgdmFsdWUgd2l0aCBhdmFpbGFibGUgTUJzIHZhbHVlcyovCi0JCQkJZm9yICh4ID0gMDsgeCA8IDQ7IHgrKykKLQkJCQl7Ci0JCQkJCS8qIFN0b3JlIHZhbHVlcyBvZiBiMCwgYjEsIGIyLCBiMyAqLwotCQkJCQlpZiAocE1CSW50cmFbMV0gIT0gTlVMTCkKLQkJCQkJewotCQkJCQkJUHJlZEludHJhNHg0TW9kZSBbMF1beCArIDFdID0gCi0JCQkJCQkJcE1CSW50cmFbMV0tPnBJbnRyYTR4NFByZWRNb2RlWzMqNCArIHhdOyAgICAgICAgICAgIAotCQkJCQl9Ci0JCQkgICAgICAgIAotCQkJCQkvKiBTdG9yZSB2YWx1ZXMgb2YgZDAsIGQxLCBkMiwgZDMgKi8KLQkJCQkJaWYgKHBNQkludHJhWzNdICE9IE5VTEwpCi0JCQkJCXsKLQkJCQkJCVByZWRJbnRyYTR4NE1vZGUgWzBdW3ggKyA1XSA9IAotCQkJCQkJCXBNQkludHJhWzNdLT5wSW50cmE0eDRQcmVkTW9kZVszKjQgKyB4XTsKLQkJCQkJfQotCQkJCX0KLQkJICAgIAotCQkJCS8qIFN0b3JlIHZhbHVlcyBvZiBjMyAqLwotCQkJCWlmIChwTUJJbnRyYVsyXSAhPSBOVUxMKQotCQkJCXsKLQkJCQkJUHJlZEludHJhNHg0TW9kZSBbMF1bMF0gPSBwTUJJbnRyYVsyXS0+cEludHJhNHg0UHJlZE1vZGVbMTVdOwotCQkJCX0KLQkJICAgIAotCQkJCWZvciAoeSA9IDA7IHkgPCA0OyB5KyspCi0JCQkJewotCQkJCQkvKiBTdG9yZSB2YWx1ZXMgb2YgYTAsIGExLCBhMiwgYTMgKi8KLQkJCQkJaWYgKHBNQkludHJhWzBdICE9IE5VTEwpCi0JCQkJCXsKLQkJCQkJCVByZWRJbnRyYTR4NE1vZGUgW3kgKyAxXVswXSA9IAotCQkJCQkJCXBNQkludHJhWzBdLT5wSW50cmE0eDRQcmVkTW9kZVt5KjQgKyAzXTsKLQkJCQkJfQotCQkJCX0KLQkJICAgICAgICAKLQkJCQkvKgotCQkJCSAqIFVwZGF0ZSBuZWlnaGJvdXJpbmcgUHJlZCBtb2RlIGFycmF5IHdoaWNoIHdpbGwgYmUgdXNlZCBmb3IKLQkJCQkgKiBwcmVkaWN0aW9uIG9mIEludHJhNHg0IG1vZGVzLgotCQkJCSAqLwotCQkJICAgIAotCQkJCXBTcmNZID0gcFNyY1lCdWZmOwotCQkJCVN0ZXBTcmNZID0gMTYgKiAzOwotCQkJCWZvciAoeSA9IDA7IHkgPCAoMTYgKiAyKTsgeSsrKQotCQkJCXsKLQkJCQkJZm9yICh4ID0gMDsgeCA8ICgxNiAqIDMpOyB4KyspCi0JCQkJCXsKLQkJCQkJCXBTcmNZIFtTdGVwU3JjWSAqIHkgKyB4XSA9IAotCQkJCQkJCXBTcmNSZWNCdWYgW1NyY1JlY1N0ZXAgKiAoeSAtIDE2KSArIHggLSAxNl07Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJICAgIAotCQkJCS8qIGZvciBlYWNoIDh4OCBibG9jayAqLwotCQkJCWZvciAoQmxvY2s4eDggPSAwOyBCbG9jazh4OCA8IDQ7IEJsb2NrOHg4KyspCi0JCQkJewotCQkJCQkvKiBmb3IgZWFjaCA0eDQgYmxvY2sgaW5zaWRlIDh4OCBibG9jayAqLwotCQkJCQlmb3IgKEJsb2NrNHg0ID0gMDsgQmxvY2s0eDQgPCA0OyBCbG9jazR4NCsrKQotCQkJCQl7Ci0JCQkJCQkvKiBHZXQgYmxvY2sgY29yZGluYXRlcyBmcm9tIDh4OCBibG9jayBpbmRleCBhbmQgNHg0IGJsb2NrIGluZGV4ICovCi0JCQkJCQlCbG9ja1ggPSAoKEJsb2NrOHg4ICYgMSkgPDwgMSkgKyAoQmxvY2s0eDQgJiAxKTsKLQkJCQkJCUJsb2NrWSA9ICgoQmxvY2s4eDggPj4gMSkgPDwgMSkgKyAoQmxvY2s0eDQgPj4gMSk7Ci0JCQkJCSAgICAKLQkJCQkJCS8qIEFkZCBvZmZzZXQgdG8gcG9pbnQgdG8gc3RhcnQgb2YgY3VycmVudCBNQiBpbiB0aGUgYXJyYXkgcEludHJhNHg0UHJlZE1vZGUgKi8KLQkJCQkJCXggPSBCbG9ja1ggKyAxOwotCQkJCQkJeSA9IEJsb2NrWSArIDE7Ci0KLQkJCQkJCWF2YWlsYWJpbGl0eSA9IDA7Ci0KLQkJCQkJCS8qIENoZWNrIGZvciBhdmFpbGFiaWxpdHkgb2YgTEVGVCBCbG9jayAqLwotCQkJCQkJaWYgKFByZWRJbnRyYTR4NE1vZGUgW3ldW3ggLSAxXSAhPSBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLKQotCQkJCQkJewotCQkJCQkJCWF2YWlsYWJpbGl0eSB8PSBPTVhfVkNfTEVGVDsgICAgICAgIAotCQkJCQkJfQotCi0JCQkJCQkvKiBDaGVjayBmb3IgYXZhaWxhYmlsaXR5IG9mIFVQUEVSIEJsb2NrICovCi0JCQkJCQlpZiAoUHJlZEludHJhNHg0TW9kZSBbeSAtIDFdW3hdICE9IEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0spCi0JCQkJCQl7Ci0JCQkJCQkJYXZhaWxhYmlsaXR5IHw9IE9NWF9WQ19VUFBFUjsgICAgICAgIAotCQkJCQkJfQotCi0JCQkJCQkvKiBDaGVjayBmb3IgYXZhaWxhYmlsaXR5IG9mIFVQUEVSIExFRlQgQmxvY2sgKi8KLQkJCQkJCWlmIChQcmVkSW50cmE0eDRNb2RlIFt5IC0gMV1beCAtIDFdICE9IEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0spCi0JCQkJCQl7Ci0JCQkJCQkJYXZhaWxhYmlsaXR5IHw9IE9NWF9WQ19VUFBFUl9MRUZUOyAgICAgICAgCi0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCVByZWRJbnRyYTR4NE1vZGUgW3ldW3hdID0gcFNyY01CSW5mby0+cEludHJhNHg0UHJlZE1vZGVbQmxvY2tZKjQrQmxvY2tYXTsKLQkJCQkJCXggPSBCbG9ja1ggKiA0OwotCQkJCQkJeSA9IEJsb2NrWSAqIDQ7Ci0KLQkJCQkJCXBTcmNZID0gcFNyY1lCdWZmICsgMTYgKiBTdGVwU3JjWSArIDE2ICsgeSAqIFN0ZXBTcmNZICsgeDsKLQotCQkJCQkJb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0KAotCQkJCQkJCSBwU3JjWSAtIDEsCi0JCQkJCQkJIHBTcmNZIC0gU3RlcFNyY1ksCi0JCQkJCQkJIHBTcmNZIC0gU3RlcFNyY1kgLSAxLAotCQkJCQkJCSBwVGVtcERzdEJ1ZiArIHggKyB5ICogVGVtcERzdFN0ZXAsCi0JCQkJCQkJIFN0ZXBTcmNZLAotCQkJCQkJCSBUZW1wRHN0U3RlcCwKLQkJCQkJCQkgcFNyY01CSW5mby0+cEludHJhNHg0UHJlZE1vZGVbQmxvY2tZKjQrQmxvY2tYXSwKLQkJCQkJCQkgYXZhaWxhYmlsaXR5KTsKLQotCQkJCQkJZm9yIChCbG9ja1k9MDtCbG9ja1k8NDtCbG9ja1krKykKLQkJCQkJCXsKLQkJCQkJCQlmb3IoQmxvY2tYPTA7QmxvY2tYPDQ7QmxvY2tYKyspCi0JCQkJCQkJewotCQkJCQkJCQlwU3JjWSBbQmxvY2tZICogU3RlcFNyY1kgKyBCbG9ja1hdID0gCi0JCQkJCQkJCQkoT01YX1U4KSgqKHBUZW1wRHN0QnVmICsgeCArIHkgKiBUZW1wRHN0U3RlcCArIEJsb2NrWSAqIFRlbXBEc3RTdGVwICsgQmxvY2tYKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCWNhc2UgT01YX1ZDX0lOVFJBXzE2eDE2OgotCQkJewotCQkJCU9NWF9VMzIgICAgIE1CUG9zWCA9IHBDdXJyUG9pbnRQb3MtPnggPj4gNDsgICAgICAgIAotCQkJCU9NWF9VMzIgICAgIE1CUG9zWSA9IHBDdXJyUG9pbnRQb3MtPnkgPj4gNDsgICAgICAgIAotCQkJCU9NWF9VMzIJCWF2YWlsYWJpbGl0eSA9IDA7Ci0KLQkJCQkvKiBDaGVjayBmb3IgYXZhaWxhYmlsaXR5IG9mIExFRlQgTUIgKi8KLQkJCQlpZiAoKE1CUG9zWCAhPSAwKSAmJiAocE1CSW50cmEgWzBdICE9IDAgfHwgcE1CSW50ZXIgWzBdICE9IDApKQotCQkJCXsKLQkJCQkJYXZhaWxhYmlsaXR5IHw9IE9NWF9WQ19MRUZUOyAgICAgICAgCi0JCQkJfQotCi0JCQkJLyogQ2hlY2sgZm9yIGF2YWlsYWJpbGl0eSBvZiBVUCBNQiAqLwotCQkJCWlmICgoTUJQb3NZICE9IDApICYmIChwTUJJbnRyYSBbMV0gIT0gMCB8fCBwTUJJbnRlciBbMV0gIT0gMCkpCi0JCQkJewotCQkJCQlhdmFpbGFiaWxpdHkgfD0gT01YX1ZDX1VQUEVSOyAgICAgICAgCi0JCQkJfQotCi0JCQkJLyogQ2hlY2sgZm9yIGF2YWlsYWJpbGl0eSBvZiBVUC1MRUZUIE1CICovCi0JCQkJaWYgKChNQlBvc1ggPiAwKSAmJiAoTUJQb3NZID4gMCkgJiYgCi0JCQkJCShwTUJJbnRyYSBbMl0gIT0gMCB8fCBwTUJJbnRlciBbMl0gIT0gMCkpCi0JCQkJewotCQkJCQlhdmFpbGFiaWxpdHkgfD0gT01YX1ZDX1VQUEVSX0xFRlQ7ICAgICAgICAKLQkJCQl9Ci0KLQkJCQlvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNigKLQkJCQkJCXBTcmNSZWNCdWYgLSAxLCAKLQkJCQkJCXBTcmNSZWNCdWYgLSBTcmNSZWNTdGVwLCAKLQkJCQkJCXBTcmNSZWNCdWYgLSBTcmNSZWNTdGVwIC0gMSwgCi0JCQkJCQlwVGVtcERzdEJ1ZiwgCi0JCQkJCQlTcmNSZWNTdGVwLCAKLQkJCQkJCVRlbXBEc3RTdGVwLCAKLQkJCQkJCXBTcmNNQkluZm8tPkludHJhMTZ4MTZQcmVkTW9kZSwgCi0JCQkJCQlhdmFpbGFiaWxpdHkpOwotCQkJCQotCQkJCWJyZWFrOwotCQkJfQotCi0JCWNhc2UgT01YX1ZDX0lOVEVSX1NLSVA6Ci0JCWNhc2UgT01YX1ZDX1BSRUYwXzh4ODoKLQkJY2FzZSBPTVhfVkNfSU5UUkFfUENNOgotCQlkZWZhdWx0OgotCQkJLyogVGhlc2UgY2FzZXMgd2lsbCB1cGRhdGUgcERzdEJsb2NrU0FEIHdpdGggTUFYIHZhbHVlICovCi0JCQlJbnZhbGlkU0FEID0gMTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogSU5URVIgTUIgKi8KLQkJaWYgKChwU3JjTUJJbmZvLT5tYlR5cGUgPT0gT01YX1ZDX1BfMTZ4MTYpIHx8Ci0JCQkocFNyY01CSW5mby0+bWJUeXBlID09IE9NWF9WQ19QXzh4MTYpIHx8Ci0JCQkocFNyY01CSW5mby0+bWJUeXBlID09IE9NWF9WQ19QXzE2eDgpIHx8Ci0JCQkocFNyY01CSW5mby0+bWJUeXBlID09IE9NWF9WQ19QXzh4OCkpCi0JCXsKLSAgICAgICAgCWNvbnN0IE9NWF9VOAkJKnBUZW1wU3JjQnVmOwotICAgICAgICAJT01YX1MzMgkJVGVtcFNyY1N0ZXA7Ci0gICAgICAgIAlPTVhfUzMyCQltdngsbXZ5OwotICAgICAgICAJT01YX1UzMgkJUGFydFgsIFBhcnRZLCBTdWJQYXJ0WCwgU3ViUGFydFk7Ci0gICAgICAgIAkKLQkJCVRlbXBTcmNTdGVwID0gU3JjUmVmU3RlcDsKLQotCQkJTWF4WFBhcnQgPSAxNi9XaWR0aDsKLQkJCU1heFlQYXJ0ID0gMTYvSGVpZ2h0OwotCi0KLQkJCWZvciAoUGFydFkgPSAwOyBQYXJ0WSA8IE1heFlQYXJ0OyBQYXJ0WSsrKQotCQkJewotCQkJCWZvciAoUGFydFggPSAwOyBQYXJ0WCA8IE1heFhQYXJ0OyBQYXJ0WCsrKQotCQkJCXsKLQotCQkJCQlwVGVtcFNyY0J1ZiA9IHBTcmNSZWZCdWZMaXN0W3BTcmNNQkluZm8tPnBSZWZMMElkeFtQYXJ0WSAqIDIgKyBQYXJ0WF1dOwotCi0JCQkJCWlmIChNYXhYUGFydCA9PSAyICYmIE1heFlQYXJ0ID09IDIpCi0JCQkJCXsKLSAgICAgICAgCQkJCXN3aXRjaCAocFNyY01CSW5mby0+c3ViTUJUeXBlW1BhcnRZKjIrUGFydFhdKQotICAgICAgICAJCQkJewotICAgICAgICAJCQkJICAgIGNhc2UgT01YX1ZDX1NVQl9QXzh4ODoKLQkJCQkJCQkJV2lkdGggPSA4OwotCQkJCQkJCQlIZWlnaHQgPSA4OwotICAgICAgICAgICAgCQkJCSAgICBicmVhazsKLSAgICAgICAgCQkJCSAgICBjYXNlIE9NWF9WQ19TVUJfUF84eDQ6Ci0JCQkJCQkJCVdpZHRoID0gODsKLQkJCQkJCQkJSGVpZ2h0ID0gNDsKLSAgICAgICAgICAgIAkJCQkgICAgYnJlYWs7Ci0gICAgICAgIAkJCQkgICAgY2FzZSBPTVhfVkNfU1VCX1BfNHg4OgotCQkJCQkJCQlXaWR0aCA9IDQ7Ci0JCQkJCQkJCUhlaWdodCA9IDg7Ci0gICAgICAgICAgICAJCQkJICAgIGJyZWFrOwotICAgICAgICAJCQkJICAgIGNhc2UgT01YX1ZDX1NVQl9QXzR4NDoKLQkJCQkJCQkJV2lkdGggPSA0OwotCQkJCQkJCQlIZWlnaHQgPSA0OwotICAgICAgICAgICAgCQkJCSAgICBicmVhazsKLSAgICAgICAgCQkJCSAgICBkZWZhdWx0OgotCQkJCQkJCQkvKiBEZWZhdWx0ICovCi0JCQkJCQkJCVdpZHRoID0gNDsKLQkJCQkJCQkJSGVpZ2h0ID0gNDsKLSAgICAgICAgCQkJCSAgICBicmVhazsKLSAgICAgICAgCQkJCX0KLQkJCQkJCi0gICAgCQkJCSAgICBNYXhTdWJYUGFydCA9IDgvV2lkdGg7Ci0gICAgCQkJCSAgICBNYXhTdWJZUGFydCA9IDgvSGVpZ2h0OwotCi0JCQkJCQlmb3IgKFN1YlBhcnRZID0gMDsgU3ViUGFydFkgPCBNYXhTdWJZUGFydDsgU3ViUGFydFkrKykKLQkJCQkJCXsKLQkJCQkJCQlmb3IgKFN1YlBhcnRYID0gMDsgU3ViUGFydFggPCBNYXhTdWJYUGFydDsgU3ViUGFydFgrKykKLQkJCQkJCQl7Ci0JCQkJCQkJCW12eCA9IHBTcmNNQkluZm8tPnBNVjAgWzIqUGFydFkgKyBTdWJQYXJ0WV1bMipQYXJ0WCArIFN1YlBhcnRYXS5keDsKLQkJCQkJCQkJbXZ5ID0gcFNyY01CSW5mby0+cE1WMCBbMipQYXJ0WSArIFN1YlBhcnRZXVsyKlBhcnRYICsgU3ViUGFydFhdLmR5OwotCQkJCQkJCQlhcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEoCi0JCQkJCQkJCQlwVGVtcFNyY0J1ZiArICg4KlBhcnRYICsgNCpTdWJQYXJ0WCArIChtdngvNCkpICsgKDgqUGFydFkgKyA0KlN1YlBhcnRZICsgKG12eS80KSkgKiBUZW1wU3JjU3RlcCwKLQkJCQkJCQkJCVRlbXBTcmNTdGVwLAotCQkJCQkJCQkJcFRlbXBEc3RCdWYgKyAoOCpQYXJ0WCArIDQqU3ViUGFydFgpICsgKDgqUGFydFkgKyA0KlN1YlBhcnRZKSAqIFRlbXBEc3RTdGVwLAotCQkJCQkJCQkJVGVtcERzdFN0ZXAsCi0JCQkJCQkJCQlXaWR0aCwKLQkJCQkJCQkJCUhlaWdodCwKLQkJCQkJCQkJCW12eCAmIDMsCi0JCQkJCQkJCQltdnkgJiAzCi0JCQkJCQkJCQkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQotCQkJCQkJbXZ4ID0gcFNyY01CSW5mby0+cE1WMCBbMipQYXJ0WV1bMipQYXJ0WF0uZHg7Ci0JCQkJCQltdnkgPSBwU3JjTUJJbmZvLT5wTVYwIFsyKlBhcnRZXVsyKlBhcnRYXS5keTsKLQkJCQkJCWFybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYSgKLQkJCQkJCQlwVGVtcFNyY0J1ZiArICg4KlBhcnRYICsgKG12eC80KSkgKyAoOCpQYXJ0WSArIChtdnkvNCkpICogVGVtcFNyY1N0ZXAsCi0JCQkJCQkJVGVtcFNyY1N0ZXAsCi0JCQkJCQkJcFRlbXBEc3RCdWYgKyAoOCpQYXJ0WCkgKyAoOCpQYXJ0WSkgKiBUZW1wRHN0U3RlcCwKLQkJCQkJCQlUZW1wRHN0U3RlcCwKLQkJCQkJCQlXaWR0aCwKLQkJCQkJCQlIZWlnaHQsCi0JCQkJCQkJbXZ4ICYgMywKLQkJCQkJCQltdnkgJiAzCi0JCQkJCQkJKTsKLQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCUludmFsaWRTQUQgPSAxOwotCX0KLQotCS8qIENhbGN1bGF0ZSBTQUQgZnJvbSBwcmVkaWN0ZWQgYnVmZmVyICovCi0JaWYgKCFJbnZhbGlkU0FEKQotCXsKLQkgICAgT01YX1UzMiAgICAgeDh4OCwgeTh4OCwgeDR4NCwgeTR4NCwgQmxvY2s4eDgsIEJsb2NrNHg0OwotCSAgICBPTVhfUzMyICAgICBTQUQ7Ci0JICAgIAotCQlwVGVtcFJlZkJ1ZiA9IHBUZW1wRHN0QnVmOwotCQlUZW1wUmVmU3RlcCA9IDE2OwotCi0JCS8qIFNBRCBmb3IgZWFjaCA0eDQgYmxvY2sgaW4gc2NhbiBvcmRlciAqLwotCQlmb3IgKEJsb2NrOHg4ID0gMDsgQmxvY2s4eDggPCA0OyBCbG9jazh4OCsrKQotCQl7Ci0JCQl4OHg4ID0gOCooQmxvY2s4eDggJiAxKTsKLQkJCXk4eDggPSA4KihCbG9jazh4OCA+PiAxKTsKLQkJCWZvciAoQmxvY2s0eDQgPSAwOyBCbG9jazR4NCA8IDQ7IEJsb2NrNHg0KyspCi0JCQl7Ci0JCQkJeDR4NCA9IDQqKEJsb2NrNHg0ICYgMSk7Ci0JCQkJeTR4NCA9IDQqKEJsb2NrNHg0ID4+IDEpOwotCi0JCQkJYXJtVkNDT01NX1NBRCgJCi0JCQkJCXBTcmNDdXJyQnVmICsgKHg4eDggKyB4NHg0KSArICh5OHg4ICsgeTR4NCkgKiBTcmNDdXJyU3RlcCwgCi0JCQkJCVNyY0N1cnJTdGVwLAotCQkJCQlwVGVtcFJlZkJ1ZiArICh4OHg4ICsgeDR4NCkgKyAoeTh4OCArIHk0eDQpICogVGVtcFJlZlN0ZXAsCi0JCQkJCVRlbXBSZWZTdGVwLAotICAgIAkJCQkmU0FELAotICAgIAkJCQk0LCAvKiBIZWlnaHQgKi8KLSAgICAJCQkJNCk7IC8qIFdpZHRoICovCi0gICAgICAgICAgICAgICAgKihwRHN0QmxvY2tTQUQgKyA0ICogQmxvY2s4eDggKyBCbG9jazR4NCkgPSAoU0FEIDwgMHg3ZmZmKSA/IChPTVhfVTE2KSBTQUQgOiBBUk1fVkNNNFAxMF9NQVhfTU9ERV9WQUxVRTsgICAJCQkgICAgCi0gCQkJfQotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCS8qIEZpbGwgU0FEcyB3aXRoIG1heCB2YWx1ZXMgYW5kIHJldHVybiovCi0JCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotCQl7Ci0JCQlwRHN0QmxvY2tTQUQgW2ldID0gQVJNX1ZDTTRQMTBfTUFYXzR4NF9TQUQ7Ci0JCX0KLQl9Ci0JcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX01vZGU0eDREZWNpc2lvbgotICoKLSAqIERlc2NyaXB0aW9uOgotICogICAgSW50cmEgNHg0IE1vZGUgZGVjaXNpb24gYnkgY2FsY3VsYXRpbmcgY29zdCBmb3IgYWxsIHBvc3NpYmxlIG1vZGVzIGFuZAotICogY2hvb3NpbmcgdGhlIGJlc3QgbW9kZQotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gcFNyY0N1cnJCdWYgICAgLSBQb2ludGVyIHRvIHRoZSBzdGFydCBvZiBjdXJyZW50IE1hY3JvYmxvY2sKLSAqIFtpbl0gU3JjQ3VyclN0ZXAgLSBTdGVwIHNpemUgb2YgdGhlIHBvaW50ZXIgcFNyY0N1cnJCdWYKLSAqIFtpbi9vdXRdIHBTcmNEc3RNQkN1cnIgLSBQb2ludGVyIHRvIHRoZSBPTVhWQ000UDEwTUJJbmZvIHdoaWNoIHdpbGwgYmUgdXBkYXRlZCBmb3IKLSAqICAgICAgICAgICAgICAgICAgICBmaWVsZCBwSW50cmE0eDRQcmVkTW9kZSBvZiB0aGUgY3VycmVudCBibG9jay4KLSAqIFtpbl0gQmxvY2s4eDggICAgLSBJbmRleCA4eDggYmxvY2sgaW4gd2hpY2ggY3VycmVudCA0eDQgYmxvY2sgYmVsb25ncwotICogW2luXSBCbG9jazR4NCAgICAtIEluZGV4IG9mIGN1cnJlbnQgNHg0IGJsb2NrCi0gKiBbaW4vb3V0XSBwUHJlZEludHJhNHg0U3JjWSAtIFBvaW50ZXIgdG8gY3VycmVudCBibG9jayBsb2NhdGlvbiBpbiBidWZmZXIgCi0gKiAgICAgICAgICAgICAgICAgICAgd2l0aCByZWNvbnN0cnVjdGVkIHZhbHVlcy4gVGhpcyB3aWxsIGJlIG1vZGlmaWVkIGJ5IHRoaXMKLSAqICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB3aXRoIGJlc3QgbW9kZSBwcmVkaWN0ZWQgdmFsdWVzIAotICogW2luXSBTdGVwUHJlZEludHJhNHg0U3JjWSAgLSBTdGVwIHNpemUgb2YgdGhlIHBvaW50ZXIgcFByZWRJbnRyYTR4NFNyY1kKLSAqIFtpbl0gcEludHJhNHg0UHJlZE1vZGUgICAgIC0gQXJyYXkgb2YgSW50cmEgNHg0IHByZWRpY3Rpb24gbW9kZSBmb3IgdGhlIE1CLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW50IE1CIG1vZGVzIHN0YXJ0cyBhdCBbMSwxXS4KLSAqIFtpbl0gcEJlc3RDb3N0ICAgLSBDb3N0IGZvciB0aGUgQmVzdCBJbnRyYSA0eDQgbW9kZQotICogUmV0dXJuIFZhbHVlOgotICogTm9uZQotICoKLSAqLwotc3RhdGljIE9NWFZvaWQgYXJtVkNNNFAxMF9Nb2RlNHg0RGVjaXNpb24gKAotICAgIGNvbnN0IE9NWF9VOCogcFNyY0N1cnJCdWYsICAgCi0gICAgT01YX1MzMiBTcmNDdXJyU3RlcCwKLSAgICBPTVhWQ000UDEwTUJJbmZvICpwU3JjRHN0TUJDdXJyLAotICAgIE9NWF9TMzIgQmxvY2s4eDgsCi0gICAgT01YX1MzMiBCbG9jazR4NCwKLSAgICBPTVhfVTggICpwUHJlZEludHJhNHg0U3JjWSwKLSAgICBPTVhfUzMyIFN0ZXBQcmVkSW50cmE0eDRTcmNZLAotICAgIE9NWF9TMzIgcEludHJhNHg0UHJlZE1vZGUgW11bOV0sCi0gICAgT01YX1MzMiAqcEJlc3RDb3N0Ci0pCi17Ci0gICAgT01YX1MzMiAgICAgaSwgaiwgeCwgeSwgQmxvY2tYLCBCbG9ja1ksIG1vZGU7Ci0gICAgT01YX1MzMiAgICAgQ29zdCwgQmVzdENvc3Q7Ci0gICAgT01YX1U4ICAgICAgKnBTcmNZOwotICAgIE9NWF9TMzIgICAgIFN0ZXBTcmNZOwotICAgIE9NWF9TMzIgICAgIGF2YWlsYWJpbGl0eSA9IDA7Ci0gICAgT01YX1U4ICAgICAgcFByZWRCbG9jayBbNCo0XTsKLSAgICBPTVhSZXN1bHQgICBSZXQgPSBPTVhfU3RzX0VycjsKLQotICAgIC8qIEdldCBibG9jayBjb3JkaW5hdGVzIGZyb20gOHg4IGJsb2NrIGluZGV4IGFuZCA0eDQgYmxvY2sgaW5kZXggKi8KLSAgICBCbG9ja1ggPSAoKEJsb2NrOHg4ICYgMSkgPDwgMSkgKyAoQmxvY2s0eDQgJiAxKTsKLSAgICBCbG9ja1kgPSAoKEJsb2NrOHg4ID4+IDEpIDw8IDEpICsgKEJsb2NrNHg0ID4+IDEpOwotICAgIAotICAgIC8qIEFkZCBvZmZzZXQgdG8gcG9pbnQgdG8gc3RhcnQgb2YgY3VycmVudCBNQiBpbiB0aGUgYXJyYXkgcEludHJhNHg0UHJlZE1vZGUgKi8KLSAgICB4ID0gQmxvY2tYICsgMTsKLSAgICB5ID0gQmxvY2tZICsgMTsKLQotICAgIC8qIENoZWNrIGZvciBhdmFpbGFiaWxpdHkgb2YgTEVGVCBCbG9jayAqLwotICAgIGlmIChwSW50cmE0eDRQcmVkTW9kZSBbeV1beCAtIDFdICE9IEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0spCi0gICAgewotICAgICAgICBhdmFpbGFiaWxpdHkgfD0gT01YX1ZDX0xFRlQ7ICAgICAgICAKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBmb3IgYXZhaWxhYmlsaXR5IG9mIFVQUEVSIEJsb2NrICovCi0gICAgaWYgKHBJbnRyYTR4NFByZWRNb2RlIFt5IC0gMV1beF0gIT0gQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSykKLSAgICB7Ci0gICAgICAgIGF2YWlsYWJpbGl0eSB8PSBPTVhfVkNfVVBQRVI7ICAgICAgICAKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBmb3IgYXZhaWxhYmlsaXR5IG9mIFVQUEVSIExFRlQgQmxvY2sgKi8KLSAgICBpZiAocEludHJhNHg0UHJlZE1vZGUgW3kgLSAxXVt4IC0gMV0gIT0gQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSykKLSAgICB7Ci0gICAgICAgIGF2YWlsYWJpbGl0eSB8PSBPTVhfVkNfVVBQRVJfTEVGVDsgICAgICAgIAotICAgIH0KLQotICAgIHBTcmNZID0gcFByZWRJbnRyYTR4NFNyY1kgKyAKLSAgICAgICAgICAgIFN0ZXBQcmVkSW50cmE0eDRTcmNZICogKEJsb2NrWSA8PCAyKSArIAotICAgICAgICAgICAgKEJsb2NrWCA8PCAyKTsKLSAgICAgICAgICAgIAotICAgIFN0ZXBTcmNZID0gU3RlcFByZWRJbnRyYTR4NFNyY1k7Ci0gICAgICAgICAgICAgIAotICAgIHggPSBCbG9ja1ggKiA0OwotICAgIHkgPSBCbG9ja1kgKiA0OwotCi0gICAgQ29zdCA9IEJlc3RDb3N0ID0gQVJNX1ZDTTRQMTBfTUFYX0NPU1Q7Ci0gICAgCi0gICAgLyogR28gdGhyb3VnaCBlYWNoIG1vZGUgZm9yIG1pbmltIGNvc3QgKi8KLSAgICBmb3IgKG1vZGUgPSAwOyBtb2RlIDwgOTsgbW9kZSsrKQotICAgIHsKLSAgICAgICAgUmV0ID0gb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0KAotICAgICAgICAgICAgIHBTcmNZIC0gMSwKLSAgICAgICAgICAgICBwU3JjWSAtIFN0ZXBTcmNZLAotICAgICAgICAgICAgIHBTcmNZIC0gU3RlcFNyY1kgLSAxLAotICAgICAgICAgICAgIHBQcmVkQmxvY2ssCi0gICAgICAgICAgICAgU3RlcFNyY1ksCi0gICAgICAgICAgICAgNCwKLSAgICAgICAgICAgICAoT01YVkNNNFAxMEludHJhNHg0UHJlZE1vZGUpIG1vZGUsCi0gICAgICAgICAgICAgYXZhaWxhYmlsaXR5KTsKLSAgICAgICAgICAgICAKLSAgICAgICAgaWYgKFJldCA9PSBPTVhfU3RzX05vRXJyKQotICAgICAgICB7ICAgICAgICAgICAgCi0gICAgICAgICAgICBhcm1WQ0NPTU1fU0FEKCAgICAKLSAgICAgICAgICAgICAgICBwU3JjQ3VyckJ1ZiArICh5ICogU3JjQ3VyclN0ZXApICsgeCwKLSAgICAgICAgICAgICAgICBTcmNDdXJyU3RlcCwKLSAgICAgICAgICAgICAgICBwUHJlZEJsb2NrLAotICAgICAgICAgICAgICAgIDQsCi0gICAgICAgICAgICAgICAgJkNvc3QsCi0gICAgICAgICAgICAgICAgNCwKLSAgICAgICAgICAgICAgICA0KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKENvc3QgPCBCZXN0Q29zdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBCZXN0Q29zdCA9IENvc3Q7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcEludHJhNHg0UHJlZE1vZGUgW0Jsb2NrWSArIDFdW0Jsb2NrWCArIDFdID0gCi0gICAgICAgICAgICAgICAgICAgIChPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZSkgbW9kZTsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyci0+cEludHJhNHg0UHJlZE1vZGUgW0Jsb2NrWSAqIDQgKyBCbG9ja1hdID0gCi0gICAgICAgICAgICAgICAgICAgIChPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZSkgbW9kZTsKLQotICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwU3JjWSBbU3RlcFNyY1kgKiBqICsgaV0gPSBwUHJlZEJsb2NrIFs0ICogaiArIGldOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgKnBCZXN0Q29zdCA9IEJlc3RDb3N0OwotICAgIHJldHVybjsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9TZXRNb3Rpb25WZWN0b3JQcmVkaWN0b3IKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqICAgIFRoaXMgZnVuY3Rpb24gd2lsbCBkbyB0aGUgTVYgUHJlZGljdGlvbiBmb3IgSW50ZXIgTUJzCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gQmxvY2tTdGFydFggLSBTdGFydCBYIGluZGV4IGluIGludGVnZXIgcGVscyBpbiBjdXJyZW50IEJsb2NrCi0gKiBbaW5dIEJsb2NrU3RhcnRZIC0gU3RhcnQgWSBpbmRleCBpbiBpbnRlZ2VyIHBlbHMgaW4gY3VycmVudCBCbG9jawotICogW2luXSBCbG9ja1NpemVYICAtIFdpZHRoIG9mIGN1cnJlbnQgYmxvY2sKLSAqIFtpbl0gQmxvY2tTaXplWSAgLSBIZWlnaHQgb2YgY3VycmVudCBibG9jawotICogW2luXSBSZWZGcmFtZSAgICAtIEluZGV4IG9mIHRoZSByZWZlcmVuY2UgZnJhbWUgZm9yIHByZWRpY3Rpb24KLSAqIFtpbl0gcFJlZkZyQXJyICAgLSBQb2ludGVyIHRvIFJlZiBhcnJheSBzdG9yaW5nIG5laWdoYm91cmluZyBNVnMgZm9yIE1WIHByZWRpY3Rpb24KLSAqIFtpbl0gcE1WQXJyICAgICAgLSBQb2ludGVyIHRvIE1WIGFycmF5IHN0b3JpbmcgbmVpZ2hib3VyaW5nIE1WcyBmb3IgTVYgcHJlZGljdGlvbgotICogW291dF0gcE1WUHJlZCAgICAtIFBvaW50ZXIgdG8gcHJlZGljdGVkIE1WcwotICogUmVtYXJrczoKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBOb25lCi0gKgotICovCi1zdGF0aWMgT01YVm9pZCBhcm1WQ000UDEwX1NldE1vdGlvblZlY3RvclByZWRpY3RvcigKLSAgICBPTVhfVTMyIEJsb2NrU3RhcnRYLCAKLSAgICBPTVhfVTMyIEJsb2NrU3RhcnRZLAotICAgIE9NWF9VMzIgQmxvY2tTaXpleCwKLSAgICBPTVhfVTMyIEJsb2NrU2l6ZXksCi0gICAgT01YX1MzMiBSZWZGcmFtZSwKLSAgICBPTVhfUzMyIHBSZWZGckFycltdWzZdLCAKLSAgICBPTVhWQ01vdGlvblZlY3RvciBwTVZBcnJbXVsxMl0sCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBNVlByZWQKLSkKLXsKLSAgICBPTVhfUzMyICAgICBSRnJhbWVMOyAgICAgICAvKiBMZWZ0ICovCi0gICAgT01YX1MzMiAgICAgUkZyYW1lVTsgICAgICAgLyogVXAgKi8KLSAgICBPTVhfUzMyICAgICBSRnJhbWVVUjsgICAgICAvKiBVcC1SaWdodCAqLwotCi0gICAgT01YX1MzMiAgICAgQmxvY2tYLCBCbG9ja1ksIEJsb2NrWEZyLCBCbG9ja1lGciwgTVZQcmVkVHlwZTsKLSAgICBPTVhfUzMyICAgICBCbG9ja1hQbHVzT2ZmLCBCbG9ja1hQbHVzT2ZmRnIsIEJsb2NrWE1pbjFGciwgQmxvY2tZTWluMUZyOwotICAgIAotICAgIEJsb2NrWCA9IDQgKyAoQmxvY2tTdGFydFggPj4gMik7Ci0gICAgQmxvY2tZID0gNCArIChCbG9ja1N0YXJ0WSA+PiAyKTsgCi0gICAgQmxvY2tYUGx1c09mZiA9IEJsb2NrWCArIChCbG9ja1NpemV4ID4+IDIpOwotICAgIAotICAgIEJsb2NrWEZyID0gQmxvY2tYID4+IDE7ICAKLSAgICBCbG9ja1lGciA9IEJsb2NrWSA+PiAxOyAgCi0gICAgQmxvY2tYTWluMUZyID0gKEJsb2NrWCAtIDEpID4+IDE7ICAKLSAgICBCbG9ja1lNaW4xRnIgPSAoQmxvY2tZIC0gMSkgPj4gMTsgIAotICAgIEJsb2NrWFBsdXNPZmZGciA9IEJsb2NrWFBsdXNPZmYgPj4gMTsKLSAgICAKLSAgICBNVlByZWRUeXBlID0gQVJNX1ZDTTRQMTBfTVZQUkVEX01FRElBTjsKLQotICAgIFJGcmFtZUwgPSBwUmVmRnJBcnIgW0Jsb2NrWUZyXVtCbG9ja1hNaW4xRnJdOwotICAgIFJGcmFtZVUgPSBwUmVmRnJBcnIgW0Jsb2NrWU1pbjFGcl1bQmxvY2tYRnJdOwotICAgIFJGcmFtZVVSID0gcFJlZkZyQXJyIFtCbG9ja1lNaW4xRnJdW0Jsb2NrWFBsdXNPZmZGcl07Ci0KLSAgICBpZiAoUkZyYW1lVVIgPT0gQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSykKLSAgICB7Ci0gICAgICAgIFJGcmFtZVVSID0gcFJlZkZyQXJyIFtCbG9ja1lNaW4xRnJdW0Jsb2NrWE1pbjFGcl07Ci0gICAgfQotCi0gICAgLyogCi0gICAgICogUHJlZGljdGlvbiBpZiBvbmx5IG9uZSBvZiB0aGUgbmVpZ2hib3JzIHVzZXMgdGhlIHJlZmVyZW5jZSBmcmFtZQotICAgICAqIHdlIGFyZSBjaGVja2luZwotICAgICAqLwotICAKLSAgICBpZiAoUkZyYW1lTCA9PSBSZWZGcmFtZSAmJiBSRnJhbWVVICE9IFJlZkZyYW1lICYmIFJGcmFtZVVSICE9IFJlZkZyYW1lKQotICAgIHsKLSAgICAgICAgTVZQcmVkVHlwZSA9IEFSTV9WQ000UDEwX01WUFJFRF9MOwotICAgIH0KLSAgICBlbHNlIGlmKFJGcmFtZUwgIT0gUmVmRnJhbWUgJiYgUkZyYW1lVSA9PSBSZWZGcmFtZSAmJiBSRnJhbWVVUiAhPSBSZWZGcmFtZSkKLSAgICB7Ci0gICAgICAgIE1WUHJlZFR5cGUgPSBBUk1fVkNNNFAxMF9NVlBSRURfVTsKLSAgICB9Ci0gICAgZWxzZSBpZihSRnJhbWVMICE9IFJlZkZyYW1lICYmIFJGcmFtZVUgIT0gUmVmRnJhbWUgJiYgUkZyYW1lVVIgPT0gUmVmRnJhbWUpCi0gICAgewotICAgICAgICBNVlByZWRUeXBlID0gQVJNX1ZDTTRQMTBfTVZQUkVEX1VSOwotICAgIH0KLQotICAgIC8qIERpcmVjdGlvbmFsIHByZWRpY3Rpb25zICAqLwotICAgIGVsc2UgaWYoQmxvY2tTaXpleCA9PSA4ICYmIEJsb2NrU2l6ZXkgPT0gMTYpCi0gICAgewotICAgICAgICBpZihCbG9ja1N0YXJ0WCA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihSRnJhbWVMID09IFJlZkZyYW1lKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE1WUHJlZFR5cGUgPSBBUk1fVkNNNFAxMF9NVlBSRURfTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChSRnJhbWVVUiA9PSBSZWZGcmFtZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNVlByZWRUeXBlID0gQVJNX1ZDTTRQMTBfTVZQUkVEX1VSOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYoQmxvY2tTaXpleCA9PSAxNiAmJiBCbG9ja1NpemV5ID09IDgpCi0gICAgewotICAgICAgICBpZihCbG9ja1N0YXJ0WSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihSRnJhbWVVID09IFJlZkZyYW1lKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE1WUHJlZFR5cGUgPSBBUk1fVkNNNFAxMF9NVlBSRURfVTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKFJGcmFtZUwgPT0gUmVmRnJhbWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTVZQcmVkVHlwZSA9IEFSTV9WQ000UDEwX01WUFJFRF9MOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3dpdGNoIChNVlByZWRUeXBlKQotICAgIHsKLSAgICBjYXNlIEFSTV9WQ000UDEwX01WUFJFRF9NRURJQU46Ci0gICAgICAgIGlmICghKHBSZWZGckFyciBbQmxvY2tZTWluMUZyXVtCbG9ja1hNaW4xRnJdID09IEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0sgfHwgCi0gICAgICAgICAgICAgIHBSZWZGckFyciBbQmxvY2tZTWluMUZyXVtCbG9ja1hGcl0gPT0gQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSyB8fCAKLSAgICAgICAgICAgICAgcFJlZkZyQXJyIFtCbG9ja1lNaW4xRnJdW0Jsb2NrWFBsdXNPZmZGcl0gPT0gQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBNVlByZWQtPmR4ID0gcE1WQXJyIFtCbG9ja1ldW0Jsb2NrWCAtIDFdLmR4OwotICAgICAgICAgICAgcE1WUHJlZC0+ZHkgPSBwTVZBcnIgW0Jsb2NrWV1bQmxvY2tYIC0gMV0uZHk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwTVZQcmVkLT5keCA9IAotICAgICAgICAgICAgICAgIEFSTV9WQ000UDEwX01FRElBTihwTVZBcnIgW0Jsb2NrWV1bQmxvY2tYIC0gMV0uZHgsIAotICAgICAgICAgICAgICAgIHBNVkFyciBbQmxvY2tZIC0gMV1bQmxvY2tYXS5keCwgCi0gICAgICAgICAgICAgICAgcE1WQXJyIFtCbG9ja1kgLSAxXVtCbG9ja1hQbHVzT2ZmXS5keCk7Ci0gICAgICAgICAgICBwTVZQcmVkLT5keSA9IAotICAgICAgICAgICAgICAgIEFSTV9WQ000UDEwX01FRElBTihwTVZBcnIgW0Jsb2NrWV1bQmxvY2tYIC0gMV0uZHksIAotICAgICAgICAgICAgICAgIHBNVkFyciBbQmxvY2tZIC0gMV1bQmxvY2tYXS5keSwgCi0gICAgICAgICAgICAgICAgcE1WQXJyIFtCbG9ja1kgLSAxXVtCbG9ja1hQbHVzT2ZmXS5keSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIEFSTV9WQ000UDEwX01WUFJFRF9MOgotICAgICAgICBwTVZQcmVkLT5keCA9IHBNVkFyciBbQmxvY2tZXVtCbG9ja1ggLSAxXS5keDsKLSAgICAgICAgcE1WUHJlZC0+ZHkgPSBwTVZBcnIgW0Jsb2NrWV1bQmxvY2tYIC0gMV0uZHk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVJNX1ZDTTRQMTBfTVZQUkVEX1U6Ci0gICAgICAgIHBNVlByZWQtPmR4ID0gcE1WQXJyIFtCbG9ja1kgLSAxXVtCbG9ja1hdLmR4OwotICAgICAgICBwTVZQcmVkLT5keSA9IHBNVkFyciBbQmxvY2tZIC0gMV1bQmxvY2tYXS5keTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBUk1fVkNNNFAxMF9NVlBSRURfVVI6Ci0gICAgICAgIGlmIChwUmVmRnJBcnIgW0Jsb2NrWU1pbjFGcl1bQmxvY2tYUGx1c09mZkZyXSAhPSBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLKQotICAgICAgICB7Ci0gICAgICAgICAgICBwTVZQcmVkLT5keCA9IHBNVkFyciBbQmxvY2tZIC0gMV1bQmxvY2tYUGx1c09mZl0uZHg7Ci0gICAgICAgICAgICBwTVZQcmVkLT5keSA9IHBNVkFyciBbQmxvY2tZIC0gMV1bQmxvY2tYUGx1c09mZl0uZHk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwTVZQcmVkLT5keCA9IHBNVkFyciBbQmxvY2tZIC0gMV1bQmxvY2tYIC0gMV0uZHg7Ci0gICAgICAgICAgICBwTVZQcmVkLT5keSA9IHBNVkFyciBbQmxvY2tZIC0gMV1bQmxvY2tYIC0gMV0uZHk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIAotICAgIHJldHVybjsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9CbG9ja01vdGlvblNlYXJjaAotICoKLSAqIERlc2NyaXB0aW9uOgotICogICAgR2V0cyBiZXN0IE1WIGZvciB0aGUgY3VycmVudCBibG9jawotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHBTcmNDdXJyQnVmICAgIC0gUG9pbnRlciB0byB0aGUgc3RhcnQgb2YgbHVtYSBjb21wb25lbnQgb2YgY3VycmVudCBNYWNyb2Jsb2NrIAotICogW2luXSBTcmNDdXJyU3RlcCAtIFN0ZXAgc2l6ZSBmb3IgdGhlIHBvaW50ZXIgcFNyY0N1cnJCdWYgCi0gKiBbaW5dIHBTcmNSZWZZICAgIC0gUG9pbnRlciB0byB0aGUgc3RhcnQgb2YgbHVtYSBjb21wb25lbnQgb2YgY28tbG9jYXRlZCByZWZlcmVuY2UgTUIKLSAqIFtpbl0gblNyY1JlZlN0ZXAgLSBTdGVwIHNpemUgZm9yIHRoZSBwb2ludGVyIHBTcmNSZWZZIAotICogW2luXSBwUmVmUmVjdCAgIFBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSByZWN0YW5nbGU7IHJlbGF0aXZlIHRvIHRoZSBpbWFnZSBvcmlnaW4uCi0gKiBbaW5dIHBDdXJyUG9pbnRQb3MgICBQb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lLgotICogW2luXSBwTUVTcGVjICAgICAtIE1vdGlvbiBlc3RpbWF0aW9uIHN0cnVjdHVyZQotICogW2luXSBwTUJJbnRlciAgICAtIEFycmF5LCBvZiBkaW1lbnNpb24gZm91ciwgY29udGFpbmluZyBwb2ludGVycyB0byBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggZm91cgotICogICAgICAgICAgICAgICAgICAgIGFkamFjZW50IHR5cGUgSU5URVIgTUJzIChMZWZ0LCBUb3AsIFRvcC1MZWZ0LCBUb3AtUmlnaHQpLiAKLSAqIFtpbl0gbkxhbWRhICAgICAgLSBGb3IgY2FsY3VsYXRpbmcgdGhlIGNvc3QKLSAqIFtvdXRdIHBCZXN0Q29zdCAgLSBNaW5pbXVtIGNvc3QgZm9yIGVuY29kaW5nIGN1cnJlbnQgYmxvY2sgCi0gKiBbb3V0XSBwQmVzdE1WICAgIC0gTVYgY29ycmVzcG9uZGluZyB0byBiZXN0IGNvc3QKLSAqIFtpbl0gQmxvY2tTdGFydFggLSBCbG9jayBzdGFydCBYIGluZGV4IGluIGludGVnZXIgcGVscwotICogW2luXSBCbG9ja1N0YXJ0WSAtIEJsb2NrIHN0YXJ0IFkgaW5kZXggaW4gaW50ZWdlciBwZWxzCi0gKiBbaW5dIEJsb2NrU2l6ZVggIC0gV2lkdGggb2YgY3VycmVudCBibG9jawotICogW2luXSBCbG9ja1NpemVZICAtIEhlaWdodCBvZiBjdXJyZW50IGJsb2NrCi0gKiBbaW5dIFJlZkZyYW1lICAgIC0gSW5kZXggb2YgdGhlIHJlZmVyZW5jZSBmcmFtZSBmb3IgcHJlZGljdGlvbgotICogW2luXSBwUmVmRnJBcnIgICAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGZyYW1lIGFycmF5IHN0b3JpbmcgbmVpZ2hib3VyaW5nIE1WcyBmb3IgcHJlZGljdGlvbgotICogW2luXSBwTVZBcnIgICAgICAtIFBvaW50ZXIgdG8gTVYgYXJyYXkgc3RvcmluZyBuZWlnaGJvdXJpbmcgTVZzIGZvciBNViBwcmVkaWN0aW9uCi0gKiBbaW5dIHBNVlByZWQgICAgIC0gUG9pbnRlciB0byBNViBwcmVkaWN0ZWQgZnJvbSBuZWlnaGJvdXIgTVZzCi0gKiBSZW1hcmtzOgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWFJlc3VsdAotICoKLSAqLwotc3RhdGljIE9NWFJlc3VsdCBhcm1WQ000UDEwX0Jsb2NrTW90aW9uU2VhcmNoKAotICAgIGNvbnN0IE9NWF9VOCogcFNyY0N1cnJCdWYsIAotICAgIE9NWF9TMzIgU3JjQ3VyclN0ZXAsIAotICAgIGNvbnN0IE9NWF9VOCogcFNyY1JlZlksIAotICAgIE9NWF9TMzIgblNyY1JlZlN0ZXAsIAotCWNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotCWNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCi0gICAgdm9pZCogcE1FU3BlYywgCi0KLSAgICBPTVhfUzMyIG5MYW1kYSwKLSAgICBPTVhfUzMyKiBwQmVzdENvc3QsIAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwQmVzdE1WLAotICAgIAotICAgIE9NWF9VMzIgQmxvY2tTdGFydFgsIAotICAgIE9NWF9VMzIgQmxvY2tTdGFydFksCi0gICAgT01YX1UzMiBCbG9ja1NpemVYLAotICAgIE9NWF9VMzIgQmxvY2tTaXplWSwKLSAgICBPTVhfUzMyIFJlZkZyYW1lLAotICAgIE9NWF9TMzIgcFJlZkZyQXJyIFtdWzZdLCAKLSAgICBPTVhWQ01vdGlvblZlY3RvciBwTVZBcnIgW11bMTJdLAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwTVZQcmVkCi0gICApCi17Ci0KLSAgICBPTVhWQ01vdGlvblZlY3RvciAgIE1WQ2FsY3VsYXRlZCwgTVZDYW5kaWRhdGU7Ci0gICAgT01YX1MzMiAgICAgICAgICAgICBDb3N0OwotICAgIE9NWFJlc3VsdCAgICAgICAgICAgUmV0VmFsdWU7Ci0gICAgT01YVkNNNFAxME1FUGFyYW1zICAqcE1FUGFyYW1zOyAgICAKLQlPTVhWQ000UDJDb29yZGluYXRlIEN1cnJCbG9ja1BvczsKLQotICAgIC8qIEdldCBQcmVkaWN0ZWQgTW90aW9uIFZlY3RvcnMgKi8KLSAgICBhcm1WQ000UDEwX1NldE1vdGlvblZlY3RvclByZWRpY3RvciAoCi0gICAgICAgIEJsb2NrU3RhcnRYLCAKLSAgICAgICAgQmxvY2tTdGFydFksCi0gICAgICAgIEJsb2NrU2l6ZVgsIAotICAgICAgICBCbG9ja1NpemVZLAotICAgICAgICBSZWZGcmFtZSwKLSAgICAgICAgcFJlZkZyQXJyLCAgIAotICAgICAgICBwTVZBcnIsICAgICAgCi0gICAgICAgIHBNVlByZWQpOwotCi0gICAgLyogSW5pdGlhbGl6ZSBjYW5kaWRhdGUgTVYgKi8KLSAgICBNVkNhbmRpZGF0ZS5keCA9IDA7Ci0gICAgTVZDYW5kaWRhdGUuZHkgPSAwOwotICAgIAotICAgIEN1cnJCbG9ja1Bvcy54ID0gcEN1cnJQb2ludFBvcy0+eCArIEJsb2NrU3RhcnRYOwotICAgIEN1cnJCbG9ja1Bvcy55ID0gcEN1cnJQb2ludFBvcy0+eSArIEJsb2NrU3RhcnRZOwotCi0gICAgLyogQmxvY2sgTWF0Y2ggSW50ZWdlciAqLwotICAgIFJldFZhbHVlID0gb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIgKAotICAgICAgICBwU3JjQ3VyckJ1ZiwgCi0gICAgICAgIFNyY0N1cnJTdGVwLCAKLSAgICAgICAgcFNyY1JlZlksIAotICAgICAgICBuU3JjUmVmU3RlcCwgCi0gICAgICAgIHBSZWZSZWN0LCAKLSAgICAgICAgJkN1cnJCbG9ja1BvcywgCi0gICAgICAgIEJsb2NrU2l6ZVgsIAotICAgICAgICBCbG9ja1NpemVZLCAKLSAgICAgICAgbkxhbWRhLCAKLSAgICAgICAgcE1WUHJlZCwgCi0gICAgICAgICZNVkNhbmRpZGF0ZSwgCi0gICAgICAgICZNVkNhbGN1bGF0ZWQsIAotICAgICAgICAmQ29zdCwgCi0gICAgICAgIHBNRVNwZWMpOwotICAgIAotICAgIC8qIHVwZGF0ZWQgQmVzdE1WKi8KLSAgICAvKipwQmVzdENvc3QgPSBDb3N0OwotICAgIHBCZXN0TVYtPmR4ID0gTVZDYWxjdWxhdGVkLmR4OwotICAgIHBCZXN0TVYtPmR5ID0gTVZDYWxjdWxhdGVkLmR5OyovCi0KLSAgICBwTUVQYXJhbXMgPSAoT01YVkNNNFAxME1FUGFyYW1zICopIHBNRVNwZWM7Ci0gICAgCi0gICAgLyogQmxvY2sgTWF0Y2ggSGFsZiBwZWwgKi8KLSAgICBpZiAocE1FUGFyYW1zLT5oYWxmU2VhcmNoRW5hYmxlKQotICAgIHsKLSAgICAgICAgUmV0VmFsdWUgPSBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZigKLSAgICAgICAgICAgIHBTcmNDdXJyQnVmLCAKLSAgICAgICAgICAgIFNyY0N1cnJTdGVwLCAKLSAgICAgICAgICAgIHBTcmNSZWZZLCAKLSAgICAgICAgICAgIG5TcmNSZWZTdGVwLCAKLSAgICAgICAgICAgIEJsb2NrU2l6ZVgsIAotICAgICAgICAgICAgQmxvY2tTaXplWSwgCi0gICAgICAgICAgICBuTGFtZGEsIAotICAgICAgICAgICAgcE1WUHJlZCwgCi0gICAgICAgICAgICAmTVZDYWxjdWxhdGVkLCAgICAgICAgLyogaW5wdXQvb3V0cHV0Ki8KLSAgICAgICAgICAgICZDb3N0KTsKLSAgICB9Ci0KLSAgICAvKiBCbG9jayBNYXRjaCBRdWFydGVyIHBlbCAqLwotICAgIGlmIChwTUVQYXJhbXMtPnF1YXJ0ZXJTZWFyY2hFbmFibGUpCi0gICAgewotICAgICAgICBSZXRWYWx1ZSA9IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyKAotICAgICAgICAgICAgcFNyY0N1cnJCdWYsIAotICAgICAgICAgICAgU3JjQ3VyclN0ZXAsIAotICAgICAgICAgICAgcFNyY1JlZlksIAotICAgICAgICAgICAgblNyY1JlZlN0ZXAsIAotICAgICAgICAgICAgQmxvY2tTaXplWCwgCi0gICAgICAgICAgICBCbG9ja1NpemVZLCAKLSAgICAgICAgICAgIG5MYW1kYSwgCi0gICAgICAgICAgICBwTVZQcmVkLCAKLSAgICAgICAgICAgICZNVkNhbGN1bGF0ZWQsIAotICAgICAgICAgICAgJkNvc3QpOwotICAgIH0KLQotICAgIC8qIHVwZGF0ZWQgQmVzdCBDb3N0IGFuZCBCZXN0IE1WICovCi0gICAgKnBCZXN0Q29zdCA9IENvc3Q7Ci0gICAgcEJlc3RNVi0+ZHggPSBNVkNhbGN1bGF0ZWQuZHg7Ci0gICAgcEJlc3RNVi0+ZHkgPSBNVkNhbGN1bGF0ZWQuZHk7Ci0KLSAgICAvKgotICAgICAqIFNraXAgTUIgY29zdCBjYWxjdWxhdGlvbnMgb2YgMTZ4MTYgaW50ZXIgbW9kZQotICAgICAqLwotICAgIHJldHVybiBSZXRWYWx1ZTsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9QYXJ0aXRpb25NRQotICoKLSAqIERlc2NyaXB0aW9uOgotICogICAgR2V0cyBiZXN0IGNvc3QgZm9yIHRoZSBjdXJyZW50IHBhcnRpdGlvbgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHBTcmNDdXJyQnVmICAgIC0gUG9pbnRlciB0byB0aGUgc3RhcnQgb2YgbHVtYSBjb21wb25lbnQgb2YgY3VycmVudCBNYWNyb2Jsb2NrIAotICogW2luXSBTcmNDdXJyU3RlcCAtIFN0ZXAgc2l6ZSBmb3IgdGhlIHBvaW50ZXIgcFNyY0N1cnJCdWYgCi0gKiBbaW5dIHBTcmNSZWZCdWZMaXN0ICAgIC0gUG9pbnRlciB0byBMaXN0IG9mIHJlZiBidWZmZXIgb2YgY28tbG9jYXRlZCByZWZlcmVuY2UgTUIKLSAqIFtpbl0gblNyY1JlZlN0ZXAgLSBTdGVwIHNpemUgZm9yIHRoZSBwb2ludGVyIHBTcmNSZWZZIAotICogW2luXSBwUmVmUmVjdCAgIFBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSByZWN0YW5nbGU7IHJlbGF0aXZlIHRvIHRoZSBpbWFnZSBvcmlnaW4uCi0gKiBbaW5dIHBDdXJyUG9pbnRQb3MgICBQb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lLgotICogW2luXSBwTUVTcGVjICAgICAtIE1vdGlvbiBlc3RpbWF0aW9uIHN0cnVjdHVyZQotICogW2luXSBQYXJ0V2lkdGggICAtIFdpZHRoIG9mIGN1cnJlbnQgcGFydGl0aW9uCi0gKiBbaW5dIFBhcnRIZWlnaHQgIC0gSGVpZ2h0IG9mIGN1cnJlbnQgcGFydGl0aW9uCi0gKiBbaW5dIEJsb2NrV2lkdGggIC0gV2lkdGggb2YgY3VycmVudCBibG9jawotICogW2luXSBCbG9ja0hlaWdodCAtIEhlaWdodCBvZiBjdXJyZW50IGJsb2NrCi0gKiBbaW5dIFBhcnRTdGFydFggIC0gUGFydGl0aW9uIHN0YXJ0IFggaW5kZXggaW4gaW50ZWdlciBwZWxzCi0gKiBbaW5dIFBhcnRTdGFydFkgIC0gUGFydGl0aW9uIHN0YXJ0IFkgaW5kZXggaW4gaW50ZWdlciBwZWxzCi0gKiBbaW5dIHBNVkFyciAgICAgIC0gUG9pbnRlciB0byBNViBhcnJheSBzdG9yaW5nIG5laWdoYm91cmluZyBNVnMgZm9yIE1WIHByZWRpY3Rpb24KLSAqIFtpbl0gcFJlZkZyQXJyICAgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBmcmFtZSBhcnJheSBzdG9yaW5nIG5laWdoYm91cmluZyBNVnMgZm9yIHByZWRpY3Rpb24KLSAqIFtpbl0gTGFtYmRhICAgICAgLSBGb3IgY2FsY3VsYXRpbmcgdGhlIGNvc3QKLSAqIFtvdXRdIHBDb3N0ICAgICAgLSBQb2ludGVyIHRvIGNvc3QgZm9yIEludGVyIE1CCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YUmVzdWx0Ci0gKgotICovCi1zdGF0aWMgT01YUmVzdWx0IGFybVZDTTRQMTBfUGFydGl0aW9uTUUgKAotICAgIGNvbnN0IE9NWF9VOCogcFNyY0N1cnJCdWYsICAgCi0gICAgT01YX1MzMiBTcmNDdXJyU3RlcCwKLQljb25zdCBPTVhfVTggKnBTcmNSZWZCdWZMaXN0W0FSTV9WQ000UDEwX01BWF9GUkFNRVNdLAotCU9NWF9TMzIgU3JjUmVmU3RlcCwKLQljb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLQljb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAotICAgIHZvaWQqIHBNRVNwZWMsIAotCi0gICAgT01YX1MzMiBQYXJ0V2lkdGgsCi0gICAgT01YX1MzMiBQYXJ0SGVpZ2h0LAotICAgIE9NWF9TMzIgQmxvY2tXaWR0aCwKLSAgICBPTVhfUzMyIEJsb2NrSGVpZ2h0LAotICAgIE9NWF9TMzIgUGFydFN0YXJ0WCwgCi0gICAgT01YX1MzMiBQYXJ0U3RhcnRZLAotCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgcE1WQXJyIFtdWzEyXSwKLSAgICBPTVhfUzMyIHBSZWZGckFyciBbXVs2XSwKLSAgICBPTVhWQ01vdGlvblZlY3RvciBwTVZQcmVkQXJyIFtdWzRdLAotCi0gICAgT01YX1MzMiBMYW1iZGEsCi0gICAgT01YX1MzMiAqcENvc3QKLSkKLXsKLSAgICBPTVhfVTMyICAgICB4LCB5LCBpLCBqLCByZWYsIE9mZlgsIE9mZlksIE9mZlNyYywgT2ZmUmVmOwotICAgIE9NWF9TMzIgICAgIEJsb2NrQ29zdCwgUGFydGl0aW9uQ29zdCwgQmVzdENvc3Q7Ci0gICAgT01YX1MzMiAgICAgQmVzdFJlZkZyYW1lPTA7Ci0gICAgT01YVkNNb3Rpb25WZWN0b3IgICBCZXN0TVYgWzRdWzRdOwotICAgIE9NWFZDTW90aW9uVmVjdG9yICAgQmVzdE1WUHJlZCBbNF1bNF07Ci0gICAgT01YVkNNb3Rpb25WZWN0b3IgICBNVlByZWQ7Ci0gICAgT01YVkNNb3Rpb25WZWN0b3IgICBEc3RNVjsKLQotICAgIEJlc3RDb3N0ID0gQVJNX1ZDTTRQMTBfTUFYX0NPU1Q7Ci0gICAgCi0gICAgZm9yIChyZWYgPSAwOyByZWYgPCBBUk1fVkNNNFAxMF9NQVhfRlJBTUVTOyByZWYrKykKLSAgICB7Ci0gICAgICAgIGlmIChwU3JjUmVmQnVmTGlzdCBbcmVmXSA9PSBOVUxMKQotICAgICAgICB7Ci0gICAgICAgIAkvKiBObyByZWZlcmVuY2UgZnJhbWUsIGNvbnRpbnVlICovCi0gICAgICAgIAljb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIFBhcnRpdGlvbkNvc3QgPSAwOwotICAgICAgICAKLSAgICAgICAgZm9yICh5ID0gMDsgeSA8IFBhcnRIZWlnaHQ7IHkgKz0gQmxvY2tIZWlnaHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBQYXJ0V2lkdGg7IHggKz0gQmxvY2tXaWR0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIAlPZmZTcmMgPSBTcmNDdXJyU3RlcCAqIChQYXJ0U3RhcnRZICsgeSkgKyBQYXJ0U3RhcnRYICsgeDsKLSAgICAgICAgICAgIAlPZmZSZWYgPSBTcmNSZWZTdGVwICogKFBhcnRTdGFydFkgKyB5KSArIFBhcnRTdGFydFggKyB4OwotICAgICAgICAgICAgICAgIGFybVZDTTRQMTBfQmxvY2tNb3Rpb25TZWFyY2ggKAotICAgICAgICAgICAgICAgICAgICBwU3JjQ3VyckJ1ZiArIE9mZlNyYywgCi0gICAgICAgICAgICAgICAgICAgIFNyY0N1cnJTdGVwLCAKLSAgICAgICAgICAgICAgICAgICAgcFNyY1JlZkJ1Zkxpc3QgW3JlZl0gKyBPZmZSZWYsIAotICAgICAgICAgICAgICAgICAgICBTcmNSZWZTdGVwLCAKLSAgICAgICAgICAgICAgICAgICAgcFJlZlJlY3QsCi0gICAgICAgICAgICAgICAgICAgIHBDdXJyUG9pbnRQb3MsCi0gICAgICAgICAgICAgICAgICAgIHBNRVNwZWMsIAotCi0gICAgICAgICAgICAgICAgICAgIExhbWJkYSwKLSAgICAgICAgICAgICAgICAgICAgJkJsb2NrQ29zdCwgCi0gICAgICAgICAgICAgICAgICAgICZEc3RNViwKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHggKyBQYXJ0U3RhcnRYLCAKLSAgICAgICAgICAgICAgICAgICAgeSArIFBhcnRTdGFydFksCi0gICAgICAgICAgICAgICAgICAgIEJsb2NrV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgIEJsb2NrSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICByZWYsCi0gICAgICAgICAgICAgICAgICAgIHBSZWZGckFyciwgCi0gICAgICAgICAgICAgICAgICAgIHBNVkFyciwKLSAgICAgICAgICAgICAgICAgICAgJk1WUHJlZCk7Ci0KLSAgICAgICAgICAgICAgICBQYXJ0aXRpb25Db3N0ICs9IEJsb2NrQ29zdDsKLQkJCQkKLQkJCQlPZmZYID0gKFBhcnRTdGFydFggKyB4KSA+PiAyOwotCQkJCU9mZlkgPSAoUGFydFN0YXJ0WSArIHkpID4+IDI7Ci0JCQkJCi0JICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IChCbG9ja0hlaWdodCA+PiAyKTsgaisrKQotCSAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IChCbG9ja1dpZHRoID4+IDIpOyBpKyspCi0JICAgICAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgICAgICAgIHBNVkFyciBbNCArIE9mZlkgKyBqXVs0ICsgT2ZmWCArIGldLmR4ID0gRHN0TVYuZHg7Ci0JICAgICAgICAgICAgICAgICAgICBwTVZBcnIgWzQgKyBPZmZZICsgal1bNCArIE9mZlggKyBpXS5keSA9IERzdE1WLmR5OwotCSAgICAgICAgICAgICAgICAgICAgcE1WUHJlZEFyciBbT2ZmWSArIGpdW09mZlggKyBpXS5keCA9IE1WUHJlZC5keDsKLQkgICAgICAgICAgICAgICAgICAgIHBNVlByZWRBcnIgW09mZlkgKyBqXVtPZmZYICsgaV0uZHkgPSBNVlByZWQuZHk7Ci0JICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICB9Ci0KLQkJCQlwUmVmRnJBcnIgWzIgKyAoT2ZmWSA+PiAxKV1bMiArIChPZmZYID4+IDEpXSA9IHJlZjsKLQkgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgKEJsb2NrSGVpZ2h0ID4+IDMpOyBqKyspCi0JICAgICAgICAgICAgewotCSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKEJsb2NrV2lkdGggPj4gMyk7IGkrKykKLQkgICAgICAgICAgICAgICAgewotCQkJICAgICAgICAgICAgcFJlZkZyQXJyIFsyICsgKE9mZlkgPj4gMSkgKyBqXVsyICsgKE9mZlggPj4gMSkgKyBpXSA9IHJlZjsKLQkgICAgICAgICAgICAgICAgfQotCSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQkJLyoKLQkJICogSWYgUGFydGl0aW9uQ29zdCBpcyBsZXNzIGZvciB0aGlzIHJlZmVyZW5jZSBmcmFtZSwgbW90aW9uIHZlY3RvcnMgbmVlZHMgdG8gYmUgYmFja2VkdXAKLQkJICovCi0gICAgICAgIGlmIChQYXJ0aXRpb25Db3N0IDw9IEJlc3RDb3N0KQotICAgICAgICB7Ci0gICAgICAgICAgICBCZXN0Q29zdCA9IFBhcnRpdGlvbkNvc3Q7ICAgICAgICAgICAgCi0gICAgICAgICAgICBCZXN0UmVmRnJhbWUgPSByZWY7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCAoUGFydEhlaWdodC9CbG9ja0hlaWdodCk7IHkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgKFBhcnRXaWR0aC9CbG9ja1dpZHRoKTsgeCsrKQotICAgICAgICAgICAgICAgIHsKLQkJCQkJT2ZmWCA9IChQYXJ0U3RhcnRYICsgeCAqIEJsb2NrV2lkdGgpID4+IDI7Ci0JCQkJCU9mZlkgPSAoUGFydFN0YXJ0WSArIHkgKiBCbG9ja0hlaWdodCkgPj4gMjsKLQkJCQkKLSAgICAgICAgICAgICAgICAgICAgQmVzdE1WW3ldW3hdLmR4ID0gcE1WQXJyIFs0ICsgT2ZmWV1bNCArIE9mZlhdLmR4OwotICAgICAgICAgICAgICAgICAgICBCZXN0TVZbeV1beF0uZHkgPSBwTVZBcnIgWzQgKyBPZmZZXVs0ICsgT2ZmWF0uZHk7Ci0gICAgICAgICAgICAgICAgICAgIEJlc3RNVlByZWRbeV1beF0uZHggPSBwTVZQcmVkQXJyIFtPZmZZXVtPZmZYXS5keDsKLSAgICAgICAgICAgICAgICAgICAgQmVzdE1WUHJlZFt5XVt4XS5keSA9IHBNVlByZWRBcnIgW09mZlldW09mZlhdLmR5OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0JLyoKLQkgKiBDb3B5IGJhY2sgYmVzdCByZWZlcmVuY2UgZnJhbWUsIG1vdGlvbiB2ZWN0b3JzIGFuZCBjb3N0LgotCSAqLwotICAgIGZvciAoeSA9IDA7IHkgPCAoUGFydEhlaWdodC9CbG9ja0hlaWdodCk7IHkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoeCA9IDA7IHggPCAoUGFydFdpZHRoL0Jsb2NrV2lkdGgpOyB4KyspCi0gICAgICAgIHsKLQkJCU9mZlggPSAoUGFydFN0YXJ0WCArIHggKiBCbG9ja1dpZHRoKSA+PiAyOwotCQkJT2ZmWSA9IChQYXJ0U3RhcnRZICsgeSAqIEJsb2NrSGVpZ2h0KSA+PiAyOyAgICAgICAgICAgIAotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgKEJsb2NrSGVpZ2h0ID4+IDIpOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IChCbG9ja1dpZHRoID4+IDIpOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwTVZBcnIgWzQgKyBPZmZZICsgal1bNCArIE9mZlggKyBpXS5keCA9IEJlc3RNVlt5XVt4XS5keDsKLSAgICAgICAgICAgICAgICAgICAgcE1WQXJyIFs0ICsgT2ZmWSArIGpdWzQgKyBPZmZYICsgaV0uZHkgPSBCZXN0TVZbeV1beF0uZHk7Ci0gICAgICAgICAgICAgICAgICAgIHBNVlByZWRBcnIgW09mZlkgKyBqXVtPZmZYICsgaV0uZHggPSBCZXN0TVZQcmVkW3ldW3hdLmR4OwotICAgICAgICAgICAgICAgICAgICBwTVZQcmVkQXJyIFtPZmZZICsgal1bT2ZmWCArIGldLmR5ID0gQmVzdE1WUHJlZFt5XVt4XS5keTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAoQmxvY2tIZWlnaHQgPj4gMyk7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKEJsb2NrV2lkdGggPj4gMyk7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0JCSAgICAgICAgICAgIHBSZWZGckFyciBbMiArIChPZmZZID4+IDEpICsgal1bMiArIChPZmZYID4+IDEpICsgaV0gPSBCZXN0UmVmRnJhbWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0JKnBDb3N0ID0gQmVzdENvc3Q7Ci0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci0KLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRyYTE2eDE2RXN0aW1hdGlvbgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgTUItbGV2ZWwgbW90aW9uIGVzdGltYXRpb24gZm9yIElOVEVSIE1CIHR5cGUgYW5kIHNlbGVjdHMgYmVzdCBtb3Rpb24gZXN0aW1hdGlvbiBzdHJhdGVneSBmcm9tIAotICogdGhlIHNldCBvZiBtb2RlcyBzdXBwb3J0ZWQgaW4gYmFzZWxpbmUgcHJvZmlsZSBJU08vSUVDIDE0NDk2LTEwLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gcFNyY0N1cnJCdWYgICAgLSBQb2ludGVyIHRvIHRoZSBzdGFydCBvZiBsdW1hIGNvbXBvbmVudCBvZiBjdXJyZW50IE1hY3JvYmxvY2sgCi0gKiBbaW5dIFNyY0N1cnJTdGVwIC0gU3RlcCBzaXplIGZvciB0aGUgcG9pbnRlciBwU3JjQ3VyckJ1ZiAKLSAqIFtpbl0gcFNyY1JlY0J1ZiAgICAtIFBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGx1bWEgY29tcG9uZW50IG9mIGNvLWxvY2F0ZWQgcmVjb25zdHJ1Y3RlZCBNQiAKLSAqIFtpbl0gU3JjUmVjU3RlcCAtIFN0ZXAgc2l6ZSBmb3IgdGhlIHBvaW50ZXIgcFNyY1JlY0J1ZiAKLSAqIFtpbl0gbk1CUG9zWCAgICAgLSBQb3NpdGlvbiBvZiBNQiBpbiB0aGUgZnJhbWUgdy5yLnQgWCBheGlzCi0gKiBbaW5dIG5NQlBvc1kgICAgIC0gUG9zaXRpb24gb2YgTUIgaW4gdGhlIGZyYW1lIHcuci50IFkgYXhpcwotICogW2luXSBwTUJJbnRlciAgICAtIEFycmF5LCBvZiBkaW1lbnNpb24gZm91ciwgY29udGFpbmluZyBwb2ludGVycyB0byBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggZm91cgotICogICAgICAgICAgICAgICAgICAgIGFkamFjZW50IHR5cGUgSU5URVIgTUJzIChMZWZ0LCBUb3AsIFRvcC1MZWZ0LCBUb3AtUmlnaHQpLiAKLSAqIFtpbl0gcE1CSW50cmEgICAgLSBBcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGZvdXIKLSAqICAgICAgICAgICAgICAgICAgICBhZGphY2VudCB0eXBlIElOVFJBIE1CcyAoTGVmdCwgVG9wLCBUb3AtTGVmdCwgVG9wLVJpZ2h0KS4gCi0gKiBbaW4vb3V0XSBwU3JjRHN0TUJDdXJyIC0gUG9pbnRlciB0byBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IE1CLiAgRm9sbG93aW5nIG1lbWJlciBzaG91bGQgYmUgc2V0IAotICogICAgICAgICAgICAgICAgICAgIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24KLSAqIFtpbl0gTGFtYmRhICAgICAgLSBGb3IgY2FsY3VsYXRpbmcgdGhlIGNvc3QKLSAqIFtvdXRdIHBDb3N0ICAgICAgLSBQb2ludGVyIHRvIGNvc3QgZm9yIEludHJhMTZ4MTYKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TdHNfTm9FcnIgLSBObyBFcnJvcgotICogT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzOgotICoKLSAqLwotCi1zdGF0aWMgT01YUmVzdWx0IGFybVZDTTRQMTBfSW50cmExNngxNkVzdGltYXRpb24oCi0gICAgY29uc3QgT01YX1U4KiBwU3JjQ3VyckJ1ZiwgICAKLSAgICBPTVhfUzMyIFNyY0N1cnJTdGVwLAotICAgIGNvbnN0IE9NWF9VOCogcFNyY1JlY0J1ZiwgICAKLSAgICBPTVhfUzMyIFNyY1JlY1N0ZXAsCi0JY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKLSAgICBjb25zdCBPTVhWQ000UDEwTUJJbmZvUHRyICpwTUJJbnRlciwKLSAgICBjb25zdCBPTVhWQ000UDEwTUJJbmZvUHRyICpwTUJJbnRyYSwKLSAgICBPTVhWQ000UDEwTUJJbmZvICpwU3JjRHN0TUJDdXJyLAotICAgIE9NWF9VMzIgKnBDb3N0KQotewotICAgIE9NWF9VOCAgICAgIFByZWRCdWYgWzE2KjE2ICsgMTZdOwotICAgIE9NWF9VOCAgICAgICpwUHJlZDsKLSAgICBPTVhfUzMyICAgICBtb2RlOwotICAgIE9NWF9TMzIgICAgIENvc3Q7Ci0gICAgT01YX1MzMiAgICAgYXZhaWxhYmlsaXR5ID0gMDsKLSAgICBPTVhSZXN1bHQgICBSZXQ7Ci0gICAgT01YVkNNNFAxMEludHJhMTZ4MTZQcmVkTW9kZSAgICBJbnRyYU1vZGUxNngxNiBbNF0gPSAKLSAgICAgICAge09NWF9WQ18xNlgxNl9WRVJULCBPTVhfVkNfMTZYMTZfSE9SLCAKLSAgICAgICAgT01YX1ZDXzE2WDE2X0RDLCBPTVhfVkNfMTZYMTZfUExBTkV9OyAgICAgICAgCi0gICAgT01YX1UzMiAgICAgTUJQb3NYID0gcEN1cnJQb2ludFBvcy0+eCA+PiA0OyAgICAgICAgCi0gICAgT01YX1UzMiAgICAgTUJQb3NZID0gcEN1cnJQb2ludFBvcy0+eSA+PiA0OyAgICAgICAgCi0KLQlwUHJlZCA9IGFybUFsaWduVG8xNkJ5dGVzKFByZWRCdWYpOwotICAgIAotCS8qIENoZWNrIGZvciBhdmFpbGFiaWxpdHkgb2YgTEVGVCBNQiAqLwotICAgIGlmICgoTUJQb3NYICE9IDApICYmIChwTUJJbnRyYSBbMF0gIT0gMCB8fCBwTUJJbnRlciBbMF0gIT0gMCkpCi0gICAgewotICAgICAgICBhdmFpbGFiaWxpdHkgfD0gT01YX1ZDX0xFRlQ7ICAgICAgICAKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBmb3IgYXZhaWxhYmlsaXR5IG9mIFVQIE1CICovCi0gICAgaWYgKChNQlBvc1kgIT0gMCkgJiYgKHBNQkludHJhIFsxXSAhPSAwIHx8IHBNQkludGVyIFsxXSAhPSAwKSkKLSAgICB7Ci0gICAgICAgIGF2YWlsYWJpbGl0eSB8PSBPTVhfVkNfVVBQRVI7ICAgICAgICAKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBmb3IgYXZhaWxhYmlsaXR5IG9mIFVQLUxFRlQgTUIgKi8KLSAgICBpZiAoKE1CUG9zWCA+IDApICYmIChNQlBvc1kgPiAwKSAmJiAKLSAgICAgICAgKHBNQkludHJhIFsyXSAhPSAwIHx8IHBNQkludGVyIFsyXSAhPSAwKSkKLSAgICB7Ci0gICAgICAgIGF2YWlsYWJpbGl0eSB8PSBPTVhfVkNfVVBQRVJfTEVGVDsgICAgICAgIAotICAgIH0KLQotICAgICpwQ29zdCA9IEFSTV9WQ000UDEwX01BWF9DT1NUOwotICAgIGZvciAobW9kZSA9IDA7IG1vZGUgPCA0OyBtb2RlKyspCi0gICAgewotICAgICAgICBSZXQgPSBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNigKLSAgICAgICAgICAgICAgICBwU3JjUmVjQnVmIC0gMSwgCi0gICAgICAgICAgICAgICAgcFNyY1JlY0J1ZiAtIFNyY1JlY1N0ZXAsIAotICAgICAgICAgICAgICAgIHBTcmNSZWNCdWYgLSBTcmNSZWNTdGVwIC0gMSwgCi0gICAgICAgICAgICAgICAgcFByZWQsIAotICAgICAgICAgICAgICAgIFNyY1JlY1N0ZXAsIAotICAgICAgICAgICAgICAgIDE2LCAKLSAgICAgICAgICAgICAgICBJbnRyYU1vZGUxNngxNiBbbW9kZV0sIAotICAgICAgICAgICAgICAgIGF2YWlsYWJpbGl0eSk7Ci0gICAgICAgIGlmIChSZXQgPT0gT01YX1N0c19Ob0VycikgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFybVZDQ09NTV9TQUQoICAgIAotICAgICAgICAgICAgICAgIHBTcmNDdXJyQnVmLAotICAgICAgICAgICAgICAgIFNyY0N1cnJTdGVwLAotICAgICAgICAgICAgICAgIHBQcmVkLAotICAgICAgICAgICAgICAgIDE2LAotICAgICAgICAgICAgICAgICZDb3N0LAotICAgICAgICAgICAgICAgIDE2LAotICAgICAgICAgICAgICAgIDE2KTsKLSAgICAgICAgICAgIGlmIChDb3N0IDwgKnBDb3N0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwQ29zdCA9IENvc3Q7Ci0gICAgICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyci0+SW50cmExNngxNlByZWRNb2RlID0gSW50cmFNb2RlMTZ4MTYgW21vZGVdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50cmE0eDRFc3RpbWF0aW9uCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBNQi1sZXZlbCBtb3Rpb24gZXN0aW1hdGlvbiBmb3IgSW50cmEgNHg0IE1CIHR5cGUgYW5kIHNlbGVjdHMKLSAqIHRoZSBiZXN0IHNldCBvZiBtb2RlcyBzdXBwb3J0ZWQgaW4gYmFzZWxpbmUgcHJvZmlsZS4KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBwU3JjQ3VyckJ1ZiAgICAtIFBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGx1bWEgY29tcG9uZW50IG9mIGN1cnJlbnQgTWFjcm9ibG9jayAKLSAqIFtpbl0gU3JjQ3VyclN0ZXAgLSBTdGVwIHNpemUgZm9yIHRoZSBwb2ludGVyIHBTcmNDdXJyQnVmIAotICogW2luXSBwU3JjUmVjQnVmICAgIC0gUG9pbnRlciB0byB0aGUgc3RhcnQgb2YgbHVtYSBjb21wb25lbnQgb2YgY28tbG9jYXRlZCByZWNvbnN0cnVjdGVkIE1CIAotICogW2luXSBTcmNSZWNTdGVwIC0gU3RlcCBzaXplIGZvciB0aGUgcG9pbnRlciBwU3JjUmVjQnVmIAotICogW2luXSBuTUJQb3NYICAgICAtIFBvc2l0aW9uIG9mIE1CIGluIHRoZSBmcmFtZSB3LnIudCBYIGF4aXMKLSAqIFtpbl0gbk1CUG9zWSAgICAgLSBQb3NpdGlvbiBvZiBNQiBpbiB0aGUgZnJhbWUgdy5yLnQgWSBheGlzCi0gKiBbaW5dIHBNQkludHJhICAgIC0gQXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBmb3VyCi0gKiAgICAgICAgICAgICAgICAgICAgYWRqYWNlbnQgdHlwZSBJTlRSQSBNQnMgKExlZnQsIFRvcCwgVG9wLUxlZnQsIFRvcC1SaWdodCkuIAotICogW2luL291dF0gcFNyY0RzdE1CQ3VyciAtIFBvaW50ZXIgdG8gaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCBNQi4gIEZvbGxvd2luZyBtZW1iZXIgc2hvdWxkIGJlIHNldCAKLSAqICAgICAgICAgICAgICAgICAgICBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uCi0gKiBbaW5dIExhbWJkYSAgICAgIC0gRm9yIGNhbGN1bGF0aW5nIHRoZSBjb3N0Ci0gKiBbb3V0XSBwQ29zdCAgICAgIC0gUG9pbnRlciB0byBjb3N0IGZvciBJbnRyYTR4NAotICogUmV0dXJuIFZhbHVlOgotICogT01YX1N0c19Ob0VyciAtIE5vIEVycm9yCi0gKiBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHM6Ci0gKgotICovCi0KLXN0YXRpYyBPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRyYTR4NEVzdGltYXRpb24oCi0gICAgY29uc3QgT01YX1U4KiBwU3JjQ3VyckJ1ZiwgICAKLSAgICBPTVhfUzMyIFNyY0N1cnJTdGVwLAotICAgIGNvbnN0IE9NWF9VOCogcFNyY1JlY0J1ZiwgICAKLSAgICBPTVhfUzMyIFNyY1JlY1N0ZXAsCi0gICAgY29uc3QgT01YVkNNNFAxME1CSW5mb1B0ciAqcE1CSW50cmEsCi0gICAgT01YVkNNNFAxME1CSW5mbyAqcFNyY0RzdE1CQ3VyciwKLSAgICBPTVhfVTMyICpwQ29zdCkKLXsKLSAgICBPTVhfUzMyICAgICB4LCB5LCBCbG9jazR4NCwgQmxvY2s4eDg7Ci0gICAgT01YX1MzMiAgICAgQ29zdDsKLQotICAgIC8qCi0gICAgICogUHJlZEludHJhNHg0TW9kZSB3aWxsIHN0b3JlIHByZWRpY3Rpb24gbW9kZXMgb2YgNHg0IGJsb2Nrcy4gCi0gICAgICogTW9kZXMgZm9yIGN1cnJlbnQgTUIgc3RhcnRzIGF0IGluZGV4IFsxXVsxXS4gICAKLSAgICAgKiBNb2RlcyBvZiBuaWdoYm91cmluZyBNQidzIHdpbGwgYmUgYXMgc2hvd24gYmVsb3cKLSAgICAgKiBBIHZhbHVlIG9mIEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0sgZm9yIGFueSBibG9jayBpbiB0aGlzIGFycmF5IG1lYW5zIAotICAgICAqIHRoYXQgYmxvY2sgaXMgbm90IGF2YWlsYWJsZSBmb3IgcHJlZGljdGlvbi4KLSAgICAgKgotICAgICAqIGMzIGIwIGIxIGIyIGIzIGQwIGQxIGQyIGQzCi0gICAgICogYTAgeHggeHggeHggeHggLSAgLSAgLSAgLQotICAgICAqIGExIHh4IHh4IHh4IHh4IC0gIC0gIC0gIC0KLSAgICAgKiBhMiB4eCB4eCB4eCB4eCAtICAtICAtICAtCi0gICAgICogYTMgeHggeHggeHggeHggLSAgLSAgLSAgLQotICAgICAqCi0gICAgICovCi0gICAgT01YX1MzMiAgICAgUHJlZEludHJhNHg0TW9kZSBbNV1bOV07Ci0KLSAgICAvKgotICAgICAqIHBTcmNZIHN0b3JlcyByZS1jb25zdHJ1c3RlZCBzb3VyY2UgYXJyYXkgb2Ygc2l6ZSAzTUIgWCAyTUIgYXMgYmVsb3cKLSAgICAgKgotICAgICAqIE1CMTEgTUIxMiBNQjEzIAotICAgICAqIE1CMjEgTUIyMiBNQjIzCi0gICAgICoKLSAgICAgKiBUaGlzIGFycmF5IHdpbGwgYmUgdXNlZCBmb3IgbG9jYWwgcmVjb25zdHJ1Y3Rpb24gb2YgNHg0IGJsb2NrcyAKLSAgICAgKiB3aXRoIGJlc3QgcHJlZGljdGlvbiBtb2RlIHdpdGhpbiBhbiBNQgotICAgICAqLyAgICAKLSAgICBPTVhfVTggICAgICBwU3JjWSBbKDE2KjMpKigxNioyKV07Ci0gICAgT01YX1MzMiAgICAgU3RlcFNyY1k7Ci0gICAgCi0gICAgLyogaW5pdCAqLwotICAgICpwQ29zdCA9IDA7Ci0KLSAgICBmb3IgKHkgPSAwOyB5IDwgNTsgeSsrKQotICAgIHsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IDk7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgLyogCi0gICAgICAgICAgICAgKiBJbml0aWFsaXplIHdpdGggdmFsdWUgb2YgQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSywgdG8gbWVhbiB0aGlzIAotICAgICAgICAgICAgICogNHg0IGJsb2NrIGlzIG5vdCBhdmFpbGFibGUgCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFByZWRJbnRyYTR4NE1vZGUgW3ldW3hdID0gQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIFJlcGxhY2UgQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSyB2YWx1ZSB3aXRoIGF2YWlsYWJsZSBNQnMgdmFsdWVzKi8KLSAgICBmb3IgKHggPSAwOyB4IDwgNDsgeCsrKQotICAgIHsKLSAgICAgICAgLyogU3RvcmUgdmFsdWVzIG9mIGIwLCBiMSwgYjIsIGIzICovCi0gICAgICAgIGlmIChwTUJJbnRyYVsxXSAhPSBOVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBQcmVkSW50cmE0eDRNb2RlIFswXVt4ICsgMV0gPSAKLSAgICAgICAgICAgICAgICBwTUJJbnRyYVsxXS0+cEludHJhNHg0UHJlZE1vZGVbMyo0ICsgeF07ICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qIFN0b3JlIHZhbHVlcyBvZiBkMCwgZDEsIGQyLCBkMyAqLwotICAgICAgICBpZiAocE1CSW50cmFbM10gIT0gTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgUHJlZEludHJhNHg0TW9kZSBbMF1beCArIDVdID0gCi0gICAgICAgICAgICAgICAgcE1CSW50cmFbM10tPnBJbnRyYTR4NFByZWRNb2RlWzMqNCArIHhdOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qIFN0b3JlIHZhbHVlcyBvZiBjMyAqLwotICAgIGlmIChwTUJJbnRyYVsyXSAhPSBOVUxMKQotICAgIHsKLSAgICAgICAgUHJlZEludHJhNHg0TW9kZSBbMF1bMF0gPSBwTUJJbnRyYVsyXS0+cEludHJhNHg0UHJlZE1vZGVbMTVdOwotICAgIH0KLSAgICAKLSAgICBmb3IgKHkgPSAwOyB5IDwgNDsgeSsrKQotICAgIHsKLSAgICAgICAgLyogU3RvcmUgdmFsdWVzIG9mIGEwLCBhMSwgYTIsIGEzICovCi0gICAgICAgIGlmIChwTUJJbnRyYVswXSAhPSBOVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBQcmVkSW50cmE0eDRNb2RlIFt5ICsgMV1bMF0gPSAKLSAgICAgICAgICAgICAgICBwTUJJbnRyYVswXS0+cEludHJhNHg0UHJlZE1vZGVbeSo0ICsgM107Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgICAgIAotICAgIC8qCi0gICAgICogVXBkYXRlIG5laWdoYm91cmluZyBQcmVkIG1vZGUgYXJyYXkgd2hpY2ggd2lsbCBiZSB1c2VkIGZvcgotICAgICAqIHByZWRpY3Rpb24gb2YgSW50cmE0eDQgbW9kZXMuCi0gICAgICovCi0gICAgCi0gICAgU3RlcFNyY1kgPSAxNiAqIDM7Ci0gICAgZm9yICh5ID0gMDsgeSA8ICgxNiAqIDIpOyB5KyspCi0gICAgewotICAgICAgICBmb3IgKHggPSAwOyB4IDwgKDE2ICogMyk7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgcFNyY1kgW1N0ZXBTcmNZICogeSArIHhdID0gCi0gICAgICAgICAgICAgICAgcFNyY1JlY0J1ZiBbU3JjUmVjU3RlcCAqICh5IC0gMTYpICsgeCAtIDE2XTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKiBmb3IgZWFjaCA4eDggYmxvY2sgKi8KLSAgICBmb3IgKEJsb2NrOHg4ID0gMDsgQmxvY2s4eDggPCA0OyBCbG9jazh4OCsrKQotICAgIHsKLSAgICAgICAgLyogZm9yIGVhY2ggNHg0IGJsb2NrIGluc2lkZSA4eDggYmxvY2sgKi8KLSAgICAgICAgZm9yIChCbG9jazR4NCA9IDA7IEJsb2NrNHg0IDwgNDsgQmxvY2s0eDQrKykKLSAgICAgICAgewotICAgICAgICAgICAgYXJtVkNNNFAxMF9Nb2RlNHg0RGVjaXNpb24gKAotICAgICAgICAgICAgICAgIHBTcmNDdXJyQnVmLCAgIAotICAgICAgICAgICAgICAgIFNyY0N1cnJTdGVwLAotICAgICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnIsCi0gICAgICAgICAgICAgICAgQmxvY2s4eDgsIAotICAgICAgICAgICAgICAgIEJsb2NrNHg0LAotICAgICAgICAgICAgICAgIHBTcmNZICsgMTYgKiBTdGVwU3JjWSArIDE2LAotICAgICAgICAgICAgICAgIFN0ZXBTcmNZLAotICAgICAgICAgICAgICAgIFByZWRJbnRyYTR4NE1vZGUsIAotICAgICAgICAgICAgICAgICZDb3N0KTsKLQotICAgICAgICAgICAgKnBDb3N0ICs9IENvc3Q7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJNRU1CCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBNQi1sZXZlbCBtb3Rpb24gZXN0aW1hdGlvbiBmb3IgSU5URVIgTUIgdHlwZSBhbmQgc2VsZWN0cyBiZXN0IG1vdGlvbiBlc3RpbWF0aW9uIHN0cmF0ZWd5IGZyb20gCi0gKiB0aGUgc2V0IG9mIG1vZGVzIHN1cHBvcnRlZCBpbiBiYXNlbGluZSBwcm9maWxlIElTTy9JRUMgMTQ0OTYtMTAuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBwU3JjQ3VyckJ1ZiAgICAtIFBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGx1bWEgY29tcG9uZW50IG9mIGN1cnJlbnQgTWFjcm9ibG9jayAKLSAqIFtpbl0gU3JjQ3VyclN0ZXAgLSBTdGVwIHNpemUgZm9yIHRoZSBwb2ludGVyIHBTcmNDdXJyQnVmIAotICogW2luXSBwU3JjUmVmQnVmTGlzdCAgICAtIFBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGx1bWEgY29tcG9uZW50IG9mIGNvLWxvY2F0ZWQgcmVmZXJlbmNlIE1CCi0gKiBbaW5dIFNyY1JlZlN0ZXAgLSBTdGVwIHNpemUgZm9yIHRoZSBwb2ludGVyIHBTcmNSZWZZIAotICogW2luXSBwUmVmUmVjdCAgIFBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSByZWN0YW5nbGU7IHJlbGF0aXZlIHRvIHRoZSBpbWFnZSBvcmlnaW4uCi0gKiBbaW5dIHBDdXJyUG9pbnRQb3MgICBQb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lLgotICogW2luXSBwTUVTcGVjICAgICAtIE1vdGlvbiBlc3RpbWF0aW9uIHN0cnVjdHVyZQotICogW2luXSBwTUJJbnRlciAgICAtIEFycmF5LCBvZiBkaW1lbnNpb24gZm91ciwgY29udGFpbmluZyBwb2ludGVycyB0byBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggZm91cgotICogICAgICAgICAgICAgICAgICAgIGFkamFjZW50IHR5cGUgSU5URVIgTUJzIChMZWZ0LCBUb3AsIFRvcC1MZWZ0LCBUb3AtUmlnaHQpLiAKLSAqIFtpbi9vdXRdIHBTcmNEc3RNQkN1cnIgLSBQb2ludGVyIHRvIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgTUIuICBGb2xsb3dpbmcgbWVtYmVyIHNob3VsZCBiZSBzZXQgCi0gKiAgICAgICAgICAgICAgICAgICAgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbgotICogW2luXSBMYW1iZGEgICAgICAtIEZvciBjYWxjdWxhdGluZyB0aGUgY29zdAotICogW291dF0gcERzdENvc3QgICAgICAtIFBvaW50ZXIgdG8gY29zdCBmb3IgSW50ZXIgTUIKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TdHNfTm9FcnIgLSBObyBFcnJvcgotICogT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzOgotICoKLSAqLwotCi1zdGF0aWMgT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJNRU1CKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsIAotCU9NWF9TMzIgU3JjQ3VyclN0ZXAsIAotCWNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1Zkxpc3RbQVJNX1ZDTTRQMTBfTUFYX0ZSQU1FU10sCi0JT01YX1MzMiBTcmNSZWZTdGVwLAotCWNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotCWNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCi0JT01YX1UzMiBMYW1iZGEsCi0Jdm9pZCAqcE1FU3BlYywKLQljb25zdCBPTVhWQ000UDEwTUJJbmZvUHRyICpwTUJJbnRlciwgCi0gICAgT01YVkNNNFAxME1CSW5mb1B0ciBwU3JjRHN0TUJDdXJyLAotCU9NWF9VMzIgKnBEc3RDb3N0KQotewotICAgIE9NWF9TMzIgICAgIGksIGosIHgsIHksIG1vZGU7Ci0gICAgT01YX1UzMiAgICAgQmxvY2s4eDgsIFhQZXJNQiwgWVBlck1CLCBCbG9jazJ4LCBCbG9jazJ5OwotICAgIE9NWF9TMzIgICAgIFBhcnRTdGFydFggPSAwLCBQYXJ0U3RhcnRZID0gMDsKLSAgICBPTVhfUzMyICAgICBQYXJ0V2lkdGggPSA4LCBQYXJ0SGVpZ2h0ID0gOCwgQmxvY2tXaWR0aCA9IDQsIEJsb2NrSGVpZ2h0ID0gNDsKLSAgICBjb25zdCBPTVhfVTMyICAgICBCbGtTeiBbNF1bMl0gPSB7ezQsNH0sIHs0LDh9LCB7OCw0fX07Ci0gICAgY29uc3QgT01YX1UzMiAgICAgUGFydFN6IFs0XVsyXSA9IHt7OCw4fSwgezgsMTZ9LCB7MTYsOH0sIHsxNiwxNn19OwotICAgIGNvbnN0IE9NWFZDTTRQMTBTdWJNYWNyb2Jsb2NrVHlwZSAgICAgCi0gICAgICAgICAgICAgICAgTW9kZVN1Yk1CVHlwZTR4NCBbXSA9IHtPTVhfVkNfU1VCX1BfNHg0LCBPTVhfVkNfU1VCX1BfNHg4LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WQ19TVUJfUF84eDQsIE9NWF9WQ19TVUJfUF84eDh9OwotICAgIGNvbnN0IE9NWFZDTTRQMTBNYWNyb2Jsb2NrVHlwZQotICAgICAgICAgICAgICAgIE1vZGVNQlR5cGUgW10gPSB7T01YX1ZDX1BfOHg4LCBPTVhfVkNfUF84eDE2LCBPTVhfVkNfUF8xNng4LCBPTVhfVkNfUF8xNngxNn07Ci0gICAgCi0gICAgT01YVkNNNFAxME1FUGFyYW1zICAqcE1CT3B0aW9uczsKLSAgICAvKgotICAgICAqIFJlZkZyQXJyIGFuZCAgTVZBcnIgd2lsbCBiZSB1c2VkIGZvciB0ZW1wb3Jhcnkgc3RvcmFnZSBvZiBSZWZlcmVuY2UgZnJhbWUgaW5kZXggYW5kIE1WcwotICAgICAqIEl0IHdpbGwgc3RvcmUgUmVmSW5kZXggYW5kIE1WcyBvZiA2IE1CcyBhcyBzaG93biBiZWxvdwotICAgICAqIAotICAgICAqICAgICB8LS0tLS0tfC0tLS0tLXwtLS0tLS18Ci0gICAgICogICAgIHxUcC1MdCB8VG9wICAgfFRwLVIgIHwKLSAgICAgKiAgICAgfCBNQiAgIHwgTUIgICB8IE1CICAgfAotICAgICAqICAgICB8LS0tLS0tfC0tLS0tLXwtLS0tLS18Ci0gICAgICogICAgIHxMZWZ0ICB8IEN1cnIgfCAgICAgIHwKLSAgICAgKiAgICAgfCBNQiAgIHwgTUIgICB8ICAgICAgfAotICAgICAqICAgICB8LS0tLS0tfC0tLS0tLXwtLS0tLS18Ci0gICAgICovCi0gICAgT01YX1MzMiAgICAgUmVmRnJBcnIgWzRdWzZdOyAKLSAgICBPTVhWQ01vdGlvblZlY3RvciBNVkFyciBbOF1bMTJdOwotICAgIE9NWFZDTW90aW9uVmVjdG9yIE1WUHJlZEFyciBbNF1bNF07Ci0gICAgCi0gICAgLyoKLSAgICAgKiBJbmRleFRvTG9jIHdpbGwgdHJhbnNsYXRlIHBNQkludGVyIGluZGV4IGludG8gc3BhY2lhbCBhcnJhbmdlbWVudCBvZiBNQnMKLSAgICAgKi8KLSAgICBPTVhfUzMyICAgICBJbmRleFRvTG9jIFtdID0gezIsMSwzLDB9OwotICAgIE9NWF9VMzIgICAgIHBhcnQsIE1heFBhcnQ7Ci0gICAgT01YX1MzMiAgICAgQ29zdCwgTW90aW9uQ29zdDh4OCBbNF0sIE1CQ29zdCwgQmVzdENvc3Q7Ci0KLSAgICAvKgotICAgICAqIFVwZGF0ZSBuZWlnaGJvdXJpbmcgTVYgYXJyYXkgYW5kIFJlZiBmcmFtZSBhcnJheSB3aGljaCB3aWxsIGJlIHVzZWQgZm9yCi0gICAgICogcHJlZGljdGlvbiBvZiBNVnMgYW5kIFJlZiBmcmFtZXMuCi0gICAgICovCi0KLSAgICAvKiBTZXQgY29zdCB0byBhIGhpZ2ggdmFsdWUgKi8KLSAgICBDb3N0ID0gQmVzdENvc3QgPSBBUk1fVkNNNFAxMF9NQVhfQ09TVDsKLSAgICAKLSAgICBmb3IgKHkgPSAwOyB5IDwgODsgeSsrKQotICAgIHsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IDEyOyB4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGkgPSAzICogKHkgPj4gMikgKyAoeCA+PiAyKTsKLSAgICAgICAgICAgIGlmICgoeSA8IDQgfHwgeCA8IDQpICYmIChwTUJJbnRlcltJbmRleFRvTG9jW2ldXSAhPSBOVUxMKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNVkFyciBbeV1beF0uZHggPSAKLSAgICAgICAgICAgICAgICAgICAgcE1CSW50ZXJbSW5kZXhUb0xvY1tpXV0tPnBNVjBbeSAlIDRdW3ggJSA0XS5keDsKLSAgICAgICAgICAgICAgICBNVkFyciBbeV1beF0uZHkgPSAKLSAgICAgICAgICAgICAgICAgICAgcE1CSW50ZXJbSW5kZXhUb0xvY1tpXV0tPnBNVjBbeSAlIDRdW3ggJSA0XS5keTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNVkFyciBbeV1beF0uZHggPSAwOwotICAgICAgICAgICAgICAgIE1WQXJyIFt5XVt4XS5keSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9ICAgIAotCi0gICAgZm9yICh5ID0gMDsgeSA8IDQ7IHkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoeCA9IDA7IHggPCA2OyB4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGkgPSAzICogKHkgPj4gMSkgKyAoeCA+PiAxKTsKLSAgICAgICAgICAgIGlmICgoeSA8IDIgfHwgeCA8IDIpICYmIChwTUJJbnRlcltJbmRleFRvTG9jW2ldXSAhPSBOVUxMKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBSZWZGckFyciBbeV1beF0gPSAKLSAgICAgICAgICAgICAgICAgICAgcE1CSW50ZXJbSW5kZXhUb0xvY1tpXV0tPnBSZWZMMElkeCBbKHkgJSAyKSAqIDIgKyAoeCAlIDIpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBSZWZGckFyciBbeV1beF0gPSBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSAgICAKLQotICAgIGZvciAoeSA9IDA7IHkgPCA0OyB5KyspCi0gICAgewotICAgICAgICBmb3IgKHggPSAwOyB4IDwgNDsgeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBNVlByZWRBcnIgW3ldW3hdLmR4ID0gMDsKLSAgICAgICAgICAgIE1WUHJlZEFyciBbeV1beF0uZHkgPSAwOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qCi0gICAgICogTW90aW9uIEVzdGltYXRpb24gZm9yIDh4OCBNQiBQYXJ0aXRpb24gCi0gICAgICovCi0KLSAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgIHsKLSAgICAgICAgTW90aW9uQ29zdDh4OCBbaV0gPSAwOwotICAgIH0gICAgICAgIAotICAgIAotICAgIHBNQk9wdGlvbnMgPSAoT01YVkNNNFAxME1FUGFyYW1zICopIHBNRVNwZWM7Ci0gICAgCi0gICAgaWYgKHBNQk9wdGlvbnMtPmJsb2NrU3BsaXRFbmFibGU4eDggPT0gMSAmJiAKLSAgICAgICAgcE1CT3B0aW9ucy0+YmxvY2tTcGxpdEVuYWJsZTR4NCA9PSAxKQotICAgIHsKLSAgICAgICAgcFNyY0RzdE1CQ3Vyci0+bWJUeXBlID0gT01YX1ZDX1BfOHg4OwotCi0gICAgICAgIFBhcnRXaWR0aCA9IFBhcnRTeiBbMF1bMF07Ci0gICAgICAgIFBhcnRIZWlnaHQgPSBQYXJ0U3ogWzBdWzFdOwotICAgICAgICAKLSAgICAgICAgLyogRm9yIGVhY2ggOHg4IHBhcnRpdGlvbnMgKi8KLSAgICAgICAgZm9yIChCbG9jazh4OCA9IDA7IEJsb2NrOHg4IDwgNDsgQmxvY2s4eDgrKykKLSAgICAgICAgewotICAgICAgICAgICAgUGFydFN0YXJ0WCA9IChCbG9jazh4OCAlIDIpIDw8IDM7Ci0gICAgICAgICAgICBQYXJ0U3RhcnRZID0gKEJsb2NrOHg4IC8gMikgPDwgMzsKLQotICAgICAgICAgICAgQmxvY2syeCA9IChCbG9jazh4OCAmIDEpIDw8IDE7Ci0gICAgICAgICAgICBCbG9jazJ5ID0gKEJsb2NrOHg4ID4+IDEpIDw8IDE7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEJlc3RDb3N0ID0gQVJNX1ZDTTRQMTBfTUFYX0NPU1Q7Ci0gICAgICAgICAgICBmb3IgKG1vZGUgPSAwOyBtb2RlIDwgMzsgbW9kZSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEJsb2NrV2lkdGggPSBCbGtTeiBbbW9kZV1bMF07Ci0gICAgICAgICAgICAgICAgQmxvY2tIZWlnaHQgPSBCbGtTeiBbbW9kZV1bMV07Ci0KLSAgICAgICAgICAgICAgICBhcm1WQ000UDEwX1BhcnRpdGlvbk1FICgKLSAgICAgICAgICAgICAgICAgICAgcFNyY0N1cnJCdWYsICAgCi0gICAgICAgICAgICAgICAgICAgIFNyY0N1cnJTdGVwLAotICAgICAgICAgICAgICAgICAgICBwU3JjUmVmQnVmTGlzdCwgICAKLSAgICAgICAgICAgICAgICAgICAgU3JjUmVmU3RlcCwKLSAgICAgICAgICAgICAgICAgICAgcFJlZlJlY3QsCi0gICAgICAgICAgICAgICAgICAgIHBDdXJyUG9pbnRQb3MsCi0gICAgICAgICAgICAgICAgICAgIHBNRVNwZWMsCi0KLSAgICAgICAgICAgICAgICAgICAgUGFydFdpZHRoLAotICAgICAgICAgICAgICAgICAgICBQYXJ0SGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICBCbG9ja1dpZHRoLAotICAgICAgICAgICAgICAgICAgICBCbG9ja0hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgUGFydFN0YXJ0WCwKLSAgICAgICAgICAgICAgICAgICAgUGFydFN0YXJ0WSwKLQotICAgICAgICAgICAgICAgICAgICBNVkFyciwKLSAgICAgICAgICAgICAgICAgICAgUmVmRnJBcnIsCi0gICAgICAgICAgICAgICAgICAgIE1WUHJlZEFyciwKLQotICAgICAgICAgICAgICAgICAgICBMYW1iZGEsCi0gICAgICAgICAgICAgICAgICAgICZDb3N0KTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKENvc3QgPD0gQmVzdENvc3QpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgY29zdCAqLwotICAgICAgICAgICAgICAgICAgICBCZXN0Q29zdCA9IENvc3Q7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgTUJDdXJyIHN0cnVjdCAqLwotICAgICAgICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLT5zdWJNQlR5cGUgW0Jsb2NrOHg4XSA9IE1vZGVTdWJNQlR5cGU0eDQgW21vZGVdOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyci0+cFJlZkwwSWR4IFtCbG9jazh4OF0gPSBSZWZGckFyciBbMiArIChQYXJ0U3RhcnRZID4+IDMpXVsyICsgKFBhcnRTdGFydFggPj4gMyldOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBwTVYwIGFuZCBwTVZQcmVkIG9mIE1CQ3VyciBzdHJ1Y3QgKi8KLSAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLT5wTVYwIFtCbG9jazJ5ICsgal1bQmxvY2syeCArIGldLmR4ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZBcnIgWzQgKyBCbG9jazJ5ICsgal1bNCArIEJsb2NrMnggKyBpXS5keDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLT5wTVYwIFtCbG9jazJ5ICsgal1bQmxvY2syeCArIGldLmR5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZBcnIgWzQgKyBCbG9jazJ5ICsgal1bNCArIEJsb2NrMnggKyBpXS5keTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLT5wTVZQcmVkIFtCbG9jazJ5ICsgal1bQmxvY2syeCArIGldLmR4ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZQcmVkQXJyIFtCbG9jazJ5ICsgal1bQmxvY2syeCArIGldLmR4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPnBNVlByZWQgW0Jsb2NrMnkgKyBqXVtCbG9jazJ4ICsgaV0uZHkgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVlByZWRBcnIgW0Jsb2NrMnkgKyBqXVtCbG9jazJ4ICsgaV0uZHk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBjb3N0ICovCi0gICAgICAgICAgICBNb3Rpb25Db3N0OHg4IFtCbG9jazh4OF0gPSBCZXN0Q29zdDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyogQ29zdCBmb3IgbWJUeXBlIE9NWF9WQ19QXzh4OCAqLwotICAgICAgICBCZXN0Q29zdCA9IDA7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJlc3RDb3N0ICs9IE1vdGlvbkNvc3Q4eDggW2ldOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIFNldCBzdWIgTUIgdHlwZSB0byA4eDggKi8KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyci0+c3ViTUJUeXBlIFtpXSA9IE9NWF9WQ19TVUJfUF84eDg7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIE1vdGlvbiBFc3RpbWF0aW9uIGZvciA4eDgsIDh4MTYsIDE2eDggYW5kIDE2eDE2IE1CIFBhcnRpdGlvbgotICAgICAqIElmIHBNQk9wdGlvbnMtPmI4eDhCbG9ja1NwbGl0RW5hYmxlIGlzIDAsIGRvIG9ubHkgMTZ4MTYgTUUgKG1vZGUgMykKLSAgICAgKi8KLSAgICBmb3IgKG1vZGUgPSAocE1CT3B0aW9ucy0+YmxvY2tTcGxpdEVuYWJsZTh4OCA9PSAxID8gMCA6IDMpOyBtb2RlIDwgNDsgbW9kZSsrKQotICAgIHsKLSAgICAgICAgQmxvY2tXaWR0aCA9IFBhcnRXaWR0aCA9IFBhcnRTeiBbbW9kZV1bMF07Ci0gICAgICAgIEJsb2NrSGVpZ2h0ID0gUGFydEhlaWdodCA9IFBhcnRTeiBbbW9kZV1bMV07Ci0gICAgICAgIAotICAgICAgICBYUGVyTUIgPSAxNiAvIFBhcnRXaWR0aDsKLSAgICAgICAgWVBlck1CID0gMTYgLyBQYXJ0SGVpZ2h0OwotICAgICAgICBNYXhQYXJ0ID0gWFBlck1CICogWVBlck1COwotICAgICAgICAKLSAgICAgICAgTUJDb3N0ID0gMDsKLSAgICAgICAgCi0gICAgICAgIC8qIHBhcnQgc2l6ZSA0LCAyLCAyIGFuZCAxIGNvcnJlc3BvbmRpbmcgdG8gOHg4LCA4eDE2LCAxNng4IGFuZCAxNngxNiBNQiAqLwotICAgICAgICBmb3IgKHBhcnQgPSAwOyBwYXJ0IDwgTWF4UGFydDsgcGFydCsrKQotICAgICAgICB7Ci0gICAgICAgIAlQYXJ0U3RhcnRYID0gKHBhcnQgJSBYUGVyTUIpICogUGFydFdpZHRoOwotICAgICAgICAJUGFydFN0YXJ0WSA9IChwYXJ0IC8gWFBlck1CKSAqIFBhcnRIZWlnaHQ7Ci0gICAgICAgIAkKLSAgICAgICAgICAgIGFybVZDTTRQMTBfUGFydGl0aW9uTUUgKAotICAgICAgICAgICAgICAgIHBTcmNDdXJyQnVmLAotICAgICAgICAgICAgICAgIFNyY0N1cnJTdGVwLAotICAgICAgICAgICAgICAgIHBTcmNSZWZCdWZMaXN0LCAgIAotICAgICAgICAgICAgICAgIFNyY1JlZlN0ZXAsCi0gICAgICAgICAgICAgICAgcFJlZlJlY3QsCi0gICAgICAgICAgICAgICAgcEN1cnJQb2ludFBvcywKLSAgICAgICAgICAgICAgICBwTUVTcGVjLAotCi0gICAgICAgICAgICAgICAgUGFydFdpZHRoLAotICAgICAgICAgICAgICAgIFBhcnRIZWlnaHQsCi0gICAgICAgICAgICAgICAgQmxvY2tXaWR0aCwKLSAgICAgICAgICAgICAgICBCbG9ja0hlaWdodCwKLSAgICAgICAgICAgICAgICBQYXJ0U3RhcnRYLAotICAgICAgICAgICAgICAgIFBhcnRTdGFydFksCi0KLSAgICAgICAgICAgICAgICBNVkFyciwKLSAgICAgICAgICAgICAgICBSZWZGckFyciwKLSAgICAgICAgICAgICAgICBNVlByZWRBcnIsCi0KLSAgICAgICAgICAgICAgICBMYW1iZGEsCi0gICAgICAgICAgICAgICAgJkNvc3QpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIE1CQ29zdCArPSBDb3N0OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKE1CQ29zdCA8PSBCZXN0Q29zdCkKLSAgICAgICAgewotICAgICAgICAgICAgLyogVXBkYXRlIGNvc3QgKi8KLSAgICAgICAgICAgIEJlc3RDb3N0ID0gTUJDb3N0OwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiBVcGRhdGUgbWJUeXBlIG9mIE1CQ3VyciBzdHJ1Y3QgKi8KLSAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPm1iVHlwZSA9IE1vZGVNQlR5cGUgW21vZGVdOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiBVcGRhdGUgcE1WMCBhbmQgcE1WUHJlZCBvZiBNQkN1cnIgc3RydWN0ICovCi0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLT5wTVYwIFtqXVtpXS5keCA9IE1WQXJyIFs0K2pdWzQraV0uZHg7Ci0gICAgICAgICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPnBNVjAgW2pdW2ldLmR5ID0gTVZBcnIgWzQral1bNCtpXS5keTsKLSAgICAgICAgICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyci0+cE1WUHJlZCBbal1baV0uZHggPSBNVlByZWRBcnIgW2pdW2ldLmR4OwotICAgICAgICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLT5wTVZQcmVkIFtqXVtpXS5keSA9IE1WUHJlZEFyciBbal1baV0uZHk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyci0+cFJlZkwwSWR4IFtqKjIraV0gPSBSZWZGckFyciBbMitqXVsyK2ldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyogVXBkYXRlIEJlc3QgQ29zdCAqLwotICAgICpwRHN0Q29zdCA9IEJlc3RDb3N0OwotICAgIAotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIgICAoNi4zLjUuMy4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgTUItbGV2ZWwgbW90aW9uIGVzdGltYXRpb24gYW5kIHNlbGVjdHMgYmVzdCBtb3Rpb24gZXN0aW1hdGlvbiAKLSAqIHN0cmF0ZWd5IGZyb20gdGhlIHNldCBvZiBtb2RlcyBzdXBwb3J0ZWQgaW4gYmFzZWxpbmUgcHJvZmlsZSBbSVNPMTQ0OTYtMTBdLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjQ3VyckJ1ZiAtIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gb3JpZ2luYWwgcGljdHVyZSBwbGFuZTsgCi0gKiAgICAgICAgICAgIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAotICogICBwU3JjUmVmQnVmTGlzdCAtIFBvaW50ZXIgdG8gYW4gYXJyYXkgd2l0aCAxNiBlbnRyaWVzLiAgRWFjaCBlbnRyeSBwb2ludHMgCi0gKiAgICAgICAgICAgIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgTUIgaW4gYSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIHBpY3R1cmUuICBUaGUgYXJyYXkgaXMgZmlsbGVkIGZyb20gbG93LXRvLWhpZ2ggd2l0aCB2YWxpZCAKLSAqICAgICAgICAgICAgcmVmZXJlbmNlIGZyYW1lIHBvaW50ZXJzOyB0aGUgdW51c2VkIGhpZ2ggZW50cmllcyBzaG91bGQgYmUgc2V0IAotICogICAgICAgICAgICB0byBOVUxMLiAgT3JkZXJpbmcgb2YgdGhlIHJlZmVyZW5jZSBmcmFtZXMgc2hvdWxkIGZvbGxvdyAKLSAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSBzdWJjbGF1c2UgOC4yLjQgIERlY29kaW5nIFByb2Nlc3MgZm9yIFJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgUGljdHVyZSBMaXN0cy4gICBUaGUgZW50cmllcyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgIHBTcmNSZWNCdWYgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgTUIgaW4gdGhlIAotICogICAgICAgICAgICByZWNvbnN0cnVjdGVkIHBpY3R1cmU7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgU3JjQ3VyclN0ZXAgLSBXaWR0aCBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIFNyY1JlZlN0ZXAgLSBXaWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBTcmNSZWNTdGVwIC0gV2lkdGggb2YgdGhlIHJlY29uc3RydWN0ZWQgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIHBSZWZSZWN0IC0gUG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHJlY3RhbmdsZTsgcmVsYXRpdmUgdG8gdGhlIAotICogICAgICAgICAgICBpbWFnZSBvcmlnaW4uIAotICogICBwQ3VyclBvaW50UG9zIC0gUG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZS4gCi0gKiAgIExhbWJkYSAtIExhZ3JhbmdlIGZhY3RvciBmb3IgY29tcHV0aW5nIHRoZSBjb3N0IGZ1bmN0aW9uIAotICogICBwTUVTcGVjIC0gUG9pbnRlciB0byB0aGUgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IG11c3QgCi0gKiAgICAgICAgICAgIGhhdmUgYmVlbiBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkIHByaW9yIHRvIGNhbGxpbmcgdGhpcyAKLSAqICAgICAgICAgICAgZnVuY3Rpb24uIAotICogICBwTUJJbnRlciAtIEFycmF5LCBvZiBkaW1lbnNpb24gZm91ciwgY29udGFpbmluZyBwb2ludGVycyB0byBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIGZvdXIgYWRqYWNlbnQgdHlwZSBJTlRFUiBNQnMgKExlZnQsIFRvcCwgCi0gKiAgICAgICAgICAgIFRvcC1MZWZ0LCBUb3AtUmlnaHQpLiBBbnkgcG9pbnRlciBpbiB0aGUgYXJyYXkgbWF5IGJlIHNldCBlcXVhbCAKLSAqICAgICAgICAgICAgdG8gTlVMTCBpZiB0aGUgY29ycmVzcG9uZGluZyBNQiBkb2VzbiB0IGV4aXN0IG9yIGlzIG5vdCBvZiB0eXBlIAotICogICAgICAgICAgICBJTlRFUi4gcE1CSW50ZXJbMF0gLSBQb2ludGVyIHRvIGxlZnQgTUIgaW5mb3JtYXRpb24gcE1CSW50ZXJbMV0gCi0gKiAgICAgICAgICAgIC0gUG9pbnRlciB0byB0b3AgTUIgaW5mb3JtYXRpb24gcE1CSW50ZXJbMl0gLSBQb2ludGVyIHRvIAotICogICAgICAgICAgICB0b3AtbGVmdCBNQiBpbmZvcm1hdGlvbiBwTUJJbnRlclszXSAtIFBvaW50ZXIgdG8gdG9wLXJpZ2h0IE1CIAotICogICAgICAgICAgICBpbmZvcm1hdGlvbiAKLSAqICAgcE1CSW50cmEgLSBBcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBmb3VyIGFkamFjZW50IHR5cGUgSU5UUkEgTUJzIChMZWZ0LCBUb3AsIAotICogICAgICAgICAgICBUb3AtTGVmdCwgVG9wLVJpZ2h0KS4gQW55IHBvaW50ZXIgaW4gdGhlIGFycmF5IG1heSBiZSBzZXQgZXF1YWwgCi0gKiAgICAgICAgICAgIHRvIE5VTEwgaWYgdGhlIGNvcnJlc3BvbmRpbmcgTUIgZG9lc24gdCBleGlzdCBvciBpcyBub3Qgb2YgdHlwZSAKLSAqICAgICAgICAgICAgSU5UUkEuIHBNQkludHJhWzBdIC0gUG9pbnRlciB0byBsZWZ0IE1CIGluZm9ybWF0aW9uIHBNQkludHJhWzFdIAotICogICAgICAgICAgICAtIFBvaW50ZXIgdG8gdG9wIE1CIGluZm9ybWF0aW9uIHBNQkludHJhWzJdIC0gUG9pbnRlciB0byAKLSAqICAgICAgICAgICAgdG9wLWxlZnQgTUIgaW5mb3JtYXRpb24gcE1CSW50cmFbM10gLSBQb2ludGVyIHRvIHRvcC1yaWdodCBNQiAKLSAqICAgICAgICAgICAgaW5mb3JtYXRpb24gCi0gKiAgIHBTcmNEc3RNQkN1cnIgLSBQb2ludGVyIHRvIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgTUIuICAKLSAqICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBlbnRyaWVzIHNob3VsZCBiZSBzZXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgCi0gKiAgICAgICAgICAgIGZ1bmN0aW9uOiAgc2xpY2VJRCAtIHRoZSBudW1iZXIgb2YgdGhlIHNsaWNlIHRoZSB0byB3aGljaCB0aGUgCi0gKiAgICAgICAgICAgIGN1cnJlbnQgTUIgYmVsb25ncy4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RDb3N0IC0gUG9pbnRlciB0byB0aGUgbWluaW11bSBtb3Rpb24gY29zdCBmb3IgdGhlIGN1cnJlbnQgTUIuIAotICogICBwRHN0QmxvY2tTQUQgLSBQb2ludGVyIHRvIHRoZSBhcnJheSBvZiBTQURzIGZvciBlYWNoIG9mIHRoZSBzaXh0ZWVuIGx1bWEgCi0gKiAgICAgICAgICAgIDR4NCBibG9ja3MgaW4gZWFjaCBNQi4gIFRoZSBibG9jayBTQURzIGFyZSBpbiBzY2FuIG9yZGVyIGZvciAKLSAqICAgICAgICAgICAgZWFjaCBNQi4gIEZvciBpbXBsZW1lbnRhdGlvbnMgdGhhdCBjYW5ub3QgY29tcHV0ZSB0aGUgU0FEIHZhbHVlcyAKLSAqICAgICAgICAgICAgaW5kaXZpZHVhbGx5LCB0aGUgbWF4aW11bSBwb3NzaWJsZSB2YWx1ZSAoMHhmZmZmKSBpcyByZXR1cm5lZCAKLSAqICAgICAgICAgICAgZm9yIGVhY2ggb2YgdGhlIDE2IGJsb2NrIFNBRCBlbnRyaWVzLiAKLSAqICAgcFNyY0RzdE1CQ3VyciAtIFBvaW50ZXIgdG8gdXBkYXRlZCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBNQiBhZnRlciBNQi1sZXZlbCBtb3Rpb24gZXN0aW1hdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQuICBUaGUgCi0gKiAgICAgICAgICAgIGZvbGxvd2luZyBmaWVsZHMgYXJlIHVwZGF0ZWQgYnkgdGhlIE1FIGZ1bmN0aW9uLiAgIFRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgIHBhcmFtZXRlciBzZXQgcXVhbnRpZmllcyB0aGUgTUItbGV2ZWwgTUUgc2VhcmNoIHJlc3VsdHM6IE1iVHlwZSAKLSAqICAgICAgICAgICAgc3ViTUJUeXBlWzRdIHBNVjBbNF1bNF0gcE1WUHJlZFs0XVs0XSBwUmVmTDBJZHhbNF0gCi0gKiAgICAgICAgICAgIEludHJhMTZ4MTZQcmVkTW9kZSBwSW50cmE0eDRQcmVkTW9kZVs0XVs0XSAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgIE9uZSBvZiBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0N1cnJCdWYsIAotICogICAgICAgICAgIHBTcmNSZWZCdWZMaXN0LCBwU3JjUmVjQnVmLCBwUmVmUmVjdCwgcEN1cnJQb2ludFBvcywgcE1FU3BlYywgCi0gKiAgICAgICAgICAgcE1CSW50ZXIsIHBNQkludHJhLHBTcmNEc3RNQkN1cnIsIHBEc3RDb3N0LCBwU3JjUmVmQnVmTGlzdFswXSAKLSAqICAgIC0gICAgU3JjUmVmU3RlcCwgU3JjUmVjU3RlcCBhcmUgbm90IG11bHRpcGxlcyBvZiAxNiAKLSAqICAgIC0gICAgaUJsb2NrV2lkdGggb3IgaUJsb2NrSGVpZ2h0IGFyZSB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNi4gCi0gKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLSAKLU9NWFJlc3VsdCBvbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiggICAgICAgICAgICAgICAgICAgIAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCU9NWF9TMzIgU3JjQ3VyclN0ZXAsIAotCWNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1Zkxpc3RbQVJNX1ZDTTRQMTBfTUFYX0ZSQU1FU10sCi0JT01YX1MzMiBTcmNSZWZTdGVwLAotCWNvbnN0IE9NWF9VOCAqcFNyY1JlY0J1ZiwgCi0JT01YX1MzMiBTcmNSZWNTdGVwLAotCWNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotCWNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCi0JT01YX1UzMiBMYW1iZGEsCi0Jdm9pZCAqcE1FU3BlYywKLQljb25zdCBPTVhWQ000UDEwTUJJbmZvUHRyICpwTUJJbnRlciwgCi0JY29uc3QgT01YVkNNNFAxME1CSW5mb1B0ciAqcE1CSW50cmEsCi0gICAgT01YVkNNNFAxME1CSW5mbyAqcFNyY0RzdE1CQ3VyciwKLQlPTVhfSU5UICpwRHN0Q29zdCwKLSAgICBPTVhfVTE2ICpwRHN0QmxvY2tTQUQpCi17Ci0gICAgT01YX1UzMiAgICAgQ29zdCwgaSwgSW50cmFGbGFnID0gMTsKLSAgICBPTVhWQ000UDEwTUVQYXJhbXMgICpwTUVQYXJhbXM7IAotCi0gICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY0N1cnJCdWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZkJ1Zkxpc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY1JlY0J1ZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwUmVmUmVjdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwQ3VyclBvaW50UG9zID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBNRVNwZWMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocE1CSW50ZXIgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocE1CSW50cmEgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdE1CQ3VyciA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0Q29zdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihTcmNSZWZTdGVwIDw9IDAgfHwgU3JjUmVmU3RlcCAmIDE1LCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihTcmNSZWNTdGVwIDw9IDAgfHwgU3JjUmVjU3RlcCAmIDE1LCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihTcmNDdXJyU3RlcCA8PSAwIHx8IFNyY0N1cnJTdGVwICYgMTUsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIAotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDE2Qnl0ZUFsaWduZWQocFNyY0N1cnJCdWYpLCBPTVhfU3RzX0JhZEFyZ0VycikgICAgCi0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90MTZCeXRlQWxpZ25lZChwU3JjUmVjQnVmKSwgT01YX1N0c19CYWRBcmdFcnIpCi0KLSAgICBmb3IgKGkgPSAwOyBpIDwgQVJNX1ZDTTRQMTBfTUFYX0ZSQU1FUzsgaSsrKQotICAgIHsKLSAgICAgICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZkJ1Zkxpc3QgW2ldICE9IE5VTEwgJiYKLSAgICAgICAgICAgIGFybU5vdDE2Qnl0ZUFsaWduZWQocFNyY1JlZkJ1Zkxpc3QgW2ldKSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgICAgICAgICAKLSAgICAgICAgLyogQ2hlY2sgaWYgY3VycmVudCBNQiBuZWVkcyBJTlRFUiBjb3N0IGNhbGN1bGF0aW9ucyAqLwotICAgICAgICBpZiAocFNyY1JlZkJ1Zkxpc3QgW2ldICE9IE5VTEwgJiYgSW50cmFGbGFnID09IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEludHJhRmxhZyA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAqcERzdENvc3QgPSBBUk1fVkNNNFAxMF9NQVhfQ09TVDsKLSAgICAvKgotICAgICAqIEludGVyIGNvc3QgY2FsY3VsYXRpb25zIAotICAgICAqLwotCi0gICAgIC8qIGNoZWNrIHRoaXMgTUIgY2FuIGJlIEludGVyICovCi0gICAgaWYgKEludHJhRmxhZyAhPSAxKQotICAgIHsKLSAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJNRU1CKAotICAgICAgICAgICAgIHBTcmNDdXJyQnVmLCAgIAotICAgICAgICAgICAgIFNyY0N1cnJTdGVwLAotICAgICAgICAgICAgIHBTcmNSZWZCdWZMaXN0LCAgIAotICAgICAgICAgICAgIFNyY1JlZlN0ZXAsCi0gICAgICAgICAgICAgcFJlZlJlY3QsICAgIAotICAgICAgICAgICAgIHBDdXJyUG9pbnRQb3MsCi0gICAgICAgICAgICAgTGFtYmRhLAotICAgICAgICAgICAgIHBNRVNwZWMsCi0gICAgICAgICAgICAgcE1CSW50ZXIsCi0gICAgICAgICAgICAgcFNyY0RzdE1CQ3VyciwKLSAgICAgICAgICAgICAmQ29zdAotICAgICAgICAgICAgICk7Ci0gICAgICAgIAotICAgICAgICAqcERzdENvc3QgPSBDb3N0OwotICAgIH0gICAgIAotCi0gICAgcE1FUGFyYW1zID0gKE9NWFZDTTRQMTBNRVBhcmFtcyAqKXBNRVNwZWM7Ci0gICAgCi0gICAgaWYgKHBNRVBhcmFtcy0+aW50cmFFbmFibGU0eDQgPT0gMSkKLSAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIEludHJhIDR4NCBjb3N0IGNhbGN1bGF0aW9ucwotICAgICAgICAgKi8KLSAgICAgICAgYXJtVkNNNFAxMF9JbnRyYTR4NEVzdGltYXRpb24oCi0gICAgICAgICAgICBwU3JjQ3VyckJ1ZiwgICAKLSAgICAgICAgICAgIFNyY0N1cnJTdGVwLAotICAgICAgICAgICAgcFNyY1JlY0J1ZiwgICAKLSAgICAgICAgICAgIFNyY1JlY1N0ZXAsCi0gICAgICAgICAgICBwTUJJbnRyYSwKLSAgICAgICAgICAgIHBTcmNEc3RNQkN1cnIsCi0gICAgICAgICAgICAmQ29zdAotICAgICAgICAgICAgKTsKLQotICAgICAgICBpZiAoQ29zdCA8PSAqcERzdENvc3QpCi0gICAgICAgIHsKLSAgICAgICAgICAgICpwRHN0Q29zdCA9IENvc3Q7Ci0gICAgICAgICAgICBwU3JjRHN0TUJDdXJyLT5tYlR5cGUgPSBPTVhfVkNfSU5UUkFfNHg0OwotCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDb3N0IGZvciBJbnRyYSAxNngxNiBtb2RlCi0gICAgICovCi0KLSAgICBhcm1WQ000UDEwX0ludHJhMTZ4MTZFc3RpbWF0aW9uKAotICAgICAgICBwU3JjQ3VyckJ1ZiwgICAKLSAgICAgICAgU3JjQ3VyclN0ZXAsCi0gICAgICAgIHBTcmNSZWNCdWYsICAgCi0gICAgICAgIFNyY1JlY1N0ZXAsCi0gICAgICAgIHBDdXJyUG9pbnRQb3MsCi0gICAgICAgIHBNQkludGVyLAotICAgICAgICBwTUJJbnRyYSwKLSAgICAgICAgcFNyY0RzdE1CQ3VyciwKLSAgICAgICAgJkNvc3QKLSAgICAgICAgKTsKLQotICAgIGlmIChDb3N0IDw9ICpwRHN0Q29zdCkKLSAgICB7Ci0gICAgICAgICpwRHN0Q29zdCA9IENvc3Q7Ci0gICAgICAgIHBTcmNEc3RNQkN1cnItPm1iVHlwZSA9IE9NWF9WQ19JTlRSQV8xNngxNjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFVwZGF0ZSBwRHN0QmxvY2tTQUQgdG8gbWF4IHZhbHVlCi0gICAgICovCi0JYXJtVkNNNFAxMF9DYWxjdWxhdGVCbG9ja1NBRCgJcFNyY0RzdE1CQ3VyciwgCi0gICAgICAgIHBTcmNDdXJyQnVmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAJU3JjQ3VyclN0ZXAsIAotICAgIAlwU3JjUmVmQnVmTGlzdCwKLSAgICAJU3JjUmVmU3RlcCwKLSAgICAJcFNyY1JlY0J1ZiwgCi0gICAgCVNyY1JlY1N0ZXAsCi0gICAgCXBSZWZSZWN0LAotICAgIAlwQ3VyclBvaW50UG9zLAotICAgIAlwTUJJbnRlciwgCi0gICAgCXBNQkludHJhLAotICAgIAlwRHN0QmxvY2tTQUQpOwotCi0KLQlyZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NTA3NzEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4LmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBILjI2NCBDaHJvbWEgOHg4IGludHJhIHByZWRpY3Rpb24gbW9kdWxlCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtIERDIHN0eWxlIGludHJhIHByZWRpY3Rpb24sIHVwcGVyIGJsb2NrIGhhcyBwcmlvcml0eQotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBTcmNMZWZ0CQlQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgbGVmdCBjb2VmZmljaWVudHM6Ci0gKgkJCQkJCQkJcFt4LCB5XSAoeCA9IC0xLCB5ID0gMC4uMykKLSAqIFtpbl0JcFNyY0Fib3ZlCQlQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgYWJvdmUgY29lZmZpY2llbnRzOgotICoJCQkJCQkJCXBbeCx5XSAoeCA9IDAuLjMsIHkgPSAtMSkKLSAqIFtpbl0JbGVmdFN0ZXAJCVN0ZXAgb2YgbGVmdCBjb2VmZmljaWVudCBidWZmZXIKLSAqIFtpbl0JZHN0U3RlcAkJCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgotICogW2luXQlhdmFpbGFiaWxpdHkJTmVpZ2hib3JpbmcgMTZ4MTYgTUIgYXZhaWxhYmlsaXR5IGZsYWcKLSAqIFtvdXRdCXBEc3QJCQlQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBOb25lCi0gKi8KLQotc3RhdGljIHZvaWQgYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQ1VwNHg0KAotICAgICBjb25zdCBPTVhfVTgqIHBTcmNMZWZ0LAotICAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwKLSAgICAgT01YX1U4KiBwRHN0LAotICAgICBPTVhfSU5UIGxlZnRTdGVwLAotICAgICBPTVhfSU5UIGRzdFN0ZXAsCi0gICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5ICAgICAgICAKLSkKLXsKLSAgICBpbnQgeCwgeSwgU3VtPTAsIENvdW50ID0gMDsKLQotICAgIGlmIChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpCi0gICAgewotICAgICAgICBmb3IgKHg9MDsgeDw0OyB4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN1bSArPSBwU3JjQWJvdmVbeF07Ci0gICAgICAgIH0KLSAgICAgICAgQ291bnQrKzsKLSAgICB9Ci0gICAgZWxzZSBpZiAoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX0xFRlQpCi0gICAgewotICAgICAgICBmb3IgKHk9MDsgeTw0OyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN1bSArPSBwU3JjTGVmdFt5KmxlZnRTdGVwXTsKLSAgICAgICAgfQotICAgICAgICBDb3VudCsrOwotICAgIH0KLSAgICBpZiAoQ291bnQ9PTApCi0gICAgewotICAgICAgICBTdW0gPSAxMjg7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIFN1bSA9IChTdW0gKyAyKSA+PiAyOwotICAgIH0KLSAgICBmb3IgKHk9MDsgeTw0OyB5KyspCi0gICAgewotICAgICAgICBmb3IgKHg9MDsgeDw0OyB4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwK3hdID0gKE9NWF9VOClTdW07Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8qCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm0gREMgc3R5bGUgaW50cmEgcHJlZGljdGlvbiwgbGVmdCBibG9jayBoYXMgcHJpb3JpdHkKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwU3JjTGVmdAkJUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGxlZnQgY29lZmZpY2llbnRzOgotICoJCQkJCQkJCXBbeCwgeV0gKHggPSAtMSwgeSA9IDAuLjMpCi0gKiBbaW5dCXBTcmNBYm92ZQkJUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGFib3ZlIGNvZWZmaWNpZW50czoKLSAqCQkJCQkJCQlwW3gseV0gKHggPSAwLi4zLCB5ID0gLTEpCi0gKiBbaW5dCWxlZnRTdGVwCQlTdGVwIG9mIGxlZnQgY29lZmZpY2llbnQgYnVmZmVyCi0gKiBbaW5dCWRzdFN0ZXAJCQlTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKLSAqIFtpbl0JYXZhaWxhYmlsaXR5CU5laWdoYm9yaW5nIDE2eDE2IE1CIGF2YWlsYWJpbGl0eSBmbGFnCi0gKiBbb3V0XQlwRHN0CQkJUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogTm9uZQotICovCi0KLXN0YXRpYyB2b2lkIGFybVZDTTRQMTBfUHJlZGljdEludHJhRENMZWZ0NHg0KAotICAgICBjb25zdCBPTVhfVTgqIHBTcmNMZWZ0LAotICAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwKLSAgICAgT01YX1U4KiBwRHN0LAotICAgICBPTVhfSU5UIGxlZnRTdGVwLAotICAgICBPTVhfSU5UIGRzdFN0ZXAsCi0gICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5ICAgICAgICAKLSkKLXsKLSAgICBpbnQgeCwgeSwgU3VtPTAsIENvdW50ID0gMDsKLQotICAgIGlmIChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfTEVGVCkKLSAgICB7Ci0gICAgICAgIGZvciAoeT0wOyB5PDQ7IHkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU3VtICs9IHBTcmNMZWZ0W3kqbGVmdFN0ZXBdOwotICAgICAgICB9Ci0gICAgICAgIENvdW50Kys7Ci0gICAgfQotICAgIGVsc2UgaWYgKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUikKLSAgICB7Ci0gICAgICAgIGZvciAoeD0wOyB4PDQ7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgU3VtICs9IHBTcmNBYm92ZVt4XTsKLSAgICAgICAgfQotICAgICAgICBDb3VudCsrOwotICAgIH0KLSAgICBpZiAoQ291bnQ9PTApCi0gICAgewotICAgICAgICBTdW0gPSAxMjg7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIFN1bSA9IChTdW0gKyAyKSA+PiAyOwotICAgIH0KLSAgICBmb3IgKHk9MDsgeTw0OyB5KyspCi0gICAgewotICAgICAgICBmb3IgKHg9MDsgeDw0OyB4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwK3hdID0gKE9NWF9VOClTdW07Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDggICAoNi4zLjMuMS4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgaW50cmEgcHJlZGljdGlvbiBmb3IgY2hyb21hIHNhbXBsZXMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNMZWZ0IC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDggbGVmdCBwaXhlbHM6IHBbeCwgeV0gKHggPSAtMSwgeT0gCi0gKiAgICAgICAgICAgIDAuLjcpLiAKLSAqICAgcFNyY0Fib3ZlIC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDggYWJvdmUgcGl4ZWxzOiBwW3gseV0gKHggPSAwLi43LCB5IAotICogICAgICAgICAgICA9IC0xKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBTcmNBYm92ZUxlZnQgLSBQb2ludGVyIHRvIHRoZSBhYm92ZSBsZWZ0IHBpeGVsczogcFt4LHldICh4ID0gLTEsIHkgPSAtMSkgCi0gKiAgIGxlZnRTdGVwIC0gU3RlcCBvZiBsZWZ0IHBpeGVsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBkc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIHByZWRNb2RlIC0gSW50cmEgY2hyb21hIHByZWRpY3Rpb24gbW9kZSwgcGxlYXNlIHJlZmVyIHRvIHNlY3Rpb24gMy40LjMuIAotICogICBhdmFpbGFiaWxpdHkgLSBOZWlnaGJvcmluZyBjaHJvbWEgYmxvY2sgYXZhaWxhYmlsaXR5IGZsYWcsIHBsZWFzZSByZWZlciAKLSAqICAgICAgICAgICAgdG8gICJOZWlnaGJvcmluZyBNYWNyb2Jsb2NrIEF2YWlsYWJpbGl0eSIuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKLSAqICAgIElmIGFueSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCi0gKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAotICogICAgcERzdCBpcyBOVUxMLiAKLSAqICAgIGRzdFN0ZXAgPCA4IG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICBsZWZ0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIHByZWRNb2RlIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgZW51bWVyYXRpb24gCi0gKiAgICAgICAgICAgICAgT01YVkNNNFAxMEludHJhQ2hyb21hUHJlZE1vZGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDX0NIUk9NQV9WRVJULCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAotICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUiBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi43KSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ19DSFJPTUFfSE9SLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19MRUZUIAotICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFstMSx5XSAoeSA9IDAuLjcpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDX0NIUk9NQV9QTEFORSwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKLSAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKLSAqICAgICAgICAgICAgICBwW3gsLTFdKHggPSAwLi43KSwgb3IgcFstMSx5XSAoeSA9IDAuLjcpLCBvciBwWy0xLC0xXSBpcyBub3QgCi0gKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUiwgYnV0IHBTcmNBYm92ZSBpcyBOVUxMLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19MRUZULCBidXQgcFNyY0xlZnQgaXMgTlVMTC4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVJfTEVGVCwgYnV0IHBTcmNBYm92ZUxlZnQgaXMgTlVMTC4gCi0gKiAgICBlaXRoZXIgcFNyY0Fib3ZlIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkuICBOb3RlOiAKLSAqICAgICAgICAgICAgICBwU3JjQWJvdmUsIHBTcmNBYm92ZSwgcFNyY0Fib3ZlTGVmdCBtYXkgYmUgaW52YWxpZCBwb2ludGVyIGlmIAotICogICAgICAgICAgICAgIHRoZXkgYXJlIG5vdCB1c2VkIGJ5IGludHJhIHByZWRpY3Rpb24gaW1wbGllZCBpbiBwcmVkTW9kZS4gCi0gKiAgICAgICAgICAgICAgIE5vdGU6IE9NWF9WQ19VUFBFUl9SSUdIVCBpcyBub3QgdXNlZCBpbiBpbnRyYSBjaHJvbWEgCi0gKiAgICAgICAgICAgICAgcHJlZGljdGlvbi4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4KAotICAgICBjb25zdCBPTVhfVTgqIHBTcmNMZWZ0LAotICAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmVMZWZ0LAotICAgICBPTVhfVTgqIHBEc3QsCi0gICAgIE9NWF9JTlQgbGVmdFN0ZXAsCi0gICAgIE9NWF9JTlQgZHN0U3RlcCwKLSAgICAgT01YVkNNNFAxMEludHJhQ2hyb21hUHJlZE1vZGUgcHJlZE1vZGUsCi0gICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5ICAgICAgICAKLSApCi17Ci0gICAgaW50IHgsIHksIFN1bTsKLSAgICBpbnQgSCwgViwgYSwgYiwgYzsKLQotICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGRzdFN0ZXAgPCA4LCAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChkc3RTdGVwICUgOCkgIT0gMCwgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigobGVmdFN0ZXAgJSA4KSAhPSAwLCAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwU3JjQWJvdmUpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUikgICAgICAmJiBwU3JjQWJvdmUgICAgID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX0xFRlQgKSAgICAgICYmIHBTcmNMZWZ0ICAgICAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVJfTEVGVCkgJiYgcFNyY0Fib3ZlTGVmdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ19DSFJPTUFfVkVSVCAgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpLCAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDX0NIUk9NQV9IT1IgICAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19MRUZUKSwgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfQ0hST01BX1BMQU5FICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSKSwgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ19DSFJPTUFfUExBTkUgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVJfTEVGVCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDX0NIUk9NQV9QTEFORSAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19MRUZUKSwgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCh1bnNpZ25lZClwcmVkTW9kZSA+IE9NWF9WQ19DSFJPTUFfUExBTkUsICAgT01YX1N0c19CYWRBcmdFcnIpOyAgICAKLQotICAgIHN3aXRjaCAocHJlZE1vZGUpCi0gICAgewotICAgIGNhc2UgT01YX1ZDX0NIUk9NQV9EQzoKLSAgICAgICAgYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQzR4NCggICAgICAgcFNyY0xlZnQsICAgICAgICAgICAgcFNyY0Fib3ZlLCAgIHBEc3QsICAgICAgICAgICAgIGxlZnRTdGVwLCBkc3RTdGVwLCBhdmFpbGFiaWxpdHkpOwotICAgICAgICBhcm1WQ000UDEwX1ByZWRpY3RJbnRyYURDVXA0eDQoICAgICBwU3JjTGVmdCwgICAgICAgICAgICBwU3JjQWJvdmUrNCwgcERzdCs0LCAgICAgICAgICAgbGVmdFN0ZXAsIGRzdFN0ZXAsIGF2YWlsYWJpbGl0eSk7Ci0gICAgICAgIGFybVZDTTRQMTBfUHJlZGljdEludHJhRENMZWZ0NHg0KCAgIHBTcmNMZWZ0KzQqbGVmdFN0ZXAsIHBTcmNBYm92ZSwgICBwRHN0KzQqZHN0U3RlcCwgICBsZWZ0U3RlcCwgZHN0U3RlcCwgYXZhaWxhYmlsaXR5KTsKLSAgICAgICAgYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQzR4NCggICAgICAgcFNyY0xlZnQrNCpsZWZ0U3RlcCwgcFNyY0Fib3ZlKzQsIHBEc3QrNCs0KmRzdFN0ZXAsIGxlZnRTdGVwLCBkc3RTdGVwLCBhdmFpbGFiaWxpdHkpOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgT01YX1ZDX0NIUk9NQV9IT1I6Ci0gICAgICAgIGZvciAoeT0wOyB5PDg7IHkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICh4PTA7IHg8ODsgeCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwK3hdID0gcFNyY0xlZnRbeSpsZWZ0U3RlcF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9NWF9WQ19DSFJPTUFfVkVSVDoKLSAgICAgICAgZm9yICh5PTA7IHk8ODsgeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKHg9MDsgeDw4OyB4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSBwU3JjQWJvdmVbeF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9NWF9WQ19DSFJPTUFfUExBTkU6Ci0gICAgICAgIEggPSA0KihwU3JjQWJvdmVbN10gLSBwU3JjQWJvdmVMZWZ0WzBdKTsKLSAgICAgICAgZm9yICh4PTI7IHg+PTA7IHgtLSkKLSAgICAgICAgewotICAgICAgICAgICAgSCArPSAoeCsxKSoocFNyY0Fib3ZlWzQreF0gLSBwU3JjQWJvdmVbMi14XSk7Ci0gICAgICAgIH0KLSAgICAgICAgViA9IDQqKHBTcmNMZWZ0WzcqbGVmdFN0ZXBdIC0gcFNyY0Fib3ZlTGVmdFswXSk7Ci0gICAgICAgIGZvciAoeT0yOyB5Pj0wOyB5LS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIFYgKz0gKHkrMSkqKHBTcmNMZWZ0Wyg0K3kpKmxlZnRTdGVwXSAtIHBTcmNMZWZ0WygyLXkpKmxlZnRTdGVwXSk7Ci0gICAgICAgIH0KLSAgICAgICAgYSA9IDE2KihwU3JjQWJvdmVbN10gKyBwU3JjTGVmdFs3KmxlZnRTdGVwXSk7Ci0gICAgICAgIGIgPSAoMTcqSCsxNik+PjU7Ci0gICAgICAgIGMgPSAoMTcqVisxNik+PjU7Ci0gICAgICAgIGZvciAoeT0wOyB5PDg7IHkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICh4PTA7IHg8ODsgeCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN1bSA9IChhICsgYiooeC0zKSArIGMqKHktMykgKyAxNik+PjU7Ci0gICAgICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSAoT01YX1U4KWFybUNsaXAoMCwyNTUsU3VtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzQ0NTI2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEguMjY0IDE2eDE2IGludHJhIHByZWRpY3Rpb24gbW9kdWxlCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYgICAoNi4zLjMuMS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybSBJbnRyYV8xNngxNiBwcmVkaWN0aW9uIGZvciBsdW1hIHNhbXBsZXMuIElmIHRoZSB1cHBlci1yaWdodCBibG9jayAKLSAqIGlzIG5vdCBhdmFpbGFibGUsIHRoZW4gZHVwbGljYXRpb24gd29yayBzaG91bGQgYmUgaGFuZGxlZCBpbnNpZGUgdGhlIAotICogZnVuY3Rpb24uIFVzZXJzIG5lZWQgbm90IGRlZmluZSB0aGVtIG91dHNpZGUuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNMZWZ0IC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGxlZnQgcGl4ZWxzOiBwW3gsIHldICh4ID0gLTEsIHkgPSAKLSAqICAgICAgICAgICAgMC4uMTUpIAotICogICBwU3JjQWJvdmUgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgYWJvdmUgcGl4ZWxzOiBwW3gseV0gKHggPSAwLi4xNSwgCi0gKiAgICAgICAgICAgIHk9IC0xKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBTcmNBYm92ZUxlZnQgLSBQb2ludGVyIHRvIHRoZSBhYm92ZSBsZWZ0IHBpeGVsczogcFt4LHldICh4ID0gLTEsIHkgPSAtMSkgCi0gKiAgIGxlZnRTdGVwIC0gU3RlcCBvZiBsZWZ0IHBpeGVsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgZHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgcHJlZE1vZGUgLSBJbnRyYV8xNngxNiBwcmVkaWN0aW9uIG1vZGUsIHBsZWFzZSByZWZlciB0byBzZWN0aW9uIDMuNC4xLiAKLSAqICAgYXZhaWxhYmlsaXR5IC0gTmVpZ2hib3JpbmcgMTZ4MTYgTUIgYXZhaWxhYmlsaXR5IGZsYWcuIFJlZmVyIHRvIAotICogICAgICAgICAgICAgICAgICBzZWN0aW9uIDMuNC40LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKLSAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCi0gKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAotICogICAgcERzdCBpcyBOVUxMLiAKLSAqICAgIGRzdFN0ZXAgPCAxNi4gb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgICBsZWZ0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgICBwcmVkTW9kZSBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlIG9mIGVudW1lcmF0aW9uIAotICogICAgICAgICAgICAgIE9NWFZDTTRQMTBJbnRyYTE2eDE2UHJlZE1vZGUgCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfMTZYMTZfVkVSVCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKLSAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVIgaW5kaWNhdGluZyBwW3gsLTFdICh4ID0gMC4uMTUpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzE2WDE2X0hPUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfTEVGVCAKLSAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbLTEseV0gKHkgPSAwLi4xNSkgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfMTZYMTZfUExBTkUsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCi0gKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCi0gKiAgICAgICAgICAgICAgcFt4LC0xXSh4ID0gMC4uMTUpLCBvciBwWy0xLHldICh5ID0gMC4uMTUpLCBvciBwWy0xLC0xXSBpcyBub3QgCi0gKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUiwgYnV0IHBTcmNBYm92ZSBpcyBOVUxMLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19MRUZULCBidXQgcFNyY0xlZnQgaXMgTlVMTC4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVJfTEVGVCwgYnV0IHBTcmNBYm92ZUxlZnQgaXMgTlVMTC4gCi0gKiAgICBlaXRoZXIgcFNyY0Fib3ZlIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgCi0gKgotICogTm90ZTogCi0gKiAgICAgcFNyY0Fib3ZlLCBwU3JjQWJvdmUsIHBTcmNBYm92ZUxlZnQgbWF5IGJlIGludmFsaWQgcG9pbnRlcnMgaWYgCi0gKiAgICAgdGhleSBhcmUgbm90IHVzZWQgYnkgaW50cmEgcHJlZGljdGlvbiBpbXBsaWVkIGluIHByZWRNb2RlLiAKLSAqIE5vdGU6IAotICogICAgIE9NWF9WQ19VUFBFUl9SSUdIVCBpcyBub3QgdXNlZCBpbiBpbnRyYV8xNngxNiBsdW1hIHByZWRpY3Rpb24uIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2KAotICAgIGNvbnN0IE9NWF9VOCogcFNyY0xlZnQsIAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLCAKLSAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZUxlZnQsIAotICAgIE9NWF9VOCogcERzdCwgCi0gICAgT01YX0lOVCBsZWZ0U3RlcCwgCi0gICAgT01YX0lOVCBkc3RTdGVwLCAKLSAgICBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlIHByZWRNb2RlLCAKLSAgICBPTVhfUzMyIGF2YWlsYWJpbGl0eSkKLXsKLSAgICBpbnQgeCx5LFN1bSxDb3VudDsKLSAgICBpbnQgSCxWLGEsYixjOwotCi0gICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoZHN0U3RlcCA8IDE2LCAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChkc3RTdGVwICUgMTYpICE9IDAsICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKGxlZnRTdGVwICUgMTYpICE9IDAsICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90MTZCeXRlQWxpZ25lZChwU3JjQWJvdmUpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90MTZCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOyAgICAgICAgCi0gICAgYXJtUmV0QXJnRXJySWYoKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUikgICAgICAmJiBwU3JjQWJvdmUgICAgID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX0xFRlQgKSAgICAgICYmIHBTcmNMZWZ0ICAgICAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVJfTEVGVCkgJiYgcFNyY0Fib3ZlTGVmdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ18xNlgxNl9WRVJUICAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUiksICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfMTZYMTZfSE9SICAgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfTEVGVCksICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzE2WDE2X1BMQU5FICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSKSwgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ18xNlgxNl9QTEFORSAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUl9MRUZUKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfMTZYMTZfUExBTkUgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfTEVGVCksICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigodW5zaWduZWQpcHJlZE1vZGUgPiBPTVhfVkNfMTZYMTZfUExBTkUsICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLSAgICBzd2l0Y2ggKHByZWRNb2RlKQotICAgIHsKLSAgICBjYXNlIE9NWF9WQ18xNlgxNl9WRVJUOgotICAgICAgICBmb3IgKHk9MDsgeTwxNjsgeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKHg9MDsgeDwxNjsgeCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwK3hdID0gcFNyY0Fib3ZlW3hdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPTVhfVkNfMTZYMTZfSE9SOgotICAgICAgICBmb3IgKHk9MDsgeTwxNjsgeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKHg9MDsgeDwxNjsgeCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwK3hdID0gcFNyY0xlZnRbeSpsZWZ0U3RlcF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9NWF9WQ18xNlgxNl9EQzoKLSAgICAgICAgLyogVGhpcyBjYW4gYWx3YXlzIGJlIHVzZWQgZXZlbiBpZiBubyBibG9ja3MgYXZhaWxhYmxlICovCi0gICAgICAgIFN1bSA9IDA7Ci0gICAgICAgIENvdW50ID0gMDsKLSAgICAgICAgaWYgKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19MRUZUKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKHk9MDsgeTwxNjsgeSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN1bSArPSBwU3JjTGVmdFt5KmxlZnRTdGVwXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENvdW50Kys7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUikKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICh4PTA7IHg8MTY7IHgrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdW0gKz0gcFNyY0Fib3ZlW3hdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ291bnQrKzsKLSAgICAgICAgfQotICAgICAgICBpZiAoQ291bnQ9PTApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN1bSA9IDEyODsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChDb3VudD09MSkKLSAgICAgICAgewotICAgICAgICAgICAgU3VtID0gKFN1bSArIDgpID4+IDQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAvKiBDb3VudCA9IDIgKi8KLSAgICAgICAgewotICAgICAgICAgICAgU3VtID0gKFN1bSArIDE2KSA+PiA1OwotICAgICAgICB9Ci0gICAgICAgIGZvciAoeT0wOyB5PDE2OyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoeD0wOyB4PDE2OyB4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSAoT01YX1U4KVN1bTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgT01YX1ZDXzE2WDE2X1BMQU5FOgotICAgICAgICBIID0gOCoocFNyY0Fib3ZlWzE1XSAtIHBTcmNBYm92ZUxlZnRbMF0pOwotICAgICAgICBmb3IgKHg9NjsgeD49MDsgeC0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBIICs9ICh4KzEpKihwU3JjQWJvdmVbOCt4XSAtIHBTcmNBYm92ZVs2LXhdKTsKLSAgICAgICAgfQotICAgICAgICBWID0gOCoocFNyY0xlZnRbMTUqbGVmdFN0ZXBdIC0gcFNyY0Fib3ZlTGVmdFswXSk7Ci0gICAgICAgIGZvciAoeT02OyB5Pj0wOyB5LS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIFYgKz0gKHkrMSkqKHBTcmNMZWZ0Wyg4K3kpKmxlZnRTdGVwXSAtIHBTcmNMZWZ0Wyg2LXkpKmxlZnRTdGVwXSk7Ci0gICAgICAgIH0KLSAgICAgICAgYSA9IDE2KihwU3JjQWJvdmVbMTVdICsgcFNyY0xlZnRbMTUqbGVmdFN0ZXBdKTsKLSAgICAgICAgYiA9ICg1KkgrMzIpPj42OwotICAgICAgICBjID0gKDUqViszMik+PjY7Ci0gICAgICAgIGZvciAoeT0wOyB5PDE2OyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoeD0wOyB4PDE2OyB4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3VtID0gKGEgKyBiKih4LTcpICsgYyooeS03KSArIDE2KT4+NTsKLSAgICAgICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCt4XSA9IChPTVhfVTgpYXJtQ2xpcCgwLDI1NSxTdW0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGMyNWY2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzUzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NC5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogSC4yNjQgNHg0IGludHJhIHByZWRpY3Rpb24gbW9kdWxlCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0ICAgKDYuMy4zLjEuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm0gSW50cmFfNHg0IHByZWRpY3Rpb24gZm9yIGx1bWEgc2FtcGxlcy4gSWYgdGhlIHVwcGVyLXJpZ2h0IGJsb2NrIGlzIAotICogbm90IGF2YWlsYWJsZSwgdGhlbiBkdXBsaWNhdGlvbiB3b3JrIHNob3VsZCBiZSBoYW5kbGVkIGluc2lkZSB0aGUgZnVuY3Rpb24uIAotICogVXNlcnMgbmVlZCBub3QgZGVmaW5lIHRoZW0gb3V0c2lkZS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0xlZnQgLSAgUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDQgbGVmdCBwaXhlbHM6IAotICogICAgICAgICAgICAgICAgICBwW3gsIHldICh4ID0gLTEsIHkgPSAwLi4zKSAKLSAqICAgcFNyY0Fib3ZlIC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDggYWJvdmUgcGl4ZWxzOiAKLSAqICAgICAgICAgICAgICAgICAgcFt4LHldICh4ID0gMC4uNywgeSA9LTEpOyAKLSAqICAgICAgICAgICAgICAgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFNyY0Fib3ZlTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGFib3ZlIGxlZnQgcGl4ZWxzOiBwW3gseV0gKHggPSAtMSwgeSA9IC0xKSAKLSAqICAgbGVmdFN0ZXAgLSBTdGVwIG9mIGxlZnQgcGl4ZWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIGRzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgcHJlZE1vZGUgLSBJbnRyYV80eDQgcHJlZGljdGlvbiBtb2RlLiAKLSAqICAgYXZhaWxhYmlsaXR5IC0gTmVpZ2hib3JpbmcgNHg0IGJsb2NrIGF2YWlsYWJpbGl0eSBmbGFnLCByZWZlciB0byAKLSAqICAgICAgICAgICAgICJOZWlnaGJvcmluZyBNYWNyb2Jsb2NrIEF2YWlsYWJpbGl0eSIgLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKLSAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCi0gKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAotICogICAgcERzdCBpcyBOVUxMLiAKLSAqICAgIGRzdFN0ZXAgPCA0LCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIAotICogICAgbGVmdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgICBwcmVkTW9kZSBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlIG9mIGVudW1lcmF0aW9uIAotICogICAgICAgICAgICAgIE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfVkVSVCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfVVBQRVIgCi0gKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwW3gsLTFdICh4ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0hPUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfTEVGVCAKLSAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbLTEseV0gKHkgPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfRElBR19ETCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKLSAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVIgaW5kaWNhdGluZyBwW3gsIDFdICh4ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0RJQUdfRFIsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCi0gKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCi0gKiAgICAgICAgICAgICAgcFt4LC0xXSAoeCA9IDAuLjMpLCBvciBwWy0xLHldICh5ID0gMC4uMykgb3IgcFstMSwtMV0gaXMgbm90IAotICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X1ZSLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAotICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAotICogICAgICAgICAgICAgIHBbeCwtMV0gKHggPSAwLi4zKSwgb3IgcFstMSx5XSAoeSA9IDAuLjMpIG9yIHBbLTEsLTFdIGlzIG5vdCAKLSAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9IRCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKLSAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKLSAqICAgICAgICAgICAgICBwW3gsLTFdICh4ID0gMC4uMyksIG9yIHBbLTEseV0gKHkgPSAwLi4zKSBvciBwWy0xLC0xXSBpcyBub3QgCi0gKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfVkwsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX1VQUEVSIAotICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFt4LC0xXSAoeCA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9IVSwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfTEVGVCAKLSAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbLTEseV0gKHkgPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUiwgYnV0IHBTcmNBYm92ZSBpcyBOVUxMLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19MRUZULCBidXQgcFNyY0xlZnQgaXMgTlVMTC4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVJfTEVGVCwgYnV0IHBTcmNBYm92ZUxlZnQgaXMgTlVMTC4gCi0gKiAgICBlaXRoZXIgcFNyY0Fib3ZlIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICAKLSAqCi0gKiBOb3RlOiAKLSAqICAgICBwU3JjQWJvdmUsIHBTcmNBYm92ZSwgcFNyY0Fib3ZlTGVmdCBtYXkgYmUgaW52YWxpZCBwb2ludGVycyBpZiAKLSAqICAgICB0aGV5IGFyZSBub3QgdXNlZCBieSBpbnRyYSBwcmVkaWN0aW9uIGFzIGltcGxpZWQgaW4gcHJlZE1vZGUuIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0KAotICAgICBjb25zdCBPTVhfVTgqIHBTcmNMZWZ0LAotICAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmVMZWZ0LAotICAgICBPTVhfVTgqIHBEc3QsCi0gICAgIE9NWF9JTlQgbGVmdFN0ZXAsCi0gICAgIE9NWF9JTlQgZHN0U3RlcCwKLSAgICAgT01YVkNNNFAxMEludHJhNHg0UHJlZE1vZGUgcHJlZE1vZGUsCi0gICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5ICAgICAgICAKLSApCi17Ci0gICAgaW50IHgsIHk7Ci0gICAgT01YX1U4IHBUbXBbMTBdOwotCi0gICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKGxlZnRTdGVwICUgNCkgIT0gMCwgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoZHN0U3RlcCAlIDQpICE9IDAsICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKGRzdFN0ZXAgPCA0KSwgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFNyY0Fib3ZlKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOyAgICAKLSAgICBhcm1SZXRBcmdFcnJJZigoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSKSAgICAgICYmIHBTcmNBYm92ZSAgICAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfTEVGVCApICAgICAgJiYgcFNyY0xlZnQgICAgICA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUl9MRUZUKSAmJiBwU3JjQWJvdmVMZWZ0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzRYNF9WRVJUICAgICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSKSwgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ180WDRfSE9SICAgICAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19MRUZUKSwgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfNFg0X0RJQUdfREwgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpLCAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzRYNF9ESUFHX0RSICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSKSwgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ180WDRfRElBR19EUiAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUl9MRUZUKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfNFg0X0RJQUdfRFIgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfTEVGVCksICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzRYNF9WUiAgICAgICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSKSwgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ180WDRfVlIgICAgICAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUl9MRUZUKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfNFg0X1ZSICAgICAgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfTEVGVCksICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzRYNF9IRCAgICAgICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSKSwgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ180WDRfSEQgICAgICAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUl9MRUZUKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfNFg0X0hEICAgICAgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfTEVGVCksICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzRYNF9WTCAgICAgICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSKSwgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ180WDRfSFUgICAgICAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19MRUZUKSwgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCh1bnNpZ25lZClwcmVkTW9kZSA+IE9NWF9WQ180WDRfSFUsICAgT01YX1N0c19CYWRBcmdFcnIpOyAgICAKLSAgICAKLSAgICAvKiBOb3RlOiBUaGlzIGNvZGUgbXVzdCBub3QgcmVhZCB0aGUgcFNyYyBhcnJheXMgdW5sZXNzIHRoZSBjb3JyZXNwb25kaW5nCi0gICAgICogYmxvY2sgaXMgbWFya2VkIGFzIGF2YWlsYWJsZS4gSWYgdGhlIGJsb2NrIGlzIG5vdCBhdmFpYmFibGUgdGhlbiBwU3JjCi0gICAgICogbWF5IG5vdCBiZSBhIHZhbGlkIHBvaW50ZXIuCi0gICAgICoKLSAgICAgKiBOb3RlOiBUbyBtYWtlIHRoZSBjb2RlIG1vcmUgcmVhZGFibGUgd2UgcmVmZXIgdG8gdGhlIG5laWdoYm91cmluZyBwaXhlbHMKLSAgICAgKiBpbiB2YXJpYWJsZXMgbmFtZWQgYXMgYmVsb3c6Ci0gICAgICoKLSAgICAgKiAgICBVTCBVMCBVMSBVMiBVMyBVNCBVNSBVNiBVNwotICAgICAqICAgIEwwIHh4IHh4IHh4IHh4Ci0gICAgICogICAgTDEgeHggeHggeHggeHgKLSAgICAgKiAgICBMMiB4eCB4eCB4eCB4eAotICAgICAqICAgIEwzIHh4IHh4IHh4IHh4Ci0gICAgICovCi0gICAgIAotI2RlZmluZSBVTCBwU3JjQWJvdmVMZWZ0WzBdCi0jZGVmaW5lIFUwIHBTcmNBYm92ZVswXQotI2RlZmluZSBVMSBwU3JjQWJvdmVbMV0KLSNkZWZpbmUgVTIgcFNyY0Fib3ZlWzJdCi0jZGVmaW5lIFUzIHBTcmNBYm92ZVszXQotI2RlZmluZSBVNCBwU3JjQWJvdmVbNF0KLSNkZWZpbmUgVTUgcFNyY0Fib3ZlWzVdCi0jZGVmaW5lIFU2IHBTcmNBYm92ZVs2XQotI2RlZmluZSBVNyBwU3JjQWJvdmVbN10KLSNkZWZpbmUgTDAgcFNyY0xlZnRbMCpsZWZ0U3RlcF0KLSNkZWZpbmUgTDEgcFNyY0xlZnRbMSpsZWZ0U3RlcF0KLSNkZWZpbmUgTDIgcFNyY0xlZnRbMipsZWZ0U3RlcF0KLSNkZWZpbmUgTDMgcFNyY0xlZnRbMypsZWZ0U3RlcF0KLQotICAgIHN3aXRjaCAocHJlZE1vZGUpCi0gICAgewotICAgIGNhc2UgT01YX1ZDXzRYNF9WRVJUOgotICAgICAgICBmb3IgKHk9MDsgeTw0OyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwKzBdID0gVTA7Ci0gICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCsxXSA9IFUxOwotICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXArMl0gPSBVMjsKLSAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwKzNdID0gVTM7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9NWF9WQ180WDRfSE9SOgotICAgICAgICBmb3IgKHg9MDsgeDw0OyB4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBEc3RbMCpkc3RTdGVwK3hdID0gTDA7Ci0gICAgICAgICAgICBwRHN0WzEqZHN0U3RlcCt4XSA9IEwxOwotICAgICAgICAgICAgcERzdFsyKmRzdFN0ZXAreF0gPSBMMjsKLSAgICAgICAgICAgIHBEc3RbMypkc3RTdGVwK3hdID0gTDM7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgCi0gICAgY2FzZSBPTVhfVkNfNFg0X0RDOgotICAgICAgICAvKiBUaGlzIGNhbiBhbHdheXMgYmUgdXNlZCBldmVuIGlmIG5vIGJsb2NrcyBhdmFpbGFibGUgKi8KLSAgICAgICAgYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQzR4NChwU3JjTGVmdCwgcFNyY0Fib3ZlLCBwRHN0LCBsZWZ0U3RlcCwgZHN0U3RlcCwgYXZhaWxhYmlsaXR5KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAgIAotICAgIGNhc2UgT01YX1ZDXzRYNF9ESUFHX0RMOgotICAgICAgICBwVG1wWzBdID0gKE9NWF9VOCkoKFUwICsgMipVMSArIFUyICsgMik+PjIpOwotICAgICAgICBwVG1wWzFdID0gKE9NWF9VOCkoKFUxICsgMipVMiArIFUzICsgMik+PjIpOwotICAgICAgICBpZiAoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSX1JJR0hUKQotICAgICAgICB7Ci0gICAgICAgICAgICBwVG1wWzJdID0gKE9NWF9VOCkoKFUyICsgMipVMyArIFU0ICsgMik+PjIpOwotICAgICAgICAgICAgcFRtcFszXSA9IChPTVhfVTgpKChVMyArIDIqVTQgKyBVNSArIDIpPj4yKTsKLSAgICAgICAgICAgIHBUbXBbNF0gPSAoT01YX1U4KSgoVTQgKyAyKlU1ICsgVTYgKyAyKT4+Mik7Ci0gICAgICAgICAgICBwVG1wWzVdID0gKE9NWF9VOCkoKFU1ICsgMipVNiArIFU3ICsgMik+PjIpOwotICAgICAgICAgICAgcFRtcFs2XSA9IChPTVhfVTgpKChVNiArIDMqVTcgICAgICArIDIpPj4yKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBUbXBbMl0gPSAoT01YX1U4KSgoVTIgKyAzKlUzICAgICAgKyAyKT4+Mik7Ci0gICAgICAgICAgICBwVG1wWzNdID0gVTM7Ci0gICAgICAgICAgICBwVG1wWzRdID0gVTM7Ci0gICAgICAgICAgICBwVG1wWzVdID0gVTM7Ci0gICAgICAgICAgICBwVG1wWzZdID0gVTM7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yICh5PTA7IHk8NDsgeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKHg9MDsgeDw0OyB4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSBwVG1wW3greV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9NWF9WQ180WDRfRElBR19EUjogICAgICAgIAotICAgICAgICAvKiB4LXkgPSAtMywgLTIsIC0xLCAwLCAxLCAyLCAzICovCi0gICAgICAgIHBUbXBbMF0gPSAoT01YX1U4KSgoTDEgKyAyKkwyICsgTDMgKyAyKT4+Mik7Ci0gICAgICAgIHBUbXBbMV0gPSAoT01YX1U4KSgoTDAgKyAyKkwxICsgTDIgKyAyKT4+Mik7Ci0gICAgICAgIHBUbXBbMl0gPSAoT01YX1U4KSgoVUwgKyAyKkwwICsgTDEgKyAyKT4+Mik7Ci0gICAgICAgIHBUbXBbM10gPSAoT01YX1U4KSgoVTAgKyAyKlVMICsgTDAgKyAyKT4+Mik7Ci0gICAgICAgIHBUbXBbNF0gPSAoT01YX1U4KSgoVTEgKyAyKlUwICsgVUwgKyAyKT4+Mik7Ci0gICAgICAgIHBUbXBbNV0gPSAoT01YX1U4KSgoVTIgKyAyKlUxICsgVTAgKyAyKT4+Mik7Ci0gICAgICAgIHBUbXBbNl0gPSAoT01YX1U4KSgoVTMgKyAyKlUyICsgVTEgKyAyKT4+Mik7Ci0gICAgICAgIGZvciAoeT0wOyB5PDQ7IHkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICh4PTA7IHg8NDsgeCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwK3hdID0gcFRtcFszK3gteV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9NWF9WQ180WDRfVlI6Ci0gICAgICAgIC8qIHpWUj0yeC15ID0gLTMsIC0yLCAtMSwgMCwgMSwgMiwgMywgNCwgNSwgNgotICAgICAgICAgKiB4LSh5Pj4xKSA9IC0xLCAtMSwgIDAsIDAsIDEsIDEsIDIsIDIsIDMsIDMKLSAgICAgICAgICogeSAgICAgICAgPSAgMywgIDIsICA/LCA/LCA/LCA/LCA/LCA/LCAxLCAwCi0gICAgICAgICAqLwotICAgICAgICBwVG1wWzBdID0gKE9NWF9VOCkoKEwyICsgMipMMSArIEwwICsgMik+PjIpOwotICAgICAgICBwVG1wWzFdID0gKE9NWF9VOCkoKEwxICsgMipMMCArIFVMICsgMik+PjIpOwotICAgICAgICBwVG1wWzJdID0gKE9NWF9VOCkoKEwwICsgMipVTCArIFUwICsgMik+PjIpOwotICAgICAgICBwVG1wWzNdID0gKE9NWF9VOCkoKFVMICsgVTAgKyAxKT4+MSk7Ci0gICAgICAgIHBUbXBbNF0gPSAoT01YX1U4KSgoVUwgKyAyKlUwICsgVTEgKyAyKT4+Mik7Ci0gICAgICAgIHBUbXBbNV0gPSAoT01YX1U4KSgoVTAgKyBVMSArIDEpPj4xKTsKLSAgICAgICAgcFRtcFs2XSA9IChPTVhfVTgpKChVMCArIDIqVTEgKyBVMiArIDIpPj4yKTsKLSAgICAgICAgcFRtcFs3XSA9IChPTVhfVTgpKChVMSArIFUyICsgMSk+PjEpOwotICAgICAgICBwVG1wWzhdID0gKE9NWF9VOCkoKFUxICsgMipVMiArIFUzICsgMik+PjIpOwotICAgICAgICBwVG1wWzldID0gKE9NWF9VOCkoKFUyICsgVTMgKyAxKT4+MSk7Ci0gICAgICAgIGZvciAoeT0wOyB5PDQ7IHkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICh4PTA7IHg8NDsgeCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwK3hdID0gcFRtcFszKzIqeC15XTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgT01YX1ZDXzRYNF9IRDoKLSAgICAgICAgLyogekhEPTJ5LXggPSAtMyAtMiAtMSAgMCAgMSAgMiAgMyAgNCAgNSAgNgotICAgICAgICAgKiB5LSh4Pj4xKSA9IC0xIC0xICAwICAwICAxICAxICAyICAyICAzICAzCi0gICAgICAgICAqIHggICAgICAgID0gIDMgIDIgICAgICAgICAgICAgICAgICAgIDEgIDAKLSAgICAgICAgICovCi0gICAgICAgIHBUbXBbMF0gPSAoT01YX1U4KSgoVTIgKyAyKlUxICsgVTAgKyAyKT4+Mik7Ci0gICAgICAgIHBUbXBbMV0gPSAoT01YX1U4KSgoVTEgKyAyKlUwICsgVUwgKyAyKT4+Mik7Ci0gICAgICAgIHBUbXBbMl0gPSAoT01YX1U4KSgoVTAgKyAyKlVMICsgTDAgKyAyKT4+Mik7Ci0gICAgICAgIHBUbXBbM10gPSAoT01YX1U4KSgoVUwgKyBMMCArIDEpPj4xKTsKLSAgICAgICAgcFRtcFs0XSA9IChPTVhfVTgpKChVTCArIDIqTDAgKyBMMSArIDIpPj4yKTsKLSAgICAgICAgcFRtcFs1XSA9IChPTVhfVTgpKChMMCArIEwxICsgMSk+PjEpOwotICAgICAgICBwVG1wWzZdID0gKE9NWF9VOCkoKEwwICsgMipMMSArIEwyICsgMik+PjIpOwotICAgICAgICBwVG1wWzddID0gKE9NWF9VOCkoKEwxICsgTDIgKyAxKT4+MSk7Ci0gICAgICAgIHBUbXBbOF0gPSAoT01YX1U4KSgoTDEgKyAyKkwyICsgTDMgKyAyKT4+Mik7Ci0gICAgICAgIHBUbXBbOV0gPSAoT01YX1U4KSgoTDIgKyBMMyArIDEpPj4xKTsKLSAgICAgICAgZm9yICh5PTA7IHk8NDsgeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKHg9MDsgeDw0OyB4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSBwVG1wWzMrMip5LXhdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPTVhfVkNfNFg0X1ZMOgotICAgICAgICAvKiBOb3RlOiB4Kyh5Pj4xKSA9ICgyKngreSk+PjEKLSAgICAgICAgICogMngreSA9IDAgMSAyIDMgNCA1IDYgNyA4IDkKLSAgICAgICAgICovCi0gICAgICAgIHBUbXBbMF0gPSAoT01YX1U4KSgoVTAgKyBVMSArIDEpPj4xKTsKLSAgICAgICAgcFRtcFsxXSA9IChPTVhfVTgpKChVMCArIDIqVTEgKyBVMiArIDIpPj4yKTsKLSAgICAgICAgcFRtcFsyXSA9IChPTVhfVTgpKChVMSArIFUyICsgMSk+PjEpOwotICAgICAgICBwVG1wWzNdID0gKE9NWF9VOCkoKFUxICsgMipVMiArIFUzICsgMik+PjIpOwotICAgICAgICBwVG1wWzRdID0gKE9NWF9VOCkoKFUyICsgVTMgKyAxKT4+MSk7Ci0gICAgICAgIGlmIChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVJfUklHSFQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBUbXBbNV0gPSAoT01YX1U4KSgoVTIgKyAyKlUzICsgVTQgKyAyKT4+Mik7Ci0gICAgICAgICAgICBwVG1wWzZdID0gKE9NWF9VOCkoKFUzICsgVTQgKyAxKT4+MSk7Ci0gICAgICAgICAgICBwVG1wWzddID0gKE9NWF9VOCkoKFUzICsgMipVNCArIFU1ICsgMik+PjIpOwotICAgICAgICAgICAgcFRtcFs4XSA9IChPTVhfVTgpKChVNCArIFU1ICsgMSk+PjEpOwotICAgICAgICAgICAgcFRtcFs5XSA9IChPTVhfVTgpKChVNCArIDIqVTUgKyBVNiArIDIpPj4yKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBUbXBbNV0gPSAoT01YX1U4KSgoVTIgKyAzKlUzICsgMik+PjIpOwotICAgICAgICAgICAgcFRtcFs2XSA9IFUzOwotICAgICAgICAgICAgcFRtcFs3XSA9IFUzOwotICAgICAgICAgICAgcFRtcFs4XSA9IFUzOwotICAgICAgICAgICAgcFRtcFs5XSA9IFUzOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoeT0wOyB5PDQ7IHkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICh4PTA7IHg8NDsgeCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwK3hdID0gcFRtcFsyKngreV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9NWF9WQ180WDRfSFU6Ci0gICAgICAgIC8qIHpIVSA9IHgrMip5ICovCi0gICAgICAgIHBUbXBbMF0gPSAoT01YX1U4KSgoTDAgKyBMMSArIDEpPj4xKTsKLSAgICAgICAgcFRtcFsxXSA9IChPTVhfVTgpKChMMCArIDIqTDEgKyBMMiArIDIpPj4yKTsKLSAgICAgICAgcFRtcFsyXSA9IChPTVhfVTgpKChMMSArIEwyICsgMSk+PjEpOwotICAgICAgICBwVG1wWzNdID0gKE9NWF9VOCkoKEwxICsgMipMMiArIEwzICsgMik+PjIpOwotICAgICAgICBwVG1wWzRdID0gKE9NWF9VOCkoKEwyICsgTDMgKyAxKT4+MSk7Ci0gICAgICAgIHBUbXBbNV0gPSAoT01YX1U4KSgoTDIgKyAzKkwzICsgMik+PjIpOwotICAgICAgICBwVG1wWzZdID0gTDM7Ci0gICAgICAgIHBUbXBbN10gPSBMMzsKLSAgICAgICAgcFRtcFs4XSA9IEwzOwotICAgICAgICBwVG1wWzldID0gTDM7Ci0gICAgICAgIGZvciAoeT0wOyB5PDQ7IHkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICh4PTA7IHg8NDsgeCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwK3hdID0gcFRtcFt4KzIqeV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRFF1YXJfMTZ4LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRFF1YXJfMTZ4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MGE3ODUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURRdWFyXzE2eC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1NBRFF1YXJfMTZ4LmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSBTQUQgb2YgcFNyYyB3aXRoIGF2ZXJhZ2Ugb2YgdHdvIFJlZiBibG9ja3MKLSAqIG9mIDE2eDE2IG9yIDE2eDgKLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FEUXVhcl8xNnggICAoNi4zLjUuNC40KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgYmV0d2VlbiBvbmUgYmxvY2sgKHBTcmMpIGFuZCB0aGUgYXZlcmFnZSAKLSAqIG9mIHRoZSBvdGhlciB0d28gKHBTcmNSZWYwIGFuZCBwU3JjUmVmMSkgZm9yIDE2eDE2IG9yIDE2eDggYmxvY2tzLiAgCi0gKiBSb3VuZGluZyBpcyBhcHBsaWVkIGFjY29yZGluZyB0byB0aGUgY29udmVudGlvbiAoYStiKzEpPj4xLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgcFNyY1JlZjAgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAwIAotICogICBwU3JjUmVmMSAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYgCi0gKiAgIGlSZWZTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIGlSZWZTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA4IG9yIDE2IAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0U0FEIC1Qb2ludGVyIG9mIHJlc3VsdCBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDggb3IgMTYuIAotICogICAgLSAgICBPbmUgb2YgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYwLCAKLSAqICAgICAgICAgICAgICBwU3JjUmVmMSwgcERzdFNBRC4gCi0gKiAgICAtICAgIGlTcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2IAotICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9TQURRdWFyXzE2eCgKLQljb25zdCBPTVhfVTgqIAlwU3JjLAotICAgIGNvbnN0IE9NWF9VOCogCXBTcmNSZWYwLAotCWNvbnN0IE9NWF9VOCogCXBTcmNSZWYxLAkKLSAgICBPTVhfVTMyIAlpU3JjU3RlcCwKLSAgICBPTVhfVTMyCQlpUmVmU3RlcDAsCi0gICAgT01YX1UzMgkJaVJlZlN0ZXAxLAotICAgIE9NWF9VMzIqCXBEc3RTQUQsCi0gICAgT01YX1UzMiAgICAgaUhlaWdodAotKQotewotICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZjAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZjEgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocERzdFNBRCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigoaUhlaWdodCAhPSAxNikgJiYgKGlIZWlnaHQgIT0gOCksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDE2Qnl0ZUFsaWduZWQocFNyYyksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChpU3JjU3RlcCA9PSAwKSB8fCAoaVNyY1N0ZXAgJiAxNSksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIAotCi0gICAgcmV0dXJuIGFybVZDTTRQMTBfU0FEUXVhcgotICAgICAgICAocFNyYywgcFNyY1JlZjAsIHBTcmNSZWYxLCBpU3JjU3RlcCwgCi0gICAgICAgIGlSZWZTdGVwMCwgaVJlZlN0ZXAxLCBwRHN0U0FELCBpSGVpZ2h0LCAxNik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRFF1YXJfNHguYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEUXVhcl80eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjYwZDM0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEUXVhcl80eC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1NBRFF1YXJfNHguYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIFNBRCBvZiBwU3JjIHdpdGggYXZlcmFnZSBvZiB0d28gUmVmIGJsb2NrcwotICogb2YgNHg4IG9yIDR4NCBibG9ja3MKLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FEUXVhcl80eCAgICg2LjMuNS40LjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBiZXR3ZWVuIG9uZSBibG9jayAocFNyYykgYW5kIHRoZSBhdmVyYWdlIAotICogb2YgdGhlIG90aGVyIHR3byAocFNyY1JlZjAgYW5kIHBTcmNSZWYxKSBmb3IgNHg4IG9yIDR4NCBibG9ja3MuICBSb3VuZGluZyAKLSAqIGlzIGFwcGxpZWQgYWNjb3JkaW5nIHRvIHRoZSBjb252ZW50aW9uIChhK2IrMSk+PjEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIHBTcmNSZWYwIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgcFNyY1JlZjEgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAotICogICBpUmVmU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogICBpUmVmU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCBvciA4LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFNBRCAtIFBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgNCBvciA4LiAKLSAqICAgIC0gICAgT25lIG9mIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwU3JjUmVmMCwgCi0gKiAgICAgICAgICAgICAgcFNyY1JlZjEsIHBEc3RTQUQuIAotICogICAgLSAgICBpU3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9TQURRdWFyXzR4KCAKLQkgIGNvbnN0IE9NWF9VOCogCXBTcmMsCi0gICAgICBjb25zdCBPTVhfVTgqIAlwU3JjUmVmMCwKLQkgIGNvbnN0IE9NWF9VOCogCXBTcmNSZWYxLAkKLSAgICAgIE9NWF9VMzIgCWlTcmNTdGVwLAotICAgICAgT01YX1UzMglpUmVmU3RlcDAsCi0gICAgICBPTVhfVTMyCWlSZWZTdGVwMSwKLSAgICAgIE9NWF9VMzIqCXBEc3RTQUQsCi0gICAgICBPTVhfVTMyICAgaUhlaWdodAotKQotewotICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWYwID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmMSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocERzdFNBRCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKGlIZWlnaHQgIT0gOCkgJiYgKGlIZWlnaHQgIT0gNCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFNyYyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoaVNyY1N0ZXAgPT0gMCkgfHwgKGlTcmNTdGVwICYgMyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAKLSAgICByZXR1cm4gYXJtVkNNNFAxMF9TQURRdWFyCi0gICAgICAgIChwU3JjLCBwU3JjUmVmMCwgcFNyY1JlZjEsIGlTcmNTdGVwLCAKLSAgICAgICAgaVJlZlN0ZXAwLCBpUmVmU3RlcDEsIHBEc3RTQUQsIGlIZWlnaHQsIDQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURRdWFyXzh4LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRFF1YXJfOHguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM4Y2RmMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRFF1YXJfOHguYworKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9TQURRdWFyXzh4LmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSBTQUQgb2YgcFNyYyB3aXRoIGF2ZXJhZ2Ugb2YgdHdvIFJlZiBibG9ja3MKLSAqIG9mIDh4MTYgb3IgOHg4IG9yIDh4NAotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQURRdWFyXzh4ICAgKDYuMy41LjQuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGJldHdlZW4gb25lIGJsb2NrIChwU3JjKSBhbmQgdGhlIGF2ZXJhZ2UgCi0gKiBvZiB0aGUgb3RoZXIgdHdvIChwU3JjUmVmMCBhbmQgcFNyY1JlZjEpIGZvciA4eDE2LCA4eDgsIG9yIDh4NCBibG9ja3MuICAKLSAqIFJvdW5kaW5nIGlzIGFwcGxpZWQgYWNjb3JkaW5nIHRvIHRoZSBjb252ZW50aW9uIChhK2IrMSk+PjEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBwU3JjUmVmMCAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIHBTcmNSZWYxIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgaVJlZlN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgaVJlZlN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2s7IG11c3QgYmUgZXF1YWwgZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFNBRCAtIFBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICogICAgLSAgICBPbmUgb2YgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYwLCAKLSAqICAgICAgICAgICAgICBwU3JjUmVmMSwgcERzdFNBRC4gCi0gKiAgICAtICAgIGlTcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDggCi0gKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1NBRFF1YXJfOHgoIAotCWNvbnN0IE9NWF9VOCogCXBTcmMsCi0gICAgY29uc3QgT01YX1U4KiAJcFNyY1JlZjAsCi0JY29uc3QgT01YX1U4KiAJcFNyY1JlZjEsCQotICAgIE9NWF9VMzIgCWlTcmNTdGVwLAotICAgIE9NWF9VMzIJCWlSZWZTdGVwMCwKLSAgICBPTVhfVTMyCQlpUmVmU3RlcDEsCi0gICAgT01YX1UzMioJcERzdFNBRCwKLSAgICBPTVhfVTMyICAgICBpSGVpZ2h0Ci0pCi17Ci0gICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmMCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmMSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0U0FEID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChpSGVpZ2h0ICE9IDE2KSAmJiAoaUhlaWdodCAhPSA4KSAmJiAKLSAgICAgICAgKGlIZWlnaHQgIT0gNCksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwU3JjKSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlTcmNTdGVwID09IDApIHx8IChpU3JjU3RlcCAmIDcpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICAKLQotICAgIHJldHVybiBhcm1WQ000UDEwX1NBRFF1YXIKLSAgICAgICAgKHBTcmMsIHBTcmNSZWYwLCBwU3JjUmVmMSwgaVNyY1N0ZXAsIAotICAgICAgICBpUmVmU3RlcDAsIGlSZWZTdGVwMSwgcERzdFNBRCwgaUhlaWdodCwgOCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRF80eC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURfNHguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIyZDhkZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRF80eC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfU0FEXzR4LmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSBTQUQgZm9yIDR4OCBhbmQgNHg0IGJsb2NrcwotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQURfNHggICAoNi4zLjUuNC4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgZm9yIDR4OCBhbmQgNHg0IGJsb2Nrcy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY09yZyAtUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBpU3RlcE9yZyAtU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIHBTcmNSZWYgLVBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayAKLSAqICAgaVN0ZXBSZWYgLVN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXIgCi0gKiAgIGlIZWlnaHQgLUhlaWdodCBvZiB0aGUgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RTQUQgLVBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBPbmUgb2YgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjT3JnLCBwU3JjUmVmLCBvciBwRHN0U0FEIAotICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgNCBvciA4LiAKLSAqICAgIC0gICAgaVN0ZXBPcmcgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfU0FEXzR4KAkKLQljb25zdCBPTVhfVTgqIAlwU3JjT3JnLAotCU9NWF9VMzIgCWlTdGVwT3JnLAotCWNvbnN0IE9NWF9VOCogCXBTcmNSZWYsCi0JT01YX1UzMiAJaVN0ZXBSZWYsCi0JT01YX1MzMioJcERzdFNBRCwKLQlPTVhfVTMyCQlpSGVpZ2h0Ci0pCi17Ci0gICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY09yZyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBEc3RTQUQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlIZWlnaHQgIT0gOCkgJiYgKGlIZWlnaHQgIT0gNCksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwU3JjT3JnKSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlTdGVwT3JnID09IDApIHx8IChpU3RlcE9yZyAmIDMpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigoaVN0ZXBSZWYgPT0gMCkgfHwgKGlTdGVwUmVmICYgMyksIE9NWF9TdHNfQmFkQXJnRXJyKQotCi0gICAgcmV0dXJuIGFybVZDQ09NTV9TQUQgCi0gICAgICAgIChwU3JjT3JnLCBpU3RlcE9yZywgcFNyY1JlZiwgaVN0ZXBSZWYsIHBEc3RTQUQsIGlIZWlnaHQsIDQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQVREXzR4NC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQVREXzR4NC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Zjc0NDk5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FURF80eDQuYworKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9TQVREXzR4NC5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgU0FEIGZvciA0eDQgYmxvY2tzCi0gKiAKLSAqLwotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FURF80eDQgICAoNi4zLjUuNC41KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBzdW0gb2YgYWJzb2x1dGUgdHJhbnNmb3JtIGRpZmZlcmVuY2VzIChTQVREKSAKLSAqIGZvciBhIDR4NCBibG9jayBieSBhcHBseWluZyBhIEhhZGFtYXJkIHRyYW5zZm9ybSB0byB0aGUgZGlmZmVyZW5jZSBibG9jayAKLSAqIGFuZCB0aGVuIGNhbGN1bGF0aW5nIHRoZSBzdW0gb2YgYWJzb2x1dGUgY29lZmZpY2llbnQgdmFsdWVzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjT3JnIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkgCi0gKiAgIGlTdGVwT3JnIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgcFNyY1JlZiAtIFBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeSAKLSAqICAgaVN0ZXBSZWYgLSBTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gdGhlIHJlc3VsdGluZyBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyY09yZywgcFNyY1JlZiwgb3IgcERzdFNBRCBlaXRoZXIgcFNyY09yZyAKLSAqICAgIC0gICAgcFNyY1JlZiBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgaVN0ZXBPcmcgPD0gMCBvciBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICogICAgLSAgICBpU3RlcFJlZiA8PSAwIG9yIGlTdGVwUmVmIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9TQVREXzR4NCggCi0JY29uc3QgT01YX1U4KgkJcFNyY09yZywKLQlPTVhfVTMyICAgICBpU3RlcE9yZywgICAgICAgICAgICAgICAgICAgICAgICAgCi0JY29uc3QgT01YX1U4KgkJcFNyY1JlZiwKLQlPTVhfVTMyCQlpU3RlcFJlZiwKLQlPTVhfVTMyKiAgICBwRHN0U0FECi0pCi17Ci0gICAgT01YX0lOVCAgICAgaSwgajsKLSAgICBPTVhfUzMyICAgICBTQVREID0gMDsKLSAgICBPTVhfUzMyICAgICBkIFs0XVs0XSwgbTFbNF1bNF0sIG0yWzRdWzRdOwotCi0gICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY09yZyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBEc3RTQUQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlTdGVwT3JnID09IDApIHx8IChpU3RlcE9yZyAmIDMpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigoaVN0ZXBSZWYgPT0gMCkgfHwgKGlTdGVwUmVmICYgMyksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwU3JjT3JnKSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBTcmNSZWYpLCBPTVhfU3RzX0JhZEFyZ0VycikKLQotICAgIC8qIENhbGN1bGF0ZSB0aGUgZGlmZmVyZW5jZSAqLwotICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCi0gICAgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBkIFtqXVtpXSA9IHBTcmNPcmcgW2ogKiBpU3RlcE9yZyArIGldIC0gcFNyY1JlZiBbaiAqIGlTdGVwUmVmICsgaV07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBIYWRhbWFyZCBUcmFuc2ZvciBmb3IgNHg0IGJsb2NrICovCi0KLSAgICAvKiBIb3Jpem9udGFsICovCi0gICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICB7Ci0gICAgICAgIG0xW2ldWzBdID0gZFtpXVswXSArIGRbaV1bMl07IC8qIGErYyAqLwotICAgICAgICBtMVtpXVsxXSA9IGRbaV1bMV0gKyBkW2ldWzNdOyAvKiBiK2QgKi8KLSAgICAgICAgbTFbaV1bMl0gPSBkW2ldWzBdIC0gZFtpXVsyXTsgLyogYS1jICovCi0gICAgICAgIG0xW2ldWzNdID0gZFtpXVsxXSAtIGRbaV1bM107IC8qIGItZCAqLwotCi0gICAgICAgIG0yW2ldWzBdID0gbTFbaV1bMF0gKyBtMVtpXVsxXTsgLyogYStiK2MrZCAqLwotICAgICAgICBtMltpXVsxXSA9IG0xW2ldWzJdICsgbTFbaV1bM107IC8qIGErYi1jLWQgKi8KLSAgICAgICAgbTJbaV1bMl0gPSBtMVtpXVsyXSAtIG0xW2ldWzNdOyAvKiBhLWItYytkICovCi0gICAgICAgIG0yW2ldWzNdID0gbTFbaV1bMF0gLSBtMVtpXVsxXTsgLyogYS1iK2MtZCAqLwotCi0gICAgfQotCi0gICAgLyogVmVydGljYWwgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgIHsKLSAgICAgICAgbTFbMF1baV0gPSBtMlswXVtpXSArIG0yWzJdW2ldOwotICAgICAgICBtMVsxXVtpXSA9IG0yWzFdW2ldICsgbTJbM11baV07Ci0gICAgICAgIG0xWzJdW2ldID0gbTJbMF1baV0gLSBtMlsyXVtpXTsKLSAgICAgICAgbTFbM11baV0gPSBtMlsxXVtpXSAtIG0yWzNdW2ldOwotCi0gICAgICAgIG0yWzBdW2ldID0gbTFbMF1baV0gKyBtMVsxXVtpXTsKLSAgICAgICAgbTJbMV1baV0gPSBtMVsyXVtpXSArIG0xWzNdW2ldOwotICAgICAgICBtMlsyXVtpXSA9IG0xWzJdW2ldIC0gbTFbM11baV07Ci0gICAgICAgIG0yWzNdW2ldID0gbTFbMF1baV0gLSBtMVsxXVtpXTsKLSAgICB9Ci0gICAgCi0gICAgLyogY2FsY3VsYXRlIFNBRCBmb3IgVHJhbnNmb3JtZWQgY29lZmZpY2llbnRzICovCi0gICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNBVEQgKz0gYXJtQWJzKG0yIFtqXVtpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgICAgIAotICAgICpwRHN0U0FEID0gKFNBVEQgKyAxKSAvIDI7Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE4NGQ3Yy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIFNBRCBmb3IgNHg0IGJsb2NrcwotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbCAgICg2LjMuNS44LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHN1YnRyYWN0cyB0aGUgcHJlZGljdGlvbiBzaWduYWwgZnJvbSB0aGUgb3JpZ2luYWwgc2lnbmFsIHRvIAotICogcHJvZHVjZSB0aGUgZGlmZmVyZW5jZSBzaWduYWwgYW5kIHRoZW4gcGVyZm9ybXMgYSA0eDQgaW50ZWdlciB0cmFuc2Zvcm0gYW5kIAotICogcXVhbnRpemF0aW9uLiBUaGUgcXVhbnRpemVkIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cyBhcmUgc3RvcmVkIGFzIAotICogcERzdFF1YW50Q29lZmYuIFRoaXMgZnVuY3Rpb24gY2FuIGFsc28gb3V0cHV0IGRlcXVhbnRpemVkIGNvZWZmaWNpZW50cyBvciAKLSAqIHVucXVhbnRpemVkIERDIGNvZWZmaWNpZW50cyBvcHRpb25hbGx5IGJ5IHNldHRpbmcgdGhlIHBvaW50ZXJzIAotICogcERzdERlUXVhbnRDb2VmZiwgcERDQ29lZmYuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNPcmcgLSBQb2ludGVyIHRvIG9yaWdpbmFsIHNpZ25hbC4gNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIHBTcmNQcmVkIC0gUG9pbnRlciB0byBwcmVkaWN0aW9uIHNpZ25hbC4gNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIGlTcmNPcmdTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgc2lnbmFsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIAotICogICAgICAgICAgICA0LiAKLSAqICAgaVNyY1ByZWRTdGVwIC0gU3RlcCBvZiB0aGUgcHJlZGljdGlvbiBzaWduYWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgCi0gKiAgICAgICAgICAgIG9mIDQuIAotICogICBwTnVtQ29lZmYgLU51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMgYWZ0ZXIgcXVhbnRpemF0aW9uLiBJZiB0aGlzIAotICogICAgICAgICAgICBwYXJhbWV0ZXIgaXMgbm90IHJlcXVpcmVkLCBpdCBpcyBzZXQgdG8gTlVMTC4gCi0gKiAgIG5UaHJlc2hTQUQgLSBaZXJvLWJsb2NrIGVhcmx5IGRldGVjdGlvbiB0aHJlc2hvbGQuIElmIHRoaXMgcGFyYW1ldGVyIGlzIAotICogICAgICAgICAgICBub3QgcmVxdWlyZWQsIGl0IGlzIHNldCB0byAwLiAKLSAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKLSAqICAgYkludHJhIC0gSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpcyBhbiBJTlRSQSBibG9jaywgZWl0aGVyIDEtSU5UUkEgb3IgCi0gKiAgICAgICAgICAgIDAtSU5URVIgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RRdWFudENvZWZmIC0gUG9pbnRlciB0byB0aGUgcXVhbnRpemVkIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cy4gIAotICogICAgICAgICAgICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgcERzdERlUXVhbnRDb2VmZiAtIFBvaW50ZXIgdG8gdGhlIGRlcXVhbnRpemVkIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cyAKLSAqICAgICAgICAgICAgaWYgdGhpcyBwYXJhbWV0ZXIgaXMgbm90IGVxdWFsIHRvIE5VTEwuICA4LWJ5dGUgYWxpZ25tZW50IAotICogICAgICAgICAgICByZXF1aXJlZC4gCi0gKiAgIHBEQ0NvZWZmIC0gUG9pbnRlciB0byB0aGUgdW5xdWFudGl6ZWQgREMgY29lZmZpY2llbnQgaWYgdGhpcyBwYXJhbWV0ZXIgCi0gKiAgICAgICAgICAgIGlzIG5vdCBlcXVhbCB0byBOVUxMLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICAgICBwU3JjT3JnLCBwU3JjUHJlZCwgcE51bUNvZWZmLCBwRHN0UXVhbnRDb2VmZiwgCi0gKiAgICAgICAgICAgIHBEc3REZVF1YW50Q29lZmYsIHBEQ0NvZWZmIAotICogICAgLSAgICBwU3JjT3JnIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBwU3JjUHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgaVNyY09yZ1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgIC0gICAgaVNyY1ByZWRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKiAgICAtICAgIHBEc3RRdWFudENvZWZmIG9yIHBEc3REZVF1YW50Q29lZmYgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAotICoKLSAqLwotIE9NWFJlc3VsdCBvbXhWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsICgKLQkgY29uc3QgT01YX1U4KgkJcFNyY09yZywKLQkgY29uc3QgT01YX1U4KgkJcFNyY1ByZWQsCi0JIE9NWF9VMzIJCWlTcmNPcmdTdGVwLAotCSBPTVhfVTMyCQlpU3JjUHJlZFN0ZXAsCi0JIE9NWF9TMTYqCSAgICBwRHN0UXVhbnRDb2VmZiwKLQkgT01YX1MxNiogCSAgICBwRHN0RGVRdWFudENvZWZmLAotCSBPTVhfUzE2KgkgICAgcERDQ29lZmYsCi0JIE9NWF9TOCoJCXBOdW1Db2VmZiwKLQkgT01YX1UzMgkJblRocmVzaFNBRCwKLQkgT01YX1UzMgkJaVFQLAotCSBPTVhfVTgJCSAgICBiSW50cmEKLSkKLXsKLSAgICBPTVhfSU5UICAgICBpLCBqOwotICAgIE9NWF9TOCAgICAgIE51bUNvZWZmID0gMDsKLSAgICBPTVhfUzE2ICAgICBCdWZbMTZdLCBtWzE2XTsKLSAgICBPTVhfVTMyICAgICBRQml0cywgUVBwZXIsIFFQbW9kLCBmOwotICAgIE9NWF9TMzIgICAgIFZhbHVlLCBNRiwgVGhyZXNoREM7Ci0KLSAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjT3JnID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotCWFybVJldEFyZ0VycklmKHBEc3REZVF1YW50Q29lZmYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0JYXJtUmV0QXJnRXJySWYocE51bUNvZWZmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotCWFybVJldEFyZ0VycklmKHBEQ0NvZWZmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwU3JjT3JnKSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY1ByZWQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBTcmNQcmVkKSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocERzdFF1YW50Q29lZmYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBEc3RRdWFudENvZWZmKSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKHBEc3REZVF1YW50Q29lZmYgIT0gTlVMTCkgJiYgCi0JCQlhcm1Ob3Q4Qnl0ZUFsaWduZWQocERzdERlUXVhbnRDb2VmZiksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChiSW50cmEgIT0gMCkgJiYgKGJJbnRyYSAhPSAxKSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoaVFQID4gNTEsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGlTcmNPcmdTdGVwID09IDAsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGlTcmNQcmVkU3RlcCA9PSAwLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihpU3JjT3JnU3RlcCAmIDMsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGlTcmNQcmVkU3RlcCAmIDMsIE9NWF9TdHNfQmFkQXJnRXJyKQotCi0gICAgLyogCi0gICAgICogWmVyby1CbG9jayBFYXJseSBkZXRlY3Rpb24gdXNpbmcgblRocmVzaFNBRCBwYXJhbSAKLSAgICAgKi8KLQotICAgIFFQcGVyID0gaVFQIC8gNjsKLSAgICBRUG1vZCA9IGlRUCAlIDY7ICAgIAotICAgIFFCaXRzID0gMTUgKyBRUHBlcjsKLSAgICAKLSAgICBmID0gKDEgPDwgUUJpdHMpIC8gKGJJbnRyYSA/IDMgOiA2KTsKLSAgICAKLSAgICAvKiBEbyBaZXJvLUJsb2NrIEVhcmx5IGRldGVjdGlvbiBpZiBlbmFibGVkICovCi0gICAgaWYgKG5UaHJlc2hTQUQpCi0gICAgewotICAgICAgICBUaHJlc2hEQyA9ICgoMSA8PCBRQml0cykgLSBmKSAvIGFybVZDTTRQMTBfTUZNYXRyaXhbUVBtb2RdWzBdOwotICAgICAgICBpZiAoblRocmVzaFNBRCA8IFRocmVzaERDKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBTZXQgYmxvY2sgdG8gemVybyAqLwotICAgICAgICAgICAgaWYgKHBEQ0NvZWZmICE9IE5VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBEQ0NvZWZmID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcERzdFF1YW50Q29lZmYgWzQgKiBqICsgaV0gPSAwOwotICAgICAgICAgICAgICAgICAgICBpZiAocERzdERlUXVhbnRDb2VmZiAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRHN0RGVRdWFudENvZWZmIFs0ICogaiArIGldID0gMDsgICAgCi0gICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHBOdW1Db2VmZiAhPSBOVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwTnVtQ29lZmYgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgLyogQ2FsY3VsYXRlIGRpZmZlcmVuY2UgKi8KLSAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgQnVmIFtqICogNCArIGldID0gCi0gICAgICAgICAgICAgICAgcFNyY09yZyBbaiAqIGlTcmNPcmdTdGVwICsgaV0gLSBwU3JjUHJlZCBbaiAqIGlTcmNQcmVkU3RlcCArIGldOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogUmVzaWR1YWwgVHJhbnNmb3JtICovCi0gICAgYXJtVkNNNFAxMF9Gd2RUcmFuc2Zvcm1SZXNpZHVhbDR4NCAobSwgQnVmKTsKLQotICAgIGlmIChwRENDb2VmZiAhPSBOVUxMKQotICAgIHsKLSAgICAgICAgLyogQ29weSB1bnF1YW50aXplZCBEQyB2YWx1ZSBpbnRvIHBvaW50ZXIgKi8KLSAgICAgICAgKnBEQ0NvZWZmID0gbVswXTsKLSAgICB9Ci0KLSAgICAvKiBRdWFudGl6YXRpb24gKi8KLSAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgTUYgPSBhcm1WQ000UDEwX01GTWF0cml4W1FQbW9kXVthcm1WQ000UDEwX1Bvc1RvVkNvbDR4NFtqICogNCArIGldXTsKLSAgICAgICAgICAgIFZhbHVlID0gYXJtQWJzKG1baiAqIDQgKyBpXSkgKiBNRiArIGY7Ci0gICAgICAgICAgICBWYWx1ZSA+Pj0gUUJpdHM7Ci0gICAgICAgICAgICBWYWx1ZSA9IG1baiAqIDQgKyBpXSA8IDAgPyAtVmFsdWUgOiBWYWx1ZTsKLSAgICAgICAgICAgIEJ1Zls0ICogaiArIGldID0gcERzdFF1YW50Q29lZmYgWzQgKiBqICsgaV0gPSAoT01YX1MxNilWYWx1ZTsKLSAgICAgICAgICAgIGlmICgocE51bUNvZWZmICE9IE5VTEwpICYmIFZhbHVlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE51bUNvZWZmKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBPdXRwdXQgbnVtYmVyIG9mIG5vbi16ZXJvIENvZWZmcyAqLwotICAgIGlmIChwTnVtQ29lZmYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAgICpwTnVtQ29lZmYgPSBOdW1Db2VmZjsKLSAgICB9Ci0gICAgCi0gICAgLyogUmVzaWR1YWwgSW52IFRyYW5zZm9ybSAqLwotICAgIGlmIChwRHN0RGVRdWFudENvZWZmICE9IE5VTEwpCi0gICAgeyAgICAKLSAgICAgICAgLyogUmUgU2NhbGUgKi8KLSAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtIFtqICogNCArIGldICA9IEJ1ZiBbaiAqIDQgKyBpXSAqICgxIDw8IFFQcGVyKSAqCi0gICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMTBfVk1hdHJpeFtRUG1vZF1bYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDRbaiAqIDQgKyBpXV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NCAocERzdERlUXVhbnRDb2VmZiwgbSk7ICAgICAgICAKLSAgICB9Ci0gICAgICAgIAotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDlmNWE3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIuYworKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBILjI2NCBpbnZlcnNlIHF1YW50aXplIGFuZCB0cmFuc2Zvcm0gbW9kdWxlCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKgotICogRGVzY3JpcHRpb246Ci0gKiBEZXF1YW50aXplIENocm9tYSAyeDIgREMgYmxvY2sKLSAqLwotCi1zdGF0aWMgdm9pZCBEZXF1YW50Q2hyb21hREMyeDIoCi0gICAgIE9NWF9TMTYqIHBEc3QsCi0gICAgIE9NWF9JTlQgUVAgICAgICAgIAotKQotewotICAgIGludCBTaGlmdCA9IChRUC82KS0xIDsKLSAgICBpbnQgU2NhbGUgPSBhcm1WQ000UDEwX1ZNYXRyaXhbUVAlNl1bMF07Ci0gICAgaW50IGksIFZhbHVlOwotCi0gICAgaWYgKFNoaWZ0ID49IDApCi0gICAgewotICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbHVlID0gKHBEc3RbaV0gKiBTY2FsZSkgPDwgU2hpZnQ7Ci0gICAgICAgICAgICBwRHN0W2ldID0gKE9NWF9TMTYpVmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZm9yIChpPTA7IGk8NDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWx1ZSA9IChwRHN0W2ldICogU2NhbGUpID4+IDE7Ci0gICAgICAgICAgICBwRHN0W2ldID0gKE9NWF9TMTYpVmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0gCi0KLS8qCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEludmVyc2UgVHJhbnNmb3JtIERDIDJ4MiBDb2VmZmljaWVudHMKLSAqLwotCi1zdGF0aWMgdm9pZCBJbnZUcmFuc2Zvcm1EQzJ4MihPTVhfUzE2KiBwRGF0YSkKLXsKLSAgICBpbnQgYzAwID0gcERhdGFbMF07Ci0gICAgaW50IGMwMSA9IHBEYXRhWzFdOwotICAgIGludCBjMTAgPSBwRGF0YVsyXTsKLSAgICBpbnQgYzExID0gcERhdGFbM107Ci0KLSAgICBpbnQgZDAwID0gYzAwICsgYzAxOwotICAgIGludCBkMDEgPSBjMDAgLSBjMDE7Ci0gICAgaW50IGQxMCA9IGMxMCArIGMxMTsKLSAgICBpbnQgZDExID0gYzEwIC0gYzExOwotCi0gICAgcERhdGFbMF0gPSAoT01YX1MxNikoZDAwICsgZDEwKTsKLSAgICBwRGF0YVsxXSA9IChPTVhfUzE2KShkMDEgKyBkMTEpOwotICAgIHBEYXRhWzJdID0gKE9NWF9TMTYpKGQwMCAtIGQxMCk7Ci0gICAgcERhdGFbM10gPSAoT01YX1MxNikoZDAxIC0gZDExKTsKLX0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpciAgICg2LjMuNC4yLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBSZWNvbnN0cnVjdCB0aGUgMngyIENocm9tYURDIGJsb2NrIGZyb20gY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIsIAotICogcGVyZm9ybSBpbnRlZ2VyIGludmVyc2UgdHJhbnNmb3JtYXRpb24sIGFuZCBkZXF1YW50aXphdGlvbiBmb3IgMngyIGNocm9tYSAKLSAqIERDIGNvZWZmaWNpZW50cywgYW5kIHVwZGF0ZSB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byBuZXh0IG5vbi1lbXB0eSAKLSAqIGJsb2NrLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcFNyYyAtIERvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyIAotICogICAgICAgICAgICBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcgCi0gKiAgIFFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlciBRcEMgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwU3JjIC0gKnBwU3JjIGlzIHVwZGF0ZWQgdG8gdGhlIHN0YXJ0IG9mIG5leHQgbm9uIGVtcHR5IGJsb2NrIAotICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCAyeDIgQ2hyb21hREMgY29lZmZpY2llbnRzIGJ1ZmZlcjsgCi0gKiAgICAgICAgICAgIG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgcHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKLSAqICAgIC0gICAgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBRUCBpcyBub3QgaW4gdGhlIHJhbmdlIG9mIFswLTUxXS4gCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyKAotICAgICBjb25zdCBPTVhfVTggKipwcFNyYywKLSAgICAgT01YX1MxNiogcERzdCwKLSAgICAgT01YX0lOVCBRUCAgICAgICAgCi0gKQotewotICAgIGFybVJldEFyZ0VycklmKHBwU3JjICA9PSBOVUxMLCAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCpwcFNyYyA9PSBOVUxMLCAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBEc3QgICA9PSBOVUxMLCAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKFFQPDAsICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKFFQPjUxLCAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotCi0gICAgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazJ4MihwcFNyYywgcERzdCk7Ci0gICAgSW52VHJhbnNmb3JtREMyeDIocERzdCk7Ci0gICAgRGVxdWFudENocm9tYURDMngyKHBEc3QsIFFQKTsKLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMzNkNDkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIuYworKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpci5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogSC4yNjQgaW52ZXJzZSBxdWFudGl6ZSBhbmQgdHJhbnNmb3JtIG1vZHVsZQotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoKLSAqIERlc2NyaXB0aW9uOgotICogRGVxdWFudGl6ZSBMdW1hIERDIGJsb2NrCi0gKi8KLQotc3RhdGljIHZvaWQgRGVxdWFudEx1bWFEQzR4NCgKLSAgICAgT01YX1MxNiogcERzdCwKLSAgICAgT01YX0lOVCBRUCAgICAgICAgCi0pCi17Ci0gICAgaW50IFNoaWZ0ID0gKFFQLzYpLTIgOwotICAgIGludCBTY2FsZSA9IGFybVZDTTRQMTBfVk1hdHJpeFtRUCU2XVswXTsKLSAgICBpbnQgaSwgUm91bmQsIFZhbHVlOwotCi0gICAgaWYgKFNoaWZ0ID49IDApCi0gICAgewotICAgICAgICBmb3IgKGk9MDsgaTwxNjsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWx1ZSA9IChwRHN0W2ldICogU2NhbGUpIDw8IFNoaWZ0OwotICAgICAgICAgICAgcERzdFtpXSA9IChPTVhfUzE2KVZhbHVlOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIFNoaWZ0ID0gLVNoaWZ0OzsKLSAgICAgICAgUm91bmQgPSAxPDwoU2hpZnQtMSk7Ci0KLSAgICAgICAgZm9yIChpPTA7IGk8MTY7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgVmFsdWUgPSAocERzdFtpXSAqIFNjYWxlICsgUm91bmQpID4+IFNoaWZ0OwotICAgICAgICAgICAgcERzdFtpXSA9IChPTVhfUzE2KVZhbHVlOwotICAgICAgICB9Ci0gICAgfQotfQotCi0gCi0KLS8qCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEludmVyc2UgVHJhbnNmb3JtIERDIDR4NCBDb2VmZmljaWVudHMKLSAqLwotc3RhdGljIHZvaWQgSW52VHJhbnNmb3JtREM0eDQoT01YX1MxNiogcERhdGEpCi17Ci0gICAgaW50IGk7Ci0KLSAgICAvKiBUcmFuc2Zvcm0gcm93cyAqLwotICAgIGZvciAoaT0wOyBpPDE2OyBpKz00KQotICAgIHsKLSAgICAgICAgaW50IGMwID0gcERhdGFbaSswXTsKLSAgICAgICAgaW50IGMxID0gcERhdGFbaSsxXTsKLSAgICAgICAgaW50IGMyID0gcERhdGFbaSsyXTsKLSAgICAgICAgaW50IGMzID0gcERhdGFbaSszXTsKLSAgICAgICAgcERhdGFbaSswXSA9IChPTVhfUzE2KShjMCtjMStjMitjMyk7Ci0gICAgICAgIHBEYXRhW2krMV0gPSAoT01YX1MxNikoYzArYzEtYzItYzMpOwotICAgICAgICBwRGF0YVtpKzJdID0gKE9NWF9TMTYpKGMwLWMxLWMyK2MzKTsKLSAgICAgICAgcERhdGFbaSszXSA9IChPTVhfUzE2KShjMC1jMStjMi1jMyk7Ci0gICAgfQotCi0gICAgLyogVHJhbnNmb3JtIGNvbHVtbnMgKi8KLSAgICBmb3IgKGk9MDsgaTw0OyBpKyspCi0gICAgewotICAgICAgICBpbnQgYzAgPSBwRGF0YVtpKzBdOwotICAgICAgICBpbnQgYzEgPSBwRGF0YVtpKzRdOwotICAgICAgICBpbnQgYzIgPSBwRGF0YVtpKzhdOwotICAgICAgICBpbnQgYzMgPSBwRGF0YVtpKzEyXTsKLSAgICAgICAgcERhdGFbaSswXSA9IChPTVhfUzE2KShjMCtjMStjMitjMyk7Ci0gICAgICAgIHBEYXRhW2krNF0gPSAoT01YX1MxNikoYzArYzEtYzItYzMpOwotICAgICAgICBwRGF0YVtpKzhdID0gKE9NWF9TMTYpKGMwLWMxLWMyK2MzKTsKLSAgICAgICAgcERhdGFbaSsxMl0gPSAoT01YX1MxNikoYzAtYzErYzItYzMpOwotICAgIH0KLX0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIgICAoNi4zLjQuMi4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUmVjb25zdHJ1Y3RzIHRoZSA0eDQgTHVtYURDIGJsb2NrIGZyb20gdGhlIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgCi0gKiBidWZmZXIsIHBlcmZvcm1zIGludGVnZXIgaW52ZXJzZSwgYW5kIGRlcXVhbnRpemF0aW9uIGZvciA0eDQgTHVtYURDIAotICogY29lZmZpY2llbnRzLCBhbmQgdXBkYXRlcyB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byB0aGUgbmV4dCBub24tZW1wdHkgCi0gKiBibG9jay4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBTcmMgLSBEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKLSAqICAgICAgICAgICAgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nIAotICogICBRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXIgUXBZIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcFNyYyAtICpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jayAKLSAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgNHg0IEx1bWFEQyBjb2VmZmljaWVudHMgYnVmZmVyOyBtdXN0IAotICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBwcFNyYyBvciBwRHN0IGlzIE5VTEwuIAotICogICAgLSAgICBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIFFQIGlzIG5vdCBpbiB0aGUgcmFuZ2Ugb2YgWzAtNTFdLiAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyKAotICAgICBjb25zdCBPTVhfVTggKipwcFNyYywKLSAgICAgT01YX1MxNiogcERzdCwKLSAgICAgT01YX0lOVCBRUCAgICAgICAgCi0gKQotewotICAgIGFybVJldEFyZ0VycklmKHBwU3JjICA9PSBOVUxMLCAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCpwcFNyYyA9PSBOVUxMLCAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBEc3QgICA9PSBOVUxMLCAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKFFQPDAsICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKFFQPjUxLCAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotCi0gICAgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NChwcFNyYywgcERzdCk7Ci0gICAgLypJbnZUcmFuc2Zvcm1EZXF1YW50THVtYURDNHg0KHBEc3QsIFFQKTsqLwotICAgIEludlRyYW5zZm9ybURDNHg0KHBEc3QpOwotICAgIERlcXVhbnRMdW1hREM0eDQocERzdCwgUVApOwotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNmEzZDAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSA0eDQgaGFkYW1hcmQgdHJhbnNmb3JtIG9mIGNocm9tYSBEQyAgCi0gKiBjb2VmZmljaWVudHMgYW5kIHF1YW50aXphdGlvbgotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQyAgICg2LjMuNS42LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIDJ4MiBIYWRhbWFyZCB0cmFuc2Zvcm0gb2YgY2hyb21hIERDIGNvZWZmaWNpZW50cyAKLSAqIGFuZCB0aGVuIHF1YW50aXplcyB0aGUgY29lZmZpY2llbnRzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgMngyIGFycmF5IG9mIGNocm9tYSBEQyBjb2VmZmljaWVudHMuICA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCi0gKiAgIGJJbnRyYSAtIEluZGljYXRlIHdoZXRoZXIgdGhpcyBpcyBhbiBJTlRSQSBibG9jay4gMS1JTlRSQSwgMC1JTlRFUiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdHJhbnNmb3JtZWQgYW5kIHF1YW50aXplZCBjb2VmZmljaWVudHMuICA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgICAgIHBTcmNEc3QgCi0gKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMoCi0JT01YX1MxNiogCXBTcmNEc3QsCi0JT01YX1UzMgkJaVFQLAotCU9NWF9VOAkJYkludHJhCi0pCi17Ci0gICAgT01YX0lOVCAgICAgaSwgajsKLSAgICBPTVhfUzMyICAgICBtWzJdWzJdOwotICAgIE9NWF9TMzIgICAgIFZhbHVlOwotICAgIE9NWF9TMzIgICAgIFFiaXRzUGx1c09uZSwgVHdvX2YsIE1GMDA7Ci0KLSAgICAvKiBDaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocFNyY0RzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihpUVAgPiA1MSwgT01YX1N0c19CYWRBcmdFcnIpOwotCi0gICAgLyogSGFkYW1hcmQgVHJhbnNmb3JtIGZvciAyeDIgYmxvY2sgKi8KLSAgICBtWzBdWzBdID0gcFNyY0RzdFswXSArIHBTcmNEc3RbMV0gKyAgcFNyY0RzdFsyXSArIHBTcmNEc3RbM107Ci0gICAgbVswXVsxXSA9IHBTcmNEc3RbMF0gLSBwU3JjRHN0WzFdICsgIHBTcmNEc3RbMl0gLSBwU3JjRHN0WzNdOwotICAgIG1bMV1bMF0gPSBwU3JjRHN0WzBdICsgcFNyY0RzdFsxXSAtICBwU3JjRHN0WzJdIC0gcFNyY0RzdFszXTsKLSAgICBtWzFdWzFdID0gcFNyY0RzdFswXSAtIHBTcmNEc3RbMV0gLSAgcFNyY0RzdFsyXSArIHBTcmNEc3RbM107Ci0KLSAgICAvKiBRdWFudGl6YXRpb24gKi8KLSAgICBRYml0c1BsdXNPbmUgPSBBUk1fTTRQMTBfUV9PRkZTRVQgKyAxICsgKGlRUCAvIDYpOyAvKmZsb29yIChRUC82KSovCi0gICAgTUYwMCA9IGFybVZDTTRQMTBfTUZNYXRyaXggW2lRUCAlIDZdWzBdOwotCi0gICAgVHdvX2YgPSAoMSA8PCBRYml0c1BsdXNPbmUpIC8gKGJJbnRyYSA/IDMgOiA2KTsgLyogMy0+SU5UUkEsIDYtPklOVEVSICovCi0KLSAgICAvKiBTY2FsaW5nICovCi0gICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbHVlID0gKGFybUFicyhtW2pdW2ldKSAqIE1GMDAgKyBUd29fZikgPj4gUWJpdHNQbHVzT25lOwotICAgICAgICAgICAgcFNyY0RzdFtqICogMiArIGldID0gKE9NWF9TMTYpKChtW2pdW2ldIDwgMCkgPyAtVmFsdWUgOiBWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTk5YTJkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSA0eDQgaGFkYW1hcmQgdHJhbnNmb3JtIG9mIGx1bWEgREMgY29lZmZpY2llbnRzIAotICogYW5kIHF1YW50aXphdGlvbgotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMgICAoNi4zLjUuNi4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBhIDR4NCBIYWRhbWFyZCB0cmFuc2Zvcm0gb2YgbHVtYSBEQyBjb2VmZmljaWVudHMgCi0gKiBhbmQgdGhlbiBxdWFudGl6ZXMgdGhlIGNvZWZmaWNpZW50cy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdGhlIDR4NCBhcnJheSBvZiBsdW1hIERDIGNvZWZmaWNpZW50cy4gIDE2LWJ5dGUgCi0gKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRyYW5zZm9ybWVkIGFuZCBxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgMTYtYnl0ZSAKLSAqICAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0IAotICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGFuIDE2LWJ5dGUgYm91bmRhcnkgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMoCi0JT01YX1MxNiogCXBTcmNEc3QsCi0JT01YX1UzMgkJaVFQCi0pCi17Ci0gICAgT01YX0lOVCAgICAgaSwgajsKLSAgICBPTVhfUzMyICAgICBtMVs0XVs0XSwgbTJbNF1bNF07Ci0gICAgT01YX1MzMiAgICAgVmFsdWU7Ci0gICAgT01YX1UzMiAgICAgUWJpdHNQbHVzT25lLCBUd29fZiwgTUY7Ci0KLSAgICAvKiBDaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBTcmNEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoaVFQID4gNTEsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQotICAgIC8qIEhhZGFtYXJkIFRyYW5zZm9ybSBmb3IgNHg0IGJsb2NrICovCi0gICAgLyogSG9yaXpvbnRhbCBIYWRhbWFyZCAqLwotICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgewotICAgICAgICBqID0gaSAqIDQ7Ci0gICAgICAgIAotICAgICAgICBtMVtpXVswXSA9IHBTcmNEc3RbaiArIDBdICsgcFNyY0RzdFtqICsgMl07IC8qIGErYyAqLwotICAgICAgICBtMVtpXVsxXSA9IHBTcmNEc3RbaiArIDFdICsgcFNyY0RzdFtqICsgM107IC8qIGIrZCAqLwotICAgICAgICBtMVtpXVsyXSA9IHBTcmNEc3RbaiArIDBdIC0gcFNyY0RzdFtqICsgMl07IC8qIGEtYyAqLwotICAgICAgICBtMVtpXVszXSA9IHBTcmNEc3RbaiArIDFdIC0gcFNyY0RzdFtqICsgM107IC8qIGItZCAqLwotCi0gICAgICAgIG0yW2ldWzBdID0gbTFbaV1bMF0gKyBtMVtpXVsxXTsgLyogYStiK2MrZCAqLwotICAgICAgICBtMltpXVsxXSA9IG0xW2ldWzJdICsgbTFbaV1bM107IC8qIGErYi1jLWQgKi8KLSAgICAgICAgbTJbaV1bMl0gPSBtMVtpXVsyXSAtIG0xW2ldWzNdOyAvKiBhLWItYytkICovCi0gICAgICAgIG0yW2ldWzNdID0gbTFbaV1bMF0gLSBtMVtpXVsxXTsgLyogYS1iK2MtZCAqLwotCi0gICAgfQotCi0gICAgLyogVmVydGljYWwgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgIHsKLSAgICAgICAgbTFbMF1baV0gPSBtMlswXVtpXSArIG0yWzJdW2ldOwotICAgICAgICBtMVsxXVtpXSA9IG0yWzFdW2ldICsgbTJbM11baV07Ci0gICAgICAgIG0xWzJdW2ldID0gbTJbMF1baV0gLSBtMlsyXVtpXTsKLSAgICAgICAgbTFbM11baV0gPSBtMlsxXVtpXSAtIG0yWzNdW2ldOwotCi0gICAgICAgIG0yWzBdW2ldID0gbTFbMF1baV0gKyBtMVsxXVtpXTsKLSAgICAgICAgbTJbMV1baV0gPSBtMVsyXVtpXSArIG0xWzNdW2ldOwotICAgICAgICBtMlsyXVtpXSA9IG0xWzJdW2ldIC0gbTFbM11baV07Ci0gICAgICAgIG0yWzNdW2ldID0gbTFbMF1baV0gLSBtMVsxXVtpXTsKLSAgICB9Ci0KLSAgICAKLSAgICAvKiBRdWFudGl6YXRpb24gKi8KLSAgICBRYml0c1BsdXNPbmUgPSBBUk1fTTRQMTBfUV9PRkZTRVQgKyAxICsgKGlRUCAvIDYpOyAvKmZsb29yIChRUC82KSovCi0gICAgVHdvX2YgPSAoMSA8PCBRYml0c1BsdXNPbmUpIC8gMzsgLyogMy0+SU5UUkEsIDYtPklOVEVSICovCi0gICAgTUYgPSBhcm1WQ000UDEwX01GTWF0cml4IFtpUVAgJSA2XVswXTsKLQotICAgIC8qIFNjYWxpbmcgKi8KLSAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgVmFsdWUgPSAoYXJtQWJzKChtMltqXVtpXS8qICsgMSovKSAvIDIpICogTUYgKyBUd29fZikgPj4gUWJpdHNQbHVzT25lOwotICAgICAgICAgICAgcFNyY0RzdFtqICogNCArIGldID0gKE9NWF9TMTYpKChtMltqXVtpXSA8IDApID8gLVZhbHVlIDogVmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfRENUX1RhYmxlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvYXBpL2FybVZDTTRQMl9EQ1RfVGFibGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcyZGExMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvYXBpL2FybVZDTTRQMl9EQ1RfVGFibGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfRENUX1RhYmxlLmgKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKgotICogRmlsZTogICAgICAgIGFybVZDTTRQMl9EQ1RfVGFibGUuaAotICogRGVzY3JpcHRpb246IERlY2xhcmVzIFRhYmxlcyB1c2VkIGZvciBEQ1QvSURDVCBtb2R1bGUKLSAqICAgICAgICAgICAgICBpbiBNUDRQMiBjb2RlYy4KLSAqCi0gKi8KLSAKLSNpZm5kZWYgX09NWERDVFRBQl9IXwotI2RlZmluZSBfT01YRENUVEFCX0hfCi0KLWV4dGVybiBjb25zdCBPTVhfRjY0IGFybVZDTTRQMl9wcmVDYWxjRENUQ29zWzhdWzhdOwotCi0jZW5kaWYgLyogX09NWERDVFRBQl9IXyAqLwotCi0KLS8qIEVuZCBvZiBmaWxlICovCi0KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvYXBpL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODhiZGJjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaAotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqCi0gKiBGaWxlOiAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzLmgKLSAqIERlc2NyaXB0aW9uOiBEZWNsYXJlcyBUYWJsZXMgdXNlZCBmb3IgSHVmZmZtYW4gY29kaW5nIGFuZCBkZWNvZGluZyAKLSAqICAgICAgICAgICAgICBpbiBNUDRQMiBjb2RlYy4KLSAqCi0gKi8KLSAKLSNpZm5kZWYgX09NWEhVRkZUQUJfSF8KLSNkZWZpbmUgX09NWEhVRkZUQUJfSF8KLQotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50cmFMMFJ1bklkeFsxMV07Ci1leHRlcm4gY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMl9JbnRyYVZsY0wwWzY4XTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDFSdW5JZHhbN107Ci1leHRlcm4gY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMl9JbnRyYVZsY0wxWzM2XTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDBMTUFYWzE1XTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDFMTUFYWzIxXTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDBSTUFYWzI3XTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDFSTUFYWzhdOwotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50ZXJMMFJ1bklkeFsxMl07Ci1leHRlcm4gY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMl9JbnRlclZsY0wwWzU5XTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDFSdW5JZHhbM107Ci1leHRlcm4gY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMl9JbnRlclZsY0wxWzQ1XTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDBMTUFYWzI3XTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDFMTUFYWzQxXTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDBSTUFYWzEyXTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDFSTUFYWzNdOwotZXh0ZXJuIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDJfYUludHJhRENMdW1hSW5kZXhbMTRdOwotZXh0ZXJuIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDJfYUludHJhRENDaHJvbWFJbmRleFsxNF07Ci1leHRlcm4gY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMl9hVmxjTVZEWzY2XTsKLQotI2VuZGlmIC8qIF9PTVhIVUZGVEFCX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwYzE2M2YuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKgotICogRmlsZTogICAgICAgIGFybVZDTTRQMl9aaWd6YWdfVGFibGVzLmgKLSAqIERlc2NyaXB0aW9uOiBEZWNsYXJlcyBUYWJsZXMgdXNlZCBmb3IgWmlnemFnIHNjYW4gaW4gTVA0UDIgY29kZWMuCi0gKgotICovCi0gCi0jaWZuZGVmIF9PTVhaSUdaQUdUQUJfSF8KLSNkZWZpbmUgX09NWFpJR1pBR1RBQl9IXwotCi1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiBbNjRdOwotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfYUhvcml6b250YWxaaWd6YWdTY2FuIFs2NF07Ci1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9hVmVydGljYWxaaWd6YWdTY2FuIFs2NF07Ci0KLSNlbmRpZiAvKiBfT01YWklHWkFHVEFCX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9BQ0RDUHJlZGljdC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQUNEQ1ByZWRpY3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk5M2Y3My4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9BQ0RDUHJlZGljdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfQUNEQ1ByZWRpY3QuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnRhaW5zIG1vZHVsZSBmb3IgREMvQUMgY29lZmZpY2llbnQgcHJlZGljdGlvbgotICoKLSAqLyAKLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9BQ0RDUHJlZGljdAotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYWRhcHRpdmUgREMvQUMgY29lZmZpY2llbnQgcHJlZGljdGlvbiBmb3IgYW4gaW50cmEgYmxvY2suIFByaW9yCi0gKiB0byB0aGUgZnVuY3Rpb24gY2FsbCwgcHJlZGljdGlvbiBkaXJlY3Rpb24gKHByZWREaXIpIHNob3VsZCBiZSBzZWxlY3RlZAotICogYXMgc3BlY2lmaWVkIGluIHN1YmNsYXVzZSA3LjQuMy4xIG9mIElTTy9JRUMgMTQ0OTYtMi4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHBTcmNEc3QgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucwotICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBxdWFudGl6ZWQgY29lZmZpY2llbnQgcmVzaWR1YWxzIChQUUYpIG9mIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sKLSAqIFtpbl0gcFByZWRCdWZSb3cgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgotICogW2luXSBwUHJlZEJ1ZkNvbCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyCi0gKiBbaW5dIGN1clFQICAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIGN1cnJlbnQgYmxvY2suIGN1clFQCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF5IGVxdWFsIHRvIHByZWRRUCBlc3BlY2lhbGx5IHdoZW4gdGhlIGN1cnJlbnQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jayBhbmQgdGhlIHByZWRpY3RvciBibG9jayBhcmUgaW4gdGhlIHNhbWUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrLgotICogW2luXSBwcmVkUVAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sKLSAqIFtpbl0gcHJlZERpciAgICAgaW5kaWNhdGVzIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCB0YWtlcyBvbmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVkNfSE9SSVpPTlRBTCAgICBwcmVkaWN0IGhvcml6b250YWxseQotICogICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WQ19WRVJUSUNBTCAgICAgIHByZWRpY3QgdmVydGljYWxseQotICogW2luXSBBQ1ByZWRGbGFnICBhIGZsYWcgaW5kaWNhdGluZyBpZiBBQyBwcmVkaWN0aW9uIHNob3VsZCBiZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1lZC4gSXQgaXMgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIGluIHRoZSBiaXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gc3ludGF4IG9mIE1QRUctNAotICogW2luXSB2aWRlb0NvbXAgICB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlLCBjaHJvbWluYW5jZSBvcgotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhKSBvZiB0aGUgY3VycmVudCBibG9jawotICogW2luXSBmbGFnICAgICAgICBUaGlzIGZsYWcgZGVmaW5lcyB0aGUgaWYgb25lIHdhbnRzIHRvIHVzZSB0aGlzIGZ1bmN0aW9ucyB0bwotICogICAgICAgICAgICAgICAgICBjYWxjdWxhdGUgUFFGIChzZXQgMSwgcHJlZGljdGlvbikgb3IgUUYgKHNldCAwLCByZWNvbnN0cnVjdGlvbikKLSAqIFtvdXRdICAgIHBQcmVBQ1ByZWRpY3QgICBwb2ludGVyIHRvIHRoZSBwcmVkaWN0ZWQgY29lZmZpY2llbnRzIGJ1ZmZlci4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxsZWQgT05MWSBpZiBpdCBpcyBub3QgTlVMTAotICogW291dF0gICAgcFNyY0RzdCAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHF1YW50aXplZCBjb2VmZmljaWVudHMgKFFGKSBvZiB0aGUgY3VycmVudAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrCi0gKiBbb3V0XSAgICBwUHJlZEJ1ZlJvdyBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIKLSAqIFtvdXRdICAgIHBQcmVkQnVmQ29sIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcgotICogW291dF0gICAgcFN1bUVyciAgICAgcG9pbnRlciB0byB0aGUgdXBkYXRlZCBzdW0gb2YgdGhlIGRpZmZlcmVuY2UKLSAqICAgICAgICAgICAgICAgICAgICAgIGJldHdlZW4gcHJlZGljdGVkIGFuZCB1bnByZWRpY3RlZCBjb2VmZmljaWVudHMKLSAqICAgICAgICAgICAgICAgICAgICAgIElmIHRoaXMgaXMgTlVMTCwgZG8gbm90IHVwZGF0ZQotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX0FDRENQcmVkaWN0KAotICAgICBPTVhfUzE2ICogcFNyY0RzdCwKLSAgICAgT01YX1MxNiAqIHBQcmVBQ1ByZWRpY3QsCi0gICAgIE9NWF9TMTYgKiBwUHJlZEJ1ZlJvdywKLSAgICAgT01YX1MxNiAqIHBQcmVkQnVmQ29sLAotICAgICBPTVhfSU5UIGN1clFQLAotICAgICBPTVhfSU5UIHByZWRRUCwKLSAgICAgT01YX0lOVCBwcmVkRGlyLAotICAgICBPTVhfSU5UIEFDUHJlZEZsYWcsCi0gICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcCwKLSAgICAgT01YX1U4IGZsYWcsCi0gICAgIE9NWF9JTlQgKnBTdW1FcnIKLSkKLXsKLSAgICBPTVhfSU5UIGRjU2NhbGVyLCBpOwotICAgIE9NWF9TMTYgdGVtcFByZWQ7Ci0KLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwUHJlZEJ1ZlJvdyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFByZWRCdWZDb2wgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGN1clFQIDw9IDAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwcmVkUVAgPD0gMCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChwcmVkRGlyICE9IDEpICYmIChwcmVkRGlyICE9IDIpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIWFybUlzNEJ5dGVBbGlnbmVkKHBTcmNEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIWFybUlzNEJ5dGVBbGlnbmVkKHBQcmVkQnVmUm93KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczRCeXRlQWxpZ25lZChwUHJlZEJ1ZkNvbCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQotICAgIAotICAgIC8qIFNldCBEQyBzY2FsZXIgdmFsdWUgdG8gYXZvaWQgc29tZSBjb21waWxlcnMgZ2l2aW5nIGEgd2FybmluZy4gKi8KLSAgICBkY1NjYWxlcj0wOwotICAgIAotICAgIC8qIENhbGN1bGF0ZSB0aGUgREMgc2NhbGVyIHZhbHVlICovCi0gICAgaWYgKHZpZGVvQ29tcCA9PSBPTVhfVkNfTFVNSU5BTkNFKQotICAgIHsKLSAgICAgICAgaWYgKGN1clFQID49IDEgJiYgY3VyUVAgPD0gNCkKLSAgICAgICAgewotICAgICAgICAgICAgZGNTY2FsZXIgPSA4OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGN1clFQID49IDUgJiYgY3VyUVAgPD0gOCkKLSAgICAgICAgewotICAgICAgICAgICAgZGNTY2FsZXIgPSAyICogY3VyUVA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY3VyUVAgPj0gOSAmJiBjdXJRUCA8PSAyNCkKLSAgICAgICAgewotICAgICAgICAgICAgZGNTY2FsZXIgPSBjdXJRUCArIDg7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBkY1NjYWxlciA9ICgyICogY3VyUVApIC0gMTY7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAodmlkZW9Db21wID09IE9NWF9WQ19DSFJPTUlOQU5DRSkKLSAgICB7Ci0gICAgICAgIGlmIChjdXJRUCA+PSAxICYmIGN1clFQIDw9IDQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRjU2NhbGVyID0gODsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjdXJRUCA+PSA1ICYmIGN1clFQIDw9IDI0KQotICAgICAgICB7Ci0gICAgICAgICAgICBkY1NjYWxlciA9IChjdXJRUCArIDEzKS8yOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZGNTY2FsZXIgPSBjdXJRUCAtIDY7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocFByZUFDUHJlZGljdCAhPSBOVUxMKQotICAgIHsKLSAgICAgICAgcFByZUFDUHJlZGljdFswXSA9IHByZWREaXI7Ci0gICAgfQotCi0gICAgaWYgKHByZWREaXIgPT0gT01YX1ZDX1ZFUlRJQ0FMKQotICAgIHsKLSAgICAgICAgLyogRlswXVswXS8vZGNfc2NhbGVyICovCi0gICAgICAgIHRlbXBQcmVkID0gYXJtSW50RGl2QXdheUZyb21aZXJvKHBQcmVkQnVmUm93WzBdLCBkY1NjYWxlcik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIEZbMF1bMF0vL2RjX3NjYWxlciAqLwotICAgICAgICB0ZW1wUHJlZCA9IGFybUludERpdkF3YXlGcm9tWmVybyhwUHJlZEJ1ZkNvbFswXSwgZGNTY2FsZXIpOwotICAgIH0KLQotICAgIC8qIFVwZGF0aW5nIHRoZSBEQyB2YWx1ZSB0byB0aGUgcm93IGFuZCBjb2wgYnVmZmVyICovCi0gICAgKihwUHJlZEJ1ZlJvdyAtIDgpID0gKnBQcmVkQnVmQ29sOwotCi0gICAgaWYgKGZsYWcpCi0gICAgewotICAgICAgICAvKiBDYWwgYW5kIHN0b3JlIEZbMF1bMF0gaW50byB0aGUgY29sIGJ1ZmZlciAqLwotICAgICAgICAqcFByZWRCdWZDb2wgPSBwU3JjRHN0WzBdICogZGNTY2FsZXI7Ci0KLSAgICAgICAgLyogUFFGID0gUUYgLSBGWzBdWzBdLy9kY19zY2FsZXIgKi8KLSAgICAgICAgcFNyY0RzdFswXSAtPSB0ZW1wUHJlZDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogUUYgPSBQUUYgKyBGWzBdWzBdLy9kY19zY2FsZXIgKi8KLSAgICAgICAgcFNyY0RzdFswXSArPSB0ZW1wUHJlZDsKLSAgICAgICAgCi0gICAgICAgIC8qIFNhdHVyYXRlICovCi0gICAgICAgIHBTcmNEc3RbMF0gPSBhcm1DbGlwICgtMjA0OCwgMjA0NywgcFNyY0RzdFswXSk7Ci0KLSAgICAgICAgLyogQ2FsIGFuZCBzdG9yZSBGWzBdWzBdIGludG8gdGhlIGNvbCBidWZmZXIgKi8KLSAgICAgICAgKnBQcmVkQnVmQ29sID0gcFNyY0RzdFswXSAqIGRjU2NhbGVyOwotICAgIH0KLQotCi0gICAgaWYgKEFDUHJlZEZsYWcgPT0gMSkKLSAgICB7Ci0gICAgICAgIGlmIChwcmVkRGlyID09IE9NWF9WQ19WRVJUSUNBTCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IDg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0ZW1wUHJlZCA9IGFybUludERpdkF3YXlGcm9tWmVybyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocFByZWRCdWZSb3dbaV0gKiBwcmVkUVAsIGN1clFQKTsKLSAgICAgICAgICAgICAgICBpZiAoZmxhZykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0aW5nIFFGIHRvIHRoZSByb3cgYnVmZiAqLwotICAgICAgICAgICAgICAgICAgICBwUHJlZEJ1ZlJvd1tpXSA9IHBTcmNEc3RbaV07Ci0gICAgICAgICAgICAgICAgICAgIC8qUFFGWFt2XVswXSA9IFFGWFt2XVswXSAtIChRRkFbdl1bMF0gKiBRUEEpIC8vIFFQWCAqLwotICAgICAgICAgICAgICAgICAgICBwU3JjRHN0W2ldIC09IHRlbXBQcmVkOwotICAgICAgICAgICAgICAgICAgICAvKiBTdW0gb2YgYWJzb2x1dGUgdmFsdWVzIG9mIEFDIHByZWRpY3Rpb24gZXJyb3IsIHRoaXMgY2FuCi0gICAgICAgICAgICAgICAgICAgIGJlIHVzZWQgYXMgYSByZWZlcmVuY2UgdG8gY2hvb3NlIHdoZXRoZXIgdG8gdXNlCi0gICAgICAgICAgICAgICAgICAgIEFDIHByZWRpY3Rpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgKnBTdW1FcnIgKz0gYXJtQWJzKHBTcmNEc3RbaV0pOwotICAgICAgICAgICAgICAgICAgICAvKiBwUHJlQUNQcmVkaWN0WzF+N10gc3RvcmUgdGhlIGVycm9yIHNpZ25hbAotICAgICAgICAgICAgICAgICAgICBhZnRlciBBQyBwcmVkaWN0aW9uICovCi0gICAgICAgICAgICAgICAgICAgIHBQcmVBQ1ByZWRpY3RbaV0gPSBwU3JjRHN0W2ldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKlFGWFt2XVswXSA9IFBRRlhbdl1bMF0gKyAoUUZBW3ZdWzBdICogUVBBKSAvLyBRUFggKi8KLSAgICAgICAgICAgICAgICAgICAgcFNyY0RzdFtpXSArPSB0ZW1wUHJlZDsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8qIFNhdHVyYXRlICovCi0gICAgICAgICAgICAgICAgICAgIHBTcmNEc3RbaV0gPSBhcm1DbGlwICgtMjA0OCwgMjA0NywgcFNyY0RzdFtpXSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGluZyBRRiB0byB0aGUgcm93IGJ1ZmYgKi8KLSAgICAgICAgICAgICAgICAgICAgcFByZWRCdWZSb3dbaV0gPSBwU3JjRHN0W2ldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDg7IGkgPCA2NDsgaSArPSA4KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRlbXBQcmVkID0gYXJtSW50RGl2QXdheUZyb21aZXJvIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwUHJlZEJ1ZkNvbFtpPj4zXSAqIHByZWRRUCwgY3VyUVApOwotICAgICAgICAgICAgICAgIGlmIChmbGFnKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRpbmcgUUYgdG8gY29sIGJ1ZmYgKi8KLSAgICAgICAgICAgICAgICAgICAgcFByZWRCdWZDb2xbaT4+M10gPSBwU3JjRHN0W2ldOwotICAgICAgICAgICAgICAgICAgICAvKlBRRlhbMF1bdV0gPSBRRlhbMF1bdV0gLSAoUUZBWzBdW3VdICogUVBBKSAvLyBRUFggKi8KLSAgICAgICAgICAgICAgICAgICAgcFNyY0RzdFtpXSAtPSB0ZW1wUHJlZDsKLSAgICAgICAgICAgICAgICAgICAgLyogU3VtIG9mIGFic29sdXRlIHZhbHVlcyBvZiBBQyBwcmVkaWN0aW9uIGVycm9yLCB0aGlzIGNhbgotICAgICAgICAgICAgICAgICAgICBiZSB1c2VkIGFzIGEgcmVmZXJlbmNlIHRvIGNob29zZSB3aGV0aGVyIHRvIHVzZSBBQwotICAgICAgICAgICAgICAgICAgICBwcmVkaWN0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICpwU3VtRXJyICs9IGFybUFicyhwU3JjRHN0W2ldKTsKLSAgICAgICAgICAgICAgICAgICAgLyogcFByZUFDUHJlZGljdFsxfjddIHN0b3JlIHRoZSBlcnJvciBzaWduYWwKLSAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgQUMgcHJlZGljdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICBwUHJlQUNQcmVkaWN0W2k+PjNdID0gcFNyY0RzdFtpXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypRRlhbMF1bdV0gPSBQUUZYWzBdW3VdICsgKFFGQVswXVt1XSAqIFFQQSkgLy8gUVBYICovCi0gICAgICAgICAgICAgICAgICAgIHBTcmNEc3RbaV0gKz0gdGVtcFByZWQ7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvKiBTYXR1cmF0ZSAqLwotICAgICAgICAgICAgICAgICAgICBwU3JjRHN0W2ldID0gYXJtQ2xpcCAoLTIwNDgsIDIwNDcsIHBTcmNEc3RbaV0pOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRpbmcgUUYgdG8gY29sIGJ1ZmYgKi8KLSAgICAgICAgICAgICAgICAgICAgcFByZWRCdWZDb2xbaT4+M10gPSBwU3JjRHN0W2ldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKkVuZCBvZiBGaWxlKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQmxvY2tNYXRjaF9IYWxmLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZmZGExMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYuYworKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZi5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogQ29udGFpbnMgbW9kdWxlcyBmb3IgQmxvY2sgbWF0Y2hpbmcsIGEgZnVsbCBzZWFyY2ggYWxnb3JpdGhtCi0gKiBpcyBpbXBsZW1lbnRlZAotICoKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgbWF0Y2ggd2l0aCBoYWxmLXBpeGVsIHJlc29sdXRpb24uICBSZXR1cm5zIHRoZSBlc3RpbWF0ZWQgCi0gKiBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgVGhpcyBmdW5jdGlvbiBlc3RpbWF0ZXMgdGhlIGhhbGYtcGl4ZWwgCi0gKiBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGludGVnZXIgcmVzb2x1dGlvbiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgCi0gKiBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RNViwgaS5lLiwgdGhlIGluaXRpYWwgaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgCi0gKiBleHRlcm5hbGx5LiAgVGhlIGlucHV0IHBhcmFtZXRlcnMgcFNyY1JlZkJ1ZiBhbmQgcFNlYXJjaFBvaW50UmVmUG9zIHNob3VsZCBiZSAKLSAqIHNoaWZ0ZWQgYnkgdGhlIHdpbm5pbmcgTVYgb2YgMTZ4MTYgaW50ZWdlciBzZWFyY2ggcHJpb3IgdG8gY2FsbGluZyBCbG9ja01hdGNoX0hhbGZfMTZ4MTYuICAKLSAqIFRoZSBmdW5jdGlvbiBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYgbWF5IGJlIHVzZWQgZm9yIGludGVnZXIgbW90aW9uIGVzdGltYXRpb24uCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwU3JjUmVmQnVmCQlwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgTUIgCi0gKiAgICAgICAgICAgICAgICAgICAgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiAKLSAqICAgICAgICAgICAgICAgICAgICB0aGUJY3VycmVudCBwbGFuZS4KLSAqIFtpbl0JcmVmV2lkdGgJCSAgd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZQotICogW2luXQlwUmVmUmVjdAkJICByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZQotICogW2luXQlwU3JjQ3VyckJ1ZgkJcG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGV4dHJhY3RlZCBmcm9tIG9yaWdpbmFsIHBsYW5lIAotICogICAgICAgICAgICAgICAgICAgIChsaW5lYXIgYXJyYXksIDI1NiBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiBbaW5dCXBTZWFyY2hQb2ludFJlZlBvcwlwb3NpdGlvbiBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGhhbGYgcGl4ZWwgc2VhcmNoIChzcGVjaWZpZWQgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGVybXMgb2YgaW50ZWdlciBwaXhlbCB1bml0cykgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZS4KLSAqIFtpbl0Jcm5kVmFsCQkJICByb3VuZGluZyBjb250cm9sIGJpdCBmb3IgaGFsZiBwaXhlbCBtb3Rpb24gZXN0aW1hdGlvbjsgCi0gKiAgICAgICAgICAgICAgICAgICAgMD1yb3VuZGluZyBjb250cm9sIGRpc2FibGVkOyAxPXJvdW5kaW5nIGNvbnRyb2wgZW5hYmxlZAotICogW2luXQlwU3JjRHN0TVYJCXBvaW50ZXIgdG8gdGhlIGluaXRpYWwgTVYgZXN0aW1hdGU7IHR5cGljYWxseSBnZW5lcmF0ZWQgZHVyaW5nIGEgcHJpb3IgCi0gKiAgICAgICAgICAgICAgICAgIDE2WDE2IGludGVnZXIgc2VhcmNoIGFuZCBpdHMgdW5pdCBpcyBoYWxmIHBpeGVsLgotICogW2luXSBCbG9ja1NpemUgICAgIE1hY3JvQmxvY2sgU2l6ZSBpLmUgZWl0aGVyIDE2eDE2IG9yIDh4OC4KLSAqIFtvdXRdcFNyY0RzdE1WCQlwb2ludGVyIHRvIGVzdGltYXRlZCBNVgotICogW291dF1wRHN0U0FECQkJcG9pbnRlciB0byBtaW5pbXVtIFNBRAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TdHNfTm9FcnIgqEMgbm8gZXJyb3IKLSAqIE9NWF9TdHNfQmFkQXJnRXJyIKhDIGJhZCBhcmd1bWVudHMKLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYoCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKLSAgICAgT01YX0lOVCByZWZXaWR0aCwKLSAgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCi0gICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBTZWFyY2hQb2ludFJlZlBvcywKLSAgICAgT01YX0lOVCBybmRWYWwsCi0gICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0TVYsCi0gICAgIE9NWF9JTlQgKnBEc3RTQUQsCi0gICAgIE9NWF9VOCBCbG9ja1NpemUKLSkKLXsKLSAgICBPTVhfSU5UICAgICBvdXRlciwgaW5uZXIsIGNvdW50LCBpbmRleDsKLSAgICBPTVhfUzE2ICAgICBoYWxmUGVsWCA9IDAsIGhhbGZQZWxZID0gMCwgeCwgeTsKLSAgICBPTVhfSU5UICAgICBjYW5kU0FELCByZWZTQUQgPSAwOwotICAgIE9NWF9JTlQgICAgIG1pblNBRCwgZnJvbVgsIHRvWCwgZnJvbVksIHRvWTsKLSAgICAvKiBPZmZzZXQgdG8gdGhlIHJlZmVyZW5jZSBhdCB0aGUgYmVnaW5pbmcgb2YgdGhlIGJvdW5kaW5nIGJveCAqLwotICAgIGNvbnN0IE9NWF9VOCAgICAgICpwVGVtcFNyY1JlZkJ1ZjsKLSAgICBPTVhfVTggdGVtcFBlbDsKLSAgICAgICAgCi0gICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZkJ1ZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFJlZlJlY3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBTcmNDdXJyQnVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwU2VhcmNoUG9pbnRSZWZQb3MgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3RNViA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocERzdFNBRCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLSAgICAvKiBQb3NpdGlvbmluZyB0aGUgcG9pbnRlciAqLwotICAgIHBUZW1wU3JjUmVmQnVmID0gcFNyY1JlZkJ1ZiArIChyZWZXaWR0aCAqIChwU3JjRHN0TVYtPmR5LzIpKSArIChwU3JjRHN0TVYtPmR4LzIpOwotCi0gICAgLyogQ29weSB0aGUgY2FuZGlkYXRlIHRvIHRoZSB0ZW1wb3JhcnkgbGluZWFyIGFycmF5ICovCi0gICAgZm9yIChvdXRlciA9IDAsIGNvdW50ID0gMCxpbmRleCA9IDA7Ci0gICAgICAgICBvdXRlciA8IEJsb2NrU2l6ZTsKLSAgICAgICAgIG91dGVyKyssIGluZGV4ICs9IHJlZldpZHRoIC0gQmxvY2tTaXplKQotICAgIHsKLSAgICAgICAgZm9yIChpbm5lciA9IDA7IGlubmVyIDwgQmxvY2tTaXplOyBpbm5lcisrLCBjb3VudCsrLCBpbmRleCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICByZWZTQUQgKz0gYXJtQWJzIChwVGVtcFNyY1JlZkJ1ZltpbmRleF0gLSBwU3JjQ3VyckJ1Zltjb3VudF0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogU2V0IHRoZSBtaW5TYWQgYXMgcmVmZXJlbmNlIFNBRCAqLwotICAgIG1pblNBRCA9IHJlZlNBRDsKLSAgICAqcERzdFNBRCA9IHJlZlNBRDsKLQotICAgIC8qIENoZWNrIGZvciB2YWxpZCByZWdpb24gKi8KLSAgICBmcm9tWCA9IDE7Ci0gICAgdG9YICAgPSAxOwotICAgIGZyb21ZID0gMTsKLSAgICB0b1kgICA9IDE7Ci0gICAgaWYgKChwU2VhcmNoUG9pbnRSZWZQb3MtPnggLSAxKSA8IHBSZWZSZWN0LT54KQotICAgIHsKLSAgICAgICAgZnJvbVggPSAwOwotICAgIH0KLQotICAgIGlmICgocFNlYXJjaFBvaW50UmVmUG9zLT54ICsgQmxvY2tTaXplICsgMSkgPiAocFJlZlJlY3QtPnggKyBwUmVmUmVjdC0+d2lkdGgpKQotICAgIHsKLSAgICAgICAgdG9YICAgPSAwOwotICAgIH0KLQotICAgIGlmICgocFNlYXJjaFBvaW50UmVmUG9zLT55IC0gMSkgPCBwUmVmUmVjdC0+eSkKLSAgICB7Ci0gICAgICAgIGZyb21ZID0gMDsKLSAgICB9Ci0KLSAgICBpZiAoKHBTZWFyY2hQb2ludFJlZlBvcy0+eSArIEJsb2NrU2l6ZSArIDEpID4gKHBSZWZSZWN0LT55ICsgcFJlZlJlY3QtPmhlaWdodCkpCi0gICAgewotICAgICAgICB0b1kgICA9IDA7Ci0gICAgfQotCi0gICAgLyogTG9vcGluZyBvbiB5LSBheGlzICovCi0gICAgZm9yICh5ID0gLWZyb21ZOyB5IDw9IHRvWTsgeSsrKQotICAgIHsKLSAgICAgICAgLyogTG9vcGluZyBvbiB4LSBheGlzICovCi0gICAgICAgIGZvciAoeCA9IC1mcm9tWDsgeCA8PSB0b1g7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgLyogY2hlY2sgZm9yIGludGVnZXIgcG9zaXRpb24gKi8KLSAgICAgICAgICAgIGlmICggeCA9PSAwICYmIHkgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIFBvc2l0aW9uaW5nIHRoZSBwb2ludGVyICovCi0gICAgICAgICAgICBwVGVtcFNyY1JlZkJ1ZiA9IHBTcmNSZWZCdWYgKyAocmVmV2lkdGggKiAocFNyY0RzdE1WLT5keS8yKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAocFNyY0RzdE1WLT5keC8yKTsKLQotICAgICAgICAgICAgLyogSW50ZXJwb2xhdGUgdGhlIHBpeGVsIGFuZCBjYWxjdWxhdGUgdGhlIFNBRCovCi0gICAgICAgICAgICBmb3IgKG91dGVyID0gMCwgY291bnQgPSAwLCBjYW5kU0FEID0gMCxpbmRleCA9IDA7Ci0gICAgICAgICAgICAgICAgIG91dGVyIDwgQmxvY2tTaXplOwotICAgICAgICAgICAgICAgICBvdXRlcisrLCBpbmRleCArPSByZWZXaWR0aCAtIEJsb2NrU2l6ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKGlubmVyID0gMDsgaW5uZXIgPCBCbG9ja1NpemU7IGlubmVyKyssIGNvdW50KyssaW5kZXgrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBQZWwgPSAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wU3JjUmVmQnVmW2luZGV4XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBUZW1wU3JjUmVmQnVmW2luZGV4ICsgeF0gKiBhcm1BYnMoeCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwVGVtcFNyY1JlZkJ1ZltpbmRleCArIHJlZldpZHRoICogeV0gKiBhcm1BYnMoeSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwVGVtcFNyY1JlZkJ1ZltpbmRleCArIHJlZldpZHRoICogeSArIHhdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhcm1BYnMoeCp5KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGFybUFicyAoeCkgKyBhcm1BYnMgKHkpIC0gcm5kVmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIC8gKDIgKiAoYXJtQWJzICh4KSArIGFybUFicyAoeSkpKTsKLSAgICAgICAgICAgICAgICAgICAgY2FuZFNBRCArPSBhcm1BYnMgKHRlbXBQZWwgLSBwU3JjQ3VyckJ1Zltjb3VudF0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogUmVzdWx0IGNhbGN1bGF0aW9ucyAqLwotICAgICAgICAgICAgaWYgKGFybVZDTTRQMl9Db21wYXJlTVYgKHgsIHksIGNhbmRTQUQsIGhhbGZQZWxYLCBoYWxmUGVsWSwgbWluU0FEKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqcERzdFNBRCA9IGNhbmRTQUQ7Ci0gICAgICAgICAgICAgICAgbWluU0FEICAgPSBjYW5kU0FEOwotICAgICAgICAgICAgICAgIGhhbGZQZWxYID0geDsKLSAgICAgICAgICAgICAgICBoYWxmUGVsWSA9IHk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSAvKiBFbmQgb2YgeC0gYXhpcyAqLwotICAgIH0gLyogRW5kIG9mIHktYXhpcyAqLwotCi0gICAgcFNyY0RzdE1WLT5keCArPSBoYWxmUGVsWDsKLSAgICBwU3JjRHN0TVYtPmR5ICs9IGhhbGZQZWxZOwotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci0KLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMDU2NjAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udGFpbnMgbW9kdWxlcyBmb3IgQmxvY2sgbWF0Y2hpbmcsIGEgZnVsbCBzZWFyY2ggYWxnb3JpdGhtCi0gKiBpcyBpbXBsZW1lbnRlZAotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYSAxNngxNiBibG9jayBzZWFyY2g7IGVzdGltYXRlcyBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgCi0gKiBCb3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IG1vdGlvbiB2ZWN0b3JzIGFyZSByZXByZXNlbnRlZCB1c2luZyBoYWxmLXBpeGVsIHVuaXRzLCBhbmQgCi0gKiB0aGVyZWZvcmUgYSBzaGlmdCBsZWZ0IG9yIHJpZ2h0IGJ5IDEgYml0IG1heSBiZSByZXF1aXJlZCwgcmVzcGVjdGl2ZWx5LCB0byBtYXRjaCB0aGUgCi0gKiBpbnB1dCBvciBvdXRwdXQgTVZzIHdpdGggb3RoZXIgZnVuY3Rpb25zIHRoYXQgZWl0aGVyIGdlbmVyYXRlIG91dHB1dCBNVnMgb3IgZXhwZWN0IAotICogaW5wdXQgTVZzIHJlcHJlc2VudGVkIHVzaW5nIGludGVnZXIgcGl4ZWwgdW5pdHMuIAotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcFNyY1JlZkJ1ZgkJcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIE1CIHRoYXQgCi0gKiAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgICAgICAgICAgcGxhbmUuCi0gKiBbaW5dCXJlZldpZHRoCQkgIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUKLSAqIFtpbl0JcFJlZlJlY3QJCSAgcG9pbnRlciB0byB0aGUgdmFsaWQgcmVjdGFuZ3VsYXIgaW4gcmVmZXJlbmNlIHBsYW5lLiBSZWxhdGl2ZSB0byBpbWFnZSBvcmlnaW4uIAotICogICAgICAgICAgICAgICAgICAgIEl0J3Mgbm90IGxpbWl0ZWQgdG8gdGhlIGltYWdlIGJvdW5kYXJ5LCBidXQgZGVwZW5kZWQgb24gdGhlIHBhZGRpbmcuIEZvciBleGFtcGxlLCAKLSAqICAgICAgICAgICAgICAgICAgICBpZiB5b3UgcGFkIDQgcGl4ZWxzIG91dHNpZGUgdGhlIGltYWdlIGJvcmRlciwgdGhlbiB0aGUgdmFsdWUgZm9yIGxlZnQgYm9yZGVyIAotICogICAgICAgICAgICAgICAgICAgIGNhbiBiZSAtNAotICogW2luXQlwU3JjQ3VyckJ1ZgkJcG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGV4dHJhY3RlZCBmcm9tIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIAotICogICAgICAgICAgICAgICAgICAgIDI1NiBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4KLSAqIFtpbl0gcEN1cnJQb2ludFBvcwlwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lCi0gKiBbaW5dIHBTcmNQcmVNVgkJICBwb2ludGVyIHRvIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yOyBOVUxMIGluZGljYXRlcyBubyBwcmVkaWN0ZWQgTVYKLSAqIFtpbl0gcFNyY1ByZVNBRAkJcG9pbnRlciB0byBTQUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVkaWN0ZWQgTVYgKHJlZmVyZW5jZWQgYnkgcFNyY1ByZU1WKQotICogW2luXSBzZWFyY2hSYW5nZQkJc2VhcmNoIHJhbmdlIGZvciAxNlgxNiBpbnRlZ2VyIGJsb2NrLHRoZSB1bml0cyBvZiBpdCBpcyBmdWxsIHBpeGVsLHRoZSBzZWFyY2ggcmFuZ2UgCi0gKiAgICAgICAgICAgICAgICAgICAgaXMgdGhlIHNhbWUgaW4gYWxsIGRpcmVjdGlvbnMuSXQgaXMgaW4gaW5jbHVzaXZlIG9mIHRoZSBib3VuZGFyeSBhbmQgc3BlY2lmaWVkIGluIAotICogICAgICAgICAgICAgICAgICAgIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMuCi0gKiBbaW5dIHBNRVNwZWMJCQkgIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAotICogICAgICAgICAgICAgICAgICAgIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgYmxvY2sgbWF0Y2hpbmcgCi0gKiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24uCi0gKiBbb3V0XQlwRHN0TVYJCQlwb2ludGVyIHRvIGVzdGltYXRlZCBNVgotICogW291dF0JcERzdFNBRAkJCXBvaW50ZXIgdG8gbWluaW11bSBTQUQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfU3RzX05vRXJyIKhDIG5vIGVycm9yLgotICogT01YX1N0c19CYWRBcmdFcnIgqEMgYmFkIGFyZ3VtZW50cwotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcigKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAotICAgICBPTVhfSU5UIHJlZldpZHRoLAotICAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKLSAgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKLSAgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNQcmVNViwKLSAgICAgY29uc3QgT01YX0lOVCAqcFNyY1ByZVNBRCwKLSAgICAgdm9pZCAqcE1FU3BlYywKLSAgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBEc3RNViwKLSAgICAgT01YX0lOVCAqcERzdFNBRCwKLSAgICAgT01YX1U4IEJsb2NrU2l6ZQotKQotewotCi0gICAgLyogRGVmaW5pdGlvbnMgYW5kIEluaXRpYWxpemF0aW9ucyovCi0KLSAgICBPTVhfSU5UICAgICBvdXRlciwgaW5uZXIsIGNvdW50LGluZGV4OwotICAgIE9NWF9JTlQgICAgIGNhbmRTQUQ7Ci0gICAgLyooMjU2KjI1NiArMSkgdGhpcyBpcyB0byBtYWtlIHRoZSBTQUQgbWF4IGluaXRpYWxseSovCi0gICAgT01YX0lOVCAgICAgbWluU0FEID0gMHgxMDAwMSwgZnJvbVgsIHRvWCwgZnJvbVksIHRvWTsKLSAgICAvKiBPZmZzZXQgdG8gdGhlIHJlZmVyZW5jZSBhdCB0aGUgYmVnaW5pbmcgb2YgdGhlIGJvdW5kaW5nIGJveCAqLwotICAgIGNvbnN0IE9NWF9VOCAgICAgICpwVGVtcFNyY1JlZkJ1ZjsKLSAgICBPTVhfUzE2ICAgICB4LCB5OwotICAgIE9NWF9JTlQgc2VhcmNoUmFuZ2U7Ci0gICAKLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmQnVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwUmVmUmVjdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFNyY0N1cnJCdWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBDdXJyUG9pbnRQb3MgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBNRVNwZWMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBEc3RNViA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocERzdFNBRCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgICAgIAotICAgIHNlYXJjaFJhbmdlID0gKChPTVhWQ000UDJNRVBhcmFtcyAqKXBNRVNwZWMpLT5zZWFyY2hSYW5nZTsKLSAgICAvKiBDaGVjayBmb3IgdmFsaWQgcmVnaW9uICovCi0gICAgZnJvbVggPSBzZWFyY2hSYW5nZTsKLSAgICB0b1ggICA9IHNlYXJjaFJhbmdlOwotICAgIGZyb21ZID0gc2VhcmNoUmFuZ2U7Ci0gICAgdG9ZICAgPSBzZWFyY2hSYW5nZTsKLQotICAgIGlmICgocEN1cnJQb2ludFBvcy0+eCAtIHNlYXJjaFJhbmdlKSA8IHBSZWZSZWN0LT54KQotICAgIHsKLSAgICAgICAgZnJvbVggPSAgcEN1cnJQb2ludFBvcy0+eCAtIHBSZWZSZWN0LT54OwotICAgIH0KLQotICAgIGlmICgocEN1cnJQb2ludFBvcy0+eCArIEJsb2NrU2l6ZSArIHNlYXJjaFJhbmdlKSA+IChwUmVmUmVjdC0+eCArIHBSZWZSZWN0LT53aWR0aCkpCi0gICAgewotICAgICAgICB0b1ggICA9IHBSZWZSZWN0LT53aWR0aCAtIChwQ3VyclBvaW50UG9zLT54IC0gcFJlZlJlY3QtPngpIC0gQmxvY2tTaXplOwotICAgIH0KLQotICAgIGlmICgocEN1cnJQb2ludFBvcy0+eSAtIHNlYXJjaFJhbmdlKSA8IHBSZWZSZWN0LT55KQotICAgIHsKLSAgICAgICAgZnJvbVkgPSBwQ3VyclBvaW50UG9zLT55IC0gcFJlZlJlY3QtPnk7Ci0gICAgfQotCi0gICAgaWYgKChwQ3VyclBvaW50UG9zLT55ICsgQmxvY2tTaXplICsgc2VhcmNoUmFuZ2UpID4gKHBSZWZSZWN0LT55ICsgcFJlZlJlY3QtPmhlaWdodCkpCi0gICAgewotICAgICAgICB0b1kgICA9IHBSZWZSZWN0LT53aWR0aCAtIChwQ3VyclBvaW50UG9zLT55IC0gcFJlZlJlY3QtPnkpIC0gQmxvY2tTaXplOwotICAgIH0KLQotICAgIHBEc3RNVi0+ZHggPSAtZnJvbVg7Ci0gICAgcERzdE1WLT5keSA9IC1mcm9tWTsKLSAgICAvKiBMb29waW5nIG9uIHktIGF4aXMgKi8KLSAgICBmb3IgKHkgPSAtZnJvbVk7IHkgPD0gdG9ZOyB5KyspCi0gICAgewotCi0gICAgICAgIC8qIExvb3Bpbmcgb24geC0gYXhpcyAqLwotICAgICAgICBmb3IgKHggPSAtZnJvbVg7IHggPD0gdG9YOyB4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFBvc2l0aW9uaW5nIHRoZSBwb2ludGVyICovCi0gICAgICAgICAgICBwVGVtcFNyY1JlZkJ1ZiA9IHBTcmNSZWZCdWYgKyAocmVmV2lkdGggKiB5KSArIHg7Ci0KLSAgICAgICAgICAgIC8qIENhbGN1bGF0ZSB0aGUgU0FEICovCi0gICAgICAgICAgICBmb3IgKG91dGVyID0gMCwgY291bnQgPSAwLCBpbmRleCA9IDAsIGNhbmRTQUQgPSAwOwotICAgICAgICAgICAgICAgICBvdXRlciA8IEJsb2NrU2l6ZTsKLSAgICAgICAgICAgICAgICAgb3V0ZXIrKywgaW5kZXggKz0gcmVmV2lkdGggLSBCbG9ja1NpemUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbm5lciA9IDA7IGlubmVyIDwgQmxvY2tTaXplOyBpbm5lcisrLCBjb3VudCsrLCBpbmRleCsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FuZFNBRCArPSBhcm1BYnMgKHBUZW1wU3JjUmVmQnVmW2luZGV4XSAtIHBTcmNDdXJyQnVmW2NvdW50XSk7ICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIFJlc3VsdCBjYWxjdWxhdGlvbnMgKi8KLSAgICAgICAgICAgIGlmIChhcm1WQ000UDJfQ29tcGFyZU1WICh4LCB5LCBjYW5kU0FELCBwRHN0TVYtPmR4LzIsIHBEc3RNVi0+ZHkvMiwgbWluU0FEKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqcERzdFNBRCA9IGNhbmRTQUQ7Ci0gICAgICAgICAgICAgICAgbWluU0FEICAgPSBjYW5kU0FEOwotICAgICAgICAgICAgICAgIHBEc3RNVi0+ZHggPSB4KjI7Ci0gICAgICAgICAgICAgICAgcERzdE1WLT5keSA9IHkqMjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IC8qIEVuZCBvZiB4LSBheGlzICovCi0gICAgfSAvKiBFbmQgb2YgeS1heGlzICovCi0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLQotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2hlY2tWTENFc2NhcGVNb2RlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DaGVja1ZMQ0VzY2FwZU1vZGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU1MTBlNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DaGVja1ZMQ0VzY2FwZU1vZGUuYworKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0NoZWNrVkxDRXNjYXBlTW9kZS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogQ29udGFpbnMgbW9kdWxlIGZvciBWTEMgZXNjYXBlIG1vZGUgY2hlY2sgCi0gKgotICovIAotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0NoZWNrVkxDRXNjYXBlTW9kZQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgZXNjYXBlIG1vZGUgZGVjaXNpb24gYmFzZWQgb24gdGhlIHJ1biwgcnVuKywgbGV2ZWwsIGxldmVsKyBhbmQgCi0gKiBsYXN0IGNvbWJpbmF0aW9ucy4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHJ1biAgICAgICAgICAgICBSdW4gdmFsdWUgKGNvdW50IG9mIHplcm9zKSB0byBiZSBlbmNvZGVkICAKLSAqIFtpbl0gbGV2ZWwgICAgICAgICAgIExldmVsIHZhbHVlIChub24temVybyB2YWx1ZSkgdG8gYmUgZW5jb2RlZAotICogW2luXSBydW5QbHVzICAgICAgICAgQ2FsY3VsYXRlZCBhcyBydW5QbHVzID0gcnVuIC0gKFJNQVggKyAxKSAgCi0gKiBbaW5dIGxldmVsUGx1cyAgICAgICBDYWxjdWxhdGVkIGFzIAotICogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxQbHVzID0gc2lnbihsZXZlbCkqW2FicyhsZXZlbCkgLSBMTUFYXQotICogW2luXSBtYXhTdG9yZVJ1biAgICAgTWF4IHN0b3JlIHBvc3NpYmxlIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSkKLSAqIFtpbl0gbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzIAotICogICAgICAgICAgICAgICAgICAgICAgVGhlIHJ1biB2YWx1ZSBhZnRlciB3aGljaCBsZXZlbCAKLSAqICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogCi0gKiAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKQotICogW2luXSBwUnVuSW5kZXhUYWJsZSAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKLSAqICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpCi0gKgotICogICAgICAgICAgICAgICAgICAgICAgCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBSZXR1cm5zIGFuIEVzY2FwZSBtb2RlIHdoaWNoIGNhbiB0YWtlIHZhbHVlcyBmcm9tIDAgdG8gMwotICogMCAtLT4gbm8gZXNjYXBlIG1vZGUsIDEgLS0+IGVzY2FwZSB0eXBlIDEsCi0gKiAxIC0tPiBlc2NhcGUgdHlwZSAyLCAzIC0tPiBlc2NhcGUgdHlwZSAzLCBjaGVjayBzZWN0aW9uIDcuNC4xLjMKLSAqIGluIHRoZSBNUEVHIElTTyBzdGFuZGFyZC4KLSAqCi0gKi8KLQotT01YX1U4IGFybVZDTTRQMl9DaGVja1ZMQ0VzY2FwZU1vZGUoCi0gICAgIE9NWF9VMzIgcnVuLAotICAgICBPTVhfVTMyIHJ1blBsdXMsCi0gICAgIE9NWF9TMTYgbGV2ZWwsCi0gICAgIE9NWF9TMTYgbGV2ZWxQbHVzLAotICAgICBPTVhfVTggIG1heFN0b3JlUnVuLAotICAgICBPTVhfVTggIG1heFJ1bkZvck11bHRpcGxlRW50cmllcywKLSAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAotICAgICBjb25zdCBPTVhfVTggICpwUnVuSW5kZXhUYWJsZQotKQotewotICAgIE9NWF9VOCBlc2NhcGUgPSAwLCBmTW9kZSA9IDAsIGVudHJpZXM7Ci0gICAgCi0gICAgbGV2ZWwgPSBhcm1BYnMgKGxldmVsKTsKLSAgICBsZXZlbFBsdXMgPSBhcm1BYnMgKGxldmVsUGx1cyk7Ci0gICAgCi0gICAgLyogQ2hlY2sgZm9yIGEgdmFsaWQgZW50cnkgd2l0aCBydW4sIGxldmVsIGFuZCBMYXN0IGNvbWJpbmF0aW9uIAotICAgICAgIE1vZGUgMCBjaGVjayAqLwotICAgIGlmIChydW4gPD0gbWF4U3RvcmVSdW4pCi0gICAgewotICAgICAgICBlbnRyaWVzID0gcFJ1bkluZGV4VGFibGVbcnVuICsgMV0KLSAgICAgICAgICAgICAgICAgIC0gcFJ1bkluZGV4VGFibGVbcnVuXTsKLSAgICAgICAgaWYgKHJ1biA+IG1heFJ1bkZvck11bHRpcGxlRW50cmllcykKLSAgICAgICAgewotICAgICAgICAgICAgZW50cmllcyA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxldmVsID4gZW50cmllcykKLSAgICAgICAgewotICAgICAgICAgICAgZXNjYXBlID0gMTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBlc2NhcGUgPSAxOwotICAgIH0KLSAgICBpZihlc2NhcGUgJiYgc2hvcnRWaWRlb0hlYWRlcikKLSAgICB7Ci0gICAgICAgIGVzY2FwZSA9IDA7Ci0gICAgICAgIGZNb2RlID0gNDsKLSAgICB9Ci0gICAgLyogQ2hlY2sgZm9yIGEgdmFsaWQgZW50cnkgd2l0aCBydW4sIGxldmVsUGx1cyBhbmQgTGFzdCBjb21iaW5hdGlvbiAKLSAgICAgICBNb2RlIDEgY2hlY2sgKi8gICAgCi0gICAgaWYgKGVzY2FwZSkKLSAgICB7Ci0gICAgICAgIGVzY2FwZSA9IDA7Ci0gICAgICAgIGZNb2RlID0gMTsKLSAgICAgICAgaWYgKHJ1biA8PSBtYXhTdG9yZVJ1bikKLSAgICAgICAgewotICAgICAgICAgICAgZW50cmllcyA9IHBSdW5JbmRleFRhYmxlW3J1biArIDFdCi0gICAgICAgICAgICAgICAgICAgICAgLSBwUnVuSW5kZXhUYWJsZVtydW5dOwotICAgICAgICAgICAgaWYgKHJ1biA+IG1heFJ1bkZvck11bHRpcGxlRW50cmllcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbnRyaWVzID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChsZXZlbFBsdXMgPiBlbnRyaWVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVzY2FwZSA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBlc2NhcGUgPSAxOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qIENoZWNrIGZvciBhIHZhbGlkIGVudHJ5IHdpdGggcnVuUGx1cywgbGV2ZWwgYW5kIExhc3QgY29tYmluYXRpb24gCi0gICAgICAgTW9kZSAyIGNoZWNrICovICAgIAotICAgIGlmIChlc2NhcGUpCi0gICAgewotICAgICAgICBlc2NhcGUgPSAwOwotICAgICAgICBmTW9kZSA9IDI7Ci0gICAgICAgIGlmIChydW5QbHVzIDw9IG1heFN0b3JlUnVuKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbnRyaWVzID0gcFJ1bkluZGV4VGFibGVbcnVuUGx1cyArIDFdCi0gICAgICAgICAgICAgICAgICAgICAgLSBwUnVuSW5kZXhUYWJsZVtydW5QbHVzXTsKLSAgICAgICAgICAgIGlmIChydW5QbHVzID4gbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVudHJpZXMgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGxldmVsID4gZW50cmllcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlc2NhcGUgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZXNjYXBlID0gMTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKiBzZWxlY3QgbW9kZSAzIC0tPiBGTEMgKi8KLSAgICBpZiAoZXNjYXBlKQotICAgIHsKLSAgICAgICAgZk1vZGUgPSAzOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gZk1vZGU7Ci19Ci0KLS8qRW5kIG9mIEZpbGUqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9Db21wYXJlTVYuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NvbXBhcmVNVi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjYyMWEzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NvbXBhcmVNVi5jCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9Db21wYXJlTVYuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnRhaW5zIG1vZHVsZSBmb3IgY29tcGFyaW5nIG1vdGlvbiB2ZWN0b3JzIGFuZCBTQUQncyB0byBkZWNpZGUgCi0gKiB0aGUgYmVzdCBNViBhbmQgU0FECi0gKgotICovCi0gIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0NvbXBhcmVNVgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgY29tcGFyaXNpb24gb2YgbW90aW9uIHZlY3RvcnMgYW5kIFNBRCdzIHRvIGRlY2lkZSB0aGUgCi0gKiBiZXN0IE1WIGFuZCBTQUQKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCSAgICBtdlgJCXggY29vcmRpbmF0ZSBvZiB0aGUgY2FuZGlkYXRlIG1vdGlvbiB2ZWN0b3IKLSAqIFtpbl0JICAgIG12WQkJeSBjb29yZGluYXRlIG9mIHRoZSBjYW5kaWRhdGUgbW90aW9uIHZlY3RvcgotICogW2luXQkgICAgY2FuZFNBRAlDYW5kaWRhdGUgU0FECi0gKiBbaW5dCSAgICBiZXN0TVZYCXggY29vcmRpbmF0ZSBvZiB0aGUgYmVzdCBtb3Rpb24gdmVjdG9yCi0gKiBbaW5dCSAgICBiZXN0TVZZCXkgY29vcmRpbmF0ZSBvZiB0aGUgYmVzdCBtb3Rpb24gdmVjdG9yCi0gKiBbaW5dCSAgICBiZXN0U0FECWJlc3QgU0FECi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX0lOVCAtLSAxIHRvIGluZGljYXRlIHRoYXQgdGhlIGN1cnJlbnQgc2FkIGlzIHRoZSBiZXN0IAotICogICAgICAgICAgICAwIHRvIGluZGljYXRlIHRoYXQgaXQgaXMgTk9UIHRoZSBiZXN0IFNBRAotICovCi0KLU9NWF9JTlQgYXJtVkNNNFAyX0NvbXBhcmVNViAoCi0gICAgT01YX1MxNiBtdlgsIAotICAgIE9NWF9TMTYgbXZZLCAKLSAgICBPTVhfSU5UIGNhbmRTQUQsIAotICAgIE9NWF9TMTYgYmVzdE1WWCwgCi0gICAgT01YX1MxNiBiZXN0TVZZLCAKLSAgICBPTVhfSU5UIGJlc3RTQUQKLSkgCi17Ci0gICAgaWYgKGNhbmRTQUQgPCBiZXN0U0FEKQotICAgIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGlmIChjYW5kU0FEID4gYmVzdFNBRCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAvKiBzaG9ydGVyIG1vdGlvbiB2ZWN0b3IgKi8KLSAgICBpZiAoIChtdlggKiBtdlggKyBtdlkgKiBtdlkpIDwgKGJlc3RNVlgqYmVzdE1WWCtiZXN0TVZZKmJlc3RNVlkpICkKLSAgICB7Ci0gICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qRW5kIG9mIEZpbGUqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRENUX1RhYmxlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EQ1RfVGFibGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QwNTVkOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EQ1RfVGFibGUuYworKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0gLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9EQ1RfVGFibGUuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfRENUX1RhYmxlLmMKLSAqIERlc2NyaXB0aW9uOiBDb250YWlucyB0aGUgRENUL0lEQ1QgY29lZmZpY2VudCBtYXRyaXgKLSAqCi0gKi8KLQotI2lmbmRlZiBfT01YRENUQ09TVEFCX0NfCi0jZGVmaW5lIF9PTVhEQ1RDT1NUQUJfQ18KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0KLWNvbnN0IE9NWF9GNjQgYXJtVkNNNFAyX3ByZUNhbGNEQ1RDb3NbOF1bOF0gPQotewotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgMC4zNTM1NTMzOTA1OTMyNzM3MzAsIAotICAgICAgICAgICAgICAgIDAuNDkwMzkyNjQwMjAxNjE1MjIwLCAKLSAgICAgICAgICAgICAgICAwLjQ2MTkzOTc2NjI1NTY0MzM3MCwgCi0gICAgICAgICAgICAgICAgMC40MTU3MzQ4MDYxNTEyNzI2MjAsIAotICAgICAgICAgICAgICAgIDAuMzUzNTUzMzkwNTkzMjczNzkwLCAKLSAgICAgICAgICAgICAgICAwLjI3Nzc4NTExNjUwOTgwMTE0MCwgCi0gICAgICAgICAgICAgICAgMC4xOTEzNDE3MTYxODI1NDQ5MjAsIAotICAgICAgICAgICAgICAgIDAuMDk3NTQ1MTYxMDA4MDY0MTUyIAotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgMC4zNTM1NTMzOTA1OTMyNzM3MzAsIAotICAgICAgICAgICAgICAgIDAuNDE1NzM0ODA2MTUxMjcyNjIwLCAKLSAgICAgICAgICAgICAgICAwLjE5MTM0MTcxNjE4MjU0NDkyMCwgCi0gICAgICAgICAgICAgICAgLTAuMDk3NTQ1MTYxMDA4MDY0MDk2LCAKLSAgICAgICAgICAgICAgICAtMC4zNTM1NTMzOTA1OTMyNzM3MzAsIAotICAgICAgICAgICAgICAgIC0wLjQ5MDM5MjY0MDIwMTYxNTIyMCwgCi0gICAgICAgICAgICAgICAgLTAuNDYxOTM5NzY2MjU1NjQzNDIwLCAKLSAgICAgICAgICAgICAgICAtMC4yNzc3ODUxMTY1MDk4MDEwOTAKLSAgICAgICAgfSwKLSAgICAgICAgewotICAgICAgICAgICAgICAgIDAuMzUzNTUzMzkwNTkzMjczNzMwLCAKLSAgICAgICAgICAgICAgICAwLjI3Nzc4NTExNjUwOTgwMTE0MCwgCi0gICAgICAgICAgICAgICAgLTAuMTkxMzQxNzE2MTgyNTQ0ODYwLCAKLSAgICAgICAgICAgICAgICAtMC40OTAzOTI2NDAyMDE2MTUyMjAsIAotICAgICAgICAgICAgICAgIC0wLjM1MzU1MzM5MDU5MzI3Mzg0MCwgCi0gICAgICAgICAgICAgICAgMC4wOTc1NDUxNjEwMDgwNjQxMzgsIAotICAgICAgICAgICAgICAgIDAuNDYxOTM5NzY2MjU1NjQzMjYwLCAKLSAgICAgICAgICAgICAgICAwLjQxNTczNDgwNjE1MTI3MjczMCAKLSAgICAgICAgfSwKLSAgICAgICAgewotICAgICAgICAgICAgICAgIDAuMzUzNTUzMzkwNTkzMjczNzMwLCAKLSAgICAgICAgICAgICAgICAwLjA5NzU0NTE2MTAwODA2NDE1MiwgCi0gICAgICAgICAgICAgICAgLTAuNDYxOTM5NzY2MjU1NjQzMzcwLCAKLSAgICAgICAgICAgICAgICAtMC4yNzc3ODUxMTY1MDk4MDEwOTAsIAotICAgICAgICAgICAgICAgIDAuMzUzNTUzMzkwNTkzMjczNjgwLCAKLSAgICAgICAgICAgICAgICAwLjQxNTczNDgwNjE1MTI3MjczMCwgCi0gICAgICAgICAgICAgICAgLTAuMTkxMzQxNzE2MTgyNTQ0OTIwLCAKLSAgICAgICAgICAgICAgICAtMC40OTAzOTI2NDAyMDE2MTUzMzAKLSAgICAgICAgfSwKLSAgICAgICAgewotICAgICAgICAgICAgICAgIDAuMzUzNTUzMzkwNTkzMjczNzMwLCAKLSAgICAgICAgICAgICAgICAtMC4wOTc1NDUxNjEwMDgwNjQwOTYsIAotICAgICAgICAgICAgICAgIC0wLjQ2MTkzOTc2NjI1NTY0MzQyMCwgCi0gICAgICAgICAgICAgICAgMC4yNzc3ODUxMTY1MDk4MDA5MjAsIAotICAgICAgICAgICAgICAgIDAuMzUzNTUzMzkwNTkzMjczODQwLCAKLSAgICAgICAgICAgICAgICAtMC40MTU3MzQ4MDYxNTEyNzI2MjAsIAotICAgICAgICAgICAgICAgIC0wLjE5MTM0MTcxNjE4MjU0NTI4MCwgCi0gICAgICAgICAgICAgICAgMC40OTAzOTI2NDAyMDE2MTUyMjAgCi0gICAgICAgIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICAwLjM1MzU1MzM5MDU5MzI3MzczMCwgCi0gICAgICAgICAgICAgICAgLTAuMjc3Nzg1MTE2NTA5ODAwOTgwLCAKLSAgICAgICAgICAgICAgICAtMC4xOTEzNDE3MTYxODI1NDUxNzAsIAotICAgICAgICAgICAgICAgIDAuNDkwMzkyNjQwMjAxNjE1MjIwLCAKLSAgICAgICAgICAgICAgICAtMC4zNTM1NTMzOTA1OTMyNzMzNDAsIAotICAgICAgICAgICAgICAgIC0wLjA5NzU0NTE2MTAwODA2NDAxMywgCi0gICAgICAgICAgICAgICAgMC40NjE5Mzk3NjYyNTU2NDMzNzAsIAotICAgICAgICAgICAgICAgIC0wLjQxNTczNDgwNjE1MTI3MjUxMAotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgMC4zNTM1NTMzOTA1OTMyNzM3MzAsIAotICAgICAgICAgICAgICAgIC0wLjQxNTczNDgwNjE1MTI3MjY3MCwgCi0gICAgICAgICAgICAgICAgMC4xOTEzNDE3MTYxODI1NDUwMDAsIAotICAgICAgICAgICAgICAgIDAuMDk3NTQ1MTYxMDA4MDY0Mzg4LCAKLSAgICAgICAgICAgICAgICAtMC4zNTM1NTMzOTA1OTMyNzM2MjAsIAotICAgICAgICAgICAgICAgIDAuNDkwMzkyNjQwMjAxNjE1MzMwLCAKLSAgICAgICAgICAgICAgICAtMC40NjE5Mzk3NjYyNTU2NDMyMDAsIAotICAgICAgICAgICAgICAgIDAuMjc3Nzg1MTE2NTA5ODAwNzYwIAotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgMC4zNTM1NTMzOTA1OTMyNzM3MzAsIAotICAgICAgICAgICAgICAgIC0wLjQ5MDM5MjY0MDIwMTYxNTIyMCwgCi0gICAgICAgICAgICAgICAgMC40NjE5Mzk3NjYyNTU2NDMyNjAsIAotICAgICAgICAgICAgICAgIC0wLjQxNTczNDgwNjE1MTI3MjYyMCwgCi0gICAgICAgICAgICAgICAgMC4zNTM1NTMzOTA1OTMyNzMyOTAsIAotICAgICAgICAgICAgICAgIC0wLjI3Nzc4NTExNjUwOTgwMDc2MCwgCi0gICAgICAgICAgICAgICAgMC4xOTEzNDE3MTYxODI1NDQ3ODAsIAotICAgICAgICAgICAgICAgIC0wLjA5NzU0NTE2MTAwODA2NDI3NwotICAgICAgICB9Ci19OwotCi0jZW5kaWYgLypfT01YRENUQ09TVEFCX0NfKi8KLQotCi0vKiBFbmQgb2YgZmlsZSAqLwotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19pbnRyYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX2ludHJhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YWExOTguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX2ludHJhLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfaW50cmEuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGZpbGxpbmcgb2YgdGhlIGNvZWZmaWNpZW50IGJ1ZmZlcgotICoKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oIgotI2luY2x1ZGUgImFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgiCi0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIG9uZSBpbnRyYSBjb2RlZCBibG9jay4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHBwQml0U3RyZWFtICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJpdHN0cmVhbSBidWZmZXIKLSAqIFtpbl0gcEJpdE9mZnNldCAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJ5ICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLTddLgotICogW2luXSBwcmVkRGlyICAgICAgICAgQUMgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHppZ3phZyBzY2FuIHBhdHRlcm4uIEl0IHRha2VzIG9uZSBvZiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sbG93aW5nIHZhbHVlczoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZDX05PTkUgIEFDIHByZWRpY3Rpb24gbm90IHVzZWQ7Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtIGNsYXNzaWNhbCB6aWd6YWcgc2NhbjsKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZDX0hPUklaT05UQUwgICAgSG9yaXpvbnRhbCBwcmVkaWN0aW9uOwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtIGFsdGVybmF0ZS12ZXJ0aWNhbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aWd6YWcgc2NhbjsKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMICAgICAgVmVydGljYWwgcHJlZGljdGlvbjsKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGh1cyBwZXJmb3JtCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVybmF0ZS1ob3Jpem9udGFsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuLgotICogW2luXSBzdGFydCAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIDB0aCBlbGVtZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgICBvciAxc3QuCi0gKiBbb3V0XSAgICBwcEJpdFN0cmVhbSAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWQsIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyCi0gKiBbb3V0XSAgICBwQml0T2Zmc2V0ICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0KLSAqIFtvdXRdICAgIHBEc3QgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jay4gU2hvdWxkIGJlIDMyLWJpdCBhbGlnbmVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhKAotICAgICBjb25zdCBPTVhfVTggKiogcHBCaXRTdHJlYW0sCi0gICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAotICAgICBPTVhfUzE2ICogcERzdCwKLSAgICAgT01YX1U4IHByZWREaXIsCi0gICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKLSAgICAgT01YX1U4ICBzdGFydAotKQotewotICAgIE9NWF9VOCAgbGFzdCA9IDA7Ci0gICAgY29uc3QgT01YX1U4ICAqcFppZ3phZ1RhYmxlID0gYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuOwotICAgIE9NWFJlc3VsdCBlcnJvckNvZGU7Ci0gICAgCi0gICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCi0gICAgYXJtUmV0QXJnRXJySWYocHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCpwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJpdE9mZnNldCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIWFybUlzNEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKCpwQml0T2Zmc2V0IDwgMCkgfHwgKCpwQml0T2Zmc2V0ID43KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChwcmVkRGlyID4gMiksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQotICAgIHN3aXRjaCAocHJlZERpcikKLSAgICB7Ci0gICAgICAgIGNhc2UgT01YX1ZDX05PTkU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHBaaWd6YWdUYWJsZSA9IGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBPTVhfVkNfSE9SSVpPTlRBTDoKLSAgICAgICAgewotICAgICAgICAgICAgcFppZ3phZ1RhYmxlID0gYXJtVkNNNFAyX2FWZXJ0aWNhbFppZ3phZ1NjYW47Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgT01YX1ZDX1ZFUlRJQ0FMOgotICAgICAgICB7Ci0gICAgICAgICAgICBwWmlnemFnVGFibGUgPSBhcm1WQ000UDJfYUhvcml6b250YWxaaWd6YWdTY2FuOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgZXJyb3JDb2RlID0gYXJtVkNNNFAyX0dldFZMQ0JpdHMgKAotICAgICAgICAgICAgICBwcEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgcEJpdE9mZnNldCwKLQkJCSAgcERzdCwKLQkJCSAgc2hvcnRWaWRlb0hlYWRlciwKLQkJCSAgc3RhcnQsCi0JCQkgICZsYXN0LAotCQkJICAxMCwKLQkJCSAgNjIsCi0JCQkgICA3LAotCQkJICAyMSwKLSAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBSdW5JZHgsCi0gICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRyYVZsY0wwLAotCQkJICBhcm1WQ000UDJfSW50cmFMMVJ1bklkeCwKLSAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludHJhVmxjTDEsCi0gICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRyYUwwTE1BWCwKLSAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDFMTUFYLAotICAgICAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMFJNQVgsCi0gICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRyYUwxUk1BWCwKLSAgICAgICAgICAgICAgcFppZ3phZ1RhYmxlICk7Ci0gICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7Ci0gICAgCi0gICAgaWYgKGxhc3QgPT0gMCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBPTVhfU3RzX0VycjsKLSAgICB9Ci0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qIEVuZCBvZiBmaWxlICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19pbnRyYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRW5jb2RlVkxDWmlnemFnX2ludHJhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MWM1NDcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRW5jb2RlVkxDWmlnemFnX2ludHJhLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9FbmNvZGVWTENaaWd6YWdfaW50cmEuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGVuY29kaW5nCi0gKiBmb3IgaW50cmEgYmxvY2suCi0gKgotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgiCi0jaW5jbHVkZSAiYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaCIKLQotCi0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmEKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGVuY29kaW5nIGZvciBvbmUgaW50cmEgYmxvY2suCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBwcEJpdFN0cmVhbSAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXQgc3RyZWFtCi0gKiBbaW5dIHBCaXRPZmZzZXQgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcuCi0gKiBbaW5dIHBRRGN0QmxrQ29lZiAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50Ci0gKiBbaW5dIHByZWREaXIgICAgICAgICBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiwgd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHppZ3phZyBzY2FuIHBhdHRlcm4uIFRoaXMgdGFrZXMgb25lIG9mIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgdmFsdWVzOgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVkNfTk9ORSAgICAgICAgICBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW4uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WQ19IT1JJWk9OVEFMICAgIEhvcml6b250YWwgcHJlZGljdGlvbi4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVkNfVkVSVElDQUwgICAgICBWZXJ0aWNhbCBwcmVkaWN0aW9uLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aWd6YWcgc2Nhbi4KLSAqIFtpbl0gcGF0dGVybiAgICAgICAgIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGJsb2NrIGlzIGVuY29kZWQKLSAqIFtpbl0gc3RhcnQgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAwdGggZWxlbWVudAotICogICAgICAgICAgICAgICAgICAgICAgb3IgMXN0LgotICogW291dF0gICAgcHBCaXRTdHJlYW0gICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4KLSAqIFtvdXRdICAgIHBCaXRPZmZzZXQgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmEoCi0gICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCi0gICAgIE9NWF9VOCBwcmVkRGlyLAotICAgICBPTVhfVTggcGF0dGVybiwKLSAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAotICAgICBPTVhfVTggc3RhcnQKLSkKLXsKLSAgICBjb25zdCBPTVhfVTggICpwWmlnemFnVGFibGUgPSBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW47Ci0gICAgT01YUmVzdWx0IGVycm9yQ29kZTsKLSAgICAKLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKnBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQml0T2Zmc2V0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwUURjdEJsa0NvZWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCgqcEJpdE9mZnNldCA8IDApIHx8ICgqcEJpdE9mZnNldCA+NyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihzdGFydCA+IDEsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwcmVkRGlyID4gMiwgT01YX1N0c19CYWRBcmdFcnIpOwotCi0gICAgaWYgKHBhdHRlcm4pCi0gICAgewotICAgICAgICBzd2l0Y2ggKHByZWREaXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgT01YX1ZDX05PTkU6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFppZ3phZ1RhYmxlID0gYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIE9NWF9WQ19IT1JJWk9OVEFMOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBaaWd6YWdUYWJsZSA9IGFybVZDTTRQMl9hVmVydGljYWxaaWd6YWdTY2FuOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIE9NWF9WQ19WRVJUSUNBTDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwWmlnemFnVGFibGUgPSBhcm1WQ000UDJfYUhvcml6b250YWxaaWd6YWdTY2FuOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBlcnJvckNvZGUgPSBhcm1WQ000UDJfUHV0VkxDQml0cyAoCi0gICAgICAgICAgICAgIHBwQml0U3RyZWFtLAotICAgICAgICAgICAgICBwQml0T2Zmc2V0LAotICAgICAgICAgICAgICBwUURjdEJsa0NvZWYsCi0gICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIsCi0gICAgICAgICAgICAgIHN0YXJ0LAotICAgICAgICAgICAgICAxNCwKLSAgICAgICAgICAgICAgMjAsCi0gICAgICAgICAgICAgIDksCi0gICAgICAgICAgICAgIDYsCi0gICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRyYUwwUnVuSWR4LAotICAgICAgICAgICAgICBhcm1WQ000UDJfSW50cmFWbGNMMCwKLQkJCSAgYXJtVkNNNFAyX0ludHJhTDFSdW5JZHgsCi0gICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRyYVZsY0wxLAotICAgICAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMExNQVgsCi0gICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRyYUwxTE1BWCwKLSAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBSTUFYLAotICAgICAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMVJNQVgsCi0gICAgICAgICAgICAgIHBaaWd6YWdUYWJsZQotICAgICAgICApOwotICAgICAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKLSAgICAgICAgCi0gICAgfSAvKiBQYXR0ZXJuIGNoZWNrIGVuZHMqLwotCi0gICAgcmV0dXJuIChPTVhfU3RzX05vRXJyKTsKLQotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRmlsbFZMQ0J1ZmZlci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRmlsbFZMQ0J1ZmZlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWI3NzE0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0ZpbGxWTENCdWZmZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0ZpbGxWTENCdWZmZXIuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnRhaW5zIG1vZHVsZSBmb3IgcHV0dGluZyBWTEMgYml0cwotICoKLSAqLyAKLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0ZpbGxWTENCdWZmZXIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGNhbGN1bGF0aW5nIHRoZSBWTEMgYml0cyBkZXBlbmRpbmcgb24gdGhlIGVzY2FwZSB0eXBlIGFuZCBpbnNlcnQgCi0gKiB0aGUgc2FtZSBpbiB0aGUgYml0c3RyZWFtCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQkgcHBCaXRTdHJlYW0JCXBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgotICoJICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJpdCBzdHJlYW0KLSAqIFtpbl0JIHBCaXRPZmZzZXQgICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNwotICogW2luXSAgcnVuICAgICAgICAgICAgICAgIFJ1biB2YWx1ZSAoY291bnQgb2YgemVyb3MpIHRvIGJlIGVuY29kZWQgIAotICogW2luXSAgbGV2ZWwgICAgICAgICAgICAgIExldmVsIHZhbHVlIChub24temVybyB2YWx1ZSkgdG8gYmUgZW5jb2RlZAotICogW2luXSAgcnVuUGx1cyAgICAgICAgICAgIENhbGN1bGF0ZWQgYXMgcnVuUGx1cyA9IHJ1biAtIChSTUFYICsgMSkgIAotICogW2luXSAgbGV2ZWxQbHVzICAgICAgICAgIENhbGN1bGF0ZWQgYXMgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxQbHVzID0gc2lnbihsZXZlbCkqW2FicyhsZXZlbCkgLSBMTUFYXQotICogW2luXSAgZk1vZGUgICAgICAgICAgICAgIEZsYWcgaW5kaWNhdGluZyB0aGUgZXNjYXBlIG1vZGVzCi0gKiBbaW5dICBsYXN0ICAgICAgICAgICAgICAgc3RhdHVzIG9mIHRoZSBsYXN0IGZsYWcKLSAqIFtpbl0gIG1heFJ1bkZvck11bHRpcGxlRW50cmllcyAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgcnVuIHZhbHVlIGFmdGVyIHdoaWNoIGxldmVsIHdpbGwgYmUgZXF1YWwgdG8gMTogCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykKLSAqIFtpbl0gIHBSdW5JbmRleFRhYmxlICAgICBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbgotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaAotICogW2luXSAgcFZsY1RhYmxlICAgICAgICAgIFZMQyB0YWJsZSBkZWZpbmVkIGluIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaAotICogW291dF0gcHBCaXRTdHJlYW0JCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4KLSAqIFtvdXRdIHBCaXRPZmZzZXQgICAgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0uCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfRmlsbFZMQ0J1ZmZlciAoCi0gICAgICAgICAgICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgICAgICAgICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKLSAgICAgICAgICAgICAgT01YX1UzMiBydW4sCi0gICAgICAgICAgICAgIE9NWF9TMTYgbGV2ZWwsIAotCQkJICBPTVhfVTMyIHJ1blBsdXMsCi0gICAgICAgICAgICAgIE9NWF9TMTYgbGV2ZWxQbHVzLCAKLSAgICAgICAgICAgICAgT01YX1U4ICBmTW9kZSwKLQkJCSAgT01YX1U4ICBsYXN0LAotICAgICAgICAgICAgICBPTVhfVTggIG1heFJ1bkZvck11bHRpcGxlRW50cmllcywgCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKnBSdW5JbmRleFRhYmxlLAotICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZQotKQotewotICAgIE9NWF9JTlQgdGVtcEluZGV4OwotCU9NWF9VMzIgdGVtcFJ1biA9IHJ1biwgc2lnbiA9IDA7Ci0gICAgT01YX1MxNiB0ZW1wTGV2ZWwgPSBsZXZlbDsgCi0gICAgCi0gICAgLyogRXNjYXBlIHNlcXVlbmNlIGFkZGl0aW9uICovCi0gICAgaWYgKGZNb2RlID09IDEpCi0gICAgewotICAgICAgICBhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMywgNyk7Ci0gICAgICAgIGFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAwLCAxKTsKLQkJdGVtcExldmVsID0gbGV2ZWxQbHVzOwotCi0gICAgfQotICAgIGVsc2UgaWYoZk1vZGUgPT0gMikKLSAgICB7Ci0gICAgICAgIGFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAzLCA3KTsKLSAgICAgICAgYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDIsIDIpOwotCQl0ZW1wUnVuID0gcnVuUGx1czsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZk1vZGUgPT0gMykKLSAgICB7Ci0gICAgICAgIGFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAzLCA3KTsKLSAgICAgICAgYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDMsIDIpOwotICAgIH0KLSAgICBlbHNlIGlmIChmTW9kZSA9PSA0KQotICAgIHsKLSAgICAgICAgYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDMsIDcpOwotICAgICAgICBhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgKE9NWF9VMzIpbGFzdCwgMSk7Ci0JCWFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCB0ZW1wUnVuLCA2KTsKLQkJaWYoKHRlbXBMZXZlbCAhPSAwKSAmJiAodGVtcExldmVsICE9IC0xMjgpKQotCQl7Ci0JCSAgICBhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwKLQkJCSAgIChPTVhfVTMyKSB0ZW1wTGV2ZWwsIDgpOwotCQl9Ci0JCXJldHVybiBPTVhfU3RzX05vRXJyOwkJCi0gICAgfQotICAgIAotICAgIGlmICh0ZW1wTGV2ZWwgPCAwKQotICAgIHsKLSAgICAgICAgc2lnbiA9IDE7Ci0gICAgICAgIHRlbXBMZXZlbCA9IGFybUFicyh0ZW1wTGV2ZWwpOwotICAgIH0KLSAgICAvKiBQdXR0aW5nIFZMQyBiaXRzIGluIHRoZSBzdHJlYW0gKi8KLQlpZiAoZk1vZGUgPCAzKQotCXsKLQkJaWYgKHRlbXBSdW4gPiBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMpCi0JCXsKLQkJCXRlbXBJbmRleCA9IHBSdW5JbmRleFRhYmxlIFttYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMgKyAxXSArIAotCQkJCQkJKHRlbXBSdW4gLSBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMgLSAxKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXRlbXBJbmRleCA9IHBSdW5JbmRleFRhYmxlIFt0ZW1wUnVuXSArICh0ZW1wTGV2ZWwgLTEpOwotCQl9Ci0gICAgCi0JCWFybVBhY2tWTEMzMiAocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsCi0JCQkJCSAgcFZsY1RhYmxlIFt0ZW1wSW5kZXhdKTsKLQkJYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIChPTVhfVTMyKXNpZ24sIDEpOwotCX0KLSAgICBlbHNlCi0JewotCQlpZiAoc2lnbikKLQkJewotCQkJdGVtcExldmVsID0gLXRlbXBMZXZlbDsKLQkJfQotCQl0ZW1wUnVuICA9IHJ1bjsKLQkJYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIChPTVhfVTMyKWxhc3QsIDEpOwotCQlhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgdGVtcFJ1biwgNik7Ci0JCWFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAxLCAxKTsKLQkJYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsCi0JCQkgICAoT01YX1UzMikgdGVtcExldmVsLCAxMik7Ci0JCWFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAxLCAxKTsKLQl9Ci0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qRW5kIG9mIEZpbGUqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9GaWxsVkxEQnVmZmVyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9GaWxsVkxEQnVmZmVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwOWY1ZDUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRmlsbFZMREJ1ZmZlci5jCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBDb250YWlucyBtb2R1bGUgZm9yIFZMQyBnZXQgYml0cyBmcm9tIHRoZSBzdHJlYW0gCi0gKgotICovIAotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLQotI2luY2x1ZGUgImFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgiCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGZpbGxpbmcgb2YgdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBhY2NvcmRpbmcgdG8gdGhlIHJ1biwgbGV2ZWwKLSAqIGFuZCBzaWduLCBhbHNvIHVwZGF0ZXMgdGhlIGluZGV4Ci0gKiAKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBzdG9yZVJ1biAgICAgICAgU3RvcmVkIFJ1biB2YWx1ZSAoY291bnQgb2YgemVyb3MpICAgCi0gKiBbaW5dICBzdG9yZUxldmVsICAgICAgU3RvcmVkIExldmVsIHZhbHVlIChub24temVybyB2YWx1ZSkKLSAqIFtpbl0gIHNpZ24gICAgICAgICAgICBGbGFnIGluZGljYXRpbmcgdGhlIHNpZ24gb2YgbGV2ZWwKLSAqIFtpbl0gIGxhc3QgICAgICAgICAgICBzdGF0dXMgb2YgdGhlIGxhc3QgZmxhZwotICogW2luXSAgcEluZGV4ICAgICAgICAgIHBvaW50ZXIgdG8gY29lZmZpY2llbnQgaW5kZXggaW4gOHg4IG1hdHJpeAotICogW291dF0gcEluZGV4ICAgICAgICAgIHBvaW50ZXIgdG8gdXBkYXRlZCBjb2VmZmljaWVudCBpbmRleCBpbiA4eDggCi0gKiAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4Ci0gKiBbaW5dICBwWmlnemFnVGFibGUgICAgcG9pbnRlciB0byB0aGUgemlnemFnIHRhYmxlcwotICogW291dF0gcERzdCAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgYmxvY2suIFNob3VsZCBiZSAzMi1iaXQgYWxpZ25lZAotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlcigKLSAgICBPTVhfVTMyIHN0b3JlUnVuLAotICAgIE9NWF9TMTYgKiBwRHN0LAotICAgIE9NWF9TMTYgc3RvcmVMZXZlbCwKLSAgICBPTVhfVTggIHNpZ24sCi0gICAgT01YX1U4ICBsYXN0LAotICAgIE9NWF9VOCAgKiBwSW5kZXgsCi0gICAgY29uc3QgT01YX1U4ICogcFppZ3phZ1RhYmxlCi0pCi17Ci0gICAgLyogU3RvcmUgdGhlIHplcm8ncyBhcyBwZXIgdGhlIHJ1biBsZW5ndGggY291bnQgKi8KLSAgICBmb3IgKDtzdG9yZVJ1biA+IDA7IHN0b3JlUnVuLS0sICgqcEluZGV4KSsrKQotICAgIHsKLSAgICAgICAgcERzdFtwWmlnemFnVGFibGVbKnBJbmRleF1dID0gMDsKLSAgICB9Ci0gICAgLyogU3RvcmUgdGhlIGxldmVsIGRlcGVuZGluZyBvbiB0aGUgc2lnbiovCi0gICAgaWYgKHNpZ24gPT0gMSkKLSAgICB7Ci0gICAgICAgIHBEc3RbcFppZ3phZ1RhYmxlWypwSW5kZXhdXSA9IC1zdG9yZUxldmVsOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwRHN0W3BaaWd6YWdUYWJsZVsqcEluZGV4XV0gPSBzdG9yZUxldmVsOwotICAgIH0KLSAgICAoKnBJbmRleCkrKzsKLQotICAgIC8qIElmIGxhc3QgaXMgMSwgZmlsbCB0aGUgcmVtYWluaW5nIGVsbWVudHMgb2YgdGhlIGJ1ZmZlciB3aXRoIHplcm9zICovCi0gICAgaWYgKGxhc3QgPT0gMSkKLSAgICB7Ci0gICAgICAgIHdoaWxlICgqcEluZGV4IDwgNjQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBEc3RbcFppZ3phZ1RhYmxlWypwSW5kZXhdXSA9IDA7Ci0gICAgICAgICAgICAoKnBJbmRleCkrKzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9HZXRWTENCaXRzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9HZXRWTENCaXRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlYjE0MTEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfR2V0VkxDQml0cy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfR2V0VkxDQml0cy5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogQ29udGFpbnMgbW9kdWxlIGZvciBWTEMgZ2V0IGJpdHMgZnJvbSB0aGUgc3RyZWFtIAotICoKLSAqLyAKLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgotI2luY2x1ZGUgImFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgiCi0jaW5jbHVkZSAiYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oIgotCi0gCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfR2V0VkxDQml0cwotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgZXNjYXBlIG1vZGUgZGVjaXNpb24gYmFzZWQgb24gdGhlIHJ1biwgcnVuKywgbGV2ZWwsIGxldmVsKyBhbmQgCi0gKiBsYXN0IGNvbWJpbmF0aW9ucy4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KLSAqCQkJCQkJCQl0aGUgYml0IHN0cmVhbQotICogW2luXQlwQml0T2Zmc2V0CQlwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotICoJCQkJCQkJCWJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNwotICogW2luXSBzdGFydCAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIAotICogICAgICAgICAgICAgICAgICAgICAgMHRoIGVsZW1lbnQgb3IgMXN0LgotICogW2luL291dF0gcExhc3QgICAgICAgcG9pbnRlciB0byBsYXN0IHN0YXR1cyBmbGFnCi0gKiBbaW5dIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAgICAgICBUaGUgcnVuIHZhbHVlIGZyb20gd2hpY2ggbGV2ZWwgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IGxhc3QgPT0gMAotICogW2luXSBJbmRleEJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAgICAgQXJyYXkgaW5kZXggaW4gdGhlIFZMQyB0YWJsZSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50aW5nIHRvIHRoZSAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwIAotICogW2luXSBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wxICAgICAgVGhlIHJ1biB2YWx1ZSBmcm9tIHdoaWNoIGxldmVsIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiBsYXN0ID09IDEKLSAqIFtpbl0gSW5kZXhCZWdpblNpbmdsZUxldmVsRW50cmllc0wxICAgIEFycmF5IGluZGV4IGluIHRoZSBWTEMgdGFibGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGluZyB0byB0aGUgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCAKLSAqIFtpbl0gcFJ1bkluZGV4VGFibGVMMCAgICBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAotICogW2luXSBwVmxjVGFibGVMMCAgICAgICAgIFZMQyB0YWJsZSBmb3IgbGFzdCA9PSAwCi0gKiBbaW5dIHBSdW5JbmRleFRhYmxlTDEgICAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKLSAqIFtpbl0gcFZsY1RhYmxlTDEgICAgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMQotICogW2luXSBwTE1BWFRhYmxlTDAgICAgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCi0gKiBbaW5dIHBMTUFYVGFibGVMMSAgICAgICAgTGV2ZWwgTUFYIHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKLSAqIFtpbl0gcFJNQVhUYWJsZUwwICAgICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKLSAqIFtpbl0gcFJNQVhUYWJsZUwxICAgICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKLSAqIFtvdXRdcERzdAkJCSAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAotICoJCQkJCQkJYmxvY2suIFNob3VsZCBiZSAzMi1iaXQgYWxpZ25lZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX0dldFZMQ0JpdHMgKAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCi0JCQkgIE9NWF9TMTYgKiBwRHN0LAotCQkJICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCi0JCQkgIE9NWF9VOCAgICBzdGFydCwJCQkgIAotCQkJICBPTVhfVTggICogcExhc3QsCi0JCQkgIE9NWF9VOCAgICBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwLAotCQkJICBPTVhfVTggICAgbWF4SW5kZXhGb3JNdWx0aXBsZUVudHJpZXNMMCwKLQkJCSAgT01YX1U4ICAgIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wxLAotCQkJICBPTVhfVTggICAgbWF4SW5kZXhGb3JNdWx0aXBsZUVudHJpZXNMMSwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSdW5JbmRleFRhYmxlTDAsCi0gICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlTDAsCi0JCQkgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwxLAotICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwxLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwwLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwxLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwwLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwxLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFppZ3phZ1RhYmxlCi0pCi17Ci0gICAgT01YX1UzMiBzdG9yZVJ1bjsKLSAgICBPTVhfVTggIHRhYkluZGV4LCBtYXJrZXJCaXQ7Ci0gICAgT01YX1MxNiBzdG9yZUxldmVsOwotICAgIE9NWF9VMTYgdW5wYWNrUmV0SW5kZXg7Ci0JT01YX1U4ICBpLCBmVHlwZSwgZXNjYXBlOwkKLQlPTVhfVTggIHNpZ24gPSAwOwotCQotCS8qIFVucGFja2luZyB0aGUgYml0c3RyZWFtIGFuZCBSTEQgKi8KLSAgICBmb3IgKGkgPSBzdGFydDsgaSA8IDY0OykKLSAgICB7Ci0JCWVzY2FwZSA9IGFybUxvb2tBaGVhZEJpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDcpOwotCQlpZiAoZXNjYXBlICE9IDMpCi0JCXsJCi0JCQlmVHlwZSA9IDA7IC8qIE5vdCBpbiBlc2NhcGUgbW9kZSAqLwotCQl9Ci0JCWVsc2UKLQkJewotCQkJYXJtU2tpcEJpdHMgKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCA3KTsKLQkJCWlmKHNob3J0VmlkZW9IZWFkZXIpCi0JCQl7Ci0JCQkgICpwTGFzdCA9IGFybUdldEJpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDEpOwotCQkJICBzdG9yZVJ1biA9IGFybUdldEJpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDYpOwotCQkJICBzdG9yZUxldmVsID0gYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgOCk7Ci0JCQkgIAotCQkJICAvKiBSZWYgdG8gVGFibGUgQi0xOCAoYykgaW4gTVBFRzQgU3RhbmRhcmQtIEZMQyBjb2RlIGZvciAgKi8KLQkJCSAgLyogTEVWRUwgd2hlbiBzaG9ydF92aWRlb19oZWFkZXIgaXMgMSwgdGhlIHN0b3JlTGV2ZWwgaXMgICovCi0JCQkgIC8qIGEgc2lnbmVkIHZhbHVlIGFuZCB0aGUgc2lnbiBhbmQgdGhlIHVuc2lnbmVkIHZhbHVlIGZvciAqLwotCQkJICAvKiBzdG9yZUxldmVsIG5lZWQgdG8gYmUgZXh0cmFjdGVkIGFuZCBwYXNzZWQgdG8gYXJtICAgICAgKi8KLQkJCSAgLyogRmlsbFZMREJ1ZmZlciBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JCQkgICAgIAotCQkJICBzaWduID0gKHN0b3JlTGV2ZWwgJiAweDgwKTsKLQkJCSAgaWYoc2lnbj09MHg4MCkKLQkJCSAgewotCQkJICAJc3RvcmVMZXZlbD0oc3RvcmVMZXZlbF4weGZmKSsxOwkJCSAgCi0JCQkgIAlzaWduPTE7Ci0JCQkgIAkKLQkJCSAgfQotCQkJICAKLQkJCSAgYXJtUmV0RGF0YUVycklmKCBzdG9yZUxldmVsID09IDAgfHwgc2lnbipzdG9yZUxldmVsID09IDEyOCAsIE9NWF9TdHNfRXJyKTsgLyogSW52YWxpZCBGTEMgKi8KLQkJCSAgYXJtUmV0RGF0YUVycklmKChpICsgc3RvcmVSdW4pID49IDY0LCBPTVhfU3RzX0Vycik7Ci0JCQkgIGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyKAotCQkJICAgIHN0b3JlUnVuLAotCQkJICAgIHBEc3QsCi0JCQkgICAgc3RvcmVMZXZlbCwKLQkJCSAgICBzaWduLAotCQkJICAgICpwTGFzdCwKLQkJCSAgICAmaSwKLQkJCSAgICBwWmlnemFnVGFibGUpOwotCQkJICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotCQkJICAgIAotCQkJfQotCQkJaWYgKGFybUdldEJpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDEpKQotCQkJewotCQkJCWlmIChhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAxKSkKLQkJCQl7Ci0JCQkJCWZUeXBlID0gMzsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJZlR5cGUgPSAyOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlmVHlwZSA9IDE7Ci0JCQl9Ci0JCX0KLQotCSAgICBpZiAoZlR5cGUgPCAzKQotCSAgICB7Ci0JICAgICAgICB1bnBhY2tSZXRJbmRleCA9IGFybVVuUGFja1ZMQzMyKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LAotCQkJCQkJCQkJCXBWbGNUYWJsZUwwKTsKLQkJCWlmICh1bnBhY2tSZXRJbmRleCAhPSBBUk1fTk9fQ09ERUJPT0tfSU5ERVgpCi0JCSAgICB7Ci0JCQkgICAgLyogRGVjb2RlIHJ1biBhbmQgbGV2ZWwgZnJvbSB0aGUgaW5kZXggKi8KLQkJCSAgICAvKiBsYXN0ID0gMCAqLwotCQkJICAgICpwTGFzdCA9IDA7Ci0JCQkgICAgaWYgKHVucGFja1JldEluZGV4ID4gbWF4SW5kZXhGb3JNdWx0aXBsZUVudHJpZXNMMCkKLQkJCSAgICB7Ci0JCQkJICAgIHN0b3JlTGV2ZWwgPSAxOwotCQkJCSAgICBzdG9yZVJ1biA9ICh1bnBhY2tSZXRJbmRleCAtIG1heEluZGV4Rm9yTXVsdGlwbGVFbnRyaWVzTDApIAotCQkJCQkJCSsgcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMDsKLQkJCSAgICB9Ci0JCQkgICAgZWxzZQotCQkJICAgIHsKLQkJCQkgICAgdGFiSW5kZXggPSAxOwotCQkJCSAgICB3aGlsZSAocFJ1bkluZGV4VGFibGVMMFt0YWJJbmRleF0gPD0gdW5wYWNrUmV0SW5kZXgpCi0JCQkJICAgIHsKLQkJCQkJICAgIHRhYkluZGV4Kys7Ci0JCQkJICAgIH0KLQkJCQkgICAgc3RvcmVSdW4gPSB0YWJJbmRleCAtIDE7Ci0JCQkJICAgIHN0b3JlTGV2ZWwgPSB1bnBhY2tSZXRJbmRleCAtIHBSdW5JbmRleFRhYmxlTDBbdGFiSW5kZXggLSAxXSArIDE7Ci0JCQkgICAgfQotCQkJICAgIHNpZ24gPSAoT01YX1U4KSBhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAxKTsKLQkJCQotCQkJICAgIGlmIChmVHlwZSA9PSAxKQotCQkJICAgIHsKLQkJCQkgICAgc3RvcmVMZXZlbCA9IChhcm1BYnMoc3RvcmVMZXZlbCkgKyBwTE1BWFRhYmxlTDBbc3RvcmVSdW5dKTsKLQkJCSAgICB9Ci0JCQkgICAgZWxzZSBpZiAoZlR5cGUgPT0gMikKLQkJCSAgICB7Ci0JCQkJICAgIHN0b3JlUnVuID0gc3RvcmVSdW4gKyBwUk1BWFRhYmxlTDBbc3RvcmVMZXZlbC0xXSArIDE7Ci0JCQkgICAgfQotCQkgICAgfQotCQkgICAgZWxzZQotCQkgICAgewotCQkJICAgIHVucGFja1JldEluZGV4ID0gYXJtVW5QYWNrVkxDMzIocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIAotCQkJCQkJCQkJCQlwVmxjVGFibGVMMSk7Ci0KLQkJCSAgICBhcm1SZXREYXRhRXJySWYodW5wYWNrUmV0SW5kZXggPT0gQVJNX05PX0NPREVCT09LX0lOREVYLCBPTVhfU3RzX0Vycik7Ci0KLQkJCSAgICAvKiBEZWNvZGUgcnVuIGFuZCBsZXZlbCBmcm9tIHRoZSBpbmRleCAqLwotCQkJICAgIC8qIGxhc3QgPSAxICovCi0JCQkgICAgKnBMYXN0ID0gMTsKLQkJCSAgICBpZiAodW5wYWNrUmV0SW5kZXggPiBtYXhJbmRleEZvck11bHRpcGxlRW50cmllc0wxKQotCQkJICAgIHsKLQkJCQkgICAgc3RvcmVMZXZlbCA9IDE7Ci0JCQkJICAgIHN0b3JlUnVuID0gKHVucGFja1JldEluZGV4IC0gbWF4SW5kZXhGb3JNdWx0aXBsZUVudHJpZXNMMSkgCi0JCQkJCQkJKyBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMTsKLQkJICAgICAgICB9Ci0JCSAgICAgICAgZWxzZQotCQkJICAgIHsKLQkJCQkgICAgdGFiSW5kZXggPSAxOwotCQkJCSAgICB3aGlsZSAocFJ1bkluZGV4VGFibGVMMVt0YWJJbmRleF0gPD0gdW5wYWNrUmV0SW5kZXgpCi0JCQkJICAgIHsKLQkJCQkJICAgIHRhYkluZGV4Kys7Ci0JCQkJICAgIH0KLQkJCQkgICAgc3RvcmVSdW4gPSB0YWJJbmRleCAtIDE7Ci0JCQkJICAgIHN0b3JlTGV2ZWwgPSB1bnBhY2tSZXRJbmRleCAtIHBSdW5JbmRleFRhYmxlTDFbdGFiSW5kZXggLSAxXSArIDE7Ci0JCQkgICAgfQotCQkJICAgIHNpZ24gPSAoT01YX1U4KSBhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAxKTsKLQotCQkJICAgIGlmIChmVHlwZSA9PSAxKQotCQkJICAgIHsKLQkJCSAgICAgICAgc3RvcmVMZXZlbCA9IChhcm1BYnMoc3RvcmVMZXZlbCkgKyBwTE1BWFRhYmxlTDFbc3RvcmVSdW5dKTsJCQkJCi0JCQkgICAgfQotCQkJICAgIGVsc2UgaWYgKGZUeXBlID09IDIpCi0JCQkgICAgewotCQkJCSAgICBzdG9yZVJ1biA9IHN0b3JlUnVuICsgcFJNQVhUYWJsZUwxW3N0b3JlTGV2ZWwtMV0gKyAxOwotCQkJICAgIH0KLQkJICAgIH0KLSAgICAgICAgICAgIGFybVJldERhdGFFcnJJZigoaSArIHN0b3JlUnVuKSA+PSA2NCwgT01YX1N0c19FcnIpOwotCQkgICAgYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIoCi0JCQkgICAgc3RvcmVSdW4sCi0JCQkgICAgcERzdCwKLQkJCSAgICBzdG9yZUxldmVsLAotCQkJICAgIHNpZ24sCi0JCQkgICAgKnBMYXN0LAotCQkJICAgICZpLAotCQkJICAgIHBaaWd6YWdUYWJsZSk7CQkKLQkgICAgfQotCSAgICBlbHNlCi0JICAgIHsKLQkJICAgICpwTGFzdCA9IGFybUdldEJpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDEpOwotCQkgICAgc3RvcmVSdW4gID0gYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgNik7Ci0JCSAgICBhcm1SZXREYXRhRXJySWYoKGkgKyBzdG9yZVJ1bikgPj0gNjQsIE9NWF9TdHNfRXJyKTsKLQkJICAgIG1hcmtlckJpdCA9IGFybUdldEJpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDEpOwotCQkgICAgYXJtUmV0RGF0YUVycklmKCBtYXJrZXJCaXQgPT0gMCwgT01YX1N0c19FcnIpOwotCQkgICAgc3RvcmVMZXZlbCAgPSBhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAxMik7Ci0JCSAgICBpZiAoc3RvcmVMZXZlbCAmIDB4ODAwKQotCQkgICAgewotCQkJICAgIHN0b3JlTGV2ZWwgLT0gNDA5NjsKLQkJICAgIH0JCQkKLQkJICAgIGFybVJldERhdGFFcnJJZiggc3RvcmVMZXZlbCA9PSAwIHx8IHN0b3JlTGV2ZWwgPT0gLTIwNDggLCBPTVhfU3RzX0Vycik7IC8qIEludmFsaWQgRkxDICovCi0JCSAgICBhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAxKTsKLQkJICAgIGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyKAotCQkJICAgIHN0b3JlUnVuLAotCQkJICAgIHBEc3QsCi0JCQkgICAgc3RvcmVMZXZlbCwKLQkJCSAgICAwLCAvKiBTaWduIGlzIG5vdCB1c2VkLCBwcmVwcm9jZXNzaW5nIGRvbmUgKi8KLQkJCSAgICAqcExhc3QsCi0JCQkgICAgJmksCi0JCQkgICAgcFppZ3phZ1RhYmxlKTsKLQotCSAgICB9Ci0gICAgfSAvKiBFbmQgb2YgZm9ybG9vcCBmb3IgaSAqLwotCXJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKiBFbmQgb2YgRmlsZSAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTAxZDQ4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTEwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLSAvKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRmlsZTogICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYwotICogRGVzY3JpcHRpb246IENvbnRhaW5zIGFsbCB0aGUgSHVmZm1hbiB0YWJsZXMgdXNlZCBpbiBNUEVHNCBjb2RlYwotICoKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLQotI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCi0KLS8qIAotKiAgRm9yIEludHJhCi0qICBsYXN0ID0gMCAKLSovCi1jb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDBSdW5JZHhbMTFdID0gCi17IAotICAgIDAsIDI3LCAzNywgNDIsIDQ2LCA0OSwgNTIsIAotICAgIDU1LCA1OCwgNjAsIDYyCi19OwotCi0vKiBFbnRyeSBkZWZpbmVkIGZvciBhbGwgdmFsdWVzIAotKiAgZm9yIHJ1biA9IDAgdG8gMTQKLSogIE5vdGU6IHRoZSBsYXN0IGVudHJ5IGlzIHRvIHRlcm1pbmF0ZSB3aGlsZSBkZWNvZGluZwotKi8KLWNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDJfSW50cmFWbGNMMFs2OF0gPSAKLXsKLSAgICAgICAgezIsICAgIDJ9LAotICAgICAgICB7MywgICAgNn0sCi0gICAgICAgIHs0LCAgICAxNX0sCi0gICAgICAgIHs1LCAgICAxM30sCi0gICAgICAgIHs1LCAgICAxMn0sCi0gICAgICAgIHs2LCAgICAyMX0sCi0gICAgICAgIHs2LCAgICAxOX0sCi0gICAgICAgIHs2LCAgICAxOH0sCi0gICAgICAgIHs3LCAgICAyM30sCi0gICAgICAgIHs4LCAgICAzMX0sCi0gICAgICAgIHs4LCAgICAzMH0sCi0gICAgICAgIHs4LCAgICAyOX0sCi0gICAgICAgIHs5LCAgICAzN30sCi0gICAgICAgIHs5LCAgICAzNn0sCi0gICAgICAgIHs5LCAgICAzNX0sCi0gICAgICAgIHs5LCAgICAzM30sCi0gICAgICAgIHsxMCwgICAzM30sCi0gICAgICAgIHsxMCwgICAzMn0sCi0gICAgICAgIHsxMCwgICAxNX0sCi0gICAgICAgIHsxMCwgICAxNH0sCi0gICAgICAgIHsxMSwgICAgN30sCi0gICAgICAgIHsxMSwgICAgNn0sCi0gICAgICAgIHsxMSwgICAzMn0sCi0gICAgICAgIHsxMSwgICAzM30sCi0gICAgICAgIHsxMiwgICA4MH0sCi0gICAgICAgIHsxMiwgICA4MX0sCi0gICAgICAgIHsxMiwgICA4Mn0sCi0gICAgICAgIHs0LCAgICAxNH0sCi0gICAgICAgIHs2LCAgICAyMH0sCi0gICAgICAgIHs3LCAgICAyMn0sCi0gICAgICAgIHs4LCAgICAyOH0sCi0gICAgICAgIHs5LCAgICAzMn0sCi0gICAgICAgIHs5LCAgICAzMX0sCi0gICAgICAgIHsxMCwgICAxM30sCi0gICAgICAgIHsxMSwgICAzNH0sCi0gICAgICAgIHsxMiwgICA4M30sCi0gICAgICAgIHsxMiwgICA4NX0sCi0gICAgICAgIHs1LCAgICAxMX0sCi0gICAgICAgIHs3LCAgICAyMX0sCi0gICAgICAgIHs5LCAgICAzMH0sCi0gICAgICAgIHsxMCwgICAxMn0sCi0gICAgICAgIHsxMiwgICA4Nn0sCi0gICAgICAgIHs2LCAgICAxN30sCi0gICAgICAgIHs4LCAgICAyN30sCi0gICAgICAgIHs5LCAgICAyOX0sCi0gICAgICAgIHsxMCwgICAxMX0sCi0gICAgICAgIHs2LCAgICAxNn0sCi0gICAgICAgIHs5LCAgICAzNH0sCi0gICAgICAgIHsxMCwgICAxMH0sCi0gICAgICAgIHs2LCAgICAxM30sCi0gICAgICAgIHs5LCAgICAyOH0sCi0gICAgICAgIHsxMCwgICAgOH0sCi0gICAgICAgIHs3LCAgICAxOH0sCi0gICAgICAgIHs5LCAgICAyN30sCi0gICAgICAgIHsxMiwgICA4NH0sCi0gICAgICAgIHs3LCAgICAyMH0sCi0gICAgICAgIHs5LCAgICAyNn0sCi0gICAgICAgIHsxMiwgICA4N30sCi0gICAgICAgIHs4LCAgICAyNX0sCi0gICAgICAgIHsxMCwgICAgOX0sCi0gICAgICAgIHs4LCAgICAyNH0sCi0gICAgICAgIHsxMSwgICAzNX0sCi0gICAgICAgIHs4LCAgICAyM30sCi0gICAgICAgIHs5LCAgICAyNX0sCi0gICAgICAgIHs5LCAgICAyNH0sCi0gICAgICAgIHsxMCwgICAgN30sCi0gICAgICAgIHsxMiwgICA4OH0sCi0gICAgICAgIHswLCAgICAgMH0KLX07Ci0KLS8qIAotKiAgRm9yIEludHJhCi0qICBsYXN0ID0gMSAKLSovCi0KLWNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50cmFMMVJ1bklkeFs4XSA9IAotewotICAgIDAsICA4LCAxMSwgMTMsIDE1LCAxNywgMTksIDIxCi19OwotCi0vKiBFbnRyeSBkZWZpbmVkIGZvciBhbGwgdmFsdWVzIAotKiAgZm9yIHJ1biA9IDAgdG8gMjAKLSogICogIE5vdGU6IHRoZSBsYXN0IGVudHJ5IGlzIHRvIHRlcm1pbmF0ZSB3aGlsZSBkZWNvZGluZwotKi8KLWNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDJfSW50cmFWbGNMMVszNl0gPSAKLXsKLSAgICAgICAgezQsICAgICA3fSwKLSAgICAgICAgezYsICAgIDEyfSwKLSAgICAgICAgezgsICAgIDIyfSwKLSAgICAgICAgezksICAgIDIzfSwKLSAgICAgICAgezEwLCAgICA2fSwKLSAgICAgICAgezExLCAgICA1fSwKLSAgICAgICAgezExLCAgICA0fSwKLSAgICAgICAgezEyLCAgIDg5fSwKLSAgICAgICAgezYsICAgIDE1fSwKLSAgICAgICAgezksICAgIDIyfSwKLSAgICAgICAgezEwLCAgICA1fSwKLSAgICAgICAgezYsICAgIDE0fSwKLSAgICAgICAgezEwLCAgICA0fSwKLSAgICAgICAgezcsICAgIDE3fSwKLSAgICAgICAgezExLCAgIDM2fSwKLSAgICAgICAgezcsICAgIDE2fSwKLSAgICAgICAgezExLCAgIDM3fSwKLSAgICAgICAgezcsICAgIDE5fSwKLSAgICAgICAgezEyLCAgIDkwfSwKLSAgICAgICAgezgsICAgIDIxfSwKLSAgICAgICAgezEyLCAgIDkxfSwKLSAgICAgICAgezgsICAgIDIwfSwKLSAgICAgICAgezgsICAgIDE5fSwKLSAgICAgICAgezgsICAgIDI2fSwKLSAgICAgICAgezksICAgIDIxfSwKLSAgICAgICAgezksICAgIDIwfSwKLSAgICAgICAgezksICAgIDE5fSwKLSAgICAgICAgezksICAgIDE4fSwKLSAgICAgICAgezksICAgIDE3fSwKLSAgICAgICAgezExLCAgIDM4fSwKLSAgICAgICAgezExLCAgIDM5fSwKLSAgICAgICAgezEyLCAgIDkyfSwKLSAgICAgICAgezEyLCAgIDkzfSwKLSAgICAgICAgezEyLCAgIDk0fSwKLSAgICAgICAgezEyLCAgIDk1fSwgIAotICAgICAgICB7MCwgICAgIDB9Ci19OwotCi0vKiBMTUFYIHRhYmxlIGZvciBJbnRyYSAoTGFzdCA9PSAwKSovCi1jb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDBMTUFYWzE1XSA9IAotewotICAgMjcsIDEwLCAgNSwgIDQsICAzLCAgMywgIDMsICAKLSAgICAzLCAgMiwgIDIsICAxLCAgMSwgIDEsICAxLCAgMQotfTsKLQotLyogTE1BWCB0YWJsZSBmb3IgSW50cmEgKExhc3QgPT0gMSkqLwotY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwxTE1BWFsyMV0gPSAKLXsKLSAgICA4LCAgMywgIDIsICAyLCAgMiwgIDIsICAyLCAgMSwgCi0JMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCi0JMSwgIDEsICAxLCAgMSwgIDEKLX07Ci0KLS8qIFJNQVggdGFibGUgZm9yIEludHJhIChMYXN0ID09IDApCi0gICBMZXZlbCAtIDEgSW5kZXhlZCAKLSovCi1jb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDBSTUFYWzI3XSA9Ci17Ci0gICAxNCwgIDksICA3LCAgMywgIDIsICAxLAkxLCAgCi0gICAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAJMCwgIAotICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAKLSAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAKLX07Ci0KLS8qIFJNQVggdGFibGUgZm9yIEludHJhIChMYXN0ID09IDEpCi0gICBMZXZlbCAtIDEgSW5kZXhlZCAKLSovCi1jb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDFSTUFYWzhdID0KLXsKLSAgIDIwLCAgNiwgIDEsICAwLCAgMCwgIDAsICAwLCAgMAotfTsKLQotLyogCi0qICBGb3IgSW50ZXIKLSogIGxhc3QgPSAwIAotKi8KLWNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50ZXJMMFJ1bklkeFsxMl0gPSAKLXsgCi0gICAgIDAsICAxMiwgIDE4LCAgMjIsICAyNSwgIDI4LCAgCi0gICAgMzEsICAzNCwgIDM2LCAgMzgsICA0MCwgIDQyCi19OwotCi0vKiBFbnRyeSBkZWZpbmVkIGZvciBhbGwgdmFsdWVzIAotKiAgZm9yIHJ1biA9IDAgdG8gMjYKLSogIE5vdGU6IHRoZSBsYXN0IGVudHJ5IGlzIHRvIHRlcm1pbmF0ZSB3aGlsZSBkZWNvZGluZwotKi8KLWNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDJfSW50ZXJWbGNMMFs1OV0gPSAKLXsKLSAgICAgICAgezIsICAgICAyfSwKLSAgICAgICAgezQsICAgIDE1fSwKLSAgICAgICAgezYsICAgIDIxfSwKLSAgICAgICAgezcsICAgIDIzfSwKLSAgICAgICAgezgsICAgIDMxfSwKLSAgICAgICAgezksICAgIDM3fSwKLSAgICAgICAgezksICAgIDM2fSwKLSAgICAgICAgezEwLCAgIDMzfSwKLSAgICAgICAgezEwLCAgIDMyfSwKLSAgICAgICAgezExLCAgICA3fSwKLSAgICAgICAgezExLCAgICA2fSwKLSAgICAgICAgezExLCAgIDMyfSwKLSAgICAgICAgezMsICAgICA2fSwKLSAgICAgICAgezYsICAgIDIwfSwKLSAgICAgICAgezgsICAgIDMwfSwKLSAgICAgICAgezEwLCAgIDE1fSwKLSAgICAgICAgezExLCAgIDMzfSwKLSAgICAgICAgezEyLCAgIDgwfSwKLSAgICAgICAgezQsICAgIDE0fSwKLSAgICAgICAgezgsICAgIDI5fSwKLSAgICAgICAgezEwLCAgIDE0fSwKLSAgICAgICAgezEyLCAgIDgxfSwKLSAgICAgICAgezUsICAgIDEzfSwKLSAgICAgICAgezksICAgIDM1fSwKLSAgICAgICAgezEwLCAgIDEzfSwKLSAgICAgICAgezUsICAgIDEyfSwKLSAgICAgICAgezksICAgIDM0fSwKLSAgICAgICAgezEyLCAgIDgyfSwKLSAgICAgICAgezUsICAgIDExfSwKLSAgICAgICAgezEwLCAgIDEyfSwKLSAgICAgICAgezEyLCAgIDgzfSwKLSAgICAgICAgezYsICAgIDE5fSwKLSAgICAgICAgezEwLCAgIDExfSwKLSAgICAgICAgezEyLCAgIDg0fSwKLSAgICAgICAgezYsICAgIDE4fSwKLSAgICAgICAgezEwLCAgIDEwfSwKLSAgICAgICAgezYsICAgIDE3fSwKLSAgICAgICAgezEwLCAgICA5fSwKLSAgICAgICAgezYsICAgIDE2fSwKLSAgICAgICAgezEwLCAgICA4fSwKLSAgICAgICAgezcsICAgIDIyfSwKLSAgICAgICAgezEyLCAgIDg1fSwKLSAgICAgICAgezcsICAgIDIxfSwKLSAgICAgICAgezcsICAgIDIwfSwKLSAgICAgICAgezgsICAgIDI4fSwKLSAgICAgICAgezgsICAgIDI3fSwKLSAgICAgICAgezksICAgIDMzfSwKLSAgICAgICAgezksICAgIDMyfSwKLSAgICAgICAgezksICAgIDMxfSwKLSAgICAgICAgezksICAgIDMwfSwKLSAgICAgICAgezksICAgIDI5fSwKLSAgICAgICAgezksICAgIDI4fSwKLSAgICAgICAgezksICAgIDI3fSwKLSAgICAgICAgezksICAgIDI2fSwKLSAgICAgICAgezExLCAgIDM0fSwKLSAgICAgICAgezExLCAgIDM1fSwKLSAgICAgICAgezEyLCAgIDg2fSwKLSAgICAgICAgezEyLCAgIDg3fSwKLSAgICAgICAgezAsICAgICAwfQotfTsKLSAKLQotLyogCi0qICBGb3IgSW50cmEKLSogIGxhc3QgPSAxIAotKi8KLQotY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwxUnVuSWR4WzNdID0gCi17Ci0gICAgMCwgMywgNQotfTsKLQotLyogRW50cnkgZGVmaW5lZCBmb3IgYWxsIHZhbHVlcyAKLSogIGZvciBydW4gPSAwIHRvIDQwCi0qICBOb3RlOiB0aGUgbGFzdCBlbnRyeSBpcyB0byB0ZXJtaW5hdGUgd2hpbGUgZGVjb2RpbmcKLSovCi1jb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAyX0ludGVyVmxjTDFbNDVdID0gCi17Ci0gICAgICAgIHs0LCAgICAgN30sCi0gICAgICAgIHs5LCAgICAyNX0sCi0gICAgICAgIHsxMSwgICAgNX0sCi0gICAgICAgIHs2LCAgICAxNX0sCi0gICAgICAgIHsxMSwgICAgNH0sCi0gICAgICAgIHs2LCAgICAxNH0sCi0gICAgICAgIHs2LCAgICAxM30sCi0gICAgICAgIHs2LCAgICAxMn0sCi0gICAgICAgIHs3LCAgICAxOX0sCi0gICAgICAgIHs3LCAgICAxOH0sCi0gICAgICAgIHs3LCAgICAxN30sCi0gICAgICAgIHs3LCAgICAxNn0sCi0gICAgICAgIHs4LCAgICAyNn0sCi0gICAgICAgIHs4LCAgICAyNX0sCi0gICAgICAgIHs4LCAgICAyNH0sCi0gICAgICAgIHs4LCAgICAyM30sCi0gICAgICAgIHs4LCAgICAyMn0sCi0gICAgICAgIHs4LCAgICAyMX0sCi0gICAgICAgIHs4LCAgICAyMH0sCi0gICAgICAgIHs4LCAgICAxOX0sCi0gICAgICAgIHs5LCAgICAyNH0sCi0gICAgICAgIHs5LCAgICAyM30sCi0gICAgICAgIHs5LCAgICAyMn0sCi0gICAgICAgIHs5LCAgICAyMX0sCi0gICAgICAgIHs5LCAgICAyMH0sCi0gICAgICAgIHs5LCAgICAxOX0sCi0gICAgICAgIHs5LCAgICAxOH0sCi0gICAgICAgIHs5LCAgICAxN30sCi0gICAgICAgIHsxMCwgICAgN30sCi0gICAgICAgIHsxMCwgICAgNn0sCi0gICAgICAgIHsxMCwgICAgNX0sCi0gICAgICAgIHsxMCwgICAgNH0sCi0gICAgICAgIHsxMSwgICAzNn0sCi0gICAgICAgIHsxMSwgICAzN30sCi0gICAgICAgIHsxMSwgICAzOH0sCi0gICAgICAgIHsxMSwgICAzOX0sCi0gICAgICAgIHsxMiwgICA4OH0sCi0gICAgICAgIHsxMiwgICA4OX0sCi0gICAgICAgIHsxMiwgICA5MH0sCi0gICAgICAgIHsxMiwgICA5MX0sCi0gICAgICAgIHsxMiwgICA5Mn0sCi0gICAgICAgIHsxMiwgICA5M30sCi0gICAgICAgIHsxMiwgICA5NH0sCi0gICAgICAgIHsxMiwgICA5NX0sCi0gICAgICAgIHsgMCwgICAgMH0KLX07Ci0KLS8qIExNQVggdGFibGUgZm9yIEludHJhIChMYXN0ID09IDApKi8KLWNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50ZXJMMExNQVhbMjddID0gCi17Ci0gICAxMiwgIDYsICA0LCAgMywgIDMsICAzLCAgMywgIDIsIAotICAgIDIsICAyLCAgMiwgIDEsICAxLCAgMSwgIDEsICAxLAotICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAotICAgIDEsICAxLCAgMSwKLX07Ci0KLS8qIExNQVggdGFibGUgZm9yIEludHJhIChMYXN0ID09IDEpKi8KLWNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50ZXJMMUxNQVhbNDFdID0gCi17Ci0gICAgMywgIDIsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsIAotCTEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAotCTEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAotCTEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAotCTEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAotCTEsICAKLX07Ci0KLS8qIFJNQVggdGFibGUgZm9yIEludHJhIChMYXN0ID09IDApCi0gICBMZXZlbCAtIDEgSW5kZXhlZCAKLSovCi1jb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDBSTUFYWzEyXSA9IAotewotICAgMjYsIDEwLCAgNiwgIDIsICAxLCAgMSwgICAKLSAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAKLX07Ci0KLS8qIFJNQVggdGFibGUgZm9yIEludHJhIChMYXN0ID09IDEpCi0gICBMZXZlbCAtIDEgSW5kZXhlZCAKLSovCi1jb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDFSTUFYWzNdID0gCi17Ci0gICA0MCwgIDEsICAwCi19OwotCi0vKiAKLSogIEZvciBJbnRyYSAtIEx1bWluYW5jZQotKi8KLQotY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMl9hSW50cmFEQ0x1bWFJbmRleFsxNF0gPSAKLXsKLSAgICAgICAgezMsICAgICAzfSwKLSAgICAgICAgezIsICAgICAzfSwKLSAgICAgICAgezIsICAgICAyfSwKLSAgICAgICAgezMsICAgICAyfSwKLSAgICAgICAgezMsICAgICAxfSwKLSAgICAgICAgezQsICAgICAxfSwKLSAgICAgICAgezUsICAgICAxfSwKLSAgICAgICAgezYsICAgICAxfSwKLSAgICAgICAgezcsICAgICAxfSwKLSAgICAgICAgezgsICAgICAxfSwKLSAgICAgICAgezksICAgICAxfSwKLSAgICAgICAgezEwLCAgICAxfSwKLSAgICAgICAgezExLCAgICAxfSwKLSAgICAgICAgezAsICAgICAwfQotfTsKLQotLyogCi0qICBGb3IgSW50cmEgLSBDaHJvbWluYW5jZQotKi8KLSAKLWNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDJfYUludHJhRENDaHJvbWFJbmRleFsxNF0gPSAKLXsKLSAgICAgICAgezIsICAgICAzfSwKLSAgICAgICAgezIsICAgICAyfSwKLSAgICAgICAgezIsICAgICAxfSwKLSAgICAgICAgezMsICAgICAxfSwKLSAgICAgICAgezQsICAgICAxfSwKLSAgICAgICAgezUsICAgICAxfSwKLSAgICAgICAgezYsICAgICAxfSwKLSAgICAgICAgezcsICAgICAxfSwKLSAgICAgICAgezgsICAgICAxfSwKLSAgICAgICAgezksICAgICAxfSwKLSAgICAgICAgezEwLCAgICAxfSwKLSAgICAgICAgezExLCAgICAxfSwKLSAgICAgICAgezEyLCAgICAxfSwKLSAgICAgICAgezAsICAgICAwfQotfTsKLQotLyogCi0gKiAgTW90aW9uIHZlY3RvciBkZWNvZGluZyB0YWJsZQotICovCi0gCi1jb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAyX2FWbGNNVkRbNjZdID0KLXsKLSAgICAgICAgezEzLCAgICAgNX0sCi0gICAgICAgIHsxMywgICAgIDd9LAotICAgICAgICB7MTIsICAgICA1fSwKLSAgICAgICAgezEyLCAgICAgN30sCi0gICAgICAgIHsxMiwgICAgIDl9LAotICAgICAgICB7MTIsICAgIDExfSwKLSAgICAgICAgezEyLCAgICAxM30sCi0gICAgICAgIHsxMiwgICAgMTV9LAotICAgICAgICB7MTEsICAgICA5fSwKLSAgICAgICAgezExLCAgICAxMX0sCi0gICAgICAgIHsxMSwgICAgMTN9LAotICAgICAgICB7MTEsICAgIDE1fSwKLSAgICAgICAgezExLCAgICAxN30sCi0gICAgICAgIHsxMSwgICAgMTl9LAotICAgICAgICB7MTEsICAgIDIxfSwKLSAgICAgICAgezExLCAgICAyM30sCi0gICAgICAgIHsxMSwgICAgMjV9LAotICAgICAgICB7MTEsICAgIDI3fSwKLSAgICAgICAgezExLCAgICAyOX0sCi0gICAgICAgIHsxMSwgICAgMzF9LAotICAgICAgICB7MTEsICAgIDMzfSwKLSAgICAgICAgezExLCAgICAzNX0sCi0gICAgICAgIHsxMCwgICAgMTl9LAotICAgICAgICB7MTAsICAgIDIxfSwKLSAgICAgICAgezEwLCAgICAyM30sCi0gICAgICAgIHs4LCAgICAgIDd9LAotICAgICAgICB7OCwgICAgICA5fSwKLSAgICAgICAgezgsICAgICAxMX0sCi0gICAgICAgIHs3LCAgICAgIDd9LAotICAgICAgICB7NSwgICAgICAzfSwKLSAgICAgICAgezQsICAgICAgM30sCi0gICAgICAgIHszLCAgICAgIDN9LAotICAgICAgICB7MSwgICAgICAxfSwKLSAgICAgICAgezMsICAgICAgMn0sCi0gICAgICAgIHs0LCAgICAgIDJ9LAotICAgICAgICB7NSwgICAgICAyfSwKLSAgICAgICAgezcsICAgICAgNn0sCi0gICAgICAgIHs4LCAgICAgMTB9LAotICAgICAgICB7OCwgICAgICA4fSwKLSAgICAgICAgezgsICAgICAgNn0sCi0gICAgICAgIHsxMCwgICAgMjJ9LAotICAgICAgICB7MTAsICAgIDIwfSwKLSAgICAgICAgezEwLCAgICAxOH0sCi0gICAgICAgIHsxMSwgICAgMzR9LAotICAgICAgICB7MTEsICAgIDMyfSwKLSAgICAgICAgezExLCAgICAzMH0sCi0gICAgICAgIHsxMSwgICAgMjh9LAotICAgICAgICB7MTEsICAgIDI2fSwKLSAgICAgICAgezExLCAgICAyNH0sCi0gICAgICAgIHsxMSwgICAgMjJ9LAotICAgICAgICB7MTEsICAgIDIwfSwKLSAgICAgICAgezExLCAgICAxOH0sCi0gICAgICAgIHsxMSwgICAgMTZ9LAotICAgICAgICB7MTEsICAgIDE0fSwKLSAgICAgICAgezExLCAgICAxMn0sCi0gICAgICAgIHsxMSwgICAgMTB9LAotICAgICAgICB7MTEsICAgICA4fSwKLSAgICAgICAgezEyLCAgICAxNH0sCi0gICAgICAgIHsxMiwgICAgMTJ9LAotICAgICAgICB7MTIsICAgIDEwfSwKLSAgICAgICAgezEyLCAgICAgOH0sCi0gICAgICAgIHsxMiwgICAgIDZ9LAotICAgICAgICB7MTIsICAgICA0fSwKLSAgICAgICAgezEzLCAgICAgNn0sCi0gICAgICAgIHsxMywgICAgIDR9LAotICAgICAgICB7IDAsICAgICAwfQotfTsKLQotLyogRW5kIG9mIGZpbGUgKi8KLQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1B1dFZMQ0JpdHMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1B1dFZMQ0JpdHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFkNTQ5NC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9QdXRWTENCaXRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9QdXRWTENCaXRzLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBDb250YWlucyBtb2R1bGUgZm9yIFZMQyBwdXQgYml0cyB0byBiaXRzdHJlYW0gCi0gKgotICovIAotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCi0jaW5jbHVkZSAiYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaCIKLSNpbmNsdWRlICJhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgiCi0KLSAKLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9QdXRWTENCaXRzCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDaGVja3MgdGhlIHR5cGUgb2YgRXNjYXBlIE1vZGUgYW5kIHB1dCBlbmNvZGVkIGJpdHMgZm9yIAotICogcXVhbnRpemVkIERDVCBjb2VmZmljaWVudHMuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQkgcHBCaXRTdHJlYW0gICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KLSAqCQkJCQkJICB0aGUgYml0IHN0cmVhbQotICogW2luXQkgcEJpdE9mZnNldCAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotICogICAgICAgICAgICAgICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcKLSAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KLSAqIFtpbl0gIHN0YXJ0ICAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIAotICogICAgICAgICAgICAgICAgICAgICAgICAwdGggZWxlbWVudCBvciAxc3QuCi0gKiBbaW5dICBtYXhTdG9yZVJ1bkwwICAgIE1heCBzdG9yZSBwb3NzaWJsZSAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsYXN0ID0gMAotICogW2luXSAgbWF4U3RvcmVSdW5MMSAgICBNYXggc3RvcmUgcG9zc2libGUgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhKQotICogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbGFzdCA9IDEKLSAqIFtpbl0gIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wwIAotICogICAgICAgICAgICAgICAgICAgICAgICBUaGUgcnVuIHZhbHVlIGFmdGVyIHdoaWNoIGxldmVsIAotICogICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IAotICogICAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKSBmb3IgbGFzdCA9IDAKLSAqIFtpbl0gIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wxIAotICogICAgICAgICAgICAgICAgICAgICAgICBUaGUgcnVuIHZhbHVlIGFmdGVyIHdoaWNoIGxldmVsIAotICogICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IAotICogICAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKSBmb3IgbGFzdCA9IDEKLSAqIFtpbl0gIHBSdW5JbmRleFRhYmxlTDAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCi0gKiBbaW5dICBwVmxjVGFibGVMMCAgICAgIFZMQyB0YWJsZSBmb3IgbGFzdCA9PSAwCi0gKiBbaW5dICBwUnVuSW5kZXhUYWJsZUwxIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQotICogW2luXSAgcFZsY1RhYmxlTDEgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMQotICogW2luXSAgcExNQVhUYWJsZUwwICAgICBMZXZlbCBNQVggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKLSAqIFtpbl0gIHBMTUFYVGFibGVMMSAgICAgTGV2ZWwgTUFYIHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCi0gKiBbaW5dICBwUk1BWFRhYmxlTDAgICAgIFJ1biBNQVggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKLSAqIFtpbl0gIHBSTUFYVGFibGVMMSAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQotICogW291dF0gcFFEY3RCbGtDb2VmICAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50Ci0gKiBbb3V0XSBwcEJpdFN0cmVhbSAgICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAotICogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyLgotICogW291dF0gcEJpdE9mZnNldCAgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX1B1dFZMQ0JpdHMgKAotICAgICAgICAgICAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKLSAgICAgICAgICAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAotICAgICAgICAgICAgICBPTVhfVTggc3RhcnQsCi0gICAgICAgICAgICAgIE9NWF9VOCBtYXhTdG9yZVJ1bkwwLAotICAgICAgICAgICAgICBPTVhfVTggbWF4U3RvcmVSdW5MMSwKLSAgICAgICAgICAgICAgT01YX1U4ICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMCwKLSAgICAgICAgICAgICAgT01YX1U4ICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMSwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSdW5JbmRleFRhYmxlTDAsCi0gICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlTDAsCi0JCQkgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwxLAotICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwxLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwwLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwxLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwwLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwxLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFppZ3phZ1RhYmxlCi0pCi17Ci0KLSAgICBPTVhfVTMyIHN0b3JlUnVuID0gMCwgcnVuLCBzdG9yZVJ1blBsdXM7Ci0gICAgT01YX1U4ICBsYXN0ID0gMCwgZmlyc3QgPSAxLCBmTW9kZTsKLSAgICBPTVhfUzE2IGxldmVsLCBzdG9yZUxldmVsID0gMCwgc3RvcmVMZXZlbFBsdXM7Ci0gICAgT01YX0lOVCBpOwotICAgIAotICAgICAgICAvKiBSTEUgZW5jb2RpbmcgYW5kIHBhY2tpbmcgdGhlIGJpdHMgaW50byB0aGUgc3RyZWFtcyAqLwotICAgICAgICBmb3IgKGkgPSBzdGFydCwgcnVuPTA7IGkgPCA2NDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBsZXZlbCAgID0gcFFEY3RCbGtDb2VmW3BaaWd6YWdUYWJsZVtpXV07Ci0KLSAgICAgICAgICAgIC8qIENvdW50aW5nIHRoZSBydW4gKi8KLSAgICAgICAgICAgIGlmIChsZXZlbCA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJ1bisrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBGb3VuZCBhIG5vbi16ZXJvIGNvZWZmICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGZpcnN0ID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsYXN0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIGZvciBhIHZhbGlkIGVudHJ5IGluIHRoZSBWTEMgdGFibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgc3RvcmVMZXZlbFBsdXMgPSBhcm1TaWduQ2hlY2soc3RvcmVMZXZlbCkgKiAKLSAgICAgICAgICAgICAgICAgICAgICAoYXJtQWJzKHN0b3JlTGV2ZWwpIC0gcExNQVhUYWJsZUwwW3N0b3JlUnVuXSk7Ci0gICAgICAgICAgICAgICAgICAgIHN0b3JlUnVuUGx1cyA9IHN0b3JlUnVuIC0gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBSTUFYVGFibGVMMFthcm1BYnMoc3RvcmVMZXZlbCkgLSAxXSArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGZNb2RlID0gYXJtVkNNNFAyX0NoZWNrVkxDRXNjYXBlTW9kZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlUnVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVSdW5QbHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVMZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlTGV2ZWxQbHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U3RvcmVSdW5MMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSdW5JbmRleFRhYmxlTDApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0ZpbGxWTENCdWZmZXIgKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcEJpdFN0cmVhbSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlUnVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZUxldmVsLCAKLQkJCQkJCQkJCSAgc3RvcmVSdW5QbHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZUxldmVsUGx1cywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNb2RlLAotCQkJCQkJCQkJICBsYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSdW5JbmRleFRhYmxlTDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWbGNUYWJsZUwwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdG9yZUxldmVsID0gbGV2ZWw7Ci0gICAgICAgICAgICAgICAgc3RvcmVSdW4gICA9IHJ1bjsKLSAgICAgICAgICAgICAgICBmaXJzdCA9IDA7Ci0gICAgICAgICAgICAgICAgcnVuID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IC8qIGVuZCBvZiBmb3IgbG9vcCBmb3IgNjQgZWxlbWVudHMgKi8KLQotICAgICAgICAvKiB3cml0aW5nIHRoZSBsYXN0IGVsZW1lbnQgKi8KLSAgICAgICAgbGFzdCA9IDE7Ci0gICAgICAgIAotICAgICAgICAvKiBDaGVjayBmb3IgYSB2YWxpZCBlbnRyeSBpbiB0aGUgVkxDIHRhYmxlICovCi0gICAgICAgIHN0b3JlTGV2ZWxQbHVzID0gYXJtU2lnbkNoZWNrKHN0b3JlTGV2ZWwpICogCi0gICAgICAgICAgICAgICAgICAgICAgICAoYXJtQWJzKHN0b3JlTGV2ZWwpIC0gcExNQVhUYWJsZUwxW3J1bl0pOwotICAgICAgICBzdG9yZVJ1blBsdXMgPSBzdG9yZVJ1biAtIAotICAgICAgICAgICAgICAgICAgICAgIChwUk1BWFRhYmxlTDFbYXJtQWJzKHN0b3JlTGV2ZWwpIC0gMV0gKyAxKTsKLSAgICAgICAgZk1vZGUgPSBhcm1WQ000UDJfQ2hlY2tWTENFc2NhcGVNb2RlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVSdW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZVJ1blBsdXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZUxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVMZXZlbFBsdXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTdG9yZVJ1bkwxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJ1bkluZGV4VGFibGVMMSk7Ci0gICAgICAgIAotICAgICAgICBhcm1WQ000UDJfRmlsbFZMQ0J1ZmZlciAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBwQml0U3RyZWFtLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcEJpdE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVSdW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlTGV2ZWwsIAotCQkJCQkJICBzdG9yZVJ1blBsdXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlTGV2ZWxQbHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBmTW9kZSwKLQkJCQkJCSAgbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBSdW5JbmRleFRhYmxlTDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBWbGNUYWJsZUwxKTsKLQlyZXR1cm4gT01YX1N0c19Ob0VycjsgICAgICAgICAgICAgICAgICAgICAgICAgIAotfQotCi0vKiBFbmQgb2YgRmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWQ0NGQ0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1NldFByZWREaXIuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX1NldFByZWREaXIuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnRhaW5zIG1vZHVsZSBmb3IgZGV0ZWN0aW5nIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbgotICoKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX1NldFByZWREaXIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGRldGVjdGluZyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIGJsb2NrSW5kZXggIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uIGFzIGRlZmluZWQgaW4gc3ViY2xhdXNlIDYuMS4zLjgsIG9mIElTTy9JRUMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAxNDQ5Ni0yLiBGdXJ0aGVybW9yZSwgaW5kZXhlcyA2IHRvIDkgaW5kaWNhdGUgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgYmxvY2tzIHNwYXRpYWxseSBjb3JyZXNwb25kaW5nIHRvIGx1bWluYW5jZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrcyAwIHRvIDMgaW4gdGhlIHNhbWUgbWFjcm9ibG9jay4KLSAqIFtpbl0gcENvZWZCdWZSb3cgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgotICogW2luXSBwUXBCdWYgICAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlcgotICogW291dF0gICAgcHJlZFFQICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrCi0gKiBbb3V0XSAgICBwcmVkRGlyICAgICBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgotICogICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WQ19IT1JJWk9OVEFMICAgIHByZWRpY3QgaG9yaXpvbnRhbGx5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMICAgICAgcHJlZGljdCB2ZXJ0aWNhbGx5Ci0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfU2V0UHJlZERpcigKLSAgICAgT01YX0lOVCBibG9ja0luZGV4LAotICAgICBPTVhfUzE2ICpwQ29lZkJ1ZlJvdywKLSAgICAgT01YX1MxNiAqcENvZWZCdWZDb2wsCi0gICAgIE9NWF9JTlQgKnByZWREaXIsCi0gICAgIE9NWF9JTlQgKnByZWRRUCwKLSAgICAgY29uc3QgT01YX1U4ICpwUXBCdWYKLSkKLXsKLSAgICBPTVhfVTggIGJsb2NrRENMZWZ0OwotICAgIE9NWF9VOCAgYmxvY2tEQ1RvcDsKLSAgICBPTVhfVTggIGJsb2NrRENUb3BMZWZ0OwotCi0gICAgaWYgKGJsb2NrSW5kZXggPT0gMykKLSAgICB7Ci0gICAgICAgIGJsb2NrRENUb3AgPSAqKHBDb2VmQnVmQ29sIC0gOCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGJsb2NrRENUb3AgPSAqcENvZWZCdWZSb3c7Ci0gICAgfQotICAgIGJsb2NrRENMZWZ0ID0gKnBDb2VmQnVmQ29sOwotICAgIGJsb2NrRENUb3BMZWZ0ID0gKihwQ29lZkJ1ZlJvdyAtIDgpOwotCi0gICAgaWYgKGFybUFicyhibG9ja0RDTGVmdCAtIGJsb2NrRENUb3BMZWZ0KSA8IGFybUFicyhibG9ja0RDVG9wTGVmdCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gYmxvY2tEQ1RvcCkpCi0gICAgewotICAgICAgICAqcHJlZERpciA9IE9NWF9WQ19WRVJUSUNBTDsKLSAgICAgICAgKnByZWRRUCA9IHBRcEJ1ZlsxXTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgKnByZWREaXIgPSBPTVhfVkNfSE9SSVpPTlRBTDsKLSAgICAgICAgKnByZWRRUCA9IHBRcEJ1ZlswXTsKLSAgICB9Ci0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLQotLypFbmQgb2YgRmlsZSovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZmMwZWYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfWmlnemFnX1RhYmxlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotIC8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfWmlnemFnX1RhYmxlcy5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRmlsZTogICAgICAgIGFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmMKLSAqIERlc2NyaXB0aW9uOiBDb250YWlucyB0aGUgemlnemFnIHRhYmxlcwotICoKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLQotY29uc3QgT01YX1U4IGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiBbNjRdID0gCi17Ci0gICAgIDAsICAxLCAgOCwgMTYsICA5LCAgMiwgIDMsIDEwLAotICAgIDE3LCAyNCwgMzIsIDI1LCAxOCwgMTEsICA0LCAgNSwKLSAgICAxMiwgMTksIDI2LCAzMywgNDAsIDQ4LCA0MSwgMzQsCi0gICAgMjcsIDIwLCAxMywgIDYsICA3LCAxNCwgMjEsIDI4LCAKLSAgICAzNSwgNDIsIDQ5LCA1NiwgNTcsIDUwLCA0MywgMzYsCi0gICAgMjksIDIyLCAxNSwgMjMsIDMwLCAzNywgNDQsIDUxLAotICAgIDU4LCA1OSwgNTIsIDQ1LCAzOCwgMzEsIDM5LCA0NiwKLSAgICA1MywgNjAsIDYxLCA1NCwgNDcsIDU1LCA2MiwgNjMKLX07Ci0KLWNvbnN0IE9NWF9VOCBhcm1WQ000UDJfYUhvcml6b250YWxaaWd6YWdTY2FuIFs2NF0gPSAKLXsKLSAgICAgMCwgIDEsICAyLCAgMywgIDgsICA5LCAxNiwgMTcsCi0gICAgMTAsIDExLCAgNCwgIDUsICA2LCAgNywgMTUsIDE0LAotICAgIDEzLCAxMiwgMTksIDE4LCAyNCwgMjUsIDMyLCAzMywKLSAgICAyNiwgMjcsIDIwLCAyMSwgMjIsIDIzLCAyOCwgMjksCi0gICAgMzAsIDMxLCAzNCwgMzUsIDQwLCA0MSwgNDgsIDQ5LAotICAgIDQyLCA0MywgMzYsIDM3LCAzOCwgMzksIDQ0LCA0NSwgCi0gICAgNDYsIDQ3LCA1MCwgNTEsIDU2LCA1NywgNTgsIDU5LAotICAgIDUyLCA1MywgNTQsIDU1LCA2MCwgNjEsIDYyLCA2MwotfTsKLQotY29uc3QgT01YX1U4IGFybVZDTTRQMl9hVmVydGljYWxaaWd6YWdTY2FuIFs2NF0gPSAKLXsKLSAgICAgMCwgIDgsIDE2LCAyNCwgIDEsICA5LCAgMiwgMTAsCi0gICAgIDE3LCAyNSwgMzIsIDQwLCA0OCwgNTYsIDU3LCA0OSwKLSAgICAgNDEsIDMzLCAyNiwgMTgsICAzLCAxMSwgIDQsIDEyLAotICAgICAxOSwgMjcsIDM0LCA0MiwgNTAsIDU4LCAzNSwgNDMsCi0gICAgIDUxLCA1OSwgMjAsIDI4LCAgNSwgMTMsICA2LCAxNCwKLSAgICAgMjEsIDI5LCAzNiwgNDQsIDUyLCA2MCwgMzcsIDQ1LCAKLSAgICAgNTMsIDYxLCAyMiwgMzAsICA3LCAxNSwgMjMsIDMxLAotICAgICAzOCwgNDYsIDU0LCA2MiwgMzksIDQ3LCA1NSwgNjMKLX07Ci0KLQotLyogRW5kIG9mIGZpbGUgKi8KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjNjNTMzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2LmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBDb250YWlucyBtb2R1bGVzIGZvciBCbG9jayBtYXRjaGluZywgYSBmdWxsIHNlYXJjaCBhbGdvcml0aG0KLSAqIGlzIGltcGxlbWVudGVkCi0gKgotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYgICAoNi4yLjQuMi4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYSAxNngxNiBibG9jayBtYXRjaCB3aXRoIGhhbGYtcGl4ZWwgcmVzb2x1dGlvbi4gIFJldHVybnMgdGhlIAotICogZXN0aW1hdGVkIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgbWluaW11bSBTQUQuICBUaGlzIGZ1bmN0aW9uIAotICogZXN0aW1hdGVzIHRoZSBoYWxmLXBpeGVsIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaW50ZWdlciAKLSAqIHJlc29sdXRpb24gbW90aW9uIHZlY3RvciByZWZlcmVuY2VkIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdE1WLCBpLmUuLCAKLSAqIHRoZSBpbml0aWFsIGludGVnZXIgTVYgaXMgZ2VuZXJhdGVkIGV4dGVybmFsbHkuICBUaGUgaW5wdXQgcGFyYW1ldGVycyAKLSAqIHBTcmNSZWZCdWYgYW5kIHBTZWFyY2hQb2ludFJlZlBvcyBzaG91bGQgYmUgc2hpZnRlZCBieSB0aGUgd2lubmluZyBNViBvZiAKLSAqIDE2eDE2IGludGVnZXIgc2VhcmNoIHByaW9yIHRvIGNhbGxpbmcgQmxvY2tNYXRjaF9IYWxmXzE2eDE2LiBUaGUgZnVuY3Rpb24gCi0gKiBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYgbWF5IGJlIHVzZWQgZm9yIGludGVnZXIgbW90aW9uIGVzdGltYXRpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIG1hY3JvYmxvY2sgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUuIAotICogICByZWZXaWR0aCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUgCi0gKiAgIHBSZWZSZWN0IC0gcmVmZXJlbmNlIHBsYW5lIHZhbGlkIHJlZ2lvbiByZWN0YW5nbGUgCi0gKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAotICogICAgICAgICAgICBidWZmZXIgZXh0cmFjdGVkIGZyb20gdGhlIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIDI1NiAKLSAqICAgICAgICAgICAgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIAotICogICAgICAgICAgICBieXRlcyBiZXR3ZWVuIGxpbmVzIChzdGVwKSBpcyAxNi4gCi0gKiAgIHBTZWFyY2hQb2ludFJlZlBvcyAtIHBvc2l0aW9uIG9mIHRoZSBzdGFydGluZyBwb2ludCBmb3IgaGFsZiBwaXhlbCAKLSAqICAgICAgICAgICAgc2VhcmNoIChzcGVjaWZpZWQgaW4gdGVybXMgb2YgaW50ZWdlciBwaXhlbCB1bml0cykgaW4gdGhlIAotICogICAgICAgICAgICByZWZlcmVuY2UgcGxhbmUsIGkuZS4sIHRoZSByZWZlcmVuY2UgcG9zaXRpb24gcG9pbnRlZCB0byBieSB0aGUgCi0gKiAgICAgICAgICAgIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yLiAKLSAqICAgcm5kVmFsIC0gcm91bmRpbmcgY29udHJvbCBwYXJhbWV0ZXI6IDAgLSBkaXNhYmxlZDsgMSAtIGVuYWJsZWQuIAotICogICBwU3JjRHN0TVYgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsIE1WIGVzdGltYXRlOyB0eXBpY2FsbHkgZ2VuZXJhdGVkIAotICogICAgICAgICAgICBkdXJpbmcgYSBwcmlvciAxNlgxNiBpbnRlZ2VyIHNlYXJjaDsgc3BlY2lmaWVkIGluIHRlcm1zIG9mIAotICogICAgICAgICAgICBoYWxmLXBpeGVsIHVuaXRzLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdE1WIC0gcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYgCi0gKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIG1pbmltdW0gU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY1JlZkJ1ZiwgCi0gKiAgICAgICAgIHBSZWZSZWN0LCBwU3JjQ3VyckJ1ZmYsIHBTZWFyY2hQb2ludFJlZlBvcywgcFNyY0RzdE1WLgotICogICAgLSAgICBwU3JjQ3VyckJ1ZiBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLCBvciAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYoCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKLSAgICAgT01YX0lOVCByZWZXaWR0aCwKLSAgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCi0gICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBTZWFyY2hQb2ludFJlZlBvcywKLSAgICAgT01YX0lOVCBybmRWYWwsCi0gICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0TVYsCi0gICAgIE9NWF9JTlQgKnBEc3RTQUQKLSkKLXsKLQotICAgIC8qIEZvciBhIGJsb2Nrc2l6ZSBvZiAxNngxNiAqLwotICAgIE9NWF9VOCBCbG9ja1NpemUgPSAxNjsKLSAgICAKLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8gIAotICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWZCdWYgICAgICAgICA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFJlZlJlY3QgICAgICAgICAgID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjQ3VyckJ1ZiAgICAgICAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBTZWFyY2hQb2ludFJlZlBvcyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdE1WICAgICAgICAgID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXMxNkJ5dGVBbGlnbmVkKHBTcmNDdXJyQnVmKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgCi0gICAgcmV0dXJuIChhcm1WQ000UDJfQmxvY2tNYXRjaF9IYWxmKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjUmVmQnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlZlJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNDdXJyQnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2VhcmNoUG9pbnRSZWZQb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJuZFZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0RzdE1WLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRHN0U0FELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbG9ja1NpemUpKTsKLQotCi19Ci0KLS8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZGE3OWYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OC5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb250YWlucyBtb2R1bGVzIGZvciBCbG9jayBtYXRjaGluZywgYSBmdWxsIHNlYXJjaCBhbGdvcml0aG0KLSAqIGlzIGltcGxlbWVudGVkCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4ICAgKDYuMi40LjIuNCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGFuIDh4OCBibG9jayBtYXRjaCB3aXRoIGhhbGYtcGl4ZWwgcmVzb2x1dGlvbi4gUmV0dXJucyB0aGUgCi0gKiBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIFRoaXMgZnVuY3Rpb24gCi0gKiBlc3RpbWF0ZXMgdGhlIGhhbGYtcGl4ZWwgbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIAotICogcmVzb2x1dGlvbiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0TVYsIGkuZS4sIAotICogdGhlIGluaXRpYWwgaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgZXh0ZXJuYWxseS4gIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIAotICogcFNyY1JlZkJ1ZiBhbmQgcFNlYXJjaFBvaW50UmVmUG9zIHNob3VsZCBiZSBzaGlmdGVkIGJ5IHRoZSB3aW5uaW5nIE1WIG9mIAotICogOHg4IGludGVnZXIgc2VhcmNoIHByaW9yIHRvIGNhbGxpbmcgQmxvY2tNYXRjaF9IYWxmXzh4OC4gVGhlIGZ1bmN0aW9uIAotICogQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCBtYXkgYmUgdXNlZCBmb3IgaW50ZWdlciBtb3Rpb24gZXN0aW1hdGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgYmxvY2sgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgOHg4IGJsb2NrIAotICogICAgICAgICAgICBpbiB0aGUgY3VycmVudCBwbGFuZS4gCi0gKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKLSAqICAgcFJlZlJlY3QgLSByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZSAKLSAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCi0gKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMTI4IAotICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKLSAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYuIAotICogICBwU2VhcmNoUG9pbnRSZWZQb3MgLSBwb3NpdGlvbiBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGhhbGYgcGl4ZWwgCi0gKiAgICAgICAgICAgIHNlYXJjaCAoc3BlY2lmaWVkIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMpIGluIHRoZSAKLSAqICAgICAgICAgICAgcmVmZXJlbmNlIHBsYW5lLiAKLSAqICAgcm5kVmFsIC0gcm91bmRpbmcgY29udHJvbCBwYXJhbWV0ZXI6IDAgLSBkaXNhYmxlZDsgMSAtIGVuYWJsZWQuIAotICogICBwU3JjRHN0TVYgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsIE1WIGVzdGltYXRlOyB0eXBpY2FsbHkgZ2VuZXJhdGVkIAotICogICAgICAgICAgICBkdXJpbmcgYSBwcmlvciA4eDggaW50ZWdlciBzZWFyY2gsIHNwZWNpZmllZCBpbiB0ZXJtcyBvZiAKLSAqICAgICAgICAgICAgaGFsZi1waXhlbCB1bml0cy4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAotICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjUmVmQnVmLCBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwU2VhcmNoUG9pbnRSZWZQb3MsIHBTcmNEc3RNVgotICogICAgLSAgICBwU3JjQ3VyckJ1ZiBpcyBub3QgOC1ieXRlIGFsaWduZWQgCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OCgKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAotICAgICBPTVhfSU5UIHJlZldpZHRoLAotICAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKLSAgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcFNlYXJjaFBvaW50UmVmUG9zLAotICAgICBPTVhfSU5UIHJuZFZhbCwKLSAgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RNViwKLSAgICAgT01YX0lOVCAqcERzdFNBRAotKQotewotICAgIC8qIEZvciBhIGJsb2Nrc2l6ZSBvZiA4eDggKi8KLSAgICBPTVhfVTggQmxvY2tTaXplID0gODsKLSAgICAKLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8gIAotICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWZCdWYgICAgICAgICA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFJlZlJlY3QgICAgICAgICAgID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjQ3VyckJ1ZiAgICAgICAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBTZWFyY2hQb2ludFJlZlBvcyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdE1WICAgICAgICAgID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM4Qnl0ZUFsaWduZWQocFNyY0N1cnJCdWYpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAKLSAgICByZXR1cm4gKGFybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNSZWZCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZldpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVmUmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0N1cnJCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZWFyY2hQb2ludFJlZlBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm5kVmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjRHN0TVYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEc3RTQUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrU2l6ZSkpOwotCi19Ci0KLS8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjI0MDE2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIEJsb2NrIG1hdGNoaW5nLCBhIGZ1bGwgc2VhcmNoIGFsZ29yaXRobQotICogaXMgaW1wbGVtZW50ZWQKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2ICAgKDYuMi40LjIuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgc2VhcmNoOyBlc3RpbWF0ZXMgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCAKLSAqIG1pbmltdW0gU0FELiBCb3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IG1vdGlvbiB2ZWN0b3JzIGFyZSByZXByZXNlbnRlZCB1c2luZyAKLSAqIGhhbGYtcGl4ZWwgdW5pdHMsIGFuZCB0aGVyZWZvcmUgYSBzaGlmdCBsZWZ0IG9yIHJpZ2h0IGJ5IDEgYml0IG1heSBiZSAKLSAqIHJlcXVpcmVkLCByZXNwZWN0aXZlbHksIHRvIG1hdGNoIHRoZSBpbnB1dCBvciBvdXRwdXQgTVZzIHdpdGggb3RoZXIgCi0gKiBmdW5jdGlvbnMgdGhhdCBlaXRoZXIgZ2VuZXJhdGUgb3V0cHV0IE1WcyBvciBleHBlY3QgaW5wdXQgTVZzIHJlcHJlc2VudGVkIAotICogdXNpbmcgaW50ZWdlciBwaXhlbCB1bml0cy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgTUIgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiAKLSAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgcGxhbmUuIAotICogICByZWZXaWR0aCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUgCi0gKiAgIHBSZWZSZWN0IC0gcG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHBsYW5lIHJlY3RhbmdsZTsgY29vcmRpbmF0ZXMgCi0gKiAgICAgICAgICAgIGFyZSBzcGVjaWZpZWQgcmVsYXRpdmUgdG8gdGhlIGltYWdlIG9yaWdpbi4gIFJlY3RhbmdsZSAKLSAqICAgICAgICAgICAgYm91bmRhcmllcyBtYXkgZXh0ZW5kIGJleW9uZCBpbWFnZSBib3VuZGFyaWVzIGlmIHRoZSBpbWFnZSBoYXMgCi0gKiAgICAgICAgICAgIGJlZW4gcGFkZGVkLiAgRm9yIGV4YW1wbGUsIGlmIHBhZGRpbmcgZXh0ZW5kcyA0IHBpeGVscyBiZXlvbmQgCi0gKiAgICAgICAgICAgIGZyYW1lIGJvcmRlciwgdGhlbiB0aGUgdmFsdWUgZm9yIHRoZSBsZWZ0IGJvcmRlciBjb3VsZCBiZSBzZXQgdG8gCi0gKiAgICAgICAgICAgIC00LiAKLSAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCi0gKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMjU2IAotICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCi0gKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2LiAKLSAqICAgcEN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCi0gKiAgIHBTcmNQcmVNViAtIHBvaW50ZXIgdG8gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3I7IE5VTEwgaW5kaWNhdGVzIG5vIAotICogICAgICAgICAgICBwcmVkaWN0ZWQgTVYgCi0gKiAgIHBTcmNQcmVTQUQgLSBwb2ludGVyIHRvIFNBRCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWRpY3RlZCBNViAocmVmZXJlbmNlZCAKLSAqICAgICAgICAgICAgYnkgcFNyY1ByZU1WKTsgbWF5IGJlIHNldCB0byBOVUxMIGlmIHVuYXZhaWxhYmxlLiAKLSAqICAgcE1FU3BlYyAtIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgCi0gKiAgICAgICAgICAgIG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyAKLSAqICAgICAgICAgICAgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoZSBibG9jayBtYXRjaGluZyBmdW5jdGlvbi4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAotICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNSZWZCdWYsIAotICogICAgICAgICAgICAgIHBSZWZSZWN0LCBwU3JjQ3VyckJ1ZmYsIHBDdXJyUG9pbnRQb3MsIHBEc3RNViwgcERzdFNBRCBvciAKLSAqICAgICAgICAgICAgICBwTUVTcGVjLCBvciAKLSAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYoCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKLSAgICAgT01YX0lOVCByZWZXaWR0aCwKLSAgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCi0gICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCi0gICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjUHJlTVYsCi0gICAgIGNvbnN0IE9NWF9JTlQgKnBTcmNQcmVTQUQsCi0gICAgIHZvaWQgKnBNRVNwZWMsCi0gICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVYsCi0gICAgIE9NWF9JTlQgKnBEc3RTQUQKLSkKLXsKLQotICAgT01YX1U4IEJsb2NrU2l6ZSA9IDE2OwotICAgCi0gICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8gIAotICAgYXJtUmV0QXJnRXJySWYoIWFybUlzMTZCeXRlQWxpZ25lZChwU3JjQ3VyckJ1ZiksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgIAotICAgcmV0dXJuICggYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcigKLSAgICAgcFNyY1JlZkJ1ZiwKLSAgICAgcmVmV2lkdGgsCi0gICAgIHBSZWZSZWN0LAotICAgICBwU3JjQ3VyckJ1ZiwKLSAgICAgcEN1cnJQb2ludFBvcywKLSAgICAgcFNyY1ByZU1WLAotICAgICBwU3JjUHJlU0FELAotICAgICBwTUVTcGVjLAotICAgICBwRHN0TVYsCi0gICAgIHBEc3RTQUQsCi0gICAgIEJsb2NrU2l6ZSkKLSAgICAgKTsKLQotCi19Ci0KLS8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczYTk5YmQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OC5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb250YWlucyBtb2R1bGVzIGZvciBCbG9jayBtYXRjaGluZywgYSBmdWxsIHNlYXJjaCBhbGdvcml0aG0KLSAqIGlzIGltcGxlbWVudGVkCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCAgICg2LjIuNC4yLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhbiA4eDggYmxvY2sgc2VhcmNoOyBlc3RpbWF0ZXMgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCAKLSAqIG1pbmltdW0gU0FELiAgQm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgCi0gKiB1c2luZyBoYWxmLXBpeGVsIHVuaXRzLCBhbmQgdGhlcmVmb3JlIGEgc2hpZnQgbGVmdCBvciByaWdodCBieSAxIGJpdCBtYXkgYmUgCi0gKiByZXF1aXJlZCwgcmVzcGVjdGl2ZWx5LCB0byBtYXRjaCB0aGUgaW5wdXQgb3Igb3V0cHV0IE1WcyB3aXRoIG90aGVyIAotICogZnVuY3Rpb25zIHRoYXQgZWl0aGVyIGdlbmVyYXRlIG91dHB1dCBNVnMgb3IgZXhwZWN0IGlucHV0IE1WcyByZXByZXNlbnRlZCAKLSAqIHVzaW5nIGludGVnZXIgcGl4ZWwgdW5pdHMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIGJsb2NrIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IDh4OCBibG9jayAKLSAqICAgICAgICAgICAgaW4gdGhlIGN1cnJlbnQgcGxhbmUuIAotICogICByZWZXaWR0aCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUgCi0gKiAgIHBSZWZSZWN0IC0gcG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHBsYW5lIHJlY3RhbmdsZTsgY29vcmRpbmF0ZXMgCi0gKiAgICAgICAgICAgIGFyZSBzcGVjaWZpZWQgcmVsYXRpdmUgdG8gdGhlIGltYWdlIG9yaWdpbi4gIFJlY3RhbmdsZSAKLSAqICAgICAgICAgICAgYm91bmRhcmllcyBtYXkgZXh0ZW5kIGJleW9uZCBpbWFnZSBib3VuZGFyaWVzIGlmIHRoZSBpbWFnZSBoYXMgCi0gKiAgICAgICAgICAgIGJlZW4gcGFkZGVkLiAKLSAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCi0gKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMTI4IAotICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCi0gKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2IGJ5dGVzLiAKLSAqICAgcEN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lIAotICogICBwU3JjUHJlTVYgLSBwb2ludGVyIHRvIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yOyBOVUxMIGluZGljYXRlcyBubyAKLSAqICAgICAgICAgICAgcHJlZGljdGVkIE1WIAotICogICBwU3JjUHJlU0FEIC0gcG9pbnRlciB0byBTQUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVkaWN0ZWQgTVYgKHJlZmVyZW5jZWQgCi0gKiAgICAgICAgICAgIGJ5IHBTcmNQcmVNVik7IG1heSBiZSBzZXQgdG8gTlVMTCBpZiB1bmF2YWlsYWJsZS4gCi0gKiAgIHBNRVNwZWMgLSB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IAotICogICAgICAgICAgICBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgYW5kIHRoZW4gaW5pdGlhbGl6ZWQgdXNpbmcgCi0gKiAgICAgICAgICAgIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgYmxvY2sgbWF0Y2hpbmcgZnVuY3Rpb24uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0TVYgLSBwb2ludGVyIHRvIGVzdGltYXRlZCBNViAKLSAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gbWluaW11bSBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjUmVmQnVmLCAKLSAqICAgICAgICAgICAgICBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwQ3VyclBvaW50UG9zLCBwRHN0TVYsIHBEc3RTQUQgb3IgCi0gKiAgICAgICAgICAgICAgcE1FU3BlYywgb3IgCi0gKiAgICAtICAgIHBTcmNDdXJyQnVmIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZCAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4KAotICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCi0gICAgIE9NWF9JTlQgcmVmV2lkdGgsCi0gICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotICAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAotICAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAotICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY1ByZU1WLAotICAgICBjb25zdCBPTVhfSU5UICpwU3JjUHJlU0FELAotICAgICB2b2lkICpwTUVTcGVjLAotICAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WLAotICAgICBPTVhfSU5UICpwRHN0U0FECi0pCi17Ci0gICBPTVhfVTggQmxvY2tTaXplID0gODsKLSAgIAotICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovICAKLSAgIGFybVJldEFyZ0VycklmKCFhcm1JczhCeXRlQWxpZ25lZChwU3JjQ3VyckJ1ZiksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgIAotICAgcmV0dXJuICggYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcigKLSAgICAgcFNyY1JlZkJ1ZiwKLSAgICAgcmVmV2lkdGgsCi0gICAgIHBSZWZSZWN0LAotICAgICBwU3JjQ3VyckJ1ZiwKLSAgICAgcEN1cnJQb2ludFBvcywKLSAgICAgcFNyY1ByZU1WLAotICAgICBwU3JjUHJlU0FELAotICAgICBwTUVTcGVjLAotICAgICBwRHN0TVYsCi0gICAgIHBEc3RTQUQsCi0gICAgIEJsb2NrU2l6ZSkKLSAgICAgKTsKLQotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRENUOHg4YmxrLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EQ1Q4eDhibGsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzczZTI0YS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EQ1Q4eDhibGsuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RDVDh4OGJsay5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb250YWlucyBtb2R1bGVzIGZvciA4eDggYmxvY2sgRENUCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDTTRQMl9EQ1RfVGFibGUuaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EQ1Q4eDhibGsgICAoNi4yLjQuNC4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29tcHV0ZXMgYSAyRCBmb3J3YXJkIERDVCBmb3IgYSBzaW5nbGUgOHg4IGJsb2NrLCBhcyBkZWZpbmVkIGluIAotICogW0lTTzE0NDk2LTJdLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmVhcmx5IGFycmFuZ2VkIGlucHV0IGJ1ZmZlcjsgbXVzdCAKLSAqICAgICAgICAgICAgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICBJbnB1dCB2YWx1ZXMgKHBpeGVsIAotICogICAgICAgICAgICBpbnRlbnNpdGllcykgYXJlIHZhbGlkIGluIHRoZSByYW5nZSBbLTI1NSwyNTVdLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lYXJseSBhcnJhbmdlZCBvdXRwdXQgYnVmZmVyOyBtdXN0IAotICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIHJldHVybmVkIGlmOgotICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCi0gKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMl9EQ1Q4eDhibGsgKGNvbnN0IE9NWF9TMTYgKnBTcmMsIE9NWF9TMTYgKnBEc3QpCi17Ci0gICAgT01YX0lOVCB4LCB5LCB1LCB2OwotICAgIAotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczE2Qnl0ZUFsaWduZWQocFNyYyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXMxNkJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLQotICAgIGZvciAodSA9IDA7IHUgPCA4OyB1KyspCi0gICAgewotICAgICAgICBmb3IgKHYgPSAwOyB2IDwgODsgdisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBPTVhfRjY0IHN1bSA9IDAuMDsKLSAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IDg7IHkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN1bSArPSBwU3JjWyh4ICogOCkgKyB5XSAqCi0gICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9wcmVDYWxjRENUQ29zW3hdW3VdICoKLSAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX3ByZUNhbGNEQ1RDb3NbeV1bdl07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcERzdFsodSAqIDgpICsgdl09IGFybVJvdW5kRmxvYXRUb1MxNiAoc3VtKTsgICAgICAgICAgICAKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0KLQotLyogRW5kIG9mIGZpbGUgKi8KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzlhN2Y2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjogCi0gKiBDb250YWlucyBtb2R1bGVzIGZvciBpbnRlciByZWNvbnN0cnVjdGlvbgotICogCi0gKi8KLSAKLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlciAgICg2LjIuNS40LjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBEZWNvZGVzIHRoZSBJTlRFUiBibG9jayBjb2VmZmljaWVudHMuIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSAKLSAqIHF1YW50aXphdGlvbiwgaW52ZXJzZSB6aWd6YWcgcG9zaXRpb25pbmcsIGFuZCBJRENUICh3aXRoIGFwcHJvcHJpYXRlIAotICogY2xpcHBpbmcgb24gZWFjaCBzdGVwKSBvbiB0aGUgY29lZmZpY2llbnRzLiBUaGUgcmVzdWx0cyAocmVzaWR1YWxzKSBhcmUgCi0gKiBwbGFjZWQgaW4gYSBjb250aWd1b3VzIGFycmF5IG9mIDY0IGVsZW1lbnRzLiBGb3IgSU5URVIgYmxvY2ssIHRoZSBvdXRwdXQgCi0gKiBidWZmZXIgaG9sZHMgdGhlIHJlc2lkdWFscyBmb3IgZnVydGhlciByZWNvbnN0cnVjdGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCAKLSAqICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4gVGhlcmUgaXMgbm8gYm91bmRhcnkgY2hlY2sgZm9yIHRoZSBiaXQgc3RyZWFtIAotICogICAgICAgICAgICBidWZmZXIuIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluIFswLTddIAotICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCi0gKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwgc28gCi0gKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCi0gKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVjb2RlZCByZXNpZHVhbCBidWZmZXIgKGEgY29udGlndW91cyBhcnJheSBvZiA2NCAKLSAqICAgICAgICAgICAgZWxlbWVudHMgb2YgT01YX1MxNiBkYXRhIHR5cGUpOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIGlmOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOdWxsOiAKLSAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCAsIHBEc3QgCi0gKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KLSAqICAgIC0gICAgUVAgPD0gMC4gCi0gKiAgICAtICAgIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCAKLSAqICAgIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yLiBSZWZlciB0byBPTVhfU3RzX0VyciBvZiBEZWNvZGVWTENaaWd6YWdfSW50ZXIgLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyKAotICAgICBjb25zdCBPTVhfVTggKiogcHBCaXRTdHJlYW0sCi0gICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAotICAgICBPTVhfUzE2ICogcERzdCwKLSAgICAgT01YX0lOVCBRUCwKLSAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pCi17Ci0gICAgLyogNjQgZWxlbWVudHMgYXJlIG5lZWRlZCBidXQgdG8gYWxpZ24gaXQgdG8gMTYgYnl0ZXMgbmVlZAotICAgIDE1IG1vcmUgZWxlbWVudHMgb2YgcGFkZGluZyAqLwotICAgIE9NWF9TMTYgdGVtcEJ1Zls3OV07Ci0gICAgT01YX1MxNiAqcFRlbXBCdWYxOwotICAgIE9NWFJlc3VsdCBlcnJvckNvZGU7Ci0gICAgLyogQWxpZ25pbmcgdGhlIGxvY2FsIGJ1ZmZlcnMgKi8KLSAgICBwVGVtcEJ1ZjEgPSBhcm1BbGlnblRvMTZCeXRlcyh0ZW1wQnVmKTsKLSAgICAKLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKnBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQml0T2Zmc2V0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXMxNkJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKChRUCA8PSAwKSB8fCAoUVAgPj0gMzIpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotCWFybVJldEFyZ0VycklmKCgoKnBCaXRPZmZzZXQgPCAwKSB8fCAoKnBCaXRPZmZzZXQgPiA3KSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQotCi0gICAgLyogVkxEIGFuZCB6aWd6YWcgKi8KLSAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcEJ1ZjEsc2hvcnRWaWRlb0hlYWRlcik7Ci0gICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7Ci0gICAgCi0gICAgLyogRGVxdWFudGl6YXRpb24gKi8KLSAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JKAotICAgICBwVGVtcEJ1ZjEsCi0gICAgIFFQKTsKLSAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKLSAgICAKLSAgICAvKiBJbnZlcnNlIHRyYW5zZm9ybSAqLwotICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9JRENUOHg4YmxrKHBUZW1wQnVmMSwgcERzdCk7Ci0gICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7Ci0gICAgCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qIEVuZCBvZiBmaWxlICovCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcwZGE2Yy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYworKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246IAotICogQ29udGFpbnMgbW9kdWxlcyBmb3IgaW50cmEgcmVjb25zdHJ1Y3Rpb24KLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEgICAoNi4yLjUuNC4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogRGVjb2RlcyB0aGUgSU5UUkEgYmxvY2sgY29lZmZpY2llbnRzLiBJbnZlcnNlIHF1YW50aXphdGlvbiwgaW52ZXJzZWx5IAotICogemlnemFnIHBvc2l0aW9uaW5nLCBhbmQgSURDVCwgd2l0aCBhcHByb3ByaWF0ZSBjbGlwcGluZyBvbiBlYWNoIHN0ZXAsIGFyZSAKLSAqIHBlcmZvcm1lZCBvbiB0aGUgY29lZmZpY2llbnRzLiBUaGUgcmVzdWx0cyBhcmUgdGhlbiBwbGFjZWQgaW4gdGhlIG91dHB1dCAKLSAqIGZyYW1lL3BsYW5lIG9uIGEgcGl4ZWwgYmFzaXMuICBOb3RlOiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgdXNlZCBvbmx5IHdoZW4gCi0gKiBhdCBsZWFzdCBvbmUgbm9uLXplcm8gQUMgY29lZmZpY2llbnQgb2YgY3VycmVudCBibG9jayBleGlzdHMgaW4gdGhlIGJpdCAKLSAqIHN0cmVhbS4gVGhlIERDIG9ubHkgY29uZGl0aW9uIHdpbGwgYmUgaGFuZGxlZCBpbiBhbm90aGVyIGZ1bmN0aW9uLiAKLSAqCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCAKLSAqICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4gVGhlcmUgaXMgbm8gYm91bmRhcnkgY2hlY2sgZm9yIHRoZSBiaXQgc3RyZWFtIAotICogICAgICAgICAgICBidWZmZXIuIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluIFswLTddLiAKLSAqICAgc3RlcCAtIHdpZHRoIG9mIHRoZSBkZXN0aW5hdGlvbiBwbGFuZSAKLSAqICAgcENvZWZCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gCi0gKiAgICAgICAgICAgIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBDb2VmQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBjdXJRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIG1hY3JvYmxvY2sgd2hpY2ggdGhlIGN1cnJlbnQgYmxvY2sgCi0gKiAgICAgICAgICAgIGJlbG9uZ3MgdG8gCi0gKiAgIHBRUEJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYnVmZmVyIAotICogICBibG9ja0luZGV4IC0gYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kIHBvc2l0aW9uIGFzIAotICogICAgICAgICAgICBkZWZpbmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDYuMS4zLjgsIEZpZ3VyZSA2LTUuIAotICogICBpbnRyYURDVkxDIC0gYSBjb2RlIGRldGVybWluZWQgYnkgaW50cmFfZGNfdmxjX3RociBhbmQgUVAuIFRoaXMgYWxsb3dzIGEgCi0gKiAgICAgICAgICAgIG1lY2hhbmlzbSB0byBzd2l0Y2ggYmV0d2VlbiB0d28gVkxDIGZvciBjb2Rpbmcgb2YgSW50cmEgREMgCi0gKiAgICAgICAgICAgIGNvZWZmaWNpZW50cyBhcyBwZXIgW0lTTzE0NDk2LTJdLCBUYWJsZSA2LTIxLiAKLSAqICAgQUNQcmVkRmxhZyAtIGEgZmxhZyBlcXVhbCB0byBhY19wcmVkX2ZsYWcgKG9mIGx1bWluYW5jZSkgaW5kaWNhdGluZyBpZiAKLSAqICAgICAgICAgICAgdGhlIGFjIGNvZWZmaWNpZW50cyBvZiB0aGUgZmlyc3Qgcm93IG9yIGZpcnN0IGNvbHVtbiBhcmUgCi0gKiAgICAgICAgICAgIGRpZmZlcmVudGlhbGx5IGNvZGVkIGZvciBpbnRyYSBjb2RlZCBtYWNyb2Jsb2NrLiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyAKLSAqICAgICAgICAgICAgbW9kZSwgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkLCBzbyAKLSAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKLSAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBibG9jayBpbiB0aGUgZGVzdGluYXRpb24gcGxhbmU7IG11c3QgYmUgYWxpZ25lZCBvbiAKLSAqICAgICAgICAgICAgYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcENvZWZCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIuIAotICogICBwQ29lZkJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlciAgTm90ZTogCi0gKiAgICAgICAgICAgIFRoZSBjb2VmZmljaWVudCBidWZmZXJzIG11c3QgYmUgdXBkYXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIAotICogICAgICAgICAgICB1cGRhdGUgcHJvY2VkdXJlIGRlZmluZWQgaW4gc2VjdGlvbiA2LjIuMi4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIGlmOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcENvZWZCdWZSb3csIHBDb2VmQnVmQ29sLCAKLSAqICAgICAgICAgcFFQQnVmLCBwRHN0LiAKLSAqICAgIC0gICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XSAKLSAqICAgIC0gICAgY3VyUVAgZXhjZWVkcyAoMSwgMzEpCi0gKiAgICAtICAgIGJsb2NrSW5kZXggZXhjZWVkcyBbMCw1XQotICogICAgLSAgICBzdGVwIGlzIG5vdCB0aGUgbXVsdGlwbGUgb2YgOAotICogICAgLSAgICBhIHBvaW50ZXIgYWxpZ25tZW50IHJlcXVpcmVtZW50IHdhcyB2aW9sYXRlZC4gCi0gKiAgICBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvci4gUmVmZXIgdG8gT01YX1N0c19FcnIgb2YgRGVjb2RlVkxDWmlnemFnX0ludHJhLiAgCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhKAotICAgICBjb25zdCBPTVhfVTggKiogcHBCaXRTdHJlYW0sCi0gICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgIE9NWF9VOCAqcERzdCwKLSAgICAgT01YX0lOVCBzdGVwLAotICAgICBPTVhfUzE2ICpwQ29lZkJ1ZlJvdywKLSAgICAgT01YX1MxNiAqcENvZWZCdWZDb2wsCi0gICAgIE9NWF9VOCBjdXJRUCwKLSAgICAgY29uc3QgT01YX1U4ICpwUVBCdWYsCi0gICAgIE9NWF9JTlQgYmxvY2tJbmRleCwKLSAgICAgT01YX0lOVCBpbnRyYURDVkxDLAotICAgICBPTVhfSU5UIEFDUHJlZEZsYWcsCi0JIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotICkKLXsKLSAgICBPTVhfUzE2IHRlbXBCdWYxWzc5XSwgdGVtcEJ1ZjJbNzldOwotICAgIE9NWF9TMTYgKnBUZW1wQnVmMSwgKnBUZW1wQnVmMjsKLSAgICBPTVhfSU5UIHByZWREaXIsIHByZWRBQ0RpciwgaSwgaiwgY291bnQ7Ci0gICAgT01YX0lOVCAgcHJlZFFQOwotICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcDsKLSAgICBPTVhSZXN1bHQgZXJyb3JDb2RlOwotICAgIAotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLwotICAgIGFybVJldEFyZ0VycklmKHBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigqcHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCaXRPZmZzZXQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBDb2VmQnVmUm93ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQ29lZkJ1ZkNvbCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFFQQnVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM4Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoKGN1clFQIDw9IDApIHx8IChjdXJRUCA+PSAzMikpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKCpwQml0T2Zmc2V0IDwgMCkgfHwgKCpwQml0T2Zmc2V0ID43KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChibG9ja0luZGV4IDwgMCkgfHwgKGJsb2NrSW5kZXggPiA1KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChzdGVwICUgOCkgIT0gMCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIAotCi0gICAgLyogQWxpZ25pbmcgdGhlIGxvY2FsIGJ1ZmZlcnMgKi8KLSAgICBwVGVtcEJ1ZjEgPSBhcm1BbGlnblRvMTZCeXRlcyh0ZW1wQnVmMSk7Ci0gICAgcFRlbXBCdWYyID0gYXJtQWxpZ25UbzE2Qnl0ZXModGVtcEJ1ZjIpOwotICAgIAotICAgIC8qIFNldHRpbmcgdGhlIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uIGFuZCBwcmVkaWN0aW9uIGRpcmVjdGlvbiAqLwotICAgIGFybVZDTTRQMl9TZXRQcmVkRGlyKAotICAgICAgICBibG9ja0luZGV4LAotICAgICAgICBwQ29lZkJ1ZlJvdywKLSAgICAgICAgcENvZWZCdWZDb2wsCi0gICAgICAgICZwcmVkRGlyLAotICAgICAgICAmcHJlZFFQLAotICAgICAgICBwUVBCdWYpOwotCi0gICAgcHJlZEFDRGlyID0gcHJlZERpcjsKLQotICAgIGFybVJldEFyZ0VycklmKCgocHJlZFFQIDw9IDApIHx8IChwcmVkUVAgPj0gMzIpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotCi0gICAgaWYgKEFDUHJlZEZsYWcgPT0gMCkKLSAgICB7Ci0gICAgICAgIHByZWRBQ0RpciA9IE9NWF9WQ19OT05FOwotICAgIH0KLQotICAgIC8qIFNldHRpbmcgdGhlIHZpZGVvQ29tcCAqLwotICAgIGlmIChibG9ja0luZGV4IDw9IDMpCi0gICAgewotICAgICAgICB2aWRlb0NvbXAgPSBPTVhfVkNfTFVNSU5BTkNFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB2aWRlb0NvbXAgPSBPTVhfVkNfQ0hST01JTkFOQ0U7Ci0gICAgfQotICAgIAotCi0gICAgLyogVkxEIGFuZCB6aWd6YWcgKi8KLSAgICBpZiAoaW50cmFEQ1ZMQyA9PSAxKQotICAgIHsKLSAgICAgICAgZXJyb3JDb2RlID0gb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDKAotICAgICAgICAgICAgcHBCaXRTdHJlYW0sCi0gICAgICAgICAgICBwQml0T2Zmc2V0LAotICAgICAgICAgICAgcFRlbXBCdWYxLAotICAgICAgICAgICAgcHJlZEFDRGlyLAotICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlciwKLSAgICAgICAgICAgIHZpZGVvQ29tcCk7Ci0gICAgICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMoCi0gICAgICAgICAgICBwcEJpdFN0cmVhbSwKLSAgICAgICAgICAgIHBCaXRPZmZzZXQsCi0gICAgICAgICAgICBwVGVtcEJ1ZjEsCi0gICAgICAgICAgICBwcmVkQUNEaXIsCi0gICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyKTsKLSAgICAgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7Ci0gICAgfQotCi0gICAgLyogQUMgREMgcHJlZGljdGlvbiAqLwotICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEoCi0gICAgICAgIHBUZW1wQnVmMSwKLSAgICAgICAgcENvZWZCdWZSb3csCi0gICAgICAgIHBDb2VmQnVmQ29sLAotICAgICAgICBjdXJRUCwKLSAgICAgICAgcHJlZFFQLAotICAgICAgICBwcmVkRGlyLAotICAgICAgICBBQ1ByZWRGbGFnLAotICAgICAgICB2aWRlb0NvbXApOwotICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOwotICAgIAotICAgIC8qIERlcXVhbnRpemF0aW9uICovCi0gICAgZXJyb3JDb2RlID0gb214VkNNNFAyX1F1YW50SW52SW50cmFfSSgKLSAgICAgcFRlbXBCdWYxLAotICAgICBjdXJRUCwKLSAgICAgdmlkZW9Db21wLAotICAgICBzaG9ydFZpZGVvSGVhZGVyKTsKLSAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKLSAgICAKLSAgICAvKiBJbnZlcnNlIHRyYW5zZm9ybSAqLwotICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9JRENUOHg4YmxrIChwVGVtcEJ1ZjEsIHBUZW1wQnVmMik7Ci0gICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7Ci0gICAgCi0gICAgLyogUGxhY2luZyB0aGUgbGluZWFyIGFycmF5IGludG8gdGhlIGRlc3RpbmF0aW9uIHBsYW5lIGFuZCBjbGlwcGluZwotICAgICAgIGl0IHRvIDAgdG8gMjU1ICovCi0gICAgZm9yIChqID0gMCwgY291bnQgPSAwOyBqIDwgODsgaisrKQotICAgIHsKLSAgICAgICAgZm9yKGkgPSAwOyBpIDwgODsgaSsrLCBjb3VudCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwRHN0W2ldID0gYXJtQ2xpcCAoMCwgMjU1LCBwVGVtcEJ1ZjJbY291bnRdKTsKLSAgICAgICAgfQotICAgICAgICBwRHN0ICs9IHN0ZXA7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qIEVuZCBvZiBmaWxlICovCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTJjMjIwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AuYworKysgL2Rldi9udWxsCkBAIC0xLDI1OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOiAKLSAqIENvbnRhaW5zIG1vZHVsZSBmb3IgZGVjb2RpbmcgTVYgYW5kIHBhZGRpbmcgdGhlIHNhbWUKLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgiCi0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AgICAoNi4yLjUuMS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogRGVjb2RlcyBhbmQgcGFkcyB0aGUgZm91ciBtb3Rpb24gdmVjdG9ycyBhc3NvY2lhdGVkIHdpdGggYSBub24taW50cmEgUC1WT1AgCi0gKiBtYWNyb2Jsb2NrLiAgRm9yIG1hY3JvYmxvY2tzIG9mIHR5cGUgT01YX1ZDX0lOVEVSNFYsIHRoZSBvdXRwdXQgTVYgaXMgCi0gKiBwYWRkZWQgYXMgc3BlY2lmaWVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi4xLjYuIE90aGVyd2lzZSwgZm9yIAotICogbWFjcm9ibG9ja3Mgb2YgdHlwZXMgb3RoZXIgdGhhbiBPTVhfVkNfSU5URVI0ViwgdGhlIGRlY29kZWQgTVYgaXMgY29waWVkIHRvIAotICogYWxsIGZvdXIgb3V0cHV0IE1WIGJ1ZmZlciBlbnRyaWVzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IAotICogICAgICAgICAgICBzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluIFswLTddLiAKLSAqICAgcFNyY01WTGVmdE1CLCBwU3JjTVZVcHBlck1CLCBhbmQgcFNyY01WVXBwZXJSaWdodE1CIC0gcG9pbnRlcnMgdG8gdGhlIAotICogICAgICAgICAgICBtb3Rpb24gdmVjdG9yIGJ1ZmZlcnMgb2YgdGhlIG1hY3JvYmxvY2tzIHNwZWNpYWxseSBhdCB0aGUgbGVmdCwgCi0gKiAgICAgICAgICAgIHVwcGVyLCBhbmQgdXBwZXItcmlnaHQgc2lkZSBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLCAKLSAqICAgICAgICAgICAgcmVzcGVjdGl2ZWx5OyBhIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAgTm90ZTogCi0gKiAgICAgICAgICAgIEFueSBuZWlnaGJvcmhvb2QgbWFjcm9ibG9jayBvdXRzaWRlIHRoZSBjdXJyZW50IFZPUCBvciB2aWRlbyAKLSAqICAgICAgICAgICAgcGFja2V0IG9yIG91dHNpZGUgdGhlIGN1cnJlbnQgR09CICh3aGVuIHNob3J0X3ZpZGVvX2hlYWRlciBpcyAKLSAqICAgICAgICAgICAgIDEgKSBmb3Igd2hpY2ggZ29iX2hlYWRlcl9lbXB0eSBpcyAgMCAgaXMgdHJlYXRlZCBhcyAKLSAqICAgICAgICAgICAgdHJhbnNwYXJlbnQsIGFjY29yZGluZyB0byBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuNS4gCi0gKiAgIGZjb2RlRm9yd2FyZCAtIGEgY29kZSBlcXVhbCB0byB2b3BfZmNvZGVfZm9yd2FyZCBpbiBNUEVHLTQgYml0IHN0cmVhbSAKLSAqICAgICAgICAgICAgc3ludGF4IAotICogICBNQlR5cGUgLSB0aGUgdHlwZSBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLiBJZiBNQlR5cGUgaXMgbm90IGVxdWFsIHRvIAotICogICAgICAgICAgICBPTVhfVkNfSU5URVI0ViwgdGhlIGRlc3RpbmF0aW9uIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIGlzIHN0aWxsIAotICogICAgICAgICAgICBmaWxsZWQgd2l0aCB0aGUgc2FtZSBkZWNvZGVkIHZlY3Rvci4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQsIHNvIAotICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAotICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKLSAqICAgcERzdE1WQ3VyTUIgLSBwb2ludGVyIHRvIHRoZSBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBmb3IgdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIG1hY3JvYmxvY2s7IGNvbnRhaW5zIGZvdXIgZGVjb2RlZCBtb3Rpb24gdmVjdG9ycyAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3RNVkN1ck1CIAotICogICAgLSAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddCi0gKiAgICAtICAgIGZjb2RlRm9yd2FyZCBleGNlZWRzICgwLDddCi0gKiAgICAtICAgIE1CVHlwZSBsZXNzIHRoYW4gemVybwotICogICAgLSAgICBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IgCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUCgKLSAgICAgY29uc3QgT01YX1U4ICoqIHBwQml0U3RyZWFtLAotICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKLSAgICAgT01YVkNNb3Rpb25WZWN0b3IgKiBwU3JjTVZMZWZ0TUIsCi0gICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZVcHBlck1CLAotICAgICBPTVhWQ01vdGlvblZlY3RvciAqIHBTcmNNVlVwcGVyUmlnaHRNQiwKLSAgICAgT01YVkNNb3Rpb25WZWN0b3IgKiBwRHN0TVZDdXJNQiwKLSAgICAgT01YX0lOVCBmY29kZUZvcndhcmQsCi0gICAgIE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlIE1CVHlwZQotICkKLXsKLSAgICBPTVhWQ01vdGlvblZlY3RvciBkaWZmTVY7Ci0gICAgT01YVkNNb3Rpb25WZWN0b3IgZHN0TVZQcmVkTUVbMTJdOwotICAgIE9NWF9JTlQgaUJsaywgaSwgY291bnQgPSAxOwotICAgIE9NWF9TMzIgbXZIb3JSZXNpZHVhbCA9IDEsIG12VmVyUmVzaWR1YWwgPSAxLCBtdkhvckRhdGEsIG12VmVyRGF0YTsKLSAgICBPTVhfUzggc2NhbGVGYWN0b3IsIGluZGV4OwotICAgIE9NWF9TMTYgaGlnaCwgbG93LCByYW5nZTsKLQotCi0gICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCi0gICAgYXJtUmV0QXJnRXJySWYocHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCpwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJpdE9mZnNldCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocERzdE1WQ3VyTUIgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCgoKnBCaXRPZmZzZXQgPCAwKSB8fCAoKnBCaXRPZmZzZXQgPiA3KSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoKGZjb2RlRm9yd2FyZCA8IDEpIHx8IChmY29kZUZvcndhcmQgPiA3KSksIFwKLSAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczRCeXRlQWxpZ25lZChwRHN0TVZDdXJNQiksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAKLSAgICBpZiAoKE1CVHlwZSA9PSBPTVhfVkNfSU5UUkEpIHx8Ci0gICAgICAgIChNQlR5cGUgPT0gT01YX1ZDX0lOVFJBX1EpCi0gICAgICAgKQotICAgIHsKLSAgICAgICAgLyogQWxsIE1WJ3MgYXJlIHplcm8gKi8KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgcERzdE1WQ3VyTUJbaV0uZHggPSAwOwotICAgICAgICAgICAgcERzdE1WQ3VyTUJbaV0uZHkgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci0gICAgfQotCi0gICAgaWYgKChNQlR5cGUgPT0gT01YX1ZDX0lOVEVSNFYpIHx8IChNQlR5cGUgPT0gT01YX1ZDX0lOVEVSNFZfUSkpCi0gICAgewotICAgICAgICBjb3VudCA9IDQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKChNQlR5cGUgPT0gT01YX1ZDX0lOVEVSKSB8fCAoTUJUeXBlID09IE9NWF9WQ19JTlRFUl9RKSkKLSAgICB7Ci0gICAgICAgIGNvdW50ID0gMTsKLSAgICB9Ci0KLSAgICAvKiBDYWxjdWxhdGluZyB0aGUgc2NhbGUgZmFjdG9yICovCi0gICAgc2NhbGVGYWN0b3IgPSAxIDw8IChmY29kZUZvcndhcmQgLTEpOwotICAgIGhpZ2ggPSAgKCAzMiAqIHNjYWxlRmFjdG9yKSAtIDE7Ci0gICAgbG93ID0gICAoICgtMzIpICogc2NhbGVGYWN0b3IpOwotICAgIHJhbmdlID0gKCA2NCAqIHNjYWxlRmFjdG9yKTsKLQotICAgIC8qIEh1ZmZtYW4gZGVjb2RpbmcgYW5kIE1WIHJlY29uc3RydWN0aW9uICovCi0gICAgZm9yIChpQmxrID0gMDsgaUJsayA8IGNvdW50OyBpQmxrKyspCi0gICAgewotCi0gICAgICAgIC8qIEh1ZmZtYW4gZGVjb2RpbmcgdG8gZ2V0IEhvcml6b250YWwgZGF0YSBhbmQgcmVzaWR1YWwgKi8KLSAgICAgICAgaW5kZXggPSBhcm1VblBhY2tWTEMzMihwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX2FWbGNNVkQpOwotICAgICAgICBhcm1SZXREYXRhRXJySWYoaW5kZXggPT0gLTEsIE9NWF9TdHNfRXJyKTsKLQotICAgICAgICBtdkhvckRhdGEgPSBpbmRleCAtIDMyOwotCi0gICAgICAgIGlmICgoZmNvZGVGb3J3YXJkID4gMSkgJiYgKG12SG9yRGF0YSAhPSAwKSkKLSAgICAgICAgewotICAgICAgICAgICAgbXZIb3JSZXNpZHVhbCA9IChPTVhfUzMyKSBhcm1HZXRCaXRzKHBwQml0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQml0T2Zmc2V0LCAoZmNvZGVGb3J3YXJkIC0xKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBIdWZmbWFuIGRlY29kaW5nIHRvIGdldCBWZXJ0aWNhbCBkYXRhIGFuZCByZXNpZHVhbCAqLwotICAgICAgICBpbmRleCA9IGFybVVuUGFja1ZMQzMyKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBhcm1WQ000UDJfYVZsY01WRCk7Ci0gICAgICAgIGFybVJldERhdGFFcnJJZihpbmRleCA9PSAtMSwgT01YX1N0c19FcnIpOwotCi0gICAgICAgIG12VmVyRGF0YSA9IGluZGV4IC0gMzI7Ci0KLSAgICAgICAgaWYgKChmY29kZUZvcndhcmQgPiAxKSAmJiAobXZWZXJEYXRhICE9IDApKQotICAgICAgICB7Ci0gICAgICAgICAgICBtdlZlclJlc2lkdWFsID0gKE9NWF9TMzIpIGFybUdldEJpdHMocHBCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRPZmZzZXQsIChmY29kZUZvcndhcmQgLTEpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENhbGN1bGF0aW5nIHRoZSBkaWZmZXJ0aWFsIE1WICovCi0gICAgICAgIGlmICggKHNjYWxlRmFjdG9yID09IDEpIHx8IChtdkhvckRhdGEgPT0gMCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBkaWZmTVYuZHggPSBtdkhvckRhdGE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBkaWZmTVYuZHggPSAoKGFybUFicyhtdkhvckRhdGEpIC0gMSkgKiBmY29kZUZvcndhcmQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyBtdkhvclJlc2lkdWFsICsgMTsKLSAgICAgICAgICAgIGlmIChtdkhvckRhdGEgPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRpZmZNVi5keCA9IC1kaWZmTVYuZHg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIChzY2FsZUZhY3RvciA9PSAxKSB8fCAobXZWZXJEYXRhID09IDApICkKLSAgICAgICAgewotICAgICAgICAgICAgZGlmZk1WLmR5ID0gbXZWZXJEYXRhOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZGlmZk1WLmR5ID0gKChhcm1BYnMobXZWZXJEYXRhKSAtIDEpICogZmNvZGVGb3J3YXJkKQotICAgICAgICAgICAgICAgICAgICAgICAgICsgbXZWZXJSZXNpZHVhbCArIDE7Ci0gICAgICAgICAgICBpZiAobXZWZXJEYXRhIDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkaWZmTVYuZHkgPSAtZGlmZk1WLmR5OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogRmluZCB0aGUgcHJlZGljdGVkIHZlY3RvciAqLwotICAgICAgICBvbXhWQ000UDJfRmluZE1WcHJlZCAoCi0gICAgICAgICAgICBwRHN0TVZDdXJNQiwKLSAgICAgICAgICAgIHBTcmNNVkxlZnRNQiwKLSAgICAgICAgICAgIHBTcmNNVlVwcGVyTUIsCi0gICAgICAgICAgICBwU3JjTVZVcHBlclJpZ2h0TUIsCi0gICAgICAgICAgICAmcERzdE1WQ3VyTUJbaUJsa10sCi0gICAgICAgICAgICBkc3RNVlByZWRNRSwKLSAgICAgICAgICAgIGlCbGspOwotCi0gICAgICAgIC8qIEFkZGluZyB0aGUgZGlmZmVyZW5jZSB0byB0aGUgcHJlZGljdGVkIE1WIHRvIHJlY29uc3RydWN0IE1WICovCi0gICAgICAgIHBEc3RNVkN1ck1CW2lCbGtdLmR4ICs9IGRpZmZNVi5keDsKLSAgICAgICAgcERzdE1WQ3VyTUJbaUJsa10uZHkgKz0gZGlmZk1WLmR5OwotCi0gICAgICAgIC8qIENoZWNraW5nIHRoZSByYW5nZSBhbmQga2VlcGluZyBpdCB3aXRoaW4gdGhlIGxpbWl0cyAqLwotICAgICAgICBpZiAoIHBEc3RNVkN1ck1CW2lCbGtdLmR4IDwgbG93ICkKLSAgICAgICAgewotICAgICAgICAgICAgcERzdE1WQ3VyTUJbaUJsa10uZHggKz0gcmFuZ2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBEc3RNVkN1ck1CW2lCbGtdLmR4ID4gaGlnaCkKLSAgICAgICAgewotICAgICAgICAgICAgcERzdE1WQ3VyTUJbaUJsa10uZHggLT0gcmFuZ2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIHBEc3RNVkN1ck1CW2lCbGtdLmR5IDwgbG93ICkKLSAgICAgICAgewotICAgICAgICAgICAgcERzdE1WQ3VyTUJbaUJsa10uZHkgKz0gcmFuZ2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBEc3RNVkN1ck1CW2lCbGtdLmR5ID4gaGlnaCkKLSAgICAgICAgewotICAgICAgICAgICAgcERzdE1WQ3VyTUJbaUJsa10uZHkgLT0gcmFuZ2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoKE1CVHlwZSA9PSBPTVhfVkNfSU5URVIpIHx8IChNQlR5cGUgPT0gT01YX1ZDX0lOVEVSX1EpKQotICAgIHsKLSAgICAgICAgcERzdE1WQ3VyTUJbMV0gPSBwRHN0TVZDdXJNQlswXTsKLSAgICAgICAgcERzdE1WQ3VyTUJbMl0gPSBwRHN0TVZDdXJNQlswXTsKLSAgICAgICAgcERzdE1WQ3VyTUJbM10gPSBwRHN0TVZDdXJNQlswXTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotCi0vKiBFbmQgb2YgZmlsZSAqLwotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkM2NmNmUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOiAKLSAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGRlY29kaW5nCi0gKiBmb3IgaW50ZXIgYmxvY2suCi0gKgotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaCIKLSNpbmNsdWRlICJhcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oIgotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIgICAoNi4yLjUuMi4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciBvbmUgaW50ZXItY29kZWQgYmxvY2suIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIG5leHQgYXZhaWxhYmxlIGJpdCBpbiB0aGUgY3VycmVudCBzdHJlYW0gCi0gKiAgICAgICAgICAgIGJ5dGUgcmVmZXJlbmNlZCBieSAqcHBCaXRTdHJlYW0uIFRoZSBwYXJhbWV0ZXIgKnBCaXRPZmZzZXQgaXMgCi0gKiAgICAgICAgICAgIHZhbGlkIHdpdGhpbiB0aGUgcmFuZ2UgWzAtN10uIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkIHN1Y2ggCi0gKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGRlY29kaW5nIHN1Y2ggdGhhdCBpdCBwb2ludHMgCi0gKiAgICAgICAgICAgIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSBiaXQgaW4gdGhlIHN0cmVhbSBieXRlIHJlZmVyZW5jZWQgYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbSAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAotICogICAgICAgICAgICA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0Ci0gKiAgICAtICAgIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkCi0gKiAgICAtICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQotICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IsIGlmOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgbWFyayBiaXQgaXMgZXF1YWwgdG8gemVybyAKLSAqICAgIC0gICAgRW5jb3VudGVyZWQgYW4gaWxsZWdhbCBzdHJlYW0gY29kZSB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgVkxDIHRhYmxlIAotICogICAgLSAgICBFbmNvdW50ZXJlZCBhbiBpbGxlZ2FsIGNvZGUgaW4gdGhlIFZMQyBGTEMgdGFibGUgCi0gKiAgICAtICAgIFRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NCAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIoCi0gICAgIGNvbnN0IE9NWF9VOCAqKiBwcEJpdFN0cmVhbSwKLSAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCi0gICAgIE9NWF9TMTYgKiBwRHN0LAotICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSkKLXsKLSAgICBPTVhfVTggIGxhc3Qsc3RhcnQgPSAwOwotICAgIGNvbnN0IE9NWF9VOCAgKnBaaWd6YWdUYWJsZSA9IGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbjsKLSAgICBPTVhSZXN1bHQgZXJyb3JDb2RlOwotICAgIAotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLwotICAgIGFybVJldEFyZ0VycklmKHBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigqcHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCaXRPZmZzZXQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczRCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOwotCi0gICAgZXJyb3JDb2RlID0gYXJtVkNNNFAyX0dldFZMQ0JpdHMgKAotICAgICAgICAgICAgICBwcEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgcEJpdE9mZnNldCwKLQkJCSAgcERzdCwKLQkJCSAgc2hvcnRWaWRlb0hlYWRlciwKLSAgICAgICAgICAgICAgc3RhcnQsCi0JCQkgICZsYXN0LAotCQkJICAxMSwKLQkJCSAgNDIsCi0JCQkgICAyLAotCQkJICAgNSwKLSAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludGVyTDBSdW5JZHgsCi0gICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRlclZsY0wwLAotCQkJICBhcm1WQ000UDJfSW50ZXJMMVJ1bklkeCwKLSAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludGVyVmxjTDEsCi0gICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRlckwwTE1BWCwKLSAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludGVyTDFMTUFYLAotICAgICAgICAgICAgICBhcm1WQ000UDJfSW50ZXJMMFJNQVgsCi0gICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRlckwxUk1BWCwKLSAgICAgICAgICAgICAgcFppZ3phZ1RhYmxlICk7Ci0gICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7Ci0gICAgCi0gICAgaWYgKGxhc3QgPT0gMCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBPTVhfU3RzX0VycjsKLSAgICB9Ci0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qIEVuZCBvZiBmaWxlICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGRkYWYwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQy5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246IAotICogQ29udGFpbnMgbW9kdWxlcyBmb3IgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZGVjb2RpbmcKLSAqIGZvciBpbnRyYSBibG9jay4KLSAqCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAgICg2LjIuNS4yLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gb2YgQUMgYW5kIERDIGNvZWZmaWNpZW50cyAKLSAqIGZvciBvbmUgaW50cmEgYmxvY2suICBUd28gdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uIChEQ1ZMQyBhbmQgQUNWTEMpIGFyZSAKLSAqIHByb3ZpZGVkIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIHR3byBkaWZmZXJlbnQgbWV0aG9kcyBvZiBwcm9jZXNzaW5nIERDIAotICogY29lZmZpY2llbnRzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjEuNCwgIEludHJhIERDIAotICogQ29lZmZpY2llbnQgRGVjb2RpbmcgZm9yIHRoZSBDYXNlIG9mIFN3aXRjaGVkIFZMQyBFbmNvZGluZy4gIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSAKLSAqICAgICAgICAgICAgYml0c3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgY3VycmVudCBieXRlIHJlZmVyZW5jZWQgCi0gKiAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gIFRoZSBwYXJhbWV0ZXIgKnBCaXRPZmZzZXQgaXMgdmFsaWQgaW4gdGhlIAotICogICAgICAgICAgICByYW5nZSBbMC03XS4gQml0IFBvc2l0aW9uIGluIG9uZSBieXRlOiAgfE1vc3QgTGVhc3R8ICpwQml0T2Zmc2V0IAotICogICAgICAgICAgICB8MCAxIDIgMyA0IDUgNiA3fCAKLSAqICAgcHJlZERpciAtIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uOyB1c2VkIHRvIHNlbGVjdCB0aGUgemlnemFnIHNjYW4gCi0gKiAgICAgICAgICAgIHBhdHRlcm47IHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogT01YX1ZDX05PTkUgLSBBQyAKLSAqICAgICAgICAgICAgcHJlZGljdGlvbiBub3QgdXNlZDsgcGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FuLiAKLSAqICAgICAgICAgICAgT01YX1ZDX0hPUklaT05UQUwgLSBIb3Jpem9udGFsIHByZWRpY3Rpb247IHBlcmZvcm1zIAotICogICAgICAgICAgICBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW47IE9NWF9WQ19WRVJUSUNBTCAtIFZlcnRpY2FsIAotICogICAgICAgICAgICBwcmVkaWN0aW9uOyBwZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCi0gKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2Ugb3IgY2hyb21pbmFuY2UpIG9mIHRoZSAKLSAqICAgICAgICAgICAgY3VycmVudCBibG9jayAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCBzdWNoIAotICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc3VjaCB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgCi0gKiAgICAgICAgICAgIDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0LCAKLSAqICAgICAgICAgICAgICBvciBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgICAgICAgICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10sIHByZURpciBleGNlZWRzIFswLDJdLCBvciBwRHN0IGlzIAotICogICAgICAgICAgICAgIG5vdCA0LWJ5dGUgYWxpZ25lZCAKLSAqICAgIE9NWF9TdHNfRXJyIEluIERlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLCBkY19zaXplID4gMTIgQXQgbGVhc3Qgb25lIG9mIAotICogICAgICAgICAgICAgIG1hcmsgYml0cyBlcXVhbHMgemVybyBJbGxlZ2FsIHN0cmVhbSBlbmNvdW50ZXJlZDsgY29kZSBjYW5ub3QgCi0gKiAgICAgICAgICAgICAgYmUgbG9jYXRlZCBpbiBWTEMgdGFibGUgRm9yYmlkZGVuIGNvZGUgZW5jb3VudGVyZWQgaW4gdGhlIFZMQyAKLSAqICAgICAgICAgICAgICBGTEMgdGFibGUgVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0IAotICoKLSAqLwotCi0KLU9NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMoCi0gICAgIGNvbnN0IE9NWF9VOCAqKiBwcEJpdFN0cmVhbSwKLSAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCi0gICAgIE9NWF9TMTYgKiBwRHN0LAotICAgICBPTVhfVTggcHJlZERpciwKLSAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pCi17Ci0gICAgT01YX1U4IHN0YXJ0ID0gMDsKLQotICAgIHJldHVybiBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhKAotICAgICBwcEJpdFN0cmVhbSwKLSAgICAgcEJpdE9mZnNldCwKLSAgICAgcERzdCwKLSAgICAgcHJlZERpciwKLSAgICAgc2hvcnRWaWRlb0hlYWRlciwKLSAgICAgc3RhcnQpOwotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM3NmVkMS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOiAKLSAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGRlY29kaW5nCi0gKiBmb3IgaW50cmEgYmxvY2suCi0gKgotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaCIKLSNpbmNsdWRlICJhcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oIgotCi0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICAgKDYuMi41LjIuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBvZiBBQyBhbmQgREMgY29lZmZpY2llbnRzIAotICogZm9yIG9uZSBpbnRyYSBibG9jay4gIFR3byB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24gKERDVkxDIGFuZCBBQ1ZMQykgYXJlIAotICogcHJvdmlkZWQgaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgdHdvIGRpZmZlcmVudCBtZXRob2RzIG9mIHByb2Nlc3NpbmcgREMgCi0gKiBjb2VmZmljaWVudHMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMS40LCAgSW50cmEgREMgCi0gKiBDb2VmZmljaWVudCBEZWNvZGluZyBmb3IgdGhlIENhc2Ugb2YgU3dpdGNoZWQgVkxDIEVuY29kaW5nLiAgCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIAotICogICAgICAgICAgICBiaXRzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBjdXJyZW50IGJ5dGUgcmVmZXJlbmNlZCAKLSAqICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiAgVGhlIHBhcmFtZXRlciAqcEJpdE9mZnNldCBpcyB2YWxpZCBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJhbmdlIFswLTddLiAKLSAqICAgICAgICAgICAgQml0IFBvc2l0aW9uIGluIG9uZSBieXRlOiAgfE1vc3QgICAgICBMZWFzdHwgCi0gKiAgICAgICAgICAgICAgICAgICAgKnBCaXRPZmZzZXQgICAgICAgIHwwIDEgMiAzIDQgNSA2IDd8IAotICogICBwcmVkRGlyIC0gQUMgcHJlZGljdGlvbiBkaXJlY3Rpb247IHVzZWQgdG8gc2VsZWN0IHRoZSB6aWd6YWcgc2NhbiAKLSAqICAgICAgICAgICAgcGF0dGVybjsgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX05PTkUgLSBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkOyAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW4uIAotICogICAgICAgICAgICAtICBPTVhfVkNfSE9SSVpPTlRBTCAtIEhvcml6b250YWwgcHJlZGljdGlvbjsgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsIHppZ3phZyBzY2FuOyAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX1ZFUlRJQ0FMIC0gVmVydGljYWwgcHJlZGljdGlvbjsgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwgemlnemFnIHNjYW4uIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAotICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlIG9yIGNocm9taW5hbmNlKSBvZiB0aGUgCi0gKiAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQgc3VjaCAKLSAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHN1Y2ggdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAotICogICAgICAgICAgICA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIGlmOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdAotICogICAgLSAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddCi0gKiAgICAtICAgIHByZURpciBleGNlZWRzIFswLDJdCi0gKiAgICAtICAgIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkIAotICogICAgT01YX1N0c19FcnIgLSBpZjoKLSAqICAgIC0gICAgSW4gRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMsIGRjX3NpemUgPiAxMiAKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIG1hcmsgYml0cyBlcXVhbHMgemVybyAKLSAqICAgIC0gICAgSWxsZWdhbCBzdHJlYW0gZW5jb3VudGVyZWQ7IGNvZGUgY2Fubm90IGJlIGxvY2F0ZWQgaW4gVkxDIHRhYmxlIAotICogICAgLSAgICBGb3JiaWRkZW4gY29kZSBlbmNvdW50ZXJlZCBpbiB0aGUgVkxDIEZMQyB0YWJsZS4gCi0gKiAgICAtICAgIFRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NCAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQygKLSAgICAgY29uc3QgT01YX1U4ICoqIHBwQml0U3RyZWFtLAotICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKLSAgICAgT01YX1MxNiAqIHBEc3QsCi0gICAgIE9NWF9VOCBwcmVkRGlyLAotICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCi0gICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcAotKQotewotICAgIC8qIER1bW15IGluaXRpbGFpemF0aW9uIHRvIHJlbW92ZSBjb21waWxhdGlvbiBlcnJvciAqLwotICAgIE9NWF9TOCAgRENWYWx1ZVNpemUgPSAwOwotICAgIE9NWF9VMTYgcG93T2ZTaXplLCBmZXRjaERDYml0czsKLSAgICBPTVhfVTggc3RhcnQgPSAxOwotCi0gICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCi0gICAgYXJtUmV0QXJnRXJySWYocHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCpwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJpdE9mZnNldCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIWFybUlzNEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKCpwQml0T2Zmc2V0IDwgMCkgfHwgKCpwQml0T2Zmc2V0ID4gNyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigocHJlZERpciA+IDIpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLSAgICAvKiBJbnNlcnQgdGhlIGNvZGUgaW50byB0aGUgYml0c3RyZWFtICovCi0gICAgaWYgKHZpZGVvQ29tcCA9PSBPTVhfVkNfTFVNSU5BTkNFKQotICAgIHsKLSAgICAgICAgRENWYWx1ZVNpemUgPSBhcm1VblBhY2tWTEMzMihwcEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQml0T2Zmc2V0LCBhcm1WQ000UDJfYUludHJhRENMdW1hSW5kZXgpOwotICAgIH0KLSAgICBlbHNlIGlmICh2aWRlb0NvbXAgPT0gT01YX1ZDX0NIUk9NSU5BTkNFKQotICAgIHsKLSAgICAgICAgRENWYWx1ZVNpemUgPSBhcm1VblBhY2tWTEMzMihwcEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQml0T2Zmc2V0LCBhcm1WQ000UDJfYUludHJhRENDaHJvbWFJbmRleCk7Ci0gICAgfQotICAgIGFybVJldERhdGFFcnJJZihEQ1ZhbHVlU2l6ZSA9PSAtMSwgT01YX1N0c19FcnIpOwotICAgIGFybVJldERhdGFFcnJJZihEQ1ZhbHVlU2l6ZSA+IDEyLCBPTVhfU3RzX0Vycik7Ci0KLQotICAgIGlmIChEQ1ZhbHVlU2l6ZSA9PSAwKQotICAgIHsKLSAgICAgICAgcERzdFswXSA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGZldGNoRENiaXRzID0gKE9NWF9VMTYpIGFybUdldEJpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQ1ZhbHVlU2l6ZSk7Ci0KLSAgICAgICAgaWYgKCAoZmV0Y2hEQ2JpdHMgPj4gKERDVmFsdWVTaXplIC0gMSkpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIGNhbHVsYXRlIHBvdyAqLwotICAgICAgICAgICAgcG93T2ZTaXplID0gKDEgPDwgRENWYWx1ZVNpemUpOwotCi0gICAgICAgICAgICBwRHN0WzBdID0gIChPTVhfUzE2KSAoZmV0Y2hEQ2JpdHMgXiAocG93T2ZTaXplIC0gMSkpOwotICAgICAgICAgICAgcERzdFswXSA9IC1wRHN0WzBdOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcERzdFswXSA9IGZldGNoRENiaXRzOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKERDVmFsdWVTaXplID4gOCkKLSAgICAgICAgewotICAgICAgICAgICAgLyogcmVhZGluZyBhbmQgY2hlY2tpbmcgdGhlIG1hcmtlciBiaXQqLwotICAgICAgICAgICAgYXJtUmV0RGF0YUVycklmIChhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAxKSA9PSAwLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfRXJyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhKAotICAgICAgICAgICAgICAgIHBwQml0U3RyZWFtLAotICAgICAgICAgICAgICAgIHBCaXRPZmZzZXQsCi0gICAgICAgICAgICAgICAgcERzdCwKLSAgICAgICAgICAgICAgICBwcmVkRGlyLAotICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIsCi0gICAgICAgICAgICAgICAgc3RhcnQpOwotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVNVi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlTVYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA0YTIzNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVNVi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRW5jb2RlTVYuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOiAKLSAqIENvbnRhaW5zIG1vZHVsZSBmb3IgcHJlZGljdGluZyBNViBvZiBNQgotICoKLSAqLyAKLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgotI2luY2x1ZGUgImFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaCIKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRW5jb2RlTVYgICAoNi4yLjQuNS40KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUHJlZGljdHMgYSBtb3Rpb24gdmVjdG9yIGZvciB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLCBlbmNvZGVzIHRoZSAKLSAqIGRpZmZlcmVuY2UsIGFuZCB3cml0ZXMgdGhlIG91dHB1dCB0byB0aGUgc3RyZWFtIGJ1ZmZlci4gVGhlIGlucHV0IE1WcyAKLSAqIHBNVkN1ck1CLCBwU3JjTVZMZWZ0TUIsIHBTcmNNVlVwcGVyTUIsIGFuZCBwU3JjTVZVcHBlclJpZ2h0TUIgc2hvdWxkIGxpZSAKLSAqIHdpdGhpbiB0aGUgcmFuZ2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5wdXQgcGFyYW1ldGVyIGZjb2RlRm9yd2FyZCwgYXMgCi0gKiBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjMuICBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgCi0gKiBzdXBlcnNldCBvZiB0aGUgZnVuY3Rpb25hbGl0eSBhc3NvY2lhdGVkIHdpdGggdGhlIGZ1bmN0aW9uIAotICogb214VkNNNFAyX0ZpbmRNVnByZWQuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0c3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtIGluZGV4IG9mIHRoZSBmaXJzdCBmcmVlIChuZXh0IGF2YWlsYWJsZSkgYml0IGluIHRoZSBzdHJlYW0gCi0gKiAgICAgICAgICAgIGJ1ZmZlciByZWZlcmVuY2VkIGJ5ICpwcEJpdFN0cmVhbSwgdmFsaWQgaW4gdGhlIHJhbmdlIDAgdG8gNy4gCi0gKiAgIHBNVkN1ck1CIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIG1vdGlvbiB2ZWN0b3I7IGEgdmFsdWUgb2YgCi0gKiAgICAgICAgICAgIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKLSAqICAgcFNyY01WTGVmdE1CIC0gcG9pbnRlciB0byB0aGUgc291cmNlIGxlZnQgbWFjcm9ibG9jayBtb3Rpb24gdmVjdG9yOyBhIAotICogICAgICAgICAgICB2YWx1ZSBvZiAgTlVMTGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCi0gKiAgIHBTcmNNVlVwcGVyTUIgLSBwb2ludGVyIHRvIHNvdXJjZSB1cHBlciBtYWNyb2Jsb2NrIG1vdGlvbiB2ZWN0b3I7IGEgCi0gKiAgICAgICAgICAgIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKLSAqICAgcFNyY01WVXBwZXJSaWdodE1CIC0gcG9pbnRlciB0byBzb3VyY2UgdXBwZXIgcmlnaHQgTUIgbW90aW9uIHZlY3RvcjsgYSAKLSAqICAgICAgICAgICAgdmFsdWUgb2YgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAotICogICBmY29kZUZvcndhcmQgLSBhbiBpbnRlZ2VyIHdpdGggdmFsdWVzIGZyb20gMSB0byA3OyB1c2VkIGluIGVuY29kaW5nIAotICogICAgICAgICAgICBtb3Rpb24gdmVjdG9ycyByZWxhdGVkIHRvIHNlYXJjaCByYW5nZSwgYXMgZGVzY3JpYmVkIGluIAotICogICAgICAgICAgICBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuMy4gCi0gKiAgIE1CVHlwZSAtIG1hY3JvIGJsb2NrIHR5cGUsIHZhbGlkIGluIHRoZSByYW5nZSAwIHRvIDUgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gdXBkYXRlZCBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gCi0gKiAgICAgICAgICAgIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtIHVwZGF0ZWQgaW5kZXggb2YgdGhlIG5leHQgYXZhaWxhYmxlIGJpdCBwb3NpdGlvbiBpbiBzdHJlYW0gCi0gKiAgICAgICAgICAgIGJ1ZmZlciByZWZlcmVuY2VkIGJ5ICpwcEJpdFN0cmVhbSAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyAKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sIAotICogICAgICAgICAgICAgICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcE1WQ3VyTUIgCi0gKiAgICAtICAgICpwQml0T2Zmc2V0IDwgMCwgb3IgKnBCaXRPZmZzZXQgPjcuIAotICogICAgLSAgICBmY29kZUZvcndhcmQgPD0gMCwgb3IgZmNvZGVGb3J3YXJkID4gNywgb3IgTUJUeXBlIDwgMC4gCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlTVYoCi0gICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqIHBNVkN1ck1CLAotICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqIHBTcmNNVkxlZnRNQiwKLSAgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKiBwU3JjTVZVcHBlck1CLAotICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqIHBTcmNNVlVwcGVyUmlnaHRNQiwKLSAgICAgT01YX0lOVCBmY29kZUZvcndhcmQsCi0gICAgIE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlIE1CVHlwZQotKQotewotICAgIE9NWFZDTW90aW9uVmVjdG9yIGRzdE1WUHJlZCwgZGlmZk1WOwotICAgIE9NWFZDTW90aW9uVmVjdG9yIGRzdE1WUHJlZE1FWzEyXTsKLSAgICAvKiBJbml0aWFsaXplZCB0byByZW1vdmUgY29tcGlsYXRpb24gd2FybmluZyAqLwotICAgIE9NWF9JTlQgaUJsaywgaSwgY291bnQgPSAxOwotICAgIE9NWF9TMzIgbXZIb3JSZXNpZHVhbCwgbXZWZXJSZXNpZHVhbCwgbXZIb3JEYXRhLCBtdlZlckRhdGE7Ci0gICAgT01YX1U4IHNjYWxlRmFjdG9yLCBpbmRleDsKLQotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLwotICAgIGFybVJldEFyZ0VycklmKHBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigqcHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCaXRPZmZzZXQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBNVkN1ck1CID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoKCpwQml0T2Zmc2V0IDwgMCkgfHwgKCpwQml0T2Zmc2V0ID4gNykpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKChmY29kZUZvcndhcmQgPCAxKSB8fCAoZmNvZGVGb3J3YXJkID4gNykpLCBcCi0gICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAKLSAgICBpZiAoKE1CVHlwZSA9PSBPTVhfVkNfSU5UUkEpIHx8Ci0gICAgICAgIChNQlR5cGUgPT0gT01YX1ZDX0lOVFJBX1EpCi0gICAgICAgKQotICAgIHsKLSAgICAgICAgLyogTm8gY2FuZGlkYXRlIHZlY3RvcnMgaGVuY2UgbWFrZSB0aGVtIHplcm8gKi8KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRzdE1WUHJlZE1FW2ldLmR4ID0gMDsKLSAgICAgICAgICAgIGRzdE1WUHJlZE1FW2ldLmR5ID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotICAgIH0KLQotICAgIGlmICgoTUJUeXBlID09IE9NWF9WQ19JTlRFUjRWKSB8fCAoTUJUeXBlID09IE9NWF9WQ19JTlRFUjRWX1EpKQotICAgIHsKLSAgICAgICAgY291bnQgPSA0OwotICAgIH0KLSAgICBlbHNlIGlmICgoTUJUeXBlID09IE9NWF9WQ19JTlRFUikgfHwgKE1CVHlwZSA9PSBPTVhfVkNfSU5URVJfUSkpCi0gICAgewotICAgICAgICBjb3VudCA9IDE7Ci0gICAgfQotCi0gICAgLyogQ2FsY3VsYXRpbmcgdGhlIHNjYWxlIGZhY3RvciAqLwotICAgIHNjYWxlRmFjdG9yID0gMSA8PCAoZmNvZGVGb3J3YXJkIC0xKTsKLQotICAgIGZvciAoaUJsayA9IDA7IGlCbGsgPCBjb3VudDsgaUJsaysrKQotICAgIHsKLQotICAgICAgICAvKiBGaW5kIHRoZSBwcmVkaWN0ZWQgdmVjdG9yICovCi0gICAgICAgIG9teFZDTTRQMl9GaW5kTVZwcmVkICgKLSAgICAgICAgICAgIHBNVkN1ck1CLAotICAgICAgICAgICAgcFNyY01WTGVmdE1CLAotICAgICAgICAgICAgcFNyY01WVXBwZXJNQiwKLSAgICAgICAgICAgIHBTcmNNVlVwcGVyUmlnaHRNQiwKLSAgICAgICAgICAgICZkc3RNVlByZWQsCi0gICAgICAgICAgICBkc3RNVlByZWRNRSwKLSAgICAgICAgICAgIGlCbGsgKTsKLQotICAgICAgICAvKiBDYWxjdWxhdGluZyB0aGUgZGlmZmVyZW50aWFsIG1vdGlvbiB2ZWN0b3IgKGRpZmZNVikgKi8KLSAgICAgICAgZGlmZk1WLmR4ID0gcE1WQ3VyTUJbaUJsa10uZHggLSBkc3RNVlByZWQuZHg7Ci0gICAgICAgIGRpZmZNVi5keSA9IHBNVkN1ck1CW2lCbGtdLmR5IC0gZHN0TVZQcmVkLmR5OwotCi0gICAgICAgIC8qIENhbGN1bGF0aW5nIHRoZSBtdl9kYXRhIGFuZCBtdl9yZXNpZHVhbCBmb3IgSG9yaXphbnRhbCBNViAqLwotICAgICAgICBpZiAoZGlmZk1WLmR4ID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG12SG9yUmVzaWR1YWwgPSAwOwotICAgICAgICAgICAgbXZIb3JEYXRhID0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIG12SG9yUmVzaWR1YWwgPSAoIGFybUFicyhkaWZmTVYuZHgpIC0gMSkgJSBzY2FsZUZhY3RvcjsKLSAgICAgICAgICAgIG12SG9yRGF0YSA9IChhcm1BYnMoZGlmZk1WLmR4KSAtIG12SG9yUmVzaWR1YWwgKyAoc2NhbGVGYWN0b3IgLSAxKSkKLSAgICAgICAgICAgICAgICAgICAgIC8gc2NhbGVGYWN0b3I7Ci0gICAgICAgICAgICBpZiAoZGlmZk1WLmR4IDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtdkhvckRhdGEgPSAtbXZIb3JEYXRhOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ2FsY3VsYXRpbmcgdGhlIG12X2RhdGEgYW5kIG12X3Jlc2lkdWFsIGZvciBWZXJ0aWNhbCBNViAqLwotICAgICAgICBpZiAoZGlmZk1WLmR5ID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG12VmVyUmVzaWR1YWwgPSAwOwotICAgICAgICAgICAgbXZWZXJEYXRhID0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIG12VmVyUmVzaWR1YWwgPSAoIGFybUFicyhkaWZmTVYuZHkpIC0gMSkgJSBzY2FsZUZhY3RvcjsKLSAgICAgICAgICAgIG12VmVyRGF0YSA9IChhcm1BYnMoZGlmZk1WLmR5KSAtIG12VmVyUmVzaWR1YWwgKyAoc2NhbGVGYWN0b3IgLSAxKSkKLSAgICAgICAgICAgICAgICAgICAgIC8gc2NhbGVGYWN0b3I7Ci0gICAgICAgICAgICBpZiAoZGlmZk1WLmR5IDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtdlZlckRhdGEgPSAtbXZWZXJEYXRhOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogSHVmZm1hbiBlbmNvZGluZyAqLwotCi0gICAgICAgIC8qIFRoZSBpbmRleCBpcyBhY3R1YWxseSBjYWxjdWxhdGUgYXMKLSAgICAgICAgICAgaW5kZXggPSAoKGZsb2F0KSAobXZIb3JEYXRhLzIpICsgMTYpICogMiwKLSAgICAgICAgICAgbWVhbmluZyB0aGUgTVYgZGF0YSBpcyBoYWxmZWQgYW5kIHRoZW4gbm9ybWFsaXplZAotICAgICAgICAgICB0byBiZWdpbiB3aXRoIHplcm8gYW5kIHRoZW4gZG91YmxlZCB0byB0YWtlIGNhcmUgb2YgaW5kZXhpbmcKLSAgICAgICAgICAgdGhlIGZyYWN0aW9uYWwgcGFydCBpbmNsdWRlZCAqLwotICAgICAgICBpbmRleCA9IG12SG9yRGF0YSArIDMyOwotICAgICAgICBhcm1QYWNrVkxDMzIgKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBhcm1WQ000UDJfYVZsY01WRFtpbmRleF0pOwotICAgICAgICBpZiAoKGZjb2RlRm9yd2FyZCA+IDEpICYmIChkaWZmTVYuZHggIT0gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFybVBhY2tCaXRzIChwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgbXZIb3JSZXNpZHVhbCwgKGZjb2RlRm9yd2FyZCAtMSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogVGhlIGluZGV4IGlzIGFjdHVhbGx5IGNhbGN1bGF0ZSBhcwotICAgICAgICAgICBpbmRleCA9ICgoZmxvYXQpIChtdlZlckRhdGEvMikgKyAxNikgKiAyLAotICAgICAgICAgICBtZWFuaW5nIHRoZSBNViBkYXRhIGlzIGhhbGZlZCBhbmQgdGhlbiBub3JtYWxpemVkCi0gICAgICAgICAgIHRvIGJlZ2luIHdpdGggemVybyBhbmQgdGhlbiBkb3VibGVkIHRvIHRha2UgY2FyZSBvZiBpbmRleGluZwotICAgICAgICAgICB0aGUgZnJhY3Rpb25hbCBwYXJ0IGluY2x1ZGVkICovCi0gICAgICAgIGluZGV4ID0gbXZWZXJEYXRhICsgMzI7Ci0gICAgICAgIGFybVBhY2tWTEMzMiAocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIGFybVZDTTRQMl9hVmxjTVZEW2luZGV4XSk7Ci0gICAgICAgIGlmICgoZmNvZGVGb3J3YXJkID4gMSkgJiYgKGRpZmZNVi5keSAhPSAwKSkKLSAgICAgICAgewotICAgICAgICAgICAgYXJtUGFja0JpdHMgKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBtdlZlclJlc2lkdWFsLCAoZmNvZGVGb3J3YXJkIC0xKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotCi0vKiBFbmQgb2YgZmlsZSAqLwotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNThmODguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOiAKLSAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGVuY29kaW5nCi0gKiBmb3IgaW50ZXIgYmxvY2suCi0gKgotICovIAotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oIgotI2luY2x1ZGUgImFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgiCi0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlciAgICg2LjIuNC41LjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZW5jb2RpbmcgZm9yIG9uZSBpbnRlciBibG9jay4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCAKLSAqICAgICAgICAgICAgc3RyZWFtIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNyAKLSAqICAgcFFEY3RCbGtDb2VmIC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudCAKLSAqICAgcGF0dGVybiAtIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0aGlzIGJsb2NrIGlzIAotICogICAgICAgICAgICBlbmNvZGVkIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkIHNvIHRoYXQgCi0gKiAgICAgICAgICAgIGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKLSAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzIAotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIHBvaW50ZXJzOiBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCAKLSAqICAgICAgICAgICAgICBwQml0T2Zmc2V0LCBwUURjdEJsa0NvZWYgCi0gKiAgICAtICAgKnBCaXRPZmZzZXQgPCAwLCBvciAqcEJpdE9mZnNldCA+Ny4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlcigKLSAgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAotICAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCi0gICAgIE9NWF9VOCBwYXR0ZXJuLAotCSBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSkKLXsKLSAgICBPTVhfVTggc3RhcnQgPSAwOwotICAgIGNvbnN0IE9NWF9VOCAgKnBaaWd6YWdUYWJsZSA9IGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbjsKLQotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLwotICAgIGFybVJldEFyZ0VycklmKHBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigqcHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCaXRPZmZzZXQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBRRGN0QmxrQ29lZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKCpwQml0T2Zmc2V0IDwgMCkgfHwgKCpwQml0T2Zmc2V0ID43KSwgT01YX1N0c19CYWRBcmdFcnIpOwotCi0gICAgaWYgKHBhdHRlcm4pCi0gICAgewotICAgICAgICBhcm1WQ000UDJfUHV0VkxDQml0cyAoCi0gICAgICAgICAgICAgIHBwQml0U3RyZWFtLAotICAgICAgICAgICAgICBwQml0T2Zmc2V0LAotICAgICAgICAgICAgICBwUURjdEJsa0NvZWYsCi0gICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIsCi0gICAgICAgICAgICAgIHN0YXJ0LAotICAgICAgICAgICAgICAyNiwKLSAgICAgICAgICAgICAgNDAsCi0gICAgICAgICAgICAgIDEwLAotICAgICAgICAgICAgICAxLAotICAgICAgICAgICAgICBhcm1WQ000UDJfSW50ZXJMMFJ1bklkeCwKLSAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludGVyVmxjTDAsCi0JCQkgIGFybVZDTTRQMl9JbnRlckwxUnVuSWR4LAotICAgICAgICAgICAgICBhcm1WQ000UDJfSW50ZXJWbGNMMSwKLSAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludGVyTDBMTUFYLAotICAgICAgICAgICAgICBhcm1WQ000UDJfSW50ZXJMMUxNQVgsCi0gICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRlckwwUk1BWCwKLSAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludGVyTDFSTUFYLAotICAgICAgICAgICAgICBwWmlnemFnVGFibGUKLSAgICAgICAgKTsKLSAgICB9IC8qIFBhdHRlcm4gY2hlY2sgZW5kcyovCi0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLQotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzYjZkOTcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMuYworKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjogCi0gKiBDb250YWlucyBtb2R1bGVzIGZvciB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBlbmNvZGluZwotICogZm9yIGludHJhIGJsb2NrLgotICoKLSAqLyAKLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgICAoNi4yLjQuNS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgemlnemFnIHNjYW4gYW5kIFZMQyBlbmNvZGluZyBvZiBBQyBhbmQgREMgY29lZmZpY2llbnRzIGZvciBvbmUgCi0gKiBpbnRyYSBibG9jay4gIFR3byB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24gKERDVkxDIGFuZCBBQ1ZMQykgYXJlIHByb3ZpZGVkIAotICogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgdHdvIGRpZmZlcmVudCBtZXRob2RzIG9mIHByb2Nlc3NpbmcgREMgCi0gKiBjb2VmZmljaWVudHMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMS40LCAgSW50cmEgREMgCi0gKiBDb2VmZmljaWVudCBEZWNvZGluZyBmb3IgdGhlIENhc2Ugb2YgU3dpdGNoZWQgVkxDIEVuY29kaW5nLiAgCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBkb3VibGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXRzdHJlYW0gCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3LiAKLSAqICAgcFFEY3RCbGtDb2VmIC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudCAKLSAqICAgcHJlZERpciAtIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uLCB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB0aGUgemlnemFnIAotICogICAgICAgICAgICBzY2FuIHBhdHRlcm47IHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19OT05FIC0gQUMgcHJlZGljdGlvbiBub3QgdXNlZC4gIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uLiAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsIHppZ3phZyBzY2FuLiAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX1ZFUlRJQ0FMIC0gVmVydGljYWwgcHJlZGljdGlvbi4gIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsIHppZ3phZyBzY2FuLiAKLSAqICAgcGF0dGVybiAtIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0aGlzIGJsb2NrIGlzIAotICogICAgICAgICAgICBlbmNvZGVkIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLCBzbyAKLSAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIuIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCi0gKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sIAotICogICAgICAgICAgICAgICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcFFEY3RCbGtDb2VmLiAKLSAqICAgIC0gICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKLSAqICAgIC0gICAgUHJlZERpciBpcyBub3Qgb25lIG9mOiBPTVhfVkNfTk9ORSwgT01YX1ZDX0hPUklaT05UQUwsIG9yIAotICogICAgICAgICBPTVhfVkNfVkVSVElDQUwuIAotICogICAgLSAgICBWaWRlb0NvbXAgaXMgbm90IG9uZSBjb21wb25lbnQgb2YgZW51bSBPTVhWQ000UDJWaWRlb0NvbXBvbmVudC4gCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMoCi0gICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCi0gICAgIE9NWF9VOCBwcmVkRGlyLAotICAgICBPTVhfVTggcGF0dGVybiwKLSAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pCi17Ci0gICAgT01YX1U4IHN0YXJ0ID0gMDsKLQotICAgIHJldHVybiBhcm1WQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhKAotICAgICBwcEJpdFN0cmVhbSwKLSAgICAgcEJpdE9mZnNldCwKLSAgICAgcFFEY3RCbGtDb2VmLAotICAgICBwcmVkRGlyLAotICAgICBwYXR0ZXJuLAotICAgICBzaG9ydFZpZGVvSGVhZGVyLAotICAgICBzdGFydCk7Ci19Ci0KLS8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JkZGExOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOiAKLSAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGVuY29kaW5nCi0gKiBmb3IgaW50cmEgYmxvY2suCi0gKgotICovIAotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oIgotI2luY2x1ZGUgImFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgiCi0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICAgKDYuMi40LjUuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHppZ3phZyBzY2FuIGFuZCBWTEMgZW5jb2Rpbmcgb2YgQUMgYW5kIERDIGNvZWZmaWNpZW50cyBmb3Igb25lIAotICogaW50cmEgYmxvY2suICBUd28gdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uIChEQ1ZMQyBhbmQgQUNWTEMpIGFyZSBwcm92aWRlZCAKLSAqIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIHR3byBkaWZmZXJlbnQgbWV0aG9kcyBvZiBwcm9jZXNzaW5nIERDIAotICogY29lZmZpY2llbnRzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjEuNCwgIkludHJhIERDIAotICogQ29lZmZpY2llbnQgRGVjb2RpbmcgZm9yIHRoZSBDYXNlIG9mIFN3aXRjaGVkIFZMQyBFbmNvZGluZyIuICAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIGRvdWJsZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdHN0cmVhbSAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcuIAotICogICBwUURjdEJsa0NvZWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50IAotICogICBwcmVkRGlyIC0gQUMgcHJlZGljdGlvbiBkaXJlY3Rpb24sIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHRoZSB6aWd6YWcgCi0gKiAgICAgICAgICAgIHNjYW4gcGF0dGVybjsgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX05PTkUgLSBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkLiAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FuLiAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX0hPUklaT05UQUwgLSBIb3Jpem9udGFsIHByZWRpY3Rpb24uICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW4uIAotICogICAgICAgICAgICAtICBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCBwcmVkaWN0aW9uLiAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwgemlnemFnIHNjYW4uIAotICogICBwYXR0ZXJuIC0gYmxvY2sgcGF0dGVybiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRoaXMgYmxvY2sgaXMgCi0gKiAgICAgICAgICAgIGVuY29kZWQgCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCi0gKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2UsIGNocm9taW5hbmNlKSBvZiB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgYmxvY2sgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsIHNvIAotICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKLSAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgCi0gKiAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwUURjdEJsa0NvZWYuIAotICogICAgLSAgICpwQml0T2Zmc2V0IDwgMCwgb3IgKnBCaXRPZmZzZXQgPjcuIAotICogICAgLSAgICBQcmVkRGlyIGlzIG5vdCBvbmUgb2Y6IE9NWF9WQ19OT05FLCBPTVhfVkNfSE9SSVpPTlRBTCwgb3IgCi0gKiAgICAgICAgIE9NWF9WQ19WRVJUSUNBTC4gCi0gKiAgICAtICAgIFZpZGVvQ29tcCBpcyBub3Qgb25lIGNvbXBvbmVudCBvZiBlbnVtIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50LiAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQygKLSAgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKLSAgICAgT01YX1U4IHByZWREaXIsCi0gICAgIE9NWF9VOCBwYXR0ZXJuLAotICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCi0gICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcAotKQotewotICAgIE9NWF9TMTYgZGNWYWx1ZSwgcG93T2ZTaXplOwotICAgIE9NWF9VOCAgRENWYWx1ZVNpemUsIHN0YXJ0ID0gMTsKLSAgICBPTVhfVTE2IGFic0RDVmFsdWU7Ci0KLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKnBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQml0T2Zmc2V0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwUURjdEJsa0NvZWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCgqcEJpdE9mZnNldCA8IDApIHx8ICgqcEJpdE9mZnNldCA+NyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQlhcm1SZXRBcmdFcnJJZigodmlkZW9Db21wICE9IE9NWF9WQ19MVU1JTkFOQ0UpICYmICh2aWRlb0NvbXAgIT0gT01YX1ZDX0NIUk9NSU5BTkNFKSwgT01YX1N0c19CYWRBcmdFcnIpOwotCWFybVJldEFyZ0VycklmKChwcmVkRGlyICE9IE9NWF9WQ19OT05FKSAmJiAocHJlZERpciAhPSBPTVhfVkNfSE9SSVpPTlRBTCkgJiYgKHByZWREaXIgIT0gT01YX1ZDX1ZFUlRJQ0FMKSAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAKLSAgICBpZiAocGF0dGVybikKLSAgICB7Ci0gICAgICAgIGRjVmFsdWUgPSBwUURjdEJsa0NvZWZbMF07Ci0gICAgICAgIGFic0RDVmFsdWUgPSBhcm1BYnMoZGNWYWx1ZSk7Ci0KLSAgICAgICAgLyogRmluZCB0aGUgc2l6ZSAqLwotICAgICAgICBEQ1ZhbHVlU2l6ZSA9IGFybUxvZ1NpemUgKGFic0RDVmFsdWUpOwotICAgICAgICBhYnNEQ1ZhbHVlID0gYXJtQWJzKGRjVmFsdWUpOwotCi0gICAgICAgIC8qIEluc2VydCB0aGUgY29kZSBpbnRvIHRoZSBiaXRzdHJlYW0gKi8KLSAgICAgICAgaWYgKHZpZGVvQ29tcCA9PSBPTVhfVkNfTFVNSU5BTkNFKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIGFybVBhY2tWTEMzMiAocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9hSW50cmFEQ0x1bWFJbmRleFtEQ1ZhbHVlU2l6ZV0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHZpZGVvQ29tcCA9PSBPTVhfVkNfQ0hST01JTkFOQ0UpCi0gICAgICAgIHsKLQotICAgICAgICAgICAgYXJtUGFja1ZMQzMyIChwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX2FJbnRyYURDQ2hyb21hSW5kZXhbRENWYWx1ZVNpemVdKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEFkZGl0aW9uYWwgY29kZSBnZW5lcmF0aW9uIGluIGNhc2Ugb2YgbmVnYXRpdmUKLSAgICAgICAgICAgZGMgdmFsdWUgdGhlIGFkZGl0aW9uYWwgKi8KLSAgICAgICAgaWYgKERDVmFsdWVTaXplID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGRjVmFsdWUgPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIGNhbHVsYXRlIDIgcG93ICovCi0gICAgICAgICAgICAgICAgcG93T2ZTaXplID0gKDEgPDwgRENWYWx1ZVNpemUpOwotCi0gICAgICAgICAgICAgICAgYWJzRENWYWx1ZSA9ICBhYnNEQ1ZhbHVlIF4gKHBvd09mU2l6ZSAtIDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIChPTVhfVTMyKWFic0RDVmFsdWUsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIERDVmFsdWVTaXplKTsKLQotICAgICAgICAgICAgaWYgKERDVmFsdWVTaXplID4gOCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMSwgMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gYXJtVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYSgKLSAgICAgICAgICAgICAgICBwcEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgICBwQml0T2Zmc2V0LAotICAgICAgICAgICAgICAgIHBRRGN0QmxrQ29lZiwKLSAgICAgICAgICAgICAgICBwcmVkRGlyLAotICAgICAgICAgICAgICAgIHBhdHRlcm4sCi0gICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlciwKLSAgICAgICAgICAgICAgICBzdGFydCk7Ci19Ci0KLS8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9GaW5kTVZwcmVkLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9GaW5kTVZwcmVkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NGI0ODYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRmluZE1WcHJlZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRmluZE1WcHJlZC5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246IAotICogQ29udGFpbnMgbW9kdWxlIGZvciBwcmVkaWN0aW5nIE1WIG9mIE1CCi0gKgotICovCi0gIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9GaW5kTVZwcmVkICAgKDYuMi4zLjEuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFByZWRpY3RzIGEgbW90aW9uIHZlY3RvciBmb3IgdGhlIGN1cnJlbnQgYmxvY2sgdXNpbmcgdGhlIHByb2NlZHVyZSAKLSAqIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuNS4gIFRoZSByZXN1bHRpbmcgcHJlZGljdGVkIE1WIGlzIAotICogcmV0dXJuZWQgaW4gcERzdE1WUHJlZC4gSWYgdGhlIHBhcmFtZXRlciBwRHN0TVZQcmVkTUUgaWYgaXMgbm90IE5VTEwgdGhlbiAKLSAqIHRoZSBzZXQgb2YgdGhyZWUgTVYgY2FuZGlkYXRlcyB1c2VkIGZvciBwcmVkaWN0aW9uIGlzIGFsc28gcmV0dXJuZWQsIAotICogb3RoZXJ3aXNlIHBEc3RNVlByZWRNRWlzIE5VTEwgdXBvbiByZXR1cm4uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNNVkN1ck1CIC0gcG9pbnRlciB0byB0aGUgTVYgYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBZIAotICogICAgICAgICAgICBtYWNyb2Jsb2NrOyBhIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKLSAqICAgcFNyY0NhbmRNVjEgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgY29udGFpbmluZyB0aGUgNCBNVnMgYXNzb2NpYXRlZCAKLSAqICAgICAgICAgICAgd2l0aCB0aGUgTUIgbG9jYXRlZCB0byB0aGUgbGVmdCBvZiB0aGUgY3VycmVudCBNQjsgc2V0IHRvIE5VTEwgCi0gKiAgICAgICAgICAgIGlmIHRoZXJlIGlzIG5vIE1CIHRvIHRoZSBsZWZ0LiAKLSAqICAgcFNyY0NhbmRNVjIgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgY29udGFpbmluZyB0aGUgNCBNVnMgYXNzb2NpYXRlZCAKLSAqICAgICAgICAgICAgd2l0aCB0aGUgTUIgbG9jYXRlZCBhYm92ZSB0aGUgY3VycmVudCBNQjsgc2V0IHRvIE5VTEwgaWYgdGhlcmUgCi0gKiAgICAgICAgICAgIGlzIG5vIE1CIGxvY2F0ZWQgYWJvdmUgdGhlIGN1cnJlbnQgTUIuIAotICogICBwU3JjQ2FuZE1WMyAtIHBvaW50ZXIgdG8gdGhlIE1WIGJ1ZmZlciBjb250YWluaW5nIHRoZSA0IE1WcyBhc3NvY2lhdGVkIAotICogICAgICAgICAgICB3aXRoIHRoZSBNQiBsb2NhdGVkIHRvIHRoZSByaWdodCBhbmQgYWJvdmUgdGhlIGN1cnJlbnQgTUI7IHNldCAKLSAqICAgICAgICAgICAgdG8gTlVMTCBpZiB0aGVyZSBpcyBubyBNQiBsb2NhdGVkIHRvIHRoZSBhYm92ZS1yaWdodC4gCi0gKiAgIGlCbGsgLSB0aGUgaW5kZXggb2YgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKLSAqICAgcERzdE1WUHJlZE1FIC0gTVYgY2FuZGlkYXRlIHJldHVybiBidWZmZXI7ICBpZiBzZXQgdG8gTlVMTCB0aGVuIAotICogICAgICAgICAgICBwcmVkaWN0aW9uIGNhbmRpZGF0ZSBNVnMgYXJlIG5vdCByZXR1cm5lZCBhbmQgcERzdE1WUHJlZE1FIHdpbGwgCi0gKiAgICAgICAgICAgIGJlIE5VTEwgdXBvbiBmdW5jdGlvbiByZXR1cm47IGlmIHBEc3RNVlByZWRNRSBpcyBub24tTlVMTCB0aGVuIGl0IAotICogICAgICAgICAgICBtdXN0IHBvaW50IHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgc3VmZmljaWVudCBzcGFjZSBmb3IgdGhyZWUgCi0gKiAgICAgICAgICAgIHJldHVybiBNVnMuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0TVZQcmVkIC0gcG9pbnRlciB0byB0aGUgcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3IgCi0gKiAgIHBEc3RNVlByZWRNRSAtIGlmIG5vbi1OVUxMIHVwb24gaW5wdXQgdGhlbiBwRHN0TVZQcmVkTUUgIHBvaW50cyB1cG9uIAotICogICAgICAgICAgICByZXR1cm4gdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgdGhyZWUgbW90aW9uIHZlY3RvciBjYW5kaWRhdGVzIAotICogICAgICAgICAgICB1c2VkIGZvciBwcmVkaWN0aW9uIGFzIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSAKLSAqICAgICAgICAgICAgNy42LjUsIG90aGVyd2lzZSBpZiBOVUxMIHVwb24gaW5wdXQgdGhlbiBwRHN0TVZQcmVkTUUgaXMgTlVMTCAKLSAqICAgICAgICAgICAgdXBvbiBvdXRwdXQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKLSAqICAgIC0gICAgdGhlIHBvaW50ZXIgcERzdE1WUHJlZCBpcyBOVUxMIAotICogICAgLSAgICB0aGUgcGFyYW1ldGVyIGlCbGsgZG9lcyBub3QgZmFsbCBpbnRvIHRoZSByYW5nZSAwIDw9IGlCbGs8PTMgCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDJfRmluZE1WcHJlZCgKLSAgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IqIHBTcmNNVkN1ck1CLAotICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciogcFNyY0NhbmRNVjEsCi0gICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yKiBwU3JjQ2FuZE1WMiwKLSAgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IqIHBTcmNDYW5kTVYzLAotICAgICBPTVhWQ01vdGlvblZlY3RvciogcERzdE1WUHJlZCwKLSAgICAgT01YVkNNb3Rpb25WZWN0b3IqIHBEc3RNVlByZWRNRSwKLSAgICAgT01YX0lOVCBpQmxrCi0gKQotewotICAgIE9NWFZDTW90aW9uVmVjdG9yIENhbmRNVjsKLQljb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcENhbmRNVjE7Ci0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBDYW5kTVYyOwotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwQ2FuZE1WMzsKLSAgICAKLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KLQlhcm1SZXRBcmdFcnJJZihpQmxrIT0wICYmIHBTcmNNVkN1ck1CID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0TVZQcmVkID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoaUJsayA8IDApIHx8IChpQmxrID4gMyksIE9NWF9TdHNfQmFkQXJnRXJyKTsgCi0KLSAgICBDYW5kTVYuZHggPSBDYW5kTVYuZHkgPSAwOwotCS8qIEJhc2VkIG9uIHRoZSBwb3NpdGlvbiBvZiB0aGUgYmxvY2sgZXh0cmFjdCB0aGUgbW90aW9uIHZlY3RvcnMgYW5kCi0gICAgICAgdGhlIHRyYW5wZXJhbmN5IHN0YXR1cyAqLwotICAgCi0gICAgCi0gICAgLyogU2V0IHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGVzZSB0byBiZSB1c2VkIGlmIHBTcmNDYW5kTVZbMXwyfDNdID09IE5VTEwgKi8KLSAgICBwQ2FuZE1WMSA9IHBDYW5kTVYyID0gcENhbmRNVjMgPSAmQ2FuZE1WOwotCi0gICAgCi0gICAgc3dpdGNoIChpQmxrKQotICAgIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZihwU3JjQ2FuZE1WMSAhPSBOVUxMKQotICAgICAgICAgICAgewotCQkJICAgIHBDYW5kTVYxID0gJnBTcmNDYW5kTVYxWzFdOwotCQkJfQotCQkJaWYocFNyY0NhbmRNVjIgIT0gTlVMTCkKLSAgICAgICAgICAgIHsKLQkJCQlwQ2FuZE1WMiA9ICZwU3JjQ2FuZE1WMlsyXTsKLQkJCX0KLQkJCWlmKHBTcmNDYW5kTVYzICE9IE5VTEwpCi0gICAgICAgICAgICB7Ci0JCQkJcENhbmRNVjMgPSAmcFNyY0NhbmRNVjNbMl07Ci0JCQl9Ci0JCQlpZiAoKHBTcmNDYW5kTVYxID09IE5VTEwpICYmIChwU3JjQ2FuZE1WMiA9PSBOVUxMKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQ2FuZE1WMSA9IHBDYW5kTVYyID0gcENhbmRNVjM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKChwU3JjQ2FuZE1WMSA9PSBOVUxMKSAmJiAocFNyY0NhbmRNVjMgPT0gTlVMTCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcENhbmRNVjEgPSBwQ2FuZE1WMyA9IHBDYW5kTVYyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZigocFNyY0NhbmRNVjIgPT0gTlVMTCkgJiYgKHBTcmNDYW5kTVYzID09IE5VTEwpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDYW5kTVYyID0gcENhbmRNVjMgPSBwQ2FuZE1WMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgewotICAgICAgICAgICAgcENhbmRNVjEgPSAmcFNyY01WQ3VyTUJbMF07Ci0JCQlpZihwU3JjQ2FuZE1WMiAhPSBOVUxMKQotICAgICAgICAgICAgewotCQkJCXBDYW5kTVYyID0gJnBTcmNDYW5kTVYyWzNdOwotCQkJfQotCQkJaWYocFNyY0NhbmRNVjMgIT0gTlVMTCkKLSAgICAgICAgICAgIHsKLQkJCQlwQ2FuZE1WMyA9ICZwU3JjQ2FuZE1WM1syXTsKLQkJCX0KLQkJCWlmKChwU3JjQ2FuZE1WMiA9PSBOVUxMKSAmJiAocFNyY0NhbmRNVjMgPT0gTlVMTCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcENhbmRNVjIgPSBwQ2FuZE1WMyA9IHBDYW5kTVYxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSAyOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZihwU3JjQ2FuZE1WMSAhPSBOVUxMKQotICAgICAgICAgICAgewotCQkJCXBDYW5kTVYxID0gJnBTcmNDYW5kTVYxWzNdOwotCQkJfQotCQkJcENhbmRNVjIgPSAmcFNyY01WQ3VyTUJbMF07Ci0JCQlwQ2FuZE1WMyA9ICZwU3JjTVZDdXJNQlsxXTsKLQkJCWJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgewotICAgICAgICAgICAgcENhbmRNVjEgPSAmcFNyY01WQ3VyTUJbMl07Ci0JCQlwQ2FuZE1WMiA9ICZwU3JjTVZDdXJNQlswXTsKLQkJCXBDYW5kTVYzID0gJnBTcmNNVkN1ck1CWzFdOwotCQkJYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBGaW5kIHRoZSBtZWRpYW4gb2YgdGhlIDMgY2FuZGlkYXRlIE1WJ3MgKi8KLSAgICBwRHN0TVZQcmVkLT5keCA9IGFybU1lZGlhbk9mMyAocENhbmRNVjEtPmR4LCBwQ2FuZE1WMi0+ZHgsIHBDYW5kTVYzLT5keCk7Ci0gICAgcERzdE1WUHJlZC0+ZHkgPSBhcm1NZWRpYW5PZjMgKHBDYW5kTVYxLT5keSwgcENhbmRNVjItPmR5LCBwQ2FuZE1WMy0+ZHkpOwotICAgICAgICAKLSAgICBpZiAocERzdE1WUHJlZE1FICE9IE5VTEwpCi0gICAgewotICAgICAgICAvKiBTdG9yZSB0aGUgY2FuZGlkYXRlIE1WJ3MgaW50byB0aGUgcERzdE1WUHJlZE1FLCB0aGVzZSBjYW4gYmUgdXNlZAotICAgICAgICAgICBpbiB0aGUgZmFzdCBhbGdvcml0aG0gaWYgaW1wbGVtZW50ZWQgKi8KLSAgICAgICAgcERzdE1WUHJlZE1FWzBdLmR4ID0gcENhbmRNVjEtPmR4OwotICAgICAgICBwRHN0TVZQcmVkTUVbMF0uZHkgPSBwQ2FuZE1WMS0+ZHk7Ci0gICAgICAgIHBEc3RNVlByZWRNRVsxXS5keCA9IHBDYW5kTVYyLT5keDsKLSAgICAgICAgcERzdE1WUHJlZE1FWzFdLmR5ID0gcENhbmRNVjItPmR5OwotICAgICAgICBwRHN0TVZQcmVkTUVbMl0uZHggPSBwQ2FuZE1WMy0+ZHg7Ci0gICAgICAgIHBEc3RNVlByZWRNRVsyXS5keSA9IHBDYW5kTVYzLT5keTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotCi0vKiBFbmQgb2YgZmlsZSAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MTI0NTguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfSURDVDh4OGJsay5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfSURDVDh4OGJsay5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb250YWlucyBtb2R1bGVzIGZvciA4eDggYmxvY2sgSURDVAotICogCi0gKi8KLQotCi0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQ000UDJfRENUX1RhYmxlLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfSURDVDh4OGJsayAgICg2LjIuMy4yLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb21wdXRlcyBhIDJEIGludmVyc2UgRENUIGZvciBhIHNpbmdsZSA4eDggYmxvY2ssIGFzIGRlZmluZWQgaW4gCi0gKiBbSVNPMTQ0OTYtMl0uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgSURDVCBpbnB1dCBidWZmZXI7IAotICogICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgQWNjb3JkaW5nIHRvIAotICogICAgICAgICAgICBbSVNPMTQ0OTYtMl0sIHRoZSBpbnB1dCBjb2VmZmljaWVudCB2YWx1ZXMgc2hvdWxkIGxpZSB3aXRoaW4gdGhlIAotICogICAgICAgICAgICByYW5nZSBbLTIwNDgsIDIwNDddLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lYXJseSBhcnJhbmdlZCBJRENUIG91dHB1dCBidWZmZXI7IAotICogICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIE5VTEwuIAotICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0lEQ1Q4eDhibGsgKGNvbnN0IE9NWF9TMTYgKnBTcmMsIE9NWF9TMTYgKnBEc3QpCi17Ci0gICAgT01YX0lOVCB4LCB5LCB1LCB2OwotCi0gICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIWFybUlzMTZCeXRlQWxpZ25lZChwU3JjKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczE2Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQotICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyspCi0gICAgewotICAgICAgICBmb3IgKHkgPSAwOyB5IDwgODsgeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBPTVhfRjY0IHN1bSA9IDAuMDsKLSAgICAgICAgICAgIGZvciAodSA9IDA7IHUgPCA4OyB1KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yICh2ID0gMDsgdiA8IDg7IHYrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN1bSArPSBwU3JjWyh1ICogOCkgKyB2XSAqCi0gICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfcHJlQ2FsY0RDVENvc1t4XVt1XSAqCi0gICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfcHJlQ2FsY0RDVENvc1t5XVt2XTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwRHN0Wyh4ICogOCkgKyB5XSA9IChPTVhfUzE2KSBmbG9vcihzdW0gKyAwLjUpOwotCi0gICAgICAgICAgICAvKiBTYXR1cmF0ZSB0byBbLTI1NiwgMjU1XSAqLwotICAgICAgICAgICAgcERzdFsoeCAqIDgpICsgeV0gPSBhcm1DbGlwICgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTI1NiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRHN0Wyh4ICogOCkgKyB5XSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2suYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX01DUmVjb25CbG9jay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2YwY2Y1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX01DUmVjb25CbG9jay5jCisrKyAvZGV2L251bGwKQEAgLTEsMzcyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfTUNSZWNvbkJsb2NrLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogTVBFRzQgbW90aW9uIGNvbXBlbnNhdGlvbiBwcmVkaWN0aW9uIGZvciBhbiA4eDggYmxvY2sgdXNpbmcgCi0gKiBpbnRlcnBvbGF0aW9uCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0hhbGZQZWxWZXIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGhhbGYgcGVsIG1vdGlvbiBjb21wZW5zYXRpb24gZm9yIGFuIDh4OCBibG9jayB1c2luZyB2ZXJ0aWNhbCAKLSAqIGludGVycG9sYXRpb24gZGVzY3JpYmVkIGluIElTTy9JRUMgMTQ0OTYtMiwgc3ViY2xhdXNlIDcuNi4yLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gcFNyYyAgICAgICAgcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZS4KLSAqIFtpbl0gc3JjU3RlcCAgICAgZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMKLSAqICAgICAgICAgICAgICAgICAgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZQotICogICAgICAgICAgICAgICAgICBvZiA4LgotICogW2luXSBybmRWYWwgICAgICByb3VuZGluZyBjb250cm9sIHBhcmFtZXRlcjogMCAtIGRpc2FibGVkOyAxIC0gZW5hYmxlZC4KLSAqIFtvdXRdIHBEc3QgICAgICAgcG9pbnRlciB0byB0aGUgbGluYWVyIDh4OCBkZXN0aW5hdGlvbiBidWZmZXI7Ci0gKgotICovCi1zdGF0aWMgT01YVm9pZCBhcm1WQ000UDJfSGFsZlBlbFZlcigKLSAgICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICAgIE9NWF9JTlQgc3JjU3RlcCwgCi0gICAgICBPTVhfVTggKnBEc3QsCi0gICAgICBPTVhfSU5UIHJuZFZhbCkKLXsKLSAgY29uc3QgT01YX1U4ICpwVGVtcFNyYzE7Ci0gIGNvbnN0IE9NWF9VOCAqcFRlbXBTcmMyOwotICBPTVhfSU5UIHksIHg7Ci0gIAotICBwVGVtcFNyYzEgPSBwU3JjOyAgCi0gIHBUZW1wU3JjMiA9IHBTcmMgKyBzcmNTdGVwOwotICBzcmNTdGVwIC09IDg7Ci0gIGZvciAoeSA9IDA7IHkgPCA4OyB5KyspCi0gIHsKLSAgICBmb3IgKHggPSAwOyB4IDwgODsgeCsrKQotICAgIHsKLSAgICAgICpwRHN0KysgPSAoKCpwVGVtcFNyYzErKyArICpwVGVtcFNyYzIrKykgKyAxIC0gcm5kVmFsKSA+PiAxOwotICAgIH0KLSAgICBwVGVtcFNyYzEgKz0gc3JjU3RlcDsKLSAgICBwVGVtcFNyYzIgKz0gc3JjU3RlcDsKLSAgfQotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfSGFsZlBlbEhvcgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgaGFsZiBwZWwgbW90aW9uIGNvbXBlbnNhdGlvbiBmb3IgYW4gOHg4IGJsb2NrIHVzaW5nIGhvcml6b250YWwgCi0gKiBpbnRlcnBvbGF0aW9uIGRlc2NyaWJlZCBpbiBJU08vSUVDIDE0NDk2LTIsIHN1YmNsYXVzZSA3LjYuMi4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHBTcmMgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJsb2NrIGluIHRoZSByZWZlcmVuY2UgcGxhbmUuCi0gKiBbaW5dIHNyY1N0ZXAgICAgIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNvbnNlY3V0aXZlIGxpbmVzCi0gKiAgICAgICAgICAgICAgICAgIGluIHRoZSByZWZlcmVuY2UgcGxhbmUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUKLSAqICAgICAgICAgICAgICAgICAgb2YgOC4KLSAqIFtpbl0gcm5kVmFsICAgICAgcm91bmRpbmcgY29udHJvbCBwYXJhbWV0ZXI6IDAgLSBkaXNhYmxlZDsgMSAtIGVuYWJsZWQuCi0gKiBbb3V0XSBwRHN0ICAgICAgIHBvaW50ZXIgdG8gdGhlIGxpbmFlciA4eDggZGVzdGluYXRpb24gYnVmZmVyOwotICoKLSAqLwotc3RhdGljIE9NWFZvaWQgYXJtVkNNNFAyX0hhbGZQZWxIb3IoCi0gICAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgICBPTVhfSU5UIHNyY1N0ZXAsIAotICAgICAgT01YX1U4ICpwRHN0LAotICAgICAgT01YX0lOVCBybmRWYWwpCi17Ci0gIGNvbnN0IE9NWF9VOCAqcFRlbXBTcmMxOwotICBjb25zdCBPTVhfVTggKnBUZW1wU3JjMjsKLSAgT01YX0lOVCB5LCB4OwotICAKLSAgcFRlbXBTcmMxID0gcFNyYzsKLSAgcFRlbXBTcmMyID0gcFRlbXBTcmMxICsgMTsKLQotICBzcmNTdGVwIC09IDg7Ci0gIGZvciAoeT0wOyB5PDg7IHkrKykKLSAgewotICAgIGZvciAoeD0wOyB4PDg7IHgrKykKLSAgICB7Ci0gICAgICAqcERzdCsrID0gKCgqcFRlbXBTcmMxKysgKyAqcFRlbXBTcmMyKyspICsgMSAtIHJuZFZhbCkgPj4gMTsKLSAgICB9Ci0gICAgcFRlbXBTcmMxICs9IHNyY1N0ZXA7Ci0gICAgcFRlbXBTcmMyICs9IHNyY1N0ZXA7Ci0gIH0KLX0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfSGFsZlBlbFZlckhvcgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgaGFsZiBwZWwgbW90aW9uIGNvbXBlbnNhdGlvbiBmb3IgYW4gOHg4IGJsb2NrIHVzaW5nIGJvdGggCi0gKiBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uIGRlc2NyaWJlZCBpbiBJU08vSUVDIDE0NDk2LTIsCi0gKiBzdWJjbGF1c2UgNy42LjIuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBwU3JjICAgICAgICBwb2ludGVyIHRvIHRoZSBibG9jayBpbiB0aGUgcmVmZXJlbmNlIHBsYW5lLgotICogW2luXSBzcmNTdGVwICAgICBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcwotICogICAgICAgICAgICAgICAgICBpbiB0aGUgcmVmZXJlbmNlIHBsYW5lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlCi0gKiAgICAgICAgICAgICAgICAgIG9mIDguCi0gKiBbaW5dIHJuZFZhbCAgICAgIHJvdW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVyOiAwIC0gZGlzYWJsZWQ7IDEgLSBlbmFibGVkLgotICogW291dF0gcERzdCAgICAgICBwb2ludGVyIHRvIHRoZSBsaW5hZXIgOHg4IGRlc3RpbmF0aW9uIGJ1ZmZlcjsKLSAqCi0gKi8KLXN0YXRpYyBPTVhWb2lkIGFybVZDTTRQMl9IYWxmUGVsVmVySG9yKAotICAgICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgICAgT01YX0lOVCBzcmNTdGVwLCAKLSAgICAgIE9NWF9VOCAqcERzdCwKLSAgICAgIE9NWF9JTlQgcm5kVmFsKQotewotICBjb25zdCBPTVhfVTggKnBUZW1wU3JjMTsKLSAgY29uc3QgT01YX1U4ICpwVGVtcFNyYzI7Ci0gIGNvbnN0IE9NWF9VOCAqcFRlbXBTcmMzOwotICBjb25zdCBPTVhfVTggKnBUZW1wU3JjNDsKLSAgT01YX0lOVCB5LCB4OwotCi0gIHBUZW1wU3JjMSA9IHBTcmM7Ci0gIHBUZW1wU3JjMiA9IHBTcmMgKyBzcmNTdGVwOwotICBwVGVtcFNyYzMgPSBwU3JjICsgMTsKLSAgcFRlbXBTcmM0ID0gcFNyYyArIHNyY1N0ZXAgKyAxOwotCi0gIHNyY1N0ZXAgLT0gODsKLSAgZm9yICh5PTA7IHk8ODsgeSsrKQotICB7Ci0gICAgZm9yICh4PTA7IHg8ODsgeCsrKQotCXsKLQkgICpwRHN0KysgPSAoKCpwVGVtcFNyYzErKyArICpwVGVtcFNyYzIrKyArICpwVGVtcFNyYzMrKyArICpwVGVtcFNyYzQrKykgKyAKLQkgICAgICAgICAgICAgICAgICAyIC0gcm5kVmFsKSA+PiAyOwotCX0KLSAgICBwVGVtcFNyYzEgKz0gc3JjU3RlcDsKLSAgICBwVGVtcFNyYzIgKz0gc3JjU3RlcDsKLSAgICBwVGVtcFNyYzMgKz0gc3JjU3RlcDsKLSAgICBwVGVtcFNyYzQgKz0gc3JjU3RlcDsKLSAgfQotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfTUNSZWNvbkJsb2NrX05vUmVzCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBEbyBtb3Rpb24gY29tcGVuc2F0aW9uIGFuZCBjb3B5IHRoZSByZXN1bHQgdG8gdGhlIGN1cnJlbnQgYmxvY2suCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBwU3JjICAgICAgICBwb2ludGVyIHRvIHRoZSBibG9jayBpbiB0aGUgcmVmZXJlbmNlIHBsYW5lLgotICogW2luXSBzcmNTdGVwICAgICBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcwotICogICAgICAgICAgICAgICAgICBpbiB0aGUgcmVmZXJlbmNlIHBsYW5lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlCi0gKiAgICAgICAgICAgICAgICAgIG9mIDguCi0gKiBbaW5dIGRzdFN0ZXAgICAgIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZQotICogICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiBwbGFuZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LgotICogW2luXSBwcmVkaWN0VHlwZSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIHR5cGUsIGFzIGRlZmluZWQgaW4gc2VjdGlvbiA2LjIuMS4yLgotICogW2luXSBybmRWYWwgICAgICByb3VuZGluZyBjb250cm9sIHBhcmFtZXRlcjogMCAtIGRpc2FibGVkOyAxIC0gZW5hYmxlZC4KLSAqIFtvdXRdIHBEc3QgICAgICAgcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLgotICogICAgICAgICAgICAgICAgICBJZiBwcmVkaWN0aW9uIHJlc2lkdWFscyBhcmUgYWRkZWQgdGhlbiBvdXRwdXQgaW50ZW5zaXRpZXMKLSAqICAgICAgICAgICAgICAgICAgYXJlIGNsaXBwZWQgdG8gdGhlIHJhbmdlIFswLDI1NV0uCi0gKgotICovCi1zdGF0aWMgT01YVm9pZCBhcm1WQ000UDJfTUNSZWNvbkJsb2NrX05vUmVzKAotICAgICAgY29uc3QgT01YX1U4ICpwU3JjLCAKLSAgICAgIE9NWF9JTlQgc3JjU3RlcCwKLSAgICAgIE9NWF9VOCAqcERzdCwKLSAgICAgIE9NWF9JTlQgZHN0U3RlcCkKLXsKLSAgICBPTVhfVTggeCx5LGNvdW50LGluZGV4OwotICAgIAotICAgIC8qIENvcHlpbmcgdGhlIHJlZiA4eDggYmxrIHRvIHRoZSBjdXJyIGJsayAqLwotICAgIGZvciAoeSA9IDAsIGNvdW50ID0gMCwgaW5kZXggPSAwOyB5IDwgODsgeSsrLGluZGV4ICs9IChzcmNTdGVwIC04KSwgY291bnQgKz0gKGRzdFN0ZXAgLSA4KSkKLSAgICB7Ci0gICAgICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyssIGNvdW50KyssaW5kZXgrKykKLSAgICAgICAgewotICAgICAgICAgICAgcERzdFtjb3VudF0gPSBwU3JjW2luZGV4XTsKLSAgICAgICAgfSAgICAgICAKLSAgICB9Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9NQ1JlY29uQmxvY2tfUmVzCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBSZWNvbnN0cnVjdHMgSU5URVIgYmxvY2sgYnkgc3VtbWluZyB0aGUgbW90aW9uIGNvbXBlbnNhdGlvbiByZXN1bHRzCi0gKiBhbmQgdGhlIHJlc3VsdHMgb2YgdGhlIGludmVyc2UgdHJhbnNmb3JtYXRpb24gKHByZWRpY3Rpb24gcmVzaWR1YWxzKS4KLSAqIE91dHB1dCBpbnRlbnNpdGllcyBhcmUgY2xpcHBlZCB0byB0aGUgcmFuZ2UgWzAsMjU1XS4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHBTcmMgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJsb2NrIGluIHRoZSByZWZlcmVuY2UgcGxhbmUuCi0gKiBbaW5dIHBTcmNSZXNpZHVlIHBvaW50ZXIgdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgMTYtYml0IHByZWRpY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgcmVzaWR1YWxzLiBJZiB0aGUgcG9pbnRlciBpcyBOVUxMLHRoZW4gbm8gcHJlZGljdGlvbgotICogICAgICAgICAgICAgICAgICBpcyBkb25lLCBvbmx5IG1vdGlvbiBjb21wZW5zYXRpb24sIGkuZS4sIHRoZSBibG9jayBpcwotICogICAgICAgICAgICAgICAgICBtb3ZlZCB3aXRoIGludGVycG9sYXRpb24uCi0gKiBbaW5dIGRzdFN0ZXAgICAgIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZQotICogICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiBwbGFuZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LgotICogW291dF0gcERzdCAgICAgICBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuCi0gKiAgICAgICAgICAgICAgICAgIElmIHByZWRpY3Rpb24gcmVzaWR1YWxzIGFyZSBhZGRlZCB0aGVuIG91dHB1dCBpbnRlbnNpdGllcwotICogICAgICAgICAgICAgICAgICBhcmUgY2xpcHBlZCB0byB0aGUgcmFuZ2UgWzAsMjU1XS4KLSAqCi0gKi8KLXN0YXRpYyBPTVhWb2lkIGFybVZDTTRQMl9NQ1JlY29uQmxvY2tfUmVzKAotICAgICAgY29uc3QgT01YX1U4ICpwU3JjLCAKLSAgICAgIGNvbnN0IE9NWF9TMTYgKnBTcmNSZXNpZHVlLAotICAgICAgT01YX1U4ICpwRHN0LAotICAgICAgT01YX0lOVCBkc3RTdGVwKQotewotICAgICAgCi0gIE9NWF9VOCB4LHk7Ci0gIE9NWF9JTlQgdGVtcDsKLSAgCi0gIGZvcih5ID0gMDsgeSA8IDg7IHkrKykKLSAgewotICAgIGZvcih4ID0gMDsgeCA8IDg7IHgrKykKLSAgICB7Ci0gICAgICB0ZW1wID0gcFNyY1t4XSArIHBTcmNSZXNpZHVlW3hdOyAgICAgICAgIAotICAgICAgcERzdFt4XSA9IGFybUNsaXAoMCwyNTUsdGVtcCk7Ci0gICAgfQotICAgIHBEc3QgKz0gZHN0U3RlcDsKLSAgICBwU3JjICs9IDg7Ci0gICAgcFNyY1Jlc2lkdWUgKz0gODsKLSAgfQotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01DUmVjb25CbG9jayAgICg2LjIuNS41LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBtb3Rpb24gY29tcGVuc2F0aW9uIHByZWRpY3Rpb24gZm9yIGFuIDh4OCBibG9jayB1c2luZyAKLSAqIGludGVycG9sYXRpb24gZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi4yLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZS4gCi0gKiAgIHNyY1N0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJlZmVyZW5jZSBwbGFuZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgZHN0U3RlcCAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSAKLSAqICAgICAgICAgICAgZGVzdGluYXRpb24gcGxhbmUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIHBTcmNSZXNpZHVlIC0gcG9pbnRlciB0byBhIGJ1ZmZlciBjb250YWluaW5nIHRoZSAxNi1iaXQgcHJlZGljdGlvbiAKLSAqICAgICAgICAgICAgcmVzaWR1YWxzOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gSWYgdGhlIHBvaW50ZXIgaXMgTlVMTCwgdGhlbiAKLSAqICAgICAgICAgICAgbm8gcHJlZGljdGlvbiBpcyBkb25lLCBvbmx5IG1vdGlvbiBjb21wZW5zYXRpb24sIGkuZS4sIHRoZSBibG9jayAKLSAqICAgICAgICAgICAgaXMgbW92ZWQgd2l0aCBpbnRlcnBvbGF0aW9uLiAKLSAqICAgcHJlZGljdFR5cGUgLSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIHR5cGUsIGFzIGRlZmluZWQgaW4gc2VjdGlvbiAKLSAqICAgICAgICAgICAgNi4yLjEuMi4gCi0gKiAgIHJuZFZhbCAtIHJvdW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVyOiAwIC0gZGlzYWJsZWQ7IDEgLSBlbmFibGVkLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gIElmIAotICogICAgICAgICAgICBwcmVkaWN0aW9uIHJlc2lkdWFscyBhcmUgYWRkZWQgdGhlbiBvdXRwdXQgaW50ZW5zaXRpZXMgYXJlIAotICogICAgICAgICAgICBjbGlwcGVkIHRvIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCi0gKiAgICAtICAgIHBEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgcFNyY1Jlc2lkdWUgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYyBvciBwRHN0LiAKLSAqICAgIC0gICAgZWl0aGVyIHNyY1N0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICAgaW52YWxpZCB0eXBlIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBwcmVkaWN0VHlwZS4gCi0gKiAgICAtICAgIHRoZSBwYXJhbWV0ZXIgcm5kVmFsIGlzIG5vdCBlcXVhbCBlaXRoZXIgdG8gMCBvciAxLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfTUNSZWNvbkJsb2NrKAotCQljb25zdCBPTVhfVTggKnBTcmMsCi0JCU9NWF9JTlQgc3JjU3RlcCwKLQkJY29uc3QgT01YX1MxNiAqcFNyY1Jlc2lkdWUsCi0JCU9NWF9VOCAqcERzdCwgCi0JCU9NWF9JTlQgZHN0U3RlcCwKLQkJT01YX0lOVCBwcmVkaWN0VHlwZSwKLQkJT01YX0lOVCBybmRWYWwpCi17Ci0gICAgLyogRGVmaW5pdGlvbnMgYW5kIEluaXRpYWxpemF0aW9ucyovCi0gICAgT01YX1U4IHBUZW1wRHN0WzY0XTsKLSAgICAKLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM4Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXMxNkJ5dGVBbGlnbmVkKHBTcmNSZXNpZHVlKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCgoZHN0U3RlcCAlIDgpIHx8IChzcmNTdGVwICUgOCkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKChwcmVkaWN0VHlwZSAhPSBPTVhfVkNfSU5URUdFUl9QSVhFTCkgJiYKLSAgICAgICAgICAgICAgICAgICAgKHByZWRpY3RUeXBlICE9IE9NWF9WQ19IQUxGX1BJWEVMX1gpICYmCi0gICAgICAgICAgICAgICAgICAgIChwcmVkaWN0VHlwZSAhPSBPTVhfVkNfSEFMRl9QSVhFTF9ZKSAmJgotICAgICAgICAgICAgICAgICAgICAocHJlZGljdFR5cGUgIT0gT01YX1ZDX0hBTEZfUElYRUxfWFkpCi0gICAgICAgICAgICAgICAgICAgKSxPTVhfU3RzX0JhZEFyZ0Vycik7IAotICAgIGFybVJldEFyZ0VycklmKCgocm5kVmFsICE9IDApICYmIChybmRWYWwgIT0gMSkpLE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAKLSAgICBzd2l0Y2gocHJlZGljdFR5cGUpCi0gICAgewotICAgICAgICBjYXNlIE9NWF9WQ19JTlRFR0VSX1BJWEVMOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfTUNSZWNvbkJsb2NrX05vUmVzKHBTcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1N0ZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocFRlbXBEc3RbMF0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT01YX1ZDX0hBTEZfUElYRUxfWDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0hhbGZQZWxIb3IocFNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1N0ZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBUZW1wRHN0WzBdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJuZFZhbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9NWF9WQ19IQUxGX1BJWEVMX1k6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IYWxmUGVsVmVyKHBTcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNTdGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwVGVtcERzdFswXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybmRWYWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPTVhfVkNfSEFMRl9QSVhFTF9YWToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0hhbGZQZWxWZXJIb3IocFNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1N0ZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBUZW1wRHN0WzBdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJuZFZhbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICAKLSAgICBpZihwU3JjUmVzaWR1ZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFybVZDTTRQMl9NQ1JlY29uQmxvY2tfTm9SZXMoJihwVGVtcERzdFswXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0ZXApOyAgICAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGFybVZDTTRQMl9NQ1JlY29uQmxvY2tfUmVzKCYocFRlbXBEc3RbMF0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY1Jlc2lkdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0U3RlcCk7ICAgIAotICAgIH0KLSAgICAKLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUVHZXRCdWZTaXplLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9NRUdldEJ1ZlNpemUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRhODUyZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9NRUdldEJ1ZlNpemUuYworKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfTUVHZXRCdWZTaXplLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEluaXRpYWxpemF0aW9uIG1vZHVsZXMgZm9yIHRoZSB2ZW5kb3Igc3BlY2lmaWMgTW90aW9uIEVzdGltYXRpb24gc3RydWN0dXJlLgotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01FR2V0QnVmU2l6ZSAgICg2LjIuNC4xLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb21wdXRlcyB0aGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3BlY2lmaWNhdGlvbiAKLSAqIHN0cnVjdHVyZSBmb3IgdGhlIGZvbGxvd2luZyBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnM6IAotICogQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCwgQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LCBhbmQgTW90aW9uRXN0aW1hdGlvbk1CLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBNRW1vZGUgLSBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlOyBhdmFpbGFibGUgbW9kZXMgYXJlIGRlZmluZWQgYnkgdGhlIAotICogICAgICAgICAgICBlbnVtZXJhdGVkIHR5cGUgT01YVkNNNFAyTUVNb2RlIAotICogICBwTUVQYXJhbXMgLSBtb3Rpb24gZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU2l6ZSAtIHBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIHNwZWNpZmljYXRpb24gCi0gKiAgICAgICAgICAgIHN0cnVjdHVyZSAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYW4gaW52YWxpZCB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgcGFyYW1ldGVyIE1FbW9kZSAKLSAqICAgIC0gICAgYSBuZWdhdGl2ZSBvciB6ZXJvIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSAKLSAqICAgICAgICAgcGFyYW1ldGVyIHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UgCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDJfTUVHZXRCdWZTaXplKAotICAgIE9NWFZDTTRQMk1FTW9kZSBNRU1vZGUsIAotICAgIGNvbnN0IE9NWFZDTTRQMk1FUGFyYW1zICpwTUVQYXJhbXMsIAotICAgIE9NWF9VMzIgKnBTaXplCi0gICApCi17Ci0gICAgYXJtUmV0QXJnRXJySWYoIXBNRVBhcmFtcywgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFwU2l6ZSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UgPD0gMCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChNRU1vZGUgIT0gT01YX1ZDX000UDEwX0ZBU1RfU0VBUkNIKSAmJgotICAgICAgICAgICAgICAgICAgIChNRU1vZGUgIT0gT01YX1ZDX000UDEwX0ZVTExfU0VBUkNIKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIAotICAgICpwU2l6ZSA9IChPTVhfSU5UKSBzaXplb2YoQVJNVkNNNFAyX01FU3BlYyk7Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX01FSW5pdC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUVJbml0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YzU3YzIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUVJbml0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAyX01FSW5pdC5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBJbml0aWFsaXphdGlvbiBtb2R1bGVzIGZvciB0aGUgdmVuZG9yIHNwZWNpZmljIE1vdGlvbiBFc3RpbWF0aW9uIHN0cnVjdHVyZS4KLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9NRUluaXQgICAoNi4yLjQuMS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogSW5pdGlhbGl6ZXMgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSByZXF1aXJlZCBmb3IgdGhlIAotICogZm9sbG93aW5nIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9uczogIEJsb2NrTWF0Y2hfSW50ZWdlcl84eDgsIAotICogQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LCBhbmQgTW90aW9uRXN0aW1hdGlvbk1CLiBNZW1vcnkgZm9yIHRoZSAKLSAqIHNwZWNpZmljYXRpb24gc3RydWN0dXJlICpwTUVTcGVjIG11c3QgYmUgYWxsb2NhdGVkIHByaW9yIHRvIGNhbGxpbmcgdGhlIAotICogZnVuY3Rpb24sIGFuZCBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIEZvbGxvd2luZyAKLSAqIGluaXRpYWxpemF0aW9uIGJ5IHRoaXMgZnVuY3Rpb24sIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3RydWN0dXJlICpwTUVTcGVjIAotICogc2hvdWxkIGNvbnRhaW4gYW4gaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgcmVwcmVzZW50YXRpb24gb2YgYWxsIG1vdGlvbiAKLSAqIGVzdGltYXRpb24gcGFyYW1ldGVycyByZWNlaXZlZCB2aWEgdGhlIHN0cnVjdHVyZSBwTUVQYXJhbXMsIGZvciBleGFtcGxlICAKLSAqIHJuZFZhbCwgc2VhcmNoUmFuZ2UsIGV0Yy4gIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSAKLSAqIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIGNhbiBiZSBkZXRlcm1pbmVkIHVzaW5nIHRoZSBmdW5jdGlvbiAKLSAqIG9teFZDTTRQMl9NRUdldEJ1ZlNpemUuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCi0gKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDJNRU1vZGUgCi0gKiAgIHBNRVBhcmFtcyAtIG1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCi0gKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSB1bmluaXRpYWxpemVkIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGFuIGludmFsaWQgdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBNRW1vZGUgCi0gKiAgICAtICAgIGEgbmVnYXRpdmUgb3IgemVybyB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgCi0gKiAgICAgICAgIHBhcmFtZXRlciBwTUVQYXJhbXMtPnNlYXJjaFJhbmdlIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAyX01FSW5pdCgKLSAgICBPTVhWQ000UDJNRU1vZGUgTUVNb2RlLCAKLSAgICBjb25zdCBPTVhWQ000UDJNRVBhcmFtcyAqcE1FUGFyYW1zLCAKLSAgICB2b2lkICpwTUVTcGVjCi0gICApCi17Ci0gICAgQVJNVkNNNFAyX01FU3BlYyAqYXJtTUVTcGVjID0gKEFSTVZDTTRQMl9NRVNwZWMgKikgcE1FU3BlYzsKLSAgICAKLSAgICBhcm1SZXRBcmdFcnJJZighcE1FUGFyYW1zLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIXBNRVNwZWMsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoTUVNb2RlICE9IE9NWF9WQ19NNFAyX0ZBU1RfU0VBUkNIKSAmJiAKLSAgICAgICAgICAgICAgICAgICAoTUVNb2RlICE9IE9NWF9WQ19NNFAyX0ZVTExfU0VBUkNIKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UgPD0gMCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIAotICAgIGFybU1FU3BlYy0+TUVQYXJhbXMuc2VhcmNoRW5hYmxlOHg4ICAgICA9IHBNRVBhcmFtcy0+c2VhcmNoRW5hYmxlOHg4OwotICAgIGFybU1FU3BlYy0+TUVQYXJhbXMuaGFsZlBlbFNlYXJjaEVuYWJsZSA9IHBNRVBhcmFtcy0+aGFsZlBlbFNlYXJjaEVuYWJsZTsKLSAgICBhcm1NRVNwZWMtPk1FUGFyYW1zLnNlYXJjaFJhbmdlICAgICAgICAgPSBwTUVQYXJhbXMtPnNlYXJjaFJhbmdlOyAgICAgICAgCi0gICAgYXJtTUVTcGVjLT5NRVBhcmFtcy5ybmRWYWwgICAgICAgICAgICAgID0gcE1FUGFyYW1zLT5ybmRWYWw7Ci0gICAgYXJtTUVTcGVjLT5NRU1vZGUgICAgICAgICAgICAgICAgICAgICAgID0gTUVNb2RlOwotICAgIAotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjliYjI5Ny4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIuYworKysgL2Rldi9udWxsCkBAIC0xLDY0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAyX01vdGlvbkVzdGltYXRpb25NQi5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb250YWlucyBtb2R1bGUgZm9yIG1vdGlvbiBzZWFyY2ggMTZ4MTYgbWFjcm9ibG9jawotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfMTZ4MTYKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIDE2eDE2IGJsb2NrIG1hdGNoIHdyYXBwZXIgZnVuY3Rpb24sIGNhbGxzIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYuCi0gKiBJZiBoYWxmIHBlbCBzZWFyY2ggaXMgZW5hYmxlZCBpdCBhbHNvIGNhbGxzIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBTcmNSZWZCdWYJICBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgTUIgdGhhdAotICogICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgcGxhbmUuCi0gKiBbaW5dCXNyY1JlZlN0ZXAJICB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lCi0gKiBbaW5dCXBSZWZSZWN0CSAgcG9pbnRlciB0byB0aGUgdmFsaWQgcmVjdGFuZ3VsYXIgaW4gcmVmZXJlbmNlIHBsYW5lLiBSZWxhdGl2ZSB0byBpbWFnZSBvcmlnaW4uCi0gKiAgICAgICAgICAgICAgICAgICAgSXQncyBub3QgbGltaXRlZCB0byB0aGUgaW1hZ2UgYm91bmRhcnksIGJ1dCBkZXBlbmRlZCBvbiB0aGUgcGFkZGluZy4gRm9yIGV4YW1wbGUsCi0gKiAgICAgICAgICAgICAgICAgICAgaWYgeW91IHBhZCA0IHBpeGVscyBvdXRzaWRlIHRoZSBpbWFnZSBib3JkZXIsIHRoZW4gdGhlIHZhbHVlIGZvciBsZWZ0IGJvcmRlcgotICogICAgICAgICAgICAgICAgICAgIGNhbiBiZSAtNAotICogW2luXQlwU3JjQ3VyckJ1ZgkgIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBleHRyYWN0ZWQgZnJvbSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LAotICogICAgICAgICAgICAgICAgICAgIDI1NiBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDE2LWJ5dGUgYm91bmRhcnkuCi0gKiBbaW5dIHBDdXJyUG9pbnRQb3MgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZQotICogW2luXSBwU3JjUHJlTVYJICBwb2ludGVyIHRvIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yOyBOVUxMIGluZGljYXRlcyBubyBwcmVkaWN0ZWQgTVYKLSAqIFtpbl0gcFNyY1ByZVNBRAkgIHBvaW50ZXIgdG8gU0FEIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJlZGljdGVkIE1WIChyZWZlcmVuY2VkIGJ5IHBTcmNQcmVNVik7IG1heSBiZSBzZXQgdG8gTlVMTCBpZiB1bmF2YWlsYWJsZS4KLSAqIFtpbl0gcE1FU3BlYwkJICB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZAotICogICAgICAgICAgICAgICAgICAgIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgYmxvY2sgbWF0Y2hpbmcKLSAqICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbi4KLSAqIFtvdXRdIHBEc3RNVgkgICAgICBwb2ludGVyIHRvIGVzdGltYXRlZCBNVgotICogW291dF0gcERzdFNBRAkgIHBvaW50ZXIgdG8gbWluaW11bSBTQUQKLSAqICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgotICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCi0gKgotICovCi1zdGF0aWMgT01YUmVzdWx0IGFybVZDTTRQMl9CbG9ja01hdGNoXzE2eDE2KAotICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCi0gICAgIGNvbnN0IE9NWF9JTlQgc3JjUmVmU3RlcCwKLSAgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCi0gICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCi0gICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjUHJlTVYsCi0gICAgIE9NWF9JTlQgKnBTcmNQcmVTQUQsCi0gICAgIHZvaWQgKnBNRVNwZWMsCi0gICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVYsCi0gICAgIE9NWF9JTlQgKnBEc3RTQUQKLSkKLXsKLSAgICBPTVhWQ000UDJNRVBhcmFtcyAqcE1FUGFyYW1zID0gKE9NWFZDTTRQMk1FUGFyYW1zICopcE1FU3BlYzsKLSAgICBPTVhfSU5UIHJuZFZhbDsKLSAgICAKLSAgICBybmRWYWwgPSBwTUVQYXJhbXMtPnJuZFZhbDsKLSAgICAKLSAgICBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2KAotICAgICAgICBwU3JjUmVmQnVmLAotICAgICAgICBzcmNSZWZTdGVwLAotICAgICAgICBwUmVmUmVjdCwKLSAgICAgICAgcFNyY0N1cnJCdWYsCi0gICAgICAgIHBDdXJyUG9pbnRQb3MsCi0gICAgICAgIHBTcmNQcmVNViwKLSAgICAgICAgcFNyY1ByZVNBRCwKLSAgICAgICAgcE1FUGFyYW1zLAotICAgICAgICBwRHN0TVYsCi0gICAgICAgIHBEc3RTQUQpOwotICAgIAotICAgIGlmIChwTUVQYXJhbXMtPmhhbGZQZWxTZWFyY2hFbmFibGUpCi0gICAgewotICAgICAgICBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2KAotICAgICAgICAgICAgcFNyY1JlZkJ1ZiwKLSAgICAgICAgICAgIHNyY1JlZlN0ZXAsCi0gICAgICAgICAgICBwUmVmUmVjdCwKLSAgICAgICAgICAgIHBTcmNDdXJyQnVmLAotICAgICAgICAgICAgcEN1cnJQb2ludFBvcywKLSAgICAgICAgICAgIHJuZFZhbCwKLSAgICAgICAgICAgIHBEc3RNViwKLSAgICAgICAgICAgIHBEc3RTQUQpOwotICAgIH0KLSAKLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsgICAgICAgIAotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQmxvY2tNYXRjaF84eDgKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIDh4OCBibG9jayBtYXRjaCB3cmFwcGVyIGZ1bmN0aW9uLCBjYWxscyBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OC4KLSAqIElmIGhhbGYgcGVsIHNlYXJjaCBpcyBlbmFibGVkIGl0IGFsc28gY2FsbHMgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDgKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBTcmNSZWZCdWYJICBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgTUIgdGhhdAotICogICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgcGxhbmUuCi0gKiBbaW5dCXNyY1JlZlN0ZXAJICB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lCi0gKiBbaW5dCXBSZWZSZWN0CSAgcG9pbnRlciB0byB0aGUgdmFsaWQgcmVjdGFuZ3VsYXIgaW4gcmVmZXJlbmNlIHBsYW5lLiBSZWxhdGl2ZSB0byBpbWFnZSBvcmlnaW4uCi0gKiAgICAgICAgICAgICAgICAgICAgSXQncyBub3QgbGltaXRlZCB0byB0aGUgaW1hZ2UgYm91bmRhcnksIGJ1dCBkZXBlbmRlZCBvbiB0aGUgcGFkZGluZy4gRm9yIGV4YW1wbGUsCi0gKiAgICAgICAgICAgICAgICAgICAgaWYgeW91IHBhZCA0IHBpeGVscyBvdXRzaWRlIHRoZSBpbWFnZSBib3JkZXIsIHRoZW4gdGhlIHZhbHVlIGZvciBsZWZ0IGJvcmRlcgotICogICAgICAgICAgICAgICAgICAgIGNhbiBiZSAtNAotICogW2luXQlwU3JjQ3VyckJ1ZgkgIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBleHRyYWN0ZWQgZnJvbSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LAotICogICAgICAgICAgICAgICAgICAgIDI1NiBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDE2LWJ5dGUgYm91bmRhcnkuCi0gKiBbaW5dIHBDdXJyUG9pbnRQb3MgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZQotICogW2luXSBwU3JjUHJlTVYJICBwb2ludGVyIHRvIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yOyBOVUxMIGluZGljYXRlcyBubyBwcmVkaWN0ZWQgTVYKLSAqIFtpbl0gcFNyY1ByZVNBRAkgIHBvaW50ZXIgdG8gU0FEIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJlZGljdGVkIE1WIChyZWZlcmVuY2VkIGJ5IHBTcmNQcmVNVik7IG1heSBiZSBzZXQgdG8gTlVMTCBpZiB1bmF2YWlsYWJsZS4KLSAqIFtpbl0gcE1FU3BlYwkJICB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZAotICogICAgICAgICAgICAgICAgICAgIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgYmxvY2sgbWF0Y2hpbmcKLSAqICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbi4KLSAqIFtvdXRdIHBEc3RNVgkgICAgICBwb2ludGVyIHRvIGVzdGltYXRlZCBNVgotICogW291dF0gcERzdFNBRAkgIHBvaW50ZXIgdG8gbWluaW11bSBTQUQKLSAqICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgotICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCi0gKgotICovCi1zdGF0aWMgT01YUmVzdWx0IGFybVZDTTRQMl9CbG9ja01hdGNoXzh4OCgKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAotICAgICBPTVhfSU5UIHNyY1JlZlN0ZXAsCi0gICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotICAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAotICAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAotICAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY1ByZU1WLAotICAgICBPTVhfSU5UICpwU3JjUHJlU0FELAotICAgICB2b2lkICpwTUVTcGVjLAotICAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdE1WLAotICAgICBPTVhfSU5UICpwRHN0U0FECi0pCi17Ci0gICAgT01YVkNNNFAyTUVQYXJhbXMgKnBNRVBhcmFtcyA9IChPTVhWQ000UDJNRVBhcmFtcyAqKXBNRVNwZWM7Ci0gICAgT01YX0lOVCBybmRWYWw7Ci0gICAgCi0gICAgcm5kVmFsID0gcE1FUGFyYW1zLT5ybmRWYWw7Ci0gICAgCi0gICAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDgoCi0gICAgICAgIHBTcmNSZWZCdWYsCi0gICAgICAgIHNyY1JlZlN0ZXAsCi0gICAgICAgIHBSZWZSZWN0LAotICAgICAgICBwU3JjQ3VyckJ1ZiwKLSAgICAgICAgcEN1cnJQb2ludFBvcywKLSAgICAgICAgcFNyY1ByZU1WLAotICAgICAgICBwU3JjUHJlU0FELAotICAgICAgICBwTUVQYXJhbXMsCi0gICAgICAgIHBTcmNEc3RNViwKLSAgICAgICAgcERzdFNBRCk7Ci0gICAgCi0gICAgaWYgKHBNRVBhcmFtcy0+aGFsZlBlbFNlYXJjaEVuYWJsZSkKLSAgICB7Ci0gICAgICAgIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4KAotICAgICAgICAgICAgcFNyY1JlZkJ1ZiwKLSAgICAgICAgICAgIHNyY1JlZlN0ZXAsCi0gICAgICAgICAgICBwUmVmUmVjdCwKLSAgICAgICAgICAgIHBTcmNDdXJyQnVmLAotICAgICAgICAgICAgcEN1cnJQb2ludFBvcywKLSAgICAgICAgICAgIHJuZFZhbCwKLSAgICAgICAgICAgIHBTcmNEc3RNViwKLSAgICAgICAgICAgIHBEc3RTQUQpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsgICAgICAgIAotfQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CICAgKDYuMi40LjMuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIG1vdGlvbiBzZWFyY2ggZm9yIGEgMTZ4MTYgbWFjcm9ibG9jay4gIFNlbGVjdHMgYmVzdCBtb3Rpb24gc2VhcmNoIAotICogc3RyYXRlZ3kgZnJvbSBhbW9uZyBpbnRlci0xTVYsIGludGVyLTRNViwgYW5kIGludHJhIG1vZGVzLiAgU3VwcG9ydHMgCi0gKiBpbnRlZ2VyIGFuZCBoYWxmIHBpeGVsIHJlc29sdXRpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjdXJyZW50IE1CIGluIHRoZSAKLSAqICAgICAgICAgICAgb3JpZ2luYWwgcGljdHVyZSBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIAotICogICAgICAgICAgICBUaGUgZnVuY3Rpb24gZG9lcyBub3QgZXhwZWN0IHNvdXJjZSBkYXRhIG91dHNpZGUgdGhlIHJlZ2lvbiAKLSAqICAgICAgICAgICAgYm91bmRlZCBieSB0aGUgTUIgdG8gYmUgYXZhaWxhYmxlOyBmb3IgZXhhbXBsZSBpdCBpcyBub3QgCi0gKiAgICAgICAgICAgIG5lY2Vzc2FyeSBmb3IgdGhlIGNhbGxlciB0byBndWFyYW50ZWUgdGhlIGF2YWlsYWJpbGl0eSBvZiAKLSAqICAgICAgICAgICAgcFNyY0N1cnJCdWZbLVNyY0N1cnJTdGVwXSwgaS5lLiwgdGhlIHJvdyBvZiBwaXhlbHMgYWJvdmUgdGhlIE1CIAotICogICAgICAgICAgICB0byBiZSBwcm9jZXNzZWQuIAotICogICBzcmNDdXJyU3RlcCAtIHdpZHRoIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lLCBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIHBsYW5lIGxvY2F0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIHNyY1JlZlN0ZXAgLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUsIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgcFJlZlJlY3QgLSByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZSwgc3BlY2lmaWVkIHJlbGF0aXZlIHRvIAotICogICAgICAgICAgICB0aGUgaW1hZ2Ugb3JpZ2luIAotICogICBwQ3VyclBvaW50UG9zIC0gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZSAKLSAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIAotICogICAgICAgICAgICBzdHJ1Y3R1cmU7IG11c3QgYmUgYWxsb2NhdGVkIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIAotICogICAgICAgICAgICBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gCi0gKiAgIHBNQkluZm8gLSBhcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBmb3VyIG5lYXJieSBNQnM6IAotICogICAgICAgICAgICAtICAgcE1CSW5mb1swXSAtIHBvaW50ZXIgdG8gbGVmdCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgLSAgIHBNQkluZm9bMV0gLSBwb2ludGVyIHRvIHRvcCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgLSAgIHBNQkluZm9bMl0gLSBwb2ludGVyIHRvIHRvcC1sZWZ0IE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICAtICAgcE1CSW5mb1szXSAtIHBvaW50ZXIgdG8gdG9wLXJpZ2h0IE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICBBbnkgcG9pbnRlciBpbiB0aGUgYXJyYXkgbWF5IGJlIHNldCBlcXVhbCB0byBOVUxMIGlmIHRoZSAKLSAqICAgICAgICAgICAgY29ycmVzcG9uZGluZyBNQiBkb2Vzbid0IGV4aXN0LiAgRm9yIGVhY2ggTUIsIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIAotICogICAgICAgICAgICBtZW1iZXJzIGFyZSB1c2VkOiAgICAKLSAqICAgICAgICAgICAgLSAgIG1iVHlwZSAtIG1hY3JvYmxvY2sgdHlwZSwgZWl0aGVyIE9NWF9WQ19JTlRSQSwgT01YX1ZDX0lOVEVSLCBvciAKLSAqICAgICAgICAgICAgICAgIE9NWF9WQ19JTlRFUjRWIAotICogICAgICAgICAgICAtICAgcE1WMFsyXVsyXSAtIGVzdGltYXRlZCBtb3Rpb24gdmVjdG9yczsgcmVwcmVzZW50ZWQgCi0gKiAgICAgICAgICAgICAgICBpbiAxLzIgcGl4ZWwgdW5pdHMgCi0gKiAgICAgICAgICAgIC0gICBzbGljZUlEIC0gbnVtYmVyIG9mIHRoZSBzbGljZSB0byB3aGljaCB0aGUgTUIgYmVsb25ncyAKLSAqICAgcFNyY0RzdE1CQ3VyciAtIHBvaW50ZXIgdG8gaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCBNQi4gIAotICogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGVudHJpZXMgc2hvdWxkIGJlIHNldCBwcmlvciB0byBjYWxsaW5nIHRoZSAKLSAqICAgICAgICAgICAgZnVuY3Rpb246IHNsaWNlSUQgLSB0aGUgbnVtYmVyIG9mIHRoZSBzbGljZSB0aGUgdG8gd2hpY2ggdGhlIAotICogICAgICAgICAgICBjdXJyZW50IE1CIGJlbG9uZ3MuICBUaGUgc3RydWN0dXJlIGVsZW1lbnRzIGNicHkgYW5kIGNicGMgYXJlIAotICogICAgICAgICAgICBpZ25vcmVkLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdE1CQ3VyciAtIHBvaW50ZXIgdG8gdXBkYXRlZCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBNQiBhZnRlciBNQi1sZXZlbCBtb3Rpb24gZXN0aW1hdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQuICBUaGUgCi0gKiAgICAgICAgICAgIGZvbGxvd2luZyBzdHJ1Y3R1cmUgbWVtYmVycyBhcmUgdXBkYXRlZCBieSB0aGUgTUUgZnVuY3Rpb246ICAgCi0gKiAgICAgICAgICAgICAgLSAgbWJUeXBlIC0gbWFjcm9ibG9jayB0eXBlOiBPTVhfVkNfSU5UUkEsIE9NWF9WQ19JTlRFUiwgb3IgCi0gKiAgICAgICAgICAgICAgICAgT01YX1ZDX0lOVEVSNFYuIAotICogICAgICAgICAgICAgIC0gIHBNVjBbMl1bMl0gLSBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvcnM7IHJlcHJlc2VudGVkIGluIAotICogICAgICAgICAgICAgICAgIHRlcm1zIG9mIDEvMiBwZWwgdW5pdHMuIAotICogICAgICAgICAgICAgIC0gIHBNVlByZWRbMl1bMl0gLSBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcnM7IHJlcHJlc2VudGVkIAotICogICAgICAgICAgICAgICAgIGluIHRlcm1zIG9mIDEvMiBwZWwgdW5pdHMuIAotICogICAgICAgICAgICBUaGUgc3RydWN0dXJlIG1lbWJlcnMgY2JweSBhbmQgY2JwYyBhcmUgbm90IHVwZGF0ZWQgYnkgdGhlIGZ1bmN0aW9uLiAKLSAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gdGhlIG1pbmltdW0gU0FEIGZvciBJTlRFUjFWLCBvciBzdW0gb2YgbWluaW11bSBTQURzIAotICogICAgICAgICAgICBmb3IgSU5URVI0ViAKLSAqICAgcERzdEJsb2NrU0FEIC0gcG9pbnRlciB0byBhbiBhcnJheSBvZiBTQUQgdmFsdWVzIGZvciBlYWNoIG9mIHRoZSBmb3VyIAotICogICAgICAgICAgICA4eDggbHVtYSBibG9ja3MgaW4gdGhlIE1CLiAgVGhlIGJsb2NrIFNBRHMgYXJlIGluIHNjYW4gb3JkZXIgZm9yIAotICogICAgICAgICAgICBlYWNoIE1CLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKLSAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0N1cnJCdWYsIAotICogICAgICAgICAgICAgIHBTcmNSZWZCdWYsIHBSZWZSZWN0LCBwQ3VyclBvaW50UG9zLCBwTUJJbnRlciwgcE1CSW50cmEsIAotICogICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnIsIG9yIHBEc3RTQUQuIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAyX01vdGlvbkVzdGltYXRpb25NQiAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKLSAgICBPTVhfUzMyIHNyY0N1cnJTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKLSAgICBPTVhfUzMyIHNyY1JlZlN0ZXAsCi0gICAgY29uc3QgT01YUmVjdCpwUmVmUmVjdCwKLSAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAotICAgIHZvaWQgKnBNRVNwZWMsCi0gICAgY29uc3QgT01YVkNNNFAyTUJJbmZvUHRyICpwTUJJbmZvLAotICAgIE9NWFZDTTRQMk1CSW5mbyAqcFNyY0RzdE1CQ3VyciwKLSAgICBPTVhfVTE2ICpwRHN0U0FELAotICAgIE9NWF9VMTYgKnBEc3RCbG9ja1NBRAotKQotewotIAotICAgIE9NWF9JTlQgaW50cmFTQUQsIGF2ZXJhZ2UsIGNvdW50LCBpbmRleCwgeCwgeTsKLSAgICBPTVhWQ01vdGlvblZlY3RvciBkc3RNVjE2eDE2OwotICAgIE9NWF9JTlQgICAgICAgICAgIGRzdFNBRDE2eDE2OwotICAgIE9NWF9JTlQgICAgICAgICAgIGRzdFNBRDh4ODsKLSAgICBPTVhWQ000UDJNRVBhcmFtcyAgKnBNRVBhcmFtczsgCi0JT01YVkNNNFAyQ29vcmRpbmF0ZSBUZW1wQ3VyclBvaW50UG9zOyAKLSAgICBPTVhWQ000UDJDb29yZGluYXRlICpwVGVtcEN1cnJQb2ludFBvczsgCi0gICAgT01YX1U4IGFUZW1wU3JjQ3VyckJ1ZlsyNzFdOwotICAgIE9NWF9VOCAqcFRlbXBTcmNDdXJyQnVmOwotICAgIE9NWF9VOCAqcERzdDsKLSAgICBPTVhfVTggYURzdFs3MV07Ci0gICAgT01YX1MzMiBkc3RTdGVwID0gODsKLSAgICBPTVhfSU5UIHByZWRpY3RUeXBlOwotCU9NWF9TMzIgU2FkOwotICAgIGNvbnN0IE9NWF9VOCAqcFRlbXBTcmNSZWZCdWY7Ci0gICAgT01YVkNNb3Rpb25WZWN0b3IqIHBTcmNDYW5kTVYxWzRdOwotICAgIE9NWFZDTW90aW9uVmVjdG9yKiBwU3JjQ2FuZE1WMls0XTsKLSAgICBPTVhWQ01vdGlvblZlY3RvciogcFNyY0NhbmRNVjNbNF07Ci0gICAgICAgIAotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczE2Qnl0ZUFsaWduZWQocFNyY0N1cnJCdWYpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0JYXJtUmV0QXJnRXJySWYoIWFybUlzMTZCeXRlQWxpZ25lZChwU3JjUmVmQnVmKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCgoc3JjQ3VyclN0ZXAgJSAxNikgfHwgKHNyY1JlZlN0ZXAgJSAxNikpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0JYXJtUmV0QXJnRXJySWYocFNyY0N1cnJCdWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotCWFybVJldEFyZ0VycklmKHBTcmNSZWZCdWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBSZWZSZWN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsgICAgCi0gICAgYXJtUmV0QXJnRXJySWYocEN1cnJQb2ludFBvcyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdE1CQ3VyciA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocERzdFNBRCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgCi0gICAgCi0gICAgcFRlbXBDdXJyUG9pbnRQb3MgPSAmKFRlbXBDdXJyUG9pbnRQb3MpOwotICAgIHBUZW1wU3JjQ3VyckJ1ZiA9IGFybUFsaWduVG8xNkJ5dGVzKGFUZW1wU3JjQ3VyckJ1Zik7Ci0gICAgcE1FUGFyYW1zID0gKE9NWFZDTTRQMk1FUGFyYW1zICopcE1FU3BlYzsKLSAgICBwVGVtcEN1cnJQb2ludFBvcy0+eCA9IHBDdXJyUG9pbnRQb3MtPng7Ci0gICAgcFRlbXBDdXJyUG9pbnRQb3MtPnkgPSBwQ3VyclBvaW50UG9zLT55OwotICAgIHBTcmNEc3RNQkN1cnItPm1iVHlwZSA9IE9NWF9WQ19JTlRFUjsKLSAgICAKLSAgICAvKiBQcmVwYXJpbmcgYSBsaW5lYXIgYnVmZmVyIGZvciBibG9jayBtYXRjaCAqLwotICAgIGZvciAoeSA9IDAsIGluZGV4ID0gY291bnQgPSAwOyB5IDwgMTY7IHkrKywgaW5kZXggKz0gc3JjQ3VyclN0ZXAgLSAxNikKLSAgICB7Ci0gICAgICAgIGZvcih4ID0gMDsgeCA8IDE2OyB4KyssIGNvdW50KyssIGluZGV4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBUZW1wU3JjQ3VyckJ1Zltjb3VudF0gPSBwU3JjQ3VyckJ1ZltpbmRleF07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZm9yKHkgPSAwLCBpbmRleCA9IDA7IHkgPCAyOyB5KyspCi0gICAgewotICAgICAgICBmb3IoeCA9IDA7IHggPCAyOyB4KyssaW5kZXgrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYoKHBNQkluZm9bMF0gIT0gTlVMTCkgJiYgKHBNQkluZm9bMF0tPm1iVHlwZSAhPSBPTVhfVkNfSU5UUkEpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcFNyY0NhbmRNVjFbaW5kZXhdID0gJihwTUJJbmZvWzBdLT5wTVYwW3ldW3hdKTsgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwU3JjQ2FuZE1WMVtpbmRleF0gPSBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoKHBNQkluZm9bMV0gIT0gTlVMTCkgJiYgKHBNQkluZm9bMV0tPm1iVHlwZSAhPSBPTVhfVkNfSU5UUkEpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcFNyY0NhbmRNVjJbaW5kZXhdID0gJihwTUJJbmZvWzFdLT5wTVYwW3ldW3hdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBTcmNDYW5kTVYyW2luZGV4XSA9IE5VTEw7IAotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoKHBNQkluZm9bM10gIT0gTlVMTCkgJiYgKHBNQkluZm9bM10tPm1iVHlwZSAhPSBPTVhfVkNfSU5UUkEpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcFNyY0NhbmRNVjNbaW5kZXhdID0gJihwTUJJbmZvWzNdLT5wTVYwW3ldW3hdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBTcmNDYW5kTVYzW2luZGV4XSA9IE5VTEw7IAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCS8qIENhbGN1bGF0aW5nIFNBRCBhdCBNVigwLDApICovCi0JYXJtVkNDT01NX1NBRChwVGVtcFNyY0N1cnJCdWYsCi0JCQkJCSAgMTYsCi0JCQkJCSAgcFNyY1JlZkJ1ZiwKLQkJCQkJICBzcmNSZWZTdGVwLAotCQkJCQkgICZTYWQsCi0JCQkJCSAgMTYsCi0JCQkJCSAgMTYpOwotCSpwRHN0U0FEID0gU2FkOwotCi0gICAgLyogTW9kZSBkZWNpc2lvbiBmb3IgTk9UX0NPREVEIE1CICovCi0JaWYoKnBEc3RTQUQgPT0gMCkKLQl7Ci0gICAgICAgIHBTcmNEc3RNQkN1cnItPnBNVjBbMF1bMF0uZHggPSAwOwotICAgICAgICBwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzBdLmR5ID0gMDsKLSAgICAgICAgKnBEc3RTQUQgICA9IDA7Ci0JCXJldHVybiBPTVhfU3RzX05vRXJyOwotCX0KLQotICAgIG9teFZDTTRQMl9GaW5kTVZwcmVkKAotICAgICAgICAgICAgICAgICAgICAmKHBTcmNEc3RNQkN1cnItPnBNVjBbMF1bMF0pLAotICAgICAgICAgICAgICAgICAgICBwU3JjQ2FuZE1WMVswXSwKLSAgICAgICAgICAgICAgICAgICAgcFNyY0NhbmRNVjJbMF0sCi0gICAgICAgICAgICAgICAgICAgIHBTcmNDYW5kTVYzWzBdLAotICAgICAgICAgICAgICAgICAgICAmKHBTcmNEc3RNQkN1cnItPnBNVlByZWRbMF1bMF0pLAotICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAwKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgLyogSW50ZXIgMSBNViAqLwotICAgIGFybVZDTTRQMl9CbG9ja01hdGNoXzE2eDE2KAotICAgICAgICBwU3JjUmVmQnVmLAotICAgICAgICBzcmNSZWZTdGVwLAotICAgICAgICBwUmVmUmVjdCwKLSAgICAgICAgcFRlbXBTcmNDdXJyQnVmLAotICAgICAgICBwQ3VyclBvaW50UG9zLAotICAgICAgICAmKHBTcmNEc3RNQkN1cnItPnBNVlByZWRbMF1bMF0pLAotICAgICAgICBOVUxMLAotICAgICAgICBwTUVQYXJhbXMsCi0gICAgICAgICZkc3RNVjE2eDE2LAotICAgICAgICAmZHN0U0FEMTZ4MTYpOwotICAgIAotICAgIC8qIEluaXRpYWxpemUgYWxsIHdpdGggMSBNViB2YWx1ZXMgKi8KLSAgICBwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzBdLmR4ID0gZHN0TVYxNngxNi5keDsKLSAgICBwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzBdLmR5ID0gZHN0TVYxNngxNi5keTsKLSAgICBwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzFdLmR4ID0gZHN0TVYxNngxNi5keDsKLSAgICBwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzFdLmR5ID0gZHN0TVYxNngxNi5keTsKLSAgICBwU3JjRHN0TUJDdXJyLT5wTVYwWzFdWzBdLmR4ID0gZHN0TVYxNngxNi5keDsKLSAgICBwU3JjRHN0TUJDdXJyLT5wTVYwWzFdWzBdLmR5ID0gZHN0TVYxNngxNi5keTsKLSAgICBwU3JjRHN0TUJDdXJyLT5wTVYwWzFdWzFdLmR4ID0gZHN0TVYxNngxNi5keDsKLSAgICBwU3JjRHN0TUJDdXJyLT5wTVYwWzFdWzFdLmR5ID0gZHN0TVYxNngxNi5keTsgCi0gICAgCi0gICAgKnBEc3RTQUQgICA9IGRzdFNBRDE2eDE2OyAgICAgICAKLSAgICAKLSAgICBpZiAocE1FUGFyYW1zLT5zZWFyY2hFbmFibGU4eDgpCi0gICAgewotICAgICAgICAvKiBJbnRlciA0TVYgKi8KLSAgICAgICAgYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfOHg4IChwU3JjUmVmQnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNSZWZTdGVwLCBwUmVmUmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBTcmNDdXJyQnVmLCBwVGVtcEN1cnJQb2ludFBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwU3JjRHN0TUJDdXJyLT5wTVZQcmVkWzBdWzBdKSwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1FUGFyYW1zLCAmKHBTcmNEc3RNQkN1cnItPnBNVjBbMF1bMF0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0U0FEOHg4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgIHBEc3RCbG9ja1NBRFswXSA9IGRzdFNBRDh4ODsKLSAgICAgICAgKnBEc3RTQUQgPSBkc3RTQUQ4eDg7Ci0gICAgICAgIHBUZW1wQ3VyclBvaW50UG9zLT54ICs9IDg7Ci0gICAgICAgIHBTcmNSZWZCdWYgKz0gODsKLSAgICAgICAgb214VkNNNFAyX0ZpbmRNVnByZWQoCi0gICAgICAgICAgICAgICAgICAgICYocFNyY0RzdE1CQ3Vyci0+cE1WMFswXVsxXSksCi0gICAgICAgICAgICAgICAgICAgIHBTcmNDYW5kTVYxWzFdLAotICAgICAgICAgICAgICAgICAgICBwU3JjQ2FuZE1WMlsxXSwKLSAgICAgICAgICAgICAgICAgICAgcFNyY0NhbmRNVjNbMV0sCi0gICAgICAgICAgICAgICAgICAgICYocFNyY0RzdE1CQ3Vyci0+cE1WUHJlZFswXVsxXSksCi0gICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgIDEpOwotICAgICAgICAKLSAgICAgICAgYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfOHg4IChwU3JjUmVmQnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNSZWZTdGVwLCBwUmVmUmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBTcmNDdXJyQnVmLCBwVGVtcEN1cnJQb2ludFBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwU3JjRHN0TUJDdXJyLT5wTVZQcmVkWzBdWzFdKSwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1FUGFyYW1zLCAmKHBTcmNEc3RNQkN1cnItPnBNVjBbMF1bMV0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0U0FEOHg4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgIHBEc3RCbG9ja1NBRFsxXSA9IGRzdFNBRDh4ODsKLSAgICAgICAgKnBEc3RTQUQgKz0gZHN0U0FEOHg4OwotICAgICAgICBwVGVtcEN1cnJQb2ludFBvcy0+eCAtPSA4OwotICAgICAgICBwVGVtcEN1cnJQb2ludFBvcy0+eSArPSA4OwotICAgICAgICBwU3JjUmVmQnVmICs9IChzcmNSZWZTdGVwICogOCkgLSA4OwotICAgICAgICAKLSAgICAgICAgb214VkNNNFAyX0ZpbmRNVnByZWQoCi0gICAgICAgICAgICAgICAgICAgICYocFNyY0RzdE1CQ3Vyci0+cE1WMFsxXVswXSksCi0gICAgICAgICAgICAgICAgICAgIHBTcmNDYW5kTVYxWzJdLAotICAgICAgICAgICAgICAgICAgICBwU3JjQ2FuZE1WMlsyXSwKLSAgICAgICAgICAgICAgICAgICAgcFNyY0NhbmRNVjNbMl0sCi0gICAgICAgICAgICAgICAgICAgICYocFNyY0RzdE1CQ3Vyci0+cE1WUHJlZFsxXVswXSksCi0gICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgIDIpOwotICAgICAgICBhcm1WQ000UDJfQmxvY2tNYXRjaF84eDggKHBTcmNSZWZCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1JlZlN0ZXAsIHBSZWZSZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFNyY0N1cnJCdWYsIHBUZW1wQ3VyclBvaW50UG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBTcmNEc3RNQkN1cnItPnBNVlByZWRbMV1bMF0pLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTUVQYXJhbXMsICYocFNyY0RzdE1CQ3Vyci0+cE1WMFsxXVswXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3RTQUQ4eDgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICAgICAgcERzdEJsb2NrU0FEWzJdID0gZHN0U0FEOHg4OwotICAgICAgICAqcERzdFNBRCArPSBkc3RTQUQ4eDg7Ci0gICAgICAgIHBUZW1wQ3VyclBvaW50UG9zLT54ICs9IDg7Ci0gICAgICAgIHBTcmNSZWZCdWYgKz0gODsKLSAgICAgICAgb214VkNNNFAyX0ZpbmRNVnByZWQoCi0gICAgICAgICAgICAgICAgICAgICYocFNyY0RzdE1CQ3Vyci0+cE1WMFsxXVsxXSksCi0gICAgICAgICAgICAgICAgICAgIHBTcmNDYW5kTVYxWzNdLAotICAgICAgICAgICAgICAgICAgICBwU3JjQ2FuZE1WMlszXSwKLSAgICAgICAgICAgICAgICAgICAgcFNyY0NhbmRNVjNbM10sCi0gICAgICAgICAgICAgICAgICAgICYocFNyY0RzdE1CQ3Vyci0+cE1WUHJlZFsxXVsxXSksCi0gICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgIDMpOwotICAgICAgICBhcm1WQ000UDJfQmxvY2tNYXRjaF84eDggKHBTcmNSZWZCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1JlZlN0ZXAsIHBSZWZSZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFNyY0N1cnJCdWYsIHBUZW1wQ3VyclBvaW50UG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBTcmNEc3RNQkN1cnItPnBNVlByZWRbMV1bMV0pLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTUVQYXJhbXMsICYocFNyY0RzdE1CQ3Vyci0+cE1WMFsxXVsxXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3RTQUQ4eDgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICAgICAgcERzdEJsb2NrU0FEWzNdID0gZHN0U0FEOHg4OwotICAgICAgICAqcERzdFNBRCArPSBkc3RTQUQ4eDg7ICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgLyogQ2hlY2tpbmcgaWYgNE1WIGlzIGVxdWFsIHRvIDFNViAqLwotICAgICAgICBpZiAoCi0gICAgICAgICAgICAocFNyY0RzdE1CQ3Vyci0+cE1WMFswXVswXS5keCAhPSBkc3RNVjE2eDE2LmR4KSB8fAotICAgICAgICAgICAgKHBTcmNEc3RNQkN1cnItPnBNVjBbMF1bMF0uZHkgIT0gZHN0TVYxNngxNi5keSkgfHwKLSAgICAgICAgICAgIChwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzFdLmR4ICE9IGRzdE1WMTZ4MTYuZHgpIHx8Ci0gICAgICAgICAgICAocFNyY0RzdE1CQ3Vyci0+cE1WMFswXVsxXS5keSAhPSBkc3RNVjE2eDE2LmR5KSB8fAotICAgICAgICAgICAgKHBTcmNEc3RNQkN1cnItPnBNVjBbMV1bMF0uZHggIT0gZHN0TVYxNngxNi5keCkgfHwKLSAgICAgICAgICAgIChwU3JjRHN0TUJDdXJyLT5wTVYwWzFdWzBdLmR5ICE9IGRzdE1WMTZ4MTYuZHkpIHx8Ci0gICAgICAgICAgICAocFNyY0RzdE1CQ3Vyci0+cE1WMFsxXVsxXS5keCAhPSBkc3RNVjE2eDE2LmR4KSB8fAotICAgICAgICAgICAgKHBTcmNEc3RNQkN1cnItPnBNVjBbMV1bMV0uZHkgIT0gZHN0TVYxNngxNi5keSkKLSAgICAgICAgICAgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBzZWxlY3QgdGhlIDQgTVYgKi8KLSAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPm1iVHlwZSA9IE9NWF9WQ19JTlRFUjRWOwotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIC8qIGZpbmRpbmcgdGhlIGVycm9yIGluIGludHJhIG1vZGUgKi8KLSAgICBmb3IgKGNvdW50ID0gMCwgYXZlcmFnZSA9IDA7IGNvdW50IDwgMjU2IDsgY291bnQrKykKLSAgICB7Ci0gICAgICAgIGF2ZXJhZ2UgPSBhdmVyYWdlICsgcFRlbXBTcmNDdXJyQnVmW2NvdW50XTsKLSAgICB9Ci0gICAgYXZlcmFnZSA9IGF2ZXJhZ2UvMjU2OwotICAgIAotCWludHJhU0FEID0gMDsKLQotICAgIC8qIEludHJhIFNBRCBjYWxjdWxhdGlvbiAqLwotICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IDI1NiA7IGNvdW50KyspCi0gICAgewotICAgICAgICBpbnRyYVNBRCArPSBhcm1BYnMgKChwVGVtcFNyY0N1cnJCdWZbY291bnRdKSAtIChhdmVyYWdlKSk7Ci0gICAgfQotICAgIAotCS8qIFVzaW5nIHRoZSBNUEVHNCBWTSBmb3JtdWxhIGZvciBpbnRyYS9pbnRlciBtb2RlIGRlY2lzaW9uIAotCSAgIFZhciA8IChTQUQgLSAyKk5CKSB3aGVyZSBOQiA9IE5eMiBpcyB0aGUgbnVtYmVyIG9mIHBpeGVscwotCSAgIG9mIHRoZSBtYWNyb2Jsb2NrLiovCi0KLSAgICBpZiAoaW50cmFTQUQgPD0gKCpwRHN0U0FEIC0gNTEyKSkKLSAgICB7Ci0gICAgICAgIHBTcmNEc3RNQkN1cnItPm1iVHlwZSA9IE9NWF9WQ19JTlRSQTsKLSAgICAgICAgcFNyY0RzdE1CQ3Vyci0+cE1WMFswXVswXS5keCA9IDA7Ci0gICAgICAgIHBTcmNEc3RNQkN1cnItPnBNVjBbMF1bMF0uZHkgPSAwOwotICAgICAgICAqcERzdFNBRCAgID0gaW50cmFTQUQ7Ci0gICAgICAgIHBEc3RCbG9ja1NBRFswXSA9IDB4RkZGRjsKLSAgICAgICAgcERzdEJsb2NrU0FEWzFdID0gMHhGRkZGOwotICAgICAgICBwRHN0QmxvY2tTQURbMl0gPSAweEZGRkY7Ci0gICAgICAgIHBEc3RCbG9ja1NBRFszXSA9IDB4RkZGRjsKLSAgICB9Ci0KLSAgICBpZihwU3JjRHN0TUJDdXJyLT5tYlR5cGUgPT0gT01YX1ZDX0lOVEVSKQotICAgIHsKLSAgICAgIHBUZW1wU3JjUmVmQnVmID0gcFNyY1JlZkJ1ZiArIChzcmNSZWZTdGVwICogZHN0TVYxNngxNi5keSkgKyBkc3RNVjE2eDE2LmR4OwotICAgIAotICAgICAgaWYoKGRzdE1WMTZ4MTYuZHggJiAweDEpICYmIChkc3RNVjE2eDE2LmR5ICYgMHgxKSkKLSAgICAgIHsKLSAgICAgICAgcHJlZGljdFR5cGUgPSBPTVhfVkNfSEFMRl9QSVhFTF9YWTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYoZHN0TVYxNngxNi5keCAmIDB4MSkKLSAgICAgIHsKLSAgICAgICAgcHJlZGljdFR5cGUgPSBPTVhfVkNfSEFMRl9QSVhFTF9YOwotICAgICAgfQotICAgICAgZWxzZSBpZihkc3RNVjE2eDE2LmR5ICYgMHgxKQotICAgICAgewotICAgICAgICBwcmVkaWN0VHlwZSA9IE9NWF9WQ19IQUxGX1BJWEVMX1k7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHByZWRpY3RUeXBlID0gT01YX1ZDX0lOVEVHRVJfUElYRUw7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIHBEc3QgPSBhcm1BbGlnblRvOEJ5dGVzKCYoYURzdFswXSkpOwotICAgICAgLyogQ2FsY3VsYXRpbmcgQmxvY2sgU0FEIGF0IE1WKGRzdE1WMTZ4MTYuZHgsZHN0TVYxNngxNi5keSkgKi8KLQkgIC8qIEJsb2NrIDAgKi8KLSAgICAgIG9teFZDTTRQMl9NQ1JlY29uQmxvY2socFRlbXBTcmNSZWZCdWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNSZWZTdGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEc3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0U3RlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3RUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1FUGFyYW1zLT5ybmRWYWwpOwotICAgIAotICAgICAgYXJtVkNDT01NX1NBRChwVGVtcFNyY0N1cnJCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAxNiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBkc3RTdGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgJlNhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICA4KTsKLSAgICAgIHBEc3RCbG9ja1NBRFswXSA9IFNhZDsKLSAgIAotICAgICAgLyogQmxvY2sgMSAqLwotICAgICAgb214VkNNNFAyX01DUmVjb25CbG9jayhwVGVtcFNyY1JlZkJ1ZiArIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNSZWZTdGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEc3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0U3RlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3RUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1FUGFyYW1zLT5ybmRWYWwpOwkJCQkJICAKLQotICAgICAgYXJtVkNDT01NX1NBRChwVGVtcFNyY0N1cnJCdWYgKyA4LAotICAgICAgICAgICAgICAgICAgICAgICAgMTYsCi0gICAgICAgICAgICAgICAgICAgICAgICBwRHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0U3RlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZTYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICA4LAotICAgICAgICAgICAgICAgICAgICAgICAgOCk7Ci0gICAgICBwRHN0QmxvY2tTQURbMV0gPSBTYWQ7Ci0JCi0gICAgICAvKiBCbG9jayAyICovCi0gICAgICBvbXhWQ000UDJfTUNSZWNvbkJsb2NrKHBUZW1wU3JjUmVmQnVmICsgKHNyY1JlZlN0ZXAqOCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNSZWZTdGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEc3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0U3RlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3RUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1FUGFyYW1zLT5ybmRWYWwpOwotCi0gICAgICBhcm1WQ0NPTU1fU0FEKHBUZW1wU3JjQ3VyckJ1ZiArICgxNio4KSwKLSAgICAgICAgICAgICAgICAgICAgICAgIDE2LAotICAgICAgICAgICAgICAgICAgICAgICAgcERzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0ZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAmU2FkLAotICAgICAgICAgICAgICAgICAgICAgICAgOCwKLSAgICAgICAgICAgICAgICAgICAgICAgIDgpOwotICAgICAgcERzdEJsb2NrU0FEWzJdID0gU2FkOwotCi0JICAvKiBCbG9jayAzICovCi0gICAgICBvbXhWQ000UDJfTUNSZWNvbkJsb2NrKHBUZW1wU3JjUmVmQnVmICsgKHNyY1JlZlN0ZXAqOCkgKyA4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUmVmU3RlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRHN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0ZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNRVBhcmFtcy0+cm5kVmFsKTsKLQotICAgICAgYXJtVkNDT01NX1NBRChwVGVtcFNyY0N1cnJCdWYgKyAoMTYqOCkgKyA4LAotICAgICAgICAgICAgICAgICAgICAgICAgMTYsCi0gICAgICAgICAgICAgICAgICAgICAgICBwRHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0U3RlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZTYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICA4LAotICAgICAgICAgICAgICAgICAgICAgICAgOCk7Ci0gICAgICBwRHN0QmxvY2tTQURbM10gPSBTYWQ7Ci0gICAgfQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDkxZjMxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLSAvKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRmlsZTogICAgICAgIG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmFfUzE2LmMKLSAqIERlc2NyaXB0aW9uOiBDb250YWlucyBtb2R1bGVzIGZvciBBQyBEQyBwcmVkaWN0aW9uCi0gKgotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEgICAoNi4yLjUuNC4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYWRhcHRpdmUgREMvQUMgY29lZmZpY2llbnQgcHJlZGljdGlvbiBmb3IgYW4gaW50cmEgYmxvY2suICBQcmlvciAKLSAqIHRvIHRoZSBmdW5jdGlvbiBjYWxsLCBwcmVkaWN0aW9uIGRpcmVjdGlvbiAocHJlZERpcikgc2hvdWxkIGJlIHNlbGVjdGVkIGFzIAotICogc3BlY2lmaWVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4zLjEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMgdGhlIHF1YW50aXplZCAKLSAqICAgICAgICAgICAgY29lZmZpY2llbnQgcmVzaWR1YWxzIChQUUYpIG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAotICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIAotICogICAgICAgICAgICBzYXR1cmF0ZWQgdG8gdGhlIHJhbmdlIFstMjA0OCwgMjA0N10uIAotICogICBwUHJlZEJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiAKLSAqICAgICAgICAgICAgYSA0LWJ5dGUgYm91bmRhcnkuIAotICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAotICogICBjdXJRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIGN1cnJlbnQgYmxvY2suIGN1clFQIG1heSBlcXVhbCB0byAKLSAqICAgICAgICAgICAgcHJlZFFQIGVzcGVjaWFsbHkgd2hlbiB0aGUgY3VycmVudCBibG9jayBhbmQgdGhlIHByZWRpY3RvciBibG9jayAKLSAqICAgICAgICAgICAgYXJlIGluIHRoZSBzYW1lIG1hY3JvYmxvY2suIAotICogICBwcmVkUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sgCi0gKiAgIHByZWREaXIgLSBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZSBvZiB0aGUgCi0gKiAgICAgICAgICAgIGZvbGxvd2luZyB2YWx1ZXM6IE9NWF9WQ19IT1JJWk9OVEFMIC0gcHJlZGljdCBob3Jpem9udGFsbHkgCi0gKiAgICAgICAgICAgIE9NWF9WQ19WRVJUSUNBTCAtIHByZWRpY3QgdmVydGljYWxseSAKLSAqICAgQUNQcmVkRmxhZyAtIGEgZmxhZyBpbmRpY2F0aW5nIGlmIEFDIHByZWRpY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZC4gSXQgCi0gKiAgICAgICAgICAgIGlzIGVxdWFsIHRvIGFjX3ByZWRfZmxhZyBpbiB0aGUgYml0IHN0cmVhbSBzeW50YXggb2YgTVBFRy00IAotICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlIG9yIGNocm9taW5hbmNlKSBvZiB0aGUgCi0gKiAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMgdGhlIHF1YW50aXplZCAKLSAqICAgICAgICAgICAgY29lZmZpY2llbnRzIChRRikgb2YgdGhlIGN1cnJlbnQgYmxvY2sgCi0gKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyIAotICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlciAgTm90ZTogCi0gKiAgICAgICAgICAgIEJ1ZmZlciB1cGRhdGU6IFVwZGF0ZSB0aGUgQUMgcHJlZGljdGlvbiBidWZmZXIgKGJvdGggcm93IGFuZCAKLSAqICAgICAgICAgICAgY29sdW1uIGJ1ZmZlcikuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKLSAqICAgICAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgICAgICAgcFNyY0RzdCwgcFByZWRCdWZSb3csIG9yIHBQcmVkQnVmQ29sLiAKLSAqICAgICAgICAtICAgIGN1clFQIDw9IDAsIAotICogICAgICAgIC0gICAgcHJlZFFQIDw9IDAsIAotICogICAgICAgIC0gICAgY3VyUVAgPjMxLCAKLSAqICAgICAgICAtICAgIHByZWRRUCA+IDMxLCAKLSAqICAgICAgICAtICAgIHByZURpciBleGNlZWRzIFsxLDJdCi0gKiAgICAgICAgLSAgICBwU3JjRHN0LCBwUHJlZEJ1ZlJvdywgb3IgcFByZWRCdWZDb2wgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEoCi0gICAgIE9NWF9TMTYgKiBwU3JjRHN0LAotICAgICBPTVhfUzE2ICogcFByZWRCdWZSb3csCi0gICAgIE9NWF9TMTYgKiBwUHJlZEJ1ZkNvbCwKLSAgICAgT01YX0lOVCBjdXJRUCwKLSAgICAgT01YX0lOVCBwcmVkUVAsCi0gICAgIE9NWF9JTlQgcHJlZERpciwKLSAgICAgT01YX0lOVCBBQ1ByZWRGbGFnLAotICAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAKLSApCi17Ci0gICAgT01YX1U4IGZsYWc7Ci0gICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFByZWRCdWZSb3cgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBQcmVkQnVmQ29sID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihjdXJRUCA8PSAwLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocHJlZFFQIDw9IDAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihjdXJRUCA+IDMxLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocHJlZFFQID4gMzEsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigocHJlZERpciAhPSAxKSAmJiAocHJlZERpciAhPSAyKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczRCeXRlQWxpZ25lZChwU3JjRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczRCeXRlQWxpZ25lZChwUHJlZEJ1ZlJvdyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM0Qnl0ZUFsaWduZWQocFByZWRCdWZDb2wpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLSAgICBmbGFnID0gMDsKLSAgICByZXR1cm4gYXJtVkNNNFAyX0FDRENQcmVkaWN0KAotICAgICAgICBwU3JjRHN0LAotICAgICAgICBOVUxMLAotICAgICAgICBwUHJlZEJ1ZlJvdywKLSAgICAgICAgcFByZWRCdWZDb2wsCi0gICAgICAgIGN1clFQLAotICAgICAgICBwcmVkUVAsCi0gICAgICAgIHByZWREaXIsCi0gICAgICAgIEFDUHJlZEZsYWcsCi0gICAgICAgIHZpZGVvQ29tcCwKLSAgICAgICAgZmxhZywKLSAgICAgICAgTlVMTCk7Ci0KLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludGVyX0kuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW50ZXJfSS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDU1YjY2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW50ZXJfSS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfUXVhbnRJbnRlcl9JLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGludGVyIFF1YW50aXphdGlvbgotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfUXVhbnRJbnRlcl9JICAgKDYuMi40LjQuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHF1YW50aXphdGlvbiBvbiBhbiBpbnRlciBjb2VmZmljaWVudCBibG9jazsgc3VwcG9ydHMgCi0gKiBiaXRzX3Blcl9waXhlbCA9PSA4LiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgaW50ZXIgYmxvY2sgY29lZmZpY2llbnRzOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKSAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyBtb2RlLCBhbmQgCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChxdWFudGl6ZWQpIGludGVyYmxvY2sgY29lZmZpY2llbnRzLiAgCi0gKiAgICAgICAgICAgIFdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MSwgQUMgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgb24gdGhlIAotICogICAgICAgICAgICBpbnRlcnZhbCBbLTEyNywgMTI3XSwgYW5kIERDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKLSAqICAgICAgICAgICAgaW50ZXJ2YWwgWzEsIDI1NF0uICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTAsIEFDIGNvZWZmaWNpZW50cyAKLSAqICAgICAgICAgICAgYXJlIHNhdHVyYXRlZCBvbiB0aGUgaW50ZXJ2YWwgWy0yMDQ3LCAyMDQ3XS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTC4gCi0gKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0gMzIuIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAyX1F1YW50SW50ZXJfSSgKLSAgICAgT01YX1MxNiAqIHBTcmNEc3QsCi0gICAgIE9NWF9VOCBRUCwKLQkgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pCi17Ci0KLSAgICAvKiBEZWZpbml0aW9ucyBhbmQgSW5pdGlhbGl6YXRpb25zKi8KLSAgICBPTVhfSU5UIGNvZWZmQ291bnQ7Ci0gICAgT01YX0lOVCBmU2lnbjsKLSAgICBPTVhfSU5UIG1heENscEFDID0gMCwgbWluQ2xwQUMgPSAwOwotICAgIE9NWF9JTlQgbWF4Q2xwREMgPSAwLCBtaW5DbHBEQyA9IDA7Ci0gICAgCi0gICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKChRUCA8PSAwKSB8fCAoUVAgPj0gMzIpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgLyogT25lIGFyZ3VtZW50IGNoZWNrIGlzIGRlbGF5ZWQgdW50aWwgd2UgaGF2ZSBhc2NlcnRhaW5lZCB0aGF0ICAqLwotICAgLyogcFFNYXRyaXggaXMgbm90IE5VTEwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIAotICAgIC8qIFNldCB0aGUgQ2xpcCBSYW5nZSBiYXNlZCBvbiBTVkggb24vb2ZmICovCi0gICAgaWYoc2hvcnRWaWRlb0hlYWRlciA9PSAxKQotICAgIHsKLSAgICAgICBtYXhDbHBEQyA9IDI1NDsKLSAgICAgICBtaW5DbHBEQyA9IDE7Ci0gICAgICAgbWF4Q2xwQUMgPSAxMjc7Ci0gICAgICAgbWluQ2xwQUMgPSAtMTI3OyAgICAgICAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG1heENscERDID0gMjA0NzsKLSAgICAgICAgbWluQ2xwREMgPSAtMjA0NzsKLSAgICAgICAgbWF4Q2xwQUMgPSAyMDQ3OwotICAgICAgICBtaW5DbHBBQyA9IC0yMDQ3OyAgIAotICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAvKiBTZWNvbmQgSW52ZXJzZSBxdWFudGlzYXRpb24gbWV0aG9kICovCi0gICAgZm9yIChjb2VmZkNvdW50ID0gMDsgY29lZmZDb3VudCA8IDY0OyBjb2VmZkNvdW50KyspCi0gICAgewotICAgICAgICBmU2lnbiA9ICBhcm1TaWduQ2hlY2sgKHBTcmNEc3RbY29lZmZDb3VudF0pOyAgCi0gICAgICAgIHBTcmNEc3RbY29lZmZDb3VudF0gPSAoYXJtQWJzKHBTcmNEc3RbY29lZmZDb3VudF0pIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAoUVAvMikpLygyICogUVApOwotICAgICAgICBwU3JjRHN0W2NvZWZmQ291bnRdICo9IGZTaWduOwotICAgICAgICAKLSAgICAgICAgLyogQ2xpcCAqLwotICAgICAgICBpZiAoY29lZmZDb3VudCA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgIHBTcmNEc3RbY29lZmZDb3VudF0gPQotICAgICAgICAgICAoT01YX1MxNikgYXJtQ2xpcCAobWluQ2xwREMsIG1heENscERDLCBwU3JjRHN0W2NvZWZmQ291bnRdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSA9Ci0gICAgICAgICAgIChPTVhfUzE2KSBhcm1DbGlwIChtaW5DbHBBQywgbWF4Q2xwQUMsIHBTcmNEc3RbY29lZmZDb3VudF0pOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotCi19Ci0KLS8qIEVuZCBvZiBmaWxlICovCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnRyYV9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludHJhX0kuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk1YjgwMi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludHJhX0kuYworKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAyX1F1YW50SW50cmFfSS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb250YWlucyBtb2R1bGVzIGZvciBpbnRyYSBRdWFudGl6YXRpb24KLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1F1YW50SW50cmFfSSAgICg2LjIuNC40LjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBxdWFudGl6YXRpb24gb24gaW50cmEgYmxvY2sgY29lZmZpY2llbnRzLiBUaGlzIGZ1bmN0aW9uIHN1cHBvcnRzIAotICogYml0c19wZXJfcGl4ZWwgPT0gOC4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IGludHJhIGJsb2NrIGNvZWZmaWNpZW50czsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXplcl9zY2FsZSkuIAotICogICBibG9ja0luZGV4IC0gYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kIHBvc2l0aW9uLCAKLSAqICAgICAgICAgICAgdmFsaWQgaW4gdGhlIHJhbmdlIDAgdG8gNSwgYXMgZGVmaW5lZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSAKLSAqICAgICAgICAgICAgNi4xLjMuOC4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCi0gKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAocXVhbnRpemVkKSBpbnRlcmJsb2NrIGNvZWZmaWNpZW50cy4gIAotICogICAgICAgICAgICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTEsIEFDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKLSAqICAgICAgICAgICAgaW50ZXJ2YWwgWy0xMjcsIDEyN10sIGFuZCBEQyBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCBvbiB0aGUgCi0gKiAgICAgICAgICAgIGludGVydmFsIFsxLCAyNTRdLiAgV2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0wLCBBQyBjb2VmZmljaWVudHMgCi0gKiAgICAgICAgICAgIGFyZSBzYXR1cmF0ZWQgb24gdGhlIGludGVydmFsIFstMjA0NywgMjA0N10uIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgotICogICAgLSAgICBwU3JjRHN0IGlzIE5VTEwuIAotICogICAgLSAgICBibG9ja0luZGV4IDwgMCBvciBibG9ja0luZGV4ID49IDEwIAotICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49IDMyLiAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludHJhX0koCi0gICAgIE9NWF9TMTYgKiBwU3JjRHN0LAotICAgICBPTVhfVTggUVAsCi0gICAgIE9NWF9JTlQgYmxvY2tJbmRleCwKLQkgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0gKQotewotCi0gICAgLyogRGVmaW5pdGlvbnMgYW5kIEluaXRpYWxpemF0aW9ucyovCi0gICAgLyogSW5pdGlhbGl6ZWQgdG8gcmVtb3ZlIGNvbXBpbGF0aW9uIGVycm9yICovCi0gICAgT01YX0lOVCBkY1NjYWxlciA9IDAsIGNvZWZmQ291bnQsZlNpZ247Ci0gICAgT01YX0lOVCBtYXhDbHBBQywgbWluQ2xwQUM7Ci0KLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoKGJsb2NrSW5kZXggPCAwKSB8fCAoYmxvY2tJbmRleCA+PSAxMCkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKChRUCA8PSAwKSB8fCAoUVAgPj0gMzIpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgLyogT25lIGFyZ3VtZW50IGNoZWNrIGlzIGRlbGF5ZWQgdW50aWwgd2UgaGF2ZSBhc2NlcnRhaW5lZCB0aGF0ICAqLwotICAgLyogcFFNYXRyaXggaXMgbm90IE5VTEwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgCi0gICAgLyogU2V0IHRoZSBDbGlwIFJhbmdlIGJhc2VkIG9uIFNWSCBvbi9vZmYgKi8KLSAgICBpZihzaG9ydFZpZGVvSGVhZGVyID09IDEpCi0gICAgewotICAgICAgICBtYXhDbHBBQyA9IDEyNzsKLSAgICAgICAgbWluQ2xwQUMgPSAtMTI3OwotICAgICAgICBkY1NjYWxlciA9IDg7Ci0gICAgICAgIC8qIERlcXVhbnQgdGhlIERDIHZhbHVlLCB0aGlzIGFwcGxpZXMgdG8gYm90aCB0aGUgbWV0aG9kcyAqLwotICAgICAgICBwU3JjRHN0WzBdID0gYXJtSW50RGl2QXdheUZyb21aZXJvIChwU3JjRHN0WzBdLCBkY1NjYWxlcik7Ci0gICAgCi0gICAgICAgIC8qIENsaXAgYmV0d2VlbiAxIGFuZCAyNTQgKi8KLSAgICAgICAgcFNyY0RzdFswXSA9IChPTVhfUzE2KSBhcm1DbGlwICgxLCAyNTQsIHBTcmNEc3RbMF0pOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBtYXhDbHBBQyA9IDIwNDc7Ci0gICAgICAgIG1pbkNscEFDID0gLTIwNDc7ICAgCi0gICAgICAgIC8qIENhbGN1bGF0ZSB0aGUgREMgc2NhbGVyIHZhbHVlICovCi0gICAgICAgIGlmICgoYmxvY2tJbmRleCAgPCA0KSB8fCAoYmxvY2tJbmRleCAgPiA1KSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKFFQID49IDEgJiYgUVAgPD0gNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkY1NjYWxlciA9IDg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChRUCA+PSA1ICYmIFFQIDw9IDgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGNTY2FsZXIgPSAyICogUVA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChRUCA+PSA5ICYmIFFQIDw9IDI0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRjU2NhbGVyID0gUVAgKyA4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRjU2NhbGVyID0gKDIgKiBRUCkgLSAxNjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChibG9ja0luZGV4IDwgNikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKFFQID49IDEgJiYgUVAgPD0gNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkY1NjYWxlciA9IDg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChRUCA+PSA1ICYmIFFQIDw9IDI0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRjU2NhbGVyID0gKFFQICsgMTMpLzI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGNTY2FsZXIgPSBRUCAtIDY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qIERlcXVhbnQgdGhlIERDIHZhbHVlLCB0aGlzIGFwcGxpZXMgdG8gYm90aCB0aGUgbWV0aG9kcyAqLwotICAgICAgICBwU3JjRHN0WzBdID0gYXJtSW50RGl2QXdheUZyb21aZXJvIChwU3JjRHN0WzBdLCBkY1NjYWxlcik7Ci0gICAgfQotICAgIAotICAgIC8qIFNlY29uZCBJbnZlcnNlIHF1YW50aXNhdGlvbiBtZXRob2QgKi8KLSAgICBmb3IgKGNvZWZmQ291bnQgPSAxOyBjb2VmZkNvdW50IDwgNjQ7IGNvZWZmQ291bnQrKykKLSAgICB7Ci0gICAgICAgIGZTaWduID0gIGFybVNpZ25DaGVjayAocFNyY0RzdFtjb2VmZkNvdW50XSk7ICAKLSAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSA9IGFybUFicyhwU3JjRHN0W2NvZWZmQ291bnRdKS8oMiAqIFFQKTsKLSAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSAqPSBmU2lnbjsKLQotICAgICAgICAvKiBDbGlwICovCi0gICAgICAgIHBTcmNEc3RbY29lZmZDb3VudF0gPQotICAgICAgICAoT01YX1MxNikgYXJtQ2xpcCAobWluQ2xwQUMsIG1heENscEFDLCBwU3JjRHN0W2NvZWZmQ291bnRdKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci0KLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludGVyX0kuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50ZXJfSS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODllMjQ0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50ZXJfSS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGludGVyIGludmVyc2UgUXVhbnRpemF0aW9uCi0gKiAKLSAqLyAKLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1F1YW50SW52SW50ZXJfSSAgICg2LjIuNS4zLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyB0aGUgc2Vjb25kIGludmVyc2UgcXVhbnRpemF0aW9uIG1vZGUgb24gYW4gaW50cmEvaW50ZXIgY29kZWQgCi0gKiBibG9jay4gU3VwcG9ydHMgYml0c19wZXJfcGl4ZWwgPSA4LiBUaGUgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgY2xpcHBlZCB0byAKLSAqIHRoZSByYW5nZSBbLTIwNDgsIDIwNDddLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgKHF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2s7IG11c3QgYmUgCi0gKiAgICAgICAgICAgIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGl6ZXJfc2NhbGUpIAotICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSBvZiB0aGUgY3VycmVudCBibG9jay4gVGFrZXMgb25lIG9mIHRoZSAKLSAqICAgICAgICAgICAgZm9sbG93aW5nIGZsYWdzOiBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UgKGludHJhIAotICogICAgICAgICAgICB2ZXJzaW9uIG9ubHkpLiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyIAotICogICAgICAgICAgICAoaW50cmEgdmVyc2lvbiBvbmx5KS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKGRlcXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jayAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBpcyAKLSAqICAgICAgICAgICAgICB0cnVlOiAKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBOVUxMIAotICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49MzEgCi0gKiAgICAtICAgIHZpZGVvQ29tcCBpcyBuZWl0aGVyIE9NWF9WQ19MVU1JTkFOQ0Ugbm9yIE9NWF9WQ19DSFJPTUlOQU5DRS4gCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JKAotICAgICBPTVhfUzE2ICogcFNyY0RzdCwKLSAgICAgT01YX0lOVCBRUAotCSApCi17Ci0KLSAgICBPTVhfSU5UIGNvZWZmQ291bnQsIFNpZ247Ci0gICAgCi0gICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKChRUCA8PSAwKSB8fCAoUVAgPj0gMzIpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotCi0gICAgLyogU2Vjb25kIEludmVyc2UgcXVhbnRpc2F0aW9uIG1ldGhvZCAqLwotICAgIGZvciAoY29lZmZDb3VudCA9IDA7IGNvZWZmQ291bnQgPCA2NDsgY29lZmZDb3VudCsrKQotICAgIHsKLSAgICAgICAgLyogY2hlY2sgc2lnbiAqLwotICAgICAgICBTaWduID0gIGFybVNpZ25DaGVjayAocFNyY0RzdFtjb2VmZkNvdW50XSk7Ci0gICAgICAgICAgICAgIAotICAgICAgICAvKiBRdWFudGl6ZSB0aGUgY29lZmYgKi8KLSAgICAgICAgaWYgKFFQICYgMHgxKQotICAgICAgICB7Ci0gICAgICAgICAgICBwU3JjRHN0W2NvZWZmQ291bnRdID0gKDIqIGFybUFicyhwU3JjRHN0W2NvZWZmQ291bnRdKSArIDEpICogUVA7Ci0gICAgICAgICAgICBwU3JjRHN0W2NvZWZmQ291bnRdICo9IFNpZ247Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwU3JjRHN0W2NvZWZmQ291bnRdID0gKDIqIGFybUFicyhwU3JjRHN0W2NvZWZmQ291bnRdKSArIDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBRUCAtIDE7Ci0gICAgICAgICAgICBwU3JjRHN0W2NvZWZmQ291bnRdICo9IFNpZ247Ci0gICAgICAgIH0KLSAgICAgICAgLyogU2F0dXJhdGUgKi8KLSAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSA9IGFybUNsaXAgKC0yMDQ4LCAyMDQ3LCBwU3JjRHN0W2NvZWZmQ291bnRdKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qIEVuZCBvZiBmaWxlICovCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludHJhX0kuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYyNGNjNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludHJhX0kuYworKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAyX1F1YW50SW52SW50cmFfSS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb250YWlucyBtb2R1bGVzIGZvciBpbnRyYSBpbnZlcnNlIFF1YW50aXphdGlvbgotICogCi0gKi8gCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JICAgKDYuMi41LjMuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHRoZSBzZWNvbmQgaW52ZXJzZSBxdWFudGl6YXRpb24gbW9kZSBvbiBhbiBpbnRyYS9pbnRlciBjb2RlZCAKLSAqIGJsb2NrLiBTdXBwb3J0cyBiaXRzX3Blcl9waXhlbCA9IDguIFRoZSBvdXRwdXQgY29lZmZpY2llbnRzIGFyZSBjbGlwcGVkIHRvIAotICogdGhlIHJhbmdlIFstMjA0OCwgMjA0N10uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCAocXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jazsgbXVzdCBiZSAKLSAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXplcl9zY2FsZSkgCi0gKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBUYWtlcyBvbmUgb2YgdGhlIAotICogICAgICAgICAgICBmb2xsb3dpbmcgZmxhZ3M6IE9NWF9WQ19MVU1JTkFOQ0UsIE9NWF9WQ19DSFJPTUlOQU5DRSAoaW50cmEgCi0gKiAgICAgICAgICAgIHZlcnNpb24gb25seSkuIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXIgCi0gKiAgICAgICAgICAgIChpbnRyYSB2ZXJzaW9uIG9ubHkpLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAoZGVxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGlzIAotICogICAgICAgICAgICAgIHRydWU6IAotICogICAgLSAgICBwU3JjRHN0IGlzIE5VTEwgCi0gKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0zMSAKLSAqICAgIC0gICAgdmlkZW9Db21wIGlzIG5laXRoZXIgT01YX1ZDX0xVTUlOQU5DRSBub3IgT01YX1ZDX0NIUk9NSU5BTkNFLiAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludkludHJhX0koCi0gICAgIE9NWF9TMTYgKiBwU3JjRHN0LAotICAgICBPTVhfSU5UIFFQLAotICAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAsCi0JIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKQotewotCi0gICAgLyogSW5pdGlhbGl6ZWQgdG8gcmVtb3ZlIGNvbXBpbGF0aW9uIGVycm9yICovCi0gICAgT01YX0lOVCBkY1NjYWxlciA9IDAsIGNvZWZmQ291bnQsIFNpZ247Ci0KLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoKFFQIDw9IDApIHx8IChRUCA+PSAzMikpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0JYXJtUmV0QXJnRXJySWYoKCh2aWRlb0NvbXAgIT0gT01YX1ZDX0xVTUlOQU5DRSkgJiYgKHZpZGVvQ29tcCAhPSBPTVhfVkNfQ0hST01JTkFOQ0UpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIAotICAgIC8qIENhbGN1bGF0ZSB0aGUgREMgc2NhbGVyIHZhbHVlICovCi0gICAgCi0gICAgLyogbGluZWFyIGludHJhIERDIG1vZGUgKi8KLSAgICBpZihzaG9ydFZpZGVvSGVhZGVyKQotICAgIHsKLSAgICAgICAgZGNTY2FsZXIgPSA4OwotICAgIH0KLSAgICAvKiBub25saW5lYXIgaW50cmEgREMgbW9kZSAqLwotICAgIGVsc2UKLSAgICB7Ci0gICAgCi0gICAgICAgIGlmICh2aWRlb0NvbXAgPT0gT01YX1ZDX0xVTUlOQU5DRSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKFFQID49IDEgJiYgUVAgPD0gNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkY1NjYWxlciA9IDg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChRUCA+PSA1ICYmIFFQIDw9IDgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGNTY2FsZXIgPSAyICogUVA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChRUCA+PSA5ICYmIFFQIDw9IDI0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRjU2NhbGVyID0gUVAgKyA4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRjU2NhbGVyID0gKDIgKiBRUCkgLSAxNjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGVsc2UgaWYgKHZpZGVvQ29tcCA9PSBPTVhfVkNfQ0hST01JTkFOQ0UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChRUCA+PSAxICYmIFFQIDw9IDQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGNTY2FsZXIgPSA4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoUVAgPj0gNSAmJiBRUCA8PSAyNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkY1NjYWxlciA9IChRUCArIDEzKS8yOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRjU2NhbGVyID0gUVAgLSA2OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIC8qIERlcXVhbnQgdGhlIERDIHZhbHVlLCB0aGlzIGFwcGxpZXMgdG8gYm90aCB0aGUgbWV0aG9kcyAqLwotICAgIHBTcmNEc3RbMF0gPSBwU3JjRHN0WzBdICogZGNTY2FsZXI7Ci0KLSAgICAvKiBTYXR1cmF0ZSAqLwotICAgIHBTcmNEc3RbMF0gPSBhcm1DbGlwICgtMjA0OCwgMjA0NywgcFNyY0RzdFswXSk7Ci0KLSAgICAvKiBTZWNvbmQgSW52ZXJzZSBxdWFudGlzYXRpb24gbWV0aG9kICovCi0gICAgZm9yIChjb2VmZkNvdW50ID0gMTsgY29lZmZDb3VudCA8IDY0OyBjb2VmZkNvdW50KyspCi0gICAgewotICAgICAgICAvKiBjaGVjayBzaWduICovCi0gICAgICAgIFNpZ24gPSAgYXJtU2lnbkNoZWNrIChwU3JjRHN0W2NvZWZmQ291bnRdKTsgIAotCi0gICAgICAgIGlmIChRUCAmIDB4MSkKLSAgICAgICAgewotICAgICAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSA9ICgyKiBhcm1BYnMocFNyY0RzdFtjb2VmZkNvdW50XSkgKyAxKSAqIFFQOwotICAgICAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSAqPSBTaWduOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyKiBhcm1BYnMocFNyY0RzdFtjb2VmZkNvdW50XSkgKyAxKSAqIFFQIC0gMTsKLSAgICAgICAgICAgIHBTcmNEc3RbY29lZmZDb3VudF0gKj0gU2lnbjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFNhdHVyYXRlICovCi0gICAgICAgIHBTcmNEc3RbY29lZmZDb3VudF0gPSBhcm1DbGlwICgtMjA0OCwgMjA0NywgcFNyY0RzdFtjb2VmZkNvdW50XSk7Ci0gICAgfQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotCi19Ci0KLS8qIEVuZCBvZiBmaWxlICovCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MTVhNzcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnRhaW5zIG1vZHVsZXMgRENULT5xdWFudCBhbmQgcmVjb25zdHJ1Y3RpbmcgdGhlIGludGVyIHRleHR1cmUgZGF0YQotICogCi0gKi8gCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlciAgICg2LjIuNC40LjUpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBJbXBsZW1lbnRzIERDVCwgYW5kIHF1YW50aXplcyB0aGUgRENUIGNvZWZmaWNpZW50cyBvZiB0aGUgaW50ZXIgYmxvY2sgCi0gKiB3aGlsZSByZWNvbnN0cnVjdGluZyB0aGUgdGV4dHVyZSByZXNpZHVhbC4gVGhlcmUgaXMgbm8gYm91bmRhcnkgY2hlY2sgZm9yIAotICogdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC1wb2ludGVyIHRvIHRoZSByZXNpZHVhbHMgdG8gYmUgZW5jb2RlZDsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIAotICogICAgICAgICAgICAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyLiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyAKLSAqICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgbW9kZSwgYW5kIAotICogICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50cyBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFJlYyAtIHBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgdGV4dHVyZSByZXNpZHVhbHM7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgZWl0aGVyIE5VTEwgb3IgCi0gKiAgICAgICAgIG5vdCAxNi1ieXRlIGFsaWduZWQ6IAotICogICAgICAgICAgICAtIHBTcmMgCi0gKiAgICAgICAgICAgIC0gcERzdAotICogICAgICAgICAgICAtIHBSZWMKLSAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PSAzMi4gCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIoCi0gICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCi0gICAgIE9NWF9TMTYgKiBwRHN0LAotICAgICBPTVhfUzE2ICogcFJlYywKLSAgICAgT01YX1U4IFFQLAotICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSkKLXsKLSAgICAvKiA2NCBlbGVtZW50cyBhcmUgbmVlZGVkIGJ1dCB0byBhbGlnbiBpdCB0byAxNiBieXRlcyBuZWVkIAotICAgIDggbW9yZSBlbGVtZW50cyBvZiBwYWRkaW5nICovCi0gICAgT01YX1MxNiB0ZW1wQnVmZmVyWzcyXTsKLSAgICBPTVhfUzE2ICpwVGVtcEJ1ZmZlcjsKLSAgICBPTVhfSU5UIGk7Ci0gICAgICAgIAotICAgIC8qIEFsaWduaW5nIHRoZSBsb2NhbCBidWZmZXJzICovCi0gICAgcFRlbXBCdWZmZXIgPSBhcm1BbGlnblRvMTZCeXRlcyh0ZW1wQnVmZmVyKTsKLQotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBSZWMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczE2Qnl0ZUFsaWduZWQocFNyYyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXMxNkJ5dGVBbGlnbmVkKHBSZWMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIWFybUlzMTZCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCgoUVAgPD0gMCkgfHwgKFFQID49IDMyKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAKLSAgICBvbXhWQ000UDJfRENUOHg4YmxrIChwU3JjLCBwRHN0KTsKLSAgICBvbXhWQ000UDJfUXVhbnRJbnRlcl9JKAotICAgICBwRHN0LAotICAgICBRUCwKLSAgICAgc2hvcnRWaWRlb0hlYWRlcik7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKLSAgICB7Ci0gICAgICAgIHBUZW1wQnVmZmVyW2ldID0gcERzdFtpXTsKLSAgICB9Ci0KLSAgICBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JKAotICAgICBwVGVtcEJ1ZmZlciwKLSAgICAgUVApOwotICAgIG9teFZDTTRQMl9JRENUOHg4YmxrIChwVGVtcEJ1ZmZlciwgcFJlYyk7Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkyM2UzZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udGFpbnMgbW9kdWxlcyBEQ1QtPnF1YW50IGFuZCByZWNvbnN0cnVjdGluZyB0aGUgaW50cmEgdGV4dHVyZSBkYXRhCi0gKiAKLSAqLyAKLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhICAgKDYuMi40LjQuNCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFF1YW50aXplcyB0aGUgRENUIGNvZWZmaWNpZW50cywgaW1wbGVtZW50cyBpbnRyYSBibG9jayBBQy9EQyBjb2VmZmljaWVudCAKLSAqIHByZWRpY3Rpb24sIGFuZCByZWNvbnN0cnVjdHMgdGhlIGN1cnJlbnQgaW50cmEgYmxvY2sgdGV4dHVyZSBmb3IgcHJlZGljdGlvbiAKLSAqIG9uIHRoZSBuZXh0IGZyYW1lLiAgUXVhbnRpemVkIHJvdyBhbmQgY29sdW1uIGNvZWZmaWNpZW50cyBhcmUgcmV0dXJuZWQgaW4gCi0gKiB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBidWZmZXJzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgcGl4ZWxzIG9mIGN1cnJlbnQgaW50cmEgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiAKLSAqICAgICAgICAgICAgYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFByZWRCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyIGNvbnRhaW5pbmcgCi0gKiAgICAgICAgICAgICgobnVtX21iX3Blcl9yb3cgKiAyICsgMSkgKiA4KSBlbGVtZW50cyBvZiB0eXBlIE9NWF9TMTYuIAotICogICAgICAgICAgICBDb2VmZmljaWVudHMgYXJlIG9yZ2FuaXplZCBpbnRvIGJsb2NrcyBvZiBlaWdodCBhcyBkZXNjcmliZWQgCi0gKiAgICAgICAgICAgIGJlbG93IChJbnRlcm5hbCBQcmVkaWN0aW9uIENvZWZmaWNpZW50IFVwZGF0ZSBQcm9jZWR1cmVzKS4gIFRoZSAKLSAqICAgICAgICAgICAgREMgY29lZmZpY2llbnQgaXMgZmlyc3QsIGFuZCB0aGUgcmVtYWluaW5nIGJ1ZmZlciBsb2NhdGlvbnMgCi0gKiAgICAgICAgICAgIGNvbnRhaW4gdGhlIHF1YW50aXplZCBBQyBjb2VmZmljaWVudHMuIEVhY2ggZ3JvdXAgb2YgZWlnaHQgcm93IAotICogICAgICAgICAgICBidWZmZXIgZWxlbWVudHMgY29tYmluZWQgd2l0aCBvbmUgZWxlbWVudCBlaWdodCBlbGVtZW50cyBhaGVhZCAKLSAqICAgICAgICAgICAgY29udGFpbnMgdGhlIGNvZWZmaWNpZW50IHByZWRpY3RvcnMgb2YgdGhlIG5laWdoYm9yaW5nIGJsb2NrIAotICogICAgICAgICAgICB0aGF0IGlzIHNwYXRpYWxseSBhYm92ZSBvciB0byB0aGUgbGVmdCBvZiB0aGUgYmxvY2sgY3VycmVudGx5IHRvIAotICogICAgICAgICAgICBiZSBkZWNvZGVkLiBBIG5lZ2F0aXZlLXZhbHVlZCBEQyBjb2VmZmljaWVudCBpbmRpY2F0ZXMgdGhhdCB0aGlzIAotICogICAgICAgICAgICBuZWlnaGJvcmluZyBibG9jayBpcyBub3QgSU5UUkEtY29kZWQgb3Igb3V0IG9mIGJvdW5kcywgYW5kIAotICogICAgICAgICAgICB0aGVyZWZvcmUgdGhlIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgYXJlIGludmFsaWQuICBQb2ludGVyIG11c3QgCi0gKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFByZWRCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSBwcmVkaWN0aW9uIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgCi0gKiAgICAgICAgICAgIGNvbnRhaW5pbmcgMTYgZWxlbWVudHMgb2YgdHlwZSBPTVhfUzE2LiBDb2VmZmljaWVudHMgYXJlIAotICogICAgICAgICAgICBvcmdhbml6ZWQgYXMgZGVzY3JpYmVkIGluIHNlY3Rpb24gNi4yLjIuNS4gIFBvaW50ZXIgbXVzdCBiZSAKLSAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBwU3VtRXJyIC0gcG9pbnRlciB0byBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCBBQyBwcmVkaWN0aW9uIGlzIAotICogICAgICAgICAgICByZXF1aXJlZDsgQUMgcHJlZGljdGlvbiBpcyBlbmFibGVkIGlmICpwU3VtRXJyID49MCwgYnV0IHRoZSAKLSAqICAgICAgICAgICAgdmFsdWUgaXMgbm90IHVzZWQgZm9yIGNvZWZmaWNpZW50IHByZWRpY3Rpb24sIGkuZS4sIHRoZSBzdW0gb2YgCi0gKiAgICAgICAgICAgIGFic29sdXRlIGRpZmZlcmVuY2VzIHN0YXJ0cyBmcm9tIDAgZm9yIGVhY2ggY2FsbCB0byB0aGlzIAotICogICAgICAgICAgICBmdW5jdGlvbi4gIE90aGVyd2lzZSBBQyBwcmVkaWN0aW9uIGlzIGRpc2FibGVkIGlmICpwU3VtRXJyIDwgMCAuIAotICogICBibG9ja0luZGV4IC0gYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kIHBvc2l0aW9uLCBhcyAKLSAqICAgICAgICAgICAgZGVmaW5lZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA2LjEuMy44LiAKLSAqICAgY3VyUXAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBtYWNyb2Jsb2NrIHRvIHdoaWNoIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBibG9jayBiZWxvbmdzIAotICogICBwUXBCdWYgLSBwb2ludGVyIHRvIGEgMi1lbGVtZW50IHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYnVmZmVyOyBwUXBCdWZbMF0gCi0gKiAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgOHg4IAotICogICAgICAgICAgICBibG9jayBsZWZ0IG9mIHRoZSBjdXJyZW50IGJsb2NrIChRUGEpLCBhbmQgcFFwQnVmWzFdIGNvbnRhaW5zIAotICogICAgICAgICAgICB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBhc3NvY2lhdGVkIHdpdGggdGhlIDh4OCBibG9jayBhYm92ZSAKLSAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgYmxvY2sgKFFQYykuICBJbiB0aGUgZXZlbnQgdGhhdCB0aGUgY29ycmVzcG9uZGluZyAKLSAqICAgICAgICAgICAgYmxvY2sgaXMgb3V0c2lkZSBvZiB0aGUgVk9QIGJvdW5kLCB0aGUgUXAgdmFsdWUgd2lsbCBub3QgYWZmZWN0IAotICogICAgICAgICAgICB0aGUgaW50cmEgcHJlZGljdGlvbiBwcm9jZXNzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCAKLSAqICAgICAgICAgICAgc3ViLWNsYXVzZSA3LjQuMy4zLCAgQWRhcHRpdmUgQUMgQ29lZmZpY2llbnQgUHJlZGljdGlvbi4gIAotICogICBzcmNTdGVwIC0gd2lkdGggb2YgdGhlIHNvdXJjZSBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgZHN0U3RlcCAtIHdpZHRoIG9mIHRoZSByZWNvbnN0cnVjdGVkIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIAotICogICAgICAgICAgICBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCi0gKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgYnVmZmVyOyBwRHN0WzBdIGNvbnRhaW5zIAotICogICAgICAgICAgICB0aGUgcHJlZGljdGVkIERDIGNvZWZmaWNpZW50OyB0aGUgcmVtYWluaW5nIGVudHJpZXMgY29udGFpbiB0aGUgCi0gKiAgICAgICAgICAgIHF1YW50aXplZCBBQyBjb2VmZmljaWVudHMgKHdpdGhvdXQgcHJlZGljdGlvbikuICBUaGUgcG9pbnRlciAKLSAqICAgICAgICAgICAgcERzdG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBwUmVjIC0gcG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCB0ZXh0dXJlOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gCi0gKiAgICAgICAgICAgIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyIAotICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlciAKLSAqICAgcFByZUFDUHJlZGljdCAtIGlmIHByZWRpY3Rpb24gaXMgZW5hYmxlZCwgdGhlIHBhcmFtZXRlciBwb2ludHMgdG8gdGhlIAotICogICAgICAgICAgICBzdGFydCBvZiB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGNvZWZmaWNpZW50IGRpZmZlcmVuY2VzIGZvciAKLSAqICAgICAgICAgICAgVkxDIGVuY29kaW5nLiBUaGUgZW50cnkgcFByZUFDUHJlZGljdFswXWluZGljYXRlcyBwcmVkaWN0aW9uIAotICogICAgICAgICAgICBkaXJlY3Rpb24gZm9yIHRoZSBjdXJyZW50IGJsb2NrIGFuZCB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgdmFsdWVzOiBPTVhfVkNfTk9ORSAocHJlZGljdGlvbiBkaXNhYmxlZCksIE9NWF9WQ19IT1JJWk9OVEFMLCBvciAKLSAqICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMLiAgVGhlIGVudHJpZXMgCi0gKiAgICAgICAgICAgIHBQcmVBQ1ByZWRpY3RbMV0tcFByZUFDUHJlZGljdFs3XWNvbnRhaW4gcHJlZGljdGVkIEFDIAotICogICAgICAgICAgICBjb2VmZmljaWVudHMuICBJZiBwcmVkaWN0aW9uIGlzIGRpc2FibGVkICgqcFN1bUVycjwwKSB0aGVuIHRoZSAKLSAqICAgICAgICAgICAgY29udGVudHMgb2YgdGhpcyBidWZmZXIgYXJlIHVuZGVmaW5lZCB1cG9uIHJldHVybiBmcm9tIHRoZSAKLSAqICAgICAgICAgICAgZnVuY3Rpb24gCi0gKiAgIHBTdW1FcnIgLSBwb2ludGVyIHRvIHRoZSB2YWx1ZSBvZiB0aGUgYWNjdW11bGF0ZWQgQUMgY29lZmZpY2llbnQgZXJyb3JzLCAKLSAqICAgICAgICAgICAgaS5lLiwgc3VtIG9mIHRoZSBhYnNvbHV0ZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHByZWRpY3RlZCBhbmQgCi0gKiAgICAgICAgICAgIHVucHJlZGljdGVkIEFDIGNvZWZmaWNpZW50cyAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcERzdCwgcFJlYywgCi0gKiAgICAgICAgIHBDb2VmQnVmUm93LCBwQ29lZkJ1ZkNvbCwgcFFwQnVmLCBwUHJlQUNQcmVkaWN0LCBwU3VtRXJyLiAKLSAqICAgIC0gICAgYmxvY2tJbmRleCA8IDAgb3IgYmxvY2tJbmRleCA+PSAxMDsgCi0gKiAgICAtICAgIGN1clFQIDw9IDAgb3IgY3VyUVAgPj0gMzIuIAotICogICAgLSAgICBzcmNTdGVwLCBvciBkc3RTdGVwIDw9IDAgb3Igbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZDogLiAKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IDgtYnl0ZSBhbGlnbmVkOiAKLSAqICAgICAgICAgcFNyYywgcFJlYy4gIAotICoKLSAqICBOb3RlOiBUaGUgY29lZmZpY2llbnQgYnVmZmVycyBtdXN0IGJlIHVwZGF0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSAKLSAqICAgICAgICB1cGRhdGUgcHJvY2VkdXJlcyBkZWZpbmVkIGluIHNlY3Rpb24gaW4gNi4yLjIuIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhKAotICAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgIE9NWF9TMTYgKiBwRHN0LAotICAgICBPTVhfVTggKiBwUmVjLAotICAgICBPTVhfUzE2ICpwUHJlZEJ1ZlJvdywKLSAgICAgT01YX1MxNiAqcFByZWRCdWZDb2wsCi0gICAgIE9NWF9TMTYgKiBwUHJlQUNQcmVkaWN0LAotICAgICBPTVhfSU5UICpwU3VtRXJyLAotICAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCi0gICAgIE9NWF9VOCBjdXJRcCwKLSAgICAgY29uc3QgT01YX1U4ICpwUXBCdWYsCi0gICAgIE9NWF9JTlQgc3JjU3RlcCwKLSAgICAgT01YX0lOVCBkc3RTdGVwLAotCSBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSkKLXsKLSAgICAvKiA2NCBlbGVtZW50cyBhcmUgbmVlZGVkIGJ1dCB0byBhbGlnbiBpdCB0byAxNiBieXRlcyBuZWVkCi0gICAgOCBtb3JlIGVsZW1lbnRzIG9mIHBhZGRpbmcgKi8KLSAgICBPTVhfUzE2IHRlbXBCdWYxWzc5XSwgdGVtcEJ1ZjJbNzldOwotICAgIE9NWF9TMTYgdGVtcEJ1ZjNbNzldOwotICAgIE9NWF9TMTYgKnBUZW1wQnVmMSwgKnBUZW1wQnVmMiwqcFRlbXBCdWYzOwotICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcDsKLSAgICBPTVhfVTggIGZsYWc7Ci0gICAgT01YX0lOVCB4LCB5LCBjb3VudCwgcHJlZERpcjsKLSAgICBPTVhfSU5UIHByZWRRUCwgQUNQcmVkRmxhZzsKLSAgICAKLQotICAgIC8qIEFsaWduaW5nIHRoZSBsb2NhbCBidWZmZXJzICovCi0gICAgcFRlbXBCdWYxID0gYXJtQWxpZ25UbzE2Qnl0ZXModGVtcEJ1ZjEpOwotICAgIHBUZW1wQnVmMiA9IGFybUFsaWduVG8xNkJ5dGVzKHRlbXBCdWYyKTsKLSAgICBwVGVtcEJ1ZjMgPSBhcm1BbGlnblRvMTZCeXRlcyh0ZW1wQnVmMyk7Ci0KLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwUmVjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM4Qnl0ZUFsaWduZWQocFNyYyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM4Qnl0ZUFsaWduZWQocFJlYyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXMxNkJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFByZWRCdWZSb3cgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBQcmVkQnVmQ29sID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwUHJlQUNQcmVkaWN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwU3VtRXJyID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwUXBCdWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChzcmNTdGVwIDw9IDApIHx8IChkc3RTdGVwIDw9IDApIHx8Ci0gICAgICAgICAgICAgICAgKGRzdFN0ZXAgJiA3KSB8fCAoc3JjU3RlcCAmIDcpCi0gICAgICAgICAgICAgICAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKGJsb2NrSW5kZXggPCAwKSB8fCAoYmxvY2tJbmRleCA+IDkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLSAgICBhcm1SZXRBcmdFcnJJZigoY3VyUXAgPD0gMCkgfHwgKGN1clFwID49MzIpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLQotICAgLyogU2V0dGluZyB0aGUgdmlkZW9Db21wICovCi0gICAgaWYgKGJsb2NrSW5kZXggPD0gMykKLSAgICB7Ci0gICAgICAgIHZpZGVvQ29tcCA9IE9NWF9WQ19MVU1JTkFOQ0U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHZpZGVvQ29tcCA9IE9NWF9WQ19DSFJPTUlOQU5DRTsKLSAgICB9Ci0gICAgLyogQ29udmVydGluZyBmcm9tIDItZCB0byAxLWQgYnVmZmVyICovCi0gICAgZm9yICh5ID0gMCwgY291bnQgPSAwOyB5IDwgODsgeSsrKQotICAgIHsKLSAgICAgICAgZm9yKHg9IDA7IHggPCA4OyB4KyssIGNvdW50KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBUZW1wQnVmMVtjb3VudF0gPSBwU3JjWyh5KnNyY1N0ZXApICsgeF07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBvbXhWQ000UDJfRENUOHg4YmxrICAocFRlbXBCdWYxLCBwVGVtcEJ1ZjIpOwotICAgIG9teFZDTTRQMl9RdWFudEludHJhX0koCi0gICAgICAgIHBUZW1wQnVmMiwKLSAgICAgICAgY3VyUXAsCi0gICAgICAgIGJsb2NrSW5kZXgsCi0gICAgICAgIHNob3J0VmlkZW9IZWFkZXIpOwotCi0gICAgLyogQ29udmVydGluZyBmcm9tIDEtRCB0byAyLUQgYnVmZmVyICovCi0gICAgZm9yICh5ID0gMCwgY291bnQgPSAwOyB5IDwgODsgeSsrKQotICAgIHsKLSAgICAgICAgZm9yKHggPSAwOyB4IDwgODsgeCsrLCBjb3VudCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBzdG9yaW5nIHRlbXBidWYyIHRvIHRlbXBidWYxICovCi0gICAgICAgICAgICBwVGVtcEJ1ZjFbY291bnRdID0gcFRlbXBCdWYyW2NvdW50XTsKLSAgICAgICAgICAgIHBEc3RbKHkqZHN0U3RlcCkgKyB4XSA9IHBUZW1wQnVmMltjb3VudF07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBBQyBhbmQgREMgcHJlZGljdGlvbiAqLwotICAgIGFybVZDTTRQMl9TZXRQcmVkRGlyKAotICAgICAgICBibG9ja0luZGV4LAotICAgICAgICBwUHJlZEJ1ZlJvdywKLSAgICAgICAgcFByZWRCdWZDb2wsCi0gICAgICAgICZwcmVkRGlyLAotICAgICAgICAmcHJlZFFQLAotICAgICAgICBwUXBCdWYpOwotCi0gICAgYXJtUmV0RGF0YUVycklmKCgocHJlZFFQIDw9IDApIHx8IChwcmVkUVAgPj0gMzIpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotCi0gICAgZmxhZyA9IDE7Ci0gICAgaWYgKCpwU3VtRXJyIDwgMCkKLSAgICB7Ci0gICAgICAgIEFDUHJlZEZsYWcgPSAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBBQ1ByZWRGbGFnID0gMTsKLSAgICB9Ci0KLSAgICBhcm1WQ000UDJfQUNEQ1ByZWRpY3QoCi0gICAgICAgIHBUZW1wQnVmMiwKLSAgICAgICAgcFByZUFDUHJlZGljdCwKLSAgICAgICAgcFByZWRCdWZSb3csCi0gICAgICAgIHBQcmVkQnVmQ29sLAotICAgICAgICBjdXJRcCwKLSAgICAgICAgcHJlZFFQLAotICAgICAgICBwcmVkRGlyLAotICAgICAgICBBQ1ByZWRGbGFnLAotICAgICAgICB2aWRlb0NvbXAsCi0gICAgICAgIGZsYWcsCi0gICAgICAgIHBTdW1FcnIpOwotCi0gICAgLyogUmVjb25zdHJ1Y3RpbmcgdGhlIHRleHR1cmUgZGF0YSAqLwotICAgIG9teFZDTTRQMl9RdWFudEludkludHJhX0koCi0gICAgICAgIHBUZW1wQnVmMSwKLSAgICAgICAgY3VyUXAsCi0gICAgICAgIHZpZGVvQ29tcCwKLSAgICAgICAgc2hvcnRWaWRlb0hlYWRlcik7Ci0gICAgb214VkNNNFAyX0lEQ1Q4eDhibGsgKHBUZW1wQnVmMSwgcFRlbXBCdWYzKTsKLSAgICBmb3IoY291bnQgPSAwOyBjb3VudCA8IDY0OyBjb3VudCsrKQotICAgIHsKLSAgICAgICAgcFJlY1tjb3VudF0gPSBhcm1NYXgoMCxwVGVtcEJ1ZjNbY291bnRdKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOTM2ODEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9zcmMvYXJtVkNfVmVyc2lvbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1DT01NX1ZlcnNpb24uaCIKLQotI2lmZGVmIEFSTV9JTkNMVURFX1ZFUlNJT05fREVTQ1JJUFRJT05TCi1jb25zdCBjaGFyICogY29uc3Qgb214VkNfVmVyc2lvbkRlc2NyaXB0aW9uID0gIkFSTSBPcGVuTUFYIERMIHYiIEFSTV9WRVJTSU9OX1NUUklORyAiICAgUmVsPSIgT01YX0FSTV9SRUxFQVNFX1RBRyAiICAgQXJjaD0iIE9NWF9BUk1fQlVJTERfQVJDSElURUNUVVJFICIgICBUb29scz0iICBPTVhfQVJNX0JVSUxEX1RPT0xDSEFJTiA7Ci0jZW5kaWYgLyogQVJNX0lOQ0xVREVfVkVSU0lPTl9ERVNDUklQVElPTlMgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvRGVjVGVzdEJlbmNoLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL0RlY1Rlc3RCZW5jaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWMwMDY1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvRGVjVGVzdEJlbmNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJIMjY0U3dEZWNBcGkuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBDSEVDS19NRU1PUllfVVNBR0UgcHJpbnRzIGFuZCBzdW1zIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGluIGNhbGxzIHRvCi0gKiBIMjY0U3dEZWNNYWxsb2MoKSAqLwotLyogI2RlZmluZSBDSEVDS19NRU1PUllfVVNBR0UgKi8KLQotLyogX05PX09VVCBkaXNhYmxlcyBvdXRwdXQgZmlsZSB3cml0aW5nICovCi0vKiAjZGVmaW5lIF9OT19PVVQgKi8KLQotLyogRGVidWcgcHJpbnRzICovCi0jZGVmaW5lIERFQlVHKGFyZ3YpIHByaW50ZiBhcmd2Ci0KLS8qIENWUyB0YWcgbmFtZSBmb3IgaWRlbnRpZmljYXRpb24gKi8KLWNvbnN0IGNoYXIgdGFnTmFtZVsyNTZdID0gIiROYW1lOiBGSVJTVF9BTkRST0lEX0NPUFlSSUdIVCAkIjsKLQotdm9pZCBXcml0ZU91dHB1dChjaGFyICpmaWxlbmFtZSwgdTggKmRhdGEsIHUzMiBwaWNTaXplKTsKLXUzMiBOZXh0UGFja2V0KHU4ICoqcFN0cm0pOwotdTMyIENyb3BQaWN0dXJlKHU4ICpwT3V0SW1hZ2UsIHU4ICpwSW5JbWFnZSwKLSAgICB1MzIgcGljV2lkdGgsIHUzMiBwaWNIZWlnaHQsIENyb3BQYXJhbXMgKnBDcm9wUGFyYW1zKTsKLQotLyogR2xvYmFsIHZhcmlhYmxlcyBmb3Igc3RyZWFtIGhhbmRsaW5nICovCi11OCAqc3RyZWFtU3RvcCA9IE5VTEw7Ci11MzIgcGFja2V0aXplID0gMDsKLXUzMiBuYWxVbml0U3RyZWFtID0gMDsKLUZJTEUgKmZvdXRwdXQgPSBOVUxMOwotCi0jaWZkZWYgU09DX0RFU0lHTkVSCi0KLS8vIEluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uIGRlZmluZWQgaW4gSW5pdENhY2hlLnMKLWV4dGVybiB2b2lkIGNhY2hlX2luaXQodm9pZCk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiAgJFN1YiQkbWFpbgotCi0gICAgUHVycG9zZToKLSAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXQgdGhlIGVuZCBvZiB0aGUgQyBsaWJyYXJ5IGluaXRpYWxpc2F0aW9uIGFuZAotICAgICAgICBiZWZvcmUgbWFpbi4gSXRzIHB1cnBvc2UgaXMgdG8gZG8gYW55IGZ1cnRoZXIgaW5pdGlhbGlzYXRpb24gYmVmb3JlIHRoZQotICAgICAgICBhcHBsaWNhdGlvbiBzdGFydC4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCAkU3ViJCRtYWluKGNoYXIgYXJnYywgY2hhciAqIGFyZ3ZbXSkKLXsKLSAgY2FjaGVfaW5pdCgpOyAgICAgICAgICAgICAgICAgICAgLy8gZG9lcyBzb21lIGV4dHJhIHNldHVwIHdvcmsgc2V0dGluZyB1cCBjYWNoZXMKLSAgcmV0dXJuICRTdXBlciQkbWFpbihhcmdjLCBhcmd2KTsgLy8gY2FsbHMgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uCi19Ci0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uIG5hbWU6ICBtYWluCi0KLSAgICBQdXJwb3NlOgotICAgICAgICBtYWluIGZ1bmN0aW9uIG9mIGRlY29kZXIgdGVzdGJlbmNoLiBQcm92aWRlcyBjb21tYW5kIGxpbmUgaW50ZXJmYWNlCi0gICAgICAgIHdpdGggZmlsZSBJL08gZm9yIEguMjY0IGRlY29kZXIuIFByaW50cyBvdXQgdGhlIHVzYWdlIGluZm9ybWF0aW9uCi0gICAgICAgIHdoZW4gZXhlY3V0ZWQgd2l0aG91dCBhcmd1bWVudHMuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLQotICAgIHUzMiBpLCB0bXA7Ci0gICAgdTMyIG1heE51bVBpY3MgPSAwOwotICAgIHU4ICpieXRlU3RybVN0YXJ0OwotICAgIHU4ICppbWFnZURhdGE7Ci0gICAgdTggKnRtcEltYWdlID0gTlVMTDsKLSAgICB1MzIgc3RybUxlbjsKLSAgICB1MzIgcGljU2l6ZTsKLSAgICBIMjY0U3dEZWNJbnN0IGRlY0luc3Q7Ci0gICAgSDI2NFN3RGVjUmV0IHJldDsKLSAgICBIMjY0U3dEZWNJbnB1dCBkZWNJbnB1dDsKLSAgICBIMjY0U3dEZWNPdXRwdXQgZGVjT3V0cHV0OwotICAgIEgyNjRTd0RlY1BpY3R1cmUgZGVjUGljdHVyZTsKLSAgICBIMjY0U3dEZWNJbmZvIGRlY0luZm87Ci0gICAgSDI2NFN3RGVjQXBpVmVyc2lvbiBkZWNWZXI7Ci0gICAgdTMyIHBpY0RlY29kZU51bWJlcjsKLSAgICB1MzIgcGljRGlzcGxheU51bWJlcjsKLSAgICB1MzIgbnVtRXJyb3JzID0gMDsKLSAgICB1MzIgY3JvcERpc3BsYXkgPSAwOwotICAgIHUzMiBkaXNhYmxlT3V0cHV0UmVvcmRlcmluZyA9IDA7Ci0KLSAgICBGSUxFICpmaW5wdXQ7Ci0KLSAgICBjaGFyIG91dEZpbGVOYW1lWzI1Nl0gPSAiIjsKLQotICAgIC8qIFByaW50IEFQSSB2ZXJzaW9uIG51bWJlciAqLwotICAgIGRlY1ZlciA9IEgyNjRTd0RlY0dldEFQSVZlcnNpb24oKTsKLSAgICBERUJVRygoIkguMjY0IERlY29kZXIgQVBJIHYlZC4lZFxuIiwgZGVjVmVyLm1ham9yLCBkZWNWZXIubWlub3IpKTsKLQotICAgIC8qIFByaW50IHRhZyBuYW1lIGlmICctVCcgYXJndW1lbnQgcHJlc2VudCAqLwotICAgIGlmICggYXJnYyA+IDEgJiYgc3RyY21wKGFyZ3ZbMV0sICItVCIpID09IDAgKQotICAgIHsKLSAgICAgICAgREVCVUcoKCIlc1xuIiwgdGFnTmFtZSkpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayB0aGF0IGVub3VnaCBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGdpdmVuLCBpZiBub3QgLT4gcHJpbnQgdXNhZ2UKLSAgICAgKiBpbmZvcm1hdGlvbiBvdXQgKi8KLSAgICBpZiAoYXJnYyA8IDIpCi0gICAgewotICAgICAgICBERUJVRygoCi0gICAgICAgICAgICAiVXNhZ2U6ICVzIFstTm5dIFstT291dGZpbGVdIFstUF0gWy1VXSBbLUNdIFstUl0gWy1UXSBmaWxlLmgyNjRcbiIsCi0gICAgICAgICAgICBhcmd2WzBdKSk7Ci0gICAgICAgIERFQlVHKCgiXHQtTm4gZm9yY2VzIGRlY29kaW5nIHRvIHN0b3AgYWZ0ZXIgbiBwaWN0dXJlc1xuIikpOwotI2lmIGRlZmluZWQoX05PX09VVCkKLSAgICAgICAgREVCVUcoKCJcdC1Pb3V0ZmlsZSBvdXRwdXQgd3JpdGluZyBkaXNhYmxlZCBhdCBjb21waWxlIHRpbWVcbiIpKTsKLSNlbHNlCi0gICAgICAgIERFQlVHKCgiXHQtT291dGZpbGUgd3JpdGUgb3V0cHV0IHRvIFwib3V0ZmlsZVwiIChkZWZhdWx0IG91dF93eHh4aHl5eS55dXYpXG4iKSk7Ci0gICAgICAgIERFQlVHKCgiXHQtT25vbmUgZG9lcyBub3Qgd3JpdGUgb3V0cHV0XG4iKSk7Ci0jZW5kaWYKLSAgICAgICAgREVCVUcoKCJcdC1QIHBhY2tldC1ieS1wYWNrZXQgbW9kZVxuIikpOwotICAgICAgICBERUJVRygoIlx0LVUgTkFMIHVuaXQgc3RyZWFtIG1vZGVcbiIpKTsKLSAgICAgICAgREVCVUcoKCJcdC1DIGRpc3BsYXkgY3JvcHBlZCBpbWFnZSAoZGVmYXVsdCBkZWNvZGVkIGltYWdlKVxuIikpOwotICAgICAgICBERUJVRygoIlx0LVIgZGlzYWJsZSBEUEIgb3V0cHV0IHJlb3JkZXJpbmdcbiIpKTsKLSAgICAgICAgREVCVUcoKCJcdC1UIHRvIHByaW50IHRhZyBuYW1lIGFuZCBleGl0XG4iKSk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qIHJlYWQgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyAqLwotICAgIGZvciAoaSA9IDE7IGkgPCAodTMyKShhcmdjLTEpOyBpKyspCi0gICAgewotICAgICAgICBpZiAoIHN0cm5jbXAoYXJndltpXSwgIi1OIiwgMikgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1heE51bVBpY3MgPSAodTMyKWF0b2koYXJndltpXSsyKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggc3RybmNtcChhcmd2W2ldLCAiLU8iLCAyKSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgc3RyY3B5KG91dEZpbGVOYW1lLCBhcmd2W2ldKzIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCBzdHJjbXAoYXJndltpXSwgIi1QIikgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBhY2tldGl6ZSA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIHN0cmNtcChhcmd2W2ldLCAiLVUiKSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgbmFsVW5pdFN0cmVhbSA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIHN0cmNtcChhcmd2W2ldLCAiLUMiKSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgY3JvcERpc3BsYXkgPSAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCBzdHJjbXAoYXJndltpXSwgIi1SIikgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRpc2FibGVPdXRwdXRSZW9yZGVyaW5nID0gMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIG9wZW4gaW5wdXQgZmlsZSBmb3IgcmVhZGluZywgZmlsZSBuYW1lIGdpdmVuIGJ5IHVzZXIuIElmIGZpbGUgb3BlbgotICAgICAqIGZhaWxzIC0+IGV4aXQgKi8KLSAgICBmaW5wdXQgPSBmb3Blbihhcmd2W2FyZ2MtMV0sInJiIik7Ci0gICAgaWYgKGZpbnB1dCA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgREVCVUcoKCJVTkFCTEUgVE8gT1BFTiBJTlBVVCBGSUxFXG4iKSk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKiBjaGVjayBzaXplIG9mIHRoZSBpbnB1dCBmaWxlIC0+IGxlbmd0aCBvZiB0aGUgc3RyZWFtIGluIGJ5dGVzICovCi0gICAgZnNlZWsoZmlucHV0LDBMLFNFRUtfRU5EKTsKLSAgICBzdHJtTGVuID0gKHUzMilmdGVsbChmaW5wdXQpOwotICAgIHJld2luZChmaW5wdXQpOwotCi0gICAgLyogYWxsb2NhdGUgbWVtb3J5IGZvciBzdHJlYW0gYnVmZmVyLiBpZiB1bnN1Y2Nlc3NmdWwgLT4gZXhpdCAqLwotICAgIGJ5dGVTdHJtU3RhcnQgPSAodTggKiltYWxsb2Moc2l6ZW9mKHU4KSpzdHJtTGVuKTsKLSAgICBpZiAoYnl0ZVN0cm1TdGFydCA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgREVCVUcoKCJVTkFCTEUgVE8gQUxMT0NBVEUgTUVNT1JZXG4iKSk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKiByZWFkIGlucHV0IHN0cmVhbSBmcm9tIGZpbGUgdG8gYnVmZmVyIGFuZCBjbG9zZSBpbnB1dCBmaWxlICovCi0gICAgZnJlYWQoYnl0ZVN0cm1TdGFydCwgc2l6ZW9mKHU4KSwgc3RybUxlbiwgZmlucHV0KTsKLSAgICBmY2xvc2UoZmlucHV0KTsKLQotICAgIC8qIGluaXRpYWxpemUgZGVjb2Rlci4gSWYgdW5zdWNjZXNzZnVsIC0+IGV4aXQgKi8KLSAgICByZXQgPSBIMjY0U3dEZWNJbml0KCZkZWNJbnN0LCBkaXNhYmxlT3V0cHV0UmVvcmRlcmluZyk7Ci0gICAgaWYgKHJldCAhPSBIMjY0U1dERUNfT0spCi0gICAgewotICAgICAgICBERUJVRygoIkRFQ09ERVIgSU5JVElBTElaQVRJT04gRkFJTEVEXG4iKSk7Ci0gICAgICAgIGZyZWUoYnl0ZVN0cm1TdGFydCk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKiBpbml0aWFsaXplIEgyNjRTd0RlY0RlY29kZSgpIGlucHV0IHN0cnVjdHVyZSAqLwotICAgIHN0cmVhbVN0b3AgPSBieXRlU3RybVN0YXJ0ICsgc3RybUxlbjsKLSAgICBkZWNJbnB1dC5wU3RyZWFtID0gYnl0ZVN0cm1TdGFydDsKLSAgICBkZWNJbnB1dC5kYXRhTGVuID0gc3RybUxlbjsKLSAgICBkZWNJbnB1dC5pbnRyYUNvbmNlYWxtZW50TWV0aG9kID0gMDsKLQotICAgIC8qIGdldCBwb2ludGVyIHRvIG5leHQgcGFja2V0IGFuZCB0aGUgc2l6ZSBvZiBwYWNrZXQKLSAgICAgKiAoZm9yIHBhY2tldGl6ZSBvciBuYWxVbml0U3RyZWFtIG1vZGVzKSAqLwotICAgIGlmICggKHRtcCA9IE5leHRQYWNrZXQoJmRlY0lucHV0LnBTdHJlYW0pKSAhPSAwICkKLSAgICAgICAgZGVjSW5wdXQuZGF0YUxlbiA9IHRtcDsKLQotICAgIHBpY0RlY29kZU51bWJlciA9IHBpY0Rpc3BsYXlOdW1iZXIgPSAxOwotICAgIC8qIG1haW4gZGVjb2RpbmcgbG9vcCAqLwotICAgIGRvCi0gICAgewotICAgICAgICAvKiBQaWN0dXJlIElEIGlzIHRoZSBwaWN0dXJlIG51bWJlciBpbiBkZWNvZGluZyBvcmRlciAqLwotICAgICAgICBkZWNJbnB1dC5waWNJZCA9IHBpY0RlY29kZU51bWJlcjsKLQotICAgICAgICAvKiBjYWxsIEFQSSBmdW5jdGlvbiB0byBwZXJmb3JtIGRlY29kaW5nICovCi0gICAgICAgIHJldCA9IEgyNjRTd0RlY0RlY29kZShkZWNJbnN0LCAmZGVjSW5wdXQsICZkZWNPdXRwdXQpOwotCi0gICAgICAgIHN3aXRjaChyZXQpCi0gICAgICAgIHsKLQotICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfSERSU19SRFlfQlVGRl9OT1RfRU1QVFk6Ci0gICAgICAgICAgICAgICAgLyogU3RyZWFtIGhlYWRlcnMgd2VyZSBzdWNjZXNzZnVsbHkgZGVjb2RlZAotICAgICAgICAgICAgICAgICAqIC0+IHN0cmVhbSBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgZm9yIHF1ZXJ5IG5vdyAqLwotCi0gICAgICAgICAgICAgICAgcmV0ID0gSDI2NFN3RGVjR2V0SW5mbyhkZWNJbnN0LCAmZGVjSW5mbyk7Ci0gICAgICAgICAgICAgICAgaWYgKHJldCAhPSBIMjY0U1dERUNfT0spCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLQotICAgICAgICAgICAgICAgIERFQlVHKCgiUHJvZmlsZSAlZFxuIiwgZGVjSW5mby5wcm9maWxlKSk7Ci0KLSAgICAgICAgICAgICAgICBERUJVRygoIldpZHRoICVkIEhlaWdodCAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgZGVjSW5mby5waWNXaWR0aCwgZGVjSW5mby5waWNIZWlnaHQpKTsKLQotICAgICAgICAgICAgICAgIGlmIChjcm9wRGlzcGxheSAmJiBkZWNJbmZvLmNyb3BwaW5nRmxhZykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHKCgiQ3JvcHBpbmcgcGFyYW1zOiAoJWQsICVkKSAlZHglZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlY0luZm8uY3JvcFBhcmFtcy5jcm9wTGVmdE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlY0luZm8uY3JvcFBhcmFtcy5jcm9wVG9wT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgZGVjSW5mby5jcm9wUGFyYW1zLmNyb3BPdXRXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlY0luZm8uY3JvcFBhcmFtcy5jcm9wT3V0SGVpZ2h0KSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogQ3JvcHBlZCBmcmFtZSBzaXplIGluIHBsYW5hciBZVVYgNDoyOjAgKi8KLSAgICAgICAgICAgICAgICAgICAgcGljU2l6ZSA9IGRlY0luZm8uY3JvcFBhcmFtcy5jcm9wT3V0V2lkdGggKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjSW5mby5jcm9wUGFyYW1zLmNyb3BPdXRIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIHBpY1NpemUgPSAoMyAqIHBpY1NpemUpLzI7Ci0gICAgICAgICAgICAgICAgICAgIHRtcEltYWdlID0gbWFsbG9jKHBpY1NpemUpOwotICAgICAgICAgICAgICAgICAgICBpZiAodG1wSW1hZ2UgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogRGVjb2RlciBvdXRwdXQgZnJhbWUgc2l6ZSBpbiBwbGFuYXIgWVVWIDQ6MjowICovCi0gICAgICAgICAgICAgICAgICAgIHBpY1NpemUgPSBkZWNJbmZvLnBpY1dpZHRoICogZGVjSW5mby5waWNIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIHBpY1NpemUgPSAoMyAqIHBpY1NpemUpLzI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgREVCVUcoKCJ2aWRlb1JhbmdlICVkLCBtYXRyaXhDb2VmZmljaWVudHMgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgIGRlY0luZm8udmlkZW9SYW5nZSwgZGVjSW5mby5tYXRyaXhDb2VmZmljaWVudHMpKTsKLQotICAgICAgICAgICAgICAgIC8qIHVwZGF0ZSBIMjY0U3dEZWNEZWNvZGUoKSBpbnB1dCBzdHJ1Y3R1cmUsIG51bWJlciBvZiBieXRlcwotICAgICAgICAgICAgICAgICAqICJjb25zdW1lZCIgaXMgY29tcHV0ZWQgYXMgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBuZXcgc3RyZWFtCi0gICAgICAgICAgICAgICAgICogcG9pbnRlciBhbmQgb2xkIHN0cmVhbSBwb2ludGVyICovCi0gICAgICAgICAgICAgICAgZGVjSW5wdXQuZGF0YUxlbiAtPQotICAgICAgICAgICAgICAgICAgICAodTMyKShkZWNPdXRwdXQucFN0cm1DdXJyUG9zIC0gZGVjSW5wdXQucFN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgZGVjSW5wdXQucFN0cmVhbSA9IGRlY091dHB1dC5wU3RybUN1cnJQb3M7Ci0KLSAgICAgICAgICAgICAgICAvKiBJZiAtTyBvcHRpb24gbm90IHVzZWQsIGdlbmVyYXRlIGRlZmF1bHQgZmlsZSBuYW1lICovCi0gICAgICAgICAgICAgICAgaWYgKG91dEZpbGVOYW1lWzBdID09IDApCi0gICAgICAgICAgICAgICAgICAgIHNwcmludGYob3V0RmlsZU5hbWUsICJvdXRfdyVkaCVkLnl1diIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjSW5mby5waWNXaWR0aCwgZGVjSW5mby5waWNIZWlnaHQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEgyNjRTV0RFQ19QSUNfUkRZX0JVRkZfTk9UX0VNUFRZOgotICAgICAgICAgICAgICAgIC8qIFBpY3R1cmUgaXMgcmVhZHkgYW5kIG1vcmUgZGF0YSByZW1haW5zIGluIGlucHV0IGJ1ZmZlcgotICAgICAgICAgICAgICAgICAqIC0+IHVwZGF0ZSBIMjY0U3dEZWNEZWNvZGUoKSBpbnB1dCBzdHJ1Y3R1cmUsIG51bWJlciBvZiBieXRlcwotICAgICAgICAgICAgICAgICAqICJjb25zdW1lZCIgaXMgY29tcHV0ZWQgYXMgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBuZXcgc3RyZWFtCi0gICAgICAgICAgICAgICAgICogcG9pbnRlciBhbmQgb2xkIHN0cmVhbSBwb2ludGVyICovCi0gICAgICAgICAgICAgICAgZGVjSW5wdXQuZGF0YUxlbiAtPQotICAgICAgICAgICAgICAgICAgICAodTMyKShkZWNPdXRwdXQucFN0cm1DdXJyUG9zIC0gZGVjSW5wdXQucFN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgZGVjSW5wdXQucFN0cmVhbSA9IGRlY091dHB1dC5wU3RybUN1cnJQb3M7Ci0gICAgICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCi0KLSAgICAgICAgICAgIGNhc2UgSDI2NFNXREVDX1BJQ19SRFk6Ci0KLSAgICAgICAgICAgICAgICAvKmxpbnQgLWVzeW0oNjQ0LHRtcEltYWdlLHBpY1NpemUpIHZhcmlhYmxlIGluaXRpYWxpemVkIGF0Ci0gICAgICAgICAgICAgICAgICogSDI2NFNXREVDX0hEUlNfUkRZX0JVRkZfTk9UX0VNUFRZIGNhc2UgKi8KLQotICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gSDI2NFNXREVDX1BJQ19SRFkpCi0gICAgICAgICAgICAgICAgICAgIGRlY0lucHV0LmRhdGFMZW4gPSBOZXh0UGFja2V0KCZkZWNJbnB1dC5wU3RyZWFtKTsKLQotICAgICAgICAgICAgICAgIC8qIElmIGVub3VnaCBwaWN0dXJlcyBkZWNvZGVkIC0+IGZvcmNlIGRlY29kaW5nIHRvIGVuZAotICAgICAgICAgICAgICAgICAqIGJ5IHNldHRpbmcgdGhhdCBubyBtb3JlIHN0cmVhbSBpcyBhdmFpbGFibGUgKi8KLSAgICAgICAgICAgICAgICBpZiAobWF4TnVtUGljcyAmJiBwaWNEZWNvZGVOdW1iZXIgPT0gbWF4TnVtUGljcykKLSAgICAgICAgICAgICAgICAgICAgZGVjSW5wdXQuZGF0YUxlbiA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiBJbmNyZW1lbnQgZGVjb2RpbmcgbnVtYmVyIGZvciBldmVyeSBkZWNvZGVkIHBpY3R1cmUgKi8KLSAgICAgICAgICAgICAgICBwaWNEZWNvZGVOdW1iZXIrKzsKLQotICAgICAgICAgICAgICAgIC8qIHVzZSBmdW5jdGlvbiBIMjY0U3dEZWNOZXh0UGljdHVyZSgpIHRvIG9idGFpbiBuZXh0IHBpY3R1cmUKLSAgICAgICAgICAgICAgICAgKiBpbiBkaXNwbGF5IG9yZGVyLiBGdW5jdGlvbiBpcyBjYWxsZWQgdW50aWwgbm8gbW9yZSBpbWFnZXMKLSAgICAgICAgICAgICAgICAgKiBhcmUgcmVhZHkgZm9yIGRpc3BsYXkgKi8KLSAgICAgICAgICAgICAgICB3aGlsZSAoIEgyNjRTd0RlY05leHRQaWN0dXJlKGRlY0luc3QsICZkZWNQaWN0dXJlLCAwKSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgSDI2NFNXREVDX1BJQ19SRFkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUcoKCJQSUMgJWQsIHR5cGUgJXMiLCBwaWNEaXNwbGF5TnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgZGVjUGljdHVyZS5pc0lkclBpY3R1cmUgPyAiSURSIiA6ICJOT04tSURSIikpOwotICAgICAgICAgICAgICAgICAgICBpZiAocGljRGlzcGxheU51bWJlciAhPSBkZWNQaWN0dXJlLnBpY0lkKQotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUcoKCIsIGRlY29kZWQgcGljICVkIiwgZGVjUGljdHVyZS5waWNJZCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZGVjUGljdHVyZS5uYnJPZkVyck1CcykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUcoKCIsIGNvbmNlYWxlZCAlZFxuIiwgZGVjUGljdHVyZS5uYnJPZkVyck1CcykpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHKCgiXG4iKSk7Ci0gICAgICAgICAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOwotCi0gICAgICAgICAgICAgICAgICAgIG51bUVycm9ycyArPSBkZWNQaWN0dXJlLm5ick9mRXJyTUJzOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIEluY3JlbWVudCBkaXNwbGF5IG51bWJlciBmb3IgZXZlcnkgZGlzcGxheWVkIHBpY3R1cmUgKi8KLSAgICAgICAgICAgICAgICAgICAgcGljRGlzcGxheU51bWJlcisrOwotCi0gICAgICAgICAgICAgICAgICAgIC8qbGludCAtZXN5bSg2NDQsZGVjSW5mbykgYWx3YXlzIGluaXRpYWxpemVkIGlmIHBpY3R1cmVzCi0gICAgICAgICAgICAgICAgICAgICAqIGF2YWlsYWJsZSBmb3IgZGlzcGxheSAqLwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFdyaXRlIG91dHB1dCBwaWN0dXJlIHRvIGZpbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgaW1hZ2VEYXRhID0gKHU4KilkZWNQaWN0dXJlLnBPdXRwdXRQaWN0dXJlOwotICAgICAgICAgICAgICAgICAgICBpZiAoY3JvcERpc3BsYXkgJiYgZGVjSW5mby5jcm9wcGluZ0ZsYWcpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IENyb3BQaWN0dXJlKHRtcEltYWdlLCBpbWFnZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjSW5mby5waWNXaWR0aCwgZGVjSW5mby5waWNIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlY0luZm8uY3JvcFBhcmFtcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlT3V0cHV0KG91dEZpbGVOYW1lLCB0bXBJbWFnZSwgcGljU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBXcml0ZU91dHB1dChvdXRGaWxlTmFtZSwgaW1hZ2VEYXRhLCBwaWNTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEgyNjRTV0RFQ19TVFJNX1BST0NFU1NFRDoKLSAgICAgICAgICAgIGNhc2UgSDI2NFNXREVDX1NUUk1fRVJSOgotICAgICAgICAgICAgICAgIC8qIElucHV0IHN0cmVhbSB3YXMgZGVjb2RlZCBidXQgbm8gcGljdHVyZSBpcyByZWFkeQotICAgICAgICAgICAgICAgICAqIC0+IEdldCBtb3JlIGRhdGEgKi8KLSAgICAgICAgICAgICAgICBkZWNJbnB1dC5kYXRhTGVuID0gTmV4dFBhY2tldCgmZGVjSW5wdXQucFN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgREVCVUcoKCJGQVRBTCBFUlJPUlxuIikpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLQotICAgICAgICB9Ci0gICAgLyoga2VlcCBkZWNvZGluZyB1bnRpbCBhbGwgZGF0YSBmcm9tIGlucHV0IHN0cmVhbSBidWZmZXIgY29uc3VtZWQgKi8KLSAgICB9IHdoaWxlIChkZWNJbnB1dC5kYXRhTGVuID4gMCk7Ci0KLSAgICAvKiBpZiBvdXRwdXQgaW4gZGlzcGxheSBvcmRlciBpcyBwcmVmZXJyZWQsIHRoZSBkZWNvZGVyIHNoYWxsIGJlIGZvcmNlZAotICAgICAqIHRvIG91dHB1dCBwaWN0dXJlcyByZW1haW5pbmcgaW4gZGVjb2RlZCBwaWN0dXJlIGJ1ZmZlci4gVXNlIGZ1bmN0aW9uCi0gICAgICogSDI2NFN3RGVjTmV4dFBpY3R1cmUoKSB0byBvYnRhaW4gbmV4dCBwaWN0dXJlIGluIGRpc3BsYXkgb3JkZXIuIEZ1bmN0aW9uCi0gICAgICogaXMgY2FsbGVkIHVudGlsIG5vIG1vcmUgaW1hZ2VzIGFyZSByZWFkeSBmb3IgZGlzcGxheS4gU2Vjb25kIHBhcmFtZXRlcgotICAgICAqIGZvciB0aGUgZnVuY3Rpb24gaXMgc2V0IHRvICcxJyB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgaXMgZW5kIG9mIHRoZQotICAgICAqIHN0cmVhbSBhbmQgYWxsIHBpY3R1cmVzIHNoYWxsIGJlIG91dHB1dCAqLwotICAgIHdoaWxlIChIMjY0U3dEZWNOZXh0UGljdHVyZShkZWNJbnN0LCAmZGVjUGljdHVyZSwgMSkgPT0gSDI2NFNXREVDX1BJQ19SRFkpCi0gICAgewotICAgICAgICBERUJVRygoIlBJQyAlZCwgdHlwZSAlcyIsIHBpY0Rpc3BsYXlOdW1iZXIsCi0gICAgICAgICAgICBkZWNQaWN0dXJlLmlzSWRyUGljdHVyZSA/ICJJRFIiIDogIk5PTi1JRFIiKSk7Ci0gICAgICAgIGlmIChwaWNEaXNwbGF5TnVtYmVyICE9IGRlY1BpY3R1cmUucGljSWQpCi0gICAgICAgICAgICBERUJVRygoIiwgZGVjb2RlZCBwaWMgJWQiLCBkZWNQaWN0dXJlLnBpY0lkKSk7Ci0gICAgICAgIGlmIChkZWNQaWN0dXJlLm5ick9mRXJyTUJzKQotICAgICAgICB7Ci0gICAgICAgICAgICBERUJVRygoIiwgY29uY2VhbGVkICVkXG4iLCBkZWNQaWN0dXJlLm5ick9mRXJyTUJzKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgREVCVUcoKCJcbiIpKTsKLSAgICAgICAgZmZsdXNoKHN0ZG91dCk7Ci0KLSAgICAgICAgbnVtRXJyb3JzICs9IGRlY1BpY3R1cmUubmJyT2ZFcnJNQnM7Ci0KLSAgICAgICAgLyogSW5jcmVtZW50IGRpc3BsYXkgbnVtYmVyIGZvciBldmVyeSBkaXNwbGF5ZWQgcGljdHVyZSAqLwotICAgICAgICBwaWNEaXNwbGF5TnVtYmVyKys7Ci0KLSAgICAgICAgLyogV3JpdGUgb3V0cHV0IHBpY3R1cmUgdG8gZmlsZSAqLwotICAgICAgICBpbWFnZURhdGEgPSAodTgqKWRlY1BpY3R1cmUucE91dHB1dFBpY3R1cmU7Ci0gICAgICAgIGlmIChjcm9wRGlzcGxheSAmJiBkZWNJbmZvLmNyb3BwaW5nRmxhZykKLSAgICAgICAgewotICAgICAgICAgICAgdG1wID0gQ3JvcFBpY3R1cmUodG1wSW1hZ2UsIGltYWdlRGF0YSwKLSAgICAgICAgICAgICAgICBkZWNJbmZvLnBpY1dpZHRoLCBkZWNJbmZvLnBpY0hlaWdodCwKLSAgICAgICAgICAgICAgICAmZGVjSW5mby5jcm9wUGFyYW1zKTsKLSAgICAgICAgICAgIGlmICh0bXApCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgV3JpdGVPdXRwdXQob3V0RmlsZU5hbWUsIHRtcEltYWdlLCBwaWNTaXplKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIFdyaXRlT3V0cHV0KG91dEZpbGVOYW1lLCBpbWFnZURhdGEsIHBpY1NpemUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogcmVsZWFzZSBkZWNvZGVyIGluc3RhbmNlICovCi0gICAgSDI2NFN3RGVjUmVsZWFzZShkZWNJbnN0KTsKLQotICAgIGlmIChmb3V0cHV0KQotICAgICAgICBmY2xvc2UoZm91dHB1dCk7Ci0KLSAgICAvKiBmcmVlIGFsbG9jYXRlZCBidWZmZXJzICovCi0gICAgZnJlZShieXRlU3RybVN0YXJ0KTsKLSAgICBmcmVlKHRtcEltYWdlKTsKLQotICAgIERFQlVHKCgiT3V0cHV0IGZpbGU6ICVzXG4iLCBvdXRGaWxlTmFtZSkpOwotCi0gICAgREVCVUcoKCJERUNPRElORyBET05FXG4iKSk7Ci0gICAgaWYgKG51bUVycm9ycyB8fCBwaWNEZWNvZGVOdW1iZXIgPT0gMSkKLSAgICB7Ci0gICAgICAgIERFQlVHKCgiRVJST1JTIEZPVU5EXG4iKSk7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogIFdyaXRlT3V0cHV0Ci0KLSAgICBQdXJwb3NlOgotICAgICAgICBXcml0ZSBwaWN0dXJlIHBvaW50ZWQgYnkgZGF0YSB0byBmaWxlLiBTaXplIG9mIHRoZQotICAgICAgICBwaWN0dXJlIGluIHBpeGVscyBpcyBpbmRpY2F0ZWQgYnkgcGljU2l6ZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgV3JpdGVPdXRwdXQoY2hhciAqZmlsZW5hbWUsIHU4ICpkYXRhLCB1MzIgcGljU2l6ZSkKLXsKLQotICAgIC8qIGZvdXRwdXQgaXMgZ2xvYmFsIGZpbGUgcG9pbnRlciAqLwotICAgIGlmIChmb3V0cHV0ID09IE5VTEwpCi0gICAgewotICAgICAgICAvKiBvcGVuIG91dHB1dCBmaWxlIGZvciB3cml0aW5nLCBjYW4gYmUgZGlzYWJsZWQgd2l0aCBkZWZpbmUuCi0gICAgICAgICAqIElmIGZpbGUgb3BlbiBmYWlscyAtPiBleGl0ICovCi0gICAgICAgIGlmIChzdHJjbXAoZmlsZW5hbWUsICJub25lIikgIT0gMCkKLSAgICAgICAgewotI2lmICFkZWZpbmVkKF9OT19PVVQpCi0gICAgICAgICAgICBmb3V0cHV0ID0gZm9wZW4oZmlsZW5hbWUsICJ3YiIpOwotICAgICAgICAgICAgaWYgKGZvdXRwdXQgPT0gTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBERUJVRygoIlVOQUJMRSBUTyBPUEVOIE9VVFBVVCBGSUxFXG4iKSk7Ci0gICAgICAgICAgICAgICAgZXhpdCgxMDApOwotICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoZm91dHB1dCAmJiBkYXRhKQotICAgICAgICBmd3JpdGUoZGF0YSwgMSwgcGljU2l6ZSwgZm91dHB1dCk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiBOZXh0UGFja2V0Ci0KLSAgICBQdXJwb3NlOgotICAgICAgICBHZXQgdGhlIHBvaW50ZXIgdG8gc3RhcnQgb2YgbmV4dCBwYWNrZXQgaW4gaW5wdXQgc3RyZWFtLiBVc2VzCi0gICAgICAgIGdsb2JhbCB2YXJpYWJsZXMgJ3BhY2tldGl6ZScgYW5kICduYWxVbml0U3RyZWFtJyB0byBkZXRlcm1pbmUgdGhlCi0gICAgICAgIGRlY29kZXIgaW5wdXQgc3RyZWFtIG1vZGUgYW5kICdzdHJlYW1TdG9wJyB0byBkZXRlcm1pbmUgdGhlIGVuZAotICAgICAgICBvZiBzdHJlYW0uIFRoZXJlIGFyZSB0aHJlZSBwb3NzaWJsZSBzdHJlYW0gbW9kZXM6Ci0gICAgICAgICAgICBkZWZhdWx0IC0gdGhlIHdob2xlIHN0cmVhbSBhdCBvbmNlCi0gICAgICAgICAgICBwYWNrZXRpemUgLSBhIHNpbmdsZSBOQUwtdW5pdCB3aXRoIHN0YXJ0IGNvZGUgcHJlZml4Ci0gICAgICAgICAgICBuYWxVbml0U3RyZWFtIC0gYSBzaW5nbGUgTkFMLXVuaXQgd2l0aG91dCBzdGFydCBjb2RlIHByZWZpeAotCi0gICAgICAgIHBTdHJtIHN0b3JlcyBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiBwcmV2aW91cyBkZWNvZGVyIGlucHV0IGFuZCBpcwotICAgICAgICByZXBsYWNlZCB3aXRoIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGRlY29kZXIgaW5wdXQuCi0KLSAgICAgICAgUmV0dXJucyB0aGUgcGFja2V0IHNpemUgaW4gYnl0ZXMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXUzMiBOZXh0UGFja2V0KHU4ICoqcFN0cm0pCi17Ci0KLSAgICB1MzIgaW5kZXg7Ci0gICAgdTMyIG1heEluZGV4OwotICAgIHUzMiB6ZXJvQ291bnQ7Ci0gICAgdTggKnN0cmVhbTsKLSAgICB1OCBieXRlOwotICAgIHN0YXRpYyB1MzIgcHJldkluZGV4PTA7Ci0KLSAgICAvKiBGb3IgZGVmYXVsdCBzdHJlYW0gbW9kZSBhbGwgdGhlIHN0cmVhbSBpcyBpbiBmaXJzdCBwYWNrZXQgKi8KLSAgICBpZiAoIXBhY2tldGl6ZSAmJiAhbmFsVW5pdFN0cmVhbSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpbmRleCA9IDA7Ci0gICAgc3RyZWFtID0gKnBTdHJtICsgcHJldkluZGV4OwotICAgIG1heEluZGV4ID0gKHUzMikoc3RyZWFtU3RvcCAtIHN0cmVhbSk7Ci0KLSAgICBpZiAobWF4SW5kZXggPT0gMCkKLSAgICAgICAgcmV0dXJuKDApOwotCi0gICAgLyogbGVhZGluZyB6ZXJvcyBvZiBmaXJzdCBOQUwgdW5pdCAqLwotICAgIGRvCi0gICAgewotICAgICAgICBieXRlID0gc3RyZWFtW2luZGV4KytdOwotICAgIH0gd2hpbGUgKGJ5dGUgIT0gMSAmJiBpbmRleCA8IG1heEluZGV4KTsKLQotICAgIC8qIGludmFsaWQgc3RhcnQgY29kZSBwcmVmaXggKi8KLSAgICBpZiAoaW5kZXggPT0gbWF4SW5kZXggfHwgaW5kZXggPCAzKQotICAgIHsKLSAgICAgICAgREVCVUcoKCJJTlZBTElEIEJZVEUgU1RSRUFNXG4iKSk7Ci0gICAgICAgIGV4aXQoMTAwKTsKLSAgICB9Ci0KLSAgICAvKiBuYWxVbml0U3RyZWFtIGlzIHdpdGhvdXQgc3RhcnQgY29kZSBwcmVmaXggKi8KLSAgICBpZiAobmFsVW5pdFN0cmVhbSkKLSAgICB7Ci0gICAgICAgIHN0cmVhbSArPSBpbmRleDsKLSAgICAgICAgbWF4SW5kZXggLT0gaW5kZXg7Ci0gICAgICAgIGluZGV4ID0gMDsKLSAgICB9Ci0KLSAgICB6ZXJvQ291bnQgPSAwOwotCi0gICAgLyogU2VhcmNoIHN0cmVhbSBmb3IgbmV4dCBzdGFydCBjb2RlIHByZWZpeCAqLwotICAgIC8qbGludCAtZSg3MTYpIHdoaWxlKDEpIHVzZWQgY29uc2Npb3VzbHkgKi8KLSAgICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICAgIGJ5dGUgPSBzdHJlYW1baW5kZXgrK107Ci0gICAgICAgIGlmICghYnl0ZSkKLSAgICAgICAgICAgIHplcm9Db3VudCsrOwotCi0gICAgICAgIGlmICggKGJ5dGUgPT0gMHgwMSkgJiYgKHplcm9Db3VudCA+PSAyKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFN0YXJ0IGNvZGUgcHJlZml4IGhhcyB0d28gemVyb3MKLSAgICAgICAgICAgICAqIFRoaXJkIHplcm8gaXMgYXNzdW1lZCB0byBiZSBsZWFkaW5nIHplcm8gb2YgbmV4dCBwYWNrZXQKLSAgICAgICAgICAgICAqIEZvdXJ0aCBhbmQgbW9yZSB6ZXJvcyBhcmUgYXNzdW1lZCB0byBiZSB0cmFpbGluZyB6ZXJvcyBvZiB0aGlzCi0gICAgICAgICAgICAgKiBwYWNrZXQgKi8KLSAgICAgICAgICAgIGlmICh6ZXJvQ291bnQgPiAzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGluZGV4IC09IDQ7Ci0gICAgICAgICAgICAgICAgemVyb0NvdW50IC09IDM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW5kZXggLT0gemVyb0NvdW50KzE7Ci0gICAgICAgICAgICAgICAgemVyb0NvdW50ID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGJ5dGUpCi0gICAgICAgICAgICB6ZXJvQ291bnQgPSAwOwotCi0gICAgICAgIGlmIChpbmRleCA9PSBtYXhJbmRleCkKLSAgICAgICAgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qIFN0b3JlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFja2V0ICovCi0gICAgKnBTdHJtID0gc3RyZWFtOwotICAgIHByZXZJbmRleCA9IGluZGV4OwotCi0gICAgLyogbmFsVW5pdFN0cmVhbSBpcyB3aXRob3V0IHRyYWlsaW5nIHplcm9zICovCi0gICAgaWYgKG5hbFVuaXRTdHJlYW0pCi0gICAgICAgIGluZGV4IC09IHplcm9Db3VudDsKLQotICAgIHJldHVybihpbmRleCk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uIG5hbWU6IENyb3BQaWN0dXJlCi0KLSAgICBQdXJwb3NlOgotICAgICAgICBQZXJmb3JtIGNyb3BwaW5nIGZvciBwaWN0dXJlLiBJbnB1dCBwaWN0dXJlIHBJbkltYWdlIHdpdGggZGltZW5zaW9ucwotICAgICAgICBwaWNXaWR0aCB4IHBpY0hlaWdodCBpcyBjcm9wcGVkIHdpdGggcENyb3BQYXJhbXMgYW5kIHRoZSByZXN1bHRpbmcKLSAgICAgICAgcGljdHVyZSBpcyBzdG9yZWQgaW4gcE91dEltYWdlLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdTMyIENyb3BQaWN0dXJlKHU4ICpwT3V0SW1hZ2UsIHU4ICpwSW5JbWFnZSwKLSAgICB1MzIgcGljV2lkdGgsIHUzMiBwaWNIZWlnaHQsIENyb3BQYXJhbXMgKnBDcm9wUGFyYW1zKQotewotCi0gICAgdTMyIGksIGo7Ci0gICAgdTMyIG91dFdpZHRoLCBvdXRIZWlnaHQ7Ci0gICAgdTggKnBPdXQsICpwSW47Ci0KLSAgICBpZiAocE91dEltYWdlID09IE5VTEwgfHwgcEluSW1hZ2UgPT0gTlVMTCB8fCBwQ3JvcFBhcmFtcyA9PSBOVUxMIHx8Ci0gICAgICAgICFwaWNXaWR0aCB8fCAhcGljSGVpZ2h0KQotICAgIHsKLSAgICAgICAgLyoganVzdCB0byBwcmV2ZW50IGxpbnQgd2FybmluZywgcmV0dXJuaW5nIG5vbi16ZXJvIHdpbGwgcmVzdWx0IGluCi0gICAgICAgICAqIHJldHVybiB3aXRob3V0IGZyZWVpbmcgdGhlIG1lbW9yeSAqLwotICAgICAgICBmcmVlKHBPdXRJbWFnZSk7Ci0gICAgICAgIHJldHVybigxKTsKLSAgICB9Ci0KLSAgICBpZiAoICgocENyb3BQYXJhbXMtPmNyb3BMZWZ0T2Zmc2V0ICsgcENyb3BQYXJhbXMtPmNyb3BPdXRXaWR0aCkgPgotICAgICAgICAgICBwaWNXaWR0aCApIHx8Ci0gICAgICAgICAoKHBDcm9wUGFyYW1zLT5jcm9wVG9wT2Zmc2V0ICsgcENyb3BQYXJhbXMtPmNyb3BPdXRIZWlnaHQpID4KLSAgICAgICAgICAgcGljSGVpZ2h0ICkgKQotICAgIHsKLSAgICAgICAgLyoganVzdCB0byBwcmV2ZW50IGxpbnQgd2FybmluZywgcmV0dXJuaW5nIG5vbi16ZXJvIHdpbGwgcmVzdWx0IGluCi0gICAgICAgICAqIHJldHVybiB3aXRob3V0IGZyZWVpbmcgdGhlIG1lbW9yeSAqLwotICAgICAgICBmcmVlKHBPdXRJbWFnZSk7Ci0gICAgICAgIHJldHVybigxKTsKLSAgICB9Ci0KLSAgICBvdXRXaWR0aCA9IHBDcm9wUGFyYW1zLT5jcm9wT3V0V2lkdGg7Ci0gICAgb3V0SGVpZ2h0ID0gcENyb3BQYXJhbXMtPmNyb3BPdXRIZWlnaHQ7Ci0KLSAgICAvKiBDYWxjdWxhdGUgc3RhcnRpbmcgcG9pbnRlciBmb3IgbHVtYSAqLwotICAgIHBJbiA9IHBJbkltYWdlICsgcENyb3BQYXJhbXMtPmNyb3BUb3BPZmZzZXQqcGljV2lkdGggKwotICAgICAgICBwQ3JvcFBhcmFtcy0+Y3JvcExlZnRPZmZzZXQ7Ci0gICAgcE91dCA9IHBPdXRJbWFnZTsKLQotICAgIC8qIENvcHkgbHVtYSBwaXhlbCB2YWx1ZXMgKi8KLSAgICBmb3IgKGkgPSBvdXRIZWlnaHQ7IGk7IGktLSkKLSAgICB7Ci0gICAgICAgIGZvciAoaiA9IG91dFdpZHRoOyBqOyBqLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgICpwT3V0KysgPSAqcEluKys7Ci0gICAgICAgIH0KLSAgICAgICAgcEluICs9IHBpY1dpZHRoIC0gb3V0V2lkdGg7Ci0gICAgfQotCi0gICAgb3V0V2lkdGggPj49IDE7Ci0gICAgb3V0SGVpZ2h0ID4+PSAxOwotCi0gICAgLyogQ2FsY3VsYXRlIHN0YXJ0aW5nIHBvaW50ZXIgZm9yIGNiICovCi0gICAgcEluID0gcEluSW1hZ2UgKyBwaWNXaWR0aCpwaWNIZWlnaHQgKwotICAgICAgICBwQ3JvcFBhcmFtcy0+Y3JvcFRvcE9mZnNldCpwaWNXaWR0aC80ICsgcENyb3BQYXJhbXMtPmNyb3BMZWZ0T2Zmc2V0LzI7Ci0KLSAgICAvKiBDb3B5IGNiIHBpeGVsIHZhbHVlcyAqLwotICAgIGZvciAoaSA9IG91dEhlaWdodDsgaTsgaS0tKQotICAgIHsKLSAgICAgICAgZm9yIChqID0gb3V0V2lkdGg7IGo7IGotLSkKLSAgICAgICAgewotICAgICAgICAgICAgKnBPdXQrKyA9ICpwSW4rKzsKLSAgICAgICAgfQotICAgICAgICBwSW4gKz0gcGljV2lkdGgvMiAtIG91dFdpZHRoOwotICAgIH0KLQotICAgIC8qIENhbGN1bGF0ZSBzdGFydGluZyBwb2ludGVyIGZvciBjciAqLwotICAgIHBJbiA9IHBJbkltYWdlICsgNSpwaWNXaWR0aCpwaWNIZWlnaHQvNCArCi0gICAgICAgIHBDcm9wUGFyYW1zLT5jcm9wVG9wT2Zmc2V0KnBpY1dpZHRoLzQgKyBwQ3JvcFBhcmFtcy0+Y3JvcExlZnRPZmZzZXQvMjsKLQotICAgIC8qIENvcHkgY3IgcGl4ZWwgdmFsdWVzICovCi0gICAgZm9yIChpID0gb3V0SGVpZ2h0OyBpOyBpLS0pCi0gICAgewotICAgICAgICBmb3IgKGogPSBvdXRXaWR0aDsgajsgai0tKQotICAgICAgICB7Ci0gICAgICAgICAgICAqcE91dCsrID0gKnBJbisrOwotICAgICAgICB9Ci0gICAgICAgIHBJbiArPSBwaWNXaWR0aC8yIC0gb3V0V2lkdGg7Ci0gICAgfQotCi0gICAgcmV0dXJuICgwKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uIG5hbWU6ICBIMjY0U3dEZWNUcmFjZQotCi0gICAgUHVycG9zZToKLSAgICAgICAgRXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBIMjY0U3dEZWNUcmFjZSBmdW5jdGlvbi4gUHJvdG90eXBlIG9mIHRoaXMKLSAgICAgICAgZnVuY3Rpb24gaXMgZ2l2ZW4gaW4gSDI2NFN3RGVjQXBpLmguIFRoaXMgaW1wbGVtZW50YXRpb24gYXBwZW5kcwotICAgICAgICB0cmFjZSBtZXNzYWdlcyB0byBmaWxlIG5hbWVkICdkZWNfYXBpLnRyYycuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIEgyNjRTd0RlY1RyYWNlKGNoYXIgKnN0cmluZykKLXsKLSAgICBGSUxFICpmcDsKLQotICAgIGZwID0gZm9wZW4oImRlY19hcGkudHJjIiwgImF0Iik7Ci0KLSAgICBpZiAoIWZwKQotICAgICAgICByZXR1cm47Ci0KLSAgICBmd3JpdGUoc3RyaW5nLCAxLCBzdHJsZW4oc3RyaW5nKSwgZnApOwotICAgIGZ3cml0ZSgiXG4iLCAxLDEsIGZwKTsKLQotICAgIGZjbG9zZShmcCk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjTWFsbG9jCi0KLSAgICBQdXJwb3NlOgotICAgICAgICBFeGFtcGxlIGltcGxlbWVudGF0aW9uIG9mIEgyNjRTd0RlY01hbGxvYyBmdW5jdGlvbi4gUHJvdG90eXBlIG9mIHRoaXMKLSAgICAgICAgZnVuY3Rpb24gaXMgZ2l2ZW4gaW4gSDI2NFN3RGVjQXBpLmguIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcwotICAgICAgICBsaWJyYXJ5IGZ1bmN0aW9uIG1hbGxvYyBmb3IgYWxsb2NhdGlvbiBvZiBtZW1vcnkuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkKiBIMjY0U3dEZWNNYWxsb2ModTMyIHNpemUsIHUzMiBudW0pCi17Ci0gICAgaWYgKHNpemUgPiBVSU5UMzJfTUFYIC8gbnVtKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotI2lmIGRlZmluZWQoQ0hFQ0tfTUVNT1JZX1VTQUdFKQotICAgIC8qIE5vdGUgdGhhdCBpZiB0aGUgZGVjb2RlciBoYXMgdG8gZnJlZSBhbmQgcmVhbGxvY2F0ZSBzb21lIG9mIHRoZSBidWZmZXJzCi0gICAgICogdGhlIHRvdGFsIHZhbHVlIHdpbGwgYmUgaW52YWxpZCAqLwotICAgIHN0YXRpYyB1MzIgbnVtQnl0ZXMgPSAwOwotICAgIG51bUJ5dGVzICs9IHNpemUgKiBudW07Ci0gICAgREVCVUcoKCJBbGxvY2F0ZWQgJWQgYnl0ZXMsIHRvdGFsICVkXG4iLCBzaXplLCBudW1CeXRlcykpOwotI2VuZGlmCi0KLSAgICByZXR1cm4gbWFsbG9jKHNpemUgKiBudW0pOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogIEgyNjRTd0RlY0ZyZWUKLQotICAgIFB1cnBvc2U6Ci0gICAgICAgIEV4YW1wbGUgaW1wbGVtZW50YXRpb24gb2YgSDI2NFN3RGVjRnJlZSBmdW5jdGlvbi4gUHJvdG90eXBlIG9mIHRoaXMKLSAgICAgICAgZnVuY3Rpb24gaXMgZ2l2ZW4gaW4gSDI2NFN3RGVjQXBpLmguIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcwotICAgICAgICBsaWJyYXJ5IGZ1bmN0aW9uIGZyZWUgZm9yIGZyZWVpbmcgb2YgbWVtb3J5LgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBIMjY0U3dEZWNGcmVlKHZvaWQgKnB0cikKLXsKLSAgICBmcmVlKHB0cik7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjTWVtY3B5Ci0KLSAgICBQdXJwb3NlOgotICAgICAgICBFeGFtcGxlIGltcGxlbWVudGF0aW9uIG9mIEgyNjRTd0RlY01lbWNweSBmdW5jdGlvbi4gUHJvdG90eXBlIG9mIHRoaXMKLSAgICAgICAgZnVuY3Rpb24gaXMgZ2l2ZW4gaW4gSDI2NFN3RGVjQXBpLmguIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcwotICAgICAgICBsaWJyYXJ5IGZ1bmN0aW9uIG1lbWNweSB0byBjb3B5IHNyYyB0byBkZXN0LgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBIMjY0U3dEZWNNZW1jcHkodm9pZCAqZGVzdCwgdm9pZCAqc3JjLCB1MzIgY291bnQpCi17Ci0gICAgbWVtY3B5KGRlc3QsIHNyYywgY291bnQpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogIEgyNjRTd0RlY01lbXNldAotCi0gICAgUHVycG9zZToKLSAgICAgICAgRXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBIMjY0U3dEZWNNZW1zZXQgZnVuY3Rpb24uIFByb3RvdHlwZSBvZiB0aGlzCi0gICAgICAgIGZ1bmN0aW9uIGlzIGdpdmVuIGluIEgyNjRTd0RlY0FwaS5oLiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMKLSAgICAgICAgbGlicmFyeSBmdW5jdGlvbiBtZW1zZXQgdG8gc2V0IGNvbnRlbnQgb2YgbWVtb3J5IGFyZWEgcG9pbnRlZCBieSBwdHIuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIEgyNjRTd0RlY01lbXNldCh2b2lkICpwdHIsIGkzMiB2YWx1ZSwgdTMyIGNvdW50KQotewotICAgIG1lbXNldChwdHIsIHZhbHVlLCBjb3VudCk7Ci19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvRXZhbHVhdGlvblRlc3RCZW5jaC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9FdmFsdWF0aW9uVGVzdEJlbmNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NTZhMWYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9FdmFsdWF0aW9uVGVzdEJlbmNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJIMjY0U3dEZWNBcGkuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi12b2lkIFdyaXRlT3V0cHV0KEZJTEUgKmZpZCwgdTggKmRhdGEsIHUzMiBwaWNTaXplKTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uIG5hbWU6ICBtYWluCi0KLSAgICBQdXJwb3NlOgotICAgICAgICBtYWluIGZ1bmN0aW9uLiBBc3N1bWluZyB0aGF0IGV4ZWN1dGFibGUgaXMgbmFtZWQgJ2RlY29kZXInIHRoZSB1c2FnZQotICAgICAgICBpcyBhcyBmb2xsb3dzCi0KLSAgICAgICAgICAgIGRlY29kZXIgaW5wdXRGaWxlTmFtZQotCi0gICAgICAgICwgd2hlcmUgaW5wdXRGaWxlTmFtZSBzaGFsbCBiZSBuYW1lIG9mIGZpbGUgY29udGFpbmluZyBoMjY0IHN0cmVhbQotICAgICAgICBkYXRhLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotCi0gICAgdTggKmJ5dGVTdHJtU3RhcnQ7Ci0gICAgdTggKmJ5dGVTdHJtOwotICAgIHUzMiBzdHJtTGVuOwotICAgIHUzMiBwaWNTaXplOwotICAgIEgyNjRTd0RlY0luc3QgZGVjSW5zdDsKLSAgICBIMjY0U3dEZWNSZXQgcmV0OwotICAgIEgyNjRTd0RlY0lucHV0IGRlY0lucHV0OwotICAgIEgyNjRTd0RlY091dHB1dCBkZWNPdXRwdXQ7Ci0gICAgSDI2NFN3RGVjUGljdHVyZSBkZWNQaWN0dXJlOwotICAgIEgyNjRTd0RlY0luZm8gZGVjSW5mbzsKLSAgICB1MzIgcGljTnVtYmVyOwotCi0gICAgRklMRSAqZmlucHV0OwotICAgIEZJTEUgKmZvdXRwdXQ7Ci0KLSAgICAvKiBDaGVjayB0aGF0IGVub3VnaCBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGdpdmVuLCBpZiBub3QgLT4gcHJpbnQgdXNhZ2UKLSAgICAgKiBpbmZvcm1hdGlvbiBvdXQgKi8KLSAgICBpZiAoYXJnYyA8IDIpCi0gICAgewotICAgICAgICBwcmludGYoICJVc2FnZTogJXMgZmlsZS5oMjY0XG4iLCBhcmd2WzBdKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qIG9wZW4gb3V0cHV0IGZpbGUgZm9yIHdyaXRpbmcsIG91dHB1dCBmaWxlIG5hbWVkIG91dC55dXYuIElmIGZpbGUgb3BlbgotICAgICAqIGZhaWxzIC0+IGV4aXQgKi8KLSAgICBmb3V0cHV0ID0gZm9wZW4oIm91dC55dXYiLCAid2IiKTsKLSAgICBpZiAoZm91dHB1dCA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgcHJpbnRmKCJVTkFCTEUgVE8gT1BFTiBPVVRQVVQgRklMRVxuIik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKiBvcGVuIGlucHV0IGZpbGUgZm9yIHJlYWRpbmcsIGZpbGUgbmFtZSBnaXZlbiBieSB1c2VyLiBJZiBmaWxlIG9wZW4KLSAgICAgKiBmYWlscyAtPiBleGl0ICovCi0gICAgZmlucHV0ID0gZm9wZW4oYXJndlthcmdjLTFdLCAicmIiKTsKLSAgICBpZiAoZmlucHV0ID09IE5VTEwpCi0gICAgewotICAgICAgICBwcmludGYoIlVOQUJMRSBUTyBPUEVOIElOUFVUIEZJTEVcbiIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLyogY2hlY2sgc2l6ZSBvZiB0aGUgaW5wdXQgZmlsZSAtPiBsZW5ndGggb2YgdGhlIHN0cmVhbSBpbiBieXRlcyAqLwotICAgIGZzZWVrKGZpbnB1dCwgMEwsIFNFRUtfRU5EKTsKLSAgICBzdHJtTGVuID0gKHUzMilmdGVsbChmaW5wdXQpOwotICAgIHJld2luZChmaW5wdXQpOwotCi0gICAgLyogYWxsb2NhdGUgbWVtb3J5IGZvciBzdHJlYW0gYnVmZmVyLCBleGl0IGlmIHVuc3VjY2Vzc2Z1bCAqLwotICAgIGJ5dGVTdHJtID0gYnl0ZVN0cm1TdGFydCA9ICh1OCAqKUgyNjRTd0RlY01hbGxvYyhzaXplb2YodTgpLCBzdHJtTGVuKTsKLSAgICBpZiAoYnl0ZVN0cm0gPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIHByaW50ZigiVU5BQkxFIFRPIEFMTE9DQVRFIE1FTU9SWVxuIik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKiByZWFkIGlucHV0IHN0cmVhbSBmcm9tIGZpbGUgdG8gYnVmZmVyIGFuZCBjbG9zZSBpbnB1dCBmaWxlICovCi0gICAgZnJlYWQoYnl0ZVN0cm0sIHNpemVvZih1OCksIHN0cm1MZW4sIGZpbnB1dCk7Ci0gICAgZmNsb3NlKGZpbnB1dCk7Ci0KLSAgICAvKiBpbml0aWFsaXplIGRlY29kZXIuIElmIHVuc3VjY2Vzc2Z1bCAtPiBleGl0ICovCi0gICAgcmV0ID0gSDI2NFN3RGVjSW5pdCgmZGVjSW5zdCwgMCk7Ci0gICAgaWYgKHJldCAhPSBIMjY0U1dERUNfT0spCi0gICAgewotICAgICAgICBwcmludGYoIkRFQ09ERVIgSU5JVElBTElaQVRJT04gRkFJTEVEXG4iKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qIGluaXRpYWxpemUgSDI2NFN3RGVjRGVjb2RlKCkgaW5wdXQgc3RydWN0dXJlICovCi0gICAgZGVjSW5wdXQucFN0cmVhbSA9IGJ5dGVTdHJtU3RhcnQ7Ci0gICAgZGVjSW5wdXQuZGF0YUxlbiA9IHN0cm1MZW47Ci0gICAgZGVjSW5wdXQuaW50cmFDb25jZWFsbWVudE1ldGhvZCA9IDA7Ci0KLSAgICBwaWNOdW1iZXIgPSAwOwotCi0gICAgLyogRm9yIHBlcmZvcm1hbmNlIG1lYXN1cmVtZW50cywgcmVhZCB0aGUgc3RhcnQgdGltZSAoaW4gc2Vjb25kcykgaGVyZS4KLSAgICAgKiBUaGUgZGVjb2RpbmcgdGltZSBzaG91bGQgYmUgbWVhc3VyZWQgb3ZlciBzZXZlcmFsIGZyYW1lcyBhbmQgYWZ0ZXIKLSAgICAgKiB0aGF0IGF2ZXJhZ2UgZnBzIChmcmFtZXMvc2Vjb25kKSBjYW4gYmUgY2FsY3VsYXRlZC4KLSAgICAgKgotICAgICAqIHN0YXJ0VGltZSA9IEdldFRpbWUoKTsKLSAgICAgKgotICAgICAqIFRvIHByZXZlbnQgY2FsY3VsYXRpbmcgZmlsZSBJL08gbGF0ZW5zaWVzIGFzIGEgZGVjb2RpbmcgdGltZSwKLSAgICAgKiBjb21tZW50IG91dCBXcml0ZU91dHB1dCBmdW5jdGlvbiBjYWxsLiBBbHNvIHByaW50cyB0byBzdGRvdXQgbWlnaHQKLSAgICAgKiBjb25zdW1lIGNvbnNpZGVyYWJsZSBhbW91bnQgb2YgY3ljbGVzIGR1cmluZyBtZWFzdXJlbWVudCAqLwotCi0gICAgLyogbWFpbiBkZWNvZGluZyBsb29wICovCi0gICAgZG8KLSAgICB7Ci0gICAgICAgIC8qIGNhbGwgQVBJIGZ1bmN0aW9uIHRvIHBlcmZvcm0gZGVjb2RpbmcgKi8KLSAgICAgICAgcmV0ID0gSDI2NFN3RGVjRGVjb2RlKGRlY0luc3QsICZkZWNJbnB1dCwgJmRlY091dHB1dCk7Ci0KLSAgICAgICAgc3dpdGNoKHJldCkKLSAgICAgICAgewotCi0gICAgICAgICAgICBjYXNlIEgyNjRTV0RFQ19IRFJTX1JEWV9CVUZGX05PVF9FTVBUWToKLQotICAgICAgICAgICAgICAgIC8qIHBpY3R1cmUgZGltZW5zaW9ucyBhcmUgYXZhaWxhYmxlIGZvciBxdWVyeSBub3cgKi8KLSAgICAgICAgICAgICAgICByZXQgPSBIMjY0U3dEZWNHZXRJbmZvKGRlY0luc3QsICZkZWNJbmZvKTsKLSAgICAgICAgICAgICAgICBpZiAocmV0ICE9IEgyNjRTV0RFQ19PSykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgICAgICAgICAgICAgLyogcGljdHVyZSBzaXplIGluIHBpeGVscyAqLwotICAgICAgICAgICAgICAgIHBpY1NpemUgPSBkZWNJbmZvLnBpY1dpZHRoICogZGVjSW5mby5waWNIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgLyogbWVtb3J5IG5lZWRlZCBmb3IgWUNiQ3IgNDoyOjAgcGljdHVyZSBpbiBieXRlcyAqLwotICAgICAgICAgICAgICAgIHBpY1NpemUgPSAoMyAqIHBpY1NpemUpLzI7Ci0gICAgICAgICAgICAgICAgLyogbWVtb3J5IG5lZWRlZCBmb3IgMTYtYml0IFJHQiBwaWN0dXJlIGluIGJ5dGVzCi0gICAgICAgICAgICAgICAgICogcGljU2l6ZSA9IChkZWNJbmZvLnBpY1dpZHRoICogZGVjSW5mby5waWNIZWlnaHQpICogMjsgKi8KLQotICAgICAgICAgICAgICAgIHByaW50ZigiV2lkdGggJWQgSGVpZ2h0ICVkXG4iLAotICAgICAgICAgICAgICAgICAgICBkZWNJbmZvLnBpY1dpZHRoLCBkZWNJbmZvLnBpY0hlaWdodCk7Ci0KLSAgICAgICAgICAgICAgICAvKiB1cGRhdGUgSDI2NFN3RGVjRGVjb2RlKCkgaW5wdXQgc3RydWN0dXJlLCBudW1iZXIgb2YgYnl0ZXMKLSAgICAgICAgICAgICAgICAgKiAiY29uc3VtZWQiIGlzIGNvbXB1dGVkIGFzIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgbmV3IHN0cmVhbQotICAgICAgICAgICAgICAgICAqIHBvaW50ZXIgYW5kIG9sZCBzdHJlYW0gcG9pbnRlciAqLwotICAgICAgICAgICAgICAgIGRlY0lucHV0LmRhdGFMZW4gLT0KLSAgICAgICAgICAgICAgICAgICAgKHUzMikoZGVjT3V0cHV0LnBTdHJtQ3VyclBvcyAtIGRlY0lucHV0LnBTdHJlYW0pOwotICAgICAgICAgICAgICAgIGRlY0lucHV0LnBTdHJlYW0gPSBkZWNPdXRwdXQucFN0cm1DdXJyUG9zOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEgyNjRTV0RFQ19QSUNfUkRZX0JVRkZfTk9UX0VNUFRZOgotICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfUElDX1JEWToKLQotICAgICAgICAgICAgICAgIC8qIHVwZGF0ZSBIMjY0U3dEZWNEZWNvZGUoKSBpbnB1dCBzdHJ1Y3R1cmUsIG51bWJlciBvZiBieXRlcwotICAgICAgICAgICAgICAgICAqICJjb25zdW1lZCIgaXMgY29tcHV0ZWQgYXMgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBuZXcgc3RyZWFtCi0gICAgICAgICAgICAgICAgICogcG9pbnRlciBhbmQgb2xkIHN0cmVhbSBwb2ludGVyICovCi0gICAgICAgICAgICAgICAgZGVjSW5wdXQuZGF0YUxlbiAtPQotICAgICAgICAgICAgICAgICAgICAodTMyKShkZWNPdXRwdXQucFN0cm1DdXJyUG9zIC0gZGVjSW5wdXQucFN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgZGVjSW5wdXQucFN0cmVhbSA9IGRlY091dHB1dC5wU3RybUN1cnJQb3M7Ci0KLSAgICAgICAgICAgICAgICAvKiB1c2UgZnVuY3Rpb24gSDI2NFN3RGVjTmV4dFBpY3R1cmUoKSB0byBvYnRhaW4gbmV4dCBwaWN0dXJlCi0gICAgICAgICAgICAgICAgICogaW4gZGlzcGxheSBvcmRlci4gRnVuY3Rpb24gaXMgY2FsbGVkIHVudGlsIG5vIG1vcmUgaW1hZ2VzCi0gICAgICAgICAgICAgICAgICogYXJlIHJlYWR5IGZvciBkaXNwbGF5ICovCi0gICAgICAgICAgICAgICAgd2hpbGUgKEgyNjRTd0RlY05leHRQaWN0dXJlKGRlY0luc3QsICZkZWNQaWN0dXJlLCAwKSA9PQotICAgICAgICAgICAgICAgICAgICBIMjY0U1dERUNfUElDX1JEWSkgeyBwaWNOdW1iZXIrKzsKLQotICAgICAgICAgICAgICAgICAgICBwcmludGYoIlBJQyAlZCwgdHlwZSAlcywgY29uY2VhbGVkICVkXG4iLCBwaWNOdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWNQaWN0dXJlLmlzSWRyUGljdHVyZSA/ICJJRFIiIDogIk5PTi1JRFIiLAotICAgICAgICAgICAgICAgICAgICAgICAgZGVjUGljdHVyZS5uYnJPZkVyck1Ccyk7Ci0gICAgICAgICAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIERvIGNvbG9yIGNvbnZlcnNpb24gaWYgbmVlZGVkIHRvIGdldCBkaXNwbGF5IGltYWdlCi0gICAgICAgICAgICAgICAgICAgICAqIGluIFJHQi1mb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAgICAgICAgICogWXV2VG9SZ2IoIGRlY1BpY3R1cmUucE91dHB1dFBpY3R1cmUsIHBSZ2JQaWN0dXJlICk7ICovCi0KLSAgICAgICAgICAgICAgICAgICAgLyogd3JpdGUgbmV4dCBkaXNwbGF5IGltYWdlIHRvIG91dHB1dCBmaWxlICovCi0gICAgICAgICAgICAgICAgICAgIFdyaXRlT3V0cHV0KGZvdXRwdXQsICh1OCopZGVjUGljdHVyZS5wT3V0cHV0UGljdHVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBpY1NpemUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEgyNjRTV0RFQ19FVkFMVUFUSU9OX0xJTUlUX0VYQ0VFREVEOgotICAgICAgICAgICAgICAgIC8qIGV2YWx1YXRpb24gdmVyc2lvbiBvZiB0aGUgZGVjb2RlciBoYXMgbGltaXRlZCBkZWNvZGluZwotICAgICAgICAgICAgICAgICAqIGNhcGFiaWxpdGllcyAqLwotICAgICAgICAgICAgICAgIHByaW50ZigiRVZBTFVBVElPTiBMSU1JVCBSRUFDSEVEXG4iKTsKLSAgICAgICAgICAgICAgICBnb3RvIGVuZDsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBwcmludGYoIlVOUkVDT1ZFUkFCTEUgRVJST1JcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgIC8qIGtlZXAgZGVjb2RpbmcgdW50aWwgYWxsIGRhdGEgZnJvbSBpbnB1dCBzdHJlYW0gYnVmZmVyIGNvbnN1bWVkICovCi0gICAgfSB3aGlsZSAoZGVjSW5wdXQuZGF0YUxlbiA+IDApOwotCi1lbmQ6Ci0KLSAgICAvKiBpZiBvdXRwdXQgaW4gZGlzcGxheSBvcmRlciBpcyBwcmVmZXJyZWQsIHRoZSBkZWNvZGVyIHNoYWxsIGJlIGZvcmNlZAotICAgICAqIHRvIG91dHB1dCBwaWN0dXJlcyByZW1haW5pbmcgaW4gZGVjb2RlZCBwaWN0dXJlIGJ1ZmZlci4gVXNlIGZ1bmN0aW9uCi0gICAgICogSDI2NFN3RGVjTmV4dFBpY3R1cmUoKSB0byBvYnRhaW4gbmV4dCBwaWN0dXJlIGluIGRpc3BsYXkgb3JkZXIuIEZ1bmN0aW9uCi0gICAgICogaXMgY2FsbGVkIHVudGlsIG5vIG1vcmUgaW1hZ2VzIGFyZSByZWFkeSBmb3IgZGlzcGxheS4gU2Vjb25kIHBhcmFtZXRlcgotICAgICAqIGZvciB0aGUgZnVuY3Rpb24gaXMgc2V0IHRvICcxJyB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgaXMgZW5kIG9mIHRoZQotICAgICAqIHN0cmVhbSBhbmQgYWxsIHBpY3R1cmVzIHNoYWxsIGJlIG91dHB1dCAqLwotICAgIHdoaWxlIChIMjY0U3dEZWNOZXh0UGljdHVyZShkZWNJbnN0LCAmZGVjUGljdHVyZSwgMSkgPT0KLSAgICAgICAgSDI2NFNXREVDX1BJQ19SRFkpIHsKLQotICAgICAgICBwaWNOdW1iZXIrKzsKLQotICAgICAgICBwcmludGYoIlBJQyAlZCwgdHlwZSAlcywgY29uY2VhbGVkICVkXG4iLCBwaWNOdW1iZXIsCi0gICAgICAgICAgICBkZWNQaWN0dXJlLmlzSWRyUGljdHVyZSA/ICJJRFIiIDogIk5PTi1JRFIiLAotICAgICAgICAgICAgZGVjUGljdHVyZS5uYnJPZkVyck1Ccyk7Ci0gICAgICAgIGZmbHVzaChzdGRvdXQpOwotCi0gICAgICAgIC8qIERvIGNvbG9yIGNvbnZlcnNpb24gaWYgbmVlZGVkIHRvIGdldCBkaXNwbGF5IGltYWdlCi0gICAgICAgICAqIGluIFJHQi1mb3JtYXQKLSAgICAgICAgICoKLSAgICAgICAgICogWXV2VG9SZ2IoIGRlY1BpY3R1cmUucE91dHB1dFBpY3R1cmUsIHBSZ2JQaWN0dXJlICk7ICovCi0KLSAgICAgICAgLyogd3JpdGUgbmV4dCBkaXNwbGF5IGltYWdlIHRvIG91dHB1dCBmaWxlICovCi0gICAgICAgIFdyaXRlT3V0cHV0KGZvdXRwdXQsICh1OCopZGVjUGljdHVyZS5wT3V0cHV0UGljdHVyZSwgcGljU2l6ZSk7Ci0gICAgfQotCi0gICAgLyogRm9yIHBlcmZvcm1hbmNlIG1lYXN1cmVtZW50cywgcmVhZCB0aGUgZW5kIHRpbWUgKGluIHNlY29uZHMpIGhlcmUuCi0gICAgICoKLSAgICAgKiBlbmRUaW1lID0gR2V0VGltZSgpOwotICAgICAqCi0gICAgICogTm93IHRoZSBwZXJmb3JtYW5jZSBjYW4gYmUgY2FsY3VsYXRlZCBhcyBmcmFtZXMgcGVyIHNlY29uZDoKLSAgICAgKiBmcHMgPSBwaWNOdW1iZXIgLyAoZW5kVGltZSAtIHN0YXJ0VGltZSk7ICovCi0KLQotICAgIC8qIHJlbGVhc2UgZGVjb2RlciBpbnN0YW5jZSAqLwotICAgIEgyNjRTd0RlY1JlbGVhc2UoZGVjSW5zdCk7Ci0KLSAgICAvKiBjbG9zZSBvdXRwdXQgZmlsZSAqLwotICAgIGZjbG9zZShmb3V0cHV0KTsKLQotICAgIC8qIGZyZWUgYnl0ZSBzdHJlYW0gYnVmZmVyICovCi0gICAgZnJlZShieXRlU3RybVN0YXJ0KTsKLQotICAgIHJldHVybiAwOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiAgV3JpdGVPdXRwdXQKLQotICAgIFB1cnBvc2U6Ci0gICAgICAgIFdyaXRlIHBpY3R1cmUgcG9pbnRlZCBieSBkYXRhIHRvIGZpbGUgcG9pbnRlZCBieSBmaWQuIFNpemUgb2YgdGhlCi0gICAgICAgIHBpY3R1cmUgaW4gcGl4ZWxzIGlzIGluZGljYXRlZCBieSBwaWNTaXplLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBXcml0ZU91dHB1dChGSUxFICpmaWQsIHU4ICpkYXRhLCB1MzIgcGljU2l6ZSkKLXsKLSAgICBmd3JpdGUoZGF0YSwgMSwgcGljU2l6ZSwgZmlkKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uIG5hbWU6ICBIMjY0U3dEZWNUcmFjZQotCi0gICAgUHVycG9zZToKLSAgICAgICAgRXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBIMjY0U3dEZWNUcmFjZSBmdW5jdGlvbi4gUHJvdG90eXBlIG9mIHRoaXMKLSAgICAgICAgZnVuY3Rpb24gaXMgZ2l2ZW4gaW4gSDI2NFN3RGVjQXBpLmguIFRoaXMgaW1wbGVtZW50YXRpb24gYXBwZW5kcwotICAgICAgICB0cmFjZSBtZXNzYWdlcyB0byBmaWxlIG5hbWVkICdkZWNfYXBpLnRyYycuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIEgyNjRTd0RlY1RyYWNlKGNoYXIgKnN0cmluZykKLXsKLSAgICBGSUxFICpmcDsKLQotICAgIGZwID0gZm9wZW4oImRlY19hcGkudHJjIiwgImF0Iik7Ci0KLSAgICBpZiAoIWZwKQotICAgICAgICByZXR1cm47Ci0KLSAgICBmd3JpdGUoc3RyaW5nLCAxLCBzdHJsZW4oc3RyaW5nKSwgZnApOwotICAgIGZ3cml0ZSgiXG4iLCAxLDEsIGZwKTsKLQotICAgIGZjbG9zZShmcCk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjbWFsbG9jCi0KLSAgICBQdXJwb3NlOgotICAgICAgICBFeGFtcGxlIGltcGxlbWVudGF0aW9uIG9mIEgyNjRTd0RlY01hbGxvYyBmdW5jdGlvbi4gUHJvdG90eXBlIG9mIHRoaXMKLSAgICAgICAgZnVuY3Rpb24gaXMgZ2l2ZW4gaW4gSDI2NFN3RGVjQXBpLmguIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcwotICAgICAgICBsaWJyYXJ5IGZ1bmN0aW9uIG1hbGxvYyBmb3IgYWxsb2NhdGlvbiBvZiBtZW1vcnkuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkKiBIMjY0U3dEZWNNYWxsb2ModTMyIHNpemUsIHUzMiBudW0pCi17Ci0gICAgaWYgKHNpemUgPiBVSU5UMzJfTUFYIC8gbnVtKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gbWFsbG9jKHNpemUgKiBudW0pOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogIEgyNjRTd0RlY0ZyZWUKLQotICAgIFB1cnBvc2U6Ci0gICAgICAgIEV4YW1wbGUgaW1wbGVtZW50YXRpb24gb2YgSDI2NFN3RGVjRnJlZSBmdW5jdGlvbi4gUHJvdG90eXBlIG9mIHRoaXMKLSAgICAgICAgZnVuY3Rpb24gaXMgZ2l2ZW4gaW4gSDI2NFN3RGVjQXBpLmguIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcwotICAgICAgICBsaWJyYXJ5IGZ1bmN0aW9uIGZyZWUgZm9yIGZyZWVpbmcgb2YgbWVtb3J5LgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBIMjY0U3dEZWNGcmVlKHZvaWQgKnB0cikKLXsKLSAgICBmcmVlKHB0cik7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjTWVtY3B5Ci0KLSAgICBQdXJwb3NlOgotICAgICAgICBFeGFtcGxlIGltcGxlbWVudGF0aW9uIG9mIEgyNjRTd0RlY01lbWNweSBmdW5jdGlvbi4gUHJvdG90eXBlIG9mIHRoaXMKLSAgICAgICAgZnVuY3Rpb24gaXMgZ2l2ZW4gaW4gSDI2NFN3RGVjQXBpLmguIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcwotICAgICAgICBsaWJyYXJ5IGZ1bmN0aW9uIG1lbWNweSB0byBjb3B5IHNyYyB0byBkZXN0LgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBIMjY0U3dEZWNNZW1jcHkodm9pZCAqZGVzdCwgdm9pZCAqc3JjLCB1MzIgY291bnQpCi17Ci0gICAgbWVtY3B5KGRlc3QsIHNyYywgY291bnQpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogIEgyNjRTd0RlY01lbXNldAotCi0gICAgUHVycG9zZToKLSAgICAgICAgRXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBIMjY0U3dEZWNNZW1zZXQgZnVuY3Rpb24uIFByb3RvdHlwZSBvZiB0aGlzCi0gICAgICAgIGZ1bmN0aW9uIGlzIGdpdmVuIGluIEgyNjRTd0RlY0FwaS5oLiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMKLSAgICAgICAgbGlicmFyeSBmdW5jdGlvbiBtZW1zZXQgdG8gc2V0IGNvbnRlbnQgb2YgbWVtb3J5IGFyZWEgcG9pbnRlZCBieSBwdHIuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIEgyNjRTd0RlY01lbXNldCh2b2lkICpwdHIsIGkzMiB2YWx1ZSwgdTMyIGNvdW50KQotewotICAgIG1lbXNldChwdHIsIHZhbHVlLCBjb3VudCk7Ci19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvSDI2NFN3RGVjQXBpLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL0gyNjRTd0RlY0FwaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWIzOGU1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvSDI2NFN3RGVjQXBpLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1ODAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotICAgICAzLiBNb2R1bGUgZGVmaW5lcwotICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0gICAgIDUuIEZ1bmN0aW9ucwotICAgICAgICAgIEgyNjRTd0RlY0luaXQKLSAgICAgICAgICBIMjY0U3dEZWNHZXRJbmZvCi0gICAgICAgICAgSDI2NFN3RGVjUmVsZWFzZQotICAgICAgICAgIEgyNjRTd0RlY0RlY29kZQotICAgICAgICAgIEgyNjRTd0RlY0dldEFQSVZlcnNpb24KLSAgICAgICAgICBIMjY0U3dEZWNOZXh0UGljdHVyZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8bG9nL2xvZy5oPgotCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLSNpbmNsdWRlICJoMjY0YnNkX2NvbnRhaW5lci5oIgotI2luY2x1ZGUgIkgyNjRTd0RlY0FwaS5oIgotI2luY2x1ZGUgImgyNjRic2RfZGVjb2Rlci5oIgotI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgotCi0jZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCkKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICBWZXJzaW9uIEluZm9ybWF0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZGVmaW5lIEgyNjRTV0RFQ19NQUpPUl9WRVJTSU9OIDIKLSNkZWZpbmUgSDI2NFNXREVDX01JTk9SX1ZFUlNJT04gMwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1IMjY0REVDX1RSQUNFICAgICAgICAgICBUcmFjZSBIMjY0IERlY29kZXIgQVBJIGZ1bmN0aW9uIGNhbGxzLgotSDI2NERFQ19FVkFMVUFUSU9OICAgICAgQ29tcGlsZSBldmFsdWF0aW9uIHZlcnNpb24sIHJlc3RyaWN0cyBudW1iZXIgb2YgZnJhbWVzCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGNhbiBiZSBkZWNvZGVkCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZmRlZiBIMjY0REVDX1RSQUNFCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNkZWZpbmUgREVDX0FQSV9UUkMoc3RyKSAgICBIMjY0U3dEZWNUcmFjZShzdHIpCi0jZWxzZQotI2RlZmluZSBERUNfQVBJX1RSQyhzdHIpCi0jZW5kaWYKLQotI2lmZGVmIEgyNjRERUNfRVZBTFVBVElPTgotI2RlZmluZSBIMjY0REVDX0VWQUxVQVRJT05fTElNSVQgICA1MDAKLSNlbmRpZgotCi12b2lkIEgyNjRTd0RlY1RyYWNlKGNoYXIgKnN0cmluZykgewotICAgIFVOVVNFRChzdHJpbmcpOwotfQotCi12b2lkKiBIMjY0U3dEZWNNYWxsb2ModTMyIHNpemUsIHUzMiBudW0pIHsKLSAgICBpZiAoc2l6ZSA+IFVJTlQzMl9NQVggLyBudW0pIHsKLSAgICAgICAgQUxPR0UoImNhbid0IGFsbG9jYXRlICV1ICogJXUgYnl0ZXMiLCBzaXplLCBudW0pOwotICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI3ODU1NDE5Iik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gbWFsbG9jKHNpemUgKiBudW0pOwotfQotCi12b2lkIEgyNjRTd0RlY0ZyZWUodm9pZCAqcHRyKSB7Ci0gICAgZnJlZShwdHIpOwotfQotCi12b2lkIEgyNjRTd0RlY01lbWNweSh2b2lkICpkZXN0LCB2b2lkICpzcmMsIHUzMiBjb3VudCkgewotICAgIG1lbWNweShkZXN0LCBzcmMsIGNvdW50KTsKLX0KLQotdm9pZCBIMjY0U3dEZWNNZW1zZXQodm9pZCAqcHRyLCBpMzIgdmFsdWUsIHUzMiBjb3VudCkgewotICAgIG1lbXNldChwdHIsIHZhbHVlLCBjb3VudCk7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBIMjY0U3dEZWNJbml0KCkKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgSW5pdGlhbGl6ZSBkZWNvZGVyIHNvZnR3YXJlLiBGdW5jdGlvbiByZXNlcnZlcyBtZW1vcnkgZm9yIHRoZQotICAgICAgICAgICAgZGVjb2RlciBpbnN0YW5jZSBhbmQgY2FsbHMgaDI2NGJzZEluaXQgdG8gaW5pdGlhbGl6ZSB0aGUKLSAgICAgICAgICAgIGluc3RhbmNlIGRhdGEuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgbm9PdXRwdXRSZW9yZGVyaW5nICBmbGFnIHRvIGluZGljYXRlIGRlY29kZXIgdGhhdCBpdCBkb2Vzbid0IGhhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdHJ5IHRvIHByb3ZpZGUgb3V0cHV0IHBpY3R1cmVzIGluIGRpc3BsYXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXIsIHNhdmVzIG1lbW9yeQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBkZWNJbnN0ICAgICAgICAgICAgIHBvaW50ZXIgdG8gaW5pdGlhbGl6ZWQgaW5zdGFuY2UgaXMgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSDI2NFNXREVDX09LICAgICAgICBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQgdGhlIGluc3RhbmNlCi0gICAgICAgICAgICBIMjY0U1dERUNfSU5JVEZBSUwgIGluaXRpYWxpemF0aW9uIGZhaWxlZAotICAgICAgICAgICAgSDI2NFNXREVDX1BBUkFNX0VSUiBpbnZhbGlkIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIEgyNjRTV0RFQ19NRU1fRkFJTCAgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLUgyNjRTd0RlY1JldCBIMjY0U3dEZWNJbml0KEgyNjRTd0RlY0luc3QgKmRlY0luc3QsIHUzMiBub091dHB1dFJlb3JkZXJpbmcpCi17Ci0gICAgdTMyIHJ2ID0gMDsKLQotICAgIGRlY0NvbnRhaW5lcl90ICpwRGVjQ29udDsKLQotICAgIERFQ19BUElfVFJDKCJIMjY0U3dEZWNJbml0IyIpOwotCi0gICAgLyogY2hlY2sgdGhhdCByaWdodCBzaGlmdCBvbiBuZWdhdGl2ZSBudW1iZXJzIGlzIHBlcmZvcm1lZCBzaWduZWQgKi8KLSAgICAvKmxpbnQgLXNhdmUgLWUqIGZvbGxvd2luZyBjaGVjayBjYXVzZXMgbXVsdGlwbGUgbGludCBtZXNzYWdlcyAqLwotICAgIGlmICggKCgtMSk+PjEpICE9ICgtMSkgKQotICAgIHsKLSAgICAgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY0luaXQjIEVSUk9SOiBSaWdodCBzaGlmdCBpcyBub3Qgc2lnbmVkIik7Ci0gICAgICAgIHJldHVybihIMjY0U1dERUNfSU5JVEZBSUwpOwotICAgIH0KLSAgICAvKmxpbnQgLXJlc3RvcmUgKi8KLQotICAgIGlmIChkZWNJbnN0ID09IE5VTEwpCi0gICAgewotICAgICAgICBERUNfQVBJX1RSQygiSDI2NFN3RGVjSW5pdCMgRVJST1I6IGRlY0luc3QgPT0gTlVMTCIpOwotICAgICAgICByZXR1cm4oSDI2NFNXREVDX1BBUkFNX0VSUik7Ci0gICAgfQotCi0gICAgcERlY0NvbnQgPSAoZGVjQ29udGFpbmVyX3QgKilIMjY0U3dEZWNNYWxsb2Moc2l6ZW9mKGRlY0NvbnRhaW5lcl90KSwgMSk7Ci0KLSAgICBpZiAocERlY0NvbnQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIERFQ19BUElfVFJDKCJIMjY0U3dEZWNJbml0IyBFUlJPUjogTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIik7Ci0gICAgICAgIHJldHVybihIMjY0U1dERUNfTUVNRkFJTCk7Ci0gICAgfQotCi0jaWZkZWYgSDI2NERFQ19UUkFDRQotICAgIHNwcmludGYocERlY0NvbnQtPnN0ciwgIkgyNjRTd0RlY0luaXQjIGRlY0luc3QgJXAgbm9PdXRwdXRSZW9yZGVyaW5nICVkIiwKLSAgICAgICAgICAgICh2b2lkKilkZWNJbnN0LCBub091dHB1dFJlb3JkZXJpbmcpOwotICAgIERFQ19BUElfVFJDKHBEZWNDb250LT5zdHIpOwotI2VuZGlmCi0KLSAgICBydiA9IGgyNjRic2RJbml0KCZwRGVjQ29udC0+c3RvcmFnZSwgbm9PdXRwdXRSZW9yZGVyaW5nKTsKLSAgICBpZiAocnYgIT0gSEFOVFJPX09LKQotICAgIHsKLSAgICAgICAgSDI2NFN3RGVjUmVsZWFzZShwRGVjQ29udCk7Ci0gICAgICAgIHJldHVybihIMjY0U1dERUNfTUVNRkFJTCk7Ci0gICAgfQotCi0gICAgcERlY0NvbnQtPmRlY1N0YXQgID0gSU5JVElBTElaRUQ7Ci0gICAgcERlY0NvbnQtPnBpY051bWJlciA9IDA7Ci0KLSNpZmRlZiBIMjY0REVDX1RSQUNFCi0gICAgc3ByaW50ZihwRGVjQ29udC0+c3RyLCAiSDI2NFN3RGVjSW5pdCMgT0s6IHJldHVybiAlcCIsICh2b2lkKilwRGVjQ29udCk7Ci0gICAgREVDX0FQSV9UUkMocERlY0NvbnQtPnN0cik7Ci0jZW5kaWYKLQotICAgICpkZWNJbnN0ID0gKGRlY0NvbnRhaW5lcl90ICopcERlY0NvbnQ7Ci0KLSAgICByZXR1cm4oSDI2NFNXREVDX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEgyNjRTd0RlY0dldEluZm8oKQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIHJlYWQgYWNjZXNzIHRvIGRlY29kZXIgaW5mb3JtYXRpb24uIFRoaXMKLSAgICAgICAgICAgIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgY2FsbGVkIGJlZm9yZSBIMjY0U3dEZWNEZWNvZGUgZnVuY3Rpb24gaGFzCi0gICAgICAgICAgICBpbmRpY2F0ZWQgdGhhdCBoZWFkZXJzIGFyZSByZWFkeS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBkZWNJbnN0ICAgICBkZWNvZGVyIGluc3RhbmNlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIHBEZWNJbmZvICAgIHBvaW50ZXIgdG8gaW5mbyBzdHJ1Y3Qgd2hlcmUgZGF0YSBpcyB3cml0dGVuCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEgyNjRTV0RFQ19PSyAgICAgICAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEgyNjRTV0RFQ19QQVJBTV9FUlIgICAgIGludmFsaWQgcGFyYW1ldGVycwotICAgICAgICAgICAgSDI2NFNXREVDX0hEUlNfTk9UX1JEWSAgaW5mb3JtYXRpb24gbm90IGF2YWlsYWJsZSB5ZXQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotSDI2NFN3RGVjUmV0IEgyNjRTd0RlY0dldEluZm8oSDI2NFN3RGVjSW5zdCBkZWNJbnN0LCBIMjY0U3dEZWNJbmZvICpwRGVjSW5mbykKLXsKLQotICAgIHN0b3JhZ2VfdCAqcFN0b3JhZ2U7Ci0KLSAgICBERUNfQVBJX1RSQygiSDI2NFN3RGVjR2V0SW5mbyMiKTsKLQotICAgIGlmIChkZWNJbnN0ID09IE5VTEwgfHwgcERlY0luZm8gPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIERFQ19BUElfVFJDKCJIMjY0U3dEZWNHZXRJbmZvIyBFUlJPUjogZGVjSW5zdCBvciBwRGVjSW5mbyBpcyBOVUxMIik7Ci0gICAgICAgIHJldHVybihIMjY0U1dERUNfUEFSQU1fRVJSKTsKLSAgICB9Ci0KLSAgICBwU3RvcmFnZSA9ICYoKChkZWNDb250YWluZXJfdCAqKWRlY0luc3QpLT5zdG9yYWdlKTsKLQotICAgIGlmIChwU3RvcmFnZS0+YWN0aXZlU3BzID09IE5VTEwgfHwgcFN0b3JhZ2UtPmFjdGl2ZVBwcyA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY0dldEluZm8jIEVSUk9SOiBIZWFkZXJzIG5vdCBkZWNvZGVkIHlldCIpOwotICAgICAgICByZXR1cm4oSDI2NFNXREVDX0hEUlNfTk9UX1JEWSk7Ci0gICAgfQotCi0jaWZkZWYgSDI2NERFQ19UUkFDRQotICAgIHNwcmludGYoKChkZWNDb250YWluZXJfdCopZGVjSW5zdCktPnN0ciwKLSAgICAgICAgIkgyNjRTd0RlY0dldEluZm8jIGRlY0luc3QgJXAgIHBEZWNJbmZvICVwIiwgZGVjSW5zdCwgKHZvaWQqKXBEZWNJbmZvKTsKLSAgICBERUNfQVBJX1RSQygoKGRlY0NvbnRhaW5lcl90KilkZWNJbnN0KS0+c3RyKTsKLSNlbmRpZgotCi0gICAgLyogaDI2NGJzZFBpY1dpZHRoIGFuZCAtSGVpZ2h0IHJldHVybiBkaW1lbnNpb25zIGluIG1hY3JvYmxvY2sgdW5pdHMsCi0gICAgICogcGljV2lkdGggYW5kIC1IZWlnaHQgaW4gcGl4ZWxzICovCi0gICAgcERlY0luZm8tPnBpY1dpZHRoICAgICAgICA9IGgyNjRic2RQaWNXaWR0aChwU3RvcmFnZSkgPDwgNDsKLSAgICBwRGVjSW5mby0+cGljSGVpZ2h0ICAgICAgID0gaDI2NGJzZFBpY0hlaWdodChwU3RvcmFnZSkgPDwgNDsKLSAgICBwRGVjSW5mby0+dmlkZW9SYW5nZSAgICAgID0gaDI2NGJzZFZpZGVvUmFuZ2UocFN0b3JhZ2UpOwotICAgIHBEZWNJbmZvLT5tYXRyaXhDb2VmZmljaWVudHMgPSBoMjY0YnNkTWF0cml4Q29lZmZpY2llbnRzKHBTdG9yYWdlKTsKLQotICAgIGgyNjRic2RDcm9wcGluZ1BhcmFtcyhwU3RvcmFnZSwKLSAgICAgICAgJnBEZWNJbmZvLT5jcm9wcGluZ0ZsYWcsCi0gICAgICAgICZwRGVjSW5mby0+Y3JvcFBhcmFtcy5jcm9wTGVmdE9mZnNldCwKLSAgICAgICAgJnBEZWNJbmZvLT5jcm9wUGFyYW1zLmNyb3BPdXRXaWR0aCwKLSAgICAgICAgJnBEZWNJbmZvLT5jcm9wUGFyYW1zLmNyb3BUb3BPZmZzZXQsCi0gICAgICAgICZwRGVjSW5mby0+Y3JvcFBhcmFtcy5jcm9wT3V0SGVpZ2h0KTsKLQotICAgIC8qIHNhbXBsZSBhc3BlY3QgcmF0aW8gKi8KLSAgICBoMjY0YnNkU2FtcGxlQXNwZWN0UmF0aW8ocFN0b3JhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRGVjSW5mby0+cGFyV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRGVjSW5mby0+cGFySGVpZ2h0KTsKLQotICAgIC8qIHByb2ZpbGUgKi8KLSAgICBwRGVjSW5mby0+cHJvZmlsZSA9IGgyNjRic2RQcm9maWxlKHBTdG9yYWdlKTsKLQotICAgIERFQ19BUElfVFJDKCJIMjY0U3dEZWNHZXRJbmZvIyBPSyIpOwotCi0gICAgcmV0dXJuKEgyNjRTV0RFQ19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBIMjY0U3dEZWNSZWxlYXNlKCkKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgUmVsZWFzZSB0aGUgZGVjb2RlciBpbnN0YW5jZS4gRnVuY3Rpb24gY2FsbHMgaDI2NGJzZFNodXREb3duIHRvCi0gICAgICAgICAgICByZWxlYXNlIGluc3RhbmNlIGRhdGEgYW5kIGZyZWVzIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUKLSAgICAgICAgICAgIGluc3RhbmNlLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIGRlY0luc3QgICAgIERlY29kZXIgaW5zdGFuY2UKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgbm9uZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBub25lCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgSDI2NFN3RGVjUmVsZWFzZShIMjY0U3dEZWNJbnN0IGRlY0luc3QpCi17Ci0KLSAgICBkZWNDb250YWluZXJfdCAqcERlY0NvbnQ7Ci0KLSAgICBERUNfQVBJX1RSQygiSDI2NFN3RGVjUmVsZWFzZSMiKTsKLQotICAgIGlmIChkZWNJbnN0ID09IE5VTEwpCi0gICAgewotICAgICAgICBERUNfQVBJX1RSQygiSDI2NFN3RGVjUmVsZWFzZSMgRVJST1I6IGRlY0luc3QgPT0gTlVMTCIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcERlY0NvbnQgPSAoZGVjQ29udGFpbmVyX3QqKWRlY0luc3Q7Ci0KLSNpZmRlZiBIMjY0REVDX1RSQUNFCi0gICAgc3ByaW50ZihwRGVjQ29udC0+c3RyLCAiSDI2NFN3RGVjUmVsZWFzZSMgZGVjSW5zdCAlcCIsZGVjSW5zdCk7Ci0gICAgREVDX0FQSV9UUkMocERlY0NvbnQtPnN0cik7Ci0jZW5kaWYKLQotICAgIGgyNjRic2RTaHV0ZG93bigmcERlY0NvbnQtPnN0b3JhZ2UpOwotCi0gICAgSDI2NFN3RGVjRnJlZShwRGVjQ29udCk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBIMjY0U3dEZWNEZWNvZGUKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRGVjb2RlIHN0cmVhbSBkYXRhLiBDYWxscyBoMjY0YnNkRGVjb2RlIHRvIGRvIHRoZSBhY3R1YWwgZGVjb2RpbmcuCi0KLSAgICAgICAgSW5wdXQ6Ci0gICAgICAgICAgICBkZWNJbnN0ICAgICBkZWNvZGVyIGluc3RhbmNlCi0gICAgICAgICAgICBwSW5wdXQgICAgICBwb2ludGVyIHRvIGlucHV0IHN0cnVjdAotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBwT3V0cHV0ICAgICBwb2ludGVyIHRvIG91dHB1dCBzdHJ1Y3QKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSDI2NFNXREVDX05PVF9JTklUSUFMSVpFRCAgIGRlY29kZXIgaW5zdGFuY2Ugbm90IGluaXRpYWxpemVkIHlldAotICAgICAgICAgICAgSDI2NFNXREVDX1BBUkFNX0VSUiAgICAgICAgIGludmFsaWQgcGFyYW1ldGVycwotCi0gICAgICAgICAgICBIMjY0U1dERUNfU1RSTV9QUk9DRVNTRUQgICAgc3RyZWFtIGJ1ZmZlciBkZWNvZGVkCi0gICAgICAgICAgICBIMjY0U1dERUNfSERSU19SRFlfQlVGRl9OT1RfRU1QVFkgICBoZWFkZXJzIGRlY29kZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyIG5vdCBmaW5pc2hlZAotICAgICAgICAgICAgSDI2NFNXREVDX1BJQ19SRFkgICAgICAgICAgICAgICAgICAgZGVjb2Rpbmcgb2YgYSBwaWN0dXJlIGZpbmlzaGVkCi0gICAgICAgICAgICBIMjY0U1dERUNfUElDX1JEWV9CVUZGX05PVF9FTVBUWSAgICBkZWNvZGluZyBvZiBhIHBpY3R1cmUgZmluaXNoZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyIG5vdCBmaW5pc2hlZAotICAgICAgICAgICAgSDI2NFNXREVDX1NUUk1fRVJSICAgICAgICAgICAgICAgICAgc2VyaW91cyBlcnJvciBpbiBkZWNvZGluZywgbm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkIHBhcmFtZXRlciBzZXRzIGF2YWlsYWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gZGVjb2RlIHBpY3R1cmUgZGF0YQotICAgICAgICAgICAgSDI2NFNXREVDX0VWQUxVQVRJT05fTElNSVRfRVhDRUVERUQgdGhpcyBjYW4gb25seSBvY2N1ciB3aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmFsdWF0aW9uIHZlcnNpb24gaXMgdXNlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heCBudW1iZXIgb2YgZnJhbWVzIHJlYWNoZWQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotSDI2NFN3RGVjUmV0IEgyNjRTd0RlY0RlY29kZShIMjY0U3dEZWNJbnN0IGRlY0luc3QsIEgyNjRTd0RlY0lucHV0ICpwSW5wdXQsCi0gICAgICAgICAgICAgICAgICBIMjY0U3dEZWNPdXRwdXQgKnBPdXRwdXQpCi17Ci0KLSAgICBkZWNDb250YWluZXJfdCAqcERlY0NvbnQ7Ci0gICAgdTMyIHN0cm1MZW47Ci0gICAgdTMyIG51bVJlYWRCeXRlczsKLSAgICB1OCAqdG1wU3RyZWFtOwotICAgIHUzMiBkZWNSZXN1bHQgPSAwOwotICAgIEgyNjRTd0RlY1JldCByZXR1cm5WYWx1ZSA9IEgyNjRTV0RFQ19TVFJNX1BST0NFU1NFRDsKLQotICAgIERFQ19BUElfVFJDKCJIMjY0U3dEZWNEZWNvZGUjIik7Ci0KLSAgICAvKiBDaGVjayB0aGF0IGZ1bmN0aW9uIGlucHV0IHBhcmFtZXRlcnMgYXJlIHZhbGlkICovCi0gICAgaWYgKHBJbnB1dCA9PSBOVUxMIHx8IHBPdXRwdXQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIERFQ19BUElfVFJDKCJIMjY0U3dEZWNEZWNvZGUjIEVSUk9SOiBwSW5wdXQgb3IgcE91dHB1dCBpcyBOVUxMIik7Ci0gICAgICAgIHJldHVybihIMjY0U1dERUNfUEFSQU1fRVJSKTsKLSAgICB9Ci0KLSAgICBpZiAoKHBJbnB1dC0+cFN0cmVhbSA9PSBOVUxMKSB8fCAocElucHV0LT5kYXRhTGVuID09IDApKQotICAgIHsKLSAgICAgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY0RlY29kZSMgRVJST1I6IEludmFsaWQgaW5wdXQgcGFyYW1ldGVycyIpOwotICAgICAgICByZXR1cm4oSDI2NFNXREVDX1BBUkFNX0VSUik7Ci0gICAgfQotCi0gICAgcERlY0NvbnQgPSAoZGVjQ29udGFpbmVyX3QgKilkZWNJbnN0OwotCi0gICAgLyogQ2hlY2sgaWYgZGVjb2RlciBpcyBpbiBhbiBpbmNvcnJlY3QgbW9kZSAqLwotICAgIGlmIChkZWNJbnN0ID09IE5VTEwgfHwgcERlY0NvbnQtPmRlY1N0YXQgPT0gVU5JTklUSUFMSVpFRCkKLSAgICB7Ci0gICAgICAgIERFQ19BUElfVFJDKCJIMjY0U3dEZWNEZWNvZGUjIEVSUk9SOiBEZWNvZGVyIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICByZXR1cm4oSDI2NFNXREVDX05PVF9JTklUSUFMSVpFRCk7Ci0gICAgfQotCi0jaWZkZWYgSDI2NERFQ19FVkFMVUFUSU9OCi0gICAgaWYgKHBEZWNDb250LT5waWNOdW1iZXIgPj0gSDI2NERFQ19FVkFMVUFUSU9OX0xJTUlUKQotICAgICAgICByZXR1cm4oSDI2NFNXREVDX0VWQUxVQVRJT05fTElNSVRfRVhDRUVERUQpOwotI2VuZGlmCi0KLSNpZmRlZiBIMjY0REVDX1RSQUNFCi0gICAgc3ByaW50ZihwRGVjQ29udC0+c3RyLCAiSDI2NFN3RGVjRGVjb2RlIyBkZWNJbnN0ICVwICBwSW5wdXQgJXAgIHBPdXRwdXQgJXAiLAotICAgICAgICAgICAgZGVjSW5zdCwgKHZvaWQqKXBJbnB1dCwgKHZvaWQqKXBPdXRwdXQpOwotICAgIERFQ19BUElfVFJDKHBEZWNDb250LT5zdHIpOwotI2VuZGlmCi0KLSAgICBwT3V0cHV0LT5wU3RybUN1cnJQb3MgICA9IE5VTEw7Ci0KLSAgICBudW1SZWFkQnl0ZXMgPSAwOwotICAgIHN0cm1MZW4gPSBwSW5wdXQtPmRhdGFMZW47Ci0gICAgdG1wU3RyZWFtID0gcElucHV0LT5wU3RyZWFtOwotICAgIHBEZWNDb250LT5zdG9yYWdlLmludHJhQ29uY2VhbG1lbnRGbGFnID0gcElucHV0LT5pbnRyYUNvbmNlYWxtZW50TWV0aG9kOwotCi0gICAgZG8KLSAgICB7Ci0gICAgICAgIC8qIFJldHVybiBIRFJTX1JEWSBhZnRlciBEUEIgZmx1c2ggY2F1c2VkIGJ5IG5ldyBTUFMgKi8KLSAgICAgICAgaWYgKHBEZWNDb250LT5kZWNTdGF0ID09IE5FV19IRUFERVJTKQotICAgICAgICB7Ci0gICAgICAgICAgICBkZWNSZXN1bHQgPSBIMjY0QlNEX0hEUlNfUkRZOwotICAgICAgICAgICAgcERlY0NvbnQtPmRlY1N0YXQgPSBJTklUSUFMSVpFRDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIC8qIENvbnRpbnVlIGRlY29kaW5nIG5vcm1hbGx5ICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRlY1Jlc3VsdCA9IGgyNjRic2REZWNvZGUoJnBEZWNDb250LT5zdG9yYWdlLCB0bXBTdHJlYW0sIHN0cm1MZW4sCi0gICAgICAgICAgICAgICAgcElucHV0LT5waWNJZCwgJm51bVJlYWRCeXRlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgdG1wU3RyZWFtICs9IG51bVJlYWRCeXRlczsKLSAgICAgICAgLyogY2hlY2sgaWYgdG9vIG1hbnkgYnl0ZXMgYXJlIHJlYWQgZnJvbSBzdHJlYW0gKi8KLSAgICAgICAgaWYgKCAoaTMyKShzdHJtTGVuIC0gbnVtUmVhZEJ5dGVzKSA+PSAwICkKLSAgICAgICAgICAgIHN0cm1MZW4gLT0gbnVtUmVhZEJ5dGVzOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdHJtTGVuID0gMDsKLQotICAgICAgICBwT3V0cHV0LT5wU3RybUN1cnJQb3MgPSB0bXBTdHJlYW07Ci0KLSAgICAgICAgc3dpdGNoIChkZWNSZXN1bHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgSDI2NEJTRF9IRFJTX1JEWToKLQotICAgICAgICAgICAgICAgIGlmKHBEZWNDb250LT5zdG9yYWdlLmRwYi0+Zmx1c2hlZCAmJgotICAgICAgICAgICAgICAgICAgIHBEZWNDb250LT5zdG9yYWdlLmRwYi0+bnVtT3V0ICE9Ci0gICAgICAgICAgICAgICAgICAgcERlY0NvbnQtPnN0b3JhZ2UuZHBiLT5vdXRJbmRleCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIG91dHB1dCBmaXJzdCBhbGwgRFBCIHN0b3JlZCBwaWN0dXJlcwotICAgICAgICAgICAgICAgICAgICAgKiBEUEIgZmx1c2ggY2F1c2VkIGJ5IG5ldyBTUFMgKi8KLSAgICAgICAgICAgICAgICAgICAgcERlY0NvbnQtPnN0b3JhZ2UuZHBiLT5mbHVzaGVkID0gMDsKLSAgICAgICAgICAgICAgICAgICAgcERlY0NvbnQtPmRlY1N0YXQgPSBORVdfSEVBREVSUzsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBIMjY0U1dERUNfUElDX1JEWV9CVUZGX05PVF9FTVBUWTsKLSAgICAgICAgICAgICAgICAgICAgc3RybUxlbiA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gSDI2NFNXREVDX0hEUlNfUkRZX0JVRkZfTk9UX0VNUFRZOwotICAgICAgICAgICAgICAgICAgICBzdHJtTGVuID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgSDI2NEJTRF9QSUNfUkRZOgotICAgICAgICAgICAgICAgIHBEZWNDb250LT5waWNOdW1iZXIrKzsKLQotICAgICAgICAgICAgICAgIGlmIChzdHJtTGVuID09IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gSDI2NFNXREVDX1BJQ19SRFk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IEgyNjRTV0RFQ19QSUNfUkRZX0JVRkZfTk9UX0VNUFRZOwotCi0gICAgICAgICAgICAgICAgc3RybUxlbiA9IDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgSDI2NEJTRF9QQVJBTV9TRVRfRVJST1I6Ci0gICAgICAgICAgICAgICAgaWYgKCAhaDI2NGJzZENoZWNrVmFsaWRQYXJhbVNldHMoJnBEZWNDb250LT5zdG9yYWdlKSAmJgotICAgICAgICAgICAgICAgICAgICAgc3RybUxlbiA9PSAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gSDI2NFNXREVDX1NUUk1fRVJSOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgSDI2NEJTRF9NRU1BTExPQ19FUlJPUjoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gSDI2NFNXREVDX01FTUZBSUw7Ci0gICAgICAgICAgICAgICAgICAgIHN0cm1MZW4gPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgIH0gd2hpbGUgKHN0cm1MZW4pOwotCi0jaWZkZWYgSDI2NERFQ19UUkFDRQotICAgIHNwcmludGYocERlY0NvbnQtPnN0ciwgIkgyNjRTd0RlY0RlY29kZSMgT0s6IERlY1Jlc3VsdCAlZCIsCi0gICAgICAgICAgICByZXR1cm5WYWx1ZSk7Ci0gICAgREVDX0FQSV9UUkMocERlY0NvbnQtPnN0cik7Ci0jZW5kaWYKLQotICAgIHJldHVybihyZXR1cm5WYWx1ZSk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBIMjY0U3dEZWNHZXRBUElWZXJzaW9uCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIFJldHVybiB2ZXJzaW9uIGluZm9ybWF0aW9uIG9mIHRoZSBBUEkKLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBub25lCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIG5vbmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgQVBJIHZlcnNpb24KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotSDI2NFN3RGVjQXBpVmVyc2lvbiBIMjY0U3dEZWNHZXRBUElWZXJzaW9uKCkKLXsKLSAgICBIMjY0U3dEZWNBcGlWZXJzaW9uIHZlcjsKLQotICAgIHZlci5tYWpvciA9IEgyNjRTV0RFQ19NQUpPUl9WRVJTSU9OOwotICAgIHZlci5taW5vciA9IEgyNjRTV0RFQ19NSU5PUl9WRVJTSU9OOwotCi0gICAgcmV0dXJuKHZlcik7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogSDI2NFN3RGVjTmV4dFBpY3R1cmUKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgR2V0IG5leHQgcGljdHVyZSBpbiBkaXNwbGF5IG9yZGVyIGlmIGFueSBhdmFpbGFibGUuCi0KLSAgICAgICAgSW5wdXQ6Ci0gICAgICAgICAgICBkZWNJbnN0ICAgICBkZWNvZGVyIGluc3RhbmNlLgotICAgICAgICAgICAgZmx1c2hCdWZmZXIgZm9yY2Ugb3V0cHV0IG9mIGFsbCBidWZmZXJlZCBwaWN0dXJlcwotCi0gICAgICAgIE91dHB1dDoKLSAgICAgICAgICAgIHBPdXRwdXQgICAgIHBvaW50ZXIgdG8gb3V0cHV0IHN0cnVjdHVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIMjY0U1dERUNfT0sgICAgICAgICAgICBubyBwaWN0dXJlcyBhdmFpbGFibGUgZm9yIGRpc3BsYXkKLSAgICAgICAgICAgIEgyNjRTV0RFQ19QSUNfUkRZICAgICAgIHBpY3R1cmUgYXZhaWxhYmxlIGZvciBkaXNwbGF5Ci0gICAgICAgICAgICBIMjY0U1dERUNfUEFSQU1fRVJSICAgICBpbnZhbGlkIHBhcmFtZXRlcnMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotSDI2NFN3RGVjUmV0IEgyNjRTd0RlY05leHRQaWN0dXJlKEgyNjRTd0RlY0luc3QgZGVjSW5zdCwKLSAgICBIMjY0U3dEZWNQaWN0dXJlICpwT3V0cHV0LCB1MzIgZmx1c2hCdWZmZXIpCi17Ci0KLSAgICBkZWNDb250YWluZXJfdCAqcERlY0NvbnQ7Ci0gICAgdTMyIG51bUVyck1icywgaXNJZHJQaWMsIHBpY0lkOwotICAgIHUzMiAqcE91dFBpYzsKLQotICAgIERFQ19BUElfVFJDKCJIMjY0U3dEZWNOZXh0UGljdHVyZSMiKTsKLQotICAgIGlmIChkZWNJbnN0ID09IE5VTEwgfHwgcE91dHB1dCA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY05leHRQaWN0dXJlIyBFUlJPUjogZGVjSW5zdCBvciBwT3V0cHV0IGlzIE5VTEwiKTsKLSAgICAgICAgcmV0dXJuKEgyNjRTV0RFQ19QQVJBTV9FUlIpOwotICAgIH0KLQotICAgIHBEZWNDb250ID0gKGRlY0NvbnRhaW5lcl90KilkZWNJbnN0OwotCi0jaWZkZWYgSDI2NERFQ19UUkFDRQotICAgIHNwcmludGYocERlY0NvbnQtPnN0ciwgIkgyNjRTd0RlY05leHRQaWN0dXJlIyBkZWNJbnN0ICVwIHBPdXRwdXQgJXAgJXMgJWQiLAotICAgICAgICAgICAgZGVjSW5zdCwgKHZvaWQqKXBPdXRwdXQsICJmbHVzaEJ1ZmZlciIsIGZsdXNoQnVmZmVyKTsKLSAgICBERUNfQVBJX1RSQyhwRGVjQ29udC0+c3RyKTsKLSNlbmRpZgotCi0gICAgaWYgKGZsdXNoQnVmZmVyKQotICAgICAgICBoMjY0YnNkRmx1c2hCdWZmZXIoJnBEZWNDb250LT5zdG9yYWdlKTsKLQotICAgIHBPdXRQaWMgPSAodTMyKiloMjY0YnNkTmV4dE91dHB1dFBpY3R1cmUoJnBEZWNDb250LT5zdG9yYWdlLCAmcGljSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXNJZHJQaWMsICZudW1FcnJNYnMpOwotCi0gICAgaWYgKHBPdXRQaWMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIERFQ19BUElfVFJDKCJIMjY0U3dEZWNOZXh0UGljdHVyZSMgT0s6IHJldHVybiBIMjY0U1dERUNfT0siKTsKLSAgICAgICAgcmV0dXJuKEgyNjRTV0RFQ19PSyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBPdXRwdXQtPnBPdXRwdXRQaWN0dXJlID0gcE91dFBpYzsKLSAgICAgICAgcE91dHB1dC0+cGljSWQgICAgICAgICAgPSBwaWNJZDsKLSAgICAgICAgcE91dHB1dC0+aXNJZHJQaWN0dXJlICAgPSBpc0lkclBpYzsKLSAgICAgICAgcE91dHB1dC0+bmJyT2ZFcnJNQnMgICAgPSBudW1FcnJNYnM7Ci0gICAgICAgIERFQ19BUElfVFJDKCJIMjY0U3dEZWNOZXh0UGljdHVyZSMgT0s6IHJldHVybiBIMjY0U1dERUNfUElDX1JEWSIpOwotICAgICAgICByZXR1cm4oSDI2NFNXREVDX1BJQ19SRFkpOwotICAgIH0KLQotfQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvVGVzdEJlbmNoTXVsdGlwbGVJbnN0YW5jZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9UZXN0QmVuY2hNdWx0aXBsZUluc3RhbmNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMzg2YmIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9UZXN0QmVuY2hNdWx0aXBsZUluc3RhbmNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qIENWUyB0YWcgbmFtZSBmb3IgaWRlbnRpZmljYXRpb24gKi8KLWNvbnN0IGNoYXIgdGFnTmFtZVsyNTZdID0gIiROYW1lOiBGSVJTVF9BTkRST0lEX0NPUFlSSUdIVCAkIjsKLQotI2luY2x1ZGUgIkgyNjRTd0RlY0FwaS5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNkZWZpbmUgREVCVUcoYXJndikgcHJpbnRmIGFyZ3YKLQotLyogX05PX09VVCBkaXNhYmxlcyBvdXRwdXQgZmlsZSB3cml0aW5nICovCi0jaWZkZWYgX19hcm0KLSNkZWZpbmUgX05PX09VVAotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIFdyaXRlT3V0cHV0KEZJTEUgKmZpZCwgdTggKmRhdGEsIHUzMiBwaWNTaXplKTsKLQotdTMyIENyb3BQaWN0dXJlKHU4ICpwT3V0SW1hZ2UsIHU4ICpwSW5JbWFnZSwKLSAgICB1MzIgcGljV2lkdGgsIHUzMiBwaWNIZWlnaHQsIENyb3BQYXJhbXMgKnBDcm9wUGFyYW1zKTsKLQotdm9pZCBDcm9wV3JpdGVPdXRwdXQoRklMRSAqZmlkLCB1OCAqaW1hZ2VEYXRhLCB1MzIgY3JvcERpc3BsYXksCi0gICAgICAgIEgyNjRTd0RlY0luZm8gKmRlY0luZm8pOwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIEgyNjRTd0RlY0luc3QgZGVjSW5zdDsKLSAgICBIMjY0U3dEZWNJbnB1dCBkZWNJbnB1dDsKLSAgICBIMjY0U3dEZWNPdXRwdXQgZGVjT3V0cHV0OwotICAgIEgyNjRTd0RlY1BpY3R1cmUgZGVjUGljdHVyZTsKLSAgICBIMjY0U3dEZWNJbmZvIGRlY0luZm87Ci0gICAgRklMRSAqZm91dHB1dDsKLSAgICBjaGFyIG91dEZpbGVOYW1lWzI1Nl07Ci0gICAgdTggKmJ5dGVTdHJtU3RhcnQ7Ci0gICAgdTMyIHBpY051bWJlcjsKLX0gRGVjb2RlcjsKLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotCi0gICAgaTMyIGluc3RDb3VudCwgaW5zdFJ1bm5pbmc7Ci0gICAgaTMyIGk7Ci0gICAgdTMyIG1heE51bVBpY3M7Ci0gICAgdTMyIHN0cm1MZW47Ci0gICAgSDI2NFN3RGVjUmV0IHJldDsKLSAgICB1MzIgbnVtRXJyb3JzID0gMDsKLSAgICB1MzIgY3JvcERpc3BsYXkgPSAwOwotICAgIHUzMiBkaXNhYmxlT3V0cHV0UmVvcmRlcmluZyA9IDA7Ci0gICAgRklMRSAqZmlucHV0OwotICAgIERlY29kZXIgKipkZWNvZGVyOwotICAgIGNoYXIgb3V0RmlsZU5hbWVbMjU2XSA9ICJvdXQueXV2IjsKLQotCi0gICAgaWYgKCBhcmdjID4gMSAmJiBzdHJjbXAoYXJndlsxXSwgIi1UIikgPT0gMCApCi0gICAgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCB0YWdOYW1lKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKGFyZ2MgPCAyKQotICAgIHsKLSAgICAgICAgREVCVUcoKAotICAgICAgICAgICAgIlVzYWdlOiAlcyBbLU5uXSBbLU9vdXRmaWxlXSBbLVBdIFstVV0gWy1DXSBbLVJdIFstVF0gZmlsZTEuMjY0IFtmaWxlMi4yNjRdIC4uIFtmaWxlTi4yNjRdXG4iLAotICAgICAgICAgICAgYXJndlswXSkpOwotICAgICAgICBERUJVRygoIlx0LU5uIGZvcmNlcyBkZWNvZGluZyB0byBzdG9wIGFmdGVyIG4gcGljdHVyZXNcbiIpKTsKLSNpZiBkZWZpbmVkKF9OT19PVVQpCi0gICAgICAgIERFQlVHKCgiXHQtT291dGZpbGUgb3V0cHV0IHdyaXRpbmcgZGlzYWJsZWQgYXQgY29tcGlsZSB0aW1lXG4iKSk7Ci0jZWxzZQotICAgICAgICBERUJVRygoIlx0LU9vdXRmaWxlIHdyaXRlIG91dHB1dCB0byBcIm91dGZpbGVcIiAoZGVmYXVsdCBvdXQueXV2KVxuIikpOwotICAgICAgICBERUJVRygoIlx0LU9ub25lIGRvZXMgbm90IHdyaXRlIG91dHB1dFxuIikpOwotI2VuZGlmCi0gICAgICAgIERFQlVHKCgiXHQtQyBkaXNwbGF5IGNyb3BwZWQgaW1hZ2UgKGRlZmF1bHQgZGVjb2RlZCBpbWFnZSlcbiIpKTsKLSAgICAgICAgREVCVUcoKCJcdC1SIGRpc2FibGUgRFBCIG91dHB1dCByZW9yZGVyaW5nXG4iKSk7Ci0gICAgICAgIERFQlVHKCgiXHQtVCB0byBwcmludCB0YWcgbmFtZSBhbmQgZXhpdFxuIikpOwotICAgICAgICBleGl0KDEwMCk7Ci0gICAgfQotCi0gICAgaW5zdENvdW50ID0gYXJnYyAtIDE7Ci0KLSAgICAvKiByZWFkIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgKi8KLSAgICBtYXhOdW1QaWNzID0gMDsKLSAgICBmb3IgKGkgPSAxOyBpIDwgKGFyZ2MtMSk7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmICggc3RybmNtcChhcmd2W2ldLCAiLU4iLCAyKSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgbWF4TnVtUGljcyA9ICh1MzIpYXRvaShhcmd2W2ldKzIpOwotICAgICAgICAgICAgaW5zdENvdW50LS07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIHN0cm5jbXAoYXJndltpXSwgIi1PIiwgMikgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmNweShvdXRGaWxlTmFtZSwgYXJndltpXSsyKTsKLSAgICAgICAgICAgIGluc3RDb3VudC0tOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCBzdHJjbXAoYXJndltpXSwgIi1DIikgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNyb3BEaXNwbGF5ID0gMTsKLSAgICAgICAgICAgIGluc3RDb3VudC0tOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCBzdHJjbXAoYXJndltpXSwgIi1SIikgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRpc2FibGVPdXRwdXRSZW9yZGVyaW5nID0gMTsKLSAgICAgICAgICAgIGluc3RDb3VudC0tOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGluc3RDb3VudCA8IDEpCi0gICAgewotICAgICAgICBERUJVRygoIk5vIGlucHV0IGZpbGVzXG4iKSk7Ci0gICAgICAgIGV4aXQoMTAwKTsKLSAgICB9Ci0KLSAgICAvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIG11bHRpcGxlIGRlY29kZXIgaW5zdGFuY2VzCi0gICAgICogb25lIGluc3RhbmNlIGZvciBldmVyeSBzdHJlYW0gZmlsZSAqLwotICAgIGRlY29kZXIgPSAoRGVjb2RlciAqKiltYWxsb2Moc2l6ZW9mKERlY29kZXIqKSoodTMyKWluc3RDb3VudCk7Ci0gICAgaWYgKGRlY29kZXIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIERFQlVHKCgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeVxuIikpOwotICAgICAgICBleGl0KDEwMCk7Ci0gICAgfQotCi0gICAgLyogcHJlcGFyZSBlYWNoIGRlY29kZXIgaW5zdGFuY2UgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgaW5zdENvdW50OyBpKyspCi0gICAgewotICAgICAgICBkZWNvZGVyW2ldID0gKERlY29kZXIgKiljYWxsb2MoMSwgc2l6ZW9mKERlY29kZXIpKTsKLQotICAgICAgICAvKiBvcGVuIGlucHV0IGZpbGUgKi8KLSAgICAgICAgZmlucHV0ID0gZm9wZW4oYXJndlthcmdjLWluc3RDb3VudCtpXSwicmIiKTsKLSAgICAgICAgaWYgKGZpbnB1dCA9PSBOVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBERUJVRygoIlVuYWJsZSB0byBvcGVuIGlucHV0IGZpbGUgPCVzPlxuIiwgYXJndlthcmdjLWluc3RDb3VudCtpXSkpOwotICAgICAgICAgICAgZXhpdCgxMDApOwotICAgICAgICB9Ci0KLSAgICAgICAgREVCVUcoKCJSZWFkaW5nIGlucHV0IGZpbGVbJWRdICVzXG4iLCBpLCBhcmd2W2FyZ2MtaW5zdENvdW50K2ldKSk7Ci0KLSAgICAgICAgLyogcmVhZCBpbnB1dCBzdHJlYW0gdG8gYnVmZmVyICovCi0gICAgICAgIGZzZWVrKGZpbnB1dCwwTCxTRUVLX0VORCk7Ci0gICAgICAgIHN0cm1MZW4gPSAodTMyKWZ0ZWxsKGZpbnB1dCk7Ci0gICAgICAgIHJld2luZChmaW5wdXQpOwotICAgICAgICBkZWNvZGVyW2ldLT5ieXRlU3RybVN0YXJ0ID0gKHU4ICopbWFsbG9jKHNpemVvZih1OCkqc3RybUxlbik7Ci0gICAgICAgIGlmIChkZWNvZGVyW2ldLT5ieXRlU3RybVN0YXJ0ID09IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIERFQlVHKCgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeVxuIikpOwotICAgICAgICAgICAgZXhpdCgxMDApOwotICAgICAgICB9Ci0gICAgICAgIGZyZWFkKGRlY29kZXJbaV0tPmJ5dGVTdHJtU3RhcnQsIHNpemVvZih1OCksIHN0cm1MZW4sIGZpbnB1dCk7Ci0gICAgICAgIGZjbG9zZShmaW5wdXQpOwotCi0gICAgICAgIC8qIG9wZW4gb3V0cHV0IGZpbGUgKi8KLSAgICAgICAgaWYgKHN0cmNtcChvdXRGaWxlTmFtZSwgIm5vbmUiKSAhPSAwKQotICAgICAgICB7Ci0jaWYgZGVmaW5lZChfTk9fT1VUKQotICAgICAgICAgICAgZGVjb2RlcltpXS0+Zm91dHB1dCA9IE5VTEw7Ci0jZWxzZQotICAgICAgICAgICAgc3ByaW50ZihkZWNvZGVyW2ldLT5vdXRGaWxlTmFtZSwgIiVzJWkiLCBvdXRGaWxlTmFtZSwgaSk7Ci0gICAgICAgICAgICBkZWNvZGVyW2ldLT5mb3V0cHV0ID0gZm9wZW4oZGVjb2RlcltpXS0+b3V0RmlsZU5hbWUsICJ3YiIpOwotICAgICAgICAgICAgaWYgKGRlY29kZXJbaV0tPmZvdXRwdXQgPT0gTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBERUJVRygoIlVuYWJsZSB0byBvcGVuIG91dHB1dCBmaWxlXG4iKSk7Ci0gICAgICAgICAgICAgICAgZXhpdCgxMDApOwotICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIH0KLQotICAgICAgICByZXQgPSBIMjY0U3dEZWNJbml0KCYoZGVjb2RlcltpXS0+ZGVjSW5zdCksIGRpc2FibGVPdXRwdXRSZW9yZGVyaW5nKTsKLQotICAgICAgICBpZiAocmV0ICE9IEgyNjRTV0RFQ19PSykKLSAgICAgICAgewotICAgICAgICAgICAgREVCVUcoKCJJbml0IGZhaWxlZCAlZFxuIiwgcmV0KSk7Ci0gICAgICAgICAgICBleGl0KDEwMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbnB1dC5wU3RyZWFtID0gZGVjb2RlcltpXS0+Ynl0ZVN0cm1TdGFydDsKLSAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5wdXQuZGF0YUxlbiA9IHN0cm1MZW47Ci0gICAgICAgIGRlY29kZXJbaV0tPmRlY0lucHV0LmludHJhQ29uY2VhbG1lbnRNZXRob2QgPSAwOwotCi0gICAgfQotCi0gICAgLyogbWFpbiBkZWNvZGluZyBsb29wICovCi0gICAgZG8KLSAgICB7Ci0gICAgICAgIC8qIGRlY29kZSBvbmNlIHVzaW5nIGVhY2ggaW5zdGFuY2UgKi8KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGluc3RDb3VudDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXQgPSBIMjY0U3dEZWNEZWNvZGUoZGVjb2RlcltpXS0+ZGVjSW5zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihkZWNvZGVyW2ldLT5kZWNJbnB1dCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoZGVjb2RlcltpXS0+ZGVjT3V0cHV0KSk7Ci0KLSAgICAgICAgICAgIHN3aXRjaChyZXQpCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIEgyNjRTV0RFQ19IRFJTX1JEWV9CVUZGX05PVF9FTVBUWToKLQotICAgICAgICAgICAgICAgICAgICByZXQgPSBIMjY0U3dEZWNHZXRJbmZvKGRlY29kZXJbaV0tPmRlY0luc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJihkZWNvZGVyW2ldLT5kZWNJbmZvKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gSDI2NFNXREVDX09LKQotICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoY3JvcERpc3BsYXkgJiYgZGVjb2RlcltpXS0+ZGVjSW5mby5jcm9wcGluZ0ZsYWcpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHKCgiRGVjb2RlclslZF0gQ3JvcHBpbmcgcGFyYW1zOiAoJWQsICVkKSAlZHglZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY0luZm8uY3JvcFBhcmFtcy5jcm9wTGVmdE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbmZvLmNyb3BQYXJhbXMuY3JvcFRvcE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbmZvLmNyb3BQYXJhbXMuY3JvcE91dFdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY0luZm8uY3JvcFBhcmFtcy5jcm9wT3V0SGVpZ2h0KSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBERUJVRygoIkRlY29kZXJbJWRdIFdpZHRoICVkIEhlaWdodCAlZFxuIiwgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY0luZm8ucGljV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbmZvLnBpY0hlaWdodCkpOwotCi0gICAgICAgICAgICAgICAgICAgIERFQlVHKCgiRGVjb2RlclslZF0gdmlkZW9SYW5nZSAlZCwgbWF0cmljQ29lZmZpY2llbnRzICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgaSwgZGVjb2RlcltpXS0+ZGVjSW5mby52aWRlb1JhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5mby5tYXRyaXhDb2VmZmljaWVudHMpKTsKLSAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5wdXQuZGF0YUxlbiAtPQotICAgICAgICAgICAgICAgICAgICAgICAgKHUzMikoZGVjb2RlcltpXS0+ZGVjT3V0cHV0LnBTdHJtQ3VyclBvcyAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbnB1dC5wU3RyZWFtKTsKLSAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5wdXQucFN0cmVhbSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNPdXRwdXQucFN0cm1DdXJyUG9zOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgSDI2NFNXREVDX1BJQ19SRFlfQlVGRl9OT1RfRU1QVFk6Ci0gICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY0lucHV0LmRhdGFMZW4gLT0KLSAgICAgICAgICAgICAgICAgICAgICAgICh1MzIpKGRlY29kZXJbaV0tPmRlY091dHB1dC5wU3RybUN1cnJQb3MgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5wdXQucFN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY0lucHV0LnBTdHJlYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjT3V0cHV0LnBTdHJtQ3VyclBvczsKLSAgICAgICAgICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfUElDX1JEWToKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA9PSBIMjY0U1dERUNfUElDX1JEWSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY0lucHV0LmRhdGFMZW4gPSAwOwotCi0gICAgICAgICAgICAgICAgICAgIHJldCA9IEgyNjRTd0RlY0dldEluZm8oZGVjb2RlcltpXS0+ZGVjSW5zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKGRlY29kZXJbaV0tPmRlY0luZm8pKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldCAhPSBIMjY0U1dERUNfT0spCi0gICAgICAgICAgICAgICAgICAgICAgICBleGl0KDEpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChIMjY0U3dEZWNOZXh0UGljdHVyZShkZWNvZGVyW2ldLT5kZWNJbnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoZGVjb2RlcltpXS0+ZGVjUGljdHVyZSksIDApID09IEgyNjRTV0RFQ19QSUNfUkRZKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5waWNOdW1iZXIrKzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbnVtRXJyb3JzICs9IGRlY29kZXJbaV0tPmRlY1BpY3R1cmUubmJyT2ZFcnJNQnM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHKCgiRGVjb2RlclslZF0gUElDICVkLCB0eXBlICVzLCBjb25jZWFsZWQgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgZGVjb2RlcltpXS0+cGljTnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY1BpY3R1cmUuaXNJZHJQaWN0dXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gIklEUiIgOiAiTk9OLUlEUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjUGljdHVyZS5uYnJPZkVyck1CcykpOwotICAgICAgICAgICAgICAgICAgICAgICAgZmZsdXNoKHN0ZG91dCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIENyb3BXcml0ZU91dHB1dChkZWNvZGVyW2ldLT5mb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTgqKWRlY29kZXJbaV0tPmRlY1BpY3R1cmUucE91dHB1dFBpY3R1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyb3BEaXNwbGF5LCAmKGRlY29kZXJbaV0tPmRlY0luZm8pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtYXhOdW1QaWNzICYmIGRlY29kZXJbaV0tPnBpY051bWJlciA9PSBtYXhOdW1QaWNzKQotICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5wdXQuZGF0YUxlbiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfU1RSTV9QUk9DRVNTRUQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfU1RSTV9FUlI6Ci0gICAgICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfUEFSQU1fRVJSOgotICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbnB1dC5kYXRhTGVuID0gMDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBERUJVRygoIkRlY29kZXJbJWRdIEZBVEFMIEVSUk9SXG4iLCBpKSk7Ci0gICAgICAgICAgICAgICAgICAgIGV4aXQoMTApOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogY2hlY2sgaWYgYW55IG9mIHRoZSBpbnN0YW5jZXMgaXMgc3RpbGwgcnVubmluZyAoPWhhcyBtb3JlIGRhdGEpICovCi0gICAgICAgIGluc3RSdW5uaW5nID0gaW5zdENvdW50OwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5zdENvdW50OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkZWNvZGVyW2ldLT5kZWNJbnB1dC5kYXRhTGVuID09IDApCi0gICAgICAgICAgICAgICAgaW5zdFJ1bm5pbmctLTsKLSAgICAgICAgfQotCi0gICAgfSB3aGlsZSAoaW5zdFJ1bm5pbmcpOwotCi0KLSAgICAvKiBnZXQgbGFzdCBmcmFtZXMgYW5kIGNsb3NlIGVhY2ggaW5zdGFuY2UgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgaW5zdENvdW50OyBpKyspCi0gICAgewotICAgICAgICB3aGlsZSAoSDI2NFN3RGVjTmV4dFBpY3R1cmUoZGVjb2RlcltpXS0+ZGVjSW5zdCwKLSAgICAgICAgICAgICAgICAmKGRlY29kZXJbaV0tPmRlY1BpY3R1cmUpLCAxKSA9PSBIMjY0U1dERUNfUElDX1JEWSkKLSAgICAgICAgewotICAgICAgICAgICAgZGVjb2RlcltpXS0+cGljTnVtYmVyKys7Ci0KLSAgICAgICAgICAgIERFQlVHKCgiRGVjb2RlclslZF0gUElDICVkLCB0eXBlICVzLCBjb25jZWFsZWQgJWRcbiIsCi0gICAgICAgICAgICAgICAgaSwgZGVjb2RlcltpXS0+cGljTnVtYmVyLAotICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY1BpY3R1cmUuaXNJZHJQaWN0dXJlCi0gICAgICAgICAgICAgICAgICAgID8gIklEUiIgOiAiTk9OLUlEUiIsCi0gICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjUGljdHVyZS5uYnJPZkVyck1CcykpOwotICAgICAgICAgICAgZmZsdXNoKHN0ZG91dCk7Ci0KLSAgICAgICAgICAgIENyb3BXcml0ZU91dHB1dChkZWNvZGVyW2ldLT5mb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAodTgqKWRlY29kZXJbaV0tPmRlY1BpY3R1cmUucE91dHB1dFBpY3R1cmUsCi0gICAgICAgICAgICAgICAgICAgIGNyb3BEaXNwbGF5LCAmKGRlY29kZXJbaV0tPmRlY0luZm8pKTsKLSAgICAgICAgfQotCi0gICAgICAgIEgyNjRTd0RlY1JlbGVhc2UoZGVjb2RlcltpXS0+ZGVjSW5zdCk7Ci0KLSAgICAgICAgaWYgKGRlY29kZXJbaV0tPmZvdXRwdXQpCi0gICAgICAgICAgICBmY2xvc2UoZGVjb2RlcltpXS0+Zm91dHB1dCk7Ci0KLSAgICAgICAgZnJlZShkZWNvZGVyW2ldLT5ieXRlU3RybVN0YXJ0KTsKLQotICAgICAgICBmcmVlKGRlY29kZXJbaV0pOwotICAgIH0KLQotICAgIGZyZWUoZGVjb2Rlcik7Ci0KLSAgICBpZiAobnVtRXJyb3JzKQotICAgICAgICByZXR1cm4gMTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiAwOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIENyb3BXcml0ZU91dHB1dChGSUxFICpmb3V0cHV0LCB1OCAqaW1hZ2VEYXRhLCB1MzIgY3JvcERpc3BsYXksCi0gICAgICAgIEgyNjRTd0RlY0luZm8gKmRlY0luZm8pCi17Ci0gICAgdTggKnRtcEltYWdlID0gTlVMTDsKLSAgICB1MzIgdG1wLCBwaWNTaXplOwotCi0gICAgaWYgKGNyb3BEaXNwbGF5ICYmIGRlY0luZm8tPmNyb3BwaW5nRmxhZykKLSAgICB7Ci0gICAgICAgIHBpY1NpemUgPSBkZWNJbmZvLT5jcm9wUGFyYW1zLmNyb3BPdXRXaWR0aCAqCi0gICAgICAgICAgICAgICAgICBkZWNJbmZvLT5jcm9wUGFyYW1zLmNyb3BPdXRIZWlnaHQ7Ci0gICAgICAgIHBpY1NpemUgPSAoMyAqIHBpY1NpemUpLzI7Ci0gICAgICAgIHRtcEltYWdlID0gbWFsbG9jKHBpY1NpemUpOwotICAgICAgICBpZiAodG1wSW1hZ2UgPT0gTlVMTCkKLSAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIHRtcCA9IENyb3BQaWN0dXJlKHRtcEltYWdlLCBpbWFnZURhdGEsCi0gICAgICAgICAgICBkZWNJbmZvLT5waWNXaWR0aCwgZGVjSW5mby0+cGljSGVpZ2h0LAotICAgICAgICAgICAgJihkZWNJbmZvLT5jcm9wUGFyYW1zKSk7Ci0gICAgICAgIGlmICh0bXApCi0gICAgICAgICAgICBleGl0KDEpOwotICAgICAgICBXcml0ZU91dHB1dChmb3V0cHV0LCB0bXBJbWFnZSwgcGljU2l6ZSk7Ci0gICAgICAgIGZyZWUodG1wSW1hZ2UpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwaWNTaXplID0gZGVjSW5mby0+cGljV2lkdGggKiBkZWNJbmZvLT5waWNIZWlnaHQ7Ci0gICAgICAgIHBpY1NpemUgPSAoMyAqIHBpY1NpemUpLzI7Ci0gICAgICAgIFdyaXRlT3V0cHV0KGZvdXRwdXQsIGltYWdlRGF0YSwgcGljU2l6ZSk7Ci0gICAgfQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIFdyaXRlT3V0cHV0KEZJTEUgKmZpZCwgdTggKmRhdGEsIHUzMiBwaWNTaXplKQotewotICAgIGlmIChmaWQpCi0gICAgICAgIGZ3cml0ZShkYXRhLCAxLCBwaWNTaXplLCBmaWQpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogIEgyNjRTd0RlY1RyYWNlCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIEgyNjRTd0RlY1RyYWNlKGNoYXIgKnN0cmluZykKLXsKLSAgICBGSUxFICpmcDsKLQotICAgIGZwID0gZm9wZW4oImRlY19hcGkudHJjIiwgImF0Iik7Ci0KLSAgICBpZiAoIWZwKQotICAgICAgICByZXR1cm47Ci0KLSAgICBmd3JpdGUoc3RyaW5nLCAxLCBzdHJsZW4oc3RyaW5nKSwgZnApOwotICAgIGZ3cml0ZSgiXG4iLCAxLDEsIGZwKTsKLQotICAgIGZjbG9zZShmcCk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjbWFsbG9jCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkKiBIMjY0U3dEZWNNYWxsb2ModTMyIHNpemUsIHUzMiBudW0pCi17Ci0gICAgaWYgKHNpemUgPiBVSU5UMzJfTUFYIC8gbnVtKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gbWFsbG9jKHNpemUgKiBudW0pOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogIEgyNjRTd0RlY0ZyZWUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgSDI2NFN3RGVjRnJlZSh2b2lkICpwdHIpCi17Ci0gICAgZnJlZShwdHIpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogIEgyNjRTd0RlY01lbWNweQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBIMjY0U3dEZWNNZW1jcHkodm9pZCAqZGVzdCwgdm9pZCAqc3JjLCB1MzIgY291bnQpCi17Ci0gICAgbWVtY3B5KGRlc3QsIHNyYywgY291bnQpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogIEgyNjRTd0RlY01lbXNldAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBIMjY0U3dEZWNNZW1zZXQodm9pZCAqcHRyLCBpMzIgdmFsdWUsIHUzMiBjb3VudCkKLXsKLSAgICBtZW1zZXQocHRyLCB2YWx1ZSwgY291bnQpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogQ3JvcFBpY3R1cmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXUzMiBDcm9wUGljdHVyZSh1OCAqcE91dEltYWdlLCB1OCAqcEluSW1hZ2UsCi0gICAgdTMyIHBpY1dpZHRoLCB1MzIgcGljSGVpZ2h0LCBDcm9wUGFyYW1zICpwQ3JvcFBhcmFtcykKLXsKLQotICAgIHUzMiBpLCBqOwotICAgIHUzMiBvdXRXaWR0aCwgb3V0SGVpZ2h0OwotICAgIHU4ICpwT3V0LCAqcEluOwotCi0gICAgaWYgKHBPdXRJbWFnZSA9PSBOVUxMIHx8IHBJbkltYWdlID09IE5VTEwgfHwgcENyb3BQYXJhbXMgPT0gTlVMTCB8fAotICAgICAgICAhcGljV2lkdGggfHwgIXBpY0hlaWdodCkKLSAgICB7Ci0gICAgICAgIC8qIGR1ZSB0byBsaW50IHdhcm5pbmcgKi8KLSAgICAgICAgZnJlZShwT3V0SW1hZ2UpOwotICAgICAgICByZXR1cm4oMSk7Ci0gICAgfQotCi0gICAgaWYgKCAoKHBDcm9wUGFyYW1zLT5jcm9wTGVmdE9mZnNldCArIHBDcm9wUGFyYW1zLT5jcm9wT3V0V2lkdGgpID4KLSAgICAgICAgICAgcGljV2lkdGggKSB8fAotICAgICAgICAgKChwQ3JvcFBhcmFtcy0+Y3JvcFRvcE9mZnNldCArIHBDcm9wUGFyYW1zLT5jcm9wT3V0SGVpZ2h0KSA+Ci0gICAgICAgICAgIHBpY0hlaWdodCApICkKLSAgICB7Ci0gICAgICAgIC8qIGR1ZSB0byBsaW50IHdhcm5pbmcgKi8KLSAgICAgICAgZnJlZShwT3V0SW1hZ2UpOwotICAgICAgICByZXR1cm4oMSk7Ci0gICAgfQotCi0gICAgb3V0V2lkdGggPSBwQ3JvcFBhcmFtcy0+Y3JvcE91dFdpZHRoOwotICAgIG91dEhlaWdodCA9IHBDcm9wUGFyYW1zLT5jcm9wT3V0SGVpZ2h0OwotCi0gICAgcEluID0gcEluSW1hZ2UgKyBwQ3JvcFBhcmFtcy0+Y3JvcFRvcE9mZnNldCpwaWNXaWR0aCArCi0gICAgICAgIHBDcm9wUGFyYW1zLT5jcm9wTGVmdE9mZnNldDsKLSAgICBwT3V0ID0gcE91dEltYWdlOwotCi0gICAgLyogbHVtYSAqLwotICAgIGZvciAoaSA9IG91dEhlaWdodDsgaTsgaS0tKQotICAgIHsKLSAgICAgICAgZm9yIChqID0gb3V0V2lkdGg7IGo7IGotLSkKLSAgICAgICAgewotICAgICAgICAgICAgKnBPdXQrKyA9ICpwSW4rKzsKLSAgICAgICAgfQotICAgICAgICBwSW4gKz0gcGljV2lkdGggLSBvdXRXaWR0aDsKLSAgICB9Ci0KLSAgICBvdXRXaWR0aCA+Pj0gMTsKLSAgICBvdXRIZWlnaHQgPj49IDE7Ci0KLSAgICBwSW4gPSBwSW5JbWFnZSArIHBpY1dpZHRoKnBpY0hlaWdodCArCi0gICAgICAgIHBDcm9wUGFyYW1zLT5jcm9wVG9wT2Zmc2V0KnBpY1dpZHRoLzQgKyBwQ3JvcFBhcmFtcy0+Y3JvcExlZnRPZmZzZXQvMjsKLQotICAgIC8qIGNiICovCi0gICAgZm9yIChpID0gb3V0SGVpZ2h0OyBpOyBpLS0pCi0gICAgewotICAgICAgICBmb3IgKGogPSBvdXRXaWR0aDsgajsgai0tKQotICAgICAgICB7Ci0gICAgICAgICAgICAqcE91dCsrID0gKnBJbisrOwotICAgICAgICB9Ci0gICAgICAgIHBJbiArPSBwaWNXaWR0aC8yIC0gb3V0V2lkdGg7Ci0gICAgfQotCi0gICAgcEluID0gcEluSW1hZ2UgKyA1KnBpY1dpZHRoKnBpY0hlaWdodC80ICsKLSAgICAgICAgcENyb3BQYXJhbXMtPmNyb3BUb3BPZmZzZXQqcGljV2lkdGgvNCArIHBDcm9wUGFyYW1zLT5jcm9wTGVmdE9mZnNldC8yOwotCi0gICAgLyogY3IgKi8KLSAgICBmb3IgKGkgPSBvdXRIZWlnaHQ7IGk7IGktLSkKLSAgICB7Ci0gICAgICAgIGZvciAoaiA9IG91dFdpZHRoOyBqOyBqLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgICpwT3V0KysgPSAqcEluKys7Ci0gICAgICAgIH0KLSAgICAgICAgcEluICs9IHBpY1dpZHRoLzIgLSBvdXRXaWR0aDsKLSAgICB9Ci0KLSAgICByZXR1cm4gKDApOwotCi19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfY2hyb21hX2hvci5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9jaHJvbWFfaG9yLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNGE0ODQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9jaHJvbWFfaG9yLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTggKzAsMCBAQAotOyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotOwotOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsKLTsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsKLTsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTstLQotOy0tIEFic3RyYWN0IDogQVJNdjYgb3B0aW1pemVkIHZlcnNpb24gb2YgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yIGZ1bmN0aW9uCi07LS0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotICAgIElGICA6REVGOiBIMjY0REVDX1dJTkFTTQotICAgICAgICA7Ly8gV2UgZG9udCB1c2UgUkVRVUlSRTggYW5kIFBSRVNFUlZFOCBmb3Igd2luYXNtCi0gICAgRUxTRQotICAgICAgICBSRVFVSVJFOAotICAgICAgICBQUkVTRVJWRTgKLSAgICBFTkRJRgotCi0gICAgQVJFQSAgICB8LnRleHR8LCBDT0RFCi0KLQotOy8vIGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYUhvciByZWdpc3RlciBhbGxvY2F0aW9uCi0KLXJlZiAgICAgUk4gMAotcHRyQSAgICBSTiAwCi0KLW1iICAgICAgUk4gMQotYmxvY2sgICBSTiAxCi0KLXgwICAgICAgUk4gMgotY291bnQgICBSTiAyCi0KLXkwICAgICAgUk4gMwotdmFsWCAgICBSTiAzCi0KLXdpZHRoICAgUk4gNAotCi1oZWlnaHQgIFJOIDUKLXRtcDcgICAgUk4gNQotCi1jaHJQVyAgIFJOIDYKLXRtcDggICAgUk4gNgotCi10bXAxICAgIFJOIDcKLWNoclBIICAgUk4gNwotCi10bXAyICAgIFJOIDgKLQotdG1wMyAgICBSTiA5Ci0KLXRtcDQgICAgUk4gMTAKLQotdG1wNSAgICBSTiAxMQotCi10bXA2ICAgIFJOIDEyCi0KLWMzMiAgICAgUk4gMTQKLXhGcmFjICAgUk4gMTQKLQotOy8vIEZ1bmN0aW9uIGV4cG9ydHMgYW5kIGltcG9ydHMKLQotICAgIElNUE9SVCAgaDI2NGJzZEZpbGxCbG9jawotCi0gICAgRVhQT1JUICBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFIb3IKLQotOy8vICBGdW5jdGlvbiBhcmd1bWVudHMKLTsvLwotOy8vICB1OCAqcmVmLCAgICAgICAgICAgICAgICAgICA6IDB4YzQKLTsvLyAgdTggKnByZWRQYXJ0Q2hyb21hLCAgICAgICAgOiAweGM4Ci07Ly8gIGkzMiB4MCwgICAgICAgICAgICAgICAgICAgIDogMHhjYwotOy8vICBpMzIgeTAsICAgICAgICAgICAgICAgICAgICA6IDB4ZDAKLTsvLyAgdTMyIHdpZHRoLCAgICAgICAgICAgICAgICAgOiAweGY4Ci07Ly8gIHUzMiBoZWlnaHQsICAgICAgICAgICAgICAgIDogMHhmYwotOy8vICB1MzIgeEZyYWMsICAgICAgICAgICAgICAgICA6IDB4MTAwCi07Ly8gIHUzMiBjaHJvbWFQYXJ0V2lkdGgsICAgICAgIDogMHgxMDQKLTsvLyAgdTMyIGNocm9tYVBhcnRIZWlnaHQgICAgICAgOiAweDEwOAotCi1oMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFIb3IKLSAgICBTVE1GRCAgIHNwISwge3IwLXIxMSxscn0KLSAgICBTVUIgICAgIHNwLCBzcCwgIzB4YzQKLQotICAgIExEUiAgICAgY2hyUFcsIFtzcCwgIzB4MTA0XSAgICAgOy8vIGNocm9tYVBhcnRXaWR0aAotICAgIExEUiAgICAgd2lkdGgsIFtzcCwgIzB4ZjhdICAgICAgOy8vIHdpZHRoCi0gICAgQ01QICAgICB4MCwgIzAKLSAgICBCTFQgICAgIGRvX2ZpbGwKLQotICAgIEFERCAgICAgdG1wNiwgeDAsIGNoclBXICAgICAgICAgOy8vIHRtcDYgPSB4MCsgY2hyb21hUGFydFdpZHRoCi0gICAgQUREICAgICB0bXA2LCB0bXA2LCAjMSAgICAgICAgICA7Ly8gdG1wNiA9IHgwICsgY2hyb21hUGFydFdpZHRoICsgMQotICAgIENNUCAgICAgdG1wNiwgd2lkdGggICAgICAgICAgICAgOy8vIHgwK2Nocm9tYVBhcnRXaWR0aCsxID4gd2lkdGgKLSAgICBCSEkgICAgIGRvX2ZpbGwKLQotICAgIENNUCAgICAgeTAsICMwCi0gICAgQkxUICAgICBkb19maWxsCi0gICAgTERSICAgICBjaHJQSCwgW3NwLCAjMHgxMDhdICAgICA7Ly8gY2hyb21hUGFydEhlaWdodAotICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsICMweGZjXSAgICAgOy8vIGhlaWdodAotICAgIEFERCAgICAgdG1wNiwgeTAsIGNoclBIICAgICAgICAgOy8vIHRtcDYgPSB5MCArIGNocm9tYVBhcnRIZWlnaHQKLSAgICBDTVAgICAgIHRtcDYsIGhlaWdodAotICAgIEJMUyAgICAgc2tpcF9maWxsCi0KLWRvX2ZpbGwKLSAgICBMRFIgICAgIGNoclBILCBbc3AsICMweDEwOF0gICAgIDsvLyBjaHJvbWFQYXJ0SGVpZ2h0Ci0gICAgTERSICAgICBoZWlnaHQsIFtzcCwgIzB4ZmNdICAgICA7Ly8gaGVpZ2h0Ci0gICAgQUREICAgICB0bXA4LCBjaHJQVywgIzEgICAgICAgICA7Ly8gdG1wOCA9IGNocm9tYVBhcnRXaWR0aCsxCi0gICAgTU9WICAgICB0bXAyLCB0bXA4ICAgICAgICAgICAgICA7Ly8gdG1wMiA9IGNocm9tYVBhcnRXaWR0aCsxCi0gICAgU1RNSUEgICBzcCx7d2lkdGgsaGVpZ2h0LHRtcDgsY2hyUEgsdG1wMn0KLSAgICBBREQgICAgIGJsb2NrLCBzcCwgIzB4MWMgICAgICAgIDsvLyBibG9jawotICAgIEJMICAgICAgaDI2NGJzZEZpbGxCbG9jawotCi0gICAgTERSICAgICB4MCwgW3NwLCAjMHhjY10KLSAgICBMRFIgICAgIHkwLCBbc3AsICMweGQwXQotICAgIExEUiAgICAgcmVmLCBbc3AsICMweGM0XSAgICAgICAgOy8vIHJlZgotICAgIFNUTUlBICAgc3Ase3dpZHRoLGhlaWdodCx0bXA4LGNoclBILHRtcDJ9Ci0gICAgQUREICAgICBibG9jaywgc3AsICMweDFjICAgICAgICA7Ly8gYmxvY2sKLSAgICBNTEEgICAgIHJlZiwgaGVpZ2h0LCB3aWR0aCwgcmVmIDsvLyByZWYgKz0gd2lkdGggKiBoZWlnaHQ7IAotICAgIE1MQSAgICAgYmxvY2ssIGNoclBILCB0bXA4LCBibG9jazsvLyBibG9jayArIChjaHJvbWFQSCkqKGNocm9tYVBXKzEpCi0gICAgQkwgICAgICBoMjY0YnNkRmlsbEJsb2NrCi0KLSAgICBNT1YgICAgIHgwLCAjMCAgICAgICAgICAgICAgICAgIDsvLyB4MCA9IDAKLSAgICBNT1YgICAgIHkwLCAjMCAgICAgICAgICAgICAgICAgIDsvLyB5MCA9IDAKLSAgICBTVFIgICAgIHgwLCBbc3AsICMweGNjXQotICAgIFNUUiAgICAgeTAsIFtzcCwgIzB4ZDBdCi0gICAgQUREICAgICByZWYsIHNwLCAjMHgxYyAgICAgICAgICA7Ly8gcmVmID0gYmxvY2sKLSAgICBTVFIgICAgIHJlZiwgW3NwLCAjMHhjNF0gICAgICAgIDsvLyByZWYKLQotICAgIFNUUiAgICAgY2hyUEgsIFtzcCwgIzB4ZmNdICAgICAgOy8vIGhlaWdodAotICAgIFNUUiAgICAgdG1wOCwgW3NwLCAjMHhmOF0gICAgICAgOy8vIHdpZHRoCi0gICAgTU9WICAgICB3aWR0aCwgdG1wOAotICAgIFNVQiAgICAgY2hyUFcsIGNoclBXLCAjMQotCi1za2lwX2ZpbGwKLSAgICBNTEEgICAgIHRtcDMsIHkwLCB3aWR0aCwgeDAgICAgIDsvLyB0bXAzID0geTAqd2lkdGgreDAKLSAgICBMRFIgICAgIHhGcmFjLCBbc3AsICMweDEwMF0gICAgIDsvLyB4RnJhYwotICAgIEFERCAgICAgcHRyQSwgcmVmLCB0bXAzICAgICAgICAgOy8vIHB0ckEgPSByZWYgKyB5MCp3aWR0aCt4MAotICAgIFJTQiAgICAgdmFsWCwgeEZyYWMsICM4ICAgICAgICAgOy8vIHZhbFggPSA4LXhGcmFjCi0KLSAgICBMRFIgICAgIG1iLCBbc3AsICMweGM4XSAgICAgICAgIDsvLyBwcmVkUGFydENocm9tYQotCi0KLSAgICA7Ly8gcGFjayB2YWx1ZXMgdG8gY291bnQgcmVnaXN0ZXIKLSAgICA7Ly8gWzMxOjI4XSBsb29wX3ggKGNocm9tYVBhcnRXaWR0aC0xKQotICAgIDsvLyBbMjc6MjRdIGxvb3BfeSAoY2hyb21hUGFydEhlaWdodC0xKQotICAgIDsvLyBbMjM6MjBdIGNocm9tYVBhcnRXaWR0aC0xCi0gICAgOy8vIFsxOToxNl0gY2hyb21hUGFydEhlaWdodC0xCi0gICAgOy8vIFsxNTowMF0gbm90aGluZwotCi0gICAgU1VCICAgICB0bXAyLCBjaHJQSCwgIzEgICAgICAgICAgICAgOy8vIGNocm9tYVBhcnRIZWlnaHQtMQotICAgIFNVQiAgICAgdG1wMSwgY2hyUFcsICMxICAgICAgICAgICAgIDsvLyBjaHJvbWFQYXJ0V2lkdGgtMQotICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAyLCBMU0wgIzE2IDsvLyBjaHJvbWFQYXJ0SGVpZ2h0LTEKLSAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMiwgTFNMICMyNCA7Ly8gbG9vcF95Ci0gICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDEsIExTTCAjMjAgOy8vIGNocm9tYVBhcnRXaWR0aC0xCi0gICAgQU5EICAgICB0bXAyLCBjb3VudCwgIzB4MDBGMDAwMDAgICAgOy8vIGxvb3BfeAotICAgIFBLSEJUICAgdmFsWCwgdmFsWCwgeEZyYWMsIExTTCAjMTYgIDsvLyB8eEZyYWN8dmFsWCB8Ci0gICAgTU9WICAgICB2YWxYLCB2YWxYLCBMU0wgIzMgICAgICAgICAgOy8vIG11bHRpcGx5IGJ5IDggaW4gYWR2YW5jZQotICAgIE1PViAgICAgYzMyLCAjMzIKLQotCi0gICAgOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIDsvLyBDYgotICAgIDsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIDsvLyAyeDIgcGVscyBwZXIgaXRlcmF0aW9uCi0gICAgOy8vIGJpbGluZWFyIHZlcnRpY2FsIGludGVycG9sYXRpb24KLQotbG9vcDFfeQotICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAyLCBMU0wgIzgKLSAgICBMRFJCICAgIHRtcDEsIFtwdHJBLCB3aWR0aF0KLSAgICBMRFJCICAgIHRtcDIsIFtwdHJBXSwgIzEKLQotbG9vcDFfeAotICAgIExEUkIgICAgdG1wMywgW3B0ckEsIHdpZHRoXQotICAgIExEUkIgICAgdG1wNCwgW3B0ckFdLCAjMQotCi0gICAgUEtIQlQgICB0bXA1LCB0bXAxLCB0bXAzLCBMU0wgIzE2Ci0gICAgUEtIQlQgICB0bXA2LCB0bXAyLCB0bXA0LCBMU0wgIzE2Ci0KLSAgICBMRFJCICAgIHRtcDEsIFtwdHJBLCB3aWR0aF0KLSAgICBMRFJCICAgIHRtcDIsIFtwdHJBXSwgIzEKLQotICAgIFNNTEFEICAgdG1wNSwgdG1wNSwgdmFsWCwgYzMyICAgICAgIDsvLyBtdWx0aXBseQotICAgIFNNTEFEICAgdG1wNiwgdG1wNiwgdmFsWCwgYzMyICAgICAgIDsvLyBtdWx0aXBseQotCi0gICAgUEtIQlQgICB0bXA3LCB0bXAzLCB0bXAxLCBMU0wgIzE2Ci0gICAgUEtIQlQgICB0bXA4LCB0bXA0LCB0bXAyLCBMU0wgIzE2Ci0KLSAgICBTTUxBRCAgIHRtcDcsIHRtcDcsIHZhbFgsIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKLSAgICBTTUxBRCAgIHRtcDgsIHRtcDgsIHZhbFgsIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKLQotICAgIE1PViAgICAgdG1wNSwgdG1wNSwgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCi0gICAgU1RSQiAgICB0bXA1LCBbbWIsIzhdICAgICAgICAgICAgICAgOy8vIHN0b3JlIHJvdyAyIGNvbCAxCi0KLSAgICBNT1YgICAgIHRtcDYsIHRtcDYsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgotICAgIFNUUkIgICAgdG1wNiwgW21iXSwjMSAgICAgICAgICAgICAgIDsvLyBzdG9yZSByb3cgMSBjb2wgMQotCi0gICAgTU9WICAgICB0bXA3LCB0bXA3LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KLSAgICBTVFJCICAgIHRtcDcsIFttYiwjOF0gICAgICAgICAgICAgICA7Ly8gc3RvcmUgcm93IDIgY29sIDIKLQotICAgIE1PViAgICAgdG1wOCwgdG1wOCwgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCi0gICAgU1RSQiAgICB0bXA4LCBbbWJdLCMxICAgICAgICAgICAgICAgOy8vIHN0b3JlIHJvdyAxIGNvbCAyCi0KLSAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzI8PDI4Ci0gICAgQkNTICAgICBsb29wMV94Ci0KLSAgICBBTkQgICAgIHRtcDIsIGNvdW50LCAjMHgwMEYwMDAwMAotCi0gICAgQUREUyAgICBtYiwgbWIsICMxNgotICAgIFNCQyAgICAgbWIsIG1iLCB0bXAyLCBMU1IgIzIwCi0gICAgQUREICAgICBwdHJBLCBwdHJBLCB3aWR0aCwgTFNMICMxCi0gICAgU0JDICAgICBwdHJBLCBwdHJBLCB0bXAyLCBMU1IgIzIwCi0gICAgU1VCICAgICBwdHJBLCBwdHJBLCAjMQotCi0gICAgQUREUyAgICBjb3VudCwgY291bnQsICMweEUgPDwgMjQKLSAgICBCR0UgICAgIGxvb3AxX3kKLQotICAgIDsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICA7Ly8gQ3IKLSAgICA7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgTERSICAgICBoZWlnaHQsIFtzcCwjMHhmY10gICAgICAgICAgOy8vIGhlaWdodAotICAgIExEUiAgICAgcmVmLCBbc3AsICMweGM0XSAgICAgICAgICAgIDsvLyByZWYKLSAgICBMRFIgICAgIHRtcDEsIFtzcCwgIzB4ZDBdICAgICAgICAgICA7Ly8geTAKLSAgICBMRFIgICAgIHRtcDIsIFtzcCwgIzB4Y2NdICAgICAgICAgICA7Ly8geDAKLSAgICBMRFIgICAgIG1iLCBbc3AsICMweGM4XSAgICAgICAgICAgICA7Ly8gcHJlZFBhcnRDaHJvbWEKLQotICAgIEFERCAgICAgdG1wMSwgaGVpZ2h0LCB0bXAxCi0gICAgTUxBICAgICB0bXAzLCB0bXAxLCB3aWR0aCwgdG1wMgotICAgIEFERCAgICAgcHRyQSwgcmVmLCB0bXAzCi0gICAgQUREICAgICBtYiwgbWIsICM2NAotCi0gICAgQU5EICAgICBjb3VudCwgY291bnQsICMweDAwRkZGRkZGCi0gICAgQU5EICAgICB0bXAxLCBjb3VudCwgIzB4MDAwRjAwMDAKLSAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMSwgTFNMICM4Ci0gICAgQU5EICAgICB0bXAyLCBjb3VudCwgIzB4MDBGMDAwMDAKLQotICAgIDsvLyAyeDIgcGVscyBwZXIgaXRlcmF0aW9uCi0gICAgOy8vIGJpbGluZWFyIHZlcnRpY2FsIGludGVycG9sYXRpb24KLWxvb3AyX3kKLSAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMiwgTFNMICM4Ci0gICAgTERSQiAgICB0bXAxLCBbcHRyQSwgd2lkdGhdCi0gICAgTERSQiAgICB0bXAyLCBbcHRyQV0sICMxCi0KLWxvb3AyX3gKLSAgICBMRFJCICAgIHRtcDMsIFtwdHJBLCB3aWR0aF0KLSAgICBMRFJCICAgIHRtcDQsIFtwdHJBXSwgIzEKLQotICAgIFBLSEJUICAgdG1wNSwgdG1wMSwgdG1wMywgTFNMICMxNgotICAgIFBLSEJUICAgdG1wNiwgdG1wMiwgdG1wNCwgTFNMICMxNgotCi0gICAgTERSQiAgICB0bXAxLCBbcHRyQSwgd2lkdGhdCi0gICAgTERSQiAgICB0bXAyLCBbcHRyQV0sICMxCi0KLSAgICBTTUxBRCAgIHRtcDUsIHRtcDUsIHZhbFgsIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKLSAgICBTTUxBRCAgIHRtcDYsIHRtcDYsIHZhbFgsIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKLQotICAgIFBLSEJUICAgdG1wNywgdG1wMywgdG1wMSwgTFNMICMxNgotICAgIFBLSEJUICAgdG1wOCwgdG1wNCwgdG1wMiwgTFNMICMxNgotCi0gICAgU01MQUQgICB0bXA3LCB0bXA3LCB2YWxYLCBjMzIgICAgICAgOy8vIG11bHRpcGx5Ci0gICAgU01MQUQgICB0bXA4LCB0bXA4LCB2YWxYLCBjMzIgICAgICAgOy8vIG11bHRpcGx5Ci0KLSAgICBNT1YgICAgIHRtcDUsIHRtcDUsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgotICAgIFNUUkIgICAgdG1wNSwgW21iLCM4XSAgICAgICAgICAgICAgIDsvLyBzdG9yZSByb3cgMiBjb2wgMQotCi0gICAgTU9WICAgICB0bXA2LCB0bXA2LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KLSAgICBTVFJCICAgIHRtcDYsIFttYl0sIzEgICAgICAgICAgICAgICA7Ly8gc3RvcmUgcm93IDEgY29sIDEKLQotICAgIE1PViAgICAgdG1wNywgdG1wNywgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCi0gICAgU1RSQiAgICB0bXA3LCBbbWIsIzhdICAgICAgICAgICAgICAgOy8vIHN0b3JlIHJvdyAyIGNvbCAyCi0KLSAgICBNT1YgICAgIHRtcDgsIHRtcDgsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgotICAgIFNUUkIgICAgdG1wOCwgW21iXSwjMSAgICAgICAgICAgICAgIDsvLyBzdG9yZSByb3cgMSBjb2wgMgotCi0gICAgU1VCUyAgICBjb3VudCwgY291bnQsICMyPDwyOAotICAgIEJDUyAgICAgbG9vcDJfeAotCi0gICAgQU5EICAgICB0bXAyLCBjb3VudCwgIzB4MDBGMDAwMDAKLQotICAgIEFERFMgICAgbWIsIG1iLCAjMTYKLSAgICBTQkMgICAgIG1iLCBtYiwgdG1wMiwgTFNSICMyMAotICAgIEFERCAgICAgcHRyQSwgcHRyQSwgd2lkdGgsIExTTCAjMQotICAgIFNCQyAgICAgcHRyQSwgcHRyQSwgdG1wMiwgTFNSICMyMAotICAgIFNVQiAgICAgcHRyQSwgcHRyQSwgIzEKLQotICAgIEFERFMgICAgY291bnQsIGNvdW50LCAjMHhFIDw8IDI0Ci0gICAgQkdFICAgICBsb29wMl95Ci0KLSAgICBBREQgICAgIHNwLHNwLCMweGQ0Ci0gICAgTERNRkQgICBzcCEsIHtyNC1yMTEscGN9Ci0KLSAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfY2hyb21hX2hvcl92ZXIucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfY2hyb21hX2hvcl92ZXIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQyMGFkMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX2Nocm9tYV9ob3JfdmVyLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzkgKzAsMCBAQAotOyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotOwotOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsKLTsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsKLTsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTstLQotOy0tIEFic3RyYWN0IDogQVJNdjYgb3B0aW1pemVkIHZlcnNpb24gb2YgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yVmVyIAotOy0tICAgICAgICAgICAgZnVuY3Rpb24KLTstLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0gICAgSUYgIDpERUY6IEgyNjRERUNfV0lOQVNNCi0gICAgICAgIDsvLyBXZSBkb250IHVzZSBSRVFVSVJFOCBhbmQgUFJFU0VSVkU4IGZvciB3aW5hc20KLSAgICBFTFNFCi0gICAgICAgIFJFUVVJUkU4Ci0gICAgICAgIFBSRVNFUlZFOAotICAgIEVORElGCi0KLSAgICBBUkVBICAgIHwudGV4dHwsIENPREUKLQotCi07Ly8gaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yVmVyIHJlZ2lzdGVyIGFsbG9jYXRpb24KLQotcmVmICAgICBSTiAwCi1wdHJBICAgIFJOIDAKLQotbWIgICAgICBSTiAxCi1ibG9jayAgIFJOIDEKLQoteDAgICAgICBSTiAyCi1jb3VudCAgIFJOIDIKLQoteTAgICAgICBSTiAzCi12YWxZICAgIFJOIDMKLQotd2lkdGggICBSTiA0Ci0KLXRtcDQgICAgUk4gNQotaGVpZ2h0ICBSTiA1Ci0KLXRtcDEgICAgUk4gNgotCi10bXAyICAgIFJOIDcKLQotdG1wMyAgICBSTiA4Ci0KLXZhbFggICAgUk4gOQotCi10bXA1ICAgIFJOIDEwCi1jaHJQVyAgIFJOIDEwCi0KLXRtcDYgICAgUk4gMTEKLWNoclBIICAgUk4gMTEKLQoteEZyYWMgICBSTiAxMgotCi1jMzIgICAgIFJOIDE0Ci15RnJhYyAgIFJOIDE0Ci0KLTsvLyBmdW5jdGlvbiBleHBvcnRzIGFuZCBpbXBvcnRzCi0KLSAgICBJTVBPUlQgIGgyNjRic2RGaWxsQmxvY2sKLQotICAgIEVYUE9SVCAgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yVmVyCi0KLTsvLyAgRnVuY3Rpb24gYXJndW1lbnRzCi07Ly8KLTsvLyAgdTggKnJlZiwgICAgICAgICAgICAgICAgICAgOiAweGM0Ci07Ly8gIHU4ICpwcmVkUGFydENocm9tYSwgICAgICAgIDogMHhjOAotOy8vICBpMzIgeDAsICAgICAgICAgICAgICAgICAgICA6IDB4Y2MKLTsvLyAgaTMyIHkwLCAgICAgICAgICAgICAgICAgICAgOiAweGQwCi07Ly8gIHUzMiB3aWR0aCwgICAgICAgICAgICAgICAgIDogMHhmOAotOy8vICB1MzIgaGVpZ2h0LCAgICAgICAgICAgICAgICA6IDB4ZmMKLTsvLyAgdTMyIHhGcmFjLCAgICAgICAgICAgICAgICAgOiAweDEwMAotOy8vICB1MzIgeUZyYWMsICAgICAgICAgICAgICAgICA6IDB4MTA0Ci07Ly8gIHUzMiBjaHJvbWFQYXJ0V2lkdGgsICAgICAgIDogMHgxMDgKLTsvLyAgdTMyIGNocm9tYVBhcnRIZWlnaHQgICAgICAgOiAweDEwYwotCi1oMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFIb3JWZXIKLSAgICBTVE1GRCAgIHNwISwge3IwLXIxMSxscn0KLSAgICBTVUIgICAgIHNwLCBzcCwgIzB4YzQKLQotICAgIExEUiAgICAgY2hyUFcsIFtzcCwgIzB4MTA4XSAgICAgOy8vIGNocm9tYVBhcnRXaWR0aAotICAgIExEUiAgICAgeEZyYWMsIFtzcCwgIzB4MTAwXSAgICAgOy8vIHhGcmFjCi0gICAgTERSICAgICB3aWR0aCwgW3NwLCAjMHhmOF0gICAgICA7Ly8gd2lkdGgKLSAgICBDTVAgICAgIHgwLCAjMAotICAgIEJMVCAgICAgZG9fZmlsbAotCi0gICAgQUREICAgICB0bXAxLCB4MCwgY2hyUFcgICAgICAgICA7Ly8gdG1wMSA9IHgwKyBjaHJvbWFQYXJ0V2lkdGgKLSAgICBBREQgICAgIHRtcDEsIHRtcDEsICMxICAgICAgICAgIDsvLyB0bXAxID0geDArIGNocm9tYVBhcnRXaWR0aCsxCi0gICAgQ01QICAgICB0bXAxLCB3aWR0aCAgICAgICAgICAgICA7Ly8geDArY2hyb21hUGFydFdpZHRoKzEgPiB3aWR0aAotICAgIEJISSAgICAgZG9fZmlsbAotCi0gICAgQ01QICAgICB5MCwgIzAKLSAgICBCTFQgICAgIGRvX2ZpbGwKLSAgICBMRFIgICAgIGNoclBILCBbc3AsICMweDEwY10gICAgIDsvLyBjaHJvbWFQYXJ0SGVpZ2h0Ci0gICAgTERSICAgICBoZWlnaHQsIFtzcCwgIzB4ZmNdICAgICA7Ly8gaGVpZ2h0Ci0gICAgQUREICAgICB0bXAxLCB5MCwgY2hyUEggICAgICAgICA7Ly8gdG1wMSA9IHkwICsgY2hyb21hUGFydEhlaWdodAotICAgIEFERCAgICAgdG1wMSwgdG1wMSwgIzEgICAgICAgICAgOy8vIHRtcDEgPSB5MCArIGNocm9tYVBhcnRIZWlnaHQgKyAxCi0gICAgQ01QICAgICB0bXAxLCBoZWlnaHQKLSAgICBCTFMgICAgIHNraXBfZmlsbAotCi1kb19maWxsCi0gICAgTERSICAgICBjaHJQSCwgW3NwLCAjMHgxMGNdICAgICA7Ly8gY2hyb21hUGFydEhlaWdodAotICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsICMweGZjXSAgICAgOy8vIGhlaWdodAotICAgIEFERCAgICAgdG1wMywgY2hyUFcsICMxICAgICAgICAgOy8vIHRtcDMgPSBjaHJvbWFQYXJ0V2lkdGgrMQotICAgIEFERCAgICAgdG1wMSwgY2hyUFcsICMxICAgICAgICAgOy8vIHRtcDEgPSBjaHJvbWFQYXJ0V2lkdGgrMQotICAgIEFERCAgICAgdG1wMiwgY2hyUEgsICMxICAgICAgICAgOy8vIHRtcDIgPSBjaHJvbWFQYXJ0SGVpZ2h0KzEKLSAgICBTVE1JQSAgIHNwLHt3aWR0aCxoZWlnaHQsdG1wMSx0bXAyLHRtcDN9Ci0gICAgQUREICAgICBibG9jaywgc3AsICMweDFjICAgICAgICA7Ly8gYmxvY2sKLSAgICBCTCAgICAgIGgyNjRic2RGaWxsQmxvY2sKLQotICAgIExEUiAgICAgeDAsIFtzcCwgIzB4Y2NdCi0gICAgTERSICAgICB5MCwgW3NwLCAjMHhkMF0KLSAgICBMRFIgICAgIHJlZiwgW3NwLCAjMHhjNF0gICAgICAgIDsvLyByZWYKLSAgICBTVE1JQSAgIHNwLHt3aWR0aCxoZWlnaHQsdG1wMSx0bXAyLHRtcDN9Ci0gICAgQUREICAgICBibG9jaywgc3AsICMweDFjICAgICAgICA7Ly8gYmxvY2sKLSAgICBNTEEgICAgIHJlZiwgaGVpZ2h0LCB3aWR0aCwgcmVmIDsvLyByZWYgKz0gd2lkdGggKiBoZWlnaHQ7IAotICAgIE1MQSAgICAgYmxvY2ssIHRtcDIsIHRtcDEsIGJsb2NrOy8vIGJsb2NrICsgKGNocm9tYVBXKzEpKihjaHJvbWFQSCsxKQotICAgIEJMICAgICAgaDI2NGJzZEZpbGxCbG9jawotCi0gICAgTU9WICAgICB4MCwgIzAgICAgICAgICAgICAgICAgICA7Ly8geDAgPSAwCi0gICAgTU9WICAgICB5MCwgIzAgICAgICAgICAgICAgICAgICA7Ly8geTAgPSAwCi0gICAgU1RSICAgICB4MCwgW3NwLCAjMHhjY10KLSAgICBTVFIgICAgIHkwLCBbc3AsICMweGQwXQotICAgIEFERCAgICAgcmVmLCBzcCwgIzB4MWMgICAgICAgICAgOy8vIHJlZiA9IGJsb2NrCi0gICAgU1RSICAgICByZWYsIFtzcCwgIzB4YzRdICAgICAgICA7Ly8gcmVmCi0KLSAgICBTVFIgICAgIHRtcDIsIFtzcCwgIzB4ZmNdICAgICAgIDsvLyBoZWlnaHQKLSAgICBTVFIgICAgIHRtcDEsIFtzcCwgIzB4ZjhdICAgICAgIDsvLyB3aWR0aAotICAgIE1PViAgICAgd2lkdGgsIHRtcDEKLQotc2tpcF9maWxsCi0gICAgTUxBICAgICB0bXAzLCB5MCwgd2lkdGgsIHgwICAgICA7Ly8gdG1wMyA9IHkwKndpZHRoK3gwCi0gICAgTERSICAgICB5RnJhYywgW3NwLCAjMHgxMDRdICAgICA7Ly8geUZyYWMKLSAgICBMRFIgICAgIHhGcmFjLCBbc3AsICMweDEwMF0KLSAgICBBREQgICAgIHB0ckEsIHJlZiwgdG1wMyAgICAgICAgIDsvLyBwdHJBID0gcmVmICsgeTAqd2lkdGgreDAKLSAgICBSU0IgICAgIHZhbFgsIHhGcmFjLCAjOCAgICAgICAgIDsvLyB2YWxYID0gOC14RnJhYwotICAgIFJTQiAgICAgdmFsWSwgeUZyYWMsICM4ICAgICAgICAgOy8vIHZhbFkgPSA4LXlGcmFjCi0KLSAgICBMRFIgICAgIG1iLCBbc3AsICMweGM4XSAgICAgICAgIDsvLyBwcmVkUGFydENocm9tYQotCi0KLSAgICA7Ly8gcGFjayB2YWx1ZXMgdG8gY291bnQgcmVnaXN0ZXIKLSAgICA7Ly8gWzMxOjI4XSBsb29wX3ggKGNocm9tYVBhcnRXaWR0aC0xKQotICAgIDsvLyBbMjc6MjRdIGxvb3BfeSAoY2hyb21hUGFydEhlaWdodC0xKQotICAgIDsvLyBbMjM6MjBdIGNocm9tYVBhcnRXaWR0aC0xCi0gICAgOy8vIFsxOToxNl0gY2hyb21hUGFydEhlaWdodC0xCi0gICAgOy8vIFsxNTowMF0gbm90aGluZwotCi0gICAgU1VCICAgICB0bXAyLCBjaHJQSCwgIzEgICAgICAgICAgICAgOy8vIGNocm9tYVBhcnRIZWlnaHQtMQotICAgIFNVQiAgICAgdG1wMSwgY2hyUFcsICMxICAgICAgICAgICAgIDsvLyBjaHJvbWFQYXJ0V2lkdGgtMQotICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAyLCBMU0wgIzE2IDsvLyBjaHJvbWFQYXJ0SGVpZ2h0LTEKLSAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMiwgTFNMICMyNCA7Ly8gbG9vcF95Ci0gICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDEsIExTTCAjMjAgOy8vIGNocm9tYVBhcnRXaWR0aC0xCi0gICAgQU5EICAgICB0bXAyLCBjb3VudCwgIzB4MDBGMDAwMDAgICAgOy8vIGxvb3BfeAotICAgIFBLSEJUICAgdmFsWSwgdmFsWSwgeUZyYWMsIExTTCAjMTYgIDsvLyB8eUZyYWN8dmFsWSB8Ci0gICAgTU9WICAgICBjMzIsICMzMgotCi0KLSAgICA7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgOy8vIENiCi0gICAgOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgOy8vIDJ4MiBwZWxzIHBlciBpdGVyYXRpb24KLSAgICA7Ly8gYmlsaW5lYXIgdmVydGljYWwgYW5kIGhvcml6b250YWwgaW50ZXJwb2xhdGlvbgotCi1sb29wMV95Ci0gICAgTERSQiAgICB0bXAxLCBbcHRyQV0KLSAgICBMRFJCICAgIHRtcDMsIFtwdHJBLCB3aWR0aF0KLSAgICBMRFJCICAgIHRtcDUsIFtwdHJBLCB3aWR0aCwgTFNMICMxXQotCi0gICAgUEtIQlQgICB0bXAxLCB0bXAxLCB0bXAzLCBMU0wgIzE2ICAgOy8vIHx0M3x0MXwKLSAgICBQS0hCVCAgIHRtcDMsIHRtcDMsIHRtcDUsIExTTCAjMTYgICA7Ly8gfHQ1fHQzfAotCi0gICAgU01VQUQgICB0bXAxLCB0bXAxLCB2YWxZICAgICAgICAgICAgOy8vIHQxPSh0MSp2YWxZICsgdDMqeUZyYWMpCi0gICAgU01VQUQgICB0bXAzLCB0bXAzLCB2YWxZICAgICAgICAgICAgOy8vIHQzPSh0Myp2YWxZICsgdDUqeUZyYWMpCi0KLSAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMiwgTFNMICM4Ci1sb29wMV94Ci0gICAgOy8vIGZpcnN0Ci0gICAgTERSQiAgICB0bXAyLCBbcHRyQSwgIzFdIQotICAgIExEUkIgICAgdG1wNCwgW3B0ckEsIHdpZHRoXQotICAgIExEUkIgICAgdG1wNiwgW3B0ckEsIHdpZHRoLCBMU0wgIzFdCi0KLSAgICBQS0hCVCAgIHRtcDIsIHRtcDIsIHRtcDQsIExTTCAjMTYgICA7Ly8gfHQ0fHQyfAotICAgIFBLSEJUICAgdG1wNCwgdG1wNCwgdG1wNiwgTFNMICMxNiAgIDsvLyB8dDZ8dDR8Ci0KLSAgICBTTVVBRCAgIHRtcDIsIHRtcDIsIHZhbFkgICAgICAgICAgICA7Ly8gdDI9KHQyKnZhbFkgKyB0NCp5RnJhYykKLSAgICBNTEEgICAgIHRtcDUsIHRtcDEsIHZhbFgsIGMzMiAgICAgICA7Ly8gdDU9dDEqdmFsWCszMgotICAgIE1MQSAgICAgdG1wNSwgdG1wMiwgeEZyYWMsIHRtcDUgICAgIDsvLyB0NT10Mip4RnJhYyt0NQotCi0gICAgU01VQUQgICB0bXA0LCB0bXA0LCB2YWxZICAgICAgICAgICAgOy8vIHQ0PSh0NCp2YWxZICsgdDYqeUZyYWMpCi0gICAgTUxBICAgICB0bXA2LCB0bXAzLCB2YWxYLCBjMzIgICAgICAgOy8vIHQzPXQzKnZhbFgrMzIKLSAgICBNTEEgICAgIHRtcDYsIHRtcDQsIHhGcmFjLCB0bXA2ICAgICA7Ly8gdDY9dDQqeEZyYWMrdDYKLQotICAgIE1PViAgICAgdG1wNiwgdG1wNiwgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCi0gICAgU1RSQiAgICB0bXA2LCBbbWIsICM4XSAgICAgICAgICAgICAgOy8vIHN0b3JlIHBpeGVsCi0gICAgTU9WICAgICB0bXA1LCB0bXA1LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KLSAgICBTVFJCICAgIHRtcDUsIFttYl0sICMxICAgICAgICAgICAgICA7Ly8gc3RvcmUgcGl4ZWwKLQotICAgIDsvLyBzZWNvbmQKLSAgICBMRFJCICAgIHRtcDEsIFtwdHJBLCAjMV0hCi0gICAgTERSQiAgICB0bXAzLCBbcHRyQSwgd2lkdGhdCi0gICAgTERSQiAgICB0bXA1LCBbcHRyQSwgd2lkdGgsIExTTCAjMV0KLQotICAgIFBLSEJUICAgdG1wMSwgdG1wMSwgdG1wMywgTFNMICMxNiAgIDsvLyB8dDN8dDF8Ci0gICAgUEtIQlQgICB0bXAzLCB0bXAzLCB0bXA1LCBMU0wgIzE2ICAgOy8vIHx0NXx0M3wKLQotICAgIFNNVUFEICAgdG1wMSwgdG1wMSwgdmFsWSAgICAgICAgICAgIDsvLyB0MT0odDEqdmFsWSArIHQzKnlGcmFjKQotICAgIE1MQSAgICAgdG1wNSwgdG1wMSwgeEZyYWMsIGMzMiAgICAgIDsvLyB0MT10MSp4RnJhYyszMgotICAgIE1MQSAgICAgdG1wNSwgdG1wMiwgdmFsWCwgdG1wNSAgICAgIDsvLyB0NT10Mip2YWxYK3Q1Ci0KLSAgICBTTVVBRCAgIHRtcDMsIHRtcDMsIHZhbFkgICAgICAgICAgICA7Ly8gdDM9KHQzKnZhbFkgKyB0NSp5RnJhYykKLSAgICBNTEEgICAgIHRtcDYsIHRtcDMsIHhGcmFjLCBjMzIgICAgICA7Ly8gdDM9dDMqeEZyYWMrMzIKLSAgICBNTEEgICAgIHRtcDYsIHRtcDQsIHZhbFgsIHRtcDYgICAgICA7Ly8gdDY9dDQqdmFsWCt0NgotCi0gICAgTU9WICAgICB0bXA2LCB0bXA2LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KLSAgICBTVFJCICAgIHRtcDYsIFttYiwgIzhdICAgICAgICAgICAgICA7Ly8gc3RvcmUgcGl4ZWwKLSAgICBNT1YgICAgIHRtcDUsIHRtcDUsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgotICAgIFNUUkIgICAgdG1wNSwgW21iXSwgIzEgICAgICAgICAgICAgIDsvLyBzdG9yZSBwaXhlbAotCi0gICAgU1VCUyAgICBjb3VudCwgY291bnQsICMyPDwyOAotICAgIEJDUyAgICAgbG9vcDFfeAotCi0gICAgQU5EICAgICB0bXAyLCBjb3VudCwgIzB4MDBGMDAwMDAKLQotICAgIEFERFMgICAgbWIsIG1iLCAjMTYKLSAgICBTQkMgICAgIG1iLCBtYiwgdG1wMiwgTFNSICMyMAotICAgIEFERCAgICAgcHRyQSwgcHRyQSwgd2lkdGgsIExTTCAjMQotICAgIFNCQyAgICAgcHRyQSwgcHRyQSwgdG1wMiwgTFNSICMyMAotCi0gICAgQUREUyAgICBjb3VudCwgY291bnQsICMweEUgPDwgMjQKLSAgICBCR0UgICAgIGxvb3AxX3kKLQotICAgIDsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICA7Ly8gQ3IKLSAgICA7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgTERSICAgICBoZWlnaHQsIFtzcCwjMHhmY10gICAgICAgICAgOy8vIGhlaWdodAotICAgIExEUiAgICAgcmVmLCBbc3AsICMweGM0XSAgICAgICAgICAgIDsvLyByZWYKLSAgICBMRFIgICAgIHRtcDEsIFtzcCwgIzB4ZDBdICAgICAgICAgICA7Ly8geTAKLSAgICBMRFIgICAgIHRtcDIsIFtzcCwgIzB4Y2NdICAgICAgICAgICA7Ly8geDAKLSAgICBMRFIgICAgIG1iLCBbc3AsICMweGM4XSAgICAgICAgICAgICA7Ly8gcHJlZFBhcnRDaHJvbWEKLQotICAgIEFERCAgICAgdG1wMSwgaGVpZ2h0LCB0bXAxCi0gICAgTUxBICAgICB0bXAzLCB0bXAxLCB3aWR0aCwgdG1wMgotICAgIEFERCAgICAgcHRyQSwgcmVmLCB0bXAzCi0gICAgQUREICAgICBtYiwgbWIsICM2NAotCi0gICAgQU5EICAgICBjb3VudCwgY291bnQsICMweDAwRkZGRkZGCi0gICAgQU5EICAgICB0bXAxLCBjb3VudCwgIzB4MDAwRjAwMDAKLSAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMSwgTFNMICM4Ci0gICAgQU5EICAgICB0bXAyLCBjb3VudCwgIzB4MDBGMDAwMDAKLQotICAgIDsvLyAyeDIgcGVscyBwZXIgaXRlcmF0aW9uCi0gICAgOy8vIGJpbGluZWFyIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIGludGVycG9sYXRpb24KLWxvb3AyX3kKLSAgICBMRFJCICAgIHRtcDEsIFtwdHJBXQotICAgIExEUkIgICAgdG1wMywgW3B0ckEsIHdpZHRoXQotICAgIExEUkIgICAgdG1wNSwgW3B0ckEsIHdpZHRoLCBMU0wgIzFdCi0KLSAgICBQS0hCVCAgIHRtcDEsIHRtcDEsIHRtcDMsIExTTCAjMTYgICA7Ly8gfHQzfHQxfAotICAgIFBLSEJUICAgdG1wMywgdG1wMywgdG1wNSwgTFNMICMxNiAgIDsvLyB8dDV8dDN8Ci0KLSAgICBTTVVBRCAgIHRtcDEsIHRtcDEsIHZhbFkgICAgICAgICAgICA7Ly8gdDE9KHQxKnZhbFkgKyB0Myp5RnJhYykKLSAgICBTTVVBRCAgIHRtcDMsIHRtcDMsIHZhbFkgICAgICAgICAgICA7Ly8gdDM9KHQzKnZhbFkgKyB0NSp5RnJhYykKLQotICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAyLCBMU0wgIzgKLWxvb3AyX3gKLSAgICA7Ly8gZmlyc3QKLSAgICBMRFJCICAgIHRtcDIsIFtwdHJBLCAjMV0hCi0gICAgTERSQiAgICB0bXA0LCBbcHRyQSwgd2lkdGhdCi0gICAgTERSQiAgICB0bXA2LCBbcHRyQSwgd2lkdGgsIExTTCAjMV0KLQotICAgIFBLSEJUICAgdG1wMiwgdG1wMiwgdG1wNCwgTFNMICMxNiAgIDsvLyB8dDR8dDJ8Ci0gICAgUEtIQlQgICB0bXA0LCB0bXA0LCB0bXA2LCBMU0wgIzE2ICAgOy8vIHx0Nnx0NHwKLQotICAgIFNNVUFEICAgdG1wMiwgdG1wMiwgdmFsWSAgICAgICAgICAgIDsvLyB0Mj0odDIqdmFsWSArIHQ0KnlGcmFjKQotICAgIE1MQSAgICAgdG1wNSwgdG1wMSwgdmFsWCwgYzMyICAgICAgIDsvLyB0NT10MSp2YWxYKzMyCi0gICAgTUxBICAgICB0bXA1LCB0bXAyLCB4RnJhYywgdG1wNSAgICAgOy8vIHQ1PXQyKnhGcmFjK3Q1Ci0KLSAgICBTTVVBRCAgIHRtcDQsIHRtcDQsIHZhbFkgICAgICAgICAgICA7Ly8gdDQ9KHQ0KnZhbFkgKyB0Nip5RnJhYykKLSAgICBNTEEgICAgIHRtcDYsIHRtcDMsIHZhbFgsIGMzMiAgICAgICA7Ly8gdDM9dDMqdmFsWCszMgotICAgIE1MQSAgICAgdG1wNiwgdG1wNCwgeEZyYWMsIHRtcDYgICAgIDsvLyB0Nj10NCp4RnJhYyt0NgotCi0gICAgTU9WICAgICB0bXA2LCB0bXA2LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KLSAgICBTVFJCICAgIHRtcDYsIFttYiwgIzhdICAgICAgICAgICAgICA7Ly8gc3RvcmUgcGl4ZWwKLSAgICBNT1YgICAgIHRtcDUsIHRtcDUsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgotICAgIFNUUkIgICAgdG1wNSwgW21iXSwgIzEgICAgICAgICAgICAgIDsvLyBzdG9yZSBwaXhlbAotCi0gICAgOy8vIHNlY29uZCAKLSAgICBMRFJCICAgIHRtcDEsIFtwdHJBLCAjMV0hCi0gICAgTERSQiAgICB0bXAzLCBbcHRyQSwgd2lkdGhdCi0gICAgTERSQiAgICB0bXA1LCBbcHRyQSwgd2lkdGgsIExTTCAjMV0KLQotICAgIFBLSEJUICAgdG1wMSwgdG1wMSwgdG1wMywgTFNMICMxNiAgIDsvLyB8dDN8dDF8Ci0gICAgUEtIQlQgICB0bXAzLCB0bXAzLCB0bXA1LCBMU0wgIzE2ICAgOy8vIHx0NXx0M3wKLQotICAgIFNNVUFEICAgdG1wMSwgdG1wMSwgdmFsWSAgICAgICAgICAgIDsvLyB0MT0odDEqdmFsWSArIHQzKnlGcmFjKQotICAgIE1MQSAgICAgdG1wNSwgdG1wMSwgeEZyYWMsIGMzMiAgICAgIDsvLyB0MT10MSp4RnJhYyszMgotICAgIE1MQSAgICAgdG1wNSwgdG1wMiwgdmFsWCwgdG1wNSAgICAgIDsvLyB0NT10Mip2YWxYK3Q1Ci0KLSAgICBTTVVBRCAgIHRtcDMsIHRtcDMsIHZhbFkgICAgICAgICAgICA7Ly8gdDM9KHQzKnZhbFkgKyB0NSp5RnJhYykKLSAgICBNTEEgICAgIHRtcDYsIHRtcDMsIHhGcmFjLCBjMzIgICAgICA7Ly8gdDM9dDMqeEZyYWMrMzIKLSAgICBNTEEgICAgIHRtcDYsIHRtcDQsIHZhbFgsIHRtcDYgICAgICA7Ly8gdDY9dDQqdmFsWCt0NgotCi0gICAgTU9WICAgICB0bXA2LCB0bXA2LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KLSAgICBTVFJCICAgIHRtcDYsIFttYiwgIzhdICAgICAgICAgICAgICA7Ly8gc3RvcmUgcGl4ZWwKLSAgICBNT1YgICAgIHRtcDUsIHRtcDUsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgotICAgIFNUUkIgICAgdG1wNSwgW21iXSwgIzEgICAgICAgICAgICAgIDsvLyBzdG9yZSBwaXhlbAotCi0gICAgU1VCUyAgICBjb3VudCwgY291bnQsICMyPDwyOAotICAgIEJDUyAgICAgbG9vcDJfeAotCi0gICAgQU5EICAgICB0bXAyLCBjb3VudCwgIzB4MDBGMDAwMDAKLQotICAgIEFERFMgICAgbWIsIG1iLCAjMTYKLSAgICBTQkMgICAgIG1iLCBtYiwgdG1wMiwgTFNSICMyMAotICAgIEFERCAgICAgcHRyQSwgcHRyQSwgd2lkdGgsIExTTCAjMQotICAgIFNCQyAgICAgcHRyQSwgcHRyQSwgdG1wMiwgTFNSICMyMAotCi0gICAgQUREUyAgICBjb3VudCwgY291bnQsICMweEUgPDwgMjQKLSAgICBCR0UgICAgIGxvb3AyX3kKLQotICAgIEFERCAgICAgc3Asc3AsIzB4ZDQKLSAgICBMRE1GRCAgIHNwISx7cjQtcjExLHBjfQotCi0gICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX2Nocm9tYV92ZXIucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfY2hyb21hX3Zlci5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjlkZjFiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfY2hyb21hX3Zlci5zCisrKyAvZGV2L251bGwKQEAgLTEsMjg4ICswLDAgQEAKLTsgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLTsKLTsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ci07ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ci07IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07LS0KLTstLSBBYnN0cmFjdCA6IEFSTXY2IG9wdGltaXplZCB2ZXJzaW9uIG9mIGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYVZlciBmdW5jdGlvbgotOy0tCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLSAgICBJRiA6REVGOiBIMjY0REVDX1dJTkFTTQotICAgICAgICA7Ly8gV2UgZG9udCB1c2UgUkVRVUlSRTggYW5kIFBSRVNFUlZFOCBmb3Igd2luYXNtCi0gICAgRUxTRQotICAgICAgICBSRVFVSVJFOAotICAgICAgICBQUkVTRVJWRTgKLSAgICBFTkRJRgotCi0gICAgQVJFQSAgICB8LnRleHR8LCBDT0RFCi0KLTsvLyBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFWZXIgcmVnaXN0ZXIgYWxsb2NhdGlvbgotCi1yZWYgICAgIFJOIDAKLXB0ckEgICAgUk4gMAotCi1tYiAgICAgIFJOIDEKLWJsb2NrICAgUk4gMQotCi14MCAgICAgIFJOIDIKLWNvdW50ICAgUk4gMgotCi15MCAgICAgIFJOIDMKLXZhbFkgICAgUk4gMwotCi13aWR0aCAgIFJOIDQKLQotaGVpZ2h0ICBSTiA1Ci10bXA3ICAgIFJOIDUKLQotY2hyUFcgICBSTiA2Ci10bXA4ICAgIFJOIDYKLQotdG1wMSAgICBSTiA3Ci0KLXRtcDIgICAgUk4gOAotCi10bXAzICAgIFJOIDkKLQotdG1wNCAgICBSTiAxMAotCi10bXA1ICAgIFJOIDExCi1jaHJQSCAgIFJOIDExCi0KLXRtcDYgICAgUk4gMTIKLQotYzMyICAgICBSTiAxNAoteUZyYWMgICBSTiAxNAotCi07Ly8gRnVuY3Rpb24gZXhwb3J0cyBhbmQgaW1wb3J0cwotCi0gICAgSU1QT1JUICBoMjY0YnNkRmlsbEJsb2NrCi0KLSAgICBFWFBPUlQgIGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYVZlcgotCi07Ly8gIEZ1bmN0aW9uIGFyZ3VtZW50cwotOy8vCi07Ly8gIHU4ICpyZWYsICAgICAgICAgICAgICAgICAgIDogMHhjNAotOy8vICB1OCAqcHJlZFBhcnRDaHJvbWEsICAgICAgICA6IDB4YzgKLTsvLyAgaTMyIHgwLCAgICAgICAgICAgICAgICAgICAgOiAweGNjCi07Ly8gIGkzMiB5MCwgICAgICAgICAgICAgICAgICAgIDogMHhkMAotOy8vICB1MzIgd2lkdGgsICAgICAgICAgICAgICAgICA6IDB4ZjgKLTsvLyAgdTMyIGhlaWdodCwgICAgICAgICAgICAgICAgOiAweGZjCi07Ly8gIHUzMiB5RnJhYywgICAgICAgICAgICAgICAgIDogMHgxMDAKLTsvLyAgdTMyIGNocm9tYVBhcnRXaWR0aCwgICAgICAgOiAweDEwNAotOy8vICB1MzIgY2hyb21hUGFydEhlaWdodCAgICAgICA6IDB4MTA4Ci0KLWgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYVZlcgotICAgIFNUTUZEICAgc3AhLCB7cjAtcjExLGxyfQotICAgIFNVQiAgICAgc3AsIHNwLCAjMHhjNAotCi0gICAgTERSICAgICBjaHJQVywgW3NwLCAjMHgxMDRdICAgICA7Ly8gY2hyb21hUGFydFdpZHRoCi0gICAgTERSICAgICB3aWR0aCwgW3NwLCAjMHhmOF0gICAgICA7Ly8gd2lkdGgKLSAgICBDTVAgICAgIHgwLCAjMAotICAgIEJMVCAgICAgZG9fZmlsbAotCi0gICAgQUREICAgICB0bXAxLCB4MCwgY2hyUFcgICAgICAgICA7Ly8gdG1wMSA9IHgwKyBjaHJvbWFQYXJ0V2lkdGgKLSAgICBDTVAgICAgIHRtcDEsIHdpZHRoICAgICAgICAgICAgIDsvLyB4MCtjaHJvbWFQYXJ0V2lkdGggPiB3aWR0aAotICAgIEJISSAgICAgZG9fZmlsbAotCi0gICAgQ01QICAgICB5MCwgIzAKLSAgICBCTFQgICAgIGRvX2ZpbGwKLSAgICBMRFIgICAgIGNoclBILCBbc3AsICMweDEwOF0gICAgIDsvLyBjaHJvbWFQYXJ0SGVpZ2h0Ci0gICAgTERSICAgICBoZWlnaHQsIFtzcCwgIzB4ZmNdICAgICA7Ly8gaGVpZ2h0Ci0gICAgQUREICAgICB0bXAxLCB5MCwgY2hyUEggICAgICAgICA7Ly8gdG1wMSA9IHkwICsgY2hyb21hUGFydEhlaWdodAotICAgIEFERCAgICAgdG1wMSwgdG1wMSwgIzEgICAgICAgICAgOy8vIHRtcDEgPSB5MCArIGNocm9tYVBhcnRIZWlnaHQgKyAxCi0gICAgQ01QICAgICB0bXAxLCBoZWlnaHQKLSAgICBCTFMgICAgIHNraXBfZmlsbAotCi1kb19maWxsCi0gICAgTERSICAgICBjaHJQSCwgW3NwLCAjMHgxMDhdICAgICA7Ly8gY2hyb21hUGFydEhlaWdodAotICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsICMweGZjXSAgICAgOy8vIGhlaWdodAotICAgIEFERCAgICAgdG1wMSwgY2hyUEgsICMxICAgICAgICAgOy8vIHRtcDEgPSBjaHJvbWFQYXJ0SGVpZ2h0KzEKLSAgICBNT1YgICAgIHRtcDIsIGNoclBXICAgICAgICAgICAgIDsvLyB0bXAyID0gY2hyb21hUGFydFdpZHRoCi0gICAgU1RNSUEgICBzcCx7d2lkdGgsaGVpZ2h0LGNoclBXLHRtcDEsdG1wMn0KLSAgICBBREQgICAgIGJsb2NrLCBzcCwgIzB4MWMgICAgICAgIDsvLyBibG9jawotICAgIEJMICAgICAgaDI2NGJzZEZpbGxCbG9jawotCi0gICAgTERSICAgICB4MCwgW3NwLCAjMHhjY10KLSAgICBMRFIgICAgIHkwLCBbc3AsICMweGQwXQotICAgIExEUiAgICAgcmVmLCBbc3AsICMweGM0XSAgICAgICAgOy8vIHJlZgotICAgIFNUTUlBICAgc3Ase3dpZHRoLGhlaWdodCxjaHJQVyx0bXAxLHRtcDJ9Ci0gICAgQUREICAgICBibG9jaywgc3AsICMweDFjICAgICAgICA7Ly8gYmxvY2sKLSAgICBNTEEgICAgIHJlZiwgaGVpZ2h0LCB3aWR0aCwgcmVmIDsvLyByZWYgKz0gd2lkdGggKiBoZWlnaHQ7IAotICAgIE1MQSAgICAgYmxvY2ssIGNoclBXLCB0bXAxLCBibG9jazsvLyBibG9jayArIChjaHJvbWFQVykqKGNocm9tYVBIKzEpCi0gICAgQkwgICAgICBoMjY0YnNkRmlsbEJsb2NrCi0KLSAgICBNT1YgICAgIHgwLCAjMCAgICAgICAgICAgICAgICAgIDsvLyB4MCA9IDAKLSAgICBNT1YgICAgIHkwLCAjMCAgICAgICAgICAgICAgICAgIDsvLyB5MCA9IDAKLSAgICBTVFIgICAgIHgwLCBbc3AsICMweGNjXQotICAgIFNUUiAgICAgeTAsIFtzcCwgIzB4ZDBdCi0gICAgQUREICAgICByZWYsIHNwLCAjMHgxYyAgICAgICAgICA7Ly8gcmVmID0gYmxvY2sKLSAgICBTVFIgICAgIHJlZiwgW3NwLCAjMHhjNF0gICAgICAgIDsvLyByZWYKLQotICAgIFNUUiAgICAgdG1wMSwgW3NwLCAjMHhmY10gICAgICAgOy8vIGhlaWdodAotICAgIFNUUiAgICAgY2hyUFcsIFtzcCwgIzB4ZjhdICAgICAgOy8vIHdpZHRoCi0gICAgTU9WICAgICB3aWR0aCwgY2hyUFcKLQotc2tpcF9maWxsCi0gICAgTUxBICAgICB0bXAzLCB5MCwgd2lkdGgsIHgwICAgICA7Ly8gdG1wMyA9IHkwKndpZHRoK3gwCi0gICAgTERSICAgICB5RnJhYywgW3NwLCAjMHgxMDBdICAgICA7Ly8geUZyYWMKLSAgICBBREQgICAgIHB0ckEsIHJlZiwgdG1wMyAgICAgICAgIDsvLyBwdHJBID0gcmVmICsgeTAqd2lkdGgreDAKLSAgICBSU0IgICAgIHZhbFksIHlGcmFjLCAjOCAgICAgICAgIDsvLyB2YWxZID0gOC15RnJhYwotCi0gICAgTERSICAgICBtYiwgW3NwLCAjMHhjOF0gICAgICAgICA7Ly8gcHJlZFBhcnRDaHJvbWEKLQotCi0gICAgOy8vIHBhY2sgdmFsdWVzIHRvIGNvdW50IHJlZ2lzdGVyCi0gICAgOy8vIFszMToyOF0gbG9vcF94IChjaHJvbWFQYXJ0V2lkdGgtMSkKLSAgICA7Ly8gWzI3OjI0XSBsb29wX3kgKGNocm9tYVBhcnRIZWlnaHQtMSkKLSAgICA7Ly8gWzIzOjIwXSBjaHJvbWFQYXJ0V2lkdGgtMQotICAgIDsvLyBbMTk6MTZdIGNocm9tYVBhcnRIZWlnaHQtMQotICAgIDsvLyBbMTU6MDBdIG5vdGhpbmcKLQotICAgIFNVQiAgICAgdG1wMiwgY2hyUEgsICMxICAgICAgICAgICAgIDsvLyBjaHJvbWFQYXJ0SGVpZ2h0LTEKLSAgICBTVUIgICAgIHRtcDEsIGNoclBXLCAjMSAgICAgICAgICAgICA7Ly8gY2hyb21hUGFydFdpZHRoLTEKLSAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMiwgTFNMICMxNiA7Ly8gY2hyb21hUGFydEhlaWdodC0xCi0gICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDIsIExTTCAjMjQgOy8vIGxvb3BfeQotICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAxLCBMU0wgIzIwIDsvLyBjaHJvbWFQYXJ0V2lkdGgtMQotICAgIEFORCAgICAgdG1wMiwgY291bnQsICMweDAwRjAwMDAwICAgIDsvLyBsb29wX3gKLSAgICBQS0hCVCAgIHZhbFksIHZhbFksIHlGcmFjLCBMU0wgIzE2ICA7Ly8gfHlGcmFjfHZhbFkgfAotICAgIE1PViAgICAgdmFsWSwgdmFsWSwgTFNMICMzICAgICAgICAgIDsvLyBtdWx0aXBseSBieSA4IGluIGFkdmFuY2UKLSAgICBNT1YgICAgIGMzMiwgIzMyCi0KLQotICAgIDsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICA7Ly8gQ2IKLSAgICA7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICA7Ly8gMngyIHBlbHMgcGVyIGl0ZXJhdGlvbgotICAgIDsvLyBiaWxpbmVhciB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uCi0KLWxvb3AxX3kKLSAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMiwgTFNMICM4Ci1sb29wMV94Ci0gICAgOy8vIFByb2Nlc3MgMngyIGJsb2NrCi0gICAgTERSQiAgICB0bXAyLCBbcHRyQSx3aWR0aF0gICAgICAgICAgOy8vIDIgcm93LCAxIGNvbAotICAgIExEUkIgICAgdG1wMywgW3B0ckEsd2lkdGgsIExTTCAjMV0gIDsvLyAzIHJvdywgMSBjb2wKLSAgICBMRFJCICAgIHRtcDEsIFtwdHJBXSwjMSAgICAgICAgICAgICA7Ly8gMSByb3csIDEgY29sCi0KLSAgICBMRFJCICAgIHRtcDUsIFtwdHJBLHdpZHRoXSAgICAgICAgICA7Ly8gMiByb3csIDIgY29sCi0gICAgTERSQiAgICB0bXA2LCBbcHRyQSx3aWR0aCwgTFNMICMxXSAgOy8vIDMgcm93LCAyIGNvbAotICAgIExEUkIgICAgdG1wNCwgW3B0ckFdLCMxICAgICAgICAgICAgIDsvLyAxIHJvdywgMiBjb2wKLQotICAgIFBLSEJUICAgdG1wMSwgdG1wMSwgdG1wMiwgTFNMICMxNiAgIDsvLyB8QnxBfAotICAgIFBLSEJUICAgdG1wMiwgdG1wMiwgdG1wMywgTFNMICMxNiAgIDsvLyB8Q3xCfAotICAgIFBLSEJUICAgdG1wNCwgdG1wNCwgdG1wNSwgTFNMICMxNiAgIDsvLyB8QnxBfAotCi0gICAgU01MQUQgICB0bXA3LCB0bXAyLCB2YWxZLCBjMzIgICAgICAgOy8vIG11bHRpcGx5Ci0gICAgUEtIQlQgICB0bXA1LCB0bXA1LCB0bXA2LCBMU0wgIzE2ICAgOy8vIHxDfEJ8Ci0gICAgU01MQUQgICB0bXAyLCB0bXAxLCB2YWxZLCBjMzIgICAgICAgOy8vIG11bHRpcGx5Ci0gICAgU01MQUQgICB0bXA4LCB0bXA1LCB2YWxZLCBjMzIgICAgICAgOy8vIG11bHRpcGx5Ci0gICAgU01MQUQgICB0bXA1LCB0bXA0LCB2YWxZLCBjMzIgICAgICAgOy8vIG11bHRpcGx5Ci0KLSAgICBNT1YgICAgIHRtcDcsIHRtcDcsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgotICAgIFNUUkIgICAgdG1wNywgW21iLCM4XSAgICAgICAgICAgICAgIDsvLyBzdG9yZSByb3cgMiBjb2wgMQotICAgIE1PViAgICAgdG1wMiwgdG1wMiwgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCi0gICAgU1RSQiAgICB0bXAyLCBbbWJdLCMxICAgICAgICAgICAgICAgOy8vIHN0b3JlIHJvdyAxIGNvbCAxCi0KLSAgICBNT1YgICAgIHRtcDgsIHRtcDgsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgotICAgIFNUUkIgICAgdG1wOCwgW21iLCM4XSAgICAgICAgICAgICAgIDsvLyBzdG9yZSByb3cgMiBjb2wgMgotICAgIE1PViAgICAgdG1wNSwgdG1wNSwgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCi0gICAgU1RSQiAgICB0bXA1LCBbbWJdLCMxICAgICAgICAgICAgICAgOy8vIHN0b3JlIHJvdyAxIGNvbCAyCi0KLQotICAgIFNVQlMgICAgY291bnQsIGNvdW50LCAjMjw8MjgKLSAgICBCQ1MgICAgIGxvb3AxX3gKLQotICAgIEFORCAgICAgdG1wMiwgY291bnQsICMweDAwRjAwMDAwCi0KLSAgICBBRERTICAgIG1iLCBtYiwgIzE2Ci0gICAgU0JDICAgICBtYiwgbWIsIHRtcDIsIExTUiAjMjAKLSAgICBBREQgICAgIHB0ckEsIHB0ckEsIHdpZHRoLCBMU0wgIzEKLSAgICBTQkMgICAgIHB0ckEsIHB0ckEsIHRtcDIsIExTUiAjMjAKLQotICAgIEFERFMgICAgY291bnQsIGNvdW50LCAjMHhFIDw8IDI0Ci0gICAgQkdFICAgICBsb29wMV95IAotCi0gICAgOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIDsvLyBDcgotICAgIDsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICBMRFIgICAgIGhlaWdodCwgW3NwLCMweGZjXSAgICAgICAgICA7Ly8gaGVpZ2h0Ci0gICAgTERSICAgICByZWYsIFtzcCwgIzB4YzRdICAgICAgICAgICAgOy8vIHJlZgotICAgIExEUiAgICAgdG1wMSwgW3NwLCAjMHhkMF0gICAgICAgICAgIDsvLyB5MAotICAgIExEUiAgICAgdG1wMiwgW3NwLCAjMHhjY10gICAgICAgICAgIDsvLyB4MAotICAgIExEUiAgICAgbWIsIFtzcCwgIzB4YzhdICAgICAgICAgICAgIDsvLyBwcmVkUGFydENocm9tYQotCi0gICAgQUREICAgICB0bXAxLCBoZWlnaHQsIHRtcDEKLSAgICBNTEEgICAgIHRtcDMsIHRtcDEsIHdpZHRoLCB0bXAyCi0gICAgQUREICAgICBwdHJBLCByZWYsIHRtcDMKLSAgICBBREQgICAgIG1iLCBtYiwgIzY0Ci0KLSAgICBBTkQgICAgIGNvdW50LCBjb3VudCwgIzB4MDBGRkZGRkYKLSAgICBBTkQgICAgIHRtcDEsIGNvdW50LCAjMHgwMDBGMDAwMAotICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAxLCBMU0wgIzgKLSAgICBBTkQgICAgIHRtcDIsIGNvdW50LCAjMHgwMEYwMDAwMAotCi0gICAgOy8vIDJ4MiBwZWxzIHBlciBpdGVyYXRpb24KLSAgICA7Ly8gYmlsaW5lYXIgdmVydGljYWwgaW50ZXJwb2xhdGlvbgotbG9vcDJfeQotICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAyLCBMU0wgIzgKLWxvb3AyX3gKLSAgICA7Ly8gUHJvY2VzcyAyeDIgYmxvY2sKLSAgICBMRFJCICAgIHRtcDIsIFtwdHJBLHdpZHRoXSAgICAgICAgICA7Ly8gMiByb3csIDEgY29sCi0gICAgTERSQiAgICB0bXAzLCBbcHRyQSx3aWR0aCwgTFNMICMxXSAgOy8vIDMgcm93LCAxIGNvbAotICAgIExEUkIgICAgdG1wMSwgW3B0ckFdLCMxICAgICAgICAgICAgIDsvLyAxIHJvdywgMSBjb2wKLQotICAgIExEUkIgICAgdG1wNSwgW3B0ckEsd2lkdGhdICAgICAgICAgIDsvLyAyIHJvdywgMiBjb2wKLSAgICBMRFJCICAgIHRtcDYsIFtwdHJBLHdpZHRoLCBMU0wgIzFdICA7Ly8gMyByb3csIDIgY29sCi0gICAgTERSQiAgICB0bXA0LCBbcHRyQV0sIzEgICAgICAgICAgICAgOy8vIDEgcm93LCAyIGNvbAotCi0gICAgUEtIQlQgICB0bXAxLCB0bXAxLCB0bXAyLCBMU0wgIzE2ICAgOy8vIHxCfEF8Ci0gICAgUEtIQlQgICB0bXAyLCB0bXAyLCB0bXAzLCBMU0wgIzE2ICAgOy8vIHxDfEJ8Ci0gICAgUEtIQlQgICB0bXA0LCB0bXA0LCB0bXA1LCBMU0wgIzE2ICAgOy8vIHxCfEF8Ci0KLSAgICBTTUxBRCAgIHRtcDcsIHRtcDIsIHZhbFksIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKLSAgICBQS0hCVCAgIHRtcDUsIHRtcDUsIHRtcDYsIExTTCAjMTYgICA7Ly8gfEN8QnwKLSAgICBTTUxBRCAgIHRtcDIsIHRtcDEsIHZhbFksIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKLSAgICBTTUxBRCAgIHRtcDgsIHRtcDUsIHZhbFksIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKLSAgICBTTUxBRCAgIHRtcDUsIHRtcDQsIHZhbFksIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKLQotICAgIE1PViAgICAgdG1wNywgdG1wNywgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCi0gICAgU1RSQiAgICB0bXA3LCBbbWIsIzhdICAgICAgICAgICAgICAgOy8vIHN0b3JlIHJvdyAyIGNvbCAxCi0gICAgTU9WICAgICB0bXAyLCB0bXAyLCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KLSAgICBTVFJCICAgIHRtcDIsIFttYl0sIzEgICAgICAgICAgICAgICA7Ly8gc3RvcmUgcm93IDEgY29sIDEKLQotICAgIE1PViAgICAgdG1wOCwgdG1wOCwgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCi0gICAgU1RSQiAgICB0bXA4LCBbbWIsIzhdICAgICAgICAgICAgICAgOy8vIHN0b3JlIHJvdyAyIGNvbCAyCi0gICAgTU9WICAgICB0bXA1LCB0bXA1LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KLSAgICBTVFJCICAgIHRtcDUsIFttYl0sIzEgICAgICAgICAgICAgICA7Ly8gc3RvcmUgcm93IDEgY29sIDIKLQotCi0gICAgU1VCUyAgICBjb3VudCwgY291bnQsICMyPDwyOAotICAgIEJDUyAgICAgbG9vcDJfeAotCi0gICAgQU5EICAgICB0bXAyLCBjb3VudCwgIzB4MDBGMDAwMDAKLQotICAgIEFERFMgICAgbWIsIG1iLCAjMTYKLSAgICBTQkMgICAgIG1iLCBtYiwgdG1wMiwgTFNSICMyMAotICAgIEFERCAgICAgcHRyQSwgcHRyQSwgd2lkdGgsIExTTCAjMQotICAgIFNCQyAgICAgcHRyQSwgcHRyQSwgdG1wMiwgTFNSICMyMAotCi0gICAgQUREUyAgICBjb3VudCwgY291bnQsICMweEUgPDwgMjQKLSAgICBCR0UgICAgIGxvb3AyX3kKLQotICAgIEFERCAgICAgc3Asc3AsIzB4ZDQKLSAgICBMRE1GRCAgIHNwISwge3I0LXIxMSxwY30KLQotICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9ob3JfaGFsZi5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9ob3JfaGFsZi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Mzk2OGI2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfaG9yX2hhbGYucworKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi07IENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci07Ci07IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOwotOyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOwotOyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy0tCi07LS0gQWJzdHJhY3QgOiBBUk12NiBvcHRpbWl6ZWQgdmVyc2lvbiBvZiBoMjY0YnNkSW50ZXJwb2xhdGVIb3JIYWxmIGZ1bmN0aW9uCi07LS0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotICAgIElGIDpERUY6IEgyNjRERUNfV0lOQVNNCi0gICAgICAgIDsvLyBXZSBkb250IHVzZSBSRVFVSVJFOCBhbmQgUFJFU0VSVkU4IGZvciB3aW5hc20KLSAgICBFTFNFCi0gICAgICAgIFJFUVVJUkU4Ci0gICAgICAgIFBSRVNFUlZFOAotICAgIEVORElGCi0KLSAgICBBUkVBICAgIHwudGV4dHwsIENPREUKLQotOy8vIGgyNjRic2RJbnRlcnBvbGF0ZUhvckhhbGYgcmVnaXN0ZXIgYWxsb2NhdGlvbgotCi1yZWYgICAgIFJOIDAKLQotbWIgICAgICBSTiAxCi1idWZmICAgIFJOIDEKLQotY291bnQgICBSTiAyCi14MCAgICAgIFJOIDIKLQoteTAgICAgICBSTiAzCi14XzJfMCAgIFJOIDMKLQotd2lkdGggICBSTiA0Ci14XzNfMSAgIFJOIDQKLQotaGVpZ2h0ICBSTiA1Ci14XzZfNCAgIFJOIDUKLQotcGFydFcgICBSTiA2Ci14XzdfNSAgIFJOIDYKLQotcGFydEggICBSTiA3Ci10bXAxICAgIFJOIDcKLQotdG1wMiAgICBSTiA4Ci0KLXRtcDMgICAgUk4gOQotCi10bXA0ICAgIFJOIDEwCi0KLW11bHRfMjBfMDEgIFJOIDExCi1tdWx0XzIwX201ICBSTiAxMgotCi1wbHVzMTYgIFJOIDE0Ci0KLQotOy8vIGZ1bmN0aW9uIGV4cG9ydHMgYW5kIGltcG9ydHMKLQotICAgIElNUE9SVCAgaDI2NGJzZEZpbGxCbG9jawotCi0gICAgRVhQT1JUICBoMjY0YnNkSW50ZXJwb2xhdGVIb3JIYWxmCi0KLTsvLyBIb3Jpem9udGFsIGZpbHRlciBhcHByb2FjaAotOy8vCi07Ly8gQmFzaWMgaWRlYSBpbiBob3Jpem9udGFsIGZpbHRlcmluZyBpcyB0byBhZGp1c3QgY29lZmZpY2llbnRzCi07Ly8gbGlrZSBiZWxvdy4gQ2FsY3VsYXRpb24gaXMgZG9uZSB3aXRoIDE2LWJpdCBtYXRocy4KLTsvLwotOy8vIFJlZyAgICAgeF8yXzAgICAgIHhfM18xICAgICB4XzZfNCAgICAgeF83XzUgICAgIHhfMl8wCi07Ly8gICAgICAgWyAgMiAgMCBdIFsgIDMgIDEgXSBbICA2ICA0IF0gWyAgNyAgNSBdIFsgMTAgIDggXSAuLi4KLTsvLyB5XzAgPSAgIDIwICAxICAgICAyMCAtNSAgICAgICAgLTUgICAgICAgICAxCi07Ly8geV8xID0gICAtNSAgICAgICAgMjAgIDEgICAgICAxIDIwICAgICAgICAtNQotOy8vIHlfMiA9ICAgIDEgICAgICAgIC01ICAgICAgICAtNSAyMCAgICAgIDEgMjAKLTsvLyB5XzMgPSAgICAgICAgICAgICAgMSAgICAgICAgMjAgLTUgICAgIC01IDIwICAgICAgICAgMQotCi0KLWgyNjRic2RJbnRlcnBvbGF0ZUhvckhhbGYKLSAgICBTVE1GRCAgIHNwISwge3IwLXIxMSwgbHJ9Ci0gICAgU1VCICAgICBzcCwgc3AsICMweDFlNAotCi0gICAgQ01QICAgICB4MCwgIzAKLSAgICBCTFQgICAgIGRvX2ZpbGwgICAgICAgICAgICAgICAgIDsvLyAoeDAgPCAwKQotICAgIExEUiAgICAgcGFydFcsIFtzcCwjMHgyMjBdICAgICAgOy8vIHBhcnRXaWR0aAotICAgIEFERCAgICAgdG1wNCwgeDAsIHBhcnRXICAgICAgICAgOy8vICh4MCtwYXJ0V2lkdGgpCi0gICAgQUREICAgICB0bXA0LCB0bXA0LCAjNSAgICAgICAgICA7Ly8gKHkwK3BhcnRXKzUpCi0gICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKLSAgICBDTVAgICAgIHRtcDQsIHdpZHRoCi0gICAgQkhJICAgICBkb19maWxsICAgICAgICAgICAgICAgICA7Ly8gKHgwK3BhcnRXKT53aWR0aAotCi0gICAgQ01QICAgICB5MCwgIzAKLSAgICBCTFQgICAgIGRvX2ZpbGwgICAgICAgICAgICAgICAgIDsvLyAoeTAgPCAwKQotICAgIExEUiAgICAgcGFydEgsIFtzcCwjMHgyMjRdICAgICAgOy8vIHBhcnRIZWlnaHQKLSAgICBBREQgICAgIHRtcDIsIHkwLCBwYXJ0SCAgICAgICAgIDsvLyAoeTArcGFydEhlaWdodCkKLSAgICBMRFIgICAgIGhlaWdodCwgW3NwLCMweDIxY10gICAgIDsvLyBoZWlnaHQKLSAgICBDTVAgICAgIHRtcDIsIGhlaWdodAotICAgIEJMUyAgICAgc2tpcF9maWxsICAgICAgICAgICAgICAgOy8vIG5vIG92ZXJmaWxsIG5lZWRlZAotCi0KLWRvX2ZpbGwKLSAgICBMRFIgICAgIHBhcnRILCBbc3AsIzB4MjI0XSAgICAgIDsvLyBwYXJ0SGVpZ2h0Ci0gICAgTERSICAgICBoZWlnaHQsIFtzcCwjMHgyMWNdICAgICA7Ly8gaGVpZ2h0Ci0gICAgTERSICAgICBwYXJ0VywgW3NwLCMweDIyMF0gICAgICA7Ly8gcGFydFdpZHRoCi0gICAgQUREICAgICB0bXA0LCBwYXJ0VywgIzUgICAgICAgICA7Ly8gdG1wNCA9IHBhcnRXICsgNTsKLSAgICBTVE1JQiAgIHNwLCB7aGVpZ2h0LCB0bXA0fSAgICAgIDsvLyBzcCs0ID0gaGVpZ2h0LCBzcCs4ID0gcGFydFdpZHRoKzUKLSAgICBTVFIgICAgIHBhcnRILCBbc3AsIzB4Y10gICAgICAgIDsvLyBzcCtjID0gcGFydEhlaWdodAotICAgIFNUUiAgICAgdG1wNCwgW3NwLCMweDEwXSAgICAgICAgOy8vIHNwKzEwID0gcGFydFdpZHRoKzUKLSAgICBMRFIgICAgIHdpZHRoLCBbc3AsIzB4MjE4XSAgICAgIDsvLyB3aWR0aAotICAgIFNUUiAgICAgd2lkdGgsIFtzcCwjMF0gICAgICAgICAgOy8vIHNwKzAgPSB3aWR0aAotICAgIEFERCAgICAgYnVmZiwgc3AsICMweDI4ICAgICAgICAgOy8vIGJ1ZmYgPSBwMVsyMSoyMS80KzFdCi0gICAgQkwgICAgICBoMjY0YnNkRmlsbEJsb2NrCi0KLSAgICBNT1YgICAgIHgwLCAjMAotICAgIFNUUiAgICAgeDAsW3NwLCMweDFlY10gICAgICAgICAgOy8vIHgwID0gMAotICAgIFNUUiAgICAgeDAsW3NwLCMweDFmMF0gICAgICAgICAgOy8vIHkwID0gMAotICAgIEFERCAgICAgcmVmLHNwLCMweDI4ICAgICAgICAgICAgOy8vIHJlZiA9IHAxCi0gICAgU1RSICAgICB0bXA0LCBbc3AsIzB4MjE4XSAgICAgICA7Ly8gd2lkdGggPSBwYXJ0V2lkdGgrNQotCi0KLXNraXBfZmlsbAotICAgIExEUiAgICAgeDAgLFtzcCwjMHgxZWNdICAgICAgICAgOy8vIHgwCi0gICAgTERSICAgICB5MCAsW3NwLCMweDFmMF0gICAgICAgICA7Ly8geTAKLSAgICBMRFIgICAgIHdpZHRoLCBbc3AsIzB4MjE4XSAgICAgIDsvLyB3aWR0aAotICAgIE1MQSAgICAgdG1wMiwgd2lkdGgsIHkwLCB4MCAgICAgOy8vIHkwKndpZHRoK3gwCi0gICAgQUREICAgICByZWYsIHJlZiwgdG1wMiAgICAgICAgICA7Ly8gcmVmICs9IHkwKndpZHRoK3gwCi0gICAgQUREICAgICByZWYsIHJlZiwgIzggICAgICAgICAgICA7Ly8gcmVmID0gcmVmKzgKLSAgICBMRFIgICAgIG1iLCBbc3AsICMweDFlOF0gICAgICAgIDsvLyBtYgotCi0gICAgOy8vIHBhY2sgdmFsdWVzIHRvIGNvdW50IHJlZ2lzdGVyCi0gICAgOy8vIFszMToyOF0gbG9vcF94IChwYXJ0V2lkdGgtMSkKLSAgICA7Ly8gWzI3OjI0XSBsb29wX3kgKHBhcnRIZWlnaHQtMSkKLSAgICA7Ly8gWzIzOjIwXSBwYXJ0V2lkdGgtMQotICAgIDsvLyBbMTk6MTZdIHBhcnRIZWlnaHQtMQotICAgIDsvLyBbMTU6MDBdIHdpZHRoCi0gICAgTU9WICAgICBjb3VudCwgd2lkdGgKLSAgICBTVUIgICAgIHBhcnRXLCBwYXJ0VywgIzE7Ci0gICAgU1VCICAgICBwYXJ0SCwgcGFydEgsICMxOwotICAgIEFERCAgICAgdG1wMiwgcGFydEgsIHBhcnRXLCBMU0wgIzQKLSAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMiwgTFNMICMxNgotCi0KLSAgICBMRFIgICAgIG11bHRfMjBfMDEsID0gMHgwMDE0MDAwMQotICAgIExEUiAgICAgbXVsdF8yMF9tNSwgPSAweDAwMTRGRkZCCi0gICAgTU9WICAgICBwbHVzMTYsICMxNgotICAgIEFORCAgICAgdG1wMSwgY291bnQsICMweDAwMEYwMDAwICAgIDsvLyBwYXJ0SGVpZ2h0LTEKLSAgICBBTkQgICAgIHRtcDMsIGNvdW50LCAjMHgwMEYwMDAwMCAgICA7Ly8gcGFydFdpZHRoLTEKLSAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMSwgTFNMICM4Ci1sb29wX3kKLSAgICBMRFIgICAgIHhfM18xLCBbcmVmLCAjLThdCi0gICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDMsIExTTCAjOAotICAgIExEUiAgICAgeF83XzUsIFtyZWYsICMtNF0KLSAgICBVWFRCMTYgIHhfMl8wLCB4XzNfMQotICAgIFVYVEIxNiAgeF8zXzEsIHhfM18xLCBST1IgIzgKLSAgICBVWFRCMTYgIHhfNl80LCB4XzdfNQotCi1sb29wX3gKLSAgICBVWFRCMTYgIHhfN181LCB4XzdfNSwgUk9SICM4Ci0KLSAgICBTTUxBRCAgIHRtcDEsIHhfMl8wLCBtdWx0XzIwXzAxLCBwbHVzMTYKLSAgICBTTUxBVEIgIHRtcDMsIHhfMl8wLCBtdWx0XzIwXzAxLCBwbHVzMTYKLSAgICBTTUxBVEIgIHRtcDIsIHhfMl8wLCBtdWx0XzIwX201LCBwbHVzMTYKLSAgICBTTUxBVEIgIHRtcDQsIHhfM18xLCBtdWx0XzIwXzAxLCBwbHVzMTYKLQotICAgIFNNTEFEICAgdG1wMSwgeF8zXzEsIG11bHRfMjBfbTUsIHRtcDEKLSAgICBTTUxBVEIgIHRtcDMsIHhfM18xLCBtdWx0XzIwX201LCB0bXAzCi0gICAgU01MQUQgICB0bXAyLCB4XzNfMSwgbXVsdF8yMF8wMSwgdG1wMgotICAgIExEUiAgICAgeF8zXzEsIFtyZWZdLCAjNAotICAgIFNNTEFEICAgdG1wNCwgeF82XzQsIG11bHRfMjBfbTUsIHRtcDQKLQotICAgIFNNTEFCQiAgdG1wMSwgeF82XzQsIG11bHRfMjBfbTUsIHRtcDEKLSAgICBTTUxBRFggIHRtcDMsIHhfNl80LCBtdWx0XzIwX201LCB0bXAzCi0gICAgU01MQURYICB0bXAyLCB4XzZfNCwgbXVsdF8yMF8wMSwgdG1wMgotICAgIFNNTEFEWCAgdG1wNCwgeF83XzUsIG11bHRfMjBfbTUsIHRtcDQKLQotICAgIFNNTEFCQiAgdG1wMSwgeF83XzUsIG11bHRfMjBfMDEsIHRtcDEKLSAgICBVWFRCMTYgIHhfMl8wLCB4XzNfMQotICAgIFNNTEFCQiAgdG1wMiwgeF83XzUsIG11bHRfMjBfbTUsIHRtcDIKLSAgICBTTUxBRFggIHRtcDMsIHhfN181LCBtdWx0XzIwXzAxLCB0bXAzCi0gICAgU01MQUJCICB0bXA0LCB4XzJfMCwgbXVsdF8yMF8wMSwgdG1wNAotCi0gICAgTU9WICAgICB0bXAyLCB0bXAyLCBBU1IgIzUKLSAgICBNT1YgICAgIHRtcDEsIHRtcDEsIEFTUiAjNQotICAgIFBLSEJUICAgdG1wMiwgdG1wMiwgdG1wNCwgTFNMICMoMTYtNSkKLSAgICBQS0hCVCAgIHRtcDEsIHRtcDEsIHRtcDMsIExTTCAjKDE2LTUpCi0gICAgVVNBVDE2ICB0bXAyLCAjOCwgdG1wMgotICAgIFVTQVQxNiAgdG1wMSwgIzgsIHRtcDEKLQotICAgIFNVQlMgICAgY291bnQsIGNvdW50LCAjNDw8MjgKLSAgICBPUlIgICAgIHRtcDEsIHRtcDEsIHRtcDIsIExTTCAjOAotICAgIFNUUiAgICAgdG1wMSwgW21iXSwgIzQKLSAgICBCQ0MgICAgIG5leHRfeQotCi0gICAgVVhUQjE2ICB4XzNfMSwgeF8zXzEsIFJPUiAjOAotCi0gICAgU01MQUQgICB0bXAxLCB4XzZfNCwgbXVsdF8yMF8wMSwgcGx1czE2Ci0gICAgU01MQVRCICB0bXAzLCB4XzZfNCwgbXVsdF8yMF8wMSwgcGx1czE2Ci0gICAgU01MQVRCICB0bXAyLCB4XzZfNCwgbXVsdF8yMF9tNSwgcGx1czE2Ci0gICAgU01MQVRCICB0bXA0LCB4XzdfNSwgbXVsdF8yMF8wMSwgcGx1czE2Ci0KLSAgICBTTUxBRCAgIHRtcDEsIHhfN181LCBtdWx0XzIwX201LCB0bXAxCi0gICAgU01MQVRCICB0bXAzLCB4XzdfNSwgbXVsdF8yMF9tNSwgdG1wMwotICAgIFNNTEFEICAgdG1wMiwgeF83XzUsIG11bHRfMjBfMDEsIHRtcDIKLSAgICBMRFIgICAgIHhfN181LCBbcmVmXSwgIzQKLSAgICBTTUxBRCAgIHRtcDQsIHhfMl8wLCBtdWx0XzIwX201LCB0bXA0Ci0KLSAgICBTTUxBQkIgIHRtcDEsIHhfMl8wLCBtdWx0XzIwX201LCB0bXAxCi0gICAgU01MQURYICB0bXAzLCB4XzJfMCwgbXVsdF8yMF9tNSwgdG1wMwotICAgIFNNTEFEWCAgdG1wMiwgeF8yXzAsIG11bHRfMjBfMDEsIHRtcDIKLSAgICBTTUxBRFggIHRtcDQsIHhfM18xLCBtdWx0XzIwX201LCB0bXA0Ci0KLSAgICBTTUxBQkIgIHRtcDEsIHhfM18xLCBtdWx0XzIwXzAxLCB0bXAxCi0gICAgVVhUQjE2ICB4XzZfNCwgeF83XzUKLSAgICBTTUxBQkIgIHRtcDIsIHhfM18xLCBtdWx0XzIwX201LCB0bXAyCi0gICAgU01MQURYICB0bXAzLCB4XzNfMSwgbXVsdF8yMF8wMSwgdG1wMwotICAgIFNNTEFCQiAgdG1wNCwgeF82XzQsIG11bHRfMjBfMDEsIHRtcDQKLQotICAgIE1PViAgICAgdG1wMiwgdG1wMiwgQVNSICM1Ci0gICAgTU9WICAgICB0bXAxLCB0bXAxLCBBU1IgIzUKLSAgICBQS0hCVCAgIHRtcDIsIHRtcDIsIHRtcDQsIExTTCAjKDE2LTUpCi0gICAgUEtIQlQgICB0bXAxLCB0bXAxLCB0bXAzLCBMU0wgIygxNi01KQotICAgIFVTQVQxNiAgdG1wMiwgIzgsIHRtcDIKLSAgICBVU0FUMTYgIHRtcDEsICM4LCB0bXAxCi0KLSAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzQ8PDI4Ci0gICAgT1JSICAgICB0bXAxLCB0bXAxLCB0bXAyLCBMU0wgIzgKLSAgICBTVFIgICAgIHRtcDEsIFttYl0sICM0Ci0gICAgQkNTICAgICBsb29wX3gKLQotbmV4dF95Ci0gICAgQU5EICAgICB0bXAzLCBjb3VudCwgIzB4MDBGMDAwMDAgICAgOy8vIHBhcnRXaWR0aC0xCi0gICAgU01MQUJCICByZWYsIGNvdW50LCBtdWx0XzIwXzAxLCByZWYgOy8vICt3aWR0aAotICAgIEFERFMgICAgbWIsIG1iLCAjMTYgICAgICAgICAgICAgICAgIDsvLyArMTYsIENhcnJ5PTAKLSAgICBTQkMgICAgIG1iLCBtYiwgdG1wMywgTFNSICMyMCAgICAgICA7Ly8gLShwYXJ0V2lkdGgtMSktMQotICAgIFNCQyAgICAgcmVmLCByZWYsIHRtcDMsIExTUiAjMjAgICAgIDsvLyAtKHBhcnRXaWR0aC0xKS0xCi0gICAgQUREUyAgICBjb3VudCwgY291bnQsICMoMTw8MjgpLSgxPDwyNCkKLSAgICBCR0UgICAgIGxvb3BfeQotCi0gICAgQUREICAgICBzcCxzcCwjMHgxZjQKLSAgICBMRE1GRCAgIHNwISwge3I0LXIxMSwgcGN9Ci0KLSAgICBFTkQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9ob3JfcXVhcnRlci5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9ob3JfcXVhcnRlci5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTI0M2Q0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfaG9yX3F1YXJ0ZXIucworKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi07IENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci07Ci07IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOwotOyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOwotOyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy0tCi07LS0gQWJzdHJhY3QgOiBBUk12NiBvcHRpbWl6ZWQgdmVyc2lvbiBvZiBoMjY0YnNkSW50ZXJwb2xhdGVIb3JRdWFydGVyIGZ1bmN0aW9uCi07LS0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotICAgIElGIDpERUY6IEgyNjRERUNfV0lOQVNNCi0gICAgICAgIDsvLyBXZSBkb250IHVzZSBSRVFVSVJFOCBhbmQgUFJFU0VSVkU4IGZvciB3aW5hc20KLSAgICBFTFNFCi0gICAgICAgIFJFUVVJUkU4Ci0gICAgICAgIFBSRVNFUlZFOAotICAgIEVORElGCi0KLSAgICBBUkVBICAgIHwudGV4dHwsIENPREUKLQotOy8vIGgyNjRic2RJbnRlcnBvbGF0ZUhvclF1YXJ0ZXIgcmVnaXN0ZXIgYWxsb2NhdGlvbgotCi1yZWYgICAgIFJOIDAKLQotbWIgICAgICBSTiAxCi1idWZmICAgIFJOIDEKLQotY291bnQgICBSTiAyCi14MCAgICAgIFJOIDIKLQoteTAgICAgICBSTiAzCi14XzJfMCAgIFJOIDMKLQotd2lkdGggICBSTiA0Ci14XzNfMSAgIFJOIDQKLQotaGVpZ2h0ICBSTiA1Ci14XzZfNCAgIFJOIDUKLQotcGFydFcgICBSTiA2Ci14XzdfNSAgIFJOIDYKLQotcGFydEggICBSTiA3Ci10bXAxICAgIFJOIDcKLQotdG1wMiAgICBSTiA4Ci0KLXRtcDMgICAgUk4gOQotCi10bXA0ICAgIFJOIDEwCi0KLW11bHRfMjBfMDEgIFJOIDExCi0KLW11bHRfMjBfbTUgIFJOIDEyCi0KLXBsdXMxNiAgUk4gMTQKLQotCi07Ly8gZnVuY3Rpb24gZXhwb3J0cyBhbmQgaW1wb3J0cwotCi0gICAgSU1QT1JUICBoMjY0YnNkRmlsbEJsb2NrCi0KLSAgICBFWFBPUlQgIGgyNjRic2RJbnRlcnBvbGF0ZUhvclF1YXJ0ZXIKLQotCi07Ly8gSG9yaXpvbnRhbCBmaWx0ZXIgYXBwcm9hY2gKLTsvLwotOy8vIEJhc2ljIGlkZWEgaW4gaG9yaXpvbnRhbCBmaWx0ZXJpbmcgaXMgdG8gYWRqdXN0IGNvZWZmaWNpZW50cwotOy8vIGxpa2UgYmVsb3cuIENhbGN1bGF0aW9uIGlzIGRvbmUgd2l0aCAxNi1iaXQgbWF0aHMuCi07Ly8KLTsvLyBSZWcgICAgIHhfMl8wICAgICB4XzNfMSAgICAgeF82XzQgICAgIHhfN181ICAgICB4XzJfMAotOy8vICAgICAgIFsgIDIgIDAgXSBbICAzICAxIF0gWyAgNiAgNCBdIFsgIDcgIDUgXSBbIDEwICA4IF0gLi4uCi07Ly8geV8wID0gICAyMCAgMSAgICAgMjAgLTUgICAgICAgIC01ICAgICAgICAgMQotOy8vIHlfMSA9ICAgLTUgICAgICAgIDIwICAxICAgICAgMSAyMCAgICAgICAgLTUKLTsvLyB5XzIgPSAgICAxICAgICAgICAtNSAgICAgICAgLTUgMjAgICAgICAxIDIwCi07Ly8geV8zID0gICAgICAgICAgICAgIDEgICAgICAgIDIwIC01ICAgICAtNSAyMCAgICAgICAgIDEKLQotCi1oMjY0YnNkSW50ZXJwb2xhdGVIb3JRdWFydGVyCi0gICAgU1RNRkQgICBzcCEsIHtyMC1yMTEsIGxyfQotICAgIFNVQiAgICAgc3AsIHNwLCAjMHgxZTQKLQotICAgIENNUCAgICAgeDAsICMwCi0gICAgQkxUICAgICBkb19maWxsICAgICAgICAgICAgICAgICA7Ly8gKHgwIDwgMCkKLSAgICBMRFIgICAgIHBhcnRXLCBbc3AsIzB4MjIwXSAgICAgIDsvLyBwYXJ0V2lkdGgKLSAgICBBREQgICAgIHRtcDQsIHgwLCBwYXJ0VyAgICAgICAgIDsvLyAoeDArcGFydFdpZHRoKQotICAgIEFERCAgICAgdG1wNCwgdG1wNCwgIzUgICAgICAgICAgOy8vICh5MCtwYXJ0Vys1KQotICAgIExEUiAgICAgd2lkdGgsIFtzcCwjMHgyMThdICAgICAgOy8vIHdpZHRoCi0gICAgQ01QICAgICB0bXA0LCB3aWR0aAotICAgIEJISSAgICAgZG9fZmlsbCAgICAgICAgICAgICAgICAgOy8vICh4MCtwYXJ0Vyk+d2lkdGgKLQotICAgIENNUCAgICAgeTAsICMwCi0gICAgQkxUICAgICBkb19maWxsICAgICAgICAgICAgICAgICA7Ly8gKHkwIDwgMCkKLSAgICBMRFIgICAgIHBhcnRILCBbc3AsIzB4MjI0XSAgICAgIDsvLyBwYXJ0SGVpZ2h0Ci0gICAgQUREICAgICB0bXAyLCB5MCwgcGFydEggICAgICAgICA7Ly8gKHkwK3BhcnRIZWlnaHQpCi0gICAgTERSICAgICBoZWlnaHQsIFtzcCwjMHgyMWNdICAgICA7Ly8gaGVpZ2h0Ci0gICAgQ01QICAgICB0bXAyLCBoZWlnaHQKLSAgICBCTFMgICAgIHNraXBfZmlsbCAgICAgICAgICAgICAgIDsvLyBubyBvdmVyZmlsbCBuZWVkZWQKLQotCi1kb19maWxsCi0gICAgTERSICAgICBwYXJ0SCwgW3NwLCMweDIyNF0gICAgICA7Ly8gcGFydEhlaWdodAotICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsIzB4MjFjXSAgICAgOy8vIGhlaWdodAotICAgIExEUiAgICAgcGFydFcsIFtzcCwjMHgyMjBdICAgICAgOy8vIHBhcnRXaWR0aAotICAgIEFERCAgICAgdG1wNCwgcGFydFcsICM1ICAgICAgICAgOy8vIHRtcDQgPSBwYXJ0VyArIDU7Ci0gICAgU1RNSUIgICBzcCwge2hlaWdodCwgdG1wNH0gICAgICA7Ly8gc3ArNCA9IGhlaWdodCwgc3ArOCA9IHBhcnRXaWR0aCs1Ci0gICAgU1RSICAgICBwYXJ0SCwgW3NwLCMweGNdICAgICAgICA7Ly8gc3ArYyA9IHBhcnRIZWlnaHQKLSAgICBTVFIgICAgIHRtcDQsIFtzcCwjMHgxMF0gICAgICAgIDsvLyBzcCsxMCA9IHBhcnRXaWR0aCs1Ci0gICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKLSAgICBTVFIgICAgIHdpZHRoLCBbc3AsIzBdICAgICAgICAgIDsvLyBzcCswID0gd2lkdGgKLSAgICBBREQgICAgIGJ1ZmYsIHNwLCAjMHgyOCAgICAgICAgIDsvLyBidWZmID0gcDFbMjEqMjEvNCsxXQotICAgIEJMICAgICAgaDI2NGJzZEZpbGxCbG9jawotCi0gICAgTU9WICAgICB4MCwgIzAKLSAgICBTVFIgICAgIHgwLFtzcCwjMHgxZWNdICAgICAgICAgIDsvLyB4MCA9IDAKLSAgICBTVFIgICAgIHgwLFtzcCwjMHgxZjBdICAgICAgICAgIDsvLyB5MCA9IDAKLSAgICBBREQgICAgIHJlZixzcCwjMHgyOCAgICAgICAgICAgIDsvLyByZWYgPSBwMQotICAgIFNUUiAgICAgdG1wNCwgW3NwLCMweDIxOF0gICAgICAgOy8vIHdpZHRoID0gcGFydFdpZHRoKzUKLQotCi1za2lwX2ZpbGwKLSAgICBMRFIgICAgIHgwICxbc3AsIzB4MWVjXSAgICAgICAgIDsvLyB4MAotICAgIExEUiAgICAgeTAgLFtzcCwjMHgxZjBdICAgICAgICAgOy8vIHkwCi0gICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKLSAgICBNTEEgICAgIHRtcDIsIHdpZHRoLCB5MCwgeDAgICAgIDsvLyB5MCp3aWR0aCt4MAotICAgIEFERCAgICAgcmVmLCByZWYsIHRtcDIgICAgICAgICAgOy8vIHJlZiArPSB5MCp3aWR0aCt4MAotICAgIEFERCAgICAgcmVmLCByZWYsICM4ICAgICAgICAgICAgOy8vIHJlZiA9IHJlZis4Ci0gICAgTERSICAgICBtYiwgW3NwLCAjMHgxZThdICAgICAgICA7Ly8gbWIKLQotICAgIDsvLyBwYWNrIHZhbHVlcyB0byBjb3VudCByZWdpc3RlcgotICAgIDsvLyBbMzE6MjhdIGxvb3BfeCAocGFydFdpZHRoLTEpCi0gICAgOy8vIFsyNzoyNF0gbG9vcF95IChwYXJ0SGVpZ2h0LTEpCi0gICAgOy8vIFsyMzoyMF0gcGFydFdpZHRoLTEKLSAgICA7Ly8gWzE5OjE2XSBwYXJ0SGVpZ2h0LTEKLSAgICA7Ly8gWzE1OjAwXSB3aWR0aAotICAgIE1PViAgICAgY291bnQsIHdpZHRoCi0gICAgU1VCICAgICBwYXJ0VywgcGFydFcsICMxOwotICAgIFNVQiAgICAgcGFydEgsIHBhcnRILCAjMTsKLSAgICBBREQgICAgIHRtcDIsIHBhcnRILCBwYXJ0VywgTFNMICM0Ci0gICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDIsIExTTCAjMTYKLQotCi0gICAgTERSICAgICBtdWx0XzIwXzAxLCA9IDB4MDAxNDAwMDEKLSAgICBMRFIgICAgIG11bHRfMjBfbTUsID0gMHgwMDE0RkZGQgotICAgIE1PViAgICAgcGx1czE2LCAjMTYKLSAgICBBTkQgICAgIHRtcDEsIGNvdW50LCAjMHgwMDBGMDAwMCAgICA7Ly8gcGFydEhlaWdodC0xCi0gICAgQU5EICAgICB0bXAzLCBjb3VudCwgIzB4MDBGMDAwMDAgICAgOy8vIHBhcnRXaWR0aC0xCi0gICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDEsIExTTCAjOAotbG9vcF95Ci0gICAgTERSICAgICB4XzNfMSwgW3JlZiwgIy04XQotICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAzLCBMU0wgIzgKLSAgICBMRFIgICAgIHhfN181LCBbcmVmLCAjLTRdCi0gICAgVVhUQjE2ICB4XzJfMCwgeF8zXzEKLSAgICBVWFRCMTYgIHhfM18xLCB4XzNfMSwgUk9SICM4Ci0gICAgVVhUQjE2ICB4XzZfNCwgeF83XzUKLQotbG9vcF94Ci0gICAgVVhUQjE2ICB4XzdfNSwgeF83XzUsIFJPUiAjOAotCi0gICAgU01MQUQgICB0bXAxLCB4XzJfMCwgbXVsdF8yMF8wMSwgcGx1czE2Ci0gICAgU01MQVRCICB0bXAzLCB4XzJfMCwgbXVsdF8yMF8wMSwgcGx1czE2Ci0gICAgU01MQVRCICB0bXAyLCB4XzJfMCwgbXVsdF8yMF9tNSwgcGx1czE2Ci0gICAgU01MQVRCICB0bXA0LCB4XzNfMSwgbXVsdF8yMF8wMSwgcGx1czE2Ci0KLSAgICBTTUxBRCAgIHRtcDEsIHhfM18xLCBtdWx0XzIwX201LCB0bXAxCi0gICAgU01MQVRCICB0bXAzLCB4XzNfMSwgbXVsdF8yMF9tNSwgdG1wMwotICAgIFNNTEFEICAgdG1wMiwgeF8zXzEsIG11bHRfMjBfMDEsIHRtcDIKLSAgICBMRFIgICAgIHhfM18xLCBbcmVmXSwgIzQKLSAgICBTTUxBRCAgIHRtcDQsIHhfNl80LCBtdWx0XzIwX201LCB0bXA0Ci0KLSAgICBTTUxBQkIgIHRtcDEsIHhfNl80LCBtdWx0XzIwX201LCB0bXAxCi0gICAgU01MQURYICB0bXAzLCB4XzZfNCwgbXVsdF8yMF9tNSwgdG1wMwotICAgIFNNTEFEWCAgdG1wMiwgeF82XzQsIG11bHRfMjBfMDEsIHRtcDIKLSAgICBTTUxBRFggIHRtcDQsIHhfN181LCBtdWx0XzIwX201LCB0bXA0Ci0KLSAgICBTTUxBQkIgIHRtcDEsIHhfN181LCBtdWx0XzIwXzAxLCB0bXAxCi0gICAgVVhUQjE2ICB4XzJfMCwgeF8zXzEKLSAgICBTTUxBQkIgIHRtcDIsIHhfN181LCBtdWx0XzIwX201LCB0bXAyCi0gICAgU01MQURYICB0bXAzLCB4XzdfNSwgbXVsdF8yMF8wMSwgdG1wMwotICAgIFNNTEFCQiAgdG1wNCwgeF8yXzAsIG11bHRfMjBfMDEsIHRtcDQKLQotICAgIE1PViAgICAgdG1wMiwgdG1wMiwgQVNSICM1Ci0gICAgTU9WICAgICB0bXAxLCB0bXAxLCBBU1IgIzUKLSAgICBQS0hCVCAgIHRtcDIsIHRtcDIsIHRtcDQsIExTTCAjKDE2LTUpCi0gICAgUEtIQlQgICB0bXAxLCB0bXAxLCB0bXAzLCBMU0wgIygxNi01KQotICAgIExEUiAgICAgdG1wNCwgW3NwLCAjMHgyMjhdCi0gICAgVVNBVDE2ICB0bXAyLCAjOCwgdG1wMgotICAgIFVTQVQxNiAgdG1wMSwgIzgsIHRtcDEKLSAgICBTVUIgICAgIHRtcDQsIHRtcDQsICMxMAotCi0gICAgU1VCUyAgICBjb3VudCwgY291bnQsICM0PDwyOAotICAgIExEUiAgICAgdG1wMywgW3JlZiwgdG1wNF0KLSAgICBPUlIgICAgIHRtcDEsIHRtcDEsIHRtcDIsIExTTCAjOAotCi07Ly8gcXVhcnRlciBwZWwgcG9zaXRpb24KLSAgICBMRFIgICAgIHRtcDIsID0gMHg4MDgwODA4MAotICAgIE1WTiAgICAgdG1wMywgdG1wMwotICAgIFVIU1VCOCAgdG1wMSwgdG1wMSwgdG1wMwotICAgIEVPUiAgICAgdG1wMSwgdG1wMSwgdG1wMgotICAgIFNUUiAgICAgdG1wMSwgW21iXSwgIzQKLQotICAgIEJDQyAgICAgbmV4dF95Ci0KLSAgICBVWFRCMTYgIHhfM18xLCB4XzNfMSwgUk9SICM4Ci0KLSAgICBTTUxBRCAgIHRtcDEsIHhfNl80LCBtdWx0XzIwXzAxLCBwbHVzMTYKLSAgICBTTUxBVEIgIHRtcDMsIHhfNl80LCBtdWx0XzIwXzAxLCBwbHVzMTYKLSAgICBTTUxBVEIgIHRtcDIsIHhfNl80LCBtdWx0XzIwX201LCBwbHVzMTYKLSAgICBTTUxBVEIgIHRtcDQsIHhfN181LCBtdWx0XzIwXzAxLCBwbHVzMTYKLQotICAgIFNNTEFEICAgdG1wMSwgeF83XzUsIG11bHRfMjBfbTUsIHRtcDEKLSAgICBTTUxBVEIgIHRtcDMsIHhfN181LCBtdWx0XzIwX201LCB0bXAzCi0gICAgU01MQUQgICB0bXAyLCB4XzdfNSwgbXVsdF8yMF8wMSwgdG1wMgotICAgIExEUiAgICAgeF83XzUsIFtyZWZdLCAjNAotICAgIFNNTEFEICAgdG1wNCwgeF8yXzAsIG11bHRfMjBfbTUsIHRtcDQKLQotICAgIFNNTEFCQiAgdG1wMSwgeF8yXzAsIG11bHRfMjBfbTUsIHRtcDEKLSAgICBTTUxBRFggIHRtcDMsIHhfMl8wLCBtdWx0XzIwX201LCB0bXAzCi0gICAgU01MQURYICB0bXAyLCB4XzJfMCwgbXVsdF8yMF8wMSwgdG1wMgotICAgIFNNTEFEWCAgdG1wNCwgeF8zXzEsIG11bHRfMjBfbTUsIHRtcDQKLQotICAgIFNNTEFCQiAgdG1wMSwgeF8zXzEsIG11bHRfMjBfMDEsIHRtcDEKLSAgICBVWFRCMTYgIHhfNl80LCB4XzdfNQotICAgIFNNTEFCQiAgdG1wMiwgeF8zXzEsIG11bHRfMjBfbTUsIHRtcDIKLSAgICBTTUxBRFggIHRtcDMsIHhfM18xLCBtdWx0XzIwXzAxLCB0bXAzCi0gICAgU01MQUJCICB0bXA0LCB4XzZfNCwgbXVsdF8yMF8wMSwgdG1wNAotCi0gICAgTU9WICAgICB0bXAyLCB0bXAyLCBBU1IgIzUKLSAgICBNT1YgICAgIHRtcDEsIHRtcDEsIEFTUiAjNQotICAgIFBLSEJUICAgdG1wMiwgdG1wMiwgdG1wNCwgTFNMICMoMTYtNSkKLSAgICBQS0hCVCAgIHRtcDEsIHRtcDEsIHRtcDMsIExTTCAjKDE2LTUpCi0gICAgTERSICAgICB0bXA0LCBbc3AsICMweDIyOF0KLSAgICBVU0FUMTYgIHRtcDIsICM4LCB0bXAyCi0gICAgVVNBVDE2ICB0bXAxLCAjOCwgdG1wMQotICAgIFNVQiAgICAgdG1wNCwgdG1wNCwgIzEwCi0KLSAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzQ8PDI4Ci0gICAgTERSICAgICB0bXAzLCBbcmVmLCB0bXA0XQotICAgIE9SUiAgICAgdG1wMSwgdG1wMSwgdG1wMiwgTFNMICM4Ci0KLTsvLyBxdWFydGVyIHBlbAotICAgIExEUiAgICAgdG1wMiwgPSAweDgwODA4MDgwCi0gICAgTVZOICAgICB0bXAzLCB0bXAzCi0gICAgVUhTVUI4ICB0bXAxLCB0bXAxLCB0bXAzCi0gICAgRU9SICAgICB0bXAxLCB0bXAxLCB0bXAyCi0KLSAgICBTVFIgICAgIHRtcDEsIFttYl0sICM0Ci0gICAgQkNTICAgICBsb29wX3gKLQotbmV4dF95Ci0gICAgQU5EICAgICB0bXAzLCBjb3VudCwgIzB4MDBGMDAwMDAgICAgOy8vIHBhcnRXaWR0aC0xCi0gICAgU01MQUJCICByZWYsIGNvdW50LCBtdWx0XzIwXzAxLCByZWYgOy8vICt3aWR0aAotICAgIEFERFMgICAgbWIsIG1iLCAjMTYgICAgICAgICAgICAgICAgIDsvLyArMTYsIENhcnJ5PTAKLSAgICBTQkMgICAgIG1iLCBtYiwgdG1wMywgTFNSICMyMCAgICAgICA7Ly8gLShwYXJ0V2lkdGgtMSktMQotICAgIFNCQyAgICAgcmVmLCByZWYsIHRtcDMsIExTUiAjMjAgICAgIDsvLyAtKHBhcnRXaWR0aC0xKS0xCi0gICAgQUREUyAgICBjb3VudCwgY291bnQsICMoMTw8MjgpLSgxPDwyNCkKLSAgICBCR0UgICAgIGxvb3BfeQotCi0gICAgQUREICAgICBzcCxzcCwjMHgxZjQKLSAgICBMRE1GRCAgIHNwISwge3I0LXIxMSwgcGN9Ci0KLSAgICBFTkQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9ob3JfdmVyX3F1YXJ0ZXIucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfaG9yX3Zlcl9xdWFydGVyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNzliMzkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9ob3JfdmVyX3F1YXJ0ZXIucworKysgL2Rldi9udWxsCkBAIC0xLDUzNiArMCwwIEBACi07IENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci07Ci07IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOwotOyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOwotOyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy0tCi07LS0gQWJzdHJhY3QgOiBBUk12NiBvcHRpbWl6ZWQgdmVyc2lvbiBvZiBoMjY0YnNkSW50ZXJwb2xhdGVIb3JWZXJRdWFydGVyIAotOy0tICAgICAgICAgICAgZnVuY3Rpb24KLTstLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0gICAgSUYgOkRFRjogSDI2NERFQ19XSU5BU00KLSAgICAgICAgOy8vIFdlIGRvbnQgdXNlIFJFUVVJUkU4IGFuZCBQUkVTRVJWRTggZm9yIHdpbmFzbQotICAgIEVMU0UKLSAgICAgICAgUkVRVUlSRTgKLSAgICAgICAgUFJFU0VSVkU4Ci0gICAgRU5ESUYKLQotICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERQotCi07Ly8gaDI2NGJzZEludGVycG9sYXRlSG9yVmVyUXVhcnRlciByZWdpc3RlciBhbGxvY2F0aW9uCi0KLXJlZiAgICAgUk4gMAotCi1tYiAgICAgIFJOIDEKLWJ1ZmYgICAgUk4gMQotCi1jb3VudCAgIFJOIDIKLXgwICAgICAgUk4gMgotCi15MCAgICAgIFJOIDMKLXhfMl8wICAgUk4gMwotcmVzICAgICBSTiAzCi0KLXhfM18xICAgUk4gNAotdG1wMSAgICBSTiA0Ci0KLWhlaWdodCAgUk4gNQoteF82XzQgICBSTiA1Ci10bXAyICAgIFJOIDUKLQotcGFydFcgICBSTiA2Ci14XzdfNSAgIFJOIDYKLXRtcDMgICAgUk4gNgotCi1wYXJ0SCAgIFJOIDcKLXRtcDQgICAgUk4gNwotCi10bXA1ICAgIFJOIDgKLQotdG1wNiAgICBSTiA5Ci0KLXRtcGEgICAgUk4gMTAKLQotbXVsdF8yMF8wMSAgUk4gMTEKLXRtcGIgICAgICAgIFJOIDExCi0KLW11bHRfMjBfbTUgIFJOIDEyCi13aWR0aCAgICAgICBSTiAxMgotCi1wbHVzMTYgIFJOIDE0Ci0KLQotOy8vIGZ1bmN0aW9uIGV4cG9ydHMgYW5kIGltcG9ydHMKLQotICAgIElNUE9SVCAgaDI2NGJzZEZpbGxCbG9jawotCi0gICAgRVhQT1JUICBoMjY0YnNkSW50ZXJwb2xhdGVIb3JWZXJRdWFydGVyCi0KLTsvLyBIb3Jpem9udGFsIGZpbHRlciBhcHByb2FjaAotOy8vCi07Ly8gQmFzaWMgaWRlYSBpbiBob3Jpem9udGFsIGZpbHRlcmluZyBpcyB0byBhZGp1c3QgY29lZmZpY2llbnRzCi07Ly8gbGlrZSBiZWxvdy4gQ2FsY3VsYXRpb24gaXMgZG9uZSB3aXRoIDE2LWJpdCBtYXRocy4KLTsvLwotOy8vIFJlZyAgICAgeF8yXzAgICAgIHhfM18xICAgICB4XzZfNCAgICAgeF83XzUgICAgIHhfMl8wCi07Ly8gICAgICAgWyAgMiAgMCBdIFsgIDMgIDEgXSBbICA2ICA0IF0gWyAgNyAgNSBdIFsgMTAgIDggXSAuLi4KLTsvLyB5XzAgPSAgIDIwICAxICAgICAyMCAtNSAgICAgICAgLTUgICAgICAgICAxCi07Ly8geV8xID0gICAtNSAgICAgICAgMjAgIDEgICAgICAxIDIwICAgICAgICAtNQotOy8vIHlfMiA9ICAgIDEgICAgICAgIC01ICAgICAgICAtNSAyMCAgICAgIDEgMjAKLTsvLyB5XzMgPSAgICAgICAgICAgICAgMSAgICAgICAgMjAgLTUgICAgIC01IDIwICAgICAgICAgMQotCi0KLWgyNjRic2RJbnRlcnBvbGF0ZUhvclZlclF1YXJ0ZXIKLSAgICBTVE1GRCAgIHNwISwge3IwLXIxMSwgbHJ9Ci0gICAgU1VCICAgICBzcCwgc3AsICMweDFlNAotCi0gICAgQ01QICAgICB4MCwgIzAKLSAgICBCTFQgICAgIGRvX2ZpbGwgICAgICAgICAgICAgICAgIDsvLyAoeDAgPCAwKQotICAgIExEUiAgICAgcGFydFcsIFtzcCwjMHgyMjBdICAgICAgOy8vIHBhcnRXaWR0aAotICAgIExEUiAgICAgd2lkdGgsIFtzcCwjMHgyMThdICAgICAgOy8vIHdpZHRoCi0gICAgQUREICAgICB0bXBhLCB4MCwgcGFydFcgICAgICAgICA7Ly8gKHgwK3BhcnRXaWR0aCkKLSAgICBBREQgICAgIHRtcGEsIHRtcGEsICM1ICAgICAgICAgIDsvLyAoeDArcGFydFcrNSkKLSAgICBDTVAgICAgIHRtcGEsIHdpZHRoCi0gICAgQkhJICAgICBkb19maWxsICAgICAgICAgICAgICAgICA7Ly8gKHgwK3BhcnRXKT53aWR0aAotCi0gICAgQ01QICAgICB5MCwgIzAKLSAgICBCTFQgICAgIGRvX2ZpbGwgICAgICAgICAgICAgICAgIDsvLyAoeTAgPCAwKQotICAgIExEUiAgICAgcGFydEgsIFtzcCwjMHgyMjRdICAgICAgOy8vIHBhcnRIZWlnaHQKLSAgICBMRFIgICAgIGhlaWdodCwgW3NwLCMweDIxY10gICAgIDsvLyBoZWlnaHQKLSAgICBBREQgICAgIHRtcDUsIHkwLCBwYXJ0SCAgICAgICAgIDsvLyAoeTArcGFydEhlaWdodCkKLSAgICBBREQgICAgIHRtcDUsIHRtcDUsICM1ICAgICAgICAgIDsvLyAoeTArcGFydEgrNSkKLSAgICBDTVAgICAgIHRtcDUsIGhlaWdodAotICAgIEJMUyAgICAgc2tpcF9maWxsICAgICAgICAgICAgICAgOy8vIG5vIG92ZXJmaWxsIG5lZWRlZAotCi0KLWRvX2ZpbGwKLSAgICBMRFIgICAgIHBhcnRILCBbc3AsIzB4MjI0XSAgICAgIDsvLyBwYXJ0SGVpZ2h0Ci0gICAgTERSICAgICBwYXJ0VywgW3NwLCMweDIyMF0gICAgICA7Ly8gcGFydFdpZHRoCi0gICAgTERSICAgICBoZWlnaHQsIFtzcCwjMHgyMWNdICAgICA7Ly8gaGVpZ2h0Ci0gICAgQUREICAgICB0bXA1LCBwYXJ0SCwgIzUgICAgICAgICA7Ly8gdG1wNSA9IHBhcnRIICsgNQotICAgIEFERCAgICAgdG1wYSwgcGFydFcsICM1ICAgICAgICAgOy8vIHRtcGEgPSBwYXJ0VyArIDUKLSAgICBTVE1JQiAgIHNwLCB7aGVpZ2h0LCB0bXBhfSAgICAgIDsvLyBzcCs0ID0gaGVpZ2h0LCBzcCs4ID0gcGFydFdpZHRoKzUKLSAgICBMRFIgICAgIHdpZHRoLCBbc3AsIzB4MjE4XSAgICAgIDsvLyB3aWR0aAotICAgIFNUUiAgICAgdG1wNSwgW3NwLCMweGNdICAgICAgICAgOy8vIHNwK2MgPSBwYXJ0SGVpZ2h0KzUKLSAgICBTVFIgICAgIHRtcGEsIFtzcCwjMHgxMF0gICAgICAgIDsvLyBzcCsxMCA9IHBhcnRXaWR0aCs1Ci0gICAgU1RSICAgICB3aWR0aCwgW3NwLCMwXSAgICAgICAgICA7Ly8gc3ArMCA9IHdpZHRoCi0gICAgQUREICAgICBidWZmLCBzcCwgIzB4MjggICAgICAgICA7Ly8gYnVmZiA9IHAxWzIxKjIxLzQrMV0KLSAgICBCTCAgICAgIGgyNjRic2RGaWxsQmxvY2sKLQotICAgIE1PViAgICAgeDAsICMwCi0gICAgU1RSICAgICB4MCxbc3AsIzB4MWVjXSAgICAgICAgICA7Ly8geDAgPSAwCi0gICAgU1RSICAgICB4MCxbc3AsIzB4MWYwXSAgICAgICAgICA7Ly8geTAgPSAwCi0gICAgQUREICAgICByZWYsc3AsIzB4MjggICAgICAgICAgICA7Ly8gcmVmID0gcDEKLSAgICBTVFIgICAgIHRtcGEsIFtzcCwjMHgyMThdICAgICAgIDsvLyB3aWR0aCA9IHBhcnRXaWR0aCs1Ci0KLQotc2tpcF9maWxsCi0gICAgTERSICAgICB4MCAsW3NwLCMweDFlY10gICAgICAgICA7Ly8geDAKLSAgICBMRFIgICAgIHkwICxbc3AsIzB4MWYwXSAgICAgICAgIDsvLyB5MAotICAgIExEUiAgICAgd2lkdGgsIFtzcCwjMHgyMThdICAgICAgOy8vIHdpZHRoCi0gICAgTERSICAgICB0bXA2LCBbc3AsIzB4MjI4XSAgICAgICA7Ly8gaG9yVmVyT2Zmc2V0Ci0gICAgTERSICAgICBtYiwgW3NwLCAjMHgxZThdICAgICAgICA7Ly8gbWIKLSAgICBNTEEgICAgIHRtcDUsIHdpZHRoLCB5MCwgeDAgICAgIDsvLyB5MCp3aWR0aCt4MAotICAgIEFERCAgICAgcmVmLCByZWYsIHRtcDUgICAgICAgICAgOy8vIHJlZiArPSB5MCp3aWR0aCt4MAotICAgIFNUUiAgICAgcmVmLCBbc3AsICMweDFlNF0gICAgICAgOy8vIHN0b3JlICJyZWYiIGZvciB2ZXJ0aWNhbCBmaWx0ZXJpbmcKLSAgICBBTkQgICAgIHRtcDYsIHRtcDYsICMyICAgICAgICAgIDsvLyBjYWxjdWxhdGUgcmVmIGZvciBob3Jpem9udGFsIGZpbHRlcgotICAgIE1PViAgICAgdG1wYSwgIzIKLSAgICBBREQgICAgIHRtcDYsIHRtcGEsIHRtcDYsIExTUiAjMQotICAgIE1MQSAgICAgcmVmLCB0bXA2LCB3aWR0aCwgcmVmCi0gICAgQUREICAgICByZWYsIHJlZiwgIzggICAgICAgICAgICA7Ly8gcmVmID0gcmVmKzgKLQotICAgIDsvLyBwYWNrIHZhbHVlcyB0byBjb3VudCByZWdpc3RlcgotICAgIDsvLyBbMzE6MjhdIGxvb3BfeCAocGFydFdpZHRoLTEpCi0gICAgOy8vIFsyNzoyNF0gbG9vcF95IChwYXJ0SGVpZ2h0LTEpCi0gICAgOy8vIFsyMzoyMF0gcGFydFdpZHRoLTEKLSAgICA7Ly8gWzE5OjE2XSBwYXJ0SGVpZ2h0LTEKLSAgICA7Ly8gWzE1OjAwXSB3aWR0aAotICAgIE1PViAgICAgY291bnQsIHdpZHRoCi0gICAgU1VCICAgICBwYXJ0VywgcGFydFcsICMxOwotICAgIFNVQiAgICAgcGFydEgsIHBhcnRILCAjMTsKLSAgICBBREQgICAgIHRtcDUsIHBhcnRILCBwYXJ0VywgTFNMICM0Ci0gICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDUsIExTTCAjMTYKLQotCi0gICAgTERSICAgICBtdWx0XzIwXzAxLCA9IDB4MDAxNDAwMDEgICAgOy8vIGNvbnN0YW50IG11bHRpcGxpZXJzCi0gICAgTERSICAgICBtdWx0XzIwX201LCA9IDB4MDAxNEZGRkIgICAgOy8vIGNvbnN0YW50IG11bHRpcGxpZXJzCi0gICAgTU9WICAgICBwbHVzMTYsICMxNiAgICAgICAgICAgICAgICAgOy8vIGNvbnN0YW50IGZvciBhZGQKLSAgICBBTkQgICAgIHRtcDQsIGNvdW50LCAjMHgwMDBGMDAwMCAgICA7Ly8gcGFydEhlaWdodC0xCi0gICAgQU5EICAgICB0bXA2LCBjb3VudCwgIzB4MDBGMDAwMDAgICAgOy8vIHBhcnRXaWR0aC0xCi0gICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDQsIExTTCAjOCAgOy8vIHBhcnRILTEgdG8gbG93ZXIgcGFydCBvZiB0b3AgYnl0ZQotCi07Ly8gSE9SSVpPTlRBTCBQQVJUCi0KLWxvb3BfeV9ob3IKLSAgICBMRFIgICAgIHhfM18xLCBbcmVmLCAjLThdCi0gICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDYsIExTTCAjOCAgIDsvLyBwYXJ0Vy0xIHRvIHVwcGVyIHBhcnQgb2YgdG9wIGJ5dGUKLSAgICBMRFIgICAgIHhfN181LCBbcmVmLCAjLTRdCi0gICAgVVhUQjE2ICB4XzJfMCwgeF8zXzEKLSAgICBVWFRCMTYgIHhfM18xLCB4XzNfMSwgUk9SICM4Ci0gICAgVVhUQjE2ICB4XzZfNCwgeF83XzUKLQotbG9vcF94X2hvcgotICAgIFVYVEIxNiAgeF83XzUsIHhfN181LCBST1IgIzgKLQotICAgIFNNTEFEICAgdG1wNCwgeF8yXzAsIG11bHRfMjBfMDEsIHBsdXMxNgotICAgIFNNTEFUQiAgdG1wNiwgeF8yXzAsIG11bHRfMjBfMDEsIHBsdXMxNgotICAgIFNNTEFUQiAgdG1wNSwgeF8yXzAsIG11bHRfMjBfbTUsIHBsdXMxNgotICAgIFNNTEFUQiAgdG1wYSwgeF8zXzEsIG11bHRfMjBfMDEsIHBsdXMxNgotCi0gICAgU01MQUQgICB0bXA0LCB4XzNfMSwgbXVsdF8yMF9tNSwgdG1wNAotICAgIFNNTEFUQiAgdG1wNiwgeF8zXzEsIG11bHRfMjBfbTUsIHRtcDYKLSAgICBTTUxBRCAgIHRtcDUsIHhfM18xLCBtdWx0XzIwXzAxLCB0bXA1Ci0gICAgTERSICAgICB4XzNfMSwgW3JlZl0sICM0Ci0gICAgU01MQUQgICB0bXBhLCB4XzZfNCwgbXVsdF8yMF9tNSwgdG1wYQotCi0gICAgU01MQUJCICB0bXA0LCB4XzZfNCwgbXVsdF8yMF9tNSwgdG1wNAotICAgIFNNTEFEWCAgdG1wNiwgeF82XzQsIG11bHRfMjBfbTUsIHRtcDYKLSAgICBTTUxBRFggIHRtcDUsIHhfNl80LCBtdWx0XzIwXzAxLCB0bXA1Ci0gICAgU01MQURYICB0bXBhLCB4XzdfNSwgbXVsdF8yMF9tNSwgdG1wYQotCi0gICAgU01MQUJCICB0bXA0LCB4XzdfNSwgbXVsdF8yMF8wMSwgdG1wNAotICAgIFVYVEIxNiAgeF8yXzAsIHhfM18xCi0gICAgU01MQUJCICB0bXA1LCB4XzdfNSwgbXVsdF8yMF9tNSwgdG1wNQotICAgIFNNTEFEWCAgdG1wNiwgeF83XzUsIG11bHRfMjBfMDEsIHRtcDYKLSAgICBTTUxBQkIgIHRtcGEsIHhfMl8wLCBtdWx0XzIwXzAxLCB0bXBhCi0KLSAgICBNT1YgICAgIHRtcDUsIHRtcDUsIEFTUiAjNQotICAgIE1PViAgICAgdG1wNCwgdG1wNCwgQVNSICM1Ci0gICAgUEtIQlQgICB0bXA1LCB0bXA1LCB0bXBhLCBMU0wgIygxNi01KQotICAgIFBLSEJUICAgdG1wNCwgdG1wNCwgdG1wNiwgTFNMICMoMTYtNSkKLSAgICBVU0FUMTYgIHRtcDUsICM4LCB0bXA1Ci0gICAgVVNBVDE2ICB0bXA0LCAjOCwgdG1wNAotCi0gICAgU1VCUyAgICBjb3VudCwgY291bnQsICM0PDwyOAotICAgIE9SUiAgICAgdG1wNCwgdG1wNCwgdG1wNSwgTFNMICM4Ci0gICAgU1RSICAgICB0bXA0LCBbbWJdLCAjNAotICAgIEJDQyAgICAgbmV4dF95X2hvcgotCi0gICAgVVhUQjE2ICB4XzNfMSwgeF8zXzEsIFJPUiAjOAotCi0gICAgU01MQUQgICB0bXA0LCB4XzZfNCwgbXVsdF8yMF8wMSwgcGx1czE2Ci0gICAgU01MQVRCICB0bXA2LCB4XzZfNCwgbXVsdF8yMF8wMSwgcGx1czE2Ci0gICAgU01MQVRCICB0bXA1LCB4XzZfNCwgbXVsdF8yMF9tNSwgcGx1czE2Ci0gICAgU01MQVRCICB0bXBhLCB4XzdfNSwgbXVsdF8yMF8wMSwgcGx1czE2Ci0KLSAgICBTTUxBRCAgIHRtcDQsIHhfN181LCBtdWx0XzIwX201LCB0bXA0Ci0gICAgU01MQVRCICB0bXA2LCB4XzdfNSwgbXVsdF8yMF9tNSwgdG1wNgotICAgIFNNTEFEICAgdG1wNSwgeF83XzUsIG11bHRfMjBfMDEsIHRtcDUKLSAgICBMRFIgICAgIHhfN181LCBbcmVmXSwgIzQKLSAgICBTTUxBRCAgIHRtcGEsIHhfMl8wLCBtdWx0XzIwX201LCB0bXBhCi0KLSAgICBTTUxBQkIgIHRtcDQsIHhfMl8wLCBtdWx0XzIwX201LCB0bXA0Ci0gICAgU01MQURYICB0bXA2LCB4XzJfMCwgbXVsdF8yMF9tNSwgdG1wNgotICAgIFNNTEFEWCAgdG1wNSwgeF8yXzAsIG11bHRfMjBfMDEsIHRtcDUKLSAgICBTTUxBRFggIHRtcGEsIHhfM18xLCBtdWx0XzIwX201LCB0bXBhCi0KLSAgICBTTUxBQkIgIHRtcDQsIHhfM18xLCBtdWx0XzIwXzAxLCB0bXA0Ci0gICAgVVhUQjE2ICB4XzZfNCwgeF83XzUKLSAgICBTTUxBQkIgIHRtcDUsIHhfM18xLCBtdWx0XzIwX201LCB0bXA1Ci0gICAgU01MQURYICB0bXA2LCB4XzNfMSwgbXVsdF8yMF8wMSwgdG1wNgotICAgIFNNTEFCQiAgdG1wYSwgeF82XzQsIG11bHRfMjBfMDEsIHRtcGEKLQotICAgIE1PViAgICAgdG1wNSwgdG1wNSwgQVNSICM1Ci0gICAgTU9WICAgICB0bXA0LCB0bXA0LCBBU1IgIzUKLSAgICBQS0hCVCAgIHRtcDUsIHRtcDUsIHRtcGEsIExTTCAjKDE2LTUpCi0gICAgUEtIQlQgICB0bXA0LCB0bXA0LCB0bXA2LCBMU0wgIygxNi01KQotICAgIFVTQVQxNiAgdG1wNSwgIzgsIHRtcDUKLSAgICBVU0FUMTYgIHRtcDQsICM4LCB0bXA0Ci0KLSAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzQ8PDI4Ci0gICAgT1JSICAgICB0bXA0LCB0bXA0LCB0bXA1LCBMU0wgIzgKLSAgICBTVFIgICAgIHRtcDQsIFttYl0sICM0Ci0gICAgQkNTICAgICBsb29wX3hfaG9yCi0KLW5leHRfeV9ob3IKLSAgICBBTkQgICAgIHRtcDYsIGNvdW50LCAjMHgwMEYwMDAwMCAgICAgICAgOy8vIHBhcnRXaWR0aC0xCi0gICAgU01MQUJCICByZWYsIGNvdW50LCBtdWx0XzIwXzAxLCByZWYgICAgIDsvLyArd2lkdGgKLSAgICBBRERTICAgIG1iLCBtYiwgIzE2ICAgICAgICAgICAgICAgICAgICAgOy8vICsxNiwgQ2Fycnk9MAotICAgIFNCQyAgICAgbWIsIG1iLCB0bXA2LCBMU1IgIzIwICAgICAgICAgICA7Ly8gLShwYXJ0V2lkdGgtMSktMQotICAgIFNCQyAgICAgcmVmLCByZWYsIHRtcDYsIExTUiAjMjAgICAgICAgICA7Ly8gLShwYXJ0V2lkdGgtMSktMQotICAgIEFERFMgICAgY291bnQsIGNvdW50LCAjKDE8PDI4KS0oMTw8MjQpICA7Ly8gZGVjcmVtZW50IGNvdW50ZXIgKHBhcnRXKQotICAgIEJHRSAgICAgbG9vcF95X2hvcgotCi0KLQotOy8vIFZFUlRJQ0FMIFBBUlQKLTsvLwotOy8vIEFwcHJvYWNoIHRvIHZlcnRpY2FsIGludGVycG9sYXRpb24KLTsvLwotOy8vIEludGVycG9sYXRpb24gaXMgZG9uZSBieSB1c2luZyAzMi1iaXQgbG9hZHMgYW5kIHN0b3JlcwotOy8vIGFuZCBieSB1c2luZyAxNiBiaXQgYXJpdGhtZXRpYy4gNHg0IGJsb2NrIGlzIHByb2Nlc3NlZAotOy8vIGluIGVhY2ggcm91bmQuCi07Ly8KLTsvLyB8YV8xMXxhXzExfGFfMTF8YV8xMXwuLi58YV8xbnxhXzFufGFfMW58YV8xbnwKLTsvLyB8Yl8xMXxiXzExfGJfMTF8Yl8xMXwuLi58Yl8xbnxiXzFufGJfMW58Yl8xbnwKLTsvLyB8Y18xMXxjXzExfGNfMTF8Y18xMXwuLi58Y18xbnxjXzFufGNfMW58Y18xbnwKLTsvLyB8ZF8xMXxkXzExfGRfMTF8ZF8xMXwuLi58ZF8xbnxkXzFufGRfMW58ZF8xbnwKLTsvLyAgICAgICAgICAgLi4KLTsvLyAgICAgICAgICAgLi4KLTsvLyB8YV9tMXxhX20xfGFfbTF8YV9tMXwuLi4KLTsvLyB8Yl9tMXxiX20xfGJfbTF8Yl9tMXwuLi4KLTsvLyB8Y19tMXxjX20xfGNfbTF8Y19tMXwuLi4KLTsvLyB8ZF9tMXxkX20xfGRfbTF8ZF9tMXwuLi4KLQotOy8vIEFwcHJvYWNoIHRvIGJpbGluZWFyIGludGVycG9sYXRpb24gdG8gcXVhcnRlciBwZWwgcG9zaXRpb24uCi07Ly8gNCBieXRlcyBhcmUgcHJvY2Vzc2VkIHBhcmFsbGVsCi07Ly8KLTsvLyBhbGdvcml0aG0gKGErYisxKS8yLiBSb3VkaW5nIHVwd2FyZHMgKzEgY2FuIGJlIGFjaGlldmVkIGJ5IAotOy8vIG5lZ2F0aW5nIHNlY29uZCBvcGVyYW5kIHRvIGdldCBvbmUncyBjb21wbGVtZW50IChpbnN0ZWFkIG9mIDIncykKLTsvLyBhbmQgdXNpbmcgc3VidHJhY3Rpb24sIEVPUiBpcyB1c2VkIHRvIGNvcnJlY3Qgc2lnbi4KLTsvLwotOy8vIE1WTiAgICAgYiwgYgotOy8vIFVIU1VCOCAgYSwgYSwgYgotOy8vIEVPUiAgICAgYSwgYSwgMHg4MDgwODA4MAotCi0KLSAgICBMRFIgICAgIHJlZiwgW3NwLCAjMHgxZTRdICAgICAgICAgICA7Ly8gcmVmCi0gICAgTERSICAgICB0bXBhLCBbc3AsICMweDIyOF0gICAgICAgICAgOy8vIGhvclZlck9mZnNldAotICAgIExEUiAgICAgbWIsIFtzcCwgIzB4MWU4XSAgICAgICAgICAgIDsvLyBtYgotICAgIExEUiAgICAgd2lkdGgsIFtzcCwgIzB4MjE4XSAgICAgICAgIDsvLyB3aWR0aAotICAgIEFERCAgICAgcmVmLCByZWYsICMyICAgICAgICAgICAgICAgIDsvLyBjYWxjdWxhdGUgY29ycmVjdCBwb3NpdGlvbgotICAgIEFORCAgICAgdG1wYSwgdG1wYSwgIzEKLSAgICBBREQgICAgIHJlZiwgcmVmLCB0bXBhCi0gICAgTERSICAgICBwbHVzMTYsID0gMHgwMDEwMDAxMCAgICAgICAgOy8vICsxNiB0byBsb3dlciBhbmQgdXBwZXJmIGhhbGZ3b3JkcwotICAgIEFORCAgICAgY291bnQsIGNvdW50LCAjMHgwMEZGRkZGRiAgIDsvLyBwYXJ0V2lkdGgtMQotCi0gICAgQU5EICAgICB0bXBhLCBjb3VudCwgIzB4MDAwRjAwMDAgICAgOy8vIHBhcnRIZWlnaHQtMQotICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXBhLCBMU0wgIzgKLQotbG9vcF95Ci0gICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDYsIExTTCAjOCAgOy8vIHBhcnRXaWR0aC0xCi0KLWxvb3BfeAotICAgIExEUiAgICAgdG1wMSwgW3JlZl0sIHdpZHRoICAgICA7Ly8gfGE0fGEzfGEyfGExfAotICAgIExEUiAgICAgdG1wMiwgW3JlZl0sIHdpZHRoICAgICA7Ly8gfGM0fGMzfGMyfGMxfAotICAgIExEUiAgICAgdG1wMywgW3JlZl0sIHdpZHRoICAgICA7Ly8gfGc0fGczfGcyfGcxfAotICAgIExEUiAgICAgdG1wNCwgW3JlZl0sIHdpZHRoICAgICA7Ly8gfG00fG0zfG0yfG0xfAotICAgIExEUiAgICAgdG1wNSwgW3JlZl0sIHdpZHRoICAgICA7Ly8gfHI0fHIzfHIyfHIxfAotICAgIExEUiAgICAgdG1wNiwgW3JlZl0sIHdpZHRoICAgICA7Ly8gfHQ0fHQzfHQyfHQxfAotCi0gICAgOy8vIGZpcnN0IGZvdXIgcGl4ZWxzIAotICAgIFVYVEIxNiAgdG1wYSwgdG1wMyAgICAgICAgICAgICAgICAgIDsvLyB8ZzN8ZzF8Ci0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA0ICAgICAgICAgICAgOy8vIHxnMyttM3xnMSttMXwKLSAgICBVWFRCMTYgIHRtcGIsIHRtcDIgICAgICAgICAgICAgICAgICA7Ly8gfGMzfGMxfAotICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKLQotICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wNSAgICAgICAgICAgIDsvLyB8YzMrcjN8YzErcjF8Ci0gICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA2ICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQStUCi0KLSAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCi0gICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCi0KLSAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKLSAgICBMRFIgICAgIHJlcywgPSAweDAwRkYwMEZGCi0gICAgVVhUQjE2ICB0bXBhLCB0bXAzLCBST1IgIzggICAgICAgICAgOy8vIHxnNHxnMnwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDQsIFJPUiAjOCAgICA7Ly8gfGc0K200fGcyK20yfAotICAgIEFORCAgICAgcmVzLCByZXMsIHRtcGIsIExTUiAjNSAgICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKLQotICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKLSAgICBVWFRCMTYgIHRtcGIsIHRtcDIsIFJPUiAjOCAgICAgICAgICA7Ly8gfGM0fGMyfAotICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCi0gICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXA1LCBST1IgIzggICAgOy8vIHxjNCtyNHxjMityMnwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA2LCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQStUCi0KLSAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCi0gICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCi0KLSAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKLSAgICBMRFIgICAgIHRtcDEsIFttYl0KLSAgICBMRFIgICAgIHRtcGEsID0gMHhGRjAwRkYwMAotICAgIE1WTiAgICAgdG1wMSwgdG1wMQotICAgIEFORCAgICAgdG1wYSwgdG1wYSwgdG1wYiwgTFNMICMzICAgIDsvLyBtYXNrIGFuZCBkaXZlZGUgYnkgMzIKLSAgICBPUlIgICAgIHJlcywgcmVzLCB0bXBhCi0KLSAgICBMRFIgICAgIHRtcGEsID0gMHg4MDgwODA4MAotICAgIFVIU1VCOCAgcmVzLCByZXMsIHRtcDEgICAgICAgICAgICAgIDsvLyBiaWxpbmVhciBpbnRlcnBvbGF0aW9uCi0gICAgTERSICAgICB0bXAxLCBbcmVmXSwgd2lkdGggICAgICAgICAgOy8vIGxvYWQgbmV4dCByb3cKLSAgICBFT1IgICAgIHJlcywgcmVzLCB0bXBhICAgICAgICAgICAgICA7Ly8gY29ycmVjdCBzaWduCi0KLSAgICBTVFIgICAgIHJlcywgW21iXSwgIzE2ICAgICAgICAgICAgICA7Ly8gbmV4dCByb3cgKG1iKQotCi0KLSAgICA7Ly8gdG1wMiA9IHxhNHxhM3xhMnxhMXwKLSAgICA7Ly8gdG1wMyA9IHxjNHxjM3xjMnxjMXwKLSAgICA7Ly8gdG1wNCA9IHxnNHxnM3xnMnxnMXwKLSAgICA7Ly8gdG1wNSA9IHxtNHxtM3xtMnxtMXwKLSAgICA7Ly8gdG1wNiA9IHxyNHxyM3xyMnxyMXwKLSAgICA7Ly8gdG1wMSA9IHx0NHx0M3x0Mnx0MXwKLQotICAgIDsvLyBzZWNvbmQgZm91ciBwaXhlbHMKLSAgICBVWFRCMTYgIHRtcGEsIHRtcDQgICAgICAgICAgICAgICAgICA7Ly8gfGczfGcxfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNSAgICAgICAgICAgIDsvLyB8ZzMrbTN8ZzErbTF8Ci0gICAgVVhUQjE2ICB0bXBiLCB0bXAzICAgICAgICAgICAgICAgICAgOy8vIHxjM3xjMXwKLSAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCi0gICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXA2ICAgICAgICAgICAgOy8vIHxjMytyM3xjMStyMXwKLSAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMiAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0EKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBK1QKLQotICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKLSAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKLQotICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQotICAgIExEUiAgICAgcmVzLCA9IDB4MDBGRjAwRkYKLSAgICBVWFRCMTYgIHRtcGEsIHRtcDQsIFJPUiAjOCAgICAgICAgICA7Ly8gfGc0fGcyfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNSwgUk9SICM4ICAgIDsvLyB8ZzQrbTR8ZzIrbTJ8Ci0gICAgQU5EICAgICByZXMsIHJlcywgdG1wYiwgTFNSICM1ICAgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgotCi0gICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQotICAgIFVYVEIxNiAgdG1wYiwgdG1wMywgUk9SICM4ICAgICAgICAgIDsvLyB8YzR8YzJ8Ci0gICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKLSAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDYsIFJPUiAjOCAgICA7Ly8gfGM0K3I0fGMyK3IyfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMiwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0EKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBK1QKLQotICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKLSAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKLQotICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQotICAgIExEUiAgICAgdG1wMiwgW21iXQotICAgIExEUiAgICAgdG1wYSwgPSAweEZGMDBGRjAwCi0gICAgTVZOICAgICB0bXAyLCB0bXAyCi0KLSAgICBBTkQgICAgIHRtcGEsIHRtcGEsIHRtcGIsIExTTCAjMyAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCi0gICAgT1JSICAgICByZXMsIHJlcywgdG1wYQotICAgIExEUiAgICAgdG1wYSwgPSAweDgwODA4MDgwCi0gICAgVUhTVUI4ICByZXMsIHJlcywgdG1wMiAgICAgICAgICAgICAgOy8vIGJpbGluZWFyIGludGVycG9sYXRpb24KLSAgICBMRFIgICAgIHRtcDIsIFtyZWZdLCB3aWR0aCAgICAgICAgICA7Ly8gbG9hZCBuZXh0IHJvdwotICAgIEVPUiAgICAgcmVzLCByZXMsIHRtcGEgICAgICAgICAgICAgIDsvLyBjb3JyZWN0IHNpZ24KLSAgICBTVFIgICAgIHJlcywgW21iXSwgIzE2ICAgICAgICAgICAgICA7Ly8gbmV4dCByb3cKLQotICAgIDsvLyB0bXAzID0gfGE0fGEzfGEyfGExfAotICAgIDsvLyB0bXA0ID0gfGM0fGMzfGMyfGMxfAotICAgIDsvLyB0bXA1ID0gfGc0fGczfGcyfGcxfAotICAgIDsvLyB0bXA2ID0gfG00fG0zfG0yfG0xfAotICAgIDsvLyB0bXAxID0gfHI0fHIzfHIyfHIxfAotICAgIDsvLyB0bXAyID0gfHQ0fHQzfHQyfHQxfAotCi0gICAgOy8vIHRoaXJkIGZvdXIgcGl4ZWxzCi0gICAgVVhUQjE2ICB0bXBhLCB0bXA1ICAgICAgICAgICAgICAgICAgOy8vIHxnM3xnMXwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDYgICAgICAgICAgICA7Ly8gfGczK20zfGcxK20xfAotICAgIFVYVEIxNiAgdG1wYiwgdG1wNCAgICAgICAgICAgICAgICAgIDsvLyB8YzN8YzF8Ci0gICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQotICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wMSAgICAgICAgICAgIDsvLyB8YzMrcjN8YzErcjF8Ci0gICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDMgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAyICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQStUCi0KLSAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCi0gICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCi0KLSAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKLSAgICBMRFIgICAgIHJlcywgPSAweDAwRkYwMEZGCi0gICAgVVhUQjE2ICB0bXBhLCB0bXA1LCBST1IgIzggICAgICAgICAgOy8vIHxnNHxnMnwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDYsIFJPUiAjOCAgICA7Ly8gfGc0K200fGcyK20yfAotICAgIEFORCAgICAgcmVzLCByZXMsIHRtcGIsIExTUiAjNSAgICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKLQotICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKLSAgICBVWFRCMTYgIHRtcGIsIHRtcDQsIFJPUiAjOCAgICAgICAgICA7Ly8gfGM0fGMyfAotICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCi0gICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXAxLCBST1IgIzggICAgOy8vIHxjNCtyNHxjMityMnwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDMsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAyLCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQStUCi0KLQotICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKLSAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKLQotICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQotICAgIExEUiAgICAgdG1wMywgW21iXQotICAgIExEUiAgICAgdG1wYSwgPSAweEZGMDBGRjAwCi0gICAgTVZOICAgICB0bXAzLCB0bXAzCi0KLSAgICBBTkQgICAgIHRtcGEsIHRtcGEsIHRtcGIsIExTTCAjMyAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCi0gICAgT1JSICAgICByZXMsIHJlcywgdG1wYQotICAgIExEUiAgICAgdG1wYSwgPSAweDgwODA4MDgwCi0gICAgVUhTVUI4ICByZXMsIHJlcywgdG1wMyAgICAgICAgICAgICAgOy8vIGJpbGluZWFyIGludGVycG9sYXRpb24KLSAgICBMRFIgICAgIHRtcDMsIFtyZWZdICAgICAgICAgICAgICAgICA7Ly8gbG9hZCBuZXh0IHJvdwotICAgIEVPUiAgICAgcmVzLCByZXMsIHRtcGEgICAgICAgICAgICAgIDsvLyBjb3JyZWN0IHNpZ24KLSAgICBTVFIgICAgIHJlcywgW21iXSwgIzE2ICAgICAgICAgICAgICA7Ly8gbmV4dCByb3cKLQotICAgIDsvLyB0bXA0ID0gfGE0fGEzfGEyfGExfAotICAgIDsvLyB0bXA1ID0gfGM0fGMzfGMyfGMxfAotICAgIDsvLyB0bXA2ID0gfGc0fGczfGcyfGcxfAotICAgIDsvLyB0bXAxID0gfG00fG0zfG0yfG0xfAotICAgIDsvLyB0bXAyID0gfHI0fHIzfHIyfHIxfAotICAgIDsvLyB0bXAzID0gfHQ0fHQzfHQyfHQxfAotCi0gICAgOy8vIGZvdXJ0aCBmb3VyIHBpeGVscwotICAgIFVYVEIxNiAgdG1wYSwgdG1wNiAgICAgICAgICAgICAgICAgIDsvLyB8ZzN8ZzF8Ci0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxICAgICAgICAgICAgOy8vIHxnMyttM3xnMSttMXwKLSAgICBVWFRCMTYgIHRtcGIsIHRtcDUgICAgICAgICAgICAgICAgICA7Ly8gfGMzfGMxfAotICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKLSAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDIgICAgICAgICAgICA7Ly8gfGMzK3IzfGMxK3IxfAotICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA0ICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQQotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMyAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0ErVAotCi0gICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQotICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQotCi0gICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCi0gICAgTERSICAgICByZXMsID0gMHgwMEZGMDBGRgotICAgIFVYVEIxNiAgdG1wYSwgdG1wNiwgUk9SICM4ICAgICAgICAgIDsvLyB8ZzR8ZzJ8Ci0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxLCBST1IgIzggICAgOy8vIHxnNCttNHxnMittMnwKLSAgICBBTkQgICAgIHJlcywgcmVzLCB0bXBiLCBMU1IgIzUgICAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCi0KLSAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCi0gICAgVVhUQjE2ICB0bXBiLCB0bXA1LCBST1IgIzggICAgICAgICAgOy8vIHxjNHxjMnwKLSAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQotICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wMiwgUk9SICM4ICAgIDsvLyB8YzQrcjR8YzIrcjJ8Ci0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA0LCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQQotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMywgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0ErVAotCi0gICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQotICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQotCi0gICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCi0gICAgTERSICAgICB0bXA1LCBbbWJdCi0gICAgTERSICAgICB0bXA0LCA9IDB4RkYwMEZGMDAKLSAgICBNVk4gICAgIHRtcDUsIHRtcDUKLQotICAgIEFORCAgICAgdG1wYSwgdG1wNCwgdG1wYiwgTFNMICMzICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKLSAgICBPUlIgICAgIHJlcywgcmVzLCB0bXBhCi0gICAgTERSICAgICB0bXBhLCA9IDB4ODA4MDgwODAKLSAgICBVSFNVQjggIHJlcywgcmVzLCB0bXA1ICAgICAgICAgICAgICA7Ly8gYmlsaW5lYXIgaW50ZXJwb2xhdGlvbgotCi0gICAgOy8vIGRlY3JlbWVudCBsb29wX3ggY291bnRlcgotICAgIFNVQlMgICAgY291bnQsIGNvdW50LCAjNDw8MjggICAgICAgIDsvLyBkZWNyZW1lbnQgeCBsb29wIGNvdW50ZXIKLQotICAgIDsvLyBjYWxjdWxhdGUgInJlZiIgYWRkcmVzcyBmb3IgbmV4dCByb3VuZAotICAgIFNVQiAgICAgcmVmLCByZWYsIHdpZHRoLCBMU0wgIzMgICAgIDsvLyByZWYgLT0gOCp3aWR0aDsKLSAgICBBREQgICAgIHJlZiwgcmVmLCAjNCAgICAgICAgICAgICAgICA7Ly8gbmV4dCBjb2x1bW4gKDQgcGl4ZWxzKQotCi0gICAgRU9SICAgICByZXMsIHJlcywgdG1wYSAgICAgICAgICAgICAgOy8vIGNvcnJlY3Qgc2lnbgotICAgIFNUUiAgICAgcmVzLCBbbWJdLCAjLTQ0Ci0KLSAgICBCQ1MgICAgIGxvb3BfeAotCi0gICAgQUREUyAgICBtYiwgbWIsICM2NCAgICAgICAgICAgICAgICAgOy8vIHNldCBDYXJyeT0wCi0gICAgQUREICAgICByZWYsIHJlZiwgd2lkdGgsIExTTCAjMiAgICAgOy8vIHJlZiArPSA0KndpZHRoCi0gICAgQU5EICAgICB0bXA2LCBjb3VudCwgIzB4MDBGMDAwMDAgICAgOy8vIHBhcnRXaWR0aC0xCi0gICAgU0JDICAgICByZWYsIHJlZiwgdG1wNiwgTFNSICMyMCAgICAgOy8vIC0ocGFydFdpZHRoLTEpLTEKLSAgICBTQkMgICAgIG1iLCBtYiwgdG1wNiwgTFNSICMyMCAgICAgICA7Ly8gLShwYXJ0V2lkdGgtMSktMQotCi0gICAgQUREUyAgICBjb3VudCwgY291bnQsICMweEMgPDwgMjQgICAgOy8vIGRlY3JlbWVudCB5IGxvb3AgY291bnRlcgotICAgIEJHRSAgICAgbG9vcF95Ci0KLSAgICBBREQgICAgIHNwLCBzcCwgIzB4MWY0Ci0gICAgTERNRkQgICBzcCEsIHtyNC1yMTEsIHBjfQotCi0gICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX21pZF9ob3IucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfbWlkX2hvci5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODFhZWQ3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfbWlkX2hvci5zCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLTsgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QNCi07DQotOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi07IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi07IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLTsNCi07ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotOw0KLTsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLTsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi07IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLTsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLTsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi07LS0NCi07LS0gQWJzdHJhY3QgOiBBUk12NiBvcHRpbWl6ZWQgdmVyc2lvbiBob3Jpem9udGFsIHBhcnQgb2YgDQotOy0tICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlTWlkIGZ1bmN0aW9ucw0KLTstLQ0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotDQotICAgIElGIDpERUY6IEgyNjRERUNfV0lOQVNNDQotICAgICAgICA7Ly8gV2UgZG9udCB1c2UgUkVRVUlSRTggYW5kIFBSRVNFUlZFOCBmb3Igd2luYXNtDQotICAgIEVMU0UNCi0gICAgICAgIFJFUVVJUkU4DQotICAgICAgICBQUkVTRVJWRTgNCi0gICAgRU5ESUYNCi0NCi0gICAgQVJFQSAgICB8LnRleHR8LCBDT0RFDQotDQotDQotOy8vIFJlZ2lzdGVyIGFsbG9jYXRpb24NCi0NCi1yZWYgICAgIFJOIDAgICAgOy8vIHBvaW50ZXIgdG8gY3VycmVudCBwb3NpdGlvbiBpbiByZWZlcmVuY2UgaW1hZ2UNCi1tYiAgICAgIFJOIDEgICAgOy8vIHBvaW50ZXIgdG8gY3VycmVudCBwb3NpdGlvbiBpbiBpbnRlcnBvbGF0ZWQgbWINCi1jb3VudCAgIFJOIDIgICAgOy8vIGJpdC1wYWNrZWQgd2lkdGggYW5kIGNvdW50IHZhbHVlcw0KLQ0KLXhfMl8wICAgUk4gNA0KLXhfM18xICAgUk4gNQ0KLXhfNl80ICAgUk4gNg0KLXhfN181ICAgUk4gNw0KLQ0KLXRtcDEgICAgUk4gOA0KLXRtcDIgICAgUk4gOQ0KLXRtcDMgICAgUk4gMTANCi10bXA0ICAgIFJOIDExDQotDQotbXVsdF8yMF8wMSAgUk4gMTIgICA7Ly8gWzIwLCAgMV0NCi1tdWx0XzIwX201ICBSTiAxNCAgIDsvLyBbMjAsIC01XQ0KLQ0KLQ0KLSAgICAgICAgRVhQT1JUICBoMjY0YnNkSW50ZXJwb2xhdGVNaWRIb3JQYXJ0DQotDQotOy8vIEhvcml6b250YWwgZmlsdGVyIGFwcHJvYWNoDQotOy8vDQotOy8vIEJhc2ljIGlkZWEgaW4gaG9yaXpvbnRhbCBmaWx0ZXJpbmcgaXMgdG8gYWRqdXN0IGNvZWZmaWNpZW50cw0KLTsvLyBsaWtlIGJlbG93LiBDYWxjdWxhdGlvbiBpcyBkb25lIHdpdGggMTYtYml0IG1hdGhzLg0KLTsvLw0KLTsvLyBSZWcgICAgIHhfMl8wICAgICB4XzNfMSAgICAgeF82XzQgICAgIHhfN181ICAgICB4XzJfMA0KLTsvLyAgICAgICBbICAyICAwIF0gWyAgMyAgMSBdIFsgIDYgIDQgXSBbICA3ICA1IF0gWyAxMCAgOCBdIC4uLg0KLTsvLyB5XzAgPSAgIDIwICAxICAgICAyMCAtNSAgICAgICAgLTUgICAgICAgICAxDQotOy8vIHlfMSA9ICAgLTUgICAgICAgIDIwICAxICAgICAgMSAyMCAgICAgICAgLTUNCi07Ly8geV8yID0gICAgMSAgICAgICAgLTUgICAgICAgIC01IDIwICAgICAgMSAyMA0KLTsvLyB5XzMgPSAgICAgICAgICAgICAgMSAgICAgICAgMjAgLTUgICAgIC01IDIwICAgICAgICAgMQ0KLQ0KLQ0KLWgyNjRic2RJbnRlcnBvbGF0ZU1pZEhvclBhcnQNCi0gICAgU1RNRkQgICBzcCEsIHtyNC1yMTEsIGxyfQ0KLQ0KLSAgICA7Ly8gcGFjayB2YWx1ZXMgdG8gY291bnQgcmVnaXN0ZXINCi0gICAgOy8vIFszMToyOF0gbG9vcF94IChwYXJ0V2lkdGgtMSkNCi0gICAgOy8vIFsyNzoyNF0gbG9vcF95IChwYXJ0SGVpZ2h0LTEpDQotICAgIDsvLyBbMjM6MjBdIHBhcnRXaWR0aC0xDQotICAgIDsvLyBbMTk6MTZdIHBhcnRIZWlnaHQtMQ0KLSAgICA7Ly8gWzE1OjAwXSB3aWR0aA0KLQ0KLQ0KLSAgICBMRFIgICAgIG11bHRfMjBfMDEsID0gMHgwMDE0MDAwMQ0KLSAgICBMRFIgICAgIG11bHRfMjBfbTUsID0gMHgwMDE0RkZGQg0KLSAgICBBTkQgICAgIHRtcDMsIGNvdW50LCAjMHgwMDBGMDAwMCAgICA7Ly8gcGFydFdpZHRoLTENCi1sb29wX3kNCi0gICAgTERSICAgICB4XzNfMSwgW3JlZiwgIy04XQ0KLSAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMywgTFNMICMxMg0KLSAgICBMRFIgICAgIHhfN181LCBbcmVmLCAjLTRdDQotICAgIFVYVEIxNiAgeF8yXzAsIHhfM18xDQotICAgIFVYVEIxNiAgeF8zXzEsIHhfM18xLCBST1IgIzgNCi0gICAgVVhUQjE2ICB4XzZfNCwgeF83XzUNCi0NCi1sb29wX3gNCi0gICAgVVhUQjE2ICB4XzdfNSwgeF83XzUsIFJPUiAjOA0KLQ0KLSAgICBTTVVBRCAgIHRtcDEsIHhfMl8wLCBtdWx0XzIwXzAxDQotICAgIFNNVUxUQiAgdG1wMiwgeF8yXzAsIG11bHRfMjBfbTUNCi0gICAgU01VTFRCICB0bXAzLCB4XzJfMCwgbXVsdF8yMF8wMQ0KLSAgICBTTVVMVEIgIHRtcDQsIHhfM18xLCBtdWx0XzIwXzAxDQotDQotICAgIFNNTEFEICAgdG1wMSwgeF8zXzEsIG11bHRfMjBfbTUsIHRtcDENCi0gICAgU01MQUQgICB0bXAyLCB4XzNfMSwgbXVsdF8yMF8wMSwgdG1wMg0KLSAgICBTTUxBVEIgIHRtcDMsIHhfM18xLCBtdWx0XzIwX201LCB0bXAzDQotICAgIExEUiAgICAgeF8zXzEsIFtyZWZdLCAjNA0KLSAgICBTTUxBRCAgIHRtcDQsIHhfNl80LCBtdWx0XzIwX201LCB0bXA0DQotDQotICAgIFNNTEFCQiAgdG1wMSwgeF82XzQsIG11bHRfMjBfbTUsIHRtcDENCi0gICAgU01MQURYICB0bXAyLCB4XzZfNCwgbXVsdF8yMF8wMSwgdG1wMg0KLSAgICBTTUxBRFggIHRtcDMsIHhfNl80LCBtdWx0XzIwX201LCB0bXAzDQotICAgIFNNTEFEWCAgdG1wNCwgeF83XzUsIG11bHRfMjBfbTUsIHRtcDQNCi0NCi0gICAgU01MQUJCICB0bXAxLCB4XzdfNSwgbXVsdF8yMF8wMSwgdG1wMQ0KLSAgICBTTUxBQkIgIHRtcDIsIHhfN181LCBtdWx0XzIwX201LCB0bXAyDQotICAgIFVYVEIxNiAgeF8yXzAsIHhfM18xDQotICAgIFNNTEFEWCAgdG1wMywgeF83XzUsIG11bHRfMjBfMDEsIHRtcDMNCi0gICAgU01MQUJCICB0bXA0LCB4XzJfMCwgbXVsdF8yMF8wMSwgdG1wNA0KLQ0KLSAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzQ8PDI4DQotICAgIFNUUiAgICAgdG1wMSwgW21iXSwgIzQNCi0gICAgU1RSICAgICB0bXAyLCBbbWJdLCAjNA0KLSAgICBTVFIgICAgIHRtcDMsIFttYl0sICM0DQotICAgIFNUUiAgICAgdG1wNCwgW21iXSwgIzQNCi0gICAgQkNDICAgICBuZXh0X3kNCi0NCi0gICAgVVhUQjE2ICB4XzNfMSwgeF8zXzEsIFJPUiAjOA0KLQ0KLSAgICBTTVVBRCAgIHRtcDEsIHhfNl80LCBtdWx0XzIwXzAxDQotICAgIFNNVUxUQiAgdG1wMiwgeF82XzQsIG11bHRfMjBfbTUNCi0gICAgU01VTFRCICB0bXAzLCB4XzZfNCwgbXVsdF8yMF8wMQ0KLSAgICBTTVVMVEIgIHRtcDQsIHhfN181LCBtdWx0XzIwXzAxDQotDQotICAgIFNNTEFEICAgdG1wMSwgeF83XzUsIG11bHRfMjBfbTUsIHRtcDENCi0gICAgU01MQUQgICB0bXAyLCB4XzdfNSwgbXVsdF8yMF8wMSwgdG1wMg0KLSAgICBTTUxBVEIgIHRtcDMsIHhfN181LCBtdWx0XzIwX201LCB0bXAzDQotICAgIExEUiAgICAgeF83XzUsIFtyZWZdLCAjNA0KLSAgICBTTUxBRCAgIHRtcDQsIHhfMl8wLCBtdWx0XzIwX201LCB0bXA0DQotDQotICAgIFNNTEFCQiAgdG1wMSwgeF8yXzAsIG11bHRfMjBfbTUsIHRtcDENCi0gICAgU01MQURYICB0bXAyLCB4XzJfMCwgbXVsdF8yMF8wMSwgdG1wMg0KLSAgICBTTUxBRFggIHRtcDMsIHhfMl8wLCBtdWx0XzIwX201LCB0bXAzDQotICAgIFNNTEFEWCAgdG1wNCwgeF8zXzEsIG11bHRfMjBfbTUsIHRtcDQNCi0NCi0gICAgU01MQUJCICB0bXAxLCB4XzNfMSwgbXVsdF8yMF8wMSwgdG1wMQ0KLSAgICBTTUxBQkIgIHRtcDIsIHhfM18xLCBtdWx0XzIwX201LCB0bXAyDQotICAgIFVYVEIxNiAgeF82XzQsIHhfN181DQotICAgIFNNTEFEWCAgdG1wMywgeF8zXzEsIG11bHRfMjBfMDEsIHRtcDMNCi0gICAgU01MQUJCICB0bXA0LCB4XzZfNCwgbXVsdF8yMF8wMSwgdG1wNA0KLQ0KLSAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzQ8PDI4DQotICAgIFNUUiAgICAgdG1wMSwgW21iXSwgIzQNCi0gICAgU1RSICAgICB0bXAyLCBbbWJdLCAjNA0KLSAgICBTVFIgICAgIHRtcDMsIFttYl0sICM0DQotICAgIFNUUiAgICAgdG1wNCwgW21iXSwgIzQNCi0gICAgQkNTICAgICBsb29wX3gNCi0NCi1uZXh0X3kNCi0gICAgQU5EICAgICB0bXAzLCBjb3VudCwgIzB4MDAwRjAwMDAgICAgOy8vIHBhcnRXaWR0aC0xDQotICAgIFNNTEFCQiAgcmVmLCBjb3VudCwgbXVsdF8yMF8wMSwgcmVmICAgOy8vICt3aWR0aA0KLSAgICBTQkMgICAgIHJlZiwgcmVmLCB0bXAzLCBMU1IgIzE2ICAgOy8vIC0ocGFydFdpZHRoLTEpLTENCi0gICAgQUREUyAgICBjb3VudCwgY291bnQsICMoMTw8MjgpLSgxPDwyMCkNCi0gICAgQkdFICAgICBsb29wX3kNCi0NCi0gICAgTERNRkQgICBzcCEsIHtyNC1yMTEsIHBjfQ0KLQ0KLSAgICBFTkQNCi0NCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX3Zlcl9oYWxmLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX3Zlcl9oYWxmLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NGZjNmYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV92ZXJfaGFsZi5zCisrKyAvZGV2L251bGwKQEAgLTEsMzQ3ICswLDAgQEAKLTsgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLTsKLTsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ci07ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ci07IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07LS0KLTstLSBBYnN0cmFjdCA6IEFSTXY2IG9wdGltaXplZCB2ZXJzaW9uIG9mIGgyNjRic2RJbnRlcnBvbGF0ZVZlckhhbGYgZnVuY3Rpb24KLTstLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0gICAgSUYgOkRFRjogSDI2NERFQ19XSU5BU00KLSAgICAgICAgOy8vIFdlIGRvbnQgdXNlIFJFUVVJUkU4IGFuZCBQUkVTRVJWRTggZm9yIHdpbmFzbQotICAgIEVMU0UKLSAgICAgICAgUkVRVUlSRTgKLSAgICAgICAgUFJFU0VSVkU4Ci0gICAgRU5ESUYKLQotICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERQotCi07Ly8gaDI2NGJzZEludGVycG9sYXRlVmVySGFsZiByZWdpc3RlciBhbGxvY2F0aW9uCi0KLXJlZiAgICAgUk4gMAotCi1tYiAgICAgIFJOIDEKLWJ1ZmYgICAgUk4gMQotCi1jb3VudCAgIFJOIDIKLXgwICAgICAgUk4gMgotCi1yZXMgICAgIFJOIDMKLXkwICAgICAgUk4gMwotCi10bXAxICAgIFJOIDQKLQotdG1wMiAgICBSTiA1Ci1oZWlnaHQgIFJOIDUKLQotdG1wMyAgICBSTiA2Ci1wYXJ0VyAgIFJOIDYKLQotdG1wNCAgICBSTiA3Ci1wYXJ0SCAgIFJOIDcKLQotdG1wNSAgICBSTiA4Ci10bXA2ICAgIFJOIDkKLQotdG1wYSAgICBSTiAxMAotdG1wYiAgICBSTiAxMQotd2lkdGggICBSTiAxMgotCi1wbHVzMTYgIFJOIDE0Ci0KLQotOy8vIGZ1bmN0aW9uIGV4cG9ydHMgYW5kIGltcG9ydHMKLQotICAgIElNUE9SVCAgaDI2NGJzZEZpbGxCbG9jawotCi0gICAgRVhQT1JUICBoMjY0YnNkSW50ZXJwb2xhdGVWZXJIYWxmCi0KLTsvLyBBcHByb2FjaCB0byB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uCi07Ly8KLTsvLyBJbnRlcnBvbGF0aW9uIGlzIGRvbmUgYnkgdXNpbmcgMzItYml0IGxvYWRzIGFuZCBzdG9yZXMKLTsvLyBhbmQgYnkgdXNpbmcgMTYgYml0IGFyaXRobWV0aWMuIDR4NCBibG9jayBpcyBwcm9jZXNzZWQKLTsvLyBpbiBlYWNoIHJvdW5kLgotOy8vCi07Ly8gfGFfMTF8YV8xMXxhXzExfGFfMTF8Li4ufGFfMW58YV8xbnxhXzFufGFfMW58Ci07Ly8gfGJfMTF8Yl8xMXxiXzExfGJfMTF8Li4ufGJfMW58Yl8xbnxiXzFufGJfMW58Ci07Ly8gfGNfMTF8Y18xMXxjXzExfGNfMTF8Li4ufGNfMW58Y18xbnxjXzFufGNfMW58Ci07Ly8gfGRfMTF8ZF8xMXxkXzExfGRfMTF8Li4ufGRfMW58ZF8xbnxkXzFufGRfMW58Ci07Ly8gICAgICAgICAgIC4uCi07Ly8gICAgICAgICAgIC4uCi07Ly8gfGFfbTF8YV9tMXxhX20xfGFfbTF8Li4uCi07Ly8gfGJfbTF8Yl9tMXxiX20xfGJfbTF8Li4uCi07Ly8gfGNfbTF8Y19tMXxjX20xfGNfbTF8Li4uCi07Ly8gfGRfbTF8ZF9tMXxkX20xfGRfbTF8Li4uCi0KLWgyNjRic2RJbnRlcnBvbGF0ZVZlckhhbGYKLSAgICBTVE1GRCAgIHNwISwge3IwLXIxMSwgbHJ9Ci0gICAgU1VCICAgICBzcCwgc3AsICMweDFlNAotCi0gICAgQ01QICAgICB4MCwgIzAKLSAgICBCTFQgICAgIGRvX2ZpbGwgICAgICAgICAgICAgICAgIDsvLyAoeDAgPCAwKQotICAgIExEUiAgICAgcGFydFcsIFtzcCwjMHgyMjBdICAgICAgOy8vIHBhcnRXaWR0aAotICAgIEFERCAgICAgdG1wNSwgeDAsIHBhcnRXICAgICAgICAgOy8vICh4MCtwYXJ0V2lkdGgpCi0gICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKLSAgICBDTVAgICAgIHRtcDUsIHdpZHRoCi0gICAgQkhJICAgICBkb19maWxsICAgICAgICAgICAgICAgICA7Ly8gKHgwK3BhcnRXKT53aWR0aAotCi0gICAgQ01QICAgICB5MCwgIzAKLSAgICBCTFQgICAgIGRvX2ZpbGwgICAgICAgICAgICAgICAgIDsvLyAoeTAgPCAwKQotICAgIExEUiAgICAgcGFydEgsIFtzcCwjMHgyMjRdICAgICAgOy8vIHBhcnRIZWlnaHQKLSAgICBBREQgICAgIHRtcDYsIHkwLCBwYXJ0SCAgICAgICAgIDsvLyAoeTArcGFydEhlaWdodCkKLSAgICBBREQgICAgIHRtcDYsIHRtcDYsICM1ICAgICAgICAgIDsvLyAoeTArcGFydEgrNSkKLSAgICBMRFIgICAgIGhlaWdodCwgW3NwLCMweDIxY10gICAgIDsvLyBoZWlnaHQKLSAgICBDTVAgICAgIHRtcDYsIGhlaWdodAotICAgIEJMUyAgICAgc2tpcF9maWxsICAgICAgICAgICAgICAgOy8vIG5vIG92ZXJmaWxsIG5lZWRlZAotCi0KLWRvX2ZpbGwKLSAgICBMRFIgICAgIHBhcnRILCBbc3AsIzB4MjI0XSAgICAgIDsvLyBwYXJ0SGVpZ2h0Ci0gICAgQUREICAgICB0bXA1LCBwYXJ0SCwgIzUgICAgICAgICA7Ly8gcjIgPSBwYXJ0SCArIDU7Ci0gICAgTERSICAgICBoZWlnaHQsIFtzcCwjMHgyMWNdICAgICA7Ly8gaGVpZ2h0Ci0gICAgTERSICAgICBwYXJ0VywgW3NwLCMweDIyMF0gICAgICA7Ly8gcGFydFdpZHRoCi0gICAgU1RNSUIgICBzcCwge2hlaWdodCwgcGFydFd9ICAgICA7Ly8gc3ArNCA9IGhlaWdodCwgc3ArOCA9IHBhcnRXaWR0aAotICAgIFNUUiAgICAgdG1wNSwgW3NwLCMweGNdICAgICAgICAgOy8vIHNwK2MgcGFydEhlaWdodCs1Ci0gICAgU1RSICAgICBwYXJ0VywgW3NwLCMweDEwXSAgICAgICA7Ly8gc3ArMTAgPSBwYXJ0V2lkdGgKLSAgICBMRFIgICAgIHdpZHRoLCBbc3AsIzB4MjE4XSAgICAgIDsvLyB3aWR0aAotICAgIFNUUiAgICAgd2lkdGgsIFtzcCwjMF0gICAgICAgICAgOy8vIHNwKzAgPSB3aWR0aAotICAgIEFERCAgICAgYnVmZiwgc3AsICMweDI4ICAgICAgICAgOy8vIGJ1ZmYgPSBwMVsyMSoyMS80KzFdCi0gICAgQkwgICAgICBoMjY0YnNkRmlsbEJsb2NrCi0KLSAgICBNT1YgICAgIHgwLCAjMAotICAgIFNUUiAgICAgeDAsW3NwLCMweDFlY10gICAgICAgICAgOy8vIHgwID0gMAotICAgIFNUUiAgICAgeDAsW3NwLCMweDFmMF0gICAgICAgICAgOy8vIHkwID0gMAotICAgIEFERCAgICAgcmVmLHNwLCMweDI4ICAgICAgICAgICAgOy8vIHJlZiA9IHAxCi0gICAgU1RSICAgICBwYXJ0VywgW3NwLCMweDIxOF0KLQotCi1za2lwX2ZpbGwKLSAgICBMRFIgICAgIHgwICxbc3AsIzB4MWVjXSAgICAgICAgIDsvLyB4MAotICAgIExEUiAgICAgeTAgLFtzcCwjMHgxZjBdICAgICAgICAgOy8vIHkwCi0gICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKLSAgICBNTEEgICAgIHRtcDYsIHdpZHRoLCB5MCwgeDAgICAgIDsvLyB5MCp3aWR0aCt4MAotICAgIEFERCAgICAgcmVmLCByZWYsIHRtcDYgICAgICAgICAgOy8vIHJlZiArPSB5MCp3aWR0aCt4MAotICAgIExEUiAgICAgbWIsIFtzcCwgIzB4MWU4XSAgICAgICAgOy8vIG1iCi0KLSAgICBBREQgICAgIGNvdW50LCBwYXJ0VywgcGFydEgsIExTTCAjMTYgICAgOy8vIHxwYXJ0SHxwYXJ0V3wKLSAgICBMRFIgICAgIHRtcDUsID0gMHgwMDAxMDAwMQotICAgIFNTVUIxNiAgY291bnQsIGNvdW50LCB0bXA1OyAgICAgOy8vIHxwYXJ0SC0xfHBhcnRXLTF8Ci0gICAgTERSICAgICBwbHVzMTYsID0gMHgwMDEwMDAxMAotCi0gICAgQU5EICAgICB0bXAxLCBjb3VudCwgIzB4MDAwMDAwRkYgOy8vIHBhcnRXaWR0aAotCi0KLWxvb3BfeQotICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAxLCBMU0wgIzI0ICA7Ly8gcGFydFdpZHRoLTEgdG8gdG9wIGJ5dGUKLQotbG9vcF94Ci0gICAgTERSICAgICB0bXAxLCBbcmVmXSwgd2lkdGggICAgIDsvLyB8YTR8YTN8YTJ8YTF8Ci0gICAgTERSICAgICB0bXAyLCBbcmVmXSwgd2lkdGggICAgIDsvLyB8YzR8YzN8YzJ8YzF8Ci0gICAgTERSICAgICB0bXAzLCBbcmVmXSwgd2lkdGggICAgIDsvLyB8ZzR8ZzN8ZzJ8ZzF8Ci0gICAgTERSICAgICB0bXA0LCBbcmVmXSwgd2lkdGggICAgIDsvLyB8bTR8bTN8bTJ8bTF8Ci0gICAgTERSICAgICB0bXA1LCBbcmVmXSwgd2lkdGggICAgIDsvLyB8cjR8cjN8cjJ8cjF8Ci0gICAgTERSICAgICB0bXA2LCBbcmVmXSwgd2lkdGggICAgIDsvLyB8dDR8dDN8dDJ8dDF8Ci0KLSAgICA7Ly8gZmlyc3QgZm91ciBwaXhlbHMKLSAgICBVWFRCMTYgIHRtcGEsIHRtcDMgICAgICAgICAgICAgICAgICA7Ly8gfGczfGcxfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNCAgICAgICAgICAgIDsvLyB8ZzMrbTN8ZzErbTF8Ci0gICAgVVhUQjE2ICB0bXBiLCB0bXAyICAgICAgICAgICAgICAgICAgOy8vIHxjM3xjMXwKLSAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCi0KLSAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDUgICAgICAgICAgICA7Ly8gfGMzK3IzfGMxK3IxfAotICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQQotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNiAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0ErVAotCi0gICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQotICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQotCi0gICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCi0gICAgTERSICAgICByZXMsID0gMHgwMEZGMDBGRgotICAgIFVYVEIxNiAgdG1wYSwgdG1wMywgUk9SICM4ICAgICAgICAgIDsvLyB8ZzR8ZzJ8Ci0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA0LCBST1IgIzggICAgOy8vIHxnNCttNHxnMittMnwKLSAgICBBTkQgICAgIHJlcywgcmVzLCB0bXBiLCBMU1IgIzUgICAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCi0KLSAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCi0gICAgVVhUQjE2ICB0bXBiLCB0bXAyLCBST1IgIzggICAgICAgICAgOy8vIHxjNHxjMnwKLSAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQotICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wNSwgUk9SICM4ICAgIDsvLyB8YzQrcjR8YzIrcjJ8Ci0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxLCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQQotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNiwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0ErVAotCi0gICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQotICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQotCi0gICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCi0gICAgTERSICAgICB0bXAxLCBbcmVmXSwgd2lkdGgKLSAgICBMRFIgICAgIHRtcGEsID0gMHhGRjAwRkYwMAotCi0gICAgQU5EICAgICB0bXBhLCB0bXBhLCB0bXBiLCBMU0wgIzMgICAgOy8vIG1hc2sgYW5kIGRpdmVkZSBieSAzMgotICAgIE9SUiAgICAgcmVzLCByZXMsIHRtcGEKLSAgICBTVFIgICAgIHJlcywgW21iXSwgIzE2ICAgICAgICAgICAgICA7Ly8gbmV4dCByb3cgKG1iKQotCi0gICAgOy8vIHRtcDIgPSB8YTR8YTN8YTJ8YTF8Ci0gICAgOy8vIHRtcDMgPSB8YzR8YzN8YzJ8YzF8Ci0gICAgOy8vIHRtcDQgPSB8ZzR8ZzN8ZzJ8ZzF8Ci0gICAgOy8vIHRtcDUgPSB8bTR8bTN8bTJ8bTF8Ci0gICAgOy8vIHRtcDYgPSB8cjR8cjN8cjJ8cjF8Ci0gICAgOy8vIHRtcDEgPSB8dDR8dDN8dDJ8dDF8Ci0KLSAgICA7Ly8gc2Vjb25kIGZvdXIgcGl4ZWxzCi0gICAgVVhUQjE2ICB0bXBhLCB0bXA0ICAgICAgICAgICAgICAgICAgOy8vIHxnM3xnMXwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDUgICAgICAgICAgICA7Ly8gfGczK20zfGcxK20xfAotICAgIFVYVEIxNiAgdG1wYiwgdG1wMyAgICAgICAgICAgICAgICAgIDsvLyB8YzN8YzF8Ci0gICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQotICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wNiAgICAgICAgICAgIDsvLyB8YzMrcjN8YzErcjF8Ci0gICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQStUCi0KLSAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCi0gICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCi0KLSAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKLSAgICBMRFIgICAgIHJlcywgPSAweDAwRkYwMEZGCi0gICAgVVhUQjE2ICB0bXBhLCB0bXA0LCBST1IgIzggICAgICAgICAgOy8vIHxnNHxnMnwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDUsIFJPUiAjOCAgICA7Ly8gfGc0K200fGcyK20yfAotICAgIEFORCAgICAgcmVzLCByZXMsIHRtcGIsIExTUiAjNSAgICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKLQotICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKLSAgICBVWFRCMTYgIHRtcGIsIHRtcDMsIFJPUiAjOCAgICAgICAgICA7Ly8gfGM0fGMyfAotICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCi0gICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXA2LCBST1IgIzggICAgOy8vIHxjNCtyNHxjMityMnwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDIsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxLCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQStUCi0KLSAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCi0gICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCi0KLSAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKLSAgICBMRFIgICAgIHRtcDIsIFtyZWZdLCB3aWR0aAotICAgIExEUiAgICAgdG1wYSwgPSAweEZGMDBGRjAwCi0KLSAgICBBTkQgICAgIHRtcGEsIHRtcGEsIHRtcGIsIExTTCAjMyAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCi0gICAgT1JSICAgICByZXMsIHJlcywgdG1wYQotICAgIFNUUiAgICAgcmVzLCBbbWJdLCAjMTYgICAgICAgICAgICAgIDsvLyBuZXh0IHJvdwotCi0gICAgOy8vIHRtcDMgPSB8YTR8YTN8YTJ8YTF8Ci0gICAgOy8vIHRtcDQgPSB8YzR8YzN8YzJ8YzF8Ci0gICAgOy8vIHRtcDUgPSB8ZzR8ZzN8ZzJ8ZzF8Ci0gICAgOy8vIHRtcDYgPSB8bTR8bTN8bTJ8bTF8Ci0gICAgOy8vIHRtcDEgPSB8cjR8cjN8cjJ8cjF8Ci0gICAgOy8vIHRtcDIgPSB8dDR8dDN8dDJ8dDF8Ci0KLSAgICA7Ly8gdGhpcmQgZm91ciBwaXhlbHMKLSAgICBVWFRCMTYgIHRtcGEsIHRtcDUgICAgICAgICAgICAgICAgICA7Ly8gfGczfGcxfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNiAgICAgICAgICAgIDsvLyB8ZzMrbTN8ZzErbTF8Ci0gICAgVVhUQjE2ICB0bXBiLCB0bXA0ICAgICAgICAgICAgICAgICAgOy8vIHxjM3xjMXwKLSAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCi0gICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXAxICAgICAgICAgICAgOy8vIHxjMytyM3xjMStyMXwKLSAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMyAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0EKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBK1QKLQotICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKLSAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKLQotICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQotICAgIExEUiAgICAgcmVzLCA9IDB4MDBGRjAwRkYKLSAgICBVWFRCMTYgIHRtcGEsIHRtcDUsIFJPUiAjOCAgICAgICAgICA7Ly8gfGc0fGcyfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNiwgUk9SICM4ICAgIDsvLyB8ZzQrbTR8ZzIrbTJ8Ci0gICAgQU5EICAgICByZXMsIHJlcywgdG1wYiwgTFNSICM1ICAgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgotCi0gICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQotICAgIFVYVEIxNiAgdG1wYiwgdG1wNCwgUk9SICM4ICAgICAgICAgIDsvLyB8YzR8YzJ8Ci0gICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKLSAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDEsIFJPUiAjOCAgICA7Ly8gfGM0K3I0fGMyK3IyfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMywgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0EKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDIsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBK1QKLQotCi0gICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQotICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQotCi0gICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCi0gICAgTERSICAgICB0bXAzLCBbcmVmXQotICAgIExEUiAgICAgdG1wYSwgPSAweEZGMDBGRjAwCi0KLSAgICA7Ly8gZGVjcmVtZW50IGxvb3BfeCBjb3VudGVyCi0gICAgU1VCUyAgICBjb3VudCwgY291bnQsICM0PDwyNCAgICAgICAgOy8vIChwYXJ0V2lkdGgtMSkgLT0gNDsKLQotICAgIEFORCAgICAgdG1wYSwgdG1wYSwgdG1wYiwgTFNMICMzICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKLSAgICBPUlIgICAgIHJlcywgcmVzLCB0bXBhCi0gICAgU1RSICAgICByZXMsIFttYl0sICMxNiAgICAgICAgICAgICAgOy8vIG5leHQgcm93Ci0KLSAgICA7Ly8gdG1wNCA9IHxhNHxhM3xhMnxhMXwKLSAgICA7Ly8gdG1wNSA9IHxjNHxjM3xjMnxjMXwKLSAgICA7Ly8gdG1wNiA9IHxnNHxnM3xnMnxnMXwKLSAgICA7Ly8gdG1wMSA9IHxtNHxtM3xtMnxtMXwKLSAgICA7Ly8gdG1wMiA9IHxyNHxyM3xyMnxyMXwKLSAgICA7Ly8gdG1wMyA9IHx0NHx0M3x0Mnx0MXwKLQotICAgIDsvLyBmb3VydGggZm91ciBwaXhlbHMKLSAgICBVWFRCMTYgIHRtcGEsIHRtcDYgICAgICAgICAgICAgICAgICA7Ly8gfGczfGcxfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSAgICAgICAgICAgIDsvLyB8ZzMrbTN8ZzErbTF8Ci0gICAgVVhUQjE2ICB0bXBiLCB0bXA1ICAgICAgICAgICAgICAgICAgOy8vIHxjM3xjMXwKLSAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCi0gICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXAyICAgICAgICAgICAgOy8vIHxjMytyM3xjMStyMXwKLSAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNCAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0EKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDMgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBK1QKLQotICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKLSAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKLQotICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQotICAgIExEUiAgICAgcmVzLCA9IDB4MDBGRjAwRkYKLSAgICBVWFRCMTYgIHRtcGEsIHRtcDYsIFJPUiAjOCAgICAgICAgICA7Ly8gfGc0fGcyfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSwgUk9SICM4ICAgIDsvLyB8ZzQrbTR8ZzIrbTJ8Ci0gICAgQU5EICAgICByZXMsIHJlcywgdG1wYiwgTFNSICM1ICAgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgotCi0gICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQotICAgIFVYVEIxNiAgdG1wYiwgdG1wNSwgUk9SICM4ICAgICAgICAgIDsvLyB8YzR8YzJ8Ci0gICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKLSAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDIsIFJPUiAjOCAgICA7Ly8gfGM0K3I0fGMyK3IyfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNCwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0EKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDMsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBK1QKLQotICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKLSAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKLQotICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQotICAgIExEUiAgICAgdG1wNCwgPSAweEZGMDBGRjAwCi0KLSAgICA7Ly8gY2FsY3VsYXRlICJyZWYiIGFkZHJlc3MgZm9yIG5leHQgcm91bmQKLSAgICBTVUIgICAgIHJlZiwgcmVmLCB3aWR0aCwgTFNMICMzICAgICA7Ly8gcmVmIC09IDgqd2lkdGg7Ci0gICAgQUREICAgICByZWYsIHJlZiwgIzQ7ICAgICAgICAgICAgICAgOy8vIG5leHQgY29sdW1uICg0IHBpeGVscykKLSAgICBBTkQgICAgIHRtcGEsIHRtcDQsIHRtcGIsIExTTCAjMyAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCi0gICAgT1JSICAgICByZXMsIHJlcywgdG1wYQotICAgIFNUUiAgICAgcmVzLCBbbWJdLCAjLTQ0Ci0KLSAgICBCQ1MgICAgIGxvb3BfeAotCi0gICAgQUREUyAgICBjb3VudCwgY291bnQsICMyNTI8PDE2ICAgICAgOy8vIChwYXJ0SGVpZ2h0LTEpIC09IDQ7Ci0gICAgQUREICAgICByZWYsIHJlZiwgd2lkdGgsIExTTCAjMiAgICAgOy8vIHJlZiArPSA0KndpZHRoCi0gICAgQU5EICAgICB0bXAxLCBjb3VudCwgIzB4MDAwMDAwRkYgICAgOy8vIHBhcnRXaWR0aC0xCi0gICAgQUREICAgICB0bXAyLCB0bXAxLCAjMSAgICAgICAgICAgICAgOy8vIHBhcnRXaWR0aAotICAgIFNVQiAgICAgcmVmLCByZWYsIHRtcDIgICAgICAgICAgICAgIDsvLyByZWYgLT0gcGFydFdpZHRoCi0gICAgQUREICAgICBtYiwgbWIsICM2NDsKLSAgICBTVUIgICAgIG1iLCBtYiwgdG1wMjsgICAgICAgICAgICAgICA7Ly8gbWIgLT0gcGFydFdpZHRoCi0gICAgQkdFICAgICBsb29wX3kKLQotICAgIEFERCAgICAgc3Asc3AsIzB4MWY0Ci0gICAgTERNRkQgICBzcCEsIHtyNC1yMTEsIHBjfQotCi0gICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX3Zlcl9xdWFydGVyLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX3Zlcl9xdWFydGVyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNjZjODUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV92ZXJfcXVhcnRlci5zCisrKyAvZGV2L251bGwKQEAgLTEsMzc0ICswLDAgQEAKLTsgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLTsKLTsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ci07ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ci07IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07LS0KLTstLSBBYnN0cmFjdCA6IEFSTXY2IG9wdGltaXplZCB2ZXJzaW9uIG9mIGgyNjRic2RJbnRlcnBvbGF0ZVZlclF1YXJ0ZXIgZnVuY3Rpb24KLTstLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIElGIDpERUY6IEgyNjRERUNfV0lOQVNNCi0gICAgICAgIDsvLyBXZSBkb250IHVzZSBSRVFVSVJFOCBhbmQgUFJFU0VSVkU4IGZvciB3aW5hc20KLSAgICBFTFNFCi0gICAgICAgIFJFUVVJUkU4Ci0gICAgICAgIFBSRVNFUlZFOAotICAgIEVORElGCi0KLSAgICBBUkVBICAgIHwudGV4dHwsIENPREUKLQotOy8vIGgyNjRic2RJbnRlcnBvbGF0ZVZlclF1YXJ0ZXIgcmVnaXN0ZXIgYWxsb2NhdGlvbgotCi1yZWYgICAgIFJOIDAKLQotbWIgICAgICBSTiAxCi1idWZmICAgIFJOIDEKLQotY291bnQgICBSTiAyCi14MCAgICAgIFJOIDIKLQotcmVzICAgICBSTiAzCi15MCAgICAgIFJOIDMKLQotdG1wMSAgICBSTiA0Ci0KLXRtcDIgICAgUk4gNQotaGVpZ2h0ICBSTiA1Ci0KLXRtcDMgICAgUk4gNgotcGFydFcgICBSTiA2Ci0KLXRtcDQgICAgUk4gNwotcGFydEggICBSTiA3Ci0KLXRtcDUgICAgUk4gOAotdG1wNiAgICBSTiA5Ci0KLXRtcGEgICAgUk4gMTAKLXRtcGIgICAgUk4gMTEKLXdpZHRoICAgUk4gMTIKLQotcGx1czE2ICBSTiAxNAotCi0KLTsvLyBmdW5jdGlvbiBleHBvcnRzIGFuZCBpbXBvcnRzCi0KLSAgICBJTVBPUlQgIGgyNjRic2RGaWxsQmxvY2sKLQotICAgIEVYUE9SVCAgaDI2NGJzZEludGVycG9sYXRlVmVyUXVhcnRlcgotCi07Ly8gQXBwcm9hY2ggdG8gdmVydGljYWwgaW50ZXJwb2xhdGlvbgotOy8vCi07Ly8gSW50ZXJwb2xhdGlvbiBpcyBkb25lIGJ5IHVzaW5nIDMyLWJpdCBsb2FkcyBhbmQgc3RvcmVzCi07Ly8gYW5kIGJ5IHVzaW5nIDE2IGJpdCBhcml0aG1ldGljLiA0eDQgYmxvY2sgaXMgcHJvY2Vzc2VkCi07Ly8gaW4gZWFjaCByb3VuZC4KLTsvLwotOy8vIHxhXzExfGFfMTF8YV8xMXxhXzExfC4uLnxhXzFufGFfMW58YV8xbnxhXzFufAotOy8vIHxiXzExfGJfMTF8Yl8xMXxiXzExfC4uLnxiXzFufGJfMW58Yl8xbnxiXzFufAotOy8vIHxjXzExfGNfMTF8Y18xMXxjXzExfC4uLnxjXzFufGNfMW58Y18xbnxjXzFufAotOy8vIHxkXzExfGRfMTF8ZF8xMXxkXzExfC4uLnxkXzFufGRfMW58ZF8xbnxkXzFufAotOy8vICAgICAgICAgICAuLgotOy8vICAgICAgICAgICAuLgotOy8vIHxhX20xfGFfbTF8YV9tMXxhX20xfC4uLgotOy8vIHxiX20xfGJfbTF8Yl9tMXxiX20xfC4uLgotOy8vIHxjX20xfGNfbTF8Y19tMXxjX20xfC4uLgotOy8vIHxkX20xfGRfbTF8ZF9tMXxkX20xfC4uLgotCi1oMjY0YnNkSW50ZXJwb2xhdGVWZXJRdWFydGVyCi0gICAgU1RNRkQgICBzcCEsIHtyMC1yMTEsIGxyfQotICAgIFNVQiAgICAgc3AsIHNwLCAjMHgxZTQKLQotICAgIENNUCAgICAgeDAsICMwCi0gICAgQkxUICAgICBkb19maWxsICAgICAgICAgICAgICAgICA7Ly8gKHgwIDwgMCkKLSAgICBMRFIgICAgIHBhcnRXLCBbc3AsIzB4MjIwXSAgICAgIDsvLyBwYXJ0V2lkdGgKLSAgICBBREQgICAgIHRtcDUsIHgwLCBwYXJ0VyAgICAgICAgIDsvLyAoeDArcGFydFdpZHRoKQotICAgIExEUiAgICAgd2lkdGgsIFtzcCwjMHgyMThdICAgICAgOy8vIHdpZHRoCi0gICAgQ01QICAgICB0bXA1LCB3aWR0aAotICAgIEJISSAgICAgZG9fZmlsbCAgICAgICAgICAgICAgICAgOy8vICh4MCtwYXJ0Vyk+d2lkdGgKLQotICAgIENNUCAgICAgeTAsICMwCi0gICAgQkxUICAgICBkb19maWxsICAgICAgICAgICAgICAgICA7Ly8gKHkwIDwgMCkKLSAgICBMRFIgICAgIHBhcnRILCBbc3AsIzB4MjI0XSAgICAgIDsvLyBwYXJ0SGVpZ2h0Ci0gICAgQUREICAgICB0bXA2LCB5MCwgcGFydEggICAgICAgICA7Ly8gKHkwK3BhcnRIZWlnaHQpCi0gICAgQUREICAgICB0bXA2LCB0bXA2LCAjNSAgICAgICAgICA7Ly8gKHkwK3BhcnRIKzUpCi0gICAgTERSICAgICBoZWlnaHQsIFtzcCwjMHgyMWNdICAgICA7Ly8gaGVpZ2h0Ci0gICAgQ01QICAgICB0bXA2LCBoZWlnaHQKLSAgICBCTFMgICAgIHNraXBfZmlsbCAgICAgICAgICAgICAgIDsvLyBubyBvdmVyZmlsbCBuZWVkZWQKLQotCi1kb19maWxsCi0gICAgTERSICAgICBwYXJ0SCwgW3NwLCMweDIyNF0gICAgICA7Ly8gcGFydEhlaWdodAotICAgIEFERCAgICAgdG1wNSwgcGFydEgsICM1ICAgICAgICAgOy8vIHIyID0gcGFydEggKyA1OwotICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsIzB4MjFjXSAgICAgOy8vIGhlaWdodAotICAgIExEUiAgICAgcGFydFcsIFtzcCwjMHgyMjBdICAgICAgOy8vIHBhcnRXaWR0aAotICAgIFNUTUlCICAgc3AsIHtoZWlnaHQsIHBhcnRXfSAgICAgOy8vIHNwKzQgPSBoZWlnaHQsIHNwKzggPSBwYXJ0V2lkdGgKLSAgICBTVFIgICAgIHRtcDUsIFtzcCwjMHhjXSAgICAgICAgIDsvLyBzcCtjIHBhcnRIZWlnaHQrNQotICAgIFNUUiAgICAgcGFydFcsIFtzcCwjMHgxMF0gICAgICAgOy8vIHNwKzEwID0gcGFydFdpZHRoCi0gICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKLSAgICBTVFIgICAgIHdpZHRoLCBbc3AsIzBdICAgICAgICAgIDsvLyBzcCswID0gd2lkdGgKLSAgICBBREQgICAgIGJ1ZmYsIHNwLCAjMHgyOCAgICAgICAgIDsvLyBidWZmID0gcDFbMjEqMjEvNCsxXQotICAgIEJMICAgICAgaDI2NGJzZEZpbGxCbG9jawotCi0gICAgTU9WICAgICB4MCwgIzAKLSAgICBTVFIgICAgIHgwLFtzcCwjMHgxZWNdICAgICAgICAgIDsvLyB4MCA9IDAKLSAgICBTVFIgICAgIHgwLFtzcCwjMHgxZjBdICAgICAgICAgIDsvLyB5MCA9IDAKLSAgICBBREQgICAgIHJlZixzcCwjMHgyOCAgICAgICAgICAgIDsvLyByZWYgPSBwMQotICAgIFNUUiAgICAgcGFydFcsIFtzcCwjMHgyMThdCi0KLQotc2tpcF9maWxsCi0gICAgTERSICAgICB4MCAsW3NwLCMweDFlY10gICAgICAgICA7Ly8geDAKLSAgICBMRFIgICAgIHkwICxbc3AsIzB4MWYwXSAgICAgICAgIDsvLyB5MAotICAgIExEUiAgICAgd2lkdGgsIFtzcCwjMHgyMThdICAgICAgOy8vIHdpZHRoCi0gICAgTUxBICAgICB0bXA2LCB3aWR0aCwgeTAsIHgwICAgICA7Ly8geTAqd2lkdGgreDAKLSAgICBBREQgICAgIHJlZiwgcmVmLCB0bXA2ICAgICAgICAgIDsvLyByZWYgKz0geTAqd2lkdGgreDAKLSAgICBMRFIgICAgIG1iLCBbc3AsICMweDFlOF0gICAgICAgIDsvLyBtYgotCi0gICAgQUREICAgICBjb3VudCwgcGFydFcsIHBhcnRILCBMU0wgIzggICAgOy8vIHx4eHx4eHxwYXJ0SHxwYXJ0V3wKLSAgICBMRFIgICAgIHRtcDUsID0gMHgwMDAxMDEwMAotICAgIFJTQiAgICAgY291bnQsIHRtcDUsIGNvdW50LCBMU0wgIzggICAgICA7Ly8gfHh4fHBhcnRILTF8cGFydFctMXx4eHwKLSAgICBMRFIgICAgIHRtcDIsIFtzcCwgIzB4MjI4XSAgICAgIDsvLyB2ZXJPZmZzZXQKLSAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMiAgICAgIDsvLyB8eHh8cGFydEgtMXxwYXJ0Vy0xfHZlck9mZnNldHwKLSAgICBMRFIgICAgIHBsdXMxNiwgPSAweDAwMTAwMDEwCi0KLSAgICBBTkQgICAgIHRtcDEsIGNvdW50LCAjMHgwMDAwRkYwMCA7Ly8gcGFydFdpZHRoCi0KLQotbG9vcF95Ci0gICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDEsIExTTCAjMTYgIDsvLyBwYXJ0V2lkdGgtMSB0byB0b3AgYnl0ZQotCi1sb29wX3gKLSAgICBMRFIgICAgIHRtcDEsIFtyZWZdLCB3aWR0aCAgICAgOy8vIHxhNHxhM3xhMnxhMXwKLSAgICBMRFIgICAgIHRtcDIsIFtyZWZdLCB3aWR0aCAgICAgOy8vIHxjNHxjM3xjMnxjMXwKLSAgICBMRFIgICAgIHRtcDMsIFtyZWZdLCB3aWR0aCAgICAgOy8vIHxnNHxnM3xnMnxnMXwKLSAgICBMRFIgICAgIHRtcDQsIFtyZWZdLCB3aWR0aCAgICAgOy8vIHxtNHxtM3xtMnxtMXwKLSAgICBMRFIgICAgIHRtcDUsIFtyZWZdLCB3aWR0aCAgICAgOy8vIHxyNHxyM3xyMnxyMXwKLSAgICBMRFIgICAgIHRtcDYsIFtyZWZdLCB3aWR0aCAgICAgOy8vIHx0NHx0M3x0Mnx0MXwKLQotICAgIDsvLyBmaXJzdCBmb3VyIHBpeGVscyAKLSAgICBVWFRCMTYgIHRtcGEsIHRtcDMgICAgICAgICAgICAgICAgICA7Ly8gfGczfGcxfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNCAgICAgICAgICAgIDsvLyB8ZzMrbTN8ZzErbTF8Ci0gICAgVVhUQjE2ICB0bXBiLCB0bXAyICAgICAgICAgICAgICAgICAgOy8vIHxjM3xjMXwKLSAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCi0KLSAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDUgICAgICAgICAgICA7Ly8gfGMzK3IzfGMxK3IxfAotICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQQotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNiAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0ErVAotCi0gICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQotICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQotCi0gICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCi0gICAgTERSICAgICByZXMsID0gMHgwMEZGMDBGRgotICAgIFVYVEIxNiAgdG1wYSwgdG1wMywgUk9SICM4ICAgICAgICAgIDsvLyB8ZzR8ZzJ8Ci0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA0LCBST1IgIzggICAgOy8vIHxnNCttNHxnMittMnwKLSAgICBBTkQgICAgIHJlcywgcmVzLCB0bXBiLCBMU1IgIzUgICAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCi0KLSAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCi0gICAgVVhUQjE2ICB0bXBiLCB0bXAyLCBST1IgIzggICAgICAgICAgOy8vIHxjNHxjMnwKLSAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQotICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wNSwgUk9SICM4ICAgIDsvLyB8YzQrcjR8YzIrcjJ8Ci0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxLCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQQotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNiwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0ErVAotCi0gICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQotICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQotCi0gICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCi0gICAgTU9WUyAgICB0bXAxLCBjb3VudCwgTFNMICMzMSAgICAgICAgOy8vIHVwZGF0ZSBmbGFncyAodmVyT2Zmc2V0KQotICAgIExEUiAgICAgdG1wYSwgPSAweEZGMDBGRjAwCi0gICAgTVZORVEgICB0bXAxLCB0bXAzICAgICAgICAgICAgICAgICAgOy8vIHNlbGVjdCB2ZXJPZmZzZXQ9MAotICAgIE1WTk5FICAgdG1wMSwgdG1wNCAgICAgICAgICAgICAgICAgIDsvLyBzZWxlY3QgdmVyT2Zmc2V0PTEKLSAgICBBTkQgICAgIHRtcGEsIHRtcGEsIHRtcGIsIExTTCAjMyAgICA7Ly8gbWFzayBhbmQgZGl2ZWRlIGJ5IDMyCi0gICAgT1JSICAgICByZXMsIHJlcywgdG1wYQotCi0gICAgTERSICAgICB0bXBhLCA9IDB4ODA4MDgwODAKLSAgICBVSFNVQjggIHJlcywgcmVzLCB0bXAxICAgICAgICAgICAgICA7Ly8gYmlsaW5lYXIgaW50ZXJwb2xhdGlvbgotICAgIExEUiAgICAgdG1wMSwgW3JlZl0sIHdpZHRoICAgICAgICAgIDsvLyBsb2FkIG5leHQgcm93Ci0gICAgRU9SICAgICByZXMsIHJlcywgdG1wYSAgICAgICAgICAgICAgOy8vIGNvcnJlY3Qgc2lnbgotCi0gICAgU1RSICAgICByZXMsIFttYl0sICMxNiAgICAgICAgICAgICAgOy8vIG5leHQgcm93IChtYikKLQotCi0gICAgOy8vIHRtcDIgPSB8YTR8YTN8YTJ8YTF8Ci0gICAgOy8vIHRtcDMgPSB8YzR8YzN8YzJ8YzF8Ci0gICAgOy8vIHRtcDQgPSB8ZzR8ZzN8ZzJ8ZzF8Ci0gICAgOy8vIHRtcDUgPSB8bTR8bTN8bTJ8bTF8Ci0gICAgOy8vIHRtcDYgPSB8cjR8cjN8cjJ8cjF8Ci0gICAgOy8vIHRtcDEgPSB8dDR8dDN8dDJ8dDF8Ci0KLSAgICA7Ly8gc2Vjb25kIGZvdXIgcGl4ZWxzCi0gICAgVVhUQjE2ICB0bXBhLCB0bXA0ICAgICAgICAgICAgICAgICAgOy8vIHxnM3xnMXwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDUgICAgICAgICAgICA7Ly8gfGczK20zfGcxK20xfAotICAgIFVYVEIxNiAgdG1wYiwgdG1wMyAgICAgICAgICAgICAgICAgIDsvLyB8YzN8YzF8Ci0gICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQotICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wNiAgICAgICAgICAgIDsvLyB8YzMrcjN8YzErcjF8Ci0gICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQStUCi0KLSAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCi0gICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCi0KLSAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKLSAgICBMRFIgICAgIHJlcywgPSAweDAwRkYwMEZGCi0gICAgVVhUQjE2ICB0bXBhLCB0bXA0LCBST1IgIzggICAgICAgICAgOy8vIHxnNHxnMnwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDUsIFJPUiAjOCAgICA7Ly8gfGc0K200fGcyK20yfAotICAgIEFORCAgICAgcmVzLCByZXMsIHRtcGIsIExTUiAjNSAgICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKLQotICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKLSAgICBVWFRCMTYgIHRtcGIsIHRtcDMsIFJPUiAjOCAgICAgICAgICA7Ly8gfGM0fGMyfAotICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCi0gICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXA2LCBST1IgIzggICAgOy8vIHxjNCtyNHxjMityMnwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDIsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxLCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQStUCi0KLSAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCi0gICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCi0KLSAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKLSAgICBMRFIgICAgIHRtcGEsID0gMHhGRjAwRkYwMAotICAgIE1WTkVRICAgdG1wMiwgdG1wNCAgICAgICAgICAgICAgICAgIDsvLyBzZWxlY3QgdmVyT2Zmc2V0PTAKLSAgICBNVk5ORSAgIHRtcDIsIHRtcDUgICAgICAgICAgICAgICAgICA7Ly8gc2VsZWN0IHZlck9mZnNldD0xCi0KLSAgICBBTkQgICAgIHRtcGEsIHRtcGEsIHRtcGIsIExTTCAjMyAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCi0gICAgT1JSICAgICByZXMsIHJlcywgdG1wYQotICAgIExEUiAgICAgdG1wYSwgPSAweDgwODA4MDgwCi0gICAgVUhTVUI4ICByZXMsIHJlcywgdG1wMiAgICAgICAgICAgICAgOy8vIGJpbGluZWFyIGludGVycG9sYXRpb24KLSAgICBMRFIgICAgIHRtcDIsIFtyZWZdLCB3aWR0aCAgICAgICAgICA7Ly8gbG9hZCBuZXh0IHJvdwotICAgIEVPUiAgICAgcmVzLCByZXMsIHRtcGEgICAgICAgICAgICAgIDsvLyBjb3JyZWN0IHNpZ24KLSAgICBTVFIgICAgIHJlcywgW21iXSwgIzE2ICAgICAgICAgICAgICA7Ly8gbmV4dCByb3cKLQotICAgIDsvLyB0bXAzID0gfGE0fGEzfGEyfGExfAotICAgIDsvLyB0bXA0ID0gfGM0fGMzfGMyfGMxfAotICAgIDsvLyB0bXA1ID0gfGc0fGczfGcyfGcxfAotICAgIDsvLyB0bXA2ID0gfG00fG0zfG0yfG0xfAotICAgIDsvLyB0bXAxID0gfHI0fHIzfHIyfHIxfAotICAgIDsvLyB0bXAyID0gfHQ0fHQzfHQyfHQxfAotCi0gICAgOy8vIHRoaXJkIGZvdXIgcGl4ZWxzCi0gICAgVVhUQjE2ICB0bXBhLCB0bXA1ICAgICAgICAgICAgICAgICAgOy8vIHxnM3xnMXwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDYgICAgICAgICAgICA7Ly8gfGczK20zfGcxK20xfAotICAgIFVYVEIxNiAgdG1wYiwgdG1wNCAgICAgICAgICAgICAgICAgIDsvLyB8YzN8YzF8Ci0gICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQotICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wMSAgICAgICAgICAgIDsvLyB8YzMrcjN8YzErcjF8Ci0gICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDMgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAyICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQStUCi0KLSAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCi0gICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCi0KLSAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKLSAgICBMRFIgICAgIHJlcywgPSAweDAwRkYwMEZGCi0gICAgVVhUQjE2ICB0bXBhLCB0bXA1LCBST1IgIzggICAgICAgICAgOy8vIHxnNHxnMnwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDYsIFJPUiAjOCAgICA7Ly8gfGc0K200fGcyK20yfAotICAgIEFORCAgICAgcmVzLCByZXMsIHRtcGIsIExTUiAjNSAgICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKLQotICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKLSAgICBVWFRCMTYgIHRtcGIsIHRtcDQsIFJPUiAjOCAgICAgICAgICA7Ly8gfGM0fGMyfAotICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCi0gICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXAxLCBST1IgIzggICAgOy8vIHxjNCtyNHxjMityMnwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDMsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAyLCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQStUCi0KLQotICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKLSAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKLQotICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQotICAgIExEUiAgICAgdG1wYSwgPSAweEZGMDBGRjAwCi0gICAgTVZORVEgICB0bXAzLCB0bXA1ICAgICAgICAgICAgICAgICAgOy8vIHNlbGVjdCB2ZXJPZmZzZXQ9MAotICAgIE1WTk5FICAgdG1wMywgdG1wNiAgICAgICAgICAgICAgICAgIDsvLyBzZWxlY3QgdmVyT2Zmc2V0PTEKLQotICAgIEFORCAgICAgdG1wYSwgdG1wYSwgdG1wYiwgTFNMICMzICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKLSAgICBPUlIgICAgIHJlcywgcmVzLCB0bXBhCi0gICAgTERSICAgICB0bXBhLCA9IDB4ODA4MDgwODAKLSAgICBVSFNVQjggIHJlcywgcmVzLCB0bXAzICAgICAgICAgICAgICA7Ly8gYmlsaW5lYXIgaW50ZXJwb2xhdGlvbgotICAgIExEUiAgICAgdG1wMywgW3JlZl0gICAgICAgICAgICAgICAgIDsvLyBsb2FkIG5leHQgcm93Ci0gICAgRU9SICAgICByZXMsIHJlcywgdG1wYSAgICAgICAgICAgICAgOy8vIGNvcnJlY3Qgc2lnbgotICAgIFNUUiAgICAgcmVzLCBbbWJdLCAjMTYgICAgICAgICAgICAgIDsvLyBuZXh0IHJvdwotCi0gICAgOy8vIHRtcDQgPSB8YTR8YTN8YTJ8YTF8Ci0gICAgOy8vIHRtcDUgPSB8YzR8YzN8YzJ8YzF8Ci0gICAgOy8vIHRtcDYgPSB8ZzR8ZzN8ZzJ8ZzF8Ci0gICAgOy8vIHRtcDEgPSB8bTR8bTN8bTJ8bTF8Ci0gICAgOy8vIHRtcDIgPSB8cjR8cjN8cjJ8cjF8Ci0gICAgOy8vIHRtcDMgPSB8dDR8dDN8dDJ8dDF8Ci0KLSAgICA7Ly8gZm91cnRoIGZvdXIgcGl4ZWxzCi0gICAgVVhUQjE2ICB0bXBhLCB0bXA2ICAgICAgICAgICAgICAgICAgOy8vIHxnM3xnMXwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEgICAgICAgICAgICA7Ly8gfGczK20zfGcxK20xfAotICAgIFVYVEIxNiAgdG1wYiwgdG1wNSAgICAgICAgICAgICAgICAgIDsvLyB8YzN8YzF8Ci0gICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQotICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wMiAgICAgICAgICAgIDsvLyB8YzMrcjN8YzErcjF8Ci0gICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDQgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAzICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQStUCi0KLSAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCi0gICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCi0KLSAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKLSAgICBMRFIgICAgIHJlcywgPSAweDAwRkYwMEZGCi0gICAgVVhUQjE2ICB0bXBhLCB0bXA2LCBST1IgIzggICAgICAgICAgOy8vIHxnNHxnMnwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEsIFJPUiAjOCAgICA7Ly8gfGc0K200fGcyK20yfAotICAgIEFORCAgICAgcmVzLCByZXMsIHRtcGIsIExTUiAjNSAgICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKLQotICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKLSAgICBVWFRCMTYgIHRtcGIsIHRtcDUsIFJPUiAjOCAgICAgICAgICA7Ly8gfGM0fGMyfAotICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCi0gICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXAyLCBST1IgIzggICAgOy8vIHxjNCtyNHxjMityMnwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDQsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAzLCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQStUCi0KLSAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCi0gICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCi0KLSAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKLSAgICBMRFIgICAgIHRtcDQsID0gMHhGRjAwRkYwMAotICAgIE1WTkVRICAgdG1wNSwgdG1wNiAgICAgICAgICAgICAgICAgIDsvLyBzZWxlY3QgdmVyT2Zmc2V0PTAKLSAgICBNVk5ORSAgIHRtcDUsIHRtcDEgICAgICAgICAgICAgICAgICA7Ly8gc2VsZWN0IHZlck9mZnNldD0xCi0KLSAgICBBTkQgICAgIHRtcGEsIHRtcDQsIHRtcGIsIExTTCAjMyAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCi0gICAgT1JSICAgICByZXMsIHJlcywgdG1wYQotICAgIExEUiAgICAgdG1wYSwgPSAweDgwODA4MDgwCi0gICAgVUhTVUI4ICByZXMsIHJlcywgdG1wNSAgICAgICAgICAgICAgOy8vIGJpbGluZWFyIGludGVycG9sYXRpb24KLQotICAgIDsvLyBkZWNyZW1lbnQgbG9vcF94IGNvdW50ZXIKLSAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzQ8PDI0ICAgICAgICA7Ly8gKHBhcnRXaWR0aC0xKSAtPSA0OwotCi0gICAgOy8vIGNhbGN1bGF0ZSAicmVmIiBhZGRyZXNzIGZvciBuZXh0IHJvdW5kCi0gICAgU1VCICAgICByZWYsIHJlZiwgd2lkdGgsIExTTCAjMyAgICAgOy8vIHJlZiAtPSA4KndpZHRoOwotICAgIEFERCAgICAgcmVmLCByZWYsICM0OyAgICAgICAgICAgICAgIDsvLyBuZXh0IGNvbHVtbiAoNCBwaXhlbHMpCi0KLSAgICBFT1IgICAgIHJlcywgcmVzLCB0bXBhICAgICAgICAgICAgICA7Ly8gY29ycmVjdCBzaWduCi0gICAgU1RSICAgICByZXMsIFttYl0sICMtNDQKLSAKLSAgICBCQ1MgICAgIGxvb3BfeAotCi0gICAgQUREUyAgICBjb3VudCwgY291bnQsICMyNTI8PDE2ICAgICAgOy8vIChwYXJ0SGVpZ2h0LTEpIC09IDQ7Ci0gICAgQUREICAgICByZWYsIHJlZiwgd2lkdGgsIExTTCAjMiAgICAgOy8vIHJlZiArPSA0KndpZHRoCi0gICAgQU5EICAgICB0bXAxLCBjb3VudCwgIzB4MDAwMEZGMDAgICAgOy8vIHBhcnRXaWR0aC0xCi0gICAgTU9WICAgICB0bXAyLCAjMQotICAgIEFERCAgICAgdG1wMiwgdG1wMiwgdG1wMSwgTFNSICM4ICAgIDsvLyBwYXJ0V2lkdGgKLSAgICBTVUIgICAgIHJlZiwgcmVmLCB0bXAyICAgICAgICAgICAgICA7Ly8gcmVmIC09IHBhcnRXaWR0aAotICAgIEFERCAgICAgbWIsIG1iLCAjNjQ7Ci0gICAgU1VCICAgICBtYiwgbWIsIHRtcDI7ICAgICAgICAgICAgICAgOy8vIG1iIC09IHBhcnRXaWR0aAotICAgIEJHRSAgICAgbG9vcF95Ci0KLSAgICBBREQgICAgIHNwLHNwLCMweDFmNAotICAgIExETUZEICAgc3AhLCB7cjQtcjExLCBwY30KLQotICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vd2luX2FzbS5iYXQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS93aW5fYXNtLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI4ZDg4Yy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS93aW5fYXNtLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLWVjaG8gb2ZmCi1zZXQgQVNNRkxBR1M9IC1jaGVja3JlZ2xpc3QgLUNQVSBBUk0xMTM2IC1QcmVEZWZpbmUgIkgyNjRERUNfV0lOQVNNIFNFVEwge1RSVUV9Igotc2V0IEFTTT0iRDpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyA4XFZDXGNlXGJpblx4ODZfYXJtXGFybWFzbSIKLWVjaG8gb24KLQotJUFTTSUgJUFTTUZMQUdTJSBoMjY0YnNkX2ludGVycG9sYXRlX2Nocm9tYV92ZXIucwotJUFTTSUgJUFTTUZMQUdTJSBoMjY0YnNkX2ludGVycG9sYXRlX2Nocm9tYV9ob3IucwotJUFTTSUgJUFTTUZMQUdTJSBoMjY0YnNkX2ludGVycG9sYXRlX2hvcl9oYWxmLnMKLSVBU00lICVBU01GTEFHUyUgaDI2NGJzZF9pbnRlcnBvbGF0ZV9ob3JfcXVhcnRlci5zCi0lQVNNJSAlQVNNRkxBR1MlIGgyNjRic2RfaW50ZXJwb2xhdGVfaG9yX3Zlcl9xdWFydGVyLnMKLSVBU00lICVBU01GTEFHUyUgaDI2NGJzZF9pbnRlcnBvbGF0ZV92ZXJfaGFsZi5zCi0lQVNNJSAlQVNNRkxBR1MlIGgyNjRic2RfaW50ZXJwb2xhdGVfdmVyX3F1YXJ0ZXIucwotCi1yZW0gJUFTTSUgJUFTTUZMQUdTJSBoMjY0YnNkX2ludGVycG9sYXRlX2Nocm9tYV9ob3JfdmVyLnMKLXJlbSAlQVNNJSAlQVNNRkxBR1MlIGgyNjRic2RfaW50ZXJwb2xhdGVfbWlkX2hvci5zCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbS9oMjY0YnNkQ2xlYXJNYkxheWVyLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbS9oMjY0YnNkQ2xlYXJNYkxheWVyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMTE2NTQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZENsZWFyTWJMYXllci5zCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotOwotOyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotOwotOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsKLTsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsKLTsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsKLQotICAgIFJFUVVJUkU4Ci0gICAgUFJFU0VSVkU4Ci0KLSAgICBBUkVBICAgIHwudGV4dHwsIENPREUKLQotICAgIEVYUE9SVCBoMjY0YnNkQ2xlYXJNYkxheWVyCi0KLTsgSW5wdXQgLyBvdXRwdXQgcmVnaXN0ZXJzCi1wTWJMYXllciAgICBSTiAgMAotc2l6ZSAgICAgICAgUk4gIDEKLXBUbXAgICAgICAgIFJOICAyCi1zdGVwICAgICAgICBSTiAgMwotCi07IC0tIE5FT04gcmVnaXN0ZXJzIC0tCi0KLXFaZXJvICAgUU4gIFEwLlU4Ci0KLTsvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOwotOyAgICBGdW5jdGlvbjogaDI2NGJzZENsZWFyTWJMYXllcgotOwotOyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLTsKLTsgICAgICAgIElucHV0czoKLTsKLTsgICAgICAgIE91dHB1dHM6Ci07Ci07ICAgICAgICBSZXR1cm5zOgotOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWgyNjRic2RDbGVhck1iTGF5ZXIKLQotICAgIFZNT1YgICAgcVplcm8sICMwCi0gICAgQUREICAgICBwVG1wLCBwTWJMYXllciwgIzE2Ci0gICAgTU9WICAgICBzdGVwLCAjMzIKLSAgICBTVUJTICAgIHNpemUsIHNpemUsICM2NAotCi1sb29wCi0gICAgVlNUMSAgICBxWmVybywgW3BNYkxheWVyXSwgc3RlcAotICAgIFNVQlMgICAgc2l6ZSwgc2l6ZSwgIzY0Ci0gICAgVlNUMSAgICBxWmVybywgW3BUbXBdLCBzdGVwCi0gICAgVlNUMSAgICBxWmVybywgW3BNYkxheWVyXSwgc3RlcAotICAgIFZTVDEgICAgcVplcm8sIFtwVG1wXSwgc3RlcAotICAgIEJDUyAgICAgbG9vcAotCi0gICAgQlggICAgICBscgotICAgIEVORAotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtL2gyNjRic2RDb3VudExlYWRpbmdaZXJvcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZENvdW50TGVhZGluZ1plcm9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3YmQ3M2UuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZENvdW50TGVhZGluZ1plcm9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi07Ci07IENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci07Ci07IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOwotOyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOwotOyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOwotCi0gICAgUkVRVUlSRTgKLSAgICBQUkVTRVJWRTgKLQotICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERQotCi0gICAgRVhQT1JUIGgyNjRic2RDb3VudExlYWRpbmdaZXJvcwotCi07IElucHV0IC8gb3V0cHV0IHJlZ2lzdGVycwotdmFsdWUgICAgUk4gIDAKLQotOyAtLSBORU9OIHJlZ2lzdGVycyAtLQotCi07LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsKLTsgICAgRnVuY3Rpb246IGgyNjRic2RDb3VudExlYWRpbmdaZXJvcwotOwotOyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLTsKLTsgICAgICAgIElucHV0czoKLTsKLTsgICAgICAgIE91dHB1dHM6Ci07Ci07ICAgICAgICBSZXR1cm5zOgotOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWgyNjRic2RDb3VudExlYWRpbmdaZXJvcwotCi0gICAgQ0xaICAgICB2YWx1ZSwgdmFsdWUKLSAgICBCWCAgICAgIGxyCi0gICAgRU5ECi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZEZpbGxSb3c3LnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbS9oMjY0YnNkRmlsbFJvdzcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJmYWM5Mi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbS9oMjY0YnNkRmlsbFJvdzcucworKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi07Ci07IENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci07Ci07IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOwotOyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOwotOyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOwotCi0gICAgUkVRVUlSRTgKLSAgICBQUkVTRVJWRTgKLQotICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERQotCi0gICAgRVhQT1JUIGgyNjRic2RGaWxsUm93NwotCi07IElucHV0IC8gb3V0cHV0IHJlZ2lzdGVycwotCi1yZWYgICAgIFJOIDAKLWZpbGwgICAgUk4gMQotbGVmdCAgICBSTiAyCi10bXAyICAgIFJOIDIKLWNlbnRlciAgUk4gMwotcmlnaHQgICBSTiA0Ci10bXAxICAgIFJOIDUKLQotOyAtLSBORU9OIHJlZ2lzdGVycyAtLQotCi1xVG1wMCAgIFFOICBRMC5VOAotcVRtcDEgICBRTiAgUTEuVTgKLWRUbXAwICAgRE4gIEQwLlU4Ci1kVG1wMSAgIEROICBEMS5VOAotZFRtcDIgICBETiAgRDIuVTgKLWRUbXAzICAgRE4gIEQzLlU4Ci0KLQotOy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ci07ICAgIEZ1bmN0aW9uOiBoMjY0YnNkRmlsbFJvdzcKLTsKLTsgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci07Ci07ICAgICAgICBJbnB1dHM6Ci07Ci07ICAgICAgICBPdXRwdXRzOgotOwotOyAgICAgICAgUmV0dXJuczoKLTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1oMjY0YnNkRmlsbFJvdzcKLSAgICAgICAgUFVTSCAgICAge3I0LXI2LGxyfQotICAgICAgICBDTVAgICAgICBsZWZ0LCAjMAotICAgICAgICBMRFIgICAgICByaWdodCwgW3NwLCMweDEwXQotICAgICAgICBCRVEgICAgICBzd2l0Y2hfY2VudGVyCi0gICAgICAgIExEUkIgICAgIHRtcDEsIFtyZWYsIzBdCi0KLWxvb3BfbGVmdAotICAgICAgICBTVUJTICAgICBsZWZ0LCBsZWZ0LCAjMQotICAgICAgICBTVFJCICAgICB0bXAxLCBbZmlsbF0sICMxCi0gICAgICAgIEJORSAgICAgIGxvb3BfbGVmdAotCi1zd2l0Y2hfY2VudGVyCi0gICAgICAgIEFTUiAgICAgIHRtcDIsY2VudGVyLCMyCi0gICAgICAgIENNUCAgICAgIHRtcDIsIzkKLSAgICAgICAgQUREQ0MgICAgcGMscGMsdG1wMixMU0wgIzIKLSAgICAgICAgQiAgICAgICAgbG9vcF9jZW50ZXIKLSAgICAgICAgQiAgICAgICAgbG9vcF9jZW50ZXIKLSAgICAgICAgQiAgICAgICAgY2FzZV8xCi0gICAgICAgIEIgICAgICAgIGNhc2VfMgotICAgICAgICBCICAgICAgICBjYXNlXzMKLSAgICAgICAgQiAgICAgICAgY2FzZV80Ci0gICAgICAgIEIgICAgICAgIGNhc2VfNQotICAgICAgICBCICAgICAgICBjYXNlXzYKLSAgICAgICAgQiAgICAgICAgY2FzZV83Ci0gICAgICAgIEIgICAgICAgIGNhc2VfOAotO2Nhc2VfOAotOyAgICAgICAgTERSICAgICAgdG1wMiwgW3JlZl0sICM0Ci07ICAgICAgICBTVUIgICAgICBjZW50ZXIsIGNlbnRlciwgIzQKLTsgICAgICAgIFNUUiAgICAgIHRtcDIsIFtmaWxsXSwgIzQKLTtjYXNlXzcKLTsgICAgICAgIExEUiAgICAgIHRtcDIsIFtyZWZdLCAjNAotOyAgICAgICAgU1VCICAgICAgY2VudGVyLCBjZW50ZXIsICM0Ci07ICAgICAgICBTVFIgICAgICB0bXAyLCBbZmlsbF0sICM0Ci07Y2FzZV82Ci07ICAgICAgICBMRFIgICAgICB0bXAyLCBbcmVmXSwgIzQKLTsgICAgICAgIFNVQiAgICAgIGNlbnRlciwgY2VudGVyLCAjNAotOyAgICAgICAgU1RSICAgICAgdG1wMiwgW2ZpbGxdLCM0Ci07Y2FzZV81Ci07ICAgICAgICBMRFIgICAgICB0bXAyLCBbcmVmXSwgIzQKLTsgICAgICAgIFNVQiAgICAgIGNlbnRlciwgY2VudGVyLCAjNAotOyAgICAgICAgU1RSICAgICAgdG1wMiwgW2ZpbGxdLCM0Ci07Y2FzZV80Ci07ICAgICAgICBMRFIgICAgICB0bXAyLCBbcmVmXSwjNAotOyAgICAgICAgU1VCICAgICAgY2VudGVyLCBjZW50ZXIsICM0Ci07ICAgICAgICBTVFIgICAgICB0bXAyLCBbZmlsbF0sICM0Ci07Y2FzZV8zCi07ICAgICAgICBMRFIgICAgICB0bXAyLCBbcmVmXSwjNAotOyAgICAgICAgU1VCICAgICAgY2VudGVyLCBjZW50ZXIsICM0Ci07ICAgICAgICBTVFIgICAgICB0bXAyLCBbZmlsbF0sICM0Ci07Y2FzZV8yCi07ICAgICAgICBMRFIgICAgICB0bXAyLCBbcmVmXSwjNAotOyAgICAgICAgU1VCICAgICAgY2VudGVyLCBjZW50ZXIsICM0Ci07ICAgICAgICBTVFIgICAgICB0bXAyLCBbZmlsbF0sICM0Ci07Y2FzZV8xCi07ICAgICAgICBMRFIgICAgICB0bXAyLCBbcmVmXSwjNAotOyAgICAgICAgU1VCICAgICAgY2VudGVyLCBjZW50ZXIsICM0Ci07ICAgICAgICBTVFIgICAgICB0bXAyLCBbZmlsbF0sICM0Ci0KLWNhc2VfOAotICAgICAgICBWTEQxICAgIHtxVG1wMCwgcVRtcDF9LCBbcmVmXSEKLSAgICAgICAgU1VCICAgICBjZW50ZXIsIGNlbnRlciwgIzMyCi0gICAgICAgIFZTVDEgICAgcVRtcDAsIFtmaWxsXSEKLSAgICAgICAgVlNUMSAgICBxVG1wMSwgW2ZpbGxdIQotICAgICAgICBCICAgICAgIGxvb3BfY2VudGVyCi1jYXNlXzcKLSAgICAgICAgVkxEMSAgICB7ZFRtcDAsZFRtcDEsZFRtcDJ9LCBbcmVmXSEKLSAgICAgICAgU1VCICAgICBjZW50ZXIsIGNlbnRlciwgIzI4Ci0gICAgICAgIExEUiAgICAgdG1wMiwgW3JlZl0sICM0Ci0gICAgICAgIFZTVDEgICAge2RUbXAwLGRUbXAxLGRUbXAyfSwgW2ZpbGxdIQotICAgICAgICBTVFIgICAgIHRtcDIsIFtmaWxsXSwjNAotICAgICAgICBCICAgICAgIGxvb3BfY2VudGVyCi1jYXNlXzYKLSAgICAgICAgVkxEMSAgICB7ZFRtcDAsZFRtcDEsZFRtcDJ9LCBbcmVmXSEKLSAgICAgICAgU1VCICAgICBjZW50ZXIsIGNlbnRlciwgIzI0Ci0gICAgICAgIFZTVDEgICAge2RUbXAwLGRUbXAxLGRUbXAyfSwgW2ZpbGxdIQotICAgICAgICBCICAgICAgIGxvb3BfY2VudGVyCi1jYXNlXzUKLSAgICAgICAgVkxEMSAgICBxVG1wMCwgW3JlZl0hCi0gICAgICAgIFNVQiAgICAgY2VudGVyLCBjZW50ZXIsICMyMAotICAgICAgICBMRFIgICAgIHRtcDIsIFtyZWZdLCAjNAotICAgICAgICBWU1QxICAgIHFUbXAwLCBbZmlsbF0hCi0gICAgICAgIFNUUiAgICAgdG1wMiwgW2ZpbGxdLCM0Ci0gICAgICAgIEIgICAgICAgbG9vcF9jZW50ZXIKLWNhc2VfNAotICAgICAgICBWTEQxICAgIHFUbXAwLCBbcmVmXSEKLSAgICAgICAgU1VCICAgICBjZW50ZXIsIGNlbnRlciwgIzE2Ci0gICAgICAgIFZTVDEgICAgcVRtcDAsIFtmaWxsXSEKLSAgICAgICAgQiAgICAgICBsb29wX2NlbnRlcgotY2FzZV8zCi0gICAgICAgIFZMRDEgICAgZFRtcDAsIFtyZWZdIQotICAgICAgICBTVUIgICAgIGNlbnRlciwgY2VudGVyLCAjMTIKLSAgICAgICAgTERSICAgICB0bXAyLCBbcmVmXSwgIzQKLSAgICAgICAgVlNUMSAgICBkVG1wMCwgW2ZpbGxdIQotICAgICAgICBTVFIgICAgIHRtcDIsIFtmaWxsXSwjNAotICAgICAgICBCICAgICAgIGxvb3BfY2VudGVyCi1jYXNlXzIKLSAgICAgICAgTERSICAgICAgdG1wMiwgW3JlZl0sIzQKLSAgICAgICAgU1VCICAgICAgY2VudGVyLCBjZW50ZXIsICM0Ci0gICAgICAgIFNUUiAgICAgIHRtcDIsIFtmaWxsXSwgIzQKLWNhc2VfMQotICAgICAgICBMRFIgICAgICB0bXAyLCBbcmVmXSwjNAotICAgICAgICBTVUIgICAgICBjZW50ZXIsIGNlbnRlciwgIzQKLSAgICAgICAgU1RSICAgICAgdG1wMiwgW2ZpbGxdLCAjNAotCi1sb29wX2NlbnRlcgotICAgICAgICBDTVAgICAgICBjZW50ZXIsICMwCi0gICAgICAgIExEUkJORSAgIHRtcDIsIFtyZWZdLCAjMQotICAgICAgICBTVUJORSAgICBjZW50ZXIsIGNlbnRlciwgIzEKLSAgICAgICAgU1RSQk5FICAgdG1wMiwgW2ZpbGxdLCAjMQotICAgICAgICBCTkUgICAgICBsb29wX2NlbnRlcgotICAgICAgICBDTVAgICAgICByaWdodCwjMAotICAgICAgICBQT1BFUSAgICB7cjQtcjYscGN9Ci0gICAgICAgIExEUkIgICAgIHRtcDIsIFtyZWYsIy0xXQotCi1sb29wX3JpZ2h0Ci0gICAgICAgIFNUUkIgICAgIHRtcDIsIFtmaWxsXSwgIzEKLSAgICAgICAgU1VCUyAgICAgcmlnaHQsIHJpZ2h0LCAjMQotICAgICAgICBCTkUgICAgICBsb29wX3JpZ2h0Ci0KLSAgICAgICAgUE9QICAgICAge3I0LXI2LHBjfQotICAgICAgICBFTkQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZEZsdXNoQml0cy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZEZsdXNoQml0cy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTMzNWI4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtL2gyNjRic2RGbHVzaEJpdHMucworKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTsKLTsgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLTsKLTsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ci07ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ci07IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ci0KLSAgICBSRVFVSVJFOAotICAgIFBSRVNFUlZFOAotCi0gICAgQVJFQSAgICB8LnRleHR8LCBDT0RFCi0KLSAgICBFWFBPUlQgaDI2NGJzZEZsdXNoQml0cwotCi07IElucHV0IC8gb3V0cHV0IHJlZ2lzdGVycwotcFN0cm1EYXRhICAgICAgIFJOICAwCi1udW1CaXRzICAgICAgICAgUk4gIDEKLXJlYWRCaXRzICAgICAgICBSTiAgMgotc3RybUJ1ZmZTaXplICAgIFJOICAzCi1wU3RybUJ1ZmZTdGFydCAgUk4gIDEKLXBTdHJtQ3VyclBvcyAgICBSTiAgMgotYml0UG9zSW5Xb3JkICAgIFJOICAxCi0KLTsgLS0gTkVPTiByZWdpc3RlcnMgLS0KLQotCi0KLTsvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOwotOyAgICBGdW5jdGlvbjogaDI2NGJzZEZsdXNoQml0cwotOwotOyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLTsKLTsgICAgICAgIElucHV0czoKLTsKLTsgICAgICAgIE91dHB1dHM6Ci07Ci07ICAgICAgICBSZXR1cm5zOgotOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWgyNjRic2RGbHVzaEJpdHMKLTsvLyAgICBQVVNIICAgICB7cjQtcjYsbHJ9Ci0KLSAgICBMRFIgcmVhZEJpdHMsIFtwU3RybURhdGEsICMweDEwXQotICAgIExEUiBzdHJtQnVmZlNpemUsIFtwU3RybURhdGEsICMweENdCi0KLSAgICBBREQgcmVhZEJpdHMsIHJlYWRCaXRzLCBudW1CaXRzCi0gICAgQU5EIGJpdFBvc0luV29yZCwgcmVhZEJpdHMsICM3Ci0KLSAgICBTVFIgcmVhZEJpdHMsIFtwU3RybURhdGEsICMweDEwXQotICAgIFNUUiBiaXRQb3NJbldvcmQsIFtwU3RybURhdGEsICMweDhdCi0KLSAgICBMRFIgcFN0cm1CdWZmU3RhcnQsIFtwU3RybURhdGEsICMweDBdCi0KLSAgICBDTVAgcmVhZEJpdHMsIHN0cm1CdWZmU2l6ZSwgTFNMICMzCi0KLSAgICBCSEkgZW5kX29mX3N0cmVhbQotCi0gICAgQUREIHBTdHJtQ3VyclBvcywgcFN0cm1CdWZmU3RhcnQsIHJlYWRCaXRzLCBMU1IgIzMKLSAgICBTVFIgcFN0cm1DdXJyUG9zLCBbcFN0cm1EYXRhLCAjMHg0XQotICAgIE1PViByMCwgIzAKLSAgICBCWCAgbHIKLTsvLyAgICBQT1AgICAgICB7cjQtcjYscGN9Ci0KLWVuZF9vZl9zdHJlYW0KLSAgICBNVk4gcjAsICMwCi0gICAgQlggIGxyCi07Ly8gICAgUE9QICAgICAge3I0LXI2LHBjfQotCi0gICAgRU5ECi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZFdyaXRlTWFjcm9ibG9jay5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZFdyaXRlTWFjcm9ibG9jay5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGEwNzgxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtL2gyNjRic2RXcml0ZU1hY3JvYmxvY2sucworKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi07Ci07IENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci07Ci07IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOwotOyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOwotOyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOwotCi0gICAgUkVRVUlSRTgKLSAgICBQUkVTRVJWRTgKLQotICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERQotCi0gICAgRVhQT1JUIGgyNjRic2RXcml0ZU1hY3JvYmxvY2sKLQotOyBJbnB1dCAvIG91dHB1dCByZWdpc3RlcnMKLWltYWdlICAgUk4gIDAKLWRhdGEgICAgUk4gIDEKLXdpZHRoICAgUk4gIDIKLWx1bWEgICAgUk4gIDMKLWNiICAgICAgUk4gIDQKLWNyICAgICAgUk4gIDUKLWN3aWR0aCAgUk4gIDYKLQotOyAtLSBORU9OIHJlZ2lzdGVycyAtLQotCi1xUm93MCAgIFFOICBRMC5VOAotcVJvdzEgICBRTiAgUTEuVTgKLXFSb3cyICAgUU4gIFEyLlU4Ci1xUm93MyAgIFFOICBRMy5VOAotcVJvdzQgICBRTiAgUTQuVTgKLXFSb3c1ICAgUU4gIFE1LlU4Ci1xUm93NiAgIFFOICBRNi5VOAotcVJvdzcgICBRTiAgUTcuVTgKLXFSb3c4ICAgUU4gIFE4LlU4Ci1xUm93OSAgIFFOICBROS5VOAotcVJvdzEwICBRTiAgUTEwLlU4Ci1xUm93MTEgIFFOICBRMTEuVTgKLXFSb3cxMiAgUU4gIFExMi5VOAotcVJvdzEzICBRTiAgUTEzLlU4Ci1xUm93MTQgIFFOICBRMTQuVTgKLXFSb3cxNSAgUU4gIFExNS5VOAotCi1kUm93MCAgIEROICBEMC5VOAotZFJvdzEgICBETiAgRDEuVTgKLWRSb3cyICAgRE4gIEQyLlU4Ci1kUm93MyAgIEROICBEMy5VOAotZFJvdzQgICBETiAgRDQuVTgKLWRSb3c1ICAgRE4gIEQ1LlU4Ci1kUm93NiAgIEROICBENi5VOAotZFJvdzcgICBETiAgRDcuVTgKLWRSb3c4ICAgRE4gIEQ4LlU4Ci1kUm93OSAgIEROICBEOS5VOAotZFJvdzEwICBETiAgRDEwLlU4Ci1kUm93MTEgIEROICBEMTEuVTgKLWRSb3cxMiAgRE4gIEQxMi5VOAotZFJvdzEzICBETiAgRDEzLlU4Ci1kUm93MTQgIEROICBEMTQuVTgKLWRSb3cxNSAgRE4gIEQxNS5VOAotCi07LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsKLTsgICAgRnVuY3Rpb246IGgyNjRic2RXcml0ZU1hY3JvYmxvY2sKLTsKLTsgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci07ICAgICAgICAgICAgV3JpdGUgb25lIG1hY3JvYmxvY2sgaW50byB0aGUgaW1hZ2UuIEJvdGggbHVtYSBhbmQgY2hyb21hCi07ICAgICAgICAgICAgY29tcG9uZW50cyB3aWxsIGJlIHdyaXR0ZW4gYXQgdGhlIHNhbWUgdGltZS4KLTsKLTsgICAgICAgIElucHV0czoKLTsgICAgICAgICAgICBkYXRhICAgIHBvaW50ZXIgdG8gbWFjcm9ibG9jayBkYXRhIHRvIGJlIHdyaXR0ZW4sIDI1NiB2YWx1ZXMgZm9yCi07ICAgICAgICAgICAgICAgICAgICBsdW1hIGZvbGxvd2VkIGJ5IDY0IHZhbHVlcyBmb3IgYm90aCBjaHJvbWEgY29tcG9uZW50cwotOwotOyAgICAgICAgT3V0cHV0czoKLTsgICAgICAgICAgICBpbWFnZSAgIHBvaW50ZXIgdG8gdGhlIGltYWdlIHdoZXJlIHRoZSBtYWNyb2Jsb2NrIHdpbGwgYmUgd3JpdHRlbgotOwotOyAgICAgICAgUmV0dXJuczoKLTsgICAgICAgICAgICBub25lCi07Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotaDI2NGJzZFdyaXRlTWFjcm9ibG9jawotICAgIFBVU0ggICAge3I0LXI2LGxyfQotICAgIFZQVVNIICAge3E0LXE3fQotCi0gICAgTERSICAgICB3aWR0aCwgW2ltYWdlLCAjNF0KLSAgICBMRFIgICAgIGx1bWEsIFtpbWFnZSwgIzB4Q10KLSAgICBMRFIgICAgIGNiLCBbaW1hZ2UsICMweDEwXQotICAgIExEUiAgICAgY3IsIFtpbWFnZSwgIzB4MTRdCi0KLQotOyAgIFdyaXRlIGx1bWEKLSAgICBWTEQxICAgIHtxUm93MCwgcVJvdzF9LCBbZGF0YV0hCi0gICAgTFNMICAgICB3aWR0aCwgd2lkdGgsICM0Ci0gICAgVkxEMSAgICB7cVJvdzIsIHFSb3czfSwgW2RhdGFdIQotICAgIExTUiAgICAgY3dpZHRoLCB3aWR0aCwgIzEKLSAgICBWU1QxICAgIHtxUm93MH0sIFtsdW1hQDEyOF0sIHdpZHRoCi0gICAgVkxEMSAgICB7cVJvdzQsIHFSb3c1fSwgW2RhdGFdIQotICAgIFZTVDEgICAge3FSb3cxfSwgW2x1bWFAMTI4XSwgd2lkdGgKLSAgICBWTEQxICAgIHtxUm93NiwgcVJvdzd9LCBbZGF0YV0hCi0gICAgVlNUMSAgICB7cVJvdzJ9LCBbbHVtYUAxMjhdLCB3aWR0aAotICAgIFZMRDEgICAge3FSb3c4LCBxUm93OX0sIFtkYXRhXSEKLSAgICBWU1QxICAgIHtxUm93M30sIFtsdW1hQDEyOF0sIHdpZHRoCi0gICAgVkxEMSAgICB7cVJvdzEwLCBxUm93MTF9LCBbZGF0YV0hCi0gICAgVlNUMSAgICB7cVJvdzR9LCBbbHVtYUAxMjhdLCB3aWR0aAotICAgIFZMRDEgICAge3FSb3cxMiwgcVJvdzEzfSwgW2RhdGFdIQotICAgIFZTVDEgICAge3FSb3c1fSwgW2x1bWFAMTI4XSwgd2lkdGgKLSAgICBWTEQxICAgIHtxUm93MTQsIHFSb3cxNX0sIFtkYXRhXSEKLSAgICBWU1QxICAgIHtxUm93Nn0sIFtsdW1hQDEyOF0sIHdpZHRoCi0KLSAgICBWTEQxICAgIHtxUm93MCwgcVJvdzF9LCBbZGF0YV0hIDtjYiByb3dzIDAsMSwyLDMKLSAgICBWU1QxICAgIHtxUm93N30sIFtsdW1hQDEyOF0sIHdpZHRoCi0gICAgVkxEMSAgICB7cVJvdzIsIHFSb3czfSwgW2RhdGFdISA7Y2Igcm93cyA0LDUsNiw3Ci0gICAgVlNUMSAgICB7cVJvdzh9LCBbbHVtYUAxMjhdLCB3aWR0aAotICAgIFZMRDEgICAge3FSb3c0LCBxUm93NX0sIFtkYXRhXSEgO2NyIHJvd3MgMCwxLDIsMwotICAgIFZTVDEgICAge3FSb3c5fSwgW2x1bWFAMTI4XSwgd2lkdGgKLSAgICBWTEQxICAgIHtxUm93NiwgcVJvdzd9LCBbZGF0YV0hIDtjciByb3dzIDQsNSw2LDcKLSAgICBWU1QxICAgIHtxUm93MTB9LCBbbHVtYUAxMjhdLCB3aWR0aAotICAgIFZTVDEgICAge2RSb3cwfSwgW2NiQDY0XSwgY3dpZHRoCi0gICAgVlNUMSAgICB7ZFJvdzh9LCBbY3JANjRdLCBjd2lkdGgKLSAgICBWU1QxICAgIHtxUm93MTF9LCBbbHVtYUAxMjhdLCB3aWR0aAotICAgIFZTVDEgICAge2RSb3cxfSwgW2NiQDY0XSwgY3dpZHRoCi0gICAgVlNUMSAgICB7ZFJvdzl9LCBbY3JANjRdLCBjd2lkdGgKLSAgICBWU1QxICAgIHtxUm93MTJ9LCBbbHVtYUAxMjhdLCB3aWR0aAotICAgIFZTVDEgICAge2RSb3cyfSwgW2NiQDY0XSwgY3dpZHRoCi0gICAgVlNUMSAgICB7ZFJvdzEwfSwgW2NyQDY0XSwgY3dpZHRoCi0gICAgVlNUMSAgICB7cVJvdzEzfSwgW2x1bWFAMTI4XSwgd2lkdGgKLSAgICBWU1QxICAgIHtkUm93M30sIFtjYkA2NF0sIGN3aWR0aAotICAgIFZTVDEgICAge2RSb3cxMX0sIFtjckA2NF0sIGN3aWR0aAotICAgIFZTVDEgICAge3FSb3cxNH0sIFtsdW1hQDEyOF0sIHdpZHRoCi0gICAgVlNUMSAgICB7ZFJvdzR9LCBbY2JANjRdLCBjd2lkdGgKLSAgICBWU1QxICAgIHtkUm93MTJ9LCBbY3JANjRdLCBjd2lkdGgKLSAgICBWU1QxICAgIHtxUm93MTV9LCBbbHVtYV0KLSAgICBWU1QxICAgIHtkUm93NX0sIFtjYkA2NF0sIGN3aWR0aAotICAgIFZTVDEgICAge2RSb3cxM30sIFtjckA2NF0sIGN3aWR0aAotICAgIFZTVDEgICAge2RSb3c2fSwgW2NiQDY0XSwgY3dpZHRoCi0gICAgVlNUMSAgICB7ZFJvdzE0fSwgW2NyQDY0XSwgY3dpZHRoCi0gICAgVlNUMSAgICB7ZFJvdzd9LCBbY2JANjRdCi0gICAgVlNUMSAgICB7ZFJvdzE1fSwgW2NyQDY0XQotCi0gICAgVlBPUCAgICB7cTQtcTd9Ci0gICAgUE9QICAgICB7cjQtcjYscGN9Ci0gICAgRU5ECi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2FzbV9jb21tb24uUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9hc21fY29tbW9uLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2OWE3NWMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2FzbV9jb21tb24uUworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLUAKLUAgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLUAKLUAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci1AIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLUAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci1ACi1AICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi1ACi1AIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLUAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLUAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1AIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLUAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi1ACi0KLQotCi0KLSAgICAubWFjcm8gUkVRVUlSRTgKLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKLSAgICAuZW5kbQotCi0gICAgLm1hY3JvIFBSRVNFUlZFOAotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQotICAgIC5lbmRtCi0KLQotICAgIC5tYWNybyBmdW5jdGlvbiBuYW1lLCBleHBvcnQ9MAotLmlmIFxleHBvcnQKLSAgICAuZ2xvYmFsIFxuYW1lCi0uZW5kaWYKLSAgICAudHlwZSAgIFxuYW1lLCAlZnVuY3Rpb24KLVxuYW1lOgotICAgIC5lbmRtCi0KLSAgICAubWFjcm8gZW5kZnVuY3Rpb24KLSAgICAuZW5kbQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZENsZWFyTWJMYXllci5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RDbGVhck1iTGF5ZXIuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MyNzUyZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZENsZWFyTWJMYXllci5TCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotQAotQCBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotQAotQCBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLUAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotQCBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLUAKLUAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLUAKLUAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotQCBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotQCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLUAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotQCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLUAKLQotI2luY2x1ZGUgImFzbV9jb21tb24uUyIKLQotICAgIFBSRVNFUlZFOAotCi0gICAgLmZwdSBuZW9uCi0gICAgLnRleHQKLQotLyogSW5wdXQgLyBvdXRwdXQgcmVnaXN0ZXJzICovCi0jZGVmaW5lIHBNYkxheWVyICAgIHIwCi0jZGVmaW5lIHNpemUgICAgICAgIHIxCi0jZGVmaW5lIHBUbXAgICAgICAgIHIyCi0jZGVmaW5lIHN0ZXAgICAgICAgIHIzCi0KLS8qIC0tIE5FT04gcmVnaXN0ZXJzIC0tICovCi0KLSNkZWZpbmUgcVplcm8gICBRMAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RDbGVhck1iTGF5ZXIKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotCi0gICAgICAgIElucHV0czoKLQotICAgICAgICBPdXRwdXRzOgotCi0gICAgICAgIFJldHVybnM6Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWZ1bmN0aW9uIGgyNjRic2RDbGVhck1iTGF5ZXIsIGV4cG9ydD0xCi0KLSAgICBWTU9WLkk4IHFaZXJvLCAjMAotICAgIEFERCAgICAgcFRtcCwgcE1iTGF5ZXIsICMxNgotICAgIE1PViAgICAgc3RlcCwgIzMyCi0gICAgU1VCUyAgICBzaXplLCBzaXplLCAjNjQKLQotbG9vcDoKLSAgICBWU1QxLjggIHtxWmVyb30sIFtwTWJMYXllcl0sIHN0ZXAKLSAgICBTVUJTICAgIHNpemUsIHNpemUsICM2NAotICAgIFZTVDEuOCAge3FaZXJvfSwgW3BUbXBdLCBzdGVwCi0gICAgVlNUMS44ICB7cVplcm99LCBbcE1iTGF5ZXJdLCBzdGVwCi0gICAgVlNUMS44ICB7cVplcm99LCBbcFRtcF0sIHN0ZXAKLSAgICBCQ1MgICAgIGxvb3AKLQotICAgIEJYICAgICAgbHIKLQotZW5kZnVuY3Rpb24KLQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkQ291bnRMZWFkaW5nWmVyb3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkQ291bnRMZWFkaW5nWmVyb3MuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFjOWY2MC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZENvdW50TGVhZGluZ1plcm9zLlMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi1ACi1AIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci1ACi1AIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotQCB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi1AIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotQAotQCAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotQAotQCBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1AIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1AIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotQCBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1AIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotQAotI2luY2x1ZGUgImFzbV9jb21tb24uUyIKLQotICAgIFBSRVNFUlZFOAotICAgIC5hcm0KLSAgICAudGV4dAotCi0KLS8qIElucHV0IC8gb3V0cHV0IHJlZ2lzdGVycyAqLwotI2RlZmluZSB2YWx1ZSAgICByMAotCi0vKiAtLSBORU9OIHJlZ2lzdGVycyAtLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RDb3VudExlYWRpbmdaZXJvcwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0KLSAgICAgICAgSW5wdXRzOgotCi0gICAgICAgIE91dHB1dHM6Ci0KLSAgICAgICAgUmV0dXJuczoKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotZnVuY3Rpb24gaDI2NGJzZENvdW50TGVhZGluZ1plcm9zLCBleHBvcnQ9MQotCi0gICAgQ0xaICAgICB2YWx1ZSwgdmFsdWUKLSAgICBCWCAgICAgIGxyCi0KLWVuZGZ1bmN0aW9uCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkRmlsbFJvdzcuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkRmlsbFJvdzcuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVkNjIyNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZEZpbGxSb3c3LlMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotQAotQCBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotQAotQCBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLUAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotQCBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLUAKLUAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLUAKLUAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotQCBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotQCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLUAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotQCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLUAKLQotI2luY2x1ZGUgImFzbV9jb21tb24uUyIKLQotICAgIFBSRVNFUlZFOAotCi0gICAgLmZwdSBuZW9uCi0gICAgLnRleHQKLQotLyogSW5wdXQgLyBvdXRwdXQgcmVnaXN0ZXJzICovCi0KLSNkZWZpbmUgcmVmICAgICByMAotI2RlZmluZSBmaWxsICAgIHIxCi0jZGVmaW5lIGxlZnQgICAgcjIKLSNkZWZpbmUgdG1wMiAgICByMgotI2RlZmluZSBjZW50ZXIgIHIzCi0jZGVmaW5lIHJpZ2h0ICAgcjQKLSNkZWZpbmUgdG1wMSAgICByNQotCi0vKiAtLSBORU9OIHJlZ2lzdGVycyAtLSAqLwotCi0jZGVmaW5lIHFUbXAwICAgICBRMAotI2RlZmluZSBxVG1wMSAgICAgUTEKLSNkZWZpbmUgZFRtcDAgICAgIEQwCi0jZGVmaW5lIGRUbXAxICAgICBEMQotI2RlZmluZSBkVG1wMiAgICAgRDIKLSNkZWZpbmUgZFRtcDMgICAgIEQzCi0KLS8qCi12b2lkIGgyNjRic2RGaWxsUm93Nyhjb25zdCB1OCAqIHJlZiwgdTggKiBmaWxsLCBpMzIgbGVmdCwgaTMyIGNlbnRlciwKLSAgICAgICAgICAgICAgICAgICAgIGkzMiByaWdodCk7Ci0qLwotCi1mdW5jdGlvbiBoMjY0YnNkRmlsbFJvdzcsIGV4cG9ydD0xCi0KLSAgICAgICAgUFVTSCAgICAge3I0LXI2LGxyfQotICAgICAgICBDTVAgICAgICBsZWZ0LCAjMAotICAgICAgICBMRFIgICAgICByaWdodCwgW3NwLCMweDEwXQotICAgICAgICBCRVEgICAgICBzd2l0Y2hfY2VudGVyCi0gICAgICAgIExEUkIgICAgIHRtcDEsIFtyZWYsIzBdCi0KLWxvb3BfbGVmdDoKLSAgICAgICAgU1VCUyAgICAgbGVmdCwgbGVmdCwgIzEKLSAgICAgICAgU1RSQiAgICAgdG1wMSwgW2ZpbGxdLCAjMQotICAgICAgICBCTkUgICAgICBsb29wX2xlZnQKLQotc3dpdGNoX2NlbnRlcjoKLSAgICAgICAgQVNSICAgICAgdG1wMixjZW50ZXIsIzIKLSAgICAgICAgQ01QICAgICAgdG1wMiwjOQotICAgICAgICBBRERDQyAgICBwYyxwYyx0bXAyLExTTCAjMgotICAgICAgICBCICAgICAgICBsb29wX2NlbnRlcgotICAgICAgICBCICAgICAgICBsb29wX2NlbnRlcgotICAgICAgICBCICAgICAgICBjYXNlXzEKLSAgICAgICAgQiAgICAgICAgY2FzZV8yCi0gICAgICAgIEIgICAgICAgIGNhc2VfMwotICAgICAgICBCICAgICAgICBjYXNlXzQKLSAgICAgICAgQiAgICAgICAgY2FzZV81Ci0gICAgICAgIEIgICAgICAgIGNhc2VfNgotICAgICAgICBCICAgICAgICBjYXNlXzcKLSAgICAgICAgQiAgICAgICAgY2FzZV84Ci0KLWNhc2VfODoKLSAgICAgICAgVkxEMS44ICB7cVRtcDAsIHFUbXAxfSwgW3JlZl0hCi0gICAgICAgIFNVQiAgICAgY2VudGVyLCBjZW50ZXIsICMzMgotICAgICAgICBWU1QxLjggIHtxVG1wMH0sIFtmaWxsXSEKLSAgICAgICAgVlNUMS44ICB7cVRtcDF9LCBbZmlsbF0hCi0gICAgICAgIEIgICAgICAgbG9vcF9jZW50ZXIKLWNhc2VfNzoKLSAgICAgICAgVkxEMS44ICB7ZFRtcDAsZFRtcDEsZFRtcDJ9LCBbcmVmXSEKLSAgICAgICAgU1VCICAgICBjZW50ZXIsIGNlbnRlciwgIzI4Ci0gICAgICAgIExEUiAgICAgdG1wMiwgW3JlZl0sICM0Ci0gICAgICAgIFZTVDEuOCAge2RUbXAwLGRUbXAxLGRUbXAyfSwgW2ZpbGxdIQotICAgICAgICBTVFIgICAgIHRtcDIsIFtmaWxsXSwjNAotICAgICAgICBCICAgICAgIGxvb3BfY2VudGVyCi1jYXNlXzY6Ci0gICAgICAgIFZMRDEuOCAge2RUbXAwLGRUbXAxLGRUbXAyfSwgW3JlZl0hCi0gICAgICAgIFNVQiAgICAgY2VudGVyLCBjZW50ZXIsICMyNAotICAgICAgICBWU1QxLjggIHtkVG1wMCxkVG1wMSxkVG1wMn0sIFtmaWxsXSEKLSAgICAgICAgQiAgICAgICBsb29wX2NlbnRlcgotY2FzZV81OgotICAgICAgICBWTEQxLjggIHtxVG1wMH0sIFtyZWZdIQotICAgICAgICBTVUIgICAgIGNlbnRlciwgY2VudGVyLCAjMjAKLSAgICAgICAgTERSICAgICB0bXAyLCBbcmVmXSwgIzQKLSAgICAgICAgVlNUMS44ICB7cVRtcDB9LCBbZmlsbF0hCi0gICAgICAgIFNUUiAgICAgdG1wMiwgW2ZpbGxdLCM0Ci0gICAgICAgIEIgICAgICAgbG9vcF9jZW50ZXIKLWNhc2VfNDoKLSAgICAgICAgVkxEMS44ICB7cVRtcDB9LCBbcmVmXSEKLSAgICAgICAgU1VCICAgICBjZW50ZXIsIGNlbnRlciwgIzE2Ci0gICAgICAgIFZTVDEuOCAge3FUbXAwfSwgW2ZpbGxdIQotICAgICAgICBCICAgICAgIGxvb3BfY2VudGVyCi1jYXNlXzM6Ci0gICAgICAgIFZMRDEuOCAge2RUbXAwfSwgW3JlZl0hCi0gICAgICAgIFNVQiAgICAgY2VudGVyLCBjZW50ZXIsICMxMgotICAgICAgICBMRFIgICAgIHRtcDIsIFtyZWZdLCAjNAotICAgICAgICBWU1QxLjggIGRUbXAwLCBbZmlsbF0hCi0gICAgICAgIFNUUiAgICAgdG1wMiwgW2ZpbGxdLCM0Ci0gICAgICAgIEIgICAgICAgbG9vcF9jZW50ZXIKLWNhc2VfMjoKLSAgICAgICAgTERSICAgICAgdG1wMiwgW3JlZl0sIzQKLSAgICAgICAgU1VCICAgICAgY2VudGVyLCBjZW50ZXIsICM0Ci0gICAgICAgIFNUUiAgICAgIHRtcDIsIFtmaWxsXSwgIzQKLWNhc2VfMToKLSAgICAgICAgTERSICAgICAgdG1wMiwgW3JlZl0sIzQKLSAgICAgICAgU1VCICAgICAgY2VudGVyLCBjZW50ZXIsICM0Ci0gICAgICAgIFNUUiAgICAgIHRtcDIsIFtmaWxsXSwgIzQKLQotbG9vcF9jZW50ZXI6Ci0gICAgICAgIENNUCAgICAgIGNlbnRlciwgIzAKLSAgICAgICAgQkVRICAgICAganVtcAotICAgICAgICBMRFJCICAgICB0bXAyLCBbcmVmXSwgIzEKLSAgICAgICAgU1VCICAgICAgY2VudGVyLCBjZW50ZXIsICMxCi0gICAgICAgIFNUUkIgICAgIHRtcDIsIFtmaWxsXSwgIzEKLSAgICAgICAgQk5FICAgICAgbG9vcF9jZW50ZXIKLWp1bXA6Ci0gICAgICAgIENNUCAgICAgIHJpZ2h0LCMwCi0gICAgICAgIFBPUEVRICAgIHtyNC1yNixwY30KLSAgICAgICAgTERSQiAgICAgdG1wMiwgW3JlZiwjLTFdCi0KLWxvb3BfcmlnaHQ6Ci0gICAgICAgIFNUUkIgICAgIHRtcDIsIFtmaWxsXSwgIzEKLSAgICAgICAgU1VCUyAgICAgcmlnaHQsIHJpZ2h0LCAjMQotICAgICAgICBCTkUgICAgICBsb29wX3JpZ2h0Ci0KLSAgICAgICAgUE9QICAgICAge3I0LXI2LHBjfQotCi1lbmRmdW5jdGlvbgotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkRmx1c2hCaXRzLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZEZsdXNoQml0cy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTg4NDcxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkRmx1c2hCaXRzLlMKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi1ACi1AIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci1ACi1AIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotQCB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi1AIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotQAotQCAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotQAotQCBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1AIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1AIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotQCBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1AIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotQAotCi0jaW5jbHVkZSAiYXNtX2NvbW1vbi5TIgotCi0gICAgUFJFU0VSVkU4Ci0KLSAgICAuYXJtCi0gICAgLnRleHQKLQotLyogSW5wdXQgLyBvdXRwdXQgcmVnaXN0ZXJzICovCi0jZGVmaW5lIHBTdHJtRGF0YSAgICAgICByMAotI2RlZmluZSBudW1CaXRzICAgICAgICAgcjEKLSNkZWZpbmUgcmVhZEJpdHMgICAgICAgIHIyCi0jZGVmaW5lIHN0cm1CdWZmU2l6ZSAgICByMwotI2RlZmluZSBwU3RybUJ1ZmZTdGFydCAgcjEKLSNkZWZpbmUgcFN0cm1DdXJyUG9zICAgIHIyCi0jZGVmaW5lIGJpdFBvc0luV29yZCAgICByMQotCi0vKiBJbnB1dCAvIG91dHB1dCByZWdpc3RlcnMgKi8KLQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEZsdXNoQml0cwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0KLSAgICAgICAgSW5wdXRzOgotCi0gICAgICAgIE91dHB1dHM6Ci0KLSAgICAgICAgUmV0dXJuczoKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWZ1bmN0aW9uIGgyNjRic2RGbHVzaEJpdHMsIGV4cG9ydD0xCi0KLSAgICBMRFIgcmVhZEJpdHMsIFtwU3RybURhdGEsICMweDEwXQotICAgIExEUiBzdHJtQnVmZlNpemUsIFtwU3RybURhdGEsICMweENdCi0KLSAgICBBREQgcmVhZEJpdHMsIHJlYWRCaXRzLCBudW1CaXRzCi0gICAgQU5EIGJpdFBvc0luV29yZCwgcmVhZEJpdHMsICM3Ci0KLSAgICBTVFIgcmVhZEJpdHMsIFtwU3RybURhdGEsICMweDEwXQotICAgIFNUUiBiaXRQb3NJbldvcmQsIFtwU3RybURhdGEsICMweDhdCi0KLSAgICBMRFIgcFN0cm1CdWZmU3RhcnQsIFtwU3RybURhdGEsICMweDBdCi0KLSAgICBDTVAgcmVhZEJpdHMsIHN0cm1CdWZmU2l6ZSwgTFNMICMzCi0KLSAgICBCSEkgZW5kX29mX3N0cmVhbQotCi0gICAgQUREIHBTdHJtQ3VyclBvcywgcFN0cm1CdWZmU3RhcnQsIHJlYWRCaXRzLCBMU1IgIzMKLSAgICBTVFIgcFN0cm1DdXJyUG9zLCBbcFN0cm1EYXRhLCAjMHg0XQotICAgIE1PViByMCwgIzAKLSAgICBCWCAgbHIKLQotZW5kX29mX3N0cmVhbToKLSAgICBNVk4gcjAsICMwCi0gICAgQlggIGxyCi0KLWVuZGZ1bmN0aW9uCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RXcml0ZU1hY3JvYmxvY2suUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkV3JpdGVNYWNyb2Jsb2NrLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwOTNiOTIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RXcml0ZU1hY3JvYmxvY2suUworKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi1ACi1AIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci1ACi1AIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotQCB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi1AIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotQAotQCAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotQAotQCBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1AIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1AIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotQCBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1AIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotQAotCi0jaW5jbHVkZSAiYXNtX2NvbW1vbi5TIgotCi0gICAgUkVRVUlSRTgKLSAgICBQUkVTRVJWRTgKLQotICAgIC5hcm0KLSAgICAuZnB1IG5lb24KLSAgICAudGV4dAotCi0vKiBJbnB1dCAvIG91dHB1dCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgaW1hZ2UgICByMAotI2RlZmluZSBkYXRhICAgIHIxCi0jZGVmaW5lIHdpZHRoICAgcjIKLSNkZWZpbmUgbHVtYSAgICByMwotI2RlZmluZSBjYiAgICAgIHI0Ci0jZGVmaW5lIGNyICAgICAgcjUKLSNkZWZpbmUgY3dpZHRoICByNgotCi0vKiAtLSBORU9OIHJlZ2lzdGVycyAtLSAqLwotCi0jZGVmaW5lIHFSb3cwICAgICBRMAotI2RlZmluZSBxUm93MSAgICAgUTEKLSNkZWZpbmUgcVJvdzIgICAgIFEyCi0jZGVmaW5lIHFSb3czICAgICBRMwotI2RlZmluZSBxUm93NCAgICAgUTQKLSNkZWZpbmUgcVJvdzUgICAgIFE1Ci0jZGVmaW5lIHFSb3c2ICAgICBRNgotI2RlZmluZSBxUm93NyAgICAgUTcKLSNkZWZpbmUgcVJvdzggICAgIFE4Ci0jZGVmaW5lIHFSb3c5ICAgICBROQotI2RlZmluZSBxUm93MTAgICAgUTEwCi0jZGVmaW5lIHFSb3cxMSAgICBRMTEKLSNkZWZpbmUgcVJvdzEyICAgIFExMgotI2RlZmluZSBxUm93MTMgICAgUTEzCi0jZGVmaW5lIHFSb3cxNCAgICBRMTQKLSNkZWZpbmUgcVJvdzE1ICAgIFExNQotCi0jZGVmaW5lIGRSb3cwICAgICBEMAotI2RlZmluZSBkUm93MSAgICAgRDEKLSNkZWZpbmUgZFJvdzIgICAgIEQyCi0jZGVmaW5lIGRSb3czICAgICBEMwotI2RlZmluZSBkUm93NCAgICAgRDQKLSNkZWZpbmUgZFJvdzUgICAgIEQ1Ci0jZGVmaW5lIGRSb3c2ICAgICBENgotI2RlZmluZSBkUm93NyAgICAgRDcKLSNkZWZpbmUgZFJvdzggICAgIEQ4Ci0jZGVmaW5lIGRSb3c5ICAgICBEOQotI2RlZmluZSBkUm93MTAgICAgRDEwCi0jZGVmaW5lIGRSb3cxMSAgICBEMTEKLSNkZWZpbmUgZFJvdzEyICAgIEQxMgotI2RlZmluZSBkUm93MTMgICAgRDEzCi0jZGVmaW5lIGRSb3cxNCAgICBEMTQKLSNkZWZpbmUgZFJvdzE1ICAgIEQxNQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RXcml0ZU1hY3JvYmxvY2sKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgV3JpdGUgb25lIG1hY3JvYmxvY2sgaW50byB0aGUgaW1hZ2UuIEJvdGggbHVtYSBhbmQgY2hyb21hCi0gICAgICAgICAgICBjb21wb25lbnRzIHdpbGwgYmUgd3JpdHRlbiBhdCB0aGUgc2FtZSB0aW1lLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIGRhdGEgICAgcG9pbnRlciB0byBtYWNyb2Jsb2NrIGRhdGEgdG8gYmUgd3JpdHRlbiwgMjU2IHZhbHVlcyBmb3IKLSAgICAgICAgICAgICAgICAgICAgbHVtYSBmb2xsb3dlZCBieSA2NCB2YWx1ZXMgZm9yIGJvdGggY2hyb21hIGNvbXBvbmVudHMKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgaW1hZ2UgICBwb2ludGVyIHRvIHRoZSBpbWFnZSB3aGVyZSB0aGUgbWFjcm9ibG9jayB3aWxsIGJlIHdyaXR0ZW4KLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgbm9uZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1mdW5jdGlvbiBoMjY0YnNkV3JpdGVNYWNyb2Jsb2NrLCBleHBvcnQ9MQotICAgIFBVU0ggICAge3I0LXI2LGxyfQotICAgIFZQVVNIICAge3E0LXE3fQotCi0gICAgTERSICAgICB3aWR0aCwgW2ltYWdlLCAjNF0KLSAgICBMRFIgICAgIGx1bWEsIFtpbWFnZSwgIzB4Q10KLSAgICBMRFIgICAgIGNiLCBbaW1hZ2UsICMweDEwXQotICAgIExEUiAgICAgY3IsIFtpbWFnZSwgIzB4MTRdCi0KLQotQCAgIFdyaXRlIGx1bWEKLSAgICBWTEQxLjggIHtxUm93MCwgcVJvdzF9LCBbZGF0YV0hCi0gICAgTFNMICAgICB3aWR0aCwgd2lkdGgsICM0Ci0gICAgVkxEMS44ICB7cVJvdzIsIHFSb3czfSwgW2RhdGFdIQotICAgIExTUiAgICAgY3dpZHRoLCB3aWR0aCwgIzEKLSAgICBWU1QxLjggIHtxUm93MH0sIFtsdW1hLDoxMjhdLCB3aWR0aAotICAgIFZMRDEuOCAge3FSb3c0LCBxUm93NX0sIFtkYXRhXSEKLSAgICBWU1QxLjggIHtxUm93MX0sIFtsdW1hLDoxMjhdLCB3aWR0aAotICAgIFZMRDEuOCAge3FSb3c2LCBxUm93N30sIFtkYXRhXSEKLSAgICBWU1QxLjggIHtxUm93Mn0sIFtsdW1hLDoxMjhdLCB3aWR0aAotICAgIFZMRDEuOCAge3FSb3c4LCBxUm93OX0sIFtkYXRhXSEKLSAgICBWU1QxLjggIHtxUm93M30sIFtsdW1hLDoxMjhdLCB3aWR0aAotICAgIFZMRDEuOCAge3FSb3cxMCwgcVJvdzExfSwgW2RhdGFdIQotICAgIFZTVDEuOCAge3FSb3c0fSwgW2x1bWEsOjEyOF0sIHdpZHRoCi0gICAgVkxEMS44ICB7cVJvdzEyLCBxUm93MTN9LCBbZGF0YV0hCi0gICAgVlNUMS44ICB7cVJvdzV9LCBbbHVtYSw6MTI4XSwgd2lkdGgKLSAgICBWTEQxLjggIHtxUm93MTQsIHFSb3cxNX0sIFtkYXRhXSEKLSAgICBWU1QxLjggIHtxUm93Nn0sIFtsdW1hLDoxMjhdLCB3aWR0aAotCi0gICAgVkxEMS44ICB7cVJvdzAsIHFSb3cxfSwgW2RhdGFdISA7Ly9jYiByb3dzIDAsMSwyLDMKLSAgICBWU1QxLjggIHtxUm93N30sIFtsdW1hLDoxMjhdLCB3aWR0aAotICAgIFZMRDEuOCAge3FSb3cyLCBxUm93M30sIFtkYXRhXSEgOy8vY2Igcm93cyA0LDUsNiw3Ci0gICAgVlNUMS44ICB7cVJvdzh9LCBbbHVtYSw6MTI4XSwgd2lkdGgKLSAgICBWTEQxLjggIHtxUm93NCwgcVJvdzV9LCBbZGF0YV0hIDsvL2NyIHJvd3MgMCwxLDIsMwotICAgIFZTVDEuOCAge3FSb3c5fSwgW2x1bWEsOjEyOF0sIHdpZHRoCi0gICAgVkxEMS44ICB7cVJvdzYsIHFSb3c3fSwgW2RhdGFdISA7Ly9jciByb3dzIDQsNSw2LDcKLSAgICBWU1QxLjggIHtxUm93MTB9LCBbbHVtYSw6MTI4XSwgd2lkdGgKLSAgICBWU1QxLjggIHtkUm93MH0sIFtjYiw6NjRdLCBjd2lkdGgKLSAgICBWU1QxLjggIHtkUm93OH0sIFtjciw6NjRdLCBjd2lkdGgKLSAgICBWU1QxLjggIHtxUm93MTF9LCBbbHVtYSw6MTI4XSwgd2lkdGgKLSAgICBWU1QxLjggIHtkUm93MX0sIFtjYiw6NjRdLCBjd2lkdGgKLSAgICBWU1QxLjggIHtkUm93OX0sIFtjciw6NjRdLCBjd2lkdGgKLSAgICBWU1QxLjggIHtxUm93MTJ9LCBbbHVtYSw6MTI4XSwgd2lkdGgKLSAgICBWU1QxLjggIHtkUm93Mn0sIFtjYiw6NjRdLCBjd2lkdGgKLSAgICBWU1QxLjggIHtkUm93MTB9LCBbY3IsOjY0XSwgY3dpZHRoCi0gICAgVlNUMS44ICB7cVJvdzEzfSwgW2x1bWEsOjEyOF0sIHdpZHRoCi0gICAgVlNUMS44ICB7ZFJvdzN9LCBbY2IsOjY0XSwgY3dpZHRoCi0gICAgVlNUMS44ICB7ZFJvdzExfSwgW2NyLDo2NF0sIGN3aWR0aAotICAgIFZTVDEuOCAge3FSb3cxNH0sIFtsdW1hLDoxMjhdLCB3aWR0aAotICAgIFZTVDEuOCAge2RSb3c0fSwgW2NiLDo2NF0sIGN3aWR0aAotICAgIFZTVDEuOCAge2RSb3cxMn0sIFtjciw6NjRdLCBjd2lkdGgKLSAgICBWU1QxLjggIHtxUm93MTV9LCBbbHVtYV0KLSAgICBWU1QxLjggIHtkUm93NX0sIFtjYiw6NjRdLCBjd2lkdGgKLSAgICBWU1QxLjggIHtkUm93MTN9LCBbY3IsOjY0XSwgY3dpZHRoCi0gICAgVlNUMS44ICB7ZFJvdzZ9LCBbY2IsOjY0XSwgY3dpZHRoCi0gICAgVlNUMS44ICB7ZFJvdzE0fSwgW2NyLDo2NF0sIGN3aWR0aAotICAgIFZTVDEuOCAge2RSb3c3fSwgW2NiLDo2NF0KLSAgICBWU1QxLjggIHtkUm93MTV9LCBbY3IsOjY0XQotCi0gICAgVlBPUCAgICB7cTQtcTd9Ci0gICAgUE9QICAgICB7cjQtcjYscGN9Ci1AICAgIEJYICAgICAgbHIKLQotCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2J5dGVfc3RyZWFtLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfYnl0ZV9zdHJlYW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI3N2Y4Yy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfYnl0ZV9zdHJlYW0uYworKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0gICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0gICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgICAgNS4gRnVuY3Rpb25zCi0gICAgICAgICAgRXh0cmFjdE5hbFVuaXQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJoMjY0YnNkX2J5dGVfc3RyZWFtLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgQllURV9TVFJFQU1fRVJST1IgIDB4RkZGRkZGRkYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogRXh0cmFjdE5hbFVuaXQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRXh0cmFjdHMgb25lIE5BTCB1bml0IGZyb20gdGhlIGJ5dGUgc3RyZWFtIGJ1ZmZlci4gUmVtb3ZlcwotICAgICAgICAgICAgZW11bGF0aW9uIHByZXZlbnRpb24gYnl0ZXMgaWYgcHJlc2VudC4gVGhlIG9yaWdpbmFsIHN0cmVhbSBidWZmZXIKLSAgICAgICAgICAgIGlzIHVzZWQgZGlyZWN0bHkgYW5kIGlzIHRoZXJlZm9yZSBtb2RpZmllZCBpZiBlbXVsYXRpb24gcHJldmVudGlvbgotICAgICAgICAgICAgYnl0ZXMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cmVhbS4KLQotICAgICAgICAgICAgU3RyZWFtIGJ1ZmZlciBpcyBhc3N1bWVkIHRvIGNvbnRhaW4gZWl0aGVyIGV4YWN0bHkgb25lIE5BTCB1bml0Ci0gICAgICAgICAgICBhbmQgbm90aGluZyBlbHNlLCBvciBvbmUgb3IgbW9yZSBOQUwgdW5pdHMgZW1iZWRkZWQgaW4gYnl0ZQotICAgICAgICAgICAgc3RyZWFtIGZvcm1hdCBkZXNjcmliZWQgaW4gdGhlIEFubmV4IEIgb2YgdGhlIHN0YW5kYXJkLiBGdW5jdGlvbgotICAgICAgICAgICAgZGV0ZWN0cyB3aGljaCBvbmUgaXMgdXNlZCBiYXNlZCBvbiB0aGUgZmlyc3QgYnl0ZXMgaW4gdGhlIGJ1ZmZlci4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwQnl0ZVN0cmVhbSAgICAgcG9pbnRlciB0byBieXRlIHN0cmVhbSBidWZmZXIKLSAgICAgICAgICAgIGxlbiAgICAgICAgICAgICBsZW5ndGggb2YgdGhlIHN0cmVhbSBidWZmZXIgKGluIGJ5dGVzKQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBwU3RybURhdGEgICAgICAgc3RyZWFtIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBoZXJlCi0gICAgICAgICAgICByZWFkQnl0ZXMgICAgICAgbnVtYmVyIG9mIGJ5dGVzICJjb25zdW1lZCIgZnJvbSB0aGUgc3RyZWFtIGJ1ZmZlcgotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcwotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGVycm9yIGluIGJ5dGUgc3RyZWFtCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkRXh0cmFjdE5hbFVuaXQodTggKnBCeXRlU3RyZWFtLCB1MzIgbGVuLCBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gICAgdTMyICpyZWFkQnl0ZXMpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGksIHRtcDsKLSAgICB1MzIgYnl0ZUNvdW50LGluaXRCeXRlQ291bnQ7Ci0gICAgdTMyIHplcm9Db3VudDsKLSAgICB1OCAgYnl0ZTsKLSAgICB1MzIgaGFzRW11bGF0aW9uID0gSEFOVFJPX0ZBTFNFOwotICAgIHUzMiBpbnZhbGlkU3RyZWFtID0gSEFOVFJPX0ZBTFNFOwotICAgIHU4ICpyZWFkUHRyLCAqd3JpdGVQdHI7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwQnl0ZVN0cmVhbSk7Ci0gICAgQVNTRVJUKGxlbik7Ci0gICAgQVNTRVJUKGxlbiA8IEJZVEVfU1RSRUFNX0VSUk9SKTsKLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLQotICAgIC8qIGJ5dGUgc3RyZWFtIGZvcm1hdCBpZiBzdGFydHMgd2l0aCAweDAwMDAwMSBvciAweDAwMDAwMCAqLwotICAgIGlmIChsZW4gPiAzICYmIHBCeXRlU3RyZWFtWzBdID09IDB4MDAgJiYgcEJ5dGVTdHJlYW1bMV0gPT0gMHgwMCAmJgotICAgICAgICAocEJ5dGVTdHJlYW1bMl0mMHhGRSkgPT0gMHgwMCkKLSAgICB7Ci0gICAgICAgIC8qIHNlYXJjaCBmb3IgTkFMIHVuaXQgc3RhcnQgcG9pbnQsIGkuZS4gcG9pbnQgYWZ0ZXIgZmlyc3Qgc3RhcnQgY29kZQotICAgICAgICAgKiBwcmVmaXggaW4gdGhlIHN0cmVhbSAqLwotICAgICAgICB6ZXJvQ291bnQgPSBieXRlQ291bnQgPSAyOwotICAgICAgICByZWFkUHRyID0gcEJ5dGVTdHJlYW0gKyAyOwotICAgICAgICAvKmxpbnQgLWUoNzE2KSB3aGlsZSgxKSB1c2VkIGNvbnNjaW91c2x5ICovCi0gICAgICAgIHdoaWxlICgxKQotICAgICAgICB7Ci0gICAgICAgICAgICBieXRlID0gKnJlYWRQdHIrKzsKLSAgICAgICAgICAgIGJ5dGVDb3VudCsrOwotCi0gICAgICAgICAgICBpZiAoYnl0ZUNvdW50ID09IGxlbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBubyBzdGFydCBjb2RlIHByZWZpeCBmb3VuZCAtPiBlcnJvciAqLwotICAgICAgICAgICAgICAgICpyZWFkQnl0ZXMgPSBsZW47Ci0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWJ5dGUpCi0gICAgICAgICAgICAgICAgemVyb0NvdW50Kys7Ci0gICAgICAgICAgICBlbHNlIGlmICgoYnl0ZSA9PSAweDAxKSAmJiAoemVyb0NvdW50ID49IDIpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHplcm9Db3VudCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpbml0Qnl0ZUNvdW50ID0gYnl0ZUNvdW50OwotCi0gICAgICAgIC8qIGRldGVybWluZSBzaXplIG9mIHRoZSBOQUwgdW5pdC4gU2VhcmNoIGZvciBuZXh0IHN0YXJ0IGNvZGUgcHJlZml4Ci0gICAgICAgICAqIG9yIGVuZCBvZiBzdHJlYW0gYW5kIGlnbm9yZSBwb3NzaWJsZSB0cmFpbGluZyB6ZXJvIGJ5dGVzICovCi0gICAgICAgIHplcm9Db3VudCA9IDA7Ci0gICAgICAgIC8qbGludCAtZSg3MTYpIHdoaWxlKDEpIHVzZWQgY29uc2Npb3VzbHkgKi8KLSAgICAgICAgd2hpbGUgKDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ5dGUgPSAqcmVhZFB0cisrOwotICAgICAgICAgICAgYnl0ZUNvdW50Kys7Ci0gICAgICAgICAgICBpZiAoIWJ5dGUpCi0gICAgICAgICAgICAgICAgemVyb0NvdW50Kys7Ci0KLSAgICAgICAgICAgIGlmICggKGJ5dGUgPT0gMHgwMykgJiYgKHplcm9Db3VudCA9PSAyKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaGFzRW11bGF0aW9uID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICggKGJ5dGUgPT0gMHgwMSkgJiYgKHplcm9Db3VudCA+PSAyICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBTdHJtRGF0YS0+c3RybUJ1ZmZTaXplID0KLSAgICAgICAgICAgICAgICAgICAgYnl0ZUNvdW50IC0gaW5pdEJ5dGVDb3VudCAtIHplcm9Db3VudCAtIDE7Ci0gICAgICAgICAgICAgICAgemVyb0NvdW50IC09IE1JTih6ZXJvQ291bnQsIDMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoYnl0ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoemVyb0NvdW50ID49IDMpCi0gICAgICAgICAgICAgICAgICAgIGludmFsaWRTdHJlYW0gPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgICAgICAgICB6ZXJvQ291bnQgPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoYnl0ZUNvdW50ID09IGxlbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwU3RybURhdGEtPnN0cm1CdWZmU2l6ZSA9IGJ5dGVDb3VudCAtIGluaXRCeXRlQ291bnQgLSB6ZXJvQ291bnQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgIH0KLSAgICAvKiBzZXBhcmF0ZSBOQUwgdW5pdHMgYXMgaW5wdXQgLT4ganVzdCBzZXQgc3RyZWFtIHBhcmFtcyAqLwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGluaXRCeXRlQ291bnQgPSAwOwotICAgICAgICB6ZXJvQ291bnQgPSAwOwotICAgICAgICBwU3RybURhdGEtPnN0cm1CdWZmU2l6ZSA9IGxlbjsKLSAgICAgICAgaGFzRW11bGF0aW9uID0gSEFOVFJPX1RSVUU7Ci0gICAgfQotCi0gICAgcFN0cm1EYXRhLT5wU3RybUJ1ZmZTdGFydCAgICA9IHBCeXRlU3RyZWFtICsgaW5pdEJ5dGVDb3VudDsKLSAgICBwU3RybURhdGEtPnBTdHJtQ3VyclBvcyAgICAgID0gcFN0cm1EYXRhLT5wU3RybUJ1ZmZTdGFydDsKLSAgICBwU3RybURhdGEtPmJpdFBvc0luV29yZCAgICAgID0gMDsKLSAgICBwU3RybURhdGEtPnN0cm1CdWZmUmVhZEJpdHMgID0gMDsKLQotICAgIC8qIHJldHVybiBudW1iZXIgb2YgYnl0ZXMgImNvbnN1bWVkIiAqLwotICAgICpyZWFkQnl0ZXMgPSBwU3RybURhdGEtPnN0cm1CdWZmU2l6ZSArIGluaXRCeXRlQ291bnQgKyB6ZXJvQ291bnQ7Ci0KLSAgICBpZiAoaW52YWxpZFN0cmVhbSkKLSAgICB7Ci0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0KLSAgICAvKiByZW1vdmUgZW11bGF0aW9uIHByZXZlbnRpb24gYnl0ZXMgYmVmb3JlIHJic3AgcHJvY2Vzc2luZyAqLwotICAgIGlmIChoYXNFbXVsYXRpb24pCi0gICAgewotICAgICAgICB0bXAgPSBwU3RybURhdGEtPnN0cm1CdWZmU2l6ZTsKLSAgICAgICAgcmVhZFB0ciA9IHdyaXRlUHRyID0gcFN0cm1EYXRhLT5wU3RybUJ1ZmZTdGFydDsKLSAgICAgICAgemVyb0NvdW50ID0gMDsKLSAgICAgICAgZm9yIChpID0gdG1wOyBpLS07KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKHplcm9Db3VudCA9PSAyKSAmJiAoKnJlYWRQdHIgPT0gMHgwMykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogZW11bGF0aW9uIHByZXZlbnRpb24gYnl0ZSBzaGFsbCBiZSBmb2xsb3dlZCBieSBvbmUgb2YgdGhlCi0gICAgICAgICAgICAgICAgICogZm9sbG93aW5nIGJ5dGVzOiAweDAwLCAweDAxLCAweDAyLCAweDAzLiBUaGlzIGltcGxpZXMgdGhhdAotICAgICAgICAgICAgICAgICAqIGVtdWxhdGlvbiBwcmV2ZW50aW9uIDB4MDMgYnl0ZSBzaGFsbCBub3QgYmUgdGhlIGxhc3QgYnl0ZQotICAgICAgICAgICAgICAgICAqIG9mIHRoZSBzdHJlYW0uICovCi0gICAgICAgICAgICAgICAgaWYgKCAoaSA9PSAwKSB8fCAoKihyZWFkUHRyKzEpID4gMHgwMykgKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAgICAgICAgICAgICAvKiBkbyBub3Qgd3JpdGUgZW11bGF0aW9uIHByZXZlbnRpb24gYnl0ZSAqLwotICAgICAgICAgICAgICAgIHJlYWRQdHIrKzsKLSAgICAgICAgICAgICAgICB6ZXJvQ291bnQgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIE5BTCB1bml0IHNoYWxsIG5vdCBjb250YWluIGJ5dGUgc2VxdWVuY2VzIDB4MDAwMDAwLAotICAgICAgICAgICAgICAgICAqIDB4MDAwMDAxIG9yIDB4MDAwMDAyICovCi0gICAgICAgICAgICAgICAgaWYgKCAoemVyb0NvdW50ID09IDIpICYmICgqcmVhZFB0ciA8PSAweDAyKSApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgICAgICAgICAgICAgIGlmICgqcmVhZFB0ciA9PSAwKQotICAgICAgICAgICAgICAgICAgICB6ZXJvQ291bnQrKzsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHplcm9Db3VudCA9IDA7Ci0KLSAgICAgICAgICAgICAgICAqd3JpdGVQdHIrKyA9ICpyZWFkUHRyKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiAocmVhZFB0ciAtIHdyaXRlUHRyKSBpbmRpY2F0ZXMgbnVtYmVyIG9mICJyZW1vdmVkIiBlbXVsYXRpb24KLSAgICAgICAgICogcHJldmVudGlvbiBieXRlcyAtPiBzdWJ0cmFjdCBmcm9tIHN0cmVhbSBidWZmZXIgc2l6ZSAqLwotICAgICAgICBwU3RybURhdGEtPnN0cm1CdWZmU2l6ZSAtPSAodTMyKShyZWFkUHRyIC0gd3JpdGVQdHIpOwotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9ieXRlX3N0cmVhbS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2J5dGVfc3RyZWFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YWVjNzYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2J5dGVfc3RyZWFtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotICAgIDMuIERhdGEgdHlwZXMKLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSDI2NFNXREVDX0JZVEVfU1RSRUFNX0gKLSNkZWZpbmUgSDI2NFNXREVDX0JZVEVfU1RSRUFNX0gKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gRGF0YSB0eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZEV4dHJhY3ROYWxVbml0KHU4ICpwQnl0ZVN0cmVhbSwgdTMyIGxlbiwgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICAgIHUzMiAqcmVhZEJ5dGVzKTsKLQotI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfQllURV9TVFJFQU1fSCAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY2F2bGMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jYXZsYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjJkN2JhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jYXZsYy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTE2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLSAgICAgMy4gTW9kdWxlIGRlZmluZXMKLSAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotICAgICA1LiBGdW5jdGlvbnMKLSAgICAgICAgICBEZWNvZGVDb2VmZlRva2VuCi0gICAgICAgICAgRGVjb2RlTGV2ZWxQcmVmaXgKLSAgICAgICAgICBEZWNvZGVUb3RhbFplcm9zCi0gICAgICAgICAgRGVjb2RlUnVuQmVmb3JlCi0gICAgICAgICAgRGVjb2RlUmVzaWR1YWxCbG9ja0NhdmxjCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiaDI2NGJzZF9jYXZsYy5oIgotI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBGb2xsb3dpbmcgZGVzY3JpcHRpb25zIHVzZSB0ZXJtICJpbmZvcm1hdGlvbiBmaWVsZCIgdG8gcmVwcmVzZW50IGNvbWJpbmF0aW9uCi0gKiBvZiBjZXJ0YWluIGRlY29kZWQgc3ltYm9sIHZhbHVlIGFuZCB0aGUgbGVuZ3RoIG9mIHRoZSBjb3JyZXNwb25kaW5nIHZhcmlhYmxlCi0gKiBsZW5ndGggY29kZSB3b3JkLiBGb3IgZXhhbXBsZSwgdG90YWxfemVyb3MgaW5mb3JtYXRpb24gZmllbGQgY29uc2lzdHMgb2YKLSAqIDQgYml0cyBzeW1ib2wgdmFsdWUgKGJpdHMgWzQsN10pIGFsb25nIHdpdGggZm91ciBiaXRzIHRvIHJlcHJlc2VudCBsZW5ndGgKLSAqIG9mIHRoZSBWTEMgY29kZSB3b3JkIChiaXRzIFswLDNdKSAqLwotCi0vKiBtYWNybyB0byBvYnRhaW4gbGVuZ3RoIG9mIHRoZSBjb2VmZiB0b2tlbiBpbmZvcm1hdGlvbiBmaWVsZCwgYml0cyBbMCw0XSAgKi8KLSNkZWZpbmUgTEVOR1RIX1RDKHZsYykgKCh2bGMpICYgMHgxRikKLS8qIG1hY3JvIHRvIG9idGFpbiBsZW5ndGggb2YgdGhlIG90aGVyIGluZm9ybWF0aW9uIGZpZWxkcywgYml0cyBbMCwzXSAqLwotI2RlZmluZSBMRU5HVEgodmxjKSAoKHZsYykgJiAweEYpCi0vKiBtYWNybyB0byBvYnRhaW4gY29kZSB3b3JkIGZyb20gdGhlIGluZm9ybWF0aW9uIGZpZWxkcywgYml0cyBbNCw3XSAqLwotI2RlZmluZSBJTkZPKHZsYykgKCgodmxjKSA+PiA0KSAmIDB4RikgIC8qIDQgTVNCIGJpdHMgY29udGFpbiBpbmZvcm1hdGlvbiAqLwotLyogbWFjcm8gdG8gb2J0YWluIHRyYWlsaW5nIG9uZXMgZnJvbSB0aGUgY29lZmYgdG9rZW4gaW5mb3JtYXRpb24gd29yZCwKLSAqIGJpdHMgWzUsMTBdICovCi0jZGVmaW5lIFRSQUlMSU5HX09ORVMoY29lZmZUb2tlbikgKCgoY29lZmZUb2tlbik+PjUpICYgMHgzRikKLS8qIG1hY3JvIHRvIG9idGFpbiB0b3RhbCBjb2VmZiBmcm9tIHRoZSBjb2VmZiB0b2tlbiBpbmZvcm1hdGlvbiB3b3JkLAotICogYml0cyBbMTEsMTVdICovCi0jZGVmaW5lIFRPVEFMX0NPRUZGKGNvZWZmVG9rZW4pICgoKGNvZWZmVG9rZW4pID4+IDExKSAmIDB4MUYpCi0KLSNkZWZpbmUgVkxDX05PVF9GT1VORCAweEZGRkZGRkZFVQotCi0vKiBWTEMgdGFibGVzIGZvciBjb2VmZl90b2tlbi4gQmVjYXVzZSBvZiBsb25nIGNvZGVzIChtYXguIDE2IGJpdHMpIHNvbWUgb2YgdGhlCi0gKiB0YWJsZXMgaGF2ZSBiZWVuIHNwbGl0dGVkIGludG8gbXVsdGlwbGUgc2VwYXJhdGUgdGFibGVzLiBFYWNoIGFycmF5L3RhYmxlCi0gKiBlbGVtZW50IGhhcyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKLSAqIFs1IGJpdHMgZm9yIHRvdC5jb2VmZi5dIFs2IGJpdHMgZm9yIHRyLm9uZXNdIFs1IGJpdHMgZm9yIFZMQyBsZW5ndGhdCi0gKiBJZiB0aGVyZSBpcyBhIDB4MDAwMCB2YWx1ZSwgaXQgbWVhbnMgdGhhdCB0aGVyZSBpcyBub3QgY29ycmVzcG9uZGluZyBWTEMKLSAqIGNvZGV3b3JkIGZvciB0aGF0IGluZGV4LiAqLwotCi0vKiBWTEMgbGVuZ3RocyB1cCB0byA2IGJpdHMsIDAgPD0gbkMgPCAyICovCi1zdGF0aWMgY29uc3QgdTE2IGNvZWZmVG9rZW4wXzBbMzJdID0gewotICAgIDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MjA2NiwweDEwMjYsMHgwODA2LDB4MTg2NSwweDE4NjUsCi0gICAgMHgxMDQzLDB4MTA0MywweDEwNDMsMHgxMDQzLDB4MTA0MywweDEwNDMsMHgxMDQzLDB4MTA0MywKLSAgICAweDA4MjIsMHgwODIyLDB4MDgyMiwweDA4MjIsMHgwODIyLDB4MDgyMiwweDA4MjIsMHgwODIyLAotICAgIDB4MDgyMiwweDA4MjIsMHgwODIyLDB4MDgyMiwweDA4MjIsMHgwODIyLDB4MDgyMiwweDA4MjJ9OwotCi0vKiBWTEMgbGVuZ3RocyB1cCB0byAxMCBiaXRzLCAwIDw9IG5DIDwgMiAqLwotc3RhdGljIGNvbnN0IHUxNiBjb2VmZlRva2VuMF8xWzQ4XSA9IHsKLSAgICAweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHg0MDZhLDB4MzA0YSwweDI4MmEsMHgyMDBhLAotICAgIDB4Mzg2OSwweDM4NjksMHgyODQ5LDB4Mjg0OSwweDIwMjksMHgyMDI5LDB4MTgwOSwweDE4MDksCi0gICAgMHgzMDY4LDB4MzA2OCwweDMwNjgsMHgzMDY4LDB4MjA0OCwweDIwNDgsMHgyMDQ4LDB4MjA0OCwKLSAgICAweDE4MjgsMHgxODI4LDB4MTgyOCwweDE4MjgsMHgxMDA4LDB4MTAwOCwweDEwMDgsMHgxMDA4LAotICAgIDB4Mjg2NywweDI4NjcsMHgyODY3LDB4Mjg2NywweDI4NjcsMHgyODY3LDB4Mjg2NywweDI4NjcsCi0gICAgMHgxODQ3LDB4MTg0NywweDE4NDcsMHgxODQ3LDB4MTg0NywweDE4NDcsMHgxODQ3LDB4MTg0N307Ci0KLS8qIFZMQyBsZW5ndGhzIHVwIHRvIDE0IGJpdHMsIDAgPD0gbkMgPCAyICovCi1zdGF0aWMgY29uc3QgdTE2IGNvZWZmVG9rZW4wXzJbNTZdID0gewotICAgIDB4NjA2ZSwweDU4NGUsMHg1MDJlLDB4NTAwZSwweDU4NmUsMHg1MDRlLDB4NDgyZSwweDQ4MGUsCi0gICAgMHg0MDBkLDB4NDAwZCwweDQ4NGQsMHg0ODRkLDB4NDAyZCwweDQwMmQsMHgzODBkLDB4MzgwZCwKLSAgICAweDUwNmQsMHg1MDZkLDB4NDA0ZCwweDQwNGQsMHgzODJkLDB4MzgyZCwweDMwMGQsMHgzMDBkLAotICAgIDB4NDg2YiwweDQ4NmIsMHg0ODZiLDB4NDg2YiwweDQ4NmIsMHg0ODZiLDB4NDg2YiwweDQ4NmIsCi0gICAgMHgzODRiLDB4Mzg0YiwweDM4NGIsMHgzODRiLDB4Mzg0YiwweDM4NGIsMHgzODRiLDB4Mzg0YiwKLSAgICAweDMwMmIsMHgzMDJiLDB4MzAyYiwweDMwMmIsMHgzMDJiLDB4MzAyYiwweDMwMmIsMHgzMDJiLAotICAgIDB4MjgwYiwweDI4MGIsMHgyODBiLDB4MjgwYiwweDI4MGIsMHgyODBiLDB4MjgwYiwweDI4MGJ9OwotCi0vKiBWTEMgbGVuZ3RocyB1cCB0byAxNiBiaXRzLCAwIDw9IG5DIDwgMiAqLwotc3RhdGljIGNvbnN0IHUxNiBjb2VmZlRva2VuMF8zWzMyXSA9IHsKLSAgICAweDAwMDAsMHgwMDAwLDB4NjgyZiwweDY4MmYsMHg4MDEwLDB4ODA1MCwweDgwMzAsMHg3ODEwLAotICAgIDB4ODA3MCwweDc4NTAsMHg3ODMwLDB4NzAxMCwweDc4NzAsMHg3MDUwLDB4NzAzMCwweDY4MTAsCi0gICAgMHg3MDZmLDB4NzA2ZiwweDY4NGYsMHg2ODRmLDB4NjAyZiwweDYwMmYsMHg2MDBmLDB4NjAwZiwKLSAgICAweDY4NmYsMHg2ODZmLDB4NjA0ZiwweDYwNGYsMHg1ODJmLDB4NTgyZiwweDU4MGYsMHg1ODBmfTsKLQotLyogVkxDIGxlbmd0aHMgdXAgdG8gNiBiaXRzLCAyIDw9IG5DIDwgNCAqLwotc3RhdGljIGNvbnN0IHUxNiBjb2VmZlRva2VuMl8wWzMyXSA9IHsKLSAgICAweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgzODY2LDB4MjA0NiwweDIwMjYsMHgxMDA2LAotICAgIDB4MzA2NiwweDE4NDYsMHgxODI2LDB4MDgwNiwweDI4NjUsMHgyODY1LDB4MTAyNSwweDEwMjUsCi0gICAgMHgyMDY0LDB4MjA2NCwweDIwNjQsMHgyMDY0LDB4MTg2NCwweDE4NjQsMHgxODY0LDB4MTg2NCwKLSAgICAweDEwNDMsMHgxMDQzLDB4MTA0MywweDEwNDMsMHgxMDQzLDB4MTA0MywweDEwNDMsMHgxMDQzfTsKLQotLyogVkxDIGxlbmd0aHMgdXAgdG8gOSBiaXRzLCAyIDw9IG5DIDwgNCAqLwotc3RhdGljIGNvbnN0IHUxNiBjb2VmZlRva2VuMl8xWzMyXSA9IHsKLSAgICAweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHg0ODY5LDB4Mzg0OSwweDM4MjksMHgzMDA5LAotICAgIDB4MjgwOCwweDI4MDgsMHgzMDQ4LDB4MzA0OCwweDMwMjgsMHgzMDI4LDB4MjAwOCwweDIwMDgsCi0gICAgMHg0MDY3LDB4NDA2NywweDQwNjcsMHg0MDY3LDB4Mjg0NywweDI4NDcsMHgyODQ3LDB4Mjg0NywKLSAgICAweDI4MjcsMHgyODI3LDB4MjgyNywweDI4MjcsMHgxODA3LDB4MTgwNywweDE4MDcsMHgxODA3fTsKLQotLyogVkxDIGxlbmd0aHMgdXAgdG8gMTQgYml0cywgMiA8PSBuQyA8IDQgKi8KLXN0YXRpYyBjb25zdCB1MTYgY29lZmZUb2tlbjJfMlsxMjhdID0gewotICAgIDB4MDAwMCwweDAwMDAsMHg3ODZkLDB4Nzg2ZCwweDgwNmUsMHg4MDRlLDB4ODAyZSwweDgwMGUsCi0gICAgMHg3ODJlLDB4NzgwZSwweDc4NGUsMHg3MDJlLDB4NzA0ZCwweDcwNGQsMHg3MDBkLDB4NzAwZCwKLSAgICAweDcwNmQsMHg3MDZkLDB4Njg0ZCwweDY4NGQsMHg2ODJkLDB4NjgyZCwweDY4MGQsMHg2ODBkLAotICAgIDB4Njg2ZCwweDY4NmQsMHg2MDRkLDB4NjA0ZCwweDYwMmQsMHg2MDJkLDB4NjAwZCwweDYwMGQsCi0gICAgMHg1ODBjLDB4NTgwYywweDU4MGMsMHg1ODBjLDB4NTg0YywweDU4NGMsMHg1ODRjLDB4NTg0YywKLSAgICAweDU4MmMsMHg1ODJjLDB4NTgyYywweDU4MmMsMHg1MDBjLDB4NTAwYywweDUwMGMsMHg1MDBjLAotICAgIDB4NjA2YywweDYwNmMsMHg2MDZjLDB4NjA2YywweDUwNGMsMHg1MDRjLDB4NTA0YywweDUwNGMsCi0gICAgMHg1MDJjLDB4NTAyYywweDUwMmMsMHg1MDJjLDB4NDgwYywweDQ4MGMsMHg0ODBjLDB4NDgwYywKLSAgICAweDU4NmIsMHg1ODZiLDB4NTg2YiwweDU4NmIsMHg1ODZiLDB4NTg2YiwweDU4NmIsMHg1ODZiLAotICAgIDB4NDg0YiwweDQ4NGIsMHg0ODRiLDB4NDg0YiwweDQ4NGIsMHg0ODRiLDB4NDg0YiwweDQ4NGIsCi0gICAgMHg0ODJiLDB4NDgyYiwweDQ4MmIsMHg0ODJiLDB4NDgyYiwweDQ4MmIsMHg0ODJiLDB4NDgyYiwKLSAgICAweDQwMGIsMHg0MDBiLDB4NDAwYiwweDQwMGIsMHg0MDBiLDB4NDAwYiwweDQwMGIsMHg0MDBiLAotICAgIDB4NTA2YiwweDUwNmIsMHg1MDZiLDB4NTA2YiwweDUwNmIsMHg1MDZiLDB4NTA2YiwweDUwNmIsCi0gICAgMHg0MDRiLDB4NDA0YiwweDQwNGIsMHg0MDRiLDB4NDA0YiwweDQwNGIsMHg0MDRiLDB4NDA0YiwKLSAgICAweDQwMmIsMHg0MDJiLDB4NDAyYiwweDQwMmIsMHg0MDJiLDB4NDAyYiwweDQwMmIsMHg0MDJiLAotICAgIDB4MzgwYiwweDM4MGIsMHgzODBiLDB4MzgwYiwweDM4MGIsMHgzODBiLDB4MzgwYiwweDM4MGJ9OwotCi0vKiBWTEMgbGVuZ3RocyB1cCB0byA2IGJpdHMsIDQgPD0gbkMgPCA4ICovCi1zdGF0aWMgY29uc3QgdTE2IGNvZWZmVG9rZW40XzBbNjRdID0gewotICAgIDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsCi0gICAgMHgxODA2LDB4Mzg0NiwweDM4MjYsMHgxMDA2LDB4NDg2NiwweDMwNDYsMHgzMDI2LDB4MDgwNiwKLSAgICAweDI4MjUsMHgyODI1LDB4Mjg0NSwweDI4NDUsMHgyMDI1LDB4MjAyNSwweDIwNDUsMHgyMDQ1LAotICAgIDB4MTgyNSwweDE4MjUsMHg0MDY1LDB4NDA2NSwweDE4NDUsMHgxODQ1LDB4MTAyNSwweDEwMjUsCi0gICAgMHgzODY0LDB4Mzg2NCwweDM4NjQsMHgzODY0LDB4MzA2NCwweDMwNjQsMHgzMDY0LDB4MzA2NCwKLSAgICAweDI4NjQsMHgyODY0LDB4Mjg2NCwweDI4NjQsMHgyMDY0LDB4MjA2NCwweDIwNjQsMHgyMDY0LAotICAgIDB4MTg2NCwweDE4NjQsMHgxODY0LDB4MTg2NCwweDEwNDQsMHgxMDQ0LDB4MTA0NCwweDEwNDQsCi0gICAgMHgwODI0LDB4MDgyNCwweDA4MjQsMHgwODI0LDB4MDAwNCwweDAwMDQsMHgwMDA0LDB4MDAwNH07Ci0KLS8qIFZMQyBsZW5ndGhzIHVwIHRvIDEwIGJpdHMsIDQgPD0gbkMgPCA4ICovCi1zdGF0aWMgY29uc3QgdTE2IGNvZWZmVG9rZW40XzFbMTI4XSA9IHsKLSAgICAweDAwMDAsMHg4MDBhLDB4ODA2YSwweDgwNGEsMHg4MDJhLDB4NzgwYSwweDc4NmEsMHg3ODRhLAotICAgIDB4NzgyYSwweDcwMGEsMHg3MDZhLDB4NzA0YSwweDcwMmEsMHg2ODBhLDB4NjgyOSwweDY4MjksCi0gICAgMHg2MDA5LDB4NjAwOSwweDY4NDksMHg2ODQ5LDB4NjAyOSwweDYwMjksMHg1ODA5LDB4NTgwOSwKLSAgICAweDY4NjksMHg2ODY5LDB4NjA0OSwweDYwNDksMHg1ODI5LDB4NTgyOSwweDUwMDksMHg1MDA5LAotICAgIDB4NjA2OCwweDYwNjgsMHg2MDY4LDB4NjA2OCwweDU4NDgsMHg1ODQ4LDB4NTg0OCwweDU4NDgsCi0gICAgMHg1MDI4LDB4NTAyOCwweDUwMjgsMHg1MDI4LDB4NDgwOCwweDQ4MDgsMHg0ODA4LDB4NDgwOCwKLSAgICAweDU4NjgsMHg1ODY4LDB4NTg2OCwweDU4NjgsMHg1MDQ4LDB4NTA0OCwweDUwNDgsMHg1MDQ4LAotICAgIDB4NDgyOCwweDQ4MjgsMHg0ODI4LDB4NDgyOCwweDQwMDgsMHg0MDA4LDB4NDAwOCwweDQwMDgsCi0gICAgMHgzODA3LDB4MzgwNywweDM4MDcsMHgzODA3LDB4MzgwNywweDM4MDcsMHgzODA3LDB4MzgwNywKLSAgICAweDMwMDcsMHgzMDA3LDB4MzAwNywweDMwMDcsMHgzMDA3LDB4MzAwNywweDMwMDcsMHgzMDA3LAotICAgIDB4NDg0NywweDQ4NDcsMHg0ODQ3LDB4NDg0NywweDQ4NDcsMHg0ODQ3LDB4NDg0NywweDQ4NDcsCi0gICAgMHgyODA3LDB4MjgwNywweDI4MDcsMHgyODA3LDB4MjgwNywweDI4MDcsMHgyODA3LDB4MjgwNywKLSAgICAweDUwNjcsMHg1MDY3LDB4NTA2NywweDUwNjcsMHg1MDY3LDB4NTA2NywweDUwNjcsMHg1MDY3LAotICAgIDB4NDA0NywweDQwNDcsMHg0MDQ3LDB4NDA0NywweDQwNDcsMHg0MDQ3LDB4NDA0NywweDQwNDcsCi0gICAgMHg0MDI3LDB4NDAyNywweDQwMjcsMHg0MDI3LDB4NDAyNywweDQwMjcsMHg0MDI3LDB4NDAyNywKLSAgICAweDIwMDcsMHgyMDA3LDB4MjAwNywweDIwMDcsMHgyMDA3LDB4MjAwNywweDIwMDcsMHgyMDA3fTsKLQotLyogZml4ZWQgNiBiaXQgbGVuZ3RoIFZMQywgbkMgPD0gOCAqLwotc3RhdGljIGNvbnN0IHUxNiBjb2VmZlRva2VuOFs2NF0gPSB7Ci0gICAgMHgwODA2LDB4MDgyNiwweDAwMDAsMHgwMDA2LDB4MTAwNiwweDEwMjYsMHgxMDQ2LDB4MDAwMCwKLSAgICAweDE4MDYsMHgxODI2LDB4MTg0NiwweDE4NjYsMHgyMDA2LDB4MjAyNiwweDIwNDYsMHgyMDY2LAotICAgIDB4MjgwNiwweDI4MjYsMHgyODQ2LDB4Mjg2NiwweDMwMDYsMHgzMDI2LDB4MzA0NiwweDMwNjYsCi0gICAgMHgzODA2LDB4MzgyNiwweDM4NDYsMHgzODY2LDB4NDAwNiwweDQwMjYsMHg0MDQ2LDB4NDA2NiwKLSAgICAweDQ4MDYsMHg0ODI2LDB4NDg0NiwweDQ4NjYsMHg1MDA2LDB4NTAyNiwweDUwNDYsMHg1MDY2LAotICAgIDB4NTgwNiwweDU4MjYsMHg1ODQ2LDB4NTg2NiwweDYwMDYsMHg2MDI2LDB4NjA0NiwweDYwNjYsCi0gICAgMHg2ODA2LDB4NjgyNiwweDY4NDYsMHg2ODY2LDB4NzAwNiwweDcwMjYsMHg3MDQ2LDB4NzA2NiwKLSAgICAweDc4MDYsMHg3ODI2LDB4Nzg0NiwweDc4NjYsMHg4MDA2LDB4ODAyNiwweDgwNDYsMHg4MDY2fTsKLQotLyogVkxDIGxlbmd0aHMgdXAgdG8gMyBiaXRzLCBuQyA9PSAtMSAqLwotc3RhdGljIGNvbnN0IHUxNiBjb2VmZlRva2VuTWludXMxXzBbOF0gPSB7Ci0gICAgMHgwMDAwLDB4MTA0MywweDAwMDIsMHgwMDAyLDB4MDgyMSwweDA4MjEsMHgwODIxLDB4MDgyMX07Ci0KLS8qIFZMQyBsZW5ndGhzIHVwIHRvIDggYml0cywgbkMgPT0gLTEgKi8KLXN0YXRpYyBjb25zdCB1MTYgY29lZmZUb2tlbk1pbnVzMV8xWzMyXSA9IHsKLSAgICAweDIwNjcsMHgyMDY3LDB4MjA0OCwweDIwMjgsMHgxODQ3LDB4MTg0NywweDE4MjcsMHgxODI3LAotICAgIDB4MjAwNiwweDIwMDYsMHgyMDA2LDB4MjAwNiwweDE4MDYsMHgxODA2LDB4MTgwNiwweDE4MDYsCi0gICAgMHgxMDA2LDB4MTAwNiwweDEwMDYsMHgxMDA2LDB4MTg2NiwweDE4NjYsMHgxODY2LDB4MTg2NiwKLSAgICAweDEwMjYsMHgxMDI2LDB4MTAyNiwweDEwMjYsMHgwODA2LDB4MDgwNiwweDA4MDYsMHgwODA2fTsKLQotLyogVkxDIHRhYmxlcyBmb3IgdG90YWxfemVyb3MuIE9uZSB0YWJsZSBjb250YWluaW5nIGxvbmdlciBjb2RlLCB0b3RhbFplcm9zXzEsCi0gKiBoYXMgYmVlbiBicm9rZW4gaW50byB0d28gc2VwYXJhdGUgdGFibGVzLiBUYWJsZSBlbGVtZW50cyBoYXZlIHRoZQotICogZm9sbG93aW5nIHN0cnVjdHVyZToKLSAqIFs0IGJpdHMgZm9yIGluZm9dIFs0IGJpdHMgZm9yIFZMQyBsZW5ndGhdICovCi0KLS8qIFZMQyBsZW5ndGhzIHVwIHRvIDUgYml0cyAqLwotc3RhdGljIGNvbnN0IHU4IHRvdGFsWmVyb3NfMV8wWzMyXSA9IHsKLSAgICAweDAwLDB4MDAsMHg2NSwweDU1LDB4NDQsMHg0NCwweDM0LDB4MzQsCi0gICAgMHgyMywweDIzLDB4MjMsMHgyMywweDEzLDB4MTMsMHgxMywweDEzLAotICAgIDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwKLSAgICAweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDF9OwotCi0vKiBWTEMgbGVuZ3RocyB1cCB0byA5IGJpdHMgKi8KLXN0YXRpYyBjb25zdCB1OCB0b3RhbFplcm9zXzFfMVszMl0gPSB7Ci0gICAgMHgwMCwweGY5LDB4ZTksMHhkOSwweGM4LDB4YzgsMHhiOCwweGI4LAotICAgIDB4YTcsMHhhNywweGE3LDB4YTcsMHg5NywweDk3LDB4OTcsMHg5NywKLSAgICAweDg2LDB4ODYsMHg4NiwweDg2LDB4ODYsMHg4NiwweDg2LDB4ODYsCi0gICAgMHg3NiwweDc2LDB4NzYsMHg3NiwweDc2LDB4NzYsMHg3NiwweDc2fTsKLQotc3RhdGljIGNvbnN0IHU4IHRvdGFsWmVyb3NfMls2NF0gPSB7Ci0gICAgMHhlNiwweGQ2LDB4YzYsMHhiNiwweGE1LDB4YTUsMHg5NSwweDk1LAotICAgIDB4ODQsMHg4NCwweDg0LDB4ODQsMHg3NCwweDc0LDB4NzQsMHg3NCwKLSAgICAweDY0LDB4NjQsMHg2NCwweDY0LDB4NTQsMHg1NCwweDU0LDB4NTQsCi0gICAgMHg0MywweDQzLDB4NDMsMHg0MywweDQzLDB4NDMsMHg0MywweDQzLAotICAgIDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywKLSAgICAweDIzLDB4MjMsMHgyMywweDIzLDB4MjMsMHgyMywweDIzLDB4MjMsCi0gICAgMHgxMywweDEzLDB4MTMsMHgxMywweDEzLDB4MTMsMHgxMywweDEzLAotICAgIDB4MDMsMHgwMywweDAzLDB4MDMsMHgwMywweDAzLDB4MDMsMHgwM307Ci0KLXN0YXRpYyBjb25zdCB1OCB0b3RhbFplcm9zXzNbNjRdID0gewotICAgIDB4ZDYsMHhiNiwweGM1LDB4YzUsMHhhNSwweGE1LDB4OTUsMHg5NSwKLSAgICAweDg0LDB4ODQsMHg4NCwweDg0LDB4NTQsMHg1NCwweDU0LDB4NTQsCi0gICAgMHg0NCwweDQ0LDB4NDQsMHg0NCwweDA0LDB4MDQsMHgwNCwweDA0LAotICAgIDB4NzMsMHg3MywweDczLDB4NzMsMHg3MywweDczLDB4NzMsMHg3MywKLSAgICAweDYzLDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywweDYzLDB4NjMsCi0gICAgMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLAotICAgIDB4MjMsMHgyMywweDIzLDB4MjMsMHgyMywweDIzLDB4MjMsMHgyMywKLSAgICAweDEzLDB4MTMsMHgxMywweDEzLDB4MTMsMHgxMywweDEzLDB4MTN9OwotCi1zdGF0aWMgY29uc3QgdTggdG90YWxaZXJvc180WzMyXSA9IHsKLSAgICAweGM1LDB4YjUsMHhhNSwweDA1LDB4OTQsMHg5NCwweDc0LDB4NzQsCi0gICAgMHgzNCwweDM0LDB4MjQsMHgyNCwweDgzLDB4ODMsMHg4MywweDgzLAotICAgIDB4NjMsMHg2MywweDYzLDB4NjMsMHg1MywweDUzLDB4NTMsMHg1MywKLSAgICAweDQzLDB4NDMsMHg0MywweDQzLDB4MTMsMHgxMywweDEzLDB4MTN9OwotCi1zdGF0aWMgY29uc3QgdTggdG90YWxaZXJvc181WzMyXSA9IHsKLSAgICAweGI1LDB4OTUsMHhhNCwweGE0LDB4ODQsMHg4NCwweDI0LDB4MjQsCi0gICAgMHgxNCwweDE0LDB4MDQsMHgwNCwweDczLDB4NzMsMHg3MywweDczLAotICAgIDB4NjMsMHg2MywweDYzLDB4NjMsMHg1MywweDUzLDB4NTMsMHg1MywKLSAgICAweDQzLDB4NDMsMHg0MywweDQzLDB4MzMsMHgzMywweDMzLDB4MzN9OwotCi1zdGF0aWMgY29uc3QgdTggdG90YWxaZXJvc182WzY0XSA9IHsKLSAgICAweGE2LDB4MDYsMHgxNSwweDE1LDB4ODQsMHg4NCwweDg0LDB4ODQsCi0gICAgMHg5MywweDkzLDB4OTMsMHg5MywweDkzLDB4OTMsMHg5MywweDkzLAotICAgIDB4NzMsMHg3MywweDczLDB4NzMsMHg3MywweDczLDB4NzMsMHg3MywKLSAgICAweDYzLDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywweDYzLDB4NjMsCi0gICAgMHg1MywweDUzLDB4NTMsMHg1MywweDUzLDB4NTMsMHg1MywweDUzLAotICAgIDB4NDMsMHg0MywweDQzLDB4NDMsMHg0MywweDQzLDB4NDMsMHg0MywKLSAgICAweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsCi0gICAgMHgyMywweDIzLDB4MjMsMHgyMywweDIzLDB4MjMsMHgyMywweDIzfTsKLQotc3RhdGljIGNvbnN0IHU4IHRvdGFsWmVyb3NfN1s2NF0gPSB7Ci0gICAgMHg5NiwweDA2LDB4MTUsMHgxNSwweDc0LDB4NzQsMHg3NCwweDc0LAotICAgIDB4ODMsMHg4MywweDgzLDB4ODMsMHg4MywweDgzLDB4ODMsMHg4MywKLSAgICAweDYzLDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywweDYzLDB4NjMsCi0gICAgMHg0MywweDQzLDB4NDMsMHg0MywweDQzLDB4NDMsMHg0MywweDQzLAotICAgIDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywKLSAgICAweDIzLDB4MjMsMHgyMywweDIzLDB4MjMsMHgyMywweDIzLDB4MjMsCi0gICAgMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLAotICAgIDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1Mn07Ci0KLXN0YXRpYyBjb25zdCB1OCB0b3RhbFplcm9zXzhbNjRdID0gewotICAgIDB4ODYsMHgwNiwweDI1LDB4MjUsMHgxNCwweDE0LDB4MTQsMHgxNCwKLSAgICAweDczLDB4NzMsMHg3MywweDczLDB4NzMsMHg3MywweDczLDB4NzMsCi0gICAgMHg2MywweDYzLDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywweDYzLAotICAgIDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywKLSAgICAweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsCi0gICAgMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLAotICAgIDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwKLSAgICAweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLDB4NDJ9OwotCi1zdGF0aWMgY29uc3QgdTggdG90YWxaZXJvc185WzY0XSA9IHsKLSAgICAweDE2LDB4MDYsMHg3NSwweDc1LDB4MjQsMHgyNCwweDI0LDB4MjQsCi0gICAgMHg1MywweDUzLDB4NTMsMHg1MywweDUzLDB4NTMsMHg1MywweDUzLAotICAgIDB4NjIsMHg2MiwweDYyLDB4NjIsMHg2MiwweDYyLDB4NjIsMHg2MiwKLSAgICAweDYyLDB4NjIsMHg2MiwweDYyLDB4NjIsMHg2MiwweDYyLDB4NjIsCi0gICAgMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLAotICAgIDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwKLSAgICAweDMyLDB4MzIsMHgzMiwweDMyLDB4MzIsMHgzMiwweDMyLDB4MzIsCi0gICAgMHgzMiwweDMyLDB4MzIsMHgzMiwweDMyLDB4MzIsMHgzMiwweDMyfTsKLQotc3RhdGljIGNvbnN0IHU4IHRvdGFsWmVyb3NfMTBbMzJdID0gewotICAgIDB4MTUsMHgwNSwweDY0LDB4NjQsMHgyMywweDIzLDB4MjMsMHgyMywKLSAgICAweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsCi0gICAgMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLAotICAgIDB4MzIsMHgzMiwweDMyLDB4MzIsMHgzMiwweDMyLDB4MzIsMHgzMn07Ci0KLXN0YXRpYyBjb25zdCB1OCB0b3RhbFplcm9zXzExWzE2XSA9IHsKLSAgICAweDA0LDB4MTQsMHgyMywweDIzLDB4MzMsMHgzMywweDUzLDB4NTMsCi0gICAgMHg0MSwweDQxLDB4NDEsMHg0MSwweDQxLDB4NDEsMHg0MSwweDQxfTsKLQotc3RhdGljIGNvbnN0IHU4IHRvdGFsWmVyb3NfMTJbMTZdID0gewotICAgIDB4MDQsMHgxNCwweDQzLDB4NDMsMHgyMiwweDIyLDB4MjIsMHgyMiwKLSAgICAweDMxLDB4MzEsMHgzMSwweDMxLDB4MzEsMHgzMSwweDMxLDB4MzF9OwotCi1zdGF0aWMgY29uc3QgdTggdG90YWxaZXJvc18xM1s4XSA9IHsweDAzLDB4MTMsMHgzMiwweDMyLDB4MjEsMHgyMSwweDIxLDB4MjF9OwotCi1zdGF0aWMgY29uc3QgdTggdG90YWxaZXJvc18xNFs0XSA9IHsweDAyLDB4MTIsMHgyMSwweDIxfTsKLQotLyogVkxDIHRhYmxlcyBmb3IgcnVuX2JlZm9yZS4gVGFibGUgZWxlbWVudHMgaGF2ZSB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKLSAqIFs0IGJpdHMgZm9yIGluZm9dIFs0Yml0cyBmb3IgVkxDIGxlbmd0aF0KLSAqLwotCi1zdGF0aWMgY29uc3QgdTggcnVuQmVmb3JlXzZbOF0gPSB7MHgxMywweDIzLDB4NDMsMHgzMywweDYzLDB4NTMsMHgwMiwweDAyfTsKLQotc3RhdGljIGNvbnN0IHU4IHJ1bkJlZm9yZV81WzhdID0gezB4NTMsMHg0MywweDMzLDB4MjMsMHgxMiwweDEyLDB4MDIsMHgwMn07Ci0KLXN0YXRpYyBjb25zdCB1OCBydW5CZWZvcmVfNFs4XSA9IHsweDQzLDB4MzMsMHgyMiwweDIyLDB4MTIsMHgxMiwweDAyLDB4MDJ9OwotCi1zdGF0aWMgY29uc3QgdTggcnVuQmVmb3JlXzNbNF0gPSB7MHgzMiwweDIyLDB4MTIsMHgwMn07Ci0KLXN0YXRpYyBjb25zdCB1OCBydW5CZWZvcmVfMls0XSA9IHsweDIyLDB4MTIsMHgwMSwweDAxfTsKLQotc3RhdGljIGNvbnN0IHU4IHJ1bkJlZm9yZV8xWzJdID0gezB4MTEsMHgwMX07Ci0KLS8qIGZvbGxvd2luZyBmb3VyIG1hY3JvcyBhcmUgdXNlZCB0byBoYW5kbGUgc3RyZWFtIGJ1ZmZlciAiY2FjaGUiIGluIHRoZSBDQVZMQwotICogZGVjb2RpbmcgZnVuY3Rpb24gKi8KLQotLyogbWFjcm8gdG8gaW5pdGlhbGl6ZSBzdHJlYW0gYnVmZmVyIGNhY2hlLCBmaWxscyB0aGUgYnVmZmVyICgzMiBiaXRzKSAqLwotI2RlZmluZSBCVUZGRVJfSU5JVCh2YWx1ZSwgYml0cykgXAoteyBcCi0gICAgKGJpdHMpID0gMzI7IFwKLSAgICAodmFsdWUpID0gaDI2NGJzZFNob3dCaXRzMzIocFN0cm1EYXRhKTsgXAotfQotCi0vKiBtYWNybyB0byByZWFkIG51bUJpdHMgYml0cyBmcm9tIHRoZSBidWZmZXIsIGJpdHMgd2lsbCBiZSB3cml0dGVuIHRvCi0gKiBvdXRWYWwuIFJlZmlsbHMgdGhlIGJ1ZmZlciBpZiBub3QgZW5vdWdoIGJpdHMgbGVmdCAqLwotI2RlZmluZSBCVUZGRVJfU0hPVyh2YWx1ZSwgYml0cywgb3V0VmFsLCBudW1CaXRzKSBcCi17IFwKLSAgICBpZiAoKGJpdHMpIDwgKG51bUJpdHMpKSBcCi0gICAgeyBcCi0gICAgICAgIGlmKGgyNjRic2RGbHVzaEJpdHMocFN0cm1EYXRhLDMyLShiaXRzKSkgPT0gRU5EX09GX1NUUkVBTSkgXAotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOyBcCi0gICAgICAgICh2YWx1ZSkgPSBoMjY0YnNkU2hvd0JpdHMzMihwU3RybURhdGEpOyBcCi0gICAgICAgIChiaXRzKSA9IDMyOyBcCi0gICAgfSBcCi0gICAgKG91dFZhbCkgPSAodmFsdWUpID4+ICgzMiAtIChudW1CaXRzKSk7IFwKLX0KLQotLyogbWFjcm8gdG8gZmx1c2ggbnVtQml0cyBiaXRzIGZyb20gdGhlIGJ1ZmZlciAqLwotI2RlZmluZSBCVUZGRVJfRkxVU0godmFsdWUsIGJpdHMsIG51bUJpdHMpIFwKLXsgXAotICAgICh2YWx1ZSkgPDw9IChudW1CaXRzKTsgXAotICAgIChiaXRzKSAtPSAobnVtQml0cyk7IFwKLX0KLQotLyogbWFjcm8gdG8gcmVhZCBhbmQgZmx1c2ggIG51bUJpdHMgYml0cyBmcm9tIHRoZSBidWZmZXIsIGJpdHMgd2lsbCBiZSB3cml0dGVuCi0gKiB0byBvdXRWYWwuIFJlZmlsbHMgdGhlIGJ1ZmZlciBpZiBub3QgZW5vdWdoIGJpdHMgbGVmdCAqLwotI2RlZmluZSBCVUZGRVJfR0VUKHZhbHVlLCBiaXRzLCBvdXRWYWwsIG51bUJpdHMpIFwKLXsgXAotICAgIGlmICgoYml0cykgPCAobnVtQml0cykpIFwKLSAgICB7IFwKLSAgICAgICAgaWYoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsMzItKGJpdHMpKSA9PSBFTkRfT0ZfU1RSRUFNKSBcCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7IFwKLSAgICAgICAgKHZhbHVlKSA9IGgyNjRic2RTaG93Qml0czMyKHBTdHJtRGF0YSk7IFwKLSAgICAgICAgKGJpdHMpID0gMzI7IFwKLSAgICB9IFwKLSAgICAob3V0VmFsKSA9ICh2YWx1ZSkgPj4gKDMyIC0gKG51bUJpdHMpKTsgXAotICAgICh2YWx1ZSkgPDw9IChudW1CaXRzKTsgXAotICAgIChiaXRzKSAtPSAobnVtQml0cyk7IFwKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIERlY29kZUNvZWZmVG9rZW4odTMyIGJpdHMsIHUzMiBuYyk7Ci0KLXN0YXRpYyB1MzIgRGVjb2RlTGV2ZWxQcmVmaXgodTMyIGJpdHMpOwotCi1zdGF0aWMgdTMyIERlY29kZVRvdGFsWmVyb3ModTMyIGJpdHMsIHUzMiB0b3RhbENvZWZmLCB1MzIgaXNDaHJvbWFEQyk7Ci0KLXN0YXRpYyB1MzIgRGVjb2RlUnVuQmVmb3JlKHUzMiBiaXRzLHUzMiB6ZXJvc0xlZnQpOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERlY29kZUNvZWZmVG9rZW4KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIEZ1bmN0aW9uIHRvIGRlY29kZSBjb2VmZl90b2tlbiBpbmZvcm1hdGlvbiBmaWVsZCBmcm9tIHRoZSBzdHJlYW0uCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIHUzMiBiaXRzICAgICAgICAgICAgICAgICAgbmV4dCAxNiBzdHJlYW0gYml0cwotICAgICAgICAgIHUzMiBuYyAgICAgICAgICAgICAgICAgICAgbkMsIHNlZSBzdGFuZGFyZCBmb3IgZGV0YWlscwotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgdTMyICBpbmZvcm1hdGlvbiBmaWVsZCAoMTEgYml0cyBmb3IgdmFsdWUsIDUgYml0cyBmb3IgbGVuZ3RoKQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgRGVjb2RlQ29lZmZUb2tlbih1MzIgYml0cywgdTMyIG5jKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB2YWx1ZTsKLQotLyogQ29kZSAqLwotCi0gICAgLyogc3RhbmRhcmQgZGVmaW5lcyB0aGF0IG5jIGZvciBkZWNvZGluZyBvZiBjaHJvbWEgZGMgY29lZmZpY2llbnRzIGlzIC0xLAotICAgICAqIHJlcHJlc2VudGVkIGJ5IHUzMiBoZXJlIC0+IC0xIG1hcHMgdG8gMl4zMiAtIDEgKi8KLSAgICBBU1NFUlQobmMgPD0gMTYgfHwgbmMgPT0gKHUzMikoLTEpKTsKLQotICAgIGlmIChuYyA8IDIpCi0gICAgewotICAgICAgICBpZiAoYml0cyA+PSAweDgwMDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhbHVlID0gMHgwMDAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwQzAwKQotICAgICAgICAgICAgdmFsdWUgPSBjb2VmZlRva2VuMF8wW2JpdHMgPj4gMTBdOwotICAgICAgICBlbHNlIGlmIChiaXRzID49IDB4MDEwMCkKLSAgICAgICAgICAgIHZhbHVlID0gY29lZmZUb2tlbjBfMVtiaXRzID4+IDZdOwotICAgICAgICBlbHNlIGlmIChiaXRzID49IDB4MDAyMCkKLSAgICAgICAgICAgIHZhbHVlID0gY29lZmZUb2tlbjBfMlsoYml0cz4+MiktOF07Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHZhbHVlID0gY29lZmZUb2tlbjBfM1tiaXRzXTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobmMgPCA0KQotICAgIHsKLSAgICAgICAgaWYgKGJpdHMgPj0gMHg4MDAwKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YWx1ZSA9IGJpdHMgJiAweDQwMDAgPyAweDAwMDIgOiAweDA4MjI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYml0cyA+PSAweDEwMDApCi0gICAgICAgICAgICB2YWx1ZSA9IGNvZWZmVG9rZW4yXzBbYml0cyA+PiAxMF07Ci0gICAgICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMjAwKQotICAgICAgICAgICAgdmFsdWUgPSBjb2VmZlRva2VuMl8xW2JpdHMgPj4gN107Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHZhbHVlID0gY29lZmZUb2tlbjJfMltiaXRzPj4yXTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobmMgPCA4KQotICAgIHsKLSAgICAgICAgdmFsdWUgPSBjb2VmZlRva2VuNF8wW2JpdHMgPj4gMTBdOwotICAgICAgICBpZiAoIXZhbHVlKQotICAgICAgICAgICAgdmFsdWUgPSBjb2VmZlRva2VuNF8xW2JpdHM+PjZdOwotICAgIH0KLSAgICBlbHNlIGlmIChuYyA8PSAxNikKLSAgICB7Ci0gICAgICAgIHZhbHVlID0gY29lZmZUb2tlbjhbYml0cz4+MTBdOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB2YWx1ZSA9IGNvZWZmVG9rZW5NaW51czFfMFtiaXRzID4+IDEzXTsKLSAgICAgICAgaWYgKCF2YWx1ZSkKLSAgICAgICAgICAgIHZhbHVlID0gY29lZmZUb2tlbk1pbnVzMV8xW2JpdHM+PjhdOwotICAgIH0KLQotICAgIHJldHVybih2YWx1ZSk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZWNvZGVMZXZlbFByZWZpeAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgRnVuY3Rpb24gdG8gZGVjb2RlIGxldmVsX3ByZWZpeCBpbmZvcm1hdGlvbiBmaWVsZCBmcm9tIHRoZSBzdHJlYW0KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgdTMyIGJpdHMgICAgICBuZXh0IDE2IHN0cmVhbSBiaXRzCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICB1MzIgIGxldmVsX3ByZWZpeCBpbmZvcm1hdGlvbiBmaWVsZCBvciBWTENfTk9UX0ZPVU5ECi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBEZWNvZGVMZXZlbFByZWZpeCh1MzIgYml0cykKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgbnVtWmVyb3M7Ci0KLS8qIENvZGUgKi8KLQotICAgIGlmIChiaXRzID49IDB4ODAwMCkKLSAgICAgICAgbnVtWmVyb3MgPSAwOwotICAgIGVsc2UgaWYgKGJpdHMgPj0gMHg0MDAwKQotICAgICAgICBudW1aZXJvcyA9IDE7Ci0gICAgZWxzZSBpZiAoYml0cyA+PSAweDIwMDApCi0gICAgICAgIG51bVplcm9zID0gMjsKLSAgICBlbHNlIGlmIChiaXRzID49IDB4MTAwMCkKLSAgICAgICAgbnVtWmVyb3MgPSAzOwotICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwODAwKQotICAgICAgICBudW1aZXJvcyA9IDQ7Ci0gICAgZWxzZSBpZiAoYml0cyA+PSAweDA0MDApCi0gICAgICAgIG51bVplcm9zID0gNTsKLSAgICBlbHNlIGlmIChiaXRzID49IDB4MDIwMCkKLSAgICAgICAgbnVtWmVyb3MgPSA2OwotICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMTAwKQotICAgICAgICBudW1aZXJvcyA9IDc7Ci0gICAgZWxzZSBpZiAoYml0cyA+PSAweDAwODApCi0gICAgICAgIG51bVplcm9zID0gODsKLSAgICBlbHNlIGlmIChiaXRzID49IDB4MDA0MCkKLSAgICAgICAgbnVtWmVyb3MgPSA5OwotICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMDIwKQotICAgICAgICBudW1aZXJvcyA9IDEwOwotICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMDEwKQotICAgICAgICBudW1aZXJvcyA9IDExOwotICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMDA4KQotICAgICAgICBudW1aZXJvcyA9IDEyOwotICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMDA0KQotICAgICAgICBudW1aZXJvcyA9IDEzOwotICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMDAyKQotICAgICAgICBudW1aZXJvcyA9IDE0OwotICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMDAxKQotICAgICAgICBudW1aZXJvcyA9IDE1OwotICAgIGVsc2UgLyogbW9yZSB0aGFuIDE1IHplcm9zIGVuY291bnRlcmVkIHdoaWNoIGlzIGFuIGVycm9yICovCi0gICAgICAgIHJldHVybihWTENfTk9UX0ZPVU5EKTsKLQotICAgIHJldHVybihudW1aZXJvcyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZWNvZGVUb3RhbFplcm9zCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBGdW5jdGlvbiB0byBkZWNvZGUgdG90YWxfemVyb3MgaW5mb3JtYXRpb24gZmllbGQgZnJvbSB0aGUgc3RyZWFtCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIHUzMiBiaXRzICAgICAgICAgICAgICAgICAgbmV4dCA5IHN0cmVhbSBiaXRzCi0gICAgICAgICAgdTMyIHRvdGFsQ29lZmYgICAgICAgICAgICB0b3RhbCBudW1iZXIgb2YgY29lZmZpY2llbnRzIGZvciB0aGUgYmxvY2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlaW5nIGRlY29kZWQKLSAgICAgICAgICB1MzIgaXNDaHJvbWFEQyAgICAgICAgICAgZmxhZyB0byBpbmRpY2F0ZSBjaHJvbWEgREMgYmxvY2sKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIHUzMiAgaW5mb3JtYXRpb24gZmllbGQgKDQgYml0cyB2YWx1ZSwgNCBiaXRzIGxlbmd0aCkKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIERlY29kZVRvdGFsWmVyb3ModTMyIGJpdHMsIHUzMiB0b3RhbENvZWZmLCB1MzIgaXNDaHJvbWFEQykKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdmFsdWUgPSAweDA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVCh0b3RhbENvZWZmKTsKLQotICAgIGlmICghaXNDaHJvbWFEQykKLSAgICB7Ci0gICAgICAgIEFTU0VSVCh0b3RhbENvZWZmIDwgMTYpOwotICAgICAgICBzd2l0Y2ggKHRvdGFsQ29lZmYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvdGFsWmVyb3NfMV8wW2JpdHMgPj4gNF07Ci0gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0b3RhbFplcm9zXzFfMVtiaXRzXTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc18yW2JpdHMgPj4gM107Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvdGFsWmVyb3NfM1tiaXRzID4+IDNdOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSB0b3RhbFplcm9zXzRbYml0cyA+PiA0XTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc181W2JpdHMgPj4gNF07Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvdGFsWmVyb3NfNltiaXRzID4+IDNdOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSB0b3RhbFplcm9zXzdbYml0cyA+PiAzXTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc184W2JpdHMgPj4gM107Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgOToKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvdGFsWmVyb3NfOVtiaXRzID4+IDNdOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDEwOgotICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc18xMFtiaXRzID4+IDRdOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDExOgotICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc18xMVtiaXRzID4+IDVdOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDEyOgotICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc18xMltiaXRzID4+IDVdOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDEzOgotICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc18xM1tiaXRzID4+IDZdOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDE0OgotICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc18xNFtiaXRzID4+IDddOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OiAvKiBjYXNlIDE1ICovCi0gICAgICAgICAgICAgICAgdmFsdWUgPSAoYml0cyA+PiA4KSA/IDB4MTEgOiAweDAxOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIEFTU0VSVCh0b3RhbENvZWZmIDwgNCk7Ci0gICAgICAgIGJpdHMgPj49IDY7Ci0gICAgICAgIGlmIChiaXRzID4gMykKLSAgICAgICAgICAgIHZhbHVlID0gMHgwMTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodG90YWxDb2VmZiA9PSAzKQotICAgICAgICAgICAgICAgIHZhbHVlID0gMHgxMTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGJpdHMgPiAxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhbHVlID0gMHgxMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHRvdGFsQ29lZmYgPT0gMikKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IDB4MjI7Ci0gICAgICAgICAgICBlbHNlIGlmIChiaXRzKQotICAgICAgICAgICAgICAgIHZhbHVlID0gMHgyMzsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IDB4MzM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4odmFsdWUpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlUnVuQmVmb3JlCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBGdW5jdGlvbiB0byBkZWNvZGUgcnVuX2JlZm9yZSBpbmZvcm1hdGlvbiBmaWVsZCBmcm9tIHRoZSBzdHJlYW0KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgdTMyIGJpdHMgICAgICAgICAgICAgICAgICBuZXh0IDExIHN0cmVhbSBiaXRzCi0gICAgICAgICAgdTMyIHplcm9zTGVmdCAgICAgICAgICAgICBudW1iZXIgb2YgemVyb3MgbGVmdCBmb3IgdGhlIGN1cnJlbnQgYmxvY2sKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIHUzMiAgaW5mb3JtYXRpb24gZmllbGQgKDQgYml0cyB2YWx1ZSwgNCBiaXRzIGxlbmd0aCkKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIERlY29kZVJ1bkJlZm9yZSh1MzIgYml0cywgdTMyIHplcm9zTGVmdCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdmFsdWUgPSAweDA7Ci0KLS8qIENvZGUgKi8KLQotICAgIHN3aXRjaCAoemVyb3NMZWZ0KQotICAgIHsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgdmFsdWUgPSBydW5CZWZvcmVfMVtiaXRzPj4xMF07Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICB2YWx1ZSA9IHJ1bkJlZm9yZV8yW2JpdHM+PjldOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgdmFsdWUgPSBydW5CZWZvcmVfM1tiaXRzPj45XTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIHZhbHVlID0gcnVuQmVmb3JlXzRbYml0cz4+OF07Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICB2YWx1ZSA9IHJ1bkJlZm9yZV81W2JpdHM+PjhdOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgdmFsdWUgPSBydW5CZWZvcmVfNltiaXRzPj44XTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpZiAoYml0cyA+PSAweDEwMCkKLSAgICAgICAgICAgICAgICB2YWx1ZSA9ICgoNy0oYml0cz4+OCkpPDw0KSsweDM7Ci0gICAgICAgICAgICBlbHNlIGlmIChiaXRzID49IDB4ODApCi0gICAgICAgICAgICAgICAgdmFsdWUgPSAweDc0OwotICAgICAgICAgICAgZWxzZSBpZiAoYml0cyA+PSAweDQwKQotICAgICAgICAgICAgICAgIHZhbHVlID0gMHg4NTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgyMCkKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IDB4OTY7Ci0gICAgICAgICAgICBlbHNlIGlmIChiaXRzID49IDB4MTApCi0gICAgICAgICAgICAgICAgdmFsdWUgPSAweGE3OwotICAgICAgICAgICAgZWxzZSBpZiAoYml0cyA+PSAweDgpCi0gICAgICAgICAgICAgICAgdmFsdWUgPSAweGI4OwotICAgICAgICAgICAgZWxzZSBpZiAoYml0cyA+PSAweDQpCi0gICAgICAgICAgICAgICAgdmFsdWUgPSAweGM5OwotICAgICAgICAgICAgZWxzZSBpZiAoYml0cyA+PSAweDIpCi0gICAgICAgICAgICAgICAgdmFsdWUgPSAweGRBOwotICAgICAgICAgICAgZWxzZSBpZiAoYml0cykKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IDB4ZUI7Ci0gICAgICAgICAgICBpZiAoSU5GTyh2YWx1ZSkgPiB6ZXJvc0xlZnQpCi0gICAgICAgICAgICAgICAgdmFsdWUgPSAwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuKHZhbHVlKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERlY29kZVJlc2lkdWFsQmxvY2tDYXZsYwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgRnVuY3Rpb24gdG8gZGVjb2RlIG9uZSBDQVZMQyBjb2RlZCBibG9jay4gVGhpcyBjb3JyZXNwb25kcyB0bwotICAgICAgICAgIHN5bnRheCBlbGVtZW50cyByZXNpZHVhbF9ibG9ja19jYXZsYygpIGluIHRoZSBzdGFuZGFyZC4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgcFN0cm1EYXRhICAgICAgICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCi0gICAgICAgICAgbmMgICAgICAgICAgICAgICAgICAgIG5DIHZhbHVlCi0gICAgICAgICAgbWF4TnVtQ29lZmYgICAgICAgICAgIG1heGltdW0gbnVtYmVyIG9mIHJlc2lkdWFsIGNvZWZmaWNpZW50cwotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgY29lZmZMZXZlbCAgICAgICAgICAgIHN0b3JlcyBkZWNvZGVkIGNvZWZmaWNpZW50IGxldmVscwotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgbnVtQ29lZmZzICAgICAgICAgICAgIG9uIGJpdHMgWzQsMTFdIGlmIHN1Y2Nlc3NmdWwKLSAgICAgICAgICBjb2VmZk1hcCAgICAgICAgICAgICAgb24gYml0cyBbMTYsMzFdIGlmIHN1Y2Nlc3NmdWwsIHRoaXMgaXMgYml0IG1hcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBlYWNoIGJpdCBpbmRpY2F0ZXMgaWYgdGhlIGNvcnJlc3BvbmRpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZmZpY2llbnQgd2FzIHplcm8gKDApIG9yIG5vbi16ZXJvICgxKQotICAgICAgICAgIEhBTlRST19OT0sgICAgICAgICAgICBlbmQgb2Ygc3RyZWFtIG9yIGVycm9yIGluIHN0cmVhbQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZERlY29kZVJlc2lkdWFsQmxvY2tDYXZsYygKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBpMzIgKmNvZWZmTGV2ZWwsCi0gIGkzMiBuYywKLSAgdTMyIG1heE51bUNvZWZmKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpLCB0bXAsIHRvdGFsQ29lZmYsIHRyYWlsaW5nT25lcywgc3VmZml4TGVuZ3RoLCBsZXZlbFByZWZpeDsKLSAgICB1MzIgbGV2ZWxTdWZmaXgsIHplcm9zTGVmdCwgYml0OwotICAgIGkzMiBsZXZlbFsxNl07Ci0gICAgdTMyIHJ1blsxNl07Ci0gICAgLyogc3RyZWFtICJjYWNoZSIgKi8KLSAgICB1MzIgYnVmZmVyVmFsdWU7Ci0gICAgdTMyIGJ1ZmZlckJpdHM7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChjb2VmZkxldmVsKTsKLSAgICBBU1NFUlQobmMgPiAtMik7Ci0gICAgQVNTRVJUKG1heE51bUNvZWZmID09IDQgfHwgbWF4TnVtQ29lZmYgPT0gMTUgfHwgbWF4TnVtQ29lZmYgPT0gMTYpOwotICAgIEFTU0VSVChWTENfTk9UX0ZPVU5EICE9IEVORF9PRl9TVFJFQU0pOwotCi0gICAgLyogYXNzdW1lIHRoYXQgY29lZmZMZXZlbCBhcnJheSBoYXMgYmVlbiAiY2xlYW5lZCIgYnkgY2FsbGVyICovCi0KLSAgICBCVUZGRVJfSU5JVChidWZmZXJWYWx1ZSwgYnVmZmVyQml0cyk7Ci0KLSAgICAvKmxpbnQgLWU3NzQgZGlzYWJsZSBsaW50IHdhcm5pbmcgb24gYWx3YXlzIGZhbHNlIGNvbXBhcmlzb24gKi8KLSAgICBCVUZGRVJfU0hPVyhidWZmZXJWYWx1ZSwgYnVmZmVyQml0cywgYml0LCAxNik7Ci0gICAgLypsaW50ICtlNzc0ICovCi0gICAgdG1wID0gRGVjb2RlQ29lZmZUb2tlbihiaXQsICh1MzIpbmMpOwotICAgIGlmICghdG1wKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgQlVGRkVSX0ZMVVNIKGJ1ZmZlclZhbHVlLCBidWZmZXJCaXRzLCBMRU5HVEhfVEModG1wKSk7Ci0KLSAgICB0b3RhbENvZWZmID0gVE9UQUxfQ09FRkYodG1wKTsKLSAgICBpZiAodG90YWxDb2VmZiA+IG1heE51bUNvZWZmKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgdHJhaWxpbmdPbmVzID0gVFJBSUxJTkdfT05FUyh0bXApOwotCi0gICAgaWYgKHRvdGFsQ29lZmYgIT0gMCkKLSAgICB7Ci0gICAgICAgIGkgPSAwOwotICAgICAgICAvKiBub256ZXJvIGNvZWZmaWNpZW50czogKy8tIDEgKi8KLSAgICAgICAgaWYgKHRyYWlsaW5nT25lcykKLSAgICAgICAgewotICAgICAgICAgICAgQlVGRkVSX0dFVChidWZmZXJWYWx1ZSwgYnVmZmVyQml0cywgYml0LCB0cmFpbGluZ09uZXMpOwotICAgICAgICAgICAgdG1wID0gMSA8PCAodHJhaWxpbmdPbmVzIC0gMSk7Ci0gICAgICAgICAgICBmb3IgKDsgdG1wOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGV2ZWxbaV0gPSBiaXQgJiB0bXAgPyAtMSA6IDE7Ci0gICAgICAgICAgICAgICAgdG1wID4+PSAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogb3RoZXIgbGV2ZWxzICovCi0gICAgICAgIGlmICh0b3RhbENvZWZmID4gMTAgJiYgdHJhaWxpbmdPbmVzIDwgMykKLSAgICAgICAgICAgIHN1ZmZpeExlbmd0aCA9IDE7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHN1ZmZpeExlbmd0aCA9IDA7Ci0KLSAgICAgICAgZm9yICg7IGkgPCB0b3RhbENvZWZmOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJVRkZFUl9TSE9XKGJ1ZmZlclZhbHVlLCBidWZmZXJCaXRzLCBiaXQsIDE2KTsKLSAgICAgICAgICAgIGxldmVsUHJlZml4ID0gRGVjb2RlTGV2ZWxQcmVmaXgoYml0KTsKLSAgICAgICAgICAgIGlmIChsZXZlbFByZWZpeCA9PSBWTENfTk9UX0ZPVU5EKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIEJVRkZFUl9GTFVTSChidWZmZXJWYWx1ZSwgYnVmZmVyQml0cywgbGV2ZWxQcmVmaXgrMSk7Ci0KLSAgICAgICAgICAgIGlmIChsZXZlbFByZWZpeCA8IDE0KQotICAgICAgICAgICAgICAgIHRtcCA9IHN1ZmZpeExlbmd0aDsKLSAgICAgICAgICAgIGVsc2UgaWYgKGxldmVsUHJlZml4ID09IDE0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRtcCA9IHN1ZmZpeExlbmd0aCA/IHN1ZmZpeExlbmd0aCA6IDQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogc2V0dGluZyBzdWZmaXhMZW5ndGggdG8gMSBoZXJlIGNvcnJlc3BvbmRzIHRvIGFkZGluZyAxNQotICAgICAgICAgICAgICAgICAqIHRvIGxldmVsQ29kZSB2YWx1ZSBpZiBsZXZlbFByZWZpeCA9PSAxNSBhbmQKLSAgICAgICAgICAgICAgICAgKiBzdWZmaXhMZW5ndGggPT0gMCAqLwotICAgICAgICAgICAgICAgIGlmICghc3VmZml4TGVuZ3RoKQotICAgICAgICAgICAgICAgICAgICBzdWZmaXhMZW5ndGggPSAxOwotICAgICAgICAgICAgICAgIHRtcCA9IDEyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc3VmZml4TGVuZ3RoKQotICAgICAgICAgICAgICAgIGxldmVsUHJlZml4IDw8PSBzdWZmaXhMZW5ndGg7Ci0KLSAgICAgICAgICAgIGlmICh0bXApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQlVGRkVSX0dFVChidWZmZXJWYWx1ZSwgYnVmZmVyQml0cywgbGV2ZWxTdWZmaXgsIHRtcCk7Ci0gICAgICAgICAgICAgICAgbGV2ZWxQcmVmaXggKz0gbGV2ZWxTdWZmaXg7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRtcCA9IGxldmVsUHJlZml4OwotCi0gICAgICAgICAgICBpZiAoaSA9PSB0cmFpbGluZ09uZXMgJiYgdHJhaWxpbmdPbmVzIDwgMykKLSAgICAgICAgICAgICAgICB0bXAgKz0gMjsKLQotICAgICAgICAgICAgbGV2ZWxbaV0gPSAodG1wKzIpPj4xOwotCi0gICAgICAgICAgICBpZiAoc3VmZml4TGVuZ3RoID09IDApCi0gICAgICAgICAgICAgICAgc3VmZml4TGVuZ3RoID0gMTsKLQotICAgICAgICAgICAgaWYgKChsZXZlbFtpXSA+ICgzIDw8IChzdWZmaXhMZW5ndGggLSAxKSkpICYmIHN1ZmZpeExlbmd0aCA8IDYpCi0gICAgICAgICAgICAgICAgc3VmZml4TGVuZ3RoKys7Ci0KLSAgICAgICAgICAgIGlmICh0bXAgJiAweDEpCi0gICAgICAgICAgICAgICAgbGV2ZWxbaV0gPSAtbGV2ZWxbaV07Ci0gICAgICAgIH0KLQotICAgICAgICAvKiB6ZXJvIHJ1bnMgKi8KLSAgICAgICAgaWYgKHRvdGFsQ29lZmYgPCBtYXhOdW1Db2VmZikKLSAgICAgICAgewotICAgICAgICAgICAgQlVGRkVSX1NIT1coYnVmZmVyVmFsdWUsIGJ1ZmZlckJpdHMsIGJpdCw5KTsKLSAgICAgICAgICAgIHplcm9zTGVmdCA9IERlY29kZVRvdGFsWmVyb3MoYml0LCB0b3RhbENvZWZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MzIpKG1heE51bUNvZWZmID09IDQpKTsKLSAgICAgICAgICAgIGlmICghemVyb3NMZWZ0KQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIEJVRkZFUl9GTFVTSChidWZmZXJWYWx1ZSwgYnVmZmVyQml0cywgTEVOR1RIKHplcm9zTGVmdCkpOwotICAgICAgICAgICAgemVyb3NMZWZ0ID0gSU5GTyh6ZXJvc0xlZnQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHplcm9zTGVmdCA9IDA7Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHRvdGFsQ29lZmYgLSAxOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh6ZXJvc0xlZnQgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEJVRkZFUl9TSE9XKGJ1ZmZlclZhbHVlLCBidWZmZXJCaXRzLCBiaXQsMTEpOwotICAgICAgICAgICAgICAgIHRtcCA9IERlY29kZVJ1bkJlZm9yZShiaXQsIHplcm9zTGVmdCk7Ci0gICAgICAgICAgICAgICAgaWYgKCF0bXApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICBCVUZGRVJfRkxVU0goYnVmZmVyVmFsdWUsIGJ1ZmZlckJpdHMsIExFTkdUSCh0bXApKTsKLSAgICAgICAgICAgICAgICBydW5baV0gPSBJTkZPKHRtcCk7Ci0gICAgICAgICAgICAgICAgemVyb3NMZWZ0IC09IHJ1bltpXSsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJ1bltpXSA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBjb21iaW5pbmcgbGV2ZWwgYW5kIHJ1biwgbGV2ZWxTdWZmaXggdmFyaWFibGUgdXNlZCB0byBob2xkIGNvZWZmTWFwLAotICAgICAgICAgKiBpLmUuIGJpdCBtYXAgaW5kaWNhdGluZyB3aGljaCBjb2VmZmljaWVudHMgaGFkIG5vbi16ZXJvIHZhbHVlLiAqLwotCi0gICAgICAgIC8qbGludCAtZXN5bSg3NzEsbGV2ZWwscnVuKSBsZXZlbCBhbmQgcnVuIGFyZSBhbHdheXMgaW5pdGlhbGl6ZWQgKi8KLSAgICAgICAgdG1wID0gemVyb3NMZWZ0OwotICAgICAgICBjb2VmZkxldmVsW3RtcF0gPSBsZXZlbFt0b3RhbENvZWZmLTFdOwotICAgICAgICBsZXZlbFN1ZmZpeCA9IDEgPDwgdG1wOwotICAgICAgICBmb3IgKGkgPSB0b3RhbENvZWZmLTE7IGktLTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcCArPSBydW5baV07Ci0gICAgICAgICAgICBsZXZlbFN1ZmZpeCB8PSAxIDw8IHRtcDsKLSAgICAgICAgICAgIGNvZWZmTGV2ZWxbdG1wXSA9IGxldmVsW2ldOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBsZXZlbFN1ZmZpeCA9IDA7Ci0KLSAgICBpZiAoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsIDMyLWJ1ZmZlckJpdHMpICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgcmV0dXJuKCh0b3RhbENvZWZmIDw8IDQpIHwgKGxldmVsU3VmZml4IDw8IDE2KSk7Ci19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jYXZsYy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NhdmxjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMzUzZDMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NhdmxjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotICAgIDMuIERhdGEgdHlwZXMKLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSDI2NFNXREVDX0NBVkxDX0gKLSNkZWZpbmUgSDI2NFNXREVDX0NBVkxDX0gKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBEYXRhIHR5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkRGVjb2RlUmVzaWR1YWxCbG9ja0NhdmxjKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIGkzMiAqY29lZmZMZXZlbCwKLSAgaTMyIG5jLAotICB1MzIgbWF4TnVtQ29lZmYpOwotCi0jZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19DQVZMQ19IICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jZmcuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jZmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJhYmE1YS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY2ZnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotICAgIDMuIERhdGEgdHlwZXMKLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSDI2NFNXREVDX0NGR19ICi0jZGVmaW5lIEgyNjRTV0RFQ19DRkdfSAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgTUFYX05VTV9SRUZfUElDUyAxNgotI2RlZmluZSBNQVhfTlVNX1NMSUNFX0dST1VQUyA4Ci0jZGVmaW5lIE1BWF9OVU1fU0VRX1BBUkFNX1NFVFMgMzIKLSNkZWZpbmUgTUFYX05VTV9QSUNfUEFSQU1fU0VUUyAyNTYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBEYXRhIHR5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfQ0ZHX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NvbmNlYWwuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jb25jZWFsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMjYyZWQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NvbmNlYWwuYworKysgL2Rldi9udWxsCkBAIC0xLDYyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0gICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0gICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgICAgNS4gRnVuY3Rpb25zCi0gICAgICAgICAgaDI2NGJzZENvbmNlYWwKLSAgICAgICAgICBDb25jZWFsTWIKLSAgICAgICAgICBUcmFuc2Zvcm0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJoMjY0YnNkX2NvbmNlYWwuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3JlY29uc3RydWN0LmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9kcGIuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLypsaW50IC1lNzAyIGRpc2FibGUgbGludCB3YXJuaW5nIG9uIHJpZ2h0IHNoaWZ0IG9mIHNpZ25lZCBxdWFudGl0eSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgQ29uY2VhbE1iKG1iU3RvcmFnZV90ICpwTWIsIGltYWdlX3QgKmN1cnJJbWFnZSwgdTMyIHJvdywgdTMyIGNvbCwKLSAgICB1MzIgc2xpY2VUeXBlLCB1OCAqZGF0YSk7Ci0KLXN0YXRpYyB2b2lkIFRyYW5zZm9ybShpMzIgKmRhdGEpOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogaDI2NGJzZENvbmNlYWwKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgUGVyZm9ybSBlcnJvciBjb25jZWFsbWVudCBmb3IgYSBwaWN0dXJlLiBUd28gdHlwZXMgb2YgY29uY2VhbG1lbnQKLSAgICAgICAgICAgIGlzIHBlcmZvcm1lZCBiYXNlZCBvbiBzbGljZVR5cGU6Ci0gICAgICAgICAgICAgICAgMSkgY29weSBmcm9tIHByZXZpb3VzIHBpY3R1cmUgZm9yIFAtc2xpY2VzLgotICAgICAgICAgICAgICAgIDIpIGNvbmNlYWxtZW50IGZyb20gbmVpZ2hib3VyIHBpeGVscyBmb3IgSS1zbGljZXMKLQotICAgICAgICAgICAgSS10eXBlIGNvbmNlYWxtZW50IGlzIGJhc2VkIG9uIGlkZWFzIHByZXNlbnRlZCBieSBKYXJubyBUdWxra2kuCi0gICAgICAgICAgICBUaGUgY29uY2VhbG1lbnQgYWxnb3JpdGhtIGRldGVybWluZXMgZnJlcXVlbmN5IGRvbWFpbiBjb2VmZmljaWVudHMKLSAgICAgICAgICAgIGZyb20gdGhlIG5laWdoYm91ciBwaXhlbHMsIGFwcGxpZXMgaW50ZWdlciB0cmFuc2Zvcm0gKHRoZSBzYW1lCi0gICAgICAgICAgICB0cmFuc2Zvcm0gdXNlZCBpbiB0aGUgcmVzaWR1YWwgcHJvY2Vzc2luZykgYW5kIHVzZXMgdGhlIHJlc3VsdHMgYXMKLSAgICAgICAgICAgIHBpeGVsIHZhbHVlcyBmb3IgY29uY2VhbGVkIG1hY3JvYmxvY2tzLiBUcmFuc2Zvcm0gcHJvZHVjZXMgNHg0Ci0gICAgICAgICAgICBhcnJheSBhbmQgb25lIHBpeGVsIHZhbHVlIGhhcyB0byBiZSB1c2VkIGZvciA0eDQgbHVtYSBibG9ja3MgYW5kCi0gICAgICAgICAgICAyeDIgY2hyb21hIGJsb2Nrcy4KLQotICAgICAgICAgICAgU2ltaWxhciBjb25jZWFsbWVudCBpcyBwZXJmb3JtZWQgZm9yIHdob2xlIHBpY3R1cmUgKHRoZSBjaG9pc2UKLSAgICAgICAgICAgIG9mIHRoZSB0eXBlIGlzIGJhc2VkIG9uIGxhc3Qgc3VjY2Vzc2Z1bGx5IGRlY29kZWQgc2xpY2UgaGVhZGVyIG9mCi0gICAgICAgICAgICB0aGUgcGljdHVyZSBidXQgaXQgaXMgaGFuZGxlZCBieSB0aGUgY2FsbGluZyBmdW5jdGlvbikuIEl0IGlzCi0gICAgICAgICAgICBhY2tub3dsZWRnZWQgdGhhdCB0aGlzIG1heSByZXN1bHQgaW4gd3JvbmcgdHlwZSBvZiBjb25jZWFsbWVudAotICAgICAgICAgICAgd2hlbiBhIHBpY3R1cmUgY29udGFpbnMgYm90aCB0eXBlcyBvZiBzbGljZXMuIEhvd2V2ZXIsCi0gICAgICAgICAgICBkZXRlcm1pbmF0aW9uIG9mIHNsaWNlIHR5cGUgbWFjcm9ibG9jay1ieS1tYWNyb2Jsb2NrIGNhbm5vdAotICAgICAgICAgICAgYmUgZG9uZSBkdWUgdG8gdGhlIGZhY3QgdGhhdCBpdCBpcyBpbXBvc3NpYmxlIHRvIGtub3cgdG8gd2hpY2gKLSAgICAgICAgICAgIHNsaWNlIGVhY2ggY29ycnVwdGVkIChub3Qgc3VjY2Vzc2Z1bGx5IGRlY29kZWQpIG1hY3JvYmxvY2sKLSAgICAgICAgICAgIGJlbG9uZ3MuCi0KLSAgICAgICAgICAgIFRoZSBlcnJvciBjb25jZWFsbWVudCBpcyBzdGFydGVkIGJ5IHNlYXJjaGluZyB0aGUgZmlyc3QgcHJvcG9lcmx5Ci0gICAgICAgICAgICBkZWNvZGVkIG1hY3JvYmxvY2sgYW5kIGNvbmNlYWxpbmcgdGhlIHJvdyBjb250YWluaW5nIHRoZSBtYWNyb2Jsb2NrCi0gICAgICAgICAgICBpbiBxdWVzdGlvbi4gQWZ0ZXIgdGhhdCBhbGwgbWFjcm9ibG9ja3MgYWJvdmUgdGhlIHJvdyBpbiBxdWVzdGlvbgotICAgICAgICAgICAgYXJlIGNvbmNlYWxlZC4gRmluYWxseSBjb25jZWFsbWVudCBvZiByb3dzIGJlbG93IGlzIHBlcmZvcm1lZC4KLSAgICAgICAgICAgIFRoZSBvcmRlciBvZiBjb25jZWFsbWVudCBmb3IgNHg0IHBpY3R1cmUgd2hlcmUgbWFjcm9ibG9jayA5IGlzIHRoZQotICAgICAgICAgICAgZmlyc3QgcHJvcGVybHkgZGVjb2RlZCBvbmUgaXMgYXMgZm9sbG93cyAocHJvcGVybHkgZGVjb2RlZAotICAgICAgICAgICAgbWFjcm9ibG9ja3MgbWFya2VkIHdpdGggJ3gnLCBudW1iZXJzIGluZGljYXRpbmcgdGhlIG9yZGVyIG9mCi0gICAgICAgICAgICBjb25jZWFsbWVudCk6Ci0KLSAgICAgICAgICAgICAgIDQgIDYgIDggMTAKLSAgICAgICAgICAgICAgIDMgIDUgIDcgIDkKLSAgICAgICAgICAgICAgIDEgIHggIHggIDIKLSAgICAgICAgICAgICAgMTEgMTIgMTMgMTQKLQotICAgICAgICAgICAgSWYgYWxsIG1hY3JvYmxvY2tzIG9mIHRoZSBwaWN0dXJlIGFyZSBsb3N0LCB0aGUgY29uY2VhbG1lbnQgaXMKLSAgICAgICAgICAgIGNvcHkgb2YgcHJldmlvdXMgcGljdHVyZSBmb3IgUC10eXBlIGFuZCBzZXR0aW5nIHRoZSBpbWFnZSB0bwotICAgICAgICAgICAgY29uc3RhbnQgZ3JheSAocGl4ZWwgdmFsdWUgMTI4KSBmb3IgSS10eXBlLgotCi0gICAgICAgICAgICBDb25jZWFsbWVudCBzZXRzIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIGNvbmNlYWxlZAotICAgICAgICAgICAgbWFjcm9ibG9ja3MgdG8gdmFsdWUgNDAgYW5kIG1hY3JvYmxvY2sgdHlwZSB0byBpbnRyYSB0byBlbmFibGUKLSAgICAgICAgICAgIGRlYmxvY2tpbmcgZmlsdGVyIHRvIHNtb290aCB0aGUgZWRnZXMgb2YgdGhlIGNvbmNlYWxlZCBhcmVhcy4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RvcmFnZSAgICAgICAgcG9pbnRlciB0byBzdG9yYWdlIHN0cnVjdHVyZQotICAgICAgICAgICAgY3VyckltYWdlICAgICAgIHBvaW50ZXIgdG8gY3VycmVudCBpbWFnZSBzdHJ1Y3R1cmUKLSAgICAgICAgICAgIHNsaWNlVHlwZSAgICAgICB0eXBlIG9mIHRoZSBzbGljZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBjdXJySW1hZ2UgICAgICAgY29uY2VhbGVkIG1hY3JvYmxvY2tzIHdpbGwgYmUgd3JpdHRlbiBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZENvbmNlYWwoc3RvcmFnZV90ICpwU3RvcmFnZSwgaW1hZ2VfdCAqY3VyckltYWdlLCB1MzIgc2xpY2VUeXBlKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpLCBqOwotICAgIHUzMiByb3csIGNvbDsKLSAgICB1MzIgd2lkdGgsIGhlaWdodDsKLSAgICB1OCAqcmVmRGF0YTsKLSAgICBtYlN0b3JhZ2VfdCAqbWI7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RvcmFnZSk7Ci0gICAgQVNTRVJUKGN1cnJJbWFnZSk7Ci0KLSAgICBERUJVRygoIkNvbmNlYWxpbmcgJXMgc2xpY2VcbiIsIElTX0lfU0xJQ0Uoc2xpY2VUeXBlKSA/Ci0gICAgICAgICAgICAiaW50cmEiIDogImludGVyIikpOwotCi0gICAgd2lkdGggPSBjdXJySW1hZ2UtPndpZHRoOwotICAgIGhlaWdodCA9IGN1cnJJbWFnZS0+aGVpZ2h0OwotICAgIHJlZkRhdGEgPSBOVUxMOwotICAgIC8qIHVzZSByZWZlcmVuY2UgcGljdHVyZSB3aXRoIHNtYWxsZXN0IGF2YWlsYWJsZSBpbmRleCAqLwotICAgIGlmIChJU19QX1NMSUNFKHNsaWNlVHlwZSkgfHwgKHBTdG9yYWdlLT5pbnRyYUNvbmNlYWxtZW50RmxhZyAhPSAwKSkKLSAgICB7Ci0gICAgICAgIGkgPSAwOwotICAgICAgICBkbwotICAgICAgICB7Ci0gICAgICAgICAgICByZWZEYXRhID0gaDI2NGJzZEdldFJlZlBpY0RhdGEocFN0b3JhZ2UtPmRwYiwgaSk7Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICBpZiAoaSA+PSAxNikKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfSB3aGlsZSAocmVmRGF0YSA9PSBOVUxMKTsKLSAgICB9Ci0KLSAgICBpID0gcm93ID0gY29sID0gMDsKLSAgICAvKiBmaW5kIGZpcnN0IHByb3Blcmx5IGRlY29kZWQgbWFjcm9ibG9jayAtPiBzdGFydCBwb2ludCBmb3IgY29uY2VhbG1lbnQgKi8KLSAgICB3aGlsZSAoaSA8IHBTdG9yYWdlLT5waWNTaXplSW5NYnMgJiYgIXBTdG9yYWdlLT5tYltpXS5kZWNvZGVkKQotICAgIHsKLSAgICAgICAgaSsrOwotICAgICAgICBjb2wrKzsKLSAgICAgICAgaWYgKGNvbCA9PSB3aWR0aCkKLSAgICAgICAgewotICAgICAgICAgICAgcm93Kys7Ci0gICAgICAgICAgICBjb2wgPSAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogd2hvbGUgcGljdHVyZSBsb3N0IC0+IGNvcHkgcHJldmlvdXMgb3Igc2V0IGdyZXkgKi8KLSAgICBpZiAoaSA9PSBwU3RvcmFnZS0+cGljU2l6ZUluTWJzKQotICAgIHsKLSAgICAgICAgaWYgKCAoSVNfSV9TTElDRShzbGljZVR5cGUpICYmIChwU3RvcmFnZS0+aW50cmFDb25jZWFsbWVudEZsYWcgPT0gMCkpIHx8Ci0gICAgICAgICAgICAgcmVmRGF0YSA9PSBOVUxMKQotICAgICAgICAgICAgSDI2NFN3RGVjTWVtc2V0KGN1cnJJbWFnZS0+ZGF0YSwgMTI4LCB3aWR0aCpoZWlnaHQqMzg0KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgSDI2NFN3RGVjTWVtY3B5KGN1cnJJbWFnZS0+ZGF0YSwgcmVmRGF0YSwgd2lkdGgqaGVpZ2h0KjM4NCk7Ci0KLSAgICAgICAgcFN0b3JhZ2UtPm51bUNvbmNlYWxlZE1icyA9IHBTdG9yYWdlLT5waWNTaXplSW5NYnM7Ci0KLSAgICAgICAgLyogbm8gZmlsdGVyaW5nIGlmIHdob2xlIHBpY3R1cmUgY29uY2VhbGVkICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwU3RvcmFnZS0+cGljU2l6ZUluTWJzOyBpKyspCi0gICAgICAgICAgICBwU3RvcmFnZS0+bWJbaV0uZGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJZGMgPSAxOwotCi0gICAgICAgIHJldHVybihIQU5UUk9fT0spOwotICAgIH0KLQotICAgIC8qIHN0YXJ0IGZyb20gdGhlIHJvdyBjb250YWluaW5nIHRoZSBmaXJzdCBjb3JyZWN0IG1hY3JvYmxvY2ssIGNvbmNlYWwgdGhlCi0gICAgICogcm93IGluIHF1ZXN0aW9uLCBhbGwgcm93cyBhYm92ZSB0aGF0IHJvdyBhbmQgdGhlbiBjb250aW51ZSBkb3dud2FyZHMgKi8KLSAgICBtYiA9IHBTdG9yYWdlLT5tYiArIHJvdyAqIHdpZHRoOwotICAgIGZvciAoaiA9IGNvbDsgai0tOykKLSAgICB7Ci0gICAgICAgIENvbmNlYWxNYihtYitqLCBjdXJySW1hZ2UsIHJvdywgaiwgc2xpY2VUeXBlLCByZWZEYXRhKTsKLSAgICAgICAgbWJbal0uZGVjb2RlZCA9IDE7Ci0gICAgICAgIHBTdG9yYWdlLT5udW1Db25jZWFsZWRNYnMrKzsKLSAgICB9Ci0gICAgZm9yIChqID0gY29sICsgMTsgaiA8IHdpZHRoOyBqKyspCi0gICAgewotICAgICAgICBpZiAoIW1iW2pdLmRlY29kZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENvbmNlYWxNYihtYitqLCBjdXJySW1hZ2UsIHJvdywgaiwgc2xpY2VUeXBlLCByZWZEYXRhKTsKLSAgICAgICAgICAgIG1iW2pdLmRlY29kZWQgPSAxOwotICAgICAgICAgICAgcFN0b3JhZ2UtPm51bUNvbmNlYWxlZE1icysrOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qIGlmIHByZXZpb3VzIHJvdyhzKSBjb3VsZCBub3QgYmUgY29uY2VhbGVkIC0+IGNvbmNlYWwgdGhlbSBub3cgKi8KLSAgICBpZiAocm93KQotICAgIHsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGkgPSByb3cgLSAxOwotICAgICAgICAgICAgbWIgPSBwU3RvcmFnZS0+bWIgKyBpKndpZHRoICsgajsKLSAgICAgICAgICAgIGRvCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29uY2VhbE1iKG1iLCBjdXJySW1hZ2UsIGksIGosIHNsaWNlVHlwZSwgcmVmRGF0YSk7Ci0gICAgICAgICAgICAgICAgbWItPmRlY29kZWQgPSAxOwotICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5udW1Db25jZWFsZWRNYnMrKzsKLSAgICAgICAgICAgICAgICBtYiAtPSB3aWR0aDsKLSAgICAgICAgICAgIH0gd2hpbGUoaS0tKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIHByb2Nlc3Mgcm93cyBiZWxvdyB0aGUgb25lIGNvbnRhaW5pbmcgdGhlIGZpcnN0IGNvcnJlY3QgbWFjcm9ibG9jayAqLwotICAgIGZvciAoaSA9IHJvdyArIDE7IGkgPCBoZWlnaHQ7IGkrKykKLSAgICB7Ci0gICAgICAgIG1iID0gcFN0b3JhZ2UtPm1iICsgaSAqIHdpZHRoOwotCi0gICAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIW1iW2pdLmRlY29kZWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29uY2VhbE1iKG1iK2osIGN1cnJJbWFnZSwgaSwgaiwgc2xpY2VUeXBlLCByZWZEYXRhKTsKLSAgICAgICAgICAgICAgICBtYltqXS5kZWNvZGVkID0gMTsKLSAgICAgICAgICAgICAgICBwU3RvcmFnZS0+bnVtQ29uY2VhbGVkTWJzKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uIG5hbWU6IENvbmNlYWxNYgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBQZXJmb3JtIGVycm9yIGNvbmNlYWxtZW50IGZvciBvbmUgbWFjcm9ibG9jaywgbG9jYXRpb24gb2YgdGhlCi0gICAgICAgICAgICBtYWNyb2Jsb2NrIGluIHRoZSBwaWN0dXJlIGluZGljYXRlZCBieSByb3cgYW5kIGNvbAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgQ29uY2VhbE1iKG1iU3RvcmFnZV90ICpwTWIsIGltYWdlX3QgKmN1cnJJbWFnZSwgdTMyIHJvdywgdTMyIGNvbCwKLSAgICB1MzIgc2xpY2VUeXBlLCB1OCAqcmVmRGF0YSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaSwgaiwgY29tcDsKLSAgICB1MzIgaG9yLCB2ZXI7Ci0gICAgdTMyIG1iTnVtOwotICAgIHUzMiB3aWR0aCwgaGVpZ2h0OwotICAgIHU4ICptYlBvczsKLSAgICB1OCBkYXRhWzM4NF07Ci0gICAgdTggKnBEYXRhOwotICAgIGkzMiB0bXA7Ci0gICAgaTMyIGZpcnN0UGhhc2VbMTZdOwotICAgIGkzMiAqcFRtcDsKLSAgICAvKiBuZWlnaGJvdXJzIGFib3ZlLCBiZWxvdywgbGVmdCBhbmQgcmlnaHQgKi8KLSAgICBpMzIgYVs0XSA9IHsgMCwwLDAsMCB9LCBiWzRdLCBsWzRdID0geyAwLDAsMCwwIH0sIHJbNF07Ci0gICAgdTMyIEEsIEIsIEwsIFI7Ci0jaWZkZWYgSDI2NERFQ19PTVhETAotICAgIHU4IGZpbGxCdWZmWzMyKjIxICsgMTUgKyAzMl07Ci0gICAgdTggKnBGaWxsOwotI2VuZGlmCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocE1iKTsKLSAgICBBU1NFUlQoIXBNYi0+ZGVjb2RlZCk7Ci0gICAgQVNTRVJUKGN1cnJJbWFnZSk7Ci0gICAgQVNTRVJUKGNvbCA8IGN1cnJJbWFnZS0+d2lkdGgpOwotICAgIEFTU0VSVChyb3cgPCBjdXJySW1hZ2UtPmhlaWdodCk7Ci0KLSNpZmRlZiBIMjY0REVDX09NWERMCi0gICAgcEZpbGwgPSBBTElHTihmaWxsQnVmZiwgMTYpOwotI2VuZGlmCi0gICAgd2lkdGggPSBjdXJySW1hZ2UtPndpZHRoOwotICAgIGhlaWdodCA9IGN1cnJJbWFnZS0+aGVpZ2h0OwotICAgIG1iTnVtID0gcm93ICogd2lkdGggKyBjb2w7Ci0KLSAgICBoMjY0YnNkU2V0Q3VyckltYWdlTWJQb2ludGVycyhjdXJySW1hZ2UsIG1iTnVtKTsKLQotICAgIG1iUG9zID0gY3VyckltYWdlLT5kYXRhICsgcm93ICogMTYgKiB3aWR0aCAqIDE2ICsgY29sICogMTY7Ci0gICAgQSA9IEIgPSBMID0gUiA9IEhBTlRST19GQUxTRTsKLQotICAgIC8qIHNldCBxcFkgdG8gNDAgdG8gZW5hYmxlIHNvbWUgZmlsdGVyaW5nIGluIGRlYmxvY2tpbmcgKHN0ZXRzb24gdmFsdWUpICovCi0gICAgcE1iLT5xcFkgPSA0MDsKLSAgICBwTWItPmRpc2FibGVEZWJsb2NraW5nRmlsdGVySWRjID0gMDsKLSAgICAvKiBtYlR5cGUgc2V0IHRvIGludHJhIHRvIHBlcmZvcm0gZmlsdGVyaW5nIGRlc3BpdGUgdGhlIHZhbHVlcyBvZiBvdGhlcgotICAgICAqIGJvdW5kYXJ5IHN0cmVuZ3RoIGRldGVybWluYXRpb24gZmllbGRzICovCi0gICAgcE1iLT5tYlR5cGUgPSBJXzR4NDsKLSAgICBwTWItPmZpbHRlck9mZnNldEEgPSAwOwotICAgIHBNYi0+ZmlsdGVyT2Zmc2V0QiA9IDA7Ci0gICAgcE1iLT5jaHJvbWFRcEluZGV4T2Zmc2V0ID0gMDsKLQotICAgIGlmIChJU19JX1NMSUNFKHNsaWNlVHlwZSkpCi0gICAgICAgIEgyNjRTd0RlY01lbXNldChkYXRhLCAwLCBzaXplb2YoZGF0YSkpOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG12X3QgbXYgPSB7MCwwfTsKLSAgICAgICAgaW1hZ2VfdCByZWZJbWFnZTsKLSAgICAgICAgcmVmSW1hZ2Uud2lkdGggPSB3aWR0aDsKLSAgICAgICAgcmVmSW1hZ2UuaGVpZ2h0ID0gaGVpZ2h0OwotICAgICAgICByZWZJbWFnZS5kYXRhID0gcmVmRGF0YTsKLSAgICAgICAgaWYgKHJlZkltYWdlLmRhdGEpCi0gICAgICAgIHsKLSNpZm5kZWYgSDI2NERFQ19PTVhETAotICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsICZtdiwgJnJlZkltYWdlLCBjb2wqMTYsIHJvdyoxNiwKLSAgICAgICAgICAgICAgICAwLCAwLCAxNiwgMTYpOwotI2Vsc2UKLSAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCAmbXYsICZyZWZJbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgKChyb3cqMTYpICsgKChjb2wqMTYpPDwxNikpLAotICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDEwLCBwRmlsbCk7Ci0jZW5kaWYKLSAgICAgICAgICAgIGgyNjRic2RXcml0ZU1hY3JvYmxvY2soY3VyckltYWdlLCBkYXRhKTsKLQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgSDI2NFN3RGVjTWVtc2V0KGRhdGEsIDAsIHNpemVvZihkYXRhKSk7Ci0gICAgfQotCi0gICAgSDI2NFN3RGVjTWVtc2V0KGZpcnN0UGhhc2UsIDAsIHNpemVvZihmaXJzdFBoYXNlKSk7Ci0KLSAgICAvKiBjb3VudGVyIGZvciBudW1iZXIgb2YgbmVpZ2hib3VycyB1c2VkICovCi0gICAgaiA9IDA7Ci0gICAgaG9yID0gdmVyID0gMDsKLSAgICBpZiAocm93ICYmIChwTWItd2lkdGgpLT5kZWNvZGVkKQotICAgIHsKLSAgICAgICAgQSA9IEhBTlRST19UUlVFOwotICAgICAgICBwRGF0YSA9IG1iUG9zIC0gd2lkdGgqMTY7Ci0gICAgICAgIGFbMF0gPSAqcERhdGErKzsgYVswXSArPSAqcERhdGErKzsgYVswXSArPSAqcERhdGErKzsgYVswXSArPSAqcERhdGErKzsKLSAgICAgICAgYVsxXSA9ICpwRGF0YSsrOyBhWzFdICs9ICpwRGF0YSsrOyBhWzFdICs9ICpwRGF0YSsrOyBhWzFdICs9ICpwRGF0YSsrOwotICAgICAgICBhWzJdID0gKnBEYXRhKys7IGFbMl0gKz0gKnBEYXRhKys7IGFbMl0gKz0gKnBEYXRhKys7IGFbMl0gKz0gKnBEYXRhKys7Ci0gICAgICAgIGFbM10gPSAqcERhdGErKzsgYVszXSArPSAqcERhdGErKzsgYVszXSArPSAqcERhdGErKzsgYVszXSArPSAqcERhdGErKzsKLSAgICAgICAgaisrOwotICAgICAgICBob3IrKzsKLSAgICAgICAgZmlyc3RQaGFzZVswXSArPSBhWzBdICsgYVsxXSArIGFbMl0gKyBhWzNdOwotICAgICAgICBmaXJzdFBoYXNlWzFdICs9IGFbMF0gKyBhWzFdIC0gYVsyXSAtIGFbM107Ci0gICAgfQotICAgIGlmICgocm93ICE9IGhlaWdodCAtIDEpICYmIChwTWIrd2lkdGgpLT5kZWNvZGVkKQotICAgIHsKLSAgICAgICAgQiA9IEhBTlRST19UUlVFOwotICAgICAgICBwRGF0YSA9IG1iUG9zICsgMTYqd2lkdGgqMTY7Ci0gICAgICAgIGJbMF0gPSAqcERhdGErKzsgYlswXSArPSAqcERhdGErKzsgYlswXSArPSAqcERhdGErKzsgYlswXSArPSAqcERhdGErKzsKLSAgICAgICAgYlsxXSA9ICpwRGF0YSsrOyBiWzFdICs9ICpwRGF0YSsrOyBiWzFdICs9ICpwRGF0YSsrOyBiWzFdICs9ICpwRGF0YSsrOwotICAgICAgICBiWzJdID0gKnBEYXRhKys7IGJbMl0gKz0gKnBEYXRhKys7IGJbMl0gKz0gKnBEYXRhKys7IGJbMl0gKz0gKnBEYXRhKys7Ci0gICAgICAgIGJbM10gPSAqcERhdGErKzsgYlszXSArPSAqcERhdGErKzsgYlszXSArPSAqcERhdGErKzsgYlszXSArPSAqcERhdGErKzsKLSAgICAgICAgaisrOwotICAgICAgICBob3IrKzsKLSAgICAgICAgZmlyc3RQaGFzZVswXSArPSBiWzBdICsgYlsxXSArIGJbMl0gKyBiWzNdOwotICAgICAgICBmaXJzdFBoYXNlWzFdICs9IGJbMF0gKyBiWzFdIC0gYlsyXSAtIGJbM107Ci0gICAgfQotICAgIGlmIChjb2wgJiYgKHBNYi0xKS0+ZGVjb2RlZCkKLSAgICB7Ci0gICAgICAgIEwgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgcERhdGEgPSBtYlBvcyAtIDE7Ci0gICAgICAgIGxbMF0gPSBwRGF0YVswXTsgbFswXSArPSBwRGF0YVsxNip3aWR0aF07Ci0gICAgICAgIGxbMF0gKz0gcERhdGFbMzIqd2lkdGhdOyBsWzBdICs9IHBEYXRhWzQ4KndpZHRoXTsKLSAgICAgICAgcERhdGEgKz0gNjQqd2lkdGg7Ci0gICAgICAgIGxbMV0gPSBwRGF0YVswXTsgbFsxXSArPSBwRGF0YVsxNip3aWR0aF07Ci0gICAgICAgIGxbMV0gKz0gcERhdGFbMzIqd2lkdGhdOyBsWzFdICs9IHBEYXRhWzQ4KndpZHRoXTsKLSAgICAgICAgcERhdGEgKz0gNjQqd2lkdGg7Ci0gICAgICAgIGxbMl0gPSBwRGF0YVswXTsgbFsyXSArPSBwRGF0YVsxNip3aWR0aF07Ci0gICAgICAgIGxbMl0gKz0gcERhdGFbMzIqd2lkdGhdOyBsWzJdICs9IHBEYXRhWzQ4KndpZHRoXTsKLSAgICAgICAgcERhdGEgKz0gNjQqd2lkdGg7Ci0gICAgICAgIGxbM10gPSBwRGF0YVswXTsgbFszXSArPSBwRGF0YVsxNip3aWR0aF07Ci0gICAgICAgIGxbM10gKz0gcERhdGFbMzIqd2lkdGhdOyBsWzNdICs9IHBEYXRhWzQ4KndpZHRoXTsKLSAgICAgICAgaisrOwotICAgICAgICB2ZXIrKzsKLSAgICAgICAgZmlyc3RQaGFzZVswXSArPSBsWzBdICsgbFsxXSArIGxbMl0gKyBsWzNdOwotICAgICAgICBmaXJzdFBoYXNlWzRdICs9IGxbMF0gKyBsWzFdIC0gbFsyXSAtIGxbM107Ci0gICAgfQotICAgIGlmICgoY29sICE9IHdpZHRoIC0gMSkgJiYgKHBNYisxKS0+ZGVjb2RlZCkKLSAgICB7Ci0gICAgICAgIFIgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgcERhdGEgPSBtYlBvcyArIDE2OwotICAgICAgICByWzBdID0gcERhdGFbMF07IHJbMF0gKz0gcERhdGFbMTYqd2lkdGhdOwotICAgICAgICByWzBdICs9IHBEYXRhWzMyKndpZHRoXTsgclswXSArPSBwRGF0YVs0OCp3aWR0aF07Ci0gICAgICAgIHBEYXRhICs9IDY0KndpZHRoOwotICAgICAgICByWzFdID0gcERhdGFbMF07IHJbMV0gKz0gcERhdGFbMTYqd2lkdGhdOwotICAgICAgICByWzFdICs9IHBEYXRhWzMyKndpZHRoXTsgclsxXSArPSBwRGF0YVs0OCp3aWR0aF07Ci0gICAgICAgIHBEYXRhICs9IDY0KndpZHRoOwotICAgICAgICByWzJdID0gcERhdGFbMF07IHJbMl0gKz0gcERhdGFbMTYqd2lkdGhdOwotICAgICAgICByWzJdICs9IHBEYXRhWzMyKndpZHRoXTsgclsyXSArPSBwRGF0YVs0OCp3aWR0aF07Ci0gICAgICAgIHBEYXRhICs9IDY0KndpZHRoOwotICAgICAgICByWzNdID0gcERhdGFbMF07IHJbM10gKz0gcERhdGFbMTYqd2lkdGhdOwotICAgICAgICByWzNdICs9IHBEYXRhWzMyKndpZHRoXTsgclszXSArPSBwRGF0YVs0OCp3aWR0aF07Ci0gICAgICAgIGorKzsKLSAgICAgICAgdmVyKys7Ci0gICAgICAgIGZpcnN0UGhhc2VbMF0gKz0gclswXSArIHJbMV0gKyByWzJdICsgclszXTsKLSAgICAgICAgZmlyc3RQaGFzZVs0XSArPSByWzBdICsgclsxXSAtIHJbMl0gLSByWzNdOwotICAgIH0KLQotICAgIC8qIGF0IGxlYXN0IG9uZSBwcm9wZXJseSBkZWNvZGVkIG5laWdoYm91ciBhdmFpbGFibGUgKi8KLSAgICBBU1NFUlQoaik7Ci0KLSAgICAvKmxpbnQgLWVzeW0oNjQ0LGwscixhLGIpIHZhcmlhYmxlIGluaXRpYWxpemVkIGFib3ZlICovCi0gICAgaWYgKCFob3IgJiYgTCAmJiBSKQotICAgICAgICBmaXJzdFBoYXNlWzFdID0gKGxbMF0rbFsxXStsWzJdK2xbM10tclswXS1yWzFdLXJbMl0tclszXSkgPj4gNTsKLSAgICBlbHNlIGlmIChob3IpCi0gICAgICAgIGZpcnN0UGhhc2VbMV0gPj49ICgzK2hvcik7Ci0KLSAgICBpZiAoIXZlciAmJiBBICYmIEIpCi0gICAgICAgIGZpcnN0UGhhc2VbNF0gPSAoYVswXSthWzFdK2FbMl0rYVszXS1iWzBdLWJbMV0tYlsyXS1iWzNdKSA+PiA1OwotICAgIGVsc2UgaWYgKHZlcikKLSAgICAgICAgZmlyc3RQaGFzZVs0XSA+Pj0gKDMrdmVyKTsKLQotICAgIHN3aXRjaCAoaikKLSAgICB7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIGZpcnN0UGhhc2VbMF0gPj49IDQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICBmaXJzdFBoYXNlWzBdID4+PSA1OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgLyogYXBwcm94aW1hdGUgKGZpcnN0UGhhc2VbMF0qNC8zKT4+NiAqLwotICAgICAgICAgICAgZmlyc3RQaGFzZVswXSA9ICgyMSAqIGZpcnN0UGhhc2VbMF0pID4+IDEwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDogLyogNCAqLwotICAgICAgICAgICAgZmlyc3RQaGFzZVswXSA+Pj0gNjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgfQotCi0KLSAgICBUcmFuc2Zvcm0oZmlyc3RQaGFzZSk7Ci0KLSAgICBmb3IgKGkgPSAwLCBwRGF0YSA9IGRhdGEsIHBUbXAgPSBmaXJzdFBoYXNlOyBpIDwgMjU2OykKLSAgICB7Ci0gICAgICAgIHRtcCA9IHBUbXBbKGkgJiAweEYpPj4yXTsKLSAgICAgICAgLypsaW50IC1lNzM0IENMSVAxIG1hY3JvIHJlc3VsdHMgaW4gdmFsdWUgdGhhdCBmaXRzIGludG8gOCBiaXRzICovCi0gICAgICAgICpwRGF0YSsrID0gQ0xJUDEodG1wKTsKLSAgICAgICAgLypsaW50ICtlNzM0ICovCi0KLSAgICAgICAgaSsrOwotICAgICAgICBpZiAoIShpICYgMHgzRikpCi0gICAgICAgICAgICBwVG1wICs9IDQ7Ci0gICAgfQotCi0gICAgLyogY2hyb21hIGNvbXBvbmVudHMgKi8KLSAgICBtYlBvcyA9IGN1cnJJbWFnZS0+ZGF0YSArIHdpZHRoICogaGVpZ2h0ICogMjU2ICsKLSAgICAgICByb3cgKiA4ICogd2lkdGggKiA4ICsgY29sICogODsKLSAgICBmb3IgKGNvbXAgPSAwOyBjb21wIDwgMjsgY29tcCsrKQotICAgIHsKLQotICAgICAgICBIMjY0U3dEZWNNZW1zZXQoZmlyc3RQaGFzZSwgMCwgc2l6ZW9mKGZpcnN0UGhhc2UpKTsKLQotICAgICAgICAvKiBjb3VudGVyIGZvciBudW1iZXIgb2YgbmVpZ2hib3VycyB1c2VkICovCi0gICAgICAgIGogPSAwOwotICAgICAgICBob3IgPSB2ZXIgPSAwOwotICAgICAgICBpZiAoQSkKLSAgICAgICAgewotICAgICAgICAgICAgcERhdGEgPSBtYlBvcyAtIHdpZHRoKjg7Ci0gICAgICAgICAgICBhWzBdID0gKnBEYXRhKys7IGFbMF0gKz0gKnBEYXRhKys7Ci0gICAgICAgICAgICBhWzFdID0gKnBEYXRhKys7IGFbMV0gKz0gKnBEYXRhKys7Ci0gICAgICAgICAgICBhWzJdID0gKnBEYXRhKys7IGFbMl0gKz0gKnBEYXRhKys7Ci0gICAgICAgICAgICBhWzNdID0gKnBEYXRhKys7IGFbM10gKz0gKnBEYXRhKys7Ci0gICAgICAgICAgICBqKys7Ci0gICAgICAgICAgICBob3IrKzsKLSAgICAgICAgICAgIGZpcnN0UGhhc2VbMF0gKz0gYVswXSArIGFbMV0gKyBhWzJdICsgYVszXTsKLSAgICAgICAgICAgIGZpcnN0UGhhc2VbMV0gKz0gYVswXSArIGFbMV0gLSBhWzJdIC0gYVszXTsKLSAgICAgICAgfQotICAgICAgICBpZiAoQikKLSAgICAgICAgewotICAgICAgICAgICAgcERhdGEgPSBtYlBvcyArIDgqd2lkdGgqODsKLSAgICAgICAgICAgIGJbMF0gPSAqcERhdGErKzsgYlswXSArPSAqcERhdGErKzsKLSAgICAgICAgICAgIGJbMV0gPSAqcERhdGErKzsgYlsxXSArPSAqcERhdGErKzsKLSAgICAgICAgICAgIGJbMl0gPSAqcERhdGErKzsgYlsyXSArPSAqcERhdGErKzsKLSAgICAgICAgICAgIGJbM10gPSAqcERhdGErKzsgYlszXSArPSAqcERhdGErKzsKLSAgICAgICAgICAgIGorKzsKLSAgICAgICAgICAgIGhvcisrOwotICAgICAgICAgICAgZmlyc3RQaGFzZVswXSArPSBiWzBdICsgYlsxXSArIGJbMl0gKyBiWzNdOwotICAgICAgICAgICAgZmlyc3RQaGFzZVsxXSArPSBiWzBdICsgYlsxXSAtIGJbMl0gLSBiWzNdOwotICAgICAgICB9Ci0gICAgICAgIGlmIChMKQotICAgICAgICB7Ci0gICAgICAgICAgICBwRGF0YSA9IG1iUG9zIC0gMTsKLSAgICAgICAgICAgIGxbMF0gPSBwRGF0YVswXTsgbFswXSArPSBwRGF0YVs4KndpZHRoXTsKLSAgICAgICAgICAgIHBEYXRhICs9IDE2KndpZHRoOwotICAgICAgICAgICAgbFsxXSA9IHBEYXRhWzBdOyBsWzFdICs9IHBEYXRhWzgqd2lkdGhdOwotICAgICAgICAgICAgcERhdGEgKz0gMTYqd2lkdGg7Ci0gICAgICAgICAgICBsWzJdID0gcERhdGFbMF07IGxbMl0gKz0gcERhdGFbOCp3aWR0aF07Ci0gICAgICAgICAgICBwRGF0YSArPSAxNip3aWR0aDsKLSAgICAgICAgICAgIGxbM10gPSBwRGF0YVswXTsgbFszXSArPSBwRGF0YVs4KndpZHRoXTsKLSAgICAgICAgICAgIGorKzsKLSAgICAgICAgICAgIHZlcisrOwotICAgICAgICAgICAgZmlyc3RQaGFzZVswXSArPSBsWzBdICsgbFsxXSArIGxbMl0gKyBsWzNdOwotICAgICAgICAgICAgZmlyc3RQaGFzZVs0XSArPSBsWzBdICsgbFsxXSAtIGxbMl0gLSBsWzNdOwotICAgICAgICB9Ci0gICAgICAgIGlmIChSKQotICAgICAgICB7Ci0gICAgICAgICAgICBwRGF0YSA9IG1iUG9zICsgODsKLSAgICAgICAgICAgIHJbMF0gPSBwRGF0YVswXTsgclswXSArPSBwRGF0YVs4KndpZHRoXTsKLSAgICAgICAgICAgIHBEYXRhICs9IDE2KndpZHRoOwotICAgICAgICAgICAgclsxXSA9IHBEYXRhWzBdOyByWzFdICs9IHBEYXRhWzgqd2lkdGhdOwotICAgICAgICAgICAgcERhdGEgKz0gMTYqd2lkdGg7Ci0gICAgICAgICAgICByWzJdID0gcERhdGFbMF07IHJbMl0gKz0gcERhdGFbOCp3aWR0aF07Ci0gICAgICAgICAgICBwRGF0YSArPSAxNip3aWR0aDsKLSAgICAgICAgICAgIHJbM10gPSBwRGF0YVswXTsgclszXSArPSBwRGF0YVs4KndpZHRoXTsKLSAgICAgICAgICAgIGorKzsKLSAgICAgICAgICAgIHZlcisrOwotICAgICAgICAgICAgZmlyc3RQaGFzZVswXSArPSByWzBdICsgclsxXSArIHJbMl0gKyByWzNdOwotICAgICAgICAgICAgZmlyc3RQaGFzZVs0XSArPSByWzBdICsgclsxXSAtIHJbMl0gLSByWzNdOwotICAgICAgICB9Ci0gICAgICAgIGlmICghaG9yICYmIEwgJiYgUikKLSAgICAgICAgICAgIGZpcnN0UGhhc2VbMV0gPSAobFswXStsWzFdK2xbMl0rbFszXS1yWzBdLXJbMV0tclsyXS1yWzNdKSA+PiA0OwotICAgICAgICBlbHNlIGlmIChob3IpCi0gICAgICAgICAgICBmaXJzdFBoYXNlWzFdID4+PSAoMitob3IpOwotCi0gICAgICAgIGlmICghdmVyICYmIEEgJiYgQikKLSAgICAgICAgICAgIGZpcnN0UGhhc2VbNF0gPSAoYVswXSthWzFdK2FbMl0rYVszXS1iWzBdLWJbMV0tYlsyXS1iWzNdKSA+PiA0OwotICAgICAgICBlbHNlIGlmICh2ZXIpCi0gICAgICAgICAgICBmaXJzdFBoYXNlWzRdID4+PSAoMit2ZXIpOwotCi0gICAgICAgIHN3aXRjaCAoaikKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgIGZpcnN0UGhhc2VbMF0gPj49IDM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICBmaXJzdFBoYXNlWzBdID4+PSA0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgLyogYXBwcm94aW1hdGUgKGZpcnN0UGhhc2VbMF0qNC8zKT4+NSAqLwotICAgICAgICAgICAgICAgIGZpcnN0UGhhc2VbMF0gPSAoMjEgKiBmaXJzdFBoYXNlWzBdKSA+PiA5OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OiAvKiA0ICovCi0gICAgICAgICAgICAgICAgZmlyc3RQaGFzZVswXSA+Pj0gNTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICB9Ci0KLSAgICAgICAgVHJhbnNmb3JtKGZpcnN0UGhhc2UpOwotCi0gICAgICAgIHBEYXRhID0gZGF0YSArIDI1NiArIGNvbXAqNjQ7Ci0gICAgICAgIGZvciAoaSA9IDAsIHBUbXAgPSBmaXJzdFBoYXNlOyBpIDwgNjQ7KQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSBwVG1wWyhpICYgMHg3KT4+MV07Ci0gICAgICAgICAgICAvKmxpbnQgLWU3MzQgQ0xJUDEgbWFjcm8gcmVzdWx0cyBpbiB2YWx1ZSB0aGF0IGZpdHMgaW50byA4IGJpdHMgKi8KLSAgICAgICAgICAgICpwRGF0YSsrID0gQ0xJUDEodG1wKTsKLSAgICAgICAgICAgIC8qbGludCArZTczNCAqLwotCi0gICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICBpZiAoIShpICYgMHhGKSkKLSAgICAgICAgICAgICAgICBwVG1wICs9IDQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBpbmNyZW1lbnQgcG9pbnRlcnMgZm9yIGNyICovCi0gICAgICAgIG1iUG9zICs9IHdpZHRoICogaGVpZ2h0ICogNjQ7Ci0gICAgfQotCi0gICAgaDI2NGJzZFdyaXRlTWFjcm9ibG9jayhjdXJySW1hZ2UsIGRhdGEpOwotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogVHJhbnNmb3JtCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIFNpbXBsaWZpZWQgdHJhbnNmb3JtLCBhc3N1bWluZyB0aGF0IG9ubHkgZGMgY29tcG9uZW50IGFuZCBsb3dlc3QKLSAgICAgICAgICAgIGhvcml6b250YWwgYW5kIGxvd2VzdCB2ZXJ0aWNhbCBjb21wb25lbnQgbWF5IGJlIG5vbi16ZXJvCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgVHJhbnNmb3JtKGkzMiAqZGF0YSkKLXsKLQotICAgIHUzMiBjb2w7Ci0gICAgaTMyIHRtcDAsIHRtcDE7Ci0KLSAgICBpZiAoIWRhdGFbMV0gJiYgIWRhdGFbNF0pCi0gICAgewotICAgICAgICBkYXRhWzFdICA9IGRhdGFbMl0gID0gZGF0YVszXSAgPSBkYXRhWzRdICA9IGRhdGFbNV0gID0KLSAgICAgICAgZGF0YVs2XSAgPSBkYXRhWzddICA9IGRhdGFbOF0gID0gZGF0YVs5XSAgPSBkYXRhWzEwXSA9Ci0gICAgICAgIGRhdGFbMTFdID0gZGF0YVsxMl0gPSBkYXRhWzEzXSA9IGRhdGFbMTRdID0gZGF0YVsxNV0gPSBkYXRhWzBdOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIC8qIGZpcnN0IGhvcml6b250YWwgdHJhbnNmb3JtIGZvciByb3dzIDAgYW5kIDEgKi8KLSAgICB0bXAwID0gZGF0YVswXTsKLSAgICB0bXAxID0gZGF0YVsxXTsKLSAgICBkYXRhWzBdID0gdG1wMCArIHRtcDE7Ci0gICAgZGF0YVsxXSA9IHRtcDAgKyAodG1wMT4+MSk7Ci0gICAgZGF0YVsyXSA9IHRtcDAgLSAodG1wMT4+MSk7Ci0gICAgZGF0YVszXSA9IHRtcDAgLSB0bXAxOwotCi0gICAgdG1wMCA9IGRhdGFbNF07Ci0gICAgZGF0YVs1XSA9IHRtcDA7Ci0gICAgZGF0YVs2XSA9IHRtcDA7Ci0gICAgZGF0YVs3XSA9IHRtcDA7Ci0KLSAgICAvKiB0aGVuIHZlcnRpY2FsIHRyYW5zZm9ybSAqLwotICAgIGZvciAoY29sID0gNDsgY29sLS07IGRhdGErKykKLSAgICB7Ci0gICAgICAgIHRtcDAgPSBkYXRhWzBdOwotICAgICAgICB0bXAxID0gZGF0YVs0XTsKLSAgICAgICAgZGF0YVswXSA9IHRtcDAgKyB0bXAxOwotICAgICAgICBkYXRhWzRdID0gdG1wMCArICh0bXAxPj4xKTsKLSAgICAgICAgZGF0YVs4XSA9IHRtcDAgLSAodG1wMT4+MSk7Ci0gICAgICAgIGRhdGFbMTJdID0gdG1wMCAtIHRtcDE7Ci0gICAgfQotCi19Ci0vKmxpbnQgK2U3MDIgKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NvbmNlYWwuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jb25jZWFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMzQ2NzAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NvbmNlYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0gICAgMy4gRGF0YSB0eXBlcwotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBIMjY0U1dERUNfQ09OQ0VBTF9ICi0jZGVmaW5lIEgyNjRTV0RFQ19DT05DRUFMX0gKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2Rfc2xpY2VfaGVhZGVyLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zdG9yYWdlLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gRGF0YSB0eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZENvbmNlYWwoc3RvcmFnZV90ICpwU3RvcmFnZSwgaW1hZ2VfdCAqY3VyckltYWdlLCB1MzIgc2xpY2VUeXBlKTsKLQotI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfQ09OQ0VBTF9IICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jb250YWluZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jb250YWluZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTliNzRhMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY29udGFpbmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotICAgIDMuIERhdGEgdHlwZXMKLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSDI2NFNXREVDX0NPTlRBSU5FUl9ICi0jZGVmaW5lIEgyNjRTV0RFQ19DT05UQUlORVJfSAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zdG9yYWdlLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIFN0cmluZyBsZW5ndGggZm9yIHRyYWNpbmcgKi8KLSNkZWZpbmUgSDI2NERFQ19UUkFDRV9TVFJfTEVOIDEwMAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIERhdGEgdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgZW51bSB7Ci0gICAgICAgIFVOSU5JVElBTElaRUQsCi0gICAgICAgIElOSVRJQUxJWkVELAotICAgICAgICBORVdfSEVBREVSUwotICAgIH0gZGVjU3RhdDsKLQotICAgIHUzMiBwaWNOdW1iZXI7Ci0gICAgc3RvcmFnZV90IHN0b3JhZ2U7Ci0jaWZkZWYgSDI2NERFQ19UUkFDRQotICAgIGNoYXIgc3RyW0gyNjRERUNfVFJBQ0VfU1RSX0xFTl07Ci0jZW5kaWYKLX0gZGVjQ29udGFpbmVyX3Q7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfREVDQ09OVEFJTkVSX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RlYmxvY2tpbmcuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kZWJsb2NraW5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4YzFmNzYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RlYmxvY2tpbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDI0MTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotICAgICAzLiBNb2R1bGUgZGVmaW5lcwotICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0gICAgIDUuIEZ1bmN0aW9ucwotICAgICAgICAgIGgyNjRic2RGaWx0ZXJQaWN0dXJlCi0gICAgICAgICAgRmlsdGVyVmVyTHVtYUVkZ2UKLSAgICAgICAgICBGaWx0ZXJIb3JMdW1hRWRnZQotICAgICAgICAgIEZpbHRlckhvckx1bWEKLSAgICAgICAgICBGaWx0ZXJWZXJDaHJvbWFFZGdlCi0gICAgICAgICAgRmlsdGVySG9yQ2hyb21hRWRnZQotICAgICAgICAgIEZpbHRlckhvckNocm9tYQotICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aAotICAgICAgICAgIEVkZ2VCb3VuZGFyeVN0cmVuZ3RoCi0gICAgICAgICAgR2V0Qm91bmRhcnlTdHJlbmd0aHMKLSAgICAgICAgICBJc1NsaWNlQm91bmRhcnlPbkxlZnQKLSAgICAgICAgICBJc1NsaWNlQm91bmRhcnlPblRvcAotICAgICAgICAgIEdldE1iRmlsdGVyaW5nRmxhZ3MKLSAgICAgICAgICBHZXRMdW1hRWRnZVRocmVzaG9sZHMKLSAgICAgICAgICBHZXRDaHJvbWFFZGdlVGhyZXNob2xkcwotICAgICAgICAgIEZpbHRlckx1bWEKLSAgICAgICAgICBGaWx0ZXJDaHJvbWEKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgotI2luY2x1ZGUgImgyNjRic2RfbWFjcm9ibG9ja19sYXllci5oIgotI2luY2x1ZGUgImgyNjRic2RfZGVibG9ja2luZy5oIgotI2luY2x1ZGUgImgyNjRic2RfZHBiLmgiCi0KLSNpZmRlZiBIMjY0REVDX09NWERMCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0jZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBTd2l0Y2ggb2ZmIHRoZSBmb2xsb3dpbmcgTGludCBtZXNzYWdlcyBmb3IgdGhpcyBmaWxlOgotICogSW5mbyA3MDE6IFNoaWZ0IGxlZnQgb2Ygc2lnbmVkIHF1YW50aXR5IChpbnQpCi0gKiBJbmZvIDcwMjogU2hpZnQgcmlnaHQgb2Ygc2lnbmVkIHF1YW50aXR5IChpbnQpCi0gKi8KLS8qbGludCAtZTcwMSAtZTcwMiAqLwotCi0vKiBhcnJheSBvZiBhbHBoYSB2YWx1ZXMsIGZyb20gdGhlIHN0YW5kYXJkICovCi1zdGF0aWMgY29uc3QgdTggYWxwaGFzWzUyXSA9IHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDQsNCw1LDYsNyw4LDksMTAsCi0gICAgMTIsMTMsMTUsMTcsMjAsMjIsMjUsMjgsMzIsMzYsNDAsNDUsNTAsNTYsNjMsNzEsODAsOTAsMTAxLDExMywxMjcsMTQ0LDE2MiwKLSAgICAxODIsMjAzLDIyNiwyNTUsMjU1fTsKLQotLyogYXJyYXkgb2YgYmV0YSB2YWx1ZXMsIGZyb20gdGhlIHN0YW5kYXJkICovCi1zdGF0aWMgY29uc3QgdTggYmV0YXNbNTJdID0gezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwyLDIsMywzLDMsMyw0LDQsCi0gICAgNCw2LDYsNyw3LDgsOCw5LDksMTAsMTAsMTEsMTEsMTIsMTIsMTMsMTMsMTQsMTQsMTUsMTUsMTYsMTYsMTcsMTcsMTgsMTh9OwotCi0KLQotI2lmbmRlZiBIMjY0REVDX09NWERMCi0vKiBhcnJheSBvZiB0YzAgdmFsdWVzLCBmcm9tIHRoZSBzdGFuZGFyZCwgZWFjaCB0cmlwbGV0IGNvcnJlc3BvbmRzIHRvIGEKLSAqIGNvbHVtbiBpbiB0aGUgdGFibGUuIEluZGV4aW5nIGdvZXMgYXMgdGMwW2luZGV4QV1bYlMtMV0gKi8KLXN0YXRpYyBjb25zdCB1OCB0YzBbNTJdWzNdID0gewotICAgIHswLDAsMH0sezAsMCwwfSx7MCwwLDB9LHswLDAsMH0sezAsMCwwfSx7MCwwLDB9LHswLDAsMH0sezAsMCwwfSwKLSAgICB7MCwwLDB9LHswLDAsMH0sezAsMCwwfSx7MCwwLDB9LHswLDAsMH0sezAsMCwwfSx7MCwwLDB9LHswLDAsMH0sCi0gICAgezAsMCwwfSx7MCwwLDF9LHswLDAsMX0sezAsMCwxfSx7MCwwLDF9LHswLDEsMX0sezAsMSwxfSx7MSwxLDF9LAotICAgIHsxLDEsMX0sezEsMSwxfSx7MSwxLDF9LHsxLDEsMn0sezEsMSwyfSx7MSwxLDJ9LHsxLDEsMn0sezEsMiwzfSwKLSAgICB7MSwyLDN9LHsyLDIsM30sezIsMiw0fSx7MiwzLDR9LHsyLDMsNH0sezMsMyw1fSx7Myw0LDZ9LHszLDQsNn0sCi0gICAgezQsNSw3fSx7NCw1LDh9LHs0LDYsOX0sezUsNywxMH0sezYsOCwxMX0sezYsOCwxM30sezcsMTAsMTR9LHs4LDExLDE2fSwKLSAgICB7OSwxMiwxOH0sezEwLDEzLDIwfSx7MTEsMTUsMjN9LHsxMywxNywyNX0KLX07Ci0jZWxzZQotLyogYXJyYXkgb2YgdGMwIHZhbHVlcywgZnJvbSB0aGUgc3RhbmRhcmQsIGVhY2ggdHJpcGxldCBjb3JyZXNwb25kcyB0byBhCi0gKiBjb2x1bW4gaW4gdGhlIHRhYmxlLiBJbmRleGluZyBnb2VzIGFzIHRjMFtpbmRleEFdW2JTXSAqLwotc3RhdGljIGNvbnN0IHU4IHRjMFs1Ml1bNV0gPSB7Ci0gICAgezAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDB9LAotICAgIHswLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwLCAwfSwKLSAgICB7MCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMH0sCi0gICAgezAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDB9LAotICAgIHswLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDEsIDB9LCB7MCwgMCwgMCwgMSwgMH0sIHswLCAwLCAwLCAxLCAwfSwKLSAgICB7MCwgMCwgMCwgMSwgMH0sIHswLCAwLCAxLCAxLCAwfSwgezAsIDAsIDEsIDEsIDB9LCB7MCwgMSwgMSwgMSwgMH0sCi0gICAgezAsIDEsIDEsIDEsIDB9LCB7MCwgMSwgMSwgMSwgMH0sIHswLCAxLCAxLCAxLCAwfSwgezAsIDEsIDEsIDIsIDB9LAotICAgIHswLCAxLCAxLCAyLCAwfSwgezAsIDEsIDEsIDIsIDB9LCB7MCwgMSwgMSwgMiwgMH0sIHswLCAxLCAyLCAzLCAwfSwKLSAgICB7MCwgMSwgMiwgMywgMH0sIHswLCAyLCAyLCAzLCAwfSwgezAsIDIsIDIsIDQsIDB9LCB7MCwgMiwgMywgNCwgMH0sCi0gICAgezAsIDIsIDMsIDQsIDB9LCB7MCwgMywgMywgNSwgMH0sIHswLCAzLCA0LCA2LCAwfSwgezAsIDMsIDQsIDYsIDB9LAotICAgIHswLCA0LCA1LCA3LCAwfSwgezAsIDQsIDUsIDgsIDB9LCB7MCwgNCwgNiwgOSwgMH0sIHswLCA1LCA3LCAxMCwgMH0sCi0gICAgezAsIDYsIDgsIDExLCAwfSwgezAsIDYsIDgsIDEzLCAwfSwgezAsIDcsIDEwLCAxNCwgMH0sCi0gICAgezAsIDgsIDExLCAxNiwgMH0sIHswLCA5LCAxMiwgMTgsIDB9LCB7MCwgMTAsIDEzLCAyMCwgMH0sCi0gICAgezAsIDExLCAxNSwgMjMsIDB9LCB7MCwgMTMsIDE3LCAyNSwgMH0KLX07Ci0jZW5kaWYKLQotCi0jaWZuZGVmIEgyNjRERUNfT01YREwKLS8qIG1hcHBpbmcgb2YgcmFzdGVyIHNjYW4gYmxvY2sgaW5kZXggdG8gNHg0IGJsb2NrIGluZGV4ICovCi1zdGF0aWMgY29uc3QgdTMyIG1iNHg0SW5kZXhbMTZdID0KLSAgICB7MCwgMSwgNCwgNSwgMiwgMywgNiwgNywgOCwgOSwgMTIsIDEzLCAxMCwgMTEsIDE0LCAxNX07Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBjb25zdCB1OCAqdGMwOwotICAgIHUzMiBhbHBoYTsKLSAgICB1MzIgYmV0YTsKLX0gZWRnZVRocmVzaG9sZF90OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdTMyIHRvcDsKLSAgICB1MzIgbGVmdDsKLX0gYlNfdDsKLQotZW51bSB7IFRPUCA9IDAsIExFRlQgPSAxLCBJTk5FUiA9IDIgfTsKLSNlbmRpZiAvKiBIMjY0REVDX09NWERMICovCi0KLSNkZWZpbmUgRklMVEVSX0xFRlRfRURHRSAgICAweDA0Ci0jZGVmaW5lIEZJTFRFUl9UT1BfRURHRSAgICAgMHgwMgotI2RlZmluZSBGSUxURVJfSU5ORVJfRURHRSAgIDB4MDEKLQotCi0vKiBjbGlwcGluZyB0YWJsZSBkZWZpbmVkIGluIGludHJhX3ByZWRpY3Rpb24uYyAqLwotZXh0ZXJuIGNvbnN0IHU4IGgyNjRic2RDbGlwW107Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWJTdG9yYWdlX3QgKm1iMSwgdTMyIGkxLCB1MzIgaTIpOwotCi0jaWZuZGVmIEgyNjRERUNfT01YREwKLXN0YXRpYyB1MzIgRWRnZUJvdW5kYXJ5U3RyZW5ndGgobWJTdG9yYWdlX3QgKm1iMSwgbWJTdG9yYWdlX3QgKm1iMiwKLSAgICB1MzIgaTEsIHUzMiBpMik7Ci0jZWxzZQotc3RhdGljIHUzMiBJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iU3RvcmFnZV90ICptYjEsIHUzMiBpMSwgdTMyIGkyKTsKLXN0YXRpYyB1MzIgRWRnZUJvdW5kYXJ5U3RyZW5ndGhMZWZ0KG1iU3RvcmFnZV90ICptYjEsIG1iU3RvcmFnZV90ICptYjIpOwotc3RhdGljIHUzMiBFZGdlQm91bmRhcnlTdHJlbmd0aFRvcChtYlN0b3JhZ2VfdCAqbWIxLCBtYlN0b3JhZ2VfdCAqbWIyKTsKLSNlbmRpZgotCi1zdGF0aWMgdTMyIElzU2xpY2VCb3VuZGFyeU9uTGVmdChtYlN0b3JhZ2VfdCAqbWIpOwotCi1zdGF0aWMgdTMyIElzU2xpY2VCb3VuZGFyeU9uVG9wKG1iU3RvcmFnZV90ICptYik7Ci0KLXN0YXRpYyB1MzIgR2V0TWJGaWx0ZXJpbmdGbGFncyhtYlN0b3JhZ2VfdCAqbWIpOwotCi0jaWZuZGVmIEgyNjRERUNfT01YREwKLQotc3RhdGljIHUzMiBHZXRCb3VuZGFyeVN0cmVuZ3RocyhtYlN0b3JhZ2VfdCAqbWIsIGJTX3QgKmJzLCB1MzIgZmxhZ3MpOwotCi1zdGF0aWMgdm9pZCBGaWx0ZXJMdW1hKHU4ICpkYXRhLCBiU190ICpiUywgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAotICAgICAgICB1MzIgaW1hZ2VXaWR0aCk7Ci0KLXN0YXRpYyB2b2lkIEZpbHRlckNocm9tYSh1OCAqY2IsIHU4ICpjciwgYlNfdCAqYlMsIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKLSAgICAgICAgdTMyIGltYWdlV2lkdGgpOwotCi1zdGF0aWMgdm9pZCBGaWx0ZXJWZXJMdW1hRWRnZSggdTggKmRhdGEsIHUzMiBiUywgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAotICAgICAgICB1MzIgaW1hZ2VXaWR0aCk7Ci1zdGF0aWMgdm9pZCBGaWx0ZXJIb3JMdW1hRWRnZSggdTggKmRhdGEsIHUzMiBiUywgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAotICAgICAgICBpMzIgaW1hZ2VXaWR0aCk7Ci1zdGF0aWMgdm9pZCBGaWx0ZXJIb3JMdW1hKCB1OCAqZGF0YSwgdTMyIGJTLCBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCi0gICAgICAgIGkzMiBpbWFnZVdpZHRoKTsKLQotc3RhdGljIHZvaWQgRmlsdGVyVmVyQ2hyb21hRWRnZSggdTggKmRhdGEsIHUzMiBiUywgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAotICB1MzIgaW1hZ2VXaWR0aCk7Ci1zdGF0aWMgdm9pZCBGaWx0ZXJIb3JDaHJvbWFFZGdlKCB1OCAqZGF0YSwgdTMyIGJTLCBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCi0gIGkzMiBpbWFnZVdpZHRoKTsKLXN0YXRpYyB2b2lkIEZpbHRlckhvckNocm9tYSggdTggKmRhdGEsIHUzMiBiUywgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAotICBpMzIgaW1hZ2VXaWR0aCk7Ci0KLXN0YXRpYyB2b2lkIEdldEx1bWFFZGdlVGhyZXNob2xkcygKLSAgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAotICBtYlN0b3JhZ2VfdCAqbWIsCi0gIHUzMiBmaWx0ZXJpbmdGbGFncyk7Ci0KLXN0YXRpYyB2b2lkIEdldENocm9tYUVkZ2VUaHJlc2hvbGRzKAotICBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCi0gIG1iU3RvcmFnZV90ICptYiwKLSAgdTMyIGZpbHRlcmluZ0ZsYWdzLAotICBpMzIgY2hyb21hUXBJbmRleE9mZnNldCk7Ci0KLSNlbHNlIC8qIEgyNjRERUNfT01YREwgKi8KLQotc3RhdGljIHUzMiBHZXRCb3VuZGFyeVN0cmVuZ3RocyhtYlN0b3JhZ2VfdCAqbWIsIHU4ICgqYnMpWzE2XSwgdTMyIGZsYWdzKTsKLQotc3RhdGljIHZvaWQgR2V0THVtYUVkZ2VUaHJlc2hvbGRzKAotICAgIG1iU3RvcmFnZV90ICptYiwKLSAgICB1OCAoKmFscGhhKVsyXSwKLSAgICB1OCAoKmJldGEpWzJdLAotICAgIHU4ICgqdGhyZXNob2xkKVsxNl0sCi0gICAgdTggKCpicylbMTZdLAotICAgIHUzMiBmaWx0ZXJpbmdGbGFncyApOwotCi1zdGF0aWMgdm9pZCBHZXRDaHJvbWFFZGdlVGhyZXNob2xkcygKLSAgICBtYlN0b3JhZ2VfdCAqbWIsCi0gICAgdTggKCphbHBoYSlbMl0sCi0gICAgdTggKCpiZXRhKVsyXSwKLSAgICB1OCAoKnRocmVzaG9sZClbOF0sCi0gICAgdTggKCpicylbMTZdLAotICAgIHUzMiBmaWx0ZXJpbmdGbGFncywKLSAgICBpMzIgY2hyb21hUXBJbmRleE9mZnNldCk7Ci0KLSNlbmRpZiAvKiBIMjY0REVDX09NWERMICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogSXNTbGljZUJvdW5kYXJ5T25MZWZ0Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiB0aGVyZSBpcyBhIHNsaWNlIGJvdW5kYXJ5IG9uIHRoZSBsZWZ0IHNpZGUKLSAgICAgICAgICAgIG9mIGEgbWFjcm9ibG9jay4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXUzMiBJc1NsaWNlQm91bmRhcnlPbkxlZnQobWJTdG9yYWdlX3QgKm1iKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKG1iICYmIG1iLT5tYkEpOwotCi0gICAgaWYgKG1iLT5zbGljZUlkICE9IG1iLT5tYkEtPnNsaWNlSWQpCi0gICAgICAgIHJldHVybihIQU5UUk9fVFJVRSk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4oSEFOVFJPX0ZBTFNFKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IElzU2xpY2VCb3VuZGFyeU9uVG9wCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiB0aGVyZSBpcyBhIHNsaWNlIGJvdW5kYXJ5IGFib3ZlIHRoZQotICAgICAgICAgICAgY3VycmVudCBtYWNyb2Jsb2NrLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdTMyIElzU2xpY2VCb3VuZGFyeU9uVG9wKG1iU3RvcmFnZV90ICptYikKLXsKLQotLyogVmFyaWFibGVzICovCi0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChtYiAmJiBtYi0+bWJCKTsKLQotICAgIGlmIChtYi0+c2xpY2VJZCAhPSBtYi0+bWJCLT5zbGljZUlkKQotICAgICAgICByZXR1cm4oSEFOVFJPX1RSVUUpOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuKEhBTlRST19GQUxTRSk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBHZXRNYkZpbHRlcmluZ0ZsYWdzCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBGdW5jdGlvbiB0byBkZXRlcm1pbmUgd2hpY2ggZWRnZXMgb2YgYSBtYWNyb2Jsb2NrIGhhcyB0byBiZQotICAgICAgICAgIGZpbHRlcmVkLiBPdXRwdXQgaXMgYSBiaXQtd2lzZSBPUiBvZiBGSUxURVJfTEVGVF9FREdFLAotICAgICAgICAgIEZJTFRFUl9UT1BfRURHRSBhbmQgRklMVEVSX0lOTkVSX0VER0UsIGRlcGVuZGluZyBvbiB3aGljaCBlZGdlcwotICAgICAgICAgIHNoYWxsIGJlIGZpbHRlcmVkLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdTMyIEdldE1iRmlsdGVyaW5nRmxhZ3MobWJTdG9yYWdlX3QgKm1iKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBmbGFncyA9IDA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChtYik7Ci0KLSAgICAvKiBub3RoaW5nIHdpbGwgYmUgZmlsdGVyZWQgaWYgZGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJZGMgPT0gMSAqLwotICAgIGlmIChtYi0+ZGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJZGMgIT0gMSkKLSAgICB7Ci0gICAgICAgIGZsYWdzIHw9IEZJTFRFUl9JTk5FUl9FREdFOwotCi0gICAgICAgIC8qIGZpbHRlckxlZnRNYkVkZ2VGbGFnLCBsZWZ0IG1iIGlzIE1CX0EgKi8KLSAgICAgICAgaWYgKG1iLT5tYkEgJiYKLSAgICAgICAgICAgICgobWItPmRpc2FibGVEZWJsb2NraW5nRmlsdGVySWRjICE9IDIpIHx8Ci0gICAgICAgICAgICAgIUlzU2xpY2VCb3VuZGFyeU9uTGVmdChtYikpKQotICAgICAgICAgICAgZmxhZ3MgfD0gRklMVEVSX0xFRlRfRURHRTsKLQotICAgICAgICAvKiBmaWx0ZXJUb3BNYkVkZ2VGbGFnICovCi0gICAgICAgIGlmIChtYi0+bWJCICYmCi0gICAgICAgICAgICAoKG1iLT5kaXNhYmxlRGVibG9ja2luZ0ZpbHRlcklkYyAhPSAyKSB8fAotICAgICAgICAgICAgICFJc1NsaWNlQm91bmRhcnlPblRvcChtYikpKQotICAgICAgICAgICAgZmxhZ3MgfD0gRklMVEVSX1RPUF9FREdFOwotICAgIH0KLQotICAgIHJldHVybihmbGFncyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBJbm5lckJvdW5kYXJ5U3RyZW5ndGgKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gY2FsY3VsYXRlIGJvdW5kYXJ5IHN0cmVuZ3RoIHZhbHVlIGJzIGZvciBhbiBpbm5lcgotICAgICAgICAgICAgZWRnZSBvZiBhIG1hY3JvYmxvY2suIE1hY3JvYmxvY2sgdHlwZSBpcyBjaGVja2VkIGJlZm9yZSB0aGlzIGlzCi0gICAgICAgICAgICBjYWxsZWQgLT4gbm8gaW50cmEgbWIgY29uZGl0aW9uIGhlcmUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi11MzIgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iU3RvcmFnZV90ICptYjEsIHUzMiBpbmQxLCB1MzIgaW5kMikKLXsKLSAgICBpMzIgdG1wMSwgdG1wMjsKLSAgICBpMzIgbXYxLCBtdjIsIG12MywgbXY0OwotCi0gICAgdG1wMSA9IG1iMS0+dG90YWxDb2VmZltpbmQxXTsKLSAgICB0bXAyID0gbWIxLT50b3RhbENvZWZmW2luZDJdOwotICAgIG12MSA9IG1iMS0+bXZbaW5kMV0uaG9yOwotICAgIG12MiA9IG1iMS0+bXZbaW5kMl0uaG9yOwotICAgIG12MyA9IG1iMS0+bXZbaW5kMV0udmVyOwotICAgIG12NCA9IG1iMS0+bXZbaW5kMl0udmVyOwotCi0gICAgaWYgKHRtcDEgfHwgdG1wMikKLSAgICB7Ci0gICAgICAgIHJldHVybiAyOwotICAgIH0KLSAgICBlbHNlIGlmICggKEFCUyhtdjEgLSBtdjIpID49IDQpIHx8IChBQlMobXYzIC0gbXY0KSA+PSA0KSB8fAotICAgICAgICAgICAgICAobWIxLT5yZWZBZGRyW2luZDEgPj4gMl0gIT0gbWIxLT5yZWZBZGRyW2luZDIgPj4gMl0pICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJldHVybiAwOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IElubmVyQm91bmRhcnlTdHJlbmd0aDIKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gY2FsY3VsYXRlIGJvdW5kYXJ5IHN0cmVuZ3RoIHZhbHVlIGJzIGZvciBhbiBpbm5lcgotICAgICAgICAgICAgZWRnZSBvZiBhIG1hY3JvYmxvY2suIFRoZSBmdW5jdGlvbiBpcyB0aGUgc2FtZSBhcwotICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoIGJ1dCB3aXRob3V0IGNoZWNraW5nIHRvdGFsQ29lZmYuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi11MzIgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMihtYlN0b3JhZ2VfdCAqbWIxLCB1MzIgaW5kMSwgdTMyIGluZDIpCi17Ci0gICAgaTMyIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQ7Ci0KLSAgICB0bXAxID0gbWIxLT5tdltpbmQxXS5ob3I7Ci0gICAgdG1wMiA9IG1iMS0+bXZbaW5kMl0uaG9yOwotICAgIHRtcDMgPSBtYjEtPm12W2luZDFdLnZlcjsKLSAgICB0bXA0ID0gbWIxLT5tdltpbmQyXS52ZXI7Ci0KLSAgICBpZiAoIChBQlModG1wMSAtIHRtcDIpID49IDQpIHx8IChBQlModG1wMyAtIHRtcDQpID49IDQpIHx8Ci0gICAgICAgICAobWIxLT5yZWZBZGRyW2luZDEgPj4gMl0gIT0gbWIxLT5yZWZBZGRyW2luZDIgPj4gMl0pKQotICAgIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIDA7Ci19Ci0jaWZuZGVmIEgyNjRERUNfT01YREwKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRWRnZUJvdW5kYXJ5U3RyZW5ndGgKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gY2FsY3VsYXRlIGJvdW5kYXJ5IHN0cmVuZ3RoIHZhbHVlIGJzIGZvciBsZWZ0LSBvcgotICAgICAgICAgICAgdG9wLW1vc3QgZWRnZSBvZiBhIG1hY3JvYmxvY2suIE1hY3JvYmxvY2sgdHlwZXMgYXJlIGNoZWNrZWQKLSAgICAgICAgICAgIGJlZm9yZSB0aGlzIGlzIGNhbGxlZCAtPiBubyBpbnRyYSBtYiBjb25kaXRpb25zIGhlcmUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi11MzIgRWRnZUJvdW5kYXJ5U3RyZW5ndGgobWJTdG9yYWdlX3QgKm1iMSwgbWJTdG9yYWdlX3QgKm1iMiwKLSAgICB1MzIgaW5kMSwgdTMyIGluZDIpCi17Ci0KLSAgICBpZiAobWIxLT50b3RhbENvZWZmW2luZDFdIHx8IG1iMi0+dG90YWxDb2VmZltpbmQyXSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAyOwotICAgIH0KLSAgICBlbHNlIGlmICgobWIxLT5yZWZBZGRyW2luZDEgPj4gMl0gIT0gbWIyLT5yZWZBZGRyW2luZDIgPj4gMl0pIHx8Ci0gICAgICAgICAgICAgKEFCUyhtYjEtPm12W2luZDFdLmhvciAtIG1iMi0+bXZbaW5kMl0uaG9yKSA+PSA0KSB8fAotICAgICAgICAgICAgIChBQlMobWIxLT5tdltpbmQxXS52ZXIgLSBtYjItPm12W2luZDJdLnZlcikgPj0gNCkpCi0gICAgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gMDsKLX0KLQotI2Vsc2UgLyogSDI2NERFQ19PTVhETCAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEVkZ2VCb3VuZGFyeVN0cmVuZ3RoVG9wCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBib3VuZGFyeSBzdHJlbmd0aCB2YWx1ZSBicyBmb3IKLSAgICAgICAgICAgIHRvcC1tb3N0IGVkZ2Ugb2YgYSBtYWNyb2Jsb2NrLiBNYWNyb2Jsb2NrIHR5cGVzIGFyZSBjaGVja2VkCi0gICAgICAgICAgICBiZWZvcmUgdGhpcyBpcyBjYWxsZWQgLT4gbm8gaW50cmEgbWIgY29uZGl0aW9ucyBoZXJlLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdTMyIEVkZ2VCb3VuZGFyeVN0cmVuZ3RoVG9wKG1iU3RvcmFnZV90ICptYjEsIG1iU3RvcmFnZV90ICptYjIpCi17Ci0gICAgdTMyIHRvcEJzID0gMDsKLSAgICB1MzIgdG1wMSwgdG1wMiwgdG1wMywgdG1wNDsKLQotICAgIHRtcDEgPSBtYjEtPnRvdGFsQ29lZmZbMF07Ci0gICAgdG1wMiA9IG1iMi0+dG90YWxDb2VmZlsxMF07Ci0gICAgdG1wMyA9IG1iMS0+dG90YWxDb2VmZlsxXTsKLSAgICB0bXA0ID0gbWIyLT50b3RhbENvZWZmWzExXTsKLSAgICBpZiAodG1wMSB8fCB0bXAyKQotICAgIHsKLSAgICAgICAgdG9wQnMgPSAyPDwwOwotICAgIH0KLSAgICBlbHNlIGlmICgoQUJTKG1iMS0+bXZbMF0uaG9yIC0gbWIyLT5tdlsxMF0uaG9yKSA+PSA0KSB8fAotICAgICAgICAgICAgIChBQlMobWIxLT5tdlswXS52ZXIgLSBtYjItPm12WzEwXS52ZXIpID49IDQpIHx8Ci0gICAgICAgICAgICAgKG1iMS0+cmVmQWRkclswXSAhPSBtYjItPnJlZkFkZHJbMTAgPj4gMl0pKQotICAgIHsKLSAgICAgICAgdG9wQnMgPSAxPDwwOwotICAgIH0KLSAgICB0bXAxID0gbWIxLT50b3RhbENvZWZmWzRdOwotICAgIHRtcDIgPSBtYjItPnRvdGFsQ29lZmZbMTRdOwotICAgIGlmICh0bXAzIHx8IHRtcDQpCi0gICAgewotICAgICAgICB0b3BCcyArPSAyPDw4OwotICAgIH0KLSAgICBlbHNlIGlmICgoQUJTKG1iMS0+bXZbMV0uaG9yIC0gbWIyLT5tdlsxMV0uaG9yKSA+PSA0KSB8fAotICAgICAgICAgICAgIChBQlMobWIxLT5tdlsxXS52ZXIgLSBtYjItPm12WzExXS52ZXIpID49IDQpIHx8Ci0gICAgICAgICAgICAgKG1iMS0+cmVmQWRkclswXSAhPSBtYjItPnJlZkFkZHJbMTEgPj4gMl0pKQotICAgIHsKLSAgICAgICAgdG9wQnMgKz0gMTw8ODsKLSAgICB9Ci0gICAgdG1wMyA9IG1iMS0+dG90YWxDb2VmZls1XTsKLSAgICB0bXA0ID0gbWIyLT50b3RhbENvZWZmWzE1XTsKLSAgICBpZiAodG1wMSB8fCB0bXAyKQotICAgIHsKLSAgICAgICAgdG9wQnMgKz0gMjw8MTY7Ci0gICAgfQotICAgIGVsc2UgaWYgKChBQlMobWIxLT5tdls0XS5ob3IgLSBtYjItPm12WzE0XS5ob3IpID49IDQpIHx8Ci0gICAgICAgICAgICAgKEFCUyhtYjEtPm12WzRdLnZlciAtIG1iMi0+bXZbMTRdLnZlcikgPj0gNCkgfHwKLSAgICAgICAgICAgICAobWIxLT5yZWZBZGRyWzQgPj4gMl0gIT0gbWIyLT5yZWZBZGRyWzE0ID4+IDJdKSkKLSAgICB7Ci0gICAgICAgIHRvcEJzICs9IDE8PDE2OwotICAgIH0KLSAgICBpZiAodG1wMyB8fCB0bXA0KQotICAgIHsKLSAgICAgICAgdG9wQnMgKz0gMjw8MjQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKChBQlMobWIxLT5tdls1XS5ob3IgLSBtYjItPm12WzE1XS5ob3IpID49IDQpIHx8Ci0gICAgICAgICAgICAgKEFCUyhtYjEtPm12WzVdLnZlciAtIG1iMi0+bXZbMTVdLnZlcikgPj0gNCkgfHwKLSAgICAgICAgICAgICAobWIxLT5yZWZBZGRyWzUgPj4gMl0gIT0gbWIyLT5yZWZBZGRyWzE1ID4+IDJdKSkKLSAgICB7Ci0gICAgICAgIHRvcEJzICs9IDE8PDI0OwotICAgIH0KLQotICAgIHJldHVybiB0b3BCczsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBFZGdlQm91bmRhcnlTdHJlbmd0aExlZnQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gY2FsY3VsYXRlIGJvdW5kYXJ5IHN0cmVuZ3RoIHZhbHVlIGJzIGZvciBsZWZ0LQotICAgICAgICAgICAgZWRnZSBvZiBhIG1hY3JvYmxvY2suIE1hY3JvYmxvY2sgdHlwZXMgYXJlIGNoZWNrZWQKLSAgICAgICAgICAgIGJlZm9yZSB0aGlzIGlzIGNhbGxlZCAtPiBubyBpbnRyYSBtYiBjb25kaXRpb25zIGhlcmUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi11MzIgRWRnZUJvdW5kYXJ5U3RyZW5ndGhMZWZ0KG1iU3RvcmFnZV90ICptYjEsIG1iU3RvcmFnZV90ICptYjIpCi17Ci0gICAgdTMyIGxlZnRCcyA9IDA7Ci0gICAgdTMyIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQ7Ci0KLSAgICB0bXAxID0gbWIxLT50b3RhbENvZWZmWzBdOwotICAgIHRtcDIgPSBtYjItPnRvdGFsQ29lZmZbNV07Ci0gICAgdG1wMyA9IG1iMS0+dG90YWxDb2VmZlsyXTsKLSAgICB0bXA0ID0gbWIyLT50b3RhbENvZWZmWzddOwotCi0gICAgaWYgKHRtcDEgfHwgdG1wMikKLSAgICB7Ci0gICAgICAgIGxlZnRCcyA9IDI8PDA7Ci0gICAgfQotICAgIGVsc2UgaWYgKChBQlMobWIxLT5tdlswXS5ob3IgLSBtYjItPm12WzVdLmhvcikgPj0gNCkgfHwKLSAgICAgICAgICAgICAoQUJTKG1iMS0+bXZbMF0udmVyIC0gbWIyLT5tdls1XS52ZXIpID49IDQpIHx8Ci0gICAgICAgICAgICAgKG1iMS0+cmVmQWRkclswXSAhPSBtYjItPnJlZkFkZHJbNSA+PiAyXSkpCi0gICAgewotICAgICAgICBsZWZ0QnMgPSAxPDwwOwotICAgIH0KLSAgICB0bXAxID0gbWIxLT50b3RhbENvZWZmWzhdOwotICAgIHRtcDIgPSBtYjItPnRvdGFsQ29lZmZbMTNdOwotICAgIGlmICh0bXAzIHx8IHRtcDQpCi0gICAgewotICAgICAgICBsZWZ0QnMgKz0gMjw8ODsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKEFCUyhtYjEtPm12WzJdLmhvciAtIG1iMi0+bXZbN10uaG9yKSA+PSA0KSB8fAotICAgICAgICAgICAgIChBQlMobWIxLT5tdlsyXS52ZXIgLSBtYjItPm12WzddLnZlcikgPj0gNCkgfHwKLSAgICAgICAgICAgICAobWIxLT5yZWZBZGRyWzBdICE9IG1iMi0+cmVmQWRkcls3ID4+IDJdKSkKLSAgICB7Ci0gICAgICAgIGxlZnRCcyArPSAxPDw4OwotICAgIH0KLSAgICB0bXAzID0gbWIxLT50b3RhbENvZWZmWzEwXTsKLSAgICB0bXA0ID0gbWIyLT50b3RhbENvZWZmWzE1XTsKLSAgICBpZiAodG1wMSB8fCB0bXAyKQotICAgIHsKLSAgICAgICAgbGVmdEJzICs9IDI8PDE2OwotICAgIH0KLSAgICBlbHNlIGlmICgoQUJTKG1iMS0+bXZbOF0uaG9yIC0gbWIyLT5tdlsxM10uaG9yKSA+PSA0KSB8fAotICAgICAgICAgICAgIChBQlMobWIxLT5tdls4XS52ZXIgLSBtYjItPm12WzEzXS52ZXIpID49IDQpIHx8Ci0gICAgICAgICAgICAgKG1iMS0+cmVmQWRkcls4ID4+IDJdICE9IG1iMi0+cmVmQWRkclsxMyA+PiAyXSkpCi0gICAgewotICAgICAgICBsZWZ0QnMgKz0gMTw8MTY7Ci0gICAgfQotICAgIGlmICh0bXAzIHx8IHRtcDQpCi0gICAgewotICAgICAgICBsZWZ0QnMgKz0gMjw8MjQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKChBQlMobWIxLT5tdlsxMF0uaG9yIC0gbWIyLT5tdlsxNV0uaG9yKSA+PSA0KSB8fAotICAgICAgICAgICAgIChBQlMobWIxLT5tdlsxMF0udmVyIC0gbWIyLT5tdlsxNV0udmVyKSA+PSA0KSB8fAotICAgICAgICAgICAgIChtYjEtPnJlZkFkZHJbMTAgPj4gMl0gIT0gbWIyLT5yZWZBZGRyWzE1ID4+IDJdKSkKLSAgICB7Ci0gICAgICAgIGxlZnRCcyArPSAxPDwyNDsKLSAgICB9Ci0KLSAgICByZXR1cm4gbGVmdEJzOwotfQotI2VuZGlmIC8qIEgyNjRERUNfT01YREwgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEZpbHRlclBpY3R1cmUKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFBlcmZvcm0gZGVibG9ja2luZyBmaWx0ZXJpbmcgZm9yIGEgcGljdHVyZS4gRmlsdGVyIGRvZXMgbm90IGNvcHkKLSAgICAgICAgICB0aGUgb3JpZ2luYWwgcGljdHVyZSBhbnl3aGVyZSBidXQgZmlsdGVyaW5nIGlzIHBlcmZvcm1lZCBkaXJlY3RseQotICAgICAgICAgIG9uIHRoZSBvcmlnaW5hbCBpbWFnZS4gUGFyYW1ldGVycyBjb250cm9sbGluZyB0aGUgZmlsdGVyaW5nIHByb2Nlc3MKLSAgICAgICAgICBhcmUgY29tcHV0ZWQgYmFzZWQgb24gaW5mb3JtYXRpb24gaW4gbWFjcm9ibG9jayBzdHJ1Y3R1cmVzIG9mIHRoZQotICAgICAgICAgIGZpbHRlcmVkIG1hY3JvYmxvY2ssIG1hY3JvYmxvY2sgYWJvdmUgYW5kIG1hY3JvYmxvY2sgb24gdGhlIGxlZnQgb2YKLSAgICAgICAgICB0aGUgZmlsdGVyZWQgb25lLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICBpbWFnZSAgICAgICAgIHBvaW50ZXIgdG8gaW1hZ2UgdG8gYmUgZmlsdGVyZWQKLSAgICAgICAgICBtYiAgICAgICAgICAgIHBvaW50ZXIgdG8gbWFjcm9ibG9jayBkYXRhIHN0cnVjdHVyZSBvZiB0aGUgdG9wLWxlZnQKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2sgb2YgdGhlIHBpY3R1cmUKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIGltYWdlICAgICAgICAgZmlsdGVyZWQgaW1hZ2Ugc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgIG5vbmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZm5kZWYgSDI2NERFQ19PTVhETAotdm9pZCBoMjY0YnNkRmlsdGVyUGljdHVyZSgKLSAgaW1hZ2VfdCAqaW1hZ2UsCi0gIG1iU3RvcmFnZV90ICptYikKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgZmxhZ3M7Ci0gICAgdTMyIHBpY1NpemVJbk1icywgbWJSb3csIG1iQ29sOwotICAgIHUzMiBwaWNXaWR0aEluTWJzOwotICAgIHU4ICpkYXRhOwotICAgIG1iU3RvcmFnZV90ICpwTWI7Ci0gICAgYlNfdCBiU1sxNl07Ci0gICAgZWRnZVRocmVzaG9sZF90IHRocmVzaG9sZHNbM107Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChpbWFnZSk7Ci0gICAgQVNTRVJUKG1iKTsKLSAgICBBU1NFUlQoaW1hZ2UtPmRhdGEpOwotICAgIEFTU0VSVChpbWFnZS0+d2lkdGgpOwotICAgIEFTU0VSVChpbWFnZS0+aGVpZ2h0KTsKLQotICAgIHBpY1dpZHRoSW5NYnMgPSBpbWFnZS0+d2lkdGg7Ci0gICAgZGF0YSA9IGltYWdlLT5kYXRhOwotICAgIHBpY1NpemVJbk1icyA9IHBpY1dpZHRoSW5NYnMgKiBpbWFnZS0+aGVpZ2h0OwotCi0gICAgcE1iID0gbWI7Ci0KLSAgICBmb3IgKG1iUm93ID0gMCwgbWJDb2wgPSAwOyBtYlJvdyA8IGltYWdlLT5oZWlnaHQ7IHBNYisrKQotICAgIHsKLSAgICAgICAgZmxhZ3MgPSBHZXRNYkZpbHRlcmluZ0ZsYWdzKHBNYik7Ci0KLSAgICAgICAgaWYgKGZsYWdzKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBHZXRCb3VuZGFyeVN0cmVuZ3RocyBmdW5jdGlvbiByZXR1cm5zIG5vbi16ZXJvIHZhbHVlIGlmIGFueSBvZgotICAgICAgICAgICAgICogdGhlIGJTIHZhbHVlcyBmb3IgdGhlIG1hY3JvYmxvY2sgYmVpbmcgcHJvY2Vzc2VkIHdhcyBub24temVybyAqLwotICAgICAgICAgICAgaWYgKEdldEJvdW5kYXJ5U3RyZW5ndGhzKHBNYiwgYlMsIGZsYWdzKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBsdW1hICovCi0gICAgICAgICAgICAgICAgR2V0THVtYUVkZ2VUaHJlc2hvbGRzKHRocmVzaG9sZHMsIHBNYiwgZmxhZ3MpOwotICAgICAgICAgICAgICAgIGRhdGEgPSBpbWFnZS0+ZGF0YSArIG1iUm93ICogcGljV2lkdGhJbk1icyAqIDI1NiArIG1iQ29sICogMTY7Ci0KLSAgICAgICAgICAgICAgICBGaWx0ZXJMdW1hKCh1OCopZGF0YSwgYlMsIHRocmVzaG9sZHMsIHBpY1dpZHRoSW5NYnMqMTYpOwotCi0gICAgICAgICAgICAgICAgLyogY2hyb21hICovCi0gICAgICAgICAgICAgICAgR2V0Q2hyb21hRWRnZVRocmVzaG9sZHModGhyZXNob2xkcywgcE1iLCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgcE1iLT5jaHJvbWFRcEluZGV4T2Zmc2V0KTsKLSAgICAgICAgICAgICAgICBkYXRhID0gaW1hZ2UtPmRhdGEgKyBwaWNTaXplSW5NYnMgKiAyNTYgKwotICAgICAgICAgICAgICAgICAgICBtYlJvdyAqIHBpY1dpZHRoSW5NYnMgKiA2NCArIG1iQ29sICogODsKLQotICAgICAgICAgICAgICAgIEZpbHRlckNocm9tYSgodTgqKWRhdGEsIGRhdGEgKyA2NCpwaWNTaXplSW5NYnMsIGJTLAotICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNob2xkcywgcGljV2lkdGhJbk1icyo4KTsKLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbWJDb2wrKzsKLSAgICAgICAgaWYgKG1iQ29sID09IHBpY1dpZHRoSW5NYnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1iQ29sID0gMDsKLSAgICAgICAgICAgIG1iUm93Kys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBGaWx0ZXJWZXJMdW1hRWRnZQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGaWx0ZXIgb25lIHZlcnRpY2FsIDQtcGl4ZWwgbHVtYSBlZGdlLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBGaWx0ZXJWZXJMdW1hRWRnZSgKLSAgdTggKmRhdGEsCi0gIHUzMiBiUywKLSAgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAotICB1MzIgaW1hZ2VXaWR0aCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICBpMzIgZGVsdGEsIHRjLCB0bXA7Ci0gICAgdTMyIGk7Ci0gICAgdTggcDAsIHEwLCBwMSwgcTEsIHAyLCBxMjsKLSAgICB1MzIgdG1wRmxhZzsKLSAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQoYlMgJiYgYlMgPD0gNCk7Ci0gICAgQVNTRVJUKHRocmVzaG9sZHMpOwotCi0gICAgaWYgKGJTIDwgNCkKLSAgICB7Ci0gICAgICAgIHRjID0gdGhyZXNob2xkcy0+dGMwW2JTLTFdOwotICAgICAgICB0bXAgPSB0YzsKLSAgICAgICAgZm9yIChpID0gNDsgaTsgaS0tLCBkYXRhICs9IGltYWdlV2lkdGgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHAxID0gZGF0YVstMl07IHAwID0gZGF0YVstMV07Ci0gICAgICAgICAgICBxMCA9IGRhdGFbMF07IHExID0gZGF0YVsxXTsKLSAgICAgICAgICAgIGlmICggKCh1bnNpZ25lZClBQlMocDAtcTApIDwgdGhyZXNob2xkcy0+YWxwaGEpICYmCi0gICAgICAgICAgICAgICAgICgodW5zaWduZWQpQUJTKHAxLXAwKSA8IHRocmVzaG9sZHMtPmJldGEpICAmJgotICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKUFCUyhxMS1xMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcDIgPSBkYXRhWy0zXTsKLSAgICAgICAgICAgICAgICBxMiA9IGRhdGFbMl07Ci0KLSAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKUFCUyhwMi1wMCkgPCB0aHJlc2hvbGRzLT5iZXRhKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZGF0YVstMl0gPSAodTgpKHAxICsgQ0xJUDMoLXRjLHRjLAotICAgICAgICAgICAgICAgICAgICAgICAgKHAyICsgKChwMCArIHEwICsgMSkgPj4gMSkgLSAocDEgPDwgMSkpID4+IDEpKTsKLSAgICAgICAgICAgICAgICAgICAgdG1wKys7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZClBQlMocTItcTApIDwgdGhyZXNob2xkcy0+YmV0YSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGFbMV0gPSAodTgpKHExICsgQ0xJUDMoLXRjLHRjLAotICAgICAgICAgICAgICAgICAgICAgICAgKHEyICsgKChwMCArIHEwICsgMSkgPj4gMSkgLSAocTEgPDwgMSkpID4+IDEpKTsKLSAgICAgICAgICAgICAgICAgICAgdG1wKys7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZGVsdGEgPSBDTElQMygtdG1wLCB0bXAsICgoKChxMCAtIHAwKSA8PCAyKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChwMSAtIHExKSArIDQpID4+IDMpKTsKLQotICAgICAgICAgICAgICAgIHAwID0gY2xwW3AwICsgZGVsdGFdOwotICAgICAgICAgICAgICAgIHEwID0gY2xwW3EwIC0gZGVsdGFdOwotICAgICAgICAgICAgICAgIHRtcCA9IHRjOwotICAgICAgICAgICAgICAgIGRhdGFbLTFdID0gcDA7Ci0gICAgICAgICAgICAgICAgZGF0YVsgMF0gPSBxMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBmb3IgKGkgPSA0OyBpOyBpLS0sIGRhdGEgKz0gaW1hZ2VXaWR0aCkKLSAgICAgICAgewotICAgICAgICAgICAgcDEgPSBkYXRhWy0yXTsgcDAgPSBkYXRhWy0xXTsKLSAgICAgICAgICAgIHEwID0gZGF0YVswXTsgcTEgPSBkYXRhWzFdOwotICAgICAgICAgICAgaWYgKCAoKHVuc2lnbmVkKUFCUyhwMC1xMCkgPCB0aHJlc2hvbGRzLT5hbHBoYSkgJiYKLSAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocDEtcDApIDwgdGhyZXNob2xkcy0+YmV0YSkgICYmCi0gICAgICAgICAgICAgICAgICgodW5zaWduZWQpQUJTKHExLXEwKSA8IHRocmVzaG9sZHMtPmJldGEpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0bXBGbGFnID0KLSAgICAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocDAtcTApIDwgKCh0aHJlc2hvbGRzLT5hbHBoYSA+PiAyKSArMikpID8KLSAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgICAgICAgICAgICAgcDIgPSBkYXRhWy0zXTsKLSAgICAgICAgICAgICAgICBxMiA9IGRhdGFbMl07Ci0KLSAgICAgICAgICAgICAgICBpZiAodG1wRmxhZyAmJiAodW5zaWduZWQpQUJTKHAyLXAwKSA8IHRocmVzaG9sZHMtPmJldGEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0bXAgPSBwMSArIHAwICsgcTA7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGFbLTFdID0gKHU4KSgocDIgKyAyICogdG1wICsgcTEgKyA0KSA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgZGF0YVstMl0gPSAodTgpKChwMiArIHRtcCArIDIpID4+IDIpOwotICAgICAgICAgICAgICAgICAgICBkYXRhWy0zXSA9ICh1OCkoKDIgKiBkYXRhWy00XSArIDMgKiBwMiArIHRtcCArIDQpID4+IDMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGRhdGFbLTFdID0gKDIgKiBwMSArIHAwICsgcTEgKyAyKSA+PiAyOwotCi0gICAgICAgICAgICAgICAgaWYgKHRtcEZsYWcgJiYgKHVuc2lnbmVkKUFCUyhxMi1xMCkgPCB0aHJlc2hvbGRzLT5iZXRhKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdG1wID0gcDAgKyBxMCArIHExOwotICAgICAgICAgICAgICAgICAgICBkYXRhWzBdID0gKHU4KSgocDEgKyAyICogdG1wICsgcTIgKyA0KSA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgZGF0YVsxXSA9ICh1OCkoKHRtcCArIHEyICsgMikgPj4gMik7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGFbMl0gPSAodTgpKCgyICogZGF0YVszXSArIDMgKiBxMiArIHRtcCArIDQpID4+IDMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGRhdGFbMF0gPSAodTgpKCgyICogcTEgKyBxMCArIHAxICsgMikgPj4gMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBGaWx0ZXJIb3JMdW1hRWRnZQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGaWx0ZXIgb25lIGhvcml6b250YWwgNC1waXhlbCBsdW1hIGVkZ2UKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgRmlsdGVySG9yTHVtYUVkZ2UoCi0gIHU4ICpkYXRhLAotICB1MzIgYlMsCi0gIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKLSAgaTMyIGltYWdlV2lkdGgpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgaTMyIGRlbHRhLCB0YywgdG1wOwotICAgIHUzMiBpOwotICAgIHU4IHAwLCBxMCwgcDEsIHExLCBwMiwgcTI7Ci0gICAgY29uc3QgdTggKmNscCA9IGgyNjRic2RDbGlwICsgNTEyOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKGJTIDwgNCk7Ci0gICAgQVNTRVJUKHRocmVzaG9sZHMpOwotCi0gICAgdGMgPSB0aHJlc2hvbGRzLT50YzBbYlMtMV07Ci0gICAgdG1wID0gdGM7Ci0gICAgZm9yIChpID0gNDsgaTsgaS0tLCBkYXRhKyspCi0gICAgewotICAgICAgICBwMSA9IGRhdGFbLWltYWdlV2lkdGgqMl07IHAwID0gZGF0YVstaW1hZ2VXaWR0aF07Ci0gICAgICAgIHEwID0gZGF0YVswXTsgcTEgPSBkYXRhW2ltYWdlV2lkdGhdOwotICAgICAgICBpZiAoICgodW5zaWduZWQpQUJTKHAwLXEwKSA8IHRocmVzaG9sZHMtPmFscGhhKSAmJgotICAgICAgICAgICAgICgodW5zaWduZWQpQUJTKHAxLXAwKSA8IHRocmVzaG9sZHMtPmJldGEpICAmJgotICAgICAgICAgICAgICgodW5zaWduZWQpQUJTKHExLXEwKSA8IHRocmVzaG9sZHMtPmJldGEpICkKLSAgICAgICAgewotICAgICAgICAgICAgcDIgPSBkYXRhWy1pbWFnZVdpZHRoKjNdOwotCi0gICAgICAgICAgICBpZiAoKHVuc2lnbmVkKUFCUyhwMi1wMCkgPCB0aHJlc2hvbGRzLT5iZXRhKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRhdGFbLWltYWdlV2lkdGgqMl0gPSAodTgpKHAxICsgQ0xJUDMoLXRjLHRjLAotICAgICAgICAgICAgICAgICAgICAocDIgKyAoKHAwICsgcTAgKyAxKSA+PiAxKSAtIChwMSA8PCAxKSkgPj4gMSkpOwotICAgICAgICAgICAgICAgIHRtcCsrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBxMiA9IGRhdGFbaW1hZ2VXaWR0aCoyXTsKLQotICAgICAgICAgICAgaWYgKCh1bnNpZ25lZClBQlMocTItcTApIDwgdGhyZXNob2xkcy0+YmV0YSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkYXRhW2ltYWdlV2lkdGhdID0gKHU4KShxMSArIENMSVAzKC10Yyx0YywKLSAgICAgICAgICAgICAgICAgICAgKHEyICsgKChwMCArIHEwICsgMSkgPj4gMSkgLSAocTEgPDwgMSkpID4+IDEpKTsKLSAgICAgICAgICAgICAgICB0bXArKzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVsdGEgPSBDTElQMygtdG1wLCB0bXAsICgoKChxMCAtIHAwKSA8PCAyKSArCi0gICAgICAgICAgICAgICAgICAgICAgKHAxIC0gcTEpICsgNCkgPj4gMykpOwotCi0gICAgICAgICAgICBwMCA9IGNscFtwMCArIGRlbHRhXTsKLSAgICAgICAgICAgIHEwID0gY2xwW3EwIC0gZGVsdGFdOwotICAgICAgICAgICAgdG1wID0gdGM7Ci0gICAgICAgICAgICBkYXRhWy1pbWFnZVdpZHRoXSA9IHAwOwotICAgICAgICAgICAgZGF0YVsgIDBdID0gcTA7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRmlsdGVySG9yTHVtYQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGaWx0ZXIgYWxsIGZvdXIgc3VjY2Vzc2l2ZSBob3Jpem9udGFsIDQtcGl4ZWwgbHVtYSBlZGdlcy4gVGhpcyBjYW4KLSAgICAgICAgICAgIGJlIGRvbmUgd2hlbiBiUyBpcyBlcXVhbCB0byBhbGwgZm91ciBlZGdlcy4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgRmlsdGVySG9yTHVtYSgKLSAgdTggKmRhdGEsCi0gIHUzMiBiUywKLSAgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAotICBpMzIgaW1hZ2VXaWR0aCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICBpMzIgZGVsdGEsIHRjLCB0bXA7Ci0gICAgdTMyIGk7Ci0gICAgdTggcDAsIHEwLCBwMSwgcTEsIHAyLCBxMjsKLSAgICB1MzIgdG1wRmxhZzsKLSAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQoYlMgPD0gNCk7Ci0gICAgQVNTRVJUKHRocmVzaG9sZHMpOwotCi0gICAgaWYgKGJTIDwgNCkKLSAgICB7Ci0gICAgICAgIHRjID0gdGhyZXNob2xkcy0+dGMwW2JTLTFdOwotICAgICAgICB0bXAgPSB0YzsKLSAgICAgICAgZm9yIChpID0gMTY7IGk7IGktLSwgZGF0YSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwMSA9IGRhdGFbLWltYWdlV2lkdGgqMl07IHAwID0gZGF0YVstaW1hZ2VXaWR0aF07Ci0gICAgICAgICAgICBxMCA9IGRhdGFbMF07IHExID0gZGF0YVtpbWFnZVdpZHRoXTsKLSAgICAgICAgICAgIGlmICggKCh1bnNpZ25lZClBQlMocDAtcTApIDwgdGhyZXNob2xkcy0+YWxwaGEpICYmCi0gICAgICAgICAgICAgICAgICgodW5zaWduZWQpQUJTKHAxLXAwKSA8IHRocmVzaG9sZHMtPmJldGEpICAmJgotICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKUFCUyhxMS1xMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcDIgPSBkYXRhWy1pbWFnZVdpZHRoKjNdOwotCi0gICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZClBQlMocDItcDApIDwgdGhyZXNob2xkcy0+YmV0YSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGFbLWltYWdlV2lkdGgqMl0gPSAodTgpKHAxICsgQ0xJUDMoLXRjLHRjLAotICAgICAgICAgICAgICAgICAgICAgICAgKHAyICsgKChwMCArIHEwICsgMSkgPj4gMSkgLSAocDEgPDwgMSkpID4+IDEpKTsKLSAgICAgICAgICAgICAgICAgICAgdG1wKys7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcTIgPSBkYXRhW2ltYWdlV2lkdGgqMl07Ci0KLSAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKUFCUyhxMi1xMCkgPCB0aHJlc2hvbGRzLT5iZXRhKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZGF0YVtpbWFnZVdpZHRoXSA9ICh1OCkocTEgKyBDTElQMygtdGMsdGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAocTIgKyAoKHAwICsgcTAgKyAxKSA+PiAxKSAtIChxMSA8PCAxKSkgPj4gMSkpOwotICAgICAgICAgICAgICAgICAgICB0bXArKzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBkZWx0YSA9IENMSVAzKC10bXAsIHRtcCwgKCgoKHEwIC0gcDApIDw8IDIpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKHAxIC0gcTEpICsgNCkgPj4gMykpOwotCi0gICAgICAgICAgICAgICAgcDAgPSBjbHBbcDAgKyBkZWx0YV07Ci0gICAgICAgICAgICAgICAgcTAgPSBjbHBbcTAgLSBkZWx0YV07Ci0gICAgICAgICAgICAgICAgdG1wID0gdGM7Ci0gICAgICAgICAgICAgICAgZGF0YVstaW1hZ2VXaWR0aF0gPSBwMDsKLSAgICAgICAgICAgICAgICBkYXRhWyAgMF0gPSBxMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBmb3IgKGkgPSAxNjsgaTsgaS0tLCBkYXRhKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHAxID0gZGF0YVstaW1hZ2VXaWR0aCoyXTsgcDAgPSBkYXRhWy1pbWFnZVdpZHRoXTsKLSAgICAgICAgICAgIHEwID0gZGF0YVswXTsgcTEgPSBkYXRhW2ltYWdlV2lkdGhdOwotICAgICAgICAgICAgaWYgKCAoKHVuc2lnbmVkKUFCUyhwMC1xMCkgPCB0aHJlc2hvbGRzLT5hbHBoYSkgJiYKLSAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocDEtcDApIDwgdGhyZXNob2xkcy0+YmV0YSkgICYmCi0gICAgICAgICAgICAgICAgICgodW5zaWduZWQpQUJTKHExLXEwKSA8IHRocmVzaG9sZHMtPmJldGEpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0bXBGbGFnID0gKCh1bnNpZ25lZClBQlMocDAtcTApIDwgKCh0aHJlc2hvbGRzLT5hbHBoYSA+PiAyKSArMikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgICAgICAgICAgICAgIHAyID0gZGF0YVstaW1hZ2VXaWR0aCozXTsKLSAgICAgICAgICAgICAgICBxMiA9IGRhdGFbaW1hZ2VXaWR0aCoyXTsKLQotICAgICAgICAgICAgICAgIGlmICh0bXBGbGFnICYmICh1bnNpZ25lZClBQlMocDItcDApIDwgdGhyZXNob2xkcy0+YmV0YSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcCA9IHAxICsgcDAgKyBxMDsKLSAgICAgICAgICAgICAgICAgICAgZGF0YVstaW1hZ2VXaWR0aF0gPSAodTgpKChwMiArIDIgKiB0bXAgKyBxMSArIDQpID4+IDMpOwotICAgICAgICAgICAgICAgICAgICBkYXRhWy1pbWFnZVdpZHRoKjJdID0gKHU4KSgocDIgKyB0bXAgKyAyKSA+PiAyKTsKLSAgICAgICAgICAgICAgICAgICAgZGF0YVstaW1hZ2VXaWR0aCozXSA9ICh1OCkoKDIgKiBkYXRhWy1pbWFnZVdpZHRoKjRdICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICogcDIgKyB0bXAgKyA0KSA+PiAzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBkYXRhWy1pbWFnZVdpZHRoXSA9ICh1OCkoKDIgKiBwMSArIHAwICsgcTEgKyAyKSA+PiAyKTsKLQotICAgICAgICAgICAgICAgIGlmICh0bXBGbGFnICYmICh1bnNpZ25lZClBQlMocTItcTApIDwgdGhyZXNob2xkcy0+YmV0YSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcCA9IHAwICsgcTAgKyBxMTsKLSAgICAgICAgICAgICAgICAgICAgZGF0YVsgMF0gPSAodTgpKChwMSArIDIgKiB0bXAgKyBxMiArIDQpID4+IDMpOwotICAgICAgICAgICAgICAgICAgICBkYXRhW2ltYWdlV2lkdGhdID0gKHU4KSgodG1wICsgcTIgKyAyKSA+PiAyKTsKLSAgICAgICAgICAgICAgICAgICAgZGF0YVtpbWFnZVdpZHRoKjJdID0gKHU4KSgoMiAqIGRhdGFbaW1hZ2VXaWR0aCozXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICogcTIgKyB0bXAgKyA0KSA+PiAzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBkYXRhWzBdID0gKDIgKiBxMSArIHEwICsgcDEgKyAyKSA+PiAyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRmlsdGVyVmVyQ2hyb21hRWRnZQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGaWx0ZXIgb25lIHZlcnRpY2FsIDItcGl4ZWwgY2hyb21hIGVkZ2UKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgRmlsdGVyVmVyQ2hyb21hRWRnZSgKLSAgdTggKmRhdGEsCi0gIHUzMiBiUywKLSAgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAotICB1MzIgd2lkdGgpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgaTMyIGRlbHRhLCB0YzsKLSAgICB1OCBwMCwgcTAsIHAxLCBxMTsKLSAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQoYlMgPD0gNCk7Ci0gICAgQVNTRVJUKHRocmVzaG9sZHMpOwotCi0gICAgcDEgPSBkYXRhWy0yXTsgcDAgPSBkYXRhWy0xXTsKLSAgICBxMCA9IGRhdGFbMF07IHExID0gZGF0YVsxXTsKLSAgICBpZiAoICgodW5zaWduZWQpQUJTKHAwLXEwKSA8IHRocmVzaG9sZHMtPmFscGhhKSAmJgotICAgICAgICAgKCh1bnNpZ25lZClBQlMocDEtcDApIDwgdGhyZXNob2xkcy0+YmV0YSkgICYmCi0gICAgICAgICAoKHVuc2lnbmVkKUFCUyhxMS1xMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSApCi0gICAgewotICAgICAgICBpZiAoYlMgPCA0KQotICAgICAgICB7Ci0gICAgICAgICAgICB0YyA9IHRocmVzaG9sZHMtPnRjMFtiUy0xXSArIDE7Ci0gICAgICAgICAgICBkZWx0YSA9IENMSVAzKC10YywgdGMsICgoKChxMCAtIHAwKSA8PCAyKSArCi0gICAgICAgICAgICAgICAgICAgICAgKHAxIC0gcTEpICsgNCkgPj4gMykpOwotICAgICAgICAgICAgcDAgPSBjbHBbcDAgKyBkZWx0YV07Ci0gICAgICAgICAgICBxMCA9IGNscFtxMCAtIGRlbHRhXTsKLSAgICAgICAgICAgIGRhdGFbLTFdID0gcDA7Ci0gICAgICAgICAgICBkYXRhWyAwXSA9IHEwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZGF0YVstMV0gPSAoMiAqIHAxICsgcDAgKyBxMSArIDIpID4+IDI7Ci0gICAgICAgICAgICBkYXRhWyAwXSA9ICgyICogcTEgKyBxMCArIHAxICsgMikgPj4gMjsKLSAgICAgICAgfQotICAgIH0KLSAgICBkYXRhICs9IHdpZHRoOwotICAgIHAxID0gZGF0YVstMl07IHAwID0gZGF0YVstMV07Ci0gICAgcTAgPSBkYXRhWzBdOyBxMSA9IGRhdGFbMV07Ci0gICAgaWYgKCAoKHVuc2lnbmVkKUFCUyhwMC1xMCkgPCB0aHJlc2hvbGRzLT5hbHBoYSkgJiYKLSAgICAgICAgICgodW5zaWduZWQpQUJTKHAxLXAwKSA8IHRocmVzaG9sZHMtPmJldGEpICAmJgotICAgICAgICAgKCh1bnNpZ25lZClBQlMocTEtcTApIDwgdGhyZXNob2xkcy0+YmV0YSkgKQotICAgIHsKLSAgICAgICAgaWYgKGJTIDwgNCkKLSAgICAgICAgewotICAgICAgICAgICAgdGMgPSB0aHJlc2hvbGRzLT50YzBbYlMtMV0gKyAxOwotICAgICAgICAgICAgZGVsdGEgPSBDTElQMygtdGMsIHRjLCAoKCgocTAgLSBwMCkgPDwgMikgKwotICAgICAgICAgICAgICAgICAgICAgIChwMSAtIHExKSArIDQpID4+IDMpKTsKLSAgICAgICAgICAgIHAwID0gY2xwW3AwICsgZGVsdGFdOwotICAgICAgICAgICAgcTAgPSBjbHBbcTAgLSBkZWx0YV07Ci0gICAgICAgICAgICBkYXRhWy0xXSA9IHAwOwotICAgICAgICAgICAgZGF0YVsgMF0gPSBxMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRhdGFbLTFdID0gKDIgKiBwMSArIHAwICsgcTEgKyAyKSA+PiAyOwotICAgICAgICAgICAgZGF0YVsgMF0gPSAoMiAqIHExICsgcTAgKyBwMSArIDIpID4+IDI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBGaWx0ZXJIb3JDaHJvbWFFZGdlCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZpbHRlciBvbmUgaG9yaXpvbnRhbCAyLXBpeGVsIGNocm9tYSBlZGdlCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIEZpbHRlckhvckNocm9tYUVkZ2UoCi0gIHU4ICpkYXRhLAotICB1MzIgYlMsCi0gIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKLSAgaTMyIHdpZHRoKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIGkzMiBkZWx0YSwgdGM7Ci0gICAgdTMyIGk7Ci0gICAgdTggcDAsIHEwLCBwMSwgcTE7Ci0gICAgY29uc3QgdTggKmNscCA9IGgyNjRic2RDbGlwICsgNTEyOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKGJTIDwgNCk7Ci0gICAgQVNTRVJUKHRocmVzaG9sZHMpOwotCi0gICAgdGMgPSB0aHJlc2hvbGRzLT50YzBbYlMtMV0gKyAxOwotICAgIGZvciAoaSA9IDI7IGk7IGktLSwgZGF0YSsrKQotICAgIHsKLSAgICAgICAgcDEgPSBkYXRhWy13aWR0aCoyXTsgcDAgPSBkYXRhWy13aWR0aF07Ci0gICAgICAgIHEwID0gZGF0YVswXTsgcTEgPSBkYXRhW3dpZHRoXTsKLSAgICAgICAgaWYgKCAoKHVuc2lnbmVkKUFCUyhwMC1xMCkgPCB0aHJlc2hvbGRzLT5hbHBoYSkgJiYKLSAgICAgICAgICAgICAoKHVuc2lnbmVkKUFCUyhwMS1wMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSAgJiYKLSAgICAgICAgICAgICAoKHVuc2lnbmVkKUFCUyhxMS1xMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRlbHRhID0gQ0xJUDMoLXRjLCB0YywgKCgoKHEwIC0gcDApIDw8IDIpICsKLSAgICAgICAgICAgICAgICAgICAgICAocDEgLSBxMSkgKyA0KSA+PiAzKSk7Ci0gICAgICAgICAgICBwMCA9IGNscFtwMCArIGRlbHRhXTsKLSAgICAgICAgICAgIHEwID0gY2xwW3EwIC0gZGVsdGFdOwotICAgICAgICAgICAgZGF0YVstd2lkdGhdID0gcDA7Ci0gICAgICAgICAgICBkYXRhWyAgMF0gPSBxMDsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBGaWx0ZXJIb3JDaHJvbWEKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRmlsdGVyIGFsbCBmb3VyIHN1Y2Nlc3NpdmUgaG9yaXpvbnRhbCAyLXBpeGVsIGNocm9tYSBlZGdlcy4gVGhpcwotICAgICAgICAgICAgY2FuIGJlIGRvbmUgaWYgYlMgaXMgZXF1YWwgZm9yIGFsbCBmb3VyIGVkZ2VzLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBGaWx0ZXJIb3JDaHJvbWEoCi0gIHU4ICpkYXRhLAotICB1MzIgYlMsCi0gIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKLSAgaTMyIHdpZHRoKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIGkzMiBkZWx0YSwgdGM7Ci0gICAgdTMyIGk7Ci0gICAgdTggcDAsIHEwLCBwMSwgcTE7Ci0gICAgY29uc3QgdTggKmNscCA9IGgyNjRic2RDbGlwICsgNTEyOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKGJTIDw9IDQpOwotICAgIEFTU0VSVCh0aHJlc2hvbGRzKTsKLQotICAgIGlmIChiUyA8IDQpCi0gICAgewotICAgICAgICB0YyA9IHRocmVzaG9sZHMtPnRjMFtiUy0xXSArIDE7Ci0gICAgICAgIGZvciAoaSA9IDg7IGk7IGktLSwgZGF0YSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwMSA9IGRhdGFbLXdpZHRoKjJdOyBwMCA9IGRhdGFbLXdpZHRoXTsKLSAgICAgICAgICAgIHEwID0gZGF0YVswXTsgcTEgPSBkYXRhW3dpZHRoXTsKLSAgICAgICAgICAgIGlmICggKCh1bnNpZ25lZClBQlMocDAtcTApIDwgdGhyZXNob2xkcy0+YWxwaGEpICYmCi0gICAgICAgICAgICAgICAgICgodW5zaWduZWQpQUJTKHAxLXAwKSA8IHRocmVzaG9sZHMtPmJldGEpICAmJgotICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKUFCUyhxMS1xMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGVsdGEgPSBDTElQMygtdGMsIHRjLCAoKCgocTAgLSBwMCkgPDwgMikgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAocDEgLSBxMSkgKyA0KSA+PiAzKSk7Ci0gICAgICAgICAgICAgICAgcDAgPSBjbHBbcDAgKyBkZWx0YV07Ci0gICAgICAgICAgICAgICAgcTAgPSBjbHBbcTAgLSBkZWx0YV07Ci0gICAgICAgICAgICAgICAgZGF0YVstd2lkdGhdID0gcDA7Ci0gICAgICAgICAgICAgICAgZGF0YVsgIDBdID0gcTA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZm9yIChpID0gODsgaTsgaS0tLCBkYXRhKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHAxID0gZGF0YVstd2lkdGgqMl07IHAwID0gZGF0YVstd2lkdGhdOwotICAgICAgICAgICAgcTAgPSBkYXRhWzBdOyBxMSA9IGRhdGFbd2lkdGhdOwotICAgICAgICAgICAgaWYgKCAoKHVuc2lnbmVkKUFCUyhwMC1xMCkgPCB0aHJlc2hvbGRzLT5hbHBoYSkgJiYKLSAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocDEtcDApIDwgdGhyZXNob2xkcy0+YmV0YSkgICYmCi0gICAgICAgICAgICAgICAgICgodW5zaWduZWQpQUJTKHExLXEwKSA8IHRocmVzaG9sZHMtPmJldGEpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZGF0YVstd2lkdGhdID0gKDIgKiBwMSArIHAwICsgcTEgKyAyKSA+PiAyOwotICAgICAgICAgICAgICAgICAgICBkYXRhWyAgMF0gPSAoMiAqIHExICsgcTAgKyBwMSArIDIpID4+IDI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEdldEJvdW5kYXJ5U3RyZW5ndGhzCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBib3VuZGFyeSBzdHJlbmd0aHMgZm9yIGFsbCBlZGdlcyBvZiBhCi0gICAgICAgICAgICBtYWNyb2Jsb2NrLiBGdW5jdGlvbiByZXR1cm5zIEhBTlRST19UUlVFIGlmIGFueSBvZiB0aGUgYlMgdmFsdWVzIGZvcgotICAgICAgICAgICAgdGhlIG1hY3JvYmxvY2sgaGFkIG5vbi16ZXJvIHZhbHVlLCBIQU5UUk9fRkFMU0Ugb3RoZXJ3aXNlLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdTMyIEdldEJvdW5kYXJ5U3RyZW5ndGhzKG1iU3RvcmFnZV90ICptYiwgYlNfdCAqYlMsIHUzMiBmbGFncykKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICAvKiB0aGlzIGZsYWcgaXMgc2V0IEhBTlRST19UUlVFIGFzIHNvb24gYXMgYW55IGJvdW5kYXJ5IHN0cmVuZ3RoIHZhbHVlIGlzCi0gICAgICogbm9uLXplcm8gKi8KLSAgICB1MzIgbm9uWmVyb0JzID0gSEFOVFJPX0ZBTFNFOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQobWIpOwotICAgIEFTU0VSVChiUyk7Ci0gICAgQVNTRVJUKGZsYWdzKTsKLQotICAgIC8qIHRvcCBlZGdlcyAqLwotICAgIGlmIChmbGFncyAmIEZJTFRFUl9UT1BfRURHRSkKLSAgICB7Ci0gICAgICAgIGlmIChJU19JTlRSQV9NQigqbWIpIHx8IElTX0lOVFJBX01CKCptYi0+bWJCKSkKLSAgICAgICAgewotICAgICAgICAgICAgYlNbMF0udG9wID0gYlNbMV0udG9wID0gYlNbMl0udG9wID0gYlNbM10udG9wID0gNDsKLSAgICAgICAgICAgIG5vblplcm9CcyA9IEhBTlRST19UUlVFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYlNbMF0udG9wID0gRWRnZUJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iLT5tYkIsIDAsIDEwKTsKLSAgICAgICAgICAgIGJTWzFdLnRvcCA9IEVkZ2VCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYi0+bWJCLCAxLCAxMSk7Ci0gICAgICAgICAgICBiU1syXS50b3AgPSBFZGdlQm91bmRhcnlTdHJlbmd0aChtYiwgbWItPm1iQiwgNCwgMTQpOwotICAgICAgICAgICAgYlNbM10udG9wID0gRWRnZUJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iLT5tYkIsIDUsIDE1KTsKLSAgICAgICAgICAgIGlmIChiU1swXS50b3AgfHwgYlNbMV0udG9wIHx8IGJTWzJdLnRvcCB8fCBiU1szXS50b3ApCi0gICAgICAgICAgICAgICAgbm9uWmVyb0JzID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgYlNbMF0udG9wID0gYlNbMV0udG9wID0gYlNbMl0udG9wID0gYlNbM10udG9wID0gMDsKLSAgICB9Ci0KLSAgICAvKiBsZWZ0IGVkZ2VzICovCi0gICAgaWYgKGZsYWdzICYgRklMVEVSX0xFRlRfRURHRSkKLSAgICB7Ci0gICAgICAgIGlmIChJU19JTlRSQV9NQigqbWIpIHx8IElTX0lOVFJBX01CKCptYi0+bWJBKSkKLSAgICAgICAgewotICAgICAgICAgICAgYlNbMF0ubGVmdCA9IGJTWzRdLmxlZnQgPSBiU1s4XS5sZWZ0ID0gYlNbMTJdLmxlZnQgPSA0OwotICAgICAgICAgICAgbm9uWmVyb0JzID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBiU1swXS5sZWZ0ID0gRWRnZUJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iLT5tYkEsIDAsIDUpOwotICAgICAgICAgICAgYlNbNF0ubGVmdCA9IEVkZ2VCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYi0+bWJBLCAyLCA3KTsKLSAgICAgICAgICAgIGJTWzhdLmxlZnQgPSBFZGdlQm91bmRhcnlTdHJlbmd0aChtYiwgbWItPm1iQSwgOCwgMTMpOwotICAgICAgICAgICAgYlNbMTJdLmxlZnQgPSBFZGdlQm91bmRhcnlTdHJlbmd0aChtYiwgbWItPm1iQSwgMTAsIDE1KTsKLSAgICAgICAgICAgIGlmICghbm9uWmVyb0JzICYmCi0gICAgICAgICAgICAgICAgKGJTWzBdLmxlZnQgfHwgYlNbNF0ubGVmdCB8fCBiU1s4XS5sZWZ0IHx8IGJTWzEyXS5sZWZ0KSkKLSAgICAgICAgICAgICAgICBub25aZXJvQnMgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBiU1swXS5sZWZ0ID0gYlNbNF0ubGVmdCA9IGJTWzhdLmxlZnQgPSBiU1sxMl0ubGVmdCA9IDA7Ci0gICAgfQotCi0gICAgLyogaW5uZXIgZWRnZXMgKi8KLSAgICBpZiAoSVNfSU5UUkFfTUIoKm1iKSkKLSAgICB7Ci0gICAgICAgIGJTWzRdLnRvcCAgPSBiU1s1XS50b3AgID0gYlNbNl0udG9wICA9IGJTWzddLnRvcCAgPQotICAgICAgICBiU1s4XS50b3AgID0gYlNbOV0udG9wICA9IGJTWzEwXS50b3AgPSBiU1sxMV0udG9wID0KLSAgICAgICAgYlNbMTJdLnRvcCA9IGJTWzEzXS50b3AgPSBiU1sxNF0udG9wID0gYlNbMTVdLnRvcCA9IDM7Ci0KLSAgICAgICAgYlNbMV0ubGVmdCAgPSBiU1syXS5sZWZ0ICA9IGJTWzNdLmxlZnQgID0KLSAgICAgICAgYlNbNV0ubGVmdCAgPSBiU1s2XS5sZWZ0ICA9IGJTWzddLmxlZnQgID0KLSAgICAgICAgYlNbOV0ubGVmdCAgPSBiU1sxMF0ubGVmdCA9IGJTWzExXS5sZWZ0ID0KLSAgICAgICAgYlNbMTNdLmxlZnQgPSBiU1sxNF0ubGVmdCA9IGJTWzE1XS5sZWZ0ID0gMzsKLSAgICAgICAgbm9uWmVyb0JzID0gSEFOVFJPX1RSVUU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIDE2eDE2IGludGVyIG1iIC0+IHJlZiBhZGRyZXNzZXMgb3IgbW90aW9uIHZlY3RvcnMgY2Fubm90IGRpZmZlciwKLSAgICAgICAgICogb25seSBjaGVjayBpZiBlaXRoZXIgb2YgdGhlIGJsb2NrcyBjb250YWluIGNvZWZmaWNpZW50cyAqLwotICAgICAgICBpZiAoaDI2NGJzZE51bU1iUGFydChtYi0+bWJUeXBlKSA9PSAxKQotICAgICAgICB7Ci0gICAgICAgICAgICBiU1s0XS50b3AgPSBtYi0+dG90YWxDb2VmZlsyXSB8fCBtYi0+dG90YWxDb2VmZlswXSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbNV0udG9wID0gbWItPnRvdGFsQ29lZmZbM10gfHwgbWItPnRvdGFsQ29lZmZbMV0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzZdLnRvcCA9IG1iLT50b3RhbENvZWZmWzZdIHx8IG1iLT50b3RhbENvZWZmWzRdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1s3XS50b3AgPSBtYi0+dG90YWxDb2VmZls3XSB8fCBtYi0+dG90YWxDb2VmZls1XSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbOF0udG9wID0gbWItPnRvdGFsQ29lZmZbOF0gfHwgbWItPnRvdGFsQ29lZmZbMl0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzldLnRvcCA9IG1iLT50b3RhbENvZWZmWzldIHx8IG1iLT50b3RhbENvZWZmWzNdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1sxMF0udG9wID0gbWItPnRvdGFsQ29lZmZbMTJdIHx8IG1iLT50b3RhbENvZWZmWzZdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1sxMV0udG9wID0gbWItPnRvdGFsQ29lZmZbMTNdIHx8IG1iLT50b3RhbENvZWZmWzddID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1sxMl0udG9wID0gbWItPnRvdGFsQ29lZmZbMTBdIHx8IG1iLT50b3RhbENvZWZmWzhdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1sxM10udG9wID0gbWItPnRvdGFsQ29lZmZbMTFdIHx8IG1iLT50b3RhbENvZWZmWzldID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1sxNF0udG9wID0gbWItPnRvdGFsQ29lZmZbMTRdIHx8IG1iLT50b3RhbENvZWZmWzEyXSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbMTVdLnRvcCA9IG1iLT50b3RhbENvZWZmWzE1XSB8fCBtYi0+dG90YWxDb2VmZlsxM10gPyAyIDogMDsKLQotICAgICAgICAgICAgYlNbMV0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzFdIHx8IG1iLT50b3RhbENvZWZmWzBdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1syXS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbNF0gfHwgbWItPnRvdGFsQ29lZmZbMV0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzNdLmxlZnQgPSBtYi0+dG90YWxDb2VmZls1XSB8fCBtYi0+dG90YWxDb2VmZls0XSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbNV0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzNdIHx8IG1iLT50b3RhbENvZWZmWzJdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1s2XS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbNl0gfHwgbWItPnRvdGFsQ29lZmZbM10gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzddLmxlZnQgPSBtYi0+dG90YWxDb2VmZls3XSB8fCBtYi0+dG90YWxDb2VmZls2XSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbOV0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzldIHx8IG1iLT50b3RhbENvZWZmWzhdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1sxMF0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzEyXSB8fCBtYi0+dG90YWxDb2VmZls5XSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbMTFdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlsxM10gfHwgbWItPnRvdGFsQ29lZmZbMTJdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1sxM10ubGVmdCA9IG1iLT50b3RhbENvZWZmWzExXSB8fCBtYi0+dG90YWxDb2VmZlsxMF0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzE0XS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbMTRdIHx8IG1iLT50b3RhbENvZWZmWzExXSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbMTVdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlsxNV0gfHwgbWItPnRvdGFsQ29lZmZbMTRdID8gMiA6IDA7Ci0gICAgICAgIH0KLSAgICAgICAgLyogMTZ4OCBpbnRlciBtYiAtPiByZWYgYWRkcmVzc2VzIGFuZCBtb3Rpb24gdmVjdG9ycyBjYW4gYmUgZGlmZmVyZW50Ci0gICAgICAgICAqIG9ubHkgZm9yIHRoZSBtaWRkbGUgaG9yaXpvbnRhbCBlZGdlLCBmb3IgdGhlIG90aGVyIHRvcCBlZGdlcyBpdCBpcwotICAgICAgICAgKiBlbm91Z2ggdG8gY2hlY2sgd2hldGhlciB0aGUgYmxvY2tzIGNvbnRhaW4gY29lZmZpY2llbnRzIG9yIG5vdC4gVGhlCi0gICAgICAgICAqIHNhbWUgYXBwbGllcyB0byBhbGwgaW50ZXJuYWwgbGVmdCBlZGdlcy4gKi8KLSAgICAgICAgZWxzZSBpZiAobWItPm1iVHlwZSA9PSBQX0wwX0wwXzE2eDgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJTWzRdLnRvcCA9IG1iLT50b3RhbENvZWZmWzJdIHx8IG1iLT50b3RhbENvZWZmWzBdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1s1XS50b3AgPSBtYi0+dG90YWxDb2VmZlszXSB8fCBtYi0+dG90YWxDb2VmZlsxXSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbNl0udG9wID0gbWItPnRvdGFsQ29lZmZbNl0gfHwgbWItPnRvdGFsQ29lZmZbNF0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzddLnRvcCA9IG1iLT50b3RhbENvZWZmWzddIHx8IG1iLT50b3RhbENvZWZmWzVdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1sxMl0udG9wID0gbWItPnRvdGFsQ29lZmZbMTBdIHx8IG1iLT50b3RhbENvZWZmWzhdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1sxM10udG9wID0gbWItPnRvdGFsQ29lZmZbMTFdIHx8IG1iLT50b3RhbENvZWZmWzldID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1sxNF0udG9wID0gbWItPnRvdGFsQ29lZmZbMTRdIHx8IG1iLT50b3RhbENvZWZmWzEyXSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbMTVdLnRvcCA9IG1iLT50b3RhbENvZWZmWzE1XSB8fCBtYi0+dG90YWxDb2VmZlsxM10gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzhdLnRvcCA9IElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgOCwgMik7Ci0gICAgICAgICAgICBiU1s5XS50b3AgPSBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDksIDMpOwotICAgICAgICAgICAgYlNbMTBdLnRvcCA9IElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgMTIsIDYpOwotICAgICAgICAgICAgYlNbMTFdLnRvcCA9IElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgMTMsIDcpOwotCi0gICAgICAgICAgICBiU1sxXS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbMV0gfHwgbWItPnRvdGFsQ29lZmZbMF0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzJdLmxlZnQgPSBtYi0+dG90YWxDb2VmZls0XSB8fCBtYi0+dG90YWxDb2VmZlsxXSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbM10ubGVmdCA9IG1iLT50b3RhbENvZWZmWzVdIHx8IG1iLT50b3RhbENvZWZmWzRdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1s1XS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbM10gfHwgbWItPnRvdGFsQ29lZmZbMl0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzZdLmxlZnQgPSBtYi0+dG90YWxDb2VmZls2XSB8fCBtYi0+dG90YWxDb2VmZlszXSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbN10ubGVmdCA9IG1iLT50b3RhbENvZWZmWzddIHx8IG1iLT50b3RhbENvZWZmWzZdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1s5XS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbOV0gfHwgbWItPnRvdGFsQ29lZmZbOF0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzEwXS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbMTJdIHx8IG1iLT50b3RhbENvZWZmWzldID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1sxMV0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzEzXSB8fCBtYi0+dG90YWxDb2VmZlsxMl0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzEzXS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbMTFdIHx8IG1iLT50b3RhbENvZWZmWzEwXSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbMTRdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlsxNF0gfHwgbWItPnRvdGFsQ29lZmZbMTFdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1sxNV0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzE1XSB8fCBtYi0+dG90YWxDb2VmZlsxNF0gPyAyIDogMDsKLSAgICAgICAgfQotICAgICAgICAvKiA4eDE2IGludGVyIG1iIC0+IHJlZiBhZGRyZXNzZXMgYW5kIG1vdGlvbiB2ZWN0b3JzIGNhbiBiZSBkaWZmZXJlbnQKLSAgICAgICAgICogb25seSBmb3IgdGhlIG1pZGRsZSB2ZXJ0aWNhbCBlZGdlLCBmb3IgdGhlIG90aGVyIGxlZnQgZWRnZXMgaXQgaXMKLSAgICAgICAgICogZW5vdWdoIHRvIGNoZWNrIHdoZXRoZXIgdGhlIGJsb2NrcyBjb250YWluIGNvZWZmaWNpZW50cyBvciBub3QuIFRoZQotICAgICAgICAgKiBzYW1lIGFwcGxpZXMgdG8gYWxsIGludGVybmFsIHRvcCBlZGdlcy4gKi8KLSAgICAgICAgZWxzZSBpZiAobWItPm1iVHlwZSA9PSBQX0wwX0wwXzh4MTYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJTWzRdLnRvcCA9IG1iLT50b3RhbENvZWZmWzJdIHx8IG1iLT50b3RhbENvZWZmWzBdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1s1XS50b3AgPSBtYi0+dG90YWxDb2VmZlszXSB8fCBtYi0+dG90YWxDb2VmZlsxXSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbNl0udG9wID0gbWItPnRvdGFsQ29lZmZbNl0gfHwgbWItPnRvdGFsQ29lZmZbNF0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzddLnRvcCA9IG1iLT50b3RhbENvZWZmWzddIHx8IG1iLT50b3RhbENvZWZmWzVdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1s4XS50b3AgPSBtYi0+dG90YWxDb2VmZls4XSB8fCBtYi0+dG90YWxDb2VmZlsyXSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbOV0udG9wID0gbWItPnRvdGFsQ29lZmZbOV0gfHwgbWItPnRvdGFsQ29lZmZbM10gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzEwXS50b3AgPSBtYi0+dG90YWxDb2VmZlsxMl0gfHwgbWItPnRvdGFsQ29lZmZbNl0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzExXS50b3AgPSBtYi0+dG90YWxDb2VmZlsxM10gfHwgbWItPnRvdGFsQ29lZmZbN10gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzEyXS50b3AgPSBtYi0+dG90YWxDb2VmZlsxMF0gfHwgbWItPnRvdGFsQ29lZmZbOF0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzEzXS50b3AgPSBtYi0+dG90YWxDb2VmZlsxMV0gfHwgbWItPnRvdGFsQ29lZmZbOV0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzE0XS50b3AgPSBtYi0+dG90YWxDb2VmZlsxNF0gfHwgbWItPnRvdGFsQ29lZmZbMTJdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1sxNV0udG9wID0gbWItPnRvdGFsQ29lZmZbMTVdIHx8IG1iLT50b3RhbENvZWZmWzEzXSA/IDIgOiAwOwotCi0gICAgICAgICAgICBiU1sxXS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbMV0gfHwgbWItPnRvdGFsQ29lZmZbMF0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzNdLmxlZnQgPSBtYi0+dG90YWxDb2VmZls1XSB8fCBtYi0+dG90YWxDb2VmZls0XSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbNV0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzNdIHx8IG1iLT50b3RhbENvZWZmWzJdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1s3XS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbN10gfHwgbWItPnRvdGFsQ29lZmZbNl0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzldLmxlZnQgPSBtYi0+dG90YWxDb2VmZls5XSB8fCBtYi0+dG90YWxDb2VmZls4XSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbMTFdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlsxM10gfHwgbWItPnRvdGFsQ29lZmZbMTJdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1sxM10ubGVmdCA9IG1iLT50b3RhbENvZWZmWzExXSB8fCBtYi0+dG90YWxDb2VmZlsxMF0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzE1XS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbMTVdIHx8IG1iLT50b3RhbENvZWZmWzE0XSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbMl0ubGVmdCA9IElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgNCwgMSk7Ci0gICAgICAgICAgICBiU1s2XS5sZWZ0ID0gSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCA2LCAzKTsKLSAgICAgICAgICAgIGJTWzEwXS5sZWZ0ID0gSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCAxMiwgOSk7Ci0gICAgICAgICAgICBiU1sxNF0ubGVmdCA9IElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgMTQsIDExKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJTWzRdLnRvcCA9Ci0gICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzRdLCBtYjR4NEluZGV4WzBdKTsKLSAgICAgICAgICAgIGJTWzVdLnRvcCA9Ci0gICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzVdLCBtYjR4NEluZGV4WzFdKTsKLSAgICAgICAgICAgIGJTWzZdLnRvcCA9Ci0gICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzZdLCBtYjR4NEluZGV4WzJdKTsKLSAgICAgICAgICAgIGJTWzddLnRvcCA9Ci0gICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzddLCBtYjR4NEluZGV4WzNdKTsKLSAgICAgICAgICAgIGJTWzhdLnRvcCA9Ci0gICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzhdLCBtYjR4NEluZGV4WzRdKTsKLSAgICAgICAgICAgIGJTWzldLnRvcCA9Ci0gICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzldLCBtYjR4NEluZGV4WzVdKTsKLSAgICAgICAgICAgIGJTWzEwXS50b3AgPQotICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFsxMF0sIG1iNHg0SW5kZXhbNl0pOwotICAgICAgICAgICAgYlNbMTFdLnRvcCA9Ci0gICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzExXSwgbWI0eDRJbmRleFs3XSk7Ci0gICAgICAgICAgICBiU1sxMl0udG9wID0KLSAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbMTJdLCBtYjR4NEluZGV4WzhdKTsKLSAgICAgICAgICAgIGJTWzEzXS50b3AgPQotICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFsxM10sIG1iNHg0SW5kZXhbOV0pOwotICAgICAgICAgICAgYlNbMTRdLnRvcCA9Ci0gICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzE0XSwgbWI0eDRJbmRleFsxMF0pOwotICAgICAgICAgICAgYlNbMTVdLnRvcCA9Ci0gICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzE1XSwgbWI0eDRJbmRleFsxMV0pOwotCi0gICAgICAgICAgICBiU1sxXS5sZWZ0ID0KLSAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbMV0sIG1iNHg0SW5kZXhbMF0pOwotICAgICAgICAgICAgYlNbMl0ubGVmdCA9Ci0gICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzJdLCBtYjR4NEluZGV4WzFdKTsKLSAgICAgICAgICAgIGJTWzNdLmxlZnQgPQotICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFszXSwgbWI0eDRJbmRleFsyXSk7Ci0gICAgICAgICAgICBiU1s1XS5sZWZ0ID0KLSAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbNV0sIG1iNHg0SW5kZXhbNF0pOwotICAgICAgICAgICAgYlNbNl0ubGVmdCA9Ci0gICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzZdLCBtYjR4NEluZGV4WzVdKTsKLSAgICAgICAgICAgIGJTWzddLmxlZnQgPQotICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFs3XSwgbWI0eDRJbmRleFs2XSk7Ci0gICAgICAgICAgICBiU1s5XS5sZWZ0ID0KLSAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbOV0sIG1iNHg0SW5kZXhbOF0pOwotICAgICAgICAgICAgYlNbMTBdLmxlZnQgPQotICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFsxMF0sIG1iNHg0SW5kZXhbOV0pOwotICAgICAgICAgICAgYlNbMTFdLmxlZnQgPQotICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFsxMV0sIG1iNHg0SW5kZXhbMTBdKTsKLSAgICAgICAgICAgIGJTWzEzXS5sZWZ0ID0KLSAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbMTNdLCBtYjR4NEluZGV4WzEyXSk7Ci0gICAgICAgICAgICBiU1sxNF0ubGVmdCA9Ci0gICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzE0XSwgbWI0eDRJbmRleFsxM10pOwotICAgICAgICAgICAgYlNbMTVdLmxlZnQgPQotICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFsxNV0sIG1iNHg0SW5kZXhbMTRdKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW5vblplcm9CcyAmJgotICAgICAgICAgICAgKGJTWzRdLnRvcCB8fCBiU1s1XS50b3AgfHwgYlNbNl0udG9wIHx8IGJTWzddLnRvcCB8fAotICAgICAgICAgICAgIGJTWzhdLnRvcCB8fCBiU1s5XS50b3AgfHwgYlNbMTBdLnRvcCB8fCBiU1sxMV0udG9wIHx8Ci0gICAgICAgICAgICAgYlNbMTJdLnRvcCB8fCBiU1sxM10udG9wIHx8IGJTWzE0XS50b3AgfHwgYlNbMTVdLnRvcCB8fAotICAgICAgICAgICAgIGJTWzFdLmxlZnQgfHwgYlNbMl0ubGVmdCB8fCBiU1szXS5sZWZ0IHx8Ci0gICAgICAgICAgICAgYlNbNV0ubGVmdCB8fCBiU1s2XS5sZWZ0IHx8IGJTWzddLmxlZnQgfHwKLSAgICAgICAgICAgICBiU1s5XS5sZWZ0IHx8IGJTWzEwXS5sZWZ0IHx8IGJTWzExXS5sZWZ0IHx8Ci0gICAgICAgICAgICAgYlNbMTNdLmxlZnQgfHwgYlNbMTRdLmxlZnQgfHwgYlNbMTVdLmxlZnQpKQotICAgICAgICAgICAgbm9uWmVyb0JzID0gSEFOVFJPX1RSVUU7Ci0gICAgfQotCi0gICAgcmV0dXJuKG5vblplcm9Ccyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBHZXRMdW1hRWRnZVRocmVzaG9sZHMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgQ29tcHV0ZSBhbHBoYSwgYmV0YSBhbmQgdGMwIHRocmVzaG9sZHMgZm9yIGlubmVyLCBsZWZ0IGFuZCB0b3AKLSAgICAgICAgICAgIGx1bWEgZWRnZXMgb2YgYSBtYWNyb2Jsb2NrLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBHZXRMdW1hRWRnZVRocmVzaG9sZHMoCi0gIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKLSAgbWJTdG9yYWdlX3QgKm1iLAotICB1MzIgZmlsdGVyaW5nRmxhZ3MpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGluZGV4QSwgaW5kZXhCOwotICAgIHUzMiBxcEF2LCBxcCwgcXBUbXA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVCh0aHJlc2hvbGRzKTsKLSAgICBBU1NFUlQobWIpOwotCi0gICAgcXAgPSBtYi0+cXBZOwotCi0gICAgaW5kZXhBID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcCArIG1iLT5maWx0ZXJPZmZzZXRBKTsKLSAgICBpbmRleEIgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwICsgbWItPmZpbHRlck9mZnNldEIpOwotCi0gICAgdGhyZXNob2xkc1tJTk5FUl0uYWxwaGEgPSBhbHBoYXNbaW5kZXhBXTsKLSAgICB0aHJlc2hvbGRzW0lOTkVSXS5iZXRhID0gYmV0YXNbaW5kZXhCXTsKLSAgICB0aHJlc2hvbGRzW0lOTkVSXS50YzAgPSB0YzBbaW5kZXhBXTsKLQotICAgIGlmIChmaWx0ZXJpbmdGbGFncyAmIEZJTFRFUl9UT1BfRURHRSkKLSAgICB7Ci0gICAgICAgIHFwVG1wID0gbWItPm1iQi0+cXBZOwotICAgICAgICBpZiAocXBUbXAgIT0gcXApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHFwQXYgPSAocXAgKyBxcFRtcCArIDEpID4+IDE7Ci0KLSAgICAgICAgICAgIGluZGV4QSA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXBBdiArIG1iLT5maWx0ZXJPZmZzZXRBKTsKLSAgICAgICAgICAgIGluZGV4QiA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXBBdiArIG1iLT5maWx0ZXJPZmZzZXRCKTsKLQotICAgICAgICAgICAgdGhyZXNob2xkc1tUT1BdLmFscGhhID0gYWxwaGFzW2luZGV4QV07Ci0gICAgICAgICAgICB0aHJlc2hvbGRzW1RPUF0uYmV0YSA9IGJldGFzW2luZGV4Ql07Ci0gICAgICAgICAgICB0aHJlc2hvbGRzW1RPUF0udGMwID0gdGMwW2luZGV4QV07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJlc2hvbGRzW1RPUF0uYWxwaGEgPSB0aHJlc2hvbGRzW0lOTkVSXS5hbHBoYTsKLSAgICAgICAgICAgIHRocmVzaG9sZHNbVE9QXS5iZXRhID0gdGhyZXNob2xkc1tJTk5FUl0uYmV0YTsKLSAgICAgICAgICAgIHRocmVzaG9sZHNbVE9QXS50YzAgPSB0aHJlc2hvbGRzW0lOTkVSXS50YzA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGZpbHRlcmluZ0ZsYWdzICYgRklMVEVSX0xFRlRfRURHRSkKLSAgICB7Ci0gICAgICAgIHFwVG1wID0gbWItPm1iQS0+cXBZOwotICAgICAgICBpZiAocXBUbXAgIT0gcXApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHFwQXYgPSAocXAgKyBxcFRtcCArIDEpID4+IDE7Ci0KLSAgICAgICAgICAgIGluZGV4QSA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXBBdiArIG1iLT5maWx0ZXJPZmZzZXRBKTsKLSAgICAgICAgICAgIGluZGV4QiA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXBBdiArIG1iLT5maWx0ZXJPZmZzZXRCKTsKLQotICAgICAgICAgICAgdGhyZXNob2xkc1tMRUZUXS5hbHBoYSA9IGFscGhhc1tpbmRleEFdOwotICAgICAgICAgICAgdGhyZXNob2xkc1tMRUZUXS5iZXRhID0gYmV0YXNbaW5kZXhCXTsKLSAgICAgICAgICAgIHRocmVzaG9sZHNbTEVGVF0udGMwID0gdGMwW2luZGV4QV07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJlc2hvbGRzW0xFRlRdLmFscGhhID0gdGhyZXNob2xkc1tJTk5FUl0uYWxwaGE7Ci0gICAgICAgICAgICB0aHJlc2hvbGRzW0xFRlRdLmJldGEgPSB0aHJlc2hvbGRzW0lOTkVSXS5iZXRhOwotICAgICAgICAgICAgdGhyZXNob2xkc1tMRUZUXS50YzAgPSB0aHJlc2hvbGRzW0lOTkVSXS50YzA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBHZXRDaHJvbWFFZGdlVGhyZXNob2xkcwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBDb21wdXRlIGFscGhhLCBiZXRhIGFuZCB0YzAgdGhyZXNob2xkcyBmb3IgaW5uZXIsIGxlZnQgYW5kIHRvcAotICAgICAgICAgICAgY2hyb21hIGVkZ2VzIG9mIGEgbWFjcm9ibG9jay4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgR2V0Q2hyb21hRWRnZVRocmVzaG9sZHMoCi0gIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKLSAgbWJTdG9yYWdlX3QgKm1iLAotICB1MzIgZmlsdGVyaW5nRmxhZ3MsCi0gIGkzMiBjaHJvbWFRcEluZGV4T2Zmc2V0KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpbmRleEEsIGluZGV4QjsKLSAgICB1MzIgcXBBdiwgcXAsIHFwVG1wOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQodGhyZXNob2xkcyk7Ci0gICAgQVNTRVJUKG1iKTsKLQotICAgIHFwID0gbWItPnFwWTsKLSAgICBxcCA9IGgyNjRic2RRcENbQ0xJUDMoMCwgNTEsIChpMzIpcXAgKyBjaHJvbWFRcEluZGV4T2Zmc2V0KV07Ci0KLSAgICBpbmRleEEgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwICsgbWItPmZpbHRlck9mZnNldEEpOwotICAgIGluZGV4QiA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXAgKyBtYi0+ZmlsdGVyT2Zmc2V0Qik7Ci0KLSAgICB0aHJlc2hvbGRzW0lOTkVSXS5hbHBoYSA9IGFscGhhc1tpbmRleEFdOwotICAgIHRocmVzaG9sZHNbSU5ORVJdLmJldGEgPSBiZXRhc1tpbmRleEJdOwotICAgIHRocmVzaG9sZHNbSU5ORVJdLnRjMCA9IHRjMFtpbmRleEFdOwotCi0gICAgaWYgKGZpbHRlcmluZ0ZsYWdzICYgRklMVEVSX1RPUF9FREdFKQotICAgIHsKLSAgICAgICAgcXBUbXAgPSBtYi0+bWJCLT5xcFk7Ci0gICAgICAgIGlmIChxcFRtcCAhPSBtYi0+cXBZKQotICAgICAgICB7Ci0gICAgICAgICAgICBxcFRtcCA9IGgyNjRic2RRcENbQ0xJUDMoMCwgNTEsIChpMzIpcXBUbXAgKyBjaHJvbWFRcEluZGV4T2Zmc2V0KV07Ci0gICAgICAgICAgICBxcEF2ID0gKHFwICsgcXBUbXAgKyAxKSA+PiAxOwotCi0gICAgICAgICAgICBpbmRleEEgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwQXYgKyBtYi0+ZmlsdGVyT2Zmc2V0QSk7Ci0gICAgICAgICAgICBpbmRleEIgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwQXYgKyBtYi0+ZmlsdGVyT2Zmc2V0Qik7Ci0KLSAgICAgICAgICAgIHRocmVzaG9sZHNbVE9QXS5hbHBoYSA9IGFscGhhc1tpbmRleEFdOwotICAgICAgICAgICAgdGhyZXNob2xkc1tUT1BdLmJldGEgPSBiZXRhc1tpbmRleEJdOwotICAgICAgICAgICAgdGhyZXNob2xkc1tUT1BdLnRjMCA9IHRjMFtpbmRleEFdOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdGhyZXNob2xkc1tUT1BdLmFscGhhID0gdGhyZXNob2xkc1tJTk5FUl0uYWxwaGE7Ci0gICAgICAgICAgICB0aHJlc2hvbGRzW1RPUF0uYmV0YSA9IHRocmVzaG9sZHNbSU5ORVJdLmJldGE7Ci0gICAgICAgICAgICB0aHJlc2hvbGRzW1RPUF0udGMwID0gdGhyZXNob2xkc1tJTk5FUl0udGMwOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChmaWx0ZXJpbmdGbGFncyAmIEZJTFRFUl9MRUZUX0VER0UpCi0gICAgewotICAgICAgICBxcFRtcCA9IG1iLT5tYkEtPnFwWTsKLSAgICAgICAgaWYgKHFwVG1wICE9IG1iLT5xcFkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHFwVG1wID0gaDI2NGJzZFFwQ1tDTElQMygwLCA1MSwgKGkzMilxcFRtcCArIGNocm9tYVFwSW5kZXhPZmZzZXQpXTsKLSAgICAgICAgICAgIHFwQXYgPSAocXAgKyBxcFRtcCArIDEpID4+IDE7Ci0KLSAgICAgICAgICAgIGluZGV4QSA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXBBdiArIG1iLT5maWx0ZXJPZmZzZXRBKTsKLSAgICAgICAgICAgIGluZGV4QiA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXBBdiArIG1iLT5maWx0ZXJPZmZzZXRCKTsKLQotICAgICAgICAgICAgdGhyZXNob2xkc1tMRUZUXS5hbHBoYSA9IGFscGhhc1tpbmRleEFdOwotICAgICAgICAgICAgdGhyZXNob2xkc1tMRUZUXS5iZXRhID0gYmV0YXNbaW5kZXhCXTsKLSAgICAgICAgICAgIHRocmVzaG9sZHNbTEVGVF0udGMwID0gdGMwW2luZGV4QV07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJlc2hvbGRzW0xFRlRdLmFscGhhID0gdGhyZXNob2xkc1tJTk5FUl0uYWxwaGE7Ci0gICAgICAgICAgICB0aHJlc2hvbGRzW0xFRlRdLmJldGEgPSB0aHJlc2hvbGRzW0lOTkVSXS5iZXRhOwotICAgICAgICAgICAgdGhyZXNob2xkc1tMRUZUXS50YzAgPSB0aHJlc2hvbGRzW0lOTkVSXS50YzA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBGaWx0ZXJMdW1hCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGZpbHRlciBhbGwgbHVtYSBlZGdlcyBvZiBhIG1hY3JvYmxvY2sKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgRmlsdGVyTHVtYSgKLSAgdTggKmRhdGEsCi0gIGJTX3QgKmJTLAotICBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCi0gIHUzMiB3aWR0aCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdmJsb2NrOwotICAgIGJTX3QgKnRtcDsKLSAgICB1OCAqcHRyOwotICAgIHUzMiBvZmZzZXQ7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQoYlMpOwotICAgIEFTU0VSVCh0aHJlc2hvbGRzKTsKLQotICAgIHB0ciA9IGRhdGE7Ci0gICAgdG1wID0gYlM7Ci0KLSAgICBvZmZzZXQgID0gVE9QOwotCi0gICAgLyogbG9vcCBibG9jayByb3dzLCBwZXJmb3JtIGZpbHRlcmluZyBmb3IgYWxsIHZlcnRpY2FsIGVkZ2VzIG9mIHRoZSBibG9jawotICAgICAqIHJvdyBmaXJzdCwgdGhlbiBmaWx0ZXIgZWFjaCBob3Jpem9udGFsIGVkZ2Ugb2YgdGhlIHJvdyAqLwotICAgIGZvciAodmJsb2NrID0gNDsgdmJsb2NrLS07KQotICAgIHsKLSAgICAgICAgLyogb25seSBwZXJmb3JtIGZpbHRlcmluZyBpZiBiUyBpcyBub24temVybywgZmlyc3Qgb2YgdGhlIGZvdXIKLSAgICAgICAgICogRmlsdGVyVmVyTHVtYUVkZ2UgaGFuZGxlcyB0aGUgbGVmdCBlZGdlIG9mIHRoZSBtYWNyb2Jsb2NrLCBvdGhlcnMKLSAgICAgICAgICogZmlsdGVyIGlubmVyIGVkZ2VzICovCi0gICAgICAgIGlmICh0bXBbMF0ubGVmdCkKLSAgICAgICAgICAgIEZpbHRlclZlckx1bWFFZGdlKHB0ciwgdG1wWzBdLmxlZnQsIHRocmVzaG9sZHMgKyBMRUZULCB3aWR0aCk7Ci0gICAgICAgIGlmICh0bXBbMV0ubGVmdCkKLSAgICAgICAgICAgIEZpbHRlclZlckx1bWFFZGdlKHB0cis0LCB0bXBbMV0ubGVmdCwgdGhyZXNob2xkcyArIElOTkVSLCB3aWR0aCk7Ci0gICAgICAgIGlmICh0bXBbMl0ubGVmdCkKLSAgICAgICAgICAgIEZpbHRlclZlckx1bWFFZGdlKHB0cis4LCB0bXBbMl0ubGVmdCwgdGhyZXNob2xkcyArIElOTkVSLCB3aWR0aCk7Ci0gICAgICAgIGlmICh0bXBbM10ubGVmdCkKLSAgICAgICAgICAgIEZpbHRlclZlckx1bWFFZGdlKHB0cisxMiwgdG1wWzNdLmxlZnQsIHRocmVzaG9sZHMgKyBJTk5FUiwgd2lkdGgpOwotCi0gICAgICAgIC8qIGlmIGJTIGlzIGVxdWFsIGZvciBhbGwgaG9yaXpvbnRhbCBlZGdlcyBvZiB0aGUgcm93IC0+IHBlcmZvcm0KLSAgICAgICAgICogZmlsdGVyaW5nIHdpdGggRmlsdGVySG9yTHVtYSwgb3RoZXJ3aXNlIHVzZSBGaWx0ZXJIb3JMdW1hRWRnZSBmb3IKLSAgICAgICAgICogZWFjaCBlZGdlIHNlcGFyYXRlbHkuIG9mZnNldCB2YXJpYWJsZSBpbmRpY2F0ZXMgdG9wIG1hY3JvYmxvY2sgZWRnZQotICAgICAgICAgKiBvbiB0aGUgZmlyc3QgbG9vcCByb3VuZCwgaW5uZXIgZWRnZSBmb3IgdGhlIG90aGVyIHJvdW5kcyAqLwotICAgICAgICBpZiAodG1wWzBdLnRvcCA9PSB0bXBbMV0udG9wICYmIHRtcFsxXS50b3AgPT0gdG1wWzJdLnRvcCAmJgotICAgICAgICAgICAgdG1wWzJdLnRvcCA9PSB0bXBbM10udG9wKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZih0bXBbMF0udG9wKQotICAgICAgICAgICAgICAgIEZpbHRlckhvckx1bWEocHRyLCB0bXBbMF0udG9wLCB0aHJlc2hvbGRzICsgb2Zmc2V0LCAoaTMyKXdpZHRoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHRtcFswXS50b3ApCi0gICAgICAgICAgICAgICAgRmlsdGVySG9yTHVtYUVkZ2UocHRyLCB0bXBbMF0udG9wLCB0aHJlc2hvbGRzK29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCk7Ci0gICAgICAgICAgICBpZih0bXBbMV0udG9wKQotICAgICAgICAgICAgICAgIEZpbHRlckhvckx1bWFFZGdlKHB0cis0LCB0bXBbMV0udG9wLCB0aHJlc2hvbGRzK29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCk7Ci0gICAgICAgICAgICBpZih0bXBbMl0udG9wKQotICAgICAgICAgICAgICAgIEZpbHRlckhvckx1bWFFZGdlKHB0cis4LCB0bXBbMl0udG9wLCB0aHJlc2hvbGRzK29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCk7Ci0gICAgICAgICAgICBpZih0bXBbM10udG9wKQotICAgICAgICAgICAgICAgIEZpbHRlckhvckx1bWFFZGdlKHB0cisxMiwgdG1wWzNdLnRvcCwgdGhyZXNob2xkcytvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogZm91ciBwaXhlbCByb3dzIGFoZWFkLCBpLmUuIG5leHQgcm93IG9mIDR4NC1ibG9ja3MgKi8KLSAgICAgICAgcHRyICs9IHdpZHRoKjQ7Ci0gICAgICAgIHRtcCArPSA0OwotICAgICAgICBvZmZzZXQgPSBJTk5FUjsKLSAgICB9Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRmlsdGVyQ2hyb21hCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGZpbHRlciBhbGwgY2hyb21hIGVkZ2VzIG9mIGEgbWFjcm9ibG9jawotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBGaWx0ZXJDaHJvbWEoCi0gIHU4ICpkYXRhQ2IsCi0gIHU4ICpkYXRhQ3IsCi0gIGJTX3QgKmJTLAotICBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCi0gIHUzMiB3aWR0aCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdmJsb2NrOwotICAgIGJTX3QgKnRtcDsKLSAgICB1MzIgb2Zmc2V0OwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZGF0YUNiKTsKLSAgICBBU1NFUlQoZGF0YUNyKTsKLSAgICBBU1NFUlQoYlMpOwotICAgIEFTU0VSVCh0aHJlc2hvbGRzKTsKLQotICAgIHRtcCA9IGJTOwotICAgIG9mZnNldCA9IFRPUDsKLQotICAgIC8qIGxvb3AgYmxvY2sgcm93cywgcGVyZm9ybSBmaWx0ZXJpbmcgZm9yIGFsbCB2ZXJ0aWNhbCBlZGdlcyBvZiB0aGUgYmxvY2sKLSAgICAgKiByb3cgZmlyc3QsIHRoZW4gZmlsdGVyIGVhY2ggaG9yaXpvbnRhbCBlZGdlIG9mIHRoZSByb3cgKi8KLSAgICBmb3IgKHZibG9jayA9IDA7IHZibG9jayA8IDI7IHZibG9jaysrKQotICAgIHsKLSAgICAgICAgLyogb25seSBwZXJmb3JtIGZpbHRlcmluZyBpZiBiUyBpcyBub24temVybywgZmlyc3QgdHdvIG9mIHRoZSBmb3VyCi0gICAgICAgICAqIEZpbHRlclZlckNocm9tYUVkZ2UgY2FsbHMgaGFuZGxlIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIG1hY3JvYmxvY2ssCi0gICAgICAgICAqIG90aGVycyBmaWx0ZXIgdGhlIGlubmVyIGVkZ2UuIE5vdGUgdGhhdCBhcyBjaHJvbWEgdXNlcyBiUyB2YWx1ZXMKLSAgICAgICAgICogZGV0ZXJtaW5lZCBmb3IgbHVtYSBlZGdlcywgZWFjaCBiUyBpcyB1c2VkIG9ubHkgZm9yIDIgcGl4ZWxzIG9mCi0gICAgICAgICAqIGEgNC1waXhlbCBlZGdlICovCi0gICAgICAgIGlmICh0bXBbMF0ubGVmdCkKLSAgICAgICAgewotICAgICAgICAgICAgRmlsdGVyVmVyQ2hyb21hRWRnZShkYXRhQ2IsIHRtcFswXS5sZWZ0LCB0aHJlc2hvbGRzICsgTEVGVCwgd2lkdGgpOwotICAgICAgICAgICAgRmlsdGVyVmVyQ2hyb21hRWRnZShkYXRhQ3IsIHRtcFswXS5sZWZ0LCB0aHJlc2hvbGRzICsgTEVGVCwgd2lkdGgpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0bXBbNF0ubGVmdCkKLSAgICAgICAgewotICAgICAgICAgICAgRmlsdGVyVmVyQ2hyb21hRWRnZShkYXRhQ2IrMip3aWR0aCwgdG1wWzRdLmxlZnQsIHRocmVzaG9sZHMgKyBMRUZULAotICAgICAgICAgICAgICAgIHdpZHRoKTsKLSAgICAgICAgICAgIEZpbHRlclZlckNocm9tYUVkZ2UoZGF0YUNyKzIqd2lkdGgsIHRtcFs0XS5sZWZ0LCB0aHJlc2hvbGRzICsgTEVGVCwKLSAgICAgICAgICAgICAgICB3aWR0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRtcFsyXS5sZWZ0KQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWx0ZXJWZXJDaHJvbWFFZGdlKGRhdGFDYis0LCB0bXBbMl0ubGVmdCwgdGhyZXNob2xkcyArIElOTkVSLAotICAgICAgICAgICAgICAgIHdpZHRoKTsKLSAgICAgICAgICAgIEZpbHRlclZlckNocm9tYUVkZ2UoZGF0YUNyKzQsIHRtcFsyXS5sZWZ0LCB0aHJlc2hvbGRzICsgSU5ORVIsCi0gICAgICAgICAgICAgICAgd2lkdGgpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0bXBbNl0ubGVmdCkKLSAgICAgICAgewotICAgICAgICAgICAgRmlsdGVyVmVyQ2hyb21hRWRnZShkYXRhQ2IrMip3aWR0aCs0LCB0bXBbNl0ubGVmdCwKLSAgICAgICAgICAgICAgICB0aHJlc2hvbGRzICsgSU5ORVIsIHdpZHRoKTsKLSAgICAgICAgICAgIEZpbHRlclZlckNocm9tYUVkZ2UoZGF0YUNyKzIqd2lkdGgrNCwgdG1wWzZdLmxlZnQsCi0gICAgICAgICAgICAgICAgdGhyZXNob2xkcyArIElOTkVSLCB3aWR0aCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBpZiBiUyBpcyBlcXVhbCBmb3IgYWxsIGhvcml6b250YWwgZWRnZXMgb2YgdGhlIHJvdyAtPiBwZXJmb3JtCi0gICAgICAgICAqIGZpbHRlcmluZyB3aXRoIEZpbHRlckhvckNocm9tYSwgb3RoZXJ3aXNlIHVzZSBGaWx0ZXJIb3JDaHJvbWFFZGdlCi0gICAgICAgICAqIGZvciBlYWNoIGVkZ2Ugc2VwYXJhdGVseS4gb2Zmc2V0IHZhcmlhYmxlIGluZGljYXRlcyB0b3AgbWFjcm9ibG9jawotICAgICAgICAgKiBlZGdlIG9uIHRoZSBmaXJzdCBsb29wIHJvdW5kLCBpbm5lciBlZGdlIGZvciB0aGUgc2Vjb25kICovCi0gICAgICAgIGlmICh0bXBbMF0udG9wID09IHRtcFsxXS50b3AgJiYgdG1wWzFdLnRvcCA9PSB0bXBbMl0udG9wICYmCi0gICAgICAgICAgICB0bXBbMl0udG9wID09IHRtcFszXS50b3ApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHRtcFswXS50b3ApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRmlsdGVySG9yQ2hyb21hKGRhdGFDYiwgdG1wWzBdLnRvcCwgdGhyZXNob2xkcytvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgpOwotICAgICAgICAgICAgICAgIEZpbHRlckhvckNocm9tYShkYXRhQ3IsIHRtcFswXS50b3AsIHRocmVzaG9sZHMrb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0bXBbMF0udG9wKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZpbHRlckhvckNocm9tYUVkZ2UoZGF0YUNiLCB0bXBbMF0udG9wLCB0aHJlc2hvbGRzK29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCk7Ci0gICAgICAgICAgICAgICAgRmlsdGVySG9yQ2hyb21hRWRnZShkYXRhQ3IsIHRtcFswXS50b3AsIHRocmVzaG9sZHMrb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0bXBbMV0udG9wKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZpbHRlckhvckNocm9tYUVkZ2UoZGF0YUNiKzIsIHRtcFsxXS50b3AsIHRocmVzaG9sZHMrb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoKTsKLSAgICAgICAgICAgICAgICBGaWx0ZXJIb3JDaHJvbWFFZGdlKGRhdGFDcisyLCB0bXBbMV0udG9wLCB0aHJlc2hvbGRzK29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodG1wWzJdLnRvcCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGaWx0ZXJIb3JDaHJvbWFFZGdlKGRhdGFDYis0LCB0bXBbMl0udG9wLCB0aHJlc2hvbGRzK29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCk7Ci0gICAgICAgICAgICAgICAgRmlsdGVySG9yQ2hyb21hRWRnZShkYXRhQ3IrNCwgdG1wWzJdLnRvcCwgdGhyZXNob2xkcytvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHRtcFszXS50b3ApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRmlsdGVySG9yQ2hyb21hRWRnZShkYXRhQ2IrNiwgdG1wWzNdLnRvcCwgdGhyZXNob2xkcytvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgpOwotICAgICAgICAgICAgICAgIEZpbHRlckhvckNocm9tYUVkZ2UoZGF0YUNyKzYsIHRtcFszXS50b3AsIHRocmVzaG9sZHMrb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRtcCArPSA4OwotICAgICAgICBkYXRhQ2IgKz0gd2lkdGgqNDsKLSAgICAgICAgZGF0YUNyICs9IHdpZHRoKjQ7Ci0gICAgICAgIG9mZnNldCA9IElOTkVSOwotICAgIH0KLX0KLQotI2Vsc2UgLyogSDI2NERFQ19PTVhETCAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RGaWx0ZXJQaWN0dXJlCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQZXJmb3JtIGRlYmxvY2tpbmcgZmlsdGVyaW5nIGZvciBhIHBpY3R1cmUuIEZpbHRlciBkb2VzIG5vdCBjb3B5Ci0gICAgICAgICAgdGhlIG9yaWdpbmFsIHBpY3R1cmUgYW55d2hlcmUgYnV0IGZpbHRlcmluZyBpcyBwZXJmb3JtZWQgZGlyZWN0bHkKLSAgICAgICAgICBvbiB0aGUgb3JpZ2luYWwgaW1hZ2UuIFBhcmFtZXRlcnMgY29udHJvbGxpbmcgdGhlIGZpbHRlcmluZyBwcm9jZXNzCi0gICAgICAgICAgYXJlIGNvbXB1dGVkIGJhc2VkIG9uIGluZm9ybWF0aW9uIGluIG1hY3JvYmxvY2sgc3RydWN0dXJlcyBvZiB0aGUKLSAgICAgICAgICBmaWx0ZXJlZCBtYWNyb2Jsb2NrLCBtYWNyb2Jsb2NrIGFib3ZlIGFuZCBtYWNyb2Jsb2NrIG9uIHRoZSBsZWZ0IG9mCi0gICAgICAgICAgdGhlIGZpbHRlcmVkIG9uZS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgaW1hZ2UgICAgICAgICBwb2ludGVyIHRvIGltYWdlIHRvIGJlIGZpbHRlcmVkCi0gICAgICAgICAgbWIgICAgICAgICAgICBwb2ludGVyIHRvIG1hY3JvYmxvY2sgZGF0YSBzdHJ1Y3R1cmUgb2YgdGhlIHRvcC1sZWZ0Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrIG9mIHRoZSBwaWN0dXJlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICBpbWFnZSAgICAgICAgIGZpbHRlcmVkIGltYWdlIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICBub25lCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qbGludCAtLWV7NTUwfSBTeW1ib2wgbm90IGFjY2Vzc2VkICovCi12b2lkIGgyNjRic2RGaWx0ZXJQaWN0dXJlKAotICBpbWFnZV90ICppbWFnZSwKLSAgbWJTdG9yYWdlX3QgKm1iKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBmbGFnczsKLSAgICB1MzIgcGljU2l6ZUluTWJzLCBtYlJvdywgbWJDb2w7Ci0gICAgdTMyIHBpY1dpZHRoSW5NYnM7Ci0gICAgdTggKmRhdGE7Ci0gICAgbWJTdG9yYWdlX3QgKnBNYjsKLSAgICB1OCBiU1syXVsxNl07Ci0gICAgdTggdGhyZXNob2xkTHVtYVsyXVsxNl07Ci0gICAgdTggdGhyZXNob2xkQ2hyb21hWzJdWzhdOwotICAgIHU4IGFscGhhWzJdWzJdOwotICAgIHU4IGJldGFbMl1bMl07Ci0gICAgT01YUmVzdWx0IHJlczsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGltYWdlKTsKLSAgICBBU1NFUlQobWIpOwotICAgIEFTU0VSVChpbWFnZS0+ZGF0YSk7Ci0gICAgQVNTRVJUKGltYWdlLT53aWR0aCk7Ci0gICAgQVNTRVJUKGltYWdlLT5oZWlnaHQpOwotCi0gICAgcGljV2lkdGhJbk1icyA9IGltYWdlLT53aWR0aDsKLSAgICBkYXRhID0gaW1hZ2UtPmRhdGE7Ci0gICAgcGljU2l6ZUluTWJzID0gcGljV2lkdGhJbk1icyAqIGltYWdlLT5oZWlnaHQ7Ci0KLSAgICBwTWIgPSBtYjsKLQotICAgIGZvciAobWJSb3cgPSAwLCBtYkNvbCA9IDA7IG1iUm93IDwgaW1hZ2UtPmhlaWdodDsgcE1iKyspCi0gICAgewotICAgICAgICBmbGFncyA9IEdldE1iRmlsdGVyaW5nRmxhZ3MocE1iKTsKLQotICAgICAgICBpZiAoZmxhZ3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEdldEJvdW5kYXJ5U3RyZW5ndGhzIGZ1bmN0aW9uIHJldHVybnMgbm9uLXplcm8gdmFsdWUgaWYgYW55IG9mCi0gICAgICAgICAgICAgKiB0aGUgYlMgdmFsdWVzIGZvciB0aGUgbWFjcm9ibG9jayBiZWluZyBwcm9jZXNzZWQgd2FzIG5vbi16ZXJvICovCi0gICAgICAgICAgICBpZiAoR2V0Qm91bmRhcnlTdHJlbmd0aHMocE1iLCBiUywgZmxhZ3MpKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgLyogTHVtYSAqLwotICAgICAgICAgICAgICAgIEdldEx1bWFFZGdlVGhyZXNob2xkcyhwTWIsYWxwaGEsYmV0YSx0aHJlc2hvbGRMdW1hLGJTLGZsYWdzKTsKLSAgICAgICAgICAgICAgICBkYXRhID0gaW1hZ2UtPmRhdGEgKyBtYlJvdyAqIHBpY1dpZHRoSW5NYnMgKiAyNTYgKyBtYkNvbCAqIDE2OwotCi0gICAgICAgICAgICAgICAgcmVzID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0koIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX1MzMikocGljV2lkdGhJbk1icyoxNiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KilhbHBoYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWJldGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4Kil0aHJlc2hvbGRMdW1hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopYlMgKTsKLQotICAgICAgICAgICAgICAgIHJlcyA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JKCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9TMzIpKHBpY1dpZHRoSW5NYnMqMTYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopYWxwaGErMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWJldGErMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKXRocmVzaG9sZEx1bWErMTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KiliUysxNiApOwotICAgICAgICAgICAgICAgIC8qIENiICovCi0gICAgICAgICAgICAgICAgR2V0Q2hyb21hRWRnZVRocmVzaG9sZHMocE1iLCBhbHBoYSwgYmV0YSwgdGhyZXNob2xkQ2hyb21hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTLCBmbGFncywgcE1iLT5jaHJvbWFRcEluZGV4T2Zmc2V0KTsKLSAgICAgICAgICAgICAgICBkYXRhID0gaW1hZ2UtPmRhdGEgKyBwaWNTaXplSW5NYnMgKiAyNTYgKwotICAgICAgICAgICAgICAgICAgICBtYlJvdyAqIHBpY1dpZHRoSW5NYnMgKiA2NCArIG1iQ29sICogODsKLQotICAgICAgICAgICAgICAgIHJlcyA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0koIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9TMzIpKHBpY1dpZHRoSW5NYnMqOCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopYWxwaGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopYmV0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4Kil0aHJlc2hvbGRDaHJvbWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopYlMgKTsKLSAgICAgICAgICAgICAgICByZXMgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JKCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfUzMyKShwaWNXaWR0aEluTWJzKjgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWFscGhhKzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopYmV0YSsyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKXRocmVzaG9sZENocm9tYSs4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWJTKzE2ICk7Ci0gICAgICAgICAgICAgICAgLyogQ3IgKi8KLSAgICAgICAgICAgICAgICBkYXRhICs9IChwaWNTaXplSW5NYnMgKiA2NCk7Ci0gICAgICAgICAgICAgICAgcmVzID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSggZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX1MzMikocGljV2lkdGhJbk1icyo4KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KilhbHBoYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KiliZXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKXRocmVzaG9sZENocm9tYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KiliUyApOwotICAgICAgICAgICAgICAgIHJlcyA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0koIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9TMzIpKHBpY1dpZHRoSW5NYnMqOCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopYWxwaGErMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KiliZXRhKzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopdGhyZXNob2xkQ2hyb21hKzgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopYlMrMTYgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG1iQ29sKys7Ci0gICAgICAgIGlmIChtYkNvbCA9PSBwaWNXaWR0aEluTWJzKQotICAgICAgICB7Ci0gICAgICAgICAgICBtYkNvbCA9IDA7Ci0gICAgICAgICAgICBtYlJvdysrOwotICAgICAgICB9Ci0gICAgfQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogR2V0Qm91bmRhcnlTdHJlbmd0aHMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gY2FsY3VsYXRlIGJvdW5kYXJ5IHN0cmVuZ3RocyBmb3IgYWxsIGVkZ2VzIG9mIGEKLSAgICAgICAgICAgIG1hY3JvYmxvY2suIEZ1bmN0aW9uIHJldHVybnMgSEFOVFJPX1RSVUUgaWYgYW55IG9mIHRoZSBiUyB2YWx1ZXMgZm9yCi0gICAgICAgICAgICB0aGUgbWFjcm9ibG9jayBoYWQgbm9uLXplcm8gdmFsdWUsIEhBTlRST19GQUxTRSBvdGhlcndpc2UuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi11MzIgR2V0Qm91bmRhcnlTdHJlbmd0aHMobWJTdG9yYWdlX3QgKm1iLCB1OCAoKmJTKVsxNl0sIHUzMiBmbGFncykKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICAvKiB0aGlzIGZsYWcgaXMgc2V0IEhBTlRST19UUlVFIGFzIHNvb24gYXMgYW55IGJvdW5kYXJ5IHN0cmVuZ3RoIHZhbHVlIGlzCi0gICAgICogbm9uLXplcm8gKi8KLSAgICB1MzIgbm9uWmVyb0JzID0gSEFOVFJPX0ZBTFNFOwotICAgIHUzMiAqcFRtcDsKLSAgICB1MzIgdG1wMSwgdG1wMiwgaXNJbnRyYU1iOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQobWIpOwotICAgIEFTU0VSVChiUyk7Ci0gICAgQVNTRVJUKGZsYWdzKTsKLQotICAgIGlzSW50cmFNYiA9IElTX0lOVFJBX01CKCptYik7Ci0KLSAgICAvKiB0b3AgZWRnZXMgKi8KLSAgICBwVG1wID0gKHUzMiopJmJTWzFdWzBdOwotICAgIGlmIChmbGFncyAmIEZJTFRFUl9UT1BfRURHRSkKLSAgICB7Ci0gICAgICAgIGlmIChpc0ludHJhTWIgfHwgSVNfSU5UUkFfTUIoKm1iLT5tYkIpKQotICAgICAgICB7Ci0gICAgICAgICAgICAqcFRtcCA9IDB4MDQwNDA0MDQ7Ci0gICAgICAgICAgICBub25aZXJvQnMgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgICpwVG1wID0gRWRnZUJvdW5kYXJ5U3RyZW5ndGhUb3AobWIsIG1iLT5tYkIpOwotICAgICAgICAgICAgaWYgKCpwVG1wKQotICAgICAgICAgICAgICAgIG5vblplcm9CcyA9IEhBTlRST19UUlVFOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgICpwVG1wID0gMDsKLSAgICB9Ci0KLSAgICAvKiBsZWZ0IGVkZ2VzICovCi0gICAgcFRtcCA9ICh1MzIqKSZiU1swXVswXTsKLSAgICBpZiAoZmxhZ3MgJiBGSUxURVJfTEVGVF9FREdFKQotICAgIHsKLSAgICAgICAgaWYgKGlzSW50cmFNYiB8fCBJU19JTlRSQV9NQigqbWItPm1iQSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qYlNbMF1bMF0gPSBiU1swXVsxXSA9IGJTWzBdWzJdID0gYlNbMF1bM10gPSA0OyovCi0gICAgICAgICAgICAqcFRtcCA9IDB4MDQwNDA0MDQ7Ci0gICAgICAgICAgICBub25aZXJvQnMgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgICpwVG1wID0gRWRnZUJvdW5kYXJ5U3RyZW5ndGhMZWZ0KG1iLCBtYi0+bWJBKTsKLSAgICAgICAgICAgIGlmICghbm9uWmVyb0JzICYmICpwVG1wKQotICAgICAgICAgICAgICAgIG5vblplcm9CcyA9IEhBTlRST19UUlVFOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgICpwVG1wID0gMDsKLSAgICB9Ci0KLSAgICAvKiBpbm5lciBlZGdlcyAqLwotICAgIGlmIChpc0ludHJhTWIpCi0gICAgewotICAgICAgICBwVG1wKys7Ci0gICAgICAgICpwVG1wKysgPSAweDAzMDMwMzAzOwotICAgICAgICAqcFRtcCsrID0gMHgwMzAzMDMwMzsKLSAgICAgICAgKnBUbXArKyA9IDB4MDMwMzAzMDM7Ci0gICAgICAgIHBUbXArKzsKLSAgICAgICAgKnBUbXArKyA9IDB4MDMwMzAzMDM7Ci0gICAgICAgICpwVG1wKysgPSAweDAzMDMwMzAzOwotICAgICAgICAqcFRtcCA9IDB4MDMwMzAzMDM7Ci0KLSAgICAgICAgbm9uWmVyb0JzID0gSEFOVFJPX1RSVUU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBUbXAgPSAodTMyKiltYi0+dG90YWxDb2VmZjsKLQotICAgICAgICAvKiAxNngxNiBpbnRlciBtYiAtPiByZWYgYWRkcmVzc2VzIG9yIG1vdGlvbiB2ZWN0b3JzIGNhbm5vdCBkaWZmZXIsCi0gICAgICAgICAqIG9ubHkgY2hlY2sgaWYgZWl0aGVyIG9mIHRoZSBibG9ja3MgY29udGFpbiBjb2VmZmljaWVudHMgKi8KLSAgICAgICAgaWYgKGgyNjRic2ROdW1NYlBhcnQobWItPm1iVHlwZSkgPT0gMSkKLSAgICAgICAgewotICAgICAgICAgICAgdG1wMSA9ICpwVG1wKys7Ci0gICAgICAgICAgICB0bXAyID0gKnBUbXArKzsKLSAgICAgICAgICAgIGJTWzFdWzRdICA9ICh0bXAxICYgMHgwMEZGMDBGRikgPyAyIDogMDsgLyogWzJdICB8fCBbMF0gKi8KLSAgICAgICAgICAgIGJTWzFdWzVdICA9ICh0bXAxICYgMHhGRjAwRkYwMCkgPyAyIDogMDsgLyogWzNdICB8fCBbMV0gKi8KLSAgICAgICAgICAgIGJTWzBdWzRdICA9ICh0bXAxICYgMHgwMDAwRkZGRikgPyAyIDogMDsgLyogWzFdICB8fCBbMF0gKi8KLSAgICAgICAgICAgIGJTWzBdWzVdICA9ICh0bXAxICYgMHhGRkZGMDAwMCkgPyAyIDogMDsgLyogWzNdICB8fCBbMl0gKi8KLQotICAgICAgICAgICAgdG1wMSA9ICpwVG1wKys7Ci0gICAgICAgICAgICBiU1sxXVs2XSAgPSAodG1wMiAmIDB4MDBGRjAwRkYpID8gMiA6IDA7IC8qIFs2XSAgfHwgWzRdICovCi0gICAgICAgICAgICBiU1sxXVs3XSAgPSAodG1wMiAmIDB4RkYwMEZGMDApID8gMiA6IDA7IC8qIFs3XSAgfHwgWzVdICovCi0gICAgICAgICAgICBiU1swXVsxMl0gPSAodG1wMiAmIDB4MDAwMEZGRkYpID8gMiA6IDA7IC8qIFs1XSAgfHwgWzRdICovCi0gICAgICAgICAgICBiU1swXVsxM10gPSAodG1wMiAmIDB4RkZGRjAwMDApID8gMiA6IDA7IC8qIFs3XSAgfHwgWzZdICovCi0gICAgICAgICAgICB0bXAyID0gKnBUbXA7Ci0gICAgICAgICAgICBiU1sxXVsxMl0gPSAodG1wMSAmIDB4MDBGRjAwRkYpID8gMiA6IDA7IC8qIFsxMF0gfHwgWzhdICovCi0gICAgICAgICAgICBiU1sxXVsxM10gPSAodG1wMSAmIDB4RkYwMEZGMDApID8gMiA6IDA7IC8qIFsxMV0gfHwgWzldICovCi0gICAgICAgICAgICBiU1swXVs2XSAgPSAodG1wMSAmIDB4MDAwMEZGRkYpID8gMiA6IDA7IC8qIFs5XSAgfHwgWzhdICovCi0gICAgICAgICAgICBiU1swXVs3XSAgPSAodG1wMSAmIDB4RkZGRjAwMDApID8gMiA6IDA7IC8qIFsxMV0gfHwgWzEwXSAqLwotCi0gICAgICAgICAgICBiU1sxXVsxNF0gPSAodG1wMiAmIDB4MDBGRjAwRkYpID8gMiA6IDA7IC8qIFsxNF0gfHwgWzEyXSAqLwotICAgICAgICAgICAgYlNbMV1bMTVdID0gKHRtcDIgJiAweEZGMDBGRjAwKSA/IDIgOiAwOyAvKiBbMTVdIHx8IFsxM10gKi8KLSAgICAgICAgICAgIGJTWzBdWzE0XSA9ICh0bXAyICYgMHgwMDAwRkZGRikgPyAyIDogMDsgLyogWzEzXSB8fCBbMTJdICovCi0gICAgICAgICAgICBiU1swXVsxNV0gPSAodG1wMiAmIDB4RkZGRjAwMDApID8gMiA6IDA7IC8qIFsxNV0gfHwgWzE0XSAqLwotCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICB1MzIgdG1wMywgdG1wNDsKLQotICAgICAgICAgICAgdG1wMSA9IG1iLT50b3RhbENvZWZmWzhdOwotICAgICAgICAgICAgdG1wMiA9IG1iLT50b3RhbENvZWZmWzJdOwotICAgICAgICAgICAgdG1wMyA9IG1iLT50b3RhbENvZWZmWzldOwotICAgICAgICAgICAgdG1wNCA9IG1iLT50b3RhbENvZWZmWzNdOwotCi0gICAgICAgICAgICBiU1sxXVs4XSA9IHRtcDEgfHwgdG1wMiA/IDIgOiAwOwotICAgICAgICAgICAgdG1wMSA9IG1iLT50b3RhbENvZWZmWzEyXTsKLSAgICAgICAgICAgIHRtcDIgPSBtYi0+dG90YWxDb2VmZls2XTsKLSAgICAgICAgICAgIGJTWzFdWzldID0gdG1wMyB8fCB0bXA0ID8gMiA6IDA7Ci0gICAgICAgICAgICB0bXAzID0gbWItPnRvdGFsQ29lZmZbMTNdOwotICAgICAgICAgICAgdG1wNCA9IG1iLT50b3RhbENvZWZmWzddOwotICAgICAgICAgICAgYlNbMV1bMTBdID0gdG1wMSB8fCB0bXAyID8gMiA6IDA7Ci0gICAgICAgICAgICB0bXAxID0gbWItPnRvdGFsQ29lZmZbNF07Ci0gICAgICAgICAgICB0bXAyID0gbWItPnRvdGFsQ29lZmZbMV07Ci0gICAgICAgICAgICBiU1sxXVsxMV0gPSB0bXAzIHx8IHRtcDQgPyAyIDogMDsKLSAgICAgICAgICAgIHRtcDMgPSBtYi0+dG90YWxDb2VmZls2XTsKLSAgICAgICAgICAgIHRtcDQgPSBtYi0+dG90YWxDb2VmZlszXTsKLSAgICAgICAgICAgIGJTWzBdWzhdID0gdG1wMSB8fCB0bXAyID8gMiA6IDA7Ci0gICAgICAgICAgICB0bXAxID0gbWItPnRvdGFsQ29lZmZbMTJdOwotICAgICAgICAgICAgdG1wMiA9IG1iLT50b3RhbENvZWZmWzldOwotICAgICAgICAgICAgYlNbMF1bOV0gPSB0bXAzIHx8IHRtcDQgPyAyIDogMDsKLSAgICAgICAgICAgIHRtcDMgPSBtYi0+dG90YWxDb2VmZlsxNF07Ci0gICAgICAgICAgICB0bXA0ID0gbWItPnRvdGFsQ29lZmZbMTFdOwotICAgICAgICAgICAgYlNbMF1bMTBdID0gdG1wMSB8fCB0bXAyID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1swXVsxMV0gPSB0bXAzIHx8IHRtcDQgPyAyIDogMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIDE2eDggaW50ZXIgbWIgLT4gcmVmIGFkZHJlc3NlcyBhbmQgbW90aW9uIHZlY3RvcnMgY2FuIGJlIGRpZmZlcmVudAotICAgICAgICAgKiBvbmx5IGZvciB0aGUgbWlkZGxlIGhvcml6b250YWwgZWRnZSwgZm9yIHRoZSBvdGhlciB0b3AgZWRnZXMgaXQgaXMKLSAgICAgICAgICogZW5vdWdoIHRvIGNoZWNrIHdoZXRoZXIgdGhlIGJsb2NrcyBjb250YWluIGNvZWZmaWNpZW50cyBvciBub3QuIFRoZQotICAgICAgICAgKiBzYW1lIGFwcGxpZXMgdG8gYWxsIGludGVybmFsIGxlZnQgZWRnZXMuICovCi0gICAgICAgIGVsc2UgaWYgKG1iLT5tYlR5cGUgPT0gUF9MMF9MMF8xNng4KQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAxID0gKnBUbXArKzsKLSAgICAgICAgICAgIHRtcDIgPSAqcFRtcCsrOwotICAgICAgICAgICAgYlNbMV1bNF0gID0gKHRtcDEgJiAweDAwRkYwMEZGKSA/IDIgOiAwOyAvKiBbMl0gIHx8IFswXSAqLwotICAgICAgICAgICAgYlNbMV1bNV0gID0gKHRtcDEgJiAweEZGMDBGRjAwKSA/IDIgOiAwOyAvKiBbM10gIHx8IFsxXSAqLwotICAgICAgICAgICAgYlNbMF1bNF0gID0gKHRtcDEgJiAweDAwMDBGRkZGKSA/IDIgOiAwOyAvKiBbMV0gIHx8IFswXSAqLwotICAgICAgICAgICAgYlNbMF1bNV0gID0gKHRtcDEgJiAweEZGRkYwMDAwKSA/IDIgOiAwOyAvKiBbM10gIHx8IFsyXSAqLwotICAgICAgICAgICAgdG1wMSA9ICpwVG1wKys7Ci0gICAgICAgICAgICBiU1sxXVs2XSAgPSAodG1wMiAmIDB4MDBGRjAwRkYpID8gMiA6IDA7IC8qIFs2XSAgfHwgWzRdICovCi0gICAgICAgICAgICBiU1sxXVs3XSAgPSAodG1wMiAmIDB4RkYwMEZGMDApID8gMiA6IDA7IC8qIFs3XSAgfHwgWzVdICovCi0gICAgICAgICAgICBiU1swXVsxMl0gPSAodG1wMiAmIDB4MDAwMEZGRkYpID8gMiA6IDA7IC8qIFs1XSAgfHwgWzRdICovCi0gICAgICAgICAgICBiU1swXVsxM10gPSAodG1wMiAmIDB4RkZGRjAwMDApID8gMiA6IDA7IC8qIFs3XSAgfHwgWzZdICovCi0gICAgICAgICAgICB0bXAyID0gKnBUbXA7Ci0gICAgICAgICAgICBiU1sxXVsxMl0gPSAodG1wMSAmIDB4MDBGRjAwRkYpID8gMiA6IDA7IC8qIFsxMF0gfHwgWzhdICovCi0gICAgICAgICAgICBiU1sxXVsxM10gPSAodG1wMSAmIDB4RkYwMEZGMDApID8gMiA6IDA7IC8qIFsxMV0gfHwgWzldICovCi0gICAgICAgICAgICBiU1swXVs2XSAgPSAodG1wMSAmIDB4MDAwMEZGRkYpID8gMiA6IDA7IC8qIFs5XSAgfHwgWzhdICovCi0gICAgICAgICAgICBiU1swXVs3XSAgPSAodG1wMSAmIDB4RkZGRjAwMDApID8gMiA6IDA7IC8qIFsxMV0gfHwgWzEwXSAqLwotCi0gICAgICAgICAgICBiU1sxXVsxNF0gPSAodG1wMiAmIDB4MDBGRjAwRkYpID8gMiA6IDA7IC8qIFsxNF0gfHwgWzEyXSAqLwotICAgICAgICAgICAgYlNbMV1bMTVdID0gKHRtcDIgJiAweEZGMDBGRjAwKSA/IDIgOiAwOyAvKiBbMTVdIHx8IFsxM10gKi8KLSAgICAgICAgICAgIGJTWzBdWzE0XSA9ICh0bXAyICYgMHgwMDAwRkZGRikgPyAyIDogMDsgLyogWzEzXSB8fCBbMTJdICovCi0gICAgICAgICAgICBiU1swXVsxNV0gPSAodG1wMiAmIDB4RkZGRjAwMDApID8gMiA6IDA7IC8qIFsxNV0gfHwgWzE0XSAqLwotCi0gICAgICAgICAgICBiU1sxXVs4XSA9ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDgsIDIpOwotICAgICAgICAgICAgYlNbMV1bOV0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCA5LCAzKTsKLSAgICAgICAgICAgIGJTWzFdWzEwXSA9ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDEyLCA2KTsKLSAgICAgICAgICAgIGJTWzFdWzExXSA9ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDEzLCA3KTsKLQotICAgICAgICAgICAgewotICAgICAgICAgICAgdTMyIHRtcDMsIHRtcDQ7Ci0KLSAgICAgICAgICAgIHRtcDEgPSBtYi0+dG90YWxDb2VmZls0XTsKLSAgICAgICAgICAgIHRtcDIgPSBtYi0+dG90YWxDb2VmZlsxXTsKLSAgICAgICAgICAgIHRtcDMgPSBtYi0+dG90YWxDb2VmZls2XTsKLSAgICAgICAgICAgIHRtcDQgPSBtYi0+dG90YWxDb2VmZlszXTsKLSAgICAgICAgICAgIGJTWzBdWzhdID0gdG1wMSB8fCB0bXAyID8gMiA6IDA7Ci0gICAgICAgICAgICB0bXAxID0gbWItPnRvdGFsQ29lZmZbMTJdOwotICAgICAgICAgICAgdG1wMiA9IG1iLT50b3RhbENvZWZmWzldOwotICAgICAgICAgICAgYlNbMF1bOV0gPSB0bXAzIHx8IHRtcDQgPyAyIDogMDsKLSAgICAgICAgICAgIHRtcDMgPSBtYi0+dG90YWxDb2VmZlsxNF07Ci0gICAgICAgICAgICB0bXA0ID0gbWItPnRvdGFsQ29lZmZbMTFdOwotICAgICAgICAgICAgYlNbMF1bMTBdID0gdG1wMSB8fCB0bXAyID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1swXVsxMV0gPSB0bXAzIHx8IHRtcDQgPyAyIDogMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKiA4eDE2IGludGVyIG1iIC0+IHJlZiBhZGRyZXNzZXMgYW5kIG1vdGlvbiB2ZWN0b3JzIGNhbiBiZSBkaWZmZXJlbnQKLSAgICAgICAgICogb25seSBmb3IgdGhlIG1pZGRsZSB2ZXJ0aWNhbCBlZGdlLCBmb3IgdGhlIG90aGVyIGxlZnQgZWRnZXMgaXQgaXMKLSAgICAgICAgICogZW5vdWdoIHRvIGNoZWNrIHdoZXRoZXIgdGhlIGJsb2NrcyBjb250YWluIGNvZWZmaWNpZW50cyBvciBub3QuIFRoZQotICAgICAgICAgKiBzYW1lIGFwcGxpZXMgdG8gYWxsIGludGVybmFsIHRvcCBlZGdlcy4gKi8KLSAgICAgICAgZWxzZSBpZiAobWItPm1iVHlwZSA9PSBQX0wwX0wwXzh4MTYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcDEgPSAqcFRtcCsrOwotICAgICAgICAgICAgdG1wMiA9ICpwVG1wKys7Ci0gICAgICAgICAgICBiU1sxXVs0XSAgPSAodG1wMSAmIDB4MDBGRjAwRkYpID8gMiA6IDA7IC8qIFsyXSAgfHwgWzBdICovCi0gICAgICAgICAgICBiU1sxXVs1XSAgPSAodG1wMSAmIDB4RkYwMEZGMDApID8gMiA6IDA7IC8qIFszXSAgfHwgWzFdICovCi0gICAgICAgICAgICBiU1swXVs0XSAgPSAodG1wMSAmIDB4MDAwMEZGRkYpID8gMiA6IDA7IC8qIFsxXSAgfHwgWzBdICovCi0gICAgICAgICAgICBiU1swXVs1XSAgPSAodG1wMSAmIDB4RkZGRjAwMDApID8gMiA6IDA7IC8qIFszXSAgfHwgWzJdICovCi0gICAgICAgICAgICB0bXAxID0gKnBUbXArKzsKLSAgICAgICAgICAgIGJTWzFdWzZdICA9ICh0bXAyICYgMHgwMEZGMDBGRikgPyAyIDogMDsgLyogWzZdICB8fCBbNF0gKi8KLSAgICAgICAgICAgIGJTWzFdWzddICA9ICh0bXAyICYgMHhGRjAwRkYwMCkgPyAyIDogMDsgLyogWzddICB8fCBbNV0gKi8KLSAgICAgICAgICAgIGJTWzBdWzEyXSA9ICh0bXAyICYgMHgwMDAwRkZGRikgPyAyIDogMDsgLyogWzVdICB8fCBbNF0gKi8KLSAgICAgICAgICAgIGJTWzBdWzEzXSA9ICh0bXAyICYgMHhGRkZGMDAwMCkgPyAyIDogMDsgLyogWzddICB8fCBbNl0gKi8KLSAgICAgICAgICAgIHRtcDIgPSAqcFRtcDsKLSAgICAgICAgICAgIGJTWzFdWzEyXSA9ICh0bXAxICYgMHgwMEZGMDBGRikgPyAyIDogMDsgLyogWzEwXSB8fCBbOF0gKi8KLSAgICAgICAgICAgIGJTWzFdWzEzXSA9ICh0bXAxICYgMHhGRjAwRkYwMCkgPyAyIDogMDsgLyogWzExXSB8fCBbOV0gKi8KLSAgICAgICAgICAgIGJTWzBdWzZdICA9ICh0bXAxICYgMHgwMDAwRkZGRikgPyAyIDogMDsgLyogWzldICB8fCBbOF0gKi8KLSAgICAgICAgICAgIGJTWzBdWzddICA9ICh0bXAxICYgMHhGRkZGMDAwMCkgPyAyIDogMDsgLyogWzExXSB8fCBbMTBdICovCi0KLSAgICAgICAgICAgIGJTWzFdWzE0XSA9ICh0bXAyICYgMHgwMEZGMDBGRikgPyAyIDogMDsgLyogWzE0XSB8fCBbMTJdICovCi0gICAgICAgICAgICBiU1sxXVsxNV0gPSAodG1wMiAmIDB4RkYwMEZGMDApID8gMiA6IDA7IC8qIFsxNV0gfHwgWzEzXSAqLwotICAgICAgICAgICAgYlNbMF1bMTRdID0gKHRtcDIgJiAweDAwMDBGRkZGKSA/IDIgOiAwOyAvKiBbMTNdIHx8IFsxMl0gKi8KLSAgICAgICAgICAgIGJTWzBdWzE1XSA9ICh0bXAyICYgMHhGRkZGMDAwMCkgPyAyIDogMDsgLyogWzE1XSB8fCBbMTRdICovCi0KLSAgICAgICAgICAgIGJTWzBdWzhdID0gKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgNCwgMSk7Ci0gICAgICAgICAgICBiU1swXVs5XSA9ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDYsIDMpOwotICAgICAgICAgICAgYlNbMF1bMTBdID0gKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgMTIsIDkpOwotICAgICAgICAgICAgYlNbMF1bMTFdID0gKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgMTQsIDExKTsKLQotICAgICAgICAgICAgewotICAgICAgICAgICAgdTMyIHRtcDMsIHRtcDQ7Ci0KLSAgICAgICAgICAgIHRtcDEgPSBtYi0+dG90YWxDb2VmZls4XTsKLSAgICAgICAgICAgIHRtcDIgPSBtYi0+dG90YWxDb2VmZlsyXTsKLSAgICAgICAgICAgIHRtcDMgPSBtYi0+dG90YWxDb2VmZls5XTsKLSAgICAgICAgICAgIHRtcDQgPSBtYi0+dG90YWxDb2VmZlszXTsKLSAgICAgICAgICAgIGJTWzFdWzhdID0gdG1wMSB8fCB0bXAyID8gMiA6IDA7Ci0gICAgICAgICAgICB0bXAxID0gbWItPnRvdGFsQ29lZmZbMTJdOwotICAgICAgICAgICAgdG1wMiA9IG1iLT50b3RhbENvZWZmWzZdOwotICAgICAgICAgICAgYlNbMV1bOV0gPSB0bXAzIHx8IHRtcDQgPyAyIDogMDsKLSAgICAgICAgICAgIHRtcDMgPSBtYi0+dG90YWxDb2VmZlsxM107Ci0gICAgICAgICAgICB0bXA0ID0gbWItPnRvdGFsQ29lZmZbN107Ci0gICAgICAgICAgICBiU1sxXVsxMF0gPSB0bXAxIHx8IHRtcDIgPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzFdWzExXSA9IHRtcDMgfHwgdG1wNCA/IDIgOiAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdG1wMSA9ICpwVG1wKys7Ci0gICAgICAgICAgICBiU1sxXVs0XSA9ICh0bXAxICYgMHgwMEZGMDBGRikgPyAyIDogKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aDIobWIsIDIsIDApOwotICAgICAgICAgICAgYlNbMV1bNV0gPSAodG1wMSAmIDB4RkYwMEZGMDApID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCAzLCAxKTsKLSAgICAgICAgICAgIGJTWzBdWzRdID0gKHRtcDEgJiAweDAwMDBGRkZGKSA/IDIgOiAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMihtYiwgMSwgMCk7Ci0gICAgICAgICAgICBiU1swXVs1XSA9ICh0bXAxICYgMHhGRkZGMDAwMCkgPyAyIDogKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aDIobWIsIDMsIDIpOwotICAgICAgICAgICAgdG1wMSA9ICpwVG1wKys7Ci0gICAgICAgICAgICBiU1sxXVs2XSAgPSAodG1wMSAmIDB4MDBGRjAwRkYpID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCA2LCA0KTsKLSAgICAgICAgICAgIGJTWzFdWzddICA9ICh0bXAxICYgMHhGRjAwRkYwMCkgPyAyIDogKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aDIobWIsIDcsIDUpOwotICAgICAgICAgICAgYlNbMF1bMTJdID0gKHRtcDEgJiAweDAwMDBGRkZGKSA/IDIgOiAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMihtYiwgNSwgNCk7Ci0gICAgICAgICAgICBiU1swXVsxM10gPSAodG1wMSAmIDB4RkZGRjAwMDApID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCA3LCA2KTsKLSAgICAgICAgICAgIHRtcDEgPSAqcFRtcCsrOwotICAgICAgICAgICAgYlNbMV1bMTJdID0gKHRtcDEgJiAweDAwRkYwMEZGKSA/IDIgOiAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMihtYiwgMTAsIDgpOwotICAgICAgICAgICAgYlNbMV1bMTNdID0gKHRtcDEgJiAweEZGMDBGRjAwKSA/IDIgOiAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMihtYiwgMTEsIDkpOwotICAgICAgICAgICAgYlNbMF1bNl0gID0gKHRtcDEgJiAweDAwMDBGRkZGKSA/IDIgOiAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMihtYiwgOSwgOCk7Ci0gICAgICAgICAgICBiU1swXVs3XSAgPSAodG1wMSAmIDB4RkZGRjAwMDApID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCAxMSwgMTApOwotICAgICAgICAgICAgdG1wMSA9ICpwVG1wOwotICAgICAgICAgICAgYlNbMV1bMTRdID0gKHRtcDEgJiAweDAwRkYwMEZGKSA/IDIgOiAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMihtYiwgMTQsIDEyKTsKLSAgICAgICAgICAgIGJTWzFdWzE1XSA9ICh0bXAxICYgMHhGRjAwRkYwMCkgPyAyIDogKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aDIobWIsIDE1LCAxMyk7Ci0gICAgICAgICAgICBiU1swXVsxNF0gPSAodG1wMSAmIDB4MDAwMEZGRkYpID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCAxMywgMTIpOwotICAgICAgICAgICAgYlNbMF1bMTVdID0gKHRtcDEgJiAweEZGRkYwMDAwKSA/IDIgOiAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMihtYiwgMTUsIDE0KTsKLQotICAgICAgICAgICAgYlNbMV1bOF0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCA4LCAyKTsKLSAgICAgICAgICAgIGJTWzFdWzldID0gKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgOSwgMyk7Ci0gICAgICAgICAgICBiU1sxXVsxMF0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCAxMiwgNik7Ci0gICAgICAgICAgICBiU1sxXVsxMV0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCAxMywgNyk7Ci0KLSAgICAgICAgICAgIGJTWzBdWzhdID0gKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgNCwgMSk7Ci0gICAgICAgICAgICBiU1swXVs5XSA9ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDYsIDMpOwotICAgICAgICAgICAgYlNbMF1bMTBdID0gKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgMTIsIDkpOwotICAgICAgICAgICAgYlNbMF1bMTFdID0gKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgMTQsIDExKTsKLSAgICAgICAgfQotICAgICAgICBwVG1wID0gKHUzMiopJmJTWzBdWzBdOwotICAgICAgICBpZiAoIW5vblplcm9CcyAmJiAocFRtcFsxXSB8fCBwVG1wWzJdIHx8IHBUbXBbM10gfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUbXBbNV0gfHwgcFRtcFs2XSB8fCBwVG1wWzddKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5vblplcm9CcyA9IEhBTlRST19UUlVFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuKG5vblplcm9Ccyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBHZXRMdW1hRWRnZVRocmVzaG9sZHMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgQ29tcHV0ZSBhbHBoYSwgYmV0YSBhbmQgdGMwIHRocmVzaG9sZHMgZm9yIGlubmVyLCBsZWZ0IGFuZCB0b3AKLSAgICAgICAgICAgIGx1bWEgZWRnZXMgb2YgYSBtYWNyb2Jsb2NrLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBHZXRMdW1hRWRnZVRocmVzaG9sZHMoCi0gICAgbWJTdG9yYWdlX3QgKm1iLAotICAgIHU4ICgqYWxwaGEpWzJdLAotICAgIHU4ICgqYmV0YSlbMl0sCi0gICAgdTggKCp0aHJlc2hvbGQpWzE2XSwKLSAgICB1OCAoKmJzKVsxNl0sCi0gICAgdTMyIGZpbHRlcmluZ0ZsYWdzICkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaW5kZXhBLCBpbmRleEI7Ci0gICAgdTMyIHFwQXYsIHFwLCBxcFRtcDsKLSAgICB1MzIgaTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHRocmVzaG9sZCk7Ci0gICAgQVNTRVJUKGJzKTsKLSAgICBBU1NFUlQoYmV0YSk7Ci0gICAgQVNTRVJUKGFscGhhKTsKLSAgICBBU1NFUlQobWIpOwotCi0gICAgcXAgPSBtYi0+cXBZOwotCi0gICAgaW5kZXhBID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcCArIG1iLT5maWx0ZXJPZmZzZXRBKTsKLSAgICBpbmRleEIgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwICsgbWItPmZpbHRlck9mZnNldEIpOwotCi0gICAgLyogSW50ZXJuYWwgZWRnZSB2YWx1ZXMgKi8KLSAgICBhbHBoYVswXVsxXSA9IGFscGhhc1tpbmRleEFdOwotICAgIGFscGhhWzFdWzFdID0gYWxwaGFzW2luZGV4QV07Ci0gICAgYWxwaGFbMV1bMF0gPSBhbHBoYXNbaW5kZXhBXTsKLSAgICBhbHBoYVswXVswXSA9IGFscGhhc1tpbmRleEFdOwotICAgIGJldGFbMF1bMV0gPSBiZXRhc1tpbmRleEJdOwotICAgIGJldGFbMV1bMV0gPSBiZXRhc1tpbmRleEJdOwotICAgIGJldGFbMV1bMF0gPSBiZXRhc1tpbmRleEJdOwotICAgIGJldGFbMF1bMF0gPSBiZXRhc1tpbmRleEJdOwotCi0gICAgLyogdmVydGljYWwgc2NhbiBvcmRlciAqLwotICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCi0gICAgewotICAgICAgICB1MzIgdDEsIHQyOwotCi0gICAgICAgIHQxID0gYnNbaV1bMF07Ci0gICAgICAgIHQyID0gYnNbaV1bMV07Ci0gICAgICAgIHRocmVzaG9sZFtpXVswXSAgPSAodDEpID8gdGMwW2luZGV4QV1bdDFdIDogMDsKLSAgICAgICAgdDEgPSBic1tpXVsyXTsKLSAgICAgICAgdGhyZXNob2xkW2ldWzFdICA9ICh0MikgPyB0YzBbaW5kZXhBXVt0Ml0gOiAwOwotICAgICAgICB0MiA9IGJzW2ldWzNdOwotICAgICAgICB0aHJlc2hvbGRbaV1bMl0gID0gKHQxKSA/IHRjMFtpbmRleEFdW3QxXSA6IDA7Ci0gICAgICAgIHQxID0gYnNbaV1bNF07Ci0gICAgICAgIHRocmVzaG9sZFtpXVszXSAgPSAodDIpID8gdGMwW2luZGV4QV1bdDJdIDogMDsKLSAgICAgICAgdDIgPSBic1tpXVs1XTsKLSAgICAgICAgdGhyZXNob2xkW2ldWzRdICA9ICh0MSkgPyB0YzBbaW5kZXhBXVt0MV0gOiAwOwotICAgICAgICB0MSA9IGJzW2ldWzZdOwotICAgICAgICB0aHJlc2hvbGRbaV1bNV0gID0gKHQyKSA/IHRjMFtpbmRleEFdW3QyXSA6IDA7Ci0gICAgICAgIHQyID0gYnNbaV1bN107Ci0gICAgICAgIHRocmVzaG9sZFtpXVs2XSAgPSAodDEpID8gdGMwW2luZGV4QV1bdDFdIDogMDsKLSAgICAgICAgdDEgPSBic1tpXVs4XTsKLSAgICAgICAgdGhyZXNob2xkW2ldWzddICA9ICh0MikgPyB0YzBbaW5kZXhBXVt0Ml0gOiAwOwotICAgICAgICB0MiA9IGJzW2ldWzldOwotICAgICAgICB0aHJlc2hvbGRbaV1bOF0gID0gKHQxKSA/IHRjMFtpbmRleEFdW3QxXSA6IDA7Ci0gICAgICAgIHQxID0gYnNbaV1bMTBdOwotICAgICAgICB0aHJlc2hvbGRbaV1bOV0gID0gKHQyKSA/IHRjMFtpbmRleEFdW3QyXSA6IDA7Ci0gICAgICAgIHQyID0gYnNbaV1bMTFdOwotICAgICAgICB0aHJlc2hvbGRbaV1bMTBdID0gKHQxKSA/IHRjMFtpbmRleEFdW3QxXSA6IDA7Ci0gICAgICAgIHQxID0gYnNbaV1bMTJdOwotICAgICAgICB0aHJlc2hvbGRbaV1bMTFdID0gKHQyKSA/IHRjMFtpbmRleEFdW3QyXSA6IDA7Ci0gICAgICAgIHQyID0gYnNbaV1bMTNdOwotICAgICAgICB0aHJlc2hvbGRbaV1bMTJdID0gKHQxKSA/IHRjMFtpbmRleEFdW3QxXSA6IDA7Ci0gICAgICAgIHQxID0gYnNbaV1bMTRdOwotICAgICAgICB0aHJlc2hvbGRbaV1bMTNdID0gKHQyKSA/IHRjMFtpbmRleEFdW3QyXSA6IDA7Ci0gICAgICAgIHQyID0gYnNbaV1bMTVdOwotICAgICAgICB0aHJlc2hvbGRbaV1bMTRdID0gKHQxKSA/IHRjMFtpbmRleEFdW3QxXSA6IDA7Ci0gICAgICAgIHRocmVzaG9sZFtpXVsxNV0gPSAodDIpID8gdGMwW2luZGV4QV1bdDJdIDogMDsKLSAgICB9Ci0KLSAgICBpZiAoZmlsdGVyaW5nRmxhZ3MgJiBGSUxURVJfVE9QX0VER0UpCi0gICAgewotICAgICAgICBxcFRtcCA9IG1iLT5tYkItPnFwWTsKLSAgICAgICAgaWYgKHFwVG1wICE9IHFwKQotICAgICAgICB7Ci0gICAgICAgICAgICB1MzIgdDEsIHQyLCB0MywgdDQ7Ci0gICAgICAgICAgICBxcEF2ID0gKHFwICsgcXBUbXAgKyAxKSA+PiAxOwotCi0gICAgICAgICAgICBpbmRleEEgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwQXYgKyBtYi0+ZmlsdGVyT2Zmc2V0QSk7Ci0gICAgICAgICAgICBpbmRleEIgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwQXYgKyBtYi0+ZmlsdGVyT2Zmc2V0Qik7Ci0KLSAgICAgICAgICAgIGFscGhhWzFdWzBdID0gYWxwaGFzW2luZGV4QV07Ci0gICAgICAgICAgICBiZXRhWzFdWzBdID0gYmV0YXNbaW5kZXhCXTsKLSAgICAgICAgICAgIHQxID0gYnNbMV1bMF07Ci0gICAgICAgICAgICB0MiA9IGJzWzFdWzFdOwotICAgICAgICAgICAgdDMgPSBic1sxXVsyXTsKLSAgICAgICAgICAgIHQ0ID0gYnNbMV1bM107Ci0gICAgICAgICAgICB0aHJlc2hvbGRbMV1bMF0gPSAodDEgJiYgKHQxIDwgNCkpID8gdGMwW2luZGV4QV1bdDFdIDogMDsKLSAgICAgICAgICAgIHRocmVzaG9sZFsxXVsxXSA9ICh0MiAmJiAodDIgPCA0KSkgPyB0YzBbaW5kZXhBXVt0Ml0gOiAwOwotICAgICAgICAgICAgdGhyZXNob2xkWzFdWzJdID0gKHQzICYmICh0MyA8IDQpKSA/IHRjMFtpbmRleEFdW3QzXSA6IDA7Ci0gICAgICAgICAgICB0aHJlc2hvbGRbMV1bM10gPSAodDQgJiYgKHQ0IDwgNCkpID8gdGMwW2luZGV4QV1bdDRdIDogMDsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoZmlsdGVyaW5nRmxhZ3MgJiBGSUxURVJfTEVGVF9FREdFKQotICAgIHsKLSAgICAgICAgcXBUbXAgPSBtYi0+bWJBLT5xcFk7Ci0gICAgICAgIGlmIChxcFRtcCAhPSBxcCkKLSAgICAgICAgewotICAgICAgICAgICAgcXBBdiA9IChxcCArIHFwVG1wICsgMSkgPj4gMTsKLQotICAgICAgICAgICAgaW5kZXhBID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcEF2ICsgbWItPmZpbHRlck9mZnNldEEpOwotICAgICAgICAgICAgaW5kZXhCID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcEF2ICsgbWItPmZpbHRlck9mZnNldEIpOwotCi0gICAgICAgICAgICBhbHBoYVswXVswXSA9IGFscGhhc1tpbmRleEFdOwotICAgICAgICAgICAgYmV0YVswXVswXSA9IGJldGFzW2luZGV4Ql07Ci0gICAgICAgICAgICB0aHJlc2hvbGRbMF1bMF0gPSAoYnNbMF1bMF0gJiYgKGJzWzBdWzBdIDwgNCkpID8gdGMwW2luZGV4QV1bYnNbMF1bMF1dIDogMDsKLSAgICAgICAgICAgIHRocmVzaG9sZFswXVsxXSA9IChic1swXVsxXSAmJiAoYnNbMF1bMV0gPCA0KSkgPyB0YzBbaW5kZXhBXVtic1swXVsxXV0gOiAwOwotICAgICAgICAgICAgdGhyZXNob2xkWzBdWzJdID0gKGJzWzBdWzJdICYmIChic1swXVsyXSA8IDQpKSA/IHRjMFtpbmRleEFdW2JzWzBdWzJdXSA6IDA7Ci0gICAgICAgICAgICB0aHJlc2hvbGRbMF1bM10gPSAoYnNbMF1bM10gJiYgKGJzWzBdWzNdIDwgNCkpID8gdGMwW2luZGV4QV1bYnNbMF1bM11dIDogMDsKLSAgICAgICAgfQotICAgIH0KLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEdldENocm9tYUVkZ2VUaHJlc2hvbGRzCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIENvbXB1dGUgYWxwaGEsIGJldGEgYW5kIHRjMCB0aHJlc2hvbGRzIGZvciBpbm5lciwgbGVmdCBhbmQgdG9wCi0gICAgICAgICAgICBjaHJvbWEgZWRnZXMgb2YgYSBtYWNyb2Jsb2NrLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBHZXRDaHJvbWFFZGdlVGhyZXNob2xkcygKLSAgICBtYlN0b3JhZ2VfdCAqbWIsCi0gICAgdTggKCphbHBoYSlbMl0sCi0gICAgdTggKCpiZXRhKVsyXSwKLSAgICB1OCAoKnRocmVzaG9sZClbOF0sCi0gICAgdTggKCpicylbMTZdLAotICAgIHUzMiBmaWx0ZXJpbmdGbGFncywKLSAgICBpMzIgY2hyb21hUXBJbmRleE9mZnNldCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaW5kZXhBLCBpbmRleEI7Ci0gICAgdTMyIHFwQXYsIHFwLCBxcFRtcDsKLSAgICB1MzIgaTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHRocmVzaG9sZCk7Ci0gICAgQVNTRVJUKGJzKTsKLSAgICBBU1NFUlQoYmV0YSk7Ci0gICAgQVNTRVJUKGFscGhhKTsKLSAgICBBU1NFUlQobWIpOwotICAgIEFTU0VSVChtYik7Ci0KLSAgICBxcCA9IG1iLT5xcFk7Ci0gICAgcXAgPSBoMjY0YnNkUXBDW0NMSVAzKDAsIDUxLCAoaTMyKXFwICsgY2hyb21hUXBJbmRleE9mZnNldCldOwotCi0gICAgaW5kZXhBID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcCArIG1iLT5maWx0ZXJPZmZzZXRBKTsKLSAgICBpbmRleEIgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwICsgbWItPmZpbHRlck9mZnNldEIpOwotCi0gICAgYWxwaGFbMF1bMV0gPSBhbHBoYXNbaW5kZXhBXTsKLSAgICBhbHBoYVsxXVsxXSA9IGFscGhhc1tpbmRleEFdOwotICAgIGFscGhhWzFdWzBdID0gYWxwaGFzW2luZGV4QV07Ci0gICAgYWxwaGFbMF1bMF0gPSBhbHBoYXNbaW5kZXhBXTsKLSAgICBiZXRhWzBdWzFdID0gYmV0YXNbaW5kZXhCXTsKLSAgICBiZXRhWzFdWzFdID0gYmV0YXNbaW5kZXhCXTsKLSAgICBiZXRhWzFdWzBdID0gYmV0YXNbaW5kZXhCXTsKLSAgICBiZXRhWzBdWzBdID0gYmV0YXNbaW5kZXhCXTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCi0gICAgewotICAgICAgICB1MzIgdDEsIHQyOwotCi0gICAgICAgIHQxID0gYnNbaV1bMF07Ci0gICAgICAgIHQyID0gYnNbaV1bMV07Ci0gICAgICAgIHRocmVzaG9sZFtpXVswXSAgPSAodDEpID8gdGMwW2luZGV4QV1bdDFdIDogMDsKLSAgICAgICAgdDEgPSBic1tpXVsyXTsKLSAgICAgICAgdGhyZXNob2xkW2ldWzFdICA9ICh0MikgPyB0YzBbaW5kZXhBXVt0Ml0gOiAwOwotICAgICAgICB0MiA9IGJzW2ldWzNdOwotICAgICAgICB0aHJlc2hvbGRbaV1bMl0gID0gKHQxKSA/IHRjMFtpbmRleEFdW3QxXSA6IDA7Ci0gICAgICAgIHQxID0gYnNbaV1bOF07Ci0gICAgICAgIHRocmVzaG9sZFtpXVszXSAgPSAodDIpID8gdGMwW2luZGV4QV1bdDJdIDogMDsKLSAgICAgICAgdDIgPSBic1tpXVs5XTsKLSAgICAgICAgdGhyZXNob2xkW2ldWzRdICA9ICh0MSkgPyB0YzBbaW5kZXhBXVt0MV0gOiAwOwotICAgICAgICB0MSA9IGJzW2ldWzEwXTsKLSAgICAgICAgdGhyZXNob2xkW2ldWzVdICA9ICh0MikgPyB0YzBbaW5kZXhBXVt0Ml0gOiAwOwotICAgICAgICB0MiA9IGJzW2ldWzExXTsKLSAgICAgICAgdGhyZXNob2xkW2ldWzZdICA9ICh0MSkgPyB0YzBbaW5kZXhBXVt0MV0gOiAwOwotICAgICAgICB0aHJlc2hvbGRbaV1bN10gID0gKHQyKSA/IHRjMFtpbmRleEFdW3QyXSA6IDA7Ci0gICAgfQotCi0gICAgaWYgKGZpbHRlcmluZ0ZsYWdzICYgRklMVEVSX1RPUF9FREdFKQotICAgIHsKLSAgICAgICAgcXBUbXAgPSBtYi0+bWJCLT5xcFk7Ci0gICAgICAgIGlmIChxcFRtcCAhPSBtYi0+cXBZKQotICAgICAgICB7Ci0gICAgICAgICAgICB1MzIgdDEsIHQyLCB0MywgdDQ7Ci0gICAgICAgICAgICBxcFRtcCA9IGgyNjRic2RRcENbQ0xJUDMoMCwgNTEsIChpMzIpcXBUbXAgKyBjaHJvbWFRcEluZGV4T2Zmc2V0KV07Ci0gICAgICAgICAgICBxcEF2ID0gKHFwICsgcXBUbXAgKyAxKSA+PiAxOwotCi0gICAgICAgICAgICBpbmRleEEgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwQXYgKyBtYi0+ZmlsdGVyT2Zmc2V0QSk7Ci0gICAgICAgICAgICBpbmRleEIgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwQXYgKyBtYi0+ZmlsdGVyT2Zmc2V0Qik7Ci0KLSAgICAgICAgICAgIGFscGhhWzFdWzBdID0gYWxwaGFzW2luZGV4QV07Ci0gICAgICAgICAgICBiZXRhWzFdWzBdID0gYmV0YXNbaW5kZXhCXTsKLQotICAgICAgICAgICAgdDEgPSBic1sxXVswXTsKLSAgICAgICAgICAgIHQyID0gYnNbMV1bMV07Ci0gICAgICAgICAgICB0MyA9IGJzWzFdWzJdOwotICAgICAgICAgICAgdDQgPSBic1sxXVszXTsKLSAgICAgICAgICAgIHRocmVzaG9sZFsxXVswXSA9ICh0MSkgPyB0YzBbaW5kZXhBXVt0MV0gOiAwOwotICAgICAgICAgICAgdGhyZXNob2xkWzFdWzFdID0gKHQyKSA/IHRjMFtpbmRleEFdW3QyXSA6IDA7Ci0gICAgICAgICAgICB0aHJlc2hvbGRbMV1bMl0gPSAodDMpID8gdGMwW2luZGV4QV1bdDNdIDogMDsKLSAgICAgICAgICAgIHRocmVzaG9sZFsxXVszXSA9ICh0NCkgPyB0YzBbaW5kZXhBXVt0NF0gOiAwOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChmaWx0ZXJpbmdGbGFncyAmIEZJTFRFUl9MRUZUX0VER0UpCi0gICAgewotICAgICAgICBxcFRtcCA9IG1iLT5tYkEtPnFwWTsKLSAgICAgICAgaWYgKHFwVG1wICE9IG1iLT5xcFkpCi0gICAgICAgIHsKLQotICAgICAgICAgICAgcXBUbXAgPSBoMjY0YnNkUXBDW0NMSVAzKDAsIDUxLCAoaTMyKXFwVG1wICsgY2hyb21hUXBJbmRleE9mZnNldCldOwotICAgICAgICAgICAgcXBBdiA9IChxcCArIHFwVG1wICsgMSkgPj4gMTsKLQotICAgICAgICAgICAgaW5kZXhBID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcEF2ICsgbWItPmZpbHRlck9mZnNldEEpOwotICAgICAgICAgICAgaW5kZXhCID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcEF2ICsgbWItPmZpbHRlck9mZnNldEIpOwotCi0gICAgICAgICAgICBhbHBoYVswXVswXSA9IGFscGhhc1tpbmRleEFdOwotICAgICAgICAgICAgYmV0YVswXVswXSA9IGJldGFzW2luZGV4Ql07Ci0gICAgICAgICAgICB0aHJlc2hvbGRbMF1bMF0gPSAoYnNbMF1bMF0pID8gdGMwW2luZGV4QV1bYnNbMF1bMF1dIDogMDsKLSAgICAgICAgICAgIHRocmVzaG9sZFswXVsxXSA9IChic1swXVsxXSkgPyB0YzBbaW5kZXhBXVtic1swXVsxXV0gOiAwOwotICAgICAgICAgICAgdGhyZXNob2xkWzBdWzJdID0gKGJzWzBdWzJdKSA/IHRjMFtpbmRleEFdW2JzWzBdWzJdXSA6IDA7Ci0gICAgICAgICAgICB0aHJlc2hvbGRbMF1bM10gPSAoYnNbMF1bM10pID8gdGMwW2luZGV4QV1bYnNbMF1bM11dIDogMDsKLSAgICAgICAgfQotICAgIH0KLQotfQotCi0jZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLwotCi0vKmxpbnQgK2U3MDEgK2U3MDIgKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RlYmxvY2tpbmcuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kZWJsb2NraW5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NzFkZGEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RlYmxvY2tpbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0gICAgMy4gRGF0YSB0eXBlcwotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBIMjY0U1dERUNfREVCTE9DS0lOR19ICi0jZGVmaW5lIEgyNjRTV0RFQ19ERUJMT0NLSU5HX0gKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2RfaW1hZ2UuaCIKLSNpbmNsdWRlICJoMjY0YnNkX21hY3JvYmxvY2tfbGF5ZXIuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBEYXRhIHR5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgaDI2NGJzZEZpbHRlclBpY3R1cmUoCi0gIGltYWdlX3QgKmltYWdlLAotICBtYlN0b3JhZ2VfdCAqbWIpOwotCi0jZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19ERUJMT0NLSU5HX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RlY29kZXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kZWNvZGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYzQ4MGYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RlY29kZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDk2MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0gICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0gICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgICAgNS4gRnVuY3Rpb25zCi0gICAgICAgICAgaDI2NGJzZEluaXQKLSAgICAgICAgICBoMjY0YnNkRGVjb2RlCi0gICAgICAgICAgaDI2NGJzZFNodXRkb3duCi0gICAgICAgICAgaDI2NGJzZEN1cnJlbnRJbWFnZQotICAgICAgICAgIGgyNjRic2ROZXh0T3V0cHV0UGljdHVyZQotICAgICAgICAgIGgyNjRic2RQaWNXaWR0aAotICAgICAgICAgIGgyNjRic2RQaWNIZWlnaHQKLSAgICAgICAgICBoMjY0YnNkRmx1c2hCdWZmZXIKLSAgICAgICAgICBoMjY0YnNkQ2hlY2tWYWxpZFBhcmFtU2V0cwotICAgICAgICAgIGgyNjRic2RWaWRlb1JhbmdlCi0gICAgICAgICAgaDI2NGJzZE1hdHJpeENvZWZmaWNpZW50cwotICAgICAgICAgIGgyNjRic2RDcm9wcGluZ1BhcmFtcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImgyNjRic2RfZGVjb2Rlci5oIgotI2luY2x1ZGUgImgyNjRic2RfbmFsX3VuaXQuaCIKLSNpbmNsdWRlICJoMjY0YnNkX2J5dGVfc3RyZWFtLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zZXFfcGFyYW1fc2V0LmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9waWNfcGFyYW1fc2V0LmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zbGljZV9oZWFkZXIuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2RhdGEuaCIKLSNpbmNsdWRlICJoMjY0YnNkX25laWdoYm91ci5oIgotI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgotI2luY2x1ZGUgImgyNjRic2RfZHBiLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9kZWJsb2NraW5nLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9jb25jZWFsLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uIG5hbWU6IGgyNjRic2RJbml0Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEluaXRpYWxpemUgdGhlIGRlY29kZXIuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgbm9PdXRwdXRSZW9yZGVyaW5nICBmbGFnIHRvIGluZGljYXRlIHRoZSBkZWNvZGVyIHRoYXQgaXQgZG9lcyBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZSB0byBwZXJmb3JtIHJlb3JkZXJpbmcgb2YgZGlzcGxheSBpbWFnZXMuCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIHBTdG9yYWdlICAgICAgICAgICAgcG9pbnRlciB0byBpbml0aWFsaXplZCBzdG9yYWdlIHN0cnVjdHVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBub25lCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkSW5pdChzdG9yYWdlX3QgKnBTdG9yYWdlLCB1MzIgbm9PdXRwdXRSZW9yZGVyaW5nKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLSAgICB1MzIgc2l6ZTsKLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RvcmFnZSk7Ci0KLSAgICBoMjY0YnNkSW5pdFN0b3JhZ2UocFN0b3JhZ2UpOwotCi0gICAgLyogYWxsb2NhdGUgbWJMYXllciB0byBiZSBuZXh0IG11bHRpcGxlIG9mIDY0IHRvIGVuYWJsZSB1c2Ugb2YKLSAgICAgKiBzcGVjaWZpYyBORU9OIG9wdGltaXplZCAibWVtc2V0IiBmb3IgY2xlYXJpbmcgdGhlIHN0cnVjdHVyZSAqLwotICAgIHNpemUgPSAoc2l6ZW9mKG1hY3JvYmxvY2tMYXllcl90KSArIDYzKSAmIH4weDNGOwotCi0gICAgcFN0b3JhZ2UtPm1iTGF5ZXIgPSAobWFjcm9ibG9ja0xheWVyX3QqKUgyNjRTd0RlY01hbGxvYyhzaXplLCAxKTsKLSAgICBpZiAoIXBTdG9yYWdlLT5tYkxheWVyKQotICAgICAgICByZXR1cm4gSEFOVFJPX05PSzsKLQotICAgIGlmIChub091dHB1dFJlb3JkZXJpbmcpCi0gICAgICAgIHBTdG9yYWdlLT5ub1Jlb3JkZXJpbmcgPSBIQU5UUk9fVFJVRTsKLQotICAgIHJldHVybiBIQU5UUk9fT0s7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZERlY29kZQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBEZWNvZGUgYSBOQUwgdW5pdC4gVGhpcyBmdW5jdGlvbiBjYWxscyBvdGhlciBtb2R1bGVzIHRvIHBlcmZvcm0KLSAgICAgICAgICAgIHRhc2tzIGxpa2UKLSAgICAgICAgICAgICAgICAqIGV4dHJhY3QgYW5kIGRlY29kZSBOQUwgdW5pdCBmcm9tIHRoZSBieXRlIHN0cmVhbQotICAgICAgICAgICAgICAgICogZGVjb2RlIHBhcmFtZXRlciBzZXRzCi0gICAgICAgICAgICAgICAgKiBkZWNvZGUgc2xpY2UgaGVhZGVyIGFuZCBzbGljZSBkYXRhCi0gICAgICAgICAgICAgICAgKiBjb25jZWFsIGVycm9ycyBpbiB0aGUgcGljdHVyZQotICAgICAgICAgICAgICAgICogcGVyZm9ybSBkZWJsb2NraW5nIGZpbHRlcmluZwotCi0gICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGNvbnRhaW5zIHRvcCBsZXZlbCBjb250cm9sIGxvZ2ljIG9mIHRoZSBkZWNvZGVyLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdG9yYWdlICAgICAgICBwb2ludGVyIHRvIHN0b3JhZ2UgZGF0YSBzdHJ1Y3R1cmUKLSAgICAgICAgICAgIGJ5dGVTdHJtICAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBidWZmZXIgZ2l2ZW4gYnkgYXBwbGljYXRpb24KLSAgICAgICAgICAgIGxlbiAgICAgICAgICAgICBsZW5ndGggb2YgdGhlIGJ1ZmZlciBpbiBieXRlcwotICAgICAgICAgICAgcGljSWQgICAgICAgICAgIGlkZW50aWZpZXIgZm9yIGEgcGljdHVyZSwgYXNzaWduZWQgYnkgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24KLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgcmVhZEJ5dGVzICAgICAgIG51bWJlciBvZiBieXRlcyByZWFkIGZyb20gdGhlIHN0cmVhbSBpcyBzdG9yZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEgyNjRCU0RfUkRZICAgICAgICAgICAgIGRlY29kaW5nIGZpbmlzaGVkLCBub3RoaW5nIHNwZWNpYWwKLSAgICAgICAgICAgIEgyNjRCU0RfUElDX1JEWSAgICAgICAgIGRlY29kaW5nIG9mIGEgcGljdHVyZSBmaW5pc2hlZAotICAgICAgICAgICAgSDI2NEJTRF9IRFJTX1JEWSAgICAgICAgcGFyYW0gc2V0cyBhY3RpdmF0ZWQsIGluZm9ybWF0aW9uIGxpa2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUgZGltZW5zaW9ucyBldGMgY2FuIGJlIHJlYWQKLSAgICAgICAgICAgIEgyNjRCU0RfRVJST1IgICAgICAgICAgIGVycm9yIGluIGRlY29kaW5nCi0gICAgICAgICAgICBIMjY0QlNEX1BBUkFNX1NFVF9FUlJPUiBzZXJpdXMgZXJyb3IgaW4gZGVjb2RpbmcsIGZhaWxlZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZhdGUgcGFyYW0gc2V0cwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZERlY29kZShzdG9yYWdlX3QgKnBTdG9yYWdlLCB1OCAqYnl0ZVN0cm0sIHUzMiBsZW4sIHUzMiBwaWNJZCwKLSAgICB1MzIgKnJlYWRCeXRlcykKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wLCBwcHNJZCwgc3BzSWQ7Ci0gICAgaTMyIHBpY09yZGVyQ250OwotICAgIG5hbFVuaXRfdCBuYWxVbml0OwotICAgIHNlcVBhcmFtU2V0X3Qgc2VxUGFyYW1TZXQ7Ci0gICAgcGljUGFyYW1TZXRfdCBwaWNQYXJhbVNldDsKLSAgICBzdHJtRGF0YV90IHN0cm07Ci0gICAgdTMyIGFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcgPSBIQU5UUk9fRkFMU0U7Ci0gICAgdTMyIHBpY1JlYWR5ID0gSEFOVFJPX0ZBTFNFOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0b3JhZ2UpOwotICAgIEFTU0VSVChieXRlU3RybSk7Ci0gICAgQVNTRVJUKGxlbik7Ci0gICAgQVNTRVJUKHJlYWRCeXRlcyk7Ci0KLSAgICAvKiBpZiBwcmV2aW91cyBidWZmZXIgd2FzIG5vdCBmaW5pc2hlZCBhbmQgc2FtZSBwb2ludGVyIGdpdmVuIC0+IHNraXAgTkFMCi0gICAgICogdW5pdCBleHRyYWN0aW9uICovCi0gICAgaWYgKHBTdG9yYWdlLT5wcmV2QnVmTm90RmluaXNoZWQgJiYgYnl0ZVN0cm0gPT0gcFN0b3JhZ2UtPnByZXZCdWZQb2ludGVyKQotICAgIHsKLSAgICAgICAgc3RybSA9IHBTdG9yYWdlLT5zdHJtWzBdOwotICAgICAgICBzdHJtLnBTdHJtQ3VyclBvcyA9IHN0cm0ucFN0cm1CdWZmU3RhcnQ7Ci0gICAgICAgIHN0cm0uc3RybUJ1ZmZSZWFkQml0cyA9IHN0cm0uYml0UG9zSW5Xb3JkID0gMDsKLSAgICAgICAgKnJlYWRCeXRlcyA9IHBTdG9yYWdlLT5wcmV2Qnl0ZXNDb25zdW1lZDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZEV4dHJhY3ROYWxVbml0KGJ5dGVTdHJtLCBsZW4sICZzdHJtLCByZWFkQnl0ZXMpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgewotICAgICAgICAgICAgRVBSSU5UKCJCWVRFX1NUUkVBTSIpOwotICAgICAgICAgICAgcmV0dXJuKEgyNjRCU0RfRVJST1IpOwotICAgICAgICB9Ci0gICAgICAgIC8qIHN0b3JlIHN0cmVhbSAqLwotICAgICAgICBwU3RvcmFnZS0+c3RybVswXSA9IHN0cm07Ci0gICAgICAgIHBTdG9yYWdlLT5wcmV2Qnl0ZXNDb25zdW1lZCA9ICpyZWFkQnl0ZXM7Ci0gICAgICAgIHBTdG9yYWdlLT5wcmV2QnVmUG9pbnRlciA9IGJ5dGVTdHJtOwotICAgIH0KLSAgICBwU3RvcmFnZS0+cHJldkJ1Zk5vdEZpbmlzaGVkID0gSEFOVFJPX0ZBTFNFOwotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZU5hbFVuaXQoJnN0cm0sICZuYWxVbml0KTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICB7Ci0gICAgICAgIEVQUklOVCgiTkFMX1VOSVQiKTsKLSAgICAgICAgcmV0dXJuKEgyNjRCU0RfRVJST1IpOwotICAgIH0KLQotICAgIC8qIERpc2NhcmQgdW5zcGVjaWZpZWQsIHJlc2VydmVkLCBTUFMgZXh0ZW5zaW9uIGFuZCBhdXhpbGlhcnkgcGljdHVyZSBzbGljZXMgKi8KLSAgICBpZihuYWxVbml0Lm5hbFVuaXRUeXBlID09IDAgfHwgbmFsVW5pdC5uYWxVbml0VHlwZSA+PSAxMykKLSAgICB7Ci0gICAgICAgIERFQlVHKCgiRElTQ0FSREVEIE5BTCAoVU5TUEVDSUZJRUQsIFJFR0lTVEVSRUQsIFNQUyBleHQgb3IgQVVYIHNsaWNlKVxuIikpOwotICAgICAgICByZXR1cm4oSDI2NEJTRF9SRFkpOwotICAgIH0KLQotICAgIHRtcCA9IGgyNjRic2RDaGVja0FjY2Vzc1VuaXRCb3VuZGFyeSgKLSAgICAgICZzdHJtLAotICAgICAgJm5hbFVuaXQsCi0gICAgICBwU3RvcmFnZSwKLSAgICAgICZhY2Nlc3NVbml0Qm91bmRhcnlGbGFnKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICB7Ci0gICAgICAgIEVQUklOVCgiQUNDRVNTIFVOSVQgQk9VTkRBUlkgQ0hFQ0siKTsKLSAgICAgICAgaWYgKHRtcCA9PSBQQVJBTV9TRVRfRVJST1IpCi0gICAgICAgICAgICByZXR1cm4oSDI2NEJTRF9QQVJBTV9TRVRfRVJST1IpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4oSDI2NEJTRF9FUlJPUik7Ci0gICAgfQotCi0gICAgaWYgKCBhY2Nlc3NVbml0Qm91bmRhcnlGbGFnICkKLSAgICB7Ci0gICAgICAgIERFQlVHKCgiQWNjZXNzIHVuaXQgYm91bmRhcnlcbiIpKTsKLSAgICAgICAgLyogY29uY2VhbCBpZiBwaWN0dXJlIHN0YXJ0ZWQgYW5kIHBhcmFtIHNldHMgYWN0aXZhdGVkICovCi0gICAgICAgIGlmIChwU3RvcmFnZS0+cGljU3RhcnRlZCAmJiBwU3RvcmFnZS0+YWN0aXZlU3BzICE9IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIERFQlVHKCgiQ09OQ0VBTElORy4uLiIpKTsKLQotICAgICAgICAgICAgLyogcmV0dXJuIGVycm9yIGlmIHNlY29uZCBwaGFzZSBvZgotICAgICAgICAgICAgICogaW5pdGlhbGl6YXRpb24gaXMgbm90IGNvbXBsZXRlZCAqLwotICAgICAgICAgICAgaWYgKHBTdG9yYWdlLT5wZW5kaW5nQWN0aXZhdGlvbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFUFJJTlQoIlBlbmRpbmcgYWN0aXZhdGlvbiBub3QgY29tcGxldGVkIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChIMjY0QlNEX0VSUk9SKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFwU3RvcmFnZS0+dmFsaWRTbGljZUluQWNjZXNzVW5pdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwU3RvcmFnZS0+Y3VyckltYWdlLT5kYXRhID0KLSAgICAgICAgICAgICAgICAgICAgaDI2NGJzZEFsbG9jYXRlRHBiSW1hZ2UocFN0b3JhZ2UtPmRwYik7Ci0gICAgICAgICAgICAgICAgaDI2NGJzZEluaXRSZWZQaWNMaXN0KHBTdG9yYWdlLT5kcGIpOwotICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RDb25jZWFsKHBTdG9yYWdlLCBwU3RvcmFnZS0+Y3VyckltYWdlLCBQX1NMSUNFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkQ29uY2VhbChwU3RvcmFnZSwgcFN0b3JhZ2UtPmN1cnJJbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyLT5zbGljZVR5cGUpOwotCi0gICAgICAgICAgICBwaWNSZWFkeSA9IEhBTlRST19UUlVFOwotCi0gICAgICAgICAgICAvKiBjdXJyZW50IE5BTCB1bml0IHNob3VsZCBiZSBkZWNvZGVkIG9uIG5leHQgYWN0aXZhdGlvbiAtPiBzZXQKLSAgICAgICAgICAgICAqIHJlYWRCeXRlcyB0byAwICovCi0gICAgICAgICAgICAqcmVhZEJ5dGVzID0gMDsKLSAgICAgICAgICAgIHBTdG9yYWdlLT5wcmV2QnVmTm90RmluaXNoZWQgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgICAgIERFQlVHKCgiLi4uRE9ORVxuIikpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcFN0b3JhZ2UtPnZhbGlkU2xpY2VJbkFjY2Vzc1VuaXQgPSBIQU5UUk9fRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgcFN0b3JhZ2UtPnNraXBSZWR1bmRhbnRTbGljZXMgPSBIQU5UUk9fRkFMU0U7Ci0gICAgfQotCi0gICAgaWYgKCFwaWNSZWFkeSkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAobmFsVW5pdC5uYWxVbml0VHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBOQUxfU0VRX1BBUkFNX1NFVDoKLSAgICAgICAgICAgICAgICBERUJVRygoIlNFUSBQQVJBTSBTRVRcbiIpKTsKLSAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlU2VxUGFyYW1TZXQoJnN0cm0sICZzZXFQYXJhbVNldCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBFUFJJTlQoIlNFUV9QQVJBTV9TRVQiKTsKLSAgICAgICAgICAgICAgICAgICAgRlJFRShzZXFQYXJhbVNldC5vZmZzZXRGb3JSZWZGcmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIEZSRUUoc2VxUGFyYW1TZXQudnVpUGFyYW1ldGVycyk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybihIMjY0QlNEX0VSUk9SKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZFN0b3JlU2VxUGFyYW1TZXQocFN0b3JhZ2UsICZzZXFQYXJhbVNldCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTkFMX1BJQ19QQVJBTV9TRVQ6Ci0gICAgICAgICAgICAgICAgREVCVUcoKCJQSUMgUEFSQU0gU0VUXG4iKSk7Ci0gICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZVBpY1BhcmFtU2V0KCZzdHJtLCAmcGljUGFyYW1TZXQpOwotICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRVBSSU5UKCJQSUNfUEFSQU1fU0VUIik7Ci0gICAgICAgICAgICAgICAgICAgIEZSRUUocGljUGFyYW1TZXQucnVuTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgRlJFRShwaWNQYXJhbVNldC50b3BMZWZ0KTsKLSAgICAgICAgICAgICAgICAgICAgRlJFRShwaWNQYXJhbVNldC5ib3R0b21SaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgIEZSRUUocGljUGFyYW1TZXQuc2xpY2VHcm91cElkKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEgyNjRCU0RfRVJST1IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkU3RvcmVQaWNQYXJhbVNldChwU3RvcmFnZSwgJnBpY1BhcmFtU2V0KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBOQUxfQ09ERURfU0xJQ0VfSURSOgotICAgICAgICAgICAgICAgIERFQlVHKCgiSURSICIpKTsKLSAgICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICAgIGNhc2UgTkFMX0NPREVEX1NMSUNFOgotICAgICAgICAgICAgICAgIERFQlVHKCgiU0xJQ0UgSEVBREVSXG4iKSk7Ci0KLSAgICAgICAgICAgICAgICAvKiBwaWN0dXJlIHN1Y2Nlc3NmdWxseSBmaW5pc2hlZCBhbmQgc3RpbGwgZGVjb2Rpbmcgc2FtZSBvbGQKLSAgICAgICAgICAgICAgICAgKiBhY2Nlc3MgdW5pdCAtPiBubyBuZWVkIHRvIGRlY29kZSByZWR1bmRhbnQgc2xpY2VzICovCi0gICAgICAgICAgICAgICAgaWYgKHBTdG9yYWdlLT5za2lwUmVkdW5kYW50U2xpY2VzKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSDI2NEJTRF9SRFkpOwotCi0gICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnBpY1N0YXJ0ZWQgPSBIQU5UUk9fVFJVRTsKLQotICAgICAgICAgICAgICAgIGlmIChoMjY0YnNkSXNTdGFydE9mUGljdHVyZShwU3RvcmFnZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+bnVtQ29uY2VhbGVkTWJzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmN1cnJlbnRQaWNJZCAgICA9IHBpY0lkOwotCi0gICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RDaGVja1Bwc0lkKCZzdHJtLCAmcHBzSWQpOwotICAgICAgICAgICAgICAgICAgICBBU1NFUlQodG1wID09IEhBTlRST19PSyk7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlIG9sZCBhY3RpdmVTcHNJZCBhbmQgcmV0dXJuIGhlYWRlcnMgcmVhZHkKLSAgICAgICAgICAgICAgICAgICAgICogaW5kaWNhdGlvbiBpZiBhY3RpdmVTcHMgY2hhbmdlcyAqLwotICAgICAgICAgICAgICAgICAgICBzcHNJZCA9IHBTdG9yYWdlLT5hY3RpdmVTcHNJZDsKLSAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEFjdGl2YXRlUGFyYW1TZXRzKHBTdG9yYWdlLCBwcHNJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU19JRFJfTkFMX1VOSVQoJm5hbFVuaXQpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFUFJJTlQoIlBhcmFtIHNldCBhY3RpdmF0aW9uIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlUHBzSWQgPSBNQVhfTlVNX1BJQ19QQVJBTV9TRVRTOwotICAgICAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVBwcyA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzSWQgPSBNQVhfTlVNX1NFUV9QQVJBTV9TRVRTOwotICAgICAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcyA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+cGVuZGluZ0FjdGl2YXRpb24gPSBIQU5UUk9fRkFMU0U7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRtcCA9PSBNRU1PUllfQUxMT0NBVElPTl9FUlJPUikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSDI2NEJTRF9NRU1BTExPQ19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSDI2NEJTRF9QQVJBTV9TRVRfRVJST1IpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHNwc0lkICE9IHBTdG9yYWdlLT5hY3RpdmVTcHNJZCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc2VxUGFyYW1TZXRfdCAqb2xkU1BTID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcVBhcmFtU2V0X3QgKm5ld1NQUyA9IHBTdG9yYWdlLT5hY3RpdmVTcHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1MzIgbm9PdXRwdXRPZlByaW9yUGljc0ZsYWcgPSAxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihwU3RvcmFnZS0+b2xkU3BzSWQgPCBNQVhfTlVNX1NFUV9QQVJBTV9TRVRTKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZFNQUyA9IHBTdG9yYWdlLT5zcHNbcFN0b3JhZ2UtPm9sZFNwc0lkXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgKnJlYWRCeXRlcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+cHJldkJ1Zk5vdEZpbmlzaGVkID0gSEFOVFJPX1RSVUU7Ci0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYobmFsVW5pdC5uYWxVbml0VHlwZSA9PSBOQUxfQ09ERURfU0xJQ0VfSURSKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZENoZWNrUHJpb3JQaWNzRmxhZygmbm9PdXRwdXRPZlByaW9yUGljc0ZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cm0sIG5ld1NQUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlUHBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbFVuaXQubmFsVW5pdFR5cGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IEhBTlRST19OT0s7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCh0bXAgIT0gSEFOVFJPX09LKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5vT3V0cHV0T2ZQcmlvclBpY3NGbGFnICE9IDApIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAocFN0b3JhZ2UtPmRwYi0+bm9SZW9yZGVyaW5nKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9sZFNQUyA9PSBOVUxMKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9sZFNQUy0+cGljV2lkdGhJbk1icyAhPSBuZXdTUFMtPnBpY1dpZHRoSW5NYnMpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAob2xkU1BTLT5waWNIZWlnaHRJbk1icyAhPSBuZXdTUFMtPnBpY0hlaWdodEluTWJzKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9sZFNQUy0+bWF4RHBiU2l6ZSAhPSBuZXdTUFMtPm1heERwYlNpemUpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5kcGItPmZsdXNoZWQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RGbHVzaERwYihwU3RvcmFnZS0+ZHBiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPm9sZFNwc0lkID0gcFN0b3JhZ2UtPmFjdGl2ZVNwc0lkOwotCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSDI2NEJTRF9IRFJTX1JEWSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiByZXR1cm4gZXJyb3IgaWYgc2Vjb25kIHBoYXNlIG9mCi0gICAgICAgICAgICAgICAgICogaW5pdGlhbGl6YXRpb24gaXMgbm90IGNvbXBsZXRlZCAqLwotICAgICAgICAgICAgICAgIGlmIChwU3RvcmFnZS0+cGVuZGluZ0FjdGl2YXRpb24pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBFUFJJTlQoIlBlbmRpbmcgYWN0aXZhdGlvbiBub3QgY29tcGxldGVkIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoSDI2NEJTRF9FUlJPUik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVTbGljZUhlYWRlcigmc3RybSwgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyICsgMSwKLSAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcywgcFN0b3JhZ2UtPmFjdGl2ZVBwcywgJm5hbFVuaXQpOwotICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRVBSSU5UKCJTTElDRV9IRUFERVIiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEgyNjRCU0RfRVJST1IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaDI2NGJzZElzU3RhcnRPZlBpY3R1cmUocFN0b3JhZ2UpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFJU19JRFJfTkFMX1VOSVQoJm5hbFVuaXQpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkQ2hlY2tHYXBzSW5GcmFtZU51bShwU3RvcmFnZS0+ZHBiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5zbGljZUhlYWRlclsxXS5mcmFtZU51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYWxVbml0Lm5hbFJlZklkYyAhPSAwID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYXBzSW5GcmFtZU51bVZhbHVlQWxsb3dlZEZsYWcpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRVBSSU5UKCJHYXBzIGluIGZyYW1lIG51bSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIMjY0QlNEX0VSUk9SKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+Y3VyckltYWdlLT5kYXRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RBbGxvY2F0ZURwYkltYWdlKHBTdG9yYWdlLT5kcGIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIHN0b3JlIHNsaWNlIGhlYWRlciB0byBzdG9yYWdlIGlmIHN1Y2Nlc3NmdWxseSBkZWNvZGVkICovCi0gICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyWzBdID0gcFN0b3JhZ2UtPnNsaWNlSGVhZGVyWzFdOwotICAgICAgICAgICAgICAgIHBTdG9yYWdlLT52YWxpZFNsaWNlSW5BY2Nlc3NVbml0ID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnByZXZOYWxVbml0WzBdID0gbmFsVW5pdDsKLQotICAgICAgICAgICAgICAgIGgyNjRic2RDb21wdXRlU2xpY2VHcm91cE1hcChwU3RvcmFnZSwKLSAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyLT5zbGljZUdyb3VwQ2hhbmdlQ3ljbGUpOwotCi0gICAgICAgICAgICAgICAgaDI2NGJzZEluaXRSZWZQaWNMaXN0KHBTdG9yYWdlLT5kcGIpOwotICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RSZW9yZGVyUmVmUGljTGlzdChwU3RvcmFnZS0+ZHBiLAotICAgICAgICAgICAgICAgICAgICAmcFN0b3JhZ2UtPnNsaWNlSGVhZGVyLT5yZWZQaWNMaXN0UmVvcmRlcmluZywKLSAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyLT5mcmFtZU51bSwKLSAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyLT5udW1SZWZJZHhMMEFjdGl2ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBFUFJJTlQoIlJlb3JkZXJpbmciKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEgyNjRCU0RfRVJST1IpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIERFQlVHKCgiU0xJQ0UgREFUQSwgRklSU1QgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+c2xpY2VIZWFkZXItPmZpcnN0TWJJblNsaWNlKSk7Ci0gICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZVNsaWNlRGF0YSgmc3RybSwgcFN0b3JhZ2UsCi0gICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5jdXJySW1hZ2UsIHBTdG9yYWdlLT5zbGljZUhlYWRlcik7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBFUFJJTlQoIlNMSUNFX0RBVEEiKTsKLSAgICAgICAgICAgICAgICAgICAgaDI2NGJzZE1hcmtTbGljZUNvcnJ1cHRlZChwU3RvcmFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5zbGljZUhlYWRlci0+Zmlyc3RNYkluU2xpY2UpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSDI2NEJTRF9FUlJPUik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGgyNjRic2RJc0VuZE9mUGljdHVyZShwU3RvcmFnZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwaWNSZWFkeSA9IEhBTlRST19UUlVFOwotICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+c2tpcFJlZHVuZGFudFNsaWNlcyA9IEhBTlRST19UUlVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBOQUxfU0VJOgotICAgICAgICAgICAgICAgIERFQlVHKCgiU0VJIE1FU1NBR0UsIE5PVCBERUNPREVEIikpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIERFQlVHKCgiTk9UIElNUExFTUVOVEVEIFlFVCAlZFxuIixuYWxVbml0Lm5hbFVuaXRUeXBlKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocGljUmVhZHkpCi0gICAgewotICAgICAgICBoMjY0YnNkRmlsdGVyUGljdHVyZShwU3RvcmFnZS0+Y3VyckltYWdlLCBwU3RvcmFnZS0+bWIpOwotCi0gICAgICAgIGgyNjRic2RSZXNldFN0b3JhZ2UocFN0b3JhZ2UpOwotCi0gICAgICAgIHBpY09yZGVyQ250ID0gaDI2NGJzZERlY29kZVBpY09yZGVyQ250KHBTdG9yYWdlLT5wb2MsCi0gICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLCBwU3RvcmFnZS0+c2xpY2VIZWFkZXIsIHBTdG9yYWdlLT5wcmV2TmFsVW5pdCk7Ci0KLSAgICAgICAgaWYgKHBTdG9yYWdlLT52YWxpZFNsaWNlSW5BY2Nlc3NVbml0KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocFN0b3JhZ2UtPnByZXZOYWxVbml0LT5uYWxSZWZJZGMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZE1hcmtEZWNSZWZQaWMocFN0b3JhZ2UtPmRwYiwKLSAgICAgICAgICAgICAgICAgICAgJnBTdG9yYWdlLT5zbGljZUhlYWRlci0+ZGVjUmVmUGljTWFya2luZywKLSAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmN1cnJJbWFnZSwgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyLT5mcmFtZU51bSwKLSAgICAgICAgICAgICAgICAgICAgcGljT3JkZXJDbnQsCi0gICAgICAgICAgICAgICAgICAgIElTX0lEUl9OQUxfVU5JVChwU3RvcmFnZS0+cHJldk5hbFVuaXQpID8KLSAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0UsCi0gICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5jdXJyZW50UGljSWQsIHBTdG9yYWdlLT5udW1Db25jZWFsZWRNYnMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogbm9uLXJlZmVyZW5jZSBwaWN0dXJlLCBqdXN0IHN0b3JlIGZvciBwb3NzaWJsZSBkaXNwbGF5Ci0gICAgICAgICAgICAgKiByZW9yZGVyaW5nICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZE1hcmtEZWNSZWZQaWMocFN0b3JhZ2UtPmRwYiwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmN1cnJJbWFnZSwgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyLT5mcmFtZU51bSwKLSAgICAgICAgICAgICAgICAgICAgcGljT3JkZXJDbnQsCi0gICAgICAgICAgICAgICAgICAgIElTX0lEUl9OQUxfVU5JVChwU3RvcmFnZS0+cHJldk5hbFVuaXQpID8KLSAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0UsCi0gICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5jdXJyZW50UGljSWQsIHBTdG9yYWdlLT5udW1Db25jZWFsZWRNYnMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcFN0b3JhZ2UtPnBpY1N0YXJ0ZWQgPSBIQU5UUk9fRkFMU0U7Ci0gICAgICAgIHBTdG9yYWdlLT52YWxpZFNsaWNlSW5BY2Nlc3NVbml0ID0gSEFOVFJPX0ZBTFNFOwotCi0gICAgICAgIHJldHVybihIMjY0QlNEX1BJQ19SRFkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJldHVybihIMjY0QlNEX1JEWSk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkU2h1dGRvd24KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgU2h1dGRvd24gYSBkZWNvZGVyIGluc3RhbmNlLiBGdW5jdGlvbiBmcmVlcyBhbGwgdGhlIG1lbW9yaWVzCi0gICAgICAgICAgICBhbGxvY2F0ZWQgZm9yIHRoZSBkZWNvZGVyIGluc3RhbmNlLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBkYXRhIHN0cnVjdHVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBub25lCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBoMjY0YnNkU2h1dGRvd24oc3RvcmFnZV90ICpwU3RvcmFnZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdG9yYWdlKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX1NFUV9QQVJBTV9TRVRTOyBpKyspCi0gICAgewotICAgICAgICBpZiAocFN0b3JhZ2UtPnNwc1tpXSkKLSAgICAgICAgewotICAgICAgICAgICAgRlJFRShwU3RvcmFnZS0+c3BzW2ldLT5vZmZzZXRGb3JSZWZGcmFtZSk7Ci0gICAgICAgICAgICBGUkVFKHBTdG9yYWdlLT5zcHNbaV0tPnZ1aVBhcmFtZXRlcnMpOwotICAgICAgICAgICAgRlJFRShwU3RvcmFnZS0+c3BzW2ldKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX1BJQ19QQVJBTV9TRVRTOyBpKyspCi0gICAgewotICAgICAgICBpZiAocFN0b3JhZ2UtPnBwc1tpXSkKLSAgICAgICAgewotICAgICAgICAgICAgRlJFRShwU3RvcmFnZS0+cHBzW2ldLT5ydW5MZW5ndGgpOwotICAgICAgICAgICAgRlJFRShwU3RvcmFnZS0+cHBzW2ldLT50b3BMZWZ0KTsKLSAgICAgICAgICAgIEZSRUUocFN0b3JhZ2UtPnBwc1tpXS0+Ym90dG9tUmlnaHQpOwotICAgICAgICAgICAgRlJFRShwU3RvcmFnZS0+cHBzW2ldLT5zbGljZUdyb3VwSWQpOwotICAgICAgICAgICAgRlJFRShwU3RvcmFnZS0+cHBzW2ldKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEZSRUUocFN0b3JhZ2UtPm1iTGF5ZXIpOwotICAgIEZSRUUocFN0b3JhZ2UtPm1iKTsKLSAgICBGUkVFKHBTdG9yYWdlLT5zbGljZUdyb3VwTWFwKTsKLQotICAgIGgyNjRic2RGcmVlRHBiKHBTdG9yYWdlLT5kcGIpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZE5leHRPdXRwdXRQaWN0dXJlCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEdldCBuZXh0IG91dHB1dCBwaWN0dXJlIGluIGRpc3BsYXkgb3JkZXIuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0b3JhZ2UgICAgcG9pbnRlciB0byBzdG9yYWdlIGRhdGEgc3RydWN0dXJlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIHBpY0lkICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHBpY3R1cmUgd2lsbCBiZSBzdG9yZWQgaGVyZQotICAgICAgICAgICAgaXNJZHJQaWMgICAgSURSIGZsYWcgb2YgdGhlIHBpY3R1cmUgd2lsbCBiZSBzdG9yZWQgaGVyZQotICAgICAgICAgICAgbnVtRXJyTWJzICAgbnVtYmVyIG9mIGNvbmNlYWxlZCBtYWNyb2Jsb2NrcyBpbiB0aGUgcGljdHVyZQotICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBwaWN0dXJlIGRhdGEKLSAgICAgICAgICAgIE5VTEwgaWYgbm8gcGljdHVyZXMgYXZhaWxhYmxlIGZvciBkaXNwbGF5Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXU4KiBoMjY0YnNkTmV4dE91dHB1dFBpY3R1cmUoc3RvcmFnZV90ICpwU3RvcmFnZSwgdTMyICpwaWNJZCwgdTMyICppc0lkclBpYywKLSAgICB1MzIgKm51bUVyck1icykKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICBkcGJPdXRQaWN0dXJlX3QgKnBPdXQ7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RvcmFnZSk7Ci0KLSAgICBwT3V0ID0gaDI2NGJzZERwYk91dHB1dFBpY3R1cmUocFN0b3JhZ2UtPmRwYik7Ci0KLSAgICBpZiAocE91dCAhPSBOVUxMKQotICAgIHsKLSAgICAgICAgKnBpY0lkID0gcE91dC0+cGljSWQ7Ci0gICAgICAgICppc0lkclBpYyA9IHBPdXQtPmlzSWRyOwotICAgICAgICAqbnVtRXJyTWJzID0gcE91dC0+bnVtRXJyTWJzOwotICAgICAgICByZXR1cm4gKHBPdXQtPmRhdGEpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJldHVybihOVUxMKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RQaWNXaWR0aAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBHZXQgd2lkdGggb2YgdGhlIHBpY3R1cmUgaW4gbWFjcm9ibG9ja3MKLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RvcmFnZSAgICBwb2ludGVyIHRvIHN0b3JhZ2UgZGF0YSBzdHJ1Y3R1cmUKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgbm9uZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBwaWN0dXJlIHdpZHRoCi0gICAgICAgICAgICAwIGlmIHBhcmFtZXRlcnMgc2V0cyBub3QgeWV0IGFjdGl2YXRlZAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZFBpY1dpZHRoKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0b3JhZ2UpOwotCi0gICAgaWYgKHBTdG9yYWdlLT5hY3RpdmVTcHMpCi0gICAgICAgIHJldHVybihwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNXaWR0aEluTWJzKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybigwKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RQaWNIZWlnaHQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgR2V0IGhlaWdodCBvZiB0aGUgcGljdHVyZSBpbiBtYWNyb2Jsb2NrcwotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBkYXRhIHN0cnVjdHVyZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBub25lCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIHBpY3R1cmUgd2lkdGgKLSAgICAgICAgICAgIDAgaWYgcGFyYW1ldGVycyBzZXRzIG5vdCB5ZXQgYWN0aXZhdGVkCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkUGljSGVpZ2h0KHN0b3JhZ2VfdCAqcFN0b3JhZ2UpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0b3JhZ2UpOwotCi0gICAgaWYgKHBTdG9yYWdlLT5hY3RpdmVTcHMpCi0gICAgICAgIHJldHVybihwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNIZWlnaHRJbk1icyk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4oMCk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkRmx1c2hCdWZmZXIKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRmx1c2ggdGhlIGRlY29kZWQgcGljdHVyZSBidWZmZXIsIHNlZSBkcGIuYyBmb3IgZGV0YWlscwotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBkYXRhIHN0cnVjdHVyZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIGgyNjRic2RGbHVzaEJ1ZmZlcihzdG9yYWdlX3QgKnBTdG9yYWdlKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdG9yYWdlKTsKLQotICAgIGgyNjRic2RGbHVzaERwYihwU3RvcmFnZS0+ZHBiKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RDaGVja1ZhbGlkUGFyYW1TZXRzCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIENoZWNrIGlmIGFueSB2YWxpZCBwYXJhbWV0ZXIgc2V0IGNvbWJpbmF0aW9ucyAoU1BTL1BQUykgZXhpc3RzLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgMSAgICAgICBhdCBsZWFzdCBvbmUgdmFsaWQgU1BTL1BQUyBjb21iaW5hdGlvbiBmb3VuZAotICAgICAgICAgICAgMCAgICAgICBubyB2YWxpZCBwYXJhbSBzZXQgY29tYmluYXRpb25zIGZvdW5kCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RDaGVja1ZhbGlkUGFyYW1TZXRzKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0b3JhZ2UpOwotCi0gICAgcmV0dXJuKGgyNjRic2RWYWxpZFBhcmFtU2V0cyhwU3RvcmFnZSkgPT0gSEFOVFJPX09LID8gMSA6IDApOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZFZpZGVvUmFuZ2UKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgR2V0IHZhbHVlIG9mIHZpZGVvX2Z1bGxfcmFuZ2VfZmxhZyByZWNlaXZlZCBpbiB0aGUgVlVJIGRhdGEuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0b3JhZ2UgICAgcG9pbnRlciB0byBzdG9yYWdlIHN0cnVjdHVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICAxICAgdmlkZW9fZnVsbF9yYW5nZV9mbGFnIHJlY2VpdmVkIGFuZCB2YWx1ZSBpcyAxCi0gICAgICAgICAgICAwICAgb3RoZXJ3aXNlCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkVmlkZW9SYW5nZShzdG9yYWdlX3QgKnBTdG9yYWdlKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdG9yYWdlKTsKLQotICAgIGlmIChwU3RvcmFnZS0+YWN0aXZlU3BzICYmIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnNQcmVzZW50RmxhZyAmJgotICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT52dWlQYXJhbWV0ZXJzICYmCi0gICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnMtPnZpZGVvU2lnbmFsVHlwZVByZXNlbnRGbGFnICYmCi0gICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnMtPnZpZGVvRnVsbFJhbmdlRmxhZykKLSAgICAgICAgcmV0dXJuKDEpOwotICAgIGVsc2UgLyogZGVmYXVsdCB2YWx1ZSBvZiB2aWRlb19mdWxsX3JhbmdlX2ZsYWcgaXMgMCAqLwotICAgICAgICByZXR1cm4oMCk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkTWF0cml4Q29lZmZpY2llbnRzCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEdldCB2YWx1ZSBvZiBtYXRyaXhfY29lZmZpY2llbnRzIHJlY2VpdmVkIGluIHRoZSBWVUkgZGF0YQotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgdmFsdWUgb2YgbWF0cml4X2NvZWZmaWNpZW50cyBpZiByZWNlaXZlZAotICAgICAgICAgICAgMiAgIG90aGVyd2lzZSAodGhpcyBpcyB0aGUgZGVmYXVsdCB2YWx1ZSkKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RNYXRyaXhDb2VmZmljaWVudHMoc3RvcmFnZV90ICpwU3RvcmFnZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RvcmFnZSk7Ci0KLSAgICBpZiAocFN0b3JhZ2UtPmFjdGl2ZVNwcyAmJiBwU3RvcmFnZS0+YWN0aXZlU3BzLT52dWlQYXJhbWV0ZXJzUHJlc2VudEZsYWcgJiYKLSAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVycyAmJgotICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT52dWlQYXJhbWV0ZXJzLT52aWRlb1NpZ25hbFR5cGVQcmVzZW50RmxhZyAmJgotICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT52dWlQYXJhbWV0ZXJzLT5jb2xvdXJEZXNjcmlwdGlvblByZXNlbnRGbGFnKQotICAgICAgICByZXR1cm4ocFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVycy0+bWF0cml4Q29lZmZpY2llbnRzKTsKLSAgICBlbHNlIC8qIGRlZmF1bHQgdW5zcGVjaWZpZWQgKi8KLSAgICAgICAgcmV0dXJuKDIpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaGgyNjRic2RDcm9wcGluZ1BhcmFtcwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBHZXQgY3JvcHBpbmcgcGFyYW1ldGVycyBvZiB0aGUgYWN0aXZlIFNQUwotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgY3JvcHBpbmdGbGFnICAgIGZsYWcgaW5kaWNhdGluZyBpZiBjcm9wcGluZyBwYXJhbXMgcHJlc2VudCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlZCBoZXJlCi0gICAgICAgICAgICBsZWZ0T2Zmc2V0ICAgICAgY3JvcHBpbmcgbGVmdCBvZmZzZXQgaW4gcGl4ZWxzIGlzIHN0b3JlZCBoZXJlCi0gICAgICAgICAgICB3aWR0aCAgICAgICAgICAgd2lkdGggb2YgdGhlIGltYWdlIGFmdGVyIGNyb3BwaW5nIGlzIHN0b3JlZCBoZXJlCi0gICAgICAgICAgICB0b3BPZmZzZXQgICAgICAgY3JvcHBpbmcgdG9wIG9mZnNldCBpbiBwaXhlbHMgaXMgc3RvcmVkIGhlcmUKLSAgICAgICAgICAgIGhlaWdodCAgICAgICAgICBoZWlnaHQgb2YgdGhlIGltYWdlIGFmdGVyIGNyb3BwaW5nIGlzIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIG5vbmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBoMjY0YnNkQ3JvcHBpbmdQYXJhbXMoc3RvcmFnZV90ICpwU3RvcmFnZSwgdTMyICpjcm9wcGluZ0ZsYWcsCi0gICAgdTMyICpsZWZ0T2Zmc2V0LCB1MzIgKndpZHRoLCB1MzIgKnRvcE9mZnNldCwgdTMyICpoZWlnaHQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0b3JhZ2UpOwotCi0gICAgaWYgKHBTdG9yYWdlLT5hY3RpdmVTcHMgJiYgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+ZnJhbWVDcm9wcGluZ0ZsYWcpCi0gICAgewotICAgICAgICAqY3JvcHBpbmdGbGFnID0gMTsKLSAgICAgICAgKmxlZnRPZmZzZXQgPSAyICogcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+ZnJhbWVDcm9wTGVmdE9mZnNldDsKLSAgICAgICAgKndpZHRoID0gMTYgKiBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNXaWR0aEluTWJzIC0KLSAgICAgICAgICAgICAgICAgMiAqIChwU3RvcmFnZS0+YWN0aXZlU3BzLT5mcmFtZUNyb3BMZWZ0T2Zmc2V0ICsKLSAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5mcmFtZUNyb3BSaWdodE9mZnNldCk7Ci0gICAgICAgICp0b3BPZmZzZXQgPSAyICogcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+ZnJhbWVDcm9wVG9wT2Zmc2V0OwotICAgICAgICAqaGVpZ2h0ID0gMTYgKiBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNIZWlnaHRJbk1icyAtCi0gICAgICAgICAgICAgICAgICAyICogKHBTdG9yYWdlLT5hY3RpdmVTcHMtPmZyYW1lQ3JvcFRvcE9mZnNldCArCi0gICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPmZyYW1lQ3JvcEJvdHRvbU9mZnNldCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgICpjcm9wcGluZ0ZsYWcgPSAwOwotICAgICAgICAqbGVmdE9mZnNldCA9IDA7Ci0gICAgICAgICp3aWR0aCA9IDA7Ci0gICAgICAgICp0b3BPZmZzZXQgPSAwOwotICAgICAgICAqaGVpZ2h0ID0gMDsKLSAgICB9Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkU2FtcGxlQXNwZWN0UmF0aW8KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgR2V0IGFzcGVjdCByYXRpbyByZWNlaXZlZCBpbiB0aGUgVlVJIGRhdGEKLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RvcmFnZSAgICBwb2ludGVyIHRvIHN0b3JhZ2Ugc3RydWN0dXJlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIHNhcldpZHRoICAgIHNhbXBsZSBhc3BlY3QgcmF0aW8gaGVpZ2h0Ci0gICAgICAgICAgICBzYXJIZWlnaHQgICBzYW1wbGUgYXNwZWN0IHJhdGlvIHdpZHRoCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgaDI2NGJzZFNhbXBsZUFzcGVjdFJhdGlvKHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIHUzMiAqc2FyV2lkdGgsIHUzMiAqc2FySGVpZ2h0KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLSAgICB1MzIgdyA9IDE7Ci0gICAgdTMyIGggPSAxOwotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdG9yYWdlKTsKLQotCi0gICAgaWYgKHBTdG9yYWdlLT5hY3RpdmVTcHMgJiYKLSAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVyc1ByZXNlbnRGbGFnICYmCi0gICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnMgJiYKLSAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVycy0+YXNwZWN0UmF0aW9QcmVzZW50RmxhZyApCi0gICAgewotICAgICAgICBzd2l0Y2ggKHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnMtPmFzcGVjdFJhdGlvSWRjKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT19VTlNQRUNJRklFRDogIHcgPSAgIDA7IGggPSAgMDsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18xXzE6ICAgICAgICAgIHcgPSAgIDE7IGggPSAgMTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18xMl8xMTogICAgICAgIHcgPSAgMTI7IGggPSAxMTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18xMF8xMTogICAgICAgIHcgPSAgMTA7IGggPSAxMTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18xNl8xMTogICAgICAgIHcgPSAgMTY7IGggPSAxMTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT180MF8zMzogICAgICAgIHcgPSAgNDA7IGggPSAzMzsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18yNF8xMTogICAgICAgIHcgPSAgMjQ7IGggPSAxMTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18yMF8xMTogICAgICAgIHcgPSAgMjA7IGggPSAxMTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18zMl8xMTogICAgICAgIHcgPSAgMzI7IGggPSAxMTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT184MF8zMzogICAgICAgIHcgPSAgODA7IGggPSAzMzsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18xOF8xMTogICAgICAgIHcgPSAgMTg7IGggPSAxMTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18xNV8xMTogICAgICAgIHcgPSAgMTU7IGggPSAxMTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT182NF8zMzogICAgICAgIHcgPSAgNjQ7IGggPSAzMzsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18xNjBfOTk6ICAgICAgIHcgPSAxNjA7IGggPSA5OTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT19FWFRFTkRFRF9TQVI6Ci0gICAgICAgICAgICAgICAgdyA9IHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnMtPnNhcldpZHRoOwotICAgICAgICAgICAgICAgIGggPSBwU3RvcmFnZS0+YWN0aXZlU3BzLT52dWlQYXJhbWV0ZXJzLT5zYXJIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgaWYgKCh3ID09IDApIHx8IChoID09IDApKQotICAgICAgICAgICAgICAgICAgICB3ID0gaCA9IDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHcgPSAwOwotICAgICAgICAgICAgICAgIGggPSAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogc2V0IGFzcGVjdCByYXRpbyovCi0gICAgKnNhcldpZHRoID0gdzsKLSAgICAqc2FySGVpZ2h0ID0gaDsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RQcm9maWxlCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEdldCBwcm9maWxlIGluZm9ybWF0aW9uIGZyb20gYWN0aXZlIFNQUwotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgcHJvZmlsZSAgIGN1cnJlbnQgcHJvZmlsZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdTMyIGgyNjRic2RQcm9maWxlKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpCi17Ci0gICAgaWYgKHBTdG9yYWdlLT5hY3RpdmVTcHMpCi0gICAgICAgIHJldHVybiBwU3RvcmFnZS0+YWN0aXZlU3BzLT5wcm9maWxlSWRjOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIDA7Ci19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kZWNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZGVjb2Rlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzM2NTIzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kZWNvZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotICAgIDMuIERhdGEgdHlwZXMKLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSDI2NFNXREVDX0RFQ09ERVJfSAotI2RlZmluZSBIMjY0U1dERUNfREVDT0RFUl9ICi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3N0b3JhZ2UuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogZW51bWVyYXRlZCByZXR1cm4gdmFsdWVzIG9mIHRoZSBmdW5jdGlvbnMgKi8KLWVudW0gewotICAgIEgyNjRCU0RfUkRZLAotICAgIEgyNjRCU0RfUElDX1JEWSwKLSAgICBIMjY0QlNEX0hEUlNfUkRZLAotICAgIEgyNjRCU0RfRVJST1IsCi0gICAgSDI2NEJTRF9QQVJBTV9TRVRfRVJST1IsCi0gICAgSDI2NEJTRF9NRU1BTExPQ19FUlJPUgotfTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBEYXRhIHR5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkSW5pdChzdG9yYWdlX3QgKnBTdG9yYWdlLCB1MzIgbm9PdXRwdXRSZW9yZGVyaW5nKTsKLXUzMiBoMjY0YnNkRGVjb2RlKHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIHU4ICpieXRlU3RybSwgdTMyIGxlbiwgdTMyIHBpY0lkLAotICAgIHUzMiAqcmVhZEJ5dGVzKTsKLXZvaWQgaDI2NGJzZFNodXRkb3duKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpOwotCi11OCogaDI2NGJzZE5leHRPdXRwdXRQaWN0dXJlKHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIHUzMiAqcGljSWQsIHUzMiAqaXNJZHJQaWMsCi0gICAgdTMyICpudW1FcnJNYnMpOwotCi11MzIgaDI2NGJzZFBpY1dpZHRoKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpOwotdTMyIGgyNjRic2RQaWNIZWlnaHQoc3RvcmFnZV90ICpwU3RvcmFnZSk7Ci11MzIgaDI2NGJzZFZpZGVvUmFuZ2Uoc3RvcmFnZV90ICpwU3RvcmFnZSk7Ci11MzIgaDI2NGJzZE1hdHJpeENvZWZmaWNpZW50cyhzdG9yYWdlX3QgKnBTdG9yYWdlKTsKLXZvaWQgaDI2NGJzZENyb3BwaW5nUGFyYW1zKHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIHUzMiAqY3JvcHBpbmdGbGFnLAotICAgIHUzMiAqbGVmdCwgdTMyICp3aWR0aCwgdTMyICp0b3AsIHUzMiAqaGVpZ2h0KTsKLXZvaWQgaDI2NGJzZFNhbXBsZUFzcGVjdFJhdGlvKHN0b3JhZ2VfdCAqcFN0b3JhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgKnNhcldpZHRoLCB1MzIgKnNhckhlaWdodCk7Ci11MzIgaDI2NGJzZENoZWNrVmFsaWRQYXJhbVNldHMoc3RvcmFnZV90ICpwU3RvcmFnZSk7Ci0KLXZvaWQgaDI2NGJzZEZsdXNoQnVmZmVyKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpOwotCi11MzIgaDI2NGJzZFByb2ZpbGUoc3RvcmFnZV90ICpwU3RvcmFnZSk7Ci0KLSNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX0RFQ09ERVJfSCAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZHBiLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZHBiLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkOWVlZTkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RwYi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0gICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0gICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgICAgNS4gRnVuY3Rpb25zCi0gICAgICAgICAgQ29tcGFyZVBpY3R1cmVzCi0gICAgICAgICAgaDI2NGJzZFJlb3JkZXJSZWZQaWNMaXN0Ci0gICAgICAgICAgTW1jb3AxCi0gICAgICAgICAgTW1jb3AyCi0gICAgICAgICAgTW1jb3AzCi0gICAgICAgICAgTW1jb3A0Ci0gICAgICAgICAgTW1jb3A1Ci0gICAgICAgICAgTW1jb3A2Ci0gICAgICAgICAgaDI2NGJzZE1hcmtEZWNSZWZQaWMKLSAgICAgICAgICBoMjY0YnNkR2V0UmVmUGljRGF0YQotICAgICAgICAgIGgyNjRic2RBbGxvY2F0ZURwYkltYWdlCi0gICAgICAgICAgU2xpZGluZ1dpbmRvd1JlZlBpY01hcmtpbmcKLSAgICAgICAgICBoMjY0YnNkSW5pdERwYgotICAgICAgICAgIGgyNjRic2RSZXNldERwYgotICAgICAgICAgIGgyNjRic2RJbml0UmVmUGljTGlzdAotICAgICAgICAgIEZpbmREcGJQaWMKLSAgICAgICAgICBTZXRQaWNOdW1zCi0gICAgICAgICAgaDI2NGJzZENoZWNrR2Fwc0luRnJhbWVOdW0KLSAgICAgICAgICBGaW5kU21hbGxlc3RQaWNPcmRlckNudAotICAgICAgICAgIE91dHB1dFBpY3R1cmUKLSAgICAgICAgICBoMjY0YnNkRHBiT3V0cHV0UGljdHVyZQotICAgICAgICAgIGgyNjRic2RGbHVzaERwYgotICAgICAgICAgIGgyNjRic2RGcmVlRHBiCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiaDI2NGJzZF9jZmcuaCIKLSNpbmNsdWRlICJoMjY0YnNkX2RwYi5oIgotI2luY2x1ZGUgImgyNjRic2Rfc2xpY2VfaGVhZGVyLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9pbWFnZS5oIgotI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0KLSNpbmNsdWRlIDxsb2cvbG9nLmg+Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIG1hY3JvcyB0byBkZXRlcm1pbmUgcGljdHVyZSBzdGF0dXMuIE5vdGUgdGhhdCBJU19TSE9SVF9URVJNIG1hY3JvIHJldHVybnMKLSAqIHRydWUgYWxzbyBmb3Igbm9uLWV4aXN0aW5nIHBpY3R1cmVzIGJlY2F1c2Ugbm9uLWV4aXN0aW5nIHBpY3R1cmVzIGFyZQotICogcmVnYXJkZWQgc2hvcnQgdGVybSBwaWN0dXJlcyBhY2NvcmRpbmcgdG8gSC4yNjQgc3RhbmRhcmQgKi8KLSNkZWZpbmUgSVNfUkVGRVJFTkNFKGEpICgoYSkuc3RhdHVzKQotI2RlZmluZSBJU19FWElTVElORyhhKSAoKGEpLnN0YXR1cyA+IE5PTl9FWElTVElORykKLSNkZWZpbmUgSVNfU0hPUlRfVEVSTShhKSBcCi0gICAgKChhKS5zdGF0dXMgPT0gTk9OX0VYSVNUSU5HIHx8IChhKS5zdGF0dXMgPT0gU0hPUlRfVEVSTSkKLSNkZWZpbmUgSVNfTE9OR19URVJNKGEpICgoYSkuc3RhdHVzID09IExPTkdfVEVSTSkKLQotLyogbWFjcm8gdG8gc2V0IGEgcGljdHVyZSB1bnVzZWQgZm9yIHJlZmVyZW5jZSAqLwotI2RlZmluZSBTRVRfVU5VU0VEKGEpIChhKS5zdGF0dXMgPSBVTlVTRUQ7Ci0KLSNkZWZpbmUgTUFYX05VTV9SRUZfSURYX0wwX0FDVElWRSAxNgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpMzIgQ29tcGFyZVBpY3R1cmVzKGNvbnN0IHZvaWQgKnB0cjEsIGNvbnN0IHZvaWQgKnB0cjIpOwotCi1zdGF0aWMgdTMyIE1tY29wMShkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIGN1cnJQaWNOdW0sIHUzMiBkaWZmZXJlbmNlT2ZQaWNOdW1zKTsKLQotc3RhdGljIHUzMiBNbWNvcDIoZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBsb25nVGVybVBpY051bSk7Ci0KLXN0YXRpYyB1MzIgTW1jb3AzKGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgY3VyclBpY051bSwgdTMyIGRpZmZlcmVuY2VPZlBpY051bXMsCi0gICAgdTMyIGxvbmdUZXJtRnJhbWVJZHgpOwotCi1zdGF0aWMgdTMyIE1tY29wNChkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIG1heExvbmdUZXJtRnJhbWVJZHgpOwotCi1zdGF0aWMgdTMyIE1tY29wNShkcGJTdG9yYWdlX3QgKmRwYik7Ci0KLXN0YXRpYyB1MzIgTW1jb3A2KGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgZnJhbWVOdW0sIGkzMiBwaWNPcmRlckNudCwKLSAgICB1MzIgbG9uZ1Rlcm1GcmFtZUlkeCk7Ci0KLXN0YXRpYyB1MzIgU2xpZGluZ1dpbmRvd1JlZlBpY01hcmtpbmcoZHBiU3RvcmFnZV90ICpkcGIpOwotCi1zdGF0aWMgaTMyIEZpbmREcGJQaWMoZHBiU3RvcmFnZV90ICpkcGIsIGkzMiBwaWNOdW0sIHUzMiBpc1Nob3J0VGVybSk7Ci0KLXN0YXRpYyB2b2lkIFNldFBpY051bXMoZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBjdXJyRnJhbWVOdW0pOwotCi1zdGF0aWMgZHBiUGljdHVyZV90KiBGaW5kU21hbGxlc3RQaWNPcmRlckNudChkcGJTdG9yYWdlX3QgKmRwYik7Ci0KLXN0YXRpYyB1MzIgT3V0cHV0UGljdHVyZShkcGJTdG9yYWdlX3QgKmRwYik7Ci0KLXN0YXRpYyB2b2lkIFNoZWxsU29ydChkcGJQaWN0dXJlX3QgKnBQaWMsIHUzMiBudW0pOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IENvbXBhcmVQaWN0dXJlcwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBjb21wYXJlIGRwYiBwaWN0dXJlcywgdXNlZCBieSB0aGUgU2hlbGxTb3J0KCkgZnVuY3Rpb24uCi0gICAgICAgICAgICBPcmRlciBvZiB0aGUgcGljdHVyZXMgYWZ0ZXIgc29ydGluZyBzaGFsbCBiZSBhcyBmb2xsb3dzOgotICAgICAgICAgICAgICAgIDEpIHNob3J0IHRlcm0gcmVmZXJlbmNlIHBpY3R1cmVzIHN0YXJ0aW5nIHdpdGggdGhlIGxhcmdlc3QKLSAgICAgICAgICAgICAgICAgICBwaWNOdW0KLSAgICAgICAgICAgICAgICAyKSBsb25nIHRlcm0gcmVmZXJlbmNlIHBpY3R1cmVzIHN0YXJ0aW5nIHdpdGggdGhlIHNtYWxsZXN0Ci0gICAgICAgICAgICAgICAgICAgbG9uZ1Rlcm1QaWNOdW0KLSAgICAgICAgICAgICAgICAzKSBwaWN0dXJlcyB1bnVzZWQgZm9yIHJlZmVyZW5jZSBidXQgbmVlZGVkIGZvciBkaXNwbGF5Ci0gICAgICAgICAgICAgICAgNCkgb3RoZXIgcGljdHVyZXMKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgLTEgICAgICBwaWMgMSBpcyBncmVhdGVyIHRoYW4gcGljIDIKLSAgICAgICAgICAgICAwICAgICAgZXF1YWwgZnJvbSBjb21wYXJpc29uIHBvaW50IG9mIHZpZXcKLSAgICAgICAgICAgICAxICAgICAgcGljIDIgaXMgZ3JlYXRlciB0aGVuIHBpYyAxCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpMzIgQ29tcGFyZVBpY3R1cmVzKGNvbnN0IHZvaWQgKnB0cjEsIGNvbnN0IHZvaWQgKnB0cjIpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgZHBiUGljdHVyZV90ICpwaWMxLCAqcGljMjsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHB0cjEpOwotICAgIEFTU0VSVChwdHIyKTsKLQotICAgIHBpYzEgPSAoZHBiUGljdHVyZV90KilwdHIxOwotICAgIHBpYzIgPSAoZHBiUGljdHVyZV90KilwdHIyOwotCi0gICAgLyogYm90aCBhcmUgbm9uLXJlZmVyZW5jZSBwaWN0dXJlcywgY2hlY2sgaWYgbmVlZGVkIGZvciBkaXNwbGF5ICovCi0gICAgaWYgKCFJU19SRUZFUkVOQ0UoKnBpYzEpICYmICFJU19SRUZFUkVOQ0UoKnBpYzIpKQotICAgIHsKLSAgICAgICAgaWYgKHBpYzEtPnRvQmVEaXNwbGF5ZWQgJiYgIXBpYzItPnRvQmVEaXNwbGF5ZWQpCi0gICAgICAgICAgICByZXR1cm4oLTEpOwotICAgICAgICBlbHNlIGlmICghcGljMS0+dG9CZURpc3BsYXllZCAmJiBwaWMyLT50b0JlRGlzcGxheWVkKQotICAgICAgICAgICAgcmV0dXJuKDEpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4oMCk7Ci0gICAgfQotICAgIC8qIG9ubHkgcGljIDEgbmVlZGVkIGZvciByZWZlcmVuY2UgLT4gZ3JlYXRlciAqLwotICAgIGVsc2UgaWYgKCFJU19SRUZFUkVOQ0UoKnBpYzIpKQotICAgICAgICByZXR1cm4oLTEpOwotICAgIC8qIG9ubHkgcGljIDIgbmVlZGVkIGZvciByZWZlcmVuY2UgLT4gZ3JlYXRlciAqLwotICAgIGVsc2UgaWYgKCFJU19SRUZFUkVOQ0UoKnBpYzEpKQotICAgICAgICByZXR1cm4oMSk7Ci0gICAgLyogYm90aCBhcmUgc2hvcnQgdGVybSByZWZlcmVuY2UgcGljdHVyZXMgLT4gY2hlY2sgcGljTnVtICovCi0gICAgZWxzZSBpZiAoSVNfU0hPUlRfVEVSTSgqcGljMSkgJiYgSVNfU0hPUlRfVEVSTSgqcGljMikpCi0gICAgewotICAgICAgICBpZiAocGljMS0+cGljTnVtID4gcGljMi0+cGljTnVtKQotICAgICAgICAgICAgcmV0dXJuKC0xKTsKLSAgICAgICAgZWxzZSBpZiAocGljMS0+cGljTnVtIDwgcGljMi0+cGljTnVtKQotICAgICAgICAgICAgcmV0dXJuKDEpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4oMCk7Ci0gICAgfQotICAgIC8qIG9ubHkgcGljIDEgaXMgc2hvcnQgdGVybSAtPiBncmVhdGVyICovCi0gICAgZWxzZSBpZiAoSVNfU0hPUlRfVEVSTSgqcGljMSkpCi0gICAgICAgIHJldHVybigtMSk7Ci0gICAgLyogb25seSBwaWMgMiBpcyBzaG9ydCB0ZXJtIC0+IGdyZWF0ZXIgKi8KLSAgICBlbHNlIGlmIChJU19TSE9SVF9URVJNKCpwaWMyKSkKLSAgICAgICAgcmV0dXJuKDEpOwotICAgIC8qIGJvdGggYXJlIGxvbmcgdGVybSByZWZlcmVuY2UgcGljdHVyZXMgLT4gY2hlY2sgcGljTnVtIChjb250YWlucyB0aGUKLSAgICAgKiBsb25nVGVybVBpY051bSAqLwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmIChwaWMxLT5waWNOdW0gPiBwaWMyLT5waWNOdW0pCi0gICAgICAgICAgICByZXR1cm4oMSk7Ci0gICAgICAgIGVsc2UgaWYgKHBpYzEtPnBpY051bSA8IHBpYzItPnBpY051bSkKLSAgICAgICAgICAgIHJldHVybigtMSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybigwKTsKLSAgICB9Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZFJlb3JkZXJSZWZQaWNMaXN0Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIHBlcmZvcm0gcmVmZXJlbmNlIHBpY3R1cmUgbGlzdCByZW9yZGVyaW5nIGJhc2VkIG9uCi0gICAgICAgICAgICByZW9yZGVyaW5nIGNvbW1hbmRzIHJlY2VpdmVkIGluIHRoZSBzbGljZSBoZWFkZXIuIFNlZSBkZXRhaWxzCi0gICAgICAgICAgICBvZiB0aGUgcHJvY2VzcyBpbiB0aGUgSC4yNjQgc3RhbmRhcmQuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgZHBiICAgICAgICAgICAgIHBvaW50ZXIgdG8gZHBiIHN0b3JhZ2Ugc3RydWN0dXJlCi0gICAgICAgICAgICBvcmRlciAgICAgICAgICAgcG9pbnRlciB0byByZW9yZGVyaW5nIGNvbW1hbmRzCi0gICAgICAgICAgICBjdXJyRnJhbWVOdW0gICAgY3VycmVudCBmcmFtZSBudW1iZXIKLSAgICAgICAgICAgIG51bVJlZklkeEFjdGl2ZSBudW1iZXIgb2YgYWN0aXZlIHJlZmVyZW5jZSBpbmRpY2VzIGZvciBjdXJyZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBkcGIgICAgICAgICAgICAgJ2xpc3QnIGZpZWxkIG9mIHRoZSBzdHJ1Y3R1cmUgcmVvcmRlcmVkCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgIGlmIG5vbi1leGlzdGluZyBwaWN0dXJlcyByZWZlcnJlZCB0byBpbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlb3JkZXJpbmcgY29tbWFuZHMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RSZW9yZGVyUmVmUGljTGlzdCgKLSAgZHBiU3RvcmFnZV90ICpkcGIsCi0gIHJlZlBpY0xpc3RSZW9yZGVyaW5nX3QgKm9yZGVyLAotICB1MzIgY3VyckZyYW1lTnVtLAotICB1MzIgbnVtUmVmSWR4QWN0aXZlKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpLCBqLCBrLCBwaWNOdW1QcmVkLCByZWZJZHg7Ci0gICAgaTMyIHBpY051bSwgcGljTnVtTm9XcmFwLCBpbmRleDsKLSAgICB1MzIgaXNTaG9ydFRlcm07Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChvcmRlcik7Ci0gICAgQVNTRVJUKGN1cnJGcmFtZU51bSA8PSBkcGItPm1heEZyYW1lTnVtKTsKLSAgICBBU1NFUlQobnVtUmVmSWR4QWN0aXZlIDw9IE1BWF9OVU1fUkVGX0lEWF9MMF9BQ1RJVkUpOwotCi0gICAgLyogc2V0IGRwYiBwaWN0dXJlIG51bWJlcnMgZm9yIHNvcnRpbmcgKi8KLSAgICBTZXRQaWNOdW1zKGRwYiwgY3VyckZyYW1lTnVtKTsKLQotICAgIGlmICghb3JkZXItPnJlZlBpY0xpc3RSZW9yZGVyaW5nRmxhZ0wwKQotICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotICAgIHJlZklkeCAgICAgPSAwOwotICAgIHBpY051bVByZWQgPSBjdXJyRnJhbWVOdW07Ci0KLSAgICBpID0gMDsKLSAgICB3aGlsZSAob3JkZXItPmNvbW1hbmRbaV0ucmVvcmRlcmluZ09mUGljTnVtc0lkYyA8IDMpCi0gICAgewotICAgICAgICAvKiBzaG9ydCB0ZXJtICovCi0gICAgICAgIGlmIChvcmRlci0+Y29tbWFuZFtpXS5yZW9yZGVyaW5nT2ZQaWNOdW1zSWRjIDwgMikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG9yZGVyLT5jb21tYW5kW2ldLnJlb3JkZXJpbmdPZlBpY051bXNJZGMgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwaWNOdW1Ob1dyYXAgPQotICAgICAgICAgICAgICAgICAgICAoaTMyKXBpY051bVByZWQgLSAoaTMyKW9yZGVyLT5jb21tYW5kW2ldLmFic0RpZmZQaWNOdW07Ci0gICAgICAgICAgICAgICAgaWYgKHBpY051bU5vV3JhcCA8IDApCi0gICAgICAgICAgICAgICAgICAgIHBpY051bU5vV3JhcCArPSAoaTMyKWRwYi0+bWF4RnJhbWVOdW07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcGljTnVtTm9XcmFwID0KLSAgICAgICAgICAgICAgICAgICAgKGkzMikocGljTnVtUHJlZCArIG9yZGVyLT5jb21tYW5kW2ldLmFic0RpZmZQaWNOdW0pOwotICAgICAgICAgICAgICAgIGlmIChwaWNOdW1Ob1dyYXAgPj0gKGkzMilkcGItPm1heEZyYW1lTnVtKQotICAgICAgICAgICAgICAgICAgICBwaWNOdW1Ob1dyYXAgLT0gKGkzMilkcGItPm1heEZyYW1lTnVtOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGljTnVtUHJlZCA9ICh1MzIpcGljTnVtTm9XcmFwOwotICAgICAgICAgICAgcGljTnVtID0gcGljTnVtTm9XcmFwOwotICAgICAgICAgICAgaWYgKCh1MzIpcGljTnVtTm9XcmFwID4gY3VyckZyYW1lTnVtKQotICAgICAgICAgICAgICAgIHBpY051bSAtPSAoaTMyKWRwYi0+bWF4RnJhbWVOdW07Ci0gICAgICAgICAgICBpc1Nob3J0VGVybSA9IEhBTlRST19UUlVFOwotICAgICAgICB9Ci0gICAgICAgIC8qIGxvbmcgdGVybSAqLwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBpY051bSA9IChpMzIpb3JkZXItPmNvbW1hbmRbaV0ubG9uZ1Rlcm1QaWNOdW07Ci0gICAgICAgICAgICBpc1Nob3J0VGVybSA9IEhBTlRST19GQUxTRTsKLQotICAgICAgICB9Ci0gICAgICAgIC8qIGZpbmQgY29ycmVzcG9uZGluZyBwaWN0dXJlIGZyb20gZHBiICovCi0gICAgICAgIGluZGV4ID0gRmluZERwYlBpYyhkcGIsIHBpY051bSwgaXNTaG9ydFRlcm0pOwotICAgICAgICBpZiAoaW5kZXggPCAwIHx8ICFJU19FWElTVElORyhkcGItPmJ1ZmZlcltpbmRleF0pKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgICAgIC8qIHNoaWZ0IHBpY3R1cmVzICovCi0gICAgICAgIGZvciAoaiA9IG51bVJlZklkeEFjdGl2ZTsgaiA+IHJlZklkeDsgai0tKQotICAgICAgICAgICAgZHBiLT5saXN0W2pdID0gZHBiLT5saXN0W2otMV07Ci0gICAgICAgIC8qIHB1dCBwaWN0dXJlIGludG8gdGhlIGxpc3QgKi8KLSAgICAgICAgZHBiLT5saXN0W3JlZklkeCsrXSA9ICZkcGItPmJ1ZmZlcltpbmRleF07Ci0gICAgICAgIC8qIHJlbW92ZSBsYXRlciByZWZlcmVuY2VzIHRvIHRoZSBzYW1lIHBpY3R1cmUgKi8KLSAgICAgICAgZm9yIChqID0gayA9IHJlZklkeDsgaiA8PSBudW1SZWZJZHhBY3RpdmU7IGorKykKLSAgICAgICAgICAgIGlmKGRwYi0+bGlzdFtqXSAhPSAmZHBiLT5idWZmZXJbaW5kZXhdKQotICAgICAgICAgICAgICAgIGRwYi0+bGlzdFtrKytdID0gZHBiLT5saXN0W2pdOwotCi0gICAgICAgIGkrKzsKLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IE1tY29wMQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBtYXJrIGEgc2hvcnQtdGVybSByZWZlcmVuY2UgcGljdHVyZSB1bnVzZWQgZm9yCi0gICAgICAgICAgICByZWZlcmVuY2UsIG1lbW9yeV9tYW5hZ2VtZW50X2NvbnRyb2xfb3BlcmF0aW9uIGVxdWFsIHRvIDEKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgc3VjY2VzcwotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgZmFpbHVyZSwgcGljdHVyZSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgYnVmZmVyCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgTW1jb3AxKGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgY3VyclBpY051bSwgdTMyIGRpZmZlcmVuY2VPZlBpY051bXMpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgaTMyIGluZGV4LCBwaWNOdW07Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChjdXJyUGljTnVtIDwgZHBiLT5tYXhGcmFtZU51bSk7Ci0KLSAgICBwaWNOdW0gPSAoaTMyKWN1cnJQaWNOdW0gLSAoaTMyKWRpZmZlcmVuY2VPZlBpY051bXM7Ci0KLSAgICBpbmRleCA9IEZpbmREcGJQaWMoZHBiLCBwaWNOdW0sIEhBTlRST19UUlVFKTsKLSAgICBpZiAoaW5kZXggPCAwKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICBTRVRfVU5VU0VEKGRwYi0+YnVmZmVyW2luZGV4XSk7Ci0gICAgZHBiLT5udW1SZWZGcmFtZXMtLTsKLSAgICBpZiAoIWRwYi0+YnVmZmVyW2luZGV4XS50b0JlRGlzcGxheWVkKQotICAgICAgICBkcGItPmZ1bGxuZXNzLS07Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IE1tY29wMgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBtYXJrIGEgbG9uZy10ZXJtIHJlZmVyZW5jZSBwaWN0dXJlIHVudXNlZCBmb3IKLSAgICAgICAgICAgIHJlZmVyZW5jZSwgbWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb24gZXF1YWwgdG8gMgotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBIQU5UUk9fTk9LICAgICBmYWlsdXJlLCBwaWN0dXJlIGRvZXMgbm90IGV4aXN0IGluIHRoZSBidWZmZXIKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBNbWNvcDIoZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBsb25nVGVybVBpY051bSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICBpMzIgaW5kZXg7Ci0KLS8qIENvZGUgKi8KLQotICAgIGluZGV4ID0gRmluZERwYlBpYyhkcGIsIChpMzIpbG9uZ1Rlcm1QaWNOdW0sIEhBTlRST19GQUxTRSk7Ci0gICAgaWYgKGluZGV4IDwgMCkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgU0VUX1VOVVNFRChkcGItPmJ1ZmZlcltpbmRleF0pOwotICAgIGRwYi0+bnVtUmVmRnJhbWVzLS07Ci0gICAgaWYgKCFkcGItPmJ1ZmZlcltpbmRleF0udG9CZURpc3BsYXllZCkKLSAgICAgICAgZHBiLT5mdWxsbmVzcy0tOwotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBNbWNvcDMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gYXNzaW5nIGEgbG9uZ1Rlcm1GcmFtZUlkeCB0byBhIHNob3J0LXRlcm0gcmVmZXJlbmNlCi0gICAgICAgICAgICBmcmFtZSAoaS5lLiB0byBjaGFuZ2UgaXQgdG8gYSBsb25nLXRlcm0gcmVmZXJlbmNlIHBpY3R1cmUpLAotICAgICAgICAgICAgbWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb24gZXF1YWwgdG8gMwotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBIQU5UUk9fTk9LICAgICBmYWlsdXJlLCBzaG9ydC10ZXJtIHBpY3R1cmUgZG9lcyBub3QgZXhpc3QgaW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgb3IgaXMgYSBub24tZXhpc3RpbmcgcGljdHVyZSwgb3IgaW52YWxpZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZ1Rlcm1GcmFtZUlkeCBnaXZlbgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIE1tY29wMyhkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIGN1cnJQaWNOdW0sIHUzMiBkaWZmZXJlbmNlT2ZQaWNOdW1zLAotICAgIHUzMiBsb25nVGVybUZyYW1lSWR4KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIGkzMiBpbmRleCwgcGljTnVtOwotICAgIHUzMiBpOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZHBiKTsKLSAgICBBU1NFUlQoY3VyclBpY051bSA8IGRwYi0+bWF4RnJhbWVOdW0pOwotCi0gICAgaWYgKCAoZHBiLT5tYXhMb25nVGVybUZyYW1lSWR4ID09IE5PX0xPTkdfVEVSTV9GUkFNRV9JTkRJQ0VTKSB8fAotICAgICAgICAgKGxvbmdUZXJtRnJhbWVJZHggPiBkcGItPm1heExvbmdUZXJtRnJhbWVJZHgpICkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgLyogY2hlY2sgaWYgYSBsb25nIHRlcm0gcGljdHVyZSB3aXRoIHRoZSBzYW1lIGxvbmdUZXJtRnJhbWVJZHggYWxyZWFkeQotICAgICAqIGV4aXN0IGFuZCByZW1vdmUgaXQgaWYgbmVjZXNzYXJ5ICovCi0gICAgZm9yIChpID0gMDsgaSA8IGRwYi0+bWF4UmVmRnJhbWVzOyBpKyspCi0gICAgICAgIGlmIChJU19MT05HX1RFUk0oZHBiLT5idWZmZXJbaV0pICYmCi0gICAgICAgICAgKHUzMilkcGItPmJ1ZmZlcltpXS5waWNOdW0gPT0gbG9uZ1Rlcm1GcmFtZUlkeCkKLSAgICAgICAgewotICAgICAgICAgICAgU0VUX1VOVVNFRChkcGItPmJ1ZmZlcltpXSk7Ci0gICAgICAgICAgICBkcGItPm51bVJlZkZyYW1lcy0tOwotICAgICAgICAgICAgaWYgKCFkcGItPmJ1ZmZlcltpXS50b0JlRGlzcGxheWVkKQotICAgICAgICAgICAgICAgIGRwYi0+ZnVsbG5lc3MtLTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICBwaWNOdW0gPSAoaTMyKWN1cnJQaWNOdW0gLSAoaTMyKWRpZmZlcmVuY2VPZlBpY051bXM7Ci0KLSAgICBpbmRleCA9IEZpbmREcGJQaWMoZHBiLCBwaWNOdW0sIEhBTlRST19UUlVFKTsKLSAgICBpZiAoaW5kZXggPCAwKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgaWYgKCFJU19FWElTVElORyhkcGItPmJ1ZmZlcltpbmRleF0pKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICBkcGItPmJ1ZmZlcltpbmRleF0uc3RhdHVzID0gTE9OR19URVJNOwotICAgIGRwYi0+YnVmZmVyW2luZGV4XS5waWNOdW0gPSAoaTMyKWxvbmdUZXJtRnJhbWVJZHg7Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IE1tY29wNAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBzZXQgbWF4TG9uZ1Rlcm1GcmFtZUlkeCwKLSAgICAgICAgICAgIG1lbW9yeV9tYW5hZ2VtZW50X2NvbnRyb2xfb3BlcmF0aW9uIGVxdWFsIHRvIDQKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgc3VjY2VzcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIE1tY29wNChkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIG1heExvbmdUZXJtRnJhbWVJZHgpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGk7Ci0KLS8qIENvZGUgKi8KLQotICAgIGRwYi0+bWF4TG9uZ1Rlcm1GcmFtZUlkeCA9IG1heExvbmdUZXJtRnJhbWVJZHg7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgZHBiLT5tYXhSZWZGcmFtZXM7IGkrKykKLSAgICAgICAgaWYgKElTX0xPTkdfVEVSTShkcGItPmJ1ZmZlcltpXSkgJiYKLSAgICAgICAgICAoICgodTMyKWRwYi0+YnVmZmVyW2ldLnBpY051bSA+IG1heExvbmdUZXJtRnJhbWVJZHgpIHx8Ci0gICAgICAgICAgICAoZHBiLT5tYXhMb25nVGVybUZyYW1lSWR4ID09IE5PX0xPTkdfVEVSTV9GUkFNRV9JTkRJQ0VTKSApICkKLSAgICAgICAgewotICAgICAgICAgICAgU0VUX1VOVVNFRChkcGItPmJ1ZmZlcltpXSk7Ci0gICAgICAgICAgICBkcGItPm51bVJlZkZyYW1lcy0tOwotICAgICAgICAgICAgaWYgKCFkcGItPmJ1ZmZlcltpXS50b0JlRGlzcGxheWVkKQotICAgICAgICAgICAgICAgIGRwYi0+ZnVsbG5lc3MtLTsKLSAgICAgICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBNbWNvcDUKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gbWFyayBhbGwgcmVmZXJlbmNlIHBpY3R1cmVzIHVudXNlZCBmb3IgcmVmZXJlbmNlIGFuZAotICAgICAgICAgICAgc2V0IG1heExvbmdUZXJtRnJhbWVJZHggdG8gTk9fTE9OR19URVJNX0ZSQU1FX0lORElDRVMsCi0gICAgICAgICAgICBtZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbiBlcXVhbCB0byA1LiBGdW5jdGlvbiBmbHVzaGVzCi0gICAgICAgICAgICB0aGUgYnVmZmVyIGFuZCBwbGFjZXMgYWxsIHBpY3R1cmVzIHRoYXQgYXJlIG5lZWRlZCBmb3IgZGlzcGxheSBpbnRvCi0gICAgICAgICAgICB0aGUgb3V0cHV0IGJ1ZmZlci4KLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgc3VjY2VzcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIE1tY29wNShkcGJTdG9yYWdlX3QgKmRwYikKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaTsKLQotLyogQ29kZSAqLwotCi0gICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgewotICAgICAgICBpZiAoSVNfUkVGRVJFTkNFKGRwYi0+YnVmZmVyW2ldKSkKLSAgICAgICAgewotICAgICAgICAgICAgU0VUX1VOVVNFRChkcGItPmJ1ZmZlcltpXSk7Ci0gICAgICAgICAgICBpZiAoIWRwYi0+YnVmZmVyW2ldLnRvQmVEaXNwbGF5ZWQpCi0gICAgICAgICAgICAgICAgZHBiLT5mdWxsbmVzcy0tOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogb3V0cHV0IGFsbCBwaWN0dXJlcyAqLwotICAgIHdoaWxlIChPdXRwdXRQaWN0dXJlKGRwYikgPT0gSEFOVFJPX09LKQotICAgICAgICA7Ci0gICAgZHBiLT5udW1SZWZGcmFtZXMgPSAwOwotICAgIGRwYi0+bWF4TG9uZ1Rlcm1GcmFtZUlkeCA9IE5PX0xPTkdfVEVSTV9GUkFNRV9JTkRJQ0VTOwotICAgIGRwYi0+cHJldlJlZkZyYW1lTnVtID0gMDsKLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogTW1jb3A2Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGFzc2lnbiBsb25nVGVybUZyYW1lSWR4IHRvIHRoZSBjdXJyZW50IHBpY3R1cmUsCi0gICAgICAgICAgICBtZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbiBlcXVhbCB0byA2Ci0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgIGludmFsaWQgbG9uZ1Rlcm1GcmFtZUlkeCBvciBubyByb29tIGZvciBjdXJyZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlIGluIHRoZSBidWZmZXIKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBNbWNvcDYoZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBmcmFtZU51bSwgaTMyIHBpY09yZGVyQ250LAotICAgIHUzMiBsb25nVGVybUZyYW1lSWR4KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZnJhbWVOdW0gPCBkcGItPm1heEZyYW1lTnVtKTsKLQotICAgIGlmICggKGRwYi0+bWF4TG9uZ1Rlcm1GcmFtZUlkeCA9PSBOT19MT05HX1RFUk1fRlJBTUVfSU5ESUNFUykgfHwKLSAgICAgICAgIChsb25nVGVybUZyYW1lSWR4ID4gZHBiLT5tYXhMb25nVGVybUZyYW1lSWR4KSApCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIC8qIGNoZWNrIGlmIGEgbG9uZyB0ZXJtIHBpY3R1cmUgd2l0aCB0aGUgc2FtZSBsb25nVGVybUZyYW1lSWR4IGFscmVhZHkKLSAgICAgKiBleGlzdCBhbmQgcmVtb3ZlIGl0IGlmIG5lY2Vzc2FyeSAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBkcGItPm1heFJlZkZyYW1lczsgaSsrKQotICAgICAgICBpZiAoSVNfTE9OR19URVJNKGRwYi0+YnVmZmVyW2ldKSAmJgotICAgICAgICAgICh1MzIpZHBiLT5idWZmZXJbaV0ucGljTnVtID09IGxvbmdUZXJtRnJhbWVJZHgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNFVF9VTlVTRUQoZHBiLT5idWZmZXJbaV0pOwotICAgICAgICAgICAgZHBiLT5udW1SZWZGcmFtZXMtLTsKLSAgICAgICAgICAgIGlmICghZHBiLT5idWZmZXJbaV0udG9CZURpc3BsYXllZCkKLSAgICAgICAgICAgICAgICBkcGItPmZ1bGxuZXNzLS07Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgaWYgKGRwYi0+bnVtUmVmRnJhbWVzIDwgZHBiLT5tYXhSZWZGcmFtZXMpCi0gICAgewotICAgICAgICBkcGItPmN1cnJlbnRPdXQtPmZyYW1lTnVtID0gZnJhbWVOdW07Ci0gICAgICAgIGRwYi0+Y3VycmVudE91dC0+cGljTnVtICAgPSAoaTMyKWxvbmdUZXJtRnJhbWVJZHg7Ci0gICAgICAgIGRwYi0+Y3VycmVudE91dC0+cGljT3JkZXJDbnQgPSBwaWNPcmRlckNudDsKLSAgICAgICAgZHBiLT5jdXJyZW50T3V0LT5zdGF0dXMgICA9IExPTkdfVEVSTTsKLSAgICAgICAgaWYgKGRwYi0+bm9SZW9yZGVyaW5nKQotICAgICAgICAgICAgZHBiLT5jdXJyZW50T3V0LT50b0JlRGlzcGxheWVkID0gSEFOVFJPX0ZBTFNFOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnRvQmVEaXNwbGF5ZWQgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgZHBiLT5udW1SZWZGcmFtZXMrKzsKLSAgICAgICAgZHBiLT5mdWxsbmVzcysrOwotICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKLSAgICB9Ci0gICAgLyogaWYgdGhlcmUgaXMgbm8gcm9vbSwgcmV0dXJuIGFuIGVycm9yICovCi0gICAgZWxzZQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkTWFya0RlY1JlZlBpYwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBwZXJmb3JtIHJlZmVyZW5jZSBwaWN0dXJlIG1hcmtpbmcgcHJvY2Vzcy4gVGhpcwotICAgICAgICAgICAgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBib3RoIGZvciByZWZlcmVuY2UgYW5kIG5vbi1yZWZlcmVuY2UKLSAgICAgICAgICAgIHBpY3R1cmVzLiAgTm9uLXJlZmVyZW5jZSBwaWN0dXJlcyBzaGFsbCBoYXZlIG1hcmsgcG9pbnRlciBzZXQgdG8KLSAgICAgICAgICAgIE5VTEwuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgZHBiICAgICAgICAgcG9pbnRlciB0byB0aGUgRFBCIGRhdGEgc3RydWN0dXJlCi0gICAgICAgICAgICBtYXJrICAgICAgICBwb2ludGVyIHRvIHJlZmVyZW5jZSBwaWN0dXJlIG1hcmtpbmcgY29tbWFuZHMKLSAgICAgICAgICAgIGltYWdlICAgICAgIHBvaW50ZXIgdG8gY3VycmVudCBwaWN0dXJlIHRvIGJlIHBsYWNlZCBpbiB0aGUgYnVmZmVyCi0gICAgICAgICAgICBmcmFtZU51bSAgICBmcmFtZSBudW1iZXIgb2YgdGhlIGN1cnJlbnQgcGljdHVyZQotICAgICAgICAgICAgcGljT3JkZXJDbnQgcGljdHVyZSBvcmRlciBjb3VudCBmb3IgdGhlIGN1cnJlbnQgcGljdHVyZQotICAgICAgICAgICAgaXNJZHIgICAgICAgZmxhZyB0byBpbmRpY2F0ZSBpZiB0aGUgY3VycmVudCBwaWN0dXJlIGlzIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICBJRFIgcGljdHVyZQotICAgICAgICAgICAgY3VycmVudFBpY0lkICAgIGlkZW50aWZpZXIgZm9yIHRoZSBjdXJyZW50IHBpY3R1cmUsIGZyb20gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24sIHN0b3JlZCBhbG9uZyB3aXRoIHRoZSBwaWN0dXJlCi0gICAgICAgICAgICBudW1FcnJNYnMgICAgICAgbnVtYmVyIG9mIGNvbmNlYWxlZCBtYWNyb2Jsb2NrcyBpbiB0aGUgY3VycmVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUsIHN0b3JlZCBhbG9uZyB3aXRoIHRoZSBwaWN0dXJlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIGRwYiAgICAgICAgICdidWZmZXInIG1vZGlmaWVkLCBwb3NzaWJsZSBvdXRwdXQgZnJhbWVzIHBsYWNlZCBpbnRvCi0gICAgICAgICAgICAgICAgICAgICAgICAnb3V0QnVmJwotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICBzdWNjZXNzCi0gICAgICAgICAgICBIQU5UUk9fTk9LICBmYWlsdXJlCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkTWFya0RlY1JlZlBpYygKLSAgZHBiU3RvcmFnZV90ICpkcGIsCi0gIGRlY1JlZlBpY01hcmtpbmdfdCAqbWFyaywKLSAgaW1hZ2VfdCAqaW1hZ2UsCi0gIHUzMiBmcmFtZU51bSwKLSAgaTMyIHBpY09yZGVyQ250LAotICB1MzIgaXNJZHIsCi0gIHUzMiBjdXJyZW50UGljSWQsCi0gIHUzMiBudW1FcnJNYnMpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGksIHN0YXR1czsKLSAgICB1MzIgbWFya2VkQXNMb25nVGVybTsKLSAgICB1MzIgdG9CZURpc3BsYXllZDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRwYik7Ci0gICAgQVNTRVJUKG1hcmsgfHwgIWlzSWRyKTsKLSAgICBBU1NFUlQoIWlzSWRyIHx8IChmcmFtZU51bSA9PSAwICYmIHBpY09yZGVyQ250ID09IDApKTsKLSAgICBBU1NFUlQoZnJhbWVOdW0gPCBkcGItPm1heEZyYW1lTnVtKTsKLQotICAgIGlmIChpbWFnZS0+ZGF0YSAhPSBkcGItPmN1cnJlbnRPdXQtPmRhdGEpCi0gICAgewotICAgICAgICBFUFJJTlQoIlRSWUlORyBUTyBNQVJLIE5PTi1BTExPQ0FURUQgSU1BR0UiKTsKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLQotICAgIGRwYi0+bGFzdENvbnRhaW5zTW1jbzUgPSBIQU5UUk9fRkFMU0U7Ci0gICAgc3RhdHVzID0gSEFOVFJPX09LOwotCi0gICAgdG9CZURpc3BsYXllZCA9IGRwYi0+bm9SZW9yZGVyaW5nID8gSEFOVFJPX0ZBTFNFIDogSEFOVFJPX1RSVUU7Ci0KLSAgICAvKiBub24tcmVmZXJlbmNlIHBpY3R1cmUsIHN0b3JlZCBmb3IgZGlzcGxheSByZW9yZGVyaW5nIHB1cnBvc2VzICovCi0gICAgaWYgKG1hcmsgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIGRwYi0+Y3VycmVudE91dC0+c3RhdHVzID0gVU5VU0VEOwotICAgICAgICBkcGItPmN1cnJlbnRPdXQtPmZyYW1lTnVtID0gZnJhbWVOdW07Ci0gICAgICAgIGRwYi0+Y3VycmVudE91dC0+cGljTnVtID0gKGkzMilmcmFtZU51bTsKLSAgICAgICAgZHBiLT5jdXJyZW50T3V0LT5waWNPcmRlckNudCA9IHBpY09yZGVyQ250OwotICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnRvQmVEaXNwbGF5ZWQgPSB0b0JlRGlzcGxheWVkOwotICAgICAgICBpZiAoIWRwYi0+bm9SZW9yZGVyaW5nKQotICAgICAgICAgICAgZHBiLT5mdWxsbmVzcysrOwotICAgIH0KLSAgICAvKiBJRFIgcGljdHVyZSAqLwotICAgIGVsc2UgaWYgKGlzSWRyKQotICAgIHsKLQotICAgICAgICAvKiBoMjY0YnNkQ2hlY2tHYXBzSW5GcmFtZU51bSBub3QgY2FsbGVkIGZvciBJRFIgcGljdHVyZXMgLT4gaGF2ZSB0bwotICAgICAgICAgKiByZXNldCBudW1PdXQgYW5kIG91dEluZGV4IGhlcmUgKi8KLSAgICAgICAgZHBiLT5udW1PdXQgPSBkcGItPm91dEluZGV4ID0gMDsKLQotICAgICAgICAvKiBmbHVzaCB0aGUgYnVmZmVyICovCi0gICAgICAgIE1tY29wNShkcGIpOwotICAgICAgICAvKiBpZiBub091dHB1dE9mUHJpb3JQaWNzRmxhZyB3YXMgc2V0IC0+IHRoZSBwaWN0dXJlcyBwcmVjZWRpbmcgdGhlCi0gICAgICAgICAqIElEUiBwaWN0dXJlIHNoYWxsIG5vdCBiZSBvdXRwdXQgLT4gc2V0IG91dHB1dCBidWZmZXIgZW1wdHkgKi8KLSAgICAgICAgaWYgKG1hcmstPm5vT3V0cHV0T2ZQcmlvclBpY3NGbGFnIHx8IGRwYi0+bm9SZW9yZGVyaW5nKQotICAgICAgICB7Ci0gICAgICAgICAgICBkcGItPm51bU91dCA9IDA7Ci0gICAgICAgICAgICBkcGItPm91dEluZGV4ID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtYXJrLT5sb25nVGVybVJlZmVyZW5jZUZsYWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRwYi0+Y3VycmVudE91dC0+c3RhdHVzID0gTE9OR19URVJNOwotICAgICAgICAgICAgZHBiLT5tYXhMb25nVGVybUZyYW1lSWR4ID0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRwYi0+Y3VycmVudE91dC0+c3RhdHVzID0gU0hPUlRfVEVSTTsKLSAgICAgICAgICAgIGRwYi0+bWF4TG9uZ1Rlcm1GcmFtZUlkeCA9IE5PX0xPTkdfVEVSTV9GUkFNRV9JTkRJQ0VTOwotICAgICAgICB9Ci0gICAgICAgIGRwYi0+Y3VycmVudE91dC0+ZnJhbWVOdW0gID0gMDsKLSAgICAgICAgZHBiLT5jdXJyZW50T3V0LT5waWNOdW0gICAgPSAwOwotICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnBpY09yZGVyQ250ID0gMDsKLSAgICAgICAgZHBiLT5jdXJyZW50T3V0LT50b0JlRGlzcGxheWVkID0gdG9CZURpc3BsYXllZDsKLSAgICAgICAgZHBiLT5mdWxsbmVzcyA9IDE7Ci0gICAgICAgIGRwYi0+bnVtUmVmRnJhbWVzID0gMTsKLSAgICB9Ci0gICAgLyogcmVmZXJlbmNlIHBpY3R1cmUgKi8KLSAgICBlbHNlCi0gICAgewotICAgICAgICBtYXJrZWRBc0xvbmdUZXJtID0gSEFOVFJPX0ZBTFNFOwotICAgICAgICBpZiAobWFyay0+YWRhcHRpdmVSZWZQaWNNYXJraW5nTW9kZUZsYWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGkgPSAwOwotICAgICAgICAgICAgd2hpbGUgKG1hcmstPm9wZXJhdGlvbltpXS5tZW1vcnlNYW5hZ2VtZW50Q29udHJvbE9wZXJhdGlvbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKG1hcmstPm9wZXJhdGlvbltpXS5tZW1vcnlNYW5hZ2VtZW50Q29udHJvbE9wZXJhdGlvbikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IE1tY29wMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZHBiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZU51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyay0+b3BlcmF0aW9uW2ldLmRpZmZlcmVuY2VPZlBpY051bXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gTW1jb3AyKGRwYiwgbWFyay0+b3BlcmF0aW9uW2ldLmxvbmdUZXJtUGljTnVtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9ICBNbWNvcDMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRwYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVOdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmstPm9wZXJhdGlvbltpXS5kaWZmZXJlbmNlT2ZQaWNOdW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrLT5vcGVyYXRpb25baV0ubG9uZ1Rlcm1GcmFtZUlkeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBNbWNvcDQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRwYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyay0+b3BlcmF0aW9uW2ldLm1heExvbmdUZXJtRnJhbWVJZHgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gTW1jb3A1KGRwYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkcGItPmxhc3RDb250YWluc01tY281ID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtZU51bSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBNbWNvcDYoCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRwYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVOdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBpY09yZGVyQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrLT5vcGVyYXRpb25baV0ubG9uZ1Rlcm1GcmFtZUlkeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZWRBc0xvbmdUZXJtID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAvKiBpbnZhbGlkIG1lbW9yeSBtYW5hZ2VtZW50IGNvbnRyb2wgb3BlcmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBIQU5UUk9fTk9LOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IFNsaWRpbmdXaW5kb3dSZWZQaWNNYXJraW5nKGRwYik7Ci0gICAgICAgIH0KLSAgICAgICAgLyogaWYgY3VycmVudCBwaWN0dXJlIHdhcyBub3QgbWFya2VkIGFzIGxvbmctdGVybSByZWZlcmVuY2UgYnkKLSAgICAgICAgICogbWVtb3J5IG1hbmFnZW1lbnQgY29udHJvbCBvcGVyYXRpb24gNiAtPiBtYXJrIGN1cnJlbnQgYXMgc2hvcnQKLSAgICAgICAgICogdGVybSBhbmQgaW5zZXJ0IGl0IGludG8gZHBiIChpZiB0aGVyZSBpcyByb29tKSAqLwotICAgICAgICBpZiAoIW1hcmtlZEFzTG9uZ1Rlcm0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkcGItPm51bVJlZkZyYW1lcyA8IGRwYi0+bWF4UmVmRnJhbWVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRwYi0+Y3VycmVudE91dC0+ZnJhbWVOdW0gPSBmcmFtZU51bTsKLSAgICAgICAgICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnBpY051bSAgID0gKGkzMilmcmFtZU51bTsKLSAgICAgICAgICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnBpY09yZGVyQ250ID0gcGljT3JkZXJDbnQ7Ci0gICAgICAgICAgICAgICAgZHBiLT5jdXJyZW50T3V0LT5zdGF0dXMgICA9IFNIT1JUX1RFUk07Ci0gICAgICAgICAgICAgICAgZHBiLT5jdXJyZW50T3V0LT50b0JlRGlzcGxheWVkID0gdG9CZURpc3BsYXllZDsKLSAgICAgICAgICAgICAgICBkcGItPmZ1bGxuZXNzKys7Ci0gICAgICAgICAgICAgICAgZHBiLT5udW1SZWZGcmFtZXMrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIG5vIHJvb20gKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBIQU5UUk9fTk9LOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgZHBiLT5jdXJyZW50T3V0LT5pc0lkciA9IGlzSWRyOwotICAgIGRwYi0+Y3VycmVudE91dC0+cGljSWQgPSBjdXJyZW50UGljSWQ7Ci0gICAgZHBiLT5jdXJyZW50T3V0LT5udW1FcnJNYnMgPSBudW1FcnJNYnM7Ci0KLSAgICAvKiBkcGIgd2FzIGluaXRpYWxpemVkIHRvIG5vdCB0byByZW9yZGVyIHRoZSBwaWN0dXJlcyAtPiBvdXRwdXQgY3VycmVudAotICAgICAqIHBpY3R1cmUgaW1tZWRpYXRlbHkgKi8KLSAgICBpZiAoZHBiLT5ub1Jlb3JkZXJpbmcpCi0gICAgewotICAgICAgICBBU1NFUlQoZHBiLT5udW1PdXQgPT0gMCk7Ci0gICAgICAgIEFTU0VSVChkcGItPm91dEluZGV4ID09IDApOwotICAgICAgICBkcGItPm91dEJ1ZltkcGItPm51bU91dF0uZGF0YSAgPSBkcGItPmN1cnJlbnRPdXQtPmRhdGE7Ci0gICAgICAgIGRwYi0+b3V0QnVmW2RwYi0+bnVtT3V0XS5pc0lkciA9IGRwYi0+Y3VycmVudE91dC0+aXNJZHI7Ci0gICAgICAgIGRwYi0+b3V0QnVmW2RwYi0+bnVtT3V0XS5waWNJZCA9IGRwYi0+Y3VycmVudE91dC0+cGljSWQ7Ci0gICAgICAgIGRwYi0+b3V0QnVmW2RwYi0+bnVtT3V0XS5udW1FcnJNYnMgPSBkcGItPmN1cnJlbnRPdXQtPm51bUVyck1iczsKLSAgICAgICAgZHBiLT5udW1PdXQrKzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogb3V0cHV0IHBpY3R1cmVzIGlmIGJ1ZmZlciBmdWxsICovCi0gICAgICAgIHdoaWxlIChkcGItPmZ1bGxuZXNzID4gZHBiLT5kcGJTaXplKQotICAgICAgICB7Ci0gICAgICAgICAgICBpID0gT3V0cHV0UGljdHVyZShkcGIpOwotICAgICAgICAgICAgQVNTRVJUKGkgPT0gSEFOVFJPX09LKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIHNvcnQgZHBiICovCi0gICAgU2hlbGxTb3J0KGRwYi0+YnVmZmVyLCBkcGItPmRwYlNpemUrMSk7Ci0KLSAgICByZXR1cm4oc3RhdHVzKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RHZXRSZWZQaWNEYXRhCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGdldCByZWZlcmVuY2UgcGljdHVyZSBkYXRhIGZyb20gdGhlIHJlZmVyZW5jZSBwaWN0dXJlCi0gICAgICAgICAgICBsaXN0Ci0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIHBvaW50ZXIgdG8gZGVzaXJlZCByZWZlcmVuY2UgcGljdHVyZSBkYXRhCi0gICAgICAgICAgICBOVUxMIGlmIGludmFsaWQgaW5kZXggb3Igbm9uLWV4aXN0aW5nIHBpY3R1cmUgcmVmZXJyZWQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTgqIGgyNjRic2RHZXRSZWZQaWNEYXRhKGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgaW5kZXgpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0vKiBDb2RlICovCi0KLSAgICBpZihpbmRleCA+IDE2IHx8IGRwYi0+bGlzdFtpbmRleF0gPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuKE5VTEwpOwotICAgIGVsc2UgaWYoIUlTX0VYSVNUSU5HKCpkcGItPmxpc3RbaW5kZXhdKSkKLSAgICAgICAgcmV0dXJuKE5VTEwpOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuKGRwYi0+bGlzdFtpbmRleF0tPmRhdGEpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEFsbG9jYXRlRHBiSW1hZ2UKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgZnVuY3Rpb24gdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBhIGltYWdlLiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90Ci0gICAgICAgICAgICByZWFsbHkgYWxsb2NhdGUgYW55IG1lbW9yeSBidXQgcmVzZXJ2ZXMgb25lIG9mIHRoZSBidWZmZXIKLSAgICAgICAgICAgIHBvc2l0aW9ucyBmb3IgZGVjb2Rpbmcgb2YgY3VycmVudCBwaWN0dXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIHBvaW50ZXIgdG8gbWVtb3J5IGFyZWEgZm9yIHRoZSBpbWFnZQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXU4KiBoMjY0YnNkQWxsb2NhdGVEcGJJbWFnZShkcGJTdG9yYWdlX3QgKmRwYikKLXsKLQotLyogVmFyaWFibGVzICovCi0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVCggIWRwYi0+YnVmZmVyW2RwYi0+ZHBiU2l6ZV0udG9CZURpc3BsYXllZCAmJgotICAgICAgICAgICAgIUlTX1JFRkVSRU5DRShkcGItPmJ1ZmZlcltkcGItPmRwYlNpemVdKSApOwotICAgIEFTU0VSVChkcGItPmZ1bGxuZXNzIDw9ICBkcGItPmRwYlNpemUpOwotCi0gICAgZHBiLT5jdXJyZW50T3V0ID0gZHBiLT5idWZmZXIgKyBkcGItPmRwYlNpemU7Ci0KLSAgICByZXR1cm4oZHBiLT5jdXJyZW50T3V0LT5kYXRhKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IFNsaWRpbmdXaW5kb3dSZWZQaWNNYXJraW5nCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIHBlcmZvcm0gc2xpZGluZyB3aW5kb3cgcmVmZW5jZSBwaWN0dXJlIG1hcmtpbmcgcHJvY2Vzcy4KLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgc3VjY2VzcwotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgZmFpbHVyZSwgbm8gc2hvcnQtdGVybSByZWZlcmVuY2UgZnJhbWUgZm91bmQgdGhhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bGQgYmUgbWFya2VkIHVudXNlZAotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgU2xpZGluZ1dpbmRvd1JlZlBpY01hcmtpbmcoZHBiU3RvcmFnZV90ICpkcGIpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgaTMyIGluZGV4LCBwaWNOdW07Ci0gICAgdTMyIGk7Ci0KLS8qIENvZGUgKi8KLQotICAgIGlmIChkcGItPm51bVJlZkZyYW1lcyA8IGRwYi0+bWF4UmVmRnJhbWVzKQotICAgIHsKLSAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGluZGV4ID0gLTE7Ci0gICAgICAgIHBpY051bSA9IDA7Ci0gICAgICAgIC8qIGZpbmQgdGhlIG9sZGVzdCBzaG9ydCB0ZXJtIHBpY3R1cmUgKi8KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGRwYi0+bnVtUmVmRnJhbWVzOyBpKyspCi0gICAgICAgICAgICBpZiAoSVNfU0hPUlRfVEVSTShkcGItPmJ1ZmZlcltpXSkpCi0gICAgICAgICAgICAgICAgaWYgKGRwYi0+YnVmZmVyW2ldLnBpY051bSA8IHBpY051bSB8fCBpbmRleCA9PSAtMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gKGkzMilpOwotICAgICAgICAgICAgICAgICAgICBwaWNOdW0gPSBkcGItPmJ1ZmZlcltpXS5waWNOdW07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICBpZiAoaW5kZXggPj0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgU0VUX1VOVVNFRChkcGItPmJ1ZmZlcltpbmRleF0pOwotICAgICAgICAgICAgZHBiLT5udW1SZWZGcmFtZXMtLTsKLSAgICAgICAgICAgIGlmICghZHBiLT5idWZmZXJbaW5kZXhdLnRvQmVEaXNwbGF5ZWQpCi0gICAgICAgICAgICAgICAgZHBiLT5mdWxsbmVzcy0tOwotCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RJbml0RHBiCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGluaXRpYWxpemUgRFBCLiBSZXNlcnZlcyBtZW1vcmllcyBmb3IgdGhlIGJ1ZmZlciwKLSAgICAgICAgICAgIHJlZmVyZW5jZSBwaWN0dXJlIGxpc3QgYW5kIG91dHB1dCBidWZmZXIuIGRwYlNpemUgaW5kaWNhdGVzCi0gICAgICAgICAgICB0aGUgbWF4aW11bSBEUEIgc2l6ZSBpbmRpY2F0ZWQgYnkgdGhlIGxldmVsSWRjIGluIHRoZSBzdHJlYW0uCi0gICAgICAgICAgICBJZiBub1Jlb3JkZXJpbmcgZmxhZyBpcyBGQUxTRSB0aGUgRFBCIHN0b3JlcyBkcGJTaXplIHBpY3R1cmVzCi0gICAgICAgICAgICBmb3IgZGlzcGxheSByZW9yZGVyaW5nIHB1cnBvc2VzLiBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdGhlCi0gICAgICAgICAgICBmbGFnIGlzIFRSVUUgdGhlIERQQiBvbmx5IHN0b3JlcyBtYXhSZWZGcmFtZXMgcmVmZXJlbmNlIHBpY3R1cmVzCi0gICAgICAgICAgICBhbmQgb3V0cHV0cyBhbGwgdGhlIHBpY3R1cmVzIGltbWVkaWF0ZWx5LgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBpY1NpemVJbk1icyAgICBwaWN0dXJlIHNpemUgaW4gbWFjcm9ibG9ja3MKLSAgICAgICAgICAgIGRwYlNpemUgICAgICAgICBzaXplIG9mIHRoZSBEUEIgKG51bWJlciBvZiBwaWN0dXJlcykKLSAgICAgICAgICAgIG1heFJlZkZyYW1lcyAgICBtYXggbnVtYmVyIG9mIHJlZmVyZW5jZSBmcmFtZXMKLSAgICAgICAgICAgIG1heEZyYW1lTnVtICAgICBtYXggZnJhbWUgbnVtYmVyCi0gICAgICAgICAgICBub1Jlb3JkZXJpbmcgICAgZmxhZyB0byBpbmRpY2F0ZSB0aGF0IERQQiBkb2VzIG5vdCBoYXZlIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlcGFyZSB0byByZW9yZGVyIGZyYW1lcyBmb3IgZGlzcGxheQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBkcGIgICAgICAgICAgICAgcG9pbnRlciB0byBkcGIgZGF0YSBzdG9yYWdlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBNRU1PUllfQUxMT0NBVElPTl9FUlJPUiBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RJbml0RHBiKAotICBkcGJTdG9yYWdlX3QgKmRwYiwKLSAgdTMyIHBpY1NpemVJbk1icywKLSAgdTMyIGRwYlNpemUsCi0gIHUzMiBtYXhSZWZGcmFtZXMsCi0gIHUzMiBtYXhGcmFtZU51bSwKLSAgdTMyIG5vUmVvcmRlcmluZykKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBpY1NpemVJbk1icyk7Ci0gICAgQVNTRVJUKG1heFJlZkZyYW1lcyA8PSBNQVhfTlVNX1JFRl9QSUNTKTsKLSAgICBBU1NFUlQobWF4UmVmRnJhbWVzIDw9IGRwYlNpemUpOwotICAgIEFTU0VSVChtYXhGcmFtZU51bSk7Ci0gICAgQVNTRVJUKGRwYlNpemUpOwotCi0gICAgLy8gc2VlIGNvbW1lbnQgaW4gbG9vcCBiZWxvdyBhYm91dCBzaXplIGNhbGN1bGF0aW9uCi0gICAgaWYgKHBpY1NpemVJbk1icyA+IChVSU5UMzJfTUFYIC0gMzIgLSAxNSkgLyAzODQpIHsKLSAgICAgICAgQUxPR0UoImIvMjg1MzM1NjIiKTsKLSAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyODUzMzU2MiIpOwotICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOwotICAgIH0KLQotICAgIGRwYi0+bWF4TG9uZ1Rlcm1GcmFtZUlkeCA9IE5PX0xPTkdfVEVSTV9GUkFNRV9JTkRJQ0VTOwotICAgIGRwYi0+bWF4UmVmRnJhbWVzICAgICAgICA9IE1BWChtYXhSZWZGcmFtZXMsIDEpOwotICAgIGlmIChub1Jlb3JkZXJpbmcpCi0gICAgICAgIGRwYi0+ZHBiU2l6ZSAgICAgICAgID0gZHBiLT5tYXhSZWZGcmFtZXM7Ci0gICAgZWxzZQotICAgICAgICBkcGItPmRwYlNpemUgICAgICAgICA9IGRwYlNpemU7Ci0gICAgZHBiLT5tYXhGcmFtZU51bSAgICAgICAgID0gbWF4RnJhbWVOdW07Ci0gICAgZHBiLT5ub1Jlb3JkZXJpbmcgICAgICAgID0gbm9SZW9yZGVyaW5nOwotICAgIGRwYi0+ZnVsbG5lc3MgICAgICAgICAgICA9IDA7Ci0gICAgZHBiLT5udW1SZWZGcmFtZXMgICAgICAgID0gMDsKLSAgICBkcGItPnByZXZSZWZGcmFtZU51bSAgICAgPSAwOwotCi0gICAgQUxMT0NBVEUoZHBiLT5idWZmZXIsIE1BWF9OVU1fUkVGX0lEWF9MMF9BQ1RJVkUgKyAxLCBkcGJQaWN0dXJlX3QpOwotICAgIGlmIChkcGItPmJ1ZmZlciA9PSBOVUxMKQotICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOwotICAgIEgyNjRTd0RlY01lbXNldChkcGItPmJ1ZmZlciwgMCwKLSAgICAgICAgICAgIChNQVhfTlVNX1JFRl9JRFhfTDBfQUNUSVZFICsgMSkqc2l6ZW9mKGRwYlBpY3R1cmVfdCkpOwotICAgIGZvciAoaSA9IDA7IGkgPCBkcGItPmRwYlNpemUgKyAxOyBpKyspCi0gICAgewotICAgICAgICAvKiBBbGxvY2F0ZSBuZWVkZWQgYW1vdW50IG9mIG1lbW9yeSwgd2hpY2ggaXM6Ci0gICAgICAgICAqIGltYWdlIHNpemUgKyAzMiArIDE1LCB3aGVyZSAzMiBjYW1lcyBmcm9tIHRoZSBmYWN0IHRoYXQgaW4gQVJNIE9wZW5NYXgKLSAgICAgICAgICogREwgaW1wbGVtZW50YXRpb24gRnVuY3Rpb25zIG1heSByZWFkIGJleW9uZCB0aGUgZW5kIG9mIGFuIGFycmF5LAotICAgICAgICAgKiBieSBhIG1heGltdW0gb2YgMzIgYnl0ZXMuIEFuZCArMTUgY2FtZXMgZm9yIHRoZSBuZWVkIHRvIGFsaWduIG1lbW9yeQotICAgICAgICAgKiB0byAxNi1ieXRlIGJvdW5kYXJ5ICovCi0gICAgICAgIEFMTE9DQVRFKGRwYi0+YnVmZmVyW2ldLnBBbGxvY2F0ZWREYXRhLCAocGljU2l6ZUluTWJzKjM4NCArIDMyKzE1KSwgdTgpOwotICAgICAgICBpZiAoZHBiLT5idWZmZXJbaV0ucEFsbG9jYXRlZERhdGEgPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7Ci0KLSAgICAgICAgZHBiLT5idWZmZXJbaV0uZGF0YSA9IEFMSUdOKGRwYi0+YnVmZmVyW2ldLnBBbGxvY2F0ZWREYXRhLCAxNik7Ci0gICAgfQotCi0gICAgQUxMT0NBVEUoZHBiLT5saXN0LCBNQVhfTlVNX1JFRl9JRFhfTDBfQUNUSVZFICsgMSwgZHBiUGljdHVyZV90Kik7Ci0gICAgQUxMT0NBVEUoZHBiLT5vdXRCdWYsIGRwYi0+ZHBiU2l6ZSsxLCBkcGJPdXRQaWN0dXJlX3QpOwotCi0gICAgaWYgKGRwYi0+bGlzdCA9PSBOVUxMIHx8IGRwYi0+b3V0QnVmID09IE5VTEwpCi0gICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7Ci0KLSAgICBIMjY0U3dEZWNNZW1zZXQoZHBiLT5saXN0LCAwLAotICAgICAgICAgICAgKChNQVhfTlVNX1JFRl9JRFhfTDBfQUNUSVZFICsgMSkgKiBzaXplb2YoZHBiUGljdHVyZV90KikpICk7Ci0KLSAgICBkcGItPm51bU91dCA9IGRwYi0+b3V0SW5kZXggPSAwOwotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkUmVzZXREcGIKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gcmVzZXQgRFBCLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2hlbiBhbiBJRFIKLSAgICAgICAgICAgIHNsaWNlIChvdGhlciB0aGFuIHRoZSBmaXJzdCkgYWN0aXZhdGVzIG5ldyBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0LgotICAgICAgICAgICAgRnVuY3Rpb24gY2FsbHMgaDI2NGJzZEZyZWVEcGIgdG8gZnJlZSBvbGQgYWxsb2NhdGVkIG1lbW9yaWVzIGFuZAotICAgICAgICAgICAgaDI2NGJzZEluaXREcGIgdG8gcmUtaW5pdGlhbGl6ZSB0aGUgRFBCLiBTYW1lIGlucHV0cywgb3V0cHV0cyBhbmQKLSAgICAgICAgICAgIHJldHVybnMgYXMgZm9yIGgyNjRic2RJbml0RHBiLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZFJlc2V0RHBiKAotICBkcGJTdG9yYWdlX3QgKmRwYiwKLSAgdTMyIHBpY1NpemVJbk1icywKLSAgdTMyIGRwYlNpemUsCi0gIHUzMiBtYXhSZWZGcmFtZXMsCi0gIHUzMiBtYXhGcmFtZU51bSwKLSAgdTMyIG5vUmVvcmRlcmluZykKLXsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBpY1NpemVJbk1icyk7Ci0gICAgQVNTRVJUKG1heFJlZkZyYW1lcyA8PSBNQVhfTlVNX1JFRl9QSUNTKTsKLSAgICBBU1NFUlQobWF4UmVmRnJhbWVzIDw9IGRwYlNpemUpOwotICAgIEFTU0VSVChtYXhGcmFtZU51bSk7Ci0gICAgQVNTRVJUKGRwYlNpemUpOwotCi0gICAgaDI2NGJzZEZyZWVEcGIoZHBiKTsKLQotICAgIHJldHVybiBoMjY0YnNkSW5pdERwYihkcGIsIHBpY1NpemVJbk1icywgZHBiU2l6ZSwgbWF4UmVmRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhGcmFtZU51bSwgbm9SZW9yZGVyaW5nKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkSW5pdFJlZlBpY0xpc3QKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSByZWZlcmVuY2UgcGljdHVyZSBsaXN0LiBGdW5jdGlvbiBqdXN0Ci0gICAgICAgICAgICBzZXRzIHBvaW50ZXJzIGluIHRoZSBsaXN0IGFjY29yZGluZyB0byBwaWN0dXJlcyBpbiB0aGUgYnVmZmVyLgotICAgICAgICAgICAgVGhlIGJ1ZmZlciBpcyBhc3N1bWVkIHRvIGNvbnRhaW4gcGljdHVyZXMgc29ydGVkIGFjY29yZGluZyB0bwotICAgICAgICAgICAgd2hhdCB0aGUgSC4yNjQgc3RhbmRhcmQgc2F5cyBhYm91dCBpbml0aWFsIHJlZmVyZW5jZSBwaWN0dXJlIGxpc3QuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgZHBiICAgICBwb2ludGVyIHRvIGRwYiBkYXRhIHN0cnVjdHVyZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBkcGIgICAgICdsaXN0JyBmaWVsZCBpbml0aWFsaXplZAotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBub25lCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgaDI2NGJzZEluaXRSZWZQaWNMaXN0KGRwYlN0b3JhZ2VfdCAqZHBiKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpOwotCi0vKiBDb2RlICovCi0KLSAgICBmb3IgKGkgPSAwOyBpIDwgZHBiLT5udW1SZWZGcmFtZXM7IGkrKykKLSAgICAgICAgZHBiLT5saXN0W2ldID0gJmRwYi0+YnVmZmVyW2ldOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRmluZERwYlBpYwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBmaW5kIGEgcmVmZXJlbmNlIHBpY3R1cmUgZnJvbSB0aGUgYnVmZmVyLiBUaGUgcGljdHVyZQotICAgICAgICAgICAgdG8gYmUgZm91bmQgaXMgaWRlbnRpZmllZCBieSBwaWNOdW0gYW5kIGlzU2hvcnRUZXJtIGZsYWcuCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIGluZGV4IG9mIHRoZSBwaWN0dXJlIGluIHRoZSBidWZmZXIKLSAgICAgICAgICAgIC0xIGlmIHRoZSBzcGVjaWZpZWQgcGljdHVyZSB3YXMgbm90IGZvdW5kIGluIHRoZSBidWZmZXIKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGkzMiBGaW5kRHBiUGljKGRwYlN0b3JhZ2VfdCAqZHBiLCBpMzIgcGljTnVtLCB1MzIgaXNTaG9ydFRlcm0pCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGkgPSAwOwotICAgIHUzMiBmb3VuZCA9IEhBTlRST19GQUxTRTsKLQotLyogQ29kZSAqLwotCi0gICAgaWYgKGlzU2hvcnRUZXJtKQotICAgIHsKLSAgICAgICAgd2hpbGUgKGkgPCBkcGItPm1heFJlZkZyYW1lcyAmJiAhZm91bmQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChJU19TSE9SVF9URVJNKGRwYi0+YnVmZmVyW2ldKSAmJgotICAgICAgICAgICAgICBkcGItPmJ1ZmZlcltpXS5waWNOdW0gPT0gcGljTnVtKQotICAgICAgICAgICAgICAgIGZvdW5kID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgaSsrOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIEFTU0VSVChwaWNOdW0gPj0gMCk7Ci0gICAgICAgIHdoaWxlIChpIDwgZHBiLT5tYXhSZWZGcmFtZXMgJiYgIWZvdW5kKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoSVNfTE9OR19URVJNKGRwYi0+YnVmZmVyW2ldKSAmJgotICAgICAgICAgICAgICBkcGItPmJ1ZmZlcltpXS5waWNOdW0gPT0gcGljTnVtKQotICAgICAgICAgICAgICAgIGZvdW5kID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgaSsrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGZvdW5kKQotICAgICAgICByZXR1cm4oKGkzMilpKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybigtMSk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBTZXRQaWNOdW1zCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIHNldCBwaWNOdW0gdmFsdWVzIGZvciBzaG9ydC10ZXJtIHBpY3R1cmVzIGluIHRoZQotICAgICAgICAgICAgYnVmZmVyLiBOdW1iZXJpbmcgb2YgcGljdHVyZXMgaXMgYmFzZWQgb24gZnJhbWUgbnVtYmVycyBhbmQgYXMKLSAgICAgICAgICAgIGZyYW1lIG51bWJlcnMgYXJlIG1vZHVsbyBtYXhGcmFtZU51bSAtPiBmcmFtZSBudW1iZXJzIG9mIG9sZGVyCi0gICAgICAgICAgICBwaWN0dXJlcyBpbiB0aGUgYnVmZmVyIG1heSBiZSBiaWdnZXIgdGhhbiB0aGUgY3VyckZyYW1lTnVtLgotICAgICAgICAgICAgcGljTnVtcyB3aWxsIGJlIHNldCBzbyB0aGF0IGN1cnJlbnQgZnJhbWUgaGFzIHRoZSBsYXJnZXN0IHBpY051bQotICAgICAgICAgICAgYW5kIGFsbCB0aGUgc2hvcnQtdGVybSBmcmFtZXMgaW4gdGhlIGJ1ZmZlciB3aWxsIGdldCBzbWFsbGVyIHBpY051bQotICAgICAgICAgICAgcmVwcmVzZW50aW5nIHRoZWlyICJkaXN0YW5jZSIgZnJvbSB0aGUgY3VycmVudCBmcmFtZS4gVGhpcwotICAgICAgICAgICAgZnVuY3Rpb24ga2luZCBvZiBtYXBzIHRoZSBtb2R1bG8gYXJpdGhtZXRpYyBiYWNrIHRvIG5vcm1hbC4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHZvaWQgU2V0UGljTnVtcyhkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIGN1cnJGcmFtZU51bSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaTsKLSAgICBpMzIgZnJhbWVOdW1XcmFwOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZHBiKTsKLSAgICBBU1NFUlQoY3VyckZyYW1lTnVtIDwgZHBiLT5tYXhGcmFtZU51bSk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgZHBiLT5udW1SZWZGcmFtZXM7IGkrKykKLSAgICAgICAgaWYgKElTX1NIT1JUX1RFUk0oZHBiLT5idWZmZXJbaV0pKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZHBiLT5idWZmZXJbaV0uZnJhbWVOdW0gPiBjdXJyRnJhbWVOdW0pCi0gICAgICAgICAgICAgICAgZnJhbWVOdW1XcmFwID0KLSAgICAgICAgICAgICAgICAgICAgKGkzMilkcGItPmJ1ZmZlcltpXS5mcmFtZU51bSAtIChpMzIpZHBiLT5tYXhGcmFtZU51bTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBmcmFtZU51bVdyYXAgPSAoaTMyKWRwYi0+YnVmZmVyW2ldLmZyYW1lTnVtOwotICAgICAgICAgICAgZHBiLT5idWZmZXJbaV0ucGljTnVtID0gZnJhbWVOdW1XcmFwOwotICAgICAgICB9Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkQ2hlY2tHYXBzSW5GcmFtZU51bQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBjaGVjayBnYXBzIGluIGZyYW1lX251bSBhbmQgZ2VuZXJhdGUgbm9uLWV4aXN0aW5nCi0gICAgICAgICAgICAoc2hvcnQgdGVybSkgcmVmZXJlbmNlIHBpY3R1cmVzIGlmIG5lY2Vzc2FyeS4gVGhpcyBmdW5jdGlvbiBzaG91bGQKLSAgICAgICAgICAgIGJlIGNhbGxlZCBvbmx5IGZvciBub24tSURSIHBpY3R1cmVzLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIGRwYiAgICAgICAgIHBvaW50ZXIgdG8gZHBiIGRhdGEgc3RydWN0dXJlCi0gICAgICAgICAgICBmcmFtZU51bSAgICBmcmFtZSBudW1iZXIgb2YgdGhlIGN1cnJlbnQgcGljdHVyZQotICAgICAgICAgICAgaXNSZWZQaWMgICAgZmxhZyB0byBpbmRpY2F0ZSBpZiBjdXJyZW50IHBpY3R1cmUgaXMgYSByZWZlcmVuY2Ugb3IKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vbi1yZWZlcmVuY2UgcGljdHVyZQotICAgICAgICAgICAgZ2Fwc0FsbG93ZWQgRmxhZyB3aGljaCBpbmRpY2F0ZXMgYWN0aXZlIFNQUyBzdGFuY2Ugb24gd2hldGhlcgotICAgICAgICAgICAgICAgICAgICAgICAgdG8gYWxsb3cgZ2FwcwotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBkcGIgICAgICAgICAnYnVmZmVyJyBwb3NzaWJseSBtb2RpZmllZCBieSBpbnNlcnRpbmcgbm9uLWV4aXN0aW5nCi0gICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlcyB3aXRoIHNsaWRpbmcgd2luZG93IG1hcmtpbmcgcHJvY2VzcwotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICBzdWNjZXNzCi0gICAgICAgICAgICBIQU5UUk9fTk9LICBlcnJvciBpbiBzbGlkaW5nIHdpbmRvdyByZWZlcmVuY2UgcGljdHVyZSBtYXJraW5nIG9yCi0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtZU51bSBlcXVhbCB0byBwcmV2aW91cyByZWZlcmVuY2UgZnJhbWUgdXNlZCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgIGEgcmVmZXJlbmNlIHBpY3R1cmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RDaGVja0dhcHNJbkZyYW1lTnVtKGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgZnJhbWVOdW0sIHUzMiBpc1JlZlBpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgZ2Fwc0FsbG93ZWQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHVuVXNlZFNob3J0VGVybUZyYW1lTnVtOwotICAgIHU4ICp0bXA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkcGIpOwotICAgIEFTU0VSVChkcGItPmZ1bGxuZXNzIDw9IGRwYi0+ZHBiU2l6ZSk7Ci0gICAgQVNTRVJUKGZyYW1lTnVtIDwgZHBiLT5tYXhGcmFtZU51bSk7Ci0KLSAgICBkcGItPm51bU91dCA9IDA7Ci0gICAgZHBiLT5vdXRJbmRleCA9IDA7Ci0KLSAgICBpZighZ2Fwc0FsbG93ZWQpCi0gICAgICAgIHJldHVybihIQU5UUk9fT0spOwotCi0gICAgaWYgKCAoZnJhbWVOdW0gIT0gZHBiLT5wcmV2UmVmRnJhbWVOdW0pICYmCi0gICAgICAgICAoZnJhbWVOdW0gIT0gKChkcGItPnByZXZSZWZGcmFtZU51bSArIDEpICUgZHBiLT5tYXhGcmFtZU51bSkpKQotICAgIHsKLQotICAgICAgICB1blVzZWRTaG9ydFRlcm1GcmFtZU51bSA9IChkcGItPnByZXZSZWZGcmFtZU51bSArIDEpICUgZHBiLT5tYXhGcmFtZU51bTsKLQotICAgICAgICAvKiBzdG9yZSBkYXRhIHBvaW50ZXIgb2YgbGFzdCBidWZmZXIgcG9zaXRpb24gdG8gYmUgdXNlZCBhcyBuZXh0Ci0gICAgICAgICAqICJhbGxvY2F0ZWQiIGRhdGEgcG9pbnRlciBpZiBsYXN0IGJ1ZmZlciBwb3NpdGlvbiBhZnRlciB0aGlzIHByb2Nlc3MKLSAgICAgICAgICogY29udGFpbnMgZGF0YSBwb2ludGVyIGxvY2F0ZWQgaW4gb3V0QnVmIChidWZmZXIgcGxhY2VkIGluIHRoZSBvdXRwdXQKLSAgICAgICAgICogc2hhbGwgbm90IGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBjdXJyZW50IHBpY3R1cmUpICovCi0gICAgICAgIHRtcCA9IGRwYi0+YnVmZmVyW2RwYi0+ZHBiU2l6ZV0uZGF0YTsKLSAgICAgICAgZG8KLSAgICAgICAgewotICAgICAgICAgICAgU2V0UGljTnVtcyhkcGIsIHVuVXNlZFNob3J0VGVybUZyYW1lTnVtKTsKLQotICAgICAgICAgICAgaWYgKFNsaWRpbmdXaW5kb3dSZWZQaWNNYXJraW5nKGRwYikgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogb3V0cHV0IHBpY3R1cmVzIGlmIGJ1ZmZlciBmdWxsICovCi0gICAgICAgICAgICB3aGlsZSAoZHBiLT5mdWxsbmVzcyA+PSBkcGItPmRwYlNpemUpCi0gICAgICAgICAgICB7Ci0jaWZkZWYgX0FTU0VSVF9VU0VECi0gICAgICAgICAgICAgICAgQVNTRVJUKCFkcGItPm5vUmVvcmRlcmluZyk7Ci0gICAgICAgICAgICAgICAgQVNTRVJUKE91dHB1dFBpY3R1cmUoZHBiKSA9PSBIQU5UUk9fT0spOwotI2Vsc2UKLSAgICAgICAgICAgICAgICBPdXRwdXRQaWN0dXJlKGRwYik7Ci0jZW5kaWYKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogYWRkIHRvIGVuZCBvZiBsaXN0ICovCi0gICAgICAgICAgICBBU1NFUlQoICFkcGItPmJ1ZmZlcltkcGItPmRwYlNpemVdLnRvQmVEaXNwbGF5ZWQgJiYKLSAgICAgICAgICAgICAgICAgICAgIUlTX1JFRkVSRU5DRShkcGItPmJ1ZmZlcltkcGItPmRwYlNpemVdKSApOwotICAgICAgICAgICAgZHBiLT5idWZmZXJbZHBiLT5kcGJTaXplXS5zdGF0dXMgPSBOT05fRVhJU1RJTkc7Ci0gICAgICAgICAgICBkcGItPmJ1ZmZlcltkcGItPmRwYlNpemVdLmZyYW1lTnVtID0gdW5Vc2VkU2hvcnRUZXJtRnJhbWVOdW07Ci0gICAgICAgICAgICBkcGItPmJ1ZmZlcltkcGItPmRwYlNpemVdLnBpY051bSAgID0gKGkzMil1blVzZWRTaG9ydFRlcm1GcmFtZU51bTsKLSAgICAgICAgICAgIGRwYi0+YnVmZmVyW2RwYi0+ZHBiU2l6ZV0ucGljT3JkZXJDbnQgPSAwOwotICAgICAgICAgICAgZHBiLT5idWZmZXJbZHBiLT5kcGJTaXplXS50b0JlRGlzcGxheWVkID0gSEFOVFJPX0ZBTFNFOwotICAgICAgICAgICAgZHBiLT5mdWxsbmVzcysrOwotICAgICAgICAgICAgZHBiLT5udW1SZWZGcmFtZXMrKzsKLQotICAgICAgICAgICAgLyogc29ydCB0aGUgYnVmZmVyICovCi0gICAgICAgICAgICBTaGVsbFNvcnQoZHBiLT5idWZmZXIsIGRwYi0+ZHBiU2l6ZSsxKTsKLQotICAgICAgICAgICAgdW5Vc2VkU2hvcnRUZXJtRnJhbWVOdW0gPSAodW5Vc2VkU2hvcnRUZXJtRnJhbWVOdW0gKyAxKSAlCi0gICAgICAgICAgICAgICAgZHBiLT5tYXhGcmFtZU51bTsKLQotICAgICAgICB9IHdoaWxlICh1blVzZWRTaG9ydFRlcm1GcmFtZU51bSAhPSBmcmFtZU51bSk7Ci0KLSAgICAgICAgLyogcGljdHVyZXMgcGxhY2VkIGluIG91dHB1dCBidWZmZXIgLT4gY2hlY2sgdGhhdCAnZGF0YScgaW4KLSAgICAgICAgICogYnVmZmVyIHBvc2l0aW9uIGRwYlNpemUgaXMgbm90IGluIHRoZSBvdXRwdXQgYnVmZmVyICh0aGlzIHdpbGwgYmUKLSAgICAgICAgICogImFsbG9jYXRlZCIgYnkgaDI2NGJzZEFsbG9jYXRlRHBiSW1hZ2UpLiBJZiBpdCBpcyAtPiBleGNoYW5nZSBkYXRhCi0gICAgICAgICAqIHBvaW50ZXIgd2l0aCB0aGUgb25lIHN0b3JlZCBpbiB0aGUgYmVnaW5uaW5nICovCi0gICAgICAgIGlmIChkcGItPm51bU91dCkKLSAgICAgICAgewotICAgICAgICAgICAgdTMyIGk7Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkcGItPm51bU91dDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChkcGItPm91dEJ1ZltpXS5kYXRhID09IGRwYi0+YnVmZmVyW2RwYi0+ZHBiU2l6ZV0uZGF0YSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGZpbmQgYnVmZmVyIHBvc2l0aW9uIGNvbnRhaW5pbmcgZGF0YSBwb2ludGVyIHN0b3JlZCBpbgotICAgICAgICAgICAgICAgICAgICAgKiB0bXAgKi8KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRwYi0+ZHBiU2l6ZTsgaSsrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHBiLT5idWZmZXJbaV0uZGF0YSA9PSB0bXApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHBiLT5idWZmZXJbaV0uZGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwYi0+YnVmZmVyW2RwYi0+ZHBiU2l6ZV0uZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcGItPmJ1ZmZlcltkcGItPmRwYlNpemVdLmRhdGEgPSB0bXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgQVNTRVJUKGkgPCBkcGItPmRwYlNpemUpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyogZnJhbWVOdW0gZm9yIHJlZmVyZW5jZSBwaWN0dXJlcyBzaGFsbCBub3QgYmUgdGhlIHNhbWUgYXMgZm9yIHByZXZpb3VzCi0gICAgICogcmVmZXJlbmNlIHBpY3R1cmUsIG90aGVyd2lzZSBhY2Nlc3NlcyB0byBwaWN0dXJlcyBpbiB0aGUgYnVmZmVyIGNhbm5vdAotICAgICAqIGJlIHNvbHZlZCB1bmFtYmlndW91c2x5ICovCi0gICAgZWxzZSBpZiAoaXNSZWZQaWMgJiYgZnJhbWVOdW0gPT0gZHBiLT5wcmV2UmVmRnJhbWVOdW0pCi0gICAgewotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotCi0gICAgLyogc2F2ZSBjdXJyZW50IGZyYW1lX251bSBpbiBwcmV2UmVmRnJhbWVOdW0uIEZvciBub24tcmVmZXJlbmNlIGZyYW1lCi0gICAgICogcHJldkZyYW1lTnVtIGlzIHNldCB0byBmcmFtZSBudW1iZXIgb2YgbGFzdCBub24tZXhpc3RpbmcgZnJhbWUgYWJvdmUgKi8KLSAgICBpZiAoaXNSZWZQaWMpCi0gICAgICAgIGRwYi0+cHJldlJlZkZyYW1lTnVtID0gZnJhbWVOdW07Ci0gICAgZWxzZSBpZiAoZnJhbWVOdW0gIT0gZHBiLT5wcmV2UmVmRnJhbWVOdW0pCi0gICAgewotICAgICAgICBkcGItPnByZXZSZWZGcmFtZU51bSA9Ci0gICAgICAgICAgICAoZnJhbWVOdW0gKyBkcGItPm1heEZyYW1lTnVtIC0gMSkgJSBkcGItPm1heEZyYW1lTnVtOwotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRmluZFNtYWxsZXN0UGljT3JkZXJDbnQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gZmluZCBwaWN0dXJlIHdpdGggc21hbGxlc3QgcGljdHVyZSBvcmRlciBjb3VudC4gVGhpcwotICAgICAgICAgICAgd2lsbCBiZSB0aGUgbmV4dCBwaWN0dXJlIGluIGRpc3BsYXkgb3JkZXIuCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIHBpY3R1cmUsIE5VTEwgaWYgbm8gcGljdHVyZXMgdG8gYmUgZGlzcGxheWVkCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWRwYlBpY3R1cmVfdCogRmluZFNtYWxsZXN0UGljT3JkZXJDbnQoZHBiU3RvcmFnZV90ICpkcGIpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGk7Ci0gICAgaTMyIHBpY09yZGVyQ250OwotICAgIGRwYlBpY3R1cmVfdCAqdG1wOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZHBiKTsKLQotICAgIHBpY09yZGVyQ250ID0gMHg3RkZGRkZGRjsKLSAgICB0bXAgPSBOVUxMOwotCi0gICAgZm9yIChpID0gMDsgaSA8PSBkcGItPmRwYlNpemU7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChkcGItPmJ1ZmZlcltpXS50b0JlRGlzcGxheWVkICYmCi0gICAgICAgICAgICAoZHBiLT5idWZmZXJbaV0ucGljT3JkZXJDbnQgPCBwaWNPcmRlckNudCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcCA9IGRwYi0+YnVmZmVyICsgaTsKLSAgICAgICAgICAgIHBpY09yZGVyQ250ID0gZHBiLT5idWZmZXJbaV0ucGljT3JkZXJDbnQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4odG1wKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IE91dHB1dFBpY3R1cmUKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gcHV0IG5leHQgZGlzcGxheSBvcmRlciBwaWN0dXJlIGludG8gdGhlIG91dHB1dCBidWZmZXIuCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgIG5vIHBpY3R1cmVzIHRvIGRpc3BsYXkKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIE91dHB1dFBpY3R1cmUoZHBiU3RvcmFnZV90ICpkcGIpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgZHBiUGljdHVyZV90ICp0bXA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkcGIpOwotCi0gICAgaWYgKGRwYi0+bm9SZW9yZGVyaW5nKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICB0bXAgPSBGaW5kU21hbGxlc3RQaWNPcmRlckNudChkcGIpOwotCi0gICAgLyogbm8gcGljdHVyZXMgdG8gYmUgZGlzcGxheWVkICovCi0gICAgaWYgKHRtcCA9PSBOVUxMKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICBkcGItPm91dEJ1ZltkcGItPm51bU91dF0uZGF0YSAgPSB0bXAtPmRhdGE7Ci0gICAgZHBiLT5vdXRCdWZbZHBiLT5udW1PdXRdLmlzSWRyID0gdG1wLT5pc0lkcjsKLSAgICBkcGItPm91dEJ1ZltkcGItPm51bU91dF0ucGljSWQgPSB0bXAtPnBpY0lkOwotICAgIGRwYi0+b3V0QnVmW2RwYi0+bnVtT3V0XS5udW1FcnJNYnMgPSB0bXAtPm51bUVyck1iczsKLSAgICBkcGItPm51bU91dCsrOwotCi0gICAgdG1wLT50b0JlRGlzcGxheWVkID0gSEFOVFJPX0ZBTFNFOwotICAgIGlmICghSVNfUkVGRVJFTkNFKCp0bXApKQotICAgIHsKLSAgICAgICAgZHBiLT5mdWxsbmVzcy0tOwotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZERwYk91dHB1dFBpY3R1cmUKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gZ2V0IG5leHQgZGlzcGxheSBvcmRlciBwaWN0dXJlIGZyb20gdGhlIG91dHB1dCBidWZmZXIuCi0KLSAgICAgICAgUmV0dXJuOgotICAgICAgICAgICAgcG9pbnRlciB0byBvdXRwdXQgcGljdHVyZSBzdHJ1Y3R1cmUsIE5VTEwgaWYgbm8gcGljdHVyZXMgdG8KLSAgICAgICAgICAgIGRpc3BsYXkKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotZHBiT3V0UGljdHVyZV90KiBoMjY0YnNkRHBiT3V0cHV0UGljdHVyZShkcGJTdG9yYWdlX3QgKmRwYikKLXsKLQotLyogVmFyaWFibGVzICovCi0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkcGIpOwotCi0gICAgaWYgKGRwYi0+b3V0SW5kZXggPCBkcGItPm51bU91dCkKLSAgICAgICAgcmV0dXJuKGRwYi0+b3V0QnVmICsgZHBiLT5vdXRJbmRleCsrKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybihOVUxMKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RGbHVzaERwYgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBmbHVzaCB0aGUgRFBCLiBGdW5jdGlvbiBwdXRzIGFsbCBwaWN0dXJlcyBuZWVkZWQgZm9yCi0gICAgICAgICAgICBkaXNwbGF5IGludG8gdGhlIG91dHB1dCBidWZmZXIuIFRoaXMgZnVuY3Rpb24gc2hhbGwgYmUgY2FsbGVkIGluCi0gICAgICAgICAgICB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gdG8gb2J0YWluIHBpY3R1cmVzIGJ1ZmZlcmVkIGZvciBkaXNwbGF5Ci0gICAgICAgICAgICByZS1vcmRlcmluZyBwdXJwb3Nlcy4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBoMjY0YnNkRmx1c2hEcGIoZHBiU3RvcmFnZV90ICpkcGIpCi17Ci0KLSAgICAvKiBkb24ndCBkbyBhbnl0aGluZyBpZiBidWZmZXIgbm90IHJlc2VydmVkICovCi0gICAgaWYgKGRwYi0+YnVmZmVyKQotICAgIHsKLSAgICAgICAgZHBiLT5mbHVzaGVkID0gMTsKLSAgICAgICAgLyogb3V0cHV0IGFsbCBwaWN0dXJlcyAqLwotICAgICAgICB3aGlsZSAoT3V0cHV0UGljdHVyZShkcGIpID09IEhBTlRST19PSykKLSAgICAgICAgICAgIDsKLSAgICB9Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkRnJlZURwYgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBmcmVlIG1lbW9yaWVzIHJlc2VydmVkIGZvciB0aGUgRFBCLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIGgyNjRic2RGcmVlRHBiKGRwYlN0b3JhZ2VfdCAqZHBiKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZHBiKTsKLQotICAgIGlmIChkcGItPmJ1ZmZlcikKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBkcGItPmRwYlNpemUrMTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBGUkVFKGRwYi0+YnVmZmVyW2ldLnBBbGxvY2F0ZWREYXRhKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBGUkVFKGRwYi0+YnVmZmVyKTsKLSAgICBGUkVFKGRwYi0+bGlzdCk7Ci0gICAgRlJFRShkcGItPm91dEJ1Zik7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBTaGVsbFNvcnQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgU29ydCBwaWN0dXJlcyBpbiB0aGUgYnVmZmVyLiBGdW5jdGlvbiBpbXBsZW1lbnRzIFNoZWxsJ3MgbWV0aG9kLAotICAgICAgICAgICAgaS5lLiBkaW1pbmlzaGluZyBpbmNyZW1lbnQgc29ydC4gU2VlIGUuZy4gIk51bWVyaWNhbCBSZWNpcGVzIGluIEMiCi0gICAgICAgICAgICBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHZvaWQgU2hlbGxTb3J0KGRwYlBpY3R1cmVfdCAqcFBpYywgdTMyIG51bSkKLXsKLQotICAgIHUzMiBpLCBqOwotICAgIHUzMiBzdGVwOwotICAgIGRwYlBpY3R1cmVfdCB0bXBQaWM7Ci0KLSAgICBzdGVwID0gNzsKLQotICAgIHdoaWxlIChzdGVwKQotICAgIHsKLSAgICAgICAgZm9yIChpID0gc3RlcDsgaSA8IG51bTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXBQaWMgPSBwUGljW2ldOwotICAgICAgICAgICAgaiA9IGk7Ci0gICAgICAgICAgICB3aGlsZSAoaiA+PSBzdGVwICYmIENvbXBhcmVQaWN0dXJlcyhwUGljICsgaiAtIHN0ZXAsICZ0bXBQaWMpID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwUGljW2pdID0gcFBpY1tqLXN0ZXBdOwotICAgICAgICAgICAgICAgIGogLT0gc3RlcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBQaWNbal0gPSB0bXBQaWM7Ci0gICAgICAgIH0KLSAgICAgICAgc3RlcCA+Pj0gMTsKLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RwYi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RwYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTI1MDg0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kcGIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotICAgIDMuIERhdGEgdHlwZXMKLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSDI2NFNXREVDX0RQQl9ICi0jZGVmaW5lIEgyNjRTV0RFQ19EUEJfSAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zbGljZV9oZWFkZXIuaCIKLSNpbmNsdWRlICJoMjY0YnNkX2ltYWdlLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gRGF0YSB0eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogZW51bWVyYXRpb24gdG8gcmVwcmVzZW50IHN0YXR1cyBvZiBidWZmZXJlZCBpbWFnZSAqLwotdHlwZWRlZiBlbnVtIHsKLSAgICBVTlVTRUQgPSAwLAotICAgIE5PTl9FWElTVElORywKLSAgICBTSE9SVF9URVJNLAotICAgIExPTkdfVEVSTQotfSBkcGJQaWN0dXJlU3RhdHVzX2U7Ci0KLS8qIHN0cnVjdHVyZSB0byByZXByZXNlbnQgYSBidWZmZXJlZCBwaWN0dXJlICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdTggKmRhdGE7ICAgICAgICAgICAvKiAxNi1ieXRlIGFsaWduZWQgcG9pbnRlciBvZiBwQWxsb2NhdGVkRGF0YSAqLwotICAgIHU4ICpwQWxsb2NhdGVkRGF0YTsgLyogYWxsb2NhdGVkIHBpY3R1cmUgcG9pbnRlcjsgKHNpemUgKyAxNSkgYnl0ZXMgKi8KLSAgICBpMzIgcGljTnVtOwotICAgIHUzMiBmcmFtZU51bTsKLSAgICBpMzIgcGljT3JkZXJDbnQ7Ci0gICAgZHBiUGljdHVyZVN0YXR1c19lIHN0YXR1czsKLSAgICB1MzIgdG9CZURpc3BsYXllZDsKLSAgICB1MzIgcGljSWQ7Ci0gICAgdTMyIG51bUVyck1iczsKLSAgICB1MzIgaXNJZHI7Ci19IGRwYlBpY3R1cmVfdDsKLQotLyogc3RydWN0dXJlIHRvIHJlcHJlc2VudCBkaXNwbGF5IGltYWdlIG91dHB1dCBmcm9tIHRoZSBidWZmZXIgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1OCAqZGF0YTsKLSAgICB1MzIgcGljSWQ7Ci0gICAgdTMyIG51bUVyck1iczsKLSAgICB1MzIgaXNJZHI7Ci19IGRwYk91dFBpY3R1cmVfdDsKLQotLyogc3RydWN0dXJlIHRvIHJlcHJlc2VudCBEUEIgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBkcGJQaWN0dXJlX3QgKmJ1ZmZlcjsKLSAgICBkcGJQaWN0dXJlX3QgKipsaXN0OwotICAgIGRwYlBpY3R1cmVfdCAqY3VycmVudE91dDsKLSAgICBkcGJPdXRQaWN0dXJlX3QgKm91dEJ1ZjsKLSAgICB1MzIgbnVtT3V0OwotICAgIHUzMiBvdXRJbmRleDsKLSAgICB1MzIgbWF4UmVmRnJhbWVzOwotICAgIHUzMiBkcGJTaXplOwotICAgIHUzMiBtYXhGcmFtZU51bTsKLSAgICB1MzIgbWF4TG9uZ1Rlcm1GcmFtZUlkeDsKLSAgICB1MzIgbnVtUmVmRnJhbWVzOwotICAgIHUzMiBmdWxsbmVzczsKLSAgICB1MzIgcHJldlJlZkZyYW1lTnVtOwotICAgIHUzMiBsYXN0Q29udGFpbnNNbWNvNTsKLSAgICB1MzIgbm9SZW9yZGVyaW5nOwotICAgIHUzMiBmbHVzaGVkOwotfSBkcGJTdG9yYWdlX3Q7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RJbml0RHBiKAotICBkcGJTdG9yYWdlX3QgKmRwYiwKLSAgdTMyIHBpY1NpemVJbk1icywKLSAgdTMyIGRwYlNpemUsCi0gIHUzMiBudW1SZWZGcmFtZXMsCi0gIHUzMiBtYXhGcmFtZU51bSwKLSAgdTMyIG5vUmVvcmRlcmluZyk7Ci0KLXUzMiBoMjY0YnNkUmVzZXREcGIoCi0gIGRwYlN0b3JhZ2VfdCAqZHBiLAotICB1MzIgcGljU2l6ZUluTWJzLAotICB1MzIgZHBiU2l6ZSwKLSAgdTMyIG51bVJlZkZyYW1lcywKLSAgdTMyIG1heEZyYW1lTnVtLAotICB1MzIgbm9SZW9yZGVyaW5nKTsKLQotdm9pZCBoMjY0YnNkSW5pdFJlZlBpY0xpc3QoZHBiU3RvcmFnZV90ICpkcGIpOwotCi11OCogaDI2NGJzZEFsbG9jYXRlRHBiSW1hZ2UoZHBiU3RvcmFnZV90ICpkcGIpOwotCi11OCogaDI2NGJzZEdldFJlZlBpY0RhdGEoZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBpbmRleCk7Ci0KLXUzMiBoMjY0YnNkUmVvcmRlclJlZlBpY0xpc3QoCi0gIGRwYlN0b3JhZ2VfdCAqZHBiLAotICByZWZQaWNMaXN0UmVvcmRlcmluZ190ICpvcmRlciwKLSAgdTMyIGN1cnJGcmFtZU51bSwKLSAgdTMyIG51bVJlZklkeEFjdGl2ZSk7Ci0KLXUzMiBoMjY0YnNkTWFya0RlY1JlZlBpYygKLSAgZHBiU3RvcmFnZV90ICpkcGIsCi0gIGRlY1JlZlBpY01hcmtpbmdfdCAqbWFyaywKLSAgaW1hZ2VfdCAqaW1hZ2UsCi0gIHUzMiBmcmFtZU51bSwKLSAgaTMyIHBpY09yZGVyQ250LAotICB1MzIgaXNJZHIsCi0gIHUzMiBwaWNJZCwKLSAgdTMyIG51bUVyck1icyk7Ci0KLXUzMiBoMjY0YnNkQ2hlY2tHYXBzSW5GcmFtZU51bShkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIGZyYW1lTnVtLCB1MzIgaXNSZWZQaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIGdhcHNBbGxvd2VkKTsKLQotZHBiT3V0UGljdHVyZV90KiBoMjY0YnNkRHBiT3V0cHV0UGljdHVyZShkcGJTdG9yYWdlX3QgKmRwYik7Ci0KLXZvaWQgaDI2NGJzZEZsdXNoRHBiKGRwYlN0b3JhZ2VfdCAqZHBiKTsKLQotdm9pZCBoMjY0YnNkRnJlZURwYihkcGJTdG9yYWdlX3QgKmRwYik7Ci0KLSNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX0RQQl9IICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbWFnZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ltYWdlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiOTI4NzAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ltYWdlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotICAgICAzLiBNb2R1bGUgZGVmaW5lcwotICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0gICAgIDUuIEZ1bmN0aW9ucwotICAgICAgICAgIGgyNjRic2RXcml0ZU1hY3JvYmxvY2sKLSAgICAgICAgICBoMjY0YnNkV3JpdGVPdXRwdXRCbG9ja3MKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJoMjY0YnNkX2ltYWdlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9uZWlnaGJvdXIuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogeC0gYW5kIHktY29vcmRpbmF0ZXMgZm9yIGVhY2ggYmxvY2ssIGRlZmluZWQgaW4gaDI2NGJzZF9pbnRyYV9wcmVkaWN0aW9uLmMgKi8KLWV4dGVybiBjb25zdCB1MzIgaDI2NGJzZEJsb2NrWFtdOwotZXh0ZXJuIGNvbnN0IHUzMiBoMjY0YnNkQmxvY2tZW107Ci0KLS8qIGNsaXBwaW5nIHRhYmxlLCBkZWZpbmVkIGluIGgyNjRic2RfaW50cmFfcHJlZGljdGlvbi5jICovCi1leHRlcm4gY29uc3QgdTggaDI2NGJzZENsaXBbXTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkV3JpdGVNYWNyb2Jsb2NrCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIFdyaXRlIG9uZSBtYWNyb2Jsb2NrIGludG8gdGhlIGltYWdlLiBCb3RoIGx1bWEgYW5kIGNocm9tYQotICAgICAgICAgICAgY29tcG9uZW50cyB3aWxsIGJlIHdyaXR0ZW4gYXQgdGhlIHNhbWUgdGltZS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBkYXRhICAgIHBvaW50ZXIgdG8gbWFjcm9ibG9jayBkYXRhIHRvIGJlIHdyaXR0ZW4sIDI1NiB2YWx1ZXMgZm9yCi0gICAgICAgICAgICAgICAgICAgIGx1bWEgZm9sbG93ZWQgYnkgNjQgdmFsdWVzIGZvciBib3RoIGNocm9tYSBjb21wb25lbnRzCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIGltYWdlICAgcG9pbnRlciB0byB0aGUgaW1hZ2Ugd2hlcmUgdGhlIG1hY3JvYmxvY2sgd2lsbCBiZSB3cml0dGVuCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIG5vbmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZm5kZWYgSDI2NERFQ19ORU9OCi12b2lkIGgyNjRic2RXcml0ZU1hY3JvYmxvY2soaW1hZ2VfdCAqaW1hZ2UsIHU4ICpkYXRhKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpOwotICAgIHUzMiB3aWR0aDsKLSAgICB1MzIgKmx1bSwgKmNiLCAqY3I7Ci0gICAgdTMyICpwdHI7Ci0gICAgdTMyIHRtcDEsIHRtcDI7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChpbWFnZSk7Ci0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVCghKCh1MzIpZGF0YSYweDMpKTsKLQotICAgIHdpZHRoID0gaW1hZ2UtPndpZHRoOwotCi0gICAgLypsaW50IC1zYXZlIC1lODI2IGx1bSwgY2IgYW5kIGNyIHVzZWQgdG8gY29weSA0IGJ5dGVzIGF0IHRoZSB0aW1lLCBkaXNhYmxlCi0gICAgICogImFyZWEgdG9vIHNtYWxsIiBpbmZvIG1lc3NhZ2UgKi8KLSAgICBsdW0gPSAodTMyKilpbWFnZS0+bHVtYTsKLSAgICBjYiA9ICh1MzIqKWltYWdlLT5jYjsKLSAgICBjciA9ICh1MzIqKWltYWdlLT5jcjsKLSAgICBBU1NFUlQoISgodTMyKWx1bSYweDMpKTsKLSAgICBBU1NFUlQoISgodTMyKWNiJjB4MykpOwotICAgIEFTU0VSVCghKCh1MzIpY3ImMHgzKSk7Ci0KLSAgICBwdHIgPSAodTMyKilkYXRhOwotCi0gICAgd2lkdGggKj0gNDsKLSAgICBmb3IgKGkgPSAxNjsgaSA7IGktLSkKLSAgICB7Ci0gICAgICAgIHRtcDEgPSAqcHRyKys7Ci0gICAgICAgIHRtcDIgPSAqcHRyKys7Ci0gICAgICAgICpsdW0rKyA9IHRtcDE7Ci0gICAgICAgICpsdW0rKyA9IHRtcDI7Ci0gICAgICAgIHRtcDEgPSAqcHRyKys7Ci0gICAgICAgIHRtcDIgPSAqcHRyKys7Ci0gICAgICAgICpsdW0rKyA9IHRtcDE7Ci0gICAgICAgICpsdW0rKyA9IHRtcDI7Ci0gICAgICAgIGx1bSArPSB3aWR0aC00OwotICAgIH0KLQotICAgIHdpZHRoID4+PSAxOwotICAgIGZvciAoaSA9IDg7IGkgOyBpLS0pCi0gICAgewotICAgICAgICB0bXAxID0gKnB0cisrOwotICAgICAgICB0bXAyID0gKnB0cisrOwotICAgICAgICAqY2IrKyA9IHRtcDE7Ci0gICAgICAgICpjYisrID0gdG1wMjsKLSAgICAgICAgY2IgKz0gd2lkdGgtMjsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSA4OyBpIDsgaS0tKQotICAgIHsKLSAgICAgICAgdG1wMSA9ICpwdHIrKzsKLSAgICAgICAgdG1wMiA9ICpwdHIrKzsKLSAgICAgICAgKmNyKysgPSB0bXAxOwotICAgICAgICAqY3IrKyA9IHRtcDI7Ci0gICAgICAgIGNyICs9IHdpZHRoLTI7Ci0gICAgfQotCi19Ci0jZW5kaWYKLSNpZm5kZWYgSDI2NERFQ19PTVhETAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkV3JpdGVPdXRwdXRCbG9ja3MKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgV3JpdGUgb25lIG1hY3JvYmxvY2sgaW50byB0aGUgaW1hZ2UuIFByZWRpY3Rpb24gZm9yIHRoZSBtYWNyb2Jsb2NrCi0gICAgICAgICAgICBhbmQgdGhlIHJlc2lkdWFsIGFyZSBnaXZlbiBzZXBhcmF0ZWx5IGFuZCB3aWxsIGJlIGNvbWJpbmVkIHdoaWxlCi0gICAgICAgICAgICB3cml0aW5nIHRoZSBkYXRhIHRvIHRoZSBpbWFnZQotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIGRhdGEgICAgICAgIHBvaW50ZXIgdG8gbWFjcm9ibG9jayBwcmVkaWN0aW9uIGRhdGEsIDI1NiB2YWx1ZXMgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICBsdW1hIGZvbGxvd2VkIGJ5IDY0IHZhbHVlcyBmb3IgYm90aCBjaHJvbWEgY29tcG9uZW50cwotICAgICAgICAgICAgbWJOdW0gICAgICAgbnVtYmVyIG9mIHRoZSBtYWNyb2Jsb2NrCi0gICAgICAgICAgICByZXNpZHVhbCAgICBwb2ludGVyIHRvIHJlc2lkdWFsIGRhdGEsIDE2IDE2LWVsZW1lbnQgYXJyYXlzIGZvciBsdW1hCi0gICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dlZCBieSA0IDE2LWVsZW1lbnQgYXJyYXlzIGZvciBib3RoIGNocm9tYQotICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cwotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBpbWFnZSAgICAgICBwb2ludGVyIHRvIHRoZSBpbWFnZSB3aGVyZSB0aGUgZGF0YSB3aWxsIGJlIHdyaXR0ZW4KLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgbm9uZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIGgyNjRic2RXcml0ZU91dHB1dEJsb2NrcyhpbWFnZV90ICppbWFnZSwgdTMyIG1iTnVtLCB1OCAqZGF0YSwKLSAgICAgICAgaTMyIHJlc2lkdWFsW11bMTZdKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpOwotICAgIHUzMiBwaWNXaWR0aCwgcGljU2l6ZTsKLSAgICB1OCAqbHVtLCAqY2IsICpjcjsKLSAgICB1OCAqaW1hZ2VCbG9jazsKLSAgICB1OCAqdG1wOwotICAgIHUzMiByb3csIGNvbDsKLSAgICB1MzIgYmxvY2s7Ci0gICAgdTMyIHgsIHk7Ci0gICAgaTMyICpwUmVzOwotICAgIGkzMiB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0OwotICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGltYWdlKTsKLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKG1iTnVtIDwgaW1hZ2UtPndpZHRoICogaW1hZ2UtPmhlaWdodCk7Ci0gICAgQVNTRVJUKCEoKHUzMilkYXRhJjB4MykpOwotCi0gICAgLyogSW1hZ2Ugc2l6ZSBpbiBtYWNyb2Jsb2NrcyAqLwotICAgIHBpY1dpZHRoID0gaW1hZ2UtPndpZHRoOwotICAgIHBpY1NpemUgPSBwaWNXaWR0aCAqIGltYWdlLT5oZWlnaHQ7Ci0gICAgcm93ID0gbWJOdW0gLyBwaWNXaWR0aDsKLSAgICBjb2wgPSBtYk51bSAlIHBpY1dpZHRoOwotCi0gICAgLyogT3V0cHV0IG1hY3JvYmxvY2sgcG9zaXRpb24gaW4gb3V0cHV0IHBpY3R1cmUgKi8KLSAgICBsdW0gPSAoaW1hZ2UtPmRhdGEgKyByb3cgKiBwaWNXaWR0aCAqIDI1NiArIGNvbCAqIDE2KTsKLSAgICBjYiA9IChpbWFnZS0+ZGF0YSArIHBpY1NpemUgKiAyNTYgKyByb3cgKiBwaWNXaWR0aCAqIDY0ICsgY29sICogOCk7Ci0gICAgY3IgPSAoY2IgKyBwaWNTaXplICogNjQpOwotCi0gICAgcGljV2lkdGggKj0gMTY7Ci0KLSAgICBmb3IgKGJsb2NrID0gMDsgYmxvY2sgPCAxNjsgYmxvY2srKykKLSAgICB7Ci0gICAgICAgIHggPSBoMjY0YnNkQmxvY2tYW2Jsb2NrXTsKLSAgICAgICAgeSA9IGgyNjRic2RCbG9ja1lbYmxvY2tdOwotCi0gICAgICAgIHBSZXMgPSByZXNpZHVhbFtibG9ja107Ci0KLSAgICAgICAgQVNTRVJUKHBSZXMpOwotCi0gICAgICAgIHRtcCA9IGRhdGEgKyB5KjE2ICsgeDsKLSAgICAgICAgaW1hZ2VCbG9jayA9IGx1bSArIHkqcGljV2lkdGggKyB4OwotCi0gICAgICAgIEFTU0VSVCghKCh1MzIpdG1wJjB4MykpOwotICAgICAgICBBU1NFUlQoISgodTMyKWltYWdlQmxvY2smMHgzKSk7Ci0KLSAgICAgICAgaWYgKElTX1JFU0lEVUFMX0VNUFRZKHBSZXMpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKmxpbnQgLWU4MjYgKi8KLSAgICAgICAgICAgIGkzMiAqaW4zMiA9IChpMzIqKXRtcDsKLSAgICAgICAgICAgIGkzMiAqb3V0MzIgPSAoaTMyKilpbWFnZUJsb2NrOwotCi0gICAgICAgICAgICAvKiBSZXNpZHVhbCBpcyB6ZXJvID0+IGNvcHkgcHJlZGljdGlvbiBibG9jayB0byBvdXRwdXQgKi8KLSAgICAgICAgICAgIHRtcDEgPSAqaW4zMjsgIGluMzIgKz0gNDsKLSAgICAgICAgICAgIHRtcDIgPSAqaW4zMjsgIGluMzIgKz0gNDsKLSAgICAgICAgICAgICpvdXQzMiA9IHRtcDE7IG91dDMyICs9IHBpY1dpZHRoLzQ7Ci0gICAgICAgICAgICAqb3V0MzIgPSB0bXAyOyBvdXQzMiArPSBwaWNXaWR0aC80OwotICAgICAgICAgICAgdG1wMSA9ICppbjMyOyAgaW4zMiArPSA0OwotICAgICAgICAgICAgdG1wMiA9ICppbjMyOwotICAgICAgICAgICAgKm91dDMyID0gdG1wMTsgb3V0MzIgKz0gcGljV2lkdGgvNDsKLSAgICAgICAgICAgICpvdXQzMiA9IHRtcDI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIFJBTkdFX0NIRUNLX0FSUkFZKHBSZXMsIC01MTIsIDUxMSwgMTYpOwotCi0gICAgICAgICAgICAvKiBDYWxjdWxhdGUgaW1hZ2UgPSBwcmVkaWN0aW9uICsgcmVzaWR1YWwKLSAgICAgICAgICAgICAqIFByb2Nlc3MgZm91ciBwaXhlbHMgaW4gYSBsb29wICovCi0gICAgICAgICAgICBmb3IgKGkgPSA0OyBpOyBpLS0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG1wMSA9IHRtcFswXTsKLSAgICAgICAgICAgICAgICB0bXAyID0gKnBSZXMrKzsKLSAgICAgICAgICAgICAgICB0bXAzID0gdG1wWzFdOwotICAgICAgICAgICAgICAgIHRtcDEgPSBjbHBbdG1wMSArIHRtcDJdOwotICAgICAgICAgICAgICAgIHRtcDQgPSAqcFJlcysrOwotICAgICAgICAgICAgICAgIGltYWdlQmxvY2tbMF0gPSAodTgpdG1wMTsKLSAgICAgICAgICAgICAgICB0bXAzID0gY2xwW3RtcDMgKyB0bXA0XTsKLSAgICAgICAgICAgICAgICB0bXAxID0gdG1wWzJdOwotICAgICAgICAgICAgICAgIHRtcDIgPSAqcFJlcysrOwotICAgICAgICAgICAgICAgIGltYWdlQmxvY2tbMV0gPSAodTgpdG1wMzsKLSAgICAgICAgICAgICAgICB0bXAxID0gY2xwW3RtcDEgKyB0bXAyXTsKLSAgICAgICAgICAgICAgICB0bXAzID0gdG1wWzNdOwotICAgICAgICAgICAgICAgIHRtcDQgPSAqcFJlcysrOwotICAgICAgICAgICAgICAgIGltYWdlQmxvY2tbMl0gPSAodTgpdG1wMTsKLSAgICAgICAgICAgICAgICB0bXAzID0gY2xwW3RtcDMgKyB0bXA0XTsKLSAgICAgICAgICAgICAgICB0bXAgKz0gMTY7Ci0gICAgICAgICAgICAgICAgaW1hZ2VCbG9ja1szXSA9ICh1OCl0bXAzOwotICAgICAgICAgICAgICAgIGltYWdlQmxvY2sgKz0gcGljV2lkdGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHBpY1dpZHRoIC89IDI7Ci0KLSAgICBmb3IgKGJsb2NrID0gMTY7IGJsb2NrIDw9IDIzOyBibG9jaysrKQotICAgIHsKLSAgICAgICAgeCA9IGgyNjRic2RCbG9ja1hbYmxvY2sgJiAweDNdOwotICAgICAgICB5ID0gaDI2NGJzZEJsb2NrWVtibG9jayAmIDB4M107Ci0KLSAgICAgICAgcFJlcyA9IHJlc2lkdWFsW2Jsb2NrXTsKLQotICAgICAgICBBU1NFUlQocFJlcyk7Ci0KLSAgICAgICAgdG1wID0gZGF0YSArIDI1NjsKLSAgICAgICAgaW1hZ2VCbG9jayA9IGNiOwotCi0gICAgICAgIGlmIChibG9jayA+PSAyMCkKLSAgICAgICAgewotICAgICAgICAgICAgaW1hZ2VCbG9jayA9IGNyOwotICAgICAgICAgICAgdG1wICs9IDY0OwotICAgICAgICB9Ci0KLSAgICAgICAgdG1wICs9IHkqOCArIHg7Ci0gICAgICAgIGltYWdlQmxvY2sgKz0geSpwaWNXaWR0aCArIHg7Ci0KLSAgICAgICAgQVNTRVJUKCEoKHUzMil0bXAmMHgzKSk7Ci0gICAgICAgIEFTU0VSVCghKCh1MzIpaW1hZ2VCbG9jayYweDMpKTsKLQotICAgICAgICBpZiAoSVNfUkVTSURVQUxfRU1QVFkocFJlcykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qbGludCAtZTgyNiAqLwotICAgICAgICAgICAgaTMyICppbjMyID0gKGkzMiopdG1wOwotICAgICAgICAgICAgaTMyICpvdXQzMiA9IChpMzIqKWltYWdlQmxvY2s7Ci0KLSAgICAgICAgICAgIC8qIFJlc2lkdWFsIGlzIHplcm8gPT4gY29weSBwcmVkaWN0aW9uIGJsb2NrIHRvIG91dHB1dCAqLwotICAgICAgICAgICAgdG1wMSA9ICppbjMyOyAgaW4zMiArPSAyOwotICAgICAgICAgICAgdG1wMiA9ICppbjMyOyAgaW4zMiArPSAyOwotICAgICAgICAgICAgKm91dDMyID0gdG1wMTsgb3V0MzIgKz0gcGljV2lkdGgvNDsKLSAgICAgICAgICAgICpvdXQzMiA9IHRtcDI7IG91dDMyICs9IHBpY1dpZHRoLzQ7Ci0gICAgICAgICAgICB0bXAxID0gKmluMzI7ICBpbjMyICs9IDI7Ci0gICAgICAgICAgICB0bXAyID0gKmluMzI7Ci0gICAgICAgICAgICAqb3V0MzIgPSB0bXAxOyBvdXQzMiArPSBwaWNXaWR0aC80OwotICAgICAgICAgICAgKm91dDMyID0gdG1wMjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLQotICAgICAgICAgICAgUkFOR0VfQ0hFQ0tfQVJSQVkocFJlcywgLTUxMiwgNTExLCAxNik7Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDQ7IGk7IGktLSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0bXAxID0gdG1wWzBdOwotICAgICAgICAgICAgICAgIHRtcDIgPSAqcFJlcysrOwotICAgICAgICAgICAgICAgIHRtcDMgPSB0bXBbMV07Ci0gICAgICAgICAgICAgICAgdG1wMSA9IGNscFt0bXAxICsgdG1wMl07Ci0gICAgICAgICAgICAgICAgdG1wNCA9ICpwUmVzKys7Ci0gICAgICAgICAgICAgICAgaW1hZ2VCbG9ja1swXSA9ICh1OCl0bXAxOwotICAgICAgICAgICAgICAgIHRtcDMgPSBjbHBbdG1wMyArIHRtcDRdOwotICAgICAgICAgICAgICAgIHRtcDEgPSB0bXBbMl07Ci0gICAgICAgICAgICAgICAgdG1wMiA9ICpwUmVzKys7Ci0gICAgICAgICAgICAgICAgaW1hZ2VCbG9ja1sxXSA9ICh1OCl0bXAzOwotICAgICAgICAgICAgICAgIHRtcDEgPSBjbHBbdG1wMSArIHRtcDJdOwotICAgICAgICAgICAgICAgIHRtcDMgPSB0bXBbM107Ci0gICAgICAgICAgICAgICAgdG1wNCA9ICpwUmVzKys7Ci0gICAgICAgICAgICAgICAgaW1hZ2VCbG9ja1syXSA9ICh1OCl0bXAxOwotICAgICAgICAgICAgICAgIHRtcDMgPSBjbHBbdG1wMyArIHRtcDRdOwotICAgICAgICAgICAgICAgIHRtcCArPSA4OwotICAgICAgICAgICAgICAgIGltYWdlQmxvY2tbM10gPSAodTgpdG1wMzsKLSAgICAgICAgICAgICAgICBpbWFnZUJsb2NrICs9IHBpY1dpZHRoOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi19Ci0jZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW1hZ2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbWFnZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDdjMThjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbWFnZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLSAgICAzLiBEYXRhIHR5cGVzCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIEgyNjRTV0RFQ19JTUFHRV9ICi0jZGVmaW5lIEgyNjRTV0RFQ19JTUFHRV9ICi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBEYXRhIHR5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHU4ICpkYXRhOwotICAgIHUzMiB3aWR0aDsKLSAgICB1MzIgaGVpZ2h0OwotICAgIC8qIGN1cnJlbnQgTUIncyBjb21wb25lbnRzICovCi0gICAgdTggKmx1bWE7Ci0gICAgdTggKmNiOwotICAgIHU4ICpjcjsKLX0gaW1hZ2VfdDsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIGgyNjRic2RXcml0ZU1hY3JvYmxvY2soaW1hZ2VfdCAqaW1hZ2UsIHU4ICpkYXRhKTsKLQotI2lmbmRlZiBIMjY0REVDX09NWERMCi12b2lkIGgyNjRic2RXcml0ZU91dHB1dEJsb2NrcyhpbWFnZV90ICppbWFnZSwgdTMyIG1iTnVtLCB1OCAqZGF0YSwKLSAgICBpMzIgcmVzaWR1YWxbXVsxNl0pOwotI2VuZGlmCi0KLSNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX0lNQUdFX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ludGVyX3ByZWRpY3Rpb24uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRlcl9wcmVkaWN0aW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhODFjNGEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ludGVyX3ByZWRpY3Rpb24uYworKysgL2Rldi9udWxsCkBAIC0xLDEwMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotICAgICAzLiBNb2R1bGUgZGVmaW5lcwotICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0gICAgIDUuIEZ1bmN0aW9ucwotICAgICAgICAgIGgyNjRic2RJbnRlclByZWRpY3Rpb24KLSAgICAgICAgICBNdlByZWRpY3Rpb24xNngxNgotICAgICAgICAgIE12UHJlZGljdGlvbjE2eDgKLSAgICAgICAgICBNdlByZWRpY3Rpb244eDE2Ci0gICAgICAgICAgTXZQcmVkaWN0aW9uOHg4Ci0gICAgICAgICAgTXZQcmVkaWN0aW9uCi0gICAgICAgICAgTWVkaWFuRmlsdGVyCi0gICAgICAgICAgR2V0SW50ZXJOZWlnaGJvdXIKLSAgICAgICAgICBHZXRQcmVkaWN0aW9uTXYKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJoMjY0YnNkX2ludGVyX3ByZWRpY3Rpb24uaCIKLSNpbmNsdWRlICJoMjY0YnNkX25laWdoYm91ci5oIgotI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgotI2luY2x1ZGUgImgyNjRic2RfcmVjb25zdHJ1Y3QuaCIKLSNpbmNsdWRlICJoMjY0YnNkX2RwYi5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHUzMiBhdmFpbGFibGU7Ci0gICAgdTMyIHJlZkluZGV4OwotICAgIG12X3QgbXY7Ci19IGludGVyTmVpZ2hib3VyX3Q7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBNdlByZWRpY3Rpb24xNngxNihtYlN0b3JhZ2VfdCAqcE1iLCBtYlByZWRfdCAqbWJQcmVkLAotICAgIGRwYlN0b3JhZ2VfdCAqZHBiKTsKLXN0YXRpYyB1MzIgTXZQcmVkaWN0aW9uMTZ4OChtYlN0b3JhZ2VfdCAqcE1iLCBtYlByZWRfdCAqbWJQcmVkLAotICAgIGRwYlN0b3JhZ2VfdCAqZHBiKTsKLXN0YXRpYyB1MzIgTXZQcmVkaWN0aW9uOHgxNihtYlN0b3JhZ2VfdCAqcE1iLCBtYlByZWRfdCAqbWJQcmVkLAotICAgIGRwYlN0b3JhZ2VfdCAqZHBiKTsKLXN0YXRpYyB1MzIgTXZQcmVkaWN0aW9uOHg4KG1iU3RvcmFnZV90ICpwTWIsIHN1Yk1iUHJlZF90ICpzdWJNYlByZWQsCi0gICAgZHBiU3RvcmFnZV90ICpkcGIpOwotc3RhdGljIHUzMiBNdlByZWRpY3Rpb24obWJTdG9yYWdlX3QgKnBNYiwgc3ViTWJQcmVkX3QgKnN1Yk1iUHJlZCwKLSAgICB1MzIgbWJQYXJ0SWR4LCB1MzIgc3ViTWJQYXJ0SWR4KTsKLXN0YXRpYyBpMzIgTWVkaWFuRmlsdGVyKGkzMiBhLCBpMzIgYiwgaTMyIGMpOwotCi1zdGF0aWMgdm9pZCBHZXRJbnRlck5laWdoYm91cih1MzIgc2xpY2VJZCwgbWJTdG9yYWdlX3QgKm5NYiwKLSAgICBpbnRlck5laWdoYm91cl90ICpuLCB1MzIgaW5kZXgpOwotc3RhdGljIHZvaWQgR2V0UHJlZGljdGlvbk12KG12X3QgKm12LCBpbnRlck5laWdoYm91cl90ICphLCB1MzIgcmVmSW5kZXgpOwotCi1zdGF0aWMgY29uc3QgbmVpZ2hib3VyX3QgTl9BX1NVQl9QQVJUWzRdWzRdWzRdID0gewotICAgIHsgeyB7TUJfQSw1fSwge01CX05BLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQSw1fSwge01CX0EsN30sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9BLDV9LCB7TUJfQ1VSUiwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0EsNX0sIHtNQl9DVVJSLDB9LCB7TUJfQSw3fSwge01CX0NVUlIsMn0gfSB9LAotCi0gICAgeyB7IHtNQl9DVVJSLDF9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9DVVJSLDF9LCB7TUJfQ1VSUiwzfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0NVUlIsMX0sIHtNQl9DVVJSLDR9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQ1VSUiwxfSwge01CX0NVUlIsNH0sIHtNQl9DVVJSLDN9LCB7TUJfQ1VSUiw2fSB9IH0sCi0KLSAgICB7IHsge01CX0EsMTN9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9BLDEzfSwge01CX0EsMTV9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQSwxM30sIHtNQl9DVVJSLDh9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQSwxM30sIHtNQl9DVVJSLDh9LCB7TUJfQSwxNX0sIHtNQl9DVVJSLDEwfSB9IH0sCi0KLSAgICB7IHsge01CX0NVUlIsOX0sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0NVUlIsOX0sIHtNQl9DVVJSLDExfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0NVUlIsOX0sIHtNQl9DVVJSLDEyfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0NVUlIsOX0sIHtNQl9DVVJSLDEyfSwge01CX0NVUlIsMTF9LCB7TUJfQ1VSUiwxNH0gfSB9IH07Ci0KLXN0YXRpYyBjb25zdCBuZWlnaGJvdXJfdCBOX0JfU1VCX1BBUlRbNF1bNF1bNF0gPSB7Ci0gICAgeyB7IHtNQl9CLDEwfSwge01CX05BLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQiwxMH0sIHtNQl9DVVJSLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQiwxMH0sIHtNQl9CLDExfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0IsMTB9LCB7TUJfQiwxMX0sIHtNQl9DVVJSLDB9LCB7TUJfQ1VSUiwxfSB9IH0sCi0KLSAgICB7IHsge01CX0IsMTR9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9CLDE0fSwge01CX0NVUlIsNH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9CLDE0fSwge01CX0IsMTV9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQiwxNH0sIHtNQl9CLDE1fSwge01CX0NVUlIsNH0sIHtNQl9DVVJSLDV9IH0gfSwKLQotICAgIHsgeyB7TUJfQ1VSUiwyfSwge01CX05BLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQ1VSUiwyfSwge01CX0NVUlIsOH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9DVVJSLDJ9LCB7TUJfQ1VSUiwzfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0NVUlIsMn0sIHtNQl9DVVJSLDN9LCB7TUJfQ1VSUiw4fSwge01CX0NVUlIsOX0gfSB9LAotCi0gICAgeyB7IHtNQl9DVVJSLDZ9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9DVVJSLDZ9LCB7TUJfQ1VSUiwxMn0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9DVVJSLDZ9LCB7TUJfQ1VSUiw3fSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0NVUlIsNn0sIHtNQl9DVVJSLDd9LCB7TUJfQ1VSUiwxMn0sIHtNQl9DVVJSLDEzfSB9IH0gfTsKLQotc3RhdGljIGNvbnN0IG5laWdoYm91cl90IE5fQ19TVUJfUEFSVFs0XVs0XVs0XSA9IHsKLSAgICB7IHsge01CX0IsMTR9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9CLDE0fSwge01CX05BLDR9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQiwxMX0sIHtNQl9CLDE0fSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0IsMTF9LCB7TUJfQiwxNH0sIHtNQl9DVVJSLDF9LCB7TUJfTkEsNH0gfSB9LAotCi0gICAgeyB7IHtNQl9DLDEwfSwge01CX05BLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQywxMH0sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0IsMTV9LCB7TUJfQywxMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9CLDE1fSwge01CX0MsMTB9LCB7TUJfQ1VSUiw1fSwge01CX05BLDB9IH0gfSwKLQotICAgIHsgeyB7TUJfQ1VSUiw2fSwge01CX05BLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQ1VSUiw2fSwge01CX05BLDEyfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0NVUlIsM30sIHtNQl9DVVJSLDZ9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQ1VSUiwzfSwge01CX0NVUlIsNn0sIHtNQl9DVVJSLDl9LCB7TUJfTkEsMTJ9IH0gfSwKLQotICAgIHsgeyB7TUJfTkEsMn0sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX05BLDJ9LCB7TUJfTkEsOH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9DVVJSLDd9LCB7TUJfTkEsMn0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9DVVJSLDd9LCB7TUJfTkEsMn0sIHtNQl9DVVJSLDEzfSwge01CX05BLDh9IH0gfSB9OwotCi1zdGF0aWMgY29uc3QgbmVpZ2hib3VyX3QgTl9EX1NVQl9QQVJUWzRdWzRdWzRdID0gewotICAgIHsgeyB7TUJfRCwxNX0sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0QsMTV9LCB7TUJfQSw1fSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0QsMTV9LCB7TUJfQiwxMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9ELDE1fSwge01CX0IsMTB9LCB7TUJfQSw1fSwge01CX0NVUlIsMH0gfSB9LAotCi0gICAgeyB7IHtNQl9CLDExfSwge01CX05BLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQiwxMX0sIHtNQl9DVVJSLDF9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQiwxMX0sIHtNQl9CLDE0fSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0IsMTF9LCB7TUJfQiwxNH0sIHtNQl9DVVJSLDF9LCB7TUJfQ1VSUiw0fSB9IH0sCi0KLSAgICB7IHsge01CX0EsN30sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0EsN30sIHtNQl9BLDEzfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0EsN30sIHtNQl9DVVJSLDJ9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQSw3fSwge01CX0NVUlIsMn0sIHtNQl9BLDEzfSwge01CX0NVUlIsOH0gfSB9LAotCi0gICAgeyB7IHtNQl9DVVJSLDN9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9DVVJSLDN9LCB7TUJfQ1VSUiw5fSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0NVUlIsM30sIHtNQl9DVVJSLDZ9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQ1VSUiwzfSwge01CX0NVUlIsNn0sIHtNQl9DVVJSLDl9LCB7TUJfQ1VSUiwxMn0gfSB9IH07Ci0KLQotI2lmZGVmIEgyNjRERUNfT01YREwKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkSW50ZXJQcmVkaWN0aW9uCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQcm9jZXNzZXMgb25lIGludGVyIG1hY3JvYmxvY2suIFBlcmZvcm1zIG1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbgotICAgICAgICAgIGFuZCByZWNvbnN0cnVjdHMgcHJlZGljdGlvbiBtYWNyb2Jsb2NrLiBXcml0ZXMgdGhlIGZpbmFsIG1hY3JvYmxvY2sKLSAgICAgICAgICAocHJlZGljdGlvbiArIHJlc2lkdWFsKSBpbnRvIHRoZSBvdXRwdXQgaW1hZ2UgKGN1cnJJbWFnZSkKLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgcE1iICAgICAgICAgICBwb2ludGVyIHRvIG1hY3JvYmxvY2sgc3BlY2lmaWMgaW5mb3JtYXRpb24KLSAgICAgICAgICBwTWJMYXllciAgICAgIHBvaW50ZXIgdG8gY3VycmVudCBtYWNyb2Jsb2NrIGRhdGEgZnJvbSBzdHJlYW0KLSAgICAgICAgICBkcGIgICAgICAgICAgIHBvaW50ZXIgdG8gZGVjb2RlZCBwaWN0dXJlIGJ1ZmZlcgotICAgICAgICAgIG1iTnVtICAgICAgICAgY3VycmVudCBtYWNyb2Jsb2NrIG51bWJlcgotICAgICAgICAgIGN1cnJJbWFnZSAgICAgcG9pbnRlciB0byBvdXRwdXQgaW1hZ2UKLSAgICAgICAgICBkYXRhICAgICAgICAgIHBvaW50ZXIgd2hlcmUgcHJlZGljdGVkIG1hY3JvYmxvY2sgd2lsbCBiZSBzdG9yZWQKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIHBNYiAgICAgICAgICAgc3RydWN0dXJlIGlzIHVwZGF0ZWQgd2l0aCBjdXJyZW50IG1hY3JvYmxvY2sKLSAgICAgICAgICBjdXJySW1hZ2UgICAgIGN1cnJlbnQgbWFjcm9ibG9jayBpcyB3cml0dGVuIGludG8gaW1hZ2UKLSAgICAgICAgICBkYXRhICAgICAgICAgIHByZWRpY3Rpb24gaXMgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgIEhBTlRST19PSyAgICAgc3VjY2VzcwotICAgICAgICAgIEhBTlRST19OT0sgICAgZXJyb3IgaW4gbW90aW9uIHZlY3RvciBwcmVkaWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi11MzIgaDI2NGJzZEludGVyUHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCBtYWNyb2Jsb2NrTGF5ZXJfdCAqcE1iTGF5ZXIsCi0gICAgZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBtYk51bSwgaW1hZ2VfdCAqY3VyckltYWdlLCB1OCAqZGF0YSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaTsKLSAgICB1MzIgeCwgeTsKLSAgICB1MzIgY29sQW5kUm93OwotICAgIHN1Yk1iUGFydE1vZGVfZSBzdWJQYXJ0TW9kZTsKLSAgICBpbWFnZV90IHJlZkltYWdlOwotICAgIHU4IGZpbGxCdWZmWzMyKjIxICsgMTUgKyAzMl07Ci0gICAgdTggKnBGaWxsOwotICAgIHUzMiB0bXA7Ci0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocE1iKTsKLSAgICBBU1NFUlQoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpOwotICAgIEFTU0VSVChwTWJMYXllcik7Ci0KLSAgICAvKiAxNi1ieXRlIGFsaWdubWVudCAqLwotICAgIHBGaWxsID0gQUxJR04oZmlsbEJ1ZmYsIDE2KTsKLQotICAgIC8qIHNldCByb3cgYml0cyAxNTowICovCi0gICAgY29sQW5kUm93ID0gbWJOdW0gLyBjdXJySW1hZ2UtPndpZHRoOwotICAgIC8qc2V0IGNvbCB0byBiaXRzIDMxOjE2ICovCi0gICAgY29sQW5kUm93ICs9IChtYk51bSAtIGNvbEFuZFJvdyAqIGN1cnJJbWFnZS0+d2lkdGgpIDw8IDE2OwotICAgIGNvbEFuZFJvdyA8PD0gNDsKLQotICAgIHJlZkltYWdlLndpZHRoID0gY3VyckltYWdlLT53aWR0aDsKLSAgICByZWZJbWFnZS5oZWlnaHQgPSBjdXJySW1hZ2UtPmhlaWdodDsKLQotICAgIHN3aXRjaCAocE1iLT5tYlR5cGUpCi0gICAgewotICAgICAgICBjYXNlIFBfU2tpcDoKLSAgICAgICAgY2FzZSBQX0wwXzE2eDE2OgotICAgICAgICAgICAgaWYgKE12UHJlZGljdGlvbjE2eDE2KHBNYiwgJnBNYkxheWVyLT5tYlByZWQsIGRwYikgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIHJlZkltYWdlLmRhdGEgPSBwTWItPnJlZkFkZHJbMF07Ci0gICAgICAgICAgICB0bXAgPSAoMDw8MjQpICsgKDA8PDE2KSArICgxNjw8OCkgKyAxNjsKLSAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12LCAmcmVmSW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xBbmRSb3csIHRtcCwgcEZpbGwpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBQX0wwX0wwXzE2eDg6Ci0gICAgICAgICAgICBpZiAoIE12UHJlZGljdGlvbjE2eDgocE1iLCAmcE1iTGF5ZXItPm1iUHJlZCwgZHBiKSAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgcmVmSW1hZ2UuZGF0YSA9IHBNYi0+cmVmQWRkclswXTsKLSAgICAgICAgICAgIHRtcCA9ICgwPDwyNCkgKyAoMDw8MTYpICsgKDE2PDw4KSArIDg7Ci0gICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdiwgJnJlZkltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sQW5kUm93LCB0bXAsIHBGaWxsKTsKLQotICAgICAgICAgICAgcmVmSW1hZ2UuZGF0YSA9IHBNYi0+cmVmQWRkclsyXTsKLSAgICAgICAgICAgIHRtcCA9ICgwPDwyNCkgKyAoODw8MTYpICsgKDE2PDw4KSArIDg7Ci0gICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis4LCAmcmVmSW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xBbmRSb3csIHRtcCwgcEZpbGwpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBQX0wwX0wwXzh4MTY6Ci0gICAgICAgICAgICBpZiAoIE12UHJlZGljdGlvbjh4MTYocE1iLCAmcE1iTGF5ZXItPm1iUHJlZCwgZHBiKSAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgcmVmSW1hZ2UuZGF0YSA9IHBNYi0+cmVmQWRkclswXTsKLSAgICAgICAgICAgIHRtcCA9ICgwPDwyNCkgKyAoMDw8MTYpICsgKDg8PDgpICsgMTY7Ci0gICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdiwgJnJlZkltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sQW5kUm93LCB0bXAsIHBGaWxsKTsKLSAgICAgICAgICAgIHJlZkltYWdlLmRhdGEgPSBwTWItPnJlZkFkZHJbMV07Ci0gICAgICAgICAgICB0bXAgPSAoODw8MjQpICsgKDA8PDE2KSArICg4PDw4KSArIDE2OwotICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCwgJnJlZkltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sQW5kUm93LCB0bXAsIHBGaWxsKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6IC8qIFBfOHg4IGFuZCBQXzh4OHJlZjAgKi8KLSAgICAgICAgICAgIGlmICggTXZQcmVkaWN0aW9uOHg4KHBNYiwgJnBNYkxheWVyLT5zdWJNYlByZWQsIGRwYikgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVmSW1hZ2UuZGF0YSA9IHBNYi0+cmVmQWRkcltpXTsKLSAgICAgICAgICAgICAgICBzdWJQYXJ0TW9kZSA9Ci0gICAgICAgICAgICAgICAgICAgIGgyNjRic2RTdWJNYlBhcnRNb2RlKHBNYkxheWVyLT5zdWJNYlByZWQuc3ViTWJUeXBlW2ldKTsKLSAgICAgICAgICAgICAgICB4ID0gaSAmIDB4MSA/IDggOiAwOwotICAgICAgICAgICAgICAgIHkgPSBpIDwgMiA/IDAgOiA4OwotICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViUGFydE1vZGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIE1CX1NQXzh4ODoKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh4PDwyNCkgKyAoeTw8MTYpICsgKDg8PDgpICsgODsKLSAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSwgJnJlZkltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbEFuZFJvdywgdG1wLCBwRmlsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIE1CX1NQXzh4NDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh4PDwyNCkgKyAoeTw8MTYpICsgKDg8PDgpICsgNDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSwgJnJlZkltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbEFuZFJvdywgdG1wLCBwRmlsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAoeDw8MjQpICsgKCh5KzQpPDwxNikgKyAoODw8OCkgKyA0OwotICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppKzIsICZyZWZJbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xBbmRSb3csIHRtcCwgcEZpbGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNQl9TUF80eDg6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAoeDw8MjQpICsgKHk8PDE2KSArICg0PDw4KSArIDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0KmksICZyZWZJbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xBbmRSb3csIHRtcCwgcEZpbGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKCh4KzQpPDwyNCkgKyAoeTw8MTYpICsgKDQ8PDgpICsgODsKLSAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSsxLCAmcmVmSW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sQW5kUm93LCB0bXAsIHBGaWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAoeDw8MjQpICsgKHk8PDE2KSArICg0PDw4KSArIDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0KmksICZyZWZJbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xBbmRSb3csIHRtcCwgcEZpbGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKCh4KzQpPDwyNCkgKyAoeTw8MTYpICsgKDQ8PDgpICsgNDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSsxLCAmcmVmSW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sQW5kUm93LCB0bXAsIHBGaWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh4PDwyNCkgKyAoKHkrNCk8PDE2KSArICg0PDw4KSArIDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0KmkrMiwgJnJlZkltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbEFuZFJvdywgdG1wLCBwRmlsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAoKHgrNCk8PDI0KSArICgoeSs0KTw8MTYpICsgKDQ8PDgpICsgNDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSszLCAmcmVmSW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sQW5kUm93LCB0bXAsIHBGaWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qIGlmIGRlY29kZWQgZmxhZyA+IDEgLT4gbWIgaGFzIGFscmVhZHkgYmVlbiBzdWNjZXNzZnVsbHkgZGVjb2RlZCBhbmQKLSAgICAgKiB3cml0dGVuIHRvIG91dHB1dCAtPiBkbyBub3Qgd3JpdGUgYWdhaW4gKi8KLSAgICBpZiAocE1iLT5kZWNvZGVkID4gMSkKLSAgICAgICAgcmV0dXJuIEhBTlRST19PSzsKLQotICAgIHJldHVybihIQU5UUk9fT0spOwotfQotCi0jZWxzZSAvKiBIMjY0REVDX09NWERMICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEludGVyUHJlZGljdGlvbgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUHJvY2Vzc2VzIG9uZSBpbnRlciBtYWNyb2Jsb2NrLiBQZXJmb3JtcyBtb3Rpb24gdmVjdG9yIHByZWRpY3Rpb24KLSAgICAgICAgICBhbmQgcmVjb25zdHJ1Y3RzIHByZWRpY3Rpb24gbWFjcm9ibG9jay4gV3JpdGVzIHRoZSBmaW5hbCBtYWNyb2Jsb2NrCi0gICAgICAgICAgKHByZWRpY3Rpb24gKyByZXNpZHVhbCkgaW50byB0aGUgb3V0cHV0IGltYWdlIChjdXJySW1hZ2UpCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIHBNYiAgICAgICAgICAgcG9pbnRlciB0byBtYWNyb2Jsb2NrIHNwZWNpZmljIGluZm9ybWF0aW9uCi0gICAgICAgICAgcE1iTGF5ZXIgICAgICBwb2ludGVyIHRvIGN1cnJlbnQgbWFjcm9ibG9jayBkYXRhIGZyb20gc3RyZWFtCi0gICAgICAgICAgZHBiICAgICAgICAgICBwb2ludGVyIHRvIGRlY29kZWQgcGljdHVyZSBidWZmZXIKLSAgICAgICAgICBtYk51bSAgICAgICAgIGN1cnJlbnQgbWFjcm9ibG9jayBudW1iZXIKLSAgICAgICAgICBjdXJySW1hZ2UgICAgIHBvaW50ZXIgdG8gb3V0cHV0IGltYWdlCi0gICAgICAgICAgZGF0YSAgICAgICAgICBwb2ludGVyIHdoZXJlIHByZWRpY3RlZCBtYWNyb2Jsb2NrIHdpbGwgYmUgc3RvcmVkCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICBwTWIgICAgICAgICAgIHN0cnVjdHVyZSBpcyB1cGRhdGVkIHdpdGggY3VycmVudCBtYWNyb2Jsb2NrCi0gICAgICAgICAgY3VyckltYWdlICAgICBjdXJyZW50IG1hY3JvYmxvY2sgaXMgd3JpdHRlbiBpbnRvIGltYWdlCi0gICAgICAgICAgZGF0YSAgICAgICAgICBwcmVkaWN0aW9uIGlzIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICBIQU5UUk9fT0sgICAgIHN1Y2Nlc3MKLSAgICAgICAgICBIQU5UUk9fTk9LICAgIGVycm9yIGluIG1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdTMyIGgyNjRic2RJbnRlclByZWRpY3Rpb24obWJTdG9yYWdlX3QgKnBNYiwgbWFjcm9ibG9ja0xheWVyX3QgKnBNYkxheWVyLAotICAgIGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgbWJOdW0sIGltYWdlX3QgKmN1cnJJbWFnZSwgdTggKmRhdGEpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGk7Ci0gICAgdTMyIHgsIHk7Ci0gICAgdTMyIHJvdywgY29sOwotICAgIHN1Yk1iUGFydE1vZGVfZSBzdWJQYXJ0TW9kZTsKLSAgICBpbWFnZV90IHJlZkltYWdlOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocE1iKTsKLSAgICBBU1NFUlQoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpOwotICAgIEFTU0VSVChwTWJMYXllcik7Ci0KLSAgICByb3cgPSBtYk51bSAvIGN1cnJJbWFnZS0+d2lkdGg7Ci0gICAgY29sID0gbWJOdW0gLSByb3cgKiBjdXJySW1hZ2UtPndpZHRoOwotICAgIHJvdyAqPSAxNjsKLSAgICBjb2wgKj0gMTY7Ci0KLSAgICByZWZJbWFnZS53aWR0aCA9IGN1cnJJbWFnZS0+d2lkdGg7Ci0gICAgcmVmSW1hZ2UuaGVpZ2h0ID0gY3VyckltYWdlLT5oZWlnaHQ7Ci0KLSAgICBzd2l0Y2ggKHBNYi0+bWJUeXBlKQotICAgIHsKLSAgICAgICAgY2FzZSBQX1NraXA6Ci0gICAgICAgIGNhc2UgUF9MMF8xNngxNjoKLSAgICAgICAgICAgIGlmIChNdlByZWRpY3Rpb24xNngxNihwTWIsICZwTWJMYXllci0+bWJQcmVkLCBkcGIpICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICByZWZJbWFnZS5kYXRhID0gcE1iLT5yZWZBZGRyWzBdOwotICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYsICZyZWZJbWFnZSwgY29sLCByb3csIDAsIDAsCi0gICAgICAgICAgICAgICAgMTYsIDE2KTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgUF9MMF9MMF8xNng4OgotICAgICAgICAgICAgaWYgKCBNdlByZWRpY3Rpb24xNng4KHBNYiwgJnBNYkxheWVyLT5tYlByZWQsIGRwYikgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIHJlZkltYWdlLmRhdGEgPSBwTWItPnJlZkFkZHJbMF07Ci0gICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdiwgJnJlZkltYWdlLCBjb2wsIHJvdywgMCwgMCwKLSAgICAgICAgICAgICAgICAxNiwgOCk7Ci0gICAgICAgICAgICByZWZJbWFnZS5kYXRhID0gcE1iLT5yZWZBZGRyWzJdOwotICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrOCwgJnJlZkltYWdlLCBjb2wsIHJvdywgMCwgOCwKLSAgICAgICAgICAgICAgICAxNiwgOCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFBfTDBfTDBfOHgxNjoKLSAgICAgICAgICAgIGlmICggTXZQcmVkaWN0aW9uOHgxNihwTWIsICZwTWJMYXllci0+bWJQcmVkLCBkcGIpICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICByZWZJbWFnZS5kYXRhID0gcE1iLT5yZWZBZGRyWzBdOwotICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYsICZyZWZJbWFnZSwgY29sLCByb3csIDAsIDAsCi0gICAgICAgICAgICAgICAgOCwgMTYpOwotICAgICAgICAgICAgcmVmSW1hZ2UuZGF0YSA9IHBNYi0+cmVmQWRkclsxXTsKLSAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQsICZyZWZJbWFnZSwgY29sLCByb3csIDgsIDAsCi0gICAgICAgICAgICAgICAgOCwgMTYpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDogLyogUF84eDggYW5kIFBfOHg4cmVmMCAqLwotICAgICAgICAgICAgaWYgKCBNdlByZWRpY3Rpb244eDgocE1iLCAmcE1iTGF5ZXItPnN1Yk1iUHJlZCwgZHBiKSAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZWZJbWFnZS5kYXRhID0gcE1iLT5yZWZBZGRyW2ldOwotICAgICAgICAgICAgICAgIHN1YlBhcnRNb2RlID0KLSAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFN1Yk1iUGFydE1vZGUocE1iTGF5ZXItPnN1Yk1iUHJlZC5zdWJNYlR5cGVbaV0pOwotICAgICAgICAgICAgICAgIHggPSBpICYgMHgxID8gOCA6IDA7Ci0gICAgICAgICAgICAgICAgeSA9IGkgPCAyID8gMCA6IDg7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChzdWJQYXJ0TW9kZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTUJfU1BfOHg4OgotICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppLCAmcmVmSW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLCByb3csIHgsIHksIDgsIDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNQl9TUF84eDQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0KmksICZyZWZJbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wsIHJvdywgeCwgeSwgOCwgNCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0KmkrMiwgJnJlZkltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbCwgcm93LCB4LCB5KzQsIDgsIDQpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNQl9TUF80eDg6Ci0gICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0KmksICZyZWZJbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wsIHJvdywgeCwgeSwgNCwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0KmkrMSwgJnJlZkltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbCwgcm93LCB4KzQsIHksIDQsIDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSwgJnJlZkltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbCwgcm93LCB4LCB5LCA0LCA0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSsxLCAmcmVmSW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLCByb3csIHgrNCwgeSwgNCwgNCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0KmkrMiwgJnJlZkltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbCwgcm93LCB4LCB5KzQsIDQsIDQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppKzMsICZyZWZJbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wsIHJvdywgeCs0LCB5KzQsIDQsIDQpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLyogaWYgZGVjb2RlZCBmbGFnID4gMSAtPiBtYiBoYXMgYWxyZWFkeSBiZWVuIHN1Y2Nlc3NmdWxseSBkZWNvZGVkIGFuZAotICAgICAqIHdyaXR0ZW4gdG8gb3V0cHV0IC0+IGRvIG5vdCB3cml0ZSBhZ2FpbiAqLwotICAgIGlmIChwTWItPmRlY29kZWQgPiAxKQotICAgICAgICByZXR1cm4gSEFOVFJPX09LOwotCi0gICAgaWYgKHBNYi0+bWJUeXBlICE9IFBfU2tpcCkKLSAgICB7Ci0gICAgICAgIGgyNjRic2RXcml0ZU91dHB1dEJsb2NrcyhjdXJySW1hZ2UsIG1iTnVtLCBkYXRhLAotICAgICAgICAgICAgcE1iTGF5ZXItPnJlc2lkdWFsLmxldmVsKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaDI2NGJzZFdyaXRlTWFjcm9ibG9jayhjdXJySW1hZ2UsIGRhdGEpOwotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotfQotI2VuZGlmIC8qIEgyNjRERUNfT01YREwgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBNdlByZWRpY3Rpb24xNngxNgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBNb3Rpb24gdmVjdG9yIHByZWRpY3Rpb24gZm9yIDE2eDE2IHBhcnRpdGlvbiBtb2RlCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBNdlByZWRpY3Rpb24xNngxNihtYlN0b3JhZ2VfdCAqcE1iLCBtYlByZWRfdCAqbWJQcmVkLCBkcGJTdG9yYWdlX3QgKmRwYikKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICBtdl90IG12OwotICAgIG12X3QgbXZQcmVkOwotICAgIGludGVyTmVpZ2hib3VyX3QgYVszXTsgLyogQSwgQiwgQyAqLwotICAgIHUzMiByZWZJbmRleDsKLSAgICB1OCAqdG1wOwotICAgIHUzMiAqdG1wTXYxLCAqdG1wTXYyOwotCi0vKiBDb2RlICovCi0KLSAgICByZWZJbmRleCA9IG1iUHJlZC0+cmVmSWR4TDBbMF07Ci0KLSAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIHBNYi0+bWJBLCBhLCA1KTsKLSAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIHBNYi0+bWJCLCBhKzEsIDEwKTsKLSAgICAvKmxpbnQgLS1lKDc0MCkgIFVudXN1YWwgcG9pbnRlciBjYXN0IChpbmNvbXBhdGlibGUgaW5kaXJlY3QgdHlwZXMpICovCi0gICAgdG1wTXYxID0gKHUzMiopKCZhWzBdLm12KTsgLyogd2UgdGVzdCBqdXN0IHRoYXQgYm90aCBNVnMgYXJlIHplcm8gKi8KLSAgICAvKmxpbnQgLS1lKDc0MCkgKi8KLSAgICB0bXBNdjIgPSAodTMyKikoJmFbMV0ubXYpOyAvKiBpLmUuIGFbMF0ubXYuaG9yID09IDAgJiYgYVswXS5tdi52ZXIgPT0gMCAqLwotICAgIGlmIChwTWItPm1iVHlwZSA9PSBQX1NraXAgJiYKLSAgICAgICAgKCFhWzBdLmF2YWlsYWJsZSB8fCAhYVsxXS5hdmFpbGFibGUgfHwKLSAgICAgICAgICggYVswXS5yZWZJbmRleCA9PSAwICYmICgodTMyKSgqdG1wTXYxKSA9PSAwKSApIHx8Ci0gICAgICAgICAoIGFbMV0ucmVmSW5kZXggPT0gMCAmJiAoKHUzMikoKnRtcE12MikgPT0gMCkgKSkpCi0gICAgewotICAgICAgICAgICAgbXYuaG9yID0gbXYudmVyID0gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgbXYgPSBtYlByZWQtPm12ZEwwWzBdOwotICAgICAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIHBNYi0+bWJDLCBhKzIsIDEwKTsKLSAgICAgICAgaWYgKCFhWzJdLmF2YWlsYWJsZSkKLSAgICAgICAgewotICAgICAgICAgICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBwTWItPm1iRCwgYSsyLCAxNSk7Ci0gICAgICAgIH0KLQotICAgICAgICBHZXRQcmVkaWN0aW9uTXYoJm12UHJlZCwgYSwgcmVmSW5kZXgpOwotCi0gICAgICAgIG12LmhvciArPSBtdlByZWQuaG9yOwotICAgICAgICBtdi52ZXIgKz0gbXZQcmVkLnZlcjsKLQotICAgICAgICAvKiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgcmFuZ2UgWy0yMDQ4LCAyMDQ3Ljc1XSAqLwotICAgICAgICBpZiAoKHUzMikoaTMyKShtdi5ob3IrODE5MikgPj0gKDE2Mzg0KSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgICAgICAvKiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIHJhbmdlIFstNTEyLCA1MTEuNzVdCi0gICAgICAgICAqIChzbWFsbGVyIGZvciBsb3cgbGV2ZWxzKSAqLwotICAgICAgICBpZiAoKHUzMikoaTMyKShtdi52ZXIrMjA0OCkgPj0gKDQwOTYpKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLQotICAgIHRtcCA9IGgyNjRic2RHZXRSZWZQaWNEYXRhKGRwYiwgcmVmSW5kZXgpOwotICAgIGlmICh0bXAgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgcE1iLT5tdlswXSA9IHBNYi0+bXZbMV0gPSBwTWItPm12WzJdID0gcE1iLT5tdlszXSA9Ci0gICAgcE1iLT5tdls0XSA9IHBNYi0+bXZbNV0gPSBwTWItPm12WzZdID0gcE1iLT5tdls3XSA9Ci0gICAgcE1iLT5tdls4XSA9IHBNYi0+bXZbOV0gPSBwTWItPm12WzEwXSA9IHBNYi0+bXZbMTFdID0KLSAgICBwTWItPm12WzEyXSA9IHBNYi0+bXZbMTNdID0gcE1iLT5tdlsxNF0gPSBwTWItPm12WzE1XSA9IG12OwotCi0gICAgcE1iLT5yZWZQaWNbMF0gPSByZWZJbmRleDsKLSAgICBwTWItPnJlZlBpY1sxXSA9IHJlZkluZGV4OwotICAgIHBNYi0+cmVmUGljWzJdID0gcmVmSW5kZXg7Ci0gICAgcE1iLT5yZWZQaWNbM10gPSByZWZJbmRleDsKLSAgICBwTWItPnJlZkFkZHJbMF0gPSB0bXA7Ci0gICAgcE1iLT5yZWZBZGRyWzFdID0gdG1wOwotICAgIHBNYi0+cmVmQWRkclsyXSA9IHRtcDsKLSAgICBwTWItPnJlZkFkZHJbM10gPSB0bXA7Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IE12UHJlZGljdGlvbjE2eDgKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgTW90aW9uIHZlY3RvciBwcmVkaWN0aW9uIGZvciAxNng4IHBhcnRpdGlvbiBtb2RlCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBNdlByZWRpY3Rpb24xNng4KG1iU3RvcmFnZV90ICpwTWIsIG1iUHJlZF90ICptYlByZWQsIGRwYlN0b3JhZ2VfdCAqZHBiKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIG12X3QgbXY7Ci0gICAgbXZfdCBtdlByZWQ7Ci0gICAgaW50ZXJOZWlnaGJvdXJfdCBhWzNdOyAvKiBBLCBCLCBDICovCi0gICAgdTMyIHJlZkluZGV4OwotICAgIHU4ICp0bXA7Ci0KLS8qIENvZGUgKi8KLQotICAgIG12ID0gbWJQcmVkLT5tdmRMMFswXTsKLSAgICByZWZJbmRleCA9IG1iUHJlZC0+cmVmSWR4TDBbMF07Ci0KLSAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIHBNYi0+bWJCLCBhKzEsIDEwKTsKLQotICAgIGlmIChhWzFdLnJlZkluZGV4ID09IHJlZkluZGV4KQotICAgICAgICBtdlByZWQgPSBhWzFdLm12OwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkEsIGEsIDUpOwotICAgICAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIHBNYi0+bWJDLCBhKzIsIDEwKTsKLSAgICAgICAgaWYgKCFhWzJdLmF2YWlsYWJsZSkKLSAgICAgICAgewotICAgICAgICAgICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBwTWItPm1iRCwgYSsyLCAxNSk7Ci0gICAgICAgIH0KLQotICAgICAgICBHZXRQcmVkaWN0aW9uTXYoJm12UHJlZCwgYSwgcmVmSW5kZXgpOwotCi0gICAgfQotICAgIG12LmhvciArPSBtdlByZWQuaG9yOwotICAgIG12LnZlciArPSBtdlByZWQudmVyOwotCi0gICAgLyogaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIHJhbmdlIFstMjA0OCwgMjA0Ny43NV0gKi8KLSAgICBpZiAoKHUzMikoaTMyKShtdi5ob3IrODE5MikgPj0gKDE2Mzg0KSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgLyogdmVydGljYWwgbW90aW9uIHZlY3RvciByYW5nZSBbLTUxMiwgNTExLjc1XSAoc21hbGxlciBmb3IgbG93IGxldmVscykgKi8KLSAgICBpZiAoKHUzMikoaTMyKShtdi52ZXIrMjA0OCkgPj0gKDQwOTYpKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0UmVmUGljRGF0YShkcGIsIHJlZkluZGV4KTsKLSAgICBpZiAodG1wID09IE5VTEwpCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIHBNYi0+bXZbMF0gPSBwTWItPm12WzFdID0gcE1iLT5tdlsyXSA9IHBNYi0+bXZbM10gPQotICAgIHBNYi0+bXZbNF0gPSBwTWItPm12WzVdID0gcE1iLT5tdls2XSA9IHBNYi0+bXZbN10gPSBtdjsKLSAgICBwTWItPnJlZlBpY1swXSA9IHJlZkluZGV4OwotICAgIHBNYi0+cmVmUGljWzFdID0gcmVmSW5kZXg7Ci0gICAgcE1iLT5yZWZBZGRyWzBdID0gdG1wOwotICAgIHBNYi0+cmVmQWRkclsxXSA9IHRtcDsKLQotICAgIG12ID0gbWJQcmVkLT5tdmRMMFsxXTsKLSAgICByZWZJbmRleCA9IG1iUHJlZC0+cmVmSWR4TDBbMV07Ci0KLSAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIHBNYi0+bWJBLCBhLCAxMyk7Ci0gICAgaWYgKGFbMF0ucmVmSW5kZXggPT0gcmVmSW5kZXgpCi0gICAgICAgIG12UHJlZCA9IGFbMF0ubXY7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgYVsxXS5hdmFpbGFibGUgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgYVsxXS5yZWZJbmRleCA9IHBNYi0+cmVmUGljWzBdOwotICAgICAgICBhWzFdLm12ID0gcE1iLT5tdlswXTsKLQotICAgICAgICAvKiBjIGlzIG5vdCBhdmFpbGFibGUgKi8KLSAgICAgICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBwTWItPm1iQSwgYSsyLCA3KTsKLQotICAgICAgICBHZXRQcmVkaWN0aW9uTXYoJm12UHJlZCwgYSwgcmVmSW5kZXgpOwotCi0gICAgfQotICAgIG12LmhvciArPSBtdlByZWQuaG9yOwotICAgIG12LnZlciArPSBtdlByZWQudmVyOwotCi0gICAgLyogaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIHJhbmdlIFstMjA0OCwgMjA0Ny43NV0gKi8KLSAgICBpZiAoKHUzMikoaTMyKShtdi5ob3IrODE5MikgPj0gKDE2Mzg0KSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgLyogdmVydGljYWwgbW90aW9uIHZlY3RvciByYW5nZSBbLTUxMiwgNTExLjc1XSAoc21hbGxlciBmb3IgbG93IGxldmVscykgKi8KLSAgICBpZiAoKHUzMikoaTMyKShtdi52ZXIrMjA0OCkgPj0gKDQwOTYpKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0UmVmUGljRGF0YShkcGIsIHJlZkluZGV4KTsKLSAgICBpZiAodG1wID09IE5VTEwpCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIHBNYi0+bXZbOF0gPSBwTWItPm12WzldID0gcE1iLT5tdlsxMF0gPSBwTWItPm12WzExXSA9Ci0gICAgcE1iLT5tdlsxMl0gPSBwTWItPm12WzEzXSA9IHBNYi0+bXZbMTRdID0gcE1iLT5tdlsxNV0gPSBtdjsKLSAgICBwTWItPnJlZlBpY1syXSA9IHJlZkluZGV4OwotICAgIHBNYi0+cmVmUGljWzNdID0gcmVmSW5kZXg7Ci0gICAgcE1iLT5yZWZBZGRyWzJdID0gdG1wOwotICAgIHBNYi0+cmVmQWRkclszXSA9IHRtcDsKLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogTXZQcmVkaWN0aW9uOHgxNgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBNb3Rpb24gdmVjdG9yIHByZWRpY3Rpb24gZm9yIDh4MTYgcGFydGl0aW9uIG1vZGUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIE12UHJlZGljdGlvbjh4MTYobWJTdG9yYWdlX3QgKnBNYiwgbWJQcmVkX3QgKm1iUHJlZCwgZHBiU3RvcmFnZV90ICpkcGIpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgbXZfdCBtdjsKLSAgICBtdl90IG12UHJlZDsKLSAgICBpbnRlck5laWdoYm91cl90IGFbM107IC8qIEEsIEIsIEMgKi8KLSAgICB1MzIgcmVmSW5kZXg7Ci0gICAgdTggKnRtcDsKLQotLyogQ29kZSAqLwotCi0gICAgbXYgPSBtYlByZWQtPm12ZEwwWzBdOwotICAgIHJlZkluZGV4ID0gbWJQcmVkLT5yZWZJZHhMMFswXTsKLQotICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkEsIGEsIDUpOwotCi0gICAgaWYgKGFbMF0ucmVmSW5kZXggPT0gcmVmSW5kZXgpCi0gICAgICAgIG12UHJlZCA9IGFbMF0ubXY7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBwTWItPm1iQiwgYSsxLCAxMCk7Ci0gICAgICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkIsIGErMiwgMTQpOwotICAgICAgICBpZiAoIWFbMl0uYXZhaWxhYmxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIHBNYi0+bWJELCBhKzIsIDE1KTsKLSAgICAgICAgfQotCi0gICAgICAgIEdldFByZWRpY3Rpb25NdigmbXZQcmVkLCBhLCByZWZJbmRleCk7Ci0KLSAgICB9Ci0gICAgbXYuaG9yICs9IG12UHJlZC5ob3I7Ci0gICAgbXYudmVyICs9IG12UHJlZC52ZXI7Ci0KLSAgICAvKiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgcmFuZ2UgWy0yMDQ4LCAyMDQ3Ljc1XSAqLwotICAgIGlmICgodTMyKShpMzIpKG12Lmhvcis4MTkyKSA+PSAoMTYzODQpKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAvKiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIHJhbmdlIFstNTEyLCA1MTEuNzVdIChzbWFsbGVyIGZvciBsb3cgbGV2ZWxzKSAqLwotICAgIGlmICgodTMyKShpMzIpKG12LnZlcisyMDQ4KSA+PSAoNDA5NikpCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIHRtcCA9IGgyNjRic2RHZXRSZWZQaWNEYXRhKGRwYiwgcmVmSW5kZXgpOwotICAgIGlmICh0bXAgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgcE1iLT5tdlswXSA9IHBNYi0+bXZbMV0gPSBwTWItPm12WzJdID0gcE1iLT5tdlszXSA9Ci0gICAgcE1iLT5tdls4XSA9IHBNYi0+bXZbOV0gPSBwTWItPm12WzEwXSA9IHBNYi0+bXZbMTFdID0gbXY7Ci0gICAgcE1iLT5yZWZQaWNbMF0gPSByZWZJbmRleDsKLSAgICBwTWItPnJlZlBpY1syXSA9IHJlZkluZGV4OwotICAgIHBNYi0+cmVmQWRkclswXSA9IHRtcDsKLSAgICBwTWItPnJlZkFkZHJbMl0gPSB0bXA7Ci0KLSAgICBtdiA9IG1iUHJlZC0+bXZkTDBbMV07Ci0gICAgcmVmSW5kZXggPSBtYlByZWQtPnJlZklkeEwwWzFdOwotCi0gICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBwTWItPm1iQywgYSsyLCAxMCk7Ci0gICAgaWYgKCFhWzJdLmF2YWlsYWJsZSkKLSAgICB7Ci0gICAgICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkIsIGErMiwgMTEpOwotICAgIH0KLSAgICBpZiAoYVsyXS5yZWZJbmRleCA9PSByZWZJbmRleCkKLSAgICAgICAgbXZQcmVkID0gYVsyXS5tdjsKLSAgICBlbHNlCi0gICAgewotICAgICAgICBhWzBdLmF2YWlsYWJsZSA9IEhBTlRST19UUlVFOwotICAgICAgICBhWzBdLnJlZkluZGV4ID0gcE1iLT5yZWZQaWNbMF07Ci0gICAgICAgIGFbMF0ubXYgPSBwTWItPm12WzBdOwotCi0gICAgICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkIsIGErMSwgMTQpOwotCi0gICAgICAgIEdldFByZWRpY3Rpb25NdigmbXZQcmVkLCBhLCByZWZJbmRleCk7Ci0KLSAgICB9Ci0gICAgbXYuaG9yICs9IG12UHJlZC5ob3I7Ci0gICAgbXYudmVyICs9IG12UHJlZC52ZXI7Ci0KLSAgICAvKiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgcmFuZ2UgWy0yMDQ4LCAyMDQ3Ljc1XSAqLwotICAgIGlmICgodTMyKShpMzIpKG12Lmhvcis4MTkyKSA+PSAoMTYzODQpKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAvKiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIHJhbmdlIFstNTEyLCA1MTEuNzVdIChzbWFsbGVyIGZvciBsb3cgbGV2ZWxzKSAqLwotICAgIGlmICgodTMyKShpMzIpKG12LnZlcisyMDQ4KSA+PSAoNDA5NikpCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIHRtcCA9IGgyNjRic2RHZXRSZWZQaWNEYXRhKGRwYiwgcmVmSW5kZXgpOwotICAgIGlmICh0bXAgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgcE1iLT5tdls0XSA9IHBNYi0+bXZbNV0gPSBwTWItPm12WzZdID0gcE1iLT5tdls3XSA9Ci0gICAgcE1iLT5tdlsxMl0gPSBwTWItPm12WzEzXSA9IHBNYi0+bXZbMTRdID0gcE1iLT5tdlsxNV0gPSBtdjsKLSAgICBwTWItPnJlZlBpY1sxXSA9IHJlZkluZGV4OwotICAgIHBNYi0+cmVmUGljWzNdID0gcmVmSW5kZXg7Ci0gICAgcE1iLT5yZWZBZGRyWzFdID0gdG1wOwotICAgIHBNYi0+cmVmQWRkclszXSA9IHRtcDsKLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogTXZQcmVkaWN0aW9uOHg4Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIE1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbiBmb3IgOHg4IHBhcnRpdGlvbiBtb2RlCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBNdlByZWRpY3Rpb244eDgobWJTdG9yYWdlX3QgKnBNYiwgc3ViTWJQcmVkX3QgKnN1Yk1iUHJlZCwgZHBiU3RvcmFnZV90ICpkcGIpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGksIGo7Ci0gICAgdTMyIG51bVN1Yk1iUGFydDsKLQotLyogQ29kZSAqLwotCi0gICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICB7Ci0gICAgICAgIG51bVN1Yk1iUGFydCA9IGgyNjRic2ROdW1TdWJNYlBhcnQoc3ViTWJQcmVkLT5zdWJNYlR5cGVbaV0pOwotICAgICAgICBwTWItPnJlZlBpY1tpXSA9IHN1Yk1iUHJlZC0+cmVmSWR4TDBbaV07Ci0gICAgICAgIHBNYi0+cmVmQWRkcltpXSA9IGgyNjRic2RHZXRSZWZQaWNEYXRhKGRwYiwgc3ViTWJQcmVkLT5yZWZJZHhMMFtpXSk7Ci0gICAgICAgIGlmIChwTWItPnJlZkFkZHJbaV0gPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IG51bVN1Yk1iUGFydDsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoTXZQcmVkaWN0aW9uKHBNYiwgc3ViTWJQcmVkLCBpLCBqKSAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBNdlByZWRpY3Rpb24KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgUGVyZm9ybSBtb3Rpb24gdmVjdG9yIHByZWRpY3Rpb24gZm9yIHN1Yi1wYXJ0aXRpb24KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIE12UHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCBzdWJNYlByZWRfdCAqc3ViTWJQcmVkLCB1MzIgbWJQYXJ0SWR4LAotICAgIHUzMiBzdWJNYlBhcnRJZHgpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgbXZfdCBtdiwgbXZQcmVkOwotICAgIHUzMiByZWZJbmRleDsKLSAgICBzdWJNYlBhcnRNb2RlX2Ugc3ViTWJQYXJ0TW9kZTsKLSAgICBjb25zdCBuZWlnaGJvdXJfdCAqbjsKLSAgICBtYlN0b3JhZ2VfdCAqbk1iOwotICAgIGludGVyTmVpZ2hib3VyX3QgYVszXTsgLyogQSwgQiwgQyAqLwotCi0vKiBDb2RlICovCi0KLSAgICBtdiA9IHN1Yk1iUHJlZC0+bXZkTDBbbWJQYXJ0SWR4XVtzdWJNYlBhcnRJZHhdOwotICAgIHN1Yk1iUGFydE1vZGUgPSBoMjY0YnNkU3ViTWJQYXJ0TW9kZShzdWJNYlByZWQtPnN1Yk1iVHlwZVttYlBhcnRJZHhdKTsKLSAgICByZWZJbmRleCA9IHN1Yk1iUHJlZC0+cmVmSWR4TDBbbWJQYXJ0SWR4XTsKLQotICAgIG4gPSBOX0FfU1VCX1BBUlRbbWJQYXJ0SWR4XVtzdWJNYlBhcnRNb2RlXStzdWJNYlBhcnRJZHg7Ci0gICAgbk1iID0gaDI2NGJzZEdldE5laWdoYm91ck1iKHBNYiwgbi0+bWIpOwotICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgbk1iLCBhLCBuLT5pbmRleCk7Ci0KLSAgICBuID0gTl9CX1NVQl9QQVJUW21iUGFydElkeF1bc3ViTWJQYXJ0TW9kZV0rc3ViTWJQYXJ0SWR4OwotICAgIG5NYiA9IGgyNjRic2RHZXROZWlnaGJvdXJNYihwTWIsIG4tPm1iKTsKLSAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIG5NYiwgYSsxLCBuLT5pbmRleCk7Ci0KLSAgICBuID0gTl9DX1NVQl9QQVJUW21iUGFydElkeF1bc3ViTWJQYXJ0TW9kZV0rc3ViTWJQYXJ0SWR4OwotICAgIG5NYiA9IGgyNjRic2RHZXROZWlnaGJvdXJNYihwTWIsIG4tPm1iKTsKLSAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIG5NYiwgYSsyLCBuLT5pbmRleCk7Ci0KLSAgICBpZiAoIWFbMl0uYXZhaWxhYmxlKQotICAgIHsKLSAgICAgICAgbiA9IE5fRF9TVUJfUEFSVFttYlBhcnRJZHhdW3N1Yk1iUGFydE1vZGVdK3N1Yk1iUGFydElkeDsKLSAgICAgICAgbk1iID0gaDI2NGJzZEdldE5laWdoYm91ck1iKHBNYiwgbi0+bWIpOwotICAgICAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIG5NYiwgYSsyLCBuLT5pbmRleCk7Ci0gICAgfQotCi0gICAgR2V0UHJlZGljdGlvbk12KCZtdlByZWQsIGEsIHJlZkluZGV4KTsKLQotICAgIG12LmhvciArPSBtdlByZWQuaG9yOwotICAgIG12LnZlciArPSBtdlByZWQudmVyOwotCi0gICAgLyogaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIHJhbmdlIFstMjA0OCwgMjA0Ny43NV0gKi8KLSAgICBpZiAoKCh1MzIpKGkzMikobXYuaG9yKzgxOTIpID49ICgxNjM4NCkpKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAvKiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIHJhbmdlIFstNTEyLCA1MTEuNzVdIChzbWFsbGVyIGZvciBsb3cgbGV2ZWxzKSAqLwotICAgIGlmICgoKHUzMikoaTMyKShtdi52ZXIrMjA0OCkgPj0gKDQwOTYpKSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgc3dpdGNoIChzdWJNYlBhcnRNb2RlKQotICAgIHsKLSAgICAgICAgY2FzZSBNQl9TUF84eDg6Ci0gICAgICAgICAgICBwTWItPm12WzQqbWJQYXJ0SWR4XSA9IG12OwotICAgICAgICAgICAgcE1iLT5tdls0Km1iUGFydElkeCArIDFdID0gbXY7Ci0gICAgICAgICAgICBwTWItPm12WzQqbWJQYXJ0SWR4ICsgMl0gPSBtdjsKLSAgICAgICAgICAgIHBNYi0+bXZbNCptYlBhcnRJZHggKyAzXSA9IG12OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNQl9TUF84eDQ6Ci0gICAgICAgICAgICBwTWItPm12WzQqbWJQYXJ0SWR4ICsgMipzdWJNYlBhcnRJZHhdID0gbXY7Ci0gICAgICAgICAgICBwTWItPm12WzQqbWJQYXJ0SWR4ICsgMipzdWJNYlBhcnRJZHggKyAxXSA9IG12OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNQl9TUF80eDg6Ci0gICAgICAgICAgICBwTWItPm12WzQqbWJQYXJ0SWR4ICsgc3ViTWJQYXJ0SWR4XSA9IG12OwotICAgICAgICAgICAgcE1iLT5tdls0Km1iUGFydElkeCArIHN1Yk1iUGFydElkeCArIDJdID0gbXY7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE1CX1NQXzR4NDoKLSAgICAgICAgICAgIHBNYi0+bXZbNCptYlBhcnRJZHggKyBzdWJNYlBhcnRJZHhdID0gbXY7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IE1lZGlhbkZpbHRlcgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBNZWRpYW4gZmlsdGVyaW5nIGZvciBtb3Rpb24gdmVjdG9yIHByZWRpY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotaTMyIE1lZGlhbkZpbHRlcihpMzIgYSwgaTMyIGIsIGkzMiBjKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIGkzMiBtYXgsbWluLG1lZDsKLQotLyogQ29kZSAqLwotCi0gICAgbWF4ID0gbWluID0gbWVkID0gYTsKLSAgICBpZiAoYiA+IG1heCkKLSAgICB7Ci0gICAgICAgIG1heCA9IGI7Ci0gICAgfQotICAgIGVsc2UgaWYgKGIgPCBtaW4pCi0gICAgewotICAgICAgICBtaW4gPSBiOwotICAgIH0KLSAgICBpZiAoYyA+IG1heCkKLSAgICB7Ci0gICAgICAgIG1lZCA9IG1heDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoYyA8IG1pbikKLSAgICB7Ci0gICAgICAgIG1lZCA9IG1pbjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgbWVkID0gYzsKLSAgICB9Ci0KLSAgICByZXR1cm4obWVkKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBHZXRJbnRlck5laWdoYm91cgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBHZXQgYXZhaWxhYmlsaXR5LCByZWZlcmVuY2UgaW5kZXggYW5kIG1vdGlvbiB2ZWN0b3Igb2YgYSBuZWlnaGJvdXIKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBHZXRJbnRlck5laWdoYm91cih1MzIgc2xpY2VJZCwgbWJTdG9yYWdlX3QgKm5NYiwKLSAgICBpbnRlck5laWdoYm91cl90ICpuLCB1MzIgaW5kZXgpCi17Ci0KLSAgICBuLT5hdmFpbGFibGUgPSBIQU5UUk9fRkFMU0U7Ci0gICAgbi0+cmVmSW5kZXggPSAweEZGRkZGRkZGOwotICAgIG4tPm12LmhvciA9IG4tPm12LnZlciA9IDA7Ci0KLSAgICBpZiAobk1iICYmIChzbGljZUlkID09IG5NYi0+c2xpY2VJZCkpCi0gICAgewotICAgICAgICB1MzIgdG1wOwotICAgICAgICBtdl90IHRtcE12OwotCi0gICAgICAgIHRtcCA9IG5NYi0+bWJUeXBlOwotICAgICAgICBuLT5hdmFpbGFibGUgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgLyogTWJQYXJ0UHJlZE1vZGUgImlubGluZWQiICovCi0gICAgICAgIGlmICh0bXAgPD0gUF84eDhyZWYwKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXBNdiA9IG5NYi0+bXZbaW5kZXhdOwotICAgICAgICAgICAgdG1wID0gbk1iLT5yZWZQaWNbaW5kZXg+PjJdOwotICAgICAgICAgICAgbi0+cmVmSW5kZXggPSB0bXA7Ci0gICAgICAgICAgICBuLT5tdiA9IHRtcE12OwotICAgICAgICB9Ci0gICAgfQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogR2V0UHJlZGljdGlvbk12Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIENvbXB1dGUgbW90aW9uIHZlY3RvciBwcmVkaWN0b3IgYmFzZWQgb24gbmVpZ2hib3VycyBBLCBCIGFuZCBDCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgR2V0UHJlZGljdGlvbk12KG12X3QgKm12LCBpbnRlck5laWdoYm91cl90ICphLCB1MzIgcmVmSW5kZXgpCi17Ci0KLSAgICBpZiAoIGFbMV0uYXZhaWxhYmxlIHx8IGFbMl0uYXZhaWxhYmxlIHx8ICFhWzBdLmF2YWlsYWJsZSkKLSAgICB7Ci0gICAgICAgIHUzMiBpc0EsIGlzQiwgaXNDOwotICAgICAgICBpc0EgPSAoYVswXS5yZWZJbmRleCA9PSByZWZJbmRleCkgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLSAgICAgICAgaXNCID0gKGFbMV0ucmVmSW5kZXggPT0gcmVmSW5kZXgpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0gICAgICAgIGlzQyA9IChhWzJdLnJlZkluZGV4ID09IHJlZkluZGV4KSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgICAgIGlmICgoKHUzMilpc0ErKHUzMilpc0IrKHUzMilpc0MpICE9IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG12LT5ob3IgPSAoaTE2KU1lZGlhbkZpbHRlcihhWzBdLm12LmhvciwgYVsxXS5tdi5ob3IsIGFbMl0ubXYuaG9yKTsKLSAgICAgICAgICAgIG12LT52ZXIgPSAoaTE2KU1lZGlhbkZpbHRlcihhWzBdLm12LnZlciwgYVsxXS5tdi52ZXIsIGFbMl0ubXYudmVyKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChpc0EpCi0gICAgICAgICAgICAqbXYgPSBhWzBdLm12OwotICAgICAgICBlbHNlIGlmIChpc0IpCi0gICAgICAgICAgICAqbXYgPSBhWzFdLm12OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAqbXYgPSBhWzJdLm12OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAqbXYgPSBhWzBdLm12OwotICAgIH0KLQotfQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRlcl9wcmVkaWN0aW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW50ZXJfcHJlZGljdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGRlZTI1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRlcl9wcmVkaWN0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotICAgIDMuIERhdGEgdHlwZXMKLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSDI2NFNXREVDX0lOVEVSX1BSRURJQ1RJT05fSAotI2RlZmluZSBIMjY0U1dERUNfSU5URVJfUFJFRElDVElPTl9ICi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLSNpbmNsdWRlICJoMjY0YnNkX2ltYWdlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9kcGIuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBEYXRhIHR5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkSW50ZXJQcmVkaWN0aW9uKG1iU3RvcmFnZV90ICpwTWIsIG1hY3JvYmxvY2tMYXllcl90ICpwTWJMYXllciwKLSAgICBkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIG1iTnVtLCBpbWFnZV90ICppbWFnZSwgdTggKmRhdGEpOwotCi0jZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19JTlRFUl9QUkVESUNUSU9OX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ludHJhX3ByZWRpY3Rpb24uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRyYV9wcmVkaWN0aW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyYzg1ZTUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ludHJhX3ByZWRpY3Rpb24uYworKysgL2Rldi9udWxsCkBAIC0xLDE5MzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotICAgICAzLiBNb2R1bGUgZGVmaW5lcwotICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0gICAgIDUuIEZ1bmN0aW9ucwotICAgICAgICAgIGgyNjRic2RJbnRyYVByZWRpY3Rpb24KLSAgICAgICAgICBoMjY0YnNkR2V0TmVpZ2hib3VyUGVscwotICAgICAgICAgIGgyNjRic2RJbnRyYTE2eDE2UHJlZGljdGlvbgotICAgICAgICAgIGgyNjRic2RJbnRyYTR4NFByZWRpY3Rpb24KLSAgICAgICAgICBoMjY0YnNkSW50cmFDaHJvbWFQcmVkaWN0aW9uCi0gICAgICAgICAgaDI2NGJzZEFkZFJlc2lkdWFsCi0gICAgICAgICAgSW50cmExNngxNlZlcnRpY2FsUHJlZGljdGlvbgotICAgICAgICAgIEludHJhMTZ4MTZIb3Jpem9udGFsUHJlZGljdGlvbgotICAgICAgICAgIEludHJhMTZ4MTZEY1ByZWRpY3Rpb24KLSAgICAgICAgICBJbnRyYTE2eDE2UGxhbmVQcmVkaWN0aW9uCi0gICAgICAgICAgSW50cmFDaHJvbWFEY1ByZWRpY3Rpb24KLSAgICAgICAgICBJbnRyYUNocm9tYUhvcml6b250YWxQcmVkaWN0aW9uCi0gICAgICAgICAgSW50cmFDaHJvbWFWZXJ0aWNhbFByZWRpY3Rpb24KLSAgICAgICAgICBJbnRyYUNocm9tYVBsYW5lUHJlZGljdGlvbgotICAgICAgICAgIEdldDR4NE5laWdoYm91clBlbHMKLSAgICAgICAgICBXcml0ZTR4NFRvMTZ4MTYKLSAgICAgICAgICBJbnRyYTR4NFZlcnRpY2FsUHJlZGljdGlvbgotICAgICAgICAgIEludHJhNHg0SG9yaXpvbnRhbFByZWRpY3Rpb24KLSAgICAgICAgICBJbnRyYTR4NERjUHJlZGljdGlvbgotICAgICAgICAgIEludHJhNHg0RGlhZ29uYWxEb3duTGVmdFByZWRpY3Rpb24KLSAgICAgICAgICBJbnRyYTR4NERpYWdvbmFsRG93blJpZ2h0UHJlZGljdGlvbgotICAgICAgICAgIEludHJhNHg0VmVydGljYWxSaWdodFByZWRpY3Rpb24KLSAgICAgICAgICBJbnRyYTR4NEhvcml6b250YWxEb3duUHJlZGljdGlvbgotICAgICAgICAgIEludHJhNHg0VmVydGljYWxMZWZ0UHJlZGljdGlvbgotICAgICAgICAgIEludHJhNHg0SG9yaXpvbnRhbFVwUHJlZGljdGlvbgotICAgICAgICAgIERldGVybWluZUludHJhNHg0UHJlZE1vZGUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJoMjY0YnNkX2ludHJhX3ByZWRpY3Rpb24uaCIKLSNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKLSNpbmNsdWRlICJoMjY0YnNkX21hY3JvYmxvY2tfbGF5ZXIuaCIKLSNpbmNsdWRlICJoMjY0YnNkX25laWdoYm91ci5oIgotI2luY2x1ZGUgImgyNjRic2RfaW1hZ2UuaCIKLQotI2lmZGVmIEgyNjRERUNfT01YREwKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0jZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBTd2l0Y2ggb2ZmIHRoZSBmb2xsb3dpbmcgTGludCBtZXNzYWdlcyBmb3IgdGhpcyBmaWxlOgotICogSW5mbyA3MDI6IFNoaWZ0IHJpZ2h0IG9mIHNpZ25lZCBxdWFudGl0eSAoaW50KQotICovCi0vKmxpbnQgLWU3MDIgKi8KLQotCi0vKiB4LSBhbmQgeS1jb29yZGluYXRlcyBmb3IgZWFjaCBibG9jayAqLwotY29uc3QgdTMyIGgyNjRic2RCbG9ja1hbMTZdID0KLSAgICB7IDAsIDQsIDAsIDQsIDgsIDEyLCA4LCAxMiwgMCwgNCwgMCwgNCwgOCwgMTIsIDgsIDEyIH07Ci1jb25zdCB1MzIgaDI2NGJzZEJsb2NrWVsxNl0gPQotICAgIHsgMCwgMCwgNCwgNCwgMCwgMCwgNCwgNCwgOCwgOCwgMTIsIDEyLCA4LCA4LCAxMiwgMTIgfTsKLQotY29uc3QgdTggaDI2NGJzZENsaXBbMTI4MF0gPQotewotICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKLSAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCi0gICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAotICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKLSAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCi0gICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAotICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKLSAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCi0gICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAotICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKLSAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCi0gICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAotICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKLSAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCi0gICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAotICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKLSAgICAwLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LAotICAgIDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLAotICAgIDMyLDMzLDM0LDM1LDM2LDM3LDM4LDM5LDQwLDQxLDQyLDQzLDQ0LDQ1LDQ2LDQ3LAotICAgIDQ4LDQ5LDUwLDUxLDUyLDUzLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYxLDYyLDYzLAotICAgIDY0LDY1LDY2LDY3LDY4LDY5LDcwLDcxLDcyLDczLDc0LDc1LDc2LDc3LDc4LDc5LAotICAgIDgwLDgxLDgyLDgzLDg0LDg1LDg2LDg3LDg4LDg5LDkwLDkxLDkyLDkzLDk0LDk1LAotICAgIDk2LDk3LDk4LDk5LDEwMCwxMDEsMTAyLDEwMywxMDQsMTA1LDEwNiwxMDcsMTA4LDEwOSwxMTAsMTExLAotICAgIDExMiwxMTMsMTE0LDExNSwxMTYsMTE3LDExOCwxMTksMTIwLDEyMSwxMjIsMTIzLDEyNCwxMjUsMTI2LDEyNywKLSAgICAxMjgsMTI5LDEzMCwxMzEsMTMyLDEzMywxMzQsMTM1LDEzNiwxMzcsMTM4LDEzOSwxNDAsMTQxLDE0MiwxNDMsCi0gICAgMTQ0LDE0NSwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsMTUzLDE1NCwxNTUsMTU2LDE1NywxNTgsMTU5LAotICAgIDE2MCwxNjEsMTYyLDE2MywxNjQsMTY1LDE2NiwxNjcsMTY4LDE2OSwxNzAsMTcxLDE3MiwxNzMsMTc0LDE3NSwKLSAgICAxNzYsMTc3LDE3OCwxNzksMTgwLDE4MSwxODIsMTgzLDE4NCwxODUsMTg2LDE4NywxODgsMTg5LDE5MCwxOTEsCi0gICAgMTkyLDE5MywxOTQsMTk1LDE5NiwxOTcsMTk4LDE5OSwyMDAsMjAxLDIwMiwyMDMsMjA0LDIwNSwyMDYsMjA3LAotICAgIDIwOCwyMDksMjEwLDIxMSwyMTIsMjEzLDIxNCwyMTUsMjE2LDIxNywyMTgsMjE5LDIyMCwyMjEsMjIyLDIyMywKLSAgICAyMjQsMjI1LDIyNiwyMjcsMjI4LDIyOSwyMzAsMjMxLDIzMiwyMzMsMjM0LDIzNSwyMzYsMjM3LDIzOCwyMzksCi0gICAgMjQwLDI0MSwyNDIsMjQzLDI0NCwyNDUsMjQ2LDI0NywyNDgsMjQ5LDI1MCwyNTEsMjUyLDI1MywyNTQsMjU1LAotICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKLSAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCi0gICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAotICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKLSAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCi0gICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAotICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKLSAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCi0gICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAotICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKLSAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCi0gICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAotICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKLSAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCi0gICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAotICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKLSAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCi0gICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAotICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKLSAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCi0gICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAotICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKLSAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCi0gICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAotICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKLSAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCi0gICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAotICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKLSAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCi0gICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAotICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKLSAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUKLX07Ci0KLSNpZm5kZWYgSDI2NERFQ19PTVhETAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIHZvaWQgR2V0NHg0TmVpZ2hib3VyUGVscyh1OCAqYSwgdTggKmwsIHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0LAotICAgIHUzMiBibG9ja051bSk7Ci1zdGF0aWMgdm9pZCBJbnRyYTE2eDE2VmVydGljYWxQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUpOwotc3RhdGljIHZvaWQgSW50cmExNngxNkhvcml6b250YWxQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqbGVmdCk7Ci1zdGF0aWMgdm9pZCBJbnRyYTE2eDE2RGNQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0LAotICAgIHUzMiBBLCB1MzIgQik7Ci1zdGF0aWMgdm9pZCBJbnRyYTE2eDE2UGxhbmVQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0KTsKLXN0YXRpYyB2b2lkIEludHJhQ2hyb21hRGNQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0LAotICAgIHUzMiBBLCB1MzIgQik7Ci1zdGF0aWMgdm9pZCBJbnRyYUNocm9tYUhvcml6b250YWxQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqbGVmdCk7Ci1zdGF0aWMgdm9pZCBJbnRyYUNocm9tYVZlcnRpY2FsUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlKTsKLXN0YXRpYyB2b2lkIEludHJhQ2hyb21hUGxhbmVQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0KTsKLQotc3RhdGljIHZvaWQgSW50cmE0eDRWZXJ0aWNhbFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSk7Ci1zdGF0aWMgdm9pZCBJbnRyYTR4NEhvcml6b250YWxQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqbGVmdCk7Ci1zdGF0aWMgdm9pZCBJbnRyYTR4NERjUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlLCB1OCAqbGVmdCwgdTMyIEEsIHUzMiBCKTsKLXN0YXRpYyB2b2lkIEludHJhNHg0RGlhZ29uYWxEb3duTGVmdFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSk7Ci1zdGF0aWMgdm9pZCBJbnRyYTR4NERpYWdvbmFsRG93blJpZ2h0UHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlLCB1OCAqbGVmdCk7Ci1zdGF0aWMgdm9pZCBJbnRyYTR4NFZlcnRpY2FsUmlnaHRQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0KTsKLXN0YXRpYyB2b2lkIEludHJhNHg0SG9yaXpvbnRhbERvd25QcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0KTsKLXN0YXRpYyB2b2lkIEludHJhNHg0VmVydGljYWxMZWZ0UHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlKTsKLXN0YXRpYyB2b2lkIEludHJhNHg0SG9yaXpvbnRhbFVwUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmxlZnQpOwotdm9pZCBoMjY0YnNkQWRkUmVzaWR1YWwodTggKmRhdGEsIGkzMiAqcmVzaWR1YWwsIHUzMiBibG9ja051bSk7Ci0KLXN0YXRpYyB2b2lkIFdyaXRlNHg0VG8xNngxNih1OCAqZGF0YSwgdTggKmRhdGE0eDQsIHUzMiBibG9ja051bSk7Ci0jZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLwotCi1zdGF0aWMgdTMyIERldGVybWluZUludHJhNHg0UHJlZE1vZGUobWFjcm9ibG9ja0xheWVyX3QgKnBNYkxheWVyLAotICAgIHUzMiBhdmFpbGFibGUsIG5laWdoYm91cl90ICpuQSwgbmVpZ2hib3VyX3QgKm5CLCB1MzIgaW5kZXgsCi0gICAgbWJTdG9yYWdlX3QgKm5NYkEsIG1iU3RvcmFnZV90ICpuTWJCKTsKLQotCi0jaWZkZWYgSDI2NERFQ19PTVhETAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RJbnRyYTE2eDE2UHJlZGljdGlvbgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUGVyZm9ybSBpbnRyYSAxNngxNiBwcmVkaWN0aW9uIG1vZGUgZm9yIGx1bWEgcGl4ZWxzIGFuZCBhZGQKLSAgICAgICAgICByZXNpZHVhbCBpbnRvIHByZWRpY3Rpb24uIFRoZSByZXN1bHRpbmcgbHVtYSBwaXhlbHMgYXJlCi0gICAgICAgICAgc3RvcmVkIGluIG1hY3JvYmxvY2sgYXJyYXkgJ2RhdGEnLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdTMyIGgyNjRic2RJbnRyYTE2eDE2UHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCB1OCAqZGF0YSwgdTggKnB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIHdpZHRoLCB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGF2YWlsYWJsZUEsIGF2YWlsYWJsZUIsIGF2YWlsYWJsZUQ7Ci0gICAgT01YUmVzdWx0IG9teFJlczsKLQotLyogQ29kZSAqLwotICAgIEFTU0VSVChwTWIpOwotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQocHRyKTsKLSAgICBBU1NFUlQoaDI2NGJzZFByZWRNb2RlSW50cmExNngxNihwTWItPm1iVHlwZSkgPCA0KTsKLQotICAgIGF2YWlsYWJsZUEgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBwTWItPm1iQSk7Ci0gICAgaWYgKGF2YWlsYWJsZUEgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKLSAgICAgICAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJBLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikpCi0gICAgICAgIGF2YWlsYWJsZUEgPSBIQU5UUk9fRkFMU0U7Ci0gICAgYXZhaWxhYmxlQiA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIHBNYi0+bWJCKTsKLSAgICBpZiAoYXZhaWxhYmxlQiAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgotICAgICAgIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYkItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSkKLSAgICAgICAgYXZhaWxhYmxlQiA9IEhBTlRST19GQUxTRTsKLSAgICBhdmFpbGFibGVEID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgcE1iLT5tYkQpOwotICAgIGlmIChhdmFpbGFibGVEICYmIGNvbnN0cmFpbmVkSW50cmFQcmVkICYmCi0gICAgICAgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWItPm1iRC0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpKQotICAgICAgICBhdmFpbGFibGVEID0gSEFOVFJPX0ZBTFNFOwotCi0gICAgb214UmVzID0gb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYoIChwdHItMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHRyIC0gd2lkdGgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB0ciAtIHdpZHRoLTEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRNb2RlSW50cmExNngxNihwTWItPm1iVHlwZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaTMyKShhdmFpbGFibGVCICsgKGF2YWlsYWJsZUE8PDEpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXZhaWxhYmxlRDw8NSkpICk7Ci0gICAgaWYgKG9teFJlcyAhPSBPTVhfU3RzX05vRXJyKQotICAgICAgICByZXR1cm4gSEFOVFJPX05PSzsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybihIQU5UUk9fT0spOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RJbnRyYTR4NFByZWRpY3Rpb24KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFBlcmZvcm0gaW50cmEgNHg0IHByZWRpY3Rpb24gZm9yIGx1bWEgcGl4ZWxzIGFuZCBhZGQgcmVzaWR1YWwKLSAgICAgICAgICBpbnRvIHByZWRpY3Rpb24uIFRoZSByZXN1bHRpbmcgbHVtYSBwaXhlbHMgYXJlIHN0b3JlZCBpbgotICAgICAgICAgIG1hY3JvYmxvY2sgYXJyYXkgJ2RhdGEnLiBUaGUgaW50cmEgNHg0IHByZWRpY3Rpb24gbW9kZSBmb3IgZWFjaAotICAgICAgICAgIGJsb2NrIGlzIHN0b3JlZCBpbiAncE1iJyBzdHJ1Y3R1cmUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi11MzIgaDI2NGJzZEludHJhNHg0UHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCB1OCAqZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2tMYXllcl90ICptYkxheWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKnB0ciwgdTMyIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkLCB1MzIgYmxvY2spCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotICAgIHUzMiBtb2RlOwotICAgIG5laWdoYm91cl90IG5laWdoYm91ciwgbmVpZ2hib3VyQjsKLSAgICBtYlN0b3JhZ2VfdCAqbk1iLCAqbk1iMjsKLSAgICB1MzIgYXZhaWxhYmxlQSwgYXZhaWxhYmxlQiwgYXZhaWxhYmxlQywgYXZhaWxhYmxlRDsKLQotICAgIE9NWFJlc3VsdCBvbXhSZXM7Ci0gICAgdTMyIHgsIHk7Ci0gICAgdTggKmwsICphLCAqYWw7Ci0vKiBDb2RlICovCi0gICAgQVNTRVJUKHBNYik7Ci0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChtYkxheWVyKTsKLSAgICBBU1NFUlQocHRyKTsKLSAgICBBU1NFUlQocE1iLT5pbnRyYTR4NFByZWRNb2RlW2Jsb2NrXSA8IDkpOwotCi0gICAgbmVpZ2hib3VyID0gKmgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0EoYmxvY2spOwotICAgIG5NYiA9IGgyNjRic2RHZXROZWlnaGJvdXJNYihwTWIsIG5laWdoYm91ci5tYik7Ci0gICAgYXZhaWxhYmxlQSA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIG5NYik7Ci0gICAgaWYgKGF2YWlsYWJsZUEgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKLSAgICAgICAoIGgyNjRic2RNYlBhcnRQcmVkTW9kZShuTWItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSApCi0gICAgewotICAgICAgICBhdmFpbGFibGVBID0gSEFOVFJPX0ZBTFNFOwotICAgIH0KLQotICAgIG5laWdoYm91ckIgPSAqaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQihibG9jayk7Ci0gICAgbk1iMiA9IGgyNjRic2RHZXROZWlnaGJvdXJNYihwTWIsIG5laWdoYm91ckIubWIpOwotICAgIGF2YWlsYWJsZUIgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBuTWIyKTsKLSAgICBpZiAoYXZhaWxhYmxlQiAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgotICAgICAgICggaDI2NGJzZE1iUGFydFByZWRNb2RlKG5NYjItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSApCi0gICAgewotICAgICAgICBhdmFpbGFibGVCID0gSEFOVFJPX0ZBTFNFOwotICAgIH0KLQotICAgIG1vZGUgPSBEZXRlcm1pbmVJbnRyYTR4NFByZWRNb2RlKG1iTGF5ZXIsCi0gICAgICAgICh1MzIpKGF2YWlsYWJsZUEgJiYgYXZhaWxhYmxlQiksCi0gICAgICAgICZuZWlnaGJvdXIsICZuZWlnaGJvdXJCLCBibG9jaywgbk1iLCBuTWIyKTsKLSAgICBwTWItPmludHJhNHg0UHJlZE1vZGVbYmxvY2tdID0gKHU4KW1vZGU7Ci0KLSAgICBuZWlnaGJvdXIgPSAqaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQyhibG9jayk7Ci0gICAgbk1iID0gaDI2NGJzZEdldE5laWdoYm91ck1iKHBNYiwgbmVpZ2hib3VyLm1iKTsKLSAgICBhdmFpbGFibGVDID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgbk1iKTsKLSAgICBpZiAoYXZhaWxhYmxlQyAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgotICAgICAgICggaDI2NGJzZE1iUGFydFByZWRNb2RlKG5NYi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpICkKLSAgICB7Ci0gICAgICAgIGF2YWlsYWJsZUMgPSBIQU5UUk9fRkFMU0U7Ci0gICAgfQotCi0gICAgbmVpZ2hib3VyID0gKmgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0QoYmxvY2spOwotICAgIG5NYiA9IGgyNjRic2RHZXROZWlnaGJvdXJNYihwTWIsIG5laWdoYm91ci5tYik7Ci0gICAgYXZhaWxhYmxlRCA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIG5NYik7Ci0gICAgaWYgKGF2YWlsYWJsZUQgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKLSAgICAgICAoIGgyNjRic2RNYlBhcnRQcmVkTW9kZShuTWItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSApCi0gICAgewotICAgICAgICBhdmFpbGFibGVEID0gSEFOVFJPX0ZBTFNFOwotICAgIH0KLQotICAgIHggPSBoMjY0YnNkQmxvY2tYW2Jsb2NrXTsKLSAgICB5ID0gaDI2NGJzZEJsb2NrWVtibG9ja107Ci0KLSAgICBpZiAoeSA9PSAwKQotICAgICAgICBhID0gcHRyIC0gd2lkdGggKyB4OwotICAgIGVsc2UKLSAgICAgICAgYSA9IGRhdGEtMTY7Ci0KLSAgICBpZiAoeCA9PSAwKQotICAgICAgICBsID0gcHRyICsgeSAqIHdpZHRoIC0xOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGwgPSBkYXRhLTE7Ci0gICAgICAgIHdpZHRoID0gMTY7Ci0gICAgfQotCi0gICAgaWYgKHggPT0gMCkKLSAgICAgICAgYWwgPSBsLXdpZHRoOwotICAgIGVsc2UKLSAgICAgICAgYWwgPSBhLTE7Ci0KLSAgICBvbXhSZXMgPSBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQoIGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlKW1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaTMyKShhdmFpbGFibGVCICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdmFpbGFibGVBPDwxKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXZhaWxhYmxlRDw8NSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF2YWlsYWJsZUM8PDYpKSApOwotICAgIGlmIChvbXhSZXMgIT0gT01YX1N0c19Ob0VycikKLSAgICAgICAgcmV0dXJuIEhBTlRST19OT0s7Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RJbnRyYUNocm9tYVByZWRpY3Rpb24KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFBlcmZvcm0gaW50cmEgcHJlZGljdGlvbiBmb3IgY2hyb21hIHBpeGVscyBhbmQgYWRkIHJlc2lkdWFsCi0gICAgICAgICAgaW50byBwcmVkaWN0aW9uLiBUaGUgcmVzdWx0aW5nIGNocm9tYSBwaXhlbHMgYXJlIHN0b3JlZCBpbiAnZGF0YScuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi11MzIgaDI2NGJzZEludHJhQ2hyb21hUHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCB1OCAqZGF0YSwgaW1hZ2VfdCAqaW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIHByZWRNb2RlLCB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGF2YWlsYWJsZUEsIGF2YWlsYWJsZUIsIGF2YWlsYWJsZUQ7Ci0gICAgT01YUmVzdWx0IG9teFJlczsKLSAgICB1OCAqcHRyOwotICAgIHUzMiB3aWR0aDsKLQotLyogQ29kZSAqLwotICAgIEFTU0VSVChwTWIpOwotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQoaW1hZ2UpOwotICAgIEFTU0VSVChwcmVkTW9kZSA8IDQpOwotCi0gICAgYXZhaWxhYmxlQSA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIHBNYi0+bWJBKTsKLSAgICBpZiAoYXZhaWxhYmxlQSAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgotICAgICAgIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYkEtPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSkKLSAgICAgICAgYXZhaWxhYmxlQSA9IEhBTlRST19GQUxTRTsKLSAgICBhdmFpbGFibGVCID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgcE1iLT5tYkIpOwotICAgIGlmIChhdmFpbGFibGVCICYmIGNvbnN0cmFpbmVkSW50cmFQcmVkICYmCi0gICAgICAgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWItPm1iQi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpKQotICAgICAgICBhdmFpbGFibGVCID0gSEFOVFJPX0ZBTFNFOwotICAgIGF2YWlsYWJsZUQgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBwTWItPm1iRCk7Ci0gICAgaWYgKGF2YWlsYWJsZUQgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKLSAgICAgICAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJELT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikpCi0gICAgICAgIGF2YWlsYWJsZUQgPSBIQU5UUk9fRkFMU0U7Ci0KLSAgICBwdHIgPSBpbWFnZS0+Y2I7Ci0gICAgd2lkdGggPSBpbWFnZS0+d2lkdGgqODsKLQotICAgIG9teFJlcyA9IG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCggKHB0ci0xKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdHIgLSB3aWR0aCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHRyIC0gd2lkdGggLTEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWFZDTTRQMTBJbnRyYUNocm9tYVByZWRNb2RlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZE1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaTMyKShhdmFpbGFibGVCICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXZhaWxhYmxlQTw8MSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdmFpbGFibGVEPDw1KSkgKTsKLSAgICBpZiAob214UmVzICE9IE9NWF9TdHNfTm9FcnIpCi0gICAgICAgIHJldHVybiBIQU5UUk9fTk9LOwotCi0gICAgLyogYWR2YW5jZSBwb2ludGVycyAqLwotICAgIGRhdGEgKz0gNjQ7Ci0gICAgcHRyID0gaW1hZ2UtPmNyOwotCi0gICAgb214UmVzID0gb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4KCAocHRyLTEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB0ciAtIHdpZHRoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdHIgLSB3aWR0aCAtMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YVkNNNFAxMEludHJhQ2hyb21hUHJlZE1vZGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzIpKGF2YWlsYWJsZUIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdmFpbGFibGVBPDwxKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF2YWlsYWJsZUQ8PDUpKSApOwotICAgIGlmIChvbXhSZXMgIT0gT01YX1N0c19Ob0VycikKLSAgICAgICAgcmV0dXJuIEhBTlRST19OT0s7Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0KLSNlbHNlIC8qIEgyNjRERUNfT01YREwgKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RJbnRyYVByZWRpY3Rpb24KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFByb2Nlc3NlcyBvbmUgaW50cmEgbWFjcm9ibG9jay4gUGVyZm9ybXMgaW50cmEgcHJlZGljdGlvbiB1c2luZwotICAgICAgICAgIHNwZWNpZmllZCBwcmVkaWN0aW9uIG1vZGUuIFdyaXRlcyB0aGUgZmluYWwgbWFjcm9ibG9jawotICAgICAgICAgIChwcmVkaWN0aW9uICsgcmVzaWR1YWwpIGludG8gdGhlIG91dHB1dCBpbWFnZSAoaW1hZ2UpCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIHBNYiAgICAgICAgICAgcG9pbnRlciB0byBtYWNyb2Jsb2NrIHNwZWNpZmljIGluZm9ybWF0aW9uCi0gICAgICAgICAgbWJMYXllciAgICAgICBwb2ludGVyIHRvIGN1cnJlbnQgbWFjcm9ibG9jayBkYXRhIGZyb20gc3RyZWFtCi0gICAgICAgICAgaW1hZ2UgICAgICAgICBwb2ludGVyIHRvIG91dHB1dCBpbWFnZQotICAgICAgICAgIG1iTnVtICAgICAgICAgY3VycmVudCBtYWNyb2Jsb2NrIG51bWJlcgotICAgICAgICAgIGNvbnN0cmFpbmVkSW50cmFQcmVkICBmbGFnIHNwZWNpZnlpbmcgaWYgbmVpZ2hib3VyaW5nIGludGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2tzIGFyZSB1c2VkIGluIGludHJhIHByZWRpY3Rpb24KLSAgICAgICAgICBkYXRhICAgICAgICAgIHBvaW50ZXIgd2hlcmUgb3V0cHV0IG1hY3JvYmxvY2sgd2lsbCBiZSBzdG9yZWQKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIHBNYiAgICAgICAgICAgc3RydWN0dXJlIGlzIHVwZGF0ZWQgd2l0aCBjdXJyZW50IG1hY3JvYmxvY2sKLSAgICAgICAgICBpbWFnZSAgICAgICAgIGN1cnJlbnQgbWFjcm9ibG9jayBpcyB3cml0dGVuIGludG8gaW1hZ2UKLSAgICAgICAgICBkYXRhICAgICAgICAgIGN1cnJlbnQgbWFjcm9ibG9jayBpcyBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgSEFOVFJPX09LICAgICBzdWNjZXNzCi0gICAgICAgICAgSEFOVFJPX05PSyAgICBlcnJvciBpbiBpbnRyYSBwcmVkaWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi11MzIgaDI2NGJzZEludHJhUHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCBtYWNyb2Jsb2NrTGF5ZXJfdCAqbWJMYXllciwKLSAgICBpbWFnZV90ICppbWFnZSwgdTMyIG1iTnVtLCB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQsIHU4ICpkYXRhKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIC8qIHBlbEFib3ZlIGFuZCBwZWxMZWZ0IGNvbnRhaW4gc2FtcGxlcyBhYm92ZSBhbmQgbGVmdCB0byB0aGUgY3VycmVudAotICAgICAqIG1hY3JvYmxvY2suIEFib3ZlIGFycmF5IGNvbnRhaW5zIGFsc28gc2FtcGxlIGFib3ZlLWxlZnQgdG8gdGhlIGN1cnJlbnQKLSAgICAgKiBtYiBhcyB3ZWxsIGFzIDQgc2FtcGxlcyBhYm92ZS1yaWdodCB0byB0aGUgY3VycmVudCBtYiAobGF0dGVyIG9ubHkgZm9yCi0gICAgICogbHVtYSkgKi8KLSAgICAvKiBsdW1EICsgbHVtQiArIGx1bUMgKyBjYkQgKyBjYkIgKyBjckQgKyBjckIgKi8KLSAgICB1OCBwZWxBYm92ZVsxICsgMTYgKyA0ICsgMSArIDggKyAxICsgOF07Ci0gICAgLyogbHVtQSArIGNiQSArIGNyQSAqLwotICAgIHU4IHBlbExlZnRbMTYgKyA4ICsgOF07Ci0gICAgdTMyIHRtcDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBNYik7Ci0gICAgQVNTRVJUKGltYWdlKTsKLSAgICBBU1NFUlQobWJOdW0gPCBpbWFnZS0+d2lkdGggKiBpbWFnZS0+aGVpZ2h0KTsKLSAgICBBU1NFUlQoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJUeXBlKSAhPSBQUkVEX01PREVfSU5URVIpOwotCi0gICAgaDI2NGJzZEdldE5laWdoYm91clBlbHMoaW1hZ2UsIHBlbEFib3ZlLCBwZWxMZWZ0LCBtYk51bSk7Ci0KLSAgICBpZiAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5UUkExNngxNikKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2RJbnRyYTE2eDE2UHJlZGljdGlvbihwTWIsIGRhdGEsIG1iTGF5ZXItPnJlc2lkdWFsLmxldmVsLAotICAgICAgICAgICAgcGVsQWJvdmUsIHBlbExlZnQsIGNvbnN0cmFpbmVkSW50cmFQcmVkKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZEludHJhNHg0UHJlZGljdGlvbihwTWIsIGRhdGEsIG1iTGF5ZXIsCi0gICAgICAgICAgICBwZWxBYm92ZSwgcGVsTGVmdCwgY29uc3RyYWluZWRJbnRyYVByZWQpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgIH0KLQotICAgIHRtcCA9IGgyNjRic2RJbnRyYUNocm9tYVByZWRpY3Rpb24ocE1iLCBkYXRhICsgMjU2LAotICAgICAgICAgICAgbWJMYXllci0+cmVzaWR1YWwubGV2ZWwrMTYsIHBlbEFib3ZlICsgMjEsIHBlbExlZnQgKyAxNiwKLSAgICAgICAgICAgIG1iTGF5ZXItPm1iUHJlZC5pbnRyYUNocm9tYVByZWRNb2RlLCBjb25zdHJhaW5lZEludHJhUHJlZCk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgLyogaWYgZGVjb2RlZCBmbGFnID4gMSAtPiBtYiBoYXMgYWxyZWFkeSBiZWVuIHN1Y2Nlc3NmdWxseSBkZWNvZGVkIGFuZAotICAgICAqIHdyaXR0ZW4gdG8gb3V0cHV0IC0+IGRvIG5vdCB3cml0ZSBhZ2FpbiAqLwotICAgIGlmIChwTWItPmRlY29kZWQgPiAxKQotICAgICAgICByZXR1cm4gSEFOVFJPX09LOwotCi0gICAgaDI2NGJzZFdyaXRlTWFjcm9ibG9jayhpbWFnZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RHZXROZWlnaGJvdXJQZWxzCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBHZXQgcGl4ZWwgdmFsdWVzIGZyb20gbmVpZ2hib3VyaW5nIG1hY3JvYmxvY2tzIGludG8gJ2Fib3ZlJwotICAgICAgICAgIGFuZCAnbGVmdCcgYXJyYXlzLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIGgyNjRic2RHZXROZWlnaGJvdXJQZWxzKGltYWdlX3QgKmltYWdlLCB1OCAqYWJvdmUsIHU4ICpsZWZ0LCB1MzIgbWJOdW0pCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGk7Ci0gICAgdTMyIHdpZHRoLCBwaWNTaXplOwotICAgIHU4ICpwdHIsICp0bXA7Ci0gICAgdTMyIHJvdywgY29sOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoaW1hZ2UpOwotICAgIEFTU0VSVChhYm92ZSk7Ci0gICAgQVNTRVJUKGxlZnQpOwotICAgIEFTU0VSVChtYk51bSA8IGltYWdlLT53aWR0aCAqIGltYWdlLT5oZWlnaHQpOwotCi0gICAgaWYgKCFtYk51bSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgd2lkdGggPSBpbWFnZS0+d2lkdGg7Ci0gICAgcGljU2l6ZSA9IHdpZHRoICogaW1hZ2UtPmhlaWdodDsKLSAgICByb3cgPSBtYk51bSAvIHdpZHRoOwotICAgIGNvbCA9IG1iTnVtIC0gcm93ICogd2lkdGg7Ci0KLSAgICB3aWR0aCAqPSAxNjsKLSAgICBwdHIgPSBpbWFnZS0+ZGF0YSArIHJvdyAqIDE2ICogd2lkdGggICsgY29sICogMTY7Ci0KLSAgICAvKiBub3RlIHRoYXQgbHVtYSBzYW1wbGVzIGFib3ZlLXJpZ2h0IHRvIGN1cnJlbnQgbWFjcm9ibG9jayBkbyBub3QgbWFrZQotICAgICAqIHNlbnNlIHdoZW4gY3VycmVudCBtYiBpcyB0aGUgcmlnaHQtbW9zdCBtYiBpbiBhIHJvdy4gU2FtZSBhcHBsaWVzIHRvCi0gICAgICogc2FtcGxlIGFib3ZlLWxlZnQgaWYgY29sIGlzIHplcm8uIEhvd2V2ZXIsIHVzYWdlIG9mIHBlbHMgaW4gcHJlZGljdGlvbgotICAgICAqIGlzIGNvbnRyb2xsZWQgYnkgbmVpZ2hib3VyIGF2YWlsYWJpbGl0eSBpbmZvcm1hdGlvbiBpbiBhY3R1YWwgcHJlZGljdGlvbgotICAgICAqIHByb2Nlc3MgKi8KLSAgICBpZiAocm93KQotICAgIHsKLSAgICAgICAgdG1wID0gcHRyIC0gKHdpZHRoICsgMSk7Ci0gICAgICAgIGZvciAoaSA9IDIxOyBpLS07KQotICAgICAgICAgICAgKmFib3ZlKysgPSAqdG1wKys7Ci0gICAgfQotCi0gICAgaWYgKGNvbCkKLSAgICB7Ci0gICAgICAgIHB0ci0tOwotICAgICAgICBmb3IgKGkgPSAxNjsgaS0tOyBwdHIrPXdpZHRoKQotICAgICAgICAgICAgKmxlZnQrKyA9ICpwdHI7Ci0gICAgfQotCi0gICAgd2lkdGggPj49IDE7Ci0gICAgcHRyID0gaW1hZ2UtPmRhdGEgKyBwaWNTaXplICogMjU2ICsgcm93ICogOCAqIHdpZHRoICArIGNvbCAqIDg7Ci0KLSAgICBpZiAocm93KQotICAgIHsKLSAgICAgICAgdG1wID0gcHRyIC0gKHdpZHRoICsgMSk7Ci0gICAgICAgIGZvciAoaSA9IDk7IGktLTspCi0gICAgICAgICAgICAqYWJvdmUrKyA9ICp0bXArKzsKLSAgICAgICAgdG1wICs9IChwaWNTaXplICogNjQpIC0gOTsKLSAgICAgICAgZm9yIChpID0gOTsgaS0tOykKLSAgICAgICAgICAgICphYm92ZSsrID0gKnRtcCsrOwotICAgIH0KLQotICAgIGlmIChjb2wpCi0gICAgewotICAgICAgICBwdHItLTsKLSAgICAgICAgZm9yIChpID0gODsgaS0tOyBwdHIrPXdpZHRoKQotICAgICAgICAgICAgKmxlZnQrKyA9ICpwdHI7Ci0gICAgICAgIHB0ciArPSAocGljU2l6ZSAqIDY0KSAtIDggKiB3aWR0aDsKLSAgICAgICAgZm9yIChpID0gODsgaS0tOyBwdHIrPXdpZHRoKQotICAgICAgICAgICAgKmxlZnQrKyA9ICpwdHI7Ci0gICAgfQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEludHJhMTZ4MTZQcmVkaWN0aW9uCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQZXJmb3JtIGludHJhIDE2eDE2IHByZWRpY3Rpb24gbW9kZSBmb3IgbHVtYSBwaXhlbHMgYW5kIGFkZAotICAgICAgICAgIHJlc2lkdWFsIGludG8gcHJlZGljdGlvbi4gVGhlIHJlc3VsdGluZyBsdW1hIHBpeGVscyBhcmUKLSAgICAgICAgICBzdG9yZWQgaW4gbWFjcm9ibG9jayBhcnJheSAnZGF0YScuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkSW50cmExNngxNlByZWRpY3Rpb24obWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsIGkzMiByZXNpZHVhbFtdWzE2XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKmFib3ZlLCB1OCAqbGVmdCwgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpOwotICAgIHUzMiBhdmFpbGFibGVBLCBhdmFpbGFibGVCLCBhdmFpbGFibGVEOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKHJlc2lkdWFsKTsKLSAgICBBU1NFUlQoYWJvdmUpOwotICAgIEFTU0VSVChsZWZ0KTsKLSAgICBBU1NFUlQoaDI2NGJzZFByZWRNb2RlSW50cmExNngxNihwTWItPm1iVHlwZSkgPCA0KTsKLQotICAgIGF2YWlsYWJsZUEgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBwTWItPm1iQSk7Ci0gICAgaWYgKGF2YWlsYWJsZUEgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKLSAgICAgICAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJBLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikpCi0gICAgICAgIGF2YWlsYWJsZUEgPSBIQU5UUk9fRkFMU0U7Ci0gICAgYXZhaWxhYmxlQiA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIHBNYi0+bWJCKTsKLSAgICBpZiAoYXZhaWxhYmxlQiAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgotICAgICAgIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYkItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSkKLSAgICAgICAgYXZhaWxhYmxlQiA9IEhBTlRST19GQUxTRTsKLSAgICBhdmFpbGFibGVEID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgcE1iLT5tYkQpOwotICAgIGlmIChhdmFpbGFibGVEICYmIGNvbnN0cmFpbmVkSW50cmFQcmVkICYmCi0gICAgICAgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWItPm1iRC0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpKQotICAgICAgICBhdmFpbGFibGVEID0gSEFOVFJPX0ZBTFNFOwotCi0gICAgc3dpdGNoKGgyNjRic2RQcmVkTW9kZUludHJhMTZ4MTYocE1iLT5tYlR5cGUpKQotICAgIHsKLSAgICAgICAgY2FzZSAwOiAvKiBJbnRyYV8xNngxNl9WZXJ0aWNhbCAqLwotICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVCKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIEludHJhMTZ4MTZWZXJ0aWNhbFByZWRpY3Rpb24oZGF0YSwgYWJvdmUrMSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDE6IC8qIEludHJhXzE2eDE2X0hvcml6b250YWwgKi8KLSAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQSkKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICBJbnRyYTE2eDE2SG9yaXpvbnRhbFByZWRpY3Rpb24oZGF0YSwgbGVmdCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDI6IC8qIEludHJhXzE2eDE2X0RDICovCi0gICAgICAgICAgICBJbnRyYTE2eDE2RGNQcmVkaWN0aW9uKGRhdGEsIGFib3ZlKzEsIGxlZnQsIGF2YWlsYWJsZUEsIGF2YWlsYWJsZUIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDogLyogY2FzZSAzOiBJbnRyYV8xNngxNl9QbGFuZSAqLwotICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVBIHx8ICFhdmFpbGFibGVCIHx8ICFhdmFpbGFibGVEKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIEludHJhMTZ4MTZQbGFuZVByZWRpY3Rpb24oZGF0YSwgYWJvdmUrMSwgbGVmdCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgLyogYWRkIHJlc2lkdWFsICovCi0gICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgICAgIGgyNjRic2RBZGRSZXNpZHVhbChkYXRhLCByZXNpZHVhbFtpXSwgaSk7Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEludHJhNHg0UHJlZGljdGlvbgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUGVyZm9ybSBpbnRyYSA0eDQgcHJlZGljdGlvbiBmb3IgbHVtYSBwaXhlbHMgYW5kIGFkZCByZXNpZHVhbAotICAgICAgICAgIGludG8gcHJlZGljdGlvbi4gVGhlIHJlc3VsdGluZyBsdW1hIHBpeGVscyBhcmUgc3RvcmVkIGluCi0gICAgICAgICAgbWFjcm9ibG9jayBhcnJheSAnZGF0YScuIFRoZSBpbnRyYSA0eDQgcHJlZGljdGlvbiBtb2RlIGZvciBlYWNoCi0gICAgICAgICAgYmxvY2sgaXMgc3RvcmVkIGluICdwTWInIHN0cnVjdHVyZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RJbnRyYTR4NFByZWRpY3Rpb24obWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrTGF5ZXJfdCAqbWJMYXllciwgdTggKmFib3ZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKmxlZnQsIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgYmxvY2s7Ci0gICAgdTMyIG1vZGU7Ci0gICAgbmVpZ2hib3VyX3QgbmVpZ2hib3VyLCBuZWlnaGJvdXJCOwotICAgIG1iU3RvcmFnZV90ICpuTWIsICpuTWIyOwotICAgIHU4IGFbMSArIDQgKyA0XSwgbFsxICsgNF07Ci0gICAgdTMyIGRhdGE0eDRbNF07Ci0gICAgdTMyIGF2YWlsYWJsZUEsIGF2YWlsYWJsZUIsIGF2YWlsYWJsZUMsIGF2YWlsYWJsZUQ7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQobWJMYXllcik7Ci0gICAgQVNTRVJUKGFib3ZlKTsKLSAgICBBU1NFUlQobGVmdCk7Ci0KLSAgICBmb3IgKGJsb2NrID0gMDsgYmxvY2sgPCAxNjsgYmxvY2srKykKLSAgICB7Ci0KLSAgICAgICAgQVNTRVJUKHBNYi0+aW50cmE0eDRQcmVkTW9kZVtibG9ja10gPCA5KTsKLQotICAgICAgICBuZWlnaGJvdXIgPSAqaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQShibG9jayk7Ci0gICAgICAgIG5NYiA9IGgyNjRic2RHZXROZWlnaGJvdXJNYihwTWIsIG5laWdoYm91ci5tYik7Ci0gICAgICAgIGF2YWlsYWJsZUEgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBuTWIpOwotICAgICAgICBpZiAoYXZhaWxhYmxlQSAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgotICAgICAgICAgICAoIGgyNjRic2RNYlBhcnRQcmVkTW9kZShuTWItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGF2YWlsYWJsZUEgPSBIQU5UUk9fRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICBuZWlnaGJvdXJCID0gKmgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0IoYmxvY2spOwotICAgICAgICBuTWIyID0gaDI2NGJzZEdldE5laWdoYm91ck1iKHBNYiwgbmVpZ2hib3VyQi5tYik7Ci0gICAgICAgIGF2YWlsYWJsZUIgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBuTWIyKTsKLSAgICAgICAgaWYgKGF2YWlsYWJsZUIgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKLSAgICAgICAgICAgKCBoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobk1iMi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpICkKLSAgICAgICAgewotICAgICAgICAgICAgYXZhaWxhYmxlQiA9IEhBTlRST19GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIG1vZGUgPSBEZXRlcm1pbmVJbnRyYTR4NFByZWRNb2RlKG1iTGF5ZXIsCi0gICAgICAgICAgICAodTMyKShhdmFpbGFibGVBICYmIGF2YWlsYWJsZUIpLAotICAgICAgICAgICAgJm5laWdoYm91ciwgJm5laWdoYm91ckIsIGJsb2NrLCBuTWIsIG5NYjIpOwotICAgICAgICBwTWItPmludHJhNHg0UHJlZE1vZGVbYmxvY2tdID0gKHU4KW1vZGU7Ci0KLSAgICAgICAgbmVpZ2hib3VyID0gKmgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0MoYmxvY2spOwotICAgICAgICBuTWIgPSBoMjY0YnNkR2V0TmVpZ2hib3VyTWIocE1iLCBuZWlnaGJvdXIubWIpOwotICAgICAgICBhdmFpbGFibGVDID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgbk1iKTsKLSAgICAgICAgaWYgKGF2YWlsYWJsZUMgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKLSAgICAgICAgICAgKCBoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobk1iLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhdmFpbGFibGVDID0gSEFOVFJPX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgbmVpZ2hib3VyID0gKmgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0QoYmxvY2spOwotICAgICAgICBuTWIgPSBoMjY0YnNkR2V0TmVpZ2hib3VyTWIocE1iLCBuZWlnaGJvdXIubWIpOwotICAgICAgICBhdmFpbGFibGVEID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgbk1iKTsKLSAgICAgICAgaWYgKGF2YWlsYWJsZUQgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKLSAgICAgICAgICAgKCBoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobk1iLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhdmFpbGFibGVEID0gSEFOVFJPX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgR2V0NHg0TmVpZ2hib3VyUGVscyhhLCBsLCBkYXRhLCBhYm92ZSwgbGVmdCwgYmxvY2spOwotCi0gICAgICAgIHN3aXRjaChtb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDA6IC8qIEludHJhXzR4NF9WZXJ0aWNhbCAqLwotICAgICAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQikKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgIEludHJhNHg0VmVydGljYWxQcmVkaWN0aW9uKCh1OCopZGF0YTR4NCwgYSArIDEpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxOiAvKiBJbnRyYV80eDRfSG9yaXpvbnRhbCAqLwotICAgICAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgIEludHJhNHg0SG9yaXpvbnRhbFByZWRpY3Rpb24oKHU4KilkYXRhNHg0LCBsICsgMSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDI6IC8qIEludHJhXzR4NF9EQyAqLwotICAgICAgICAgICAgICAgIEludHJhNHg0RGNQcmVkaWN0aW9uKCh1OCopZGF0YTR4NCwgYSArIDEsIGwgKyAxLAotICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVBLCBhdmFpbGFibGVCKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMzogLyogSW50cmFfNHg0X0RpYWdvbmFsX0Rvd25fTGVmdCAqLwotICAgICAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQikKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFbNV0gPSBhWzZdID0gYVs3XSA9IGFbOF0gPSBhWzRdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBJbnRyYTR4NERpYWdvbmFsRG93bkxlZnRQcmVkaWN0aW9uKCh1OCopZGF0YTR4NCwgYSArIDEpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA0OiAvKiBJbnRyYV80eDRfRGlhZ29uYWxfRG93bl9SaWdodCAqLwotICAgICAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQSB8fCAhYXZhaWxhYmxlQiB8fCAhYXZhaWxhYmxlRCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgIEludHJhNHg0RGlhZ29uYWxEb3duUmlnaHRQcmVkaWN0aW9uKCh1OCopZGF0YTR4NCwgYSArIDEsIGwgKyAxKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgNTogLyogSW50cmFfNHg0X1ZlcnRpY2FsX1JpZ2h0ICovCi0gICAgICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVBIHx8ICFhdmFpbGFibGVCIHx8ICFhdmFpbGFibGVEKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgSW50cmE0eDRWZXJ0aWNhbFJpZ2h0UHJlZGljdGlvbigodTgqKWRhdGE0eDQsIGEgKyAxLCBsICsgMSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDY6IC8qIEludHJhXzR4NF9Ib3Jpem9udGFsX0Rvd24gKi8KLSAgICAgICAgICAgICAgICBpZiAoIWF2YWlsYWJsZUEgfHwgIWF2YWlsYWJsZUIgfHwgIWF2YWlsYWJsZUQpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICBJbnRyYTR4NEhvcml6b250YWxEb3duUHJlZGljdGlvbigodTgqKWRhdGE0eDQsIGEgKyAxLCBsICsgMSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDc6IC8qIEludHJhXzR4NF9WZXJ0aWNhbF9MZWZ0ICovCi0gICAgICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVCKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVDKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYVs1XSA9IGFbNl0gPSBhWzddID0gYVs4XSA9IGFbNF07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEludHJhNHg0VmVydGljYWxMZWZ0UHJlZGljdGlvbigodTgqKWRhdGE0eDQsIGEgKyAxKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6IC8qIGNhc2UgOCBJbnRyYV80eDRfSG9yaXpvbnRhbF9VcCAqLwotICAgICAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgIEludHJhNHg0SG9yaXpvbnRhbFVwUHJlZGljdGlvbigodTgqKWRhdGE0eDQsIGwgKyAxKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIFdyaXRlNHg0VG8xNngxNihkYXRhLCAodTgqKWRhdGE0eDQsIGJsb2NrKTsKLSAgICAgICAgaDI2NGJzZEFkZFJlc2lkdWFsKGRhdGEsIG1iTGF5ZXItPnJlc2lkdWFsLmxldmVsW2Jsb2NrXSwgYmxvY2spOwotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogSW50cmFDaHJvbWFQcmVkaWN0aW9uCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQZXJmb3JtIGludHJhIHByZWRpY3Rpb24gZm9yIGNocm9tYSBwaXhlbHMgYW5kIGFkZCByZXNpZHVhbAotICAgICAgICAgIGludG8gcHJlZGljdGlvbi4gVGhlIHJlc3VsdGluZyBjaHJvbWEgcGl4ZWxzIGFyZSBzdG9yZWQgaW4gJ2RhdGEnLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZEludHJhQ2hyb21hUHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCB1OCAqZGF0YSwgaTMyIHJlc2lkdWFsW11bMTZdLAotICAgICAgICAgICAgICAgICAgICB1OCAqYWJvdmUsIHU4ICpsZWZ0LCB1MzIgcHJlZE1vZGUsIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaSwgY29tcCwgYmxvY2s7Ci0gICAgdTMyIGF2YWlsYWJsZUEsIGF2YWlsYWJsZUIsIGF2YWlsYWJsZUQ7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQocmVzaWR1YWwpOwotICAgIEFTU0VSVChhYm92ZSk7Ci0gICAgQVNTRVJUKGxlZnQpOwotICAgIEFTU0VSVChwcmVkTW9kZSA8IDQpOwotCi0gICAgYXZhaWxhYmxlQSA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIHBNYi0+bWJBKTsKLSAgICBpZiAoYXZhaWxhYmxlQSAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgotICAgICAgIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYkEtPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSkKLSAgICAgICAgYXZhaWxhYmxlQSA9IEhBTlRST19GQUxTRTsKLSAgICBhdmFpbGFibGVCID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgcE1iLT5tYkIpOwotICAgIGlmIChhdmFpbGFibGVCICYmIGNvbnN0cmFpbmVkSW50cmFQcmVkICYmCi0gICAgICAgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWItPm1iQi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpKQotICAgICAgICBhdmFpbGFibGVCID0gSEFOVFJPX0ZBTFNFOwotICAgIGF2YWlsYWJsZUQgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBwTWItPm1iRCk7Ci0gICAgaWYgKGF2YWlsYWJsZUQgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKLSAgICAgICAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJELT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikpCi0gICAgICAgIGF2YWlsYWJsZUQgPSBIQU5UUk9fRkFMU0U7Ci0KLSAgICBmb3IgKGNvbXAgPSAwLCBibG9jayA9IDE2OyBjb21wIDwgMjsgY29tcCsrKQotICAgIHsKLSAgICAgICAgc3dpdGNoKHByZWRNb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDA6IC8qIEludHJhX0Nocm9tYV9EQyAqLwotICAgICAgICAgICAgICAgIEludHJhQ2hyb21hRGNQcmVkaWN0aW9uKGRhdGEsIGFib3ZlKzEsIGxlZnQsIGF2YWlsYWJsZUEsCi0gICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDE6IC8qIEludHJhX0Nocm9tYV9Ib3Jpem9udGFsICovCi0gICAgICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVBKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgSW50cmFDaHJvbWFIb3Jpem9udGFsUHJlZGljdGlvbihkYXRhLCBsZWZ0KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAyOiAvKiBJbnRyYV9DaHJvbWFfVmVydGljYWwgKi8KLSAgICAgICAgICAgICAgICBpZiAoIWF2YWlsYWJsZUIpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICBJbnRyYUNocm9tYVZlcnRpY2FsUHJlZGljdGlvbihkYXRhLCBhYm92ZSsxKTsKLQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OiAvKiBjYXNlIDM6IEludHJhX0Nocm9tYV9QbGFuZSAqLwotICAgICAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQSB8fCAhYXZhaWxhYmxlQiB8fCAhYXZhaWxhYmxlRCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgIEludHJhQ2hyb21hUGxhbmVQcmVkaWN0aW9uKGRhdGEsIGFib3ZlKzEsIGxlZnQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyssIGJsb2NrKyspCi0gICAgICAgICAgICBoMjY0YnNkQWRkUmVzaWR1YWwoZGF0YSwgcmVzaWR1YWxbaV0sIGJsb2NrKTsKLQotICAgICAgICAvKiBhZHZhbmNlIHBvaW50ZXJzICovCi0gICAgICAgIGRhdGEgKz0gNjQ7Ci0gICAgICAgIGFib3ZlICs9IDk7Ci0gICAgICAgIGxlZnQgKz0gODsKLSAgICAgICAgcmVzaWR1YWwgKz0gNDsKLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RBZGRSZXNpZHVhbAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgQWRkIHJlc2lkdWFsIG9mIGEgYmxvY2sgaW50byBwcmVkaWN0aW9uIGluIG1hY3JvYmxvY2sgYXJyYXkgJ2RhdGEnLgotICAgICAgICAgIFRoZSByZXN1bHQgKHJlc2lkdWFsICsgcHJlZGljdGlvbikgaXMgc3RvcmVkIGluICdkYXRhJy4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZm5kZWYgSDI2NERFQ19PTVhETAotdm9pZCBoMjY0YnNkQWRkUmVzaWR1YWwodTggKmRhdGEsIGkzMiAqcmVzaWR1YWwsIHUzMiBibG9ja051bSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaTsKLSAgICB1MzIgeCwgeTsKLSAgICB1MzIgd2lkdGg7Ci0gICAgaTMyIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQ7Ci0gICAgdTggKnRtcDsKLSAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQocmVzaWR1YWwpOwotICAgIEFTU0VSVChibG9ja051bSA8IDE2ICsgNCArIDQpOwotCi0gICAgaWYgKElTX1JFU0lEVUFMX0VNUFRZKHJlc2lkdWFsKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgUkFOR0VfQ0hFQ0tfQVJSQVkocmVzaWR1YWwsIC01MTIsIDUxMSwgMTYpOwotCi0gICAgaWYgKGJsb2NrTnVtIDwgMTYpCi0gICAgewotICAgICAgICB3aWR0aCA9IDE2OwotICAgICAgICB4ID0gaDI2NGJzZEJsb2NrWFtibG9ja051bV07Ci0gICAgICAgIHkgPSBoMjY0YnNkQmxvY2tZW2Jsb2NrTnVtXTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgd2lkdGggPSA4OwotICAgICAgICB4ID0gaDI2NGJzZEJsb2NrWFtibG9ja051bSAmIDB4M107Ci0gICAgICAgIHkgPSBoMjY0YnNkQmxvY2tZW2Jsb2NrTnVtICYgMHgzXTsKLSAgICB9Ci0KLSAgICB0bXAgPSBkYXRhICsgeSp3aWR0aCArIHg7Ci0gICAgZm9yIChpID0gNDsgaTsgaS0tKQotICAgIHsKLSAgICAgICAgdG1wMSA9ICpyZXNpZHVhbCsrOwotICAgICAgICB0bXAyID0gdG1wWzBdOwotICAgICAgICB0bXAzID0gKnJlc2lkdWFsKys7Ci0gICAgICAgIHRtcDQgPSB0bXBbMV07Ci0KLSAgICAgICAgdG1wWzBdID0gY2xwW3RtcDEgKyB0bXAyXTsKLQotICAgICAgICB0bXAxID0gKnJlc2lkdWFsKys7Ci0gICAgICAgIHRtcDIgPSB0bXBbMl07Ci0KLSAgICAgICAgdG1wWzFdID0gY2xwW3RtcDMgKyB0bXA0XTsKLQotICAgICAgICB0bXAzID0gKnJlc2lkdWFsKys7Ci0gICAgICAgIHRtcDQgPSB0bXBbM107Ci0KLSAgICAgICAgdG1wMSA9IGNscFt0bXAxICsgdG1wMl07Ci0gICAgICAgIHRtcDMgPSBjbHBbdG1wMyArIHRtcDRdOwotICAgICAgICB0bXBbMl0gPSAodTgpdG1wMTsKLSAgICAgICAgdG1wWzNdID0gKHU4KXRtcDM7Ci0KLSAgICAgICAgdG1wICs9IHdpZHRoOwotICAgIH0KLQotfQotI2VuZGlmCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEludHJhMTZ4MTZWZXJ0aWNhbFByZWRpY3Rpb24KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFBlcmZvcm0gaW50cmEgMTZ4MTYgdmVydGljYWwgcHJlZGljdGlvbiBtb2RlLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIEludHJhMTZ4MTZWZXJ0aWNhbFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaSwgajsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChhYm92ZSk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgICAqZGF0YSsrID0gYWJvdmVbal07Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBJbnRyYTE2eDE2SG9yaXpvbnRhbFByZWRpY3Rpb24KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFBlcmZvcm0gaW50cmEgMTZ4MTYgaG9yaXpvbnRhbCBwcmVkaWN0aW9uIG1vZGUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgSW50cmExNngxNkhvcml6b250YWxQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqbGVmdCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaSwgajsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChsZWZ0KTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgIHsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgICpkYXRhKysgPSBsZWZ0W2ldOwotICAgICAgICB9Ci0gICAgfQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogSW50cmExNngxNkRjUHJlZGljdGlvbgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUGVyZm9ybSBpbnRyYSAxNngxNiBEQyBwcmVkaWN0aW9uIG1vZGUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgSW50cmExNngxNkRjUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlLCB1OCAqbGVmdCwgdTMyIGF2YWlsYWJsZUEsCi0gICAgdTMyIGF2YWlsYWJsZUIpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGksIHRtcDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChhYm92ZSk7Ci0gICAgQVNTRVJUKGxlZnQpOwotCi0gICAgaWYgKGF2YWlsYWJsZUEgJiYgYXZhaWxhYmxlQikKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDAsIHRtcCA9IDA7IGkgPCAxNjsgaSsrKQotICAgICAgICAgICAgdG1wICs9IGFib3ZlW2ldICsgbGVmdFtpXTsKLSAgICAgICAgdG1wID0gKHRtcCArIDE2KSA+PiA1OwotICAgIH0KLSAgICBlbHNlIGlmIChhdmFpbGFibGVBKQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMCwgdG1wID0gMDsgaSA8IDE2OyBpKyspCi0gICAgICAgICAgICB0bXAgKz0gbGVmdFtpXTsKLSAgICAgICAgdG1wID0gKHRtcCArIDgpID4+IDQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKGF2YWlsYWJsZUIpCi0gICAgewotICAgICAgICBmb3IgKGkgPSAwLCB0bXAgPSAwOyBpIDwgMTY7IGkrKykKLSAgICAgICAgICAgIHRtcCArPSBhYm92ZVtpXTsKLSAgICAgICAgdG1wID0gKHRtcCArIDgpID4+IDQ7Ci0gICAgfQotICAgIC8qIG5laXRoZXIgQSBub3IgQiBhdmFpbGFibGUgKi8KLSAgICBlbHNlCi0gICAgewotICAgICAgICB0bXAgPSAxMjg7Ci0gICAgfQotICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLSAgICAgICAgZGF0YVtpXSA9ICh1OCl0bXA7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBJbnRyYTE2eDE2UGxhbmVQcmVkaWN0aW9uCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQZXJmb3JtIGludHJhIDE2eDE2IHBsYW5lIHByZWRpY3Rpb24gbW9kZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBJbnRyYTE2eDE2UGxhbmVQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIGkzMiBpLCBqOwotICAgIGkzMiBhLCBiLCBjOwotICAgIGkzMiB0bXA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQoYWJvdmUpOwotICAgIEFTU0VSVChsZWZ0KTsKLQotICAgIGEgPSAxNiAqIChhYm92ZVsxNV0gKyBsZWZ0WzE1XSk7Ci0KLSAgICBmb3IgKGkgPSAwLCBiID0gMDsgaSA8IDg7IGkrKykKLSAgICAgICAgYiArPSAoaSArIDEpICogKGFib3ZlWzgraV0gLSBhYm92ZVs2LWldKTsKLSAgICBiID0gKDUgKiBiICsgMzIpID4+IDY7Ci0KLSAgICBmb3IgKGkgPSAwLCBjID0gMDsgaSA8IDc7IGkrKykKLSAgICAgICAgYyArPSAoaSArIDEpICogKGxlZnRbOCtpXSAtIGxlZnRbNi1pXSk7Ci0gICAgLyogcFstMSwtMV0gaGFzIHRvIGJlIGFjY2Vzc2VkIHRocm91Z2ggYWJvdmUgcG9pbnRlciAqLwotICAgIGMgKz0gKGkgKyAxKSAqIChsZWZ0WzgraV0gLSBhYm92ZVstMV0pOwotICAgIGMgPSAoNSAqIGMgKyAzMikgPj4gNjsKLQotICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgIHsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcCA9IChhICsgYiAqIChqIC0gNykgKyBjICogKGkgLSA3KSArIDE2KSA+PiA1OwotICAgICAgICAgICAgZGF0YVtpKjE2K2pdID0gKHU4KUNMSVAxKHRtcCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBJbnRyYUNocm9tYURjUHJlZGljdGlvbgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUGVyZm9ybSBpbnRyYSBjaHJvbWEgREMgcHJlZGljdGlvbiBtb2RlLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIEludHJhQ2hyb21hRGNQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0LCB1MzIgYXZhaWxhYmxlQSwKLSAgICB1MzIgYXZhaWxhYmxlQikKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaTsKLSAgICB1MzIgdG1wMSwgdG1wMjsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChhYm92ZSk7Ci0gICAgQVNTRVJUKGxlZnQpOwotCi0gICAgLyogeSA9IDAuLjMgKi8KLSAgICBpZiAoYXZhaWxhYmxlQSAmJiBhdmFpbGFibGVCKQotICAgIHsKLSAgICAgICAgdG1wMSA9IGFib3ZlWzBdICsgYWJvdmVbMV0gKyBhYm92ZVsyXSArIGFib3ZlWzNdICsKLSAgICAgICAgICAgICAgbGVmdFswXSArIGxlZnRbMV0gKyBsZWZ0WzJdICsgbGVmdFszXTsKLSAgICAgICAgdG1wMSA9ICh0bXAxICsgNCkgPj4gMzsKLSAgICAgICAgdG1wMiA9IChhYm92ZVs0XSArIGFib3ZlWzVdICsgYWJvdmVbNl0gKyBhYm92ZVs3XSArIDIpID4+IDI7Ci0gICAgfQotICAgIGVsc2UgaWYgKGF2YWlsYWJsZUIpCi0gICAgewotICAgICAgICB0bXAxID0gKGFib3ZlWzBdICsgYWJvdmVbMV0gKyBhYm92ZVsyXSArIGFib3ZlWzNdICsgMikgPj4gMjsKLSAgICAgICAgdG1wMiA9IChhYm92ZVs0XSArIGFib3ZlWzVdICsgYWJvdmVbNl0gKyBhYm92ZVs3XSArIDIpID4+IDI7Ci0gICAgfQotICAgIGVsc2UgaWYgKGF2YWlsYWJsZUEpCi0gICAgewotICAgICAgICB0bXAxID0gKGxlZnRbMF0gKyBsZWZ0WzFdICsgbGVmdFsyXSArIGxlZnRbM10gKyAyKSA+PiAyOwotICAgICAgICB0bXAyID0gdG1wMTsKLSAgICB9Ci0gICAgLyogbmVpdGhlciBBIG5vciBCIGF2YWlsYWJsZSAqLwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHRtcDEgPSB0bXAyID0gMTI4OwotICAgIH0KLQotICAgIEFTU0VSVCh0bXAxIDwgMjU2ICYmIHRtcDIgPCAyNTYpOwotICAgIGZvciAoaSA9IDQ7IGktLTspCi0gICAgewotICAgICAgICAqZGF0YSsrID0gKHU4KXRtcDE7Ci0gICAgICAgICpkYXRhKysgPSAodTgpdG1wMTsKLSAgICAgICAgKmRhdGErKyA9ICh1OCl0bXAxOwotICAgICAgICAqZGF0YSsrID0gKHU4KXRtcDE7Ci0gICAgICAgICpkYXRhKysgPSAodTgpdG1wMjsKLSAgICAgICAgKmRhdGErKyA9ICh1OCl0bXAyOwotICAgICAgICAqZGF0YSsrID0gKHU4KXRtcDI7Ci0gICAgICAgICpkYXRhKysgPSAodTgpdG1wMjsKLSAgICB9Ci0KLSAgICAvKiB5ID0gNC4uLjcgKi8KLSAgICBpZiAoYXZhaWxhYmxlQSkKLSAgICB7Ci0gICAgICAgIHRtcDEgPSAobGVmdFs0XSArIGxlZnRbNV0gKyBsZWZ0WzZdICsgbGVmdFs3XSArIDIpID4+IDI7Ci0gICAgICAgIGlmIChhdmFpbGFibGVCKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAyID0gYWJvdmVbNF0gKyBhYm92ZVs1XSArIGFib3ZlWzZdICsgYWJvdmVbN10gKwotICAgICAgICAgICAgICAgICAgIGxlZnRbNF0gKyBsZWZ0WzVdICsgbGVmdFs2XSArIGxlZnRbN107Ci0gICAgICAgICAgICB0bXAyID0gKHRtcDIgKyA0KSA+PiAzOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHRtcDIgPSB0bXAxOwotICAgIH0KLSAgICBlbHNlIGlmIChhdmFpbGFibGVCKQotICAgIHsKLSAgICAgICAgdG1wMSA9IChhYm92ZVswXSArIGFib3ZlWzFdICsgYWJvdmVbMl0gKyBhYm92ZVszXSArIDIpID4+IDI7Ci0gICAgICAgIHRtcDIgPSAoYWJvdmVbNF0gKyBhYm92ZVs1XSArIGFib3ZlWzZdICsgYWJvdmVbN10gKyAyKSA+PiAyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB0bXAxID0gdG1wMiA9IDEyODsKLSAgICB9Ci0KLSAgICBBU1NFUlQodG1wMSA8IDI1NiAmJiB0bXAyIDwgMjU2KTsKLSAgICBmb3IgKGkgPSA0OyBpLS07KQotICAgIHsKLSAgICAgICAgKmRhdGErKyA9ICh1OCl0bXAxOwotICAgICAgICAqZGF0YSsrID0gKHU4KXRtcDE7Ci0gICAgICAgICpkYXRhKysgPSAodTgpdG1wMTsKLSAgICAgICAgKmRhdGErKyA9ICh1OCl0bXAxOwotICAgICAgICAqZGF0YSsrID0gKHU4KXRtcDI7Ci0gICAgICAgICpkYXRhKysgPSAodTgpdG1wMjsKLSAgICAgICAgKmRhdGErKyA9ICh1OCl0bXAyOwotICAgICAgICAqZGF0YSsrID0gKHU4KXRtcDI7Ci0gICAgfQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEludHJhQ2hyb21hSG9yaXpvbnRhbFByZWRpY3Rpb24KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFBlcmZvcm0gaW50cmEgY2hyb21hIGhvcml6b250YWwgcHJlZGljdGlvbiBtb2RlLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIEludHJhQ2hyb21hSG9yaXpvbnRhbFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICpsZWZ0KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKGxlZnQpOwotCi0gICAgZm9yIChpID0gODsgaS0tOykKLSAgICB7Ci0gICAgICAgICpkYXRhKysgPSAqbGVmdDsKLSAgICAgICAgKmRhdGErKyA9ICpsZWZ0OwotICAgICAgICAqZGF0YSsrID0gKmxlZnQ7Ci0gICAgICAgICpkYXRhKysgPSAqbGVmdDsKLSAgICAgICAgKmRhdGErKyA9ICpsZWZ0OwotICAgICAgICAqZGF0YSsrID0gKmxlZnQ7Ci0gICAgICAgICpkYXRhKysgPSAqbGVmdDsKLSAgICAgICAgKmRhdGErKyA9ICpsZWZ0Kys7Ci0gICAgfQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogSW50cmFDaHJvbWFWZXJ0aWNhbFByZWRpY3Rpb24KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFBlcmZvcm0gaW50cmEgY2hyb21hIHZlcnRpY2FsIHByZWRpY3Rpb24gbW9kZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBJbnRyYUNocm9tYVZlcnRpY2FsUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKGFib3ZlKTsKLQotICAgIGZvciAoaSA9IDg7IGktLTtkYXRhKysvKmFib3ZlLT04Ki8pCi0gICAgewotICAgICAgICBkYXRhWzBdID0gKmFib3ZlOwotICAgICAgICBkYXRhWzhdID0gKmFib3ZlOwotICAgICAgICBkYXRhWzE2XSA9ICphYm92ZTsKLSAgICAgICAgZGF0YVsyNF0gPSAqYWJvdmU7Ci0gICAgICAgIGRhdGFbMzJdID0gKmFib3ZlOwotICAgICAgICBkYXRhWzQwXSA9ICphYm92ZTsKLSAgICAgICAgZGF0YVs0OF0gPSAqYWJvdmU7Ci0gICAgICAgIGRhdGFbNTZdID0gKmFib3ZlKys7Ci0gICAgfQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogSW50cmFDaHJvbWFQbGFuZVByZWRpY3Rpb24KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFBlcmZvcm0gaW50cmEgY2hyb21hIHBsYW5lIHByZWRpY3Rpb24gbW9kZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBJbnRyYUNocm9tYVBsYW5lUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlLCB1OCAqbGVmdCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaTsKLSAgICBpMzIgYSwgYiwgYzsKLSAgICBpMzIgdG1wOwotICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChhYm92ZSk7Ci0gICAgQVNTRVJUKGxlZnQpOwotCi0gICAgYSA9IDE2ICogKGFib3ZlWzddICsgbGVmdFs3XSk7Ci0KLSAgICBiID0gKGFib3ZlWzRdIC0gYWJvdmVbMl0pICsgMiAqIChhYm92ZVs1XSAtIGFib3ZlWzFdKQotICAgICAgICArIDMgKiAoYWJvdmVbNl0gLSBhYm92ZVswXSkgKyA0ICogKGFib3ZlWzddIC0gYWJvdmVbLTFdKTsKLSAgICBiID0gKDE3ICogYiArIDE2KSA+PiA1OwotCi0gICAgLyogcFstMSwtMV0gaGFzIHRvIGJlIGFjY2Vzc2VkIHRocm91Z2ggYWJvdmUgcG9pbnRlciAqLwotICAgIGMgPSAobGVmdFs0XSAtIGxlZnRbMl0pICsgMiAqIChsZWZ0WzVdIC0gbGVmdFsxXSkKLSAgICAgICAgKyAzICogKGxlZnRbNl0gLSBsZWZ0WzBdKSArIDQgKiAobGVmdFs3XSAtIGFib3ZlWy0xXSk7Ci0gICAgYyA9ICgxNyAqIGMgKyAxNikgPj4gNTsKLQotICAgIC8qYSArPSAxNjsqLwotICAgIGEgPSBhIC0gMyAqIGMgKyAxNjsKLSAgICBmb3IgKGkgPSA4OyBpLS07IGEgKz0gYykKLSAgICB7Ci0gICAgICAgIHRtcCA9IChhIC0gMyAqIGIpOwotICAgICAgICAqZGF0YSsrID0gY2xwW3RtcD4+NV07Ci0gICAgICAgIHRtcCArPSBiOwotICAgICAgICAqZGF0YSsrID0gY2xwW3RtcD4+NV07Ci0gICAgICAgIHRtcCArPSBiOwotICAgICAgICAqZGF0YSsrID0gY2xwW3RtcD4+NV07Ci0gICAgICAgIHRtcCArPSBiOwotICAgICAgICAqZGF0YSsrID0gY2xwW3RtcD4+NV07Ci0gICAgICAgIHRtcCArPSBiOwotICAgICAgICAqZGF0YSsrID0gY2xwW3RtcD4+NV07Ci0gICAgICAgIHRtcCArPSBiOwotICAgICAgICAqZGF0YSsrID0gY2xwW3RtcD4+NV07Ci0gICAgICAgIHRtcCArPSBiOwotICAgICAgICAqZGF0YSsrID0gY2xwW3RtcD4+NV07Ci0gICAgICAgIHRtcCArPSBiOwotICAgICAgICAqZGF0YSsrID0gY2xwW3RtcD4+NV07Ci0gICAgfQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogR2V0NHg0TmVpZ2hib3VyUGVscwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgR2V0IG5laWdoYm91cmluZyBwaXhlbHMgb2YgYSA0eDQgYmxvY2sgaW50byAnYScgYW5kICdsJy4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBHZXQ0eDROZWlnaGJvdXJQZWxzKHU4ICphLCB1OCAqbCwgdTggKmRhdGEsIHU4ICphYm92ZSwgdTggKmxlZnQsCi0gICAgdTMyIGJsb2NrTnVtKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB4LCB5OwotICAgIHU4IHQxLCB0MjsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGEpOwotICAgIEFTU0VSVChsKTsKLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKGFib3ZlKTsKLSAgICBBU1NFUlQobGVmdCk7Ci0gICAgQVNTRVJUKGJsb2NrTnVtIDwgMTYpOwotCi0gICAgeCA9IGgyNjRic2RCbG9ja1hbYmxvY2tOdW1dOwotICAgIHkgPSBoMjY0YnNkQmxvY2tZW2Jsb2NrTnVtXTsKLQotICAgIC8qIEEgYW5kIEQgKi8KLSAgICBpZiAoeCA9PSAwKQotICAgIHsKLSAgICAgICAgdDEgPSBsZWZ0W3kgICAgXTsKLSAgICAgICAgdDIgPSBsZWZ0W3kgKyAxXTsKLSAgICAgICAgbFsxXSA9IHQxOwotICAgICAgICBsWzJdID0gdDI7Ci0gICAgICAgIHQxID0gbGVmdFt5ICsgMl07Ci0gICAgICAgIHQyID0gbGVmdFt5ICsgM107Ci0gICAgICAgIGxbM10gPSB0MTsKLSAgICAgICAgbFs0XSA9IHQyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB0MSA9IGRhdGFbeSAqIDE2ICsgeCAtIDEgICAgIF07Ci0gICAgICAgIHQyID0gZGF0YVt5ICogMTYgKyB4IC0gMSArIDE2XTsKLSAgICAgICAgbFsxXSA9IHQxOwotICAgICAgICBsWzJdID0gdDI7Ci0gICAgICAgIHQxID0gZGF0YVt5ICogMTYgKyB4IC0gMSArIDMyXTsKLSAgICAgICAgdDIgPSBkYXRhW3kgKiAxNiArIHggLSAxICsgNDhdOwotICAgICAgICBsWzNdID0gdDE7Ci0gICAgICAgIGxbNF0gPSB0MjsKLSAgICB9Ci0KLSAgICAvKiBCLCBDIGFuZCBEICovCi0gICAgaWYgKHkgPT0gMCkKLSAgICB7Ci0gICAgICAgIHQxID0gYWJvdmVbeCAgICBdOwotICAgICAgICB0MiA9IGFib3ZlW3ggICAgXTsKLSAgICAgICAgbFswXSA9IHQxOwotICAgICAgICBhWzBdID0gdDI7Ci0gICAgICAgIHQxID0gYWJvdmVbeCArIDFdOwotICAgICAgICB0MiA9IGFib3ZlW3ggKyAyXTsKLSAgICAgICAgYVsxXSA9IHQxOwotICAgICAgICBhWzJdID0gdDI7Ci0gICAgICAgIHQxID0gYWJvdmVbeCArIDNdOwotICAgICAgICB0MiA9IGFib3ZlW3ggKyA0XTsKLSAgICAgICAgYVszXSA9IHQxOwotICAgICAgICBhWzRdID0gdDI7Ci0gICAgICAgIHQxID0gYWJvdmVbeCArIDVdOwotICAgICAgICB0MiA9IGFib3ZlW3ggKyA2XTsKLSAgICAgICAgYVs1XSA9IHQxOwotICAgICAgICBhWzZdID0gdDI7Ci0gICAgICAgIHQxID0gYWJvdmVbeCArIDddOwotICAgICAgICB0MiA9IGFib3ZlW3ggKyA4XTsKLSAgICAgICAgYVs3XSA9IHQxOwotICAgICAgICBhWzhdID0gdDI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHQxID0gZGF0YVsoeSAtIDEpICogMTYgKyB4ICAgIF07Ci0gICAgICAgIHQyID0gZGF0YVsoeSAtIDEpICogMTYgKyB4ICsgMV07Ci0gICAgICAgIGFbMV0gPSB0MTsKLSAgICAgICAgYVsyXSA9IHQyOwotICAgICAgICB0MSA9IGRhdGFbKHkgLSAxKSAqIDE2ICsgeCArIDJdOwotICAgICAgICB0MiA9IGRhdGFbKHkgLSAxKSAqIDE2ICsgeCArIDNdOwotICAgICAgICBhWzNdID0gdDE7Ci0gICAgICAgIGFbNF0gPSB0MjsKLSAgICAgICAgdDEgPSBkYXRhWyh5IC0gMSkgKiAxNiArIHggKyA0XTsKLSAgICAgICAgdDIgPSBkYXRhWyh5IC0gMSkgKiAxNiArIHggKyA1XTsKLSAgICAgICAgYVs1XSA9IHQxOwotICAgICAgICBhWzZdID0gdDI7Ci0gICAgICAgIHQxID0gZGF0YVsoeSAtIDEpICogMTYgKyB4ICsgNl07Ci0gICAgICAgIHQyID0gZGF0YVsoeSAtIDEpICogMTYgKyB4ICsgN107Ci0gICAgICAgIGFbN10gPSB0MTsKLSAgICAgICAgYVs4XSA9IHQyOwotCi0gICAgICAgIGlmICh4ID09IDApCi0gICAgICAgICAgICBsWzBdID0gYVswXSA9IGxlZnRbeS0xXTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbFswXSA9IGFbMF0gPSBkYXRhWyh5IC0gMSkgKiAxNiArIHggLSAxXTsKLSAgICB9Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBJbnRyYTR4NFZlcnRpY2FsUHJlZGljdGlvbgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUGVyZm9ybSBpbnRyYSA0eDQgdmVydGljYWwgcHJlZGljdGlvbiBtb2RlLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIEludHJhNHg0VmVydGljYWxQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTggdDEsIHQyOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKGFib3ZlKTsKLQotICAgIHQxID0gYWJvdmVbMF07Ci0gICAgdDIgPSBhYm92ZVsxXTsKLSAgICBkYXRhWzBdID0gZGF0YVs0XSA9IGRhdGFbOF0gPSBkYXRhWzEyXSA9IHQxOwotICAgIGRhdGFbMV0gPSBkYXRhWzVdID0gZGF0YVs5XSA9IGRhdGFbMTNdID0gdDI7Ci0gICAgdDEgPSBhYm92ZVsyXTsKLSAgICB0MiA9IGFib3ZlWzNdOwotICAgIGRhdGFbMl0gPSBkYXRhWzZdID0gZGF0YVsxMF0gPSBkYXRhWzE0XSA9IHQxOwotICAgIGRhdGFbM10gPSBkYXRhWzddID0gZGF0YVsxMV0gPSBkYXRhWzE1XSA9IHQyOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogSW50cmE0eDRIb3Jpem9udGFsUHJlZGljdGlvbgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUGVyZm9ybSBpbnRyYSA0eDQgaG9yaXpvbnRhbCBwcmVkaWN0aW9uIG1vZGUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgSW50cmE0eDRIb3Jpem9udGFsUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmxlZnQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTggdDEsIHQyOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKGxlZnQpOwotCi0gICAgdDEgPSBsZWZ0WzBdOwotICAgIHQyID0gbGVmdFsxXTsKLSAgICBkYXRhWzBdID0gZGF0YVsxXSA9IGRhdGFbMl0gPSBkYXRhWzNdID0gdDE7Ci0gICAgZGF0YVs0XSA9IGRhdGFbNV0gPSBkYXRhWzZdID0gZGF0YVs3XSA9IHQyOwotICAgIHQxID0gbGVmdFsyXTsKLSAgICB0MiA9IGxlZnRbM107Ci0gICAgZGF0YVs4XSA9IGRhdGFbOV0gPSBkYXRhWzEwXSA9IGRhdGFbMTFdID0gdDE7Ci0gICAgZGF0YVsxMl0gPSBkYXRhWzEzXSA9IGRhdGFbMTRdID0gZGF0YVsxNV0gPSB0MjsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEludHJhNHg0RGNQcmVkaWN0aW9uCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQZXJmb3JtIGludHJhIDR4NCBEQyBwcmVkaWN0aW9uIG1vZGUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgSW50cmE0eDREY1ByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSwgdTggKmxlZnQsIHUzMiBhdmFpbGFibGVBLAotICAgIHUzMiBhdmFpbGFibGVCKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXA7Ci0gICAgdTggdDEsIHQyLCB0MywgdDQ7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQoYWJvdmUpOwotICAgIEFTU0VSVChsZWZ0KTsKLQotICAgIGlmIChhdmFpbGFibGVBICYmIGF2YWlsYWJsZUIpCi0gICAgewotICAgICAgICB0MSA9IGFib3ZlWzBdOyB0MiA9IGFib3ZlWzFdOyB0MyA9IGFib3ZlWzJdOyB0NCA9IGFib3ZlWzNdOwotICAgICAgICB0bXAgPSB0MSArIHQyICsgdDMgKyB0NDsKLSAgICAgICAgdDEgPSBsZWZ0WzBdOyB0MiA9IGxlZnRbMV07IHQzID0gbGVmdFsyXTsgdDQgPSBsZWZ0WzNdOwotICAgICAgICB0bXAgKz0gdDEgKyB0MiArIHQzICsgdDQ7Ci0gICAgICAgIHRtcCA9ICh0bXAgKyA0KSA+PiAzOwotICAgIH0KLSAgICBlbHNlIGlmIChhdmFpbGFibGVBKQotICAgIHsKLSAgICAgICAgdDEgPSBsZWZ0WzBdOyB0MiA9IGxlZnRbMV07IHQzID0gbGVmdFsyXTsgdDQgPSBsZWZ0WzNdOwotICAgICAgICB0bXAgPSAodDEgKyB0MiArIHQzICsgdDQgKyAyKSA+PiAyOwotICAgIH0KLSAgICBlbHNlIGlmIChhdmFpbGFibGVCKQotICAgIHsKLSAgICAgICAgdDEgPSBhYm92ZVswXTsgdDIgPSBhYm92ZVsxXTsgdDMgPSBhYm92ZVsyXTsgdDQgPSBhYm92ZVszXTsKLSAgICAgICAgdG1wID0gKHQxICsgdDIgKyB0MyArIHQ0ICsgMikgPj4gMjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdG1wID0gMTI4OwotICAgIH0KLQotICAgIEFTU0VSVCh0bXAgPCAyNTYpOwotICAgIGRhdGFbMF0gPSBkYXRhWzFdID0gZGF0YVsyXSA9IGRhdGFbM10gPQotICAgIGRhdGFbNF0gPSBkYXRhWzVdID0gZGF0YVs2XSA9IGRhdGFbN10gPQotICAgIGRhdGFbOF0gPSBkYXRhWzldID0gZGF0YVsxMF0gPSBkYXRhWzExXSA9Ci0gICAgZGF0YVsxMl0gPSBkYXRhWzEzXSA9IGRhdGFbMTRdID0gZGF0YVsxNV0gPSAodTgpdG1wOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogSW50cmE0eDREaWFnb25hbERvd25MZWZ0UHJlZGljdGlvbgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUGVyZm9ybSBpbnRyYSA0eDQgZGlhZ29uYWwgZG93bi1sZWZ0IHByZWRpY3Rpb24gbW9kZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBJbnRyYTR4NERpYWdvbmFsRG93bkxlZnRQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKGFib3ZlKTsKLQotICAgIGRhdGFbIDBdID0gKGFib3ZlWzBdICsgMiAqIGFib3ZlWzFdICsgYWJvdmVbMl0gKyAyKSA+PiAyOwotICAgIGRhdGFbIDFdID0gKGFib3ZlWzFdICsgMiAqIGFib3ZlWzJdICsgYWJvdmVbM10gKyAyKSA+PiAyOwotICAgIGRhdGFbIDRdID0gKGFib3ZlWzFdICsgMiAqIGFib3ZlWzJdICsgYWJvdmVbM10gKyAyKSA+PiAyOwotICAgIGRhdGFbIDJdID0gKGFib3ZlWzJdICsgMiAqIGFib3ZlWzNdICsgYWJvdmVbNF0gKyAyKSA+PiAyOwotICAgIGRhdGFbIDVdID0gKGFib3ZlWzJdICsgMiAqIGFib3ZlWzNdICsgYWJvdmVbNF0gKyAyKSA+PiAyOwotICAgIGRhdGFbIDhdID0gKGFib3ZlWzJdICsgMiAqIGFib3ZlWzNdICsgYWJvdmVbNF0gKyAyKSA+PiAyOwotICAgIGRhdGFbIDNdID0gKGFib3ZlWzNdICsgMiAqIGFib3ZlWzRdICsgYWJvdmVbNV0gKyAyKSA+PiAyOwotICAgIGRhdGFbIDZdID0gKGFib3ZlWzNdICsgMiAqIGFib3ZlWzRdICsgYWJvdmVbNV0gKyAyKSA+PiAyOwotICAgIGRhdGFbIDldID0gKGFib3ZlWzNdICsgMiAqIGFib3ZlWzRdICsgYWJvdmVbNV0gKyAyKSA+PiAyOwotICAgIGRhdGFbMTJdID0gKGFib3ZlWzNdICsgMiAqIGFib3ZlWzRdICsgYWJvdmVbNV0gKyAyKSA+PiAyOwotICAgIGRhdGFbIDddID0gKGFib3ZlWzRdICsgMiAqIGFib3ZlWzVdICsgYWJvdmVbNl0gKyAyKSA+PiAyOwotICAgIGRhdGFbMTBdID0gKGFib3ZlWzRdICsgMiAqIGFib3ZlWzVdICsgYWJvdmVbNl0gKyAyKSA+PiAyOwotICAgIGRhdGFbMTNdID0gKGFib3ZlWzRdICsgMiAqIGFib3ZlWzVdICsgYWJvdmVbNl0gKyAyKSA+PiAyOwotICAgIGRhdGFbMTFdID0gKGFib3ZlWzVdICsgMiAqIGFib3ZlWzZdICsgYWJvdmVbN10gKyAyKSA+PiAyOwotICAgIGRhdGFbMTRdID0gKGFib3ZlWzVdICsgMiAqIGFib3ZlWzZdICsgYWJvdmVbN10gKyAyKSA+PiAyOwotICAgIGRhdGFbMTVdID0gKGFib3ZlWzZdICsgMyAqIGFib3ZlWzddICsgMikgPj4gMjsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEludHJhNHg0RGlhZ29uYWxEb3duUmlnaHRQcmVkaWN0aW9uCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQZXJmb3JtIGludHJhIDR4NCBkaWFnb25hbCBkb3duLXJpZ2h0IHByZWRpY3Rpb24gbW9kZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBJbnRyYTR4NERpYWdvbmFsRG93blJpZ2h0UHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlLCB1OCAqbGVmdCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQoYWJvdmUpOwotICAgIEFTU0VSVChsZWZ0KTsKLQotICAgIGRhdGFbIDBdID0gKGFib3ZlWzBdICsgMiAqIGFib3ZlWy0xXSArIGxlZnRbMF0gKyAyKSA+PiAyOwotICAgIGRhdGFbIDVdID0gKGFib3ZlWzBdICsgMiAqIGFib3ZlWy0xXSArIGxlZnRbMF0gKyAyKSA+PiAyOwotICAgIGRhdGFbMTBdID0gKGFib3ZlWzBdICsgMiAqIGFib3ZlWy0xXSArIGxlZnRbMF0gKyAyKSA+PiAyOwotICAgIGRhdGFbMTVdID0gKGFib3ZlWzBdICsgMiAqIGFib3ZlWy0xXSArIGxlZnRbMF0gKyAyKSA+PiAyOwotICAgIGRhdGFbIDFdID0gKGFib3ZlWy0xXSArIDIgKiBhYm92ZVswXSArIGFib3ZlWzFdICsgMikgPj4gMjsKLSAgICBkYXRhWyA2XSA9IChhYm92ZVstMV0gKyAyICogYWJvdmVbMF0gKyBhYm92ZVsxXSArIDIpID4+IDI7Ci0gICAgZGF0YVsxMV0gPSAoYWJvdmVbLTFdICsgMiAqIGFib3ZlWzBdICsgYWJvdmVbMV0gKyAyKSA+PiAyOwotICAgIGRhdGFbIDJdID0gKGFib3ZlWzBdICsgMiAqIGFib3ZlWzFdICsgYWJvdmVbMl0gKyAyKSA+PiAyOwotICAgIGRhdGFbIDddID0gKGFib3ZlWzBdICsgMiAqIGFib3ZlWzFdICsgYWJvdmVbMl0gKyAyKSA+PiAyOwotICAgIGRhdGFbIDNdID0gKGFib3ZlWzFdICsgMiAqIGFib3ZlWzJdICsgYWJvdmVbM10gKyAyKSA+PiAyOwotICAgIGRhdGFbIDRdID0gKGxlZnRbLTFdICsgMiAqIGxlZnRbMF0gKyBsZWZ0WzFdICsgMikgPj4gMjsKLSAgICBkYXRhWyA5XSA9IChsZWZ0Wy0xXSArIDIgKiBsZWZ0WzBdICsgbGVmdFsxXSArIDIpID4+IDI7Ci0gICAgZGF0YVsxNF0gPSAobGVmdFstMV0gKyAyICogbGVmdFswXSArIGxlZnRbMV0gKyAyKSA+PiAyOwotICAgIGRhdGFbIDhdID0gKGxlZnRbMF0gKyAyICogbGVmdFsxXSArIGxlZnRbMl0gKyAyKSA+PiAyOwotICAgIGRhdGFbMTNdID0gKGxlZnRbMF0gKyAyICogbGVmdFsxXSArIGxlZnRbMl0gKyAyKSA+PiAyOwotICAgIGRhdGFbMTJdID0gKGxlZnRbMV0gKyAyICogbGVmdFsyXSArIGxlZnRbM10gKyAyKSA+PiAyOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEludHJhNHg0VmVydGljYWxSaWdodFByZWRpY3Rpb24KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFBlcmZvcm0gaW50cmEgNHg0IHZlcnRpY2FsIHJpZ2h0IHByZWRpY3Rpb24gbW9kZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBJbnRyYTR4NFZlcnRpY2FsUmlnaHRQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChhYm92ZSk7Ci0gICAgQVNTRVJUKGxlZnQpOwotCi0gICAgZGF0YVsgMF0gPSAoYWJvdmVbLTFdICsgYWJvdmVbMF0gKyAxKSA+PiAxOwotICAgIGRhdGFbIDldID0gKGFib3ZlWy0xXSArIGFib3ZlWzBdICsgMSkgPj4gMTsKLSAgICBkYXRhWyA1XSA9IChhYm92ZVstMV0gKyAyICogYWJvdmVbMF0gKyBhYm92ZVsxXSArIDIpID4+IDI7Ci0gICAgZGF0YVsxNF0gPSAoYWJvdmVbLTFdICsgMiAqIGFib3ZlWzBdICsgYWJvdmVbMV0gKyAyKSA+PiAyOwotICAgIGRhdGFbIDRdID0gKGFib3ZlWzBdICsgMiAqIGFib3ZlWy0xXSArIGxlZnRbMF0gKyAyKSA+PiAyOwotICAgIGRhdGFbMTNdID0gKGFib3ZlWzBdICsgMiAqIGFib3ZlWy0xXSArIGxlZnRbMF0gKyAyKSA+PiAyOwotICAgIGRhdGFbIDFdID0gKGFib3ZlWzBdICsgYWJvdmVbMV0gKyAxKSA+PiAxOwotICAgIGRhdGFbMTBdID0gKGFib3ZlWzBdICsgYWJvdmVbMV0gKyAxKSA+PiAxOwotICAgIGRhdGFbIDZdID0gKGFib3ZlWzBdICsgMiAqIGFib3ZlWzFdICsgYWJvdmVbMl0gKyAyKSA+PiAyOwotICAgIGRhdGFbMTVdID0gKGFib3ZlWzBdICsgMiAqIGFib3ZlWzFdICsgYWJvdmVbMl0gKyAyKSA+PiAyOwotICAgIGRhdGFbIDJdID0gKGFib3ZlWzFdICsgYWJvdmVbMl0gKyAxKSA+PiAxOwotICAgIGRhdGFbMTFdID0gKGFib3ZlWzFdICsgYWJvdmVbMl0gKyAxKSA+PiAxOwotICAgIGRhdGFbIDddID0gKGFib3ZlWzFdICsgMiAqIGFib3ZlWzJdICsgYWJvdmVbM10gKyAyKSA+PiAyOwotICAgIGRhdGFbIDNdID0gKGFib3ZlWzJdICsgYWJvdmVbM10gKyAxKSA+PiAxOwotICAgIGRhdGFbIDhdID0gKGxlZnRbMV0gKyAyICogbGVmdFswXSArIGxlZnRbLTFdICsgMikgPj4gMjsKLSAgICBkYXRhWzEyXSA9IChsZWZ0WzJdICsgMiAqIGxlZnRbMV0gKyBsZWZ0WzBdICsgMikgPj4gMjsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEludHJhNHg0SG9yaXpvbnRhbERvd25QcmVkaWN0aW9uCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQZXJmb3JtIGludHJhIDR4NCBob3Jpem9udGFsIGRvd24gcHJlZGljdGlvbiBtb2RlLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIEludHJhNHg0SG9yaXpvbnRhbERvd25QcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChhYm92ZSk7Ci0gICAgQVNTRVJUKGxlZnQpOwotCi0gICAgZGF0YVsgMF0gPSAobGVmdFstMV0gKyBsZWZ0WzBdICsgMSkgPj4gMTsKLSAgICBkYXRhWyA2XSA9IChsZWZ0Wy0xXSArIGxlZnRbMF0gKyAxKSA+PiAxOwotICAgIGRhdGFbIDVdID0gKGxlZnRbLTFdICsgMiAqIGxlZnRbMF0gKyBsZWZ0WzFdICsgMikgPj4gMjsKLSAgICBkYXRhWzExXSA9IChsZWZ0Wy0xXSArIDIgKiBsZWZ0WzBdICsgbGVmdFsxXSArIDIpID4+IDI7Ci0gICAgZGF0YVsgNF0gPSAobGVmdFswXSArIGxlZnRbMV0gKyAxKSA+PiAxOwotICAgIGRhdGFbMTBdID0gKGxlZnRbMF0gKyBsZWZ0WzFdICsgMSkgPj4gMTsKLSAgICBkYXRhWyA5XSA9IChsZWZ0WzBdICsgMiAqIGxlZnRbMV0gKyBsZWZ0WzJdICsgMikgPj4gMjsKLSAgICBkYXRhWzE1XSA9IChsZWZ0WzBdICsgMiAqIGxlZnRbMV0gKyBsZWZ0WzJdICsgMikgPj4gMjsKLSAgICBkYXRhWyA4XSA9IChsZWZ0WzFdICsgbGVmdFsyXSArIDEpID4+IDE7Ci0gICAgZGF0YVsxNF0gPSAobGVmdFsxXSArIGxlZnRbMl0gKyAxKSA+PiAxOwotICAgIGRhdGFbMTNdID0gKGxlZnRbMV0gKyAyICogbGVmdFsyXSArIGxlZnRbM10gKyAyKSA+PiAyOwotICAgIGRhdGFbMTJdID0gKGxlZnRbMl0gKyBsZWZ0WzNdICsgMSkgPj4gMTsKLSAgICBkYXRhWyAxXSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVstMV0gKyBsZWZ0WzBdICsgMikgPj4gMjsKLSAgICBkYXRhWyA3XSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVstMV0gKyBsZWZ0WzBdICsgMikgPj4gMjsKLSAgICBkYXRhWyAyXSA9IChhYm92ZVsxXSArIDIgKiBhYm92ZVswXSArIGFib3ZlWy0xXSArIDIpID4+IDI7Ci0gICAgZGF0YVsgM10gPSAoYWJvdmVbMl0gKyAyICogYWJvdmVbMV0gKyBhYm92ZVswXSArIDIpID4+IDI7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogSW50cmE0eDRWZXJ0aWNhbExlZnRQcmVkaWN0aW9uCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQZXJmb3JtIGludHJhIDR4NCB2ZXJ0aWNhbCBsZWZ0IHByZWRpY3Rpb24gbW9kZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBJbnRyYTR4NFZlcnRpY2FsTGVmdFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQoYWJvdmUpOwotCi0gICAgZGF0YVsgMF0gPSAoYWJvdmVbMF0gKyBhYm92ZVsxXSArIDEpID4+IDE7Ci0gICAgZGF0YVsgMV0gPSAoYWJvdmVbMV0gKyBhYm92ZVsyXSArIDEpID4+IDE7Ci0gICAgZGF0YVsgMl0gPSAoYWJvdmVbMl0gKyBhYm92ZVszXSArIDEpID4+IDE7Ci0gICAgZGF0YVsgM10gPSAoYWJvdmVbM10gKyBhYm92ZVs0XSArIDEpID4+IDE7Ci0gICAgZGF0YVsgNF0gPSAoYWJvdmVbMF0gKyAyICogYWJvdmVbMV0gKyBhYm92ZVsyXSArIDIpID4+IDI7Ci0gICAgZGF0YVsgNV0gPSAoYWJvdmVbMV0gKyAyICogYWJvdmVbMl0gKyBhYm92ZVszXSArIDIpID4+IDI7Ci0gICAgZGF0YVsgNl0gPSAoYWJvdmVbMl0gKyAyICogYWJvdmVbM10gKyBhYm92ZVs0XSArIDIpID4+IDI7Ci0gICAgZGF0YVsgN10gPSAoYWJvdmVbM10gKyAyICogYWJvdmVbNF0gKyBhYm92ZVs1XSArIDIpID4+IDI7Ci0gICAgZGF0YVsgOF0gPSAoYWJvdmVbMV0gKyBhYm92ZVsyXSArIDEpID4+IDE7Ci0gICAgZGF0YVsgOV0gPSAoYWJvdmVbMl0gKyBhYm92ZVszXSArIDEpID4+IDE7Ci0gICAgZGF0YVsxMF0gPSAoYWJvdmVbM10gKyBhYm92ZVs0XSArIDEpID4+IDE7Ci0gICAgZGF0YVsxMV0gPSAoYWJvdmVbNF0gKyBhYm92ZVs1XSArIDEpID4+IDE7Ci0gICAgZGF0YVsxMl0gPSAoYWJvdmVbMV0gKyAyICogYWJvdmVbMl0gKyBhYm92ZVszXSArIDIpID4+IDI7Ci0gICAgZGF0YVsxM10gPSAoYWJvdmVbMl0gKyAyICogYWJvdmVbM10gKyBhYm92ZVs0XSArIDIpID4+IDI7Ci0gICAgZGF0YVsxNF0gPSAoYWJvdmVbM10gKyAyICogYWJvdmVbNF0gKyBhYm92ZVs1XSArIDIpID4+IDI7Ci0gICAgZGF0YVsxNV0gPSAoYWJvdmVbNF0gKyAyICogYWJvdmVbNV0gKyBhYm92ZVs2XSArIDIpID4+IDI7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBJbnRyYTR4NEhvcml6b250YWxVcFByZWRpY3Rpb24KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFBlcmZvcm0gaW50cmEgNHg0IGhvcml6b250YWwgdXAgcHJlZGljdGlvbiBtb2RlLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIEludHJhNHg0SG9yaXpvbnRhbFVwUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmxlZnQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKGxlZnQpOwotCi0gICAgZGF0YVsgMF0gPSAobGVmdFswXSArIGxlZnRbMV0gKyAxKSA+PiAxOwotICAgIGRhdGFbIDFdID0gKGxlZnRbMF0gKyAyICogbGVmdFsxXSArIGxlZnRbMl0gKyAyKSA+PiAyOwotICAgIGRhdGFbIDJdID0gKGxlZnRbMV0gKyBsZWZ0WzJdICsgMSkgPj4gMTsKLSAgICBkYXRhWyAzXSA9IChsZWZ0WzFdICsgMiAqIGxlZnRbMl0gKyBsZWZ0WzNdICsgMikgPj4gMjsKLSAgICBkYXRhWyA0XSA9IChsZWZ0WzFdICsgbGVmdFsyXSArIDEpID4+IDE7Ci0gICAgZGF0YVsgNV0gPSAobGVmdFsxXSArIDIgKiBsZWZ0WzJdICsgbGVmdFszXSArIDIpID4+IDI7Ci0gICAgZGF0YVsgNl0gPSAobGVmdFsyXSArIGxlZnRbM10gKyAxKSA+PiAxOwotICAgIGRhdGFbIDddID0gKGxlZnRbMl0gKyAzICogbGVmdFszXSArIDIpID4+IDI7Ci0gICAgZGF0YVsgOF0gPSAobGVmdFsyXSArIGxlZnRbM10gKyAxKSA+PiAxOwotICAgIGRhdGFbIDldID0gKGxlZnRbMl0gKyAzICogbGVmdFszXSArIDIpID4+IDI7Ci0gICAgZGF0YVsxMF0gPSBsZWZ0WzNdOwotICAgIGRhdGFbMTFdID0gbGVmdFszXTsKLSAgICBkYXRhWzEyXSA9IGxlZnRbM107Ci0gICAgZGF0YVsxM10gPSBsZWZ0WzNdOwotICAgIGRhdGFbMTRdID0gbGVmdFszXTsKLSAgICBkYXRhWzE1XSA9IGxlZnRbM107Ci0KLX0KLQotI2VuZGlmIC8qIEgyNjRERUNfT01YREwgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBXcml0ZTR4NFRvMTZ4MTYKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFdyaXRlIGEgNHg0IGJsb2NrIChkYXRhNHg0KSBpbnRvIGNvcnJlY3QgcG9zaXRpb24KLSAgICAgICAgICBpbiAxNngxNiBtYWNyb2Jsb2NrIChkYXRhKS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBXcml0ZTR4NFRvMTZ4MTYodTggKmRhdGEsIHU4ICpkYXRhNHg0LCB1MzIgYmxvY2tOdW0pCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHgsIHk7Ci0gICAgdTMyICppbjMyLCAqb3V0MzI7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQoZGF0YTR4NCk7Ci0gICAgQVNTRVJUKGJsb2NrTnVtIDwgMTYpOwotCi0gICAgeCA9IGgyNjRic2RCbG9ja1hbYmxvY2tOdW1dOwotICAgIHkgPSBoMjY0YnNkQmxvY2tZW2Jsb2NrTnVtXTsKLQotICAgIGRhdGEgKz0geSoxNit4OwotCi0gICAgQVNTRVJUKCgodTMyKWRhdGEmMHgzKSA9PSAwKTsKLQotICAgIC8qbGludCAtLWUoODI2KSAqLwotICAgIG91dDMyID0gKHUzMiAqKWRhdGE7Ci0gICAgLypsaW50IC0tZSg4MjYpICovCi0gICAgaW4zMiA9ICh1MzIgKilkYXRhNHg0OwotCi0gICAgb3V0MzJbMF0gPSAqaW4zMisrOwotICAgIG91dDMyWzRdID0gKmluMzIrKzsKLSAgICBvdXQzMls4XSA9ICppbjMyKys7Ci0gICAgb3V0MzJbMTJdID0gKmluMzIrKzsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZXRlcm1pbmVJbnRyYTR4NFByZWRNb2RlCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBSZXR1cm5zIHRoZSBpbnRyYSA0eDQgcHJlZGljdGlvbiBtb2RlIG9mIGEgYmxvY2sgYmFzZWQgb24gdGhlCi0gICAgICAgICAgbmVpZ2hib3VyaW5nIG1hY3JvYmxvY2tzIGFuZCBpbmZvcm1hdGlvbiBwYXJzZWQgZnJvbSBzdHJlYW0uCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBEZXRlcm1pbmVJbnRyYTR4NFByZWRNb2RlKG1hY3JvYmxvY2tMYXllcl90ICpwTWJMYXllciwKLSAgICB1MzIgYXZhaWxhYmxlLCBuZWlnaGJvdXJfdCAqbkEsIG5laWdoYm91cl90ICpuQiwgdTMyIGluZGV4LAotICAgIG1iU3RvcmFnZV90ICpuTWJBLCBtYlN0b3JhZ2VfdCAqbk1iQikKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgbW9kZTEsIG1vZGUyOwotICAgIG1iU3RvcmFnZV90ICpwTWI7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwTWJMYXllcik7Ci0KLSAgICAvKiBkYyBvbmx5IHByZWRpY3Rpb24/ICovCi0gICAgaWYgKCFhdmFpbGFibGUpCi0gICAgICAgIG1vZGUxID0gMjsKLSAgICBlbHNlCi0gICAgewotICAgICAgICBwTWIgPSBuTWJBOwotICAgICAgICBpZiAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5UUkE0eDQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1vZGUxID0gcE1iLT5pbnRyYTR4NFByZWRNb2RlW25BLT5pbmRleF07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbW9kZTEgPSAyOwotCi0gICAgICAgIHBNYiA9IG5NYkI7Ci0gICAgICAgIGlmIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRSQTR4NCkKLSAgICAgICAgewotICAgICAgICAgICAgbW9kZTIgPSBwTWItPmludHJhNHg0UHJlZE1vZGVbbkItPmluZGV4XTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBtb2RlMiA9IDI7Ci0KLSAgICAgICAgbW9kZTEgPSBNSU4obW9kZTEsIG1vZGUyKTsKLSAgICB9Ci0KLSAgICBpZiAoIXBNYkxheWVyLT5tYlByZWQucHJldkludHJhNHg0UHJlZE1vZGVGbGFnW2luZGV4XSkKLSAgICB7Ci0gICAgICAgIGlmIChwTWJMYXllci0+bWJQcmVkLnJlbUludHJhNHg0UHJlZE1vZGVbaW5kZXhdIDwgbW9kZTEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1vZGUxID0gcE1iTGF5ZXItPm1iUHJlZC5yZW1JbnRyYTR4NFByZWRNb2RlW2luZGV4XTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1vZGUxID0gcE1iTGF5ZXItPm1iUHJlZC5yZW1JbnRyYTR4NFByZWRNb2RlW2luZGV4XSArIDE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4obW9kZTEpOwotfQotCi0KLS8qbGludCArZTcwMiAqLwotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRyYV9wcmVkaWN0aW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW50cmFfcHJlZGljdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjUyYmQ1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRyYV9wcmVkaWN0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotICAgIDMuIERhdGEgdHlwZXMKLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSDI2NFNXREVDX0lOVFJBX1BSRURJQ1RJT05fSAotI2RlZmluZSBIMjY0U1dERUNfSU5UUkFfUFJFRElDVElPTl9ICi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLSNpbmNsdWRlICJoMjY0YnNkX2ltYWdlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gRGF0YSB0eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmbmRlZiBIMjY0REVDX09NWERMCi11MzIgaDI2NGJzZEludHJhUHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCBtYWNyb2Jsb2NrTGF5ZXJfdCAqbWJMYXllciwKLSAgICBpbWFnZV90ICppbWFnZSwgdTMyIG1iTnVtLCB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQsIHU4ICpkYXRhKTsKLQotdTMyIGgyNjRic2RJbnRyYTR4NFByZWRpY3Rpb24obWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrTGF5ZXJfdCAqbWJMYXllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4ICphYm92ZSwgdTggKmxlZnQsIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCk7Ci11MzIgaDI2NGJzZEludHJhMTZ4MTZQcmVkaWN0aW9uKG1iU3RvcmFnZV90ICpwTWIsIHU4ICpkYXRhLCBpMzIgcmVzaWR1YWxbXVsxNl0sCi0gICAgdTggKmFib3ZlLCB1OCAqbGVmdCwgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkKTsKLQotdTMyIGgyNjRic2RJbnRyYUNocm9tYVByZWRpY3Rpb24obWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsIGkzMiByZXNpZHVhbFtdWzE2XSwKLSAgICB1OCAqYWJvdmUsIHU4ICpsZWZ0LCB1MzIgcHJlZE1vZGUsIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCk7Ci0KLXZvaWQgaDI2NGJzZEdldE5laWdoYm91clBlbHMoaW1hZ2VfdCAqaW1hZ2UsIHU4ICphYm92ZSwgdTggKmxlZnQsIHUzMiBtYk51bSk7Ci0KLSNlbHNlCi0KLXUzMiBoMjY0YnNkSW50cmE0eDRQcmVkaWN0aW9uKG1iU3RvcmFnZV90ICpwTWIsIHU4ICpkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9ja0xheWVyX3QgKm1iTGF5ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqcEltYWdlLCB1MzIgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQsIHUzMiBibG9jayk7Ci0KLXUzMiBoMjY0YnNkSW50cmExNngxNlByZWRpY3Rpb24obWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsIHU4ICpwSW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIHdpZHRoLCB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQpOwotCi11MzIgaDI2NGJzZEludHJhQ2hyb21hUHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCB1OCAqZGF0YSwgaW1hZ2VfdCAqaW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIHByZWRNb2RlLCB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQpOwotCi0jZW5kaWYKLQotI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfSU5UUkFfUFJFRElDVElPTl9IICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbWFjcm9ibG9ja19sYXllci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjNlN2YwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLSAgICAgMy4gTW9kdWxlIGRlZmluZXMKLSAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotICAgICA1LiBGdW5jdGlvbnMKLSAgICAgICAgICBoMjY0YnNkRGVjb2RlTWFjcm9ibG9ja0xheWVyCi0gICAgICAgICAgaDI2NGJzZE1iUGFydFByZWRNb2RlCi0gICAgICAgICAgaDI2NGJzZE51bU1iUGFydAotICAgICAgICAgIGgyNjRic2ROdW1TdWJNYlBhcnQKLSAgICAgICAgICBEZWNvZGVNYlByZWQKLSAgICAgICAgICBEZWNvZGVTdWJNYlByZWQKLSAgICAgICAgICBEZWNvZGVSZXNpZHVhbAotICAgICAgICAgIERldGVybWluZU5jCi0gICAgICAgICAgQ2JwSW50cmExNngxNgotICAgICAgICAgIGgyNjRic2RQcmVkTW9kZUludHJhMTZ4MTYKLSAgICAgICAgICBoMjY0YnNkRGVjb2RlTWFjcm9ibG9jawotICAgICAgICAgIFByb2Nlc3NSZXNpZHVhbAotICAgICAgICAgIGgyNjRic2RTdWJNYlBhcnRNb2RlCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zbGljZV9oZWFkZXIuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3ZsYy5oIgotI2luY2x1ZGUgImgyNjRic2RfY2F2bGMuaCIKLSNpbmNsdWRlICJoMjY0YnNkX25hbF91bml0LmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9uZWlnaGJvdXIuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3RyYW5zZm9ybS5oIgotI2luY2x1ZGUgImgyNjRic2RfaW50cmFfcHJlZGljdGlvbi5oIgotI2luY2x1ZGUgImgyNjRic2RfaW50ZXJfcHJlZGljdGlvbi5oIgotCi0jaWZkZWYgSDI2NERFQ19PTVhETAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotI2VuZGlmIC8qIEgyNjRERUNfT01YREwgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZmRlZiBIMjY0REVDX09NWERMCi1zdGF0aWMgY29uc3QgdTMyIGNocm9tYUluZGV4WzhdID0geyAyNTYsIDI2MCwgMjg4LCAyOTIsIDMyMCwgMzI0LCAzNTIsIDM1NiB9Owotc3RhdGljIGNvbnN0IHUzMiBsdW1hSW5kZXhbMTZdID0geyAgIDAsICAgNCwgIDY0LCAgNjgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwgIDEyLCAgNzIsICA3NiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI4LCAxMzIsIDE5MiwgMTk2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzYsIDE0MCwgMjAwLCAyMDQgfTsKLSNlbmRpZgotLyogbWFwcGluZyBvZiBkYyBjb2VmZmljaWVudHMgYXJyYXkgdG8gbHVtYSBibG9ja3MgKi8KLXN0YXRpYyBjb25zdCB1MzIgZGNDb2VmZkluZGV4WzE2XSA9Ci0gICAgezAsIDEsIDQsIDUsIDIsIDMsIDYsIDcsIDgsIDksIDEyLCAxMywgMTAsIDExLCAxNCwgMTV9OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgRGVjb2RlTWJQcmVkKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgbWJQcmVkX3QgKnBNYlByZWQsCi0gICAgbWJUeXBlX2UgbWJUeXBlLCB1MzIgbnVtUmVmSWR4QWN0aXZlKTsKLXN0YXRpYyB1MzIgRGVjb2RlU3ViTWJQcmVkKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgc3ViTWJQcmVkX3QgKnBTdWJNYlByZWQsCi0gICAgbWJUeXBlX2UgbWJUeXBlLCB1MzIgbnVtUmVmSWR4QWN0aXZlKTsKLXN0YXRpYyB1MzIgRGVjb2RlUmVzaWR1YWwoc3RybURhdGFfdCAqcFN0cm1EYXRhLCByZXNpZHVhbF90ICpwUmVzaWR1YWwsCi0gICAgbWJTdG9yYWdlX3QgKnBNYiwgbWJUeXBlX2UgbWJUeXBlLCB1MzIgY29kZWRCbG9ja1BhdHRlcm4pOwotCi0jaWZkZWYgSDI2NERFQ19PTVhETAotc3RhdGljIHUzMiBEZXRlcm1pbmVOYyhtYlN0b3JhZ2VfdCAqcE1iLCB1MzIgYmxvY2tJbmRleCwgdTggKnBUb3RhbENvZWZmKTsKLSNlbHNlCi1zdGF0aWMgdTMyIERldGVybWluZU5jKG1iU3RvcmFnZV90ICpwTWIsIHUzMiBibG9ja0luZGV4LCBpMTYgKnBUb3RhbENvZWZmKTsKLSNlbmRpZgotCi1zdGF0aWMgdTMyIENicEludHJhMTZ4MTYobWJUeXBlX2UgbWJUeXBlKTsKLSNpZmRlZiBIMjY0REVDX09NWERMCi1zdGF0aWMgdTMyIFByb2Nlc3NJbnRyYTR4NFJlc2lkdWFsKG1iU3RvcmFnZV90ICpwTWIsIHU4ICpkYXRhLCB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQsCi0gICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2tMYXllcl90ICptYkxheWVyLCBjb25zdCB1OCAqKnBTcmMsIGltYWdlX3QgKmltYWdlKTsKLXN0YXRpYyB1MzIgUHJvY2Vzc0Nocm9tYVJlc2lkdWFsKG1iU3RvcmFnZV90ICpwTWIsIHU4ICpkYXRhLCBjb25zdCB1OCAqKnBTcmMgKTsKLXN0YXRpYyB1MzIgUHJvY2Vzc0ludHJhMTZ4MTZSZXNpZHVhbChtYlN0b3JhZ2VfdCAqcE1iLCB1OCAqZGF0YSwgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkLAotICAgICAgICAgICAgICAgICAgICB1MzIgaW50cmFDaHJvbWFQcmVkTW9kZSwgY29uc3QgdTggKipwU3JjLCBpbWFnZV90ICppbWFnZSk7Ci0KLQotI2Vsc2UKLXN0YXRpYyB1MzIgUHJvY2Vzc1Jlc2lkdWFsKG1iU3RvcmFnZV90ICpwTWIsIGkzMiByZXNpZHVhbExldmVsW11bMTZdLCB1MzIgKik7Ci0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uIG5hbWU6IGgyNjRic2REZWNvZGVNYWNyb2Jsb2NrTGF5ZXIKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFBhcnNlIG1hY3JvYmxvY2sgc3BlY2lmaWMgaW5mb3JtYXRpb24gZnJvbSBiaXQgc3RyZWFtLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICBwU3RybURhdGEgICAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQotICAgICAgICAgIHBNYiAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gbWFjcm9ibG9jayBzdG9yYWdlIHN0cnVjdHVyZQotICAgICAgICAgIHNsaWNlVHlwZSAgICAgICAgIHR5cGUgb2YgdGhlIGN1cnJlbnQgc2xpY2UKLSAgICAgICAgICBudW1SZWZJZHhBY3RpdmUgICBtYXhpbXVtIHJlZmVyZW5jZSBpbmRleAotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgcE1iTGF5ZXIgICAgICAgICAgc3RvcmVzIHRoZSBtYWNyb2Jsb2NrIGRhdGEgcGFyc2VkIGZyb20gc3RyZWFtCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICBIQU5UUk9fT0sgICAgICAgICBzdWNjZXNzCi0gICAgICAgICAgSEFOVFJPX05PSyAgICAgICAgZW5kIG9mIHN0cmVhbSBvciBlcnJvciBpbiBzdHJlYW0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2REZWNvZGVNYWNyb2Jsb2NrTGF5ZXIoc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICAgIG1hY3JvYmxvY2tMYXllcl90ICpwTWJMYXllciwgbWJTdG9yYWdlX3QgKnBNYiwgdTMyIHNsaWNlVHlwZSwKLSAgICB1MzIgbnVtUmVmSWR4QWN0aXZlKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXAsIGksIHZhbHVlOwotICAgIGkzMiBpdG1wOwotICAgIG1iUGFydFByZWRNb2RlX2UgcGFydE1vZGU7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwTWJMYXllcik7Ci0KLSNpZmRlZiBIMjY0REVDX05FT04KLSAgICBoMjY0YnNkQ2xlYXJNYkxheWVyKHBNYkxheWVyLCAoKHNpemVvZihtYWNyb2Jsb2NrTGF5ZXJfdCkgKyA2MykgJiB+MHgzRikpOwotI2Vsc2UKLSAgICBIMjY0U3dEZWNNZW1zZXQocE1iTGF5ZXIsIDAsIHNpemVvZihtYWNyb2Jsb2NrTGF5ZXJfdCkpOwotI2VuZGlmCi0KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOwotCi0gICAgaWYgKElTX0lfU0xJQ0Uoc2xpY2VUeXBlKSkKLSAgICB7Ci0gICAgICAgIGlmICgodmFsdWUgKyA2KSA+IDMxIHx8IHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBNYkxheWVyLT5tYlR5cGUgPSAobWJUeXBlX2UpKHZhbHVlICsgNik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmICgodmFsdWUgKyAxKSA+IDMxIHx8IHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBNYkxheWVyLT5tYlR5cGUgPSAobWJUeXBlX2UpKHZhbHVlICsgMSk7Ci0gICAgfQotCi0gICAgaWYgKHBNYkxheWVyLT5tYlR5cGUgPT0gSV9QQ00pCi0gICAgewotICAgICAgICBpMzIgKmxldmVsOwotICAgICAgICB3aGlsZSggIWgyNjRic2RJc0J5dGVBbGlnbmVkKHBTdHJtRGF0YSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBwY21fYWxpZ25tZW50X3plcm9fYml0ICovCi0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgICAgICAgICAgaWYgKHRtcCkKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIH0KLQotICAgICAgICBsZXZlbCA9IHBNYkxheWVyLT5yZXNpZHVhbC5sZXZlbFswXTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDM4NDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YWx1ZSA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgOCk7Ci0gICAgICAgICAgICBpZiAodmFsdWUgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAqbGV2ZWwrKyA9IChpMzIpdmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcGFydE1vZGUgPSBoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iTGF5ZXItPm1iVHlwZSk7Ci0gICAgICAgIGlmICggKHBhcnRNb2RlID09IFBSRURfTU9ERV9JTlRFUikgJiYKLSAgICAgICAgICAgICAoaDI2NGJzZE51bU1iUGFydChwTWJMYXllci0+bWJUeXBlKSA9PSA0KSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcCA9IERlY29kZVN1Yk1iUHJlZChwU3RybURhdGEsICZwTWJMYXllci0+c3ViTWJQcmVkLAotICAgICAgICAgICAgICAgIHBNYkxheWVyLT5tYlR5cGUsIG51bVJlZklkeEFjdGl2ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSBEZWNvZGVNYlByZWQocFN0cm1EYXRhLCAmcE1iTGF5ZXItPm1iUHJlZCwKLSAgICAgICAgICAgICAgICBwTWJMYXllci0+bWJUeXBlLCBudW1SZWZJZHhBY3RpdmUpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAgICAgaWYgKHBhcnRNb2RlICE9IFBSRURfTU9ERV9JTlRSQTE2eDE2KQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iTWFwcGVkKHBTdHJtRGF0YSwgJnZhbHVlLAotICAgICAgICAgICAgICAgICh1MzIpKHBhcnRNb2RlID09IFBSRURfTU9ERV9JTlRSQTR4NCkpOwotICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgICAgICBwTWJMYXllci0+Y29kZWRCbG9ja1BhdHRlcm4gPSB2YWx1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBNYkxheWVyLT5jb2RlZEJsb2NrUGF0dGVybiA9IENicEludHJhMTZ4MTYocE1iTGF5ZXItPm1iVHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIHBNYkxheWVyLT5jb2RlZEJsb2NrUGF0dGVybiB8fAotICAgICAgICAgICAgIChwYXJ0TW9kZSA9PSBQUkVEX01PREVfSU5UUkExNngxNikgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwgJml0bXApOwotICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0sgfHwgKGl0bXAgPCAtMjYpIHx8IChpdG1wID4gMjUpICkKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICBwTWJMYXllci0+bWJRcERlbHRhID0gaXRtcDsKLQotICAgICAgICAgICAgdG1wID0gRGVjb2RlUmVzaWR1YWwocFN0cm1EYXRhLCAmcE1iTGF5ZXItPnJlc2lkdWFsLCBwTWIsCi0gICAgICAgICAgICAgICAgcE1iTGF5ZXItPm1iVHlwZSwgcE1iTGF5ZXItPmNvZGVkQmxvY2tQYXR0ZXJuKTsKLQotICAgICAgICAgICAgcFN0cm1EYXRhLT5zdHJtQnVmZlJlYWRCaXRzID0KLSAgICAgICAgICAgICAgICAodTMyKShwU3RybURhdGEtPnBTdHJtQ3VyclBvcyAtIHBTdHJtRGF0YS0+cFN0cm1CdWZmU3RhcnQpICogOCArCi0gICAgICAgICAgICAgICAgcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQ7Ci0KLSAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkTWJQYXJ0UHJlZE1vZGUKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFJldHVybnMgdGhlIHByZWRpY3Rpb24gbW9kZSBvZiBhIG1hY3JvYmxvY2sgdHlwZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1tYlBhcnRQcmVkTW9kZV9lIGgyNjRic2RNYlBhcnRQcmVkTW9kZShtYlR5cGVfZSBtYlR5cGUpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChtYlR5cGUgPD0gMzEpOwotCi0gICAgaWYgKChtYlR5cGUgPD0gUF84eDhyZWYwKSkKLSAgICAgICAgcmV0dXJuKFBSRURfTU9ERV9JTlRFUik7Ci0gICAgZWxzZSBpZiAobWJUeXBlID09IElfNHg0KQotICAgICAgICByZXR1cm4oUFJFRF9NT0RFX0lOVFJBNHg0KTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybihQUkVEX01PREVfSU5UUkExNngxNik7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkTnVtTWJQYXJ0Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBSZXR1cm5zIHRoZSBhbW91bnQgb2YgbWFjcm9ibG9jayBwYXJ0aXRpb25zIGluIGEgbWFjcm9ibG9jayB0eXBlCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkTnVtTWJQYXJ0KG1iVHlwZV9lIG1iVHlwZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGgyNjRic2RNYlBhcnRQcmVkTW9kZShtYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUik7Ci0KLSAgICBzd2l0Y2ggKG1iVHlwZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgUF9MMF8xNngxNjoKLSAgICAgICAgY2FzZSBQX1NraXA6Ci0gICAgICAgICAgICByZXR1cm4oMSk7Ci0KLSAgICAgICAgY2FzZSBQX0wwX0wwXzE2eDg6Ci0gICAgICAgIGNhc2UgUF9MMF9MMF84eDE2OgotICAgICAgICAgICAgcmV0dXJuKDIpOwotCi0gICAgICAgIC8qIFBfOHg4IG9yIFBfOHg4cmVmMCAqLwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuKDQpOwotICAgIH0KLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2ROdW1TdWJNYlBhcnQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFJldHVybnMgdGhlIGFtb3VudCBvZiBzdWItcGFydGl0aW9ucyBpbiBhIHN1Yi1tYWNyb2Jsb2NrIHR5cGUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2ROdW1TdWJNYlBhcnQoc3ViTWJUeXBlX2Ugc3ViTWJUeXBlKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoc3ViTWJUeXBlIDw9IFBfTDBfNHg0KTsKLQotICAgIHN3aXRjaCAoc3ViTWJUeXBlKQotICAgIHsKLSAgICAgICAgY2FzZSBQX0wwXzh4ODoKLSAgICAgICAgICAgIHJldHVybigxKTsKLQotICAgICAgICBjYXNlIFBfTDBfOHg0OgotICAgICAgICBjYXNlIFBfTDBfNHg4OgotICAgICAgICAgICAgcmV0dXJuKDIpOwotCi0gICAgICAgIC8qIFBfTDBfNHg0ICovCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4oNCk7Ci0gICAgfQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlTWJQcmVkCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQYXJzZSBtYWNyb2Jsb2NrIHByZWRpY3Rpb24gaW5mb3JtYXRpb24gZnJvbSBiaXQgc3RyZWFtIGFuZCBzdG9yZQotICAgICAgICAgIGluICdwTWJQcmVkJy4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIERlY29kZU1iUHJlZChzdHJtRGF0YV90ICpwU3RybURhdGEsIG1iUHJlZF90ICpwTWJQcmVkLCBtYlR5cGVfZSBtYlR5cGUsCi0gICAgdTMyIG51bVJlZklkeEFjdGl2ZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wLCBpLCBqLCB2YWx1ZTsKLSAgICBpMzIgaXRtcDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBNYlByZWQpOwotCi0gICAgc3dpdGNoIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobWJUeXBlKSkKLSAgICB7Ci0gICAgICAgIGNhc2UgUFJFRF9NT0RFX0lOVEVSOiAvKiBQUkVEX01PREVfSU5URVIgKi8KLSAgICAgICAgICAgIGlmIChudW1SZWZJZHhBY3RpdmUgPiAxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoaSA9IGgyNjRic2ROdW1NYlBhcnQobWJUeXBlKSwgaiA9IDA7IGktLTsgIGorKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJUcnVuY2F0ZWQocFN0cm1EYXRhLCAmdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAodTMyKShudW1SZWZJZHhBY3RpdmUgPiAyKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LIHx8IHZhbHVlID49IG51bVJlZklkeEFjdGl2ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgICAgICAgICAgICAgICAgICBwTWJQcmVkLT5yZWZJZHhMMFtqXSA9IHZhbHVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChpID0gaDI2NGJzZE51bU1iUGFydChtYlR5cGUpLCBqID0gMDsgaS0tOyAgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLCAmaXRtcCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICAgICAgICAgIHBNYlByZWQtPm12ZEwwW2pdLmhvciA9IChpMTYpaXRtcDsKLQotICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLCAmaXRtcCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICAgICAgICAgIHBNYlByZWQtPm12ZEwwW2pdLnZlciA9IChpMTYpaXRtcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgUFJFRF9NT0RFX0lOVFJBNHg0OgotICAgICAgICAgICAgZm9yIChpdG1wID0gMCwgaSA9IDA7IGl0bXAgPCAyOyBpdG1wKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBoMjY0YnNkU2hvd0JpdHMzMihwU3RybURhdGEpOwotICAgICAgICAgICAgICAgIHRtcCA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yIChqID0gODsgai0tOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwTWJQcmVkLT5wcmV2SW50cmE0eDRQcmVkTW9kZUZsYWdbaV0gPQotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgJiAweDgwMDAwMDAwID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlIDw8PSAxOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXBNYlByZWQtPnByZXZJbnRyYTR4NFByZWRNb2RlRmxhZ1tpXSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcE1iUHJlZC0+cmVtSW50cmE0eDRQcmVkTW9kZVtpXSA9IHZhbHVlPj4yOTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIDw8PSAzOwotICAgICAgICAgICAgICAgICAgICAgICAgdG1wKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGgyNjRic2RGbHVzaEJpdHMocFN0cm1EYXRhLCA4ICsgMyp0bXApID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIGZhbGwtdGhyb3VnaCAqLwotCi0gICAgICAgIGNhc2UgUFJFRF9NT0RFX0lOVFJBMTZ4MTY6Ci0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOwotICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0sgfHwgdmFsdWUgPiAzKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIHBNYlByZWQtPmludHJhQ2hyb21hUHJlZE1vZGUgPSB2YWx1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlU3ViTWJQcmVkCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQYXJzZSBzdWItbWFjcm9ibG9jayBwcmVkaWN0aW9uIGluZm9ybWF0aW9uIGZyb20gYml0IHN0cmVhbSBhbmQKLSAgICAgICAgICBzdG9yZSBpbiAncE1iUHJlZCcuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBEZWNvZGVTdWJNYlByZWQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCBzdWJNYlByZWRfdCAqcFN1Yk1iUHJlZCwKLSAgICBtYlR5cGVfZSBtYlR5cGUsIHUzMiBudW1SZWZJZHhBY3RpdmUpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcCwgaSwgaiwgdmFsdWU7Ci0gICAgaTMyIGl0bXA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwU3ViTWJQcmVkKTsKLSAgICBBU1NFUlQoaDI2NGJzZE1iUGFydFByZWRNb2RlKG1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSyB8fCB2YWx1ZSA+IDMpCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBTdWJNYlByZWQtPnN1Yk1iVHlwZVtpXSA9IChzdWJNYlR5cGVfZSl2YWx1ZTsKLSAgICB9Ci0KLSAgICBpZiAoIChudW1SZWZJZHhBY3RpdmUgPiAxKSAmJiAobWJUeXBlICE9IFBfOHg4cmVmMCkgKQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlRydW5jYXRlZChwU3RybURhdGEsICZ2YWx1ZSwKLSAgICAgICAgICAgICAgICAodTMyKShudW1SZWZJZHhBY3RpdmUgPiAyKSk7Ci0gICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSyB8fCB2YWx1ZSA+PSBudW1SZWZJZHhBY3RpdmUpCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgcFN1Yk1iUHJlZC0+cmVmSWR4TDBbaV0gPSB2YWx1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgewotICAgICAgICBqID0gMDsKLSAgICAgICAgZm9yICh2YWx1ZSA9IGgyNjRic2ROdW1TdWJNYlBhcnQocFN1Yk1iUHJlZC0+c3ViTWJUeXBlW2ldKTsKLSAgICAgICAgICAgICB2YWx1ZS0tOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLCAmaXRtcCk7Ci0gICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgICAgIHBTdWJNYlByZWQtPm12ZEwwW2ldW2pdLmhvciA9IChpMTYpaXRtcDsKLQotICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsICZpdG1wKTsKLSAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICAgICAgcFN1Yk1iUHJlZC0+bXZkTDBbaV1bal0udmVyID0gKGkxNilpdG1wOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotI2lmZGVmIEgyNjRERUNfT01YREwKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlUmVzaWR1YWwKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFBhcnNlIHJlc2lkdWFsIGluZm9ybWF0aW9uIGZyb20gYml0IHN0cmVhbSBhbmQgc3RvcmUgaW4gJ3BSZXNpZHVhbCcuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBEZWNvZGVSZXNpZHVhbChzdHJtRGF0YV90ICpwU3RybURhdGEsIHJlc2lkdWFsX3QgKnBSZXNpZHVhbCwKLSAgICBtYlN0b3JhZ2VfdCAqcE1iLCBtYlR5cGVfZSBtYlR5cGUsIHUzMiBjb2RlZEJsb2NrUGF0dGVybikKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaSwgajsKLSAgICB1MzIgYmxvY2tDb2RlZDsKLSAgICB1MzIgYmxvY2tJbmRleDsKLSAgICB1MzIgaXMxNngxNjsKLSAgICBPTVhfSU5UIG5jOwotICAgIE9NWFJlc3VsdCBvbXhSZXM7Ci0gICAgT01YX1U4ICpwUG9zQ29lZkJ1ZjsKLQotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocFJlc2lkdWFsKTsKLQotICAgIHBQb3NDb2VmQnVmID0gcFJlc2lkdWFsLT5wb3NDb2VmQnVmOwotCi0gICAgLyogbHVtYSBEQyBpcyBhdCBpbmRleCAyNCAqLwotICAgIGlmIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobWJUeXBlKSA9PSBQUkVEX01PREVfSU5UUkExNngxNikKLSAgICB7Ci0gICAgICAgIG5jID0gKE9NWF9JTlQpRGV0ZXJtaW5lTmMocE1iLCAwLCBwUmVzaWR1YWwtPnRvdGFsQ29lZmYpOwotI2lmbmRlZiBIMjY0REVDX05FT04KLSAgICAgICAgb214UmVzID0gIG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMoCi0gICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCAqKikgKCZwU3RybURhdGEtPnBTdHJtQ3VyclBvcyksCi0gICAgICAgICAgICAgICAgKE9NWF9TMzIqKSAoJnBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkKSwKLSAgICAgICAgICAgICAgICAmcFJlc2lkdWFsLT50b3RhbENvZWZmWzI0XSwKLSAgICAgICAgICAgICAgICAmcFBvc0NvZWZCdWYsCi0gICAgICAgICAgICAgICAgbmMsCi0gICAgICAgICAgICAgICAgMTYpOwotI2Vsc2UKLSAgICAgICAgb214UmVzID0gYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIoCi0gICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCAqKikgKCZwU3RybURhdGEtPnBTdHJtQ3VyclBvcyksCi0gICAgICAgICAgICAgICAgKE9NWF9TMzIqKSAoJnBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkKSwKLSAgICAgICAgICAgICAgICAmcFJlc2lkdWFsLT50b3RhbENvZWZmWzI0XSwKLSAgICAgICAgICAgICAgICAmcFBvc0NvZWZCdWYsCi0gICAgICAgICAgICAgICAgbmMsCi0gICAgICAgICAgICAgICAgMTYpOwotI2VuZGlmCi0gICAgICAgIGlmIChvbXhSZXMgIT0gT01YX1N0c19Ob0VycikKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgaXMxNngxNiA9IEhBTlRST19UUlVFOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIGlzMTZ4MTYgPSBIQU5UUk9fRkFMU0U7Ci0KLSAgICBmb3IgKGkgPSA0LCBibG9ja0luZGV4ID0gMDsgaS0tOykKLSAgICB7Ci0gICAgICAgIC8qIGx1bWEgY2JwIGluIGJpdHMgMC0zICovCi0gICAgICAgIGJsb2NrQ29kZWQgPSBjb2RlZEJsb2NrUGF0dGVybiAmIDB4MTsKLSAgICAgICAgY29kZWRCbG9ja1BhdHRlcm4gPj49IDE7Ci0gICAgICAgIGlmIChibG9ja0NvZGVkKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGogPSA0OyBqLS07IGJsb2NrSW5kZXgrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuYyA9IChPTVhfSU5UKURldGVybWluZU5jKHBNYixibG9ja0luZGV4LHBSZXNpZHVhbC0+dG90YWxDb2VmZik7Ci0gICAgICAgICAgICAgICAgaWYgKGlzMTZ4MTYpCi0gICAgICAgICAgICAgICAgewotI2lmbmRlZiBIMjY0REVDX05FT04KLSAgICAgICAgICAgICAgICAgICAgb214UmVzID0gIG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCAqKikgKCZwU3RybURhdGEtPnBTdHJtQ3VyclBvcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9TMzIqKSAoJnBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFJlc2lkdWFsLT50b3RhbENvZWZmW2Jsb2NrSW5kZXhdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUG9zQ29lZkJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNSk7Ci0jZWxzZQotICAgICAgICAgICAgICAgICAgICBvbXhSZXMgPSAgYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCAqKikgKCZwU3RybURhdGEtPnBTdHJtQ3VyclBvcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9TMzIqKSAoJnBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFJlc2lkdWFsLT50b3RhbENvZWZmW2Jsb2NrSW5kZXhdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUG9zQ29lZkJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNSk7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSNpZm5kZWYgSDI2NERFQ19ORU9OCi0gICAgICAgICAgICAgICAgICAgIG9teFJlcyA9ICBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTggKiopICgmcFN0cm1EYXRhLT5wU3RybUN1cnJQb3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfUzMyKikgKCZwU3RybURhdGEtPmJpdFBvc0luV29yZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBSZXNpZHVhbC0+dG90YWxDb2VmZltibG9ja0luZGV4XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFBvc0NvZWZCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYpOwotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgb214UmVzID0gYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCAqKikgKCZwU3RybURhdGEtPnBTdHJtQ3VyclBvcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9TMzIqKSAoJnBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFJlc2lkdWFsLT50b3RhbENvZWZmW2Jsb2NrSW5kZXhdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUG9zQ29lZkJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNik7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG9teFJlcyAhPSBPTVhfU3RzX05vRXJyKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYmxvY2tJbmRleCArPSA0OwotICAgIH0KLQotICAgIC8qIGNocm9tYSBEQyBibG9jayBhcmUgYXQgaW5kaWNlcyAyNSBhbmQgMjYgKi8KLSAgICBibG9ja0NvZGVkID0gY29kZWRCbG9ja1BhdHRlcm4gJiAweDM7Ci0gICAgaWYgKGJsb2NrQ29kZWQpCi0gICAgewotI2lmbmRlZiBIMjY0REVDX05FT04KLSAgICAgICAgb214UmVzID0gIG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQygKLSAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KiopICgmcFN0cm1EYXRhLT5wU3RybUN1cnJQb3MpLAotICAgICAgICAgICAgICAgIChPTVhfUzMyKikgKCZwU3RybURhdGEtPmJpdFBvc0luV29yZCksCi0gICAgICAgICAgICAgICAgJnBSZXNpZHVhbC0+dG90YWxDb2VmZlsyNV0sCi0gICAgICAgICAgICAgICAgJnBQb3NDb2VmQnVmKTsKLSNlbHNlCi0gICAgICAgIG9teFJlcyA9IGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyKAotICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKikgKCZwU3RybURhdGEtPnBTdHJtQ3VyclBvcyksCi0gICAgICAgICAgICAgICAgKE9NWF9TMzIqKSAoJnBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkKSwKLSAgICAgICAgICAgICAgICAmcFJlc2lkdWFsLT50b3RhbENvZWZmWzI1XSwKLSAgICAgICAgICAgICAgICAmcFBvc0NvZWZCdWYsCi0gICAgICAgICAgICAgICAgMTcsCi0gICAgICAgICAgICAgICAgNCk7Ci0jZW5kaWYKLSAgICAgICAgaWYgKG9teFJlcyAhPSBPTVhfU3RzX05vRXJyKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotI2lmbmRlZiBIMjY0REVDX05FT04KLSAgICAgICAgb214UmVzID0gIG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQygKLSAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KiopICgmcFN0cm1EYXRhLT5wU3RybUN1cnJQb3MpLAotICAgICAgICAgICAgICAgIChPTVhfUzMyKikgKCZwU3RybURhdGEtPmJpdFBvc0luV29yZCksCi0gICAgICAgICAgICAgICAgJnBSZXNpZHVhbC0+dG90YWxDb2VmZlsyNl0sCi0gICAgICAgICAgICAgICAgJnBQb3NDb2VmQnVmKTsKLSNlbHNlCi0gICAgICAgIG9teFJlcyA9IGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyKAotICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKikgKCZwU3RybURhdGEtPnBTdHJtQ3VyclBvcyksCi0gICAgICAgICAgICAgICAgKE9NWF9TMzIqKSAoJnBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkKSwKLSAgICAgICAgICAgICAgICAmcFJlc2lkdWFsLT50b3RhbENvZWZmWzI2XSwKLSAgICAgICAgICAgICAgICAmcFBvc0NvZWZCdWYsCi0gICAgICAgICAgICAgICAgMTcsCi0gICAgICAgICAgICAgICAgNCk7Ci0jZW5kaWYKLSAgICAgICAgaWYgKG9teFJlcyAhPSBPTVhfU3RzX05vRXJyKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLQotICAgIC8qIGNocm9tYSBBQyAqLwotICAgIGJsb2NrQ29kZWQgPSBjb2RlZEJsb2NrUGF0dGVybiAmIDB4MjsKLSAgICBpZiAoYmxvY2tDb2RlZCkKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDg7IGktLTtibG9ja0luZGV4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5jID0gKE9NWF9JTlQpRGV0ZXJtaW5lTmMocE1iLCBibG9ja0luZGV4LCBwUmVzaWR1YWwtPnRvdGFsQ29lZmYpOwotI2lmbmRlZiBIMjY0REVDX05FT04KLSAgICAgICAgICAgIG9teFJlcyA9ICBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDKAotICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4ICoqKSAoJnBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zKSwKLSAgICAgICAgICAgICAgICAgICAgKE9NWF9TMzIqKSAoJnBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkKSwKLSAgICAgICAgICAgICAgICAgICAgJnBSZXNpZHVhbC0+dG90YWxDb2VmZltibG9ja0luZGV4XSwKLSAgICAgICAgICAgICAgICAgICAgJnBQb3NDb2VmQnVmLAotICAgICAgICAgICAgICAgICAgICBuYywKLSAgICAgICAgICAgICAgICAgICAgMTUpOwotI2Vsc2UKLSAgICAgICAgICAgIG9teFJlcyA9ICBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcigKLSAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCAqKikgKCZwU3RybURhdGEtPnBTdHJtQ3VyclBvcyksCi0gICAgICAgICAgICAgICAgICAgIChPTVhfUzMyKikgKCZwU3RybURhdGEtPmJpdFBvc0luV29yZCksCi0gICAgICAgICAgICAgICAgICAgICZwUmVzaWR1YWwtPnRvdGFsQ29lZmZbYmxvY2tJbmRleF0sCi0gICAgICAgICAgICAgICAgICAgICZwUG9zQ29lZkJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgbmMsCi0gICAgICAgICAgICAgICAgICAgIDE1KTsKLSNlbmRpZgotICAgICAgICAgICAgaWYgKG9teFJlcyAhPSBPTVhfU3RzX05vRXJyKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLSNlbHNlCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERlY29kZVJlc2lkdWFsCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQYXJzZSByZXNpZHVhbCBpbmZvcm1hdGlvbiBmcm9tIGJpdCBzdHJlYW0gYW5kIHN0b3JlIGluICdwUmVzaWR1YWwnLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgRGVjb2RlUmVzaWR1YWwoc3RybURhdGFfdCAqcFN0cm1EYXRhLCByZXNpZHVhbF90ICpwUmVzaWR1YWwsCi0gICAgbWJTdG9yYWdlX3QgKnBNYiwgbWJUeXBlX2UgbWJUeXBlLCB1MzIgY29kZWRCbG9ja1BhdHRlcm4pCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGksIGosIHRtcDsKLSAgICBpMzIgbmM7Ci0gICAgdTMyIGJsb2NrQ29kZWQ7Ci0gICAgdTMyIGJsb2NrSW5kZXg7Ci0gICAgdTMyIGlzMTZ4MTY7Ci0gICAgaTMyICgqbGV2ZWwpWzE2XTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBSZXNpZHVhbCk7Ci0KLSAgICBsZXZlbCA9IHBSZXNpZHVhbC0+bGV2ZWw7Ci0KLSAgICAvKiBsdW1hIERDIGlzIGF0IGluZGV4IDI0ICovCi0gICAgaWYgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShtYlR5cGUpID09IFBSRURfTU9ERV9JTlRSQTE2eDE2KQotICAgIHsKLSAgICAgICAgbmMgPSAoaTMyKURldGVybWluZU5jKHBNYiwgMCwgcFJlc2lkdWFsLT50b3RhbENvZWZmKTsKLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZVJlc2lkdWFsQmxvY2tDYXZsYyhwU3RybURhdGEsIGxldmVsWzI0XSwgbmMsIDE2KTsKLSAgICAgICAgaWYgKCh0bXAgJiAweEYpICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICBwUmVzaWR1YWwtPnRvdGFsQ29lZmZbMjRdID0gKHRtcCA+PiA0KSAmIDB4RkY7Ci0gICAgICAgIGlzMTZ4MTYgPSBIQU5UUk9fVFJVRTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBpczE2eDE2ID0gSEFOVFJPX0ZBTFNFOwotCi0gICAgZm9yIChpID0gNCwgYmxvY2tJbmRleCA9IDA7IGktLTspCi0gICAgewotICAgICAgICAvKiBsdW1hIGNicCBpbiBiaXRzIDAtMyAqLwotICAgICAgICBibG9ja0NvZGVkID0gY29kZWRCbG9ja1BhdHRlcm4gJiAweDE7Ci0gICAgICAgIGNvZGVkQmxvY2tQYXR0ZXJuID4+PSAxOwotICAgICAgICBpZiAoYmxvY2tDb2RlZCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChqID0gNDsgai0tOyBibG9ja0luZGV4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmMgPSAoaTMyKURldGVybWluZU5jKHBNYiwgYmxvY2tJbmRleCwgcFJlc2lkdWFsLT50b3RhbENvZWZmKTsKLSAgICAgICAgICAgICAgICBpZiAoaXMxNngxNikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVSZXNpZHVhbEJsb2NrQ2F2bGMocFN0cm1EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxbYmxvY2tJbmRleF0gKyAxLCBuYywgMTUpOwotICAgICAgICAgICAgICAgICAgICBwUmVzaWR1YWwtPmNvZWZmTWFwW2Jsb2NrSW5kZXhdID0gdG1wID4+IDE1OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlUmVzaWR1YWxCbG9ja0NhdmxjKHBTdHJtRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsW2Jsb2NrSW5kZXhdLCBuYywgMTYpOwotICAgICAgICAgICAgICAgICAgICBwUmVzaWR1YWwtPmNvZWZmTWFwW2Jsb2NrSW5kZXhdID0gdG1wID4+IDE2OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoKHRtcCAmIDB4RikgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgICAgICAgICBwUmVzaWR1YWwtPnRvdGFsQ29lZmZbYmxvY2tJbmRleF0gPSAodG1wID4+IDQpICYgMHhGRjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBibG9ja0luZGV4ICs9IDQ7Ci0gICAgfQotCi0gICAgLyogY2hyb21hIERDIGJsb2NrIGFyZSBhdCBpbmRpY2VzIDI1IGFuZCAyNiAqLwotICAgIGJsb2NrQ29kZWQgPSBjb2RlZEJsb2NrUGF0dGVybiAmIDB4MzsKLSAgICBpZiAoYmxvY2tDb2RlZCkKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVSZXNpZHVhbEJsb2NrQ2F2bGMocFN0cm1EYXRhLCBsZXZlbFsyNV0sIC0xLCA0KTsKLSAgICAgICAgaWYgKCh0bXAgJiAweEYpICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICBwUmVzaWR1YWwtPnRvdGFsQ29lZmZbMjVdID0gKHRtcCA+PiA0KSAmIDB4RkY7Ci0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVSZXNpZHVhbEJsb2NrQ2F2bGMocFN0cm1EYXRhLCBsZXZlbFsyNV0rNCwgLTEsIDQpOwotICAgICAgICBpZiAoKHRtcCAmIDB4RikgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgIHBSZXNpZHVhbC0+dG90YWxDb2VmZlsyNl0gPSAodG1wID4+IDQpICYgMHhGRjsKLSAgICB9Ci0KLSAgICAvKiBjaHJvbWEgQUMgKi8KLSAgICBibG9ja0NvZGVkID0gY29kZWRCbG9ja1BhdHRlcm4gJiAweDI7Ci0gICAgaWYgKGJsb2NrQ29kZWQpCi0gICAgewotICAgICAgICBmb3IgKGkgPSA4OyBpLS07YmxvY2tJbmRleCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBuYyA9IChpMzIpRGV0ZXJtaW5lTmMocE1iLCBibG9ja0luZGV4LCBwUmVzaWR1YWwtPnRvdGFsQ29lZmYpOwotICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZVJlc2lkdWFsQmxvY2tDYXZsYyhwU3RybURhdGEsCi0gICAgICAgICAgICAgICAgbGV2ZWxbYmxvY2tJbmRleF0gKyAxLCBuYywgMTUpOwotICAgICAgICAgICAgaWYgKCh0bXAgJiAweEYpICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgICAgIHBSZXNpZHVhbC0+dG90YWxDb2VmZltibG9ja0luZGV4XSA9ICh0bXAgPj4gNCkgJiAweEZGOwotICAgICAgICAgICAgcFJlc2lkdWFsLT5jb2VmZk1hcFtibG9ja0luZGV4XSA9ICh0bXAgPj4gMTUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERldGVybWluZU5jCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBSZXR1cm5zIHRoZSBuQyBvZiBhIGJsb2NrLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmZGVmIEgyNjRERUNfT01YREwKLXUzMiBEZXRlcm1pbmVOYyhtYlN0b3JhZ2VfdCAqcE1iLCB1MzIgYmxvY2tJbmRleCwgdTggKnBUb3RhbENvZWZmKQotI2Vsc2UKLXUzMiBEZXRlcm1pbmVOYyhtYlN0b3JhZ2VfdCAqcE1iLCB1MzIgYmxvY2tJbmRleCwgaTE2ICpwVG90YWxDb2VmZikKLSNlbmRpZgotewotLypsaW50IC1lNzAyICovCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXA7Ci0gICAgaTMyIG47Ci0gICAgY29uc3QgbmVpZ2hib3VyX3QgKm5laWdoYm91ckEsICpuZWlnaGJvdXJCOwotICAgIHU4IG5laWdoYm91ckFpbmRleCwgbmVpZ2hib3VyQmluZGV4OwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoYmxvY2tJbmRleCA8IDI0KTsKLQotICAgIC8qIGlmIG5laWdoYm91ciBibG9jayBiZWxvbmdzIHRvIGN1cnJlbnQgbWFjcm9ibG9jayB0b3RhbENvZWZmIGFycmF5Ci0gICAgICogbWJTdG9yYWdlIGhhcyBub3QgYmVlbiBzZXQvdXBkYXRlZCB5ZXQgLT4gdXNlIHBUb3RhbENvZWZmICovCi0gICAgbmVpZ2hib3VyQSA9IGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0EoYmxvY2tJbmRleCk7Ci0gICAgbmVpZ2hib3VyQiA9IGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0IoYmxvY2tJbmRleCk7Ci0gICAgbmVpZ2hib3VyQWluZGV4ID0gbmVpZ2hib3VyQS0+aW5kZXg7Ci0gICAgbmVpZ2hib3VyQmluZGV4ID0gbmVpZ2hib3VyQi0+aW5kZXg7Ci0gICAgaWYgKG5laWdoYm91ckEtPm1iID09IE1CX0NVUlIgJiYgbmVpZ2hib3VyQi0+bWIgPT0gTUJfQ1VSUikKLSAgICB7Ci0gICAgICAgIG4gPSAocFRvdGFsQ29lZmZbbmVpZ2hib3VyQWluZGV4XSArCi0gICAgICAgICAgICAgcFRvdGFsQ29lZmZbbmVpZ2hib3VyQmluZGV4XSArIDEpPj4xOwotICAgIH0KLSAgICBlbHNlIGlmIChuZWlnaGJvdXJBLT5tYiA9PSBNQl9DVVJSKQotICAgIHsKLSAgICAgICAgbiA9IHBUb3RhbENvZWZmW25laWdoYm91ckFpbmRleF07Ci0gICAgICAgIGlmIChoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBwTWItPm1iQikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG4gPSAobiArIHBNYi0+bWJCLT50b3RhbENvZWZmW25laWdoYm91ckJpbmRleF0gKyAxKSA+PiAxOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKG5laWdoYm91ckItPm1iID09IE1CX0NVUlIpCi0gICAgewotICAgICAgICBuID0gcFRvdGFsQ29lZmZbbmVpZ2hib3VyQmluZGV4XTsKLSAgICAgICAgaWYgKGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIHBNYi0+bWJBKSkKLSAgICAgICAgewotICAgICAgICAgICAgbiA9IChuICsgcE1iLT5tYkEtPnRvdGFsQ29lZmZbbmVpZ2hib3VyQWluZGV4XSArIDEpID4+IDE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgbiA9IHRtcCA9IDA7Ci0gICAgICAgIGlmIChoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBwTWItPm1iQSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG4gPSBwTWItPm1iQS0+dG90YWxDb2VmZltuZWlnaGJvdXJBaW5kZXhdOwotICAgICAgICAgICAgdG1wID0gMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgcE1iLT5tYkIpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodG1wKQotICAgICAgICAgICAgICAgIG4gPSAobiArIHBNYi0+bWJCLT50b3RhbENvZWZmW25laWdoYm91ckJpbmRleF0gKyAxKSA+PiAxOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG4gPSBwTWItPm1iQi0+dG90YWxDb2VmZltuZWlnaGJvdXJCaW5kZXhdOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybigodTMyKW4pOwotLypsaW50ICtlNzAyICovCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogQ2JwSW50cmExNngxNgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUmV0dXJucyB0aGUgY29kZWQgYmxvY2sgcGF0dGVybiBmb3IgaW50cmEgMTZ4MTYgbWFjcm9ibG9jay4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIENicEludHJhMTZ4MTYobWJUeXBlX2UgbWJUeXBlKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBjYnA7Ci0gICAgdTMyIHRtcDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKG1iVHlwZSA+PSBJXzE2eDE2XzBfMF8wICYmIG1iVHlwZSA8PSBJXzE2eDE2XzNfMl8xKTsKLQotICAgIGlmIChtYlR5cGUgPj0gSV8xNngxNl8wXzBfMSkKLSAgICAgICAgY2JwID0gMTU7Ci0gICAgZWxzZQotICAgICAgICBjYnAgPSAwOwotCi0gICAgLyogdG1wIGlzIDAgZm9yIElfMTZ4MTZfMF8wXzAgbWIgdHlwZSAqLwotICAgIC8qIGlnbm9yZSBsaW50IHdhcm5pbmcgb24gYXJpdGhtZXRpYyBvbiBlbnVtJ3MgKi8KLSAgICB0bXAgPSAvKmxpbnQgLWUoNjU2KSovKG1iVHlwZSAtIElfMTZ4MTZfMF8wXzApID4+IDI7Ci0gICAgaWYgKHRtcCA+IDIpCi0gICAgICAgIHRtcCAtPSAzOwotCi0gICAgY2JwICs9IHRtcCA8PCA0OwotCi0gICAgcmV0dXJuKGNicCk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkUHJlZE1vZGVJbnRyYTE2eDE2Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBSZXR1cm5zIHRoZSBwcmVkaWN0aW9uIG1vZGUgZm9yIGludHJhIDE2eDE2IG1hY3JvYmxvY2suCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkUHJlZE1vZGVJbnRyYTE2eDE2KG1iVHlwZV9lIG1iVHlwZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQobWJUeXBlID49IElfMTZ4MTZfMF8wXzAgJiYgbWJUeXBlIDw9IElfMTZ4MTZfM18yXzEpOwotCi0gICAgLyogdG1wIGlzIDAgZm9yIElfMTZ4MTZfMF8wXzAgbWIgdHlwZSAqLwotICAgIC8qIGlnbm9yZSBsaW50IHdhcm5pbmcgb24gYXJpdGhtZXRpYyBvbiBlbnVtJ3MgKi8KLSAgICB0bXAgPSAvKmxpbnQgLWUoNjU2KSovKG1iVHlwZSAtIElfMTZ4MTZfMF8wXzApOwotCi0gICAgcmV0dXJuKHRtcCAmIDB4Myk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkRGVjb2RlTWFjcm9ibG9jawotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgRGVjb2RlIG9uZSBtYWNyb2Jsb2NrIGFuZCB3cml0ZSBpbnRvIG91dHB1dCBpbWFnZS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgcE1iICAgICAgICAgICBwb2ludGVyIHRvIG1hY3JvYmxvY2sgc3BlY2lmaWMgaW5mb3JtYXRpb24KLSAgICAgICAgICBtYkxheWVyICAgICAgIHBvaW50ZXIgdG8gY3VycmVudCBtYWNyb2Jsb2NrIGRhdGEgZnJvbSBzdHJlYW0KLSAgICAgICAgICBjdXJySW1hZ2UgICAgIHBvaW50ZXIgdG8gb3V0cHV0IGltYWdlCi0gICAgICAgICAgZHBiICAgICAgICAgICBwb2ludGVyIHRvIGRlY29kZWQgcGljdHVyZSBidWZmZXIKLSAgICAgICAgICBxcFkgICAgICAgICAgIHBvaW50ZXIgdG8gc2xpY2UgUVAKLSAgICAgICAgICBtYk51bSAgICAgICAgIGN1cnJlbnQgbWFjcm9ibG9jayBudW1iZXIKLSAgICAgICAgICBjb25zdHJhaW5lZEludHJhUHJlZCAgZmxhZyBzcGVjaWZ5aW5nIGlmIG5laWdoYm91cmluZyBpbnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrcyBhcmUgdXNlZCBpbiBpbnRyYSBwcmVkaWN0aW9uCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICBwTWIgICAgICAgICAgIHN0cnVjdHVyZSBpcyB1cGRhdGVkIHdpdGggY3VycmVudCBtYWNyb2Jsb2NrCi0gICAgICAgICAgY3VyckltYWdlICAgICBkZWNvZGVkIG1hY3JvYmxvY2sgaXMgd3JpdHRlbiBpbnRvIG91dHB1dCBpbWFnZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgSEFOVFJPX09LICAgICBzdWNjZXNzCi0gICAgICAgICAgSEFOVFJPX05PSyAgICBlcnJvciBpbiBtYWNyb2Jsb2NrIGRlY29kaW5nCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkRGVjb2RlTWFjcm9ibG9jayhtYlN0b3JhZ2VfdCAqcE1iLCBtYWNyb2Jsb2NrTGF5ZXJfdCAqcE1iTGF5ZXIsCi0gICAgaW1hZ2VfdCAqY3VyckltYWdlLCBkcGJTdG9yYWdlX3QgKmRwYiwgaTMyICpxcFksIHUzMiBtYk51bSwKLSAgICB1MzIgY29uc3RyYWluZWRJbnRyYVByZWRGbGFnLCB1OCogZGF0YSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaSwgdG1wOwotICAgIG1iVHlwZV9lIG1iVHlwZTsKLSNpZmRlZiBIMjY0REVDX09NWERMCi0gICAgY29uc3QgdTggKnBTcmM7Ci0jZW5kaWYKLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwTWIpOwotICAgIEFTU0VSVChwTWJMYXllcik7Ci0gICAgQVNTRVJUKGN1cnJJbWFnZSk7Ci0gICAgQVNTRVJUKHFwWSAmJiAqcXBZIDwgNTIpOwotICAgIEFTU0VSVChtYk51bSA8IGN1cnJJbWFnZS0+d2lkdGgqY3VyckltYWdlLT5oZWlnaHQpOwotCi0gICAgbWJUeXBlID0gcE1iTGF5ZXItPm1iVHlwZTsKLSAgICBwTWItPm1iVHlwZSA9IG1iVHlwZTsKLQotICAgIHBNYi0+ZGVjb2RlZCsrOwotCi0gICAgaDI2NGJzZFNldEN1cnJJbWFnZU1iUG9pbnRlcnMoY3VyckltYWdlLCBtYk51bSk7Ci0KLSAgICBpZiAobWJUeXBlID09IElfUENNKQotICAgIHsKLSAgICAgICAgdTggKnBEYXRhID0gKHU4KilkYXRhOwotI2lmZGVmIEgyNjRERUNfT01YREwKLSAgICAgICAgdTggKnRvdCA9IHBNYi0+dG90YWxDb2VmZjsKLSNlbHNlCi0gICAgICAgIGkxNiAqdG90ID0gcE1iLT50b3RhbENvZWZmOwotI2VuZGlmCi0gICAgICAgIGkzMiAqbGV2ID0gcE1iTGF5ZXItPnJlc2lkdWFsLmxldmVsWzBdOwotCi0gICAgICAgIHBNYi0+cXBZID0gMDsKLQotICAgICAgICAvKiBpZiBkZWNvZGVkIGZsYWcgPiAxIC0+IG1iIGhhcyBhbHJlYWR5IGJlZW4gc3VjY2Vzc2Z1bGx5IGRlY29kZWQgYW5kCi0gICAgICAgICAqIHdyaXR0ZW4gdG8gb3V0cHV0IC0+IGRvIG5vdCB3cml0ZSBhZ2FpbiAqLwotICAgICAgICBpZiAocE1iLT5kZWNvZGVkID4gMSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpID0gMjQ7IGktLTspCi0gICAgICAgICAgICAgICAgKnRvdCsrID0gMTY7Ci0gICAgICAgICAgICByZXR1cm4gSEFOVFJPX09LOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpID0gMjQ7IGktLTspCi0gICAgICAgIHsKLSAgICAgICAgICAgICp0b3QrKyA9IDE2OwotICAgICAgICAgICAgZm9yICh0bXAgPSAxNjsgdG1wLS07KQotICAgICAgICAgICAgICAgICpwRGF0YSsrID0gKHU4KSgqbGV2KyspOwotICAgICAgICB9Ci0gICAgICAgIGgyNjRic2RXcml0ZU1hY3JvYmxvY2soY3VyckltYWdlLCAodTgqKWRhdGEpOwotCi0gICAgICAgIHJldHVybihIQU5UUk9fT0spOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotI2lmZGVmIEgyNjRERUNfT01YREwKLSAgICAgICAgaWYgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShtYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikKLSAgICAgICAgewotICAgICAgICAgICAgdG1wID0gaDI2NGJzZEludGVyUHJlZGljdGlvbihwTWIsIHBNYkxheWVyLCBkcGIsIG1iTnVtLAotICAgICAgICAgICAgICAgIGN1cnJJbWFnZSwgKHU4KilkYXRhKTsKLSAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKSByZXR1cm4gKHRtcCk7Ci0gICAgICAgIH0KLSNlbmRpZgotICAgICAgICBpZiAobWJUeXBlICE9IFBfU2tpcCkKLSAgICAgICAgewotICAgICAgICAgICAgSDI2NFN3RGVjTWVtY3B5KHBNYi0+dG90YWxDb2VmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWJMYXllci0+cmVzaWR1YWwudG90YWxDb2VmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNypzaXplb2YoKnBNYi0+dG90YWxDb2VmZikpOwotCi0gICAgICAgICAgICAvKiB1cGRhdGUgcXBZICovCi0gICAgICAgICAgICBpZiAocE1iTGF5ZXItPm1iUXBEZWx0YSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqcXBZID0gKnFwWSArIHBNYkxheWVyLT5tYlFwRGVsdGE7Ci0gICAgICAgICAgICAgICAgaWYgKCpxcFkgPCAwKSAqcXBZICs9IDUyOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCpxcFkgPj0gNTIpICpxcFkgLT0gNTI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwTWItPnFwWSA9ICh1MzIpKnFwWTsKLQotI2lmZGVmIEgyNjRERUNfT01YREwKLSAgICAgICAgICAgIHBTcmMgPSBwTWJMYXllci0+cmVzaWR1YWwucG9zQ29lZkJ1ZjsKLQotICAgICAgICAgICAgaWYgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShtYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBPTVhSZXN1bHQgcmVzOwotICAgICAgICAgICAgICAgIHU4ICpwOwotICAgICAgICAgICAgICAgIHU4ICp0b3RhbENvZWZmID0gcE1iLT50b3RhbENvZWZmOwotCi0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyssIHRvdGFsQ29lZmYrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHAgPSBkYXRhICsgbHVtYUluZGV4W2ldOwotICAgICAgICAgICAgICAgICAgICBpZiAoKnRvdGFsQ29lZmYpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwU3JjLCBwLCAwLCBwLCAxNiwgMTYsICpxcFksICp0b3RhbENvZWZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT01YX1N0c19Ob0VycikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobWJUeXBlKSA9PSBQUkVEX01PREVfSU5UUkE0eDQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG1wID0gUHJvY2Vzc0ludHJhNHg0UmVzaWR1YWwocE1iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RyYWluZWRJbnRyYVByZWRGbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYkxheWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwU3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJJbWFnZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAodG1wKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShtYlR5cGUpID09IFBSRURfTU9ERV9JTlRSQTE2eDE2KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRtcCA9IFByb2Nlc3NJbnRyYTE2eDE2UmVzaWR1YWwocE1iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RyYWluZWRJbnRyYVByZWRGbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYkxheWVyLT5tYlByZWQuaW50cmFDaHJvbWFQcmVkTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJySW1hZ2UpOwotICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRtcCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRtcCA9IFByb2Nlc3NDaHJvbWFSZXNpZHVhbChwTWIsIGRhdGEsICZwU3JjKTsKLQotI2Vsc2UKLSAgICAgICAgICAgIHRtcCA9IFByb2Nlc3NSZXNpZHVhbChwTWIsIHBNYkxheWVyLT5yZXNpZHVhbC5sZXZlbCwKLSAgICAgICAgICAgICAgICBwTWJMYXllci0+cmVzaWR1YWwuY29lZmZNYXApOwotI2VuZGlmCi0gICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4gKHRtcCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBIMjY0U3dEZWNNZW1zZXQocE1iLT50b3RhbENvZWZmLCAwLCAyNypzaXplb2YoKnBNYi0+dG90YWxDb2VmZikpOwotICAgICAgICAgICAgcE1iLT5xcFkgPSAodTMyKSpxcFk7Ci0gICAgICAgIH0KLSNpZmRlZiBIMjY0REVDX09NWERMCi0gICAgICAgIC8qIGlmIGRlY29kZWQgZmxhZyA+IDEgLT4gbWIgaGFzIGFscmVhZHkgYmVlbiBzdWNjZXNzZnVsbHkgZGVjb2RlZCBhbmQKLSAgICAgICAgICogd3JpdHRlbiB0byBvdXRwdXQgLT4gZG8gbm90IHdyaXRlIGFnYWluICovCi0gICAgICAgIGlmIChwTWItPmRlY29kZWQgPiAxKQotICAgICAgICAgICAgcmV0dXJuIEhBTlRST19PSzsKLQotICAgICAgICBoMjY0YnNkV3JpdGVNYWNyb2Jsb2NrKGN1cnJJbWFnZSwgZGF0YSk7Ci0jZWxzZQotICAgICAgICBpZiAoaDI2NGJzZE1iUGFydFByZWRNb2RlKG1iVHlwZSkgIT0gUFJFRF9NT0RFX0lOVEVSKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkSW50cmFQcmVkaWN0aW9uKHBNYiwgcE1iTGF5ZXIsIGN1cnJJbWFnZSwgbWJOdW0sCi0gICAgICAgICAgICAgICAgY29uc3RyYWluZWRJbnRyYVByZWRGbGFnLCAodTgqKWRhdGEpOwotICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spIHJldHVybiAodG1wKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2RJbnRlclByZWRpY3Rpb24ocE1iLCBwTWJMYXllciwgZHBiLCBtYk51bSwKLSAgICAgICAgICAgICAgICBjdXJySW1hZ2UsICh1OCopZGF0YSk7Ci0gICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykgcmV0dXJuICh0bXApOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICB9Ci0KLSAgICByZXR1cm4gSEFOVFJPX09LOwotfQotCi0KLSNpZmRlZiBIMjY0REVDX09NWERMCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogUHJvY2Vzc0Nocm9tYVJlc2lkdWFsCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQcm9jZXNzIHRoZSByZXNpZHVhbCBkYXRhIG9mIGNocm9tYSB3aXRoCi0gICAgICAgICAgaW52ZXJzZSBxdWFudGl6YXRpb24gYW5kIGludmVyc2UgdHJhbnNmb3JtLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdTMyIFByb2Nlc3NDaHJvbWFSZXNpZHVhbChtYlN0b3JhZ2VfdCAqcE1iLCB1OCAqZGF0YSwgY29uc3QgdTggKipwU3JjICkKLXsKLSAgICB1MzIgaTsKLSAgICB1MzIgY2hyb21hUXA7Ci0gICAgaTE2ICpwRGM7Ci0gICAgaTE2IGRjWzQgKyA0XSA9IHswLDAsMCwwLDAsMCwwLDB9OwotICAgIHU4ICp0b3RhbENvZWZmOwotICAgIE9NWFJlc3VsdCByZXN1bHQ7Ci0gICAgdTggKnA7Ci0KLSAgICAvKiBjaHJvbWEgREMgcHJvY2Vzc2luZy4gRmlyc3QgY2hyb21hIGRjIGJsb2NrIGlzIGJsb2NrIHdpdGggaW5kZXggMjUgKi8KLSAgICBjaHJvbWFRcCA9Ci0gICAgICAgIGgyNjRic2RRcENbQ0xJUDMoMCwgNTEsIChpMzIpcE1iLT5xcFkgKyBwTWItPmNocm9tYVFwSW5kZXhPZmZzZXQpXTsKLQotICAgIGlmIChwTWItPnRvdGFsQ29lZmZbMjVdKQotICAgIHsKLSAgICAgICAgcERjID0gZGM7Ci0gICAgICAgIHJlc3VsdCA9IG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIoCi0gICAgICAgICAgICAgICAgcFNyYywKLSAgICAgICAgICAgICAgICBwRGMsCi0gICAgICAgICAgICAgICAgKGkzMiljaHJvbWFRcCk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gT01YX1N0c19Ob0VycikKLSAgICAgICAgICAgIHJldHVybiAoSEFOVFJPX05PSyk7Ci0gICAgfQotICAgIGlmIChwTWItPnRvdGFsQ29lZmZbMjZdKQotICAgIHsKLSAgICAgICAgcERjID0gZGMrNDsKLSAgICAgICAgcmVzdWx0ID0gb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcigKLSAgICAgICAgICAgICAgICBwU3JjLAotICAgICAgICAgICAgICAgIHBEYywKLSAgICAgICAgICAgICAgICAoaTMyKWNocm9tYVFwKTsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBPTVhfU3RzX05vRXJyKQotICAgICAgICAgICAgcmV0dXJuIChIQU5UUk9fTk9LKTsKLSAgICB9Ci0KLSAgICBwRGMgPSBkYzsKLSAgICB0b3RhbENvZWZmID0gcE1iLT50b3RhbENvZWZmICsgMTY7Ci0gICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKywgcERjKyssIHRvdGFsQ29lZmYrKykKLSAgICB7Ci0gICAgICAgIC8qIGNocm9tYSBwcmVkaWN0aW9uICovCi0gICAgICAgIGlmICgqdG90YWxDb2VmZiB8fCAqcERjKQotICAgICAgICB7Ci0gICAgICAgICAgICBwID0gZGF0YSArIGNocm9tYUluZGV4W2ldOwotICAgICAgICAgICAgcmVzdWx0ID0gb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCgKLSAgICAgICAgICAgICAgICAgICAgcFNyYywKLSAgICAgICAgICAgICAgICAgICAgcCwKLSAgICAgICAgICAgICAgICAgICAgcERjLAotICAgICAgICAgICAgICAgICAgICBwLAotICAgICAgICAgICAgICAgICAgICA4LAotICAgICAgICAgICAgICAgICAgICA4LAotICAgICAgICAgICAgICAgICAgICAoaTMyKWNocm9tYVFwLAotICAgICAgICAgICAgICAgICAgICAqdG90YWxDb2VmZik7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IE9NWF9TdHNfTm9FcnIpCi0gICAgICAgICAgICAgICAgcmV0dXJuIChIQU5UUk9fTk9LKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IFByb2Nlc3NJbnRyYTE2eDE2UmVzaWR1YWwKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFByb2Nlc3MgdGhlIHJlc2lkdWFsIGRhdGEgb2YgbHVtYSB3aXRoCi0gICAgICAgICAgaW52ZXJzZSBxdWFudGl6YXRpb24gYW5kIGludmVyc2UgdHJhbnNmb3JtLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdTMyIFByb2Nlc3NJbnRyYTE2eDE2UmVzaWR1YWwobWJTdG9yYWdlX3QgKnBNYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4ICpkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIGludHJhQ2hyb21hUHJlZE1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1OCoqIHBTcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZV90ICppbWFnZSkKLXsKLSAgICB1MzIgaTsKLSAgICBpMTYgKnBEYzsKLSAgICBpMTYgZGNbMTZdID0gezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9OwotICAgIHU4ICp0b3RhbENvZWZmOwotICAgIE9NWFJlc3VsdCByZXN1bHQ7Ci0gICAgdTggKnA7Ci0KLSAgICB0b3RhbENvZWZmID0gcE1iLT50b3RhbENvZWZmOwotCi0gICAgaWYgKHRvdGFsQ29lZmZbMjRdKQotICAgIHsKLSAgICAgICAgcERjID0gZGM7Ci0gICAgICAgIHJlc3VsdCA9IG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyKAotICAgICAgICAgICAgICAgICAgICBwU3JjLAotICAgICAgICAgICAgICAgICAgICBwRGMsCi0gICAgICAgICAgICAgICAgICAgIChpMzIpcE1iLT5xcFkpOwotICAgICAgICBpZiAocmVzdWx0ICE9IE9NWF9TdHNfTm9FcnIpCi0gICAgICAgICAgICByZXR1cm4gKEhBTlRST19OT0spOwotICAgIH0KLSAgICAvKiBJbnRyYSAxNngxNiBwcmVkICovCi0gICAgaWYgKGgyNjRic2RJbnRyYTE2eDE2UHJlZGljdGlvbihwTWIsIGRhdGEsIGltYWdlLT5sdW1hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLT53aWR0aCoxNiwgY29uc3RyYWluZWRJbnRyYVByZWQpICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrLCB0b3RhbENvZWZmKyspCi0gICAgewotICAgICAgICBwID0gZGF0YSArIGx1bWFJbmRleFtpXTsKLSAgICAgICAgcERjID0gJmRjW2RjQ29lZmZJbmRleFtpXV07Ci0gICAgICAgIGlmICgqdG90YWxDb2VmZiB8fCAqcERjKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkKAotICAgICAgICAgICAgICAgICAgICBwU3JjLAotICAgICAgICAgICAgICAgICAgICBwLAotICAgICAgICAgICAgICAgICAgICBwRGMsCi0gICAgICAgICAgICAgICAgICAgIHAsCi0gICAgICAgICAgICAgICAgICAgIDE2LAotICAgICAgICAgICAgICAgICAgICAxNiwKLSAgICAgICAgICAgICAgICAgICAgKGkzMilwTWItPnFwWSwKLSAgICAgICAgICAgICAgICAgICAgKnRvdGFsQ29lZmYpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBPTVhfU3RzX05vRXJyKQotICAgICAgICAgICAgICAgIHJldHVybiAoSEFOVFJPX05PSyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoaDI2NGJzZEludHJhQ2hyb21hUHJlZGljdGlvbihwTWIsIGRhdGEgKyAyNTYsCi0gICAgICAgICAgICAgICAgaW1hZ2UsCi0gICAgICAgICAgICAgICAgaW50cmFDaHJvbWFQcmVkTW9kZSwKLSAgICAgICAgICAgICAgICBjb25zdHJhaW5lZEludHJhUHJlZCkgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICByZXR1cm4gSEFOVFJPX09LOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IFByb2Nlc3NJbnRyYTR4NFJlc2lkdWFsCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQcm9jZXNzIHRoZSByZXNpZHVhbCBkYXRhIG9mIGx1bWEgd2l0aAotICAgICAgICAgIGludmVyc2UgcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIHRyYW5zZm9ybS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXUzMiBQcm9jZXNzSW50cmE0eDRSZXNpZHVhbChtYlN0b3JhZ2VfdCAqcE1iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4ICpkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrTGF5ZXJfdCAqbWJMYXllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqKnBTcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VfdCAqaW1hZ2UpCi17Ci0gICAgdTMyIGk7Ci0gICAgdTggKnRvdGFsQ29lZmY7Ci0gICAgT01YUmVzdWx0IHJlc3VsdDsKLSAgICB1OCAqcDsKLQotICAgIHRvdGFsQ29lZmYgPSBwTWItPnRvdGFsQ29lZmY7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKywgdG90YWxDb2VmZisrKQotICAgIHsKLSAgICAgICAgcCA9IGRhdGEgKyBsdW1hSW5kZXhbaV07Ci0gICAgICAgIGlmIChoMjY0YnNkSW50cmE0eDRQcmVkaWN0aW9uKHBNYiwgcCwgbWJMYXllciwgaW1hZ2UtPmx1bWEsCi0gICAgICAgICAgICAgICAgICAgIGltYWdlLT53aWR0aCoxNiwgY29uc3RyYWluZWRJbnRyYVByZWQsIGkpICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgICAgICBpZiAoKnRvdGFsQ29lZmYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQoCi0gICAgICAgICAgICAgICAgICAgIHBTcmMsCi0gICAgICAgICAgICAgICAgICAgIHAsCi0gICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgIHAsCi0gICAgICAgICAgICAgICAgICAgIDE2LAotICAgICAgICAgICAgICAgICAgICAxNiwKLSAgICAgICAgICAgICAgICAgICAgKGkzMilwTWItPnFwWSwKLSAgICAgICAgICAgICAgICAgICAgKnRvdGFsQ29lZmYpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBPTVhfU3RzX05vRXJyKQotICAgICAgICAgICAgICAgIHJldHVybiAoSEFOVFJPX05PSyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoaDI2NGJzZEludHJhQ2hyb21hUHJlZGljdGlvbihwTWIsIGRhdGEgKyAyNTYsCi0gICAgICAgICAgICAgICAgaW1hZ2UsCi0gICAgICAgICAgICAgICAgbWJMYXllci0+bWJQcmVkLmludHJhQ2hyb21hUHJlZE1vZGUsCi0gICAgICAgICAgICAgICAgY29uc3RyYWluZWRJbnRyYVByZWQpICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgcmV0dXJuIEhBTlRST19PSzsKLX0KLQotI2Vsc2UgLyogSDI2NERFQ19PTVhETCAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IFByb2Nlc3NSZXNpZHVhbAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUHJvY2VzcyB0aGUgcmVzaWR1YWwgZGF0YSBvZiBvbmUgbWFjcm9ibG9jayB3aXRoCi0gICAgICAgICAgaW52ZXJzZSBxdWFudGl6YXRpb24gYW5kIGludmVyc2UgdHJhbnNmb3JtLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgUHJvY2Vzc1Jlc2lkdWFsKG1iU3RvcmFnZV90ICpwTWIsIGkzMiByZXNpZHVhbExldmVsW11bMTZdLCB1MzIgKmNvZWZmTWFwKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpOwotICAgIHUzMiBjaHJvbWFRcDsKLSAgICBpMzIgKCpibG9ja0RhdGEpWzE2XTsKLSAgICBpMzIgKCpibG9ja0RjKVsxNl07Ci0gICAgaTE2ICp0b3RhbENvZWZmOwotICAgIGkzMiAqY2hyb21hRGM7Ci0gICAgY29uc3QgdTMyICpkY0NvZWZmSWR4OwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocE1iKTsKLSAgICBBU1NFUlQocmVzaWR1YWxMZXZlbCk7Ci0KLSAgICAvKiBzZXQgcG9pbnRlcnMgdG8gREMgY29lZmZpY2llbnQgYmxvY2tzICovCi0gICAgYmxvY2tEYyA9IHJlc2lkdWFsTGV2ZWwgKyAyNDsKLQotICAgIGJsb2NrRGF0YSA9IHJlc2lkdWFsTGV2ZWw7Ci0gICAgdG90YWxDb2VmZiA9IHBNYi0+dG90YWxDb2VmZjsKLSAgICBpZiAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5UUkExNngxNikKLSAgICB7Ci0gICAgICAgIGlmICh0b3RhbENvZWZmWzI0XSkKLSAgICAgICAgewotICAgICAgICAgICAgaDI2NGJzZFByb2Nlc3NMdW1hRGMoKmJsb2NrRGMsIHBNYi0+cXBZKTsKLSAgICAgICAgfQotICAgICAgICBkY0NvZWZmSWR4ID0gZGNDb2VmZkluZGV4OwotCi0gICAgICAgIGZvciAoaSA9IDE2OyBpLS07IGJsb2NrRGF0YSsrLCB0b3RhbENvZWZmKyssIGNvZWZmTWFwKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIHNldCBkYyBjb2VmZmljaWVudCBvZiBsdW1hIGJsb2NrICovCi0gICAgICAgICAgICAoKmJsb2NrRGF0YSlbMF0gPSAoKmJsb2NrRGMpWypkY0NvZWZmSWR4KytdOwotICAgICAgICAgICAgaWYgKCgqYmxvY2tEYXRhKVswXSB8fCAqdG90YWxDb2VmZikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoaDI2NGJzZFByb2Nlc3NCbG9jaygqYmxvY2tEYXRhLCBwTWItPnFwWSwgMSwgKmNvZWZmTWFwKSAhPQotICAgICAgICAgICAgICAgICAgICBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBNQVJLX1JFU0lEVUFMX0VNUFRZKCpibG9ja0RhdGEpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDE2OyBpLS07IGJsb2NrRGF0YSsrLCB0b3RhbENvZWZmKyssIGNvZWZmTWFwKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgqdG90YWxDb2VmZikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoaDI2NGJzZFByb2Nlc3NCbG9jaygqYmxvY2tEYXRhLCBwTWItPnFwWSwgMCwgKmNvZWZmTWFwKSAhPQotICAgICAgICAgICAgICAgICAgICBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBNQVJLX1JFU0lEVUFMX0VNUFRZKCpibG9ja0RhdGEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogY2hyb21hIERDIHByb2Nlc3NpbmcuIEZpcnN0IGNocm9tYSBkYyBibG9jayBpcyBibG9jayB3aXRoIGluZGV4IDI1ICovCi0gICAgY2hyb21hUXAgPQotICAgICAgICBoMjY0YnNkUXBDW0NMSVAzKDAsIDUxLCAoaTMyKXBNYi0+cXBZICsgcE1iLT5jaHJvbWFRcEluZGV4T2Zmc2V0KV07Ci0gICAgaWYgKHBNYi0+dG90YWxDb2VmZlsyNV0gfHwgcE1iLT50b3RhbENvZWZmWzI2XSkKLSAgICAgICAgaDI2NGJzZFByb2Nlc3NDaHJvbWFEYyhyZXNpZHVhbExldmVsWzI1XSwgY2hyb21hUXApOwotICAgIGNocm9tYURjID0gcmVzaWR1YWxMZXZlbFsyNV07Ci0gICAgZm9yIChpID0gODsgaS0tOyBibG9ja0RhdGErKywgdG90YWxDb2VmZisrLCBjb2VmZk1hcCsrKQotICAgIHsKLSAgICAgICAgLyogc2V0IGRjIGNvZWZmaWNpZW50IG9mIGNocm9tYSBibG9jayAqLwotICAgICAgICAoKmJsb2NrRGF0YSlbMF0gPSAqY2hyb21hRGMrKzsKLSAgICAgICAgaWYgKCgqYmxvY2tEYXRhKVswXSB8fCAqdG90YWxDb2VmZikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGgyNjRic2RQcm9jZXNzQmxvY2soKmJsb2NrRGF0YSwgY2hyb21hUXAsIDEsKmNvZWZmTWFwKSAhPQotICAgICAgICAgICAgICAgIEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgTUFSS19SRVNJRFVBTF9FTVBUWSgqYmxvY2tEYXRhKTsKLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLX0KLSNlbmRpZiAvKiBIMjY0REVDX09NWERMICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZFN1Yk1iUGFydE1vZGUKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFJldHVybnMgdGhlIG1hY3JvYmxvY2sncyBzdWItcGFydGl0aW9uIG1vZGUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN1Yk1iUGFydE1vZGVfZSBoMjY0YnNkU3ViTWJQYXJ0TW9kZShzdWJNYlR5cGVfZSBzdWJNYlR5cGUpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChzdWJNYlR5cGUgPCA0KTsKLQotICAgIHJldHVybigoc3ViTWJQYXJ0TW9kZV9lKXN1Yk1iVHlwZSk7Ci0KLX0KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbWFjcm9ibG9ja19sYXllci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX21hY3JvYmxvY2tfbGF5ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJiYzM0MC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbWFjcm9ibG9ja19sYXllci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0gICAgMy4gRGF0YSB0eXBlcwotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBIMjY0U1dERUNfTUFDUk9CTE9DS19MQVlFUl9ICi0jZGVmaW5lIEgyNjRTV0RFQ19NQUNST0JMT0NLX0xBWUVSX0gKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9pbWFnZS5oIgotI2luY2x1ZGUgImgyNjRic2RfZHBiLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIE1hY3JvIHRvIGRldGVybWluZSBpZiBhIG1iIGlzIGFuIGludHJhIG1iICovCi0jZGVmaW5lIElTX0lOVFJBX01CKGEpICgoYSkubWJUeXBlID4gNSkKLQotLyogTWFjcm8gdG8gZGV0ZXJtaW5lIGlmIGEgbWIgaXMgYW4gSV9QQ00gbWIgKi8KLSNkZWZpbmUgSVNfSV9QQ01fTUIoYSkgKChhKS5tYlR5cGUgPT0gMzEpCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgUF9Ta2lwICAgICAgICAgID0gMCwKLSAgICBQX0wwXzE2eDE2ICAgICAgPSAxLAotICAgIFBfTDBfTDBfMTZ4OCAgICA9IDIsCi0gICAgUF9MMF9MMF84eDE2ICAgID0gMywKLSAgICBQXzh4OCAgICAgICAgICAgPSA0LAotICAgIFBfOHg4cmVmMCAgICAgICA9IDUsCi0gICAgSV80eDQgICAgICAgICAgID0gNiwKLSAgICBJXzE2eDE2XzBfMF8wICAgPSA3LAotICAgIElfMTZ4MTZfMV8wXzAgICA9IDgsCi0gICAgSV8xNngxNl8yXzBfMCAgID0gOSwKLSAgICBJXzE2eDE2XzNfMF8wICAgPSAxMCwKLSAgICBJXzE2eDE2XzBfMV8wICAgPSAxMSwKLSAgICBJXzE2eDE2XzFfMV8wICAgPSAxMiwKLSAgICBJXzE2eDE2XzJfMV8wICAgPSAxMywKLSAgICBJXzE2eDE2XzNfMV8wICAgPSAxNCwKLSAgICBJXzE2eDE2XzBfMl8wICAgPSAxNSwKLSAgICBJXzE2eDE2XzFfMl8wICAgPSAxNiwKLSAgICBJXzE2eDE2XzJfMl8wICAgPSAxNywKLSAgICBJXzE2eDE2XzNfMl8wICAgPSAxOCwKLSAgICBJXzE2eDE2XzBfMF8xICAgPSAxOSwKLSAgICBJXzE2eDE2XzFfMF8xICAgPSAyMCwKLSAgICBJXzE2eDE2XzJfMF8xICAgPSAyMSwKLSAgICBJXzE2eDE2XzNfMF8xICAgPSAyMiwKLSAgICBJXzE2eDE2XzBfMV8xICAgPSAyMywKLSAgICBJXzE2eDE2XzFfMV8xICAgPSAyNCwKLSAgICBJXzE2eDE2XzJfMV8xICAgPSAyNSwKLSAgICBJXzE2eDE2XzNfMV8xICAgPSAyNiwKLSAgICBJXzE2eDE2XzBfMl8xICAgPSAyNywKLSAgICBJXzE2eDE2XzFfMl8xICAgPSAyOCwKLSAgICBJXzE2eDE2XzJfMl8xICAgPSAyOSwKLSAgICBJXzE2eDE2XzNfMl8xICAgPSAzMCwKLSAgICBJX1BDTSAgICAgICAgICAgPSAzMQotfSBtYlR5cGVfZTsKLQotdHlwZWRlZiBlbnVtIHsKLSAgICBQX0wwXzh4OCA9IDAsCi0gICAgUF9MMF84eDQgPSAxLAotICAgIFBfTDBfNHg4ID0gMiwKLSAgICBQX0wwXzR4NCA9IDMKLX0gc3ViTWJUeXBlX2U7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gICAgTUJfUF8xNngxNiA9IDAsCi0gICAgTUJfUF8xNng4LAotICAgIE1CX1BfOHgxNiwKLSAgICBNQl9QXzh4OAotfSBtYlBhcnRNb2RlX2U7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gICAgTUJfU1BfOHg4ID0gMCwKLSAgICBNQl9TUF84eDQsCi0gICAgTUJfU1BfNHg4LAotICAgIE1CX1NQXzR4NAotfSBzdWJNYlBhcnRNb2RlX2U7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gICAgUFJFRF9NT0RFX0lOVFJBNHg0ID0gMCwKLSAgICBQUkVEX01PREVfSU5UUkExNngxNiAgLAotICAgIFBSRURfTU9ERV9JTlRFUgotfSBtYlBhcnRQcmVkTW9kZV9lOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIERhdGEgdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyogTXZQcmVkaWN0aW9uMTZ4MTYgYXNzdW1lcyB0aGF0IE1WcyBhcmUgMTZiaXRzICovCi0gICAgaTE2IGhvcjsKLSAgICBpMTYgdmVyOwotfSBtdl90OwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHUzMiBwcmV2SW50cmE0eDRQcmVkTW9kZUZsYWdbMTZdOwotICAgIHUzMiByZW1JbnRyYTR4NFByZWRNb2RlWzE2XTsKLSAgICB1MzIgaW50cmFDaHJvbWFQcmVkTW9kZTsKLSAgICB1MzIgcmVmSWR4TDBbNF07Ci0gICAgbXZfdCBtdmRMMFs0XTsKLX0gbWJQcmVkX3Q7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgc3ViTWJUeXBlX2Ugc3ViTWJUeXBlWzRdOwotICAgIHUzMiByZWZJZHhMMFs0XTsKLSAgICBtdl90IG12ZEwwWzRdWzRdOwotfSBzdWJNYlByZWRfdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSNpZmRlZiBIMjY0REVDX09NWERMCi0gICAgdTggcG9zQ29lZkJ1ZlsyNyoxNiozXTsKLSAgICB1OCB0b3RhbENvZWZmWzI3XTsKLSNlbHNlCi0gICAgaTE2IHRvdGFsQ29lZmZbMjddOwotI2VuZGlmCi0gICAgaTMyIGxldmVsWzI2XVsxNl07Ci0gICAgdTMyIGNvZWZmTWFwWzI0XTsKLX0gcmVzaWR1YWxfdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBtYlR5cGVfZSBtYlR5cGU7Ci0gICAgdTMyIGNvZGVkQmxvY2tQYXR0ZXJuOwotICAgIGkzMiBtYlFwRGVsdGE7Ci0gICAgbWJQcmVkX3QgbWJQcmVkOwotICAgIHN1Yk1iUHJlZF90IHN1Yk1iUHJlZDsKLSAgICByZXNpZHVhbF90IHJlc2lkdWFsOwotfSBtYWNyb2Jsb2NrTGF5ZXJfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgbWJTdG9yYWdlCi17Ci0gICAgbWJUeXBlX2UgbWJUeXBlOwotICAgIHUzMiBzbGljZUlkOwotICAgIHUzMiBkaXNhYmxlRGVibG9ja2luZ0ZpbHRlcklkYzsKLSAgICBpMzIgZmlsdGVyT2Zmc2V0QTsKLSAgICBpMzIgZmlsdGVyT2Zmc2V0QjsKLSAgICB1MzIgcXBZOwotICAgIGkzMiBjaHJvbWFRcEluZGV4T2Zmc2V0OwotI2lmZGVmIEgyNjRERUNfT01YREwKLSAgICB1OCB0b3RhbENvZWZmWzI3XTsKLSNlbHNlCi0gICAgaTE2IHRvdGFsQ29lZmZbMjddOwotI2VuZGlmCi0gICAgdTggaW50cmE0eDRQcmVkTW9kZVsxNl07Ci0gICAgdTMyIHJlZlBpY1s0XTsKLSAgICB1OCogcmVmQWRkcls0XTsKLSAgICBtdl90IG12WzE2XTsKLSAgICB1MzIgZGVjb2RlZDsKLSAgICBzdHJ1Y3QgbWJTdG9yYWdlICptYkE7Ci0gICAgc3RydWN0IG1iU3RvcmFnZSAqbWJCOwotICAgIHN0cnVjdCBtYlN0b3JhZ2UgKm1iQzsKLSAgICBzdHJ1Y3QgbWJTdG9yYWdlICptYkQ7Ci19IG1iU3RvcmFnZV90OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkRGVjb2RlTWFjcm9ibG9ja0xheWVyKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgICBtYWNyb2Jsb2NrTGF5ZXJfdCAqcE1iTGF5ZXIsIG1iU3RvcmFnZV90ICpwTWIsIHUzMiBzbGljZVR5cGUsCi0gICAgdTMyIG51bVJlZklkeEFjdGl2ZSk7Ci0KLXUzMiBoMjY0YnNkTnVtTWJQYXJ0KG1iVHlwZV9lIG1iVHlwZSk7Ci11MzIgaDI2NGJzZE51bVN1Yk1iUGFydChzdWJNYlR5cGVfZSBzdWJNYlR5cGUpOwotCi1zdWJNYlBhcnRNb2RlX2UgaDI2NGJzZFN1Yk1iUGFydE1vZGUoc3ViTWJUeXBlX2Ugc3ViTWJUeXBlKTsKLQotdTMyIGgyNjRic2REZWNvZGVNYWNyb2Jsb2NrKG1iU3RvcmFnZV90ICpwTWIsIG1hY3JvYmxvY2tMYXllcl90ICpwTWJMYXllciwKLSAgICBpbWFnZV90ICpjdXJySW1hZ2UsIGRwYlN0b3JhZ2VfdCAqZHBiLCBpMzIgKnFwWSwgdTMyIG1iTnVtLAotICAgIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZEZsYWcsIHU4KiBkYXRhKTsKLQotdTMyIGgyNjRic2RQcmVkTW9kZUludHJhMTZ4MTYobWJUeXBlX2UgbWJUeXBlKTsKLQotbWJQYXJ0UHJlZE1vZGVfZSBoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobWJUeXBlX2UgbWJUeXBlKTsKLSNpZmRlZiBIMjY0REVDX05FT04KLXUzMiBoMjY0YnNkQ2xlYXJNYkxheWVyKG1hY3JvYmxvY2tMYXllcl90ICpwTWJMYXllciwgdTMyIHNpemUpOwotI2VuZGlmCi0KLSNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX01BQ1JPQkxPQ0tfTEFZRVJfSCAqLwotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9uYWxfdW5pdC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX25hbF91bml0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NGM0M2EuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX25hbF91bml0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotICAgICAzLiBNb2R1bGUgZGVmaW5lcwotICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0gICAgIDUuIEZ1bmN0aW9ucwotICAgICAgICAgIGgyNjRic2REZWNvZGVOYWxVbml0Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiaDI2NGJzZF9uYWxfdW5pdC5oIgotI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiBoMjY0YnNkRGVjb2RlTmFsVW5pdAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBEZWNvZGUgTkFMIHVuaXQgaGVhZGVyIGluZm9ybWF0aW9uCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIHBOYWxVbml0ICAgICAgICBOQUwgdW5pdCBoZWFkZXIgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBpbnZhbGlkIE5BTCB1bml0IGhlYWRlciBpbmZvcm1hdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZERlY29kZU5hbFVuaXQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCBuYWxVbml0X3QgKnBOYWxVbml0KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwTmFsVW5pdCk7Ci0gICAgQVNTRVJUKHBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkID09IDApOwotCi0gICAgLyogZm9yYmlkZGVuX3plcm9fYml0IChub3QgY2hlY2tlZCB0byBiZSB6ZXJvLCBlcnJvcnMgaWdub3JlZCkgKi8KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIC8qIEFzc3VtaW5nIHRoYXQgTkFMIHVuaXQgc3RhcnRzIGZyb20gYnl0ZSBib3VuZGFyeSCtPiBkb24ndCBoYXZlIHRvIGNoZWNrCi0gICAgICogZm9sbG93aW5nIDcgYml0cyBmb3IgRU5EX09GX1NUUkVBTSAqLwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAyKTsKLSAgICBwTmFsVW5pdC0+bmFsUmVmSWRjID0gdG1wOwotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA1KTsKLSAgICBwTmFsVW5pdC0+bmFsVW5pdFR5cGUgPSAobmFsVW5pdFR5cGVfZSl0bXA7Ci0KLSAgICAvKiBkYXRhIHBhcnRpdGlvbmluZyBOQUwgdW5pdHMgbm90IHN1cHBvcnRlZCAqLwotICAgIGlmICggKHRtcCA9PSAyKSB8fCAodG1wID09IDMpIHx8ICh0bXAgPT0gNCkgKQotICAgIHsKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLQotICAgIC8qIG5hbF9yZWZfaWRjIHNoYWxsIG5vdCBiZSB6ZXJvIGZvciB0aGVzZSBuYWxfdW5pdF90eXBlcyAqLwotICAgIGlmICggKCAodG1wID09IE5BTF9TRVFfUEFSQU1fU0VUKSB8fCAodG1wID09IE5BTF9QSUNfUEFSQU1fU0VUKSB8fAotICAgICAgICAgICAodG1wID09IE5BTF9DT0RFRF9TTElDRV9JRFIpICkgJiYgKHBOYWxVbml0LT5uYWxSZWZJZGMgPT0gMCkgKQotICAgIHsKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLSAgICAvKiBuYWxfcmVmX2lkYyBzaGFsbCBiZSB6ZXJvIGZvciB0aGVzZSBuYWxfdW5pdF90eXBlcyAqLwotICAgIGVsc2UgaWYgKCAoICh0bXAgPT0gTkFMX1NFSSkgfHwgKHRtcCA9PSBOQUxfQUNDRVNTX1VOSVRfREVMSU1JVEVSKSB8fAotICAgICAgICAgICAgICAgICh0bXAgPT0gTkFMX0VORF9PRl9TRVFVRU5DRSkgfHwgKHRtcCA9PSBOQUxfRU5EX09GX1NUUkVBTSkgfHwKLSAgICAgICAgICAgICAgICAodG1wID09IE5BTF9GSUxMRVJfREFUQSkgKSAmJiAocE5hbFVuaXQtPm5hbFJlZklkYyAhPSAwKSApCi0gICAgewotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX25hbF91bml0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbmFsX3VuaXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg5NTdiZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbmFsX3VuaXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0gICAgMy4gRGF0YSB0eXBlcwotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBIMjY0U1dERUNfTkFMX1VOSVRfSAotI2RlZmluZSBIMjY0U1dERUNfTkFMX1VOSVRfSAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zdHJlYW0uaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogbWFjcm8gdG8gZGV0ZXJtaW5lIGlmIE5BTCB1bml0IHBvaW50ZWQgYnkgcE5hbFVuaXQgY29udGFpbnMgYW4gSURSIHNsaWNlICovCi0jZGVmaW5lIElTX0lEUl9OQUxfVU5JVChwTmFsVW5pdCkgXAotICAgICgocE5hbFVuaXQpLT5uYWxVbml0VHlwZSA9PSBOQUxfQ09ERURfU0xJQ0VfSURSKQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIERhdGEgdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgTkFMX0NPREVEX1NMSUNFID0gMSwKLSAgICBOQUxfQ09ERURfU0xJQ0VfSURSID0gNSwKLSAgICBOQUxfU0VJID0gNiwKLSAgICBOQUxfU0VRX1BBUkFNX1NFVCA9IDcsCi0gICAgTkFMX1BJQ19QQVJBTV9TRVQgPSA4LAotICAgIE5BTF9BQ0NFU1NfVU5JVF9ERUxJTUlURVIgPSA5LAotICAgIE5BTF9FTkRfT0ZfU0VRVUVOQ0UgPSAxMCwKLSAgICBOQUxfRU5EX09GX1NUUkVBTSA9IDExLAotICAgIE5BTF9GSUxMRVJfREFUQSA9IDEyLAotICAgIE5BTF9NQVhfVFlQRV9WQUxVRSA9IDMxCi19IG5hbFVuaXRUeXBlX2U7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgbmFsVW5pdFR5cGVfZSBuYWxVbml0VHlwZTsKLSAgICB1MzIgbmFsUmVmSWRjOwotfSBuYWxVbml0X3Q7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2REZWNvZGVOYWxVbml0KHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgbmFsVW5pdF90ICpwTmFsVW5pdCk7Ci0KLSNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX05BTF9VTklUX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX25laWdoYm91ci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX25laWdoYm91ci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTVlZWZmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9uZWlnaGJvdXIuYworKysgL2Rldi9udWxsCkBAIC0xLDM4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0gICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0gICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgICAgNS4gRnVuY3Rpb25zCi0gICAgICAgICAgaDI2NGJzZEluaXRNYk5laWdoYm91cnMKLSAgICAgICAgICBoMjY0YnNkR2V0TmVpZ2hib3VyTWIKLSAgICAgICAgICBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tBCi0gICAgICAgICAgaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQgotICAgICAgICAgIGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0MKLSAgICAgICAgICBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tECi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiaDI2NGJzZF9uZWlnaGJvdXIuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogRm9sbG93aW5nIGZvdXIgdGFibGVzIGluZGljYXRlIG5laWdoYm91cnMgb2YgZWFjaCBibG9jayBvZiBhIG1hY3JvYmxvY2suCi0gKiBGaXJzdCAxNiB2YWx1ZXMgYXJlIGZvciBsdW1hIGJsb2NrcywgbmV4dCA0IHZhbHVlcyBmb3IgQ2IgYW5kIGxhc3QgNAotICogdmFsdWVzIGZvciBDci4gRWxlbWVudHMgb2YgdGhlIHRhYmxlIGluZGljYXRlIHRvIHdoaWNoIG1hY3JvYmxvY2sgdGhlCi0gKiBuZWlnaGJvdXIgYmxvY2sgYmVsb25ncyBhbmQgdGhlIGluZGV4IG9mIHRoZSBuZWlnaGJvdXIgYmxvY2sgaW4gcXVlc3Rpb24uCi0gKiBJbmRleGluZyBvZiB0aGUgYmxvY2tzIGdvZXMgYXMgZm9sbG93cwotICoKLSAqICAgICAgICAgIFkgICAgICAgICAgICAgQ2IgICAgICAgQ3IKLSAqICAgICAgMCAgMSAgNCAgNSAgICAgIDE2IDE3ICAgIDIwIDIxCi0gKiAgICAgIDIgIDMgIDYgIDcgICAgICAxOCAxOSAgICAyMiAyMwotICogICAgICA4ICA5IDEyIDEzCi0gKiAgICAgMTAgMTEgMTQgMTUKLSAqLwotCi0vKiBsZWZ0IG5laWdoYm91ciBmb3IgZWFjaCBibG9jayAqLwotc3RhdGljIGNvbnN0IG5laWdoYm91cl90IE5fQV80eDRCWzI0XSA9IHsKLSAgICB7TUJfQSw1fSwgICAge01CX0NVUlIsMH0sIHtNQl9BLDd9LCAgICB7TUJfQ1VSUiwyfSwKLSAgICB7TUJfQ1VSUiwxfSwge01CX0NVUlIsNH0sIHtNQl9DVVJSLDN9LCB7TUJfQ1VSUiw2fSwKLSAgICB7TUJfQSwxM30sICAge01CX0NVUlIsOH0sIHtNQl9BLDE1fSwgICB7TUJfQ1VSUiwxMH0sCi0gICAge01CX0NVUlIsOX0sIHtNQl9DVVJSLDEyfSx7TUJfQ1VSUiwxMX0se01CX0NVUlIsMTR9LAotICAgIHtNQl9BLDE3fSwgICB7TUJfQ1VSUiwxNn0se01CX0EsMTl9LCAgIHtNQl9DVVJSLDE4fSwKLSAgICB7TUJfQSwyMX0sICAge01CX0NVUlIsMjB9LHtNQl9BLDIzfSwgICB7TUJfQ1VSUiwyMn0gfTsKLQotLyogYWJvdmUgbmVpZ2hib3VyIGZvciBlYWNoIGJsb2NrICovCi1zdGF0aWMgY29uc3QgbmVpZ2hib3VyX3QgTl9CXzR4NEJbMjRdID0gewotICAgIHtNQl9CLDEwfSwgICB7TUJfQiwxMX0sICAge01CX0NVUlIsMH0sIHtNQl9DVVJSLDF9LAotICAgIHtNQl9CLDE0fSwgICB7TUJfQiwxNX0sICAge01CX0NVUlIsNH0sIHtNQl9DVVJSLDV9LAotICAgIHtNQl9DVVJSLDJ9LCB7TUJfQ1VSUiwzfSwge01CX0NVUlIsOH0sIHtNQl9DVVJSLDl9LAotICAgIHtNQl9DVVJSLDZ9LCB7TUJfQ1VSUiw3fSwge01CX0NVUlIsMTJ9LHtNQl9DVVJSLDEzfSwKLSAgICB7TUJfQiwxOH0sICAge01CX0IsMTl9LCAgIHtNQl9DVVJSLDE2fSx7TUJfQ1VSUiwxN30sCi0gICAge01CX0IsMjJ9LCAgIHtNQl9CLDIzfSwgICB7TUJfQ1VSUiwyMH0se01CX0NVUlIsMjF9IH07Ci0KLS8qIGFib3ZlLXJpZ2h0IG5laWdoYm91ciBmb3IgZWFjaCBibG9jayAqLwotc3RhdGljIGNvbnN0IG5laWdoYm91cl90IE5fQ180eDRCWzI0XSA9IHsKLSAgICB7TUJfQiwxMX0sICAge01CX0IsMTR9LCAgIHtNQl9DVVJSLDF9LCB7TUJfTkEsNH0sCi0gICAge01CX0IsMTV9LCAgIHtNQl9DLDEwfSwgICB7TUJfQ1VSUiw1fSwge01CX05BLDB9LAotICAgIHtNQl9DVVJSLDN9LCB7TUJfQ1VSUiw2fSwge01CX0NVUlIsOX0sIHtNQl9OQSwxMn0sCi0gICAge01CX0NVUlIsN30sIHtNQl9OQSwyfSwgICB7TUJfQ1VSUiwxM30se01CX05BLDh9LAotICAgIHtNQl9CLDE5fSwgICB7TUJfQywxOH0sICAge01CX0NVUlIsMTd9LHtNQl9OQSwxNn0sCi0gICAge01CX0IsMjN9LCAgIHtNQl9DLDIyfSwgICB7TUJfQ1VSUiwyMX0se01CX05BLDIwfSB9OwotCi0vKiBhYm92ZS1sZWZ0IG5laWdoYm91ciBmb3IgZWFjaCBibG9jayAqLwotc3RhdGljIGNvbnN0IG5laWdoYm91cl90IE5fRF80eDRCWzI0XSA9IHsKLSAgICB7TUJfRCwxNX0sICAge01CX0IsMTB9LCAgIHtNQl9BLDV9LCAgICB7TUJfQ1VSUiwwfSwKLSAgICB7TUJfQiwxMX0sICAge01CX0IsMTR9LCAgIHtNQl9DVVJSLDF9LCB7TUJfQ1VSUiw0fSwKLSAgICB7TUJfQSw3fSwgICAge01CX0NVUlIsMn0sIHtNQl9BLDEzfSwgICB7TUJfQ1VSUiw4fSwKLSAgICB7TUJfQ1VSUiwzfSwge01CX0NVUlIsNn0sIHtNQl9DVVJSLDl9LCB7TUJfQ1VSUiwxMn0sCi0gICAge01CX0QsMTl9LCAgIHtNQl9CLDE4fSwgICB7TUJfQSwxN30sICAge01CX0NVUlIsMTZ9LAotICAgIHtNQl9ELDIzfSwgICB7TUJfQiwyMn0sICAge01CX0EsMjF9LCAgIHtNQl9DVVJSLDIwfSB9OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEluaXRNYk5laWdoYm91cnMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgSW5pdGlhbGl6ZSBtYWNyb2Jsb2NrIG5laWdoYm91cnMuIEZ1bmN0aW9uIHNldHMgbmVpZ2hib3VyCi0gICAgICAgICAgICBtYWNyb2Jsb2NrIHBvaW50ZXJzIGluIG1hY3JvYmxvY2sgc3RydWN0dXJlcyB0byBwb2ludCB0bwotICAgICAgICAgICAgbWFjcm9ibG9ja3Mgb24gdGhlIGxlZnQsIGFib3ZlLCBhYm92ZS1yaWdodCBhbmQgYWJvdmUtbGVmdC4KLSAgICAgICAgICAgIFBvaW50ZXJzIGFyZSBzZXQgTlVMTCBpZiB0aGUgbmVpZ2hib3VyIGRvZXMgbm90IGZpdCBpbnRvIHRoZQotICAgICAgICAgICAgcGljdHVyZS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwaWNXaWR0aCAgICAgICAgd2lkdGggb2YgdGhlIHBpY3R1cmUgaW4gbWFjcm9ibG9ja3MKLSAgICAgICAgICAgIHBpY1NpemVJbk1icyAgICBubyBuZWVkIHRvIGNsYXJpZnkKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgcE1iU3RvcmFnZSAgICAgIG5laWdoYm91ciBwb2ludGVycyBvZiBlYWNoIG1iU3RvcmFnZSBzdHJ1Y3R1cmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBub25lCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgaDI2NGJzZEluaXRNYk5laWdoYm91cnMobWJTdG9yYWdlX3QgKnBNYlN0b3JhZ2UsIHUzMiBwaWNXaWR0aCwKLSAgICB1MzIgcGljU2l6ZUluTWJzKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpLCByb3csIGNvbDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBNYlN0b3JhZ2UpOwotICAgIEFTU0VSVChwaWNXaWR0aCk7Ci0gICAgQVNTRVJUKHBpY1dpZHRoIDw9IHBpY1NpemVJbk1icyk7Ci0gICAgQVNTRVJUKCgocGljU2l6ZUluTWJzIC8gcGljV2lkdGgpICogcGljV2lkdGgpID09IHBpY1NpemVJbk1icyk7Ci0KLSAgICByb3cgPSBjb2wgPSAwOwotCi0gICAgZm9yIChpID0gMDsgaSA8IHBpY1NpemVJbk1iczsgaSsrKQotICAgIHsKLQotICAgICAgICBpZiAoY29sKQotICAgICAgICAgICAgcE1iU3RvcmFnZVtpXS5tYkEgPSBwTWJTdG9yYWdlICsgaSAtIDE7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBNYlN0b3JhZ2VbaV0ubWJBID0gTlVMTDsKLQotICAgICAgICBpZiAocm93KQotICAgICAgICAgICAgcE1iU3RvcmFnZVtpXS5tYkIgPSBwTWJTdG9yYWdlICsgaSAtIHBpY1dpZHRoOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBwTWJTdG9yYWdlW2ldLm1iQiA9IE5VTEw7Ci0KLSAgICAgICAgaWYgKHJvdyAmJiAoY29sIDwgcGljV2lkdGggLSAxKSkKLSAgICAgICAgICAgIHBNYlN0b3JhZ2VbaV0ubWJDID0gcE1iU3RvcmFnZSArIGkgLSAocGljV2lkdGggLSAxKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcE1iU3RvcmFnZVtpXS5tYkMgPSBOVUxMOwotCi0gICAgICAgIGlmIChyb3cgJiYgY29sKQotICAgICAgICAgICAgcE1iU3RvcmFnZVtpXS5tYkQgPSBwTWJTdG9yYWdlICsgaSAtIChwaWNXaWR0aCArIDEpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBwTWJTdG9yYWdlW2ldLm1iRCA9IE5VTEw7Ci0KLSAgICAgICAgY29sKys7Ci0gICAgICAgIGlmIChjb2wgPT0gcGljV2lkdGgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbCA9IDA7Ci0gICAgICAgICAgICByb3crKzsKLSAgICAgICAgfQotICAgIH0KLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RHZXROZWlnaGJvdXJNYgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBHZXQgcG9pbnRlciB0byBuZWlnaGJvdXIgbWFjcm9ibG9jay4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwTWIgICAgICAgICBwb2ludGVyIHRvIG1hY3JvYmxvY2sgc3RydWN0dXJlIG9mIHRoZSBtYWNyb2Jsb2NrCi0gICAgICAgICAgICAgICAgICAgICAgICB3aG9zZSBuZWlnaGJvdXIgaXMgd2FudGVkCi0gICAgICAgICAgICBuZWlnaGJvdXIgICBpbmRpY2F0ZXMgd2hpY2ggbmVpZ2hib3VyIGlzIHdhbnRlZAotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBub25lCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIHBvaW50ZXIgdG8gbmVpZ2hib3VyIG1hY3JvYmxvY2sKLSAgICAgICAgICAgIE5VTEwgaWYgbm90IGF2YWlsYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1tYlN0b3JhZ2VfdCogaDI2NGJzZEdldE5laWdoYm91ck1iKG1iU3RvcmFnZV90ICpwTWIsIG5laWdoYm91ck1iX2UgbmVpZ2hib3VyKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoKG5laWdoYm91ciA8PSBNQl9DVVJSKSB8fCAobmVpZ2hib3VyID09IE1CX05BKSk7Ci0KLSAgICBpZiAobmVpZ2hib3VyID09IE1CX0EpCi0gICAgICAgIHJldHVybihwTWItPm1iQSk7Ci0gICAgZWxzZSBpZiAobmVpZ2hib3VyID09IE1CX0IpCi0gICAgICAgIHJldHVybihwTWItPm1iQik7Ci0gICAgZWxzZSBpZiAobmVpZ2hib3VyID09IE1CX0MpCi0gICAgICAgIHJldHVybihwTWItPm1iQyk7Ci0gICAgZWxzZSBpZiAobmVpZ2hib3VyID09IE1CX0QpCi0gICAgICAgIHJldHVybihwTWItPm1iRCk7Ci0gICAgZWxzZSBpZiAobmVpZ2hib3VyID09IE1CX0NVUlIpCi0gICAgICAgIHJldHVybihwTWIpOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuKE5VTEwpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBHZXQgbGVmdCBuZWlnaGJvdXIgb2YgdGhlIGJsb2NrLiBGdW5jdGlvbiByZXR1cm5zIHBvaW50ZXIgdG8KLSAgICAgICAgICAgIHRoZSB0YWJsZSBkZWZpbmVkIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgYmxvY2tJbmRleCAgaW5kaWNhdGVzIHRoZSBibG9jayB3aG9zZSBuZWlnaGJvdXJzIGFyZSB3YW50ZWQKLQotICAgICAgICBPdXRwdXRzOgotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBwb2ludGVyIHRvIG5laWdoYm91ciBzdHJ1Y3R1cmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotY29uc3QgbmVpZ2hib3VyX3QqIGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0EodTMyIGJsb2NrSW5kZXgpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoYmxvY2tJbmRleCA8IDI0KTsKLQotICAgIHJldHVybihOX0FfNHg0QitibG9ja0luZGV4KTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0IKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgR2V0IGFib3ZlIG5laWdoYm91ciBvZiB0aGUgYmxvY2suIEZ1bmN0aW9uIHJldHVybnMgcG9pbnRlciB0bwotICAgICAgICAgICAgdGhlIHRhYmxlIGRlZmluZWQgaW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBibG9ja0luZGV4ICBpbmRpY2F0ZXMgdGhlIGJsb2NrIHdob3NlIG5laWdoYm91cnMgYXJlIHdhbnRlZAotCi0gICAgICAgIE91dHB1dHM6Ci0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIHBvaW50ZXIgdG8gbmVpZ2hib3VyIHN0cnVjdHVyZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1jb25zdCBuZWlnaGJvdXJfdCogaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQih1MzIgYmxvY2tJbmRleCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChibG9ja0luZGV4IDwgMjQpOwotCi0gICAgcmV0dXJuKE5fQl80eDRCK2Jsb2NrSW5kZXgpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBHZXQgYWJvdmUtcmlnaHQgIG5laWdoYm91ciBvZiB0aGUgYmxvY2suIEZ1bmN0aW9uIHJldHVybnMgcG9pbnRlcgotICAgICAgICAgICAgdG8gdGhlIHRhYmxlIGRlZmluZWQgaW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBibG9ja0luZGV4ICBpbmRpY2F0ZXMgdGhlIGJsb2NrIHdob3NlIG5laWdoYm91cnMgYXJlIHdhbnRlZAotCi0gICAgICAgIE91dHB1dHM6Ci0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIHBvaW50ZXIgdG8gbmVpZ2hib3VyIHN0cnVjdHVyZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1jb25zdCBuZWlnaGJvdXJfdCogaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQyh1MzIgYmxvY2tJbmRleCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChibG9ja0luZGV4IDwgMjQpOwotCi0gICAgcmV0dXJuKE5fQ180eDRCK2Jsb2NrSW5kZXgpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrRAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBHZXQgYWJvdmUtbGVmdCBuZWlnaGJvdXIgb2YgdGhlIGJsb2NrLiBGdW5jdGlvbiByZXR1cm5zIHBvaW50ZXIgdG8KLSAgICAgICAgICAgIHRoZSB0YWJsZSBkZWZpbmVkIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgYmxvY2tJbmRleCAgaW5kaWNhdGVzIHRoZSBibG9jayB3aG9zZSBuZWlnaGJvdXJzIGFyZSB3YW50ZWQKLQotICAgICAgICBPdXRwdXRzOgotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBwb2ludGVyIHRvIG5laWdoYm91ciBzdHJ1Y3R1cmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotY29uc3QgbmVpZ2hib3VyX3QqIGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0QodTMyIGJsb2NrSW5kZXgpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoYmxvY2tJbmRleCA8IDI0KTsKLQotICAgIHJldHVybihOX0RfNHg0QitibG9ja0luZGV4KTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBDaGVjayBpZiBuZWlnaGJvdXIgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUuIE5laWdoYm91ciBtYWNyb2Jsb2NrCi0gICAgICAgICAgICBpcyBjb25zaWRlcmVkIGF2YWlsYWJsZSBpZiBpdCBpcyB3aXRoaW4gdGhlIHBpY3R1cmUgYW5kIGJlbG9uZ3MKLSAgICAgICAgICAgIHRvIHRoZSBzYW1lIHNsaWNlIGFzIHRoZSBjdXJyZW50IG1hY3JvYmxvY2suCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcE1iICAgICAgICAgcG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrCi0gICAgICAgICAgICBwTmVpZ2hib3VyICBwb2ludGVyIHRvIHRoZSBuZWlnaGJvdXIgbWFjcm9ibG9jawotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBub25lCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIFRSVUUgICAgbmVpZ2hib3VyIGlzIGF2YWlsYWJsZQotICAgICAgICAgICAgRkFMU0UgICBuZWlnaGJvdXIgaXMgbm90IGF2YWlsYWJsZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKG1iU3RvcmFnZV90ICpwTWIsIG1iU3RvcmFnZV90ICpwTmVpZ2hib3VyKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotLyogQ29kZSAqLwotCi0gICAgaWYgKCAocE5laWdoYm91ciA9PSBOVUxMKSB8fCAocE1iLT5zbGljZUlkICE9IHBOZWlnaGJvdXItPnNsaWNlSWQpICkKLSAgICAgICAgcmV0dXJuKEhBTlRST19GQUxTRSk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4oSEFOVFJPX1RSVUUpOwotCi19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9uZWlnaGJvdXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9uZWlnaGJvdXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNlMGFkMS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbmVpZ2hib3VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotICAgIDMuIERhdGEgdHlwZXMKLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSDI2NFNXREVDX05FSUdIQk9VUl9ICi0jZGVmaW5lIEgyNjRTV0RFQ19ORUlHSEJPVVJfSAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgTUJfQSA9IDAsCi0gICAgTUJfQiwKLSAgICBNQl9DLAotICAgIE1CX0QsCi0gICAgTUJfQ1VSUiwKLSAgICBNQl9OQSA9IDB4RkYKLX0gbmVpZ2hib3VyTWJfZTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBEYXRhIHR5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIG5laWdoYm91ck1iX2UgICBtYjsKLSAgICB1OCAgICAgICAgICAgICBpbmRleDsKLX0gbmVpZ2hib3VyX3Q7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBoMjY0YnNkSW5pdE1iTmVpZ2hib3VycyhtYlN0b3JhZ2VfdCAqcE1iU3RvcmFnZSwgdTMyIHBpY1dpZHRoLAotICAgIHUzMiBwaWNTaXplSW5NYnMpOwotCi1tYlN0b3JhZ2VfdCogaDI2NGJzZEdldE5laWdoYm91ck1iKG1iU3RvcmFnZV90ICpwTWIsIG5laWdoYm91ck1iX2UgbmVpZ2hib3VyKTsKLQotdTMyIGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShtYlN0b3JhZ2VfdCAqcE1iLCBtYlN0b3JhZ2VfdCAqcE5laWdoYm91cik7Ci0KLWNvbnN0IG5laWdoYm91cl90KiBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tBKHUzMiBibG9ja0luZGV4KTsKLWNvbnN0IG5laWdoYm91cl90KiBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tCKHUzMiBibG9ja0luZGV4KTsKLWNvbnN0IG5laWdoYm91cl90KiBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tDKHUzMiBibG9ja0luZGV4KTsKLWNvbnN0IG5laWdoYm91cl90KiBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tEKHUzMiBibG9ja0luZGV4KTsKLQotI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfTkVJR0hCT1VSX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3BpY19vcmRlcl9jbnQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9waWNfb3JkZXJfY250LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMjMzNTIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3BpY19vcmRlcl9jbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDM0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0gICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0gICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgICAgNS4gRnVuY3Rpb25zCi0gICAgICAgICAgaDI2NGJzZERlY29kZVBpY09yZGVyQ250Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9waWNfb3JkZXJfY250LmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkRGVjb2RlUGljT3JkZXJDbnQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgQ29tcHV0ZSBwaWN0dXJlIG9yZGVyIGNvdW50IGZvciBhIHBpY3R1cmUuIEZ1bmN0aW9uIGltcGxlbWVudHMKLSAgICAgICAgICAgIGNvbXB1dGF0aW9uIG9mIGFsbCBQT0MgdHlwZXMgKDAsIDEgYW5kIDIpLCB0eXBlIGlzIG9idGFpbmVkIGZyb20KLSAgICAgICAgICAgIHNwcy4gU2VlIHN0YW5kYXJkIGZvciBkZXNjcmlwdGlvbiBvZiB0aGUgUE9DIHR5cGVzIGFuZCBob3cgUE9DIGlzCi0gICAgICAgICAgICBjb21wdXRlZCBmb3IgZWFjaCB0eXBlLgotCi0gICAgICAgICAgICBGdW5jdGlvbiByZXR1cm5zIHRoZSBtaW5pbXVtIG9mIHRvcCBmaWVsZCBhbmQgYm90dG9tIGZpZWxkIHBpYwotICAgICAgICAgICAgb3JkZXIgY291bnRzLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBvYyAgICAgICAgIHBvaW50ZXIgdG8gcHJldmlvdXMgcmVzdWx0cwotICAgICAgICAgICAgc3BzICAgICAgICAgcG9pbnRlciB0byBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0Ci0gICAgICAgICAgICBzbGljSGVhZGVyICBwb2ludGVyIHRvIGN1cnJlbnQgc2xpY2UgaGVhZGVyLCBmcmFtZSBudW1iZXIgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICBvdGhlciBwYXJhbXMgbmVlZGVkIGZvciBQT0MgY29tcHV0YXRpb24KLSAgICAgICAgICAgIHBOYWxVbml0ICAgIHBvaW50ZXIgdG8gY3VycmVudCBOQUwgdW5pdCBzdHJ1Y3RydWUsIGZ1bmN0aW9uIG5lZWRzCi0gICAgICAgICAgICAgICAgICAgICAgICB0byBrbm93IGlmIHRoaXMgaXMgYW4gSURSIHBpY3R1cmUgYW5kIGFsc28gaWYgdGhpcyBpcwotICAgICAgICAgICAgICAgICAgICAgICAgYSByZWZlcmVuY2UgcGljdHVyZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBwb2MgICAgICAgICByZXN1bHRzIHN0b3JlZCBoZXJlIGZvciBjb21wdXRhdGlvbiBvZiBuZXh0IFBPQwotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBwaWN0dXJlIG9yZGVyIGNvdW50Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWkzMiBoMjY0YnNkRGVjb2RlUGljT3JkZXJDbnQocG9jU3RvcmFnZV90ICpwb2MsIHNlcVBhcmFtU2V0X3QgKnNwcywKLSAgICBzbGljZUhlYWRlcl90ICpwU2xpY2VIZWFkZXIsIG5hbFVuaXRfdCAqcE5hbFVuaXQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGk7Ci0gICAgaTMyIHBpY09yZGVyQ250OwotICAgIHUzMiBmcmFtZU51bU9mZnNldCwgYWJzRnJhbWVOdW0sIHBpY09yZGVyQ250Q3ljbGVDbnQ7Ci0gICAgdTMyIGZyYW1lTnVtSW5QaWNPcmRlckNudEN5Y2xlOwotICAgIGkzMiBleHBlY3RlZERlbHRhUGljT3JkZXJDbnRDeWNsZTsKLSAgICB1MzIgY29udGFpbnNNbWNvNTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBvYyk7Ci0gICAgQVNTRVJUKHNwcyk7Ci0gICAgQVNTRVJUKHBTbGljZUhlYWRlcik7Ci0gICAgQVNTRVJUKHBOYWxVbml0KTsKLSAgICBBU1NFUlQoc3BzLT5waWNPcmRlckNudFR5cGUgPD0gMik7Ci0KLSNpZiAwCi0gICAgLyogSmFuU2E6IEkgZG9uJ3QgdGhpbmsgdGhpcyBpcyBuZWNlc3NhcnksIGRvbid0IHNlZSBhbnkgcmVhc29uIHRvCi0gICAgICogaW5jcmVtZW50IHByZXZGcmFtZU51bSBvbmUgYnkgb25lIGluc3RlYWQgb2Ygb25lIGJpZyBpbmNyZW1lbnQuCi0gICAgICogSG93ZXZlciwgc3RhbmRhcmQgc3BlY2lmaWVzIHRoYXQgdGhpcyBzaG91bGQgYmUgZG9uZSAtPiBpZiBzb21lb25lCi0gICAgICogZmlndXJlcyBvdXQgYW55IGNhc2Ugd2hlbiB0aGUgb3V0Y29tZSB3b3VsZCBiZSBkaWZmZXJlbnQgZm9yIHN0ZXAgYnkKLSAgICAgKiBzdGVwIGluY3JlbWVudCwgdGhpcyBwYXJ0IG9mIHRoZSBjb2RlIHNob3VsZCBiZSBlbmFibGVkICovCi0KLSAgICAvKiBpZiB0aGVyZSB3YXMgYSBnYXAgaW4gZnJhbWUgbnVtYmVyaW5nIGFuZCBwaWNPcmRlckNudFR5cGUgaXMgMSBvciAyIC0+Ci0gICAgICogImNvbXB1dGUiIHBpYyBvcmRlciBjb3VudHMgZm9yIG5vbi1leGlzdGluZyBmcmFtZXMuIFRoZXNlIGFyZSBub3QKLSAgICAgKiBhY3R1YWxseSBjb21wdXRlZCwgYnV0IHByb2Nlc3MgbmVlZHMgdG8gYmUgZG9uZSB0byB1cGRhdGUgdGhlCi0gICAgICogcHJldkZyYW1lTnVtIGFuZCBwcmV2RnJhbWVOdW1PZmZzZXQgKi8KLSAgICBpZiAoIHNwcy0+cGljT3JkZXJDbnRUeXBlID4gMCAmJgotICAgICAgICAgcFNsaWNlSGVhZGVyLT5mcmFtZU51bSAhPSBwb2MtPnByZXZGcmFtZU51bSAmJgotICAgICAgICAgcFNsaWNlSGVhZGVyLT5mcmFtZU51bSAhPSAoKHBvYy0+cHJldkZyYW1lTnVtICsgMSkgJSBzcHMtPm1heEZyYW1lTnVtKSkKLSAgICB7Ci0KLSAgICAgICAgLyogdXNlIHZhcmlhYmxlIGkgZm9yIHVuVXNlZFNob3J0VGVybUZyYW1lTnVtICovCi0gICAgICAgIGkgPSAocG9jLT5wcmV2RnJhbWVOdW0gKyAxKSAlIHNwcy0+bWF4RnJhbWVOdW07Ci0KLSAgICAgICAgZG8KLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBvYy0+cHJldkZyYW1lTnVtID4gaSkKLSAgICAgICAgICAgICAgICBmcmFtZU51bU9mZnNldCA9IHBvYy0+cHJldkZyYW1lTnVtT2Zmc2V0ICsgc3BzLT5tYXhGcmFtZU51bTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBmcmFtZU51bU9mZnNldCA9IHBvYy0+cHJldkZyYW1lTnVtT2Zmc2V0OwotCi0gICAgICAgICAgICBwb2MtPnByZXZGcmFtZU51bU9mZnNldCA9IGZyYW1lTnVtT2Zmc2V0OwotICAgICAgICAgICAgcG9jLT5wcmV2RnJhbWVOdW0gPSBpOwotCi0gICAgICAgICAgICBpID0gKGkgKyAxKSAlIHNwcy0+bWF4RnJhbWVOdW07Ci0KLSAgICAgICAgfSB3aGlsZSAoaSAhPSBwU2xpY2VIZWFkZXItPmZyYW1lTnVtKTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIC8qIGNoZWNrIGlmIGN1cnJlbnQgc2xpY2UgaW5jbHVkZXMgbW1jbyBlcXVhbCB0byA1ICovCi0gICAgY29udGFpbnNNbWNvNSA9IEhBTlRST19GQUxTRTsKLSAgICBpZiAocFNsaWNlSGVhZGVyLT5kZWNSZWZQaWNNYXJraW5nLmFkYXB0aXZlUmVmUGljTWFya2luZ01vZGVGbGFnKQotICAgIHsKLSAgICAgICAgaSA9IDA7Ci0gICAgICAgIHdoaWxlIChwU2xpY2VIZWFkZXItPmRlY1JlZlBpY01hcmtpbmcub3BlcmF0aW9uW2ldLgotICAgICAgICAgICAgbWVtb3J5TWFuYWdlbWVudENvbnRyb2xPcGVyYXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwU2xpY2VIZWFkZXItPmRlY1JlZlBpY01hcmtpbmcub3BlcmF0aW9uW2ldLgotICAgICAgICAgICAgICAgIG1lbW9yeU1hbmFnZW1lbnRDb250cm9sT3BlcmF0aW9uID09IDUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGFpbnNNbWNvNSA9IEhBTlRST19UUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaSsrOwotICAgICAgICB9Ci0gICAgfQotICAgIHN3aXRjaCAoc3BzLT5waWNPcmRlckNudFR5cGUpCi0gICAgewotCi0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIC8qIHNldCBwcmV2UGljT3JkZXJDbnQgdmFsdWVzIGZvciBJRFIgZnJhbWUgKi8KLSAgICAgICAgICAgIGlmIChJU19JRFJfTkFMX1VOSVQocE5hbFVuaXQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBvYy0+cHJldlBpY09yZGVyQ250TXNiID0gMDsKLSAgICAgICAgICAgICAgICBwb2MtPnByZXZQaWNPcmRlckNudExzYiA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIGNvbXB1dGUgcGljT3JkZXJDbnRNc2IgKHN0b3JlZCBpbiBwaWNPcmRlckNudCB2YXJpYWJsZSkgKi8KLSAgICAgICAgICAgIGlmICggKHBTbGljZUhlYWRlci0+cGljT3JkZXJDbnRMc2IgPCBwb2MtPnByZXZQaWNPcmRlckNudExzYikgJiYKLSAgICAgICAgICAgICAgICAoKHBvYy0+cHJldlBpY09yZGVyQ250THNiIC0gcFNsaWNlSGVhZGVyLT5waWNPcmRlckNudExzYikgPj0KLSAgICAgICAgICAgICAgICAgc3BzLT5tYXhQaWNPcmRlckNudExzYi8yKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcGljT3JkZXJDbnQgPSBwb2MtPnByZXZQaWNPcmRlckNudE1zYiArCi0gICAgICAgICAgICAgICAgICAgIChpMzIpc3BzLT5tYXhQaWNPcmRlckNudExzYjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKChwU2xpY2VIZWFkZXItPnBpY09yZGVyQ250THNiID4gcG9jLT5wcmV2UGljT3JkZXJDbnRMc2IpICYmCi0gICAgICAgICAgICAgICAgKChwU2xpY2VIZWFkZXItPnBpY09yZGVyQ250THNiIC0gcG9jLT5wcmV2UGljT3JkZXJDbnRMc2IpID4KLSAgICAgICAgICAgICAgICAgc3BzLT5tYXhQaWNPcmRlckNudExzYi8yKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcGljT3JkZXJDbnQgPSBwb2MtPnByZXZQaWNPcmRlckNudE1zYiAtCi0gICAgICAgICAgICAgICAgICAgIChpMzIpc3BzLT5tYXhQaWNPcmRlckNudExzYjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBwaWNPcmRlckNudCA9IHBvYy0+cHJldlBpY09yZGVyQ250TXNiOwotCi0gICAgICAgICAgICAvKiBzdGFuZGFyZCBzcGVjaWZpZXMgdGhhdCBwcmV2UGljT3JkZXJDbnRNc2IgaXMgZnJvbSBwcmV2aW91cwotICAgICAgICAgICAgICogcmVyZXJlbmNlIGZyYW1lIC0+IHJlcGxhY2Ugb2xkIHZhbHVlIG9ubHkgaWYgY3VycmVudCBmcmFtZSBpcwotICAgICAgICAgICAgICogcmVyZXJlbmNlIGZyYW1lICovCi0gICAgICAgICAgICBpZiAocE5hbFVuaXQtPm5hbFJlZklkYykKLSAgICAgICAgICAgICAgICBwb2MtPnByZXZQaWNPcmRlckNudE1zYiA9IHBpY09yZGVyQ250OwotCi0gICAgICAgICAgICAvKiBjb21wdXRlIHRvcCBmaWVsZCBvcmRlciBjbnQgKHN0b3JlZCBpbiBwaWNPcmRlckNudCkgKi8KLSAgICAgICAgICAgIHBpY09yZGVyQ250ICs9IChpMzIpcFNsaWNlSGVhZGVyLT5waWNPcmRlckNudExzYjsKLQotICAgICAgICAgICAgLyogaWYgZGVsdGEgZm9yIGJvdHRvbSBmaWVsZCBpcyBuZWdhdGl2ZSAtPiBib3R0b20gd2lsbCBiZSB0aGUKLSAgICAgICAgICAgICAqIG1pbmltdW0gcGljIG9yZGVyIGNvdW50ICovCi0gICAgICAgICAgICBpZiAocFNsaWNlSGVhZGVyLT5kZWx0YVBpY09yZGVyQ250Qm90dG9tIDwgMCkKLSAgICAgICAgICAgICAgICBwaWNPcmRlckNudCArPSBwU2xpY2VIZWFkZXItPmRlbHRhUGljT3JkZXJDbnRCb3R0b207Ci0KLSAgICAgICAgICAgIC8qIHN0YW5kYXJkIHNwZWNpZmllcyB0aGF0IHByZXZQaWNPcmRlckNudExzYiBpcyBmcm9tIHByZXZpb3VzCi0gICAgICAgICAgICAgKiByZXJlcmVuY2UgZnJhbWUgLT4gcmVwbGFjZSBvbGQgdmFsdWUgb25seSBpZiBjdXJyZW50IGZyYW1lIGlzCi0gICAgICAgICAgICAgKiByZXJlcmVuY2UgZnJhbWUgKi8KLSAgICAgICAgICAgIGlmIChwTmFsVW5pdC0+bmFsUmVmSWRjKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIGlmIGN1cnJlbnQgZnJhbWUgY29udGFpbnMgbW1jbzUgLT4gbW9kaWZ5IHZhbHVlcyB0byBiZQotICAgICAgICAgICAgICAgICAqIHN0b3JlZCAqLwotICAgICAgICAgICAgICAgIGlmIChjb250YWluc01tY281KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcG9jLT5wcmV2UGljT3JkZXJDbnRNc2IgPSAwOwotICAgICAgICAgICAgICAgICAgICAvKiBwcmV2UGljT3JkZXJDbnRMc2Igc2hvdWxkIGJlIHRoZSB0b3AgZmllbGQgcGljT3JkZXJDbnQKLSAgICAgICAgICAgICAgICAgICAgICogaWYgcHJldmlvdXMgZnJhbWUgaW5jbHVkZWQgbW1jbzUuIFRvcCBmaWVsZCBwaWNPcmRlckNudAotICAgICAgICAgICAgICAgICAgICAgKiBmb3IgZnJhbWVzIGNvbnRhaW5pbmcgbW1jbzUgaXMgb2J0YWluZWQgYnkgc3VidHJhY3RpbmcKLSAgICAgICAgICAgICAgICAgICAgICogdGhlIHBpY09yZGVyQ250IGZyb20gb3JpZ2luYWwgdG9wIGZpZWxkIG9yZGVyIGNvdW50IC0+Ci0gICAgICAgICAgICAgICAgICAgICAqIHZhbHVlIGlzIHplcm8gaWYgdG9wIGZpZWxkIHdhcyB0aGUgbWluaW11bSwgaS5lLiBkZWx0YQotICAgICAgICAgICAgICAgICAgICAgKiBmb3IgYm90dG9tIHdhcyBwb3NpdGl2ZSwgb3RoZXJ3aXNlIHZhbHVlIGlzCi0gICAgICAgICAgICAgICAgICAgICAqIC1kZWx0YVBpY09yZGVyQ250Qm90dG9tICovCi0gICAgICAgICAgICAgICAgICAgIGlmIChwU2xpY2VIZWFkZXItPmRlbHRhUGljT3JkZXJDbnRCb3R0b20gPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgcG9jLT5wcmV2UGljT3JkZXJDbnRMc2IgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MzIpKC1wU2xpY2VIZWFkZXItPmRlbHRhUGljT3JkZXJDbnRCb3R0b20pOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBwb2MtPnByZXZQaWNPcmRlckNudExzYiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHBpY09yZGVyQ250ID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcG9jLT5wcmV2UGljT3JkZXJDbnRMc2IgPSBwU2xpY2VIZWFkZXItPnBpY09yZGVyQ250THNiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAxOgotCi0gICAgICAgICAgICAvKiBzdGVwIDEgKGluIHRoZSBkZXNjcmlwdGlvbiBpbiB0aGUgc3RhbmRhcmQpICovCi0gICAgICAgICAgICBpZiAoSVNfSURSX05BTF9VTklUKHBOYWxVbml0KSkKLSAgICAgICAgICAgICAgICBmcmFtZU51bU9mZnNldCA9IDA7Ci0gICAgICAgICAgICBlbHNlIGlmIChwb2MtPnByZXZGcmFtZU51bSA+IHBTbGljZUhlYWRlci0+ZnJhbWVOdW0pCi0gICAgICAgICAgICAgICAgZnJhbWVOdW1PZmZzZXQgPSBwb2MtPnByZXZGcmFtZU51bU9mZnNldCArIHNwcy0+bWF4RnJhbWVOdW07Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZnJhbWVOdW1PZmZzZXQgPSBwb2MtPnByZXZGcmFtZU51bU9mZnNldDsKLQotICAgICAgICAgICAgLyogc3RlcCAyICovCi0gICAgICAgICAgICBpZiAoc3BzLT5udW1SZWZGcmFtZXNJblBpY09yZGVyQ250Q3ljbGUpCi0gICAgICAgICAgICAgICAgYWJzRnJhbWVOdW0gPSBmcmFtZU51bU9mZnNldCArIHBTbGljZUhlYWRlci0+ZnJhbWVOdW07Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgYWJzRnJhbWVOdW0gPSAwOwotCi0gICAgICAgICAgICBpZiAocE5hbFVuaXQtPm5hbFJlZklkYyA9PSAwICYmIGFic0ZyYW1lTnVtID4gMCkKLSAgICAgICAgICAgICAgICBhYnNGcmFtZU51bSAtPSAxOwotCi0gICAgICAgICAgICAvKiBzdGVwIDMgKi8KLSAgICAgICAgICAgIGlmIChhYnNGcmFtZU51bSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcGljT3JkZXJDbnRDeWNsZUNudCA9Ci0gICAgICAgICAgICAgICAgICAgIChhYnNGcmFtZU51bSAtIDEpL3Nwcy0+bnVtUmVmRnJhbWVzSW5QaWNPcmRlckNudEN5Y2xlOwotICAgICAgICAgICAgICAgIGZyYW1lTnVtSW5QaWNPcmRlckNudEN5Y2xlID0KLSAgICAgICAgICAgICAgICAgICAgKGFic0ZyYW1lTnVtIC0gMSklc3BzLT5udW1SZWZGcmFtZXNJblBpY09yZGVyQ250Q3ljbGU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIHN0ZXAgNCAqLwotICAgICAgICAgICAgZXhwZWN0ZWREZWx0YVBpY09yZGVyQ250Q3ljbGUgPSAwOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNwcy0+bnVtUmVmRnJhbWVzSW5QaWNPcmRlckNudEN5Y2xlOyBpKyspCi0gICAgICAgICAgICAgICAgZXhwZWN0ZWREZWx0YVBpY09yZGVyQ250Q3ljbGUgKz0gc3BzLT5vZmZzZXRGb3JSZWZGcmFtZVtpXTsKLQotICAgICAgICAgICAgLyogc3RlcCA1IChwaWNPcmRlckNudCB1c2VkIHRvIHN0b3JlIGV4cGVjdGVkUGljT3JkZXJDbnQpICovCi0gICAgICAgICAgICAvKmxpbnQgLWVzeW0oNjQ0LHBpY09yZGVyQ250Q3ljbGVDbnQpIGFsd2F5cyBpbml0aWFsaXplZCAqLwotICAgICAgICAgICAgLypsaW50IC1lc3ltKDY0NCxmcmFtZU51bUluUGljT3JkZXJDbnRDeWNsZSkgYWx3YXlzIGluaXRpYWxpemVkICovCi0gICAgICAgICAgICBpZiAoYWJzRnJhbWVOdW0gPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBpY09yZGVyQ250ID0KLSAgICAgICAgICAgICAgICAgICAgKGkzMilwaWNPcmRlckNudEN5Y2xlQ250ICogZXhwZWN0ZWREZWx0YVBpY09yZGVyQ250Q3ljbGU7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8PSBmcmFtZU51bUluUGljT3JkZXJDbnRDeWNsZTsgaSsrKQotICAgICAgICAgICAgICAgICAgICBwaWNPcmRlckNudCArPSBzcHMtPm9mZnNldEZvclJlZkZyYW1lW2ldOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHBpY09yZGVyQ250ID0gMDsKLQotICAgICAgICAgICAgaWYgKHBOYWxVbml0LT5uYWxSZWZJZGMgPT0gMCkKLSAgICAgICAgICAgICAgICBwaWNPcmRlckNudCArPSBzcHMtPm9mZnNldEZvck5vblJlZlBpYzsKLQotICAgICAgICAgICAgLyogc3RlcCA2IChwaWNPcmRlckNudCBpcyB0b3AgZmllbGQgb3JkZXIgY250IGlmIGRlbHRhIGZvciBib3R0b20KLSAgICAgICAgICAgICAqIGlzIHBvc2l0aXZlLCBvdGhlcndpc2UgaXQgaXMgYm90dG9tIGZpZWxkIG9yZGVyIGNudCkgKi8KLSAgICAgICAgICAgIHBpY09yZGVyQ250ICs9IHBTbGljZUhlYWRlci0+ZGVsdGFQaWNPcmRlckNudFswXTsKLQotICAgICAgICAgICAgaWYgKCAoc3BzLT5vZmZzZXRGb3JUb3BUb0JvdHRvbUZpZWxkICsKLSAgICAgICAgICAgICAgICAgICAgcFNsaWNlSGVhZGVyLT5kZWx0YVBpY09yZGVyQ250WzFdKSA8IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBpY09yZGVyQ250ICs9IHNwcy0+b2Zmc2V0Rm9yVG9wVG9Cb3R0b21GaWVsZCArCi0gICAgICAgICAgICAgICAgICAgIHBTbGljZUhlYWRlci0+ZGVsdGFQaWNPcmRlckNudFsxXTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogaWYgY3VycmVudCBwaWN0dXJlIGNvbnRhaW5zIG1tY281IC0+IHNldCBwcmV2RnJhbWVOdW1PZmZzZXQgYW5kCi0gICAgICAgICAgICAgKiBwcmV2RnJhbWVOdW0gdG8gMCBmb3IgY29tcHV0YXRpb24gb2YgcGljT3JkZXJDbnQgb2YgbmV4dAotICAgICAgICAgICAgICogZnJhbWUsIG90aGVyd2lzZSBzdG9yZSBmcmFtZU51bSBhbmQgZnJhbWVOdW1PZmZzZXQgdG8gcG9jCi0gICAgICAgICAgICAgKiBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgIGlmICghY29udGFpbnNNbWNvNSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwb2MtPnByZXZGcmFtZU51bU9mZnNldCA9IGZyYW1lTnVtT2Zmc2V0OwotICAgICAgICAgICAgICAgIHBvYy0+cHJldkZyYW1lTnVtID0gcFNsaWNlSGVhZGVyLT5mcmFtZU51bTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwb2MtPnByZXZGcmFtZU51bU9mZnNldCA9IDA7Ci0gICAgICAgICAgICAgICAgcG9jLT5wcmV2RnJhbWVOdW0gPSAwOwotICAgICAgICAgICAgICAgIHBpY09yZGVyQ250ID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6IC8qIGNhc2UgMiAqLwotICAgICAgICAgICAgLyogZGVyaXZlIGZyYW1lTnVtT2Zmc2V0ICovCi0gICAgICAgICAgICBpZiAoSVNfSURSX05BTF9VTklUKHBOYWxVbml0KSkKLSAgICAgICAgICAgICAgICBmcmFtZU51bU9mZnNldCA9IDA7Ci0gICAgICAgICAgICBlbHNlIGlmIChwb2MtPnByZXZGcmFtZU51bSA+IHBTbGljZUhlYWRlci0+ZnJhbWVOdW0pCi0gICAgICAgICAgICAgICAgZnJhbWVOdW1PZmZzZXQgPSBwb2MtPnByZXZGcmFtZU51bU9mZnNldCArIHNwcy0+bWF4RnJhbWVOdW07Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZnJhbWVOdW1PZmZzZXQgPSBwb2MtPnByZXZGcmFtZU51bU9mZnNldDsKLQotICAgICAgICAgICAgLyogZGVyaXZlIHBpY09yZGVyQ250ICh0eXBlIDIgaGFzIHNhbWUgdmFsdWUgZm9yIHRvcCBhbmQgYm90dG9tCi0gICAgICAgICAgICAgKiBmaWVsZCBvcmRlciBjbnRzKSAqLwotICAgICAgICAgICAgaWYgKElTX0lEUl9OQUxfVU5JVChwTmFsVW5pdCkpCi0gICAgICAgICAgICAgICAgcGljT3JkZXJDbnQgPSAwOwotICAgICAgICAgICAgZWxzZSBpZiAocE5hbFVuaXQtPm5hbFJlZklkYyA9PSAwKQotICAgICAgICAgICAgICAgIHBpY09yZGVyQ250ID0KLSAgICAgICAgICAgICAgICAgICAgMiAqIChpMzIpKGZyYW1lTnVtT2Zmc2V0ICsgcFNsaWNlSGVhZGVyLT5mcmFtZU51bSkgLSAxOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHBpY09yZGVyQ250ID0KLSAgICAgICAgICAgICAgICAgICAgMiAqIChpMzIpKGZyYW1lTnVtT2Zmc2V0ICsgcFNsaWNlSGVhZGVyLT5mcmFtZU51bSk7Ci0KLSAgICAgICAgICAgIC8qIGlmIGN1cnJlbnQgcGljdHVyZSBjb250YWlucyBtbWNvNSAtPiBzZXQgcHJldkZyYW1lTnVtT2Zmc2V0IGFuZAotICAgICAgICAgICAgICogcHJldkZyYW1lTnVtIHRvIDAgZm9yIGNvbXB1dGF0aW9uIG9mIHBpY09yZGVyQ250IG9mIG5leHQKLSAgICAgICAgICAgICAqIGZyYW1lLCBvdGhlcndpc2Ugc3RvcmUgZnJhbWVOdW0gYW5kIGZyYW1lTnVtT2Zmc2V0IHRvIHBvYwotICAgICAgICAgICAgICogc3RydWN0dXJlICovCi0gICAgICAgICAgICBpZiAoIWNvbnRhaW5zTW1jbzUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcG9jLT5wcmV2RnJhbWVOdW1PZmZzZXQgPSBmcmFtZU51bU9mZnNldDsKLSAgICAgICAgICAgICAgICBwb2MtPnByZXZGcmFtZU51bSA9IHBTbGljZUhlYWRlci0+ZnJhbWVOdW07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcG9jLT5wcmV2RnJhbWVOdW1PZmZzZXQgPSAwOwotICAgICAgICAgICAgICAgIHBvYy0+cHJldkZyYW1lTnVtID0gMDsKLSAgICAgICAgICAgICAgICBwaWNPcmRlckNudCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgIH0KLQotICAgIC8qbGludCAtZXN5bSg2NDQscGljT3JkZXJDbnQpIGFsd2F5cyBpbml0aWFsaXplZCAqLwotICAgIHJldHVybihwaWNPcmRlckNudCk7Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3BpY19vcmRlcl9jbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9waWNfb3JkZXJfY250LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NzQxZWIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3BpY19vcmRlcl9jbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0gICAgMy4gRGF0YSB0eXBlcwotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBIMjY0U1dERUNfUElDX09SREVSX0NOVF9ICi0jZGVmaW5lIEgyNjRTV0RFQ19QSUNfT1JERVJfQ05UX0gKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2Rfc2VxX3BhcmFtX3NldC5oIgotI2luY2x1ZGUgImgyNjRic2Rfc2xpY2VfaGVhZGVyLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9uYWxfdW5pdC5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gRGF0YSB0eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogc3RydWN0dXJlIHRvIHN0b3JlIGluZm9ybWF0aW9uIGNvbXB1dGVkIGZvciBwcmV2aW91cyBwaWN0dXJlLCBuZWVkZWQgZm9yCi0gKiBQT0MgY29tcHV0YXRpb24gb2YgYSBwaWN0dXJlLiBUd28gZmlyc3QgZmllbGRzIGZvciBQT0MgdHlwZSAwLCBsYXN0IHR3bwotICogZm9yIHR5cGVzIDEgYW5kIDIgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTMyIHByZXZQaWNPcmRlckNudExzYjsKLSAgICBpMzIgcHJldlBpY09yZGVyQ250TXNiOwotICAgIHUzMiBwcmV2RnJhbWVOdW07Ci0gICAgdTMyIHByZXZGcmFtZU51bU9mZnNldDsKLX0gcG9jU3RvcmFnZV90OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWkzMiBoMjY0YnNkRGVjb2RlUGljT3JkZXJDbnQocG9jU3RvcmFnZV90ICpwb2MsIHNlcVBhcmFtU2V0X3QgKnNwcywKLSAgICBzbGljZUhlYWRlcl90ICpzbGljZUhlYWRlciwgbmFsVW5pdF90ICpwTmFsVW5pdCk7Ci0KLSNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX1BJQ19PUkRFUl9DTlRfSCAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcGljX3BhcmFtX3NldC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3BpY19wYXJhbV9zZXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA0ZGVhNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcGljX3BhcmFtX3NldC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLSAgICAgMy4gTW9kdWxlIGRlZmluZXMKLSAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotICAgICA1LiBGdW5jdGlvbnMKLSAgICAgICAgICBoMjY0YnNkRGVjb2RlUGljUGFyYW1TZXQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJoMjY0YnNkX3BpY19wYXJhbV9zZXQuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3ZsYy5oIgotI2luY2x1ZGUgImgyNjRic2RfY2ZnLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIGxvb2t1cCB0YWJsZSBmb3IgY2VpbChsb2cyKG51bVNsaWNlR3JvdXBzKSksIGkuZS4gbnVtYmVyIG9mIGJpdHMgbmVlZGVkIHRvCi0gKiByZXByZXNlbnQgcmFuZ2UgWzAsIG51bVNsaWNlR3JvdXBzKQotICoKLSAqIE5PVEU6IGlmIE1BWF9OVU1fU0xJQ0VfR1JPVVBTIGlzIGhpZ2hlciB0aGFuIDggdGhpcyB0YWJsZSBoYXMgdG8gYmUgcmVzaXplZAotICogYWNjb3JkaW5nbHkgKi8KLXN0YXRpYyBjb25zdCB1MzIgQ2VpbExvZzJOdW1TbGljZUdyb3Vwc1s4XSA9IHsxLCAxLCAyLCAyLCAzLCAzLCAzLCAzfTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogaDI2NGJzZERlY29kZVBpY1BhcmFtU2V0Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIERlY29kZSBwaWN0dXJlIHBhcmFtZXRlciBzZXQgaW5mb3JtYXRpb24gZnJvbSB0aGUgc3RyZWFtLgotCi0gICAgICAgICAgICBGdW5jdGlvbiBhbGxvY2F0ZXMgbWVtb3J5IGZvcgotICAgICAgICAgICAgICAgIC0gcnVuIGxlbmd0aHMgaWYgc2xpY2UgZ3JvdXAgbWFwIHR5cGUgaXMgMAotICAgICAgICAgICAgICAgIC0gdG9wLWxlZnQgYW5kIGJvdHRvbS1yaWdodCBhcnJheXMgaWYgbWFwIHR5cGUgaXMgMgotICAgICAgICAgICAgICAgIC0gZm9yIHNsaWNlIGdyb3VwIGlkcyBpZiBtYXAgdHlwZSBpcyA2Ci0KLSAgICAgICAgICAgIFZhbGlkaXR5IG9mIHNvbWUgb2YgdGhlIHNsaWNlIGdyb3VwIG1hcHBpbmcgaW5mb3JtYXRpb24gZGVwZW5kcwotICAgICAgICAgICAgb24gdGhlIGltYWdlIGRpbWVuc2lvbnMgd2hpY2ggYXJlIG5vdCBrbm93biBoZXJlLiBUaGVyZWZvcmUgdGhlCi0gICAgICAgICAgICB2YWxpZGl0eSBoYXMgdG8gYmUgY2hlY2tlZCBhZnRlcndhcmRzLCBjdXJyZW50bHkgaW4gdGhlIHBhcmFtZXRlcgotICAgICAgICAgICAgc2V0IGFjdGl2YXRpb24gcGhhc2UuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIHBQaWNQYXJhbVNldCAgICBkZWNvZGVkIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgZmFpbHVyZSwgaW52YWxpZCBpbmZvcm1hdGlvbiBvciBlbmQgb2Ygc3RyZWFtCi0gICAgICAgICAgICBNRU1PUllfQUxMT0NBVElPTl9FUlJPUiBmb3IgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkRGVjb2RlUGljUGFyYW1TZXQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCBwaWNQYXJhbVNldF90ICpwUGljUGFyYW1TZXQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcCwgaSwgdmFsdWU7Ci0gICAgaTMyIGl0bXA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwUGljUGFyYW1TZXQpOwotCi0KLSAgICBIMjY0U3dEZWNNZW1zZXQocFBpY1BhcmFtU2V0LCAwLCBzaXplb2YocGljUGFyYW1TZXRfdCkpOwotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgJnBQaWNQYXJhbVNldC0+cGljUGFyYW1ldGVyU2V0SWQpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLSAgICBpZiAocFBpY1BhcmFtU2V0LT5waWNQYXJhbWV0ZXJTZXRJZCA+PSBNQVhfTlVNX1BJQ19QQVJBTV9TRVRTKQotICAgIHsKLSAgICAgICAgRVBSSU5UKCJwaWNfcGFyYW1ldGVyX3NldF9pZCIpOwotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgJnBQaWNQYXJhbVNldC0+c2VxUGFyYW1ldGVyU2V0SWQpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLSAgICBpZiAocFBpY1BhcmFtU2V0LT5zZXFQYXJhbWV0ZXJTZXRJZCA+PSBNQVhfTlVNX1NFUV9QQVJBTV9TRVRTKQotICAgIHsKLSAgICAgICAgRVBSSU5UKCJzZXFfcGFyYW1fc2V0X2lkIik7Ci0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0KLSAgICAvKiBlbnRyb3B5X2NvZGluZ19tb2RlX2ZsYWcsIHNoYWxsIGJlIDAgZm9yIGJhc2VsaW5lIHByb2ZpbGUgKi8KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXApCi0gICAgewotICAgICAgICBFUFJJTlQoImVudHJvcHlfY29kaW5nX21vZGVfZmxhZyIpOwotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwUGljUGFyYW1TZXQtPnBpY09yZGVyUHJlc2VudEZsYWcgPSAodG1wID09IDEpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICAvKiBudW1fc2xpY2VfZ3JvdXBzX21pbnVzMSAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotICAgIHBQaWNQYXJhbVNldC0+bnVtU2xpY2VHcm91cHMgPSB2YWx1ZSArIDE7Ci0gICAgaWYgKHBQaWNQYXJhbVNldC0+bnVtU2xpY2VHcm91cHMgPiBNQVhfTlVNX1NMSUNFX0dST1VQUykKLSAgICB7Ci0gICAgICAgIEVQUklOVCgibnVtX3NsaWNlX2dyb3Vwc19taW51czEiKTsKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLQotICAgIC8qIGRlY29kZSBzbGljZSBncm91cCBtYXBwaW5nIGluZm9ybWF0aW9uIGlmIG1vcmUgdGhhbiBvbmUgc2xpY2UgZ3JvdXBzICovCi0gICAgaWYgKHBQaWNQYXJhbVNldC0+bnVtU2xpY2VHcm91cHMgPiAxKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAgICZwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBNYXBUeXBlKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgaWYgKHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cE1hcFR5cGUgPiA2KQotICAgICAgICB7Ci0gICAgICAgICAgICBFUFJJTlQoInNsaWNlX2dyb3VwX21hcF90eXBlIik7Ci0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwTWFwVHlwZSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBBTExPQ0FURShwUGljUGFyYW1TZXQtPnJ1bkxlbmd0aCwKLSAgICAgICAgICAgICAgICBwUGljUGFyYW1TZXQtPm51bVNsaWNlR3JvdXBzLCB1MzIpOwotICAgICAgICAgICAgaWYgKHBQaWNQYXJhbVNldC0+cnVuTGVuZ3RoID09IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuKE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwUGljUGFyYW1TZXQtPm51bVNsaWNlR3JvdXBzOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgICAgICAgICAgcFBpY1BhcmFtU2V0LT5ydW5MZW5ndGhbaV0gPSB2YWx1ZSsxOwotICAgICAgICAgICAgICAgIC8qIHBhcmFtIHZhbHVlcyBjaGVja2VkIGluIENoZWNrUHBzKCkgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBNYXBUeXBlID09IDIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFMTE9DQVRFKHBQaWNQYXJhbVNldC0+dG9wTGVmdCwKLSAgICAgICAgICAgICAgICBwUGljUGFyYW1TZXQtPm51bVNsaWNlR3JvdXBzIC0gMSwgdTMyKTsKLSAgICAgICAgICAgIEFMTE9DQVRFKHBQaWNQYXJhbVNldC0+Ym90dG9tUmlnaHQsCi0gICAgICAgICAgICAgICAgcFBpY1BhcmFtU2V0LT5udW1TbGljZUdyb3VwcyAtIDEsIHUzMik7Ci0gICAgICAgICAgICBpZiAocFBpY1BhcmFtU2V0LT50b3BMZWZ0ID09IE5VTEwgfHwKLSAgICAgICAgICAgICAgICBwUGljUGFyYW1TZXQtPmJvdHRvbVJpZ2h0ID09IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuKE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwUGljUGFyYW1TZXQtPm51bVNsaWNlR3JvdXBzIC0gMTsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+dG9wTGVmdFtpXSA9IHZhbHVlOwotICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+Ym90dG9tUmlnaHRbaV0gPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAvKiBwYXJhbSB2YWx1ZXMgY2hlY2tlZCBpbiBDaGVja1BwcygpICovCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIChwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBNYXBUeXBlID09IDMpIHx8Ci0gICAgICAgICAgICAgICAgICAocFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwTWFwVHlwZSA9PSA0KSB8fAotICAgICAgICAgICAgICAgICAgKHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cE1hcFR5cGUgPT0gNSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcgPQotICAgICAgICAgICAgICAgICh0bXAgPT0gMSkgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cENoYW5nZVJhdGUgPSB2YWx1ZSArIDE7Ci0gICAgICAgICAgICAvKiBwYXJhbSB2YWx1ZSBjaGVja2VkIGluIENoZWNrUHBzKCkgKi8KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBNYXBUeXBlID09IDYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+cGljU2l6ZUluTWFwVW5pdHMgPSB2YWx1ZSArIDE7Ci0KLSAgICAgICAgICAgIEFMTE9DQVRFKHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cElkLAotICAgICAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+cGljU2l6ZUluTWFwVW5pdHMsIHUzMik7Ci0gICAgICAgICAgICBpZiAocFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwSWQgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOwotCi0gICAgICAgICAgICAvKiBkZXRlcm1pbmUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIHRvIHJlcHJlc2VudCByYW5nZQotICAgICAgICAgICAgICogWzAsIG51bVNsaWNlR3JvdXBzKSAqLwotICAgICAgICAgICAgdG1wID0gQ2VpbExvZzJOdW1TbGljZUdyb3Vwc1twUGljUGFyYW1TZXQtPm51bVNsaWNlR3JvdXBzLTFdOwotCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFBpY1BhcmFtU2V0LT5waWNTaXplSW5NYXBVbml0czsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cElkW2ldID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCB0bXApOwotICAgICAgICAgICAgICAgIGlmICggcFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwSWRbaV0gPj0KLSAgICAgICAgICAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+bnVtU2xpY2VHcm91cHMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRVBSSU5UKCJzbGljZV9ncm91cF9pZCIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogbnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMSAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotICAgIGlmICh2YWx1ZSA+IDMxKQotICAgIHsKLSAgICAgICAgRVBSSU5UKCJudW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxIik7Ci0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0gICAgcFBpY1BhcmFtU2V0LT5udW1SZWZJZHhMMEFjdGl2ZSA9IHZhbHVlICsgMTsKLQotICAgIC8qIG51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czEgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLSAgICBpZiAodmFsdWUgPiAzMSkKLSAgICB7Ci0gICAgICAgIEVQUklOVCgibnVtX3JlZl9pZHhfbDFfYWN0aXZlX21pbnVzMSIpOwotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotCi0gICAgLyogd2VpZ2h0ZWRfcHJlZF9mbGFnLCB0aGlzIHNoYWxsIGJlIDAgZm9yIGJhc2VsaW5lIHByb2ZpbGUgKi8KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXApCi0gICAgewotICAgICAgICBFUFJJTlQoIndlaWdodGVkX3ByZWRfZmxhZyIpOwotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotCi0gICAgLyogd2VpZ2h0ZWRfYmlwcmVkX2lkYyAqLwotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMik7Ci0gICAgaWYgKHRtcCA+IDIpCi0gICAgewotICAgICAgICBFUFJJTlQoIndlaWdodGVkX2JpcHJlZF9pZGMiKTsKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLQotICAgIC8qIHBpY19pbml0X3FwX21pbnVzMjYgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwgJml0bXApOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLSAgICBpZiAoKGl0bXAgPCAtMjYpIHx8IChpdG1wID4gMjUpKQotICAgIHsKLSAgICAgICAgRVBSSU5UKCJwaWNfaW5pdF9xcF9taW51czI2Iik7Ci0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0gICAgcFBpY1BhcmFtU2V0LT5waWNJbml0UXAgPSAodTMyKShpdG1wICsgMjYpOwotCi0gICAgLyogcGljX2luaXRfcXNfbWludXMyNiAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLCAmaXRtcCk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotICAgIGlmICgoaXRtcCA8IC0yNikgfHwgKGl0bXAgPiAyNSkpCi0gICAgewotICAgICAgICBFUFJJTlQoInBpY19pbml0X3FzX21pbnVzMjYiKTsKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLQotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLCAmaXRtcCk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotICAgIGlmICgoaXRtcCA8IC0xMikgfHwgKGl0bXAgPiAxMikpCi0gICAgewotICAgICAgICBFUFJJTlQoImNocm9tYV9xcF9pbmRleF9vZmZzZXQiKTsKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLSAgICBwUGljUGFyYW1TZXQtPmNocm9tYVFwSW5kZXhPZmZzZXQgPSBpdG1wOwotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwUGljUGFyYW1TZXQtPmRlYmxvY2tpbmdGaWx0ZXJDb250cm9sUHJlc2VudEZsYWcgPQotICAgICAgICAodG1wID09IDEpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBQaWNQYXJhbVNldC0+Y29uc3RyYWluZWRJbnRyYVByZWRGbGFnID0gKHRtcCA9PSAxKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcFBpY1BhcmFtU2V0LT5yZWR1bmRhbnRQaWNDbnRQcmVzZW50RmxhZyA9ICh0bXAgPT0gMSkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICB0bXAgPSBoMjY0YnNkUmJzcFRyYWlsaW5nQml0cyhwU3RybURhdGEpOwotCi0gICAgLyogaWdub3JlIHBvc3NpYmxlIGVycm9ycyBpbiB0cmFpbGluZyBiaXRzIG9mIHBhcmFtZXRlcnMgc2V0cyAqLwotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9waWNfcGFyYW1fc2V0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcGljX3BhcmFtX3NldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzI4NjM4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9waWNfcGFyYW1fc2V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotICAgIDMuIERhdGEgdHlwZXMKLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSDI2NFNXREVDX1BJQ19QQVJBTV9TRVRfSAotI2RlZmluZSBIMjY0U1dERUNfUElDX1BBUkFNX1NFVF9ICi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3N0cmVhbS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIERhdGEgdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIGRhdGEgc3RydWN0dXJlIHRvIHN0b3JlIFBQUyBpbmZvcm1hdGlvbiBkZWNvZGVkIGZyb20gdGhlIHN0cmVhbSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1MzIgcGljUGFyYW1ldGVyU2V0SWQ7Ci0gICAgdTMyIHNlcVBhcmFtZXRlclNldElkOwotICAgIHUzMiBwaWNPcmRlclByZXNlbnRGbGFnOwotICAgIHUzMiBudW1TbGljZUdyb3VwczsKLSAgICB1MzIgc2xpY2VHcm91cE1hcFR5cGU7Ci0gICAgdTMyICpydW5MZW5ndGg7Ci0gICAgdTMyICp0b3BMZWZ0OwotICAgIHUzMiAqYm90dG9tUmlnaHQ7Ci0gICAgdTMyIHNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnOwotICAgIHUzMiBzbGljZUdyb3VwQ2hhbmdlUmF0ZTsKLSAgICB1MzIgcGljU2l6ZUluTWFwVW5pdHM7Ci0gICAgdTMyICpzbGljZUdyb3VwSWQ7Ci0gICAgdTMyIG51bVJlZklkeEwwQWN0aXZlOwotICAgIHUzMiBwaWNJbml0UXA7Ci0gICAgaTMyIGNocm9tYVFwSW5kZXhPZmZzZXQ7Ci0gICAgdTMyIGRlYmxvY2tpbmdGaWx0ZXJDb250cm9sUHJlc2VudEZsYWc7Ci0gICAgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkRmxhZzsKLSAgICB1MzIgcmVkdW5kYW50UGljQ250UHJlc2VudEZsYWc7Ci19IHBpY1BhcmFtU2V0X3Q7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2REZWNvZGVQaWNQYXJhbVNldChzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gICAgcGljUGFyYW1TZXRfdCAqcFBpY1BhcmFtU2V0KTsKLQotI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfUElDX1BBUkFNX1NFVF9IICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9yZWNvbnN0cnVjdC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3JlY29uc3RydWN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MDlhMDYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3JlY29uc3RydWN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzE4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLSAgICAgMy4gTW9kdWxlIGRlZmluZXMKLSAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotICAgICA1LiBGdW5jdGlvbnMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2RfcmVjb25zdHJ1Y3QuaCIKLSNpbmNsdWRlICJoMjY0YnNkX21hY3JvYmxvY2tfbGF5ZXIuaCIKLSNpbmNsdWRlICJoMjY0YnNkX2ltYWdlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCi0KLSNpZmRlZiBIMjY0REVDX09NWERMCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0jZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLwotCi0jZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCkKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogU3dpdGNoIG9mZiB0aGUgZm9sbG93aW5nIExpbnQgbWVzc2FnZXMgZm9yIHRoaXMgZmlsZToKLSAqIEluZm8gNzAxOiBTaGlmdCBsZWZ0IG9mIHNpZ25lZCBxdWFudGl0eSAoaW50KQotICogSW5mbyA3MDI6IFNoaWZ0IHJpZ2h0IG9mIHNpZ25lZCBxdWFudGl0eSAoaW50KQotICovCi0vKmxpbnQgLWU3MDEgLWU3MDIgKi8KLQotLyogTHVtYSBmcmFjdGlvbmFsLXNhbXBsZSBwb3NpdGlvbnMKLSAqCi0gKiAgRyBhIGIgYyBICi0gKiAgZCBlIGYgZwotICogIGggaSBqIGsgbQotICogIG4gcCBxIHIKLSAqICBNICAgcyAgIE4KLSAqCi0gKiAgRywgSCwgTSBhbmQgTiBhcmUgaW50ZWdlciBzYW1wbGUgcG9zaXRpb25zCi0gKiAgYS1zIGFyZSBmcmFjdGlvbmFsIHNhbXBsZXMgdGhhdCBuZWVkIHRvIGJlIGludGVycG9sYXRlZC4KLSAqLwotI2lmbmRlZiBIMjY0REVDX09NWERMCi1zdGF0aWMgY29uc3QgdTMyIGx1bWFGcmFjUG9zWzRdWzRdID0gewotICAvKiBHICBkICBoICBuICAgIGEgIGUgIGkgIHAgICAgYiAgZiAgaiAgIHEgICAgIGMgICBnICAgayAgIHIgKi8KLSAgICB7MCwgMSwgMiwgM30sIHs0LCA1LCA2LCA3fSwgezgsIDksIDEwLCAxMX0sIHsxMiwgMTMsIDE0LCAxNX19OwotI2VuZGlmIC8qIEgyNjRERUNfT01YREwgKi8KLQotLyogY2xpcHBpbmcgdGFibGUsIGRlZmluZWQgaW4gaDI2NGJzZF9pbnRyYV9wcmVkaWN0aW9uLmMgKi8KLWV4dGVybiBjb25zdCB1OCBoMjY0YnNkQ2xpcFtdOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSDI2NERFQ19PTVhETAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYUhvcgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBjaHJvbWEgaW50ZXJwb2xhdGlvbiBpbiBob3Jpem9udGFsIGRpcmVjdGlvbi4KLSAgICAgICAgICBPdmVyZmlsbGluZyBpcyBkb25lIG9ubHkgaWYgbmVlZGVkLiBSZWZlcmVuY2UgaW1hZ2UgKHBSZWYpIGlzCi0gICAgICAgICAgcmVhZCBhdCBjb3JyZWN0IHBvc2l0aW9uIGFuZCB0aGUgcHJlZGljdGVkIHBhcnQgaXMgd3JpdHRlbiB0bwotICAgICAgICAgIG1hY3JvYmxvY2sncyBjaHJvbWluYW5jZSAocHJlZFBhcnRDaHJvbWEpCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICBwUmVmICAgICAgICAgICAgICBwb2ludGVyIHRvIHJlZmVyZW5jZSBmcmFtZSBDYiB0b3AtbGVmdCBjb3JuZXIKLSAgICAgICAgICB4MCAgICAgICAgICAgICAgICBpbnRlZ2VyIHgtY29vcmRpbmF0ZSBmb3IgcHJlZGljdGlvbgotICAgICAgICAgIHkwICAgICAgICAgICAgICAgIGludGVnZXIgeS1jb29yZGluYXRlIGZvciBwcmVkaWN0aW9uCi0gICAgICAgICAgd2lkdGggICAgICAgICAgICAgd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBmcmFtZSBjaHJvbWluYW5jZSBpbiBwaXhlbHMKLSAgICAgICAgICBoZWlnaHQgICAgICAgICAgICBoZWlnaHQgb2YgdGhlIHJlZmVyZW5jZSBmcmFtZSBjaHJvbWluYW5jZSBpbiBwaXhlbHMKLSAgICAgICAgICB4RnJhYyAgICAgICAgICAgICBob3Jpem9udGFsIGZyYWN0aW9uIGZvciBwcmVkaWN0aW9uIGluIDEvOCBwaXhlbHMKLSAgICAgICAgICBjaHJvbWFQYXJ0V2lkdGggICB3aWR0aCBvZiB0aGUgcHJlZGljdGVkIHBhcnQgaW4gcGl4ZWxzCi0gICAgICAgICAgY2hyb21hUGFydEhlaWdodCAgaGVpZ2h0IG9mIHRoZSBwcmVkaWN0ZWQgcGFydCBpbiBwaXhlbHMKLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICBwcmVkUGFydENocm9tYSAgICBwb2ludGVyIHdoZXJlIHByZWRpY3RlZCBwYXJ0IGlzIHdyaXR0ZW4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZm5kZWYgSDI2NERFQ19BUk0xMQotdm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFIb3IoCi0gIHU4ICpwUmVmLAotICB1OCAqcHJlZFBhcnRDaHJvbWEsCi0gIGkzMiB4MCwKLSAgaTMyIHkwLAotICB1MzIgd2lkdGgsCi0gIHUzMiBoZWlnaHQsCi0gIHUzMiB4RnJhYywKLSAgdTMyIGNocm9tYVBhcnRXaWR0aCwKLSAgdTMyIGNocm9tYVBhcnRIZWlnaHQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHgsIHksIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIGMsIHZhbDsKLSAgICB1OCAqcHRyQSwgKmNicjsKLSAgICB1MzIgY29tcDsKLSAgICB1OCBibG9ja1s5KjgqMl07Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwcmVkUGFydENocm9tYSk7Ci0gICAgQVNTRVJUKGNocm9tYVBhcnRXaWR0aCk7Ci0gICAgQVNTRVJUKGNocm9tYVBhcnRIZWlnaHQpOwotICAgIEFTU0VSVCh4RnJhYyA8IDgpOwotICAgIEFTU0VSVChwUmVmKTsKLQotICAgIGlmICgoeDAgPCAwKSB8fCAoKHUzMil4MCtjaHJvbWFQYXJ0V2lkdGgrMSA+IHdpZHRoKSB8fAotICAgICAgICAoeTAgPCAwKSB8fCAoKHUzMil5MCtjaHJvbWFQYXJ0SGVpZ2h0ID4gaGVpZ2h0KSkKLSAgICB7Ci0gICAgICAgIGgyNjRic2RGaWxsQmxvY2socFJlZiwgYmxvY2ssIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgIGNocm9tYVBhcnRXaWR0aCArIDEsIGNocm9tYVBhcnRIZWlnaHQsIGNocm9tYVBhcnRXaWR0aCArIDEpOwotICAgICAgICBwUmVmICs9IHdpZHRoICogaGVpZ2h0OwotICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHBSZWYsIGJsb2NrICsgKGNocm9tYVBhcnRXaWR0aCsxKSpjaHJvbWFQYXJ0SGVpZ2h0LAotICAgICAgICAgICAgeDAsIHkwLCB3aWR0aCwgaGVpZ2h0LCBjaHJvbWFQYXJ0V2lkdGggKyAxLAotICAgICAgICAgICAgY2hyb21hUGFydEhlaWdodCwgY2hyb21hUGFydFdpZHRoICsgMSk7Ci0KLSAgICAgICAgcFJlZiA9IGJsb2NrOwotICAgICAgICB4MCA9IDA7Ci0gICAgICAgIHkwID0gMDsKLSAgICAgICAgd2lkdGggPSBjaHJvbWFQYXJ0V2lkdGgrMTsKLSAgICAgICAgaGVpZ2h0ID0gY2hyb21hUGFydEhlaWdodDsKLSAgICB9Ci0KLSAgICB2YWwgPSA4IC0geEZyYWM7Ci0KLSAgICBmb3IgKGNvbXAgPSAwOyBjb21wIDw9IDE7IGNvbXArKykKLSAgICB7Ci0KLSAgICAgICAgcHRyQSA9IHBSZWYgKyAoY29tcCAqIGhlaWdodCArICh1MzIpeTApICogd2lkdGggKyB4MDsKLSAgICAgICAgY2JyID0gcHJlZFBhcnRDaHJvbWEgKyBjb21wICogOCAqIDg7Ci0KLSAgICAgICAgLyogMngyIHBlbHMgcGVyIGl0ZXJhdGlvbgotICAgICAgICAgKiBiaWxpbmVhciBob3Jpem9udGFsIGludGVycG9sYXRpb24gKi8KLSAgICAgICAgZm9yICh5ID0gKGNocm9tYVBhcnRIZWlnaHQgPj4gMSk7IHk7IHktLSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICh4ID0gKGNocm9tYVBhcnRXaWR0aCA+PiAxKTsgeDsgeC0tKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRtcDEgPSBwdHJBW3dpZHRoXTsKLSAgICAgICAgICAgICAgICB0bXAyID0gKnB0ckErKzsKLSAgICAgICAgICAgICAgICB0bXAzID0gcHRyQVt3aWR0aF07Ci0gICAgICAgICAgICAgICAgdG1wNCA9ICpwdHJBKys7Ci0gICAgICAgICAgICAgICAgYyA9ICgodmFsICogdG1wMSArIHhGcmFjICogdG1wMykgPDwgMykgKyAzMjsKLSAgICAgICAgICAgICAgICBjID4+PSA2OwotICAgICAgICAgICAgICAgIGNicls4XSA9ICh1OCljOwotICAgICAgICAgICAgICAgIGMgPSAoKHZhbCAqIHRtcDIgKyB4RnJhYyAqIHRtcDQpIDw8IDMpICsgMzI7Ci0gICAgICAgICAgICAgICAgYyA+Pj0gNjsKLSAgICAgICAgICAgICAgICAqY2JyKysgPSAodTgpYzsKLSAgICAgICAgICAgICAgICB0bXAxID0gcHRyQVt3aWR0aF07Ci0gICAgICAgICAgICAgICAgdG1wMiA9ICpwdHJBOwotICAgICAgICAgICAgICAgIGMgPSAoKHZhbCAqIHRtcDMgKyB4RnJhYyAqIHRtcDEpIDw8IDMpICsgMzI7Ci0gICAgICAgICAgICAgICAgYyA+Pj0gNjsKLSAgICAgICAgICAgICAgICBjYnJbOF0gPSAodTgpYzsKLSAgICAgICAgICAgICAgICBjID0gKCh2YWwgKiB0bXA0ICsgeEZyYWMgKiB0bXAyKSA8PCAzKSArIDMyOwotICAgICAgICAgICAgICAgIGMgPj49IDY7Ci0gICAgICAgICAgICAgICAgKmNicisrID0gKHU4KWM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYnIgKz0gMio4IC0gY2hyb21hUGFydFdpZHRoOwotICAgICAgICAgICAgcHRyQSArPSAyKndpZHRoIC0gY2hyb21hUGFydFdpZHRoOwotICAgICAgICB9Ci0gICAgfQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEludGVycG9sYXRlQ2hyb21hVmVyCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGNocm9tYSBpbnRlcnBvbGF0aW9uIGluIHZlcnRpY2FsIGRpcmVjdGlvbi4KLSAgICAgICAgICBPdmVyZmlsbGluZyBpcyBkb25lIG9ubHkgaWYgbmVlZGVkLiBSZWZlcmVuY2UgaW1hZ2UgKHBSZWYpIGlzCi0gICAgICAgICAgcmVhZCBhdCBjb3JyZWN0IHBvc2l0aW9uIGFuZCB0aGUgcHJlZGljdGVkIHBhcnQgaXMgd3JpdHRlbiB0bwotICAgICAgICAgIG1hY3JvYmxvY2sncyBjaHJvbWluYW5jZSAocHJlZFBhcnRDaHJvbWEpCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hVmVyKAotICB1OCAqcFJlZiwKLSAgdTggKnByZWRQYXJ0Q2hyb21hLAotICBpMzIgeDAsCi0gIGkzMiB5MCwKLSAgdTMyIHdpZHRoLAotICB1MzIgaGVpZ2h0LAotICB1MzIgeUZyYWMsCi0gIHUzMiBjaHJvbWFQYXJ0V2lkdGgsCi0gIHUzMiBjaHJvbWFQYXJ0SGVpZ2h0KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB4LCB5LCB0bXAxLCB0bXAyLCB0bXAzLCBjLCB2YWw7Ci0gICAgdTggKnB0ckEsICpjYnI7Ci0gICAgdTMyIGNvbXA7Ci0gICAgdTggYmxvY2tbOSo4KjJdOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocHJlZFBhcnRDaHJvbWEpOwotICAgIEFTU0VSVChjaHJvbWFQYXJ0V2lkdGgpOwotICAgIEFTU0VSVChjaHJvbWFQYXJ0SGVpZ2h0KTsKLSAgICBBU1NFUlQoeUZyYWMgPCA4KTsKLSAgICBBU1NFUlQocFJlZik7Ci0KLSAgICBpZiAoKHgwIDwgMCkgfHwgKCh1MzIpeDArY2hyb21hUGFydFdpZHRoID4gd2lkdGgpIHx8Ci0gICAgICAgICh5MCA8IDApIHx8ICgodTMyKXkwK2Nocm9tYVBhcnRIZWlnaHQrMSA+IGhlaWdodCkpCi0gICAgewotICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHBSZWYsIGJsb2NrLCB4MCwgeTAsIHdpZHRoLCBoZWlnaHQsIGNocm9tYVBhcnRXaWR0aCwKLSAgICAgICAgICAgIGNocm9tYVBhcnRIZWlnaHQgKyAxLCBjaHJvbWFQYXJ0V2lkdGgpOwotICAgICAgICBwUmVmICs9IHdpZHRoICogaGVpZ2h0OwotICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHBSZWYsIGJsb2NrICsgY2hyb21hUGFydFdpZHRoKihjaHJvbWFQYXJ0SGVpZ2h0KzEpLAotICAgICAgICAgICAgeDAsIHkwLCB3aWR0aCwgaGVpZ2h0LCBjaHJvbWFQYXJ0V2lkdGgsCi0gICAgICAgICAgICBjaHJvbWFQYXJ0SGVpZ2h0ICsgMSwgY2hyb21hUGFydFdpZHRoKTsKLQotICAgICAgICBwUmVmID0gYmxvY2s7Ci0gICAgICAgIHgwID0gMDsKLSAgICAgICAgeTAgPSAwOwotICAgICAgICB3aWR0aCA9IGNocm9tYVBhcnRXaWR0aDsKLSAgICAgICAgaGVpZ2h0ID0gY2hyb21hUGFydEhlaWdodCsxOwotICAgIH0KLQotICAgIHZhbCA9IDggLSB5RnJhYzsKLQotICAgIGZvciAoY29tcCA9IDA7IGNvbXAgPD0gMTsgY29tcCsrKQotICAgIHsKLQotICAgICAgICBwdHJBID0gcFJlZiArIChjb21wICogaGVpZ2h0ICsgKHUzMil5MCkgKiB3aWR0aCArIHgwOwotICAgICAgICBjYnIgPSBwcmVkUGFydENocm9tYSArIGNvbXAgKiA4ICogODsKLQotICAgICAgICAvKiAyeDIgcGVscyBwZXIgaXRlcmF0aW9uCi0gICAgICAgICAqIGJpbGluZWFyIHZlcnRpY2FsIGludGVycG9sYXRpb24gKi8KLSAgICAgICAgZm9yICh5ID0gKGNocm9tYVBhcnRIZWlnaHQgPj4gMSk7IHk7IHktLSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICh4ID0gKGNocm9tYVBhcnRXaWR0aCA+PiAxKTsgeDsgeC0tKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRtcDMgPSBwdHJBW3dpZHRoKjJdOwotICAgICAgICAgICAgICAgIHRtcDIgPSBwdHJBW3dpZHRoXTsKLSAgICAgICAgICAgICAgICB0bXAxID0gKnB0ckErKzsKLSAgICAgICAgICAgICAgICBjID0gKCh2YWwgKiB0bXAyICsgeUZyYWMgKiB0bXAzKSA8PCAzKSArIDMyOwotICAgICAgICAgICAgICAgIGMgPj49IDY7Ci0gICAgICAgICAgICAgICAgY2JyWzhdID0gKHU4KWM7Ci0gICAgICAgICAgICAgICAgYyA9ICgodmFsICogdG1wMSArIHlGcmFjICogdG1wMikgPDwgMykgKyAzMjsKLSAgICAgICAgICAgICAgICBjID4+PSA2OwotICAgICAgICAgICAgICAgICpjYnIrKyA9ICh1OCljOwotICAgICAgICAgICAgICAgIHRtcDMgPSBwdHJBW3dpZHRoKjJdOwotICAgICAgICAgICAgICAgIHRtcDIgPSBwdHJBW3dpZHRoXTsKLSAgICAgICAgICAgICAgICB0bXAxID0gKnB0ckErKzsKLSAgICAgICAgICAgICAgICBjID0gKCh2YWwgKiB0bXAyICsgeUZyYWMgKiB0bXAzKSA8PCAzKSArIDMyOwotICAgICAgICAgICAgICAgIGMgPj49IDY7Ci0gICAgICAgICAgICAgICAgY2JyWzhdID0gKHU4KWM7Ci0gICAgICAgICAgICAgICAgYyA9ICgodmFsICogdG1wMSArIHlGcmFjICogdG1wMikgPDwgMykgKyAzMjsKLSAgICAgICAgICAgICAgICBjID4+PSA2OwotICAgICAgICAgICAgICAgICpjYnIrKyA9ICh1OCljOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2JyICs9IDIqOCAtIGNocm9tYVBhcnRXaWR0aDsKLSAgICAgICAgICAgIHB0ckEgKz0gMip3aWR0aCAtIGNocm9tYVBhcnRXaWR0aDsKLSAgICAgICAgfQotICAgIH0KLQotfQotI2VuZGlmCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYUhvclZlcgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBjaHJvbWEgaW50ZXJwb2xhdGlvbiBpbiBob3Jpem9udGFsIGFuZAotICAgICAgICAgIHZlcnRpY2FsIGRpcmVjdGlvbi4gT3ZlcmZpbGxpbmcgaXMgZG9uZSBvbmx5IGlmIG5lZWRlZC4gUmVmZXJlbmNlCi0gICAgICAgICAgaW1hZ2UgKHJlZikgaXMgcmVhZCBhdCBjb3JyZWN0IHBvc2l0aW9uIGFuZCB0aGUgcHJlZGljdGVkIHBhcnQKLSAgICAgICAgICBpcyB3cml0dGVuIHRvIG1hY3JvYmxvY2sncyBjaHJvbWluYW5jZSAocHJlZFBhcnRDaHJvbWEpCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yVmVyKAotICB1OCAqcmVmLAotICB1OCAqcHJlZFBhcnRDaHJvbWEsCi0gIGkzMiB4MCwKLSAgaTMyIHkwLAotICB1MzIgd2lkdGgsCi0gIHUzMiBoZWlnaHQsCi0gIHUzMiB4RnJhYywKLSAgdTMyIHlGcmFjLAotICB1MzIgY2hyb21hUGFydFdpZHRoLAotICB1MzIgY2hyb21hUGFydEhlaWdodCkKLXsKLSAgICB1OCBibG9ja1s5KjkqMl07Ci0gICAgdTMyIHgsIHksIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHZhbFgsIHZhbFksIHBsdXMzMiA9IDMyOwotICAgIHUzMiBjb21wOwotICAgIHU4ICpwdHJBLCAqY2JyOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocHJlZFBhcnRDaHJvbWEpOwotICAgIEFTU0VSVChjaHJvbWFQYXJ0V2lkdGgpOwotICAgIEFTU0VSVChjaHJvbWFQYXJ0SGVpZ2h0KTsKLSAgICBBU1NFUlQoeEZyYWMgPCA4KTsKLSAgICBBU1NFUlQoeUZyYWMgPCA4KTsKLSAgICBBU1NFUlQocmVmKTsKLQotICAgIGlmICgoeDAgPCAwKSB8fCAoKHUzMil4MCtjaHJvbWFQYXJ0V2lkdGgrMSA+IHdpZHRoKSB8fAotICAgICAgICAoeTAgPCAwKSB8fCAoKHUzMil5MCtjaHJvbWFQYXJ0SGVpZ2h0KzEgPiBoZWlnaHQpKQotICAgIHsKLSAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhyZWYsIGJsb2NrLCB4MCwgeTAsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICBjaHJvbWFQYXJ0V2lkdGggKyAxLCBjaHJvbWFQYXJ0SGVpZ2h0ICsgMSwgY2hyb21hUGFydFdpZHRoICsgMSk7Ci0gICAgICAgIHJlZiArPSB3aWR0aCAqIGhlaWdodDsKLSAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhyZWYsIGJsb2NrICsgKGNocm9tYVBhcnRXaWR0aCsxKSooY2hyb21hUGFydEhlaWdodCsxKSwKLSAgICAgICAgICAgIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwgY2hyb21hUGFydFdpZHRoICsgMSwKLSAgICAgICAgICAgIGNocm9tYVBhcnRIZWlnaHQgKyAxLCBjaHJvbWFQYXJ0V2lkdGggKyAxKTsKLQotICAgICAgICByZWYgPSBibG9jazsKLSAgICAgICAgeDAgPSAwOwotICAgICAgICB5MCA9IDA7Ci0gICAgICAgIHdpZHRoID0gY2hyb21hUGFydFdpZHRoKzE7Ci0gICAgICAgIGhlaWdodCA9IGNocm9tYVBhcnRIZWlnaHQrMTsKLSAgICB9Ci0KLSAgICB2YWxYID0gOCAtIHhGcmFjOwotICAgIHZhbFkgPSA4IC0geUZyYWM7Ci0KLSAgICBmb3IgKGNvbXAgPSAwOyBjb21wIDw9IDE7IGNvbXArKykKLSAgICB7Ci0KLSAgICAgICAgcHRyQSA9IHJlZiArIChjb21wICogaGVpZ2h0ICsgKHUzMil5MCkgKiB3aWR0aCArIHgwOwotICAgICAgICBjYnIgPSBwcmVkUGFydENocm9tYSArIGNvbXAgKiA4ICogODsKLQotICAgICAgICAvKiAyeDIgcGVscyBwZXIgaXRlcmF0aW9uCi0gICAgICAgICAqIGJpbGluZWFyIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIGludGVycG9sYXRpb24gKi8KLSAgICAgICAgZm9yICh5ID0gKGNocm9tYVBhcnRIZWlnaHQgPj4gMSk7IHk7IHktLSkKLSAgICAgICAgewotICAgICAgICAgICAgdG1wMSA9ICpwdHJBOwotICAgICAgICAgICAgdG1wMyA9IHB0ckFbd2lkdGhdOwotICAgICAgICAgICAgdG1wNSA9IHB0ckFbd2lkdGgqMl07Ci0gICAgICAgICAgICB0bXAxICo9IHZhbFk7Ci0gICAgICAgICAgICB0bXAxICs9IHRtcDMgKiB5RnJhYzsKLSAgICAgICAgICAgIHRtcDMgKj0gdmFsWTsKLSAgICAgICAgICAgIHRtcDMgKz0gdG1wNSAqIHlGcmFjOwotICAgICAgICAgICAgZm9yICh4ID0gKGNocm9tYVBhcnRXaWR0aCA+PiAxKTsgeDsgeC0tKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRtcDIgPSAqKytwdHJBOwotICAgICAgICAgICAgICAgIHRtcDQgPSBwdHJBW3dpZHRoXTsKLSAgICAgICAgICAgICAgICB0bXA2ID0gcHRyQVt3aWR0aCoyXTsKLSAgICAgICAgICAgICAgICB0bXAyICo9IHZhbFk7Ci0gICAgICAgICAgICAgICAgdG1wMiArPSB0bXA0ICogeUZyYWM7Ci0gICAgICAgICAgICAgICAgdG1wNCAqPSB2YWxZOwotICAgICAgICAgICAgICAgIHRtcDQgKz0gdG1wNiAqIHlGcmFjOwotICAgICAgICAgICAgICAgIHRtcDEgPSB0bXAxICogdmFsWCArIHBsdXMzMjsKLSAgICAgICAgICAgICAgICB0bXAzID0gdG1wMyAqIHZhbFggKyBwbHVzMzI7Ci0gICAgICAgICAgICAgICAgdG1wMSArPSB0bXAyICogeEZyYWM7Ci0gICAgICAgICAgICAgICAgdG1wMSA+Pj0gNjsKLSAgICAgICAgICAgICAgICB0bXAzICs9IHRtcDQgKiB4RnJhYzsKLSAgICAgICAgICAgICAgICB0bXAzID4+PSA2OwotICAgICAgICAgICAgICAgIGNicls4XSA9ICh1OCl0bXAzOwotICAgICAgICAgICAgICAgICpjYnIrKyA9ICh1OCl0bXAxOwotCi0gICAgICAgICAgICAgICAgdG1wMSA9ICorK3B0ckE7Ci0gICAgICAgICAgICAgICAgdG1wMyA9IHB0ckFbd2lkdGhdOwotICAgICAgICAgICAgICAgIHRtcDUgPSBwdHJBW3dpZHRoKjJdOwotICAgICAgICAgICAgICAgIHRtcDEgKj0gdmFsWTsKLSAgICAgICAgICAgICAgICB0bXAxICs9IHRtcDMgKiB5RnJhYzsKLSAgICAgICAgICAgICAgICB0bXAzICo9IHZhbFk7Ci0gICAgICAgICAgICAgICAgdG1wMyArPSB0bXA1ICogeUZyYWM7Ci0gICAgICAgICAgICAgICAgdG1wMiA9IHRtcDIgKiB2YWxYICsgcGx1czMyOwotICAgICAgICAgICAgICAgIHRtcDQgPSB0bXA0ICogdmFsWCArIHBsdXMzMjsKLSAgICAgICAgICAgICAgICB0bXAyICs9IHRtcDEgKiB4RnJhYzsKLSAgICAgICAgICAgICAgICB0bXAyID4+PSA2OwotICAgICAgICAgICAgICAgIHRtcDQgKz0gdG1wMyAqIHhGcmFjOwotICAgICAgICAgICAgICAgIHRtcDQgPj49IDY7Ci0gICAgICAgICAgICAgICAgY2JyWzhdID0gKHU4KXRtcDQ7Ci0gICAgICAgICAgICAgICAgKmNicisrID0gKHU4KXRtcDI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYnIgKz0gMio4IC0gY2hyb21hUGFydFdpZHRoOwotICAgICAgICAgICAgcHRyQSArPSAyKndpZHRoIC0gY2hyb21hUGFydFdpZHRoOwotICAgICAgICB9Ci0gICAgfQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogUHJlZGljdENocm9tYQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgVG9wIGxldmVsIGNocm9tYSBwcmVkaWN0aW9uIGZ1bmN0aW9uIHRoYXQgY2FsbHMgdGhlIGFwcHJvcHJpYXRlCi0gICAgICAgICAgaW50ZXJwb2xhdGlvbiBmdW5jdGlvbi4gVGhlIG91dHB1dCBpcyB3cml0dGVuIHRvIG1hY3JvYmxvY2sgYXJyYXkuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB2b2lkIFByZWRpY3RDaHJvbWEoCi0gIHU4ICptYlBhcnRDaHJvbWEsCi0gIHUzMiB4QUwsCi0gIHUzMiB5QUwsCi0gIHUzMiBwYXJ0V2lkdGgsCi0gIHUzMiBwYXJ0SGVpZ2h0LAotICBtdl90ICptdiwKLSAgaW1hZ2VfdCAqcmVmUGljKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB4RnJhYywgeUZyYWMsIHdpZHRoLCBoZWlnaHQsIGNocm9tYVBhcnRXaWR0aCwgY2hyb21hUGFydEhlaWdodDsKLSAgICBpMzIgeEludCwgeUludDsKLSAgICB1OCAqcmVmOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQobXYpOwotICAgIEFTU0VSVChyZWZQaWMpOwotICAgIEFTU0VSVChyZWZQaWMtPmRhdGEpOwotICAgIEFTU0VSVChyZWZQaWMtPndpZHRoKTsKLSAgICBBU1NFUlQocmVmUGljLT5oZWlnaHQpOwotCi0gICAgd2lkdGggID0gOCAqIHJlZlBpYy0+d2lkdGg7Ci0gICAgaGVpZ2h0ID0gOCAqIHJlZlBpYy0+aGVpZ2h0OwotCi0gICAgeEludCA9ICh4QUwgPj4gMSkgKyAobXYtPmhvciA+PiAzKTsKLSAgICB5SW50ID0gKHlBTCA+PiAxKSArIChtdi0+dmVyID4+IDMpOwotICAgIHhGcmFjID0gbXYtPmhvciAmIDB4NzsKLSAgICB5RnJhYyA9IG12LT52ZXIgJiAweDc7Ci0KLSAgICBjaHJvbWFQYXJ0V2lkdGggID0gcGFydFdpZHRoID4+IDE7Ci0gICAgY2hyb21hUGFydEhlaWdodCA9IHBhcnRIZWlnaHQgPj4gMTsKLSAgICByZWYgPSByZWZQaWMtPmRhdGEgKyAyNTYgKiByZWZQaWMtPndpZHRoICogcmVmUGljLT5oZWlnaHQ7Ci0KLSAgICBpZiAoeEZyYWMgJiYgeUZyYWMpCi0gICAgewotICAgICAgICBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFIb3JWZXIocmVmLCBtYlBhcnRDaHJvbWEsIHhJbnQsIHlJbnQsIHdpZHRoLAotICAgICAgICAgICAgICAgIGhlaWdodCwgeEZyYWMsIHlGcmFjLCBjaHJvbWFQYXJ0V2lkdGgsIGNocm9tYVBhcnRIZWlnaHQpOwotICAgIH0KLSAgICBlbHNlIGlmICh4RnJhYykKLSAgICB7Ci0gICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYUhvcihyZWYsIG1iUGFydENocm9tYSwgeEludCwgeUludCwgd2lkdGgsCi0gICAgICAgICAgICAgICAgaGVpZ2h0LCB4RnJhYywgY2hyb21hUGFydFdpZHRoLCBjaHJvbWFQYXJ0SGVpZ2h0KTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoeUZyYWMpCi0gICAgewotICAgICAgICBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFWZXIocmVmLCBtYlBhcnRDaHJvbWEsIHhJbnQsIHlJbnQsIHdpZHRoLAotICAgICAgICAgICAgICAgIGhlaWdodCwgeUZyYWMsIGNocm9tYVBhcnRXaWR0aCwgY2hyb21hUGFydEhlaWdodCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGgyNjRic2RGaWxsQmxvY2socmVmLCBtYlBhcnRDaHJvbWEsIHhJbnQsIHlJbnQsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICBjaHJvbWFQYXJ0V2lkdGgsIGNocm9tYVBhcnRIZWlnaHQsIDgpOwotICAgICAgICByZWYgKz0gd2lkdGggKiBoZWlnaHQ7Ci0gICAgICAgIGgyNjRic2RGaWxsQmxvY2socmVmLCBtYlBhcnRDaHJvbWEgKyA4KjgsIHhJbnQsIHlJbnQsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICBjaHJvbWFQYXJ0V2lkdGgsIGNocm9tYVBhcnRIZWlnaHQsIDgpOwotICAgIH0KLQotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEludGVycG9sYXRlVmVySGFsZgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgRnVuY3Rpb24gdG8gcGVyZm9ybSB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uIG9mIHBpeGVsIHBvc2l0aW9uICdoJwotICAgICAgICAgIGZvciBhIGJsb2NrLiBPdmVyZmlsbGluZyBpcyBkb25lIG9ubHkgaWYgbmVlZGVkLiBSZWZlcmVuY2UKLSAgICAgICAgICBpbWFnZSAocmVmKSBpcyByZWFkIGF0IGNvcnJlY3QgcG9zaXRpb24gYW5kIHRoZSBwcmVkaWN0ZWQgcGFydAotICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gbWFjcm9ibG9jayBhcnJheSAobWIpCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWZuZGVmIEgyNjRERUNfQVJNMTEKLXZvaWQgaDI2NGJzZEludGVycG9sYXRlVmVySGFsZigKLSAgdTggKnJlZiwKLSAgdTggKm1iLAotICBpMzIgeDAsCi0gIGkzMiB5MCwKLSAgdTMyIHdpZHRoLAotICB1MzIgaGVpZ2h0LAotICB1MzIgcGFydFdpZHRoLAotICB1MzIgcGFydEhlaWdodCkKLXsKLSAgICB1MzIgcDFbMjEqMjEvNCsxXTsKLSAgICB1MzIgaSwgajsKLSAgICBpMzIgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKLSAgICB1OCAqcHRyQywgKnB0clY7Ci0gICAgY29uc3QgdTggKmNscCA9IGgyNjRic2RDbGlwICsgNTEyOwotCi0gICAgLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHJlZik7Ci0gICAgQVNTRVJUKG1iKTsKLQotICAgIGlmICgoeDAgPCAwKSB8fCAoKHUzMil4MCtwYXJ0V2lkdGggPiB3aWR0aCkgfHwKLSAgICAgICAgKHkwIDwgMCkgfHwgKCh1MzIpeTArcGFydEhlaWdodCs1ID4gaGVpZ2h0KSkKLSAgICB7Ci0gICAgICAgIGgyNjRic2RGaWxsQmxvY2socmVmLCAodTgqKXAxLCB4MCwgeTAsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgcGFydFdpZHRoLCBwYXJ0SGVpZ2h0KzUsIHBhcnRXaWR0aCk7Ci0KLSAgICAgICAgeDAgPSAwOwotICAgICAgICB5MCA9IDA7Ci0gICAgICAgIHJlZiA9ICh1OCopcDE7Ci0gICAgICAgIHdpZHRoID0gcGFydFdpZHRoOwotICAgIH0KLQotICAgIHJlZiArPSAodTMyKXkwICogd2lkdGggKyAodTMyKXgwOwotCi0gICAgcHRyQyA9IHJlZiArIHdpZHRoOwotICAgIHB0clYgPSBwdHJDICsgNSp3aWR0aDsKLQotICAgIC8qIDQgcGl4ZWxzIHBlciBpdGVyYXRpb24sIGludGVycG9sYXRlIHVzaW5nIDUgdmVydGljYWwgc2FtcGxlcyAqLwotICAgIGZvciAoaSA9IChwYXJ0SGVpZ2h0ID4+IDIpOyBpOyBpLS0pCi0gICAgewotICAgICAgICAvKiBoMSA9ICgxNiArIEEgKyAxNihHK00pICsgNChHK00pIC0gNChDK1IpIC0gKEMrUikgKyBUKSA+PiA1ICovCi0gICAgICAgIGZvciAoaiA9IHBhcnRXaWR0aDsgajsgai0tKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXA0ID0gcHRyVlstKGkzMil3aWR0aCoyXTsKLSAgICAgICAgICAgIHRtcDUgPSBwdHJWWy0oaTMyKXdpZHRoXTsKLSAgICAgICAgICAgIHRtcDEgPSBwdHJWW3dpZHRoXTsKLSAgICAgICAgICAgIHRtcDIgPSBwdHJWW3dpZHRoKjJdOwotICAgICAgICAgICAgdG1wNiA9ICpwdHJWKys7Ci0KLSAgICAgICAgICAgIHRtcDcgPSB0bXA0ICsgdG1wMTsKLSAgICAgICAgICAgIHRtcDIgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXAyIC09IHRtcDc7Ci0gICAgICAgICAgICB0bXAyICs9IDE2OwotICAgICAgICAgICAgdG1wNyA9IHRtcDUgKyB0bXA2OwotICAgICAgICAgICAgdG1wMyA9IHB0ckNbd2lkdGgqMl07Ci0gICAgICAgICAgICB0bXAyICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wMiArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDIgKz0gdG1wMzsKLSAgICAgICAgICAgIHRtcDIgPSBjbHBbdG1wMj4+NV07Ci0gICAgICAgICAgICB0bXAxICs9IDE2OwotICAgICAgICAgICAgbWJbNDhdID0gKHU4KXRtcDI7Ci0KLSAgICAgICAgICAgIHRtcDcgPSB0bXAzICsgdG1wNjsKLSAgICAgICAgICAgIHRtcDEgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXAxIC09IHRtcDc7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDU7Ci0gICAgICAgICAgICB0bXAyID0gcHRyQ1t3aWR0aF07Ci0gICAgICAgICAgICB0bXAxICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wMSArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDEgKz0gdG1wMjsKLSAgICAgICAgICAgIHRtcDEgPSBjbHBbdG1wMT4+NV07Ci0gICAgICAgICAgICB0bXA2ICs9IDE2OwotICAgICAgICAgICAgbWJbMzJdID0gKHU4KXRtcDE7Ci0KLSAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wNTsKLSAgICAgICAgICAgIHRtcDYgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA2IC09IHRtcDc7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDM7Ci0gICAgICAgICAgICB0bXAxID0gKnB0ckM7Ci0gICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDYgKz0gdG1wMTsKLSAgICAgICAgICAgIHRtcDYgPSBjbHBbdG1wNj4+NV07Ci0gICAgICAgICAgICB0bXA1ICs9IDE2OwotICAgICAgICAgICAgbWJbMTZdID0gKHU4KXRtcDY7Ci0KLSAgICAgICAgICAgIHRtcDEgKz0gdG1wNDsKLSAgICAgICAgICAgIHRtcDUgLT0gKHRtcDEgPDwgMik7Ci0gICAgICAgICAgICB0bXA1IC09IHRtcDE7Ci0gICAgICAgICAgICB0bXAzICs9IHRtcDI7Ci0gICAgICAgICAgICB0bXA2ID0gcHRyQ1stKGkzMil3aWR0aF07Ci0gICAgICAgICAgICB0bXA1ICs9ICh0bXAzIDw8IDQpOwotICAgICAgICAgICAgdG1wNSArPSAodG1wMyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDUgKz0gdG1wNjsKLSAgICAgICAgICAgIHRtcDUgPSBjbHBbdG1wNT4+NV07Ci0gICAgICAgICAgICAqbWIrKyA9ICh1OCl0bXA1OwotICAgICAgICAgICAgcHRyQysrOwotICAgICAgICB9Ci0gICAgICAgIHB0ckMgKz0gNCp3aWR0aCAtIHBhcnRXaWR0aDsKLSAgICAgICAgcHRyViArPSA0KndpZHRoIC0gcGFydFdpZHRoOwotICAgICAgICBtYiArPSA0KjE2IC0gcGFydFdpZHRoOwotICAgIH0KLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RJbnRlcnBvbGF0ZVZlclF1YXJ0ZXIKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIEZ1bmN0aW9uIHRvIHBlcmZvcm0gdmVydGljYWwgaW50ZXJwb2xhdGlvbiBvZiBwaXhlbCBwb3NpdGlvbiAnZCcKLSAgICAgICAgICBvciAnbicgZm9yIGEgYmxvY2suIE92ZXJmaWxsaW5nIGlzIGRvbmUgb25seSBpZiBuZWVkZWQuIFJlZmVyZW5jZQotICAgICAgICAgIGltYWdlIChyZWYpIGlzIHJlYWQgYXQgY29ycmVjdCBwb3NpdGlvbiBhbmQgdGhlIHByZWRpY3RlZCBwYXJ0Ci0gICAgICAgICAgaXMgd3JpdHRlbiB0byBtYWNyb2Jsb2NrIGFycmF5IChtYikKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVWZXJRdWFydGVyKAotICB1OCAqcmVmLAotICB1OCAqbWIsCi0gIGkzMiB4MCwKLSAgaTMyIHkwLAotICB1MzIgd2lkdGgsCi0gIHUzMiBoZWlnaHQsCi0gIHUzMiBwYXJ0V2lkdGgsCi0gIHUzMiBwYXJ0SGVpZ2h0LAotICB1MzIgdmVyT2Zmc2V0KSAgICAvKiAwIGZvciBwaXhlbCBkLCAxIGZvciBwaXhlbCBuICovCi17Ci0gICAgdTMyIHAxWzIxKjIxLzQrMV07Ci0gICAgdTMyIGksIGo7Ci0gICAgaTMyIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7Ci0gICAgdTggKnB0ckMsICpwdHJWLCAqcHRySW50OwotICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKLQotICAgIC8qIENvZGUgKi8KLQotICAgIEFTU0VSVChyZWYpOwotICAgIEFTU0VSVChtYik7Ci0KLSAgICBpZiAoKHgwIDwgMCkgfHwgKCh1MzIpeDArcGFydFdpZHRoID4gd2lkdGgpIHx8Ci0gICAgICAgICh5MCA8IDApIHx8ICgodTMyKXkwK3BhcnRIZWlnaHQrNSA+IGhlaWdodCkpCi0gICAgewotICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHJlZiwgKHU4KilwMSwgeDAsIHkwLCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgICAgIHBhcnRXaWR0aCwgcGFydEhlaWdodCs1LCBwYXJ0V2lkdGgpOwotCi0gICAgICAgIHgwID0gMDsKLSAgICAgICAgeTAgPSAwOwotICAgICAgICByZWYgPSAodTgqKXAxOwotICAgICAgICB3aWR0aCA9IHBhcnRXaWR0aDsKLSAgICB9Ci0KLSAgICByZWYgKz0gKHUzMil5MCAqIHdpZHRoICsgKHUzMil4MDsKLQotICAgIHB0ckMgPSByZWYgKyB3aWR0aDsKLSAgICBwdHJWID0gcHRyQyArIDUqd2lkdGg7Ci0KLSAgICAvKiBQb2ludGVyIHRvIGludGVnZXIgc2FtcGxlIHBvc2l0aW9uLCBlaXRoZXIgTSBvciBSICovCi0gICAgcHRySW50ID0gcHRyQyArICgyK3Zlck9mZnNldCkqd2lkdGg7Ci0KLSAgICAvKiA0IHBpeGVscyBwZXIgaXRlcmF0aW9uCi0gICAgICogaW50ZXJwb2xhdGUgdXNpbmcgNSB2ZXJ0aWNhbCBzYW1wbGVzIGFuZCBhdmVyYWdlIGJldHdlZW4KLSAgICAgKiBpbnRlcnBvbGF0ZWQgdmFsdWUgYW5kIGludGVnZXIgc2FtcGxlIHZhbHVlICovCi0gICAgZm9yIChpID0gKHBhcnRIZWlnaHQgPj4gMik7IGk7IGktLSkKLSAgICB7Ci0gICAgICAgIC8qIGgxID0gKDE2ICsgQSArIDE2KEcrTSkgKyA0KEcrTSkgLSA0KEMrUikgLSAoQytSKSArIFQpID4+IDUgKi8KLSAgICAgICAgZm9yIChqID0gcGFydFdpZHRoOyBqOyBqLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcDQgPSBwdHJWWy0oaTMyKXdpZHRoKjJdOwotICAgICAgICAgICAgdG1wNSA9IHB0clZbLShpMzIpd2lkdGhdOwotICAgICAgICAgICAgdG1wMSA9IHB0clZbd2lkdGhdOwotICAgICAgICAgICAgdG1wMiA9IHB0clZbd2lkdGgqMl07Ci0gICAgICAgICAgICB0bXA2ID0gKnB0clYrKzsKLQotICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXAxOwotICAgICAgICAgICAgdG1wMiAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDIgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDIgKz0gMTY7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNSArIHRtcDY7Ci0gICAgICAgICAgICB0bXAzID0gcHRyQ1t3aWR0aCoyXTsKLSAgICAgICAgICAgIHRtcDIgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXAyICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wMiArPSB0bXAzOwotICAgICAgICAgICAgdG1wMiA9IGNscFt0bXAyPj41XTsKLSAgICAgICAgICAgIHRtcDcgPSBwdHJJbnRbd2lkdGgqMl07Ci0gICAgICAgICAgICB0bXAxICs9IDE2OwotICAgICAgICAgICAgdG1wMisrOwotICAgICAgICAgICAgbWJbNDhdID0gKHU4KSgodG1wMiArIHRtcDcpID4+IDEpOwotCi0gICAgICAgICAgICB0bXA3ID0gdG1wMyArIHRtcDY7Ci0gICAgICAgICAgICB0bXAxIC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wMSAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXA1OwotICAgICAgICAgICAgdG1wMiA9IHB0ckNbd2lkdGhdOwotICAgICAgICAgICAgdG1wMSArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDEgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXAxICs9IHRtcDI7Ci0gICAgICAgICAgICB0bXAxID0gY2xwW3RtcDE+PjVdOwotICAgICAgICAgICAgdG1wNyA9IHB0ckludFt3aWR0aF07Ci0gICAgICAgICAgICB0bXA2ICs9IDE2OwotICAgICAgICAgICAgdG1wMSsrOwotICAgICAgICAgICAgbWJbMzJdID0gKHU4KSgodG1wMSArIHRtcDcpID4+IDEpOwotCi0gICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDU7Ci0gICAgICAgICAgICB0bXA2IC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNiAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXAzOwotICAgICAgICAgICAgdG1wMSA9ICpwdHJDOwotICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA2ICs9IHRtcDE7Ci0gICAgICAgICAgICB0bXA2ID0gY2xwW3RtcDY+PjVdOwotICAgICAgICAgICAgdG1wNyA9ICpwdHJJbnQ7Ci0gICAgICAgICAgICB0bXA1ICs9IDE2OwotICAgICAgICAgICAgdG1wNisrOwotICAgICAgICAgICAgbWJbMTZdID0gKHU4KSgodG1wNiArIHRtcDcpID4+IDEpOwotCi0gICAgICAgICAgICB0bXAxICs9IHRtcDQ7Ci0gICAgICAgICAgICB0bXA1IC09ICh0bXAxIDw8IDIpOwotICAgICAgICAgICAgdG1wNSAtPSB0bXAxOwotICAgICAgICAgICAgdG1wMyArPSB0bXAyOwotICAgICAgICAgICAgdG1wNiA9IHB0ckNbLShpMzIpd2lkdGhdOwotICAgICAgICAgICAgdG1wNSArPSAodG1wMyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDUgKz0gKHRtcDMgPDwgMik7Ci0gICAgICAgICAgICB0bXA1ICs9IHRtcDY7Ci0gICAgICAgICAgICB0bXA1ID0gY2xwW3RtcDU+PjVdOwotICAgICAgICAgICAgdG1wNyA9IHB0ckludFstKGkzMil3aWR0aF07Ci0gICAgICAgICAgICB0bXA1Kys7Ci0gICAgICAgICAgICAqbWIrKyA9ICh1OCkoKHRtcDUgKyB0bXA3KSA+PiAxKTsKLSAgICAgICAgICAgIHB0ckMrKzsKLSAgICAgICAgICAgIHB0ckludCsrOwotICAgICAgICB9Ci0gICAgICAgIHB0ckMgKz0gNCp3aWR0aCAtIHBhcnRXaWR0aDsKLSAgICAgICAgcHRyViArPSA0KndpZHRoIC0gcGFydFdpZHRoOwotICAgICAgICBwdHJJbnQgKz0gNCp3aWR0aCAtIHBhcnRXaWR0aDsKLSAgICAgICAgbWIgKz0gNCoxNiAtIHBhcnRXaWR0aDsKLSAgICB9Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkSW50ZXJwb2xhdGVIb3JIYWxmCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBGdW5jdGlvbiB0byBwZXJmb3JtIGhvcml6b250YWwgaW50ZXJwb2xhdGlvbiBvZiBwaXhlbCBwb3NpdGlvbiAnYicKLSAgICAgICAgICBmb3IgYSBibG9jay4gT3ZlcmZpbGxpbmcgaXMgZG9uZSBvbmx5IGlmIG5lZWRlZC4gUmVmZXJlbmNlCi0gICAgICAgICAgaW1hZ2UgKHJlZikgaXMgcmVhZCBhdCBjb3JyZWN0IHBvc2l0aW9uIGFuZCB0aGUgcHJlZGljdGVkIHBhcnQKLSAgICAgICAgICBpcyB3cml0dGVuIHRvIG1hY3JvYmxvY2sgYXJyYXkgKG1iKQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIGgyNjRic2RJbnRlcnBvbGF0ZUhvckhhbGYoCi0gIHU4ICpyZWYsCi0gIHU4ICptYiwKLSAgaTMyIHgwLAotICBpMzIgeTAsCi0gIHUzMiB3aWR0aCwKLSAgdTMyIGhlaWdodCwKLSAgdTMyIHBhcnRXaWR0aCwKLSAgdTMyIHBhcnRIZWlnaHQpCi17Ci0gICAgdTMyIHAxWzIxKjIxLzQrMV07Ci0gICAgdTggKnB0cko7Ci0gICAgdTMyIHgsIHk7Ci0gICAgaTMyIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7Ci0gICAgY29uc3QgdTggKmNscCA9IGgyNjRic2RDbGlwICsgNTEyOwotCi0gICAgLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHJlZik7Ci0gICAgQVNTRVJUKG1iKTsKLSAgICBBU1NFUlQoKHBhcnRXaWR0aCYweDMpID09IDApOwotICAgIEFTU0VSVCgocGFydEhlaWdodCYweDMpID09IDApOwotCi0gICAgaWYgKCh4MCA8IDApIHx8ICgodTMyKXgwK3BhcnRXaWR0aCs1ID4gd2lkdGgpIHx8Ci0gICAgICAgICh5MCA8IDApIHx8ICgodTMyKXkwK3BhcnRIZWlnaHQgPiBoZWlnaHQpKQotICAgIHsKLSAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhyZWYsICh1OCopcDEsIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICBwYXJ0V2lkdGgrNSwgcGFydEhlaWdodCwgcGFydFdpZHRoKzUpOwotCi0gICAgICAgIHgwID0gMDsKLSAgICAgICAgeTAgPSAwOwotICAgICAgICByZWYgPSAodTgqKXAxOwotICAgICAgICB3aWR0aCA9IHBhcnRXaWR0aCArIDU7Ci0gICAgfQotCi0gICAgcmVmICs9ICh1MzIpeTAgKiB3aWR0aCArICh1MzIpeDA7Ci0KLSAgICBwdHJKID0gcmVmICsgNTsKLQotICAgIGZvciAoeSA9IHBhcnRIZWlnaHQ7IHk7IHktLSkKLSAgICB7Ci0gICAgICAgIHRtcDYgPSAqKHB0ckogLSA1KTsKLSAgICAgICAgdG1wNSA9ICoocHRySiAtIDQpOwotICAgICAgICB0bXA0ID0gKihwdHJKIC0gMyk7Ci0gICAgICAgIHRtcDMgPSAqKHB0ckogLSAyKTsKLSAgICAgICAgdG1wMiA9ICoocHRySiAtIDEpOwotCi0gICAgICAgIC8qIGNhbGN1bGF0ZSA0IHBlbHMgcGVyIGl0ZXJhdGlvbiAqLwotICAgICAgICBmb3IgKHggPSAocGFydFdpZHRoID4+IDIpOyB4OyB4LS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEZpcnN0IHBpeGVsICovCi0gICAgICAgICAgICB0bXA2ICs9IDE2OwotICAgICAgICAgICAgdG1wNyA9IHRtcDMgKyB0bXA0OwotICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDU7Ci0gICAgICAgICAgICB0bXAxID0gKnB0ckorKzsKLSAgICAgICAgICAgIHRtcDYgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA2IC09IHRtcDc7Ci0gICAgICAgICAgICB0bXA2ICs9IHRtcDE7Ci0gICAgICAgICAgICB0bXA2ID0gY2xwW3RtcDY+PjVdOwotICAgICAgICAgICAgLyogU2Vjb25kIHBpeGVsICovCi0gICAgICAgICAgICB0bXA1ICs9IDE2OwotICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXAzOwotICAgICAgICAgICAgKm1iKysgPSAodTgpdG1wNjsKLSAgICAgICAgICAgIHRtcDUgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXA1ICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNyA9IHRtcDEgKyB0bXA0OwotICAgICAgICAgICAgdG1wNiA9ICpwdHJKKys7Ci0gICAgICAgICAgICB0bXA1IC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNSAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNSArPSB0bXA2OwotICAgICAgICAgICAgdG1wNSA9IGNscFt0bXA1Pj41XTsKLSAgICAgICAgICAgIC8qIFRoaXJkIHBpeGVsICovCi0gICAgICAgICAgICB0bXA0ICs9IDE2OwotICAgICAgICAgICAgdG1wNyA9IHRtcDEgKyB0bXAyOwotICAgICAgICAgICAgKm1iKysgPSAodTgpdG1wNTsKLSAgICAgICAgICAgIHRtcDQgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXA0ICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNyA9IHRtcDYgKyB0bXAzOwotICAgICAgICAgICAgdG1wNSA9ICpwdHJKKys7Ci0gICAgICAgICAgICB0bXA0IC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNCAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNCArPSB0bXA1OwotICAgICAgICAgICAgdG1wNCA9IGNscFt0bXA0Pj41XTsKLSAgICAgICAgICAgIC8qIEZvdXJ0aCBwaXhlbCAqLwotICAgICAgICAgICAgdG1wMyArPSAxNjsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA2ICsgdG1wMTsKLSAgICAgICAgICAgICptYisrID0gKHU4KXRtcDQ7Ci0gICAgICAgICAgICB0bXAzICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wMyArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA1ICsgdG1wMjsKLSAgICAgICAgICAgIHRtcDQgPSAqcHRySisrOwotICAgICAgICAgICAgdG1wMyAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDMgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDMgKz0gdG1wNDsKLSAgICAgICAgICAgIHRtcDMgPSBjbHBbdG1wMz4+NV07Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNDsKLSAgICAgICAgICAgIHRtcDQgPSB0bXA2OwotICAgICAgICAgICAgdG1wNiA9IHRtcDI7Ci0gICAgICAgICAgICB0bXAyID0gdG1wNzsKLSAgICAgICAgICAgICptYisrID0gKHU4KXRtcDM7Ci0gICAgICAgICAgICB0bXAzID0gdG1wNTsKLSAgICAgICAgICAgIHRtcDUgPSB0bXAxOwotICAgICAgICB9Ci0gICAgICAgIHB0ckogKz0gd2lkdGggLSBwYXJ0V2lkdGg7Ci0gICAgICAgIG1iICs9IDE2IC0gcGFydFdpZHRoOwotICAgIH0KLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RJbnRlcnBvbGF0ZUhvclF1YXJ0ZXIKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIEZ1bmN0aW9uIHRvIHBlcmZvcm0gaG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uIG9mIHBpeGVsIHBvc2l0aW9uICdhJwotICAgICAgICAgIG9yICdjJyBmb3IgYSBibG9jay4gT3ZlcmZpbGxpbmcgaXMgZG9uZSBvbmx5IGlmIG5lZWRlZC4gUmVmZXJlbmNlCi0gICAgICAgICAgaW1hZ2UgKHJlZikgaXMgcmVhZCBhdCBjb3JyZWN0IHBvc2l0aW9uIGFuZCB0aGUgcHJlZGljdGVkIHBhcnQKLSAgICAgICAgICBpcyB3cml0dGVuIHRvIG1hY3JvYmxvY2sgYXJyYXkgKG1iKQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIGgyNjRic2RJbnRlcnBvbGF0ZUhvclF1YXJ0ZXIoCi0gIHU4ICpyZWYsCi0gIHU4ICptYiwKLSAgaTMyIHgwLAotICBpMzIgeTAsCi0gIHUzMiB3aWR0aCwKLSAgdTMyIGhlaWdodCwKLSAgdTMyIHBhcnRXaWR0aCwKLSAgdTMyIHBhcnRIZWlnaHQsCi0gIHUzMiBob3JPZmZzZXQpIC8qIDAgZm9yIHBpeGVsIGEsIDEgZm9yIHBpeGVsIGMgKi8KLXsKLSAgICB1MzIgcDFbMjEqMjEvNCsxXTsKLSAgICB1OCAqcHRySjsKLSAgICB1MzIgeCwgeTsKLSAgICBpMzIgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKLSAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7Ci0KLSAgICAvKiBDb2RlICovCi0KLSAgICBBU1NFUlQocmVmKTsKLSAgICBBU1NFUlQobWIpOwotCi0gICAgaWYgKCh4MCA8IDApIHx8ICgodTMyKXgwK3BhcnRXaWR0aCs1ID4gd2lkdGgpIHx8Ci0gICAgICAgICh5MCA8IDApIHx8ICgodTMyKXkwK3BhcnRIZWlnaHQgPiBoZWlnaHQpKQotICAgIHsKLSAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhyZWYsICh1OCopcDEsIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICBwYXJ0V2lkdGgrNSwgcGFydEhlaWdodCwgcGFydFdpZHRoKzUpOwotCi0gICAgICAgIHgwID0gMDsKLSAgICAgICAgeTAgPSAwOwotICAgICAgICByZWYgPSAodTgqKXAxOwotICAgICAgICB3aWR0aCA9IHBhcnRXaWR0aCArIDU7Ci0gICAgfQotCi0gICAgcmVmICs9ICh1MzIpeTAgKiB3aWR0aCArICh1MzIpeDA7Ci0KLSAgICBwdHJKID0gcmVmICsgNTsKLQotICAgIGZvciAoeSA9IHBhcnRIZWlnaHQ7IHk7IHktLSkKLSAgICB7Ci0gICAgICAgIHRtcDYgPSAqKHB0ckogLSA1KTsKLSAgICAgICAgdG1wNSA9ICoocHRySiAtIDQpOwotICAgICAgICB0bXA0ID0gKihwdHJKIC0gMyk7Ci0gICAgICAgIHRtcDMgPSAqKHB0ckogLSAyKTsKLSAgICAgICAgdG1wMiA9ICoocHRySiAtIDEpOwotCi0gICAgICAgIC8qIGNhbGN1bGF0ZSA0IHBlbHMgcGVyIGl0ZXJhdGlvbiAqLwotICAgICAgICBmb3IgKHggPSAocGFydFdpZHRoID4+IDIpOyB4OyB4LS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEZpcnN0IHBpeGVsICovCi0gICAgICAgICAgICB0bXA2ICs9IDE2OwotICAgICAgICAgICAgdG1wNyA9IHRtcDMgKyB0bXA0OwotICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDU7Ci0gICAgICAgICAgICB0bXAxID0gKnB0ckorKzsKLSAgICAgICAgICAgIHRtcDYgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA2IC09IHRtcDc7Ci0gICAgICAgICAgICB0bXA2ICs9IHRtcDE7Ci0gICAgICAgICAgICB0bXA2ID0gY2xwW3RtcDY+PjVdOwotICAgICAgICAgICAgdG1wNSArPSAxNjsKLSAgICAgICAgICAgIGlmICghaG9yT2Zmc2V0KQotICAgICAgICAgICAgICAgIHRtcDYgKz0gdG1wNDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB0bXA2ICs9IHRtcDM7Ci0gICAgICAgICAgICAqbWIrKyA9ICh1OCkoKHRtcDYgKyAxKSA+PiAxKTsKLSAgICAgICAgICAgIC8qIFNlY29uZCBwaXhlbCAqLwotICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXAzOwotICAgICAgICAgICAgdG1wNSArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDUgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wMSArIHRtcDQ7Ci0gICAgICAgICAgICB0bXA2ID0gKnB0ckorKzsKLSAgICAgICAgICAgIHRtcDUgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA1IC09IHRtcDc7Ci0gICAgICAgICAgICB0bXA1ICs9IHRtcDY7Ci0gICAgICAgICAgICB0bXA1ID0gY2xwW3RtcDU+PjVdOwotICAgICAgICAgICAgdG1wNCArPSAxNjsKLSAgICAgICAgICAgIGlmICghaG9yT2Zmc2V0KQotICAgICAgICAgICAgICAgIHRtcDUgKz0gdG1wMzsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB0bXA1ICs9IHRtcDI7Ci0gICAgICAgICAgICAqbWIrKyA9ICh1OCkoKHRtcDUgKyAxKSA+PiAxKTsKLSAgICAgICAgICAgIC8qIFRoaXJkIHBpeGVsICovCi0gICAgICAgICAgICB0bXA3ID0gdG1wMSArIHRtcDI7Ci0gICAgICAgICAgICB0bXA0ICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wNCArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA2ICsgdG1wMzsKLSAgICAgICAgICAgIHRtcDUgPSAqcHRySisrOwotICAgICAgICAgICAgdG1wNCAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDQgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDQgKz0gdG1wNTsKLSAgICAgICAgICAgIHRtcDQgPSBjbHBbdG1wND4+NV07Ci0gICAgICAgICAgICB0bXAzICs9IDE2OwotICAgICAgICAgICAgaWYgKCFob3JPZmZzZXQpCi0gICAgICAgICAgICAgICAgdG1wNCArPSB0bXAyOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHRtcDQgKz0gdG1wMTsKLSAgICAgICAgICAgICptYisrID0gKHU4KSgodG1wNCArIDEpID4+IDEpOwotICAgICAgICAgICAgLyogRm91cnRoIHBpeGVsICovCi0gICAgICAgICAgICB0bXA3ID0gdG1wNiArIHRtcDE7Ci0gICAgICAgICAgICB0bXAzICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wMyArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA1ICsgdG1wMjsKLSAgICAgICAgICAgIHRtcDQgPSAqcHRySisrOwotICAgICAgICAgICAgdG1wMyAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDMgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDMgKz0gdG1wNDsKLSAgICAgICAgICAgIHRtcDMgPSBjbHBbdG1wMz4+NV07Ci0gICAgICAgICAgICBpZiAoIWhvck9mZnNldCkKLSAgICAgICAgICAgICAgICB0bXAzICs9IHRtcDE7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdG1wMyArPSB0bXA2OwotICAgICAgICAgICAgKm1iKysgPSAodTgpKCh0bXAzICsgMSkgPj4gMSk7Ci0gICAgICAgICAgICB0bXAzID0gdG1wNTsKLSAgICAgICAgICAgIHRtcDUgPSB0bXAxOwotICAgICAgICAgICAgdG1wNyA9IHRtcDQ7Ci0gICAgICAgICAgICB0bXA0ID0gdG1wNjsKLSAgICAgICAgICAgIHRtcDYgPSB0bXAyOwotICAgICAgICAgICAgdG1wMiA9IHRtcDc7Ci0gICAgICAgIH0KLSAgICAgICAgcHRySiArPSB3aWR0aCAtIHBhcnRXaWR0aDsKLSAgICAgICAgbWIgKz0gMTYgLSBwYXJ0V2lkdGg7Ci0gICAgfQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEludGVycG9sYXRlSG9yVmVyUXVhcnRlcgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgRnVuY3Rpb24gdG8gcGVyZm9ybSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uIG9mIHBpeGVsCi0gICAgICAgICAgcG9zaXRpb24gJ2UnLCAnZycsICdwJyBvciAncicgZm9yIGEgYmxvY2suIE92ZXJmaWxsaW5nIGlzIGRvbmUgb25seQotICAgICAgICAgIGlmIG5lZWRlZC4gUmVmZXJlbmNlIGltYWdlIChyZWYpIGlzIHJlYWQgYXQgY29ycmVjdCBwb3NpdGlvbiBhbmQKLSAgICAgICAgICB0aGUgcHJlZGljdGVkIHBhcnQgaXMgd3JpdHRlbiB0byBtYWNyb2Jsb2NrIGFycmF5IChtYikKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVIb3JWZXJRdWFydGVyKAotICB1OCAqcmVmLAotICB1OCAqbWIsCi0gIGkzMiB4MCwKLSAgaTMyIHkwLAotICB1MzIgd2lkdGgsCi0gIHUzMiBoZWlnaHQsCi0gIHUzMiBwYXJ0V2lkdGgsCi0gIHUzMiBwYXJ0SGVpZ2h0LAotICB1MzIgaG9yVmVyT2Zmc2V0KSAvKiAwIGZvciBwaXhlbCBlLCAxIGZvciBwaXhlbCBnLAotICAgICAgICAgICAgICAgICAgICAgICAyIGZvciBwaXhlbCBwLCAzIGZvciBwaXhlbCByICovCi17Ci0gICAgdTMyIHAxWzIxKjIxLzQrMV07Ci0gICAgdTggKnB0ckMsICpwdHJKLCAqcHRyVjsKLSAgICB1MzIgeCwgeTsKLSAgICBpMzIgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKLSAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7Ci0KLSAgICAvKiBDb2RlICovCi0KLSAgICBBU1NFUlQocmVmKTsKLSAgICBBU1NFUlQobWIpOwotCi0gICAgaWYgKCh4MCA8IDApIHx8ICgodTMyKXgwK3BhcnRXaWR0aCs1ID4gd2lkdGgpIHx8Ci0gICAgICAgICh5MCA8IDApIHx8ICgodTMyKXkwK3BhcnRIZWlnaHQrNSA+IGhlaWdodCkpCi0gICAgewotICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHJlZiwgKHU4KilwMSwgeDAsIHkwLCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgICAgIHBhcnRXaWR0aCs1LCBwYXJ0SGVpZ2h0KzUsIHBhcnRXaWR0aCs1KTsKLQotICAgICAgICB4MCA9IDA7Ci0gICAgICAgIHkwID0gMDsKLSAgICAgICAgcmVmID0gKHU4KilwMTsKLSAgICAgICAgd2lkdGggPSBwYXJ0V2lkdGgrNTsKLSAgICB9Ci0KLSAgICAvKiBSZWYgcG9pbnRzIHRvIEcgKyAoLTIsIC0yKSAqLwotICAgIHJlZiArPSAodTMyKXkwICogd2lkdGggKyAodTMyKXgwOwotCi0gICAgLyogcHRySiBwb2ludHMgdG8gZWl0aGVyIEogb3IgUSwgZGVwZW5kaW5nIG9uIHZlcnRpY2FsIG9mZnNldCAqLwotICAgIHB0ckogPSByZWYgKyAoKChob3JWZXJPZmZzZXQgJiAweDIpID4+IDEpICsgMikgKiB3aWR0aCArIDU7Ci0KLSAgICAvKiBwdHJDIHBvaW50cyB0byBlaXRoZXIgQyBvciBELCBkZXBlbmRpbmcgb24gaG9yaXpvbnRhbCBvZmZzZXQgKi8KLSAgICBwdHJDID0gcmVmICsgd2lkdGggKyAyICsgKGhvclZlck9mZnNldCAmIDB4MSk7Ci0KLSAgICBmb3IgKHkgPSBwYXJ0SGVpZ2h0OyB5OyB5LS0pCi0gICAgewotICAgICAgICB0bXA2ID0gKihwdHJKIC0gNSk7Ci0gICAgICAgIHRtcDUgPSAqKHB0ckogLSA0KTsKLSAgICAgICAgdG1wNCA9ICoocHRySiAtIDMpOwotICAgICAgICB0bXAzID0gKihwdHJKIC0gMik7Ci0gICAgICAgIHRtcDIgPSAqKHB0ckogLSAxKTsKLQotICAgICAgICAvKiBIb3Jpem9udGFsIGludGVycG9sYXRpb24sIGNhbGN1bGF0ZSA0IHBlbHMgcGVyIGl0ZXJhdGlvbiAqLwotICAgICAgICBmb3IgKHggPSAocGFydFdpZHRoID4+IDIpOyB4OyB4LS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEZpcnN0IHBpeGVsICovCi0gICAgICAgICAgICB0bXA2ICs9IDE2OwotICAgICAgICAgICAgdG1wNyA9IHRtcDMgKyB0bXA0OwotICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDU7Ci0gICAgICAgICAgICB0bXAxID0gKnB0ckorKzsKLSAgICAgICAgICAgIHRtcDYgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA2IC09IHRtcDc7Ci0gICAgICAgICAgICB0bXA2ICs9IHRtcDE7Ci0gICAgICAgICAgICB0bXA2ID0gY2xwW3RtcDY+PjVdOwotICAgICAgICAgICAgLyogU2Vjb25kIHBpeGVsICovCi0gICAgICAgICAgICB0bXA1ICs9IDE2OwotICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXAzOwotICAgICAgICAgICAgKm1iKysgPSAodTgpdG1wNjsKLSAgICAgICAgICAgIHRtcDUgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXA1ICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNyA9IHRtcDEgKyB0bXA0OwotICAgICAgICAgICAgdG1wNiA9ICpwdHJKKys7Ci0gICAgICAgICAgICB0bXA1IC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNSAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNSArPSB0bXA2OwotICAgICAgICAgICAgdG1wNSA9IGNscFt0bXA1Pj41XTsKLSAgICAgICAgICAgIC8qIFRoaXJkIHBpeGVsICovCi0gICAgICAgICAgICB0bXA0ICs9IDE2OwotICAgICAgICAgICAgdG1wNyA9IHRtcDEgKyB0bXAyOwotICAgICAgICAgICAgKm1iKysgPSAodTgpdG1wNTsKLSAgICAgICAgICAgIHRtcDQgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXA0ICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNyA9IHRtcDYgKyB0bXAzOwotICAgICAgICAgICAgdG1wNSA9ICpwdHJKKys7Ci0gICAgICAgICAgICB0bXA0IC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNCAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNCArPSB0bXA1OwotICAgICAgICAgICAgdG1wNCA9IGNscFt0bXA0Pj41XTsKLSAgICAgICAgICAgIC8qIEZvdXJ0aCBwaXhlbCAqLwotICAgICAgICAgICAgdG1wMyArPSAxNjsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA2ICsgdG1wMTsKLSAgICAgICAgICAgICptYisrID0gKHU4KXRtcDQ7Ci0gICAgICAgICAgICB0bXAzICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wMyArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA1ICsgdG1wMjsKLSAgICAgICAgICAgIHRtcDQgPSAqcHRySisrOwotICAgICAgICAgICAgdG1wMyAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDMgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDMgKz0gdG1wNDsKLSAgICAgICAgICAgIHRtcDMgPSBjbHBbdG1wMz4+NV07Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNDsKLSAgICAgICAgICAgIHRtcDQgPSB0bXA2OwotICAgICAgICAgICAgdG1wNiA9IHRtcDI7Ci0gICAgICAgICAgICB0bXAyID0gdG1wNzsKLSAgICAgICAgICAgICptYisrID0gKHU4KXRtcDM7Ci0gICAgICAgICAgICB0bXAzID0gdG1wNTsKLSAgICAgICAgICAgIHRtcDUgPSB0bXAxOwotICAgICAgICB9Ci0gICAgICAgIHB0ckogKz0gd2lkdGggLSBwYXJ0V2lkdGg7Ci0gICAgICAgIG1iICs9IDE2IC0gcGFydFdpZHRoOwotICAgIH0KLQotICAgIG1iIC09IDE2KnBhcnRIZWlnaHQ7Ci0gICAgcHRyViA9IHB0ckMgKyA1KndpZHRoOwotCi0gICAgZm9yICh5ID0gKHBhcnRIZWlnaHQgPj4gMik7IHk7IHktLSkKLSAgICB7Ci0gICAgICAgIC8qIFZlcnRpY2FsIGludGVycG9sYXRpb24gYW5kIGF2ZXJhZ2luZywgNCBwZWxzIHBlciBpdGVyYXRpb24gKi8KLSAgICAgICAgZm9yICh4ID0gcGFydFdpZHRoOyB4OyB4LS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcDQgPSBwdHJWWy0oaTMyKXdpZHRoKjJdOwotICAgICAgICAgICAgdG1wNSA9IHB0clZbLShpMzIpd2lkdGhdOwotICAgICAgICAgICAgdG1wMSA9IHB0clZbd2lkdGhdOwotICAgICAgICAgICAgdG1wMiA9IHB0clZbd2lkdGgqMl07Ci0gICAgICAgICAgICB0bXA2ID0gKnB0clYrKzsKLQotICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXAxOwotICAgICAgICAgICAgdG1wMiAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDIgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDIgKz0gMTY7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNSArIHRtcDY7Ci0gICAgICAgICAgICB0bXAzID0gcHRyQ1t3aWR0aCoyXTsKLSAgICAgICAgICAgIHRtcDIgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXAyICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wMiArPSB0bXAzOwotICAgICAgICAgICAgdG1wNyA9IGNscFt0bXAyPj41XTsKLSAgICAgICAgICAgIHRtcDIgPSBtYls0OF07Ci0gICAgICAgICAgICB0bXAxICs9IDE2OwotICAgICAgICAgICAgdG1wNysrOwotICAgICAgICAgICAgbWJbNDhdID0gKHU4KSgodG1wMiArIHRtcDcpID4+IDEpOwotCi0gICAgICAgICAgICB0bXA3ID0gdG1wMyArIHRtcDY7Ci0gICAgICAgICAgICB0bXAxIC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wMSAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXA1OwotICAgICAgICAgICAgdG1wMiA9IHB0ckNbd2lkdGhdOwotICAgICAgICAgICAgdG1wMSArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDEgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXAxICs9IHRtcDI7Ci0gICAgICAgICAgICB0bXA3ID0gY2xwW3RtcDE+PjVdOwotICAgICAgICAgICAgdG1wMSA9IG1iWzMyXTsKLSAgICAgICAgICAgIHRtcDYgKz0gMTY7Ci0gICAgICAgICAgICB0bXA3Kys7Ci0gICAgICAgICAgICBtYlszMl0gPSAodTgpKCh0bXAxICsgdG1wNykgPj4gMSk7Ci0KLSAgICAgICAgICAgIHRtcDEgPSAqcHRyQzsKLSAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wNTsKLSAgICAgICAgICAgIHRtcDYgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA2IC09IHRtcDc7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDM7Ci0gICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDYgKz0gdG1wMTsKLSAgICAgICAgICAgIHRtcDcgPSBjbHBbdG1wNj4+NV07Ci0gICAgICAgICAgICB0bXA2ID0gbWJbMTZdOwotICAgICAgICAgICAgdG1wNSArPSAxNjsKLSAgICAgICAgICAgIHRtcDcrKzsKLSAgICAgICAgICAgIG1iWzE2XSA9ICh1OCkoKHRtcDYgKyB0bXA3KSA+PiAxKTsKLQotICAgICAgICAgICAgdG1wNiA9IHB0ckNbLShpMzIpd2lkdGhdOwotICAgICAgICAgICAgdG1wMSArPSB0bXA0OwotICAgICAgICAgICAgdG1wNSAtPSAodG1wMSA8PCAyKTsKLSAgICAgICAgICAgIHRtcDUgLT0gdG1wMTsKLSAgICAgICAgICAgIHRtcDMgKz0gdG1wMjsKLSAgICAgICAgICAgIHRtcDUgKz0gKHRtcDMgPDwgNCk7Ci0gICAgICAgICAgICB0bXA1ICs9ICh0bXAzIDw8IDIpOwotICAgICAgICAgICAgdG1wNSArPSB0bXA2OwotICAgICAgICAgICAgdG1wNyA9IGNscFt0bXA1Pj41XTsKLSAgICAgICAgICAgIHRtcDUgPSAqbWI7Ci0gICAgICAgICAgICB0bXA3Kys7Ci0gICAgICAgICAgICAqbWIrKyA9ICh1OCkoKHRtcDUgKyB0bXA3KSA+PiAxKTsKLSAgICAgICAgICAgIHB0ckMrKzsKLQotICAgICAgICB9Ci0gICAgICAgIHB0ckMgKz0gNCp3aWR0aCAtIHBhcnRXaWR0aDsKLSAgICAgICAgcHRyViArPSA0KndpZHRoIC0gcGFydFdpZHRoOwotICAgICAgICBtYiArPSA0KjE2IC0gcGFydFdpZHRoOwotICAgIH0KLQotfQotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEludGVycG9sYXRlTWlkSGFsZgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgRnVuY3Rpb24gdG8gcGVyZm9ybSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uIG9mIHBpeGVsCi0gICAgICAgICAgcG9zaXRpb24gJ2onIGZvciBhIGJsb2NrLiBPdmVyZmlsbGluZyBpcyBkb25lIG9ubHkgaWYgbmVlZGVkLgotICAgICAgICAgIFJlZmVyZW5jZSBpbWFnZSAocmVmKSBpcyByZWFkIGF0IGNvcnJlY3QgcG9zaXRpb24gYW5kIHRoZSBwcmVkaWN0ZWQKLSAgICAgICAgICBwYXJ0IGlzIHdyaXR0ZW4gdG8gbWFjcm9ibG9jayBhcnJheSAobWIpCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgaDI2NGJzZEludGVycG9sYXRlTWlkSGFsZigKLSAgdTggKnJlZiwKLSAgdTggKm1iLAotICBpMzIgeDAsCi0gIGkzMiB5MCwKLSAgdTMyIHdpZHRoLAotICB1MzIgaGVpZ2h0LAotICB1MzIgcGFydFdpZHRoLAotICB1MzIgcGFydEhlaWdodCkKLXsKLSAgICB1MzIgcDFbMjEqMjEvNCsxXTsKLSAgICB1MzIgeCwgeTsKLSAgICBpMzIgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKLSAgICBpMzIgKnB0ckMsICpwdHJWLCAqYjE7Ci0gICAgdTggICpwdHJKOwotICAgIGkzMiB0YWJsZVsyMSoxNl07Ci0gICAgY29uc3QgdTggKmNscCA9IGgyNjRic2RDbGlwICsgNTEyOwotCi0gICAgLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHJlZik7Ci0gICAgQVNTRVJUKG1iKTsKLQotICAgIGlmICgoeDAgPCAwKSB8fCAoKHUzMil4MCtwYXJ0V2lkdGgrNSA+IHdpZHRoKSB8fAotICAgICAgICAoeTAgPCAwKSB8fCAoKHUzMil5MCtwYXJ0SGVpZ2h0KzUgPiBoZWlnaHQpKQotICAgIHsKLSAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhyZWYsICh1OCopcDEsIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICBwYXJ0V2lkdGgrNSwgcGFydEhlaWdodCs1LCBwYXJ0V2lkdGgrNSk7Ci0KLSAgICAgICAgeDAgPSAwOwotICAgICAgICB5MCA9IDA7Ci0gICAgICAgIHJlZiA9ICh1OCopcDE7Ci0gICAgICAgIHdpZHRoID0gcGFydFdpZHRoKzU7Ci0gICAgfQotCi0gICAgcmVmICs9ICh1MzIpeTAgKiB3aWR0aCArICh1MzIpeDA7Ci0KLSAgICBiMSA9IHRhYmxlOwotICAgIHB0ckogPSByZWYgKyA1OwotCi0gICAgLyogRmlyc3Qgc3RlcDogY2FsY3VsYXRlIGludGVybWVkaWF0ZSB2YWx1ZXMgZm9yCi0gICAgICogaG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uICovCi0gICAgZm9yICh5ID0gcGFydEhlaWdodCArIDU7IHk7IHktLSkKLSAgICB7Ci0gICAgICAgIHRtcDYgPSAqKHB0ckogLSA1KTsKLSAgICAgICAgdG1wNSA9ICoocHRySiAtIDQpOwotICAgICAgICB0bXA0ID0gKihwdHJKIC0gMyk7Ci0gICAgICAgIHRtcDMgPSAqKHB0ckogLSAyKTsKLSAgICAgICAgdG1wMiA9ICoocHRySiAtIDEpOwotCi0gICAgICAgIC8qIDQgcGVscyBwZXIgaXRlcmF0aW9uICovCi0gICAgICAgIGZvciAoeCA9IChwYXJ0V2lkdGggPj4gMik7IHg7IHgtLSkKLSAgICAgICAgewotICAgICAgICAgICAgLyogRmlyc3QgcGl4ZWwgKi8KLSAgICAgICAgICAgIHRtcDcgPSB0bXAzICsgdG1wNDsKLSAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXA1OwotICAgICAgICAgICAgdG1wMSA9ICpwdHJKKys7Ci0gICAgICAgICAgICB0bXA2IC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNiAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNiArPSB0bXAxOwotICAgICAgICAgICAgKmIxKysgPSB0bXA2OwotICAgICAgICAgICAgLyogU2Vjb25kIHBpeGVsICovCi0gICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDM7Ci0gICAgICAgICAgICB0bXA1ICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wNSArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDcgPSB0bXAxICsgdG1wNDsKLSAgICAgICAgICAgIHRtcDYgPSAqcHRySisrOwotICAgICAgICAgICAgdG1wNSAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDUgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDUgKz0gdG1wNjsKLSAgICAgICAgICAgICpiMSsrID0gdG1wNTsKLSAgICAgICAgICAgIC8qIFRoaXJkIHBpeGVsICovCi0gICAgICAgICAgICB0bXA3ID0gdG1wMSArIHRtcDI7Ci0gICAgICAgICAgICB0bXA0ICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wNCArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA2ICsgdG1wMzsKLSAgICAgICAgICAgIHRtcDUgPSAqcHRySisrOwotICAgICAgICAgICAgdG1wNCAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDQgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDQgKz0gdG1wNTsKLSAgICAgICAgICAgICpiMSsrID0gdG1wNDsKLSAgICAgICAgICAgIC8qIEZvdXJ0aCBwaXhlbCAqLwotICAgICAgICAgICAgdG1wNyA9IHRtcDYgKyB0bXAxOwotICAgICAgICAgICAgdG1wMyArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDMgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNSArIHRtcDI7Ci0gICAgICAgICAgICB0bXA0ID0gKnB0ckorKzsKLSAgICAgICAgICAgIHRtcDMgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXAzIC09IHRtcDc7Ci0gICAgICAgICAgICB0bXAzICs9IHRtcDQ7Ci0gICAgICAgICAgICAqYjErKyA9IHRtcDM7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNDsKLSAgICAgICAgICAgIHRtcDQgPSB0bXA2OwotICAgICAgICAgICAgdG1wNiA9IHRtcDI7Ci0gICAgICAgICAgICB0bXAyID0gdG1wNzsKLSAgICAgICAgICAgIHRtcDMgPSB0bXA1OwotICAgICAgICAgICAgdG1wNSA9IHRtcDE7Ci0gICAgICAgIH0KLSAgICAgICAgcHRySiArPSB3aWR0aCAtIHBhcnRXaWR0aDsKLSAgICB9Ci0KLSAgICAvKiBTZWNvbmQgc3RlcDogY2FsY3VsYXRlIHZlcnRpY2FsIGludGVycG9sYXRpb24gKi8KLSAgICBwdHJDID0gdGFibGUgKyBwYXJ0V2lkdGg7Ci0gICAgcHRyViA9IHB0ckMgKyA1KnBhcnRXaWR0aDsKLSAgICBmb3IgKHkgPSAocGFydEhlaWdodCA+PiAyKTsgeTsgeS0tKQotICAgIHsKLSAgICAgICAgLyogNCBwZWxzIHBlciBpdGVyYXRpb24gKi8KLSAgICAgICAgZm9yICh4ID0gcGFydFdpZHRoOyB4OyB4LS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcDQgPSBwdHJWWy0oaTMyKXBhcnRXaWR0aCoyXTsKLSAgICAgICAgICAgIHRtcDUgPSBwdHJWWy0oaTMyKXBhcnRXaWR0aF07Ci0gICAgICAgICAgICB0bXAxID0gcHRyVltwYXJ0V2lkdGhdOwotICAgICAgICAgICAgdG1wMiA9IHB0clZbcGFydFdpZHRoKjJdOwotICAgICAgICAgICAgdG1wNiA9ICpwdHJWKys7Ci0KLSAgICAgICAgICAgIHRtcDcgPSB0bXA0ICsgdG1wMTsKLSAgICAgICAgICAgIHRtcDIgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXAyIC09IHRtcDc7Ci0gICAgICAgICAgICB0bXAyICs9IDUxMjsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA1ICsgdG1wNjsKLSAgICAgICAgICAgIHRtcDMgPSBwdHJDW3BhcnRXaWR0aCoyXTsKLSAgICAgICAgICAgIHRtcDIgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXAyICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wMiArPSB0bXAzOwotICAgICAgICAgICAgdG1wNyA9IGNscFt0bXAyPj4xMF07Ci0gICAgICAgICAgICB0bXAxICs9IDUxMjsKLSAgICAgICAgICAgIG1iWzQ4XSA9ICh1OCl0bXA3OwotCi0gICAgICAgICAgICB0bXA3ID0gdG1wMyArIHRtcDY7Ci0gICAgICAgICAgICB0bXAxIC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wMSAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXA1OwotICAgICAgICAgICAgdG1wMiA9IHB0ckNbcGFydFdpZHRoXTsKLSAgICAgICAgICAgIHRtcDEgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXAxICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wMSArPSB0bXAyOwotICAgICAgICAgICAgdG1wNyA9IGNscFt0bXAxPj4xMF07Ci0gICAgICAgICAgICB0bXA2ICs9IDUxMjsKLSAgICAgICAgICAgIG1iWzMyXSA9ICh1OCl0bXA3OwotCi0gICAgICAgICAgICB0bXAxID0gKnB0ckM7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDU7Ci0gICAgICAgICAgICB0bXA2IC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNiAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXAzOwotICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA2ICs9IHRtcDE7Ci0gICAgICAgICAgICB0bXA3ID0gY2xwW3RtcDY+PjEwXTsKLSAgICAgICAgICAgIHRtcDUgKz0gNTEyOwotICAgICAgICAgICAgbWJbMTZdID0gKHU4KXRtcDc7Ci0KLSAgICAgICAgICAgIHRtcDYgPSBwdHJDWy0oaTMyKXBhcnRXaWR0aF07Ci0gICAgICAgICAgICB0bXAxICs9IHRtcDQ7Ci0gICAgICAgICAgICB0bXA1IC09ICh0bXAxIDw8IDIpOwotICAgICAgICAgICAgdG1wNSAtPSB0bXAxOwotICAgICAgICAgICAgdG1wMyArPSB0bXAyOwotICAgICAgICAgICAgdG1wNSArPSAodG1wMyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDUgKz0gKHRtcDMgPDwgMik7Ci0gICAgICAgICAgICB0bXA1ICs9IHRtcDY7Ci0gICAgICAgICAgICB0bXA3ID0gY2xwW3RtcDU+PjEwXTsKLSAgICAgICAgICAgICptYisrID0gKHU4KXRtcDc7Ci0gICAgICAgICAgICBwdHJDKys7Ci0gICAgICAgIH0KLSAgICAgICAgbWIgKz0gNCoxNiAtIHBhcnRXaWR0aDsKLSAgICAgICAgcHRyQyArPSAzKnBhcnRXaWR0aDsKLSAgICAgICAgcHRyViArPSAzKnBhcnRXaWR0aDsKLSAgICB9Ci0KLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RJbnRlcnBvbGF0ZU1pZFZlclF1YXJ0ZXIKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIEZ1bmN0aW9uIHRvIHBlcmZvcm0gaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgaW50ZXJwb2xhdGlvbiBvZiBwaXhlbAotICAgICAgICAgIHBvc2l0aW9uICdmJyBvciAncScgZm9yIGEgYmxvY2suIE92ZXJmaWxsaW5nIGlzIGRvbmUgb25seSBpZiBuZWVkZWQuCi0gICAgICAgICAgUmVmZXJlbmNlIGltYWdlIChyZWYpIGlzIHJlYWQgYXQgY29ycmVjdCBwb3NpdGlvbiBhbmQgdGhlIHByZWRpY3RlZAotICAgICAgICAgIHBhcnQgaXMgd3JpdHRlbiB0byBtYWNyb2Jsb2NrIGFycmF5IChtYikKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVNaWRWZXJRdWFydGVyKAotICB1OCAqcmVmLAotICB1OCAqbWIsCi0gIGkzMiB4MCwKLSAgaTMyIHkwLAotICB1MzIgd2lkdGgsCi0gIHUzMiBoZWlnaHQsCi0gIHUzMiBwYXJ0V2lkdGgsCi0gIHUzMiBwYXJ0SGVpZ2h0LAotICB1MzIgdmVyT2Zmc2V0KSAgICAvKiAwIGZvciBwaXhlbCBmLCAxIGZvciBwaXhlbCBxICovCi17Ci0gICAgdTMyIHAxWzIxKjIxLzQrMV07Ci0gICAgdTMyIHgsIHk7Ci0gICAgaTMyIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7Ci0gICAgaTMyICpwdHJDLCAqcHRyViwgKnB0ckludCwgKmIxOwotICAgIHU4ICAqcHRySjsKLSAgICBpMzIgdGFibGVbMjEqMTZdOwotICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKLQotICAgIC8qIENvZGUgKi8KLQotICAgIEFTU0VSVChyZWYpOwotICAgIEFTU0VSVChtYik7Ci0KLSAgICBpZiAoKHgwIDwgMCkgfHwgKCh1MzIpeDArcGFydFdpZHRoKzUgPiB3aWR0aCkgfHwKLSAgICAgICAgKHkwIDwgMCkgfHwgKCh1MzIpeTArcGFydEhlaWdodCs1ID4gaGVpZ2h0KSkKLSAgICB7Ci0gICAgICAgIGgyNjRic2RGaWxsQmxvY2socmVmLCAodTgqKXAxLCB4MCwgeTAsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgcGFydFdpZHRoKzUsIHBhcnRIZWlnaHQrNSwgcGFydFdpZHRoKzUpOwotCi0gICAgICAgIHgwID0gMDsKLSAgICAgICAgeTAgPSAwOwotICAgICAgICByZWYgPSAodTgqKXAxOwotICAgICAgICB3aWR0aCA9IHBhcnRXaWR0aCs1OwotICAgIH0KLQotICAgIHJlZiArPSAodTMyKXkwICogd2lkdGggKyAodTMyKXgwOwotCi0gICAgYjEgPSB0YWJsZTsKLSAgICBwdHJKID0gcmVmICsgNTsKLQotICAgIC8qIEZpcnN0IHN0ZXA6IGNhbGN1bGF0ZSBpbnRlcm1lZGlhdGUgdmFsdWVzIGZvcgotICAgICAqIGhvcml6b250YWwgaW50ZXJwb2xhdGlvbiAqLwotICAgIGZvciAoeSA9IHBhcnRIZWlnaHQgKyA1OyB5OyB5LS0pCi0gICAgewotICAgICAgICB0bXA2ID0gKihwdHJKIC0gNSk7Ci0gICAgICAgIHRtcDUgPSAqKHB0ckogLSA0KTsKLSAgICAgICAgdG1wNCA9ICoocHRySiAtIDMpOwotICAgICAgICB0bXAzID0gKihwdHJKIC0gMik7Ci0gICAgICAgIHRtcDIgPSAqKHB0ckogLSAxKTsKLSAgICAgICAgZm9yICh4ID0gKHBhcnRXaWR0aCA+PiAyKTsgeDsgeC0tKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBGaXJzdCBwaXhlbCAqLwotICAgICAgICAgICAgdG1wNyA9IHRtcDMgKyB0bXA0OwotICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDU7Ci0gICAgICAgICAgICB0bXAxID0gKnB0ckorKzsKLSAgICAgICAgICAgIHRtcDYgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA2IC09IHRtcDc7Ci0gICAgICAgICAgICB0bXA2ICs9IHRtcDE7Ci0gICAgICAgICAgICAqYjErKyA9IHRtcDY7Ci0gICAgICAgICAgICAvKiBTZWNvbmQgcGl4ZWwgKi8KLSAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wMzsKLSAgICAgICAgICAgIHRtcDUgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXA1ICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNyA9IHRtcDEgKyB0bXA0OwotICAgICAgICAgICAgdG1wNiA9ICpwdHJKKys7Ci0gICAgICAgICAgICB0bXA1IC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNSAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNSArPSB0bXA2OwotICAgICAgICAgICAgKmIxKysgPSB0bXA1OwotICAgICAgICAgICAgLyogVGhpcmQgcGl4ZWwgKi8KLSAgICAgICAgICAgIHRtcDcgPSB0bXAxICsgdG1wMjsKLSAgICAgICAgICAgIHRtcDQgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXA0ICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNyA9IHRtcDYgKyB0bXAzOwotICAgICAgICAgICAgdG1wNSA9ICpwdHJKKys7Ci0gICAgICAgICAgICB0bXA0IC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNCAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNCArPSB0bXA1OwotICAgICAgICAgICAgKmIxKysgPSB0bXA0OwotICAgICAgICAgICAgLyogRm91cnRoIHBpeGVsICovCi0gICAgICAgICAgICB0bXA3ID0gdG1wNiArIHRtcDE7Ci0gICAgICAgICAgICB0bXAzICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wMyArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA1ICsgdG1wMjsKLSAgICAgICAgICAgIHRtcDQgPSAqcHRySisrOwotICAgICAgICAgICAgdG1wMyAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDMgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDMgKz0gdG1wNDsKLSAgICAgICAgICAgICpiMSsrID0gdG1wMzsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA0OwotICAgICAgICAgICAgdG1wNCA9IHRtcDY7Ci0gICAgICAgICAgICB0bXA2ID0gdG1wMjsKLSAgICAgICAgICAgIHRtcDIgPSB0bXA3OwotICAgICAgICAgICAgdG1wMyA9IHRtcDU7Ci0gICAgICAgICAgICB0bXA1ID0gdG1wMTsKLSAgICAgICAgfQotICAgICAgICBwdHJKICs9IHdpZHRoIC0gcGFydFdpZHRoOwotICAgIH0KLQotICAgIC8qIFNlY29uZCBzdGVwOiBjYWxjdWxhdGUgdmVydGljYWwgaW50ZXJwb2xhdGlvbiBhbmQgYXZlcmFnZSAqLwotICAgIHB0ckMgPSB0YWJsZSArIHBhcnRXaWR0aDsKLSAgICBwdHJWID0gcHRyQyArIDUqcGFydFdpZHRoOwotICAgIC8qIFBvaW50ZXIgdG8gaW50ZWdlciBzYW1wbGUgcG9zaXRpb24sIGVpdGhlciBNIG9yIFIgKi8KLSAgICBwdHJJbnQgPSBwdHJDICsgKDIrdmVyT2Zmc2V0KSpwYXJ0V2lkdGg7Ci0gICAgZm9yICh5ID0gKHBhcnRIZWlnaHQgPj4gMik7IHk7IHktLSkKLSAgICB7Ci0gICAgICAgIGZvciAoeCA9IHBhcnRXaWR0aDsgeDsgeC0tKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXA0ID0gcHRyVlstKGkzMilwYXJ0V2lkdGgqMl07Ci0gICAgICAgICAgICB0bXA1ID0gcHRyVlstKGkzMilwYXJ0V2lkdGhdOwotICAgICAgICAgICAgdG1wMSA9IHB0clZbcGFydFdpZHRoXTsKLSAgICAgICAgICAgIHRtcDIgPSBwdHJWW3BhcnRXaWR0aCoyXTsKLSAgICAgICAgICAgIHRtcDYgPSAqcHRyVisrOwotCi0gICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDE7Ci0gICAgICAgICAgICB0bXAyIC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wMiAtPSB0bXA3OwotICAgICAgICAgICAgdG1wMiArPSA1MTI7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNSArIHRtcDY7Ci0gICAgICAgICAgICB0bXAzID0gcHRyQ1twYXJ0V2lkdGgqMl07Ci0gICAgICAgICAgICB0bXAyICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wMiArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDcgPSBwdHJJbnRbcGFydFdpZHRoKjJdOwotICAgICAgICAgICAgdG1wMiArPSB0bXAzOwotICAgICAgICAgICAgdG1wMiA9IGNscFt0bXAyPj4xMF07Ci0gICAgICAgICAgICB0bXA3ICs9IDE2OwotICAgICAgICAgICAgdG1wNyA9IGNscFt0bXA3Pj41XTsKLSAgICAgICAgICAgIHRtcDEgKz0gNTEyOwotICAgICAgICAgICAgdG1wMisrOwotICAgICAgICAgICAgbWJbNDhdID0gKHU4KSgodG1wNyArIHRtcDIpID4+IDEpOwotCi0gICAgICAgICAgICB0bXA3ID0gdG1wMyArIHRtcDY7Ci0gICAgICAgICAgICB0bXAxIC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wMSAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXA1OwotICAgICAgICAgICAgdG1wMiA9IHB0ckNbcGFydFdpZHRoXTsKLSAgICAgICAgICAgIHRtcDEgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXAxICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNyA9IHB0ckludFtwYXJ0V2lkdGhdOwotICAgICAgICAgICAgdG1wMSArPSB0bXAyOwotICAgICAgICAgICAgdG1wMSA9IGNscFt0bXAxPj4xMF07Ci0gICAgICAgICAgICB0bXA3ICs9IDE2OwotICAgICAgICAgICAgdG1wNyA9IGNscFt0bXA3Pj41XTsKLSAgICAgICAgICAgIHRtcDYgKz0gNTEyOwotICAgICAgICAgICAgdG1wMSsrOwotICAgICAgICAgICAgbWJbMzJdID0gKHU4KSgodG1wNyArIHRtcDEpID4+IDEpOwotCi0gICAgICAgICAgICB0bXAxID0gKnB0ckM7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDU7Ci0gICAgICAgICAgICB0bXA2IC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNiAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXAzOwotICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA3ID0gKnB0ckludDsKLSAgICAgICAgICAgIHRtcDYgKz0gdG1wMTsKLSAgICAgICAgICAgIHRtcDYgPSBjbHBbdG1wNj4+MTBdOwotICAgICAgICAgICAgdG1wNyArPSAxNjsKLSAgICAgICAgICAgIHRtcDcgPSBjbHBbdG1wNz4+NV07Ci0gICAgICAgICAgICB0bXA1ICs9IDUxMjsKLSAgICAgICAgICAgIHRtcDYrKzsKLSAgICAgICAgICAgIG1iWzE2XSA9ICh1OCkoKHRtcDcgKyB0bXA2KSA+PiAxKTsKLQotICAgICAgICAgICAgdG1wNiA9IHB0ckNbLShpMzIpcGFydFdpZHRoXTsKLSAgICAgICAgICAgIHRtcDEgKz0gdG1wNDsKLSAgICAgICAgICAgIHRtcDUgLT0gKHRtcDEgPDwgMik7Ci0gICAgICAgICAgICB0bXA1IC09IHRtcDE7Ci0gICAgICAgICAgICB0bXAzICs9IHRtcDI7Ci0gICAgICAgICAgICB0bXA1ICs9ICh0bXAzIDw8IDQpOwotICAgICAgICAgICAgdG1wNSArPSAodG1wMyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDcgPSBwdHJJbnRbLShpMzIpcGFydFdpZHRoXTsKLSAgICAgICAgICAgIHRtcDUgKz0gdG1wNjsKLSAgICAgICAgICAgIHRtcDUgPSBjbHBbdG1wNT4+MTBdOwotICAgICAgICAgICAgdG1wNyArPSAxNjsKLSAgICAgICAgICAgIHRtcDcgPSBjbHBbdG1wNz4+NV07Ci0gICAgICAgICAgICB0bXA1Kys7Ci0gICAgICAgICAgICAqbWIrKyA9ICh1OCkoKHRtcDcgKyB0bXA1KSA+PiAxKTsKLSAgICAgICAgICAgIHB0ckMrKzsKLSAgICAgICAgICAgIHB0ckludCsrOwotICAgICAgICB9Ci0gICAgICAgIG1iICs9IDQqMTYgLSBwYXJ0V2lkdGg7Ci0gICAgICAgIHB0ckMgKz0gMypwYXJ0V2lkdGg7Ci0gICAgICAgIHB0clYgKz0gMypwYXJ0V2lkdGg7Ci0gICAgICAgIHB0ckludCArPSAzKnBhcnRXaWR0aDsKLSAgICB9Ci0KLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RJbnRlcnBvbGF0ZU1pZEhvclF1YXJ0ZXIKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIEZ1bmN0aW9uIHRvIHBlcmZvcm0gaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgaW50ZXJwb2xhdGlvbiBvZiBwaXhlbAotICAgICAgICAgIHBvc2l0aW9uICdpJyBvciAnaycgZm9yIGEgYmxvY2suIE92ZXJmaWxsaW5nIGlzIGRvbmUgb25seSBpZiBuZWVkZWQuCi0gICAgICAgICAgUmVmZXJlbmNlIGltYWdlIChyZWYpIGlzIHJlYWQgYXQgY29ycmVjdCBwb3NpdGlvbiBhbmQgdGhlIHByZWRpY3RlZAotICAgICAgICAgIHBhcnQgaXMgd3JpdHRlbiB0byBtYWNyb2Jsb2NrIGFycmF5IChtYikKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVNaWRIb3JRdWFydGVyKAotICB1OCAqcmVmLAotICB1OCAqbWIsCi0gIGkzMiB4MCwKLSAgaTMyIHkwLAotICB1MzIgd2lkdGgsCi0gIHUzMiBoZWlnaHQsCi0gIHUzMiBwYXJ0V2lkdGgsCi0gIHUzMiBwYXJ0SGVpZ2h0LAotICB1MzIgaG9yT2Zmc2V0KSAgICAvKiAwIGZvciBwaXhlbCBpLCAxIGZvciBwaXhlbCBrICovCi17Ci0gICAgdTMyIHAxWzIxKjIxLzQrMV07Ci0gICAgdTMyIHgsIHk7Ci0gICAgaTMyIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7Ci0gICAgaTMyICpwdHJKLCAqcHRySW50LCAqaDE7Ci0gICAgdTggICpwdHJDLCAqcHRyVjsKLSAgICBpMzIgdGFibGVbMjEqMTZdOwotICAgIGkzMiB0YWJsZVdpZHRoID0gKGkzMilwYXJ0V2lkdGgrNTsKLSAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7Ci0KLSAgICAvKiBDb2RlICovCi0KLSAgICBBU1NFUlQocmVmKTsKLSAgICBBU1NFUlQobWIpOwotCi0gICAgaWYgKCh4MCA8IDApIHx8ICgodTMyKXgwK3BhcnRXaWR0aCs1ID4gd2lkdGgpIHx8Ci0gICAgICAgICh5MCA8IDApIHx8ICgodTMyKXkwK3BhcnRIZWlnaHQrNSA+IGhlaWdodCkpCi0gICAgewotICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHJlZiwgKHU4KilwMSwgeDAsIHkwLCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgICAgIHBhcnRXaWR0aCs1LCBwYXJ0SGVpZ2h0KzUsIHBhcnRXaWR0aCs1KTsKLQotICAgICAgICB4MCA9IDA7Ci0gICAgICAgIHkwID0gMDsKLSAgICAgICAgcmVmID0gKHU4KilwMTsKLSAgICAgICAgd2lkdGggPSBwYXJ0V2lkdGgrNTsKLSAgICB9Ci0KLSAgICByZWYgKz0gKHUzMil5MCAqIHdpZHRoICsgKHUzMil4MDsKLQotICAgIGgxID0gdGFibGUgKyB0YWJsZVdpZHRoOwotICAgIHB0ckMgPSByZWYgKyB3aWR0aDsKLSAgICBwdHJWID0gcHRyQyArIDUqd2lkdGg7Ci0KLSAgICAvKiBGaXJzdCBzdGVwOiBjYWxjdWxhdGUgaW50ZXJtZWRpYXRlIHZhbHVlcyBmb3IKLSAgICAgKiB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uICovCi0gICAgZm9yICh5ID0gKHBhcnRIZWlnaHQgPj4gMik7IHk7IHktLSkKLSAgICB7Ci0gICAgICAgIGZvciAoeCA9ICh1MzIpdGFibGVXaWR0aDsgeDsgeC0tKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXA0ID0gcHRyVlstKGkzMil3aWR0aCoyXTsKLSAgICAgICAgICAgIHRtcDUgPSBwdHJWWy0oaTMyKXdpZHRoXTsKLSAgICAgICAgICAgIHRtcDEgPSBwdHJWW3dpZHRoXTsKLSAgICAgICAgICAgIHRtcDIgPSBwdHJWW3dpZHRoKjJdOwotICAgICAgICAgICAgdG1wNiA9ICpwdHJWKys7Ci0KLSAgICAgICAgICAgIHRtcDcgPSB0bXA0ICsgdG1wMTsKLSAgICAgICAgICAgIHRtcDIgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXAyIC09IHRtcDc7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNSArIHRtcDY7Ci0gICAgICAgICAgICB0bXAzID0gcHRyQ1t3aWR0aCoyXTsKLSAgICAgICAgICAgIHRtcDIgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXAyICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wMiArPSB0bXAzOwotICAgICAgICAgICAgaDFbdGFibGVXaWR0aCoyXSA9IHRtcDI7Ci0KLSAgICAgICAgICAgIHRtcDcgPSB0bXAzICsgdG1wNjsKLSAgICAgICAgICAgIHRtcDEgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXAxIC09IHRtcDc7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDU7Ci0gICAgICAgICAgICB0bXAyID0gcHRyQ1t3aWR0aF07Ci0gICAgICAgICAgICB0bXAxICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wMSArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDEgKz0gdG1wMjsKLSAgICAgICAgICAgIGgxW3RhYmxlV2lkdGhdID0gdG1wMTsKLQotICAgICAgICAgICAgdG1wMSA9ICpwdHJDOwotICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXA1OwotICAgICAgICAgICAgdG1wNiAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDYgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA0ICsgdG1wMzsKLSAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNiArPSB0bXAxOwotICAgICAgICAgICAgKmgxID0gdG1wNjsKLQotICAgICAgICAgICAgdG1wNiA9IHB0ckNbLShpMzIpd2lkdGhdOwotICAgICAgICAgICAgdG1wMSArPSB0bXA0OwotICAgICAgICAgICAgdG1wNSAtPSAodG1wMSA8PCAyKTsKLSAgICAgICAgICAgIHRtcDUgLT0gdG1wMTsKLSAgICAgICAgICAgIHRtcDMgKz0gdG1wMjsKLSAgICAgICAgICAgIHRtcDUgKz0gKHRtcDMgPDwgNCk7Ci0gICAgICAgICAgICB0bXA1ICs9ICh0bXAzIDw8IDIpOwotICAgICAgICAgICAgdG1wNSArPSB0bXA2OwotICAgICAgICAgICAgaDFbLXRhYmxlV2lkdGhdID0gdG1wNTsKLSAgICAgICAgICAgIGgxKys7Ci0gICAgICAgICAgICBwdHJDKys7Ci0gICAgICAgIH0KLSAgICAgICAgcHRyQyArPSA0KndpZHRoIC0gcGFydFdpZHRoIC0gNTsKLSAgICAgICAgcHRyViArPSA0KndpZHRoIC0gcGFydFdpZHRoIC0gNTsKLSAgICAgICAgaDEgKz0gMyp0YWJsZVdpZHRoOwotICAgIH0KLQotICAgIC8qIFNlY29uZCBzdGVwOiBjYWxjdWxhdGUgaG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uIGFuZCBhdmVyYWdlICovCi0gICAgcHRySiA9IHRhYmxlICsgNTsKLSAgICAvKiBQb2ludGVyIHRvIGludGVnZXIgc2FtcGxlIHBvc2l0aW9uLCBlaXRoZXIgRyBvciBIICovCi0gICAgcHRySW50ID0gdGFibGUgKyAyICsgaG9yT2Zmc2V0OwotICAgIGZvciAoeSA9IHBhcnRIZWlnaHQ7IHk7IHktLSkKLSAgICB7Ci0gICAgICAgIHRtcDYgPSAqKHB0ckogLSA1KTsKLSAgICAgICAgdG1wNSA9ICoocHRySiAtIDQpOwotICAgICAgICB0bXA0ID0gKihwdHJKIC0gMyk7Ci0gICAgICAgIHRtcDMgPSAqKHB0ckogLSAyKTsKLSAgICAgICAgdG1wMiA9ICoocHRySiAtIDEpOwotICAgICAgICBmb3IgKHggPSAocGFydFdpZHRoPj4yKTsgeDsgeC0tKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBGaXJzdCBwaXhlbCAqLwotICAgICAgICAgICAgdG1wNiArPSA1MTI7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wMyArIHRtcDQ7Ci0gICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wNTsKLSAgICAgICAgICAgIHRtcDEgPSAqcHRySisrOwotICAgICAgICAgICAgdG1wNiAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDYgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDcgPSAqcHRySW50Kys7Ci0gICAgICAgICAgICB0bXA2ICs9IHRtcDE7Ci0gICAgICAgICAgICB0bXA2ID0gY2xwW3RtcDYgPj4gMTBdOwotICAgICAgICAgICAgdG1wNyArPSAxNjsKLSAgICAgICAgICAgIHRtcDcgPSBjbHBbdG1wNyA+PiA1XTsKLSAgICAgICAgICAgIHRtcDUgKz0gNTEyOwotICAgICAgICAgICAgdG1wNisrOwotICAgICAgICAgICAgKm1iKysgPSAodTgpKCh0bXA2ICsgdG1wNykgPj4gMSk7Ci0gICAgICAgICAgICAvKiBTZWNvbmQgcGl4ZWwgKi8KLSAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wMzsKLSAgICAgICAgICAgIHRtcDUgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXA1ICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNyA9IHRtcDEgKyB0bXA0OwotICAgICAgICAgICAgdG1wNiA9ICpwdHJKKys7Ci0gICAgICAgICAgICB0bXA1IC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNSAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNyA9ICpwdHJJbnQrKzsKLSAgICAgICAgICAgIHRtcDUgKz0gdG1wNjsKLSAgICAgICAgICAgIHRtcDUgPSBjbHBbdG1wNSA+PiAxMF07Ci0gICAgICAgICAgICB0bXA3ICs9IDE2OwotICAgICAgICAgICAgdG1wNyA9IGNscFt0bXA3ID4+IDVdOwotICAgICAgICAgICAgdG1wNCArPSA1MTI7Ci0gICAgICAgICAgICB0bXA1Kys7Ci0gICAgICAgICAgICAqbWIrKyA9ICh1OCkoKHRtcDUgKyB0bXA3KSA+PiAxKTsKLSAgICAgICAgICAgIC8qIFRoaXJkIHBpeGVsICovCi0gICAgICAgICAgICB0bXA3ID0gdG1wMSArIHRtcDI7Ci0gICAgICAgICAgICB0bXA0ICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wNCArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA2ICsgdG1wMzsKLSAgICAgICAgICAgIHRtcDUgPSAqcHRySisrOwotICAgICAgICAgICAgdG1wNCAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDQgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDcgPSAqcHRySW50Kys7Ci0gICAgICAgICAgICB0bXA0ICs9IHRtcDU7Ci0gICAgICAgICAgICB0bXA0ID0gY2xwW3RtcDQgPj4gMTBdOwotICAgICAgICAgICAgdG1wNyArPSAxNjsKLSAgICAgICAgICAgIHRtcDcgPSBjbHBbdG1wNyA+PiA1XTsKLSAgICAgICAgICAgIHRtcDMgKz0gNTEyOwotICAgICAgICAgICAgdG1wNCsrOwotICAgICAgICAgICAgKm1iKysgPSAodTgpKCh0bXA0ICsgdG1wNykgPj4gMSk7Ci0gICAgICAgICAgICAvKiBGb3VydGggcGl4ZWwgKi8KLSAgICAgICAgICAgIHRtcDcgPSB0bXA2ICsgdG1wMTsKLSAgICAgICAgICAgIHRtcDMgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXAzICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNyA9IHRtcDUgKyB0bXAyOwotICAgICAgICAgICAgdG1wNCA9ICpwdHJKKys7Ci0gICAgICAgICAgICB0bXAzIC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wMyAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNyA9ICpwdHJJbnQrKzsKLSAgICAgICAgICAgIHRtcDMgKz0gdG1wNDsKLSAgICAgICAgICAgIHRtcDMgPSBjbHBbdG1wMyA+PiAxMF07Ci0gICAgICAgICAgICB0bXA3ICs9IDE2OwotICAgICAgICAgICAgdG1wNyA9IGNscFt0bXA3ID4+IDVdOwotICAgICAgICAgICAgdG1wMysrOwotICAgICAgICAgICAgKm1iKysgPSAodTgpKCh0bXAzICsgdG1wNykgPj4gMSk7Ci0gICAgICAgICAgICB0bXAzID0gdG1wNTsKLSAgICAgICAgICAgIHRtcDUgPSB0bXAxOwotICAgICAgICAgICAgdG1wNyA9IHRtcDQ7Ci0gICAgICAgICAgICB0bXA0ID0gdG1wNjsKLSAgICAgICAgICAgIHRtcDYgPSB0bXAyOwotICAgICAgICAgICAgdG1wMiA9IHRtcDc7Ci0gICAgICAgIH0KLSAgICAgICAgcHRySiArPSA1OwotICAgICAgICBwdHJJbnQgKz0gNTsKLSAgICAgICAgbWIgKz0gMTYgLSBwYXJ0V2lkdGg7Ci0gICAgfQotCi19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkUHJlZGljdFNhbXBsZXMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFRoaXMgZnVuY3Rpb24gcmVjb25zdHJ1Y3RzIGEgcHJlZGljdGlvbiBmb3IgYSBtYWNyb2Jsb2NrIHBhcnRpdGlvbi4KLSAgICAgICAgICBUaGUgcHJlZGljdGlvbiBpcyBlaXRoZXIgY29waWVkIG9yIGludGVycG9sYXRlZCB1c2luZyB0aGUgcmVmZXJlbmNlCi0gICAgICAgICAgZnJhbWUgYW5kIHRoZSBtb3Rpb24gdmVjdG9yLiBCb3RoIGx1bWluYW5jZSBhbmQgY2hyb21pbmFuY2UgcGFydHMgYXJlCi0gICAgICAgICAgcHJlZGljdGVkLiBUaGUgcHJlZGljdGlvbiBpcyBzdG9yZWQgaW4gZ2l2ZW4gbWFjcm9ibG9jayBhcnJheSAoZGF0YSkuCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICBkYXRhICAgICAgICAgIHBvaW50ZXIgdG8gbWFjcm9ibG9jayBhcnJheSAoMzg0IGJ5dGVzKSBmb3Igb3V0cHV0Ci0gICAgICAgICAgbXYgICAgICAgICAgICBwb2ludGVyIHRvIG1vdGlvbiB2ZWN0b3IgdXNlZCBmb3IgcHJlZGljdGlvbgotICAgICAgICAgIHJlZlBpYyAgICAgICAgcG9pbnRlciB0byByZWZlcmVuY2UgcGljdHVyZSBzdHJ1Y3R1cmUKLSAgICAgICAgICB4QSAgICAgICAgICAgIHgtY29vcmRpbmF0ZSBmb3IgY3VycmVudCBtYWNyb2Jsb2NrCi0gICAgICAgICAgeUEgICAgICAgICAgICB5LWNvb3JkaW5hdGUgZm9yIGN1cnJlbnQgbWFjcm9ibG9jawotICAgICAgICAgIHBhcnRYICAgICAgICAgeC1vZmZzZXQgZm9yIHBhcnRpdGlvbiBpbiBtYWNyb2Jsb2NrCi0gICAgICAgICAgcGFydFkgICAgICAgICB5LW9mZnNldCBmb3IgcGFydGl0aW9uIGluIG1hY3JvYmxvY2sKLSAgICAgICAgICBwYXJ0V2lkdGggICAgIHdpZHRoIG9mIHBhcnRpdGlvbgotICAgICAgICAgIHBhcnRIZWlnaHQgICAgaGVpZ2h0IG9mIHBhcnRpdGlvbgotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIGRhdGEgICAgICAgICAgbWFjcm9ibG9jayBhcnJheSAoMTZ4MTYrOHg4Kzh4OCkgd2hlcmUgcHJlZGljdGVkCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb24gaXMgc3RvcmVkIGF0IGNvcnJlY3QgcG9zaXRpb24KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBoMjY0YnNkUHJlZGljdFNhbXBsZXMoCi0gIHU4ICpkYXRhLAotICBtdl90ICptdiwKLSAgaW1hZ2VfdCAqcmVmUGljLAotICB1MzIgeEEsCi0gIHUzMiB5QSwKLSAgdTMyIHBhcnRYLAotICB1MzIgcGFydFksCi0gIHUzMiBwYXJ0V2lkdGgsCi0gIHUzMiBwYXJ0SGVpZ2h0KQotCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHhGcmFjLCB5RnJhYywgd2lkdGgsIGhlaWdodDsKLSAgICBpMzIgeEludCwgeUludDsKLSAgICB1OCAqbHVtYVBhcnREYXRhOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKG12KTsKLSAgICBBU1NFUlQocGFydFdpZHRoKTsKLSAgICBBU1NFUlQocGFydEhlaWdodCk7Ci0gICAgQVNTRVJUKHJlZlBpYyk7Ci0gICAgQVNTRVJUKHJlZlBpYy0+ZGF0YSk7Ci0gICAgQVNTRVJUKHJlZlBpYy0+d2lkdGgpOwotICAgIEFTU0VSVChyZWZQaWMtPmhlaWdodCk7Ci0KLSAgICAvKiBsdW1hICovCi0gICAgbHVtYVBhcnREYXRhID0gZGF0YSArIDE2KnBhcnRZICsgcGFydFg7Ci0KLSAgICB4RnJhYyA9IG12LT5ob3IgJiAweDM7Ci0gICAgeUZyYWMgPSBtdi0+dmVyICYgMHgzOwotCi0gICAgd2lkdGggPSAxNiAqIHJlZlBpYy0+d2lkdGg7Ci0gICAgaGVpZ2h0ID0gMTYgKiByZWZQaWMtPmhlaWdodDsKLQotICAgIHhJbnQgPSAoaTMyKXhBICsgKGkzMilwYXJ0WCArIChtdi0+aG9yID4+IDIpOwotICAgIHlJbnQgPSAoaTMyKXlBICsgKGkzMilwYXJ0WSArIChtdi0+dmVyID4+IDIpOwotCi0gICAgQVNTRVJUKGx1bWFGcmFjUG9zW3hGcmFjXVt5RnJhY10gPCAxNik7Ci0KLSAgICBzd2l0Y2ggKGx1bWFGcmFjUG9zW3hGcmFjXVt5RnJhY10pCi0gICAgewotICAgICAgICBjYXNlIDA6IC8qIEcgKi8KLSAgICAgICAgICAgIGgyNjRic2RGaWxsQmxvY2socmVmUGljLT5kYXRhLCBsdW1hUGFydERhdGEsCi0gICAgICAgICAgICAgICAgICAgIHhJbnQseUludCx3aWR0aCxoZWlnaHQscGFydFdpZHRoLHBhcnRIZWlnaHQsMTYpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTogLyogZCAqLwotICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlVmVyUXVhcnRlcihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgeEludCwgeUludC0yLCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQsIDApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjogLyogaCAqLwotICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlVmVySGFsZihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgeEludCwgeUludC0yLCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzogLyogbiAqLwotICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlVmVyUXVhcnRlcihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgeEludCwgeUludC0yLCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQsIDEpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDogLyogYSAqLwotICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlSG9yUXVhcnRlcihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgeEludC0yLCB5SW50LCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQsIDApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNTogLyogZSAqLwotICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlSG9yVmVyUXVhcnRlcihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgeEludC0yLCB5SW50LTIsIHdpZHRoLCBoZWlnaHQsIHBhcnRXaWR0aCwgcGFydEhlaWdodCwgMCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA2OiAvKiBpICovCi0gICAgICAgICAgICBoMjY0YnNkSW50ZXJwb2xhdGVNaWRIb3JRdWFydGVyKHJlZlBpYy0+ZGF0YSwgbHVtYVBhcnREYXRhLAotICAgICAgICAgICAgICAgICAgICB4SW50LTIsIHlJbnQtMiwgd2lkdGgsIGhlaWdodCwgcGFydFdpZHRoLCBwYXJ0SGVpZ2h0LCAwKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDc6IC8qIHAgKi8KLSAgICAgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZUhvclZlclF1YXJ0ZXIocmVmUGljLT5kYXRhLCBsdW1hUGFydERhdGEsCi0gICAgICAgICAgICAgICAgICAgIHhJbnQtMiwgeUludC0yLCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQsIDIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgODogLyogYiAqLwotICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlSG9ySGFsZihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgeEludC0yLCB5SW50LCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgOTogLyogZiAqLwotICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlTWlkVmVyUXVhcnRlcihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgeEludC0yLCB5SW50LTIsIHdpZHRoLCBoZWlnaHQsIHBhcnRXaWR0aCwgcGFydEhlaWdodCwgMCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMDogLyogaiAqLwotICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlTWlkSGFsZihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgeEludC0yLCB5SW50LTIsIHdpZHRoLCBoZWlnaHQsIHBhcnRXaWR0aCwgcGFydEhlaWdodCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMTogLyogcSAqLwotICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlTWlkVmVyUXVhcnRlcihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgeEludC0yLCB5SW50LTIsIHdpZHRoLCBoZWlnaHQsIHBhcnRXaWR0aCwgcGFydEhlaWdodCwgMSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMjogLyogYyAqLwotICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlSG9yUXVhcnRlcihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgeEludC0yLCB5SW50LCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQsIDEpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTM6IC8qIGcgKi8KLSAgICAgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZUhvclZlclF1YXJ0ZXIocmVmUGljLT5kYXRhLCBsdW1hUGFydERhdGEsCi0gICAgICAgICAgICAgICAgICAgIHhJbnQtMiwgeUludC0yLCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQsIDEpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTQ6IC8qIGsgKi8KLSAgICAgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZU1pZEhvclF1YXJ0ZXIocmVmUGljLT5kYXRhLCBsdW1hUGFydERhdGEsCi0gICAgICAgICAgICAgICAgICAgIHhJbnQtMiwgeUludC0yLCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQsIDEpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IC8qIGNhc2UgMTUsIHIgKi8KLSAgICAgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZUhvclZlclF1YXJ0ZXIocmVmUGljLT5kYXRhLCBsdW1hUGFydERhdGEsCi0gICAgICAgICAgICAgICAgICAgIHhJbnQtMiwgeUludC0yLCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQsIDMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLyogY2hyb21hICovCi0gICAgUHJlZGljdENocm9tYSgKLSAgICAgIGRhdGEgKyAxNioxNiArIChwYXJ0WT4+MSkqOCArIChwYXJ0WD4+MSksCi0gICAgICB4QSArIHBhcnRYLAotICAgICAgeUEgKyBwYXJ0WSwKLSAgICAgIHBhcnRXaWR0aCwKLSAgICAgIHBhcnRIZWlnaHQsCi0gICAgICBtdiwKLSAgICAgIHJlZlBpYyk7Ci0KLX0KLQotI2Vsc2UgLyogSDI2NERFQ19PTVhETCAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkUHJlZGljdFNhbXBsZXMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFRoaXMgZnVuY3Rpb24gcmVjb25zdHJ1Y3RzIGEgcHJlZGljdGlvbiBmb3IgYSBtYWNyb2Jsb2NrIHBhcnRpdGlvbi4KLSAgICAgICAgICBUaGUgcHJlZGljdGlvbiBpcyBlaXRoZXIgY29waWVkIG9yIGludGVycG9sYXRlZCB1c2luZyB0aGUgcmVmZXJlbmNlCi0gICAgICAgICAgZnJhbWUgYW5kIHRoZSBtb3Rpb24gdmVjdG9yLiBCb3RoIGx1bWluYW5jZSBhbmQgY2hyb21pbmFuY2UgcGFydHMgYXJlCi0gICAgICAgICAgcHJlZGljdGVkLiBUaGUgcHJlZGljdGlvbiBpcyBzdG9yZWQgaW4gZ2l2ZW4gbWFjcm9ibG9jayBhcnJheSAoZGF0YSkuCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICBkYXRhICAgICAgICAgIHBvaW50ZXIgdG8gbWFjcm9ibG9jayBhcnJheSAoMzg0IGJ5dGVzKSBmb3Igb3V0cHV0Ci0gICAgICAgICAgbXYgICAgICAgICAgICBwb2ludGVyIHRvIG1vdGlvbiB2ZWN0b3IgdXNlZCBmb3IgcHJlZGljdGlvbgotICAgICAgICAgIHJlZlBpYyAgICAgICAgcG9pbnRlciB0byByZWZlcmVuY2UgcGljdHVyZSBzdHJ1Y3R1cmUKLSAgICAgICAgICB4QSAgICAgICAgICAgIHgtY29vcmRpbmF0ZSBmb3IgY3VycmVudCBtYWNyb2Jsb2NrCi0gICAgICAgICAgeUEgICAgICAgICAgICB5LWNvb3JkaW5hdGUgZm9yIGN1cnJlbnQgbWFjcm9ibG9jawotICAgICAgICAgIHBhcnRYICAgICAgICAgeC1vZmZzZXQgZm9yIHBhcnRpdGlvbiBpbiBtYWNyb2Jsb2NrCi0gICAgICAgICAgcGFydFkgICAgICAgICB5LW9mZnNldCBmb3IgcGFydGl0aW9uIGluIG1hY3JvYmxvY2sKLSAgICAgICAgICBwYXJ0V2lkdGggICAgIHdpZHRoIG9mIHBhcnRpdGlvbgotICAgICAgICAgIHBhcnRIZWlnaHQgICAgaGVpZ2h0IG9mIHBhcnRpdGlvbgotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIGRhdGEgICAgICAgICAgbWFjcm9ibG9jayBhcnJheSAoMTZ4MTYrOHg4Kzh4OCkgd2hlcmUgcHJlZGljdGVkCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb24gaXMgc3RvcmVkIGF0IGNvcnJlY3QgcG9zaXRpb24KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLypsaW50IC1lezU1MH0gU3ltYm9sICdyZXMnIG5vdCBhY2Nlc3NlZCAqLwotdm9pZCBoMjY0YnNkUHJlZGljdFNhbXBsZXMoCi0gIHU4ICpkYXRhLAotICBtdl90ICptdiwKLSAgaW1hZ2VfdCAqcmVmUGljLAotICB1MzIgY29sQW5kUm93LAotICB1MzIgcGFydCwKLSAgdTggKnBGaWxsKQotCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHhGcmFjLCB5RnJhYzsKLSAgICB1MzIgd2lkdGgsIGhlaWdodDsKLSAgICBpMzIgeEludCwgeUludCwgeDAsIHkwOwotICAgIHU4ICpwYXJ0RGF0YSwgKnJlZjsKLSAgICBPTVhTaXplIHJvaTsKLSAgICB1MzIgZmlsbFdpZHRoOwotICAgIHUzMiBmaWxsSGVpZ2h0OwotICAgIE9NWFJlc3VsdCByZXM7Ci0gICAgdTMyIHhBLCB5QTsKLSAgICB1MzIgcGFydFgsIHBhcnRZOwotICAgIHUzMiBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQ7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQobXYpOwotICAgIEFTU0VSVChyZWZQaWMpOwotICAgIEFTU0VSVChyZWZQaWMtPmRhdGEpOwotICAgIEFTU0VSVChyZWZQaWMtPndpZHRoKTsKLSAgICBBU1NFUlQocmVmUGljLT5oZWlnaHQpOwotCi0gICAgeEEgPSAoY29sQW5kUm93ICYgMHhGRkZGMDAwMCkgPj4gMTY7Ci0gICAgeUEgPSAoY29sQW5kUm93ICYgMHgwMDAwRkZGRik7Ci0KLSAgICBwYXJ0WCA9IChwYXJ0ICYgMHhGRjAwMDAwMCkgPj4gMjQ7Ci0gICAgcGFydFkgPSAocGFydCAmIDB4MDBGRjAwMDApID4+IDE2OwotICAgIHBhcnRXaWR0aCA9IChwYXJ0ICYgMHgwMDAwRkYwMCkgPj4gODsKLSAgICBwYXJ0SGVpZ2h0ID0gKHBhcnQgJiAweDAwMDAwMEZGKTsKLQotICAgIEFTU0VSVChwYXJ0V2lkdGgpOwotICAgIEFTU0VSVChwYXJ0SGVpZ2h0KTsKLQotICAgIC8qIGx1bWEgKi8KLSAgICBwYXJ0RGF0YSA9IGRhdGEgKyAxNipwYXJ0WSArIHBhcnRYOwotCi0gICAgeEZyYWMgPSBtdi0+aG9yICYgMHgzOwotICAgIHlGcmFjID0gbXYtPnZlciAmIDB4MzsKLQotICAgIHdpZHRoID0gMTYgKiByZWZQaWMtPndpZHRoOwotICAgIGhlaWdodCA9IDE2ICogcmVmUGljLT5oZWlnaHQ7Ci0KLSAgICB4SW50ID0gKGkzMil4QSArIChpMzIpcGFydFggKyAobXYtPmhvciA+PiAyKTsKLSAgICB5SW50ID0gKGkzMil5QSArIChpMzIpcGFydFkgKyAobXYtPnZlciA+PiAyKTsKLQotICAgIHgwID0gKHhGcmFjKSA/IHhJbnQtMiA6IHhJbnQ7Ci0gICAgeTAgPSAoeUZyYWMpID8geUludC0yIDogeUludDsKLQotICAgIGlmICh4RnJhYykKLSAgICB7Ci0gICAgICAgIGlmIChwYXJ0V2lkdGggPT0gMTYpCi0gICAgICAgICAgICBmaWxsV2lkdGggPSAzMjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZmlsbFdpZHRoID0gMTY7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgZmlsbFdpZHRoID0gKHBhcnRXaWR0aCoyKTsKLSAgICBpZiAoeUZyYWMpCi0gICAgICAgIGZpbGxIZWlnaHQgPSBwYXJ0SGVpZ2h0KzU7Ci0gICAgZWxzZQotICAgICAgICBmaWxsSGVpZ2h0ID0gcGFydEhlaWdodDsKLQotCi0gICAgaWYgKCh4MCA8IDApIHx8ICgodTMyKXgwK2ZpbGxXaWR0aCA+IHdpZHRoKSB8fAotICAgICAgICAoeTAgPCAwKSB8fCAoKHUzMil5MCtmaWxsSGVpZ2h0ID4gaGVpZ2h0KSkKLSAgICB7Ci0gICAgICAgIGgyNjRic2RGaWxsQmxvY2socmVmUGljLT5kYXRhLCAodTgqKXBGaWxsLCB4MCwgeTAsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgZmlsbFdpZHRoLCBmaWxsSGVpZ2h0LCBmaWxsV2lkdGgpOwotCi0gICAgICAgIHgwID0gMDsKLSAgICAgICAgeTAgPSAwOwotICAgICAgICByZWYgPSBwRmlsbDsKLSAgICAgICAgd2lkdGggPSBmaWxsV2lkdGg7Ci0gICAgICAgIGlmICh5RnJhYykKLSAgICAgICAgICAgIHJlZiArPSAyKndpZHRoOwotICAgICAgICBpZiAoeEZyYWMpCi0gICAgICAgICAgICByZWYgKz0gMjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLypsaW50IC0tZSg3MzcpIExvc3Mgb2Ygc2lnbiAqLwotICAgICAgICByZWYgPSByZWZQaWMtPmRhdGEgKyB5SW50KndpZHRoICsgeEludDsKLSAgICB9Ci0gICAgLyogTHVtYSBpbnRlcnBvbGF0aW9uICovCi0gICAgcm9pLndpZHRoID0gKGkzMilwYXJ0V2lkdGg7Ci0gICAgcm9pLmhlaWdodCA9IChpMzIpcGFydEhlaWdodDsKLQotICAgIHJlcyA9IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hKHJlZiwgKGkzMil3aWR0aCwgcGFydERhdGEsIDE2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzIpeEZyYWMsIChpMzIpeUZyYWMsIHJvaSk7Ci0gICAgQVNTRVJUKHJlcyA9PSAwKTsKLQotICAgIC8qIENocm9tYSAqLwotICAgIHdpZHRoICA9IDggKiByZWZQaWMtPndpZHRoOwotICAgIGhlaWdodCA9IDggKiByZWZQaWMtPmhlaWdodDsKLQotICAgIHgwID0gKCh4QSArIHBhcnRYKSA+PiAxKSArIChtdi0+aG9yID4+IDMpOwotICAgIHkwID0gKCh5QSArIHBhcnRZKSA+PiAxKSArIChtdi0+dmVyID4+IDMpOwotICAgIHhGcmFjID0gbXYtPmhvciAmIDB4NzsKLSAgICB5RnJhYyA9IG12LT52ZXIgJiAweDc7Ci0KLSAgICByZWYgPSByZWZQaWMtPmRhdGEgKyAyNTYgKiByZWZQaWMtPndpZHRoICogcmVmUGljLT5oZWlnaHQ7Ci0KLSAgICByb2kud2lkdGggPSAoaTMyKShwYXJ0V2lkdGggPj4gMSk7Ci0gICAgZmlsbFdpZHRoID0gKChwYXJ0V2lkdGggPj4gMSkgKyA4KSAmIH4weDc7Ci0gICAgcm9pLmhlaWdodCA9IChpMzIpKHBhcnRIZWlnaHQgPj4gMSk7Ci0gICAgZmlsbEhlaWdodCA9IChwYXJ0SGVpZ2h0ID4+IDEpICsgMTsKLQotICAgIGlmICgoeDAgPCAwKSB8fCAoKHUzMil4MCtmaWxsV2lkdGggPiB3aWR0aCkgfHwKLSAgICAgICAgKHkwIDwgMCkgfHwgKCh1MzIpeTArZmlsbEhlaWdodCA+IGhlaWdodCkpCi0gICAgewotICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHJlZiwgcEZpbGwsIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgIGZpbGxXaWR0aCwgZmlsbEhlaWdodCwgZmlsbFdpZHRoKTsKLSAgICAgICAgcmVmICs9IHdpZHRoICogaGVpZ2h0OwotICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHJlZiwgcEZpbGwgKyBmaWxsV2lkdGgqZmlsbEhlaWdodCwKLSAgICAgICAgICAgIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwgZmlsbFdpZHRoLAotICAgICAgICAgICAgZmlsbEhlaWdodCwgZmlsbFdpZHRoKTsKLQotICAgICAgICByZWYgPSBwRmlsbDsKLSAgICAgICAgeDAgPSAwOwotICAgICAgICB5MCA9IDA7Ci0gICAgICAgIHdpZHRoID0gZmlsbFdpZHRoOwotICAgICAgICBoZWlnaHQgPSBmaWxsSGVpZ2h0OwotICAgIH0KLQotICAgIHBhcnREYXRhID0gZGF0YSArIDE2KjE2ICsgKHBhcnRZPj4xKSo4ICsgKHBhcnRYPj4xKTsKLQotICAgIC8qIENocm9tYSBpbnRlcnBvbGF0aW9uICovCi0gICAgLypsaW50IC0tZSg3MzcpIExvc3Mgb2Ygc2lnbiAqLwotICAgIHJlZiArPSB5MCAqIHdpZHRoICsgeDA7Ci0gICAgcmVzID0gYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEocmVmLCB3aWR0aCwgcGFydERhdGEsIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUzMilyb2kud2lkdGgsICh1MzIpcm9pLmhlaWdodCwgeEZyYWMsIHlGcmFjKTsKLSAgICBBU1NFUlQocmVzID09IDApOwotICAgIHBhcnREYXRhICs9IDggKiA4OwotICAgIHJlZiArPSBoZWlnaHQgKiB3aWR0aDsKLSAgICByZXMgPSBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYShyZWYsIHdpZHRoLCBwYXJ0RGF0YSwgOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTMyKXJvaS53aWR0aCwgKHUzMilyb2kuaGVpZ2h0LCB4RnJhYywgeUZyYWMpOwotICAgIEFTU0VSVChyZXMgPT0gMCk7Ci0KLX0KLQotI2VuZGlmIC8qIEgyNjRERUNfT01YREwgKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEZpbGxSb3cxCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgYSByb3cgb2YgcmVmZXJlbmNlIHBlbHMgaW4gYSAnbm9ybWFsJyBjYXNlIHdoZW4gbm8KLSAgICAgICAgICBvdmVyZmlsbGluZyBpcyBuZWNlc3NhcnkuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB2b2lkIEZpbGxSb3cxKAotICB1OCAqcmVmLAotICB1OCAqZmlsbCwKLSAgaTMyIGxlZnQsCi0gIGkzMiBjZW50ZXIsCi0gIGkzMiByaWdodCkKLXsKLSAgICBVTlVTRUQobGVmdCk7Ci0gICAgVU5VU0VEKHJpZ2h0KTsKLSAgICBBU1NFUlQocmVmKTsKLSAgICBBU1NFUlQoZmlsbCk7Ci0KLSAgICBIMjY0U3dEZWNNZW1jcHkoZmlsbCwgcmVmLCAodTMyKWNlbnRlcik7Ci0KLSAgICAvKmxpbnQgLWUoNzE1KSAqLwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEZpbGxSb3c3Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgYSByb3cgb2YgcmVmZXJlbmNlIHBlbHMgd2hlbiBob3Jpem9udGFsIGNvb3JkaW5hdGUKLSAgICAgICAgICBpcyBwYXJ0bHkgbmVnYXRpdmUgb3IgcGFydGx5IGdyZWF0ZXIgdGhhbiByZWZlcmVuY2UgcGljdHVyZSB3aWR0aAotICAgICAgICAgIChvdmVyZmlsbGluZyBzb21lIHBlbHMgb24gbGVmdCBhbmQvb3IgcmlnaHQgZWRnZSkuCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICByZWYgICAgICAgcG9pbnRlciB0byByZWZlcmVuY2Ugc2FtcGxlcwotICAgICAgICAgIGxlZnQgICAgICBhbW91bnQgb2YgcGl4ZWxzIHRvIG92ZXJmaWxsIG9uIGxlZnQtZWRnZQotICAgICAgICAgIGNlbnRlciAgICBhbW91bnQgb2YgcGl4ZWxzIHRvIGNvcHkKLSAgICAgICAgICByaWdodCAgICAgYW1vdW50IG9mIHBpeGVscyB0byBvdmVyZmlsbCBvbiByaWdodC1lZGdlCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgZmlsbCAgICAgIHBvaW50ZXIgd2hlcmUgc2FtcGxlcyBhcmUgc3RvcmVkCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWZuZGVmIEgyNjRERUNfTkVPTgotdm9pZCBoMjY0YnNkRmlsbFJvdzcoCi0gIHU4ICpyZWYsCi0gIHU4ICpmaWxsLAotICBpMzIgbGVmdCwKLSAgaTMyIGNlbnRlciwKLSAgaTMyIHJpZ2h0KQotewotICAgIHU4IHRtcDsKLQotICAgIEFTU0VSVChyZWYpOwotICAgIEFTU0VSVChmaWxsKTsKLQotICAgIGlmIChsZWZ0KQotICAgICAgICB0bXAgPSAqcmVmOwotCi0gICAgZm9yICggOyBsZWZ0OyBsZWZ0LS0pCi0gICAgICAgIC8qbGludCAtZXN5bSg2NDQsdG1wKSAgdG1wIGlzIGluaXRpYWxpemVkIGlmIHVzZWQgKi8KLSAgICAgICAgKmZpbGwrKyA9IHRtcDsKLQotICAgIGZvciAoIDsgY2VudGVyOyBjZW50ZXItLSkKLSAgICAgICAgKmZpbGwrKyA9ICpyZWYrKzsKLQotICAgIGlmIChyaWdodCkKLSAgICAgICAgdG1wID0gcmVmWy0xXTsKLQotICAgIGZvciAoIDsgcmlnaHQ7IHJpZ2h0LS0pCi0gICAgICAgIC8qbGludCAtZXN5bSg2NDQsdG1wKSAgdG1wIGlzIGluaXRpYWxpemVkIGlmIHVzZWQgKi8KLSAgICAgICAgKmZpbGwrKyA9IHRtcDsKLX0KLSNlbmRpZgotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkRmlsbEJsb2NrCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgYSBibG9jayBvZiByZWZlcmVuY2UgcGVscy4gSXQgZGV0ZXJtaW5lcyB3aGV0aGVyCi0gICAgICAgICAgb3ZlcmZpbGxpbmcgaXMgbmVlZGVkIG9yIG5vdCBhbmQgcmVwZWF0ZWRseSBjYWxscyBhbiBhcHByb3ByaWF0ZQotICAgICAgICAgIGZ1bmN0aW9uIChieSB1c2luZyBhIGZ1bmN0aW9uIHBvaW50ZXIpIHRoYXQgZmlsbHMgb25lIHJvdyB0aGUgYmxvY2suCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICByZWYgICAgICAgICAgICAgICBwb2ludGVyIHRvIHJlZmVyZW5jZSBmcmFtZQotICAgICAgICAgIHgwICAgICAgICAgICAgICAgIHgtY29vcmRpbmF0ZSBmb3IgYmxvY2sKLSAgICAgICAgICB5MCAgICAgICAgICAgICAgICB5LWNvb3JkaW5hdGUgZm9yIGJsb2NrCi0gICAgICAgICAgd2lkdGggICAgICAgICAgICAgd2lkdGggb2YgcmVmZXJlbmNlIGZyYW1lCi0gICAgICAgICAgaGVpZ2h0ICAgICAgICAgICAgaGVpZ2h0IG9mIHJlZmVyZW5jZSBmcmFtZQotICAgICAgICAgIGJsb2NrV2lkdGggICAgICAgIHdpZHRoIG9mIGJsb2NrCi0gICAgICAgICAgYmxvY2tIZWlnaHQgICAgICAgaGVpZ2h0IG9mIGJsb2NrCi0gICAgICAgICAgZmlsbFNjYW5MZW5ndGggICAgbGVuZ3RoIG9mIGEgbGluZSBpbiBvdXRwdXQgYXJyYXkgKHBpeGVscykKLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICBmaWxsICAgICAgICAgICAgICBwb2ludGVyIHRvIGFycmF5IHdoZXJlIG91dHB1dCBibG9jayBpcyB3cml0dGVuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgaDI2NGJzZEZpbGxCbG9jaygKLSAgdTggKnJlZiwKLSAgdTggKmZpbGwsCi0gIGkzMiB4MCwKLSAgaTMyIHkwLAotICB1MzIgd2lkdGgsCi0gIHUzMiBoZWlnaHQsCi0gIHUzMiBibG9ja1dpZHRoLAotICB1MzIgYmxvY2tIZWlnaHQsCi0gIHUzMiBmaWxsU2Nhbkxlbmd0aCkKLQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIGkzMiB4c3RvcCwgeXN0b3A7Ci0gICAgdm9pZCAoKmZwKSh1OCosIHU4KiwgaTMyLCBpMzIsIGkzMik7Ci0gICAgaTMyIGxlZnQsIHgsIHJpZ2h0OwotICAgIGkzMiB0b3AsIHksIGJvdHRvbTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHJlZik7Ci0gICAgQVNTRVJUKGZpbGwpOwotICAgIEFTU0VSVCh3aWR0aCk7Ci0gICAgQVNTRVJUKGhlaWdodCk7Ci0gICAgQVNTRVJUKGZpbGwpOwotICAgIEFTU0VSVChibG9ja1dpZHRoKTsKLSAgICBBU1NFUlQoYmxvY2tIZWlnaHQpOwotCi0gICAgeHN0b3AgPSB4MCArIChpMzIpYmxvY2tXaWR0aDsKLSAgICB5c3RvcCA9IHkwICsgKGkzMilibG9ja0hlaWdodDsKLQotICAgIC8qIENob29zZSBjb3JyZWN0IGZ1bmN0aW9uIHdoZXRoZXIgb3ZlcmZpbGxpbmcgb24gbGVmdC1lZGdlIG9yIHJpZ2h0LWVkZ2UKLSAgICAgKiBpcyBuZWVkZWQgb3Igbm90ICovCi0gICAgaWYgKHgwID49IDAgJiYgeHN0b3AgPD0gKGkzMil3aWR0aCkKLSAgICAgICAgZnAgPSBGaWxsUm93MTsKLSAgICBlbHNlCi0gICAgICAgIGZwID0gaDI2NGJzZEZpbGxSb3c3OwotCi0gICAgaWYgKHlzdG9wIDwgMCkKLSAgICAgICAgeTAgPSAtKGkzMilibG9ja0hlaWdodDsKLQotICAgIGlmICh4c3RvcCA8IDApCi0gICAgICAgIHgwID0gLShpMzIpYmxvY2tXaWR0aDsKLQotICAgIGlmICh5MCA+IChpMzIpaGVpZ2h0KQotICAgICAgICB5MCA9IChpMzIpaGVpZ2h0OwotCi0gICAgaWYgKHgwID4gKGkzMil3aWR0aCkKLSAgICAgICAgeDAgPSAoaTMyKXdpZHRoOwotCi0gICAgeHN0b3AgPSB4MCArIChpMzIpYmxvY2tXaWR0aDsKLSAgICB5c3RvcCA9IHkwICsgKGkzMilibG9ja0hlaWdodDsKLQotICAgIGlmICh4MCA+IDApCi0gICAgICAgIHJlZiArPSB4MDsKLQotICAgIGlmICh5MCA+IDApCi0gICAgICAgIHJlZiArPSB5MCAqIChpMzIpd2lkdGg7Ci0KLSAgICBsZWZ0ID0geDAgPCAwID8gLXgwIDogMDsKLSAgICByaWdodCA9IHhzdG9wID4gKGkzMil3aWR0aCA/IHhzdG9wIC0gKGkzMil3aWR0aCA6IDA7Ci0gICAgeCA9IChpMzIpYmxvY2tXaWR0aCAtIGxlZnQgLSByaWdodDsKLQotICAgIHRvcCA9IHkwIDwgMCA/IC15MCA6IDA7Ci0gICAgYm90dG9tID0geXN0b3AgPiAoaTMyKWhlaWdodCA/IHlzdG9wIC0gKGkzMiloZWlnaHQgOiAwOwotICAgIHkgPSAoaTMyKWJsb2NrSGVpZ2h0IC0gdG9wIC0gYm90dG9tOwotCi0gICAgLyogVG9wLW92ZXJmaWxsaW5nICovCi0gICAgZm9yICggOyB0b3A7IHRvcC0tICkKLSAgICB7Ci0gICAgICAgICgqZnApKHJlZiwgZmlsbCwgbGVmdCwgeCwgcmlnaHQpOwotICAgICAgICBmaWxsICs9IGZpbGxTY2FuTGVuZ3RoOwotICAgIH0KLQotICAgIC8qIExpbmVzIGluc2lkZSByZWZlcmVuY2UgaW1hZ2UgKi8KLSAgICBmb3IgKCA7IHk7IHktLSApCi0gICAgewotICAgICAgICAoKmZwKShyZWYsIGZpbGwsIGxlZnQsIHgsIHJpZ2h0KTsKLSAgICAgICAgcmVmICs9IHdpZHRoOwotICAgICAgICBmaWxsICs9IGZpbGxTY2FuTGVuZ3RoOwotICAgIH0KLQotICAgIHJlZiAtPSB3aWR0aDsKLQotICAgIC8qIEJvdHRvbS1vdmVyZmlsbGluZyAqLwotICAgIGZvciAoIDsgYm90dG9tOyBib3R0b20tLSApCi0gICAgewotICAgICAgICAoKmZwKShyZWYsIGZpbGwsIGxlZnQsIHgsIHJpZ2h0KTsKLSAgICAgICAgZmlsbCArPSBmaWxsU2Nhbkxlbmd0aDsKLSAgICB9Ci19Ci0KLS8qbGludCArZTcwMSArZTcwMiAqLwotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9yZWNvbnN0cnVjdC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3JlY29uc3RydWN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMWExNDAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3JlY29uc3RydWN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLSAgICAzLiBEYXRhIHR5cGVzCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIEgyNjRTV0RFQ19SRUNPTlNUUlVDVF9ICi0jZGVmaW5lIEgyNjRTV0RFQ19SRUNPTlNUUlVDVF9ICi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLSNpbmNsdWRlICJoMjY0YnNkX21hY3JvYmxvY2tfbGF5ZXIuaCIKLSNpbmNsdWRlICJoMjY0YnNkX2ltYWdlLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gRGF0YSB0eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmbmRlZiBIMjY0REVDX09NWERMCi12b2lkIGgyNjRic2RQcmVkaWN0U2FtcGxlcygKLSAgdTggKmRhdGEsCi0gIG12X3QgKm12LAotICBpbWFnZV90ICpyZWZQaWMsCi0gIHUzMiB4QSwKLSAgdTMyIHlBLAotICB1MzIgcGFydFgsCi0gIHUzMiBwYXJ0WSwKLSAgdTMyIHBhcnRXaWR0aCwKLSAgdTMyIHBhcnRIZWlnaHQpOwotI2Vsc2UKLXZvaWQgaDI2NGJzZFByZWRpY3RTYW1wbGVzKAotICB1OCAqZGF0YSwKLSAgbXZfdCAqbXYsCi0gIGltYWdlX3QgKnJlZlBpYywKLSAgdTMyIGNvbEFuZFJvdywvKiBwYWNrYWdlZCBkYXRhIHwgY29sdW1uICAgIHwgcm93ICAgICAgICAgICAgICAgIHwqLwotICB1MzIgcGFydCwgICAgIC8qIHBhY2thZ2VkIGRhdGEgfHBhcnRYfHBhcnRZfHBhcnRXaWR0aHxwYXJ0SGVpZ2h0fCovCi0gIHU4ICpwRmlsbCk7Ci0jZW5kaWYKLQotdm9pZCBoMjY0YnNkRmlsbEJsb2NrKAotICB1OCAqIHJlZiwKLSAgdTggKiBmaWxsLAotICBpMzIgeDAsCi0gIGkzMiB5MCwKLSAgdTMyIHdpZHRoLAotICB1MzIgaGVpZ2h0LAotICB1MzIgYmxvY2tXaWR0aCwKLSAgdTMyIGJsb2NrSGVpZ2h0LAotICB1MzIgZmlsbFNjYW5MZW5ndGgpOwotCi12b2lkIGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYUhvcigKLSAgdTggKnBSZWYsCi0gIHU4ICpwcmVkUGFydENocm9tYSwKLSAgaTMyIHgwLAotICBpMzIgeTAsCi0gIHUzMiB3aWR0aCwKLSAgdTMyIGhlaWdodCwKLSAgdTMyIHhGcmFjLAotICB1MzIgY2hyb21hUGFydFdpZHRoLAotICB1MzIgY2hyb21hUGFydEhlaWdodCk7Ci0KLXZvaWQgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hVmVyKAotICB1OCAqcFJlZiwKLSAgdTggKnByZWRQYXJ0Q2hyb21hLAotICBpMzIgeDAsCi0gIGkzMiB5MCwKLSAgdTMyIHdpZHRoLAotICB1MzIgaGVpZ2h0LAotICB1MzIgeUZyYWMsCi0gIHUzMiBjaHJvbWFQYXJ0V2lkdGgsCi0gIHUzMiBjaHJvbWFQYXJ0SGVpZ2h0KTsKLQotdm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFIb3JWZXIoCi0gIHU4ICpyZWYsCi0gIHU4ICpwcmVkUGFydENocm9tYSwKLSAgaTMyIHgwLAotICBpMzIgeTAsCi0gIHUzMiB3aWR0aCwKLSAgdTMyIGhlaWdodCwKLSAgdTMyIHhGcmFjLAotICB1MzIgeUZyYWMsCi0gIHUzMiBjaHJvbWFQYXJ0V2lkdGgsCi0gIHUzMiBjaHJvbWFQYXJ0SGVpZ2h0KTsKLQotdm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVWZXJIYWxmKAotICB1OCAqcmVmLAotICB1OCAqbWIsCi0gIGkzMiB4MCwKLSAgaTMyIHkwLAotICB1MzIgd2lkdGgsCi0gIHUzMiBoZWlnaHQsCi0gIHUzMiBwYXJ0V2lkdGgsCi0gIHUzMiBwYXJ0SGVpZ2h0KTsKLQotdm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVWZXJRdWFydGVyKAotICB1OCAqcmVmLAotICB1OCAqbWIsCi0gIGkzMiB4MCwKLSAgaTMyIHkwLAotICB1MzIgd2lkdGgsCi0gIHUzMiBoZWlnaHQsCi0gIHUzMiBwYXJ0V2lkdGgsCi0gIHUzMiBwYXJ0SGVpZ2h0LAotICB1MzIgdmVyT2Zmc2V0KTsKLQotdm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVIb3JIYWxmKAotICB1OCAqcmVmLAotICB1OCAqbWIsCi0gIGkzMiB4MCwKLSAgaTMyIHkwLAotICB1MzIgd2lkdGgsCi0gIHUzMiBoZWlnaHQsCi0gIHUzMiBwYXJ0V2lkdGgsCi0gIHUzMiBwYXJ0SGVpZ2h0KTsKLQotdm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVIb3JRdWFydGVyKAotICB1OCAqcmVmLAotICB1OCAqbWIsCi0gIGkzMiB4MCwKLSAgaTMyIHkwLAotICB1MzIgd2lkdGgsCi0gIHUzMiBoZWlnaHQsCi0gIHUzMiBwYXJ0V2lkdGgsCi0gIHUzMiBwYXJ0SGVpZ2h0LAotICB1MzIgaG9yT2Zmc2V0KTsKLQotdm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVIb3JWZXJRdWFydGVyKAotICB1OCAqcmVmLAotICB1OCAqbWIsCi0gIGkzMiB4MCwKLSAgaTMyIHkwLAotICB1MzIgd2lkdGgsCi0gIHUzMiBoZWlnaHQsCi0gIHUzMiBwYXJ0V2lkdGgsCi0gIHUzMiBwYXJ0SGVpZ2h0LAotICB1MzIgaG9yVmVyT2Zmc2V0KTsKLQotdm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVNaWRIYWxmKAotICB1OCAqcmVmLAotICB1OCAqbWIsCi0gIGkzMiB4MCwKLSAgaTMyIHkwLAotICB1MzIgd2lkdGgsCi0gIHUzMiBoZWlnaHQsCi0gIHUzMiBwYXJ0V2lkdGgsCi0gIHUzMiBwYXJ0SGVpZ2h0KTsKLQotdm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVNaWRWZXJRdWFydGVyKAotICB1OCAqcmVmLAotICB1OCAqbWIsCi0gIGkzMiB4MCwKLSAgaTMyIHkwLAotICB1MzIgd2lkdGgsCi0gIHUzMiBoZWlnaHQsCi0gIHUzMiBwYXJ0V2lkdGgsCi0gIHUzMiBwYXJ0SGVpZ2h0LAotICB1MzIgdmVyT2Zmc2V0KTsKLQotdm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVNaWRIb3JRdWFydGVyKAotICB1OCAqcmVmLAotICB1OCAqbWIsCi0gIGkzMiB4MCwKLSAgaTMyIHkwLAotICB1MzIgd2lkdGgsCi0gIHUzMiBoZWlnaHQsCi0gIHUzMiBwYXJ0V2lkdGgsCi0gIHUzMiBwYXJ0SGVpZ2h0LAotICB1MzIgaG9yT2Zmc2V0KTsKLQotCi12b2lkIGgyNjRic2RGaWxsUm93NygKLSAgdTggKnJlZiwKLSAgdTggKmZpbGwsCi0gIGkzMiBsZWZ0LAotICBpMzIgY2VudGVyLAotICBpMzIgcmlnaHQpOwotCi0jZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19SRUNPTlNUUlVDVF9IICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zZWkuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zZWkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc1NmM0Ny4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2VpLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLSAgICAgMy4gTW9kdWxlIGRlZmluZXMKLSAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotICAgICA1LiBGdW5jdGlvbnMKLSAgICAgICAgICBoMjY0YnNkRGVjb2RlU2VpTWVzc2FnZQotICAgICAgICAgIERlY29kZUJ1ZmZlcmluZ1BlcmlvZAotICAgICAgICAgIERlY29kZVBpY3R1cmVUaW1pbmcKLSAgICAgICAgICBEZWNvZGVQYW5TY2FuUmVjdGFuZ2xlCi0gICAgICAgICAgRGVjb2RlRmlsbGVyUGF5bG9hZAotICAgICAgICAgIERlY29kZVVzZXJEYXRhUmVnaXN0ZXJlZElUdVRUMzUKLSAgICAgICAgICBEZWNvZGVVc2VyRGF0YVVucmVnaXN0ZXJlZAotICAgICAgICAgIERlY29kZVJlY292ZXJ5UG9pbnQKLSAgICAgICAgICBEZWNvZGVEZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbgotICAgICAgICAgIERlY29kZVNwYXJlUGljCi0gICAgICAgICAgRGVjb2RlU2NlbmVJbmZvCi0gICAgICAgICAgRGVjb2RlU3ViU2VxSW5mbwotICAgICAgICAgIERlY29kZVN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzCi0gICAgICAgICAgRGVjb2RlU3ViU2VxQ2hhcmFjdGVyaXN0aWNzCi0gICAgICAgICAgRGVjb2RlRnVsbEZyYW1lRnJlZXplCi0gICAgICAgICAgRGVjb2RlRnVsbEZyYW1lU25hcHNob3QKLSAgICAgICAgICBEZWNvZGVQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnQKLSAgICAgICAgICBEZWNvZGVQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50RW5kCi0gICAgICAgICAgRGVjb2RlTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0Ci0gICAgICAgICAgRGVjb2RlUmVzZXJ2ZWRTZWlNZXNzYWdlCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiaDI2NGJzZF9zZWkuaCIKLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgotI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF92bGMuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3NlcV9wYXJhbV9zZXQuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2hlYWRlci5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgY29uc3QgdTMyIG51bUNsb2NrVFNbOV0gPSB7MSwxLDEsMiwyLDMsMywyLDN9Owotc3RhdGljIGNvbnN0IHUzMiBjZWlsTG9nMk51bVNsaWNlR3JvdXBzWzldID0gezAsMSwxLDIsMiwzLDMsMywzfTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIERlY29kZUJ1ZmZlcmluZ1BlcmlvZCgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlCdWZmZXJpbmdQZXJpb2RfdCAqcEJ1ZmZlcmluZ1BlcmlvZCwKLSAgdTMyIGNwYkNudCwKLSAgdTMyIGluaXRpYWxDcGJSZW1vdmFsRGVsYXlMZW5ndGgsCi0gIHUzMiBuYWxIcmRCcFByZXNlbnRGbGFnLAotICB1MzIgdmNsSHJkQnBQcmVzZW50RmxhZyk7Ci0KLXN0YXRpYyB1MzIgRGVjb2RlUGljdHVyZVRpbWluZygKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlQaWNUaW1pbmdfdCAqcFBpY1RpbWluZywKLSAgdTMyIGNwYlJlbW92YWxEZWxheUxlbmd0aCwKLSAgdTMyIGRwYk91dHB1dERlbGF5TGVuZ3RoLAotICB1MzIgdGltZU9mZnNldExlbmd0aCwKLSAgdTMyIGNwYkRwYkRlbGF5c1ByZXNlbnRGbGFnLAotICB1MzIgcGljU3RydWN0UHJlc2VudEZsYWcpOwotCi1zdGF0aWMgdTMyIERlY29kZVBhblNjYW5SZWN0YW5nbGUoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpUGFuU2NhblJlY3RfdCAqcFBhblNjYW5SZWN0YW5nbGUpOwotCi1zdGF0aWMgdTMyIERlY29kZUZpbGxlclBheWxvYWQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCB1MzIgcGF5bG9hZFNpemUpOwotCi1zdGF0aWMgdTMyIERlY29kZVVzZXJEYXRhUmVnaXN0ZXJlZElUdVRUMzUoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpVXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNV90ICpwVXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNSwKLSAgdTMyIHBheWxvYWRTaXplKTsKLQotc3RhdGljIHUzMiBEZWNvZGVVc2VyRGF0YVVucmVnaXN0ZXJlZCgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlVc2VyRGF0YVVucmVnaXN0ZXJlZF90ICpwVXNlckRhdGFVbnJlZ2lzdGVyZWQsCi0gIHUzMiBwYXlsb2FkU2l6ZSk7Ci0KLXN0YXRpYyB1MzIgRGVjb2RlUmVjb3ZlcnlQb2ludCgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlSZWNvdmVyeVBvaW50X3QgKnBSZWNvdmVyeVBvaW50KTsKLQotc3RhdGljIHUzMiBEZWNvZGVEZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbigKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlEZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbl90ICpwRGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb24sCi0gIHUzMiBudW1SZWZGcmFtZXMpOwotCi1zdGF0aWMgdTMyIERlY29kZVNwYXJlUGljKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlaVNwYXJlUGljX3QgKnBTcGFyZVBpYywKLSAgdTMyIHBpY1NpemVJbk1hcFVuaXRzKTsKLQotc3RhdGljIHUzMiBEZWNvZGVTY2VuZUluZm8oCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpU2NlbmVJbmZvX3QgKnBTY2VuZUluZm8pOwotCi1zdGF0aWMgdTMyIERlY29kZVN1YlNlcUluZm8oCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpU3ViU2VxSW5mb190ICpwU3ViU2VxSW5mbyk7Ci0KLXN0YXRpYyB1MzIgRGVjb2RlU3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3MoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpU3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3NfdCAqcFN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzKTsKLQotc3RhdGljIHUzMiBEZWNvZGVTdWJTZXFDaGFyYWN0ZXJpc3RpY3MoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpU3ViU2VxQ2hhcmFjdGVyaXN0aWNzX3QgKnBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MpOwotCi1zdGF0aWMgdTMyIERlY29kZUZ1bGxGcmFtZUZyZWV6ZSgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlGdWxsRnJhbWVGcmVlemVfdCAqcEZ1bGxGcmFtZUZyZWV6ZSk7Ci0KLXN0YXRpYyB1MzIgRGVjb2RlRnVsbEZyYW1lU25hcHNob3QoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpRnVsbEZyYW1lU25hcHNob3RfdCAqcEZ1bGxGcmFtZVNuYXBzaG90KTsKLQotc3RhdGljIHUzMiBEZWNvZGVQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnQoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0X3QgKnBQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnQpOwotCi1zdGF0aWMgdTMyIERlY29kZVByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRFbmQoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudEVuZF90ICpwUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudEVuZCk7Ci0KLXN0YXRpYyB1MzIgRGVjb2RlTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0KAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlaU1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldF90ICpwTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0LAotICB1MzIgbnVtU2xpY2VHcm91cHMpOwotCi1zdGF0aWMgdTMyIERlY29kZVJlc2VydmVkU2VpTWVzc2FnZSgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlSZXNlcnZlZFNlaU1lc3NhZ2VfdCAqcFJlc2VydmVkU2VpTWVzc2FnZSwKLSAgdTMyIHBheWxvYWRTaXplKTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkRGVjb2RlU2VpTWVzc2FnZQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgPCsrPgotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgPCsrPgotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIDwrKz4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2REZWNvZGVTZWlNZXNzYWdlKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCwKLSAgc2VpTWVzc2FnZV90ICpwU2VpTWVzc2FnZSwKLSAgdTMyIG51bVNsaWNlR3JvdXBzKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXAsIHBheWxvYWRUeXBlLCBwYXlsb2FkU2l6ZSwgc3RhdHVzOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocFNlaU1lc3NhZ2UpOwotCi0KLSAgICBIMjY0U3dEZWNNZW1zZXQocFNlaU1lc3NhZ2UsIDAsIHNpemVvZihzZWlNZXNzYWdlX3QpKTsKLQotICAgIGRvCi0gICAgewotICAgICAgICBwYXlsb2FkVHlwZSA9IDA7Ci0gICAgICAgIHdoaWxlKCh0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDgpKSA9PSAweEZGKQotICAgICAgICB7Ci0gICAgICAgICAgICBwYXlsb2FkVHlwZSArPSAyNTU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwYXlsb2FkVHlwZSArPSB0bXA7Ci0KLSAgICAgICAgcGF5bG9hZFNpemUgPSAwOwotICAgICAgICB3aGlsZSgodG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA4KSkgPT0gMHhGRikKLSAgICAgICAgewotICAgICAgICAgICAgcGF5bG9hZFNpemUgKz0gMjU1OwotICAgICAgICB9Ci0gICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcGF5bG9hZFNpemUgKz0gdG1wOwotCi0gICAgICAgIHBTZWlNZXNzYWdlLT5wYXlsb2FkVHlwZSA9IHBheWxvYWRUeXBlOwotCi0gICAgICAgIHN3aXRjaCAocGF5bG9hZFR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICBBU1NFUlQocFNlcVBhcmFtU2V0KTsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVCdWZmZXJpbmdQZXJpb2QoCi0gICAgICAgICAgICAgICAgICBwU3RybURhdGEsCi0gICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPmJ1ZmZlcmluZ1BlcmlvZCwKLSAgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVycy5jcGJDbnQsCi0gICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnMuCi0gICAgICAgICAgICAgICAgICBpbml0aWFsQ3BiUmVtb3ZhbERlbGF5TGVuZ3RoLAotICAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzLT5uYWxIcmRQYXJhbWV0ZXJzUHJlc2VudEZsYWcsCi0gICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnNQcmVzZW50RmxhZyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICBBU1NFUlQocFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzUHJlc2VudEZsYWcpOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZVBpY3R1cmVUaW1pbmcoCi0gICAgICAgICAgICAgICAgICBwU3RybURhdGEsCi0gICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPnBpY1RpbWluZywKLSAgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVycy4KLSAgICAgICAgICAgICAgICAgICAgICBjcGJSZW1vdmFsRGVsYXlMZW5ndGgsCi0gICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnMuCi0gICAgICAgICAgICAgICAgICAgICAgZHBiT3V0cHV0RGVsYXlMZW5ndGgsCi0gICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnMuCi0gICAgICAgICAgICAgICAgICAgIHRpbWVPZmZzZXRMZW5ndGgsCi0gICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPm5hbEhyZFBhcmFtZXRlcnNQcmVzZW50RmxhZyB8fAotICAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzUHJlc2VudEZsYWcgPwotICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0UsCi0gICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPnBpY1N0cnVjdFByZXNlbnRGbGFnKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZVBhblNjYW5SZWN0YW5nbGUoCi0gICAgICAgICAgICAgICAgICBwU3RybURhdGEsCi0gICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPnBhblNjYW5SZWN0KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZUZpbGxlclBheWxvYWQocFN0cm1EYXRhLCBwYXlsb2FkU2l6ZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVVc2VyRGF0YVJlZ2lzdGVyZWRJVHVUVDM1KAotICAgICAgICAgICAgICAgICAgcFN0cm1EYXRhLAotICAgICAgICAgICAgICAgICAgJnBTZWlNZXNzYWdlLT51c2VyRGF0YVJlZ2lzdGVyZWRJdHVUVDM1LAotICAgICAgICAgICAgICAgICAgcGF5bG9hZFNpemUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlVXNlckRhdGFVbnJlZ2lzdGVyZWQoCi0gICAgICAgICAgICAgICAgICBwU3RybURhdGEsCi0gICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPnVzZXJEYXRhVW5yZWdpc3RlcmVkLAotICAgICAgICAgICAgICAgICAgcGF5bG9hZFNpemUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlUmVjb3ZlcnlQb2ludCgKLSAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKLSAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+cmVjb3ZlcnlQb2ludCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVEZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbigKLSAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKLSAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+ZGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb24sCi0gICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPm51bVJlZkZyYW1lcyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgICAgICBBU1NFUlQocFNlcVBhcmFtU2V0KTsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVTcGFyZVBpYygKLSAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKLSAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+c3BhcmVQaWMsCi0gICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnBpY1dpZHRoSW5NYnMgKiBwU2VxUGFyYW1TZXQtPnBpY0hlaWdodEluTWJzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSA5OgotICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZVNjZW5lSW5mbygKLSAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKLSAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+c2NlbmVJbmZvKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAxMDoKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVTdWJTZXFJbmZvKAotICAgICAgICAgICAgICAgICAgcFN0cm1EYXRhLAotICAgICAgICAgICAgICAgICAgJnBTZWlNZXNzYWdlLT5zdWJTZXFJbmZvKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAxMToKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcygKLSAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKLSAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+c3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3MpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDEyOgotICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZVN1YlNlcUNoYXJhY3RlcmlzdGljcygKLSAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKLSAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+c3ViU2VxQ2hhcmFjdGVyaXN0aWNzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAxMzoKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVGdWxsRnJhbWVGcmVlemUoCi0gICAgICAgICAgICAgICAgICBwU3RybURhdGEsCi0gICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPmZ1bGxGcmFtZUZyZWV6ZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMTQ6IC8qIFRoaXMgU0VJIGRvZXMgbm90IGNvbnRhaW4gZGF0YSwgd2hhdCB0byBkbyA/Pz8gKi8KLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBIQU5UUk9fT0s7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlRnVsbEZyYW1lU25hcHNob3QoCi0gICAgICAgICAgICAgICAgICBwU3RybURhdGEsCi0gICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPmZ1bGxGcmFtZVNuYXBzaG90KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnQoCi0gICAgICAgICAgICAgICAgICBwU3RybURhdGEsCi0gICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPnByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRTdGFydCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMTc6Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudEVuZCgKLSAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKLSAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+cHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudEVuZCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMTg6Ci0gICAgICAgICAgICAgICAgQVNTRVJUKG51bVNsaWNlR3JvdXBzKTsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQoCi0gICAgICAgICAgICAgICAgICBwU3RybURhdGEsCi0gICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPm1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldCwKLSAgICAgICAgICAgICAgICAgIG51bVNsaWNlR3JvdXBzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVSZXNlcnZlZFNlaU1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICBwU3RybURhdGEsCi0gICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPnJlc2VydmVkU2VpTWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgIHBheWxvYWRTaXplKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzdGF0dXMgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHN0YXR1cyk7Ci0KLSAgICAgICAgd2hpbGUgKCFoMjY0YnNkSXNCeXRlQWxpZ25lZChwU3RybURhdGEpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKSAhPSAxKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIHdoaWxlICghaDI2NGJzZElzQnl0ZUFsaWduZWQocFN0cm1EYXRhKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKSAhPSAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlIChoMjY0YnNkTW9yZVJic3BEYXRhKHBTdHJtRGF0YSkpOwotCi0gICAgcmV0dXJuKGgyNjRic2RSYnNwVHJhaWxpbmdCaXRzKHBTdHJtRGF0YSkpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlQnVmZmVyaW5nUGVyaW9kCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIElucHV0czoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgPCsrPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIERlY29kZUJ1ZmZlcmluZ1BlcmlvZCgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlCdWZmZXJpbmdQZXJpb2RfdCAqcEJ1ZmZlcmluZ1BlcmlvZCwKLSAgdTMyIGNwYkNudCwKLSAgdTMyIGluaXRpYWxDcGJSZW1vdmFsRGVsYXlMZW5ndGgsCi0gIHUzMiBuYWxIcmRCcFByZXNlbnRGbGFnLAotICB1MzIgdmNsSHJkQnBQcmVzZW50RmxhZykKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wLCBpOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocEJ1ZmZlcmluZ1BlcmlvZCk7Ci0gICAgQVNTRVJUKGNwYkNudCk7Ci0gICAgQVNTRVJUKGluaXRpYWxDcGJSZW1vdmFsRGVsYXlMZW5ndGgpOwotCi0KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgJnBCdWZmZXJpbmdQZXJpb2QtPnNlcVBhcmFtZXRlclNldElkKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgaWYgKHBCdWZmZXJpbmdQZXJpb2QtPnNlcVBhcmFtZXRlclNldElkID4gMzEpCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIGlmIChuYWxIcmRCcFByZXNlbnRGbGFnKQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGNwYkNudDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIGluaXRpYWxDcGJSZW1vdmFsRGVsYXlMZW5ndGgpOwotICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIGlmICh0bXAgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICBwQnVmZmVyaW5nUGVyaW9kLT5pbml0aWFsQ3BiUmVtb3ZhbERlbGF5W2ldID0gdG1wOwotCi0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIGluaXRpYWxDcGJSZW1vdmFsRGVsYXlMZW5ndGgpOwotICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIHBCdWZmZXJpbmdQZXJpb2QtPmluaXRpYWxDcGJSZW1vdmFsRGVsYXlPZmZzZXRbaV0gPSB0bXA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAodmNsSHJkQnBQcmVzZW50RmxhZykKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjcGJDbnQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCBpbml0aWFsQ3BiUmVtb3ZhbERlbGF5TGVuZ3RoKTsKLSAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICBwQnVmZmVyaW5nUGVyaW9kLT5pbml0aWFsQ3BiUmVtb3ZhbERlbGF5W2ldID0gdG1wOwotCi0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIGluaXRpYWxDcGJSZW1vdmFsRGVsYXlMZW5ndGgpOwotICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIHBCdWZmZXJpbmdQZXJpb2QtPmluaXRpYWxDcGJSZW1vdmFsRGVsYXlPZmZzZXRbaV0gPSB0bXA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERlY29kZVBpY3R1cmVUaW1pbmcKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICA8Kys+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgRGVjb2RlUGljdHVyZVRpbWluZygKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlQaWNUaW1pbmdfdCAqcFBpY1RpbWluZywKLSAgdTMyIGNwYlJlbW92YWxEZWxheUxlbmd0aCwKLSAgdTMyIGRwYk91dHB1dERlbGF5TGVuZ3RoLAotICB1MzIgdGltZU9mZnNldExlbmd0aCwKLSAgdTMyIGNwYkRwYkRlbGF5c1ByZXNlbnRGbGFnLAotICB1MzIgcGljU3RydWN0UHJlc2VudEZsYWcpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcCwgaTsKLSAgICBpMzIgaXRtcDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBQaWNUaW1pbmcpOwotCi0KLSAgICBpZiAoY3BiRHBiRGVsYXlzUHJlc2VudEZsYWcpCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIGNwYlJlbW92YWxEZWxheUxlbmd0aCk7Ci0gICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcFBpY1RpbWluZy0+Y3BiUmVtb3ZhbERlbGF5ID0gdG1wOwotCi0gICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgZHBiT3V0cHV0RGVsYXlMZW5ndGgpOwotICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBQaWNUaW1pbmctPmRwYk91dHB1dERlbGF5ID0gdG1wOwotICAgIH0KLQotICAgIGlmIChwaWNTdHJ1Y3RQcmVzZW50RmxhZykKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgNCk7Ci0gICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgaWYgKHRtcCA+IDgpCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBQaWNUaW1pbmctPnBpY1N0cnVjdCA9IHRtcDsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQ2xvY2tUU1twUGljVGltaW5nLT5waWNTdHJ1Y3RdOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgcFBpY1RpbWluZy0+Y2xvY2tUaW1lU3RhbXBGbGFnW2ldID0gdG1wID09IDEgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICAgICAgICAgIGlmIChwUGljVGltaW5nLT5jbG9ja1RpbWVTdGFtcEZsYWdbaV0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAyKTsKLSAgICAgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICBwUGljVGltaW5nLT5jdFR5cGVbaV0gPSB0bXA7Ci0KLSAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPm51aXRGaWVsZEJhc2VkRmxhZ1tpXSA9IHRtcCA9PSAxID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA1KTsKLSAgICAgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICBpZiAodG1wID4gNikKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPmNvdW50aW5nVHlwZVtpXSA9IHRtcDsKLQotICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+ZnVsbFRpbWVTdGFtcEZsYWdbaV0gPSB0bXAgPT0gMSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+ZGlzY29udGludWl0eUZsYWdbaV0gPSB0bXAgPT0gMSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+Y250RHJvcHBlZEZsYWdbaV0gPSB0bXAgPT0gMSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgOCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+bkZyYW1lc1tpXSA9IHRtcDsKLQotICAgICAgICAgICAgICAgIGlmIChwUGljVGltaW5nLT5mdWxsVGltZVN0YW1wRmxhZ1tpXSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgNik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA+IDU5KQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgICAgICBwUGljVGltaW5nLT5zZWNvbmRzVmFsdWVbaV0gPSB0bXA7Ci0KLSAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA2KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgICAgICBpZiAodG1wID4gNTkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPm1pbnV0ZXNWYWx1ZVtpXSA9IHRtcDsKLQotICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDUpOwotICAgICAgICAgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPiAyMykKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+aG91cnNWYWx1ZVtpXSA9IHRtcDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgICAgICBwUGljVGltaW5nLT5zZWNvbmRzRmxhZ1tpXSA9IHRtcCA9PSAxID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChwUGljVGltaW5nLT5zZWNvbmRzRmxhZ1tpXSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wID4gNTkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+c2Vjb25kc1ZhbHVlW2ldID0gdG1wOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPm1pbnV0ZXNGbGFnW2ldID0gdG1wID09IDEgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwUGljVGltaW5nLT5taW51dGVzRmxhZ1tpXSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPiA1OSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPm1pbnV0ZXNWYWx1ZVtpXSA9IHRtcDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+aG91cnNGbGFnW2ldID0gdG1wID09IDEgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocFBpY1RpbWluZy0+aG91cnNGbGFnW2ldKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wID4gMjMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPmhvdXJzVmFsdWVbaV0gPSB0bXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh0aW1lT2Zmc2V0TGVuZ3RoKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCB0aW1lT2Zmc2V0TGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgICAgICBpdG1wID0gKGkzMil0bXA7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGZvbGxvd2luZyAiY29udmVydHMiIHRpbWVPZmZzZXRMZW5ndGgtYml0IHNpZ25lZAotICAgICAgICAgICAgICAgICAgICAgKiBpbnRlZ2VyIGludG8gaTMyICovCi0gICAgICAgICAgICAgICAgICAgIC8qbGludCAtc2F2ZSAtZTcwMSAtZTcwMiAqLwotICAgICAgICAgICAgICAgICAgICBpdG1wIDw8PSAoMzIgLSB0aW1lT2Zmc2V0TGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgaXRtcCA+Pj0gKDMyIC0gdGltZU9mZnNldExlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qbGludCAtcmVzdG9yZSAqLwotICAgICAgICAgICAgICAgICAgICBwUGljVGltaW5nLT50aW1lT2Zmc2V0W2ldID0gaXRtcDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPnRpbWVPZmZzZXRbaV0gPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZWNvZGVQYW5TY2FuUmVjdGFuZ2xlCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIElucHV0czoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgPCsrPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIERlY29kZVBhblNjYW5SZWN0YW5nbGUoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpUGFuU2NhblJlY3RfdCAqcFBhblNjYW5SZWN0YW5nbGUpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcCwgaTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBQYW5TY2FuUmVjdGFuZ2xlKTsKLQotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICZwUGFuU2NhblJlY3RhbmdsZS0+cGFuU2NhblJlY3RJZCk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwUGFuU2NhblJlY3RhbmdsZS0+cGFuU2NhblJlY3RDYW5jZWxGbGFnID0gdG1wID09IDEgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgIGlmICghcFBhblNjYW5SZWN0YW5nbGUtPnBhblNjYW5SZWN0Q2FuY2VsRmxhZykKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgJnBQYW5TY2FuUmVjdGFuZ2xlLT5wYW5TY2FuQ250KTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgaWYgKHBQYW5TY2FuUmVjdGFuZ2xlLT5wYW5TY2FuQ250ID4gMikKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcFBhblNjYW5SZWN0YW5nbGUtPnBhblNjYW5DbnQrKzsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFBhblNjYW5SZWN0YW5nbGUtPnBhblNjYW5DbnQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgICAgICZwUGFuU2NhblJlY3RhbmdsZS0+cGFuU2NhblJlY3RMZWZ0T2Zmc2V0W2ldKTsKLSAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotCi0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAgICAgJnBQYW5TY2FuUmVjdGFuZ2xlLT5wYW5TY2FuUmVjdFJpZ2h0T2Zmc2V0W2ldKTsKLSAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotCi0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAgICAgJnBQYW5TY2FuUmVjdGFuZ2xlLT5wYW5TY2FuUmVjdFRvcE9mZnNldFtpXSk7Ci0gICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLQotICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgICAgICZwUGFuU2NhblJlY3RhbmdsZS0+cGFuU2NhblJlY3RCb3R0b21PZmZzZXRbaV0pOwotICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgIH0KLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAmcFBhblNjYW5SZWN0YW5nbGUtPnBhblNjYW5SZWN0UmVwZXRpdGlvblBlcmlvZCk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgIGlmIChwUGFuU2NhblJlY3RhbmdsZS0+cGFuU2NhblJlY3RSZXBldGl0aW9uUGVyaW9kID4gMTYzODQpCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIGlmIChwUGFuU2NhblJlY3RhbmdsZS0+cGFuU2NhbkNudCA+IDEgJiYKLSAgICAgICAgICBwUGFuU2NhblJlY3RhbmdsZS0+cGFuU2NhblJlY3RSZXBldGl0aW9uUGVyaW9kID4gMSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZWNvZGVGaWxsZXJQYXlsb2FkCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIElucHV0czoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgPCsrPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIERlY29kZUZpbGxlclBheWxvYWQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCB1MzIgcGF5bG9hZFNpemUpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLQotCi0gICAgaWYgKHBheWxvYWRTaXplKQotICAgICAgICBpZiAoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsIDggKiBwYXlsb2FkU2l6ZSkgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlVXNlckRhdGFSZWdpc3RlcmVkSVR1VFQzNQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgPCsrPgotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgPCsrPgotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIDwrKz4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBEZWNvZGVVc2VyRGF0YVJlZ2lzdGVyZWRJVHVUVDM1KAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlaVVzZXJEYXRhUmVnaXN0ZXJlZEl0dVRUMzVfdCAqcFVzZXJEYXRhUmVnaXN0ZXJlZEl0dVRUMzUsCi0gIHUzMiBwYXlsb2FkU2l6ZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wLCBpLCBqOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocFVzZXJEYXRhUmVnaXN0ZXJlZEl0dVRUMzUpOwotICAgIEFTU0VSVChwYXlsb2FkU2l6ZSk7Ci0KLSAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA4KTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwVXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNS0+aXR1VFQzNUNvdW50cnlDb2RlID0gdG1wOwotCi0gICAgaWYgKHBVc2VyRGF0YVJlZ2lzdGVyZWRJdHVUVDM1LT5pdHVUVDM1Q291bnRyeUNvZGUgIT0gMHhGRikKLSAgICAgICAgaSA9IDE7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA4KTsKLSAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwVXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNS0+aXR1VFQzNUNvdW50cnlDb2RlRXh0ZW5zaW9uQnl0ZSA9IHRtcDsKLSAgICAgICAgaSA9IDI7Ci0gICAgfQotCi0gICAgLyogd2hlcmUgY29ycmVzcG9uZGluZyBGUkVFKCkgPz8/ICovCi0gICAgQUxMT0NBVEUocFVzZXJEYXRhUmVnaXN0ZXJlZEl0dVRUMzUtPml0dVRUMzVQYXlsb2FkQnl0ZSxwYXlsb2FkU2l6ZS1pLHU4KTsKLSAgICBwVXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNS0+bnVtUGF5bG9hZEJ5dGVzID0gcGF5bG9hZFNpemUgLSBpOwotICAgIGlmIChwVXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNS0+aXR1VFQzNVBheWxvYWRCeXRlID09IE5VTEwpCi0gICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7Ci0KLSAgICBqID0gMDsKLSAgICBkbwotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA4KTsKLSAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwVXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNS0+aXR1VFQzNVBheWxvYWRCeXRlW2pdID0gKHU4KXRtcDsKLSAgICAgICAgaSsrOwotICAgICAgICBqKys7Ci0gICAgfSB3aGlsZSAoaSA8IHBheWxvYWRTaXplKTsKLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlVXNlckRhdGFVbnJlZ2lzdGVyZWQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICA8Kys+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgRGVjb2RlVXNlckRhdGFVbnJlZ2lzdGVyZWQoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpVXNlckRhdGFVbnJlZ2lzdGVyZWRfdCAqcFVzZXJEYXRhVW5yZWdpc3RlcmVkLAotICB1MzIgcGF5bG9hZFNpemUpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGksIHRtcDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBVc2VyRGF0YVVucmVnaXN0ZXJlZCk7Ci0KLQotICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgewotICAgICAgICBwVXNlckRhdGFVbnJlZ2lzdGVyZWQtPnV1aWRJc29JZWMxMTU3OFtpXSA9IGgyNjRic2RTaG93Qml0czMyKHBTdHJtRGF0YSk7Ci0gICAgICAgIGlmIChoMjY0YnNkRmx1c2hCaXRzKHBTdHJtRGF0YSwzMikgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0KLSAgICAvKiB3aGVyZSBjb3JyZXNwb25kaW5nIEZSRUUoKSA/Pz8gKi8KLSAgICBBTExPQ0FURShwVXNlckRhdGFVbnJlZ2lzdGVyZWQtPnVzZXJEYXRhUGF5bG9hZEJ5dGUsIHBheWxvYWRTaXplIC0gMTYsIHU4KTsKLSAgICBpZiAocFVzZXJEYXRhVW5yZWdpc3RlcmVkLT51c2VyRGF0YVBheWxvYWRCeXRlID09IE5VTEwpCi0gICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7Ci0KLSAgICBwVXNlckRhdGFVbnJlZ2lzdGVyZWQtPm51bVBheWxvYWRCeXRlcyA9IHBheWxvYWRTaXplIC0gMTY7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgcGF5bG9hZFNpemUgLSAxNjsgaSsrKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA4KTsKLSAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwVXNlckRhdGFVbnJlZ2lzdGVyZWQtPnVzZXJEYXRhUGF5bG9hZEJ5dGVbaV0gPSAodTgpdG1wOwotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlUmVjb3ZlcnlQb2ludAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgPCsrPgotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgPCsrPgotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIDwrKz4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBEZWNvZGVSZWNvdmVyeVBvaW50KAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlaVJlY292ZXJ5UG9pbnRfdCAqcFJlY292ZXJ5UG9pbnQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBSZWNvdmVyeVBvaW50KTsKLQotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgJnBSZWNvdmVyeVBvaW50LT5yZWNvdmVyeUZyYW1lQ250KTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBSZWNvdmVyeVBvaW50LT5leGFjdE1hdGNoRmxhZyA9IHRtcCA9PSAxID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBSZWNvdmVyeVBvaW50LT5icm9rZW5MaW5rRmxhZyA9IHRtcCA9PSAxID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDIpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIGlmICh0bXAgPiAyKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcFJlY292ZXJ5UG9pbnQtPmNoYW5naW5nU2xpY2VHcm91cElkYyA9IHRtcDsKLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlRGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb24KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICA8Kys+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgRGVjb2RlRGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb24oCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpRGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb25fdCAqcERlY1JlZlBpY01hcmtpbmdSZXBldGl0aW9uLAotICB1MzIgbnVtUmVmRnJhbWVzKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwRGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb24pOwotCi0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBEZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbi0+b3JpZ2luYWxJZHJGbGFnID0gdG1wID09IDEgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAmcERlY1JlZlBpY01hcmtpbmdSZXBldGl0aW9uLT5vcmlnaW5hbEZyYW1lTnVtKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAvKiBmcmFtZV9tYnNfb25seV9mbGFnIGFzc3VtZWQgYWx3YXlzIHRydWUgc28gc29tZSBmaWVsZCByZWxhdGVkIHN5bnRheAotICAgICAqIGVsZW1lbnRzIGFyZSBza2lwcGVkLCBzZWUgSC4yNjQgc3RhbmRhcmQgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjUmVmUGljTWFya2luZyhwU3RybURhdGEsCi0gICAgICAmcERlY1JlZlBpY01hcmtpbmdSZXBldGl0aW9uLT5kZWNSZWZQaWNNYXJraW5nLCBOQUxfU0VJLCBudW1SZWZGcmFtZXMpOwotCi0gICAgcmV0dXJuKHRtcCk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZWNvZGVTcGFyZVBpYwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgPCsrPgotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgPCsrPgotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIDwrKz4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBEZWNvZGVTcGFyZVBpYygKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlTcGFyZVBpY190ICpwU3BhcmVQaWMsCi0gIHUzMiBwaWNTaXplSW5NYXBVbml0cykKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wLCBpLCBqLCBtYXBVbml0Q250OwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocFNwYXJlUGljKTsKLQotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgJnBTcGFyZVBpYy0+dGFyZ2V0RnJhbWVOdW0pOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcFNwYXJlUGljLT5zcGFyZUZpZWxkRmxhZyA9IHRtcCA9PSAxID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0gICAgLyogZG8gbm90IGFjY2VwdCBmaWVsZHMgKi8KLSAgICBpZiAocFNwYXJlUGljLT5zcGFyZUZpZWxkRmxhZykKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnBTcGFyZVBpYy0+bnVtU3BhcmVQaWNzKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgcFNwYXJlUGljLT5udW1TcGFyZVBpY3MrKzsKLSAgICBpZiAocFNwYXJlUGljLT5udW1TcGFyZVBpY3MgPiBNQVhfTlVNX1NQQVJFX1BJQ1MpCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBwU3BhcmVQaWMtPm51bVNwYXJlUGljczsgaSsrKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAmcFNwYXJlUGljLT5kZWx0YVNwYXJlRnJhbWVOdW1baV0pOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotCi0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgICAmcFNwYXJlUGljLT5zcGFyZUFyZWFJZGNbaV0pOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICBpZiAocFNwYXJlUGljLT5zcGFyZUFyZWFJZGNbaV0gPiAyKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgICAgIGlmIChwU3BhcmVQaWMtPnNwYXJlQXJlYUlkY1tpXSA9PSAxKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiB3aGVyZSBjb3JyZXNwb25kaW5nIEZSRUUoKSA/Pz8gKi8KLSAgICAgICAgICAgIEFMTE9DQVRFKHBTcGFyZVBpYy0+c3BhcmVVbml0RmxhZ1tpXSwgcGljU2l6ZUluTWFwVW5pdHMsIHUzMik7Ci0gICAgICAgICAgICBpZiAocFNwYXJlUGljLT5zcGFyZVVuaXRGbGFnW2ldID09IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuKE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKTsKLSAgICAgICAgICAgIHBTcGFyZVBpYy0+emVyb1J1bkxlbmd0aFtpXSA9IE5VTEw7Ci0KLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwaWNTaXplSW5NYXBVbml0czsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgcFNwYXJlUGljLT5zcGFyZVVuaXRGbGFnW2ldW2pdID0gdG1wID09IDEgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocFNwYXJlUGljLT5zcGFyZUFyZWFJZGNbaV0gPT0gMikKLSAgICAgICAgewotICAgICAgICAgICAgLyogd2hlcmUgY29ycmVzcG9uZGluZyBGUkVFKCkgPz8/ICovCi0gICAgICAgICAgICBBTExPQ0FURShwU3BhcmVQaWMtPnplcm9SdW5MZW5ndGhbaV0sIHBpY1NpemVJbk1hcFVuaXRzLCB1MzIpOwotICAgICAgICAgICAgaWYgKHBTcGFyZVBpYy0+emVyb1J1bkxlbmd0aFtpXSA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7Ci0gICAgICAgICAgICBwU3BhcmVQaWMtPnNwYXJlVW5pdEZsYWdbaV0gPSBOVUxMOwotCi0gICAgICAgICAgICBmb3IgKGogPSAwLCBtYXBVbml0Q250ID0gMDsgbWFwVW5pdENudCA8IHBpY1NpemVJbk1hcFVuaXRzOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAgICAgICAgICZwU3BhcmVQaWMtPnplcm9SdW5MZW5ndGhbaV1bal0pOwotICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgICAgICAgICBtYXBVbml0Q250ICs9IHBTcGFyZVBpYy0+emVyb1J1bkxlbmd0aFtpXVtqXSArIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBzZXQgcmVzdCB0byBudWxsICovCi0gICAgZm9yIChpID0gcFNwYXJlUGljLT5udW1TcGFyZVBpY3M7IGkgPCBNQVhfTlVNX1NQQVJFX1BJQ1M7IGkrKykKLSAgICB7Ci0gICAgICAgIHBTcGFyZVBpYy0+c3BhcmVVbml0RmxhZ1tpXSA9IE5VTEw7Ci0gICAgICAgIHBTcGFyZVBpYy0+emVyb1J1bkxlbmd0aFtpXSA9IE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZWNvZGVTY2VuZUluZm8KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICA8Kys+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgRGVjb2RlU2NlbmVJbmZvKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlaVNjZW5lSW5mb190ICpwU2NlbmVJbmZvKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwU2NlbmVJbmZvKTsKLQotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwU2NlbmVJbmZvLT5zY2VuZUluZm9QcmVzZW50RmxhZyA9IHRtcCA9PSAxID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICBpZiAocFNjZW5lSW5mby0+c2NlbmVJbmZvUHJlc2VudEZsYWcpCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmcFNjZW5lSW5mby0+c2NlbmVJZCk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAmcFNjZW5lSW5mby0+c2NlbmVUcmFuc2l0aW9uVHlwZSk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgIGlmIChwU2NlbmVJbmZvLT5zY2VuZVRyYW5zaXRpb25UeXBlID4gNikKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgICAgICBpZiAocFNjZW5lSW5mby0+c2NlbmVUcmFuc2l0aW9uVHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAgICAgJnBTY2VuZUluZm8tPnNlY29uZFNjZW5lSWQpOwotICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlU3ViU2VxSW5mbwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgPCsrPgotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgPCsrPgotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIDwrKz4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIERlY29kZVN1YlNlcUluZm8oCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpU3ViU2VxSW5mb190ICpwU3ViU2VxSW5mbykKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocFN1YlNlcUluZm8pOwotCi0KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgICAmcFN1YlNlcUluZm8tPnN1YlNlcUxheWVyTnVtKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgaWYgKHBTdWJTZXFJbmZvLT5zdWJTZXFMYXllck51bSA+IDI1NSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnBTdWJTZXFJbmZvLT5zdWJTZXFJZCk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotICAgIGlmIChwU3ViU2VxSW5mby0+c3ViU2VxSWQgPiA2NTUzNSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwU3ViU2VxSW5mby0+Zmlyc3RSZWZQaWNGbGFnID0gdG1wID09IDEgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcFN1YlNlcUluZm8tPmxlYWRpbmdOb25SZWZQaWNGbGFnID0gdG1wID09IDEgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcFN1YlNlcUluZm8tPmxhc3RQaWNGbGFnID0gdG1wID09IDEgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcFN1YlNlcUluZm8tPnN1YlNlcUZyYW1lTnVtRmxhZyA9IHRtcCA9PSAxID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICBpZiAocFN1YlNlcUluZm8tPnN1YlNlcUZyYW1lTnVtRmxhZykKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgICAmcFN1YlNlcUluZm8tPnN1YlNlcUZyYW1lTnVtKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERlY29kZVN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIElucHV0czoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgPCsrPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIERlY29kZVN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlaVN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzX3QgKnBTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcykKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wLCBpOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocFN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzKTsKLQotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICZwU3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3MtPm51bVN1YlNlcUxheWVycyk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotICAgIHBTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcy0+bnVtU3ViU2VxTGF5ZXJzKys7Ci0gICAgaWYgKHBTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcy0+bnVtU3ViU2VxTGF5ZXJzID4gTUFYX05VTV9TVUJfU0VRX0xBWUVSUykKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgZm9yIChpID0gMDsgaSA8IHBTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcy0+bnVtU3ViU2VxTGF5ZXJzOyBpKyspCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcy0+YWNjdXJhdGVTdGF0aXN0aWNzRmxhZ1tpXSA9Ci0gICAgICAgICAgICB0bXAgPT0gMSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMTYpOwotICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcy0+YXZlcmFnZUJpdFJhdGVbaV0gPSB0bXA7Ci0KLSAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxNik7Ci0gICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcFN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzLT5hdmVyYWdlRnJhbWVSYXRlW2ldID0gdG1wOwotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlU3ViU2VxQ2hhcmFjdGVyaXN0aWNzCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIElucHV0czoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgPCsrPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIERlY29kZVN1YlNlcUNoYXJhY3RlcmlzdGljcygKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlTdWJTZXFDaGFyYWN0ZXJpc3RpY3NfdCAqcFN1YlNlcUNoYXJhY3RlcmlzdGljcykKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wLCBpOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocFN1YlNlcUNoYXJhY3RlcmlzdGljcyk7Ci0KLQotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAmcFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+c3ViU2VxTGF5ZXJOdW0pOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLSAgICBpZiAocFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+c3ViU2VxTGF5ZXJOdW0gPiBNQVhfTlVNX1NVQl9TRVFfTEFZRVJTLTEpCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICZwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5zdWJTZXFJZCk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotICAgIGlmIChwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5zdWJTZXFJZCA+IDY1NTM1KQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPmR1cmF0aW9uRmxhZyA9IHRtcCA9PSAxID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgIGlmIChwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5kdXJhdGlvbkZsYWcpCi0gICAgewotICAgICAgICBwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5zdWJTZXFEdXJhdGlvbiA9IGgyNjRic2RTaG93Qml0czMyKHBTdHJtRGF0YSk7Ci0gICAgICAgIGlmIChoMjY0YnNkRmx1c2hCaXRzKHBTdHJtRGF0YSwzMikgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPmF2ZXJhZ2VSYXRlRmxhZyA9IHRtcCA9PSAxID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgIGlmIChwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5hdmVyYWdlUmF0ZUZsYWcpCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPmFjY3VyYXRlU3RhdGlzdGljc0ZsYWcgPQotICAgICAgICAgICAgdG1wID09IDEgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDE2KTsKLSAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5hdmVyYWdlQml0UmF0ZSA9IHRtcDsKLQotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDE2KTsKLSAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5hdmVyYWdlRnJhbWVSYXRlID0gdG1wOwotICAgIH0KLQotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAmcFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+bnVtUmVmZXJlbmNlZFN1YnNlcXMpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLSAgICBpZiAocFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+bnVtUmVmZXJlbmNlZFN1YnNlcXMgPiBNQVhfTlVNX1NVQl9TRVFfTEFZRVJTLTEpCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5udW1SZWZlcmVuY2VkU3Vic2VxczsgaSsrKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAmcFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+cmVmU3ViU2VxTGF5ZXJOdW1baV0pOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotCi0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgJnBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPnJlZlN1YlNlcUlkW2ldKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLQotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPnJlZlN1YlNlcURpcmVjdGlvbltpXSA9IHRtcDsKLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERlY29kZUZ1bGxGcmFtZUZyZWV6ZQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgPCsrPgotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgPCsrPgotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIDwrKz4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBEZWNvZGVGdWxsRnJhbWVGcmVlemUoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpRnVsbEZyYW1lRnJlZXplX3QgKnBGdWxsRnJhbWVGcmVlemUpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBGdWxsRnJhbWVGcmVlemUpOwotCi0KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgJnBGdWxsRnJhbWVGcmVlemUtPmZ1bGxGcmFtZUZyZWV6ZVJlcGV0aXRpb25QZXJpb2QpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLSAgICBpZiAocEZ1bGxGcmFtZUZyZWV6ZS0+ZnVsbEZyYW1lRnJlZXplUmVwZXRpdGlvblBlcmlvZCA+IDE2Mzg0KQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERlY29kZUZ1bGxGcmFtZVNuYXBzaG90Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIElucHV0czoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgPCsrPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIERlY29kZUZ1bGxGcmFtZVNuYXBzaG90KAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlaUZ1bGxGcmFtZVNuYXBzaG90X3QgKnBGdWxsRnJhbWVTbmFwc2hvdCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocEZ1bGxGcmFtZVNuYXBzaG90KTsKLQotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgJnBGdWxsRnJhbWVTbmFwc2hvdC0+c25hcFNob3RJZCk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZWNvZGVQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICA8Kys+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgRGVjb2RlUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0KAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlaVByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRTdGFydF90ICpwUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0KTsKLQotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICZwUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0LT5wcm9ncmVzc2l2ZVJlZmluZW1lbnRJZCk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICZwUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0LT5udW1SZWZpbmVtZW50U3RlcHMpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLSAgICBwUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0LT5udW1SZWZpbmVtZW50U3RlcHMrKzsKLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudEVuZAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgPCsrPgotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgPCsrPgotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIDwrKz4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBEZWNvZGVQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50RW5kKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlaVByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRFbmRfdCAqcFByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRFbmQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50RW5kKTsKLQotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICZwUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudEVuZC0+cHJvZ3Jlc3NpdmVSZWZpbmVtZW50SWQpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIElucHV0czoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgPCsrPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIERlY29kZU1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldCgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXRfdCAqcE1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldCwKLSAgdTMyIG51bVNsaWNlR3JvdXBzKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXAsaTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQpOwotICAgIEFTU0VSVChudW1TbGljZUdyb3VwcyA8IE1BWF9OVU1fU0xJQ0VfR1JPVVBTKTsKLQotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICZwTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0LT5udW1TbGljZUdyb3Vwc0luU2V0KTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgcE1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldC0+bnVtU2xpY2VHcm91cHNJblNldCsrOwotICAgIGlmIChwTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0LT5udW1TbGljZUdyb3Vwc0luU2V0ID4gbnVtU2xpY2VHcm91cHMpCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBwTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0LT5udW1TbGljZUdyb3Vwc0luU2V0OyBpKyspCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsCi0gICAgICAgICAgICBjZWlsTG9nMk51bVNsaWNlR3JvdXBzW251bVNsaWNlR3JvdXBzXSk7Ci0gICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcE1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldC0+c2xpY2VHcm91cElkW2ldID0gdG1wOwotICAgICAgICBpZiAocE1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldC0+c2xpY2VHcm91cElkW2ldID4KLSAgICAgICAgICBwTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0LT5udW1TbGljZUdyb3Vwc0luU2V0LTEpCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0LT5leGFjdFNhbXBsZVZhbHVlTWF0Y2hGbGFnID0KLSAgICAgICAgdG1wID09IDEgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcE1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldC0+cGFuU2NhblJlY3RGbGFnID0gdG1wID09IDEgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgaWYgKHBNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQtPnBhblNjYW5SZWN0RmxhZykKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgJnBNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQtPnBhblNjYW5SZWN0SWQpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlUmVzZXJ2ZWRTZWlNZXNzYWdlCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIElucHV0czoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgPCsrPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIERlY29kZVJlc2VydmVkU2VpTWVzc2FnZSgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlSZXNlcnZlZFNlaU1lc3NhZ2VfdCAqcFJlc2VydmVkU2VpTWVzc2FnZSwKLSAgdTMyIHBheWxvYWRTaXplKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpLCB0bXA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwUmVzZXJ2ZWRTZWlNZXNzYWdlKTsKLQotCi0gICAgLyogd2hlcmUgY29ycmVzcG9uZGluZyBGUkVFKCkgPz8/ICovCi0gICAgQUxMT0NBVEUocFJlc2VydmVkU2VpTWVzc2FnZS0+cmVzZXJ2ZWRTZWlNZXNzYWdlUGF5bG9hZEJ5dGUscGF5bG9hZFNpemUsdTgpOwotICAgIGlmIChwUmVzZXJ2ZWRTZWlNZXNzYWdlLT5yZXNlcnZlZFNlaU1lc3NhZ2VQYXlsb2FkQnl0ZSA9PSBOVUxMKQotICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOwotCi0gICAgcFJlc2VydmVkU2VpTWVzc2FnZS0+bnVtUGF5bG9hZEJ5dGVzID0gcGF5bG9hZFNpemU7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgcGF5bG9hZFNpemU7IGkrKykKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSw4KTsKLSAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwUmVzZXJ2ZWRTZWlNZXNzYWdlLT5yZXNlcnZlZFNlaU1lc3NhZ2VQYXlsb2FkQnl0ZVtpXSA9ICh1OCl0bXA7Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NlaS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NlaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmU1NDNhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zZWkuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotICAgIDMuIERhdGEgdHlwZXMKLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSDI2NFNXREVDX1NFSV9ICi0jZGVmaW5lIEgyNjRTV0RFQ19TRUlfSAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zdHJlYW0uaCIKLSNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2hlYWRlci5oIgotI2luY2x1ZGUgImgyNjRic2Rfc2VxX3BhcmFtX3NldC5oIgotI2luY2x1ZGUgImgyNjRic2RfdnVpLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgTUFYX1BBTl9TQ0FOX0NOVCAzMgotI2RlZmluZSBNQVhfTlVNX1NQQVJFX1BJQ1MgMTYKLSNkZWZpbmUgTUFYX05VTV9DTE9DS19UUyAzCi0jZGVmaW5lIE1BWF9OVU1fU1VCX1NFUV9MQVlFUlMgMjU2Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gRGF0YSB0eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1MzIgc2VxUGFyYW1ldGVyU2V0SWQ7Ci0gICAgdTMyIGluaXRpYWxDcGJSZW1vdmFsRGVsYXlbTUFYX0NQQl9DTlRdOwotICAgIHUzMiBpbml0aWFsQ3BiUmVtb3ZhbERlbGF5T2Zmc2V0W01BWF9DUEJfQ05UXTsKLX0gc2VpQnVmZmVyaW5nUGVyaW9kX3Q7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTMyIGNwYlJlbW92YWxEZWxheTsKLSAgICB1MzIgZHBiT3V0cHV0RGVsYXk7Ci0gICAgdTMyIHBpY1N0cnVjdDsKLSAgICB1MzIgY2xvY2tUaW1lU3RhbXBGbGFnW01BWF9OVU1fQ0xPQ0tfVFNdOwotICAgIHUzMiBjbG9ja1RpbWVTdGFtcFtNQVhfTlVNX0NMT0NLX1RTXTsKLSAgICB1MzIgY3RUeXBlW01BWF9OVU1fQ0xPQ0tfVFNdOwotICAgIHUzMiBudWl0RmllbGRCYXNlZEZsYWdbTUFYX05VTV9DTE9DS19UU107Ci0gICAgdTMyIGNvdW50aW5nVHlwZVtNQVhfTlVNX0NMT0NLX1RTXTsKLSAgICB1MzIgZnVsbFRpbWVTdGFtcEZsYWdbTUFYX05VTV9DTE9DS19UU107Ci0gICAgdTMyIGRpc2NvbnRpbnVpdHlGbGFnW01BWF9OVU1fQ0xPQ0tfVFNdOwotICAgIHUzMiBjbnREcm9wcGVkRmxhZ1tNQVhfTlVNX0NMT0NLX1RTXTsKLSAgICB1MzIgbkZyYW1lc1tNQVhfTlVNX0NMT0NLX1RTXTsKLSAgICB1MzIgc2Vjb25kc0ZsYWdbTUFYX05VTV9DTE9DS19UU107Ci0gICAgdTMyIHNlY29uZHNWYWx1ZVtNQVhfTlVNX0NMT0NLX1RTXTsKLSAgICB1MzIgbWludXRlc0ZsYWdbTUFYX05VTV9DTE9DS19UU107Ci0gICAgdTMyIG1pbnV0ZXNWYWx1ZVtNQVhfTlVNX0NMT0NLX1RTXTsKLSAgICB1MzIgaG91cnNGbGFnW01BWF9OVU1fQ0xPQ0tfVFNdOwotICAgIHUzMiBob3Vyc1ZhbHVlW01BWF9OVU1fQ0xPQ0tfVFNdOwotICAgIGkzMiB0aW1lT2Zmc2V0W01BWF9OVU1fQ0xPQ0tfVFNdOwotfSBzZWlQaWNUaW1pbmdfdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1MzIgcGFuU2NhblJlY3RJZDsKLSAgICB1MzIgcGFuU2NhblJlY3RDYW5jZWxGbGFnOwotICAgIHUzMiBwYW5TY2FuQ250OwotICAgIGkzMiBwYW5TY2FuUmVjdExlZnRPZmZzZXRbTUFYX1BBTl9TQ0FOX0NOVF07Ci0gICAgaTMyIHBhblNjYW5SZWN0UmlnaHRPZmZzZXRbTUFYX1BBTl9TQ0FOX0NOVF07Ci0gICAgaTMyIHBhblNjYW5SZWN0VG9wT2Zmc2V0W01BWF9QQU5fU0NBTl9DTlRdOwotICAgIGkzMiBwYW5TY2FuUmVjdEJvdHRvbU9mZnNldFtNQVhfUEFOX1NDQU5fQ05UXTsKLSAgICB1MzIgcGFuU2NhblJlY3RSZXBldGl0aW9uUGVyaW9kOwotfSBzZWlQYW5TY2FuUmVjdF90OwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHUzMiBpdHVUVDM1Q291bnRyeUNvZGU7Ci0gICAgdTMyIGl0dVRUMzVDb3VudHJ5Q29kZUV4dGVuc2lvbkJ5dGU7Ci0gICAgdTggKml0dVRUMzVQYXlsb2FkQnl0ZTsKLSAgICB1MzIgbnVtUGF5bG9hZEJ5dGVzOwotfSBzZWlVc2VyRGF0YVJlZ2lzdGVyZWRJdHVUVDM1X3Q7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTMyIHV1aWRJc29JZWMxMTU3OFs0XTsKLSAgICB1OCAqdXNlckRhdGFQYXlsb2FkQnl0ZTsKLSAgICB1MzIgbnVtUGF5bG9hZEJ5dGVzOwotfSBzZWlVc2VyRGF0YVVucmVnaXN0ZXJlZF90OwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHUzMiByZWNvdmVyeUZyYW1lQ250OwotICAgIHUzMiBleGFjdE1hdGNoRmxhZzsKLSAgICB1MzIgYnJva2VuTGlua0ZsYWc7Ci0gICAgdTMyIGNoYW5naW5nU2xpY2VHcm91cElkYzsKLX0gc2VpUmVjb3ZlcnlQb2ludF90OwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHUzMiBvcmlnaW5hbElkckZsYWc7Ci0gICAgdTMyIG9yaWdpbmFsRnJhbWVOdW07Ci0gICAgZGVjUmVmUGljTWFya2luZ190IGRlY1JlZlBpY01hcmtpbmc7Ci19IHNlaURlY1JlZlBpY01hcmtpbmdSZXBldGl0aW9uX3Q7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTMyIHRhcmdldEZyYW1lTnVtOwotICAgIHUzMiBzcGFyZUZpZWxkRmxhZzsKLSAgICB1MzIgdGFyZ2V0Qm90dG9tRmllbGRGbGFnOwotICAgIHUzMiBudW1TcGFyZVBpY3M7Ci0gICAgdTMyIGRlbHRhU3BhcmVGcmFtZU51bVtNQVhfTlVNX1NQQVJFX1BJQ1NdOwotICAgIHUzMiBzcGFyZUJvdHRvbUZpZWxkRmxhZ1tNQVhfTlVNX1NQQVJFX1BJQ1NdOwotICAgIHUzMiBzcGFyZUFyZWFJZGNbTUFYX05VTV9TUEFSRV9QSUNTXTsKLSAgICB1MzIgKnNwYXJlVW5pdEZsYWdbTUFYX05VTV9TUEFSRV9QSUNTXTsKLSAgICB1MzIgKnplcm9SdW5MZW5ndGhbTUFYX05VTV9TUEFSRV9QSUNTXTsKLX0gc2VpU3BhcmVQaWNfdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1MzIgc2NlbmVJbmZvUHJlc2VudEZsYWc7Ci0gICAgdTMyIHNjZW5lSWQ7Ci0gICAgdTMyIHNjZW5lVHJhbnNpdGlvblR5cGU7Ci0gICAgdTMyIHNlY29uZFNjZW5lSWQ7Ci19IHNlaVNjZW5lSW5mb190OwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHUzMiBzdWJTZXFMYXllck51bTsKLSAgICB1MzIgc3ViU2VxSWQ7Ci0gICAgdTMyIGZpcnN0UmVmUGljRmxhZzsKLSAgICB1MzIgbGVhZGluZ05vblJlZlBpY0ZsYWc7Ci0gICAgdTMyIGxhc3RQaWNGbGFnOwotICAgIHUzMiBzdWJTZXFGcmFtZU51bUZsYWc7Ci0gICAgdTMyIHN1YlNlcUZyYW1lTnVtOwotfSBzZWlTdWJTZXFJbmZvX3Q7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTMyIG51bVN1YlNlcUxheWVyczsKLSAgICB1MzIgYWNjdXJhdGVTdGF0aXN0aWNzRmxhZ1tNQVhfTlVNX1NVQl9TRVFfTEFZRVJTXTsKLSAgICB1MzIgYXZlcmFnZUJpdFJhdGVbTUFYX05VTV9TVUJfU0VRX0xBWUVSU107Ci0gICAgdTMyIGF2ZXJhZ2VGcmFtZVJhdGVbTUFYX05VTV9TVUJfU0VRX0xBWUVSU107Ci19IHNlaVN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzX3Q7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTMyIHN1YlNlcUxheWVyTnVtOwotICAgIHUzMiBzdWJTZXFJZDsKLSAgICB1MzIgZHVyYXRpb25GbGFnOwotICAgIHUzMiBzdWJTZXFEdXJhdGlvbjsKLSAgICB1MzIgYXZlcmFnZVJhdGVGbGFnOwotICAgIHUzMiBhY2N1cmF0ZVN0YXRpc3RpY3NGbGFnOwotICAgIHUzMiBhdmVyYWdlQml0UmF0ZTsKLSAgICB1MzIgYXZlcmFnZUZyYW1lUmF0ZTsKLSAgICB1MzIgbnVtUmVmZXJlbmNlZFN1YnNlcXM7Ci0gICAgdTMyIHJlZlN1YlNlcUxheWVyTnVtW01BWF9OVU1fU1VCX1NFUV9MQVlFUlNdOwotICAgIHUzMiByZWZTdWJTZXFJZFtNQVhfTlVNX1NVQl9TRVFfTEFZRVJTXTsKLSAgICB1MzIgcmVmU3ViU2VxRGlyZWN0aW9uW01BWF9OVU1fU1VCX1NFUV9MQVlFUlNdOwotfSBzZWlTdWJTZXFDaGFyYWN0ZXJpc3RpY3NfdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1MzIgZnVsbEZyYW1lRnJlZXplUmVwZXRpdGlvblBlcmlvZDsKLX0gc2VpRnVsbEZyYW1lRnJlZXplX3Q7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTMyIHNuYXBTaG90SWQ7Ci19IHNlaUZ1bGxGcmFtZVNuYXBzaG90X3Q7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTMyIHByb2dyZXNzaXZlUmVmaW5lbWVudElkOwotICAgIHUzMiBudW1SZWZpbmVtZW50U3RlcHM7Ci19IHNlaVByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRTdGFydF90OwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHUzMiBwcm9ncmVzc2l2ZVJlZmluZW1lbnRJZDsKLX0gc2VpUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudEVuZF90OwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHUzMiBudW1TbGljZUdyb3Vwc0luU2V0OwotICAgIHUzMiBzbGljZUdyb3VwSWRbTUFYX05VTV9TTElDRV9HUk9VUFNdOwotICAgIHUzMiBleGFjdFNhbXBsZVZhbHVlTWF0Y2hGbGFnOwotICAgIHUzMiBwYW5TY2FuUmVjdEZsYWc7Ci0gICAgdTMyIHBhblNjYW5SZWN0SWQ7Ci19IHNlaU1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldF90OwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHU4ICpyZXNlcnZlZFNlaU1lc3NhZ2VQYXlsb2FkQnl0ZTsKLSAgICB1MzIgbnVtUGF5bG9hZEJ5dGVzOwotfSBzZWlSZXNlcnZlZFNlaU1lc3NhZ2VfdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1MzIgcGF5bG9hZFR5cGU7Ci0gICAgc2VpQnVmZmVyaW5nUGVyaW9kX3QgYnVmZmVyaW5nUGVyaW9kOwotICAgIHNlaVBpY1RpbWluZ190IHBpY1RpbWluZzsKLSAgICBzZWlQYW5TY2FuUmVjdF90IHBhblNjYW5SZWN0OwotICAgIHNlaVVzZXJEYXRhUmVnaXN0ZXJlZEl0dVRUMzVfdCB1c2VyRGF0YVJlZ2lzdGVyZWRJdHVUVDM1OwotICAgIHNlaVVzZXJEYXRhVW5yZWdpc3RlcmVkX3QgdXNlckRhdGFVbnJlZ2lzdGVyZWQ7Ci0gICAgc2VpUmVjb3ZlcnlQb2ludF90IHJlY292ZXJ5UG9pbnQ7Ci0gICAgc2VpRGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb25fdCBkZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbjsKLSAgICBzZWlTcGFyZVBpY190IHNwYXJlUGljOwotICAgIHNlaVNjZW5lSW5mb190IHNjZW5lSW5mbzsKLSAgICBzZWlTdWJTZXFJbmZvX3Qgc3ViU2VxSW5mbzsKLSAgICBzZWlTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljc190IHN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzOwotICAgIHNlaVN1YlNlcUNoYXJhY3RlcmlzdGljc190IHN1YlNlcUNoYXJhY3RlcmlzdGljczsKLSAgICBzZWlGdWxsRnJhbWVGcmVlemVfdCBmdWxsRnJhbWVGcmVlemU7Ci0gICAgc2VpRnVsbEZyYW1lU25hcHNob3RfdCBmdWxsRnJhbWVTbmFwc2hvdDsKLSAgICBzZWlQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnRfdCBwcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnQ7Ci0gICAgc2VpUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudEVuZF90IHByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRFbmQ7Ci0gICAgc2VpTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0X3QgbW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0OwotICAgIHNlaVJlc2VydmVkU2VpTWVzc2FnZV90IHJlc2VydmVkU2VpTWVzc2FnZTsKLX0gc2VpTWVzc2FnZV90OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkRGVjb2RlU2VpTWVzc2FnZSgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZXFQYXJhbVNldF90ICpwU2VxUGFyYW1TZXQsCi0gIHNlaU1lc3NhZ2VfdCAqcFNlaU1lc3NhZ2UsCi0gIHUzMiBudW1TbGljZUdyb3Vwcyk7Ci0KLSNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX1NFSV9IICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zZXFfcGFyYW1fc2V0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2VxX3BhcmFtX3NldC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTEwNTFhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zZXFfcGFyYW1fc2V0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotICAgICAzLiBNb2R1bGUgZGVmaW5lcwotICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0gICAgIDUuIEZ1bmN0aW9ucwotICAgICAgICAgIGgyNjRic2REZWNvZGVTZXFQYXJhbVNldAotICAgICAgICAgIEdldERwYlNpemUKLSAgICAgICAgICBoMjY0YnNkQ29tcGFyZVNlcVBhcmFtU2V0cwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImgyNjRic2Rfc2VxX3BhcmFtX3NldC5oIgotI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgotI2luY2x1ZGUgImgyNjRic2RfdmxjLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF92dWkuaCIKLSNpbmNsdWRlICJoMjY0YnNkX2NmZy5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBlbnVtZXJhdGlvbiB0byBpbmRpY2F0ZSBpbnZhbGlkIHJldHVybiB2YWx1ZSBmcm9tIHRoZSBHZXREcGJTaXplIGZ1bmN0aW9uICovCi1lbnVtIHtJTlZBTElEX0RQQl9TSVpFID0gMHg3RkZGRkZGRn07Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBHZXREcGJTaXplKHUzMiBwaWNTaXplSW5NYnMsIHUzMiBsZXZlbElkYyk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiBoMjY0YnNkRGVjb2RlU2VxUGFyYW1TZXQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRGVjb2RlIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQgaW5mb3JtYXRpb24gZnJvbSB0aGUgc3RyZWFtLgotCi0gICAgICAgICAgICBGdW5jdGlvbiBhbGxvY2F0ZXMgbWVtb3J5IGZvciBvZmZzZXRGb3JSZWZGcmFtZSBhcnJheSBpZgotICAgICAgICAgICAgcGljdHVyZSBvcmRlciBjb3VudCB0eXBlIGlzIDEgYW5kIG51bVJlZkZyYW1lc0luUGljT3JkZXJDbnRDeWNsZQotICAgICAgICAgICAgaXMgZ3JlYXRlciB0aGFuIHplcm8uCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIHBTZXFQYXJhbVNldCAgICBkZWNvZGVkIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgZmFpbHVyZSwgaW52YWxpZCBpbmZvcm1hdGlvbiBvciBlbmQgb2Ygc3RyZWFtCi0gICAgICAgICAgICBNRU1PUllfQUxMT0NBVElPTl9FUlJPUiBmb3IgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZERlY29kZVNlcVBhcmFtU2V0KHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgc2VxUGFyYW1TZXRfdCAqcFNlcVBhcmFtU2V0KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXAsIGksIHZhbHVlOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocFNlcVBhcmFtU2V0KTsKLQotICAgIEgyNjRTd0RlY01lbXNldChwU2VxUGFyYW1TZXQsIDAsIHNpemVvZihzZXFQYXJhbVNldF90KSk7Ci0KLSAgICAvKiBwcm9maWxlX2lkYyAqLwotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgOCk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgaWYgKHRtcCAhPSA2NikKLSAgICB7Ci0gICAgICAgIERFQlVHKCgiTk9UIEJBU0VMSU5FIFBST0ZJTEUgJWRcbiIsIHRtcCkpOwotICAgIH0KLSAgICBwU2VxUGFyYW1TZXQtPnByb2ZpbGVJZGMgPSB0bXA7Ci0KLSAgICAvKiBjb25zdHJhaW5lZF9zZXQwX2ZsYWcgKi8KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIC8qIGNvbnN0cmFpbmVkX3NldDFfZmxhZyAqLwotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgLyogY29uc3RyYWluZWRfc2V0Ml9mbGFnICovCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLQotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgLyogcmVzZXJ2ZWRfemVyb181Yml0cywgdmFsdWVzIG9mIHRoZXNlIGJpdHMgc2hhbGwgYmUgaWdub3JlZCAqLwotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgNSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDgpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBTZXFQYXJhbVNldC0+bGV2ZWxJZGMgPSB0bXA7Ci0KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgICAmcFNlcVBhcmFtU2V0LT5zZXFQYXJhbWV0ZXJTZXRJZCk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotICAgIGlmIChwU2VxUGFyYW1TZXQtPnNlcVBhcmFtZXRlclNldElkID49IE1BWF9OVU1fU0VRX1BBUkFNX1NFVFMpCi0gICAgewotICAgICAgICBFUFJJTlQoInNlcV9wYXJhbV9zZXRfaWQiKTsKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLQotICAgIC8qIGxvZzJfbWF4X2ZyYW1lX251bV9taW51czQgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLSAgICBpZiAodmFsdWUgPiAxMikKLSAgICB7Ci0gICAgICAgIEVQUklOVCgibG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCIpOwotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotICAgIC8qIG1heEZyYW1lTnVtID0gMl4obG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCArIDQpICovCi0gICAgcFNlcVBhcmFtU2V0LT5tYXhGcmFtZU51bSA9IDEgPDwgKHZhbHVlKzQpOwotCi0gICAgLyogdmFsaWQgUE9DIHR5cGVzIGFyZSAwLCAxIGFuZCAyICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgaWYgKHZhbHVlID4gMikKLSAgICB7Ci0gICAgICAgIEVQUklOVCgicGljX29yZGVyX2NudF90eXBlIik7Ci0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0gICAgcFNlcVBhcmFtU2V0LT5waWNPcmRlckNudFR5cGUgPSB2YWx1ZTsKLQotICAgIGlmIChwU2VxUGFyYW1TZXQtPnBpY09yZGVyQ250VHlwZSA9PSAwKQotICAgIHsKLSAgICAgICAgLyogbG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0ICovCi0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgIGlmICh2YWx1ZSA+IDEyKQotICAgICAgICB7Ci0gICAgICAgICAgICBFUFJJTlQoImxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNCIpOwotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICB9Ci0gICAgICAgIC8qIG1heFBpY09yZGVyQ250THNiID0gMl4obG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0ICsgNCkgKi8KLSAgICAgICAgcFNlcVBhcmFtU2V0LT5tYXhQaWNPcmRlckNudExzYiA9IDEgPDwgKHZhbHVlKzQpOwotICAgIH0KLSAgICBlbHNlIGlmIChwU2VxUGFyYW1TZXQtPnBpY09yZGVyQ250VHlwZSA9PSAxKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwU2VxUGFyYW1TZXQtPmRlbHRhUGljT3JkZXJBbHdheXNaZXJvRmxhZyA9ICh0bXAgPT0gMSkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLAotICAgICAgICAgICAgJnBTZXFQYXJhbVNldC0+b2Zmc2V0Rm9yTm9uUmVmUGljKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLQotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAgICZwU2VxUGFyYW1TZXQtPm9mZnNldEZvclRvcFRvQm90dG9tRmllbGQpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotCi0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgICAmcFNlcVBhcmFtU2V0LT5udW1SZWZGcmFtZXNJblBpY09yZGVyQ250Q3ljbGUpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICBpZiAocFNlcVBhcmFtU2V0LT5udW1SZWZGcmFtZXNJblBpY09yZGVyQ250Q3ljbGUgPiAyNTUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEVQUklOVCgibnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZSIpOwotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBTZXFQYXJhbVNldC0+bnVtUmVmRnJhbWVzSW5QaWNPcmRlckNudEN5Y2xlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBOT1RFOiBUaGlzIGhhcyB0byBiZSBmcmVlZCBzb21ld2hlcmUhICovCi0gICAgICAgICAgICBBTExPQ0FURShwU2VxUGFyYW1TZXQtPm9mZnNldEZvclJlZkZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT5udW1SZWZGcmFtZXNJblBpY09yZGVyQ250Q3ljbGUsIGkzMik7Ci0gICAgICAgICAgICBpZiAocFNlcVBhcmFtU2V0LT5vZmZzZXRGb3JSZWZGcmFtZSA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwU2VxUGFyYW1TZXQtPm51bVJlZkZyYW1lc0luUGljT3JkZXJDbnRDeWNsZTsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRtcCA9ICBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT5vZmZzZXRGb3JSZWZGcmFtZSArIGkpOwotICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+b2Zmc2V0Rm9yUmVmRnJhbWUgPSBOVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgJnBTZXFQYXJhbVNldC0+bnVtUmVmRnJhbWVzKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgaWYgKHBTZXFQYXJhbVNldC0+bnVtUmVmRnJhbWVzID4gTUFYX05VTV9SRUZfUElDUykKLSAgICB7Ci0gICAgICAgIEVQUklOVCgibnVtX3JlZl9mcmFtZXMiKTsKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcFNlcVBhcmFtU2V0LT5nYXBzSW5GcmFtZU51bVZhbHVlQWxsb3dlZEZsYWcgPSAodG1wID09IDEpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotICAgIHBTZXFQYXJhbVNldC0+cGljV2lkdGhJbk1icyA9IHZhbHVlICsgMTsKLQotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotICAgIHBTZXFQYXJhbVNldC0+cGljSGVpZ2h0SW5NYnMgPSB2YWx1ZSArIDE7Ci0KLSAgICAvKiBmcmFtZV9tYnNfb25seV9mbGFnLCBzaGFsbCBiZSAxIGZvciBiYXNlbGluZSBwcm9maWxlICovCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBpZiAoIXRtcCkKLSAgICB7Ci0gICAgICAgIEVQUklOVCgiZnJhbWVfbWJzX29ubHlfZmxhZyIpOwotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotCi0gICAgLyogZGlyZWN0Xzh4OF9pbmZlcmVuY2VfZmxhZyAqLwotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBTZXFQYXJhbVNldC0+ZnJhbWVDcm9wcGluZ0ZsYWcgPSAodG1wID09IDEpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICBpZiAocFNlcVBhcmFtU2V0LT5mcmFtZUNyb3BwaW5nRmxhZykKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgICAmcFNlcVBhcmFtU2V0LT5mcmFtZUNyb3BMZWZ0T2Zmc2V0KTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAgICZwU2VxUGFyYW1TZXQtPmZyYW1lQ3JvcFJpZ2h0T2Zmc2V0KTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAgICZwU2VxUGFyYW1TZXQtPmZyYW1lQ3JvcFRvcE9mZnNldCk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgICAmcFNlcVBhcmFtU2V0LT5mcmFtZUNyb3BCb3R0b21PZmZzZXQpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotCi0gICAgICAgIC8qIGNoZWNrIHRoYXQgZnJhbWUgY3JvcHBpbmcgcGFyYW1zIGFyZSB2YWxpZCwgcGFyYW1ldGVycyBzaGFsbAotICAgICAgICAgKiBzcGVjaWZ5IG5vbi1uZWdhdGl2ZSBhcmVhIHdpdGhpbiB0aGUgb3JpZ2luYWwgcGljdHVyZSAqLwotICAgICAgICBpZiAoICggKGkzMilwU2VxUGFyYW1TZXQtPmZyYW1lQ3JvcExlZnRPZmZzZXQgPgotICAgICAgICAgICAgICAgKCA4ICogKGkzMilwU2VxUGFyYW1TZXQtPnBpY1dpZHRoSW5NYnMgLQotICAgICAgICAgICAgICAgICAoKGkzMilwU2VxUGFyYW1TZXQtPmZyYW1lQ3JvcFJpZ2h0T2Zmc2V0ICsgMSkgKSApIHx8Ci0gICAgICAgICAgICAgKCAoaTMyKXBTZXFQYXJhbVNldC0+ZnJhbWVDcm9wVG9wT2Zmc2V0ID4KLSAgICAgICAgICAgICAgICggOCAqIChpMzIpcFNlcVBhcmFtU2V0LT5waWNIZWlnaHRJbk1icyAtCi0gICAgICAgICAgICAgICAgICgoaTMyKXBTZXFQYXJhbVNldC0+ZnJhbWVDcm9wQm90dG9tT2Zmc2V0ICsgMSkgKSApICkKLSAgICAgICAgewotICAgICAgICAgICAgRVBSSU5UKCJmcmFtZV9jcm9wcGluZyIpOwotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogY2hlY2sgdGhhdCBpbWFnZSBkaW1lbnNpb25zIGFuZCBsZXZlbElkYyBtYXRjaCAqLwotICAgIHRtcCA9IHBTZXFQYXJhbVNldC0+cGljV2lkdGhJbk1icyAqIHBTZXFQYXJhbVNldC0+cGljSGVpZ2h0SW5NYnM7Ci0gICAgdmFsdWUgPSBHZXREcGJTaXplKHRtcCwgcFNlcVBhcmFtU2V0LT5sZXZlbElkYyk7Ci0gICAgaWYgKHZhbHVlID09IElOVkFMSURfRFBCX1NJWkUgfHwgcFNlcVBhcmFtU2V0LT5udW1SZWZGcmFtZXMgPiB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIERFQlVHKCgiV0FSTklORyEgSW52YWxpZCBEUEIgc2l6ZSBiYXNlZCBvbiBTUFMgTGV2ZWwhXG4iKSk7Ci0gICAgICAgIERFQlVHKCgiV0FSTklORyEgVXNpbmcgbnVtX3JlZl9mcmFtZXMgPSVkIGZvciBEUEIgc2l6ZSFcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPm51bVJlZkZyYW1lcykpOwotICAgICAgICB2YWx1ZSA9IHBTZXFQYXJhbVNldC0+bnVtUmVmRnJhbWVzOwotICAgIH0KLSAgICBwU2VxUGFyYW1TZXQtPm1heERwYlNpemUgPSB2YWx1ZTsKLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzUHJlc2VudEZsYWcgPSAodG1wID09IDEpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICAvKiBWVUkgKi8KLSAgICBpZiAocFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzUHJlc2VudEZsYWcpCi0gICAgewotICAgICAgICBBTExPQ0FURShwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMsIDEsIHZ1aVBhcmFtZXRlcnNfdCk7Ci0gICAgICAgIGlmIChwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMgPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7Ci0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVWdWlQYXJhbWV0ZXJzKHBTdHJtRGF0YSwKLSAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycyk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgIC8qIGNoZWNrIG51bVJlb3JkZXJGcmFtZXMgYW5kIG1heERlY0ZyYW1lQnVmZmVyaW5nICovCi0gICAgICAgIGlmIChwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPmJpdHN0cmVhbVJlc3RyaWN0aW9uRmxhZykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycy0+bnVtUmVvcmRlckZyYW1lcyA+Ci0gICAgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycy0+bWF4RGVjRnJhbWVCdWZmZXJpbmcgfHwKLSAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPm1heERlY0ZyYW1lQnVmZmVyaW5nIDwKLSAgICAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT5udW1SZWZGcmFtZXMgfHwKLSAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPm1heERlY0ZyYW1lQnVmZmVyaW5nID4KLSAgICAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT5tYXhEcGJTaXplKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogc3RhbmRhcmQgc2F5cyB0aGF0ICJ0aGUgc2VxdWVuY2Ugc2hhbGwgbm90IHJlcXVpcmUgYSBEUEIgd2l0aAotICAgICAgICAgICAgICogc2l6ZSBvZiBtb3JlIHRoYW4gbWF4KDEsIG1heERlY0ZyYW1lQnVmZmVyaW5nKSAqLwotICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT5tYXhEcGJTaXplID0KLSAgICAgICAgICAgICAgICBNQVgoMSwgcFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzLT5tYXhEZWNGcmFtZUJ1ZmZlcmluZyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB0bXAgPSBoMjY0YnNkUmJzcFRyYWlsaW5nQml0cyhwU3RybURhdGEpOwotCi0gICAgLyogaWdub3JlIHBvc3NpYmxlIGVycm9ycyBpbiB0cmFpbGluZyBiaXRzIG9mIHBhcmFtZXRlcnMgc2V0cyAqLwotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogR2V0RHBiU2l6ZQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBHZXQgc2l6ZSBvZiB0aGUgRFBCIGluIGZyYW1lcy4gU2l6ZSBpcyBkZXRlcm1pbmVkIGJhc2VkIG9uIHRoZQotICAgICAgICAgICAgcGljdHVyZSBzaXplIGFuZCBNYXhEUEIgZm9yIHRoZSBzcGVjaWZpZWQgbGV2ZWwuIFRoZXNlIGRldGVybWluZQotICAgICAgICAgICAgaG93IG1hbnkgcGljdHVyZXMgbWF5IGZpdCBpbnRvIHRvIHRoZSBidWZmZXIuIEhvd2V2ZXIsIHRoZSBzaXplCi0gICAgICAgICAgICBpcyBhbHNvIGxpbWl0ZWQgdG8gYSBtYXhpbXVtIG9mIDE2IGZyYW1lcyBhbmQgdGhlcmVmb3JlIGZ1bmN0aW9uCi0gICAgICAgICAgICByZXR1cm5zIHRoZSBtaW5pbXVtIG9mIHRoZSBkZXRlcm1pbmVkIHNpemUgYW5kIDE2LgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBpY1NpemVJbk1icyAgICBudW1iZXIgb2YgbWFjcm9ibG9ja3MgaW4gdGhlIHBpY3R1cmUKLSAgICAgICAgICAgIGxldmVsSWRjICAgICAgICBpbmRpY2F0ZXMgdGhlIGxldmVsCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIG5vbmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgc2l6ZSBvZiB0aGUgRFBCIGluIGZyYW1lcwotICAgICAgICAgICAgSU5WQUxJRF9EUEJfU0laRSB3aGVuIGludmFsaWQgbGV2ZWxJZGMgc3BlY2lmaWVkIG9yIHBpY1NpemVJbk1icwotICAgICAgICAgICAgaXMgaGlnaGVyIHRoYW4gc3VwcG9ydGVkIGJ5IHRoZSBsZXZlbCBpbiBxdWVzdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgR2V0RHBiU2l6ZSh1MzIgcGljU2l6ZUluTWJzLCB1MzIgbGV2ZWxJZGMpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcDsKLSAgICB1MzIgbWF4UGljU2l6ZUluTWJzOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocGljU2l6ZUluTWJzKTsKLQotICAgIC8qIHVzZSB0bXAgYXMgdGhlIHNpemUgb2YgdGhlIERQQiBpbiBieXRlcywgY29tcHV0ZXMgYXMgMTAyNCAqIE1heERQQgotICAgICAqIChmcm9tIHRhYmxlIEEtMSBpbiBBbm5leCBBKSAqLwotICAgIHN3aXRjaCAobGV2ZWxJZGMpCi0gICAgewotICAgICAgICBjYXNlIDEwOgotICAgICAgICAgICAgdG1wID0gMTUyMDY0OwotICAgICAgICAgICAgbWF4UGljU2l6ZUluTWJzID0gOTk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDExOgotICAgICAgICAgICAgdG1wID0gMzQ1NjAwOwotICAgICAgICAgICAgbWF4UGljU2l6ZUluTWJzID0gMzk2OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAxMjoKLSAgICAgICAgICAgIHRtcCA9IDkxMjM4NDsKLSAgICAgICAgICAgIG1heFBpY1NpemVJbk1icyA9IDM5NjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMTM6Ci0gICAgICAgICAgICB0bXAgPSA5MTIzODQ7Ci0gICAgICAgICAgICBtYXhQaWNTaXplSW5NYnMgPSAzOTY7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDIwOgotICAgICAgICAgICAgdG1wID0gOTEyMzg0OwotICAgICAgICAgICAgbWF4UGljU2l6ZUluTWJzID0gMzk2OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAyMToKLSAgICAgICAgICAgIHRtcCA9IDE4MjQ3Njg7Ci0gICAgICAgICAgICBtYXhQaWNTaXplSW5NYnMgPSA3OTI7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDIyOgotICAgICAgICAgICAgdG1wID0gMzExMDQwMDsKLSAgICAgICAgICAgIG1heFBpY1NpemVJbk1icyA9IDE2MjA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDMwOgotICAgICAgICAgICAgdG1wID0gMzExMDQwMDsKLSAgICAgICAgICAgIG1heFBpY1NpemVJbk1icyA9IDE2MjA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDMxOgotICAgICAgICAgICAgdG1wID0gNjkxMjAwMDsKLSAgICAgICAgICAgIG1heFBpY1NpemVJbk1icyA9IDM2MDA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDMyOgotICAgICAgICAgICAgdG1wID0gNzg2NDMyMDsKLSAgICAgICAgICAgIG1heFBpY1NpemVJbk1icyA9IDUxMjA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDQwOgotICAgICAgICAgICAgdG1wID0gMTI1ODI5MTI7Ci0gICAgICAgICAgICBtYXhQaWNTaXplSW5NYnMgPSA4MTkyOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSA0MToKLSAgICAgICAgICAgIHRtcCA9IDEyNTgyOTEyOwotICAgICAgICAgICAgbWF4UGljU2l6ZUluTWJzID0gODE5MjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgNDI6Ci0gICAgICAgICAgICB0bXAgPSAzNDgxNiozODQ7Ci0gICAgICAgICAgICBtYXhQaWNTaXplSW5NYnMgPSA4NzA0OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSA1MDoKLSAgICAgICAgICAgIC8qIHN0YW5kYXJkIHNheXMgNDIzMDE0NDAgaGVyZSwgYnV0IGNvcnJpZ2VuZHVtICJjb3JyZWN0cyIgdGhpcyB0bwotICAgICAgICAgICAgICogNDIzOTM2MDAgKi8KLSAgICAgICAgICAgIHRtcCA9IDQyMzkzNjAwOwotICAgICAgICAgICAgbWF4UGljU2l6ZUluTWJzID0gMjIwODA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDUxOgotICAgICAgICAgICAgdG1wID0gNzA3Nzg4ODA7Ci0gICAgICAgICAgICBtYXhQaWNTaXplSW5NYnMgPSAzNjg2NDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4oSU5WQUxJRF9EUEJfU0laRSk7Ci0gICAgfQotCi0gICAgLyogdGhpcyBpcyBub3QgImNvcnJlY3QiIHJldHVybiB2YWx1ZSEgSG93ZXZlciwgaXQgcmVzdWx0cyBpbiBlcnJvciBpbgotICAgICAqIGRlY29kaW5nIGFuZCB0aGlzIHdhcyBlYXNpZXN0IHBsYWNlIHRvIGNoZWNrIHBpY3R1cmUgc2l6ZSAqLwotICAgIGlmIChwaWNTaXplSW5NYnMgPiBtYXhQaWNTaXplSW5NYnMpCi0gICAgICAgIHJldHVybihJTlZBTElEX0RQQl9TSVpFKTsKLQotICAgIHRtcCAvPSAocGljU2l6ZUluTWJzKjM4NCk7Ci0KLSAgICByZXR1cm4oTUlOKHRtcCwgMTYpKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogaDI2NGJzZENvbXBhcmVTZXFQYXJhbVNldHMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgQ29tcGFyZSB0d28gc2VxdWVuY2UgcGFyYW1ldGVyIHNldHMuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFNwczEgICBwb2ludGVyIHRvIGEgc2VxdWVuY2UgcGFyYW1ldGVyIHNldAotICAgICAgICAgICAgcFNwczIgICBwb2ludGVyIHRvIGFub3RoZXIgc2VxdWVuY2UgcGFyYW1ldGVyIHNldAotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICAwICAgICAgIHNlcXVlbmNlIHBhcmFtZXRlciBzZXRzIGFyZSBlcXVhbAotICAgICAgICAgICAgMSAgICAgICBvdGhlcndpc2UKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RDb21wYXJlU2VxUGFyYW1TZXRzKHNlcVBhcmFtU2V0X3QgKnBTcHMxLCBzZXFQYXJhbVNldF90ICpwU3BzMikKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTcHMxKTsKLSAgICBBU1NFUlQocFNwczIpOwotCi0gICAgLyogZmlyc3QgY29tcGFyZSBwYXJhbWV0ZXJzIHdob3NlIGV4aXN0ZW5jZSBkb2VzIG5vdCBkZXBlbmQgb24gb3RoZXIKLSAgICAgKiBwYXJhbWV0ZXJzIGFuZCBvbmx5IGNvbXBhcmUgdGhlIHJlc3Qgb2YgdGhlIHBhcmFtcyBpZiB0aGVzZSBhcmUgZXF1YWwgKi8KLSAgICBpZiAocFNwczEtPnByb2ZpbGVJZGMgICAgICAgID09IHBTcHMyLT5wcm9maWxlSWRjICYmCi0gICAgICAgIHBTcHMxLT5sZXZlbElkYyAgICAgICAgICA9PSBwU3BzMi0+bGV2ZWxJZGMgJiYKLSAgICAgICAgcFNwczEtPm1heEZyYW1lTnVtICAgICAgID09IHBTcHMyLT5tYXhGcmFtZU51bSAmJgotICAgICAgICBwU3BzMS0+cGljT3JkZXJDbnRUeXBlICAgPT0gcFNwczItPnBpY09yZGVyQ250VHlwZSAmJgotICAgICAgICBwU3BzMS0+bnVtUmVmRnJhbWVzICAgICAgPT0gcFNwczItPm51bVJlZkZyYW1lcyAmJgotICAgICAgICBwU3BzMS0+Z2Fwc0luRnJhbWVOdW1WYWx1ZUFsbG93ZWRGbGFnID09Ci0gICAgICAgICAgICBwU3BzMi0+Z2Fwc0luRnJhbWVOdW1WYWx1ZUFsbG93ZWRGbGFnICYmCi0gICAgICAgIHBTcHMxLT5waWNXaWR0aEluTWJzICAgICA9PSBwU3BzMi0+cGljV2lkdGhJbk1icyAmJgotICAgICAgICBwU3BzMS0+cGljSGVpZ2h0SW5NYnMgICAgPT0gcFNwczItPnBpY0hlaWdodEluTWJzICYmCi0gICAgICAgIHBTcHMxLT5mcmFtZUNyb3BwaW5nRmxhZyA9PSBwU3BzMi0+ZnJhbWVDcm9wcGluZ0ZsYWcgJiYKLSAgICAgICAgcFNwczEtPnZ1aVBhcmFtZXRlcnNQcmVzZW50RmxhZyA9PSBwU3BzMi0+dnVpUGFyYW1ldGVyc1ByZXNlbnRGbGFnKQotICAgIHsKLSAgICAgICAgaWYgKHBTcHMxLT5waWNPcmRlckNudFR5cGUgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBTcHMxLT5tYXhQaWNPcmRlckNudExzYiAhPSBwU3BzMi0+bWF4UGljT3JkZXJDbnRMc2IpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocFNwczEtPnBpY09yZGVyQ250VHlwZSA9PSAxKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocFNwczEtPmRlbHRhUGljT3JkZXJBbHdheXNaZXJvRmxhZyAhPQotICAgICAgICAgICAgICAgICAgICBwU3BzMi0+ZGVsdGFQaWNPcmRlckFsd2F5c1plcm9GbGFnIHx8Ci0gICAgICAgICAgICAgICAgcFNwczEtPm9mZnNldEZvck5vblJlZlBpYyAhPSBwU3BzMi0+b2Zmc2V0Rm9yTm9uUmVmUGljIHx8Ci0gICAgICAgICAgICAgICAgcFNwczEtPm9mZnNldEZvclRvcFRvQm90dG9tRmllbGQgIT0KLSAgICAgICAgICAgICAgICAgICAgcFNwczItPm9mZnNldEZvclRvcFRvQm90dG9tRmllbGQgfHwKLSAgICAgICAgICAgICAgICBwU3BzMS0+bnVtUmVmRnJhbWVzSW5QaWNPcmRlckNudEN5Y2xlICE9Ci0gICAgICAgICAgICAgICAgICAgIHBTcHMyLT5udW1SZWZGcmFtZXNJblBpY09yZGVyQ250Q3ljbGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBTcHMxLT5udW1SZWZGcmFtZXNJblBpY09yZGVyQ250Q3ljbGU7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBTcHMxLT5vZmZzZXRGb3JSZWZGcmFtZVtpXSAhPQotICAgICAgICAgICAgICAgICAgICAgICAgcFNwczItPm9mZnNldEZvclJlZkZyYW1lW2ldKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChwU3BzMS0+ZnJhbWVDcm9wcGluZ0ZsYWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwU3BzMS0+ZnJhbWVDcm9wTGVmdE9mZnNldCAgICE9IHBTcHMyLT5mcmFtZUNyb3BMZWZ0T2Zmc2V0IHx8Ci0gICAgICAgICAgICAgICAgcFNwczEtPmZyYW1lQ3JvcFJpZ2h0T2Zmc2V0ICAhPSBwU3BzMi0+ZnJhbWVDcm9wUmlnaHRPZmZzZXQgfHwKLSAgICAgICAgICAgICAgICBwU3BzMS0+ZnJhbWVDcm9wVG9wT2Zmc2V0ICAgICE9IHBTcHMyLT5mcmFtZUNyb3BUb3BPZmZzZXQgfHwKLSAgICAgICAgICAgICAgICBwU3BzMS0+ZnJhbWVDcm9wQm90dG9tT2Zmc2V0ICE9IHBTcHMyLT5mcmFtZUNyb3BCb3R0b21PZmZzZXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gMTsKLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NlcV9wYXJhbV9zZXQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zZXFfcGFyYW1fc2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxOGRmOTQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NlcV9wYXJhbV9zZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0gICAgMy4gRGF0YSB0eXBlcwotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBIMjY0U1dERUNfU0VRX1BBUkFNX1NFVF9ICi0jZGVmaW5lIEgyNjRTV0RFQ19TRVFfUEFSQU1fU0VUX0gKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF92dWkuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBEYXRhIHR5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBzdHJ1Y3R1cmUgdG8gc3RvcmUgc2VxdWVuY2UgcGFyYW1ldGVyIHNldCBpbmZvcm1hdGlvbiBkZWNvZGVkIGZyb20gdGhlCi0gKiBzdHJlYW0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTMyIHByb2ZpbGVJZGM7Ci0gICAgdTMyIGxldmVsSWRjOwotICAgIHUzMiBzZXFQYXJhbWV0ZXJTZXRJZDsKLSAgICB1MzIgbWF4RnJhbWVOdW07Ci0gICAgdTMyIHBpY09yZGVyQ250VHlwZTsKLSAgICB1MzIgbWF4UGljT3JkZXJDbnRMc2I7Ci0gICAgdTMyIGRlbHRhUGljT3JkZXJBbHdheXNaZXJvRmxhZzsKLSAgICBpMzIgb2Zmc2V0Rm9yTm9uUmVmUGljOwotICAgIGkzMiBvZmZzZXRGb3JUb3BUb0JvdHRvbUZpZWxkOwotICAgIHUzMiBudW1SZWZGcmFtZXNJblBpY09yZGVyQ250Q3ljbGU7Ci0gICAgaTMyICpvZmZzZXRGb3JSZWZGcmFtZTsKLSAgICB1MzIgbnVtUmVmRnJhbWVzOwotICAgIHUzMiBnYXBzSW5GcmFtZU51bVZhbHVlQWxsb3dlZEZsYWc7Ci0gICAgdTMyIHBpY1dpZHRoSW5NYnM7Ci0gICAgdTMyIHBpY0hlaWdodEluTWJzOwotICAgIHUzMiBmcmFtZUNyb3BwaW5nRmxhZzsKLSAgICB1MzIgZnJhbWVDcm9wTGVmdE9mZnNldDsKLSAgICB1MzIgZnJhbWVDcm9wUmlnaHRPZmZzZXQ7Ci0gICAgdTMyIGZyYW1lQ3JvcFRvcE9mZnNldDsKLSAgICB1MzIgZnJhbWVDcm9wQm90dG9tT2Zmc2V0OwotICAgIHUzMiB2dWlQYXJhbWV0ZXJzUHJlc2VudEZsYWc7Ci0gICAgdnVpUGFyYW1ldGVyc190ICp2dWlQYXJhbWV0ZXJzOwotICAgIHUzMiBtYXhEcGJTaXplOwotfSBzZXFQYXJhbVNldF90OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkRGVjb2RlU2VxUGFyYW1TZXQoc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICAgIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCk7Ci0KLXUzMiBoMjY0YnNkQ29tcGFyZVNlcVBhcmFtU2V0cyhzZXFQYXJhbVNldF90ICpwU3BzMSwgc2VxUGFyYW1TZXRfdCAqcFNwczIpOwotCi0jZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19TRVFfUEFSQU1fU0VUX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2RhdGEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9kYXRhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyODhkNGIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2RhdGEuYworKysgL2Rldi9udWxsCkBAIC0xLDM1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0gICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0gICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgICAgNS4gRnVuY3Rpb25zCi0gICAgICAgICAgaDI2NGJzZERlY29kZVNsaWNlRGF0YQotICAgICAgICAgIFNldE1iUGFyYW1zCi0gICAgICAgICAgaDI2NGJzZE1hcmtTbGljZUNvcnJ1cHRlZAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImgyNjRic2Rfc2xpY2VfZGF0YS5oIgotI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgotI2luY2x1ZGUgImgyNjRic2RfdmxjLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHZvaWQgU2V0TWJQYXJhbXMobWJTdG9yYWdlX3QgKnBNYiwgc2xpY2VIZWFkZXJfdCAqcFNsaWNlLCB1MzIgc2xpY2VJZCwKLSAgICBpMzIgY2hyb21hUXBJbmRleE9mZnNldCk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIDUuMSAgRnVuY3Rpb24gbmFtZTogaDI2NGJzZERlY29kZVNsaWNlRGF0YQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBEZWNvZGUgb25lIHNsaWNlLiBGdW5jdGlvbiBkZWNvZGVzIHN0cmVhbSBkYXRhLCBpLmUuIG1hY3JvYmxvY2tzCi0gICAgICAgICAgICBhbmQgcG9zc2libGUgc2tpcF9ydW4gZmllbGRzLiBoMjY0YnNkRGVjb2RlTWFjcm9ibG9jayBmdW5jdGlvbiBpcwotICAgICAgICAgICAgY2FsbGVkIHRvIGhhbmRsZSBhbGwgb3RoZXIgbWFjcm9ibG9jayByZWxhdGVkIHByb2Nlc3NpbmcuCi0gICAgICAgICAgICBNYWNyb2Jsb2NrIHRvIHNsaWNlIGdyb3VwIG1hcHBpbmcgaXMgY29uc2lkZXJlZCB3aGVuIG5leHQKLSAgICAgICAgICAgIG1hY3JvYmxvY2sgdG8gcHJvY2VzcyBpcyBkZXRlcm1pbmVkIChoMjY0YnNkTmV4dE1iQWRkcmVzcyBmdW5jdGlvbikKLSAgICAgICAgICAgIG1hcAotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQotICAgICAgICAgICAgcFN0b3JhZ2UgICAgICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKLSAgICAgICAgICAgIGN1cnJJbWFnZSAgICAgICBwb2ludGVyIHRvIGN1cnJlbnQgcHJvY2Vzc2VkIHBpY3R1cmUsIG5lZWRlZCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRyYSBwcmVkaWN0aW9uIG9mIHRoZSBtYWNyb2Jsb2NrcwotICAgICAgICAgICAgcFNsaWNlSGVhZGVyICAgIHBvaW50ZXIgdG8gc2xpY2UgaGVhZGVyIG9mIHRoZSBjdXJyZW50IHNsaWNlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIGN1cnJJbWFnZSAgICAgICBwcm9jZXNzZWQgbWFjcm9ibG9ja3MgYXJlIHdyaXR0ZW4gdG8gY3VycmVudCBpbWFnZQotICAgICAgICAgICAgcFN0b3JhZ2UgICAgICAgIG1iU3RvcmFnZSBzdHJ1Y3R1cmUgb2YgZWFjaCBwcm9jZXNzZWQgbWFjcm9ibG9jawotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHVwZGF0ZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcwotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGludmFsaWQgc3RyZWFtIGRhdGEKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2REZWNvZGVTbGljZURhdGEoc3RybURhdGFfdCAqcFN0cm1EYXRhLCBzdG9yYWdlX3QgKnBTdG9yYWdlLAotICAgIGltYWdlX3QgKmN1cnJJbWFnZSwgc2xpY2VIZWFkZXJfdCAqcFNsaWNlSGVhZGVyKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHU4IG1iRGF0YVszODQgKyAxNSArIDMyXTsKLSAgICB1OCAqZGF0YTsKLSAgICB1MzIgdG1wOwotICAgIHUzMiBza2lwUnVuOwotICAgIHUzMiBwcmV2U2tpcHBlZDsKLSAgICB1MzIgY3Vyck1iQWRkcjsKLSAgICB1MzIgbW9yZU1iczsKLSAgICB1MzIgbWJDb3VudDsKLSAgICBpMzIgcXBZOwotICAgIG1hY3JvYmxvY2tMYXllcl90ICptYkxheWVyOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocFNsaWNlSGVhZGVyKTsKLSAgICBBU1NFUlQocFN0b3JhZ2UpOwotICAgIEFTU0VSVChwU2xpY2VIZWFkZXItPmZpcnN0TWJJblNsaWNlIDwgcFN0b3JhZ2UtPnBpY1NpemVJbk1icyk7Ci0KLSAgICAvKiBlbnN1cmUgMTYtYnl0ZSBhbGlnbm1lbnQgKi8KLSAgICBkYXRhID0gKHU4KilBTElHTihtYkRhdGEsIDE2KTsKLQotICAgIG1iTGF5ZXIgPSBwU3RvcmFnZS0+bWJMYXllcjsKLQotICAgIGN1cnJNYkFkZHIgPSBwU2xpY2VIZWFkZXItPmZpcnN0TWJJblNsaWNlOwotICAgIHNraXBSdW4gPSAwOwotICAgIHByZXZTa2lwcGVkID0gSEFOVFJPX0ZBTFNFOwotCi0gICAgLyogaW5jcmVtZW50IHNsaWNlIGluZGV4LCB3aWxsIGJlIG9uZSBmb3IgZGVjb2Rpbmcgb2YgdGhlIGZpcnN0IHNsaWNlIG9mCi0gICAgICogdGhlIHBpY3R1cmUgKi8KLSAgICBwU3RvcmFnZS0+c2xpY2UtPnNsaWNlSWQrKzsKLQotICAgIC8qIGxhc3RNYkFkZHIgc3RvcmVzIGFkZHJlc3Mgb2YgdGhlIG1hY3JvYmxvY2sgdGhhdCB3YXMgbGFzdCBzdWNjZXNzZnVsbHkKLSAgICAgKiBkZWNvZGVkLCBuZWVkZWQgZm9yIGVycm9yIGhhbmRsaW5nICovCi0gICAgcFN0b3JhZ2UtPnNsaWNlLT5sYXN0TWJBZGRyID0gMDsKLQotICAgIG1iQ291bnQgPSAwOwotICAgIC8qIGluaXRpYWwgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBmb3IgdGhlIHNsaWNlIGlzIG9idGFpbmVkIGFzIHRoZSBzdW0gb2YKLSAgICAgKiBpbml0aWFsIFFQIGZvciB0aGUgcGljdHVyZSBhbmQgc2xpY2VRcERlbHRhIGZvciB0aGUgY3VycmVudCBzbGljZSAqLwotICAgIHFwWSA9IChpMzIpcFN0b3JhZ2UtPmFjdGl2ZVBwcy0+cGljSW5pdFFwICsgcFNsaWNlSGVhZGVyLT5zbGljZVFwRGVsdGE7Ci0gICAgZG8KLSAgICB7Ci0gICAgICAgIC8qIHByaW1hcnkgcGljdHVyZSBhbmQgYWxyZWFkeSBkZWNvZGVkIG1hY3JvYmxvY2sgLT4gZXJyb3IgKi8KLSAgICAgICAgaWYgKCFwU2xpY2VIZWFkZXItPnJlZHVuZGFudFBpY0NudCAmJiBwU3RvcmFnZS0+bWJbY3Vyck1iQWRkcl0uZGVjb2RlZCkKLSAgICAgICAgewotICAgICAgICAgICAgRVBSSU5UKCJQcmltYXJ5IGFuZCBhbHJlYWR5IGRlY29kZWQiKTsKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgfQotCi0gICAgICAgIFNldE1iUGFyYW1zKHBTdG9yYWdlLT5tYiArIGN1cnJNYkFkZHIsIHBTbGljZUhlYWRlciwKLSAgICAgICAgICAgIHBTdG9yYWdlLT5zbGljZS0+c2xpY2VJZCwgcFN0b3JhZ2UtPmFjdGl2ZVBwcy0+Y2hyb21hUXBJbmRleE9mZnNldCk7Ci0KLSAgICAgICAgaWYgKCFJU19JX1NMSUNFKHBTbGljZUhlYWRlci0+c2xpY2VUeXBlKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFwcmV2U2tpcHBlZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmc2tpcFJ1bik7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICAgICAgICAgIC8qIHNraXBfcnVuIHNoYWxsIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBudW1iZXIgb2YKLSAgICAgICAgICAgICAgICAgKiBtYWNyb2Jsb2NrcyBsZWZ0ICovCi0gICAgICAgICAgICAgICAgaWYgKHNraXBSdW4gPiAocFN0b3JhZ2UtPnBpY1NpemVJbk1icyAtIGN1cnJNYkFkZHIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRVBSSU5UKCJza2lwX3J1biIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChza2lwUnVuKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHJldlNraXBwZWQgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgSDI2NFN3RGVjTWVtc2V0KCZtYkxheWVyLT5tYlByZWQsIDAsIHNpemVvZihtYlByZWRfdCkpOwotICAgICAgICAgICAgICAgICAgICAvKiBtYXJrIGN1cnJlbnQgbWFjcm9ibG9jayBza2lwcGVkICovCi0gICAgICAgICAgICAgICAgICAgIG1iTGF5ZXItPm1iVHlwZSA9IFBfU2tpcDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2tpcFJ1bikKLSAgICAgICAgewotICAgICAgICAgICAgREVCVUcoKCJTa2lwcGluZyBtYWNyb2Jsb2NrICVkXG4iLCBjdXJyTWJBZGRyKSk7Ci0gICAgICAgICAgICBza2lwUnVuLS07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmV2U2tpcHBlZCA9IEhBTlRST19GQUxTRTsKLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVNYWNyb2Jsb2NrTGF5ZXIocFN0cm1EYXRhLCBtYkxheWVyLAotICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5tYiArIGN1cnJNYkFkZHIsIHBTbGljZUhlYWRlci0+c2xpY2VUeXBlLAotICAgICAgICAgICAgICAgIHBTbGljZUhlYWRlci0+bnVtUmVmSWR4TDBBY3RpdmUpOwotICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRVBSSU5UKCJtYWNyb2Jsb2NrX2xheWVyIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlTWFjcm9ibG9jayhwU3RvcmFnZS0+bWIgKyBjdXJyTWJBZGRyLCBtYkxheWVyLAotICAgICAgICAgICAgY3VyckltYWdlLCBwU3RvcmFnZS0+ZHBiLCAmcXBZLCBjdXJyTWJBZGRyLAotICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVBwcy0+Y29uc3RyYWluZWRJbnRyYVByZWRGbGFnLCBkYXRhKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHsKLSAgICAgICAgICAgIEVQUklOVCgiTUFDUk9fQkxPQ0siKTsKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogaW5jcmVtZW50IG1hY3JvYmxvY2sgY291bnQgb25seSBmb3IgbWFjcm9ibG9ja3MgdGhhdCB3ZXJlIGRlY29kZWQKLSAgICAgICAgICogZm9yIHRoZSBmaXJzdCB0aW1lIChyZWR1bmRhbnQgc2xpY2VzKSAqLwotICAgICAgICBpZiAocFN0b3JhZ2UtPm1iW2N1cnJNYkFkZHJdLmRlY29kZWQgPT0gMSkKLSAgICAgICAgICAgIG1iQ291bnQrKzsKLQotICAgICAgICAvKiBrZWVwIG9uIHByb2Nlc3NpbmcgYXMgbG9uZyBhcyB0aGVyZSBpcyBzdHJlYW0gZGF0YSBsZWZ0IG9yCi0gICAgICAgICAqIHByb2Nlc3Npbmcgb2YgbWFjcm9ibG9ja3MgdG8gYmUgc2tpcHBlZCBiYXNlZCBvbiB0aGUgbGFzdCBza2lwUnVuIGlzCi0gICAgICAgICAqIG5vdCBmaW5pc2hlZCAqLwotICAgICAgICBtb3JlTWJzID0gKGgyNjRic2RNb3JlUmJzcERhdGEocFN0cm1EYXRhKSB8fCBza2lwUnVuKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICAgICAgLyogbGFzdE1iQWRkciBpcyBvbmx5IHVwZGF0ZWQgZm9yIGludHJhIHNsaWNlcyAoYWxsIG1hY3JvYmxvY2tzIG9mCi0gICAgICAgICAqIGludGVyIHNsaWNlcyB3aWxsIGJlIGxvc3QgaW4gY2FzZSBvZiBhbiBlcnJvcikgKi8KLSAgICAgICAgaWYgKElTX0lfU0xJQ0UocFNsaWNlSGVhZGVyLT5zbGljZVR5cGUpKQotICAgICAgICAgICAgcFN0b3JhZ2UtPnNsaWNlLT5sYXN0TWJBZGRyID0gY3Vyck1iQWRkcjsKLQotICAgICAgICBjdXJyTWJBZGRyID0gaDI2NGJzZE5leHRNYkFkZHJlc3MocFN0b3JhZ2UtPnNsaWNlR3JvdXBNYXAsCi0gICAgICAgICAgICBwU3RvcmFnZS0+cGljU2l6ZUluTWJzLCBjdXJyTWJBZGRyKTsKLSAgICAgICAgLyogZGF0YSBsZWZ0IGluIHRoZSBidWZmZXIgYnV0IG5vIG1vcmUgbWFjcm9ibG9ja3MgZm9yIGN1cnJlbnQgc2xpY2UKLSAgICAgICAgICogZ3JvdXAgLT4gZXJyb3IgKi8KLSAgICAgICAgaWYgKG1vcmVNYnMgJiYgIWN1cnJNYkFkZHIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEVQUklOVCgiTmV4dCBtYiBhZGRyZXNzIik7Ci0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIH0KLQotICAgIH0gd2hpbGUgKG1vcmVNYnMpOwotCi0gICAgaWYgKChwU3RvcmFnZS0+c2xpY2UtPm51bURlY29kZWRNYnMgKyBtYkNvdW50KSA+IHBTdG9yYWdlLT5waWNTaXplSW5NYnMpCi0gICAgewotICAgICAgICBFUFJJTlQoIk51bSBkZWNvZGVkIG1icyIpOwotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotCi0gICAgcFN0b3JhZ2UtPnNsaWNlLT5udW1EZWNvZGVkTWJzICs9IG1iQ291bnQ7Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICA1LjIgIEZ1bmN0aW9uOiBTZXRNYlBhcmFtcwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBTZXQgbWFjcm9ibG9jayBwYXJhbWV0ZXJzIHRoYXQgcmVtYWluIGNvbnN0YW50IGZvciB0aGlzIHNsaWNlCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFNsaWNlICAgICAgcG9pbnRlciB0byBjdXJyZW50IHNsaWNlIGhlYWRlcgotICAgICAgICAgICAgc2xpY2VJZCAgICAgaWQgb2YgdGhlIGN1cnJlbnQgc2xpY2UKLSAgICAgICAgICAgIGNocm9tYVFwSW5kZXhPZmZzZXQKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgcE1iICAgICAgICAgcG9pbnRlciB0byBtYWNyb2Jsb2NrIHN0cnVjdHVyZSB3aGljaCBpcyB1cGRhdGVkCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIG5vbmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBTZXRNYlBhcmFtcyhtYlN0b3JhZ2VfdCAqcE1iLCBzbGljZUhlYWRlcl90ICpwU2xpY2UsIHUzMiBzbGljZUlkLAotICAgIGkzMiBjaHJvbWFRcEluZGV4T2Zmc2V0KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLSAgICB1MzIgdG1wMTsKLSAgICBpMzIgdG1wMiwgdG1wMzsKLQotLyogQ29kZSAqLwotCi0gICAgdG1wMSA9IHBTbGljZS0+ZGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJZGM7Ci0gICAgdG1wMiA9IHBTbGljZS0+c2xpY2VBbHBoYUMwT2Zmc2V0OwotICAgIHRtcDMgPSBwU2xpY2UtPnNsaWNlQmV0YU9mZnNldDsKLSAgICBwTWItPnNsaWNlSWQgPSBzbGljZUlkOwotICAgIHBNYi0+ZGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJZGMgPSB0bXAxOwotICAgIHBNYi0+ZmlsdGVyT2Zmc2V0QSA9IHRtcDI7Ci0gICAgcE1iLT5maWx0ZXJPZmZzZXRCID0gdG1wMzsKLSAgICBwTWItPmNocm9tYVFwSW5kZXhPZmZzZXQgPSBjaHJvbWFRcEluZGV4T2Zmc2V0OwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIDUuMyAgRnVuY3Rpb24gbmFtZTogaDI2NGJzZE1hcmtTbGljZUNvcnJ1cHRlZAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBNYXJrIG1hY3JvYmxvY2tzIG9mIHRoZSBzbGljZSBjb3JydXB0ZWQuIElmIGxhc3RNYkFkZHIgaW4gdGhlIHNsaWNlCi0gICAgICAgICAgICBzdG9yYWdlIGlzIHNldCAtPiBwaWNXaWRodEluTWJzIChvciBhdCBsZWFzdCAxMCkgbWFjcm9ibG9ja3MgYmFjawotICAgICAgICAgICAgZnJvbSAgdGhlIGxhc3RNYkFkZHIgYXJlIG1hcmtlZCBjb3JydXB0ZWQuIEhvd2V2ZXIsIGlmIGxhc3RNYkFkZHIKLSAgICAgICAgICAgIGlzIG5vdCBzZXQgLT4gYWxsIG1hY3JvYmxvY2tzIG9mIHRoZSBzbGljZSBhcmUgbWFya2VkLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdG9yYWdlICAgICAgICBwb2ludGVyIHRvIHN0b3JhZ2Ugc3RydWN0dXJlCi0gICAgICAgICAgICBmaXJzdE1iSW5TbGljZSAgYWRkcmVzcyBvZiB0aGUgZmlyc3QgbWFjcm9ibG9jayBpbiB0aGUgc2xpY2UsIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVzIHRoZSBzbGljZSB0byBiZSBtYXJrZWQgY29ycnVwdGVkCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIHBTdG9yYWdlICAgICAgICBtYlN0b3JhZ2UgZm9yIHRoZSBjb3JydXB0ZWQgbWFjcm9ibG9ja3MgdXBkYXRlZAotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBub25lCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgaDI2NGJzZE1hcmtTbGljZUNvcnJ1cHRlZChzdG9yYWdlX3QgKnBTdG9yYWdlLCB1MzIgZmlyc3RNYkluU2xpY2UpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcCwgaTsKLSAgICB1MzIgc2xpY2VJZDsKLSAgICB1MzIgY3Vyck1iQWRkcjsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdG9yYWdlKTsKLSAgICBBU1NFUlQoZmlyc3RNYkluU2xpY2UgPCBwU3RvcmFnZS0+cGljU2l6ZUluTWJzKTsKLQotICAgIGN1cnJNYkFkZHIgPSBmaXJzdE1iSW5TbGljZTsKLQotICAgIHNsaWNlSWQgPSBwU3RvcmFnZS0+c2xpY2UtPnNsaWNlSWQ7Ci0KLSAgICAvKiBEZWNvZGVTbGljZURhdGEgc2V0cyBsYXN0TWJBZGRyIGZvciBJIHNsaWNlcyAtPiBpZiBpdCB3YXMgc2V0LCBnbyBiYWNrCi0gICAgICogTUFYKHBpY1dpZHRoSW5NYnMsIDEwKSBtYWNyb2Jsb2NrcyBhbmQgc3RhcnQgbWFya2luZyBmcm9tIHRoZXJlICovCi0gICAgaWYgKHBTdG9yYWdlLT5zbGljZS0+bGFzdE1iQWRkcikKLSAgICB7Ci0gICAgICAgIEFTU0VSVChwU3RvcmFnZS0+bWJbcFN0b3JhZ2UtPnNsaWNlLT5sYXN0TWJBZGRyXS5zbGljZUlkID09IHNsaWNlSWQpOwotICAgICAgICBpID0gcFN0b3JhZ2UtPnNsaWNlLT5sYXN0TWJBZGRyIC0gMTsKLSAgICAgICAgdG1wID0gMDsKLSAgICAgICAgd2hpbGUgKGkgPiBjdXJyTWJBZGRyKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocFN0b3JhZ2UtPm1iW2ldLnNsaWNlSWQgPT0gc2xpY2VJZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0bXArKzsKLSAgICAgICAgICAgICAgICBpZiAodG1wID49IE1BWChwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNXaWR0aEluTWJzLCAxMCkpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaS0tOwotICAgICAgICB9Ci0gICAgICAgIGN1cnJNYkFkZHIgPSBpOwotICAgIH0KLQotICAgIGRvCi0gICAgewotCi0gICAgICAgIGlmICggKHBTdG9yYWdlLT5tYltjdXJyTWJBZGRyXS5zbGljZUlkID09IHNsaWNlSWQpICYmCi0gICAgICAgICAgICAgKHBTdG9yYWdlLT5tYltjdXJyTWJBZGRyXS5kZWNvZGVkKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBTdG9yYWdlLT5tYltjdXJyTWJBZGRyXS5kZWNvZGVkLS07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGN1cnJNYkFkZHIgPSBoMjY0YnNkTmV4dE1iQWRkcmVzcyhwU3RvcmFnZS0+c2xpY2VHcm91cE1hcCwKLSAgICAgICAgICAgIHBTdG9yYWdlLT5waWNTaXplSW5NYnMsIGN1cnJNYkFkZHIpOwotCi0gICAgfSB3aGlsZSAoY3Vyck1iQWRkcik7Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2RhdGEuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9kYXRhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyM2Q0OWUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2RhdGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0gICAgMy4gRGF0YSB0eXBlcwotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBIMjY0U1dERUNfU0xJQ0VfREFUQV9ICi0jZGVmaW5lIEgyNjRTV0RFQ19TTElDRV9EQVRBX0gKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9jZmcuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2hlYWRlci5oIgotI2luY2x1ZGUgImgyNjRic2Rfc3RvcmFnZS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIERhdGEgdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2REZWNvZGVTbGljZURhdGEoc3RybURhdGFfdCAqcFN0cm1EYXRhLCBzdG9yYWdlX3QgKnBTdG9yYWdlLAotICAgIGltYWdlX3QgKmN1cnJJbWFnZSwgc2xpY2VIZWFkZXJfdCAqcFNsaWNlSGVhZGVyKTsKLQotdm9pZCBoMjY0YnNkTWFya1NsaWNlQ29ycnVwdGVkKHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIHUzMiBmaXJzdE1iSW5TbGljZSk7Ci0KLSNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX1NMSUNFX0RBVEFfSCAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfZ3JvdXBfbWFwLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfZ3JvdXBfbWFwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjYmI1MzQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2dyb3VwX21hcC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTg5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLSAgICAgMy4gTW9kdWxlIGRlZmluZXMKLSAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotICAgICA1LiBGdW5jdGlvbnMKLSAgICAgICAgICBEZWNvZGVJbnRlcmxlYXZlZE1hcAotICAgICAgICAgIERlY29kZURpc3BlcnNlZE1hcAotICAgICAgICAgIERlY29kZUZvcmVncm91bmRMZWZ0T3Zlck1hcAotICAgICAgICAgIERlY29kZUJveE91dE1hcAotICAgICAgICAgIERlY29kZVJhc3RlclNjYW5NYXAKLSAgICAgICAgICBEZWNvZGVXaXBlTWFwCi0gICAgICAgICAgaDI2NGJzZERlY29kZVNsaWNlR3JvdXBNYXAKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2Rfc2xpY2VfZ3JvdXBfbWFwLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9jZmcuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3BpY19wYXJhbV9zZXQuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdm9pZCBEZWNvZGVJbnRlcmxlYXZlZE1hcCgKLSAgdTMyICptYXAsCi0gIHUzMiBudW1TbGljZUdyb3VwcywKLSAgdTMyICpydW5MZW5ndGgsCi0gIHUzMiBwaWNTaXplKTsKLQotc3RhdGljIHZvaWQgRGVjb2RlRGlzcGVyc2VkTWFwKAotICB1MzIgKm1hcCwKLSAgdTMyIG51bVNsaWNlR3JvdXBzLAotICB1MzIgcGljV2lkdGgsCi0gIHUzMiBwaWNIZWlnaHQpOwotCi1zdGF0aWMgdm9pZCBEZWNvZGVGb3JlZ3JvdW5kTGVmdE92ZXJNYXAoCi0gIHUzMiAqbWFwLAotICB1MzIgbnVtU2xpY2VHcm91cHMsCi0gIHUzMiAqdG9wTGVmdCwKLSAgdTMyICpib3R0b21SaWdodCwKLSAgdTMyIHBpY1dpZHRoLAotICB1MzIgcGljSGVpZ2h0KTsKLQotc3RhdGljIHZvaWQgRGVjb2RlQm94T3V0TWFwKAotICB1MzIgKm1hcCwKLSAgdTMyIHNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnLAotICB1MzIgdW5pdHNJblNsaWNlR3JvdXAwLAotICB1MzIgcGljV2lkdGgsCi0gIHUzMiBwaWNIZWlnaHQpOwotCi1zdGF0aWMgdm9pZCBEZWNvZGVSYXN0ZXJTY2FuTWFwKAotICB1MzIgKm1hcCwKLSAgdTMyIHNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnLAotICB1MzIgc2l6ZU9mVXBwZXJMZWZ0R3JvdXAsCi0gIHUzMiBwaWNTaXplKTsKLQotc3RhdGljIHZvaWQgRGVjb2RlV2lwZU1hcCgKLSAgdTMyICptYXAsCi0gIHUzMiBzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZywKLSAgdTMyIHNpemVPZlVwcGVyTGVmdEdyb3VwLAotICB1MzIgcGljV2lkdGgsCi0gIHUzMiBwaWNIZWlnaHQpOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERlY29kZUludGVybGVhdmVkTWFwCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGRlY29kZSBpbnRlcmxlYXZlZCBzbGljZSBncm91cCBtYXAgdHlwZSwgaS5lLiBzbGljZQotICAgICAgICAgICAgZ3JvdXAgbWFwIHR5cGUgMC4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBtYXAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgbWFwCi0gICAgICAgICAgICBudW1TbGljZUdyb3VwcyAgbnVtYmVyIG9mIHNsaWNlIGdyb3VwcwotICAgICAgICAgICAgcnVuTGVuZ3RoICAgICAgIHJ1bl9sZW5ndGhbXSB2YWx1ZXMgZm9yIGVhY2ggc2xpY2UgZ3JvdXAKLSAgICAgICAgICAgIHBpY1NpemUgICAgICAgICBwaWN0dXJlIHNpemUgaW4gbWFjcm9ibG9ja3MKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgbWFwICAgICAgICAgICAgIHNsaWNlIGdyb3VwIG1hcCBpcyBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBub25lCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgRGVjb2RlSW50ZXJsZWF2ZWRNYXAoCi0gIHUzMiAqbWFwLAotICB1MzIgbnVtU2xpY2VHcm91cHMsCi0gIHUzMiAqcnVuTGVuZ3RoLAotICB1MzIgcGljU2l6ZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaSxqLCBncm91cDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKG1hcCk7Ci0gICAgQVNTRVJUKG51bVNsaWNlR3JvdXBzID49IDEgJiYgbnVtU2xpY2VHcm91cHMgPD0gTUFYX05VTV9TTElDRV9HUk9VUFMpOwotICAgIEFTU0VSVChydW5MZW5ndGgpOwotCi0gICAgaSA9IDA7Ci0KLSAgICBkbyB7Ci0gICAgICAgIGZvciAoZ3JvdXAgPSAwOyBncm91cCA8IG51bVNsaWNlR3JvdXBzICYmIGkgPCBwaWNTaXplOwotICAgICAgICAgIGkgKz0gcnVuTGVuZ3RoW2dyb3VwKytdKQotICAgICAgICB7Ci0gICAgICAgICAgICBBU1NFUlQocnVuTGVuZ3RoW2dyb3VwXSA8PSBwaWNTaXplKTsKLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBydW5MZW5ndGhbZ3JvdXBdICYmIGkgKyBqIDwgcGljU2l6ZTsgaisrKQotICAgICAgICAgICAgICAgIG1hcFtpK2pdID0gZ3JvdXA7Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlIChpIDwgcGljU2l6ZSk7Ci0KLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERlY29kZURpc3BlcnNlZE1hcAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBkZWNvZGUgZGlzcGVyc2VkIHNsaWNlIGdyb3VwIG1hcCB0eXBlLCBpLmUuIHNsaWNlCi0gICAgICAgICAgICBncm91cCBtYXAgdHlwZSAxLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIG1hcCAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIG1hcAotICAgICAgICAgICAgbnVtU2xpY2VHcm91cHMgICAgbnVtYmVyIG9mIHNsaWNlIGdyb3VwcwotICAgICAgICAgICAgcGljV2lkdGggICAgICAgICAgcGljdHVyZSB3aWR0aCBpbiBtYWNyb2Jsb2NrcwotICAgICAgICAgICAgcGljSGVpZ2h0ICAgICAgICAgcGljdHVyZSBoZWlnaHQgaW4gbWFjcm9ibG9ja3MKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgbWFwICAgICAgICAgICAgICAgc2xpY2UgZ3JvdXAgbWFwIGlzIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIG5vbmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBEZWNvZGVEaXNwZXJzZWRNYXAoCi0gIHUzMiAqbWFwLAotICB1MzIgbnVtU2xpY2VHcm91cHMsCi0gIHUzMiBwaWNXaWR0aCwKLSAgdTMyIHBpY0hlaWdodCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaSwgcGljU2l6ZTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKG1hcCk7Ci0gICAgQVNTRVJUKG51bVNsaWNlR3JvdXBzID49IDEgJiYgbnVtU2xpY2VHcm91cHMgPD0gTUFYX05VTV9TTElDRV9HUk9VUFMpOwotICAgIEFTU0VSVChwaWNXaWR0aCk7Ci0gICAgQVNTRVJUKHBpY0hlaWdodCk7Ci0KLSAgICBwaWNTaXplID0gcGljV2lkdGggKiBwaWNIZWlnaHQ7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgcGljU2l6ZTsgaSsrKQotICAgICAgICBtYXBbaV0gPSAoKGkgJSBwaWNXaWR0aCkgKyAoKChpIC8gcGljV2lkdGgpICogbnVtU2xpY2VHcm91cHMpID4+IDEpKSAlCi0gICAgICAgICAgICBudW1TbGljZUdyb3VwczsKLQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlRm9yZWdyb3VuZExlZnRPdmVyTWFwCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGRlY29kZSBmb3JlZ3JvdW5kIHdpdGggbGVmdC1vdmVyIHNsaWNlIGdyb3VwIG1hcCB0eXBlLAotICAgICAgICAgICAgaS5lLiBzbGljZSBncm91cCBtYXAgdHlwZSAyLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIG1hcCAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIG1hcAotICAgICAgICAgICAgbnVtU2xpY2VHcm91cHMgICAgbnVtYmVyIG9mIHNsaWNlIGdyb3VwcwotICAgICAgICAgICAgdG9wTGVmdCAgICAgICAgICAgdG9wX2xlZnRbXSB2YWx1ZXMKLSAgICAgICAgICAgIGJvdHRvbVJpZ2h0ICAgICAgIGJvdHRvbV9yaWdodFtdIHZhbHVlcwotICAgICAgICAgICAgcGljV2lkdGggICAgICAgICAgcGljdHVyZSB3aWR0aCBpbiBtYWNyb2Jsb2NrcwotICAgICAgICAgICAgcGljSGVpZ2h0ICAgICAgICAgcGljdHVyZSBoZWlnaHQgaW4gbWFjcm9ibG9ja3MKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgbWFwICAgICAgICAgICAgICAgc2xpY2UgZ3JvdXAgbWFwIGlzIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIG5vbmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBEZWNvZGVGb3JlZ3JvdW5kTGVmdE92ZXJNYXAoCi0gIHUzMiAqbWFwLAotICB1MzIgbnVtU2xpY2VHcm91cHMsCi0gIHUzMiAqdG9wTGVmdCwKLSAgdTMyICpib3R0b21SaWdodCwKLSAgdTMyIHBpY1dpZHRoLAotICB1MzIgcGljSGVpZ2h0KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpLHkseCx5VG9wTGVmdCx5Qm90dG9tUmlnaHQseFRvcExlZnQseEJvdHRvbVJpZ2h0LCBwaWNTaXplOwotICAgIHUzMiBncm91cDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKG1hcCk7Ci0gICAgQVNTRVJUKG51bVNsaWNlR3JvdXBzID49IDEgJiYgbnVtU2xpY2VHcm91cHMgPD0gTUFYX05VTV9TTElDRV9HUk9VUFMpOwotICAgIEFTU0VSVCh0b3BMZWZ0KTsKLSAgICBBU1NFUlQoYm90dG9tUmlnaHQpOwotICAgIEFTU0VSVChwaWNXaWR0aCk7Ci0gICAgQVNTRVJUKHBpY0hlaWdodCk7Ci0KLSAgICBwaWNTaXplID0gcGljV2lkdGggKiBwaWNIZWlnaHQ7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgcGljU2l6ZTsgaSsrKQotICAgICAgICBtYXBbaV0gPSBudW1TbGljZUdyb3VwcyAtIDE7Ci0KLSAgICBmb3IgKGdyb3VwID0gbnVtU2xpY2VHcm91cHMgLSAxOyBncm91cC0tOyApCi0gICAgewotICAgICAgICBBU1NFUlQoIHRvcExlZnRbZ3JvdXBdIDw9IGJvdHRvbVJpZ2h0W2dyb3VwXSAmJgotICAgICAgICAgICAgICAgIGJvdHRvbVJpZ2h0W2dyb3VwXSA8IHBpY1NpemUgKTsKLSAgICAgICAgeVRvcExlZnQgPSB0b3BMZWZ0W2dyb3VwXSAvIHBpY1dpZHRoOwotICAgICAgICB4VG9wTGVmdCA9IHRvcExlZnRbZ3JvdXBdICUgcGljV2lkdGg7Ci0gICAgICAgIHlCb3R0b21SaWdodCA9IGJvdHRvbVJpZ2h0W2dyb3VwXSAvIHBpY1dpZHRoOwotICAgICAgICB4Qm90dG9tUmlnaHQgPSBib3R0b21SaWdodFtncm91cF0gJSBwaWNXaWR0aDsKLSAgICAgICAgQVNTRVJUKHhUb3BMZWZ0IDw9IHhCb3R0b21SaWdodCk7Ci0KLSAgICAgICAgZm9yICh5ID0geVRvcExlZnQ7IHkgPD0geUJvdHRvbVJpZ2h0OyB5KyspCi0gICAgICAgICAgICBmb3IgKHggPSB4VG9wTGVmdDsgeCA8PSB4Qm90dG9tUmlnaHQ7IHgrKykKLSAgICAgICAgICAgICAgICBtYXBbIHkgKiBwaWNXaWR0aCArIHggXSA9IGdyb3VwOwotICAgIH0KLQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlQm94T3V0TWFwCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGRlY29kZSBib3gtb3V0IHNsaWNlIGdyb3VwIG1hcCB0eXBlLCBpLmUuIHNsaWNlIGdyb3VwCi0gICAgICAgICAgICBtYXAgdHlwZSAzLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIG1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBtYXAKLSAgICAgICAgICAgIHNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnICAgICBzbGljZV9ncm91cF9jaGFuZ2VfZGlyZWN0aW9uX2ZsYWcKLSAgICAgICAgICAgIHVuaXRzSW5TbGljZUdyb3VwMCAgICAgICAgICAgICAgICBtYnMgb24gc2xpY2UgZ3JvdXAgMAotICAgICAgICAgICAgcGljV2lkdGggICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUgd2lkdGggaW4gbWFjcm9ibG9ja3MKLSAgICAgICAgICAgIHBpY0hlaWdodCAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlIGhlaWdodCBpbiBtYWNyb2Jsb2NrcwotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2UgZ3JvdXAgbWFwIGlzIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIG5vbmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBEZWNvZGVCb3hPdXRNYXAoCi0gIHUzMiAqbWFwLAotICB1MzIgc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcsCi0gIHUzMiB1bml0c0luU2xpY2VHcm91cDAsCi0gIHUzMiBwaWNXaWR0aCwKLSAgdTMyIHBpY0hlaWdodCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaSwgaywgcGljU2l6ZTsKLSAgICBpMzIgeCwgeSwgeERpciwgeURpciwgbGVmdEJvdW5kLCB0b3BCb3VuZCwgcmlnaHRCb3VuZCwgYm90dG9tQm91bmQ7Ci0gICAgdTMyIG1hcFVuaXRWYWNhbnQ7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChtYXApOwotICAgIEFTU0VSVChwaWNXaWR0aCk7Ci0gICAgQVNTRVJUKHBpY0hlaWdodCk7Ci0KLSAgICBwaWNTaXplID0gcGljV2lkdGggKiBwaWNIZWlnaHQ7Ci0gICAgQVNTRVJUKHVuaXRzSW5TbGljZUdyb3VwMCA8PSBwaWNTaXplKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBwaWNTaXplOyBpKyspCi0gICAgICAgIG1hcFtpXSA9IDE7Ci0KLSAgICB4ID0gKHBpY1dpZHRoIC0gKHUzMilzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZykgPj4gMTsKLSAgICB5ID0gKHBpY0hlaWdodCAtICh1MzIpc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcpID4+IDE7Ci0KLSAgICBsZWZ0Qm91bmQgPSB4OwotICAgIHRvcEJvdW5kID0geTsKLQotICAgIHJpZ2h0Qm91bmQgPSB4OwotICAgIGJvdHRvbUJvdW5kID0geTsKLQotICAgIHhEaXIgPSAoaTMyKXNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnIC0gMTsKLSAgICB5RGlyID0gKGkzMilzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZzsKLQotICAgIGZvciAoayA9IDA7IGsgPCB1bml0c0luU2xpY2VHcm91cDA7IGsgKz0gbWFwVW5pdFZhY2FudCA/IDEgOiAwKQotICAgIHsKLSAgICAgICAgbWFwVW5pdFZhY2FudCA9IChtYXBbICh1MzIpeSAqIHBpY1dpZHRoICsgKHUzMil4IF0gPT0gMSkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgICAgIGlmIChtYXBVbml0VmFjYW50KQotICAgICAgICAgICAgbWFwWyAodTMyKXkgKiBwaWNXaWR0aCArICh1MzIpeCBdID0gMDsKLQotICAgICAgICBpZiAoeERpciA9PSAtMSAmJiB4ID09IGxlZnRCb3VuZCkKLSAgICAgICAgewotICAgICAgICAgICAgbGVmdEJvdW5kID0gTUFYKGxlZnRCb3VuZCAtIDEsIDApOwotICAgICAgICAgICAgeCA9IGxlZnRCb3VuZDsKLSAgICAgICAgICAgIHhEaXIgPSAwOwotICAgICAgICAgICAgeURpciA9IDIgKiAoaTMyKXNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnIC0gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh4RGlyID09IDEgJiYgeCA9PSByaWdodEJvdW5kKQotICAgICAgICB7Ci0gICAgICAgICAgICByaWdodEJvdW5kID0gTUlOKHJpZ2h0Qm91bmQgKyAxLCAoaTMyKXBpY1dpZHRoIC0gMSk7Ci0gICAgICAgICAgICB4ID0gcmlnaHRCb3VuZDsKLSAgICAgICAgICAgIHhEaXIgPSAwOwotICAgICAgICAgICAgeURpciA9IDEgLSAyICogKGkzMilzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh5RGlyID09IC0xICYmIHkgPT0gdG9wQm91bmQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRvcEJvdW5kID0gTUFYKHRvcEJvdW5kIC0gMSwgMCk7Ci0gICAgICAgICAgICB5ID0gdG9wQm91bmQ7Ci0gICAgICAgICAgICB4RGlyID0gMSAtIDIgKiAoaTMyKXNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnOwotICAgICAgICAgICAgeURpciA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoeURpciA9PSAxICYmIHkgPT0gYm90dG9tQm91bmQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJvdHRvbUJvdW5kID0gTUlOKGJvdHRvbUJvdW5kICsgMSwgKGkzMilwaWNIZWlnaHQgLSAxKTsKLSAgICAgICAgICAgIHkgPSBib3R0b21Cb3VuZDsKLSAgICAgICAgICAgIHhEaXIgPSAyICogKGkzMilzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZyAtIDE7Ci0gICAgICAgICAgICB5RGlyID0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHggKz0geERpcjsKLSAgICAgICAgICAgIHkgKz0geURpcjsKLSAgICAgICAgfQotICAgIH0KLQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlUmFzdGVyU2Nhbk1hcAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBkZWNvZGUgcmFzdGVyIHNjYW4gc2xpY2UgZ3JvdXAgbWFwIHR5cGUsIGkuZS4gc2xpY2UKLSAgICAgICAgICAgIGdyb3VwIG1hcCB0eXBlIDQuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgbWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIG1hcAotICAgICAgICAgICAgc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcgICAgIHNsaWNlX2dyb3VwX2NoYW5nZV9kaXJlY3Rpb25fZmxhZwotICAgICAgICAgICAgc2l6ZU9mVXBwZXJMZWZ0R3JvdXAgICAgICAgICAgICAgIG1icyBpbiB1cHBlckxlZnRHcm91cAotICAgICAgICAgICAgcGljU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUgc2l6ZSBpbiBtYWNyb2Jsb2NrcwotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2UgZ3JvdXAgbWFwIGlzIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIG5vbmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBEZWNvZGVSYXN0ZXJTY2FuTWFwKAotICB1MzIgKm1hcCwKLSAgdTMyIHNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnLAotICB1MzIgc2l6ZU9mVXBwZXJMZWZ0R3JvdXAsCi0gIHUzMiBwaWNTaXplKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQobWFwKTsKLSAgICBBU1NFUlQocGljU2l6ZSk7Ci0gICAgQVNTRVJUKHNpemVPZlVwcGVyTGVmdEdyb3VwIDw9IHBpY1NpemUpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IHBpY1NpemU7IGkrKykKLSAgICAgICAgaWYgKGkgPCBzaXplT2ZVcHBlckxlZnRHcm91cCkKLSAgICAgICAgICAgIG1hcFtpXSA9ICh1MzIpc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWc7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1hcFtpXSA9IDEgLSAodTMyKXNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnOwotCi0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZWNvZGVXaXBlTWFwCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGRlY29kZSB3aXBlIHNsaWNlIGdyb3VwIG1hcCB0eXBlLCBpLmUuIHNsaWNlIGdyb3VwIG1hcAotICAgICAgICAgICAgdHlwZSA1LgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnICAgICBzbGljZV9ncm91cF9jaGFuZ2VfZGlyZWN0aW9uX2ZsYWcKLSAgICAgICAgICAgIHNpemVPZlVwcGVyTGVmdEdyb3VwICAgICAgICAgICAgICBtYnMgaW4gdXBwZXJMZWZ0R3JvdXAKLSAgICAgICAgICAgIHBpY1dpZHRoICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlIHdpZHRoIGluIG1hY3JvYmxvY2tzCi0gICAgICAgICAgICBwaWNIZWlnaHQgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZSBoZWlnaHQgaW4gbWFjcm9ibG9ja3MKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgbWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlIGdyb3VwIG1hcCBpcyBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBub25lCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgRGVjb2RlV2lwZU1hcCgKLSAgdTMyICptYXAsCi0gIHUzMiBzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZywKLSAgdTMyIHNpemVPZlVwcGVyTGVmdEdyb3VwLAotICB1MzIgcGljV2lkdGgsCi0gIHUzMiBwaWNIZWlnaHQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGksaixrOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQobWFwKTsKLSAgICBBU1NFUlQocGljV2lkdGgpOwotICAgIEFTU0VSVChwaWNIZWlnaHQpOwotICAgIEFTU0VSVChzaXplT2ZVcHBlckxlZnRHcm91cCA8PSBwaWNXaWR0aCAqIHBpY0hlaWdodCk7Ci0KLSAgICBrID0gMDsKLSAgICBmb3IgKGogPSAwOyBqIDwgcGljV2lkdGg7IGorKykKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHBpY0hlaWdodDsgaSsrKQotICAgICAgICAgICAgaWYgKGsrKyA8IHNpemVPZlVwcGVyTGVmdEdyb3VwKQotICAgICAgICAgICAgICAgIG1hcFsgaSAqIHBpY1dpZHRoICsgaiBdID0gKHUzMilzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZzsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBtYXBbIGkgKiBwaWNXaWR0aCArIGogXSA9IDEgLQotICAgICAgICAgICAgICAgICAgICAodTMyKXNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnOwotCi0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkRGVjb2RlU2xpY2VHcm91cE1hcAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBkZWNvZGUgbWFjcm9ibG9jayB0byBzbGljZSBncm91cCBtYXAuIENvbnN0cnVjdGlvbgotICAgICAgICAgICAgb2YgZGlmZmVyZW50IHNsaWNlIGdyb3VwIG1hcCB0eXBlcyBpcyBoYW5kbGVkIGJ5IHNlcGFyYXRlCi0gICAgICAgICAgICBmdW5jdGlvbnMgZGVmaW5lZCBhYm92ZS4gU2VlIHN0YW5kYXJkIGZvciBkZXRhaWxzIGhvdyBzbGljZSBncm91cAotICAgICAgICAgICAgbWFwcyBhcmUgY29tcHV0ZWQuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcHBzICAgICAgICAgICAgICAgICAgICAgYWN0aXZlIHBpY3R1cmUgcGFyYW1ldGVyIHNldAotICAgICAgICAgICAgc2xpY2VHcm91cENoYW5nZUN5Y2xlICAgc2xpY2VfZ3JvdXBfY2hhbmdlX2N5Y2xlCi0gICAgICAgICAgICBwaWNXaWR0aCAgICAgICAgICAgICAgICBwaWN0dXJlIHdpZHRoIGluIG1hY3JvYmxvY2tzCi0gICAgICAgICAgICBwaWNIZWlnaHQgICAgICAgICAgICAgICBwaWN0dXJlIGhlaWdodCBpbiBtYWNyb2Jsb2NrcwotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBtYXAgICAgICAgICAgICAgICAgICAgICBzbGljZSBncm91cCBtYXAgaXMgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgbm9uZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIGgyNjRic2REZWNvZGVTbGljZUdyb3VwTWFwKAotICB1MzIgKm1hcCwKLSAgcGljUGFyYW1TZXRfdCAqcHBzLAotICB1MzIgc2xpY2VHcm91cENoYW5nZUN5Y2xlLAotICB1MzIgcGljV2lkdGgsCi0gIHUzMiBwaWNIZWlnaHQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGksIHBpY1NpemUsIHVuaXRzSW5TbGljZUdyb3VwMCA9IDAsIHNpemVPZlVwcGVyTGVmdEdyb3VwID0gMDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKG1hcCk7Ci0gICAgQVNTRVJUKHBwcyk7Ci0gICAgQVNTRVJUKHBpY1dpZHRoKTsKLSAgICBBU1NFUlQocGljSGVpZ2h0KTsKLSAgICBBU1NFUlQocHBzLT5zbGljZUdyb3VwTWFwVHlwZSA8IDcpOwotCi0gICAgcGljU2l6ZSA9IHBpY1dpZHRoICogcGljSGVpZ2h0OwotCi0gICAgLyoganVzdCBvbmUgc2xpY2UgZ3JvdXAgLT4gYWxsIG1hY3JvYmxvY2tzIGJlbG9uZyB0byBncm91cCAwICovCi0gICAgaWYgKHBwcy0+bnVtU2xpY2VHcm91cHMgPT0gMSkKLSAgICB7Ci0gICAgICAgIEgyNjRTd0RlY01lbXNldChtYXAsIDAsIHBpY1NpemUgKiBzaXplb2YodTMyKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocHBzLT5zbGljZUdyb3VwTWFwVHlwZSA+IDIgJiYgcHBzLT5zbGljZUdyb3VwTWFwVHlwZSA8IDYpCi0gICAgewotICAgICAgICBBU1NFUlQocHBzLT5zbGljZUdyb3VwQ2hhbmdlUmF0ZSAmJgotICAgICAgICAgICAgICAgcHBzLT5zbGljZUdyb3VwQ2hhbmdlUmF0ZSA8PSBwaWNTaXplKTsKLQotICAgICAgICB1bml0c0luU2xpY2VHcm91cDAgPQotICAgICAgICAgICAgTUlOKHNsaWNlR3JvdXBDaGFuZ2VDeWNsZSAqIHBwcy0+c2xpY2VHcm91cENoYW5nZVJhdGUsIHBpY1NpemUpOwotCi0gICAgICAgIGlmIChwcHMtPnNsaWNlR3JvdXBNYXBUeXBlID09IDQgfHwgcHBzLT5zbGljZUdyb3VwTWFwVHlwZSA9PSA1KQotICAgICAgICAgICAgc2l6ZU9mVXBwZXJMZWZ0R3JvdXAgPSBwcHMtPnNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnID8KLSAgICAgICAgICAgICAgICAocGljU2l6ZSAtIHVuaXRzSW5TbGljZUdyb3VwMCkgOiB1bml0c0luU2xpY2VHcm91cDA7Ci0gICAgfQotCi0gICAgc3dpdGNoIChwcHMtPnNsaWNlR3JvdXBNYXBUeXBlKQotICAgIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgRGVjb2RlSW50ZXJsZWF2ZWRNYXAobWFwLCBwcHMtPm51bVNsaWNlR3JvdXBzLAotICAgICAgICAgICAgICBwcHMtPnJ1bkxlbmd0aCwgcGljU2l6ZSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBEZWNvZGVEaXNwZXJzZWRNYXAobWFwLCBwcHMtPm51bVNsaWNlR3JvdXBzLCBwaWNXaWR0aCwKLSAgICAgICAgICAgICAgcGljSGVpZ2h0KTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIERlY29kZUZvcmVncm91bmRMZWZ0T3Zlck1hcChtYXAsIHBwcy0+bnVtU2xpY2VHcm91cHMsCi0gICAgICAgICAgICAgIHBwcy0+dG9wTGVmdCwgcHBzLT5ib3R0b21SaWdodCwgcGljV2lkdGgsIHBpY0hlaWdodCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICBEZWNvZGVCb3hPdXRNYXAobWFwLCBwcHMtPnNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnLAotICAgICAgICAgICAgICB1bml0c0luU2xpY2VHcm91cDAsIHBpY1dpZHRoLCBwaWNIZWlnaHQpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgRGVjb2RlUmFzdGVyU2Nhbk1hcChtYXAsCi0gICAgICAgICAgICAgIHBwcy0+c2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcsIHNpemVPZlVwcGVyTGVmdEdyb3VwLAotICAgICAgICAgICAgICBwaWNTaXplKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgIERlY29kZVdpcGVNYXAobWFwLCBwcHMtPnNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnLAotICAgICAgICAgICAgICBzaXplT2ZVcHBlckxlZnRHcm91cCwgcGljV2lkdGgsIHBpY0hlaWdodCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQVNTRVJUKHBwcy0+c2xpY2VHcm91cElkKTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwaWNTaXplOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQVNTRVJUKHBwcy0+c2xpY2VHcm91cElkW2ldIDwgcHBzLT5udW1TbGljZUdyb3Vwcyk7Ci0gICAgICAgICAgICAgICAgbWFwW2ldID0gcHBzLT5zbGljZUdyb3VwSWRbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2dyb3VwX21hcC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2dyb3VwX21hcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmNiNmYyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9ncm91cF9tYXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0gICAgMy4gRGF0YSB0eXBlcwotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBIMjY0U1dERUNfU0xJQ0VfR1JPVVBfTUFQX0gKLSNkZWZpbmUgSDI2NFNXREVDX1NMSUNFX0dST1VQX01BUF9ICi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3BpY19wYXJhbV9zZXQuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIERhdGEgdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIGgyNjRic2REZWNvZGVTbGljZUdyb3VwTWFwKAotICB1MzIgKm1hcCwKLSAgcGljUGFyYW1TZXRfdCAqcHBzLAotICB1MzIgc2xpY2VHcm91cENoYW5nZUN5Y2xlLAotICB1MzIgcGljV2lkdGgsCi0gIHUzMiBwaWNIZWlnaHQpOwotCi0jZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19TTElDRV9HUk9VUF9NQVBfSCAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfaGVhZGVyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfaGVhZGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNDAxYzYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2hlYWRlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUxNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0gICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0gICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgICAgNS4gRnVuY3Rpb25zCi0gICAgICAgICAgaDI2NGJzZERlY29kZVNsaWNlSGVhZGVyCi0gICAgICAgICAgTnVtU2xpY2VHcm91cENoYW5nZUN5Y2xlQml0cwotICAgICAgICAgIFJlZlBpY0xpc3RSZW9yZGVyaW5nCi0gICAgICAgICAgRGVjUmVmUGljTWFya2luZwotICAgICAgICAgIENoZWNrUHBzSWQKLSAgICAgICAgICBDaGVja0ZyYW1lTnVtCi0gICAgICAgICAgQ2hlY2tJZHJQaWNJZAotICAgICAgICAgIENoZWNrUGljT3JkZXJDbnRMc2IKLSAgICAgICAgICBDaGVja0RlbHRhUGljT3JkZXJDbnRCb3R0b20KLSAgICAgICAgICBDaGVja0RlbHRhUGljT3JkZXJDbnQKLSAgICAgICAgICBDaGVja1JlZHVuZGFudFBpY0NudAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImgyNjRic2Rfc2xpY2VfaGVhZGVyLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF92bGMuaCIKLSNpbmNsdWRlICJoMjY0YnNkX25hbF91bml0LmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9kcGIuaCIKLQotI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBSZWZQaWNMaXN0UmVvcmRlcmluZyhzdHJtRGF0YV90ICosIHJlZlBpY0xpc3RSZW9yZGVyaW5nX3QgKiwKLSAgICB1MzIsIHUzMik7Ci0KLXN0YXRpYyB1MzIgTnVtU2xpY2VHcm91cENoYW5nZUN5Y2xlQml0cyh1MzIgcGljU2l6ZUluTWJzLAotICAgIHUzMiBzbGljZUdyb3VwQ2hhbmdlUmF0ZSk7Ci0KLXN0YXRpYyB1MzIgRGVjUmVmUGljTWFya2luZyhzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gICAgZGVjUmVmUGljTWFya2luZ190ICpwRGVjUmVmUGljTWFya2luZywgbmFsVW5pdFR5cGVfZSBuYWxVbml0VHlwZSwKLSAgICB1MzIgbnVtUmVmRnJhbWVzKTsKLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogaDI2NGJzZERlY29kZVNsaWNlSGVhZGVyCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIERlY29kZSBzbGljZSBoZWFkZXIgZGF0YSBmcm9tIHRoZSBzdHJlYW0uCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCi0gICAgICAgICAgICBwU2VxUGFyYW1TZXQgICAgcG9pbnRlciB0byBhY3RpdmUgc2VxdWVuY2UgcGFyYW1ldGVyIHNldAotICAgICAgICAgICAgcFBpY1BhcmFtU2V0ICAgIHBvaW50ZXIgdG8gYWN0aXZlIHBpY3R1cmUgcGFyYW1ldGVyIHNldAotICAgICAgICAgICAgcE5hbFVuaXQgICAgICAgIHBvaW50ZXIgdG8gY3VycmVudCBOQUwgdW5pdCBzdHJ1Y3R1cmUKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgcFNsaWNlSGVhZGVyICAgIGRlY29kZWQgZGF0YSBpcyBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcwotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGludmFsaWQgc3RyZWFtIGRhdGEgb3IgZW5kIG9mIHN0cmVhbQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZERlY29kZVNsaWNlSGVhZGVyKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgc2xpY2VIZWFkZXJfdCAqcFNsaWNlSGVhZGVyLAotICAgIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCwgcGljUGFyYW1TZXRfdCAqcFBpY1BhcmFtU2V0LAotICAgIG5hbFVuaXRfdCAqcE5hbFVuaXQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcCwgaSwgdmFsdWU7Ci0gICAgaTMyIGl0bXA7Ci0gICAgdTMyIHBpY1NpemVJbk1iczsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBTbGljZUhlYWRlcik7Ci0gICAgQVNTRVJUKHBTZXFQYXJhbVNldCk7Ci0gICAgQVNTRVJUKHBQaWNQYXJhbVNldCk7Ci0gICAgQVNTRVJUKCBwTmFsVW5pdC0+bmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFIHx8Ci0gICAgICAgICAgICBwTmFsVW5pdC0+bmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFX0lEUiApOwotCi0KLSAgICBIMjY0U3dEZWNNZW1zZXQocFNsaWNlSGVhZGVyLCAwLCBzaXplb2Yoc2xpY2VIZWFkZXJfdCkpOwotCi0gICAgcGljU2l6ZUluTWJzID0gcFNlcVBhcmFtU2V0LT5waWNXaWR0aEluTWJzICogcFNlcVBhcmFtU2V0LT5waWNIZWlnaHRJbk1iczsKLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLSAgICBwU2xpY2VIZWFkZXItPmZpcnN0TWJJblNsaWNlID0gdmFsdWU7Ci0gICAgaWYgKHZhbHVlID49IHBpY1NpemVJbk1icykKLSAgICB7Ci0gICAgICAgIEVQUklOVCgiZmlyc3RfbWJfaW5fc2xpY2UiKTsKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLQotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotICAgIHBTbGljZUhlYWRlci0+c2xpY2VUeXBlID0gdmFsdWU7Ci0gICAgLyogc2xpY2UgdHlwZSBoYXMgdG8gYmUgZWl0aGVyIEkgb3IgUCBzbGljZS4gUCBzbGljZSBpcyBub3QgYWxsb3dlZCB3aGVuCi0gICAgICogY3VycmVudCBOQUwgdW5pdCBpcyBhbiBJRFIgTkFMIHVuaXQgb3IgbnVtX3JlZl9mcmFtZXMgaXMgMCAqLwotICAgIGlmICggIUlTX0lfU0xJQ0UocFNsaWNlSGVhZGVyLT5zbGljZVR5cGUpICYmCi0gICAgICAgICAoICFJU19QX1NMSUNFKHBTbGljZUhlYWRlci0+c2xpY2VUeXBlKSB8fAotICAgICAgICAgICBJU19JRFJfTkFMX1VOSVQocE5hbFVuaXQpIHx8Ci0gICAgICAgICAgICFwU2VxUGFyYW1TZXQtPm51bVJlZkZyYW1lcyApICkKLSAgICB7Ci0gICAgICAgIEVQUklOVCgic2xpY2VfdHlwZSIpOwotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgcFNsaWNlSGVhZGVyLT5waWNQYXJhbWV0ZXJTZXRJZCA9IHZhbHVlOwotICAgIGlmIChwU2xpY2VIZWFkZXItPnBpY1BhcmFtZXRlclNldElkICE9IHBQaWNQYXJhbVNldC0+cGljUGFyYW1ldGVyU2V0SWQpCi0gICAgewotICAgICAgICBFUFJJTlQoInBpY19wYXJhbWV0ZXJfc2V0X2lkIik7Ci0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0KLSAgICAvKiBsb2cyKG1heEZyYW1lTnVtKSAtPiBudW0gYml0cyB0byByZXByZXNlbnQgZnJhbWVfbnVtICovCi0gICAgaSA9IDA7Ci0gICAgd2hpbGUgKHBTZXFQYXJhbVNldC0+bWF4RnJhbWVOdW0gPj4gaSkKLSAgICAgICAgaSsrOwotICAgIGktLTsKLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgaSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgaWYgKElTX0lEUl9OQUxfVU5JVChwTmFsVW5pdCkgJiYgdG1wICE9IDApCi0gICAgewotICAgICAgICBFUFJJTlQoImZyYW1lX251bSIpOwotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotICAgIHBTbGljZUhlYWRlci0+ZnJhbWVOdW0gPSB0bXA7Ci0KLSAgICBpZiAoSVNfSURSX05BTF9VTklUKHBOYWxVbml0KSkKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgIHBTbGljZUhlYWRlci0+aWRyUGljSWQgPSB2YWx1ZTsKLSAgICAgICAgaWYgKHZhbHVlID4gNjU1MzUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEVQUklOVCgiaWRyX3BpY19pZCIpOwotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHBTZXFQYXJhbVNldC0+cGljT3JkZXJDbnRUeXBlID09IDApCi0gICAgewotICAgICAgICAvKiBsb2cyKG1heFBpY09yZGVyQ250THNiKSAtPiBudW0gYml0cyB0byByZXByZXNlbnQgcGljX29yZGVyX2NudF9sc2IgKi8KLSAgICAgICAgaSA9IDA7Ci0gICAgICAgIHdoaWxlIChwU2VxUGFyYW1TZXQtPm1heFBpY09yZGVyQ250THNiID4+IGkpCi0gICAgICAgICAgICBpKys7Ci0gICAgICAgIGktLTsKLQotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIGkpOwotICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBTbGljZUhlYWRlci0+cGljT3JkZXJDbnRMc2IgPSB0bXA7Ci0KLSAgICAgICAgaWYgKHBQaWNQYXJhbVNldC0+cGljT3JkZXJQcmVzZW50RmxhZykKLSAgICAgICAgewotICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsICZpdG1wKTsKLSAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICAgICAgcFNsaWNlSGVhZGVyLT5kZWx0YVBpY09yZGVyQ250Qm90dG9tID0gaXRtcDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGNoZWNrIHRoYXQgcGljT3JkZXJDbnQgZm9yIElEUiBwaWN0dXJlIHdpbGwgYmUgemVyby4gU2VlCi0gICAgICAgICAqIERlY29kZVBpY09yZGVyQ250IGZ1bmN0aW9uIHRvIHVuZGVyc3RhbmQgdGhlIGxvZ2ljIGhlcmUgKi8KLSAgICAgICAgaWYgKCBJU19JRFJfTkFMX1VOSVQocE5hbFVuaXQpICYmCi0gICAgICAgICAgICAgKCAocFNsaWNlSGVhZGVyLT5waWNPcmRlckNudExzYiA+Ci0gICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT5tYXhQaWNPcmRlckNudExzYi8yKSB8fAotICAgICAgICAgICAgICAgIE1JTigoaTMyKXBTbGljZUhlYWRlci0+cGljT3JkZXJDbnRMc2IsCi0gICAgICAgICAgICAgICAgICAgIChpMzIpcFNsaWNlSGVhZGVyLT5waWNPcmRlckNudExzYiArCi0gICAgICAgICAgICAgICAgICAgIHBTbGljZUhlYWRlci0+ZGVsdGFQaWNPcmRlckNudEJvdHRvbSkgIT0gMCApICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCAocFNlcVBhcmFtU2V0LT5waWNPcmRlckNudFR5cGUgPT0gMSkgJiYKLSAgICAgICAgICFwU2VxUGFyYW1TZXQtPmRlbHRhUGljT3JkZXJBbHdheXNaZXJvRmxhZyApCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwgJml0bXApOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICBwU2xpY2VIZWFkZXItPmRlbHRhUGljT3JkZXJDbnRbMF0gPSBpdG1wOwotCi0gICAgICAgIGlmIChwUGljUGFyYW1TZXQtPnBpY09yZGVyUHJlc2VudEZsYWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLCAmaXRtcCk7Ci0gICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgICAgIHBTbGljZUhlYWRlci0+ZGVsdGFQaWNPcmRlckNudFsxXSA9IGl0bXA7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBjaGVjayB0aGF0IHBpY09yZGVyQ250IGZvciBJRFIgcGljdHVyZSB3aWxsIGJlIHplcm8uIFNlZQotICAgICAgICAgKiBEZWNvZGVQaWNPcmRlckNudCBmdW5jdGlvbiB0byB1bmRlcnN0YW5kIHRoZSBsb2dpYyBoZXJlICovCi0gICAgICAgIGlmICggSVNfSURSX05BTF9VTklUKHBOYWxVbml0KSAmJgotICAgICAgICAgICAgIE1JTihwU2xpY2VIZWFkZXItPmRlbHRhUGljT3JkZXJDbnRbMF0sCi0gICAgICAgICAgICAgICAgIHBTbGljZUhlYWRlci0+ZGVsdGFQaWNPcmRlckNudFswXSArCi0gICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+b2Zmc2V0Rm9yVG9wVG9Cb3R0b21GaWVsZCArCi0gICAgICAgICAgICAgICAgIHBTbGljZUhlYWRlci0+ZGVsdGFQaWNPcmRlckNudFsxXSkgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHBQaWNQYXJhbVNldC0+cmVkdW5kYW50UGljQ250UHJlc2VudEZsYWcpCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICBwU2xpY2VIZWFkZXItPnJlZHVuZGFudFBpY0NudCA9IHZhbHVlOwotICAgICAgICBpZiAodmFsdWUgPiAxMjcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEVQUklOVCgicmVkdW5kYW50X3BpY19jbnQiKTsKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChJU19QX1NMSUNFKHBTbGljZUhlYWRlci0+c2xpY2VUeXBlKSkKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcFNsaWNlSGVhZGVyLT5udW1SZWZJZHhBY3RpdmVPdmVycmlkZUZsYWcgPSB0bXA7Ci0KLSAgICAgICAgaWYgKHBTbGljZUhlYWRlci0+bnVtUmVmSWR4QWN0aXZlT3ZlcnJpZGVGbGFnKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOwotICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgICAgICBpZiAodmFsdWUgPiAxNSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFUFJJTlQoIm51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czEiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwU2xpY2VIZWFkZXItPm51bVJlZklkeEwwQWN0aXZlID0gdmFsdWUgKyAxOwotICAgICAgICB9Ci0gICAgICAgIC8qIHNldCBudW1SZWZJZHhMMEFjdGl2ZSBmcm9tIHBpYyBwYXJhbSBzZXQgKi8KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBpZiB2YWx1ZSAobWludXMxKSBpbiBwaWN0dXJlIHBhcmFtZXRlciBzZXQgZXhjZWVkcyAxNSBpdCBzaG91bGQKLSAgICAgICAgICAgICAqIGhhdmUgYmVlbiBvdmVycmlkZGVuIGhlcmUgKi8KLSAgICAgICAgICAgIGlmIChwUGljUGFyYW1TZXQtPm51bVJlZklkeEwwQWN0aXZlID4gMTYpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRVBSSU5UKCJudW1fcmVmX2lkeF9hY3RpdmVfb3ZlcnJpZGVfZmxhZyIpOwotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBTbGljZUhlYWRlci0+bnVtUmVmSWR4TDBBY3RpdmUgPSBwUGljUGFyYW1TZXQtPm51bVJlZklkeEwwQWN0aXZlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKElTX1BfU0xJQ0UocFNsaWNlSGVhZGVyLT5zbGljZVR5cGUpKQotICAgIHsKLSAgICAgICAgdG1wID0gUmVmUGljTGlzdFJlb3JkZXJpbmcocFN0cm1EYXRhLAotICAgICAgICAgICAgJnBTbGljZUhlYWRlci0+cmVmUGljTGlzdFJlb3JkZXJpbmcsCi0gICAgICAgICAgICBwU2xpY2VIZWFkZXItPm51bVJlZklkeEwwQWN0aXZlLAotICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT5tYXhGcmFtZU51bSk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgfQotCi0gICAgaWYgKHBOYWxVbml0LT5uYWxSZWZJZGMgIT0gMCkKLSAgICB7Ci0gICAgICAgIHRtcCA9IERlY1JlZlBpY01hcmtpbmcocFN0cm1EYXRhLCAmcFNsaWNlSGVhZGVyLT5kZWNSZWZQaWNNYXJraW5nLAotICAgICAgICAgICAgcE5hbFVuaXQtPm5hbFVuaXRUeXBlLCBwU2VxUGFyYW1TZXQtPm51bVJlZkZyYW1lcyk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgfQotCi0gICAgLyogZGVjb2RlIHNsaWNlUXBEZWx0YSBhbmQgY2hlY2sgdGhhdCBpbml0aWFsIFFQIGZvciB0aGUgc2xpY2Ugd2lsbCBiZSBvbgotICAgICAqIHRoZSByYW5nZSBbMCwgNTFdICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsICZpdG1wKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgcFNsaWNlSGVhZGVyLT5zbGljZVFwRGVsdGEgPSBpdG1wOwotICAgIGl0bXAgKz0gKGkzMilwUGljUGFyYW1TZXQtPnBpY0luaXRRcDsKLSAgICBpZiAoIChpdG1wIDwgMCkgfHwgKGl0bXAgPiA1MSkgKQotICAgIHsKLSAgICAgICAgRVBSSU5UKCJzbGljZV9xcF9kZWx0YSIpOwotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotCi0gICAgaWYgKHBQaWNQYXJhbVNldC0+ZGVibG9ja2luZ0ZpbHRlckNvbnRyb2xQcmVzZW50RmxhZykKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgIHBTbGljZUhlYWRlci0+ZGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJZGMgPSB2YWx1ZTsKLSAgICAgICAgaWYgKHBTbGljZUhlYWRlci0+ZGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJZGMgPiAyKQotICAgICAgICB7Ci0gICAgICAgICAgICBFUFJJTlQoImRpc2FibGVfZGVibG9ja2luZ19maWx0ZXJfaWRjIik7Ci0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocFNsaWNlSGVhZGVyLT5kaXNhYmxlRGVibG9ja2luZ0ZpbHRlcklkYyAhPSAxKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwgJml0bXApOwotICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgICAgICBpZiAoIChpdG1wIDwgLTYpIHx8IChpdG1wID4gNikgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgRVBSSU5UKCJzbGljZV9hbHBoYV9jMF9vZmZzZXRfZGl2MiIpOwotICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFNsaWNlSGVhZGVyLT5zbGljZUFscGhhQzBPZmZzZXQgPSBpdG1wICogMjsKLQotICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsICZpdG1wKTsKLSAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICAgICAgaWYgKCAoaXRtcCA8IC02KSB8fCAoaXRtcCA+IDYpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIEVQUklOVCgic2xpY2VfYmV0YV9vZmZzZXRfZGl2MiIpOwotICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFNsaWNlSGVhZGVyLT5zbGljZUJldGFPZmZzZXQgPSBpdG1wICogMjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICggKHBQaWNQYXJhbVNldC0+bnVtU2xpY2VHcm91cHMgPiAxKSAmJgotICAgICAgICAgKHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cE1hcFR5cGUgPj0gMykgJiYKLSAgICAgICAgIChwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBNYXBUeXBlIDw9IDUpICkKLSAgICB7Ci0gICAgICAgIC8qIHNldCB0bXAgdG8gbnVtYmVyIG9mIGJpdHMgdXNlZCB0byByZXByZXNlbnQgc2xpY2VfZ3JvdXBfY2hhbmdlX2N5Y2xlCi0gICAgICAgICAqIGluIHRoZSBzdHJlYW0gKi8KLSAgICAgICAgdG1wID0gTnVtU2xpY2VHcm91cENoYW5nZUN5Y2xlQml0cyhwaWNTaXplSW5NYnMsCi0gICAgICAgICAgICBwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBDaGFuZ2VSYXRlKTsKLSAgICAgICAgdmFsdWUgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIHRtcCk7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwU2xpY2VIZWFkZXItPnNsaWNlR3JvdXBDaGFuZ2VDeWNsZSA9IHZhbHVlOwotCi0gICAgICAgIC8qIGNvcnJlc3BvbmRzIHRvIHRtcCA9IENlaWwocGljU2l6ZUluTWJzIC8gc2xpY2VHcm91cENoYW5nZVJhdGUpICovCi0gICAgICAgIHRtcCA9IChwaWNTaXplSW5NYnMgKyBwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBDaGFuZ2VSYXRlIC0gMSkgLwotICAgICAgICAgICAgICBwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBDaGFuZ2VSYXRlOwotICAgICAgICBpZiAocFNsaWNlSGVhZGVyLT5zbGljZUdyb3VwQ2hhbmdlQ3ljbGUgPiB0bXApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEVQUklOVCgic2xpY2VfZ3JvdXBfY2hhbmdlX2N5Y2xlIik7Ci0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IE51bVNsaWNlR3JvdXBDaGFuZ2VDeWNsZUJpdHMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRGV0ZXJtaW5lIG51bWJlciBvZiBiaXRzIG5lZWRlZCB0byByZXByZXNlbnQKLSAgICAgICAgICAgIHNsaWNlX2dyb3VwX2NoYW5nZV9jeWNsZSBpbiB0aGUgc3RyZWFtLiBUaGUgc3RhbmRhcmQgc3RhdGVzIHRoYXQKLSAgICAgICAgICAgIHNsaWNlX2dyb3VwX2NoYW5nZV9jeWNsZSBpcyByZXByZXNlbnRlZCBieQotICAgICAgICAgICAgICAgIENlaWwoIExvZzIoIChwaWNTaXplSW5NYnMgLyBzbGljZUdyb3VwQ2hhbmdlUmF0ZSkgKyAxKSApCi0KLSAgICAgICAgICAgIGJpdHMuIERpdmlzaW9uICIvIiBpbiB0aGUgZXF1YXRpb24gaXMgbm9uLXRydW5jYXRpbmcgZGl2aXNpb24uCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcGljU2l6ZUluTWJzICAgICAgICAgICAgcGljdHVyZSBzaXplIGluIG1hY3JvYmxvY2tzCi0gICAgICAgICAgICBzbGljZUdyb3VwQ2hhbmdlUmF0ZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBub25lCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIG51bWJlciBvZiBiaXRzIG5lZWRlZAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgTnVtU2xpY2VHcm91cENoYW5nZUN5Y2xlQml0cyh1MzIgcGljU2l6ZUluTWJzLCB1MzIgc2xpY2VHcm91cENoYW5nZVJhdGUpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcCxudW1CaXRzLG1hc2s7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwaWNTaXplSW5NYnMpOwotICAgIEFTU0VSVChzbGljZUdyb3VwQ2hhbmdlUmF0ZSk7Ci0gICAgQVNTRVJUKHNsaWNlR3JvdXBDaGFuZ2VSYXRlIDw9IHBpY1NpemVJbk1icyk7Ci0KLSAgICAvKiBjb21wdXRlIChwaWNTaXplSW5NYnMgLyBzbGljZUdyb3VwQ2hhbmdlUmF0ZSArIDEpLCByb3VuZGVkIHVwICovCi0gICAgaWYgKHBpY1NpemVJbk1icyAlIHNsaWNlR3JvdXBDaGFuZ2VSYXRlKQotICAgICAgICB0bXAgPSAyICsgcGljU2l6ZUluTWJzL3NsaWNlR3JvdXBDaGFuZ2VSYXRlOwotICAgIGVsc2UKLSAgICAgICAgdG1wID0gMSArIHBpY1NpemVJbk1icy9zbGljZUdyb3VwQ2hhbmdlUmF0ZTsKLQotICAgIG51bUJpdHMgPSAwOwotICAgIG1hc2sgPSB+MFU7Ci0KLSAgICAvKiBzZXQgbnVtQml0cyB0byBwb3NpdGlvbiBvZiByaWdodC1tb3N0IG5vbi16ZXJvIGJpdCAqLwotICAgIHdoaWxlICh0bXAgJiAobWFzazw8KytudW1CaXRzKSkKLSAgICAgICAgOwotICAgIG51bUJpdHMtLTsKLQotICAgIC8qIGFkZCBvbmUgbW9yZSBiaXQgaWYgdmFsdWUgZ3JlYXRlciB0aGFuIDJebnVtQml0cyAqLwotICAgIGlmICh0bXAgJiAoKDE8PG51bUJpdHMpLTEpKQotICAgICAgICBudW1CaXRzKys7Ci0KLSAgICByZXR1cm4obnVtQml0cyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBSZWZQaWNMaXN0UmVvcmRlcmluZwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBEZWNvZGUgcmVmZXJlbmNlIHBpY3R1cmUgbGlzdCByZW9yZGVyaW5nIHN5bnRheCBlbGVtZW50cyBmcm9tCi0gICAgICAgICAgICB0aGUgc3RyZWFtLiBNYXggbnVtYmVyIG9mIHJlb3JkZXJpbmcgY29tbWFuZHMgaXMgbnVtUmVmSWR4QWN0aXZlLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQotICAgICAgICAgICAgbnVtUmVmSWR4QWN0aXZlIG51bWJlciBvZiBhY3RpdmUgcmVmZXJlbmNlIGluZGljZXMgdG8gYmUgdXNlZCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IHNsaWNlCi0gICAgICAgICAgICBtYXhQaWNOdW0gICAgICAgbWF4RnJhbWVOdW0gZnJvbSB0aGUgYWN0aXZlIFNQUwotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBwUmVmUGljTGlzdFJlb3JkZXJpbmcgICBkZWNvZGVkIGRhdGEgaXMgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBpbnZhbGlkIHN0cmVhbSBkYXRhCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBSZWZQaWNMaXN0UmVvcmRlcmluZyhzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gICAgcmVmUGljTGlzdFJlb3JkZXJpbmdfdCAqcFJlZlBpY0xpc3RSZW9yZGVyaW5nLCB1MzIgbnVtUmVmSWR4QWN0aXZlLAotICAgIHUzMiBtYXhQaWNOdW0pCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcCwgdmFsdWUsIGk7Ci0gICAgdTMyIGNvbW1hbmQ7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwUmVmUGljTGlzdFJlb3JkZXJpbmcpOwotICAgIEFTU0VSVChudW1SZWZJZHhBY3RpdmUpOwotICAgIEFTU0VSVChtYXhQaWNOdW0pOwotCi0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgcFJlZlBpY0xpc3RSZW9yZGVyaW5nLT5yZWZQaWNMaXN0UmVvcmRlcmluZ0ZsYWdMMCA9IHRtcDsKLQotICAgIGlmIChwUmVmUGljTGlzdFJlb3JkZXJpbmctPnJlZlBpY0xpc3RSZW9yZGVyaW5nRmxhZ0wwKQotICAgIHsKLSAgICAgICAgaSA9IDA7Ci0KLSAgICAgICAgZG8KLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGkgPiBudW1SZWZJZHhBY3RpdmUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRVBSSU5UKCJUb28gbWFueSByZW9yZGVyaW5nIGNvbW1hbmRzIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmY29tbWFuZCk7Ci0gICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgICAgIGlmIChjb21tYW5kID4gMykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFUFJJTlQoInJlb3JkZXJpbmdfb2ZfcGljX251bXNfaWRjIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwUmVmUGljTGlzdFJlb3JkZXJpbmctPmNvbW1hbmRbaV0ucmVvcmRlcmluZ09mUGljTnVtc0lkYyA9IGNvbW1hbmQ7Ci0KLSAgICAgICAgICAgIGlmICgoY29tbWFuZCA9PSAwKSB8fCAoY29tbWFuZCA9PSAxKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOwotICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPj0gbWF4UGljTnVtKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRVBSSU5UKCJhYnNfZGlmZl9waWNfbnVtX21pbnVzMSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBSZWZQaWNMaXN0UmVvcmRlcmluZy0+Y29tbWFuZFtpXS5hYnNEaWZmUGljTnVtID0gdmFsdWUgKyAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGNvbW1hbmQgPT0gMikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOwotICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgICAgICAgICBwUmVmUGljTGlzdFJlb3JkZXJpbmctPmNvbW1hbmRbaV0ubG9uZ1Rlcm1QaWNOdW0gPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgIH0gd2hpbGUgKGNvbW1hbmQgIT0gMyk7Ci0KLSAgICAgICAgLyogdGhlcmUgc2hhbGwgYmUgYXQgbGVhc3Qgb25lIHJlb3JkZXJpbmcgY29tbWFuZCBpZgotICAgICAgICAgKiByZWZQaWNMaXN0UmVvcmRlcmluZ0ZsYWdMMCB3YXMgc2V0ICovCi0gICAgICAgIGlmIChpID09IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEVQUklOVCgicmVmX3BpY19saXN0X3Jlb3JkZXJpbmciKTsKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjUmVmUGljTWFya2luZwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBEZWNvZGUgZGVjb2RlZCByZWZlcmVuY2UgcGljdHVyZSBtYXJraW5nIHN5bnRheCBlbGVtZW50cyBmcm9tCi0gICAgICAgICAgICB0aGUgc3RyZWFtLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQotICAgICAgICAgICAgbmFsVW5pdFR5cGUgICAgIHR5cGUgb2YgdGhlIGN1cnJlbnQgTkFMIHVuaXQKLSAgICAgICAgICAgIG51bVJlZkZyYW1lcyAgICBtYXggbnVtYmVyIG9mIHJlZmVyZW5jZSBmcmFtZXMgZnJvbSB0aGUgYWN0aXZlIFNQUwotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBwRGVjUmVmUGljTWFya2luZyAgIGRlY29kZWQgZGF0YSBpcyBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcwotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGludmFsaWQgc3RyZWFtIGRhdGEKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIERlY1JlZlBpY01hcmtpbmcoc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICAgIGRlY1JlZlBpY01hcmtpbmdfdCAqcERlY1JlZlBpY01hcmtpbmcsIG5hbFVuaXRUeXBlX2UgbmFsVW5pdFR5cGUsCi0gICAgdTMyIG51bVJlZkZyYW1lcykKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wLCB2YWx1ZTsKLSAgICB1MzIgaTsKLSAgICB1MzIgb3BlcmF0aW9uOwotICAgIC8qIHZhcmlhYmxlcyBmb3IgZXJyb3IgY2hlY2tpbmcgcHVycG9zZXMsIHN0b3JlIG51bWJlciBvZiBtZW1vcnkKLSAgICAgKiBtYW5hZ2VtZW50IG9wZXJhdGlvbnMgb2YgY2VydGFpbiB0eXBlICovCi0gICAgdTMyIG51bTQgPSAwLCBudW01ID0gMCwgbnVtNiA9IDAsIG51bTF0bzMgPSAwOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoIG5hbFVuaXRUeXBlID09IE5BTF9DT0RFRF9TTElDRV9JRFIgfHwKLSAgICAgICAgICAgIG5hbFVuaXRUeXBlID09IE5BTF9DT0RFRF9TTElDRSB8fAotICAgICAgICAgICAgbmFsVW5pdFR5cGUgPT0gTkFMX1NFSSApOwotCi0KLSAgICBpZiAobmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFX0lEUikKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcERlY1JlZlBpY01hcmtpbmctPm5vT3V0cHV0T2ZQcmlvclBpY3NGbGFnID0gdG1wOwotCi0gICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcERlY1JlZlBpY01hcmtpbmctPmxvbmdUZXJtUmVmZXJlbmNlRmxhZyA9IHRtcDsKLSAgICAgICAgaWYgKCFudW1SZWZGcmFtZXMgJiYgcERlY1JlZlBpY01hcmtpbmctPmxvbmdUZXJtUmVmZXJlbmNlRmxhZykKLSAgICAgICAgewotICAgICAgICAgICAgRVBSSU5UKCJsb25nX3Rlcm1fcmVmZXJlbmNlX2ZsYWciKTsKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBEZWNSZWZQaWNNYXJraW5nLT5hZGFwdGl2ZVJlZlBpY01hcmtpbmdNb2RlRmxhZyA9IHRtcDsKLSAgICAgICAgaWYgKHBEZWNSZWZQaWNNYXJraW5nLT5hZGFwdGl2ZVJlZlBpY01hcmtpbmdNb2RlRmxhZykKLSAgICAgICAgewotICAgICAgICAgICAgaSA9IDA7Ci0gICAgICAgICAgICBkbwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIHNlZSBleHBsYW5hdGlvbiBvZiB0aGUgTUFYX05VTV9NTUNfT1BFUkFUSU9OUyBpbgotICAgICAgICAgICAgICAgICAqIHNsaWNlX2hlYWRlci5oICovCi0gICAgICAgICAgICAgICAgaWYgKGkgPiAoMiAqIG51bVJlZkZyYW1lcyArIDIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRVBSSU5UKCJUb28gbWFueSBtYW5hZ2VtZW50IG9wZXJhdGlvbnMiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZvcGVyYXRpb24pOwotICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgICAgICAgICBpZiAob3BlcmF0aW9uID4gNikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEVQUklOVCgibWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb24iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHBEZWNSZWZQaWNNYXJraW5nLT5vcGVyYXRpb25baV0uCi0gICAgICAgICAgICAgICAgICAgIG1lbW9yeU1hbmFnZW1lbnRDb250cm9sT3BlcmF0aW9uID0gb3BlcmF0aW9uOwotICAgICAgICAgICAgICAgIGlmICgob3BlcmF0aW9uID09IDEpIHx8IChvcGVyYXRpb24gPT0gMykpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICAgICAgICAgICAgICBwRGVjUmVmUGljTWFya2luZy0+b3BlcmF0aW9uW2ldLmRpZmZlcmVuY2VPZlBpY051bXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgKyAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAob3BlcmF0aW9uID09IDIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICAgICAgICAgICAgICBwRGVjUmVmUGljTWFya2luZy0+b3BlcmF0aW9uW2ldLmxvbmdUZXJtUGljTnVtID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgob3BlcmF0aW9uID09IDMpIHx8IChvcGVyYXRpb24gPT0gNikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICAgICAgICAgICAgICBwRGVjUmVmUGljTWFya2luZy0+b3BlcmF0aW9uW2ldLmxvbmdUZXJtRnJhbWVJZHggPQotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChvcGVyYXRpb24gPT0gNCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHZhbHVlIHNoYWxsIGJlIGluIHJhbmdlIFswLCBudW1SZWZGcmFtZXNdICovCi0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA+IG51bVJlZkZyYW1lcykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgRVBSSU5UKCJtYXhfbG9uZ190ZXJtX2ZyYW1lX2lkeF9wbHVzMSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRGVjUmVmUGljTWFya2luZy0+b3BlcmF0aW9uW2ldLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heExvbmdUZXJtRnJhbWVJZHggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PX0xPTkdfVEVSTV9GUkFNRV9JTkRJQ0VTOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcERlY1JlZlBpY01hcmtpbmctPm9wZXJhdGlvbltpXS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhMb25nVGVybUZyYW1lSWR4ID0gdmFsdWUgLSAxOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG51bTQrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbiA9PSA1KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbnVtNSsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAob3BlcmF0aW9uICYmIG9wZXJhdGlvbiA8PSAzKQotICAgICAgICAgICAgICAgICAgICBudW0xdG8zKys7Ci0gICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbiA9PSA2KQotICAgICAgICAgICAgICAgICAgICBudW02Kys7Ci0KLSAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICB9IHdoaWxlIChvcGVyYXRpb24gIT0gMCk7Ci0KLSAgICAgICAgICAgIC8qIGVycm9yIGNoZWNraW5nICovCi0gICAgICAgICAgICBpZiAobnVtNCA+IDEgfHwgbnVtNSA+IDEgfHwgbnVtNiA+IDEgfHwgKG51bTF0bzMgJiYgbnVtNSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uIG5hbWU6IGgyNjRic2RDaGVja1Bwc0lkCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIFBlZWsgdmFsdWUgb2YgcGljX3BhcmFtZXRlcl9zZXRfaWQgZnJvbSB0aGUgc2xpY2UgaGVhZGVyLiBGdW5jdGlvbgotICAgICAgICAgICAgZG9lcyBub3QgbW9kaWZ5IGN1cnJlbnQgc3RyZWFtIHBvc2l0aW9ucyBidXQgY29waWVzIHRoZSBzdHJlYW0KLSAgICAgICAgICAgIGRhdGEgc3RydWN0dXJlIHRvIHRtcCBzdHJ1Y3R1cmUgd2hpY2ggaXMgdXNlZCB3aGlsZSBhY2Nlc3NpbmcKLSAgICAgICAgICAgIHN0cmVhbSBkYXRhLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBwaWNQYXJhbVNldElkICAgdmFsdWUgaXMgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBpbnZhbGlkIHN0cmVhbSBkYXRhCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkQ2hlY2tQcHNJZChzdHJtRGF0YV90ICpwU3RybURhdGEsIHUzMiAqcGljUGFyYW1TZXRJZCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wLCB2YWx1ZTsKLSAgICBzdHJtRGF0YV90IHRtcFN0cm1EYXRhWzFdOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLQotICAgIC8qIGRvbid0IHRvdWNoIG9yaWdpbmFsIHN0cmVhbSBwb3NpdGlvbiBwYXJhbXMgKi8KLSAgICAqdG1wU3RybURhdGEgPSAqcFN0cm1EYXRhOwotCi0gICAgLyogZmlyc3RfbWJfaW5fc2xpY2UgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgLyogc2xpY2VfdHlwZSAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotICAgIGlmICh2YWx1ZSA+PSBNQVhfTlVNX1BJQ19QQVJBTV9TRVRTKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAqcGljUGFyYW1TZXRJZCA9IHZhbHVlOwotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkQ2hlY2tGcmFtZU51bQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBQZWVrIHZhbHVlIG9mIGZyYW1lX251bSBmcm9tIHRoZSBzbGljZSBoZWFkZXIuIEZ1bmN0aW9uIGRvZXMgbm90Ci0gICAgICAgICAgICBtb2RpZnkgY3VycmVudCBzdHJlYW0gcG9zaXRpb25zIGJ1dCBjb3BpZXMgdGhlIHN0cmVhbSBkYXRhCi0gICAgICAgICAgICBzdHJ1Y3R1cmUgdG8gdG1wIHN0cnVjdHVyZSB3aGljaCBpcyB1c2VkIHdoaWxlIGFjY2Vzc2luZyBzdHJlYW0KLSAgICAgICAgICAgIGRhdGEuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCi0gICAgICAgICAgICBtYXhGcmFtZU51bQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBmcmFtZU51bSAgICAgICAgdmFsdWUgaXMgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBpbnZhbGlkIHN0cmVhbSBkYXRhCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkQ2hlY2tGcmFtZU51bSgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICB1MzIgbWF4RnJhbWVOdW0sCi0gIHUzMiAqZnJhbWVOdW0pCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcCwgdmFsdWUsIGk7Ci0gICAgc3RybURhdGFfdCB0bXBTdHJtRGF0YVsxXTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKG1heEZyYW1lTnVtKTsKLSAgICBBU1NFUlQoZnJhbWVOdW0pOwotCi0gICAgLyogZG9uJ3QgdG91Y2ggb3JpZ2luYWwgc3RyZWFtIHBvc2l0aW9uIHBhcmFtcyAqLwotICAgICp0bXBTdHJtRGF0YSA9ICpwU3RybURhdGE7Ci0KLSAgICAvKiBza2lwIGZpcnN0X21iX2luX3NsaWNlICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLQotICAgIC8qIHNraXAgc2xpY2VfdHlwZSAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAvKiBza2lwIHBpY19wYXJhbWV0ZXJfc2V0X2lkICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLQotICAgIC8qIGxvZzIobWF4RnJhbWVOdW0pIC0+IG51bSBiaXRzIHRvIHJlcHJlc2VudCBmcmFtZV9udW0gKi8KLSAgICBpID0gMDsKLSAgICB3aGlsZSAobWF4RnJhbWVOdW0gPj4gaSkKLSAgICAgICAgaSsrOwotICAgIGktLTsKLQotICAgIC8qIGZyYW1lX251bSAqLwotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHRtcFN0cm1EYXRhLCBpKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAqZnJhbWVOdW0gPSB0bXA7Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RDaGVja0lkclBpY0lkCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIFBlZWsgdmFsdWUgb2YgaWRyX3BpY19pZCBmcm9tIHRoZSBzbGljZSBoZWFkZXIuIEZ1bmN0aW9uIGRvZXMgbm90Ci0gICAgICAgICAgICBtb2RpZnkgY3VycmVudCBzdHJlYW0gcG9zaXRpb25zIGJ1dCBjb3BpZXMgdGhlIHN0cmVhbSBkYXRhCi0gICAgICAgICAgICBzdHJ1Y3R1cmUgdG8gdG1wIHN0cnVjdHVyZSB3aGljaCBpcyB1c2VkIHdoaWxlIGFjY2Vzc2luZyBzdHJlYW0KLSAgICAgICAgICAgIGRhdGEuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCi0gICAgICAgICAgICBtYXhGcmFtZU51bSAgICAgbWF4IGZyYW1lIG51bWJlciBmcm9tIGFjdGl2ZSBTUFMKLSAgICAgICAgICAgIG5hbFVuaXRUeXBlICAgICB0eXBlIG9mIHRoZSBjdXJyZW50IE5BTCB1bml0Ci0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIGlkclBpY0lkICAgICAgICB2YWx1ZSBpcyBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcwotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGludmFsaWQgc3RyZWFtIGRhdGEKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RDaGVja0lkclBpY0lkKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHUzMiBtYXhGcmFtZU51bSwKLSAgbmFsVW5pdFR5cGVfZSBuYWxVbml0VHlwZSwKLSAgdTMyICppZHJQaWNJZCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wLCB2YWx1ZSwgaTsKLSAgICBzdHJtRGF0YV90IHRtcFN0cm1EYXRhWzFdOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQobWF4RnJhbWVOdW0pOwotICAgIEFTU0VSVChpZHJQaWNJZCk7Ci0KLSAgICAvKiBuYWxVbml0VHlwZSBtdXN0IGJlIGVxdWFsIHRvIDUgYmVjYXVzZSBvdGhlcndpc2UgaWRyUGljSWQgaXMgbm90Ci0gICAgICogcHJlc2VudCAqLwotICAgIGlmIChuYWxVbml0VHlwZSAhPSBOQUxfQ09ERURfU0xJQ0VfSURSKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAvKiBkb24ndCB0b3VjaCBvcmlnaW5hbCBzdHJlYW0gcG9zaXRpb24gcGFyYW1zICovCi0gICAgKnRtcFN0cm1EYXRhID0gKnBTdHJtRGF0YTsKLQotICAgIC8qIHNraXAgZmlyc3RfbWJfaW5fc2xpY2UgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgLyogc2tpcCBzbGljZV90eXBlICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLQotICAgIC8qIHNraXAgcGljX3BhcmFtZXRlcl9zZXRfaWQgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgLyogbG9nMihtYXhGcmFtZU51bSkgLT4gbnVtIGJpdHMgdG8gcmVwcmVzZW50IGZyYW1lX251bSAqLwotICAgIGkgPSAwOwotICAgIHdoaWxlIChtYXhGcmFtZU51bSA+PiBpKQotICAgICAgICBpKys7Ci0gICAgaS0tOwotCi0gICAgLyogc2tpcCBmcmFtZV9udW0gKi8KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyh0bXBTdHJtRGF0YSwgaSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAvKiBpZHJfcGljX2lkICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCBpZHJQaWNJZCk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkQ2hlY2tQaWNPcmRlckNudExzYgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBQZWVrIHZhbHVlIG9mIHBpY19vcmRlcl9jbnRfbHNiIGZyb20gdGhlIHNsaWNlIGhlYWRlci4gRnVuY3Rpb24KLSAgICAgICAgICAgIGRvZXMgbm90IG1vZGlmeSBjdXJyZW50IHN0cmVhbSBwb3NpdGlvbnMgYnV0IGNvcGllcyB0aGUgc3RyZWFtCi0gICAgICAgICAgICBkYXRhIHN0cnVjdHVyZSB0byB0bXAgc3RydWN0dXJlIHdoaWNoIGlzIHVzZWQgd2hpbGUgYWNjZXNzaW5nCi0gICAgICAgICAgICBzdHJlYW0gZGF0YS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKLSAgICAgICAgICAgIHBTZXFQYXJhbVNldCAgICBwb2ludGVyIHRvIGFjdGl2ZSBTUFMKLSAgICAgICAgICAgIG5hbFVuaXRUeXBlICAgICB0eXBlIG9mIHRoZSBjdXJyZW50IE5BTCB1bml0Ci0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIHBpY09yZGVyQ250THNiICB2YWx1ZSBpcyBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcwotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGludmFsaWQgc3RyZWFtIGRhdGEKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RDaGVja1BpY09yZGVyQ250THNiKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCwKLSAgbmFsVW5pdFR5cGVfZSBuYWxVbml0VHlwZSwKLSAgdTMyICpwaWNPcmRlckNudExzYikKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wLCB2YWx1ZSwgaTsKLSAgICBzdHJtRGF0YV90IHRtcFN0cm1EYXRhWzFdOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocFNlcVBhcmFtU2V0KTsKLSAgICBBU1NFUlQocGljT3JkZXJDbnRMc2IpOwotCi0gICAgLyogcGljT3JkZXJDbnRUeXBlIG11c3QgYmUgZXF1YWwgdG8gMCAqLwotICAgIEFTU0VSVChwU2VxUGFyYW1TZXQtPnBpY09yZGVyQ250VHlwZSA9PSAwKTsKLSAgICBBU1NFUlQocFNlcVBhcmFtU2V0LT5tYXhGcmFtZU51bSk7Ci0gICAgQVNTRVJUKHBTZXFQYXJhbVNldC0+bWF4UGljT3JkZXJDbnRMc2IpOwotCi0gICAgLyogZG9uJ3QgdG91Y2ggb3JpZ2luYWwgc3RyZWFtIHBvc2l0aW9uIHBhcmFtcyAqLwotICAgICp0bXBTdHJtRGF0YSA9ICpwU3RybURhdGE7Ci0KLSAgICAvKiBza2lwIGZpcnN0X21iX2luX3NsaWNlICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLQotICAgIC8qIHNraXAgc2xpY2VfdHlwZSAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAvKiBza2lwIHBpY19wYXJhbWV0ZXJfc2V0X2lkICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLQotICAgIC8qIGxvZzIobWF4RnJhbWVOdW0pIC0+IG51bSBiaXRzIHRvIHJlcHJlc2VudCBmcmFtZV9udW0gKi8KLSAgICBpID0gMDsKLSAgICB3aGlsZSAocFNlcVBhcmFtU2V0LT5tYXhGcmFtZU51bSA+PiBpKQotICAgICAgICBpKys7Ci0gICAgaS0tOwotCi0gICAgLyogc2tpcCBmcmFtZV9udW0gKi8KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyh0bXBTdHJtRGF0YSwgaSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAvKiBza2lwIGlkcl9waWNfaWQgd2hlbiBuZWNlc3NhcnkgKi8KLSAgICBpZiAobmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFX0lEUikKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICB9Ci0KLSAgICAvKiBsb2cyKG1heFBpY09yZGVyQ250THNiKSAtPiBudW0gYml0cyB0byByZXByZXNlbnQgcGljX29yZGVyX2NudF9sc2IgKi8KLSAgICBpID0gMDsKLSAgICB3aGlsZSAocFNlcVBhcmFtU2V0LT5tYXhQaWNPcmRlckNudExzYiA+PiBpKQotICAgICAgICBpKys7Ci0gICAgaS0tOwotCi0gICAgLyogcGljX29yZGVyX2NudF9sc2IgKi8KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyh0bXBTdHJtRGF0YSwgaSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgKnBpY09yZGVyQ250THNiID0gdG1wOwotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkQ2hlY2tEZWx0YVBpY09yZGVyQ250Qm90dG9tCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIFBlZWsgdmFsdWUgb2YgZGVsdGFfcGljX29yZGVyX2NudF9ib3R0b20gZnJvbSB0aGUgc2xpY2UgaGVhZGVyLgotICAgICAgICAgICAgRnVuY3Rpb24gZG9lcyBub3QgbW9kaWZ5IGN1cnJlbnQgc3RyZWFtIHBvc2l0aW9ucyBidXQgY29waWVzIHRoZQotICAgICAgICAgICAgc3RyZWFtIGRhdGEgc3RydWN0dXJlIHRvIHRtcCBzdHJ1Y3R1cmUgd2hpY2ggaXMgdXNlZCB3aGlsZQotICAgICAgICAgICAgYWNjZXNzaW5nIHN0cmVhbSBkYXRhLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQotICAgICAgICAgICAgcFNlcVBhcmFtU2V0ICAgIHBvaW50ZXIgdG8gYWN0aXZlIFNQUwotICAgICAgICAgICAgbmFsVW5pdFR5cGUgICAgIHR5cGUgb2YgdGhlIGN1cnJlbnQgTkFMIHVuaXQKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgZGVsdGFQaWNPcmRlckNudEJvdHRvbSAgdmFsdWUgaXMgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBpbnZhbGlkIHN0cmVhbSBkYXRhCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkQ2hlY2tEZWx0YVBpY09yZGVyQ250Qm90dG9tKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCwKLSAgbmFsVW5pdFR5cGVfZSBuYWxVbml0VHlwZSwKLSAgaTMyICpkZWx0YVBpY09yZGVyQ250Qm90dG9tKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXAsIHZhbHVlLCBpOwotICAgIHN0cm1EYXRhX3QgdG1wU3RybURhdGFbMV07Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwU2VxUGFyYW1TZXQpOwotICAgIEFTU0VSVChkZWx0YVBpY09yZGVyQ250Qm90dG9tKTsKLQotICAgIC8qIHBpY09yZGVyQ250VHlwZSBtdXN0IGJlIGVxdWFsIHRvIDAgYW5kIHBpY09yZGVyUHJlc2VudEZsYWcgbXVzdCBiZSBUUlVFCi0gICAgICogKi8KLSAgICBBU1NFUlQocFNlcVBhcmFtU2V0LT5waWNPcmRlckNudFR5cGUgPT0gMCk7Ci0gICAgQVNTRVJUKHBTZXFQYXJhbVNldC0+bWF4RnJhbWVOdW0pOwotICAgIEFTU0VSVChwU2VxUGFyYW1TZXQtPm1heFBpY09yZGVyQ250THNiKTsKLQotICAgIC8qIGRvbid0IHRvdWNoIG9yaWdpbmFsIHN0cmVhbSBwb3NpdGlvbiBwYXJhbXMgKi8KLSAgICAqdG1wU3RybURhdGEgPSAqcFN0cm1EYXRhOwotCi0gICAgLyogc2tpcCBmaXJzdF9tYl9pbl9zbGljZSAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAvKiBza2lwIHNsaWNlX3R5cGUgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgLyogc2tpcCBwaWNfcGFyYW1ldGVyX3NldF9pZCAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAvKiBsb2cyKG1heEZyYW1lTnVtKSAtPiBudW0gYml0cyB0byByZXByZXNlbnQgZnJhbWVfbnVtICovCi0gICAgaSA9IDA7Ci0gICAgd2hpbGUgKHBTZXFQYXJhbVNldC0+bWF4RnJhbWVOdW0gPj4gaSkKLSAgICAgICAgaSsrOwotICAgIGktLTsKLQotICAgIC8qIHNraXAgZnJhbWVfbnVtICovCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHModG1wU3RybURhdGEsIGkpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgLyogc2tpcCBpZHJfcGljX2lkIHdoZW4gbmVjZXNzYXJ5ICovCi0gICAgaWYgKG5hbFVuaXRUeXBlID09IE5BTF9DT0RFRF9TTElDRV9JRFIpCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgfQotCi0gICAgLyogbG9nMihtYXhQaWNPcmRlckNudExzYikgLT4gbnVtIGJpdHMgdG8gcmVwcmVzZW50IHBpY19vcmRlcl9jbnRfbHNiICovCi0gICAgaSA9IDA7Ci0gICAgd2hpbGUgKHBTZXFQYXJhbVNldC0+bWF4UGljT3JkZXJDbnRMc2IgPj4gaSkKLSAgICAgICAgaSsrOwotICAgIGktLTsKLQotICAgIC8qIHNraXAgcGljX29yZGVyX2NudF9sc2IgKi8KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyh0bXBTdHJtRGF0YSwgaSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAvKiBkZWx0YV9waWNfb3JkZXJfY250X2JvdHRvbSAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQodG1wU3RybURhdGEsIGRlbHRhUGljT3JkZXJDbnRCb3R0b20pOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZENoZWNrRGVsdGFQaWNPcmRlckNudAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBQZWVrIHZhbHVlcyBkZWx0YV9waWNfb3JkZXJfY250WzBdIGFuZCBkZWx0YV9waWNfb3JkZXJfY250WzFdCi0gICAgICAgICAgICBmcm9tIHRoZSBzbGljZSBoZWFkZXIuIEZ1bmN0aW9uIGRvZXMgbm90IG1vZGlmeSBjdXJyZW50IHN0cmVhbQotICAgICAgICAgICAgcG9zaXRpb25zIGJ1dCBjb3BpZXMgdGhlIHN0cmVhbSBkYXRhIHN0cnVjdHVyZSB0byB0bXAgc3RydWN0dXJlCi0gICAgICAgICAgICB3aGljaCBpcyB1c2VkIHdoaWxlIGFjY2Vzc2luZyBzdHJlYW0gZGF0YS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RybURhdGEgICAgICAgICAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQotICAgICAgICAgICAgcFNlcVBhcmFtU2V0ICAgICAgICAgICAgcG9pbnRlciB0byBhY3RpdmUgU1BTCi0gICAgICAgICAgICBuYWxVbml0VHlwZSAgICAgICAgICAgICB0eXBlIG9mIHRoZSBjdXJyZW50IE5BTCB1bml0Ci0gICAgICAgICAgICBwaWNPcmRlclByZXNlbnRGbGFnICAgICBmbGFnIGluZGljYXRpbmcgaWYgZGVsdGFfcGljX29yZGVyX2NudFsxXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgcHJlc2VudCBpbiB0aGUgc3RyZWFtCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIGRlbHRhUGljT3JkZXJDbnQgICAgICAgIHZhbHVlcyBhcmUgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgICAgICAgICAgc3VjY2VzcwotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgICAgICAgICAgaW52YWxpZCBzdHJlYW0gZGF0YQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZENoZWNrRGVsdGFQaWNPcmRlckNudCgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZXFQYXJhbVNldF90ICpwU2VxUGFyYW1TZXQsCi0gIG5hbFVuaXRUeXBlX2UgbmFsVW5pdFR5cGUsCi0gIHUzMiBwaWNPcmRlclByZXNlbnRGbGFnLAotICBpMzIgKmRlbHRhUGljT3JkZXJDbnQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcCwgdmFsdWUsIGk7Ci0gICAgc3RybURhdGFfdCB0bXBTdHJtRGF0YVsxXTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBTZXFQYXJhbVNldCk7Ci0gICAgQVNTRVJUKGRlbHRhUGljT3JkZXJDbnQpOwotCi0gICAgLyogcGljT3JkZXJDbnRUeXBlIG11c3QgYmUgZXF1YWwgdG8gMSBhbmQgZGVsdGFQaWNPcmRlckFsd2F5c1plcm9GbGFnIG11c3QKLSAgICAgKiBiZSBGQUxTRSAqLwotICAgIEFTU0VSVChwU2VxUGFyYW1TZXQtPnBpY09yZGVyQ250VHlwZSA9PSAxKTsKLSAgICBBU1NFUlQoIXBTZXFQYXJhbVNldC0+ZGVsdGFQaWNPcmRlckFsd2F5c1plcm9GbGFnKTsKLSAgICBBU1NFUlQocFNlcVBhcmFtU2V0LT5tYXhGcmFtZU51bSk7Ci0KLSAgICAvKiBkb24ndCB0b3VjaCBvcmlnaW5hbCBzdHJlYW0gcG9zaXRpb24gcGFyYW1zICovCi0gICAgKnRtcFN0cm1EYXRhID0gKnBTdHJtRGF0YTsKLQotICAgIC8qIHNraXAgZmlyc3RfbWJfaW5fc2xpY2UgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgLyogc2tpcCBzbGljZV90eXBlICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLQotICAgIC8qIHNraXAgcGljX3BhcmFtZXRlcl9zZXRfaWQgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgLyogbG9nMihtYXhGcmFtZU51bSkgLT4gbnVtIGJpdHMgdG8gcmVwcmVzZW50IGZyYW1lX251bSAqLwotICAgIGkgPSAwOwotICAgIHdoaWxlIChwU2VxUGFyYW1TZXQtPm1heEZyYW1lTnVtID4+IGkpCi0gICAgICAgIGkrKzsKLSAgICBpLS07Ci0KLSAgICAvKiBza2lwIGZyYW1lX251bSAqLwotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHRtcFN0cm1EYXRhLCBpKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIC8qIHNraXAgaWRyX3BpY19pZCB3aGVuIG5lY2Vzc2FyeSAqLwotICAgIGlmIChuYWxVbml0VHlwZSA9PSBOQUxfQ09ERURfU0xJQ0VfSURSKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgIH0KLQotICAgIC8qIGRlbHRhX3BpY19vcmRlcl9jbnRbMF0gKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHRtcFN0cm1EYXRhLCAmZGVsdGFQaWNPcmRlckNudFswXSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgLyogZGVsdGFfcGljX29yZGVyX2NudFsxXSBpZiBwcmVzZW50ICovCi0gICAgaWYgKHBpY09yZGVyUHJlc2VudEZsYWcpCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHRtcFN0cm1EYXRhLCAmZGVsdGFQaWNPcmRlckNudFsxXSk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkQ2hlY2tSZWR1bmRhbnRQaWNDbnQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgUGVlayB2YWx1ZSBvZiByZWR1bmRhbnRfcGljX2NudCBmcm9tIHRoZSBzbGljZSBoZWFkZXIuIEZ1bmN0aW9uCi0gICAgICAgICAgICBkb2VzIG5vdCBtb2RpZnkgY3VycmVudCBzdHJlYW0gcG9zaXRpb25zIGJ1dCBjb3BpZXMgdGhlIHN0cmVhbQotICAgICAgICAgICAgZGF0YSBzdHJ1Y3R1cmUgdG8gdG1wIHN0cnVjdHVyZSB3aGljaCBpcyB1c2VkIHdoaWxlIGFjY2Vzc2luZwotICAgICAgICAgICAgc3RyZWFtIGRhdGEuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCi0gICAgICAgICAgICBwU2VxUGFyYW1TZXQgICAgcG9pbnRlciB0byBhY3RpdmUgU1BTCi0gICAgICAgICAgICBwUGljUGFyYW1TZXQgICAgcG9pbnRlciB0byBhY3RpdmUgUFBTCi0gICAgICAgICAgICBuYWxVbml0VHlwZSAgICAgdHlwZSBvZiB0aGUgY3VycmVudCBOQUwgdW5pdAotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICByZWR1bmRhbnRQaWNDbnQgdmFsdWUgaXMgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBpbnZhbGlkIHN0cmVhbSBkYXRhCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkQ2hlY2tSZWR1bmRhbnRQaWNDbnQoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VxUGFyYW1TZXRfdCAqcFNlcVBhcmFtU2V0LAotICBwaWNQYXJhbVNldF90ICpwUGljUGFyYW1TZXQsCi0gIG5hbFVuaXRUeXBlX2UgbmFsVW5pdFR5cGUsCi0gIHUzMiAqcmVkdW5kYW50UGljQ250KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXAsIHZhbHVlLCBpOwotICAgIGkzMiBpdmFsdWU7Ci0gICAgc3RybURhdGFfdCB0bXBTdHJtRGF0YVsxXTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBTZXFQYXJhbVNldCk7Ci0gICAgQVNTRVJUKHBQaWNQYXJhbVNldCk7Ci0gICAgQVNTRVJUKHJlZHVuZGFudFBpY0NudCk7Ci0KLSAgICAvKiByZWR1bmRhbnRfcGljX2NudF9mbGFnIG11c3QgYmUgVFJVRSAqLwotICAgIEFTU0VSVChwUGljUGFyYW1TZXQtPnJlZHVuZGFudFBpY0NudFByZXNlbnRGbGFnKTsKLSAgICBBU1NFUlQocFNlcVBhcmFtU2V0LT5tYXhGcmFtZU51bSk7Ci0gICAgQVNTRVJUKHBTZXFQYXJhbVNldC0+cGljT3JkZXJDbnRUeXBlID4gMCB8fAotICAgICAgICAgICBwU2VxUGFyYW1TZXQtPm1heFBpY09yZGVyQ250THNiKTsKLQotICAgIC8qIGRvbid0IHRvdWNoIG9yaWdpbmFsIHN0cmVhbSBwb3NpdGlvbiBwYXJhbXMgKi8KLSAgICAqdG1wU3RybURhdGEgPSAqcFN0cm1EYXRhOwotCi0gICAgLyogc2tpcCBmaXJzdF9tYl9pbl9zbGljZSAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAvKiBza2lwIHNsaWNlX3R5cGUgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgLyogc2tpcCBwaWNfcGFyYW1ldGVyX3NldF9pZCAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAvKiBsb2cyKG1heEZyYW1lTnVtKSAtPiBudW0gYml0cyB0byByZXByZXNlbnQgZnJhbWVfbnVtICovCi0gICAgaSA9IDA7Ci0gICAgd2hpbGUgKHBTZXFQYXJhbVNldC0+bWF4RnJhbWVOdW0gPj4gaSkKLSAgICAgICAgaSsrOwotICAgIGktLTsKLQotICAgIC8qIHNraXAgZnJhbWVfbnVtICovCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHModG1wU3RybURhdGEsIGkpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgLyogc2tpcCBpZHJfcGljX2lkIHdoZW4gbmVjZXNzYXJ5ICovCi0gICAgaWYgKG5hbFVuaXRUeXBlID09IE5BTF9DT0RFRF9TTElDRV9JRFIpCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgfQotCi0gICAgaWYgKHBTZXFQYXJhbVNldC0+cGljT3JkZXJDbnRUeXBlID09IDApCi0gICAgewotICAgICAgICAvKiBsb2cyKG1heFBpY09yZGVyQ250THNiKSAtPiBudW0gYml0cyB0byByZXByZXNlbnQgcGljX29yZGVyX2NudF9sc2IgKi8KLSAgICAgICAgaSA9IDA7Ci0gICAgICAgIHdoaWxlIChwU2VxUGFyYW1TZXQtPm1heFBpY09yZGVyQ250THNiID4+IGkpCi0gICAgICAgICAgICBpKys7Ci0gICAgICAgIGktLTsKLQotICAgICAgICAvKiBwaWNfb3JkZXJfY250X2xzYiAqLwotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyh0bXBTdHJtRGF0YSwgaSk7Ci0gICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgICAgICBpZiAocFBpY1BhcmFtU2V0LT5waWNPcmRlclByZXNlbnRGbGFnKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBza2lwIGRlbHRhX3BpY19vcmRlcl9jbnRfYm90dG9tICovCi0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHRtcFN0cm1EYXRhLCAmaXZhbHVlKTsKLSAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHBTZXFQYXJhbVNldC0+cGljT3JkZXJDbnRUeXBlID09IDEgJiYKLSAgICAgICFwU2VxUGFyYW1TZXQtPmRlbHRhUGljT3JkZXJBbHdheXNaZXJvRmxhZykKLSAgICB7Ci0gICAgICAgIC8qIGRlbHRhX3BpY19vcmRlcl9jbnRbMF0gKi8KLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZCh0bXBTdHJtRGF0YSwgJml2YWx1ZSk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAgICAgLyogZGVsdGFfcGljX29yZGVyX2NudFsxXSBpZiBwcmVzZW50ICovCi0gICAgICAgIGlmIChwUGljUGFyYW1TZXQtPnBpY09yZGVyUHJlc2VudEZsYWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQodG1wU3RybURhdGEsICZpdmFsdWUpOwotICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiByZWR1bmRhbnRfcGljX2NudCAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgcmVkdW5kYW50UGljQ250KTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZENoZWNrUHJpb3JQaWNzRmxhZwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBQZWVrIHZhbHVlIG9mIG5vX291dHB1dF9vZl9wcmlvcl9waWNzX2ZsYWcgZnJvbSB0aGUgc2xpY2UgaGVhZGVyLgotICAgICAgICAgICAgRnVuY3Rpb24gZG9lcyBub3QgbW9kaWZ5IGN1cnJlbnQgc3RyZWFtIHBvc2l0aW9ucyBidXQgY29waWVzCi0gICAgICAgICAgICB0aGUgc3RyZWFtIGRhdGEgc3RydWN0dXJlIHRvIHRtcCBzdHJ1Y3R1cmUgd2hpY2ggaXMgdXNlZCB3aGlsZQotICAgICAgICAgICAgYWNjZXNzaW5nIHN0cmVhbSBkYXRhLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQotICAgICAgICAgICAgcFNlcVBhcmFtU2V0ICAgIHBvaW50ZXIgdG8gYWN0aXZlIFNQUwotICAgICAgICAgICAgcFBpY1BhcmFtU2V0ICAgIHBvaW50ZXIgdG8gYWN0aXZlIFBQUwotICAgICAgICAgICAgbmFsVW5pdFR5cGUgICAgIHR5cGUgb2YgdGhlIGN1cnJlbnQgTkFMIHVuaXQKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgbm9PdXRwdXRPZlByaW9yUGljc0ZsYWcgdmFsdWUgaXMgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBpbnZhbGlkIHN0cmVhbSBkYXRhCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKmxpbnQgLWU3MTUgZGlzYWJsZSBsaW50IGluZm8gbmFsVW5pdFR5cGUgbm90IHJlZmVyZW5jZWQgKi8KLXUzMiBoMjY0YnNkQ2hlY2tQcmlvclBpY3NGbGFnKHUzMiAqIG5vT3V0cHV0T2ZQcmlvclBpY3NGbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RybURhdGFfdCAqIHBTdHJtRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlcVBhcmFtU2V0X3QgKiBwU2VxUGFyYW1TZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwaWNQYXJhbVNldF90ICogcFBpY1BhcmFtU2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFsVW5pdFR5cGVfZSBuYWxVbml0VHlwZSkKLXsKLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcCwgdmFsdWUsIGk7Ci0gICAgaTMyIGl2YWx1ZTsKLSAgICBzdHJtRGF0YV90IHRtcFN0cm1EYXRhWzFdOwotICAgIFVOVVNFRChuYWxVbml0VHlwZSk7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwU2VxUGFyYW1TZXQpOwotICAgIEFTU0VSVChwUGljUGFyYW1TZXQpOwotICAgIEFTU0VSVChub091dHB1dE9mUHJpb3JQaWNzRmxhZyk7Ci0KLSAgICAvKiBtdXN0IGJlIElEUiBsc2ljZSAqLwotICAgIEFTU0VSVChuYWxVbml0VHlwZSA9PSBOQUxfQ09ERURfU0xJQ0VfSURSKTsKLQotICAgIC8qIGRvbid0IHRvdWNoIG9yaWdpbmFsIHN0cmVhbSBwb3NpdGlvbiBwYXJhbXMgKi8KLSAgICAqdG1wU3RybURhdGEgPSAqcFN0cm1EYXRhOwotCi0gICAgLyogc2tpcCBmaXJzdF9tYl9pbl9zbGljZSAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICBpZih0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4gKHRtcCk7Ci0KLSAgICAvKiBzbGljZV90eXBlICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybiAodG1wKTsKLQotICAgIC8qIHNraXAgcGljX3BhcmFtZXRlcl9zZXRfaWQgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuICh0bXApOwotCi0gICAgLyogbG9nMihtYXhGcmFtZU51bSkgLT4gbnVtIGJpdHMgdG8gcmVwcmVzZW50IGZyYW1lX251bSAqLwotICAgIGkgPSAwOwotICAgIHdoaWxlKHBTZXFQYXJhbVNldC0+bWF4RnJhbWVOdW0gPj4gaSkKLSAgICAgICAgaSsrOwotICAgIGktLTsKLQotICAgIC8qIHNraXAgZnJhbWVfbnVtICovCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHModG1wU3RybURhdGEsIGkpOwotICAgIGlmKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4gKEhBTlRST19OT0spOwotCi0gICAgLyogc2tpcCBpZHJfcGljX2lkICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybiAodG1wKTsKLQotICAgIGlmKHBTZXFQYXJhbVNldC0+cGljT3JkZXJDbnRUeXBlID09IDApCi0gICAgewotICAgICAgICAvKiBsb2cyKG1heFBpY09yZGVyQ250THNiKSAtPiBudW0gYml0cyB0byByZXByZXNlbnQgcGljX29yZGVyX2NudF9sc2IgKi8KLSAgICAgICAgaSA9IDA7Ci0gICAgICAgIHdoaWxlKHBTZXFQYXJhbVNldC0+bWF4UGljT3JkZXJDbnRMc2IgPj4gaSkKLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgaS0tOwotCi0gICAgICAgIC8qIHNraXAgcGljX29yZGVyX2NudF9sc2IgKi8KLSAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHModG1wU3RybURhdGEsIGkpOwotICAgICAgICBpZih0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybiAoSEFOVFJPX05PSyk7Ci0KLSAgICAgICAgaWYocFBpY1BhcmFtU2V0LT5waWNPcmRlclByZXNlbnRGbGFnKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBza2lwIGRlbHRhX3BpY19vcmRlcl9jbnRfYm90dG9tICovCi0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHRtcFN0cm1EYXRhLCAmaXZhbHVlKTsKLSAgICAgICAgICAgIGlmKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuICh0bXApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYocFNlcVBhcmFtU2V0LT5waWNPcmRlckNudFR5cGUgPT0gMSAmJgotICAgICAgICFwU2VxUGFyYW1TZXQtPmRlbHRhUGljT3JkZXJBbHdheXNaZXJvRmxhZykKLSAgICB7Ci0gICAgICAgIC8qIHNraXAgZGVsdGFfcGljX29yZGVyX2NudFswXSAqLwotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHRtcFN0cm1EYXRhLCAmaXZhbHVlKTsKLSAgICAgICAgaWYodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybiAodG1wKTsKLQotICAgICAgICAvKiBza2lwIGRlbHRhX3BpY19vcmRlcl9jbnRbMV0gaWYgcHJlc2VudCAqLwotICAgICAgICBpZihwUGljUGFyYW1TZXQtPnBpY09yZGVyUHJlc2VudEZsYWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQodG1wU3RybURhdGEsICZpdmFsdWUpOwotICAgICAgICAgICAgaWYodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4gKHRtcCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBza2lwIHJlZHVuZGFudF9waWNfY250ICovCi0gICAgaWYocFBpY1BhcmFtU2V0LT5yZWR1bmRhbnRQaWNDbnRQcmVzZW50RmxhZykKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICAgICAgaWYodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybiAodG1wKTsKLSAgICB9Ci0KLSAgICAqbm9PdXRwdXRPZlByaW9yUGljc0ZsYWcgPSBoMjY0YnNkR2V0Qml0cyh0bXBTdHJtRGF0YSwgMSk7Ci0gICAgaWYoKm5vT3V0cHV0T2ZQcmlvclBpY3NGbGFnID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybiAoSEFOVFJPX05PSyk7Ci0KLSAgICByZXR1cm4gKEhBTlRST19PSyk7Ci0KLX0KLS8qbGludCArZTcxNSAqLwotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9oZWFkZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9oZWFkZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk4ODk4YS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfaGVhZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLSAgICAzLiBEYXRhIHR5cGVzCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIEgyNjRTV0RFQ19TTElDRV9IRUFERVJfSAotI2RlZmluZSBIMjY0U1dERUNfU0xJQ0VfSEVBREVSX0gKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9jZmcuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3NlcV9wYXJhbV9zZXQuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3BpY19wYXJhbV9zZXQuaCIKLSNpbmNsdWRlICJoMjY0YnNkX25hbF91bml0LmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWVudW0gewotICAgIFBfU0xJQ0UgPSAwLAotICAgIElfU0xJQ0UgPSAyCi19OwotCi1lbnVtIHtOT19MT05HX1RFUk1fRlJBTUVfSU5ESUNFUyA9IDB4RkZGRn07Ci0KLS8qIG1hY3JvIHRvIGRldGVybWluZSBpZiBzbGljZSBpcyBhbiBpbnRlciBzbGljZSwgc2xpY2VUeXBlcyAwIGFuZCA1ICovCi0jZGVmaW5lIElTX1BfU0xJQ0Uoc2xpY2VUeXBlKSAoKChzbGljZVR5cGUpID09IFBfU0xJQ0UpIHx8IFwKLSAgICAoKHNsaWNlVHlwZSkgPT0gUF9TTElDRSArIDUpKQotCi0vKiBtYWNybyB0byBkZXRlcm1pbmUgaWYgc2xpY2UgaXMgYW4gaW50cmEgc2xpY2UsIHNsaWNlVHlwZXMgMiBhbmQgNyAqLwotI2RlZmluZSBJU19JX1NMSUNFKHNsaWNlVHlwZSkgKCgoc2xpY2VUeXBlKSA9PSBJX1NMSUNFKSB8fCBcCi0gICAgKChzbGljZVR5cGUpID09IElfU0xJQ0UgKyA1KSkKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBEYXRhIHR5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBzdHJ1Y3R1cmUgdG8gc3RvcmUgZGF0YSBvZiBvbmUgcmVmZXJlbmNlIHBpY3R1cmUgbGlzdCByZW9yZGVyaW5nIG9wZXJhdGlvbiAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1MzIgcmVvcmRlcmluZ09mUGljTnVtc0lkYzsKLSAgICB1MzIgYWJzRGlmZlBpY051bTsKLSAgICB1MzIgbG9uZ1Rlcm1QaWNOdW07Ci19IHJlZlBpY0xpc3RSZW9yZGVyaW5nT3BlcmF0aW9uX3Q7Ci0KLS8qIHN0cnVjdHVyZSB0byBzdG9yZSByZWZlcmVuY2UgcGljdHVyZSBsaXN0IHJlb3JkZXJpbmcgb3BlcmF0aW9ucyAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1MzIgcmVmUGljTGlzdFJlb3JkZXJpbmdGbGFnTDA7Ci0gICAgcmVmUGljTGlzdFJlb3JkZXJpbmdPcGVyYXRpb25fdCBjb21tYW5kW01BWF9OVU1fUkVGX1BJQ1MrMV07Ci19IHJlZlBpY0xpc3RSZW9yZGVyaW5nX3Q7Ci0KLS8qIHN0cnVjdHVyZSB0byBzdG9yZSBkYXRhIG9mIG9uZSBEUEIgbWVtb3J5IG1hbmFnZW1lbnQgY29udHJvbCBvcGVyYXRpb24gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTMyIG1lbW9yeU1hbmFnZW1lbnRDb250cm9sT3BlcmF0aW9uOwotICAgIHUzMiBkaWZmZXJlbmNlT2ZQaWNOdW1zOwotICAgIHUzMiBsb25nVGVybVBpY051bTsKLSAgICB1MzIgbG9uZ1Rlcm1GcmFtZUlkeDsKLSAgICB1MzIgbWF4TG9uZ1Rlcm1GcmFtZUlkeDsKLX0gbWVtb3J5TWFuYWdlbWVudE9wZXJhdGlvbl90OwotCi0vKiB3b3JzdCBjYXNlIHNjZW5hcmlvOiBhbGwgTUFYX05VTV9SRUZfUElDUyBwaWN0dXJlcyBpbiB0aGUgYnVmZmVyIGFyZQotICogc2hvcnQgdGVybSBwaWN0dXJlcywgZWFjaCBvbmUgb2YgdGhlbSBpcyBmaXJzdCBtYXJrZWQgYXMgbG9uZyB0ZXJtCi0gKiByZWZlcmVuY2UgcGljdHVyZSB3aGljaCBpcyB0aGVuIG1hcmtlZCBhcyB1bnVzZWQgZm9yIHJlZmVyZW5jZS4KLSAqIEFkZGl0aW9uYWxseSwgbWF4IGxvbmctdGVybSBmcmFtZSBpbmRleCBpcyBzZXQgYW5kIGN1cnJlbnQgcGljdHVyZSBpcwotICogbWFya2VkIGFzIGxvbmcgdGVybSByZWZlcmVuY2UgcGljdHVyZS4gTGFzdCBwb3NpdGlvbiByZXNlcnZlZCBmb3IKLSAqIGVuZCBtZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbiBjb21tYW5kICovCi0jZGVmaW5lIE1BWF9OVU1fTU1DX09QRVJBVElPTlMgKDIqTUFYX05VTV9SRUZfUElDUysyKzEpCi0KLS8qIHN0cnVjdHVyZSB0byBzdG9yZSBkZWNvZGVkIHJlZmVyZW5jZSBwaWN0dXJlIG1hcmtpbmcgZGF0YSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1MzIgbm9PdXRwdXRPZlByaW9yUGljc0ZsYWc7Ci0gICAgdTMyIGxvbmdUZXJtUmVmZXJlbmNlRmxhZzsKLSAgICB1MzIgYWRhcHRpdmVSZWZQaWNNYXJraW5nTW9kZUZsYWc7Ci0gICAgbWVtb3J5TWFuYWdlbWVudE9wZXJhdGlvbl90IG9wZXJhdGlvbltNQVhfTlVNX01NQ19PUEVSQVRJT05TXTsKLX0gZGVjUmVmUGljTWFya2luZ190OwotCi0vKiBzdHJ1Y3R1cmUgdG8gc3RvcmUgc2xpY2UgaGVhZGVyIGRhdGEgZGVjb2RlZCBmcm9tIHRoZSBzdHJlYW0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTMyIGZpcnN0TWJJblNsaWNlOwotICAgIHUzMiBzbGljZVR5cGU7Ci0gICAgdTMyIHBpY1BhcmFtZXRlclNldElkOwotICAgIHUzMiBmcmFtZU51bTsKLSAgICB1MzIgaWRyUGljSWQ7Ci0gICAgdTMyIHBpY09yZGVyQ250THNiOwotICAgIGkzMiBkZWx0YVBpY09yZGVyQ250Qm90dG9tOwotICAgIGkzMiBkZWx0YVBpY09yZGVyQ250WzJdOwotICAgIHUzMiByZWR1bmRhbnRQaWNDbnQ7Ci0gICAgdTMyIG51bVJlZklkeEFjdGl2ZU92ZXJyaWRlRmxhZzsKLSAgICB1MzIgbnVtUmVmSWR4TDBBY3RpdmU7Ci0gICAgaTMyIHNsaWNlUXBEZWx0YTsKLSAgICB1MzIgZGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJZGM7Ci0gICAgaTMyIHNsaWNlQWxwaGFDME9mZnNldDsKLSAgICBpMzIgc2xpY2VCZXRhT2Zmc2V0OwotICAgIHUzMiBzbGljZUdyb3VwQ2hhbmdlQ3ljbGU7Ci0gICAgcmVmUGljTGlzdFJlb3JkZXJpbmdfdCByZWZQaWNMaXN0UmVvcmRlcmluZzsKLSAgICBkZWNSZWZQaWNNYXJraW5nX3QgZGVjUmVmUGljTWFya2luZzsKLX0gc2xpY2VIZWFkZXJfdDsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZERlY29kZVNsaWNlSGVhZGVyKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2xpY2VIZWFkZXJfdCAqcFNsaWNlSGVhZGVyLAotICBzZXFQYXJhbVNldF90ICpwU2VxUGFyYW1TZXQsCi0gIHBpY1BhcmFtU2V0X3QgKnBQaWNQYXJhbVNldCwKLSAgbmFsVW5pdF90ICpwTmFsVW5pdCk7Ci0KLXUzMiBoMjY0YnNkQ2hlY2tQcHNJZChzdHJtRGF0YV90ICpwU3RybURhdGEsIHUzMiAqcHBzSWQpOwotCi11MzIgaDI2NGJzZENoZWNrRnJhbWVOdW0oCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgdTMyIG1heEZyYW1lTnVtLAotICB1MzIgKmZyYW1lTnVtKTsKLQotdTMyIGgyNjRic2RDaGVja0lkclBpY0lkKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHUzMiBtYXhGcmFtZU51bSwKLSAgbmFsVW5pdFR5cGVfZSBuYWxVbml0VHlwZSwKLSAgdTMyICppZHJQaWNJZCk7Ci0KLXUzMiBoMjY0YnNkQ2hlY2tQaWNPcmRlckNudExzYigKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZXFQYXJhbVNldF90ICpwU2VxUGFyYW1TZXQsCi0gIG5hbFVuaXRUeXBlX2UgbmFsVW5pdFR5cGUsCi0gIHUzMiAqcGljT3JkZXJDbnRMc2IpOwotCi11MzIgaDI2NGJzZENoZWNrRGVsdGFQaWNPcmRlckNudEJvdHRvbSgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZXFQYXJhbVNldF90ICpwU2VxUGFyYW1TZXQsCi0gIG5hbFVuaXRUeXBlX2UgbmFsVW5pdFR5cGUsCi0gIGkzMiAqZGVsdGFQaWNPcmRlckNudEJvdHRvbSk7Ci0KLXUzMiBoMjY0YnNkQ2hlY2tEZWx0YVBpY09yZGVyQ250KAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCwKLSAgbmFsVW5pdFR5cGVfZSBuYWxVbml0VHlwZSwKLSAgdTMyIHBpY09yZGVyUHJlc2VudEZsYWcsCi0gIGkzMiAqZGVsdGFQaWNPcmRlckNudCk7Ci0KLXUzMiBoMjY0YnNkQ2hlY2tSZWR1bmRhbnRQaWNDbnQoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VxUGFyYW1TZXRfdCAqcFNlcVBhcmFtU2V0LAotICBwaWNQYXJhbVNldF90ICpwUGljUGFyYW1TZXQsCi0gIG5hbFVuaXRUeXBlX2UgbmFsVW5pdFR5cGUsCi0gIHUzMiAqcmVkdW5kYW50UGljQ250KTsKLQotdTMyIGgyNjRic2RDaGVja1ByaW9yUGljc0ZsYWcodTMyICogbm9PdXRwdXRPZlByaW9yUGljc0ZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJtRGF0YV90ICogcFN0cm1EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VxUGFyYW1TZXRfdCAqIHBTZXFQYXJhbVNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBpY1BhcmFtU2V0X3QgKiBwUGljUGFyYW1TZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYWxVbml0VHlwZV9lIG5hbFVuaXRUeXBlKTsKLQotI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfU0xJQ0VfSEVBREVSX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3N0b3JhZ2UuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zdG9yYWdlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmN2E0MmEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3N0b3JhZ2UuYworKysgL2Rldi9udWxsCkBAIC0xLDkwNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0gICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0gICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgICAgNS4gRnVuY3Rpb25zCi0gICAgICAgICAgaDI2NGJzZEluaXRTdG9yYWdlCi0gICAgICAgICAgaDI2NGJzZFN0b3JlU2VxUGFyYW1TZXQKLSAgICAgICAgICBoMjY0YnNkU3RvcmVQaWNQYXJhbVNldAotICAgICAgICAgIGgyNjRic2RBY3RpdmF0ZVBhcmFtU2V0cwotICAgICAgICAgIGgyNjRic2RSZXNldFN0b3JhZ2UKLSAgICAgICAgICBoMjY0YnNkSXNTdGFydE9mUGljdHVyZQotICAgICAgICAgIGgyNjRic2RJc0VuZE9mUGljdHVyZQotICAgICAgICAgIGgyNjRic2RDb21wdXRlU2xpY2VHcm91cE1hcAotICAgICAgICAgIGgyNjRic2RDaGVja0FjY2Vzc1VuaXRCb3VuZGFyeQotICAgICAgICAgIENoZWNrUHBzCi0gICAgICAgICAgaDI2NGJzZFZhbGlkUGFyYW1TZXRzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiaDI2NGJzZF9zdG9yYWdlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9uZWlnaGJvdXIuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2dyb3VwX21hcC5oIgotI2luY2x1ZGUgImgyNjRic2RfZHBiLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9uYWxfdW5pdC5oIgotI2luY2x1ZGUgImgyNjRic2Rfc2xpY2VfaGVhZGVyLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zZXFfcGFyYW1fc2V0LmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgVUlOVDMyX01BWAotI2RlZmluZSBVSU5UMzJfTUFYICAgICAgICg0Mjk0OTY3Mjk1VSkKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgQ2hlY2tQcHMocGljUGFyYW1TZXRfdCAqcHBzLCBzZXFQYXJhbVNldF90ICpzcHMpOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogaDI2NGJzZEluaXRTdG9yYWdlCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEluaXRpYWxpemUgc3RvcmFnZSBzdHJ1Y3R1cmUuIFNldHMgY29udGVudHMgb2YgdGhlIHN0b3JhZ2UgdG8gJzAnCi0gICAgICAgICAgICBleGNlcHQgZm9yIHRoZSBhY3RpdmUgcGFyYW1ldGVyIHNldCBpZHMsIHdoaWNoIGFyZSBpbml0aWFsaXplZAotICAgICAgICAgICAgdG8gaW52YWxpZCB2YWx1ZXMuCi0KLSAgICAgICAgSW5wdXRzOgotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBwU3RvcmFnZSAgICBpbml0aWFsaXplZCBkYXRhIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIG5vbmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBoMjY0YnNkSW5pdFN0b3JhZ2Uoc3RvcmFnZV90ICpwU3RvcmFnZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RvcmFnZSk7Ci0KLSAgICBIMjY0U3dEZWNNZW1zZXQocFN0b3JhZ2UsIDAsIHNpemVvZihzdG9yYWdlX3QpKTsKLQotICAgIHBTdG9yYWdlLT5hY3RpdmVTcHNJZCA9IE1BWF9OVU1fU0VRX1BBUkFNX1NFVFM7Ci0gICAgcFN0b3JhZ2UtPmFjdGl2ZVBwc0lkID0gTUFYX05VTV9QSUNfUEFSQU1fU0VUUzsKLQotICAgIHBTdG9yYWdlLT5hdWItPmZpcnN0Q2FsbEZsYWcgPSBIQU5UUk9fVFJVRTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkU3RvcmVTZXFQYXJhbVNldAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBTdG9yZSBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0IGludG8gdGhlIHN0b3JhZ2UuIElmIGFjdGl2ZSBTUFMgaXMKLSAgICAgICAgICAgIG92ZXJ3cml0dGVuIC0+IGNoZWNrIGlmIGNvbnRlbnRzIGNoYW5nZXMgYW5kIGlmIGl0IGRvZXMsIHNldAotICAgICAgICAgICAgcGFyYW1ldGVycyB0byBmb3JjZSByZWFjdGl2YXRpb24gb2YgcGFyYW1ldGVyIHNldHMKLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RvcmFnZSAgICAgICAgcG9pbnRlciB0byBzdG9yYWdlIHN0cnVjdHVyZQotICAgICAgICAgICAgcFNlcVBhcmFtU2V0ICAgIHBvaW50ZXIgdG8gcGFyYW0gc2V0IHRvIGJlIHN0b3JlZAotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBub25lCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgICAgICAgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBNRU1PUllfQUxMT0NBVElPTl9FUlJPUiAgZmFpbHVyZSBpbiBtZW1vcnkgYWxsb2NhdGlvbgotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkU3RvcmVTZXFQYXJhbVNldChzdG9yYWdlX3QgKnBTdG9yYWdlLCBzZXFQYXJhbVNldF90ICpwU2VxUGFyYW1TZXQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGlkOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0b3JhZ2UpOwotICAgIEFTU0VSVChwU2VxUGFyYW1TZXQpOwotICAgIEFTU0VSVChwU2VxUGFyYW1TZXQtPnNlcVBhcmFtZXRlclNldElkIDwgTUFYX05VTV9TRVFfUEFSQU1fU0VUUyk7Ci0KLSAgICBpZCA9IHBTZXFQYXJhbVNldC0+c2VxUGFyYW1ldGVyU2V0SWQ7Ci0KLSAgICAvKiBzZXEgcGFyYW1ldGVyIHNldCB3aXRoIGlkIG5vdCB1c2VkIGJlZm9yZSAtPiBhbGxvY2F0ZSBtZW1vcnkgKi8KLSAgICBpZiAocFN0b3JhZ2UtPnNwc1tpZF0gPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIEFMTE9DQVRFKHBTdG9yYWdlLT5zcHNbaWRdLCAxLCBzZXFQYXJhbVNldF90KTsKLSAgICAgICAgaWYgKHBTdG9yYWdlLT5zcHNbaWRdID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOwotICAgIH0KLSAgICAvKiBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0IHdpdGggaWQgZXF1YWwgdG8gaWQgb2YgYWN0aXZlIHNwcyAqLwotICAgIGVsc2UgaWYgKGlkID09IHBTdG9yYWdlLT5hY3RpdmVTcHNJZCkKLSAgICB7Ci0gICAgICAgIC8qIGlmIHNlcSBwYXJhbWV0ZXIgc2V0IGNvbnRlbnRzIGNoYW5nZXMKLSAgICAgICAgICogICAgLT4gb3ZlcndyaXRlIGFuZCByZS1hY3RpdmF0ZSB3aGVuIG5leHQgSURSIHBpY3R1cmUgZGVjb2RlZAotICAgICAgICAgKiAgICBpZHMgb2YgYWN0aXZlIHBhcmFtIHNldHMgc2V0IHRvIGludmFsaWQgdmFsdWVzIHRvIGZvcmNlCi0gICAgICAgICAqICAgIHJlLWFjdGl2YXRpb24uIE1lbW9yaWVzIGFsbG9jYXRlZCBmb3Igb2xkIHNwcyBmcmVlZAotICAgICAgICAgKiBvdGhlcndpc2UgZnJlZSBtZW1lcmllcyBhbGxvY2F0ZWQgZm9yIGp1c3QgZGVjb2RlZCBzcHMgYW5kCi0gICAgICAgICAqIGNvbnRpbnVlICovCi0gICAgICAgIGlmIChoMjY0YnNkQ29tcGFyZVNlcVBhcmFtU2V0cyhwU2VxUGFyYW1TZXQsIHBTdG9yYWdlLT5hY3RpdmVTcHMpICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZSRUUocFN0b3JhZ2UtPnNwc1tpZF0tPm9mZnNldEZvclJlZkZyYW1lKTsKLSAgICAgICAgICAgIEZSRUUocFN0b3JhZ2UtPnNwc1tpZF0tPnZ1aVBhcmFtZXRlcnMpOwotICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwc0lkID0gTUFYX05VTV9TRVFfUEFSQU1fU0VUUyArIDE7Ci0gICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlUHBzSWQgPSBNQVhfTlVNX1BJQ19QQVJBTV9TRVRTICsgMTsKLSAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMgPSBOVUxMOwotICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVBwcyA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBGUkVFKHBTZXFQYXJhbVNldC0+b2Zmc2V0Rm9yUmVmRnJhbWUpOwotICAgICAgICAgICAgRlJFRShwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMpOwotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyogb3ZlcndyaXRlIHNlcSBwYXJhbSBzZXQgb3RoZXIgdGhhbiBhY3RpdmUgb25lIC0+IGZyZWUgbWVtb3JpZXMKLSAgICAgKiBhbGxvY2F0ZWQgZm9yIG9sZCBwYXJhbSBzZXQgKi8KLSAgICBlbHNlCi0gICAgewotICAgICAgICBGUkVFKHBTdG9yYWdlLT5zcHNbaWRdLT5vZmZzZXRGb3JSZWZGcmFtZSk7Ci0gICAgICAgIEZSRUUocFN0b3JhZ2UtPnNwc1tpZF0tPnZ1aVBhcmFtZXRlcnMpOwotICAgIH0KLQotICAgICpwU3RvcmFnZS0+c3BzW2lkXSA9ICpwU2VxUGFyYW1TZXQ7Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RTdG9yZVBpY1BhcmFtU2V0Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIFN0b3JlIHBpY3R1cmUgcGFyYW1ldGVyIHNldCBpbnRvIHRoZSBzdG9yYWdlLiBJZiBhY3RpdmUgUFBTIGlzCi0gICAgICAgICAgICBvdmVyd3JpdHRlbiAtPiBjaGVjayBpZiBhY3RpdmUgU1BTIGNoYW5nZXMgYW5kIGlmIGl0IGRvZXMgLT4gc2V0Ci0gICAgICAgICAgICBwYXJhbWV0ZXJzIHRvIGZvcmNlIHJlYWN0aXZhdGlvbiBvZiBwYXJhbWV0ZXIgc2V0cwotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdG9yYWdlICAgICAgICBwb2ludGVyIHRvIHN0b3JhZ2Ugc3RydWN0dXJlCi0gICAgICAgICAgICBwUGljUGFyYW1TZXQgICAgcG9pbnRlciB0byBwYXJhbSBzZXQgdG8gYmUgc3RvcmVkCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIG5vbmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgICAgICAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SICBmYWlsdXJlIGluIG1lbW9yeSBhbGxvY2F0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkU3RvcmVQaWNQYXJhbVNldChzdG9yYWdlX3QgKnBTdG9yYWdlLCBwaWNQYXJhbVNldF90ICpwUGljUGFyYW1TZXQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGlkOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0b3JhZ2UpOwotICAgIEFTU0VSVChwUGljUGFyYW1TZXQpOwotICAgIEFTU0VSVChwUGljUGFyYW1TZXQtPnBpY1BhcmFtZXRlclNldElkIDwgTUFYX05VTV9QSUNfUEFSQU1fU0VUUyk7Ci0gICAgQVNTRVJUKHBQaWNQYXJhbVNldC0+c2VxUGFyYW1ldGVyU2V0SWQgPCBNQVhfTlVNX1NFUV9QQVJBTV9TRVRTKTsKLQotICAgIGlkID0gcFBpY1BhcmFtU2V0LT5waWNQYXJhbWV0ZXJTZXRJZDsKLQotICAgIC8qIHBpYyBwYXJhbWV0ZXIgc2V0IHdpdGggaWQgbm90IHVzZWQgYmVmb3JlIC0+IGFsbG9jYXRlIG1lbW9yeSAqLwotICAgIGlmIChwU3RvcmFnZS0+cHBzW2lkXSA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgQUxMT0NBVEUocFN0b3JhZ2UtPnBwc1tpZF0sIDEsIHBpY1BhcmFtU2V0X3QpOwotICAgICAgICBpZiAocFN0b3JhZ2UtPnBwc1tpZF0gPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7Ci0gICAgfQotICAgIC8qIHBpY3R1cmUgcGFyYW1ldGVyIHNldCB3aXRoIGlkIGVxdWFsIHRvIGlkIG9mIGFjdGl2ZSBwcHMgKi8KLSAgICBlbHNlIGlmIChpZCA9PSBwU3RvcmFnZS0+YWN0aXZlUHBzSWQpCi0gICAgewotICAgICAgICAvKiBjaGVjayB3aGV0aGVyIHNlcSBwYXJhbSBzZXQgY2hhbmdlcywgZm9yY2UgcmUtYWN0aXZhdGlvbiBvZgotICAgICAgICAgKiBwYXJhbSBzZXQgaWYgaXQgZG9lcy4gU2V0IGFjdGl2ZVNwc0lkIHRvIGludmFsaWQgdmFsdWUgdG8KLSAgICAgICAgICogYWNjb21wbGlzaCB0aGlzICovCi0gICAgICAgIGlmIChwUGljUGFyYW1TZXQtPnNlcVBhcmFtZXRlclNldElkICE9IHBTdG9yYWdlLT5hY3RpdmVTcHNJZCkKLSAgICAgICAgewotICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVBwc0lkID0gTUFYX05VTV9QSUNfUEFSQU1fU0VUUyArIDE7Ci0gICAgICAgIH0KLSAgICAgICAgLyogZnJlZSBtZW1vcmllcyBhbGxvY2F0ZWQgZm9yIG9sZCBwYXJhbSBzZXQgKi8KLSAgICAgICAgRlJFRShwU3RvcmFnZS0+cHBzW2lkXS0+cnVuTGVuZ3RoKTsKLSAgICAgICAgRlJFRShwU3RvcmFnZS0+cHBzW2lkXS0+dG9wTGVmdCk7Ci0gICAgICAgIEZSRUUocFN0b3JhZ2UtPnBwc1tpZF0tPmJvdHRvbVJpZ2h0KTsKLSAgICAgICAgRlJFRShwU3RvcmFnZS0+cHBzW2lkXS0+c2xpY2VHcm91cElkKTsKLSAgICB9Ci0gICAgLyogb3ZlcndyaXRlIHBpYyBwYXJhbSBzZXQgb3RoZXIgdGhhbiBhY3RpdmUgb25lIC0+IGZyZWUgbWVtb3JpZXMKLSAgICAgKiBhbGxvY2F0ZWQgZm9yIG9sZCBwYXJhbSBzZXQgKi8KLSAgICBlbHNlCi0gICAgewotICAgICAgICBGUkVFKHBTdG9yYWdlLT5wcHNbaWRdLT5ydW5MZW5ndGgpOwotICAgICAgICBGUkVFKHBTdG9yYWdlLT5wcHNbaWRdLT50b3BMZWZ0KTsKLSAgICAgICAgRlJFRShwU3RvcmFnZS0+cHBzW2lkXS0+Ym90dG9tUmlnaHQpOwotICAgICAgICBGUkVFKHBTdG9yYWdlLT5wcHNbaWRdLT5zbGljZUdyb3VwSWQpOwotICAgIH0KLQotICAgICpwU3RvcmFnZS0+cHBzW2lkXSA9ICpwUGljUGFyYW1TZXQ7Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RBY3RpdmF0ZVBhcmFtU2V0cwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBBY3RpdmF0ZSBjZXJ0YWluIFNQUy9QUFMgY29tYmluYXRpb24uIFRoaXMgZnVuY3Rpb24gc2hhbGwgYmUKLSAgICAgICAgICAgIGNhbGxlZCBpbiB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggcGljdHVyZS4gUGljdHVyZSBwYXJhbWV0ZXIgc2V0Ci0gICAgICAgICAgICBjYW4gYmUgY2hhbmdlZCBhcyB3YW50ZWQsIGJ1dCBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0IG1heSBvbmx5IGJlCi0gICAgICAgICAgICBjaGFuZ2VkIHdoZW4gdGhlIHN0YXJ0aW5nIHBpY3R1cmUgaXMgYW4gSURSIHBpY3R1cmUuCi0KLSAgICAgICAgICAgIFdoZW4gbmV3IFNQUyBpcyBhY3RpdmF0ZWQgdGhlIGZ1bmN0aW9uIGFsbG9jYXRlcyBtZW1vcnkgZm9yCi0gICAgICAgICAgICBtYWNyb2Jsb2NrIHN0b3JhZ2VzIGFuZCBzbGljZSBncm91cCBtYXAgYW5kIChyZS0paW5pdGlhbGl6ZXMgdGhlCi0gICAgICAgICAgICBkZWNvZGVkIHBpY3R1cmUgYnVmZmVyLiBJZiB0aGlzIGlzIG5vdCB0aGUgZmlyc3QgYWN0aXZhdGlvbiB0aGUgb2xkCi0gICAgICAgICAgICBhbGxvY2F0aW9ucyBhcmUgZnJlZWQgYW5kIEZyZWVEcGIgY2FsbGVkIGJlZm9yZSBuZXcgYWxsb2NhdGlvbnMuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0b3JhZ2UgICAgICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBkYXRhIHN0cnVjdHVyZQotICAgICAgICAgICAgcHBzSWQgICAgICAgICAgIGlkZW50aWZpZXMgdGhlIFBQUyB0byBiZSBhY3RpdmF0ZWQsIFNQUyBpZCBvYnRhaW5lZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIFBQUwotICAgICAgICAgICAgaXNJZHIgICAgICAgICAgIGZsYWcgdG8gaW5kaWNhdGUgaWYgdGhlIHBpY3R1cmUgaXMgYW4gSURSIHBpY3R1cmUKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgbm9uZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcwotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIG5vbi1leGlzdGluZyBvciBpbnZhbGlkIHBhcmFtIHNldCBjb21iaW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnlpbmcgdG8gY2hhbmdlIFNQUyB3aXRoIG5vbi1JRFIgcGljdHVyZQotICAgICAgICAgICAgTUVNT1JZX0FMTE9DQVRJT05fRVJST1IgICAgIGZhaWx1cmUgaW4gbWVtb3J5IGFsbG9jYXRpb24KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RBY3RpdmF0ZVBhcmFtU2V0cyhzdG9yYWdlX3QgKnBTdG9yYWdlLCB1MzIgcHBzSWQsIHUzMiBpc0lkcikKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wOwotICAgIHUzMiBmbGFnOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0b3JhZ2UpOwotICAgIEFTU0VSVChwcHNJZCA8IE1BWF9OVU1fUElDX1BBUkFNX1NFVFMpOwotCi0gICAgLyogY2hlY2sgdGhhdCBwcHMgYW5kIGNvcnJlc3BvbmRpbmcgc3BzIGV4aXN0ICovCi0gICAgaWYgKCAocFN0b3JhZ2UtPnBwc1twcHNJZF0gPT0gTlVMTCkgfHwKLSAgICAgICAgIChwU3RvcmFnZS0+c3BzW3BTdG9yYWdlLT5wcHNbcHBzSWRdLT5zZXFQYXJhbWV0ZXJTZXRJZF0gPT0gTlVMTCkgKQotICAgIHsKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLQotICAgIC8qIGNoZWNrIHRoYXQgcHBzIHBhcmFtZXRlcnMgZG8gbm90IHZpb2xhdGUgcGljdHVyZSBzaXplIGNvbnN0cmFpbnRzICovCi0gICAgdG1wID0gQ2hlY2tQcHMocFN0b3JhZ2UtPnBwc1twcHNJZF0sCi0gICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnNwc1twU3RvcmFnZS0+cHBzW3Bwc0lkXS0+c2VxUGFyYW1ldGVyU2V0SWRdKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAvKiBmaXJzdCBhY3RpdmF0aW9uIHBhcnQxICovCi0gICAgaWYgKHBTdG9yYWdlLT5hY3RpdmVQcHNJZCA9PSBNQVhfTlVNX1BJQ19QQVJBTV9TRVRTKQotICAgIHsKLSAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVBwc0lkID0gcHBzSWQ7Ci0gICAgICAgIHBTdG9yYWdlLT5hY3RpdmVQcHMgPSBwU3RvcmFnZS0+cHBzW3Bwc0lkXTsKLSAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwc0lkID0gcFN0b3JhZ2UtPmFjdGl2ZVBwcy0+c2VxUGFyYW1ldGVyU2V0SWQ7Ci0gICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMgPSBwU3RvcmFnZS0+c3BzW3BTdG9yYWdlLT5hY3RpdmVTcHNJZF07Ci0KLSAgICAgICAgLyogcmVwb3J0IGVycm9yIGJlZm9yZSBtdWx0aXBsaWNhdGlvbiB0byBwcmV2ZW50IGludGVnZXIgb3ZlcmZsb3cgKi8KLSAgICAgICAgaWYgKHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY1dpZHRoSW5NYnMgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgcFN0b3JhZ2UtPnBpY1NpemVJbk1icyA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljSGVpZ2h0SW5NYnMgPgotICAgICAgICAgICAgICAgICBVSU5UMzJfTUFYIC8gcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljV2lkdGhJbk1icykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuKE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBTdG9yYWdlLT5waWNTaXplSW5NYnMgPQotICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY1dpZHRoSW5NYnMgKgotICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY0hlaWdodEluTWJzOwotICAgICAgICB9Ci0KLSAgICAgICAgcFN0b3JhZ2UtPmN1cnJJbWFnZS0+d2lkdGggPSBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNXaWR0aEluTWJzOwotICAgICAgICBwU3RvcmFnZS0+Y3VyckltYWdlLT5oZWlnaHQgPSBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNIZWlnaHRJbk1iczsKLQotICAgICAgICBwU3RvcmFnZS0+cGVuZGluZ0FjdGl2YXRpb24gPSBIQU5UUk9fVFJVRTsKLSAgICB9Ci0gICAgLyogZmlyc3QgYWN0aXZhdGlvbiBwYXJ0MiAqLwotICAgIGVsc2UgaWYgKHBTdG9yYWdlLT5wZW5kaW5nQWN0aXZhdGlvbikKLSAgICB7Ci0gICAgICAgIHBTdG9yYWdlLT5wZW5kaW5nQWN0aXZhdGlvbiA9IEhBTlRST19GQUxTRTsKLQotICAgICAgICBGUkVFKHBTdG9yYWdlLT5tYik7Ci0gICAgICAgIEZSRUUocFN0b3JhZ2UtPnNsaWNlR3JvdXBNYXApOwotCi0gICAgICAgIEFMTE9DQVRFKHBTdG9yYWdlLT5tYiwgcFN0b3JhZ2UtPnBpY1NpemVJbk1icywgbWJTdG9yYWdlX3QpOwotICAgICAgICBBTExPQ0FURShwU3RvcmFnZS0+c2xpY2VHcm91cE1hcCwgcFN0b3JhZ2UtPnBpY1NpemVJbk1icywgdTMyKTsKLSAgICAgICAgaWYgKHBTdG9yYWdlLT5tYiA9PSBOVUxMIHx8IHBTdG9yYWdlLT5zbGljZUdyb3VwTWFwID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOwotCi0gICAgICAgIEgyNjRTd0RlY01lbXNldChwU3RvcmFnZS0+bWIsIDAsCi0gICAgICAgICAgICBwU3RvcmFnZS0+cGljU2l6ZUluTWJzICogc2l6ZW9mKG1iU3RvcmFnZV90KSk7Ci0KLSAgICAgICAgaDI2NGJzZEluaXRNYk5laWdoYm91cnMocFN0b3JhZ2UtPm1iLAotICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljV2lkdGhJbk1icywKLSAgICAgICAgICAgIHBTdG9yYWdlLT5waWNTaXplSW5NYnMpOwotCi0gICAgICAgIC8qIGRwYiBvdXRwdXQgcmVvcmRlcmluZyBkaXNhYmxlZCBpZgotICAgICAgICAgKiAxKSBhcHBsaWNhdGlvbiBzZXQgbm9SZW9yZGVyaW5nIGZsYWcKLSAgICAgICAgICogMikgUE9DIHR5cGUgZXF1YWwgdG8gMgotICAgICAgICAgKiAzKSBudW1fcmVvcmRlcl9mcmFtZXMgaW4gdnVpIGVxdWFsIHRvIDAgKi8KLSAgICAgICAgaWYgKCBwU3RvcmFnZS0+bm9SZW9yZGVyaW5nIHx8Ci0gICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljT3JkZXJDbnRUeXBlID09IDIgfHwKLSAgICAgICAgICAgICAocFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVyc1ByZXNlbnRGbGFnICYmCi0gICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnMtPmJpdHN0cmVhbVJlc3RyaWN0aW9uRmxhZyAmJgotICAgICAgICAgICAgICAhcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVycy0+bnVtUmVvcmRlckZyYW1lcykgKQotICAgICAgICAgICAgZmxhZyA9IEhBTlRST19UUlVFOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmbGFnID0gSEFOVFJPX0ZBTFNFOwotCi0gICAgICAgIHRtcCA9IGgyNjRic2RSZXNldERwYihwU3RvcmFnZS0+ZHBiLAotICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljV2lkdGhJbk1icyAqCi0gICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNIZWlnaHRJbk1icywKLSAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPm1heERwYlNpemUsCi0gICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5udW1SZWZGcmFtZXMsCi0gICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5tYXhGcmFtZU51bSwKLSAgICAgICAgICAgIGZsYWcpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgIH0KLSAgICBlbHNlIGlmIChwcHNJZCAhPSBwU3RvcmFnZS0+YWN0aXZlUHBzSWQpCi0gICAgewotICAgICAgICAvKiBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0IHNoYWxsIG5vdCBjaGFuZ2UgYnV0IGJlZm9yZSBhbiBJRFIgcGljdHVyZSAqLwotICAgICAgICBpZiAocFN0b3JhZ2UtPnBwc1twcHNJZF0tPnNlcVBhcmFtZXRlclNldElkICE9IHBTdG9yYWdlLT5hY3RpdmVTcHNJZCkKLSAgICAgICAgewotICAgICAgICAgICAgREVCVUcoKCJTRVEgUEFSQU0gU0VUIENIQU5HSU5HLi4uXG4iKSk7Ci0gICAgICAgICAgICBpZiAoaXNJZHIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVBwc0lkID0gcHBzSWQ7Ci0gICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVBwcyA9IHBTdG9yYWdlLT5wcHNbcHBzSWRdOwotICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHNJZCA9IHBTdG9yYWdlLT5hY3RpdmVQcHMtPnNlcVBhcmFtZXRlclNldElkOwotICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMgPSBwU3RvcmFnZS0+c3BzW3BTdG9yYWdlLT5hY3RpdmVTcHNJZF07Ci0gICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnBpY1NpemVJbk1icyA9Ci0gICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY1dpZHRoSW5NYnMgKgotICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNIZWlnaHRJbk1iczsKLQotICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5jdXJySW1hZ2UtPndpZHRoID0gcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljV2lkdGhJbk1iczsKLSAgICAgICAgICAgICAgICBwU3RvcmFnZS0+Y3VyckltYWdlLT5oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNIZWlnaHRJbk1iczsKLQotICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5wZW5kaW5nQWN0aXZhdGlvbiA9IEhBTlRST19UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERFQlVHKCgiVFJZSU5HIFRPIENIQU5HRSBTUFMgSU4gTk9OLUlEUiBTTElDRVxuIikpOwotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVQcHNJZCA9IHBwc0lkOwotICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVBwcyA9IHBTdG9yYWdlLT5wcHNbcHBzSWRdOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkUmVzZXRTdG9yYWdlCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIFJlc2V0IGNvbnRlbnRzIG9mIHRoZSBzdG9yYWdlLiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlCi0gICAgICAgICAgICBwcm9jZXNzaW5nIG9mIG5ldyBpbWFnZSBpcyBzdGFydGVkLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgbm9uZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBub25lCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBoMjY0YnNkUmVzZXRTdG9yYWdlKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGk7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RvcmFnZSk7Ci0KLSAgICBwU3RvcmFnZS0+c2xpY2UtPm51bURlY29kZWRNYnMgPSAwOwotICAgIHBTdG9yYWdlLT5zbGljZS0+c2xpY2VJZCA9IDA7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgcFN0b3JhZ2UtPnBpY1NpemVJbk1iczsgaSsrKQotICAgIHsKLSAgICAgICAgcFN0b3JhZ2UtPm1iW2ldLnNsaWNlSWQgPSAwOwotICAgICAgICBwU3RvcmFnZS0+bWJbaV0uZGVjb2RlZCA9IDA7Ci0gICAgfQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZElzU3RhcnRPZlBpY3R1cmUKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRGV0ZXJtaW5lIGlmIHRoZSBkZWNvZGVyIGlzIGluIHRoZSBzdGFydCBvZiBhIHBpY3R1cmUuIFRoaXMKLSAgICAgICAgICAgIGluZm9ybWF0aW9uIGlzIG5lZWRlZCB0byBkZWNpZGUgaWYgaDI2NGJzZEFjdGl2YXRlUGFyYW1TZXRzIGFuZAotICAgICAgICAgICAgaDI2NGJzZENoZWNrR2Fwc0luRnJhbWVOdW0gZnVuY3Rpb25zIHNob3VsZCBiZSBjYWxsZWQuIEZ1bmN0aW9uCi0gICAgICAgICAgICBjb25zaWRlcnMgdGhhdCBuZXcgcGljdHVyZSBpcyBzdGFydGluZyBpZiBubyBzbGljZSBoZWFkZXJzCi0gICAgICAgICAgICBoYXZlIGJlZW4gc3VjY2Vzc2Z1bGx5IGRlY29kZWQgZm9yIHRoZSBjdXJyZW50IGFjY2VzcyB1bml0LgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgbm9uZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fVFJVRSAgICAgICAgbmV3IHBpY3R1cmUgaXMgc3RhcnRpbmcKLSAgICAgICAgICAgIEhBTlRST19GQUxTRSAgICAgICBub3Qgc3RhcnRpbmcKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RJc1N0YXJ0T2ZQaWN0dXJlKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0KLS8qIENvZGUgKi8KLQotICAgIGlmIChwU3RvcmFnZS0+dmFsaWRTbGljZUluQWNjZXNzVW5pdCA9PSBIQU5UUk9fRkFMU0UpCi0gICAgICAgIHJldHVybihIQU5UUk9fVFJVRSk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4oSEFOVFJPX0ZBTFNFKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RJc0VuZE9mUGljdHVyZQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBEZXRlcm1pbmUgaWYgdGhlIGRlY29kZXIgaXMgaW4gdGhlIGVuZCBvZiBhIHBpY3R1cmUuIFRoaXMKLSAgICAgICAgICAgIGluZm9ybWF0aW9uIGlzIG5lZWRlZCB0byBkZXRlcm1pbmUgd2hlbiBkZWJsb2NraW5nIGZpbHRlcmluZwotICAgICAgICAgICAgYW5kIHJlZmVyZW5jZSBwaWN0dXJlIG1hcmtpbmcgcHJvY2Vzc2VzIHNob3VsZCBiZSBwZXJmb3JtZWQuCi0KLSAgICAgICAgICAgIElmIHRoZSBkZWNvZGVyIGlzIHByb2Nlc3NpbmcgcHJpbWFyeSBzbGljZXMgdGhlIHJldHVybiB2YWx1ZQotICAgICAgICAgICAgaXMgZGV0ZXJtaW5lZCBieSBjaGVja2luZyB0aGUgdmFsdWUgb2YgbnVtRGVjb2RlZE1icyBpbiB0aGUKLSAgICAgICAgICAgIHN0b3JhZ2UuIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGUgZGVjb2RlciBpcyBwcm9jZXNzaW5nCi0gICAgICAgICAgICByZWR1bmRhbnQgc2xpY2VzIHRoZSBudW1EZWNvZGVkTWJzIG1heSBub3QgY29udGFpbiB2YWxpZAotICAgICAgICAgICAgaW5mb3JtYXRpb25hIGFuZCBlYWNoIG1hY3JvYmxvY2sgaGFzIHRvIGJlIGNoZWNrZWQgc2VwYXJhdGVseS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RvcmFnZSAgICBwb2ludGVyIHRvIHN0b3JhZ2Ugc3RydWN0dXJlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIG5vbmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX1RSVUUgICAgICAgIGVuZCBvZiBwaWN0dXJlCi0gICAgICAgICAgICBIQU5UUk9fRkFMU0UgICAgICAgbm91cAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZElzRW5kT2ZQaWN0dXJlKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGksIHRtcDsKLQotLyogQ29kZSAqLwotCi0gICAgLyogcHJpbWFyeSBwaWN0dXJlICovCi0gICAgaWYgKCFwU3RvcmFnZS0+c2xpY2VIZWFkZXJbMF0ucmVkdW5kYW50UGljQ250KQotICAgIHsKLSAgICAgICAgaWYgKHBTdG9yYWdlLT5zbGljZS0+bnVtRGVjb2RlZE1icyA9PSBwU3RvcmFnZS0+cGljU2l6ZUluTWJzKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19UUlVFKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMCwgdG1wID0gMDsgaSA8IHBTdG9yYWdlLT5waWNTaXplSW5NYnM7IGkrKykKLSAgICAgICAgICAgIHRtcCArPSBwU3RvcmFnZS0+bWJbaV0uZGVjb2RlZCA/IDEgOiAwOwotCi0gICAgICAgIGlmICh0bXAgPT0gcFN0b3JhZ2UtPnBpY1NpemVJbk1icykKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fVFJVRSk7Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19GQUxTRSk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkQ29tcHV0ZVNsaWNlR3JvdXBNYXAKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgQ29tcHV0ZSBzbGljZSBncm91cCBtYXAuIEp1c3QgY2FsbCBoMjY0YnNkRGVjb2RlU2xpY2VHcm91cE1hcCB3aXRoCi0gICAgICAgICAgICBhcHByb3ByaWF0ZSBwYXJhbWV0ZXJzLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdG9yYWdlICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKLSAgICAgICAgICAgIHNsaWNlR3JvdXBDaGFuZ2VDeWNsZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBub25lCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIG5vbmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBoMjY0YnNkQ29tcHV0ZVNsaWNlR3JvdXBNYXAoc3RvcmFnZV90ICpwU3RvcmFnZSwgdTMyIHNsaWNlR3JvdXBDaGFuZ2VDeWNsZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLQotLyogQ29kZSAqLwotCi0gICAgaDI2NGJzZERlY29kZVNsaWNlR3JvdXBNYXAocFN0b3JhZ2UtPnNsaWNlR3JvdXBNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlUHBzLCBzbGljZUdyb3VwQ2hhbmdlQ3ljbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNXaWR0aEluTWJzLAotICAgICAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljSGVpZ2h0SW5NYnMpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZENoZWNrQWNjZXNzVW5pdEJvdW5kYXJ5Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIENoZWNrIGlmIG5leHQgTkFMIHVuaXQgc3RhcnRzIGEgbmV3IGFjY2VzcyB1bml0LiBGb2xsb3dpbmcKLSAgICAgICAgICAgIGNvbmRpdGlvbnMgc3BlY2lmeSBzdGFydCBvZiBhIG5ldyBhY2Nlc3MgdW5pdDoKLQotICAgICAgICAgICAgICAgIC1OQUwgdW5pdCB0eXBlcyA2LTExLCAxMy0xOCAoZS5nLiBTUFMsIFBQUykKLQotICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBjaGVja2VkIG9ubHkgZm9yIHNsaWNlIE5BTCB1bml0cywgdmFsdWVzCi0gICAgICAgICAgIGNvbXBhcmVkIHRvIG9uZXMgb2J0YWluZWQgZnJvbSBwcmV2aW91cyBzbGljZToKLQotICAgICAgICAgICAgICAgIC1OQUwgdW5pdCB0eXBlIGRpZmZlcnMgKHNsaWNlIC8gSURSIHNsaWNlKQotICAgICAgICAgICAgICAgIC1mcmFtZV9udW0gZGlmZmVycwotICAgICAgICAgICAgICAgIC1uYWxfcmVmX2lkYyBkaWZmZXJzIGFuZCBvbmUgb2YgdGhlIHZhbHVlcyBpcyAwCi0gICAgICAgICAgICAgICAgLVBPQyBpbmZvcm1hdGlvbiBkaWZmZXJzCi0gICAgICAgICAgICAgICAgLWJvdGggYXJlIElEUiBzbGljZXMgYW5kIGlkcl9waWNfaWQgZGlmZmVycwotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHN0cm0gICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCi0gICAgICAgICAgICBudU5leHQgICAgICBwb2ludGVyIHRvIE5BTCB1bml0IHN0cnVjdHVyZQotICAgICAgICAgICAgc3RvcmFnZSAgICAgcG9pbnRlciB0byBzdG9yYWdlIHN0cnVjdHVyZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBhY2Nlc3NVbml0Qm91bmRhcnlGbGFnICB0aGUgcmVzdWx0IGlzIHN0b3JlZCBoZXJlLCBUUlVFIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzIHVuaXQgYm91bmRhcnksIEZBTFNFIG90aGVyd2lzZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgICAgICAgZmFpbHVyZSwgaW52YWxpZCBzdHJlYW0gZGF0YQotICAgICAgICAgICAgUEFSQU1fU0VUX0VSUk9SICAgICBpbnZhbGlkIHBhcmFtIHNldCB1c2FnZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZENoZWNrQWNjZXNzVW5pdEJvdW5kYXJ5KAotICBzdHJtRGF0YV90ICpzdHJtLAotICBuYWxVbml0X3QgKm51TmV4dCwKLSAgc3RvcmFnZV90ICpzdG9yYWdlLAotICB1MzIgKmFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcCwgcHBzSWQsIGZyYW1lTnVtLCBpZHJQaWNJZCwgcGljT3JkZXJDbnRMc2I7Ci0gICAgaTMyIGRlbHRhUGljT3JkZXJDbnRCb3R0b20sIGRlbHRhUGljT3JkZXJDbnRbMl07Ci0gICAgc2VxUGFyYW1TZXRfdCAqc3BzOwotICAgIHBpY1BhcmFtU2V0X3QgKnBwczsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHN0cm0pOwotICAgIEFTU0VSVChudU5leHQpOwotICAgIEFTU0VSVChzdG9yYWdlKTsKLSAgICBBU1NFUlQoc3RvcmFnZS0+c3BzKTsKLSAgICBBU1NFUlQoc3RvcmFnZS0+cHBzKTsKLQotICAgIC8qIGluaXRpYWxpemUgZGVmYXVsdCBvdXRwdXQgdG8gRkFMU0UgKi8KLSAgICAqYWNjZXNzVW5pdEJvdW5kYXJ5RmxhZyA9IEhBTlRST19GQUxTRTsKLQotICAgIGlmICggKCAobnVOZXh0LT5uYWxVbml0VHlwZSA+IDUpICYmIChudU5leHQtPm5hbFVuaXRUeXBlIDwgMTIpICkgfHwKLSAgICAgICAgICggKG51TmV4dC0+bmFsVW5pdFR5cGUgPiAxMikgJiYgKG51TmV4dC0+bmFsVW5pdFR5cGUgPD0gMTgpICkgKQotICAgIHsKLSAgICAgICAgKmFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7Ci0gICAgfQotICAgIGVsc2UgaWYgKCBudU5leHQtPm5hbFVuaXRUeXBlICE9IE5BTF9DT0RFRF9TTElDRSAmJgotICAgICAgICAgICAgICBudU5leHQtPm5hbFVuaXRUeXBlICE9IE5BTF9DT0RFRF9TTElDRV9JRFIgKQotICAgIHsKLSAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7Ci0gICAgfQotCi0gICAgLyogY2hlY2sgaWYgdGhpcyBpcyB0aGUgdmVyeSBmaXJzdCBjYWxsIHRvIHRoaXMgZnVuY3Rpb24gKi8KLSAgICBpZiAoc3RvcmFnZS0+YXViLT5maXJzdENhbGxGbGFnKQotICAgIHsKLSAgICAgICAgKmFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgc3RvcmFnZS0+YXViLT5maXJzdENhbGxGbGFnID0gSEFOVFJPX0ZBTFNFOwotICAgIH0KLQotICAgIC8qIGdldCBwaWN0dXJlIHBhcmFtZXRlciBzZXQgaWQgKi8KLSAgICB0bXAgPSBoMjY0YnNkQ2hlY2tQcHNJZChzdHJtLCAmcHBzSWQpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLQotICAgIC8qIHN0b3JlIHNwcyBhbmQgcHBzIGluIHNlcGFyYXRlIHBvaW50ZXJzIGp1c3QgdG8gbWFrZSBuYW1lcyBzaG9ydGVyICovCi0gICAgcHBzID0gc3RvcmFnZS0+cHBzW3Bwc0lkXTsKLSAgICBpZiAoIHBwcyA9PSBOVUxMIHx8IHN0b3JhZ2UtPnNwc1twcHMtPnNlcVBhcmFtZXRlclNldElkXSA9PSBOVUxMICB8fAotICAgICAgICAgKHN0b3JhZ2UtPmFjdGl2ZVNwc0lkICE9IE1BWF9OVU1fU0VRX1BBUkFNX1NFVFMgJiYKLSAgICAgICAgICBwcHMtPnNlcVBhcmFtZXRlclNldElkICE9IHN0b3JhZ2UtPmFjdGl2ZVNwc0lkICYmCi0gICAgICAgICAgbnVOZXh0LT5uYWxVbml0VHlwZSAhPSBOQUxfQ09ERURfU0xJQ0VfSURSKSApCi0gICAgICAgIHJldHVybihQQVJBTV9TRVRfRVJST1IpOwotICAgIHNwcyA9IHN0b3JhZ2UtPnNwc1twcHMtPnNlcVBhcmFtZXRlclNldElkXTsKLQotICAgIGlmIChzdG9yYWdlLT5hdWItPm51UHJldi0+bmFsUmVmSWRjICE9IG51TmV4dC0+bmFsUmVmSWRjICYmCi0gICAgICAoc3RvcmFnZS0+YXViLT5udVByZXYtPm5hbFJlZklkYyA9PSAwIHx8IG51TmV4dC0+bmFsUmVmSWRjID09IDApKQotICAgICAgICAqYWNjZXNzVW5pdEJvdW5kYXJ5RmxhZyA9IEhBTlRST19UUlVFOwotCi0gICAgaWYgKChzdG9yYWdlLT5hdWItPm51UHJldi0+bmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFX0lEUiAmJgotICAgICAgICAgIG51TmV4dC0+bmFsVW5pdFR5cGUgIT0gTkFMX0NPREVEX1NMSUNFX0lEUikgfHwKLSAgICAgIChzdG9yYWdlLT5hdWItPm51UHJldi0+bmFsVW5pdFR5cGUgIT0gTkFMX0NPREVEX1NMSUNFX0lEUiAmJgotICAgICAgIG51TmV4dC0+bmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFX0lEUikpCi0gICAgICAgICphY2Nlc3NVbml0Qm91bmRhcnlGbGFnID0gSEFOVFJPX1RSVUU7Ci0KLSAgICB0bXAgPSBoMjY0YnNkQ2hlY2tGcmFtZU51bShzdHJtLCBzcHMtPm1heEZyYW1lTnVtLCAmZnJhbWVOdW0pOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICBpZiAoc3RvcmFnZS0+YXViLT5wcmV2RnJhbWVOdW0gIT0gZnJhbWVOdW0pCi0gICAgewotICAgICAgICBzdG9yYWdlLT5hdWItPnByZXZGcmFtZU51bSA9IGZyYW1lTnVtOwotICAgICAgICAqYWNjZXNzVW5pdEJvdW5kYXJ5RmxhZyA9IEhBTlRST19UUlVFOwotICAgIH0KLQotICAgIGlmIChudU5leHQtPm5hbFVuaXRUeXBlID09IE5BTF9DT0RFRF9TTElDRV9JRFIpCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkQ2hlY2tJZHJQaWNJZChzdHJtLCBzcHMtPm1heEZyYW1lTnVtLCBudU5leHQtPm5hbFVuaXRUeXBlLAotICAgICAgICAgICZpZHJQaWNJZCk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgICAgIGlmIChzdG9yYWdlLT5hdWItPm51UHJldi0+bmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFX0lEUiAmJgotICAgICAgICAgIHN0b3JhZ2UtPmF1Yi0+cHJldklkclBpY0lkICE9IGlkclBpY0lkKQotICAgICAgICAgICAgKmFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcgPSBIQU5UUk9fVFJVRTsKLQotICAgICAgICBzdG9yYWdlLT5hdWItPnByZXZJZHJQaWNJZCA9IGlkclBpY0lkOwotICAgIH0KLQotICAgIGlmIChzcHMtPnBpY09yZGVyQ250VHlwZSA9PSAwKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZENoZWNrUGljT3JkZXJDbnRMc2Ioc3RybSwgc3BzLCBudU5leHQtPm5hbFVuaXRUeXBlLAotICAgICAgICAgICZwaWNPcmRlckNudExzYik7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgICAgIGlmIChzdG9yYWdlLT5hdWItPnByZXZQaWNPcmRlckNudExzYiAhPSBwaWNPcmRlckNudExzYikKLSAgICAgICAgewotICAgICAgICAgICAgc3RvcmFnZS0+YXViLT5wcmV2UGljT3JkZXJDbnRMc2IgPSBwaWNPcmRlckNudExzYjsKLSAgICAgICAgICAgICphY2Nlc3NVbml0Qm91bmRhcnlGbGFnID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHBzLT5waWNPcmRlclByZXNlbnRGbGFnKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkQ2hlY2tEZWx0YVBpY09yZGVyQ250Qm90dG9tKHN0cm0sIHNwcywKLSAgICAgICAgICAgICAgICBudU5leHQtPm5hbFVuaXRUeXBlLCAmZGVsdGFQaWNPcmRlckNudEJvdHRvbSk7Ci0gICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLQotICAgICAgICAgICAgaWYgKHN0b3JhZ2UtPmF1Yi0+cHJldkRlbHRhUGljT3JkZXJDbnRCb3R0b20gIT0KLSAgICAgICAgICAgICAgICBkZWx0YVBpY09yZGVyQ250Qm90dG9tKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0b3JhZ2UtPmF1Yi0+cHJldkRlbHRhUGljT3JkZXJDbnRCb3R0b20gPQotICAgICAgICAgICAgICAgICAgICBkZWx0YVBpY09yZGVyQ250Qm90dG9tOwotICAgICAgICAgICAgICAgICphY2Nlc3NVbml0Qm91bmRhcnlGbGFnID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoc3BzLT5waWNPcmRlckNudFR5cGUgPT0gMSAmJiAhc3BzLT5kZWx0YVBpY09yZGVyQWx3YXlzWmVyb0ZsYWcpCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkQ2hlY2tEZWx0YVBpY09yZGVyQ250KHN0cm0sIHNwcywgbnVOZXh0LT5uYWxVbml0VHlwZSwKLSAgICAgICAgICBwcHMtPnBpY09yZGVyUHJlc2VudEZsYWcsIGRlbHRhUGljT3JkZXJDbnQpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotCi0gICAgICAgIGlmIChzdG9yYWdlLT5hdWItPnByZXZEZWx0YVBpY09yZGVyQ250WzBdICE9IGRlbHRhUGljT3JkZXJDbnRbMF0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0b3JhZ2UtPmF1Yi0+cHJldkRlbHRhUGljT3JkZXJDbnRbMF0gPSBkZWx0YVBpY09yZGVyQ250WzBdOwotICAgICAgICAgICAgKmFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcHMtPnBpY09yZGVyUHJlc2VudEZsYWcpCi0gICAgICAgICAgICBpZiAoc3RvcmFnZS0+YXViLT5wcmV2RGVsdGFQaWNPcmRlckNudFsxXSAhPSBkZWx0YVBpY09yZGVyQ250WzFdKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0b3JhZ2UtPmF1Yi0+cHJldkRlbHRhUGljT3JkZXJDbnRbMV0gPSBkZWx0YVBpY09yZGVyQ250WzFdOwotICAgICAgICAgICAgICAgICphY2Nlc3NVbml0Qm91bmRhcnlGbGFnID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgfQotCi0gICAgKnN0b3JhZ2UtPmF1Yi0+bnVQcmV2ID0gKm51TmV4dDsKLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogQ2hlY2tQcHMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgQ2hlY2sgcGljdHVyZSBwYXJhbWV0ZXIgc2V0LiBDb250ZW50cyBvZiB0aGUgcGljdHVyZSBwYXJhbWV0ZXIKLSAgICAgICAgICAgIHNldCBpbmZvcm1hdGlvbiB0aGF0IGRlcGVuZHMgb24gdGhlIGltYWdlIGRpbWVuc2lvbnMgaXMgY2hlY2tlZAotICAgICAgICAgICAgYWdhaW5zdCB0aGUgZGltZW5zaW9ucyBpbiB0aGUgc3BzLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBwcyAgICAgcG9pbnRlciB0byBwaWN0dXJlIHBhcmFtdGVyIHNldAotICAgICAgICAgICAgc3BzICAgICBwb2ludGVyIHRvIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgbm9uZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICBldmVyeXRoaW5nIG9rCi0gICAgICAgICAgICBIQU5UUk9fTk9LICAgICBpbnZhbGlkIGRhdGEgaW4gcGljdHVyZSBwYXJhbWV0ZXIgc2V0Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi11MzIgQ2hlY2tQcHMocGljUGFyYW1TZXRfdCAqcHBzLCBzZXFQYXJhbVNldF90ICpzcHMpCi17Ci0KLSAgICB1MzIgaTsKLSAgICB1MzIgcGljU2l6ZTsKLQotICAgIHBpY1NpemUgPSBzcHMtPnBpY1dpZHRoSW5NYnMgKiBzcHMtPnBpY0hlaWdodEluTWJzOwotCi0gICAgLyogY2hlY2sgc2xpY2UgZ3JvdXAgcGFyYW1zICovCi0gICAgaWYgKHBwcy0+bnVtU2xpY2VHcm91cHMgPiAxKQotICAgIHsKLSAgICAgICAgaWYgKHBwcy0+c2xpY2VHcm91cE1hcFR5cGUgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgQVNTRVJUKHBwcy0+cnVuTGVuZ3RoKTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwcHMtPm51bVNsaWNlR3JvdXBzOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHBwcy0+cnVuTGVuZ3RoW2ldID4gcGljU2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBwcy0+c2xpY2VHcm91cE1hcFR5cGUgPT0gMikKLSAgICAgICAgewotICAgICAgICAgICAgQVNTRVJUKHBwcy0+dG9wTGVmdCk7Ci0gICAgICAgICAgICBBU1NFUlQocHBzLT5ib3R0b21SaWdodCk7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcHBzLT5udW1TbGljZUdyb3Vwcy0xOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHBwcy0+dG9wTGVmdFtpXSA+IHBwcy0+Ym90dG9tUmlnaHRbaV0gfHwKLSAgICAgICAgICAgICAgICAgICAgcHBzLT5ib3R0b21SaWdodFtpXSA+PSBwaWNTaXplKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIChwcHMtPnRvcExlZnRbaV0gJSBzcHMtPnBpY1dpZHRoSW5NYnMpID4KLSAgICAgICAgICAgICAgICAgICAgIChwcHMtPmJvdHRvbVJpZ2h0W2ldICUgc3BzLT5waWNXaWR0aEluTWJzKSApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwcHMtPnNsaWNlR3JvdXBNYXBUeXBlID4gMiAmJiBwcHMtPnNsaWNlR3JvdXBNYXBUeXBlIDwgNikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBwcy0+c2xpY2VHcm91cENoYW5nZVJhdGUgPiBwaWNTaXplKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwcHMtPnNsaWNlR3JvdXBNYXBUeXBlID09IDYgJiYKLSAgICAgICAgICAgICAgICAgcHBzLT5waWNTaXplSW5NYXBVbml0cyA8IHBpY1NpemUpCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZFZhbGlkUGFyYW1TZXRzCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIENoZWNrIGlmIGFueSB2YWxpZCBTUFMvUFBTIGNvbWJpbmF0aW9uIGV4aXN0cyBpbiB0aGUgc3RvcmFnZS4KLSAgICAgICAgICAgIEZ1bmN0aW9uIHRyaWVzIGVhY2ggUFBTIGluIHRoZSBidWZmZXIgYW5kIGNoZWNrcyBpZiBjb3JyZXNwb25kaW5nCi0gICAgICAgICAgICBTUFMgZXhpc3RzIGFuZCBjYWxscyBDaGVja1BwcyB0byBkZXRlcm1pbmUgaWYgdGhlIFBQUyBjb25mb3JtcwotICAgICAgICAgICAgdG8gaW1hZ2UgZGltZW5zaW9ucyBvZiB0aGUgU1BTLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgSEFOVFJPX09LICAgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHZhbGlkIGNvbWJpbmF0aW9uCi0gICAgICAgICAgICBIQU5UUk9fTk9LICBubyB2YWxpZCBjb21iaW5hdGlvbnMgZm91bmQKLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZFZhbGlkUGFyYW1TZXRzKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGk7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RvcmFnZSk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9QSUNfUEFSQU1fU0VUUzsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKCBwU3RvcmFnZS0+cHBzW2ldICYmCi0gICAgICAgICAgICAgcFN0b3JhZ2UtPnNwc1twU3RvcmFnZS0+cHBzW2ldLT5zZXFQYXJhbWV0ZXJTZXRJZF0gJiYKLSAgICAgICAgICAgICBDaGVja1BwcyhwU3RvcmFnZS0+cHBzW2ldLAotICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5zcHNbcFN0b3JhZ2UtPnBwc1tpXS0+c2VxUGFyYW1ldGVyU2V0SWRdKSA9PQotICAgICAgICAgICAgICAgICBIQU5UUk9fT0spCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fT0spOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19OT0spOwotCi19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zdG9yYWdlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc3RvcmFnZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTNiMmRhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zdG9yYWdlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLSAgICAzLiBEYXRhIHR5cGVzCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIEgyNjRTV0RFQ19TVE9SQUdFX0gKLSNkZWZpbmUgSDI2NFNXREVDX1NUT1JBR0VfSAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9jZmcuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3NlcV9wYXJhbV9zZXQuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3BpY19wYXJhbV9zZXQuaCIKLSNpbmNsdWRlICJoMjY0YnNkX21hY3JvYmxvY2tfbGF5ZXIuaCIKLSNpbmNsdWRlICJoMjY0YnNkX25hbF91bml0LmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zbGljZV9oZWFkZXIuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3NlcV9wYXJhbV9zZXQuaCIKLSNpbmNsdWRlICJoMjY0YnNkX2RwYi5oIgotI2luY2x1ZGUgImgyNjRic2RfcGljX29yZGVyX2NudC5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIERhdGEgdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTMyIHNsaWNlSWQ7Ci0gICAgdTMyIG51bURlY29kZWRNYnM7Ci0gICAgdTMyIGxhc3RNYkFkZHI7Ci19IHNsaWNlU3RvcmFnZV90OwotCi0vKiBzdHJ1Y3R1cmUgdG8gc3RvcmUgcGFyYW1ldGVycyBuZWVkZWQgZm9yIGFjY2VzcyB1bml0IGJvdW5kYXJ5IGNoZWNraW5nICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIG5hbFVuaXRfdCBudVByZXZbMV07Ci0gICAgdTMyIHByZXZGcmFtZU51bTsKLSAgICB1MzIgcHJldklkclBpY0lkOwotICAgIHUzMiBwcmV2UGljT3JkZXJDbnRMc2I7Ci0gICAgaTMyIHByZXZEZWx0YVBpY09yZGVyQ250Qm90dG9tOwotICAgIGkzMiBwcmV2RGVsdGFQaWNPcmRlckNudFsyXTsKLSAgICB1MzIgZmlyc3RDYWxsRmxhZzsKLX0gYXViQ2hlY2tfdDsKLQotLyogc3RvcmFnZSBkYXRhIHN0cnVjdHVyZSwgaG9sZHMgYWxsIGRhdGEgb2YgYSBkZWNvZGVyIGluc3RhbmNlICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8qIGFjdGl2ZSBwYXJhbWV0IHNldCBpZHMgYW5kIHBvaW50ZXJzICovCi0gICAgdTMyIG9sZFNwc0lkOwotICAgIHUzMiBhY3RpdmVQcHNJZDsKLSAgICB1MzIgYWN0aXZlU3BzSWQ7Ci0gICAgcGljUGFyYW1TZXRfdCAqYWN0aXZlUHBzOwotICAgIHNlcVBhcmFtU2V0X3QgKmFjdGl2ZVNwczsKLSAgICBzZXFQYXJhbVNldF90ICpzcHNbTUFYX05VTV9TRVFfUEFSQU1fU0VUU107Ci0gICAgcGljUGFyYW1TZXRfdCAqcHBzW01BWF9OVU1fUElDX1BBUkFNX1NFVFNdOwotCi0gICAgLyogY3VycmVudCBzbGljZSBncm91cCBtYXAsIHJlY29tcHV0ZWQgZm9yIGVhY2ggc2xpY2UgKi8KLSAgICB1MzIgKnNsaWNlR3JvdXBNYXA7Ci0KLSAgICB1MzIgcGljU2l6ZUluTWJzOwotCi0gICAgLyogdGhpcyBmbGFnIGlzIHNldCBhZnRlciBhbGwgbWFjcm9ibG9ja3Mgb2YgYSBwaWN0dXJlIHN1Y2Nlc3NmdWxseQotICAgICAqIGRlY29kZWQgLT4gcmVkdW5kYW50IHNsaWNlcyBub3QgZGVjb2RlZCAqLwotICAgIHUzMiBza2lwUmVkdW5kYW50U2xpY2VzOwotICAgIHUzMiBwaWNTdGFydGVkOwotCi0gICAgLyogZmxhZyB0byBpbmRpY2F0ZSBpZiBjdXJyZW50IGFjY2VzcyB1bml0IGNvbnRhaW5zIGFueSB2YWxpZCBzbGljZXMgKi8KLSAgICB1MzIgdmFsaWRTbGljZUluQWNjZXNzVW5pdDsKLQotICAgIC8qIHN0b3JlIGluZm9ybWF0aW9uIG5lZWRlZCBmb3IgaGFuZGxpbmcgb2Ygc2xpY2UgZGVjb2RpbmcgKi8KLSAgICBzbGljZVN0b3JhZ2VfdCBzbGljZVsxXTsKLQotICAgIC8qIG51bWJlciBvZiBjb25jZWFsZWQgbWFjcm9ibG9ja3MgaW4gdGhlIGN1cnJlbnQgaW1hZ2UgKi8KLSAgICB1MzIgbnVtQ29uY2VhbGVkTWJzOwotCi0gICAgLyogcGljSWQgZ2l2ZW4gYnkgYXBwbGljYXRpb24gKi8KLSAgICB1MzIgY3VycmVudFBpY0lkOwotCi0gICAgLyogbWFjcm9ibG9jayBzcGVjaWZpYyBzdG9yYWdlcywgc2l6ZSBkZXRlcm1pbmVkIGJ5IGltYWdlIGRpbWVuc2lvbnMgKi8KLSAgICBtYlN0b3JhZ2VfdCAqbWI7Ci0KLSAgICAvKiBmbGFnIHRvIHN0b3JlIG5vT3V0cHV0UmVvcmRlcmluZyBmbGFnIHNldCBieSB0aGUgYXBwbGljYXRpb24gKi8KLSAgICB1MzIgbm9SZW9yZGVyaW5nOwotCi0gICAgLyogRFBCICovCi0gICAgZHBiU3RvcmFnZV90IGRwYlsxXTsKLQotICAgIC8qIHN0cnVjdHVyZSB0byBzdG9yZSBwaWN0dXJlIG9yZGVyIGNvdW50IHJlbGF0ZWQgaW5mb3JtYXRpb24gKi8KLSAgICBwb2NTdG9yYWdlX3QgcG9jWzFdOwotCi0gICAgLyogYWNjZXNzIHVuaXQgYm91bmRhcnkgY2hlY2tpbmcgcmVsYXRlZCBkYXRhICovCi0gICAgYXViQ2hlY2tfdCBhdWJbMV07Ci0KLSAgICAvKiBjdXJyZW50IHByb2Nlc3NlZCBpbWFnZSAqLwotICAgIGltYWdlX3QgY3VyckltYWdlWzFdOwotCi0gICAgLyogbGFzdCB2YWxpZCBOQUwgdW5pdCBoZWFkZXIgaXMgc3RvcmVkIGhlcmUgKi8KLSAgICBuYWxVbml0X3QgcHJldk5hbFVuaXRbMV07Ci0KLSAgICAvKiBzbGljZSBoZWFkZXIsIHNlY29uZCBzdHJ1Y3R1cmUgdXNlZCBhcyBhIHRlbXBvcmFyeSBzdG9yYWdlIHdoaWxlCi0gICAgICogZGVjb2Rpbmcgc2xpY2UgaGVhZGVyLCBmaXJzdCBvbmUgc3RvcmVzIGxhc3Qgc3VjY2Vzc2Z1bGx5IGRlY29kZWQKLSAgICAgKiBzbGljZSBoZWFkZXIgKi8KLSAgICBzbGljZUhlYWRlcl90IHNsaWNlSGVhZGVyWzJdOwotCi0gICAgLyogZmllbGRzIHRvIHN0b3JlIG9sZCBzdHJlYW0gYnVmZmVyIHBvaW50ZXJzLCBuZWVkZWQgd2hlbiBvbmx5IHBhcnQgb2YKLSAgICAgKiBhIHN0cmVhbSBidWZmZXIgaXMgcHJvY2Vzc2VkIGJ5IGgyNjRic2REZWNvZGUgZnVuY3Rpb24gKi8KLSAgICB1MzIgcHJldkJ1Zk5vdEZpbmlzaGVkOwotICAgIHU4ICpwcmV2QnVmUG9pbnRlcjsKLSAgICB1MzIgcHJldkJ5dGVzQ29uc3VtZWQ7Ci0gICAgc3RybURhdGFfdCBzdHJtWzFdOwotCi0gICAgLyogbWFjcm9ibG9jayBsYXllciBzdHJ1Y3R1cmUsIHRoZXJlIGlzIG5vIG5lZWQgdG8gc3RvcmUgdGhpcyBidXQgaXQKLSAgICAgKiB3b3VsZCBoYXZlIGluY3JlYXNlZCB0aGUgc3RhY2sgc2l6ZSBleGNlc3NpdmVseSBhbmQgbmVlZGVkIHRvIGJlCi0gICAgICogYWxsb2NhdGVkIGZyb20gaGVhZCAtPiBlYXNpZXN0IHRvIHB1dCBpdCBoZXJlICovCi0gICAgbWFjcm9ibG9ja0xheWVyX3QgKm1iTGF5ZXI7Ci0KLSAgICB1MzIgcGVuZGluZ0FjdGl2YXRpb247IC8qIEFjdGl2YXRlIHBhcmFtZXRlciBzZXRzIGFmdGVyIHJldHVybmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEVBREVSU19SRFkgdG8gdGhlIHVzZXIgKi8KLSAgICB1MzIgaW50cmFDb25jZWFsbWVudEZsYWc7IC8qIDAgZ3JheSBwaWN0dXJlIGZvciBjb3JydXB0ZWQgaW50cmEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgcHJldmlvdXMgZnJhbWUgdXNlZCBpZiBhdmFpbGFibGUgKi8KLX0gc3RvcmFnZV90OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgaDI2NGJzZEluaXRTdG9yYWdlKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpOwotdm9pZCBoMjY0YnNkUmVzZXRTdG9yYWdlKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpOwotdTMyIGgyNjRic2RJc1N0YXJ0T2ZQaWN0dXJlKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpOwotdTMyIGgyNjRic2RJc0VuZE9mUGljdHVyZShzdG9yYWdlX3QgKnBTdG9yYWdlKTsKLXUzMiBoMjY0YnNkU3RvcmVTZXFQYXJhbVNldChzdG9yYWdlX3QgKnBTdG9yYWdlLCBzZXFQYXJhbVNldF90ICpwU2VxUGFyYW1TZXQpOwotdTMyIGgyNjRic2RTdG9yZVBpY1BhcmFtU2V0KHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIHBpY1BhcmFtU2V0X3QgKnBQaWNQYXJhbVNldCk7Ci11MzIgaDI2NGJzZEFjdGl2YXRlUGFyYW1TZXRzKHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIHUzMiBwcHNJZCwgdTMyIGlzSWRyKTsKLXZvaWQgaDI2NGJzZENvbXB1dGVTbGljZUdyb3VwTWFwKHN0b3JhZ2VfdCAqcFN0b3JhZ2UsCi0gICAgdTMyIHNsaWNlR3JvdXBDaGFuZ2VDeWNsZSk7Ci0KLXUzMiBoMjY0YnNkQ2hlY2tBY2Nlc3NVbml0Qm91bmRhcnkoCi0gIHN0cm1EYXRhX3QgKnN0cm0sCi0gIG5hbFVuaXRfdCAqbnVOZXh0LAotICBzdG9yYWdlX3QgKnN0b3JhZ2UsCi0gIHUzMiAqYWNjZXNzVW5pdEJvdW5kYXJ5RmxhZyk7Ci0KLXUzMiBoMjY0YnNkVmFsaWRQYXJhbVNldHMoc3RvcmFnZV90ICpwU3RvcmFnZSk7Ci0KLSNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX1NUT1JBR0VfSCAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc3RyZWFtLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc3RyZWFtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwZDEwODMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3N0cmVhbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLSAgICAgMy4gTW9kdWxlIGRlZmluZXMKLSAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotICAgICA1LiBGdW5jdGlvbnMKLSAgICAgICAgICBoMjY0YnNkR2V0Qml0cwotICAgICAgICAgIGgyNjRic2RTaG93Qml0czMyCi0gICAgICAgICAgaDI2NGJzZEZsdXNoQml0cwotICAgICAgICAgIGgyNjRic2RJc0J5dGVBbGlnbmVkCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zdHJlYW0uaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RHZXRCaXRzCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIFJlYWQgYW5kIHJlbW92ZSBiaXRzIGZyb20gdGhlIHN0cmVhbSBidWZmZXIuCi0KLSAgICAgICAgSW5wdXQ6Ci0gICAgICAgICAgICBwU3RybURhdGEgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQotICAgICAgICAgICAgbnVtQml0cyAgICAgbnVtYmVyIG9mIGJpdHMgdG8gcmVhZAotCi0gICAgICAgIE91dHB1dDoKLSAgICAgICAgICAgIG5vbmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgYml0cyByZWFkIGZyb20gc3RyZWFtCi0gICAgICAgICAgICBFTkRfT0ZfU1RSRUFNIGlmIG5vdCBlbm91Z2ggYml0cyBsZWZ0Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkR2V0Qml0cyhzdHJtRGF0YV90ICpwU3RybURhdGEsIHUzMiBudW1CaXRzKQotewotCi0gICAgdTMyIG91dDsKLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChudW1CaXRzIDwgMzIpOwotCi0gICAgb3V0ID0gaDI2NGJzZFNob3dCaXRzMzIocFN0cm1EYXRhKSA+PiAoMzIgLSBudW1CaXRzKTsKLQotICAgIGlmIChoMjY0YnNkRmx1c2hCaXRzKHBTdHJtRGF0YSwgbnVtQml0cykgPT0gSEFOVFJPX09LKQotICAgIHsKLSAgICAgICAgcmV0dXJuKG91dCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybihFTkRfT0ZfU1RSRUFNKTsKLSAgICB9Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkU2hvd0JpdHMzMgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBSZWFkIDMyIGJpdHMgZnJvbSB0aGUgc3RyZWFtIGJ1ZmZlci4gQnVmZmVyIGlzIGxlZnQgYXMgaXQgaXMsIGkuZS4KLSAgICAgICAgICAgIG5vIGJpdHMgYXJlIHJlbW92ZWQuIEZpcnN0IGJpdCByZWFkIGZyb20gdGhlIHN0cmVhbSBpcyB0aGUgTVNCIG9mCi0gICAgICAgICAgICB0aGUgcmV0dXJuIHZhbHVlLiBJZiB0aGVyZSBpcyBub3QgZW5vdWdoIGJpdHMgaW4gdGhlIGJ1ZmZlciAtPgotICAgICAgICAgICAgYml0cyBiZXlvbmcgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIGFyZSBzZXQgdG8gJzAnIGluIHRoZSByZXR1cm4KLSAgICAgICAgICAgIHZhbHVlLgotCi0gICAgICAgIElucHV0OgotICAgICAgICAgICAgcFN0cm1EYXRhICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKLQotICAgICAgICBPdXRwdXQ6Ci0gICAgICAgICAgICBub25lCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIGJpdHMgcmVhZCBmcm9tIHN0cmVhbQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZFNob3dCaXRzMzIoc3RybURhdGFfdCAqcFN0cm1EYXRhKQotewotCi0gICAgaTMyIGJpdHMsIHNoaWZ0OwotICAgIHUzMiBvdXQ7Ci0gICAgdTggKnBTdHJtOwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zKTsKLSAgICBBU1NFUlQocFN0cm1EYXRhLT5iaXRQb3NJbldvcmQgPCA4KTsKLSAgICBBU1NFUlQocFN0cm1EYXRhLT5iaXRQb3NJbldvcmQgPT0KLSAgICAgICAgICAgKHBTdHJtRGF0YS0+c3RybUJ1ZmZSZWFkQml0cyAmIDB4NykpOwotCi0gICAgcFN0cm0gPSBwU3RybURhdGEtPnBTdHJtQ3VyclBvczsKLQotICAgIC8qIG51bWJlciBvZiBiaXRzIGxlZnQgaW4gdGhlIGJ1ZmZlciAqLwotICAgIGJpdHMgPSAoaTMyKXBTdHJtRGF0YS0+c3RybUJ1ZmZTaXplKjggLSAoaTMyKXBTdHJtRGF0YS0+c3RybUJ1ZmZSZWFkQml0czsKLQotICAgIC8qIGF0IGxlYXN0IDMyLWJpdHMgaW4gdGhlIGJ1ZmZlciAqLwotICAgIGlmIChiaXRzID49IDMyKQotICAgIHsKLSAgICAgICAgdTMyIGJpdFBvc0luV29yZCA9IHBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkOwotICAgICAgICBvdXQgPSAoKHUzMilwU3RybVswXSA8PCAyNCkgfCAoKHUzMilwU3RybVsxXSA8PCAxNikgfAotICAgICAgICAgICAgICAoKHUzMilwU3RybVsyXSA8PCAgOCkgfCAoKHUzMilwU3RybVszXSk7Ci0KLSAgICAgICAgaWYgKGJpdFBvc0luV29yZCkKLSAgICAgICAgewotICAgICAgICAgICAgdTMyIGJ5dGUgPSAodTMyKXBTdHJtWzRdOwotICAgICAgICAgICAgdTMyIHRtcCA9ICg4LWJpdFBvc0luV29yZCk7Ci0gICAgICAgICAgICBvdXQgPDw9IGJpdFBvc0luV29yZDsKLSAgICAgICAgICAgIG91dCB8PSBieXRlPj50bXA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChvdXQpOwotICAgIH0KLSAgICAvKiBhdCBsZWFzdCBvbmUgYml0IGluIHRoZSBidWZmZXIgKi8KLSAgICBlbHNlIGlmIChiaXRzID4gMCkKLSAgICB7Ci0gICAgICAgIHNoaWZ0ID0gKGkzMikoMjQgKyBwU3RybURhdGEtPmJpdFBvc0luV29yZCk7Ci0gICAgICAgIG91dCA9ICh1MzIpKCpwU3RybSsrKSA8PCBzaGlmdDsKLSAgICAgICAgYml0cyAtPSAoaTMyKSg4IC0gcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpOwotICAgICAgICB3aGlsZSAoYml0cyA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNoaWZ0IC09IDg7Ci0gICAgICAgICAgICBvdXQgfD0gKHUzMikoKnBTdHJtKyspIDw8IHNoaWZ0OwotICAgICAgICAgICAgYml0cyAtPSA4OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAob3V0KTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gKDApOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEZsdXNoQml0cwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBSZW1vdmUgYml0cyBmcm9tIHRoZSBzdHJlYW0gYnVmZmVyCi0KLSAgICAgICAgSW5wdXQ6Ci0gICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKLSAgICAgICAgICAgIG51bUJpdHMgICAgICAgICBudW1iZXIgb2YgYml0cyB0byByZW1vdmUKLQotICAgICAgICBPdXRwdXQ6Ci0gICAgICAgICAgICBub25lCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBFTkRfT0ZfU1RSRUFNICAgbm90IGVub3VnaCBiaXRzIGxlZnQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZm5kZWYgSDI2NERFQ19ORU9OCi11MzIgaDI2NGJzZEZsdXNoQml0cyhzdHJtRGF0YV90ICpwU3RybURhdGEsIHUzMiBudW1CaXRzKQotewotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBTdHJtRGF0YS0+cFN0cm1CdWZmU3RhcnQpOwotICAgIEFTU0VSVChwU3RybURhdGEtPnBTdHJtQ3VyclBvcyk7Ci0gICAgQVNTRVJUKHBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkIDwgOCk7Ci0gICAgQVNTRVJUKHBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkID09IChwU3RybURhdGEtPnN0cm1CdWZmUmVhZEJpdHMgJiAweDcpKTsKLQotICAgIHBTdHJtRGF0YS0+c3RybUJ1ZmZSZWFkQml0cyArPSBudW1CaXRzOwotICAgIHBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkID0gcFN0cm1EYXRhLT5zdHJtQnVmZlJlYWRCaXRzICYgMHg3OwotICAgIGlmICggKHBTdHJtRGF0YS0+c3RybUJ1ZmZSZWFkQml0cyApIDw9ICg4KnBTdHJtRGF0YS0+c3RybUJ1ZmZTaXplKSApCi0gICAgewotICAgICAgICBwU3RybURhdGEtPnBTdHJtQ3VyclBvcyA9IHBTdHJtRGF0YS0+cFN0cm1CdWZmU3RhcnQgKwotICAgICAgICAgICAgKHBTdHJtRGF0YS0+c3RybUJ1ZmZSZWFkQml0cyA+PiAzKTsKLSAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuKEVORF9PRl9TVFJFQU0pOwotCi19Ci0jZW5kaWYKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZElzQnl0ZUFsaWduZWQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgQ2hlY2sgaWYgY3VycmVudCBzdHJlYW0gcG9zaXRpb24gaXMgYnl0ZSBhbGlnbmVkLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdHJtRGF0YSAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIG5vbmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgVFJVRSAgICAgICAgc3RyZWFtIGlzIGJ5dGUgYWxpZ25lZAotICAgICAgICAgICAgRkFMU0UgICAgICAgc3RyZWFtIGlzIG5vdCBieXRlIGFsaWduZWQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RJc0J5dGVBbGlnbmVkKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLS8qIENvZGUgKi8KLQotICAgIGlmICghcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpCi0gICAgICAgIHJldHVybihIQU5UUk9fVFJVRSk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4oSEFOVFJPX0ZBTFNFKTsKLQotfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc3RyZWFtLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc3RyZWFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MDRiNjYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3N0cmVhbS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLSAgICAzLiBEYXRhIHR5cGVzCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIEgyNjRTV0RFQ19TVFJFQU1fSAotI2RlZmluZSBIMjY0U1dERUNfU1RSRUFNX0gKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIERhdGEgdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTggICpwU3RybUJ1ZmZTdGFydDsgICAgLyogcG9pbnRlciB0byBzdGFydCBvZiBzdHJlYW0gYnVmZmVyICovCi0gICAgdTggICpwU3RybUN1cnJQb3M7ICAgICAgLyogY3VycmVudCByZWFkIGFkZHJlc3MgaW4gc3RyZWFtIGJ1ZmZlciAqLwotICAgIHUzMiAgYml0UG9zSW5Xb3JkOyAgICAgIC8qIGJpdCBwb3NpdGlvbiBpbiBzdHJlYW0gYnVmZmVyIGJ5dGUgKi8KLSAgICB1MzIgIHN0cm1CdWZmU2l6ZTsgICAgICAvKiBzaXplIG9mIHN0cmVhbSBidWZmZXIgKGJ5dGVzKSAqLwotICAgIHUzMiAgc3RybUJ1ZmZSZWFkQml0czsgIC8qIG51bWJlciBvZiBiaXRzIHJlYWQgZnJvbSBzdHJlYW0gYnVmZmVyICovCi19IHN0cm1EYXRhX3Q7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RHZXRCaXRzKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgdTMyIG51bUJpdHMpOwotCi11MzIgaDI2NGJzZFNob3dCaXRzMzIoc3RybURhdGFfdCAqcFN0cm1EYXRhKTsKLQotdTMyIGgyNjRic2RGbHVzaEJpdHMoc3RybURhdGFfdCAqcFN0cm1EYXRhLCB1MzIgbnVtQml0cyk7Ci0KLXUzMiBoMjY0YnNkSXNCeXRlQWxpZ25lZChzdHJtRGF0YV90ICopOwotCi0jZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19TVFJFQU1fSCAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdHJhbnNmb3JtLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdHJhbnNmb3JtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYjZkZDAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3RyYW5zZm9ybS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLSAgICAgMy4gTW9kdWxlIGRlZmluZXMKLSAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotICAgICA1LiBGdW5jdGlvbnMKLSAgICAgICAgICBoMjY0YnNkUHJvY2Vzc0Jsb2NrCi0gICAgICAgICAgaDI2NGJzZFByb2Nlc3NMdW1hRGMKLSAgICAgICAgICBoMjY0YnNkUHJvY2Vzc0Nocm9tYURjCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3RyYW5zZm9ybS5oIgotI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBTd2l0Y2ggb2ZmIHRoZSBmb2xsb3dpbmcgTGludCBtZXNzYWdlcyBmb3IgdGhpcyBmaWxlOgotICogSW5mbyA3MDE6IFNoaWZ0IGxlZnQgb2Ygc2lnbmVkIHF1YW50aXR5IChpbnQpCi0gKiBJbmZvIDcwMjogU2hpZnQgcmlnaHQgb2Ygc2lnbmVkIHF1YW50aXR5IChpbnQpCi0gKi8KLS8qbGludCAtZTcwMSAtZTcwMiAqLwotCi0vKiBMZXZlbFNjYWxlIGZ1bmN0aW9uICovCi1zdGF0aWMgY29uc3QgaTMyIGxldmVsU2NhbGVbNl1bM10gPSB7Ci0gICAgezEwLDEzLDE2fSwgezExLDE0LDE4fSwgezEzLDE2LDIwfSwgezE0LDE4LDIzfSwgezE2LDIwLDI1fSwgezE4LDIzLDI5fX07Ci0KLS8qIHFwICUgNiBhcyBhIGZ1bmN0aW9uIG9mIHFwICovCi1zdGF0aWMgY29uc3QgdTggcXBNb2Q2WzUyXSA9IHswLDEsMiwzLDQsNSwwLDEsMiwzLDQsNSwwLDEsMiwzLDQsNSwwLDEsMiwzLDQsNSwKLSAgICAwLDEsMiwzLDQsNSwwLDEsMiwzLDQsNSwwLDEsMiwzLDQsNSwwLDEsMiwzLDQsNSwwLDEsMiwzfTsKLQotLyogcXAgLyA2IGFzIGEgZnVuY3Rpb24gb2YgcXAgKi8KLXN0YXRpYyBjb25zdCB1OCBxcERpdjZbNTJdID0gezAsMCwwLDAsMCwwLDEsMSwxLDEsMSwxLDIsMiwyLDIsMiwyLDMsMywzLDMsMywzLAotICAgIDQsNCw0LDQsNCw0LDUsNSw1LDUsNSw1LDYsNiw2LDYsNiw2LDcsNyw3LDcsNyw3LDgsOCw4LDh9OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZFByb2Nlc3NCbG9jawotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIHppZy16YWcgc2NhbiwgaW52ZXJzZSBzY2FsaW5nIGFuZAotICAgICAgICAgICAgaW52ZXJzZSB0cmFuc2Zvcm0gZm9yIGEgbHVtYSBvciBhIGNocm9tYSByZXNpZHVhbCBibG9jawotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIGRhdGEgICAgICAgICAgICBwb2ludGVyIHRvIGRhdGEgdG8gYmUgcHJvY2Vzc2VkCi0gICAgICAgICAgICBxcCAgICAgICAgICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlcgotICAgICAgICAgICAgc2tpcCAgICAgICAgICAgIHNraXAgcHJvY2Vzc2luZyBvZiBkYXRhWzBdLCBzZXQgdG8gbm9uLXplcm8gdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBkYyBjb2VmZiBoYW5sZWQgc2VwYXJhdGVseQotICAgICAgICAgICAgY29lZmZNYXAgICAgICAgIDE2IGxzYidzIGluZGljYXRlIHdoaWNoIGNvZWZmcyBhcmUgbm9uLXplcm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0IDAgKGxzYikgZm9yIGNvZWZmIDAsIGJpdCAxIGZvciBjb2VmZiAxIGV0Yy4KLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgZGF0YSAgICAgICAgICAgIHByb2Nlc3NlZCBkYXRhCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgcHJvY2Vzc2VkIGRhdGEgbm90IGluIHZhbGlkIHJhbmdlIFstNTEyLCA1MTFdCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi11MzIgaDI2NGJzZFByb2Nlc3NCbG9jayhpMzIgKmRhdGEsIHUzMiBxcCwgdTMyIHNraXAsIHUzMiBjb2VmZk1hcCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICBpMzIgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKLSAgICBpMzIgZDEsIGQyLCBkMzsKLSAgICB1MzIgcm93LGNvbDsKLSAgICB1MzIgcXBEaXY7Ci0gICAgaTMyICpwdHI7Ci0KLS8qIENvZGUgKi8KLQotICAgIHFwRGl2ID0gcXBEaXY2W3FwXTsKLSAgICB0bXAxID0gbGV2ZWxTY2FsZVtxcE1vZDZbcXBdXVswXSA8PCBxcERpdjsKLSAgICB0bXAyID0gbGV2ZWxTY2FsZVtxcE1vZDZbcXBdXVsxXSA8PCBxcERpdjsKLSAgICB0bXAzID0gbGV2ZWxTY2FsZVtxcE1vZDZbcXBdXVsyXSA8PCBxcERpdjsKLQotICAgIGlmICghc2tpcCkKLSAgICAgICAgZGF0YVswXSA9IChkYXRhWzBdICogdG1wMSk7Ci0KLSAgICAvKiBhdCBsZWFzdCBvbmUgb2YgdGhlIHJvd3MgMSwgMiBvciAzIGNvbnRhaW4gbm9uLXplcm8gY29lZmZzLCBtYXNrIHRha2VzCi0gICAgICogdGhlIHNjYW5uaW5nIG9yZGVyIGludG8gYWNjb3VudCAqLwotICAgIGlmIChjb2VmZk1hcCAmIDB4RkY5QykKLSAgICB7Ci0gICAgICAgIC8qIGRvIHRoZSB6aWctemFnIHNjYW4gYW5kIGludmVyc2UgcXVhbnRpemF0aW9uICovCi0gICAgICAgIGQxID0gZGF0YVsxXTsKLSAgICAgICAgZDIgPSBkYXRhWzE0XTsKLSAgICAgICAgZDMgPSBkYXRhWzE1XTsKLSAgICAgICAgZGF0YVsxXSA9IChkMSAqIHRtcDIpOwotICAgICAgICBkYXRhWzE0XSA9IChkMiAqIHRtcDIpOwotICAgICAgICBkYXRhWzE1XSA9IChkMyAqIHRtcDMpOwotCi0gICAgICAgIGQxID0gZGF0YVsyXTsKLSAgICAgICAgZDIgPSBkYXRhWzVdOwotICAgICAgICBkMyA9IGRhdGFbNF07Ci0gICAgICAgIGRhdGFbNF0gPSAoZDEgKiB0bXAyKTsKLSAgICAgICAgZGF0YVsyXSAgPSAoZDIgKiB0bXAxKTsKLSAgICAgICAgZGF0YVs1XSA9IChkMyAqIHRtcDMpOwotCi0gICAgICAgIGQxID0gZGF0YVs4XTsKLSAgICAgICAgZDIgPSBkYXRhWzNdOwotICAgICAgICBkMyA9IGRhdGFbNl07Ci0gICAgICAgIHRtcDAgPSAoZDEgKiB0bXAyKTsKLSAgICAgICAgZGF0YVs4XSA9IChkMiAqIHRtcDEpOwotICAgICAgICBkYXRhWzNdICA9IChkMyAqIHRtcDIpOwotICAgICAgICBkMSA9IGRhdGFbN107Ci0gICAgICAgIGQyID0gZGF0YVsxMl07Ci0gICAgICAgIGQzID0gZGF0YVs5XTsKLSAgICAgICAgZGF0YVs2XSAgPSAoZDEgKiB0bXAyKTsKLSAgICAgICAgZGF0YVs3XSAgPSAoZDIgKiB0bXAzKTsKLSAgICAgICAgZGF0YVsxMl0gPSAoZDMgKiB0bXAyKTsKLSAgICAgICAgZGF0YVs5XSAgPSB0bXAwOwotCi0gICAgICAgIGQxID0gZGF0YVsxMF07Ci0gICAgICAgIGQyID0gZGF0YVsxMV07Ci0gICAgICAgIGQzID0gZGF0YVsxM107Ci0gICAgICAgIGRhdGFbMTNdID0gKGQxICogdG1wMyk7Ci0gICAgICAgIGRhdGFbMTBdID0gKGQyICogdG1wMSk7Ci0gICAgICAgIGRhdGFbMTFdID0gKGQzICogdG1wMik7Ci0KLSAgICAgICAgLyogaG9yaXpvbnRhbCB0cmFuc2Zvcm0gKi8KLSAgICAgICAgZm9yIChyb3cgPSA0LCBwdHIgPSBkYXRhOyByb3ctLTsgcHRyICs9IDQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcDAgPSBwdHJbMF0gKyBwdHJbMl07Ci0gICAgICAgICAgICB0bXAxID0gcHRyWzBdIC0gcHRyWzJdOwotICAgICAgICAgICAgdG1wMiA9IChwdHJbMV0gPj4gMSkgLSBwdHJbM107Ci0gICAgICAgICAgICB0bXAzID0gcHRyWzFdICsgKHB0clszXSA+PiAxKTsKLSAgICAgICAgICAgIHB0clswXSA9IHRtcDAgKyB0bXAzOwotICAgICAgICAgICAgcHRyWzFdID0gdG1wMSArIHRtcDI7Ci0gICAgICAgICAgICBwdHJbMl0gPSB0bXAxIC0gdG1wMjsKLSAgICAgICAgICAgIHB0clszXSA9IHRtcDAgLSB0bXAzOwotICAgICAgICB9Ci0KLSAgICAgICAgLypsaW50ICtlNjYxICtlNjYyKi8KLSAgICAgICAgLyogdGhlbiB2ZXJ0aWNhbCB0cmFuc2Zvcm0gKi8KLSAgICAgICAgZm9yIChjb2wgPSA0OyBjb2wtLTsgZGF0YSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAwID0gZGF0YVswXSArIGRhdGFbOF07Ci0gICAgICAgICAgICB0bXAxID0gZGF0YVswXSAtIGRhdGFbOF07Ci0gICAgICAgICAgICB0bXAyID0gKGRhdGFbNF0gPj4gMSkgLSBkYXRhWzEyXTsKLSAgICAgICAgICAgIHRtcDMgPSBkYXRhWzRdICsgKGRhdGFbMTJdID4+IDEpOwotICAgICAgICAgICAgZGF0YVswIF0gPSAodG1wMCArIHRtcDMgKyAzMik+PjY7Ci0gICAgICAgICAgICBkYXRhWzQgXSA9ICh0bXAxICsgdG1wMiArIDMyKT4+NjsKLSAgICAgICAgICAgIGRhdGFbOCBdID0gKHRtcDEgLSB0bXAyICsgMzIpPj42OwotICAgICAgICAgICAgZGF0YVsxMl0gPSAodG1wMCAtIHRtcDMgKyAzMik+PjY7Ci0gICAgICAgICAgICAvKiBjaGVjayB0aGF0IGVhY2ggdmFsdWUgaXMgaW4gdGhlIHJhbmdlIFstNTEyLDUxMV0gKi8KLSAgICAgICAgICAgIGlmICgoKHUzMikoZGF0YVswXSArIDUxMikgPiAxMDIzKSB8fAotICAgICAgICAgICAgICAgICgodTMyKShkYXRhWzRdICsgNTEyKSA+IDEwMjMpIHx8Ci0gICAgICAgICAgICAgICAgKCh1MzIpKGRhdGFbOF0gKyA1MTIpID4gMTAyMykgfHwKLSAgICAgICAgICAgICAgICAoKHUzMikoZGF0YVsxMl0gKyA1MTIpID4gMTAyMykgKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIC8qIHJvd3MgMSwgMiBhbmQgMyBhcmUgemVybyAqLwotICAgIHsKLSAgICAgICAgLyogb25seSBkYy1jb2VmZiBpcyBub24temVybywgaS5lLiBjb2VmZnMgYXQgb3JpZ2luYWwgcG9zaXRpb25zCi0gICAgICAgICAqIDEsIDUgYW5kIDYgYXJlIHplcm8gKi8KLSAgICAgICAgaWYgKChjb2VmZk1hcCAmIDB4NjIpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcDAgPSAoZGF0YVswXSArIDMyKSA+PiA2OwotICAgICAgICAgICAgLyogY2hlY2sgdGhhdCB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgWy01MTIsNTExXSAqLwotICAgICAgICAgICAgaWYgKCh1MzIpKHRtcDAgKyA1MTIpID4gMTAyMykKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICBkYXRhWzBdID0gZGF0YVsxXSAgPSBkYXRhWzJdICA9IGRhdGFbM10gID0gZGF0YVs0XSAgPSBkYXRhWzVdICA9Ci0gICAgICAgICAgICAgICAgICAgICAgZGF0YVs2XSAgPSBkYXRhWzddICA9IGRhdGFbOF0gID0gZGF0YVs5XSAgPSBkYXRhWzEwXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgZGF0YVsxMV0gPSBkYXRhWzEyXSA9IGRhdGFbMTNdID0gZGF0YVsxNF0gPSBkYXRhWzE1XSA9Ci0gICAgICAgICAgICAgICAgICAgICAgdG1wMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIC8qIGF0IGxlYXN0IG9uZSBvZiB0aGUgY29lZmZzIDEsIDUgb3IgNiBpcyBub24temVybyAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBkYXRhWzFdID0gKGRhdGFbMV0gKiB0bXAyKTsKLSAgICAgICAgICAgIGRhdGFbMl0gPSAoZGF0YVs1XSAqIHRtcDEpOwotICAgICAgICAgICAgZGF0YVszXSA9IChkYXRhWzZdICogdG1wMik7Ci0gICAgICAgICAgICB0bXAwID0gZGF0YVswXSArIGRhdGFbMl07Ci0gICAgICAgICAgICB0bXAxID0gZGF0YVswXSAtIGRhdGFbMl07Ci0gICAgICAgICAgICB0bXAyID0gKGRhdGFbMV0gPj4gMSkgLSBkYXRhWzNdOwotICAgICAgICAgICAgdG1wMyA9IGRhdGFbMV0gKyAoZGF0YVszXSA+PiAxKTsKLSAgICAgICAgICAgIGRhdGFbMF0gPSAodG1wMCArIHRtcDMgKyAzMik+PjY7Ci0gICAgICAgICAgICBkYXRhWzFdID0gKHRtcDEgKyB0bXAyICsgMzIpPj42OwotICAgICAgICAgICAgZGF0YVsyXSA9ICh0bXAxIC0gdG1wMiArIDMyKT4+NjsKLSAgICAgICAgICAgIGRhdGFbM10gPSAodG1wMCAtIHRtcDMgKyAzMik+PjY7Ci0gICAgICAgICAgICBkYXRhWzRdID0gZGF0YVs4XSA9IGRhdGFbMTJdID0gZGF0YVswXTsKLSAgICAgICAgICAgIGRhdGFbNV0gPSBkYXRhWzldID0gZGF0YVsxM10gPSBkYXRhWzFdOwotICAgICAgICAgICAgZGF0YVs2XSA9IGRhdGFbMTBdID0gZGF0YVsxNF0gPSBkYXRhWzJdOwotICAgICAgICAgICAgZGF0YVs3XSA9IGRhdGFbMTFdID0gZGF0YVsxNV0gPSBkYXRhWzNdOwotICAgICAgICAgICAgLyogY2hlY2sgdGhhdCBlYWNoIHZhbHVlIGlzIGluIHRoZSByYW5nZSBbLTUxMiw1MTFdICovCi0gICAgICAgICAgICBpZiAoKCh1MzIpKGRhdGFbMF0gKyA1MTIpID4gMTAyMykgfHwKLSAgICAgICAgICAgICAgICAoKHUzMikoZGF0YVsxXSArIDUxMikgPiAxMDIzKSB8fAotICAgICAgICAgICAgICAgICgodTMyKShkYXRhWzJdICsgNTEyKSA+IDEwMjMpIHx8Ci0gICAgICAgICAgICAgICAgKCh1MzIpKGRhdGFbM10gKyA1MTIpID4gMTAyMykgKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZFByb2Nlc3NMdW1hRGMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSB6aWctemFnIHNjYW4sIGludmVyc2UgdHJhbnNmb3JtIGFuZAotICAgICAgICAgICAgaW52ZXJzZSBzY2FsaW5nIGZvciBhIGx1bWEgREMgY29lZmZpY2llbnRzIGJsb2NrCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgZGF0YSAgICAgICAgICAgIHBvaW50ZXIgdG8gZGF0YSB0byBiZSBwcm9jZXNzZWQKLSAgICAgICAgICAgIHFwICAgICAgICAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIGRhdGEgICAgICAgICAgICBwcm9jZXNzZWQgZGF0YQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBub25lCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIGgyNjRic2RQcm9jZXNzTHVtYURjKGkzMiAqZGF0YSwgdTMyIHFwKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIGkzMiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOwotICAgIHUzMiByb3csY29sOwotICAgIHUzMiBxcE1vZCwgcXBEaXY7Ci0gICAgaTMyIGxldlNjYWxlOwotICAgIGkzMiAqcHRyOwotCi0vKiBDb2RlICovCi0KLSAgICBxcE1vZCA9IHFwTW9kNltxcF07Ci0gICAgcXBEaXYgPSBxcERpdjZbcXBdOwotCi0gICAgLyogemlnLXphZyBzY2FuICovCi0gICAgdG1wMCA9IGRhdGFbMl07Ci0gICAgZGF0YVsyXSAgPSBkYXRhWzVdOwotICAgIGRhdGFbNV0gPSBkYXRhWzRdOwotICAgIGRhdGFbNF0gPSB0bXAwOwotCi0gICAgdG1wMCA9IGRhdGFbOF07Ci0gICAgZGF0YVs4XSA9IGRhdGFbM107Ci0gICAgZGF0YVszXSAgPSBkYXRhWzZdOwotICAgIGRhdGFbNl0gID0gZGF0YVs3XTsKLSAgICBkYXRhWzddICA9IGRhdGFbMTJdOwotICAgIGRhdGFbMTJdID0gZGF0YVs5XTsKLSAgICBkYXRhWzldICA9IHRtcDA7Ci0KLSAgICB0bXAwID0gZGF0YVsxMF07Ci0gICAgZGF0YVsxMF0gPSBkYXRhWzExXTsKLSAgICBkYXRhWzExXSA9IGRhdGFbMTNdOwotICAgIGRhdGFbMTNdID0gdG1wMDsKLQotICAgIC8qIGhvcml6b250YWwgdHJhbnNmb3JtICovCi0gICAgZm9yIChyb3cgPSA0LCBwdHIgPSBkYXRhOyByb3ctLTsgcHRyICs9IDQpCi0gICAgewotICAgICAgICB0bXAwID0gcHRyWzBdICsgcHRyWzJdOwotICAgICAgICB0bXAxID0gcHRyWzBdIC0gcHRyWzJdOwotICAgICAgICB0bXAyID0gcHRyWzFdIC0gcHRyWzNdOwotICAgICAgICB0bXAzID0gcHRyWzFdICsgcHRyWzNdOwotICAgICAgICBwdHJbMF0gPSB0bXAwICsgdG1wMzsKLSAgICAgICAgcHRyWzFdID0gdG1wMSArIHRtcDI7Ci0gICAgICAgIHB0clsyXSA9IHRtcDEgLSB0bXAyOwotICAgICAgICBwdHJbM10gPSB0bXAwIC0gdG1wMzsKLSAgICB9Ci0KLSAgICAvKmxpbnQgK2U2NjEgK2U2NjIqLwotICAgIC8qIHRoZW4gdmVydGljYWwgdHJhbnNmb3JtIGFuZCBpbnZlcnNlIHNjYWxpbmcgKi8KLSAgICBsZXZTY2FsZSA9IGxldmVsU2NhbGVbIHFwTW9kIF1bMF07Ci0gICAgaWYgKHFwID49IDEyKQotICAgIHsKLSAgICAgICAgbGV2U2NhbGUgPDw9IChxcERpdi0yKTsKLSAgICAgICAgZm9yIChjb2wgPSA0OyBjb2wtLTsgZGF0YSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAwID0gZGF0YVswXSArIGRhdGFbOCBdOwotICAgICAgICAgICAgdG1wMSA9IGRhdGFbMF0gLSBkYXRhWzggXTsKLSAgICAgICAgICAgIHRtcDIgPSBkYXRhWzRdIC0gZGF0YVsxMl07Ci0gICAgICAgICAgICB0bXAzID0gZGF0YVs0XSArIGRhdGFbMTJdOwotICAgICAgICAgICAgZGF0YVswIF0gPSAoKHRtcDAgKyB0bXAzKSpsZXZTY2FsZSk7Ci0gICAgICAgICAgICBkYXRhWzQgXSA9ICgodG1wMSArIHRtcDIpKmxldlNjYWxlKTsKLSAgICAgICAgICAgIGRhdGFbOCBdID0gKCh0bXAxIC0gdG1wMikqbGV2U2NhbGUpOwotICAgICAgICAgICAgZGF0YVsxMl0gPSAoKHRtcDAgLSB0bXAzKSpsZXZTY2FsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaTMyIHRtcDsKLSAgICAgICAgdG1wID0gKCgxIC0gcXBEaXYpID09IDApID8gMSA6IDI7Ci0gICAgICAgIGZvciAoY29sID0gNDsgY29sLS07IGRhdGErKykKLSAgICAgICAgewotICAgICAgICAgICAgdG1wMCA9IGRhdGFbMF0gKyBkYXRhWzggXTsKLSAgICAgICAgICAgIHRtcDEgPSBkYXRhWzBdIC0gZGF0YVs4IF07Ci0gICAgICAgICAgICB0bXAyID0gZGF0YVs0XSAtIGRhdGFbMTJdOwotICAgICAgICAgICAgdG1wMyA9IGRhdGFbNF0gKyBkYXRhWzEyXTsKLSAgICAgICAgICAgIGRhdGFbMCBdID0gKCh0bXAwICsgdG1wMykqbGV2U2NhbGUrdG1wKSA+PiAoMi1xcERpdik7Ci0gICAgICAgICAgICBkYXRhWzQgXSA9ICgodG1wMSArIHRtcDIpKmxldlNjYWxlK3RtcCkgPj4gKDItcXBEaXYpOwotICAgICAgICAgICAgZGF0YVs4IF0gPSAoKHRtcDEgLSB0bXAyKSpsZXZTY2FsZSt0bXApID4+ICgyLXFwRGl2KTsKLSAgICAgICAgICAgIGRhdGFbMTJdID0gKCh0bXAwIC0gdG1wMykqbGV2U2NhbGUrdG1wKSA+PiAoMi1xcERpdik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkUHJvY2Vzc0Nocm9tYURjCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgdHJhbnNmb3JtIGFuZCBpbnZlcnNlIHNjYWxpbmcgZm9yIGEKLSAgICAgICAgICAgIGNocm9tYSBEQyBjb2VmZmljaWVudHMgYmxvY2sKLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBkYXRhICAgICAgICAgICAgcG9pbnRlciB0byBkYXRhIHRvIGJlIHByb2Nlc3NlZAotICAgICAgICAgICAgcXAgICAgICAgICAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgZGF0YSAgICAgICAgICAgIHByb2Nlc3NlZCBkYXRhCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIG5vbmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgaDI2NGJzZFByb2Nlc3NDaHJvbWFEYyhpMzIgKmRhdGEsIHUzMiBxcCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICBpMzIgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKLSAgICB1MzIgcXBEaXY7Ci0gICAgaTMyIGxldlNjYWxlOwotICAgIHUzMiBsZXZTaGlmdDsKLQotLyogQ29kZSAqLwotCi0gICAgcXBEaXYgPSBxcERpdjZbcXBdOwotICAgIGxldlNjYWxlID0gbGV2ZWxTY2FsZVsgcXBNb2Q2W3FwXSBdWzBdOwotCi0gICAgaWYgKHFwID49IDYpCi0gICAgewotICAgICAgICBsZXZTY2FsZSA8PD0gKHFwRGl2LTEpOwotICAgICAgICBsZXZTaGlmdCA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGxldlNoaWZ0ID0gMTsKLSAgICB9Ci0KLSAgICB0bXAwID0gZGF0YVswXSArIGRhdGFbMl07Ci0gICAgdG1wMSA9IGRhdGFbMF0gLSBkYXRhWzJdOwotICAgIHRtcDIgPSBkYXRhWzFdIC0gZGF0YVszXTsKLSAgICB0bXAzID0gZGF0YVsxXSArIGRhdGFbM107Ci0gICAgZGF0YVswXSA9ICgodG1wMCArIHRtcDMpICogbGV2U2NhbGUpID4+IGxldlNoaWZ0OwotICAgIGRhdGFbMV0gPSAoKHRtcDAgLSB0bXAzKSAqIGxldlNjYWxlKSA+PiBsZXZTaGlmdDsKLSAgICBkYXRhWzJdID0gKCh0bXAxICsgdG1wMikgKiBsZXZTY2FsZSkgPj4gbGV2U2hpZnQ7Ci0gICAgZGF0YVszXSA9ICgodG1wMSAtIHRtcDIpICogbGV2U2NhbGUpID4+IGxldlNoaWZ0OwotICAgIHRtcDAgPSBkYXRhWzRdICsgZGF0YVs2XTsKLSAgICB0bXAxID0gZGF0YVs0XSAtIGRhdGFbNl07Ci0gICAgdG1wMiA9IGRhdGFbNV0gLSBkYXRhWzddOwotICAgIHRtcDMgPSBkYXRhWzVdICsgZGF0YVs3XTsKLSAgICBkYXRhWzRdID0gKCh0bXAwICsgdG1wMykgKiBsZXZTY2FsZSkgPj4gbGV2U2hpZnQ7Ci0gICAgZGF0YVs1XSA9ICgodG1wMCAtIHRtcDMpICogbGV2U2NhbGUpID4+IGxldlNoaWZ0OwotICAgIGRhdGFbNl0gPSAoKHRtcDEgKyB0bXAyKSAqIGxldlNjYWxlKSA+PiBsZXZTaGlmdDsKLSAgICBkYXRhWzddID0gKCh0bXAxIC0gdG1wMikgKiBsZXZTY2FsZSkgPj4gbGV2U2hpZnQ7Ci0KLX0KLQotLypsaW50ICtlNzAxICtlNzAyICovCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3RyYW5zZm9ybS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3RyYW5zZm9ybS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjQxYTIzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF90cmFuc2Zvcm0uaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0gICAgMy4gRGF0YSB0eXBlcwotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBIMjY0U1dERUNfVFJBTlNGT1JNX0gKLSNkZWZpbmUgSDI2NFNXREVDX1RSQU5TRk9STV9ICi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBEYXRhIHR5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkUHJvY2Vzc0Jsb2NrKGkzMiAqZGF0YSwgdTMyIHFwLCB1MzIgc2tpcCwgdTMyIGNvZWZmTWFwKTsKLXZvaWQgaDI2NGJzZFByb2Nlc3NMdW1hRGMoaTMyICpkYXRhLCB1MzIgcXApOwotdm9pZCBoMjY0YnNkUHJvY2Vzc0Nocm9tYURjKGkzMiAqZGF0YSwgdTMyIHFwKTsKLQotI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfVFJBTlNGT1JNX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3V0aWwuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF91dGlsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiOTdhMjguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3V0aWwuYworKysgL2Rldi9udWxsCkBAIC0xLDI4NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0gICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0gICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgICAgNS4gRnVuY3Rpb25zCi0gICAgICAgICAgaDI2NGJzZENvdW50TGVhZGluZ1plcm9zCi0gICAgICAgICAgaDI2NGJzZFJic3BUcmFpbGluZ0JpdHMKLSAgICAgICAgICBoMjY0YnNkTW9yZVJic3BEYXRhCi0gICAgICAgICAgaDI2NGJzZE5leHRNYkFkZHJlc3MKLSAgICAgICAgICBoMjY0YnNkU2V0Q3VyckltYWdlTWJQb2ludGVycwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBsb29rLXVwIHRhYmxlIGZvciBleHBlY3RlZCB2YWx1ZXMgb2Ygc3R1ZmZpbmcgYml0cyAqLwotc3RhdGljIGNvbnN0IHUzMiBzdHVmZmluZ1RhYmxlWzhdID0gezB4MSwweDIsMHg0LDB4OCwweDEwLDB4MjAsMHg0MCwweDgwfTsKLQotLyogbG9vay11cCB0YWJsZSBmb3IgY2hyb21hIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYXMgYSBmdW5jdGlvbiBvZiBsdW1hIFFQICovCi1jb25zdCB1MzIgaDI2NGJzZFFwQ1s1Ml0gPSB7MCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwKLSAgICAyMCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwyOSwyOSwzMCwzMSwzMiwzMiwzMywzNCwzNCwzNSwzNSwzNiwzNiwzNywzNywzNywKLSAgICAzOCwzOCwzOCwzOSwzOSwzOSwzOX07Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgNS4xICBGdW5jdGlvbjogaDI2NGJzZENvdW50TGVhZGluZ1plcm9zCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIENvdW50IGxlYWRpbmcgemVyb3MgaW4gYSBjb2RlIHdvcmQuIENvZGUgd29yZCBpcyBhc3N1bWVkIHRvIGJlCi0gICAgICAgICAgICByaWdodC1hbGlnbmVkLCBsYXN0IGJpdCBvZiB0aGUgY29kZSB3b3JkIGluIHRoZSBsc2Igb2YgdGhlIHZhbHVlLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHZhbHVlICAgY29kZSB3b3JkCi0gICAgICAgICAgICBsZW5ndGggIG51bWJlciBvZiBiaXRzIGluIHRoZSBjb2RlIHdvcmQKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgbm9uZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBudW1iZXIgb2YgbGVhZGluZyB6ZXJvcyBpbiB0aGUgY29kZSB3b3JkCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWZuZGVmIEgyNjRERUNfTkVPTgotdTMyIGgyNjRic2RDb3VudExlYWRpbmdaZXJvcyh1MzIgdmFsdWUsIHUzMiBsZW5ndGgpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHplcm9zID0gMDsKLSAgICB1MzIgbWFzayA9IDEgPDwgKGxlbmd0aCAtIDEpOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQobGVuZ3RoIDw9IDMyKTsKLQotICAgIHdoaWxlIChtYXNrICYmICEodmFsdWUgJiBtYXNrKSkKLSAgICB7Ci0gICAgICAgIHplcm9zKys7Ci0gICAgICAgIG1hc2sgPj49IDE7Ci0gICAgfQotICAgIHJldHVybih6ZXJvcyk7Ci0KLX0KLSNlbmRpZgotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgNS4yICBGdW5jdGlvbjogaDI2NGJzZFJic3BUcmFpbGluZ0JpdHMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgQ2hlY2sgUmF3IEJ5dGUgU3RyZWFtIFBheWxvYWQgKFJCU1ApIHRyYWlsaW5nIGJpdHMsIGkuZS4gc3R1ZmZpbmcuCi0gICAgICAgICAgICBSZXN0IG9mIHRoZSBjdXJyZW50IGJ5dGUgKHdob2xlIGJ5dGUgaWYgYWxscmVhZHkgYnl0ZSBhbGlnbmVkKQotICAgICAgICAgICAgaW4gdGhlIHN0cmVhbSBidWZmZXIgc2hhbGwgY29udGFpbiBhICcxJyBiaXQgZm9sbG93ZWQgYnkgemVybyBvcgotICAgICAgICAgICAgbW9yZSAnMCcgYml0cy4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RybURhdGEgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBub25lCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgIFJCU1AgdHJhaWxpbmcgYml0cyBmb3VuZAotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgb3RoZXJ3aXNlCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkUmJzcFRyYWlsaW5nQml0cyhzdHJtRGF0YV90ICpwU3RybURhdGEpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHN0dWZmaW5nOwotICAgIHUzMiBzdHVmZmluZ0xlbmd0aDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkIDwgOCk7Ci0KLSAgICBzdHVmZmluZ0xlbmd0aCA9IDggLSBwU3RybURhdGEtPmJpdFBvc0luV29yZDsKLQotICAgIHN0dWZmaW5nID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCBzdHVmZmluZ0xlbmd0aCk7Ci0gICAgaWYgKHN0dWZmaW5nID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIGlmIChzdHVmZmluZyAhPSBzdHVmZmluZ1RhYmxlW3N0dWZmaW5nTGVuZ3RoIC0gMV0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIDUuMyAgRnVuY3Rpb246IGgyNjRic2RNb3JlUmJzcERhdGEKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgQ2hlY2sgaWYgdGhlcmUgaXMgbW9yZSBkYXRhIGluIHRoZSBjdXJyZW50IFJCU1AuIFRoZSBzdGFuZGFyZAotICAgICAgICAgICAgZGVmaW5lcyB0aGlzIGZ1bmN0aW9uIHNvIHRoYXQgdGhlcmUgaXMgbW9yZSBkYXRhIGlmCi0gICAgICAgICAgICAgICAgLW1vcmUgdGhhbiA4IGJpdHMgbGVmdCBvcgotICAgICAgICAgICAgICAgIC1sYXN0IGJpdHMgYXJlIG5vdCBSQlNQIHRyYWlsaW5nIGJpdHMKLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RybURhdGEgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBub25lCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19UUlVFICAgIHRoZXJlIGlzIG1vcmUgZGF0YQotICAgICAgICAgICAgSEFOVFJPX0ZBTFNFICAgbm8gbW9yZSBkYXRhCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkTW9yZVJic3BEYXRhKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgYml0czsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBTdHJtRGF0YS0+c3RybUJ1ZmZSZWFkQml0cyA8PSA4ICogcFN0cm1EYXRhLT5zdHJtQnVmZlNpemUpOwotCi0gICAgYml0cyA9IHBTdHJtRGF0YS0+c3RybUJ1ZmZTaXplICogOCAtIHBTdHJtRGF0YS0+c3RybUJ1ZmZSZWFkQml0czsKLQotICAgIGlmIChiaXRzID09IDApCi0gICAgICAgIHJldHVybihIQU5UUk9fRkFMU0UpOwotCi0gICAgaWYgKCAoYml0cyA+IDgpIHx8Ci0gICAgICAgICAoKGgyNjRic2RTaG93Qml0czMyKHBTdHJtRGF0YSk+PigzMi1iaXRzKSkgIT0gKDF1bCA8PCAoYml0cy0xKSkpICkKLSAgICAgICAgcmV0dXJuKEhBTlRST19UUlVFKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybihIQU5UUk9fRkFMU0UpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIDUuNCAgRnVuY3Rpb246IGgyNjRic2ROZXh0TWJBZGRyZXNzCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEdldCBhZGRyZXNzIG9mIHRoZSBuZXh0IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgc2xpY2UgZ3JvdXAuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFNsaWNlR3JvdXBNYXAgICAgICBzbGljZSBncm91cCBmb3IgZWFjaCBtYWNyb2Jsb2NrCi0gICAgICAgICAgICBwaWNTaXplSW5NYnMgICAgICAgIHNpemUgb2YgdGhlIHBpY3R1cmUKLSAgICAgICAgICAgIGN1cnJNYkFkZHIgICAgICAgICAgd2hlcmUgdG8gc3RhcnQKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgbm9uZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBhZGRyZXNzIG9mIHRoZSBuZXh0IG1hY3JvYmxvY2sKLSAgICAgICAgICAgIDAgICBpZiBub25lIG9mIHRoZSBmb2xsb3dpbmcgbWFjcm9ibG9ja3MgYmVsb25nIHRvIHNhbWUgc2xpY2UKLSAgICAgICAgICAgICAgICBncm91cCBhcyBjdXJyTWJBZGRyCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkTmV4dE1iQWRkcmVzcyh1MzIgKnBTbGljZUdyb3VwTWFwLCB1MzIgcGljU2l6ZUluTWJzLCB1MzIgY3Vyck1iQWRkcikKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaSwgc2xpY2VHcm91cDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTbGljZUdyb3VwTWFwKTsKLSAgICBBU1NFUlQocGljU2l6ZUluTWJzKTsKLSAgICBBU1NFUlQoY3Vyck1iQWRkciA8IHBpY1NpemVJbk1icyk7Ci0KLSAgICBzbGljZUdyb3VwID0gcFNsaWNlR3JvdXBNYXBbY3Vyck1iQWRkcl07Ci0KLSAgICBpID0gY3Vyck1iQWRkciArIDE7Ci0gICAgd2hpbGUgKChpIDwgcGljU2l6ZUluTWJzKSAmJiAocFNsaWNlR3JvdXBNYXBbaV0gIT0gc2xpY2VHcm91cCkpCi0gICAgewotICAgICAgICBpKys7Ci0gICAgfQotCi0gICAgaWYgKGkgPT0gcGljU2l6ZUluTWJzKQotICAgICAgICBpID0gMDsKLQotICAgIHJldHVybihpKTsKLQotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIDUuNSAgRnVuY3Rpb246IGgyNjRic2RTZXRDdXJySW1hZ2VNYlBvaW50ZXJzCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIFNldCBsdW1hIGFuZCBjaHJvbWEgcG9pbnRlcnMgaW4gaW1hZ2VfdCBmb3IgY3VycmVudCBNQgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIGltYWdlICAgICAgIEN1cnJlbnQgaW1hZ2UKLSAgICAgICAgICAgIG1iTnVtICAgICAgIG51bWJlciBvZiBjdXJyZW50IE1CCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIG5vbmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgbm9uZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgaDI2NGJzZFNldEN1cnJJbWFnZU1iUG9pbnRlcnMoaW1hZ2VfdCAqaW1hZ2UsIHUzMiBtYk51bSkKLXsKLSAgICB1MzIgd2lkdGgsIGhlaWdodDsKLSAgICB1MzIgcGljU2l6ZTsKLSAgICB1MzIgcm93LCBjb2w7Ci0gICAgdTMyIHRtcDsKLQotICAgIHdpZHRoID0gaW1hZ2UtPndpZHRoOwotICAgIGhlaWdodCA9IGltYWdlLT5oZWlnaHQ7Ci0gICAgcm93ID0gbWJOdW0gLyB3aWR0aDsKLSAgICBjb2wgPSBtYk51bSAlIHdpZHRoOwotCi0gICAgdG1wID0gcm93ICogd2lkdGg7Ci0gICAgcGljU2l6ZSA9IHdpZHRoICogaGVpZ2h0OwotCi0gICAgaW1hZ2UtPmx1bWEgPSAodTgqKShpbWFnZS0+ZGF0YSArIGNvbCAqIDE2ICsgdG1wICogMjU2KTsKLSAgICBpbWFnZS0+Y2IgPSAodTgqKShpbWFnZS0+ZGF0YSArIHBpY1NpemUgKiAyNTYgKyB0bXAgKiA2NCArIGNvbCAqIDgpOwotICAgIGltYWdlLT5jciA9ICh1OCopKGltYWdlLT5jYiArIHBpY1NpemUgKiA2NCk7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3V0aWwuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF91dGlsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0M2NmODIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3V0aWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotICAgIDMuIERhdGEgdHlwZXMKLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSDI2NFNXREVDX1VUSUxfSAotI2RlZmluZSBIMjY0U1dERUNfVVRJTF9ICi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYgX0FTU0VSVF9VU0VECi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIkgyNjRTd0RlY0FwaS5oIgotCi0jaWYgZGVmaW5lZChfUkFOR0VfQ0hFQ0spIHx8IGRlZmluZWQoX0RFQlVHX1BSSU5UKSB8fCBkZWZpbmVkKF9FUlJPUl9QUklOVCkKLSNpbmNsdWRlIDxzdGRpby5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9pbWFnZS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZGVmaW5lIEhBTlRST19PSyAgIDAKLSNkZWZpbmUgSEFOVFJPX05PSyAgMQotCi0jZGVmaW5lIEhBTlRST19UUlVFICAgICAoMSkKLSNkZWZpbmUgSEFOVFJPX0ZBTFNFICAgICgwKQotCi0jaWZuZGVmIE5VTEwKLSNkZWZpbmUgTlVMTCAwCi0jZW5kaWYKLQotI2RlZmluZSBNRU1PUllfQUxMT0NBVElPTl9FUlJPUiAweEZGRkYKLSNkZWZpbmUgUEFSQU1fU0VUX0VSUk9SIDB4RkZGMAotCi0vKiB2YWx1ZSB0byBiZSByZXR1cm5lZCBieSBHZXRCaXRzIGlmIHN0cmVhbSBidWZmZXIgaXMgZW1wdHkgKi8KLSNkZWZpbmUgRU5EX09GX1NUUkVBTSAweEZGRkZGRkZGVQotCi0jZGVmaW5lIEVNUFRZX1JFU0lEVUFMX0lORElDQVRPUiAweEZGRkZGRgotCi0vKiBtYWNybyB0byBtYXJrIGEgcmVzaWR1YWwgYmxvY2sgZW1wdHksIGkuZS4gY29udGFpbiB6ZXJvIGNvZWZmaWNpZW50cyAqLwotI2RlZmluZSBNQVJLX1JFU0lEVUFMX0VNUFRZKHJlc2lkdWFsKSAoKHJlc2lkdWFsKVswXSA9IEVNUFRZX1JFU0lEVUFMX0lORElDQVRPUikKLS8qIG1hY3JvIHRvIGNoZWNrIGlmIHJlc2lkdWFsIGJsb2NrIGlzIGVtcHR5ICovCi0jZGVmaW5lIElTX1JFU0lEVUFMX0VNUFRZKHJlc2lkdWFsKSAoKHJlc2lkdWFsKVswXSA9PSBFTVBUWV9SRVNJRFVBTF9JTkRJQ0FUT1IpCi0KLS8qIG1hY3JvIGZvciBhc3NlcnRpb24sIHVzZWQgb25seSBpZiBjb21waWxlciBmbGFnIF9BU1NFUlRfVVNFRCBpcyBkZWZpbmVkICovCi0jaWZkZWYgX0FTU0VSVF9VU0VECi0jZGVmaW5lIEFTU0VSVChleHByKSBhc3NlcnQoZXhwcikKLSNlbHNlCi0jZGVmaW5lIEFTU0VSVChleHByKQotI2VuZGlmCi0KLS8qIG1hY3JvIGZvciByYW5nZSBjaGVja2luZyBhbiB2YWx1ZSwgdXNlZCBvbmx5IGlmIGNvbXBpbGVyIGZsYWcgX1JBTkdFX0NIRUNLCi0gKiBpcyBkZWZpbmVkICovCi0jaWZkZWYgX1JBTkdFX0NIRUNLCi0jZGVmaW5lIFJBTkdFX0NIRUNLKHZhbHVlLCBtaW5Cb3VuZCwgbWF4Qm91bmQpIFwKLXsgXAotICAgIGlmICgodmFsdWUpIDwgKG1pbkJvdW5kKSB8fCAodmFsdWUpID4gKG1heEJvdW5kKSkgXAotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IFZhbHVlIGV4Y2VlZHMgZ2l2ZW4gbGltaXQocykhXG4iKTsgXAotfQotI2Vsc2UKLSNkZWZpbmUgUkFOR0VfQ0hFQ0sodmFsdWUsIG1pbkJvdW5kLCBtYXhCb3VuZCkKLSNlbmRpZgotCi0vKiBtYWNybyBmb3IgcmFuZ2UgY2hlY2tpbmcgYW4gYXJyYXksIHVzZWQgb25seSBpZiBjb21waWxlciBmbGFnIF9SQU5HRV9DSEVDSwotICogaXMgZGVmaW5lZCAqLwotI2lmZGVmIF9SQU5HRV9DSEVDSwotI2RlZmluZSBSQU5HRV9DSEVDS19BUlJBWShhcnJheSwgbWluQm91bmQsIG1heEJvdW5kLCBsZW5ndGgpIFwKLXsgXAotICAgIGkzMiBpOyBcCi0gICAgZm9yIChpID0gMDsgaSA8IChsZW5ndGgpOyBpKyspIFwKLSAgICAgICAgaWYgKChhcnJheSlbaV0gPCAobWluQm91bmQpIHx8IChhcnJheSlbaV0gPiAobWF4Qm91bmQpKSBcCi0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiV2FybmluZzogVmFsdWUgWyVkXSBleGNlZWRzIGdpdmVuIGxpbWl0KHMpIVxuIixpKTsgXAotfQotI2Vsc2UKLSNkZWZpbmUgUkFOR0VfQ0hFQ0tfQVJSQVkoYXJyYXksIG1pbkJvdW5kLCBtYXhCb3VuZCwgbGVuZ3RoKQotI2VuZGlmCi0KLS8qIG1hY3JvIGZvciBkZWJ1ZyBwcmludGluZywgdXNlZCBvbmx5IGlmIGNvbXBpbGVyIGZsYWcgX0RFQlVHX1BSSU5UIGlzCi0gKiBkZWZpbmVkICovCi0jaWZkZWYgX0RFQlVHX1BSSU5UCi0jZGVmaW5lIERFQlVHKGFyZ3MpIHByaW50ZiBhcmdzCi0jZWxzZQotI2RlZmluZSBERUJVRyhhcmdzKQotI2VuZGlmCi0KLS8qIG1hY3JvIGZvciBlcnJvciBwcmludGluZywgdXNlZCBvbmx5IGlmIGNvbXBpbGVyIGZsYWcgX0VSUk9SX1BSSU5UIGlzCi0gKiBkZWZpbmVkICovCi0jaWZkZWYgX0VSUk9SX1BSSU5UCi0jZGVmaW5lIEVQUklOVChtc2cpIGZwcmludGYoc3RkZXJyLCJFUlJPUjogJXNcbiIsbXNnKQotI2Vsc2UKLSNkZWZpbmUgRVBSSU5UKG1zZykKLSNlbmRpZgotCi0vKiBtYWNybyB0byBnZXQgc21hbGxlciBvZiB0d28gdmFsdWVzICovCi0jZGVmaW5lIE1JTihhLCBiKSAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCi0KLS8qIG1hY3JvIHRvIGdldCBncmVhdGVyIG9mIHR3byB2YWx1ZXMgKi8KLSNkZWZpbmUgTUFYKGEsIGIpICgoKGEpID4gKGIpKSA/IChhKSA6IChiKSkKLQotLyogbWFjcm8gdG8gZ2V0IGFic29sdXRlIHZhbHVlICovCi0jZGVmaW5lIEFCUyhhKSAoKChhKSA8IDApID8gLShhKSA6IChhKSkKLQotLyogbWFjcm8gdG8gY2xpcCBhIHZhbHVlIHosIHNvIHRoYXQgeCA8PSB6ID08IHkgKi8KLSNkZWZpbmUgQ0xJUDMoeCx5LHopICgoKHopIDwgKHgpKSA/ICh4KSA6ICgoKHopID4gKHkpKSA/ICh5KSA6ICh6KSkpCi0KLS8qIG1hY3JvIHRvIGNsaXAgYSB2YWx1ZSB6LCBzbyB0aGF0IDAgPD0geiA9PCAyNTUgKi8KLSNkZWZpbmUgQ0xJUDEoeikgKCgoeikgPCAwKSA/IDAgOiAoKCh6KSA+IDI1NSkgPyAyNTUgOiAoeikpKQotCi0vKiBtYWNybyB0byBhbGxvY2F0ZSBtZW1vcnkgKi8KLSNkZWZpbmUgQUxMT0NBVEUocHRyLCBjb3VudCwgdHlwZSkgXAoteyBcCi0gICAgKHB0cikgPSBIMjY0U3dEZWNNYWxsb2Moc2l6ZW9mKHR5cGUpLCAoY291bnQpKTsgXAotfQotCi0vKiBtYWNybyB0byBmcmVlIGFsbG9jYXRlZCBtZW1vcnkgKi8KLSNkZWZpbmUgRlJFRShwdHIpIFwKLXsgXAotICAgIEgyNjRTd0RlY0ZyZWUoKHB0cikpOyAocHRyKSA9IE5VTEw7IFwKLX0KLQotI2RlZmluZSBBTElHTihwdHIsIGJ5dGVQb3MpIFwKLSAgICAgICAgKChwdHIpICsgKCAoKChieXRlUG9zKSAtICh1aW50cHRyX3QpKHB0cikpICYgKChieXRlUG9zKSAtIDEpKSAvIHNpemVvZigqKHB0cikpICkpCi0KLWV4dGVybiBjb25zdCB1MzIgaDI2NGJzZFFwQ1s1Ml07Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gRGF0YSB0eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmbmRlZiBIMjY0REVDX05FT04KLXUzMiBoMjY0YnNkQ291bnRMZWFkaW5nWmVyb3ModTMyIHZhbHVlLCB1MzIgbGVuZ3RoKTsKLSNlbHNlCi11MzIgaDI2NGJzZENvdW50TGVhZGluZ1plcm9zKHUzMiB2YWx1ZSk7Ci0jZW5kaWYKLXUzMiBoMjY0YnNkUmJzcFRyYWlsaW5nQml0cyhzdHJtRGF0YV90ICpzdHJtRGF0YSk7Ci0KLXUzMiBoMjY0YnNkTW9yZVJic3BEYXRhKHN0cm1EYXRhX3QgKnN0cm1EYXRhKTsKLQotdTMyIGgyNjRic2ROZXh0TWJBZGRyZXNzKHUzMiAqcFNsaWNlR3JvdXBNYXAsIHUzMiBwaWNTaXplSW5NYnMsIHUzMiBjdXJyTWJBZGRyKTsKLQotdm9pZCBoMjY0YnNkU2V0Q3VyckltYWdlTWJQb2ludGVycyhpbWFnZV90ICppbWFnZSwgdTMyIG1iTnVtKTsKLQotI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfVVRJTF9IICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF92bGMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF92bGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYwZjM1ZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdmxjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotICAgICAzLiBNb2R1bGUgZGVmaW5lcwotICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0gICAgIDUuIEZ1bmN0aW9ucwotICAgICAgICAgIGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZAotICAgICAgICAgIGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQKLSAgICAgICAgICBoMjY0YnNkRGVjb2RlRXhwR29sb21iTWFwcGVkCi0gICAgICAgICAgaDI2NGJzZERlY29kZUV4cEdvbG9tYlRydW5jYXRlZAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImgyNjRic2RfdmxjLmgiCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3N0cmVhbS5oIgotI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBkZWZpbml0aW9uIG9mIHNwZWNpYWwgY29kZSBudW0sIHRoaXMgYWxvbmcgd2l0aCB0aGUgcmV0dXJuIHZhbHVlIGlzIHVzZWQKLSAqIHRvIGhhbmRsZSBjb2RlIG51bSBpbiB0aGUgcmFuZ2UgWzAsIDJeMzJdIGluIHRoZSBEZWNvZGVFeHBHb2xvbWJVbnNpZ25lZAotICogZnVuY3Rpb24gKi8KLSNkZWZpbmUgQklHX0NPREVfTlVNIDB4RkZGRkZGRkZVCi0KLS8qIE1hcHBpbmcgdGFibGVzIGZvciBjb2RlZF9ibG9ja19wYXR0ZXJuLCB1c2VkIGZvciBkZWNvZGluZyBvZiBtYXBwZWQKLSAqIEV4cC1Hb2xvbWIgY29kZXMgKi8KLXN0YXRpYyBjb25zdCB1OCBjb2RlZEJsb2NrUGF0dGVybkludHJhNHg0WzQ4XSA9IHsKLSAgICA0NywzMSwxNSwwLDIzLDI3LDI5LDMwLDcsMTEsMTMsMTQsMzksNDMsNDUsNDYsMTYsMyw1LDEwLDEyLDE5LDIxLDI2LDI4LDM1LAotICAgIDM3LDQyLDQ0LDEsMiw0LDgsMTcsMTgsMjAsMjQsNiw5LDIyLDI1LDMyLDMzLDM0LDM2LDQwLDM4LDQxfTsKLQotc3RhdGljIGNvbnN0IHU4IGNvZGVkQmxvY2tQYXR0ZXJuSW50ZXJbNDhdID0gewotICAgIDAsMTYsMSwyLDQsOCwzMiwzLDUsMTAsMTIsMTUsNDcsNywxMSwxMywxNCw2LDksMzEsMzUsMzcsNDIsNDQsMzMsMzQsMzYsNDAsCi0gICAgMzksNDMsNDUsNDYsMTcsMTgsMjAsMjQsMTksMjEsMjYsMjgsMjMsMjcsMjksMzAsMjIsMjUsMzgsNDF9OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIDUuMSAgRnVuY3Rpb246IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBEZWNvZGUgdW5zaWduZWQgRXhwLUdvbG9tYiBjb2RlLiBUaGlzIGlzIHRoZSBzYW1lIGFzIGNvZGVOdW0gdXNlZAotICAgICAgICAgICAgaW4gb3RoZXIgRXhwLUdvbG9tYiBjb2RlIG1hcHBpbmdzLiBDb2RlIG51bSAoaS5lLiB0aGUgZGVjb2RlZAotICAgICAgICAgICAgc3ltYm9sKSBpcyBkZXRlcm1pbmVkIGFzCi0KLSAgICAgICAgICAgICAgICBjb2RlTnVtID0gMl5sZWFkaW5nWmVyb3MgLSAxICsgR2V0Qml0cyhsZWFkaW5nWmVyb3MpCi0KLSAgICAgICAgICAgIE5vcm1hbCBkZWNvZGVkIHN5bWJvbHMgYXJlIGluIHRoZSByYW5nZSBbMCwgMl4zMiAtIDJdLiBTeW1ib2wKLSAgICAgICAgICAgIDJeMzItMSBpcyBpbmRpY2F0ZWQgYnkgQklHX0NPREVfTlVNIHdpdGggcmV0dXJuIHZhbHVlIEhBTlRST19PSwotICAgICAgICAgICAgd2hpbGUgc3ltYm9sIDJeMzIgIGlzIGluZGljYXRlZCBieSBCSUdfQ09ERV9OVU0gd2l0aCByZXR1cm4gdmFsdWUKLSAgICAgICAgICAgIEhBTlRST19OT0suICBUaGVzZSB0d28gc3ltYm9scyBhcmUgc3BlY2lhbCBjYXNlcyB3aXRoIGNvZGUgbGVuZ3RoCi0gICAgICAgICAgICBvZiA2NSwgaS5lLiAgMzIgJzAnIGJpdHMsIGEgJzEnIGJpdCwgYW5kIGVpdGhlciAwIG9yIDEgcmVwcmVzZW50ZWQKLSAgICAgICAgICAgIGJ5IDMyIGJpdHMuCi0KLSAgICAgICAgICAgIFN5bWJvbCAyXjMyIGlzIG91dCBvZiB1bnNpZ25lZCAzMi1iaXQgcmFuZ2UgYnV0IGlzIG5lZWRlZCBmb3IKLSAgICAgICAgICAgIERlY29kZUV4cEdvbG9tYlNpZ25lZCB0byBleHByZXNzIHZhbHVlIC0yXjMxLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBjb2RlTnVtICAgICAgICAgZGVjb2RlZCBjb2RlIHdvcmQgaXMgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBmYWlsdXJlLCBubyB2YWxpZCBjb2RlIHdvcmQgZm91bmQsIG5vdGUgZXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBCSUdfQ09ERV9OVU0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChzdHJtRGF0YV90ICpwU3RybURhdGEsIHUzMiAqY29kZU51bSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgYml0cywgbnVtWmVyb3M7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChjb2RlTnVtKTsKLQotICAgIGJpdHMgPSBoMjY0YnNkU2hvd0JpdHMzMihwU3RybURhdGEpOwotCi0gICAgLyogZmlyc3QgYml0IGlzIDEgLT4gY29kZSBsZW5ndGggMSAqLwotICAgIGlmIChiaXRzID49IDB4ODAwMDAwMDApCi0gICAgewotICAgICAgICBoMjY0YnNkRmx1c2hCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgICAgICpjb2RlTnVtID0gMDsKLSAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7Ci0gICAgfQotICAgIC8qIHNlY29uZCBiaXQgaXMgMSAtPiBjb2RlIGxlbmd0aCAzICovCi0gICAgZWxzZSBpZiAoYml0cyA+PSAweDQwMDAwMDAwKQotICAgIHsKLSAgICAgICAgaWYgKGgyNjRic2RGbHVzaEJpdHMocFN0cm1EYXRhLCAzKSA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAqY29kZU51bSA9IDEgKyAoKGJpdHMgPj4gMjkpICYgMHgxKTsKLSAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7Ci0gICAgfQotICAgIC8qIHRoaXJkIGJpdCBpcyAxIC0+IGNvZGUgbGVuZ3RoIDUgKi8KLSAgICBlbHNlIGlmIChiaXRzID49IDB4MjAwMDAwMDApCi0gICAgewotICAgICAgICBpZiAoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsIDUpID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICpjb2RlTnVtID0gMyArICgoYml0cyA+PiAyNykgJiAweDMpOwotICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKLSAgICB9Ci0gICAgLyogZm91cnRoIGJpdCBpcyAxIC0+IGNvZGUgbGVuZ3RoIDcgKi8KLSAgICBlbHNlIGlmIChiaXRzID49IDB4MTAwMDAwMDApCi0gICAgewotICAgICAgICBpZiAoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsIDcpID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICpjb2RlTnVtID0gNyArICgoYml0cyA+PiAyNSkgJiAweDcpOwotICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKLSAgICB9Ci0gICAgLyogb3RoZXIgY29kZSBsZW5ndGhzICovCi0gICAgZWxzZQotICAgIHsKLSNpZm5kZWYgSDI2NERFQ19ORU9OCi0gICAgICAgIG51bVplcm9zID0gNCArIGgyNjRic2RDb3VudExlYWRpbmdaZXJvcyhiaXRzLCAyOCk7Ci0jZWxzZQotICAgICAgICBudW1aZXJvcyA9IGgyNjRic2RDb3VudExlYWRpbmdaZXJvcyhiaXRzKTsKLSNlbmRpZgotICAgICAgICAvKiBhbGwgMzIgYml0cyBhcmUgemVybyAqLwotICAgICAgICBpZiAobnVtWmVyb3MgPT0gMzIpCi0gICAgICAgIHsKLSAgICAgICAgICAgICpjb2RlTnVtID0gMDsKLSAgICAgICAgICAgIGgyNjRic2RGbHVzaEJpdHMocFN0cm1EYXRhLDMyKTsKLSAgICAgICAgICAgIGJpdHMgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgICAgICAgICAgLyogY2hlY2sgMzNyZCBiaXQsIG11c3QgYmUgMSAqLwotICAgICAgICAgICAgaWYgKGJpdHMgPT0gMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBjYW5ub3QgdXNlIGgyNjRic2RHZXRCaXRzLCBsaW1pdGVkIHRvIDMxIGJpdHMgKi8KLSAgICAgICAgICAgICAgICBiaXRzID0gaDI2NGJzZFNob3dCaXRzMzIocFN0cm1EYXRhKTsKLSAgICAgICAgICAgICAgICBpZiAoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsIDMyKSA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgLyogY29kZSBudW0gMl4zMiAtIDEsIG5lZWRlZCBmb3IgdW5zaWduZWQgbWFwcGluZyAqLwotICAgICAgICAgICAgICAgIGlmIChiaXRzID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAqY29kZU51bSA9IEJJR19DT0RFX05VTTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIGNvZGUgbnVtIDJeMzIsIG5lZWRlZCBmb3IgdW5zaWduZWQgbWFwcGluZwotICAgICAgICAgICAgICAgICAqIChyZXN1bHRzIGluIC0yXjMxKSAqLwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJpdHMgPT0gMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICpjb2RlTnVtID0gQklHX0NPREVfTlVNOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogaWYgbW9yZSB6ZXJvcyB0aGFuIDMyLCBpdCBpcyBhbiBlcnJvciAqLwotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGgyNjRic2RGbHVzaEJpdHMocFN0cm1EYXRhLG51bVplcm9zKzEpOwotCi0gICAgICAgIGJpdHMgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIG51bVplcm9zKTsKLSAgICAgICAgaWYgKGJpdHMgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgICAgICAqY29kZU51bSA9ICgxIDw8IG51bVplcm9zKSAtIDEgKyBiaXRzOwotCi0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgNS4yICBGdW5jdGlvbjogaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBEZWNvZGUgc2lnbmVkIEV4cC1Hb2xvbWIgY29kZS4gQ29kZSBudW0gaXMgZGV0ZXJtaW5lZCBieQotICAgICAgICAgICAgaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkIGFuZCB0aGVuIG1hcHBlZCB0byBzaWduZWQKLSAgICAgICAgICAgIHJlcHJlc2VudGF0aW9uIGFzCi0KLSAgICAgICAgICAgICAgICBzeW1ib2wgPSAoLTEpXihjb2RlTnVtKzEpICogKGNvZGVOdW0rMSkvMgotCi0gICAgICAgICAgICBTaWduZWQgc3ltYm9scyBzaGFsbCBiZSBpbiB0aGUgcmFuZ2UgWy0yXjMxLCAyXjMxIC0gMV0uIFN5bWJvbAotICAgICAgICAgICAgLTJeMzEgaXMgb2J0YWluZWQgd2hlbiBjb2RlTnVtIGlzIDJeMzIsIHdoaWNoIGNhbm5vdCBiZSBleHByZXNzZWQKLSAgICAgICAgICAgIGJ5IHVuc2lnbmVkIDMyLWJpdCB2YWx1ZS4gVGhpcyBpcyBzaWduYWxlZCBhcyBhIHNwZWNpYWwgY2FzZSBmcm9tCi0gICAgICAgICAgICB0aGUgaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkIGJ5IHNldHRpbmcgY29kZU51bSB0bwotICAgICAgICAgICAgQklHX0NPREVfTlVNIGFuZCByZXR1cm5pbmcgSEFOVFJPX05PSyBzdGF0dXMuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIHZhbHVlICAgICAgICAgICBkZWNvZGVkIGNvZGUgd29yZCBpcyBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcwotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGZhaWx1cmUsIG5vIHZhbGlkIGNvZGUgd29yZCBmb3VuZAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChzdHJtRGF0YV90ICpwU3RybURhdGEsIGkzMiAqdmFsdWUpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHN0YXR1cywgY29kZU51bSA9IDA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVCh2YWx1ZSk7Ci0KLSAgICBzdGF0dXMgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmY29kZU51bSk7Ci0KLSAgICBpZiAoY29kZU51bSA9PSBCSUdfQ09ERV9OVU0pCi0gICAgewotICAgICAgICAvKiBCSUdfQ09ERV9OVU0gYW5kIEhBTlRST19PSyBzdGF0dXMgbWVhbnMgY29kZU51bSAyXjMyLTEgd2hpY2ggd291bGQKLSAgICAgICAgICogcmVzdWx0IGluIHNpZ25lZCBpbnRlZ2VyIHZhbHVlZCAyXjMxIChpLmUuIG91dCBvZiAzMi1iaXQgc2lnbmVkCi0gICAgICAgICAqIGludGVnZXIgcmFuZ2UpICovCi0gICAgICAgIGlmIChzdGF0dXMgPT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAvKiBCSUdfQ09ERV9OVU0gYW5kIEhBTlRST19OT0sgc3RhdHVzIG1lYW5zIGNvZGVOdW0gMl4zMiB3aGljaCByZXN1bHRzCi0gICAgICAgICAqIGluIHNpZ25lZCBpbnRlZ2VyIHZhbHVlZCAtMl4zMSAqLwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgICp2YWx1ZSA9IChpMzIpKDIxNDc0ODM2NDhVKTsKLSAgICAgICAgICAgIHJldHVybiAoSEFOVFJPX09LKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChzdGF0dXMgPT0gSEFOVFJPX09LKQotICAgIHsKLSAgICAgICAgLyogKC0xKV4oY29kZU51bSsxKSByZXN1bHRzIGluIHBvc2l0aXZlIHNpZ24gaWYgY29kZU51bSBpcyBvZGQsCi0gICAgICAgICAqIG5lZ2F0aXZlIHdoZW4gaXQgaXMgZXZlbi4gKGNvZGVOdW0rMSkvMiBpcyBvYnRhaW5lZCBhcwotICAgICAgICAgKiAoY29kZU51bSsxKT4+MSB3aGVuIHZhbHVlIGlzIHBvc2l0aXZlIGFuZCBhcyAoLWNvZGVOdW0pPj4xIGZvcgotICAgICAgICAgKiBuZWdhdGl2ZSB2YWx1ZSAqLwotICAgICAgICAvKmxpbnQgLWU3MDIgKi8KLSAgICAgICAgKnZhbHVlID0gKGNvZGVOdW0gJiAweDEpID8gKGkzMikoKGNvZGVOdW0gKyAxKSA+PiAxKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShpMzIpKChjb2RlTnVtICsgMSkgPj4gMSk7Ci0gICAgICAgIC8qbGludCArZTcwMiAqLwotICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgNS4zICBGdW5jdGlvbjogaDI2NGJzZERlY29kZUV4cEdvbG9tYk1hcHBlZAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBEZWNvZGUgbWFwcGVkIEV4cC1Hb2xvbWIgY29kZS4gQ29kZSBudW0gaXMgZGV0ZXJtaW5lZCBieQotICAgICAgICAgICAgaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkIGFuZCB0aGVuIG1hcHBlZCB0byBjb2RlZEJsb2NrUGF0dGVybgotICAgICAgICAgICAgZWl0aGVyIGZvciBpbnRyYSBvciBpbnRlciBtYWNyb2Jsb2NrLiBUaGUgbWFwcGluZyBpcyBpbXBsZW1lbnRlZCBieQotICAgICAgICAgICAgbG9vay11cCB0YWJsZXMgZGVmaW5lZCBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQotICAgICAgICAgICAgaXNJbnRyYSAgICAgICAgIGZsYWcgdG8gaW5kaWNhdGUgaWYgaW50cmEgb3IgaW50ZXIgbWFwcGluZyBpcyB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHVzZWQKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgdmFsdWUgICAgICAgICAgIGRlY29kZWQgY29kZSB3b3JkIGlzIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgZmFpbHVyZSwgbm8gdmFsaWQgY29kZSB3b3JkIGZvdW5kCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkRGVjb2RlRXhwR29sb21iTWFwcGVkKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgdTMyICp2YWx1ZSwKLSAgICB1MzIgaXNJbnRyYSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgc3RhdHVzLCBjb2RlTnVtOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQodmFsdWUpOwotCi0gICAgc3RhdHVzID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJmNvZGVOdW0pOwotCi0gICAgaWYgKHN0YXR1cyAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybiAoSEFOVFJPX05PSyk7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogcmFuZ2Ugb2YgdmFsaWQgY29kZU51bXMgWzAsNDddICovCi0gICAgICAgIGlmIChjb2RlTnVtID4gNDcpCi0gICAgICAgICAgICByZXR1cm4gKEhBTlRST19OT0spOwotICAgICAgICBpZiAoaXNJbnRyYSkKLSAgICAgICAgICAgICp2YWx1ZSA9IGNvZGVkQmxvY2tQYXR0ZXJuSW50cmE0eDRbY29kZU51bV07Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICp2YWx1ZSA9IGNvZGVkQmxvY2tQYXR0ZXJuSW50ZXJbY29kZU51bV07Ci0gICAgICAgIHJldHVybihIQU5UUk9fT0spOwotICAgIH0KLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICA1LjQgIEZ1bmN0aW9uOiBoMjY0YnNkRGVjb2RlRXhwR29sb21iVHJ1bmNhdGVkCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIERlY29kZSB0cnVuY2F0ZWQgRXhwLUdvbG9tYiBjb2RlLiBncmVhdGVyVGhhbk9uZSBmbGFnIGluZGljYXRlcwotICAgICAgICAgICAgdGhlIHJhbmdlIG9mIHRoZSBzeW1ib2wgdG8gYmUgZGVjb2RlZCBhcyBmb2xsb3dzOgotICAgICAgICAgICAgICAgIEZBTFNFICAgLT4gIFswLDFdCi0gICAgICAgICAgICAgICAgVFJVRSAgICAtPiAgWzAsMl4zMi0xXQotCi0gICAgICAgICAgICBJZiBmbGFnIGlzIGZhbHNlIHRoZSBkZWNvZGluZyBpcyBwZXJmb3JtZWQgYnkgcmVhZGluZyBvbmUgYml0Ci0gICAgICAgICAgICBmcm9tIHRoZSBzdHJlYW0gd2l0aCBoMjY0YnNkR2V0Qml0cyBhbmQgbWFwcGluZyB0aGlzIHRvIGRlY29kZWQKLSAgICAgICAgICAgIHN5bWJvbCBhcwotICAgICAgICAgICAgICAgIHN5bWJvbCA9IGJpdCA/IDAgOiAxCi0KLSAgICAgICAgICAgIE90aGVyd2lzZSwgaS5lLiB3aGVuIGZsYWcgaXMgVFJVRSwgY29kZSBudW0gaXMgZGV0ZXJtaW5lZCBieQotICAgICAgICAgICAgaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkIGFuZCB0aGlzIGlzIHVzZWQgYXMgdGhlIGRlY29kZWQKLSAgICAgICAgICAgIHN5bWJvbC4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKLSAgICAgICAgICAgIGdyZWF0ZXJUaGFuT25lICBmbGFnIHRvIGluZGljYXRlIGlmIHJhbmdlIGlzIHdpZGVyIHRoYW4gWzAsMV0KLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgdmFsdWUgICAgICAgICAgIGRlY29kZWQgY29kZSB3b3JkIGlzIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgZmFpbHVyZSwgbm8gdmFsaWQgY29kZSB3b3JkIGZvdW5kCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkRGVjb2RlRXhwR29sb21iVHJ1bmNhdGVkKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHUzMiAqdmFsdWUsCi0gIHUzMiBncmVhdGVyVGhhbk9uZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVCh2YWx1ZSk7Ci0KLSAgICBpZiAoZ3JlYXRlclRoYW5PbmUpCi0gICAgewotICAgICAgICByZXR1cm4oaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgdmFsdWUpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgKnZhbHVlID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLDEpOwotICAgICAgICBpZiAoKnZhbHVlID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4gKEhBTlRST19OT0spOwotICAgICAgICAqdmFsdWUgXj0gMHgxOwotICAgIH0KLQotICAgIHJldHVybiAoSEFOVFJPX09LKTsKLQotfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdmxjLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdmxjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMTY3NzMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3ZsYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLSAgICAzLiBEYXRhIHR5cGVzCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIEgyNjRTV0RFQ19WTENfSAotI2RlZmluZSBIMjY0U1dERUNfVkxDX0gKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF90cmFuc2Zvcm0uaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIERhdGEgdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChzdHJtRGF0YV90ICpwU3RybURhdGEsIHUzMiAqdmFsdWUpOwotCi11MzIgaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChzdHJtRGF0YV90ICpwU3RybURhdGEsIGkzMiAqdmFsdWUpOwotCi11MzIgaDI2NGJzZERlY29kZUV4cEdvbG9tYk1hcHBlZChzdHJtRGF0YV90ICpwU3RybURhdGEsIHUzMiAqdmFsdWUsCi0gICAgdTMyIGlzSW50cmEpOwotCi11MzIgaDI2NGJzZERlY29kZUV4cEdvbG9tYlRydW5jYXRlZChzdHJtRGF0YV90ICpwU3RybURhdGEsIHUzMiAqdmFsdWUsCi0gICAgdTMyIGdyZWF0ZXJUaGFuT25lKTsKLQotI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfVkxDX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3Z1aS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3Z1aS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTkzMzVhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF92dWkuYworKysgL2Rldi9udWxsCkBAIC0xLDQ5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0gICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0gICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgICAgNS4gRnVuY3Rpb25zCi0gICAgICAgICAgaDI2NGJzZERlY29kZVZ1aVBhcmFtZXRlcnMKLSAgICAgICAgICBEZWNvZGVIcmRQYXJhbWV0ZXJzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiaDI2NGJzZF92dWkuaCIKLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2RfdmxjLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zdHJlYW0uaCIKLSNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBNQVhfRFBCX1NJWkUgMTYKLSNkZWZpbmUgTUFYX0JSICAgICAgIDI0MDAwMCAvKiBmb3IgbGV2ZWwgNS4xICovCi0jZGVmaW5lIE1BWF9DUEIgICAgICAyNDAwMDAgLyogZm9yIGxldmVsIDUuMSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgRGVjb2RlSHJkUGFyYW1ldGVycygKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBocmRQYXJhbWV0ZXJzX3QgKnBIcmRQYXJhbWV0ZXJzKTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkRGVjb2RlVnVpUGFyYW1ldGVycwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBEZWNvZGUgVlVJIHBhcmFtZXRlcnMgZnJvbSB0aGUgc3RyZWFtLiBTZWUgc3RhbmRhcmQgZm9yIGRldGFpbHMuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIHBWdWlQYXJhbWV0ZXJzICBkZWNvZGVkIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgaW52YWxpZCBzdHJlYW0gZGF0YSBvciBlbmQgb2Ygc3RyZWFtCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkRGVjb2RlVnVpUGFyYW1ldGVycyhzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gICAgdnVpUGFyYW1ldGVyc190ICpwVnVpUGFyYW1ldGVycykKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocFZ1aVBhcmFtZXRlcnMpOwotCi0gICAgSDI2NFN3RGVjTWVtc2V0KHBWdWlQYXJhbWV0ZXJzLCAwLCBzaXplb2YodnVpUGFyYW1ldGVyc190KSk7Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBWdWlQYXJhbWV0ZXJzLT5hc3BlY3RSYXRpb1ByZXNlbnRGbGFnID0gKHRtcCA9PSAxKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT5hc3BlY3RSYXRpb1ByZXNlbnRGbGFnKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA4KTsKLSAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwVnVpUGFyYW1ldGVycy0+YXNwZWN0UmF0aW9JZGMgPSB0bXA7Ci0KLSAgICAgICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT5hc3BlY3RSYXRpb0lkYyA9PSBBU1BFQ1RfUkFUSU9fRVhURU5ERURfU0FSKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDE2KTsKLSAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICBwVnVpUGFyYW1ldGVycy0+c2FyV2lkdGggPSB0bXA7Ci0KLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMTYpOwotICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5zYXJIZWlnaHQgPSB0bXA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBWdWlQYXJhbWV0ZXJzLT5vdmVyc2NhbkluZm9QcmVzZW50RmxhZyA9ICh0bXAgPT0gMSkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgIGlmIChwVnVpUGFyYW1ldGVycy0+b3ZlcnNjYW5JbmZvUHJlc2VudEZsYWcpCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5vdmVyc2NhbkFwcHJvcHJpYXRlRmxhZyA9ICh0bXAgPT0gMSkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLSAgICB9Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBWdWlQYXJhbWV0ZXJzLT52aWRlb1NpZ25hbFR5cGVQcmVzZW50RmxhZyA9ICh0bXAgPT0gMSkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgIGlmIChwVnVpUGFyYW1ldGVycy0+dmlkZW9TaWduYWxUeXBlUHJlc2VudEZsYWcpCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDMpOwotICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT52aWRlb0Zvcm1hdCA9IHRtcDsKLQotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT52aWRlb0Z1bGxSYW5nZUZsYWcgPSAodG1wID09IDEpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwVnVpUGFyYW1ldGVycy0+Y29sb3VyRGVzY3JpcHRpb25QcmVzZW50RmxhZyA9Ci0gICAgICAgICAgICAodG1wID09IDEpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICAgICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT5jb2xvdXJEZXNjcmlwdGlvblByZXNlbnRGbGFnKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDgpOwotICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5jb2xvdXJQcmltYXJpZXMgPSB0bXA7Ci0KLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgOCk7Ci0gICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPnRyYW5zZmVyQ2hhcmFjdGVyaXN0aWNzID0gdG1wOwotCi0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDgpOwotICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5tYXRyaXhDb2VmZmljaWVudHMgPSB0bXA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwVnVpUGFyYW1ldGVycy0+Y29sb3VyUHJpbWFyaWVzICAgICAgICAgPSAyOwotICAgICAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPnRyYW5zZmVyQ2hhcmFjdGVyaXN0aWNzID0gMjsKLSAgICAgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5tYXRyaXhDb2VmZmljaWVudHMgICAgICA9IDI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPnZpZGVvRm9ybWF0ICAgICAgICAgICAgID0gNTsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPmNvbG91clByaW1hcmllcyAgICAgICAgID0gMjsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPnRyYW5zZmVyQ2hhcmFjdGVyaXN0aWNzID0gMjsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm1hdHJpeENvZWZmaWNpZW50cyAgICAgID0gMjsKLSAgICB9Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBWdWlQYXJhbWV0ZXJzLT5jaHJvbWFMb2NJbmZvUHJlc2VudEZsYWcgPQotICAgICAgICAodG1wID09IDEpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICBpZiAocFZ1aVBhcmFtZXRlcnMtPmNocm9tYUxvY0luZm9QcmVzZW50RmxhZykKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgJnBWdWlQYXJhbWV0ZXJzLT5jaHJvbWFTYW1wbGVMb2NUeXBlVG9wRmllbGQpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICBpZiAocFZ1aVBhcmFtZXRlcnMtPmNocm9tYVNhbXBsZUxvY1R5cGVUb3BGaWVsZCA+IDUpCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAmcFZ1aVBhcmFtZXRlcnMtPmNocm9tYVNhbXBsZUxvY1R5cGVCb3R0b21GaWVsZCk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgIGlmIChwVnVpUGFyYW1ldGVycy0+Y2hyb21hU2FtcGxlTG9jVHlwZUJvdHRvbUZpZWxkID4gNSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBWdWlQYXJhbWV0ZXJzLT50aW1pbmdJbmZvUHJlc2VudEZsYWcgPQotICAgICAgICAodG1wID09IDEpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICBpZiAocFZ1aVBhcmFtZXRlcnMtPnRpbWluZ0luZm9QcmVzZW50RmxhZykKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2RTaG93Qml0czMyKHBTdHJtRGF0YSk7Ci0gICAgICAgIGlmIChoMjY0YnNkRmx1c2hCaXRzKHBTdHJtRGF0YSwgMzIpID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIGlmICh0bXAgPT0gMCkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm51bVVuaXRzSW5UaWNrID0gdG1wOwotCi0gICAgICAgIHRtcCA9IGgyNjRic2RTaG93Qml0czMyKHBTdHJtRGF0YSk7Ci0gICAgICAgIGlmIChoMjY0YnNkRmx1c2hCaXRzKHBTdHJtRGF0YSwgMzIpID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIGlmICh0bXAgPT0gMCkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPnRpbWVTY2FsZSA9IHRtcDsKLQotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5maXhlZEZyYW1lUmF0ZUZsYWcgPQotICAgICAgICAgICAgKHRtcCA9PSAxKSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotICAgIH0KLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcFZ1aVBhcmFtZXRlcnMtPm5hbEhyZFBhcmFtZXRlcnNQcmVzZW50RmxhZyA9Ci0gICAgICAgICh0bXAgPT0gMSkgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgIGlmIChwVnVpUGFyYW1ldGVycy0+bmFsSHJkUGFyYW1ldGVyc1ByZXNlbnRGbGFnKQotICAgIHsKLSAgICAgICAgdG1wID0gRGVjb2RlSHJkUGFyYW1ldGVycyhwU3RybURhdGEsICZwVnVpUGFyYW1ldGVycy0+bmFsSHJkUGFyYW1ldGVycyk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5uYWxIcmRQYXJhbWV0ZXJzLmNwYkNudCAgICAgICAgICA9IDE7Ci0gICAgICAgIC8qIE1heEJSIGFuZCBNYXhDUEIgc2hvdWxkIGJlIHRoZSB2YWx1ZXMgY29ycmVzcG9uZGlnIHRvIHRoZSBsZXZlbElkYwotICAgICAgICAgKiBpbiB0aGUgU1BTIGNvbnRhaW5pbmcgdGhlc2UgVlVJIHBhcmFtZXRlcnMuIEhvd2V2ZXIsIHRoZXNlIHZhbHVlcwotICAgICAgICAgKiBhcmUgbm90IHVzZWQgYW55d2hlcmUgYW5kIG1heGltdW0gZm9yIGFueSBsZXZlbCB3aWxsIGJlIHVzZWQgaGVyZSAqLwotICAgICAgICBwVnVpUGFyYW1ldGVycy0+bmFsSHJkUGFyYW1ldGVycy5iaXRSYXRlVmFsdWVbMF0gPSAxMjAwICogTUFYX0JSICsgMTsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm5hbEhyZFBhcmFtZXRlcnMuY3BiU2l6ZVZhbHVlWzBdID0gMTIwMCAqIE1BWF9DUEIgKyAxOwotICAgICAgICBwVnVpUGFyYW1ldGVycy0+bmFsSHJkUGFyYW1ldGVycy5pbml0aWFsQ3BiUmVtb3ZhbERlbGF5TGVuZ3RoID0gMjQ7Ci0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5uYWxIcmRQYXJhbWV0ZXJzLmNwYlJlbW92YWxEZWxheUxlbmd0aCAgICAgICAgPSAyNDsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm5hbEhyZFBhcmFtZXRlcnMuZHBiT3V0cHV0RGVsYXlMZW5ndGggICAgICAgICA9IDI0OwotICAgICAgICBwVnVpUGFyYW1ldGVycy0+bmFsSHJkUGFyYW1ldGVycy50aW1lT2Zmc2V0TGVuZ3RoICAgICAgICAgICAgID0gMjQ7Ci0gICAgfQotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwVnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVyc1ByZXNlbnRGbGFnID0KLSAgICAgICAgKHRtcCA9PSAxKSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzUHJlc2VudEZsYWcpCi0gICAgewotICAgICAgICB0bXAgPSBEZWNvZGVIcmRQYXJhbWV0ZXJzKHBTdHJtRGF0YSwgJnBWdWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnMuY3BiQ250ICAgICAgICAgID0gMTsKLSAgICAgICAgLyogTWF4QlIgYW5kIE1heENQQiBzaG91bGQgYmUgdGhlIHZhbHVlcyBjb3JyZXNwb25kaWcgdG8gdGhlIGxldmVsSWRjCi0gICAgICAgICAqIGluIHRoZSBTUFMgY29udGFpbmluZyB0aGVzZSBWVUkgcGFyYW1ldGVycy4gSG93ZXZlciwgdGhlc2UgdmFsdWVzCi0gICAgICAgICAqIGFyZSBub3QgdXNlZCBhbnl3aGVyZSBhbmQgbWF4aW11bSBmb3IgYW55IGxldmVsIHdpbGwgYmUgdXNlZCBoZXJlICovCi0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzLmJpdFJhdGVWYWx1ZVswXSA9IDEwMDAgKiBNQVhfQlIgKyAxOwotICAgICAgICBwVnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVycy5jcGJTaXplVmFsdWVbMF0gPSAxMDAwICogTUFYX0NQQiArIDE7Ci0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzLmluaXRpYWxDcGJSZW1vdmFsRGVsYXlMZW5ndGggPSAyNDsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnMuY3BiUmVtb3ZhbERlbGF5TGVuZ3RoICAgICAgICA9IDI0OwotICAgICAgICBwVnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVycy5kcGJPdXRwdXREZWxheUxlbmd0aCAgICAgICAgID0gMjQ7Ci0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzLnRpbWVPZmZzZXRMZW5ndGggICAgICAgICAgICAgPSAyNDsKLSAgICB9Ci0KLSAgICBpZiAocFZ1aVBhcmFtZXRlcnMtPm5hbEhyZFBhcmFtZXRlcnNQcmVzZW50RmxhZyB8fAotICAgICAgcFZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnNQcmVzZW50RmxhZykKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPmxvd0RlbGF5SHJkRmxhZyA9Ci0gICAgICAgICAgICAodG1wID09IDEpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0gICAgfQotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwVnVpUGFyYW1ldGVycy0+cGljU3RydWN0UHJlc2VudEZsYWcgPQotICAgICAgICAodG1wID09IDEpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBWdWlQYXJhbWV0ZXJzLT5iaXRzdHJlYW1SZXN0cmljdGlvbkZsYWcgPQotICAgICAgICAodG1wID09IDEpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICBpZiAocFZ1aVBhcmFtZXRlcnMtPmJpdHN0cmVhbVJlc3RyaWN0aW9uRmxhZykKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm1vdGlvblZlY3RvcnNPdmVyUGljQm91bmRhcmllc0ZsYWcgPQotICAgICAgICAgICAgKHRtcCA9PSAxKSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgJnBWdWlQYXJhbWV0ZXJzLT5tYXhCeXRlc1BlclBpY0Rlbm9tKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT5tYXhCeXRlc1BlclBpY0Rlbm9tID4gMTYpCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAmcFZ1aVBhcmFtZXRlcnMtPm1heEJpdHNQZXJNYkRlbm9tKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT5tYXhCaXRzUGVyTWJEZW5vbSA+IDE2KQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgJnBWdWlQYXJhbWV0ZXJzLT5sb2cyTWF4TXZMZW5ndGhIb3Jpem9udGFsKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT5sb2cyTWF4TXZMZW5ndGhIb3Jpem9udGFsID4gMTYpCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAmcFZ1aVBhcmFtZXRlcnMtPmxvZzJNYXhNdkxlbmd0aFZlcnRpY2FsKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT5sb2cyTWF4TXZMZW5ndGhWZXJ0aWNhbCA+IDE2KQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgJnBWdWlQYXJhbWV0ZXJzLT5udW1SZW9yZGVyRnJhbWVzKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLQotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgICAgICZwVnVpUGFyYW1ldGVycy0+bWF4RGVjRnJhbWVCdWZmZXJpbmcpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwVnVpUGFyYW1ldGVycy0+bW90aW9uVmVjdG9yc092ZXJQaWNCb3VuZGFyaWVzRmxhZyA9IEhBTlRST19UUlVFOwotICAgICAgICBwVnVpUGFyYW1ldGVycy0+bWF4Qnl0ZXNQZXJQaWNEZW5vbSAgICAgICA9IDI7Ci0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5tYXhCaXRzUGVyTWJEZW5vbSAgICAgICAgID0gMTsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPmxvZzJNYXhNdkxlbmd0aEhvcml6b250YWwgPSAxNjsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPmxvZzJNYXhNdkxlbmd0aFZlcnRpY2FsICAgPSAxNjsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm51bVJlb3JkZXJGcmFtZXMgICAgICAgICAgPSBNQVhfRFBCX1NJWkU7Ci0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5tYXhEZWNGcmFtZUJ1ZmZlcmluZyAgICAgID0gTUFYX0RQQl9TSVpFOwotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlSHJkUGFyYW1ldGVycwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBEZWNvZGUgSFJEIHBhcmFtZXRlcnMgZnJvbSB0aGUgc3RyZWFtLiBTZWUgc3RhbmRhcmQgZm9yIGRldGFpbHMuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIHBIcmRQYXJhbWV0ZXJzICBkZWNvZGVkIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgaW52YWxpZCBzdHJlYW0gZGF0YQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIERlY29kZUhyZFBhcmFtZXRlcnMoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgaHJkUGFyYW1ldGVyc190ICpwSHJkUGFyYW1ldGVycykKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wLCBpOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocEhyZFBhcmFtZXRlcnMpOwotCi0KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmcEhyZFBhcmFtZXRlcnMtPmNwYkNudCk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotICAgIC8qIGNwYkNvdW50ID0gY3BiX2NudF9taW51czEgKyAxICovCi0gICAgcEhyZFBhcmFtZXRlcnMtPmNwYkNudCsrOwotICAgIGlmIChwSHJkUGFyYW1ldGVycy0+Y3BiQ250ID4gTUFYX0NQQl9DTlQpCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgNCk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcEhyZFBhcmFtZXRlcnMtPmJpdFJhdGVTY2FsZSA9IHRtcDsKLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgNCk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcEhyZFBhcmFtZXRlcnMtPmNwYlNpemVTY2FsZSA9IHRtcDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBwSHJkUGFyYW1ldGVycy0+Y3BiQ250OyBpKyspCi0gICAgewotICAgICAgICAvKiBiaXRfcmF0ZV92YWx1ZV9taW51czEgaW4gdGhlIHJhbmdlIFswLCAyXjMyIC0gMl0gKi8KLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAmcEhyZFBhcmFtZXRlcnMtPmJpdFJhdGVWYWx1ZVtpXSk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgIGlmIChwSHJkUGFyYW1ldGVycy0+Yml0UmF0ZVZhbHVlW2ldID4gNDI5NDk2NzI5NFUpCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBIcmRQYXJhbWV0ZXJzLT5iaXRSYXRlVmFsdWVbaV0rKzsKLSAgICAgICAgLyogdGhpcyBtYXkgcmVzdWx0IGluIG92ZXJmbG93LCBidXQgdGhpcyB2YWx1ZSBpcyBub3QgdXNlZCBmb3IKLSAgICAgICAgICogYW55dGhpbmcgKi8KLSAgICAgICAgcEhyZFBhcmFtZXRlcnMtPmJpdFJhdGVWYWx1ZVtpXSAqPQotICAgICAgICAgICAgMSA8PCAoNiArIHBIcmRQYXJhbWV0ZXJzLT5iaXRSYXRlU2NhbGUpOwotCi0gICAgICAgIC8qIGNwYl9zaXplX3ZhbHVlX21pbnVzMSBpbiB0aGUgcmFuZ2UgWzAsIDJeMzIgLSAyXSAqLwotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgICAgICZwSHJkUGFyYW1ldGVycy0+Y3BiU2l6ZVZhbHVlW2ldKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgaWYgKHBIcmRQYXJhbWV0ZXJzLT5jcGJTaXplVmFsdWVbaV0gPiA0Mjk0OTY3Mjk0VSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcEhyZFBhcmFtZXRlcnMtPmNwYlNpemVWYWx1ZVtpXSsrOwotICAgICAgICAvKiB0aGlzIG1heSByZXN1bHQgaW4gb3ZlcmZsb3csIGJ1dCB0aGlzIHZhbHVlIGlzIG5vdCB1c2VkIGZvcgotICAgICAgICAgKiBhbnl0aGluZyAqLwotICAgICAgICBwSHJkUGFyYW1ldGVycy0+Y3BiU2l6ZVZhbHVlW2ldICo9Ci0gICAgICAgICAgICAxIDw8ICg0ICsgcEhyZFBhcmFtZXRlcnMtPmNwYlNpemVTY2FsZSk7Ci0KLSAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwSHJkUGFyYW1ldGVycy0+Y2JyRmxhZ1tpXSA9ICh0bXAgPT0gMSkgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLSAgICB9Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDUpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBIcmRQYXJhbWV0ZXJzLT5pbml0aWFsQ3BiUmVtb3ZhbERlbGF5TGVuZ3RoID0gdG1wICsgMTsKLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgNSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcEhyZFBhcmFtZXRlcnMtPmNwYlJlbW92YWxEZWxheUxlbmd0aCA9IHRtcCArIDE7Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDUpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBIcmRQYXJhbWV0ZXJzLT5kcGJPdXRwdXREZWxheUxlbmd0aCA9IHRtcCArIDE7Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDUpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBIcmRQYXJhbWV0ZXJzLT50aW1lT2Zmc2V0TGVuZ3RoID0gdG1wOwotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3Z1aS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3Z1aS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWQ1MmE0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF92dWkuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotICAgIDMuIERhdGEgdHlwZXMKLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSDI2NFNXREVDX1ZVSV9ICi0jZGVmaW5lIEgyNjRTV0RFQ19WVUlfSAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zdHJlYW0uaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBNQVhfQ1BCX0NOVCAzMgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIERhdGEgdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIGVudW1lcmF0ZWQgc2FtcGxlIGFzcGVjdCByYXRpb3MsIEFTUEVDVF9SQVRJT19NX04gbWVhbnMgTTpOICovCi1lbnVtCi17Ci0gICAgQVNQRUNUX1JBVElPX1VOU1BFQ0lGSUVEID0gMCwKLSAgICBBU1BFQ1RfUkFUSU9fMV8xLAotICAgIEFTUEVDVF9SQVRJT18xMl8xMSwKLSAgICBBU1BFQ1RfUkFUSU9fMTBfMTEsCi0gICAgQVNQRUNUX1JBVElPXzE2XzExLAotICAgIEFTUEVDVF9SQVRJT180MF8zMywKLSAgICBBU1BFQ1RfUkFUSU9fMjRfMTEsCi0gICAgQVNQRUNUX1JBVElPXzIwXzExLAotICAgIEFTUEVDVF9SQVRJT18zMl8xMSwKLSAgICBBU1BFQ1RfUkFUSU9fODBfMzMsCi0gICAgQVNQRUNUX1JBVElPXzE4XzExLAotICAgIEFTUEVDVF9SQVRJT18xNV8xMSwKLSAgICBBU1BFQ1RfUkFUSU9fNjRfMzMsCi0gICAgQVNQRUNUX1JBVElPXzE2MF85OSwKLSAgICBBU1BFQ1RfUkFUSU9fRVhURU5ERURfU0FSID0gMjU1Ci19OwotCi0vKiBzdHJ1Y3R1cmUgdG8gc3RvcmUgSHlwb3RoZXRpY2FsIFJlZmVyZW5jZSBEZWNvZGVyIChIUkQpIHBhcmFtZXRlcnMgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTMyIGNwYkNudDsKLSAgICB1MzIgYml0UmF0ZVNjYWxlOwotICAgIHUzMiBjcGJTaXplU2NhbGU7Ci0gICAgdTMyIGJpdFJhdGVWYWx1ZVtNQVhfQ1BCX0NOVF07Ci0gICAgdTMyIGNwYlNpemVWYWx1ZVtNQVhfQ1BCX0NOVF07Ci0gICAgdTMyIGNickZsYWdbTUFYX0NQQl9DTlRdOwotICAgIHUzMiBpbml0aWFsQ3BiUmVtb3ZhbERlbGF5TGVuZ3RoOwotICAgIHUzMiBjcGJSZW1vdmFsRGVsYXlMZW5ndGg7Ci0gICAgdTMyIGRwYk91dHB1dERlbGF5TGVuZ3RoOwotICAgIHUzMiB0aW1lT2Zmc2V0TGVuZ3RoOwotfSBocmRQYXJhbWV0ZXJzX3Q7Ci0KLS8qIHN0b3JhZ2UgZm9yIFZVSSBwYXJhbWV0ZXJzICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIHUzMiBhc3BlY3RSYXRpb1ByZXNlbnRGbGFnOwotICAgIHUzMiBhc3BlY3RSYXRpb0lkYzsKLSAgICB1MzIgc2FyV2lkdGg7Ci0gICAgdTMyIHNhckhlaWdodDsKLSAgICB1MzIgb3ZlcnNjYW5JbmZvUHJlc2VudEZsYWc7Ci0gICAgdTMyIG92ZXJzY2FuQXBwcm9wcmlhdGVGbGFnOwotICAgIHUzMiB2aWRlb1NpZ25hbFR5cGVQcmVzZW50RmxhZzsKLSAgICB1MzIgdmlkZW9Gb3JtYXQ7Ci0gICAgdTMyIHZpZGVvRnVsbFJhbmdlRmxhZzsKLSAgICB1MzIgY29sb3VyRGVzY3JpcHRpb25QcmVzZW50RmxhZzsKLSAgICB1MzIgY29sb3VyUHJpbWFyaWVzOwotICAgIHUzMiB0cmFuc2ZlckNoYXJhY3RlcmlzdGljczsKLSAgICB1MzIgbWF0cml4Q29lZmZpY2llbnRzOwotICAgIHUzMiBjaHJvbWFMb2NJbmZvUHJlc2VudEZsYWc7Ci0gICAgdTMyIGNocm9tYVNhbXBsZUxvY1R5cGVUb3BGaWVsZDsKLSAgICB1MzIgY2hyb21hU2FtcGxlTG9jVHlwZUJvdHRvbUZpZWxkOwotICAgIHUzMiB0aW1pbmdJbmZvUHJlc2VudEZsYWc7Ci0gICAgdTMyIG51bVVuaXRzSW5UaWNrOwotICAgIHUzMiB0aW1lU2NhbGU7Ci0gICAgdTMyIGZpeGVkRnJhbWVSYXRlRmxhZzsKLSAgICB1MzIgbmFsSHJkUGFyYW1ldGVyc1ByZXNlbnRGbGFnOwotICAgIGhyZFBhcmFtZXRlcnNfdCBuYWxIcmRQYXJhbWV0ZXJzOwotICAgIHUzMiB2Y2xIcmRQYXJhbWV0ZXJzUHJlc2VudEZsYWc7Ci0gICAgaHJkUGFyYW1ldGVyc190IHZjbEhyZFBhcmFtZXRlcnM7Ci0gICAgdTMyIGxvd0RlbGF5SHJkRmxhZzsKLSAgICB1MzIgcGljU3RydWN0UHJlc2VudEZsYWc7Ci0gICAgdTMyIGJpdHN0cmVhbVJlc3RyaWN0aW9uRmxhZzsKLSAgICB1MzIgbW90aW9uVmVjdG9yc092ZXJQaWNCb3VuZGFyaWVzRmxhZzsKLSAgICB1MzIgbWF4Qnl0ZXNQZXJQaWNEZW5vbTsKLSAgICB1MzIgbWF4Qml0c1Blck1iRGVub207Ci0gICAgdTMyIGxvZzJNYXhNdkxlbmd0aEhvcml6b250YWw7Ci0gICAgdTMyIGxvZzJNYXhNdkxlbmd0aFZlcnRpY2FsOwotICAgIHUzMiBudW1SZW9yZGVyRnJhbWVzOwotICAgIHUzMiBtYXhEZWNGcmFtZUJ1ZmZlcmluZzsKLX0gdnVpUGFyYW1ldGVyc190OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkRGVjb2RlVnVpUGFyYW1ldGVycyhzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gICAgdnVpUGFyYW1ldGVyc190ICpwVnVpUGFyYW1ldGVycyk7Ci0KLSNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX1ZVSV9IICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL0FuZHJvaWQuYnAKaW5kZXggODhkNmVjNC4uNDMzMThmMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL0FuZHJvaWQuYnAKQEAgLTE0LDcgKzE0LDYgQEAKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJvcHVzIiwKLSAgICAgICAgImxpYm1lZGlhX29teCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1dGlscyIsCkBAIC0yMyw2ICsyMiw4IEBACiAKICAgICBjZmxhZ3M6IFsiLVdlcnJvciJdLAogCisgICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCisKICAgICBzYW5pdGl6ZTogewogICAgICAgICBtaXNjX3VuZGVmaW5lZDogWwogICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9leHBvcnRzLmxkcyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9leHBvcnRzLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjRmM2ZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL2V4cG9ydHMubGRzCkBAIC0wLDAgKzEsNSBAQAoreworICAgIGdsb2JhbDoKKyAgICAgICAgX1oyMmNyZWF0ZVNvZnRPTVhDb21wb25lbnRQS2NQSzE2T01YX0NBTExCQUNLVFlQRVB2UFAxN09NWF9DT01QT05FTlRUWVBFOworICAgIGxvY2FsOiAqOworfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvQW5kcm9pZC5icAppbmRleCBmMjFkNDZmLi5jOGQ3ZDAwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9BbmRyb2lkLmJwCkBAIC0xNCw2ICsxNCw4IEBACiAKICAgICBjZmxhZ3M6IFsiLVdlcnJvciJdLAogCisgICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCisKICAgICBzYW5pdGl6ZTogewogICAgICAgICBtaXNjX3VuZGVmaW5lZDogWwogICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvZXhwb3J0cy5sZHMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L2V4cG9ydHMubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNGYzZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L2V4cG9ydHMubGRzCkBAIC0wLDAgKzEsNSBAQAoreworICAgIGdsb2JhbDoKKyAgICAgICAgX1oyMmNyZWF0ZVNvZnRPTVhDb21wb25lbnRQS2NQSzE2T01YX0NBTExCQUNLVFlQRVB2UFAxN09NWF9DT01QT05FTlRUWVBFOworICAgIGxvY2FsOiAqOworfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9BbmRyb2lkLmJwCmluZGV4IDYyOGIzNmMuLmE5MjY1Y2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvQW5kcm9pZC5icApAQCAtMTQsNyArMTQsNiBAQAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYnZvcmJpc2lkZWMiLAotICAgICAgICAibGlibWVkaWFfb214IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnV0aWxzIiwKQEAgLTIzLDYgKzIyLDggQEAKIAogICAgIGNmbGFnczogWyItV2Vycm9yIl0sCiAKKyAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKKwogICAgIHNhbml0aXplOiB7CiAgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvZXhwb3J0cy5sZHMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9leHBvcnRzLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjRmM2ZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvZXhwb3J0cy5sZHMKQEAgLTAsMCArMSw1IEBACit7CisgICAgZ2xvYmFsOgorICAgICAgICBfWjIyY3JlYXRlU29mdE9NWENvbXBvbmVudFBLY1BLMTZPTVhfQ0FMTEJBQ0tUWVBFUHZQUDE3T01YX0NPTVBPTkVOVFRZUEU7CisgICAgbG9jYWw6ICo7Cit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3hhYWNkZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy94YWFjZGVjL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM5MmYxZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy94YWFjZGVjL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzNiBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X3hhYWNkZWMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJTb2Z0WEFBQy5jcHAiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCisgICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLURFTkFCTEVfTVBFR19EX0RSQyIKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgLy8gaW50ZWdlcl9vdmVyZmxvdzogdHJ1ZSwKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLCBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYnhhYWNkZWMiXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICBdLAorCisgICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy94YWFjZGVjL1NvZnRYQUFDLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy94YWFjZGVjL1NvZnRYQUFDLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2FlZmE4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3hhYWNkZWMvU29mdFhBQUMuY3BwCkBAIC0wLDAgKzEsMTg4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiU29mdFhBQUMiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJTb2Z0WEFBQy5oIgorCisjaW5jbHVkZSA8T01YX0F1ZGlvRXh0Lmg+CisjaW5jbHVkZSA8T01YX0luZGV4RXh0Lmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfUkVGX0xFVkVMIDY0ICAvKiA2NCotMC4yNWRCID0gLTE2IGRCIGJlbG93IGZ1bGwgc2NhbGUgZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQ1VUICAgMTI3IC8qIG1heGltdW0gY29tcHJlc3Npb24gb2YgZHluYW1pYyByYW5nZSBmb3IgbW9iaWxlIGNvbmYgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19CT09TVCAxMjcgLyogbWF4aW11bSBjb21wcmVzc2lvbiBvZiBkeW5hbWljIHJhbmdlIGZvciBtb2JpbGUgY29uZiAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0hFQVZZIDEgICAvKiBzd2l0Y2ggZm9yIGhlYXZ5IGNvbXByZXNzaW9uIGZvciBtb2JpbGUgY29uZiAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRU5DX0xFVkVMICgtMSkgLyogZW5jb2RlciB0YXJnZXQgbGV2ZWw7IC0xID0+IHRoZSB2YWx1ZSBpcyB1bmtub3duLCBvdGhlcndpc2UgZEIgc3RlcCB2YWx1ZSAoZS5nLiA2NCBmb3IgLTE2IGRCKSAqLworI2RlZmluZSBEUkNfS0VZX0FBQ19EUkNfRUZGRUNUX1RZUEUgICAoMykgIC8qIERlZmF1bHQgRWZmZWN0IHR5cGUgaXMgIkxpbWl0ZWQgcGxheWJhY2siICovCisvKiBSRUZfTEVWRUwgb2YgNjQgcGFpcnMgd2VsbCB3aXRoIEVGRkVDVF9UWVBFIG9mIDMuICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9MT1VETkVTU19MRVZFTCAoNjQpICAvKiBEZWZhdWx0IGxvdWRuZXNzIHZhbHVlIGZvciBNUEVHLUQgRFJDICovCisKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfUkVGX0xFVkVMICAiYWFjX2RyY19yZWZlcmVuY2VfbGV2ZWwiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0NVVCAgICAgICAgImFhY19kcmNfY3V0IgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9CT09TVCAgICAgICJhYWNfZHJjX2Jvb3N0IgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9IRUFWWSAgICAgICJhYWNfZHJjX2hlYXZ5IgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9FTkNfTEVWRUwgImFhY19kcmNfZW5jX3RhcmdldF9sZXZlbCIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfRUZGRUNUX1RZUEUgInJvLmFhY19kcmNfZWZmZWN0X3R5cGUiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0xPVURORVNTX0xFVkVMICJhYWNfZHJjX2xvdWRuZXNzX2xldmVsIgorCisjZGVmaW5lIE1BWF9DSEFOTkVMX0NPVU5UICAgICAgICAgICAgOCAgLyogbWF4aW11bSBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMgdGhhdCBjYW4gYmUgZGVjb2RlZCAqLworCisKKyNkZWZpbmUgUkVUVVJOX0lGX05FKHJldHVybmVkLCBleHBlY3RlZCwgcmV0dmFsLCBzdHIpIFwKKyAgICAgICAgaWYgKCByZXR1cm5lZCAhPSBleHBlY3RlZCApIHsgXAorICAgICAgICAgICAgQUxPR0UoIkVycm9yIGluICVzOiBSZXR1cm5lZDogJWQgRXhwZWN0ZWQ6ICVkIiwgc3RyLCByZXR1cm5lZCwgZXhwZWN0ZWQpOyBcCisgICAgICAgICAgICByZXR1cm4gcmV0dmFsOyBcCisgICAgICAgIH0KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitzdGF0aWMgdm9pZCBJbml0T01YUGFyYW1zKFQgKnBhcmFtcykgeworICAgIHBhcmFtcy0+blNpemUgPSBzaXplb2YoVCk7CisgICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5WZXJzaW9uTWFqb3IgPSAxOworICAgIHBhcmFtcy0+blZlcnNpb24ucy5uVmVyc2lvbk1pbm9yID0gMDsKKyAgICBwYXJhbXMtPm5WZXJzaW9uLnMublJldmlzaW9uID0gMDsKKyAgICBwYXJhbXMtPm5WZXJzaW9uLnMublN0ZXAgPSAwOworfQorCitzdGF0aWMgY29uc3QgT01YX1UzMiBrU3VwcG9ydGVkUHJvZmlsZXNbXSA9IHsKKyAgICBPTVhfQVVESU9fQUFDT2JqZWN0TEMsCisgICAgT01YX0FVRElPX0FBQ09iamVjdEhFLAorICAgIE9NWF9BVURJT19BQUNPYmplY3RIRV9QUywKKyAgICBPTVhfQVVESU9fQUFDT2JqZWN0TEQsCisgICAgT01YX0FVRElPX0FBQ09iamVjdEVMRCwKK307CisKK1NvZnRYQUFDOjpTb2Z0WEFBQygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAorICAgICAgICBPTVhfUFRSIGFwcERhdGEsCisgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KQorICAgIDogU2ltcGxlU29mdE9NWENvbXBvbmVudChuYW1lLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCksCisgICAgbUlzQURUUyhmYWxzZSksCisgICAgbUlucHV0QnVmZmVyQ291bnQoMCksCisgICAgbU91dHB1dEJ1ZmZlckNvdW50KDApLAorICAgIG1TaWduYWxsZWRFcnJvcihmYWxzZSksCisgICAgbUxhc3RJbkhlYWRlcihOVUxMKSwKKyAgICBtUHJldlRpbWVzdGFtcCgwKSwKKyAgICBtQ3VycmVudFRpbWVzdGFtcCgwKSwKKyAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlKE5PTkUpLAorICAgIG1YaGVhYWNDb2RlY0hhbmRsZShOVUxMKSwKKyAgICBtTXBlZ0REcmNIYW5kbGUoTlVMTCksCisgICAgbUlucHV0QnVmZmVyU2l6ZSgwKSwKKyAgICBtT3V0cHV0RnJhbWVMZW5ndGgoMTAyNCksCisgICAgbUlucHV0QnVmZmVyKE5VTEwpLAorICAgIG1PdXRwdXRCdWZmZXIoTlVMTCksCisgICAgbVNhbXBGcmVxKDApLAorICAgIG1OdW1DaGFubmVscygwKSwKKyAgICBtUGNtV2RTeigwKSwKKyAgICBtQ2hhbm5lbE1hc2soMCksCisgICAgbUlzQ29kZWNJbml0aWFsaXplZChmYWxzZSksCisgICAgbUlzQ29kZWNDb25maWdGbHVzaFJlcXVpcmVkKGZhbHNlKSwKKyAgICBtcGVnZF9kcmNfcHJlc2VudCgwKSwKKyAgICBkcmNfZmxhZygwKQorCit7CisgICAgaW5pdFBvcnRzKCk7CisgICAgQ0hFQ0tfRVEoaW5pdERlY29kZXIoKSwgKHN0YXR1c190KU9LKTsKK30KKworU29mdFhBQUM6On5Tb2Z0WEFBQygpIHsKKyAgICBpbnQgZXJyQ29kZSA9IGRlSW5pdFhBQUNEZWNvZGVyKCk7CisgICAgaWYgKDAgIT0gZXJyQ29kZSkgeworICAgICAgICBBTE9HRSgiZGVJbml0WEFBQ0RlY29kZXIoKSBmYWlsZWQgJWQiLGVyckNvZGUpOworICAgIH0KKworICAgIG1Jc0NvZGVjSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICBtSXNDb2RlY0NvbmZpZ0ZsdXNoUmVxdWlyZWQgPSBmYWxzZTsKK30KKwordm9pZCBTb2Z0WEFBQzo6aW5pdFBvcnRzKCkgeworICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgZGVmOworICAgIEluaXRPTVhQYXJhbXMoJmRlZik7CisKKyAgICBkZWYublBvcnRJbmRleCA9IDA7CisgICAgZGVmLmVEaXIgPSBPTVhfRGlySW5wdXQ7CisgICAgZGVmLm5CdWZmZXJDb3VudE1pbiA9IGtOdW1JbnB1dEJ1ZmZlcnM7CisgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA9IGRlZi5uQnVmZmVyQ291bnRNaW47CisgICAgZGVmLm5CdWZmZXJTaXplID0gODE5MjsKKyAgICBkZWYuYkVuYWJsZWQgPSBPTVhfVFJVRTsKKyAgICBkZWYuYlBvcHVsYXRlZCA9IE9NWF9GQUxTRTsKKyAgICBkZWYuZURvbWFpbiA9IE9NWF9Qb3J0RG9tYWluQXVkaW87CisgICAgZGVmLmJCdWZmZXJzQ29udGlndW91cyA9IE9NWF9GQUxTRTsKKyAgICBkZWYubkJ1ZmZlckFsaWdubWVudCA9IDE7CisKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLmNNSU1FVHlwZSA9IGNvbnN0X2Nhc3Q8Y2hhciAqPigiYXVkaW8vYWFjIik7CisgICAgZGVmLmZvcm1hdC5hdWRpby5wTmF0aXZlUmVuZGVyID0gTlVMTDsKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLmJGbGFnRXJyb3JDb25jZWFsbWVudCA9IE9NWF9GQUxTRTsKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLmVFbmNvZGluZyA9IE9NWF9BVURJT19Db2RpbmdBQUM7CisKKyAgICBhZGRQb3J0KGRlZik7CisKKyAgICBkZWYublBvcnRJbmRleCA9IDE7CisgICAgZGVmLmVEaXIgPSBPTVhfRGlyT3V0cHV0OworICAgIGRlZi5uQnVmZmVyQ291bnRNaW4gPSBrTnVtT3V0cHV0QnVmZmVyczsKKyAgICBkZWYubkJ1ZmZlckNvdW50QWN0dWFsID0gZGVmLm5CdWZmZXJDb3VudE1pbjsKKyAgICBkZWYubkJ1ZmZlclNpemUgPSA0MDk2ICogTUFYX0NIQU5ORUxfQ09VTlQ7CisgICAgZGVmLmJFbmFibGVkID0gT01YX1RSVUU7CisgICAgZGVmLmJQb3B1bGF0ZWQgPSBPTVhfRkFMU0U7CisgICAgZGVmLmVEb21haW4gPSBPTVhfUG9ydERvbWFpbkF1ZGlvOworICAgIGRlZi5iQnVmZmVyc0NvbnRpZ3VvdXMgPSBPTVhfRkFMU0U7CisgICAgZGVmLm5CdWZmZXJBbGlnbm1lbnQgPSAyOworCisgICAgZGVmLmZvcm1hdC5hdWRpby5jTUlNRVR5cGUgPSBjb25zdF9jYXN0PGNoYXIgKj4oImF1ZGlvL3JhdyIpOworICAgIGRlZi5mb3JtYXQuYXVkaW8ucE5hdGl2ZVJlbmRlciA9IE5VTEw7CisgICAgZGVmLmZvcm1hdC5hdWRpby5iRmxhZ0Vycm9yQ29uY2VhbG1lbnQgPSBPTVhfRkFMU0U7CisgICAgZGVmLmZvcm1hdC5hdWRpby5lRW5jb2RpbmcgPSBPTVhfQVVESU9fQ29kaW5nUENNOworCisgICAgYWRkUG9ydChkZWYpOworfQorCitzdGF0dXNfdCBTb2Z0WEFBQzo6aW5pdERlY29kZXIoKSB7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gVU5LTk9XTl9FUlJPUjsKKworICAgIGludCB1aV9kcmNfdmFsOworICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IElBX05PX0VSUk9SOworICAgIGludCBsb29wID0gMDsKKworICAgIGVycl9jb2RlID0gaW5pdFhBQUNEZWNvZGVyKCk7CisgICAgaWYoZXJyX2NvZGUgIT0gSUFfTk9fRVJST1IpIHsKKyAgICAgICAgaWYgKE5VTEwgPT0gbVhoZWFhY0NvZGVjSGFuZGxlKSB7CisgICAgICAgICAgICBBTE9HRSgiQUFDIGRlY29kZXIgaGFuZGxlIGlzIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoTlVMTCA9PSBtTXBlZ0REcmNIYW5kbGUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJNUEVHLUQgRFJDIGRlY29kZXIgaGFuZGxlIGlzIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBmb3IobG9vcD0gMTsgbG9vcCA8IG1NYWxsb2NDb3VudDsgbG9vcCsrKSB7CisgICAgICAgICAgICBpZiAobU1lbW9yeUFycmF5W2xvb3BdID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yICVkXG4iLGxvb3ApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFMT0dFKCJpbml0WEFBQ0RlY29kZXIgRmFpbGVkIik7CisKKyAgICAgICAgZm9yKGxvb3AgPSAwOyBsb29wIDwgbU1hbGxvY0NvdW50OyBsb29wKyspIHsKKyAgICAgICAgICAgaWYobU1lbW9yeUFycmF5W2xvb3BdKQorICAgICAgICAgICBmcmVlKG1NZW1vcnlBcnJheVtsb29wXSk7CisgICAgICAgIH0KKyAgICAgICAgbU1hbGxvY0NvdW50ID0gMDsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0dXMgPSBPSzsKKyAgICB9CisKKyAgICBtRW5kT2ZJbnB1dCA9IGZhbHNlOworICAgIG1FbmRPZk91dHB1dCA9IGZhbHNlOworCisgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGlmIChwcm9wZXJ0eV9nZXQoUFJPUF9EUkNfT1ZFUlJJREVfUkVGX0xFVkVMLCB2YWx1ZSwgTlVMTCkpCisgICAgeworICAgICAgICB1aV9kcmNfdmFsID0gYXRvaSh2YWx1ZSk7CisgICAgICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBkZXNpcmVkIERSQyB0YXJnZXQgcmVmZXJlbmNlIGxldmVsIG9mICVkIGluc3RlYWQgb2YgJWQiLHVpX2RyY192YWwsCisgICAgICAgICAgICAgICAgRFJDX0RFRkFVTFRfTU9CSUxFX1JFRl9MRVZFTCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHVpX2RyY192YWw9IERSQ19ERUZBVUxUX01PQklMRV9SRUZfTEVWRUw7CisgICAgfQorCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX1RBUkdFVF9MRVZFTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX2RyY192YWwpOworCisgICAgUkVUVVJOX0lGX05FKGVycl9jb2RlLCBJQV9OT19FUlJPUiwgZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX1RBUkdFVF9MRVZFTCIpOworI2lmZGVmICAgICBFTkFCTEVfTVBFR19EX0RSQworCisgICAgaWYgKHByb3BlcnR5X2dldChQUk9QX0RSQ19PVkVSUklERV9MT1VETkVTU19MRVZFTCwgdmFsdWUsIE5VTEwpKQorICAgIHsKKyAgICAgICAgdWlfZHJjX3ZhbCA9IGF0b2kodmFsdWUpOworICAgICAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgZGVzaXJlZCBEUkMgdGFyZ2V0IHJlZmVyZW5jZSBsZXZlbCBvZiAlZCBpbnN0ZWFkIG9mICVkIix1aV9kcmNfdmFsLAorICAgICAgICAgICAgICAgIERSQ19ERUZBVUxUX01PQklMRV9MT1VETkVTU19MRVZFTCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHVpX2RyY192YWw9IERSQ19ERUZBVUxUX01PQklMRV9MT1VETkVTU19MRVZFTDsKKyAgICB9CisKKworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfRFJDX1RBUkdFVF9MT1VETkVTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX2RyY192YWwpOworCisKKyAgICBSRVRVUk5fSUZfTkUoZXJyX2NvZGUsIElBX05PX0VSUk9SLCBlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0RSQ19UQVJHRVRfTE9VRE5FU1MiKTsKKyNlbmRpZgorCisKKyAgICBpZiAocHJvcGVydHlfZ2V0KFBST1BfRFJDX09WRVJSSURFX0NVVCwgdmFsdWUsIE5VTEwpKQorICAgIHsKKyAgICAgICAgdWlfZHJjX3ZhbCA9IGF0b2kodmFsdWUpOworICAgICAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgZGVzaXJlZCBEUkMgYXR0ZW51YXRpb24gZmFjdG9yIG9mICVkIGluc3RlYWQgb2YgJWQiLCB1aV9kcmNfdmFsLAorICAgICAgICAgICAgICAgIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQ1VUKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdWlfZHJjX3ZhbD1EUkNfREVGQVVMVF9NT0JJTEVfRFJDX0NVVDsKKyAgICB9CisKKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfQ1VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfZHJjX3ZhbCk7CisKKyAgICBSRVRVUk5fSUZfTkUoZXJyX2NvZGUsIElBX05PX0VSUk9SLCBlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfQ1VUIik7CisKKyAgICBpZiAocHJvcGVydHlfZ2V0KFBST1BfRFJDX09WRVJSSURFX0JPT1NULCB2YWx1ZSwgTlVMTCkpCisgICAgeworICAgICAgICB1aV9kcmNfdmFsID0gYXRvaSh2YWx1ZSk7CisgICAgICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBkZXNpcmVkIERSQyBib29zdCBmYWN0b3Igb2YgJWQgaW5zdGVhZCBvZiAlZCIsIHVpX2RyY192YWwsCisgICAgICAgICAgICAgICAgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19CT09TVCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHVpX2RyY192YWwgPSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0JPT1NUOworICAgIH0KKworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19CT09TVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX2RyY192YWwpOworICAgIFJFVFVSTl9JRl9ORShlcnJfY29kZSwgSUFfTk9fRVJST1IsIGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19CT09TVCIpOworCisgICAgaWYgKHByb3BlcnR5X2dldChQUk9QX0RSQ19PVkVSUklERV9IRUFWWSwgdmFsdWUsIE5VTEwpKQorICAgIHsKKyAgICAgICAgdWlfZHJjX3ZhbCA9IGF0b2kodmFsdWUpOworICAgICAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgZGVzaXJlZCBIZWF2eSBjb21wcmVzc2lvbiBmYWN0b3Igb2YgJWQgaW5zdGVhZCBvZiAlZCIsIHVpX2RyY192YWwsCisgICAgICAgICAgICAgICAgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19IRUFWWSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHVpX2RyY192YWwgPSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0hFQVZZOworICAgIH0KKworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19IRUFWWV9DT01QLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfZHJjX3ZhbCk7CisgICBSRVRVUk5fSUZfTkUoZXJyX2NvZGUsIElBX05PX0VSUk9SLCBlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfSEVBVllfQ09NUCIpOworCisjaWZkZWYgRU5BQkxFX01QRUdfRF9EUkMKKyAgICBpZiAocHJvcGVydHlfZ2V0KFBST1BfRFJDX09WRVJSSURFX0VGRkVDVF9UWVBFLCB2YWx1ZSwgTlVMTCkpCisgICAgeworICAgICAgICB1aV9kcmNfdmFsID0gYXRvaSh2YWx1ZSk7CisgICAgICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBkZXNpcmVkIERSQyBlZmZlY3QgdHlwZSBvZiAlZCBpbnN0ZWFkIG9mICVkIiwgdWlfZHJjX3ZhbCwKKyAgICAgICAgICAgICAgICBEUkNfS0VZX0FBQ19EUkNfRUZGRUNUX1RZUEUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB1aV9kcmNfdmFsID0gRFJDX0tFWV9BQUNfRFJDX0VGRkVDVF9UWVBFOworICAgIH0KKworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19EUkNfRUZGRUNUX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfZHJjX3ZhbCk7CisKKyAgICBSRVRVUk5fSUZfTkUoZXJyX2NvZGUsIElBX05PX0VSUk9SLCBlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0RSQ19FRkZFQ1RfVFlQRSIpOworCisjZW5kaWYKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitPTVhfRVJST1JUWVBFIFNvZnRYQUFDOjppbnRlcm5hbEdldFBhcmFtZXRlcigKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpIHsKKworICAgIHN3aXRjaCAoKE9NWF9VMzIpIGluZGV4KSB7CisKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5JbmRleCA+IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9Nb3JlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyA9CisgICAgICAgICAgICAgICAgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAwKQorICAgICAgICAgICAgICAgICAgICA/IE9NWF9BVURJT19Db2RpbmdBQUMgOiBPTVhfQVVESU9fQ29kaW5nUENNOworCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb0FhYzoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX0FBQ1BST0ZJTEVUWVBFICphYWNQYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fQUFDUFJPRklMRVRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGFhY1BhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYWFjUGFyYW1zLT5uUG9ydEluZGV4ICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhYWNQYXJhbXMtPm5CaXRSYXRlID0gMDsKKyAgICAgICAgICAgIGFhY1BhcmFtcy0+bkF1ZGlvQmFuZFdpZHRoID0gMDsKKyAgICAgICAgICAgIGFhY1BhcmFtcy0+bkFBQ3Rvb2xzID0gMDsKKyAgICAgICAgICAgIGFhY1BhcmFtcy0+bkFBQ0VSdG9vbHMgPSAwOworICAgICAgICAgICAgYWFjUGFyYW1zLT5lQUFDUHJvZmlsZSA9IE9NWF9BVURJT19BQUNPYmplY3RNYWluOworCisgICAgICAgICAgICBhYWNQYXJhbXMtPmVBQUNTdHJlYW1Gb3JtYXQgPQorICAgICAgICAgICAgICAgIG1Jc0FEVFMKKyAgICAgICAgICAgICAgICAgICAgPyBPTVhfQVVESU9fQUFDU3RyZWFtRm9ybWF0TVA0QURUUworICAgICAgICAgICAgICAgICAgICA6IE9NWF9BVURJT19BQUNTdHJlYW1Gb3JtYXRNUDRGRjsKKworICAgICAgICAgICAgYWFjUGFyYW1zLT5lQ2hhbm5lbE1vZGUgPSBPTVhfQVVESU9fQ2hhbm5lbE1vZGVTdGVyZW87CisKKyAgICAgICAgICAgIGlmICghaXNDb25maWd1cmVkKCkpIHsKKyAgICAgICAgICAgICAgICBhYWNQYXJhbXMtPm5DaGFubmVscyA9IDE7CisgICAgICAgICAgICAgICAgYWFjUGFyYW1zLT5uU2FtcGxlUmF0ZSA9IDQ0MTAwOworICAgICAgICAgICAgICAgIGFhY1BhcmFtcy0+bkZyYW1lTGVuZ3RoID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYWFjUGFyYW1zLT5uQ2hhbm5lbHMgPSBtTnVtQ2hhbm5lbHM7CisgICAgICAgICAgICAgICAgYWFjUGFyYW1zLT5uU2FtcGxlUmF0ZSA9IG1TYW1wRnJlcTsKKyAgICAgICAgICAgICAgICBhYWNQYXJhbXMtPm5GcmFtZUxlbmd0aCA9IG1PdXRwdXRGcmFtZUxlbmd0aDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9QY206CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqcGNtUGFyYW1zID0KKyAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShwY21QYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+blBvcnRJbmRleCAhPSAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcGNtUGFyYW1zLT5lTnVtRGF0YSA9IE9NWF9OdW1lcmljYWxEYXRhU2lnbmVkOworICAgICAgICAgICAgcGNtUGFyYW1zLT5lRW5kaWFuID0gT01YX0VuZGlhbkJpZzsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+YkludGVybGVhdmVkID0gT01YX1RSVUU7CisgICAgICAgICAgICBwY21QYXJhbXMtPm5CaXRQZXJTYW1wbGUgPSAxNjsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+ZVBDTU1vZGUgPSBPTVhfQVVESU9fUENNTW9kZUxpbmVhcjsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUNoYW5uZWxNYXBwaW5nWzBdID0gT01YX0FVRElPX0NoYW5uZWxMRjsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUNoYW5uZWxNYXBwaW5nWzFdID0gT01YX0FVRElPX0NoYW5uZWxSRjsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUNoYW5uZWxNYXBwaW5nWzJdID0gT01YX0FVRElPX0NoYW5uZWxDRjsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUNoYW5uZWxNYXBwaW5nWzNdID0gT01YX0FVRElPX0NoYW5uZWxMRkU7CisgICAgICAgICAgICBwY21QYXJhbXMtPmVDaGFubmVsTWFwcGluZ1s0XSA9IE9NWF9BVURJT19DaGFubmVsTFM7CisgICAgICAgICAgICBwY21QYXJhbXMtPmVDaGFubmVsTWFwcGluZ1s1XSA9IE9NWF9BVURJT19DaGFubmVsUlM7CisKKyAgICAgICAgICAgIGlmICghaXNDb25maWd1cmVkKCkpIHsKKyAgICAgICAgICAgICAgICBwY21QYXJhbXMtPm5DaGFubmVscyA9IDE7CisgICAgICAgICAgICAgICAgcGNtUGFyYW1zLT5uU2FtcGxpbmdSYXRlID0gNDQxMDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBjbVBhcmFtcy0+bkNoYW5uZWxzID0gbU51bUNoYW5uZWxzOworICAgICAgICAgICAgICAgIHBjbVBhcmFtcy0+blNhbXBsaW5nUmF0ZSA9IG1TYW1wRnJlcTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qcm9maWxlUXVlcnlTdXBwb3J0ZWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9BTkRST0lEX1BST0ZJTEVUWVBFICpwcm9maWxlUGFyYW1zID0KKyAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX0FORFJPSURfUFJPRklMRVRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKHByb2ZpbGVQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHByb2ZpbGVQYXJhbXMtPm5Qb3J0SW5kZXggIT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwcm9maWxlUGFyYW1zLT5uUHJvZmlsZUluZGV4ID49IE5FTEVNKGtTdXBwb3J0ZWRQcm9maWxlcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9Nb3JlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcm9maWxlUGFyYW1zLT5lUHJvZmlsZSA9CisgICAgICAgICAgICAgICAga1N1cHBvcnRlZFByb2ZpbGVzW3Byb2ZpbGVQYXJhbXMtPm5Qcm9maWxlSW5kZXhdOworCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoaW5kZXgsIHBhcmFtcyk7CisgICAgfQorfQorCitPTVhfRVJST1JUWVBFIFNvZnRYQUFDOjppbnRlcm5hbFNldFBhcmFtZXRlcigKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpIHsKKworICAgIHN3aXRjaCAoKGludClpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtU3RhbmRhcmRDb21wb25lbnRSb2xlOgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKnJvbGVQYXJhbXMgPQorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKHJvbGVQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHN0cm5jbXAoKGNvbnN0IGNoYXIgKilyb2xlUGFyYW1zLT5jUm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhdWRpb19kZWNvZGVyLmFhYyIsCisgICAgICAgICAgICAgICAgICAgICAgICBPTVhfTUFYX1NUUklOR05BTUVfU0laRSAtIDEpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgIT0gT01YX0FVRElPX0NvZGluZ0FBQykKKyAgICAgICAgICAgICAgICB8fCAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nICE9IE9NWF9BVURJT19Db2RpbmdQQ00pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9BYWM6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9BQUNQUk9GSUxFVFlQRSAqYWFjUGFyYW1zID0KKyAgICAgICAgICAgICAgICAoY29uc3QgT01YX0FVRElPX1BBUkFNX0FBQ1BST0ZJTEVUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShhYWNQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGFhY1BhcmFtcy0+blBvcnRJbmRleCAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGFhY1BhcmFtcy0+ZUFBQ1N0cmVhbUZvcm1hdCA9PSBPTVhfQVVESU9fQUFDU3RyZWFtRm9ybWF0TVA0RkYpIHsKKyAgICAgICAgICAgICAgICBtSXNBRFRTID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFhY1BhcmFtcy0+ZUFBQ1N0cmVhbUZvcm1hdAorICAgICAgICAgICAgICAgICAgICAgICAgPT0gT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdE1QNEFEVFMpIHsKKyAgICAgICAgICAgICAgICBtSXNBRFRTID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkQWFjRHJjUHJlc2VudGF0aW9uOgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9BQUNEUkNQUkVTRU5UQVRJT05UWVBFICphYWNQcmVzUGFyYW1zID0KKyAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9BVURJT19QQVJBTV9BTkRST0lEX0FBQ0RSQ1BSRVNFTlRBVElPTlRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGFhY1ByZXNQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoInNldCBPTVhfRXJyb3JCYWRQYXJhbWV0ZXIiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBmb3IgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIG9mIHRoZSBPTVhfQVVESU9fUEFSQU1fQUFDUFJPRklMRVRZUEUgc3RydWN0dXJlLAorICAgICAgICAgICAgLy8gYSB2YWx1ZSBvZiAtMSBpbXBsaWVzIHRoZSBwYXJhbWV0ZXIgaXMgbm90IHNldCBieSB0aGUgYXBwbGljYXRpb246CisgICAgICAgICAgICAvLyAgIG5NYXhPdXRwdXRDaGFubmVscyAgICAgLTEgYnkgZGVmYXVsdAorICAgICAgICAgICAgLy8gICBuRHJjQ3V0ICAgICAgICAgICAgICAgIHVzZXMgZGVmYXVsdCBwbGF0Zm9ybSBwcm9wZXJ0aWVzLCBzZWUgaW5pdERlY29kZXIoKQorICAgICAgICAgICAgLy8gICBuRHJjQm9vc3QgICAgICAgICAgICAgICAgaWRlbQorICAgICAgICAgICAgLy8gICBuSGVhdnlDb21wcmVzc2lvbiAgICAgICAgaWRlbQorICAgICAgICAgICAgLy8gICBuVGFyZ2V0UmVmZXJlbmNlTGV2ZWwgICAgaWRlbQorICAgICAgICAgICAgLy8gICBuRW5jb2RlZFRhcmdldExldmVsICAgICAgaWRlbQorICAgICAgICAgICAgaWYgKGFhY1ByZXNQYXJhbXMtPm5NYXhPdXRwdXRDaGFubmVscyA+PSAwKSB7CisgICAgICAgICAgICAgICAgaW50IG1heDsKKyAgICAgICAgICAgICAgICBpZiAoYWFjUHJlc1BhcmFtcy0+bk1heE91dHB1dENoYW5uZWxzID49IDgpIHsgbWF4ID0gODsgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFhY1ByZXNQYXJhbXMtPm5NYXhPdXRwdXRDaGFubmVscyA+PSA2KSB7IG1heCA9IDY7IH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhYWNQcmVzUGFyYW1zLT5uTWF4T3V0cHV0Q2hhbm5lbHMgPj0gMikgeyBtYXggPSAyOyB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIC0xIG9yIDA6IGRpc2FibGUgZG93bm1peCwgIDE6IG1vbm8KKyAgICAgICAgICAgICAgICAgICAgbWF4ID0gYWFjUHJlc1BhcmFtcy0+bk1heE91dHB1dENoYW5uZWxzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIEFwcGx5IERSQyBDaGFuZ2VzICovCisgICAgICAgICAgICBzZXRYQUFDRFJDSW5mbyhhYWNQcmVzUGFyYW1zLT5uRHJjQ3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYWFjUHJlc1BhcmFtcy0+bkRyY0Jvb3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYWFjUHJlc1BhcmFtcy0+blRhcmdldFJlZmVyZW5jZUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYWFjUHJlc1BhcmFtcy0+bkhlYXZ5Q29tcHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgI2lmZGVmIEVOQUJMRV9NUEVHX0RfRFJDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAsYWFjUHJlc1BhcmFtcy0+bkRyY0VmZmVjdFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICApOyAgICAvLyBUT0QwIDogUmV2ZXJ0IHRoaXMgY2hhbmdlCisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtOgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKnBjbVBhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0ocGNtUGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwY21QYXJhbXMtPm5Qb3J0SW5kZXggIT0gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjppbnRlcm5hbFNldFBhcmFtZXRlcihpbmRleCwgcGFyYW1zKTsKKyAgICB9Cit9CisKK2Jvb2wgU29mdFhBQUM6OmlzQ29uZmlndXJlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUlucHV0QnVmZmVyQ291bnQgPiAwOworfQorCit2b2lkIFNvZnRYQUFDOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgLyogcG9ydEluZGV4ICovKSB7CisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlICE9IE5PTkUpIHsKKyAgICAgICAgQUxPR0UoIm9uUXVldWVGaWxsZWQgZG8gbm90IHByb2Nlc3MgJWQgJWQiLG1TaWduYWxsZWRFcnJvcixtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQ4X3QqICBpbkJ1ZmZlciAgICAgICAgPSBOVUxMOworICAgIHVpbnQzMl90ICBpbkJ1ZmZlckxlbmd0aCAgPSAwOworCisgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZpblF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDApOworICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmb3V0UXVldWUgPSBnZXRQb3J0UXVldWUoMSk7CisKKyAgICBzaWduZWQgaW50IG51bU91dEJ5dGVzID0gMDsKKworICAgIC8qIElmIGRlY29kZXIgY2FsbCBmYWlscyBpbiBiZXR3ZWVuLCB0aGVuIG1PdXRwdXRGcmFtZUxlbmd0aCBpcyB1c2VkICAqLworICAgIC8qIERlY29kZWQgb3V0cHV0IGZvciBBQUMgaXMgMTAyNC8yMDQ4IHNhbXBsZXMgLyBjaGFubmVsICAgICAgICAgICAgICovCisgICAgLyogVE9ETzogRm9yIFVTQUMgbU91dHB1dEZyYW1lTGVuZ3RoIGNhbiBnbyB1cCB0byA0MDk2ICAgICAgICAgICAgICAgICAqLworICAgIC8qIE5vdGU6IGVudGlyZSBidWZmZXIgbG9naWMgdG8gc2F2ZSBhbmQgcmV0cmlldmUgYXNzdW1lcyAyIGJ5dGVzIHBlciovCisgICAgLyogc2FtcGxlIGN1cnJlbnRseSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZiAobUlzQ29kZWNJbml0aWFsaXplZCkgeworICAgICAgICBudW1PdXRCeXRlcyA9IG1PdXRwdXRGcmFtZUxlbmd0aCAqIChtUGNtV2RTei84KSAqIG1OdW1DaGFubmVsczsKKyAgICAgICAgaWYgKChtUGNtV2RTei84KSAhPSAyKSB7CisgICAgICAgICAgICBBTE9HRSgiWEFBQyBhc3N1bWVzIDIgYnl0ZXMgcGVyIHNhbXBsZSEgbVBjbVdkU3ogJWQiLG1QY21XZFN6KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHdoaWxlICgoIWluUXVldWUuZW1wdHkoKSB8fCBtRW5kT2ZJbnB1dCkgJiYgIW91dFF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgaWYgKCFpblF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIEJ1ZmZlckluZm8gKmluSW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7CisgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7CisKKyAgICAgICAgICAgIG1FbmRPZklucHV0ID0gKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpICE9IDA7CisKKyAgICAgICAgICAgIGlmIChtSW5wdXRCdWZmZXJDb3VudCA9PSAwICYmICEoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJmaXJzdCBidWZmZXIgc2hvdWxkIGhhdmUgT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUcgc2V0Iik7CisgICAgICAgICAgICAgICAgaW5IZWFkZXItPm5GbGFncyB8PSBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgQnVmZmVySW5mbyAqaW5JbmZvID0gKmluUXVldWUuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7CisKKyAgICAgICAgICAgICAgICBpbkJ1ZmZlciA9IGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQ7CisgICAgICAgICAgICAgICAgaW5CdWZmZXJMZW5ndGggPSBpbkhlYWRlci0+bkZpbGxlZExlbjsKKworICAgICAgICAgICAgICAgIC8qIEdBIGhlYWRlciBjb25maWd1cmF0aW9uIHNlbnQgdG8gRGVjb2RlciEgKi8KKyAgICAgICAgICAgICAgICBpbnQgZXJyX2NvZGUgPSBjb25maWdYQUFDRGVjb2RlcihpbkJ1ZmZlcixpbkJ1ZmZlckxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKDAgIT0gZXJyX2NvZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coImNvbmZpZ1hBQUNEZWNvZGVyIGVycl9jb2RlID0gJWQiLCBlcnJfY29kZSk7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCBlcnJfY29kZSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyQ291bnQrKzsKKyAgICAgICAgICAgICAgICBtT3V0cHV0QnVmZmVyQ291bnQrKzsgLy8gZmFrZSBpbmNyZWFzZSBvZiBvdXRwdXRCdWZmZXJDb3VudCB0byBrZWVwIHRoZSBjb3VudGVycyBhbGlnbmVkCisKKyAgICAgICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICAgICAgbUxhc3RJbkhlYWRlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgaW5JbmZvID0gTlVMTDsKKyAgICAgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworICAgICAgICAgICAgICAgIGluSGVhZGVyID0gTlVMTDsKKworICAgICAgICAgICAgICAgIC8vIE9ubHkgc2VuZCBvdXQgcG9ydCBzZXR0aW5ncyBjaGFuZ2VkIGV2ZW50IGlmIGJvdGggc2FtcGxlIHJhdGUKKyAgICAgICAgICAgICAgICAvLyBhbmQgbU51bUNoYW5uZWxzIGFyZSB2YWxpZC4KKyAgICAgICAgICAgICAgICBpZiAobVNhbXBGcmVxICYmIG1OdW1DaGFubmVscyAmJiAhbUlzQ29kZWNDb25maWdGbHVzaFJlcXVpcmVkKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJDb25maWd1cmluZyBkZWNvZGVyOiAlZCBIeiwgJWQgY2hhbm5lbHMiLCBtU2FtcEZyZXEsIG1OdW1DaGFubmVscyk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkLCAxLCAwLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IEFXQUlUSU5HX0RJU0FCTEVEOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuID09IDApIHsKKyAgICAgICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICAgICAgbUxhc3RJbkhlYWRlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgaW5JbmZvID0gTlVMTDsKKyAgICAgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworICAgICAgICAgICAgICAgIGluSGVhZGVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUmVzdG9yZSBPZmZzZXQgYW5kIExlbmd0aCBmb3IgUG9ydCByZWNvbmZpZyBjYXNlCisgICAgICAgICAgICBzaXplX3QgdGVtcE9mZnNldCA9ICBpbkhlYWRlci0+bk9mZnNldDsKKyAgICAgICAgICAgIHNpemVfdCB0ZW1wRmlsbGVkTGVuID0gaW5IZWFkZXItPm5GaWxsZWRMZW47CisgICAgICAgICAgICBpZiAobUlzQURUUykgeworICAgICAgICAgICAgICAgICBzaXplX3QgYWR0c0hlYWRlclNpemUgPSAwOworICAgICAgICAgICAgICAgIC8vIHNraXAgMzAgYml0cywgYWFjX2ZyYW1lX2xlbmd0aCBmb2xsb3dzLgorICAgICAgICAgICAgICAgIC8vIHNzc3Nzc3NzIHNzc3NpaWlwIHBwZmZmZlBjIGNjb2hDQ2xsIGxsbGxsbGxsIGxsbD8/Pz8/CisKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICphZHRzSGVhZGVyID0gaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKKworICAgICAgICAgICAgICAgIGJvb2wgc2lnbmFsRXJyb3IgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5GaWxsZWRMZW4gPCA3KSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJBdWRpbyBkYXRhIHRvbyBzaG9ydCB0byBjb250YWluIGV2ZW4gdGhlIEFEVFMgaGVhZGVyLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdvdCAlZCBieXRlcy4iLCBpbkhlYWRlci0+bkZpbGxlZExlbik7CisgICAgICAgICAgICAgICAgICAgIGhleGR1bXAoYWR0c0hlYWRlciwgaW5IZWFkZXItPm5GaWxsZWRMZW4pOworICAgICAgICAgICAgICAgICAgICBzaWduYWxFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBwcm90ZWN0aW9uQWJzZW50ID0gKGFkdHNIZWFkZXJbMV0gJiAxKTsKKworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBhYWNfZnJhbWVfbGVuZ3RoID0KKyAgICAgICAgICAgICAgICAgICAgICAgICgoYWR0c0hlYWRlclszXSAmIDMpIDw8IDExKQorICAgICAgICAgICAgICAgICAgICAgICAgfCAoYWR0c0hlYWRlcls0XSA8PCAzKQorICAgICAgICAgICAgICAgICAgICAgICAgfCAoYWR0c0hlYWRlcls1XSA+PiA1KTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5GaWxsZWRMZW4gPCBhYWNfZnJhbWVfbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiTm90IGVub3VnaCBhdWRpbyBkYXRhIGZvciB0aGUgY29tcGxldGUgZnJhbWUuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdvdCAlZCBieXRlcywgZnJhbWUgc2l6ZSBhY2NvcmRpbmcgdG8gdGhlIEFEVFMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGVhZGVyIGlzICV1IGJ5dGVzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSGVhZGVyLT5uRmlsbGVkTGVuLCBhYWNfZnJhbWVfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhleGR1bXAoYWR0c0hlYWRlciwgaW5IZWFkZXItPm5GaWxsZWRMZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYWR0c0hlYWRlclNpemUgPSAocHJvdGVjdGlvbkFic2VudCA/IDcgOiA5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhYWNfZnJhbWVfbGVuZ3RoIDwgYWR0c0hlYWRlclNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYWxFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQnVmZmVyID0gKHVpbnQ4X3QgKilhZHRzSGVhZGVyICsgYWR0c0hlYWRlclNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXJMZW5ndGggPSBhYWNfZnJhbWVfbGVuZ3RoIC0gYWR0c0hlYWRlclNpemU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhlYWRlci0+bk9mZnNldCArPSBhZHRzSGVhZGVyU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiAtPSBhZHRzSGVhZGVyU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChzaWduYWxFcnJvcikgeworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclN0cmVhbUNvcnJ1cHQsIEVSUk9SX01BTEZPUk1FRCwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBpbnNlcnQgYnVmZmVyIHNpemUgYW5kIHRpbWUgc3RhbXAKKyAgICAgICAgICAgICAgICBpZiAobUxhc3RJbkhlYWRlciAhPSBpbkhlYWRlcikgeworICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFRpbWVzdGFtcCA9IGluSGVhZGVyLT5uVGltZVN0YW1wOworICAgICAgICAgICAgICAgICAgICBtTGFzdEluSGVhZGVyID0gaW5IZWFkZXI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUaW1lc3RhbXAgPSBtUHJldlRpbWVzdGFtcCArCisgICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0RnJhbWVMZW5ndGggICogMTAwMDAwMGxsIC8gbVNhbXBGcmVxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW5CdWZmZXIgPSBpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0OworICAgICAgICAgICAgICAgIGluQnVmZmVyTGVuZ3RoID0gaW5IZWFkZXItPm5GaWxsZWRMZW47CisgICAgICAgICAgICAgICAgbUxhc3RJbkhlYWRlciA9IGluSGVhZGVyOworICAgICAgICAgICAgICAgIG1DdXJyZW50VGltZXN0YW1wID0gaW5IZWFkZXItPm5UaW1lU3RhbXA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBudW1Mb29wcyA9IDA7CisgICAgICAgICAgICBzaWduZWQgaW50IHByZXZTYW1wbGVSYXRlID0gbVNhbXBGcmVxOworICAgICAgICAgICAgc2lnbmVkIGludCBwcmV2TnVtQ2hhbm5lbHMgPSBtTnVtQ2hhbm5lbHM7CisKKyAgICAgICAgICAgIC8qIFhBQUMgZGVjb2RlciBleHBlY3RzIGZpcnN0IGZyYW1lIHRvIGJlIGZlZCB2aWEgY29uZmlnWEFBQ0RlY29kZXIgQVBJICovCisgICAgICAgICAgICAvKiB3aGljaCBzaG91bGQgaW5pdGlhbGl6ZSB0aGUgY29kZWMuIE9uY2UgdGhpcyBzdGF0ZSBpcyByZWFjaGVkLCBjYWxsIHRoZSAgKi8KKyAgICAgICAgICAgIC8qIGRlY29kZVhBQUNTdHJlYW0gQVBJIHdpdGggc2FtZSBmcmFtZSB0byBkZWNvZGUhICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICghbUlzQ29kZWNJbml0aWFsaXplZCkgeworICAgICAgICAgICAgICAgIGludCBlcnJfY29kZSA9IGNvbmZpZ1hBQUNEZWNvZGVyKGluQnVmZmVyLGluQnVmZmVyTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoMCAhPSBlcnJfY29kZSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiY29uZmlnWEFBQ0RlY29kZXIgRmFpbGVkIDIgZXJyX2NvZGUgPSAlZCIsIGVycl9jb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIGVycl9jb2RlLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtSXNDb2RlY0NvbmZpZ0ZsdXNoUmVxdWlyZWQgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIW1TYW1wRnJlcSB8fCAhbU51bUNoYW5uZWxzKSB7CisgICAgICAgICAgICAgICAgaWYgKChtSW5wdXRCdWZmZXJDb3VudCA+IDIpICYmIChtT3V0cHV0QnVmZmVyQ291bnQgPD0gMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIkludmFsaWQgQUFDIHN0cmVhbSIpOworICAgICAgICAgICAgICAgICAgICBBTE9HVygibVNhbXBGcmVxICVkIG1OdW1DaGFubmVscyAlZCAiLG1TYW1wRnJlcSxtTnVtQ2hhbm5lbHMpOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKChtU2FtcEZyZXEgIT0gcHJldlNhbXBsZVJhdGUpIHx8CisgICAgICAgICAgICAgICAgICAgICAgIChtTnVtQ2hhbm5lbHMgIT0gcHJldk51bUNoYW5uZWxzKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJSZWNvbmZpZ3VyaW5nIGRlY29kZXI6ICVkLT4lZCBIeiwgJWQtPiVkIGNoYW5uZWxzIiwKKyAgICAgICAgICAgICAgICAgICAgICBwcmV2U2FtcGxlUmF0ZSwgbVNhbXBGcmVxLCBwcmV2TnVtQ2hhbm5lbHMsIG1OdW1DaGFubmVscyk7CisgICAgICAgICAgICAgICAgaW5IZWFkZXItPm5PZmZzZXQgPSB0ZW1wT2Zmc2V0OworICAgICAgICAgICAgICAgIGluSGVhZGVyLT5uRmlsbGVkTGVuID0gdGVtcEZpbGxlZExlbjsKKyAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCwgMSwgMCwgTlVMTCk7CisgICAgICAgICAgICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IEFXQUlUSU5HX0RJU0FCTEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2lnbmVkIGludCBieXRlc0NvbnN1bWVkID0gMDsKKyAgICAgICAgICAgIGludCBlcnJvckNvZGUgPSAwOworICAgICAgICAgICAgaWYgKG1Jc0NvZGVjSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgICAgICBlcnJvckNvZGUgPSBkZWNvZGVYQUFDU3RyZWFtKGluQnVmZmVyLGluQnVmZmVyTGVuZ3RoLCAmYnl0ZXNDb25zdW1lZCwgJm51bU91dEJ5dGVzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coIkFzc3VtcHRpb24gdGhhdCBmaXJzdCBmcmFtZSBhZnRlciBoZWFkZXIgaW5pdGlhbGl6ZXMgZGVjb2RlciBmYWlsZWQhIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiAtPSBieXRlc0NvbnN1bWVkOworICAgICAgICAgICAgaW5IZWFkZXItPm5PZmZzZXQgKz0gYnl0ZXNDb25zdW1lZDsKKworICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQWxsIGRhdGEgbm90IGNvbnN1bWVkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIEluIGNhc2Ugb2YgZXJyb3IsIGRlY29kZXIgd291bGQgaGF2ZSBnaXZlbiBvdXQgZW1wdHkgYnVmZmVyICovCisgICAgICAgICAgICBpZiAoKDAgIT0gZXJyb3JDb2RlKSAmJiAoMCA9PSBudW1PdXRCeXRlcykgJiYgbUlzQ29kZWNJbml0aWFsaXplZCkgeworICAgICAgICAgICAgICAgIG51bU91dEJ5dGVzID0gbU91dHB1dEZyYW1lTGVuZ3RoICogKG1QY21XZFN6LzgpICogbU51bUNoYW5uZWxzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbnVtTG9vcHMrKzsKKworICAgICAgICAgICAgaWYgKDAgPT0gYnl0ZXNDb25zdW1lZCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJieXRlc0NvbnN1bWVkID0gMCBzaG91bGQgbmV2ZXIgaGFwcGVuIik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZXJyb3JDb2RlKSB7CisgICAgICAgICAgICAgICAgLyogQ2xlYXIgYnVmZmVyIGZvciBvdXRwdXQgYnVmZmVyIGlzIGRvbmUgaW5zaWRlIFhBQUMgY29kZWMgKi8KKyAgICAgICAgICAgICAgICAvKiBUT0RPIC0gQ2hlY2sgaWYgYmVsb3cgbWVtc2V0IGlzIG9uIHRvcCBvZiByZXNldCBpbnNpZGUgY29kZWMgKi8KKyAgICAgICAgICAgICAgICBtZW1zZXQobU91dHB1dEJ1ZmZlciwgMCwgbnVtT3V0Qnl0ZXMpOyAvLyBUT0RPOiBjaGVjayBmb3Igb3ZlcmZsb3csIEFTQU4KKworICAgICAgICAgICAgICAgIC8vIERpc2NhcmQgaW5wdXQgYnVmZmVyLgorICAgICAgICAgICAgICAgIGlmIChpbkhlYWRlcikgeworICAgICAgICAgICAgICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiA9IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpbkhlYWRlciAmJiBpbkhlYWRlci0+bkZpbGxlZExlbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyQ291bnQrKzsKKyAgICAgICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICAgICAgbUxhc3RJbkhlYWRlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgaW5JbmZvID0gTlVMTDsKKyAgICAgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworICAgICAgICAgICAgICAgIGluSGVhZGVyID0gTlVMTDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImluSGVhZGVyLT5uRmlsbGVkTGVuID0gJWQiLCBpbkhlYWRlciA/IGluSGVhZGVyLT5uRmlsbGVkTGVuIDogMCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghb3V0UXVldWUuZW1wdHkoKSAmJiBudW1PdXRCeXRlcykgeworICAgICAgICAgICAgICAgIEJ1ZmZlckluZm8gKm91dEluZm8gPSAqb3V0UXVldWUuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyID0gb3V0SW5mby0+bUhlYWRlcjsKKworICAgICAgICAgICAgICAgIGlmIChvdXRIZWFkZXItPm5PZmZzZXQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgib3V0SGVhZGVyLT5uT2Zmc2V0ICE9IDAgaXMgbm90IGhhbmRsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc2lnbmVkIHNob3J0ICpvdXRCdWZmZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxzaWduZWQgc2hvcnQgKj4ob3V0SGVhZGVyLT5wQnVmZmVyICsgb3V0SGVhZGVyLT5uT2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBpbnQgc2FtcGxlc2l6ZSA9IG1OdW1DaGFubmVscyAqIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgICAgICAgICBpZiAob3V0SGVhZGVyLT5uT2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICAgICArIG1PdXRwdXRGcmFtZUxlbmd0aCAqIHNhbXBsZXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgID4gb3V0SGVhZGVyLT5uQWxsb2NMZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImJ1ZmZlciBvdmVyZmxvdyIpOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVtY3B5KG91dEJ1ZmZlciwgbU91dHB1dEJ1ZmZlciwgbnVtT3V0Qnl0ZXMpOworICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IG51bU91dEJ5dGVzOworCisgICAgICAgICAgICAgICAgaWYgKG1FbmRPZklucHV0ICYmICFvdXRRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICAgICAgICAgICAgICBtRW5kT2ZPdXRwdXQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0gbUN1cnJlbnRUaW1lc3RhbXA7CisgICAgICAgICAgICAgICAgbVByZXZUaW1lc3RhbXAgPSBtQ3VycmVudFRpbWVzdGFtcDsKKworICAgICAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJDb3VudCsrOworICAgICAgICAgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICBvdXRJbmZvID0gTlVMTDsKKyAgICAgICAgICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOworICAgICAgICAgICAgICAgIG91dEhlYWRlciA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobUVuZE9mSW5wdXQpIHsKKyAgICAgICAgICAgIGlmICghb3V0UXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGlmICghbUVuZE9mT3V0cHV0KSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIgZW1wdHkgYmxvY2sgc2lnbmFsaW5nIEVPUyIpOworICAgICAgICAgICAgICAgICAgICAvLyBzZW5kIHBhcnRpYWwgb3IgZW1wdHkgYmxvY2sgc2lnbmFsaW5nIEVPUworICAgICAgICAgICAgICAgICAgICBtRW5kT2ZPdXRwdXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIgPSBvdXRJbmZvLT5tSGVhZGVyOworCisgICAgICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPSBtUHJldlRpbWVzdGFtcCA7CisKKyAgICAgICAgICAgICAgICAgICAgbU91dHB1dEJ1ZmZlckNvdW50Kys7CisgICAgICAgICAgICAgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICAgICAgICAgIG91dEluZm8gPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOworICAgICAgICAgICAgICAgICAgICBvdXRIZWFkZXIgPSBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsgLy8gaWYgb3V0UXVldWUgbm90IGVtcHR5IGJ1dCBubyBtb3JlIG91dHB1dAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFNvZnRYQUFDOjpvblBvcnRGbHVzaENvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCkgeworICAgIGlmIChwb3J0SW5kZXggPT0gMCkgeworICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgbmV4dCBidWZmZXIgb3V0cHV0IGRvZXMgbm90IHN0aWxsCisgICAgICAgIC8vIGRlcGVuZCBvbiBmcmFnbWVudHMgZnJvbSB0aGUgbGFzdCBvbmUgZGVjb2RlZC4KKyAgICAgICAgLy8gZHJhaW4gYWxsIGV4aXN0aW5nIGRhdGEKKyAgICAgICAgaWYgKG1Jc0NvZGVjSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgIGNvbmZpZ2ZsdXNoRGVjb2RlKCk7CisgICAgICAgIH0KKyAgICAgICAgZHJhaW5EZWNvZGVyKCk7CisgICAgICAgIG1MYXN0SW5IZWFkZXIgPSBOVUxMOworICAgICAgICBtRW5kT2ZJbnB1dCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICAgIG1FbmRPZk91dHB1dCA9IGZhbHNlOworICAgIH0KK30KKwordm9pZCBTb2Z0WEFBQzo6Y29uZmlnZmx1c2hEZWNvZGUoKSB7CisgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlOworICAgIFVXT1JEMzIgdWlfaW5pdF9kb25lOworICAgIHVpbnQzMl90IGluQnVmZmVyTGVuZ3RoPTgyMDM7CisKKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0lOSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0NNRF9UWVBFX0ZMVVNIX01FTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX1NFVF9JTlBVVF9CWVRFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQnVmZmVyTGVuZ3RoKTsKKworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfRkxVU0hfTUVNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfSU5JVF9ET05FX1FVRVJZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfaW5pdF9kb25lKTsKKworCisgICAgaWYgKHVpX2luaXRfZG9uZSkgeworICAgICAgICBlcnJfY29kZSA9IGdldFhBQUNTdHJlYW1JbmZvKCk7CisgICAgICAgIEFMT0dWKCJGb3VuZCBDb2RlYyB3aXRoIGJlbG93IGNvbmZpZy0tLVxuc2FtcEZyZXEgJWRcbm51bUNoYW5uZWxzICVkXG5wY21XZFN6ICVkXG5jaGFubmVsTWFzayAlZFxub3V0cHV0RnJhbWVMZW5ndGggJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBGcmVxLG1OdW1DaGFubmVscyxtUGNtV2RTeixtQ2hhbm5lbE1hc2ssbU91dHB1dEZyYW1lTGVuZ3RoKTsKKyAgICAgICAgaWYobU51bUNoYW5uZWxzID4gTUFYX0NIQU5ORUxfQ09VTlQpIHsKKyAgICAgICAgICAgIEFMT0dFKCIgTm8gb2YgY2hhbm5lbHMgYXJlIG1vcmUgdGhhbiBtYXggY2hhbm5lbHNcbiIpOworICAgICAgICAgICAgbUlzQ29kZWNJbml0aWFsaXplZCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1Jc0NvZGVjSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIH0KKworfQoraW50IFNvZnRYQUFDOjpkcmFpbkRlY29kZXIoKSB7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgU29mdFhBQUM6Om9uUmVzZXQoKSB7CisgICAgZHJhaW5EZWNvZGVyKCk7CisKKyAgICAvLyByZXNldCB0aGUgImNvbmZpZ3VyZWQiIHN0YXRlCisgICAgbUlucHV0QnVmZmVyQ291bnQgPSAwOworICAgIG1PdXRwdXRCdWZmZXJDb3VudCA9IDA7CisgICAgbUVuZE9mSW5wdXQgPSBmYWxzZTsKKyAgICBtRW5kT2ZPdXRwdXQgPSBmYWxzZTsKKyAgICBtTGFzdEluSGVhZGVyID0gTlVMTDsKKworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBOT05FOworfQorCit2b2lkIFNvZnRYQUFDOjpvblBvcnRFbmFibGVDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgsIGJvb2wgZW5hYmxlZCkgeworICAgIGlmIChwb3J0SW5kZXggIT0gMSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3dpdGNoIChtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlKSB7CisgICAgICAgIGNhc2UgTk9ORToKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQVdBSVRJTkdfRElTQUJMRUQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLKCFlbmFibGVkKTsKKyAgICAgICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBBV0FJVElOR19FTkFCTEVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19FUSgoaW50KW1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UsIChpbnQpQVdBSVRJTkdfRU5BQkxFRCk7CisgICAgICAgICAgICBDSEVDSyhlbmFibGVkKTsKKyAgICAgICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBOT05FOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ludCBTb2Z0WEFBQzo6aW5pdFhBQUNEZWNvZGVyKCkgeworICAgIExPT1BJRFggaTsKKworICAgIC8qIEVycm9yIGNvZGUgKi8KKyAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBJQV9OT19FUlJPUjsKKworICAgIC8qIEZpcnN0IHBhcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBFcnJvciBIYW5kbGVyIEluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogR2V0IExpYnJhcnkgTmFtZSwgTGlicmFyeSBWZXJzaW9uIGFuZCBBUEkgVmVyc2lvbiAqLworICAgIC8qIEluaXRpYWxpemUgQVBJIHN0cnVjdHVyZSArIERlZmF1bHQgY29uZmlnIHNldCAgICAgKi8KKyAgICAvKiBTZXQgY29uZmlnIHBhcmFtcyBmcm9tIHVzZXIgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogSW5pdGlhbGl6ZSBtZW1vcnkgdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIEdldCBtZW1vcnkgaW5mb3JtYXRpb24gYW5kIGFsbG9jYXRlIG1lbW9yeSAgICAgICAgKi8KKworICAgIC8qIE1lbW9yeSB2YXJpYWJsZXMgKi8KKyAgICBVV09SRDMyIHVpX3Byb2NfbWVtX3RhYnNfc2l6ZTsKKyAgICAvKiBBUEkgc2l6ZSAqLworICAgIFVXT1JEMzIgcHVpX2FwaV9zaXplOworCisgICAgbUlucHV0QnVmZmVyU2l6ZSA9IDA7CisgICAgbUlucHV0QnVmZmVyID0gMDsKKyAgICBtT3V0cHV0QnVmZmVyID0gMDsKKyAgICBtTWFsbG9jQ291bnQgPSAwOworCisgICAgLyogUHJvY2VzcyBzdHJ1Y3QgaW5pdGluZyBlbmQgKi8KKyAgICAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogSW5pdGlhbGl6ZSBBUEkgc3RydWN0dXJlIGFuZCBzZXQgY29uZmlnIHBhcmFtcyB0byBkZWZhdWx0ICAgICAgICAqLworICAgIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIC8qIEdldCB0aGUgQVBJIHNpemUgKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkoTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfQVBJX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwdWlfYXBpX3NpemUpOworICAgIFJFVFVSTl9JRl9ORShlcnJfY29kZSwgSUFfTk9fRVJST1IsIGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfQVBJX1NJWkUiKTsKKworICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgQVBJICovCisgICAgbU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPSBtZW1hbGlnbig0LCBwdWlfYXBpX3NpemUpOworICAgIGlmIChtTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJtYWxsb2MgZm9yIHB1aV9hcGlfc2l6ZSArIDQgPj4gJWQgRmFpbGVkIixwdWlfYXBpX3NpemUgKyA0KTsKKyAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOworICAgIH0KKyAgICAvKiBTZXQgQVBJIG9iamVjdCB3aXRoIHRoZSBtZW1vcnkgYWxsb2NhdGVkICovCisgICAgbVhoZWFhY0NvZGVjSGFuZGxlID0KKyAgICAgICAgKHBWT0lEKSgoV09SRDgqKW1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdKTsKKyAgICBtTWFsbG9jQ291bnQrKzsKKworICAgIC8qIFNldCB0aGUgY29uZmlnIHBhcmFtcyB0byBkZWZhdWx0IHZhbHVlcyAqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfSU5JVF9BUElfUFJFX0NPTkZJR19QQVJBTVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIFJFVFVSTl9JRl9ORShlcnJfY29kZSwgSUFfTk9fRVJST1IsIGVycl9jb2RlLCAiSUFfQ01EX1RZUEVfSU5JVF9BUElfUFJFX0NPTkZJR19QQVJBTVMiKTsKKyNpZmRlZiBFTkFCTEVfTVBFR19EX0RSQworICAgIC8qIEdldCB0aGUgQVBJIHNpemUgKi8KKyAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKE5VTEwsIElBX0FQSV9DTURfR0VUX0FQSV9TSVpFLCAwLCAmcHVpX2FwaV9zaXplKTsKKworICAgIFJFVFVSTl9JRl9ORShlcnJfY29kZSwgSUFfTk9fRVJST1IsIGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfQVBJX1NJWkUiKTsKKworICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBBUEkgKi8KKyAgIG1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdID0gbWVtYWxpZ24oNCwgcHVpX2FwaV9zaXplKTsKKworICAgaWYobU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPT0gTlVMTCkKKyAgIHsKKyAgICAgICBBTE9HRSgibWFsbG9jIGZvciBkcmMgYXBpIHN0cnVjdHVyZSBGYWlsZWQiKTsKKyAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICB9CisgICBtZW1zZXQobU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0sMCxwdWlfYXBpX3NpemUpOworCisgICAvKiBTZXQgQVBJIG9iamVjdCB3aXRoIHRoZSBtZW1vcnkgYWxsb2NhdGVkICovCisgICBtTXBlZ0REcmNIYW5kbGUgPQorICAgICAgIChwVk9JRCkoKFdPUkQ4KiltTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSk7CisgICAgbU1hbGxvY0NvdW50Kys7CisKKworICAgIC8qIFNldCB0aGUgY29uZmlnIHBhcmFtcyB0byBkZWZhdWx0IHZhbHVlcyAqLworICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkoCisgICAgICAgbU1wZWdERHJjSGFuZGxlLAorICAgICAgIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICBJQV9DTURfVFlQRV9JTklUX0FQSV9QUkVfQ09ORklHX1BBUkFNUywKKyAgICAgICBOVUxMKTsKKworICAgIFJFVFVSTl9JRl9ORShlcnJfY29kZSwgSUFfTk9fRVJST1IsIGVycl9jb2RlLCAiSUFfQ01EX1RZUEVfSU5JVF9BUElfUFJFX0NPTkZJR19QQVJBTVMiKTsKKyNlbmRpZgorCisgICAgLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIFNldCBjb25maWcgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgVVdPUkQzMiB1aV9tcDRfZmxhZyA9IDE7CisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fSVNNUDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9tcDRfZmxhZyk7CisgICAgUkVUVVJOX0lGX05FKGVycl9jb2RlLCBJQV9OT19FUlJPUiwgZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fSVNNUDQiKTsKKworICAgIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBJbml0aWFsaXplIE1lbW9yeSBpbmZvIHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgLyogR2V0IG1lbW9yeSBpbmZvIHRhYmxlcyBzaXplICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfTUVNVEFCU19TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfcHJvY19tZW1fdGFic19zaXplKTsKKyAgICBSRVRVUk5fSUZfTkUoZXJyX2NvZGUsIElBX05PX0VSUk9SLCBlcnJfY29kZSwgIklBX0FQSV9DTURfR0VUX01FTVRBQlNfU0laRSIpOworICAgIG1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdID0gbWVtYWxpZ24oNCwgdWlfcHJvY19tZW1fdGFic19zaXplKTsKKyAgICBpZiAobU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiTWFsbG9jIGZvciBzaXplICh1aV9wcm9jX21lbV90YWJzX3NpemUgKyA0KSA9ICVkIGZhaWxlZCEiLHVpX3Byb2NfbWVtX3RhYnNfc2l6ZSArIDQpOworICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgfQorCisgICAgLyogU2V0IHBvaW50ZXIgZm9yIHByb2Nlc3MgbWVtb3J5IHRhYmxlcyAgICAqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfU0VUX01FTVRBQlNfUFRSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocFZPSUQpKChXT1JEOCopbU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0pKTsKKyAgICBSRVRVUk5fSUZfTkUoZXJyX2NvZGUsIElBX05PX0VSUk9SLCBlcnJfY29kZSwgIklBX0FQSV9DTURfU0VUX01FTVRBQlNfUFRSIik7CisgICAgbU1hbGxvY0NvdW50Kys7CisKKyAgICAvKiBpbml0aWFsaXplIHRoZSBBUEksIHBvc3QgY29uZmlnLCBmaWxsIG1lbW9yeSB0YWJsZXMgICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9JTklUX0FQSV9QT1NUX0NPTkZJR19QQVJBTVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIFJFVFVSTl9JRl9ORShlcnJfY29kZSwgSUFfTk9fRVJST1IsIGVycl9jb2RlLCAiSUFfQ01EX1RZUEVfSU5JVF9BUElfUE9TVF9DT05GSUdfUEFSQU1TIik7CisKKyAgICAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogQWxsb2NhdGUgTWVtb3J5IHdpdGggaW5mbyBmcm9tIGxpYnJhcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBUaGVyZSBhcmUgZm91ciBkaWZmZXJlbnQgdHlwZXMgb2YgbWVtb3JpZXMsIHRoYXQgbmVlZHMgdG8gYmUgYWxsb2NhdGVkICovCisgICAgLyogcGVyc2lzdGVudCxzY3JhdGNoLGlucHV0IGFuZCBvdXRwdXQgKi8KKyAgICBmb3IoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgaW50IHVpX3NpemUgPSAwLCB1aV9hbGlnbm1lbnQgPSAwLCB1aV90eXBlID0gMDsKKyAgICAgICAgcFZPSUQgcHZfYWxsb2NfcHRyOworCisgICAgICAgIC8qIEdldCBtZW1vcnkgc2l6ZSAqLworICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfc2l6ZSk7CisgICAgICAgIFJFVFVSTl9JRl9ORShlcnJfY29kZSwgSUFfTk9fRVJST1IsIGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fU0laRSIpOworCisgICAgICAgIC8qIEdldCBtZW1vcnkgYWxpZ25tZW50ICovCisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19BTElHTk1FTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX2FsaWdubWVudCk7CisgICAgICAgIFJFVFVSTl9JRl9ORShlcnJfY29kZSwgSUFfTk9fRVJST1IsIGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fQUxJR05NRU5UIik7CisKKyAgICAgICAgLyogR2V0IG1lbW9yeSB0eXBlICovCisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19UWVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV90eXBlKTsKKyAgICAgICAgUkVUVVJOX0lGX05FKGVycl9jb2RlLCBJQV9OT19FUlJPUiwgZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19UWVBFIik7CisKKyAgICAgICAgbU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPQorICAgICAgICAgICAgbWVtYWxpZ24odWlfYWxpZ25tZW50ICwgdWlfc2l6ZSk7CisgICAgICAgIGlmIChtTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiTWFsbG9jIGZvciBzaXplICh1aV9zaXplICsgdWlfYWxpZ25tZW50KSA9ICVkIGZhaWxlZCEiLHVpX3NpemUgKyB1aV9hbGlnbm1lbnQpOworICAgICAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOworICAgICAgICB9CisgICAgICAgIHB2X2FsbG9jX3B0ciA9CisgICAgICAgICAgICAocFZPSUQgKSgoV09SRDgqKW1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdKTsKKyAgICAgICAgbU1hbGxvY0NvdW50Kys7CisKKyAgICAgICAgLyogU2V0IHRoZSBidWZmZXIgcG9pbnRlciAqLworICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdl9hbGxvY19wdHIpOworICAgICAgICBSRVRVUk5fSUZfTkUoZXJyX2NvZGUsIElBX05PX0VSUk9SLCBlcnJfY29kZSwgIklBX0FQSV9DTURfU0VUX01FTV9QVFIiKTsKKyAgICAgICAgaWYgKHVpX3R5cGUgPT0gSUFfTUVNVFlQRV9JTlBVVCkgeworICAgICAgICAgICAgbUlucHV0QnVmZmVyID0gKHBXT1JEOClwdl9hbGxvY19wdHI7CisgICAgICAgICAgICBtSW5wdXRCdWZmZXJTaXplID0gdWlfc2l6ZTsKKworICAgICAgICB9CisKKyAgICAgICAgaWYgKHVpX3R5cGUgPT0gSUFfTUVNVFlQRV9PVVRQVVQpIHsKKyAgICAgICAgICAgIG1PdXRwdXRCdWZmZXIgPSAocFdPUkQ4KXB2X2FsbG9jX3B0cjsKKyAgICAgICAgfQorCisgICAgfQorICAgIC8qIEVuZCBmaXJzdCBwYXJ0ICovCisKKyAgcmV0dXJuIElBX05PX0VSUk9SOworfQorCitpbnQgU29mdFhBQUM6OmNvbmZpZ1hBQUNEZWNvZGVyKHVpbnQ4X3QqIGluQnVmZmVyLCB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCkgeworCisgICAgVVdPUkQzMiB1aV9pbml0X2RvbmU7CisgICAgaW50MzJfdCBpX2J5dGVzX2NvbnN1bWVkOworCisgICAgaWYgKG1JbnB1dEJ1ZmZlclNpemUgPCBpbkJ1ZmZlckxlbmd0aCkgeworICAgICAgICBBTE9HRSgiQ2Fubm90IGNvbmZpZyBBQUMsIGlucHV0IGJ1ZmZlciBzaXplICVkIDwgaW5CdWZmZXJMZW5ndGggJWQiLG1JbnB1dEJ1ZmZlclNpemUsaW5CdWZmZXJMZW5ndGgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyogQ29weSB0aGUgYnVmZmVyIHBhc3NlZCBieSBBbmRyb2lkIHBsdWdpbiB0byBjb2RlYyBpbnB1dCBidWZmZXIgKi8KKyAgICBtZW1jcHkobUlucHV0QnVmZmVyLCBpbkJ1ZmZlciwgaW5CdWZmZXJMZW5ndGgpOworCisgICAgLyogU2V0IG51bWJlciBvZiBieXRlcyB0byBiZSBwcm9jZXNzZWQgKi8KKyAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfU0VUX0lOUFVUX0JZVEVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkJ1ZmZlckxlbmd0aCk7CisgICAgUkVUVVJOX0lGX05FKGVycl9jb2RlLCBJQV9OT19FUlJPUiwgZXJyX2NvZGUsICJJQV9BUElfQ01EX1NFVF9JTlBVVF9CWVRFUyIpOworCisgICAgaWYgKG1Jc0NvZGVjQ29uZmlnRmx1c2hSZXF1aXJlZCkgeworICAgICAgICAvKiBJZiBjb2RlYyBpcyBhbHJlYWR5IGluaXRpYWxpemVkLCB0aGVuIEdBIGhlYWRlciBpcyBwYXNzZWQgYWdhaW4gKi8KKyAgICAgICAgLyogTmVlZCB0byBjYWxsIHRoZSBGbHVzaCBBUEkgaW5zdGVhZCBvZiBJTklUX1BST0NFU1MgKi8KKyAgICAgICAgbUlzQ29kZWNJbml0aWFsaXplZCA9IGZhbHNlOyAvKiBDb2RlYyBuZWVkcyB0byBiZSBSZWluaXRpYWxpemVkIGFmdGVyIGZsdXNoICovCisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0lOSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9HQV9IRFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgUkVUVVJOX0lGX05FKGVycl9jb2RlLCBJQV9OT19FUlJPUiwgZXJyX2NvZGUsICJJQV9DTURfVFlQRV9HQV9IRFIiKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIHByb2Nlc3MgKi8KKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0NNRF9UWVBFX0lOSVRfUFJPQ0VTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICBBTE9HVigiSUFfQ01EX1RZUEVfSU5JVF9QUk9DRVNTIHJldHVybmVkIGVycm9yX2NvZGUgPSAlZCIsZXJyX2NvZGUpOworICAgIH0KKworICAgIC8qIENoZWNraW5nIGZvciBlbmQgb2YgaW5pdGlhbGl6YXRpb24gKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0lOSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0NNRF9UWVBFX0lOSVRfRE9ORV9RVUVSWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX2luaXRfZG9uZSk7CisgICAgUkVUVVJOX0lGX05FKGVycl9jb2RlLCBJQV9OT19FUlJPUiwgZXJyX2NvZGUsICJJQV9DTURfVFlQRV9JTklUX0RPTkVfUVVFUlkiKTsKKworICAgIC8qIEhvdyBtdWNoIGJ1ZmZlciBpcyB1c2VkIGluIGlucHV0IGJ1ZmZlcnMgKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9DVVJJRFhfSU5QVVRfQlVGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaV9ieXRlc19jb25zdW1lZCk7CisgICAgUkVUVVJOX0lGX05FKGVycl9jb2RlLCBJQV9OT19FUlJPUiwgZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9DVVJJRFhfSU5QVVRfQlVGIik7CisKKyAgICBpZih1aV9pbml0X2RvbmUpeworICAgICAgICBlcnJfY29kZSA9IGdldFhBQUNTdHJlYW1JbmZvKCk7CisgICAgICAgIEFMT0dJKCJGb3VuZCBDb2RlYyB3aXRoIGJlbG93IGNvbmZpZy0tLVxuc2FtcEZyZXEgJWRcbm51bUNoYW5uZWxzICVkXG5wY21XZFN6ICVkXG5jaGFubmVsTWFzayAlZFxub3V0cHV0RnJhbWVMZW5ndGggJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBGcmVxLG1OdW1DaGFubmVscyxtUGNtV2RTeixtQ2hhbm5lbE1hc2ssbU91dHB1dEZyYW1lTGVuZ3RoKTsKKyAgICAgICAgbUlzQ29kZWNJbml0aWFsaXplZCA9IHRydWU7CisKKyNpZmRlZiBFTkFCTEVfTVBFR19EX0RSQworICAgICAgICBjb25maWdNUEVHRERyYygpOworI2VuZGlmCisgICAgfQorCisgICAgcmV0dXJuIGVycl9jb2RlOworfQoraW50IFNvZnRYQUFDOjpjb25maWdNUEVHRERyYygpCit7CisgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBJQV9OT19FUlJPUjsKKyAgIGludCBpX2VmZmVjdF90eXBlOworICAgaW50IGlfbG91ZF9ub3JtOworICAgaW50IGlfdGFyZ2V0X2xvdWRuZXNzOworICAgdW5zaWduZWQgaW50IGlfc2JyX21vZGU7CisgICBpbnQgbl9tZW1zOworICAgaW50IGk7CisKKyNpZmRlZiAgICAgRU5BQkxFX01QRUdfRF9EUkMKKyAgICB7CisKKyAgICAvKiBTYW1wbGluZyBGcmVxdWVuY3kgKi8KKyAgICB7CisgICAgICBlcnJfY29kZSA9CisgICAgICAgICAgaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fU0FNUF9GUkVRLCAmbVNhbXBGcmVxKTsKKyAgICAgIFJFVFVSTl9JRl9ORShlcnJfY29kZSwgSUFfTk9fRVJST1IsIGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fU0FNUF9GUkVRIik7CisgICAgfQorICAgIC8qIFRvdGFsIE51bWJlciBvZiBDaGFubmVscyAqLworICAgIHsKKyAgICAgIGVycl9jb2RlID0KKyAgICAgICAgICBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9OVU1fQ0hBTk5FTFMsICZtTnVtQ2hhbm5lbHMpOworICAgICAgUkVUVVJOX0lGX05FKGVycl9jb2RlLCBJQV9OT19FUlJPUiwgZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9OVU1fQ0hBTk5FTFMiKTsKKyAgICB9CisKKyAgICAvKiBQQ00gd29yZCBzaXplICAqLworICAgIHsKKyAgICAgIGVycl9jb2RlID0KKyAgICAgICAgICBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9QQ01fV0RTWiwgJm1QY21XZFN6KTsKKyAgICAgIFJFVFVSTl9JRl9ORShlcnJfY29kZSwgSUFfTk9fRVJST1IsIGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fUENNX1dEU1oiKTsKKyAgICB9CisKKyAgICAvKlNldCBFZmZlY3QgVHlwZSovCisKKyAgICB7CisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfRUZGRUNUX1RZUEUsICZpX2VmZmVjdF90eXBlKTsKKyAgICAgICAgUkVUVVJOX0lGX05FKGVycl9jb2RlLCBJQV9OT19FUlJPUiwgZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0VGRkVDVF9UWVBFIik7CisKKworICAgICAgICBlcnJfY29kZSA9CisgICAgICAgICAgICBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19EUkNfRUZGRUNUX1RZUEUsICZpX2VmZmVjdF90eXBlKTsKKyAgICAgICAgUkVUVVJOX0lGX05FKGVycl9jb2RlLCBJQV9OT19FUlJPUiwgZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19EUkNfRUZGRUNUX1RZUEUiKTsKKworICAgIH0KKworLypTZXQgdGFyZ2V0IGxvdWRuZXNzICovCisKKyAgICB7CisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaSgKKyAgICAgICAgICAgIG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19UQVJHRVRfTE9VRE5FU1MsICZpX3RhcmdldF9sb3VkbmVzcyk7CisgICAgICAgIFJFVFVSTl9JRl9ORShlcnJfY29kZSwgSUFfTk9fRVJST1IsIGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19UQVJHRVRfTE9VRE5FU1MiKTsKKworCisgICAgICAgIGVycl9jb2RlID0KKyAgICAgICAgICAgIGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX0RSQ19UQVJHRVRfTE9VRE5FU1MsICZpX3RhcmdldF9sb3VkbmVzcyk7CisgICAgICAgIFJFVFVSTl9JRl9ORShlcnJfY29kZSwgSUFfTk9fRVJST1IsIGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfRFJDX1RBUkdFVF9MT1VETkVTUyIpOworCisgICAgfQorCisgICAgLypTZXQgbG91ZF9ub3JtX2ZsYWcqLworICAgIHsKKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKAorICAgICAgICAgICAgbVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0xPVURfTk9STSwgJmlfbG91ZF9ub3JtKTsKKyAgICAgICAgUkVUVVJOX0lGX05FKGVycl9jb2RlLCBJQV9OT19FUlJPUiAsIGVycl9jb2RlLCJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0xPVURfTk9STSIpOworCisKKyAgICAgICAgZXJyX2NvZGUgPQorICAgICAgICAgICAgaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgSUFfRFJDX0RFQ19DT05GSUdfRFJDX0xPVURfTk9STSwgJmlfbG91ZF9ub3JtKTsKKyAgICAgICAgUkVUVVJOX0lGX05FKGVycl9jb2RlLCBJQV9OT19FUlJPUiAsIGVycl9jb2RlLCJJQV9EUkNfREVDX0NPTkZJR19EUkNfTE9VRF9OT1JNIik7CisKKyAgICB9CisKKworCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKAorICAgICAgICBtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX1NCUl9NT0RFLCAmaV9zYnJfbW9kZSk7CisgICAgICAgIFJFVFVSTl9JRl9ORShlcnJfY29kZSwgSUFfTk9fRVJST1IgLCBlcnJfY29kZSwiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX1NCUl9NT0RFIik7CisKKworICAgIGlmKGlfc2JyX21vZGUhPTApCisgICAgeworICAgICAgICBXT1JEMzIgZnJhbWVfbGVuZ3RoOworICAgICAgICBpZiAoaV9zYnJfbW9kZT09MSkKKyAgICAgICAgeworICAgICAgICAgICAgZnJhbWVfbGVuZ3RoPTIwNDg7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZihpX3Nicl9tb2RlPT0zKQorICAgICAgICB7CisgICAgICAgICAgICBmcmFtZV9sZW5ndGg9NDA5NjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGZyYW1lX2xlbmd0aD0xMDI0OworICAgICAgICB9CisgICAgICAgIGVycl9jb2RlID0KKyAgICAgICAgICAgIGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX1BBUkFNX0ZSQU1FX1NJWkUsICZmcmFtZV9sZW5ndGgpOworICAgICAgICBSRVRVUk5fSUZfTkUoZXJyX2NvZGUsIElBX05PX0VSUk9SLCBlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX1BBUkFNX0ZSQU1FX1NJWkUiKTsKKworICAgIH0KKworCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0NNRF9UWVBFX0lOSVRfQVBJX1BPU1RfQ09ORklHX1BBUkFNUywgTlVMTCk7CisKKyAgICBSRVRVUk5fSUZfTkUoZXJyX2NvZGUsIElBX05PX0VSUk9SLCBlcnJfY29kZSwgIklBX0NNRF9UWVBFX0lOSVRfQVBJX1BPU1RfQ09ORklHX1BBUkFNUyIpOworCisKKworICAgIGZvciAoaSA9IDA7IGkgPCAoV09SRDMyKTI7IGkrKykgeworICAgICAgV09SRDMyIHVpX3NpemUsIHVpX2FsaWdubWVudCwgdWlfdHlwZTsKKyAgICAgIHBWT0lEIHB2X2FsbG9jX3B0cjsKKworICAgICAgLyogR2V0IG1lbW9yeSBzaXplICovCisgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fU0laRSwgaSwgJnVpX3NpemUpOworCisgICAgIFJFVFVSTl9JRl9ORShlcnJfY29kZSwgSUFfTk9fRVJST1IsIGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fU0laRSIpOworCisgICAgICAvKiBHZXQgbWVtb3J5IGFsaWdubWVudCAqLworICAgICAgZXJyX2NvZGUgPQorICAgICAgICAgIGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19BTElHTk1FTlQsIGksICZ1aV9hbGlnbm1lbnQpOworCisgICAgICBSRVRVUk5fSUZfTkUoZXJyX2NvZGUsIElBX05PX0VSUk9SLCBlcnJfY29kZSwgIklBX0FQSV9DTURfR0VUX01FTV9JTkZPX0FMSUdOTUVOVCIpOworCisgICAgICAvKiBHZXQgbWVtb3J5IHR5cGUgKi8KKyAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19UWVBFLCBpLCAmdWlfdHlwZSk7CisKKyAgICAgUkVUVVJOX0lGX05FKGVycl9jb2RlLCBJQV9OT19FUlJPUiwgZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19UWVBFIik7CisKKworICAgICAgbU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPSBtZW1hbGlnbig0LCB1aV9zaXplKTsKKyAgICAgIGlmIChtTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIgQ2Fubm90IGNyZWF0ZSByZXF1ZXN0ZWQgbWVtb3J5ICAlZCIsdWlfc2l6ZSk7CisgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICAgIH0KKyAgICAgICAgcHZfYWxsb2NfcHRyID0KKyAgICAgICAgICAgIChwVk9JRCApKChXT1JEOCopbU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0pOworICAgICAgICBtTWFsbG9jQ291bnQrKzsKKworICAgICAgICAgICAvKiBTZXQgdGhlIGJ1ZmZlciBwb2ludGVyICovCisgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiwgaSwgcHZfYWxsb2NfcHRyKTsKKworICAgICAgUkVUVVJOX0lGX05FKGVycl9jb2RlLCBJQV9OT19FUlJPUiwgZXJyX2NvZGUsICJJQV9BUElfQ01EX1NFVF9NRU1fUFRSIik7CisgICAgfQorICAgIHsKKyAgICBXT1JEMzIgdWlfc2l6ZTsKKyAgICB1aV9zaXplPTgxOTIqMjsKKyAgICBtTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XT1tZW1hbGlnbig0LCB1aV9zaXplKTsKKyAgICAgIGlmIChtTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIgQ2Fubm90IGNyZWF0ZSByZXF1ZXN0ZWQgbWVtb3J5ICAlZCIsdWlfc2l6ZSk7CisgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICAgIH0KKworICAgIGRyY19pcF9idWY9KGludDhfdCAqKW1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdOworICAgIG1NYWxsb2NDb3VudCsrOworICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9NRU1fUFRSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgLyptT3V0cHV0QnVmZmVyKi8gZHJjX2lwX2J1Zik7CisgICAgUkVUVVJOX0lGX05FKGVycl9jb2RlLCBJQV9OT19FUlJPUiwgZXJyX2NvZGUsICJJQV9BUElfQ01EX1NFVF9NRU1fUFRSIik7CisKKyAgICBtTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XT1tZW1hbGlnbig0LCB1aV9zaXplKTsKKyAgICAgIGlmIChtTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIgQ2Fubm90IGNyZWF0ZSByZXF1ZXN0ZWQgbWVtb3J5ICAlZCIsdWlfc2l6ZSk7CisgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICAgIH0KKworICAgIGRyY19vcF9idWY9KGludDhfdCAqKW1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdOworICAgIG1NYWxsb2NDb3VudCsrOworICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9NRU1fUFRSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywgLyptT3V0cHV0QnVmZmVyKi8gZHJjX29wX2J1Zik7CisgICAgUkVUVVJOX0lGX05FKGVycl9jb2RlLCBJQV9OT19FUlJPUiwgZXJyX2NvZGUsICJJQV9BUElfQ01EX1NFVF9NRU1fUFRSIik7CisgICAgfQorICAgIC8qSVRUSUFNOiBEUkMgYnVmZmVycworICAgICAgICAgICAgYnVmWzBdIC0gY29udGFpbnMgZXh0ZW5zaW9uIGVsZW1lbnQgcGF5IGxvYWQgbG91ZG5lc3MgcmVsYXRlZAorICAgICAgICAgICAgYnVmWzFdIC0gY29udGFpbnMgZXh0ZW5zaW9uIGVsZW1lbnQgcGF5IGxvYWQqLworICAgIHsKKyAgICAgIFZPSUQgKnBfYXJyYXlbMl1bMTZdOworICAgICAgV09SRDMyIGlpOworICAgICAgV09SRDMyIGJ1Zl9zaXplc1syXVsxNl07CisgICAgICBXT1JEMzIgbnVtX2VsZW1lbnRzOworICAgICAgV09SRDMyIG51bV9jb25maWdfZXh0OworICAgICAgV09SRDMyIGJpdF9zdHJfZm10ID0gMTsKKworCisKKyAgICAgIFdPUkQzMiB1b19udW1fY2hhbjsKKworICAgICAgbWVtc2V0KGJ1Zl9zaXplcywgMCwgMzIgKiBzaXplb2YoV09SRDMyKSk7CisKKyAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfRVhUX0VMRV9CVUZfU0laRVMsICZidWZfc2l6ZXNbMF1bMF0pOworCisKKyAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfRVhUX0VMRV9QVFIsICZwX2FycmF5KTsKKworCisgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9JTklUX1NFVF9CVUZGX1BUUiwgMCk7CisKKworCisgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX05VTV9FTEUsICZudW1fZWxlbWVudHMpOworCisgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX05VTV9DT05GSUdfRVhULCAmbnVtX2NvbmZpZ19leHQpOworCisgICAgICBmb3IgKGlpID0gMDsgaWkgPCBudW1fY29uZmlnX2V4dDsgaWkrKykgeworICAgICAgICAvKmNvcHkgbG91ZG5lc3MgYml0c3RyZWFtKi8KKyAgICAgICAgaWYgKGJ1Zl9zaXplc1swXVtpaV0gPiAwKSB7CisgICAgICAgICAgbWVtY3B5KGRyY19pcF9idWYsIHBfYXJyYXlbMF1baWldLCBidWZfc2l6ZXNbMF1baWldKTsKKworICAgICAgICAgIC8qU2V0IGJpdHN0cmVhbV9zcGxpdF9mb3JtYXQgKi8KKyAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKAorICAgICAgICAgICAgICBtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fQklUU19GT1JNQVQsICZiaXRfc3RyX2ZtdCk7CisKKyAgICAgICAgICAvKiBTZXQgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHByb2Nlc3NlZCAqLworICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9TRVRfSU5QVVRfQllURVNfSUxfQlMsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmX3NpemVzWzBdW2lpXSk7CisKKworCisgICAgICAgICAgLyogRXhlY3V0ZSBwcm9jZXNzICovCisgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0NNRF9UWVBFX0lOSVRfQ1BZX0lMX0JTRl9CVUZGLCBOVUxMKTsKKworCisKKyAgICAgICAgICBkcmNfZmxhZyA9IDE7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZm9yIChpaSA9IDA7IGlpIDwgbnVtX2VsZW1lbnRzOyBpaSsrKSB7CisgICAgICAgIC8qY29weSBjb25maWcgYml0c3RyZWFtKi8KKyAgICAgICAgaWYgKGJ1Zl9zaXplc1sxXVtpaV0gPiAwKSB7CisgICAgICAgICAgbWVtY3B5KGRyY19pcF9idWYsIHBfYXJyYXlbMV1baWldLCBidWZfc2l6ZXNbMV1baWldKTsKKyAgICAgICAgICAvKiBTZXQgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHByb2Nlc3NlZCAqLworCisgICAgICAgICAgLypTZXQgYml0c3RyZWFtX3NwbGl0X2Zvcm1hdCAqLworICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkoCisgICAgICAgICAgICAgIG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9CSVRTX0ZPUk1BVCwgJmJpdF9zdHJfZm10KTsKKworICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9TRVRfSU5QVVRfQllURVNfSUNfQlMsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmX3NpemVzWzFdW2lpXSk7CisKKworCisgICAgICAgICAgLyogRXhlY3V0ZSBwcm9jZXNzICovCisgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0NNRF9UWVBFX0lOSVRfQ1BZX0lDX0JTRl9CVUZGLCBOVUxMKTsKKworCisKKyAgICAgICAgICBkcmNfZmxhZyA9IDE7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGRyY19mbGFnID09IDEpIHsKKyAgICAgICAgbXBlZ2RfZHJjX3ByZXNlbnQgPSAxOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbXBlZ2RfZHJjX3ByZXNlbnQgPSAwOworICAgICAgfQorCisKKyAgICAgIC8qUmVhZCBpbnRlcmZhY2UgYnVmZmVyIGNvbmZpZyBmaWxlIGJpdHN0cmVhbSovCisgICAgICBpZihtcGVnZF9kcmNfcHJlc2VudD09MSl7CisKKyAgICAgICAgV09SRDMyIGludGVyZmFjZV9pc19wcmVzZW50ID0gMTsKKworCisgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkoCisgICAgICAgICAgICBtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX1BBUkFNX0lOVF9QUkVTRU5ULCAmaW50ZXJmYWNlX2lzX3ByZXNlbnQpOworCisKKworICAgICAgICAvKiBFeGVjdXRlIHByb2Nlc3MgKi8KKyAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9JTklUX0NQWV9JTl9CU0ZfQlVGRiwgTlVMTCk7CisKKworICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0NNRF9UWVBFX0lOSVRfUFJPQ0VTUywgTlVMTCk7CisKKworICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKAorICAgICAgICAgICAgbU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9OVU1fQ0hBTk5FTFMsICZ1b19udW1fY2hhbik7CisKKyAgICAgIH0KKyAgICB9CisgIH0KKyNlbmRpZgorCityZXR1cm4gZXJyX2NvZGU7CisKK30KK2ludCBTb2Z0WEFBQzo6ZGVjb2RlWEFBQ1N0cmVhbSh1aW50OF90KiBpbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICpieXRlc0NvbnN1bWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKm91dEJ5dGVzKSB7CisgICAgaWYgKG1JbnB1dEJ1ZmZlclNpemUgPCBpbkJ1ZmZlckxlbmd0aCkgeworICAgICAgICBBTE9HRSgiQ2Fubm90IGNvbmZpZyBBQUMsIGlucHV0IGJ1ZmZlciBzaXplICVkIDwgaW5CdWZmZXJMZW5ndGggJWQiLG1JbnB1dEJ1ZmZlclNpemUsaW5CdWZmZXJMZW5ndGgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogQ29weSB0aGUgYnVmZmVyIHBhc3NlZCBieSBBbmRyb2lkIHBsdWdpbiB0byBjb2RlYyBpbnB1dCBidWZmZXIgKi8KKyAgICBtZW1jcHkobUlucHV0QnVmZmVyLGluQnVmZmVyLGluQnVmZmVyTGVuZ3RoKTsKKworICAgIC8qIFNldCBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcHJvY2Vzc2VkICovCisgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX1NFVF9JTlBVVF9CWVRFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5CdWZmZXJMZW5ndGgpOworICAgIFJFVFVSTl9JRl9ORShlcnJfY29kZSwgSUFfTk9fRVJST1IsIGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfSU5QVVRfQllURVMiKTsKKworICAgIC8qIEV4ZWN1dGUgcHJvY2VzcyAqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfRVhFQ1VURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfRE9fRVhFQ1VURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgUkVUVVJOX0lGX05FKGVycl9jb2RlLCBJQV9OT19FUlJPUiwgZXJyX2NvZGUsICJJQV9DTURfVFlQRV9ET19FWEVDVVRFIik7CisKKyAgICBVV09SRDMyIHVpX2V4ZWNfZG9uZTsKKyAgICAvKiBDaGVja2luZyBmb3IgZW5kIG9mIHByb2Nlc3NpbmcgKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0VYRUNVVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0NNRF9UWVBFX0RPTkVfUVVFUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9leGVjX2RvbmUpOworICAgIFJFVFVSTl9JRl9ORShlcnJfY29kZSwgSUFfTk9fRVJST1IsIGVycl9jb2RlLCAiSUFfQ01EX1RZUEVfRE9ORV9RVUVSWSIpOworCisjaWZkZWYgRU5BQkxFX01QRUdfRF9EUkMKKyAgICAgeworICAgICAgaWYgKHVpX2V4ZWNfZG9uZSAhPSAxKSB7CisgICAgICAgIFZPSUQgKnBfYXJyYXk7ICAgICAgICAvLyBJVFRJQU06YnVmZmVyIHRvIGhhbmRsZSBnYWluIHBheWxvYWQKKyAgICAgICAgV09SRDMyIGJ1Zl9zaXplID0gMDsgIC8vIElUVElBTTpnYWluIHBheWxvYWQgbGVuZ3RoCisgICAgICAgIFdPUkQzMiBiaXRfc3RyX2ZtdCA9IDE7CisgICAgICAgIFdPUkQzMiBnYWluX3N0cmVhbV9mbGFnID0gMTsKKworICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfR0FJTl9QQVlMT0FEX0xFTiwgJmJ1Zl9zaXplKTsKKworCisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19HQUlOX1BBWUxPQURfQlVGLCAmcF9hcnJheSk7CisKKworICAgICAgICBpZiAoYnVmX3NpemUgPiAwKSB7CisgICAgICAgICAgLypTZXQgYml0c3RyZWFtX3NwbGl0X2Zvcm1hdCAqLworICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkoCisgICAgICAgICAgICAgIG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9CSVRTX0ZPUk1BVCwgJmJpdF9zdHJfZm10KTsKKworICAgICAgICAgIG1lbWNweShkcmNfaXBfYnVmLCBwX2FycmF5LCBidWZfc2l6ZSk7CisgICAgICAgICAgLyogU2V0IG51bWJlciBvZiBieXRlcyB0byBiZSBwcm9jZXNzZWQgKi8KKyAgICAgICAgICBlcnJfY29kZSA9CisgICAgICAgICAgICAgIGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9TRVRfSU5QVVRfQllURVNfQlMsIDAsICZidWZfc2l6ZSk7CisKKyAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKAorICAgICAgICAgICAgICBtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgSUFfRFJDX0RFQ19DT05GSUdfR0FJTl9TVFJFQU1fRkxBRywgJmdhaW5fc3RyZWFtX2ZsYWcpOworCisKKyAgICAgICAgICAvKiBFeGVjdXRlIHByb2Nlc3MgKi8KKyAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfSU5JVF9DUFlfQlNGX0JVRkYsIE5VTEwpOworCisKKyAgICAgICAgICBtcGVnZF9kcmNfcHJlc2VudCA9IDE7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgICAvKiBIb3cgbXVjaCBidWZmZXIgaXMgdXNlZCBpbiBpbnB1dCBidWZmZXJzICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfQ1VSSURYX0lOUFVUX0JVRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNDb25zdW1lZCk7CisgICAgUkVUVVJOX0lGX05FKGVycl9jb2RlLCBJQV9OT19FUlJPUiwgZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9DVVJJRFhfSU5QVVRfQlVGIik7CisKKyAgICAvKiBHZXQgdGhlIG91dHB1dCBieXRlcyAqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfR0VUX09VVFBVVF9CWVRFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Qnl0ZXMpOworICAgIFJFVFVSTl9JRl9ORShlcnJfY29kZSwgSUFfTk9fRVJST1IsIGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfT1VUUFVUX0JZVEVTIik7CisjaWZkZWYgRU5BQkxFX01QRUdfRF9EUkMKKworICAgIGlmIChtcGVnZF9kcmNfcHJlc2VudCA9PSAxKSB7CisgICAgICBtZW1jcHkoZHJjX2lwX2J1ZiwgbU91dHB1dEJ1ZmZlciwgKm91dEJ5dGVzKTsKKyAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX1NFVF9JTlBVVF9CWVRFUywgMCwgb3V0Qnl0ZXMpOworCisKKyAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0VYRUNVVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0NNRF9UWVBFX0RPX0VYRUNVVEUsIE5VTEwpOworCisgICAgICBtZW1jcHkobU91dHB1dEJ1ZmZlciwgZHJjX29wX2J1ZiwgKm91dEJ5dGVzKTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gZXJyX2NvZGU7Cit9CisKK2ludCBTb2Z0WEFBQzo6ZGVJbml0WEFBQ0RlY29kZXIoKSB7CisgICAgQUxPR0koImRlSW5pdFhBQUNEZWNvZGVyIik7CisKKyAgICAvKiBUZWxsIHRoYXQgdGhlIGlucHV0IGlzIG92ZXIgaW4gdGhpcyBidWZmZXIgKi8KKyAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfSU5QVVRfT1ZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICBSRVRVUk5fSUZfTkUoZXJyX2NvZGUsIElBX05PX0VSUk9SLCBlcnJfY29kZSwgIklBX0FQSV9DTURfSU5QVVRfT1ZFUiIpOworCisgICAgZm9yKGludCBpID0gMDsgaSA8IG1NYWxsb2NDb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYobU1lbW9yeUFycmF5W2ldKQorICAgICAgICAgICAgZnJlZShtTWVtb3J5QXJyYXlbaV0pOworICAgIH0KKyAgICBtTWFsbG9jQ291bnQgPSAwOworCisgICAgcmV0dXJuIGVycl9jb2RlOworfQorCitJQV9FUlJPUkNPREUgU29mdFhBQUM6OmdldFhBQUNTdHJlYW1JbmZvKCkgeworICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IElBX05PX0VSUk9SOworCisgICAgLyogU2FtcGxpbmcgZnJlcXVlbmN5ICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fU0FNUF9GUkVRLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbVNhbXBGcmVxKTsKKyAgICBSRVRVUk5fSUZfTkUoZXJyX2NvZGUsIElBX05PX0VSUk9SLCBlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9TQU1QX0ZSRVEiKTsKKworICAgIC8qIFRvdGFsIE51bWJlciBvZiBDaGFubmVscyAqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX05VTV9DSEFOTkVMUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1OdW1DaGFubmVscyk7CisgICAgUkVUVVJOX0lGX05FKGVycl9jb2RlLCBJQV9OT19FUlJPUiwgZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fTlVNX0NIQU5ORUxTIik7CisKKyAgICAvKiBQQ00gd29yZCBzaXplICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fUENNX1dEU1osCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtUGNtV2RTeik7CisgICAgUkVUVVJOX0lGX05FKGVycl9jb2RlLCBJQV9OT19FUlJPUiwgZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fUENNX1dEU1oiKTsKKworICAgIC8qIGNoYW5uZWwgbWFzayB0byB0ZWxsIHRoZSBhcnJhbmdlbWVudCBvZiBjaGFubmVscyBpbiBiaXQgc3RyZWFtICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fQ0hBTk5FTF9NQVNLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbUNoYW5uZWxNYXNrKTsKKyAgICBSRVRVUk5fSUZfTkUoZXJyX2NvZGUsIElBX05PX0VSUk9SLCBlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9DSEFOTkVMX01BU0siKTsKKworICAgIC8qIENoYW5uZWwgbW9kZSB0byB0ZWxsIE1PTk8vU1RFUkVPL0RVQUwtTU9OTy9OT05FX09GX1RIRVNFICovCisgICAgVVdPUkQzMiB1aV9jaGFubmVsX21vZGU7CisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fQ0hBTk5FTF9NT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfY2hhbm5lbF9tb2RlKTsKKyAgICBSRVRVUk5fSUZfTkUoZXJyX2NvZGUsIElBX05PX0VSUk9SLCBlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9DSEFOTkVMX01PREUiKTsKKyAgICBpZih1aV9jaGFubmVsX21vZGUgPT0gMCkKKyAgICAgICAgQUxPR1YoIkNoYW5uZWwgTW9kZTogTU9OT19PUl9QU1xuIik7CisgICAgZWxzZSBpZih1aV9jaGFubmVsX21vZGUgPT0gMSkKKyAgICAgICAgQUxPR1YoIkNoYW5uZWwgTW9kZTogU1RFUkVPXG4iKTsKKyAgICBlbHNlIGlmKHVpX2NoYW5uZWxfbW9kZSA9PSAyKQorICAgICAgICBBTE9HVigiQ2hhbm5lbCBNb2RlOiBEVUFMLU1PTk9cbiIpOworICAgIGVsc2UKKyAgICAgICAgQUxPR1YoIkNoYW5uZWwgTW9kZTogTk9ORV9PRl9USEVTRSBvciBNVUxUSUNIQU5ORUxcbiIpOworCisgICAgLyogQ2hhbm5lbCBtb2RlIHRvIHRlbGwgU0JSIFBSRVNFTlQvTk9UX1BSRVNFTlQgKi8KKyAgICBVV09SRDMyIHVpX3Nicl9tb2RlOworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX1NCUl9NT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfc2JyX21vZGUpOworICAgIFJFVFVSTl9JRl9ORShlcnJfY29kZSwgSUFfTk9fRVJST1IsIGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX1NCUl9NT0RFIik7CisgICAgaWYodWlfc2JyX21vZGUgPT0gMCkKKyAgICAgICAgQUxPR1YoIlNCUiBNb2RlOiBOT1RfUFJFU0VOVFxuIik7CisgICAgZWxzZSBpZih1aV9zYnJfbW9kZSA9PSAxKQorICAgICAgICBBTE9HVigiU0JSIE1vZGU6IFBSRVNFTlRcbiIpOworICAgIGVsc2UKKyAgICAgICAgQUxPR1YoIlNCUiBNb2RlOiBJTExFR0FMXG4iKTsKKworICAgIC8qIG1PdXRwdXRGcmFtZUxlbmd0aCA9IDEwMjQgKiAoMSArIFNCUl9NT0RFKSBmb3IgQUFDICovCisgICAgLyogRm9yIFVTQUMgaXQgY291bGQgYmUgMTAyNCAqIDMgLCBzdXBwb3J0IHRvIHF1ZXJ5ICAqLworICAgIC8qIG5vdCB5ZXQgYWRkZWQgaW4gY29kZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBtT3V0cHV0RnJhbWVMZW5ndGggPSAxMDI0ICogKDEgKyB1aV9zYnJfbW9kZSk7CisKKyAgICBBTE9HSSgibU91dHB1dEZyYW1lTGVuZ3RoICVkIHVpX3Nicl9tb2RlICVkIixtT3V0cHV0RnJhbWVMZW5ndGgsdWlfc2JyX21vZGUpOworCisgICAgcmV0dXJuIElBX05PX0VSUk9SOworfQorCitJQV9FUlJPUkNPREUgU29mdFhBQUM6OnNldFhBQUNEUkNJbmZvKGludDMyX3QgZHJjQ3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRyY0Jvb3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRyY1JlZkxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRyY0hlYXZ5Q29tcHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2lmZGVmIEVOQUJMRV9NUEVHX0RfRFJDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxpbnQzMl90IGRyRWZmZWN0VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7CisgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gSUFfTk9fRVJST1I7CisKKyAgICBpbnQzMl90IHVpX2RyY19lbmFibGUgPSAxOworICAgIGludDMyX3QgaV9lZmZlY3RfdHlwZSwgaV90YXJnZXRfbG91ZG5lc3MsIGlfbG91ZF9ub3JtOworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19FTkFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9kcmNfZW5hYmxlKTsKKyAgICAgUkVUVVJOX0lGX05FKGVycl9jb2RlLCBJQV9OT19FUlJPUiwgZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0VOQUJMRSIpOworICAgIGlmIChkcmNDdXQgIT0tMSkgeworICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19DVVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHJjQ3V0KTsKKyAgICAgICAgUkVUVVJOX0lGX05FKGVycl9jb2RlLCBJQV9OT19FUlJPUiwgZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0NVVCIpOworICAgIH0KKworICAgIGlmIChkcmNCb29zdCAhPS0xKSB7CisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0JPT1NULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRyY0Jvb3N0KTsKKyAgICAgICAgUkVUVVJOX0lGX05FKGVycl9jb2RlLCBJQV9OT19FUlJPUiwgZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0JPT1NUIik7CisgICAgfQorCisgICAgaWYgKGRyY1JlZkxldmVsICE9IC0xKSB7CisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX1RBUkdFVF9MRVZFTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkcmNSZWZMZXZlbCk7CisgICAgICAgIFJFVFVSTl9JRl9ORShlcnJfY29kZSwgSUFfTk9fRVJST1IsIGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19UQVJHRVRfTEVWRUwiKTsKKyAgICB9CisjaWZkZWYgRU5BQkxFX01QRUdfRF9EUkMKKyAgICBpZiAoZHJjUmVmTGV2ZWwgIT0gLTEpIHsKKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0RSQ19UQVJHRVRfTE9VRE5FU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHJjUmVmTGV2ZWwpOworICAgICAgICBSRVRVUk5fSUZfTkUoZXJyX2NvZGUsIElBX05PX0VSUk9SLCBlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0RSQ19UQVJHRVRfTE9VRE5FU1MiKTsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAoZHJjSGVhdnlDb21wcmVzc2lvbiAhPSAtMSkgeworICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19IRUFWWV9DT01QLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRyY0hlYXZ5Q29tcHJlc3Npb24pOworICAgICAgICBSRVRVUk5fSUZfTkUoZXJyX2NvZGUsIElBX05PX0VSUk9SLCBlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfSEVBVllfQ09NUCIpOworICAgIH0KKworI2lmZGVmIEVOQUJMRV9NUEVHX0RfRFJDCisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19EUkNfRUZGRUNUX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHJFZmZlY3RUeXBlKTsKKworI2VuZGlmCisKKyNpZmRlZiBFTkFCTEVfTVBFR19EX0RSQworICAgIC8qU2V0IEVmZmVjdCBUeXBlKi8KKworICAgIHsKKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19FRkZFQ1RfVFlQRSwgJmlfZWZmZWN0X3R5cGUpOworICAgICAgICBSRVRVUk5fSUZfTkUoZXJyX2NvZGUsIElBX05PX0VSUk9SLCBlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfRUZGRUNUX1RZUEUiKTsKKworICAgICAgICBlcnJfY29kZSA9CisgICAgICAgICAgICBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19EUkNfRUZGRUNUX1RZUEUsICZpX2VmZmVjdF90eXBlKTsKKworICAgICAgICBSRVRVUk5fSUZfTkUoZXJyX2NvZGUsIElBX05PX0VSUk9SLCBlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX0RSQ19FRkZFQ1RfVFlQRSIpOworCisgICAgfQorCisvKlNldCB0YXJnZXQgbG91ZG5lc3MgKi8KKworICAgIHsKKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKAorICAgICAgICAgICAgbVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX1RBUkdFVF9MT1VETkVTUywgJmlfdGFyZ2V0X2xvdWRuZXNzKTsKKyAgICAgICAgUkVUVVJOX0lGX05FKGVycl9jb2RlLCBJQV9OT19FUlJPUiwgZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX1RBUkdFVF9MT1VETkVTUyIpOworCisgICAgICAgIGVycl9jb2RlID0KKyAgICAgICAgICAgIGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX0RSQ19UQVJHRVRfTE9VRE5FU1MsICZpX3RhcmdldF9sb3VkbmVzcyk7CisgICAgICAgIFJFVFVSTl9JRl9ORShlcnJfY29kZSwgSUFfTk9fRVJST1IsIGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfRFJDX1RBUkdFVF9MT1VETkVTUyIpOworCisgICAgfQorICAgIC8qU2V0IGxvdWRfbm9ybV9mbGFnKi8KKyAgICB7CisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaSgKKyAgICAgICAgICAgIG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19MT1VEX05PUk0sICZpX2xvdWRfbm9ybSk7CisgICAgICAgIFJFVFVSTl9JRl9ORShlcnJfY29kZSwgSUFfTk9fRVJST1IgLCBlcnJfY29kZSwiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19MT1VEX05PUk0iKTsKKworICAgICAgICBlcnJfY29kZSA9CisgICAgICAgICAgICBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19EUkNfTE9VRF9OT1JNLCAmaV9sb3VkX25vcm0pOworCisgICAgICAgIFJFVFVSTl9JRl9ORShlcnJfY29kZSwgSUFfTk9fRVJST1IgLCBlcnJfY29kZSwiSUFfRFJDX0RFQ19DT05GSUdfRFJDX0xPVURfTk9STSIpOworCisgICAgfQorCisjZW5kaWYKKworCisgICAgcmV0dXJuIElBX05PX0VSUk9SOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCithbmRyb2lkOjpTb2Z0T01YQ29tcG9uZW50ICpjcmVhdGVTb2Z0T01YQ29tcG9uZW50KAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCisgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpIHsKKyAgICBBTE9HSSgiY3JlYXRlU29mdE9NWENvbXBvbmVudCBmb3IgU29mdFhBQUNERUMiKTsKKyAgICByZXR1cm4gbmV3IGFuZHJvaWQ6OlNvZnRYQUFDKG5hbWUsIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy94YWFjZGVjL1NvZnRYQUFDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MveGFhY2RlYy9Tb2Z0WEFBQy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYTljNzcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MveGFhY2RlYy9Tb2Z0WEFBQy5oCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTT0ZUWEFBQ19IXworI2RlZmluZSBTT0ZUWEFBQ19IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaD4KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJpeGhlYWFjZF90eXBlX2RlZi5oIgorI2luY2x1ZGUgIml4aGVhYWNkX2Vycm9yX3N0YW5kYXJkcy5oIgorI2luY2x1ZGUgIml4aGVhYWNkX2Vycm9yX2hhbmRsZXIuaCIKKyNpbmNsdWRlICJpeGhlYWFjZF9hcGljbWRfc3RhbmRhcmRzLmgiCisjaW5jbHVkZSAiaXhoZWFhY2RfbWVtb3J5X3N0YW5kYXJkcy5oIgorI2luY2x1ZGUgIml4aGVhYWNkX2FhY19jb25maWcuaCIKKworI2luY2x1ZGUgImltcGRfYXBpY21kX3N0YW5kYXJkcy5oIgorI2luY2x1ZGUgImltcGRfZHJjX2NvbmZpZ19wYXJhbXMuaCIKKworI2RlZmluZSBNQVhfTUVNX0FMTE9DUyAxMDAKKworZXh0ZXJuICJDIiBJQV9FUlJPUkNPREUgaXhoZWFhY2RfZGVjX2FwaShwVk9JRCBwX2lhX21vZHVsZV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICBXT1JEMzIgaV9jbWQsIFdPUkQzMiBpX2lkeCwgcFZPSUQgcHZfdmFsdWUpOworZXh0ZXJuICJDIiBJQV9FUlJPUkNPREUgaWFfZHJjX2RlY19hcGkocFZPSUQgcF9pYV9tb2R1bGVfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgV09SRDMyIGlfY21kLCBXT1JEMzIgaV9pZHgsIHBWT0lEIHB2X3ZhbHVlKTsKK2V4dGVybiAiQyIgIElBX0VSUk9SQ09ERSBpeGhlYWFjZF9nZXRfY29uZmlnX3BhcmFtKHBWT0lEIHBfaWFfcHJvY2Vzc19hcGlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdPUkQzMiBwaV9zYW1wX2ZyZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV09SRDMyIHBpX251bV9jaGFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdPUkQzMiBwaV9wY21fd2Rfc3osCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV09SRDMyIHBpX2NoYW5uZWxfbWFzayk7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IFNvZnRYQUFDIDogcHVibGljIFNpbXBsZVNvZnRPTVhDb21wb25lbnQgeworICAgIFNvZnRYQUFDKGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCisgICAgICAgICAgICBPTVhfUFRSIGFwcERhdGEsCisgICAgICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5Tb2Z0WEFBQygpOworCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGludGVybmFsR2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpOworCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpOworCisgICAgdmlydHVhbCB2b2lkIG9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpOworICAgIHZpcnR1YWwgdm9pZCBvblBvcnRGbHVzaENvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCk7CisgICAgdmlydHVhbCB2b2lkIG9uUG9ydEVuYWJsZUNvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCwgYm9vbCBlbmFibGVkKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25SZXNldCgpOworCitwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrTnVtSW5wdXRCdWZmZXJzICAgICAgICA9IDQsCisgICAgICAgIGtOdW1PdXRwdXRCdWZmZXJzICAgICAgID0gNCwKKyAgICAgICAga051bURlbGF5QmxvY2tzTWF4ICAgICAgPSA4LAorICAgIH07CisKKyAgICBib29sIG1Jc0FEVFM7CisgICAgc2l6ZV90IG1JbnB1dEJ1ZmZlckNvdW50OworICAgIHNpemVfdCBtT3V0cHV0QnVmZmVyQ291bnQ7CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm1MYXN0SW5IZWFkZXI7CisgICAgaW50NjRfdCBtUHJldlRpbWVzdGFtcDsKKyAgICBpbnQ2NF90IG1DdXJyZW50VGltZXN0YW1wOworICAgIHVpbnQzMl90IG1CdWZTaXplOworCisgICAgZW51bSB7CisgICAgICAgIE5PTkUsCisgICAgICAgIEFXQUlUSU5HX0RJU0FCTEVELAorICAgICAgICBBV0FJVElOR19FTkFCTEVECisgICAgfSBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlOworCisgICAgdm9pZCBpbml0UG9ydHMoKTsKKyAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworICAgIGJvb2wgaXNDb25maWd1cmVkKCkgY29uc3Q7CisgICAgaW50IGRyYWluRGVjb2RlcigpOworICAgIGludCBpbml0WEFBQ0RlY29kZXIoKTsKKyAgICBpbnQgZGVJbml0WEFBQ0RlY29kZXIoKTsKKworICAgIGludCBjb25maWdYQUFDRGVjb2Rlcih1aW50OF90KiBpbkJ1ZmZlciwgdWludDMyX3QgaW5CdWZmZXJMZW5ndGgpOworICAgIGludCBjb25maWdNUEVHRERyYygpOworICAgIGludCBkZWNvZGVYQUFDU3RyZWFtKHVpbnQ4X3QqIGluQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluQnVmZmVyTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKmJ5dGVzQ29uc3VtZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAqb3V0Qnl0ZXMpOworCisgICAgdm9pZCBjb25maWdmbHVzaERlY29kZSgpOworICAgIElBX0VSUk9SQ09ERSBnZXRYQUFDU3RyZWFtSW5mbygpOworICAgIElBX0VSUk9SQ09ERSBzZXRYQUFDRFJDSW5mbyhpbnQzMl90IGRyY0N1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkcmNCb29zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkcmNSZWZMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkcmNIZWF2eUNvbXByZXNzaW9uCisjaWZkZWYgRU5BQkxFX01QRUdfRF9EUkMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLGludDMyX3QgZHJFZmZlY3RUeXBlCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgYm9vbCBtRW5kT2ZJbnB1dDsKKyAgICBib29sIG1FbmRPZk91dHB1dDsKKworICAgIHZvaWQqICAgICAgIG1YaGVhYWNDb2RlY0hhbmRsZTsKKyAgICB2b2lkKiAgICAgICBtTXBlZ0REcmNIYW5kbGU7CisgICAgdWludDMyX3QgICAgbUlucHV0QnVmZmVyU2l6ZTsKKyAgICB1aW50MzJfdCAgICBtT3V0cHV0RnJhbWVMZW5ndGg7CisgICAgaW50OF90KiAgICAgbUlucHV0QnVmZmVyOworICAgIGludDhfdCogICAgIG1PdXRwdXRCdWZmZXI7CisgICAgaW50MzJfdCAgICAgbVNhbXBGcmVxOworICAgIGludDMyX3QgICAgIG1OdW1DaGFubmVsczsKKyAgICBpbnQzMl90ICAgICBtUGNtV2RTejsKKyAgICBpbnQzMl90ICAgICBtQ2hhbm5lbE1hc2s7CisgICAgYm9vbCAgICAgICAgbUlzQ29kZWNJbml0aWFsaXplZDsKKyAgICBib29sICAgICAgICBtSXNDb2RlY0NvbmZpZ0ZsdXNoUmVxdWlyZWQ7CisgICAgaW50OF90ICpkcmNfaXBfYnVmOworICAgIGludDhfdCAqZHJjX29wX2J1ZjsKKyAgICBpbnQzMl90IG1wZWdkX2RyY19wcmVzZW50OworICAgIGludDMyX3QgZHJjX2ZsYWc7CisvLyAgICBpbnQzMl90IGlzX2RyY19lbmFibGVkOworCisgICAgdm9pZCogICAgICAgbU1lbW9yeUFycmF5W01BWF9NRU1fQUxMT0NTXTsKKyAgICBpbnQzMl90ICAgICBtTWFsbG9jQ291bnQ7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTb2Z0WEFBQyk7CisKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gU09GVFhBQUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Db2xvckNvbnZlcnRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQ29sb3JDb252ZXJ0ZXIuY3BwCmluZGV4IDA5ODIwMDYuLjA1ZjQxMDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Db2xvckNvbnZlcnRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0NvbG9yQ29udmVydGVyLmNwcApAQCAtMTksMTMgKzE5LDI4IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NvbG9yQ29udmVydGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KIAogI2luY2x1ZGUgImxpYnl1di9jb252ZXJ0X2Zyb20uaCIKICNpbmNsdWRlICJsaWJ5dXYvdmlkZW9fY29tbW9uLmgiCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgogCiAjZGVmaW5lIFVTRV9MSUJZVVYKKyNkZWZpbmUgUEVSRl9QUk9GSUxJTkcgMAorCisKKyNpZiBkZWZpbmVkKF9fYWFyY2g2NF9fKSB8fCBkZWZpbmVkKF9fQVJNX05FT05fXykKKyNkZWZpbmUgVVNFX05FT05fWTQxMCAxCisjZWxzZQorI2RlZmluZSBVU0VfTkVPTl9ZNDEwIDAKKyNlbmRpZgorCisjaWYgVVNFX05FT05fWTQxMAorI2luY2x1ZGUgPGFybV9uZW9uLmg+CisjZW5kaWYKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC00Myw2ICs1OCwxMSBAQAogCiBib29sIENvbG9yQ29udmVydGVyOjppc1ZhbGlkKCkgY29uc3QgewogICAgIHN3aXRjaCAobVNyY0Zvcm1hdCkgeworICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIxNjoKKyAgICAgICAgICAgIGlmIChtRHN0Rm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0NDRZNDEwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBmYWxsLXRocnUKICAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOgogICAgICAgICAgICAgcmV0dXJuIG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1CiAgICAgICAgICAgICAgICAgICAgIHx8IG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDMyQml0UkdCQTg4ODgKQEAgLTU5LDYgKzc5LDEyIEBACiAgICAgfQogfQogCitib29sIENvbG9yQ29udmVydGVyOjppc0RzdFJHQigpIGNvbnN0IHsKKyAgICByZXR1cm4gbURzdEZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjUKKyAgICAgICAgICAgIHx8IG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDMyQml0UkdCQTg4ODgKKyAgICAgICAgICAgIHx8IG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDMyYml0QkdSQTg4ODg7Cit9CisKIENvbG9yQ29udmVydGVyOjpCaXRtYXBQYXJhbXM6OkJpdG1hcFBhcmFtcygKICAgICAgICAgdm9pZCAqYml0cywKICAgICAgICAgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0LApAQCAtODEsMTAgKzEwNywxNiBAQAogCiAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0MzJiaXRCR1JBODg4ODoKICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXQzMkJpdFJHQkE4ODg4OgorICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQ0NFk0MTA6CiAgICAgICAgIG1CcHAgPSA0OwogICAgICAgICBtU3RyaWRlID0gNCAqIG1XaWR0aDsKICAgICAgICAgYnJlYWs7CiAKKyAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIxNjoKKyAgICAgICAgbUJwcCA9IDI7CisgICAgICAgIG1TdHJpZGUgPSAyICogbVdpZHRoOworICAgICAgICBicmVhazsKKwogICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjoKICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRDYllDclk6CiAgICAgY2FzZSBPTVhfUUNPTV9DT0xPUl9Gb3JtYXRZVlU0MjBTZW1pUGxhbmFyOgpAQCAtMTI5LDYgKzE2MSwxMiBAQAogICAgICAgICAgICAgZHN0V2lkdGgsIGRzdEhlaWdodCwKICAgICAgICAgICAgIGRzdENyb3BMZWZ0LCBkc3RDcm9wVG9wLCBkc3RDcm9wUmlnaHQsIGRzdENyb3BCb3R0b20sIG1Ec3RGb3JtYXQpOwogCisgICAgaWYgKCEoKHNyYy5tQ3JvcExlZnQgJiAxKSA9PSAwCisgICAgICAgICYmIHNyYy5jcm9wV2lkdGgoKSA9PSBkc3QuY3JvcFdpZHRoKCkKKyAgICAgICAgJiYgc3JjLmNyb3BIZWlnaHQoKSA9PSBkc3QuY3JvcEhlaWdodCgpKSkgeworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCiAgICAgc3RhdHVzX3QgZXJyOwogCiAgICAgc3dpdGNoIChtU3JjRm9ybWF0KSB7CkBAIC0xNDAsNiArMTc4LDE5IEBACiAjZW5kaWYKICAgICAgICAgICAgIGJyZWFrOwogCisgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjE2OgorICAgICAgICB7CisjaWYgUEVSRl9QUk9GSUxJTkcKKyAgICAgICAgICAgIGludDY0X3Qgc3RhcnRUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworI2VuZGlmCisgICAgICAgICAgICBlcnIgPSBjb252ZXJ0WVVWNDIwUGxhbmFyMTYoc3JjLCBkc3QpOworI2lmIFBFUkZfUFJPRklMSU5HCisgICAgICAgICAgICBpbnQ2NF90IGVuZFRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgICAgICAgICBBTE9HRCgiY29udmVydFlVVjQyMFBsYW5hcjE2IHRvb2sgJWxsZCB1cyIsIChsb25nIGxvbmcpIChlbmRUaW1lVXMgLSBzdGFydFRpbWVVcykpOworI2VuZGlmCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdENiWUNyWToKICAgICAgICAgICAgIGVyciA9IGNvbnZlcnRDYllDclkoc3JjLCBkc3QpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC0xNzIsMTIgKzIyMyw2IEBACiAKICAgICB1aW50OF90ICprQWRqdXN0ZWRDbGlwID0gaW5pdENsaXAoKTsKIAotICAgIGlmICghKChzcmMubUNyb3BMZWZ0ICYgMSkgPT0gMAotICAgICAgICAmJiBzcmMuY3JvcFdpZHRoKCkgPT0gZHN0LmNyb3BXaWR0aCgpCi0gICAgICAgICYmIHNyYy5jcm9wSGVpZ2h0KCkgPT0gZHN0LmNyb3BIZWlnaHQoKSkpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwotICAgIH0KLQogICAgIHVpbnQxNl90ICpkc3RfcHRyID0gKHVpbnQxNl90ICopZHN0Lm1CaXRzCiAgICAgICAgICsgZHN0Lm1Dcm9wVG9wICogZHN0Lm1XaWR0aCArIGRzdC5tQ3JvcExlZnQ7CiAKQEAgLTIzMiwxMiArMjc3LDYgQEAKIAogc3RhdHVzX3QgQ29sb3JDb252ZXJ0ZXI6OmNvbnZlcnRZVVY0MjBQbGFuYXJVc2VMaWJZVVYoCiAgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCkgewotICAgIGlmICghKChzcmMubUNyb3BMZWZ0ICYgMSkgPT0gMAotICAgICAgICAgICAgJiYgc3JjLmNyb3BXaWR0aCgpID09IGRzdC5jcm9wV2lkdGgoKQotICAgICAgICAgICAgJiYgc3JjLmNyb3BIZWlnaHQoKSA9PSBkc3QuY3JvcEhlaWdodCgpKSkgewotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQotCiAgICAgdWludDhfdCAqZHN0X3B0ciA9ICh1aW50OF90ICopZHN0Lm1CaXRzCiAgICAgICAgICsgZHN0Lm1Dcm9wVG9wICogZHN0Lm1TdHJpZGUgKyBkc3QubUNyb3BMZWZ0ICogZHN0Lm1CcHA7CiAKQEAgLTI3NCw5MCArMzEzLDEyMCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBDb2xvckNvbnZlcnRlcjo6d3JpdGVUb0RzdCgKLSAgICAgICAgdm9pZCAqZHN0X3B0ciwgdWludDhfdCAqa0FkanVzdGVkQ2xpcCwgYm9vbCB1bmNyb3BwZWQsCi0gICAgICAgIHNpZ25lZCByMSwgc2lnbmVkIGcxLCBzaWduZWQgYjEsCi0gICAgICAgIHNpZ25lZCByMiwgc2lnbmVkIGcyLCBzaWduZWQgYjIpIHsKLSAgICBzd2l0Y2ggKG1Ec3RGb3JtYXQpIHsKK3N0ZDo6ZnVuY3Rpb248dm9pZCAodm9pZCAqLCB2b2lkICosIHZvaWQgKiwgc2l6ZV90LAorICAgICAgICAgICAgICAgICAgICBzaWduZWQgKiwgc2lnbmVkICosIHNpZ25lZCAqLCBzaWduZWQgKik+CitnZXRSZWFkRnJvbVNyYyhPTVhfQ09MT1JfRk9STUFUVFlQRSBzcmNGb3JtYXQpIHsKKyAgICBzd2l0Y2goc3JjRm9ybWF0KSB7CisgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOgorICAgICAgICByZXR1cm4gW10odm9pZCAqc3JjX3ksIHZvaWQgKnNyY191LCB2b2lkICpzcmNfdiwgc2l6ZV90IHgsCisgICAgICAgICAgICAgICAgICBzaWduZWQgKnkxLCBzaWduZWQgKnkyLCBzaWduZWQgKnUsIHNpZ25lZCAqdikgeworICAgICAgICAgICAgKnkxID0gKCh1aW50OF90KilzcmNfeSlbeF0gLSAxNjsKKyAgICAgICAgICAgICp5MiA9ICgodWludDhfdCopc3JjX3kpW3ggKyAxXSAtIDE2OworICAgICAgICAgICAgKnUgPSAoKHVpbnQ4X3QqKXNyY191KVt4IC8gMl0gLSAxMjg7CisgICAgICAgICAgICAqdiA9ICgodWludDhfdCopc3JjX3YpW3ggLyAyXSAtIDEyODsKKyAgICAgICAgfTsKKyAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIxNjoKKyAgICAgICAgcmV0dXJuIFtdKHZvaWQgKnNyY195LCB2b2lkICpzcmNfdSwgdm9pZCAqc3JjX3YsIHNpemVfdCB4LAorICAgICAgICAgICAgICAgIHNpZ25lZCAqeTEsIHNpZ25lZCAqeTIsIHNpZ25lZCAqdSwgc2lnbmVkICp2KSB7CisgICAgICAgICAgICAqeTEgPSAoc2lnbmVkKSgoKHVpbnQxNl90KilzcmNfeSlbeF0gPj4gMikgLSAxNjsKKyAgICAgICAgICAgICp5MiA9IChzaWduZWQpKCgodWludDE2X3QqKXNyY195KVt4ICsgMV0gPj4gMikgLSAxNjsKKyAgICAgICAgICAgICp1ID0gKHNpZ25lZCkoKCh1aW50MTZfdCopc3JjX3UpW3ggLyAyXSA+PiAyKSAtIDEyODsKKyAgICAgICAgICAgICp2ID0gKHNpZ25lZCkoKCh1aW50MTZfdCopc3JjX3YpW3ggLyAyXSA+PiAyKSAtIDEyODsKKyAgICAgICAgfTsKKyAgICBkZWZhdWx0OgorICAgICAgICBUUkVTUEFTUygpOworICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworc3RkOjpmdW5jdGlvbjx2b2lkICh2b2lkICosIGJvb2wsIHNpZ25lZCwgc2lnbmVkLCBzaWduZWQsIHNpZ25lZCwgc2lnbmVkLCBzaWduZWQpPgorZ2V0V3JpdGVUb0RzdChPTVhfQ09MT1JfRk9STUFUVFlQRSBkc3RGb3JtYXQsIHVpbnQ4X3QgKmtBZGp1c3RlZENsaXApIHsKKyAgICBzd2l0Y2ggKGRzdEZvcm1hdCkgewogICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1OgogICAgIHsKLSAgICAgICAgdWludDMyX3QgcmdiMSA9Ci0gICAgICAgICAgICAoKGtBZGp1c3RlZENsaXBbcjFdID4+IDMpIDw8IDExKQotICAgICAgICAgICAgfCAoKGtBZGp1c3RlZENsaXBbZzFdID4+IDIpIDw8IDUpCi0gICAgICAgICAgICB8IChrQWRqdXN0ZWRDbGlwW2IxXSA+PiAzKTsKKyAgICAgICAgcmV0dXJuIFtrQWRqdXN0ZWRDbGlwXSh2b2lkICpkc3RfcHRyLCBib29sIHVuY3JvcHBlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgcjEsIHNpZ25lZCBnMSwgc2lnbmVkIGIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZCByMiwgc2lnbmVkIGcyLCBzaWduZWQgYjIpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHJnYjEgPQorICAgICAgICAgICAgICAgICgoa0FkanVzdGVkQ2xpcFtyMV0gPj4gMykgPDwgMTEpCisgICAgICAgICAgICAgICAgfCAoKGtBZGp1c3RlZENsaXBbZzFdID4+IDIpIDw8IDUpCisgICAgICAgICAgICAgICAgfCAoa0FkanVzdGVkQ2xpcFtiMV0gPj4gMyk7CiAKLSAgICAgICAgaWYgKHVuY3JvcHBlZCkgewotICAgICAgICAgICAgdWludDMyX3QgcmdiMiA9Ci0gICAgICAgICAgICAgICAgKChrQWRqdXN0ZWRDbGlwW3IyXSA+PiAzKSA8PCAxMSkKLSAgICAgICAgICAgICAgICB8ICgoa0FkanVzdGVkQ2xpcFtnMl0gPj4gMikgPDwgNSkKLSAgICAgICAgICAgICAgICB8IChrQWRqdXN0ZWRDbGlwW2IyXSA+PiAzKTsKKyAgICAgICAgICAgIGlmICh1bmNyb3BwZWQpIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCByZ2IyID0KKyAgICAgICAgICAgICAgICAgICAgKChrQWRqdXN0ZWRDbGlwW3IyXSA+PiAzKSA8PCAxMSkKKyAgICAgICAgICAgICAgICAgICAgfCAoKGtBZGp1c3RlZENsaXBbZzJdID4+IDIpIDw8IDUpCisgICAgICAgICAgICAgICAgICAgIHwgKGtBZGp1c3RlZENsaXBbYjJdID4+IDMpOwogCi0gICAgICAgICAgICAqKHVpbnQzMl90ICopZHN0X3B0ciA9IChyZ2IyIDw8IDE2KSB8IHJnYjE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqKHVpbnQxNl90ICopZHN0X3B0ciA9IHJnYjE7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgKih1aW50MzJfdCAqKWRzdF9wdHIgPSAocmdiMiA8PCAxNikgfCByZ2IxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAqKHVpbnQxNl90ICopZHN0X3B0ciA9IHJnYjE7CisgICAgICAgICAgICB9CisgICAgICAgIH07CiAgICAgfQogICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDMyQml0UkdCQTg4ODg6CiAgICAgewotICAgICAgICAoKHVpbnQzMl90ICopZHN0X3B0cilbMF0gPQotICAgICAgICAgICAgICAgIChrQWRqdXN0ZWRDbGlwW3IxXSkKLSAgICAgICAgICAgICAgICB8IChrQWRqdXN0ZWRDbGlwW2cxXSA8PCA4KQotICAgICAgICAgICAgICAgIHwgKGtBZGp1c3RlZENsaXBbYjFdIDw8IDE2KQotICAgICAgICAgICAgICAgIHwgKDB4RkYgPDwgMjQpOwotCi0gICAgICAgIGlmICh1bmNyb3BwZWQpIHsKLSAgICAgICAgICAgICgodWludDMyX3QgKilkc3RfcHRyKVsxXSA9Ci0gICAgICAgICAgICAgICAgICAgIChrQWRqdXN0ZWRDbGlwW3IyXSkKLSAgICAgICAgICAgICAgICAgICAgfCAoa0FkanVzdGVkQ2xpcFtnMl0gPDwgOCkKLSAgICAgICAgICAgICAgICAgICAgfCAoa0FkanVzdGVkQ2xpcFtiMl0gPDwgMTYpCisgICAgICAgIHJldHVybiBba0FkanVzdGVkQ2xpcF0odm9pZCAqZHN0X3B0ciwgYm9vbCB1bmNyb3BwZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVkIHIxLCBzaWduZWQgZzEsIHNpZ25lZCBiMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgcjIsIHNpZ25lZCBnMiwgc2lnbmVkIGIyKSB7CisgICAgICAgICAgICAoKHVpbnQzMl90ICopZHN0X3B0cilbMF0gPQorICAgICAgICAgICAgICAgICAgICAoa0FkanVzdGVkQ2xpcFtyMV0pCisgICAgICAgICAgICAgICAgICAgIHwgKGtBZGp1c3RlZENsaXBbZzFdIDw8IDgpCisgICAgICAgICAgICAgICAgICAgIHwgKGtBZGp1c3RlZENsaXBbYjFdIDw8IDE2KQogICAgICAgICAgICAgICAgICAgICB8ICgweEZGIDw8IDI0KTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKKworICAgICAgICAgICAgaWYgKHVuY3JvcHBlZCkgeworICAgICAgICAgICAgICAgICgodWludDMyX3QgKilkc3RfcHRyKVsxXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAoa0FkanVzdGVkQ2xpcFtyMl0pCisgICAgICAgICAgICAgICAgICAgICAgICB8IChrQWRqdXN0ZWRDbGlwW2cyXSA8PCA4KQorICAgICAgICAgICAgICAgICAgICAgICAgfCAoa0FkanVzdGVkQ2xpcFtiMl0gPDwgMTYpCisgICAgICAgICAgICAgICAgICAgICAgICB8ICgweEZGIDw8IDI0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKICAgICB9CiAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0MzJiaXRCR1JBODg4ODoKICAgICB7Ci0gICAgICAgICgodWludDMyX3QgKilkc3RfcHRyKVswXSA9Ci0gICAgICAgICAgICAgICAgKGtBZGp1c3RlZENsaXBbYjFdKQotICAgICAgICAgICAgICAgIHwgKGtBZGp1c3RlZENsaXBbZzFdIDw8IDgpCi0gICAgICAgICAgICAgICAgfCAoa0FkanVzdGVkQ2xpcFtyMV0gPDwgMTYpCi0gICAgICAgICAgICAgICAgfCAoMHhGRiA8PCAyNCk7Ci0KLSAgICAgICAgaWYgKHVuY3JvcHBlZCkgewotICAgICAgICAgICAgKCh1aW50MzJfdCAqKWRzdF9wdHIpWzFdID0KLSAgICAgICAgICAgICAgICAgICAgKGtBZGp1c3RlZENsaXBbYjJdKQotICAgICAgICAgICAgICAgICAgICB8IChrQWRqdXN0ZWRDbGlwW2cyXSA8PCA4KQotICAgICAgICAgICAgICAgICAgICB8IChrQWRqdXN0ZWRDbGlwW3IyXSA8PCAxNikKKyAgICAgICAgcmV0dXJuIFtrQWRqdXN0ZWRDbGlwXSh2b2lkICpkc3RfcHRyLCBib29sIHVuY3JvcHBlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgcjEsIHNpZ25lZCBnMSwgc2lnbmVkIGIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZCByMiwgc2lnbmVkIGcyLCBzaWduZWQgYjIpIHsKKyAgICAgICAgICAgICgodWludDMyX3QgKilkc3RfcHRyKVswXSA9CisgICAgICAgICAgICAgICAgICAgIChrQWRqdXN0ZWRDbGlwW2IxXSkKKyAgICAgICAgICAgICAgICAgICAgfCAoa0FkanVzdGVkQ2xpcFtnMV0gPDwgOCkKKyAgICAgICAgICAgICAgICAgICAgfCAoa0FkanVzdGVkQ2xpcFtyMV0gPDwgMTYpCiAgICAgICAgICAgICAgICAgICAgIHwgKDB4RkYgPDwgMjQpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBpZiAodW5jcm9wcGVkKSB7CisgICAgICAgICAgICAgICAgKCh1aW50MzJfdCAqKWRzdF9wdHIpWzFdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChrQWRqdXN0ZWRDbGlwW2IyXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgKGtBZGp1c3RlZENsaXBbZzJdIDw8IDgpCisgICAgICAgICAgICAgICAgICAgICAgICB8IChrQWRqdXN0ZWRDbGlwW3IyXSA8PCAxNikKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgKDB4RkYgPDwgMjQpOworICAgICAgICAgICAgfQorICAgICAgICB9OwogICAgIH0KICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKKyAgICAgICAgVFJFU1BBU1MoKTsKICAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7CiB9CisKIHN0YXR1c190IENvbG9yQ29udmVydGVyOjpjb252ZXJ0WVVWNDIwUGxhbmFyKAogICAgICAgICBjb25zdCBCaXRtYXBQYXJhbXMgJnNyYywgY29uc3QgQml0bWFwUGFyYW1zICZkc3QpIHsKLSAgICBpZiAoISgoc3JjLm1Dcm9wTGVmdCAmIDEpID09IDAKLSAgICAgICAgICAgICYmIHNyYy5jcm9wV2lkdGgoKSA9PSBkc3QuY3JvcFdpZHRoKCkKLSAgICAgICAgICAgICYmIHNyYy5jcm9wSGVpZ2h0KCkgPT0gZHN0LmNyb3BIZWlnaHQoKSkpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwotICAgIH0KLQogICAgIHVpbnQ4X3QgKmtBZGp1c3RlZENsaXAgPSBpbml0Q2xpcCgpOwogCisgICAgYXV0byByZWFkRnJvbVNyYyA9IGdldFJlYWRGcm9tU3JjKG1TcmNGb3JtYXQpOworICAgIGF1dG8gd3JpdGVUb0RzdCA9IGdldFdyaXRlVG9Ec3QobURzdEZvcm1hdCwga0FkanVzdGVkQ2xpcCk7CisKICAgICB1aW50OF90ICpkc3RfcHRyID0gKHVpbnQ4X3QgKilkc3QubUJpdHMKLSAgICAgICAgKyBkc3QubUNyb3BUb3AgKiBkc3QubVN0cmlkZSArIGRzdC5tQ3JvcExlZnQgKiBkc3QubUJwcDsKKyAgICAgICAgICAgICsgZHN0Lm1Dcm9wVG9wICogZHN0Lm1TdHJpZGUgKyBkc3QubUNyb3BMZWZ0ICogZHN0Lm1CcHA7CiAKLSAgICBjb25zdCB1aW50OF90ICpzcmNfeSA9Ci0gICAgICAgIChjb25zdCB1aW50OF90ICopc3JjLm1CaXRzICsgc3JjLm1Dcm9wVG9wICogc3JjLm1TdHJpZGUgKyBzcmMubUNyb3BMZWZ0OworICAgIHVpbnQ4X3QgKnNyY195ID0gKHVpbnQ4X3QgKilzcmMubUJpdHMKKyAgICAgICAgICAgICsgc3JjLm1Dcm9wVG9wICogc3JjLm1TdHJpZGUgKyBzcmMubUNyb3BMZWZ0ICogc3JjLm1CcHA7CiAKLSAgICBjb25zdCB1aW50OF90ICpzcmNfdSA9Ci0gICAgICAgIChjb25zdCB1aW50OF90ICopc3JjLm1CaXRzICsgc3JjLm1TdHJpZGUgKiBzcmMubUhlaWdodAotICAgICAgICArIChzcmMubUNyb3BUb3AgLyAyKSAqIChzcmMubVN0cmlkZSAvIDIpICsgc3JjLm1Dcm9wTGVmdCAvIDI7CisgICAgdWludDhfdCAqc3JjX3UgPSAodWludDhfdCAqKXNyYy5tQml0cyArIHNyYy5tU3RyaWRlICogc3JjLm1IZWlnaHQKKyAgICAgICAgICAgICsgKHNyYy5tQ3JvcFRvcCAvIDIpICogKHNyYy5tU3RyaWRlIC8gMikgKyBzcmMubUNyb3BMZWZ0IC8gMiAqIHNyYy5tQnBwOwogCi0gICAgY29uc3QgdWludDhfdCAqc3JjX3YgPQotICAgICAgICBzcmNfdSArIChzcmMubVN0cmlkZSAvIDIpICogKHNyYy5tSGVpZ2h0IC8gMik7CisgICAgdWludDhfdCAqc3JjX3YgPSBzcmNfdSArIChzcmMubVN0cmlkZSAvIDIpICogKHNyYy5tSGVpZ2h0IC8gMik7CiAKICAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IHNyYy5jcm9wSGVpZ2h0KCk7ICsreSkgewogICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IHNyYy5jcm9wV2lkdGgoKTsgeCArPSAyKSB7CkBAIC0zNzksMTEgKzQ0OCw4IEBACiAKICAgICAgICAgICAgIC8vIGNsaXAgcmFuZ2UgLTI3OCAuLiA1MzUKIAotICAgICAgICAgICAgc2lnbmVkIHkxID0gKHNpZ25lZClzcmNfeVt4XSAtIDE2OwotICAgICAgICAgICAgc2lnbmVkIHkyID0gKHNpZ25lZClzcmNfeVt4ICsgMV0gLSAxNjsKLQotICAgICAgICAgICAgc2lnbmVkIHUgPSAoc2lnbmVkKXNyY191W3ggLyAyXSAtIDEyODsKLSAgICAgICAgICAgIHNpZ25lZCB2ID0gKHNpZ25lZClzcmNfdlt4IC8gMl0gLSAxMjg7CisgICAgICAgICAgICBzaWduZWQgeTEsIHkyLCB1LCB2OworICAgICAgICAgICAgcmVhZEZyb21TcmMoc3JjX3ksIHNyY191LCBzcmNfdiwgeCwgJnkxLCAmeTIsICZ1LCAmdik7CiAKICAgICAgICAgICAgIHNpZ25lZCB1X2IgPSB1ICogNTE3OwogICAgICAgICAgICAgc2lnbmVkIHVfZyA9IC11ICogMTAwOwpAQCAtNDAxLDggKzQ2Nyw3IEBACiAgICAgICAgICAgICBzaWduZWQgcjIgPSAodG1wMiArIHZfcikgLyAyNTY7CiAKICAgICAgICAgICAgIGJvb2wgdW5jcm9wcGVkID0geCArIDEgPCBzcmMuY3JvcFdpZHRoKCk7Ci0gICAgICAgICAgICAodm9pZCl3cml0ZVRvRHN0KGRzdF9wdHIgKyB4ICogZHN0Lm1CcHAsCi0gICAgICAgICAgICAgICAgICAgIGtBZGp1c3RlZENsaXAsIHVuY3JvcHBlZCwgcjEsIGcxLCBiMSwgcjIsIGcyLCBiMik7CisgICAgICAgICAgICB3cml0ZVRvRHN0KGRzdF9wdHIgKyB4ICogZHN0Lm1CcHAsIHVuY3JvcHBlZCwgcjEsIGcxLCBiMSwgcjIsIGcyLCBiMik7CiAgICAgICAgIH0KIAogICAgICAgICBzcmNfeSArPSBzcmMubVN0cmlkZTsKQEAgLTQxOCwxNiArNDgzLDI0NyBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgQ29sb3JDb252ZXJ0ZXI6OmNvbnZlcnRZVVY0MjBQbGFuYXIxNigKKyAgICAgICAgY29uc3QgQml0bWFwUGFyYW1zICZzcmMsIGNvbnN0IEJpdG1hcFBhcmFtcyAmZHN0KSB7CisgICAgaWYgKG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQ0NFk0MTApIHsKKyAgICAgICAgcmV0dXJuIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWTQxMChzcmMsIGRzdCk7CisgICAgfQorCisgICAgcmV0dXJuIGNvbnZlcnRZVVY0MjBQbGFuYXIoc3JjLCBkc3QpOworfQorCisvKgorICogUGFjayAxMC1iaXQgWVVWIGludG8gUkdCQV8xMDEwMTAyLgorICoKKyAqIE1lZGlhIHNlbmRzIDEwLWJpdCBZVVYgaW4gYSBSR0JBXzEwMTAxMDIgZm9ybWF0IGJ1ZmZlci4gU0Ygd2lsbCBoYW5kbGUKKyAqIHRoZSBjb252ZXJzaW9uIHRvIFJHQiB1c2luZyBSZW5kZXJFbmdpbmUgZmFsbGJhY2suCisgKgorICogV2UgZG8gbm90IHBlcmZvcm0gYSBZVVYtPlJHQiBjb252ZXJzaW9uIGhlcmUsIGhvd2V2ZXIgdGhlIGNvbnZlcnNpb24gd2l0aAorICogQlQyMDIwIHRvIEZ1bGwgcmFuZ2UgaXMgYmVsb3cgZm9yIHJlZmVyZW5jZToKKyAqCisgKiAgIEIgPSAxLjE2OCAgKihZIC0gNjQpICsgMi4xNDggICooVSAtIDUxMikKKyAqICAgRyA9IDEuMTY4ICAqKFkgLSA2NCkgLSAwLjY1MiAgKihWIC0gNTEyKSAtIDAuMTg4ICAqKFUgLSA1MTIpCisgKiAgIFIgPSAxLjE2OCAgKihZIC0gNjQpICsgMS42ODMgICooViAtIDUxMikKKyAqCisgKiAgIEIgPSAxMTk2LzEwMjQgICooWSAtIDY0KSArIDIyMDAvMTAyNCAgKihVIC0gNTEyKQorICogICBHID0gLi4uLi4uLi4uLi4uLi4uLi4uLi4gLSAgNjY4LzEwMjQgICooViAtIDUxMikgLSAxOTIvMTAyNCAgKihVIC0gNTEyKQorICogICBSID0gLi4uLi4uLi4uLi4uLi4uLi4uLi4gKyAxNzIzLzEwMjQgICooViAtIDUxMikKKyAqCisgKiAgIG1pbl9CID0gKDExOTYgICooLSA2NCkgKyAyMjAwICAqKC0gNTEyKSkgLyAxMDI0ID0gLTExNzUKKyAqICAgbWluX0cgPSAoMTE5NiAgKigtIDY0KSAtIDY2OCAgKigxMDIzIC0gNTEyKSAtIDE5MiAgKigxMDIzIC0gNTEyKSkgLyAxMDI0ID0gLTUwNAorICogICBtaW5fUiA9ICgxMTk2ICAqKC0gNjQpICsgMTcyMyAgKigtIDUxMikpIC8gMTAyNCA9IC05MzcKKyAqCisgKiAgIG1heF9CID0gKDExOTYgICooMTAyMyAtIDY0KSArIDIyMDAgICooMTAyMyAtIDUxMikpIC8gMTAyNCA9IDIyMTgKKyAqICAgbWF4X0cgPSAoMTE5NiAgKigxMDIzIC0gNjQpIC0gNjY4ICAqKC0gNTEyKSAtIDE5MiAgKigtIDUxMikpIC8gMTAyNCA9IDE1NTEKKyAqICAgbWF4X1IgPSAoMTE5NiAgKigxMDIzIC0gNjQpICsgMTcyMyAgKigxMDIzIC0gNTEyKSkgLyAxMDI0ID0gMTk4MAorICoKKyAqICAgY2xpcCByYW5nZSAtMTE3NSAuLiAyMjE4CisgKgorICovCisKKyNpZiAhVVNFX05FT05fWTQxMAorCitzdGF0dXNfdCBDb2xvckNvbnZlcnRlcjo6Y29udmVydFlVVjQyMFBsYW5hcjE2VG9ZNDEwKAorICAgICAgICBjb25zdCBCaXRtYXBQYXJhbXMgJnNyYywgY29uc3QgQml0bWFwUGFyYW1zICZkc3QpIHsKKyAgICB1aW50OF90ICpkc3RfcHRyID0gKHVpbnQ4X3QgKilkc3QubUJpdHMKKyAgICAgICAgKyBkc3QubUNyb3BUb3AgKiBkc3QubVN0cmlkZSArIGRzdC5tQ3JvcExlZnQgKiBkc3QubUJwcDsKKworICAgIGNvbnN0IHVpbnQ4X3QgKnNyY195ID0KKyAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilzcmMubUJpdHMgKyBzcmMubUNyb3BUb3AgKiBzcmMubVN0cmlkZSArIHNyYy5tQ3JvcExlZnQgKiBzcmMubUJwcDsKKworICAgIGNvbnN0IHVpbnQ4X3QgKnNyY191ID0KKyAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilzcmMubUJpdHMgKyBzcmMubVN0cmlkZSAqIHNyYy5tSGVpZ2h0CisgICAgICAgICsgKHNyYy5tQ3JvcFRvcCAvIDIpICogKHNyYy5tU3RyaWRlIC8gMikgKyAoc3JjLm1Dcm9wTGVmdCAvIDIpICogc3JjLm1CcHA7CisKKyAgICBjb25zdCB1aW50OF90ICpzcmNfdiA9CisgICAgICAgIHNyY191ICsgKHNyYy5tU3RyaWRlIC8gMikgKiAoc3JjLm1IZWlnaHQgLyAyKTsKKworICAgIC8vIENvbnZlcnRpbmcgdHdvIGxpbmVzIGF0IGEgdGltZSwgc2xpZ2h0bHkgZmFzdGVyCisgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBzcmMuY3JvcEhlaWdodCgpOyB5ICs9IDIpIHsKKyAgICAgICAgdWludDMyX3QgKmRzdF90b3AgPSAodWludDMyX3QgKikgZHN0X3B0cjsKKyAgICAgICAgdWludDMyX3QgKmRzdF9ib3QgPSAodWludDMyX3QgKikgKGRzdF9wdHIgKyBkc3QubVN0cmlkZSk7CisgICAgICAgIHVpbnQxNl90ICpwdHJfeXRvcCA9ICh1aW50MTZfdCopIHNyY195OworICAgICAgICB1aW50MTZfdCAqcHRyX3lib3QgPSAodWludDE2X3QqKSAoc3JjX3kgKyBzcmMubVN0cmlkZSk7CisgICAgICAgIHVpbnQxNl90ICpwdHJfdSA9ICh1aW50MTZfdCopIHNyY191OworICAgICAgICB1aW50MTZfdCAqcHRyX3YgPSAodWludDE2X3QqKSBzcmNfdjsKKworICAgICAgICB1aW50MzJfdCB1MDEsIHYwMSwgeTAxLCB5MjMsIHk0NSwgeTY3LCB1djAsIHV2MTsKKyAgICAgICAgc2l6ZV90IHggPSAwOworICAgICAgICBmb3IgKDsgeCA8IHNyYy5jcm9wV2lkdGgoKSAtIDM7IHggKz0gNCkgeworICAgICAgICAgICAgdTAxID0gKigodWludDMyX3QqKXB0cl91KTsgcHRyX3UgKz0gMjsKKyAgICAgICAgICAgIHYwMSA9ICooKHVpbnQzMl90KilwdHJfdik7IHB0cl92ICs9IDI7CisKKyAgICAgICAgICAgIHkwMSA9ICooKHVpbnQzMl90KilwdHJfeXRvcCk7IHB0cl95dG9wICs9IDI7CisgICAgICAgICAgICB5MjMgPSAqKCh1aW50MzJfdCopcHRyX3l0b3ApOyBwdHJfeXRvcCArPSAyOworICAgICAgICAgICAgeTQ1ID0gKigodWludDMyX3QqKXB0cl95Ym90KTsgcHRyX3lib3QgKz0gMjsKKyAgICAgICAgICAgIHk2NyA9ICooKHVpbnQzMl90KilwdHJfeWJvdCk7IHB0cl95Ym90ICs9IDI7CisKKyAgICAgICAgICAgIHV2MCA9ICh1MDEgJiAweDNGRikgfCAoKHYwMSAmIDB4M0ZGKSA8PCAyMCk7CisgICAgICAgICAgICB1djEgPSAodTAxID4+IDE2KSB8ICgodjAxID4+IDE2KSA8PCAyMCk7CisKKyAgICAgICAgICAgICpkc3RfdG9wKysgPSAoKHkwMSAmIDB4M0ZGKSA8PCAxMCkgfCB1djA7CisgICAgICAgICAgICAqZHN0X3RvcCsrID0gKCh5MDEgPj4gMTYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RfdG9wKysgPSAoKHkyMyAmIDB4M0ZGKSA8PCAxMCkgfCB1djE7CisgICAgICAgICAgICAqZHN0X3RvcCsrID0gKCh5MjMgPj4gMTYpIDw8IDEwKSB8IHV2MTsKKworICAgICAgICAgICAgKmRzdF9ib3QrKyA9ICgoeTQ1ICYgMHgzRkYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RfYm90KysgPSAoKHk0NSA+PiAxNikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdF9ib3QrKyA9ICgoeTY3ICYgMHgzRkYpIDw8IDEwKSB8IHV2MTsKKyAgICAgICAgICAgICpkc3RfYm90KysgPSAoKHk2NyA+PiAxNikgPDwgMTApIHwgdXYxOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlcmUgc2hvdWxkIGJlIGF0IG1vc3QgMiBtb3JlIHBpeGVscyB0byBwcm9jZXNzLiBOb3RlIHRoYXQgd2UgZG9uJ3QKKyAgICAgICAgLy8gbmVlZCB0byBjb25zaWRlciBvZGQgY2FzZSBhcyB0aGUgYnVmZmVyIGlzIGFsd2F5cyBhbGlnbmVkIHRvIGV2ZW4uCisgICAgICAgIGlmICh4IDwgc3JjLmNyb3BXaWR0aCgpKSB7CisgICAgICAgICAgICB1MDEgPSAqcHRyX3U7CisgICAgICAgICAgICB2MDEgPSAqcHRyX3Y7CisgICAgICAgICAgICB5MDEgPSAqKCh1aW50MzJfdCopcHRyX3l0b3ApOworICAgICAgICAgICAgeTQ1ID0gKigodWludDMyX3QqKXB0cl95Ym90KTsKKyAgICAgICAgICAgIHV2MCA9ICh1MDEgJiAweDNGRikgfCAoKHYwMSAmIDB4M0ZGKSA8PCAyMCk7CisgICAgICAgICAgICAqZHN0X3RvcCsrID0gKCh5MDEgJiAweDNGRikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdF90b3ArKyA9ICgoeTAxID4+IDE2KSA8PCAxMCkgfCB1djA7CisgICAgICAgICAgICAqZHN0X2JvdCsrID0gKCh5NDUgJiAweDNGRikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdF9ib3QrKyA9ICgoeTQ1ID4+IDE2KSA8PCAxMCkgfCB1djA7CisgICAgICAgIH0KKworICAgICAgICBzcmNfeSArPSBzcmMubVN0cmlkZSAqIDI7CisgICAgICAgIHNyY191ICs9IHNyYy5tU3RyaWRlIC8gMjsKKyAgICAgICAgc3JjX3YgKz0gc3JjLm1TdHJpZGUgLyAyOworICAgICAgICBkc3RfcHRyICs9IGRzdC5tU3RyaWRlICogMjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKKyNlbHNlCisKK3N0YXR1c190IENvbG9yQ29udmVydGVyOjpjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1k0MTAoCisgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCkgeworICAgIHVpbnQ4X3QgKm91dCA9ICh1aW50OF90ICopZHN0Lm1CaXRzCisgICAgICAgICsgZHN0Lm1Dcm9wVG9wICogZHN0Lm1TdHJpZGUgKyBkc3QubUNyb3BMZWZ0ICogZHN0Lm1CcHA7CisKKyAgICBjb25zdCB1aW50OF90ICpzcmNfeSA9CisgICAgICAgIChjb25zdCB1aW50OF90ICopc3JjLm1CaXRzICsgc3JjLm1Dcm9wVG9wICogc3JjLm1TdHJpZGUgKyBzcmMubUNyb3BMZWZ0ICogc3JjLm1CcHA7CisKKyAgICBjb25zdCB1aW50OF90ICpzcmNfdSA9CisgICAgICAgIChjb25zdCB1aW50OF90ICopc3JjLm1CaXRzICsgc3JjLm1TdHJpZGUgKiBzcmMubUhlaWdodAorICAgICAgICArIChzcmMubUNyb3BUb3AgLyAyKSAqIChzcmMubVN0cmlkZSAvIDIpICsgKHNyYy5tQ3JvcExlZnQgLyAyKSAqIHNyYy5tQnBwOworCisgICAgY29uc3QgdWludDhfdCAqc3JjX3YgPQorICAgICAgICBzcmNfdSArIChzcmMubVN0cmlkZSAvIDIpICogKHNyYy5tSGVpZ2h0IC8gMik7CisKKyAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IHNyYy5jcm9wSGVpZ2h0KCk7IHkrKykgeworICAgICAgICB1aW50MTZfdCAqcHRyX3kgPSAodWludDE2X3QqKSBzcmNfeTsKKyAgICAgICAgdWludDE2X3QgKnB0cl91ID0gKHVpbnQxNl90Kikgc3JjX3U7CisgICAgICAgIHVpbnQxNl90ICpwdHJfdiA9ICh1aW50MTZfdCopIHNyY192OworICAgICAgICB1aW50MzJfdCAqcHRyX291dCA9ICh1aW50MzJfdCAqKSBvdXQ7CisKKyAgICAgICAgLy8gUHJvY2VzcyAxNi1waXhlbCBhdCBhIHRpbWUuCisgICAgICAgIHVpbnQzMl90ICpwdHJfbGltaXQgPSBwdHJfb3V0ICsgKHNyYy5jcm9wV2lkdGgoKSAmIH4xNSk7CisgICAgICAgIHdoaWxlIChwdHJfb3V0IDwgcHRyX2xpbWl0KSB7CisgICAgICAgICAgICB1aW50MTZ4NF90IHUwMTIzID0gdmxkMV91MTYocHRyX3UpOyBwdHJfdSArPSA0OworICAgICAgICAgICAgdWludDE2eDRfdCB1NDU2NyA9IHZsZDFfdTE2KHB0cl91KTsgcHRyX3UgKz0gNDsKKyAgICAgICAgICAgIHVpbnQxNng0X3QgdjAxMjMgPSB2bGQxX3UxNihwdHJfdik7IHB0cl92ICs9IDQ7CisgICAgICAgICAgICB1aW50MTZ4NF90IHY0NTY3ID0gdmxkMV91MTYocHRyX3YpOyBwdHJfdiArPSA0OworICAgICAgICAgICAgdWludDE2eDRfdCB5MDEyMyA9IHZsZDFfdTE2KHB0cl95KTsgcHRyX3kgKz0gNDsKKyAgICAgICAgICAgIHVpbnQxNng0X3QgeTQ1NjcgPSB2bGQxX3UxNihwdHJfeSk7IHB0cl95ICs9IDQ7CisgICAgICAgICAgICB1aW50MTZ4NF90IHk4OWFiID0gdmxkMV91MTYocHRyX3kpOyBwdHJfeSArPSA0OworICAgICAgICAgICAgdWludDE2eDRfdCB5Y2RlZiA9IHZsZDFfdTE2KHB0cl95KTsgcHRyX3kgKz0gNDsKKworICAgICAgICAgICAgdWludDMyeDJfdCB1dnRlbXBsOworICAgICAgICAgICAgdWludDMyeDRfdCB1dnRlbXBxOworCisgICAgICAgICAgICB1dnRlbXBxID0gdmFkZHdfdTE2KHZzaGxsX25fdTE2KHYwMTIzLCAyMCksIHUwMTIzKTsKKworICAgICAgICAgICAgdXZ0ZW1wbCA9IHZnZXRfbG93X3UzMih1dnRlbXBxKTsKKyAgICAgICAgICAgIHVpbnQzMng0X3QgdXYwMDExID0gdnJlaW50ZXJwcmV0cV91MzJfdTY0KAorICAgICAgICAgICAgICAgICAgICB2YWRkd191MzIodnNobGxfbl91MzIodXZ0ZW1wbCwgMzIpLCB1dnRlbXBsKSk7CisKKyAgICAgICAgICAgIHV2dGVtcGwgPSB2Z2V0X2hpZ2hfdTMyKHV2dGVtcHEpOworICAgICAgICAgICAgdWludDMyeDRfdCB1djIyMzMgPSB2cmVpbnRlcnByZXRxX3UzMl91NjQoCisgICAgICAgICAgICAgICAgICAgIHZhZGR3X3UzMih2c2hsbF9uX3UzMih1dnRlbXBsLCAzMiksIHV2dGVtcGwpKTsKKworICAgICAgICAgICAgdXZ0ZW1wcSA9IHZhZGR3X3UxNih2c2hsbF9uX3UxNih2NDU2NywgMjApLCB1NDU2Nyk7CisKKyAgICAgICAgICAgIHV2dGVtcGwgPSB2Z2V0X2xvd191MzIodXZ0ZW1wcSk7CisgICAgICAgICAgICB1aW50MzJ4NF90IHV2NDQ1NSA9IHZyZWludGVycHJldHFfdTMyX3U2NCgKKyAgICAgICAgICAgICAgICAgICAgdmFkZHdfdTMyKHZzaGxsX25fdTMyKHV2dGVtcGwsIDMyKSwgdXZ0ZW1wbCkpOworCisgICAgICAgICAgICB1dnRlbXBsID0gdmdldF9oaWdoX3UzMih1dnRlbXBxKTsKKyAgICAgICAgICAgIHVpbnQzMng0X3QgdXY2Njc3ID0gdnJlaW50ZXJwcmV0cV91MzJfdTY0KAorICAgICAgICAgICAgICAgICAgICB2YWRkd191MzIodnNobGxfbl91MzIodXZ0ZW1wbCwgMzIpLCB1dnRlbXBsKSk7CisKKyAgICAgICAgICAgIHVpbnQzMng0X3QgZHN0dGVtcDsKKworICAgICAgICAgICAgZHN0dGVtcCA9IHZvcnJxX3UzMih1djAwMTEsIHZzaGxsX25fdTE2KHkwMTIzLCAxMCkpOworICAgICAgICAgICAgdnN0MXFfdTMyKHB0cl9vdXQsIGRzdHRlbXApOyBwdHJfb3V0ICs9IDQ7CisKKyAgICAgICAgICAgIGRzdHRlbXAgPSB2b3JycV91MzIodXYyMjMzLCB2c2hsbF9uX3UxNih5NDU2NywgMTApKTsKKyAgICAgICAgICAgIHZzdDFxX3UzMihwdHJfb3V0LCBkc3R0ZW1wKTsgcHRyX291dCArPSA0OworCisgICAgICAgICAgICBkc3R0ZW1wID0gdm9ycnFfdTMyKHV2NDQ1NSwgdnNobGxfbl91MTYoeTg5YWIsIDEwKSk7CisgICAgICAgICAgICB2c3QxcV91MzIocHRyX291dCwgZHN0dGVtcCk7IHB0cl9vdXQgKz0gNDsKKworICAgICAgICAgICAgZHN0dGVtcCA9IHZvcnJxX3UzMih1djY2NzcsIHZzaGxsX25fdTE2KHljZGVmLCAxMCkpOworICAgICAgICAgICAgdnN0MXFfdTMyKHB0cl9vdXQsIGRzdHRlbXApOyBwdHJfb3V0ICs9IDQ7CisgICAgICAgIH0KKworICAgICAgICBzcmNfeSArPSBzcmMubVN0cmlkZTsKKyAgICAgICAgaWYgKHkgJiAxKSB7CisgICAgICAgICAgICBzcmNfdSArPSBzcmMubVN0cmlkZSAvIDI7CisgICAgICAgICAgICBzcmNfdiArPSBzcmMubVN0cmlkZSAvIDI7CisgICAgICAgIH0KKyAgICAgICAgb3V0ICs9IGRzdC5tU3RyaWRlOworICAgIH0KKworICAgIC8vIFByb2Nlc3MgdGhlIGxlZnQtb3ZlcnMgb3V0LW9mLWxvb3AsIDItcGl4ZWwgYXQgYSB0aW1lLiBOb3RlIHRoYXQgd2UgZG9uJ3QKKyAgICAvLyBuZWVkIHRvIGNvbnNpZGVyIG9kZCBjYXNlIGFzIHRoZSBidWZmZXIgaXMgYWx3YXlzIGFsaWduZWQgdG8gZXZlbi4KKyAgICBpZiAoc3JjLmNyb3BXaWR0aCgpICYgMTUpIHsKKyAgICAgICAgc2l6ZV90IHhzdGFydCA9IChzcmMuY3JvcFdpZHRoKCkgJiB+MTUpOworCisgICAgICAgIHVpbnQ4X3QgKm91dCA9ICh1aW50OF90ICopZHN0Lm1CaXRzICsgZHN0Lm1Dcm9wVG9wICogZHN0Lm1TdHJpZGUKKyAgICAgICAgICAgICAgICArIChkc3QubUNyb3BMZWZ0ICsgeHN0YXJ0KSAqIGRzdC5tQnBwOworCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY195ID0gKGNvbnN0IHVpbnQ4X3QgKilzcmMubUJpdHMgKyBzcmMubUNyb3BUb3AgKiBzcmMubVN0cmlkZQorICAgICAgICAgICAgICAgICsgKHNyYy5tQ3JvcExlZnQgKyB4c3RhcnQpICogc3JjLm1CcHA7CisKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3UgPSAoY29uc3QgdWludDhfdCAqKXNyYy5tQml0cyArIHNyYy5tU3RyaWRlICogc3JjLm1IZWlnaHQKKyAgICAgICAgICAgICsgKHNyYy5tQ3JvcFRvcCAvIDIpICogKHNyYy5tU3RyaWRlIC8gMikKKyAgICAgICAgICAgICsgKChzcmMubUNyb3BMZWZ0ICsgeHN0YXJ0KSAvIDIpICogc3JjLm1CcHA7CisKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3YgPSBzcmNfdSArIChzcmMubVN0cmlkZSAvIDIpICogKHNyYy5tSGVpZ2h0IC8gMik7CisKKyAgICAgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBzcmMuY3JvcEhlaWdodCgpOyB5KyspIHsKKyAgICAgICAgICAgIHVpbnQxNl90ICpwdHJfeSA9ICh1aW50MTZfdCopIHNyY195OworICAgICAgICAgICAgdWludDE2X3QgKnB0cl91ID0gKHVpbnQxNl90Kikgc3JjX3U7CisgICAgICAgICAgICB1aW50MTZfdCAqcHRyX3YgPSAodWludDE2X3QqKSBzcmNfdjsKKyAgICAgICAgICAgIHVpbnQzMl90ICpwdHJfb3V0ID0gKHVpbnQzMl90ICopIG91dDsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IHggPSB4c3RhcnQ7IHggPCBzcmMuY3JvcFdpZHRoKCk7IHggKz0gMikgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IHUgPSAqcHRyX3UrKzsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCB2ID0gKnB0cl92Kys7CisgICAgICAgICAgICAgICAgdWludDMyX3QgeTAxID0gKigodWludDMyX3QqKXB0cl95KTsgcHRyX3kgKz0gMjsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB1diA9IHUgfCAoKCh1aW50MzJfdCl2KSA8PCAyMCk7CisgICAgICAgICAgICAgICAgKnB0cl9vdXQrKyA9ICgoeTAxICYgMHgzRkYpIDw8IDEwKSB8IHV2OworICAgICAgICAgICAgICAgICpwdHJfb3V0KysgPSAoKHkwMSA+PiAxNikgPDwgMTApIHwgdXY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcmNfeSArPSBzcmMubVN0cmlkZTsKKyAgICAgICAgICAgIGlmICh5ICYgMSkgeworICAgICAgICAgICAgICAgIHNyY191ICs9IHNyYy5tU3RyaWRlIC8gMjsKKyAgICAgICAgICAgICAgICBzcmNfdiArPSBzcmMubVN0cmlkZSAvIDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQgKz0gZHN0Lm1TdHJpZGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKKyNlbmRpZiAvLyBVU0VfTkVPTl9ZNDEwCisKIHN0YXR1c190IENvbG9yQ29udmVydGVyOjpjb252ZXJ0UUNPTVlVVjQyMFNlbWlQbGFuYXIoCiAgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCkgewogICAgIHVpbnQ4X3QgKmtBZGp1c3RlZENsaXAgPSBpbml0Q2xpcCgpOwogCi0gICAgaWYgKCEoKHNyYy5tQ3JvcExlZnQgJiAxKSA9PSAwCi0gICAgICAgICAgICAmJiBzcmMuY3JvcFdpZHRoKCkgPT0gZHN0LmNyb3BXaWR0aCgpCi0gICAgICAgICAgICAmJiBzcmMuY3JvcEhlaWdodCgpID09IGRzdC5jcm9wSGVpZ2h0KCkpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KICAgICB1aW50MTZfdCAqZHN0X3B0ciA9ICh1aW50MTZfdCAqKWRzdC5tQml0cwogICAgICAgICArIGRzdC5tQ3JvcFRvcCAqIGRzdC5tV2lkdGggKyBkc3QubUNyb3BMZWZ0OwogCkBAIC00OTYsMTIgKzc5Miw2IEBACiAKICAgICB1aW50OF90ICprQWRqdXN0ZWRDbGlwID0gaW5pdENsaXAoKTsKIAotICAgIGlmICghKChzcmMubUNyb3BMZWZ0ICYgMSkgPT0gMAotICAgICAgICAgICAgJiYgc3JjLmNyb3BXaWR0aCgpID09IGRzdC5jcm9wV2lkdGgoKQotICAgICAgICAgICAgJiYgc3JjLmNyb3BIZWlnaHQoKSA9PSBkc3QuY3JvcEhlaWdodCgpKSkgewotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQotCiAgICAgdWludDE2X3QgKmRzdF9wdHIgPSAodWludDE2X3QgKilkc3QubUJpdHMKICAgICAgICAgKyBkc3QubUNyb3BUb3AgKiBkc3QubVdpZHRoICsgZHN0Lm1Dcm9wTGVmdDsKIApAQCAtNTY4LDE2ICs4NTgsMTEgQEAKICAgICAgICAgY29uc3QgQml0bWFwUGFyYW1zICZzcmMsIGNvbnN0IEJpdG1hcFBhcmFtcyAmZHN0KSB7CiAgICAgdWludDhfdCAqa0FkanVzdGVkQ2xpcCA9IGluaXRDbGlwKCk7CiAKLSAgICBpZiAoISgoc3JjLm1Dcm9wTGVmdCAmIDEpID09IDAKLSAgICAgICAgICAgICYmIHNyYy5jcm9wV2lkdGgoKSA9PSBkc3QuY3JvcFdpZHRoKCkKLSAgICAgICAgICAgICYmIHNyYy5jcm9wSGVpZ2h0KCkgPT0gZHN0LmNyb3BIZWlnaHQoKSkpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwotICAgIH0KLQogICAgIHVpbnQxNl90ICpkc3RfcHRyID0gKHVpbnQxNl90ICopZHN0Lm1CaXRzCiAgICAgICAgICsgZHN0Lm1Dcm9wVG9wICogZHN0Lm1XaWR0aCArIGRzdC5tQ3JvcExlZnQ7CiAKLSAgICBjb25zdCB1aW50OF90ICpzcmNfeSA9IChjb25zdCB1aW50OF90ICopc3JjLm1CaXRzOworICAgIGNvbnN0IHVpbnQ4X3QgKnNyY195ID0KKyAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilzcmMubUJpdHMgKyBzcmMubUNyb3BUb3AgKiBzcmMubVdpZHRoICsgc3JjLm1Dcm9wTGVmdDsKIAogICAgIGNvbnN0IHVpbnQ4X3QgKnNyY191ID0KICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilzcmNfeSArIHNyYy5tV2lkdGggKiAoc3JjLm1IZWlnaHQgLSBzcmMubUNyb3BUb3AgLyAyKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Tb2Z0d2FyZVJlbmRlcmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Tb2Z0d2FyZVJlbmRlcmVyLmNwcAppbmRleCBhMDc3ODdhLi42NTdhMDViIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vU29mdHdhcmVSZW5kZXJlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL1NvZnR3YXJlUmVuZGVyZXIuY3BwCkBAIC0xOCwxMCArMTgsMTEgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgIi4uL2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oIgotCiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4gLy8gZm9yIHByb3BlcnR5X2dldAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5oPgogI2luY2x1ZGUgPHN5c3RlbS93aW5kb3cuaD4KICNpbmNsdWRlIDx1aS9GZW5jZS5oPgogI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXJNYXBwZXIuaD4KQEAgLTMwLDcgKzMxLDYgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi0KIHN0YXRpYyBpbnQgQUxJR04oaW50IHgsIGludCB5KSB7CiAgICAgLy8geSBtdXN0IGJlIGEgcG93ZXIgb2YgMi4KICAgICByZXR1cm4gKHggKyB5IC0gMSkgJiB+KHkgLSAxKTsKQEAgLTUwLDcgKzUwLDkgQEAKICAgICAgIG1Dcm9wQm90dG9tKDApLAogICAgICAgbUNyb3BXaWR0aCgwKSwKICAgICAgIG1Dcm9wSGVpZ2h0KDApLAotICAgICAgbVJvdGF0aW9uRGVncmVlcyhyb3RhdGlvbikgeworICAgICAgbVJvdGF0aW9uRGVncmVlcyhyb3RhdGlvbiksCisgICAgICBtRGF0YVNwYWNlKEhBTF9EQVRBU1BBQ0VfVU5LTk9XTikgeworICAgIG1lbXNldCgmbUhEUlN0YXRpY0luZm8sIDAsIHNpemVvZihtSERSU3RhdGljSW5mbykpOwogfQogCiBTb2Z0d2FyZVJlbmRlcmVyOjp+U29mdHdhcmVSZW5kZXJlcigpIHsKQEAgLTU4LDcgKzYwLDggQEAKICAgICBtQ29udmVydGVyID0gTlVMTDsKIH0KIAotdm9pZCBTb2Z0d2FyZVJlbmRlcmVyOjpyZXNldEZvcm1hdElmQ2hhbmdlZChjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgewordm9pZCBTb2Z0d2FyZVJlbmRlcmVyOjpyZXNldEZvcm1hdElmQ2hhbmdlZCgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIHNpemVfdCBudW1PdXRwdXRCdWZmZXJzKSB7CiAgICAgQ0hFQ0soZm9ybWF0ICE9IE5VTEwpOwogCiAgICAgaW50MzJfdCBjb2xvckZvcm1hdE5ldzsKQEAgLTc2LDEzICs3OSwyNiBAQAogICAgICAgICBjcm9wQm90dG9tTmV3ID0gaGVpZ2h0TmV3IC0gMTsKICAgICB9CiAKKyAgICAvLyBUaGUgbmF0aXZlIHdpbmRvdyBidWZmZXIgZm9ybWF0IGZvciBoaWdoLWJpdGRlcHRoIGNvbnRlbnQgY291bGQKKyAgICAvLyBkZXBlbmQgb24gdGhlIGRhdGFzcGFjZSBhbHNvLgorICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZTsKKyAgICBib29sIGRhdGFTcGFjZUNoYW5nZWRGb3JQbGFuYXIxNiA9IGZhbHNlOworICAgIGlmIChjb2xvckZvcm1hdE5ldyA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyMTYKKyAgICAgICAgICAgICYmIGZvcm1hdC0+ZmluZEludDMyKCJhbmRyb2lkLl9kYXRhc3BhY2UiLCAoaW50MzJfdCAqKSZkYXRhU3BhY2UpCisgICAgICAgICAgICAmJiBkYXRhU3BhY2UgIT0gbURhdGFTcGFjZSkgeworICAgICAgICAvLyBEbyBub3QgbW9kaWZ5IG1EYXRhU3BhY2UgaGVyZSwgaXQncyBvbmx5IG1vZGlmaWVkIGF0IGxhc3QKKyAgICAgICAgLy8gd2hlbiB3ZSBkbyBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2RhdGFfc3BhY2UoKS4KKyAgICAgICAgZGF0YVNwYWNlQ2hhbmdlZEZvclBsYW5hcjE2ID0gdHJ1ZTsKKyAgICB9CisKICAgICBpZiAoc3RhdGljX2Nhc3Q8aW50MzJfdD4obUNvbG9yRm9ybWF0KSA9PSBjb2xvckZvcm1hdE5ldyAmJgogICAgICAgICBtV2lkdGggPT0gd2lkdGhOZXcgJiYKICAgICAgICAgbUhlaWdodCA9PSBoZWlnaHROZXcgJiYKICAgICAgICAgbUNyb3BMZWZ0ID09IGNyb3BMZWZ0TmV3ICYmCiAgICAgICAgIG1Dcm9wVG9wID09IGNyb3BUb3BOZXcgJiYKICAgICAgICAgbUNyb3BSaWdodCA9PSBjcm9wUmlnaHROZXcgJiYKLSAgICAgICAgbUNyb3BCb3R0b20gPT0gY3JvcEJvdHRvbU5ldykgeworICAgICAgICBtQ3JvcEJvdHRvbSA9PSBjcm9wQm90dG9tTmV3ICYmCisgICAgICAgICFkYXRhU3BhY2VDaGFuZ2VkRm9yUGxhbmFyMTYpIHsKICAgICAgICAgLy8gTm90aGluZyBjaGFuZ2VkLCBubyBuZWVkIHRvIHJlc2V0IHJlbmRlcmVyLgogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMTMwLDYgKzE0NiwyMiBAQAogICAgICAgICAgICAgICAgIGJ1ZkhlaWdodCA9IChtQ3JvcEhlaWdodCArIDEpICYgfjE7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIxNjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKChkYXRhU3BhY2UgJiBIQUxfREFUQVNQQUNFX1NUQU5EQVJEX01BU0spID09IEhBTF9EQVRBU1BBQ0VfU1RBTkRBUkRfQlQyMDIwKQorICAgICAgICAgICAgICAgICAmJiAoKGRhdGFTcGFjZSAmIEhBTF9EQVRBU1BBQ0VfVFJBTlNGRVJfTUFTSykgPT0gSEFMX0RBVEFTUEFDRV9UUkFOU0ZFUl9TVDIwODQpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEhlcmUgd2Ugd291bGQgY29udmVydCBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyMTYgaW50bworICAgICAgICAgICAgICAgICAgICAvLyBPTVhfQ09MT1JfRm9ybWF0WVVWNDQ0WTQxMCwgYW5kIHB1dCBpdCBpbnNpZGUgYSBidWZmZXIgd2l0aAorICAgICAgICAgICAgICAgICAgICAvLyBmb3JtYXQgSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzEwMTAxMDIuIFN1cmZhY2VmbGluZ2VyIHdpbGwKKyAgICAgICAgICAgICAgICAgICAgLy8gdXNlIHJlbmRlciBlbmdpbmUgdG8gY29udmVydCBpdCB0byBSR0IgaWYgbmVlZGVkLgorICAgICAgICAgICAgICAgICAgICBoYWxGb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBoYWxGb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lWMTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ1ZldpZHRoID0gKG1Dcm9wV2lkdGggKyAxKSAmIH4xOworICAgICAgICAgICAgICAgIGJ1ZkhlaWdodCA9IChtQ3JvcEhlaWdodCArIDEpICYgfjE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTQxLDYgKzE3MywxMCBAQAogICAgICAgICBtQ29udmVydGVyID0gbmV3IENvbG9yQ29udmVydGVyKAogICAgICAgICAgICAgICAgIG1Db2xvckZvcm1hdCwgT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1KTsKICAgICAgICAgQ0hFQ0sobUNvbnZlcnRlci0+aXNWYWxpZCgpKTsKKyAgICB9IGVsc2UgaWYgKGhhbEZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMikgeworICAgICAgICBtQ29udmVydGVyID0gbmV3IENvbG9yQ29udmVydGVyKAorICAgICAgICAgICAgICAgIG1Db2xvckZvcm1hdCwgT01YX0NPTE9SX0Zvcm1hdFlVVjQ0NFk0MTApOworICAgICAgICBDSEVDSyhtQ29udmVydGVyLT5pc1ZhbGlkKCkpOwogICAgIH0KIAogICAgIENIRUNLKG1OYXRpdmVXaW5kb3cgIT0gTlVMTCk7CkBAIC0xNTEsNyArMTg3LDcgQEAKICAgICBDSEVDS19FUSgwLAogICAgICAgICAgICAgbmF0aXZlX3dpbmRvd19zZXRfdXNhZ2UoCiAgICAgICAgICAgICBtTmF0aXZlV2luZG93LmdldCgpLAotICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19SRUFEX05FVkVSIHwgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTgorICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19SRUFEX05FVkVSIHwgR1JBTExPQ19VU0FHRV9TV19XUklURV9SQVJFTFkKICAgICAgICAgICAgIHwgR1JBTExPQ19VU0FHRV9IV19URVhUVVJFIHwgR1JBTExPQ19VU0FHRV9FWFRFUk5BTF9ESVNQKSk7CiAKICAgICBDSEVDS19FUSgwLApAQCAtMTY3LDYgKzIwMywxMSBAQAogICAgIENIRUNLX0VRKDAsIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZm9ybWF0KAogICAgICAgICAgICAgICAgIG1OYXRpdmVXaW5kb3cuZ2V0KCksCiAgICAgICAgICAgICAgICAgaGFsRm9ybWF0KSk7CisgICAgaWYgKE9LICE9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcl9jb3VudCgKKyAgICAgICAgICAgICAgICBtTmF0aXZlV2luZG93LmdldCgpLCBudW1PdXRwdXRCdWZmZXJzICsgNCkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgbmF0aXZlIHdpbmRvdyBidWZmZXIgY291bnQgdG8gKCV6dSArIDQpIiwKKyAgICAgICAgICAgICAgICBudW1PdXRwdXRCdWZmZXJzKTsKKyAgICB9CiAKICAgICAvLyBOT1RFOiBuYXRpdmUgd2luZG93IHVzZXMgZXh0ZW5kZWQgcmlnaHQtYm90dG9tIGNvb3JkaW5hdGUKICAgICBhbmRyb2lkX25hdGl2ZV9yZWN0X3QgY3JvcDsKQEAgLTIwMiw4ICsyNDMsOCBAQAogCiBzdGQ6Omxpc3Q8RnJhbWVSZW5kZXJUcmFja2VyOjpJbmZvPiBTb2Z0d2FyZVJlbmRlcmVyOjpyZW5kZXIoCiAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCAsIGludDY0X3QgbWVkaWFUaW1lVXMsIG5zZWNzX3QgcmVuZGVyVGltZU5zLAotICAgICAgICB2b2lkKiAvKnBsYXRmb3JtUHJpdmF0ZSovLCBjb25zdCBzcDxBTWVzc2FnZT4mIGZvcm1hdCkgewotICAgIHJlc2V0Rm9ybWF0SWZDaGFuZ2VkKGZvcm1hdCk7CisgICAgICAgIHNpemVfdCBudW1PdXRwdXRCdWZmZXJzLCBjb25zdCBzcDxBTWVzc2FnZT4mIGZvcm1hdCkgeworICAgIHJlc2V0Rm9ybWF0SWZDaGFuZ2VkKGZvcm1hdCwgbnVtT3V0cHV0QnVmZmVycyk7CiAgICAgRnJhbWVSZW5kZXJUcmFja2VyOjpJbmZvICppbmZvID0gTlVMTDsKIAogICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIgKmJ1ZjsKQEAgLTIyNiw4ICsyNjcsOSBAQAogICAgIFJlY3QgYm91bmRzKG1Dcm9wV2lkdGgsIG1Dcm9wSGVpZ2h0KTsKIAogICAgIHZvaWQgKmRzdDsKLSAgICBDSEVDS19FUSgwLCBtYXBwZXIubG9jaygKLSAgICAgICAgICAgICAgICBidWYtPmhhbmRsZSwgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwgYm91bmRzLCAmZHN0KSk7CisgICAgQ0hFQ0tfRVEoMCwgbWFwcGVyLmxvY2soYnVmLT5oYW5kbGUsCisgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX1NXX1JFQURfTkVWRVIgfCBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX1JBUkVMWSwKKyAgICAgICAgICAgIGJvdW5kcywgJmRzdCkpOwogCiAgICAgLy8gVE9ETyBtb3ZlIHRoZSBvdGhlciBjb252ZXJzaW9ucyBhbHNvIGludG8gQ29sb3JDb252ZXJ0ZXIsIGFuZAogICAgIC8vIGZpeCBjcm9wcGluZyBpc3N1ZXMgKHdoZW4gbUNyb3BMZWZ0L1RvcCAhPSAwIG9yIG1XaWR0aCAhPSBtQ3JvcFdpZHRoKQpAQCAtMjc2LDYgKzMxOCw0NiBAQAogICAgICAgICAgICAgZHN0X3UgKz0gZHN0X2Nfc3RyaWRlOwogICAgICAgICAgICAgZHN0X3YgKz0gZHN0X2Nfc3RyaWRlOwogICAgICAgICB9CisgICAgfSBlbHNlIGlmIChtQ29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjE2KSB7CisgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNfeSA9IChjb25zdCB1aW50MTZfdCAqKWRhdGE7CisgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNfdSA9IChjb25zdCB1aW50MTZfdCAqKWRhdGEgKyBtV2lkdGggKiBtSGVpZ2h0OworICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjX3YgPSBzcmNfdSArIChtV2lkdGggLyAyICogbUhlaWdodCAvIDIpOworCisgICAgICAgIHNyY195ICs9IG1Dcm9wTGVmdCArIG1Dcm9wVG9wICogbVdpZHRoOworICAgICAgICBzcmNfdSArPSAobUNyb3BMZWZ0ICsgbUNyb3BUb3AgKiBtV2lkdGggLyAyKSAvIDI7CisgICAgICAgIHNyY192ICs9IChtQ3JvcExlZnQgKyBtQ3JvcFRvcCAqIG1XaWR0aCAvIDIpIC8gMjsKKworICAgICAgICB1aW50OF90ICpkc3RfeSA9ICh1aW50OF90ICopZHN0OworICAgICAgICBzaXplX3QgZHN0X3lfc2l6ZSA9IGJ1Zi0+c3RyaWRlICogYnVmLT5oZWlnaHQ7CisgICAgICAgIHNpemVfdCBkc3RfY19zdHJpZGUgPSBBTElHTihidWYtPnN0cmlkZSAvIDIsIDE2KTsKKyAgICAgICAgc2l6ZV90IGRzdF9jX3NpemUgPSBkc3RfY19zdHJpZGUgKiBidWYtPmhlaWdodCAvIDI7CisgICAgICAgIHVpbnQ4X3QgKmRzdF92ID0gZHN0X3kgKyBkc3RfeV9zaXplOworICAgICAgICB1aW50OF90ICpkc3RfdSA9IGRzdF92ICsgZHN0X2Nfc2l6ZTsKKworICAgICAgICBkc3RfeSArPSBtQ3JvcFRvcCAqIGJ1Zi0+c3RyaWRlICsgbUNyb3BMZWZ0OworICAgICAgICBkc3RfdiArPSAobUNyb3BUb3AgLyAyKSAqIGRzdF9jX3N0cmlkZSArIG1Dcm9wTGVmdCAvIDI7CisgICAgICAgIGRzdF91ICs9IChtQ3JvcFRvcCAvIDIpICogZHN0X2Nfc3RyaWRlICsgbUNyb3BMZWZ0IC8gMjsKKworICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IG1Dcm9wSGVpZ2h0OyArK3kpIHsKKyAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgbUNyb3BXaWR0aDsgKyt4KSB7CisgICAgICAgICAgICAgICAgZHN0X3lbeF0gPSAodWludDhfdCkoc3JjX3lbeF0gPj4gMik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNyY195ICs9IG1XaWR0aDsKKyAgICAgICAgICAgIGRzdF95ICs9IGJ1Zi0+c3RyaWRlOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCAobUNyb3BIZWlnaHQgKyAxKSAvIDI7ICsreSkgeworICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCAobUNyb3BXaWR0aCArIDEpIC8gMjsgKyt4KSB7CisgICAgICAgICAgICAgICAgZHN0X3VbeF0gPSAodWludDhfdCkoc3JjX3VbeF0gPj4gMik7CisgICAgICAgICAgICAgICAgZHN0X3ZbeF0gPSAodWludDhfdCkoc3JjX3ZbeF0gPj4gMik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNyY191ICs9IG1XaWR0aCAvIDI7CisgICAgICAgICAgICBzcmNfdiArPSBtV2lkdGggLyAyOworICAgICAgICAgICAgZHN0X3UgKz0gZHN0X2Nfc3RyaWRlOworICAgICAgICAgICAgZHN0X3YgKz0gZHN0X2Nfc3RyaWRlOworICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChtQ29sb3JGb3JtYXQgPT0gT01YX1RJX0NPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIKICAgICAgICAgICAgIHx8IG1Db2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcikgewogICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfeSA9IChjb25zdCB1aW50OF90ICopZGF0YTsKQEAgLTM2NSwxMiArNDQ3LDI5IEBACiAgICAgLy8gY29sb3IgY29udmVyc2lvbiB0byBSR0IuIEZvciBub3csIGp1c3QgbWFyayBkYXRhc3BhY2UgZm9yIFlVViByZW5kZXJpbmcuCiAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlOwogICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMigiYW5kcm9pZC5fZGF0YXNwYWNlIiwgKGludDMyX3QgKikmZGF0YVNwYWNlKSAmJiBkYXRhU3BhY2UgIT0gbURhdGFTcGFjZSkgeworICAgICAgICBtRGF0YVNwYWNlID0gZGF0YVNwYWNlOworCisgICAgICAgIGlmIChtQ29udmVydGVyICE9IE5VTEwgJiYgbUNvbnZlcnRlci0+aXNEc3RSR0IoKSkgeworICAgICAgICAgICAgLy8gZ3JhcGhpY3Mgb25seSBzdXBwb3J0cyBmdWxsIHJhbmdlIFJHQi4gQ29sb3JDb252ZXJ0ZXIgc2hvdWxkIGhhdmUKKyAgICAgICAgICAgIC8vIGNvbnZlcnRlZCBhbnkgWVVWIHRvIGZ1bGwgcmFuZ2UuCisgICAgICAgICAgICBkYXRhU3BhY2UgPSAoYW5kcm9pZF9kYXRhc3BhY2UpCisgICAgICAgICAgICAgICAgICAgICgoZGF0YVNwYWNlICYgfkhBTF9EQVRBU1BBQ0VfUkFOR0VfTUFTSykgfCBIQUxfREFUQVNQQUNFX1JBTkdFX0ZVTEwpOworICAgICAgICB9CisKICAgICAgICAgQUxPR0QoInNldHRpbmcgZGF0YXNwYWNlIG9uIG91dHB1dCBzdXJmYWNlIHRvICMleCIsIGRhdGFTcGFjZSk7CiAgICAgICAgIGlmICgoZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19kYXRhX3NwYWNlKG1OYXRpdmVXaW5kb3cuZ2V0KCksIGRhdGFTcGFjZSkpKSB7CiAgICAgICAgICAgICBBTE9HVygiZmFpbGVkIHRvIHNldCBkYXRhc3BhY2Ugb24gc3VyZmFjZSAoJWQpIiwgZXJyKTsKICAgICAgICAgfQotICAgICAgICBtRGF0YVNwYWNlID0gZGF0YVNwYWNlOwogICAgIH0KKyAgICBpZiAoZm9ybWF0LT5jb250YWlucygiaGRyLXN0YXRpYy1pbmZvIikpIHsKKyAgICAgICAgSERSU3RhdGljSW5mbyBpbmZvOworICAgICAgICBpZiAoQ29sb3JVdGlsczo6Z2V0SERSU3RhdGljSW5mb0Zyb21Gb3JtYXQoZm9ybWF0LCAmaW5mbykKKyAgICAgICAgICAgICYmIG1lbWNtcCgmbUhEUlN0YXRpY0luZm8sICZpbmZvLCBzaXplb2YoaW5mbykpKSB7CisgICAgICAgICAgICBzZXROYXRpdmVXaW5kb3dIZHJNZXRhZGF0YShtTmF0aXZlV2luZG93LmdldCgpLCAmaW5mbyk7CisgICAgICAgICAgICBtSERSU3RhdGljSW5mbyA9IGluZm87CisgICAgICAgIH0KKyAgICB9CisKICAgICBpZiAoKGVyciA9IG1OYXRpdmVXaW5kb3ctPnF1ZXVlQnVmZmVyKG1OYXRpdmVXaW5kb3cuZ2V0KCksIGJ1ZiwgLTEpKSAhPSAwKSB7CiAgICAgICAgIEFMT0dXKCJTdXJmYWNlOjpxdWV1ZUJ1ZmZlciByZXR1cm5lZCBlcnJvciAlZCIsIGVycik7CiAgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMi54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYzIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNzgwMTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYzIueG1sCkBAIC0wLDAgKzEsMTkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04IiA/PgorPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8TWVkaWFDb2RlY3M+CisgICAgPEluY2x1ZGUgaHJlZj0ibWVkaWFfY29kZWNzX2dvb2dsZV9jMl9hdWRpby54bWwiIC8+CisgICAgPEluY2x1ZGUgaHJlZj0ibWVkaWFfY29kZWNzX2dvb2dsZV9jMl92aWRlby54bWwiIC8+Cis8L01lZGlhQ29kZWNzPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2MyX2F1ZGlvLnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMl9hdWRpby54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI1NTRhMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMl9hdWRpby54bWwKQEAgLTAsMCArMSw5NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxJbmNsdWRlZD4KKyAgICA8RGVjb2RlcnM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQubXAzLmRlY29kZXIiIHR5cGU9ImF1ZGlvL21wZWciPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwLDExMDI1LDEyMDAwLDE2MDAwLDIyMDUwLDI0MDAwLDMyMDAwLDQ0MTAwLDQ4MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI4MDAwLTMyMDAwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmFtcm5iLmRlY29kZXIiIHR5cGU9ImF1ZGlvLzNncHAiPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMSIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI0NzUwLTEyMjAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuYW1yd2IuZGVjb2RlciIgdHlwZT0iYXVkaW8vYW1yLXdiIj4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjEiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iMTYwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjY2MDAtMjM4NTAiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5hYWMuZGVjb2RlciIgdHlwZT0iYXVkaW8vbXA0YS1sYXRtIj4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iNzM1MCw4MDAwLDExMDI1LDEyMDAwLDE2MDAwLDIyMDUwLDI0MDAwLDMyMDAwLDQ0MTAwLDQ4MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI4MDAwLTk2MDAwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmc3MTEuYWxhdy5kZWNvZGVyIiB0eXBlPSJhdWRpby9nNzExLWFsYXciPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMSIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwLTQ4MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI2NDAwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmc3MTEubWxhdy5kZWNvZGVyIiB0eXBlPSJhdWRpby9nNzExLW1sYXciPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMSIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwLTQ4MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI2NDAwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLnZvcmJpcy5kZWNvZGVyIiB0eXBlPSJhdWRpby92b3JiaXMiPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iOCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwLTk2MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIzMjAwMC01MDAwMDAiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5vcHVzLmRlY29kZXIiIHR5cGU9ImF1ZGlvL29wdXMiPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iOCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI0ODAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iNjAwMC01MTAwMDAiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5yYXcuZGVjb2RlciIgdHlwZT0iYXVkaW8vcmF3Ij4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMC05NjAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0xMDAwMDAwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmZsYWMuZGVjb2RlciIgdHlwZT0iYXVkaW8vZmxhYyI+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSI4IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjEtNjU1MzUwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTIxMDAwMDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgPC9EZWNvZGVycz4KKyAgICA8RW5jb2RlcnM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuYWFjLmVuY29kZXIiIHR5cGU9ImF1ZGlvL21wNGEtbGF0bSI+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSI2IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAsMTEwMjUsMTIwMDAsMTYwMDAsMjIwNTAsMjQwMDAsMzIwMDAsNDQxMDAsNDgwMDAiIC8+CisgICAgICAgICAgICA8IS0tIGFsc28gbWF5IHN1cHBvcnQgNjQwMDAsIDg4MjAwICBhbmQgOTYwMDAgSHogLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjgwMDAtOTYwMDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuYW1ybmIuZW5jb2RlciIgdHlwZT0iYXVkaW8vM2dwcCI+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIxIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjQ3NTAtMTIyMDAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJiaXRyYXRlLW1vZGVzIiB2YWx1ZT0iQ0JSIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuYW1yd2IuZW5jb2RlciIgdHlwZT0iYXVkaW8vYW1yLXdiIj4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjEiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iMTYwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjY2MDAtMjM4NTAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJiaXRyYXRlLW1vZGVzIiB2YWx1ZT0iQ0JSIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuZmxhYy5lbmNvZGVyIiB0eXBlPSJhdWRpby9mbGFjIj4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iMS02NTUzNTAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMjEwMDAwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY29tcGxleGl0eSIgcmFuZ2U9IjAtOCIgIGRlZmF1bHQ9IjUiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJiaXRyYXRlLW1vZGVzIiB2YWx1ZT0iQ1EiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICA8L0VuY29kZXJzPgorPC9JbmNsdWRlZD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMl92aWRlby54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYzJfdmlkZW8ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYjQ1YjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYzJfdmlkZW8ueG1sCkBAIC0wLDAgKzEsMTIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCIgPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPEluY2x1ZGVkPgorICAgIDxEZWNvZGVycz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5tcGVnNC5kZWNvZGVyIiB0eXBlPSJ2aWRlby9tcDR2LWVzIj4KKyAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVTaW1wbGUgOiBMZXZlbDMgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMzUyeDI4OCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMTItMTE4ODAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMzg0MDAwIiAvPgorICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5oMjYzLmRlY29kZXIiIHR5cGU9InZpZGVvLzNncHAiPgorICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZUJhc2VsaW5lIDogTGV2ZWwzMCwgUHJvZmlsZUJhc2VsaW5lIDogTGV2ZWw0NQorICAgICAgICAgICAgICAgICAgICBQcm9maWxlSVNXVjIgOiBMZXZlbDMwLCBQcm9maWxlSVNXVjIgOiBMZXZlbDQ1IC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjM1MngyODgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTM4NDAwMCIgLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuYXZjLmRlY29kZXIiIHR5cGU9InZpZGVvL2F2YyI+CisgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlSGlnaCA6IExldmVsNTIgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iNDA4MHg0MDgwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stY291bnQiIHJhbmdlPSIxLTMyNzY4IiAvPiA8IS0tIG1heCA0MDk2eDIwNDggZXF1aXZhbGVudCAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtMTk2NjA4MCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS00ODAwMDAwMCIgLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuaGV2Yy5kZWNvZGVyIiB0eXBlPSJ2aWRlby9oZXZjIj4KKyAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVNYWluIDogTWFpblRpZXJMZXZlbDUxIC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjQwOTZ4NDA5NiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9Ijh4OCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtMTk2NjA4IiAvPiA8IS0tIG1heCA0MDk2eDMwNzIgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTIwMDAwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMTAwMDAwMDAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLnZwOC5kZWNvZGVyIiB0eXBlPSJ2aWRlby94LXZuZC5vbjIudnA4Ij4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIyMDQ4eDIwNDgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtMTYzODQiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTEwMDAwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtNDAwMDAwMDAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLnZwOS5kZWNvZGVyIiB0eXBlPSJ2aWRlby94LXZuZC5vbjIudnA5Ij4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIyMDQ4eDIwNDgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtMTYzODQiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTUwMDAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS00MDAwMDAwMCIgLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgPC9EZWNvZGVycz4KKworICAgIDxFbmNvZGVycz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5oMjYzLmVuY29kZXIiIHR5cGU9InZpZGVvLzNncHAiPgorICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZUJhc2VsaW5lIDogTGV2ZWw0NSAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjE3NngxNDQiIG1heD0iMTc2eDE0NCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIxNngxNiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0xMjgwMDAiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5hdmMuZW5jb2RlciIgdHlwZT0idmlkZW8vYXZjIj4KKyAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVCYXNlbGluZSA6IExldmVsNDEgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIxNngxNiIgbWF4PSIyMDQ4eDIwNDgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtODE5MiIgLz4gPCEtLSBtYXggMjA0OHgxMDI0IC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMS0yNDU3NjAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMTIwMDAwMDAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJpbnRyYS1yZWZyZXNoIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQubXBlZzQuZW5jb2RlciIgdHlwZT0idmlkZW8vbXA0di1lcyI+CisgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlQ29yZSA6IExldmVsMiAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjE2eDE2IiBtYXg9IjE3NngxNDQiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMTItMTQ4NSIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS02NDAwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLnZwOC5lbmNvZGVyIiB0eXBlPSJ2aWRlby94LXZuZC5vbjIudnA4Ij4KKyAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVNYWluIDogTGV2ZWxfVmVyc2lvbjAtMyAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIyMDQ4eDIwNDgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KKyAgICAgICAgICAgIDwhLS0gMjAxNiBkZXZpY2VzIGNhbiBlbmNvZGUgYXQgYWJvdXQgMTBmcHMgYXQgdGhpcyBibG9jayBjb3VudCAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtMTYzODQiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtNDAwMDAwMDAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJiaXRyYXRlLW1vZGVzIiB2YWx1ZT0iVkJSLENCUiIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLnZwOS5lbmNvZGVyIiB0eXBlPSJ2aWRlby94LXZuZC5vbjIudnA5Ij4KKyAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVNYWluIDogTGV2ZWxfVmVyc2lvbjAtMyAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIyMDQ4eDIwNDgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KKyAgICAgICAgICAgIDwhLS0gMjAxNiBkZXZpY2VzIGNhbiBlbmNvZGUgYXQgYWJvdXQgOGZwcyBhdCB0aGlzIGJsb2NrIGNvdW50IC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLWNvdW50IiByYW5nZT0iMS0zNjAwIiAvPiA8IS0tIG1heCAxMjgweDcyMCAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS00MDAwMDAwMCIgLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImJpdHJhdGUtbW9kZXMiIHZhbHVlPSJWQlIsQ0JSIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgPC9FbmNvZGVycz4KKzwvSW5jbHVkZWQ+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9leHBvcnRzLmxkcyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2V4cG9ydHMubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZGZjNDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9leHBvcnRzLmxkcwpAQCAtMCwwICsxLDUwOCBAQAoreworICAgIGdsb2JhbDoKKyAgICAgICAgKjsKKyAgICBsb2NhbDoKKyAgICAgICAgX1pON2FuZHJvaWQ0RVNEUyo7CisgICAgICAgIF9aTks3YW5kcm9pZDRFU0RTKjsKKyAgICAgICAgX1pON2FuZHJvaWQxNENvbG9yQ29udmVydGVyKjsKKyAgICAgICAgX1pOSzdhbmRyb2lkMTRDb2xvckNvbnZlcnRlcio7CisgICAgICAgIF9aTjdhbmRyb2lkMTZTb2Z0d2FyZVJlbmRlcmVyKjsKKyAgICAgICAgQUJHUlRvQVJHQjsKKyAgICAgICAgQUJHUlRvSTQyMDsKKyAgICAgICAgQUJHUlRvVVZSb3dfQW55X05FT047CisgICAgICAgIEFCR1JUb1VWUm93X0M7CisgICAgICAgIEFCR1JUb1VWUm93X05FT047CisgICAgICAgIEFCR1JUb1lSb3dfQW55X05FT047CisgICAgICAgIEFCR1JUb1lSb3dfQzsKKyAgICAgICAgQUJHUlRvWVJvd19ORU9OOworICAgICAgICBBbmRyb2lkNDIwVG9JNDIwOworICAgICAgICBBUkdCMTU1NVRvQVJHQjsKKyAgICAgICAgQVJHQjE1NTVUb0FSR0JSb3dfQW55X05FT047CisgICAgICAgIEFSR0IxNTU1VG9BUkdCUm93X0M7CisgICAgICAgIEFSR0IxNTU1VG9BUkdCUm93X05FT047CisgICAgICAgIEFSR0IxNTU1VG9JNDIwOworICAgICAgICBBUkdCMTU1NVRvVVZSb3dfQW55X05FT047CisgICAgICAgIEFSR0IxNTU1VG9VVlJvd19DOworICAgICAgICBBUkdCMTU1NVRvVVZSb3dfTkVPTjsKKyAgICAgICAgQVJHQjE1NTVUb1lSb3dfQW55X05FT047CisgICAgICAgIEFSR0IxNTU1VG9ZUm93X0M7CisgICAgICAgIEFSR0IxNTU1VG9ZUm93X05FT047CisgICAgICAgIEFSR0I0NDQ0VG9BUkdCOworICAgICAgICBBUkdCNDQ0NFRvQVJHQlJvd19BbnlfTkVPTjsKKyAgICAgICAgQVJHQjQ0NDRUb0FSR0JSb3dfQzsKKyAgICAgICAgQVJHQjQ0NDRUb0FSR0JSb3dfTkVPTjsKKyAgICAgICAgQVJHQjQ0NDRUb0k0MjA7CisgICAgICAgIEFSR0I0NDQ0VG9VVlJvd19BbnlfTkVPTjsKKyAgICAgICAgQVJHQjQ0NDRUb1VWUm93X0M7CisgICAgICAgIEFSR0I0NDQ0VG9VVlJvd19ORU9OOworICAgICAgICBBUkdCNDQ0NFRvWVJvd19BbnlfTkVPTjsKKyAgICAgICAgQVJHQjQ0NDRUb1lSb3dfQzsKKyAgICAgICAgQVJHQjQ0NDRUb1lSb3dfTkVPTjsKKyAgICAgICAgQVJHQkFkZDsKKyAgICAgICAgQVJHQkFkZFJvd19BbnlfTkVPTjsKKyAgICAgICAgQVJHQkFkZFJvd19DOworICAgICAgICBBUkdCQWRkUm93X05FT047CisgICAgICAgIEFSR0JBZmZpbmVSb3dfQzsKKyAgICAgICAgQVJHQkF0dGVudWF0ZTsKKyAgICAgICAgQVJHQkF0dGVudWF0ZVJvd19BbnlfTkVPTjsKKyAgICAgICAgQVJHQkF0dGVudWF0ZVJvd19DOworICAgICAgICBBUkdCQXR0ZW51YXRlUm93X05FT047CisgICAgICAgIEFSR0JCbGVuZDsKKyAgICAgICAgQVJHQkJsZW5kUm93X0M7CisgICAgICAgIEFSR0JCbGVuZFJvd19ORU9OOworICAgICAgICBBUkdCQmx1cjsKKyAgICAgICAgQVJHQkNvbG9yTWF0cml4OworICAgICAgICBBUkdCQ29sb3JNYXRyaXhSb3dfQzsKKyAgICAgICAgQVJHQkNvbG9yTWF0cml4Um93X05FT047CisgICAgICAgIEFSR0JDb2xvclRhYmxlOworICAgICAgICBBUkdCQ29sb3JUYWJsZVJvd19DOworICAgICAgICBBUkdCQ29tcHV0ZUN1bXVsYXRpdmVTdW07CisgICAgICAgIEFSR0JDb3B5OworICAgICAgICBBUkdCQ29weUFscGhhOworICAgICAgICBBUkdCQ29weUFscGhhUm93X0M7CisgICAgICAgIEFSR0JDb3B5WVRvQWxwaGE7CisgICAgICAgIEFSR0JDb3B5WVRvQWxwaGFSb3dfQzsKKyAgICAgICAgQVJHQkV4dHJhY3RBbHBoYTsKKyAgICAgICAgQVJHQkV4dHJhY3RBbHBoYVJvd19BbnlfTkVPTjsKKyAgICAgICAgQVJHQkV4dHJhY3RBbHBoYVJvd19DOworICAgICAgICBBUkdCRXh0cmFjdEFscGhhUm93X05FT047CisgICAgICAgIEFSR0JHcmF5OworICAgICAgICBBUkdCR3JheVJvd19DOworICAgICAgICBBUkdCR3JheVJvd19ORU9OOworICAgICAgICBBUkdCR3JheVRvOworICAgICAgICBBUkdCSW50ZXJwb2xhdGU7CisgICAgICAgIEFSR0JMdW1hQ29sb3JUYWJsZTsKKyAgICAgICAgQVJHQkx1bWFDb2xvclRhYmxlUm93X0M7CisgICAgICAgIEFSR0JNaXJyb3I7CisgICAgICAgIEFSR0JNaXJyb3JSb3dfQW55X05FT047CisgICAgICAgIEFSR0JNaXJyb3JSb3dfQzsKKyAgICAgICAgQVJHQk1pcnJvclJvd19ORU9OOworICAgICAgICBBUkdCTXVsdGlwbHk7CisgICAgICAgIEFSR0JNdWx0aXBseVJvd19BbnlfTkVPTjsKKyAgICAgICAgQVJHQk11bHRpcGx5Um93X0M7CisgICAgICAgIEFSR0JNdWx0aXBseVJvd19ORU9OOworICAgICAgICBBUkdCUG9seW5vbWlhbDsKKyAgICAgICAgQVJHQlBvbHlub21pYWxSb3dfQzsKKyAgICAgICAgQVJHQlF1YW50aXplOworICAgICAgICBBUkdCUXVhbnRpemVSb3dfQzsKKyAgICAgICAgQVJHQlF1YW50aXplUm93X05FT047CisgICAgICAgIEFSR0JSZWN0OworICAgICAgICBBUkdCU2VwaWE7CisgICAgICAgIEFSR0JTZXBpYVJvd19DOworICAgICAgICBBUkdCU2VwaWFSb3dfTkVPTjsKKyAgICAgICAgQVJHQlNldFJvd19BbnlfTkVPTjsKKyAgICAgICAgQVJHQlNldFJvd19DOworICAgICAgICBBUkdCU2V0Um93X05FT047CisgICAgICAgIEFSR0JTaGFkZTsKKyAgICAgICAgQVJHQlNoYWRlUm93X0M7CisgICAgICAgIEFSR0JTaGFkZVJvd19ORU9OOworICAgICAgICBBUkdCU2h1ZmZsZTsKKyAgICAgICAgQVJHQlNodWZmbGVSb3dfQW55X05FT047CisgICAgICAgIEFSR0JTaHVmZmxlUm93X0M7CisgICAgICAgIEFSR0JTaHVmZmxlUm93X05FT047CisgICAgICAgIEFSR0JTb2JlbDsKKyAgICAgICAgQVJHQlNvYmVsVG9QbGFuZTsKKyAgICAgICAgQVJHQlNvYmVsWFk7CisgICAgICAgIEFSR0JTdWJ0cmFjdDsKKyAgICAgICAgQVJHQlN1YnRyYWN0Um93X0FueV9ORU9OOworICAgICAgICBBUkdCU3VidHJhY3RSb3dfQzsKKyAgICAgICAgQVJHQlN1YnRyYWN0Um93X05FT047CisgICAgICAgIEFSR0JUb0FCR1I7CisgICAgICAgIEFSR0JUb0FSR0IxNTU1Um93X0FueV9ORU9OOworICAgICAgICBBUkdCVG9BUkdCMTU1NVJvd19DOworICAgICAgICBBUkdCVG9BUkdCMTU1NVJvd19ORU9OOworICAgICAgICBBUkdCVG9BUkdCNDQ0NFJvd19BbnlfTkVPTjsKKyAgICAgICAgQVJHQlRvQVJHQjQ0NDRSb3dfQzsKKyAgICAgICAgQVJHQlRvQVJHQjQ0NDRSb3dfTkVPTjsKKyAgICAgICAgQVJHQlRvQkdSQTsKKyAgICAgICAgQVJHQlRvSTQyMDsKKyAgICAgICAgQVJHQlRvUkFXUm93X0FueV9ORU9OOworICAgICAgICBBUkdCVG9SQVdSb3dfQzsKKyAgICAgICAgQVJHQlRvUkFXUm93X05FT047CisgICAgICAgIEFSR0JUb1JHQjI0Um93X0FueV9ORU9OOworICAgICAgICBBUkdCVG9SR0IyNFJvd19DOworICAgICAgICBBUkdCVG9SR0IyNFJvd19ORU9OOworICAgICAgICBBUkdCVG9SR0I1NjVEaXRoZXJSb3dfQW55X05FT047CisgICAgICAgIEFSR0JUb1JHQjU2NURpdGhlclJvd19DOworICAgICAgICBBUkdCVG9SR0I1NjVEaXRoZXJSb3dfTkVPTjsKKyAgICAgICAgQVJHQlRvUkdCNTY1Um93X0FueV9ORU9OOworICAgICAgICBBUkdCVG9SR0I1NjVSb3dfQzsKKyAgICAgICAgQVJHQlRvUkdCNTY1Um93X05FT047CisgICAgICAgIEFSR0JUb1VWNDQ0Um93X0FueV9ORU9OOworICAgICAgICBBUkdCVG9VVjQ0NFJvd19DOworICAgICAgICBBUkdCVG9VVjQ0NFJvd19ORU9OOworICAgICAgICBBUkdCVG9VVkpSb3dfQW55X05FT047CisgICAgICAgIEFSR0JUb1VWSlJvd19DOworICAgICAgICBBUkdCVG9VVkpSb3dfTkVPTjsKKyAgICAgICAgQVJHQlRvVVZSb3dfQW55X05FT047CisgICAgICAgIEFSR0JUb1VWUm93X0M7CisgICAgICAgIEFSR0JUb1VWUm93X05FT047CisgICAgICAgIEFSR0JUb1lKUm93X0FueV9ORU9OOworICAgICAgICBBUkdCVG9ZSlJvd19DOworICAgICAgICBBUkdCVG9ZSlJvd19ORU9OOworICAgICAgICBBUkdCVG9ZUm93X0FueV9ORU9OOworICAgICAgICBBUkdCVG9ZUm93X0M7CisgICAgICAgIEFSR0JUb1lSb3dfTkVPTjsKKyAgICAgICAgQVJHQlVuYXR0ZW51YXRlOworICAgICAgICBBUkdCVW5hdHRlbnVhdGVSb3dfQzsKKyAgICAgICAgQXJtQ3B1Q2FwczsKKyAgICAgICAgQkdSQVRvQVJHQjsKKyAgICAgICAgQkdSQVRvSTQyMDsKKyAgICAgICAgQkdSQVRvVVZSb3dfQW55X05FT047CisgICAgICAgIEJHUkFUb1VWUm93X0M7CisgICAgICAgIEJHUkFUb1VWUm93X05FT047CisgICAgICAgIEJHUkFUb1lSb3dfQW55X05FT047CisgICAgICAgIEJHUkFUb1lSb3dfQzsKKyAgICAgICAgQkdSQVRvWVJvd19ORU9OOworICAgICAgICBCbGVuZFBsYW5lOworICAgICAgICBCbGVuZFBsYW5lUm93X0M7CisgICAgICAgIENhbm9uaWNhbEZvdXJDQzsKKyAgICAgICAgQ29tcHV0ZUN1bXVsYXRpdmVTdW1Sb3dfQzsKKyAgICAgICAgQ29udmVydEZyb21JNDIwOworICAgICAgICBDb3B5UGxhbmU7CisgICAgICAgIENvcHlQbGFuZV8xNjsKKyAgICAgICAgQ29weVJvd18xNl9DOworICAgICAgICBDb3B5Um93X0FueV9ORU9OOworICAgICAgICBDb3B5Um93X0M7CisgICAgICAgIENvcHlSb3dfTkVPTjsKKyAgICAgICAgQ3B1SWQ7CisgICAgICAgIGNwdV9pbmZvXzsKKyAgICAgICAgQ3VtdWxhdGl2ZVN1bVRvQXZlcmFnZVJvd19DOworICAgICAgICBGaXhlZERpdjFfQzsKKyAgICAgICAgRml4ZWREaXZfQzsKKyAgICAgICAgZml4ZWRfaW52dGJsODsKKyAgICAgICAgR2V0QVJHQkJsZW5kOworICAgICAgICBINDIwVG9BQkdSOworICAgICAgICBINDIwVG9BUkdCOworICAgICAgICBINDIyVG9BQkdSOworICAgICAgICBINDIyVG9BUkdCOworICAgICAgICBIYWxmRmxvYXQxUm93X0FueV9ORU9OOworICAgICAgICBIYWxmRmxvYXQxUm93X05FT047CisgICAgICAgIEhhbGZGbG9hdFBsYW5lOworICAgICAgICBIYWxmRmxvYXRSb3dfQW55X05FT047CisgICAgICAgIEhhbGZGbG9hdFJvd19DOworICAgICAgICBIYWxmRmxvYXRSb3dfTkVPTjsKKyAgICAgICAgSTQwMENvcHk7CisgICAgICAgIEk0MDBNaXJyb3I7CisgICAgICAgIEk0MDBUb0FSR0I7CisgICAgICAgIEk0MDBUb0FSR0JSb3dfQW55X05FT047CisgICAgICAgIEk0MDBUb0FSR0JSb3dfQzsKKyAgICAgICAgSTQwMFRvQVJHQlJvd19ORU9OOworICAgICAgICBJNDAwVG9JNDAwOworICAgICAgICBJNDAwVG9JNDIwOworICAgICAgICBJNDIwQWxwaGFUb0FCR1I7CisgICAgICAgIEk0MjBBbHBoYVRvQVJHQjsKKyAgICAgICAgSTQyMEJsZW5kOworICAgICAgICBJNDIwQ29weTsKKyAgICAgICAgSTQyMEludGVycG9sYXRlOworICAgICAgICBJNDIwTWlycm9yOworICAgICAgICBJNDIwUmVjdDsKKyAgICAgICAgSTQyMFNjYWxlOworICAgICAgICBJNDIwU2NhbGVfMTY7CisgICAgICAgIEk0MjBUb0FCR1I7CisgICAgICAgIEk0MjBUb0FSR0I7CisgICAgICAgIEk0MjBUb0FSR0IxNTU1OworICAgICAgICBJNDIwVG9BUkdCNDQ0NDsKKyAgICAgICAgSTQyMFRvQkdSQTsKKyAgICAgICAgSTQyMFRvSTQwMDsKKyAgICAgICAgSTQyMFRvSTQyMjsKKyAgICAgICAgSTQyMFRvSTQ0NDsKKyAgICAgICAgSTQyMFRvTlYxMjsKKyAgICAgICAgSTQyMFRvTlYyMTsKKyAgICAgICAgSTQyMFRvUkFXOworICAgICAgICBJNDIwVG9SR0IyNDsKKyAgICAgICAgSTQyMFRvUkdCNTY1OworICAgICAgICBJNDIwVG9SR0I1NjVEaXRoZXI7CisgICAgICAgIEk0MjBUb1JHQkE7CisgICAgICAgIEk0MjBUb1VZVlk7CisgICAgICAgIEk0MjBUb1lVWTI7CisgICAgICAgIEk0MjJBbHBoYVRvQVJHQlJvd19BbnlfTkVPTjsKKyAgICAgICAgSTQyMkFscGhhVG9BUkdCUm93X0M7CisgICAgICAgIEk0MjJBbHBoYVRvQVJHQlJvd19ORU9OOworICAgICAgICBJNDIyQ29weTsKKyAgICAgICAgSTQyMlRvQUJHUjsKKyAgICAgICAgSTQyMlRvQVJHQjsKKyAgICAgICAgSTQyMlRvQVJHQjE1NTVSb3dfQW55X05FT047CisgICAgICAgIEk0MjJUb0FSR0IxNTU1Um93X0M7CisgICAgICAgIEk0MjJUb0FSR0IxNTU1Um93X05FT047CisgICAgICAgIEk0MjJUb0FSR0I0NDQ0Um93X0FueV9ORU9OOworICAgICAgICBJNDIyVG9BUkdCNDQ0NFJvd19DOworICAgICAgICBJNDIyVG9BUkdCNDQ0NFJvd19ORU9OOworICAgICAgICBJNDIyVG9BUkdCUm93X0FueV9ORU9OOworICAgICAgICBJNDIyVG9BUkdCUm93X0M7CisgICAgICAgIEk0MjJUb0FSR0JSb3dfTkVPTjsKKyAgICAgICAgSTQyMlRvQkdSQTsKKyAgICAgICAgSTQyMlRvSTQyMDsKKyAgICAgICAgSTQyMlRvUkdCMjRSb3dfQW55X05FT047CisgICAgICAgIEk0MjJUb1JHQjI0Um93X0M7CisgICAgICAgIEk0MjJUb1JHQjI0Um93X05FT047CisgICAgICAgIEk0MjJUb1JHQjU2NTsKKyAgICAgICAgSTQyMlRvUkdCNTY1Um93X0FueV9ORU9OOworICAgICAgICBJNDIyVG9SR0I1NjVSb3dfQzsKKyAgICAgICAgSTQyMlRvUkdCNTY1Um93X05FT047CisgICAgICAgIEk0MjJUb1JHQkE7CisgICAgICAgIEk0MjJUb1JHQkFSb3dfQW55X05FT047CisgICAgICAgIEk0MjJUb1JHQkFSb3dfQzsKKyAgICAgICAgSTQyMlRvUkdCQVJvd19ORU9OOworICAgICAgICBJNDIyVG9VWVZZOworICAgICAgICBJNDIyVG9VWVZZUm93X0FueV9ORU9OOworICAgICAgICBJNDIyVG9VWVZZUm93X0M7CisgICAgICAgIEk0MjJUb1VZVllSb3dfTkVPTjsKKyAgICAgICAgSTQyMlRvWVVZMjsKKyAgICAgICAgSTQyMlRvWVVZMlJvd19BbnlfTkVPTjsKKyAgICAgICAgSTQyMlRvWVVZMlJvd19DOworICAgICAgICBJNDIyVG9ZVVkyUm93X05FT047CisgICAgICAgIEk0NDRDb3B5OworICAgICAgICBJNDQ0VG9BQkdSOworICAgICAgICBJNDQ0VG9BUkdCOworICAgICAgICBJNDQ0VG9BUkdCUm93X0FueV9ORU9OOworICAgICAgICBJNDQ0VG9BUkdCUm93X0M7CisgICAgICAgIEk0NDRUb0FSR0JSb3dfTkVPTjsKKyAgICAgICAgSTQ0NFRvSTQyMDsKKyAgICAgICAgSW5pdENwdUZsYWdzOworICAgICAgICBJbnRlcnBvbGF0ZVBsYW5lOworICAgICAgICBJbnRlcnBvbGF0ZVJvd18xNl9DOworICAgICAgICBJbnRlcnBvbGF0ZVJvd19BbnlfTkVPTjsKKyAgICAgICAgSW50ZXJwb2xhdGVSb3dfQzsKKyAgICAgICAgSW50ZXJwb2xhdGVSb3dfTkVPTjsKKyAgICAgICAgSjQwMFRvQVJHQjsKKyAgICAgICAgSjQwMFRvQVJHQlJvd19BbnlfTkVPTjsKKyAgICAgICAgSjQwMFRvQVJHQlJvd19DOworICAgICAgICBKNDAwVG9BUkdCUm93X05FT047CisgICAgICAgIEo0MjBUb0FCR1I7CisgICAgICAgIEo0MjBUb0FSR0I7CisgICAgICAgIEo0MjJUb0FCR1I7CisgICAgICAgIEo0MjJUb0FSR0I7CisgICAgICAgIEo0NDRUb0FSR0I7CisgICAgICAgIGtZdXZINzA5Q29uc3RhbnRzOworICAgICAgICBrWXV2STYwMUNvbnN0YW50czsKKyAgICAgICAga1l1dkpQRUdDb25zdGFudHM7CisgICAgICAgIGtZdnVINzA5Q29uc3RhbnRzOworICAgICAgICBrWXZ1STYwMUNvbnN0YW50czsKKyAgICAgICAga1l2dUpQRUdDb25zdGFudHM7CisgICAgICAgIE00MjBUb0FSR0I7CisgICAgICAgIE00MjBUb0k0MjA7CisgICAgICAgIE1hc2tDcHVGbGFnczsKKyAgICAgICAgTWVyZ2VVVlBsYW5lOworICAgICAgICBNZXJnZVVWUm93X0FueV9ORU9OOworICAgICAgICBNZXJnZVVWUm93X0M7CisgICAgICAgIE1lcmdlVVZSb3dfTkVPTjsKKyAgICAgICAgTWlwc0NwdUNhcHM7CisgICAgICAgIE1pcnJvclBsYW5lOworICAgICAgICBNaXJyb3JSb3dfQW55X05FT047CisgICAgICAgIE1pcnJvclJvd19DOworICAgICAgICBNaXJyb3JSb3dfTkVPTjsKKyAgICAgICAgTWlycm9yVVZSb3dfQzsKKyAgICAgICAgTWlycm9yVVZSb3dfTkVPTjsKKyAgICAgICAgTlYxMlRvQVJHQlJvd19BbnlfTkVPTjsKKyAgICAgICAgTlYxMlRvQVJHQlJvd19DOworICAgICAgICBOVjEyVG9BUkdCUm93X05FT047CisgICAgICAgIE5WMTJUb0k0MjA7CisgICAgICAgIE5WMTJUb1JHQjU2NTsKKyAgICAgICAgTlYxMlRvUkdCNTY1Um93X0FueV9ORU9OOworICAgICAgICBOVjEyVG9SR0I1NjVSb3dfQzsKKyAgICAgICAgTlYxMlRvUkdCNTY1Um93X05FT047CisgICAgICAgIE5WMjFUb0FSR0I7CisgICAgICAgIE5WMjFUb0FSR0JSb3dfQW55X05FT047CisgICAgICAgIE5WMjFUb0FSR0JSb3dfQzsKKyAgICAgICAgTlYyMVRvQVJHQlJvd19ORU9OOworICAgICAgICBOVjIxVG9JNDIwOworICAgICAgICBSQVdUb0FSR0I7CisgICAgICAgIFJBV1RvQVJHQlJvd19BbnlfTkVPTjsKKyAgICAgICAgUkFXVG9BUkdCUm93X0M7CisgICAgICAgIFJBV1RvQVJHQlJvd19ORU9OOworICAgICAgICBSQVdUb0k0MjA7CisgICAgICAgIFJBV1RvUkdCMjQ7CisgICAgICAgIFJBV1RvUkdCMjRSb3dfQW55X05FT047CisgICAgICAgIFJBV1RvUkdCMjRSb3dfQzsKKyAgICAgICAgUkFXVG9SR0IyNFJvd19ORU9OOworICAgICAgICBSQVdUb1VWUm93X0FueV9ORU9OOworICAgICAgICBSQVdUb1VWUm93X0M7CisgICAgICAgIFJBV1RvVVZSb3dfTkVPTjsKKyAgICAgICAgUkFXVG9ZUm93X0FueV9ORU9OOworICAgICAgICBSQVdUb1lSb3dfQzsKKyAgICAgICAgUkFXVG9ZUm93X05FT047CisgICAgICAgIFJHQjI0VG9BUkdCOworICAgICAgICBSR0IyNFRvQVJHQlJvd19BbnlfTkVPTjsKKyAgICAgICAgUkdCMjRUb0FSR0JSb3dfQzsKKyAgICAgICAgUkdCMjRUb0FSR0JSb3dfTkVPTjsKKyAgICAgICAgUkdCMjRUb0k0MjA7CisgICAgICAgIFJHQjI0VG9VVlJvd19BbnlfTkVPTjsKKyAgICAgICAgUkdCMjRUb1VWUm93X0M7CisgICAgICAgIFJHQjI0VG9VVlJvd19ORU9OOworICAgICAgICBSR0IyNFRvWVJvd19BbnlfTkVPTjsKKyAgICAgICAgUkdCMjRUb1lSb3dfQzsKKyAgICAgICAgUkdCMjRUb1lSb3dfTkVPTjsKKyAgICAgICAgUkdCNTY1VG9BUkdCOworICAgICAgICBSR0I1NjVUb0FSR0JSb3dfQW55X05FT047CisgICAgICAgIFJHQjU2NVRvQVJHQlJvd19DOworICAgICAgICBSR0I1NjVUb0FSR0JSb3dfTkVPTjsKKyAgICAgICAgUkdCNTY1VG9JNDIwOworICAgICAgICBSR0I1NjVUb1VWUm93X0FueV9ORU9OOworICAgICAgICBSR0I1NjVUb1VWUm93X0M7CisgICAgICAgIFJHQjU2NVRvVVZSb3dfTkVPTjsKKyAgICAgICAgUkdCNTY1VG9ZUm93X0FueV9ORU9OOworICAgICAgICBSR0I1NjVUb1lSb3dfQzsKKyAgICAgICAgUkdCNTY1VG9ZUm93X05FT047CisgICAgICAgIFJHQkFUb0FSR0I7CisgICAgICAgIFJHQkFUb0k0MjA7CisgICAgICAgIFJHQkFUb1VWUm93X0FueV9ORU9OOworICAgICAgICBSR0JBVG9VVlJvd19DOworICAgICAgICBSR0JBVG9VVlJvd19ORU9OOworICAgICAgICBSR0JBVG9ZUm93X0FueV9ORU9OOworICAgICAgICBSR0JBVG9ZUm93X0M7CisgICAgICAgIFJHQkFUb1lSb3dfTkVPTjsKKyAgICAgICAgUkdCQ29sb3JNYXRyaXg7CisgICAgICAgIFJHQkNvbG9yVGFibGU7CisgICAgICAgIFJHQkNvbG9yVGFibGVSb3dfQzsKKyAgICAgICAgU2NhbGU7CisgICAgICAgIFNjYWxlQWRkUm93XzE2X0M7CisgICAgICAgIFNjYWxlQWRkUm93X0M7CisgICAgICAgIFNjYWxlQWRkUm93c19ORU9OOworICAgICAgICBTY2FsZUFSR0JDb2xzNjRfQzsKKyAgICAgICAgU2NhbGVBUkdCQ29sc19BbnlfTkVPTjsKKyAgICAgICAgU2NhbGVBUkdCQ29sc19DOworICAgICAgICBTY2FsZUFSR0JDb2xzX05FT047CisgICAgICAgIFNjYWxlQVJHQkNvbHNVcDJfQzsKKyAgICAgICAgU2NhbGVBUkdCRmlsdGVyQ29sczY0X0M7CisgICAgICAgIFNjYWxlQVJHQkZpbHRlckNvbHNfQW55X05FT047CisgICAgICAgIFNjYWxlQVJHQkZpbHRlckNvbHNfQzsKKyAgICAgICAgU2NhbGVBUkdCRmlsdGVyQ29sc19ORU9OOworICAgICAgICBTY2FsZUFSR0JSb3dEb3duMl9BbnlfTkVPTjsKKyAgICAgICAgU2NhbGVBUkdCUm93RG93bjJCb3hfQW55X05FT047CisgICAgICAgIFNjYWxlQVJHQlJvd0Rvd24yQm94X0M7CisgICAgICAgIFNjYWxlQVJHQlJvd0Rvd24yQm94X05FT047CisgICAgICAgIFNjYWxlQVJHQlJvd0Rvd24yX0M7CisgICAgICAgIFNjYWxlQVJHQlJvd0Rvd24yTGluZWFyX0FueV9ORU9OOworICAgICAgICBTY2FsZUFSR0JSb3dEb3duMkxpbmVhcl9DOworICAgICAgICBTY2FsZUFSR0JSb3dEb3duMkxpbmVhcl9ORU9OOworICAgICAgICBTY2FsZUFSR0JSb3dEb3duMl9ORU9OOworICAgICAgICBTY2FsZUFSR0JSb3dEb3duRXZlbl9BbnlfTkVPTjsKKyAgICAgICAgU2NhbGVBUkdCUm93RG93bkV2ZW5Cb3hfQW55X05FT047CisgICAgICAgIFNjYWxlQVJHQlJvd0Rvd25FdmVuQm94X0M7CisgICAgICAgIFNjYWxlQVJHQlJvd0Rvd25FdmVuQm94X05FT047CisgICAgICAgIFNjYWxlQVJHQlJvd0Rvd25FdmVuX0M7CisgICAgICAgIFNjYWxlQVJHQlJvd0Rvd25FdmVuX05FT047CisgICAgICAgIFNjYWxlQ29sc18xNl9DOworICAgICAgICBTY2FsZUNvbHNfQzsKKyAgICAgICAgU2NhbGVDb2xzVXAyXzE2X0M7CisgICAgICAgIFNjYWxlQ29sc1VwMl9DOworICAgICAgICBTY2FsZUZpbHRlckNvbHNfMTZfQzsKKyAgICAgICAgU2NhbGVGaWx0ZXJDb2xzNjRfMTZfQzsKKyAgICAgICAgU2NhbGVGaWx0ZXJDb2xzNjRfQzsKKyAgICAgICAgU2NhbGVGaWx0ZXJDb2xzX0FueV9ORU9OOworICAgICAgICBTY2FsZUZpbHRlckNvbHNfQzsKKyAgICAgICAgU2NhbGVGaWx0ZXJDb2xzX05FT047CisgICAgICAgIFNjYWxlRmlsdGVyUmVkdWNlOworICAgICAgICBTY2FsZUZpbHRlclJvd3NfTkVPTjsKKyAgICAgICAgU2NhbGVPZmZzZXQ7CisgICAgICAgIFNjYWxlUGxhbmU7CisgICAgICAgIFNjYWxlUGxhbmVfMTY7CisgICAgICAgIFNjYWxlUGxhbmVCaWxpbmVhckRvd247CisgICAgICAgIFNjYWxlUGxhbmVCaWxpbmVhckRvd25fMTY7CisgICAgICAgIFNjYWxlUGxhbmVCaWxpbmVhclVwOworICAgICAgICBTY2FsZVBsYW5lQmlsaW5lYXJVcF8xNjsKKyAgICAgICAgU2NhbGVQbGFuZVZlcnRpY2FsOworICAgICAgICBTY2FsZVBsYW5lVmVydGljYWxfMTY7CisgICAgICAgIFNjYWxlUm93RG93bjJfMTZfQzsKKyAgICAgICAgU2NhbGVSb3dEb3duMl9BbnlfTkVPTjsKKyAgICAgICAgU2NhbGVSb3dEb3duMkJveF8xNl9DOworICAgICAgICBTY2FsZVJvd0Rvd24yQm94X0FueV9ORU9OOworICAgICAgICBTY2FsZVJvd0Rvd24yQm94X0M7CisgICAgICAgIFNjYWxlUm93RG93bjJCb3hfTkVPTjsKKyAgICAgICAgU2NhbGVSb3dEb3duMkJveF9PZGRfQzsKKyAgICAgICAgU2NhbGVSb3dEb3duMkJveF9PZGRfTkVPTjsKKyAgICAgICAgU2NhbGVSb3dEb3duMl9DOworICAgICAgICBTY2FsZVJvd0Rvd24yTGluZWFyXzE2X0M7CisgICAgICAgIFNjYWxlUm93RG93bjJMaW5lYXJfQW55X05FT047CisgICAgICAgIFNjYWxlUm93RG93bjJMaW5lYXJfQzsKKyAgICAgICAgU2NhbGVSb3dEb3duMkxpbmVhcl9ORU9OOworICAgICAgICBTY2FsZVJvd0Rvd24yX05FT047CisgICAgICAgIFNjYWxlUm93RG93bjM0XzBfQm94XzE2X0M7CisgICAgICAgIFNjYWxlUm93RG93bjM0XzBfQm94X0FueV9ORU9OOworICAgICAgICBTY2FsZVJvd0Rvd24zNF8wX0JveF9DOworICAgICAgICBTY2FsZVJvd0Rvd24zNF8wX0JveF9ORU9OOworICAgICAgICBTY2FsZVJvd0Rvd24zNF8xNl9DOworICAgICAgICBTY2FsZVJvd0Rvd24zNF8xX0JveF8xNl9DOworICAgICAgICBTY2FsZVJvd0Rvd24zNF8xX0JveF9BbnlfTkVPTjsKKyAgICAgICAgU2NhbGVSb3dEb3duMzRfMV9Cb3hfQzsKKyAgICAgICAgU2NhbGVSb3dEb3duMzRfMV9Cb3hfTkVPTjsKKyAgICAgICAgU2NhbGVSb3dEb3duMzRfQW55X05FT047CisgICAgICAgIFNjYWxlUm93RG93bjM0X0M7CisgICAgICAgIFNjYWxlUm93RG93bjM0X05FT047CisgICAgICAgIFNjYWxlUm93RG93bjM4XzE2X0M7CisgICAgICAgIFNjYWxlUm93RG93bjM4XzJfQm94XzE2X0M7CisgICAgICAgIFNjYWxlUm93RG93bjM4XzJfQm94X0FueV9ORU9OOworICAgICAgICBTY2FsZVJvd0Rvd24zOF8yX0JveF9DOworICAgICAgICBTY2FsZVJvd0Rvd24zOF8yX0JveF9ORU9OOworICAgICAgICBTY2FsZVJvd0Rvd24zOF8zX0JveF8xNl9DOworICAgICAgICBTY2FsZVJvd0Rvd24zOF8zX0JveF9BbnlfTkVPTjsKKyAgICAgICAgU2NhbGVSb3dEb3duMzhfM19Cb3hfQzsKKyAgICAgICAgU2NhbGVSb3dEb3duMzhfM19Cb3hfTkVPTjsKKyAgICAgICAgU2NhbGVSb3dEb3duMzhfQW55X05FT047CisgICAgICAgIFNjYWxlUm93RG93bjM4X0M7CisgICAgICAgIFNjYWxlUm93RG93bjM4X05FT047CisgICAgICAgIFNjYWxlUm93RG93bjRfMTZfQzsKKyAgICAgICAgU2NhbGVSb3dEb3duNF9BbnlfTkVPTjsKKyAgICAgICAgU2NhbGVSb3dEb3duNEJveF8xNl9DOworICAgICAgICBTY2FsZVJvd0Rvd240Qm94X0FueV9ORU9OOworICAgICAgICBTY2FsZVJvd0Rvd240Qm94X0M7CisgICAgICAgIFNjYWxlUm93RG93bjRCb3hfTkVPTjsKKyAgICAgICAgU2NhbGVSb3dEb3duNF9DOworICAgICAgICBTY2FsZVJvd0Rvd240X05FT047CisgICAgICAgIFNjYWxlU2xvcGU7CisgICAgICAgIFNldFBsYW5lOworICAgICAgICBTZXRSb3dfQW55X05FT047CisgICAgICAgIFNldFJvd19DOworICAgICAgICBTZXRSb3dfTkVPTjsKKyAgICAgICAgU29iZWxSb3dfQW55X05FT047CisgICAgICAgIFNvYmVsUm93X0M7CisgICAgICAgIFNvYmVsUm93X05FT047CisgICAgICAgIFNvYmVsVG9QbGFuZVJvd19BbnlfTkVPTjsKKyAgICAgICAgU29iZWxUb1BsYW5lUm93X0M7CisgICAgICAgIFNvYmVsVG9QbGFuZVJvd19ORU9OOworICAgICAgICBTb2JlbFhSb3dfQzsKKyAgICAgICAgU29iZWxYUm93X05FT047CisgICAgICAgIFNvYmVsWFlSb3dfQW55X05FT047CisgICAgICAgIFNvYmVsWFlSb3dfQzsKKyAgICAgICAgU29iZWxYWVJvd19ORU9OOworICAgICAgICBTb2JlbFlSb3dfQzsKKyAgICAgICAgU29iZWxZUm93X05FT047CisgICAgICAgIFNwbGl0VVZQbGFuZTsKKyAgICAgICAgU3BsaXRVVlJvd19BbnlfTkVPTjsKKyAgICAgICAgU3BsaXRVVlJvd19DOworICAgICAgICBTcGxpdFVWUm93X05FT047CisgICAgICAgIFVZVllUb0FSR0I7CisgICAgICAgIFVZVllUb0FSR0JSb3dfQW55X05FT047CisgICAgICAgIFVZVllUb0FSR0JSb3dfQzsKKyAgICAgICAgVVlWWVRvQVJHQlJvd19ORU9OOworICAgICAgICBVWVZZVG9JNDIwOworICAgICAgICBVWVZZVG9JNDIyOworICAgICAgICBVWVZZVG9OVjEyOworICAgICAgICBVWVZZVG9VVjQyMlJvd19BbnlfTkVPTjsKKyAgICAgICAgVVlWWVRvVVY0MjJSb3dfQzsKKyAgICAgICAgVVlWWVRvVVY0MjJSb3dfTkVPTjsKKyAgICAgICAgVVlWWVRvVVZSb3dfQW55X05FT047CisgICAgICAgIFVZVllUb1VWUm93X0M7CisgICAgICAgIFVZVllUb1VWUm93X05FT047CisgICAgICAgIFVZVllUb1lSb3dfQW55X05FT047CisgICAgICAgIFVZVllUb1lSb3dfQzsKKyAgICAgICAgVVlWWVRvWVJvd19ORU9OOworICAgICAgICBZVVkyVG9BUkdCOworICAgICAgICBZVVkyVG9BUkdCUm93X0FueV9ORU9OOworICAgICAgICBZVVkyVG9BUkdCUm93X0M7CisgICAgICAgIFlVWTJUb0FSR0JSb3dfTkVPTjsKKyAgICAgICAgWVVZMlRvSTQyMDsKKyAgICAgICAgWVVZMlRvSTQyMjsKKyAgICAgICAgWVVZMlRvTlYxMjsKKyAgICAgICAgWVVZMlRvVVY0MjJSb3dfQW55X05FT047CisgICAgICAgIFlVWTJUb1VWNDIyUm93X0M7CisgICAgICAgIFlVWTJUb1VWNDIyUm93X05FT047CisgICAgICAgIFlVWTJUb1VWUm93X0FueV9ORU9OOworICAgICAgICBZVVkyVG9VVlJvd19DOworICAgICAgICBZVVkyVG9VVlJvd19ORU9OOworICAgICAgICBZVVkyVG9ZOworICAgICAgICBZVVkyVG9ZUm93X0FueV9ORU9OOworICAgICAgICBZVVkyVG9ZUm93X0M7CisgICAgICAgIFlVWTJUb1lSb3dfTkVPTjsKK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvQW5kcm9pZC5icAppbmRleCAxYjlmZTBmLi44ZDQ4NmNmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0FuZHJvaWQuYnAKQEAgLTEsNCArMSw0IEBACi1jY19saWJyYXJ5X3NoYXJlZCB7CitjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfZmxhY2RlYyIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKICAgICB2bmRrOiB7CkBAIC05LDYgKzksOCBAQAogICAgICAgICAiRkxBQ0RlY29kZXIuY3BwIiwKICAgICBdLAogCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyAiLiIgXSwKKwogICAgIGluY2x1ZGVfZGlyczogWwogICAgICAgICAiZXh0ZXJuYWwvZmxhYy9pbmNsdWRlIiwKICAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCkBAIC0yNywxMCArMjksMTUgQEAKICAgICAgICAgfSwKICAgICB9LAogCi0gICAgc3RhdGljX2xpYnM6IFsibGliRkxBQyJdLAorICAgIHN0YXRpYzogeworICAgICAgICB3aG9sZV9zdGF0aWNfbGliczogWyJsaWJGTEFDIl0sCisgICAgfSwKKworICAgIHNoYXJlZDogeworICAgICAgICBzdGF0aWNfbGliczogWyJsaWJGTEFDIl0sCisgICAgfSwKIAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidXRpbHMiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvRkxBQ0RlY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvRkxBQ0RlY29kZXIuY3BwCmluZGV4IDhjNzEzN2MuLmEyYjZhYjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0ZMQUNEZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9GTEFDRGVjb2Rlci5jcHAKQEAgLTIyMCw5ICsyMjAsMTAgQEAKIH0KIAogLy8gc3RhdGljCi1zcDxGTEFDRGVjb2Rlcj4gRkxBQ0RlY29kZXI6OkNyZWF0ZSgpIHsKLSAgICBzcDxGTEFDRGVjb2Rlcj4gZGVjb2RlciA9IG5ldyBGTEFDRGVjb2RlcigpOwotICAgIGlmIChkZWNvZGVyLT5pbml0KCkgIT0gT0spIHsKK0ZMQUNEZWNvZGVyICpGTEFDRGVjb2Rlcjo6Q3JlYXRlKCkgeworICAgIEZMQUNEZWNvZGVyICpkZWNvZGVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIEZMQUNEZWNvZGVyKCk7CisgICAgaWYgKGRlY29kZXIgPT0gTlVMTCB8fCBkZWNvZGVyLT5pbml0KCkgIT0gT0spIHsKKyAgICAgICAgZGVsZXRlIGRlY29kZXI7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICByZXR1cm4gZGVjb2RlcjsKQEAgLTQyMiwyMiArNDIzLDE2IEBACiAgICAgICAgIHNob3J0ICpvdXRCdWZmZXIsIHNpemVfdCAqb3V0QnVmZmVyTGVuKSB7CiAgICAgQUxPR1YoImRlY29kZU9uZUZyYW1lOiBpbnB1dCBzaXplKCV6dSkiLCBpbkJ1ZmZlckxlbik7CiAKLSAgICBpZiAoaW5CdWZmZXJMZW4gPT0gMCkgewotICAgICAgICBBTE9HVigiZGVjb2RlT25lRnJhbWU6IG5vIGlucHV0IGRhdGEiKTsKLSAgICAgICAgaWYgKG91dEJ1ZmZlckxlbikgewotICAgICAgICAgICAgKm91dEJ1ZmZlckxlbiA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQogICAgIGlmICghbVN0cmVhbUluZm9WYWxpZCkgewogICAgICAgICBBTE9HVygiZGVjb2RlT25lRnJhbWU6IG5vIHN0cmVhbWluZm8gbWV0YWRhdGEgYmxvY2siKTsKICAgICB9CiAKLSAgICBzdGF0dXNfdCBlcnIgPSBhZGREYXRhVG9CdWZmZXIoaW5CdWZmZXIsIGluQnVmZmVyTGVuKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIEFMT0dXKCJkZWNvZGVPbmVGcmFtZTogYWRkRGF0YVRvQnVmZmVyIHJldHVybnMgZXJyb3IgJWQiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOworICAgIGlmIChpbkJ1ZmZlckxlbiAhPSAwKSB7CisgICAgICAgIHN0YXR1c190IGVyciA9IGFkZERhdGFUb0J1ZmZlcihpbkJ1ZmZlciwgaW5CdWZmZXJMZW4pOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HVygiZGVjb2RlT25lRnJhbWU6IGFkZERhdGFUb0J1ZmZlciByZXR1cm5zIGVycm9yICVkIiwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KICAgICB9CiAKICAgICBtV3JpdGVSZXF1ZXN0ZWQgPSB0cnVlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvRkxBQ0RlY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0ZMQUNEZWNvZGVyLmgKaW5kZXggMzYyODJhOC4uMWEzM2NhZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvRkxBQ0RlY29kZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9GTEFDRGVjb2Rlci5oCkBAIC0yNiwxNCArMjYsMTQgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gcGFja2V0IGJhc2VkIEZMQUMgZGVjb2Rlciwgd3JhcHBzIGxpYkZMQUMgc3RyZWFtIGRlY29kZXIuCi1jbGFzcyBGTEFDRGVjb2RlciA6IHB1YmxpYyBSZWZCYXNlIHsKK2NsYXNzIEZMQUNEZWNvZGVyIHsKIAogcHVibGljOgogICAgIGVudW0gewogICAgICAgICBrTWF4Q2hhbm5lbHMgPSA4LAogICAgIH07CiAKLSAgICBzdGF0aWMgc3A8RkxBQ0RlY29kZXI+IENyZWF0ZSgpOworICAgIHN0YXRpYyBGTEFDRGVjb2RlciAqQ3JlYXRlKCk7CiAKICAgICBGTEFDX19TdHJlYW1NZXRhZGF0YV9TdHJlYW1JbmZvIGdldFN0cmVhbUluZm8oKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtU3RyZWFtSW5mbzsKQEAgLTQzLDEwICs0MywxMCBAQAogICAgIHN0YXR1c190IGRlY29kZU9uZUZyYW1lKGNvbnN0IHVpbnQ4X3QgKmluQnVmZmVyLCBzaXplX3QgaW5CdWZmZXJMZW4sCiAgICAgICAgICAgICBzaG9ydCAqb3V0QnVmZmVyLCBzaXplX3QgKm91dEJ1ZmZlckxlbik7CiAgICAgdm9pZCBmbHVzaCgpOworICAgIHZpcnR1YWwgfkZMQUNEZWNvZGVyKCk7CiAKIHByb3RlY3RlZDoKICAgICBGTEFDRGVjb2RlcigpOwotICAgIHZpcnR1YWwgfkZMQUNEZWNvZGVyKCkgb3ZlcnJpZGU7CiAKIHByaXZhdGU6CiAgICAgLy8gc3RyZWFtIHByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuY3BwCmluZGV4IDgwNDA0NmEuLmM4OTY1ZDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmNwcApAQCAtMTksMTMgKzE5LDExIEBACiAjaW5jbHVkZSAiQURlYnVnLmgiCiAjaW5jbHVkZSAiQUxvb3Blci5oIgogI2luY2x1ZGUgIkFNZXNzYWdlLmgiCi0jaW5jbHVkZSAiTWVkaWFCdWZmZXJCYXNlLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogQUJ1ZmZlcjo6QUJ1ZmZlcihzaXplX3QgY2FwYWNpdHkpCi0gICAgOiBtTWVkaWFCdWZmZXJCYXNlKE5VTEwpLAotICAgICAgbVJhbmdlT2Zmc2V0KDApLAorICAgIDogbVJhbmdlT2Zmc2V0KDApLAogICAgICAgbUludDMyRGF0YSgwKSwKICAgICAgIG1Pd25zRGF0YSh0cnVlKSB7CiAgICAgbURhdGEgPSBtYWxsb2MoY2FwYWNpdHkpOwpAQCAtMzksOCArMzcsNyBAQAogfQogCiBBQnVmZmVyOjpBQnVmZmVyKHZvaWQgKmRhdGEsIHNpemVfdCBjYXBhY2l0eSkKLSAgICA6IG1NZWRpYUJ1ZmZlckJhc2UoTlVMTCksCi0gICAgICBtRGF0YShkYXRhKSwKKyAgICA6IG1EYXRhKGRhdGEpLAogICAgICAgbUNhcGFjaXR5KGNhcGFjaXR5KSwKICAgICAgIG1SYW5nZU9mZnNldCgwKSwKICAgICAgIG1SYW5nZUxlbmd0aChjYXBhY2l0eSksCkBAIC02Niw4ICs2Myw2IEBACiAgICAgICAgICAgICBtRGF0YSA9IE5VTEw7CiAgICAgICAgIH0KICAgICB9Ci0KLSAgICBzZXRNZWRpYUJ1ZmZlckJhc2UoTlVMTCk7CiB9CiAKIHZvaWQgQUJ1ZmZlcjo6c2V0UmFuZ2Uoc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKQEAgLTg1LDE5ICs4MCw1IEBACiAgICAgcmV0dXJuIG1NZXRhOwogfQogCi1NZWRpYUJ1ZmZlckJhc2UgKkFCdWZmZXI6OmdldE1lZGlhQnVmZmVyQmFzZSgpIHsKLSAgICBpZiAobU1lZGlhQnVmZmVyQmFzZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1NZWRpYUJ1ZmZlckJhc2UtPmFkZF9yZWYoKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1NZWRpYUJ1ZmZlckJhc2U7Ci19Ci0KLXZvaWQgQUJ1ZmZlcjo6c2V0TWVkaWFCdWZmZXJCYXNlKE1lZGlhQnVmZmVyQmFzZSAqbWVkaWFCdWZmZXIpIHsKLSAgICBpZiAobU1lZGlhQnVmZmVyQmFzZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1NZWRpYUJ1ZmZlckJhc2UtPnJlbGVhc2UoKTsKLSAgICB9Ci0gICAgbU1lZGlhQnVmZmVyQmFzZSA9IG1lZGlhQnVmZmVyOwotfQotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuY3BwCmluZGV4IGY1NWRlNjQuLmRmNjZhYzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuY3BwCkBAIC0xMTYsNiArMTE2LDcgQEAKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KKyAgICBpdGVtLT5tVHlwZSA9IGtUeXBlSW50MzI7IC8vIGNsZWFyIHR5cGUKIH0KIAogI2lmZGVmIERVTVBfU1RBVFMKQEAgLTE5Niw2ICsxOTcsNyBAQAogICAgICAgICBDSEVDSyhtTnVtSXRlbXMgPCBrTWF4TnVtSXRlbXMpOwogICAgICAgICBpID0gbU51bUl0ZW1zKys7CiAgICAgICAgIGl0ZW0gPSAmbUl0ZW1zW2ldOworICAgICAgICBpdGVtLT5tVHlwZSA9IGtUeXBlSW50MzI7CiAgICAgICAgIGl0ZW0tPnNldE5hbWUobmFtZSwgbGVuKTsKICAgICB9CiAKQEAgLTk0NCw0ICs5NDYsMTYzIEBACiAgICAgcmV0dXJuIG1JdGVtc1tpbmRleF0ubU5hbWU7CiB9CiAKK0FNZXNzYWdlOjpJdGVtRGF0YSBBTWVzc2FnZTo6Z2V0RW50cnlBdChzaXplX3QgaW5kZXgpIGNvbnN0IHsKKyAgICBJdGVtRGF0YSBpdDsKKyAgICBpZiAoaW5kZXggPCBtTnVtSXRlbXMpIHsKKyAgICAgICAgc3dpdGNoIChtSXRlbXNbaW5kZXhdLm1UeXBlKSB7CisgICAgICAgICAgICBjYXNlIGtUeXBlSW50MzI6ICAgIGl0LnNldChtSXRlbXNbaW5kZXhdLnUuaW50MzJWYWx1ZSk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBrVHlwZUludDY0OiAgICBpdC5zZXQobUl0ZW1zW2luZGV4XS51LmludDY0VmFsdWUpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga1R5cGVTaXplOiAgICAgaXQuc2V0KG1JdGVtc1tpbmRleF0udS5zaXplVmFsdWUpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga1R5cGVGbG9hdDogICAgaXQuc2V0KG1JdGVtc1tpbmRleF0udS5mbG9hdFZhbHVlKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGtUeXBlRG91YmxlOiAgIGl0LnNldChtSXRlbXNbaW5kZXhdLnUuZG91YmxlVmFsdWUpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga1R5cGVQb2ludGVyOiAgaXQuc2V0KG1JdGVtc1tpbmRleF0udS5wdHJWYWx1ZSk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBrVHlwZVJlY3Q6ICAgICBpdC5zZXQobUl0ZW1zW2luZGV4XS51LnJlY3RWYWx1ZSk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBrVHlwZVN0cmluZzogICBpdC5zZXQoKm1JdGVtc1tpbmRleF0udS5zdHJpbmdWYWx1ZSk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBrVHlwZU9iamVjdDogeworICAgICAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iaiA9IG1JdGVtc1tpbmRleF0udS5yZWZWYWx1ZTsKKyAgICAgICAgICAgICAgICBpdC5zZXQob2JqKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2Uga1R5cGVNZXNzYWdlOiB7CisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IHN0YXRpY19jYXN0PEFNZXNzYWdlICo+KG1JdGVtc1tpbmRleF0udS5yZWZWYWx1ZSk7CisgICAgICAgICAgICAgICAgaXQuc2V0KG1zZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIGtUeXBlQnVmZmVyOiB7CisgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmID0gc3RhdGljX2Nhc3Q8QUJ1ZmZlciAqPihtSXRlbXNbaW5kZXhdLnUucmVmVmFsdWUpOworICAgICAgICAgICAgICAgIGl0LnNldChidWYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaXQ7Cit9CisKK3N0YXR1c190IEFNZXNzYWdlOjpzZXRFbnRyeU5hbWVBdChzaXplX3QgaW5kZXgsIGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgICBpZiAoaW5kZXggPj0gbU51bUl0ZW1zKSB7CisgICAgICAgIHJldHVybiBCQURfSU5ERVg7CisgICAgfQorICAgIGlmIChuYW1lID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKCFzdHJjbXAobmFtZSwgbUl0ZW1zW2luZGV4XS5tTmFtZSkpIHsKKyAgICAgICAgcmV0dXJuIE9LOyAvLyBuYW1lIGhhcyBub3QgY2hhbmdlZAorICAgIH0KKyAgICBzaXplX3QgbGVuID0gc3RybGVuKG5hbWUpOworICAgIGlmIChmaW5kSXRlbUluZGV4KG5hbWUsIGxlbikgPCBtTnVtSXRlbXMpIHsKKyAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOworICAgIH0KKyAgICBkZWxldGVbXSBtSXRlbXNbaW5kZXhdLm1OYW1lOworICAgIG1JdGVtc1tpbmRleF0ubU5hbWUgPSBudWxscHRyOworICAgIG1JdGVtc1tpbmRleF0uc2V0TmFtZShuYW1lLCBsZW4pOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQU1lc3NhZ2U6OnNldEVudHJ5QXQoc2l6ZV90IGluZGV4LCBjb25zdCBJdGVtRGF0YSAmaXRlbSkgeworICAgIEFTdHJpbmcgc3RyaW5nVmFsdWU7CisgICAgc3A8UmVmQmFzZT4gcmVmVmFsdWU7CisgICAgc3A8QU1lc3NhZ2U+IG1zZ1ZhbHVlOworICAgIHNwPEFCdWZmZXI+IGJ1ZlZhbHVlOworCisgICAgaWYgKGluZGV4ID49IG1OdW1JdGVtcykgeworICAgICAgICByZXR1cm4gQkFEX0lOREVYOworICAgIH0KKyAgICBpZiAoIWl0ZW0udXNlZCgpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEl0ZW0gKmRzdCA9ICZtSXRlbXNbaW5kZXhdOworICAgIGZyZWVJdGVtVmFsdWUoZHN0KTsKKworICAgIC8vIHNvbWUgdmFsdWVzIGNhbiBiZSBkaXJlY3RseSBzZXQgd2l0aCB0aGUgZ2V0dGVyLiBvdGhlcnMgbmVlZCBpdGVtcyB0byBiZSBhbGxvY2F0ZWQKKyAgICBpZiAoaXRlbS5maW5kKCZkc3QtPnUuaW50MzJWYWx1ZSkpIHsKKyAgICAgICAgZHN0LT5tVHlwZSA9IGtUeXBlSW50MzI7CisgICAgfSBlbHNlIGlmIChpdGVtLmZpbmQoJmRzdC0+dS5pbnQ2NFZhbHVlKSkgeworICAgICAgICBkc3QtPm1UeXBlID0ga1R5cGVJbnQ2NDsKKyAgICB9IGVsc2UgaWYgKGl0ZW0uZmluZCgmZHN0LT51LnNpemVWYWx1ZSkpIHsKKyAgICAgICAgZHN0LT5tVHlwZSA9IGtUeXBlU2l6ZTsKKyAgICB9IGVsc2UgaWYgKGl0ZW0uZmluZCgmZHN0LT51LmZsb2F0VmFsdWUpKSB7CisgICAgICAgIGRzdC0+bVR5cGUgPSBrVHlwZUZsb2F0OworICAgIH0gZWxzZSBpZiAoaXRlbS5maW5kKCZkc3QtPnUuZG91YmxlVmFsdWUpKSB7CisgICAgICAgIGRzdC0+bVR5cGUgPSBrVHlwZURvdWJsZTsKKyAgICB9IGVsc2UgaWYgKGl0ZW0uZmluZCgmZHN0LT51LnB0clZhbHVlKSkgeworICAgICAgICBkc3QtPm1UeXBlID0ga1R5cGVQb2ludGVyOworICAgIH0gZWxzZSBpZiAoaXRlbS5maW5kKCZkc3QtPnUucmVjdFZhbHVlKSkgeworICAgICAgICBkc3QtPm1UeXBlID0ga1R5cGVSZWN0OworICAgIH0gZWxzZSBpZiAoaXRlbS5maW5kKCZzdHJpbmdWYWx1ZSkpIHsKKyAgICAgICAgZHN0LT51LnN0cmluZ1ZhbHVlID0gbmV3IEFTdHJpbmcoc3RyaW5nVmFsdWUpOworICAgICAgICBkc3QtPm1UeXBlID0ga1R5cGVTdHJpbmc7CisgICAgfSBlbHNlIGlmIChpdGVtLmZpbmQoJnJlZlZhbHVlKSkgeworICAgICAgICBpZiAocmVmVmFsdWUgIT0gTlVMTCkgeyByZWZWYWx1ZS0+aW5jU3Ryb25nKHRoaXMpOyB9CisgICAgICAgIGRzdC0+dS5yZWZWYWx1ZSA9IHJlZlZhbHVlLmdldCgpOworICAgICAgICBkc3QtPm1UeXBlID0ga1R5cGVPYmplY3Q7CisgICAgfSBlbHNlIGlmIChpdGVtLmZpbmQoJm1zZ1ZhbHVlKSkgeworICAgICAgICBpZiAobXNnVmFsdWUgIT0gTlVMTCkgeyBtc2dWYWx1ZS0+aW5jU3Ryb25nKHRoaXMpOyB9CisgICAgICAgIGRzdC0+dS5yZWZWYWx1ZSA9IG1zZ1ZhbHVlLmdldCgpOworICAgICAgICBkc3QtPm1UeXBlID0ga1R5cGVNZXNzYWdlOworICAgIH0gZWxzZSBpZiAoaXRlbS5maW5kKCZidWZWYWx1ZSkpIHsKKyAgICAgICAgaWYgKGJ1ZlZhbHVlICE9IE5VTEwpIHsgYnVmVmFsdWUtPmluY1N0cm9uZyh0aGlzKTsgfQorICAgICAgICBkc3QtPnUucmVmVmFsdWUgPSBidWZWYWx1ZS5nZXQoKTsKKyAgICAgICAgZHN0LT5tVHlwZSA9IGtUeXBlQnVmZmVyOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIHVuc3VwcG9ydGVkIGl0ZW0gLSB3ZSBzaG91bGQgbm90IGJlIGhlcmUuCisgICAgICAgIGRzdC0+bVR5cGUgPSBrVHlwZUludDMyOworICAgICAgICBkc3QtPnUuaW50MzJWYWx1ZSA9IDB4REVBRERFQUQ7CisgICAgICAgIHJldHVybiBCQURfVFlQRTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBTWVzc2FnZTo6cmVtb3ZlRW50cnlBdChzaXplX3QgaW5kZXgpIHsKKyAgICBpZiAoaW5kZXggPj0gbU51bUl0ZW1zKSB7CisgICAgICAgIHJldHVybiBCQURfSU5ERVg7CisgICAgfQorICAgIC8vIGRlbGV0ZSBlbnRyeSBkYXRhIGFuZCBvYmplY3RzCisgICAgLS1tTnVtSXRlbXM7CisgICAgZGVsZXRlW10gbUl0ZW1zW2luZGV4XS5tTmFtZTsKKyAgICBtSXRlbXNbaW5kZXhdLm1OYW1lID0gbnVsbHB0cjsKKyAgICBmcmVlSXRlbVZhbHVlKCZtSXRlbXNbaW5kZXhdKTsKKworICAgIC8vIHN3YXAgZW50cnkgd2l0aCBsYXN0IGVudHJ5IGFuZCBjbGVhciBsYXN0IGVudHJ5J3MgZGF0YQorICAgIGlmIChpbmRleCA8IG1OdW1JdGVtcykgeworICAgICAgICBtSXRlbXNbaW5kZXhdID0gbUl0ZW1zW21OdW1JdGVtc107CisgICAgICAgIG1JdGVtc1ttTnVtSXRlbXNdLm1OYW1lID0gbnVsbHB0cjsKKyAgICAgICAgbUl0ZW1zW21OdW1JdGVtc10ubVR5cGUgPSBrVHlwZUludDMyOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQU1lc3NhZ2U6OnNldEl0ZW0oY29uc3QgY2hhciAqbmFtZSwgY29uc3QgSXRlbURhdGEgJml0ZW0pIHsKKyAgICBpZiAoaXRlbS51c2VkKCkpIHsKKyAgICAgICAgSXRlbSAqaXQgPSBhbGxvY2F0ZUl0ZW0obmFtZSk7CisgICAgICAgIGlmIChpdCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBzZXRFbnRyeUF0KGl0IC0gbUl0ZW1zLCBpdGVtKTsKKyAgICAgICAgfQorICAgIH0KK30KKworQU1lc3NhZ2U6Okl0ZW1EYXRhIEFNZXNzYWdlOjpmaW5kSXRlbShjb25zdCBjaGFyICpuYW1lKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEVudHJ5QXQoZmluZEVudHJ5QnlOYW1lKG5hbWUpKTsKK30KKwordm9pZCBBTWVzc2FnZTo6ZXh0ZW5kKGNvbnN0IHNwPEFNZXNzYWdlPiAmb3RoZXIpIHsKKyAgICAvLyBpZ25vcmUgbnVsbCBtZXNzYWdlcworICAgIGlmIChvdGhlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgb3RoZXItPm1OdW1JdGVtczsgKytpeCkgeworICAgICAgICBJdGVtICppdCA9IGFsbG9jYXRlSXRlbShvdGhlci0+bUl0ZW1zW2l4XS5tTmFtZSk7CisgICAgICAgIGlmIChpdCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBJdGVtRGF0YSBkYXRhID0gb3RoZXItPmdldEVudHJ5QXQoaXgpOworICAgICAgICAgICAgc2V0RW50cnlBdChpdCAtIG1JdGVtcywgZGF0YSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3NpemVfdCBBTWVzc2FnZTo6ZmluZEVudHJ5QnlOYW1lKGNvbnN0IGNoYXIgKm5hbWUpIGNvbnN0IHsKKyAgICByZXR1cm4gbmFtZSA9PSBudWxscHRyID8gY291bnRFbnRyaWVzKCkgOiBmaW5kSXRlbUluZGV4KG5hbWUsIHN0cmxlbihuYW1lKSk7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FOZXR3b3JrU2Vzc2lvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FOZXR3b3JrU2Vzc2lvbi5jcHAKaW5kZXggZjhiN2I0MS4uZWFmZGMzNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTmV0d29ya1Nlc3Npb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU5ldHdvcmtTZXNzaW9uLmNwcApAQCAtMzMsMjIgKzMzLDExIEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdGF0aWMgdWludDE2X3QgVTE2X0FUKGNvbnN0IHVpbnQ4X3QgKnB0cikgewotICAgIHJldHVybiBwdHJbMF0gPDwgOCB8IHB0clsxXTsKLX0KLQotc3RhdGljIHVpbnQzMl90IFUzMl9BVChjb25zdCB1aW50OF90ICpwdHIpIHsKLSAgICByZXR1cm4gcHRyWzBdIDw8IDI0IHwgcHRyWzFdIDw8IDE2IHwgcHRyWzJdIDw8IDggfCBwdHJbM107Ci19Ci0KLXN0YXRpYyB1aW50NjRfdCBVNjRfQVQoY29uc3QgdWludDhfdCAqcHRyKSB7Ci0gICAgcmV0dXJuICgodWludDY0X3QpVTMyX0FUKHB0cikpIDw8IDMyIHwgVTMyX0FUKHB0ciArIDQpOwotfQotCiBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhVRFBTaXplID0gMTUwMDsKIHN0YXRpYyBjb25zdCBpbnQzMl90IGtNYXhVRFBSZXRyaWVzID0gMjAwOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FXYWtlTG9jay5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FXYWtlTG9jay5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5Mjc3YWMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BV2FrZUxvY2suY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIkFXYWtlTG9jayIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkFEZWJ1Zy5oIgotI2luY2x1ZGUgIkFXYWtlTG9jay5oIgotCi0jaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotI2luY2x1ZGUgPHBvd2VybWFuYWdlci9Qb3dlck1hbmFnZXIuaD4KLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLUFXYWtlTG9jazo6QVdha2VMb2NrKCkgOgotICAgIG1Qb3dlck1hbmFnZXIoTlVMTCksCi0gICAgbVdha2VMb2NrVG9rZW4oTlVMTCksCi0gICAgbVdha2VMb2NrQ291bnQoMCksCi0gICAgbURlYXRoUmVjaXBpZW50KG5ldyBQTURlYXRoUmVjaXBpZW50KHRoaXMpKSB7fQotCi1BV2FrZUxvY2s6On5BV2FrZUxvY2soKSB7Ci0gICAgaWYgKG1Qb3dlck1hbmFnZXIgIT0gTlVMTCkgewotICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBJSW50ZXJmYWNlOjphc0JpbmRlcihtUG93ZXJNYW5hZ2VyKTsKLSAgICAgICAgYmluZGVyLT51bmxpbmtUb0RlYXRoKG1EZWF0aFJlY2lwaWVudCk7Ci0gICAgfQotICAgIGNsZWFyUG93ZXJNYW5hZ2VyKCk7Ci19Ci0KLWJvb2wgQVdha2VMb2NrOjphY3F1aXJlKCkgewotICAgIGlmIChtV2FrZUxvY2tDb3VudCA9PSAwKSB7Ci0gICAgICAgIENIRUNLKG1XYWtlTG9ja1Rva2VuID09IE5VTEwpOwotICAgICAgICBpZiAobVBvd2VyTWFuYWdlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAvLyB1c2UgY2hlY2tTZXJ2aWNlKCkgdG8gYXZvaWQgYmxvY2tpbmcgaWYgcG93ZXIgc2VydmljZSBpcyBub3QgdXAgeWV0Ci0gICAgICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPQotICAgICAgICAgICAgICAgIGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5jaGVja1NlcnZpY2UoU3RyaW5nMTYoInBvd2VyIikpOwotICAgICAgICAgICAgaWYgKGJpbmRlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImNvdWxkIG5vdCBnZXQgdGhlIHBvd2VyIG1hbmFnZXIgc2VydmljZSIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUG93ZXJNYW5hZ2VyID0gaW50ZXJmYWNlX2Nhc3Q8SVBvd2VyTWFuYWdlcj4oYmluZGVyKTsKLSAgICAgICAgICAgICAgICBiaW5kZXItPmxpbmtUb0RlYXRoKG1EZWF0aFJlY2lwaWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Qb3dlck1hbmFnZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gbmV3IEJCaW5kZXIoKTsKLSAgICAgICAgICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVBvd2VyTWFuYWdlci0+YWNxdWlyZVdha2VMb2NrKAotICAgICAgICAgICAgICAgICAgICBQT1dFUk1BTkFHRVJfUEFSVElBTF9XQUtFX0xPQ0ssCi0gICAgICAgICAgICAgICAgICAgIGJpbmRlciwgU3RyaW5nMTYoIkFXYWtlTG9jayIpLCBTdHJpbmcxNigibWVkaWEiKSk7Ci0gICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBtV2FrZUxvY2tUb2tlbiA9IGJpbmRlcjsKLSAgICAgICAgICAgICAgICBtV2FrZUxvY2tDb3VudCsrOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbVdha2VMb2NrQ291bnQrKzsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBBV2FrZUxvY2s6OnJlbGVhc2UoYm9vbCBmb3JjZSkgewotICAgIGlmIChtV2FrZUxvY2tDb3VudCA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKGZvcmNlKSB7Ci0gICAgICAgIC8vIEZvcmNlIHdha2Vsb2NrIHJlbGVhc2UgYmVsb3cgYnkgc2V0dGluZyByZWZlcmVuY2UgY291bnQgdG8gMS4KLSAgICAgICAgbVdha2VMb2NrQ291bnQgPSAxOwotICAgIH0KLSAgICBpZiAoLS1tV2FrZUxvY2tDb3VudCA9PSAwKSB7Ci0gICAgICAgIENIRUNLKG1XYWtlTG9ja1Rva2VuICE9IE5VTEwpOwotICAgICAgICBpZiAobVBvd2VyTWFuYWdlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKLSAgICAgICAgICAgIG1Qb3dlck1hbmFnZXItPnJlbGVhc2VXYWtlTG9jayhtV2FrZUxvY2tUb2tlbiwgMCAvKiBmbGFncyAqLyk7Ci0gICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKLSAgICAgICAgfQotICAgICAgICBtV2FrZUxvY2tUb2tlbi5jbGVhcigpOwotICAgIH0KLX0KLQotdm9pZCBBV2FrZUxvY2s6OmNsZWFyUG93ZXJNYW5hZ2VyKCkgewotICAgIHJlbGVhc2UodHJ1ZSk7Ci0gICAgbVBvd2VyTWFuYWdlci5jbGVhcigpOwotfQotCi12b2lkIEFXYWtlTG9jazo6UE1EZWF0aFJlY2lwaWVudDo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKSB7Ci0gICAgaWYgKG1XYWtlTG9jayAhPSBOVUxMKSB7Ci0gICAgICAgIG1XYWtlTG9jay0+Y2xlYXJQb3dlck1hbmFnZXIoKTsKLSAgICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQuYnAKaW5kZXggMjIxYWYxZC4uZjY2MzU0MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5icApAQCAtNCw3ICs0LDcgQEAKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogfQogCi1jY19saWJyYXJ5X3NoYXJlZCB7CitjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKICAgICB2bmRrOiB7CkBAIC0xMyw2ICsxMyw4IEBACiAgICAgaW5jbHVkZV9kaXJzOiBbCiAgICAgICAgICJmcmFtZXdvcmtzL2F2L2luY2x1ZGUiLAogICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZSIsCisgICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9saWJzL2FyZWN0L2luY2x1ZGUiLAorICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvbGlicy9uYXRpdmViYXNlL2luY2x1ZGUiLAogICAgIF0sCiAKICAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKQEAgLTIyLDE1ICsyNCwxNiBAQAogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJoYXJkd2FyZV9oZWFkZXJzIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25faGVhZGVycyIsCisgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCiAgICAgXSwKIAogICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25faGVhZGVycyIsCisgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCiAgICAgXSwKIAogICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKICAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICJsaWJ1aSIsCiAgICAgXSwKIAogICAgIGNmbGFnczogWwpAQCAtNDIsMTAgKzQ1LDggQEAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYnVpIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlicG93ZXJtYW5hZ2VyIiwKICAgICBdLAogCiAgICAgc3JjczogWwpAQCAtNjEsMjMgKzYyLDE2IEBACiAgICAgICAgICJBTmV0d29ya1Nlc3Npb24uY3BwIiwKICAgICAgICAgIkFTdHJpbmcuY3BwIiwKICAgICAgICAgIkFTdHJpbmdVdGlscy5jcHAiLAotICAgICAgICAiQVdha2VMb2NrLmNwcCIsCisgICAgICAgICJCeXRlVXRpbHMuY3BwIiwKICAgICAgICAgIkNvbG9yVXRpbHMuY3BwIiwKLSAgICAgICAgIk1lZGlhQnVmZmVyLmNwcCIsCi0gICAgICAgICJNZWRpYUJ1ZmZlckdyb3VwLmNwcCIsCi0gICAgICAgICJNZXRhRGF0YS5jcHAiLAorICAgICAgICAiTWVkaWFEZWZzLmNwcCIsCisgICAgICAgICJNZWRpYUtleXMuY3BwIiwKICAgICAgICAgIlBhcnNlZE1lc3NhZ2UuY3BwIiwKKyAgICAgICAgImF2Y191dGlscy5jcHAiLAogICAgICAgICAiYmFzZTY0LmNwcCIsCiAgICAgICAgICJoZXhkdW1wLmNwcCIsCiAgICAgXSwKIAotICAgIHRhcmdldDogewotICAgICAgICB2ZW5kb3I6IHsKLSAgICAgICAgICAgIGV4Y2x1ZGVfc2hhcmVkX2xpYnM6IFsibGlicG93ZXJtYW5hZ2VyIl0sCi0gICAgICAgICAgICBleGNsdWRlX3NyY3M6IFsiQVdha2VMb2NrLmNwcCJdLAotICAgICAgICB9LAotICAgIH0sCi0KICAgICBjbGFuZzogdHJ1ZSwKIAogICAgIHNhbml0aXplOiB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRkNDBhYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmNwcApAQCAtMCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJCeXRlVXRpbHMiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VpbnQxNl90IFUxNl9BVChjb25zdCB1aW50OF90ICpwdHIpIHsKKyAgICByZXR1cm4gcHRyWzBdIDw8IDggfCBwdHJbMV07Cit9CisKK3VpbnQzMl90IFUzMl9BVChjb25zdCB1aW50OF90ICpwdHIpIHsKKyAgICByZXR1cm4gcHRyWzBdIDw8IDI0IHwgcHRyWzFdIDw8IDE2IHwgcHRyWzJdIDw8IDggfCBwdHJbM107Cit9CisKK3VpbnQ2NF90IFU2NF9BVChjb25zdCB1aW50OF90ICpwdHIpIHsKKyAgICByZXR1cm4gKCh1aW50NjRfdClVMzJfQVQocHRyKSkgPDwgMzIgfCBVMzJfQVQocHRyICsgNCk7Cit9CisKK3VpbnQxNl90IFUxNkxFX0FUKGNvbnN0IHVpbnQ4X3QgKnB0cikgeworICAgIHJldHVybiBwdHJbMF0gfCAocHRyWzFdIDw8IDgpOworfQorCit1aW50MzJfdCBVMzJMRV9BVChjb25zdCB1aW50OF90ICpwdHIpIHsKKyAgICByZXR1cm4gcHRyWzNdIDw8IDI0IHwgcHRyWzJdIDw8IDE2IHwgcHRyWzFdIDw8IDggfCBwdHJbMF07Cit9CisKK3VpbnQ2NF90IFU2NExFX0FUKGNvbnN0IHVpbnQ4X3QgKnB0cikgeworICAgIHJldHVybiAoKHVpbnQ2NF90KVUzMkxFX0FUKHB0ciArIDQpKSA8PCAzMiB8IFUzMkxFX0FUKHB0cik7Cit9CisKKy8vIFhYWCB3YXJuaW5nOiB0aGVzZSB3b24ndCB3b3JrIG9uIGJpZy1lbmRpYW4gaG9zdC4KK3VpbnQ2NF90IG50b2g2NCh1aW50NjRfdCB4KSB7CisgICAgcmV0dXJuICgodWludDY0X3QpbnRvaGwoeCAmIDB4ZmZmZmZmZmYpIDw8IDMyKSB8IG50b2hsKHggPj4gMzIpOworfQorCit1aW50NjRfdCBodG9uNjQodWludDY0X3QgeCkgeworICAgIHJldHVybiAoKHVpbnQ2NF90KWh0b25sKHggJiAweGZmZmZmZmZmKSA8PCAzMikgfCBodG9ubCh4ID4+IDMyKTsKK30KKwordm9pZCBNYWtlRm91ckNDU3RyaW5nKHVpbnQzMl90IHgsIGNoYXIgKnMpIHsKKyAgICBzWzBdID0geCA+PiAyNDsKKyAgICBzWzFdID0gKHggPj4gMTYpICYgMHhmZjsKKyAgICBzWzJdID0gKHggPj4gOCkgJiAweGZmOworICAgIHNbM10gPSB4ICYgMHhmZjsKKyAgICBzWzRdID0gJ1wwJzsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuY3BwCmluZGV4IDg4YTgzNTEuLmM0ZWFhMjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmNwcApAQCAtMzk4LDYgKzM5OCw3IEBACiB9CiAKIC8vIFRPRE86IG1vdmUgdGhpcyBpbnRvIGEgVmlkZW8gSEFMCitjb25zdCBzdGF0aWMKIEFMb29rdXA8Q1U6OkNvbG9yU3RhbmRhcmQsIHN0ZDo6cGFpcjxDQTo6UHJpbWFyaWVzLCBDQTo6TWF0cml4Q29lZmZzPj4gc1N0YW5kYXJkRmFsbGJhY2tzIHsKICAgICB7CiAgICAgICAgIHsgQ1U6OmtDb2xvclN0YW5kYXJkQlQ2MDFfNjI1LCB7IENBOjpQcmltYXJpZXNCVDcwOV81LCBDQTo6TWF0cml4QlQ0NzBfNk0gfSB9LApAQCAtNDIwLDYgKzQyMSw3IEBACiAgICAgfQogfTsKIAorY29uc3Qgc3RhdGljCiBBTG9va3VwPENVOjpDb2xvclN0YW5kYXJkLCBDQTo6UHJpbWFyaWVzPiBzU3RhbmRhcmRQcmltYXJpZXNGYWxsYmFja3MgewogICAgIHsKICAgICAgICAgeyBDVTo6a0NvbG9yU3RhbmRhcmRGaWxtLCAgICAgICAgICAgICAgICAgQ0E6OlByaW1hcmllc0dlbmVyaWNGaWxtIH0sCkBAIC00MzAsNyArNDMyLDggQEAKICAgICB9CiB9OwogCi1zdGF0aWMgQUxvb2t1cDxhbmRyb2lkX2RhdGFzcGFjZSwgYW5kcm9pZF9kYXRhc3BhY2U+IHNMZWdhY3lEYXRhU3BhY2VUb1YwIHsKK2NvbnN0IHN0YXRpYworQUxvb2t1cDxhbmRyb2lkX2RhdGFzcGFjZSwgYW5kcm9pZF9kYXRhc3BhY2U+IHNMZWdhY3lEYXRhU3BhY2VUb1YwIHsKICAgICB7CiAgICAgICAgIHsgSEFMX0RBVEFTUEFDRV9TUkdCLCBIQUxfREFUQVNQQUNFX1YwX1NSR0IgfSwKICAgICAgICAgeyBIQUxfREFUQVNQQUNFX0JUNzA5LCBIQUxfREFUQVNQQUNFX1YwX0JUNzA5IH0sCkBAIC00NDEsNiArNDQ0LDczIEBACiAgICAgfQogfTsKIAorI2RlZmluZSBHRVRfSEFMX0VOVU0oY2xhc3MsIG5hbWUpIEhBTF9EQVRBU1BBQ0VfIyNjbGFzcyMjbmFtZQorI2RlZmluZSBHRVRfSEFMX0JJVEZJRUxEKGNsYXNzLCBuYW1lKSAoR0VUX0hBTF9FTlVNKGNsYXNzLCBfIyNuYW1lKSA+PiBHRVRfSEFMX0VOVU0oY2xhc3MsIF9TSElGVCkpCisKK2NvbnN0IHN0YXRpYworQUxvb2t1cDxDVTo6Q29sb3JTdGFuZGFyZCwgdWludDMyX3Q+IHNHZnhTdGFuZGFyZHMgeworICAgIHsKKyAgICAgICAgeyBDVTo6a0NvbG9yU3RhbmRhcmRVbnNwZWNpZmllZCwgICAgICAgICAgR0VUX0hBTF9CSVRGSUVMRChTVEFOREFSRCwgVU5TUEVDSUZJRUQpIH0sCisgICAgICAgIHsgQ1U6OmtDb2xvclN0YW5kYXJkQlQ3MDksICAgICAgICAgICAgICAgIEdFVF9IQUxfQklURklFTEQoU1RBTkRBUkQsIEJUNzA5KSB9LAorICAgICAgICB7IENVOjprQ29sb3JTdGFuZGFyZEJUNjAxXzYyNSwgICAgICAgICAgICBHRVRfSEFMX0JJVEZJRUxEKFNUQU5EQVJELCBCVDYwMV82MjUpIH0sCisgICAgICAgIHsgQ1U6OmtDb2xvclN0YW5kYXJkQlQ2MDFfNjI1X1VuYWRqdXN0ZWQsIEdFVF9IQUxfQklURklFTEQoU1RBTkRBUkQsIEJUNjAxXzYyNV9VTkFESlVTVEVEKSB9LAorICAgICAgICB7IENVOjprQ29sb3JTdGFuZGFyZEJUNjAxXzUyNSwgICAgICAgICAgICBHRVRfSEFMX0JJVEZJRUxEKFNUQU5EQVJELCBCVDYwMV81MjUpIH0sCisgICAgICAgIHsgQ1U6OmtDb2xvclN0YW5kYXJkQlQ2MDFfNTI1X1VuYWRqdXN0ZWQsIEdFVF9IQUxfQklURklFTEQoU1RBTkRBUkQsIEJUNjAxXzUyNV9VTkFESlVTVEVEKSB9LAorICAgICAgICB7IENVOjprQ29sb3JTdGFuZGFyZEJUMjAyMCwgICAgICAgICAgICAgICBHRVRfSEFMX0JJVEZJRUxEKFNUQU5EQVJELCBCVDIwMjApIH0sCisgICAgICAgIHsgQ1U6OmtDb2xvclN0YW5kYXJkQlQyMDIwQ29uc3RhbnQsICAgICAgIEdFVF9IQUxfQklURklFTEQoU1RBTkRBUkQsIEJUMjAyMF9DT05TVEFOVF9MVU1JTkFOQ0UpIH0sCisgICAgICAgIHsgQ1U6OmtDb2xvclN0YW5kYXJkQlQ0NzBNLCAgICAgICAgICAgICAgIEdFVF9IQUxfQklURklFTEQoU1RBTkRBUkQsIEJUNDcwTSkgfSwKKyAgICAgICAgeyBDVTo6a0NvbG9yU3RhbmRhcmRGaWxtLCAgICAgICAgICAgICAgICAgR0VUX0hBTF9CSVRGSUVMRChTVEFOREFSRCwgRklMTSkgfSwKKyAgICAgICAgeyBDVTo6a0NvbG9yU3RhbmRhcmREQ0lfUDMsICAgICAgICAgICAgICAgR0VUX0hBTF9CSVRGSUVMRChTVEFOREFSRCwgRENJX1AzKSB9LAorICAgIH0KK307CisKKy8vIHZlcmlmeSBwdWJsaWMgdmFsdWVzIGFyZSBzdGFibGUKK3N0YXRpY19hc3NlcnQoQ1U6OmtDb2xvclN0YW5kYXJkVW5zcGVjaWZpZWQgPT0gMCwgIlNESyBtaXNtYXRjaCIpOyAvLyBOCitzdGF0aWNfYXNzZXJ0KENVOjprQ29sb3JTdGFuZGFyZEJUNzA5ID09IDEsICJTREsgbWlzbWF0Y2giKTsgLy8gTgorc3RhdGljX2Fzc2VydChDVTo6a0NvbG9yU3RhbmRhcmRCVDYwMV82MjUgPT0gMiwgIlNESyBtaXNtYXRjaCIpOyAvLyBOCitzdGF0aWNfYXNzZXJ0KENVOjprQ29sb3JTdGFuZGFyZEJUNjAxXzUyNSA9PSA0LCAiU0RLIG1pc21hdGNoIik7IC8vIE4KK3N0YXRpY19hc3NlcnQoQ1U6OmtDb2xvclN0YW5kYXJkQlQyMDIwID09IDYsICJTREsgbWlzbWF0Y2giKTsgLy8gTgorCitjb25zdCBzdGF0aWMKK0FMb29rdXA8Q1U6OkNvbG9yVHJhbnNmZXIsIHVpbnQzMl90PiBzR2Z4VHJhbnNmZXJzIHsKKyAgICB7CisgICAgICAgIHsgQ1U6OmtDb2xvclRyYW5zZmVyVW5zcGVjaWZpZWQsIEdFVF9IQUxfQklURklFTEQoVFJBTlNGRVIsIFVOU1BFQ0lGSUVEKSB9LAorICAgICAgICB7IENVOjprQ29sb3JUcmFuc2ZlckxpbmVhciwgICAgICBHRVRfSEFMX0JJVEZJRUxEKFRSQU5TRkVSLCBMSU5FQVIpIH0sCisgICAgICAgIHsgQ1U6OmtDb2xvclRyYW5zZmVyU1JHQiwgICAgICAgIEdFVF9IQUxfQklURklFTEQoVFJBTlNGRVIsIFNSR0IpIH0sCisgICAgICAgIHsgQ1U6OmtDb2xvclRyYW5zZmVyU01QVEVfMTcwTSwgIEdFVF9IQUxfQklURklFTEQoVFJBTlNGRVIsIFNNUFRFXzE3ME0pIH0sCisgICAgICAgIHsgQ1U6OmtDb2xvclRyYW5zZmVyR2FtbWEyMiwgICAgIEdFVF9IQUxfQklURklFTEQoVFJBTlNGRVIsIEdBTU1BMl8yKSB9LAorICAgICAgICB7IENVOjprQ29sb3JUcmFuc2ZlckdhbW1hMjgsICAgICBHRVRfSEFMX0JJVEZJRUxEKFRSQU5TRkVSLCBHQU1NQTJfOCkgfSwKKyAgICAgICAgeyBDVTo6a0NvbG9yVHJhbnNmZXJTVDIwODQsICAgICAgR0VUX0hBTF9CSVRGSUVMRChUUkFOU0ZFUiwgU1QyMDg0KSB9LAorICAgICAgICB7IENVOjprQ29sb3JUcmFuc2ZlckhMRywgICAgICAgICBHRVRfSEFMX0JJVEZJRUxEKFRSQU5TRkVSLCBITEcpIH0sCisgICAgfQorfTsKKworLy8gdmVyaWZ5IHB1YmxpYyB2YWx1ZXMgYXJlIHN0YWJsZQorc3RhdGljX2Fzc2VydChDVTo6a0NvbG9yVHJhbnNmZXJVbnNwZWNpZmllZCA9PSAwLCAiU0RLIG1pc21hdGNoIik7IC8vIE4KK3N0YXRpY19hc3NlcnQoQ1U6OmtDb2xvclRyYW5zZmVyTGluZWFyID09IDEsICJTREsgbWlzbWF0Y2giKTsgLy8gTgorc3RhdGljX2Fzc2VydChDVTo6a0NvbG9yVHJhbnNmZXJTUkdCID09IDIsICJTREsgbWlzbWF0Y2giKTsgLy8gTgorc3RhdGljX2Fzc2VydChDVTo6a0NvbG9yVHJhbnNmZXJTTVBURV8xNzBNID09IDMsICJTREsgbWlzbWF0Y2giKTsgLy8gTgorc3RhdGljX2Fzc2VydChDVTo6a0NvbG9yVHJhbnNmZXJTVDIwODQgPT0gNiwgIlNESyBtaXNtYXRjaCIpOyAvLyBOCitzdGF0aWNfYXNzZXJ0KENVOjprQ29sb3JUcmFuc2ZlckhMRyA9PSA3LCAiU0RLIG1pc21hdGNoIik7IC8vIE4KKworY29uc3Qgc3RhdGljCitBTG9va3VwPENVOjpDb2xvclJhbmdlLCB1aW50MzJfdD4gc0dmeFJhbmdlcyB7CisgICAgeworICAgICAgICB7IENVOjprQ29sb3JSYW5nZVVuc3BlY2lmaWVkLCBHRVRfSEFMX0JJVEZJRUxEKFJBTkdFLCBVTlNQRUNJRklFRCkgfSwKKyAgICAgICAgeyBDVTo6a0NvbG9yUmFuZ2VGdWxsLCAgICAgICAgR0VUX0hBTF9CSVRGSUVMRChSQU5HRSwgRlVMTCkgfSwKKyAgICAgICAgeyBDVTo6a0NvbG9yUmFuZ2VMaW1pdGVkLCAgICAgR0VUX0hBTF9CSVRGSUVMRChSQU5HRSwgTElNSVRFRCkgfSwKKyAgICB9Cit9OworCisvLyB2ZXJpZnkgcHVibGljIHZhbHVlcyBhcmUgc3RhYmxlCitzdGF0aWNfYXNzZXJ0KENVOjprQ29sb3JSYW5nZVVuc3BlY2lmaWVkID09IDAsICJTREsgbWlzbWF0Y2giKTsgLy8gTgorc3RhdGljX2Fzc2VydChDVTo6a0NvbG9yUmFuZ2VGdWxsID09IDEsICJTREsgbWlzbWF0Y2giKTsgLy8gTgorc3RhdGljX2Fzc2VydChDVTo6a0NvbG9yUmFuZ2VMaW1pdGVkID09IDIsICJTREsgbWlzbWF0Y2giKTsgLy8gTgorCisjdW5kZWYgR0VUX0hBTF9CSVRGSUVMRAorI3VuZGVmIEdFVF9IQUxfRU5VTQorCisKIGJvb2wgQ29sb3JVdGlsczo6Y29udmVydERhdGFTcGFjZVRvVjAoYW5kcm9pZF9kYXRhc3BhY2UgJmRhdGFTcGFjZSkgewogICAgICh2b2lkKXNMZWdhY3lEYXRhU3BhY2VUb1YwLmxvb2t1cChkYXRhU3BhY2UsICZkYXRhU3BhY2UpOwogICAgIHJldHVybiAoZGF0YVNwYWNlICYgMHhDMDAwRkZGRikgPT0gMDsKQEAgLTUwNyw5ICs1NzcsMjMgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8vIGFzc3VtZSAxLXRvLTEgbWFwcGluZyB0byBIQUwgdmFsdWVzICh0byBkZWFsIHdpdGggcG90ZW50aWFsIHZlbmRvciBleHRlbnNpb25zKQorICAgIHVpbnQzMl90IGdmeFJhbmdlID0gcmFuZ2U7CisgICAgdWludDMyX3QgZ2Z4U3RhbmRhcmQgPSBzdGFuZGFyZDsKKyAgICB1aW50MzJfdCBnZnhUcmFuc2ZlciA9IHRyYW5zZmVyOworICAgIC8vIFRSSUNLWTogdXNlICYgdG8gZW5zdXJlIGFsbCB0aHJlZSBtYXBwaW5ncyBhcmUgY29tcGxldGVkCisgICAgaWYgKCEoc0dmeFJhbmdlcy5tYXAocmFuZ2UsICZnZnhSYW5nZSkgJiBzR2Z4U3RhbmRhcmRzLm1hcChzdGFuZGFyZCwgJmdmeFN0YW5kYXJkKQorICAgICAgICAgICAgJiBzR2Z4VHJhbnNmZXJzLm1hcCh0cmFuc2ZlciwgJmdmeFRyYW5zZmVyKSkpIHsKKyAgICAgICAgQUxPR1coImNvdWxkIG5vdCBzYWZlbHkgbWFwIHBsYXRmb3JtIGNvbG9yIGFzcGVjdHMgKFI6JXUoJXMpIFM6JXUoJXMpIFQ6JXUoJXMpIHRvICIKKyAgICAgICAgICAgICAgImdyYXBoaWNzIGRhdGFzcGFjZSAoUjoldSBTOiV1IFQ6JXUpIiwKKyAgICAgICAgICAgICAgcmFuZ2UsIGFzU3RyaW5nKHJhbmdlKSwgc3RhbmRhcmQsIGFzU3RyaW5nKHN0YW5kYXJkKSwgdHJhbnNmZXIsIGFzU3RyaW5nKHRyYW5zZmVyKSwKKyAgICAgICAgICAgICAgZ2Z4UmFuZ2UsIGdmeFN0YW5kYXJkLCBnZnhUcmFuc2Zlcik7CisgICAgfQorCiAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlID0gKGFuZHJvaWRfZGF0YXNwYWNlKSgKLSAgICAgICAgICAgIChyYW5nZSA8PCBIQUxfREFUQVNQQUNFX1JBTkdFX1NISUZUKSB8IChzdGFuZGFyZCA8PCBIQUxfREFUQVNQQUNFX1NUQU5EQVJEX1NISUZUKSB8Ci0gICAgICAgICAgICAodHJhbnNmZXIgPDwgSEFMX0RBVEFTUEFDRV9UUkFOU0ZFUl9TSElGVCkpOworICAgICAgICAgICAgKGdmeFJhbmdlIDw8IEhBTF9EQVRBU1BBQ0VfUkFOR0VfU0hJRlQpIHwKKyAgICAgICAgICAgIChnZnhTdGFuZGFyZCA8PCBIQUxfREFUQVNQQUNFX1NUQU5EQVJEX1NISUZUKSB8CisgICAgICAgICAgICAoZ2Z4VHJhbnNmZXIgPDwgSEFMX0RBVEFTUEFDRV9UUkFOU0ZFUl9TSElGVCkpOwogICAgICh2b2lkKXNMZWdhY3lEYXRhU3BhY2VUb1YwLnJsb29rdXAoZGF0YVNwYWNlLCAmZGF0YVNwYWNlKTsKIAogICAgIGlmICghbWF5RXhwYW5kKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhQnVmZmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFCdWZmZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjAwMGVmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFCdWZmZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIk1lZGlhQnVmZmVyIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLQotI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vKiBzdGF0aWMgKi8KLXN0ZDo6YXRvbWljX2ludF9sZWFzdDMyX3QgTWVkaWFCdWZmZXI6Om1Vc2VTaGFyZWRNZW1vcnkoMCk7Ci0KLU1lZGlhQnVmZmVyOjpNZWRpYUJ1ZmZlcih2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkKLSAgICA6IG1PYnNlcnZlcihOVUxMKSwKLSAgICAgIG1SZWZDb3VudCgwKSwKLSAgICAgIG1EYXRhKGRhdGEpLAotICAgICAgbVNpemUoc2l6ZSksCi0gICAgICBtUmFuZ2VPZmZzZXQoMCksCi0gICAgICBtUmFuZ2VMZW5ndGgoc2l6ZSksCi0gICAgICBtT3duc0RhdGEoZmFsc2UpLAotICAgICAgbU1ldGFEYXRhKG5ldyBNZXRhRGF0YSksCi0gICAgICBtT3JpZ2luYWwoTlVMTCkgewotfQotCi1NZWRpYUJ1ZmZlcjo6TWVkaWFCdWZmZXIoc2l6ZV90IHNpemUpCi0gICAgOiBtT2JzZXJ2ZXIoTlVMTCksCi0gICAgICBtUmVmQ291bnQoMCksCi0gICAgICBtRGF0YShOVUxMKSwKLSAgICAgIG1TaXplKHNpemUpLAotICAgICAgbVJhbmdlT2Zmc2V0KDApLAotICAgICAgbVJhbmdlTGVuZ3RoKHNpemUpLAotICAgICAgbU93bnNEYXRhKHRydWUpLAotICAgICAgbU1ldGFEYXRhKG5ldyBNZXRhRGF0YSksCi0gICAgICBtT3JpZ2luYWwoTlVMTCkgewotICAgIGlmIChzaXplIDwga1NoYXJlZE1lbVRocmVzaG9sZAotICAgICAgICAgICAgfHwgc3RkOjphdG9taWNfbG9hZF9leHBsaWNpdCgmbVVzZVNoYXJlZE1lbW9yeSwgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCkgPT0gMCkgewotICAgICAgICBtRGF0YSA9IG1hbGxvYyhzaXplKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiY3JlYXRpbmcgbWVtb3J5RGVhbGVyIik7Ci0gICAgICAgIHNwPE1lbW9yeURlYWxlcj4gbWVtb3J5RGVhbGVyID0KLSAgICAgICAgICAgICAgICBuZXcgTWVtb3J5RGVhbGVyKHNpemUgKyBzaXplb2YoU2hhcmVkQ29udHJvbCksICJNZWRpYUJ1ZmZlciIpOwotICAgICAgICBtTWVtb3J5ID0gbWVtb3J5RGVhbGVyLT5hbGxvY2F0ZShzaXplICsgc2l6ZW9mKFNoYXJlZENvbnRyb2wpKTsKLSAgICAgICAgaWYgKG1NZW1vcnkgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byBhbGxvY2F0ZSBzaGFyZWQgbWVtb3J5LCB0cnlpbmcgcmVndWxhciBhbGxvY2F0aW9uISIpOwotICAgICAgICAgICAgbURhdGEgPSBtYWxsb2Moc2l6ZSk7Ci0gICAgICAgICAgICBpZiAobURhdGEgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJPdXQgb2YgbWVtb3J5Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBnZXRTaGFyZWRDb250cm9sKCktPmNsZWFyKCk7Ci0gICAgICAgICAgICBtRGF0YSA9ICh1aW50OF90ICopbU1lbW9yeS0+cG9pbnRlcigpICsgc2l6ZW9mKFNoYXJlZENvbnRyb2wpOwotICAgICAgICAgICAgQUxPR1YoIkFsbG9jYXRlZCBzaGFyZWQgbWVtIGJ1ZmZlciBvZiBzaXplICV6dSBAICVwIiwgc2l6ZSwgbURhdGEpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1NZWRpYUJ1ZmZlcjo6TWVkaWFCdWZmZXIoY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4mIGdyYXBoaWNCdWZmZXIpCi0gICAgOiBtT2JzZXJ2ZXIoTlVMTCksCi0gICAgICBtUmVmQ291bnQoMCksCi0gICAgICBtRGF0YShOVUxMKSwKLSAgICAgIG1TaXplKDEpLAotICAgICAgbVJhbmdlT2Zmc2V0KDApLAotICAgICAgbVJhbmdlTGVuZ3RoKG1TaXplKSwKLSAgICAgIG1HcmFwaGljQnVmZmVyKGdyYXBoaWNCdWZmZXIpLAotICAgICAgbU93bnNEYXRhKGZhbHNlKSwKLSAgICAgIG1NZXRhRGF0YShuZXcgTWV0YURhdGEpLAotICAgICAgbU9yaWdpbmFsKE5VTEwpIHsKLX0KLQotTWVkaWFCdWZmZXI6Ok1lZGlhQnVmZmVyKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpCi0gICAgOiBtT2JzZXJ2ZXIoTlVMTCksCi0gICAgICBtUmVmQ291bnQoMCksCi0gICAgICBtRGF0YShidWZmZXItPmRhdGEoKSksCi0gICAgICBtU2l6ZShidWZmZXItPnNpemUoKSksCi0gICAgICBtUmFuZ2VPZmZzZXQoMCksCi0gICAgICBtUmFuZ2VMZW5ndGgobVNpemUpLAotICAgICAgbUJ1ZmZlcihidWZmZXIpLAotICAgICAgbU93bnNEYXRhKGZhbHNlKSwKLSAgICAgIG1NZXRhRGF0YShuZXcgTWV0YURhdGEpLAotICAgICAgbU9yaWdpbmFsKE5VTEwpIHsKLX0KLQotdm9pZCBNZWRpYUJ1ZmZlcjo6cmVsZWFzZSgpIHsKLSAgICBpZiAobU9ic2VydmVyID09IE5VTEwpIHsKLSAgICAgICAgLy8gTGVnYWN5IGNvbnRyYWN0IGZvciBNZWRpYUJ1ZmZlciB3aXRob3V0IGEgTWVkaWFCdWZmZXJHcm91cC4KLSAgICAgICAgQ0hFQ0tfRVEobVJlZkNvdW50LCAwKTsKLSAgICAgICAgZGVsZXRlIHRoaXM7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpbnQgcHJldkNvdW50ID0gX19zeW5jX2ZldGNoX2FuZF9zdWIoJm1SZWZDb3VudCwgMSk7Ci0gICAgaWYgKHByZXZDb3VudCA9PSAxKSB7Ci0gICAgICAgIGlmIChtT2JzZXJ2ZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgZGVsZXRlIHRoaXM7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBtT2JzZXJ2ZXItPnNpZ25hbEJ1ZmZlclJldHVybmVkKHRoaXMpOwotICAgIH0KLSAgICBDSEVDSyhwcmV2Q291bnQgPiAwKTsKLX0KLQotdm9pZCBNZWRpYUJ1ZmZlcjo6Y2xhaW0oKSB7Ci0gICAgQ0hFQ0sobU9ic2VydmVyICE9IE5VTEwpOwotICAgIENIRUNLX0VRKG1SZWZDb3VudCwgMSk7Ci0KLSAgICBtUmVmQ291bnQgPSAwOwotfQotCi12b2lkIE1lZGlhQnVmZmVyOjphZGRfcmVmKCkgewotICAgICh2b2lkKSBfX3N5bmNfZmV0Y2hfYW5kX2FkZCgmbVJlZkNvdW50LCAxKTsKLX0KLQotdm9pZCAqTWVkaWFCdWZmZXI6OmRhdGEoKSBjb25zdCB7Ci0gICAgQ0hFQ0sobUdyYXBoaWNCdWZmZXIgPT0gTlVMTCk7Ci0gICAgcmV0dXJuIG1EYXRhOwotfQotCi1zaXplX3QgTWVkaWFCdWZmZXI6OnNpemUoKSBjb25zdCB7Ci0gICAgQ0hFQ0sobUdyYXBoaWNCdWZmZXIgPT0gTlVMTCk7Ci0gICAgcmV0dXJuIG1TaXplOwotfQotCi1zaXplX3QgTWVkaWFCdWZmZXI6OnJhbmdlX29mZnNldCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVJhbmdlT2Zmc2V0OwotfQotCi1zaXplX3QgTWVkaWFCdWZmZXI6OnJhbmdlX2xlbmd0aCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVJhbmdlTGVuZ3RoOwotfQotCi12b2lkIE1lZGlhQnVmZmVyOjpzZXRfcmFuZ2Uoc2l6ZV90IG9mZnNldCwgc2l6ZV90IGxlbmd0aCkgewotICAgIGlmICgobUdyYXBoaWNCdWZmZXIgPT0gTlVMTCkgJiYgKG9mZnNldCArIGxlbmd0aCA+IG1TaXplKSkgewotICAgICAgICBBTE9HRSgib2Zmc2V0ID0gJXp1LCBsZW5ndGggPSAlenUsIG1TaXplID0gJXp1Iiwgb2Zmc2V0LCBsZW5ndGgsIG1TaXplKTsKLSAgICB9Ci0gICAgQ0hFQ0soKG1HcmFwaGljQnVmZmVyICE9IE5VTEwpIHx8IChvZmZzZXQgKyBsZW5ndGggPD0gbVNpemUpKTsKLQotICAgIG1SYW5nZU9mZnNldCA9IG9mZnNldDsKLSAgICBtUmFuZ2VMZW5ndGggPSBsZW5ndGg7Ci19Ci0KLXNwPEdyYXBoaWNCdWZmZXI+IE1lZGlhQnVmZmVyOjpncmFwaGljQnVmZmVyKCkgY29uc3QgewotICAgIHJldHVybiBtR3JhcGhpY0J1ZmZlcjsKLX0KLQotc3A8TWV0YURhdGE+IE1lZGlhQnVmZmVyOjptZXRhX2RhdGEoKSB7Ci0gICAgcmV0dXJuIG1NZXRhRGF0YTsKLX0KLQotdm9pZCBNZWRpYUJ1ZmZlcjo6cmVzZXQoKSB7Ci0gICAgbU1ldGFEYXRhLT5jbGVhcigpOwotICAgIHNldF9yYW5nZSgwLCBtU2l6ZSk7Ci19Ci0KLU1lZGlhQnVmZmVyOjp+TWVkaWFCdWZmZXIoKSB7Ci0gICAgQ0hFQ0sobU9ic2VydmVyID09IE5VTEwpOwotCi0gICAgaWYgKG1Pd25zRGF0YSAmJiBtRGF0YSAhPSBOVUxMICYmIG1NZW1vcnkgPT0gTlVMTCkgewotICAgICAgICBmcmVlKG1EYXRhKTsKLSAgICAgICAgbURhdGEgPSBOVUxMOwotICAgIH0KLQotICAgIGlmIChtT3JpZ2luYWwgIT0gTlVMTCkgewotICAgICAgICBtT3JpZ2luYWwtPnJlbGVhc2UoKTsKLSAgICAgICAgbU9yaWdpbmFsID0gTlVMTDsKLSAgICB9Ci0KLSAgIGlmIChtTWVtb3J5LmdldCgpICE9IG51bGxwdHIpIHsKLSAgICAgICBnZXRTaGFyZWRDb250cm9sKCktPnNldERlYWRPYmplY3QoKTsKLSAgIH0KLX0KLQotdm9pZCBNZWRpYUJ1ZmZlcjo6c2V0T2JzZXJ2ZXIoTWVkaWFCdWZmZXJPYnNlcnZlciAqb2JzZXJ2ZXIpIHsKLSAgICBDSEVDSyhvYnNlcnZlciA9PSBOVUxMIHx8IG1PYnNlcnZlciA9PSBOVUxMKTsKLSAgICBtT2JzZXJ2ZXIgPSBvYnNlcnZlcjsKLX0KLQotTWVkaWFCdWZmZXIgKk1lZGlhQnVmZmVyOjpjbG9uZSgpIHsKLSAgICBDSEVDSyhtR3JhcGhpY0J1ZmZlciA9PSBOVUxMKTsKLQotICAgIE1lZGlhQnVmZmVyICpidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIobURhdGEsIG1TaXplKTsKLSAgICBidWZmZXItPnNldF9yYW5nZShtUmFuZ2VPZmZzZXQsIG1SYW5nZUxlbmd0aCk7Ci0gICAgYnVmZmVyLT5tTWV0YURhdGEgPSBuZXcgTWV0YURhdGEoKm1NZXRhRGF0YS5nZXQoKSk7Ci0KLSAgICBhZGRfcmVmKCk7Ci0gICAgYnVmZmVyLT5tT3JpZ2luYWwgPSB0aGlzOwotCi0gICAgcmV0dXJuIGJ1ZmZlcjsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFCdWZmZXJHcm91cC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhQnVmZmVyR3JvdXAuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjYyZDkyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFCdWZmZXJHcm91cC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiTWVkaWFCdWZmZXJHcm91cCIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gc3RkOjptaW4gaXMgbm90IGNvbnN0ZXhwciBpbiBDKysxMQotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLWNvbnN0ZXhwciBUIE1JTihjb25zdCBUICZhLCBjb25zdCBUICZiKSB7IHJldHVybiBhIDw9IGIgPyBhIDogYjsgfQotCi0vLyBNZWRpYUJ1ZmZlckdyb3VwIG1heSBjcmVhdGUgc2hhcmVkIG1lbW9yeSBidWZmZXJzIGF0IGEKLS8vIHNtYWxsZXIgdGhyZXNob2xkIHRoYW4gYW4gaXNvbGF0ZWQgbmV3IE1lZGlhQnVmZmVyLgotc3RhdGljIGNvbnN0IHNpemVfdCBrU2hhcmVkTWVtb3J5VGhyZXNob2xkID0gTUlOKAotICAgICAgICAoc2l6ZV90KU1lZGlhQnVmZmVyOjprU2hhcmVkTWVtVGhyZXNob2xkLCAoc2l6ZV90KSg0ICogMTAyNCkpOwotCi1NZWRpYUJ1ZmZlckdyb3VwOjpNZWRpYUJ1ZmZlckdyb3VwKHNpemVfdCBncm93dGhMaW1pdCkgOgotICAgIG1Hcm93dGhMaW1pdChncm93dGhMaW1pdCkgewotfQotCi1NZWRpYUJ1ZmZlckdyb3VwOjpNZWRpYUJ1ZmZlckdyb3VwKHNpemVfdCBidWZmZXJzLCBzaXplX3QgYnVmZmVyX3NpemUsIHNpemVfdCBncm93dGhMaW1pdCkKLSAgICA6IG1Hcm93dGhMaW1pdChncm93dGhMaW1pdCkgewotCi0gICAgaWYgKG1Hcm93dGhMaW1pdCA+IDAgJiYgYnVmZmVycyA+IG1Hcm93dGhMaW1pdCkgewotICAgICAgICBBTE9HVygiUHJlYWxsb2NhdGVkIGJ1ZmZlcnMgJXp1ID4gZ3Jvd3RoTGltaXQgJXp1LCBpbmNyZWFzaW5nIGdyb3d0aExpbWl0IiwKLSAgICAgICAgICAgICAgICBidWZmZXJzLCBtR3Jvd3RoTGltaXQpOwotICAgICAgICBtR3Jvd3RoTGltaXQgPSBidWZmZXJzOwotICAgIH0KLQotICAgIGlmIChidWZmZXJfc2l6ZSA+PSBrU2hhcmVkTWVtb3J5VGhyZXNob2xkKSB7Ci0gICAgICAgIEFMT0dEKCJjcmVhdGluZyBNZW1vcnlEZWFsZXIiKTsKLSAgICAgICAgLy8gVXNpbmcgYSBzaW5nbGUgTWVtb3J5RGVhbGVyIGlzIGVmZmljaWVudCBmb3IgYSBncm91cCBvZiBzaGFyZWQgbWVtb3J5IG9iamVjdHMuCi0gICAgICAgIC8vIFRoaXMgbG9vcCBndWFyYW50ZWVzIHRoYXQgd2UgdXNlIHNoYXJlZCBtZW1vcnkgKG5vIGZhbGxiYWNrIHRvIG1hbGxvYykuCi0KLSAgICAgICAgc2l6ZV90IGFsaWdubWVudCA9IE1lbW9yeURlYWxlcjo6Z2V0QWxsb2NhdGlvbkFsaWdubWVudCgpOwotICAgICAgICBzaXplX3QgYXVnbWVudGVkX3NpemUgPSBidWZmZXJfc2l6ZSArIHNpemVvZihNZWRpYUJ1ZmZlcjo6U2hhcmVkQ29udHJvbCk7Ci0gICAgICAgIHNpemVfdCB0b3RhbCA9IChhdWdtZW50ZWRfc2l6ZSArIGFsaWdubWVudCAtIDEpIC8gYWxpZ25tZW50ICogYWxpZ25tZW50ICogYnVmZmVyczsKLSAgICAgICAgc3A8TWVtb3J5RGVhbGVyPiBtZW1vcnlEZWFsZXIgPSBuZXcgTWVtb3J5RGVhbGVyKHRvdGFsLCAiTWVkaWFCdWZmZXJHcm91cCIpOwotCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYnVmZmVyczsgKytpKSB7Ci0gICAgICAgICAgICBzcDxJTWVtb3J5PiBtZW0gPSBtZW1vcnlEZWFsZXItPmFsbG9jYXRlKGF1Z21lbnRlZF9zaXplKTsKLSAgICAgICAgICAgIGlmIChtZW0uZ2V0KCkgPT0gbnVsbHB0ciB8fCBtZW0tPnBvaW50ZXIoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIk9ubHkgYWxsb2NhdGVkICV6dSBzaGFyZWQgYnVmZmVycyBvZiBzaXplICV6dSIsIGksIGJ1ZmZlcl9zaXplKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIobWVtKTsKLSAgICAgICAgICAgIGJ1ZmZlci0+Z2V0U2hhcmVkQ29udHJvbCgpLT5jbGVhcigpOwotICAgICAgICAgICAgYWRkX2J1ZmZlcihidWZmZXIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBOb24tc2hhcmVkIG1lbW9yeSBhbGxvY2F0aW9uLgotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYnVmZmVyczsgKytpKSB7Ci0gICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoYnVmZmVyX3NpemUpOwotICAgICAgICBpZiAoYnVmZmVyLT5kYXRhKCkgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgZGVsZXRlIGJ1ZmZlcjsgLy8gZG9uJ3QgY2FsbCByZWxlYXNlLCBpdCdzIG5vdCBwcm9wZXJseSBmb3JtZWQKLSAgICAgICAgICAgIEFMT0dXKCJPbmx5IGFsbG9jYXRlZCAlenUgbWFsbG9jIGJ1ZmZlcnMgb2Ygc2l6ZSAlenUiLCBpLCBidWZmZXJfc2l6ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBhZGRfYnVmZmVyKGJ1ZmZlcik7Ci0gICAgfQotfQotCi1NZWRpYUJ1ZmZlckdyb3VwOjp+TWVkaWFCdWZmZXJHcm91cCgpIHsKLSAgICBmb3IgKE1lZGlhQnVmZmVyICpidWZmZXIgOiBtQnVmZmVycykgewotICAgICAgICBpZiAoYnVmZmVyLT5yZWZjb3VudCgpICE9IDApIHsKLSAgICAgICAgICAgIGNvbnN0IGludCBsb2NhbFJlZmNvdW50ID0gYnVmZmVyLT5sb2NhbFJlZmNvdW50KCk7Ci0gICAgICAgICAgICBjb25zdCBpbnQgcmVtb3RlUmVmY291bnQgPSBidWZmZXItPnJlbW90ZVJlZmNvdW50KCk7Ci0KLSAgICAgICAgICAgIC8vIEZhdGFsIGlmIHdlIGhhdmUgYSBsb2NhbCByZWZjb3VudC4KLSAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobG9jYWxSZWZjb3VudCAhPSAwLAotICAgICAgICAgICAgICAgICAgICAiYnVmZmVyKCVwKSBsb2NhbFJlZmNvdW50ICVkICE9IDAsIHJlbW90ZVJlZmNvdW50ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBsb2NhbFJlZmNvdW50LCByZW1vdGVSZWZjb3VudCk7Ci0KLSAgICAgICAgICAgIC8vIExvZyBhbiBlcnJvciBpZiB3ZSBoYXZlIGEgcmVtYWluaW5nIHJlbW90ZSByZWZjb3VudCwKLSAgICAgICAgICAgIC8vIGFzIHRoZSByZW1vdGUgcHJvY2VzcyBtYXkgaGF2ZSBkaWVkIG9yIG1heSBoYXZlIGluYXBwcm9wcmlhdGUgYmVoYXZpb3IuCi0gICAgICAgICAgICAvLyBUaGUgc2hhcmVkIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIE1lZGlhQnVmZmVyIHdpbGwKLSAgICAgICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgYmUgcmVjbGFpbWVkIHdoZW4gdGhlcmUgYXJlIG5vIHJlbWFpbmluZyBmZHMKLSAgICAgICAgICAgIC8vIGFzc29jaWF0ZWQgd2l0aCBpdC4KLSAgICAgICAgICAgIEFMT0dFKCJidWZmZXIoJXApIGhhcyByZXNpZHVhbCByZW1vdGVSZWZjb3VudCAlZCIsCi0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgcmVtb3RlUmVmY291bnQpOwotICAgICAgICB9Ci0gICAgICAgIC8vIGdyYWNlZnVsbHkgZGVsZXRlLgotICAgICAgICBidWZmZXItPnNldE9ic2VydmVyKG51bGxwdHIpOwotICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICB9Ci19Ci0KLXZvaWQgTWVkaWFCdWZmZXJHcm91cDo6YWRkX2J1ZmZlcihNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIC8vIGlmIHdlJ3JlIGFib3ZlIG91ciBncm93dGggbGltaXQsIHJlbGVhc2UgYnVmZmVycyBpZiB3ZSBjYW4KLSAgICBmb3IgKGF1dG8gaXQgPSBtQnVmZmVycy5iZWdpbigpOwotICAgICAgICAgICAgbUdyb3d0aExpbWl0ID4gMAotICAgICAgICAgICAgJiYgbUJ1ZmZlcnMuc2l6ZSgpID49IG1Hcm93dGhMaW1pdAotICAgICAgICAgICAgJiYgaXQgIT0gbUJ1ZmZlcnMuZW5kKCk7KSB7Ci0gICAgICAgIGlmICgoKml0KS0+cmVmY291bnQoKSA9PSAwKSB7Ci0gICAgICAgICAgICAoKml0KS0+c2V0T2JzZXJ2ZXIobnVsbHB0cik7Ci0gICAgICAgICAgICAoKml0KS0+cmVsZWFzZSgpOwotICAgICAgICAgICAgaXQgPSBtQnVmZmVycy5lcmFzZShpdCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICArK2l0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYnVmZmVyLT5zZXRPYnNlcnZlcih0aGlzKTsKLSAgICBtQnVmZmVycy5lbXBsYWNlX2JhY2soYnVmZmVyKTsKLX0KLQotYm9vbCBNZWRpYUJ1ZmZlckdyb3VwOjpoYXNfYnVmZmVycygpIHsKLSAgICBpZiAobUJ1ZmZlcnMuc2l6ZSgpIDwgbUdyb3d0aExpbWl0KSB7Ci0gICAgICAgIHJldHVybiB0cnVlOyAvLyBXZSBjYW4gYWRkIG1vcmUgYnVmZmVycyBpbnRlcm5hbGx5LgotICAgIH0KLSAgICBmb3IgKE1lZGlhQnVmZmVyICpidWZmZXIgOiBtQnVmZmVycykgewotICAgICAgICBpZiAoYnVmZmVyLT5yZWZjb3VudCgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdHVzX3QgTWVkaWFCdWZmZXJHcm91cDo6YWNxdWlyZV9idWZmZXIoCi0gICAgICAgIE1lZGlhQnVmZmVyICoqb3V0LCBib29sIG5vbkJsb2NraW5nLCBzaXplX3QgcmVxdWVzdGVkU2l6ZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgZm9yICg7OykgewotICAgICAgICBzaXplX3Qgc21hbGxlc3QgPSByZXF1ZXN0ZWRTaXplOwotICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyID0gbnVsbHB0cjsKLSAgICAgICAgYXV0byBmcmVlID0gbUJ1ZmZlcnMuZW5kKCk7Ci0gICAgICAgIGZvciAoYXV0byBpdCA9IG1CdWZmZXJzLmJlZ2luKCk7IGl0ICE9IG1CdWZmZXJzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgICAgICBpZiAoKCppdCktPnJlZmNvdW50KCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBzaXplID0gKCppdCktPnNpemUoKTsKLSAgICAgICAgICAgICAgICBpZiAoc2l6ZSA+PSByZXF1ZXN0ZWRTaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9ICppdDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzaXplIDwgc21hbGxlc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgc21hbGxlc3QgPSBzaXplOyAvLyBhbHdheXMgZnJlZSB0aGUgc21hbGxlc3QgYnVmCi0gICAgICAgICAgICAgICAgICAgIGZyZWUgPSBpdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxscHRyCi0gICAgICAgICAgICAgICAgJiYgKGZyZWUgIT0gbUJ1ZmZlcnMuZW5kKCkgfHwgbUJ1ZmZlcnMuc2l6ZSgpIDwgbUdyb3d0aExpbWl0KSkgewotICAgICAgICAgICAgLy8gV2UgYWxsb2MgYmVmb3JlIHdlIGZyZWUgc28gZmFpbHVyZSBsZWF2ZXMgZ3JvdXAgdW5jaGFuZ2VkLgotICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGFsbG9jYXRlU2l6ZSA9IHJlcXVlc3RlZFNpemUgPCBTSVpFX01BWCAvIDMgKiAyIC8qIE5COiBvcmRlcmluZyAqLyA/Ci0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZFNpemUgKiAzIC8gMiA6IHJlcXVlc3RlZFNpemU7Ci0gICAgICAgICAgICBidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoYWxsb2NhdGVTaXplKTsKLSAgICAgICAgICAgIGlmIChidWZmZXItPmRhdGEoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkFsbG9jYXRpb24gZmFpbHVyZSBmb3Igc2l6ZSAlenUiLCBhbGxvY2F0ZVNpemUpOwotICAgICAgICAgICAgICAgIGRlbGV0ZSBidWZmZXI7IC8vIEludmFsaWQgYWxsb2MsIHByZWZlciBub3QgdG8gY2FsbCByZWxlYXNlLgotICAgICAgICAgICAgICAgIGJ1ZmZlciA9IG51bGxwdHI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0T2JzZXJ2ZXIodGhpcyk7Ci0gICAgICAgICAgICAgICAgaWYgKGZyZWUgIT0gbUJ1ZmZlcnMuZW5kKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoInJlYWxsb2NhdGUgYnVmZmVyLCByZXF1ZXN0ZWQgc2l6ZSAlenUgdnMgYXZhaWxhYmxlICV6dSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkU2l6ZSwgKCpmcmVlKS0+c2l6ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgKCpmcmVlKS0+c2V0T2JzZXJ2ZXIobnVsbHB0cik7Ci0gICAgICAgICAgICAgICAgICAgICgqZnJlZSktPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgKmZyZWUgPSBidWZmZXI7IC8vIGluLXBsYWNlIHJlcGxhY2UKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiYWxsb2NhdGUgYnVmZmVyLCByZXF1ZXN0ZWQgc2l6ZSAlenUiLCByZXF1ZXN0ZWRTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlcnMuZW1wbGFjZV9iYWNrKGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChidWZmZXIgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgYnVmZmVyLT5hZGRfcmVmKCk7Ci0gICAgICAgICAgICBidWZmZXItPnJlc2V0KCk7Ci0gICAgICAgICAgICAqb3V0ID0gYnVmZmVyOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0gICAgICAgIGlmIChub25CbG9ja2luZykgewotICAgICAgICAgICAgKm91dCA9IG51bGxwdHI7Ci0gICAgICAgICAgICByZXR1cm4gV09VTERfQkxPQ0s7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQWxsIGJ1ZmZlcnMgYXJlIGluIHVzZSwgYmxvY2sgdW50aWwgb25lIG9mIHRoZW0gaXMgcmV0dXJuZWQuCi0gICAgICAgIG1Db25kaXRpb24ud2FpdChtTG9jayk7Ci0gICAgfQotICAgIC8vIE5ldmVyIGdldHMgaGVyZS4KLX0KLQotdm9pZCBNZWRpYUJ1ZmZlckdyb3VwOjpzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlciAqKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBtQ29uZGl0aW9uLnNpZ25hbCgpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2OTVjNzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5jcHAKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0lNQUdFX0pQRUcgPSAiaW1hZ2UvanBlZyI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMgPSAiaW1hZ2Uvdm5kLmFuZHJvaWQuaGVpYyI7CisKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOCA9ICJ2aWRlby94LXZuZC5vbjIudnA4IjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOSA9ICJ2aWRlby94LXZuZC5vbjIudnA5IjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyA9ICJ2aWRlby9hdmMiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQyA9ICJ2aWRlby9oZXZjIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0ID0gInZpZGVvL21wNHYtZXMiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MyA9ICJ2aWRlby8zZ3BwIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyID0gInZpZGVvL21wZWcyIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1JBVyA9ICJ2aWRlby9yYXciOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fRE9MQllfVklTSU9OID0gInZpZGVvL2RvbGJ5LXZpc2lvbiI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19TQ1JBTUJMRUQgPSAidmlkZW8vc2NyYW1ibGVkIjsKKworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CID0gImF1ZGlvLzNncHAiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCID0gImF1ZGlvL2Ftci13YiI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHID0gImF1ZGlvL21wZWciOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR19MQVlFUl9JID0gImF1ZGlvL21wZWctTDEiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR19MQVlFUl9JSSA9ICJhdWRpby9tcGVnLUwyIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX01JREkgPSAiYXVkaW8vbWlkaSI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUMgPSAiYXVkaW8vbXA0YS1sYXRtIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX1FDRUxQID0gImF1ZGlvL3FjZWxwIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUyA9ICJhdWRpby92b3JiaXMiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUyA9ICJhdWRpby9vcHVzIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfQUxBVyA9ICJhdWRpby9nNzExLWFsYXciOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9NTEFXID0gImF1ZGlvL2c3MTEtbWxhdyI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19SQVcgPSAiYXVkaW8vcmF3IjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMgPSAiYXVkaW8vZmxhYyI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUUyA9ICJhdWRpby9hYWMtYWR0cyI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19NU0dTTSA9ICJhdWRpby9nc20iOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUMzID0gImF1ZGlvL2FjMyI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzID0gImF1ZGlvL2VhYzMiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fU0NSQU1CTEVEID0gImF1ZGlvL3NjcmFtYmxlZCI7CisKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHNCA9ICJ2aWRlby9tcDQiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX1dBViA9ICJhdWRpby94LXdhdiI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfT0dHID0gImFwcGxpY2F0aW9uL29nZyI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTUFUUk9TS0EgPSAidmlkZW8veC1tYXRyb3NrYSI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzJUUyA9ICJ2aWRlby9tcDJ0cyI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfQVZJID0gInZpZGVvL2F2aSI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzJQUyA9ICJ2aWRlby9tcDJwIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9IRUlGID0gImltYWdlL2hlaWYiOworCitjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9URVhUXzNHUFAgPSAidGV4dC8zZ3BwLXR0IjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1RFWFRfU1VCUklQID0gImFwcGxpY2F0aW9uL3gtc3VicmlwIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1RFWFRfVlRUID0gInRleHQvdnR0IjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1RFWFRfQ0VBXzYwOCA9ICJ0ZXh0L2NlYS02MDgiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVEVYVF9DRUFfNzA4ID0gInRleHQvY2VhLTcwOCI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9EQVRBX1RJTUVEX0lEMyA9ICJhcHBsaWNhdGlvbi94LWlkM3Y0IjsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFLZXlzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFLZXlzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzkyMGM5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUtleXMuY3BwCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUtleXMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdCBjaGFyICpjb25zdCBrSVN0cmVhbUxpc3RlbmVyS2V5RGlzY29udGludWl0eU1hc2sgPSAiZGlzY29udGludWl0eS1tYXNrIjsKK2NvbnN0IGNoYXIgKmNvbnN0IGtBVFNQYXJzZXJLZXlSZXN1bWVBdFBUUyA9ICJyZXN1bWUtYXQtUFRTIjsKK2NvbnN0IGNoYXIgKmNvbnN0IGtBVFNQYXJzZXJLZXlNZWRpYVRpbWVVcyA9ICJtZWRpYS10aW1lLXVzIjsKK2NvbnN0IGNoYXIgKmNvbnN0IGtBVFNQYXJzZXJLZXlSZWNlbnRNZWRpYVRpbWVVcyA9ICJyZWNlbnQtbWVkaWEtdGltZS11cyI7CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01ldGFEYXRhLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWV0YURhdGEuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODk2NWYwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWV0YURhdGEuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDg2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIk1ldGFEYXRhIgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1NZXRhRGF0YTo6TWV0YURhdGEoKSB7Ci19Ci0KLU1ldGFEYXRhOjpNZXRhRGF0YShjb25zdCBNZXRhRGF0YSAmZnJvbSkKLSAgICA6IFJlZkJhc2UoKSwKLSAgICAgIG1JdGVtcyhmcm9tLm1JdGVtcykgewotfQotCi1NZXRhRGF0YTo6fk1ldGFEYXRhKCkgewotICAgIGNsZWFyKCk7Ci19Ci0KLXZvaWQgTWV0YURhdGE6OmNsZWFyKCkgewotICAgIG1JdGVtcy5jbGVhcigpOwotfQotCi1ib29sIE1ldGFEYXRhOjpyZW1vdmUodWludDMyX3Qga2V5KSB7Ci0gICAgc3NpemVfdCBpID0gbUl0ZW1zLmluZGV4T2ZLZXkoa2V5KTsKLQotICAgIGlmIChpIDwgMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgbUl0ZW1zLnJlbW92ZUl0ZW1zQXQoaSk7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBNZXRhRGF0YTo6c2V0Q1N0cmluZyh1aW50MzJfdCBrZXksIGNvbnN0IGNoYXIgKnZhbHVlKSB7Ci0gICAgcmV0dXJuIHNldERhdGEoa2V5LCBUWVBFX0NfU1RSSU5HLCB2YWx1ZSwgc3RybGVuKHZhbHVlKSArIDEpOwotfQotCi1ib29sIE1ldGFEYXRhOjpzZXRJbnQzMih1aW50MzJfdCBrZXksIGludDMyX3QgdmFsdWUpIHsKLSAgICByZXR1cm4gc2V0RGF0YShrZXksIFRZUEVfSU5UMzIsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7Ci19Ci0KLWJvb2wgTWV0YURhdGE6OnNldEludDY0KHVpbnQzMl90IGtleSwgaW50NjRfdCB2YWx1ZSkgewotICAgIHJldHVybiBzZXREYXRhKGtleSwgVFlQRV9JTlQ2NCwgJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKLX0KLQotYm9vbCBNZXRhRGF0YTo6c2V0RmxvYXQodWludDMyX3Qga2V5LCBmbG9hdCB2YWx1ZSkgewotICAgIHJldHVybiBzZXREYXRhKGtleSwgVFlQRV9GTE9BVCwgJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKLX0KLQotYm9vbCBNZXRhRGF0YTo6c2V0UG9pbnRlcih1aW50MzJfdCBrZXksIHZvaWQgKnZhbHVlKSB7Ci0gICAgcmV0dXJuIHNldERhdGEoa2V5LCBUWVBFX1BPSU5URVIsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7Ci19Ci0KLWJvb2wgTWV0YURhdGE6OnNldFJlY3QoCi0gICAgICAgIHVpbnQzMl90IGtleSwKLSAgICAgICAgaW50MzJfdCBsZWZ0LCBpbnQzMl90IHRvcCwKLSAgICAgICAgaW50MzJfdCByaWdodCwgaW50MzJfdCBib3R0b20pIHsKLSAgICBSZWN0IHI7Ci0gICAgci5tTGVmdCA9IGxlZnQ7Ci0gICAgci5tVG9wID0gdG9wOwotICAgIHIubVJpZ2h0ID0gcmlnaHQ7Ci0gICAgci5tQm90dG9tID0gYm90dG9tOwotCi0gICAgcmV0dXJuIHNldERhdGEoa2V5LCBUWVBFX1JFQ1QsICZyLCBzaXplb2YocikpOwotfQotCi0vKioKLSAqIE5vdGUgdGhhdCB0aGUgcmV0dXJuZWQgcG9pbnRlciBiZWNvbWVzIGludmFsaWQgd2hlbiBhZGRpdGlvbmFsIG1ldGFkYXRhIGlzIHNldC4KLSAqLwotYm9vbCBNZXRhRGF0YTo6ZmluZENTdHJpbmcodWludDMyX3Qga2V5LCBjb25zdCBjaGFyICoqdmFsdWUpIHsKLSAgICB1aW50MzJfdCB0eXBlOwotICAgIGNvbnN0IHZvaWQgKmRhdGE7Ci0gICAgc2l6ZV90IHNpemU7Ci0gICAgaWYgKCFmaW5kRGF0YShrZXksICZ0eXBlLCAmZGF0YSwgJnNpemUpIHx8IHR5cGUgIT0gVFlQRV9DX1NUUklORykgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgKnZhbHVlID0gKGNvbnN0IGNoYXIgKilkYXRhOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgTWV0YURhdGE6OmZpbmRJbnQzMih1aW50MzJfdCBrZXksIGludDMyX3QgKnZhbHVlKSB7Ci0gICAgdWludDMyX3QgdHlwZSA9IDA7Ci0gICAgY29uc3Qgdm9pZCAqZGF0YTsKLSAgICBzaXplX3Qgc2l6ZTsKLSAgICBpZiAoIWZpbmREYXRhKGtleSwgJnR5cGUsICZkYXRhLCAmc2l6ZSkgfHwgdHlwZSAhPSBUWVBFX0lOVDMyKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBDSEVDS19FUShzaXplLCBzaXplb2YoKnZhbHVlKSk7Ci0KLSAgICAqdmFsdWUgPSAqKGludDMyX3QgKilkYXRhOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgTWV0YURhdGE6OmZpbmRJbnQ2NCh1aW50MzJfdCBrZXksIGludDY0X3QgKnZhbHVlKSB7Ci0gICAgdWludDMyX3QgdHlwZSA9IDA7Ci0gICAgY29uc3Qgdm9pZCAqZGF0YTsKLSAgICBzaXplX3Qgc2l6ZTsKLSAgICBpZiAoIWZpbmREYXRhKGtleSwgJnR5cGUsICZkYXRhLCAmc2l6ZSkgfHwgdHlwZSAhPSBUWVBFX0lOVDY0KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBDSEVDS19FUShzaXplLCBzaXplb2YoKnZhbHVlKSk7Ci0KLSAgICAqdmFsdWUgPSAqKGludDY0X3QgKilkYXRhOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgTWV0YURhdGE6OmZpbmRGbG9hdCh1aW50MzJfdCBrZXksIGZsb2F0ICp2YWx1ZSkgewotICAgIHVpbnQzMl90IHR5cGUgPSAwOwotICAgIGNvbnN0IHZvaWQgKmRhdGE7Ci0gICAgc2l6ZV90IHNpemU7Ci0gICAgaWYgKCFmaW5kRGF0YShrZXksICZ0eXBlLCAmZGF0YSwgJnNpemUpIHx8IHR5cGUgIT0gVFlQRV9GTE9BVCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQ0hFQ0tfRVEoc2l6ZSwgc2l6ZW9mKCp2YWx1ZSkpOwotCi0gICAgKnZhbHVlID0gKihmbG9hdCAqKWRhdGE7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBNZXRhRGF0YTo6ZmluZFBvaW50ZXIodWludDMyX3Qga2V5LCB2b2lkICoqdmFsdWUpIHsKLSAgICB1aW50MzJfdCB0eXBlID0gMDsKLSAgICBjb25zdCB2b2lkICpkYXRhOwotICAgIHNpemVfdCBzaXplOwotICAgIGlmICghZmluZERhdGEoa2V5LCAmdHlwZSwgJmRhdGEsICZzaXplKSB8fCB0eXBlICE9IFRZUEVfUE9JTlRFUikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQ0hFQ0tfRVEoc2l6ZSwgc2l6ZW9mKCp2YWx1ZSkpOwotCi0gICAgKnZhbHVlID0gKih2b2lkICoqKWRhdGE7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBNZXRhRGF0YTo6ZmluZFJlY3QoCi0gICAgICAgIHVpbnQzMl90IGtleSwKLSAgICAgICAgaW50MzJfdCAqbGVmdCwgaW50MzJfdCAqdG9wLAotICAgICAgICBpbnQzMl90ICpyaWdodCwgaW50MzJfdCAqYm90dG9tKSB7Ci0gICAgdWludDMyX3QgdHlwZSA9IDA7Ci0gICAgY29uc3Qgdm9pZCAqZGF0YTsKLSAgICBzaXplX3Qgc2l6ZTsKLSAgICBpZiAoIWZpbmREYXRhKGtleSwgJnR5cGUsICZkYXRhLCAmc2l6ZSkgfHwgdHlwZSAhPSBUWVBFX1JFQ1QpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIENIRUNLX0VRKHNpemUsIHNpemVvZihSZWN0KSk7Ci0KLSAgICBjb25zdCBSZWN0ICpyID0gKGNvbnN0IFJlY3QgKilkYXRhOwotICAgICpsZWZ0ID0gci0+bUxlZnQ7Ci0gICAgKnRvcCA9IHItPm1Ub3A7Ci0gICAgKnJpZ2h0ID0gci0+bVJpZ2h0OwotICAgICpib3R0b20gPSByLT5tQm90dG9tOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgTWV0YURhdGE6OnNldERhdGEoCi0gICAgICAgIHVpbnQzMl90IGtleSwgdWludDMyX3QgdHlwZSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBib29sIG92ZXJ3cm90ZV9leGlzdGluZyA9IHRydWU7Ci0KLSAgICBzc2l6ZV90IGkgPSBtSXRlbXMuaW5kZXhPZktleShrZXkpOwotICAgIGlmIChpIDwgMCkgewotICAgICAgICB0eXBlZF9kYXRhIGl0ZW07Ci0gICAgICAgIGkgPSBtSXRlbXMuYWRkKGtleSwgaXRlbSk7Ci0KLSAgICAgICAgb3Zlcndyb3RlX2V4aXN0aW5nID0gZmFsc2U7Ci0gICAgfQotCi0gICAgdHlwZWRfZGF0YSAmaXRlbSA9IG1JdGVtcy5lZGl0VmFsdWVBdChpKTsKLQotICAgIGl0ZW0uc2V0RGF0YSh0eXBlLCBkYXRhLCBzaXplKTsKLQotICAgIHJldHVybiBvdmVyd3JvdGVfZXhpc3Rpbmc7Ci19Ci0KLWJvb2wgTWV0YURhdGE6OmZpbmREYXRhKHVpbnQzMl90IGtleSwgdWludDMyX3QgKnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICoqZGF0YSwgc2l6ZV90ICpzaXplKSBjb25zdCB7Ci0gICAgc3NpemVfdCBpID0gbUl0ZW1zLmluZGV4T2ZLZXkoa2V5KTsKLQotICAgIGlmIChpIDwgMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgY29uc3QgdHlwZWRfZGF0YSAmaXRlbSA9IG1JdGVtcy52YWx1ZUF0KGkpOwotCi0gICAgaXRlbS5nZXREYXRhKHR5cGUsIGRhdGEsIHNpemUpOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgTWV0YURhdGE6Omhhc0RhdGEodWludDMyX3Qga2V5KSBjb25zdCB7Ci0gICAgc3NpemVfdCBpID0gbUl0ZW1zLmluZGV4T2ZLZXkoa2V5KTsKLQotICAgIGlmIChpIDwgMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLU1ldGFEYXRhOjp0eXBlZF9kYXRhOjp0eXBlZF9kYXRhKCkKLSAgICA6IG1UeXBlKDApLAotICAgICAgbVNpemUoMCkgewotfQotCi1NZXRhRGF0YTo6dHlwZWRfZGF0YTo6fnR5cGVkX2RhdGEoKSB7Ci0gICAgY2xlYXIoKTsKLX0KLQotTWV0YURhdGE6OnR5cGVkX2RhdGE6OnR5cGVkX2RhdGEoY29uc3QgdHlwZWRfZGF0YSAmZnJvbSkKLSAgICA6IG1UeXBlKGZyb20ubVR5cGUpLAotICAgICAgbVNpemUoMCkgewotCi0gICAgdm9pZCAqZHN0ID0gYWxsb2NhdGVTdG9yYWdlKGZyb20ubVNpemUpOwotICAgIGlmIChkc3QpIHsKLSAgICAgICAgbWVtY3B5KGRzdCwgZnJvbS5zdG9yYWdlKCksIG1TaXplKTsKLSAgICB9Ci19Ci0KLU1ldGFEYXRhOjp0eXBlZF9kYXRhICZNZXRhRGF0YTo6dHlwZWRfZGF0YTo6b3BlcmF0b3I9KAotICAgICAgICBjb25zdCBNZXRhRGF0YTo6dHlwZWRfZGF0YSAmZnJvbSkgewotICAgIGlmICh0aGlzICE9ICZmcm9tKSB7Ci0gICAgICAgIGNsZWFyKCk7Ci0gICAgICAgIG1UeXBlID0gZnJvbS5tVHlwZTsKLSAgICAgICAgdm9pZCAqZHN0ID0gYWxsb2NhdGVTdG9yYWdlKGZyb20ubVNpemUpOwotICAgICAgICBpZiAoZHN0KSB7Ci0gICAgICAgICAgICBtZW1jcHkoZHN0LCBmcm9tLnN0b3JhZ2UoKSwgbVNpemUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuICp0aGlzOwotfQotCi12b2lkIE1ldGFEYXRhOjp0eXBlZF9kYXRhOjpjbGVhcigpIHsKLSAgICBmcmVlU3RvcmFnZSgpOwotCi0gICAgbVR5cGUgPSAwOwotfQotCi12b2lkIE1ldGFEYXRhOjp0eXBlZF9kYXRhOjpzZXREYXRhKAotICAgICAgICB1aW50MzJfdCB0eXBlLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIGNsZWFyKCk7Ci0KLSAgICBtVHlwZSA9IHR5cGU7Ci0KLSAgICB2b2lkICpkc3QgPSBhbGxvY2F0ZVN0b3JhZ2Uoc2l6ZSk7Ci0gICAgaWYgKGRzdCkgewotICAgICAgICBtZW1jcHkoZHN0LCBkYXRhLCBzaXplKTsKLSAgICB9Ci19Ci0KLXZvaWQgTWV0YURhdGE6OnR5cGVkX2RhdGE6OmdldERhdGEoCi0gICAgICAgIHVpbnQzMl90ICp0eXBlLCBjb25zdCB2b2lkICoqZGF0YSwgc2l6ZV90ICpzaXplKSBjb25zdCB7Ci0gICAgKnR5cGUgPSBtVHlwZTsKLSAgICAqc2l6ZSA9IG1TaXplOwotICAgICpkYXRhID0gc3RvcmFnZSgpOwotfQotCi12b2lkICpNZXRhRGF0YTo6dHlwZWRfZGF0YTo6YWxsb2NhdGVTdG9yYWdlKHNpemVfdCBzaXplKSB7Ci0gICAgbVNpemUgPSBzaXplOwotCi0gICAgaWYgKHVzZXNSZXNlcnZvaXIoKSkgewotICAgICAgICByZXR1cm4gJnUucmVzZXJ2b2lyOwotICAgIH0KLQotICAgIHUuZXh0X2RhdGEgPSBtYWxsb2MobVNpemUpOwotICAgIGlmICh1LmV4dF9kYXRhID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIkNvdWxkbid0IGFsbG9jYXRlICV6dSBieXRlcyBmb3IgaXRlbSIsIHNpemUpOwotICAgICAgICBtU2l6ZSA9IDA7Ci0gICAgfQotICAgIHJldHVybiB1LmV4dF9kYXRhOwotfQotCi12b2lkIE1ldGFEYXRhOjp0eXBlZF9kYXRhOjpmcmVlU3RvcmFnZSgpIHsKLSAgICBpZiAoIXVzZXNSZXNlcnZvaXIoKSkgewotICAgICAgICBpZiAodS5leHRfZGF0YSkgewotICAgICAgICAgICAgZnJlZSh1LmV4dF9kYXRhKTsKLSAgICAgICAgICAgIHUuZXh0X2RhdGEgPSBOVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgbVNpemUgPSAwOwotfQotCi1TdHJpbmc4IE1ldGFEYXRhOjp0eXBlZF9kYXRhOjphc1N0cmluZyhib29sIHZlcmJvc2UpIGNvbnN0IHsKLSAgICBTdHJpbmc4IG91dDsKLSAgICBjb25zdCB2b2lkICpkYXRhID0gc3RvcmFnZSgpOwotICAgIHN3aXRjaChtVHlwZSkgewotICAgICAgICBjYXNlIFRZUEVfTk9ORToKLSAgICAgICAgICAgIG91dCA9IFN0cmluZzg6OmZvcm1hdCgibm8gdHlwZSwgc2l6ZSAlenUpIiwgbVNpemUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFlQRV9DX1NUUklORzoKLSAgICAgICAgICAgIG91dCA9IFN0cmluZzg6OmZvcm1hdCgiKGNoYXIqKSAlcyIsIChjb25zdCBjaGFyICopZGF0YSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUWVBFX0lOVDMyOgotICAgICAgICAgICAgb3V0ID0gU3RyaW5nODo6Zm9ybWF0KCIoaW50MzJfdCkgJWQiLCAqKGludDMyX3QgKilkYXRhKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRZUEVfSU5UNjQ6Ci0gICAgICAgICAgICBvdXQgPSBTdHJpbmc4Ojpmb3JtYXQoIihpbnQ2NF90KSAlIiBQUklkNjQsICooaW50NjRfdCAqKWRhdGEpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFlQRV9GTE9BVDoKLSAgICAgICAgICAgIG91dCA9IFN0cmluZzg6OmZvcm1hdCgiKGZsb2F0KSAlZiIsICooZmxvYXQgKilkYXRhKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRZUEVfUE9JTlRFUjoKLSAgICAgICAgICAgIG91dCA9IFN0cmluZzg6OmZvcm1hdCgiKHZvaWQqKSAlcCIsICoodm9pZCAqKilkYXRhKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRZUEVfUkVDVDoKLSAgICAgICAgewotICAgICAgICAgICAgY29uc3QgUmVjdCAqciA9IChjb25zdCBSZWN0ICopZGF0YTsKLSAgICAgICAgICAgIG91dCA9IFN0cmluZzg6OmZvcm1hdCgiUmVjdCglZCwgJWQsICVkLCAlZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPm1MZWZ0LCByLT5tVG9wLCByLT5tUmlnaHQsIHItPm1Cb3R0b20pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgb3V0ID0gU3RyaW5nODo6Zm9ybWF0KCIodW5rbm93biB0eXBlICVkLCBzaXplICV6dSkiLCBtVHlwZSwgbVNpemUpOwotICAgICAgICAgICAgaWYgKHZlcmJvc2UgJiYgbVNpemUgPD0gNDgpIHsgLy8gaWYgaXQncyBsZXNzIHRoYW4gdGhyZWUgbGluZXMgb2YgaGV4IGRhdGEsIGR1bXAgaXQKLSAgICAgICAgICAgICAgICBBU3RyaW5nIGZvbzsKLSAgICAgICAgICAgICAgICBoZXhkdW1wKGRhdGEsIG1TaXplLCAwLCAmZm9vKTsKLSAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCJcbiIpOwotICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoZm9vLmNfc3RyKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiBvdXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIE1ha2VGb3VyQ0NTdHJpbmcodWludDMyX3QgeCwgY2hhciAqcykgewotICAgIHNbMF0gPSB4ID4+IDI0OwotICAgIHNbMV0gPSAoeCA+PiAxNikgJiAweGZmOwotICAgIHNbMl0gPSAoeCA+PiA4KSAmIDB4ZmY7Ci0gICAgc1szXSA9IHggJiAweGZmOwotICAgIHNbNF0gPSAnXDAnOwotfQotCi1TdHJpbmc4IE1ldGFEYXRhOjp0b1N0cmluZygpIGNvbnN0IHsKLSAgICBTdHJpbmc4IHM7Ci0gICAgZm9yIChpbnQgaSA9IG1JdGVtcy5zaXplKCk7IC0taSA+PSAwOykgewotICAgICAgICBpbnQzMl90IGtleSA9IG1JdGVtcy5rZXlBdChpKTsKLSAgICAgICAgY2hhciBjY1s1XTsKLSAgICAgICAgTWFrZUZvdXJDQ1N0cmluZyhrZXksIGNjKTsKLSAgICAgICAgY29uc3QgdHlwZWRfZGF0YSAmaXRlbSA9IG1JdGVtcy52YWx1ZUF0KGkpOwotICAgICAgICBzLmFwcGVuZEZvcm1hdCgiJXM6ICVzIiwgY2MsIGl0ZW0uYXNTdHJpbmcoZmFsc2UpLnN0cmluZygpKTsKLSAgICAgICAgaWYgKGkgIT0gMCkgewotICAgICAgICAgICAgcy5hcHBlbmQoIiwgIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHM7Ci19Ci12b2lkIE1ldGFEYXRhOjpkdW1wVG9Mb2coKSBjb25zdCB7Ci0gICAgZm9yIChpbnQgaSA9IG1JdGVtcy5zaXplKCk7IC0taSA+PSAwOykgewotICAgICAgICBpbnQzMl90IGtleSA9IG1JdGVtcy5rZXlBdChpKTsKLSAgICAgICAgY2hhciBjY1s1XTsKLSAgICAgICAgTWFrZUZvdXJDQ1N0cmluZyhrZXksIGNjKTsKLSAgICAgICAgY29uc3QgdHlwZWRfZGF0YSAmaXRlbSA9IG1JdGVtcy52YWx1ZUF0KGkpOwotICAgICAgICBBTE9HSSgiJXM6ICVzIiwgY2MsIGl0ZW0uYXNTdHJpbmcodHJ1ZSAvKiB2ZXJib3NlICovKS5zdHJpbmcoKSk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBNZXRhRGF0YTo6d3JpdGVUb1BhcmNlbChQYXJjZWwgJnBhcmNlbCkgewotICAgIHN0YXR1c190IHJldDsKLSAgICBzaXplX3QgbnVtSXRlbXMgPSBtSXRlbXMuc2l6ZSgpOwotICAgIHJldCA9IHBhcmNlbC53cml0ZVVpbnQzMih1aW50MzJfdChudW1JdGVtcykpOwotICAgIGlmIChyZXQpIHsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1JdGVtczsgaSsrKSB7Ci0gICAgICAgIGludDMyX3Qga2V5ID0gbUl0ZW1zLmtleUF0KGkpOwotICAgICAgICBjb25zdCB0eXBlZF9kYXRhICZpdGVtID0gbUl0ZW1zLnZhbHVlQXQoaSk7Ci0gICAgICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgICAgIGNvbnN0IHZvaWQgKmRhdGE7Ci0gICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICBpdGVtLmdldERhdGEoJnR5cGUsICZkYXRhLCAmc2l6ZSk7Ci0gICAgICAgIHJldCA9IHBhcmNlbC53cml0ZUludDMyKGtleSk7Ci0gICAgICAgIGlmIChyZXQpIHsKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0ID0gcGFyY2VsLndyaXRlVWludDMyKHR5cGUpOwotICAgICAgICBpZiAocmV0KSB7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0gICAgICAgIGlmICh0eXBlID09IFRZUEVfTk9ORSkgewotICAgICAgICAgICAgYW5kcm9pZDo6UGFyY2VsOjpXcml0YWJsZUJsb2IgYmxvYjsKLSAgICAgICAgICAgIHJldCA9IHBhcmNlbC53cml0ZVVpbnQzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2l6ZSkpOwotICAgICAgICAgICAgaWYgKHJldCkgewotICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXQgPSBwYXJjZWwud3JpdGVCbG9iKHNpemUsIGZhbHNlLCAmYmxvYik7Ci0gICAgICAgICAgICBpZiAocmV0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1lbWNweShibG9iLmRhdGEoKSwgZGF0YSwgc2l6ZSk7Ci0gICAgICAgICAgICBibG9iLnJlbGVhc2UoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldCA9IHBhcmNlbC53cml0ZUJ5dGVBcnJheShzaXplLCAodWludDhfdCopZGF0YSk7Ci0gICAgICAgICAgICBpZiAocmV0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IE1ldGFEYXRhOjp1cGRhdGVGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAmcGFyY2VsKSB7Ci0gICAgdWludDMyX3QgbnVtSXRlbXM7Ci0gICAgaWYgKHBhcmNlbC5yZWFkVWludDMyKCZudW1JdGVtcykgPT0gT0spIHsKLQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUl0ZW1zOyBpKyspIHsKLSAgICAgICAgICAgIGludDMyX3Qga2V5OwotICAgICAgICAgICAgdWludDMyX3QgdHlwZTsKLSAgICAgICAgICAgIHVpbnQzMl90IHNpemU7Ci0gICAgICAgICAgICBzdGF0dXNfdCByZXQgPSBwYXJjZWwucmVhZEludDMyKCZrZXkpOwotICAgICAgICAgICAgcmV0IHw9IHBhcmNlbC5yZWFkVWludDMyKCZ0eXBlKTsKLSAgICAgICAgICAgIHJldCB8PSBwYXJjZWwucmVhZFVpbnQzMigmc2l6ZSk7Ci0gICAgICAgICAgICBpZiAocmV0ICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBjb3B5IGRhdGEgZnJvbSBCbG9iLCB3aGljaCBtYXkgYmUgaW5saW5lIGluIFBhcmNlbCBzdG9yYWdlLAotICAgICAgICAgICAgLy8gdGhlbiBhZHZhbmNlIHBvc2l0aW9uCi0gICAgICAgICAgICBpZiAodHlwZSA9PSBUWVBFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBhbmRyb2lkOjpQYXJjZWw6OlJlYWRhYmxlQmxvYiBibG9iOwotICAgICAgICAgICAgICAgIHJldCA9IHBhcmNlbC5yZWFkQmxvYihzaXplLCAmYmxvYik7Ci0gICAgICAgICAgICAgICAgaWYgKHJldCAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2V0RGF0YShrZXksIHR5cGUsIGJsb2IuZGF0YSgpLCBzaXplKTsKLSAgICAgICAgICAgICAgICBibG9iLnJlbGVhc2UoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gY29weSBkYXRhIGRpcmVjdGx5IGZyb20gUGFyY2VsIHN0b3JhZ2UsIHRoZW4gYWR2YW5jZSBwb3NpdGlvbgotICAgICAgICAgICAgICAgIHNldERhdGEoa2V5LCB0eXBlLCBwYXJjZWwucmVhZElucGxhY2Uoc2l6ZSksIHNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0gICAgQUxPR1coIm5vIG1ldGFkYXRhIGluIHBhcmNlbCIpOwotICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotfQotCi0KLS8qIHN0YXRpYyAqLwotc3A8TWV0YURhdGE+IE1ldGFEYXRhOjpjcmVhdGVGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAmcGFyY2VsKSB7Ci0KLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YSgpOwotICAgIG1ldGEtPnVwZGF0ZUZyb21QYXJjZWwocGFyY2VsKTsKLSAgICByZXR1cm4gbWV0YTsKLX0KLQotCi0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYXZjX3V0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYXZjX3V0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGE2MDgzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9hdmNfdXRpbHMuY3BwCkBAIC0wLDAgKzEsNzczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJhdmNfdXRpbHMiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9hdmNfdXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3Vuc2lnbmVkIHBhcnNlVUUoQUJpdFJlYWRlciAqYnIpIHsKKyAgICB1bnNpZ25lZCBudW1aZXJvZXMgPSAwOworICAgIHdoaWxlIChici0+Z2V0Qml0cygxKSA9PSAwKSB7CisgICAgICAgICsrbnVtWmVyb2VzOworICAgIH0KKworICAgIHVuc2lnbmVkIHggPSBici0+Z2V0Qml0cyhudW1aZXJvZXMpOworCisgICAgcmV0dXJuIHggKyAoMXUgPDwgbnVtWmVyb2VzKSAtIDE7Cit9CisKK3Vuc2lnbmVkIHBhcnNlVUVXaXRoRmFsbGJhY2soQUJpdFJlYWRlciAqYnIsIHVuc2lnbmVkIGZhbGxiYWNrKSB7CisgICAgdW5zaWduZWQgbnVtWmVyb2VzID0gMDsKKyAgICB3aGlsZSAoYnItPmdldEJpdHNXaXRoRmFsbGJhY2soMSwgMSkgPT0gMCkgeworICAgICAgICArK251bVplcm9lczsKKyAgICB9CisgICAgdWludDMyX3QgeDsKKyAgICBpZiAobnVtWmVyb2VzIDwgMzIpIHsKKyAgICAgICAgaWYgKGJyLT5nZXRCaXRzR3JhY2VmdWwobnVtWmVyb2VzLCAmeCkpIHsKKyAgICAgICAgICAgIHJldHVybiB4ICsgKDF1IDw8IG51bVplcm9lcykgLSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGZhbGxiYWNrOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgYnItPnNraXBCaXRzKG51bVplcm9lcyk7CisgICAgICAgIHJldHVybiBmYWxsYmFjazsKKyAgICB9Cit9CisKK3NpZ25lZCBwYXJzZVNFKEFCaXRSZWFkZXIgKmJyKSB7CisgICAgdW5zaWduZWQgY29kZU51bSA9IHBhcnNlVUUoYnIpOworCisgICAgcmV0dXJuIChjb2RlTnVtICYgMSkgPyAoY29kZU51bSArIDEpIC8gMiA6IC1zaWduZWQoY29kZU51bSAvIDIpOworfQorCitzaWduZWQgcGFyc2VTRVdpdGhGYWxsYmFjayhBQml0UmVhZGVyICpiciwgc2lnbmVkIGZhbGxiYWNrKSB7CisgICAgLy8gTk9URTogcGFyc2VVRSBjYW5ub3Qgbm9ybWFsbHkgcmV0dXJuIH4wIGFzIHRoZSBtYXggc3VwcG9ydGVkIHZhbHVlIGlzIDB4RkZGRQorICAgIHVuc2lnbmVkIGNvZGVOdW0gPSBwYXJzZVVFV2l0aEZhbGxiYWNrKGJyLCB+MFUpOworICAgIGlmIChjb2RlTnVtID09IH4wVSkgeworICAgICAgICByZXR1cm4gZmFsbGJhY2s7CisgICAgfQorICAgIHJldHVybiAoY29kZU51bSAmIDEpID8gKGNvZGVOdW0gKyAxKSAvIDIgOiAtc2lnbmVkKGNvZGVOdW0gLyAyKTsKK30KKworc3RhdGljIHZvaWQgc2tpcFNjYWxpbmdMaXN0KEFCaXRSZWFkZXIgKmJyLCBzaXplX3Qgc2l6ZU9mU2NhbGluZ0xpc3QpIHsKKyAgICBzaXplX3QgbGFzdFNjYWxlID0gODsKKyAgICBzaXplX3QgbmV4dFNjYWxlID0gODsKKyAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHNpemVPZlNjYWxpbmdMaXN0OyArK2opIHsKKyAgICAgICAgaWYgKG5leHRTY2FsZSAhPSAwKSB7CisgICAgICAgICAgICBzaWduZWQgZGVsdGFfc2NhbGUgPSBwYXJzZVNFKGJyKTsKKyAgICAgICAgICAgIC8vIElTT19JRUNfMTQ0OTYtMTBfMjAxNDAyLUlUVSwgNy40LjIuMS4xLjEsIFRoZSB2YWx1ZSBvZiBkZWx0YV9zY2FsZQorICAgICAgICAgICAgLy8gc2hhbGwgYmUgaW4gdGhlIHJhbmdlIG9mIOKIkjEyOCB0byArMTI3LCBpbmNsdXNpdmUuCisgICAgICAgICAgICBpZiAoZGVsdGFfc2NhbGUgPCAtMTI4KSB7CisgICAgICAgICAgICAgICAgQUxPR1coImRlbHRhX3NjYWxlICglZCkgaXMgYmVsb3cgcmFuZ2UsIGNhcHBlZCB0byAtMTI4IiwgZGVsdGFfc2NhbGUpOworICAgICAgICAgICAgICAgIGRlbHRhX3NjYWxlID0gLTEyODsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVsdGFfc2NhbGUgPiAxMjcpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiZGVsdGFfc2NhbGUgKCVkKSBpcyBhYm92ZSByYW5nZSwgY2FwcGVkIHRvIDEyNyIsIGRlbHRhX3NjYWxlKTsKKyAgICAgICAgICAgICAgICBkZWx0YV9zY2FsZSA9IDEyNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5leHRTY2FsZSA9IChsYXN0U2NhbGUgKyAoZGVsdGFfc2NhbGUgKyAyNTYpKSAlIDI1NjsKKyAgICAgICAgfQorCisgICAgICAgIGxhc3RTY2FsZSA9IChuZXh0U2NhbGUgPT0gMCkgPyBsYXN0U2NhbGUgOiBuZXh0U2NhbGU7CisgICAgfQorfQorCisvLyBEZXRlcm1pbmUgdmlkZW8gZGltZW5zaW9ucyBmcm9tIHRoZSBzZXF1ZW5jZSBwYXJhbWV0ZXJzZXQuCit2b2lkIEZpbmRBVkNEaW1lbnNpb25zKAorICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmc2VxUGFyYW1TZXQsCisgICAgICAgIGludDMyX3QgKndpZHRoLCBpbnQzMl90ICpoZWlnaHQsCisgICAgICAgIGludDMyX3QgKnNhcldpZHRoLCBpbnQzMl90ICpzYXJIZWlnaHQpIHsKKyAgICBBQml0UmVhZGVyIGJyKHNlcVBhcmFtU2V0LT5kYXRhKCkgKyAxLCBzZXFQYXJhbVNldC0+c2l6ZSgpIC0gMSk7CisKKyAgICB1bnNpZ25lZCBwcm9maWxlX2lkYyA9IGJyLmdldEJpdHMoOCk7CisgICAgYnIuc2tpcEJpdHMoMTYpOworICAgIHBhcnNlVUUoJmJyKTsgIC8vIHNlcV9wYXJhbWV0ZXJfc2V0X2lkCisKKyAgICB1bnNpZ25lZCBjaHJvbWFfZm9ybWF0X2lkYyA9IDE7ICAvLyA0OjI6MCBjaHJvbWEgZm9ybWF0CisKKyAgICBpZiAocHJvZmlsZV9pZGMgPT0gMTAwIHx8IHByb2ZpbGVfaWRjID09IDExMAorICAgICAgICAgICAgfHwgcHJvZmlsZV9pZGMgPT0gMTIyIHx8IHByb2ZpbGVfaWRjID09IDI0NAorICAgICAgICAgICAgfHwgcHJvZmlsZV9pZGMgPT0gNDQgfHwgcHJvZmlsZV9pZGMgPT0gODMgfHwgcHJvZmlsZV9pZGMgPT0gODYpIHsKKyAgICAgICAgY2hyb21hX2Zvcm1hdF9pZGMgPSBwYXJzZVVFKCZicik7CisgICAgICAgIGlmIChjaHJvbWFfZm9ybWF0X2lkYyA9PSAzKSB7CisgICAgICAgICAgICBici5za2lwQml0cygxKTsgIC8vIHJlc2lkdWFsX2NvbG91cl90cmFuc2Zvcm1fZmxhZworICAgICAgICB9CisgICAgICAgIHBhcnNlVUUoJmJyKTsgIC8vIGJpdF9kZXB0aF9sdW1hX21pbnVzOAorICAgICAgICBwYXJzZVVFKCZicik7ICAvLyBiaXRfZGVwdGhfY2hyb21hX21pbnVzOAorICAgICAgICBici5za2lwQml0cygxKTsgIC8vIHFwcHJpbWVfeV96ZXJvX3RyYW5zZm9ybV9ieXBhc3NfZmxhZworCisgICAgICAgIGlmIChici5nZXRCaXRzKDEpKSB7ICAvLyBzZXFfc2NhbGluZ19tYXRyaXhfcHJlc2VudF9mbGFnCisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDg7ICsraSkgeworICAgICAgICAgICAgICAgIGlmIChici5nZXRCaXRzKDEpKSB7ICAvLyBzZXFfc2NhbGluZ19saXN0X3ByZXNlbnRfZmxhZ1tpXQorCisgICAgICAgICAgICAgICAgICAgIC8vIFdBUk5JTkc6IHRoZSBjb2RlIGJlbG93IGhhcyBub3QgZXZlciBiZWVuIGV4ZXJjaXNlZC4uLgorICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIGEgcmVhbC13b3JsZCBleGFtcGxlLgorCisgICAgICAgICAgICAgICAgICAgIGlmIChpIDwgNikgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2NhbGluZ0xpc3Q0eDRbaV0sMTYsLi4uCisgICAgICAgICAgICAgICAgICAgICAgICBza2lwU2NhbGluZ0xpc3QoJmJyLCAxNik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTY2FsaW5nTGlzdDh4OFtpLTZdLDY0LC4uLgorICAgICAgICAgICAgICAgICAgICAgICAgc2tpcFNjYWxpbmdMaXN0KCZiciwgNjQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcGFyc2VVRSgmYnIpOyAgLy8gbG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNAorICAgIHVuc2lnbmVkIHBpY19vcmRlcl9jbnRfdHlwZSA9IHBhcnNlVUUoJmJyKTsKKworICAgIGlmIChwaWNfb3JkZXJfY250X3R5cGUgPT0gMCkgeworICAgICAgICBwYXJzZVVFKCZicik7ICAvLyBsb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQKKyAgICB9IGVsc2UgaWYgKHBpY19vcmRlcl9jbnRfdHlwZSA9PSAxKSB7CisgICAgICAgIC8vIG9mZnNldF9mb3Jfbm9uX3JlZl9waWMsIG9mZnNldF9mb3JfdG9wX3RvX2JvdHRvbV9maWVsZCBhbmQKKyAgICAgICAgLy8gb2Zmc2V0X2Zvcl9yZWZfZnJhbWUgYXJlIHRlY2huaWNhbGx5IHNlKHYpLCBidXQgc2luY2Ugd2UgYXJlCisgICAgICAgIC8vIGp1c3Qgc2tpcHBpbmcgb3ZlciB0aGVtIHRoZSBtaWRwb2ludCBkb2VzIG5vdCBtYXR0ZXIuCisKKyAgICAgICAgYnIuZ2V0Qml0cygxKTsgIC8vIGRlbHRhX3BpY19vcmRlcl9hbHdheXNfemVyb19mbGFnCisgICAgICAgIHBhcnNlVUUoJmJyKTsgIC8vIG9mZnNldF9mb3Jfbm9uX3JlZl9waWMKKyAgICAgICAgcGFyc2VVRSgmYnIpOyAgLy8gb2Zmc2V0X2Zvcl90b3BfdG9fYm90dG9tX2ZpZWxkCisKKyAgICAgICAgdW5zaWduZWQgbnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZSA9IHBhcnNlVUUoJmJyKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGU7ICsraSkgeworICAgICAgICAgICAgcGFyc2VVRSgmYnIpOyAgLy8gb2Zmc2V0X2Zvcl9yZWZfZnJhbWUKKyAgICAgICAgfQorICAgIH0KKworICAgIHBhcnNlVUUoJmJyKTsgIC8vIG51bV9yZWZfZnJhbWVzCisgICAgYnIuZ2V0Qml0cygxKTsgIC8vIGdhcHNfaW5fZnJhbWVfbnVtX3ZhbHVlX2FsbG93ZWRfZmxhZworCisgICAgdW5zaWduZWQgcGljX3dpZHRoX2luX21ic19taW51czEgPSBwYXJzZVVFKCZicik7CisgICAgdW5zaWduZWQgcGljX2hlaWdodF9pbl9tYXBfdW5pdHNfbWludXMxID0gcGFyc2VVRSgmYnIpOworICAgIHVuc2lnbmVkIGZyYW1lX21ic19vbmx5X2ZsYWcgPSBici5nZXRCaXRzKDEpOworCisgICAgKndpZHRoID0gcGljX3dpZHRoX2luX21ic19taW51czEgKiAxNiArIDE2OworCisgICAgKmhlaWdodCA9ICgyIC0gZnJhbWVfbWJzX29ubHlfZmxhZykKKyAgICAgICAgKiAocGljX2hlaWdodF9pbl9tYXBfdW5pdHNfbWludXMxICogMTYgKyAxNik7CisKKyAgICBpZiAoIWZyYW1lX21ic19vbmx5X2ZsYWcpIHsKKyAgICAgICAgYnIuZ2V0Qml0cygxKTsgIC8vIG1iX2FkYXB0aXZlX2ZyYW1lX2ZpZWxkX2ZsYWcKKyAgICB9CisKKyAgICBici5nZXRCaXRzKDEpOyAgLy8gZGlyZWN0Xzh4OF9pbmZlcmVuY2VfZmxhZworCisgICAgaWYgKGJyLmdldEJpdHMoMSkpIHsgIC8vIGZyYW1lX2Nyb3BwaW5nX2ZsYWcKKyAgICAgICAgdW5zaWduZWQgZnJhbWVfY3JvcF9sZWZ0X29mZnNldCA9IHBhcnNlVUUoJmJyKTsKKyAgICAgICAgdW5zaWduZWQgZnJhbWVfY3JvcF9yaWdodF9vZmZzZXQgPSBwYXJzZVVFKCZicik7CisgICAgICAgIHVuc2lnbmVkIGZyYW1lX2Nyb3BfdG9wX29mZnNldCA9IHBhcnNlVUUoJmJyKTsKKyAgICAgICAgdW5zaWduZWQgZnJhbWVfY3JvcF9ib3R0b21fb2Zmc2V0ID0gcGFyc2VVRSgmYnIpOworCisgICAgICAgIHVuc2lnbmVkIGNyb3BVbml0WCwgY3JvcFVuaXRZOworICAgICAgICBpZiAoY2hyb21hX2Zvcm1hdF9pZGMgPT0gMCAgLyogbW9ub2Nocm9tZSAqLykgeworICAgICAgICAgICAgY3JvcFVuaXRYID0gMTsKKyAgICAgICAgICAgIGNyb3BVbml0WSA9IDIgLSBmcmFtZV9tYnNfb25seV9mbGFnOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdW5zaWduZWQgc3ViV2lkdGhDID0gKGNocm9tYV9mb3JtYXRfaWRjID09IDMpID8gMSA6IDI7CisgICAgICAgICAgICB1bnNpZ25lZCBzdWJIZWlnaHRDID0gKGNocm9tYV9mb3JtYXRfaWRjID09IDEpID8gMiA6IDE7CisKKyAgICAgICAgICAgIGNyb3BVbml0WCA9IHN1YldpZHRoQzsKKyAgICAgICAgICAgIGNyb3BVbml0WSA9IHN1YkhlaWdodEMgKiAoMiAtIGZyYW1lX21ic19vbmx5X2ZsYWcpOworICAgICAgICB9CisKKyAgICAgICAgQUxPR1YoImZyYW1lX2Nyb3AgPSAoJXUsICV1LCAldSwgJXUpLCBjcm9wVW5pdFggPSAldSwgY3JvcFVuaXRZID0gJXUiLAorICAgICAgICAgICAgIGZyYW1lX2Nyb3BfbGVmdF9vZmZzZXQsIGZyYW1lX2Nyb3BfcmlnaHRfb2Zmc2V0LAorICAgICAgICAgICAgIGZyYW1lX2Nyb3BfdG9wX29mZnNldCwgZnJhbWVfY3JvcF9ib3R0b21fb2Zmc2V0LAorICAgICAgICAgICAgIGNyb3BVbml0WCwgY3JvcFVuaXRZKTsKKworCisgICAgICAgIC8vICp3aWR0aCAtPSAoZnJhbWVfY3JvcF9sZWZ0X29mZnNldCArIGZyYW1lX2Nyb3BfcmlnaHRfb2Zmc2V0KSAqIGNyb3BVbml0WDsKKyAgICAgICAgaWYoX19idWlsdGluX2FkZF9vdmVyZmxvdyhmcmFtZV9jcm9wX2xlZnRfb2Zmc2V0LCBmcmFtZV9jcm9wX3JpZ2h0X29mZnNldCwgJmZyYW1lX2Nyb3BfbGVmdF9vZmZzZXQpIHx8CisgICAgICAgICAgICBfX2J1aWx0aW5fbXVsX292ZXJmbG93KGZyYW1lX2Nyb3BfbGVmdF9vZmZzZXQsIGNyb3BVbml0WCwgJmZyYW1lX2Nyb3BfbGVmdF9vZmZzZXQpIHx8CisgICAgICAgICAgICBfX2J1aWx0aW5fc3ViX292ZXJmbG93KCp3aWR0aCwgZnJhbWVfY3JvcF9sZWZ0X29mZnNldCwgd2lkdGgpIHx8CisgICAgICAgICAgICAqd2lkdGggPCAwKSB7CisgICAgICAgICAgICAqd2lkdGggPSAwOworICAgICAgICB9CisKKyAgICAgICAgLy8qaGVpZ2h0IC09IChmcmFtZV9jcm9wX3RvcF9vZmZzZXQgKyBmcmFtZV9jcm9wX2JvdHRvbV9vZmZzZXQpICogY3JvcFVuaXRZOworICAgICAgICBpZihfX2J1aWx0aW5fYWRkX292ZXJmbG93KGZyYW1lX2Nyb3BfdG9wX29mZnNldCwgZnJhbWVfY3JvcF9ib3R0b21fb2Zmc2V0LCAmZnJhbWVfY3JvcF90b3Bfb2Zmc2V0KSB8fAorICAgICAgICAgICAgX19idWlsdGluX211bF9vdmVyZmxvdyhmcmFtZV9jcm9wX3RvcF9vZmZzZXQsIGNyb3BVbml0WSwgJmZyYW1lX2Nyb3BfdG9wX29mZnNldCkgfHwKKyAgICAgICAgICAgIF9fYnVpbHRpbl9zdWJfb3ZlcmZsb3coKmhlaWdodCwgZnJhbWVfY3JvcF90b3Bfb2Zmc2V0LCBoZWlnaHQpIHx8CisgICAgICAgICAgICAqaGVpZ2h0IDwgMCkgeworICAgICAgICAgICAgKmhlaWdodCA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc2FyV2lkdGggIT0gTlVMTCkgeworICAgICAgICAqc2FyV2lkdGggPSAwOworICAgIH0KKworICAgIGlmIChzYXJIZWlnaHQgIT0gTlVMTCkgeworICAgICAgICAqc2FySGVpZ2h0ID0gMDsKKyAgICB9CisKKyAgICBpZiAoYnIuZ2V0Qml0cygxKSkgeyAgLy8gdnVpX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnCisgICAgICAgIHVuc2lnbmVkIHNhcl93aWR0aCA9IDAsIHNhcl9oZWlnaHQgPSAwOworCisgICAgICAgIGlmIChici5nZXRCaXRzKDEpKSB7ICAvLyBhc3BlY3RfcmF0aW9faW5mb19wcmVzZW50X2ZsYWcKKyAgICAgICAgICAgIHVuc2lnbmVkIGFzcGVjdF9yYXRpb19pZGMgPSBici5nZXRCaXRzKDgpOworCisgICAgICAgICAgICBpZiAoYXNwZWN0X3JhdGlvX2lkYyA9PSAyNTUgLyogZXh0ZW5kZWRTQVIgKi8pIHsKKyAgICAgICAgICAgICAgICBzYXJfd2lkdGggPSBici5nZXRCaXRzKDE2KTsKKyAgICAgICAgICAgICAgICBzYXJfaGVpZ2h0ID0gYnIuZ2V0Qml0cygxNik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeyB1bnNpZ25lZCB3aWR0aCwgaGVpZ2h0OyB9IGtGaXhlZFNBUnNbXSA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgICAwLCAgMCB9LCAvLyBJbnZhbGlkCisgICAgICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDEgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgIDEyLCAxMSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAgMTAsIDExIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7ICAxNiwgMTEgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgIDQwLCAzMyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAgMjQsIDExIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7ICAyMCwgMTEgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgIDMyLCAxMSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAgODAsIDMzIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7ICAxOCwgMTEgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgIDE1LCAxMSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAgNjQsIDMzIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IDE2MCwgOTkgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgICA0LCAgMyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAgIDMsICAyIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7ICAgMiwgIDEgfSwKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgaWYgKGFzcGVjdF9yYXRpb19pZGMgPiAwICYmIGFzcGVjdF9yYXRpb19pZGMgPCBORUxFTShrRml4ZWRTQVJzKSkgeworICAgICAgICAgICAgICAgICAgICBzYXJfd2lkdGggPSBrRml4ZWRTQVJzW2FzcGVjdF9yYXRpb19pZGNdLndpZHRoOworICAgICAgICAgICAgICAgICAgICBzYXJfaGVpZ2h0ID0ga0ZpeGVkU0FSc1thc3BlY3RfcmF0aW9faWRjXS5oZWlnaHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQUxPR1YoInNhbXBsZSBhc3BlY3QgcmF0aW8gPSAldSA6ICV1Iiwgc2FyX3dpZHRoLCBzYXJfaGVpZ2h0KTsKKworICAgICAgICBpZiAoc2FyV2lkdGggIT0gTlVMTCkgeworICAgICAgICAgICAgKnNhcldpZHRoID0gc2FyX3dpZHRoOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNhckhlaWdodCAhPSBOVUxMKSB7CisgICAgICAgICAgICAqc2FySGVpZ2h0ID0gc2FyX2hlaWdodDsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdHVzX3QgZ2V0TmV4dE5BTFVuaXQoCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKipfZGF0YSwgc2l6ZV90ICpfc2l6ZSwKKyAgICAgICAgY29uc3QgdWludDhfdCAqKm5hbFN0YXJ0LCBzaXplX3QgKm5hbFNpemUsCisgICAgICAgIGJvb2wgc3RhcnRDb2RlRm9sbG93cykgeworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSAqX2RhdGE7CisgICAgc2l6ZV90IHNpemUgPSAqX3NpemU7CisKKyAgICAqbmFsU3RhcnQgPSBOVUxMOworICAgICpuYWxTaXplID0gMDsKKworICAgIGlmIChzaXplIDwgMykgeworICAgICAgICByZXR1cm4gLUVBR0FJTjsKKyAgICB9CisKKyAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKKworICAgIC8vIEEgdmFsaWQgc3RhcnRjb2RlIGNvbnNpc3RzIG9mIGF0IGxlYXN0IHR3byAweDAwIGJ5dGVzIGZvbGxvd2VkIGJ5IDB4MDEuCisgICAgZm9yICg7IG9mZnNldCArIDIgPCBzaXplOyArK29mZnNldCkgeworICAgICAgICBpZiAoZGF0YVtvZmZzZXQgKyAyXSA9PSAweDAxICYmIGRhdGFbb2Zmc2V0XSA9PSAweDAwCisgICAgICAgICAgICAgICAgJiYgZGF0YVtvZmZzZXQgKyAxXSA9PSAweDAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAob2Zmc2V0ICsgMiA+PSBzaXplKSB7CisgICAgICAgICpfZGF0YSA9ICZkYXRhW29mZnNldF07CisgICAgICAgICpfc2l6ZSA9IDI7CisgICAgICAgIHJldHVybiAtRUFHQUlOOworICAgIH0KKyAgICBvZmZzZXQgKz0gMzsKKworICAgIHNpemVfdCBzdGFydE9mZnNldCA9IG9mZnNldDsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgd2hpbGUgKG9mZnNldCA8IHNpemUgJiYgZGF0YVtvZmZzZXRdICE9IDB4MDEpIHsKKyAgICAgICAgICAgICsrb2Zmc2V0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKG9mZnNldCA9PSBzaXplKSB7CisgICAgICAgICAgICBpZiAoc3RhcnRDb2RlRm9sbG93cykgeworICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemUgKyAyOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gLUVBR0FJTjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkYXRhW29mZnNldCAtIDFdID09IDB4MDAgJiYgZGF0YVtvZmZzZXQgLSAyXSA9PSAweDAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgICsrb2Zmc2V0OworICAgIH0KKworICAgIHNpemVfdCBlbmRPZmZzZXQgPSBvZmZzZXQgLSAyOworICAgIHdoaWxlIChlbmRPZmZzZXQgPiBzdGFydE9mZnNldCArIDEgJiYgZGF0YVtlbmRPZmZzZXQgLSAxXSA9PSAweDAwKSB7CisgICAgICAgIC0tZW5kT2Zmc2V0OworICAgIH0KKworICAgICpuYWxTdGFydCA9ICZkYXRhW3N0YXJ0T2Zmc2V0XTsKKyAgICAqbmFsU2l6ZSA9IGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0OworCisgICAgaWYgKG9mZnNldCArIDIgPCBzaXplKSB7CisgICAgICAgICpfZGF0YSA9ICZkYXRhW29mZnNldCAtIDJdOworICAgICAgICAqX3NpemUgPSBzaXplIC0gb2Zmc2V0ICsgMjsKKyAgICB9IGVsc2UgeworICAgICAgICAqX2RhdGEgPSBOVUxMOworICAgICAgICAqX3NpemUgPSAwOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdGljIHNwPEFCdWZmZXI+IEZpbmROQUwoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUsIHVuc2lnbmVkIG5hbFR5cGUpIHsKKyAgICBjb25zdCB1aW50OF90ICpuYWxTdGFydDsKKyAgICBzaXplX3QgbmFsU2l6ZTsKKyAgICB3aGlsZSAoZ2V0TmV4dE5BTFVuaXQoJmRhdGEsICZzaXplLCAmbmFsU3RhcnQsICZuYWxTaXplLCB0cnVlKSA9PSBPSykgeworICAgICAgICBpZiAobmFsU2l6ZSA+IDAgJiYgKG5hbFN0YXJ0WzBdICYgMHgxZikgPT0gbmFsVHlwZSkgeworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIobmFsU2l6ZSk7CisgICAgICAgICAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCksIG5hbFN0YXJ0LCBuYWxTaXplKTsKKyAgICAgICAgICAgIHJldHVybiBidWZmZXI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworY29uc3QgY2hhciAqQVZDUHJvZmlsZVRvU3RyaW5nKHVpbnQ4X3QgcHJvZmlsZSkgeworICAgIHN3aXRjaCAocHJvZmlsZSkgeworICAgICAgICBjYXNlIGtBVkNQcm9maWxlQmFzZWxpbmU6CisgICAgICAgICAgICByZXR1cm4gIkJhc2VsaW5lIjsKKyAgICAgICAgY2FzZSBrQVZDUHJvZmlsZU1haW46CisgICAgICAgICAgICByZXR1cm4gIk1haW4iOworICAgICAgICBjYXNlIGtBVkNQcm9maWxlRXh0ZW5kZWQ6CisgICAgICAgICAgICByZXR1cm4gIkV4dGVuZGVkIjsKKyAgICAgICAgY2FzZSBrQVZDUHJvZmlsZUhpZ2g6CisgICAgICAgICAgICByZXR1cm4gIkhpZ2giOworICAgICAgICBjYXNlIGtBVkNQcm9maWxlSGlnaDEwOgorICAgICAgICAgICAgcmV0dXJuICJIaWdoIDEwIjsKKyAgICAgICAgY2FzZSBrQVZDUHJvZmlsZUhpZ2g0MjI6CisgICAgICAgICAgICByZXR1cm4gIkhpZ2ggNDIyIjsKKyAgICAgICAgY2FzZSBrQVZDUHJvZmlsZUhpZ2g0NDQ6CisgICAgICAgICAgICByZXR1cm4gIkhpZ2ggNDQ0IjsKKyAgICAgICAgY2FzZSBrQVZDUHJvZmlsZUNBVkxDNDQ0SW50cmE6CisgICAgICAgICAgICByZXR1cm4gIkNBVkxDIDQ0NCBJbnRyYSI7CisgICAgICAgIGRlZmF1bHQ6ICAgcmV0dXJuICJVbmtub3duIjsKKyAgICB9Cit9CisKK3NwPEFCdWZmZXI+IE1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YSgKKyAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQsIGludDMyX3QgKndpZHRoLCBpbnQzMl90ICpoZWlnaHQsCisgICAgICAgIGludDMyX3QgKnNhcldpZHRoLCBpbnQzMl90ICpzYXJIZWlnaHQpIHsKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gYWNjZXNzVW5pdC0+ZGF0YSgpOworICAgIHNpemVfdCBzaXplID0gYWNjZXNzVW5pdC0+c2l6ZSgpOworCisgICAgc3A8QUJ1ZmZlcj4gc2VxUGFyYW1TZXQgPSBGaW5kTkFMKGRhdGEsIHNpemUsIDcpOworICAgIGlmIChzZXFQYXJhbVNldCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIEZpbmRBVkNEaW1lbnNpb25zKAorICAgICAgICAgICAgc2VxUGFyYW1TZXQsIHdpZHRoLCBoZWlnaHQsIHNhcldpZHRoLCBzYXJIZWlnaHQpOworCisgICAgc3A8QUJ1ZmZlcj4gcGljUGFyYW1TZXQgPSBGaW5kTkFMKGRhdGEsIHNpemUsIDgpOworICAgIENIRUNLKHBpY1BhcmFtU2V0ICE9IE5VTEwpOworCisgICAgc2l6ZV90IGNzZFNpemUgPQorICAgICAgICAxICsgMyArIDEgKyAxCisgICAgICAgICsgMiAqIDEgKyBzZXFQYXJhbVNldC0+c2l6ZSgpCisgICAgICAgICsgMSArIDIgKiAxICsgcGljUGFyYW1TZXQtPnNpemUoKTsKKworICAgIHNwPEFCdWZmZXI+IGNzZCA9IG5ldyBBQnVmZmVyKGNzZFNpemUpOworICAgIHVpbnQ4X3QgKm91dCA9IGNzZC0+ZGF0YSgpOworCisgICAgKm91dCsrID0gMHgwMTsgIC8vIGNvbmZpZ3VyYXRpb25WZXJzaW9uCisgICAgbWVtY3B5KG91dCwgc2VxUGFyYW1TZXQtPmRhdGEoKSArIDEsIDMpOyAgLy8gcHJvZmlsZS9sZXZlbC4uLgorCisgICAgdWludDhfdCBwcm9maWxlID0gb3V0WzBdOworICAgIHVpbnQ4X3QgbGV2ZWwgPSBvdXRbMl07CisKKyAgICBvdXQgKz0gMzsKKyAgICAqb3V0KysgPSAoMHgzZiA8PCAyKSB8IDE7ICAvLyBsZW5ndGhTaXplID09IDIgYnl0ZXMKKyAgICAqb3V0KysgPSAweGUwIHwgMTsKKworICAgICpvdXQrKyA9IHNlcVBhcmFtU2V0LT5zaXplKCkgPj4gODsKKyAgICAqb3V0KysgPSBzZXFQYXJhbVNldC0+c2l6ZSgpICYgMHhmZjsKKyAgICBtZW1jcHkob3V0LCBzZXFQYXJhbVNldC0+ZGF0YSgpLCBzZXFQYXJhbVNldC0+c2l6ZSgpKTsKKyAgICBvdXQgKz0gc2VxUGFyYW1TZXQtPnNpemUoKTsKKworICAgICpvdXQrKyA9IDE7CisKKyAgICAqb3V0KysgPSBwaWNQYXJhbVNldC0+c2l6ZSgpID4+IDg7CisgICAgKm91dCsrID0gcGljUGFyYW1TZXQtPnNpemUoKSAmIDB4ZmY7CisgICAgbWVtY3B5KG91dCwgcGljUGFyYW1TZXQtPmRhdGEoKSwgcGljUGFyYW1TZXQtPnNpemUoKSk7CisKKyNpZiAwCisgICAgQUxPR0koIkFWQyBzZXEgcGFyYW0gc2V0Iik7CisgICAgaGV4ZHVtcChzZXFQYXJhbVNldC0+ZGF0YSgpLCBzZXFQYXJhbVNldC0+c2l6ZSgpKTsKKyNlbmRpZgorCisKKyAgICBpZiAoc2FyV2lkdGggIT0gbnVsbHB0ciAmJiBzYXJIZWlnaHQgIT0gbnVsbHB0cikgeworICAgICAgICBpZiAoKCpzYXJXaWR0aCA+IDAgJiYgKnNhckhlaWdodCA+IDApICYmICgqc2FyV2lkdGggIT0gMSB8fCAqc2FySGVpZ2h0ICE9IDEpKSB7CisgICAgICAgICAgICBBTE9HSSgiZm91bmQgQVZDIGNvZGVjIGNvbmZpZyAoJWQgeCAlZCwgJXMtcHJvZmlsZSBsZXZlbCAlZC4lZCkgIgorICAgICAgICAgICAgICAgICAgICAiU0FSICVkIDogJWQiLAorICAgICAgICAgICAgICAgICAgICAqd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICpoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgIEFWQ1Byb2ZpbGVUb1N0cmluZyhwcm9maWxlKSwKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWwgLyAxMCwKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWwgJSAxMCwKKyAgICAgICAgICAgICAgICAgICAgKnNhcldpZHRoLAorICAgICAgICAgICAgICAgICAgICAqc2FySGVpZ2h0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFdlIHRyZWF0ICo6MCBhbmQgMDoqICh1bnNwZWNpZmllZCkgYXMgMToxLgorICAgICAgICAgICAgKnNhcldpZHRoID0gMDsKKyAgICAgICAgICAgICpzYXJIZWlnaHQgPSAwOworICAgICAgICAgICAgQUxPR0koImZvdW5kIEFWQyBjb2RlYyBjb25maWcgKCVkIHggJWQsICVzLXByb2ZpbGUgbGV2ZWwgJWQuJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgKndpZHRoLAorICAgICAgICAgICAgICAgICAgICAqaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICBBVkNQcm9maWxlVG9TdHJpbmcocHJvZmlsZSksCisgICAgICAgICAgICAgICAgICAgIGxldmVsIC8gMTAsCisgICAgICAgICAgICAgICAgICAgIGxldmVsICUgMTApOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGNzZDsKK30KKworYm9vbCBJc0lEUihjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworLy8gICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpOworLy8gICAgc2l6ZV90IHNpemUgPSBidWZmZXItPnNpemUoKTsKKyAgICBib29sIGZvdW5kSURSID0gZmFsc2U7CisKKyAgICBjb25zdCB1aW50OF90ICpuYWxTdGFydDsKKyAgICBzaXplX3QgbmFsU2l6ZTsKKyAgICB3aGlsZSAoZ2V0TmV4dE5BTFVuaXQoJmRhdGEsICZzaXplLCAmbmFsU3RhcnQsICZuYWxTaXplLCB0cnVlKSA9PSBPSykgeworICAgICAgICBpZiAobmFsU2l6ZSA9PSAwdSkgeworICAgICAgICAgICAgQUxPR1coInNraXBwaW5nIGVtcHR5IG5hbCB1bml0IGZyb20gcG90ZW50aWFsbHkgbWFsZm9ybWVkIGJpdHN0cmVhbSIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICB1bnNpZ25lZCBuYWxUeXBlID0gbmFsU3RhcnRbMF0gJiAweDFmOworCisgICAgICAgIGlmIChuYWxUeXBlID09IDUpIHsKKyAgICAgICAgICAgIGZvdW5kSURSID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZvdW5kSURSOworfQorCitib29sIElzQVZDUmVmZXJlbmNlRnJhbWUoY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpIHsKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gYWNjZXNzVW5pdC0+ZGF0YSgpOworICAgIHNpemVfdCBzaXplID0gYWNjZXNzVW5pdC0+c2l6ZSgpOworICAgIGlmIChkYXRhID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIklzQVZDUmVmZXJlbmNlRnJhbWU6IGNhbGxlZCBvbiBOVUxMIGRhdGEgKCVwLCAlenUpIiwgYWNjZXNzVW5pdC5nZXQoKSwgc2l6ZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjb25zdCB1aW50OF90ICpuYWxTdGFydDsKKyAgICBzaXplX3QgbmFsU2l6ZTsKKyAgICB3aGlsZSAoZ2V0TmV4dE5BTFVuaXQoJmRhdGEsICZzaXplLCAmbmFsU3RhcnQsICZuYWxTaXplLCB0cnVlKSA9PSBPSykgeworICAgICAgICBpZiAobmFsU2l6ZSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiSXNBVkNSZWZlcmVuY2VGcmFtZTogaW52YWxpZCBuYWxTaXplOiAwICglcCwgJXp1KSIsIGFjY2Vzc1VuaXQuZ2V0KCksIHNpemUpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgdW5zaWduZWQgbmFsVHlwZSA9IG5hbFN0YXJ0WzBdICYgMHgxZjsKKworICAgICAgICBpZiAobmFsVHlwZSA9PSA1KSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChuYWxUeXBlID09IDEpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIG5hbF9yZWZfaWRjID0gKG5hbFN0YXJ0WzBdID4+IDUpICYgMzsKKyAgICAgICAgICAgIHJldHVybiBuYWxfcmVmX2lkYyAhPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3VpbnQzMl90IEZpbmRBVkNMYXllcklkKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQ0hFQ0soZGF0YSAhPSBOVUxMKTsKKworICAgIGNvbnN0IHVuc2lnbmVkIGtTdmNOYWxUeXBlID0gMHhFOworICAgIGNvbnN0IHVuc2lnbmVkIGtTdmNOYWxTZWFyY2hSYW5nZSA9IDMyOworICAgIC8vIFNWQyBOQUwKKyAgICAvLyB8LS0tMCAxMTEwfDEtLS0gLS0tLXwtLS0tIC0tLS18aWlpLSAtLS18CisgICAgLy8gICAgICAgXiAgICAgICAgICAgICAgICAgICAgICAgIF4KKyAgICAvLyAgIE5BTC10eXBlID0gMHhFICAgICAgICAgICAgICAgbGF5ZXItSWQKKyAgICAvLworICAgIC8vIGxheWVyX2lkIDAgaXMgZm9yIGJhc2UgbGF5ZXIsIHdoaWxlIDEsIDIsIC4uLiBhcmUgZW5oYW5jZW1lbnQgbGF5ZXJzLgorICAgIC8vIExheWVyIG4gdXNlcyByZWZlcmVuY2UgZnJhbWVzIGZyb20gbGF5ZXIgMCwgMSwgLi4uLCBuLTEuCisKKyAgICB1aW50MzJfdCBsYXllcklkID0gMDsKKyAgICBzcDxBQnVmZmVyPiBzdmNOQUwgPSBGaW5kTkFMKAorICAgICAgICAgICAgZGF0YSwgc2l6ZSA+IGtTdmNOYWxTZWFyY2hSYW5nZSA/IGtTdmNOYWxTZWFyY2hSYW5nZSA6IHNpemUsIGtTdmNOYWxUeXBlKTsKKyAgICBpZiAoc3ZjTkFMICE9IE5VTEwgJiYgc3ZjTkFMLT5zaXplKCkgPj0gNCkgeworICAgICAgICBsYXllcklkID0gKCooc3ZjTkFMLT5kYXRhKCkgKyAzKSA+PiA1KSAmIDB4NzsKKyAgICB9CisgICAgcmV0dXJuIGxheWVySWQ7Cit9CisKK2Jvb2wgRXh0cmFjdERpbWVuc2lvbnNGcm9tVk9MSGVhZGVyKAorICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSwgaW50MzJfdCAqd2lkdGgsIGludDMyX3QgKmhlaWdodCkgeworICAgIEFCaXRSZWFkZXIgYnIoJmRhdGFbNF0sIHNpemUgLSA0KTsKKyAgICBici5za2lwQml0cygxKTsgIC8vIHJhbmRvbV9hY2Nlc3NpYmxlX3ZvbAorICAgIHVuc2lnbmVkIHZpZGVvX29iamVjdF90eXBlX2luZGljYXRpb24gPSBici5nZXRCaXRzKDgpOworCisgICAgQ0hFQ0tfTkUodmlkZW9fb2JqZWN0X3R5cGVfaW5kaWNhdGlvbiwKKyAgICAgICAgICAgICAweDIxdSAvKiBGaW5lIEdyYW51bGFyaXR5IFNjYWxhYmxlICovKTsKKworICAgIHVuc2lnbmVkIHZpZGVvX29iamVjdF9sYXllcl92ZXJpZCBfX3VudXNlZDsKKyAgICB1bnNpZ25lZCB2aWRlb19vYmplY3RfbGF5ZXJfcHJpb3JpdHkgX191bnVzZWQ7CisgICAgaWYgKGJyLmdldEJpdHMoMSkpIHsKKyAgICAgICAgdmlkZW9fb2JqZWN0X2xheWVyX3ZlcmlkID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgdmlkZW9fb2JqZWN0X2xheWVyX3ByaW9yaXR5ID0gYnIuZ2V0Qml0cygzKTsKKyAgICB9CisgICAgdW5zaWduZWQgYXNwZWN0X3JhdGlvX2luZm8gPSBici5nZXRCaXRzKDQpOworICAgIGlmIChhc3BlY3RfcmF0aW9faW5mbyA9PSAweDBmIC8qIGV4dGVuZGVkIFBBUiAqLykgeworICAgICAgICBici5za2lwQml0cyg4KTsgIC8vIHBhcl93aWR0aAorICAgICAgICBici5za2lwQml0cyg4KTsgIC8vIHBhcl9oZWlnaHQKKyAgICB9CisgICAgaWYgKGJyLmdldEJpdHMoMSkpIHsgIC8vIHZvbF9jb250cm9sX3BhcmFtZXRlcnMKKyAgICAgICAgYnIuc2tpcEJpdHMoMik7ICAvLyBjaHJvbWFfZm9ybWF0CisgICAgICAgIGJyLnNraXBCaXRzKDEpOyAgLy8gbG93X2RlbGF5CisgICAgICAgIGlmIChici5nZXRCaXRzKDEpKSB7ICAvLyB2YnZfcGFyYW1ldGVycworICAgICAgICAgICAgYnIuc2tpcEJpdHMoMTUpOyAgLy8gZmlyc3RfaGFsZl9iaXRfcmF0ZQorICAgICAgICAgICAgQ0hFQ0soYnIuZ2V0Qml0cygxKSk7ICAvLyBtYXJrZXJfYml0CisgICAgICAgICAgICBici5za2lwQml0cygxNSk7ICAvLyBsYXR0ZXJfaGFsZl9iaXRfcmF0ZQorICAgICAgICAgICAgQ0hFQ0soYnIuZ2V0Qml0cygxKSk7ICAvLyBtYXJrZXJfYml0CisgICAgICAgICAgICBici5za2lwQml0cygxNSk7ICAvLyBmaXJzdF9oYWxmX3Zidl9idWZmZXJfc2l6ZQorICAgICAgICAgICAgQ0hFQ0soYnIuZ2V0Qml0cygxKSk7ICAvLyBtYXJrZXJfYml0CisgICAgICAgICAgICBici5za2lwQml0cygzKTsgIC8vIGxhdHRlcl9oYWxmX3Zidl9idWZmZXJfc2l6ZQorICAgICAgICAgICAgYnIuc2tpcEJpdHMoMTEpOyAgLy8gZmlyc3RfaGFsZl92YnZfb2NjdXBhbmN5CisgICAgICAgICAgICBDSEVDSyhici5nZXRCaXRzKDEpKTsgIC8vIG1hcmtlcl9iaXQKKyAgICAgICAgICAgIGJyLnNraXBCaXRzKDE1KTsgIC8vIGxhdHRlcl9oYWxmX3Zidl9vY2N1cGFuY3kKKyAgICAgICAgICAgIENIRUNLKGJyLmdldEJpdHMoMSkpOyAgLy8gbWFya2VyX2JpdAorICAgICAgICB9CisgICAgfQorICAgIHVuc2lnbmVkIHZpZGVvX29iamVjdF9sYXllcl9zaGFwZSA9IGJyLmdldEJpdHMoMik7CisgICAgQ0hFQ0tfRVEodmlkZW9fb2JqZWN0X2xheWVyX3NoYXBlLCAweDAwdSAvKiByZWN0YW5ndWxhciAqLyk7CisKKyAgICBDSEVDSyhici5nZXRCaXRzKDEpKTsgIC8vIG1hcmtlcl9iaXQKKyAgICB1bnNpZ25lZCB2b3BfdGltZV9pbmNyZW1lbnRfcmVzb2x1dGlvbiA9IGJyLmdldEJpdHMoMTYpOworICAgIENIRUNLKGJyLmdldEJpdHMoMSkpOyAgLy8gbWFya2VyX2JpdAorCisgICAgaWYgKGJyLmdldEJpdHMoMSkpIHsgIC8vIGZpeGVkX3ZvcF9yYXRlCisgICAgICAgIC8vIHJhbmdlIFswLi52b3BfdGltZV9pbmNyZW1lbnRfcmVzb2x1dGlvbikKKworICAgICAgICAvLyB2b3BfdGltZV9pbmNyZW1lbnRfcmVzb2x1dGlvbgorICAgICAgICAvLyAyID0+IDAuLjEsIDEgYml0CisgICAgICAgIC8vIDMgPT4gMC4uMiwgMiBiaXRzCisgICAgICAgIC8vIDQgPT4gMC4uMywgMiBiaXRzCisgICAgICAgIC8vIDUgPT4gMC4uNCwgMyBiaXRzCisgICAgICAgIC8vIC4uLgorCisgICAgICAgIENIRUNLX0dUKHZvcF90aW1lX2luY3JlbWVudF9yZXNvbHV0aW9uLCAwdSk7CisgICAgICAgIC0tdm9wX3RpbWVfaW5jcmVtZW50X3Jlc29sdXRpb247CisKKyAgICAgICAgdW5zaWduZWQgbnVtQml0cyA9IDA7CisgICAgICAgIHdoaWxlICh2b3BfdGltZV9pbmNyZW1lbnRfcmVzb2x1dGlvbiA+IDApIHsKKyAgICAgICAgICAgICsrbnVtQml0czsKKyAgICAgICAgICAgIHZvcF90aW1lX2luY3JlbWVudF9yZXNvbHV0aW9uID4+PSAxOworICAgICAgICB9CisKKyAgICAgICAgYnIuc2tpcEJpdHMobnVtQml0cyk7ICAvLyBmaXhlZF92b3BfdGltZV9pbmNyZW1lbnQKKyAgICB9CisKKyAgICBDSEVDSyhici5nZXRCaXRzKDEpKTsgIC8vIG1hcmtlcl9iaXQKKyAgICB1bnNpZ25lZCB2aWRlb19vYmplY3RfbGF5ZXJfd2lkdGggPSBici5nZXRCaXRzKDEzKTsKKyAgICBDSEVDSyhici5nZXRCaXRzKDEpKTsgIC8vIG1hcmtlcl9iaXQKKyAgICB1bnNpZ25lZCB2aWRlb19vYmplY3RfbGF5ZXJfaGVpZ2h0ID0gYnIuZ2V0Qml0cygxMyk7CisgICAgQ0hFQ0soYnIuZ2V0Qml0cygxKSk7ICAvLyBtYXJrZXJfYml0CisKKyAgICB1bnNpZ25lZCBpbnRlcmxhY2VkIF9fdW51c2VkID0gYnIuZ2V0Qml0cygxKTsKKworICAgICp3aWR0aCA9IHZpZGVvX29iamVjdF9sYXllcl93aWR0aDsKKyAgICAqaGVpZ2h0ID0gdmlkZW9fb2JqZWN0X2xheWVyX2hlaWdodDsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEdldE1QRUdBdWRpb0ZyYW1lU2l6ZSgKKyAgICAgICAgdWludDMyX3QgaGVhZGVyLCBzaXplX3QgKmZyYW1lX3NpemUsCisgICAgICAgIGludCAqb3V0X3NhbXBsaW5nX3JhdGUsIGludCAqb3V0X2NoYW5uZWxzLAorICAgICAgICBpbnQgKm91dF9iaXRyYXRlLCBpbnQgKm91dF9udW1fc2FtcGxlcykgeworICAgICpmcmFtZV9zaXplID0gMDsKKworICAgIGlmIChvdXRfc2FtcGxpbmdfcmF0ZSkgeworICAgICAgICAqb3V0X3NhbXBsaW5nX3JhdGUgPSAwOworICAgIH0KKworICAgIGlmIChvdXRfY2hhbm5lbHMpIHsKKyAgICAgICAgKm91dF9jaGFubmVscyA9IDA7CisgICAgfQorCisgICAgaWYgKG91dF9iaXRyYXRlKSB7CisgICAgICAgICpvdXRfYml0cmF0ZSA9IDA7CisgICAgfQorCisgICAgaWYgKG91dF9udW1fc2FtcGxlcykgeworICAgICAgICAqb3V0X251bV9zYW1wbGVzID0gMTE1MjsKKyAgICB9CisKKyAgICBpZiAoKGhlYWRlciAmIDB4ZmZlMDAwMDApICE9IDB4ZmZlMDAwMDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVuc2lnbmVkIHZlcnNpb24gPSAoaGVhZGVyID4+IDE5KSAmIDM7CisKKyAgICBpZiAodmVyc2lvbiA9PSAweDAxKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBsYXllciA9IChoZWFkZXIgPj4gMTcpICYgMzsKKworICAgIGlmIChsYXllciA9PSAweDAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBwcm90ZWN0aW9uIF9fdW51c2VkID0gKGhlYWRlciA+PiAxNikgJiAxOworCisgICAgdW5zaWduZWQgYml0cmF0ZV9pbmRleCA9IChoZWFkZXIgPj4gMTIpICYgMHgwZjsKKworICAgIGlmIChiaXRyYXRlX2luZGV4ID09IDAgfHwgYml0cmF0ZV9pbmRleCA9PSAweDBmKSB7CisgICAgICAgIC8vIERpc2FsbG93ICJmcmVlIiBiaXRyYXRlLgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdW5zaWduZWQgc2FtcGxpbmdfcmF0ZV9pbmRleCA9IChoZWFkZXIgPj4gMTApICYgMzsKKworICAgIGlmIChzYW1wbGluZ19yYXRlX2luZGV4ID09IDMpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0YXRpYyBjb25zdCBpbnQga1NhbXBsaW5nUmF0ZVYxW10gPSB7IDQ0MTAwLCA0ODAwMCwgMzIwMDAgfTsKKyAgICBpbnQgc2FtcGxpbmdfcmF0ZSA9IGtTYW1wbGluZ1JhdGVWMVtzYW1wbGluZ19yYXRlX2luZGV4XTsKKyAgICBpZiAodmVyc2lvbiA9PSAyIC8qIFYyICovKSB7CisgICAgICAgIHNhbXBsaW5nX3JhdGUgLz0gMjsKKyAgICB9IGVsc2UgaWYgKHZlcnNpb24gPT0gMCAvKiBWMi41ICovKSB7CisgICAgICAgIHNhbXBsaW5nX3JhdGUgLz0gNDsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBwYWRkaW5nID0gKGhlYWRlciA+PiA5KSAmIDE7CisKKyAgICBpZiAobGF5ZXIgPT0gMykgeworICAgICAgICAvLyBsYXllciBJCisKKyAgICAgICAgc3RhdGljIGNvbnN0IGludCBrQml0cmF0ZVYxW10gPSB7CisgICAgICAgICAgICAzMiwgNjQsIDk2LCAxMjgsIDE2MCwgMTkyLCAyMjQsIDI1NiwKKyAgICAgICAgICAgIDI4OCwgMzIwLCAzNTIsIDM4NCwgNDE2LCA0NDgKKyAgICAgICAgfTsKKworICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtCaXRyYXRlVjJbXSA9IHsKKyAgICAgICAgICAgIDMyLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwgMTI4LAorICAgICAgICAgICAgMTQ0LCAxNjAsIDE3NiwgMTkyLCAyMjQsIDI1NgorICAgICAgICB9OworCisgICAgICAgIGludCBiaXRyYXRlID0KKyAgICAgICAgICAgICh2ZXJzaW9uID09IDMgLyogVjEgKi8pCisgICAgICAgICAgICAgICAgPyBrQml0cmF0ZVYxW2JpdHJhdGVfaW5kZXggLSAxXQorICAgICAgICAgICAgICAgIDoga0JpdHJhdGVWMltiaXRyYXRlX2luZGV4IC0gMV07CisKKyAgICAgICAgaWYgKG91dF9iaXRyYXRlKSB7CisgICAgICAgICAgICAqb3V0X2JpdHJhdGUgPSBiaXRyYXRlOworICAgICAgICB9CisKKyAgICAgICAgKmZyYW1lX3NpemUgPSAoMTIwMDAgKiBiaXRyYXRlIC8gc2FtcGxpbmdfcmF0ZSArIHBhZGRpbmcpICogNDsKKworICAgICAgICBpZiAob3V0X251bV9zYW1wbGVzKSB7CisgICAgICAgICAgICAqb3V0X251bV9zYW1wbGVzID0gMzg0OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gbGF5ZXIgSUkgb3IgSUlJCisKKyAgICAgICAgc3RhdGljIGNvbnN0IGludCBrQml0cmF0ZVYxTDJbXSA9IHsKKyAgICAgICAgICAgIDMyLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwgMTI4LAorICAgICAgICAgICAgMTYwLCAxOTIsIDIyNCwgMjU2LCAzMjAsIDM4NAorICAgICAgICB9OworCisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQga0JpdHJhdGVWMUwzW10gPSB7CisgICAgICAgICAgICAzMiwgNDAsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLAorICAgICAgICAgICAgMTI4LCAxNjAsIDE5MiwgMjI0LCAyNTYsIDMyMAorICAgICAgICB9OworCisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQga0JpdHJhdGVWMltdID0geworICAgICAgICAgICAgOCwgMTYsIDI0LCAzMiwgNDAsIDQ4LCA1NiwgNjQsCisgICAgICAgICAgICA4MCwgOTYsIDExMiwgMTI4LCAxNDQsIDE2MAorICAgICAgICB9OworCisgICAgICAgIGludCBiaXRyYXRlOworICAgICAgICBpZiAodmVyc2lvbiA9PSAzIC8qIFYxICovKSB7CisgICAgICAgICAgICBiaXRyYXRlID0gKGxheWVyID09IDIgLyogTDIgKi8pCisgICAgICAgICAgICAgICAgPyBrQml0cmF0ZVYxTDJbYml0cmF0ZV9pbmRleCAtIDFdCisgICAgICAgICAgICAgICAgOiBrQml0cmF0ZVYxTDNbYml0cmF0ZV9pbmRleCAtIDFdOworCisgICAgICAgICAgICBpZiAob3V0X251bV9zYW1wbGVzKSB7CisgICAgICAgICAgICAgICAgKm91dF9udW1fc2FtcGxlcyA9IDExNTI7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBWMiAob3IgMi41KQorCisgICAgICAgICAgICBiaXRyYXRlID0ga0JpdHJhdGVWMltiaXRyYXRlX2luZGV4IC0gMV07CisgICAgICAgICAgICBpZiAob3V0X251bV9zYW1wbGVzKSB7CisgICAgICAgICAgICAgICAgKm91dF9udW1fc2FtcGxlcyA9IChsYXllciA9PSAxIC8qIEwzICovKSA/IDU3NiA6IDExNTI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAob3V0X2JpdHJhdGUpIHsKKyAgICAgICAgICAgICpvdXRfYml0cmF0ZSA9IGJpdHJhdGU7CisgICAgICAgIH0KKworICAgICAgICBpZiAodmVyc2lvbiA9PSAzIC8qIFYxICovKSB7CisgICAgICAgICAgICAqZnJhbWVfc2l6ZSA9IDE0NDAwMCAqIGJpdHJhdGUgLyBzYW1wbGluZ19yYXRlICsgcGFkZGluZzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFYyIG9yIFYyLjUKKyAgICAgICAgICAgIHNpemVfdCB0bXAgPSAobGF5ZXIgPT0gMSAvKiBMMyAqLykgPyA3MjAwMCA6IDE0NDAwMDsKKyAgICAgICAgICAgICpmcmFtZV9zaXplID0gdG1wICogYml0cmF0ZSAvIHNhbXBsaW5nX3JhdGUgKyBwYWRkaW5nOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG91dF9zYW1wbGluZ19yYXRlKSB7CisgICAgICAgICpvdXRfc2FtcGxpbmdfcmF0ZSA9IHNhbXBsaW5nX3JhdGU7CisgICAgfQorCisgICAgaWYgKG91dF9jaGFubmVscykgeworICAgICAgICBpbnQgY2hhbm5lbF9tb2RlID0gKGhlYWRlciA+PiA2KSAmIDM7CisKKyAgICAgICAgKm91dF9jaGFubmVscyA9IChjaGFubmVsX21vZGUgPT0gMykgPyAxIDogMjsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oCmluZGV4IGVmMTE0MzQuLjhmZTlmOGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmgKQEAgLTI3LDcgKzI3LDYgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFNZXNzYWdlOwotY2xhc3MgTWVkaWFCdWZmZXJCYXNlOwogCiBzdHJ1Y3QgQUJ1ZmZlciA6IHB1YmxpYyBSZWZCYXNlIHsKICAgICBleHBsaWNpdCBBQnVmZmVyKHNpemVfdCBjYXBhY2l0eSk7CkBAIC00OSwxNyArNDgsMTIgQEAKIAogICAgIHNwPEFNZXNzYWdlPiBtZXRhKCk7CiAKLSAgICBNZWRpYUJ1ZmZlckJhc2UgKmdldE1lZGlhQnVmZmVyQmFzZSgpOwotICAgIHZvaWQgc2V0TWVkaWFCdWZmZXJCYXNlKE1lZGlhQnVmZmVyQmFzZSAqbWVkaWFCdWZmZXIpOwotCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QUJ1ZmZlcigpOwogCiBwcml2YXRlOgogICAgIHNwPEFNZXNzYWdlPiBtTWV0YTsKIAotICAgIE1lZGlhQnVmZmVyQmFzZSAqbU1lZGlhQnVmZmVyQmFzZTsKLQogICAgIHZvaWQgKm1EYXRhOwogICAgIHNpemVfdCBtQ2FwYWNpdHk7CiAgICAgc2l6ZV90IG1SYW5nZU9mZnNldDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEYXRhLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGF0YS5oCmluZGV4IDQ5YWEwZGMuLjg1ZTQzNzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEYXRhLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURhdGEuaApAQCAtMjUsNiArMjUsOSBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vVHlwZVRyYWl0cy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vRmxhZ2dlZC5oPgogCisjdW5kZWYgSElERQorI2RlZmluZSBISURFIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImhpZGRlbiIpKSkKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvKioKQEAgLTc4LDcgKzgxLDcgQEAKICAqIFRoaXMgY2xhc3MgaXMgbmVlZGVkIGFzIG1lbWJlciBmdW5jdGlvbiBzcGVjaWFsaXphdGlvbiBpcyBub3QgYWxsb3dlZCBmb3IgYQogICogdGVtcGxhdGVkIGNsYXNzLgogICovCi1zdHJ1Y3QgX0FVbmlvbl9pbXBsIHsKK3N0cnVjdCBISURFIF9BVW5pb25faW1wbCB7CiAgICAgLyoqCiAgICAgICogQ2FsbHMgcGxhY2VtZW50IGNvbnN0dWN0b3IgZm9yIHR5cGUgVCB3aXRoIGFyYml0cmFyeSBhcmd1bWVudHMgZm9yIGEgc3RvcmFnZSBhdCBhbiBhZGRyZXNzLgogICAgICAqIFN0b3JhZ2UgTVVTVCBiZSBsYXJnZSBlbm91Z2ggdG8gY29udGFpbiBULgpAQCAtMTEzLDEzICsxMTYsMTMgQEAKIAogLyoqIENvbnN0cnVjdG9yIHNwZWNpYWxpemF0aW9uIGZvciB2b2lkIHR5cGUgKi8KIHRlbXBsYXRlPD4KLWlubGluZSB2b2lkIF9BVW5pb25faW1wbDo6ZW1wbGFjZTx2b2lkPihzaXplX3QgdG90YWxTaXplLCB2b2lkICphZGRyKSB7CitISURFIGlubGluZSB2b2lkIF9BVW5pb25faW1wbDo6ZW1wbGFjZTx2b2lkPihzaXplX3QgdG90YWxTaXplLCB2b2lkICphZGRyKSB7CiAgICAgbWVtc2V0KGFkZHIsIDAsIHRvdGFsU2l6ZSk7CiB9CiAKIC8qKiBEZXN0cnVjdG9yIHNwZWNpYWxpemF0aW9uIGZvciB2b2lkIHR5cGUgKi8KIHRlbXBsYXRlPD4KLWlubGluZSB2b2lkIF9BVW5pb25faW1wbDo6ZGVsPHZvaWQ+KHZvaWQgKikgeworSElERSBpbmxpbmUgdm9pZCBfQVVuaW9uX2ltcGw6OmRlbDx2b2lkPih2b2lkICopIHsKIH0KIAogLy8vIFxlbmRjb25kCkBAIC0yMjEsNyArMjI0LDcgQEAKIHRlbXBsYXRlPAogICAgICAgICB0eXBlbmFtZSBULAogICAgICAgICBib29sPXN0ZDo6aXNfY29weV9hc3NpZ25hYmxlPFQ+Ojp2YWx1ZT4KLXN0cnVjdCBfQURhdGFfY29waWVyIHsKK3N0cnVjdCBISURFIF9BRGF0YV9jb3BpZXIgewogICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19jb3B5X2Fzc2lnbmFibGU8VD46OnZhbHVlLCAiVCBtdXN0IGJlIGNvcHkgYXNzaWduYWJsZSBoZXJlIik7CiAKICAgICAvKioKQEAgLTI5NCw3ICsyOTcsNyBAQAogICoKICAqLwogdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXN0cnVjdCBfQURhdGFfY29waWVyPFQsIGZhbHNlPiB7CitzdHJ1Y3QgSElERSBfQURhdGFfY29waWVyPFQsIGZhbHNlPiB7CiAgICAgc3RhdGljX2Fzc2VydCghc3RkOjppc19jb3B5X2Fzc2lnbmFibGU8VD46OnZhbHVlLCAiVCBtdXN0IG5vdCBiZSBjb3B5IGFzc2lnbmFibGUgaGVyZSIpOwogICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19jb3B5X2NvbnN0cnVjdGlibGU8VD46OnZhbHVlLCAiVCBtdXN0IGJlIGNvcHkgY29uc3RydWN0aWJsZSBoZXJlIik7CiAKQEAgLTMxOCw3ICszMjEsNyBAQAogdGVtcGxhdGU8CiAgICAgICAgIHR5cGVuYW1lIFQsCiAgICAgICAgIGJvb2w9c3RkOjppc19tb3ZlX2Fzc2lnbmFibGU8VD46OnZhbHVlPgotc3RydWN0IF9BRGF0YV9tb3ZlciB7CitzdHJ1Y3QgSElERSBfQURhdGFfbW92ZXIgewogICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19tb3ZlX2Fzc2lnbmFibGU8VD46OnZhbHVlLCAiVCBtdXN0IGJlIG1vdmUgYXNzaWduYWJsZSBoZXJlIik7CiAKICAgICAvKioKQEAgLTM4OSw3ICszOTIsNyBAQAogICoKICAqLwogdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXN0cnVjdCBfQURhdGFfbW92ZXI8VCwgZmFsc2U+IHsKK3N0cnVjdCBISURFIF9BRGF0YV9tb3ZlcjxULCBmYWxzZT4gewogICAgIHN0YXRpY19hc3NlcnQoIXN0ZDo6aXNfbW92ZV9hc3NpZ25hYmxlPFQ+Ojp2YWx1ZSwgIlQgbXVzdCBub3QgYmUgbW92ZSBhc3NpZ25hYmxlIGhlcmUiKTsKICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfbW92ZV9jb25zdHJ1Y3RpYmxlPFQ+Ojp2YWx1ZSwgIlQgbXVzdCBiZSBtb3ZlIGNvbnN0cnVjdGlibGUgaGVyZSIpOwogCkBAIC00MDcsMTMgKzQxMCwxMyBAQAogICogXHBhcmFtIFRzIHR5cGVzIHRvIGNvbnNpZGVyIGZvciB0aGUgbWVtYmVyCiAgKi8KIHRlbXBsYXRlPHR5cGVuYW1lIEZsYWdnZXIsIHR5cGVuYW1lIFUsIHR5cGVuYW1lIC4uLlRzPgotc3RydWN0IF9BRGF0YV9kZWxldGVyOworc3RydWN0IEhJREUgX0FEYXRhX2RlbGV0ZXI7CiAKIC8qKgogICogVGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gd2hlbiB0aGVyZSBhcmUgc3RpbGwgdHlwZXMgdG8gY29uc2lkZXIgKFQgYW5kIHJlc3QpCiAgKi8KIHRlbXBsYXRlPHR5cGVuYW1lIEZsYWdnZXIsIHR5cGVuYW1lIFUsIHR5cGVuYW1lIFQsIHR5cGVuYW1lIC4uLlRzPgotc3RydWN0IF9BRGF0YV9kZWxldGVyPEZsYWdnZXIsIFUsIFQsIFRzLi4uPiB7CitzdHJ1Y3QgSElERSBfQURhdGFfZGVsZXRlcjxGbGFnZ2VyLCBVLCBULCBUcy4uLj4gewogICAgIHN0YXRpYyBib29sIGRlbCh0eXBlbmFtZSBGbGFnZ2VyOjp0eXBlIGZsYWdzLCBVICZkYXRhKSB7CiAgICAgICAgIGlmIChGbGFnZ2VyOjpjYW5EZWxldGVBcyhmbGFncywgRmxhZ2dlcjo6ZmxhZ0ZvcigoVCopMCkpKSB7CiAgICAgICAgICAgICBkYXRhLnRlbXBsYXRlIGRlbDxUPigpOwpAQCAtNDI3LDEzICs0MzAsMTAxIEBACiAgKiBUZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiB3aGVuIHRoZXJlIGFyZSBubyBtb3JlIHR5cGVzIHRvIGNvbnNpZGVyLgogICovCiB0ZW1wbGF0ZTx0eXBlbmFtZSBGbGFnZ2VyLCB0eXBlbmFtZSBVPgotc3RydWN0IF9BRGF0YV9kZWxldGVyPEZsYWdnZXIsIFU+IHsKK3N0cnVjdCBISURFIF9BRGF0YV9kZWxldGVyPEZsYWdnZXIsIFU+IHsKICAgICBpbmxpbmUgc3RhdGljIGJvb2wgZGVsKHR5cGVuYW1lIEZsYWdnZXI6OnR5cGUsIFUgJikgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogfTsKIAogLyoqCisgKiBIZWxwZXIgdGVtcGxhdGUgdGhhdCBjb3B5IGFzc2lnbnMgYW4gb2JqZWN0IG9mIGEgc3BlY2lmaWMgdHlwZSAobWVtYmVyKSBpbiBhbgorICogQVVuaW9uLgorICoKKyAqIFxwYXJhbSBGbGFnZ2VyIHR5cGUgZmxhZ2dlciBjbGFzcyAoc2VlIEFEYXRhKQorICogXHBhcmFtIFUgQVVuaW9uIG9iamVjdCBpbiB3aGljaCB0aGUgbWVtYmVyIHNob3VsZCBiZSBjb3B5IGFzc2lnbmVkCisgKiBccGFyYW0gVHMgdHlwZXMgdG8gY29uc2lkZXIgZm9yIHRoZSBtZW1iZXIKKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgRmxhZ2dlciwgdHlwZW5hbWUgVSwgdHlwZW5hbWUgLi4uVHM+CitzdHJ1Y3QgSElERSBfQURhdGFfY29weV9hc3NpZ25lcjsKKworLyoqCisgKiBUZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiB3aGVuIHRoZXJlIGFyZSBzdGlsbCB0eXBlcyB0byBjb25zaWRlciAoVCBhbmQgcmVzdCkKKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgRmxhZ2dlciwgdHlwZW5hbWUgVSwgdHlwZW5hbWUgVCwgdHlwZW5hbWUgLi4uVHM+CitzdHJ1Y3QgSElERSBfQURhdGFfY29weV9hc3NpZ25lcjxGbGFnZ2VyLCBVLCBULCBUcy4uLj4geworICAgIHN0YXRpYyBib29sIGFzc2lnbih0eXBlbmFtZSBGbGFnZ2VyOjp0eXBlIGZsYWdzLCBVICZkc3QsIGNvbnN0IFUgJnNyYykgeworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfY29weV9jb25zdHJ1Y3RpYmxlPFQ+Ojp2YWx1ZSwgIlQgbXVzdCBiZSBjb3B5IGNvbnN0cnVjdGlibGUiKTsKKyAgICAgICAgLy8gaWYgd2UgY2FuIGRlbGV0ZSBhcywgd2UgY2FuIGFsc28gYXNzaWduIGFzCisgICAgICAgIGlmIChGbGFnZ2VyOjpjYW5EZWxldGVBcyhmbGFncywgRmxhZ2dlcjo6ZmxhZ0ZvcigoVCopMCkpKSB7CisgICAgICAgICAgICBkc3QudGVtcGxhdGUgZW1wbGFjZTxUPihzcmMudGVtcGxhdGUgZ2V0PFQ+KCkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9BRGF0YV9jb3B5X2Fzc2lnbmVyPEZsYWdnZXIsIFUsIFRzLi4uPjo6YXNzaWduKGZsYWdzLCBkc3QsIHNyYyk7CisgICAgfQorfTsKKworLyoqCisgKiBUZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiB3aGVuIHRoZXJlIGFyZSBubyBtb3JlIHR5cGVzIHRvIGNvbnNpZGVyLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBGbGFnZ2VyLCB0eXBlbmFtZSBVPgorc3RydWN0IEhJREUgX0FEYXRhX2NvcHlfYXNzaWduZXI8RmxhZ2dlciwgVT4geworICAgIGlubGluZSBzdGF0aWMgYm9vbCBhc3NpZ24odHlwZW5hbWUgRmxhZ2dlcjo6dHlwZSwgVSAmLCBjb25zdCBVICYpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK307CisKKy8qKgorICogSGVscGVyIHRlbXBsYXRlIHRoYXQgbW92ZSBhc3NpZ25zIGFuIG9iamVjdCBvZiBhIHNwZWNpZmljIHR5cGUgKG1lbWJlcikgaW4gYW4KKyAqIEFVbmlvbi4KKyAqCisgKiBccGFyYW0gRmxhZ2dlciB0eXBlIGZsYWdnZXIgY2xhc3MgKHNlZSBBRGF0YSkKKyAqIFxwYXJhbSBVIEFVbmlvbiBvYmplY3QgaW4gd2hpY2ggdGhlIG1lbWJlciBzaG91bGQgYmUgY29weSBhc3NpZ25lZAorICogXHBhcmFtIFRzIHR5cGVzIHRvIGNvbnNpZGVyIGZvciB0aGUgbWVtYmVyCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIEZsYWdnZXIsIHR5cGVuYW1lIFUsIHR5cGVuYW1lIC4uLlRzPgorc3RydWN0IEhJREUgX0FEYXRhX21vdmVfYXNzaWduZXI7CisKKy8qKgorICogVGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gd2hlbiB0aGVyZSBhcmUgc3RpbGwgdHlwZXMgdG8gY29uc2lkZXIgKFQgYW5kIHJlc3QpCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIEZsYWdnZXIsIHR5cGVuYW1lIFUsIHR5cGVuYW1lIFQsIHR5cGVuYW1lIC4uLlRzPgorc3RydWN0IEhJREUgX0FEYXRhX21vdmVfYXNzaWduZXI8RmxhZ2dlciwgVSwgVCwgVHMuLi4+IHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWID0gVD4KKyAgICBzdGF0aWMgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19tb3ZlX2NvbnN0cnVjdGlibGU8Vj46OnZhbHVlLCBib29sPjo6dHlwZQorICAgIGFzc2lnbih0eXBlbmFtZSBGbGFnZ2VyOjp0eXBlIGZsYWdzLCBVICZkc3QsIFUgJnNyYykgeworICAgICAgICAvLyBpZiB3ZSBjYW4gZGVsZXRlIGFzLCB3ZSBjYW4gYWxzbyBhc3NpZ24gYXMKKyAgICAgICAgaWYgKEZsYWdnZXI6OmNhbkRlbGV0ZUFzKGZsYWdzLCBGbGFnZ2VyOjpmbGFnRm9yKChUKikwKSkpIHsKKyAgICAgICAgICAgIGRzdC50ZW1wbGF0ZSBlbXBsYWNlPFQ+KHN0ZDo6bW92ZShzcmMudGVtcGxhdGUgZ2V0PFQ+KCkpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfQURhdGFfbW92ZV9hc3NpZ25lcjxGbGFnZ2VyLCBVLCBUcy4uLj46OmFzc2lnbihmbGFncywgZHN0LCBzcmMpOworICAgIH0KKworICAgIC8vIEZhbGwgYmFjayB0byBjb3B5IGNvbnN0cnVjdGlvbiBpZiBUIGlzIG5vdCBtb3ZlIGNvbnN0cnVjdGlibGUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWID0gVD4KKyAgICBzdGF0aWMgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8IXN0ZDo6aXNfbW92ZV9jb25zdHJ1Y3RpYmxlPFY+Ojp2YWx1ZSwgYm9vbD46OnR5cGUKKyAgICBhc3NpZ24odHlwZW5hbWUgRmxhZ2dlcjo6dHlwZSBmbGFncywgVSAmZHN0LCBVICZzcmMpIHsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2NvcHlfY29uc3RydWN0aWJsZTxUPjo6dmFsdWUsICJUIG11c3QgYmUgY29weSBjb25zdHJ1Y3RpYmxlIik7CisgICAgICAgIC8vIGlmIHdlIGNhbiBkZWxldGUgYXMsIHdlIGNhbiBhbHNvIGFzc2lnbiBhcworICAgICAgICBpZiAoRmxhZ2dlcjo6Y2FuRGVsZXRlQXMoZmxhZ3MsIEZsYWdnZXI6OmZsYWdGb3IoKFQqKTApKSkgeworICAgICAgICAgICAgZHN0LnRlbXBsYXRlIGVtcGxhY2U8VD4oc3JjLnRlbXBsYXRlIGdldDxUPigpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfQURhdGFfbW92ZV9hc3NpZ25lcjxGbGFnZ2VyLCBVLCBUcy4uLj46OmFzc2lnbihmbGFncywgZHN0LCBzcmMpOworICAgIH0KK307CisKKy8qKgorICogVGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gd2hlbiB0aGVyZSBhcmUgbm8gbW9yZSB0eXBlcyB0byBjb25zaWRlci4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgRmxhZ2dlciwgdHlwZW5hbWUgVT4KK3N0cnVjdCBISURFIF9BRGF0YV9tb3ZlX2Fzc2lnbmVyPEZsYWdnZXIsIFU+IHsKKyAgICBpbmxpbmUgc3RhdGljIGJvb2wgYXNzaWduKHR5cGVuYW1lIEZsYWdnZXI6OnR5cGUsIFUgJiwgVSAmKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9OworCisvKioKICAqIENvbnRhaW5lciB0aGF0IGNhbiBzdG9yZSBhbiBhcmJpdHJhcnkgb2JqZWN0IG9mIGEgc2V0IG9mIHNwZWNpZmllZCB0eXBlcy4KICAqCiAgKiBUaGlzIHN0cnVjdCBpcyBhbiBvdXRlciBjbGFzcyB0aGF0IGNvbnRhaW5zIHZhcmlvdXMgaW5uZXIgY2xhc3NlcyBiYXNlZCBvbiBkZXNpcmVkIHR5cGUKQEAgLTY1NCw2ICs3NDUsNjEgQEAKICAgICAgICAgQ3VzdG9tKCkgOiBiYXNlX3QoRmxhZ2dlcjo6ZmxhZ0Zvcigodm9pZCopMCkpIHsgfQogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBDb3B5IGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgICAgICAqLworICAgICAgICBDdXN0b20mIG9wZXJhdG9yPShjb25zdCBDdXN0b20gJm8pIHsKKyAgICAgICAgICAgIGlmICgmbyAhPSB0aGlzKSB7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnVzZWQoKSAmJiAhdGhpcy0+Y2xlYXIoKSkgeworICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fdHJhcCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoby51c2VkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9BRGF0YV9jb3B5X2Fzc2lnbmVyPEZsYWdnZXIsIGRhdGFfdCwgVHMuLi4+Ojphc3NpZ24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgby5mbGFncygpLCB0aGlzLT5nZXQoKSwgby5nZXQoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnNldEZsYWdzKG8uZmxhZ3MoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fdHJhcCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvcHkgY29uc3RydWN0b3IuCisgICAgICAgICAqLworICAgICAgICBDdXN0b20oY29uc3QgQ3VzdG9tICZvKSA6IEN1c3RvbSgpIHsKKyAgICAgICAgICAgICp0aGlzID0gbzsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBNb3ZlIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgICAgICAqLworICAgICAgICBDdXN0b20mIG9wZXJhdG9yPShDdXN0b20gJiZvKSB7CisgICAgICAgICAgICBpZiAoJm8gIT0gdGhpcykgeworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51c2VkKCkgJiYgIXRoaXMtPmNsZWFyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX3RyYXAoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG8udXNlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfQURhdGFfbW92ZV9hc3NpZ25lcjxGbGFnZ2VyLCBkYXRhX3QsIFRzLi4uPjo6YXNzaWduKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uZmxhZ3MoKSwgdGhpcy0+Z2V0KCksIG8uZ2V0KCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5zZXRGbGFncyhvLmZsYWdzKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgby5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX3RyYXAoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBNb3ZlIGNvbnN0cnVjdG9yLgorICAgICAgICAgKi8KKyAgICAgICAgQ3VzdG9tKEN1c3RvbSAmJm8pIDogQ3VzdG9tKCkgeworICAgICAgICAgICAgKnRoaXMgPSBzdGQ6Om1vdmUobyk7CisgICAgICAgIH0KKworICAgICAgICAvKioKICAgICAgICAgICogUmVtb3ZlcyB0aGUgY29udGFpbmVkIG9iamVjdCwgaWYgYW55LgogICAgICAgICAgKi8KICAgICAgICAgfkN1c3RvbSgpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmgKaW5kZXggYjQ5OGM5MS4uYmFjOGZhOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmgKQEAgLTgyLDYgKzgyLDEwIEBACiBNQUtFX0NPTVBBUkFUT1IoTFQsPCkKIE1BS0VfQ09NUEFSQVRPUihHVCw+KQogCisjaWZkZWYgQ0hFQ0tfT1AKKyN1bmRlZiBDSEVDS19PUAorI2VuZGlmCisKICNkZWZpbmUgQ0hFQ0tfT1AoeCx5LHN1ZmZpeCxvcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgQVN0cmluZyBfX19yZXMgPSBDb21wYXJlXyMjc3VmZml4KHgsIHkpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oCmluZGV4IDg1ODBlYjUuLjc0MjY1MWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaApAQCAtMTksNiArMTksNyBAQAogI2RlZmluZSBBX01FU1NBR0VfSF8KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CkBAIC0xNTUsNiArMTU2LDkgQEAKICAgICAvLyB0aGVpciByZWZjb3VudCBpbmNyZW1lbnRlZC4KICAgICBzcDxBTWVzc2FnZT4gZHVwKCkgY29uc3Q7CiAKKyAgICAvLyBBZGRzIGFsbCBpdGVtcyBmcm9tIG90aGVyIGludG8gdGhpcy4KKyAgICB2b2lkIGV4dGVuZChjb25zdCBzcDxBTWVzc2FnZT4gJm90aGVyKTsKKwogICAgIC8vIFBlcmZvcm1zIGEgc2hhbGxvdyBvciBkZWVwIGNvbXBhcmlzb24gb2YgfHRoaXN8IGFuZCB8b3RoZXJ8IGFuZCByZXR1cm5zCiAgICAgLy8gYW4gQU1lc3NhZ2Ugd2l0aCB0aGUgZGlmZmVyZW5jZXMuCiAgICAgLy8gV2FybmluZzogUmVmQmFzZSBpdGVtcywgaS5lLiAib2JqZWN0cyIgYXJlIF9ub3RfIGNvcGllZCBidXQgb25seSBoYXZlCkBAIC0xODAsOSArMTg0LDgxIEBACiAgICAgICAgIGtUeXBlQnVmZmVyLAogICAgIH07CiAKKyAgICBzdHJ1Y3QgUmVjdCB7CisgICAgICAgIGludDMyX3QgbUxlZnQsIG1Ub3AsIG1SaWdodCwgbUJvdHRvbTsKKyAgICB9OworCiAgICAgc2l6ZV90IGNvdW50RW50cmllcygpIGNvbnN0OwogICAgIGNvbnN0IGNoYXIgKmdldEVudHJ5TmFtZUF0KHNpemVfdCBpbmRleCwgVHlwZSAqdHlwZSkgY29uc3Q7CiAKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGl0ZW0gYXQgYSBzcGVjaWZpYyBpbmRleC4KKyAgICAgKi8KKyAgICB0eXBlZGVmIEFEYXRhPAorICAgICAgICBpbnQzMl90LCBpbnQ2NF90LCBzaXplX3QsIGZsb2F0LCBkb3VibGUsIFJlY3QsIEFTdHJpbmcsCisgICAgICAgIHZvaWQgKiwgc3A8QU1lc3NhZ2U+LCBzcDxBQnVmZmVyPiwgc3A8UmVmQmFzZT4+OjpCYXNpYyBJdGVtRGF0YTsKKworICAgIC8qKgorICAgICAqIEZpbmRzIGFuIGl0ZW0gYnkgbmFtZS4gVGhpcyBjYW4gYmUgdXNlZCBpZiB0aGUgdHlwZSBpcyB1bmtub3duLgorICAgICAqCisgICAgICogXHBhcmFtIG5hbWUgbmFtZSBvZiB0aGUgaXRlbQorICAgICAqIFJldHVybnMgYW4gZW1wdHkgaXRlbSBpZiBubyBpdGVtIGlzIHByZXNlbnQgd2l0aCB0aGF0IG5hbWUuCisgICAgICovCisgICAgSXRlbURhdGEgZmluZEl0ZW0oY29uc3QgY2hhciAqbmFtZSkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGFuIGl0ZW0gb2YgYXJiaXRyYXJ5IHR5cGUuIERvZXMgbm90aGluZyBpZiB0aGUgaXRlbSB2YWx1ZSBpcyBlbXB0eS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBuYW1lIG5hbWUgb2YgdGhlIGl0ZW0KKyAgICAgKiBccGFyYW0gaXRlbSB2YWx1ZSBvZiB0aGUgaXRlbQorICAgICAqLworICAgIHZvaWQgc2V0SXRlbShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBJdGVtRGF0YSAmaXRlbSk7CisKKyAgICBJdGVtRGF0YSBnZXRFbnRyeUF0KHNpemVfdCBpbmRleCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBGaW5kcyBhbiBlbnRyeSBieSBuYW1lIGFuZCByZXR1cm5zIGl0cyBpbmRleC4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgY291bnRFbnRyaWVzKCkgaWYgdGhlIGVudHJ5IGlzIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBzaXplX3QgZmluZEVudHJ5QnlOYW1lKGNvbnN0IGNoYXIgKm5hbWUpIGNvbnN0OworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbmFtZSBvZiBhbiBlbnRyeSBiYXNlZCBvbiBpbmRleC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBpbmRleCBpbmRleCBvZiB0aGUgZW50cnkKKyAgICAgKiBccGFyYW0gbmFtZSAobmV3KSBuYW1lIG9mIHRoZSBlbnRyeQorICAgICAqCisgICAgICogXHJldHZhbCBPSyB0aGUgbmFtZSB3YXMgc2V0IHN1Y2Nlc3NmdWxseQorICAgICAqIFxyZXR2YWwgQkFEX0lOREVYIGludmFsaWQgaW5kZXgKKyAgICAgKiBccmV0dmFsIEJBRF9WQUxVRSBuYW1lIGlzIGludmFsaWQgKG51bGwpCisgICAgICogXHJldHZhbCBBTFJFQURZX0VYSVNUUyBuYW1lIGlzIGFscmVhZHkgdXNlZCBieSBhbm90aGVyIGVudHJ5CisgICAgICovCisgICAgc3RhdHVzX3Qgc2V0RW50cnlOYW1lQXQoc2l6ZV90IGluZGV4LCBjb25zdCBjaGFyICpuYW1lKTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGl0ZW0gb2YgYW4gZW50cnkgYmFzZWQgb24gaW5kZXguCisgICAgICoKKyAgICAgKiBccGFyYW0gaW5kZXggaW5kZXggb2YgdGhlIGVudHJ5CisgICAgICogXHBhcmFtIGl0ZW0gbmV3IGl0ZW0gb2YgdGhlIGVudHJ5CisgICAgICoKKyAgICAgKiBccmV0dmFsIE9LIHRoZSBpdGVtIHdhcyBzZXQgc3VjY2Vzc2Z1bGx5CisgICAgICogXHJldHZhbCBCQURfSU5ERVggaW52YWxpZCBpbmRleAorICAgICAqIFxyZXR2YWwgQkFEX1ZBTFVFIGl0ZW0gaXMgaW52YWxpZCAobnVsbCkKKyAgICAgKiBccmV0dmFsIEJBRF9UWVBFIHR5cGUgaXMgdW5zdXBwb3J0ZWQgKHNob3VsZCBub3QgaGFwcGVuKQorICAgICAqLworICAgIHN0YXR1c190IHNldEVudHJ5QXQoc2l6ZV90IGluZGV4LCBjb25zdCBJdGVtRGF0YSAmaXRlbSk7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGFuIGVudHJ5IGJhc2VkIG9uIGluZGV4LgorICAgICAqCisgICAgICogXHBhcmFtIGluZGV4IGluZGV4IG9mIHRoZSBlbnRyeQorICAgICAqCisgICAgICogXHJldHZhbCBPSyB0aGUgZW50cnkgd2FzIHJlbW92ZWQgc3VjY2Vzc2Z1bGx5CisgICAgICogXHJldHZhbCBCQURfSU5ERVggaW52YWxpZCBpbmRleAorICAgICAqLworICAgIHN0YXR1c190IHJlbW92ZUVudHJ5QXQoc2l6ZV90IGluZGV4KTsKKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkFNZXNzYWdlKCk7CiAKQEAgLTE5NywxMCArMjczLDYgQEAKICAgICB3cDxBSGFuZGxlcj4gbUhhbmRsZXI7CiAgICAgd3A8QUxvb3Blcj4gbUxvb3BlcjsKIAotICAgIHN0cnVjdCBSZWN0IHsKLSAgICAgICAgaW50MzJfdCBtTGVmdCwgbVRvcCwgbVJpZ2h0LCBtQm90dG9tOwotICAgIH07Ci0KICAgICBzdHJ1Y3QgSXRlbSB7CiAgICAgICAgIHVuaW9uIHsKICAgICAgICAgICAgIGludDMyX3QgaW50MzJWYWx1ZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmgKaW5kZXggMjU1YTBmNC4uYWY2YjM1NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmgKQEAgLTIyLDI4ICsyMiwyOCBAQAogCiAvKiBUIG11c3QgYmUgaW50ZWdlciB0eXBlLCBkZW4gbXVzdCBub3QgYmUgMCAqLwogdGVtcGxhdGU8Y2xhc3MgVD4KLWlubGluZSBzdGF0aWMgY29uc3QgVCBkaXZSb3VuZChjb25zdCBUICZub20sIGNvbnN0IFQgJmRlbikgewotICAgIGlmICgobm9tID49IDApIF4gKGRlbiA+PSAwKSkgewotICAgICAgICByZXR1cm4gKG5vbSAtIGRlbiAvIDIpIC8gZGVuOworaW5saW5lIHN0YXRpYyBjb25zdCBUIGRpdlJvdW5kKGNvbnN0IFQgJm51bSwgY29uc3QgVCAmZGVuKSB7CisgICAgaWYgKChudW0gPj0gMCkgXiAoZGVuID49IDApKSB7CisgICAgICAgIHJldHVybiAobnVtIC0gZGVuIC8gMikgLyBkZW47CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIChub20gKyBkZW4gLyAyKSAvIGRlbjsKKyAgICAgICAgcmV0dXJuIChudW0gKyBkZW4gLyAyKSAvIGRlbjsKICAgICB9CiB9CiAKLS8qID09IGNlaWwobm9tIC8gZGVuKS4gVCBtdXN0IGJlIGludGVnZXIgdHlwZSwgZGVuIG11c3Qgbm90IGJlIDAgKi8KKy8qID09IGNlaWwobnVtIC8gZGVuKS4gVCBtdXN0IGJlIGludGVnZXIgdHlwZSwgZGVuIG11c3Qgbm90IGJlIDAgKi8KIHRlbXBsYXRlPGNsYXNzIFQ+Ci1pbmxpbmUgc3RhdGljIGNvbnN0IFQgZGl2VXAoY29uc3QgVCAmbm9tLCBjb25zdCBUICZkZW4pIHsKK2lubGluZSBzdGF0aWMgY29uc3QgVCBkaXZVcChjb25zdCBUICZudW0sIGNvbnN0IFQgJmRlbikgewogICAgIGlmIChkZW4gPCAwKSB7Ci0gICAgICAgIHJldHVybiAobm9tIDwgMCA/IG5vbSArIGRlbiArIDEgOiBub20pIC8gZGVuOworICAgICAgICByZXR1cm4gKG51bSA8IDAgPyBudW0gKyBkZW4gKyAxIDogbnVtKSAvIGRlbjsKICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gKG5vbSA8IDAgPyBub20gOiBub20gKyBkZW4gLSAxKSAvIGRlbjsKKyAgICAgICAgcmV0dXJuIChudW0gPCAwID8gbnVtIDogbnVtICsgZGVuIC0gMSkgLyBkZW47CiAgICAgfQogfQogCi0vKiA9PSBjZWlsKG5vbSAvIGRlbikgKiBkZW4uIFQgbXVzdCBiZSBpbnRlZ2VyIHR5cGUsIGFsaWdubWVudCBtdXN0IGJlIHBvc2l0aXZlIHBvd2VyIG9mIDIgKi8KKy8qID09IGNlaWwobnVtIC8gZGVuKSAqIGRlbi4gVCBtdXN0IGJlIGludGVnZXIgdHlwZSwgYWxpZ25tZW50IG11c3QgYmUgcG9zaXRpdmUgcG93ZXIgb2YgMiAqLwogdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4KLWlubGluZSBzdGF0aWMgY29uc3QgVCBhbGlnbihjb25zdCBUICZub20sIGNvbnN0IFUgJmRlbikgewotICAgIHJldHVybiAobm9tICsgKFQpKGRlbiAtIDEpKSAmIChUKX4oZGVuIC0gMSk7CitpbmxpbmUgc3RhdGljIGNvbnN0IFQgYWxpZ24oY29uc3QgVCAmbnVtLCBjb25zdCBVICZkZW4pIHsKKyAgICByZXR1cm4gKG51bSArIChUKShkZW4gLSAxKSkgJiAoVCl+KGRlbiAtIDEpOwogfQogCiB0ZW1wbGF0ZTxjbGFzcyBUPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDM0ZjgxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQllURV9VVElMU19ICisKKyNkZWZpbmUgQllURV9VVElMU19ICisKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgaW50IEZPVVJDQyh1bnNpZ25lZCBjaGFyIGMxLCB1bnNpZ25lZCBjaGFyIGMyLCB1bnNpZ25lZCBjaGFyIGMzLCB1bnNpZ25lZCBjaGFyIGM0KSB7CisgICAgcmV0dXJuICgoYzEpIDw8IDI0IHwgKGMyKSA8PCAxNiB8IChjMykgPDwgOCB8IChjNCkpOworfQorCit0ZW1wbGF0ZSA8c2l6ZV90IE4+Citjb25zdGV4cHIgaW50MzJfdCBGT1VSQ0MoY29uc3QgY2hhciAoJnMpIFtOXSkgeworICAgIHN0YXRpY19hc3NlcnQoTiA9PSA1LCAiZm91cmNjOiB3cm9uZyBsZW5ndGgiKTsKKyAgICByZXR1cm4KKyAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKSBzWzBdIDw8IDI0IHwKKyAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKSBzWzFdIDw8IDE2IHwKKyAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKSBzWzJdIDw8IDggfAorICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIpIHNbM10gPDwgMDsKK30KKworCit1aW50MTZfdCBVMTZfQVQoY29uc3QgdWludDhfdCAqcHRyKTsKK3VpbnQzMl90IFUzMl9BVChjb25zdCB1aW50OF90ICpwdHIpOwordWludDY0X3QgVTY0X0FUKGNvbnN0IHVpbnQ4X3QgKnB0cik7CisKK3VpbnQxNl90IFUxNkxFX0FUKGNvbnN0IHVpbnQ4X3QgKnB0cik7Cit1aW50MzJfdCBVMzJMRV9BVChjb25zdCB1aW50OF90ICpwdHIpOwordWludDY0X3QgVTY0TEVfQVQoY29uc3QgdWludDhfdCAqcHRyKTsKKwordWludDY0X3QgbnRvaDY0KHVpbnQ2NF90IHgpOwordWludDY0X3QgaHRvbjY0KHVpbnQ2NF90IHgpOworCit2b2lkIE1ha2VGb3VyQ0NTdHJpbmcodWludDMyX3QgeCwgY2hhciAqcyk7CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQllURV9VVElMU19ICisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaAppbmRleCBiODg5YTAyLi5kNmM3NjhkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oCkBAIC0zOSwyNiArMzksMjggQEAKICAgICAgKiB2ZW5kb3ItZXh0ZW5zaW9uIHNlY3Rpb24gc28gdGhleSB3b24ndCBjb2xsaWRlIHdpdGggZnV0dXJlIHBsYXRmb3JtIHZhbHVlcy4KICAgICAgKi8KIAotI2RlZmluZSBHRVRfSEFMX0VOVU0oY2xhc3MsIG5hbWUpIEhBTF9EQVRBU1BBQ0VfIyNjbGFzcyMjbmFtZQotI2RlZmluZSBHRVRfSEFMX0JJVEZJRUxEKGNsYXNzLCBuYW1lKSAoR0VUX0hBTF9FTlVNKGNsYXNzLCBfIyNuYW1lKSA+PiBHRVRfSEFMX0VOVU0oY2xhc3MsIF9TSElGVCkpCi0KKyAgICAvKioKKyAgICAgKiBncmFwaGljLmggY29uc3RhbnRzIGNoYW5nZWQgaW4gQW5kcm9pZCA4LjAgYWZ0ZXIgQ29sb3JTdGFuZGFyZCB2YWx1ZXMgd2VyZSBhbHJlYWR5IHB1YmxpYworICAgICAqIGluIEFuZHJvaWQgNy4wLiBXZSB3aWxsIG5vdCBkZWFsIHdpdGggdGhlIGJyZWFrIGluIGdyYXBoaWMuaCBoZXJlLCBidXQgbGlzdCB0aGUgcHVibGljCisgICAgICogQW5kcm9pZCBTREsgTWVkaWFGb3JtYXQgdmFsdWVzIGhlcmUuCisgICAgICovCiAgICAgZW51bSBDb2xvclN0YW5kYXJkIDogdWludDMyX3QgewotICAgICAgICBrQ29sb3JTdGFuZGFyZFVuc3BlY2lmaWVkID0gICAgICAgICAgR0VUX0hBTF9CSVRGSUVMRChTVEFOREFSRCwgVU5TUEVDSUZJRUQpLAotICAgICAgICBrQ29sb3JTdGFuZGFyZEJUNzA5ID0gICAgICAgICAgICAgICAgR0VUX0hBTF9CSVRGSUVMRChTVEFOREFSRCwgQlQ3MDkpLAotICAgICAgICBrQ29sb3JTdGFuZGFyZEJUNjAxXzYyNSA9ICAgICAgICAgICAgR0VUX0hBTF9CSVRGSUVMRChTVEFOREFSRCwgQlQ2MDFfNjI1KSwKLSAgICAgICAga0NvbG9yU3RhbmRhcmRCVDYwMV82MjVfVW5hZGp1c3RlZCA9IEdFVF9IQUxfQklURklFTEQoU1RBTkRBUkQsIEJUNjAxXzYyNV9VTkFESlVTVEVEKSwKLSAgICAgICAga0NvbG9yU3RhbmRhcmRCVDYwMV81MjUgPSAgICAgICAgICAgIEdFVF9IQUxfQklURklFTEQoU1RBTkRBUkQsIEJUNjAxXzUyNSksCi0gICAgICAgIGtDb2xvclN0YW5kYXJkQlQ2MDFfNTI1X1VuYWRqdXN0ZWQgPSBHRVRfSEFMX0JJVEZJRUxEKFNUQU5EQVJELCBCVDYwMV81MjVfVU5BREpVU1RFRCksCi0gICAgICAgIGtDb2xvclN0YW5kYXJkQlQyMDIwID0gICAgICAgICAgICAgICBHRVRfSEFMX0JJVEZJRUxEKFNUQU5EQVJELCBCVDIwMjApLAotICAgICAgICBrQ29sb3JTdGFuZGFyZEJUMjAyMENvbnN0YW50ID0gICAgICAgR0VUX0hBTF9CSVRGSUVMRChTVEFOREFSRCwgQlQyMDIwX0NPTlNUQU5UX0xVTUlOQU5DRSksCi0gICAgICAgIGtDb2xvclN0YW5kYXJkQlQ0NzBNID0gICAgICAgICAgICAgICBHRVRfSEFMX0JJVEZJRUxEKFNUQU5EQVJELCBCVDQ3ME0pLAotICAgICAgICBrQ29sb3JTdGFuZGFyZEZpbG0gPSAgICAgICAgICAgICAgICAgR0VUX0hBTF9CSVRGSUVMRChTVEFOREFSRCwgRklMTSksCi0gICAgICAgIGtDb2xvclN0YW5kYXJkTWF4ID0gICAgICAgICAgICAgICAgICBHRVRfSEFMX0JJVEZJRUxEKFNUQU5EQVJELCBNQVNLKSwKKyAgICAgICAga0NvbG9yU3RhbmRhcmRVbnNwZWNpZmllZCA9ICAgICAgICAgIDAsCisgICAgICAgIGtDb2xvclN0YW5kYXJkQlQ3MDkgPSAgICAgICAgICAgICAgICAxLAorICAgICAgICBrQ29sb3JTdGFuZGFyZEJUNjAxXzYyNSA9ICAgICAgICAgICAgMiwKKyAgICAgICAga0NvbG9yU3RhbmRhcmRCVDYwMV82MjVfVW5hZGp1c3RlZCA9IDMsIC8vIG5vdCBpbiBTREsKKyAgICAgICAga0NvbG9yU3RhbmRhcmRCVDYwMV81MjUgPSAgICAgICAgICAgIDQsCisgICAgICAgIGtDb2xvclN0YW5kYXJkQlQ2MDFfNTI1X1VuYWRqdXN0ZWQgPSA1LCAvLyBub3QgaW4gU0RLCisgICAgICAgIGtDb2xvclN0YW5kYXJkQlQyMDIwID0gICAgICAgICAgICAgICA2LAorICAgICAgICBrQ29sb3JTdGFuZGFyZEJUMjAyMENvbnN0YW50ID0gICAgICAgNywgLy8gbm90IGluIFNESworICAgICAgICBrQ29sb3JTdGFuZGFyZEJUNDcwTSA9ICAgICAgICAgICAgICAgOCwgLy8gbm90IGluIFNESworICAgICAgICBrQ29sb3JTdGFuZGFyZEZpbG0gPSAgICAgICAgICAgICAgICAgOSwgLy8gbm90IGluIFNESworICAgICAgICBrQ29sb3JTdGFuZGFyZERDSV9QMyA9ICAgICAgICAgICAgICAgMTAsIC8vIG5vdCBpbiBTREssIG5ldyBpbiBBbmRyb2lkIDguMAogCiAgICAgICAgIC8qIFRoaXMgbWFya3MgYSBzZWN0aW9uIG9mIGNvbG9yLXN0YW5kYXJkIHZhbHVlcyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIGJ5IGdyYXBoaWNzIEhBTCwKICAgICAgICAgICAgYnV0IHRyYWNrIGRlZmluZWQgY29sb3IgcHJpbWFyaWVzLW1hdHJpeCBjb2VmZmljaWVudCBjb21iaW5hdGlvbnMgaW4gbWVkaWEuCiAgICAgICAgICAgIFRoZXNlIGFyZSBzdGFibGUgZm9yIGEgZ2l2ZW4gcmVsZWFzZS4gKi8KLSAgICAgICAga0NvbG9yU3RhbmRhcmRFeHRlbmRlZFN0YXJ0ID0ga0NvbG9yU3RhbmRhcmRNYXggKyAxLAorICAgICAgICBrQ29sb3JTdGFuZGFyZEV4dGVuZGVkU3RhcnQgPSA2NCwKIAogICAgICAgICAvKiBUaGlzIG1hcmtzIGEgc2VjdGlvbiBvZiBjb2xvci1zdGFuZGFyZCB2YWx1ZXMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCBieSBncmFwaGljcyBIQUwKICAgICAgICAgICAgbm9yIHVzaW5nIG1lZGlhIGRlZmluZWQgY29sb3IgcHJpbWFyaWVzIG9yIG1hdHJpeCBjb2VmZmljaWVudHMuIFRoZXNlIG1heSBkaWZmZXIgcGVyCkBAIC02NywxOSArNjksMTkgQEAKICAgICB9OwogCiAgICAgZW51bSBDb2xvclRyYW5zZmVyIDogdWludDMyX3QgIHsKLSAgICAgICAga0NvbG9yVHJhbnNmZXJVbnNwZWNpZmllZCA9IEdFVF9IQUxfQklURklFTEQoVFJBTlNGRVIsIFVOU1BFQ0lGSUVEKSwKLSAgICAgICAga0NvbG9yVHJhbnNmZXJMaW5lYXIgPSAgICAgIEdFVF9IQUxfQklURklFTEQoVFJBTlNGRVIsIExJTkVBUiksCi0gICAgICAgIGtDb2xvclRyYW5zZmVyU1JHQiA9ICAgICAgICBHRVRfSEFMX0JJVEZJRUxEKFRSQU5TRkVSLCBTUkdCKSwKLSAgICAgICAga0NvbG9yVHJhbnNmZXJTTVBURV8xNzBNID0gIEdFVF9IQUxfQklURklFTEQoVFJBTlNGRVIsIFNNUFRFXzE3ME0pLAotICAgICAgICBrQ29sb3JUcmFuc2ZlckdhbW1hMjIgPSAgICAgR0VUX0hBTF9CSVRGSUVMRChUUkFOU0ZFUiwgR0FNTUEyXzIpLAotICAgICAgICBrQ29sb3JUcmFuc2ZlckdhbW1hMjggPSAgICAgR0VUX0hBTF9CSVRGSUVMRChUUkFOU0ZFUiwgR0FNTUEyXzgpLAotICAgICAgICBrQ29sb3JUcmFuc2ZlclNUMjA4NCA9ICAgICAgR0VUX0hBTF9CSVRGSUVMRChUUkFOU0ZFUiwgU1QyMDg0KSwKLSAgICAgICAga0NvbG9yVHJhbnNmZXJITEcgPSAgICAgICAgIEdFVF9IQUxfQklURklFTEQoVFJBTlNGRVIsIEhMRyksCi0gICAgICAgIGtDb2xvclRyYW5zZmVyTWF4ID0gICAgICAgICBHRVRfSEFMX0JJVEZJRUxEKFRSQU5TRkVSLCBNQVNLKSwKKyAgICAgICAga0NvbG9yVHJhbnNmZXJVbnNwZWNpZmllZCA9IDAsCisgICAgICAgIGtDb2xvclRyYW5zZmVyTGluZWFyID0gICAgICAxLAorICAgICAgICBrQ29sb3JUcmFuc2ZlclNSR0IgPSAgICAgICAgMiwKKyAgICAgICAga0NvbG9yVHJhbnNmZXJTTVBURV8xNzBNID0gIDMsIC8vIG5vdCBpbiBTREsKKyAgICAgICAga0NvbG9yVHJhbnNmZXJHYW1tYTIyID0gICAgIDQsIC8vIG5vdCBpbiBTREsKKyAgICAgICAga0NvbG9yVHJhbnNmZXJHYW1tYTI4ID0gICAgIDUsIC8vIG5vdCBpbiBTREsKKyAgICAgICAga0NvbG9yVHJhbnNmZXJTVDIwODQgPSAgICAgIDYsCisgICAgICAgIGtDb2xvclRyYW5zZmVySExHID0gICAgICAgICA3LAorICAgICAgICBrQ29sb3JUcmFuc2ZlckdhbW1hMjYgPSAgICAgOCwgLy8gbm90IGluIFNESywgbmV3IGluIEFuZHJvaWQgOC4wCiAKICAgICAgICAgLyogVGhpcyBtYXJrcyBhIHNlY3Rpb24gb2YgY29sb3ItdHJhbnNmZXIgdmFsdWVzIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgZ3JhcGhpY3MgSEFMLAogICAgICAgICAgICBidXQgdHJhY2sgbWVkaWEtZGVmaW5lZCBjb2xvci10cmFuc2Zlci4gVGhlc2UgYXJlIHN0YWJsZSBmb3IgYSBnaXZlbiByZWxlYXNlLiAqLwotICAgICAgICBrQ29sb3JUcmFuc2ZlckV4dGVuZGVkU3RhcnQgPSBrQ29sb3JUcmFuc2Zlck1heCArIDEsCisgICAgICAgIGtDb2xvclRyYW5zZmVyRXh0ZW5kZWRTdGFydCA9IDMyLAogCiAgICAgICAgIC8qIFRoaXMgbWFya3MgYSBzZWN0aW9uIG9mIGNvbG9yLXRyYW5zZmVyIHZhbHVlcyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIGJ5IGdyYXBoaWNzIEhBTAogICAgICAgICAgICBub3IgZGVmaW5lZCBieSBtZWRpYS4gVGhlc2UgbWF5IGRpZmZlciBwZXIgZGV2aWNlLiAqLwpAQCAtODcsMjMgKzg5LDE5IEBACiAgICAgfTsKIAogICAgIGVudW0gQ29sb3JSYW5nZSA6IHVpbnQzMl90ICB7Ci0gICAgICAgIGtDb2xvclJhbmdlVW5zcGVjaWZpZWQgPSBHRVRfSEFMX0JJVEZJRUxEKFJBTkdFLCBVTlNQRUNJRklFRCksCi0gICAgICAgIGtDb2xvclJhbmdlRnVsbCA9ICAgICAgICBHRVRfSEFMX0JJVEZJRUxEKFJBTkdFLCBGVUxMKSwKLSAgICAgICAga0NvbG9yUmFuZ2VMaW1pdGVkID0gICAgIEdFVF9IQUxfQklURklFTEQoUkFOR0UsIExJTUlURUQpLAotICAgICAgICBrQ29sb3JSYW5nZU1heCA9ICAgICAgICAgR0VUX0hBTF9CSVRGSUVMRChSQU5HRSwgTUFTSyksCisgICAgICAgIGtDb2xvclJhbmdlVW5zcGVjaWZpZWQgPSAwLAorICAgICAgICBrQ29sb3JSYW5nZUZ1bGwgPSAgICAgICAgMSwKKyAgICAgICAga0NvbG9yUmFuZ2VMaW1pdGVkID0gICAgIDIsCiAKICAgICAgICAgLyogVGhpcyBtYXJrcyBhIHNlY3Rpb24gb2YgY29sb3ItdHJhbnNmZXIgdmFsdWVzIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgZ3JhcGhpY3MgSEFMLAogICAgICAgICAgICBidXQgdHJhY2sgbWVkaWEtZGVmaW5lZCBjb2xvci10cmFuc2Zlci4gVGhlc2UgYXJlIHN0YWJsZSBmb3IgYSBnaXZlbiByZWxlYXNlLiAqLwotICAgICAgICBrQ29sb3JSYW5nZUV4dGVuZGVkU3RhcnQgPSBrQ29sb3JSYW5nZU1heCArIDEsCisgICAgICAgIGtDb2xvclJhbmdlRXh0ZW5kZWRTdGFydCA9IDgsCiAKICAgICAgICAgLyogVGhpcyBtYXJrcyBhIHNlY3Rpb24gb2YgY29sb3ItdHJhbnNmZXIgdmFsdWVzIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgZ3JhcGhpY3MgSEFMCiAgICAgICAgICAgIG5vciBkZWZpbmVkIGJ5IG1lZGlhLiBUaGVzZSBtYXkgZGlmZmVyIHBlciBkZXZpY2UuICovCiAgICAgICAgIGtDb2xvclJhbmdlVmVuZG9yU3RhcnQgPSAweDEwMDAwLAogICAgIH07CiAKLSN1bmRlZiBHRVRfSEFMX0JJVEZJRUxECi0jdW5kZWYgR0VUX0hBTF9FTlVNCi0KICAgICAvKgogICAgICAqIFN0YXRpYyB1dGlsaXRpZXMgZm9yIGNvZGVjIHN1cHBvcnQKICAgICAgKi8KQEAgLTE5Nyw3ICsxOTUsOCBAQAogICAgICAgICBjYXNlIENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkQlQyMDIwQ29uc3RhbnQ6ICAgICAgIHJldHVybiAiQlQyMDIwQ29uc3RhbnQiOwogICAgICAgICBjYXNlIENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkQlQ0NzBNOiAgICAgICAgICAgICAgIHJldHVybiAiQlQ0NzBNIjsKICAgICAgICAgY2FzZSBDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZEZpbG06ICAgICAgICAgICAgICAgICByZXR1cm4gIkZpbG0iOwotICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICAgICAgY2FzZSBDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZERDSV9QMzogICAgICAgICAgICAgICByZXR1cm4gIkRDSV9QMyI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKICAgICB9CiB9CiAKQEAgLTIxMiw3ICsyMTEsOCBAQAogICAgICAgICBjYXNlIENvbG9yVXRpbHM6OmtDb2xvclRyYW5zZmVyR2FtbWEyODogICAgIHJldHVybiAiR2FtbWEyOCI7CiAgICAgICAgIGNhc2UgQ29sb3JVdGlsczo6a0NvbG9yVHJhbnNmZXJTVDIwODQ6ICAgICAgcmV0dXJuICJTVDIwODQiOwogICAgICAgICBjYXNlIENvbG9yVXRpbHM6OmtDb2xvclRyYW5zZmVySExHOiAgICAgICAgIHJldHVybiAiSExHIjsKLSAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgICAgIGNhc2UgQ29sb3JVdGlsczo6a0NvbG9yVHJhbnNmZXJHYW1tYTI2OiAgICAgcmV0dXJuICJHYW1tYTI2IjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmOwogICAgIH0KIH0KIApAQCAtMjIyLDcgKzIyMiw3IEBACiAgICAgICAgIGNhc2UgQ29sb3JVdGlsczo6a0NvbG9yUmFuZ2VVbnNwZWNpZmllZDogcmV0dXJuICJVbnNwZWNpZmllZCI7CiAgICAgICAgIGNhc2UgQ29sb3JVdGlsczo6a0NvbG9yUmFuZ2VGdWxsOiAgICAgICAgcmV0dXJuICJGdWxsIjsKICAgICAgICAgY2FzZSBDb2xvclV0aWxzOjprQ29sb3JSYW5nZUxpbWl0ZWQ6ICAgICByZXR1cm4gIkxpbWl0ZWQiOwotICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFCdWZmZXJCYXNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUJ1ZmZlckJhc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk0MThmYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUJ1ZmZlckJhc2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfQlVGRkVSX0JBU0VfSF8KLQotI2RlZmluZSBNRURJQV9CVUZGRVJfQkFTRV9IXwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIE1lZGlhQnVmZmVyQmFzZSB7Ci1wdWJsaWM6Ci0gICAgTWVkaWFCdWZmZXJCYXNlKCkge30KLQotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlKCkgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBhZGRfcmVmKCkgPSAwOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+TWVkaWFCdWZmZXJCYXNlKCkge30KLQotcHJpdmF0ZToKLSAgICBNZWRpYUJ1ZmZlckJhc2UoY29uc3QgTWVkaWFCdWZmZXJCYXNlICYpOwotICAgIE1lZGlhQnVmZmVyQmFzZSAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhQnVmZmVyQmFzZSAmKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gTUVESUFfQlVGRkVSX0JBU0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjViZTg5ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX0RFRlNfSF8KKworI2RlZmluZSBNRURJQV9ERUZTX0hfCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0lNQUdFX0pQRUc7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDOworCitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fVlA4OworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOTsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19BVkM7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQzsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNDsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1JBVzsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19ET0xCWV9WSVNJT047CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fU0NSQU1CTEVEOworCitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05COworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQjsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHOyAgICAgICAgICAgLy8gbGF5ZXIgSUlJCitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR19MQVlFUl9JOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX01QRUdfTEFZRVJfSUk7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fTUlESTsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUM7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fUUNFTFA7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX09QVVM7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9BTEFXOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfTUxBVzsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19SQVc7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRkxBQzsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUUzsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19NU0dTTTsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQzM7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDMzsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19TQ1JBTUJMRUQ7CisKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzQ7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX1dBVjsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfT0dHOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NQVRST1NLQTsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzJUUzsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfQVZJOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHMlBTOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9IRUlGOworCitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVEVYVF8zR1BQOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1RFWFRfU1VCUklQOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1RFWFRfVlRUOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1RFWFRfQ0VBXzYwODsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9URVhUX0NFQV83MDg7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfREFUQV9USU1FRF9JRDM7CisKKy8vIFRoZXNlIGFyZSB2YWx1ZXMgZXhwb3J0ZWQgdG8gSkFWQSBBUEkgdGhhdCBuZWVkIHRvIGJlIGluIHN5bmMgd2l0aAorLy8gZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb0Zvcm1hdC5qYXZhLiBVbmZvcnR1bmF0ZWx5LAorLy8gdGhleSBhcmUgbm90IGRlZmluZWQgaW4gZnJhbWV3b3Jrcy9hdiwgc28gZGVmaW5pbmcgdGhlbSBoZXJlLgorZW51bSBBdWRpb0VuY29kaW5nIHsKKyAgICBrQXVkaW9FbmNvZGluZ1BjbTE2Yml0ID0gMiwKKyAgICBrQXVkaW9FbmNvZGluZ1BjbThiaXQgPSAzLAorICAgIGtBdWRpb0VuY29kaW5nUGNtRmxvYXQgPSA0LAorfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNRURJQV9ERUZTX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUtleXMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhS2V5cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiOTI0YmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUtleXMuaApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9LRVlTX0hfCisKKyNkZWZpbmUgTUVESUFfS0VZU19IXworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIFdoZW4gc2lnbmFsbGluZyBhIGRpc2NvbnRpbnVpdHkgdG8gSVN0cmVhbUxpc3RlbmVyIHlvdSBjYW4gb3B0aW9uYWxseQorLy8gc3BlY2lmeSB0aGUgdHlwZShzKSBvZiBkaXNjb250aW51aXR5LCBpLmUuIGlmIHRoZSBhdWRpbyBmb3JtYXQgaGFzIGNoYW5nZWQsCisvLyB0aGUgdmlkZW8gZm9ybWF0IGhhcyBjaGFuZ2VkLCB0aW1lIGhhcyBqdW1wZWQgb3IgYW55IGNvbWJpbmF0aW9uIHRoZXJlb2YuCisvLyBUbyBkbyBzbywgaW5jbHVkZSBhIG5vbi16ZXJvIGludDMyX3QgdmFsdWUgdW5kZXIgdGhlIGtleQorLy8gImtJU3RyZWFtTGlzdGVuZXJLZXlEaXNjb250aW51aXR5TWFzayIgd2hlbiBpc3N1aW5nIHRoZQorLy8gSVN0cmVhbUxpc3RlbmVyOjpESVNDT05USU5VSVRZIGNvbW1hbmQuCisvLyBJZiB0aGVyZSBpcyBhIGNoYW5nZSBpbiBhdWRpby92aWRlbyBmb3JtYXQsIFRoZSBuZXcgbG9naWNhbCBzdHJlYW0KKy8vIG11c3Qgc3RhcnQgd2l0aCBwcm9wZXIgY29kZWMgaW5pdGlhbGl6YXRpb24KKy8vIGluZm9ybWF0aW9uIGZvciBwbGF5YmFjayB0byBjb250aW51ZSwgaS5lLiBTUFMgYW5kIFBQUyBpbiB0aGUgY2FzZQorLy8gb2YgQVZDIHZpZGVvIGV0Yy4KKy8vIElmIHRoaXMga2V5IGlzIG5vdCBwcmVzZW50LCBvbmx5IGEgdGltZSBkaXNjb250aW51aXR5IGlzIGFzc3VtZWQuCisvLyBUaGUgdmFsdWUgc2hvdWxkIGJlIGEgYml0bWFzayBvZiB2YWx1ZXMgZnJvbQorLy8gQVRTUGFyc2VyOjpEaXNjb250aW51aXR5VHlwZS4KK2V4dGVybiBjb25zdCBjaGFyICpjb25zdCBrSVN0cmVhbUxpc3RlbmVyS2V5RGlzY29udGludWl0eU1hc2s7CisKKy8vIFdoZW4gc2lnbmFsbGluZyBhIGRpc2NvbnRpbnVpdHkgdG8gQVRTUGFyc2VyIHlvdSBjYW4gb3B0aW9uYWxseQorLy8gc3BlY2lmeSBhbiBpbnQ2NF90IFBUUyB0aW1lc3RhbXAgaW4gImV4dHJhIi4KKy8vIElmIHByZXNlbnQsIHJlbmRlcmluZyBvZiBkYXRhIGZvbGxvd2luZyB0aGUgZGlzY29udGludWl0eQorLy8gd2lsbCBiZSBzdXBwcmVzc2VkIHVudGlsIG1lZGlhIHRpbWUgcmVhY2hlcyB0aGlzIHRpbWVzdGFtcC4KK2V4dGVybiBjb25zdCBjaGFyICpjb25zdCBrQVRTUGFyc2VyS2V5UmVzdW1lQXRQVFM7CisKKy8vIFdoZW4gc2lnbmFsbGluZyBhIGRpc2NvbnRpbnVpdHkgdG8gQVRTUGFyc2VyIHlvdSBjYW4gb3B0aW9uYWxseQorLy8gc3BlY2lmeSBhbiBpbnQ2NF90IFBUUyB0aW1lc3RhbXAgaW4gImV4dHJhIi4KKy8vIEl0IGluZGljYXRlcyB0aGUgbWVkaWEgdGltZSAoaW4gdXMpIHRvIGJlIGFzc29jaWF0ZWQKKy8vIHdpdGggdGhlIG5leHQgUFRTIG9jY3VyaW5nIGluIHRoZSBzdHJlYW0uIFRoZSB2YWx1ZSBpcyBvZiB0eXBlIGludDY0X3QuCitleHRlcm4gY29uc3QgY2hhciAqY29uc3Qga0FUU1BhcnNlcktleU1lZGlhVGltZVVzOworCisvLyBXaGVuIHNpZ25hbGxpbmcgYSBkaXNjb250aW51aXR5IHRvIEFUU1BhcnNlciB5b3UgY2FuIG9wdGlvbmFsbHkKKy8vIHNwZWNpZnkgYW4gaW50NjRfdCBQVFMgdGltZXN0YW1wIGluICJleHRyYSIuCisvLyBJdCBpbmRpY2F0ZXMgdGhlIG1lZGlhIHRpbWUgKGluIHVzKSBvZiBhIHJlY2VudAorLy8gc2FtcGxlIGZyb20gdGhlIHNhbWUgY29udGVudCwgYW5kIGlzIHVzZWQgYXMgYSBoaW50IGZvciB0aGUgcGFyc2VyIHRvCisvLyBoYW5kbGUgUFRTIHdyYXBhcm91bmQuIFRoaXMgaXMgcmVxdWlyZWQgd2hlbiBhIG5ldyBwYXJzZXIgaXMgY3JlYXRlZAorLy8gdG8gY29udGludWUgcGFyc2luZyBjb250ZW50IGZyb20gdGhlIHNhbWUgdGltZWxpbmUuCitleHRlcm4gY29uc3QgY2hhciAqY29uc3Qga0FUU1BhcnNlcktleVJlY2VudE1lZGlhVGltZVVzOworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1FRElBX0tFWVNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL1R5cGVUcmFpdHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL1R5cGVUcmFpdHMuaAppbmRleCAxMjUwZTliLi4yMDQxYjIyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9UeXBlVHJhaXRzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vVHlwZVRyYWl0cy5oCkBAIC0xOSw2ICsxOSw5IEBACiAKICNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KIAorI3VuZGVmIEhJREUKKyNkZWZpbmUgSElERSBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJoaWRkZW4iKSkpCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLyoqCkBAIC0zMSw3ICszNCw3IEBACiAgKiBUeXBlIHN1cHBvcnQgdXRpbGl0eSBjbGFzcyB0byBjaGVjayBpZiBhIHR5cGUgaXMgYW4gaW50ZWdyYWwgdHlwZSBvciBhbiBlbnVtLgogICovCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotc3RydWN0IGlzX2ludGVncmFsX29yX2VudW0KK3N0cnVjdCBISURFIGlzX2ludGVncmFsX29yX2VudW0KICAgICA6IHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgc3RkOjppc19pbnRlZ3JhbDxUPjo6dmFsdWUgfHwgc3RkOjppc19lbnVtPFQ+Ojp2YWx1ZT4geyB9OwogCiAvKioKQEAgLTQ2LDcgKzQ5LDcgQEAKICAgICAgICAgdHlwZW5hbWUgVT10eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxpc19pbnRlZ3JhbF9vcl9lbnVtPFQ+Ojp2YWx1ZT46OnR5cGUsCiAgICAgICAgIGJvb2w9c3RkOjppc19lbnVtPFQ+Ojp2YWx1ZSwKICAgICAgICAgYm9vbD1zdGQ6OmlzX2ludGVncmFsPFQ+Ojp2YWx1ZT4KLXN0cnVjdCB1bmRlcmx5aW5nX2ludGVncmFsX3R5cGUgeworc3RydWN0IEhJREUgdW5kZXJseWluZ19pbnRlZ3JhbF90eXBlIHsKICAgICBzdGF0aWNfYXNzZXJ0KCFzdGQ6OmlzX2VudW08VD46OnZhbHVlLCAiVCBzaG91bGQgbm90IGJlIGVudW0gaGVyZSIpOwogICAgIHN0YXRpY19hc3NlcnQoIXN0ZDo6aXNfaW50ZWdyYWw8VD46OnZhbHVlLCAiVCBzaG91bGQgbm90IGJlIGludGVncmFsIGhlcmUiKTsKICAgICB0eXBlZGVmIFUgdHlwZTsKQEAgLTU0LDcgKzU3LDcgQEAKIAogLyoqIFNwZWNpYWxpemF0aW9uIGZvciBlbnVtcy4gKi8KIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+Ci1zdHJ1Y3QgdW5kZXJseWluZ19pbnRlZ3JhbF90eXBlPFQsIFUsIHRydWUsIGZhbHNlPiB7CitzdHJ1Y3QgSElERSB1bmRlcmx5aW5nX2ludGVncmFsX3R5cGU8VCwgVSwgdHJ1ZSwgZmFsc2U+IHsKICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfZW51bTxUPjo6dmFsdWUsICJUIHNob3VsZCBiZSBlbnVtIGhlcmUiKTsKICAgICBzdGF0aWNfYXNzZXJ0KCFzdGQ6OmlzX2ludGVncmFsPFQ+Ojp2YWx1ZSwgIlQgc2hvdWxkIG5vdCBiZSBpbnRlZ3JhbCBoZXJlIik7CiAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxUPjo6dHlwZSB0eXBlOwpAQCAtNjIsNyArNjUsNyBAQAogCiAvKiogU3BlY2lhbGl6YXRpb24gZm9yIG5vbi1lbnVtIHN0ZC1pbnRlZ3JhbCB0eXBlcy4gKi8KIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+Ci1zdHJ1Y3QgdW5kZXJseWluZ19pbnRlZ3JhbF90eXBlPFQsIFUsIGZhbHNlLCB0cnVlPiB7CitzdHJ1Y3QgSElERSB1bmRlcmx5aW5nX2ludGVncmFsX3R5cGU8VCwgVSwgZmFsc2UsIHRydWU+IHsKICAgICBzdGF0aWNfYXNzZXJ0KCFzdGQ6OmlzX2VudW08VD46OnZhbHVlLCAiVCBzaG91bGQgbm90IGJlIGVudW0gaGVyZSIpOwogICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19pbnRlZ3JhbDxUPjo6dmFsdWUsICJUIHNob3VsZCBiZSBpbnRlZ3JhbCBoZXJlIik7CiAgICAgdHlwZWRlZiBUIHR5cGU7CkBAIC03Miw3ICs3NSw3IEBACiAgKiBUeXBlIHN1cHBvcnQgdXRpbGl0eSBjbGFzcyB0byBjaGVjayBpZiB0aGUgdW5kZXJseWluZyBpbnRlZ3JhbCB0eXBlIGlzIHNpZ25lZC4KICAqLwogdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXN0cnVjdCBpc19zaWduZWRfaW50ZWdyYWwKK3N0cnVjdCBISURFIGlzX3NpZ25lZF9pbnRlZ3JhbAogICAgIDogc3RkOjppbnRlZ3JhbF9jb25zdGFudDxib29sLCBzdGQ6OmlzX3NpZ25lZDwKICAgICAgICAgICAgIHR5cGVuYW1lIHVuZGVybHlpbmdfaW50ZWdyYWxfdHlwZTxULCB1bnNpZ25lZD46OnR5cGU+Ojp2YWx1ZT4geyB9OwogCkBAIC04MCw3ICs4Myw3IEBACiAgKiBUeXBlIHN1cHBvcnQgdXRpbGl0eSBjbGFzcyB0byBjaGVjayBpZiB0aGUgdW5kZXJseWluZyBpbnRlZ3JhbCB0eXBlIGlzIHVuc2lnbmVkLgogICovCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotc3RydWN0IGlzX3Vuc2lnbmVkX2ludGVncmFsCitzdHJ1Y3QgSElERSBpc191bnNpZ25lZF9pbnRlZ3JhbAogICAgIDogc3RkOjppbnRlZ3JhbF9jb25zdGFudDxib29sLCBzdGQ6OmlzX3Vuc2lnbmVkPAogICAgICAgICAgICAgdHlwZW5hbWUgdW5kZXJseWluZ19pbnRlZ3JhbF90eXBlPFQsIHNpZ25lZD46OnR5cGU+Ojp2YWx1ZT4gewogfTsKQEAgLTkyLDI2ICs5NSwyNiBAQAogICogbWVtYmVyIGNvbnN0YW50IHx2YWx1ZXwgZXF1YWwgdG8gdHJ1ZS4gT3RoZXJ3aXNlIHZhbHVlIGlzIGZhbHNlLgogICovCiB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSAuLi5Vcz4KLXN0cnVjdCBpc19vbmVfb2Y7CitzdHJ1Y3QgSElERSBpc19vbmVfb2Y7CiAKIC8vLyBcaWYgMAogLyoqCiAgKiBUZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiB3aGVuIGZpcnN0IHR5cGUgbWF0Y2hlcyB0aGUgc2VhcmNoZWQgdHlwZS4KICAqLwogdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgLi4uVXM+Ci1zdHJ1Y3QgaXNfb25lX29mPFQsIFQsIFVzLi4uPiA6IHN0ZDo6dHJ1ZV90eXBlIHt9Oworc3RydWN0IEhJREUgaXNfb25lX29mPFQsIFQsIFVzLi4uPiA6IHN0ZDo6dHJ1ZV90eXBlIHt9OwogCiAvKioKICAqIFRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIHdoZW4gZmlyc3QgdHlwZSBkb2VzIG5vdCBtYXRjaCB0aGUgc2VhcmNoZWQgdHlwZS4KICAqLwogdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVSwgdHlwZW5hbWUgLi4uVXM+Ci1zdHJ1Y3QgaXNfb25lX29mPFQsIFUsIFVzLi4uPiA6IGlzX29uZV9vZjxULCBVcy4uLj4ge307CitzdHJ1Y3QgSElERSBpc19vbmVfb2Y8VCwgVSwgVXMuLi4+IDogaXNfb25lX29mPFQsIFVzLi4uPiB7fTsKIAogLyoqCiAgKiBUZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiB3aGVuIHRoZXJlIGFyZSBubyB0eXBlcyB0byBzZWFyY2guCiAgKi8KIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgaXNfb25lX29mPFQ+IDogc3RkOjpmYWxzZV90eXBlIHt9Oworc3RydWN0IEhJREUgaXNfb25lX29mPFQ+IDogc3RkOjpmYWxzZV90eXBlIHt9OwogLy8vIFxlbmRpZgogCiAvKioKQEAgLTEyMSw0NCArMTI0LDQ0IEBACiAgKiBPdGhlcndpc2UgdmFsdWUgaXMgZmFsc2UuCiAgKi8KIHRlbXBsYXRlPHR5cGVuYW1lIC4uLlVzPgotc3RydWN0IGFyZV91bmlxdWU7CitzdHJ1Y3QgSElERSBhcmVfdW5pcXVlOwogCiAvLy8gXGlmIDAKIC8qKgogICogVGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gd2hlbiB0aGVyZSBhcmUgbm8gdHlwZXMuCiAgKi8KIHRlbXBsYXRlPD4KLXN0cnVjdCBhcmVfdW5pcXVlPD4gOiBzdGQ6OnRydWVfdHlwZSB7fTsKK3N0cnVjdCBISURFIGFyZV91bmlxdWU8PiA6IHN0ZDo6dHJ1ZV90eXBlIHt9OwogCiAvKioKICAqIFRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIHdoZW4gdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHR5cGUgdG8gY2hlY2suCiAgKi8KIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIC4uLlVzPgotc3RydWN0IGFyZV91bmlxdWU8VCwgVXMuLi4+CitzdHJ1Y3QgSElERSBhcmVfdW5pcXVlPFQsIFVzLi4uPgogICAgIDogc3RkOjppbnRlZ3JhbF9jb25zdGFudDxib29sLCBhcmVfdW5pcXVlPFVzLi4uPjo6dmFsdWUgJiYgIWlzX29uZV9vZjxULCBVcy4uLj46OnZhbHVlPiB7fTsKIC8vLyBcZW5kaWYKIAogLy8vIFxpZiAwCiB0ZW1wbGF0ZTxzaXplX3QgQmFzZSwgdHlwZW5hbWUgVCwgdHlwZW5hbWUgLi4uVXM+Ci1zdHJ1Y3QgX2ZpbmRfZmlyc3RfaW1wbDsKK3N0cnVjdCBISURFIF9maW5kX2ZpcnN0X2ltcGw7CiAKIC8qKgogICogVGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gd2hlbiB0aGVyZSBhcmUgbm8gdHlwZXMgdG8gc2VhcmNoLgogICovCiB0ZW1wbGF0ZTxzaXplX3QgQmFzZSwgdHlwZW5hbWUgVD4KLXN0cnVjdCBfZmluZF9maXJzdF9pbXBsPEJhc2UsIFQ+IDogc3RkOjppbnRlZ3JhbF9jb25zdGFudDxzaXplX3QsIDA+IHt9Oworc3RydWN0IEhJREUgX2ZpbmRfZmlyc3RfaW1wbDxCYXNlLCBUPiA6IHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8c2l6ZV90LCAwPiB7fTsKIAogLyoqCiAgKiBUZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiB3aGVuIFQgaXMgdGhlIGZpcnN0IHR5cGUgaW4gVXMuCiAgKi8KIHRlbXBsYXRlPHNpemVfdCBCYXNlLCB0eXBlbmFtZSBULCB0eXBlbmFtZSAuLi5Vcz4KLXN0cnVjdCBfZmluZF9maXJzdF9pbXBsPEJhc2UsIFQsIFQsIFVzLi4uPiA6IHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8c2l6ZV90LCBCYXNlPiB7fTsKK3N0cnVjdCBISURFIF9maW5kX2ZpcnN0X2ltcGw8QmFzZSwgVCwgVCwgVXMuLi4+IDogc3RkOjppbnRlZ3JhbF9jb25zdGFudDxzaXplX3QsIEJhc2U+IHt9OwogCiAvKioKICAqIFRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIHdoZW4gVCBpcyBub3QgdGhlIGZpcnN0IHR5cGUgaW4gVXMuCiAgKi8KIHRlbXBsYXRlPHNpemVfdCBCYXNlLCB0eXBlbmFtZSBULCB0eXBlbmFtZSBVLCB0eXBlbmFtZSAuLi5Vcz4KLXN0cnVjdCBfZmluZF9maXJzdF9pbXBsPEJhc2UsIFQsIFUsIFVzLi4uPgorc3RydWN0IEhJREUgX2ZpbmRfZmlyc3RfaW1wbDxCYXNlLCBULCBVLCBVcy4uLj4KICAgICA6IHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8c2l6ZV90LCBfZmluZF9maXJzdF9pbXBsPEJhc2UgKyAxLCBULCBVcy4uLj46OnZhbHVlPiB7fTsKIAogLy8vIFxlbmRpZgpAQCAtMTY5LDcgKzE3Miw3IEBACiAgKiBJZiBUIG9jY3VycyBpbiBVcywgaW5kZXggaXMgdGhlIDEtYmFzZWQgbGVmdC1tb3N0IGluZGV4IG9mIFQgaW4gVXMuIE90aGVyd2lzZSwgaW5kZXggaXMgMC4KICAqLwogdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgLi4uVXM+Ci1zdHJ1Y3QgZmluZF9maXJzdCB7CitzdHJ1Y3QgSElERSBmaW5kX2ZpcnN0IHsKICAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBpbmRleCA9IF9maW5kX2ZpcnN0X2ltcGw8MSwgVCwgVXMuLi4+Ojp2YWx1ZTsKIH07CiAKQEAgLTE4MCwxMyArMTgzLDEzIEBACiAgKiBBZGRzIGEgYmFzZSBpbmRleC4KICAqLwogdGVtcGxhdGU8c2l6ZV90IEJhc2UsIHR5cGVuYW1lIFQsIHR5cGVuYW1lIC4uLlVzPgotc3RydWN0IF9maW5kX2ZpcnN0X2NvbnZlcnRpYmxlX3RvX2hlbHBlcjsKK3N0cnVjdCBISURFIF9maW5kX2ZpcnN0X2NvbnZlcnRpYmxlX3RvX2hlbHBlcjsKIAogLyoqCiAgKiBUZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBmb3Igd2hlbiB0aGVyZSBhcmUgbW9yZSB0eXBlcyB0byBjb25zaWRlcgogICovCiB0ZW1wbGF0ZTxzaXplX3QgQmFzZSwgdHlwZW5hbWUgVCwgdHlwZW5hbWUgVSwgdHlwZW5hbWUgLi4uVXM+Ci1zdHJ1Y3QgX2ZpbmRfZmlyc3RfY29udmVydGlibGVfdG9faGVscGVyPEJhc2UsIFQsIFUsIFVzLi4uPiB7CitzdHJ1Y3QgSElERSBfZmluZF9maXJzdF9jb252ZXJ0aWJsZV90b19oZWxwZXI8QmFzZSwgVCwgVSwgVXMuLi4+IHsKICAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBpbmRleCA9CiAgICAgICAgIHN0ZDo6aXNfY29udmVydGlibGU8VCwgVT46OnZhbHVlID8gQmFzZSA6CiAgICAgICAgICAgICAgICAgX2ZpbmRfZmlyc3RfY29udmVydGlibGVfdG9faGVscGVyPEJhc2UgKyAxLCBULCBVcy4uLj46OmluZGV4OwpAQCAtMTk5LDcgKzIwMiw3IEBACiAgKiBUZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBmb3Igd2hlbiB0aGVyZSBhcmUgbm8gbW9yZSB0eXBlcyB0byBjb25zaWRlcgogICovCiB0ZW1wbGF0ZTxzaXplX3QgQmFzZSwgdHlwZW5hbWUgVD4KLXN0cnVjdCBfZmluZF9maXJzdF9jb252ZXJ0aWJsZV90b19oZWxwZXI8QmFzZSwgVD4geworc3RydWN0IEhJREUgX2ZpbmRfZmlyc3RfY29udmVydGlibGVfdG9faGVscGVyPEJhc2UsIFQ+IHsKICAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBpbmRleCA9IDA7CiAgICAgdHlwZWRlZiB2b2lkIHR5cGU7CiB9OwpAQCAtMjE2LDcgKzIxOSw3IEBACiAgKiBccGFyYW0gVXMgdHlwZXMgaW50byB3aGljaCB0aGUgY29udmVyc2lvbiBpcyBjb25zaWRlcmVkCiAgKi8KIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIC4uLlVzPgotc3RydWN0IGZpbmRfZmlyc3RfY29udmVydGlibGVfdG8gOiBwdWJsaWMgX2ZpbmRfZmlyc3RfY29udmVydGlibGVfdG9faGVscGVyPDEsIFQsIFVzLi4uPiB7IH07CitzdHJ1Y3QgSElERSBmaW5kX2ZpcnN0X2NvbnZlcnRpYmxlX3RvIDogcHVibGljIF9maW5kX2ZpcnN0X2NvbnZlcnRpYmxlX3RvX2hlbHBlcjwxLCBULCBVcy4uLj4geyB9OwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9hdmNfdXRpbHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyODc1NTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9hdmNfdXRpbHMuaApAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQVZDX1VUSUxTX0hfCisKKyNkZWZpbmUgQVZDX1VUSUxTX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBBQml0UmVhZGVyOworCitlbnVtIHsKKyAgICBrQVZDUHJvZmlsZUJhc2VsaW5lICAgICAgPSAweDQyLAorICAgIGtBVkNQcm9maWxlTWFpbiAgICAgICAgICA9IDB4NGQsCisgICAga0FWQ1Byb2ZpbGVFeHRlbmRlZCAgICAgID0gMHg1OCwKKyAgICBrQVZDUHJvZmlsZUhpZ2ggICAgICAgICAgPSAweDY0LAorICAgIGtBVkNQcm9maWxlSGlnaDEwICAgICAgICA9IDB4NmUsCisgICAga0FWQ1Byb2ZpbGVIaWdoNDIyICAgICAgID0gMHg3YSwKKyAgICBrQVZDUHJvZmlsZUhpZ2g0NDQgICAgICAgPSAweGY0LAorICAgIGtBVkNQcm9maWxlQ0FWTEM0NDRJbnRyYSA9IDB4MmMKK307CisKK3N0cnVjdCBOQUxQb3NpdGlvbiB7CisgICAgdWludDMyX3QgbmFsT2Zmc2V0OworICAgIHVpbnQzMl90IG5hbFNpemU7Cit9OworCisvLyBPcHRpb25hbGx5IHJldHVybnMgc2FtcGxlIGFzcGVjdCByYXRpbyBhcyB3ZWxsLgordm9pZCBGaW5kQVZDRGltZW5zaW9ucygKKyAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJnNlcVBhcmFtU2V0LAorICAgICAgICBpbnQzMl90ICp3aWR0aCwgaW50MzJfdCAqaGVpZ2h0LAorICAgICAgICBpbnQzMl90ICpzYXJXaWR0aCA9IE5VTEwsIGludDMyX3QgKnNhckhlaWdodCA9IE5VTEwpOworCisvLyBHZXRzIGFuZCByZXR1cm5zIGFuIHVuc2lnbmVkIGV4cC1nb2xvbWIgKHVlKSB2YWx1ZSBmcm9tIGEgYml0IHJlYWRlciB8YnJ8LiBBYm9ydHMgaWYgdGhlIHZhbHVlCisvLyBpcyBtb3JlIHRoYW4gNjQgYml0cyBsb25nICg+PTB4RkZGRiAoISkpIG9yIHRoZSBiaXQgcmVhZGVyIG92ZXJmbG93cy4KK3Vuc2lnbmVkIHBhcnNlVUUoQUJpdFJlYWRlciAqYnIpOworCisvLyBHZXRzIGFuZCByZXR1cm5zIGEgc2lnbmVkIGV4cC1nb2xvbWIgKHNlKSB2YWx1ZSBmcm9tIGEgYml0IHJlYWRlciB8YnJ8LiBBYm9ydHMgaWYgdGhlIHZhbHVlIGlzCisvLyBtb3JlIHRoYW4gNjQgYml0cyBsb25nICg+MHg3RkZGIHx8IDwtMHg3RkZGICghKSkgb3IgdGhlIGJpdCByZWFkZXIgb3ZlcmZsb3dzLgorc2lnbmVkIHBhcnNlU0UoQUJpdFJlYWRlciAqYnIpOworCisvLyBHZXRzIGFuIHVuc2lnbmVkIGV4cC1nb2xvbWIgKHVlKSB2YWx1ZSBmcm9tIGEgYml0IHJlYWRlciB8YnJ8LCBhbmQgcmV0dXJucyBpdCBpZiBpdCB3YXMKKy8vIHN1Y2Nlc3NmdWwuIFJldHVybnMgfGZhbGxiYWNrfCBpZiBpdCB3YXMgdW5zdWNjZXNzZnVsLiBOb3RlOiBpZiB0aGUgdmFsdWUgd2FzIGxvbmdlciB0aGF0IDY0CisvLyBiaXRzLCBpdCByZWFkcyBwYXN0IHRoZSB2YWx1ZSBhbmQgc3RpbGwgcmV0dXJucyB8ZmFsbGJhY2t8LgordW5zaWduZWQgcGFyc2VVRVdpdGhGYWxsYmFjayhBQml0UmVhZGVyICpiciwgdW5zaWduZWQgZmFsbGJhY2spOworCisvLyBHZXRzIGEgc2lnbmVkIGV4cC1nb2xvbWIgKHNlKSB2YWx1ZSBmcm9tIGEgYml0IHJlYWRlciB8YnJ8LCBhbmQgcmV0dXJucyBpdCBpZiBpdCB3YXMgc3VjY2Vzc2Z1bC4KKy8vIFJldHVybnMgfGZhbGxiYWNrfCBpZiBpdCB3YXMgdW5zdWNjZXNzZnVsLiBOb3RlOiBpZiB0aGUgdmFsdWUgd2FzIGxvbmdlciB0aGF0IDY0IGJpdHMsIGl0IHJlYWRzCisvLyBwYXN0IHRoZSB2YWx1ZSBhbmQgc3RpbGwgcmV0dXJucyB8ZmFsbGJhY2t8Lgorc2lnbmVkIHBhcnNlU0VXaXRoRmFsbGJhY2soQUJpdFJlYWRlciAqYnIsIHNpZ25lZCBmYWxsYmFjayk7CisKKy8vIFNraXBzIGFuIHVuc2lnbmVkIGV4cC1nb2xvbWIgKHVlKSB2YWx1ZSBmcm9tIGJpdCByZWFkZXIgfGJyfC4KK2lubGluZSB2b2lkIHNraXBVRShBQml0UmVhZGVyICpicikgeworICAgICh2b2lkKXBhcnNlVUVXaXRoRmFsbGJhY2soYnIsIDBVKTsKK30KKworLy8gU2tpcHMgYSBzaWduZWQgZXhwLWdvbG9tYiAoc2UpIHZhbHVlIGZyb20gYml0IHJlYWRlciB8YnJ8LgoraW5saW5lIHZvaWQgc2tpcFNFKEFCaXRSZWFkZXIgKmJyKSB7CisgICAgKHZvaWQpcGFyc2VTRVdpdGhGYWxsYmFjayhiciwgMCk7Cit9CisKK3N0YXR1c190IGdldE5leHROQUxVbml0KAorICAgICAgICBjb25zdCB1aW50OF90ICoqX2RhdGEsIHNpemVfdCAqX3NpemUsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKipuYWxTdGFydCwgc2l6ZV90ICpuYWxTaXplLAorICAgICAgICBib29sIHN0YXJ0Q29kZUZvbGxvd3MgPSBmYWxzZSk7CisKK3NwPEFCdWZmZXI+IE1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YSgKKyAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQsIGludDMyX3QgKndpZHRoLCBpbnQzMl90ICpoZWlnaHQsCisgICAgICAgIGludDMyX3QgKnNhcldpZHRoID0gbnVsbHB0ciwgaW50MzJfdCAqc2FySGVpZ2h0ID0gbnVsbHB0cik7CisKK2Jvb2wgSXNJRFIoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworYm9vbCBJc0FWQ1JlZmVyZW5jZUZyYW1lKGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KTsKK3VpbnQzMl90IEZpbmRBVkNMYXllcklkKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKworY29uc3QgY2hhciAqQVZDUHJvZmlsZVRvU3RyaW5nKHVpbnQ4X3QgcHJvZmlsZSk7CisKKy8vIEdpdmVuIGFuIE1QRUc0IHZpZGVvIFZPTC1oZWFkZXIgY2h1bmsgKHN0YXJ0aW5nIHdpdGggMHgwMCAweDAwIDB4MDEgMHgyPykKKy8vIHBhcnNlIGl0IGFuZCBmaWxsIGluIGRpbWVuc2lvbnMsIHJldHVybnMgdHJ1ZSBpZmYgc3VjY2Vzc2Z1bC4KK2Jvb2wgRXh0cmFjdERpbWVuc2lvbnNGcm9tVk9MSGVhZGVyKAorICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSwgaW50MzJfdCAqd2lkdGgsIGludDMyX3QgKmhlaWdodCk7CisKK2Jvb2wgR2V0TVBFR0F1ZGlvRnJhbWVTaXplKAorICAgICAgICB1aW50MzJfdCBoZWFkZXIsIHNpemVfdCAqZnJhbWVfc2l6ZSwKKyAgICAgICAgaW50ICpvdXRfc2FtcGxpbmdfcmF0ZSA9IE5VTEwsIGludCAqb3V0X2NoYW5uZWxzID0gTlVMTCwKKyAgICAgICAgaW50ICpvdXRfYml0cmF0ZSA9IE5VTEwsIGludCAqb3V0X251bV9zYW1wbGVzID0gTlVMTCk7CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQVZDX1VUSUxTX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FEYXRhX3Rlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BRGF0YV90ZXN0LmNwcAppbmRleCBmMDE0YzI1Li4yNjI4YTQ3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FEYXRhX3Rlc3QuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQURhdGFfdGVzdC5jcHAKQEAgLTk3OCw0ICs5NzgsNjMgQEAKICAgICB9CiB9OwogCitURVNUX0YoQURhdGFUZXN0LCBBRGF0YV9Bc3NpZ25tZW50VGVzdCkgeworICAgIHR5cGVkZWYgQURhdGE8c3A8QUJ1ZmZlcj4sIGludDMyX3Q+OjpCYXNpYyBEYXRhOworCisgICAgc3A8QUJ1ZmZlcj4gYnVmMSA9IG5ldyBBQnVmZmVyKCh2b2lkICopImhlbGxvIiwgNik7CisgICAgd3A8QUJ1ZmZlcj4gYnVmMXcgPSBidWYxOworCisgICAgRGF0YSBvYmoxOworICAgIG9iajEuc2V0KGJ1ZjEpOworICAgIEVYUEVDVF9ORShidWYxdy5wcm9tb3RlKCksIG51bGxwdHIpOworICAgIGJ1ZjEuY2xlYXIoKTsKKyAgICBFWFBFQ1RfTkUoYnVmMXcucHJvbW90ZSgpLCBudWxscHRyKTsKKyAgICBvYmoxLmNsZWFyKCk7CisgICAgRVhQRUNUX0VRKGJ1ZjF3LnByb21vdGUoKSwgbnVsbHB0cik7CisKKyAgICBidWYxID0gbmV3IEFCdWZmZXIoKHZvaWQgKikiYWdhaW4iLCA2KTsKKyAgICBidWYxdyA9IGJ1ZjE7CisKKyAgICBvYmoxLnNldChidWYxKTsKKyAgICBFWFBFQ1RfVFJVRShvYmoxLnVzZWQoKSk7CisgICAgRGF0YSBvYmoyID0gb2JqMTsKKworICAgIHNwPEFCdWZmZXI+IGJ1ZjI7CisgICAgRVhQRUNUX1RSVUUob2JqMi5maW5kKCZidWYyKSk7CisgICAgRVhQRUNUX0VRKGJ1ZjIsIGJ1ZjEpOworICAgIGJ1ZjEuY2xlYXIoKTsKKyAgICBidWYyLmNsZWFyKCk7CisgICAgRVhQRUNUX05FKGJ1ZjF3LnByb21vdGUoKSwgbnVsbHB0cik7CisgICAgb2JqMS5jbGVhcigpOworICAgIEVYUEVDVF9ORShidWYxdy5wcm9tb3RlKCksIG51bGxwdHIpOworICAgIG9iajIuY2xlYXIoKTsKKyAgICBFWFBFQ1RfRVEoYnVmMXcucHJvbW90ZSgpLCBudWxscHRyKTsKKworICAgIGJ1ZjEgPSBuZXcgQUJ1ZmZlcigodm9pZCAqKSJzdGlsbCIsIDYpOworICAgIGJ1ZjF3ID0gYnVmMTsKKworICAgIG9iajEuc2V0KGJ1ZjEpOworICAgIEVYUEVDVF9UUlVFKG9iajEudXNlZCgpKTsKKyAgICBvYmoyID0gc3RkOjptb3ZlKG9iajEpOworICAgIEVYUEVDVF9GQUxTRShvYmoxLnVzZWQoKSk7CisKKyAgICBFWFBFQ1RfVFJVRShvYmoyLmZpbmQoJmJ1ZjIpKTsKKyAgICBFWFBFQ1RfRVEoYnVmMiwgYnVmMSk7CisgICAgYnVmMS5jbGVhcigpOworICAgIGJ1ZjIuY2xlYXIoKTsKKyAgICBFWFBFQ1RfTkUoYnVmMXcucHJvbW90ZSgpLCBudWxscHRyKTsKKyAgICBvYmoyLmNsZWFyKCk7CisgICAgRVhQRUNUX0VRKGJ1ZjF3LnByb21vdGUoKSwgbnVsbHB0cik7CisKKyAgICB0eXBlZGVmIEFEYXRhPHNwPEFCdWZmZXI+LCBzdGQ6OnVuaXF1ZV9wdHI8aW50MzJfdD4+OjpCYXNpYyBEYXRhMjsKKyAgICBEYXRhMiBvYmozLCBvYmo0OworCisgICAgYnVmMSA9IG5ldyBBQnVmZmVyKCh2b2lkICopImhlbmNlIiwgNik7CisgICAgb2JqMy5zZXQoYnVmMSk7CisgICAgb2JqNCA9IHN0ZDo6bW92ZShvYmozKTsKKyAgICBFWFBFQ1RfRkFMU0Uob2JqMy51c2VkKCkpOworICAgIEVYUEVDVF9UUlVFKG9iajQuZmluZCgmYnVmMikpOworICAgIEVYUEVDVF9FUShidWYyLCBidWYxKTsKK30KKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9VdGlsc190ZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvVXRpbHNfdGVzdC5jcHAKaW5kZXggMDQzOWQ1Yy4uZmMyZTA0NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9VdGlsc190ZXN0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL1V0aWxzX3Rlc3QuY3BwCkBAIC0yMiw3ICsyMiw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmdVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4gLy8gZm9yIEZPVVJDQworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+IC8vIGZvciBGT1VSQ0MKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL0FuZHJvaWQuYnAKaW5kZXggNWQ5MGIwYS4uMmU0OWZjNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvQW5kcm9pZC5icApAQCAtMTIsNyArMTIsNiBAQAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmFuZHJvaWRfcnVudGltZSIsCiAgICAgICAgICJsaWJtZWRpYSIsCiAgICAgXSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvTWVkaWFIVFRQLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvTWVkaWFIVFRQLmNwcAppbmRleCA1YjE4ODE0Li43YzkyNDdlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL01lZGlhSFRUUC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9NZWRpYUhUVFAuY3BwCkBAIC0yNSwxMSArMjUsMTEgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogCi0jaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUhUVFBDb25uZWN0aW9uLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotTWVkaWFIVFRQOjpNZWRpYUhUVFAoY29uc3Qgc3A8SU1lZGlhSFRUUENvbm5lY3Rpb24+ICZjb25uKQorTWVkaWFIVFRQOjpNZWRpYUhUVFAoY29uc3Qgc3A8TWVkaWFIVFRQQ29ubmVjdGlvbj4gJmNvbm4pCiAgICAgOiBtSW5pdENoZWNrKChjb25uICE9IE5VTEwpID8gT0sgOiBOT19JTklUKSwKICAgICAgIG1IVFRQQ29ubmVjdGlvbihjb25uKSwKICAgICAgIG1DYWNoZWRTaXplVmFsaWQoZmFsc2UpLApAQCAtMTc2LDEyICsxNzYsNiBAQAogICAgIHJldHVybiBtRGVjcnlwdEhhbmRsZTsKIH0KIAotdm9pZCBNZWRpYUhUVFA6OmdldERybUluZm8oCi0gICAgICAgIHNwPERlY3J5cHRIYW5kbGU+ICZoYW5kbGUsIERybU1hbmFnZXJDbGllbnQgKipjbGllbnQpIHsKLSAgICBoYW5kbGUgPSBtRGVjcnlwdEhhbmRsZTsKLSAgICAqY2xpZW50ID0gbURybU1hbmFnZXJDbGllbnQ7Ci19Ci0KIFN0cmluZzggTWVkaWFIVFRQOjpnZXRVcmkoKSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIFN0cmluZzg6OmVtcHR5KCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvQW5kcm9pZC5icAppbmRleCBlNDE1MzM0Li44YTc3NDAxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQuYnAKQEAgLTEsNCArMSw0IEBACi1jY19saWJyYXJ5X3NoYXJlZCB7CitjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfaHR0cGxpdmUiLAogCiAgICAgc3JjczogWwpAQCAtMzYsOCArMzYsMjAgQEAKICAgICAgICAgImxpYmNyeXB0byIsCiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJoaWRsYWxsb2NhdG9ydXRpbHMiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYXNAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FzLm5hdGl2ZUAxLjAiLAogICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfaWQzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21ldGFkYXRhdXRpbHMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXBlZzJzdXBwb3J0IiwKKyAgICBdLAorCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9IVFRQRG93bmxvYWRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9IVFRQRG93bmxvYWRlci5jcHAKaW5kZXggNzkzNjk1YS4uNzI2MDRlMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvSFRUUERvd25sb2FkZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0hUVFBEb3dubG9hZGVyLmNwcApAQCAtMjEsMTIgKzIxLDEyIEBACiAjaW5jbHVkZSAiSFRUUERvd25sb2FkZXIuaCIKICNpbmNsdWRlICJNM1VQYXJzZXIuaCIKIAotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBDb25uZWN0aW9uLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhSFRUUC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9hZXMuaD4KICNpbmNsdWRlIDxvcGVuc3NsL21kNS5oPgpAQCAtMzYsNyArMzYsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBIVFRQRG93bmxvYWRlcjo6SFRUUERvd25sb2FkZXIoCi0gICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgIGNvbnN0IHNwPE1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gJmhlYWRlcnMpIDoKICAgICBtSFRUUERhdGFTb3VyY2UobmV3IE1lZGlhSFRUUChodHRwU2VydmljZS0+bWFrZUhUVFBDb25uZWN0aW9uKCkpKSwKICAgICBtRXh0cmFIZWFkZXJzKGhlYWRlcnMpLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvSFRUUERvd25sb2FkZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0hUVFBEb3dubG9hZGVyLmgKaW5kZXggMWRiNGE0OC4uMGQ0YmQzMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvSFRUUERvd25sb2FkZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9IVFRQRG93bmxvYWRlci5oCkBAIC0yOCwxMiArMjgsMTIgQEAKIHN0cnVjdCBBQnVmZmVyOwogY2xhc3MgRGF0YVNvdXJjZTsKIHN0cnVjdCBIVFRQQmFzZTsKLXN0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKK3N0cnVjdCBNZWRpYUhUVFBTZXJ2aWNlOwogc3RydWN0IE0zVVBhcnNlcjsKIAogc3RydWN0IEhUVFBEb3dubG9hZGVyIDogcHVibGljIFJlZkJhc2UgewogICAgIEhUVFBEb3dubG9hZGVyKAotICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICZoZWFkZXJzKTsKIAogICAgIHZvaWQgcmVjb25uZWN0KCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlRGF0YVNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZURhdGFTb3VyY2UuaAppbmRleCBiN2JlNjM3Li45MWU5ZjlmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlRGF0YVNvdXJjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVEYXRhU291cmNlLmgKQEAgLTE4LDggKzE4LDggQEAKIAogI2RlZmluZSBMSVZFX0RBVEFfU09VUkNFX0hfCiAKKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5jcHAKaW5kZXggMTQzZmQ1OS4uN2VmZjhlYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmNwcApAQCAtMjYsNyArMjYsNyBAQAogI2luY2x1ZGUgIm1wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oIgogCiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KQEAgLTQ5LDYgKzQ5LDEwIEBACiBjb25zdCBpbnQ2NF90IExpdmVTZXNzaW9uOjprVXBTd2l0Y2hNYXJnaW5VcyA9IDUwMDAwMDBsbDsKIGNvbnN0IGludDY0X3QgTGl2ZVNlc3Npb246OmtSZXN1bWVUaHJlc2hvbGRVcyA9IDEwMDAwMGxsOwogCisvL1RPRE86IHJlZGVmaW5lIHRoaXMgbWFyayB0byBhIGZhaXIgdmFsdWUKKy8vIGRlZmF1bHQgYnVmZmVyIHVuZGVyZmxvdyBtYXJrCitzdGF0aWMgY29uc3QgaW50IGtVbmRlcmZsb3dNYXJrTXMgPSAxMDAwOyAgLy8gMSBzZWNvbmQKKwogc3RydWN0IExpdmVTZXNzaW9uOjpCYW5kd2lkdGhFc3RpbWF0b3IgOiBwdWJsaWMgUmVmQmFzZSB7CiAgICAgQmFuZHdpZHRoRXN0aW1hdG9yKCk7CiAKQEAgLTI3MCw3ICsyNzQsNyBAQAogCiBMaXZlU2Vzc2lvbjo6TGl2ZVNlc3Npb24oCiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCB1aW50MzJfdCBmbGFncywKLSAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSkKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlKQogICAgIDogbU5vdGlmeShub3RpZnkpLAogICAgICAgbUZsYWdzKGZsYWdzKSwKICAgICAgIG1IVFRQU2VydmljZShodHRwU2VydmljZSksCkBAIC04NDAsNyArODQ0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gKElmIHdlIGRvbid0IGhhdmUgdGhhdCBjdXNoaW9uIHdlJ2QgcmF0aGVyIGNhbmNlbCBhbmQgdHJ5IGFnYWluLikKICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBkZWxheVVzID0KICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaFVwID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobUJ1ZmZlcmluZ1NldHRpbmdzLm1SZWJ1ZmZlcmluZ1dhdGVybWFya0xvd01zICogMTAwMGxsICsgMTAwMDAwMGxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrVW5kZXJmbG93TWFya01zICogMTAwMGxsICsgMTAwMDAwMGxsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMDsKICAgICAgICAgICAgICAgICAgICAgYm9vbCBuZWVkUmVzdW1lVW50aWwgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHN0b3BQYXJhbXMgPSBtc2c7CkBAIC0xMDEwLDcgKzEwMTQsOCBAQAogICAgICAgICBtRmV0Y2hlckxvb3BlciA9IG5ldyBBTG9vcGVyKCk7CiAKICAgICAgICAgbUZldGNoZXJMb29wZXItPnNldE5hbWUoIkZldGNoZXIiKTsKLSAgICAgICAgbUZldGNoZXJMb29wZXItPnN0YXJ0KGZhbHNlLCBmYWxzZSk7CisgICAgICAgIG1GZXRjaGVyTG9vcGVyLT5zdGFydChmYWxzZSwgLyogcnVuT25DYWxsaW5nVGhyZWFkICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlICAvKiBjYW5DYWxsSmF2YSAqLyk7CiAgICAgfQogCiAgICAgLy8gY3JlYXRlIGZldGNoZXIgdG8gZmV0Y2ggdGhlIG1hc3RlciBwbGF5bGlzdApAQCAtMjIwMiwxNCArMjIwNywxNCBAQAogICAgICAgICArK2FjdGl2ZUNvdW50OwogICAgICAgICBpbnQ2NF90IHJlYWR5TWFya1VzID0KICAgICAgICAgICAgIChtSW5QcmVwYXJhdGlvblBoYXNlID8KLSAgICAgICAgICAgICAgICBtQnVmZmVyaW5nU2V0dGluZ3MubUluaXRpYWxXYXRlcm1hcmtNcyA6Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlcmluZ1NldHRpbmdzLm1SZWJ1ZmZlcmluZ1dhdGVybWFya0hpZ2hNcykgKiAxMDAwbGw7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcmluZ1NldHRpbmdzLm1Jbml0aWFsTWFya01zIDoKKyAgICAgICAgICAgICAgICBtQnVmZmVyaW5nU2V0dGluZ3MubVJlc3VtZVBsYXliYWNrTWFya01zKSAqIDEwMDBsbDsKICAgICAgICAgaWYgKGJ1ZmZlcmVkRHVyYXRpb25VcyA+IHJlYWR5TWFya1VzCiAgICAgICAgICAgICAgICAgfHwgbVBhY2tldFNvdXJjZXNbaV0tPmlzRmluaXNoZWQoMCkpIHsKICAgICAgICAgICAgICsrcmVhZHlDb3VudDsKICAgICAgICAgfQogICAgICAgICBpZiAoIW1QYWNrZXRTb3VyY2VzW2ldLT5pc0ZpbmlzaGVkKDApKSB7Ci0gICAgICAgICAgICBpZiAoYnVmZmVyZWREdXJhdGlvblVzIDwgbUJ1ZmZlcmluZ1NldHRpbmdzLm1SZWJ1ZmZlcmluZ1dhdGVybWFya0xvd01zICogMTAwMGxsKSB7CisgICAgICAgICAgICBpZiAoYnVmZmVyZWREdXJhdGlvblVzIDwga1VuZGVyZmxvd01hcmtNcyAqIDEwMDBsbCkgewogICAgICAgICAgICAgICAgICsrdW5kZXJmbG93Q291bnQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoYnVmZmVyZWREdXJhdGlvblVzID4gbVVwU3dpdGNoTWFyaykgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmgKaW5kZXggYWJmOGNmMC4uN2E2ZDQ4NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5oCkBAIC0zMyw3ICszMyw3IEBACiBzdHJ1Y3QgQW5vdGhlclBhY2tldFNvdXJjZTsKIGNsYXNzIERhdGFTb3VyY2U7CiBzdHJ1Y3QgSFRUUEJhc2U7Ci1zdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2U7CitzdHJ1Y3QgTWVkaWFIVFRQU2VydmljZTsKIHN0cnVjdCBMaXZlRGF0YVNvdXJjZTsKIHN0cnVjdCBNM1VQYXJzZXI7CiBzdHJ1Y3QgUGxheWxpc3RGZXRjaGVyOwpAQCAtNzEsNyArNzEsNyBAQAogICAgIExpdmVTZXNzaW9uKAogICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCiAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKLSAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UpOworICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlKTsKIAogICAgIHZvaWQgc2V0QnVmZmVyaW5nU2V0dGluZ3MoY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MgJmJ1ZmZlcmluZyk7CiAKQEAgLTE4Nyw3ICsxODcsNyBAQAogCiAgICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7CiAgICAgdWludDMyX3QgbUZsYWdzOwotICAgIHNwPElNZWRpYUhUVFBTZXJ2aWNlPiBtSFRUUFNlcnZpY2U7CisgICAgc3A8TWVkaWFIVFRQU2VydmljZT4gbUhUVFBTZXJ2aWNlOwogCiAgICAgYm9vbCBtQnVmZmVyaW5nOwogICAgIGJvb2wgbUluUHJlcGFyYXRpb25QaGFzZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuY3BwCmluZGV4IGEwZTZjNDcuLjUyNzkxYjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmNwcApAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CkBAIC00ODQsNiArNDg1LDkgQEAKICAgICAgICAgLy8gQmFzZSBVUkwgbXVzdCBiZSBhYnNvbHV0ZQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQorICAgIGlmICghc3RybmNhc2VjbXAoImRhdGE6IiwgdXJsLCA1KSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogICAgIGNvbnN0IHNpemVfdCBzY2hlbWVFbmQgPSAoc3Ryc3RyKGJhc2VVUkwsICIvLyIpIC0gYmFzZVVSTCkgKyAyOwogICAgIENIRUNLKHNjaGVtZUVuZCA9PSA3IHx8IHNjaGVtZUVuZCA9PSA4KTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5jcHAKaW5kZXggYmU5MGJjZi4uOWYzOWI1ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuY3BwCkBAIC0yMyw3ICsyMyw2IEBACiAjaW5jbHVkZSAiSFRUUERvd25sb2FkZXIuaCIKICNpbmNsdWRlICJMaXZlU2Vzc2lvbi5oIgogI2luY2x1ZGUgIk0zVVBhcnNlci5oIgotI2luY2x1ZGUgImluY2x1ZGUvYXZjX3V0aWxzLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9JRDMuaCIKICNpbmNsdWRlICJtcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuaCIKICNpbmNsdWRlICJtcGVnMnRzL0hsc1NhbXBsZURlY3J5cHRvci5oIgpAQCAtMzEsOCArMzAsMTMgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUtleXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFVUklTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogCiAjaW5jbHVkZSA8Y3R5cGUuaD4KQEAgLTM0NCw2ICszNDgsMTYgQEAKICAgICBzcDxBQnVmZmVyPiBrZXk7CiAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAga2V5ID0gbUFFU0tleUZvclVSSS52YWx1ZUF0KGluZGV4KTsKKyAgICB9IGVsc2UgaWYgKGtleVVSSS5zdGFydHNXaXRoKCJkYXRhOiIpKSB7CisgICAgICAgIHNwPERhdGFTb3VyY2U+IGtleVNyYyA9IERhdGFVUklTb3VyY2U6OkNyZWF0ZShrZXlVUkkuY19zdHIoKSk7CisgICAgICAgIG9mZjY0X3Qga2V5TGVuOworICAgICAgICBpZiAoa2V5U3JjID09IE5VTEwgfHwga2V5U3JjLT5nZXRTaXplKCZrZXlMZW4pICE9IE9LIHx8IGtleUxlbiA8IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJNYWxmb3JtZWQgY2lwaGVyIGtleSBkYXRhIHVyaS4iKTsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICAgICAga2V5ID0gbmV3IEFCdWZmZXIoa2V5TGVuKTsKKyAgICAgICAga2V5U3JjLT5yZWFkQXQoMCwga2V5LT5kYXRhKCksIGtleUxlbik7CisgICAgICAgIGtleS0+c2V0UmFuZ2UoMCwga2V5TGVuKTsKICAgICB9IGVsc2UgewogICAgICAgICBzc2l6ZV90IGVyciA9IG1IVFRQRG93bmxvYWRlci0+ZmV0Y2hGaWxlKGtleVVSSS5jX3N0cigpLCAma2V5KTsKIApAQCAtMTY5MywxMiArMTcwNywxMiBAQAogICAgICAgICBzcDxBTWVzc2FnZT4gZXh0cmEgPSBuZXcgQU1lc3NhZ2U7CiAgICAgICAgIC8vIFNpbmNlIHdlIGFyZSB1c2luZyBhYnNvbHV0ZSB0aW1lc3RhbXBzLCBzaWduYWwgYW4gb2Zmc2V0IG9mIDAgdG8gcHJldmVudAogICAgICAgICAvLyBBVFNQYXJzZXIgZnJvbSBza2V3aW5nIHRoZSB0aW1lc3RhbXBzIG9mIGFjY2VzcyB1bml0cy4KLSAgICAgICAgZXh0cmEtPnNldEludDY0KElTdHJlYW1MaXN0ZW5lcjo6a0tleU1lZGlhVGltZVVzLCAwKTsKKyAgICAgICAgZXh0cmEtPnNldEludDY0KGtBVFNQYXJzZXJLZXlNZWRpYVRpbWVVcywgMCk7CiAKICAgICAgICAgLy8gV2hlbiBhZGFwdGluZywgc2lnbmFsIGEgcmVjZW50IG1lZGlhIHRpbWUgdG8gdGhlIHBhcnNlciwKICAgICAgICAgLy8gc28gdGhhdCBQVFMgd3JhcCBhcm91bmQgaXMgaGFuZGxlZCBmb3IgdGhlIG5ldyB2YXJpYW50LgogICAgICAgICBpZiAobVN0YXJ0VGltZVVzID49IDAgJiYgIW1TdGFydFRpbWVVc1JlbGF0aXZlKSB7Ci0gICAgICAgICAgICBleHRyYS0+c2V0SW50NjQoSVN0cmVhbUxpc3RlbmVyOjprS2V5UmVjZW50TWVkaWFUaW1lVXMsIG1TdGFydFRpbWVVcyk7CisgICAgICAgICAgICBleHRyYS0+c2V0SW50NjQoa0FUU1BhcnNlcktleVJlY2VudE1lZGlhVGltZVVzLCBtU3RhcnRUaW1lVXMpOwogICAgICAgICB9CiAKICAgICAgICAgbVRTUGFyc2VyLT5zaWduYWxEaXNjb250aW51aXR5KApAQCAtMTgyOSw3ICsxODQzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXRpbWVVcyAtIG1TdGFydFRpbWVVcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSURSRm91bmQpOwogICAgICAgICAgICAgICAgICAgICBpZiAoaXNBdmMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJc0lEUihhY2Nlc3NVbml0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKElzSURSKGFjY2Vzc1VuaXQtPmRhdGEoKSwgYWNjZXNzVW5pdC0+c2l6ZSgpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWRlb0J1ZmZlci0+Y2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU0xPR1Yoc3RyZWFtLCAiZm91bmQgSURSLCBjbGVhciBtVmlkZW9CdWZmZXIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSURSRm91bmQgPSB0cnVlOwpAQCAtMjA2NCw3ICsyMDc4LDggQEAKICAgICAgICAgQ0hFQ0tfTkUoY2hhbm5lbF9jb25maWd1cmF0aW9uLCAwdSk7CiAgICAgICAgIGJpdHMuc2tpcEJpdHMoMik7ICAvLyBvcmlnaW5hbF9jb3B5LCBob21lCiAKLSAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoCisgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhKCk7CisgICAgICAgIE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YSgqbWV0YSwKICAgICAgICAgICAgICAgICBwcm9maWxlLCBzYW1wbGluZ19mcmVxX2luZGV4LCBjaGFubmVsX2NvbmZpZ3VyYXRpb24pOwogCiAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlJc0FEVFMsIHRydWUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5icAppbmRleCAzMDAwOGQ5Li4zN2Y5ZDUwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5icApAQCAtMTYsOCArMTYsNiBAQAogICAgICAgICAgICAgY2ZpOiB0cnVlLAogICAgICAgICB9LAogICAgIH0sCi0KLSAgICBzaGFyZWRfbGliczogWyJsaWJtZWRpYSJdLAogfQogCiAvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9JRDMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0lEMy5jcHAKaW5kZXggYTBiZmQwNi4uYTBhNjJmNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0lEMy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0lEMy5jcHAKQEAgLTIwLDkgKzIwLDkgQEAKIAogI2luY2x1ZGUgIi4uL2luY2x1ZGUvSUQzLmgiCiAKKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlIDxieXRlc3dhcC5oPgogCkBAIC0zMCw3ICszMCw3IEBACiAKIHN0YXRpYyBjb25zdCBzaXplX3Qga01heE1ldGFkYXRhU2l6ZSA9IDMgKiAxMDI0ICogMTAyNDsKIAotc3RydWN0IE1lbW9yeVNvdXJjZSA6IHB1YmxpYyBEYXRhU291cmNlIHsKK3N0cnVjdCBNZW1vcnlTb3VyY2UgOiBwdWJsaWMgRGF0YVNvdXJjZUJhc2UgewogICAgIE1lbW9yeVNvdXJjZShjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkKICAgICAgICAgOiBtRGF0YShkYXRhKSwKICAgICAgICAgICBtU2l6ZShzaXplKSB7CkBAIC01Niw3ICs1Niw3IEBACiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTWVtb3J5U291cmNlKTsKIH07CiAKLUlEMzo6SUQzKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIGJvb2wgaWdub3JlVjEsIG9mZjY0X3Qgb2Zmc2V0KQorSUQzOjpJRDMoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgYm9vbCBpZ25vcmVWMSwgb2ZmNjRfdCBvZmZzZXQpCiAgICAgOiBtSXNWYWxpZChmYWxzZSksCiAgICAgICBtRGF0YShOVUxMKSwKICAgICAgIG1TaXplKDApLApAQCAtNzcsNyArNzcsNyBAQAogICAgICAgbUZpcnN0RnJhbWVPZmZzZXQoMCksCiAgICAgICBtVmVyc2lvbihJRDNfVU5LTk9XTiksCiAgICAgICBtUmF3U2l6ZSgwKSB7Ci0gICAgc3A8TWVtb3J5U291cmNlPiBzb3VyY2UgPSBuZXcgKHN0ZDo6bm90aHJvdykgTWVtb3J5U291cmNlKGRhdGEsIHNpemUpOworICAgIE1lbW9yeVNvdXJjZSAqc291cmNlID0gbmV3IChzdGQ6Om5vdGhyb3cpIE1lbW9yeVNvdXJjZShkYXRhLCBzaXplKTsKIAogICAgIGlmIChzb3VyY2UgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuOwpAQCAtODcsNiArODcsNyBAQAogICAgIGlmICghbUlzVmFsaWQgJiYgIWlnbm9yZVYxKSB7CiAgICAgICAgIG1Jc1ZhbGlkID0gcGFyc2VWMShzb3VyY2UpOwogICAgIH0KKyAgICBkZWxldGUgc291cmNlOwogfQogCiBJRDM6On5JRDMoKSB7CkBAIC0xMTgsNyArMTE5LDcgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBJRDM6OnBhcnNlVjIoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgb2ZmNjRfdCBvZmZzZXQpIHsKK2Jvb2wgSUQzOjpwYXJzZVYyKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIG9mZjY0X3Qgb2Zmc2V0KSB7CiBzdHJ1Y3QgaWQzX2hlYWRlciB7CiAgICAgY2hhciBpZFszXTsKICAgICB1aW50OF90IHZlcnNpb25fbWFqb3I7CkBAIC05NzYsNyArOTc3LDcgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotYm9vbCBJRDM6OnBhcnNlVjEoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSkgeworYm9vbCBJRDM6OnBhcnNlVjEoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkgewogICAgIGNvbnN0IHNpemVfdCBWMV9UQUdfU0laRSA9IDEyODsKIAogICAgIG9mZjY0X3Qgc2l6ZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy90ZXN0aWQzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy90ZXN0aWQzLmNwcAppbmRleCA0NDJhM2ZmLi44NmU2YWRmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvdGVzdGlkMy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL3Rlc3RpZDMuY3BwCkBAIC03Miw3ICs3Miw3IEBACiAgICAgc3A8RmlsZVNvdXJjZT4gZmlsZSA9IG5ldyBGaWxlU291cmNlKHBhdGgpOwogICAgIENIRUNLX0VRKGZpbGUtPmluaXRDaGVjaygpLCAoc3RhdHVzX3QpT0spOwogCi0gICAgSUQzIHRhZyhmaWxlKTsKKyAgICBJRDMgdGFnKGZpbGUuZ2V0KCkpOwogICAgIGlmICghdGFnLmlzVmFsaWQoKSkgewogICAgICAgICBwcmludGYoIkZBSUwgJXNcbiIsIHBhdGgpOwogICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FBQ0VuY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQUFDRW5jb2Rlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjJlOTA1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQUFDRW5jb2Rlci5oCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQUFDX0VOQ09ERVJfSAotI2RlZmluZSBBQUNfRU5DT0RFUl9ICi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0KLXN0cnVjdCBWT19BVURJT19DT0RFQ0FQSTsKLXN0cnVjdCBWT19NRU1fT1BFUkFUT1I7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgTWVkaWFCdWZmZXJHcm91cDsKLQotY2xhc3MgQUFDRW5jb2RlcjogcHVibGljIEJuTWVkaWFTb3VyY2UgewotICAgIHB1YmxpYzoKLSAgICAgICAgQUFDRW5jb2Rlcihjb25zdCBzcDxJTWVkaWFTb3VyY2U+ICZzb3VyY2UsIGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSk7Ci0KLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKTsKLQotCi0gICAgcHJvdGVjdGVkOgotICAgICAgICB2aXJ0dWFsIH5BQUNFbmNvZGVyKCk7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBzcDxJTWVkaWFTb3VyY2U+ICAgbVNvdXJjZTsKLSAgICAgICAgc3A8TWV0YURhdGE+ICAgICAgbU1ldGE7Ci0gICAgICAgIGJvb2wgICAgICAgICAgICAgIG1TdGFydGVkOwotICAgICAgICBNZWRpYUJ1ZmZlckdyb3VwICptQnVmZmVyR3JvdXA7Ci0gICAgICAgIE1lZGlhQnVmZmVyICAgICAgKm1JbnB1dEJ1ZmZlcjsKLSAgICAgICAgc3RhdHVzX3QgICAgICAgICAgbUluaXRDaGVjazsKLSAgICAgICAgaW50MzJfdCAgICAgICAgICAgbVNhbXBsZVJhdGU7Ci0gICAgICAgIGludDMyX3QgICAgICAgICAgIG1DaGFubmVsczsKLSAgICAgICAgaW50MzJfdCAgICAgICAgICAgbUJpdFJhdGU7Ci0gICAgICAgIGludDMyX3QgICAgICAgICAgIG1GcmFtZUNvdW50OwotCi0gICAgICAgIGludDY0X3QgICAgICAgICAgIG1BbmNob3JUaW1lVXM7Ci0gICAgICAgIGludDY0X3QgICAgICAgICAgIG1OdW1JbnB1dFNhbXBsZXM7Ci0KLSAgICAgICAgZW51bSB7Ci0gICAgICAgICAgICBrTnVtU2FtcGxlc1BlckZyYW1lID0gMTAyNCwKLSAgICAgICAgfTsKLQotICAgICAgICBpbnQxNl90ICAgICAgICAgICAqbUlucHV0RnJhbWU7Ci0KLSAgICAgICAgdWludDhfdCAgICAgICAgICAgbUF1ZGlvU3BlY2lmaWNDb25maWdEYXRhWzJdOyAvLyBhdWlkbyBzcGVjaWZpYyBkYXRhCi0gICAgICAgIHZvaWQgICAgICAgICAgICAgKm1FbmNvZGVySGFuZGxlOwotICAgICAgICBWT19BVURJT19DT0RFQ0FQSSAqbUFwaUhhbmRsZTsKLSAgICAgICAgVk9fTUVNX09QRVJBVE9SICAqbU1lbU9wZXJhdG9yOwotCi0gICAgICAgIHN0YXR1c190IHNldEF1ZGlvU3BlY2lmaWNDb25maWdEYXRhKCk7Ci0gICAgICAgIHN0YXR1c190IGluaXRDaGVjaygpOwotCi0gICAgICAgIEFBQ0VuY29kZXImIG9wZXJhdG9yPShjb25zdCBBQUNFbmNvZGVyICZyaHMpOwotICAgICAgICBBQUNFbmNvZGVyKGNvbnN0IEFBQ0VuY29kZXImIGNvcHkpOwotCi19OwotCi19Ci0KLSNlbmRpZiAgLy8jaWZuZGVmIEFBQ19FTkNPREVSX0gKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BQUNFeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQUFDRXh0cmFjdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNGM0MWMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BQUNFeHRyYWN0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFBQ19FWFRSQUNUT1JfSF8KLQotI2RlZmluZSBBQUNfRVhUUkFDVE9SX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgotCi0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IEFNZXNzYWdlOwotY2xhc3MgU3RyaW5nODsKLQotY2xhc3MgQUFDRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKLXB1YmxpYzoKLSAgICBBQUNFeHRyYWN0b3IoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtZXRhKTsKLQotICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7Ci0gICAgdmlydHVhbCBzcDxJTWVkaWFTb3VyY2U+IGdldFRyYWNrKHNpemVfdCBpbmRleCk7Ci0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0VHJhY2tNZXRhRGF0YShzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKLQotICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldE1ldGFEYXRhKCk7Ci0gICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJBQUNFeHRyYWN0b3IiOyB9Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5BQUNFeHRyYWN0b3IoKTsKLQotcHJpdmF0ZToKLSAgICBzcDxEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKLSAgICBzcDxNZXRhRGF0YT4gbU1ldGE7Ci0gICAgc3RhdHVzX3QgbUluaXRDaGVjazsKLQotICAgIFZlY3Rvcjx1aW50NjRfdD4gbU9mZnNldFZlY3RvcjsKLSAgICBpbnQ2NF90IG1GcmFtZUR1cmF0aW9uVXM7Ci0KLSAgICBBQUNFeHRyYWN0b3IoY29uc3QgQUFDRXh0cmFjdG9yICYpOwotICAgIEFBQ0V4dHJhY3RvciAmb3BlcmF0b3I9KGNvbnN0IEFBQ0V4dHJhY3RvciAmKTsKLX07Ci0KLWJvb2wgU25pZmZBQUMoCi0gICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSwKLSAgICAgICAgc3A8QU1lc3NhZ2U+ICopOwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIEFBQ19FWFRSQUNUT1JfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQUNvZGVjQnVmZmVyQ2hhbm5lbC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BQ29kZWNCdWZmZXJDaGFubmVsLmgKaW5kZXggZjI1M2E1Mi4uN2MwMWU0NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BQ29kZWNCdWZmZXJDaGFubmVsLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BQ29kZWNCdWZmZXJDaGFubmVsLmgKQEAgLTI5LDggKzI5LDEwIEBACiAjaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXVzaW5nIGhhcmR3YXJlOjpoaWRsX21lbW9yeTsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CitjbGFzcyBIaWRsTWVtb3J5OworfTsKK3VzaW5nIGhhcmR3YXJlOjpIaWRsTWVtb3J5OwogCiAvKioKICAqIEJ1ZmZlckNoYW5uZWxCYXNlIGltcGxlbWVudGF0aW9uIGZvciBBQ29kZWMuCkBAIC0xMTksNyArMTIxLDcgQEAKICAgICBzcDxNZW1vcnlEZWFsZXI+IG1EZWFsZXI7CiAgICAgc3A8SU1lbW9yeT4gbURlY3J5cHREZXN0aW5hdGlvbjsKICAgICBpbnQzMl90IG1IZWFwU2VxTnVtOwotICAgIGhpZGxfbWVtb3J5IG1IaWRsTWVtb3J5OworICAgIHNwPEhpZGxNZW1vcnk+IG1IaWRsTWVtb3J5OwogCiAgICAgLy8gVGhlc2Ugc2hvdWxkIG9ubHkgYmUgYWNjZXNzZWQgdmlhIHN0ZDo6YXRvbWljXyogZnVuY3Rpb25zLgogICAgIC8vCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FNUkV4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BTVJFeHRyYWN0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFiY2IxMi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FNUkV4dHJhY3Rvci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU1SX0VYVFJBQ1RPUl9IXwotCi0jZGVmaW5lIEFNUl9FWFRSQUNUT1JfSF8KLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IEFNZXNzYWdlOwotY2xhc3MgU3RyaW5nODsKLSNkZWZpbmUgT0ZGU0VUX1RBQkxFX0xFTiAgICAzMDAKLQotY2xhc3MgQU1SRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKLXB1YmxpYzoKLSAgICBleHBsaWNpdCBBTVJFeHRyYWN0b3IoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSk7Ci0KLSAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwotICAgIHZpcnR1YWwgc3A8SU1lZGlhU291cmNlPiBnZXRUcmFjayhzaXplX3QgaW5kZXgpOwotICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldFRyYWNrTWV0YURhdGEoc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7Ci0KLSAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRNZXRhRGF0YSgpOwotICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiQU1SRXh0cmFjdG9yIjsgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+QU1SRXh0cmFjdG9yKCk7Ci0KLXByaXZhdGU6Ci0gICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7Ci0gICAgc3A8TWV0YURhdGE+IG1NZXRhOwotICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7Ci0gICAgYm9vbCBtSXNXaWRlOwotCi0gICAgb2ZmNjRfdCBtT2Zmc2V0VGFibGVbT0ZGU0VUX1RBQkxFX0xFTl07IC8vNSBtaW4KLSAgICBzaXplX3QgbU9mZnNldFRhYmxlTGVuZ3RoOwotCi0gICAgQU1SRXh0cmFjdG9yKGNvbnN0IEFNUkV4dHJhY3RvciAmKTsKLSAgICBBTVJFeHRyYWN0b3IgJm9wZXJhdG9yPShjb25zdCBBTVJFeHRyYWN0b3IgJik7Ci19OwotCi1ib29sIFNuaWZmQU1SKAotICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UsCi0gICAgICAgIHNwPEFNZXNzYWdlPiAqKTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBBTVJfRVhUUkFDVE9SX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FWSUV4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BVklFeHRyYWN0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JlNTA1Yy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FWSUV4dHJhY3Rvci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFWSV9FWFRSQUNUT1JfSF8KLQotI2RlZmluZSBBVklfRVhUUkFDVE9SX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBBVklFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgewotICAgIEFWSUV4dHJhY3Rvcihjb25zdCBzcDxEYXRhU291cmNlPiAmZGF0YVNvdXJjZSk7Ci0KLSAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwotCi0gICAgdmlydHVhbCBzcDxNZWRpYVNvdXJjZT4gZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKLQotICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKLQotICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldE1ldGFEYXRhKCk7Ci0gICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJBVklFeHRyYWN0b3IiOyB9Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5BVklFeHRyYWN0b3IoKTsKLQotcHJpdmF0ZToKLSAgICBzdHJ1Y3QgQVZJU291cmNlOwotICAgIHN0cnVjdCBNUDNTcGxpdHRlcjsKLQotICAgIHN0cnVjdCBTYW1wbGVJbmZvIHsKLSAgICAgICAgdWludDMyX3QgbU9mZnNldDsKLSAgICAgICAgYm9vbCBtSXNLZXk7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBUcmFjayB7Ci0gICAgICAgIHNwPE1ldGFEYXRhPiBtTWV0YTsKLSAgICAgICAgVmVjdG9yPFNhbXBsZUluZm8+IG1TYW1wbGVzOwotICAgICAgICB1aW50MzJfdCBtUmF0ZTsKLSAgICAgICAgdWludDMyX3QgbVNjYWxlOwotCi0gICAgICAgIC8vIElmIGJ5dGVzIHBlciBzYW1wbGUgPT0gMCwgZWFjaCBjaHVuayByZXByZXNlbnRzIGEgc2luZ2xlIHNhbXBsZSwKLSAgICAgICAgLy8gb3RoZXJ3aXNlIGVhY2ggY2h1bmsgc2hvdWxkIG1lIGEgbXVsdGlwbGUgb2YgYnl0ZXMtcGVyLXNhbXBsZSBpbgotICAgICAgICAvLyBzaXplLgotICAgICAgICB1aW50MzJfdCBtQnl0ZXNQZXJTYW1wbGU7Ci0KLSAgICAgICAgZW51bSBLaW5kIHsKLSAgICAgICAgICAgIEFVRElPLAotICAgICAgICAgICAgVklERU8sCi0gICAgICAgICAgICBPVEhFUgotCi0gICAgICAgIH0gbUtpbmQ7Ci0KLSAgICAgICAgc2l6ZV90IG1OdW1TeW5jU2FtcGxlczsKLSAgICAgICAgc2l6ZV90IG1UaHVtYm5haWxTYW1wbGVTaXplOwotICAgICAgICBzc2l6ZV90IG1UaHVtYm5haWxTYW1wbGVJbmRleDsKLSAgICAgICAgc2l6ZV90IG1NYXhTYW1wbGVTaXplOwotCi0gICAgICAgIC8vIElmIG1CeXRlc1BlclNhbXBsZSA+IDA6Ci0gICAgICAgIGRvdWJsZSBtQXZnQ2h1bmtTaXplOwotICAgICAgICBzaXplX3QgbUZpcnN0Q2h1bmtTaXplOwotICAgIH07Ci0KLSAgICBzcDxEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKLSAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwotICAgIFZlY3RvcjxUcmFjaz4gbVRyYWNrczsKLQotICAgIG9mZjY0X3QgbU1vdmllT2Zmc2V0OwotICAgIGJvb2wgbUZvdW5kSW5kZXg7Ci0gICAgYm9vbCBtT2Zmc2V0c0FyZUFic29sdXRlOwotCi0gICAgc3NpemVfdCBwYXJzZUNodW5rKG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IHNpemUsIGludCBkZXB0aCA9IDApOwotICAgIHN0YXR1c190IHBhcnNlU3RyZWFtSGVhZGVyKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7Ci0gICAgc3RhdHVzX3QgcGFyc2VTdHJlYW1Gb3JtYXQob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKLSAgICBzdGF0dXNfdCBwYXJzZUluZGV4KG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZUhlYWRlcnMoKTsKLQotICAgIHN0YXR1c190IGdldFNhbXBsZUluZm8oCi0gICAgICAgICAgICBzaXplX3QgdHJhY2tJbmRleCwgc2l6ZV90IHNhbXBsZUluZGV4LAotICAgICAgICAgICAgb2ZmNjRfdCAqb2Zmc2V0LCBzaXplX3QgKnNpemUsIGJvb2wgKmlzS2V5LAotICAgICAgICAgICAgaW50NjRfdCAqc2FtcGxlVGltZVVzKTsKLQotICAgIHN0YXR1c190IGdldFNhbXBsZVRpbWUoCi0gICAgICAgICAgICBzaXplX3QgdHJhY2tJbmRleCwgc2l6ZV90IHNhbXBsZUluZGV4LCBpbnQ2NF90ICpzYW1wbGVUaW1lVXMpOwotCi0gICAgc3RhdHVzX3QgZ2V0U2FtcGxlSW5kZXhBdFRpbWUoCi0gICAgICAgICAgICBzaXplX3QgdHJhY2tJbmRleCwKLSAgICAgICAgICAgIGludDY0X3QgdGltZVVzLCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGUsCi0gICAgICAgICAgICBzaXplX3QgKnNhbXBsZUluZGV4KSBjb25zdDsKLQotICAgIHN0YXR1c190IGFkZE1QRUc0Q29kZWNTcGVjaWZpY0RhdGEoc2l6ZV90IHRyYWNrSW5kZXgpOwotICAgIHN0YXR1c190IGFkZEgyNjRDb2RlY1NwZWNpZmljRGF0YShzaXplX3QgdHJhY2tJbmRleCk7Ci0KLSAgICBzdGF0aWMgYm9vbCBJc0NvcnJlY3RDaHVua1R5cGUoCi0gICAgICAgIHNzaXplX3QgdHJhY2tJbmRleCwgVHJhY2s6OktpbmQga2luZCwgdWludDMyX3QgY2h1bmtUeXBlKTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFWSUV4dHJhY3Rvcik7Ci19OwotCi1jbGFzcyBTdHJpbmc4Owotc3RydWN0IEFNZXNzYWdlOwotCi1ib29sIFNuaWZmQVZJKAotICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UsCi0gICAgICAgIHNwPEFNZXNzYWdlPiAqKTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBBVklfRVhUUkFDVE9SX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0NhbGxiYWNrRGF0YVNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9DYWxsYmFja0RhdGFTb3VyY2UuaAppbmRleCAwZDc3NWU2Li45ZjQxM2NkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0NhbGxiYWNrRGF0YVNvdXJjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQ2FsbGJhY2tEYXRhU291cmNlLmgKQEAgLTE3LDcgKzE3LDcgQEAKICNpZm5kZWYgQU5EUk9JRF9DQUxMQkFDS0RBVEFTT1VSQ0VfSAogI2RlZmluZSBBTkRST0lEX0NBTExCQUNLREFUQVNPVVJDRV9ICiAKLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvRkxBQ0V4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9GTEFDRXh0cmFjdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYmMxMzkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9GTEFDRXh0cmFjdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBGTEFDX0VYVFJBQ1RPUl9IXwotI2RlZmluZSBGTEFDX0VYVFJBQ1RPUl9IXwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIEZMQUNQYXJzZXI7Ci0KLWNsYXNzIEZMQUNFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgewotCi1wdWJsaWM6Ci0gICAgLy8gRXh0cmFjdG9yIGFzc3VtZXMgb3duZXJzaGlwIG9mIHNvdXJjZQotICAgIGV4cGxpY2l0IEZMQUNFeHRyYWN0b3IoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSk7Ci0KLSAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwotICAgIHZpcnR1YWwgc3A8SU1lZGlhU291cmNlPiBnZXRUcmFjayhzaXplX3QgaW5kZXgpOwotICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldFRyYWNrTWV0YURhdGEoc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7Ci0KLSAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRNZXRhRGF0YSgpOwotICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiRkxBQ0V4dHJhY3RvciI7IH0KLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkZMQUNFeHRyYWN0b3IoKTsKLQotcHJpdmF0ZToKLSAgICBzcDxEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKLSAgICBzcDxGTEFDUGFyc2VyPiBtUGFyc2VyOwotICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7Ci0gICAgc3A8TWV0YURhdGE+IG1GaWxlTWV0YWRhdGE7Ci0KLSAgICAvLyBUaGVyZSBpcyBvbmx5IG9uZSB0cmFjawotICAgIHNwPE1ldGFEYXRhPiBtVHJhY2tNZXRhZGF0YTsKLQotICAgIHN0YXR1c190IGluaXQoKTsKLQotICAgIEZMQUNFeHRyYWN0b3IoY29uc3QgRkxBQ0V4dHJhY3RvciAmKTsKLSAgICBGTEFDRXh0cmFjdG9yICZvcGVyYXRvcj0oY29uc3QgRkxBQ0V4dHJhY3RvciAmKTsKLQotfTsKLQotYm9vbCBTbmlmZkZMQUMoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsCi0gICAgICAgIGZsb2F0ICpjb25maWRlbmNlLCBzcDxBTWVzc2FnZT4gKik7Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gRkxBQ19FWFRSQUNUT1JfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvRnJhbWVEZWNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0ZyYW1lRGVjb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNThjMTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0ZyYW1lRGVjb2Rlci5oCkBAIC0wLDAgKzEsMTg1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBGUkFNRV9ERUNPREVSX0hfCisjZGVmaW5lIEZSQU1FX0RFQ09ERVJfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9WaWRlby5oPgorI2luY2x1ZGUgPHN5c3RlbS9ncmFwaGljcy1iYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFNZXNzYWdlOworY2xhc3MgTWVkaWFDb2RlY0J1ZmZlcjsKK2NsYXNzIElNZWRpYVNvdXJjZTsKK2NsYXNzIFZpZGVvRnJhbWU7CitzdHJ1Y3QgTWVkaWFDb2RlYzsKKworc3RydWN0IEZyYW1lUmVjdCB7CisgICAgaW50MzJfdCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b207Cit9OworCitzdHJ1Y3QgRnJhbWVEZWNvZGVyIDogcHVibGljIFJlZkJhc2UgeworICAgIEZyYW1lRGVjb2RlcigKKyAgICAgICAgICAgIGNvbnN0IEFTdHJpbmcgJmNvbXBvbmVudE5hbWUsCisgICAgICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJnRyYWNrTWV0YSwKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYVNvdXJjZT4gJnNvdXJjZSk7CisKKyAgICBzdGF0dXNfdCBpbml0KAorICAgICAgICAgICAgaW50NjRfdCBmcmFtZVRpbWVVcywgc2l6ZV90IG51bUZyYW1lcywgaW50IG9wdGlvbiwgaW50IGNvbG9yRm9ybWF0KTsKKworICAgIHNwPElNZW1vcnk+IGV4dHJhY3RGcmFtZShGcmFtZVJlY3QgKnJlY3QgPSBOVUxMKTsKKworICAgIHN0YXR1c190IGV4dHJhY3RGcmFtZXMoc3RkOjp2ZWN0b3I8c3A8SU1lbW9yeT4gPiogZnJhbWVzKTsKKworICAgIHN0YXRpYyBzcDxJTWVtb3J5PiBnZXRNZXRhZGF0YU9ubHkoCisgICAgICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJnRyYWNrTWV0YSwgaW50IGNvbG9yRm9ybWF0LCBib29sIHRodW1ibmFpbCA9IGZhbHNlKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkZyYW1lRGVjb2RlcigpOworCisgICAgdmlydHVhbCBzcDxBTWVzc2FnZT4gb25HZXRGb3JtYXRBbmRTZWVrT3B0aW9ucygKKyAgICAgICAgICAgIGludDY0X3QgZnJhbWVUaW1lVXMsCisgICAgICAgICAgICBzaXplX3QgbnVtRnJhbWVzLAorICAgICAgICAgICAgaW50IHNlZWtNb2RlLAorICAgICAgICAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zICpvcHRpb25zKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9uRXh0cmFjdFJlY3QoRnJhbWVSZWN0ICpyZWN0KSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9uSW5wdXRSZWNlaXZlZCgKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZjb2RlY0J1ZmZlciwKKyAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmc2FtcGxlTWV0YSwKKyAgICAgICAgICAgIGJvb2wgZmlyc3RTYW1wbGUsCisgICAgICAgICAgICB1aW50MzJfdCAqZmxhZ3MpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25PdXRwdXRSZWNlaXZlZCgKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZ2aWRlb0ZyYW1lQnVmZmVyLAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQsCisgICAgICAgICAgICBpbnQ2NF90IHRpbWVVcywKKyAgICAgICAgICAgIGJvb2wgKmRvbmUpID0gMDsKKworICAgIHNwPE1ldGFEYXRhPiB0cmFja01ldGEoKSAgICAgY29uc3QgICAgICB7IHJldHVybiBtVHJhY2tNZXRhOyB9CisgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgZHN0Rm9ybWF0KCkgY29uc3QgIHsgcmV0dXJuIG1Ec3RGb3JtYXQ7IH0KKyAgICBpbnQzMl90IGRzdEJwcCgpICAgICAgICAgICAgIGNvbnN0ICAgICAgeyByZXR1cm4gbURzdEJwcDsgfQorCisgICAgdm9pZCBhZGRGcmFtZShjb25zdCBzcDxJTWVtb3J5PiAmZnJhbWUpIHsKKyAgICAgICAgbUZyYW1lcy5wdXNoX2JhY2soZnJhbWUpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBBU3RyaW5nIG1Db21wb25lbnROYW1lOworICAgIHNwPE1ldGFEYXRhPiBtVHJhY2tNZXRhOworICAgIHNwPElNZWRpYVNvdXJjZT4gbVNvdXJjZTsKKyAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBtRHN0Rm9ybWF0OworICAgIGludDMyX3QgbURzdEJwcDsKKyAgICBzdGQ6OnZlY3RvcjxzcDxJTWVtb3J5PiA+IG1GcmFtZXM7CisgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zIG1SZWFkT3B0aW9uczsKKyAgICBzcDxNZWRpYUNvZGVjPiBtRGVjb2RlcjsKKyAgICBzcDxBTWVzc2FnZT4gbU91dHB1dEZvcm1hdDsKKyAgICBib29sIG1IYXZlTW9yZUlucHV0czsKKyAgICBib29sIG1GaXJzdFNhbXBsZTsKKworICAgIHN0YXR1c190IGV4dHJhY3RJbnRlcm5hbCgpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRnJhbWVEZWNvZGVyKTsKK307CisKK3N0cnVjdCBWaWRlb0ZyYW1lRGVjb2RlciA6IHB1YmxpYyBGcmFtZURlY29kZXIgeworICAgIFZpZGVvRnJhbWVEZWNvZGVyKAorICAgICAgICAgICAgY29uc3QgQVN0cmluZyAmY29tcG9uZW50TmFtZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmdHJhY2tNZXRhLAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhU291cmNlPiAmc291cmNlKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgc3A8QU1lc3NhZ2U+IG9uR2V0Rm9ybWF0QW5kU2Vla09wdGlvbnMoCisgICAgICAgICAgICBpbnQ2NF90IGZyYW1lVGltZVVzLAorICAgICAgICAgICAgc2l6ZV90IG51bUZyYW1lcywKKyAgICAgICAgICAgIGludCBzZWVrTW9kZSwKKyAgICAgICAgICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucykgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9uRXh0cmFjdFJlY3QoRnJhbWVSZWN0ICpyZWN0KSBvdmVycmlkZSB7CisgICAgICAgIC8vIFJlY3QgZXh0cmFjdGlvbiBmb3Igc2VxdWVuY2VzIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIG5vdy4KKyAgICAgICAgcmV0dXJuIChyZWN0ID09IE5VTEwpID8gT0sgOiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9uSW5wdXRSZWNlaXZlZCgKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZjb2RlY0J1ZmZlciwKKyAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmc2FtcGxlTWV0YSwKKyAgICAgICAgICAgIGJvb2wgZmlyc3RTYW1wbGUsCisgICAgICAgICAgICB1aW50MzJfdCAqZmxhZ3MpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBvbk91dHB1dFJlY2VpdmVkKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJnZpZGVvRnJhbWVCdWZmZXIsCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm91dHB1dEZvcm1hdCwKKyAgICAgICAgICAgIGludDY0X3QgdGltZVVzLAorICAgICAgICAgICAgYm9vbCAqZG9uZSkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgYm9vbCBtSXNBdmNPckhldmM7CisgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSBtU2Vla01vZGU7CisgICAgaW50NjRfdCBtVGFyZ2V0VGltZVVzOworICAgIHNpemVfdCBtTnVtRnJhbWVzOworICAgIHNpemVfdCBtTnVtRnJhbWVzRGVjb2RlZDsKK307CisKK3N0cnVjdCBJbWFnZURlY29kZXIgOiBwdWJsaWMgRnJhbWVEZWNvZGVyIHsKKyAgICBJbWFnZURlY29kZXIoCisgICAgICAgICAgICBjb25zdCBBU3RyaW5nICZjb21wb25lbnROYW1lLAorICAgICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZ0cmFja01ldGEsCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFTb3VyY2U+ICZzb3VyY2UpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCBzcDxBTWVzc2FnZT4gb25HZXRGb3JtYXRBbmRTZWVrT3B0aW9ucygKKyAgICAgICAgICAgIGludDY0X3QgZnJhbWVUaW1lVXMsCisgICAgICAgICAgICBzaXplX3QgbnVtRnJhbWVzLAorICAgICAgICAgICAgaW50IHNlZWtNb2RlLAorICAgICAgICAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zICpvcHRpb25zKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25FeHRyYWN0UmVjdChGcmFtZVJlY3QgKnJlY3QpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBvbklucHV0UmVjZWl2ZWQoCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmY29kZWNCdWZmZXIgX191bnVzZWQsCisgICAgICAgICAgICBNZXRhRGF0YUJhc2UgJnNhbXBsZU1ldGEgX191bnVzZWQsCisgICAgICAgICAgICBib29sIGZpcnN0U2FtcGxlIF9fdW51c2VkLAorICAgICAgICAgICAgdWludDMyX3QgKmZsYWdzIF9fdW51c2VkKSBvdmVycmlkZSB7IHJldHVybiBPSzsgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBvbk91dHB1dFJlY2VpdmVkKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJnZpZGVvRnJhbWVCdWZmZXIsCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm91dHB1dEZvcm1hdCwKKyAgICAgICAgICAgIGludDY0X3QgdGltZVVzLAorICAgICAgICAgICAgYm9vbCAqZG9uZSkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgVmlkZW9GcmFtZSAqbUZyYW1lOworICAgIGludDMyX3QgbVdpZHRoOworICAgIGludDMyX3QgbUhlaWdodDsKKyAgICBpbnQzMl90IG1HcmlkUm93czsKKyAgICBpbnQzMl90IG1HcmlkQ29sczsKKyAgICBpbnQzMl90IG1UaWxlV2lkdGg7CisgICAgaW50MzJfdCBtVGlsZUhlaWdodDsKKyAgICBpbnQzMl90IG1UaWxlc0RlY29kZWQ7CisgICAgaW50MzJfdCBtVGFyZ2V0VGlsZXM7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEZSQU1FX0RFQ09ERVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUEJhc2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUEJhc2UuaAppbmRleCBkMzI1ZTMwLi5hOTI0MTk3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0hUVFBCYXNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9IVFRQQmFzZS5oCkBAIC0xOCw5ICsxOCwxMCBAQAogCiAjZGVmaW5lIEhUVFBfQkFTRV9IXwogCisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0lEMy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9JRDMuaAppbmRleCAxMTY4MmY4Li43YzIzOTFlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0lEMy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSUQzLmgKQEAgLTIyLDcgKzIyLDcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBEYXRhU291cmNlOworY2xhc3MgRGF0YVNvdXJjZUJhc2U7CiBjbGFzcyBTdHJpbmc4OwogCiBzdHJ1Y3QgSUQzIHsKQEAgLTM1LDcgKzM1LDcgQEAKICAgICAgICAgSUQzX1YyXzQsCiAgICAgfTsKIAotICAgIGV4cGxpY2l0IElEMyhjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBib29sIGlnbm9yZVYxID0gZmFsc2UsIG9mZjY0X3Qgb2Zmc2V0ID0gMCk7CisgICAgZXhwbGljaXQgSUQzKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGJvb2wgaWdub3JlVjEgPSBmYWxzZSwgb2ZmNjRfdCBvZmZzZXQgPSAwKTsKICAgICBJRDMoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUsIGJvb2wgaWdub3JlVjEgPSBmYWxzZSk7CiAgICAgfklEMygpOwogCkBAIC04NSw4ICs4NSw4IEBACiAgICAgLy8gb25seSB2YWxpZCBmb3IgSURWMisKICAgICBzaXplX3QgbVJhd1NpemU7CiAKLSAgICBib29sIHBhcnNlVjEoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSk7Ci0gICAgYm9vbCBwYXJzZVYyKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIG9mZjY0X3Qgb2Zmc2V0KTsKKyAgICBib29sIHBhcnNlVjEoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CisgICAgYm9vbCBwYXJzZVYyKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIG9mZjY0X3Qgb2Zmc2V0KTsKICAgICB2b2lkIHJlbW92ZVVuc3luY2hyb25pemF0aW9uKCk7CiAgICAgYm9vbCByZW1vdmVVbnN5bmNocm9uaXphdGlvblYyXzQoYm9vbCBpVHVuZXNIYWNrKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9JdGVtVGFibGUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSXRlbVRhYmxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNmFmNWUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9JdGVtVGFibGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIElURU1fVEFCTEVfSF8KLSNkZWZpbmUgSVRFTV9UQUJMRV9IXwotCi0jaW5jbHVkZSA8c2V0PgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBEYXRhU291cmNlOwotY2xhc3MgTWV0YURhdGE7Ci0KLW5hbWVzcGFjZSBoZWlmIHsKLQotc3RydWN0IEFzc29jaWF0aW9uRW50cnk7Ci1zdHJ1Y3QgSW1hZ2VJdGVtOwotc3RydWN0IEl0ZW1Mb2M7Ci1zdHJ1Y3QgSXRlbUluZm87Ci1zdHJ1Y3QgSXRlbVByb3BlcnR5Owotc3RydWN0IEl0ZW1SZWZlcmVuY2U7Ci0KLS8qCi0gKiBJdGVtVGFibGUga2VlcHMgdHJhY2sgb2YgYWxsIGltYWdlIGl0ZW1zIChpbmNsdWRpbmcgY29kZWQgaW1hZ2VzLCBncmlkcyBhbmQKLSAqIHRpbGVzKSBpbnNpZGUgYSBIRUlGIHN0aWxsIGltYWdlIChJU08vSUVDIEZESVMgMjMwMDgtMTIuMjoyMDE3KEUpKS4KLSAqLwotCi1jbGFzcyBJdGVtVGFibGUgOiBwdWJsaWMgUmVmQmFzZSB7Ci1wdWJsaWM6Ci0gICAgZXhwbGljaXQgSXRlbVRhYmxlKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UpOwotCi0gICAgc3RhdHVzX3QgcGFyc2UodWludDMyX3QgdHlwZSwgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKLQotICAgIGJvb2wgaXNWYWxpZCgpIHsgcmV0dXJuIG1JbWFnZUl0ZW1zVmFsaWQ7IH0KLSAgICBzcDxNZXRhRGF0YT4gZ2V0SW1hZ2VNZXRhKCk7Ci0gICAgdWludDMyX3QgY291bnRJbWFnZXMoKSBjb25zdDsKLSAgICBzdGF0dXNfdCBmaW5kUHJpbWFyeUltYWdlKHVpbnQzMl90ICppbWFnZUluZGV4KTsKLSAgICBzdGF0dXNfdCBmaW5kVGh1bWJuYWlsKHVpbnQzMl90ICp0aHVtYm5haWxJbmRleCk7Ci0gICAgc3RhdHVzX3QgZ2V0SW1hZ2VPZmZzZXRBbmRTaXplKAotICAgICAgICAgICAgdWludDMyX3QgKmltYWdlSW5kZXgsIG9mZjY0X3QgKm9mZnNldCwgc2l6ZV90ICpzaXplKTsKLQotcHJvdGVjdGVkOgotICAgIH5JdGVtVGFibGUoKTsKLQotcHJpdmF0ZToKLSAgICBzcDxEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKLQotICAgIEtleWVkVmVjdG9yPHVpbnQzMl90LCBJdGVtTG9jPiBtSXRlbUxvY3M7Ci0gICAgVmVjdG9yPEl0ZW1JbmZvPiBtSXRlbUluZm9zOwotICAgIFZlY3RvcjxBc3NvY2lhdGlvbkVudHJ5PiBtQXNzb2NpYXRpb25zOwotICAgIFZlY3RvcjxzcDxJdGVtUHJvcGVydHk+ID4gbUl0ZW1Qcm9wZXJ0aWVzOwotICAgIFZlY3RvcjxzcDxJdGVtUmVmZXJlbmNlPiA+IG1JdGVtUmVmZXJlbmNlczsKLQotICAgIHVpbnQzMl90IG1QcmltYXJ5SXRlbUlkOwotICAgIG9mZjY0X3QgbUlkYXRPZmZzZXQ7Ci0gICAgc2l6ZV90IG1JZGF0U2l6ZTsKLQotICAgIHN0ZDo6c2V0PHVpbnQzMl90PiBtUmVxdWlyZWRCb3hlczsKLSAgICBzdGQ6OnNldDx1aW50MzJfdD4gbUJveGVzU2VlbjsKLQotICAgIGJvb2wgbUltYWdlSXRlbXNWYWxpZDsKLSAgICB1aW50MzJfdCBtQ3VycmVudEltYWdlSW5kZXg7Ci0gICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIEltYWdlSXRlbT4gbUl0ZW1JZFRvSW1hZ2VNYXA7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZUlsb2NCb3gob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKLSAgICBzdGF0dXNfdCBwYXJzZUlpbmZCb3gob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKLSAgICBzdGF0dXNfdCBwYXJzZVBpdG1Cb3gob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKLSAgICBzdGF0dXNfdCBwYXJzZUlwcnBCb3gob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKLSAgICBzdGF0dXNfdCBwYXJzZUlkYXRCb3gob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKLSAgICBzdGF0dXNfdCBwYXJzZUlyZWZCb3gob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKLQotICAgIHZvaWQgYXR0YWNoUHJvcGVydHkoY29uc3QgQXNzb2NpYXRpb25FbnRyeSAmYXNzb2NpYXRpb24pOwotICAgIHN0YXR1c190IGJ1aWxkSW1hZ2VJdGVtc0lmUG9zc2libGUodWludDMyX3QgdHlwZSk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhJdGVtVGFibGUpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgaGVpZgotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIElURU1fVEFCTEVfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVAzRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QM0V4dHJhY3Rvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmQwNGYyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVAzRXh0cmFjdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNUDNfRVhUUkFDVE9SX0hfCi0KLSNkZWZpbmUgTVAzX0VYVFJBQ1RPUl9IXwotCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgQU1lc3NhZ2U7Ci1jbGFzcyBEYXRhU291cmNlOwotc3RydWN0IE1QM1NlZWtlcjsKLWNsYXNzIFN0cmluZzg7Ci0KLWNsYXNzIE1QM0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7Ci1wdWJsaWM6Ci0gICAgLy8gRXh0cmFjdG9yIGFzc3VtZXMgb3duZXJzaGlwIG9mICJzb3VyY2UiLgotICAgIE1QM0V4dHJhY3Rvcihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBjb25zdCBzcDxBTWVzc2FnZT4gJm1ldGEpOwotCi0gICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKLSAgICB2aXJ0dWFsIHNwPElNZWRpYVNvdXJjZT4gZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKLSAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRUcmFja01ldGFEYXRhKHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwotCi0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0TWV0YURhdGEoKTsKLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIk1QM0V4dHJhY3RvciI7IH0KLQotcHJpdmF0ZToKLSAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwotCi0gICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7Ci0gICAgb2ZmNjRfdCBtRmlyc3RGcmFtZVBvczsKLSAgICBzcDxNZXRhRGF0YT4gbU1ldGE7Ci0gICAgdWludDMyX3QgbUZpeGVkSGVhZGVyOwotICAgIHNwPE1QM1NlZWtlcj4gbVNlZWtlcjsKLQotICAgIE1QM0V4dHJhY3Rvcihjb25zdCBNUDNFeHRyYWN0b3IgJik7Ci0gICAgTVAzRXh0cmFjdG9yICZvcGVyYXRvcj0oY29uc3QgTVAzRXh0cmFjdG9yICYpOwotfTsKLQotYm9vbCBTbmlmZk1QMygKLSAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlLAotICAgICAgICBzcDxBTWVzc2FnZT4gKm1ldGEpOwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIE1QM19FWFRSQUNUT1JfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVAzU2Vla2VyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QM1NlZWtlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTk1NDJlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVAzU2Vla2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNUDNfU0VFS0VSX0hfCi0KLSNkZWZpbmUgTVAzX1NFRUtFUl9IXwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgTVAzU2Vla2VyIDogcHVibGljIFJlZkJhc2UgewotICAgIE1QM1NlZWtlcigpIHt9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgZ2V0RHVyYXRpb24oaW50NjRfdCAqZHVyYXRpb25VcykgPSAwOwotCi0gICAgLy8gR2l2ZW4gYSByZXF1ZXN0IHNlZWsgdGltZSBpbiAiKnRpbWVVcyIsIGZpbmQgdGhlIGJ5dGUgb2Zmc2V0IGNsb3Nlc3QKLSAgICAvLyB0byB0aGF0IHBvc2l0aW9uIGFuZCByZXR1cm4gaXQgaW4gIipwb3MiLiBVcGRhdGUgIip0aW1lVXMiIHRvIHJlZmxlY3QKLSAgICAvLyB0aGUgYWN0dWFsIHRpbWUgdGhhdCBzZWVrcG9pbnQgcmVwcmVzZW50cy4KLSAgICB2aXJ0dWFsIGJvb2wgZ2V0T2Zmc2V0Rm9yVGltZShpbnQ2NF90ICp0aW1lVXMsIG9mZjY0X3QgKnBvcykgPSAwOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+TVAzU2Vla2VyKCkge30KLQotcHJpdmF0ZToKLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNUDNTZWVrZXIpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBNUDNfU0VFS0VSX0hfCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzJQU0V4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUEVHMlBTRXh0cmFjdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NDcxYjMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUEVHMlBTRXh0cmFjdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNUEVHMl9QU19FWFRSQUNUT1JfSF8KLQotI2RlZmluZSBNUEVHMl9QU19FWFRSQUNUT1JfSF8KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBBQnVmZmVyOwotc3RydWN0IEFNZXNzYWdlOwotc3RydWN0IFRyYWNrOwotY2xhc3MgU3RyaW5nODsKLQotc3RydWN0IE1QRUcyUFNFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgewotICAgIGV4cGxpY2l0IE1QRUcyUFNFeHRyYWN0b3IoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSk7Ci0KLSAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwotICAgIHZpcnR1YWwgc3A8SU1lZGlhU291cmNlPiBnZXRUcmFjayhzaXplX3QgaW5kZXgpOwotICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldFRyYWNrTWV0YURhdGEoc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7Ci0KLSAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRNZXRhRGF0YSgpOwotCi0gICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIGNvbnN0OwotICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiTVBFRzJQU0V4dHJhY3RvciI7IH0KLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfk1QRUcyUFNFeHRyYWN0b3IoKTsKLQotcHJpdmF0ZToKLSAgICBzdHJ1Y3QgVHJhY2s7Ci0gICAgc3RydWN0IFdyYXBwZWRUcmFjazsKLQotICAgIG11dGFibGUgTXV0ZXggbUxvY2s7Ci0gICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7Ci0KLSAgICBvZmY2NF90IG1PZmZzZXQ7Ci0gICAgc3RhdHVzX3QgbUZpbmFsUmVzdWx0OwotICAgIHNwPEFCdWZmZXI+IG1CdWZmZXI7Ci0gICAgS2V5ZWRWZWN0b3I8dW5zaWduZWQsIHNwPFRyYWNrPiA+IG1UcmFja3M7Ci0gICAgYm9vbCBtU2Nhbm5pbmc7Ci0KLSAgICBib29sIG1Qcm9ncmFtU3RyZWFtTWFwVmFsaWQ7Ci0gICAgS2V5ZWRWZWN0b3I8dW5zaWduZWQsIHVuc2lnbmVkPiBtU3RyZWFtVHlwZUJ5RVNJRDsKLQotICAgIHN0YXR1c190IGZlZWRNb3JlKCk7Ci0KLSAgICBzdGF0dXNfdCBkZXF1ZXVlQ2h1bmsoKTsKLSAgICBzc2l6ZV90IGRlcXVldWVQYWNrKCk7Ci0gICAgc3NpemVfdCBkZXF1ZXVlU3lzdGVtSGVhZGVyKCk7Ci0gICAgc3NpemVfdCBkZXF1ZXVlUEVTKCk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNUEVHMlBTRXh0cmFjdG9yKTsKLX07Ci0KLWJvb2wgU25pZmZNUEVHMlBTKAotICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UsCi0gICAgICAgIHNwPEFNZXNzYWdlPiAqKTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBNUEVHMl9QU19FWFRSQUNUT1JfSF8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUEVHMlRTRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUcyVFNFeHRyYWN0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM5M2I1ZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUcyVFNFeHRyYWN0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNUEVHMl9UU19FWFRSQUNUT1JfSF8KLQotI2RlZmluZSBNUEVHMl9UU19FWFRSQUNUT1JfSF8KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+Ci0KLSNpbmNsdWRlICJtcGVnMnRzL0FUU1BhcnNlci5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBBTWVzc2FnZTsKLXN0cnVjdCBBbm90aGVyUGFja2V0U291cmNlOwotc3RydWN0IEFUU1BhcnNlcjsKLWNsYXNzIERhdGFTb3VyY2U7Ci1zdHJ1Y3QgTVBFRzJUU1NvdXJjZTsKLWNsYXNzIFN0cmluZzg7Ci0KLXN0cnVjdCBNUEVHMlRTRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKLSAgICBleHBsaWNpdCBNUEVHMlRTRXh0cmFjdG9yKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UpOwotCi0gICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKLSAgICB2aXJ0dWFsIHNwPElNZWRpYVNvdXJjZT4gZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKLSAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRUcmFja01ldGFEYXRhKHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwotCi0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0TWV0YURhdGEoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWVkaWFDYXMoY29uc3QgSEludGVyZmFjZVRva2VuICZjYXNUb2tlbikgb3ZlcnJpZGU7Ci0KLSAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJNUEVHMlRTRXh0cmFjdG9yIjsgfQotCi1wcml2YXRlOgotICAgIGZyaWVuZCBzdHJ1Y3QgTVBFRzJUU1NvdXJjZTsKLQotICAgIG11dGFibGUgTXV0ZXggbUxvY2s7Ci0KLSAgICBzcDxEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKLQotICAgIHNwPEFUU1BhcnNlcj4gbVBhcnNlcjsKLQotICAgIC8vIFVzZWQgdG8gcmVtZW1iZXIgU3luY0V2ZW50IG9jY3VycmVkIGluIGZlZWRNb3JlKCkgd2hlbiBjYWxsZWQgZnJvbSBpbml0KCksCi0gICAgLy8gYmVjYXVzZSBpbml0KCkgbmVlZHMgdG8gdXBkYXRlIHxtU291cmNlSW1wbHN8IGJlZm9yZSBhZGRpbmcgU3luY1BvaW50LgotICAgIEFUU1BhcnNlcjo6U3luY0V2ZW50IG1MYXN0U3luY0V2ZW50OwotCi0gICAgVmVjdG9yPHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ID4gbVNvdXJjZUltcGxzOwotCi0gICAgVmVjdG9yPEtleWVkVmVjdG9yPGludDY0X3QsIG9mZjY0X3Q+ID4gbVN5bmNQb2ludHM7Ci0gICAgLy8gU3luYyBwb2ludHMgdXNlZCBmb3Igc2Vla2luZyAtLS0gbm9ybWFsbHkgb25lIGZvciB2aWRlbyB0cmFjayBpcyB1c2VkLgotICAgIC8vIElmIG5vIHZpZGVvIHRyYWNrIGlzIHByZXNlbnQsIGF1ZGlvIHRyYWNrIHdpbGwgYmUgdXNlZCBpbnN0ZWFkLgotICAgIEtleWVkVmVjdG9yPGludDY0X3QsIG9mZjY0X3Q+ICptU2Vla1N5bmNQb2ludHM7Ci0KLSAgICBvZmY2NF90IG1PZmZzZXQ7Ci0KLSAgICBzdGF0aWMgYm9vbCBpc1NjcmFtYmxlZEZvcm1hdChjb25zdCBzcDxNZXRhRGF0YT4gJmZvcm1hdCk7Ci0KLSAgICB2b2lkIGluaXQoKTsKLSAgICB2b2lkIGFkZFNvdXJjZShjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmaW1wbCk7Ci0gICAgLy8gVHJ5IHRvIGZlZWQgbW9yZSBkYXRhIGZyb20gc291cmNlIHRvIHBhcnNlci4KLSAgICAvLyB8aXNJbml0fCBtZWFucyB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbnNpZGUgaW5pdCgpLiBUaGlzIGlzIGEgc2lnbmFsIHRvCi0gICAgLy8gc2F2ZSBTeW5jRXZlbnQgc28gdGhhdCBpbml0KCkgY2FuIGFkZCBTeW5jUG9pbnQgYWZ0ZXIgaXQgdXBkYXRlcyB8bVNvdXJjZUltcGxzfC4KLSAgICAvLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgT0sgaWYgZXhwZWN0ZWQgYW1vdW50IG9mIGRhdGEgaXMgZmVkIGZyb20gRGF0YVNvdXJjZSB0bwotICAgIC8vIHBhcnNlciBhbmQgaXMgc3VjY2Vzc2Z1bGx5IHBhcnNlZC4gT3RoZXJ3aXNlLCB2YXJpb3VzIGVycm9yIGNvZGVzIGNvdWxkIGJlCi0gICAgLy8gcmV0dXJuZWQsIGUuZy4sIEVSUk9SX0VORF9PRl9TVFJFQU0sIG9yIG5vIGRhdGEgYXZhaWxhbGJlIGZyb20gRGF0YVNvdXJjZSwgb3IKLSAgICAvLyB0aGUgZGF0YSBoYXMgc3ludGF4IGVycm9yIGR1cmluZyBwYXJzaW5nLCBldGMuCi0gICAgc3RhdHVzX3QgZmVlZE1vcmUoYm9vbCBpc0luaXQgPSBmYWxzZSk7Ci0gICAgc3RhdHVzX3Qgc2VlayhpbnQ2NF90IHNlZWtUaW1lVXMsCi0gICAgICAgICAgICBjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlJiBzZWVrTW9kZSk7Ci0gICAgc3RhdHVzX3QgcXVldWVEaXNjb250aW51aXR5Rm9yU2VlayhpbnQ2NF90IGFjdHVhbFNlZWtUaW1lVXMpOwotICAgIHN0YXR1c190IHNlZWtCZXlvbmQoaW50NjRfdCBzZWVrVGltZVVzKTsKLQotICAgIHN0YXR1c190IGZlZWRVbnRpbEJ1ZmZlckF2YWlsYWJsZShjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmaW1wbCk7Ci0KLSAgICAvLyBBZGQgYSBTeW5Qb2ludCBkZXJpdmVkIGZyb20gfGV2ZW50fC4KLSAgICB2b2lkIGFkZFN5bmNQb2ludF9sKGNvbnN0IEFUU1BhcnNlcjo6U3luY0V2ZW50ICZldmVudCk7Ci0KLSAgICBzdGF0dXNfdCAgZXN0aW1hdGVEdXJhdGlvbnNGcm9tVGltZXNVc0F0RW5kKCk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNUEVHMlRTRXh0cmFjdG9yKTsKLX07Ci0KLWJvb2wgU25pZmZNUEVHMlRTKAotICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UsCi0gICAgICAgIHNwPEFNZXNzYWdlPiAqKTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBNUEVHMl9UU19FWFRSQUNUT1JfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzRFeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzRFeHRyYWN0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlkN2RkZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUc0RXh0cmFjdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTVBFRzRfRVhUUkFDVE9SX0hfCi0KLSNkZWZpbmUgTVBFRzRfRVhUUkFDVE9SX0hfCi0KLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotc3RydWN0IEFNZXNzYWdlOwotY2xhc3MgRGF0YVNvdXJjZTsKLWNsYXNzIFNhbXBsZVRhYmxlOwotY2xhc3MgU3RyaW5nODsKLW5hbWVzcGFjZSBoZWlmIHsKLWNsYXNzIEl0ZW1UYWJsZTsKLX0KLXVzaW5nIGhlaWY6Okl0ZW1UYWJsZTsKLQotc3RydWN0IFNpZHhFbnRyeSB7Ci0gICAgc2l6ZV90IG1TaXplOwotICAgIHVpbnQzMl90IG1EdXJhdGlvblVzOwotfTsKLQotc3RydWN0IFRyZXggewotICAgIHVpbnQzMl90IHRyYWNrX0lEOwotICAgIHVpbnQzMl90IGRlZmF1bHRfc2FtcGxlX2Rlc2NyaXB0aW9uX2luZGV4OwotICAgIHVpbnQzMl90IGRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uOwotICAgIHVpbnQzMl90IGRlZmF1bHRfc2FtcGxlX3NpemU7Ci0gICAgdWludDMyX3QgZGVmYXVsdF9zYW1wbGVfZmxhZ3M7Ci19OwotCi1jbGFzcyBNUEVHNEV4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7Ci1wdWJsaWM6Ci0gICAgLy8gRXh0cmFjdG9yIGFzc3VtZXMgb3duZXJzaGlwIG9mICJzb3VyY2UiLgotICAgIGV4cGxpY2l0IE1QRUc0RXh0cmFjdG9yKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UpOwotCi0gICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKLSAgICB2aXJ0dWFsIHNwPElNZWRpYVNvdXJjZT4gZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKLSAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRUcmFja01ldGFEYXRhKHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwotCi0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0TWV0YURhdGEoKTsKLSAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJNUEVHNEV4dHJhY3RvciI7IH0KLSAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZSgpOwotCi0gICAgLy8gZm9yIERSTQotICAgIHZpcnR1YWwgY2hhciogZ2V0RHJtVHJhY2tJbmZvKHNpemVfdCB0cmFja0lELCBpbnQgKmxlbik7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5NUEVHNEV4dHJhY3RvcigpOwotCi0gICAgdmlydHVhbCB2b2lkIHBvcHVsYXRlTWV0cmljcygpOwotCi1wcml2YXRlOgotCi0gICAgc3RydWN0IFBzc2hJbmZvIHsKLSAgICAgICAgdWludDhfdCB1dWlkWzE2XTsKLSAgICAgICAgdWludDMyX3QgZGF0YWxlbjsKLSAgICAgICAgdWludDhfdCAqZGF0YTsKLSAgICB9OwotICAgIHN0cnVjdCBUcmFjayB7Ci0gICAgICAgIFRyYWNrICpuZXh0OwotICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YTsKLSAgICAgICAgdWludDMyX3QgdGltZXNjYWxlOwotICAgICAgICBzcDxTYW1wbGVUYWJsZT4gc2FtcGxlVGFibGU7Ci0gICAgICAgIGJvb2wgaW5jbHVkZXNfZXhwZW5zaXZlX21ldGFkYXRhOwotICAgICAgICBib29sIHNraXBUcmFjazsKLSAgICB9OwotCi0gICAgVmVjdG9yPFNpZHhFbnRyeT4gbVNpZHhFbnRyaWVzOwotICAgIG9mZjY0X3QgbU1vb2ZPZmZzZXQ7Ci0gICAgYm9vbCBtTW9vZkZvdW5kOwotICAgIGJvb2wgbU1kYXRGb3VuZDsKLQotICAgIFZlY3RvcjxQc3NoSW5mbz4gbVBzc2g7Ci0KLSAgICBWZWN0b3I8VHJleD4gbVRyZXg7Ci0KLSAgICBzcDxEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKLSAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwotICAgIHVpbnQzMl90IG1IZWFkZXJUaW1lc2NhbGU7Ci0gICAgYm9vbCBtSXNRVDsKLSAgICBib29sIG1Jc0hFSUY7Ci0KLSAgICBUcmFjayAqbUZpcnN0VHJhY2ssICptTGFzdFRyYWNrOwotCi0gICAgc3A8TWV0YURhdGE+IG1GaWxlTWV0YURhdGE7Ci0KLSAgICBWZWN0b3I8dWludDMyX3Q+IG1QYXRoOwotICAgIFN0cmluZzggbUxhc3RDb21tZW50TWVhbjsKLSAgICBTdHJpbmc4IG1MYXN0Q29tbWVudE5hbWU7Ci0gICAgU3RyaW5nOCBtTGFzdENvbW1lbnREYXRhOwotCi0gICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIEFTdHJpbmc+IG1NZXRhS2V5TWFwOwotCi0gICAgc3RhdHVzX3QgcmVhZE1ldGFEYXRhKCk7Ci0gICAgc3RhdHVzX3QgcGFyc2VDaHVuayhvZmY2NF90ICpvZmZzZXQsIGludCBkZXB0aCk7Ci0gICAgc3RhdHVzX3QgcGFyc2VJVHVuZXNNZXRhRGF0YShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwotICAgIHN0YXR1c190IHBhcnNlQ29sb3JJbmZvKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7Ci0gICAgc3RhdHVzX3QgcGFyc2UzR1BQTWV0YURhdGEob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplLCBpbnQgZGVwdGgpOwotICAgIHZvaWQgcGFyc2VJRDN2Mk1ldGFEYXRhKG9mZjY0X3Qgb2Zmc2V0KTsKLSAgICBzdGF0dXNfdCBwYXJzZVFUTWV0YUtleShvZmY2NF90IGRhdGFfb2Zmc2V0LCBzaXplX3QgZGF0YV9zaXplKTsKLSAgICBzdGF0dXNfdCBwYXJzZVFUTWV0YVZhbChpbnQzMl90IGtleUlkLCBvZmY2NF90IGRhdGFfb2Zmc2V0LCBzaXplX3QgZGF0YV9zaXplKTsKLQotICAgIHN0YXR1c190IHVwZGF0ZUF1ZGlvVHJhY2tJbmZvRnJvbUVTRFNfTVBFRzRBdWRpbygKLSAgICAgICAgICAgIGNvbnN0IHZvaWQgKmVzZHNfZGF0YSwgc2l6ZV90IGVzZHNfc2l6ZSk7Ci0KLSAgICBzdGF0aWMgc3RhdHVzX3QgdmVyaWZ5VHJhY2soVHJhY2sgKnRyYWNrKTsKLQotICAgIHN0cnVjdCBTSU5GIHsKLSAgICAgICAgU0lORiAqbmV4dDsKLSAgICAgICAgdWludDE2X3QgdHJhY2tJRDsKLSAgICAgICAgdWludDhfdCBJUE1QRGVzY3JpcHRvcklEOwotICAgICAgICBzc2l6ZV90IGxlbjsKLSAgICAgICAgY2hhciAqSVBNUERhdGE7Ci0gICAgfTsKLQotICAgIFNJTkYgKm1GaXJzdFNJTkY7Ci0KLSAgICBib29sIG1Jc0RybTsKLSAgICBzcDxJdGVtVGFibGU+IG1JdGVtVGFibGU7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZURybVNJTkYob2ZmNjRfdCAqb2Zmc2V0LCBvZmY2NF90IGRhdGFfb2Zmc2V0KTsKLQotICAgIHN0YXR1c190IHBhcnNlVHJhY2tIZWFkZXIob2ZmNjRfdCBkYXRhX29mZnNldCwgb2ZmNjRfdCBkYXRhX3NpemUpOwotCi0gICAgc3RhdHVzX3QgcGFyc2VTZWdtZW50SW5kZXgob2ZmNjRfdCBkYXRhX29mZnNldCwgc2l6ZV90IGRhdGFfc2l6ZSk7Ci0KLSAgICBUcmFjayAqZmluZFRyYWNrQnlNaW1lUHJlZml4KGNvbnN0IGNoYXIgKm1pbWVQcmVmaXgpOwotCi0gICAgc3RhdHVzX3QgcGFyc2VBQzNTYW1wbGVFbnRyeShvZmY2NF90IG9mZnNldCk7Ci0gICAgc3RhdHVzX3QgcGFyc2VBQzNTcGVjaWZpY0JveChvZmY2NF90IG9mZnNldCwgdWludDE2X3Qgc2FtcGxlUmF0ZSk7Ci0KLSAgICBNUEVHNEV4dHJhY3Rvcihjb25zdCBNUEVHNEV4dHJhY3RvciAmKTsKLSAgICBNUEVHNEV4dHJhY3RvciAmb3BlcmF0b3I9KGNvbnN0IE1QRUc0RXh0cmFjdG9yICYpOwotfTsKLQotYm9vbCBTbmlmZk1QRUc0KAotICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UsCi0gICAgICAgIHNwPEFNZXNzYWdlPiAqKTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBNUEVHNF9FWFRSQUNUT1JfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTWlkaUV4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NaWRpRXh0cmFjdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZDJkMDguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NaWRpRXh0cmFjdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNSURJX0VYVFJBQ1RPUl9IXwotI2RlZmluZSBNSURJX0VYVFJBQ1RPUl9IXwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWlkaUlvV3JhcHBlci5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDxsaWJzb25pdm94L2Vhcy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIE1pZGlFbmdpbmUgOiBwdWJsaWMgUmVmQmFzZSB7Ci1wdWJsaWM6Ci0gICAgTWlkaUVuZ2luZShjb25zdCBzcDxEYXRhU291cmNlPiAmZGF0YVNvdXJjZSwKLSAgICAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmZmlsZU1ldGFkYXRhLAotICAgICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZ0cmFja01ldGFkYXRhKTsKLSAgICB+TWlkaUVuZ2luZSgpOwotCi0gICAgc3RhdHVzX3QgaW5pdENoZWNrKCk7Ci0KLSAgICBzdGF0dXNfdCBhbGxvY2F0ZUJ1ZmZlcnMoKTsKLSAgICBzdGF0dXNfdCByZWxlYXNlQnVmZmVycygpOwotICAgIHN0YXR1c190IHNlZWtUbyhpbnQ2NF90IHBvc2l0aW9uVXMpOwotICAgIE1lZGlhQnVmZmVyKiByZWFkQnVmZmVyKCk7Ci1wcml2YXRlOgotICAgIHNwPE1pZGlJb1dyYXBwZXI+IG1Jb1dyYXBwZXI7Ci0gICAgTWVkaWFCdWZmZXJHcm91cCAqbUdyb3VwOwotICAgIEVBU19EQVRBX0hBTkRMRSBtRWFzRGF0YTsKLSAgICBFQVNfSEFORExFIG1FYXNIYW5kbGU7Ci0gICAgY29uc3QgU19FQVNfTElCX0NPTkZJRyogbUVhc0NvbmZpZzsKLSAgICBib29sIG1Jc0luaXRpYWxpemVkOwotfTsKLQotY2xhc3MgTWlkaUV4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7Ci0KLXB1YmxpYzoKLSAgICAvLyBFeHRyYWN0b3IgYXNzdW1lcyBvd25lcnNoaXAgb2Ygc291cmNlCi0gICAgZXhwbGljaXQgTWlkaUV4dHJhY3Rvcihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKTsKLQotICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7Ci0gICAgdmlydHVhbCBzcDxJTWVkaWFTb3VyY2U+IGdldFRyYWNrKHNpemVfdCBpbmRleCk7Ci0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0VHJhY2tNZXRhRGF0YShzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKLQotICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldE1ldGFEYXRhKCk7Ci0gICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJNaWRpRXh0cmFjdG9yIjsgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+TWlkaUV4dHJhY3RvcigpOwotCi1wcml2YXRlOgotICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOwotICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7Ci0gICAgc3A8TWV0YURhdGE+IG1GaWxlTWV0YWRhdGE7Ci0KLSAgICAvLyBUaGVyZSBpcyBvbmx5IG9uZSB0cmFjawotICAgIHNwPE1ldGFEYXRhPiBtVHJhY2tNZXRhZGF0YTsKLQotICAgIHNwPE1pZGlFbmdpbmU+IG1FbmdpbmU7Ci0KLSAgICBFQVNfREFUQV9IQU5ETEUgICAgIG1FYXNEYXRhOwotICAgIEVBU19IQU5ETEUgICAgICAgICAgbUVhc0hhbmRsZTsKLSAgICBFQVNfUENNKiAgICAgICAgICAgIG1BdWRpb0J1ZmZlcjsKLSAgICBFQVNfSTMyICAgICAgICAgICAgIG1QbGF5VGltZTsKLSAgICBFQVNfSTMyICAgICAgICAgICAgIG1EdXJhdGlvbjsKLSAgICBFQVNfU1RBVEUgICAgICAgICAgIG1TdGF0ZTsKLSAgICBFQVNfRklMRSAgICAgICAgICAgIG1GaWxlTG9jYXRvcjsKLQotICAgIE1pZGlFeHRyYWN0b3IoY29uc3QgTWlkaUV4dHJhY3RvciAmKTsKLSAgICBNaWRpRXh0cmFjdG9yICZvcGVyYXRvcj0oY29uc3QgTWlkaUV4dHJhY3RvciAmKTsKLQotfTsKLQotYm9vbCBTbmlmZk1pZGkoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsCi0gICAgICAgIGZsb2F0ICpjb25maWRlbmNlLCBzcDxBTWVzc2FnZT4gKik7Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gTUlESV9FWFRSQUNUT1JfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051Q2FjaGVkU291cmNlMi5oCmluZGV4IDI2MzkyODAuLmY0MzlhMWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaApAQCAtMTgsOSArMTgsOSBAQAogCiAjZGVmaW5lIE5VX0NBQ0hFRF9TT1VSQ0VfMl9IXwogCisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyUmVmbGVjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTQzLDcgKzQzLDYgQEAKICAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCk7CiAKICAgICB2aXJ0dWFsIHNwPERlY3J5cHRIYW5kbGU+IERybUluaXRpYWxpemF0aW9uKGNvbnN0IGNoYXIqIG1pbWUpOwotICAgIHZpcnR1YWwgdm9pZCBnZXREcm1JbmZvKHNwPERlY3J5cHRIYW5kbGU+ICZoYW5kbGUsIERybU1hbmFnZXJDbGllbnQgKipjbGllbnQpOwogICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRVcmkoKTsKIAogICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRNSU1FVHlwZSgpIGNvbnN0OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PZ2dFeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT2dnRXh0cmFjdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1YWFmZWQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PZ2dFeHRyYWN0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE9HR19FWFRSQUNUT1JfSF8KLQotI2RlZmluZSBPR0dfRVhUUkFDVE9SX0hfCi0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBBTWVzc2FnZTsKLWNsYXNzIERhdGFTb3VyY2U7Ci1jbGFzcyBTdHJpbmc4OwotCi1zdHJ1Y3QgTXlPZ2dFeHRyYWN0b3I7Ci1zdHJ1Y3QgT2dnU291cmNlOwotCi1zdHJ1Y3QgT2dnRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKLSAgICBleHBsaWNpdCBPZ2dFeHRyYWN0b3IoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSk7Ci0KLSAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwotICAgIHZpcnR1YWwgc3A8SU1lZGlhU291cmNlPiBnZXRUcmFjayhzaXplX3QgaW5kZXgpOwotICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldFRyYWNrTWV0YURhdGEoc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7Ci0KLSAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRNZXRhRGF0YSgpOwotICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiT2dnRXh0cmFjdG9yIjsgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+T2dnRXh0cmFjdG9yKCk7Ci0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIHN0cnVjdCBPZ2dTb3VyY2U7Ci0KLSAgICBzcDxEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKLSAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwotCi0gICAgTXlPZ2dFeHRyYWN0b3IgKm1JbXBsOwotCi0gICAgT2dnRXh0cmFjdG9yKGNvbnN0IE9nZ0V4dHJhY3RvciAmKTsKLSAgICBPZ2dFeHRyYWN0b3IgJm9wZXJhdG9yPShjb25zdCBPZ2dFeHRyYWN0b3IgJik7Ci19OwotCi1ib29sIFNuaWZmT2dnKAotICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UsCi0gICAgICAgIHNwPEFNZXNzYWdlPiAqKTsKLQotdm9pZCBwYXJzZVZvcmJpc0NvbW1lbnQoCi0gICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmZmlsZU1ldGEsIGNvbnN0IGNoYXIgKmNvbW1lbnQsIHNpemVfdCBjb21tZW50TGVuZ3RoKTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBPR0dfRVhUUkFDVE9SX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09teE5vZGVPd25lci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PbXhOb2RlT3duZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRlYzdmNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09teE5vZGVPd25lci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgT01YX05PREVfT1dORVJfSF8KLQotI2RlZmluZSBPTVhfTk9ERV9PV05FUl9IXwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBPTVhOb2RlSW5zdGFuY2U7Ci0KLS8qKgotICogVGhpcyBzdHJ1Y3QgaXMgbmVlZGVkIHRvIHNlcGFyYXRlIE9NWCBmcm9tIE9NWE5vZGVJbnN0YW5jZS4KLSAqCi0gKiBUT0RPOiBUaGlzIG1pZ2h0IG5vdCBiZSBuZWVkZWQgYWZ0ZXIgVHJlYmxlIHRyYW5zaXRpb24gaXMgY29tcGxldGUuCi0gKi8KLXN0cnVjdCBPbXhOb2RlT3duZXIgewotICAgIHZpcnR1YWwgc3RhdHVzX3QgZnJlZU5vZGUoY29uc3Qgc3A8T01YTm9kZUluc3RhbmNlPiAmaW5zdGFuY2UpID0gMDsKLSAgICB2aXJ0dWFsIH5PbXhOb2RlT3duZXIoKSB7fQotfTsKLQotfQotCi0jZW5kaWYgIC8vIE9NWF9OT0RFX09XTkVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NEUExvYWRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TRFBMb2FkZXIuaAppbmRleCAyYzRmNTQzLi5iOTAxYzk3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NEUExvYWRlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU0RQTG9hZGVyLmgKQEAgLTI1LDcgKzI1LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEhUVFBCYXNlOwotc3RydWN0IElNZWRpYUhUVFBTZXJ2aWNlOworc3RydWN0IE1lZGlhSFRUUFNlcnZpY2U7CiAKIHN0cnVjdCBTRFBMb2FkZXIgOiBwdWJsaWMgQUhhbmRsZXIgewogICAgIGVudW0gRmxhZ3MgewpAQCAtMzgsNyArMzgsNyBAQAogICAgIFNEUExvYWRlcigKICAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAogICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCi0gICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlKTsKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSk7CiAKICAgICB2b2lkIGxvYWQoY29uc3QgY2hhciogdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU2FtcGxlVGFibGUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU2FtcGxlVGFibGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIxYTY3NC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NhbXBsZVRhYmxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgU0FNUExFX1RBQkxFX0hfCi0KLSNkZWZpbmUgU0FNUExFX1RBQkxFX0hfCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBEYXRhU291cmNlOwotc3RydWN0IFNhbXBsZUl0ZXJhdG9yOwotCi1jbGFzcyBTYW1wbGVUYWJsZSA6IHB1YmxpYyBSZWZCYXNlIHsKLXB1YmxpYzoKLSAgICBleHBsaWNpdCBTYW1wbGVUYWJsZShjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKTsKLQotICAgIGJvb2wgaXNWYWxpZCgpIGNvbnN0OwotCi0gICAgLy8gdHlwZSBjYW4gYmUgJ3N0Y28nIG9yICdjbzY0Jy4KLSAgICBzdGF0dXNfdCBzZXRDaHVua09mZnNldFBhcmFtcygKLSAgICAgICAgICAgIHVpbnQzMl90IHR5cGUsIG9mZjY0X3QgZGF0YV9vZmZzZXQsIHNpemVfdCBkYXRhX3NpemUpOwotCi0gICAgc3RhdHVzX3Qgc2V0U2FtcGxlVG9DaHVua1BhcmFtcyhvZmY2NF90IGRhdGFfb2Zmc2V0LCBzaXplX3QgZGF0YV9zaXplKTsKLQotICAgIC8vIHR5cGUgY2FuIGJlICdzdHN6JyBvciAnc3R6MicuCi0gICAgc3RhdHVzX3Qgc2V0U2FtcGxlU2l6ZVBhcmFtcygKLSAgICAgICAgICAgIHVpbnQzMl90IHR5cGUsIG9mZjY0X3QgZGF0YV9vZmZzZXQsIHNpemVfdCBkYXRhX3NpemUpOwotCi0gICAgc3RhdHVzX3Qgc2V0VGltZVRvU2FtcGxlUGFyYW1zKG9mZjY0X3QgZGF0YV9vZmZzZXQsIHNpemVfdCBkYXRhX3NpemUpOwotCi0gICAgc3RhdHVzX3Qgc2V0Q29tcG9zaXRpb25UaW1lVG9TYW1wbGVQYXJhbXMoCi0gICAgICAgICAgICBvZmY2NF90IGRhdGFfb2Zmc2V0LCBzaXplX3QgZGF0YV9zaXplKTsKLQotICAgIHN0YXR1c190IHNldFN5bmNTYW1wbGVQYXJhbXMob2ZmNjRfdCBkYXRhX29mZnNldCwgc2l6ZV90IGRhdGFfc2l6ZSk7Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICB1aW50MzJfdCBjb3VudENodW5rT2Zmc2V0cygpIGNvbnN0OwotCi0gICAgdWludDMyX3QgY291bnRTYW1wbGVzKCkgY29uc3Q7Ci0KLSAgICBzdGF0dXNfdCBnZXRNYXhTYW1wbGVTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBnZXRNZXRhRGF0YUZvclNhbXBsZSgKLSAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZUluZGV4LAotICAgICAgICAgICAgb2ZmNjRfdCAqb2Zmc2V0LAotICAgICAgICAgICAgc2l6ZV90ICpzaXplLAotICAgICAgICAgICAgdWludDMyX3QgKmNvbXBvc2l0aW9uVGltZSwKLSAgICAgICAgICAgIGJvb2wgKmlzU3luY1NhbXBsZSA9IE5VTEwsCi0gICAgICAgICAgICB1aW50MzJfdCAqc2FtcGxlRHVyYXRpb24gPSBOVUxMKTsKLQotICAgIGVudW0gewotICAgICAgICBrRmxhZ0JlZm9yZSwKLSAgICAgICAga0ZsYWdBZnRlciwKLSAgICAgICAga0ZsYWdDbG9zZXN0Ci0gICAgfTsKLSAgICBzdGF0dXNfdCBmaW5kU2FtcGxlQXRUaW1lKAotICAgICAgICAgICAgdWludDY0X3QgcmVxX3RpbWUsIHVpbnQ2NF90IHNjYWxlX251bSwgdWludDY0X3Qgc2NhbGVfZGVuLAotICAgICAgICAgICAgdWludDMyX3QgKnNhbXBsZV9pbmRleCwgdWludDMyX3QgZmxhZ3MpOwotCi0gICAgc3RhdHVzX3QgZmluZFN5bmNTYW1wbGVOZWFyKAotICAgICAgICAgICAgdWludDMyX3Qgc3RhcnRfc2FtcGxlX2luZGV4LCB1aW50MzJfdCAqc2FtcGxlX2luZGV4LAotICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpOwotCi0gICAgc3RhdHVzX3QgZmluZFRodW1ibmFpbFNhbXBsZSh1aW50MzJfdCAqc2FtcGxlX2luZGV4KTsKLQotcHJvdGVjdGVkOgotICAgIH5TYW1wbGVUYWJsZSgpOwotCi1wcml2YXRlOgotICAgIHN0cnVjdCBDb21wb3NpdGlvbkRlbHRhTG9va3VwOwotCi0gICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtDaHVua09mZnNldFR5cGUzMjsKLSAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga0NodW5rT2Zmc2V0VHlwZTY0OwotICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrU2FtcGxlU2l6ZVR5cGUzMjsKLSAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga1NhbXBsZVNpemVUeXBlQ29tcGFjdDsKLQotICAgIC8vIExpbWl0IHRoZSB0b3RhbCBzaXplIG9mIGFsbCBpbnRlcm5hbCB0YWJsZXMgdG8gMjAwTWlCLgotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heFRvdGFsU2l6ZSA9IDIwMCAqICgxIDw8IDIwKTsKLQotICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOwotICAgIE11dGV4IG1Mb2NrOwotCi0gICAgb2ZmNjRfdCBtQ2h1bmtPZmZzZXRPZmZzZXQ7Ci0gICAgdWludDMyX3QgbUNodW5rT2Zmc2V0VHlwZTsKLSAgICB1aW50MzJfdCBtTnVtQ2h1bmtPZmZzZXRzOwotCi0gICAgb2ZmNjRfdCBtU2FtcGxlVG9DaHVua09mZnNldDsKLSAgICB1aW50MzJfdCBtTnVtU2FtcGxlVG9DaHVua09mZnNldHM7Ci0KLSAgICBvZmY2NF90IG1TYW1wbGVTaXplT2Zmc2V0OwotICAgIHVpbnQzMl90IG1TYW1wbGVTaXplRmllbGRTaXplOwotICAgIHVpbnQzMl90IG1EZWZhdWx0U2FtcGxlU2l6ZTsKLSAgICB1aW50MzJfdCBtTnVtU2FtcGxlU2l6ZXM7Ci0KLSAgICBib29sIG1IYXNUaW1lVG9TYW1wbGU7Ci0gICAgdWludDMyX3QgbVRpbWVUb1NhbXBsZUNvdW50OwotICAgIHVpbnQzMl90KiBtVGltZVRvU2FtcGxlOwotCi0gICAgc3RydWN0IFNhbXBsZVRpbWVFbnRyeSB7Ci0gICAgICAgIHVpbnQzMl90IG1TYW1wbGVJbmRleDsKLSAgICAgICAgdWludDMyX3QgbUNvbXBvc2l0aW9uVGltZTsKLSAgICB9OwotICAgIFNhbXBsZVRpbWVFbnRyeSAqbVNhbXBsZVRpbWVFbnRyaWVzOwotCi0gICAgaW50MzJfdCAqbUNvbXBvc2l0aW9uVGltZURlbHRhRW50cmllczsKLSAgICBzaXplX3QgbU51bUNvbXBvc2l0aW9uVGltZURlbHRhRW50cmllczsKLSAgICBDb21wb3NpdGlvbkRlbHRhTG9va3VwICptQ29tcG9zaXRpb25EZWx0YUxvb2t1cDsKLQotICAgIG9mZjY0X3QgbVN5bmNTYW1wbGVPZmZzZXQ7Ci0gICAgdWludDMyX3QgbU51bVN5bmNTYW1wbGVzOwotICAgIHVpbnQzMl90ICptU3luY1NhbXBsZXM7Ci0gICAgc2l6ZV90IG1MYXN0U3luY1NhbXBsZUluZGV4OwotCi0gICAgU2FtcGxlSXRlcmF0b3IgKm1TYW1wbGVJdGVyYXRvcjsKLQotICAgIHN0cnVjdCBTYW1wbGVUb0NodW5rRW50cnkgewotICAgICAgICB1aW50MzJfdCBzdGFydENodW5rOwotICAgICAgICB1aW50MzJfdCBzYW1wbGVzUGVyQ2h1bms7Ci0gICAgICAgIHVpbnQzMl90IGNodW5rRGVzYzsKLSAgICB9OwotICAgIFNhbXBsZVRvQ2h1bmtFbnRyeSAqbVNhbXBsZVRvQ2h1bmtFbnRyaWVzOwotCi0gICAgLy8gQXBwcm94aW1hdGUgc2l6ZSBvZiBhbGwgdGFibGVzIGNvbWJpbmVkLgotICAgIHVpbnQ2NF90IG1Ub3RhbFNpemU7Ci0KLSAgICBmcmllbmQgc3RydWN0IFNhbXBsZUl0ZXJhdG9yOwotCi0gICAgLy8gbm9ybWFsbHkgd2UgZG9uJ3Qgcm91bmQKLSAgICBpbmxpbmUgdWludDY0X3QgZ2V0U2FtcGxlVGltZSgKLSAgICAgICAgICAgIHNpemVfdCBzYW1wbGVfaW5kZXgsIHVpbnQ2NF90IHNjYWxlX251bSwgdWludDY0X3Qgc2NhbGVfZGVuKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiAoc2FtcGxlX2luZGV4IDwgKHNpemVfdCltTnVtU2FtcGxlU2l6ZXMgJiYgbVNhbXBsZVRpbWVFbnRyaWVzICE9IE5VTEwKLSAgICAgICAgICAgICAgICAmJiBzY2FsZV9kZW4gIT0gMCkKLSAgICAgICAgICAgICAgICA/IChtU2FtcGxlVGltZUVudHJpZXNbc2FtcGxlX2luZGV4XS5tQ29tcG9zaXRpb25UaW1lICogc2NhbGVfbnVtKSAvIHNjYWxlX2RlbiA6IDA7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZ2V0U2FtcGxlU2l6ZV9sKHVpbnQzMl90IHNhbXBsZV9pbmRleCwgc2l6ZV90ICpzYW1wbGVfc2l6ZSk7Ci0gICAgaW50MzJfdCBnZXRDb21wb3NpdGlvblRpbWVPZmZzZXQodWludDMyX3Qgc2FtcGxlSW5kZXgpOwotCi0gICAgc3RhdGljIGludCBDb21wYXJlSW5jcmVhc2luZ1RpbWUoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopOwotCi0gICAgdm9pZCBidWlsZFNhbXBsZUVudHJpZXNUYWJsZSgpOwotCi0gICAgU2FtcGxlVGFibGUoY29uc3QgU2FtcGxlVGFibGUgJik7Ci0gICAgU2FtcGxlVGFibGUgJm9wZXJhdG9yPShjb25zdCBTYW1wbGVUYWJsZSAmKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gU0FNUExFX1RBQkxFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnR3YXJlUmVuZGVyZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oCmluZGV4IDI1ODUxMWEuLmMyODY1MTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRnJhbWVSZW5kZXJUcmFja2VyLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHN5c3RlbS93aW5kb3cuaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9WaWRlb0FQSS5oPgogCiAjaW5jbHVkZSA8bGlzdD4KIApAQCAtMzgsNyArMzksNyBAQAogCiAgICAgc3RkOjpsaXN0PEZyYW1lUmVuZGVyVHJhY2tlcjo6SW5mbz4gcmVuZGVyKAogICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIGludDY0X3QgbWVkaWFUaW1lVXMsIG5zZWNzX3QgcmVuZGVyVGltZU5zLAotICAgICAgICAgICAgdm9pZCAqcGxhdGZvcm1Qcml2YXRlLCBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCk7CisgICAgICAgICAgICBzaXplX3QgbnVtT3V0cHV0QnVmZmVycywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpOwogICAgIHZvaWQgY2xlYXJUcmFja2VyKCk7CiAKIHByaXZhdGU6CkBAIC01NSwxMiArNTYsMTQgQEAKICAgICBpbnQzMl90IG1Dcm9wV2lkdGgsIG1Dcm9wSGVpZ2h0OwogICAgIGludDMyX3QgbVJvdGF0aW9uRGVncmVlczsKICAgICBhbmRyb2lkX2RhdGFzcGFjZSBtRGF0YVNwYWNlOworICAgIEhEUlN0YXRpY0luZm8gbUhEUlN0YXRpY0luZm87CiAgICAgRnJhbWVSZW5kZXJUcmFja2VyIG1SZW5kZXJUcmFja2VyOwogCisgICAgdm9pZCByZXNldEZvcm1hdElmQ2hhbmdlZCgKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LCBzaXplX3QgbnVtT3V0cHV0QnVmZmVycyk7CisKICAgICBTb2Z0d2FyZVJlbmRlcmVyKGNvbnN0IFNvZnR3YXJlUmVuZGVyZXIgJik7CiAgICAgU29mdHdhcmVSZW5kZXJlciAmb3BlcmF0b3I9KGNvbnN0IFNvZnR3YXJlUmVuZGVyZXIgJik7Ci0KLSAgICB2b2lkIHJlc2V0Rm9ybWF0SWZDaGFuZ2VkKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KTsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oCmluZGV4IDI3N2ViM2UuLmY3OGUxMjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oCkBAIC0yNyw4ICsyNywxMCBAQAogCiBjbGFzcyBEYXRhU291cmNlOwogY2xhc3MgTWVkaWFFeHRyYWN0b3I7CitzdHJ1Y3QgSW1hZ2VEZWNvZGVyOworc3RydWN0IEZyYW1lUmVjdDsKIAotc3RydWN0IFN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIgOiBwdWJsaWMgTWVkaWFNZXRhZGF0YVJldHJpZXZlckludGVyZmFjZSB7CitzdHJ1Y3QgU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlciA6IHB1YmxpYyBNZWRpYU1ldGFkYXRhUmV0cmlldmVyQmFzZSB7CiAgICAgU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcigpOwogICAgIHZpcnR1YWwgflN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIoKTsKIApAQCAtNDAsNyArNDIsMTYgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxEYXRhU291cmNlPiYgc291cmNlLCBjb25zdCBjaGFyICptaW1lKTsKIAotICAgIHZpcnR1YWwgVmlkZW9GcmFtZSAqZ2V0RnJhbWVBdFRpbWUoaW50NjRfdCB0aW1lVXMsIGludCBvcHRpb24sIGludCBjb2xvckZvcm1hdCwgYm9vbCBtZXRhT25seSk7CisgICAgdmlydHVhbCBzcDxJTWVtb3J5PiBnZXRGcmFtZUF0VGltZSgKKyAgICAgICAgICAgIGludDY0X3QgdGltZVVzLCBpbnQgb3B0aW9uLCBpbnQgY29sb3JGb3JtYXQsIGJvb2wgbWV0YU9ubHkpOworICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gZ2V0SW1hZ2VBdEluZGV4KAorICAgICAgICAgICAgaW50IGluZGV4LCBpbnQgY29sb3JGb3JtYXQsIGJvb2wgbWV0YU9ubHksIGJvb2wgdGh1bWJuYWlsKTsKKyAgICB2aXJ0dWFsIHNwPElNZW1vcnk+IGdldEltYWdlUmVjdEF0SW5kZXgoCisgICAgICAgICAgICBpbnQgaW5kZXgsIGludCBjb2xvckZvcm1hdCwgaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZUF0SW5kZXgoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzcDxJTWVtb3J5PiA+KiBmcmFtZXMsCisgICAgICAgICAgICBpbnQgZnJhbWVJbmRleCwgaW50IG51bUZyYW1lcywgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5KTsKKwogICAgIHZpcnR1YWwgTWVkaWFBbGJ1bUFydCAqZXh0cmFjdEFsYnVtQXJ0KCk7CiAgICAgdmlydHVhbCBjb25zdCBjaGFyICpleHRyYWN0TWV0YWRhdGEoaW50IGtleUNvZGUpOwogCkBAIC01MiwxMCArNjMsMTggQEAKICAgICBLZXllZFZlY3RvcjxpbnQsIFN0cmluZzg+IG1NZXRhRGF0YTsKICAgICBNZWRpYUFsYnVtQXJ0ICptQWxidW1BcnQ7CiAKKyAgICBzcDxJbWFnZURlY29kZXI+IG1JbWFnZURlY29kZXI7CisgICAgaW50IG1MYXN0SW1hZ2VJbmRleDsKICAgICB2b2lkIHBhcnNlTWV0YURhdGEoKTsKICAgICAvLyBEZWxldGUgYWxidW0gYXJ0IGFuZCBjbGVhciBtZXRhZGF0YS4KICAgICB2b2lkIGNsZWFyTWV0YWRhdGEoKTsKIAorICAgIHN0YXR1c190IGdldEZyYW1lSW50ZXJuYWwoCisgICAgICAgICAgICBpbnQ2NF90IHRpbWVVcywgaW50IG51bUZyYW1lcywgaW50IG9wdGlvbiwgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5LAorICAgICAgICAgICAgc3A8SU1lbW9yeT4qIG91dEZyYW1lLCBzdGQ6OnZlY3RvcjxzcDxJTWVtb3J5PiA+KiBvdXRGcmFtZXMpOworICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gZ2V0SW1hZ2VJbnRlcm5hbCgKKyAgICAgICAgICAgIGludCBpbmRleCwgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5LCBib29sIHRodW1ibmFpbCwgRnJhbWVSZWN0KiByZWN0KTsKKwogICAgIFN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIoY29uc3QgU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlciAmKTsKIAogICAgIFN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIgJm9wZXJhdG9yPSgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvVGhyb3R0bGVkU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1Rocm90dGxlZFNvdXJjZS5oCmluZGV4IDY3MzI2OGIuLjcxZTYyZjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvVGhyb3R0bGVkU291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9UaHJvdHRsZWRTb3VyY2UuaApAQCAtMTgsNyArMTgsNyBAQAogCiAjZGVmaW5lIFRIUk9UVExFRF9TT1VSQ0VfSF8KIAotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC01OCwxMCArNTgsNiBAQAogICAgICAgICByZXR1cm4gbVNvdXJjZS0+RHJtSW5pdGlhbGl6YXRpb24obWltZSk7CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lkIGdldERybUluZm8oc3A8RGVjcnlwdEhhbmRsZT4gJmhhbmRsZSwgRHJtTWFuYWdlckNsaWVudCAqKmNsaWVudCkgewotICAgICAgICBtU291cmNlLT5nZXREcm1JbmZvKGhhbmRsZSwgY2xpZW50KTsKLSAgICB9OwotCiAgICAgdmlydHVhbCBTdHJpbmc4IGdldE1JTUVUeXBlKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbVNvdXJjZS0+Z2V0TUlNRVR5cGUoKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1ZCUklTZWVrZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvVkJSSVNlZWtlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTdkNTcxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvVkJSSVNlZWtlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVkJSSV9TRUVLRVJfSF8KLQotI2RlZmluZSBWQlJJX1NFRUtFUl9IXwotCi0jaW5jbHVkZSAiaW5jbHVkZS9NUDNTZWVrZXIuaCIKLQotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIERhdGFTb3VyY2U7Ci0KLXN0cnVjdCBWQlJJU2Vla2VyIDogcHVibGljIE1QM1NlZWtlciB7Ci0gICAgc3RhdGljIHNwPFZCUklTZWVrZXI+IENyZWF0ZUZyb21Tb3VyY2UoCi0gICAgICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBvZmY2NF90IHBvc3RfaWQzX3Bvcyk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgZ2V0RHVyYXRpb24oaW50NjRfdCAqZHVyYXRpb25Vcyk7Ci0gICAgdmlydHVhbCBib29sIGdldE9mZnNldEZvclRpbWUoaW50NjRfdCAqdGltZVVzLCBvZmY2NF90ICpwb3MpOwotCi1wcml2YXRlOgotICAgIG9mZjY0X3QgbUJhc2VQb3M7Ci0gICAgaW50NjRfdCBtRHVyYXRpb25VczsKLSAgICBWZWN0b3I8dWludDMyX3Q+IG1TZWdtZW50czsKLQotICAgIFZCUklTZWVrZXIoKTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFZCUklTZWVrZXIpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBWQlJJX1NFRUtFUl9IXwotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvV0FWRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1dBVkV4dHJhY3Rvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmFkNDQxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvV0FWRXh0cmFjdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBXQVZfRVhUUkFDVE9SX0hfCi0KLSNkZWZpbmUgV0FWX0VYVFJBQ1RPUl9IXwotCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgQU1lc3NhZ2U7Ci1jbGFzcyBEYXRhU291cmNlOwotY2xhc3MgU3RyaW5nODsKLQotY2xhc3MgV0FWRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKLXB1YmxpYzoKLSAgICAvLyBFeHRyYWN0b3IgYXNzdW1lcyBvd25lcnNoaXAgb2YgInNvdXJjZSIuCi0gICAgZXhwbGljaXQgV0FWRXh0cmFjdG9yKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UpOwotCi0gICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKLSAgICB2aXJ0dWFsIHNwPElNZWRpYVNvdXJjZT4gZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKLSAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRUcmFja01ldGFEYXRhKHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwotCi0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0TWV0YURhdGEoKTsKLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIldBVkV4dHJhY3RvciI7IH0KLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfldBVkV4dHJhY3RvcigpOwotCi1wcml2YXRlOgotICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOwotICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7Ci0gICAgYm9vbCBtVmFsaWRGb3JtYXQ7Ci0gICAgdWludDE2X3QgbVdhdmVGb3JtYXQ7Ci0gICAgdWludDE2X3QgbU51bUNoYW5uZWxzOwotICAgIHVpbnQzMl90IG1DaGFubmVsTWFzazsKLSAgICB1aW50MzJfdCBtU2FtcGxlUmF0ZTsKLSAgICB1aW50MTZfdCBtQml0c1BlclNhbXBsZTsKLSAgICBvZmY2NF90IG1EYXRhT2Zmc2V0OwotICAgIHNpemVfdCBtRGF0YVNpemU7Ci0gICAgc3A8TWV0YURhdGE+IG1UcmFja01ldGE7Ci0KLSAgICBzdGF0dXNfdCBpbml0KCk7Ci0KLSAgICBXQVZFeHRyYWN0b3IoY29uc3QgV0FWRXh0cmFjdG9yICYpOwotICAgIFdBVkV4dHJhY3RvciAmb3BlcmF0b3I9KGNvbnN0IFdBVkV4dHJhY3RvciAmKTsKLX07Ci0KLWJvb2wgU25pZmZXQVYoCi0gICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSwKLSAgICAgICAgc3A8QU1lc3NhZ2U+ICopOwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIFdBVl9FWFRSQUNUT1JfSF8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9YSU5HU2Vla2VyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1hJTkdTZWVrZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NlMDRmMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1hJTkdTZWVrZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFhJTkdfU0VFS0VSX0hfCi0KLSNkZWZpbmUgWElOR19TRUVLRVJfSF8KLQotI2luY2x1ZGUgImluY2x1ZGUvTVAzU2Vla2VyLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRGF0YVNvdXJjZTsKLQotc3RydWN0IFhJTkdTZWVrZXIgOiBwdWJsaWMgTVAzU2Vla2VyIHsKLSAgICBzdGF0aWMgc3A8WElOR1NlZWtlcj4gQ3JlYXRlRnJvbVNvdXJjZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIG9mZjY0X3QgZmlyc3RfZnJhbWVfcG9zKTsKLQotICAgIHZpcnR1YWwgYm9vbCBnZXREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzKTsKLSAgICB2aXJ0dWFsIGJvb2wgZ2V0T2Zmc2V0Rm9yVGltZShpbnQ2NF90ICp0aW1lVXMsIG9mZjY0X3QgKnBvcyk7Ci0KLSAgICB2aXJ0dWFsIGludDMyX3QgZ2V0RW5jb2RlckRlbGF5KCk7Ci0gICAgdmlydHVhbCBpbnQzMl90IGdldEVuY29kZXJQYWRkaW5nKCk7Ci0KLXByaXZhdGU6Ci0gICAgaW50NjRfdCBtRmlyc3RGcmFtZVBvczsKLSAgICBpbnQ2NF90IG1EdXJhdGlvblVzOwotICAgIGludDMyX3QgbVNpemVCeXRlczsKLSAgICBpbnQzMl90IG1FbmNvZGVyRGVsYXk7Ci0gICAgaW50MzJfdCBtRW5jb2RlclBhZGRpbmc7Ci0KLSAgICAvLyBUT0MgZW50cmllcyBpbiBYSU5HIGhlYWRlci4gU2tpcCB0aGUgZmlyc3Qgb25lIHNpbmNlIGl0J3MgYWx3YXlzIDAuCi0gICAgdW5zaWduZWQgY2hhciBtVE9DWzk5XTsKLSAgICBib29sIG1UT0NWYWxpZDsKLQotICAgIFhJTkdTZWVrZXIoKTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFhJTkdTZWVrZXIpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBYSU5HX1NFRUtFUl9IXwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL2F2Y191dGlscy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9hdmNfdXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA1OTA2YS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL2F2Y191dGlscy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFWQ19VVElMU19IXwotCi0jZGVmaW5lIEFWQ19VVElMU19IXwotCi0jaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIEFCaXRSZWFkZXI7Ci0KLWVudW0gewotICAgIGtBVkNQcm9maWxlQmFzZWxpbmUgICAgICA9IDB4NDIsCi0gICAga0FWQ1Byb2ZpbGVNYWluICAgICAgICAgID0gMHg0ZCwKLSAgICBrQVZDUHJvZmlsZUV4dGVuZGVkICAgICAgPSAweDU4LAotICAgIGtBVkNQcm9maWxlSGlnaCAgICAgICAgICA9IDB4NjQsCi0gICAga0FWQ1Byb2ZpbGVIaWdoMTAgICAgICAgID0gMHg2ZSwKLSAgICBrQVZDUHJvZmlsZUhpZ2g0MjIgICAgICAgPSAweDdhLAotICAgIGtBVkNQcm9maWxlSGlnaDQ0NCAgICAgICA9IDB4ZjQsCi0gICAga0FWQ1Byb2ZpbGVDQVZMQzQ0NEludHJhID0gMHgyYwotfTsKLQotc3RydWN0IE5BTFBvc2l0aW9uIHsKLSAgICB1aW50MzJfdCBuYWxPZmZzZXQ7Ci0gICAgdWludDMyX3QgbmFsU2l6ZTsKLX07Ci0KLS8vIE9wdGlvbmFsbHkgcmV0dXJucyBzYW1wbGUgYXNwZWN0IHJhdGlvIGFzIHdlbGwuCi12b2lkIEZpbmRBVkNEaW1lbnNpb25zKAotICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmc2VxUGFyYW1TZXQsCi0gICAgICAgIGludDMyX3QgKndpZHRoLCBpbnQzMl90ICpoZWlnaHQsCi0gICAgICAgIGludDMyX3QgKnNhcldpZHRoID0gTlVMTCwgaW50MzJfdCAqc2FySGVpZ2h0ID0gTlVMTCk7Ci0KLS8vIEdldHMgYW5kIHJldHVybnMgYW4gdW5zaWduZWQgZXhwLWdvbG9tYiAodWUpIHZhbHVlIGZyb20gYSBiaXQgcmVhZGVyIHxicnwuIEFib3J0cyBpZiB0aGUgdmFsdWUKLS8vIGlzIG1vcmUgdGhhbiA2NCBiaXRzIGxvbmcgKD49MHhGRkZGICghKSkgb3IgdGhlIGJpdCByZWFkZXIgb3ZlcmZsb3dzLgotdW5zaWduZWQgcGFyc2VVRShBQml0UmVhZGVyICpicik7Ci0KLS8vIEdldHMgYW5kIHJldHVybnMgYSBzaWduZWQgZXhwLWdvbG9tYiAoc2UpIHZhbHVlIGZyb20gYSBiaXQgcmVhZGVyIHxicnwuIEFib3J0cyBpZiB0aGUgdmFsdWUgaXMKLS8vIG1vcmUgdGhhbiA2NCBiaXRzIGxvbmcgKD4weDdGRkYgfHwgPC0weDdGRkYgKCEpKSBvciB0aGUgYml0IHJlYWRlciBvdmVyZmxvd3MuCi1zaWduZWQgcGFyc2VTRShBQml0UmVhZGVyICpicik7Ci0KLS8vIEdldHMgYW4gdW5zaWduZWQgZXhwLWdvbG9tYiAodWUpIHZhbHVlIGZyb20gYSBiaXQgcmVhZGVyIHxicnwsIGFuZCByZXR1cm5zIGl0IGlmIGl0IHdhcwotLy8gc3VjY2Vzc2Z1bC4gUmV0dXJucyB8ZmFsbGJhY2t8IGlmIGl0IHdhcyB1bnN1Y2Nlc3NmdWwuIE5vdGU6IGlmIHRoZSB2YWx1ZSB3YXMgbG9uZ2VyIHRoYXQgNjQKLS8vIGJpdHMsIGl0IHJlYWRzIHBhc3QgdGhlIHZhbHVlIGFuZCBzdGlsbCByZXR1cm5zIHxmYWxsYmFja3wuCi11bnNpZ25lZCBwYXJzZVVFV2l0aEZhbGxiYWNrKEFCaXRSZWFkZXIgKmJyLCB1bnNpZ25lZCBmYWxsYmFjayk7Ci0KLS8vIEdldHMgYSBzaWduZWQgZXhwLWdvbG9tYiAoc2UpIHZhbHVlIGZyb20gYSBiaXQgcmVhZGVyIHxicnwsIGFuZCByZXR1cm5zIGl0IGlmIGl0IHdhcyBzdWNjZXNzZnVsLgotLy8gUmV0dXJucyB8ZmFsbGJhY2t8IGlmIGl0IHdhcyB1bnN1Y2Nlc3NmdWwuIE5vdGU6IGlmIHRoZSB2YWx1ZSB3YXMgbG9uZ2VyIHRoYXQgNjQgYml0cywgaXQgcmVhZHMKLS8vIHBhc3QgdGhlIHZhbHVlIGFuZCBzdGlsbCByZXR1cm5zIHxmYWxsYmFja3wuCi1zaWduZWQgcGFyc2VTRVdpdGhGYWxsYmFjayhBQml0UmVhZGVyICpiciwgc2lnbmVkIGZhbGxiYWNrKTsKLQotLy8gU2tpcHMgYW4gdW5zaWduZWQgZXhwLWdvbG9tYiAodWUpIHZhbHVlIGZyb20gYml0IHJlYWRlciB8YnJ8LgotaW5saW5lIHZvaWQgc2tpcFVFKEFCaXRSZWFkZXIgKmJyKSB7Ci0gICAgKHZvaWQpcGFyc2VVRVdpdGhGYWxsYmFjayhiciwgMFUpOwotfQotCi0vLyBTa2lwcyBhIHNpZ25lZCBleHAtZ29sb21iIChzZSkgdmFsdWUgZnJvbSBiaXQgcmVhZGVyIHxicnwuCi1pbmxpbmUgdm9pZCBza2lwU0UoQUJpdFJlYWRlciAqYnIpIHsKLSAgICAodm9pZClwYXJzZVNFV2l0aEZhbGxiYWNrKGJyLCAwKTsKLX0KLQotc3RhdHVzX3QgZ2V0TmV4dE5BTFVuaXQoCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKipfZGF0YSwgc2l6ZV90ICpfc2l6ZSwKLSAgICAgICAgY29uc3QgdWludDhfdCAqKm5hbFN0YXJ0LCBzaXplX3QgKm5hbFNpemUsCi0gICAgICAgIGJvb2wgc3RhcnRDb2RlRm9sbG93cyA9IGZhbHNlKTsKLQotY2xhc3MgTWV0YURhdGE7Ci1zcDxNZXRhRGF0YT4gTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KTsKLQotYm9vbCBJc0lEUihjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCk7Ci1ib29sIElzSURSKGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZhY2Nlc3NVbml0KTsKLWJvb2wgSXNBVkNSZWZlcmVuY2VGcmFtZShjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCk7Ci11aW50MzJfdCBGaW5kQVZDTGF5ZXJJZChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0KLWNvbnN0IGNoYXIgKkFWQ1Byb2ZpbGVUb1N0cmluZyh1aW50OF90IHByb2ZpbGUpOwotCi1zcDxNZXRhRGF0YT4gTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKAotICAgICAgICB1bnNpZ25lZCBwcm9maWxlLCB1bnNpZ25lZCBzYW1wbGluZ19mcmVxX2luZGV4LAotICAgICAgICB1bnNpZ25lZCBjaGFubmVsX2NvbmZpZ3VyYXRpb24pOwotCi0vLyBHaXZlbiBhbiBNUEVHNCB2aWRlbyBWT0wtaGVhZGVyIGNodW5rIChzdGFydGluZyB3aXRoIDB4MDAgMHgwMCAweDAxIDB4Mj8pCi0vLyBwYXJzZSBpdCBhbmQgZmlsbCBpbiBkaW1lbnNpb25zLCByZXR1cm5zIHRydWUgaWZmIHN1Y2Nlc3NmdWwuCi1ib29sIEV4dHJhY3REaW1lbnNpb25zRnJvbVZPTEhlYWRlcigKLSAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUsIGludDMyX3QgKndpZHRoLCBpbnQzMl90ICpoZWlnaHQpOwotCi1ib29sIEdldE1QRUdBdWRpb0ZyYW1lU2l6ZSgKLSAgICAgICAgdWludDMyX3QgaGVhZGVyLCBzaXplX3QgKmZyYW1lX3NpemUsCi0gICAgICAgIGludCAqb3V0X3NhbXBsaW5nX3JhdGUgPSBOVUxMLCBpbnQgKm91dF9jaGFubmVscyA9IE5VTEwsCi0gICAgICAgIGludCAqb3V0X2JpdHJhdGUgPSBOVUxMLCBpbnQgKm91dF9udW1fc2FtcGxlcyA9IE5VTEwpOwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIEFWQ19VVElMU19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQUNXcml0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUFDV3JpdGVyLmgKaW5kZXggYTFmNjNkNy4uN2M2M2RkZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQUNXcml0ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FBQ1dyaXRlci5oCkBAIC0yNCwxNCArMjQsMTMgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IE1lZGlhU291cmNlOwotY2xhc3MgTWV0YURhdGE7CiAKIHN0cnVjdCBBQUNXcml0ZXIgOiBwdWJsaWMgTWVkaWFXcml0ZXIgewogICAgIEFBQ1dyaXRlcihpbnQgZmQpOwogCiAgICAgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFNvdXJjZShjb25zdCBzcDxJTWVkaWFTb3VyY2U+ICZzb3VyY2UpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKTsKICAgICB2aXJ0dWFsIGJvb2wgcmVhY2hlZEVPUygpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpIHsgcmV0dXJuIHJlc2V0KCk7IH0KQEAgLTQ4LDcgKzQ3LDcgQEAKIAogICAgIGludCAgIG1GZDsKICAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwotICAgIHNwPElNZWRpYVNvdXJjZT4gbVNvdXJjZTsKKyAgICBzcDxNZWRpYVNvdXJjZT4gbVNvdXJjZTsKICAgICBib29sIG1TdGFydGVkOwogICAgIHZvbGF0aWxlIGJvb2wgbVBhdXNlZDsKICAgICB2b2xhdGlsZSBib29sIG1SZXN1bWVkOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmgKaW5kZXggNDI0MjQ2ZC4uOTdkMTVhNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oCkBAIC05NSwxMSArOTUsNiBAQAogCiAgICAgc3RhdGljIHN0YXR1c190IGdldE9NWENoYW5uZWxNYXBwaW5nKHNpemVfdCBudW1DaGFubmVscywgT01YX0FVRElPX0NIQU5ORUxUWVBFIG1hcFtdKTsKIAotICAgIC8vIFNhdmUgdGhlIGZsYWcuCi0gICAgdm9pZCBzZXRUcmVibGVGbGFnKGJvb2wgdHJlYmxlRmxhZyk7Ci0gICAgLy8gUmV0dXJuIHRoZSBzYXZlZCBmbGFnLgotICAgIGJvb2wgZ2V0VHJlYmxlRmxhZygpIGNvbnN0OwotCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QUNvZGVjKCk7CiAKQEAgLTIzMywxNSArMjI4LDE0IEBACiAgICAgc3A8SU9NWD4gbU9NWDsKICAgICBzcDxJT01YTm9kZT4gbU9NWE5vZGU7CiAgICAgaW50MzJfdCBtTm9kZUdlbmVyYXRpb247Ci0gICAgYm9vbCBtVHJlYmxlRmxhZzsKICAgICBzcDxUQWxsb2NhdG9yPiBtQWxsb2NhdG9yWzJdOwotICAgIHNwPE1lbW9yeURlYWxlcj4gbURlYWxlclsyXTsKIAogICAgIGJvb2wgbVVzaW5nTmF0aXZlV2luZG93OwogICAgIHNwPEFOYXRpdmVXaW5kb3c+IG1OYXRpdmVXaW5kb3c7CiAgICAgaW50IG1OYXRpdmVXaW5kb3dVc2FnZUJpdHM7CiAgICAgYW5kcm9pZF9uYXRpdmVfcmVjdF90IG1MYXN0TmF0aXZlV2luZG93Q3JvcDsKICAgICBpbnQzMl90IG1MYXN0TmF0aXZlV2luZG93RGF0YVNwYWNlOworICAgIEhEUlN0YXRpY0luZm8gbUxhc3RIRFJTdGF0aWNJbmZvOwogICAgIHNwPEFNZXNzYWdlPiBtQ29uZmlnRm9ybWF0OwogICAgIHNwPEFNZXNzYWdlPiBtSW5wdXRGb3JtYXQ7CiAgICAgc3A8QU1lc3NhZ2U+IG1PdXRwdXRGb3JtYXQ7CkBAIC0yNTksNiArMjUzLDcgQEAKIAogICAgIHNwPEFNZXNzYWdlPiBtTGFzdE91dHB1dEZvcm1hdDsKICAgICBib29sIG1Jc1ZpZGVvOworICAgIGJvb2wgbUlzSW1hZ2U7CiAgICAgYm9vbCBtSXNFbmNvZGVyOwogICAgIGJvb2wgbUZhdGFsRXJyb3I7CiAgICAgYm9vbCBtU2h1dGRvd25JblByb2dyZXNzOwpAQCAtNDUxLDYgKzQ0Niw3IEBACiAgICAgICAgIGludDMyX3QgaGVhdnlDb21wcmVzc2lvbjsKICAgICAgICAgaW50MzJfdCB0YXJnZXRSZWZMZXZlbDsKICAgICAgICAgaW50MzJfdCBlbmNvZGVkVGFyZ2V0TGV2ZWw7CisgICAgICAgIGludDMyX3QgZWZmZWN0VHlwZTsKICAgICB9IGRyY1BhcmFtc190OwogCiAgICAgc3RhdHVzX3Qgc2V0dXBBQUNDb2RlYygKQEAgLTQ5NSwxMyArNDkxLDE1IEBACiAgICAgc3RhdHVzX3Qgc2V0dXBNUEVHNEVuY29kZXJQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKICAgICBzdGF0dXNfdCBzZXR1cEgyNjNFbmNvZGVyUGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAgICAgc3RhdHVzX3Qgc2V0dXBBVkNFbmNvZGVyUGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7Ci0gICAgc3RhdHVzX3Qgc2V0dXBIRVZDRW5jb2RlclBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHN0YXR1c190IHNldHVwSEVWQ0VuY29kZXJQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBzcDxBTWVzc2FnZT4gJm91dHB1dEZvcm1hdCk7CiAgICAgc3RhdHVzX3Qgc2V0dXBWUFhFbmNvZGVyUGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQpOwogCi0gICAgc3RhdHVzX3QgdmVyaWZ5U3VwcG9ydEZvclByb2ZpbGVBbmRMZXZlbChpbnQzMl90IHByb2ZpbGUsIGludDMyX3QgbGV2ZWwpOworICAgIHN0YXR1c190IHZlcmlmeVN1cHBvcnRGb3JQcm9maWxlQW5kTGV2ZWwoCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgaW50MzJfdCBwcm9maWxlLCBpbnQzMl90IGxldmVsKTsKIAorICAgIHN0YXR1c190IGNvbmZpZ3VyZUltYWdlR3JpZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQpOwogICAgIHN0YXR1c190IGNvbmZpZ3VyZUJpdHJhdGUoCi0gICAgICAgICAgICBpbnQzMl90IGJpdHJhdGUsIE9NWF9WSURFT19DT05UUk9MUkFURVRZUEUgYml0cmF0ZU1vZGUpOworICAgICAgICAgICAgT01YX1ZJREVPX0NPTlRST0xSQVRFVFlQRSBiaXRyYXRlTW9kZSwgaW50MzJfdCBiaXRyYXRlLCBpbnQzMl90IHF1YWxpdHkgPSAwKTsKICAgICB2b2lkIGNvbmZpZ3VyZUVuY29kZXJMYXRlbmN5KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKIAogICAgIHN0YXR1c190IHNldHVwRXJyb3JDb3JyZWN0aW9uUGFyYW1ldGVycygpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BTVJXcml0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQU1SV3JpdGVyLmgKaW5kZXggZmJiZGYyZS4uMmVhMmY3OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BTVJXcml0ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FNUldyaXRlci5oCkBAIC0yMCwyMCArMjAsMTcgQEAKIAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAKLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVdyaXRlci5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBNZXRhRGF0YTsKLQogc3RydWN0IEFNUldyaXRlciA6IHB1YmxpYyBNZWRpYVdyaXRlciB7CiAgICAgQU1SV3JpdGVyKGludCBmZCk7CiAKICAgICBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU291cmNlKGNvbnN0IHNwPElNZWRpYVNvdXJjZT4gJnNvdXJjZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpOwogICAgIHZpcnR1YWwgYm9vbCByZWFjaGVkRU9TKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zID0gTlVMTCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCkgeyByZXR1cm4gcmVzZXQoKTsgfQpAQCAtNDUsNyArNDIsNyBAQAogcHJpdmF0ZToKICAgICBpbnQgICBtRmQ7CiAgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKLSAgICBzcDxJTWVkaWFTb3VyY2U+IG1Tb3VyY2U7CisgICAgc3A8TWVkaWFTb3VyY2U+IG1Tb3VyY2U7CiAgICAgYm9vbCBtU3RhcnRlZDsKICAgICB2b2xhdGlsZSBib29sIG1QYXVzZWQ7CiAgICAgdm9sYXRpbGUgYm9vbCBtUmVzdW1lZDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuaAppbmRleCBmNzQ5OWI2Li43YzJjMzZmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BdWRpb1BsYXllci5oCkBAIC0xOCw3ICsxOCw3IEBACiAKICNkZWZpbmUgQVVESU9fUExBWUVSX0hfCiAKLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CkBAIC01MCw3ICs1MCw3IEBACiAgICAgdmlydHVhbCB+QXVkaW9QbGF5ZXIoKTsKIAogICAgIC8vIENhbGxlciByZXRhaW5zIG93bmVyc2hpcCBvZiAic291cmNlIi4KLSAgICB2b2lkIHNldFNvdXJjZShjb25zdCBzcDxJTWVkaWFTb3VyY2U+ICZzb3VyY2UpOworICAgIHZvaWQgc2V0U291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKTsKIAogICAgIHN0YXR1c190IHN0YXJ0KGJvb2wgc291cmNlQWxyZWFkeVN0YXJ0ZWQgPSBmYWxzZSk7CiAKQEAgLTY2LDEwICs2NiwxMCBAQAogICAgIHN0YXR1c190IGdldFBsYXliYWNrUmF0ZShBdWRpb1BsYXliYWNrUmF0ZSAqcmF0ZSAvKiBub25udWxsICovKTsKIAogcHJpdmF0ZToKLSAgICBzcDxJTWVkaWFTb3VyY2U+IG1Tb3VyY2U7CisgICAgc3A8TWVkaWFTb3VyY2U+IG1Tb3VyY2U7CiAgICAgc3A8QXVkaW9UcmFjaz4gbUF1ZGlvVHJhY2s7CiAKLSAgICBNZWRpYUJ1ZmZlciAqbUlucHV0QnVmZmVyOworICAgIE1lZGlhQnVmZmVyQmFzZSAqbUlucHV0QnVmZmVyOwogCiAgICAgaW50IG1TYW1wbGVSYXRlOwogICAgIGludDY0X3QgbUxhdGVuY3lVczsKQEAgLTkxLDcgKzkxLDcgQEAKIAogICAgIGJvb2wgbUlzRmlyc3RCdWZmZXI7CiAgICAgc3RhdHVzX3QgbUZpcnN0QnVmZmVyUmVzdWx0OwotICAgIE1lZGlhQnVmZmVyICptRmlyc3RCdWZmZXI7CisgICAgTWVkaWFCdWZmZXJCYXNlICptRmlyc3RCdWZmZXI7CiAKICAgICBzcDxNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luaz4gbUF1ZGlvU2luazsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5oCmluZGV4IDE1OTViZTQuLjIwNmQzMjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmgKQEAgLTIwLDEyICsyMCwxNSBAQAogCiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZWNvcmQuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NaWNyb3Bob25lSW5mby5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CiAjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgogCiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKKyNpbmNsdWRlIDx2ZWN0b3I+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgQXVkaW9SZWNvcmQ7CkBAIC00MCw3ICs0Myw4IEBACiAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVscywKICAgICAgICAgICAgIHVpbnQzMl90IG91dFNhbXBsZVJhdGUgPSAwLAogICAgICAgICAgICAgdWlkX3QgdWlkID0gLTEsCi0gICAgICAgICAgICBwaWRfdCBwaWQgPSAtMSk7CisgICAgICAgICAgICBwaWRfdCBwaWQgPSAtMSwKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUpOwogCiAgICAgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CiAKQEAgLTUyLDExICs1NiwxOSBAQAogICAgIGludDE2X3QgZ2V0TWF4QW1wbGl0dWRlKCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0b3BUaW1lVXMoaW50NjRfdCBzdG9wVGltZVVzKTsKIAogICAgIHN0YXR1c190IGRhdGFDYWxsYmFjayhjb25zdCBBdWRpb1JlY29yZDo6QnVmZmVyJiBidWZmZXIpOwotICAgIHZpcnR1YWwgdm9pZCBzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlciAqYnVmZmVyKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpOworCisgICAgc3RhdHVzX3Qgc2V0SW5wdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCk7CisgICAgc3RhdHVzX3QgZ2V0Um91dGVkRGV2aWNlSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCogZGV2aWNlSWQpOworICAgIHN0YXR1c190IGFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjayk7CisgICAgc3RhdHVzX3QgcmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrKTsKKworICAgIHN0YXR1c190IGdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKTsKKwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QXVkaW9Tb3VyY2UoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FsbGJhY2tNZWRpYVNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYWxsYmFja01lZGlhU291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM0NTNmYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FsbGJhY2tNZWRpYVNvdXJjZS5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ0FMTEJBQ0tfTUVESUFfU09VUkNFX0hfCisjZGVmaW5lIENBTExCQUNLX01FRElBX1NPVVJDRV9IXworCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgSU1lZGlhU291cmNlOworCisvLyBBIHN0YWdlZnJpZ2h0IE1lZGlhU291cmNlIHRoYXQgd3JhcHMgYSBiaW5kZXIgSU1lZGlhU291cmNlLgorY2xhc3MgQ2FsbGJhY2tNZWRpYVNvdXJjZSA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgQ2FsbGJhY2tNZWRpYVNvdXJjZShjb25zdCBzcDxJTWVkaWFTb3VyY2U+ICZzb3VyY2UpOworICAgIHZpcnR1YWwgfkNhbGxiYWNrTWVkaWFTb3VyY2UoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOworCitwcml2YXRlOgorICAgIHNwPElNZWRpYVNvdXJjZT4gbVNvdXJjZTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENhbGxiYWNrTWVkaWFTb3VyY2UpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDQUxMQkFDS19NRURJQV9TT1VSQ0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5oCmluZGV4IGQ2MTQ5YzAuLjQ3NTk3NmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaApAQCAtMTksOCArMTksOCBAQAogI2RlZmluZSBDQU1FUkFfU09VUkNFX0hfCiAKICNpbmNsdWRlIDxkZXF1ZT4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxjYW1lcmEvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0lDYW1lcmFSZWNvcmRpbmdQcm94eS5oPgogI2luY2x1ZGUgPGNhbWVyYS9JQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lci5oPgpAQCAtOTcsNyArOTcsNyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpIHsgcmV0dXJuIHJlc2V0KCk7IH0KICAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0b3BUaW1lVXMoaW50NjRfdCBzdG9wVGltZVVzKTsKIAogICAgIC8qKgpAQCAtMTI3LDcgKzEyNyw3IEBACiAgICAgICovCiAgICAgTWV0YWRhdGFCdWZmZXJUeXBlIG1ldGFEYXRhU3RvcmVkSW5WaWRlb0J1ZmZlcnMoKSBjb25zdDsKIAotICAgIHZpcnR1YWwgdm9pZCBzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlciogYnVmZmVyKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXJCYXNlKiBidWZmZXIpOwogCiBwcm90ZWN0ZWQ6CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlVGltZUxhcHNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5oCmluZGV4IGIwNjZmOWEuLjUzM2UzM2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlVGltZUxhcHNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuaApAQCAtMTA3LDcgKzEwNyw3IEBACiAKICAgICAvLyBTdG9yZXMgYSBjb3B5IG9mIHRoZSBNZWRpYUJ1ZmZlciByZWFkIGluIHRoZSBsYXN0IHJlYWQoKSBjYWxsIGFmdGVyCiAgICAgLy8gbVF1aWNrU3RvcCB3YXMgdHJ1ZS4KLSAgICBNZWRpYUJ1ZmZlciogbUxhc3RSZWFkQnVmZmVyQ29weTsKKyAgICBNZWRpYUJ1ZmZlckJhc2UqIG1MYXN0UmVhZEJ1ZmZlckNvcHk7CiAKICAgICAvLyBTdGF0dXMgY29kZSBmb3IgbGFzdCByZWFkLgogICAgIHN0YXR1c190IG1MYXN0UmVhZFN0YXR1czsKQEAgLTEyOCwxMCArMTI4LDEwIEBACiAgICAgLy8gV3JhcHBlciBvdmVyIENhbWVyYVNvdXJjZTo6c2lnbmFsQnVmZmVyUmV0dXJuZWQoKSB0byBpbXBsZW1lbnQgcXVpY2sgc3RvcC4KICAgICAvLyBJdCBvbmx5IGhhbmRsZXMgdGhlIGNhc2Ugd2hlbiBtTGFzdFJlYWRCdWZmZXJDb3B5IGlzIHNpZ25hbGxlZC4gT3RoZXJ3aXNlCiAgICAgLy8gaXQgY2FsbHMgdGhlIGJhc2UgY2xhc3MnIGZ1bmN0aW9uLgotICAgIHZpcnR1YWwgdm9pZCBzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlciogYnVmZmVyKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXJCYXNlKiBidWZmZXIpOwogCiAgICAgLy8gV3JhcHBlciBvdmVyIENhbWVyYVNvdXJjZTo6cmVhZCgpIHRvIGltcGxlbWVudCBxdWljayBzdG9wLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZChNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwogCiAgICAgLy8gbVNraXBDdXJyZW50RnJhbWUgaXMgc2V0IHRvIHRydWUgaW4gZGF0YUNhbGxiYWNrVGltZXN0YW1wKCkgaWYgdGhlIGN1cnJlbnQKICAgICAvLyBmcmFtZSBuZWVkcyB0byBiZSBza2lwcGVkIGFuZCB0aGlzIGZ1bmN0aW9uIGp1c3QgcmV0dXJucyB0aGUgdmFsdWUgb2YgbVNraXBDdXJyZW50RnJhbWUuCkBAIC0xNzAsNyArMTcwLDcgQEAKIAogICAgIC8vIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGZpbGwgbUxhc3RSZWFkQnVmZmVyQ29weSBmcm9tIHRoZSBqdXN0IHJlYWQKICAgICAvLyBidWZmZXIuCi0gICAgdm9pZCBmaWxsTGFzdFJlYWRCdWZmZXJDb3B5KE1lZGlhQnVmZmVyJiBzb3VyY2VCdWZmZXIpOworICAgIHZvaWQgZmlsbExhc3RSZWFkQnVmZmVyQ29weShNZWRpYUJ1ZmZlckJhc2UmIHNvdXJjZUJ1ZmZlcik7CiAKICAgICAvLyBJZiB0aGUgcGFzc2VkIGluIHNpemUgKHdpZHRoIHggaGVpZ2h0KSBpcyBhIHN1cHBvcnRlZCB2aWRlby9wcmV2aWV3IHNpemUsCiAgICAgLy8gdGhlIGZ1bmN0aW9uIHNldHMgdGhlIGNhbWVyYSdzIHZpZGVvL3ByZXZpZXcgc2l6ZSB0byBpdCBhbmQgcmV0dXJucyB0cnVlLgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmgKaW5kZXggOTE5N2Y3Yi4uYWQ2MGY0NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oCkBAIC0xOCw2ICsxOCw3IEBACiAKICNkZWZpbmUgQ09ERUNfQkFTRV9IXwogCisjaW5jbHVkZSA8bGlzdD4KICNpbmNsdWRlIDxtZW1vcnk+CiAKICNpbmNsdWRlIDxzdGRpbnQuaD4KQEAgLTI2LDcgKzI3LDYgQEAKIAogI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0NyeXB0b0FQSS5oPgogI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNJbmZvLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgpAQCAtMjIyLDkgKzIyMiw4IEBACiAgICAgdmlydHVhbCB2b2lkIHNpZ25hbFNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpID0gMDsKIAotICAgIC8qCi0gICAgICogQ29kZWMtcmVsYXRlZCBkZWZpbmVzCi0gICAgICovCisgICAgdHlwZWRlZiBDb2RlY0Jhc2UgKigqQ3JlYXRlQ29kZWNGdW5jKSh2b2lkKTsKKyAgICB0eXBlZGVmIFBlcnNpc3RlbnRTdXJmYWNlICooKkNyZWF0ZUlucHV0U3VyZmFjZUZ1bmMpKHZvaWQpOwogCiBwcm90ZWN0ZWQ6CiAgICAgQ29kZWNCYXNlKCkgPSBkZWZhdWx0OwpAQCAtMzI0LDQgKzMyMywzIEBACiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgIC8vIENPREVDX0JBU0VfSF8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2xvckNvbnZlcnRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2xvckNvbnZlcnRlci5oCmluZGV4IDdhYzliMzcuLjViMzU0M2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29sb3JDb252ZXJ0ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvbG9yQ29udmVydGVyLmgKQEAgLTMzLDYgKzMzLDggQEAKIAogICAgIGJvb2wgaXNWYWxpZCgpIGNvbnN0OwogCisgICAgYm9vbCBpc0RzdFJHQigpIGNvbnN0OworCiAgICAgc3RhdHVzX3QgY29udmVydCgKICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnNyY0JpdHMsCiAgICAgICAgICAgICBzaXplX3Qgc3JjV2lkdGgsIHNpemVfdCBzcmNIZWlnaHQsCkBAIC03Niw2ICs3OCwxNSBAQAogICAgIHN0YXR1c190IGNvbnZlcnRZVVY0MjBQbGFuYXJVc2VMaWJZVVYoCiAgICAgICAgICAgICBjb25zdCBCaXRtYXBQYXJhbXMgJnNyYywgY29uc3QgQml0bWFwUGFyYW1zICZkc3QpOwogCisgICAgc3RhdHVzX3QgY29udmVydFlVVjQyMFBsYW5hcjE2KAorICAgICAgICAgICAgY29uc3QgQml0bWFwUGFyYW1zICZzcmMsIGNvbnN0IEJpdG1hcFBhcmFtcyAmZHN0KTsKKworICAgIHN0YXR1c190IGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWTQxMCgKKyAgICAgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCk7CisKKyAgICBzdGF0dXNfdCBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1JHQigKKyAgICAgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCk7CisKICAgICBzdGF0dXNfdCBjb252ZXJ0UUNPTVlVVjQyMFNlbWlQbGFuYXIoCiAgICAgICAgICAgICBjb25zdCBCaXRtYXBQYXJhbXMgJnNyYywgY29uc3QgQml0bWFwUGFyYW1zICZkc3QpOwogCkBAIC04NSwxMCArOTYsNiBAQAogICAgIHN0YXR1c190IGNvbnZlcnRUSVlVVjQyMFBhY2tlZFNlbWlQbGFuYXIoCiAgICAgICAgICAgICBjb25zdCBCaXRtYXBQYXJhbXMgJnNyYywgY29uc3QgQml0bWFwUGFyYW1zICZkc3QpOwogCi0gICAgdm9pZCB3cml0ZVRvRHN0KHZvaWQgKmRzdF9wdHIsIHVpbnQ4X3QgKmtBZGp1c3RlZENsaXAsIGJvb2wgdW5jcm9wcGVkLAotICAgICAgICAgICAgc2lnbmVkIHIxLCBzaWduZWQgZzEsIHNpZ25lZCBiMSwKLSAgICAgICAgICAgIHNpZ25lZCByMiwgc2lnbmVkIGcyLCBzaWduZWQgYjIpOwotCiAgICAgQ29sb3JDb252ZXJ0ZXIoY29uc3QgQ29sb3JDb252ZXJ0ZXIgJik7CiAgICAgQ29sb3JDb252ZXJ0ZXIgJm9wZXJhdG9yPShjb25zdCBDb2xvckNvbnZlcnRlciAmKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDg2M2JhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIERBVEFfU09VUkNFX0hfCi0KLSNkZWZpbmUgREFUQV9TT1VSQ0VfSF8KLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgPGRybS9Ecm1NYW5hZ2VyQ2xpZW50Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IEFNZXNzYWdlOwotc3RydWN0IEFTdHJpbmc7Ci1jbGFzcyAgSURhdGFTb3VyY2U7Ci1zdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2U7Ci1jbGFzcyBTdHJpbmc4Owotc3RydWN0IEhUVFBCYXNlOwotCi1jbGFzcyBEYXRhU291cmNlIDogcHVibGljIFJlZkJhc2UgewotcHVibGljOgotICAgIGVudW0gRmxhZ3MgewotICAgICAgICBrV2FudHNQcmVmZXRjaGluZyAgICAgID0gMSwKLSAgICAgICAga1N0cmVhbWVkRnJvbUxvY2FsSG9zdCA9IDIsCi0gICAgICAgIGtJc0NhY2hpbmdEYXRhU291cmNlICAgPSA0LAotICAgICAgICBrSXNIVFRQQmFzZWRTb3VyY2UgICAgID0gOCwKLSAgICAgICAga0lzTG9jYWxGaWxlU291cmNlICAgICA9IDE2LAotICAgIH07Ci0KLSAgICBzdGF0aWMgc3A8RGF0YVNvdXJjZT4gQ3JlYXRlRnJvbVVSSSgKLSAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCi0gICAgICAgICAgICBjb25zdCBjaGFyICp1cmksCi0gICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyA9IE5VTEwsCi0gICAgICAgICAgICBTdHJpbmc4ICpjb250ZW50VHlwZSA9IE5VTEwsCi0gICAgICAgICAgICBIVFRQQmFzZSAqaHR0cFNvdXJjZSA9IE5VTEwpOwotCi0gICAgc3RhdGljIHNwPERhdGFTb3VyY2U+IENyZWF0ZU1lZGlhSFRUUChjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlKTsKLSAgICBzdGF0aWMgc3A8RGF0YVNvdXJjZT4gQ3JlYXRlRnJvbUlEYXRhU291cmNlKGNvbnN0IHNwPElEYXRhU291cmNlPiAmc291cmNlKTsKLSAgICBzdGF0aWMgc3A8RGF0YVNvdXJjZT4gQ3JlYXRlRnJvbUZkKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKLQotICAgIERhdGFTb3VyY2UoKSB7fQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdCA9IDA7Ci0KLSAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgb3IgLTEgb24gZmFpbHVyZS4gSXQncyBub3QgYW4gZXJyb3IgaWYKLSAgICAvLyB0aGlzIHJldHVybnMgemVybzsgaXQganVzdCBtZWFucyB0aGUgZ2l2ZW4gb2Zmc2V0IGlzIGVxdWFsIHRvLCBvcgotICAgIC8vIGJleW9uZCwgdGhlIGVuZCBvZiB0aGUgc291cmNlLgotICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSA9IDA7Ci0KLSAgICAvLyBDb252ZW5pZW5jZSBtZXRob2RzOgotICAgIGJvb2wgZ2V0VUludDE2KG9mZjY0X3Qgb2Zmc2V0LCB1aW50MTZfdCAqeCk7Ci0gICAgYm9vbCBnZXRVSW50MjQob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4KTsgLy8gMyBieXRlIGludCwgcmV0dXJuZWQgYXMgYSAzMi1iaXQgaW50Ci0gICAgYm9vbCBnZXRVSW50MzIob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4KTsKLSAgICBib29sIGdldFVJbnQ2NChvZmY2NF90IG9mZnNldCwgdWludDY0X3QgKngpOwotCi0gICAgLy8gcmVhZCBlaXRoZXIgaW50PE4+IG9yIGludDwyTj4gaW50byBhIHVpbnQ8Mk4+X3QsIHNpemUgaXMgdGhlIGludCBzaXplIGluIGJ5dGVzLgotICAgIGJvb2wgZ2V0VUludDE2VmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MTZfdCAqeCwgc2l6ZV90IHNpemUpOwotICAgIGJvb2wgZ2V0VUludDMyVmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MzJfdCAqeCwgc2l6ZV90IHNpemUpOwotICAgIGJvb2wgZ2V0VUludDY0VmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50NjRfdCAqeCwgc2l6ZV90IHNpemUpOwotCi0gICAgLy8gUmVhZHMgaW4gImNvdW50IiBlbnRyaWVzIG9mIHR5cGUgVCBpbnRvIHZlY3RvciAqeC4KLSAgICAvLyBSZXR1cm5zIHRydWUgaWYgImNvdW50IiBlbnRyaWVzIGNhbiBiZSByZWFkLgotICAgIC8vIElmIGZld2VyIHRoYW4gImNvdW50IiBlbnRyaWVzIGNhbiBiZSByZWFkLCByZXR1cm4gZmFsc2UuIEluIHRoaXMgY2FzZSwKLSAgICAvLyB0aGUgb3V0cHV0IHZlY3RvciAqeCB3aWxsIHN0aWxsIGhhdmUgdGhvc2UgZW50cmllcyB0aGF0IHdlcmUgcmVhZC4gQ2FsbAotICAgIC8vIHgtPnNpemUoKSB0byBvYnRhaW4gdGhlIG51bWJlciBvZiBlbnRyaWVzIHJlYWQuCi0gICAgLy8gVGhlIG9wdGlvbmFsIHBhcmFtZXRlciBjaHVua1NpemUgc3BlY2lmaWVzIGhvdyBtYW55IGVudHJpZXMgc2hvdWxkIGJlCi0gICAgLy8gcmVhZCBmcm9tIHRoZSBkYXRhIHNvdXJjZSBhdCBvbmUgdGltZSBpbnRvIGEgdGVtcG9yYXJ5IGJ1ZmZlci4gSW5jcmVhc2luZwotICAgIC8vIGNodW5rU2l6ZSBjYW4gaW1wcm92ZSB0aGUgcGVyZm9ybWFuY2UgYXQgdGhlIGNvc3Qgb2YgZXh0cmEgbWVtb3J5IHVzYWdlLgotICAgIC8vIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBjaHVua1NpemUgaXMgc2V0IHRvIHJlYWQgYXQgbGVhc3QgNGsgYnl0ZXMgYXQgYQotICAgIC8vIHRpbWUsIGRlcGVuZGluZyBvbiBzaXplb2YoVCkuCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gICAgYm9vbCBnZXRWZWN0b3Iob2ZmNjRfdCBvZmZzZXQsIFZlY3RvcjxUPiogeCwgc2l6ZV90IGNvdW50LAotICAgICAgICAgICAgICAgICAgIHNpemVfdCBjaHVua1NpemUgPSAoNDA5NSAvIHNpemVvZihUKSkgKyAxKTsKLQotICAgIC8vIE1heSByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpOwotCi0gICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgdmlydHVhbCBTdHJpbmc4IHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gU3RyaW5nOCgiPHVuc3BlY2lmaWVkPiIpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVjb25uZWN0QXRPZmZzZXQob2ZmNjRfdCAvKm9mZnNldCovKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAvLyBmb3IgRFJNCi0gICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBEcm1Jbml0aWFsaXphdGlvbihjb25zdCBjaGFyICogLyptaW1lKi8gPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgZ2V0RHJtSW5mbyhzcDxEZWNyeXB0SGFuZGxlPiAmLypoYW5kbGUqLywgRHJtTWFuYWdlckNsaWVudCAqKiAvKmNsaWVudCovKSB7fTsKLQotICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRVcmkoKSB7Ci0gICAgICAgIHJldHVybiBTdHJpbmc4KCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBTdHJpbmc4IGdldE1JTUVUeXBlKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKSB7fTsKLQotICAgIC8vIGNyZWF0ZXMgYW4gSURhdGFTb3VyY2Ugd3JhcHBlciB0byB0aGUgRGF0YVNvdXJjZS4KLSAgICB2aXJ0dWFsIHNwPElEYXRhU291cmNlPiBhc0lEYXRhU291cmNlKCk7Ci0KLSAgICAvLyByZXR1cm5zIGEgcG9pbnRlciB0byBJRGF0YVNvdXJjZSBpZiBpdCBpcyB3cmFwcGVkLgotICAgIHZpcnR1YWwgc3A8SURhdGFTb3VyY2U+IGdldElEYXRhU291cmNlKCkgY29uc3Q7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5EYXRhU291cmNlKCkge30KLQotcHJpdmF0ZToKLSAgICBEYXRhU291cmNlKGNvbnN0IERhdGFTb3VyY2UgJik7Ci0gICAgRGF0YVNvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IERhdGFTb3VyY2UgJik7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWJvb2wgRGF0YVNvdXJjZTo6Z2V0VmVjdG9yKG9mZjY0X3Qgb2Zmc2V0LCBWZWN0b3I8VD4qIHgsIHNpemVfdCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjaHVua1NpemUpCi17Ci0gICAgeC0+Y2xlYXIoKTsKLSAgICBpZiAoY2h1bmtTaXplID09IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoY291bnQgPT0gMCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBUIHRtcFtjaHVua1NpemVdOwotICAgIHNzaXplX3QgbnVtQnl0ZXNSZWFkOwotICAgIHNpemVfdCBudW1CeXRlc1BlckNodW5rID0gY2h1bmtTaXplICogc2l6ZW9mKFQpOwotICAgIHNpemVfdCBpOwotCi0gICAgZm9yIChpID0gMDsgaSArIGNodW5rU2l6ZSA8IGNvdW50OyBpICs9IGNodW5rU2l6ZSkgewotICAgICAgICAvLyBUaGlzIGxvb3BzIGlzIGV4ZWN1dGVkIHdoZW4gbW9yZSB0aGFuIGNodW5rU2l6ZSByZWNvcmRzIG5lZWQgdG8gYmUKLSAgICAgICAgLy8gcmVhZC4KLSAgICAgICAgbnVtQnl0ZXNSZWFkID0gdGhpcy0+cmVhZEF0KG9mZnNldCwgKHZvaWQqKSZ0bXAsIG51bUJ5dGVzUGVyQ2h1bmspOwotICAgICAgICBpZiAobnVtQnl0ZXNSZWFkID09IC0xKSB7IC8vIElmIHJlYWRBdCgpIHJldHVybnMgLTEsIHRoZXJlIGlzIGFuIGVycm9yLgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzdGF0aWNfY2FzdDxzaXplX3Q+KG51bUJ5dGVzUmVhZCkgPCBudW1CeXRlc1BlckNodW5rKSB7Ci0gICAgICAgICAgICAvLyBUaGlzIGNhc2UgaXMgdHJpZ2dlcmVkIHdoZW4gdGhlIHN0cmVhbSBlbmRzIGJlZm9yZSB0aGUgd2hvbGUKLSAgICAgICAgICAgIC8vIGNodW5rIGlzIHJlYWQuCi0gICAgICAgICAgICB4LT5hcHBlbmRBcnJheSh0bXAsIChzaXplX3QpbnVtQnl0ZXNSZWFkIC8gc2l6ZW9mKFQpKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICB4LT5hcHBlbmRBcnJheSh0bXAsIGNodW5rU2l6ZSk7Ci0gICAgICAgIG9mZnNldCArPSBudW1CeXRlc1BlckNodW5rOwotICAgIH0KLQotICAgIC8vIFRoZXJlIGFyZSAoY291bnQgLSBpKSBtb3JlIHJlY29yZHMgdG8gcmVhZC4KLSAgICAvLyBSaWdodCBub3csIChjb3VudCAtIGkpIDw9IGNodW5rU2l6ZS4KLSAgICAvLyBXZSBkbyB0aGUgc2FtZSB0aGluZyBhcyBhYm92ZSwgYnV0IHdpdGggY2h1bmtTaXplIHJlcGxhY2VkIGJ5IGNvdW50IC0gaS4KLSAgICBudW1CeXRlc1JlYWQgPSB0aGlzLT5yZWFkQXQob2Zmc2V0LCAodm9pZCopJnRtcCwgKGNvdW50IC0gaSkgKiBzaXplb2YoVCkpOwotICAgIGlmIChudW1CeXRlc1JlYWQgPT0gLTEpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICB4LT5hcHBlbmRBcnJheSh0bXAsIChzaXplX3QpbnVtQnl0ZXNSZWFkIC8gc2l6ZW9mKFQpKTsKLSAgICByZXR1cm4geC0+c2l6ZSgpID09IGNvdW50OwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIERBVEFfU09VUkNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2VGYWN0b3J5LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2VGYWN0b3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmExZDQ5MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZUZhY3RvcnkuaApAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBEQVRBX1NPVVJDRV9GQUNUT1JZX0hfCisKKyNkZWZpbmUgREFUQV9TT1VSQ0VfRkFDVE9SWV9IXworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBNZWRpYUhUVFBTZXJ2aWNlOworY2xhc3MgU3RyaW5nODsKK3N0cnVjdCBIVFRQQmFzZTsKKworY2xhc3MgRGF0YVNvdXJjZUZhY3RvcnkgeworcHVibGljOgorICAgIHN0YXRpYyBzcDxEYXRhU291cmNlPiBDcmVhdGVGcm9tVVJJKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMLAorICAgICAgICAgICAgU3RyaW5nOCAqY29udGVudFR5cGUgPSBOVUxMLAorICAgICAgICAgICAgSFRUUEJhc2UgKmh0dHBTb3VyY2UgPSBOVUxMKTsKKworICAgIHN0YXRpYyBzcDxEYXRhU291cmNlPiBDcmVhdGVNZWRpYUhUVFAoY29uc3Qgc3A8TWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlKTsKKyAgICBzdGF0aWMgc3A8RGF0YVNvdXJjZT4gQ3JlYXRlRnJvbUZkKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gREFUQV9TT1VSQ0VfRkFDVE9SWV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhVVJJU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFVUklTb3VyY2UuaAppbmRleCA2OTM1NjJlLi5jZjhkNjhlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFVUklTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFVUklTb3VyY2UuaApAQCAtMTgsNyArMTgsNyBAQAogCiAjZGVmaW5lIERBVEFfVVJJX1NPVVJDRV9IXwogCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVVyaVNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhVXJpU291cmNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMjNjMDYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhVXJpU291cmNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBEQVRBX1VSSV9TT1VSQ0VfSF8KLQotI2RlZmluZSBEQVRBX1VSSV9TT1VSQ0VfSF8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBEYXRhVXJpU291cmNlIDogcHVibGljIERhdGFTb3VyY2UgewotcHVibGljOgotICAgIERhdGFVcmlTb3VyY2UoY29uc3QgY2hhciAqdXJpKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbUluaXRlZDsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSkgewotICAgICAgICBpZiAobUluaXRlZCAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIG1Jbml0ZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICAqc2l6ZSA9IG1EYXRhLnNpemUoKTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRVcmkoKSB7Ci0gICAgICAgIHJldHVybiBtRGF0YVVyaTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIFN0cmluZzggZ2V0TUlNRVR5cGUoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtTWltZVR5cGU7Ci0gICAgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+RGF0YVVyaVNvdXJjZSgpIHsKLSAgICAgICAgLy8gTm90aGluZyB0byBkZWxldGUuCi0gICAgfQotCi1wcml2YXRlOgotICAgIGNvbnN0IFN0cmluZzggbURhdGFVcmk7Ci0KLSAgICBTdHJpbmc4IG1NaW1lVHlwZTsKLSAgICAvLyBVc2UgQVN0cmluZyBiZWNhdXNlIGluZGl2aWR1YWwgYnl0ZXMgbWF5IG5vdCBiZSB2YWxpZCBVVEY4IGNoYXJzLgotICAgIEFTdHJpbmcgbURhdGE7Ci0gICAgc3RhdHVzX3QgbUluaXRlZDsKLQotICAgIC8vIERpc2FsbG93IGNvcHkgYW5kIGFzc2lnbi4KLSAgICBEYXRhVXJpU291cmNlKGNvbnN0IERhdGFVcmlTb3VyY2UgJik7Ci0gICAgRGF0YVVyaVNvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IERhdGFVcmlTb3VyY2UgJik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIERBVEFfVVJJX1NPVVJDRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaAppbmRleCA3MjY3ZTlhLi44NjA0ODkwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaApAQCAtMjAsNyArMjAsNyBAQAogCiAjaW5jbHVkZSA8c3RkaW8uaD4KIAotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSA8ZHJtL0RybU1hbmFnZXJDbGllbnQuaD4KQEAgLTQ1LDggKzQ1LDYgQEAKIAogICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gRHJtSW5pdGlhbGl6YXRpb24oY29uc3QgY2hhciAqbWltZSk7CiAKLSAgICB2aXJ0dWFsIHZvaWQgZ2V0RHJtSW5mbyhzcDxEZWNyeXB0SGFuZGxlPiAmaGFuZGxlLCBEcm1NYW5hZ2VyQ2xpZW50ICoqY2xpZW50KTsKLQogICAgIHZpcnR1YWwgU3RyaW5nOCB0b1N0cmluZygpIHsKICAgICAgICAgcmV0dXJuIG1OYW1lOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvSW50ZXJmYWNlVXRpbHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvSW50ZXJmYWNlVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGViZDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElOVEVSRkFDRV9VVElMU19IXworI2RlZmluZSBJTlRFUkZBQ0VfVVRJTFNfSF8KKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFTb3VyY2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBEYXRhU291cmNlOworY2xhc3MgTWVkaWFFeHRyYWN0b3I7CitzdHJ1Y3QgTWVkaWFTb3VyY2U7CitjbGFzcyBJRGF0YVNvdXJjZTsKK2NsYXNzIElNZWRpYUV4dHJhY3RvcjsKK2NsYXNzIElNZWRpYVNvdXJjZTsKKworLy8gQ3JlYXRlcyBhIERhdGFTb3VyY2Ugd2hpY2ggd3JhcHMgdGhlIGdpdmVuIElEYXRhU291cmNlIG9iamVjdC4KK3NwPERhdGFTb3VyY2U+IENyZWF0ZURhdGFTb3VyY2VGcm9tSURhdGFTb3VyY2UoY29uc3Qgc3A8SURhdGFTb3VyY2U+ICZzb3VyY2UpOworCisvLyBjcmVhdGVzIGFuIElEYXRhU291cmNlIHdyYXBwZXIgdG8gdGhlIERhdGFTb3VyY2UuCitzcDxJRGF0YVNvdXJjZT4gQ3JlYXRlSURhdGFTb3VyY2VGcm9tRGF0YVNvdXJjZShjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKTsKKworLy8gQ3JlYXRlcyBhbiBJTWVkaWFFeHRyYWN0b3Igd3JhcHBlciB0byB0aGUgZ2l2ZW4gTWVkaWFFeHRyYWN0b3IuCitzcDxJTWVkaWFFeHRyYWN0b3I+IENyZWF0ZUlNZWRpYUV4dHJhY3RvckZyb21NZWRpYUV4dHJhY3RvcigKKyAgICAgICAgTWVkaWFFeHRyYWN0b3IgKmV4dHJhY3RvciwKKyAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwKKyAgICAgICAgY29uc3Qgc3A8UmVmQmFzZT4gJnBsdWdpbik7CisKKy8vIENyZWF0ZXMgYSBNZWRpYVNvdXJjZSB3aGljaCB3cmFwcyB0aGUgZ2l2ZW4gSU1lZGlhU291cmNlIG9iamVjdC4KK3NwPE1lZGlhU291cmNlPiBDcmVhdGVNZWRpYVNvdXJjZUZyb21JTWVkaWFTb3VyY2UoY29uc3Qgc3A8SU1lZGlhU291cmNlPiAmc291cmNlKTsKKworLy8gQ3JlYXRlcyBhbiBJTWVkaWFTb3VyY2Ugd3JhcHBlciB0byB0aGUgZ2l2ZW4gTWVkaWFTb3VyY2UuCitzcDxJTWVkaWFTb3VyY2U+IENyZWF0ZUlNZWRpYVNvdXJjZUZyb21NZWRpYVNvdXJjZUJhc2UoCisgICAgICAgIGNvbnN0IHNwPFJlbW90ZU1lZGlhRXh0cmFjdG9yPiAmZXh0cmFjdG9yLAorICAgICAgICBNZWRpYVRyYWNrICpzb3VyY2UsIGNvbnN0IHNwPFJlZkJhc2U+ICZwbHVnaW4pOworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIElOVEVSRkFDRV9VVElMU19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9KUEVHU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0pQRUdTb3VyY2UuaAppbmRleCAxYjdlOTFiLi44YWIzZDExIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0pQRUdTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0pQRUdTb3VyY2UuaApAQCAtMTgsNyArMTgsNyBAQAogCiAjZGVmaW5lIEpQRUdfU09VUkNFX0hfCiAKLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzMsNyArMzMsNyBAQAogICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5KUEVHU291cmNlKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01QRUcyVFNXcml0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzJUU1dyaXRlci5oCmluZGV4IDQ1MTZmYjYuLjNkNzk2MGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzJUU1dyaXRlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzJUU1dyaXRlci5oCkBAIC0zNCw3ICszNCw3IEBACiAgICAgICAgICAgICB2b2lkICpjb29raWUsCiAgICAgICAgICAgICBzc2l6ZV90ICgqd3JpdGUpKHZvaWQgKmNvb2tpZSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU291cmNlKGNvbnN0IHNwPElNZWRpYVNvdXJjZT4gJnNvdXJjZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtID0gTlVMTCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCkgeyByZXR1cm4gcmVzZXQoKTsgfQogICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaAppbmRleCAxYzdiNGE2Li5mMTg5NDBkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oCkBAIC0yMCw3ICsyMCw2IEBACiAKICNpbmNsdWRlIDxzdGRpby5oPgogCi0jaW5jbHVkZSA8bWVkaWEvSU1lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFXcml0ZXIuaD4KICNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgpAQCAtMzEsNyArMzAsNyBAQAogCiBzdHJ1Y3QgQU1lc3NhZ2U7CiBjbGFzcyBNZWRpYUJ1ZmZlcjsKLWNsYXNzIE1ldGFEYXRhOworc3RydWN0IEFCdWZmZXI7CiAKIGNsYXNzIE1QRUc0V3JpdGVyIDogcHVibGljIE1lZGlhV3JpdGVyIHsKIHB1YmxpYzoKQEAgLTQwLDcgKzM5LDcgQEAKICAgICAvLyBMaW1pdGF0aW9ucwogICAgIC8vIE5vIG1vcmUgdGhhbiBvbmUgdmlkZW8gYW5kL29yIG9uZSBhdWRpbyBzb3VyY2UgY2FuIGJlIGFkZGVkLCBidXQKICAgICAvLyBtdWx0aXBsZSBtZXRhZGF0YSBzb3VyY2VzIGNhbiBiZSBhZGRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFNvdXJjZShjb25zdCBzcDxJTWVkaWFTb3VyY2U+ICZzb3VyY2UpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKTsKIAogICAgIC8vIFJldHVybnMgSU5WQUxJRF9PUEVSQVRJT04gaWYgdGhlcmUgaXMgbm8gc291cmNlIG9yIHRyYWNrLgogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtID0gTlVMTCk7CkBAIC0xMDEsMTIgKzEwMCwxMiBAQAogICAgIGJvb2wgbVNlbmROb3RpZnk7CiAgICAgb2ZmNjRfdCBtT2Zmc2V0OwogICAgIG9mZl90IG1NZGF0T2Zmc2V0OwotICAgIHVpbnQ4X3QgKm1Nb292Qm94QnVmZmVyOwotICAgIG9mZjY0X3QgbU1vb3ZCb3hCdWZmZXJPZmZzZXQ7Ci0gICAgYm9vbCAgbVdyaXRlTW9vdkJveFRvTWVtb3J5OworICAgIHVpbnQ4X3QgKm1Jbk1lbW9yeUNhY2hlOworICAgIG9mZjY0X3QgbUluTWVtb3J5Q2FjaGVPZmZzZXQ7CisgICAgb2ZmNjRfdCBtSW5NZW1vcnlDYWNoZVNpemU7CisgICAgYm9vbCAgbVdyaXRlQm94VG9NZW1vcnk7CiAgICAgb2ZmNjRfdCBtRnJlZUJveE9mZnNldDsKICAgICBib29sIG1TdHJlYW1hYmxlRmlsZTsKLSAgICBvZmY2NF90IG1Fc3RpbWF0ZWRNb292Qm94U2l6ZTsKICAgICBvZmY2NF90IG1Nb292RXh0cmFTaXplOwogICAgIHVpbnQzMl90IG1JbnRlcmxlYXZlRHVyYXRpb25VczsKICAgICBpbnQzMl90IG1UaW1lU2NhbGU7CkBAIC0xMzMsNiArMTMyLDggQEAKICAgICBzdGF0dXNfdCBzdGFydFRyYWNrcyhNZXRhRGF0YSAqcGFyYW1zKTsKICAgICBzaXplX3QgbnVtVHJhY2tzKCk7CiAgICAgaW50NjRfdCBlc3RpbWF0ZU1vb3ZCb3hTaXplKGludDMyX3QgYml0UmF0ZSk7CisgICAgaW50NjRfdCBlc3RpbWF0ZUZpbGVMZXZlbE1ldGFTaXplKE1ldGFEYXRhICpwYXJhbXMpOworICAgIHZvaWQgd3JpdGVDYWNoZWRCb3hUb0ZpbGUoY29uc3QgY2hhciAqdHlwZSk7CiAKICAgICBzdHJ1Y3QgQ2h1bmsgewogICAgICAgICBUcmFjayAgICAgICAgICAgICAgICptVHJhY2s7ICAgICAgICAvLyBPd25lcgpAQCAtMTY1LDYgKzE2Niw1MCBAQAogICAgIExpc3Q8Q2h1bmtJbmZvPiBtQ2h1bmtJbmZvczsgICAgICAgICAgICAvLyBDaHVuayBpbmZvcwogICAgIENvbmRpdGlvbiAgICAgICBtQ2h1bmtSZWFkeUNvbmRpdGlvbjsgICAvLyBTaWduYWwgdGhhdCBjaHVua3MgYXJlIGF2YWlsYWJsZQogCisgICAgLy8gSEVJRiB3cml0aW5nCisgICAgdHlwZWRlZiBrZXlfdmFsdWVfcGFpcl90PCBjb25zdCBjaGFyICosIFZlY3Rvcjx1aW50MTZfdD4gPiBJdGVtUmVmczsKKyAgICB0eXBlZGVmIHN0cnVjdCBfSXRlbUluZm8geworICAgICAgICBib29sIGlzR3JpZCgpIGNvbnN0IHsgcmV0dXJuICFzdHJjbXAoImdyaWQiLCBpdGVtVHlwZSk7IH0KKyAgICAgICAgYm9vbCBpc0ltYWdlKCkgY29uc3QgeyByZXR1cm4gIXN0cmNtcCgiaHZjMSIsIGl0ZW1UeXBlKSB8fCBpc0dyaWQoKTsgfQorICAgICAgICBjb25zdCBjaGFyICppdGVtVHlwZTsKKyAgICAgICAgdWludDE2X3QgaXRlbUlkOworICAgICAgICBib29sIGlzUHJpbWFyeTsKKyAgICAgICAgYm9vbCBpc0hpZGRlbjsKKyAgICAgICAgdW5pb24geworICAgICAgICAgICAgLy8gaW1hZ2UgaXRlbQorICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBvZmZzZXQ7CisgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICAvLyBncmlkIGl0ZW0KKyAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgdWludDMyX3Qgcm93czsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2xzOworICAgICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodDsKKyAgICAgICAgICAgIH07CisgICAgICAgIH07CisgICAgICAgIFZlY3Rvcjx1aW50MTZfdD4gcHJvcGVydGllczsKKyAgICAgICAgVmVjdG9yPEl0ZW1SZWZzPiByZWZzTGlzdDsKKyAgICB9IEl0ZW1JbmZvOworCisgICAgdHlwZWRlZiBzdHJ1Y3QgX0l0ZW1Qcm9wZXJ0eSB7CisgICAgICAgIHVpbnQzMl90IHR5cGU7CisgICAgICAgIGludDMyX3Qgd2lkdGg7CisgICAgICAgIGludDMyX3QgaGVpZ2h0OworICAgICAgICBpbnQzMl90IHJvdGF0aW9uOworICAgICAgICBzcDxBQnVmZmVyPiBodmNjOworICAgIH0gSXRlbVByb3BlcnR5OworCisgICAgYm9vbCBtSGFzRmlsZUxldmVsTWV0YTsKKyAgICBib29sIG1IYXNNb292Qm94OworICAgIHVpbnQzMl90IG1QcmltYXJ5SXRlbUlkOworICAgIHVpbnQzMl90IG1Bc3NvY2lhdGlvbkVudHJ5Q291bnQ7CisgICAgdWludDMyX3QgbU51bUdyaWRzOworICAgIGJvb2wgbUhhc1JlZnM7CisgICAgVmVjdG9yPEl0ZW1JbmZvPiBtSXRlbXM7CisgICAgVmVjdG9yPEl0ZW1Qcm9wZXJ0eT4gbVByb3BlcnRpZXM7CisKICAgICAvLyBXcml0ZXIgdGhyZWFkIGhhbmRsaW5nCiAgICAgc3RhdHVzX3Qgc3RhcnRXcml0ZXJUaHJlYWQoKTsKICAgICB2b2lkIHN0b3BXcml0ZXJUaHJlYWQoKTsKQEAgLTIxMCw5ICsyNTUsMTIgQEAKICAgICB2b2lkIGluaXRJbnRlcm5hbChpbnQgZmQsIGJvb2wgaXNGaXJzdFNlc3Npb24pOwogCiAgICAgLy8gQWNxdWlyZSBsb2NrIGJlZm9yZSBjYWxsaW5nIHRoZXNlIG1ldGhvZHMKLSAgICBvZmY2NF90IGFkZFNhbXBsZV9sKE1lZGlhQnVmZmVyICpidWZmZXIpOwotICAgIG9mZjY0X3QgYWRkTGVuZ3RoUHJlZml4ZWRTYW1wbGVfbChNZWRpYUJ1ZmZlciAqYnVmZmVyKTsKLSAgICBvZmY2NF90IGFkZE11bHRpcGxlTGVuZ3RoUHJlZml4ZWRTYW1wbGVzX2woTWVkaWFCdWZmZXIgKmJ1ZmZlcik7CisgICAgb2ZmNjRfdCBhZGRTYW1wbGVfbChNZWRpYUJ1ZmZlciAqYnVmZmVyLCBib29sIHVzZVByZWZpeCwgYm9vbCBpc0V4aWYsIHNpemVfdCAqYnl0ZXNXcml0dGVuKTsKKyAgICB2b2lkIGFkZExlbmd0aFByZWZpeGVkU2FtcGxlX2woTWVkaWFCdWZmZXIgKmJ1ZmZlcik7CisgICAgdm9pZCBhZGRNdWx0aXBsZUxlbmd0aFByZWZpeGVkU2FtcGxlc19sKE1lZGlhQnVmZmVyICpidWZmZXIpOworICAgIHVpbnQxNl90IGFkZFByb3BlcnR5X2woY29uc3QgSXRlbVByb3BlcnR5ICYpOworICAgIHVpbnQxNl90IGFkZEl0ZW1fbChjb25zdCBJdGVtSW5mbyAmKTsKKyAgICB2b2lkIGFkZFJlZnNfbCh1aW50MTZfdCBpdGVtSWQsIGNvbnN0IEl0ZW1SZWZzICYpOwogCiAgICAgYm9vbCBleGNlZWRzRmlsZVNpemVMaW1pdCgpOwogICAgIGJvb2wgdXNlMzJCaXRGaWxlT2Zmc2V0KCkgY29uc3Q7CkBAIC0yMzEsMTAgKzI3OSwyMyBAQAogICAgIHZvaWQgZmluaXNoQ3VycmVudFNlc3Npb24oKTsKIAogICAgIHZvaWQgYWRkRGV2aWNlTWV0YSgpOwotICAgIHZvaWQgd3JpdGVIZGxyKCk7CisgICAgdm9pZCB3cml0ZUhkbHIoY29uc3QgY2hhciAqaGFuZGxlclR5cGUpOwogICAgIHZvaWQgd3JpdGVLZXlzKCk7CiAgICAgdm9pZCB3cml0ZUlsc3QoKTsKLSAgICB2b2lkIHdyaXRlTWV0YUJveCgpOworICAgIHZvaWQgd3JpdGVNb292TGV2ZWxNZXRhQm94KCk7CisKKyAgICAvLyBIRUlGIHdyaXRpbmcKKyAgICB2b2lkIHdyaXRlSWxvY0JveCgpOworICAgIHZvaWQgd3JpdGVJbmZlQm94KHVpbnQxNl90IGl0ZW1JZCwgY29uc3QgY2hhciAqdHlwZSwgdWludDMyX3QgZmxhZ3MpOworICAgIHZvaWQgd3JpdGVJaW5mQm94KCk7CisgICAgdm9pZCB3cml0ZUlwY29Cb3goKTsKKyAgICB2b2lkIHdyaXRlSXBtYUJveCgpOworICAgIHZvaWQgd3JpdGVJcHJwQm94KCk7CisgICAgdm9pZCB3cml0ZUlkYXRCb3goKTsKKyAgICB2b2lkIHdyaXRlSXJlZkJveCgpOworICAgIHZvaWQgd3JpdGVQaXRtQm94KCk7CisgICAgdm9pZCB3cml0ZUZpbGVMZXZlbE1ldGFCb3goKTsKKwogICAgIHZvaWQgc2VuZFNlc3Npb25TdW1tYXJ5KCk7CiAgICAgdm9pZCByZWxlYXNlKCk7CiAgICAgc3RhdHVzX3Qgc3dpdGNoRmQoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFBZGFwdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQWRhcHRlci5oCmluZGV4IDM2OWZjZTYuLjU4OWM4MjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFBZGFwdGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUFkYXB0ZXIuaApAQCAtMTcsOCArMTcsOCBAQAogI2lmbmRlZiBNRURJQV9BREFQVEVSX0gKICNkZWZpbmUgTUVESUFfQURBUFRFUl9ICiAKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CkBAIC00MCwxMyArNDAsMTMgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKICAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKIAogICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAvLyBJbmhlcml0ZWQgZnVuY3Rpb25zIGZyb20gTWVkaWFCdWZmZXJPYnNlcnZlcgogICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotICAgIHZpcnR1YWwgdm9pZCBzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlciAqYnVmZmVyKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpOwogCiAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgIC8vIE5vbi1pbmhlcml0ZWQgZnVuY3Rpb25zOgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzQ0MTBkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRURJQV9CVUZGRVJfSF8KLQotI2RlZmluZSBNRURJQV9CVUZGRVJfSF8KLQotI2luY2x1ZGUgPGF0b21pYz4KLSNpbmNsdWRlIDxsaXN0PgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFCdWZmZXJCYXNlLmg+Ci0KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBBQnVmZmVyOwotY2xhc3MgR3JhcGhpY0J1ZmZlcjsKLWNsYXNzIE1lZGlhQnVmZmVyOwotY2xhc3MgTWVkaWFCdWZmZXJPYnNlcnZlcjsKLWNsYXNzIE1ldGFEYXRhOwotCi1jbGFzcyBNZWRpYUJ1ZmZlck9ic2VydmVyIHsKLXB1YmxpYzoKLSAgICBNZWRpYUJ1ZmZlck9ic2VydmVyKCkge30KLSAgICB2aXJ0dWFsIH5NZWRpYUJ1ZmZlck9ic2VydmVyKCkge30KLQotICAgIHZpcnR1YWwgdm9pZCBzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlciAqYnVmZmVyKSA9IDA7Ci0KLXByaXZhdGU6Ci0gICAgTWVkaWFCdWZmZXJPYnNlcnZlcihjb25zdCBNZWRpYUJ1ZmZlck9ic2VydmVyICYpOwotICAgIE1lZGlhQnVmZmVyT2JzZXJ2ZXIgJm9wZXJhdG9yPShjb25zdCBNZWRpYUJ1ZmZlck9ic2VydmVyICYpOwotfTsKLQotY2xhc3MgTWVkaWFCdWZmZXIgOiBwdWJsaWMgTWVkaWFCdWZmZXJCYXNlIHsKLXB1YmxpYzoKLSAgICAvLyBhbGxvY2F0aW9ucyBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byB0aGlzIHdpbGwgdXNlIHNoYXJlZCBtZW1vcnkuCi0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrU2hhcmVkTWVtVGhyZXNob2xkID0gNjQgKiAxMDI0OwotCi0gICAgLy8gVGhlIHVuZGVybHlpbmcgZGF0YSByZW1haW5zIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyIQotICAgIE1lZGlhQnVmZmVyKHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKLQotICAgIGV4cGxpY2l0IE1lZGlhQnVmZmVyKHNpemVfdCBzaXplKTsKLQotICAgIGV4cGxpY2l0IE1lZGlhQnVmZmVyKGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiBncmFwaGljQnVmZmVyKTsKLQotICAgIGV4cGxpY2l0IE1lZGlhQnVmZmVyKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOwotCi0gICAgTWVkaWFCdWZmZXIoY29uc3Qgc3A8SU1lbW9yeT4gJm1lbSkgOgotICAgICAgICBNZWRpYUJ1ZmZlcigodWludDhfdCAqKW1lbS0+cG9pbnRlcigpICsgc2l6ZW9mKFNoYXJlZENvbnRyb2wpLCBtZW0tPnNpemUoKSkgewotICAgICAgICAvLyBkZWxlZ2F0ZSBhbmQgb3ZlcnJpZGUgbU1lbW9yeQotICAgICAgICBtTWVtb3J5ID0gbWVtOwotICAgIH0KLQotICAgIC8vIElmIE1lZGlhQnVmZmVyR3JvdXAgaXMgc2V0LCBkZWNyZW1lbnQgdGhlIGxvY2FsIHJlZmVyZW5jZSBjb3VudDsKLSAgICAvLyBpZiB0aGUgbG9jYWwgcmVmZXJlbmNlIGNvdW50IGRyb3BzIHRvIDAsIHJldHVybiB0aGUgYnVmZmVyIHRvIHRoZQotICAgIC8vIGFzc29jaWF0ZWQgTWVkaWFCdWZmZXJHcm91cC4KLSAgICAvLwotICAgIC8vIElmIG5vIE1lZGlhQnVmZmVyR3JvdXAgaXMgc2V0LCB0aGUgbG9jYWwgcmVmZXJlbmNlIGNvdW50IG11c3QgYmUgemVybwotICAgIC8vIHdoZW4gY2FsbGVkLCB3aGVyZXVwb24gdGhlIE1lZGlhQnVmZmVyIGlzIGRlbGV0ZWQuCi0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2UoKTsKLQotICAgIC8vIEluY3JlbWVudHMgdGhlIGxvY2FsIHJlZmVyZW5jZSBjb3VudC4KLSAgICAvLyBVc2Ugb25seSB3aGVuIE1lZGlhQnVmZmVyR3JvdXAgaXMgc2V0LgotICAgIHZpcnR1YWwgdm9pZCBhZGRfcmVmKCk7Ci0KLSAgICB2b2lkICpkYXRhKCkgY29uc3Q7Ci0gICAgc2l6ZV90IHNpemUoKSBjb25zdDsKLQotICAgIHNpemVfdCByYW5nZV9vZmZzZXQoKSBjb25zdDsKLSAgICBzaXplX3QgcmFuZ2VfbGVuZ3RoKCkgY29uc3Q7Ci0KLSAgICB2b2lkIHNldF9yYW5nZShzaXplX3Qgb2Zmc2V0LCBzaXplX3QgbGVuZ3RoKTsKLQotICAgIHNwPEdyYXBoaWNCdWZmZXI+IGdyYXBoaWNCdWZmZXIoKSBjb25zdDsKLQotICAgIHNwPE1ldGFEYXRhPiBtZXRhX2RhdGEoKTsKLQotICAgIC8vIENsZWFycyBtZXRhIGRhdGEgYW5kIHJlc2V0cyB0aGUgcmFuZ2UgdG8gdGhlIGZ1bGwgZXh0ZW50LgotICAgIHZvaWQgcmVzZXQoKTsKLQotICAgIHZvaWQgc2V0T2JzZXJ2ZXIoTWVkaWFCdWZmZXJPYnNlcnZlciAqZ3JvdXApOwotCi0gICAgLy8gUmV0dXJucyBhIGNsb25lIG9mIHRoaXMgTWVkaWFCdWZmZXIgaW5jcmVhc2luZyBpdHMgcmVmZXJlbmNlIGNvdW50LgotICAgIC8vIFRoZSBjbG9uZSByZWZlcmVuY2VzIHRoZSBzYW1lIGRhdGEgYnV0IGhhcyBpdHMgb3duIHJhbmdlIGFuZAotICAgIC8vIE1ldGFEYXRhLgotICAgIE1lZGlhQnVmZmVyICpjbG9uZSgpOwotCi0gICAgLy8gc3VtIG9mIGxvY2FsUmVmY291bnQoKSBhbmQgcmVtb3RlUmVmY291bnQoKQotICAgIGludCByZWZjb3VudCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIGxvY2FsUmVmY291bnQoKSArIHJlbW90ZVJlZmNvdW50KCk7Ci0gICAgfQotCi0gICAgaW50IGxvY2FsUmVmY291bnQoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtUmVmQ291bnQ7Ci0gICAgfQotCi0gICAgaW50IHJlbW90ZVJlZmNvdW50KCkgY29uc3QgewotICAgICAgICBpZiAobU1lbW9yeS5nZXQoKSA9PSBudWxscHRyIHx8IG1NZW1vcnktPnBvaW50ZXIoKSA9PSBudWxscHRyKSByZXR1cm4gMDsKLSAgICAgICAgaW50MzJfdCByZW1vdGVSZWZjb3VudCA9Ci0gICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxTaGFyZWRDb250cm9sICo+KG1NZW1vcnktPnBvaW50ZXIoKSktPmdldFJlbW90ZVJlZmNvdW50KCk7Ci0gICAgICAgIC8vIFNhbml0eSBjaGVjayBzbyB0aGF0IHJlbW90ZVJlZkNvdW50KCkgaXMgbm9uLW5lZ2F0aXZlLgotICAgICAgICByZXR1cm4gcmVtb3RlUmVmY291bnQgPj0gMCA/IHJlbW90ZVJlZmNvdW50IDogMDsgLy8gZG8gbm90IGFsbG93IGNvcnJ1cHRlZCBkYXRhLgotICAgIH0KLQotICAgIC8vIHJldHVybnMgb2xkIHZhbHVlCi0gICAgaW50IGFkZFJlbW90ZVJlZmNvdW50KGludDMyX3QgdmFsdWUpIHsKLSAgICAgICAgaWYgKG1NZW1vcnkuZ2V0KCkgPT0gbnVsbHB0ciB8fCBtTWVtb3J5LT5wb2ludGVyKCkgPT0gbnVsbHB0cikgcmV0dXJuIDA7Ci0gICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFNoYXJlZENvbnRyb2wgKj4obU1lbW9yeS0+cG9pbnRlcigpKS0+YWRkUmVtb3RlUmVmY291bnQodmFsdWUpOwotICAgIH0KLQotICAgIGJvb2wgaXNEZWFkT2JqZWN0KCkgY29uc3QgewotICAgICAgICByZXR1cm4gaXNEZWFkT2JqZWN0KG1NZW1vcnkpOwotICAgIH0KLQotICAgIHN0YXRpYyBib29sIGlzRGVhZE9iamVjdChjb25zdCBzcDxJTWVtb3J5PiAmbWVtb3J5KSB7Ci0gICAgICAgIGlmIChtZW1vcnkuZ2V0KCkgPT0gbnVsbHB0ciB8fCBtZW1vcnktPnBvaW50ZXIoKSA9PSBudWxscHRyKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFNoYXJlZENvbnRyb2wgKj4obWVtb3J5LT5wb2ludGVyKCkpLT5pc0RlYWRPYmplY3QoKTsKLSAgICB9Ci0KLSAgICAvLyBTdGlja3kgb24gZW5hYmxpbmcgb2Ygc2hhcmVkIG1lbW9yeSBNZWRpYUJ1ZmZlcnMuIEJ5IGRlZmF1bHQgd2UgZG9uJ3QgdXNlCi0gICAgLy8gc2hhcmVkIG1lbW9yeSBmb3IgTWVkaWFCdWZmZXJzLCBidXQgd2UgZW5hYmxlIHRoaXMgZm9yIHRob3NlIHByb2Nlc3NlcwotICAgIC8vIHRoYXQgZXhwb3J0IE1lZGlhQnVmZmVycy4KLSAgICBzdGF0aWMgdm9pZCB1c2VTaGFyZWRNZW1vcnkoKSB7Ci0gICAgICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KAotICAgICAgICAgICAgICAgICZtVXNlU2hhcmVkTWVtb3J5LCAoaW50X2xlYXN0MzJfdCkxLCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKLSAgICB9Ci0KLXByb3RlY3RlZDoKLSAgICAvLyB0cnVlIGlmIE1lZGlhQnVmZmVyIGlzIG9ic2VydmVkIChwYXJ0IG9mIGEgTWVkaWFCdWZmZXJHcm91cCkuCi0gICAgaW5saW5lIGJvb2wgaXNPYnNlcnZlZCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1PYnNlcnZlciAhPSBudWxscHRyOwotICAgIH0KLQotICAgIHZpcnR1YWwgfk1lZGlhQnVmZmVyKCk7Ci0KLSAgICBzcDxJTWVtb3J5PiBtTWVtb3J5OwotCi1wcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBNZWRpYUJ1ZmZlckdyb3VwOwotICAgIGZyaWVuZCBjbGFzcyBPTVhEZWNvZGVyOwotICAgIGZyaWVuZCBjbGFzcyBCbk1lZGlhU291cmNlOwotICAgIGZyaWVuZCBjbGFzcyBCcE1lZGlhU291cmNlOwotCi0gICAgLy8gRm9yIHVzZSBieSBPTVhEZWNvZGVyLCByZWZlcmVuY2UgY291bnQgbXVzdCBiZSAxLCBkcm9wIHJlZmVyZW5jZQotICAgIC8vIGNvdW50IHRvIDAgd2l0aG91dCBzaWduYWxsaW5nIHRoZSBvYnNlcnZlci4KLSAgICB2b2lkIGNsYWltKCk7Ci0KLSAgICBNZWRpYUJ1ZmZlck9ic2VydmVyICptT2JzZXJ2ZXI7Ci0gICAgaW50IG1SZWZDb3VudDsKLQotICAgIHZvaWQgKm1EYXRhOwotICAgIHNpemVfdCBtU2l6ZSwgbVJhbmdlT2Zmc2V0LCBtUmFuZ2VMZW5ndGg7Ci0gICAgc3A8R3JhcGhpY0J1ZmZlcj4gbUdyYXBoaWNCdWZmZXI7Ci0gICAgc3A8QUJ1ZmZlcj4gbUJ1ZmZlcjsKLQotICAgIGJvb2wgbU93bnNEYXRhOwotCi0gICAgc3A8TWV0YURhdGE+IG1NZXRhRGF0YTsKLQotICAgIE1lZGlhQnVmZmVyICptT3JpZ2luYWw7Ci0KLSAgICBzdGF0aWMgc3RkOjphdG9taWNfaW50X2xlYXN0MzJfdCBtVXNlU2hhcmVkTWVtb3J5OwotCi0gICAgTWVkaWFCdWZmZXIoY29uc3QgTWVkaWFCdWZmZXIgJik7Ci0gICAgTWVkaWFCdWZmZXIgJm9wZXJhdG9yPShjb25zdCBNZWRpYUJ1ZmZlciAmKTsKLQotICAgIC8vIFNoYXJlZENvbnRyb2wgYmxvY2sgYXQgdGhlIHN0YXJ0IG9mIElNZW1vcnkuCi0gICAgc3RydWN0IFNoYXJlZENvbnRyb2wgewotICAgICAgICBlbnVtIHsKLSAgICAgICAgICAgIEZMQUdfREVBRF9PQkpFQ1QgPSAoMSA8PCAwKSwKLSAgICAgICAgfTsKLQotICAgICAgICAvLyByZXR1cm5zIG9sZCB2YWx1ZQotICAgICAgICBpbmxpbmUgaW50MzJfdCBhZGRSZW1vdGVSZWZjb3VudChpbnQzMl90IHZhbHVlKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RkOjphdG9taWNfZmV0Y2hfYWRkX2V4cGxpY2l0KAotICAgICAgICAgICAgICAgICAgICAmbVJlbW90ZVJlZmNvdW50LCAoaW50X2xlYXN0MzJfdCl2YWx1ZSwgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbmxpbmUgaW50MzJfdCBnZXRSZW1vdGVSZWZjb3VudCgpIGNvbnN0IHsKLSAgICAgICAgICAgIHJldHVybiBzdGQ6OmF0b21pY19sb2FkX2V4cGxpY2l0KCZtUmVtb3RlUmVmY291bnQsIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5saW5lIHZvaWQgc2V0UmVtb3RlUmVmY291bnQoaW50MzJfdCB2YWx1ZSkgewotICAgICAgICAgICAgc3RkOjphdG9taWNfc3RvcmVfZXhwbGljaXQoCi0gICAgICAgICAgICAgICAgICAgICZtUmVtb3RlUmVmY291bnQsIChpbnRfbGVhc3QzMl90KXZhbHVlLCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlubGluZSBib29sIGlzRGVhZE9iamVjdCgpIGNvbnN0IHsKLSAgICAgICAgICAgIHJldHVybiAoc3RkOjphdG9taWNfbG9hZF9leHBsaWNpdCgKLSAgICAgICAgICAgICAgICAgICAgJm1GbGFncywgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCkgJiBGTEFHX0RFQURfT0JKRUNUKSAhPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5saW5lIHZvaWQgc2V0RGVhZE9iamVjdCgpIHsKLSAgICAgICAgICAgICh2b2lkKXN0ZDo6YXRvbWljX2ZldGNoX29yX2V4cGxpY2l0KAotICAgICAgICAgICAgICAgICAgICAmbUZsYWdzLCAoaW50X2xlYXN0MzJfdClGTEFHX0RFQURfT0JKRUNULCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlubGluZSB2b2lkIGNsZWFyKCkgewotICAgICAgICAgICAgc3RkOjphdG9taWNfc3RvcmVfZXhwbGljaXQoCi0gICAgICAgICAgICAgICAgICAgICZtRmxhZ3MsIChpbnRfbGVhc3QzMl90KTAsIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpOwotICAgICAgICAgICAgc3RkOjphdG9taWNfc3RvcmVfZXhwbGljaXQoCi0gICAgICAgICAgICAgICAgICAgICZtUmVtb3RlUmVmY291bnQsIChpbnRfbGVhc3QzMl90KTAsIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpOwotICAgICAgICB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICAvLyBDYXV0aW9uOiBhdG9taWNfaW50X2Zhc3QzMl90IGlzIDY0IGJpdHMgb24gTFA2NC4KLSAgICAgICAgc3RkOjphdG9taWNfaW50X2xlYXN0MzJfdCBtRmxhZ3M7Ci0gICAgICAgIHN0ZDo6YXRvbWljX2ludF9sZWFzdDMyX3QgbVJlbW90ZVJlZmNvdW50OwotICAgICAgICBpbnQzMl90IHVudXNlZFs2XSBfX2F0dHJpYnV0ZV9fKChfX3VudXNlZF9fKSk7IC8vIGFkZGl0aW9uYWwgYnVmZmVyIHNwYWNlCi0gICAgfTsKLQotICAgIGlubGluZSBTaGFyZWRDb250cm9sICpnZXRTaGFyZWRDb250cm9sKCkgY29uc3QgewotICAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8U2hhcmVkQ29udHJvbCAqPihtTWVtb3J5LT5wb2ludGVyKCkpOwotICAgICB9Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIE1FRElBX0JVRkZFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjFkNDljMWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vLi4vbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uODBlNDliMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vLi4vbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNTE0MDYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRURJQV9CVUZGRVJfR1JPVVBfSF8KLQotI2RlZmluZSBNRURJQV9CVUZGRVJfR1JPVVBfSF8KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIE1lZGlhQnVmZmVyOwotY2xhc3MgTWV0YURhdGE7Ci0KLWNsYXNzIE1lZGlhQnVmZmVyR3JvdXAgOiBwdWJsaWMgTWVkaWFCdWZmZXJPYnNlcnZlciB7Ci1wdWJsaWM6Ci0gICAgTWVkaWFCdWZmZXJHcm91cChzaXplX3QgZ3Jvd3RoTGltaXQgPSAwKTsKLQotICAgIC8vIGNyZWF0ZSBhIG1lZGlhIGJ1ZmZlciBncm91cCB3aXRoIHByZWFsbG9jYXRlZCBidWZmZXJzCi0gICAgTWVkaWFCdWZmZXJHcm91cChzaXplX3QgYnVmZmVycywgc2l6ZV90IGJ1ZmZlcl9zaXplLCBzaXplX3QgZ3Jvd3RoTGltaXQgPSAwKTsKLQotICAgIH5NZWRpYUJ1ZmZlckdyb3VwKCk7Ci0KLSAgICB2b2lkIGFkZF9idWZmZXIoTWVkaWFCdWZmZXIgKmJ1ZmZlcik7Ci0KLSAgICBib29sIGhhc19idWZmZXJzKCk7Ci0KLSAgICAvLyBJZiBub25CbG9ja2luZyBpcyBmYWxzZSwgaXQgYmxvY2tzIHVudGlsIGEgYnVmZmVyIGlzIGF2YWlsYWJsZSBhbmQKLSAgICAvLyBwYXNzZXMgaXQgdG8gdGhlIGNhbGxlciBpbiAqYnVmZmVyLCB3aGlsZSByZXR1cm5pbmcgT0suCi0gICAgLy8gVGhlIHJldHVybmVkIGJ1ZmZlciB3aWxsIGhhdmUgYSByZWZlcmVuY2UgY291bnQgb2YgMS4KLSAgICAvLyBJZiBub25CbG9ja2luZyBpcyB0cnVlIGFuZCBhIGJ1ZmZlciBpcyBub3QgaW1tZWRpYXRlbHkgYXZhaWxhYmxlLAotICAgIC8vIGJ1ZmZlciBpcyBzZXQgdG8gTlVMTCBhbmQgaXQgcmV0dXJucyBXT1VMRF9CTE9DSy4KLSAgICAvLyBJZiByZXF1ZXN0ZWRTaXplIGlzIDAsIGFueSBmcmVlIE1lZGlhQnVmZmVyIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgLy8gSWYgcmVxdWVzdGVkU2l6ZSBpcyA+IDAsIHRoZSByZXR1cm5lZCBNZWRpYUJ1ZmZlciBzaG91bGQgaGF2ZSBidWZmZXIKLSAgICAvLyBzaXplIG9mIGF0IGxlYXN0IHJlcXVzdGVkU2l6ZS4KLSAgICBzdGF0dXNfdCBhY3F1aXJlX2J1ZmZlcigKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBib29sIG5vbkJsb2NraW5nID0gZmFsc2UsIHNpemVfdCByZXF1ZXN0ZWRTaXplID0gMCk7Ci0KLSAgICBzaXplX3QgYnVmZmVycygpIGNvbnN0IHsgcmV0dXJuIG1CdWZmZXJzLnNpemUoKTsgfQotCi0gICAgLy8gSWYgYnVmZmVyIGlzIG51bGxwdHIsIGhhdmUgYWNxdWlyZV9idWZmZXIoKSBjaGVjayBmb3IgcmVtb3RlIHJlbGVhc2UuCi0gICAgdmlydHVhbCB2b2lkIHNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyICpidWZmZXIpOwotCi1wcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBNZWRpYUJ1ZmZlcjsKLQotICAgIE11dGV4IG1Mb2NrOwotICAgIENvbmRpdGlvbiBtQ29uZGl0aW9uOwotICAgIHNpemVfdCBtR3Jvd3RoTGltaXQ7ICAvLyBEbyBub3QgYXV0b21hdGljYWxseSBncm93IGdyb3VwIGxhcmdlciB0aGFuIHRoaXMuCi0gICAgc3RkOjpsaXN0PE1lZGlhQnVmZmVyICo+IG1CdWZmZXJzOwotCi0gICAgTWVkaWFCdWZmZXJHcm91cChjb25zdCBNZWRpYUJ1ZmZlckdyb3VwICYpOwotICAgIE1lZGlhQnVmZmVyR3JvdXAgJm9wZXJhdG9yPShjb25zdCBNZWRpYUJ1ZmZlckdyb3VwICYpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBNRURJQV9CVUZGRVJfR1JPVVBfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMDA5YjNkOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uLy4uL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNsb2NrLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ2xvY2suaAppbmRleCBkZDFhODA5Li4zZGRlYjgyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ2xvY2suaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ2xvY2suaApAQCAtMTgsNyArMTgsOCBAQAogCiAjZGVmaW5lIE1FRElBX0NMT0NLX0hfCiAKLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+CiAjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAKQEAgLTI2LDggKzI3LDE0IEBACiAKIHN0cnVjdCBBTWVzc2FnZTsKIAotc3RydWN0IE1lZGlhQ2xvY2sgOiBwdWJsaWMgUmVmQmFzZSB7CitzdHJ1Y3QgTWVkaWFDbG9jayA6IHB1YmxpYyBBSGFuZGxlciB7CisgICAgZW51bSB7CisgICAgICAgIFRJTUVSX1JFQVNPTl9SRUFDSEVEID0gMCwKKyAgICAgICAgVElNRVJfUkVBU09OX1JFU0VUID0gMSwKKyAgICB9OworCiAgICAgTWVkaWFDbG9jaygpOworICAgIHZvaWQgaW5pdCgpOwogCiAgICAgdm9pZCBzZXRTdGFydGluZ1RpbWVNZWRpYShpbnQ2NF90IHN0YXJ0aW5nVGltZU1lZGlhVXMpOwogCkBAIC01NCwxNSArNjEsNDUgQEAKICAgICAvLyBUaGUgcmVzdWx0IGlzIHNhdmVkIGluIHxvdXRSZWFsVXN8LgogICAgIHN0YXR1c190IGdldFJlYWxUaW1lRm9yKGludDY0X3QgdGFyZ2V0TWVkaWFVcywgaW50NjRfdCAqb3V0UmVhbFVzKSBjb25zdDsKIAorICAgIC8vIHJlcXVlc3QgdG8gc2V0IHVwIGEgdGltZXIuIFRoZSB0YXJnZXQgdGltZSBpcyB8bWVkaWFUaW1lVXN8LCBhZGp1c3RlZCBieQorICAgIC8vIHN5c3RlbSB0aW1lIG9mIHxhZGp1c3RSZWFsVXN8LiBJbiBvdGhlciB3b3JkcywgdGhlIHdha2UgdXAgdGltZSBpcworICAgIC8vIG1lZGlhVGltZVVzICsgKGFkanVzdFJlYWxVcyAvIHBsYXliYWNrUmF0ZSkKKyAgICB2b2lkIGFkZFRpbWVyKGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCBpbnQ2NF90IG1lZGlhVGltZVVzLCBpbnQ2NF90IGFkanVzdFJlYWxVcyA9IDApOworCisgICAgdm9pZCBzZXROb3RpZmljYXRpb25NZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKworICAgIHZvaWQgcmVzZXQoKTsKKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfk1lZGlhQ2xvY2soKTsKIAorICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKIHByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtXaGF0VGltZUlzVXAgPSAndElzVScsCisgICAgfTsKKworICAgIHN0cnVjdCBUaW1lciB7CisgICAgICAgIFRpbWVyKGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCBpbnQ2NF90IG1lZGlhVGltZVVzLCBpbnQ2NF90IGFkanVzdFJlYWxVcyk7CisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiBtTm90aWZ5OworICAgICAgICBpbnQ2NF90IG1NZWRpYVRpbWVVczsKKyAgICAgICAgaW50NjRfdCBtQWRqdXN0UmVhbFVzOworICAgIH07CisKICAgICBzdGF0dXNfdCBnZXRNZWRpYVRpbWVfbCgKICAgICAgICAgICAgIGludDY0X3QgcmVhbFVzLAogICAgICAgICAgICAgaW50NjRfdCAqb3V0TWVkaWFVcywKICAgICAgICAgICAgIGJvb2wgYWxsb3dQYXN0TWF4VGltZSkgY29uc3Q7CiAKKyAgICB2b2lkIHByb2Nlc3NUaW1lcnNfbCgpOworCisgICAgdm9pZCB1cGRhdGVBbmNob3JUaW1lc0FuZFBsYXliYWNrUmF0ZV9sKAorICAgICAgICAgICAgaW50NjRfdCBhbmNob3JUaW1lTWVkaWFVcywgaW50NjRfdCBhbmNob3JUaW1lUmVhbFVzICwgZmxvYXQgcGxheWJhY2tSYXRlKTsKKworICAgIHZvaWQgbm90aWZ5RGlzY29udGludWl0eV9sKCk7CisKKyAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOwogICAgIG11dGFibGUgTXV0ZXggbUxvY2s7CiAKICAgICBpbnQ2NF90IG1BbmNob3JUaW1lTWVkaWFVczsKQEAgLTcyLDYgKzEwOSwxMCBAQAogCiAgICAgZmxvYXQgbVBsYXliYWNrUmF0ZTsKIAorICAgIGludDMyX3QgbUdlbmVyYXRpb247CisgICAgc3RkOjpsaXN0PFRpbWVyPiBtVGltZXJzOworICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5OworCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTWVkaWFDbG9jayk7CiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oCmluZGV4IDEwMzA0MDcuLmFkMDIwMDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oCkBAIC02MSw5ICs2MSwxMSBAQAogICAgIH07CiAKICAgICBlbnVtIEJ1ZmZlckZsYWdzIHsKLSAgICAgICAgQlVGRkVSX0ZMQUdfU1lOQ0ZSQU1FICAgPSAxLAotICAgICAgICBCVUZGRVJfRkxBR19DT0RFQ0NPTkZJRyA9IDIsCi0gICAgICAgIEJVRkZFUl9GTEFHX0VPUyAgICAgICAgID0gNCwKKyAgICAgICAgQlVGRkVSX0ZMQUdfU1lOQ0ZSQU1FICAgICA9IDEsCisgICAgICAgIEJVRkZFUl9GTEFHX0NPREVDQ09ORklHICAgPSAyLAorICAgICAgICBCVUZGRVJfRkxBR19FT1MgICAgICAgICAgID0gNCwKKyAgICAgICAgQlVGRkVSX0ZMQUdfUEFSVElBTF9GUkFNRSA9IDgsCisgICAgICAgIEJVRkZFUl9GTEFHX01VWEVSX0RBVEEgICAgPSAxNiwKICAgICB9OwogCiAgICAgZW51bSB7CkBAIC0xODQsNiArMTg2LDggQEAKIAogICAgIHN0YXR1c190IGdldE5hbWUoQVN0cmluZyAqY29tcG9uZW50TmFtZSkgY29uc3Q7CiAKKyAgICBzdGF0dXNfdCBnZXRDb2RlY0luZm8oc3A8TWVkaWFDb2RlY0luZm8+ICpjb2RlY0luZm8pIGNvbnN0OworCiAgICAgc3RhdHVzX3QgZ2V0TWV0cmljcyhNZWRpYUFuYWx5dGljc0l0ZW0gKiAmcmVwbHkpOwogCiAgICAgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJnBhcmFtcyk7CkBAIC0yMTcsNiArMjIxLDcgQEAKICAgICAgICAgU1RPUFBJTkcsCiAgICAgICAgIFJFTEVBU0lORywKICAgICB9OworICAgIHN0ZDo6c3RyaW5nIHN0YXRlU3RyaW5nKFN0YXRlIHN0YXRlKTsKIAogICAgIGVudW0gewogICAgICAgICBrUG9ydEluZGV4SW5wdXQgICAgICAgICA9IDAsCkBAIC0yNDcsNiArMjUyLDcgQEAKICAgICAgICAga1doYXRSZXF1ZXN0SURSRnJhbWUgICAgICAgICAgICAgICAgPSAncmlkcicsCiAgICAgICAgIGtXaGF0UmVxdWVzdEFjdGl2aXR5Tm90aWZpY2F0aW9uICAgID0gJ3JhY04nLAogICAgICAgICBrV2hhdEdldE5hbWUgICAgICAgICAgICAgICAgICAgICAgICA9ICdnZXROJywKKyAgICAgICAga1doYXRHZXRDb2RlY0luZm8gICAgICAgICAgICAgICAgICAgPSAnZ0NvSScsCiAgICAgICAgIGtXaGF0U2V0UGFyYW1ldGVycyAgICAgICAgICAgICAgICAgID0gJ3NldFAnLAogICAgICAgICBrV2hhdFNldENhbGxiYWNrICAgICAgICAgICAgICAgICAgICA9ICdzZXRDJywKICAgICAgICAga1doYXRTZXROb3RpZmljYXRpb24gICAgICAgICAgICAgICAgPSAnc2V0TicsCkBAIC0zMDcsNiArMzEzLDcgQEAKICAgICBzcDxBTG9vcGVyPiBtQ29kZWNMb29wZXI7CiAgICAgc3A8Q29kZWNCYXNlPiBtQ29kZWM7CiAgICAgQVN0cmluZyBtQ29tcG9uZW50TmFtZTsKKyAgICBzcDxNZWRpYUNvZGVjSW5mbz4gbUNvZGVjSW5mbzsKICAgICBzcDxBUmVwbHlUb2tlbj4gbVJlcGx5SUQ7CiAgICAgdWludDMyX3QgbUZsYWdzOwogICAgIHN0YXR1c190IG1TdGlja3lFcnJvcjsKQEAgLTMxNSw3ICszMjIsOSBAQAogCiAgICAgTWVkaWFBbmFseXRpY3NJdGVtICptQW5hbHl0aWNzSXRlbTsKICAgICB2b2lkIGluaXRBbmFseXRpY3NJdGVtKCk7CisgICAgdm9pZCB1cGRhdGVBbmFseXRpY3NJdGVtKCk7CiAgICAgdm9pZCBmbHVzaEFuYWx5dGljc0l0ZW0oKTsKKyAgICB2b2lkIHVwZGF0ZUVwaGVtZXJhbEFuYWx5dGljcyhNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0pOwogCiAgICAgc3A8QU1lc3NhZ2U+IG1PdXRwdXRGb3JtYXQ7CiAgICAgc3A8QU1lc3NhZ2U+IG1JbnB1dEZvcm1hdDsKQEAgLTMzMyw4ICszNDIsNiBAQAogCiAgICAgLy8gaW5pdGlhbCBjcmVhdGUgcGFyYW1ldGVycwogICAgIEFTdHJpbmcgbUluaXROYW1lOwotICAgIGJvb2wgbUluaXROYW1lSXNUeXBlOwotICAgIGJvb2wgbUluaXRJc0VuY29kZXI7CiAKICAgICAvLyBjb25maWd1cmUgcGFyYW1ldGVyCiAgICAgc3A8QU1lc3NhZ2U+IG1Db25maWd1cmVNc2c7CkBAIC0zNjQsMTkgKzM3MSwyMCBAQAogCiAgICAgYm9vbCBtSGF2ZUlucHV0U3VyZmFjZTsKICAgICBib29sIG1IYXZlUGVuZGluZ0lucHV0QnVmZmVyczsKKyAgICBib29sIG1DcHVCb29zdFJlcXVlc3RlZDsKIAogICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJDaGFubmVsQmFzZT4gbUJ1ZmZlckNoYW5uZWw7CiAKICAgICBNZWRpYUNvZGVjKGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsIHBpZF90IHBpZCwgdWlkX3QgdWlkKTsKIAotICAgIHN0YXRpYyBzcDxDb2RlY0Jhc2U+IEdldENvZGVjQmFzZShjb25zdCBBU3RyaW5nICZuYW1lLCBib29sIG5hbWVJc1R5cGUgPSBmYWxzZSk7CisgICAgc3RhdGljIHNwPENvZGVjQmFzZT4gR2V0Q29kZWNCYXNlKGNvbnN0IEFTdHJpbmcgJm5hbWUpOwogCiAgICAgc3RhdGljIHN0YXR1c190IFBvc3RBbmRBd2FpdFJlc3BvbnNlKAogICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIHNwPEFNZXNzYWdlPiAqcmVzcG9uc2UpOwogCiAgICAgdm9pZCBQb3N0UmVwbHlXaXRoRXJyb3IoY29uc3Qgc3A8QVJlcGx5VG9rZW4+ICZyZXBseUlELCBpbnQzMl90IGVycik7CiAKLSAgICBzdGF0dXNfdCBpbml0KGNvbnN0IEFTdHJpbmcgJm5hbWUsIGJvb2wgbmFtZUlzVHlwZSwgYm9vbCBlbmNvZGVyKTsKKyAgICBzdGF0dXNfdCBpbml0KGNvbnN0IEFTdHJpbmcgJm5hbWUpOwogCiAgICAgdm9pZCBzZXRTdGF0ZShTdGF0ZSBuZXdTdGF0ZSk7CiAgICAgdm9pZCByZXR1cm5CdWZmZXJzVG9Db2RlYyhib29sIGlzUmVjbGFpbSA9IGZhbHNlKTsKQEAgLTQyMCw2ICs0MjgsNyBAQAogCiAgICAgdWludDY0X3QgZ2V0R3JhcGhpY0J1ZmZlclNpemUoKTsKICAgICB2b2lkIGFkZFJlc291cmNlKE1lZGlhUmVzb3VyY2U6OlR5cGUgdHlwZSwgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZSBzdWJ0eXBlLCB1aW50NjRfdCB2YWx1ZSk7CisgICAgdm9pZCByZXF1ZXN0Q3B1Qm9vc3RJZk5lZWRlZCgpOwogCiAgICAgYm9vbCBoYXNQZW5kaW5nQnVmZmVyKGludCBwb3J0SW5kZXgpOwogICAgIGJvb2wgaGFzUGVuZGluZ0J1ZmZlcigpOwpAQCAtNDM4LDYgKzQ0Nyw2MyBAQAogCiAgICAgdm9pZCBvblJlbGVhc2VDcnlwdG8oY29uc3Qgc3A8QU1lc3NhZ2U+JiBtc2cpOwogCisgICAgLy8gbWFuYWdpbmcgdGltZS1vZi1mbGlnaHQgYWthIGxhdGVuY3kKKyAgICB0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgICAgICBpbnQ2NF90IHByZXNlbnRhdGlvblVzOworICAgICAgICAgICAgaW50NjRfdCBzdGFydGVkTnM7CisgICAgfSBCdWZmZXJGbGlnaHRUaW1pbmdfdDsKKyAgICBzdGQ6OmRlcXVlPEJ1ZmZlckZsaWdodFRpbWluZ190PiBtQnVmZmVyc0luRmxpZ2h0OworICAgIE11dGV4IG1MYXRlbmN5TG9jazsKKyAgICBpbnQ2NF90IG1MYXRlbmN5VW5rbm93bjsgICAgLy8gYnVmZmVycyBmb3Igd2hpY2ggd2UgY291bGRuJ3QgY2FsY3VsYXRlIGxhdGVuY3kKKworICAgIHZvaWQgc3RhdHNCdWZmZXJTZW50KGludDY0X3QgcHJlc2VudGF0aW9uVXMpOworICAgIHZvaWQgc3RhdHNCdWZmZXJSZWNlaXZlZChpbnQ2NF90IHByZXNlbnRhdGlvblVzKTsKKworICAgIGVudW0geworICAgICAgICAvLyB0aGUgZGVmYXVsdCBzaGFwZSBvZiBvdXIgbGF0ZW5jeSBoaXN0b2dyYW0gYnVja2V0cworICAgICAgICAvLyBYWFg6IHNob3VsZCB0aGVzZSBiZSBjb25maWd1cmFibGUgaW4gc29tZSB3YXk/CisgICAgICAgIGtMYXRlbmN5SGlzdEJ1Y2tldHMgPSAyMCwKKyAgICAgICAga0xhdGVuY3lIaXN0V2lkdGggPSAyMDAwLAorICAgICAgICBrTGF0ZW5jeUhpc3RGbG9vciA9IDIwMDAsCisKKyAgICAgICAgLy8gaG93IG1hbnkgc2FtcGxlcyBhcmUgaW4gdGhlICdyZWNlbnQgbGF0ZW5jeScgaGlzdG9ncmFtCisgICAgICAgIC8vIDMwMCBmcmFtZXMgPSA1IHNlYyBAIDYwZnBzIG9yIH4xMiBzZWMgQCAyNGZwcworICAgICAgICBrUmVjZW50TGF0ZW5jeUZyYW1lcyA9IDMwMCwKKworICAgICAgICAvLyBob3cgd2UgaW5pdGlhbGl6ZSBtUmVjZW50U2FtcGxlcworICAgICAgICBrUmVjZW50U2FtcGxlSW52YWxpZCA9IC0xLAorICAgIH07CisKKyAgICBpbnQ2NF90IG1SZWNlbnRTYW1wbGVzW2tSZWNlbnRMYXRlbmN5RnJhbWVzXTsKKyAgICBpbnQgbVJlY2VudEhlYWQ7CisgICAgTXV0ZXggbVJlY2VudExvY2s7CisKKyAgICBjbGFzcyBIaXN0b2dyYW0geworICAgICAgcHVibGljOgorICAgICAgICBIaXN0b2dyYW0oKSA6IG1GbG9vcigwKSwgbVdpZHRoKDApLCBtQmVsb3coMCksIG1BYm92ZSgwKSwKKyAgICAgICAgICAgICAgICAgICAgICBtTWluKElOVDY0X01BWCksIG1NYXgoSU5UNjRfTUlOKSwgbVN1bSgwKSwgbUNvdW50KDApLAorICAgICAgICAgICAgICAgICAgICAgIG1CdWNrZXRDb3VudCgwKSwgbUJ1Y2tldHMoTlVMTCkge307CisgICAgICAgIH5IaXN0b2dyYW0oKSB7IGNsZWFyKCk7IH07CisgICAgICAgIHZvaWQgY2xlYXIoKSB7IGlmIChtQnVja2V0cyAhPSBOVUxMKSBmcmVlKG1CdWNrZXRzKTsgbUJ1Y2tldHMgPSBOVUxMOyB9OworICAgICAgICBib29sIHNldHVwKGludCBuYnVja2V0cywgaW50NjRfdCB3aWR0aCwgaW50NjRfdCBmbG9vciA9IDApOworICAgICAgICB2b2lkIGluc2VydChpbnQ2NF90IHNhbXBsZSk7CisgICAgICAgIGludDY0X3QgZ2V0TWluKCkgY29uc3QgeyByZXR1cm4gbU1pbjsgfQorICAgICAgICBpbnQ2NF90IGdldE1heCgpIGNvbnN0IHsgcmV0dXJuIG1NYXg7IH0KKyAgICAgICAgaW50NjRfdCBnZXRDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1Db3VudDsgfQorICAgICAgICBpbnQ2NF90IGdldFN1bSgpIGNvbnN0IHsgcmV0dXJuIG1TdW07IH0KKyAgICAgICAgaW50NjRfdCBnZXRBdmcoKSBjb25zdCB7IHJldHVybiBtU3VtIC8gKG1Db3VudCA9PSAwID8gMSA6IG1Db3VudCk7IH0KKyAgICAgICAgc3RkOjpzdHJpbmcgZW1pdCgpOworICAgICAgcHJpdmF0ZToKKyAgICAgICAgaW50NjRfdCBtRmxvb3IsIG1DZWlsaW5nLCBtV2lkdGg7CisgICAgICAgIGludDY0X3QgbUJlbG93LCBtQWJvdmU7CisgICAgICAgIGludDY0X3QgbU1pbiwgbU1heCwgbVN1bSwgbUNvdW50OworCisgICAgICAgIGludCBtQnVja2V0Q291bnQ7CisgICAgICAgIGludDY0X3QgKm1CdWNrZXRzOworICAgIH07CisKKyAgICBIaXN0b2dyYW0gbUxhdGVuY3lIaXN0OworCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTWVkaWFDb2RlYyk7CiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZjRjMGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaApAQCAtMCwwICsxLDQyMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworI2lmbmRlZiBNRURJQV9DT0RFQ19DT05TVEFOVFNfSF8KKyNkZWZpbmUgTUVESUFfQ09ERUNfQ09OU1RBTlRTX0hfCisKK25hbWVzcGFjZSB7CisKKy8vIGZyb20gTWVkaWFDb2RlY0luZm8uamF2YQorY29uc3RleHByIGludDMyX3QgQVZDUHJvZmlsZUJhc2VsaW5lID0gMHgwMTsKK2NvbnN0ZXhwciBpbnQzMl90IEFWQ1Byb2ZpbGVNYWluICAgICA9IDB4MDI7Citjb25zdGV4cHIgaW50MzJfdCBBVkNQcm9maWxlRXh0ZW5kZWQgPSAweDA0OworY29uc3RleHByIGludDMyX3QgQVZDUHJvZmlsZUhpZ2ggICAgID0gMHgwODsKK2NvbnN0ZXhwciBpbnQzMl90IEFWQ1Byb2ZpbGVIaWdoMTAgICA9IDB4MTA7Citjb25zdGV4cHIgaW50MzJfdCBBVkNQcm9maWxlSGlnaDQyMiAgPSAweDIwOworY29uc3RleHByIGludDMyX3QgQVZDUHJvZmlsZUhpZ2g0NDQgID0gMHg0MDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWQ1Byb2ZpbGVDb25zdHJhaW5lZEJhc2VsaW5lID0gMHgxMDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWQ1Byb2ZpbGVDb25zdHJhaW5lZEhpZ2ggICAgID0gMHg4MDAwMDsKKworY29uc3RleHByIGludDMyX3QgQVZDTGV2ZWwxICAgICAgID0gMHgwMTsKK2NvbnN0ZXhwciBpbnQzMl90IEFWQ0xldmVsMWIgICAgICA9IDB4MDI7Citjb25zdGV4cHIgaW50MzJfdCBBVkNMZXZlbDExICAgICAgPSAweDA0OworY29uc3RleHByIGludDMyX3QgQVZDTGV2ZWwxMiAgICAgID0gMHgwODsKK2NvbnN0ZXhwciBpbnQzMl90IEFWQ0xldmVsMTMgICAgICA9IDB4MTA7Citjb25zdGV4cHIgaW50MzJfdCBBVkNMZXZlbDIgICAgICAgPSAweDIwOworY29uc3RleHByIGludDMyX3QgQVZDTGV2ZWwyMSAgICAgID0gMHg0MDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWQ0xldmVsMjIgICAgICA9IDB4ODA7Citjb25zdGV4cHIgaW50MzJfdCBBVkNMZXZlbDMgICAgICAgPSAweDEwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWQ0xldmVsMzEgICAgICA9IDB4MjAwOworY29uc3RleHByIGludDMyX3QgQVZDTGV2ZWwzMiAgICAgID0gMHg0MDA7Citjb25zdGV4cHIgaW50MzJfdCBBVkNMZXZlbDQgICAgICAgPSAweDgwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWQ0xldmVsNDEgICAgICA9IDB4MTAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWQ0xldmVsNDIgICAgICA9IDB4MjAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWQ0xldmVsNSAgICAgICA9IDB4NDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWQ0xldmVsNTEgICAgICA9IDB4ODAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWQ0xldmVsNTIgICAgICA9IDB4MTAwMDA7CisKK2NvbnN0ZXhwciBpbnQzMl90IEgyNjNQcm9maWxlQmFzZWxpbmUgICAgICAgICAgICAgPSAweDAxOworY29uc3RleHByIGludDMyX3QgSDI2M1Byb2ZpbGVIMzIwQ29kaW5nICAgICAgICAgICA9IDB4MDI7Citjb25zdGV4cHIgaW50MzJfdCBIMjYzUHJvZmlsZUJhY2t3YXJkQ29tcGF0aWJsZSAgID0gMHgwNDsKK2NvbnN0ZXhwciBpbnQzMl90IEgyNjNQcm9maWxlSVNXVjIgICAgICAgICAgICAgICAgPSAweDA4OworY29uc3RleHByIGludDMyX3QgSDI2M1Byb2ZpbGVJU1dWMyAgICAgICAgICAgICAgICA9IDB4MTA7Citjb25zdGV4cHIgaW50MzJfdCBIMjYzUHJvZmlsZUhpZ2hDb21wcmVzc2lvbiAgICAgID0gMHgyMDsKK2NvbnN0ZXhwciBpbnQzMl90IEgyNjNQcm9maWxlSW50ZXJuZXQgICAgICAgICAgICAgPSAweDQwOworY29uc3RleHByIGludDMyX3QgSDI2M1Byb2ZpbGVJbnRlcmxhY2UgICAgICAgICAgICA9IDB4ODA7Citjb25zdGV4cHIgaW50MzJfdCBIMjYzUHJvZmlsZUhpZ2hMYXRlbmN5ICAgICAgICAgID0gMHgxMDA7CisKK2NvbnN0ZXhwciBpbnQzMl90IEgyNjNMZXZlbDEwICAgICAgPSAweDAxOworY29uc3RleHByIGludDMyX3QgSDI2M0xldmVsMjAgICAgICA9IDB4MDI7Citjb25zdGV4cHIgaW50MzJfdCBIMjYzTGV2ZWwzMCAgICAgID0gMHgwNDsKK2NvbnN0ZXhwciBpbnQzMl90IEgyNjNMZXZlbDQwICAgICAgPSAweDA4OworY29uc3RleHByIGludDMyX3QgSDI2M0xldmVsNDUgICAgICA9IDB4MTA7Citjb25zdGV4cHIgaW50MzJfdCBIMjYzTGV2ZWw1MCAgICAgID0gMHgyMDsKK2NvbnN0ZXhwciBpbnQzMl90IEgyNjNMZXZlbDYwICAgICAgPSAweDQwOworY29uc3RleHByIGludDMyX3QgSDI2M0xldmVsNzAgICAgICA9IDB4ODA7CisKK2NvbnN0ZXhwciBpbnQzMl90IE1QRUc0UHJvZmlsZVNpbXBsZSAgICAgICAgICAgICAgPSAweDAxOworY29uc3RleHByIGludDMyX3QgTVBFRzRQcm9maWxlU2ltcGxlU2NhbGFibGUgICAgICA9IDB4MDI7Citjb25zdGV4cHIgaW50MzJfdCBNUEVHNFByb2ZpbGVDb3JlICAgICAgICAgICAgICAgID0gMHgwNDsKK2NvbnN0ZXhwciBpbnQzMl90IE1QRUc0UHJvZmlsZU1haW4gICAgICAgICAgICAgICAgPSAweDA4OworY29uc3RleHByIGludDMyX3QgTVBFRzRQcm9maWxlTmJpdCAgICAgICAgICAgICAgICA9IDB4MTA7Citjb25zdGV4cHIgaW50MzJfdCBNUEVHNFByb2ZpbGVTY2FsYWJsZVRleHR1cmUgICAgID0gMHgyMDsKK2NvbnN0ZXhwciBpbnQzMl90IE1QRUc0UHJvZmlsZVNpbXBsZUZhY2UgICAgICAgICAgPSAweDQwOworY29uc3RleHByIGludDMyX3QgTVBFRzRQcm9maWxlU2ltcGxlRkJBICAgICAgICAgICA9IDB4ODA7Citjb25zdGV4cHIgaW50MzJfdCBNUEVHNFByb2ZpbGVCYXNpY0FuaW1hdGVkICAgICAgID0gMHgxMDA7Citjb25zdGV4cHIgaW50MzJfdCBNUEVHNFByb2ZpbGVIeWJyaWQgICAgICAgICAgICAgID0gMHgyMDA7Citjb25zdGV4cHIgaW50MzJfdCBNUEVHNFByb2ZpbGVBZHZhbmNlZFJlYWxUaW1lICAgID0gMHg0MDA7Citjb25zdGV4cHIgaW50MzJfdCBNUEVHNFByb2ZpbGVDb3JlU2NhbGFibGUgICAgICAgID0gMHg4MDA7Citjb25zdGV4cHIgaW50MzJfdCBNUEVHNFByb2ZpbGVBZHZhbmNlZENvZGluZyAgICAgID0gMHgxMDAwOworY29uc3RleHByIGludDMyX3QgTVBFRzRQcm9maWxlQWR2YW5jZWRDb3JlICAgICAgICA9IDB4MjAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IE1QRUc0UHJvZmlsZUFkdmFuY2VkU2NhbGFibGUgICAgPSAweDQwMDA7Citjb25zdGV4cHIgaW50MzJfdCBNUEVHNFByb2ZpbGVBZHZhbmNlZFNpbXBsZSAgICAgID0gMHg4MDAwOworCitjb25zdGV4cHIgaW50MzJfdCBNUEVHNExldmVsMCAgICAgID0gMHgwMTsKK2NvbnN0ZXhwciBpbnQzMl90IE1QRUc0TGV2ZWwwYiAgICAgPSAweDAyOworY29uc3RleHByIGludDMyX3QgTVBFRzRMZXZlbDEgICAgICA9IDB4MDQ7Citjb25zdGV4cHIgaW50MzJfdCBNUEVHNExldmVsMiAgICAgID0gMHgwODsKK2NvbnN0ZXhwciBpbnQzMl90IE1QRUc0TGV2ZWwzICAgICAgPSAweDEwOworY29uc3RleHByIGludDMyX3QgTVBFRzRMZXZlbDNiICAgICA9IDB4MTg7Citjb25zdGV4cHIgaW50MzJfdCBNUEVHNExldmVsNCAgICAgID0gMHgyMDsKK2NvbnN0ZXhwciBpbnQzMl90IE1QRUc0TGV2ZWw0YSAgICAgPSAweDQwOworY29uc3RleHByIGludDMyX3QgTVBFRzRMZXZlbDUgICAgICA9IDB4ODA7Citjb25zdGV4cHIgaW50MzJfdCBNUEVHNExldmVsNiAgICAgID0gMHgxMDA7CisKK2NvbnN0ZXhwciBpbnQzMl90IE1QRUcyUHJvZmlsZVNpbXBsZSAgICAgICAgICAgICAgPSAweDAwOworY29uc3RleHByIGludDMyX3QgTVBFRzJQcm9maWxlTWFpbiAgICAgICAgICAgICAgICA9IDB4MDE7Citjb25zdGV4cHIgaW50MzJfdCBNUEVHMlByb2ZpbGU0MjIgICAgICAgICAgICAgICAgID0gMHgwMjsKK2NvbnN0ZXhwciBpbnQzMl90IE1QRUcyUHJvZmlsZVNOUiAgICAgICAgICAgICAgICAgPSAweDAzOworY29uc3RleHByIGludDMyX3QgTVBFRzJQcm9maWxlU3BhdGlhbCAgICAgICAgICAgICA9IDB4MDQ7Citjb25zdGV4cHIgaW50MzJfdCBNUEVHMlByb2ZpbGVIaWdoICAgICAgICAgICAgICAgID0gMHgwNTsKKworY29uc3RleHByIGludDMyX3QgTVBFRzJMZXZlbExMICAgICA9IDB4MDA7Citjb25zdGV4cHIgaW50MzJfdCBNUEVHMkxldmVsTUwgICAgID0gMHgwMTsKK2NvbnN0ZXhwciBpbnQzMl90IE1QRUcyTGV2ZWxIMTQgICAgPSAweDAyOworY29uc3RleHByIGludDMyX3QgTVBFRzJMZXZlbEhMICAgICA9IDB4MDM7Citjb25zdGV4cHIgaW50MzJfdCBNUEVHMkxldmVsSFAgICAgID0gMHgwNDsKKworY29uc3RleHByIGludDMyX3QgQUFDT2JqZWN0TWFpbiAgICAgICA9IDE7Citjb25zdGV4cHIgaW50MzJfdCBBQUNPYmplY3RMQyAgICAgICAgID0gMjsKK2NvbnN0ZXhwciBpbnQzMl90IEFBQ09iamVjdFNTUiAgICAgICAgPSAzOworY29uc3RleHByIGludDMyX3QgQUFDT2JqZWN0TFRQICAgICAgICA9IDQ7Citjb25zdGV4cHIgaW50MzJfdCBBQUNPYmplY3RIRSAgICAgICAgID0gNTsKK2NvbnN0ZXhwciBpbnQzMl90IEFBQ09iamVjdFNjYWxhYmxlICAgPSA2OworY29uc3RleHByIGludDMyX3QgQUFDT2JqZWN0RVJMQyAgICAgICA9IDE3OworY29uc3RleHByIGludDMyX3QgQUFDT2JqZWN0RVJTY2FsYWJsZSA9IDIwOworY29uc3RleHByIGludDMyX3QgQUFDT2JqZWN0TEQgICAgICAgICA9IDIzOworY29uc3RleHByIGludDMyX3QgQUFDT2JqZWN0SEVfUFMgICAgICA9IDI5OworY29uc3RleHByIGludDMyX3QgQUFDT2JqZWN0RUxEICAgICAgICA9IDM5OworY29uc3RleHByIGludDMyX3QgQUFDT2JqZWN0WEhFICAgICAgICA9IDQyOworCitjb25zdGV4cHIgaW50MzJfdCBWUDhMZXZlbF9WZXJzaW9uMCA9IDB4MDE7Citjb25zdGV4cHIgaW50MzJfdCBWUDhMZXZlbF9WZXJzaW9uMSA9IDB4MDI7Citjb25zdGV4cHIgaW50MzJfdCBWUDhMZXZlbF9WZXJzaW9uMiA9IDB4MDQ7Citjb25zdGV4cHIgaW50MzJfdCBWUDhMZXZlbF9WZXJzaW9uMyA9IDB4MDg7CisKK2NvbnN0ZXhwciBpbnQzMl90IFZQOFByb2ZpbGVNYWluID0gMHgwMTsKKworY29uc3RleHByIGludDMyX3QgVlA5UHJvZmlsZTAgPSAweDAxOworY29uc3RleHByIGludDMyX3QgVlA5UHJvZmlsZTEgPSAweDAyOworY29uc3RleHByIGludDMyX3QgVlA5UHJvZmlsZTIgPSAweDA0OworY29uc3RleHByIGludDMyX3QgVlA5UHJvZmlsZTMgPSAweDA4OworY29uc3RleHByIGludDMyX3QgVlA5UHJvZmlsZTJIRFIgPSAweDEwMDA7Citjb25zdGV4cHIgaW50MzJfdCBWUDlQcm9maWxlM0hEUiA9IDB4MjAwMDsKKworY29uc3RleHByIGludDMyX3QgVlA5TGV2ZWwxICA9IDB4MTsKK2NvbnN0ZXhwciBpbnQzMl90IFZQOUxldmVsMTEgPSAweDI7Citjb25zdGV4cHIgaW50MzJfdCBWUDlMZXZlbDIgID0gMHg0OworY29uc3RleHByIGludDMyX3QgVlA5TGV2ZWwyMSA9IDB4ODsKK2NvbnN0ZXhwciBpbnQzMl90IFZQOUxldmVsMyAgPSAweDEwOworY29uc3RleHByIGludDMyX3QgVlA5TGV2ZWwzMSA9IDB4MjA7Citjb25zdGV4cHIgaW50MzJfdCBWUDlMZXZlbDQgID0gMHg0MDsKK2NvbnN0ZXhwciBpbnQzMl90IFZQOUxldmVsNDEgPSAweDgwOworY29uc3RleHByIGludDMyX3QgVlA5TGV2ZWw1ICA9IDB4MTAwOworY29uc3RleHByIGludDMyX3QgVlA5TGV2ZWw1MSA9IDB4MjAwOworY29uc3RleHByIGludDMyX3QgVlA5TGV2ZWw1MiA9IDB4NDAwOworY29uc3RleHByIGludDMyX3QgVlA5TGV2ZWw2ICA9IDB4ODAwOworY29uc3RleHByIGludDMyX3QgVlA5TGV2ZWw2MSA9IDB4MTAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IFZQOUxldmVsNjIgPSAweDIwMDA7CisKK2NvbnN0ZXhwciBpbnQzMl90IEhFVkNQcm9maWxlTWFpbiAgICAgICAgPSAweDAxOworY29uc3RleHByIGludDMyX3QgSEVWQ1Byb2ZpbGVNYWluMTAgICAgICA9IDB4MDI7Citjb25zdGV4cHIgaW50MzJfdCBIRVZDUHJvZmlsZU1haW5TdGlsbCAgID0gMHgwNDsKK2NvbnN0ZXhwciBpbnQzMl90IEhFVkNQcm9maWxlTWFpbjEwSERSMTAgPSAweDEwMDA7CisKK2NvbnN0ZXhwciBpbnQzMl90IEhFVkNNYWluVGllckxldmVsMSAgPSAweDE7Citjb25zdGV4cHIgaW50MzJfdCBIRVZDSGlnaFRpZXJMZXZlbDEgID0gMHgyOworY29uc3RleHByIGludDMyX3QgSEVWQ01haW5UaWVyTGV2ZWwyICA9IDB4NDsKK2NvbnN0ZXhwciBpbnQzMl90IEhFVkNIaWdoVGllckxldmVsMiAgPSAweDg7Citjb25zdGV4cHIgaW50MzJfdCBIRVZDTWFpblRpZXJMZXZlbDIxID0gMHgxMDsKK2NvbnN0ZXhwciBpbnQzMl90IEhFVkNIaWdoVGllckxldmVsMjEgPSAweDIwOworY29uc3RleHByIGludDMyX3QgSEVWQ01haW5UaWVyTGV2ZWwzICA9IDB4NDA7Citjb25zdGV4cHIgaW50MzJfdCBIRVZDSGlnaFRpZXJMZXZlbDMgID0gMHg4MDsKK2NvbnN0ZXhwciBpbnQzMl90IEhFVkNNYWluVGllckxldmVsMzEgPSAweDEwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEhFVkNIaWdoVGllckxldmVsMzEgPSAweDIwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEhFVkNNYWluVGllckxldmVsNCAgPSAweDQwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEhFVkNIaWdoVGllckxldmVsNCAgPSAweDgwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEhFVkNNYWluVGllckxldmVsNDEgPSAweDEwMDA7Citjb25zdGV4cHIgaW50MzJfdCBIRVZDSGlnaFRpZXJMZXZlbDQxID0gMHgyMDAwOworY29uc3RleHByIGludDMyX3QgSEVWQ01haW5UaWVyTGV2ZWw1ICA9IDB4NDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEhFVkNIaWdoVGllckxldmVsNSAgPSAweDgwMDA7Citjb25zdGV4cHIgaW50MzJfdCBIRVZDTWFpblRpZXJMZXZlbDUxID0gMHgxMDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEhFVkNIaWdoVGllckxldmVsNTEgPSAweDIwMDAwOworY29uc3RleHByIGludDMyX3QgSEVWQ01haW5UaWVyTGV2ZWw1MiA9IDB4NDAwMDA7Citjb25zdGV4cHIgaW50MzJfdCBIRVZDSGlnaFRpZXJMZXZlbDUyID0gMHg4MDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEhFVkNNYWluVGllckxldmVsNiAgPSAweDEwMDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEhFVkNIaWdoVGllckxldmVsNiAgPSAweDIwMDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEhFVkNNYWluVGllckxldmVsNjEgPSAweDQwMDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEhFVkNIaWdoVGllckxldmVsNjEgPSAweDgwMDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEhFVkNNYWluVGllckxldmVsNjIgPSAweDEwMDAwMDA7Citjb25zdGV4cHIgaW50MzJfdCBIRVZDSGlnaFRpZXJMZXZlbDYyID0gMHgyMDAwMDAwOworCitjb25zdGV4cHIgaW50MzJfdCBEb2xieVZpc2lvblByb2ZpbGVEdmF2UGVyID0gMHgxOworY29uc3RleHByIGludDMyX3QgRG9sYnlWaXNpb25Qcm9maWxlRHZhdlBlbiA9IDB4MjsKK2NvbnN0ZXhwciBpbnQzMl90IERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEZXIgPSAweDQ7Citjb25zdGV4cHIgaW50MzJfdCBEb2xieVZpc2lvblByb2ZpbGVEdmhlRGVuID0gMHg4OworY29uc3RleHByIGludDMyX3QgRG9sYnlWaXNpb25Qcm9maWxlRHZoZUR0ciA9IDB4MTA7Citjb25zdGV4cHIgaW50MzJfdCBEb2xieVZpc2lvblByb2ZpbGVEdmhlU3RuID0gMHgyMDsKK2NvbnN0ZXhwciBpbnQzMl90IERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEdGggPSAweDQwOworY29uc3RleHByIGludDMyX3QgRG9sYnlWaXNpb25Qcm9maWxlRHZoZUR0YiA9IDB4ODA7Citjb25zdGV4cHIgaW50MzJfdCBEb2xieVZpc2lvblByb2ZpbGVEdmhlU3QgPSAweDEwMDsKK2NvbnN0ZXhwciBpbnQzMl90IERvbGJ5VmlzaW9uUHJvZmlsZUR2YXZTZSA9IDB4MjAwOworCitjb25zdGV4cHIgaW50MzJfdCBEb2xieVZpc2lvbkxldmVsSGQyNCAgICA9IDB4MTsKK2NvbnN0ZXhwciBpbnQzMl90IERvbGJ5VmlzaW9uTGV2ZWxIZDMwICAgID0gMHgyOworY29uc3RleHByIGludDMyX3QgRG9sYnlWaXNpb25MZXZlbEZoZDI0ICAgPSAweDQ7Citjb25zdGV4cHIgaW50MzJfdCBEb2xieVZpc2lvbkxldmVsRmhkMzAgICA9IDB4ODsKK2NvbnN0ZXhwciBpbnQzMl90IERvbGJ5VmlzaW9uTGV2ZWxGaGQ2MCAgID0gMHgxMDsKK2NvbnN0ZXhwciBpbnQzMl90IERvbGJ5VmlzaW9uTGV2ZWxVaGQyNCAgID0gMHgyMDsKK2NvbnN0ZXhwciBpbnQzMl90IERvbGJ5VmlzaW9uTGV2ZWxVaGQzMCAgID0gMHg0MDsKK2NvbnN0ZXhwciBpbnQzMl90IERvbGJ5VmlzaW9uTGV2ZWxVaGQ0OCAgID0gMHg4MDsKK2NvbnN0ZXhwciBpbnQzMl90IERvbGJ5VmlzaW9uTGV2ZWxVaGQ2MCAgID0gMHgxMDA7CisKK2NvbnN0ZXhwciBpbnQzMl90IEJJVFJBVEVfTU9ERV9DQlIgPSAyOworY29uc3RleHByIGludDMyX3QgQklUUkFURV9NT0RFX0NRID0gMDsKK2NvbnN0ZXhwciBpbnQzMl90IEJJVFJBVEVfTU9ERV9WQlIgPSAxOworCitjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXQxMmJpdFJHQjQ0NCAgICAgICAgICAgICA9IDM7Citjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXQxNmJpdEFSR0IxNTU1ICAgICAgICAgICA9IDU7Citjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXQxNmJpdEFSR0I0NDQ0ICAgICAgICAgICA9IDQ7Citjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXQxNmJpdEJHUjU2NSAgICAgICAgICAgICA9IDc7Citjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NSAgICAgICAgICAgICA9IDY7Citjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXQxOGJpdEFSR0IxNjY1ICAgICAgICAgICA9IDk7Citjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXQxOEJpdEJHUjY2NiAgICAgICAgICAgICA9IDQxOworY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0MThiaXRSR0I2NjYgICAgICAgICAgICAgPSA4OworY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0MTliaXRBUkdCMTY2NiAgICAgICAgICAgPSAxMDsKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdDI0Qml0QUJHUjY2NjYgICAgICAgICAgID0gNDM7Citjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXQyNGJpdEFSR0IxODg3ICAgICAgICAgICA9IDEzOworY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0MjRCaXRBUkdCNjY2NiAgICAgICAgICAgPSA0MjsKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdDI0Yml0QkdSODg4ICAgICAgICAgICAgID0gMTI7Citjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXQyNGJpdFJHQjg4OCAgICAgICAgICAgICA9IDExOworY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0MjViaXRBUkdCMTg4OCAgICAgICAgICAgPSAxNDsKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdDMyYml0QUJHUjg4ODggICAgICAgICAgID0gMHg3RjAwQTAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdDMyYml0QVJHQjg4ODggICAgICAgICAgID0gMTY7Citjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXQzMmJpdEJHUkE4ODg4ICAgICAgICAgICA9IDE1OworY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0OGJpdFJHQjMzMiAgICAgICAgICAgICAgPSAyOworY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0Q2JZQ3JZICAgICAgICAgICAgICAgICAgPSAyNzsKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdENyWUNiWSAgICAgICAgICAgICAgICAgID0gMjg7Citjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXRMMTYgICAgICAgICAgICAgICAgICAgICA9IDM2OworY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0TDIgICAgICAgICAgICAgICAgICAgICAgPSAzMzsKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdEwyNCAgICAgICAgICAgICAgICAgICAgID0gMzc7Citjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXRMMzIgICAgICAgICAgICAgICAgICAgICA9IDM4OworY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0TDQgICAgICAgICAgICAgICAgICAgICAgPSAzNDsKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdEw4ICAgICAgICAgICAgICAgICAgICAgID0gMzU7Citjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXRNb25vY2hyb21lICAgICAgICAgICAgICA9IDE7Citjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXRSYXdCYXllcjEwYml0ICAgICAgICAgICA9IDMxOworY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0UmF3QmF5ZXI4Yml0ICAgICAgICAgICAgPSAzMDsKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdFJhd0JheWVyOGJpdGNvbXByZXNzZWQgID0gMzI7Citjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXRSR0JBRmxleGlibGUgICAgICAgICAgICA9IDB4N0YzNkE4ODg7Citjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXRSR0JGbGV4aWJsZSAgICAgICAgICAgICA9IDB4N0YzNkI4ODg7Citjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXRTdXJmYWNlICAgICAgICAgICAgICAgICA9IDB4N0YwMDA3ODk7Citjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXRZQ2JZQ3IgICAgICAgICAgICAgICAgICA9IDI1OworY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0WUNyWUNiICAgICAgICAgICAgICAgICAgPSAyNjsKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdFlVVjQxMVBhY2tlZFBsYW5hciAgICAgID0gMTg7Citjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXRZVVY0MTFQbGFuYXIgICAgICAgICAgICA9IDE3OworY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGUgICAgICAgICAgPSAweDdGNDIwODg4OworY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkUGxhbmFyICAgICAgPSAyMDsKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIgID0gMzk7Citjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIgICAgICAgICAgICA9IDE5OworY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hciAgICAgICAgPSAyMTsKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdFlVVjQyMkZsZXhpYmxlICAgICAgICAgID0gMHg3RjQyMjg4ODsKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdFlVVjQyMlBhY2tlZFBsYW5hciAgICAgID0gMjM7Citjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXRZVVY0MjJQYWNrZWRTZW1pUGxhbmFyICA9IDQwOworY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0WVVWNDIyUGxhbmFyICAgICAgICAgICAgPSAyMjsKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdFlVVjQyMlNlbWlQbGFuYXIgICAgICAgID0gMjQ7Citjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXRZVVY0NDRGbGV4aWJsZSAgICAgICAgICA9IDB4N0Y0NDQ4ODg7Citjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXRZVVY0NDRJbnRlcmxlYXZlZCAgICAgICA9IDI5OworY29uc3RleHByIGludDMyX3QgQ09MT1JfUUNPTV9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyICAgPSAweDdmYTMwYzAwOworY29uc3RleHByIGludDMyX3QgQ09MT1JfVElfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hciA9IDB4N2YwMDAxMDA7CisKK2NvbnN0ZXhwciBjaGFyIEZFQVRVUkVfQWRhcHRpdmVQbGF5YmFja1tdICAgICAgID0gImFkYXB0aXZlLXBsYXliYWNrIjsKK2NvbnN0ZXhwciBjaGFyIEZFQVRVUkVfSW50cmFSZWZyZXNoW10gPSAiaW50cmEtcmVmcmVzaCI7Citjb25zdGV4cHIgY2hhciBGRUFUVVJFX1BhcnRpYWxGcmFtZVtdID0gInBhcnRpYWwtZnJhbWUiOworY29uc3RleHByIGNoYXIgRkVBVFVSRV9TZWN1cmVQbGF5YmFja1tdICAgICAgICAgPSAic2VjdXJlLXBsYXliYWNrIjsKK2NvbnN0ZXhwciBjaGFyIEZFQVRVUkVfVHVubmVsZWRQbGF5YmFja1tdICAgICAgID0gInR1bm5lbGVkLXBsYXliYWNrIjsKKworLy8gZnJvbSBNZWRpYUZvcm1hdC5qYXZhCitjb25zdGV4cHIgY2hhciBNSU1FVFlQRV9WSURFT19WUDhbXSA9ICJ2aWRlby94LXZuZC5vbjIudnA4IjsKK2NvbnN0ZXhwciBjaGFyIE1JTUVUWVBFX1ZJREVPX1ZQOVtdID0gInZpZGVvL3gtdm5kLm9uMi52cDkiOworY29uc3RleHByIGNoYXIgTUlNRVRZUEVfVklERU9fQVZDW10gPSAidmlkZW8vYXZjIjsKK2NvbnN0ZXhwciBjaGFyIE1JTUVUWVBFX1ZJREVPX0hFVkNbXSA9ICJ2aWRlby9oZXZjIjsKK2NvbnN0ZXhwciBjaGFyIE1JTUVUWVBFX1ZJREVPX01QRUc0W10gPSAidmlkZW8vbXA0di1lcyI7Citjb25zdGV4cHIgY2hhciBNSU1FVFlQRV9WSURFT19IMjYzW10gPSAidmlkZW8vM2dwcCI7Citjb25zdGV4cHIgY2hhciBNSU1FVFlQRV9WSURFT19NUEVHMltdID0gInZpZGVvL21wZWcyIjsKK2NvbnN0ZXhwciBjaGFyIE1JTUVUWVBFX1ZJREVPX1JBV1tdID0gInZpZGVvL3JhdyI7Citjb25zdGV4cHIgY2hhciBNSU1FVFlQRV9WSURFT19ET0xCWV9WSVNJT05bXSA9ICJ2aWRlby9kb2xieS12aXNpb24iOworY29uc3RleHByIGNoYXIgTUlNRVRZUEVfVklERU9fU0NSQU1CTEVEW10gPSAidmlkZW8vc2NyYW1ibGVkIjsKKworY29uc3RleHByIGNoYXIgTUlNRVRZUEVfQVVESU9fQU1SX05CW10gPSAiYXVkaW8vM2dwcCI7Citjb25zdGV4cHIgY2hhciBNSU1FVFlQRV9BVURJT19BTVJfV0JbXSA9ICJhdWRpby9hbXItd2IiOworY29uc3RleHByIGNoYXIgTUlNRVRZUEVfQVVESU9fTVBFR1tdID0gImF1ZGlvL21wZWciOworY29uc3RleHByIGNoYXIgTUlNRVRZUEVfQVVESU9fQUFDW10gPSAiYXVkaW8vbXA0YS1sYXRtIjsKK2NvbnN0ZXhwciBjaGFyIE1JTUVUWVBFX0FVRElPX1FDRUxQW10gPSAiYXVkaW8vcWNlbHAiOworY29uc3RleHByIGNoYXIgTUlNRVRZUEVfQVVESU9fVk9SQklTW10gPSAiYXVkaW8vdm9yYmlzIjsKK2NvbnN0ZXhwciBjaGFyIE1JTUVUWVBFX0FVRElPX09QVVNbXSA9ICJhdWRpby9vcHVzIjsKK2NvbnN0ZXhwciBjaGFyIE1JTUVUWVBFX0FVRElPX0c3MTFfQUxBV1tdID0gImF1ZGlvL2c3MTEtYWxhdyI7Citjb25zdGV4cHIgY2hhciBNSU1FVFlQRV9BVURJT19HNzExX01MQVdbXSA9ICJhdWRpby9nNzExLW1sYXciOworY29uc3RleHByIGNoYXIgTUlNRVRZUEVfQVVESU9fUkFXW10gPSAiYXVkaW8vcmF3IjsKK2NvbnN0ZXhwciBjaGFyIE1JTUVUWVBFX0FVRElPX0ZMQUNbXSA9ICJhdWRpby9mbGFjIjsKK2NvbnN0ZXhwciBjaGFyIE1JTUVUWVBFX0FVRElPX01TR1NNW10gPSAiYXVkaW8vZ3NtIjsKK2NvbnN0ZXhwciBjaGFyIE1JTUVUWVBFX0FVRElPX0FDM1tdID0gImF1ZGlvL2FjMyI7Citjb25zdGV4cHIgY2hhciBNSU1FVFlQRV9BVURJT19FQUMzW10gPSAiYXVkaW8vZWFjMyI7Citjb25zdGV4cHIgY2hhciBNSU1FVFlQRV9BVURJT19TQ1JBTUJMRURbXSA9ICJhdWRpby9zY3JhbWJsZWQiOworCitjb25zdGV4cHIgY2hhciBNSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUNbXSA9ICJpbWFnZS92bmQuYW5kcm9pZC5oZWljIjsKKworY29uc3RleHByIGNoYXIgTUlNRVRZUEVfVEVYVF9DRUFfNjA4W10gPSAidGV4dC9jZWEtNjA4IjsKK2NvbnN0ZXhwciBjaGFyIE1JTUVUWVBFX1RFWFRfQ0VBXzcwOFtdID0gInRleHQvY2VhLTcwOCI7Citjb25zdGV4cHIgY2hhciBNSU1FVFlQRV9URVhUX1NVQlJJUFtdID0gImFwcGxpY2F0aW9uL3gtc3VicmlwIjsKK2NvbnN0ZXhwciBjaGFyIE1JTUVUWVBFX1RFWFRfVlRUW10gPSAidGV4dC92dHQiOworCitjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9SQU5HRV9GVUxMID0gMTsKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX1JBTkdFX0xJTUlURUQgPSAyOworY29uc3RleHByIGludDMyX3QgQ09MT1JfU1RBTkRBUkRfQlQyMDIwID0gNjsKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX1NUQU5EQVJEX0JUNjAxX05UU0MgPSA0OworY29uc3RleHByIGludDMyX3QgQ09MT1JfU1RBTkRBUkRfQlQ2MDFfUEFMID0gMjsKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX1NUQU5EQVJEX0JUNzA5ID0gMTsKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX1RSQU5TRkVSX0hMRyA9IDc7Citjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9UUkFOU0ZFUl9MSU5FQVIgPSAxOworY29uc3RleHByIGludDMyX3QgQ09MT1JfVFJBTlNGRVJfU0RSX1ZJREVPID0gMzsKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX1RSQU5TRkVSX1NUMjA4NCA9IDY7CisKK2NvbnN0ZXhwciBjaGFyIEtFWV9BQUNfRFJDX0FUVEVOVUFUSU9OX0ZBQ1RPUltdID0gImFhYy1kcmMtY3V0LWxldmVsIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9BQUNfRFJDX0JPT1NUX0ZBQ1RPUltdID0gImFhYy1kcmMtYm9vc3QtbGV2ZWwiOworY29uc3RleHByIGNoYXIgS0VZX0FBQ19EUkNfRUZGRUNUX1RZUEVbXSA9ICJhYWMtZHJjLWVmZmVjdC10eXBlIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9BQUNfRFJDX0hFQVZZX0NPTVBSRVNTSU9OW10gPSAiYWFjLWRyYy1oZWF2eS1jb21wcmVzc2lvbiI7Citjb25zdGV4cHIgY2hhciBLRVlfQUFDX0RSQ19UQVJHRVRfUkVGRVJFTkNFX0xFVkVMW10gPSAiYWFjLXRhcmdldC1yZWYtbGV2ZWwiOworY29uc3RleHByIGNoYXIgS0VZX0FBQ19FTkNPREVEX1RBUkdFVF9MRVZFTFtdID0gImFhYy1lbmNvZGVkLXRhcmdldC1sZXZlbCI7Citjb25zdGV4cHIgY2hhciBLRVlfQUFDX01BWF9PVVRQVVRfQ0hBTk5FTF9DT1VOVFtdID0gImFhYy1tYXgtb3V0cHV0LWNoYW5uZWxfY291bnQiOworY29uc3RleHByIGNoYXIgS0VZX0FBQ19QUk9GSUxFW10gPSAiYWFjLXByb2ZpbGUiOworY29uc3RleHByIGNoYXIgS0VZX0FBQ19TQlJfTU9ERVtdID0gImFhYy1zYnItbW9kZSI7Citjb25zdGV4cHIgY2hhciBLRVlfQVVESU9fU0VTU0lPTl9JRFtdID0gImF1ZGlvLXNlc3Npb24taWQiOworY29uc3RleHByIGNoYXIgS0VZX0JJVF9SQVRFW10gPSAiYml0cmF0ZSI7Citjb25zdGV4cHIgY2hhciBLRVlfQklUUkFURV9NT0RFW10gPSAiYml0cmF0ZS1tb2RlIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9DQV9TRVNTSU9OX0lEW10gPSAiY2Etc2Vzc2lvbi1pZCI7Citjb25zdGV4cHIgY2hhciBLRVlfQ0FfU1lTVEVNX0lEW10gPSAiY2Etc3lzdGVtLWlkIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9DQVBUVVJFX1JBVEVbXSA9ICJjYXB0dXJlLXJhdGUiOworY29uc3RleHByIGNoYXIgS0VZX0NIQU5ORUxfQ09VTlRbXSA9ICJjaGFubmVsLWNvdW50IjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9DSEFOTkVMX01BU0tbXSA9ICJjaGFubmVsLW1hc2siOworY29uc3RleHByIGNoYXIgS0VZX0NPTE9SX0ZPUk1BVFtdID0gImNvbG9yLWZvcm1hdCI7Citjb25zdGV4cHIgY2hhciBLRVlfQ09MT1JfUkFOR0VbXSA9ICJjb2xvci1yYW5nZSI7Citjb25zdGV4cHIgY2hhciBLRVlfQ09MT1JfU1RBTkRBUkRbXSA9ICJjb2xvci1zdGFuZGFyZCI7Citjb25zdGV4cHIgY2hhciBLRVlfQ09MT1JfVFJBTlNGRVJbXSA9ICJjb2xvci10cmFuc2ZlciI7Citjb25zdGV4cHIgY2hhciBLRVlfQ09NUExFWElUWVtdID0gImNvbXBsZXhpdHkiOworY29uc3RleHByIGNoYXIgS0VZX0RVUkFUSU9OW10gPSAiZHVyYXRpb25VcyI7Citjb25zdGV4cHIgY2hhciBLRVlfRkVBVFVSRV9bXSA9ICJmZWF0dXJlLSI7Citjb25zdGV4cHIgY2hhciBLRVlfRkxBQ19DT01QUkVTU0lPTl9MRVZFTFtdID0gImZsYWMtY29tcHJlc3Npb24tbGV2ZWwiOworY29uc3RleHByIGNoYXIgS0VZX0ZSQU1FX1JBVEVbXSA9ICJmcmFtZS1yYXRlIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9HUklEX0NPTFVNTlNbXSA9ICJncmlkLWNvbHMiOworY29uc3RleHByIGNoYXIgS0VZX0dSSURfUk9XU1tdID0gImdyaWQtcm93cyI7Citjb25zdGV4cHIgY2hhciBLRVlfSERSX1NUQVRJQ19JTkZPW10gPSAiaGRyLXN0YXRpYy1pbmZvIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9IRUlHSFRbXSA9ICJoZWlnaHQiOworY29uc3RleHByIGNoYXIgS0VZX0lfRlJBTUVfSU5URVJWQUxbXSA9ICJpLWZyYW1lLWludGVydmFsIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9JTlRSQV9SRUZSRVNIX1BFUklPRFtdID0gImludHJhLXJlZnJlc2gtcGVyaW9kIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9JU19BRFRTW10gPSAiaXMtYWR0cyI7Citjb25zdGV4cHIgY2hhciBLRVlfSVNfQVVUT1NFTEVDVFtdID0gImlzLWF1dG9zZWxlY3QiOworY29uc3RleHByIGNoYXIgS0VZX0lTX0RFRkFVTFRbXSA9ICJpcy1kZWZhdWx0IjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9JU19GT1JDRURfU1VCVElUTEVbXSA9ICJpcy1mb3JjZWQtc3VidGl0bGUiOworY29uc3RleHByIGNoYXIgS0VZX0lTX1RJTUVEX1RFWFRbXSA9ICJpcy10aW1lZC10ZXh0IjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9MQU5HVUFHRVtdID0gImxhbmd1YWdlIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9MQVRFTkNZW10gPSAibGF0ZW5jeSI7Citjb25zdGV4cHIgY2hhciBLRVlfTEVWRUxbXSA9ICJsZXZlbCI7Citjb25zdGV4cHIgY2hhciBLRVlfTUFYX0JJVF9SQVRFW10gPSAibWF4LWJpdHJhdGUiOworY29uc3RleHByIGNoYXIgS0VZX01BWF9IRUlHSFRbXSA9ICJtYXgtaGVpZ2h0IjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9NQVhfSU5QVVRfU0laRVtdID0gIm1heC1pbnB1dC1zaXplIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9NQVhfV0lEVEhbXSA9ICJtYXgtd2lkdGgiOworY29uc3RleHByIGNoYXIgS0VZX01JTUVbXSA9ICJtaW1lIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9PUEVSQVRJTkdfUkFURVtdID0gIm9wZXJhdGluZy1yYXRlIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9PVVRQVVRfUkVPUkRFUl9ERVBUSFtdID0gIm91dHB1dC1yZW9yZGVyLWRlcHRoIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9QQ01fRU5DT0RJTkdbXSA9ICJwY20tZW5jb2RpbmciOworY29uc3RleHByIGNoYXIgS0VZX1BSSU9SSVRZW10gPSAicHJpb3JpdHkiOworY29uc3RleHByIGNoYXIgS0VZX1BST0ZJTEVbXSA9ICJwcm9maWxlIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9QVVNIX0JMQU5LX0JVRkZFUlNfT05fU1RPUFtdID0gInB1c2gtYmxhbmstYnVmZmVycy1vbi1zaHV0ZG93biI7Citjb25zdGV4cHIgY2hhciBLRVlfUVVBTElUWVtdID0gInF1YWxpdHkiOworY29uc3RleHByIGNoYXIgS0VZX1JFUEVBVF9QUkVWSU9VU19GUkFNRV9BRlRFUltdID0gInJlcGVhdC1wcmV2aW91cy1mcmFtZS1hZnRlciI7Citjb25zdGV4cHIgY2hhciBLRVlfUk9UQVRJT05bXSA9ICJyb3RhdGlvbi1kZWdyZWVzIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9TQU1QTEVfUkFURVtdID0gInNhbXBsZS1yYXRlIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9TTElDRV9IRUlHSFRbXSA9ICJzbGljZS1oZWlnaHQiOworY29uc3RleHByIGNoYXIgS0VZX1NUUklERVtdID0gInN0cmlkZSI7Citjb25zdGV4cHIgY2hhciBLRVlfVEVNUE9SQUxfTEFZRVJJTkdbXSA9ICJ0cy1zY2hlbWEiOworY29uc3RleHByIGNoYXIgS0VZX1RJTEVfSEVJR0hUW10gPSAidGlsZS1oZWlnaHQiOworY29uc3RleHByIGNoYXIgS0VZX1RJTEVfV0lEVEhbXSA9ICJ0aWxlLXdpZHRoIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9UUkFDS19JRFtdID0gInRyYWNrLWlkIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9XSURUSFtdID0gIndpZHRoIjsKKworLy8gZnJvbSBNZWRpYUNvZGVjLmphdmEKK2NvbnN0ZXhwciBpbnQzMl90IEVSUk9SX0lOU1VGRklDSUVOVF9PVVRQVVRfUFJPVEVDVElPTiA9IDQ7Citjb25zdGV4cHIgaW50MzJfdCBFUlJPUl9JTlNVRkZJQ0lFTlRfUkVTT1VSQ0UgPSAxMTAwOworY29uc3RleHByIGludDMyX3QgRVJST1JfS0VZX0VYUElSRUQgPSAyOworY29uc3RleHByIGludDMyX3QgRVJST1JfTk9fS0VZID0gMTsKK2NvbnN0ZXhwciBpbnQzMl90IEVSUk9SX1JFQ0xBSU1FRCA9IDExMDE7Citjb25zdGV4cHIgaW50MzJfdCBFUlJPUl9SRVNPVVJDRV9CVVNZID0gMzsKK2NvbnN0ZXhwciBpbnQzMl90IEVSUk9SX1NFU1NJT05fTk9UX09QRU5FRCA9IDU7Citjb25zdGV4cHIgaW50MzJfdCBFUlJPUl9VTlNVUFBPUlRFRF9PUEVSQVRJT04gPSA2OworY29uc3RleHByIGNoYXIgQ09ERUNbXSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuY29kZWMiOworY29uc3RleHByIGNoYXIgRU5DT0RFUltdID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5lbmNvZGVyIjsKK2NvbnN0ZXhwciBjaGFyIEhFSUdIVFtdID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5oZWlnaHQiOworY29uc3RleHByIGNoYXIgTUlNRV9UWVBFW10gPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLm1pbWUiOworY29uc3RleHByIGNoYXIgTU9ERVtdID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5tb2RlIjsKK2NvbnN0ZXhwciBjaGFyIE1PREVfQVVESU9bXSA9ICJhdWRpbyI7Citjb25zdGV4cHIgY2hhciBNT0RFX1ZJREVPW10gPSAidmlkZW8iOworY29uc3RleHByIGNoYXIgUk9UQVRJT05bXSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMucm90YXRpb24iOworY29uc3RleHByIGNoYXIgU0VDVVJFW10gPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLnNlY3VyZSI7Citjb25zdGV4cHIgY2hhciBXSURUSFtdID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy53aWR0aCI7CisKK2NvbnN0ZXhwciBpbnQzMl90IEJVRkZFUl9GTEFHX0NPREVDX0NPTkZJRyA9IDI7Citjb25zdGV4cHIgaW50MzJfdCBCVUZGRVJfRkxBR19FTkRfT0ZfU1RSRUFNID0gNDsKK2NvbnN0ZXhwciBpbnQzMl90IEJVRkZFUl9GTEFHX0tFWV9GUkFNRSA9IDE7Citjb25zdGV4cHIgaW50MzJfdCBCVUZGRVJfRkxBR19QQVJUSUFMX0ZSQU1FID0gODsKK2NvbnN0ZXhwciBpbnQzMl90IEJVRkZFUl9GTEFHX1NZTkNfRlJBTUUgPSAxOworY29uc3RleHByIGludDMyX3QgQ09ORklHVVJFX0ZMQUdfRU5DT0RFID0gMTsKK2NvbnN0ZXhwciBpbnQzMl90IENSWVBUT19NT0RFX0FFU19DQkMgICAgID0gMjsKK2NvbnN0ZXhwciBpbnQzMl90IENSWVBUT19NT0RFX0FFU19DVFIgICAgID0gMTsKK2NvbnN0ZXhwciBpbnQzMl90IENSWVBUT19NT0RFX1VORU5DUllQVEVEID0gMDsKK2NvbnN0ZXhwciBpbnQzMl90IElORk9fT1VUUFVUX0JVRkZFUlNfQ0hBTkdFRCA9IC0zOworY29uc3RleHByIGludDMyX3QgSU5GT19PVVRQVVRfRk9STUFUX0NIQU5HRUQgID0gLTI7Citjb25zdGV4cHIgaW50MzJfdCBJTkZPX1RSWV9BR0FJTl9MQVRFUiAgICAgICAgPSAtMTsKK2NvbnN0ZXhwciBpbnQzMl90IFZJREVPX1NDQUxJTkdfTU9ERV9TQ0FMRV9UT19GSVQgICAgICAgICAgICAgICA9IDE7Citjb25zdGV4cHIgaW50MzJfdCBWSURFT19TQ0FMSU5HX01PREVfU0NBTEVfVE9fRklUX1dJVEhfQ1JPUFBJTkcgPSAyOworY29uc3RleHByIGNoYXIgUEFSQU1FVEVSX0tFWV9SRVFVRVNUX1NZTkNfRlJBTUVbXSA9ICJyZXF1ZXN0LXN5bmMiOworY29uc3RleHByIGNoYXIgUEFSQU1FVEVSX0tFWV9TVVNQRU5EW10gPSAiZHJvcC1pbnB1dC1mcmFtZXMiOworY29uc3RleHByIGNoYXIgUEFSQU1FVEVSX0tFWV9WSURFT19CSVRSQVRFW10gPSAidmlkZW8tYml0cmF0ZSI7CisKK30KKworI2VuZGlmICAvLyBNRURJQV9DT0RFQ19DT05TVEFOVFNfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oCmluZGV4IGYyYmQ0OTYuLmU0NGIwYTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmgKQEAgLTE4LDggKzE4LDExIEBACiAKICNkZWZpbmUgTUVESUFfQ09ERUNfTElTVF9IXwogCisjaW5jbHVkZSA8dmVjdG9yPgorCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0V3JpdGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhQ29kZWNMaXN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0luZm8uaD4KIApAQCAtMzUsOCArMzgsNiBAQAogCiBzdHJ1Y3QgQU1lc3NhZ2U7CiAKLXN0cnVjdCBNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlOwotCiBzdHJ1Y3QgTWVkaWFDb2RlY0xpc3QgOiBwdWJsaWMgQm5NZWRpYUNvZGVjTGlzdCB7CiAgICAgc3RhdGljIHNwPElNZWRpYUNvZGVjTGlzdD4gZ2V0SW5zdGFuY2UoKTsKIApAQCAtNzIsOCArNzMsNyBAQAogICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZSwKICAgICAgICAgICAgIGJvb2wgY3JlYXRlRW5jb2RlciwKICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAotICAgICAgICAgICAgVmVjdG9yPEFTdHJpbmc+ICptYXRjaGluZ0NvZGVjcywKLSAgICAgICAgICAgIFZlY3RvcjxBU3RyaW5nPiAqb3duZXJzID0gbnVsbHB0cik7CisgICAgICAgICAgICBWZWN0b3I8QVN0cmluZz4gKm1hdGNoaW5nQ29kZWNzKTsKIAogICAgIHN0YXRpYyBib29sIGlzU29mdHdhcmVDb2RlYyhjb25zdCBBU3RyaW5nICZjb21wb25lbnROYW1lKTsKIApAQCAtOTQsOSArOTQsOSBAQAogCiAgICAgLyoqCiAgICAgICogVGhpcyBjb25zdHJ1Y3RvciB3aWxsIGNhbGwgYGJ1aWxkTWVkaWFDb2RlY0xpc3QoKWAgZnJvbSB0aGUgZ2l2ZW4KLSAgICAgKiBgTWVkaWFDb2RlY0xpc3RCdWlsZGVyQmFzZWAgb2JqZWN0LgorICAgICAqIGBNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlYCBvYmplY3RzLgogICAgICAqLwotICAgIE1lZGlhQ29kZWNMaXN0KE1lZGlhQ29kZWNMaXN0QnVpbGRlckJhc2UqIGJ1aWxkZXIpOworICAgIE1lZGlhQ29kZWNMaXN0KHN0ZDo6dmVjdG9yPE1lZGlhQ29kZWNMaXN0QnVpbGRlckJhc2UqPiBidWlsZGVycyk7CiAKICAgICB+TWVkaWFDb2RlY0xpc3QoKTsKIApAQCAtMTA0LDY2ICsxMDQsNiBAQAogCiAgICAgTWVkaWFDb2RlY0xpc3QoY29uc3QgTWVkaWFDb2RlY0xpc3QmKSA9IGRlbGV0ZTsKICAgICBNZWRpYUNvZGVjTGlzdCYgb3BlcmF0b3I9KGNvbnN0IE1lZGlhQ29kZWNMaXN0JikgPSBkZWxldGU7Ci0KLSAgICBmcmllbmQgTWVkaWFDb2RlY0xpc3RXcml0ZXI7Ci19OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdG8gYmUgdXNlZCBieSBhIGBNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlYCBpbnN0YW5jZSB0byBhZGQKLSAqIGluZm9ybWF0aW9uIHRvIHRoZSBhc3NvY2lhdGVkIGBNZWRpYUNvZGVjTGlzdGAgb2JqZWN0LgotICovCi1zdHJ1Y3QgTWVkaWFDb2RlY0xpc3RXcml0ZXIgewotICAgIC8qKgotICAgICAqIEFkZCBhIGtleS12YWx1ZSBwYWlyIHRvIGEgYE1lZGlhQ29kZWNMaXN0YCdzIGdsb2JhbCBzZXR0aW5ncy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgS2V5LgotICAgICAqIEBwYXJhbSB2YWx1ZSBWYWx1ZS4KLSAgICAgKi8KLSAgICB2b2lkIGFkZEdsb2JhbFNldHRpbmcoY29uc3QgY2hhcioga2V5LCBjb25zdCBjaGFyKiB2YWx1ZSk7Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGFkZCBhIG5ldyBgTWVkaWFDb2RlY0luZm9gIG9iamVjdCB0byBhIGBNZWRpYUNvZGVjTGlzdGAsIGFuZAotICAgICAqIHJldHVybiBhIGBNZWRpYUNvZGVjSW5mb1dyaXRlcmAgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV3bHkgYWRkZWQKLSAgICAgKiBgTWVkaWFDb2RlY0luZm9gLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgYE1lZGlhQ29kZWNJbmZvV3JpdGVyYCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXdseQotICAgICAqIGFkZGVkIGBNZWRpYUNvZGVjSW5mb2Agb2JqZWN0LgotICAgICAqLwotICAgIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mb1dyaXRlcj4gYWRkTWVkaWFDb2RlY0luZm8oKTsKLXByaXZhdGU6Ci0gICAgLyoqCi0gICAgICogVGhlIGFzc29jaWF0ZWQgYE1lZGlhQ29kZWNMaXN0YCBvYmplY3QuCi0gICAgICovCi0gICAgTWVkaWFDb2RlY0xpc3QqIG1MaXN0OwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IHRoaXMgd3JpdGVyIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGBNZWRpYUNvZGVjTGlzdGAKLSAgICAgKiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGlzdCBUaGUgImJhc2UiIGBNZWRpYUNvZGVjTGlzdGAgb2JqZWN0LgotICAgICAqLwotICAgIE1lZGlhQ29kZWNMaXN0V3JpdGVyKE1lZGlhQ29kZWNMaXN0KiBsaXN0KTsKLQotICAgIGZyaWVuZCBNZWRpYUNvZGVjTGlzdDsKLX07Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgdG8gYmUgdXNlZCBieSBgTWVkaWFDb2RlY0xpc3RgIHRvIGZpbGwgaXRzIG1lbWJlcnMgd2l0aAotICogYXBwcm9wcmlhdGUgaW5mb3JtYXRpb24uIGBidWlsZE1lZGlhQ29kZWNMaXN0KClgIHdpbGwgYmUgY2FsbGVkIGZyb20gYQotICogYE1lZGlhQ29kZWNMaXN0YCBvYmplY3QgZHVyaW5nIGl0cyBjb25zdHJ1Y3Rpb24uCi0gKi8KLXN0cnVjdCBNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlIHsKLSAgICAvKioKLSAgICAgKiBCdWlsZCB0aGUgYE1lZGlhQ29kZWNMaXN0YCB2aWEgdGhlIGdpdmVuIGBNZWRpYUNvZGVjTGlzdFdyaXRlcmAgaW50ZXJmYWNlLgotICAgICAqCi0gICAgICogQHBhcmFtIHdyaXRlciBUaGUgd3JpdGVyIGludGVyZmFjZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBzdGF0dXMgb2YgdGhlIGNvbnN0cnVjdGlvbi4gYE5PX0VSUk9SYCBtZWFucyBzdWNjZXNzLgotICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgYnVpbGRNZWRpYUNvZGVjTGlzdChNZWRpYUNvZGVjTGlzdFdyaXRlciogd3JpdGVyKSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCBkZXN0cnVjdG9yIGRvZXMgbm90aGluZy4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIH5NZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlKCk7CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdFdyaXRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdFdyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZjU3YzcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0V3JpdGVyLmgKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEyLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9DT0RFQ19MSVNUX1dSSVRFUl9IXworCisjZGVmaW5lIE1FRElBX0NPREVDX0xJU1RfV1JJVEVSX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RXcml0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjSW5mby5oPgorCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyB0byBiZSB1c2VkIGJ5IGEgYE1lZGlhQ29kZWNMaXN0QnVpbGRlckJhc2VgIGluc3RhbmNlIHRvIGFkZAorICogaW5mb3JtYXRpb24gdG8gdGhlIGRlc3RpbmF0aW9uIGBNZWRpYUNvZGVjTGlzdGAgb2JqZWN0LgorICovCitzdHJ1Y3QgTWVkaWFDb2RlY0xpc3RXcml0ZXIgeworICAgIC8qKgorICAgICAqIEFkZCBhIGtleS12YWx1ZSBwYWlyIHRvIGEgYE1lZGlhQ29kZWNMaXN0YCdzIGdsb2JhbCBzZXR0aW5ncy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgS2V5LgorICAgICAqIEBwYXJhbSB2YWx1ZSBWYWx1ZS4KKyAgICAgKi8KKyAgICB2b2lkIGFkZEdsb2JhbFNldHRpbmcoY29uc3QgY2hhcioga2V5LCBjb25zdCBjaGFyKiB2YWx1ZSk7CisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIGFkZCBhIG5ldyBgTWVkaWFDb2RlY0luZm9gIG9iamVjdCBmb3IgYSBgTWVkaWFDb2RlY0xpc3RgLCBhbmQKKyAgICAgKiByZXR1cm4gYSBgTWVkaWFDb2RlY0luZm9Xcml0ZXJgIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIG5ld2x5IGFkZGVkCisgICAgICogYE1lZGlhQ29kZWNJbmZvYC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGBNZWRpYUNvZGVjSW5mb1dyaXRlcmAgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV3bHkKKyAgICAgKiBhZGRlZCBgTWVkaWFDb2RlY0luZm9gIG9iamVjdC4KKyAgICAgKi8KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm9Xcml0ZXI+IGFkZE1lZGlhQ29kZWNJbmZvKCk7Citwcml2YXRlOgorICAgIE1lZGlhQ29kZWNMaXN0V3JpdGVyKCkgPSBkZWZhdWx0OworCisgICAgdm9pZCB3cml0ZUdsb2JhbFNldHRpbmdzKGNvbnN0IHNwPEFNZXNzYWdlPiAmZ2xvYmFsU2V0dGluZ3MpIGNvbnN0OworICAgIHZvaWQgd3JpdGVDb2RlY0luZm9zKHN0ZDo6dmVjdG9yPHNwPE1lZGlhQ29kZWNJbmZvPj4gKmNvZGVjSW5mb3MpIGNvbnN0OworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4+IG1HbG9iYWxTZXR0aW5nczsKKyAgICBzdGQ6OnZlY3RvcjxzcDxNZWRpYUNvZGVjSW5mbz4+IG1Db2RlY0luZm9zOworCisgICAgZnJpZW5kIHN0cnVjdCBNZWRpYUNvZGVjTGlzdDsKK307CisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgaXMgdG8gYmUgdXNlZCBieSBgTWVkaWFDb2RlY0xpc3RgIHRvIGZpbGwgaXRzIG1lbWJlcnMgd2l0aAorICogYXBwcm9wcmlhdGUgaW5mb3JtYXRpb24uIGBidWlsZE1lZGlhQ29kZWNMaXN0KClgIHdpbGwgYmUgY2FsbGVkIGZyb20gYQorICogYE1lZGlhQ29kZWNMaXN0YCBvYmplY3QgZHVyaW5nIGl0cyBjb25zdHJ1Y3Rpb24uCisgKi8KK3N0cnVjdCBNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlIHsKKyAgICAvKioKKyAgICAgKiBCdWlsZCB0aGUgYE1lZGlhQ29kZWNMaXN0YCB2aWEgdGhlIGdpdmVuIGBNZWRpYUNvZGVjTGlzdFdyaXRlcmAgaW50ZXJmYWNlLgorICAgICAqCisgICAgICogQHBhcmFtIHdyaXRlciBUaGUgd3JpdGVyIGludGVyZmFjZS4KKyAgICAgKiBAcmV0dXJuIFRoZSBzdGF0dXMgb2YgdGhlIGNvbnN0cnVjdGlvbi4gYE5PX0VSUk9SYCBtZWFucyBzdWNjZXNzLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgYnVpbGRNZWRpYUNvZGVjTGlzdChNZWRpYUNvZGVjTGlzdFdyaXRlciogd3JpdGVyKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBkZXN0cnVjdG9yIGRvZXMgbm90aGluZy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIH5NZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlKCkgPSBkZWZhdWx0OworCisgICAgdHlwZWRlZiBNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlICooKkNyZWF0ZUJ1aWxkZXJGdW5jKSh2b2lkKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfQ09ERUNfTElTVF9XUklURVJfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuaAppbmRleCAzYWM1MzllLi5hNjhjYzE5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuaApAQCAtMTcsMTAgKzE3LDEwIEBACiAjaWZuZGVmIE1lZGlhQ29kZWNTb3VyY2VfSF8KICNkZWZpbmUgTWVkaWFDb2RlY1NvdXJjZV9IXwogCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlclJlZmxlY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTXV0ZXhlZC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvUGVyc2lzdGVudFN1cmZhY2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMzAsNyArMzAsNiBAQAogc3RydWN0IEFSZXBseVRva2VuOwogY2xhc3MgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKIHN0cnVjdCBNZWRpYUNvZGVjOwotY2xhc3MgTWV0YURhdGE7CiAKIHN0cnVjdCBNZWRpYUNvZGVjU291cmNlIDogcHVibGljIE1lZGlhU291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgTWVkaWFCdWZmZXJPYnNlcnZlciB7CkBAIC01OCwxMyArNTcsMTMgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKE1ldGFEYXRhICpwYXJhbXMpOwogICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLAorICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLAogICAgICAgICAgICAgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0b3BUaW1lVXMoaW50NjRfdCBzdG9wVGltZVVzKTsKIAogCiAgICAgLy8gTWVkaWFCdWZmZXJPYnNlcnZlcgotICAgIHZpcnR1YWwgdm9pZCBzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlciAqYnVmZmVyKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpOwogCiAgICAgLy8gZm9yIEFIYW5kbGVyUmVmbGVjdG9yCiAgICAgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CkBAIC0xMzcsNyArMTM2LDcgQEAKICAgICBzcDxBTWVzc2FnZT4gbUVuY29kZXJBY3Rpdml0eU5vdGlmeTsKICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwogICAgIHNwPFBlcnNpc3RlbnRTdXJmYWNlPiBtUGVyc2lzdGVudFN1cmZhY2U7Ci0gICAgTGlzdDxNZWRpYUJ1ZmZlciAqPiBtSW5wdXRCdWZmZXJRdWV1ZTsKKyAgICBMaXN0PE1lZGlhQnVmZmVyQmFzZSAqPiBtSW5wdXRCdWZmZXJRdWV1ZTsKICAgICBMaXN0PHNpemVfdD4gbUF2YWlsRW5jb2RlcklucHV0SW5kaWNlczsKICAgICBMaXN0PGludDY0X3Q+IG1EZWNvZGluZ1RpbWVRdWV1ZTsgLy8gZGVjb2RpbmcgdGltZSAodXMpIGZvciB2aWRlbwogICAgIGludDY0X3QgbUlucHV0QnVmZmVyVGltZU9mZnNldFVzOwpAQCAtMTUwLDcgKzE0OSw3IEBACiAKICAgICBzdHJ1Y3QgT3V0cHV0IHsKICAgICAgICAgT3V0cHV0KCk7Ci0gICAgICAgIExpc3Q8TWVkaWFCdWZmZXIqPiBtQnVmZmVyUXVldWU7CisgICAgICAgIExpc3Q8TWVkaWFCdWZmZXJCYXNlKj4gbUJ1ZmZlclF1ZXVlOwogICAgICAgICBib29sIG1FbmNvZGVyUmVhY2hlZEVPUzsKICAgICAgICAgc3RhdHVzX3QgbUVycm9yQ29kZTsKICAgICAgICAgQ29uZGl0aW9uIG1Db25kOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmgKaW5kZXggMzU5ZmI2OS4uZDIwYzVkYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oCkBAIC0yNiw2ICsyNiw2IEBACiAgKgogICovCiAKLSNpbmNsdWRlIDxtZWRpYS9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgogCiAjZW5kaWYgIC8vIFNUQUdFRlJJR0hUX01FRElBX0RFRlNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVjN2VhZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfRVhUUkFDVE9SX0hfCi0KLSNkZWZpbmUgTUVESUFfRVhUUkFDVE9SX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotY2xhc3MgRGF0YVNvdXJjZTsKLXN0cnVjdCBNZWRpYVNvdXJjZTsKLWNsYXNzIE1ldGFEYXRhOwotCi1jbGFzcyBNZWRpYUV4dHJhY3RvciA6IHB1YmxpYyBCbk1lZGlhRXh0cmFjdG9yIHsKLXB1YmxpYzoKLSAgICBzdGF0aWMgc3A8SU1lZGlhRXh0cmFjdG9yPiBDcmVhdGUoCi0gICAgICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBjb25zdCBjaGFyICptaW1lID0gTlVMTCk7Ci0gICAgc3RhdGljIHNwPE1lZGlhRXh0cmFjdG9yPiBDcmVhdGVGcm9tU2VydmljZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUgPSBOVUxMKTsKLQotICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCkgPSAwOwotICAgIHZpcnR1YWwgc3A8SU1lZGlhU291cmNlPiBnZXRUcmFjayhzaXplX3QgaW5kZXgpID0gMDsKLQotICAgIGVudW0gR2V0VHJhY2tNZXRhRGF0YUZsYWdzIHsKLSAgICAgICAga0luY2x1ZGVFeHRlbnNpdmVNZXRhRGF0YSA9IDEKLSAgICB9OwotICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzID0gMCkgPSAwOwotCi0gICAgLy8gUmV0dXJuIGNvbnRhaW5lciBzcGVjaWZpYyBtZXRhLWRhdGEuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCi0gICAgLy8gcmV0dXJucyBhbiBlbXB0eSBtZXRhZGF0YSBvYmplY3QuCi0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0TWV0YURhdGEoKTsKLQotICAgIHN0YXR1c190IGdldE1ldHJpY3MoUGFyY2VsICpyZXBseSk7Ci0KLSAgICBlbnVtIEZsYWdzIHsKLSAgICAgICAgQ0FOX1NFRUtfQkFDS1dBUkQgID0gMSwgIC8vIHRoZSAic2VlayAxMHNlY3MgYmFjayBidXR0b24iCi0gICAgICAgIENBTl9TRUVLX0ZPUldBUkQgICA9IDIsICAvLyB0aGUgInNlZWsgMTBzZWNzIGZvcndhcmQgYnV0dG9uIgotICAgICAgICBDQU5fUEFVU0UgICAgICAgICAgPSA0LAotICAgICAgICBDQU5fU0VFSyAgICAgICAgICAgPSA4LCAgLy8gdGhlICJzZWVrIGJhciIKLSAgICB9OwotCi0gICAgLy8gSWYgc3ViY2xhc3NlcyBkbyBfbm90XyBvdmVycmlkZSB0aGlzLCB0aGUgZGVmYXVsdCBpcwotICAgIC8vIENBTl9TRUVLX0JBQ0tXQVJEIHwgQ0FOX1NFRUtfRk9SV0FSRCB8IENBTl9TRUVLIHwgQ0FOX1BBVVNFCi0gICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIGNvbnN0OwotCi0gICAgLy8gZm9yIERSTQotICAgIHZpcnR1YWwgY2hhciogZ2V0RHJtVHJhY2tJbmZvKHNpemVfdCAvKnRyYWNrSUQqLywgaW50ICogLypsZW4qLykgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgdmlydHVhbCB2b2lkIHNldFVJRCh1aWRfdCAvKnVpZCovKSB7Ci0gICAgfQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWVkaWFDYXMoY29uc3QgSEludGVyZmFjZVRva2VuICYvKmNhc1Rva2VuKi8pIG92ZXJyaWRlIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiPHVuc3BlY2lmaWVkPiI7IH0KLQotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlKCkge30KLQotcHJvdGVjdGVkOgotICAgIE1lZGlhRXh0cmFjdG9yKCk7Ci0gICAgdmlydHVhbCB+TWVkaWFFeHRyYWN0b3IoKTsKLQotICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAqbUFuYWx5dGljc0l0ZW07Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcG9wdWxhdGVNZXRyaWNzKCk7Ci0KLXByaXZhdGU6Ci0KLSAgICB0eXBlZGVmIGJvb2wgKCpTbmlmZmVyRnVuYykoCi0gICAgICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwKLSAgICAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLCBzcDxBTWVzc2FnZT4gKm1ldGEpOwotCi0gICAgc3RhdGljIE11dGV4IGdTbmlmZmVyTXV0ZXg7Ci0gICAgc3RhdGljIExpc3Q8U25pZmZlckZ1bmM+IGdTbmlmZmVyczsKLSAgICBzdGF0aWMgYm9vbCBnU25pZmZlcnNSZWdpc3RlcmVkOwotCi0gICAgLy8gVGhlIHNuaWZmZXIgY2FuIG9wdGlvbmFsbHkgZmlsbCBpbiAibWV0YSIgd2l0aCBhbiBBTWVzc2FnZSBjb250YWluaW5nCi0gICAgLy8gYSBkaWN0aW9uYXJ5IG9mIHZhbHVlcyB0aGF0IGhlbHBzIHRoZSBjb3JyZXNwb25kaW5nIGV4dHJhY3RvciBpbml0aWFsaXplCi0gICAgLy8gaXRzIHN0YXRlIHdpdGhvdXQgZHVwbGljYXRpbmcgZWZmb3J0IGFscmVhZHkgZXhlcnRlZCBieSB0aGUgc25pZmZlci4KLSAgICBzdGF0aWMgdm9pZCBSZWdpc3RlclNuaWZmZXJfbChTbmlmZmVyRnVuYyBmdW5jKTsKLQotICAgIHN0YXRpYyBib29sIHNuaWZmKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsCi0gICAgICAgICAgICBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UsIHNwPEFNZXNzYWdlPiAqbWV0YSk7Ci0KLSAgICBzdGF0aWMgdm9pZCBSZWdpc3RlckRlZmF1bHRTbmlmZmVycygpOwotCi0gICAgTWVkaWFFeHRyYWN0b3IoY29uc3QgTWVkaWFFeHRyYWN0b3IgJik7Ci0gICAgTWVkaWFFeHRyYWN0b3IgJm9wZXJhdG9yPShjb25zdCBNZWRpYUV4dHJhY3RvciAmKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gTUVESUFfRVhUUkFDVE9SX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjlmNWJkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaApAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9FWFRSQUNUT1JfRkFDVE9SWV9IXworCisjZGVmaW5lIE1FRElBX0VYVFJBQ1RPUl9GQUNUT1JZX0hfCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgRGF0YVNvdXJjZTsKK3N0cnVjdCBFeHRyYWN0b3JQbHVnaW47CisKK2NsYXNzIE1lZGlhRXh0cmFjdG9yRmFjdG9yeSB7CitwdWJsaWM6CisgICAgc3RhdGljIHNwPElNZWRpYUV4dHJhY3Rvcj4gQ3JlYXRlKAorICAgICAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgY29uc3QgY2hhciAqbWltZSA9IE5VTEwpOworICAgIHN0YXRpYyBzcDxJTWVkaWFFeHRyYWN0b3I+IENyZWF0ZUZyb21TZXJ2aWNlKAorICAgICAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgY29uc3QgY2hhciAqbWltZSA9IE5VTEwpOworICAgIHN0YXRpYyB2b2lkIExvYWRQbHVnaW5zKGNvbnN0IDo6c3RkOjpzdHJpbmcmIGFwa1BhdGgpOworICAgIHN0YXRpYyBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CisKK3ByaXZhdGU6CisgICAgc3RhdGljIE11dGV4IGdQbHVnaW5NdXRleDsKKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPExpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4+IGdQbHVnaW5zOworICAgIHN0YXRpYyBib29sIGdQbHVnaW5zUmVnaXN0ZXJlZDsKKworICAgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyRXh0cmFjdG9yc0luQXBrKAorICAgICAgICAgICAgY29uc3QgY2hhciAqYXBrUGF0aCwgTGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+PiAmcGx1Z2luTGlzdCk7CisgICAgc3RhdGljIHZvaWQgUmVnaXN0ZXJFeHRyYWN0b3JzSW5TeXN0ZW0oCisgICAgICAgICAgICBjb25zdCBjaGFyICpsaWJEaXJQYXRoLCBMaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+ICZwbHVnaW5MaXN0KTsKKyAgICBzdGF0aWMgdm9pZCBSZWdpc3RlckV4dHJhY3RvcigKKyAgICAgICAgICAgIGNvbnN0IHNwPEV4dHJhY3RvclBsdWdpbj4gJnBsdWdpbiwgTGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+PiAmcGx1Z2luTGlzdCk7CisKKyAgICBzdGF0aWMgTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIHNuaWZmKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCisgICAgICAgICAgICBmbG9hdCAqY29uZmlkZW5jZSwgdm9pZCAqKm1ldGEsIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKmZyZWVNZXRhLAorICAgICAgICAgICAgc3A8RXh0cmFjdG9yUGx1Z2luPiAmcGx1Z2luKTsKKworICAgIHN0YXRpYyB2b2lkIFVwZGF0ZUV4dHJhY3RvcnMoY29uc3QgY2hhciAqbmV3VXBkYXRlQXBrUGF0aCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1FRElBX0VYVFJBQ1RPUl9GQUNUT1JZX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRmlsdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRmlsdGVyLmgKaW5kZXggMGMxMGQxMS4uYTI4YzQ5ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUZpbHRlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFGaWx0ZXIuaApAQCAtNTcsNyArNTcsNyBAQAogICAgICAgICAgICAgT1dORURfQllfVVBTVFJFQU0sCiAgICAgICAgIH07CiAKLSAgICAgICAgSU9NWDo6YnVmZmVyX2lkIG1CdWZmZXJJRDsKKyAgICAgICAgdWludDMyX3QgbUJ1ZmZlcklEOwogICAgICAgICBpbnQzMl90IG1HZW5lcmF0aW9uOwogICAgICAgICBpbnQzMl90IG1PdXRwdXRGbGFnczsKICAgICAgICAgU3RhdHVzIG1TdGF0dXM7CkBAIC0xMjEsNyArMTIxLDcgQEAKIAogICAgIHN0YXR1c190IGFsbG9jYXRlQnVmZmVyc09uUG9ydChPTVhfVTMyIHBvcnRJbmRleCk7CiAgICAgQnVmZmVySW5mbyAqZmluZEJ1ZmZlckJ5SUQoCi0gICAgICAgICAgICB1aW50MzJfdCBwb3J0SW5kZXgsIElPTVg6OmJ1ZmZlcl9pZCBidWZmZXJJRCwKKyAgICAgICAgICAgIHVpbnQzMl90IHBvcnRJbmRleCwgdWludDMyX3QgYnVmZmVySUQsCiAgICAgICAgICAgICBzc2l6ZV90ICppbmRleCA9IE5VTEwpOwogICAgIHZvaWQgcG9zdEZpbGxUaGlzQnVmZmVyKEJ1ZmZlckluZm8gKmluZm8pOwogICAgIHZvaWQgcG9zdERyYWluVGhpc0J1ZmZlcihCdWZmZXJJbmZvICppbmZvKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFIVFRQLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhSFRUUC5oCmluZGV4IDAwNmQ4ZDguLmZlMGU2MTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFIVFRQLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaApAQCAtMjQsMTAgKzI0LDEwIEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IElNZWRpYUhUVFBDb25uZWN0aW9uOworc3RydWN0IE1lZGlhSFRUUENvbm5lY3Rpb247CiAKIHN0cnVjdCBNZWRpYUhUVFAgOiBwdWJsaWMgSFRUUEJhc2UgewotICAgIE1lZGlhSFRUUChjb25zdCBzcDxJTWVkaWFIVFRQQ29ubmVjdGlvbj4gJmNvbm4pOworICAgIE1lZGlhSFRUUChjb25zdCBzcDxNZWRpYUhUVFBDb25uZWN0aW9uPiAmY29ubik7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbm5lY3QoCiAgICAgICAgICAgICBjb25zdCBjaGFyICp1cmksCkBAIC01MCwxMyArNTAsMTIgQEAKICAgICB2aXJ0dWFsIH5NZWRpYUhUVFAoKTsKIAogICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gRHJtSW5pdGlhbGl6YXRpb24oY29uc3QgY2hhciogbWltZSk7Ci0gICAgdmlydHVhbCB2b2lkIGdldERybUluZm8oc3A8RGVjcnlwdEhhbmRsZT4gJmhhbmRsZSwgRHJtTWFuYWdlckNsaWVudCAqKmNsaWVudCk7CiAgICAgdmlydHVhbCBTdHJpbmc4IGdldFVyaSgpOwogICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRNSU1FVHlwZSgpIGNvbnN0OwogCiBwcml2YXRlOgogICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7Ci0gICAgc3A8SU1lZGlhSFRUUENvbm5lY3Rpb24+IG1IVFRQQ29ubmVjdGlvbjsKKyAgICBzcDxNZWRpYUhUVFBDb25uZWN0aW9uPiBtSFRUUENvbm5lY3Rpb247CiAKICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtTGFzdEhlYWRlcnM7CiAgICAgQVN0cmluZyBtTGFzdFVSSTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmgKaW5kZXggNjNjM2NhNS4uNjZmNGQ3MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmgKQEAgLTQ4LDYgKzQ4LDcgQEAKICAgICAgICAgT1VUUFVUX0ZPUk1BVF9NUEVHXzQgICAgICA9IDAsCiAgICAgICAgIE9VVFBVVF9GT1JNQVRfV0VCTSAgICAgICAgPSAxLAogICAgICAgICBPVVRQVVRfRk9STUFUX1RIUkVFX0dQUCAgID0gMiwKKyAgICAgICAgT1VUUFVUX0ZPUk1BVF9IRUlGICAgICAgICA9IDMsCiAgICAgICAgIE9VVFBVVF9GT1JNQVRfTElTVF9FTkQgLy8gbXVzdCBiZSBsYXN0IC0gdXNlZCB0byB2YWxpZGF0ZSBmb3JtYXQgdHlwZQogICAgIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRhZGIwNS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfU09VUkNFX0hfCi0KLSNkZWZpbmUgTUVESUFfU09VUkNFX0hfCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIE1lZGlhQnVmZmVyOwotY2xhc3MgTWV0YURhdGE7Ci0KLXN0cnVjdCBNZWRpYVNvdXJjZSA6IHB1YmxpYyBCbk1lZGlhU291cmNlIHsKLSAgICBNZWRpYVNvdXJjZSgpOwotCi0gICAgLy8gVG8gYmUgY2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIgbWV0aG9kcyBvbiB0aGlzIG9iamVjdCwgZXhjZXB0Ci0gICAgLy8gZ2V0Rm9ybWF0KCkuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zID0gTlVMTCkgPSAwOwotCi0gICAgLy8gQW55IGJsb2NraW5nIHJlYWQgY2FsbCByZXR1cm5zIGltbWVkaWF0ZWx5IHdpdGggYSByZXN1bHQgb2YgTk9fSU5JVC4KLSAgICAvLyBJdCBpcyBhbiBlcnJvciB0byBjYWxsIGFueSBtZXRob2RzIG90aGVyIHRoYW4gc3RhcnQgYWZ0ZXIgdGhpcyBjYWxsCi0gICAgLy8gcmV0dXJucy4gQW55IGJ1ZmZlcnMgdGhlIG9iamVjdCBtYXkgYmUgaG9sZGluZyBvbnRvIGF0IHRoZSB0aW1lIG9mCi0gICAgLy8gdGhlIHN0b3AoKSBjYWxsIGFyZSByZWxlYXNlZC4KLSAgICAvLyBBbHNvLCBpdCBpcyBpbXBlcmF0aXZlIHRoYXQgYW55IGJ1ZmZlcnMgb3V0cHV0IGJ5IHRoaXMgb2JqZWN0IGFuZAotICAgIC8vIGhlbGQgb250byBieSBjYWxsZXJzIGJlIHJlbGVhc2VkIGJlZm9yZSBhIGNhbGwgdG8gc3RvcCgpICEhIQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpID0gMDsKLQotICAgIC8vIFJldHVybnMgdGhlIGZvcm1hdCBvZiB0aGUgZGF0YSBvdXRwdXQgYnkgdGhpcyBtZWRpYSBzb3VyY2UuCi0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCkgPSAwOwotCi0gICAgLy8gUmV0dXJucyBhIG5ldyBidWZmZXIgb2YgZGF0YS4gQ2FsbCBibG9ja3MgdW50aWwgYQotICAgIC8vIGJ1ZmZlciBpcyBhdmFpbGFibGUsIGFuIGVycm9yIGlzIGVuY291bnRlcmVkIG9mIHRoZSBlbmQgb2YgdGhlIHN0cmVhbQotICAgIC8vIGlzIHJlYWNoZWQuCi0gICAgLy8gRW5kIG9mIHN0cmVhbSBpcyBzaWduYWxsZWQgYnkgYSByZXN1bHQgb2YgRVJST1JfRU5EX09GX1NUUkVBTS4KLSAgICAvLyBBIHJlc3VsdCBvZiBJTkZPX0ZPUk1BVF9DSEFOR0VEIGluZGljYXRlcyB0aGF0IHRoZSBmb3JtYXQgb2YgdGhpcwotICAgIC8vIE1lZGlhU291cmNlIGhhcyBjaGFuZ2VkIG1pZC1zdHJlYW0sIHRoZSBjbGllbnQgY2FuIGNvbnRpbnVlIHJlYWRpbmcKLSAgICAvLyBidXQgc2hvdWxkIGJlIHByZXBhcmVkIGZvciBidWZmZXJzIG9mIHRoZSBuZXcgY29uZmlndXJhdGlvbi4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKSA9IDA7Ci0KLSAgICAvLyBDYXVzZXMgdGhpcyBzb3VyY2UgdG8gc3VzcGVuZCBwdWxsaW5nIGRhdGEgZnJvbSBpdHMgdXBzdHJlYW0gc291cmNlCi0gICAgLy8gdW50aWwgYSBzdWJzZXF1ZW50IHJlYWQtd2l0aC1zZWVrLiBUaGlzIGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkCi0gICAgLy8gYXMgc3VjaCBieSBhbnkgc291cmNlLiBFLmcuIE1lZGlhQ29kZWNTb3VyY2UgZG9lcyBub3Qgc3VzcGVuZCBpdHMKLSAgICAvLyB1cHN0cmVhbSBzb3VyY2UsIGFuZCBpbnN0ZWFkIGRpc2NhcmQgdXBzdHJlYW0gZGF0YSB3aGlsZSBwYXVzZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwotICAgIH0KLQotICAgIC8vIFRoZSBjb25zdW1lciBvZiB0aGlzIG1lZGlhIHNvdXJjZSByZXF1ZXN0cyB0aGF0IHRoZSBnaXZlbiBidWZmZXJzCi0gICAgLy8gYXJlIHRvIGJlIHJldHVybmVkIGV4Y2x1c2l2ZWx5IGluIHJlc3BvbnNlIHRvIHJlYWQgY2FsbHMuCi0gICAgLy8gVGhpcyB3aWxsIGJlIGNhbGxlZCBhZnRlciBhIHN1Y2Nlc3NmdWwgc3RhcnQoKSBhbmQgYmVmb3JlIHRoZQotICAgIC8vIGZpcnN0IHJlYWQoKSBjYWxsLgotICAgIC8vIENhbGxlZSBhc3N1bWVzIG93bmVyc2hpcCBvZiB0aGUgYnVmZmVycyBpZiBubyBlcnJvciBpcyByZXR1cm5lZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlcnMoY29uc3QgVmVjdG9yPE1lZGlhQnVmZmVyICo+ICYgLyogYnVmZmVycyAqLykgewotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgLy8gVGhlIGNvbnN1bWVyIG9mIHRoaXMgbWVkaWEgc291cmNlIHJlcXVlc3RzIHRoZSBzb3VyY2Ugc3RvcHMgc2VuZGluZwotICAgIC8vIGJ1ZmZlcnMgd2l0aCB0aW1lc3RhbXAgbGFyZ2VyIHRoYW4gb3IgZXF1YWwgdG8gc3RvcFRpbWVVcy4gc3RvcFRpbWVVcwotICAgIC8vIG11c3QgYmUgaW4gdGhlIHNhbWUgdGltZSBiYXNlIGFzIHRoZSBzdGFydFRpbWUgcGFzc2VkIGluIHN0YXJ0KCkuIElmCi0gICAgLy8gc291cmNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyByZXF1ZXN0LCBFUlJPUl9VTlNVUFBPUlRFRCB3aWxsIGJlIHJldHVybmVkLgotICAgIC8vIElmIHN0b3BUaW1lVXMgaXMgaW52YWxpZCwgQkFEX1ZBTFVFIHdpbGwgYmUgcmV0dXJuZWQuIFRoaXMgY291bGQgYmUKLSAgICAvLyBjYWxsZWQgYXQgYW55IHRpbWUgZXZlbiBiZWZvcmUgc291cmNlIHN0YXJ0cyBhbmQgaXQgY291bGQgYmUgY2FsbGVkCi0gICAgLy8gbXVsdGlwbGUgdGltZXMuIFNldHRpbmcgc3RvcFRpbWVVcyB0byBiZSAtMSB3aWxsIGVmZmVjdGl2ZWx5IGNhbmNlbCB0aGUgc3RvcFRpbWVVcwotICAgIC8vIHNldCBwcmV2aW91c2x5LiBJZiBzdG9wVGltZVVzIGlzIGxhcmdlciB0aGFuIG9yIGVxdWFsIHRvIGxhc3QgYnVmZmVyJ3MgdGltZXN0YW1wLAotICAgIC8vIHNvdXJjZSB3aWxsIHN0YXJ0IHRvIGRyb3AgYnVmZmVyIHdoZW4gaXQgZ2V0cyBhIGJ1ZmZlciB3aXRoIHRpbWVzdGFtcCBsYXJnZXIKLSAgICAvLyB0aGFuIG9yIGVxdWFsIHRvIHN0b3BUaW1lVXMuIElmIHN0b3BUaW1lVXMgaXMgc21hbGxlciB0aGFuIG9yIGVxdWFsIHRvIGxhc3QKLSAgICAvLyBidWZmZXIncyB0aW1lc3RhbXAsIHNvdXJjZSB3aWxsIGRyb3AgYWxsIHRoZSBpbmNvbWluZyBidWZmZXJzIGltbWVkaWF0ZWx5LgotICAgIC8vIEFmdGVyIHNldHRpbmcgc3RvcFRpbWVVcywgc291cmNlIG1heSBzdGlsbCBzdG9wIHNlbmRpbmcgYnVmZmVycyB3aXRoIHRpbWVzdGFtcAotICAgIC8vIGxlc3MgdGhhbiBzdG9wVGltZVVzIGlmIGl0IGlzIHN0b3BwZWQgYnkgdGhlIGNvbnN1bWVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RvcFRpbWVVcyhpbnQ2NF90IC8qIHN0b3BUaW1lVXMgKi8pIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwotICAgIH0KLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfk1lZGlhU291cmNlKCk7Ci0KLXByaXZhdGU6Ci0gICAgTWVkaWFTb3VyY2UoY29uc3QgTWVkaWFTb3VyY2UgJik7Ci0gICAgTWVkaWFTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBNZWRpYVNvdXJjZSAmKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gTUVESUFfU09VUkNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhV3JpdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhV3JpdGVyLmgKaW5kZXggY2Q0YWY0ZC4uMmMxMmE4NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYVdyaXRlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFXcml0ZXIuaApAQCAtMTksMjAgKzE5LDE4IEBACiAjZGVmaW5lIE1FRElBX1dSSVRFUl9IXwogCiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUmVjb3JkZXJDbGllbnQuaD4KLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFTb3VyY2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBNZXRhRGF0YTsKLQogc3RydWN0IE1lZGlhV3JpdGVyIDogcHVibGljIFJlZkJhc2UgewogICAgIE1lZGlhV3JpdGVyKCkKICAgICAgICAgOiBtTWF4RmlsZVNpemVMaW1pdEJ5dGVzKDApLAogICAgICAgICAgIG1NYXhGaWxlRHVyYXRpb25MaW1pdFVzKDApIHsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFNvdXJjZShjb25zdCBzcDxJTWVkaWFTb3VyY2U+ICZzb3VyY2UpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFNvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSkgPSAwOwogICAgIHZpcnR1YWwgYm9vbCByZWFjaGVkRU9TKCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKSA9IDA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMTEzZjQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1FVEFfREFUQV9IXwotCi0jZGVmaW5lIE1FVEFfREFUQV9IXwotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gVGhlIGZvbGxvd2luZyBrZXlzIG1hcCB0byBpbnQzMl90IGRhdGEgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCi1lbnVtIHsKLSAgICBrS2V5TUlNRVR5cGUgICAgICAgICAgPSAnbWltZScsICAvLyBjc3RyaW5nCi0gICAga0tleVdpZHRoICAgICAgICAgICAgID0gJ3dpZHQnLCAgLy8gaW50MzJfdCwgaW1hZ2UgcGl4ZWwKLSAgICBrS2V5SGVpZ2h0ICAgICAgICAgICAgPSAnaGVpZycsICAvLyBpbnQzMl90LCBpbWFnZSBwaXhlbAotICAgIGtLZXlEaXNwbGF5V2lkdGggICAgICA9ICdkV2lkJywgIC8vIGludDMyX3QsIGRpc3BsYXkvcHJlc2VudGF0aW9uCi0gICAga0tleURpc3BsYXlIZWlnaHQgICAgID0gJ2RIZ3QnLCAgLy8gaW50MzJfdCwgZGlzcGxheS9wcmVzZW50YXRpb24KLSAgICBrS2V5U0FSV2lkdGggICAgICAgICAgPSAnc2FyVycsICAvLyBpbnQzMl90LCBzYW1wbGVBc3BlY3RSYXRpbyB3aWR0aAotICAgIGtLZXlTQVJIZWlnaHQgICAgICAgICA9ICdzYXJIJywgIC8vIGludDMyX3QsIHNhbXBsZUFzcGVjdFJhdGlvIGhlaWdodAotICAgIGtLZXlUaHVtYm5haWxXaWR0aCAgICA9ICd0aGJXJywgIC8vIGludDMyX3QsIHRodW1ibmFpbCB3aWR0aAotICAgIGtLZXlUaHVtYm5haWxIZWlnaHQgICA9ICd0aGJIJywgIC8vIGludDMyX3QsIHRodW1ibmFpbCBoZWlnaHQKLQotICAgIC8vIGEgcmVjdGFuZ2xlLCBpZiBhYnNlbnQgYXNzdW1lZCB0byBiZSAoMCwgMCwgd2lkdGggLSAxLCBoZWlnaHQgLSAxKQotICAgIGtLZXlDcm9wUmVjdCAgICAgICAgICA9ICdjcm9wJywKLQotICAgIGtLZXlSb3RhdGlvbiAgICAgICAgICA9ICdyb3RBJywgIC8vIGludDMyX3QgKGFuZ2xlIGluIGRlZ3JlZXMpCi0gICAga0tleUlGcmFtZXNJbnRlcnZhbCAgID0gJ2lmaXYnLCAgLy8gaW50MzJfdAotICAgIGtLZXlTdHJpZGUgICAgICAgICAgICA9ICdzdHJkJywgIC8vIGludDMyX3QKLSAgICBrS2V5U2xpY2VIZWlnaHQgICAgICAgPSAnc2xodCcsICAvLyBpbnQzMl90Ci0gICAga0tleUNoYW5uZWxDb3VudCAgICAgID0gJyNjaG4nLCAgLy8gaW50MzJfdAotICAgIGtLZXlDaGFubmVsTWFzayAgICAgICA9ICdjaG5tJywgIC8vIGludDMyX3QKLSAgICBrS2V5U2FtcGxlUmF0ZSAgICAgICAgPSAnc3J0ZScsICAvLyBpbnQzMl90IChhdWRpbyBzYW1wbGluZyByYXRlIEh6KQotICAgIGtLZXlQY21FbmNvZGluZyAgICAgICA9ICdQQ01lJywgIC8vIGludDMyX3QgKGF1ZGlvIGVuY29kaW5nIGVudW0pCi0gICAga0tleUZyYW1lUmF0ZSAgICAgICAgID0gJ2ZybVInLCAgLy8gaW50MzJfdCAodmlkZW8gZnJhbWUgcmF0ZSBmcHMpCi0gICAga0tleUJpdFJhdGUgICAgICAgICAgID0gJ2JydGUnLCAgLy8gaW50MzJfdCAoYnBzKQotICAgIGtLZXlNYXhCaXRSYXRlICAgICAgICA9ICdteEJyJywgIC8vIGludDMyX3QgKGJwcykKLSAgICBrS2V5U3RyZWFtSGVhZGVyICAgICAgPSAnc3RIZCcsICAvLyByYXcgZGF0YQotICAgIGtLZXlFU0RTICAgICAgICAgICAgICA9ICdlc2RzJywgIC8vIHJhdyBkYXRhCi0gICAga0tleUFBQ1Byb2ZpbGUgICAgICAgID0gJ2FhY3AnLCAgLy8gaW50MzJfdAotICAgIGtLZXlBVkNDICAgICAgICAgICAgICA9ICdhdmNjJywgIC8vIHJhdyBkYXRhCi0gICAga0tleUhWQ0MgICAgICAgICAgICAgID0gJ2h2Y2MnLCAgLy8gcmF3IGRhdGEKLSAgICBrS2V5VGh1bWJuYWlsSFZDQyAgICAgPSAndGh2YycsICAvLyByYXcgZGF0YQotICAgIGtLZXlEMjYzICAgICAgICAgICAgICA9ICdkMjYzJywgIC8vIHJhdyBkYXRhCi0gICAga0tleVZvcmJpc0luZm8gICAgICAgID0gJ3ZpbmYnLCAgLy8gcmF3IGRhdGEKLSAgICBrS2V5Vm9yYmlzQm9va3MgICAgICAgPSAndmJvbycsICAvLyByYXcgZGF0YQotICAgIGtLZXlPcHVzSGVhZGVyICAgICAgICA9ICdvaGRyJywgIC8vIHJhdyBkYXRhCi0gICAga0tleU9wdXNDb2RlY0RlbGF5ICAgID0gJ29jb2QnLCAgLy8gdWludDY0X3QgKGNvZGVjIGRlbGF5IGluIG5zKQotICAgIGtLZXlPcHVzU2Vla1ByZVJvbGwgICA9ICdvc3ByJywgIC8vIHVpbnQ2NF90IChzZWVrIHByZXJvbGwgaW4gbnMpCi0gICAga0tleUZsYWNNZXRhZGF0YSAgICAgID0gJ2ZsTWQnLCAgLy8gcmF3IGRhdGEKLSAgICBrS2V5VnA5Q29kZWNQcml2YXRlICAgPSAndnA5cCcsICAvLyByYXcgZGF0YSAodnA5IGNzZCBpbmZvcm1hdGlvbikKLSAgICBrS2V5V2FudHNOQUxGcmFnbWVudHMgPSAnTkFMZicsCi0gICAga0tleUlzU3luY0ZyYW1lICAgICAgID0gJ3N5bmMnLCAgLy8gaW50MzJfdCAoYm9vbCkKLSAgICBrS2V5SXNDb2RlY0NvbmZpZyAgICAgPSAnY29uZicsICAvLyBpbnQzMl90IChib29sKQotICAgIGtLZXlUaW1lICAgICAgICAgICAgICA9ICd0aW1lJywgIC8vIGludDY0X3QgKHVzZWNzKQotICAgIGtLZXlEZWNvZGluZ1RpbWUgICAgICA9ICdkZWNUJywgIC8vIGludDY0X3QgKGRlY29kaW5nIHRpbWVzdGFtcCBpbiB1c2VjcykKLSAgICBrS2V5TlRQVGltZSAgICAgICAgICAgPSAnbnRwVCcsICAvLyB1aW50NjRfdCAobnRwLXRpbWVzdGFtcCkKLSAgICBrS2V5VGFyZ2V0VGltZSAgICAgICAgPSAndGFyVCcsICAvLyBpbnQ2NF90ICh1c2VjcykKLSAgICBrS2V5RHJpZnRUaW1lICAgICAgICAgPSAnZGZ0VCcsICAvLyBpbnQ2NF90ICh1c2VjcykKLSAgICBrS2V5QW5jaG9yVGltZSAgICAgICAgPSAnYW5jVCcsICAvLyBpbnQ2NF90ICh1c2VjcykKLSAgICBrS2V5RHVyYXRpb24gICAgICAgICAgPSAnZHVyYScsICAvLyBpbnQ2NF90ICh1c2VjcykKLSAgICBrS2V5UGl4ZWxGb3JtYXQgICAgICAgPSAncGl4ZicsICAvLyBpbnQzMl90Ci0gICAga0tleUNvbG9yRm9ybWF0ICAgICAgID0gJ2NvbGYnLCAgLy8gaW50MzJfdAotICAgIGtLZXlDb2xvclNwYWNlICAgICAgICA9ICdjb2xzJywgIC8vIGludDMyX3QKLSAgICBrS2V5UGxhdGZvcm1Qcml2YXRlICAgPSAncHJpdicsICAvLyBwb2ludGVyCi0gICAga0tleURlY29kZXJDb21wb25lbnQgID0gJ2RlY0MnLCAgLy8gY3N0cmluZwotICAgIGtLZXlCdWZmZXJJRCAgICAgICAgICA9ICdiZklEJywKLSAgICBrS2V5TWF4SW5wdXRTaXplICAgICAgPSAnaW5wUycsCi0gICAga0tleU1heFdpZHRoICAgICAgICAgID0gJ21heFcnLAotICAgIGtLZXlNYXhIZWlnaHQgICAgICAgICA9ICdtYXhIJywKLSAgICBrS2V5VGh1bWJuYWlsVGltZSAgICAgPSAndGhiVCcsICAvLyBpbnQ2NF90ICh1c2VjcykKLSAgICBrS2V5VHJhY2tJRCAgICAgICAgICAgPSAndHJJRCcsCi0gICAga0tleUlzRFJNICAgICAgICAgICAgID0gJ2lkcm0nLCAgLy8gaW50MzJfdCAoYm9vbCkKLSAgICBrS2V5RW5jb2RlckRlbGF5ICAgICAgPSAnZW5jZCcsICAvLyBpbnQzMl90IChmcmFtZXMpCi0gICAga0tleUVuY29kZXJQYWRkaW5nICAgID0gJ2VuY3AnLCAgLy8gaW50MzJfdCAoZnJhbWVzKQotCi0gICAga0tleUFsYnVtICAgICAgICAgICAgID0gJ2FsYnUnLCAgLy8gY3N0cmluZwotICAgIGtLZXlBcnRpc3QgICAgICAgICAgICA9ICdhcnRpJywgIC8vIGNzdHJpbmcKLSAgICBrS2V5QWxidW1BcnRpc3QgICAgICAgPSAnYWFydCcsICAvLyBjc3RyaW5nCi0gICAga0tleUNvbXBvc2VyICAgICAgICAgID0gJ2NvbXAnLCAgLy8gY3N0cmluZwotICAgIGtLZXlHZW5yZSAgICAgICAgICAgICA9ICdnZW5yJywgIC8vIGNzdHJpbmcKLSAgICBrS2V5VGl0bGUgICAgICAgICAgICAgPSAndGl0bCcsICAvLyBjc3RyaW5nCi0gICAga0tleVllYXIgICAgICAgICAgICAgID0gJ3llYXInLCAgLy8gY3N0cmluZwotICAgIGtLZXlBbGJ1bUFydCAgICAgICAgICA9ICdhbGJBJywgIC8vIGNvbXByZXNzZWQgaW1hZ2UgZGF0YQotICAgIGtLZXlBbGJ1bUFydE1JTUUgICAgICA9ICdhbEFNJywgIC8vIGNzdHJpbmcKLSAgICBrS2V5QXV0aG9yICAgICAgICAgICAgPSAnYXV0aCcsICAvLyBjc3RyaW5nCi0gICAga0tleUNEVHJhY2tOdW1iZXIgICAgID0gJ2NkdHInLCAgLy8gY3N0cmluZwotICAgIGtLZXlEaXNjTnVtYmVyICAgICAgICA9ICdkbnVtJywgIC8vIGNzdHJpbmcKLSAgICBrS2V5RGF0ZSAgICAgICAgICAgICAgPSAnZGF0ZScsICAvLyBjc3RyaW5nCi0gICAga0tleVdyaXRlciAgICAgICAgICAgID0gJ3dyaXQnLCAgLy8gY3N0cmluZwotICAgIGtLZXlDb21waWxhdGlvbiAgICAgICA9ICdjcGlsJywgIC8vIGNzdHJpbmcKLSAgICBrS2V5TG9jYXRpb24gICAgICAgICAgPSAnbG9jICcsICAvLyBjc3RyaW5nCi0gICAga0tleVRpbWVTY2FsZSAgICAgICAgID0gJ3Rtc2wnLCAgLy8gaW50MzJfdAotICAgIGtLZXlDYXB0dXJlRnJhbWVyYXRlICA9ICdjYXBGJywgIC8vIGZsb2F0IChjYXB0dXJlIGZwcykKLQotICAgIC8vIHZpZGVvIHByb2ZpbGUgYW5kIGxldmVsCi0gICAga0tleVZpZGVvUHJvZmlsZSAgICAgID0gJ3ZwcmYnLCAgLy8gaW50MzJfdAotICAgIGtLZXlWaWRlb0xldmVsICAgICAgICA9ICd2bGV2JywgIC8vIGludDMyX3QKLQotICAgIC8vIFNldCB0aGlzIGtleSB0byBlbmFibGUgYXV0aG9yaW5nIGZpbGVzIGluIDY0LWJpdCBvZmZzZXQKLSAgICBrS2V5NjRCaXRGaWxlT2Zmc2V0ICAgPSAnZm9idCcsICAvLyBpbnQzMl90IChib29sKQotICAgIGtLZXkyQnl0ZU5hbExlbmd0aCAgICA9ICcyTkFMJywgIC8vIGludDMyX3QgKGJvb2wpCi0KLSAgICAvLyBJZGVudGlmeSB0aGUgZmlsZSBvdXRwdXQgZm9ybWF0IGZvciBhdXRob3JpbmcKLSAgICAvLyBQbGVhc2Ugc2VlIDxtZWRpYS9tZWRpYXJlY29yZGVyLmg+IGZvciB0aGUgc3VwcG9ydGVkCi0gICAgLy8gZmlsZSBvdXRwdXQgZm9ybWF0cy4KLSAgICBrS2V5RmlsZVR5cGUgICAgICAgICAgPSAnZnR5cCcsICAvLyBpbnQzMl90Ci0KLSAgICAvLyBUcmFjayBhdXRob3JpbmcgcHJvZ3Jlc3Mgc3RhdHVzCi0gICAgLy8ga0tleVRyYWNrVGltZVN0YXR1cyBpcyB1c2VkIHRvIHRyYWNrIHByb2dyZXNzIGluIGVsYXBzZWQgdGltZQotICAgIGtLZXlUcmFja1RpbWVTdGF0dXMgICA9ICd0a3RtJywgIC8vIGludDY0X3QKLQotICAgIGtLZXlSZWFsVGltZVJlY29yZGluZyA9ICdydHJjJywgIC8vIGJvb2wgKGludDMyX3QpCi0gICAga0tleU51bUJ1ZmZlcnMgICAgICAgID0gJ25iYmYnLCAgLy8gaW50MzJfdAotCi0gICAgLy8gT2dnIGZpbGVzIGNhbiBiZSB0YWdnZWQgdG8gYmUgYXV0b21hdGljYWxseSBsb29waW5nLi4uCi0gICAga0tleUF1dG9Mb29wICAgICAgICAgID0gJ2F1dEwnLCAgLy8gYm9vbCAoaW50MzJfdCkKLQotICAgIGtLZXlWYWxpZFNhbXBsZXMgICAgICA9ICd2YWxEJywgIC8vIGludDMyX3QKLQotICAgIGtLZXlJc1VucmVhZGFibGUgICAgICA9ICd1bnJlJywgIC8vIGJvb2wgKGludDMyX3QpCi0KLSAgICAvLyBBbiBpbmRpY2F0aW9uIHRoYXQgYSB2aWRlbyBidWZmZXIgaGFzIGJlZW4gcmVuZGVyZWQuCi0gICAga0tleVJlbmRlcmVkICAgICAgICAgID0gJ3JlbmQnLCAgLy8gYm9vbCAoaW50MzJfdCkKLQotICAgIC8vIFRoZSBsYW5ndWFnZSBjb2RlIGZvciB0aGlzIG1lZGlhCi0gICAga0tleU1lZGlhTGFuZ3VhZ2UgICAgID0gJ2xhbmcnLCAgLy8gY3N0cmluZwotCi0gICAgLy8gVG8gc3RvcmUgdGhlIHRpbWVkIHRleHQgZm9ybWF0IGRhdGEKLSAgICBrS2V5VGV4dEZvcm1hdERhdGEgICAgPSAndGV4dCcsICAvLyByYXcgZGF0YQotCi0gICAga0tleVJlcXVpcmVzU2VjdXJlQnVmZmVycyA9ICdzZWN1JywgIC8vIGJvb2wgKGludDMyX3QpCi0KLSAgICBrS2V5SXNBRFRTICAgICAgICAgICAgPSAnYWR0cycsICAvLyBib29sIChpbnQzMl90KQotICAgIGtLZXlBQUNBT1QgICAgICAgICAgICA9ICdhYW90JywgIC8vIGludDMyX3QKLQotICAgIC8vIElmIGEgTWVkaWFCdWZmZXIncyBkYXRhIHJlcHJlc2VudHMgKGF0IGxlYXN0IHBhcnRpYWxseSkgZW5jcnlwdGVkCi0gICAgLy8gZGF0YSwgdGhlIGZvbGxvd2luZyBmaWVsZHMgYWlkIGluIGRlY3J5cHRpb24uCi0gICAgLy8gVGhlIGRhdGEgY2FuIGJlIHRob3VnaHQgb2YgYXMgcGFpcnMgb2YgcGxhaW4gYW5kIGVuY3J5cHRlZCBkYXRhCi0gICAgLy8gZnJhZ21lbnRzLCBpLmUuIHBsYWluIGFuZCBlbmNyeXB0ZWQgZGF0YSBhbHRlcm5hdGUuCi0gICAgLy8gVGhlIGZpcnN0IGZyYWdtZW50IGlzIGJ5IGNvbnZlbnRpb24gcGxhaW4gZGF0YSAoaWYgdGhhdCdzIG5vdCB0aGUKLSAgICAvLyBjYXNlLCBzaW1wbHkgc3BlY2lmeSBwbGFpbiBmcmFnbWVudCBzaXplIG9mIDApLgotICAgIC8vIGtLZXlFbmNyeXB0ZWRTaXplcyBhbmQga0tleVBsYWluU2l6ZXMgZWFjaCBtYXAgdG8gYW4gYXJyYXkgb2YKLSAgICAvLyBzaXplX3QgdmFsdWVzLiBUaGUgc3VtIHRvdGFsIG9mIGFsbCBzaXplX3QgdmFsdWVzIG9mIGJvdGggYXJyYXlzCi0gICAgLy8gbXVzdCBlcXVhbCB0aGUgYW1vdW50IG9mIGRhdGEgKGkuZS4gTWVkaWFCdWZmZXIncyByYW5nZV9sZW5ndGgoKSkuCi0gICAgLy8gSWYgYm90aCBhcnJheXMgYXJlIHByZXNlbnQsIHRoZXkgbXVzdCBiZSBvZiB0aGUgc2FtZSBzaXplLgotICAgIC8vIElmIG9ubHkgZW5jcnlwdGVkIHNpemVzIGFyZSBwcmVzZW50IGl0IGlzIGFzc3VtZWQgdGhhdCBhbGwKLSAgICAvLyBwbGFpbiBzaXplcyBhcmUgMCwgaS5lLiBhbGwgZnJhZ21lbnRzIGFyZSBlbmNyeXB0ZWQuCi0gICAgLy8gVG8gcHJvZ3JhbW1hdGljYWxseSBzZXQgdGhlc2UgYXJyYXksIHVzZSB0aGUgTWV0YURhdGE6OnNldERhdGEgQVBJLCBpLmUuCi0gICAgLy8gY29uc3Qgc2l6ZV90IGVuY1NpemVzW107Ci0gICAgLy8gbWV0YS0+c2V0RGF0YSgKLSAgICAvLyAga0tleUVuY3J5cHRlZFNpemVzLCAwIC8qIHR5cGUgKi8sIGVuY1NpemVzLCBzaXplb2YoZW5jU2l6ZXMpKTsKLSAgICAvLyBBIHBsYWluIHNpemVzIGFycmF5IGJ5IGl0c2VsZiBtYWtlcyBubyBzZW5zZS4KLSAgICBrS2V5RW5jcnlwdGVkU2l6ZXMgICAgPSAnZW5jcicsICAvLyBzaXplX3RbXQotICAgIGtLZXlQbGFpblNpemVzICAgICAgICA9ICdwbGFpJywgIC8vIHNpemVfdFtdCi0gICAga0tleUNyeXB0b0tleSAgICAgICAgID0gJ2NyeUsnLCAgLy8gdWludDhfdFsxNl0KLSAgICBrS2V5Q3J5cHRvSVYgICAgICAgICAgPSAnY3J5SScsICAvLyB1aW50OF90WzE2XQotICAgIGtLZXlDcnlwdG9Nb2RlICAgICAgICA9ICdjcnlNJywgIC8vIGludDMyX3QKLQotICAgIGtLZXlDcnlwdG9EZWZhdWx0SVZTaXplID0gJ2NyeVMnLCAgLy8gaW50MzJfdAotCi0gICAga0tleVBzc2ggICAgICAgICAgICAgID0gJ3Bzc2gnLCAgLy8gcmF3IGRhdGEKLSAgICBrS2V5Q0FTeXN0ZW1JRCAgICAgICAgPSAnY2FpZCcsICAvLyBpbnQzMl90Ci0gICAga0tleUNBU2Vzc2lvbklEICAgICAgID0gJ3NlaWQnLCAgLy8gcmF3IGRhdGEKLQotICAgIC8vIFBsZWFzZSBzZWUgTWVkaWFGb3JtYXQuS0VZX0lTX0FVVE9TRUxFQ1QuCi0gICAga0tleVRyYWNrSXNBdXRvc2VsZWN0ID0gJ2F1dG8nLCAvLyBib29sIChpbnQzMl90KQotICAgIC8vIFBsZWFzZSBzZWUgTWVkaWFGb3JtYXQuS0VZX0lTX0RFRkFVTFQuCi0gICAga0tleVRyYWNrSXNEZWZhdWx0ICAgID0gJ2RmbHQnLCAvLyBib29sIChpbnQzMl90KQotICAgIC8vIFNpbWlsYXIgdG8gTWVkaWFGb3JtYXQuS0VZX0lTX0ZPUkNFRF9TVUJUSVRMRSBidXQgcGVydGFpbnMgdG8gYXYgdHJhY2tzIGFzIHdlbGwuCi0gICAga0tleVRyYWNrSXNGb3JjZWQgICAgID0gJ2ZyY2QnLCAvLyBib29sIChpbnQzMl90KQotCi0gICAgLy8gSDI2NCBzdXBwbGVtZW50YWwgZW5oYW5jZW1lbnQgaW5mb3JtYXRpb24gb2Zmc2V0cy9zaXplcwotICAgIGtLZXlTRUkgICAgICAgICAgICAgICA9ICdzZWkgJywgLy8gcmF3IGRhdGEKLQotICAgIC8vIE1QRUcgdXNlciBkYXRhIG9mZnNldHMKLSAgICBrS2V5TXBlZ1VzZXJEYXRhICAgICAgPSAnbXB1ZCcsIC8vIHNpemVfdFtdCi0KLSAgICAvLyBTaXplIG9mIE5BTFUgbGVuZ3RoIGluIG1rdi9tcDQKLSAgICBrS2V5TmFsTGVuZ3RoU2l6ZSAgICAgPSAnbmFscycsIC8vIGludDMyX3QKLQotICAgIC8vIEhEUiByZWxhdGVkCi0gICAga0tleUhkclN0YXRpY0luZm8gICAgPSAnaGRyUycsIC8vIEhEUlN0YXRpY0luZm8KLQotICAgIC8vIGNvbG9yIGFzcGVjdHMKLSAgICBrS2V5Q29sb3JSYW5nZSAgICAgICA9ICdjUm5nJywgLy8gaW50MzJfdCwgY29sb3IgcmFuZ2UsIHZhbHVlIGRlZmluZWQgYnkgQ29sb3JBc3BlY3RzLlJhbmdlCi0gICAga0tleUNvbG9yUHJpbWFyaWVzICAgPSAnY1BybScsIC8vIGludDMyX3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbG9yIFByaW1hcmllcywgdmFsdWUgZGVmaW5lZCBieSBDb2xvckFzcGVjdHMuUHJpbWFyaWVzCi0gICAga0tleVRyYW5zZmVyRnVuY3Rpb24gPSAndEZ1bicsIC8vIGludDMyX3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyYW5zZmVyIEZ1bmN0aW9uLCB2YWx1ZSBkZWZpbmVkIGJ5IENvbG9yQXNwZWN0cy5UcmFuc2Zlci4KLSAgICBrS2V5Q29sb3JNYXRyaXggICAgICA9ICdjTXR4JywgLy8gaW50MzJfdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sb3IgTWF0cml4LCB2YWx1ZSBkZWZpbmVkIGJ5IENvbG9yQXNwZWN0cy5NYXRyaXhDb2VmZnMuCi0gICAga0tleVRlbXBvcmFsTGF5ZXJJZCAgPSAnaUx5cicsIC8vIGludDMyX3QsIHRlbXBvcmFsIGxheWVyLWlkLiAwLWJhc2VkICgwID0+IGJhc2UgbGF5ZXIpCi0gICAga0tleVRlbXBvcmFsTGF5ZXJDb3VudCA9ICdjTHlyJywgLy8gaW50MzJfdCwgbnVtYmVyIG9mIHRlbXBvcmFsIGxheWVycyBlbmNvZGVkCi0KLSAgICBrS2V5R3JpZFdpZHRoICAgICAgICA9ICdncmRXJywgLy8gaW50MzJfdCwgSEVJRiBncmlkIHdpZHRoCi0gICAga0tleUdyaWRIZWlnaHQgICAgICAgPSAnZ3JkSCcsIC8vIGludDMyX3QsIEhFSUYgZ3JpZCBoZWlnaHQKLSAgICBrS2V5R3JpZFJvd3MgICAgICAgICA9ICdncmRSJywgLy8gaW50MzJfdCwgSEVJRiBncmlkIHJvd3MKLSAgICBrS2V5R3JpZENvbHMgICAgICAgICA9ICdncmRDJywgLy8gaW50MzJfdCwgSEVJRiBncmlkIGNvbHVtbnMKLSAgICBrS2V5SWNjUHJvZmlsZSAgICAgICA9ICdwcm9mJywgLy8gcmF3IGRhdGEsIElDQyBwcmlmaWxlIGRhdGEKLX07Ci0KLWVudW0gewotICAgIGtUeXBlRVNEUyAgICAgICAgPSAnZXNkcycsCi0gICAga1R5cGVBVkNDICAgICAgICA9ICdhdmNjJywKLSAgICBrVHlwZUhWQ0MgICAgICAgID0gJ2h2Y2MnLAotICAgIGtUeXBlRDI2MyAgICAgICAgPSAnZDI2MycsCi19OwotCi1jbGFzcyBNZXRhRGF0YSA6IHB1YmxpYyBSZWZCYXNlIHsKLXB1YmxpYzoKLSAgICBNZXRhRGF0YSgpOwotICAgIE1ldGFEYXRhKGNvbnN0IE1ldGFEYXRhICZmcm9tKTsKLQotICAgIGVudW0gVHlwZSB7Ci0gICAgICAgIFRZUEVfTk9ORSAgICAgPSAnbm9uZScsCi0gICAgICAgIFRZUEVfQ19TVFJJTkcgPSAnY3N0cicsCi0gICAgICAgIFRZUEVfSU5UMzIgICAgPSAnaW4zMicsCi0gICAgICAgIFRZUEVfSU5UNjQgICAgPSAnaW42NCcsCi0gICAgICAgIFRZUEVfRkxPQVQgICAgPSAnZmxvYScsCi0gICAgICAgIFRZUEVfUE9JTlRFUiAgPSAncHRyICcsCi0gICAgICAgIFRZUEVfUkVDVCAgICAgPSAncmVjdCcsCi0gICAgfTsKLQotICAgIHZvaWQgY2xlYXIoKTsKLSAgICBib29sIHJlbW92ZSh1aW50MzJfdCBrZXkpOwotCi0gICAgYm9vbCBzZXRDU3RyaW5nKHVpbnQzMl90IGtleSwgY29uc3QgY2hhciAqdmFsdWUpOwotICAgIGJvb2wgc2V0SW50MzIodWludDMyX3Qga2V5LCBpbnQzMl90IHZhbHVlKTsKLSAgICBib29sIHNldEludDY0KHVpbnQzMl90IGtleSwgaW50NjRfdCB2YWx1ZSk7Ci0gICAgYm9vbCBzZXRGbG9hdCh1aW50MzJfdCBrZXksIGZsb2F0IHZhbHVlKTsKLSAgICBib29sIHNldFBvaW50ZXIodWludDMyX3Qga2V5LCB2b2lkICp2YWx1ZSk7Ci0KLSAgICBib29sIHNldFJlY3QoCi0gICAgICAgICAgICB1aW50MzJfdCBrZXksCi0gICAgICAgICAgICBpbnQzMl90IGxlZnQsIGludDMyX3QgdG9wLAotICAgICAgICAgICAgaW50MzJfdCByaWdodCwgaW50MzJfdCBib3R0b20pOwotCi0gICAgYm9vbCBmaW5kQ1N0cmluZyh1aW50MzJfdCBrZXksIGNvbnN0IGNoYXIgKip2YWx1ZSk7Ci0gICAgYm9vbCBmaW5kSW50MzIodWludDMyX3Qga2V5LCBpbnQzMl90ICp2YWx1ZSk7Ci0gICAgYm9vbCBmaW5kSW50NjQodWludDMyX3Qga2V5LCBpbnQ2NF90ICp2YWx1ZSk7Ci0gICAgYm9vbCBmaW5kRmxvYXQodWludDMyX3Qga2V5LCBmbG9hdCAqdmFsdWUpOwotICAgIGJvb2wgZmluZFBvaW50ZXIodWludDMyX3Qga2V5LCB2b2lkICoqdmFsdWUpOwotCi0gICAgYm9vbCBmaW5kUmVjdCgKLSAgICAgICAgICAgIHVpbnQzMl90IGtleSwKLSAgICAgICAgICAgIGludDMyX3QgKmxlZnQsIGludDMyX3QgKnRvcCwKLSAgICAgICAgICAgIGludDMyX3QgKnJpZ2h0LCBpbnQzMl90ICpib3R0b20pOwotCi0gICAgYm9vbCBzZXREYXRhKHVpbnQzMl90IGtleSwgdWludDMyX3QgdHlwZSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwotCi0gICAgYm9vbCBmaW5kRGF0YSh1aW50MzJfdCBrZXksIHVpbnQzMl90ICp0eXBlLAotICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqKmRhdGEsIHNpemVfdCAqc2l6ZSkgY29uc3Q7Ci0KLSAgICBib29sIGhhc0RhdGEodWludDMyX3Qga2V5KSBjb25zdDsKLQotICAgIFN0cmluZzggdG9TdHJpbmcoKSBjb25zdDsKLSAgICB2b2lkIGR1bXBUb0xvZygpIGNvbnN0OwotCi0gICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwgJnBhcmNlbCk7Ci0gICAgc3RhdHVzX3QgdXBkYXRlRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgJnBhcmNlbCk7Ci0gICAgc3RhdGljIHNwPE1ldGFEYXRhPiBjcmVhdGVGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAmcGFyY2VsKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfk1ldGFEYXRhKCk7Ci0KLXByaXZhdGU6Ci0gICAgc3RydWN0IHR5cGVkX2RhdGEgewotICAgICAgICB0eXBlZF9kYXRhKCk7Ci0gICAgICAgIH50eXBlZF9kYXRhKCk7Ci0KLSAgICAgICAgdHlwZWRfZGF0YShjb25zdCBNZXRhRGF0YTo6dHlwZWRfZGF0YSAmKTsKLSAgICAgICAgdHlwZWRfZGF0YSAmb3BlcmF0b3I9KGNvbnN0IE1ldGFEYXRhOjp0eXBlZF9kYXRhICYpOwotCi0gICAgICAgIHZvaWQgY2xlYXIoKTsKLSAgICAgICAgdm9pZCBzZXREYXRhKHVpbnQzMl90IHR5cGUsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKLSAgICAgICAgdm9pZCBnZXREYXRhKHVpbnQzMl90ICp0eXBlLCBjb25zdCB2b2lkICoqZGF0YSwgc2l6ZV90ICpzaXplKSBjb25zdDsKLSAgICAgICAgLy8gbWF5IGluY2x1ZGUgaGV4ZHVtcCBvZiBiaW5hcnkgZGF0YSBpZiB2ZXJib3NlPXRydWUKLSAgICAgICAgU3RyaW5nOCBhc1N0cmluZyhib29sIHZlcmJvc2UpIGNvbnN0OwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgdWludDMyX3QgbVR5cGU7Ci0gICAgICAgIHNpemVfdCBtU2l6ZTsKLQotICAgICAgICB1bmlvbiB7Ci0gICAgICAgICAgICB2b2lkICpleHRfZGF0YTsKLSAgICAgICAgICAgIGZsb2F0IHJlc2Vydm9pcjsKLSAgICAgICAgfSB1OwotCi0gICAgICAgIGJvb2wgdXNlc1Jlc2Vydm9pcigpIGNvbnN0IHsKLSAgICAgICAgICAgIHJldHVybiBtU2l6ZSA8PSBzaXplb2YodS5yZXNlcnZvaXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCAqYWxsb2NhdGVTdG9yYWdlKHNpemVfdCBzaXplKTsKLSAgICAgICAgdm9pZCBmcmVlU3RvcmFnZSgpOwotCi0gICAgICAgIHZvaWQgKnN0b3JhZ2UoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdXNlc1Jlc2Vydm9pcigpID8gJnUucmVzZXJ2b2lyIDogdS5leHRfZGF0YTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IHZvaWQgKnN0b3JhZ2UoKSBjb25zdCB7Ci0gICAgICAgICAgICByZXR1cm4gdXNlc1Jlc2Vydm9pcigpID8gJnUucmVzZXJ2b2lyIDogdS5leHRfZGF0YTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBzdHJ1Y3QgUmVjdCB7Ci0gICAgICAgIGludDMyX3QgbUxlZnQsIG1Ub3AsIG1SaWdodCwgbUJvdHRvbTsKLSAgICB9OwotCi0gICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIHR5cGVkX2RhdGE+IG1JdGVtczsKLQotICAgIC8vIE1ldGFEYXRhICZvcGVyYXRvcj0oY29uc3QgTWV0YURhdGEgJik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIE1FVEFfREFUQV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjE2MGY4ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vLi4vbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMWUxMjE5MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vLi4vbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVhODA4MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVUQV9EQVRBX1VUSUxTX0hfCisKKyNkZWZpbmUgTUVUQV9EQVRBX1VUSUxTX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBQnVmZmVyOworYm9vbCBNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoTWV0YURhdGFCYXNlICZtZXRhLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7Citib29sIE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEsIHVuc2lnbmVkIHByb2ZpbGUsIHVuc2lnbmVkIHNhbXBsaW5nX2ZyZXFfaW5kZXgsCisgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxfY29uZmlndXJhdGlvbik7CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVUQV9EQVRBX1VUSUxTX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L05ka1V0aWxzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L05ka1V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY4ODg0YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTmRrVXRpbHMuaApAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBOREtfVVRJTFNfSF8KKworI2RlZmluZSBOREtfVVRJTFNfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrV3JhcHBlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3NwPE1ldGFEYXRhPiBjb252ZXJ0TWVkaWFGb3JtYXRXcmFwcGVyVG9NZXRhRGF0YSgKKyAgICAgICAgY29uc3Qgc3A8QU1lZGlhRm9ybWF0V3JhcHBlcj4gJmZtdCk7CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTkRLX1VUSUxTX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5oCmluZGV4IDZhOTNiZDUuLjU0YTcwOTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5oCkBAIC0xNyw5ICsxNywxMSBAQAogI2lmbmRlZiBOVV9NRURJQV9FWFRSQUNUT1JfSF8KICNkZWZpbmUgTlVfTUVESUFfRVhUUkFDVE9SX0hfCiAKKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KQEAgLTMyLDcgKzM0LDcgQEAKIHN0cnVjdCBBQnVmZmVyOwogc3RydWN0IEFNZXNzYWdlOwogY2xhc3MgRGF0YVNvdXJjZTsKLXN0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKK3N0cnVjdCBNZWRpYUhUVFBTZXJ2aWNlOwogY2xhc3MgTWVkaWFCdWZmZXI7CiBjbGFzcyBNZWRpYUV4dHJhY3RvcjsKIHN0cnVjdCBNZWRpYVNvdXJjZTsKQEAgLTUyLDcgKzU0LDcgQEAKICAgICBOdU1lZGlhRXh0cmFjdG9yKCk7CiAKICAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKAotICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsCiAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyA9IE5VTEwpOwogCkBAIC02MiwxMiArNjQsMTggQEAKIAogICAgIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IEhJbnRlcmZhY2VUb2tlbiAmY2FzVG9rZW4pOwogCisgICAgdm9pZCBkaXNjb25uZWN0KCk7CisKICAgICBzaXplX3QgY291bnRUcmFja3MoKSBjb25zdDsKICAgICBzdGF0dXNfdCBnZXRUcmFja0Zvcm1hdChzaXplX3QgaW5kZXgsIHNwPEFNZXNzYWdlPiAqZm9ybWF0LCB1aW50MzJfdCBmbGFncyA9IDApIGNvbnN0OwogCiAgICAgc3RhdHVzX3QgZ2V0RmlsZUZvcm1hdChzcDxBTWVzc2FnZT4gKmZvcm1hdCkgY29uc3Q7CiAKLSAgICBzdGF0dXNfdCBzZWxlY3RUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHN0YXR1c190IGdldEV4aWZPZmZzZXRTaXplKG9mZjY0X3QgKm9mZnNldCwgc2l6ZV90ICpzaXplKSBjb25zdDsKKworICAgIHN0YXR1c190IHNlbGVjdFRyYWNrKHNpemVfdCBpbmRleCwgaW50NjRfdCBzdGFydFRpbWVVcyA9IC0xbGwsCisgICAgICAgICAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGUgPQorICAgICAgICAgICAgICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUX1NZTkMpOwogICAgIHN0YXR1c190IHVuc2VsZWN0VHJhY2soc2l6ZV90IGluZGV4KTsKIAogICAgIHN0YXR1c190IHNlZWtUbygKQEAgLTc1LDggKzgzLDEzIEBACiAgICAgICAgICAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGUgPQogICAgICAgICAgICAgICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUX1NZTkMpOwogCisgICAgLy8gRWFjaCBzZWxlY3RlZCB0cmFjayBoYXMgYSByZWFkIHBvaW50ZXIuCisgICAgLy8gYWR2YW5jZSgpIGFkdmFuY2VzIHRoZSByZWFkIHBvaW50ZXIgd2l0aCB0aGUgbG93ZXN0IHRpbWVzdGFtcC4KICAgICBzdGF0dXNfdCBhZHZhbmNlKCk7CisgICAgLy8gcmVhZFNhbXBsZURhdGEoKSByZWFkcyB0aGUgc2FtcGxlIHdpdGggdGhlIGxvd2VzdCB0aW1lc3RhbXAuCiAgICAgc3RhdHVzX3QgcmVhZFNhbXBsZURhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CisKKyAgICBzdGF0dXNfdCBnZXRTYW1wbGVTaXplKHNpemVfdCAqc2FtcGxlU2l6ZSk7CiAgICAgc3RhdHVzX3QgZ2V0U2FtcGxlVHJhY2tJbmRleChzaXplX3QgKnRyYWNrSW5kZXgpOwogICAgIHN0YXR1c190IGdldFNhbXBsZVRpbWUoaW50NjRfdCAqc2FtcGxlVGltZVVzKTsKICAgICBzdGF0dXNfdCBnZXRTYW1wbGVNZXRhKHNwPE1ldGFEYXRhPiAqc2FtcGxlTWV0YSk7CkBAIC05NiwxMiArMTA5LDIwIEBACiAgICAgICAgIGtNYXhUcmFja0NvdW50ID0gMTYzODQsCiAgICAgfTsKIAorICAgIHN0cnVjdCBTYW1wbGUgeworICAgICAgICBTYW1wbGUoKTsKKyAgICAgICAgU2FtcGxlKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyLCBpbnQ2NF90IHRpbWVVcyk7CisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqbUJ1ZmZlcjsKKyAgICAgICAgaW50NjRfdCBtU2FtcGxlVGltZVVzOworICAgIH07CisKICAgICBzdHJ1Y3QgVHJhY2tJbmZvIHsKICAgICAgICAgc3A8SU1lZGlhU291cmNlPiBtU291cmNlOwogICAgICAgICBzaXplX3QgbVRyYWNrSW5kZXg7CisgICAgICAgIG1lZGlhX3RyYWNrX3R5cGUgbVRyYWNrVHlwZTsKKyAgICAgICAgc2l6ZV90IG1NYXhGZXRjaENvdW50OwogICAgICAgICBzdGF0dXNfdCBtRmluYWxSZXN1bHQ7Ci0gICAgICAgIE1lZGlhQnVmZmVyICptU2FtcGxlOwotICAgICAgICBpbnQ2NF90IG1TYW1wbGVUaW1lVXM7CisgICAgICAgIHN0ZDo6bGlzdDxTYW1wbGU+IG1TYW1wbGVzOwogCiAgICAgICAgIHVpbnQzMl90IG1UcmFja0ZsYWdzOyAgLy8gYml0bWFzayBvZiAiVHJhY2tGbGFncyIKICAgICB9OwpAQCAtMTE3LDE2ICsxMzgsMjMgQEAKICAgICBpbnQ2NF90IG1Ub3RhbEJpdHJhdGU7ICAvLyBpbiBiaXRzL3NlYwogICAgIGludDY0X3QgbUR1cmF0aW9uVXM7CiAKLSAgICBzc2l6ZV90IGZldGNoVHJhY2tTYW1wbGVzKAorICAgIHNzaXplX3QgZmV0Y2hBbGxUcmFja1NhbXBsZXMoCisgICAgICAgICAgICBpbnQ2NF90IHNlZWtUaW1lVXMgPSAtMWxsLAorICAgICAgICAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlID0KKyAgICAgICAgICAgICAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVF9TWU5DKTsKKyAgICB2b2lkIGZldGNoVHJhY2tTYW1wbGVzKAorICAgICAgICAgICAgVHJhY2tJbmZvICppbmZvLAogICAgICAgICAgICAgaW50NjRfdCBzZWVrVGltZVVzID0gLTFsbCwKICAgICAgICAgICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZSA9CiAgICAgICAgICAgICAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1RfU1lOQyk7CiAKLSAgICB2b2lkIHJlbGVhc2VUcmFja1NhbXBsZXMoKTsKKyAgICB2b2lkIHJlbGVhc2VPbmVTYW1wbGUoVHJhY2tJbmZvICppbmZvKTsKKyAgICB2b2lkIHJlbGVhc2VUcmFja1NhbXBsZXMoVHJhY2tJbmZvICppbmZvKTsKKyAgICB2b2lkIHJlbGVhc2VBbGxUcmFja1NhbXBsZXMoKTsKIAogICAgIGJvb2wgZ2V0VG90YWxCaXRyYXRlKGludDY0X3QgKmJpdFJhdGUpIGNvbnN0OwogICAgIHN0YXR1c190IHVwZGF0ZUR1cmF0aW9uQW5kQml0cmF0ZSgpOwotICAgIHN0YXR1c190IGFwcGVuZFZvcmJpc051bVBhZ2VTYW1wbGVzKFRyYWNrSW5mbyAqaW5mbywgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CisgICAgc3RhdHVzX3QgYXBwZW5kVm9yYmlzTnVtUGFnZVNhbXBsZXMoTWVkaWFCdWZmZXJCYXNlICptYnVmLCBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE51TWVkaWFFeHRyYWN0b3IpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT01YQ2xpZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09NWENsaWVudC5oCmluZGV4IDJmMTU5YjAuLmJiMTMzZDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT01YQ2xpZW50LmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PTVhDbGllbnQuaApAQCAtMjcsMTYgKzI3LDEwIEBACiAgICAgT01YQ2xpZW50KCk7CiAKICAgICBzdGF0dXNfdCBjb25uZWN0KCk7Ci0gICAgc3RhdHVzX3QgY29ubmVjdChib29sKiB0cmVibGVGbGFnKTsKLSAgICBzdGF0dXNfdCBjb25uZWN0KGNvbnN0IGNoYXIqIG5hbWUsIGJvb2wqIHRyZWJsZUZsYWcgPSBudWxscHRyKTsKLQotICAgIHN0YXR1c190IGNvbm5lY3RMZWdhY3koKTsKLSAgICBzdGF0dXNfdCBjb25uZWN0VHJlYmxlKGNvbnN0IGNoYXIqIG5hbWUgPSAiZGVmYXVsdCIpOworICAgIHN0YXR1c190IGNvbm5lY3QoY29uc3QgY2hhciogbmFtZSk7CiAgICAgdm9pZCBkaXNjb25uZWN0KCk7CiAKLSAgICBzcDxJT01YPiBpbnRlcmZhY2UoKSB7Ci0gICAgICAgIHJldHVybiBtT01YOwotICAgIH0KKyAgICBzcDxJT01YPiBpbnRlcmZhY2UoKTsKIAogcHJpdmF0ZToKICAgICBzcDxJT01YPiBtT01YOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PbXhJbmZvQnVpbGRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PbXhJbmZvQnVpbGRlci5oCmluZGV4IDFiNGQ4NzMuLjI4ZjYwOTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT214SW5mb0J1aWxkZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09teEluZm9CdWlsZGVyLmgKQEAgLTI1LDYgKzI1LDcgQEAKIGNsYXNzIE9teEluZm9CdWlsZGVyIDogcHVibGljIE1lZGlhQ29kZWNMaXN0QnVpbGRlckJhc2UgewogcHVibGljOgogICAgIE9teEluZm9CdWlsZGVyKCk7CisgICAgfk9teEluZm9CdWlsZGVyKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwogICAgIHN0YXR1c190IGJ1aWxkTWVkaWFDb2RlY0xpc3QoTWVkaWFDb2RlY0xpc3RXcml0ZXIqIHdyaXRlcikgb3ZlcnJpZGU7CiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1BlcnNpc3RlbnRTdXJmYWNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1BlcnNpc3RlbnRTdXJmYWNlLmgKaW5kZXggZDhiNzVhMi4uNDliMzZjOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9QZXJzaXN0ZW50U3VyZmFjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUGVyc2lzdGVudFN1cmZhY2UuaApAQCAtMTgsMjIgKzE4LDM0IEBACiAKICNkZWZpbmUgUEVSU0lTVEVOVF9TVVJGQUNFX0hfCiAKLSNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgogI2luY2x1ZGUgPGFuZHJvaWQvSUdyYXBoaWNCdWZmZXJTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxoaWRsL0h5YnJpZEludGVyZmFjZS5oPgorI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorCit1c2luZyBhbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZTsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgUGVyc2lzdGVudFN1cmZhY2UgOiBwdWJsaWMgUmVmQmFzZSB7CiAgICAgUGVyc2lzdGVudFN1cmZhY2UoKSB7fQogCisgICAgLy8gY3JlYXRlIGFuIE9NWCBwZXJzaXN0ZW50IHN1cmZhY2UKICAgICBQZXJzaXN0ZW50U3VyZmFjZSgKICAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBidWZmZXJQcm9kdWNlciwKICAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyU291cmNlPiYgYnVmZmVyU291cmNlKSA6CiAgICAgICAgIG1CdWZmZXJQcm9kdWNlcihidWZmZXJQcm9kdWNlciksCiAgICAgICAgIG1CdWZmZXJTb3VyY2UoYnVmZmVyU291cmNlKSB7IH0KIAorICAgIC8vIGNyZWF0ZSBhIEhJREwgcGVyc2lzdGVudCBzdXJmYWNlCisgICAgUGVyc2lzdGVudFN1cmZhY2UoCisgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgYnVmZmVyUHJvZHVjZXIsCisgICAgICAgICAgICBjb25zdCBzcDxJQmFzZT4mIGhpZGxUYXJnZXQpIDoKKyAgICAgICAgbUJ1ZmZlclByb2R1Y2VyKGJ1ZmZlclByb2R1Y2VyKSwKKyAgICAgICAgbUhpZGxUYXJnZXQoaGlkbFRhcmdldCkgeyB9CisKICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBnZXRCdWZmZXJQcm9kdWNlcigpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1CdWZmZXJQcm9kdWNlcjsKICAgICB9CkBAIC00Miw5ICs1NCwyNSBAQAogICAgICAgICByZXR1cm4gbUJ1ZmZlclNvdXJjZTsKICAgICB9CiAKKyAgICBzcDxJQmFzZT4gZ2V0SGlkbFRhcmdldCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1IaWRsVGFyZ2V0OworICAgIH0KKwogICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0IHsKICAgICAgICAgcGFyY2VsLT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihtQnVmZmVyUHJvZHVjZXIpKTsKKyAgICAgICAgLy8gdGhpcyBjYW4gaGFuZGxlIG51bGwKICAgICAgICAgcGFyY2VsLT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihtQnVmZmVyU291cmNlKSk7CisgICAgICAgIC8vIHdyaXRlIGhpZGwgdGFyZ2V0CisgICAgICAgIGlmIChtSGlkbFRhcmdldCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBIYWxUb2tlbiB0b2tlbjsKKyAgICAgICAgICAgIGJvb2wgcmVzdWx0ID0gY3JlYXRlSGFsVG9rZW4obUhpZGxUYXJnZXQsICZ0b2tlbik7CisgICAgICAgICAgICBwYXJjZWwtPndyaXRlQm9vbChyZXN1bHQpOworICAgICAgICAgICAgaWYgKHJlc3VsdCkgeworICAgICAgICAgICAgICAgIHBhcmNlbC0+d3JpdGVCeXRlQXJyYXkodG9rZW4uc2l6ZSgpLCB0b2tlbi5kYXRhKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGFyY2VsLT53cml0ZUJvb2woZmFsc2UpOworICAgICAgICB9CiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CiAKQEAgLTUzLDEyICs4MSwyNCBAQAogICAgICAgICAgICAgICAgIHBhcmNlbC0+cmVhZFN0cm9uZ0JpbmRlcigpKTsKICAgICAgICAgbUJ1ZmZlclNvdXJjZSA9IGludGVyZmFjZV9jYXN0PElHcmFwaGljQnVmZmVyU291cmNlPigKICAgICAgICAgICAgICAgICBwYXJjZWwtPnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgIC8vIHJlYWQgaGlkbCB0YXJnZXQKKyAgICAgICAgYm9vbCBoYXZlSGlkbFRhcmdldCA9IHBhcmNlbC0+cmVhZEJvb2woKTsKKyAgICAgICAgaWYgKGhhdmVIaWRsVGFyZ2V0KSB7CisgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB0b2tlblZlY3RvcjsKKyAgICAgICAgICAgIHBhcmNlbC0+cmVhZEJ5dGVWZWN0b3IoJnRva2VuVmVjdG9yKTsKKyAgICAgICAgICAgIEhhbFRva2VuIHRva2VuID0gSGFsVG9rZW4odG9rZW5WZWN0b3IpOworICAgICAgICAgICAgbUhpZGxUYXJnZXQgPSByZXRyaWV2ZUhhbEludGVyZmFjZSh0b2tlbik7CisgICAgICAgICAgICBkZWxldGVIYWxUb2tlbih0b2tlbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtSGlkbFRhcmdldC5jbGVhcigpOworICAgICAgICB9CiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CiAKIHByaXZhdGU6CiAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbUJ1ZmZlclByb2R1Y2VyOwogICAgIHNwPElHcmFwaGljQnVmZmVyU291cmNlPiBtQnVmZmVyU291cmNlOworICAgIHNwPElCYXNlPiBtSGlkbFRhcmdldDsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFBlcnNpc3RlbnRTdXJmYWNlKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZURhdGFTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUmVtb3RlRGF0YVNvdXJjZS5oCmluZGV4IGM5MWRkZmMuLmUxOTFlNmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUmVtb3RlRGF0YVNvdXJjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUmVtb3RlRGF0YVNvdXJjZS5oCkBAIC0xOSw4ICsxOSw4IEBACiAKICNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSURhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVNZWRpYUV4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVNZWRpYUV4dHJhY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwOWU2NjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhRXh0cmFjdG9yLmgKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBSRU1PVEVfTUVESUFfRVhUUkFDVE9SX0hfCisjZGVmaW5lIFJFTU9URV9NRURJQV9FWFRSQUNUT1JfSF8KKworI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE1lZGlhQW5hbHl0aWNzSXRlbTsKKworLy8gSU1lZGlhRXh0cmFjdG9yIHdyYXBwZXIgdG8gdGhlIE1lZGlhRXh0cmFjdG9yLgorY2xhc3MgUmVtb3RlTWVkaWFFeHRyYWN0b3IgOiBwdWJsaWMgQm5NZWRpYUV4dHJhY3RvciB7CitwdWJsaWM6CisgICAgc3RhdGljIHNwPElNZWRpYUV4dHJhY3Rvcj4gd3JhcCgKKyAgICAgICAgICAgIE1lZGlhRXh0cmFjdG9yICpleHRyYWN0b3IsCisgICAgICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLAorICAgICAgICAgICAgY29uc3Qgc3A8UmVmQmFzZT4gJnBsdWdpbik7CisKKyAgICB2aXJ0dWFsIH5SZW1vdGVNZWRpYUV4dHJhY3RvcigpOworICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7CisgICAgdmlydHVhbCBzcDxJTWVkaWFTb3VyY2U+IGdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0VHJhY2tNZXRhRGF0YShzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzID0gMCk7CisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0TWV0YURhdGEoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldHJpY3MoUGFyY2VsICpyZXBseSk7CisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWVkaWFDYXMoY29uc3QgSEludGVyZmFjZVRva2VuICZjYXNUb2tlbik7CisgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpOworCitwcml2YXRlOgorICAgIE1lZGlhRXh0cmFjdG9yICptRXh0cmFjdG9yOworICAgIHNwPERhdGFTb3VyY2U+IG1Tb3VyY2U7CisgICAgc3A8UmVmQmFzZT4gbUV4dHJhY3RvclBsdWdpbjsKKworICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAqbUFuYWx5dGljc0l0ZW07CisKKyAgICBleHBsaWNpdCBSZW1vdGVNZWRpYUV4dHJhY3RvcigKKyAgICAgICAgICAgIE1lZGlhRXh0cmFjdG9yICpleHRyYWN0b3IsCisgICAgICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLAorICAgICAgICAgICAgY29uc3Qgc3A8UmVmQmFzZT4gJnBsdWdpbik7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhSZW1vdGVNZWRpYUV4dHJhY3Rvcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFJFTU9URV9NRURJQV9FWFRSQUNUT1JfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFTb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDcyMGFmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVNZWRpYVNvdXJjZS5oCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgUkVNT1RFX01FRElBX1NPVVJDRV9IXworI2RlZmluZSBSRU1PVEVfTUVESUFfU09VUkNFX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBJTWVkaWFTcm91Y2Ugd3JhcHBlciB0byB0aGUgTWVkaWFTb3VyY2UuCitjbGFzcyBSZW1vdGVNZWRpYVNvdXJjZSA6IHB1YmxpYyBCbk1lZGlhU291cmNlIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgc3A8SU1lZGlhU291cmNlPiB3cmFwKAorICAgICAgICAgICAgY29uc3Qgc3A8UmVtb3RlTWVkaWFFeHRyYWN0b3I+ICZleHRyYWN0b3IsCisgICAgICAgICAgICBNZWRpYVRyYWNrICpzb3VyY2UsCisgICAgICAgICAgICBjb25zdCBzcDxSZWZCYXNlPiAmcGx1Z2luKTsKKyAgICB2aXJ0dWFsIH5SZW1vdGVNZWRpYVNvdXJjZSgpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwKKyAgICAgICAgICAgIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0b3BUaW1lVXMoaW50NjRfdCBzdG9wVGltZVVzKTsKKworcHJpdmF0ZToKKyAgICBzcDxSZW1vdGVNZWRpYUV4dHJhY3Rvcj4gbUV4dHJhY3RvcjsKKyAgICBNZWRpYVRyYWNrICptU291cmNlOworICAgIHNwPFJlZkJhc2U+IG1FeHRyYWN0b3JQbHVnaW47CisKKyAgICBleHBsaWNpdCBSZW1vdGVNZWRpYVNvdXJjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPFJlbW90ZU1lZGlhRXh0cmFjdG9yPiAmZXh0cmFjdG9yLAorICAgICAgICAgICAgTWVkaWFUcmFjayAqc291cmNlLAorICAgICAgICAgICAgY29uc3Qgc3A8UmVmQmFzZT4gJnBsdWdpbik7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhSZW1vdGVNZWRpYVNvdXJjZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFJFTU9URV9NRURJQV9TT1VSQ0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvU2ltcGxlRGVjb2RpbmdTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvU2ltcGxlRGVjb2RpbmdTb3VyY2UuaAppbmRleCBhMDAwZmRlLi4yM2RlZmI0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1NpbXBsZURlY29kaW5nU291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9TaW1wbGVEZWNvZGluZ1NvdXJjZS5oCkBAIC0xNyw3ICsxNyw3IEBACiAjaWZuZGVmIFNJTVBMRV9ERUNPRElOR19TT1VSQ0VfSF8KICNkZWZpbmUgU0lNUExFX0RFQ09ESU5HX1NPVVJDRV9IXwogCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTXV0ZXhlZC5oPgogCkBAIC00NSwxMiArNDUsMTMgQEAKICAgICAvLyBkb2VzIG5vdCBzdXBwb3J0IHNlY3VyZSBpbnB1dCBvciBwYXVzaW5nLgogICAgIC8vIGlmIHxkZXNpcmVkQ29kZWN8IGlzIGdpdmVuLCB1c2UgdGhpcyBzcGVjaWZpYyBjb2RlYy4KICAgICBzdGF0aWMgc3A8U2ltcGxlRGVjb2RpbmdTb3VyY2U+IENyZWF0ZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYVNvdXJjZT4gJnNvdXJjZSwgdWludDMyX3QgZmxhZ3MsCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSwgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgICAgICBjb25zdCBzcDxBTmF0aXZlV2luZG93PiAmbmF0aXZlV2luZG93LAotICAgICAgICAgICAgY29uc3QgY2hhciAqZGVzaXJlZENvZGVjID0gTlVMTCk7CisgICAgICAgICAgICBjb25zdCBjaGFyICpkZXNpcmVkQ29kZWMgPSBOVUxMLAorICAgICAgICAgICAgYm9vbCBza2lwTWVkaWFDb2RlY0xpc3QgPSBmYWxzZSk7CiAKICAgICBzdGF0aWMgc3A8U2ltcGxlRGVjb2RpbmdTb3VyY2U+IENyZWF0ZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYVNvdXJjZT4gJnNvdXJjZSwgdWludDMyX3QgZmxhZ3MgPSAwKTsKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlLCB1aW50MzJfdCBmbGFncyA9IDApOwogCiAgICAgdmlydHVhbCB+U2ltcGxlRGVjb2RpbmdTb3VyY2UoKTsKIApAQCAtNjQsMjAgKzY1LDE5IEBACiAgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7CiAKICAgICAvLyByZWFkcyBmcm9tIHRoZSBzb3VyY2UuIFRoaXMgY2FsbCBhbHdheXMgYmxvY2tzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZChNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZChNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKTsKIAogICAgIC8vIHVuc3VwcG9ydGVkIG1ldGhvZHMKICAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCkgeyByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047IH0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlcnMoY29uc3QgVmVjdG9yPE1lZGlhQnVmZmVyICo+ICYpIHsgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOyB9CiAKIHByaXZhdGU6CiAgICAgLy8gQ29uc3RydWN0IHRoaXMgdXNpbmcgYSBjb2RlYywgc291cmNlIGFuZCBsb29wZXIuCiAgICAgU2ltcGxlRGVjb2RpbmdTb3VyY2UoCi0gICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjPiAmY29kZWMsIGNvbnN0IHNwPElNZWRpYVNvdXJjZT4gJnNvdXJjZSwgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlciwKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWM+ICZjb2RlYywgY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UsIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsCiAgICAgICAgICAgICBib29sIHVzaW5nU3VyZmFjZSwgYm9vbCBpc1ZvcmJpcywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpOwogCiAgICAgc3A8TWVkaWFDb2RlYz4gbUNvZGVjOwotICAgIHNwPElNZWRpYVNvdXJjZT4gbVNvdXJjZTsKKyAgICBzcDxNZWRpYVNvdXJjZT4gbVNvdXJjZTsKICAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOwogICAgIGJvb2wgbVVzaW5nU3VyZmFjZTsKICAgICBib29sIG1Jc1ZvcmJpczsKQEAgLTEwNCw3ICsxMDQsOCBAQAogCiAgICAgLy8gZG8gdGhlIGFjdHVhbCByZWFkaW5nCiAgICAgc3RhdHVzX3QgZG9SZWFkKAotICAgICAgICAgICAgTXV0ZXhlZDxQcm90ZWN0ZWRTdGF0ZT46OkxvY2tlZCAmbWUsIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyk7CisgICAgICAgICAgICBNdXRleGVkPFByb3RlY3RlZFN0YXRlPjo6TG9ja2VkICZtZSwgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLAorICAgICAgICAgICAgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlTWVkaWFTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNjc3ZmEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlTWVkaWFTb3VyY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0dVSV9TVVJGQUNFTUVESUFTT1VSQ0VfSAotI2RlZmluZSBBTkRST0lEX0dVSV9TVVJGQUNFTUVESUFTT1VSQ0VfSAotCi0jaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KLSNpbmNsdWRlIDxndWkvQnVmZmVyUXVldWUuaD4KLQotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9NZXRhZGF0YUJ1ZmZlclR5cGUuaD4KLQotI2luY2x1ZGUgImZvdW5kYXRpb24vQUJhc2UuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBTdHJpbmc4OwotY2xhc3MgR3JhcGhpY0J1ZmZlcjsKLQotLy8gQVNTVU1QVElPTlMKLS8vIDEuIFN1cmZhY2VNZWRpYVNvdXJjZSBpcyBpbml0aWFsaXplZCB3aXRoIHdpZHRoKmhlaWdodCB3aGljaAotLy8gY2FuIG5ldmVyIGNoYW5nZS4gIEhvd2V2ZXIsIGRlcWV1ZXVlIGJ1ZmZlciBkb2VzIG5vdCBjdXJyZW50bHkKLS8vIGVuZm9yY2UgdGhpcyBhcyBpbiBCdWZmZXJRdWV1ZSwgZGVxdWV1ZSBjYW4gYmUgdXNlZCBieSBTdXJmYWNlCi0vLyB3aGljaCBjYW4gbW9kaWZ5IHRoZSBkZWZhdWx0IHdpZHRoIGFuZCBoZWdodC4gIEFsc28gbmVpdGhlciB0aGUgd2lkdGgKLS8vIG5vciBoZWlnaHQgY2FuIGJlIDAuCi0vLyAyLiBzZXRTeW5jaHJvbm91c01vZGUgaXMgbmV2ZXIgdXNlZCAoYmFzaWNhbGx5IG5vIG9uZSBzaG91bGQgY2FsbAotLy8gc2V0U3luY2hyb25vdXNNb2RlKGZhbHNlKQotLy8gMy4gc2V0Q3JvcCwgc2V0VHJhbnNmb3JtLCBzZXRTY2FsaW5nTW9kZSBzaG91bGQgbmV2ZXIgYmUgdXNlZAotLy8gNC4gcXVldWVCdWZmZXIgcmV0dXJucyBhIGZpbGxlZCBidWZmZXIgdG8gdGhlIFN1cmZhY2VNZWRpYVNvdXJjZS4gSW4gYWRkaXRpb24sIGEKLS8vIHRpbWVzdGFtcCBtdXN0IGJlIHByb3ZpZGVkIGZvciB0aGUgYnVmZmVyLiBUaGUgdGltZXN0YW1wIGlzIGluCi0vLyBuYW5vc2Vjb25kcywgYW5kIG11c3QgYmUgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nLiBJdHMgb3RoZXIgc2VtYW50aWNzCi0vLyAoemVybyBwb2ludCwgZXRjKSBhcmUgY2xpZW50LWRlcGVuZGVudCBhbmQgc2hvdWxkIGJlIGRvY3VtZW50ZWQgYnkgdGhlCi0vLyBjbGllbnQuCi0vLyA1LiBPbmNlIGRpc2Nvbm5lY3RlZCwgU3VyZmFjZU1lZGlhU291cmNlIGNhbiBiZSByZXVzZWQgKGNhbiBub3QKLS8vIGNvbm5lY3QgYWdhaW4pCi0vLyA2LiBTdG9wIGlzIGEgaGFyZCBzdG9wLCB0aGUgbGFzdCBmZXcgZnJhbWVzIGhlbGQgYnkgdGhlIGVuY29kZXIKLS8vIG1heSBiZSBkcm9wcGVkLiAgSXQgaXMgcG9zc2libGUgdG8gd2FpdCBmb3IgdGhlIGJ1ZmZlcnMgdG8gYmUKLS8vIHJldHVybmVkIChidXQgbm90IGltcGxlbWVudGVkKQotCi0jZGVmaW5lIERFQlVHX1BFTkRJTkdfQlVGRkVSUyAgIDAKLQotY2xhc3MgU3VyZmFjZU1lZGlhU291cmNlIDogcHVibGljIE1lZGlhU291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgTWVkaWFCdWZmZXJPYnNlcnZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIENvbnN1bWVyTGlzdGVuZXIgewotcHVibGljOgotICAgIGVudW0geyBNSU5fVU5ERVFVRVVFRF9CVUZGRVJTID0gNH07Ci0KLSAgICBzdHJ1Y3QgRnJhbWVBdmFpbGFibGVMaXN0ZW5lciA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UgewotICAgICAgICAvLyBvbkZyYW1lQXZhaWxhYmxlKCkgaXMgY2FsbGVkIGZyb20gcXVldWVCdWZmZXIoKSBpcyB0aGUgRklGTyBpcwotICAgICAgICAvLyBlbXB0eS4gWW91IGNhbiB1c2UgU3VyZmFjZU1lZGlhU291cmNlOjpnZXRRdWV1ZWRDb3VudCgpIHRvCi0gICAgICAgIC8vIGZpZ3VyZSBvdXQgaWYgdGhlcmUgYXJlIG1vcmUgZnJhbWVzIHdhaXRpbmcuCi0gICAgICAgIC8vIFRoaXMgaXMgY2FsbGVkIHdpdGhvdXQgYW55IGxvY2sgaGVsZCBjYW4gYmUgY2FsbGVkIGNvbmN1cnJlbnRseSBieQotICAgICAgICAvLyBtdWx0aXBsZSB0aHJlYWRzLgotICAgICAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZUF2YWlsYWJsZSgpID0gMDsKLSAgICB9OwotCi0gICAgU3VyZmFjZU1lZGlhU291cmNlKHVpbnQzMl90IGJ1ZmZlcldpZHRoLCB1aW50MzJfdCBidWZmZXJIZWlnaHQpOwotCi0gICAgdmlydHVhbCB+U3VyZmFjZU1lZGlhU291cmNlKCk7Ci0KLSAgICAvLyBGb3IgdGhlIE1lZGlhU291cmNlIGludGVyZmFjZSBmb3IgdXNlIGJ5IFN0YWdlRnJpZ2h0UmVjb3JkZXI6Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKE1lZGlhQnVmZmVyICoqYnVmZmVyLAotICAgICAgICAgICAgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKLSAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKTsKLQotICAgIC8vIEdldCAvIFNldCB0aGUgZnJhbWUgcmF0ZSB1c2VkIGZvciBlbmNvZGluZy4gRGVmYXVsdCBmcHMgPSAzMAotICAgIHN0YXR1c190IHNldEZyYW1lUmF0ZShpbnQzMl90IGZwcykgOwotICAgIGludDMyX3QgZ2V0RnJhbWVSYXRlKCApIGNvbnN0OwotCi0gICAgLy8gVGhlIGNhbGwgZm9yIHRoZSBTdGFnZUZyaWdodFJlY29yZGVyIHRvIHRlbGwgdXMgdGhhdAotICAgIC8vIGl0IGlzIGRvbmUgdXNpbmcgdGhlIE1lZGlhQnVmZmVyIGRhdGEgc28gdGhhdCBpdHMgc3RhdGUKLSAgICAvLyBjYW4gYmUgc2V0IHRvIEZSRUUgZm9yIGRlcXVldWluZwotICAgIHZpcnR1YWwgdm9pZCBzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlciogYnVmZmVyKTsKLSAgICAvLyBlbmQgb2YgTWVkaWFTb3VyY2UgaW50ZXJmYWNlCi0KLSAgICAvLyBnZXRUaW1lc3RhbXAgcmV0cmlldmVzIHRoZSB0aW1lc3RhbXAgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbWFnZQotICAgIC8vIHNldCBieSB0aGUgbW9zdCByZWNlbnQgY2FsbCB0byByZWFkKCkKLSAgICAvLwotICAgIC8vIFRoZSB0aW1lc3RhbXAgaXMgaW4gbmFub3NlY29uZHMsIGFuZCBpcyBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcuIEl0cwotICAgIC8vIG90aGVyIHNlbWFudGljcyAoemVybyBwb2ludCwgZXRjKSBhcmUgc291cmNlLWRlcGVuZGVudCBhbmQgc2hvdWxkIGJlCi0gICAgLy8gZG9jdW1lbnRlZCBieSB0aGUgc291cmNlLgotICAgIGludDY0X3QgZ2V0VGltZXN0YW1wKCk7Ci0KLSAgICAvLyBzZXRGcmFtZUF2YWlsYWJsZUxpc3RlbmVyIHNldHMgdGhlIGxpc3RlbmVyIG9iamVjdCB0aGF0IHdpbGwgYmUgbm90aWZpZWQKLSAgICAvLyB3aGVuIGEgbmV3IGZyYW1lIGJlY29tZXMgYXZhaWxhYmxlLgotICAgIHZvaWQgc2V0RnJhbWVBdmFpbGFibGVMaXN0ZW5lcihjb25zdCBzcDxGcmFtZUF2YWlsYWJsZUxpc3RlbmVyPiYgbGlzdGVuZXIpOwotCi0gICAgLy8gZHVtcCBvdXIgc3RhdGUgaW4gYSBTdHJpbmcKLSAgICB2b2lkIGR1bXBTdGF0ZShTdHJpbmc4JiByZXN1bHQpIGNvbnN0OwotICAgIHZvaWQgZHVtcFN0YXRlKFN0cmluZzgmIHJlc3VsdCwgY29uc3QgY2hhciogcHJlZml4LCBjaGFyKiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IFNJWkUpIGNvbnN0OwotCi0gICAgLy8gbWV0YURhdGFTdG9yZWRJblZpZGVvQnVmZmVycyB0ZWxscyB0aGUgZW5jb2RlciB3aGF0IGtpbmQgb2YgbWV0YWRhdGEKLSAgICAvLyBpcyBwYXNzZWQgdGhyb3VnaCB0aGUgYnVmZmVycy4gQ3VycmVudGx5LCBpdCBpcyBzZXQgdG8gQU5XQnVmZmVyCi0gICAgTWV0YWRhdGFCdWZmZXJUeXBlIG1ldGFEYXRhU3RvcmVkSW5WaWRlb0J1ZmZlcnMoKSBjb25zdDsKLQotICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGdldFByb2R1Y2VyKCkgY29uc3QgeyByZXR1cm4gbVByb2R1Y2VyOyB9Ci0KLSAgICAvLyBUbyBiZSBjYWxsZWQgYmVmb3JlIHN0YXJ0KCkKLSAgICBzdGF0dXNfdCBzZXRNYXhBY3F1aXJlZEJ1ZmZlckNvdW50KHNpemVfdCBjb3VudCk7Ci0KLSAgICAvLyBUbyBiZSBjYWxsZWQgYmVmb3JlIHN0YXJ0KCkKLSAgICBzdGF0dXNfdCBzZXRVc2VBYnNvbHV0ZVRpbWVzdGFtcHMoKTsKLQotcHJvdGVjdGVkOgotCi0gICAgLy8gSW1wbGVtZW50YXRpb24gb2YgdGhlIEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyIGludGVyZmFjZS4gIFRoZXNlCi0gICAgLy8gY2FsbHMgYXJlIHVzZWQgdG8gbm90aWZ5IHRoZSBTdXJmYWNlIG9mIGFzeW5jaHJvbm91cyBldmVudHMgaW4gdGhlCi0gICAgLy8gQnVmZmVyUXVldWUuCi0gICAgdmlydHVhbCB2b2lkIG9uRnJhbWVBdmFpbGFibGUoY29uc3QgQnVmZmVySXRlbSYgaXRlbSk7Ci0KLSAgICAvLyBVc2VkIGFzIGEgaG9vayB0byBCdWZmZXJRdWV1ZTo6ZGlzY29ubmVjdCgpCi0gICAgLy8gVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGNsaWVudCBzaWRlIHdoZW4gaXQgaXMgZG9uZQotICAgIC8vIFRPRE86IEN1cnJlbnRseSwgdGhpcyBhbHNvIHNldHMgbVN0b3BwZWQgdG8gdHJ1ZSB3aGljaAotICAgIC8vIGlzIG5lZWRlZCBmb3IgdW5ibG9ja2luZyB0aGUgZW5jb2RlciB3aGljaCBtaWdodCBiZQotICAgIC8vIHdhaXRpbmcgdG8gcmVhZCBtb3JlIGZyYW1lcy4gU28gaWYgb24gdGhlIGNsaWVudCBzaWRlLAotICAgIC8vIHRoZSBzYW1lIHRocmVhZCBzdXBwbGllcyB0aGUgZnJhbWVzIGFuZCBhbHNvIGNhbGxzIHN0b3AKLSAgICAvLyBvbiB0aGUgZW5jb2RlciwgdGhlIGNsaWVudCBoYXMgdG8gY2FsbCBkaXNjb25uZWN0IGJlZm9yZQotICAgIC8vIGl0IGNhbGxzIHN0b3AuCi0gICAgLy8gSW4gdGhlIGNhc2Ugb2YgdGhlIGNhbWVyYSwKLSAgICAvLyB0aGF0IG5lZWQgbm90IGJlIHJlcXVpcmVkIHNpbmNlIHRoZSB0aHJlYWQgc3VwcGx5aW5nIHRoZQotICAgIC8vIGZyYW1lcyBpcyBzZXBhcmF0ZSB0aGFuIHRoZSBvbmUgY2FsbGluZyBzdG9wLgotICAgIHZpcnR1YWwgdm9pZCBvbkJ1ZmZlcnNSZWxlYXNlZCgpOwotCi0gICAgLy8gU3VyZmFjZU1lZGlhU291cmNlIGNhbid0IGhhbmRsZSBzaWRlYmFuZCBzdHJlYW1zLCBzbyB0aGlzIGlzIG5vdCBleHBlY3RlZAotICAgIC8vIHRvIGV2ZXIgYmUgY2FsbGVkLiBEb2VzIG5vdGhpbmcuCi0gICAgdmlydHVhbCB2b2lkIG9uU2lkZWJhbmRTdHJlYW1DaGFuZ2VkKCk7Ci0KLSAgICBzdGF0aWMgYm9vbCBpc0V4dGVybmFsRm9ybWF0KHVpbnQzMl90IGZvcm1hdCk7Ci0KLXByaXZhdGU6Ci0gICAgLy8gQSBCdWZmZXJRdWV1ZSwgcmVwcmVzZW50ZWQgYnkgdGhlc2UgaW50ZXJmYWNlcywgaXMgdGhlIGV4Y2hhbmdlIHBvaW50Ci0gICAgLy8gYmV0d2VlbiB0aGUgcHJvZHVjZXIgYW5kIHRoaXMgY29uc3VtZXIKLSAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtUHJvZHVjZXI7Ci0gICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gbUNvbnN1bWVyOwotCi0gICAgc3RydWN0IFNsb3REYXRhIHsKLSAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gbUdyYXBoaWNCdWZmZXI7Ci0gICAgICAgIHVpbnQ2NF90IG1GcmFtZU51bWJlcjsKLSAgICB9OwotCi0gICAgLy8gbVNsb3RzIGNhY2hlcyBHcmFwaGljQnVmZmVycyBhbmQgZnJhbWVOdW1iZXJzIGZyb20gdGhlIGJ1ZmZlciBxdWV1ZQotICAgIFNsb3REYXRhIG1TbG90c1tCdWZmZXJRdWV1ZTo6TlVNX0JVRkZFUl9TTE9UU107Ci0KLSAgICAvLyBUaGUgcGVybWVuZW50IHdpZHRoIGFuZCBoZWlnaHQgb2YgU01TIGJ1ZmZlcnMKLSAgICBpbnQgbVdpZHRoOwotICAgIGludCBtSGVpZ2h0OwotCi0gICAgLy8gbUN1cnJlbnRTbG90IGlzIHRoZSBidWZmZXIgc2xvdCBpbmRleCBvZiB0aGUgYnVmZmVyIHRoYXQgaXMgY3VycmVudGx5Ci0gICAgLy8gYmVpbmcgdXNlZCBieSBidWZmZXIgY29uc3VtZXIKLSAgICAvLyAoZS5nLiBTdGFnZUZyaWdodFJlY29yZGVyIGluIHRoZSBjYXNlIG9mIFN1cmZhY2VNZWRpYVNvdXJjZSBvciBHTFRleHR1cmUKLSAgICAvLyBpbiB0aGUgY2FzZSBvZiBTdXJmYWNlKS4KLSAgICAvLyBJdCBpcyBpbml0aWFsaXplZCB0byBJTlZBTElEX0JVRkZFUl9TTE9ULAotICAgIC8vIGluZGljYXRpbmcgdGhhdCBubyBidWZmZXIgc2xvdCBpcyBjdXJyZW50bHkgYm91bmQgdG8gdGhlIHRleHR1cmUuIE5vdGUsCi0gICAgLy8gaG93ZXZlciwgdGhhdCBhIHZhbHVlIG9mIElOVkFMSURfQlVGRkVSX1NMT1QgZG9lcyBub3QgbmVjZXNzYXJpbHkgbWVhbgotICAgIC8vIHRoYXQgbm8gYnVmZmVyIGlzIGJvdW5kIHRvIHRoZSB0ZXh0dXJlLiBBIGNhbGwgdG8gc2V0QnVmZmVyQ291bnQgd2lsbAotICAgIC8vIHJlc2V0IG1DdXJyZW50VGV4dHVyZSB0byBJTlZBTElEX0JVRkZFUl9TTE9ULgotICAgIGludCBtQ3VycmVudFNsb3Q7Ci0KLSAgICAvLyBtQ3VycmVudEJ1ZmZlcnMgaXMgYSBsaXN0IG9mIHRoZSBncmFwaGljIGJ1ZmZlcnMgdGhhdCBhcmUgYmVpbmcgdXNlZCBieQotICAgIC8vIGJ1ZmZlciBjb25zdW1lciAoaS5lLiB0aGUgdmlkZW8gZW5jb2RlcikuIEl0J3MgcG9zc2libGUgdGhhdCB0aGVzZQotICAgIC8vIGJ1ZmZlcnMgYXJlIG5vdCBhc3NvY2lhdGVkIHdpdGggYW55IGJ1ZmZlciBzbG90cywgc28gd2UgbXVzdCB0cmFjayB0aGVtCi0gICAgLy8gc2VwYXJhdGVseS4gIEJ1ZmZlcnMgYXJlIGFkZGVkIHRvIHRoaXMgbGlzdCBpbiByZWFkLCBhbmQgcmVtb3ZlZCBmcm9tCi0gICAgLy8gdGhpcyBsaXN0IGluIHNpZ25hbEJ1ZmZlclJldHVybmVkCi0gICAgVmVjdG9yPHNwPEdyYXBoaWNCdWZmZXI+ID4gbUN1cnJlbnRCdWZmZXJzOwotCi0gICAgc2l6ZV90IG1OdW1QZW5kaW5nQnVmZmVyczsKLQotI2lmIERFQlVHX1BFTkRJTkdfQlVGRkVSUwotICAgIFZlY3RvcjxNZWRpYUJ1ZmZlciAqPiBtUGVuZGluZ0J1ZmZlcnM7Ci0jZW5kaWYKLQotICAgIC8vIG1DdXJyZW50VGltZXN0YW1wIGlzIHRoZSB0aW1lc3RhbXAgZm9yIHRoZSBjdXJyZW50IHRleHR1cmUuIEl0Ci0gICAgLy8gZ2V0cyBzZXQgdG8gbUxhc3RRdWV1ZWRUaW1lc3RhbXAgZWFjaCB0aW1lIHVwZGF0ZVRleEltYWdlIGlzIGNhbGxlZC4KLSAgICBpbnQ2NF90IG1DdXJyZW50VGltZXN0YW1wOwotCi0gICAgLy8gbUZyYW1lQXZhaWxhYmxlTGlzdGVuZXIgaXMgdGhlIGxpc3RlbmVyIG9iamVjdCB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gYQotICAgIC8vIG5ldyBmcmFtZSBiZWNvbWVzIGF2YWlsYWJsZS4gSWYgaXQgaXMgbm90IE5VTEwgaXQgd2lsbCBiZSBjYWxsZWQgZnJvbQotICAgIC8vIHF1ZXVlQnVmZmVyLgotICAgIHNwPEZyYW1lQXZhaWxhYmxlTGlzdGVuZXI+IG1GcmFtZUF2YWlsYWJsZUxpc3RlbmVyOwotCi0gICAgLy8gbU11dGV4IGlzIHRoZSBtdXRleCB1c2VkIHRvIHByZXZlbnQgY29uY3VycmVudCBhY2Nlc3MgdG8gdGhlIG1lbWJlcgotICAgIC8vIHZhcmlhYmxlcyBvZiBTdXJmYWNlTWVkaWFTb3VyY2Ugb2JqZWN0cy4gSXQgbXVzdCBiZSBsb2NrZWQgd2hlbmV2ZXIgdGhlCi0gICAgLy8gbWVtYmVyIHZhcmlhYmxlcyBhcmUgYWNjZXNzZWQuCi0gICAgbXV0YWJsZSBNdXRleCBtTXV0ZXg7Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBGb3IgTWVkaWFTb3VyY2UKLSAgICAvLyBTZXQgdG8gYSBkZWZhdWx0IG9mIDMwIGZwcyBpZiBub3Qgc3BlY2lmaWVkIGJ5IHRoZSBjbGllbnQgc2lkZQotICAgIGludDMyX3QgbUZyYW1lUmF0ZTsKLQotICAgIC8vIG1TdGFydGVkIGlzIGEgZmxhZyB0byBjaGVjayBpZiB0aGUgcmVjb3JkaW5nIGlzIGdvaW5nIG9uCi0gICAgYm9vbCBtU3RhcnRlZDsKLQotICAgIC8vIG1OdW1GcmFtZXNSZWNlaXZlZCBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBmcmFtZXMgcmVjaWV2ZWQgZnJvbQotICAgIC8vIHRoZSBjbGllbnQgc2lkZQotICAgIGludCBtTnVtRnJhbWVzUmVjZWl2ZWQ7Ci0gICAgLy8gbU51bUZyYW1lc0VuY29kZWQgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgZnJhbWVzIHBhc3NlZCBvbiB0byB0aGUKLSAgICAvLyBlbmNvZGVyCi0gICAgaW50IG1OdW1GcmFtZXNFbmNvZGVkOwotCi0gICAgLy8gbUZpcnN0RnJhbWVUaW1lc3RhbXAgaXMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgZmlyc3QgcmVjZWl2ZWQgZnJhbWUuCi0gICAgLy8gSXQgaXMgdXNlZCB0byBvZmZzZXQgdGhlIG91dHB1dCB0aW1lc3RhbXBzIHNvIHJlY29yZGluZyBzdGFydHMgYXQgdGltZSAwLgotICAgIGludDY0X3QgbUZpcnN0RnJhbWVUaW1lc3RhbXA7Ci0gICAgLy8gbVN0YXJ0VGltZU5zIGlzIHRoZSBzdGFydCB0aW1lIHBhc3NlZCBpbnRvIHRoZSBzb3VyY2UgYXQgc3RhcnQsIHVzZWQgdG8KLSAgICAvLyBvZmZzZXQgdGltZXN0YW1wcy4KLSAgICBpbnQ2NF90IG1TdGFydFRpbWVOczsKLQotICAgIHNpemVfdCBtTWF4QWNxdWlyZWRCdWZmZXJDb3VudDsKLQotICAgIGJvb2wgbVVzZUFic29sdXRlVGltZXN0YW1wczsKLQotICAgIC8vIG1GcmFtZUF2YWlsYWJsZUNvbmRpdGlvbiBjb25kaXRpb24gdXNlZCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZXJlCi0gICAgLy8gaXMgYSBmcmFtZSBhdmFpbGFibGUgZm9yIGRlcXVldWluZwotICAgIENvbmRpdGlvbiBtRnJhbWVBdmFpbGFibGVDb25kaXRpb247Ci0KLSAgICBDb25kaXRpb24gbU1lZGlhQnVmZmVyc0F2YWlsYWJsZUNvbmRpdGlvbjsKLQotICAgIC8vIEFsbG9jYXRlIGFuZCByZXR1cm4gYSBuZXcgTWVkaWFCdWZmZXIgYW5kIHBhc3MgdGhlIEFOVyBidWZmZXIgYXMgbWV0YWRhdGEgaW50byBpdC4KLSAgICB2b2lkIHBhc3NNZXRhZGF0YUJ1ZmZlcl9sKE1lZGlhQnVmZmVyICoqYnVmZmVyLCBBTmF0aXZlV2luZG93QnVmZmVyICpidWZmZXJIYW5kbGUpIGNvbnN0OwotCi0gICAgLy8gQXZvaWQgY29weWluZyBhbmQgZXF1YXRpbmcgYW5kIGRlZmF1bHQgY29uc3RydWN0b3IKLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTdXJmYWNlTWVkaWFTb3VyY2UpOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfR1VJX1NVUkZBQ0VNRURJQVNPVVJDRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlVXRpbHMuaAppbmRleCBhNzc0N2M3Li42ODllNDU4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZVV0aWxzLmgKQEAgLTI0LDYgKzI0LDggQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdHJ1Y3QgSERSU3RhdGljSW5mbzsKKwogLyoqCiAgKiBDb25maWd1cmVzIHxuYXRpdmVXaW5kb3d8IGZvciBnaXZlbiB8d2lkdGh8eHxoZWlnaHR8LCBwaXhlbCB8Zm9ybWF0fCwgfHJvdGF0aW9ufCBhbmQgfHVzYWdlfC4KICAqIElmIHxyZWNvbm5lY3R8IGlzIHRydWUsIHJlY29ubmVjdHMgdG8gdGhlIG5hdGl2ZSB3aW5kb3cgYmVmb3JlIGhhbmQuCkBAIC0zMiw2ICszNCw4IEBACiBzdGF0dXNfdCBzZXROYXRpdmVXaW5kb3dTaXplRm9ybWF0QW5kVXNhZ2UoCiAgICAgICAgIEFOYXRpdmVXaW5kb3cgKm5hdGl2ZVdpbmRvdyAvKiBub25udWxsICovLAogICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmb3JtYXQsIGludCByb3RhdGlvbiwgaW50IHVzYWdlLCBib29sIHJlY29ubmVjdCk7Cit2b2lkIHNldE5hdGl2ZVdpbmRvd0hkck1ldGFkYXRhKAorICAgICAgICBBTmF0aXZlV2luZG93ICpuYXRpdmVXaW5kb3cgLyogbm9ubnVsbCAqLywgSERSU3RhdGljSW5mbyAqaW5mbyAvKiBub25udWxsICovKTsKIHN0YXR1c190IHB1c2hCbGFua0J1ZmZlcnNUb05hdGl2ZVdpbmRvdyhBTmF0aXZlV2luZG93ICpuYXRpdmVXaW5kb3cgLyogbm9ubnVsbCAqLyk7CiBzdGF0dXNfdCBuYXRpdmVXaW5kb3dDb25uZWN0KEFOYXRpdmVXaW5kb3cgKnN1cmZhY2UsIGNvbnN0IGNoYXIgKnJlYXNvbik7CiBzdGF0dXNfdCBuYXRpdmVXaW5kb3dEaXNjb25uZWN0KEFOYXRpdmVXaW5kb3cgKnN1cmZhY2UsIGNvbnN0IGNoYXIgKnJlYXNvbik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmgKaW5kZXggNzdjYmQ0Yy4uNmEyOGUwYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaApAQCAtMjgsMjEgKzI4LDYgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi0jZGVmaW5lIEZPVVJDQyhjMSwgYzIsIGMzLCBjNCkgXAotICAgICgoYzEpIDw8IDI0IHwgKGMyKSA8PCAxNiB8IChjMykgPDwgOCB8IChjNCkpCi0KLXVpbnQxNl90IFUxNl9BVChjb25zdCB1aW50OF90ICpwdHIpOwotdWludDMyX3QgVTMyX0FUKGNvbnN0IHVpbnQ4X3QgKnB0cik7Ci11aW50NjRfdCBVNjRfQVQoY29uc3QgdWludDhfdCAqcHRyKTsKLQotdWludDE2X3QgVTE2TEVfQVQoY29uc3QgdWludDhfdCAqcHRyKTsKLXVpbnQzMl90IFUzMkxFX0FUKGNvbnN0IHVpbnQ4X3QgKnB0cik7Ci11aW50NjRfdCBVNjRMRV9BVChjb25zdCB1aW50OF90ICpwdHIpOwotCi11aW50NjRfdCBudG9oNjQodWludDY0X3QgeCk7Ci11aW50NjRfdCBodG9uNjQodWludDY0X3QgeCk7Ci0KLWNsYXNzIE1ldGFEYXRhOwogc3RydWN0IEFNZXNzYWdlOwogc3RhdHVzX3QgY29udmVydE1ldGFEYXRhVG9NZXNzYWdlKAogICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEsIHNwPEFNZXNzYWdlPiAqZm9ybWF0KTsKQEAgLTk1LDcgKzgwLDYgQEAKIHZvaWQgcmVhZEZyb21BTWVzc2FnZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgQnVmZmVyaW5nU2V0dGluZ3MgKmJ1ZmZlcmluZyAvKiBub25udWxsICovKTsKIAogQVN0cmluZyBuYW1lRm9yRmQoaW50IGZkKTsKLXZvaWQgTWFrZUZvdXJDQ1N0cmluZyh1aW50MzJfdCB4LCBjaGFyICpzKTsKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gVVRJTFNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzJmYjRiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi1jY19saWJyYXJ5X3N0YXRpYyB7Ci0gICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X21hdHJvc2thIiwKLQotICAgIHNyY3M6IFsiTWF0cm9za2FFeHRyYWN0b3IuY3BwIl0sCi0KLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImV4dGVybmFsL2ZsYWMvaW5jbHVkZSIsCi0gICAgICAgICJleHRlcm5hbC9saWJ2cHgvbGlid2VibSIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYyIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgIF0sCi0KLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1Xbm8tbXVsdGljaGFyIiwKLSAgICAgICAgIi1XZXJyb3IiLAotICAgICAgICAiLVdhbGwiLAotICAgIF0sCi0KLSAgICBzYW5pdGl6ZTogewotICAgICAgICBtaXNjX3VuZGVmaW5lZDogWwotICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKLSAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKLSAgICAgICAgXSwKLSAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICBkaWFnOiB7Ci0gICAgICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIH0sCi0gICAgfSwKLQotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJtZWRpYSIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mbGFjZGVjIgotICAgIF0sCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NYXRyb3NrYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NYXRyb3NrYUV4dHJhY3Rvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxM2EyNTcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTWF0cm9za2FFeHRyYWN0b3IuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTUwOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJNYXRyb3NrYUV4dHJhY3RvciIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkZMQUNEZWNvZGVyLmgiCi0jaW5jbHVkZSAiTWF0cm9za2FFeHRyYWN0b3IuaCIKLSNpbmNsdWRlICJhdmNfdXRpbHMuaCIKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IERhdGFTb3VyY2VSZWFkZXIgOiBwdWJsaWMgbWt2cGFyc2VyOjpJTWt2UmVhZGVyIHsKLSAgICBleHBsaWNpdCBEYXRhU291cmNlUmVhZGVyKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UpCi0gICAgICAgIDogbVNvdXJjZShzb3VyY2UpIHsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGludCBSZWFkKGxvbmcgbG9uZyBwb3NpdGlvbiwgbG9uZyBsZW5ndGgsIHVuc2lnbmVkIGNoYXIqIGJ1ZmZlcikgewotICAgICAgICBDSEVDSyhwb3NpdGlvbiA+PSAwKTsKLSAgICAgICAgQ0hFQ0sobGVuZ3RoID49IDApOwotCi0gICAgICAgIGlmIChsZW5ndGggPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBzc2l6ZV90IG4gPSBtU291cmNlLT5yZWFkQXQocG9zaXRpb24sIGJ1ZmZlciwgbGVuZ3RoKTsKLQotICAgICAgICBpZiAobiA8PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGludCBMZW5ndGgobG9uZyBsb25nKiB0b3RhbCwgbG9uZyBsb25nKiBhdmFpbGFibGUpIHsKLSAgICAgICAgb2ZmNjRfdCBzaXplOwotICAgICAgICBpZiAobVNvdXJjZS0+Z2V0U2l6ZSgmc2l6ZSkgIT0gT0spIHsKLSAgICAgICAgICAgICp0b3RhbCA9IC0xOwotICAgICAgICAgICAgKmF2YWlsYWJsZSA9IChsb25nIGxvbmcpKCgxdWxsIDw8IDYzKSAtIDEpOwotCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0b3RhbCkgewotICAgICAgICAgICAgKnRvdGFsID0gc2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhdmFpbGFibGUpIHsKLSAgICAgICAgICAgICphdmFpbGFibGUgPSBzaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi1wcml2YXRlOgotICAgIHNwPERhdGFTb3VyY2U+IG1Tb3VyY2U7Ci0KLSAgICBEYXRhU291cmNlUmVhZGVyKGNvbnN0IERhdGFTb3VyY2VSZWFkZXIgJik7Ci0gICAgRGF0YVNvdXJjZVJlYWRlciAmb3BlcmF0b3I9KGNvbnN0IERhdGFTb3VyY2VSZWFkZXIgJik7Ci19OwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1zdHJ1Y3QgQmxvY2tJdGVyYXRvciB7Ci0gICAgQmxvY2tJdGVyYXRvcihNYXRyb3NrYUV4dHJhY3RvciAqZXh0cmFjdG9yLCB1bnNpZ25lZCBsb25nIHRyYWNrTnVtLCB1bnNpZ25lZCBsb25nIGluZGV4KTsKLQotICAgIGJvb2wgZW9zKCkgY29uc3Q7Ci0KLSAgICB2b2lkIGFkdmFuY2UoKTsKLSAgICB2b2lkIHJlc2V0KCk7Ci0KLSAgICB2b2lkIHNlZWsoCi0gICAgICAgICAgICBpbnQ2NF90IHNlZWtUaW1lVXMsIGJvb2wgaXNBdWRpbywKLSAgICAgICAgICAgIGludDY0X3QgKmFjdHVhbEZyYW1lVGltZVVzKTsKLQotICAgIGNvbnN0IG1rdnBhcnNlcjo6QmxvY2sgKmJsb2NrKCkgY29uc3Q7Ci0gICAgaW50NjRfdCBibG9ja1RpbWVVcygpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIE1hdHJvc2thRXh0cmFjdG9yICptRXh0cmFjdG9yOwotICAgIGxvbmcgbG9uZyBtVHJhY2tOdW07Ci0gICAgdW5zaWduZWQgbG9uZyBtSW5kZXg7Ci0KLSAgICBjb25zdCBta3ZwYXJzZXI6OkNsdXN0ZXIgKm1DbHVzdGVyOwotICAgIGNvbnN0IG1rdnBhcnNlcjo6QmxvY2tFbnRyeSAqbUJsb2NrRW50cnk7Ci0gICAgbG9uZyBtQmxvY2tFbnRyeUluZGV4OwotCi0gICAgdm9pZCBhZHZhbmNlX2woKTsKLQotICAgIEJsb2NrSXRlcmF0b3IoY29uc3QgQmxvY2tJdGVyYXRvciAmKTsKLSAgICBCbG9ja0l0ZXJhdG9yICZvcGVyYXRvcj0oY29uc3QgQmxvY2tJdGVyYXRvciAmKTsKLX07Ci0KLXN0cnVjdCBNYXRyb3NrYVNvdXJjZSA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7Ci0gICAgTWF0cm9za2FTb3VyY2UoCi0gICAgICAgICAgICBjb25zdCBzcDxNYXRyb3NrYUV4dHJhY3Rvcj4gJmV4dHJhY3Rvciwgc2l6ZV90IGluZGV4KTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0KLSAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5NYXRyb3NrYVNvdXJjZSgpOwotCi1wcml2YXRlOgotICAgIGVudW0gVHlwZSB7Ci0gICAgICAgIEFWQywKLSAgICAgICAgQUFDLAotICAgICAgICBPVEhFUgotICAgIH07Ci0KLSAgICBzcDxNYXRyb3NrYUV4dHJhY3Rvcj4gbUV4dHJhY3RvcjsKLSAgICBzaXplX3QgbVRyYWNrSW5kZXg7Ci0gICAgVHlwZSBtVHlwZTsKLSAgICBib29sIG1Jc0F1ZGlvOwotICAgIEJsb2NrSXRlcmF0b3IgbUJsb2NrSXRlcjsKLSAgICBzc2l6ZV90IG1OQUxTaXplTGVuOyAgLy8gZm9yIHR5cGUgQVZDCi0KLSAgICBMaXN0PE1lZGlhQnVmZmVyICo+IG1QZW5kaW5nRnJhbWVzOwotCi0gICAgc3RhdHVzX3QgYWR2YW5jZSgpOwotCi0gICAgc3RhdHVzX3Qgc2V0V2VibUJsb2NrQ3J5cHRvSW5mbyhNZWRpYUJ1ZmZlciAqbWJ1Zik7Ci0gICAgc3RhdHVzX3QgcmVhZEJsb2NrKCk7Ci0gICAgdm9pZCBjbGVhclBlbmRpbmdGcmFtZXMoKTsKLQotICAgIE1hdHJvc2thU291cmNlKGNvbnN0IE1hdHJvc2thU291cmNlICYpOwotICAgIE1hdHJvc2thU291cmNlICZvcGVyYXRvcj0oY29uc3QgTWF0cm9za2FTb3VyY2UgJik7Ci19OwotCi1jb25zdCBta3ZwYXJzZXI6OlRyYWNrKiBNYXRyb3NrYUV4dHJhY3Rvcjo6VHJhY2tJbmZvOjpnZXRUcmFjaygpIGNvbnN0IHsKLSAgICByZXR1cm4gbUV4dHJhY3Rvci0+bVNlZ21lbnQtPkdldFRyYWNrcygpLT5HZXRUcmFja0J5TnVtYmVyKG1UcmFja051bSk7Ci19Ci0KLS8vIFRoaXMgZnVuY3Rpb24gZG9lcyBleGFjdGx5IHRoZSBzYW1lIGFzIG1rdnBhcnNlcjo6Q3Vlczo6RmluZCwgZXhjZXB0IHRoYXQgaXQKLS8vIHNlYXJjaGVzIGluIG91ciBvd24gdHJhY2sgYmFzZWQgdmVjdG9ycy4gV2Ugc2hvdWxkIG5vdCBuZWVkIHRoaXMgb25jZSBta3ZwYXJzZXIKLS8vIGFkZHMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eS4KLWNvbnN0IG1rdnBhcnNlcjo6Q3VlUG9pbnQ6OlRyYWNrUG9zaXRpb24gKk1hdHJvc2thRXh0cmFjdG9yOjpUcmFja0luZm86OmZpbmQoCi0gICAgICAgIGxvbmcgbG9uZyB0aW1lTnMpIGNvbnN0IHsKLSAgICBBTE9HVigibUN1ZVBvaW50cy5zaXplICV6dSIsIG1DdWVQb2ludHMuc2l6ZSgpKTsKLSAgICBpZiAobUN1ZVBvaW50cy5lbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGNvbnN0IG1rdnBhcnNlcjo6Q3VlUG9pbnQqIGNwID0gbUN1ZVBvaW50cy5pdGVtQXQoMCk7Ci0gICAgY29uc3QgbWt2cGFyc2VyOjpUcmFjayogdHJhY2sgPSBnZXRUcmFjaygpOwotICAgIGlmICh0aW1lTnMgPD0gY3AtPkdldFRpbWUobUV4dHJhY3Rvci0+bVNlZ21lbnQpKSB7Ci0gICAgICAgIHJldHVybiBjcC0+RmluZCh0cmFjayk7Ci0gICAgfQotCi0gICAgLy8gQmluYXJ5IHNlYXJjaGVzIHRocm91Z2ggcmVsZXZhbnQgY3VlczsgYXNzdW1lcyBjdWVzIGFyZSBvcmRlcmVkIGJ5IHRpbWVjb2RlLgotICAgIC8vIElmIHdlIGRvIGRldGVjdCBvdXQtb2Ytb3JkZXIgY3VlcywgcmV0dXJuIE5VTEwuCi0gICAgc2l6ZV90IGxvID0gMDsKLSAgICBzaXplX3QgaGkgPSBtQ3VlUG9pbnRzLnNpemUoKTsKLSAgICB3aGlsZSAobG8gPCBoaSkgewotICAgICAgICBjb25zdCBzaXplX3QgbWlkID0gbG8gKyAoaGkgLSBsbykgLyAyOwotICAgICAgICBjb25zdCBta3ZwYXJzZXI6OkN1ZVBvaW50KiBjb25zdCBtaWRDcCA9IG1DdWVQb2ludHMuaXRlbUF0KG1pZCk7Ci0gICAgICAgIGNvbnN0IGxvbmcgbG9uZyBjdWVUaW1lTnMgPSBtaWRDcC0+R2V0VGltZShtRXh0cmFjdG9yLT5tU2VnbWVudCk7Ci0gICAgICAgIGlmIChjdWVUaW1lTnMgPD0gdGltZU5zKSB7Ci0gICAgICAgICAgICBsbyA9IG1pZCArIDE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBoaSA9IG1pZDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChsbyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGNwID0gbUN1ZVBvaW50cy5pdGVtQXQobG8gLSAxKTsKLSAgICBpZiAoY3AtPkdldFRpbWUobUV4dHJhY3Rvci0+bVNlZ21lbnQpID4gdGltZU5zKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBjcC0+RmluZCh0cmFjayk7Ci19Ci0KLU1hdHJvc2thU291cmNlOjpNYXRyb3NrYVNvdXJjZSgKLSAgICAgICAgY29uc3Qgc3A8TWF0cm9za2FFeHRyYWN0b3I+ICZleHRyYWN0b3IsIHNpemVfdCBpbmRleCkKLSAgICA6IG1FeHRyYWN0b3IoZXh0cmFjdG9yKSwKLSAgICAgIG1UcmFja0luZGV4KGluZGV4KSwKLSAgICAgIG1UeXBlKE9USEVSKSwKLSAgICAgIG1Jc0F1ZGlvKGZhbHNlKSwKLSAgICAgIG1CbG9ja0l0ZXIobUV4dHJhY3Rvci5nZXQoKSwKLSAgICAgICAgICAgICAgICAgbUV4dHJhY3Rvci0+bVRyYWNrcy5pdGVtQXQoaW5kZXgpLm1UcmFja051bSwKLSAgICAgICAgICAgICAgICAgaW5kZXgpLAotICAgICAgbU5BTFNpemVMZW4oLTEpIHsKLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1FeHRyYWN0b3ItPm1UcmFja3MuaXRlbUF0KGluZGV4KS5tTWV0YTsKLQotICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgQ0hFQ0sobWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOwotCi0gICAgbUlzQXVkaW8gPSAhc3RybmNhc2VjbXAoImF1ZGlvLyIsIG1pbWUsIDYpOwotCi0gICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQykpIHsKLSAgICAgICAgbVR5cGUgPSBBVkM7Ci0KLSAgICAgICAgdWludDMyX3QgZHVtbXk7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmF2Y2M7Ci0gICAgICAgIHNpemVfdCBhdmNjU2l6ZTsKLSAgICAgICAgaW50MzJfdCBuYWxTaXplTGVuID0gMDsKLSAgICAgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5TmFsTGVuZ3RoU2l6ZSwgJm5hbFNpemVMZW4pKSB7Ci0gICAgICAgICAgICBpZiAobmFsU2l6ZUxlbiA+PSAwICYmIG5hbFNpemVMZW4gPD0gNCkgewotICAgICAgICAgICAgICAgIG1OQUxTaXplTGVuID0gbmFsU2l6ZUxlbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChtZXRhLT5maW5kRGF0YShrS2V5QVZDQywgJmR1bW15LCAoY29uc3Qgdm9pZCAqKikmYXZjYywgJmF2Y2NTaXplKQotICAgICAgICAgICAgICAgICYmIGF2Y2NTaXplID49IDV1KSB7Ci0gICAgICAgICAgICBtTkFMU2l6ZUxlbiA9IDEgKyAoYXZjY1s0XSAmIDMpOwotICAgICAgICAgICAgQUxPR1YoIm1OQUxTaXplTGVuID0gJXpkIiwgbU5BTFNpemVMZW4pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoIk5vIG1OQUxTaXplTGVuIik7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQykpIHsKLSAgICAgICAgbVR5cGUgPSBBQUM7Ci0gICAgfQotfQotCi1NYXRyb3NrYVNvdXJjZTo6fk1hdHJvc2thU291cmNlKCkgewotICAgIGNsZWFyUGVuZGluZ0ZyYW1lcygpOwotfQotCi1zdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6c3RhcnQoTWV0YURhdGEgKiAvKiBwYXJhbXMgKi8pIHsKLSAgICBpZiAobVR5cGUgPT0gQVZDICYmIG1OQUxTaXplTGVuIDwgMCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIG1CbG9ja0l0ZXIucmVzZXQoKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OnN0b3AoKSB7Ci0gICAgY2xlYXJQZW5kaW5nRnJhbWVzKCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXNwPE1ldGFEYXRhPiBNYXRyb3NrYVNvdXJjZTo6Z2V0Rm9ybWF0KCkgewotICAgIHJldHVybiBtRXh0cmFjdG9yLT5tVHJhY2tzLml0ZW1BdChtVHJhY2tJbmRleCkubU1ldGE7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLUJsb2NrSXRlcmF0b3I6OkJsb2NrSXRlcmF0b3IoCi0gICAgICAgIE1hdHJvc2thRXh0cmFjdG9yICpleHRyYWN0b3IsIHVuc2lnbmVkIGxvbmcgdHJhY2tOdW0sIHVuc2lnbmVkIGxvbmcgaW5kZXgpCi0gICAgOiBtRXh0cmFjdG9yKGV4dHJhY3RvciksCi0gICAgICBtVHJhY2tOdW0odHJhY2tOdW0pLAotICAgICAgbUluZGV4KGluZGV4KSwKLSAgICAgIG1DbHVzdGVyKE5VTEwpLAotICAgICAgbUJsb2NrRW50cnkoTlVMTCksCi0gICAgICBtQmxvY2tFbnRyeUluZGV4KDApIHsKLSAgICByZXNldCgpOwotfQotCi1ib29sIEJsb2NrSXRlcmF0b3I6OmVvcygpIGNvbnN0IHsKLSAgICByZXR1cm4gbUNsdXN0ZXIgPT0gTlVMTCB8fCBtQ2x1c3Rlci0+RU9TKCk7Ci19Ci0KLXZvaWQgQmxvY2tJdGVyYXRvcjo6YWR2YW5jZSgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUV4dHJhY3Rvci0+bUxvY2spOwotICAgIGFkdmFuY2VfbCgpOwotfQotCi12b2lkIEJsb2NrSXRlcmF0b3I6OmFkdmFuY2VfbCgpIHsKLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIGxvbmcgcmVzID0gbUNsdXN0ZXItPkdldEVudHJ5KG1CbG9ja0VudHJ5SW5kZXgsIG1CbG9ja0VudHJ5KTsKLSAgICAgICAgQUxPR1YoIkdldEVudHJ5IHJldHVybmVkICVsZCIsIHJlcyk7Ci0KLSAgICAgICAgbG9uZyBsb25nIHBvczsKLSAgICAgICAgbG9uZyBsZW47Ci0gICAgICAgIGlmIChyZXMgPCAwKSB7Ci0gICAgICAgICAgICAvLyBOZWVkIHRvIHBhcnNlIHRoaXMgY2x1c3RlciBzb21lIG1vcmUKLQotICAgICAgICAgICAgQ0hFQ0tfRVEocmVzLCBta3ZwYXJzZXI6OkVfQlVGRkVSX05PVF9GVUxMKTsKLQotICAgICAgICAgICAgcmVzID0gbUNsdXN0ZXItPlBhcnNlKHBvcywgbGVuKTsKLSAgICAgICAgICAgIEFMT0dWKCJQYXJzZSByZXR1cm5lZCAlbGQiLCByZXMpOwotCi0gICAgICAgICAgICBpZiAocmVzIDwgMCkgewotICAgICAgICAgICAgICAgIC8vIEkvTyBlcnJvcgotCi0gICAgICAgICAgICAgICAgQUxPR0UoIkNsdXN0ZXI6OlBhcnNlIHJldHVybmVkIHJlc3VsdCAlbGQiLCByZXMpOwotCi0gICAgICAgICAgICAgICAgbUNsdXN0ZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfSBlbHNlIGlmIChyZXMgPT0gMCkgewotICAgICAgICAgICAgLy8gV2UncmUgZG9uZSB3aXRoIHRoaXMgY2x1c3RlcgotCi0gICAgICAgICAgICBjb25zdCBta3ZwYXJzZXI6OkNsdXN0ZXIgKm5leHRDbHVzdGVyOwotICAgICAgICAgICAgcmVzID0gbUV4dHJhY3Rvci0+bVNlZ21lbnQtPlBhcnNlTmV4dCgKLSAgICAgICAgICAgICAgICAgICAgbUNsdXN0ZXIsIG5leHRDbHVzdGVyLCBwb3MsIGxlbik7Ci0gICAgICAgICAgICBBTE9HVigiUGFyc2VOZXh0IHJldHVybmVkICVsZCIsIHJlcyk7Ci0KLSAgICAgICAgICAgIGlmIChyZXMgIT0gMCkgewotICAgICAgICAgICAgICAgIC8vIEVPRiBvciBlcnJvcgotCi0gICAgICAgICAgICAgICAgbUNsdXN0ZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDSEVDS19FUShyZXMsIDApOwotICAgICAgICAgICAgQ0hFQ0sobmV4dENsdXN0ZXIgIT0gTlVMTCk7Ci0gICAgICAgICAgICBDSEVDSyghbmV4dENsdXN0ZXItPkVPUygpKTsKLQotICAgICAgICAgICAgbUNsdXN0ZXIgPSBuZXh0Q2x1c3RlcjsKLQotICAgICAgICAgICAgcmVzID0gbUNsdXN0ZXItPlBhcnNlKHBvcywgbGVuKTsKLSAgICAgICAgICAgIEFMT0dWKCJQYXJzZSAoMikgcmV0dXJuZWQgJWxkIiwgcmVzKTsKLSAgICAgICAgICAgIENIRUNLX0dFKHJlcywgMCk7Ci0KLSAgICAgICAgICAgIG1CbG9ja0VudHJ5SW5kZXggPSAwOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBDSEVDSyhtQmxvY2tFbnRyeSAhPSBOVUxMKTsKLSAgICAgICAgQ0hFQ0sobUJsb2NrRW50cnktPkdldEJsb2NrKCkgIT0gTlVMTCk7Ci0gICAgICAgICsrbUJsb2NrRW50cnlJbmRleDsKLQotICAgICAgICBpZiAobUJsb2NrRW50cnktPkdldEJsb2NrKCktPkdldFRyYWNrTnVtYmVyKCkgPT0gbVRyYWNrTnVtKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBCbG9ja0l0ZXJhdG9yOjpyZXNldCgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUV4dHJhY3Rvci0+bUxvY2spOwotCi0gICAgbUNsdXN0ZXIgPSBtRXh0cmFjdG9yLT5tU2VnbWVudC0+R2V0Rmlyc3QoKTsKLSAgICBtQmxvY2tFbnRyeSA9IE5VTEw7Ci0gICAgbUJsb2NrRW50cnlJbmRleCA9IDA7Ci0KLSAgICBkbyB7Ci0gICAgICAgIGFkdmFuY2VfbCgpOwotICAgIH0gd2hpbGUgKCFlb3MoKSAmJiBibG9jaygpLT5HZXRUcmFja051bWJlcigpICE9IG1UcmFja051bSk7Ci19Ci0KLXZvaWQgQmxvY2tJdGVyYXRvcjo6c2VlaygKLSAgICAgICAgaW50NjRfdCBzZWVrVGltZVVzLCBib29sIGlzQXVkaW8sCi0gICAgICAgIGludDY0X3QgKmFjdHVhbEZyYW1lVGltZVVzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1FeHRyYWN0b3ItPm1Mb2NrKTsKLQotICAgICphY3R1YWxGcmFtZVRpbWVVcyA9IC0xbGw7Ci0KLSAgICBpZiAoc2Vla1RpbWVVcyA+IElOVDY0X01BWCAvIDEwMDBsbCB8fAotICAgICAgICAgICAgc2Vla1RpbWVVcyA8IElOVDY0X01JTiAvIDEwMDBsbCB8fAotICAgICAgICAgICAgKG1FeHRyYWN0b3ItPm1TZWVrUHJlUm9sbE5zID4gMCAmJgotICAgICAgICAgICAgICAgICAgICAoc2Vla1RpbWVVcyAqIDEwMDBsbCkgPCBJTlQ2NF9NSU4gKyBtRXh0cmFjdG9yLT5tU2Vla1ByZVJvbGxOcykgfHwKLSAgICAgICAgICAgIChtRXh0cmFjdG9yLT5tU2Vla1ByZVJvbGxOcyA8IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgKHNlZWtUaW1lVXMgKiAxMDAwbGwpID4gSU5UNjRfTUFYICsgbUV4dHJhY3Rvci0+bVNlZWtQcmVSb2xsTnMpKSB7Ci0gICAgICAgIEFMT0dFKCJjYW5ub3Qgc2VlayB0byAlbGxkIiwgKGxvbmcgbG9uZykgc2Vla1RpbWVVcyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBjb25zdCBpbnQ2NF90IHNlZWtUaW1lTnMgPSBzZWVrVGltZVVzICogMTAwMGxsIC0gbUV4dHJhY3Rvci0+bVNlZWtQcmVSb2xsTnM7Ci0KLSAgICBta3ZwYXJzZXI6OlNlZ21lbnQqIGNvbnN0IHBTZWdtZW50ID0gbUV4dHJhY3Rvci0+bVNlZ21lbnQ7Ci0KLSAgICAvLyBTcGVjaWFsIGNhc2UgdGhlIDAgc2VlayB0byBhdm9pZCBsb2FkaW5nIEN1ZXMgd2hlbiB0aGUgYXBwbGljYXRpb24KLSAgICAvLyBleHRyYW5lb3VzbHkgc2Vla3MgdG8gMCBiZWZvcmUgcGxheWluZy4KLSAgICBpZiAoc2Vla1RpbWVOcyA8PSAwKSB7Ci0gICAgICAgIEFMT0dWKCJTZWVrIHRvIGJlZ2lubmluZzogJSIgUFJJZDY0LCBzZWVrVGltZVVzKTsKLSAgICAgICAgbUNsdXN0ZXIgPSBwU2VnbWVudC0+R2V0Rmlyc3QoKTsKLSAgICAgICAgbUJsb2NrRW50cnlJbmRleCA9IDA7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGFkdmFuY2VfbCgpOwotICAgICAgICB9IHdoaWxlICghZW9zKCkgJiYgYmxvY2soKS0+R2V0VHJhY2tOdW1iZXIoKSAhPSBtVHJhY2tOdW0pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQUxPR1YoIlNlZWtpbmcgdG86ICUiIFBSSWQ2NCwgc2Vla1RpbWVVcyk7Ci0KLSAgICAvLyBJZiB0aGUgQ3VlcyBoYXZlIG5vdCBiZWVuIGxvY2F0ZWQgdGhlbiBmaW5kIHRoZW0uCi0gICAgY29uc3QgbWt2cGFyc2VyOjpDdWVzKiBwQ3VlcyA9IHBTZWdtZW50LT5HZXRDdWVzKCk7Ci0gICAgY29uc3QgbWt2cGFyc2VyOjpTZWVrSGVhZCogcFNIID0gcFNlZ21lbnQtPkdldFNlZWtIZWFkKCk7Ci0gICAgaWYgKCFwQ3VlcyAmJiBwU0gpIHsKLSAgICAgICAgY29uc3Qgc2l6ZV90IGNvdW50ID0gcFNILT5HZXRDb3VudCgpOwotICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlNlZWtIZWFkOjpFbnRyeSogcEVudHJ5OwotICAgICAgICBBTE9HVigiTm8gQ3VlcyB5ZXQiKTsKLQotICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgY291bnQ7IGluZGV4KyspIHsKLSAgICAgICAgICAgIHBFbnRyeSA9IHBTSC0+R2V0RW50cnkoaW5kZXgpOwotCi0gICAgICAgICAgICBpZiAocEVudHJ5LT5pZCA9PSAweDBDNTNCQjZCKSB7IC8vIEN1ZXMgSUQKLSAgICAgICAgICAgICAgICBsb25nIGxlbjsgbG9uZyBsb25nIHBvczsKLSAgICAgICAgICAgICAgICBwU2VnbWVudC0+UGFyc2VDdWVzKHBFbnRyeS0+cG9zLCBwb3MsIGxlbik7Ci0gICAgICAgICAgICAgICAgcEN1ZXMgPSBwU2VnbWVudC0+R2V0Q3VlcygpOwotICAgICAgICAgICAgICAgIEFMT0dWKCJDdWVzIGZvdW5kIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXBDdWVzKSB7Ci0gICAgICAgICAgICBBTE9HRSgiTm8gQ3VlcyBpbiBmaWxlIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoIXBTSCkgewotICAgICAgICBBTE9HRSgiTm8gU2Vla0hlYWQiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGNvbnN0IG1rdnBhcnNlcjo6Q3VlUG9pbnQqIHBDUDsKLSAgICBta3ZwYXJzZXI6OlRyYWNrcyBjb25zdCAqcFRyYWNrcyA9IHBTZWdtZW50LT5HZXRUcmFja3MoKTsKLSAgICB3aGlsZSAoIXBDdWVzLT5Eb25lUGFyc2luZygpKSB7Ci0gICAgICAgIHBDdWVzLT5Mb2FkQ3VlUG9pbnQoKTsKLSAgICAgICAgcENQID0gcEN1ZXMtPkdldExhc3QoKTsKLSAgICAgICAgQ0hFQ0socENQKTsKLQotICAgICAgICBzaXplX3QgdHJhY2tDb3VudCA9IG1FeHRyYWN0b3ItPm1UcmFja3Muc2l6ZSgpOwotICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgdHJhY2tDb3VudDsgKytpbmRleCkgewotICAgICAgICAgICAgTWF0cm9za2FFeHRyYWN0b3I6OlRyYWNrSW5mbyYgdHJhY2sgPSBtRXh0cmFjdG9yLT5tVHJhY2tzLmVkaXRJdGVtQXQoaW5kZXgpOwotICAgICAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpUcmFjayAqcFRyYWNrID0gcFRyYWNrcy0+R2V0VHJhY2tCeU51bWJlcih0cmFjay5tVHJhY2tOdW0pOwotICAgICAgICAgICAgaWYgKHBUcmFjayAmJiBwVHJhY2stPkdldFR5cGUoKSA9PSAxICYmIHBDUC0+RmluZChwVHJhY2spKSB7IC8vIFZJREVPX1RSQUNLCi0gICAgICAgICAgICAgICAgdHJhY2subUN1ZVBvaW50cy5wdXNoX2JhY2socENQKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwQ1AtPkdldFRpbWUocFNlZ21lbnQpID49IHNlZWtUaW1lTnMpIHsKLSAgICAgICAgICAgIEFMT0dWKCJQYXJzZWQgcGFzdCByZWxldmFudCBDdWUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgY29uc3QgbWt2cGFyc2VyOjpDdWVQb2ludDo6VHJhY2tQb3NpdGlvbiAqcFRQID0gTlVMTDsKLSAgICBjb25zdCBta3ZwYXJzZXI6OlRyYWNrICp0aGlzVHJhY2sgPSBwVHJhY2tzLT5HZXRUcmFja0J5TnVtYmVyKG1UcmFja051bSk7Ci0gICAgaWYgKHRoaXNUcmFjay0+R2V0VHlwZSgpID09IDEpIHsgLy8gdmlkZW8KLSAgICAgICAgTWF0cm9za2FFeHRyYWN0b3I6OlRyYWNrSW5mbyYgdHJhY2sgPSBtRXh0cmFjdG9yLT5tVHJhY2tzLmVkaXRJdGVtQXQobUluZGV4KTsKLSAgICAgICAgcFRQID0gdHJhY2suZmluZChzZWVrVGltZU5zKTsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBUaGUgQ3VlIGluZGV4IGlzIGJ1aWx0IGFyb3VuZCB2aWRlbyBrZXlmcmFtZXMKLSAgICAgICAgdW5zaWduZWQgbG9uZyBpbnQgdHJhY2tDb3VudCA9IHBUcmFja3MtPkdldFRyYWNrc0NvdW50KCk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCB0cmFja0NvdW50OyArK2luZGV4KSB7Ci0gICAgICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlRyYWNrICpwVHJhY2sgPSBwVHJhY2tzLT5HZXRUcmFja0J5SW5kZXgoaW5kZXgpOwotICAgICAgICAgICAgaWYgKHBUcmFjayAmJiBwVHJhY2stPkdldFR5cGUoKSA9PSAxICYmIHBDdWVzLT5GaW5kKHNlZWtUaW1lTnMsIHBUcmFjaywgcENQLCBwVFApKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlZpZGVvIHRyYWNrIGxvY2F0ZWQgYXQgJXp1IiwgaW5kZXgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvLyBBbHdheXMgKnNlYXJjaCogYmFzZWQgb24gdGhlIHZpZGVvIHRyYWNrLCBidXQgZmluYWxpemUgYmFzZWQgb24gbVRyYWNrTnVtCi0gICAgaWYgKCFwVFApIHsKLSAgICAgICAgQUxPR0UoIkRpZCBub3QgbG9jYXRlIHRoZSB2aWRlbyB0cmFjayBmb3Igc2Vla2luZyIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbUNsdXN0ZXIgPSBwU2VnbWVudC0+RmluZE9yUHJlbG9hZENsdXN0ZXIocFRQLT5tX3Bvcyk7Ci0KLSAgICBDSEVDSyhtQ2x1c3Rlcik7Ci0gICAgQ0hFQ0soIW1DbHVzdGVyLT5FT1MoKSk7Ci0KLSAgICAvLyBtQmxvY2tFbnRyeUluZGV4IHN0YXJ0cyBhdCAwIGJ1dCBtX2Jsb2NrIHN0YXJ0cyBhdCAxCi0gICAgQ0hFQ0tfR1QocFRQLT5tX2Jsb2NrLCAwKTsKLSAgICBtQmxvY2tFbnRyeUluZGV4ID0gcFRQLT5tX2Jsb2NrIC0gMTsKLQotICAgIGZvciAoOzspIHsKLSAgICAgICAgYWR2YW5jZV9sKCk7Ci0KLSAgICAgICAgaWYgKGVvcygpKSBicmVhazsKLQotICAgICAgICBpZiAoaXNBdWRpbyB8fCBibG9jaygpLT5Jc0tleSgpKSB7Ci0gICAgICAgICAgICAvLyBBY2NlcHQgdGhlIGZpcnN0IGtleSBmcmFtZQotICAgICAgICAgICAgaW50NjRfdCBmcmFtZVRpbWVVcyA9IChibG9jaygpLT5HZXRUaW1lKG1DbHVzdGVyKSArIDUwMExMKSAvIDEwMDBMTDsKLSAgICAgICAgICAgIGlmICh0aGlzVHJhY2stPkdldFR5cGUoKSA9PSAxIHx8IGZyYW1lVGltZVVzID49IHNlZWtUaW1lVXMpIHsKLSAgICAgICAgICAgICAgICAqYWN0dWFsRnJhbWVUaW1lVXMgPSBmcmFtZVRpbWVVczsKLSAgICAgICAgICAgICAgICBBTE9HVigiUmVxdWVzdGVkIHNlZWsgcG9pbnQ6ICUiIFBSSWQ2NCAiIGFjdHVhbDogJSIgUFJJZDY0LAotICAgICAgICAgICAgICAgICAgICAgIHNlZWtUaW1lVXMsICphY3R1YWxGcmFtZVRpbWVVcyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWNvbnN0IG1rdnBhcnNlcjo6QmxvY2sgKkJsb2NrSXRlcmF0b3I6OmJsb2NrKCkgY29uc3QgewotICAgIENIRUNLKCFlb3MoKSk7Ci0KLSAgICByZXR1cm4gbUJsb2NrRW50cnktPkdldEJsb2NrKCk7Ci19Ci0KLWludDY0X3QgQmxvY2tJdGVyYXRvcjo6YmxvY2tUaW1lVXMoKSBjb25zdCB7Ci0gICAgaWYgKG1DbHVzdGVyID09IE5VTEwgfHwgbUJsb2NrRW50cnkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIHJldHVybiAobUJsb2NrRW50cnktPkdldEJsb2NrKCktPkdldFRpbWUobUNsdXN0ZXIpICsgNTAwbGwpIC8gMTAwMGxsOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1zdGF0aWMgdW5zaWduZWQgVTI0X0FUKGNvbnN0IHVpbnQ4X3QgKnB0cikgewotICAgIHJldHVybiBwdHJbMF0gPDwgMTYgfCBwdHJbMV0gPDwgOCB8IHB0clsyXTsKLX0KLQotdm9pZCBNYXRyb3NrYVNvdXJjZTo6Y2xlYXJQZW5kaW5nRnJhbWVzKCkgewotICAgIHdoaWxlICghbVBlbmRpbmdGcmFtZXMuZW1wdHkoKSkgewotICAgICAgICBNZWRpYUJ1ZmZlciAqZnJhbWUgPSAqbVBlbmRpbmdGcmFtZXMuYmVnaW4oKTsKLSAgICAgICAgbVBlbmRpbmdGcmFtZXMuZXJhc2UobVBlbmRpbmdGcmFtZXMuYmVnaW4oKSk7Ci0KLSAgICAgICAgZnJhbWUtPnJlbGVhc2UoKTsKLSAgICAgICAgZnJhbWUgPSBOVUxMOwotICAgIH0KLX0KLQotc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OnNldFdlYm1CbG9ja0NyeXB0b0luZm8oTWVkaWFCdWZmZXIgKm1idWYpIHsKLSAgICBpZiAobWJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgPCAxIHx8IG1idWYtPnJhbmdlX2xlbmd0aCgpIC0gMSA+IElOVDMyX01BWCkgewotICAgICAgICAvLyAxLWJ5dGUgc2lnbmFsCi0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgY29uc3QgdWludDhfdCAqZGF0YSA9IChjb25zdCB1aW50OF90ICopbWJ1Zi0+ZGF0YSgpICsgbWJ1Zi0+cmFuZ2Vfb2Zmc2V0KCk7Ci0gICAgYm9vbCBibG9ja0VuY3J5cHRlZCA9IGRhdGFbMF0gJiAweDE7Ci0gICAgaWYgKGJsb2NrRW5jcnlwdGVkICYmIG1idWYtPnJhbmdlX2xlbmd0aCgpIDwgOSkgewotICAgICAgICAvLyAxLWJ5dGUgc2lnbmFsICsgOC1ieXRlIElWCi0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtYnVmLT5tZXRhX2RhdGEoKTsKLSAgICBpZiAoYmxvY2tFbmNyeXB0ZWQpIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKLSAgICAgICAgICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQotICAgICAgICAgKiAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAgICAgICAgICogIHwgIFNpZ25hbCBCeXRlICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgICAqICArLSstKy0rLSstKy0rLSstKyAgICAgICAgICAgICBJViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgICAgKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgICAgICogIHwgICAgICAgICAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gICAgICAgICAqICB8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgICAgKiAgfC0rLSstKy0rLSstKy0rLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgICAgICogIDogICAgICAgICAgICAgICBCeXRlcyAxLi5OIG9mIGVuY3J5cHRlZCBmcmFtZSAgICAgICAgICAgICAgICAgICA6Ci0gICAgICAgICAqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgICAgKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgICAgICogICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gICAgICAgICAqLwotICAgICAgICBpbnQzMl90IHBsYWluU2l6ZXNbXSA9IHsgMCB9OwotICAgICAgICBpbnQzMl90IGVuY3J5cHRlZFNpemVzW10gPSB7IHN0YXRpY19jYXN0PGludDMyX3Q+KG1idWYtPnJhbmdlX2xlbmd0aCgpIC0gOSkgfTsKLSAgICAgICAgdWludDhfdCBjdHJDb3VudGVyWzE2XSA9IHsgMCB9OwotICAgICAgICB1aW50MzJfdCB0eXBlOwotICAgICAgICBjb25zdCB1aW50OF90ICprZXlJZDsKLSAgICAgICAgc2l6ZV90IGtleUlkU2l6ZTsKLSAgICAgICAgc3A8TWV0YURhdGE+IHRyYWNrTWV0YSA9IG1FeHRyYWN0b3ItPm1UcmFja3MuaXRlbUF0KG1UcmFja0luZGV4KS5tTWV0YTsKLSAgICAgICAgQ0hFQ0sodHJhY2tNZXRhLT5maW5kRGF0YShrS2V5Q3J5cHRvS2V5LCAmdHlwZSwgKGNvbnN0IHZvaWQgKiopJmtleUlkLCAma2V5SWRTaXplKSk7Ci0gICAgICAgIG1ldGEtPnNldERhdGEoa0tleUNyeXB0b0tleSwgMCwga2V5SWQsIGtleUlkU2l6ZSk7Ci0gICAgICAgIG1lbWNweShjdHJDb3VudGVyLCBkYXRhICsgMSwgOCk7Ci0gICAgICAgIG1ldGEtPnNldERhdGEoa0tleUNyeXB0b0lWLCAwLCBjdHJDb3VudGVyLCAxNik7Ci0gICAgICAgIG1ldGEtPnNldERhdGEoa0tleVBsYWluU2l6ZXMsIDAsIHBsYWluU2l6ZXMsIHNpemVvZihwbGFpblNpemVzKSk7Ci0gICAgICAgIG1ldGEtPnNldERhdGEoa0tleUVuY3J5cHRlZFNpemVzLCAwLCBlbmNyeXB0ZWRTaXplcywgc2l6ZW9mKGVuY3J5cHRlZFNpemVzKSk7Ci0gICAgICAgIG1idWYtPnNldF9yYW5nZSg5LCBtYnVmLT5yYW5nZV9sZW5ndGgoKSAtIDkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCi0gICAgICAgICAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKLSAgICAgICAgICogICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gICAgICAgICAqICB8ICBTaWduYWwgQnl0ZSAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgICAgKiAgKy0rLSstKy0rLSstKy0rLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgICAgICogIDogICAgICAgICAgICAgICBCeXRlcyAxLi5OIG9mIHVuZW5jcnlwdGVkIGZyYW1lICAgICAgICAgICAgICAgICA6Ci0gICAgICAgICAqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgICAgKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgICAgICogICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gICAgICAgICAqLwotICAgICAgICBpbnQzMl90IHBsYWluU2l6ZXNbXSA9IHsgc3RhdGljX2Nhc3Q8aW50MzJfdD4obWJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgLSAxKSB9OwotICAgICAgICBpbnQzMl90IGVuY3J5cHRlZFNpemVzW10gPSB7IDAgfTsKLSAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5UGxhaW5TaXplcywgMCwgcGxhaW5TaXplcywgc2l6ZW9mKHBsYWluU2l6ZXMpKTsKLSAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5RW5jcnlwdGVkU2l6ZXMsIDAsIGVuY3J5cHRlZFNpemVzLCBzaXplb2YoZW5jcnlwdGVkU2l6ZXMpKTsKLSAgICAgICAgbWJ1Zi0+c2V0X3JhbmdlKDEsIG1idWYtPnJhbmdlX2xlbmd0aCgpIC0gMSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6cmVhZEJsb2NrKCkgewotICAgIENIRUNLKG1QZW5kaW5nRnJhbWVzLmVtcHR5KCkpOwotCi0gICAgaWYgKG1CbG9ja0l0ZXIuZW9zKCkpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07Ci0gICAgfQotCi0gICAgY29uc3QgbWt2cGFyc2VyOjpCbG9jayAqYmxvY2sgPSBtQmxvY2tJdGVyLmJsb2NrKCk7Ci0KLSAgICBpbnQ2NF90IHRpbWVVcyA9IG1CbG9ja0l0ZXIuYmxvY2tUaW1lVXMoKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmxvY2stPkdldEZyYW1lQ291bnQoKTsgKytpKSB7Ci0gICAgICAgIE1hdHJvc2thRXh0cmFjdG9yOjpUcmFja0luZm8gKnRyYWNrSW5mbyA9ICZtRXh0cmFjdG9yLT5tVHJhY2tzLmVkaXRJdGVtQXQobVRyYWNrSW5kZXgpOwotICAgICAgICBjb25zdCBta3ZwYXJzZXI6OkJsb2NrOjpGcmFtZSAmZnJhbWUgPSBibG9jay0+R2V0RnJhbWUoaSk7Ci0gICAgICAgIHNpemVfdCBsZW4gPSBmcmFtZS5sZW47Ci0gICAgICAgIGlmIChTSVpFX01BWCAtIGxlbiA8IHRyYWNrSW5mby0+bUhlYWRlckxlbikgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIGxlbiArPSB0cmFja0luZm8tPm1IZWFkZXJMZW47Ci0gICAgICAgIE1lZGlhQnVmZmVyICptYnVmID0gbmV3IE1lZGlhQnVmZmVyKGxlbik7Ci0gICAgICAgIHVpbnQ4X3QgKmRhdGEgPSBzdGF0aWNfY2FzdDx1aW50OF90ICo+KG1idWYtPmRhdGEoKSk7Ci0gICAgICAgIGlmICh0cmFja0luZm8tPm1IZWFkZXIpIHsKLSAgICAgICAgICAgIG1lbWNweShkYXRhLCB0cmFja0luZm8tPm1IZWFkZXIsIHRyYWNrSW5mby0+bUhlYWRlckxlbik7Ci0gICAgICAgIH0KLQotICAgICAgICBtYnVmLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7Ci0gICAgICAgIG1idWYtPm1ldGFfZGF0YSgpLT5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIGJsb2NrLT5Jc0tleSgpKTsKLQotICAgICAgICBzdGF0dXNfdCBlcnIgPSBmcmFtZS5SZWFkKG1FeHRyYWN0b3ItPm1SZWFkZXIsIGRhdGEgKyB0cmFja0luZm8tPm1IZWFkZXJMZW4pOwotICAgICAgICBpZiAoZXJyID09IE9LCi0gICAgICAgICAgICAgICAgJiYgbUV4dHJhY3Rvci0+bUlzV2VibQotICAgICAgICAgICAgICAgICYmIHRyYWNrSW5mby0+bUVuY3J5cHRlZCkgewotICAgICAgICAgICAgZXJyID0gc2V0V2VibUJsb2NrQ3J5cHRvSW5mbyhtYnVmKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIG1QZW5kaW5nRnJhbWVzLmNsZWFyKCk7Ci0KLSAgICAgICAgICAgIG1CbG9ja0l0ZXIuYWR2YW5jZSgpOwotICAgICAgICAgICAgbWJ1Zi0+cmVsZWFzZSgpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIG1QZW5kaW5nRnJhbWVzLnB1c2hfYmFjayhtYnVmKTsKLSAgICB9Ci0KLSAgICBtQmxvY2tJdGVyLmFkdmFuY2UoKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewotICAgICpvdXQgPSBOVUxMOwotCi0gICAgaW50NjRfdCB0YXJnZXRTYW1wbGVUaW1lVXMgPSAtMWxsOwotCi0gICAgaW50NjRfdCBzZWVrVGltZVVzOwotICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOwotICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpCi0gICAgICAgICAgICAmJiAhbUV4dHJhY3Rvci0+aXNMaXZlU3RyZWFtaW5nKCkpIHsKLSAgICAgICAgY2xlYXJQZW5kaW5nRnJhbWVzKCk7Ci0KLSAgICAgICAgLy8gVGhlIGF1ZGlvIHdlIHdhbnQgaXMgbG9jYXRlZCBieSB1c2luZyB0aGUgQ3VlcyB0byBzZWVrIHRoZSB2aWRlbwotICAgICAgICAvLyBzdHJlYW0gdG8gZmluZCB0aGUgdGFyZ2V0IENsdXN0ZXIgdGhlbiBpdGVyYXRpbmcgdG8gZmluYWxpemUgZm9yCi0gICAgICAgIC8vIGF1ZGlvLgotICAgICAgICBpbnQ2NF90IGFjdHVhbEZyYW1lVGltZVVzOwotICAgICAgICBtQmxvY2tJdGVyLnNlZWsoc2Vla1RpbWVVcywgbUlzQXVkaW8sICZhY3R1YWxGcmFtZVRpbWVVcyk7Ci0KLSAgICAgICAgaWYgKG1vZGUgPT0gUmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVCkgewotICAgICAgICAgICAgdGFyZ2V0U2FtcGxlVGltZVVzID0gYWN0dWFsRnJhbWVUaW1lVXM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB3aGlsZSAobVBlbmRpbmdGcmFtZXMuZW1wdHkoKSkgewotICAgICAgICBzdGF0dXNfdCBlcnIgPSByZWFkQmxvY2soKTsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBjbGVhclBlbmRpbmdGcmFtZXMoKTsKLQotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIE1lZGlhQnVmZmVyICpmcmFtZSA9ICptUGVuZGluZ0ZyYW1lcy5iZWdpbigpOwotICAgIG1QZW5kaW5nRnJhbWVzLmVyYXNlKG1QZW5kaW5nRnJhbWVzLmJlZ2luKCkpOwotCi0gICAgaWYgKG1UeXBlICE9IEFWQyB8fCBtTkFMU2l6ZUxlbiA9PSAwKSB7Ci0gICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMGxsKSB7Ci0gICAgICAgICAgICBmcmFtZS0+bWV0YV9kYXRhKCktPnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICBrS2V5VGFyZ2V0VGltZSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKLSAgICAgICAgfQotCi0gICAgICAgICpvdXQgPSBmcmFtZTsKLQotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgLy8gRWFjaCBpbnB1dCBmcmFtZSBjb250YWlucyBvbmUgb3IgbW9yZSBOQUwgZnJhZ21lbnRzLCBlYWNoIGZyYWdtZW50Ci0gICAgLy8gaXMgcHJlZml4ZWQgYnkgbU5BTFNpemVMZW4gYnl0ZXMgZ2l2aW5nIHRoZSBmcmFnbWVudCBsZW5ndGgsCi0gICAgLy8gZm9sbG93ZWQgYnkgYSBjb3JyZXNwb25kaW5nIG51bWJlciBvZiBieXRlcyBjb250YWluaW5nIHRoZSBmcmFnbWVudC4KLSAgICAvLyBXZSBvdXRwdXQgYWxsIHRoZXNlIGZyYWdtZW50cyBpbnRvIGEgc2luZ2xlIGxhcmdlIGJ1ZmZlciBzZXBhcmF0ZWQKLSAgICAvLyBieSBzdGFydGNvZGVzICgweDAwIDB4MDAgMHgwMCAweDAxKS4KLSAgICAvLwotICAgIC8vIFdoZW4gbU5BTFNpemVMZW4gaXMgMCwgd2UgYXNzdW1lIHRoZSBkYXRhIGlzIGFscmVhZHkgaW4gdGhlIGZvcm1hdAotICAgIC8vIGRlc2lyZWQuCi0KLSAgICBjb25zdCB1aW50OF90ICpzcmNQdHIgPQotICAgICAgICAoY29uc3QgdWludDhfdCAqKWZyYW1lLT5kYXRhKCkgKyBmcmFtZS0+cmFuZ2Vfb2Zmc2V0KCk7Ci0KLSAgICBzaXplX3Qgc3JjU2l6ZSA9IGZyYW1lLT5yYW5nZV9sZW5ndGgoKTsKLQotICAgIHNpemVfdCBkc3RTaXplID0gMDsKLSAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyID0gTlVMTDsKLSAgICB1aW50OF90ICpkc3RQdHIgPSBOVUxMOwotCi0gICAgZm9yIChpbnQzMl90IHBhc3MgPSAwOyBwYXNzIDwgMjsgKytwYXNzKSB7Ci0gICAgICAgIHNpemVfdCBzcmNPZmZzZXQgPSAwOwotICAgICAgICBzaXplX3QgZHN0T2Zmc2V0ID0gMDsKLSAgICAgICAgd2hpbGUgKHNyY09mZnNldCArIG1OQUxTaXplTGVuIDw9IHNyY1NpemUpIHsKLSAgICAgICAgICAgIHNpemVfdCBOQUxzaXplOwotICAgICAgICAgICAgc3dpdGNoIChtTkFMU2l6ZUxlbikgewotICAgICAgICAgICAgICAgIGNhc2UgMTogTkFMc2l6ZSA9IHNyY1B0cltzcmNPZmZzZXRdOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDI6IE5BTHNpemUgPSBVMTZfQVQoc3JjUHRyICsgc3JjT2Zmc2V0KTsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAzOiBOQUxzaXplID0gVTI0X0FUKHNyY1B0ciArIHNyY09mZnNldCk7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgNDogTkFMc2l6ZSA9IFUzMl9BVChzcmNQdHIgKyBzcmNPZmZzZXQpOyBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBUUkVTUEFTUygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc3JjT2Zmc2V0ICsgbU5BTFNpemVMZW4gKyBOQUxzaXplIDw9IHNyY09mZnNldCArIG1OQUxTaXplTGVuKSB7Ci0gICAgICAgICAgICAgICAgZnJhbWUtPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICBmcmFtZSA9IE5VTEw7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzcmNPZmZzZXQgKyBtTkFMU2l6ZUxlbiArIE5BTHNpemUgPiBzcmNTaXplKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwYXNzID09IDEpIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoJmRzdFB0cltkc3RPZmZzZXRdLCAiXHgwMFx4MDBceDAwXHgwMSIsIDQpOwotCi0gICAgICAgICAgICAgICAgaWYgKGZyYW1lICE9IGJ1ZmZlcikgewotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoJmRzdFB0cltkc3RPZmZzZXQgKyA0XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNQdHJbc3JjT2Zmc2V0ICsgbU5BTFNpemVMZW5dLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTkFMc2l6ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkc3RPZmZzZXQgKz0gNDsgIC8vIDB4MDAgMDAgMDAgMDEKLSAgICAgICAgICAgIGRzdE9mZnNldCArPSBOQUxzaXplOwotCi0gICAgICAgICAgICBzcmNPZmZzZXQgKz0gbU5BTFNpemVMZW4gKyBOQUxzaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNyY09mZnNldCA8IHNyY1NpemUpIHsKLSAgICAgICAgICAgIC8vIFRoZXJlIHdlcmUgdHJhaWxpbmcgYnl0ZXMgb3Igbm90IGVub3VnaCBkYXRhIHRvIGNvbXBsZXRlCi0gICAgICAgICAgICAvLyBhIGZyYWdtZW50LgotCi0gICAgICAgICAgICBmcmFtZS0+cmVsZWFzZSgpOwotICAgICAgICAgICAgZnJhbWUgPSBOVUxMOwotCi0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBhc3MgPT0gMCkgewotICAgICAgICAgICAgZHN0U2l6ZSA9IGRzdE9mZnNldDsKLQotICAgICAgICAgICAgaWYgKGRzdFNpemUgPT0gc3JjU2l6ZSAmJiBtTkFMU2l6ZUxlbiA9PSA0KSB7Ci0gICAgICAgICAgICAgICAgLy8gSW4gdGhpcyBzcGVjaWFsIGNhc2Ugd2UgY2FuIHJlLXVzZSB0aGUgaW5wdXQgYnVmZmVyIGJ5IHN1YnN0aXR1dGluZwotICAgICAgICAgICAgICAgIC8vIGVhY2ggNC1ieXRlIG5hbCBzaXplIHdpdGggYSA0LWJ5dGUgc3RhcnQgY29kZQotICAgICAgICAgICAgICAgIGJ1ZmZlciA9IGZyYW1lOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoZHN0U2l6ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludDY0X3QgdGltZVVzOwotICAgICAgICAgICAgQ0hFQ0soZnJhbWUtPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKLSAgICAgICAgICAgIGludDMyX3QgaXNTeW5jOwotICAgICAgICAgICAgQ0hFQ0soZnJhbWUtPm1ldGFfZGF0YSgpLT5maW5kSW50MzIoa0tleUlzU3luY0ZyYW1lLCAmaXNTeW5jKSk7Ci0KLSAgICAgICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOwotICAgICAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCBpc1N5bmMpOwotCi0gICAgICAgICAgICBkc3RQdHIgPSAodWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGZyYW1lICE9IGJ1ZmZlcikgewotICAgICAgICBmcmFtZS0+cmVsZWFzZSgpOwotICAgICAgICBmcmFtZSA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKHRhcmdldFNhbXBsZVRpbWVVcyA+PSAwbGwpIHsKLSAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoCi0gICAgICAgICAgICAgICAga0tleVRhcmdldFRpbWUsIHRhcmdldFNhbXBsZVRpbWVVcyk7Ci0gICAgfQotCi0gICAgKm91dCA9IGJ1ZmZlcjsKLQotICAgIHJldHVybiBPSzsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotTWF0cm9za2FFeHRyYWN0b3I6Ok1hdHJvc2thRXh0cmFjdG9yKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UpCi0gICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAotICAgICAgbVJlYWRlcihuZXcgRGF0YVNvdXJjZVJlYWRlcihtRGF0YVNvdXJjZSkpLAotICAgICAgbVNlZ21lbnQoTlVMTCksCi0gICAgICBtRXh0cmFjdGVkVGh1bWJuYWlscyhmYWxzZSksCi0gICAgICBtSXNXZWJtKGZhbHNlKSwKLSAgICAgIG1TZWVrUHJlUm9sbE5zKDApIHsKLSAgICBvZmY2NF90IHNpemU7Ci0gICAgbUlzTGl2ZVN0cmVhbWluZyA9Ci0gICAgICAgIChtRGF0YVNvdXJjZS0+ZmxhZ3MoKQotICAgICAgICAgICAgJiAoRGF0YVNvdXJjZTo6a1dhbnRzUHJlZmV0Y2hpbmcKLSAgICAgICAgICAgICAgICB8IERhdGFTb3VyY2U6OmtJc0NhY2hpbmdEYXRhU291cmNlKSkKLSAgICAgICAgJiYgbURhdGFTb3VyY2UtPmdldFNpemUoJnNpemUpICE9IE9LOwotCi0gICAgbWt2cGFyc2VyOjpFQk1MSGVhZGVyIGVibWxIZWFkZXI7Ci0gICAgbG9uZyBsb25nIHBvczsKLSAgICBpZiAoZWJtbEhlYWRlci5QYXJzZShtUmVhZGVyLCBwb3MpIDwgMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGVibWxIZWFkZXIubV9kb2NUeXBlICYmICFzdHJjbXAoIndlYm0iLCBlYm1sSGVhZGVyLm1fZG9jVHlwZSkpIHsKLSAgICAgICAgbUlzV2VibSA9IHRydWU7Ci0gICAgfQotCi0gICAgbG9uZyBsb25nIHJldCA9Ci0gICAgICAgIG1rdnBhcnNlcjo6U2VnbWVudDo6Q3JlYXRlSW5zdGFuY2UobVJlYWRlciwgcG9zLCBtU2VnbWVudCk7Ci0KLSAgICBpZiAocmV0KSB7Ci0gICAgICAgIENIRUNLKG1TZWdtZW50ID09IE5VTEwpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gZnJvbSBta3ZwYXJzZXI6OlNlZ21lbnQ6OkxvYWQoKSwgYnV0IHN0b3AgYXQgZmlyc3QgY2x1c3RlcgotICAgIHJldCA9IG1TZWdtZW50LT5QYXJzZUhlYWRlcnMoKTsKLSAgICBpZiAocmV0ID09IDApIHsKLSAgICAgICAgbG9uZyBsZW47Ci0gICAgICAgIHJldCA9IG1TZWdtZW50LT5Mb2FkQ2x1c3Rlcihwb3MsIGxlbik7Ci0gICAgICAgIGlmIChyZXQgPj0gMSkgewotICAgICAgICAgICAgLy8gbm8gbW9yZSBjbHVzdGVycwotICAgICAgICAgICAgcmV0ID0gMDsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAocmV0ID4gMCkgewotICAgICAgICByZXQgPSBta3ZwYXJzZXI6OkVfQlVGRkVSX05PVF9GVUxMOwotICAgIH0KLQotICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJDb3JydXB0ICVzIHNvdXJjZTogJXMiLCBtSXNXZWJtID8gIndlYm0iIDogIm1hdHJvc2thIiwKLSAgICAgICAgICAgICAgICB1cmlEZWJ1Z1N0cmluZyhtRGF0YVNvdXJjZS0+Z2V0VXJpKCkpLmNfc3RyKCkpOwotICAgICAgICBkZWxldGUgbVNlZ21lbnQ7Ci0gICAgICAgIG1TZWdtZW50ID0gTlVMTDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotI2lmIDAKLSAgICBjb25zdCBta3ZwYXJzZXI6OlNlZ21lbnRJbmZvICppbmZvID0gbVNlZ21lbnQtPkdldEluZm8oKTsKLSAgICBBTE9HSSgibXV4aW5nIGFwcDogJXMsIHdyaXRpbmcgYXBwOiAlcyIsCi0gICAgICAgICBpbmZvLT5HZXRNdXhpbmdBcHBBc1VURjgoKSwKLSAgICAgICAgIGluZm8tPkdldFdyaXRpbmdBcHBBc1VURjgoKSk7Ci0jZW5kaWYKLQotICAgIGFkZFRyYWNrcygpOwotfQotCi1NYXRyb3NrYUV4dHJhY3Rvcjo6fk1hdHJvc2thRXh0cmFjdG9yKCkgewotICAgIGRlbGV0ZSBtU2VnbWVudDsKLSAgICBtU2VnbWVudCA9IE5VTEw7Ci0KLSAgICBkZWxldGUgbVJlYWRlcjsKLSAgICBtUmVhZGVyID0gTlVMTDsKLX0KLQotc2l6ZV90IE1hdHJvc2thRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpIHsKLSAgICByZXR1cm4gbVRyYWNrcy5zaXplKCk7Ci19Ci0KLXNwPElNZWRpYVNvdXJjZT4gTWF0cm9za2FFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgewotICAgIGlmIChpbmRleCA+PSBtVHJhY2tzLnNpemUoKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gbmV3IE1hdHJvc2thU291cmNlKHRoaXMsIGluZGV4KTsKLX0KLQotc3A8TWV0YURhdGE+IE1hdHJvc2thRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAotICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKSB7Ci0gICAgaWYgKGluZGV4ID49IG1UcmFja3Muc2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGlmICgoZmxhZ3MgJiBrSW5jbHVkZUV4dGVuc2l2ZU1ldGFEYXRhKSAmJiAhbUV4dHJhY3RlZFRodW1ibmFpbHMKLSAgICAgICAgICAgICYmICFpc0xpdmVTdHJlYW1pbmcoKSkgewotICAgICAgICBmaW5kVGh1bWJuYWlscygpOwotICAgICAgICBtRXh0cmFjdGVkVGh1bWJuYWlscyA9IHRydWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1UcmFja3MuaXRlbUF0KGluZGV4KS5tTWV0YTsKLX0KLQotYm9vbCBNYXRyb3NrYUV4dHJhY3Rvcjo6aXNMaXZlU3RyZWFtaW5nKCkgY29uc3QgewotICAgIHJldHVybiBtSXNMaXZlU3RyZWFtaW5nOwotfQotCi1zdGF0aWMgaW50IGJ5dGVzRm9yU2l6ZShzaXplX3Qgc2l6ZSkgewotICAgIC8vIHVzZSBhdCBtb3N0IDI4IGJpdHMgKDQgdGltZXMgNykKLSAgICBDSEVDSyhzaXplIDw9IDB4ZmZmZmZmZik7Ci0KLSAgICBpZiAoc2l6ZSA+IDB4MWZmZmZmKSB7Ci0gICAgICAgIHJldHVybiA0OwotICAgIH0gZWxzZSBpZiAoc2l6ZSA+IDB4M2ZmZikgewotICAgICAgICByZXR1cm4gMzsKLSAgICB9IGVsc2UgaWYgKHNpemUgPiAweDdmKSB7Ci0gICAgICAgIHJldHVybiAyOwotICAgIH0KLSAgICByZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgc3RvcmVTaXplKHVpbnQ4X3QgKmRhdGEsIHNpemVfdCAmaWR4LCBzaXplX3Qgc2l6ZSkgewotICAgIGludCBudW1CeXRlcyA9IGJ5dGVzRm9yU2l6ZShzaXplKTsKLSAgICBpZHggKz0gbnVtQnl0ZXM7Ci0KLSAgICBkYXRhICs9IGlkeDsKLSAgICBzaXplX3QgbmV4dCA9IDA7Ci0gICAgd2hpbGUgKG51bUJ5dGVzLS0pIHsKLSAgICAgICAgKi0tZGF0YSA9IChzaXplICYgMHg3ZikgfCBuZXh0OwotICAgICAgICBzaXplID4+PSA3OwotICAgICAgICBuZXh0ID0gMHg4MDsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGFkZEVTRFNGcm9tQ29kZWNQcml2YXRlKAotICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEsCi0gICAgICAgIGJvb2wgaXNBdWRpbywgY29uc3Qgdm9pZCAqcHJpdiwgc2l6ZV90IHByaXZTaXplKSB7Ci0KLSAgICBpbnQgcHJpdlNpemVCeXRlc1JlcXVpcmVkID0gYnl0ZXNGb3JTaXplKHByaXZTaXplKTsKLSAgICBpbnQgZXNkc1NpemUyID0gMTQgKyBwcml2U2l6ZUJ5dGVzUmVxdWlyZWQgKyBwcml2U2l6ZTsKLSAgICBpbnQgZXNkc1NpemUyQnl0ZXNSZXF1aXJlZCA9IGJ5dGVzRm9yU2l6ZShlc2RzU2l6ZTIpOwotICAgIGludCBlc2RzU2l6ZTEgPSA0ICsgZXNkc1NpemUyQnl0ZXNSZXF1aXJlZCArIGVzZHNTaXplMjsKLSAgICBpbnQgZXNkc1NpemUxQnl0ZXNSZXF1aXJlZCA9IGJ5dGVzRm9yU2l6ZShlc2RzU2l6ZTEpOwotICAgIHNpemVfdCBlc2RzU2l6ZSA9IDEgKyBlc2RzU2l6ZTFCeXRlc1JlcXVpcmVkICsgZXNkc1NpemUxOwotICAgIHVpbnQ4X3QgKmVzZHMgPSBuZXcgdWludDhfdFtlc2RzU2l6ZV07Ci0KLSAgICBzaXplX3QgaWR4ID0gMDsKLSAgICBlc2RzW2lkeCsrXSA9IDB4MDM7Ci0gICAgc3RvcmVTaXplKGVzZHMsIGlkeCwgZXNkc1NpemUxKTsKLSAgICBlc2RzW2lkeCsrXSA9IDB4MDA7IC8vIEVTX0lECi0gICAgZXNkc1tpZHgrK10gPSAweDAwOyAvLyBFU19JRAotICAgIGVzZHNbaWR4KytdID0gMHgwMDsgLy8gc3RyZWFtRGVwZW5kZW5jZUZsYWcsIFVSTF9GbGFnLCBPQ1JzdHJlYW1GbGFnCi0gICAgZXNkc1tpZHgrK10gPSAweDA0OwotICAgIHN0b3JlU2l6ZShlc2RzLCBpZHgsIGVzZHNTaXplMik7Ci0gICAgZXNkc1tpZHgrK10gPSBpc0F1ZGlvID8gMHg0MCAgIC8vIEF1ZGlvIElTTy9JRUMgMTQ0OTYtMwotICAgICAgICAgICAgICAgICAgICAgICAgICA6IDB4MjA7ICAvLyBWaXN1YWwgSVNPL0lFQyAxNDQ5Ni0yCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMjsgaSsrKSB7Ci0gICAgICAgIGVzZHNbaWR4KytdID0gMHgwMDsKLSAgICB9Ci0gICAgZXNkc1tpZHgrK10gPSAweDA1OwotICAgIHN0b3JlU2l6ZShlc2RzLCBpZHgsIHByaXZTaXplKTsKLSAgICBtZW1jcHkoZXNkcyArIGlkeCwgcHJpdiwgcHJpdlNpemUpOwotCi0gICAgbWV0YS0+c2V0RGF0YShrS2V5RVNEUywgMCwgZXNkcywgZXNkc1NpemUpOwotCi0gICAgZGVsZXRlW10gZXNkczsKLSAgICBlc2RzID0gTlVMTDsKLX0KLQotc3RhdHVzX3QgYWRkVm9yYmlzQ29kZWNJbmZvKAotICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEsCi0gICAgICAgIGNvbnN0IHZvaWQgKl9jb2RlY1ByaXZhdGUsIHNpemVfdCBjb2RlY1ByaXZhdGVTaXplKSB7Ci0gICAgLy8gaGV4ZHVtcChfY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKLQotICAgIGlmIChjb2RlY1ByaXZhdGVTaXplIDwgMSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGNvbnN0IHVpbnQ4X3QgKmNvZGVjUHJpdmF0ZSA9IChjb25zdCB1aW50OF90ICopX2NvZGVjUHJpdmF0ZTsKLQotICAgIGlmIChjb2RlY1ByaXZhdGVbMF0gIT0gMHgwMikgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIC8vIGNvZGVjSW5mbyBzdGFydHMgd2l0aCB0d28gbGVuZ3RocywgbGVuMSBhbmQgbGVuMiwgdGhhdCBhcmUKLSAgICAvLyAiWGlwaC1zdHlsZS1sYWNpbmcgZW5jb2RlZCIuLi4KLQotICAgIHNpemVfdCBvZmZzZXQgPSAxOwotICAgIHNpemVfdCBsZW4xID0gMDsKLSAgICB3aGlsZSAob2Zmc2V0IDwgY29kZWNQcml2YXRlU2l6ZSAmJiBjb2RlY1ByaXZhdGVbb2Zmc2V0XSA9PSAweGZmKSB7Ci0gICAgICAgIGlmIChsZW4xID4gKFNJWkVfTUFYIC0gMHhmZikpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7IC8vIHdvdWxkIG92ZXJmbG93Ci0gICAgICAgIH0KLSAgICAgICAgbGVuMSArPSAweGZmOwotICAgICAgICArK29mZnNldDsKLSAgICB9Ci0gICAgaWYgKG9mZnNldCA+PSBjb2RlY1ByaXZhdGVTaXplKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotICAgIGlmIChsZW4xID4gKFNJWkVfTUFYIC0gY29kZWNQcml2YXRlW29mZnNldF0pKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7IC8vIHdvdWxkIG92ZXJmbG93Ci0gICAgfQotICAgIGxlbjEgKz0gY29kZWNQcml2YXRlW29mZnNldCsrXTsKLQotICAgIHNpemVfdCBsZW4yID0gMDsKLSAgICB3aGlsZSAob2Zmc2V0IDwgY29kZWNQcml2YXRlU2l6ZSAmJiBjb2RlY1ByaXZhdGVbb2Zmc2V0XSA9PSAweGZmKSB7Ci0gICAgICAgIGlmIChsZW4yID4gKFNJWkVfTUFYIC0gMHhmZikpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7IC8vIHdvdWxkIG92ZXJmbG93Ci0gICAgICAgIH0KLSAgICAgICAgbGVuMiArPSAweGZmOwotICAgICAgICArK29mZnNldDsKLSAgICB9Ci0gICAgaWYgKG9mZnNldCA+PSBjb2RlY1ByaXZhdGVTaXplKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotICAgIGlmIChsZW4yID4gKFNJWkVfTUFYIC0gY29kZWNQcml2YXRlW29mZnNldF0pKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7IC8vIHdvdWxkIG92ZXJmbG93Ci0gICAgfQotICAgIGxlbjIgKz0gY29kZWNQcml2YXRlW29mZnNldCsrXTsKLQotICAgIGlmIChsZW4xID4gU0laRV9NQVggLSBsZW4yIHx8IG9mZnNldCA+IFNJWkVfTUFYIC0gKGxlbjEgKyBsZW4yKSB8fAotICAgICAgICAgICAgY29kZWNQcml2YXRlU2l6ZSA8IG9mZnNldCArIGxlbjEgKyBsZW4yKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgaWYgKGNvZGVjUHJpdmF0ZVtvZmZzZXRdICE9IDB4MDEpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0gICAgbWV0YS0+c2V0RGF0YShrS2V5Vm9yYmlzSW5mbywgMCwgJmNvZGVjUHJpdmF0ZVtvZmZzZXRdLCBsZW4xKTsKLQotICAgIG9mZnNldCArPSBsZW4xOwotICAgIGlmIChjb2RlY1ByaXZhdGVbb2Zmc2V0XSAhPSAweDAzKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgb2Zmc2V0ICs9IGxlbjI7Ci0gICAgaWYgKGNvZGVjUHJpdmF0ZVtvZmZzZXRdICE9IDB4MDUpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBtZXRhLT5zZXREYXRhKAotICAgICAgICAgICAga0tleVZvcmJpc0Jvb2tzLCAwLCAmY29kZWNQcml2YXRlW29mZnNldF0sCi0gICAgICAgICAgICBjb2RlY1ByaXZhdGVTaXplIC0gb2Zmc2V0KTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdGljIHN0YXR1c190IGFkZEZsYWNNZXRhZGF0YSgKLSAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhLAotICAgICAgICBjb25zdCB2b2lkICpjb2RlY1ByaXZhdGUsIHNpemVfdCBjb2RlY1ByaXZhdGVTaXplKSB7Ci0gICAgLy8gaGV4ZHVtcChjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOwotCi0gICAgbWV0YS0+c2V0RGF0YShrS2V5RmxhY01ldGFkYXRhLCAwLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOwotCi0gICAgaW50MzJfdCBtYXhJbnB1dFNpemUgPSA2NCA8PCAxMDsKLSAgICBzcDxGTEFDRGVjb2Rlcj4gZmxhY0RlY29kZXIgPSBGTEFDRGVjb2Rlcjo6Q3JlYXRlKCk7Ci0gICAgaWYgKGZsYWNEZWNvZGVyICE9IE5VTEwKLSAgICAgICAgICAgICYmIGZsYWNEZWNvZGVyLT5wYXJzZU1ldGFkYXRhKChjb25zdCB1aW50OF90Kiljb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpID09IE9LKSB7Ci0gICAgICAgIEZMQUNfX1N0cmVhbU1ldGFkYXRhX1N0cmVhbUluZm8gc3RyZWFtSW5mbyA9IGZsYWNEZWNvZGVyLT5nZXRTdHJlYW1JbmZvKCk7Ci0gICAgICAgIG1heElucHV0U2l6ZSA9IHN0cmVhbUluZm8ubWF4X2ZyYW1lc2l6ZTsKLSAgICAgICAgaWYgKG1heElucHV0U2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICAvLyBJbiBjYXNlIG1heCBmcmFtZXNpemUgaXMgbm90IGF2YWlsYWJsZSwgdXNlIHJhdyBkYXRhIHNpemUgYXMgbWF4IGZyYW1lc2l6ZSwKLSAgICAgICAgICAgIC8vIGFzc3VtaW5nIHRoZXJlIGlzIG5vIGV4cGFuc2lvbi4KLSAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvLm1heF9ibG9ja3NpemUgIT0gMAotICAgICAgICAgICAgICAgICAgICAmJiBzdHJlYW1JbmZvLmNoYW5uZWxzICE9IDAKLSAgICAgICAgICAgICAgICAgICAgJiYgKChzdHJlYW1JbmZvLmJpdHNfcGVyX3NhbXBsZSArIDcpIC8gOCkgPgotICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzJfTUFYIC8gc3RyZWFtSW5mby5tYXhfYmxvY2tzaXplIC8gc3RyZWFtSW5mby5jaGFubmVscykgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXhJbnB1dFNpemUgPSAoKHN0cmVhbUluZm8uYml0c19wZXJfc2FtcGxlICsgNykgLyA4KQotICAgICAgICAgICAgICAgICogc3RyZWFtSW5mby5tYXhfYmxvY2tzaXplICogc3RyZWFtSW5mby5jaGFubmVsczsKLSAgICAgICAgfQotICAgIH0KLSAgICBtZXRhLT5zZXRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCBtYXhJbnB1dFNpemUpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBNYXRyb3NrYUV4dHJhY3Rvcjo6c3ludGhlc2l6ZUFWQ0MoVHJhY2tJbmZvICp0cmFja0luZm8sIHNpemVfdCBpbmRleCkgewotICAgIEJsb2NrSXRlcmF0b3IgaXRlcih0aGlzLCB0cmFja0luZm8tPm1UcmFja051bSwgaW5kZXgpOwotICAgIGlmIChpdGVyLmVvcygpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgY29uc3QgbWt2cGFyc2VyOjpCbG9jayAqYmxvY2sgPSBpdGVyLmJsb2NrKCk7Ci0gICAgaWYgKGJsb2NrLT5HZXRGcmFtZUNvdW50KCkgPD0gMCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGNvbnN0IG1rdnBhcnNlcjo6QmxvY2s6OkZyYW1lICZmcmFtZSA9IGJsb2NrLT5HZXRGcmFtZSgwKTsKLSAgICBzcDxBQnVmZmVyPiBhYnVmID0gbmV3IEFCdWZmZXIoZnJhbWUubGVuKTsKLSAgICBsb25nIG4gPSBmcmFtZS5SZWFkKG1SZWFkZXIsIGFidWYtPmRhdGEoKSk7Ci0gICAgaWYgKG4gIT0gMCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHNwPE1ldGFEYXRhPiBhdmNNZXRhID0gTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKGFidWYpOwotICAgIGlmIChhdmNNZXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICAvLyBPdmVycmlkZSB0aGUgc3ludGhlc2l6ZWQgbmFsIGxlbmd0aCBzaXplLCB3aGljaCBpcyBhcmJpdHJhcnkKLSAgICBhdmNNZXRhLT5zZXRJbnQzMihrS2V5TmFsTGVuZ3RoU2l6ZSwgMCk7Ci0gICAgdHJhY2tJbmZvLT5tTWV0YSA9IGF2Y01ldGE7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgaXNWYWxpZEludDMyQ29sb3VyVmFsdWUobG9uZyBsb25nIHZhbHVlKSB7Ci0gICAgcmV0dXJuIHZhbHVlICE9IG1rdnBhcnNlcjo6Q29sb3VyOjprVmFsdWVOb3RQcmVzZW50Ci0gICAgICAgICAgICAmJiB2YWx1ZSA+PSBJTlQzMl9NSU4KLSAgICAgICAgICAgICYmIHZhbHVlIDw9IElOVDMyX01BWDsKLX0KLQotc3RhdGljIGlubGluZSBib29sIGlzVmFsaWRVaW50MTZDb2xvdXJWYWx1ZShsb25nIGxvbmcgdmFsdWUpIHsKLSAgICByZXR1cm4gdmFsdWUgIT0gbWt2cGFyc2VyOjpDb2xvdXI6OmtWYWx1ZU5vdFByZXNlbnQKLSAgICAgICAgICAgICYmIHZhbHVlID49IDAKLSAgICAgICAgICAgICYmIHZhbHVlIDw9IFVJTlQxNl9NQVg7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBpc1ZhbGlkUHJpbWFyeShjb25zdCBta3ZwYXJzZXI6OlByaW1hcnlDaHJvbWF0aWNpdHkgKnByaW1hcnkpIHsKLSAgICByZXR1cm4gcHJpbWFyeSAhPSBOVUxMICYmIHByaW1hcnktPnggPj0gMCAmJiBwcmltYXJ5LT54IDw9IDEKLSAgICAgICAgICAgICAmJiBwcmltYXJ5LT55ID49IDAgJiYgcHJpbWFyeS0+eSA8PSAxOwotfQotCi12b2lkIE1hdHJvc2thRXh0cmFjdG9yOjpnZXRDb2xvckluZm9ybWF0aW9uKAotICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlZpZGVvVHJhY2sgKnZ0cmFjaywgc3A8TWV0YURhdGE+ICZtZXRhKSB7Ci0gICAgY29uc3QgbWt2cGFyc2VyOjpDb2xvdXIgKmNvbG9yID0gdnRyYWNrLT5HZXRDb2xvdXIoKTsKLSAgICBpZiAoY29sb3IgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gQ29sb3IgQXNwZWN0cwotICAgIHsKLSAgICAgICAgaW50MzJfdCBwcmltYXJpZXMgPSAyOyAvLyBJU08gdW5zcGVjaWZpZWQKLSAgICAgICAgaW50MzJfdCB0cmFuc2ZlciA9IDI7IC8vIElTTyB1bnNwZWNpZmllZAotICAgICAgICBpbnQzMl90IGNvZWZmcyA9IDI7IC8vIElTTyB1bnNwZWNpZmllZAotICAgICAgICBib29sIGZ1bGxSYW5nZSA9IGZhbHNlOyAvLyBkZWZhdWx0Ci0gICAgICAgIGJvb2wgcmFuZ2VTcGVjaWZpZWQgPSBmYWxzZTsKLQotICAgICAgICBpZiAoaXNWYWxpZEludDMyQ29sb3VyVmFsdWUoY29sb3ItPnByaW1hcmllcykpIHsKLSAgICAgICAgICAgIHByaW1hcmllcyA9IGNvbG9yLT5wcmltYXJpZXM7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlzVmFsaWRJbnQzMkNvbG91clZhbHVlKGNvbG9yLT50cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3MpKSB7Ci0gICAgICAgICAgICB0cmFuc2ZlciA9IGNvbG9yLT50cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3M7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlzVmFsaWRJbnQzMkNvbG91clZhbHVlKGNvbG9yLT5tYXRyaXhfY29lZmZpY2llbnRzKSkgewotICAgICAgICAgICAgY29lZmZzID0gY29sb3ItPm1hdHJpeF9jb2VmZmljaWVudHM7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbG9yLT5yYW5nZSAhPSBta3ZwYXJzZXI6OkNvbG91cjo6a1ZhbHVlTm90UHJlc2VudAotICAgICAgICAgICAgICAgICYmIGNvbG9yLT5yYW5nZSAhPSAwIC8qIE1LViB1bnNwZWNpZmllZCAqLykgewotICAgICAgICAgICAgLy8gV2Ugb25seSBzdXBwb3J0IE1LViBicm9hZGNhc3QgcmFuZ2UgKD09IGxpbWl0ZWQpIGFuZCBmdWxsIHJhbmdlLgotICAgICAgICAgICAgLy8gV2UgdHJlYXQgYWxsIG90aGVyIHZhbHVlIGFzIHRoZSBkZWZhdWx0IGxpbWl0ZWQgcmFuZ2UuCi0gICAgICAgICAgICBmdWxsUmFuZ2UgPSBjb2xvci0+cmFuZ2UgPT0gMiAvKiBNS1YgZnVsbFJhbmdlICovOwotICAgICAgICAgICAgcmFuZ2VTcGVjaWZpZWQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgQ29sb3JBc3BlY3RzIGFzcGVjdHM7Ci0gICAgICAgIENvbG9yVXRpbHM6OmNvbnZlcnRJc29Db2xvckFzcGVjdHNUb0NvZGVjQXNwZWN0cygKLSAgICAgICAgICAgICAgICBwcmltYXJpZXMsIHRyYW5zZmVyLCBjb2VmZnMsIGZ1bGxSYW5nZSwgYXNwZWN0cyk7Ci0gICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlDb2xvclByaW1hcmllcywgYXNwZWN0cy5tUHJpbWFyaWVzKTsKLSAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVRyYW5zZmVyRnVuY3Rpb24sIGFzcGVjdHMubVRyYW5zZmVyKTsKLSAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUNvbG9yTWF0cml4LCBhc3BlY3RzLm1NYXRyaXhDb2VmZnMpOwotICAgICAgICBtZXRhLT5zZXRJbnQzMigKLSAgICAgICAgICAgICAgICBrS2V5Q29sb3JSYW5nZSwgcmFuZ2VTcGVjaWZpZWQgPyBhc3BlY3RzLm1SYW5nZSA6IENvbG9yQXNwZWN0czo6UmFuZ2VVbnNwZWNpZmllZCk7Ci0gICAgfQotCi0gICAgLy8gSERSIFN0YXRpYyBJbmZvCi0gICAgewotICAgICAgICBIRFJTdGF0aWNJbmZvIGluZm8sIG51bGxJbmZvOyAvLyBudWxsSW5mbyBpcyBhIGZ1bGx5IHVuc3BlY2lmaWVkIHN0YXRpYyBpbmZvCi0gICAgICAgIG1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKGluZm8pKTsKLSAgICAgICAgbWVtc2V0KCZudWxsSW5mbywgMCwgc2l6ZW9mKG51bGxJbmZvKSk7Ci0gICAgICAgIGlmIChpc1ZhbGlkVWludDE2Q29sb3VyVmFsdWUoY29sb3ItPm1heF9jbGwpKSB7Ci0gICAgICAgICAgICBpbmZvLnNUeXBlMS5tTWF4Q29udGVudExpZ2h0TGV2ZWwgPSBjb2xvci0+bWF4X2NsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXNWYWxpZFVpbnQxNkNvbG91clZhbHVlKGNvbG9yLT5tYXhfZmFsbCkpIHsKLSAgICAgICAgICAgIGluZm8uc1R5cGUxLm1NYXhGcmFtZUF2ZXJhZ2VMaWdodExldmVsID0gY29sb3ItPm1heF9mYWxsOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6TWFzdGVyaW5nTWV0YWRhdGEgKm1hc3RlcmluZyA9IGNvbG9yLT5tYXN0ZXJpbmdfbWV0YWRhdGE7Ci0gICAgICAgIGlmIChtYXN0ZXJpbmcgIT0gTlVMTCkgewotICAgICAgICAgICAgLy8gQ29udmVydCBtYXRyb3NrYSB2YWx1ZXMgdG8gSERSU3RhdGljSW5mbyBlcXVpdmFsZW50IHZhbHVlcyBmb3IgZWFjaCBmdWxseSBzcGVjaWZpZWQKLSAgICAgICAgICAgIC8vIGdyb3VwLiBTZWUgQ1RBLTY4MS4zIHNlY3Rpb24gMy4yLjEgZm9yIG1vcmUgaW5mby4KLSAgICAgICAgICAgIGlmIChtYXN0ZXJpbmctPmx1bWluYW5jZV9tYXggPj0gMC41ICYmIG1hc3RlcmluZy0+bHVtaW5hbmNlX21heCA8IDY1NTM1LjUpIHsKLSAgICAgICAgICAgICAgICBpbmZvLnNUeXBlMS5tTWF4RGlzcGxheUx1bWluYW5jZSA9ICh1aW50MTZfdCkobWFzdGVyaW5nLT5sdW1pbmFuY2VfbWF4ICsgMC41KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtYXN0ZXJpbmctPmx1bWluYW5jZV9taW4gPj0gMC4wMDAwNSAmJiBtYXN0ZXJpbmctPmx1bWluYW5jZV9taW4gPCA2LjU1MzU1KSB7Ci0gICAgICAgICAgICAgICAgLy8gSERSU3RhdGljSW5mbyBUeXBlMSBzdG9yZXMgbWluIGx1bWluYW5jZSBzY2FsZWQgMTAwMDA6MQotICAgICAgICAgICAgICAgIGluZm8uc1R5cGUxLm1NaW5EaXNwbGF5THVtaW5hbmNlID0KLSAgICAgICAgICAgICAgICAgICAgKHVpbnQxNl90KSgxMDAwMCAqIG1hc3RlcmluZy0+bHVtaW5hbmNlX21pbiArIDAuNSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBIRFJTdGF0aWNJbmZvIFR5cGUxIHN0b3JlcyBwcmltYXJpZXMgc2NhbGVkIDUwMDAwOjEKLSAgICAgICAgICAgIGlmIChpc1ZhbGlkUHJpbWFyeShtYXN0ZXJpbmctPndoaXRlX3BvaW50KSkgewotICAgICAgICAgICAgICAgIGluZm8uc1R5cGUxLm1XLnggPSAodWludDE2X3QpKDUwMDAwICogbWFzdGVyaW5nLT53aGl0ZV9wb2ludC0+eCArIDAuNSk7Ci0gICAgICAgICAgICAgICAgaW5mby5zVHlwZTEubVcueSA9ICh1aW50MTZfdCkoNTAwMDAgKiBtYXN0ZXJpbmctPndoaXRlX3BvaW50LT55ICsgMC41KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpc1ZhbGlkUHJpbWFyeShtYXN0ZXJpbmctPnIpICYmIGlzVmFsaWRQcmltYXJ5KG1hc3RlcmluZy0+ZykKLSAgICAgICAgICAgICAgICAgICAgJiYgaXNWYWxpZFByaW1hcnkobWFzdGVyaW5nLT5iKSkgewotICAgICAgICAgICAgICAgIGluZm8uc1R5cGUxLm1SLnggPSAodWludDE2X3QpKDUwMDAwICogbWFzdGVyaW5nLT5yLT54ICsgMC41KTsKLSAgICAgICAgICAgICAgICBpbmZvLnNUeXBlMS5tUi55ID0gKHVpbnQxNl90KSg1MDAwMCAqIG1hc3RlcmluZy0+ci0+eSArIDAuNSk7Ci0gICAgICAgICAgICAgICAgaW5mby5zVHlwZTEubUcueCA9ICh1aW50MTZfdCkoNTAwMDAgKiBtYXN0ZXJpbmctPmctPnggKyAwLjUpOwotICAgICAgICAgICAgICAgIGluZm8uc1R5cGUxLm1HLnkgPSAodWludDE2X3QpKDUwMDAwICogbWFzdGVyaW5nLT5nLT55ICsgMC41KTsKLSAgICAgICAgICAgICAgICBpbmZvLnNUeXBlMS5tQi54ID0gKHVpbnQxNl90KSg1MDAwMCAqIG1hc3RlcmluZy0+Yi0+eCArIDAuNSk7Ci0gICAgICAgICAgICAgICAgaW5mby5zVHlwZTEubUIueSA9ICh1aW50MTZfdCkoNTAwMDAgKiBtYXN0ZXJpbmctPmItPnkgKyAwLjUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIE9ubHkgYWR2ZXJ0aXNlIHN0YXRpYyBpbmZvIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGUgZ3JvdXBzIGhhdmUgYmVlbiBzcGVjaWZpZWQuCi0gICAgICAgIGlmIChtZW1jbXAoJmluZm8sICZudWxsSW5mbywgc2l6ZW9mKGluZm8pKSAhPSAwKSB7Ci0gICAgICAgICAgICBpbmZvLm1JRCA9IEhEUlN0YXRpY0luZm86OmtUeXBlMTsKLSAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUhkclN0YXRpY0luZm8sICdoZHJTJywgJmluZm8sIHNpemVvZihpbmZvKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXR1c190IE1hdHJvc2thRXh0cmFjdG9yOjppbml0VHJhY2tJbmZvKAotICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlRyYWNrICp0cmFjaywgY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhLCBUcmFja0luZm8gKnRyYWNrSW5mbykgewotICAgIHRyYWNrSW5mby0+bVRyYWNrTnVtID0gdHJhY2stPkdldE51bWJlcigpOwotICAgIHRyYWNrSW5mby0+bU1ldGEgPSBtZXRhOwotICAgIHRyYWNrSW5mby0+bUV4dHJhY3RvciA9IHRoaXM7Ci0gICAgdHJhY2tJbmZvLT5tRW5jcnlwdGVkID0gZmFsc2U7Ci0gICAgdHJhY2tJbmZvLT5tSGVhZGVyID0gTlVMTDsKLSAgICB0cmFja0luZm8tPm1IZWFkZXJMZW4gPSAwOwotCi0gICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IHRyYWNrLT5HZXRDb250ZW50RW5jb2RpbmdDb3VudCgpOyBpKyspIHsKLSAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpDb250ZW50RW5jb2RpbmcgKmVuY29kaW5nID0gdHJhY2stPkdldENvbnRlbnRFbmNvZGluZ0J5SW5kZXgoaSk7Ci0gICAgICAgIGZvcihzaXplX3QgaiA9IDA7IGogPCBlbmNvZGluZy0+R2V0RW5jcnlwdGlvbkNvdW50KCk7IGorKykgewotICAgICAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpDb250ZW50RW5jb2Rpbmc6OkNvbnRlbnRFbmNyeXB0aW9uICplbmNyeXB0aW9uOwotICAgICAgICAgICAgZW5jcnlwdGlvbiA9IGVuY29kaW5nLT5HZXRFbmNyeXB0aW9uQnlJbmRleChqKTsKLSAgICAgICAgICAgIHRyYWNrSW5mby0+bU1ldGEtPnNldERhdGEoa0tleUNyeXB0b0tleSwgMCwgZW5jcnlwdGlvbi0+a2V5X2lkLCBlbmNyeXB0aW9uLT5rZXlfaWRfbGVuKTsKLSAgICAgICAgICAgIHRyYWNrSW5mby0+bUVuY3J5cHRlZCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGZvcihzaXplX3QgaiA9IDA7IGogPCBlbmNvZGluZy0+R2V0Q29tcHJlc3Npb25Db3VudCgpOyBqKyspIHsKLSAgICAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6Q29udGVudEVuY29kaW5nOjpDb250ZW50Q29tcHJlc3Npb24gKmNvbXByZXNzaW9uOwotICAgICAgICAgICAgY29tcHJlc3Npb24gPSBlbmNvZGluZy0+R2V0Q29tcHJlc3Npb25CeUluZGV4KGopOwotICAgICAgICAgICAgQUxPR1YoImNvbXByZXNzaW9uIGFsZ28gJWxsdSBzZXR0aW5nc19sZW4gJWxsZCIsCi0gICAgICAgICAgICAgICAgY29tcHJlc3Npb24tPmFsZ28sIGNvbXByZXNzaW9uLT5zZXR0aW5nc19sZW4pOwotICAgICAgICAgICAgaWYgKGNvbXByZXNzaW9uLT5hbGdvID09IDMKLSAgICAgICAgICAgICAgICAgICAgJiYgY29tcHJlc3Npb24tPnNldHRpbmdzCi0gICAgICAgICAgICAgICAgICAgICYmIGNvbXByZXNzaW9uLT5zZXR0aW5nc19sZW4gPiAwKSB7Ci0gICAgICAgICAgICAgICAgdHJhY2tJbmZvLT5tSGVhZGVyID0gY29tcHJlc3Npb24tPnNldHRpbmdzOwotICAgICAgICAgICAgICAgIHRyYWNrSW5mby0+bUhlYWRlckxlbiA9IGNvbXByZXNzaW9uLT5zZXR0aW5nc19sZW47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgTWF0cm9za2FFeHRyYWN0b3I6OmFkZFRyYWNrcygpIHsKLSAgICBjb25zdCBta3ZwYXJzZXI6OlRyYWNrcyAqdHJhY2tzID0gbVNlZ21lbnQtPkdldFRyYWNrcygpOwotCi0gICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHRyYWNrcy0+R2V0VHJhY2tzQ291bnQoKTsgKytpbmRleCkgewotICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlRyYWNrICp0cmFjayA9IHRyYWNrcy0+R2V0VHJhY2tCeUluZGV4KGluZGV4KTsKLQotICAgICAgICBpZiAodHJhY2sgPT0gTlVMTCkgewotICAgICAgICAgICAgLy8gQXBwYXJlbnRseSB0aGlzIGlzIGN1cnJlbnRseSB2YWxpZCAoaWYgdW5leHBlY3RlZCkgYmVoYXZpb3VyCi0gICAgICAgICAgICAvLyBvZiB0aGUgbWt2IHBhcnNlciBsaWIuCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IGNoYXIgKmNvbnN0IGNvZGVjSUQgPSB0cmFjay0+R2V0Q29kZWNJZCgpOwotICAgICAgICBBTE9HVigiY29kZWMgaWQgPSAlcyIsIGNvZGVjSUQpOwotICAgICAgICBBTE9HVigiY29kZWMgbmFtZSA9ICVzIiwgdHJhY2stPkdldENvZGVjTmFtZUFzVVRGOCgpKTsKLQotICAgICAgICBpZiAoY29kZWNJRCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HVygidW5rbm93biBjb2RlY0lEIGlzIG5vdCBzdXBwb3J0ZWQuIik7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHNpemVfdCBjb2RlY1ByaXZhdGVTaXplOwotICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpjb2RlY1ByaXZhdGUgPQotICAgICAgICAgICAgdHJhY2stPkdldENvZGVjUHJpdmF0ZShjb2RlY1ByaXZhdGVTaXplKTsKLQotICAgICAgICBlbnVtIHsgVklERU9fVFJBQ0sgPSAxLCBBVURJT19UUkFDSyA9IDIgfTsKLQotICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKLQotICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLQotICAgICAgICBzd2l0Y2ggKHRyYWNrLT5HZXRUeXBlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgVklERU9fVFJBQ0s6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpWaWRlb1RyYWNrICp2dHJhY2sgPQotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBta3ZwYXJzZXI6OlZpZGVvVHJhY2sgKj4odHJhY2spOwotCi0gICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAoIlZfTVBFRzQvSVNPL0FWQyIsIGNvZGVjSUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOwotICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlBVkNDLCAwLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiVl9NUEVHNC9JU08vQVNQIiwgY29kZWNJRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVjUHJpdmF0ZVNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVTRFNGcm9tQ29kZWNQcml2YXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLCBmYWxzZSwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBpcyBkZXRlY3RlZCwgYnV0IGRvZXMgbm90IGhhdmUgY29uZmlndXJhdGlvbi4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY0lEKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJWX1ZQOCIsIGNvZGVjSUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19WUDgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiVl9WUDkiLCBjb2RlY0lEKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fVlA5KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVjUHJpdmF0ZVNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgLy8gJ2NzZC0wJyBmb3IgVlA5IGlzIHRoZSBCbG9iIG9mIENvZGVjIFByaXZhdGUgZGF0YSBhcwotICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpZmllZCBpbiBodHRwOi8vd3d3LndlYm1wcm9qZWN0Lm9yZy92cDkvcHJvZmlsZXMvLgotICAgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5VnA5Q29kZWNQcml2YXRlLCAwLCBjb2RlY1ByaXZhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY1ByaXZhdGVTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBpcyBub3Qgc3VwcG9ydGVkLiIsIGNvZGVjSUQpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjb25zdCBsb25nIGxvbmcgd2lkdGggPSB2dHJhY2stPkdldFdpZHRoKCk7Ci0gICAgICAgICAgICAgICAgY29uc3QgbG9uZyBsb25nIGhlaWdodCA9IHZ0cmFjay0+R2V0SGVpZ2h0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHdpZHRoIDw9IDAgfHwgd2lkdGggPiBJTlQzMl9NQVgpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coInRyYWNrIHdpZHRoIGV4Y2VlZHMgaW50MzJfdCwgJWxsZCIsIHdpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChoZWlnaHQgPD0gMCB8fCBoZWlnaHQgPiBJTlQzMl9NQVgpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coInRyYWNrIGhlaWdodCBleGNlZWRzIGludDMyX3QsICVsbGQiLCBoZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVdpZHRoLCAoaW50MzJfdCl3aWR0aCk7Ci0gICAgICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgKGludDMyX3QpaGVpZ2h0KTsKLQotICAgICAgICAgICAgICAgIC8vIHNldHRpbmcgZGlzcGxheSB3aWR0aC9oZWlnaHQgaXMgb3B0aW9uYWwKLSAgICAgICAgICAgICAgICBjb25zdCBsb25nIGxvbmcgZGlzcGxheVVuaXQgPSB2dHJhY2stPkdldERpc3BsYXlVbml0KCk7Ci0gICAgICAgICAgICAgICAgY29uc3QgbG9uZyBsb25nIGRpc3BsYXlXaWR0aCA9IHZ0cmFjay0+R2V0RGlzcGxheVdpZHRoKCk7Ci0gICAgICAgICAgICAgICAgY29uc3QgbG9uZyBsb25nIGRpc3BsYXlIZWlnaHQgPSB2dHJhY2stPkdldERpc3BsYXlIZWlnaHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoZGlzcGxheVdpZHRoID4gMCAmJiBkaXNwbGF5V2lkdGggPD0gSU5UMzJfTUFYCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBkaXNwbGF5SGVpZ2h0ID4gMCAmJiBkaXNwbGF5SGVpZ2h0IDw9IElOVDMyX01BWCkgewotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGRpc3BsYXlVbml0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogLy8gcGl4ZWxzCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5RGlzcGxheVdpZHRoLCAoaW50MzJfdClkaXNwbGF5V2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleURpc3BsYXlIZWlnaHQsIChpbnQzMl90KWRpc3BsYXlIZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMTogLy8gY2VudGltZXRlcnMKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiAvLyBpbmNoZXMKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiAvLyBhc3BlY3QgcmF0aW8KLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGh5c2ljYWwgbGF5b3V0IHNpemUgaXMgdHJlYXRlZCB0aGUgc2FtZSBhcyBhc3BlY3QgcmF0aW8uCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBkaXNwbGF5V2lkdGggYW5kIGRpc3BsYXlIZWlnaHQgYXJlIG5ldmVyIHplcm8gYXMgdGhleSBhcmUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrZWQgaW4gdGhlIGlmIGFib3ZlLgotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9uZyBsb25nIGNvbXB1dGVkV2lkdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1heCh3aWR0aCwgaGVpZ2h0ICogZGlzcGxheVdpZHRoIC8gZGlzcGxheUhlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb25nIGxvbmcgY29tcHV0ZWRIZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1heChoZWlnaHQsIHdpZHRoICogZGlzcGxheUhlaWdodCAvIGRpc3BsYXlXaWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcHV0ZWRXaWR0aCA8PSBJTlQzMl9NQVggJiYgY29tcHV0ZWRIZWlnaHQgPD0gSU5UMzJfTUFYKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleURpc3BsYXlXaWR0aCwgKGludDMyX3QpY29tcHV0ZWRXaWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleURpc3BsYXlIZWlnaHQsIChpbnQzMl90KWNvbXB1dGVkSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IC8vIHVua25vd24gZGlzcGxheSB1bml0cywgcGVyaGFwcyBmdXR1cmUgdmVyc2lvbiBvZiBzcGVjLgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBnZXRDb2xvckluZm9ybWF0aW9uKHZ0cmFjaywgbWV0YSk7Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSBBVURJT19UUkFDSzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb25zdCBta3ZwYXJzZXI6OkF1ZGlvVHJhY2sgKmF0cmFjayA9Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IG1rdnBhcnNlcjo6QXVkaW9UcmFjayAqPih0cmFjayk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcCgiQV9BQUMiLCBjb2RlY0lEKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKTsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0soY29kZWNQcml2YXRlU2l6ZSA+PSAyKTsKLQotICAgICAgICAgICAgICAgICAgICBhZGRFU0RTRnJvbUNvZGVjUHJpdmF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLCB0cnVlLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiQV9WT1JCSVMiLCBjb2RlY0lEKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTKTsKLQotICAgICAgICAgICAgICAgICAgICBlcnIgPSBhZGRWb3JiaXNDb2RlY0luZm8oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YSwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIkFfT1BVUyIsIGNvZGVjSUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTKTsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5T3B1c0hlYWRlciwgMCwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0SW50NjQoa0tleU9wdXNDb2RlY0RlbGF5LCB0cmFjay0+R2V0Q29kZWNEZWxheSgpKTsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0SW50NjQoa0tleU9wdXNTZWVrUHJlUm9sbCwgdHJhY2stPkdldFNlZWtQcmVSb2xsKCkpOwotICAgICAgICAgICAgICAgICAgICBtU2Vla1ByZVJvbGxOcyA9IHRyYWNrLT5HZXRTZWVrUHJlUm9sbCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiQV9NUEVHL0wzIiwgY29kZWNJRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiQV9GTEFDIiwgY29kZWNJRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMpOwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBhZGRGbGFjTWV0YWRhdGEobWV0YSwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMgaXMgbm90IHN1cHBvcnRlZC4iLCBjb2RlY0lEKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIGF0cmFjay0+R2V0U2FtcGxpbmdSYXRlKCkpOwotICAgICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIGF0cmFjay0+R2V0Q2hhbm5lbHMoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgic2tpcHBpbmcgdHJhY2ssIGNvZGVjIHNwZWNpZmljIGRhdGEgd2FzIG1hbGZvcm1lZC4iKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9uZyBsb25nIGR1cmF0aW9uTnMgPSBtU2VnbWVudC0+R2V0RHVyYXRpb24oKTsKLSAgICAgICAgbWV0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCAoZHVyYXRpb25OcyArIDUwMCkgLyAxMDAwKTsKLQotICAgICAgICBtVHJhY2tzLnB1c2goKTsKLSAgICAgICAgc2l6ZV90IG4gPSBtVHJhY2tzLnNpemUoKSAtIDE7Ci0gICAgICAgIFRyYWNrSW5mbyAqdHJhY2tJbmZvID0gJm1UcmFja3MuZWRpdEl0ZW1BdChuKTsKLSAgICAgICAgaW5pdFRyYWNrSW5mbyh0cmFjaywgbWV0YSwgdHJhY2tJbmZvKTsKLQotICAgICAgICBpZiAoIXN0cmNtcCgiVl9NUEVHNC9JU08vQVZDIiwgY29kZWNJRCkgJiYgY29kZWNQcml2YXRlU2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICAvLyBBdHRlbXB0IHRvIHJlY292ZXIgZnJvbSBBVkMgdHJhY2sgd2l0aG91dCBjb2RlYyBwcml2YXRlIGRhdGEKLSAgICAgICAgICAgIGVyciA9IHN5bnRoZXNpemVBVkNDKHRyYWNrSW5mbywgbik7Ci0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgbVRyYWNrcy5wb3AoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBNYXRyb3NrYUV4dHJhY3Rvcjo6ZmluZFRodW1ibmFpbHMoKSB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtVHJhY2tzLmVkaXRJdGVtQXQoaSk7Ci0KLSAgICAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICAgICAgQ0hFQ0soaW5mby0+bU1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKLQotICAgICAgICBpZiAoc3RybmNhc2VjbXAobWltZSwgInZpZGVvLyIsIDYpKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIEJsb2NrSXRlcmF0b3IgaXRlcih0aGlzLCBpbmZvLT5tVHJhY2tOdW0sIGkpOwotICAgICAgICBpbnQzMl90IGogPSAwOwotICAgICAgICBpbnQ2NF90IHRodW1ibmFpbFRpbWVVcyA9IDA7Ci0gICAgICAgIHNpemVfdCBtYXhCbG9ja1NpemUgPSAwOwotICAgICAgICB3aGlsZSAoIWl0ZXIuZW9zKCkgJiYgaiA8IDIwKSB7Ci0gICAgICAgICAgICBpZiAoaXRlci5ibG9jaygpLT5Jc0tleSgpKSB7Ci0gICAgICAgICAgICAgICAgKytqOwotCi0gICAgICAgICAgICAgICAgc2l6ZV90IGJsb2NrU2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBpdGVyLmJsb2NrKCktPkdldEZyYW1lQ291bnQoKTsgKytrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJsb2NrU2l6ZSArPSBpdGVyLmJsb2NrKCktPkdldEZyYW1lKGspLmxlbjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoYmxvY2tTaXplID4gbWF4QmxvY2tTaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1heEJsb2NrU2l6ZSA9IGJsb2NrU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgdGh1bWJuYWlsVGltZVVzID0gaXRlci5ibG9ja1RpbWVVcygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGl0ZXIuYWR2YW5jZSgpOwotICAgICAgICB9Ci0gICAgICAgIGluZm8tPm1NZXRhLT5zZXRJbnQ2NChrS2V5VGh1bWJuYWlsVGltZSwgdGh1bWJuYWlsVGltZVVzKTsKLSAgICB9Ci19Ci0KLXNwPE1ldGFEYXRhPiBNYXRyb3NrYUV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoKSB7Ci0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7Ci0KLSAgICBtZXRhLT5zZXRDU3RyaW5nKAotICAgICAgICAgICAga0tleU1JTUVUeXBlLAotICAgICAgICAgICAgbUlzV2VibSA/ICJ2aWRlby93ZWJtIiA6IE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NQVRST1NLQSk7Ci0KLSAgICByZXR1cm4gbWV0YTsKLX0KLQotdWludDMyX3QgTWF0cm9za2FFeHRyYWN0b3I6OmZsYWdzKCkgY29uc3QgewotICAgIHVpbnQzMl90IHggPSBDQU5fUEFVU0U7Ci0gICAgaWYgKCFpc0xpdmVTdHJlYW1pbmcoKSkgewotICAgICAgICB4IHw9IENBTl9TRUVLX0JBQ0tXQVJEIHwgQ0FOX1NFRUtfRk9SV0FSRCB8IENBTl9TRUVLOwotICAgIH0KLQotICAgIHJldHVybiB4OwotfQotCi1ib29sIFNuaWZmTWF0cm9za2EoCi0gICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSwKLSAgICAgICAgc3A8QU1lc3NhZ2U+ICopIHsKLSAgICBEYXRhU291cmNlUmVhZGVyIHJlYWRlcihzb3VyY2UpOwotICAgIG1rdnBhcnNlcjo6RUJNTEhlYWRlciBlYm1sSGVhZGVyOwotICAgIGxvbmcgbG9uZyBwb3M7Ci0gICAgaWYgKGVibWxIZWFkZXIuUGFyc2UoJnJlYWRlciwgcG9zKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIG1pbWVUeXBlLT5zZXRUbyhNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTUFUUk9TS0EpOwotICAgICpjb25maWRlbmNlID0gMC42OwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NYXRyb3NrYUV4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTWF0cm9za2FFeHRyYWN0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk3NzVjZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NYXRyb3NrYUV4dHJhY3Rvci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1BVFJPU0tBX0VYVFJBQ1RPUl9IXwotCi0jZGVmaW5lIE1BVFJPU0tBX0VYVFJBQ1RPUl9IXwotCi0jaW5jbHVkZSAibWt2cGFyc2VyL21rdnBhcnNlci5oIgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IEFNZXNzYWdlOwotY2xhc3MgU3RyaW5nODsKLQotY2xhc3MgTWV0YURhdGE7Ci1zdHJ1Y3QgRGF0YVNvdXJjZVJlYWRlcjsKLXN0cnVjdCBNYXRyb3NrYVNvdXJjZTsKLQotc3RydWN0IE1hdHJvc2thRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKLSAgICBleHBsaWNpdCBNYXRyb3NrYUV4dHJhY3Rvcihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKTsKLQotICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7Ci0KLSAgICB2aXJ0dWFsIHNwPElNZWRpYVNvdXJjZT4gZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKLQotICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKLQotICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldE1ldGFEYXRhKCk7Ci0KLSAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIk1hdHJvc2thRXh0cmFjdG9yIjsgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+TWF0cm9za2FFeHRyYWN0b3IoKTsKLQotcHJpdmF0ZToKLSAgICBmcmllbmQgc3RydWN0IE1hdHJvc2thU291cmNlOwotICAgIGZyaWVuZCBzdHJ1Y3QgQmxvY2tJdGVyYXRvcjsKLQotICAgIHN0cnVjdCBUcmFja0luZm8gewotICAgICAgICB1bnNpZ25lZCBsb25nIG1UcmFja051bTsKLSAgICAgICAgYm9vbCBtRW5jcnlwdGVkOwotICAgICAgICBzcDxNZXRhRGF0YT4gbU1ldGE7Ci0gICAgICAgIGNvbnN0IE1hdHJvc2thRXh0cmFjdG9yICptRXh0cmFjdG9yOwotICAgICAgICBWZWN0b3I8Y29uc3QgbWt2cGFyc2VyOjpDdWVQb2ludCo+IG1DdWVQb2ludHM7Ci0KLSAgICAgICAgLy8gbUhlYWRlciBwb2ludHMgdG8gbWVtb3J5IG1hbmFnZWQgYnkgbWt2cGFyc2VyOwotICAgICAgICAvLyBtSGVhZGVyIHdvdWxkIGJlIGRlbGV0ZWQgd2hlbiBtU2VnbWVudCBpcyBkZWxldGVkCi0gICAgICAgIC8vIGluIH5NYXRyb3NrYUV4dHJhY3Rvci4KLSAgICAgICAgdW5zaWduZWQgY2hhciAqbUhlYWRlcjsKLSAgICAgICAgc2l6ZV90IG1IZWFkZXJMZW47Ci0KLSAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpUcmFjayogZ2V0VHJhY2soKSBjb25zdDsKLSAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpDdWVQb2ludDo6VHJhY2tQb3NpdGlvbiAqZmluZChsb25nIGxvbmcgdGltZU5zKSBjb25zdDsKLSAgICB9OwotCi0gICAgTXV0ZXggbUxvY2s7Ci0gICAgVmVjdG9yPFRyYWNrSW5mbz4gbVRyYWNrczsKLQotICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOwotICAgIERhdGFTb3VyY2VSZWFkZXIgKm1SZWFkZXI7Ci0gICAgbWt2cGFyc2VyOjpTZWdtZW50ICptU2VnbWVudDsKLSAgICBib29sIG1FeHRyYWN0ZWRUaHVtYm5haWxzOwotICAgIGJvb2wgbUlzTGl2ZVN0cmVhbWluZzsKLSAgICBib29sIG1Jc1dlYm07Ci0gICAgaW50NjRfdCBtU2Vla1ByZVJvbGxOczsKLQotICAgIHN0YXR1c190IHN5bnRoZXNpemVBVkNDKFRyYWNrSW5mbyAqdHJhY2tJbmZvLCBzaXplX3QgaW5kZXgpOwotICAgIHN0YXR1c190IGluaXRUcmFja0luZm8oY29uc3QgbWt2cGFyc2VyOjpUcmFjayAqdHJhY2ssIGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSwgVHJhY2tJbmZvICp0cmFja0luZm8pOwotICAgIHZvaWQgYWRkVHJhY2tzKCk7Ci0gICAgdm9pZCBmaW5kVGh1bWJuYWlscygpOwotICAgIHZvaWQgZ2V0Q29sb3JJbmZvcm1hdGlvbihjb25zdCBta3ZwYXJzZXI6OlZpZGVvVHJhY2sgKnZ0cmFjaywgc3A8TWV0YURhdGE+ICZtZXRhKTsKLSAgICBib29sIGlzTGl2ZVN0cmVhbWluZygpIGNvbnN0OwotCi0gICAgTWF0cm9za2FFeHRyYWN0b3IoY29uc3QgTWF0cm9za2FFeHRyYWN0b3IgJik7Ci0gICAgTWF0cm9za2FFeHRyYWN0b3IgJm9wZXJhdG9yPShjb25zdCBNYXRyb3NrYUV4dHJhY3RvciAmKTsKLX07Ci0KLWJvb2wgU25pZmZNYXRyb3NrYSgKLSAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlLAotICAgICAgICBzcDxBTWVzc2FnZT4gKik7Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gTUFUUk9TS0FfRVhUUkFDVE9SX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5jcHAKaW5kZXggYTI1NmE0ZC4uNWNjNTA5MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmNwcApAQCAtMjEsMTkgKzIxLDI0IEBACiAjaW5jbHVkZSAiQW5vdGhlclBhY2tldFNvdXJjZS5oIgogI2luY2x1ZGUgIkNhc01hbmFnZXIuaCIKICNpbmNsdWRlICJFU1F1ZXVlLmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9hdmNfdXRpbHMuaCIKIAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FzL25hdGl2ZS8xLjAvSURlc2NyYW1ibGVyLmg+CisjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlIDxoaWRsbWVtb3J5L0ZyYW1ld29ya1V0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvY2FzL0Rlc2NyYW1ibGVyQVBJLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhS2V5cy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYXZjX3V0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvSVN0cmVhbVNvdXJjZS5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CkBAIC00MSwxMCArNDYsMTAgQEAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci11c2luZyBoYXJkd2FyZTo6aGlkbF9oYW5kbGU7Ci11c2luZyBoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Cit1c2luZyBoYXJkd2FyZTo6ZnJvbUhlYXA7CiB1c2luZyBoYXJkd2FyZTo6aGlkbF9zdHJpbmc7CiB1c2luZyBoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyBoYXJkd2FyZTo6SGlkbE1lbW9yeTsKIHVzaW5nIG5hbWVzcGFjZSBoYXJkd2FyZTo6Y2FzOjpWMV8wOwogdXNpbmcgbmFtZXNwYWNlIGhhcmR3YXJlOjpjYXM6Om5hdGl2ZTo6VjFfMDsKIApAQCAtNzYsNyArODEsNyBAQAogCiAgICAgdm9pZCBzaWduYWxFT1Moc3RhdHVzX3QgZmluYWxSZXN1bHQpOwogCi0gICAgc3A8TWVkaWFTb3VyY2U+IGdldFNvdXJjZShTb3VyY2VUeXBlIHR5cGUpOworICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IGdldFNvdXJjZShTb3VyY2VUeXBlIHR5cGUpOwogICAgIGJvb2wgaGFzU291cmNlKFNvdXJjZVR5cGUgdHlwZSkgY29uc3Q7CiAKICAgICBpbnQ2NF90IGNvbnZlcnRQVFNUb1RpbWVzdGFtcCh1aW50NjRfdCBQVFMpOwpAQCAtMTY5LDcgKzE3NCw3IEBACiAgICAgdm9pZCBzaWduYWxFT1Moc3RhdHVzX3QgZmluYWxSZXN1bHQpOwogCiAgICAgU291cmNlVHlwZSBnZXRTb3VyY2VUeXBlKCk7Ci0gICAgc3A8TWVkaWFTb3VyY2U+IGdldFNvdXJjZShTb3VyY2VUeXBlIHR5cGUpOworICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IGdldFNvdXJjZShTb3VyY2VUeXBlIHR5cGUpOwogCiAgICAgYm9vbCBpc0F1ZGlvKCkgY29uc3Q7CiAgICAgYm9vbCBpc1ZpZGVvKCkgY29uc3Q7CkBAIC0yMDcsNiArMjEyLDcgQEAKICAgICBzcDxBTWVzc2FnZT4gbVNhbXBsZUFlc0tleUl0ZW07CiAgICAgc3A8SU1lbW9yeT4gbU1lbTsKICAgICBzcDxNZW1vcnlEZWFsZXI+IG1EZWFsZXI7CisgICAgc3A8SGlkbE1lbW9yeT4gbUhpZGxNZW1vcnk7CiAgICAgaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOjpTaGFyZWRCdWZmZXIgbURlc2NyYW1ibGVyU3JjQnVmZmVyOwogICAgIHNwPEFCdWZmZXI+IG1EZXNjcmFtYmxlZEJ1ZmZlcjsKICAgICBMaXN0PFN1YlNhbXBsZUluZm8+IG1TdWJTYW1wbGVzOwpAQCAtMjczLDcgKzI3OSw3IEBACiBBVFNQYXJzZXI6OlN5bmNFdmVudDo6U3luY0V2ZW50KG9mZjY0X3Qgb2Zmc2V0KQogICAgIDogbUhhc1JldHVybmVkRGF0YShmYWxzZSksIG1PZmZzZXQob2Zmc2V0KSwgbVRpbWVVcygwKSB7fQogCi12b2lkIEFUU1BhcnNlcjo6U3luY0V2ZW50Ojppbml0KG9mZjY0X3Qgb2Zmc2V0LCBjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSwKK3ZvaWQgQVRTUGFyc2VyOjpTeW5jRXZlbnQ6OmluaXQob2ZmNjRfdCBvZmZzZXQsIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZzb3VyY2UsCiAgICAgICAgIGludDY0X3QgdGltZVVzLCBTb3VyY2VUeXBlIHR5cGUpIHsKICAgICBtSGFzUmV0dXJuZWREYXRhID0gdHJ1ZTsKICAgICBtT2Zmc2V0ID0gb2Zmc2V0OwpAQCAtMzQxLDcgKzM0Nyw3IEBACiAgICAgaWYgKCh0eXBlICYgRElTQ09OVElOVUlUWV9USU1FKQogICAgICAgICAgICAgJiYgZXh0cmEgIT0gTlVMTAogICAgICAgICAgICAgJiYgZXh0cmEtPmZpbmRJbnQ2NCgKLSAgICAgICAgICAgICAgICBJU3RyZWFtTGlzdGVuZXI6OmtLZXlNZWRpYVRpbWVVcywgJm1lZGlhVGltZVVzKSkgeworICAgICAgICAgICAgICAgIGtBVFNQYXJzZXJLZXlNZWRpYVRpbWVVcywgJm1lZGlhVGltZVVzKSkgewogICAgICAgICBtRmlyc3RQVFNWYWxpZCA9IGZhbHNlOwogICAgIH0KIApAQCAtNjQwLDkgKzY0Niw5IEBACiAgICAgcmV0dXJuIG1MYXN0UmVjb3ZlcmVkUFRTOwogfQogCi1zcDxNZWRpYVNvdXJjZT4gQVRTUGFyc2VyOjpQcm9ncmFtOjpnZXRTb3VyY2UoU291cmNlVHlwZSB0eXBlKSB7CitzcDxBbm90aGVyUGFja2V0U291cmNlPiBBVFNQYXJzZXI6OlByb2dyYW06OmdldFNvdXJjZShTb3VyY2VUeXBlIHR5cGUpIHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TdHJlYW1zLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIHNwPE1lZGlhU291cmNlPiBzb3VyY2UgPSBtU3RyZWFtcy5lZGl0VmFsdWVBdChpKS0+Z2V0U291cmNlKHR5cGUpOworICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBzb3VyY2UgPSBtU3RyZWFtcy5lZGl0VmFsdWVBdChpKS0+Z2V0U291cmNlKHR5cGUpOwogICAgICAgICBpZiAoc291cmNlICE9IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBzb3VyY2U7CiAgICAgICAgIH0KQEAgLTg0OSwxNCArODU1LDkgQEAKICAgICAgICAgaWYgKGhlYXAgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0gICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogbmF0aXZlSGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7Ci0gICAgICAgIGlmICghbmF0aXZlSGFuZGxlKSB7Ci0gICAgICAgICAgICBBTE9HRSgiW3N0cmVhbSAlZF0gZmFpbGVkIHRvIGNyZWF0ZSBuYXRpdmUgaGFuZGxlIiwgbUVsZW1lbnRhcnlQSUQpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIG5hdGl2ZUhhbmRsZS0+ZGF0YVswXSA9IGhlYXAtPmdldEhlYXBJRCgpOwotICAgICAgICBtRGVzY3JhbWJsZXJTcmNCdWZmZXIuaGVhcEJhc2UgPSBoaWRsX21lbW9yeSgiYXNobWVtIiwKLSAgICAgICAgICAgICAgICBoaWRsX2hhbmRsZShuYXRpdmVIYW5kbGUpLCBoZWFwLT5nZXRTaXplKCkpOworCisgICAgICAgIG1IaWRsTWVtb3J5ID0gZnJvbUhlYXAoaGVhcCk7CisgICAgICAgIG1EZXNjcmFtYmxlclNyY0J1ZmZlci5oZWFwQmFzZSA9ICptSGlkbE1lbW9yeTsKICAgICAgICAgbURlc2NyYW1ibGVyU3JjQnVmZmVyLm9mZnNldCA9ICh1aW50NjRfdCkgb2Zmc2V0OwogICAgICAgICBtRGVzY3JhbWJsZXJTcmNCdWZmZXIuc2l6ZSA9ICh1aW50NjRfdCkgc2l6ZTsKIApAQCAtMTAzMiw3ICsxMDMzLDcgQEAKICAgICAgICAgdWludDY0X3QgcmVzdW1lQXRQVFM7CiAgICAgICAgIGlmIChleHRyYSAhPSBOVUxMCiAgICAgICAgICAgICAgICAgJiYgZXh0cmEtPmZpbmRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAgSVN0cmVhbUxpc3RlbmVyOjprS2V5UmVzdW1lQXRQVFMsCisgICAgICAgICAgICAgICAgICAgIGtBVFNQYXJzZXJLZXlSZXN1bWVBdFBUUywKICAgICAgICAgICAgICAgICAgICAgKGludDY0X3QgKikmcmVzdW1lQXRQVFMpKSB7CiAgICAgICAgICAgICBpbnQ2NF90IHJlc3VtZUF0TWVkaWFUaW1lVXMgPQogICAgICAgICAgICAgICAgIG1Qcm9ncmFtLT5jb252ZXJ0UFRTVG9UaW1lc3RhbXAocmVzdW1lQXRQVFMpOwpAQCAtMTM4Nyw2ICsxMzg4LDkgQEAKIAogICAgIHVpbnQzMl90IHNjdHJsID0gdHNTY3JhbWJsaW5nQ29udHJvbCAhPSAwID8KICAgICAgICAgICAgIHRzU2NyYW1ibGluZ0NvbnRyb2wgOiBwZXNTY3JhbWJsaW5nQ29udHJvbDsKKyAgICBpZiAobVF1ZXVlLT5pc1NjcmFtYmxlZCgpKSB7CisgICAgICAgIHNjdHJsIHw9IERlc2NyYW1ibGVyUGx1Z2luOjprU2NyYW1ibGluZ19GbGFnX1Blc0hlYWRlcjsKKyAgICB9CiAKICAgICAvLyBQZXJmb3JtIHRoZSAxc3QgcGFzcyBkZXNjcmFtYmxpbmcgaWYgbmVlZGVkCiAgICAgaWYgKGRlc2NyYW1ibGVCeXRlcyA+IDApIHsKQEAgLTE2MDYsNyArMTYxMCw3IEBACiAgICAgcmV0dXJuIE5VTV9TT1VSQ0VfVFlQRVM7CiB9CiAKLXNwPE1lZGlhU291cmNlPiBBVFNQYXJzZXI6OlN0cmVhbTo6Z2V0U291cmNlKFNvdXJjZVR5cGUgdHlwZSkgeworc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gQVRTUGFyc2VyOjpTdHJlYW06OmdldFNvdXJjZShTb3VyY2VUeXBlIHR5cGUpIHsKICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgICAgY2FzZSBWSURFTzoKICAgICAgICAgewpAQCAtMTY5NCwxMiArMTY5OCwxMiBAQAogICAgICAgICBEaXNjb250aW51aXR5VHlwZSB0eXBlLCBjb25zdCBzcDxBTWVzc2FnZT4gJmV4dHJhKSB7CiAgICAgaW50NjRfdCBtZWRpYVRpbWVVczsKICAgICBpZiAoKHR5cGUgJiBESVNDT05USU5VSVRZX1RJTUUpICYmIGV4dHJhICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKGV4dHJhLT5maW5kSW50NjQoSVN0cmVhbUxpc3RlbmVyOjprS2V5TWVkaWFUaW1lVXMsICZtZWRpYVRpbWVVcykpIHsKKyAgICAgICAgaWYgKGV4dHJhLT5maW5kSW50NjQoa0FUU1BhcnNlcktleU1lZGlhVGltZVVzLCAmbWVkaWFUaW1lVXMpKSB7CiAgICAgICAgICAgICBtQWJzb2x1dGVUaW1lQW5jaG9yVXMgPSBtZWRpYVRpbWVVczsKICAgICAgICAgfQogICAgICAgICBpZiAoKG1GbGFncyAmIFRTX1RJTUVTVEFNUFNfQVJFX0FCU09MVVRFKQogICAgICAgICAgICAgICAgICYmIGV4dHJhLT5maW5kSW50NjQoCi0gICAgICAgICAgICAgICAgICAgIElTdHJlYW1MaXN0ZW5lcjo6a0tleVJlY2VudE1lZGlhVGltZVVzLCAmbWVkaWFUaW1lVXMpKSB7CisgICAgICAgICAgICAgICAgICAgIGtBVFNQYXJzZXJLZXlSZWNlbnRNZWRpYVRpbWVVcywgJm1lZGlhVGltZVVzKSkgewogICAgICAgICAgICAgaWYgKG1BYnNvbHV0ZVRpbWVBbmNob3JVcyA+PSAwbGwpIHsKICAgICAgICAgICAgICAgICBtZWRpYVRpbWVVcyAtPSBtQWJzb2x1dGVUaW1lQW5jaG9yVXM7CiAgICAgICAgICAgICB9CkBAIC0yMDQxLDExICsyMDQ1LDExIEBACiAgICAgcmV0dXJuIGVycjsKIH0KIAotc3A8TWVkaWFTb3VyY2U+IEFUU1BhcnNlcjo6Z2V0U291cmNlKFNvdXJjZVR5cGUgdHlwZSkgewotICAgIHNwPE1lZGlhU291cmNlPiBmaXJzdFNvdXJjZUZvdW5kOworc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gQVRTUGFyc2VyOjpnZXRTb3VyY2UoU291cmNlVHlwZSB0eXBlKSB7CisgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gZmlyc3RTb3VyY2VGb3VuZDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Qcm9ncmFtcy5zaXplKCk7ICsraSkgewogICAgICAgICBjb25zdCBzcDxQcm9ncmFtPiAmcHJvZ3JhbSA9IG1Qcm9ncmFtcy5lZGl0SXRlbUF0KGkpOwotICAgICAgICBzcDxNZWRpYVNvdXJjZT4gc291cmNlID0gcHJvZ3JhbS0+Z2V0U291cmNlKHR5cGUpOworICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBzb3VyY2UgPSBwcm9ncmFtLT5nZXRTb3VyY2UodHlwZSk7CiAgICAgICAgIGlmIChzb3VyY2UgPT0gTlVMTCkgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5oCmluZGV4IDQxYzE5Y2QuLjQ1Y2EwNmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaApAQCAtMjAsOSArMjAsOSBAQAogCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KQEAgLTgxLDEzICs4MSwxMyBAQAogICAgIHN0cnVjdCBTeW5jRXZlbnQgewogICAgICAgICBleHBsaWNpdCBTeW5jRXZlbnQob2ZmNjRfdCBvZmZzZXQpOwogCi0gICAgICAgIHZvaWQgaW5pdChvZmY2NF90IG9mZnNldCwgY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UsCisgICAgICAgIHZvaWQgaW5pdChvZmY2NF90IG9mZnNldCwgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJnNvdXJjZSwKICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVcywgU291cmNlVHlwZSB0eXBlKTsKIAogICAgICAgICBib29sIGhhc1JldHVybmVkRGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1IYXNSZXR1cm5lZERhdGE7IH0KICAgICAgICAgdm9pZCByZXNldCgpOwogICAgICAgICBvZmY2NF90IGdldE9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIG1PZmZzZXQ7IH0KLSAgICAgICAgY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZnZXRNZWRpYVNvdXJjZSgpIGNvbnN0IHsgcmV0dXJuIG1NZWRpYVNvdXJjZTsgfQorICAgICAgICBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmZ2V0TWVkaWFTb3VyY2UoKSBjb25zdCB7IHJldHVybiBtTWVkaWFTb3VyY2U7IH0KICAgICAgICAgaW50NjRfdCBnZXRUaW1lVXMoKSBjb25zdCB7IHJldHVybiBtVGltZVVzOyB9CiAgICAgICAgIFNvdXJjZVR5cGUgZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1UeXBlOyB9CiAKQEAgLTEwMCw3ICsxMDAsNyBAQAogICAgICAgICAgKi8KICAgICAgICAgb2ZmNjRfdCBtT2Zmc2V0OwogICAgICAgICAvKiBUaGUgbWVkaWEgc291cmNlIG9iamVjdCBmb3IgdGhpcyBldmVudC4gKi8KLSAgICAgICAgc3A8TWVkaWFTb3VyY2U+IG1NZWRpYVNvdXJjZTsKKyAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gbU1lZGlhU291cmNlOwogICAgICAgICAvKiBUaGUgdGltZXN0YW1wIG9mIHRoZSBzeW5jIGZyYW1lLiAqLwogICAgICAgICBpbnQ2NF90IG1UaW1lVXM7CiAgICAgICAgIFNvdXJjZVR5cGUgbVR5cGU7CkBAIC0xMjYsNyArMTI2LDcgQEAKIAogICAgIHZvaWQgc2lnbmFsRU9TKHN0YXR1c190IGZpbmFsUmVzdWx0KTsKIAotICAgIHNwPE1lZGlhU291cmNlPiBnZXRTb3VyY2UoU291cmNlVHlwZSB0eXBlKTsKKyAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBnZXRTb3VyY2UoU291cmNlVHlwZSB0eXBlKTsKICAgICBib29sIGhhc1NvdXJjZShTb3VyY2VUeXBlIHR5cGUpIGNvbnN0OwogCiAgICAgYm9vbCBQVFNUaW1lRGVsdGFFc3RhYmxpc2hlZCgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLmJwCmluZGV4IDIxMjU5YzQuLmZiZjE0OTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQuYnAKQEAgLTEsNSArMSw1IEBACiBjY19saWJyYXJ5X3N0YXRpYyB7Ci0gICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X21wZWcydHMiLAorICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9tcGVnMnN1cHBvcnQiLAogCiAgICAgc3JjczogWwogICAgICAgICAiQW5vdGhlclBhY2tldFNvdXJjZS5jcHAiLApAQCAtNyw4ICs3LDYgQEAKICAgICAgICAgIkNhc01hbmFnZXIuY3BwIiwKICAgICAgICAgIkVTUXVldWUuY3BwIiwKICAgICAgICAgIkhsc1NhbXBsZURlY3J5cHRvci5jcHAiLAotICAgICAgICAiTVBFRzJQU0V4dHJhY3Rvci5jcHAiLAotICAgICAgICAiTVBFRzJUU0V4dHJhY3Rvci5jcHAiLAogICAgIF0sCiAKICAgICBpbmNsdWRlX2RpcnM6IFsKQEAgLTM1LDggKzMzLDEyIEBACiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmNyeXB0byIsCiAgICAgICAgICJsaWJtZWRpYSIsCi0gICAgICAgICJsaWJoaWRsbWVtb3J5IiwKKyAgICAgICAgImxpYmhpZGxhbGxvY2F0b3J1dGlscyIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhcy5uYXRpdmVAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wIiwKICAgICBdLAorCisgICAgd2hvbGVfc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21ldGFkYXRhdXRpbHMiLAorICAgIF0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmNwcAppbmRleCA0MzNiMWZjLi5lY2UwNjkyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5jcHAKQEAgLTE5LDEzICsxOSwxMiBAQAogCiAjaW5jbHVkZSAiQW5vdGhlclBhY2tldFNvdXJjZS5oIgogCi0jaW5jbHVkZSAiaW5jbHVkZS9hdmNfdXRpbHMuaCIKLQogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYXZjX3V0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgpAQCAtMTY0LDcgKzE2Myw3IEBACiB9CiAKIHN0YXR1c190IEFub3RoZXJQYWNrZXRTb3VyY2U6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqKSB7CisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKikgewogICAgICpvdXQgPSBOVUxMOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKQEAgLTIwMywyNCArMjAyLDI0IEBACiAgICAgICAgICAgICBzZWcubU1heERlcXVlVGltZVVzID0gdGltZVVzOwogICAgICAgICB9CiAKLSAgICAgICAgTWVkaWFCdWZmZXIgKm1lZGlhQnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKGJ1ZmZlcik7Ci0gICAgICAgIHNwPE1ldGFEYXRhPiBidWZtZXRhID0gbWVkaWFCdWZmZXItPm1ldGFfZGF0YSgpOworICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKm1lZGlhQnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKGJ1ZmZlcik7CisgICAgICAgIE1ldGFEYXRhQmFzZSAmYnVmbWV0YSA9IG1lZGlhQnVmZmVyLT5tZXRhX2RhdGEoKTsKIAotICAgICAgICBidWZtZXRhLT5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKKyAgICAgICAgYnVmbWV0YS5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKIAogICAgICAgICBpbnQzMl90IGlzU3luYzsKICAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImlzU3luYyIsICZpc1N5bmMpKSB7Ci0gICAgICAgICAgICBidWZtZXRhLT5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIGlzU3luYyk7CisgICAgICAgICAgICBidWZtZXRhLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgaXNTeW5jKTsKICAgICAgICAgfQogCiAgICAgICAgIHNwPEFCdWZmZXI+IHNlaTsKICAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kQnVmZmVyKCJzZWkiLCAmc2VpKSAmJiBzZWkgIT0gTlVMTCkgewotICAgICAgICAgICAgYnVmbWV0YS0+c2V0RGF0YShrS2V5U0VJLCAwLCBzZWktPmRhdGEoKSwgc2VpLT5zaXplKCkpOworICAgICAgICAgICAgYnVmbWV0YS5zZXREYXRhKGtLZXlTRUksIDAsIHNlaS0+ZGF0YSgpLCBzZWktPnNpemUoKSk7CiAgICAgICAgIH0KIAogICAgICAgICBzcDxBQnVmZmVyPiBtcGVnVXNlckRhdGE7Ci0gICAgICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEJ1ZmZlcigibXBlZ1VzZXJEYXRhIiwgJm1wZWdVc2VyRGF0YSkgJiYgbXBlZ1VzZXJEYXRhICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGJ1Zm1ldGEtPnNldERhdGEoCisgICAgICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEJ1ZmZlcigibXBlZy11c2VyLWRhdGEiLCAmbXBlZ1VzZXJEYXRhKSAmJiBtcGVnVXNlckRhdGEgIT0gTlVMTCkgeworICAgICAgICAgICAgYnVmbWV0YS5zZXREYXRhKAogICAgICAgICAgICAgICAgICAgICBrS2V5TXBlZ1VzZXJEYXRhLCAwLCBtcGVnVXNlckRhdGEtPmRhdGEoKSwgbXBlZ1VzZXJEYXRhLT5zaXplKCkpOwogICAgICAgICB9CiAKQEAgLTIzNSwxOCArMjM0LDE4IEBACiAgICAgICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEJ1ZmZlcigiZW5jQnl0ZXMiLCAmZW5jQnl0ZXNCdWZmZXIpCiAgICAgICAgICAgICAgICAgICAgICYmIGVuY0J5dGVzQnVmZmVyICE9IE5VTEwpOwogCi0gICAgICAgICAgICBidWZtZXRhLT5zZXRJbnQzMihrS2V5Q3J5cHRvTW9kZSwgY3J5cHRvTW9kZSk7CisgICAgICAgICAgICBidWZtZXRhLnNldEludDMyKGtLZXlDcnlwdG9Nb2RlLCBjcnlwdG9Nb2RlKTsKIAogICAgICAgICAgICAgdWludDhfdCBhcnJheVsxNl0gPSB7MH07Ci0gICAgICAgICAgICBidWZtZXRhLT5zZXREYXRhKGtLZXlDcnlwdG9JViwgMCwgYXJyYXksIDE2KTsKKyAgICAgICAgICAgIGJ1Zm1ldGEuc2V0RGF0YShrS2V5Q3J5cHRvSVYsIDAsIGFycmF5LCAxNik7CiAKICAgICAgICAgICAgIGFycmF5WzBdID0gKHVpbnQ4X3QpIChjcnlwdG9LZXkgJiAweGZmKTsKLSAgICAgICAgICAgIGJ1Zm1ldGEtPnNldERhdGEoa0tleUNyeXB0b0tleSwgMCwgYXJyYXksIDE2KTsKKyAgICAgICAgICAgIGJ1Zm1ldGEuc2V0RGF0YShrS2V5Q3J5cHRvS2V5LCAwLCBhcnJheSwgMTYpOwogCi0gICAgICAgICAgICBidWZtZXRhLT5zZXREYXRhKGtLZXlQbGFpblNpemVzLCAwLAorICAgICAgICAgICAgYnVmbWV0YS5zZXREYXRhKGtLZXlQbGFpblNpemVzLCAwLAogICAgICAgICAgICAgICAgICAgICBjbGVhckJ5dGVzQnVmZmVyLT5kYXRhKCksIGNsZWFyQnl0ZXNCdWZmZXItPnNpemUoKSk7CiAKLSAgICAgICAgICAgIGJ1Zm1ldGEtPnNldERhdGEoa0tleUVuY3J5cHRlZFNpemVzLCAwLAorICAgICAgICAgICAgYnVmbWV0YS5zZXREYXRhKGtLZXlFbmNyeXB0ZWRTaXplcywgMCwKICAgICAgICAgICAgICAgICAgICAgZW5jQnl0ZXNCdWZmZXItPmRhdGEoKSwgZW5jQnl0ZXNCdWZmZXItPnNpemUoKSk7CiAgICAgICAgIH0KIApAQCAtNjYzLDcgKzY2Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGlmIChpc0F2YyAmJiAhSXNJRFIoYnVmZmVyKSkgeworICAgICAgICBpZiAoaXNBdmMgJiYgIUlzSURSKGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSkpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmgKaW5kZXggYjA4OTBkNy4uZjRhNmFjYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmgKQEAgLTE4LDggKzE4LDggQEAKIAogI2RlZmluZSBBTk9USEVSX1BBQ0tFVF9TT1VSQ0VfSF8KIAorI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KIApAQCAtMzksNyArMzksNyBAQAogICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CiAKICAgICB2b2lkIGNsZWFyKCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuY3BwCmluZGV4IDExZjNlZDEuLjBmYTlmY2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmNwcApAQCAtMjQsMTUgKzI0LDE1IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9hdmNfdXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvY2FzL0Rlc2NyYW1ibGVyQVBJLmg+CiAjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvQ3J5cHRvQVBJLmg+CiAKLSNpbmNsdWRlICJpbmNsdWRlL2F2Y191dGlscy5oIgotCiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiAKQEAgLTYzMyw3ICs2MzMsMTAgQEAKICAgICAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgbUJ1ZmZlci0+c2l6ZSgpIC0gaW5mby5tTGVuZ3RoKTsKIAogICAgICAgICBpZiAobUZvcm1hdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBtRm9ybWF0ID0gTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKGFjY2Vzc1VuaXQpOworICAgICAgICAgICAgbUZvcm1hdCA9IG5ldyBNZXRhRGF0YTsKKyAgICAgICAgICAgIGlmICghTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKCptRm9ybWF0LCBhY2Nlc3NVbml0LT5kYXRhKCksIGFjY2Vzc1VuaXQtPnNpemUoKSkpIHsKKyAgICAgICAgICAgICAgICBtRm9ybWF0LmNsZWFyKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gYWNjZXNzVW5pdDsKQEAgLTg2Miw3ICs4NjUsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgYml0cy5za2lwQml0cygyKTsgIC8vIG9yaWdpbmFsX2NvcHksIGhvbWUKIAotICAgICAgICAgICAgbUZvcm1hdCA9IE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YSgKKyAgICAgICAgICAgIG1Gb3JtYXQgPSBuZXcgTWV0YURhdGE7CisgICAgICAgICAgICBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoKm1Gb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUsIHNhbXBsaW5nX2ZyZXFfaW5kZXgsIGNoYW5uZWxfY29uZmlndXJhdGlvbik7CiAKICAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlJc0FEVFMsIHRydWUpOwpAQCAtMTAwNSw5ICsxMDA5LDkgQEAKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAgICAgICAgIGlmIChtRm9ybWF0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIG1Gb3JtYXQgPSBNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEobUJ1ZmZlcik7Ci0gICAgICAgICAgICBpZiAobUZvcm1hdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0koIkNyZWF0aW5nIGR1bW15IEFWQyBmb3JtYXQgZm9yIHNjcmFtYmxlZCBjb250ZW50Iik7CisgICAgICAgICAgICBtRm9ybWF0ID0gbmV3IE1ldGFEYXRhOworICAgICAgICAgICAgaWYgKCFNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoKm1Gb3JtYXQsIG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+c2l6ZSgpKSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJDcmVhdGluZyBkdW1teSBBVkMgZm9ybWF0IGZvciBzY3JhbWJsZWQgY29udGVudCIpOwogICAgICAgICAgICAgICAgIG1Gb3JtYXQgPSBuZXcgTWV0YURhdGE7CiAgICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CiAgICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleVdpZHRoLCAxMjgwKTsKQEAgLTExNjcsNyArMTE3MSwxMiBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobUZvcm1hdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbUZvcm1hdCA9IE1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YShhY2Nlc3NVbml0KTsKKyAgICAgICAgICAgICAgICBtRm9ybWF0ID0gbmV3IE1ldGFEYXRhOworICAgICAgICAgICAgICAgIGlmICghTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKCptRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzVW5pdC0+ZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzVW5pdC0+c2l6ZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBtRm9ybWF0LmNsZWFyKCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobVNhbXBsZURlY3J5cHRvciAhPSBOVUxMICYmIHNocnVua0J5dGVzID4gMCkgewpAQCAtMTQ2OCw3ICsxNDc3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZWdVc2VyRGF0YS0+ZGF0YSgpICsgaSAqIHNpemVvZihzaXplX3QpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVzZXJEYXRhUG9zaXRpb25zW2ldLCBzaXplb2Yoc2l6ZV90KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEJ1ZmZlcigibXBlZ1VzZXJEYXRhIiwgbXBlZ1VzZXJEYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0QnVmZmVyKCJtcGVnLXVzZXItZGF0YSIsIG1wZWdVc2VyRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvTVBFRzJQU0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL01QRUcyUFNFeHRyYWN0b3IuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzhhNWYwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvTVBFRzJQU0V4dHJhY3Rvci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiTVBFRzJQU0V4dHJhY3RvciIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgImluY2x1ZGUvTVBFRzJQU0V4dHJhY3Rvci5oIgotCi0jaW5jbHVkZSAiQW5vdGhlclBhY2tldFNvdXJjZS5oIgotI2luY2x1ZGUgIkVTUXVldWUuaCIKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrIDogcHVibGljIE1lZGlhU291cmNlIHsKLSAgICBUcmFjayhNUEVHMlBTRXh0cmFjdG9yICpleHRyYWN0b3IsCi0gICAgICAgICAgdW5zaWduZWQgc3RyZWFtX2lkLCB1bnNpZ25lZCBzdHJlYW1fdHlwZSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgflRyYWNrKCk7Ci0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIHN0cnVjdCBNUEVHMlBTRXh0cmFjdG9yOwotCi0gICAgTVBFRzJQU0V4dHJhY3RvciAqbUV4dHJhY3RvcjsKLQotICAgIHVuc2lnbmVkIG1TdHJlYW1JRDsKLSAgICB1bnNpZ25lZCBtU3RyZWFtVHlwZTsKLSAgICBFbGVtZW50YXJ5U3RyZWFtUXVldWUgKm1RdWV1ZTsKLSAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBtU291cmNlOwotCi0gICAgc3RhdHVzX3QgYXBwZW5kUEVTRGF0YSgKLSAgICAgICAgICAgIHVuc2lnbmVkIFBUU19EVFNfZmxhZ3MsCi0gICAgICAgICAgICB1aW50NjRfdCBQVFMsIHVpbnQ2NF90IERUUywKLSAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFRyYWNrKTsKLX07Ci0KLXN0cnVjdCBNUEVHMlBTRXh0cmFjdG9yOjpXcmFwcGVkVHJhY2sgOiBwdWJsaWMgTWVkaWFTb3VyY2UgewotICAgIFdyYXBwZWRUcmFjayhjb25zdCBzcDxNUEVHMlBTRXh0cmFjdG9yPiAmZXh0cmFjdG9yLCBjb25zdCBzcDxUcmFjaz4gJnRyYWNrKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+V3JhcHBlZFRyYWNrKCk7Ci0KLXByaXZhdGU6Ci0gICAgc3A8TVBFRzJQU0V4dHJhY3Rvcj4gbUV4dHJhY3RvcjsKLSAgICBzcDxNUEVHMlBTRXh0cmFjdG9yOjpUcmFjaz4gbVRyYWNrOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoV3JhcHBlZFRyYWNrKTsKLX07Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLU1QRUcyUFNFeHRyYWN0b3I6Ok1QRUcyUFNFeHRyYWN0b3IoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSkKLSAgICA6IG1EYXRhU291cmNlKHNvdXJjZSksCi0gICAgICBtT2Zmc2V0KDApLAotICAgICAgbUZpbmFsUmVzdWx0KE9LKSwKLSAgICAgIG1CdWZmZXIobmV3IEFCdWZmZXIoMCkpLAotICAgICAgbVNjYW5uaW5nKHRydWUpLAotICAgICAgbVByb2dyYW1TdHJlYW1NYXBWYWxpZChmYWxzZSkgewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgNTAwOyArK2kpIHsKLSAgICAgICAgaWYgKGZlZWRNb3JlKCkgIT0gT0spIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gUmVtb3ZlIGFsbCB0cmFja3MgdGhhdCB3ZXJlIHVuYWJsZSB0byBkZXRlcm1pbmUgdGhlaXIgZm9ybWF0LgotICAgIGZvciAoc2l6ZV90IGkgPSBtVHJhY2tzLnNpemUoKTsgaSA+IDA7KSB7Ci0gICAgICAgIGktLTsKLSAgICAgICAgaWYgKG1UcmFja3MudmFsdWVBdChpKS0+Z2V0Rm9ybWF0KCkgPT0gTlVMTCkgewotICAgICAgICAgICAgbVRyYWNrcy5yZW1vdmVJdGVtc0F0KGkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgbVNjYW5uaW5nID0gZmFsc2U7Ci19Ci0KLU1QRUcyUFNFeHRyYWN0b3I6On5NUEVHMlBTRXh0cmFjdG9yKCkgewotfQotCi1zaXplX3QgTVBFRzJQU0V4dHJhY3Rvcjo6Y291bnRUcmFja3MoKSB7Ci0gICAgcmV0dXJuIG1UcmFja3Muc2l6ZSgpOwotfQotCi1zcDxJTWVkaWFTb3VyY2U+IE1QRUcyUFNFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgewotICAgIGlmIChpbmRleCA+PSBtVHJhY2tzLnNpemUoKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gbmV3IFdyYXBwZWRUcmFjayh0aGlzLCBtVHJhY2tzLnZhbHVlQXQoaW5kZXgpKTsKLX0KLQotc3A8TWV0YURhdGE+IE1QRUcyUFNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKLSAgICBpZiAoaW5kZXggPj0gbVRyYWNrcy5zaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1UcmFja3MudmFsdWVBdChpbmRleCktPmdldEZvcm1hdCgpOwotfQotCi1zcDxNZXRhRGF0YT4gTVBFRzJQU0V4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoKSB7Ci0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHMlBTKTsKLQotICAgIHJldHVybiBtZXRhOwotfQotCi11aW50MzJfdCBNUEVHMlBTRXh0cmFjdG9yOjpmbGFncygpIGNvbnN0IHsKLSAgICByZXR1cm4gQ0FOX1BBVVNFOwotfQotCi1zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpmZWVkTW9yZSgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgLy8gSG93IG11Y2ggZGF0YSB3ZSdyZSByZWFkaW5nIGF0IGEgdGltZQotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0NodW5rU2l6ZSA9IDgxOTI7Ci0KLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IGRlcXVldWVDaHVuaygpOwotCi0gICAgICAgIGlmIChlcnIgPT0gLUVBR0FJTiAmJiBtRmluYWxSZXN1bHQgPT0gT0spIHsKLSAgICAgICAgICAgIG1lbW1vdmUobUJ1ZmZlci0+YmFzZSgpLCBtQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnNpemUoKSk7Ci0gICAgICAgICAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCBtQnVmZmVyLT5zaXplKCkpOwotCi0gICAgICAgICAgICBpZiAobUJ1ZmZlci0+c2l6ZSgpICsga0NodW5rU2l6ZSA+IG1CdWZmZXItPmNhcGFjaXR5KCkpIHsKLSAgICAgICAgICAgICAgICBzaXplX3QgbmV3Q2FwYWNpdHkgPSBtQnVmZmVyLT5jYXBhY2l0eSgpICsga0NodW5rU2l6ZTsKLSAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBuZXdCdWZmZXIgPSBuZXcgQUJ1ZmZlcihuZXdDYXBhY2l0eSk7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KG5ld0J1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgbmV3QnVmZmVyLT5zZXRSYW5nZSgwLCBtQnVmZmVyLT5zaXplKCkpOwotICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBuZXdCdWZmZXI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNzaXplX3QgbiA9IG1EYXRhU291cmNlLT5yZWFkQXQoCi0gICAgICAgICAgICAgICAgICAgIG1PZmZzZXQsIG1CdWZmZXItPmRhdGEoKSArIG1CdWZmZXItPnNpemUoKSwga0NodW5rU2l6ZSk7Ci0KLSAgICAgICAgICAgIGlmIChuIDwgKHNzaXplX3Qpa0NodW5rU2l6ZSkgewotICAgICAgICAgICAgICAgIG1GaW5hbFJlc3VsdCA9IChuIDwgMCkgPyAoc3RhdHVzX3QpbiA6IEVSUk9SX0VORF9PRl9TVFJFQU07Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1GaW5hbFJlc3VsdDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UobUJ1ZmZlci0+b2Zmc2V0KCksIG1CdWZmZXItPnNpemUoKSArIG4pOwotICAgICAgICAgICAgbU9mZnNldCArPSBuOwotICAgICAgICB9IGVsc2UgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgbUZpbmFsUmVzdWx0ID0gZXJyOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6ZGVxdWV1ZUNodW5rKCkgewotICAgIGlmIChtQnVmZmVyLT5zaXplKCkgPCA0KSB7Ci0gICAgICAgIHJldHVybiAtRUFHQUlOOwotICAgIH0KLQotICAgIGlmIChtZW1jbXAoIlx4MDBceDAwXHgwMSIsIG1CdWZmZXItPmRhdGEoKSwgMykpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICB1bnNpZ25lZCBjaHVua1R5cGUgPSBtQnVmZmVyLT5kYXRhKClbM107Ci0KLSAgICBzc2l6ZV90IHJlczsKLQotICAgIHN3aXRjaCAoY2h1bmtUeXBlKSB7Ci0gICAgICAgIGNhc2UgMHhiYToKLSAgICAgICAgewotICAgICAgICAgICAgcmVzID0gZGVxdWV1ZVBhY2soKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSAweGJiOgotICAgICAgICB7Ci0gICAgICAgICAgICByZXMgPSBkZXF1ZXVlU3lzdGVtSGVhZGVyKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJlcyA9IGRlcXVldWVQRVMoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHJlcyA+IDApIHsKLSAgICAgICAgaWYgKG1CdWZmZXItPnNpemUoKSA8IChzaXplX3QpcmVzKSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVBR0FJTjsKLSAgICAgICAgfQotCi0gICAgICAgIG1CdWZmZXItPnNldFJhbmdlKG1CdWZmZXItPm9mZnNldCgpICsgcmVzLCBtQnVmZmVyLT5zaXplKCkgLSByZXMpOwotICAgICAgICByZXMgPSBPSzsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzOwotfQotCi1zc2l6ZV90IE1QRUcyUFNFeHRyYWN0b3I6OmRlcXVldWVQYWNrKCkgewotICAgIC8vIDMyICsgMiArIDMgKyAxICsgMTUgKyAxICsgMTUrIDEgKyA5ICsgMSArIDIyICsgMSArIDEgfCArNQotCi0gICAgaWYgKG1CdWZmZXItPnNpemUoKSA8IDE0KSB7Ci0gICAgICAgIHJldHVybiAtRUFHQUlOOwotICAgIH0KLQotICAgIHVuc2lnbmVkIHBhY2tfc3R1ZmZpbmdfbGVuZ3RoID0gbUJ1ZmZlci0+ZGF0YSgpWzEzXSAmIDc7Ci0KLSAgICByZXR1cm4gcGFja19zdHVmZmluZ19sZW5ndGggKyAxNDsKLX0KLQotc3NpemVfdCBNUEVHMlBTRXh0cmFjdG9yOjpkZXF1ZXVlU3lzdGVtSGVhZGVyKCkgewotICAgIGlmIChtQnVmZmVyLT5zaXplKCkgPCA2KSB7Ci0gICAgICAgIHJldHVybiAtRUFHQUlOOwotICAgIH0KLQotICAgIHVuc2lnbmVkIGhlYWRlcl9sZW5ndGggPSBVMTZfQVQobUJ1ZmZlci0+ZGF0YSgpICsgNCk7Ci0KLSAgICByZXR1cm4gaGVhZGVyX2xlbmd0aCArIDY7Ci19Ci0KLXNzaXplX3QgTVBFRzJQU0V4dHJhY3Rvcjo6ZGVxdWV1ZVBFUygpIHsKLSAgICBpZiAobUJ1ZmZlci0+c2l6ZSgpIDwgNikgewotICAgICAgICByZXR1cm4gLUVBR0FJTjsKLSAgICB9Ci0KLSAgICB1bnNpZ25lZCBQRVNfcGFja2V0X2xlbmd0aCA9IFUxNl9BVChtQnVmZmVyLT5kYXRhKCkgKyA0KTsKLSAgICBpZiAoUEVTX3BhY2tldF9sZW5ndGggPT0gMHUpIHsKLSAgICAgICAgQUxPR0UoIlBFU19wYWNrZXRfbGVuZ3RoIGlzIDAiKTsKLSAgICAgICAgcmV0dXJuIC1FQUdBSU47Ci0gICAgfQotCi0gICAgc2l6ZV90IG4gPSBQRVNfcGFja2V0X2xlbmd0aCArIDY7Ci0KLSAgICBpZiAobUJ1ZmZlci0+c2l6ZSgpIDwgbikgewotICAgICAgICByZXR1cm4gLUVBR0FJTjsKLSAgICB9Ci0KLSAgICBBQml0UmVhZGVyIGJyKG1CdWZmZXItPmRhdGEoKSwgbik7Ci0KLSAgICB1bnNpZ25lZCBwYWNrZXRfc3RhcnRjb2RlX3ByZWZpeCA9IGJyLmdldEJpdHMoMjQpOwotCi0gICAgQUxPR1YoInBhY2tldF9zdGFydGNvZGVfcHJlZml4ID0gMHglMDh4IiwgcGFja2V0X3N0YXJ0Y29kZV9wcmVmaXgpOwotCi0gICAgaWYgKHBhY2tldF9zdGFydGNvZGVfcHJlZml4ICE9IDEpIHsKLSAgICAgICAgQUxPR1YoIlN1cHBvc2VkbHkgcGF5bG9hZF91bml0X3N0YXJ0PTEgdW5pdCBkb2VzIG5vdCBzdGFydCAiCi0gICAgICAgICAgICAgIndpdGggc3RhcnRjb2RlLiIpOwotCi0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgaWYgKHBhY2tldF9zdGFydGNvZGVfcHJlZml4ICE9IDB4MDAwMDAxdSkgewotICAgICAgICBBTE9HRSgiV3JvbmcgUEVTIHByZWZpeCIpOwotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHVuc2lnbmVkIHN0cmVhbV9pZCA9IGJyLmdldEJpdHMoOCk7Ci0gICAgQUxPR1YoInN0cmVhbV9pZCA9IDB4JTAyeCIsIHN0cmVhbV9pZCk7Ci0KLSAgICAvKiB1bnNpZ25lZCBQRVNfcGFja2V0X2xlbmd0aCA9ICovYnIuZ2V0Qml0cygxNik7Ci0KLSAgICBpZiAoc3RyZWFtX2lkID09IDB4YmMpIHsKLSAgICAgICAgLy8gcHJvZ3JhbV9zdHJlYW1fbWFwCi0KLSAgICAgICAgaWYgKCFtU2Nhbm5pbmcpIHsKLSAgICAgICAgICAgIHJldHVybiBuOwotICAgICAgICB9Ci0KLSAgICAgICAgbVN0cmVhbVR5cGVCeUVTSUQuY2xlYXIoKTsKLQotICAgICAgICAvKiB1bnNpZ25lZCBjdXJyZW50X25leHRfaW5kaWNhdG9yID0gKi9ici5nZXRCaXRzKDEpOwotICAgICAgICAvKiB1bnNpZ25lZCByZXNlcnZlZCA9ICovYnIuZ2V0Qml0cygyKTsKLSAgICAgICAgLyogdW5zaWduZWQgcHJvZ3JhbV9zdHJlYW1fbWFwX3ZlcnNpb24gPSAqL2JyLmdldEJpdHMoNSk7Ci0gICAgICAgIC8qIHVuc2lnbmVkIHJlc2VydmVkID0gKi9ici5nZXRCaXRzKDcpOwotICAgICAgICAvKiB1bnNpZ25lZCBtYXJrZXJfYml0ID0gKi9ici5nZXRCaXRzKDEpOwotICAgICAgICB1bnNpZ25lZCBwcm9ncmFtX3N0cmVhbV9pbmZvX2xlbmd0aCA9IGJyLmdldEJpdHMoMTYpOwotCi0gICAgICAgIHNpemVfdCBvZmZzZXQgPSAwOwotICAgICAgICB3aGlsZSAob2Zmc2V0IDwgcHJvZ3JhbV9zdHJlYW1faW5mb19sZW5ndGgpIHsKLSAgICAgICAgICAgIGlmIChvZmZzZXQgKyAyID4gcHJvZ3JhbV9zdHJlYW1faW5mb19sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1bnNpZ25lZCBkZXNjcmlwdG9yX3RhZyA9IGJyLmdldEJpdHMoOCk7Ci0gICAgICAgICAgICB1bnNpZ25lZCBkZXNjcmlwdG9yX2xlbmd0aCA9IGJyLmdldEJpdHMoOCk7Ci0KLSAgICAgICAgICAgIEFMT0dJKCJmb3VuZCBkZXNjcmlwdG9yIHRhZyAweCUwMnggb2YgbGVuZ3RoICV1IiwKLSAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl90YWcsIGRlc2NyaXB0b3JfbGVuZ3RoKTsKLQotICAgICAgICAgICAgaWYgKG9mZnNldCArIDIgKyBkZXNjcmlwdG9yX2xlbmd0aCA+IHByb2dyYW1fc3RyZWFtX2luZm9fbGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnIuc2tpcEJpdHMoOCAqIGRlc2NyaXB0b3JfbGVuZ3RoKTsKLQotICAgICAgICAgICAgb2Zmc2V0ICs9IDIgKyBkZXNjcmlwdG9yX2xlbmd0aDsKLSAgICAgICAgfQotCi0gICAgICAgIHVuc2lnbmVkIGVsZW1lbnRhcnlfc3RyZWFtX21hcF9sZW5ndGggPSBici5nZXRCaXRzKDE2KTsKLQotICAgICAgICBvZmZzZXQgPSAwOwotICAgICAgICB3aGlsZSAob2Zmc2V0IDwgZWxlbWVudGFyeV9zdHJlYW1fbWFwX2xlbmd0aCkgewotICAgICAgICAgICAgaWYgKG9mZnNldCArIDQgPiBlbGVtZW50YXJ5X3N0cmVhbV9tYXBfbGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdW5zaWduZWQgc3RyZWFtX3R5cGUgPSBici5nZXRCaXRzKDgpOwotICAgICAgICAgICAgdW5zaWduZWQgZWxlbWVudGFyeV9zdHJlYW1faWQgPSBici5nZXRCaXRzKDgpOwotCi0gICAgICAgICAgICBBTE9HSSgiZWxlbWVudGFyeSBzdHJlYW0gaWQgMHglMDJ4IGhhcyBzdHJlYW0gdHlwZSAweCUwMngiLAotICAgICAgICAgICAgICAgICBlbGVtZW50YXJ5X3N0cmVhbV9pZCwgc3RyZWFtX3R5cGUpOwotCi0gICAgICAgICAgICBtU3RyZWFtVHlwZUJ5RVNJRC5hZGQoZWxlbWVudGFyeV9zdHJlYW1faWQsIHN0cmVhbV90eXBlKTsKLQotICAgICAgICAgICAgdW5zaWduZWQgZWxlbWVudGFyeV9zdHJlYW1faW5mb19sZW5ndGggPSBici5nZXRCaXRzKDE2KTsKLQotICAgICAgICAgICAgaWYgKG9mZnNldCArIDQgKyBlbGVtZW50YXJ5X3N0cmVhbV9pbmZvX2xlbmd0aAotICAgICAgICAgICAgICAgICAgICA+IGVsZW1lbnRhcnlfc3RyZWFtX21hcF9sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBvZmZzZXQgKz0gNCArIGVsZW1lbnRhcnlfc3RyZWFtX2luZm9fbGVuZ3RoOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogdW5zaWduZWQgQ1JDMzIgPSAqL2JyLmdldEJpdHMoMzIpOwotCi0gICAgICAgIG1Qcm9ncmFtU3RyZWFtTWFwVmFsaWQgPSB0cnVlOwotICAgIH0gZWxzZSBpZiAoc3RyZWFtX2lkICE9IDB4YmUgIC8vIHBhZGRpbmdfc3RyZWFtCi0gICAgICAgICAgICAmJiBzdHJlYW1faWQgIT0gMHhiZiAgLy8gcHJpdmF0ZV9zdHJlYW1fMgotICAgICAgICAgICAgJiYgc3RyZWFtX2lkICE9IDB4ZjAgIC8vIEVDTQotICAgICAgICAgICAgJiYgc3RyZWFtX2lkICE9IDB4ZjEgIC8vIEVNTQotICAgICAgICAgICAgJiYgc3RyZWFtX2lkICE9IDB4ZmYgIC8vIHByb2dyYW1fc3RyZWFtX2RpcmVjdG9yeQotICAgICAgICAgICAgJiYgc3RyZWFtX2lkICE9IDB4ZjIgIC8vIERTTUNDCi0gICAgICAgICAgICAmJiBzdHJlYW1faWQgIT0gMHhmOCkgeyAgLy8gSC4yMjIuMSB0eXBlIEUKLSAgICAgICAgLyogdW5zaWduZWQgUEVTX21hcmtlcl9iaXRzID0gKi9ici5nZXRCaXRzKDIpOyAgLy8gc2hvdWxkIGJlIDB4MihoZXgpCi0gICAgICAgIC8qIHVuc2lnbmVkIFBFU19zY3JhbWJsaW5nX2NvbnRyb2wgPSAqL2JyLmdldEJpdHMoMik7Ci0gICAgICAgIC8qIHVuc2lnbmVkIFBFU19wcmlvcml0eSA9ICovYnIuZ2V0Qml0cygxKTsKLSAgICAgICAgLyogdW5zaWduZWQgZGF0YV9hbGlnbm1lbnRfaW5kaWNhdG9yID0gKi9ici5nZXRCaXRzKDEpOwotICAgICAgICAvKiB1bnNpZ25lZCBjb3B5cmlnaHQgPSAqL2JyLmdldEJpdHMoMSk7Ci0gICAgICAgIC8qIHVuc2lnbmVkIG9yaWdpbmFsX29yX2NvcHkgPSAqL2JyLmdldEJpdHMoMSk7Ci0KLSAgICAgICAgdW5zaWduZWQgUFRTX0RUU19mbGFncyA9IGJyLmdldEJpdHMoMik7Ci0gICAgICAgIEFMT0dWKCJQVFNfRFRTX2ZsYWdzID0gJXUiLCBQVFNfRFRTX2ZsYWdzKTsKLQotICAgICAgICB1bnNpZ25lZCBFU0NSX2ZsYWcgPSBici5nZXRCaXRzKDEpOwotICAgICAgICBBTE9HVigiRVNDUl9mbGFnID0gJXUiLCBFU0NSX2ZsYWcpOwotCi0gICAgICAgIHVuc2lnbmVkIEVTX3JhdGVfZmxhZyA9IGJyLmdldEJpdHMoMSk7Ci0gICAgICAgIEFMT0dWKCJFU19yYXRlX2ZsYWcgPSAldSIsIEVTX3JhdGVfZmxhZyk7Ci0KLSAgICAgICAgdW5zaWduZWQgRFNNX3RyaWNrX21vZGVfZmxhZyA9IGJyLmdldEJpdHMoMSk7Ci0gICAgICAgIEFMT0dWKCJEU01fdHJpY2tfbW9kZV9mbGFnID0gJXUiLCBEU01fdHJpY2tfbW9kZV9mbGFnKTsKLQotICAgICAgICB1bnNpZ25lZCBhZGRpdGlvbmFsX2NvcHlfaW5mb19mbGFnID0gYnIuZ2V0Qml0cygxKTsKLSAgICAgICAgQUxPR1YoImFkZGl0aW9uYWxfY29weV9pbmZvX2ZsYWcgPSAldSIsIGFkZGl0aW9uYWxfY29weV9pbmZvX2ZsYWcpOwotCi0gICAgICAgIC8qIHVuc2lnbmVkIFBFU19DUkNfZmxhZyA9ICovYnIuZ2V0Qml0cygxKTsKLSAgICAgICAgLyogUEVTX2V4dGVuc2lvbl9mbGFnID0gKi9ici5nZXRCaXRzKDEpOwotCi0gICAgICAgIHVuc2lnbmVkIFBFU19oZWFkZXJfZGF0YV9sZW5ndGggPSBici5nZXRCaXRzKDgpOwotICAgICAgICBBTE9HVigiUEVTX2hlYWRlcl9kYXRhX2xlbmd0aCA9ICV1IiwgUEVTX2hlYWRlcl9kYXRhX2xlbmd0aCk7Ci0KLSAgICAgICAgdW5zaWduZWQgb3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nID0gUEVTX2hlYWRlcl9kYXRhX2xlbmd0aDsKLQotICAgICAgICB1aW50NjRfdCBQVFMgPSAwLCBEVFMgPSAwOwotCi0gICAgICAgIGlmIChQVFNfRFRTX2ZsYWdzID09IDIgfHwgUFRTX0RUU19mbGFncyA9PSAzKSB7Ci0gICAgICAgICAgICBpZiAob3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nIDwgNXUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoYnIuZ2V0Qml0cyg0KSAhPSBQVFNfRFRTX2ZsYWdzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgUFRTID0gKCh1aW50NjRfdClici5nZXRCaXRzKDMpKSA8PCAzMDsKLSAgICAgICAgICAgIGlmIChici5nZXRCaXRzKDEpICE9IDF1KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFBUUyB8PSAoKHVpbnQ2NF90KWJyLmdldEJpdHMoMTUpKSA8PCAxNTsKLSAgICAgICAgICAgIGlmIChici5nZXRCaXRzKDEpICE9IDF1KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFBUUyB8PSBici5nZXRCaXRzKDE1KTsKLSAgICAgICAgICAgIGlmIChici5nZXRCaXRzKDEpICE9IDF1KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQUxPR1YoIlBUUyA9ICUiIFBSSXU2NCwgUFRTKTsKLSAgICAgICAgICAgIC8vIEFMT0dJKCJQVFMgPSAlLjJmIHNlY3MiLCBQVFMgLyA5MDAwMC4wZik7Ci0KLSAgICAgICAgICAgIG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZyAtPSA1OwotCi0gICAgICAgICAgICBpZiAoUFRTX0RUU19mbGFncyA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZyA8IDV1KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGJyLmdldEJpdHMoNCkgIT0gMXUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBEVFMgPSAoKHVpbnQ2NF90KWJyLmdldEJpdHMoMykpIDw8IDMwOwotICAgICAgICAgICAgICAgIGlmIChici5nZXRCaXRzKDEpICE9IDF1KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIERUUyB8PSAoKHVpbnQ2NF90KWJyLmdldEJpdHMoMTUpKSA8PCAxNTsKLSAgICAgICAgICAgICAgICBpZiAoYnIuZ2V0Qml0cygxKSAhPSAxdSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBEVFMgfD0gYnIuZ2V0Qml0cygxNSk7Ci0gICAgICAgICAgICAgICAgaWYgKGJyLmdldEJpdHMoMSkgIT0gMXUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBBTE9HVigiRFRTID0gJSIgUFJJdTY0LCBEVFMpOwotCi0gICAgICAgICAgICAgICAgb3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nIC09IDU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoRVNDUl9mbGFnKSB7Ci0gICAgICAgICAgICBpZiAob3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nIDwgNnUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBici5nZXRCaXRzKDIpOwotCi0gICAgICAgICAgICB1aW50NjRfdCBFU0NSID0gKCh1aW50NjRfdClici5nZXRCaXRzKDMpKSA8PCAzMDsKLSAgICAgICAgICAgIGlmIChici5nZXRCaXRzKDEpICE9IDF1KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEVTQ1IgfD0gKCh1aW50NjRfdClici5nZXRCaXRzKDE1KSkgPDwgMTU7Ci0gICAgICAgICAgICBpZiAoYnIuZ2V0Qml0cygxKSAhPSAxdSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBFU0NSIHw9IGJyLmdldEJpdHMoMTUpOwotICAgICAgICAgICAgaWYgKGJyLmdldEJpdHMoMSkgIT0gMXUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBTE9HVigiRVNDUiA9ICUiIFBSSXU2NCwgRVNDUik7Ci0gICAgICAgICAgICAvKiB1bnNpZ25lZCBFU0NSX2V4dGVuc2lvbiA9ICovYnIuZ2V0Qml0cyg5KTsKLQotICAgICAgICAgICAgaWYgKGJyLmdldEJpdHMoMSkgIT0gMXUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBvcHRpb25hbF9ieXRlc19yZW1haW5pbmcgLT0gNjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChFU19yYXRlX2ZsYWcpIHsKLSAgICAgICAgICAgIGlmIChvcHRpb25hbF9ieXRlc19yZW1haW5pbmcgPCAzdSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChici5nZXRCaXRzKDEpICE9IDF1KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIHVuc2lnbmVkIEVTX3JhdGUgPSAqL2JyLmdldEJpdHMoMjIpOwotICAgICAgICAgICAgaWYgKGJyLmdldEJpdHMoMSkgIT0gMXUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBvcHRpb25hbF9ieXRlc19yZW1haW5pbmcgLT0gMzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgb3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nICogOCkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIGJyLnNraXBCaXRzKG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZyAqIDgpOwotCi0gICAgICAgIC8vIEVTIGRhdGEgZm9sbG93cy4KLQotICAgICAgICBpZiAoUEVTX3BhY2tldF9sZW5ndGggPCBQRVNfaGVhZGVyX2RhdGFfbGVuZ3RoICsgMykgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIHVuc2lnbmVkIGRhdGFMZW5ndGggPQotICAgICAgICAgICAgUEVTX3BhY2tldF9sZW5ndGggLSAzIC0gUEVTX2hlYWRlcl9kYXRhX2xlbmd0aDsKLQotICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IGRhdGFMZW5ndGggKiA4KSB7Ci0gICAgICAgICAgICBBTE9HRSgiUEVTIHBhY2tldCBkb2VzIG5vdCBjYXJyeSBlbm91Z2ggZGF0YSB0byBjb250YWluICIKLSAgICAgICAgICAgICAgICAgInBheWxvYWQuIChudW1CaXRzTGVmdCA9ICV6dSwgcmVxdWlyZWQgPSAldSkiLAotICAgICAgICAgICAgICAgICBici5udW1CaXRzTGVmdCgpLCBkYXRhTGVuZ3RoICogOCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IGRhdGFMZW5ndGggKiA4KSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgc3NpemVfdCBpbmRleCA9IG1UcmFja3MuaW5kZXhPZktleShzdHJlYW1faWQpOwotICAgICAgICBpZiAoaW5kZXggPCAwICYmIG1TY2FubmluZykgewotICAgICAgICAgICAgdW5zaWduZWQgc3RyZWFtVHlwZTsKLQotICAgICAgICAgICAgc3NpemVfdCBzdHJlYW1UeXBlSW5kZXg7Ci0gICAgICAgICAgICBpZiAobVByb2dyYW1TdHJlYW1NYXBWYWxpZAotICAgICAgICAgICAgICAgICAgICAmJiAoc3RyZWFtVHlwZUluZGV4ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtVHlwZUJ5RVNJRC5pbmRleE9mS2V5KHN0cmVhbV9pZCkpID49IDApIHsKLSAgICAgICAgICAgICAgICBzdHJlYW1UeXBlID0gbVN0cmVhbVR5cGVCeUVTSUQudmFsdWVBdChzdHJlYW1UeXBlSW5kZXgpOwotICAgICAgICAgICAgfSBlbHNlIGlmICgoc3RyZWFtX2lkICYgfjB4MWYpID09IDB4YzApIHsKLSAgICAgICAgICAgICAgICAvLyBJU08vSUVDIDEzODE4LTMgb3IgSVNPL0lFQyAxMTE3Mi0zIG9yIElTTy9JRUMgMTM4MTgtNwotICAgICAgICAgICAgICAgIC8vIG9yIElTTy9JRUMgMTQ0OTYtMyBhdWRpbwotICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUgPSBBVFNQYXJzZXI6OlNUUkVBTVRZUEVfTVBFRzJfQVVESU87Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKChzdHJlYW1faWQgJiB+MHgwZikgPT0gMHhlMCkgewotICAgICAgICAgICAgICAgIC8vIElTTy9JRUMgMTM4MTgtMiBvciBJU08vSUVDIDExMTcyLTIgb3IgSVNPL0lFQyAxNDQ5Ni0yIHZpZGVvCi0gICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IEFUU1BhcnNlcjo6U1RSRUFNVFlQRV9NUEVHMl9WSURFTzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IEFUU1BhcnNlcjo6U1RSRUFNVFlQRV9SRVNFUlZFRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW5kZXggPSBtVHJhY2tzLmFkZCgKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtX2lkLCBuZXcgVHJhY2sodGhpcywgc3RyZWFtX2lkLCBzdHJlYW1UeXBlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLQotICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgZXJyID0KLSAgICAgICAgICAgICAgICBtVHJhY2tzLmVkaXRWYWx1ZUF0KGluZGV4KS0+YXBwZW5kUEVTRGF0YSgKLSAgICAgICAgICAgICAgICAgICAgUFRTX0RUU19mbGFncywgUFRTLCBEVFMsIGJyLmRhdGEoKSwgZGF0YUxlbmd0aCk7Ci0gICAgICAgIH0KLQotICAgICAgICBici5za2lwQml0cyhkYXRhTGVuZ3RoICogOCk7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoc3RyZWFtX2lkID09IDB4YmUpIHsgIC8vIHBhZGRpbmdfc3RyZWFtCi0gICAgICAgIGlmIChQRVNfcGFja2V0X2xlbmd0aCA9PSAwdSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotICAgICAgICBici5za2lwQml0cyhQRVNfcGFja2V0X2xlbmd0aCAqIDgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChQRVNfcGFja2V0X2xlbmd0aCA9PSAwdSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotICAgICAgICBici5za2lwQml0cyhQRVNfcGFja2V0X2xlbmd0aCAqIDgpOwotICAgIH0KLQotICAgIHJldHVybiBuOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1NUEVHMlBTRXh0cmFjdG9yOjpUcmFjazo6VHJhY2soCi0gICAgICAgIE1QRUcyUFNFeHRyYWN0b3IgKmV4dHJhY3RvciwgdW5zaWduZWQgc3RyZWFtX2lkLCB1bnNpZ25lZCBzdHJlYW1fdHlwZSkKLSAgICA6IG1FeHRyYWN0b3IoZXh0cmFjdG9yKSwKLSAgICAgIG1TdHJlYW1JRChzdHJlYW1faWQpLAotICAgICAgbVN0cmVhbVR5cGUoc3RyZWFtX3R5cGUpLAotICAgICAgbVF1ZXVlKE5VTEwpIHsKLSAgICBib29sIHN1cHBvcnRlZCA9IHRydWU7Ci0gICAgRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpNb2RlIG1vZGU7Ci0KLSAgICBzd2l0Y2ggKG1TdHJlYW1UeXBlKSB7Ci0gICAgICAgIGNhc2UgQVRTUGFyc2VyOjpTVFJFQU1UWVBFX0gyNjQ6Ci0gICAgICAgICAgICBtb2RlID0gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpIMjY0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQVRTUGFyc2VyOjpTVFJFQU1UWVBFX01QRUcyX0FVRElPX0FEVFM6Ci0gICAgICAgICAgICBtb2RlID0gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpBQUM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBVFNQYXJzZXI6OlNUUkVBTVRZUEVfTVBFRzFfQVVESU86Ci0gICAgICAgIGNhc2UgQVRTUGFyc2VyOjpTVFJFQU1UWVBFX01QRUcyX0FVRElPOgotICAgICAgICAgICAgbW9kZSA9IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6TVBFR19BVURJTzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQVRTUGFyc2VyOjpTVFJFQU1UWVBFX01QRUcxX1ZJREVPOgotICAgICAgICBjYXNlIEFUU1BhcnNlcjo6U1RSRUFNVFlQRV9NUEVHMl9WSURFTzoKLSAgICAgICAgICAgIG1vZGUgPSBFbGVtZW50YXJ5U3RyZWFtUXVldWU6Ok1QRUdfVklERU87Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEFUU1BhcnNlcjo6U1RSRUFNVFlQRV9NUEVHNF9WSURFTzoKLSAgICAgICAgICAgIG1vZGUgPSBFbGVtZW50YXJ5U3RyZWFtUXVldWU6Ok1QRUc0X1ZJREVPOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHN1cHBvcnRlZCA9IGZhbHNlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKHN1cHBvcnRlZCkgewotICAgICAgICBtUXVldWUgPSBuZXcgRWxlbWVudGFyeVN0cmVhbVF1ZXVlKG1vZGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dJKCJ1bnN1cHBvcnRlZCBzdHJlYW0gSUQgMHglMDJ4Iiwgc3RyZWFtX2lkKTsKLSAgICB9Ci19Ci0KLU1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrOjp+VHJhY2soKSB7Ci0gICAgZGVsZXRlIG1RdWV1ZTsKLSAgICBtUXVldWUgPSBOVUxMOwotfQotCi1zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjazo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgewotICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1Tb3VyY2UtPnN0YXJ0KHBhcmFtcyk7Ci19Ci0KLXN0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrOjpzdG9wKCkgewotICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1Tb3VyY2UtPnN0b3AoKTsKLX0KLQotc3A8TWV0YURhdGE+IE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrOjpnZXRGb3JtYXQoKSB7Ci0gICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gbVNvdXJjZS0+Z2V0Rm9ybWF0KCk7Ci19Ci0KLXN0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKLSAgICBpZiAobVNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLQotICAgIHN0YXR1c190IGZpbmFsUmVzdWx0OwotICAgIHdoaWxlICghbVNvdXJjZS0+aGFzQnVmZmVyQXZhaWxhYmxlKCZmaW5hbFJlc3VsdCkpIHsKLSAgICAgICAgaWYgKGZpbmFsUmVzdWx0ICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXR1c190IGVyciA9IG1FeHRyYWN0b3ItPmZlZWRNb3JlKCk7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgbVNvdXJjZS0+c2lnbmFsRU9TKGVycik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbVNvdXJjZS0+cmVhZChidWZmZXIsIG9wdGlvbnMpOwotfQotCi1zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjazo6YXBwZW5kUEVTRGF0YSgKLSAgICAgICAgdW5zaWduZWQgUFRTX0RUU19mbGFncywKLSAgICAgICAgdWludDY0X3QgUFRTLCB1aW50NjRfdCAvKiBEVFMgKi8sCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKG1RdWV1ZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IHRpbWVVczsKLSAgICBpZiAoUFRTX0RUU19mbGFncyA9PSAyIHx8IFBUU19EVFNfZmxhZ3MgPT0gMykgewotICAgICAgICB0aW1lVXMgPSAoUFRTICogMTAwKSAvIDk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdGltZVVzID0gMDsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBtUXVldWUtPmFwcGVuZERhdGEoZGF0YSwgc2l6ZSwgdGltZVVzKTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0OwotICAgIHdoaWxlICgoYWNjZXNzVW5pdCA9IG1RdWV1ZS0+ZGVxdWV1ZUFjY2Vzc1VuaXQoKSkgIT0gTlVMTCkgewotICAgICAgICBpZiAobVNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1RdWV1ZS0+Z2V0Rm9ybWF0KCk7Ci0KLSAgICAgICAgICAgIGlmIChtZXRhICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiU3RyZWFtIElEIDB4JTAyeCBub3cgaGFzIGRhdGEuIiwgbVN0cmVhbUlEKTsKLQotICAgICAgICAgICAgICAgIG1Tb3VyY2UgPSBuZXcgQW5vdGhlclBhY2tldFNvdXJjZShtZXRhKTsKLSAgICAgICAgICAgICAgICBtU291cmNlLT5xdWV1ZUFjY2Vzc1VuaXQoYWNjZXNzVW5pdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAobVF1ZXVlLT5nZXRGb3JtYXQoKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtU291cmNlLT5xdWV1ZUFjY2Vzc1VuaXQoYWNjZXNzVW5pdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLU1QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjazo6V3JhcHBlZFRyYWNrKAotICAgICAgICBjb25zdCBzcDxNUEVHMlBTRXh0cmFjdG9yPiAmZXh0cmFjdG9yLCBjb25zdCBzcDxUcmFjaz4gJnRyYWNrKQotICAgIDogbUV4dHJhY3RvcihleHRyYWN0b3IpLAotICAgICAgbVRyYWNrKHRyYWNrKSB7Ci19Ci0KLU1QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjazo6fldyYXBwZWRUcmFjaygpIHsKLX0KLQotc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6V3JhcHBlZFRyYWNrOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7Ci0gICAgcmV0dXJuIG1UcmFjay0+c3RhcnQocGFyYW1zKTsKLX0KLQotc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6V3JhcHBlZFRyYWNrOjpzdG9wKCkgewotICAgIHJldHVybiBtVHJhY2stPnN0b3AoKTsKLX0KLQotc3A8TWV0YURhdGE+IE1QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjazo6Z2V0Rm9ybWF0KCkgewotICAgIHJldHVybiBtVHJhY2stPmdldEZvcm1hdCgpOwotfQotCi1zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpXcmFwcGVkVHJhY2s6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewotICAgIHJldHVybiBtVHJhY2stPnJlYWQoYnVmZmVyLCBvcHRpb25zKTsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotYm9vbCBTbmlmZk1QRUcyUFMoCi0gICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSwKLSAgICAgICAgc3A8QU1lc3NhZ2U+ICopIHsKLSAgICB1aW50OF90IGhlYWRlcls1XTsKLSAgICBpZiAoc291cmNlLT5yZWFkQXQoMCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkgPCAoc3NpemVfdClzaXplb2YoaGVhZGVyKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKG1lbWNtcCgiXHgwMFx4MDBceDAxXHhiYSIsIGhlYWRlciwgNCkgfHwgKGhlYWRlcls0XSA+PiA2KSAhPSAxKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAqY29uZmlkZW5jZSA9IDAuMjVmOyAgLy8gU2xpZ2h0bHkgbGFyZ2VyIHRoYW4gLm1wMyBleHRyYWN0b3IncyBjb25maWRlbmNlCi0KLSAgICBtaW1lVHlwZS0+c2V0VG8oTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUcyUFMpOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL01QRUcyVFNFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9NUEVHMlRTRXh0cmFjdG9yLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ2ODRlMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL01QRUcyVFNFeHRyYWN0b3IuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjY2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIk1QRUcyVFNFeHRyYWN0b3IiCi0KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiaW5jbHVkZS9NUEVHMlRTRXh0cmFjdG9yLmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaCIKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSVN0cmVhbVNvdXJjZS5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotI2luY2x1ZGUgIkFub3RoZXJQYWNrZXRTb3VyY2UuaCIKLSNpbmNsdWRlICJBVFNQYXJzZXIuaCIKLQotI2luY2x1ZGUgPGhpZGwvSHlicmlkSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYXMvMS4wL0lDYXMuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi11c2luZyBoYXJkd2FyZTo6Y2FzOjpWMV8wOjpJQ2FzOwotCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGtUU1BhY2tldFNpemUgPSAxODg7Ci1zdGF0aWMgY29uc3QgaW50IGtNYXhEdXJhdGlvblJlYWRTaXplID0gMjUwMDAwTEw7Ci1zdGF0aWMgY29uc3QgaW50IGtNYXhEdXJhdGlvblJldHJ5ID0gNjsKLQotc3RydWN0IE1QRUcyVFNTb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UgewotICAgIE1QRUcyVFNTb3VyY2UoCi0gICAgICAgICAgICBjb25zdCBzcDxNUEVHMlRTRXh0cmFjdG9yPiAmZXh0cmFjdG9yLAotICAgICAgICAgICAgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJmltcGwsCi0gICAgICAgICAgICBib29sIGRvZXNTZWVrKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7Ci0KLXByaXZhdGU6Ci0gICAgc3A8TVBFRzJUU0V4dHJhY3Rvcj4gbUV4dHJhY3RvcjsKLSAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBtSW1wbDsKLQotICAgIC8vIElmIHRoZXJlIGFyZSBib3RoIGF1ZGlvIGFuZCB2aWRlbyBzdHJlYW1zLCBvbmx5IHRoZSB2aWRlbyBzdHJlYW0KLSAgICAvLyB3aWxsIHNpZ25hbCBzZWVrIG9uIHRoZSBleHRyYWN0b3I7IG90aGVyd2lzZSB0aGUgc2luZ2xlIHN0cmVhbSB3aWxsIHNlZWsuCi0gICAgYm9vbCBtRG9lc1NlZWs7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNUEVHMlRTU291cmNlKTsKLX07Ci0KLU1QRUcyVFNTb3VyY2U6Ok1QRUcyVFNTb3VyY2UoCi0gICAgICAgIGNvbnN0IHNwPE1QRUcyVFNFeHRyYWN0b3I+ICZleHRyYWN0b3IsCi0gICAgICAgIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZpbXBsLAotICAgICAgICBib29sIGRvZXNTZWVrKQotICAgIDogbUV4dHJhY3RvcihleHRyYWN0b3IpLAotICAgICAgbUltcGwoaW1wbCksCi0gICAgICBtRG9lc1NlZWsoZG9lc1NlZWspIHsKLX0KLQotc3RhdHVzX3QgTVBFRzJUU1NvdXJjZTo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgewotICAgIHJldHVybiBtSW1wbC0+c3RhcnQocGFyYW1zKTsKLX0KLQotc3RhdHVzX3QgTVBFRzJUU1NvdXJjZTo6c3RvcCgpIHsKLSAgICByZXR1cm4gbUltcGwtPnN0b3AoKTsKLX0KLQotc3A8TWV0YURhdGE+IE1QRUcyVFNTb3VyY2U6OmdldEZvcm1hdCgpIHsKLSAgICByZXR1cm4gbUltcGwtPmdldEZvcm1hdCgpOwotfQotCi1zdGF0dXNfdCBNUEVHMlRTU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKLSAgICAqb3V0ID0gTlVMTDsKLQotICAgIGludDY0X3Qgc2Vla1RpbWVVczsKLSAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgc2Vla01vZGU7Ci0gICAgaWYgKG1Eb2VzU2VlayAmJiBvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJnNlZWtNb2RlKSkgewotICAgICAgICAvLyBzZWVrIGlzIG5lZWRlZAotICAgICAgICBzdGF0dXNfdCBlcnIgPSBtRXh0cmFjdG9yLT5zZWVrKHNlZWtUaW1lVXMsIHNlZWtNb2RlKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChtRXh0cmFjdG9yLT5mZWVkVW50aWxCdWZmZXJBdmFpbGFibGUobUltcGwpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgIH0KLQotICAgIHJldHVybiBtSW1wbC0+cmVhZChvdXQsIG9wdGlvbnMpOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1NUEVHMlRTRXh0cmFjdG9yOjpNUEVHMlRTRXh0cmFjdG9yKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UpCi0gICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAotICAgICAgbVBhcnNlcihuZXcgQVRTUGFyc2VyKSwKLSAgICAgIG1MYXN0U3luY0V2ZW50KDApLAotICAgICAgbU9mZnNldCgwKSB7Ci0gICAgaW5pdCgpOwotfQotCi1zaXplX3QgTVBFRzJUU0V4dHJhY3Rvcjo6Y291bnRUcmFja3MoKSB7Ci0gICAgcmV0dXJuIG1Tb3VyY2VJbXBscy5zaXplKCk7Ci19Ci0KLXNwPElNZWRpYVNvdXJjZT4gTVBFRzJUU0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7Ci0gICAgaWYgKGluZGV4ID49IG1Tb3VyY2VJbXBscy5zaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgLy8gVGhlIHNlZWsgcmVmZXJlbmNlIHRyYWNrICh2aWRlbyBpZiBwcmVzZW50OyBhdWRpbyBvdGhlcndpc2UpIHBlcmZvcm1zCi0gICAgLy8gc2VlayByZXF1ZXN0cywgd2hpbGUgb3RoZXIgdHJhY2tzIGlnbm9yZSByZXF1ZXN0cy4KLSAgICByZXR1cm4gbmV3IE1QRUcyVFNTb3VyY2UodGhpcywgbVNvdXJjZUltcGxzLmVkaXRJdGVtQXQoaW5kZXgpLAotICAgICAgICAgICAgKG1TZWVrU3luY1BvaW50cyA9PSAmbVN5bmNQb2ludHMuZWRpdEl0ZW1BdChpbmRleCkpKTsKLX0KLQotc3A8TWV0YURhdGE+IE1QRUcyVFNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKLSAgICByZXR1cm4gaW5kZXggPCBtU291cmNlSW1wbHMuc2l6ZSgpCi0gICAgICAgID8gbVNvdXJjZUltcGxzLmVkaXRJdGVtQXQoaW5kZXgpLT5nZXRGb3JtYXQoKSA6IE5VTEw7Ci19Ci0KLXNwPE1ldGFEYXRhPiBNUEVHMlRTRXh0cmFjdG9yOjpnZXRNZXRhRGF0YSgpIHsKLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUcyVFMpOwotCi0gICAgcmV0dXJuIG1ldGE7Ci19Ci0KLS8vc3RhdGljCi1ib29sIE1QRUcyVFNFeHRyYWN0b3I6OmlzU2NyYW1ibGVkRm9ybWF0KGNvbnN0IHNwPE1ldGFEYXRhPiAmZm9ybWF0KSB7Ci0gICAgY29uc3QgY2hhciAqbWltZTsKLSAgICByZXR1cm4gZm9ybWF0LT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKQotICAgICAgICAgICAgJiYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX1NDUkFNQkxFRCwgbWltZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfQVVESU9fU0NSQU1CTEVELCBtaW1lKSk7Ci19Ci0KLXN0YXR1c190IE1QRUcyVFNFeHRyYWN0b3I6OnNldE1lZGlhQ2FzKGNvbnN0IEhJbnRlcmZhY2VUb2tlbiAmY2FzVG9rZW4pIHsKLSAgICBIYWxUb2tlbiBoYWxUb2tlbjsKLSAgICBoYWxUb2tlbi5zZXRUb0V4dGVybmFsKCh1aW50OF90KiljYXNUb2tlbi5kYXRhKCksIGNhc1Rva2VuLnNpemUoKSk7Ci0gICAgc3A8SUNhcz4gY2FzID0gSUNhczo6Y2FzdEZyb20ocmV0cmlldmVIYWxJbnRlcmZhY2UoaGFsVG9rZW4pKTsKLSAgICBBTE9HRCgic2V0TWVkaWFDYXM6ICVwIiwgY2FzLmdldCgpKTsKLQotICAgIHN0YXR1c190IGVyciA9IG1QYXJzZXItPnNldE1lZGlhQ2FzKGNhcyk7Ci0gICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICBBTE9HSSgiQWxsIHRyYWNrcyBub3cgaGF2ZSBkZXNjcmFtYmxlcnMiKTsKLSAgICAgICAgaW5pdCgpOwotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi12b2lkIE1QRUcyVFNFeHRyYWN0b3I6OmFkZFNvdXJjZShjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmaW1wbCkgewotICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Tb3VyY2VJbXBscy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAobVNvdXJjZUltcGxzW2ldID09IGltcGwpIHsKLSAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICghZm91bmQpIHsKLSAgICAgICAgbVNvdXJjZUltcGxzLnB1c2goaW1wbCk7Ci0gICAgfQotfQotCi12b2lkIE1QRUcyVFNFeHRyYWN0b3I6OmluaXQoKSB7Ci0gICAgYm9vbCBoYXZlQXVkaW8gPSBmYWxzZTsKLSAgICBib29sIGhhdmVWaWRlbyA9IGZhbHNlOwotICAgIGludDY0X3Qgc3RhcnRUaW1lID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLQotICAgIHN0YXR1c190IGVycjsKLSAgICB3aGlsZSAoKGVyciA9IGZlZWRNb3JlKHRydWUgLyogaXNJbml0ICovKSkgPT0gT0sKLSAgICAgICAgICAgIHx8IGVyciA9PSBFUlJPUl9EUk1fREVDUllQVF9VTklUX05PVF9JTklUSUFMSVpFRCkgewotICAgICAgICBpZiAoaGF2ZUF1ZGlvICYmIGhhdmVWaWRlbykgewotICAgICAgICAgICAgYWRkU3luY1BvaW50X2wobUxhc3RTeW5jRXZlbnQpOwotICAgICAgICAgICAgbUxhc3RTeW5jRXZlbnQucmVzZXQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmICghaGF2ZVZpZGVvKSB7Ci0gICAgICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBpbXBsID0KLSAgICAgICAgICAgICAgICAoQW5vdGhlclBhY2tldFNvdXJjZSAqKW1QYXJzZXItPmdldFNvdXJjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIEFUU1BhcnNlcjo6VklERU8pLmdldCgpOwotCi0gICAgICAgICAgICBpZiAoaW1wbCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgc3A8TWV0YURhdGE+IGZvcm1hdCA9IGltcGwtPmdldEZvcm1hdCgpOwotICAgICAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBoYXZlVmlkZW8gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBhZGRTb3VyY2UoaW1wbCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaXNTY3JhbWJsZWRGb3JtYXQoZm9ybWF0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVN5bmNQb2ludHMucHVzaCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVNlZWtTeW5jUG9pbnRzID0gJm1TeW5jUG9pbnRzLmVkaXRUb3AoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghaGF2ZUF1ZGlvKSB7Ci0gICAgICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBpbXBsID0KLSAgICAgICAgICAgICAgICAoQW5vdGhlclBhY2tldFNvdXJjZSAqKW1QYXJzZXItPmdldFNvdXJjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIEFUU1BhcnNlcjo6QVVESU8pLmdldCgpOwotCi0gICAgICAgICAgICBpZiAoaW1wbCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgc3A8TWV0YURhdGE+IGZvcm1hdCA9IGltcGwtPmdldEZvcm1hdCgpOwotICAgICAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBoYXZlQXVkaW8gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBhZGRTb3VyY2UoaW1wbCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaXNTY3JhbWJsZWRGb3JtYXQoZm9ybWF0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVN5bmNQb2ludHMucHVzaCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXZlVmlkZW8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vla1N5bmNQb2ludHMgPSAmbVN5bmNQb2ludHMuZWRpdFRvcCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYWRkU3luY1BvaW50X2wobUxhc3RTeW5jRXZlbnQpOwotICAgICAgICBtTGFzdFN5bmNFdmVudC5yZXNldCgpOwotCi0gICAgICAgIC8vIEVSUk9SX0RSTV9ERUNSWVBUX1VOSVRfTk9UX0lOSVRJQUxJWkVEIGlzIHJldHVybmVkIHdoZW4gdGhlIG1wZWcydHMKLSAgICAgICAgLy8gaXMgc2NyYW1ibGVkIGJ1dCB3ZSBkb24ndCBoYXZlIGEgTWVkaWFDYXMgb2JqZWN0IHNldC4gVGhlIGV4dHJhY3Rpb24KLSAgICAgICAgLy8gd2lsbCBvbmx5IGNvbnRpbnVlIHdoZW4gc2V0TWVkaWFDYXMoKSBpcyBjYWxsZWQgc3VjY2Vzc2Z1bGx5LgotICAgICAgICBpZiAoZXJyID09IEVSUk9SX0RSTV9ERUNSWVBUX1VOSVRfTk9UX0lOSVRJQUxJWkVEKSB7Ci0gICAgICAgICAgICBBTE9HSSgic3RvcHBlZCBwYXJzaW5nIHNjcmFtYmxlZCBjb250ZW50LCAiCi0gICAgICAgICAgICAgICAgICAiaGF2ZUF1ZGlvPSVkLCBoYXZlVmlkZW89JWQsIGVsYXNwZWRUaW1lPSUiIFBSSWQ2NCwKLSAgICAgICAgICAgICAgICAgICAgaGF2ZUF1ZGlvLCBoYXZlVmlkZW8sIEFMb29wZXI6OkdldE5vd1VzKCkgLSBzdGFydFRpbWUpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gV2FpdCBvbmx5IGZvciAyIHNlY29uZHMgdG8gZGV0ZWN0IGF1ZGlvL3ZpZGVvIHN0cmVhbXMuCi0gICAgICAgIGlmIChBTG9vcGVyOjpHZXROb3dVcygpIC0gc3RhcnRUaW1lID4gMjAwMDAwMGxsKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG9mZjY0X3Qgc2l6ZTsKLSAgICBpZiAobURhdGFTb3VyY2UtPmdldFNpemUoJnNpemUpID09IE9LICYmIChoYXZlQXVkaW8gfHwgaGF2ZVZpZGVvKSkgewotICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBpbXBsID0gaGF2ZVZpZGVvCi0gICAgICAgICAgICAgICAgPyAoQW5vdGhlclBhY2tldFNvdXJjZSAqKW1QYXJzZXItPmdldFNvdXJjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIEFUU1BhcnNlcjo6VklERU8pLmdldCgpCi0gICAgICAgICAgICAgICAgOiAoQW5vdGhlclBhY2tldFNvdXJjZSAqKW1QYXJzZXItPmdldFNvdXJjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIEFUU1BhcnNlcjo6QVVESU8pLmdldCgpOwotICAgICAgICBzaXplX3QgcHJldlN5bmNTaXplID0gMTsKLSAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzID0gLTE7Ci0gICAgICAgIExpc3Q8aW50NjRfdD4gZHVyYXRpb25zOwotICAgICAgICAvLyBFc3RpbWF0ZSBkdXJhdGlvbiAtLS0gc3RhYmlsaXplIHVudGlsIHlvdSBnZXQgPDUwMG1zIGRldmlhdGlvbi4KLSAgICAgICAgd2hpbGUgKGZlZWRNb3JlKCkgPT0gT0sKLSAgICAgICAgICAgICAgICAmJiBBTG9vcGVyOjpHZXROb3dVcygpIC0gc3RhcnRUaW1lIDw9IDIwMDAwMDBsbCkgewotICAgICAgICAgICAgaWYgKG1TZWVrU3luY1BvaW50cy0+c2l6ZSgpID4gcHJldlN5bmNTaXplKSB7Ci0gICAgICAgICAgICAgICAgcHJldlN5bmNTaXplID0gbVNlZWtTeW5jUG9pbnRzLT5zaXplKCk7Ci0gICAgICAgICAgICAgICAgaW50NjRfdCBkaWZmVXMgPSBtU2Vla1N5bmNQb2ludHMtPmtleUF0KHByZXZTeW5jU2l6ZSAtIDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAtIG1TZWVrU3luY1BvaW50cy0+a2V5QXQoMCk7Ci0gICAgICAgICAgICAgICAgb2ZmNjRfdCBkaWZmT2Zmc2V0ID0gbVNlZWtTeW5jUG9pbnRzLT52YWx1ZUF0KHByZXZTeW5jU2l6ZSAtIDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAtIG1TZWVrU3luY1BvaW50cy0+dmFsdWVBdCgwKTsKLSAgICAgICAgICAgICAgICBpbnQ2NF90IGN1cnJlbnREdXJhdGlvblVzID0gc2l6ZSAqIGRpZmZVcyAvIGRpZmZPZmZzZXQ7Ci0gICAgICAgICAgICAgICAgZHVyYXRpb25zLnB1c2hfYmFjayhjdXJyZW50RHVyYXRpb25Vcyk7Ci0gICAgICAgICAgICAgICAgaWYgKGR1cmF0aW9ucy5zaXplKCkgPiA1KSB7Ci0gICAgICAgICAgICAgICAgICAgIGR1cmF0aW9ucy5lcmFzZShkdXJhdGlvbnMuYmVnaW4oKSk7Ci0gICAgICAgICAgICAgICAgICAgIGludDY0X3QgbWluID0gKmR1cmF0aW9ucy5iZWdpbigpOwotICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG1heCA9ICpkdXJhdGlvbnMuYmVnaW4oKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChhdXRvIGR1cmF0aW9uIDogZHVyYXRpb25zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWluID4gZHVyYXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4gPSBkdXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXggPCBkdXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heCA9IGR1cmF0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtYXggLSBtaW4gPCA1MDAgKiAxMDAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvblVzID0gY3VycmVudER1cmF0aW9uVXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzdGF0dXNfdCBlcnI7Ci0gICAgICAgIGludDY0X3QgYnVmZmVyZWREdXJhdGlvblVzOwotICAgICAgICBidWZmZXJlZER1cmF0aW9uVXMgPSBpbXBsLT5nZXRCdWZmZXJlZER1cmF0aW9uVXMoJmVycik7Ci0gICAgICAgIGlmIChlcnIgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgewotICAgICAgICAgICAgZHVyYXRpb25VcyA9IGJ1ZmZlcmVkRHVyYXRpb25VczsKLSAgICAgICAgfQotICAgICAgICBpZiAoZHVyYXRpb25VcyA+IDApIHsKLSAgICAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiBtZXRhID0gaW1wbC0+Z2V0Rm9ybWF0KCk7Ci0gICAgICAgICAgICBtZXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uVXMpOwotICAgICAgICAgICAgaW1wbC0+c2V0Rm9ybWF0KG1ldGEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZXN0aW1hdGVEdXJhdGlvbnNGcm9tVGltZXNVc0F0RW5kKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBBTE9HSSgiaGF2ZUF1ZGlvPSVkLCBoYXZlVmlkZW89JWQsIGVsYXNwZWRUaW1lPSUiIFBSSWQ2NCwKLSAgICAgICAgICAgIGhhdmVBdWRpbywgaGF2ZVZpZGVvLCBBTG9vcGVyOjpHZXROb3dVcygpIC0gc3RhcnRUaW1lKTsKLX0KLQotc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6ZmVlZE1vcmUoYm9vbCBpc0luaXQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgdWludDhfdCBwYWNrZXRba1RTUGFja2V0U2l6ZV07Ci0gICAgc3NpemVfdCBuID0gbURhdGFTb3VyY2UtPnJlYWRBdChtT2Zmc2V0LCBwYWNrZXQsIGtUU1BhY2tldFNpemUpOwotCi0gICAgaWYgKG4gPCAoc3NpemVfdClrVFNQYWNrZXRTaXplKSB7Ci0gICAgICAgIGlmIChuID49IDApIHsKLSAgICAgICAgICAgIG1QYXJzZXItPnNpZ25hbEVPUyhFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKG4gPCAwKSA/IChzdGF0dXNfdCluIDogRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICB9Ci0KLSAgICBBVFNQYXJzZXI6OlN5bmNFdmVudCBldmVudChtT2Zmc2V0KTsKLSAgICBtT2Zmc2V0ICs9IG47Ci0gICAgc3RhdHVzX3QgZXJyID0gbVBhcnNlci0+ZmVlZFRTUGFja2V0KHBhY2tldCwga1RTUGFja2V0U2l6ZSwgJmV2ZW50KTsKLSAgICBpZiAoZXZlbnQuaGFzUmV0dXJuZWREYXRhKCkpIHsKLSAgICAgICAgaWYgKGlzSW5pdCkgewotICAgICAgICAgICAgbUxhc3RTeW5jRXZlbnQgPSBldmVudDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFkZFN5bmNQb2ludF9sKGV2ZW50KTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi12b2lkIE1QRUcyVFNFeHRyYWN0b3I6OmFkZFN5bmNQb2ludF9sKGNvbnN0IEFUU1BhcnNlcjo6U3luY0V2ZW50ICZldmVudCkgewotICAgIGlmICghZXZlbnQuaGFzUmV0dXJuZWREYXRhKCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNvdXJjZUltcGxzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGlmIChtU291cmNlSW1wbHNbaV0uZ2V0KCkgPT0gZXZlbnQuZ2V0TWVkaWFTb3VyY2UoKS5nZXQoKSkgewotICAgICAgICAgICAgS2V5ZWRWZWN0b3I8aW50NjRfdCwgb2ZmNjRfdD4gKnN5bmNQb2ludHMgPSAmbVN5bmNQb2ludHMuZWRpdEl0ZW1BdChpKTsKLSAgICAgICAgICAgIHN5bmNQb2ludHMtPmFkZChldmVudC5nZXRUaW1lVXMoKSwgZXZlbnQuZ2V0T2Zmc2V0KCkpOwotICAgICAgICAgICAgLy8gV2UncmUga2VlcGluZyB0aGUgc2l6ZSBvZiB0aGUgc3luYyBwb2ludHMgYXQgbW9zdCA1bWIgcGVyIGEgdHJhY2suCi0gICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IHN5bmNQb2ludHMtPnNpemUoKTsKLSAgICAgICAgICAgIGlmIChzaXplID49IDMyNzY4MCkgewotICAgICAgICAgICAgICAgIGludDY0X3QgZmlyc3RUaW1lVXMgPSBzeW5jUG9pbnRzLT5rZXlBdCgwKTsKLSAgICAgICAgICAgICAgICBpbnQ2NF90IGxhc3RUaW1lVXMgPSBzeW5jUG9pbnRzLT5rZXlBdChzaXplIC0gMSk7Ci0gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmdldFRpbWVVcygpIC0gZmlyc3RUaW1lVXMgPiBsYXN0VGltZVVzIC0gZXZlbnQuZ2V0VGltZVVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc3luY1BvaW50cy0+cmVtb3ZlSXRlbXNBdCgwLCA0MDk2KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzeW5jUG9pbnRzLT5yZW1vdmVJdGVtc0F0KHNpemUgLSA0MDk2LCA0MDk2KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6ZXN0aW1hdGVEdXJhdGlvbnNGcm9tVGltZXNVc0F0RW5kKCkgIHsKLSAgICBpZiAoIShtRGF0YVNvdXJjZS0+ZmxhZ3MoKSAmIERhdGFTb3VyY2U6OmtJc0xvY2FsRmlsZVNvdXJjZSkpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwotICAgIH0KLQotICAgIG9mZjY0X3Qgc2l6ZSA9IDA7Ci0gICAgc3RhdHVzX3QgZXJyID0gbURhdGFTb3VyY2UtPmdldFNpemUoJnNpemUpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICB1aW50OF90IHBhY2tldFtrVFNQYWNrZXRTaXplXTsKLSAgICBjb25zdCBvZmY2NF90IHplcm8gPSAwOwotICAgIG9mZjY0X3Qgb2Zmc2V0ID0gbWF4KHplcm8sIHNpemUgLSBrTWF4RHVyYXRpb25SZWFkU2l6ZSk7Ci0gICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCAmcGFja2V0LCAwKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgIH0KLQotICAgIGludCByZXRyeSA9IDA7Ci0gICAgYm9vbCBhbGxEdXJhdGlvbnNGb3VuZCA9IGZhbHNlOwotICAgIGludDY0X3QgdGltZUFuY2hvclVzID0gbVBhcnNlci0+Z2V0Rmlyc3RQVFNUaW1lVXMoKTsKLSAgICBkbyB7Ci0gICAgICAgIGludCBieXRlc1JlYWQgPSAwOwotICAgICAgICBzcDxBVFNQYXJzZXI+IHBhcnNlciA9IG5ldyBBVFNQYXJzZXIoQVRTUGFyc2VyOjpUU19USU1FU1RBTVBTX0FSRV9BQlNPTFVURSk7Ci0gICAgICAgIEFUU1BhcnNlcjo6U3luY0V2ZW50IGV2KDApOwotICAgICAgICBvZmZzZXQgPSBtYXgoemVybywgc2l6ZSAtIChrTWF4RHVyYXRpb25SZWFkU2l6ZSA8PCByZXRyeSkpOwotICAgICAgICBvZmZzZXQgPSAob2Zmc2V0IC8ga1RTUGFja2V0U2l6ZSkgKiBrVFNQYWNrZXRTaXplOwotICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICBpZiAoYnl0ZXNSZWFkID49IGtNYXhEdXJhdGlvblJlYWRTaXplIDw8IG1heCgwLCByZXRyeSAtIDEpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNzaXplX3QgbiA9IG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBwYWNrZXQsIGtUU1BhY2tldFNpemUpOwotICAgICAgICAgICAgaWYgKG4gPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG47Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG4gPCAoc3NpemVfdClrVFNQYWNrZXRTaXplKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG9mZnNldCArPSBrVFNQYWNrZXRTaXplOwotICAgICAgICAgICAgYnl0ZXNSZWFkICs9IGtUU1BhY2tldFNpemU7Ci0gICAgICAgICAgICBlcnIgPSBwYXJzZXItPmZlZWRUU1BhY2tldChwYWNrZXQsIGtUU1BhY2tldFNpemUsICZldik7Ci0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGV2Lmhhc1JldHVybmVkRGF0YSgpKSB7Ci0gICAgICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzID0gZXYuZ2V0VGltZVVzKCk7Ci0gICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpTb3VyY2VUeXBlIHR5cGUgPSBldi5nZXRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgZXYucmVzZXQoKTsKLQotICAgICAgICAgICAgICAgIGludDY0X3QgZmlyc3RUaW1lVXM7Ci0gICAgICAgICAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gc3JjID0KLSAgICAgICAgICAgICAgICAgICAgKEFub3RoZXJQYWNrZXRTb3VyY2UgKiltUGFyc2VyLT5nZXRTb3VyY2UodHlwZSkuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNyYyA9PSBOVUxMIHx8IHNyYy0+bmV4dEJ1ZmZlclRpbWUoJmZpcnN0VGltZVVzKSAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZHVyYXRpb25VcyArPSBzcmMtPmdldEVzdGltYXRlZEJ1ZmZlckR1cmF0aW9uVXMoKTsKLSAgICAgICAgICAgICAgICBkdXJhdGlvblVzIC09IHRpbWVBbmNob3JVczsKLSAgICAgICAgICAgICAgICBkdXJhdGlvblVzIC09IGZpcnN0VGltZVVzOwotICAgICAgICAgICAgICAgIGlmIChkdXJhdGlvblVzID4gMCkgewotICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG9yaWdEdXJhdGlvblVzLCBsYXN0RHVyYXRpb25VczsKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+IG1ldGEgPSBzcmMtPmdldEZvcm1hdCgpOwotICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBrS2V5TGFzdER1cmF0aW9uID0gJ2xkdXInOwotICAgICAgICAgICAgICAgICAgICAvLyBSZXF1aXJlIHR3byBjb25zZWN1dGl2ZSBkdXJhdGlvbiBjYWxjdWxhdGlvbnMgdG8gYmUgd2l0aGluIDEgc2VjIGJlZm9yZQotICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGluZzsgdXNlIE1ldGFEYXRhIHRvIHN0b3JlIHByZXZpb3VzIGR1cmF0aW9uIGVzdGltYXRlIGluIHBlci1zdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgLy8gY29udGV4dC4KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtZXRhLT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmb3JpZ0R1cmF0aW9uVXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIW1ldGEtPmZpbmRJbnQ2NChrS2V5TGFzdER1cmF0aW9uLCAmbGFzdER1cmF0aW9uVXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKG9yaWdEdXJhdGlvblVzIDwgZHVyYXRpb25VcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBhYnMoZHVyYXRpb25VcyAtIGxhc3REdXJhdGlvblVzKSA8IDYwMDAwMDAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvblVzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQ2NChrS2V5TGFzdER1cmF0aW9uLCBkdXJhdGlvblVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWFsbER1cmF0aW9uc0ZvdW5kKSB7Ci0gICAgICAgICAgICBhbGxEdXJhdGlvbnNGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICBmb3IgKGF1dG8gdDoge0FUU1BhcnNlcjo6VklERU8sIEFUU1BhcnNlcjo6QVVESU99KSB7Ci0gICAgICAgICAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gc3JjID0gKEFub3RoZXJQYWNrZXRTb3VyY2UgKiltUGFyc2VyLT5nZXRTb3VyY2UodCkuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNyYyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXM7Ci0gICAgICAgICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+IG1ldGEgPSBzcmMtPmdldEZvcm1hdCgpOwotICAgICAgICAgICAgICAgIGlmICghbWV0YS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uVXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFsbER1cmF0aW9uc0ZvdW5kID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgICsrcmV0cnk7Ci0gICAgfSB3aGlsZSghYWxsRHVyYXRpb25zRm91bmQgJiYgb2Zmc2V0ID4gMCAmJiByZXRyeSA8PSBrTWF4RHVyYXRpb25SZXRyeSk7Ci0KLSAgICByZXR1cm4gYWxsRHVyYXRpb25zRm91bmQ/IE9LIDogRVJST1JfVU5TVVBQT1JURUQ7Ci19Ci0KLXVpbnQzMl90IE1QRUcyVFNFeHRyYWN0b3I6OmZsYWdzKCkgY29uc3QgewotICAgIHJldHVybiBDQU5fUEFVU0UgfCBDQU5fU0VFS19CQUNLV0FSRCB8IENBTl9TRUVLX0ZPUldBUkQ7Ci19Ci0KLXN0YXR1c190IE1QRUcyVFNFeHRyYWN0b3I6OnNlZWsoaW50NjRfdCBzZWVrVGltZVVzLAotICAgICAgICBjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlICZzZWVrTW9kZSkgewotICAgIGlmIChtU2Vla1N5bmNQb2ludHMgPT0gTlVMTCB8fCBtU2Vla1N5bmNQb2ludHMtPmlzRW1wdHkoKSkgewotICAgICAgICBBTE9HVygiTm8gc3luYyBwb2ludCB0byBzZWVrIHRvLiIpOwotICAgICAgICAvLyAuLi4gYW5kIHRoZXJlZm9yZSB3ZSBoYXZlIG5vdGhpbmcgdXNlZnVsIHRvIGRvIGhlcmUuCi0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICAvLyBEZXRlcm1pbmUgd2hldGhlciB3ZSdyZSBzZWVraW5nIGJleW9uZCB0aGUga25vd24gYXJlYS4KLSAgICBib29sIHNob3VsZFNlZWtCZXlvbmQgPQotICAgICAgICAgICAgKHNlZWtUaW1lVXMgPiBtU2Vla1N5bmNQb2ludHMtPmtleUF0KG1TZWVrU3luY1BvaW50cy0+c2l6ZSgpIC0gMSkpOwotCi0gICAgLy8gRGV0ZXJtaW5lIHRoZSBzeW5jIHBvaW50IHRvIHNlZWsuCi0gICAgc2l6ZV90IGluZGV4ID0gMDsKLSAgICBmb3IgKDsgaW5kZXggPCBtU2Vla1N5bmNQb2ludHMtPnNpemUoKTsgKytpbmRleCkgewotICAgICAgICBpbnQ2NF90IHRpbWVVcyA9IG1TZWVrU3luY1BvaW50cy0+a2V5QXQoaW5kZXgpOwotICAgICAgICBpZiAodGltZVVzID4gc2Vla1RpbWVVcykgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzd2l0Y2ggKHNlZWtNb2RlKSB7Ci0gICAgICAgIGNhc2UgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX05FWFRfU1lOQzoKLSAgICAgICAgICAgIGlmIChpbmRleCA9PSBtU2Vla1N5bmNQb2ludHMtPnNpemUoKSkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJOZXh0IHN5bmMgbm90IGZvdW5kOyBzdGFydGluZyBmcm9tIHRoZSBsYXRlc3Qgc3luYy4iKTsKLSAgICAgICAgICAgICAgICAtLWluZGV4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1RfU1lOQzoKLSAgICAgICAgY2FzZSBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVDoKLSAgICAgICAgICAgIEFMT0dXKCJzZWVrTW9kZSBub3Qgc3VwcG9ydGVkOiAlZDsgZmFsbGluZyBiYWNrIHRvIFBSRVZJT1VTX1NZTkMiLAotICAgICAgICAgICAgICAgICAgICBzZWVrTW9kZSk7Ci0gICAgICAgICAgICAvLyBmYWxsLXRocm91Z2gKLSAgICAgICAgY2FzZSBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQzoKLSAgICAgICAgICAgIGlmIChpbmRleCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIlByZXZpb3VzIHN5bmMgbm90IGZvdW5kOyBzdGFydGluZyBmcm9tIHRoZSBlYXJsaWVzdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAic3luYy4iKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLS1pbmRleDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpZiAoIXNob3VsZFNlZWtCZXlvbmQgfHwgbU9mZnNldCA8PSBtU2Vla1N5bmNQb2ludHMtPnZhbHVlQXQoaW5kZXgpKSB7Ci0gICAgICAgIGludDY0X3QgYWN0dWFsU2Vla1RpbWVVcyA9IG1TZWVrU3luY1BvaW50cy0+a2V5QXQoaW5kZXgpOwotICAgICAgICBtT2Zmc2V0ID0gbVNlZWtTeW5jUG9pbnRzLT52YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gcXVldWVEaXNjb250aW51aXR5Rm9yU2VlayhhY3R1YWxTZWVrVGltZVVzKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChzaG91bGRTZWVrQmV5b25kKSB7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IHNlZWtCZXlvbmQoc2Vla1RpbWVVcyk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBGYXN0LWZvcndhcmQgdG8gc3luYyBmcmFtZS4KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Tb3VyY2VJbXBscy5zaXplKCk7ICsraSkgewotICAgICAgICBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmaW1wbCA9IG1Tb3VyY2VJbXBsc1tpXTsKLSAgICAgICAgc3RhdHVzX3QgZXJyOwotICAgICAgICBmZWVkVW50aWxCdWZmZXJBdmFpbGFibGUoaW1wbCk7Ci0gICAgICAgIHdoaWxlIChpbXBsLT5oYXNCdWZmZXJBdmFpbGFibGUoJmVycikpIHsKLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtZXRhID0gaW1wbC0+Z2V0TWV0YUFmdGVyTGFzdERlcXVldWVkKDApOwotICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOwotICAgICAgICAgICAgaWYgKG1ldGEgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50MzJfdCBzeW5jOwotICAgICAgICAgICAgaWYgKG1ldGEtPmZpbmRJbnQzMigiaXNTeW5jIiwgJnN5bmMpICYmIHN5bmMpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVyciA9IGltcGwtPmRlcXVldWVBY2Nlc3NVbml0KCZidWZmZXIpOwotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmZWVkVW50aWxCdWZmZXJBdmFpbGFibGUoaW1wbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IE1QRUcyVFNFeHRyYWN0b3I6OnF1ZXVlRGlzY29udGludWl0eUZvclNlZWsoaW50NjRfdCBhY3R1YWxTZWVrVGltZVVzKSB7Ci0gICAgLy8gU2lnbmFsIGRpc2NvbnRpbnVpdHkKLSAgICBzcDxBTWVzc2FnZT4gZXh0cmEobmV3IEFNZXNzYWdlKTsKLSAgICBleHRyYS0+c2V0SW50NjQoSVN0cmVhbUxpc3RlbmVyOjprS2V5TWVkaWFUaW1lVXMsIGFjdHVhbFNlZWtUaW1lVXMpOwotICAgIG1QYXJzZXItPnNpZ25hbERpc2NvbnRpbnVpdHkoQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX1RJTUUsIGV4dHJhKTsKLQotICAgIC8vIEFmdGVyIGRpc2NvbnRpbnVpdHksIGltcGwgc2hvdWxkIG9ubHkgaGF2ZSBkaXNjb250aW51aXRpZXMKLSAgICAvLyB3aXRoIHRoZSBsYXN0IGJlaW5nIHdoYXQgd2UgcXVldWVkLiBEZXF1ZXVlIHRoZW0gYWxsIGhlcmUuCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU291cmNlSW1wbHMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJmltcGwgPSBtU291cmNlSW1wbHMuaXRlbUF0KGkpOwotICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXI7Ci0gICAgICAgIHN0YXR1c190IGVycjsKLSAgICAgICAgd2hpbGUgKGltcGwtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZXJyKSkgewotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlcnIgPSBpbXBsLT5kZXF1ZXVlQWNjZXNzVW5pdCgmYnVmZmVyKTsKLSAgICAgICAgICAgIC8vIElmIHRoZSBzb3VyY2UgY29udGFpbnMgYW55dGhpbmcgYnV0IGRpc2NvbnRpbnVpdHksIHRoYXQncwotICAgICAgICAgICAgLy8gYSBwcm9ncmFtbWluZyBtaXN0YWtlLgotICAgICAgICAgICAgQ0hFQ0soZXJyID09IElORk9fRElTQ09OVElOVUlUWSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBGZWVkIHVudGlsIHdlIGhhdmUgYSBidWZmZXIgZm9yIGVhY2ggc291cmNlLgotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNvdXJjZUltcGxzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZpbXBsID0gbVNvdXJjZUltcGxzLml0ZW1BdChpKTsKLSAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOwotICAgICAgICBzdGF0dXNfdCBlcnIgPSBmZWVkVW50aWxCdWZmZXJBdmFpbGFibGUoaW1wbCk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IE1QRUcyVFNFeHRyYWN0b3I6OnNlZWtCZXlvbmQoaW50NjRfdCBzZWVrVGltZVVzKSB7Ci0gICAgLy8gSWYgd2UncmUgc2Vla2luZyBiZXlvbmQgd2hlcmUgd2Uga25vdyAtLS0gcmVhZCB1bnRpbCB3ZSByZWFjaCB0aGVyZS4KLSAgICBzaXplX3Qgc3luY1BvaW50c1NpemUgPSBtU2Vla1N5bmNQb2ludHMtPnNpemUoKTsKLQotICAgIHdoaWxlIChzZWVrVGltZVVzID4gbVNlZWtTeW5jUG9pbnRzLT5rZXlBdCgKLSAgICAgICAgICAgIG1TZWVrU3luY1BvaW50cy0+c2l6ZSgpIC0gMSkpIHsKLSAgICAgICAgc3RhdHVzX3QgZXJyOwotICAgICAgICBpZiAoc3luY1BvaW50c1NpemUgPCBtU2Vla1N5bmNQb2ludHMtPnNpemUoKSkgewotICAgICAgICAgICAgc3luY1BvaW50c1NpemUgPSBtU2Vla1N5bmNQb2ludHMtPnNpemUoKTsKLSAgICAgICAgICAgIGludDY0X3Qgc3luY1RpbWVVcyA9IG1TZWVrU3luY1BvaW50cy0+a2V5QXQoc3luY1BvaW50c1NpemUgLSAxKTsKLSAgICAgICAgICAgIC8vIERlcXVldWUgYnVmZmVycyBiZWZvcmUgc3luYyBwb2ludCBpbiBvcmRlciB0byBhdm9pZCB0b28gbXVjaAotICAgICAgICAgICAgLy8gY2FjaGUgYnVpbGRpbmcgdXAuCi0gICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXI7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Tb3VyY2VJbXBscy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgICAgIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZpbXBsID0gbVNvdXJjZUltcGxzW2ldOwotICAgICAgICAgICAgICAgIGludDY0X3QgdGltZVVzOwotICAgICAgICAgICAgICAgIHdoaWxlICgoZXJyID0gaW1wbC0+bmV4dEJ1ZmZlclRpbWUoJnRpbWVVcykpID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0aW1lVXMgPCBzeW5jVGltZVVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbXBsLT5kZXF1ZXVlQWNjZXNzVW5pdCgmYnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0sgJiYgZXJyICE9IC1FV09VTERCTE9DSykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoZmVlZE1vcmUoKSAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IE1QRUcyVFNFeHRyYWN0b3I6OmZlZWRVbnRpbEJ1ZmZlckF2YWlsYWJsZSgKLSAgICAgICAgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJmltcGwpIHsKLSAgICBzdGF0dXNfdCBmaW5hbFJlc3VsdDsKLSAgICB3aGlsZSAoIWltcGwtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZmluYWxSZXN1bHQpKSB7Ci0gICAgICAgIGlmIChmaW5hbFJlc3VsdCAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGZpbmFsUmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdHVzX3QgZXJyID0gZmVlZE1vcmUoKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgaW1wbC0+c2lnbmFsRU9TKGVycik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1ib29sIFNuaWZmTVBFRzJUUygKLSAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlLAotICAgICAgICBzcDxBTWVzc2FnZT4gKikgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgKytpKSB7Ci0gICAgICAgIGNoYXIgaGVhZGVyOwotICAgICAgICBpZiAoc291cmNlLT5yZWFkQXQoa1RTUGFja2V0U2l6ZSAqIGksICZoZWFkZXIsIDEpICE9IDEKLSAgICAgICAgICAgICAgICB8fCBoZWFkZXIgIT0gMHg0NykgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgKmNvbmZpZGVuY2UgPSAwLjFmOwotICAgIG1pbWVUeXBlLT5zZXRUbyhNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzJUUyk7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214LmNwcAppbmRleCBmZTUwNjU2Li40ZTJkMzk4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXguY3BwCkBAIC0yNCw3ICsyNCw3IEBACiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT214R3JhcGhpY0J1ZmZlclNvdXJjZS5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XT214Tm9kZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV09teE9ic2VydmVyLmg+CkBAIC0xNDgsNyArMTQ4LDcgQEAKIFJldHVybjx2b2lkPiBPbXg6OmNyZWF0ZUlucHV0U3VyZmFjZShjcmVhdGVJbnB1dFN1cmZhY2VfY2IgX2hpZGxfY2IpIHsKICAgICBzcDw6OmFuZHJvaWQ6OklHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGJ1ZmZlclByb2R1Y2VyOwogCi0gICAgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4gZ3JhcGhpY0J1ZmZlclNvdXJjZSA9IG5ldyBHcmFwaGljQnVmZmVyU291cmNlKCk7CisgICAgc3A8T214R3JhcGhpY0J1ZmZlclNvdXJjZT4gZ3JhcGhpY0J1ZmZlclNvdXJjZSA9IG5ldyBPbXhHcmFwaGljQnVmZmVyU291cmNlKCk7CiAgICAgc3RhdHVzX3QgZXJyID0gZ3JhcGhpY0J1ZmZlclNvdXJjZS0+aW5pdENoZWNrKCk7CiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIHBlcnNpc3RlbnQgaW5wdXQgc3VyZmFjZTogIgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NDk5ZGMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJXR3JhcGhpY0J1ZmZlclByb2R1Y2VyLWltcGwiCi0KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XUHJvZHVjZXJMaXN0ZW5lci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvQ29udmVyc2lvbi5oPgotI2luY2x1ZGUgPHN5c3RlbS93aW5kb3cuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGhhcmR3YXJlIHsKLW5hbWVzcGFjZSBtZWRpYSB7Ci1uYW1lc3BhY2Ugb214IHsKLW5hbWVzcGFjZSBWMV8wIHsKLW5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7Ci0KLS8vIFRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyCi1UV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjo6VFdHcmFwaGljQnVmZmVyUHJvZHVjZXIoCi0gICAgICAgIHNwPEJHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGNvbnN0JiBiYXNlKToKLSAgICBtQmFzZShiYXNlKSB7Ci19Ci0KLVJldHVybjx2b2lkPiBUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjo6cmVxdWVzdEJ1ZmZlcigKLSAgICAgICAgaW50MzJfdCBzbG90LCByZXF1ZXN0QnVmZmVyX2NiIF9oaWRsX2NiKSB7Ci0gICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmOwotICAgIHN0YXR1c190IHN0YXR1cyA9IG1CYXNlLT5yZXF1ZXN0QnVmZmVyKHNsb3QsICZidWYpOwotICAgIEFud0J1ZmZlciBhbndCdWZmZXI7Ci0gICAgaWYgKGJ1ZiAhPSBudWxscHRyKSB7Ci0gICAgICAgIHdyYXBBcygmYW53QnVmZmVyLCAqYnVmKTsKLSAgICB9Ci0gICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSwgYW53QnVmZmVyKTsKLSAgICByZXR1cm4gVm9pZCgpOwotfQotCi1SZXR1cm48aW50MzJfdD4gVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI6OnNldE1heERlcXVldWVkQnVmZmVyQ291bnQoCi0gICAgICAgIGludDMyX3QgbWF4RGVxdWV1ZWRCdWZmZXJzKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KG1CYXNlLT5zZXRNYXhEZXF1ZXVlZEJ1ZmZlckNvdW50KAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihtYXhEZXF1ZXVlZEJ1ZmZlcnMpKSk7Ci19Ci0KLVJldHVybjxpbnQzMl90PiBUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjo6c2V0QXN5bmNNb2RlKGJvb2wgYXN5bmMpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4obUJhc2UtPnNldEFzeW5jTW9kZShhc3luYykpOwotfQotCi1SZXR1cm48dm9pZD4gVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmRlcXVldWVCdWZmZXIoCi0gICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsCi0gICAgICAgIFBpeGVsRm9ybWF0IGZvcm1hdCwgdWludDMyX3QgdXNhZ2UsCi0gICAgICAgIGJvb2wgZ2V0RnJhbWVUaW1lc3RhbXBzLCBkZXF1ZXVlQnVmZmVyX2NiIF9oaWRsX2NiKSB7Ci0gICAgaW50IHNsb3Q7Ci0gICAgc3A8RmVuY2U+IGZlbmNlOwotICAgIDo6YW5kcm9pZDo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YSBvdXRUaW1lc3RhbXBzOwotICAgIHN0YXR1c190IHN0YXR1cyA9IG1CYXNlLT5kZXF1ZXVlQnVmZmVyKAotICAgICAgICAmc2xvdCwgJmZlbmNlLCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICBzdGF0aWNfY2FzdDw6OmFuZHJvaWQ6OlBpeGVsRm9ybWF0Pihmb3JtYXQpLCB1c2FnZSwgbnVsbHB0ciwKLSAgICAgICAgZ2V0RnJhbWVUaW1lc3RhbXBzID8gJm91dFRpbWVzdGFtcHMgOiBudWxscHRyKTsKLSAgICBoaWRsX2hhbmRsZSB0RmVuY2U7Ci0gICAgRnJhbWVFdmVudEhpc3RvcnlEZWx0YSB0T3V0VGltZXN0YW1wczsKLQotICAgIG5hdGl2ZV9oYW5kbGVfdCogbmggPSBudWxscHRyOwotICAgIGlmICgoZmVuY2UgPT0gbnVsbHB0cikgfHwgIXdyYXBBcygmdEZlbmNlLCAmbmgsICpmZW5jZSkpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmRlcXVldWVCdWZmZXIgLSAiCi0gICAgICAgICAgICAgICAgIkludmFsaWQgb3V0cHV0IGZlbmNlIjsKLSAgICAgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSwKLSAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oc2xvdCksCi0gICAgICAgICAgICAgICAgIHRGZW5jZSwKLSAgICAgICAgICAgICAgICAgdE91dFRpbWVzdGFtcHMpOwotICAgICAgICByZXR1cm4gVm9pZCgpOwotICAgIH0KLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiA+IG5oQUE7Ci0gICAgaWYgKGdldEZyYW1lVGltZXN0YW1wcyAmJiAhd3JhcEFzKCZ0T3V0VGltZXN0YW1wcywgJm5oQUEsIG91dFRpbWVzdGFtcHMpKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIlRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpkZXF1ZXVlQnVmZmVyIC0gIgotICAgICAgICAgICAgICAgICJJbnZhbGlkIG91dHB1dCB0aW1lc3RhbXBzIjsKLSAgICAgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSwKLSAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oc2xvdCksCi0gICAgICAgICAgICAgICAgIHRGZW5jZSwKLSAgICAgICAgICAgICAgICAgdE91dFRpbWVzdGFtcHMpOwotICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShuaCk7Ci0gICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgfQotCi0gICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHNsb3QpLAotICAgICAgICAgICAgdEZlbmNlLAotICAgICAgICAgICAgdE91dFRpbWVzdGFtcHMpOwotICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG5oKTsKLSAgICBpZiAoZ2V0RnJhbWVUaW1lc3RhbXBzKSB7Ci0gICAgICAgIGZvciAoYXV0byYgbmhBIDogbmhBQSkgewotICAgICAgICAgICAgZm9yIChhdXRvJiBoYW5kbGUgOiBuaEEpIHsKLSAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoYW5kbGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBWb2lkKCk7Ci19Ci0KLVJldHVybjxpbnQzMl90PiBUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjo6ZGV0YWNoQnVmZmVyKGludDMyX3Qgc2xvdCkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PihtQmFzZS0+ZGV0YWNoQnVmZmVyKHNsb3QpKTsKLX0KLQotUmV0dXJuPHZvaWQ+IFRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpkZXRhY2hOZXh0QnVmZmVyKAotICAgICAgICBkZXRhY2hOZXh0QnVmZmVyX2NiIF9oaWRsX2NiKSB7Ci0gICAgc3A8R3JhcGhpY0J1ZmZlcj4gb3V0QnVmZmVyOwotICAgIHNwPEZlbmNlPiBvdXRGZW5jZTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQmFzZS0+ZGV0YWNoTmV4dEJ1ZmZlcigmb3V0QnVmZmVyLCAmb3V0RmVuY2UpOwotICAgIEFud0J1ZmZlciB0QnVmZmVyOwotICAgIGhpZGxfaGFuZGxlIHRGZW5jZTsKLQotICAgIGlmIChvdXRCdWZmZXIgPT0gbnVsbHB0cikgewotICAgICAgICBMT0coRVJST1IpIDw8ICJUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjo6ZGV0YWNoTmV4dEJ1ZmZlciAtICIKLSAgICAgICAgICAgICAgICAiSW52YWxpZCBvdXRwdXQgYnVmZmVyIjsKLSAgICAgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSwgdEJ1ZmZlciwgdEZlbmNlKTsKLSAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICB9Ci0gICAgd3JhcEFzKCZ0QnVmZmVyLCAqb3V0QnVmZmVyKTsKLSAgICBuYXRpdmVfaGFuZGxlX3QqIG5oID0gbnVsbHB0cjsKLSAgICBpZiAoKG91dEZlbmNlICE9IG51bGxwdHIpICYmICF3cmFwQXMoJnRGZW5jZSwgJm5oLCAqb3V0RmVuY2UpKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIlRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpkZXRhY2hOZXh0QnVmZmVyIC0gIgotICAgICAgICAgICAgICAgICJJbnZhbGlkIG91dHB1dCBmZW5jZSI7Ci0gICAgICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cyksIHRCdWZmZXIsIHRGZW5jZSk7Ci0gICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgfQotCi0gICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSwgdEJ1ZmZlciwgdEZlbmNlKTsKLSAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShuaCk7Ci0gICAgcmV0dXJuIFZvaWQoKTsKLX0KLQotUmV0dXJuPHZvaWQ+IFRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjphdHRhY2hCdWZmZXIoCi0gICAgICAgIGNvbnN0IEFud0J1ZmZlciYgYnVmZmVyLAotICAgICAgICBhdHRhY2hCdWZmZXJfY2IgX2hpZGxfY2IpIHsKLSAgICBpbnQgb3V0U2xvdDsKLSAgICBzcDxHcmFwaGljQnVmZmVyPiBsQnVmZmVyID0gbmV3IEdyYXBoaWNCdWZmZXIoKTsKLSAgICBpZiAoIWNvbnZlcnRUbyhsQnVmZmVyLmdldCgpLCBidWZmZXIpKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIlRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjphdHRhY2hCdWZmZXIgLSAiCi0gICAgICAgICAgICAgICAgIkludmFsaWQgaW5wdXQgbmF0aXZlIHdpbmRvdyBidWZmZXIiOwotICAgICAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxpbnQzMl90PihCQURfVkFMVUUpLCAtMSk7Ci0gICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgfQotICAgIHN0YXR1c190IHN0YXR1cyA9IG1CYXNlLT5hdHRhY2hCdWZmZXIoJm91dFNsb3QsIGxCdWZmZXIpOwotCi0gICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSwgc3RhdGljX2Nhc3Q8aW50MzJfdD4ob3V0U2xvdCkpOwotICAgIHJldHVybiBWb2lkKCk7Ci19Ci0KLVJldHVybjx2b2lkPiBUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjo6cXVldWVCdWZmZXIoCi0gICAgICAgIGludDMyX3Qgc2xvdCwgY29uc3QgUXVldWVCdWZmZXJJbnB1dCYgaW5wdXQsCi0gICAgICAgIHF1ZXVlQnVmZmVyX2NiIF9oaWRsX2NiKSB7Ci0gICAgUXVldWVCdWZmZXJPdXRwdXQgdE91dHB1dDsKLSAgICBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0IGxJbnB1dCgKLSAgICAgICAgICAgIDAsIGZhbHNlLCBIQUxfREFUQVNQQUNFX1VOS05PV04sCi0gICAgICAgICAgICA6OmFuZHJvaWQ6OlJlY3QoMCwgMCwgMSwgMSksCi0gICAgICAgICAgICBOQVRJVkVfV0lORE9XX1NDQUxJTkdfTU9ERV9GUkVFWkUsCi0gICAgICAgICAgICAwLCA6OmFuZHJvaWQ6OkZlbmNlOjpOT19GRU5DRSk7Ci0gICAgaWYgKCFjb252ZXJ0VG8oJmxJbnB1dCwgaW5wdXQpKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIlRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpxdWV1ZUJ1ZmZlciAtICIKLSAgICAgICAgICAgICAgICAiSW52YWxpZCBpbnB1dCI7Ci0gICAgICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PGludDMyX3Q+KEJBRF9WQUxVRSksIHRPdXRwdXQpOwotICAgICAgICByZXR1cm4gVm9pZCgpOwotICAgIH0KLSAgICBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dCBsT3V0cHV0OwotICAgIHN0YXR1c190IHN0YXR1cyA9IG1CYXNlLT5xdWV1ZUJ1ZmZlcigKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oc2xvdCksIGxJbnB1dCwgJmxPdXRwdXQpOwotCi0gICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4gPiBuaEFBOwotICAgIGlmICghd3JhcEFzKCZ0T3V0cHV0LCAmbmhBQSwgbE91dHB1dCkpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI6OnF1ZXVlQnVmZmVyIC0gIgotICAgICAgICAgICAgICAgICJJbnZhbGlkIG91dHB1dCI7Ci0gICAgICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PGludDMyX3Q+KEJBRF9WQUxVRSksIHRPdXRwdXQpOwotICAgICAgICByZXR1cm4gVm9pZCgpOwotICAgIH0KLQotICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cyksIHRPdXRwdXQpOwotICAgIGZvciAoYXV0byYgbmhBIDogbmhBQSkgewotICAgICAgICBmb3IgKGF1dG8mIG5oIDogbmhBKSB7Ci0gICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShuaCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFZvaWQoKTsKLX0KLQotUmV0dXJuPGludDMyX3Q+IFRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpjYW5jZWxCdWZmZXIoCi0gICAgICAgIGludDMyX3Qgc2xvdCwgY29uc3QgaGlkbF9oYW5kbGUmIGZlbmNlKSB7Ci0gICAgc3A8RmVuY2U+IGxGZW5jZSA9IG5ldyBGZW5jZSgpOwotICAgIGlmICghY29udmVydFRvKGxGZW5jZS5nZXQoKSwgZmVuY2UpKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIlRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpjYW5jZWxCdWZmZXIgLSAiCi0gICAgICAgICAgICAgICAgIkludmFsaWQgaW5wdXQgZmVuY2UiOwotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4oQkFEX1ZBTFVFKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KG1CYXNlLT5jYW5jZWxCdWZmZXIoc3RhdGljX2Nhc3Q8aW50PihzbG90KSwgbEZlbmNlKSk7Ci19Ci0KLVJldHVybjx2b2lkPiBUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjo6cXVlcnkoaW50MzJfdCB3aGF0LCBxdWVyeV9jYiBfaGlkbF9jYikgewotICAgIGludCBsVmFsdWU7Ci0gICAgaW50IGxSZXR1cm4gPSBtQmFzZS0+cXVlcnkoc3RhdGljX2Nhc3Q8aW50Pih3aGF0KSwgJmxWYWx1ZSk7Ci0gICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4obFJldHVybiksIHN0YXRpY19jYXN0PGludDMyX3Q+KGxWYWx1ZSkpOwotICAgIHJldHVybiBWb2lkKCk7Ci19Ci0KLVJldHVybjx2b2lkPiBUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjo6Y29ubmVjdCgKLSAgICAgICAgY29uc3Qgc3A8SFByb2R1Y2VyTGlzdGVuZXI+JiBsaXN0ZW5lciwKLSAgICAgICAgaW50MzJfdCBhcGksIGJvb2wgcHJvZHVjZXJDb250cm9sbGVkQnlBcHAsIGNvbm5lY3RfY2IgX2hpZGxfY2IpIHsKLSAgICBzcDxCUHJvZHVjZXJMaXN0ZW5lcj4gbExpc3RlbmVyID0gbGlzdGVuZXIgPT0gbnVsbHB0ciA/Ci0gICAgICAgICAgICBudWxscHRyIDogbmV3IExXUHJvZHVjZXJMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQgbE91dHB1dDsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQmFzZS0+Y29ubmVjdChsTGlzdGVuZXIsCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGFwaSksCi0gICAgICAgICAgICBwcm9kdWNlckNvbnRyb2xsZWRCeUFwcCwKLSAgICAgICAgICAgICZsT3V0cHV0KTsKLQotICAgIFF1ZXVlQnVmZmVyT3V0cHV0IHRPdXRwdXQ7Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4gPiBuaEFBOwotICAgIGlmICghd3JhcEFzKCZ0T3V0cHV0LCAmbmhBQSwgbE91dHB1dCkpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmNvbm5lY3QgLSAiCi0gICAgICAgICAgICAgICAgIkludmFsaWQgb3V0cHV0IjsKLSAgICAgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSwgdE91dHB1dCk7Ci0gICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgfQotCi0gICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSwgdE91dHB1dCk7Ci0gICAgZm9yIChhdXRvJiBuaEEgOiBuaEFBKSB7Ci0gICAgICAgIGZvciAoYXV0byYgbmggOiBuaEEpIHsKLSAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG5oKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gVm9pZCgpOwotfQotCi1SZXR1cm48aW50MzJfdD4gVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmRpc2Nvbm5lY3QoCi0gICAgICAgIGludDMyX3QgYXBpLCBEaXNjb25uZWN0TW9kZSBtb2RlKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KG1CYXNlLT5kaXNjb25uZWN0KAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihhcGkpLAotICAgICAgICAgICAgdG9HdWlEaXNjb25uZWN0TW9kZShtb2RlKSkpOwotfQotCi1SZXR1cm48aW50MzJfdD4gVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI6OnNldFNpZGViYW5kU3RyZWFtKGNvbnN0IGhpZGxfaGFuZGxlJiBzdHJlYW0pIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4obUJhc2UtPnNldFNpZGViYW5kU3RyZWFtKE5hdGl2ZUhhbmRsZTo6Y3JlYXRlKAotICAgICAgICAgICAgc3RyZWFtID8gbmF0aXZlX2hhbmRsZV9jbG9uZShzdHJlYW0pIDogTlVMTCwgdHJ1ZSkpKTsKLX0KLQotUmV0dXJuPHZvaWQ+IFRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjphbGxvY2F0ZUJ1ZmZlcnMoCi0gICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIFBpeGVsRm9ybWF0IGZvcm1hdCwgdWludDMyX3QgdXNhZ2UpIHsKLSAgICBtQmFzZS0+YWxsb2NhdGVCdWZmZXJzKAotICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PDo6YW5kcm9pZDo6UGl4ZWxGb3JtYXQ+KGZvcm1hdCksCi0gICAgICAgICAgICB1c2FnZSk7Ci0gICAgcmV0dXJuIFZvaWQoKTsKLX0KLQotUmV0dXJuPGludDMyX3Q+IFRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjphbGxvd0FsbG9jYXRpb24oYm9vbCBhbGxvdykgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PihtQmFzZS0+YWxsb3dBbGxvY2F0aW9uKGFsbG93KSk7Ci19Ci0KLVJldHVybjxpbnQzMl90PiBUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjo6c2V0R2VuZXJhdGlvbk51bWJlcih1aW50MzJfdCBnZW5lcmF0aW9uTnVtYmVyKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KG1CYXNlLT5zZXRHZW5lcmF0aW9uTnVtYmVyKGdlbmVyYXRpb25OdW1iZXIpKTsKLX0KLQotUmV0dXJuPHZvaWQ+IFRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpnZXRDb25zdW1lck5hbWUoZ2V0Q29uc3VtZXJOYW1lX2NiIF9oaWRsX2NiKSB7Ci0gICAgX2hpZGxfY2IobUJhc2UtPmdldENvbnN1bWVyTmFtZSgpLnN0cmluZygpKTsKLSAgICByZXR1cm4gVm9pZCgpOwotfQotCi1SZXR1cm48aW50MzJfdD4gVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI6OnNldFNoYXJlZEJ1ZmZlck1vZGUoYm9vbCBzaGFyZWRCdWZmZXJNb2RlKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KG1CYXNlLT5zZXRTaGFyZWRCdWZmZXJNb2RlKHNoYXJlZEJ1ZmZlck1vZGUpKTsKLX0KLQotUmV0dXJuPGludDMyX3Q+IFRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpzZXRBdXRvUmVmcmVzaChib29sIGF1dG9SZWZyZXNoKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KG1CYXNlLT5zZXRBdXRvUmVmcmVzaChhdXRvUmVmcmVzaCkpOwotfQotCi1SZXR1cm48aW50MzJfdD4gVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI6OnNldERlcXVldWVUaW1lb3V0KGludDY0X3QgdGltZW91dE5zKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KG1CYXNlLT5zZXREZXF1ZXVlVGltZW91dCh0aW1lb3V0TnMpKTsKLX0KLQotUmV0dXJuPHZvaWQ+IFRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpnZXRMYXN0UXVldWVkQnVmZmVyKAotICAgICAgICBnZXRMYXN0UXVldWVkQnVmZmVyX2NiIF9oaWRsX2NiKSB7Ci0gICAgc3A8R3JhcGhpY0J1ZmZlcj4gbE91dEJ1ZmZlciA9IG5ldyBHcmFwaGljQnVmZmVyKCk7Ci0gICAgc3A8RmVuY2U+IGxPdXRGZW5jZSA9IG5ldyBGZW5jZSgpOwotICAgIGZsb2F0IGxPdXRUcmFuc2Zvcm1NYXRyaXhbMTZdOwotICAgIHN0YXR1c190IHN0YXR1cyA9IG1CYXNlLT5nZXRMYXN0UXVldWVkQnVmZmVyKAotICAgICAgICAgICAgJmxPdXRCdWZmZXIsICZsT3V0RmVuY2UsIGxPdXRUcmFuc2Zvcm1NYXRyaXgpOwotCi0gICAgQW53QnVmZmVyIHRPdXRCdWZmZXI7Ci0gICAgaWYgKGxPdXRCdWZmZXIgIT0gbnVsbHB0cikgewotICAgICAgICB3cmFwQXMoJnRPdXRCdWZmZXIsICpsT3V0QnVmZmVyKTsKLSAgICB9Ci0gICAgaGlkbF9oYW5kbGUgdE91dEZlbmNlOwotICAgIG5hdGl2ZV9oYW5kbGVfdCogbmggPSBudWxscHRyOwotICAgIGlmICgobE91dEZlbmNlID09IG51bGxwdHIpIHx8ICF3cmFwQXMoJnRPdXRGZW5jZSwgJm5oLCAqbE91dEZlbmNlKSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjo6Z2V0TGFzdFF1ZXVlZEJ1ZmZlciAtICIKLSAgICAgICAgICAgICAgICAiSW52YWxpZCBvdXRwdXQgZmVuY2UiOwotICAgICAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpLAotICAgICAgICAgICAgICAgIHRPdXRCdWZmZXIsCi0gICAgICAgICAgICAgICAgdE91dEZlbmNlLAotICAgICAgICAgICAgICAgIGhpZGxfYXJyYXk8ZmxvYXQsIDE2PigpKTsKLSAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICB9Ci0gICAgaGlkbF9hcnJheTxmbG9hdCwgMTY+IHRPdXRUcmFuc2Zvcm1NYXRyaXgobE91dFRyYW5zZm9ybU1hdHJpeCk7Ci0KLSAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpLCB0T3V0QnVmZmVyLCB0T3V0RmVuY2UsIHRPdXRUcmFuc2Zvcm1NYXRyaXgpOwotICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG5oKTsKLSAgICByZXR1cm4gVm9pZCgpOwotfQotCi1SZXR1cm48dm9pZD4gVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmdldEZyYW1lVGltZXN0YW1wcygKLSAgICAgICAgZ2V0RnJhbWVUaW1lc3RhbXBzX2NiIF9oaWRsX2NiKSB7Ci0gICAgOjphbmRyb2lkOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhIGxEZWx0YTsKLSAgICBtQmFzZS0+Z2V0RnJhbWVUaW1lc3RhbXBzKCZsRGVsdGEpOwotCi0gICAgRnJhbWVFdmVudEhpc3RvcnlEZWx0YSB0RGVsdGE7Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4gPiBuaEFBOwotICAgIGlmICghd3JhcEFzKCZ0RGVsdGEsICZuaEFBLCBsRGVsdGEpKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIlRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpnZXRGcmFtZVRpbWVzdGFtcHMgLSAiCi0gICAgICAgICAgICAgICAgIkludmFsaWQgb3V0cHV0IGZyYW1lIHRpbWVzdGFtcHMiOwotICAgICAgICBfaGlkbF9jYih0RGVsdGEpOwotICAgICAgICByZXR1cm4gVm9pZCgpOwotICAgIH0KLQotICAgIF9oaWRsX2NiKHREZWx0YSk7Ci0gICAgZm9yIChhdXRvJiBuaEEgOiBuaEFBKSB7Ci0gICAgICAgIGZvciAoYXV0byYgbmggOiBuaEEpIHsKLSAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG5oKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gVm9pZCgpOwotfQotCi1SZXR1cm48dm9pZD4gVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmdldFVuaXF1ZUlkKGdldFVuaXF1ZUlkX2NiIF9oaWRsX2NiKSB7Ci0gICAgdWludDY0X3Qgb3V0SWQ7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbUJhc2UtPmdldFVuaXF1ZUlkKCZvdXRJZCk7Ci0gICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSwgb3V0SWQpOwotICAgIHJldHVybiBWb2lkKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgotfSAgLy8gbmFtZXNwYWNlIFYxXzAKLX0gIC8vIG5hbWVzcGFjZSBvbXgKLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmNwcAppbmRleCAzMjAxYzMyLi5lZDI3MmJiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmNwcApAQCAtNzksOSArNzksOSBAQAogfTsKIAogc3RydWN0IFRXR3JhcGhpY0J1ZmZlclNvdXJjZTo6VFdPbXhCdWZmZXJTb3VyY2UgOiBwdWJsaWMgSU9teEJ1ZmZlclNvdXJjZSB7Ci0gICAgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4gbVNvdXJjZTsKKyAgICBzcDxPbXhHcmFwaGljQnVmZmVyU291cmNlPiBtU291cmNlOwogCi0gICAgVFdPbXhCdWZmZXJTb3VyY2UoY29uc3Qgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4gJnNvdXJjZSk6IG1Tb3VyY2Uoc291cmNlKSB7CisgICAgVFdPbXhCdWZmZXJTb3VyY2UoY29uc3Qgc3A8T214R3JhcGhpY0J1ZmZlclNvdXJjZT4gJnNvdXJjZSk6IG1Tb3VyY2Uoc291cmNlKSB7CiAgICAgfQogCiAgICAgUmV0dXJuPHZvaWQ+IG9uT214RXhlY3V0aW5nKCkgb3ZlcnJpZGUgewpAQCAtMTE1LDcgKzExNSw3IEBACiAKIC8vIFRXR3JhcGhpY0J1ZmZlclNvdXJjZQogVFdHcmFwaGljQnVmZmVyU291cmNlOjpUV0dyYXBoaWNCdWZmZXJTb3VyY2UoCi0gICAgICAgIHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+IGNvbnN0JiBiYXNlKSA6CisgICAgICAgIHNwPE9teEdyYXBoaWNCdWZmZXJTb3VyY2U+IGNvbnN0JiBiYXNlKSA6CiAgICAgbUJhc2UoYmFzZSksCiAgICAgbU9teEJ1ZmZlclNvdXJjZShuZXcgVFdPbXhCdWZmZXJTb3VyY2UoYmFzZSkpIHsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV1Byb2R1Y2VyTGlzdGVuZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XUHJvZHVjZXJMaXN0ZW5lci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYzNhYTEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XUHJvZHVjZXJMaXN0ZW5lci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV1Byb2R1Y2VyTGlzdGVuZXIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGhhcmR3YXJlIHsKLW5hbWVzcGFjZSBtZWRpYSB7Ci1uYW1lc3BhY2Ugb214IHsKLW5hbWVzcGFjZSBWMV8wIHsKLW5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7Ci0KLS8vIFRXUHJvZHVjZXJMaXN0ZW5lcgotVFdQcm9kdWNlckxpc3RlbmVyOjpUV1Byb2R1Y2VyTGlzdGVuZXIoCi0gICAgICAgIHNwPEJQcm9kdWNlckxpc3RlbmVyPiBjb25zdCYgYmFzZSk6Ci0gICAgbUJhc2UoYmFzZSkgewotfQotCi1SZXR1cm48dm9pZD4gVFdQcm9kdWNlckxpc3RlbmVyOjpvbkJ1ZmZlclJlbGVhc2VkKCkgewotICAgIG1CYXNlLT5vbkJ1ZmZlclJlbGVhc2VkKCk7Ci0gICAgcmV0dXJuIFZvaWQoKTsKLX0KLQotUmV0dXJuPGJvb2w+IFRXUHJvZHVjZXJMaXN0ZW5lcjo6bmVlZHNSZWxlYXNlTm90aWZ5KCkgewotICAgIHJldHVybiBtQmFzZS0+bmVlZHNSZWxlYXNlTm90aWZ5KCk7Ci19Ci0KLS8vIExXUHJvZHVjZXJMaXN0ZW5lcgotTFdQcm9kdWNlckxpc3RlbmVyOjpMV1Byb2R1Y2VyTGlzdGVuZXIoCi0gICAgICAgIHNwPEhQcm9kdWNlckxpc3RlbmVyPiBjb25zdCYgYmFzZSk6Ci0gICAgbUJhc2UoYmFzZSkgewotfQotCi12b2lkIExXUHJvZHVjZXJMaXN0ZW5lcjo6b25CdWZmZXJSZWxlYXNlZCgpIHsKLSAgICBtQmFzZS0+b25CdWZmZXJSZWxlYXNlZCgpOwotfQotCi1ib29sIExXUHJvZHVjZXJMaXN0ZW5lcjo6bmVlZHNSZWxlYXNlTm90aWZ5KCkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxib29sPihtQmFzZS0+bmVlZHNSZWxlYXNlTm90aWZ5KCkpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KLX0gIC8vIG5hbWVzcGFjZSBWMV8wCi19ICAvLyBuYW1lc3BhY2Ugb214Ci19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLX0gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQuYnAKaW5kZXggZDRjZGY2OS4uM2U2OTQyYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQuYnAKQEAgLTYsMTQgKzYsMTEgQEAKICAgICB9LAogCiAgICAgc3JjczogWwotICAgICAgICAiRnJhbWVEcm9wcGVyLmNwcCIsCi0gICAgICAgICJHcmFwaGljQnVmZmVyU291cmNlLmNwcCIsCiAgICAgICAgICJCV0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwIiwKLSAgICAgICAgIk9NWC5jcHAiLAotICAgICAgICAiT01YU3RvcmUuY3BwIiwKICAgICAgICAgIk9NWE1hc3Rlci5jcHAiLAogICAgICAgICAiT01YTm9kZUluc3RhbmNlLmNwcCIsCiAgICAgICAgICJPTVhVdGlscy5jcHAiLAorICAgICAgICAiT214R3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAiLAogICAgICAgICAiU2ltcGxlU29mdE9NWENvbXBvbmVudC5jcHAiLAogICAgICAgICAiU29mdE9NWENvbXBvbmVudC5jcHAiLAogICAgICAgICAiU29mdE9NWFBsdWdpbi5jcHAiLApAQCAtMjEsOCArMTgsNiBAQAogICAgICAgICAiU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5jcHAiLAogICAgICAgICAiMS4wL09teC5jcHAiLAogICAgICAgICAiMS4wL09teFN0b3JlLmNwcCIsCi0gICAgICAgICIxLjAvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5jcHAiLAotICAgICAgICAiMS4wL1dQcm9kdWNlckxpc3RlbmVyLmNwcCIsCiAgICAgICAgICIxLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwIiwKICAgICAgICAgIjEuMC9XT214Tm9kZS5jcHAiLAogICAgICAgICAiMS4wL1dPbXhPYnNlcnZlci5jcHAiLApAQCAtNTEsMjUgKzQ2LDIzIEBACiAgICAgICAgICJsaWJndWkiLAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycXVldWVfaGVscGVyIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3htbHBhcnNlciIsCiAgICAgICAgICJsaWJkbCIsCiAgICAgICAgICJsaWJoaWRsYmFzZSIsCiAgICAgICAgICJsaWJoaWRsbWVtb3J5IiwKICAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAogICAgICAgICAibGlibmF0aXZld2luZG93IiwgLy8gVE9ETyhiLzYyOTIzNDc5KTogdXNlIGhlYWRlciBsaWJyYXJ5Ci0gICAgICAgICJhbmRyb2lkLmhpZGwubWVtb3J5QDEuMCIsCi0gICAgICAgICJhbmRyb2lkLmhpZGwudG9rZW5AMS4wLXV0aWxzIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWFAMS4wIiwKKyAgICAgICAgImxpYnZuZGtzdXBwb3J0IiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmNvbW1vbkAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5idWZmZXJxdWV1ZUAxLjAiLAogICAgIF0sCiAKICAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCi0gICAgICAgICJhbmRyb2lkLmhpZGwubWVtb3J5QDEuMCIsCiAgICAgICAgICJsaWJtZWRpYV9vbXgiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF94bWxwYXJzZXIiLAorICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCiAKICAgICBjZmxhZ3M6IFsKQEAgLTEwOSw2ICsxMDIsNyBAQAogICAgIF0sCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYm1lZGlhX29teCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgXSwKICAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCkBAIC0xMjQsNiArMTE4LDcgQEAKICAgICAgICAgICAgIGNmaTogdHJ1ZSwKICAgICAgICAgfSwKICAgICB9LAorICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIl0sCiB9CiAKIC8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0JXR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQldHcmFwaGljQnVmZmVyU291cmNlLmNwcAppbmRleCA5NGVmNTk4Li5mYTMwYTQ2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQldHcmFwaGljQnVmZmVyU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQldHcmFwaGljQnVmZmVyU291cmNlLmNwcApAQCAtNTUsOSArNTUsOSBAQAogfTsKIAogc3RydWN0IEJXR3JhcGhpY0J1ZmZlclNvdXJjZTo6QldPTVhCdWZmZXJTb3VyY2UgOiBwdWJsaWMgQm5PTVhCdWZmZXJTb3VyY2UgewotICAgIHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+IG1Tb3VyY2U7CisgICAgc3A8T214R3JhcGhpY0J1ZmZlclNvdXJjZT4gbVNvdXJjZTsKIAotICAgIEJXT01YQnVmZmVyU291cmNlKGNvbnN0IHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+ICZzb3VyY2UpOiBtU291cmNlKHNvdXJjZSkgeworICAgIEJXT01YQnVmZmVyU291cmNlKGNvbnN0IHNwPE9teEdyYXBoaWNCdWZmZXJTb3VyY2U+ICZzb3VyY2UpOiBtU291cmNlKHNvdXJjZSkgewogICAgIH0KIAogICAgIFN0YXR1cyBvbk9teEV4ZWN1dGluZygpIG92ZXJyaWRlIHsKQEAgLTgzLDcgKzgzLDcgQEAKIH07CiAKIEJXR3JhcGhpY0J1ZmZlclNvdXJjZTo6QldHcmFwaGljQnVmZmVyU291cmNlKAotICAgICAgICBzcDxHcmFwaGljQnVmZmVyU291cmNlPiBjb25zdCYgYmFzZSkgOgorICAgICAgICBzcDxPbXhHcmFwaGljQnVmZmVyU291cmNlPiBjb25zdCYgYmFzZSkgOgogICAgIG1CYXNlKGJhc2UpLAogICAgIG1PTVhCdWZmZXJTb3VyY2UobmV3IEJXT01YQnVmZmVyU291cmNlKGJhc2UpKSB7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvRnJhbWVEcm9wcGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9GcmFtZURyb3BwZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzUwYzU4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9GcmFtZURyb3BwZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiRnJhbWVEcm9wcGVyIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L0ZyYW1lRHJvcHBlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RhdGljIGNvbnN0IGludDY0X3Qga01heEppdHRlclVzID0gMjAwMDsKLQotRnJhbWVEcm9wcGVyOjpGcmFtZURyb3BwZXIoKQotICAgIDogbURlc2lyZWRNaW5UaW1lVXMoLTEpLAotICAgICAgbU1pbkludGVydmFsVXMoMCkgewotfQotCi1GcmFtZURyb3BwZXI6On5GcmFtZURyb3BwZXIoKSB7Ci19Ci0KLXN0YXR1c190IEZyYW1lRHJvcHBlcjo6c2V0TWF4RnJhbWVSYXRlKGZsb2F0IG1heEZyYW1lUmF0ZSkgewotICAgIGlmIChtYXhGcmFtZVJhdGUgPD0gMCkgewotICAgICAgICBBTE9HRSgiZnJhbWVyYXRlIHNob3VsZCBiZSBwb3NpdGl2ZSBidXQgZ290ICVmLiIsIG1heEZyYW1lUmF0ZSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIG1NaW5JbnRlcnZhbFVzID0gKGludDY0X3QpICgxMDAwMDAwLjBmIC8gbWF4RnJhbWVSYXRlKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLWJvb2wgRnJhbWVEcm9wcGVyOjpzaG91bGREcm9wKGludDY0X3QgdGltZVVzKSB7Ci0gICAgaWYgKG1NaW5JbnRlcnZhbFVzIDw9IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmIChtRGVzaXJlZE1pblRpbWVVcyA8IDApIHsKLSAgICAgICAgbURlc2lyZWRNaW5UaW1lVXMgPSB0aW1lVXMgKyBtTWluSW50ZXJ2YWxVczsKLSAgICAgICAgQUxPR1YoImZpcnN0IGZyYW1lICVsbGQsIG5leHQgZGVzaXJlZCBmcmFtZSAlbGxkIiwKLSAgICAgICAgICAgICAgICAobG9uZyBsb25nKXRpbWVVcywgKGxvbmcgbG9uZyltRGVzaXJlZE1pblRpbWVVcyk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAodGltZVVzIDwgKG1EZXNpcmVkTWluVGltZVVzIC0ga01heEppdHRlclVzKSkgewotICAgICAgICBBTE9HVigiZHJvcCBmcmFtZSAlbGxkLCBkZXNpcmVkIGZyYW1lICVsbGQsIGRpZmYgJWxsZCIsCi0gICAgICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lVXMsIChsb25nIGxvbmcpbURlc2lyZWRNaW5UaW1lVXMsCi0gICAgICAgICAgICAgICAgKGxvbmcgbG9uZykobURlc2lyZWRNaW5UaW1lVXMgLSB0aW1lVXMpKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgaW50NjRfdCBuID0gKHRpbWVVcyAtIG1EZXNpcmVkTWluVGltZVVzICsga01heEppdHRlclVzKSAvIG1NaW5JbnRlcnZhbFVzOwotICAgIG1EZXNpcmVkTWluVGltZVVzICs9IChuICsgMSkgKiBtTWluSW50ZXJ2YWxVczsKLSAgICBBTE9HVigia2VlcCBmcmFtZSAlbGxkLCBuZXh0IGRlc2lyZWQgZnJhbWUgJWxsZCwgZGlmZiAlbGxkIiwKLSAgICAgICAgICAgIChsb25nIGxvbmcpdGltZVVzLCAobG9uZyBsb25nKW1EZXNpcmVkTWluVGltZVVzLAotICAgICAgICAgICAgKGxvbmcgbG9uZykobURlc2lyZWRNaW5UaW1lVXMgLSB0aW1lVXMpKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MTdkMmEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTMzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0KLSNkZWZpbmUgTE9HX1RBRyAiR3JhcGhpY0J1ZmZlclNvdXJjZSIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2RlZmluZSBTVFJJTkdJRllfRU5VTVMgLy8gZm9yIGFzU3RyaW5nIGluIEhhcmR3YXJlQVBJLmgvVmlkZW9BUEkuaAotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvRnJhbWVEcm9wcGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9GaWxlRGVzY3JpcHRvci5oPgotCi0jaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvTWV0YWRhdGFCdWZmZXJUeXBlLmg+Ci0jaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgotI2luY2x1ZGUgPGd1aS9CdWZmZXJJdGVtLmg+Ci0jaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KLSNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9Db21wb25lbnQuaD4KLSNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9JbmRleEV4dC5oPgotI2luY2x1ZGUgPG1lZGlhL09NWEJ1ZmZlci5oPgotCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLQotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPGNtYXRoPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8qKgotICogQSBjb3BpYWJsZSBvYmplY3QgbWFuYWdpbmcgYSBidWZmZXIgaW4gdGhlIGJ1ZmZlciBjYWNoZSBtYW5hZ2VkIGJ5IHRoZSBwcm9kdWNlci4gVGhpcyBvYmplY3QKLSAqIGhvbGRzIGEgcmVmZXJlbmNlIHRvIHRoZSBidWZmZXIsIGFuZCBtYWludGFpbnMgd2hpY2ggYnVmZmVyIHNsb3QgaXQgYmVsb25ncyB0byAoaWYgYW55KSwgYW5kCi0gKiB3aGV0aGVyIGl0IGlzIHN0aWxsIGluIGEgYnVmZmVyIHNsb3QuIEl0IGFsc28gbWFpbnRhaW5zIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBvdXRzdGFuZ2luZyBhY3F1aXJlCi0gKiByZWZlcmVuY2VzIHRvIGl0IChieSBidWZmZXJzIGFjcXVpcmVkIGZyb20gdGhlIHNsb3QpIG1haW5seSBzbyB0aGF0IHdlIGNhbiBrZWVwIGEgZGVidWcKLSAqIGNvdW50IG9mIGhvdyBtYW55IGJ1ZmZlcnMgd2UgbmVlZCB0byBzdGlsbCByZWxlYXNlIGJhY2sgdG8gdGhlIHByb2R1Y2VyLgotICovCi1zdHJ1Y3QgR3JhcGhpY0J1ZmZlclNvdXJjZTo6Q2FjaGVkQnVmZmVyIHsKLSAgICAvKioKLSAgICAgKiBUb2tlbiB0aGF0IGlzIHVzZWQgdG8gdHJhY2sgYWNxdWlyZSBjb3VudHMgKGFzIG9wcG9zZWQgdG8gYWxsIHJlZmVyZW5jZXMgdG8gdGhpcyBvYmplY3QpLgotICAgICAqLwotICAgIHN0cnVjdCBBY3F1aXJhYmxlIHsgfTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSB1c2luZyBhIGJ1ZmZlciBjYWNoZWQgaW4gYSBzbG90LgotICAgICAqLwotICAgIENhY2hlZEJ1ZmZlcihzbG90X2lkIHNsb3QsIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+ICZncmFwaGljQnVmZmVyKQotICAgICAgICA6IG1Jc0NhY2hlZCh0cnVlKSwKLSAgICAgICAgICBtU2xvdChzbG90KSwKLSAgICAgICAgICBtR3JhcGhpY0J1ZmZlcihncmFwaGljQnVmZmVyKSwKLSAgICAgICAgICBtQWNxdWlyYWJsZShzdGQ6Om1ha2Vfc2hhcmVkPEFjcXVpcmFibGU+KCkpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjYWNoZSBzbG90IHRoYXQgdGhpcyBidWZmZXIgaXMgY2FjaGVkIGluLCBvciAtMSBpZiBpdCBpcyBubyBsb25nZXIgY2FjaGVkLgotICAgICAqCi0gICAgICogVGhpcyBhc3N1bWVzIHRoYXQgLTEgc2xvdCBpZCBpcyBpbnZhbGlkOyB0aG91Z2gsIGl0IGlzIGp1c3QgYSBiZW5pZ24gY29sbGlzaW9uIHVzZWQgZm9yCi0gICAgICogZGVidWdnaW5nLiBUaGlzIG9iamVjdCBleHBsaWNpdGx5IG1hbmFnZXMgd2hldGhlciBpdCBpcyBzdGlsbCBjYWNoZWQuCi0gICAgICovCi0gICAgc2xvdF9pZCBnZXRTbG90KCkgY29uc3QgewotICAgICAgICByZXR1cm4gbUlzQ2FjaGVkID8gbVNsb3QgOiAtMTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjYWNoZWQgYnVmZmVyLgotICAgICAqLwotICAgIHNwPEdyYXBoaWNCdWZmZXI+IGdldEdyYXBoaWNCdWZmZXIoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtR3JhcGhpY0J1ZmZlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGlzIGJ1ZmZlciBpcyBzdGlsbCBpbiB0aGUgYnVmZmVyIGNhY2hlLgotICAgICAqLwotICAgIGJvb2wgaXNDYWNoZWQoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtSXNDYWNoZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhpcyBidWZmZXIgaGFzIGFuIGFjcXVpcmVkIHJlZmVyZW5jZS4KLSAgICAgKi8KLSAgICBib29sIGlzQWNxdWlyZWQoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtQWNxdWlyYWJsZS51c2VfY291bnQoKSA+IDE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhbmQgcmV0dXJucyBhIHNoYXJlZCBhY3F1aXJlZCByZWZlcmVuY2UuCi0gICAgICovCi0gICAgc3RkOjpzaGFyZWRfcHRyPEFjcXVpcmFibGU+IGdldEFjcXVpcmFibGUoKSB7Ci0gICAgICAgIHJldHVybiBtQWNxdWlyYWJsZTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIHZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6ZGlzY2FyZEJ1ZmZlckF0U2xvdEluZGV4X2woc3NpemVfdCk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB0byBiZSBjYWxsZWQgd2hlbiB0aGUgYnVmZmVyIGlzIG5vIGxvbmdlciBpbiB0aGUgYnVmZmVyIGNhY2hlLgotICAgICAqIENhbGxlZCBmcm9tIGRpc2NhcmRCdWZmZXJBdFNsb3RJbmRleF9sLgotICAgICAqLwotICAgIHZvaWQgb25Ecm9wcGVkRnJvbUNhY2hlKCkgewotICAgICAgICBDSEVDS19EQkcobUlzQ2FjaGVkKTsKLSAgICAgICAgbUlzQ2FjaGVkID0gZmFsc2U7Ci0gICAgfQotCi0gICAgYm9vbCBtSXNDYWNoZWQ7Ci0gICAgc2xvdF9pZCBtU2xvdDsKLSAgICBzcDxHcmFwaGljQnVmZmVyPiBtR3JhcGhpY0J1ZmZlcjsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8QWNxdWlyYWJsZT4gbUFjcXVpcmFibGU7Ci19OwotCi0vKioKLSAqIEEgY29waWFibGUgb2JqZWN0IG1hbmFnaW5nIGEgYnVmZmVyIGFjcXVpcmVkIGZyb20gdGhlIHByb2R1Y2VyLiBUaGlzIG11c3QgYWx3YXlzIGJlIGEgY2FjaGVkCi0gKiBidWZmZXIuIFRoaXMgb2JqZWN0cyBhbHNvIG1hbmFnZXMgaXRzIGFjcXVpcmUgZmVuY2UgYW5kIGFueSByZWxlYXNlIGZlbmNlcyB0aGF0IG1heSBiZSByZXR1cm5lZAotICogYnkgdGhlIGVuY29kZXIgZm9yIHRoaXMgYnVmZmVyICh0aGlzIGJ1ZmZlciBtYXkgYmUgcXVldWVkIHRvIHRoZSBlbmNvZGVyIG11bHRpcGxlIHRpbWVzKS4KLSAqIElmIG5vIHJlbGVhc2UgZmVuY2VzIGFyZSBhZGRlZCBieSB0aGUgZW5jb2RlciwgdGhlIGFjcXVpcmUgZmVuY2UgaXMgcmV0dXJuZWQgYXMgdGhlIHJlbGVhc2UKLSAqIGZlbmNlIGZvciB0aGlzIC0gYXMgaXQgaXMgYXNzdW1lZCB0aGF0IG5vb25lIHdhaXRlZCBmb3IgdGhlIGFjcXVpcmUgZmVuY2UuIE90aGVyd2lzZSwgaXQgaXMKLSAqIGFzc3VtZWQgdGhhdCB0aGUgZW5jb2RlciBoYXMgd2FpdGVkIGZvciB0aGUgYWNxdWlyZSBmZW5jZSAob3IgcmV0dXJuZWQgaXQgYXMgdGhlIHJlbGVhc2UKLSAqIGZlbmNlKS4KLSAqLwotc3RydWN0IEdyYXBoaWNCdWZmZXJTb3VyY2U6OkFjcXVpcmVkQnVmZmVyIHsKLSAgICBBY3F1aXJlZEJ1ZmZlcigKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDYWNoZWRCdWZmZXI+ICZidWZmZXIsCi0gICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQWNxdWlyZWRCdWZmZXIgKik+IG9uUmVsZWFzZWQsCi0gICAgICAgICAgICBjb25zdCBzcDxGZW5jZT4gJmFjcXVpcmVGZW5jZSkKLSAgICAgICAgOiBtQnVmZmVyKGJ1ZmZlciksCi0gICAgICAgICAgbUFjcXVpcmFibGUoYnVmZmVyLT5nZXRBY3F1aXJhYmxlKCkpLAotICAgICAgICAgIG1BY3F1aXJlRmVuY2UoYWNxdWlyZUZlbmNlKSwKLSAgICAgICAgICBtR290UmVsZWFzZUZlbmNlcyhmYWxzZSksCi0gICAgICAgICAgbU9uUmVsZWFzZWQob25SZWxlYXNlZCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSByZWxlYXNlIGZlbmNlIHJldHVybmVkIGJ5IHRoZSBlbmNvZGVyIHRvIHRoaXMgb2JqZWN0LiBJZiB0aGlzIGlzIGNhbGxlZCB3aXRoIGFuCi0gICAgICogdmFsaWQgZmlsZSBkZXNjcmlwdG9yLCBpdCBpcyBhZGRlZCB0byB0aGUgbGlzdCBvZiByZWxlYXNlIGZlbmNlcy4gVGhlc2UgYXJlIHJldHVybmVkIHRvIHRoZQotICAgICAqIHByb2R1Y2VyIG9uIHJlbGVhc2UoKSBhcyBhIG1lcmdlZCBmZW5jZS4gUmVnYXJkbGVzcyBvZiB0aGUgdmFsaWRpdHkgb2YgdGhlIGZpbGUgZGVzY3JpcHRvciwKLSAgICAgKiB3ZSB0YWtlIG5vdGUgdGhhdCBhIHJlbGVhc2UgZmVuY2Ugd2FzIGF0dGVtcHRlZCB0byBiZSBhZGRlZCBhbmQgdGhlIGFjcXVpcmUgZmVuY2UgY2FuIG5vdyBiZQotICAgICAqIGFzc3VtZWQgYXMgYWNxdWlyZWQuCi0gICAgICovCi0gICAgdm9pZCBhZGRSZWxlYXNlRmVuY2VGZChpbnQgZmVuY2VGZCkgewotICAgICAgICAvLyBzYXZlIGFsbCByZWxlYXNlIGZlbmNlcyAtIHRoZXNlIHdpbGwgYmUgcHJvcGFnYXRlZCB0byB0aGUgcHJvZHVjZXIgaWYgdGhpcyBidWZmZXIgaXMKLSAgICAgICAgLy8gZXZlciByZWxlYXNlZCB0byBpdAotICAgICAgICBpZiAoZmVuY2VGZCA+PSAwKSB7Ci0gICAgICAgICAgICBtUmVsZWFzZUZlbmNlRmRzLnB1c2hfYmFjayhmZW5jZUZkKTsKLSAgICAgICAgfQotICAgICAgICBtR290UmVsZWFzZUZlbmNlcyA9IHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYWNxdWlyZSBmZW5jZSBmaWxlIGRlc2NyaXB0b3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgb2JqZWN0LgotICAgICAqLwotICAgIGludCBnZXRBY3F1aXJlRmVuY2VGZCgpIHsKLSAgICAgICAgaWYgKG1BY3F1aXJlRmVuY2UgPT0gbnVsbHB0ciB8fCAhbUFjcXVpcmVGZW5jZS0+aXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1BY3F1aXJlRmVuY2UtPmR1cCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgYnVmZmVyIGlzIHN0aWxsIGluIHRoZSBidWZmZXIgY2FjaGUuCi0gICAgICovCi0gICAgYm9vbCBpc0NhY2hlZCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1CdWZmZXItPmlzQ2FjaGVkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYWNxdWlyZWQgYnVmZmVyLgotICAgICAqLwotICAgIHNwPEdyYXBoaWNCdWZmZXI+IGdldEdyYXBoaWNCdWZmZXIoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtQnVmZmVyLT5nZXRHcmFwaGljQnVmZmVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2xvdCB0aGF0IHRoaXMgYnVmZmVyIGlzIGNhY2hlZCBhdCwgb3IgLTEgb3RoZXJ3aXNlLgotICAgICAqCi0gICAgICogVGhpcyBhc3N1bWVzIHRoYXQgLTEgc2xvdCBpZCBpcyBpbnZhbGlkOyB0aG91Z2gsIGl0IGlzIGp1c3QgYSBiZW5pZ24gY29sbGlzaW9uIHVzZWQgZm9yCi0gICAgICogZGVidWdnaW5nLiBUaGlzIG9iamVjdCBleHBsaWNpdGx5IG1hbmFnZXMgd2hldGhlciBpdCBpcyBzdGlsbCBjYWNoZWQuCi0gICAgICovCi0gICAgc2xvdF9pZCBnZXRTbG90KCkgY29uc3QgewotICAgICAgICByZXR1cm4gbUJ1ZmZlci0+Z2V0U2xvdCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSByZWxlYXNlIGZlbmNlIG9iamVjdCBmcm9tIHRoZSBhY3F1aXJlIGZlbmNlIGFuZC9vciBhbnkgcmVsZWFzZSBmZW5jZXMKLSAgICAgKiBhZGRlZC4gSWYgbm8gcmVsZWFzZSBmZW5jZXMgd2VyZSBhZGRlZCAoZXZlbiBpZiBpbnZhbGlkKSwgcmV0dXJucyB0aGUgYWNxdWlyZSBmZW5jZS4KLSAgICAgKiBPdGhlcndpc2UsIGl0IHJldHVybnMgYSBtZXJnZWQgZmVuY2UgZnJvbSBhbGwgdGhlIHZhbGlkIHJlbGVhc2UgZmVuY2VzIGFkZGVkLgotICAgICAqLwotICAgIHNwPEZlbmNlPiBnZXRSZWxlYXNlRmVuY2UoKSB7Ci0gICAgICAgIC8vIElmIGRpZCBub3QgcmVjZWl2ZSByZWxlYXNlIGZlbmNlcywgd2UgYXNzdW1lIHRoaXMgYnVmZmVyIHdhcyBub3QgY29uc3VtZWQgKGl0IHdhcwotICAgICAgICAvLyBkaXNjYXJkZWQgb3IgZHJvcHBlZCkuIEluIHRoaXMgY2FzZSByZWxlYXNlIHRoZSBhY3F1aXJlIGZlbmNlIGFzIHRoZSByZWxlYXNlIGZlbmNlLgotICAgICAgICAvLyBXZSBkbyB0aGlzIGhlcmUgdG8gYXZvaWQgYSBkdXAsIGNsb3NlIGFuZCByZWNyZWF0aW9uIG9mIHRoZSBGZW5jZSBvYmplY3QuCi0gICAgICAgIGlmICghbUdvdFJlbGVhc2VGZW5jZXMpIHsKLSAgICAgICAgICAgIHJldHVybiBtQWNxdWlyZUZlbmNlOwotICAgICAgICB9Ci0gICAgICAgIHNwPEZlbmNlPiByZXQgPSBnZXRSZWxlYXNlRmVuY2UoMCwgbVJlbGVhc2VGZW5jZUZkcy5zaXplKCkpOwotICAgICAgICAvLyBjbGVhciBmZHMgYXMgZmVuY2UgdG9vayBvd25lcnNoaXAgb2YgdGhlbQotICAgICAgICBtUmVsZWFzZUZlbmNlRmRzLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgLy8gdGhpcyB2aWRlbyBidWZmZXIgaXMgbm8gbG9uZ2VyIHJlZmVyZW5jZWQgYnkgdGhlIGNvZGVjIChvciBrZXB0IGZvciBsYXRlciBlbmNvZGluZykKLSAgICAvLyBpdCBpcyBub3cgc2FmZSB0byByZWxlYXNlIHRvIHRoZSBwcm9kdWNlcgotICAgIH5BY3F1aXJlZEJ1ZmZlcigpIHsKLSAgICAgICAgLy9tQWNxdWlyYWJsZS5jbGVhcigpOwotICAgICAgICBtT25SZWxlYXNlZCh0aGlzKTsKLSAgICAgICAgLy8gbU9uUmVsZWFzZSBtZXRob2Qgc2hvdWxkIGNhbGwgZ2V0UmVsZWFzZUZlbmNlKCkgdGhhdCByZWxlYXNlcyBhbGwgZmRzIGJ1dCBqdXN0IGluIGNhc2UKLSAgICAgICAgQUxPR1dfSUYoIW1SZWxlYXNlRmVuY2VGZHMuZW1wdHkoKSwgInJlbGVhc2UgZmVuY2VzIHdlcmUgbm90IG9idGFpbmVkLCBjbG9zaW5nIGZkcyIpOwotICAgICAgICBmb3IgKGludCBmaWxkZXMgOiBtUmVsZWFzZUZlbmNlRmRzKSB7Ci0gICAgICAgICAgICA6OmNsb3NlKGZpbGRlcyk7Ci0gICAgICAgICAgICBUUkVTUEFTU19EQkcoKTsKLSAgICAgICAgfQotICAgIH0KLQotcHJpdmF0ZToKLSAgICBzdGQ6OnNoYXJlZF9wdHI8R3JhcGhpY0J1ZmZlclNvdXJjZTo6Q2FjaGVkQnVmZmVyPiBtQnVmZmVyOwotICAgIHN0ZDo6c2hhcmVkX3B0cjxHcmFwaGljQnVmZmVyU291cmNlOjpDYWNoZWRCdWZmZXI6OkFjcXVpcmFibGU+IG1BY3F1aXJhYmxlOwotICAgIHNwPEZlbmNlPiBtQWNxdWlyZUZlbmNlOwotICAgIFZlY3RvcjxpbnQ+IG1SZWxlYXNlRmVuY2VGZHM7Ci0gICAgYm9vbCBtR290UmVsZWFzZUZlbmNlczsKLSAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQWNxdWlyZWRCdWZmZXIgKik+IG1PblJlbGVhc2VkOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIHJlbGVhc2UgZmVuY2UgZnJvbSAwIG9yIG1vcmUgcmVsZWFzZSBmZW5jZSBmaWxlIGRlc2NyaXB0b3JzIGluIGZyb20KLSAgICAgKiB0aGUgc3BlY2lmaWVkIHJhbmdlIGluIHRoZSBhcnJheS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdGFydCBzdGFydCBpbmRleAotICAgICAqIEBwYXJhbSBudW0gICBudW1iZXIgb2YgcmVsZWFzZSBmZHMgdG8gbWVyZ2UKLSAgICAgKi8KLSAgICBzcDxGZW5jZT4gZ2V0UmVsZWFzZUZlbmNlKHNpemVfdCBzdGFydCwgc2l6ZV90IG51bSkgY29uc3QgewotICAgICAgICBpZiAobnVtID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBGZW5jZTo6Tk9fRkVOQ0U7Ci0gICAgICAgIH0gZWxzZSBpZiAobnVtID09IDEpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRmVuY2UobVJlbGVhc2VGZW5jZUZkc1tzdGFydF0pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIEZlbmNlOjptZXJnZSgiR0JTOjpBQiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlbGVhc2VGZW5jZShzdGFydCwgbnVtID4+IDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRSZWxlYXNlRmVuY2Uoc3RhcnQgKyAobnVtID4+IDEpLCBudW0gLSAobnVtID4+IDEpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19OwotCi1HcmFwaGljQnVmZmVyU291cmNlOjpHcmFwaGljQnVmZmVyU291cmNlKCkgOgotICAgIG1Jbml0Q2hlY2soVU5LTk9XTl9FUlJPUiksCi0gICAgbU51bUF2YWlsYWJsZVVuYWNxdWlyZWRCdWZmZXJzKDApLAotICAgIG1OdW1PdXRzdGFuZGluZ0FjcXVpcmVzKDApLAotICAgIG1FbmRPZlN0cmVhbShmYWxzZSksCi0gICAgbUVuZE9mU3RyZWFtU2VudChmYWxzZSksCi0gICAgbUxhc3REYXRhc3BhY2UoSEFMX0RBVEFTUEFDRV9VTktOT1dOKSwKLSAgICBtRXhlY3V0aW5nKGZhbHNlKSwKLSAgICBtU3VzcGVuZGVkKGZhbHNlKSwKLSAgICBtTGFzdEZyYW1lVGltZXN0YW1wVXMoLTEpLAotICAgIG1TdG9wVGltZVVzKC0xKSwKLSAgICBtTGFzdEFjdGlvblRpbWVVcygtMWxsKSwKLSAgICBtU2tpcEZyYW1lc0JlZm9yZU5zKC0xbGwpLAotICAgIG1GcmFtZVJlcGVhdEludGVydmFsVXMoLTFsbCksCi0gICAgbVJlcGVhdExhc3RGcmFtZUdlbmVyYXRpb24oMCksCi0gICAgbU91dHN0YW5kaW5nRnJhbWVSZXBlYXRDb3VudCgwKSwKLSAgICBtRnJhbWVSZXBlYXRCbG9ja2VkT25Db2RlY0J1ZmZlcihmYWxzZSksCi0gICAgbUZwcygtMS4wKSwKLSAgICBtQ2FwdHVyZUZwcygtMS4wKSwKLSAgICBtQmFzZUNhcHR1cmVVcygtMWxsKSwKLSAgICBtQmFzZUZyYW1lVXMoLTFsbCksCi0gICAgbUZyYW1lQ291bnQoMCksCi0gICAgbVByZXZDYXB0dXJlVXMoLTFsbCksCi0gICAgbVByZXZGcmFtZVVzKC0xbGwpLAotICAgIG1JbnB1dEJ1ZmZlclRpbWVPZmZzZXRVcygwbGwpIHsKLSAgICBBTE9HVigiR3JhcGhpY0J1ZmZlclNvdXJjZSIpOwotCi0gICAgU3RyaW5nOCBuYW1lKCJHcmFwaGljQnVmZmVyU291cmNlIik7Ci0KLSAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJm1Qcm9kdWNlciwgJm1Db25zdW1lcik7Ci0gICAgbUNvbnN1bWVyLT5zZXRDb25zdW1lck5hbWUobmFtZSk7Ci0KLSAgICAvLyBOb3RlIHRoYXQgd2UgY2FuJ3QgY3JlYXRlIGFuIHNwPC4uLj4odGhpcykgaW4gYSBjdG9yIHRoYXQgd2lsbCBub3Qga2VlcCBhCi0gICAgLy8gcmVmZXJlbmNlIG9uY2UgdGhlIGN0b3IgZW5kcywgYXMgdGhhdCB3b3VsZCBjYXVzZSB0aGUgcmVmY291bnQgb2YgJ3RoaXMnCi0gICAgLy8gZHJvcHBpbmcgdG8gMCBhdCB0aGUgZW5kIG9mIHRoZSBjdG9yLiAgU2luY2UgYWxsIHdlIG5lZWQgaXMgYSB3cDwuLi4+Ci0gICAgLy8gdGhhdCdzIHdoYXQgd2UgY3JlYXRlLgotICAgIHdwPEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyPiBsaXN0ZW5lciA9Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxCdWZmZXJRdWV1ZTo6Q29uc3VtZXJMaXN0ZW5lcio+KHRoaXMpOwotICAgIHNwPElDb25zdW1lckxpc3RlbmVyPiBwcm94eSA9Ci0gICAgICAgICAgICBuZXcgQnVmZmVyUXVldWU6OlByb3h5Q29uc3VtZXJMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLSAgICBtSW5pdENoZWNrID0gbUNvbnN1bWVyLT5jb25zdW1lckNvbm5lY3QocHJveHksIGZhbHNlKTsKLSAgICBpZiAobUluaXRDaGVjayAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiRXJyb3IgY29ubmVjdGluZyB0byBCdWZmZXJRdWV1ZTogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgc3RyZXJyb3IoLW1Jbml0Q2hlY2spLCBtSW5pdENoZWNrKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1lbXNldCgmbURlZmF1bHRDb2xvckFzcGVjdHNQYWNrZWQsIDAsIHNpemVvZihtRGVmYXVsdENvbG9yQXNwZWN0c1BhY2tlZCkpOwotCi0gICAgQ0hFQ0sobUluaXRDaGVjayA9PSBOT19FUlJPUik7Ci19Ci0KLUdyYXBoaWNCdWZmZXJTb3VyY2U6On5HcmFwaGljQnVmZmVyU291cmNlKCkgewotICAgIEFMT0dWKCJ+R3JhcGhpY0J1ZmZlclNvdXJjZSIpOwotICAgIHsKLSAgICAgICAgLy8gYWxsIGFjcXVpcmVkIGJ1ZmZlcnMgbXVzdCBiZSBmcmVlZCB3aXRoIHRoZSBtdXRleCBsb2NrZWQgb3RoZXJ3aXNlIG91ciBkZWJ1ZyBhc3NlcnRpb24KLSAgICAgICAgLy8gbWF5IHRyaWdnZXIKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7Ci0gICAgICAgIG1BdmFpbGFibGVCdWZmZXJzLmNsZWFyKCk7Ci0gICAgICAgIG1TdWJtaXR0ZWRDb2RlY0J1ZmZlcnMuY2xlYXIoKTsKLSAgICAgICAgbUxhdGVzdEJ1ZmZlci5tQnVmZmVyLnJlc2V0KCk7Ci0gICAgfQotCi0gICAgaWYgKG1OdW1PdXRzdGFuZGluZ0FjcXVpcmVzICE9IDApIHsKLSAgICAgICAgQUxPR1coInBvdGVudGlhbCBidWZmZXIgbGVhazogYWNxdWlyZWQ9JWQiLCBtTnVtT3V0c3RhbmRpbmdBY3F1aXJlcyk7Ci0gICAgICAgIFRSRVNQQVNTX0RCRygpOwotICAgIH0KLSAgICBpZiAobUNvbnN1bWVyICE9IE5VTEwpIHsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbUNvbnN1bWVyLT5jb25zdW1lckRpc2Nvbm5lY3QoKTsKLSAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgQUxPR1coImNvbnN1bWVyRGlzY29ubmVjdCBmYWlsZWQ6ICVkIiwgZXJyKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotU3RhdHVzIEdyYXBoaWNCdWZmZXJTb3VyY2U6Om9uT214RXhlY3V0aW5nKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOwotICAgIEFMT0dWKCItLT4gZXhlY3V0aW5nOyBhdmFpbGFibGU9JXp1LCBzdWJtaXR0YWJsZT0lemQiLAotICAgICAgICAgICAgbUF2YWlsYWJsZUJ1ZmZlcnMuc2l6ZSgpLCBtRnJlZUNvZGVjQnVmZmVycy5zaXplKCkpOwotICAgIENIRUNLKCFtRXhlY3V0aW5nKTsKLSAgICBtRXhlY3V0aW5nID0gdHJ1ZTsKLSAgICBtTGFzdERhdGFzcGFjZSA9IEhBTF9EQVRBU1BBQ0VfVU5LTk9XTjsKLSAgICBBTE9HVigiY2xlYXJpbmcgbGFzdCBkYXRhU3BhY2UiKTsKLQotICAgIC8vIFN0YXJ0IGJ5IGxvYWRpbmcgdXAgYXMgbWFueSBidWZmZXJzIGFzIHBvc3NpYmxlLiAgV2Ugd2FudCB0byBkbyB0aGlzLAotICAgIC8vIHJhdGhlciB0aGFuIGp1c3Qgc3VibWl0IHRoZSBmaXJzdCBidWZmZXIsIHRvIGF2b2lkIGEgZGVnZW5lcmF0ZSBjYXNlOgotICAgIC8vIGlmIGFsbCBCUSBidWZmZXJzIGFycml2ZSBiZWZvcmUgd2Ugc3RhcnQgZXhlY3V0aW5nLCBhbmQgd2Ugb25seSBzdWJtaXQKLSAgICAvLyBvbmUgaGVyZSwgdGhlIG90aGVyIEJRIGJ1ZmZlcnMgd2lsbCBqdXN0IHNpdCB1bnRpbCB3ZSBnZXQgbm90aWZpZWQKLSAgICAvLyB0aGF0IHRoZSBjb2RlYyBidWZmZXIgaGFzIGJlZW4gcmVsZWFzZWQuICBXZSdkIHRoZW4gYWNxdWlyZSBhbmQKLSAgICAvLyBzdWJtaXQgYSBzaW5nbGUgYWRkaXRpb25hbCBidWZmZXIsIHJlcGVhdGVkbHksIG5ldmVyIHVzaW5nIG1vcmUgdGhhbgotICAgIC8vIG9uZSBjb2RlYyBidWZmZXIgc2ltdWx0YW5lb3VzbHkuICAoV2UgY291bGQgaW5zdGVhZCB0cnkgdG8gc3VibWl0Ci0gICAgLy8gYWxsIEJRIGJ1ZmZlcnMgd2hlbmV2ZXIgYW55IGNvZGVjIGJ1ZmZlciBpcyBmcmVlZCwgYnV0IGlmIHdlIGdldCB0aGUKLSAgICAvLyBpbml0aWFsIGNvbmRpdGlvbnMgcmlnaHQgdGhhdCB3aWxsIG5ldmVyIGJlIHVzZWZ1bC4pCi0gICAgd2hpbGUgKGhhdmVBdmFpbGFibGVCdWZmZXJzX2woKSkgewotICAgICAgICBpZiAoIWZpbGxDb2RlY0J1ZmZlcl9sKCkpIHsKLSAgICAgICAgICAgIEFMT0dWKCJzdG9wIGxvYWQgd2l0aCBhdmFpbGFibGU9JXp1KyVkIiwKLSAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZUJ1ZmZlcnMuc2l6ZSgpLCBtTnVtQXZhaWxhYmxlVW5hY3F1aXJlZEJ1ZmZlcnMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBBTE9HVigiZG9uZSBsb2FkaW5nIGluaXRpYWwgZnJhbWVzLCBhdmFpbGFibGU9JXp1KyVkIiwKLSAgICAgICAgICAgIG1BdmFpbGFibGVCdWZmZXJzLnNpemUoKSwgbU51bUF2YWlsYWJsZVVuYWNxdWlyZWRCdWZmZXJzKTsKLQotICAgIC8vIElmIEVPUyBoYXMgYWxyZWFkeSBiZWVuIHNpZ25hbGVkLCBhbmQgdGhlcmUgYXJlIG5vIG1vcmUgZnJhbWVzIHRvCi0gICAgLy8gc3VibWl0LCB0cnkgdG8gc2VuZCBFT1Mgbm93IGFzIHdlbGwuCi0gICAgaWYgKG1TdG9wVGltZVVzID09IC0xICYmIG1FbmRPZlN0cmVhbSAmJiAhaGF2ZUF2YWlsYWJsZUJ1ZmZlcnNfbCgpKSB7Ci0gICAgICAgIHN1Ym1pdEVuZE9mSW5wdXRTdHJlYW1fbCgpOwotICAgIH0KLQotICAgIGlmIChtRnJhbWVSZXBlYXRJbnRlcnZhbFVzID4gMGxsICYmIG1Mb29wZXIgPT0gTlVMTCkgewotICAgICAgICBtUmVmbGVjdG9yID0gbmV3IEFIYW5kbGVyUmVmbGVjdG9yPEdyYXBoaWNCdWZmZXJTb3VyY2U+KHRoaXMpOwotCi0gICAgICAgIG1Mb29wZXIgPSBuZXcgQUxvb3BlcjsKLSAgICAgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1SZWZsZWN0b3IpOwotICAgICAgICBtTG9vcGVyLT5zdGFydCgpOwotCi0gICAgICAgIGlmIChtTGF0ZXN0QnVmZmVyLm1CdWZmZXIgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgcXVldWVGcmFtZVJlcGVhdF9sKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgR3JhcGhpY0J1ZmZlclNvdXJjZTo6b25PbXhJZGxlKCkgewotICAgIEFMT0dWKCJvbXhJZGxlIik7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKLQotICAgIGlmIChtRXhlY3V0aW5nKSB7Ci0gICAgICAgIC8vIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlIHRyYW5zaXRpb24gZnJvbSBleGVjdXRpbmctPmlkbGUsCi0gICAgICAgIC8vIG5vdCBsb2FkZWQtPmlkbGUuCi0gICAgICAgIG1FeGVjdXRpbmcgPSBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotU3RhdHVzIEdyYXBoaWNCdWZmZXJTb3VyY2U6Om9uT214TG9hZGVkKCl7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7Ci0gICAgaWYgKG1Mb29wZXIgIT0gTlVMTCkgewotICAgICAgICBtTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtUmVmbGVjdG9yLT5pZCgpKTsKLSAgICAgICAgbVJlZmxlY3Rvci5jbGVhcigpOwotCi0gICAgICAgIG1Mb29wZXItPnN0b3AoKTsKLSAgICAgICAgbUxvb3Blci5jbGVhcigpOwotICAgIH0KLQotICAgIEFMT0dWKCItLT4gbG9hZGVkOyBhdmFpbGFibGU9JXp1KyVkIGVvcz0lZCBlb3NTZW50PSVkIGFjcXVpcmVkPSVkIiwKLSAgICAgICAgICAgIG1BdmFpbGFibGVCdWZmZXJzLnNpemUoKSwgbU51bUF2YWlsYWJsZVVuYWNxdWlyZWRCdWZmZXJzLAotICAgICAgICAgICAgbUVuZE9mU3RyZWFtLCBtRW5kT2ZTdHJlYW1TZW50LCBtTnVtT3V0c3RhbmRpbmdBY3F1aXJlcyk7Ci0KLSAgICAvLyBDb2RlYyBpcyBubyBsb25nZXIgZXhlY3V0aW5nLiAgUmVsZWFzaW5nIGFsbCBidWZmZXJzIHRvIGJxLgotICAgIG1GcmVlQ29kZWNCdWZmZXJzLmNsZWFyKCk7Ci0gICAgbVN1Ym1pdHRlZENvZGVjQnVmZmVycy5jbGVhcigpOwotICAgIG1MYXRlc3RCdWZmZXIubUJ1ZmZlci5yZXNldCgpOwotICAgIG1PTVhOb2RlLmNsZWFyKCk7Ci0gICAgbUV4ZWN1dGluZyA9IGZhbHNlOwotCi0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotU3RhdHVzIEdyYXBoaWNCdWZmZXJTb3VyY2U6Om9uSW5wdXRCdWZmZXJBZGRlZChjb2RlY19idWZmZXJfaWQgYnVmZmVySWQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKLQotICAgIGlmIChtRXhlY3V0aW5nKSB7Ci0gICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiAtLSBidWZmZXJzIGNhbiBvbmx5IGJlIGFsbG9jYXRlZCB3aGVuCi0gICAgICAgIC8vIHRyYW5zaXRpb25pbmcgZnJvbSAibG9hZGVkIiB0byAiaWRsZSIuCi0gICAgICAgIEFMT0dFKCJhZGRDb2RlY0J1ZmZlcjogYnVmZmVyIGFkZGVkIHdoaWxlIGV4ZWN1dGluZyIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoSU5WQUxJRF9PUEVSQVRJT04pOwotICAgIH0KLQotICAgIEFMT0dWKCJhZGRDb2RlY0J1ZmZlcjogYnVmZmVySWQ9JXUiLCBidWZmZXJJZCk7Ci0KLSAgICBtRnJlZUNvZGVjQnVmZmVycy5wdXNoX2JhY2soYnVmZmVySWQpOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLVN0YXR1cyBHcmFwaGljQnVmZmVyU291cmNlOjpvbklucHV0QnVmZmVyRW1wdGllZChjb2RlY19idWZmZXJfaWQgYnVmZmVySWQsIGludCBmZW5jZUZkKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7Ci0gICAgRmlsZURlc2NyaXB0b3I6OkF1dG9jbG9zZSBmZW5jZShmZW5jZUZkKTsKLQotICAgIHNzaXplX3QgY2JpID0gbVN1Ym1pdHRlZENvZGVjQnVmZmVycy5pbmRleE9mS2V5KGJ1ZmZlcklkKTsKLSAgICBpZiAoY2JpIDwgMCkgewotICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uCi0gICAgICAgIEFMT0dFKCJvbklucHV0QnVmZmVyRW1wdGllZDogYnVmZmVyIG5vdCByZWNvZ25pemVkIChidWZmZXJJZD0ldSkiLCBidWZmZXJJZCk7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihCQURfVkFMVUUpOwotICAgIH0KLQotICAgIHN0ZDo6c2hhcmVkX3B0cjxBY3F1aXJlZEJ1ZmZlcj4gYnVmZmVyID0gbVN1Ym1pdHRlZENvZGVjQnVmZmVycy52YWx1ZUF0KGNiaSk7Ci0KLSAgICAvLyBNb3ZlIGJ1ZmZlciB0byBhdmFpbGFibGUgYnVmZmVycwotICAgIG1TdWJtaXR0ZWRDb2RlY0J1ZmZlcnMucmVtb3ZlSXRlbXNBdChjYmkpOwotICAgIG1GcmVlQ29kZWNCdWZmZXJzLnB1c2hfYmFjayhidWZmZXJJZCk7Ci0KLSAgICAvLyBoZWFkZXItPm5GaWxsZWRMZW4gbWF5IG5vdCBiZSB0aGUgb3JpZ2luYWwgdmFsdWUsIHNvIHdlIGNhbid0IGNvbXBhcmUKLSAgICAvLyB0aGF0IHRvIHplcm8gdG8gc2VlIG9mIHRoaXMgd2FzIHRoZSBFT1MgYnVmZmVyLiAgSW5zdGVhZCB3ZSBqdXN0Ci0gICAgLy8gc2VlIGlmIHRoZXJlIGlzIGEgbnVsbCBBY3F1aXJlZEJ1ZmZlciwgd2hpY2ggc2hvdWxkIG9ubHkgZXZlciBoYXBwZW4gZm9yIEVPUy4KLSAgICBpZiAoYnVmZmVyID09IG51bGxwdHIpIHsKLSAgICAgICAgaWYgKCEobUVuZE9mU3RyZWFtICYmIG1FbmRPZlN0cmVhbVNlbnQpKSB7Ci0gICAgICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gd2hlbiBicm9rZW4gY29kZSBzZW5kcyB1cyB0aGUgc2FtZSBidWZmZXIgdHdpY2UgaW4gYSByb3cuCi0gICAgICAgICAgICBBTE9HRSgib25JbnB1dEJ1ZmZlckVtcHRpZWQ6IG5vbi1FT1MgbnVsbCBidWZmZXIgKGJ1ZmZlcklkPSV1KSIsIGJ1ZmZlcklkKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dWKCJvbklucHV0QnVmZmVyRW1wdGllZDogRU9TIG51bGwgYnVmZmVyIChidWZmZXJJZD0ldUAlemQpIiwgYnVmZmVySWQsIGNiaSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gTm8gR3JhcGhpY0J1ZmZlciB0byBkZWFsIHdpdGgsIG5vIGFkZGl0aW9uYWwgaW5wdXQgb3Igb3V0cHV0IGlzIGV4cGVjdGVkLCBzbyBqdXN0IHJldHVybi4KLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKEJBRF9WQUxVRSk7Ci0gICAgfQotCi0gICAgaWYgKCFtRXhlY3V0aW5nKSB7Ci0gICAgICAgIC8vIHRoaXMgaXMgZmluZSBzaW5jZSB0aGlzIGNvdWxkIGhhcHBlbiB3aGVuIGdvaW5nIGZyb20gSWRsZSB0byBMb2FkZWQKLSAgICAgICAgQUxPR1YoIm9uSW5wdXRCdWZmZXJFbXB0aWVkOiBubyBsb25nZXIgZXhlY3V0aW5nIChidWZmZXJJZD0ldUAlemQpIiwgYnVmZmVySWQsIGNiaSk7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihPSyk7Ci0gICAgfQotCi0gICAgQUxPR1YoIm9uSW5wdXRCdWZmZXJFbXB0aWVkOiBidWZmZXJJZD0lZEAlemQgW3Nsb3Q9JWQsIHVzZUNvdW50PSVsZCwgaGFuZGxlPSVwXSBhY3F1aXJlZD0lZCIsCi0gICAgICAgICAgICBidWZmZXJJZCwgY2JpLCBidWZmZXItPmdldFNsb3QoKSwgYnVmZmVyLnVzZV9jb3VudCgpLCBidWZmZXItPmdldEdyYXBoaWNCdWZmZXIoKS0+aGFuZGxlLAotICAgICAgICAgICAgbU51bU91dHN0YW5kaW5nQWNxdWlyZXMpOwotCi0gICAgYnVmZmVyLT5hZGRSZWxlYXNlRmVuY2VGZChmZW5jZS5yZWxlYXNlKCkpOwotICAgIC8vIHJlbGVhc2UgY29kZWMgcmVmZXJlbmNlIGZvciB2aWRlbyBidWZmZXIganVzdCBpbiBjYXNlIHJlbW92ZSBkb2VzIG5vdCBpdAotICAgIGJ1ZmZlci5yZXNldCgpOwotCi0gICAgaWYgKGhhdmVBdmFpbGFibGVCdWZmZXJzX2woKSkgewotICAgICAgICAvLyBGaWxsIHRoaXMgY29kZWMgYnVmZmVyLgotICAgICAgICBDSEVDSyghbUVuZE9mU3RyZWFtU2VudCk7Ci0gICAgICAgIEFMT0dWKCJvbklucHV0QnVmZmVyRW1wdGllZDogYnVmZmVyIGZyZWVkLCBmZWVkaW5nIGNvZGVjIChhdmFpbGFibGU9JXp1KyVkLCBlb3M9JWQpIiwKLSAgICAgICAgICAgICAgICBtQXZhaWxhYmxlQnVmZmVycy5zaXplKCksIG1OdW1BdmFpbGFibGVVbmFjcXVpcmVkQnVmZmVycywgbUVuZE9mU3RyZWFtKTsKLSAgICAgICAgZmlsbENvZGVjQnVmZmVyX2woKTsKLSAgICB9IGVsc2UgaWYgKG1FbmRPZlN0cmVhbSAmJiBtU3RvcFRpbWVVcyA9PSAtMSkgewotICAgICAgICAvLyBObyBmcmFtZXMgYXZhaWxhYmxlLCBidXQgRU9TIGlzIHBlbmRpbmcgYW5kIG5vIHN0b3AgdGltZSwgc28gdXNlIHRoaXMgYnVmZmVyIHRvCi0gICAgICAgIC8vIHNlbmQgdGhhdC4KLSAgICAgICAgQUxPR1YoIm9uSW5wdXRCdWZmZXJFbXB0aWVkOiBidWZmZXIgZnJlZWQsIHN1Ym1pdHRpbmcgRU9TIik7Ci0gICAgICAgIHN1Ym1pdEVuZE9mSW5wdXRTdHJlYW1fbCgpOwotICAgIH0gZWxzZSBpZiAobUZyYW1lUmVwZWF0QmxvY2tlZE9uQ29kZWNCdWZmZXIpIHsKLSAgICAgICAgYm9vbCBzdWNjZXNzID0gcmVwZWF0TGF0ZXN0QnVmZmVyX2woKTsKLSAgICAgICAgQUxPR1YoIm9uSW5wdXRCdWZmZXJFbXB0aWVkOiBjb21wbGV0aW5nIGRlZmVycmVkIHJlcGVhdExhdGVzdEJ1ZmZlcl9sICVzIiwKLSAgICAgICAgICAgICAgICBzdWNjZXNzID8gIlNVQ0NFU1MiIDogIkZBSUxVUkUiKTsKLSAgICAgICAgbUZyYW1lUmVwZWF0QmxvY2tlZE9uQ29kZWNCdWZmZXIgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyByZWxlYXNlUmVsZWFzYWJsZUJ1ZmZlcnNfbCgpOwotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLXZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6b25EYXRhc3BhY2VDaGFuZ2VkX2woCi0gICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFzcGFjZSwgYW5kcm9pZF9waXhlbF9mb3JtYXQgcGl4ZWxGb3JtYXQpIHsKLSAgICBBTE9HRCgiZ290IGJ1ZmZlciB3aXRoIG5ldyBkYXRhU3BhY2UgIyV4IiwgZGF0YXNwYWNlKTsKLSAgICBtTGFzdERhdGFzcGFjZSA9IGRhdGFzcGFjZTsKLQotICAgIGlmIChDb2xvclV0aWxzOjpjb252ZXJ0RGF0YVNwYWNlVG9WMChkYXRhc3BhY2UpKSB7Ci0gICAgICAgIG1PTVhOb2RlLT5kaXNwYXRjaERhdGFTcGFjZUNoYW5nZWQobUxhc3REYXRhc3BhY2UsIG1EZWZhdWx0Q29sb3JBc3BlY3RzUGFja2VkLCBwaXhlbEZvcm1hdCk7Ci0gICAgfQotfQotCi1ib29sIEdyYXBoaWNCdWZmZXJTb3VyY2U6OmZpbGxDb2RlY0J1ZmZlcl9sKCkgewotICAgIENIRUNLKG1FeGVjdXRpbmcgJiYgaGF2ZUF2YWlsYWJsZUJ1ZmZlcnNfbCgpKTsKLQotICAgIGlmIChtRnJlZUNvZGVjQnVmZmVycy5lbXB0eSgpKSB7Ci0gICAgICAgIC8vIE5vIGJ1ZmZlcnMgYXZhaWxhYmxlLCBiYWlsLgotICAgICAgICBBTE9HVigiZmlsbENvZGVjQnVmZmVyX2w6IG5vIGNvZGVjIGJ1ZmZlcnMsIGF2YWlsYWJsZT0lenUrJWQiLAotICAgICAgICAgICAgICAgIG1BdmFpbGFibGVCdWZmZXJzLnNpemUoKSwgbU51bUF2YWlsYWJsZVVuYWNxdWlyZWRCdWZmZXJzKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIFZpZGVvQnVmZmVyIGl0ZW07Ci0gICAgaWYgKG1BdmFpbGFibGVCdWZmZXJzLmVtcHR5KCkpIHsKLSAgICAgICAgQUxPR1YoImZpbGxDb2RlY0J1ZmZlcl9sOiBhY3F1aXJpbmcgYXZhaWxhYmxlIGJ1ZmZlciwgYXZhaWxhYmxlPSV6dSslZCIsCi0gICAgICAgICAgICAgICAgbUF2YWlsYWJsZUJ1ZmZlcnMuc2l6ZSgpLCBtTnVtQXZhaWxhYmxlVW5hY3F1aXJlZEJ1ZmZlcnMpOwotICAgICAgICBpZiAoYWNxdWlyZUJ1ZmZlcl9sKCZpdGVtKSAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoImZpbGxDb2RlY0J1ZmZlcl9sOiBmYWlsZWQgdG8gYWNxdWlyZSBhdmFpbGFibGUgYnVmZmVyIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiZmlsbENvZGVjQnVmZmVyX2w6IGdldHRpbmcgYXZhaWxhYmxlIGJ1ZmZlciwgYXZhaWxhYmxlPSV6dSslZCIsCi0gICAgICAgICAgICAgICAgbUF2YWlsYWJsZUJ1ZmZlcnMuc2l6ZSgpLCBtTnVtQXZhaWxhYmxlVW5hY3F1aXJlZEJ1ZmZlcnMpOwotICAgICAgICBpdGVtID0gKm1BdmFpbGFibGVCdWZmZXJzLmJlZ2luKCk7Ci0gICAgICAgIG1BdmFpbGFibGVCdWZmZXJzLmVyYXNlKG1BdmFpbGFibGVCdWZmZXJzLmJlZ2luKCkpOwotICAgIH0KLQotICAgIGludDY0X3QgaXRlbVRpbWVVcyA9IGl0ZW0ubVRpbWVzdGFtcE5zIC8gMTAwMDsKLQotICAgIC8vIFByb2Nlc3MgQWN0aW9uSXRlbSBpbiB0aGUgUXVldWUgaWYgdGhlcmUgaXMgYW55LiBJZiBhIGJ1ZmZlcidzIHRpbWVzdGFtcAotICAgIC8vIGlzIHNtYWxsZXIgdGhhbiB0aGUgZmlyc3QgYWN0aW9uJ3MgdGltZXN0YW1wLCBubyBhY3Rpb24gbmVlZCB0byBiZSBwZXJmb3JtZWQuCi0gICAgLy8gSWYgYnVmZmVyJ3MgdGltZXN0YW1wIGlzIGxhcmdlciBvciBlcXVhbCB0aGFuIHRoZSBsYXN0IGFjdGlvbidzIHRpbWVzdGFtcCwKLSAgICAvLyBvbmx5IHRoZSBsYXN0IGFjdGlvbiBuZWVkcyB0byBiZSBwZXJmb3JtZWQgYXMgYWxsIHRoZSBhY2l0aW9ucyBiZWZvcmUgdGhlCi0gICAgLy8gdGhlIGFjdGlvbiBhcmUgb3ZlcnJpZGRlbiBieSB0aGUgbGFzdCBhY3Rpb24uIEZvciB0aGUgb3RoZXIgY2FzZXMsIHRyYXZlcnNlCi0gICAgLy8gdGhlIFF1ZXVlIHRvIGZpbmQgdGhlIG5ld2VzdCBhY3Rpb24gdGhhdCB3aXRoIHRpbWVzdGFtcCBzbWFsbGVyIG9yIGVxdWFsIHRvCi0gICAgLy8gdGhlIGJ1ZmZlcidzIHRpbWVzdGFtcC4gRm9yIGV4YW1wbGUsIGFuIGFjdGlvbiBxdWV1ZSBsaWtlCi0gICAgLy8gW3BhdXNlIDF1c10sIFtyZXN1bWUgMnVzXSwgW3BhdXNlIDN1c10sIFtyZXN1bWUgNHVzXSwgW3BhdXNlIDV1c10uLi4uIFVwb24KLSAgICAvLyByZWNlaXZpbmcgYSBidWZmZXIgd2l0aCB0aW1lc3RhbXAgMy41dXMsIG9ubHkgdGhlIGFjdGlvbiBbcGF1c2UsIDN1c10gbmVlZHMKLSAgICAvLyB0byBiZSBoYW5kbGVkIGFuZCBbcGF1c2UsIDF1c10sIFtyZXN1bWUgMnVzXSB3aWxsIGJlIGRpc2NhcmRlZC4KLSAgICBib29sIGRvbmUgPSBmYWxzZTsKLSAgICBib29sIHNlZVN0b3BBY3Rpb24gPSBmYWxzZTsKLSAgICBpZiAoIW1BY3Rpb25RdWV1ZS5lbXB0eSgpKSB7Ci0gICAgICAgIC8vIEZpcnN0IHNjYW4gdG8gY2hlY2sgaWYgYnVmZmVyVGltZXN0YW1wIGlzIHNtYWxsZXIgdGhhbiBmaXJzdCBhY3Rpb24ncyB0aW1lc3RhbXAuCi0gICAgICAgIEFjdGlvbkl0ZW0gbmV4dEFjdGlvbiA9ICoobUFjdGlvblF1ZXVlLmJlZ2luKCkpOwotICAgICAgICBpZiAoaXRlbVRpbWVVcyA8IG5leHRBY3Rpb24ubUFjdGlvblRpbWVVcykgewotICAgICAgICAgICAgQUxPR1YoIk5vIGFjdGlvbi4gYnVmZmVyIHRpbWVzdGFtcCAlbGxkIHVzIDwgYWN0aW9uIHRpbWVzdGFtcDogJWxsZCB1cyIsCi0gICAgICAgICAgICAgICAgKGxvbmcgbG9uZylpdGVtVGltZVVzLCAobG9uZyBsb25nKW5leHRBY3Rpb24ubUFjdGlvblRpbWVVcyk7Ci0gICAgICAgICAgICAvLyBBbGwgdGhlIGFjdGlvbnMgYXJlIGFoZWFkLiBObyBhY3Rpb24gbmVlZCB0byBwZXJmb3JtIG5vdy4KLSAgICAgICAgICAgIC8vIFJlbGVhc2UgdGhlIGJ1ZmZlciBpZiBpcyBpbiBzdXNwZW5kZWQgc3RhdGUsIG9yIHByb2Nlc3MgdGhlIGJ1ZmZlcgotICAgICAgICAgICAgLy8gaWYgbm90IGluIHN1c3BlbmRlZCBzdGF0ZS4KLSAgICAgICAgICAgIGRvbmUgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFkb25lKSB7Ci0gICAgICAgICAgICAvLyBGaW5kIHRoZSBuZXdlc3QgYWN0aW9uIHRoYXQgd2l0aCB0aW1lc3RhbXAgc21hbGxlciB0aGFuIGl0ZW1UaW1lVXMuIFRoZW4KLSAgICAgICAgICAgIC8vIHJlbW92ZSBhbGwgdGhlIGFjdGlvbnMgYmVmb3JlIGFuZCBpbmNsdWRlIHRoZSBuZXdlc3QgYWN0aW9uLgotICAgICAgICAgICAgTGlzdDxBY3Rpb25JdGVtPjo6aXRlcmF0b3IgaXQgPSBtQWN0aW9uUXVldWUuYmVnaW4oKTsKLSAgICAgICAgICAgIHdoaWxlIChpdCAhPSBtQWN0aW9uUXVldWUuZW5kKCkgJiYgaXQtPm1BY3Rpb25UaW1lVXMgPD0gaXRlbVRpbWVVcwotICAgICAgICAgICAgICAgICAgICAmJiBuZXh0QWN0aW9uLm1BY3Rpb24gIT0gQWN0aW9uSXRlbTo6U1RPUCkgewotICAgICAgICAgICAgICAgIG5leHRBY3Rpb24gPSAqaXQ7Ci0gICAgICAgICAgICAgICAgKytpdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1BY3Rpb25RdWV1ZS5lcmFzZShtQWN0aW9uUXVldWUuYmVnaW4oKSwgaXQpOwotCi0gICAgICAgICAgICBDSEVDSyhpdGVtVGltZVVzID49IG5leHRBY3Rpb24ubUFjdGlvblRpbWVVcyk7Ci0gICAgICAgICAgICBzd2l0Y2ggKG5leHRBY3Rpb24ubUFjdGlvbikgewotICAgICAgICAgICAgICAgIGNhc2UgQWN0aW9uSXRlbTo6UEFVU0U6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtU3VzcGVuZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlJVTk5JTkcvUEFVU0UgLT4gUEFVU0UgYXQgYnVmZmVyICVsbGQgdXMgIFBBVVNFIFRpbWU6ICVsbGQgdXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpaXRlbVRpbWVVcywgKGxvbmcgbG9uZyluZXh0QWN0aW9uLm1BY3Rpb25UaW1lVXMpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSBBY3Rpb25JdGVtOjpSRVNVTUU6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtU3VzcGVuZGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJQQVVTRS9SVU5OSU5HIC0+IFJVTk5JTkcgYXQgYnVmZmVyICVsbGQgdXMgIFJFU1VNRSBUaW1lOiAlbGxkIHVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWl0ZW1UaW1lVXMsIChsb25nIGxvbmcpbmV4dEFjdGlvbi5tQWN0aW9uVGltZVVzKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgQWN0aW9uSXRlbTo6U1RPUDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJSVU5OSU5HL1BBVVNFIC0+IFNUT1AgYXQgYnVmZmVyICVsbGQgdXMgIFNUT1AgVGltZTogJWxsZCB1cyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylpdGVtVGltZVVzLCAobG9uZyBsb25nKW5leHRBY3Rpb24ubUFjdGlvblRpbWVVcyk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoZSB3aG9sZSBBY3Rpb25RdWV1ZSBhcyByZWNvcmRpbmcgaXMgZG9uZQotICAgICAgICAgICAgICAgICAgICBtQWN0aW9uUXVldWUuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgc2VlU3RvcEFjdGlvbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBUUkVTUEFTU19EQkcoIlVua25vd24gYWN0aW9uIHR5cGUiKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHRydWUgaGVyZSBiZWNhdXNlIHdlIGRpZCBjb25zdW1lIGFuIGF2YWlsYWJsZSBidWZmZXIsIHNvIHRoZQotICAgICAgICAgICAgICAgICAgICAvLyBsb29wIGluIG9uT214RXhlY3V0aW5nIHdpbGwgZXZlbnR1YWxseSB0ZXJtaW5hdGUgZXZlbiBpZiB3ZSBoaXQgdGhpcy4KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHNlZVN0b3BBY3Rpb24pIHsKLSAgICAgICAgLy8gQ2xlYXIgYWxsIHRoZSBidWZmZXJzIGJlZm9yZSBzZXR0aW5nIG1FbmRPZlN0cmVhbSBhbmQgc2lnbmFsIEVuZE9mSW5wdXRTdHJlYW0uCi0gICAgICAgIHJlbGVhc2VBbGxBdmFpbGFibGVCdWZmZXJzX2woKTsKLSAgICAgICAgbUVuZE9mU3RyZWFtID0gdHJ1ZTsKLSAgICAgICAgc3VibWl0RW5kT2ZJbnB1dFN0cmVhbV9sKCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGlmIChtU3VzcGVuZGVkKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGludCBlcnIgPSBVTktOT1dOX0VSUk9SOwotCi0gICAgLy8gb25seSBzdWJtaXQgc2FtcGxlIGlmIHN0YXJ0IHRpbWUgaXMgdW5zcGVjaWZpZWQsIG9yIHNhbXBsZQotICAgIC8vIGlzIHF1ZXVlZCBhZnRlciB0aGUgc3BlY2lmaWVkIHN0YXJ0IHRpbWUKLSAgICBpZiAobVNraXBGcmFtZXNCZWZvcmVOcyA8IDBsbCB8fCBpdGVtLm1UaW1lc3RhbXBOcyA+PSBtU2tpcEZyYW1lc0JlZm9yZU5zKSB7Ci0gICAgICAgIC8vIGlmIHN0YXJ0IHRpbWUgaXMgc2V0LCBvZmZzZXQgdGltZSBzdGFtcCBieSBzdGFydCB0aW1lCi0gICAgICAgIGlmIChtU2tpcEZyYW1lc0JlZm9yZU5zID4gMCkgewotICAgICAgICAgICAgaXRlbS5tVGltZXN0YW1wTnMgLT0gbVNraXBGcmFtZXNCZWZvcmVOczsKLSAgICAgICAgfQotCi0gICAgICAgIGludDY0X3QgdGltZVVzID0gaXRlbS5tVGltZXN0YW1wTnMgLyAxMDAwOwotICAgICAgICBpZiAobUZyYW1lRHJvcHBlciAhPSBOVUxMICYmIG1GcmFtZURyb3BwZXItPnNob3VsZERyb3AodGltZVVzKSkgewotICAgICAgICAgICAgQUxPR1YoInNraXBwaW5nIGZyYW1lICglbGxkKSB0byBtZWV0IG1heCBmcmFtZXJhdGUiLCBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KHRpbWVVcykpOwotICAgICAgICAgICAgLy8gc2V0IGVyciB0byBPSyBzbyB0aGF0IHRoZSBza2lwcGVkIGZyYW1lIGNhbiBzdGlsbCBiZSBzYXZlZCBhcyB0aGUgbGFzdGVzdCBmcmFtZQotICAgICAgICAgICAgZXJyID0gT0s7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlcnIgPSBzdWJtaXRCdWZmZXJfbChpdGVtKTsgLy8gdGhpcyB0YWtlcyBzaGFyZWQgb3duZXJzaGlwIG9mIHRoZSBhY3F1aXJlZCBidWZmZXIgb24gc3VjY2Vlc3MKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgQUxPR1YoInN1Ym1pdEJ1ZmZlcl9sIGZhaWxlZCwgd2lsbCByZWxlYXNlIGJxIHNsb3QgJWQiLCBpdGVtLm1CdWZmZXItPmdldFNsb3QoKSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIERvbid0IHNldCB0aGUgbGFzdCBidWZmZXIgaWQgaWYgd2UncmUgbm90IHJlcGVhdGluZywKLSAgICAgICAgLy8gd2UnbGwgYmUgaG9sZGluZyBvbiB0byB0aGUgbGFzdCBidWZmZXIgZm9yIG5vdGhpbmcuCi0gICAgICAgIGlmIChtRnJhbWVSZXBlYXRJbnRlcnZhbFVzID4gMGxsKSB7Ci0gICAgICAgICAgICBzZXRMYXRlc3RCdWZmZXJfbChpdGVtKTsKLSAgICAgICAgfQotICAgICAgICBBTE9HVigiYnVmZmVyIHN1Ym1pdHRlZCBbc2xvdD0lZCwgdXNlQ291bnQ9JWxkXSBhY3F1aXJlZD0lZCIsCi0gICAgICAgICAgICAgICAgaXRlbS5tQnVmZmVyLT5nZXRTbG90KCksIGl0ZW0ubUJ1ZmZlci51c2VfY291bnQoKSwgbU51bU91dHN0YW5kaW5nQWNxdWlyZXMpOwotICAgICAgICBtTGFzdEZyYW1lVGltZXN0YW1wVXMgPSBpdGVtVGltZVVzOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIEdyYXBoaWNCdWZmZXJTb3VyY2U6OnJlcGVhdExhdGVzdEJ1ZmZlcl9sKCkgewotICAgIENIRUNLKG1FeGVjdXRpbmcgJiYgIWhhdmVBdmFpbGFibGVCdWZmZXJzX2woKSk7Ci0KLSAgICBpZiAobUxhdGVzdEJ1ZmZlci5tQnVmZmVyID09IG51bGxwdHIgfHwgbVN1c3BlbmRlZCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKG1GcmVlQ29kZWNCdWZmZXJzLmVtcHR5KCkpIHsKLSAgICAgICAgLy8gTm8gYnVmZmVycyBhdmFpbGFibGUsIGJhaWwuCi0gICAgICAgIEFMT0dWKCJyZXBlYXRMYXRlc3RCdWZmZXJfbDogbm8gY29kZWMgYnVmZmVycy4iKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmICghbUxhdGVzdEJ1ZmZlci5tQnVmZmVyLT5pc0NhY2hlZCgpKSB7Ci0gICAgICAgIEFMT0dWKCJyZXBlYXRMYXRlc3RCdWZmZXJfbDogc2xvdCB3YXMgZGlzY2FyZGVkLCBidXQgcmVwZWF0aW5nIG91ciBvd24gcmVmZXJlbmNlIik7Ci0gICAgfQotCi0gICAgLy8gaXQgaXMgb2sgdG8gdXBkYXRlIHRoZSB0aW1lc3RhbXAgb2YgbGF0ZXN0IGJ1ZmZlciBhcyBpdCBpcyBvbmx5IHVzZWQgZm9yIHN1Ym1pc3Npb24KLSAgICBzdGF0dXNfdCBlcnIgPSBzdWJtaXRCdWZmZXJfbChtTGF0ZXN0QnVmZmVyKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKiByZXBlYXQgbGFzdCBmcmFtZSB1cCB0byBrUmVwZWF0TGFzdEZyYW1lQ291bnQgdGltZXMuCi0gICAgICogaW4gY2FzZSBvZiBzdGF0aWMgc2NlbmUsIGEgc2luZ2xlIHJlcGVhdCBtaWdodCBub3QgZ2V0IHJpZCBvZiBlbmNvZGVyCi0gICAgICogZ2hvc3RpbmcgY29tcGxldGVseSwgcmVmcmVzaCBhIGNvdXBsZSBtb3JlIHRpbWVzIHRvIGdldCBiZXR0ZXIgcXVhbGl0eQotICAgICAqLwotICAgIGlmICgtLW1PdXRzdGFuZGluZ0ZyYW1lUmVwZWF0Q291bnQgPiAwKSB7Ci0gICAgICAgIC8vIHNldCB1cCB0aW1lc3RhbXAgZm9yIHJlcGVhdCBmcmFtZQotICAgICAgICBtTGF0ZXN0QnVmZmVyLm1UaW1lc3RhbXBOcyArPSBtRnJhbWVSZXBlYXRJbnRlcnZhbFVzICogMTAwMDsKLSAgICAgICAgcXVldWVGcmFtZVJlcGVhdF9sKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2V0TGF0ZXN0QnVmZmVyX2woY29uc3QgVmlkZW9CdWZmZXIgJml0ZW0pIHsKLSAgICBtTGF0ZXN0QnVmZmVyID0gaXRlbTsKLQotICAgIEFMT0dWKCJzZXRMYXRlc3RCdWZmZXJfbDogW3Nsb3Q9JWQsIHVzZUNvdW50PSVsZF0iLAotICAgICAgICAgICAgbUxhdGVzdEJ1ZmZlci5tQnVmZmVyLT5nZXRTbG90KCksIG1MYXRlc3RCdWZmZXIubUJ1ZmZlci51c2VfY291bnQoKSk7Ci0KLSAgICBtT3V0c3RhbmRpbmdGcmFtZVJlcGVhdENvdW50ID0ga1JlcGVhdExhc3RGcmFtZUNvdW50OwotICAgIC8vIHNldCB1cCB0aW1lc3RhbXAgZm9yIHJlcGVhdCBmcmFtZQotICAgIG1MYXRlc3RCdWZmZXIubVRpbWVzdGFtcE5zICs9IG1GcmFtZVJlcGVhdEludGVydmFsVXMgKiAxMDAwOwotICAgIHF1ZXVlRnJhbWVSZXBlYXRfbCgpOwotfQotCi12b2lkIEdyYXBoaWNCdWZmZXJTb3VyY2U6OnF1ZXVlRnJhbWVSZXBlYXRfbCgpIHsKLSAgICBtRnJhbWVSZXBlYXRCbG9ja2VkT25Db2RlY0J1ZmZlciA9IGZhbHNlOwotCi0gICAgaWYgKG1SZWZsZWN0b3IgIT0gTlVMTCkgewotICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVwZWF0TGFzdEZyYW1lLCBtUmVmbGVjdG9yKTsKLSAgICAgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsICsrbVJlcGVhdExhc3RGcmFtZUdlbmVyYXRpb24pOwotICAgICAgICBtc2ctPnBvc3QobUZyYW1lUmVwZWF0SW50ZXJ2YWxVcyk7Ci0gICAgfQotfQotCi1ib29sIEdyYXBoaWNCdWZmZXJTb3VyY2U6OmNhbGN1bGF0ZUNvZGVjVGltZXN0YW1wX2woCi0gICAgICAgIG5zZWNzX3QgYnVmZmVyVGltZU5zLCBpbnQ2NF90ICpjb2RlY1RpbWVVcykgewotICAgIGludDY0X3QgdGltZVVzID0gYnVmZmVyVGltZU5zIC8gMTAwMDsKLSAgICB0aW1lVXMgKz0gbUlucHV0QnVmZmVyVGltZU9mZnNldFVzOwotCi0gICAgaWYgKG1DYXB0dXJlRnBzID4gMC4KLSAgICAgICAgICAgICYmIChtRnBzID4gMiAqIG1DYXB0dXJlRnBzCi0gICAgICAgICAgICB8fCBtQ2FwdHVyZUZwcyA+IDIgKiBtRnBzKSkgewotICAgICAgICAvLyBUaW1lIGxhcHNlIG9yIHNsb3cgbW90aW9uIG1vZGUKLSAgICAgICAgaWYgKG1QcmV2Q2FwdHVyZVVzIDwgMGxsKSB7Ci0gICAgICAgICAgICAvLyBmaXJzdCBjYXB0dXJlCi0gICAgICAgICAgICBtUHJldkNhcHR1cmVVcyA9IG1CYXNlQ2FwdHVyZVVzID0gdGltZVVzOwotICAgICAgICAgICAgLy8gYWRqdXN0IHRoZSBmaXJzdCBzYW1wbGUgdGltZXN0YW1wLgotICAgICAgICAgICAgbVByZXZGcmFtZVVzID0gbUJhc2VGcmFtZVVzID0KLSAgICAgICAgICAgICAgICAgICAgc3RkOjpsbHJvdW5kKCh0aW1lVXMgKiBtQ2FwdHVyZUZwcykgLyBtRnBzKTsKLSAgICAgICAgICAgIG1GcmFtZUNvdW50ID0gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHNuYXAgdG8gbmVhcmVzdCBjYXB0dXJlIHBvaW50Ci0gICAgICAgICAgICBpbnQ2NF90IG5GcmFtZXMgPSBzdGQ6Omxscm91bmQoCi0gICAgICAgICAgICAgICAgICAgICh0aW1lVXMgLSBtUHJldkNhcHR1cmVVcykgKiBtQ2FwdHVyZUZwcyAvIDEwMDAwMDApOwotICAgICAgICAgICAgaWYgKG5GcmFtZXMgPD0gMCkgewotICAgICAgICAgICAgICAgIC8vIHNraXAgdGhpcyBmcmFtZSBhcyBpdCdzIHRvbyBjbG9zZSB0byBwcmV2aW91cyBjYXB0dXJlCi0gICAgICAgICAgICAgICAgQUxPR1YoInNraXBwaW5nIGZyYW1lLCB0aW1lVXMgJWxsZCIsIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4odGltZVVzKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUZyYW1lQ291bnQgKz0gbkZyYW1lczsKLSAgICAgICAgICAgIG1QcmV2Q2FwdHVyZVVzID0gbUJhc2VDYXB0dXJlVXMgKyBzdGQ6Omxscm91bmQoCi0gICAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50ICogMTAwMDAwMCAvIG1DYXB0dXJlRnBzKTsKLSAgICAgICAgICAgIG1QcmV2RnJhbWVVcyA9IG1CYXNlRnJhbWVVcyArIHN0ZDo6bGxyb3VuZCgKLSAgICAgICAgICAgICAgICAgICAgbUZyYW1lQ291bnQgKiAxMDAwMDAwIC8gbUZwcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBBTE9HVigidGltZVVzICVsbGQsIGNhcHR1cmVVcyAlbGxkLCBmcmFtZVVzICVsbGQiLAotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4odGltZVVzKSwKLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KG1QcmV2Q2FwdHVyZVVzKSwKLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KG1QcmV2RnJhbWVVcykpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICh0aW1lVXMgPD0gbVByZXZGcmFtZVVzKSB7Ci0gICAgICAgICAgICAvLyBEcm9wIHRoZSBmcmFtZSBpZiBpdCdzIGdvaW5nIGJhY2t3YXJkIGluIHRpbWUuIEJhZCB0aW1lc3RhbXAKLSAgICAgICAgICAgIC8vIGNvdWxkIGRpc3J1cHQgZW5jb2RlcidzIHJhdGUgY29udHJvbCBjb21wbGV0ZWx5LgotICAgICAgICAgICAgQUxPR1coIkRyb3BwaW5nIGZyYW1lIHRoYXQncyBnb2luZyBiYWNrd2FyZCBpbiB0aW1lIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBtUHJldkZyYW1lVXMgPSB0aW1lVXM7Ci0gICAgfQotCi0gICAgKmNvZGVjVGltZVVzID0gbVByZXZGcmFtZVVzOwotICAgIHJldHVybiB0cnVlOwotfQotCi1zdGF0dXNfdCBHcmFwaGljQnVmZmVyU291cmNlOjpzdWJtaXRCdWZmZXJfbChjb25zdCBWaWRlb0J1ZmZlciAmaXRlbSkgewotICAgIENIRUNLKCFtRnJlZUNvZGVjQnVmZmVycy5lbXB0eSgpKTsKLSAgICBJT01YOjpidWZmZXJfaWQgY29kZWNCdWZmZXJJZCA9ICptRnJlZUNvZGVjQnVmZmVycy5iZWdpbigpOwotCi0gICAgQUxPR1YoInN1Ym1pdEJ1ZmZlcl9sIFtzbG90PSVkLCBidWZmZXJJZD0lZF0iLCBpdGVtLm1CdWZmZXItPmdldFNsb3QoKSwgY29kZWNCdWZmZXJJZCk7Ci0KLSAgICBpbnQ2NF90IGNvZGVjVGltZVVzOwotICAgIGlmICghY2FsY3VsYXRlQ29kZWNUaW1lc3RhbXBfbChpdGVtLm1UaW1lc3RhbXBOcywgJmNvZGVjVGltZVVzKSkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICBpZiAoKGFuZHJvaWRfZGF0YXNwYWNlKWl0ZW0ubURhdGFzcGFjZSAhPSBtTGFzdERhdGFzcGFjZSkgewotICAgICAgICBvbkRhdGFzcGFjZUNoYW5nZWRfbCgKLSAgICAgICAgICAgICAgICBpdGVtLm1EYXRhc3BhY2UsCi0gICAgICAgICAgICAgICAgKGFuZHJvaWRfcGl4ZWxfZm9ybWF0KWl0ZW0ubUJ1ZmZlci0+Z2V0R3JhcGhpY0J1ZmZlcigpLT5mb3JtYXQpOwotICAgIH0KLQotICAgIHN0ZDo6c2hhcmVkX3B0cjxBY3F1aXJlZEJ1ZmZlcj4gYnVmZmVyID0gaXRlbS5tQnVmZmVyOwotICAgIC8vIHVzZSBhIEdyYXBoaWNCdWZmZXIgZm9yIG5vdyBhcyBPTVhOb2RlSW5zdGFuY2UgaXMgdXNpbmcgR3JhcGhpY0J1ZmZlcnMgdG8gaG9sZCByZWZlcmVuY2VzCi0gICAgLy8gYW5kIGl0IHJlcXVpcmVzIHRoaXMgZ3JhcGhpYyBidWZmZXIgdG8gYmUgYWJsZSB0byBob2xkIGl0cyByZWZlcmVuY2UKLSAgICAvLyBhbmQgdGh1cyB3ZSB3b3VsZCBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBHcmFwaGljQnVmZmVyIGZyb20gYW4gQU5XQnVmZmVyIHNlcGFyYXRlIGZyb20gdGhlCi0gICAgLy8gYWNxdWlyZWQgR3JhcGhpY0J1ZmZlci4KLSAgICAvLyBUT0RPOiB0aGlzIGNhbiBiZSByZXdvcmtlZCBnbG9iYWxseSB0byB1c2UgQU5XQnVmZmVyIHJlZmVyZW5jZXMKLSAgICBzcDxHcmFwaGljQnVmZmVyPiBncmFwaGljQnVmZmVyID0gYnVmZmVyLT5nZXRHcmFwaGljQnVmZmVyKCk7Ci0gICAgc3RhdHVzX3QgZXJyID0gbU9NWE5vZGUtPmVtcHR5QnVmZmVyKAotICAgICAgICAgICAgY29kZWNCdWZmZXJJZCwgT01YX0JVRkZFUkZMQUdfRU5ET0ZGUkFNRSwgZ3JhcGhpY0J1ZmZlciwgY29kZWNUaW1lVXMsCi0gICAgICAgICAgICBidWZmZXItPmdldEFjcXVpcmVGZW5jZUZkKCkpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBBTE9HVygiV0FSTklORzogZW1wdHlHcmFwaGljQnVmZmVyIGZhaWxlZDogMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgbUZyZWVDb2RlY0J1ZmZlcnMuZXJhc2UobUZyZWVDb2RlY0J1ZmZlcnMuYmVnaW4oKSk7Ci0KLSAgICBzc2l6ZV90IGNiaXggPSBtU3VibWl0dGVkQ29kZWNCdWZmZXJzLmFkZChjb2RlY0J1ZmZlcklkLCBidWZmZXIpOwotICAgIEFMT0dWKCJlbXB0eUdyYXBoaWNCdWZmZXIgc3VjY2VlZGVkLCBidWZmZXJJZD0ldUAlemQgYnVmaGFuZGxlPSVwIiwKLSAgICAgICAgICAgIGNvZGVjQnVmZmVySWQsIGNiaXgsIGdyYXBoaWNCdWZmZXItPmhhbmRsZSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIEdyYXBoaWNCdWZmZXJTb3VyY2U6OnN1Ym1pdEVuZE9mSW5wdXRTdHJlYW1fbCgpIHsKLSAgICBDSEVDSyhtRW5kT2ZTdHJlYW0pOwotICAgIGlmIChtRW5kT2ZTdHJlYW1TZW50KSB7Ci0gICAgICAgIEFMT0dWKCJFT1MgYWxyZWFkeSBzZW50Iik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobUZyZWVDb2RlY0J1ZmZlcnMuZW1wdHkoKSkgewotICAgICAgICBBTE9HVigic3VibWl0RW5kT2ZJbnB1dFN0cmVhbV9sOiBubyBjb2RlYyBidWZmZXJzIGF2YWlsYWJsZSIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIElPTVg6OmJ1ZmZlcl9pZCBjb2RlY0J1ZmZlcklkID0gKm1GcmVlQ29kZWNCdWZmZXJzLmJlZ2luKCk7Ci0KLSAgICAvLyBXZSByZWplY3QgYW55IGFkZGl0aW9uYWwgaW5jb21pbmcgZ3JhcGhpYyBidWZmZXJzLiBUaGVyZSBpcyBubyBhY3F1aXJlZCBidWZmZXIgdXNlZCBmb3IgRU9TCi0gICAgc3RhdHVzX3QgZXJyID0gbU9NWE5vZGUtPmVtcHR5QnVmZmVyKAotICAgICAgICAgICAgY29kZWNCdWZmZXJJZCwgT01YX0JVRkZFUkZMQUdfRU5ET0ZGUkFNRSB8IE9NWF9CVUZGRVJGTEFHX0VPUyk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBBTE9HVygiZW1wdHlEaXJlY3RCdWZmZXIgRU9TIGZhaWxlZDogMHgleCIsIGVycik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUZyZWVDb2RlY0J1ZmZlcnMuZXJhc2UobUZyZWVDb2RlY0J1ZmZlcnMuYmVnaW4oKSk7Ci0gICAgICAgIHNzaXplX3QgY2JpeCA9IG1TdWJtaXR0ZWRDb2RlY0J1ZmZlcnMuYWRkKGNvZGVjQnVmZmVySWQsIG51bGxwdHIpOwotICAgICAgICBBTE9HVigic3VibWl0RW5kT2ZJbnB1dFN0cmVhbV9sOiBidWZmZXIgc3VibWl0dGVkLCBidWZmZXJJZD0ldUAlemQiLCBjb2RlY0J1ZmZlcklkLCBjYml4KTsKLSAgICAgICAgbUVuZE9mU3RyZWFtU2VudCA9IHRydWU7Ci0KLSAgICAgICAgLy8gbm8gbmVlZCB0byBob2xkIG9udG8gYW55IGJ1ZmZlcnMgZm9yIGZyYW1lIHJlcGVhdGluZwotICAgICAgICArK21SZXBlYXRMYXN0RnJhbWVHZW5lcmF0aW9uOwotICAgICAgICBtTGF0ZXN0QnVmZmVyLm1CdWZmZXIucmVzZXQoKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEdyYXBoaWNCdWZmZXJTb3VyY2U6OmFjcXVpcmVCdWZmZXJfbChWaWRlb0J1ZmZlciAqYWIpIHsKLSAgICBCdWZmZXJJdGVtIGJpOwotICAgIHN0YXR1c190IGVyciA9IG1Db25zdW1lci0+YWNxdWlyZUJ1ZmZlcigmYmksIDApOwotICAgIGlmIChlcnIgPT0gQnVmZmVyUXVldWU6Ok5PX0JVRkZFUl9BVkFJTEFCTEUpIHsKLSAgICAgICAgLy8gc2hvdWxkbid0IGhhcHBlbgotICAgICAgICBBTE9HVygiYWNxdWlyZUJ1ZmZlcl9sOiBmcmFtZSB3YXMgbm90IGF2YWlsYWJsZSIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0gZWxzZSBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIEFMT0dXKCJhY3F1aXJlQnVmZmVyX2w6IGZhaWxlZCB3aXRoIGVycj0lZCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIC0tbU51bUF2YWlsYWJsZVVuYWNxdWlyZWRCdWZmZXJzOwotCi0gICAgLy8gTWFuYWdlIG91ciBidWZmZXIgY2FjaGUuCi0gICAgc3RkOjpzaGFyZWRfcHRyPENhY2hlZEJ1ZmZlcj4gYnVmZmVyOwotICAgIHNzaXplX3QgYnNpID0gbUJ1ZmZlclNsb3RzLmluZGV4T2ZLZXkoYmkubVNsb3QpOwotICAgIGlmIChiaS5tR3JhcGhpY0J1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIHJlcGxhY2UvaW5pdGlhbGl6ZSBzbG90IHdpdGggbmV3IGJ1ZmZlcgotICAgICAgICBBTE9HVigiYWNxdWlyZUJ1ZmZlcl9sOiAlcyBidWZmZXIgc2xvdCAlZCIsIGJzaSA8IDAgPyAic2V0dGluZyIgOiAiVVBEQVRJTkciLCBiaS5tU2xvdCk7Ci0gICAgICAgIGlmIChic2kgPj0gMCkgewotICAgICAgICAgICAgZGlzY2FyZEJ1ZmZlckF0U2xvdEluZGV4X2woYnNpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJzaSA9IG1CdWZmZXJTbG90cy5hZGQoYmkubVNsb3QsIG51bGxwdHIpOwotICAgICAgICB9Ci0gICAgICAgIGJ1ZmZlciA9IHN0ZDo6bWFrZV9zaGFyZWQ8Q2FjaGVkQnVmZmVyPihiaS5tU2xvdCwgYmkubUdyYXBoaWNCdWZmZXIpOwotICAgICAgICBtQnVmZmVyU2xvdHMucmVwbGFjZVZhbHVlQXQoYnNpLCBidWZmZXIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGJ1ZmZlciA9IG1CdWZmZXJTbG90cy52YWx1ZUF0KGJzaSk7Ci0gICAgfQotICAgIGludDY0X3QgZnJhbWVOdW0gPSBiaS5tRnJhbWVOdW1iZXI7Ci0KLSAgICBzdGQ6OnNoYXJlZF9wdHI8QWNxdWlyZWRCdWZmZXI+IGFjcXVpcmVkQnVmZmVyID0KLSAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxBY3F1aXJlZEJ1ZmZlcj4oCi0gICAgICAgICAgICAgICAgYnVmZmVyLAotICAgICAgICAgICAgICAgIFtmcmFtZU51bSwgdGhpc10oQWNxdWlyZWRCdWZmZXIgKmJ1ZmZlcil7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEFjcXVpcmVkQnVmZmVyJ3MgZGVzdHJ1Y3RvciBzaG91bGQgYWx3YXlzIGJlIGNhbGxlZCB3aGVuIG1NdXRleCBpcyBsb2NrZWQuCi0gICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhZCBhIHJlZW50cmFudCBtdXRleCwgd2UgY291bGQganVzdCBsb2NrIGl0IGFnYWluIHRvIGVuc3VyZSB0aGlzLgotICAgICAgICAgICAgICAgICAgICBpZiAobU11dGV4LnRyeUxvY2soKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBUUkVTUEFTU19EQkcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NdXRleC51bmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIHdlIGNhbiByZWxlYXNlIGJ1ZmZlcnMgaW1tZWRpYXRlbHkgaWYgbm90IHVzaW5nIGFkYXB0ZXJzCi0gICAgICAgICAgICAgICAgICAgIC8vIGFsdGVybmF0ZWx5LCB3ZSBjb3VsZCBhZGQgdGhlbSB0byBtU2xvdHNUb1JlbGVhc2UsIGJ1dCB3ZSB3b3VsZAotICAgICAgICAgICAgICAgICAgICAvLyBzb21laG93IG5lZWQgdG8gcHJvcGFnYXRlIGZyYW1lIG51bWJlciB0byB0aGF0IHF1ZXVlCi0gICAgICAgICAgICAgICAgICAgIGlmIChidWZmZXItPmlzQ2FjaGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC0tbU51bU91dHN0YW5kaW5nQWNxdWlyZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ29uc3VtZXItPnJlbGVhc2VCdWZmZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+Z2V0U2xvdCgpLCBmcmFtZU51bSwgRUdMX05PX0RJU1BMQVksIEVHTF9OT19TWU5DX0tIUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5nZXRSZWxlYXNlRmVuY2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgIGJpLm1GZW5jZSk7Ci0gICAgVmlkZW9CdWZmZXIgdmlkZW9CdWZmZXJ7YWNxdWlyZWRCdWZmZXIsIGJpLm1UaW1lc3RhbXAsIGJpLm1EYXRhU3BhY2V9OwotICAgICphYiA9IHZpZGVvQnVmZmVyOwotICAgICsrbU51bU91dHN0YW5kaW5nQWNxdWlyZXM7Ci0gICAgcmV0dXJuIE9LOwotfQotCi0vLyBCdWZmZXJRdWV1ZTo6Q29uc3VtZXJMaXN0ZW5lciBjYWxsYmFjawotdm9pZCBHcmFwaGljQnVmZmVyU291cmNlOjpvbkZyYW1lQXZhaWxhYmxlKGNvbnN0IEJ1ZmZlckl0ZW0mIGl0ZW0gX191bnVzZWQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKLQotICAgIEFMT0dWKCJvbkZyYW1lQXZhaWxhYmxlOiBleGVjdXRpbmc9JWQgYXZhaWxhYmxlPSV6dSslZCIsCi0gICAgICAgICAgICBtRXhlY3V0aW5nLCBtQXZhaWxhYmxlQnVmZmVycy5zaXplKCksIG1OdW1BdmFpbGFibGVVbmFjcXVpcmVkQnVmZmVycyk7Ci0gICAgKyttTnVtQXZhaWxhYmxlVW5hY3F1aXJlZEJ1ZmZlcnM7Ci0KLSAgICAvLyBGb3IgQnVmZmVyUXVldWUgd2UgY2Fubm90IGFjcXVpcmUgYSBidWZmZXIgaWYgd2UgY2Fubm90IGltbWVkaWF0ZWx5IGZlZWQgaXQgdG8gdGhlIGNvZGVjCi0gICAgLy8gVU5MRVNTIHdlIGFyZSBkaXNjYXJkaW5nIHRoaXMgYnVmZmVyIChhY3F1aXJpbmcgYW5kIGltbWVkaWF0ZWx5IHJlbGVhc2luZyBpdCksIHdoaWNoIG1ha2VzCi0gICAgLy8gdGhpcyBhbiB1Z2x5IGxvZ2ljLgotICAgIC8vIE5PVEU6IFdlIGNvdWxkIGFsc28gcmVseSBvbiBvdXIgZGVidWcgY291bnRlciBidXQgdGhhdCBpcyBtZWFudCBvbmx5IGFzIGEgZGVidWcgY291bnRlci4KLSAgICBpZiAoIWFyZVdlRGlzY2FyZGluZ0F2YWlsYWJsZUJ1ZmZlcnNfbCgpICYmIG1GcmVlQ29kZWNCdWZmZXJzLmVtcHR5KCkpIHsKLSAgICAgICAgLy8gd2UgbWF5IG5vdCBiZSBhbGxvd2VkIHRvIGFjcXVpcmUgYSBwb3NzaWJseSBlbmNvZGFibGUgYnVmZmVyLCBzbyBqdXN0IG5vdGUgdGhhdAotICAgICAgICAvLyBpdCBpcyBhdmFpbGFibGUKLSAgICAgICAgQUxPR1YoIm9uRnJhbWVBdmFpbGFibGU6IGNhbm5vdCBhY3F1aXJlIGJ1ZmZlciByaWdodCBub3csIGRvIGl0IGxhdGVyIik7Ci0KLSAgICAgICAgKyttUmVwZWF0TGFzdEZyYW1lR2VuZXJhdGlvbjsgLy8gY2FuY2VsIGFueSBwZW5kaW5nIGZyYW1lIHJlcGVhdAotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgVmlkZW9CdWZmZXIgYnVmZmVyOwotICAgIHN0YXR1c190IGVyciA9IGFjcXVpcmVCdWZmZXJfbCgmYnVmZmVyKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCJvbkZyYW1lQXZhaWxhYmxlOiBhY3F1aXJlQnVmZmVyIHJldHVybmVkIGVycj0lZCIsIGVycik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgb25CdWZmZXJBY3F1aXJlZF9sKGJ1ZmZlcik7Ci0gICAgfQotfQotCi1ib29sIEdyYXBoaWNCdWZmZXJTb3VyY2U6OmFyZVdlRGlzY2FyZGluZ0F2YWlsYWJsZUJ1ZmZlcnNfbCgpIHsKLSAgICByZXR1cm4gbUVuZE9mU3RyZWFtU2VudCAvLyBhbHJlYWR5IHNlbnQgRU9TIHRvIGNvZGVjCi0gICAgICAgICAgICB8fCBtT01YTm9kZSA9PSBudWxscHRyIC8vIHRoZXJlIGlzIG5vIGNvZGVjIGNvbm5lY3RlZAotICAgICAgICAgICAgfHwgKG1TdXNwZW5kZWQgJiYgbUFjdGlvblF1ZXVlLmVtcHR5KCkpIC8vIHdlIGFyZSBzdXNwZW5kZWQgYW5kIG5vdCB3YWl0aW5nIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFueSBmdXJ0aGVyIGFjdGlvbgotICAgICAgICAgICAgfHwgIW1FeGVjdXRpbmc7Ci19Ci0KLXZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6b25CdWZmZXJBY3F1aXJlZF9sKGNvbnN0IFZpZGVvQnVmZmVyICZidWZmZXIpIHsKLSAgICBpZiAobUVuZE9mU3RyZWFtU2VudCkgewotICAgICAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGJlIHBvc3NpYmxlIGlmIGEgbmV3IGJ1ZmZlciB3YXMgcXVldWVkIGFmdGVyCi0gICAgICAgIC8vIEVPUyB3YXMgc2lnbmFsZWQsIGkuZS4gdGhlIGFwcCBpcyBtaXNiZWhhdmluZy4KLSAgICAgICAgQUxPR1coIm9uRnJhbWVBdmFpbGFibGU6IEVPUyBpcyBzZW50LCBpZ25vcmluZyBmcmFtZSIpOwotICAgIH0gZWxzZSBpZiAobU9NWE5vZGUgPT0gTlVMTCB8fCAobVN1c3BlbmRlZCAmJiBtQWN0aW9uUXVldWUuZW1wdHkoKSkpIHsKLSAgICAgICAgLy8gRklYTUU6IGlmIHdlIGFyZSBzdXNwZW5kZWQgYnV0IGhhdmUgYSByZXN1bWUgcXVldWVkIHdlIHdpbGwgc3RvcCByZXBlYXRpbmcgdGhlIGxhc3QKLSAgICAgICAgLy8gZnJhbWUuIElzIHRoYXQgdGhlIGRlc2lyZWQgYmVoYXZpb3I/Ci0gICAgICAgIEFMT0dWKCJvbkZyYW1lQXZhaWxhYmxlOiBzdXNwZW5kZWQsIGlnbm9yaW5nIGZyYW1lIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKyttUmVwZWF0TGFzdEZyYW1lR2VuZXJhdGlvbjsgLy8gY2FuY2VsIGFueSBwZW5kaW5nIGZyYW1lIHJlcGVhdAotICAgICAgICBtQXZhaWxhYmxlQnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKLSAgICAgICAgaWYgKG1FeGVjdXRpbmcpIHsKLSAgICAgICAgICAgIGZpbGxDb2RlY0J1ZmZlcl9sKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyIGNhbGxiYWNrCi12b2lkIEdyYXBoaWNCdWZmZXJTb3VyY2U6Om9uQnVmZmVyc1JlbGVhc2VkKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0KLSAgICB1aW50NjRfdCBzbG90TWFzazsKLSAgICB1aW50NjRfdCByZWxlYXNlTWFzazsKLSAgICBpZiAobUNvbnN1bWVyLT5nZXRSZWxlYXNlZEJ1ZmZlcnMoJnJlbGVhc2VNYXNrKSAhPSBOT19FUlJPUikgewotICAgICAgICBzbG90TWFzayA9IDB4ZmZmZmZmZmZmZmZmZmZmZlVMTDsKLSAgICAgICAgQUxPR1coIm9uQnVmZmVyc1JlbGVhc2VkOiB1bmFibGUgdG8gZ2V0IHJlbGVhc2VkIGJ1ZmZlciBzZXQiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzbG90TWFzayA9IHJlbGVhc2VNYXNrOwotICAgICAgICBBTE9HVigib25CdWZmZXJzUmVsZWFzZWQ6IDB4JTAxNiIgUFJJeDY0LCBzbG90TWFzayk7Ci0gICAgfQotCi0gICAgQVN0cmluZyB1bnBvcHVsYXRlZDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IEJ1ZmZlclF1ZXVlOjpOVU1fQlVGRkVSX1NMT1RTOyBpKyspIHsKLSAgICAgICAgaWYgKChzbG90TWFzayAmIDB4MDEpICE9IDApIHsKLSAgICAgICAgICAgIGlmICghZGlzY2FyZEJ1ZmZlckluU2xvdF9sKGkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCF1bnBvcHVsYXRlZC5lbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVucG9wdWxhdGVkLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdW5wb3B1bGF0ZWQuYXBwZW5kKGkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHNsb3RNYXNrID4+PSAxOwotICAgIH0KLSAgICBpZiAoIXVucG9wdWxhdGVkLmVtcHR5KCkpIHsKLSAgICAgICAgQUxPR1coInJlbGVhc2VkIHVucG9wdWxhdGVkIHNsb3RzOiBbJXNdIiwgdW5wb3B1bGF0ZWQuY19zdHIoKSk7Ci0gICAgfQotfQotCi1ib29sIEdyYXBoaWNCdWZmZXJTb3VyY2U6OmRpc2NhcmRCdWZmZXJJblNsb3RfbChHcmFwaGljQnVmZmVyU291cmNlOjpzbG90X2lkIGkpIHsKLSAgICBzc2l6ZV90IGJzaSA9IG1CdWZmZXJTbG90cy5pbmRleE9mS2V5KGkpOwotICAgIGlmIChic2kgPCAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgICBkaXNjYXJkQnVmZmVyQXRTbG90SW5kZXhfbChic2kpOwotICAgICAgICBtQnVmZmVyU2xvdHMucmVtb3ZlSXRlbXNBdChic2kpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19Ci0KLXZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6ZGlzY2FyZEJ1ZmZlckF0U2xvdEluZGV4X2woc3NpemVfdCBic2kpIHsKLSAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q2FjaGVkQnVmZmVyPiYgYnVmZmVyID0gbUJ1ZmZlclNsb3RzLnZhbHVlQXQoYnNpKTsKLSAgICAvLyB1c2UgLTIgaWYgdGhlcmUgaXMgbm8gbGF0ZXN0IGJ1ZmZlciwgYW5kIC0xIGlmIGl0IGlzIG5vIGxvbmdlciBjYWNoZWQKLSAgICBzbG90X2lkIGxhdGVzdEJ1ZmZlclNsb3QgPQotICAgICAgICBtTGF0ZXN0QnVmZmVyLm1CdWZmZXIgPT0gbnVsbHB0ciA/IC0yIDogbUxhdGVzdEJ1ZmZlci5tQnVmZmVyLT5nZXRTbG90KCk7Ci0gICAgQUxPR1YoInJlbGVhc2luZyBhY3F1aXJlZCBidWZmZXI6IFtzbG90PSVkLCB1c2VDb3VudD0lbGRdLCBsYXRlc3Q6IFtzbG90PSVkXSIsCi0gICAgICAgICAgICBtQnVmZmVyU2xvdHMua2V5QXQoYnNpKSwgYnVmZmVyLnVzZV9jb3VudCgpLCBsYXRlc3RCdWZmZXJTbG90KTsKLSAgICBtQnVmZmVyU2xvdHMudmFsdWVBdChic2kpLT5vbkRyb3BwZWRGcm9tQ2FjaGUoKTsKLQotICAgIC8vIElmIHRoZSBzbG90IG9mIGFuIGFjcXVpcmVkIGJ1ZmZlciBpcyBkaXNjYXJkZWQsIHRoYXQgYnVmZmVyIHdpbGwgbm90IGhhdmUgdG8gYmUKLSAgICAvLyByZWxlYXNlZCB0byB0aGUgcHJvZHVjZXIsIHNvIGFjY291bnQgaXQgaGVyZS4gSG93ZXZlciwgaXQgaXMgcG9zc2libGUgdGhhdCB0aGUKLSAgICAvLyBhY3F1aXJlZCBidWZmZXIgaGFzIGFscmVhZHkgYmVlbiBkaXNjYXJkZWQgc28gY2hlY2sgaWYgaXQgc3RpbGwgaXMuCi0gICAgaWYgKGJ1ZmZlci0+aXNBY3F1aXJlZCgpKSB7Ci0gICAgICAgIC0tbU51bU91dHN0YW5kaW5nQWNxdWlyZXM7Ci0gICAgfQotCi0gICAgLy8gY2xlYXIgdGhlIGJ1ZmZlciByZWZlcmVuY2UgKG5vdCB0ZWNobmljYWxseSBuZWVkZWQgYXMgY2FsbGVyIGVpdGhlciByZXBsYWNlcyBvciBkZWxldGVzCi0gICAgLy8gaXQ7IGRvbmUgaGVyZSBmb3Igc2FmZXR5KS4KLSAgICBtQnVmZmVyU2xvdHMuZWRpdFZhbHVlQXQoYnNpKS5yZXNldCgpOwotICAgIENIRUNLX0RCRyhidWZmZXIgPT0gbnVsbHB0cik7Ci19Ci0KLXZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6cmVsZWFzZUFsbEF2YWlsYWJsZUJ1ZmZlcnNfbCgpIHsKLSAgICBtQXZhaWxhYmxlQnVmZmVycy5jbGVhcigpOwotICAgIHdoaWxlIChtTnVtQXZhaWxhYmxlVW5hY3F1aXJlZEJ1ZmZlcnMgPiAwKSB7Ci0gICAgICAgIFZpZGVvQnVmZmVyIGl0ZW07Ci0gICAgICAgIGlmIChhY3F1aXJlQnVmZmVyX2woJml0ZW0pICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HVygicmVsZWFzZUFsbEF2YWlsYWJsZUJ1ZmZlcnM6IGZhaWxlZCB0byBhY3F1aXJlIGF2YWlsYWJsZSB1bmFjcXVpcmVkIGJ1ZmZlciIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyIGNhbGxiYWNrCi12b2lkIEdyYXBoaWNCdWZmZXJTb3VyY2U6Om9uU2lkZWJhbmRTdHJlYW1DaGFuZ2VkKCkgewotICAgIEFMT0dfQVNTRVJUKGZhbHNlLCAiR3JhcGhpY0J1ZmZlclNvdXJjZSBjYW4ndCBjb25zdW1lIHNpZGViYW5kIHN0cmVhbXMiKTsKLX0KLQotc3RhdHVzX3QgR3JhcGhpY0J1ZmZlclNvdXJjZTo6Y29uZmlndXJlKAotICAgICAgICBjb25zdCBzcDxJT214Tm9kZVdyYXBwZXI+JiBvbXhOb2RlLAotICAgICAgICBpbnQzMl90IGRhdGFTcGFjZSwKLSAgICAgICAgaW50MzJfdCBidWZmZXJDb3VudCwKLSAgICAgICAgdWludDMyX3QgZnJhbWVXaWR0aCwKLSAgICAgICAgdWludDMyX3QgZnJhbWVIZWlnaHQsCi0gICAgICAgIHVpbnQzMl90IGNvbnN1bWVyVXNhZ2UpIHsKLSAgICBpZiAob214Tm9kZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0KLSAgICAvLyBDYWxsIHNldE1heEFjcXVpcmVkQnVmZmVyQ291bnQgd2l0aG91dCBsb2NrLgotICAgIC8vIHNldE1heEFjcXVpcmVkQnVmZmVyQ291bnQgY291bGQgY2FsbCBiYWNrIHRvIG9uQnVmZmVyc1JlbGVhc2VkCi0gICAgLy8gaWYgdGhlIGJ1ZmZlciBjb3VudCBjaGFuZ2UgcmVzdWx0cyBpbiByZWxlYXNpbmcgb2YgZXhpc3RpbmcgYnVmZmVycywKLSAgICAvLyB3aGljaCB3b3VsZCBsZWFkIHRvIGRlYWRsb2NrLgotICAgIHN0YXR1c190IGVyciA9IG1Db25zdW1lci0+c2V0TWF4QWNxdWlyZWRCdWZmZXJDb3VudChidWZmZXJDb3VudCk7Ci0gICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBCUSBtYXggYWNxdWlyZWQgYnVmZmVyIGNvdW50IHRvICV1OiAlZCIsCi0gICAgICAgICAgICAgICAgYnVmZmVyQ291bnQsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKLSAgICAgICAgbU9NWE5vZGUgPSBvbXhOb2RlOwotCi0gICAgICAgIGVyciA9IG1Db25zdW1lci0+c2V0RGVmYXVsdEJ1ZmZlclNpemUoZnJhbWVXaWR0aCwgZnJhbWVIZWlnaHQpOwotICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBCUSBkZWZhdWx0IGJ1ZmZlciBzaXplIHRvICV1eCV1OiAlZCIsCi0gICAgICAgICAgICAgICAgICAgIGZyYW1lV2lkdGgsIGZyYW1lSGVpZ2h0LCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN1bWVyVXNhZ2UgfD0gR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSOwotICAgICAgICBtQ29uc3VtZXItPnNldENvbnN1bWVyVXNhZ2VCaXRzKGNvbnN1bWVyVXNhZ2UpOwotCi0gICAgICAgIC8vIFNldHMgdGhlIGRlZmF1bHQgYnVmZmVyIGRhdGEgc3BhY2UKLSAgICAgICAgQUxPR0QoInNldHRpbmcgZGF0YXNwYWNlOiAlI3gsIGFjcXVpcmVkPSVkIiwgZGF0YVNwYWNlLCBtTnVtT3V0c3RhbmRpbmdBY3F1aXJlcyk7Ci0gICAgICAgIG1Db25zdW1lci0+c2V0RGVmYXVsdEJ1ZmZlckRhdGFTcGFjZSgoYW5kcm9pZF9kYXRhc3BhY2UpZGF0YVNwYWNlKTsKLSAgICAgICAgbUxhc3REYXRhc3BhY2UgPSAoYW5kcm9pZF9kYXRhc3BhY2UpZGF0YVNwYWNlOwotCi0gICAgICAgIG1FeGVjdXRpbmcgPSBmYWxzZTsKLSAgICAgICAgbVN1c3BlbmRlZCA9IGZhbHNlOwotICAgICAgICBtRW5kT2ZTdHJlYW0gPSBmYWxzZTsKLSAgICAgICAgbUVuZE9mU3RyZWFtU2VudCA9IGZhbHNlOwotICAgICAgICBtU2tpcEZyYW1lc0JlZm9yZU5zID0gLTFsbDsKLSAgICAgICAgbUZyYW1lUmVwZWF0SW50ZXJ2YWxVcyA9IC0xbGw7Ci0gICAgICAgIG1SZXBlYXRMYXN0RnJhbWVHZW5lcmF0aW9uID0gMDsKLSAgICAgICAgbU91dHN0YW5kaW5nRnJhbWVSZXBlYXRDb3VudCA9IDA7Ci0gICAgICAgIG1MYXRlc3RCdWZmZXIubUJ1ZmZlci5yZXNldCgpOwotICAgICAgICBtRnJhbWVSZXBlYXRCbG9ja2VkT25Db2RlY0J1ZmZlciA9IGZhbHNlOwotICAgICAgICBtRnBzID0gLTEuMDsKLSAgICAgICAgbUNhcHR1cmVGcHMgPSAtMS4wOwotICAgICAgICBtQmFzZUNhcHR1cmVVcyA9IC0xbGw7Ci0gICAgICAgIG1CYXNlRnJhbWVVcyA9IC0xbGw7Ci0gICAgICAgIG1QcmV2Q2FwdHVyZVVzID0gLTFsbDsKLSAgICAgICAgbVByZXZGcmFtZVVzID0gLTFsbDsKLSAgICAgICAgbUZyYW1lQ291bnQgPSAwOwotICAgICAgICBtSW5wdXRCdWZmZXJUaW1lT2Zmc2V0VXMgPSAwOwotICAgICAgICBtU3RvcFRpbWVVcyA9IC0xOwotICAgICAgICBtQWN0aW9uUXVldWUuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEdyYXBoaWNCdWZmZXJTb3VyY2U6OnNldFN1c3BlbmQoYm9vbCBzdXNwZW5kLCBpbnQ2NF90IHN1c3BlbmRTdGFydFRpbWVVcykgewotICAgIEFMT0dWKCJzZXRTdXNwZW5kPSVkIGF0IHRpbWUgJWxsZCB1cyIsIHN1c3BlbmQsIChsb25nIGxvbmcpc3VzcGVuZFN0YXJ0VGltZVVzKTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOwotCi0gICAgaWYgKG1TdG9wVGltZVVzICE9IC0xKSB7Ci0gICAgICAgIEFMT0dFKCJzZXRTdXNwZW5kIGZhaWxlZCBhcyBTVE9QIGFjdGlvbiBpcyBwZW5kaW5nIik7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICAvLyBQdXNoIHRoZSBhY3Rpb24gdG8gdGhlIHF1ZXVlLgotICAgIGlmIChzdXNwZW5kU3RhcnRUaW1lVXMgIT0gLTEpIHsKLSAgICAgICAgLy8gc3VzcGVuZFN0YXJ0VGltZVVzIG11c3QgYmUgc21hbGxlciBvciBlcXVhbCB0byBjdXJyZW50IHN5c3RlbVRpbWUuCi0gICAgICAgIGludDY0X3QgY3VycmVudFN5c3RlbVRpbWVVcyA9IHN5c3RlbVRpbWUoKSAvIDEwMDA7Ci0gICAgICAgIGlmIChzdXNwZW5kU3RhcnRUaW1lVXMgPiBjdXJyZW50U3lzdGVtVGltZVVzKSB7Ci0gICAgICAgICAgICBBTE9HRSgic2V0U3VzcGVuZCBmYWlsZWQuICVsbGQgaXMgbGFyZ2VyIHRoYW4gY3VycmVudCBzeXN0ZW0gdGltZSAlbGxkIHVzIiwKLSAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylzdXNwZW5kU3RhcnRUaW1lVXMsIChsb25nIGxvbmcpY3VycmVudFN5c3RlbVRpbWVVcyk7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1MYXN0QWN0aW9uVGltZVVzICE9IC0xICYmIHN1c3BlbmRTdGFydFRpbWVVcyA8IG1MYXN0QWN0aW9uVGltZVVzKSB7Ci0gICAgICAgICAgICBBTE9HRSgic2V0U3VzcGVuZCBmYWlsZWQuICVsbGQgaXMgc21hbGxlciB0aGFuIGxhc3QgYWN0aW9uIHRpbWUgJWxsZCB1cyIsCi0gICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpc3VzcGVuZFN0YXJ0VGltZVVzLCAobG9uZyBsb25nKW1MYXN0QWN0aW9uVGltZVVzKTsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfQotICAgICAgICBtTGFzdEFjdGlvblRpbWVVcyA9IHN1c3BlbmRTdGFydFRpbWVVczsKLSAgICAgICAgQWN0aW9uSXRlbSBhY3Rpb247Ci0gICAgICAgIGFjdGlvbi5tQWN0aW9uID0gc3VzcGVuZCA/IEFjdGlvbkl0ZW06OlBBVVNFIDogQWN0aW9uSXRlbTo6UkVTVU1FOwotICAgICAgICBhY3Rpb24ubUFjdGlvblRpbWVVcyA9IHN1c3BlbmRTdGFydFRpbWVVczsKLSAgICAgICAgQUxPR1YoIlB1c2ggJXMgYWN0aW9uIGludG8gYWN0aW9uUXVldWUiLCBzdXNwZW5kID8gIlBBVVNFIiA6ICJSRVNVTUUiKTsKLSAgICAgICAgbUFjdGlvblF1ZXVlLnB1c2hfYmFjayhhY3Rpb24pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChzdXNwZW5kKSB7Ci0gICAgICAgICAgICBtU3VzcGVuZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIHJlbGVhc2VBbGxBdmFpbGFibGVCdWZmZXJzX2woKTsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TdXNwZW5kZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChtRXhlY3V0aW5nICYmICFoYXZlQXZhaWxhYmxlQnVmZmVyc19sKCkKLSAgICAgICAgICAgICAgICAgICAgJiYgbUZyYW1lUmVwZWF0QmxvY2tlZE9uQ29kZWNCdWZmZXIpIHsKLSAgICAgICAgICAgICAgICBpZiAocmVwZWF0TGF0ZXN0QnVmZmVyX2woKSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigic3VzcGVuZC9kZWZlcnJlZCByZXBlYXRMYXRlc3RCdWZmZXJfbCBTVUNDRVNTIik7Ci0gICAgICAgICAgICAgICAgICAgIG1GcmFtZVJlcGVhdEJsb2NrZWRPbkNvZGVjQnVmZmVyID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoInN1c3BlbmQvZGVmZXJyZWQgcmVwZWF0TGF0ZXN0QnVmZmVyX2wgRkFJTFVSRSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEdyYXBoaWNCdWZmZXJTb3VyY2U6OnNldFJlcGVhdFByZXZpb3VzRnJhbWVEZWxheVVzKGludDY0X3QgcmVwZWF0QWZ0ZXJVcykgewotICAgIEFMT0dWKCJzZXRSZXBlYXRQcmV2aW91c0ZyYW1lRGVsYXlVczogZGVsYXlVcz0lbGxkIiwgKGxvbmcgbG9uZylyZXBlYXRBZnRlclVzKTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOwotCi0gICAgaWYgKG1FeGVjdXRpbmcgfHwgcmVwZWF0QWZ0ZXJVcyA8PSAwbGwpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIG1GcmFtZVJlcGVhdEludGVydmFsVXMgPSByZXBlYXRBZnRlclVzOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2V0VGltZU9mZnNldFVzKGludDY0X3QgdGltZU9mZnNldFVzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7Ci0KLSAgICAvLyB0aW1lT2Zmc2V0VXMgbXVzdCBiZSBuZWdhdGl2ZSBmb3IgYWRqdXN0bWVudC4KLSAgICBpZiAodGltZU9mZnNldFVzID49IDBsbCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgbUlucHV0QnVmZmVyVGltZU9mZnNldFVzID0gdGltZU9mZnNldFVzOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2V0TWF4RnBzKGZsb2F0IG1heEZwcykgewotICAgIEFMT0dWKCJzZXRNYXhGcHM6IG1heEZwcz0lbGxkIiwgKGxvbmcgbG9uZyltYXhGcHMpOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7Ci0KLSAgICBpZiAobUV4ZWN1dGluZykgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgbUZyYW1lRHJvcHBlciA9IG5ldyBGcmFtZURyb3BwZXIoKTsKLSAgICBzdGF0dXNfdCBlcnIgPSBtRnJhbWVEcm9wcGVyLT5zZXRNYXhGcmFtZVJhdGUobWF4RnBzKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIG1GcmFtZURyb3BwZXIuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEdyYXBoaWNCdWZmZXJTb3VyY2U6OnNldFN0YXJ0VGltZVVzKGludDY0X3Qgc2tpcEZyYW1lc0JlZm9yZVVzKSB7Ci0gICAgQUxPR1YoInNldFN0YXJ0VGltZVVzOiBza2lwRnJhbWVzQmVmb3JlVXM9JWxsZCIsIChsb25nIGxvbmcpc2tpcEZyYW1lc0JlZm9yZVVzKTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOwotCi0gICAgbVNraXBGcmFtZXNCZWZvcmVOcyA9Ci0gICAgICAgICAgICAoc2tpcEZyYW1lc0JlZm9yZVVzID4gMCkgPyAoc2tpcEZyYW1lc0JlZm9yZVVzICogMTAwMCkgOiAtMWxsOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBHcmFwaGljQnVmZmVyU291cmNlOjpzZXRTdG9wVGltZVVzKGludDY0X3Qgc3RvcFRpbWVVcykgewotICAgIEFMT0dWKCJzZXRTdG9wVGltZVVzOiAlbGxkIHVzIiwgKGxvbmcgbG9uZylzdG9wVGltZVVzKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKLQotICAgIGlmIChtU3RvcFRpbWVVcyAhPSAtMSkgewotICAgICAgICAvLyBJZ25vcmUgaWYgc3RvcCB0aW1lIGhhcyBhbHJlYWR5IGJlZW4gc2V0Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICAvLyBzdG9wVGltZVVzIG11c3QgYmUgc21hbGxlciBvciBlcXVhbCB0byBjdXJyZW50IHN5c3RlbVRpbWUuCi0gICAgaW50NjRfdCBjdXJyZW50U3lzdGVtVGltZVVzID0gc3lzdGVtVGltZSgpIC8gMTAwMDsKLSAgICBpZiAoc3RvcFRpbWVVcyA+IGN1cnJlbnRTeXN0ZW1UaW1lVXMpIHsKLSAgICAgICAgQUxPR0UoInNldFN0b3BUaW1lVXMgZmFpbGVkLiAlbGxkIGlzIGxhcmdlciB0aGFuIGN1cnJlbnQgc3lzdGVtIHRpbWUgJWxsZCB1cyIsCi0gICAgICAgICAgICAobG9uZyBsb25nKXN0b3BUaW1lVXMsIChsb25nIGxvbmcpY3VycmVudFN5c3RlbVRpbWVVcyk7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgaWYgKG1MYXN0QWN0aW9uVGltZVVzICE9IC0xICYmIHN0b3BUaW1lVXMgPCBtTGFzdEFjdGlvblRpbWVVcykgewotICAgICAgICBBTE9HRSgic2V0U3VzcGVuZCBmYWlsZWQuICVsbGQgaXMgc21hbGxlciB0aGFuIGxhc3QgYWN0aW9uIHRpbWUgJWxsZCB1cyIsCi0gICAgICAgICAgICAobG9uZyBsb25nKXN0b3BUaW1lVXMsIChsb25nIGxvbmcpbUxhc3RBY3Rpb25UaW1lVXMpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgIG1MYXN0QWN0aW9uVGltZVVzID0gc3RvcFRpbWVVczsKLSAgICBBY3Rpb25JdGVtIGFjdGlvbjsKLSAgICBhY3Rpb24ubUFjdGlvbiA9IEFjdGlvbkl0ZW06OlNUT1A7Ci0gICAgYWN0aW9uLm1BY3Rpb25UaW1lVXMgPSBzdG9wVGltZVVzOwotICAgIG1BY3Rpb25RdWV1ZS5wdXNoX2JhY2soYWN0aW9uKTsKLSAgICBtU3RvcFRpbWVVcyA9IHN0b3BUaW1lVXM7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBHcmFwaGljQnVmZmVyU291cmNlOjpnZXRTdG9wVGltZU9mZnNldFVzKGludDY0X3QgKnN0b3BUaW1lT2Zmc2V0VXMpIHsKLSAgICBBTE9HVigiZ2V0U3RvcFRpbWVPZmZzZXRVcyIpOwotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOwotICAgIGlmIChtU3RvcFRpbWVVcyA9PSAtMSkgewotICAgICAgICBBTE9HVygiRmFpbCB0byByZXR1cm4gc3RvcFRpbWVPZmZzZXRVcyBhcyBzdG9wIHRpbWUgaXMgbm90IHNldCIpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgICpzdG9wVGltZU9mZnNldFVzID0KLSAgICAgICAgbUxhc3RGcmFtZVRpbWVzdGFtcFVzID09IC0xID8gMCA6IG1TdG9wVGltZVVzIC0gbUxhc3RGcmFtZVRpbWVzdGFtcFVzOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2V0VGltZUxhcHNlQ29uZmlnKGRvdWJsZSBmcHMsIGRvdWJsZSBjYXB0dXJlRnBzKSB7Ci0gICAgQUxPR1YoInNldFRpbWVMYXBzZUNvbmZpZzogZnBzPSVsZywgY2FwdHVyZUZwcz0lbGciLAotICAgICAgICAgICAgZnBzLCBjYXB0dXJlRnBzKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKLQotICAgIGlmIChtRXhlY3V0aW5nIHx8ICEoZnBzID4gMCkgfHwgIShjYXB0dXJlRnBzID4gMCkpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIG1GcHMgPSBmcHM7Ci0gICAgbUNhcHR1cmVGcHMgPSBjYXB0dXJlRnBzOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBHcmFwaGljQnVmZmVyU291cmNlOjpzZXRDb2xvckFzcGVjdHMoaW50MzJfdCBhc3BlY3RzUGFja2VkKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7Ci0gICAgbURlZmF1bHRDb2xvckFzcGVjdHNQYWNrZWQgPSBhc3BlY3RzUGFja2VkOwotICAgIENvbG9yQXNwZWN0cyBjb2xvckFzcGVjdHMgPSBDb2xvclV0aWxzOjp1bnBhY2tUb0NvbG9yQXNwZWN0cyhhc3BlY3RzUGFja2VkKTsKLSAgICBBTE9HRCgicmVxdWVzdGluZyBjb2xvciBhc3BlY3RzIChSOiVkKCVzKSwgUDolZCglcyksIE06JWQoJXMpLCBUOiVkKCVzKSkiLAotICAgICAgICAgICAgY29sb3JBc3BlY3RzLm1SYW5nZSwgYXNTdHJpbmcoY29sb3JBc3BlY3RzLm1SYW5nZSksCi0gICAgICAgICAgICBjb2xvckFzcGVjdHMubVByaW1hcmllcywgYXNTdHJpbmcoY29sb3JBc3BlY3RzLm1QcmltYXJpZXMpLAotICAgICAgICAgICAgY29sb3JBc3BlY3RzLm1NYXRyaXhDb2VmZnMsIGFzU3RyaW5nKGNvbG9yQXNwZWN0cy5tTWF0cml4Q29lZmZzKSwKLSAgICAgICAgICAgIGNvbG9yQXNwZWN0cy5tVHJhbnNmZXIsIGFzU3RyaW5nKGNvbG9yQXNwZWN0cy5tVHJhbnNmZXIpKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKLSAgICBBTE9HVigic2lnbmFsRW5kT2ZJbnB1dFN0cmVhbTogZXhlY3V0aW5nPSVkIGF2YWlsYWJsZT0lenUrJWQgZW9zPSVkIiwKLSAgICAgICAgICAgIG1FeGVjdXRpbmcsIG1BdmFpbGFibGVCdWZmZXJzLnNpemUoKSwgbU51bUF2YWlsYWJsZVVuYWNxdWlyZWRCdWZmZXJzLCBtRW5kT2ZTdHJlYW0pOwotCi0gICAgaWYgKG1FbmRPZlN0cmVhbSkgewotICAgICAgICBBTE9HRSgiRU9TIHdhcyBhbHJlYWR5IHNpZ25hbGVkIik7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICAvLyBTZXQgdGhlIGVuZC1vZi1zdHJlYW0gZmxhZy4gIElmIG5vIGZyYW1lcyBhcmUgcGVuZGluZyBmcm9tIHRoZQotICAgIC8vIEJ1ZmZlclF1ZXVlLCBhbmQgYSBjb2RlYyBidWZmZXIgaXMgYXZhaWxhYmxlLCBhbmQgd2UncmUgZXhlY3V0aW5nLAotICAgIC8vIGFuZCB0aGVyZSBpcyBubyBzdG9wIHRpbWVzdGFtcCwgd2UgaW5pdGlhdGUgdGhlIEVPUyBmcm9tIGhlcmUuCi0gICAgLy8gT3RoZXJ3aXNlLCB3ZSdsbCBsZXQgY29kZWNCdWZmZXJFbXB0aWVkKCkgKG9yIG9teEV4ZWN1dGluZykgZG8gaXQuCi0gICAgLy8KLSAgICAvLyBOb3RlOiBpZiB0aGVyZSBhcmUgbm8gcGVuZGluZyBmcmFtZXMgYW5kIGFsbCBjb2RlYyBidWZmZXJzIGFyZQotICAgIC8vIGF2YWlsYWJsZSwgd2UgKm11c3QqIHN1Ym1pdCB0aGUgRU9TIGZyb20gaGVyZSBvciB3ZSdsbCBqdXN0Ci0gICAgLy8gc3RhbGwgc2luY2Ugbm8gZnV0dXJlIGV2ZW50cyBhcmUgZXhwZWN0ZWQuCi0gICAgbUVuZE9mU3RyZWFtID0gdHJ1ZTsKLQotICAgIGlmIChtU3RvcFRpbWVVcyA9PSAtMSAmJiBtRXhlY3V0aW5nICYmICFoYXZlQXZhaWxhYmxlQnVmZmVyc19sKCkpIHsKLSAgICAgICAgc3VibWl0RW5kT2ZJbnB1dFN0cmVhbV9sKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIEdyYXBoaWNCdWZmZXJTb3VyY2U6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgc3dpdGNoIChtc2ctPndoYXQoKSkgewotICAgICAgICBjYXNlIGtXaGF0UmVwZWF0TGFzdEZyYW1lOgotICAgICAgICB7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKLQotICAgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOwotCi0gICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPSBtUmVwZWF0TGFzdEZyYW1lR2VuZXJhdGlvbikgewotICAgICAgICAgICAgICAgIC8vIHN0YWxlCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghbUV4ZWN1dGluZyB8fCBoYXZlQXZhaWxhYmxlQnVmZmVyc19sKCkpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYm9vbCBzdWNjZXNzID0gcmVwZWF0TGF0ZXN0QnVmZmVyX2woKTsKLSAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInJlcGVhdExhdGVzdEJ1ZmZlcl9sIFNVQ0NFU1MiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInJlcGVhdExhdGVzdEJ1ZmZlcl9sIEZBSUxVUkUiKTsKLSAgICAgICAgICAgICAgICBtRnJhbWVSZXBlYXRCbG9ja2VkT25Db2RlY0J1ZmZlciA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBUUkVTUEFTUygpOwotICAgIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVguY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5YzQwMTkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIk9NWCIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPGRsZmNuLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9CV0dyYXBoaWNCdWZmZXJTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBub2RlIGlkcyBhcmUgY3JlYXRlZCBieSBjb25jYXRlbmF0aW5nIHRoZSBwaWQgd2l0aCBhIDE2LWJpdCBjb3VudGVyCi1zdGF0aWMgc2l6ZV90IGtNYXhOb2RlSW5zdGFuY2VzID0gKDEgPDwgMTYpOwotCi1PTVg6Ok9NWCgpIDogbU1hc3RlcihuZXcgT01YTWFzdGVyKSwgbVBhcnNlcigpIHsKLX0KLQotT01YOjp+T01YKCkgewotICAgIGRlbGV0ZSBtTWFzdGVyOwotICAgIG1NYXN0ZXIgPSBOVUxMOwotfQotCi12b2lkIE9NWDo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiAmdGhlX2xhdGVfd2hvKSB7Ci0gICAgc3A8T01YTm9kZUluc3RhbmNlPiBpbnN0YW5jZTsKLQotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUxpdmVOb2Rlcy5pbmRleE9mS2V5KHRoZV9sYXRlX3dobyk7Ci0KLSAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgQUxPR0UoImIvMjc1OTcxMDMsIG5vbmV4aXN0ZW50IG9ic2VydmVyIG9uIGJpbmRlckRpZWQiKTsKLSAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjc1OTcxMDMiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGluc3RhbmNlID0gbUxpdmVOb2Rlcy5lZGl0VmFsdWVBdChpbmRleCk7Ci0gICAgICAgIG1MaXZlTm9kZXMucmVtb3ZlSXRlbXNBdChpbmRleCk7Ci0gICAgfQotCi0gICAgaW5zdGFuY2UtPm9uT2JzZXJ2ZXJEaWVkKCk7Ci19Ci0KLXN0YXR1c190IE9NWDo6bGlzdE5vZGVzKExpc3Q8Q29tcG9uZW50SW5mbz4gKmxpc3QpIHsKLSAgICBsaXN0LT5jbGVhcigpOwotCi0gICAgT01YX1UzMiBpbmRleCA9IDA7Ci0gICAgY2hhciBjb21wb25lbnROYW1lWzI1Nl07Ci0gICAgd2hpbGUgKG1NYXN0ZXItPmVudW1lcmF0ZUNvbXBvbmVudHMoCi0gICAgICAgICAgICAgICAgY29tcG9uZW50TmFtZSwgc2l6ZW9mKGNvbXBvbmVudE5hbWUpLCBpbmRleCkgPT0gT01YX0Vycm9yTm9uZSkgewotICAgICAgICBsaXN0LT5wdXNoX2JhY2soQ29tcG9uZW50SW5mbygpKTsKLSAgICAgICAgQ29tcG9uZW50SW5mbyAmaW5mbyA9ICotLWxpc3QtPmVuZCgpOwotCi0gICAgICAgIGluZm8ubU5hbWUgPSBjb21wb25lbnROYW1lOwotCi0gICAgICAgIFZlY3RvcjxTdHJpbmc4PiByb2xlczsKLSAgICAgICAgT01YX0VSUk9SVFlQRSBlcnIgPQotICAgICAgICAgICAgbU1hc3Rlci0+Z2V0Um9sZXNPZkNvbXBvbmVudChjb21wb25lbnROYW1lLCAmcm9sZXMpOwotCi0gICAgICAgIGlmIChlcnIgPT0gT01YX0Vycm9yTm9uZSkgewotICAgICAgICAgICAgZm9yIChPTVhfVTMyIGkgPSAwOyBpIDwgcm9sZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgICAgICBpbmZvLm1Sb2xlcy5wdXNoX2JhY2socm9sZXNbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgKytpbmRleDsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IE9NWDo6YWxsb2NhdGVOb2RlKAotICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBzcDxJT01YT2JzZXJ2ZXI+ICZvYnNlcnZlciwKLSAgICAgICAgc3A8SU9NWE5vZGU+ICpvbXhOb2RlKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIG9teE5vZGUtPmNsZWFyKCk7Ci0KLSAgICBpZiAobUxpdmVOb2Rlcy5zaXplKCkgPT0ga01heE5vZGVJbnN0YW5jZXMpIHsKLSAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICB9Ci0KLSAgICBzcDxPTVhOb2RlSW5zdGFuY2U+IGluc3RhbmNlID0gbmV3IE9NWE5vZGVJbnN0YW5jZSh0aGlzLCBvYnNlcnZlciwgbmFtZSk7Ci0KLSAgICBPTVhfQ09NUE9ORU5UVFlQRSAqaGFuZGxlOwotICAgIE9NWF9FUlJPUlRZUEUgZXJyID0gbU1hc3Rlci0+bWFrZUNvbXBvbmVudEluc3RhbmNlKAotICAgICAgICAgICAgbmFtZSwgJk9NWE5vZGVJbnN0YW5jZTo6a0NhbGxiYWNrcywKLSAgICAgICAgICAgIGluc3RhbmNlLmdldCgpLCAmaGFuZGxlKTsKLQotICAgIGlmIChlcnIgIT0gT01YX0Vycm9yTm9uZSkgewotICAgICAgICBBTE9HRSgiRkFJTEVEIHRvIGFsbG9jYXRlIG9teCBjb21wb25lbnQgJyVzJyBlcnI9JXMoJSN4KSIsIG5hbWUsIGFzU3RyaW5nKGVyciksIGVycik7Ci0KLSAgICAgICAgcmV0dXJuIFN0YXR1c0Zyb21PTVhFcnJvcihlcnIpOwotICAgIH0KLSAgICBpbnN0YW5jZS0+c2V0SGFuZGxlKGhhbmRsZSk7Ci0KLSAgICAvLyBGaW5kIHF1aXJrcyBmcm9tIG1QYXJzZXIKLSAgICBjb25zdCBhdXRvJiBjb2RlYyA9IG1QYXJzZXIuZ2V0Q29kZWNNYXAoKS5maW5kKG5hbWUpOwotICAgIGlmIChjb2RlYyA9PSBtUGFyc2VyLmdldENvZGVjTWFwKCkuY2VuZCgpKSB7Ci0gICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gb2J0YWluIHF1aXJrcyBmb3Igb214IGNvbXBvbmVudCAnJXMnIGZyb20gWE1MIGZpbGVzIiwKLSAgICAgICAgICAgICAgICBuYW1lKTsKLSAgICB9IGVsc2UgewotICAgICAgICB1aW50MzJfdCBxdWlya3MgPSAwOwotICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHF1aXJrIDogY29kZWMtPnNlY29uZC5xdWlya1NldCkgewotICAgICAgICAgICAgaWYgKHF1aXJrID09ICJyZXF1aXJlcy1hbGxvY2F0ZS1vbi1pbnB1dC1wb3J0cyIpIHsKLSAgICAgICAgICAgICAgICBxdWlya3MgfD0gT01YTm9kZUluc3RhbmNlOjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25JbnB1dFBvcnRzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHF1aXJrID09ICJyZXF1aXJlcy1hbGxvY2F0ZS1vbi1vdXRwdXQtcG9ydHMiKSB7Ci0gICAgICAgICAgICAgICAgcXVpcmtzIHw9IE9NWE5vZGVJbnN0YW5jZTo6Ci0gICAgICAgICAgICAgICAgICAgICAgICBrUmVxdWlyZXNBbGxvY2F0ZUJ1ZmZlck9uT3V0cHV0UG9ydHM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW5zdGFuY2UtPnNldFF1aXJrcyhxdWlya3MpOwotICAgIH0KLQotICAgIG1MaXZlTm9kZXMuYWRkKElJbnRlcmZhY2U6OmFzQmluZGVyKG9ic2VydmVyKSwgaW5zdGFuY2UpOwotICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKG9ic2VydmVyKS0+bGlua1RvRGVhdGgodGhpcyk7Ci0KLSAgICAqb214Tm9kZSA9IGluc3RhbmNlOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBPTVg6OmZyZWVOb2RlKGNvbnN0IHNwPE9NWE5vZGVJbnN0YW5jZT4gJmluc3RhbmNlKSB7Ci0gICAgaWYgKGluc3RhbmNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICAgICAgc3NpemVfdCBpbmRleCA9IG1MaXZlTm9kZXMuaW5kZXhPZktleShJSW50ZXJmYWNlOjphc0JpbmRlcihpbnN0YW5jZS0+b2JzZXJ2ZXIoKSkpOwotICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAvLyBUaGlzIGNvdWxkIGNvbmNlaXZhYmx5IGhhcHBlbiBpZiB0aGUgb2JzZXJ2ZXIgZGllcyBhdCByb3VnaGx5IHRoZQotICAgICAgICAgICAgLy8gc2FtZSB0aW1lIHRoYXQgYSBjbGllbnQgYXR0ZW1wdHMgdG8gZnJlZSB0aGUgbm9kZSBleHBsaWNpdGx5LgotCi0gICAgICAgICAgICAvLyBOT1RFOiBpdCdzIGd1YXJhbnRlZWQgdGhhdCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYXQgbW9zdCBvbmNlIHBlcgotICAgICAgICAgICAgLy8gICAgICAgaW5zdGFuY2UuCi0gICAgICAgICAgICBBTE9HVigiZnJlZU5vZGU6IGluc3RhbmNlIGFscmVhZHkgcmVtb3ZlZCBmcm9tIGJvb2sta2VlcGluZy4iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1MaXZlTm9kZXMucmVtb3ZlSXRlbXNBdChpbmRleCk7Ci0gICAgICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihpbnN0YW5jZS0+b2JzZXJ2ZXIoKSktPnVubGlua1RvRGVhdGgodGhpcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBDSEVDSyhpbnN0YW5jZS0+aGFuZGxlKCkgIT0gTlVMTCk7Ci0gICAgT01YX0VSUk9SVFlQRSBlcnIgPSBtTWFzdGVyLT5kZXN0cm95Q29tcG9uZW50SW5zdGFuY2UoCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxPTVhfQ09NUE9ORU5UVFlQRSAqPihpbnN0YW5jZS0+aGFuZGxlKCkpKTsKLSAgICBBTE9HVigiZnJlZU5vZGU6IGhhbmRsZSBkZXN0cm95ZWQ6ICVwIiwgaW5zdGFuY2UtPmhhbmRsZSgpKTsKLQotICAgIHJldHVybiBTdGF0dXNGcm9tT01YRXJyb3IoZXJyKTsKLX0KLQotc3RhdHVzX3QgT01YOjpjcmVhdGVJbnB1dFN1cmZhY2UoCi0gICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICpidWZmZXJQcm9kdWNlciwKLSAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJTb3VyY2U+ICpidWZmZXJTb3VyY2UpIHsKLSAgICBpZiAoYnVmZmVyUHJvZHVjZXIgPT0gTlVMTCB8fCBidWZmZXJTb3VyY2UgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiYi8yNTg4NDA1NiIpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+IGdyYXBoaWNCdWZmZXJTb3VyY2UgPSBuZXcgR3JhcGhpY0J1ZmZlclNvdXJjZSgpOwotICAgIHN0YXR1c190IGVyciA9IGdyYXBoaWNCdWZmZXJTb3VyY2UtPmluaXRDaGVjaygpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgcGVyc2lzdGVudCBpbnB1dCBzdXJmYWNlOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAqYnVmZmVyUHJvZHVjZXIgPSBncmFwaGljQnVmZmVyU291cmNlLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCk7Ci0gICAgKmJ1ZmZlclNvdXJjZSA9IG5ldyBCV0dyYXBoaWNCdWZmZXJTb3VyY2UoZ3JhcGhpY0J1ZmZlclNvdXJjZSk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuY3BwCmluZGV4IGZkOTdmZGMuLjA5NjdiNWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuY3BwCkBAIC0yMiw2ICsyMiw4IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogCisjaW5jbHVkZSA8dm5ka3N1cHBvcnQvbGlua2VyLmg+CisKICNpbmNsdWRlIDxkbGZjbi5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CiAKQEAgLTY3LDcgKzY5LDcgQEAKIH0KIAogdm9pZCBPTVhNYXN0ZXI6OmFkZFBsdWdpbihjb25zdCBjaGFyICpsaWJuYW1lKSB7Ci0gICAgbVZlbmRvckxpYkhhbmRsZSA9IGRsb3BlbihsaWJuYW1lLCBSVExEX05PVyk7CisgICAgbVZlbmRvckxpYkhhbmRsZSA9IGFuZHJvaWRfbG9hZF9zcGhhbF9saWJyYXJ5KGxpYm5hbWUsIFJUTERfTk9XKTsKIAogICAgIGlmIChtVmVuZG9yTGliSGFuZGxlID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcAppbmRleCBhOWZiZDcxLi43ZDJjMmRkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcApAQCAtMzQ0LDcgKzM0NCw3IEBACiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBPTVhOb2RlSW5zdGFuY2U6Ok9NWE5vZGVJbnN0YW5jZSgKLSAgICAgICAgT214Tm9kZU93bmVyICpvd25lciwgY29uc3Qgc3A8SU9NWE9ic2VydmVyPiAmb2JzZXJ2ZXIsIGNvbnN0IGNoYXIgKm5hbWUpCisgICAgICAgIE9teCAqb3duZXIsIGNvbnN0IHNwPElPTVhPYnNlcnZlcj4gJm9ic2VydmVyLCBjb25zdCBjaGFyICpuYW1lKQogICAgIDogbU93bmVyKG93bmVyKSwKICAgICAgIG1IYW5kbGUoTlVMTCksCiAgICAgICBtT2JzZXJ2ZXIob2JzZXJ2ZXIpLApAQCAtMzU0LDcgKzM1NCw3IEBACiAgICAgICBtUXVpcmtzKDApLAogICAgICAgbUJ1ZmZlcklEQ291bnQoMCksCiAgICAgICBtUmVzdG9yZVB0c0ZhaWxlZChmYWxzZSksCi0gICAgICBtTWF4VGltZXN0YW1wR2FwVXMoLTFsbCksCisgICAgICBtTWF4VGltZXN0YW1wR2FwVXMoMGxsKSwKICAgICAgIG1QcmV2T3JpZ2luYWxUaW1lVXMoLTFsbCksCiAgICAgICBtUHJldk1vZGlmaWVkVGltZVVzKC0xbGwpCiB7CkBAIC0xODgyLDcgKzE4ODIsOSBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIG1NYXhUaW1lc3RhbXBHYXBVcyA9IChpbnQ2NF90KSgoT01YX1BBUkFNX1UzMlRZUEUqKXBhcmFtcyktPm5VMzI7CisgICAgLy8gVGhlIGluY29taW5nIG51bWJlciBpcyBhbiBpbnQzMl90IGNvbnRhaW5lZCBpbiBPTVhfVTMyLgorICAgIC8vIENhc3QgdG8gaW50MzJfdCBmaXJzdCB0aGVuIGludDY0X3QuCisgICAgbU1heFRpbWVzdGFtcEdhcFVzID0gKGludDMyX3QpKChPTVhfUEFSQU1fVTMyVFlQRSopcGFyYW1zKS0+blUzMjsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTE5MDYsMTIgKzE5MDgsMjYgQEAKICAgICAgICAgQUxPR1YoIklOICB0aW1lc3RhbXA6ICVsbGQgLT4gJWxsZCIsCiAgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KG9yaWdpbmFsVGltZVVzKSwKICAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4odGltZXN0YW1wKSk7CisgICAgfSBlbHNlIGlmIChtTWF4VGltZXN0YW1wR2FwVXMgPCAwbGwpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQXBwbHkgYSBmaXhlZCB0aW1lc3RhbXAgZ2FwIGJldHdlZW4gYWRqYWNlbnQgZnJhbWVzLgorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIGlzIHVzZWQgYnkgc2NlbmFyaW9zIGxpa2Ugc3RpbGwgaW1hZ2UgY2FwdHVyZSB3aGVyZSB0aW1lc3RhbXBzCisgICAgICAgICAqIG9uIGZyYW1lcyBjb3VsZCBnbyBmb3J3YXJkIG9yIGJhY2t3YXJkLiBTb21lIGVuY29kZXJzIG1heSBzaWxlbnRseQorICAgICAgICAgKiBkcm9wIGZyYW1lcyB3aGVuIGl0IGdvZXMgYmFja3dhcmQgKG9yIGV2ZW4gc3RheSB1bmNoYW5nZWQpLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKG1QcmV2T3JpZ2luYWxUaW1lVXMgPj0gMGxsKSB7CisgICAgICAgICAgICB0aW1lc3RhbXAgPSBtUHJldk1vZGlmaWVkVGltZVVzIC0gbU1heFRpbWVzdGFtcEdhcFVzOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJJTiAgdGltZXN0YW1wOiAlbGxkIC0+ICVsbGQiLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPihvcmlnaW5hbFRpbWVVcyksCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KHRpbWVzdGFtcCkpOwogICAgIH0KIAogICAgIG1QcmV2T3JpZ2luYWxUaW1lVXMgPSBvcmlnaW5hbFRpbWVVczsKICAgICBtUHJldk1vZGlmaWVkVGltZVVzID0gdGltZXN0YW1wOwogCi0gICAgaWYgKG1NYXhUaW1lc3RhbXBHYXBVcyA+IDBsbCAmJiAhbVJlc3RvcmVQdHNGYWlsZWQpIHsKKyAgICBpZiAobU1heFRpbWVzdGFtcEdhcFVzICE9IDBsbCAmJiAhbVJlc3RvcmVQdHNGYWlsZWQpIHsKICAgICAgICAgbU9yaWdpbmFsVGltZVVzLmFkZCh0aW1lc3RhbXAsIG9yaWdpbmFsVGltZVVzKTsKICAgICB9CiAKQEAgLTE5NDQsNyArMTk2MCw3IEBACiB2b2lkIE9NWE5vZGVJbnN0YW5jZTo6Y29kZWNCdWZmZXJGaWxsZWQob214X21lc3NhZ2UgJm1zZykgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKLSAgICBpZiAobU1heFRpbWVzdGFtcEdhcFVzIDw9IDBsbCB8fCBtUmVzdG9yZVB0c0ZhaWxlZCkgeworICAgIGlmIChtTWF4VGltZXN0YW1wR2FwVXMgPT0gMGxsIHx8IG1SZXN0b3JlUHRzRmFpbGVkKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhTdG9yZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YU3RvcmUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDUzMzZkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhTdG9yZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiT01YU3RvcmUiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFN0b3JlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmg+Ci0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLW5hbWVzcGFjZSB7Ci0gICAgc3RydWN0IFJvbGVQcm9wZXJ0aWVzIHsKLSAgICAgICAgc3RkOjpzdHJpbmcgdHlwZTsKLSAgICAgICAgYm9vbCBpc0VuY29kZXI7Ci0gICAgICAgIGJvb2wgcHJlZmVyUGxhdGZvcm1Ob2RlczsKLSAgICAgICAgc3RkOjptdWx0aW1hcDxzaXplX3QsIElPTVhTdG9yZTo6Tm9kZUluZm8+IG5vZGVMaXN0OwotICAgIH07Ci19ICAvLyBVbm5hbWVkIG5hbWVzcGFjZQotCi1PTVhTdG9yZTo6T01YU3RvcmUoCi0gICAgICAgIGNvbnN0IGNoYXIqIG93bmVyLAotICAgICAgICBjb25zdCBjaGFyKiBjb25zdCogc2VhcmNoRGlycywKLSAgICAgICAgY29uc3QgY2hhciogbWFpblhtbE5hbWUsCi0gICAgICAgIGNvbnN0IGNoYXIqIHBlcmZvcm1hbmNlWG1sTmFtZSwKLSAgICAgICAgY29uc3QgY2hhciogcHJvZmlsaW5nUmVzdWx0c1htbFBhdGgpIHsKLSAgICBNZWRpYUNvZGVjc1htbFBhcnNlciBwYXJzZXIoCi0gICAgICAgICAgICBzZWFyY2hEaXJzLAotICAgICAgICAgICAgbWFpblhtbE5hbWUsCi0gICAgICAgICAgICBwZXJmb3JtYW5jZVhtbE5hbWUsCi0gICAgICAgICAgICBwcm9maWxpbmdSZXN1bHRzWG1sUGF0aCk7Ci0gICAgbVBhcnNpbmdTdGF0dXMgPSBwYXJzZXIuZ2V0UGFyc2luZ1N0YXR1cygpOwotCi0gICAgY29uc3QgYXV0byYgc2VydmljZUF0dHJpYnV0ZU1hcCA9IHBhcnNlci5nZXRTZXJ2aWNlQXR0cmlidXRlTWFwKCk7Ci0gICAgbVNlcnZpY2VBdHRyaWJ1dGVMaXN0LnJlc2VydmUoc2VydmljZUF0dHJpYnV0ZU1hcC5zaXplKCkpOwotICAgIGZvciAoY29uc3QgYXV0byYgYXR0cmlidXRlUGFpciA6IHNlcnZpY2VBdHRyaWJ1dGVNYXApIHsKLSAgICAgICAgQXR0cmlidXRlIGF0dHJpYnV0ZTsKLSAgICAgICAgYXR0cmlidXRlLmtleSA9IGF0dHJpYnV0ZVBhaXIuZmlyc3Q7Ci0gICAgICAgIGF0dHJpYnV0ZS52YWx1ZSA9IGF0dHJpYnV0ZVBhaXIuc2Vjb25kOwotICAgICAgICBtU2VydmljZUF0dHJpYnV0ZUxpc3QucHVzaF9iYWNrKHN0ZDo6bW92ZShhdHRyaWJ1dGUpKTsKLSAgICB9Ci0KLSAgICBjb25zdCBhdXRvJiByb2xlTWFwID0gcGFyc2VyLmdldFJvbGVNYXAoKTsKLSAgICBtUm9sZUxpc3QucmVzZXJ2ZShyb2xlTWFwLnNpemUoKSk7Ci0gICAgZm9yIChjb25zdCBhdXRvJiByb2xlUGFpciA6IHJvbGVNYXApIHsKLSAgICAgICAgUm9sZUluZm8gcm9sZTsKLSAgICAgICAgcm9sZS5yb2xlID0gcm9sZVBhaXIuZmlyc3Q7Ci0gICAgICAgIHJvbGUudHlwZSA9IHJvbGVQYWlyLnNlY29uZC50eXBlOwotICAgICAgICByb2xlLmlzRW5jb2RlciA9IHJvbGVQYWlyLnNlY29uZC5pc0VuY29kZXI7Ci0gICAgICAgIC8vIFRPRE86IEN1cnJlbnRseSwgcHJlZmVyUGxhdGZvcm1Ob2RlcyBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlIGluCi0gICAgICAgIC8vIHRoZSB4bWwgZmlsZS4gT25jZSB3ZSBoYXZlIGEgd2F5IHRvIHByb3ZpZGUgdGhpcyBpbmZvcm1hdGlvbiwgaXQKLSAgICAgICAgLy8gc2hvdWxkIGJlIHBhcnNlZCBwcm9wZXJseS4KLSAgICAgICAgcm9sZS5wcmVmZXJQbGF0Zm9ybU5vZGVzID0gcm9sZVBhaXIuZmlyc3QuY29tcGFyZSgwLCA1LCAiYXVkaW8iKSA9PSAwOwotICAgICAgICBzdGQ6OnZlY3RvcjxOb2RlSW5mbz4mIG5vZGVMaXN0ID0gcm9sZS5ub2RlczsKLSAgICAgICAgbm9kZUxpc3QucmVzZXJ2ZShyb2xlUGFpci5zZWNvbmQubm9kZUxpc3Quc2l6ZSgpKTsKLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiBub2RlUGFpciA6IHJvbGVQYWlyLnNlY29uZC5ub2RlTGlzdCkgewotICAgICAgICAgICAgTm9kZUluZm8gbm9kZTsKLSAgICAgICAgICAgIG5vZGUubmFtZSA9IG5vZGVQYWlyLnNlY29uZC5uYW1lOwotICAgICAgICAgICAgbm9kZS5vd25lciA9IG93bmVyOwotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QXR0cmlidXRlPiYgYXR0cmlidXRlTGlzdCA9IG5vZGUuYXR0cmlidXRlczsKLSAgICAgICAgICAgIGF0dHJpYnV0ZUxpc3QucmVzZXJ2ZShub2RlUGFpci5zZWNvbmQuYXR0cmlidXRlTGlzdC5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBhdHRyaWJ1dGVQYWlyIDogbm9kZVBhaXIuc2Vjb25kLmF0dHJpYnV0ZUxpc3QpIHsKLSAgICAgICAgICAgICAgICBBdHRyaWJ1dGUgYXR0cmlidXRlOwotICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5rZXkgPSBhdHRyaWJ1dGVQYWlyLmZpcnN0OwotICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS52YWx1ZSA9IGF0dHJpYnV0ZVBhaXIuc2Vjb25kOwotICAgICAgICAgICAgICAgIGF0dHJpYnV0ZUxpc3QucHVzaF9iYWNrKHN0ZDo6bW92ZShhdHRyaWJ1dGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5vZGVMaXN0LnB1c2hfYmFjayhzdGQ6Om1vdmUobm9kZSkpOwotICAgICAgICB9Ci0gICAgICAgIG1Sb2xlTGlzdC5wdXNoX2JhY2soc3RkOjptb3ZlKHJvbGUpKTsKLSAgICB9Ci0KLSAgICBtUHJlZml4ID0gcGFyc2VyLmdldENvbW1vblByZWZpeCgpOwotfQotCi1zdGF0dXNfdCBPTVhTdG9yZTo6bGlzdFNlcnZpY2VBdHRyaWJ1dGVzKHN0ZDo6dmVjdG9yPEF0dHJpYnV0ZT4qIGF0dHJpYnV0ZXMpIHsKLSAgICAqYXR0cmlidXRlcyA9IG1TZXJ2aWNlQXR0cmlidXRlTGlzdDsKLSAgICByZXR1cm4gbVBhcnNpbmdTdGF0dXM7Ci19Ci0KLXN0YXR1c190IE9NWFN0b3JlOjpnZXROb2RlUHJlZml4KHN0ZDo6c3RyaW5nKiBwcmVmaXgpIHsKLSAgICAqcHJlZml4ID0gbVByZWZpeDsKLSAgICByZXR1cm4gbVBhcnNpbmdTdGF0dXM7Ci19Ci0KLXN0YXR1c190IE9NWFN0b3JlOjpsaXN0Um9sZXMoc3RkOjp2ZWN0b3I8Um9sZUluZm8+KiByb2xlTGlzdCkgewotICAgICpyb2xlTGlzdCA9IG1Sb2xlTGlzdDsKLSAgICByZXR1cm4gbVBhcnNpbmdTdGF0dXM7Ci19Ci0KLXN0YXR1c190IE9NWFN0b3JlOjpnZXRPbXgoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIHNwPElPTVg+KiBvbXgpIHsKLSAgICAqb214ID0gbmV3IE9NWCgpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotT01YU3RvcmU6On5PTVhTdG9yZSgpIHsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5jcHAKaW5kZXggNTg5NDgzNy4uZjdiNTY5ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuY3BwCkBAIC0yMiw5ICsyMiw5IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPHN5c3RlbS9ncmFwaGljcy1iYXNlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTE2Myw2ICsxNjMsOCBAQAogICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIuYWMzIiwgImF1ZGlvX2VuY29kZXIuYWMzIiB9LAogICAgICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0VBQzMsCiAgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5lYWMzIiwgImF1ZGlvX2VuY29kZXIuZWFjMyIgfSwKKyAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMsCisgICAgICAgICAgICAiaW1hZ2VfZGVjb2Rlci5oZWljIiwgImltYWdlX2VuY29kZXIuaGVpYyIgfSwKICAgICB9OwogCiAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTnVtTWltZVRvUm9sZSA9CkBAIC0yMTUsNiArMjE3LDkgQEAKICAgICAgICAgZm10ICE9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyICYmCiAgICAgICAgIGZtdCAhPSAoT01YX0NPTE9SX0ZPUk1BVFRZUEUpSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyKSB7CiAgICAgICAgIEFMT0dXKCJkbyBub3Qga25vdyBjb2xvciBmb3JtYXQgMHgleCA9ICVkIiwgZm10LCBmbXQpOworICAgICAgICBpZiAoZm10ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIxNikgeworICAgICAgICAgICAgQUxPR1coIkNhbm5vdCBkZXNjcmliZSBjb2xvciBmb3JtYXQgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjE2Iik7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09teEdyYXBoaWNCdWZmZXJTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09teEdyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZTFmNGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT214R3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjZGVmaW5lIExPR19UQUcgIk9teEdyYXBoaWNCdWZmZXJTb3VyY2UiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9Db21wb25lbnRXcmFwcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvR3JhcGhpY0J1ZmZlclNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PbXhHcmFwaGljQnVmZmVyU291cmNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgT214Q29tcG9uZW50V3JhcHBlciA6IHB1YmxpYyBDb21wb25lbnRXcmFwcGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBPbXhDb21wb25lbnRXcmFwcGVyKGNvbnN0IHNwPElPbXhOb2RlV3JhcHBlcj4gJm5vZGUpCisgICAgICAgIDogbU9teE5vZGUobm9kZSkge30KKyAgICB2aXJ0dWFsIH5PbXhDb21wb25lbnRXcmFwcGVyKCkgPSBkZWZhdWx0OworCisgICAgc3RhdHVzX3Qgc3VibWl0QnVmZmVyKAorICAgICAgICAgICAgaW50MzJfdCBidWZmZXJJZCwgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wLCBpbnQgZmVuY2VGZCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbU9teE5vZGUtPmVtcHR5QnVmZmVyKAorICAgICAgICAgICAgICAgIGJ1ZmZlcklkLCBPTVhfQlVGRkVSRkxBR19FTkRPRkZSQU1FLCBidWZmZXIsIHRpbWVzdGFtcCwgZmVuY2VGZCk7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3VibWl0RW9zKGludDMyX3QgYnVmZmVySWQpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1PbXhOb2RlLT5lbXB0eUJ1ZmZlcihidWZmZXJJZCwgT01YX0JVRkZFUkZMQUdfRU5ET0ZGUkFNRSB8IE9NWF9CVUZGRVJGTEFHX0VPUyk7CisgICAgfQorCisgICAgdm9pZCBkaXNwYXRjaERhdGFTcGFjZUNoYW5nZWQoCisgICAgICAgICAgICBpbnQzMl90IGRhdGFTcGFjZSwgaW50MzJfdCBhc3BlY3RzLCBpbnQzMl90IHBpeGVsRm9ybWF0KSBvdmVycmlkZSB7CisgICAgICAgIG1PbXhOb2RlLT5kaXNwYXRjaERhdGFTcGFjZUNoYW5nZWQoZGF0YVNwYWNlLCBhc3BlY3RzLCBwaXhlbEZvcm1hdCk7CisgICAgfQorCitwcml2YXRlOgorICAgIHNwPElPbXhOb2RlV3JhcHBlcj4gbU9teE5vZGU7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhPbXhDb21wb25lbnRXcmFwcGVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZQorCitTdGF0dXMgT214R3JhcGhpY0J1ZmZlclNvdXJjZTo6b25PbXhFeGVjdXRpbmcoKSB7CisgICAgcmV0dXJuIHN0YXJ0KCk7Cit9CisKK1N0YXR1cyBPbXhHcmFwaGljQnVmZmVyU291cmNlOjpvbk9teElkbGUoKSB7CisgICAgcmV0dXJuIHN0b3AoKTsKK30KKworU3RhdHVzIE9teEdyYXBoaWNCdWZmZXJTb3VyY2U6Om9uT214TG9hZGVkKCl7CisgICAgcmV0dXJuIHJlbGVhc2UoKTsKK30KKworc3RhdHVzX3QgT214R3JhcGhpY0J1ZmZlclNvdXJjZTo6Y29uZmlndXJlKAorICAgICAgICBjb25zdCBzcDxJT214Tm9kZVdyYXBwZXI+JiBvbXhOb2RlLAorICAgICAgICBpbnQzMl90IGRhdGFTcGFjZSwKKyAgICAgICAgaW50MzJfdCBidWZmZXJDb3VudCwKKyAgICAgICAgdWludDMyX3QgZnJhbWVXaWR0aCwKKyAgICAgICAgdWludDMyX3QgZnJhbWVIZWlnaHQsCisgICAgICAgIHVpbnQzMl90IGNvbnN1bWVyVXNhZ2UpIHsKKyAgICBpZiAob214Tm9kZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgcmV0dXJuIEdyYXBoaWNCdWZmZXJTb3VyY2U6OmNvbmZpZ3VyZSgKKyAgICAgICAgICAgIG5ldyBPbXhDb21wb25lbnRXcmFwcGVyKG9teE5vZGUpLCBkYXRhU3BhY2UsIGJ1ZmZlckNvdW50LAorICAgICAgICAgICAgZnJhbWVXaWR0aCwgZnJhbWVIZWlnaHQsIGNvbnN1bWVyVXNhZ2UpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuY3BwCmluZGV4IDg3YzI0MTEuLjU1YWZlMDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5jcHAKQEAgLTQxLDcgKzQxLDcgQEAKICAgICBtTG9vcGVyLT5zdGFydCgKICAgICAgICAgICAgIGZhbHNlLCAvLyBydW5PbkNhbGxpbmdUaHJlYWQKICAgICAgICAgICAgIGZhbHNlLCAvLyBjYW5DYWxsSmF2YQotICAgICAgICAgICAgQU5EUk9JRF9QUklPUklUWV9GT1JFR1JPVU5EKTsKKyAgICAgICAgICAgIEFORFJPSURfUFJJT1JJVFlfVklERU8pOwogfQogCiB2b2lkIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OnByZXBhcmVGb3JEZXN0cnVjdGlvbigpIHsKQEAgLTQ1OCw3ICs0NTgsMTIgQEAKICAgICAgICAgc3RhdGUgPSBPTVhfU3RhdGVMb2FkZWQ7CiAgICAgfQogCi0gICAgQ0hFQ0tfRVEoKGludCltU3RhdGUsIChpbnQpbVRhcmdldFN0YXRlKTsKKyAgICBpZiAobVN0YXRlICE9IG1UYXJnZXRTdGF0ZSkgeworICAgICAgICBBTE9HRSgiU3RhdGUgY2hhbmdlIHRvIHN0YXRlICVkIHJlcXVlc3RlZCB3aGlsZSBzdGlsbCB0cmFuc2l0aW9uaW5nIGZyb20gc3RhdGUgJWQgdG8gJWQiLAorICAgICAgICAgICAgICAgIHN0YXRlLCBtU3RhdGUsIG1UYXJnZXRTdGF0ZSk7CisgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAogICAgIHN3aXRjaCAobVN0YXRlKSB7CiAgICAgICAgIGNhc2UgT01YX1N0YXRlTG9hZGVkOgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uY3BwCmluZGV4IDQ5NDZhZGEuLjFmM2U4YzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YUGx1Z2luLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5jcHAKQEAgLTM0LDcgKzM0LDEyIEBACiAgICAgY29uc3QgY2hhciAqbVJvbGU7CiAKIH0ga0NvbXBvbmVudHNbXSA9IHsKKyAgICAvLyB0d28gY2hvaWNlcyBmb3IgYWFjIGRlY29kaW5nLgorICAgIC8vIGNvbmZpZ3VyYWJsZSBpbiBtZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYXVkaW8ueG1sCisgICAgLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgogICAgIHsgIk9NWC5nb29nbGUuYWFjLmRlY29kZXIiLCAiYWFjZGVjIiwgImF1ZGlvX2RlY29kZXIuYWFjIiB9LAorICAgIC8vIGFsdGVybmF0ZSBpbXBsZW1lbnRhdGlvbgorICAgIHsgIk9NWC5nb29nbGUueGFhYy5kZWNvZGVyIiwgInhhYWNkZWMiLCAiYXVkaW9fZGVjb2Rlci5hYWMiIH0sCiAgICAgeyAiT01YLmdvb2dsZS5hYWMuZW5jb2RlciIsICJhYWNlbmMiLCAiYXVkaW9fZW5jb2Rlci5hYWMiIH0sCiAgICAgeyAiT01YLmdvb2dsZS5hbXJuYi5kZWNvZGVyIiwgImFtcmRlYyIsICJhdWRpb19kZWNvZGVyLmFtcm5iIiB9LAogICAgIHsgIk9NWC5nb29nbGUuYW1ybmIuZW5jb2RlciIsICJhbXJuYmVuYyIsICJhdWRpb19lbmNvZGVyLmFtcm5iIiB9LApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuY3BwCmluZGV4IGNiODExYTAuLjkzNWRjMzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5jcHAKQEAgLTI2LDggKzI2LDggQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFEZWZzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNjEsNiArNjEsNyBAQAogICAgICAgICBtQ3JvcFRvcCgwKSwKICAgICAgICAgbUNyb3BXaWR0aCh3aWR0aCksCiAgICAgICAgIG1Dcm9wSGVpZ2h0KGhlaWdodCksCisgICAgICAgIG1PdXRwdXRGb3JtYXQoT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hciksCiAgICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UoTk9ORSksCiAgICAgICAgIG1VcGRhdGVDb2xvckFzcGVjdHMoZmFsc2UpLAogICAgICAgICBtTWluSW5wdXRCdWZmZXJTaXplKDM4NCksIC8vIGFyYml0cmFyeSwgdXNpbmcgb25lIHVuY29tcHJlc3NlZCBtYWNyb2Jsb2NrCkBAIC03NCw2ICs3NSw3IEBACiAgICAgbWVtc2V0KCZtRGVmYXVsdENvbG9yQXNwZWN0cywgMCwgc2l6ZW9mKENvbG9yQXNwZWN0cykpOwogICAgIG1lbXNldCgmbUJpdHN0cmVhbUNvbG9yQXNwZWN0cywgMCwgc2l6ZW9mKENvbG9yQXNwZWN0cykpOwogICAgIG1lbXNldCgmbUZpbmFsQ29sb3JBc3BlY3RzLCAwLCBzaXplb2YoQ29sb3JBc3BlY3RzKSk7CisgICAgbWVtc2V0KCZtSGRyU3RhdGljSW5mbywgMCwgc2l6ZW9mKEhEUlN0YXRpY0luZm8pKTsKIH0KIAogdm9pZCBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50Ojppbml0UG9ydHMoCkBAIC0xNDAsNyArMTQyLDYgQEAKICAgICBkZWYuZm9ybWF0LnZpZGVvLnhGcmFtZXJhdGUgPSAwOwogICAgIGRlZi5mb3JtYXQudmlkZW8uYkZsYWdFcnJvckNvbmNlYWxtZW50ID0gT01YX0ZBTFNFOwogICAgIGRlZi5mb3JtYXQudmlkZW8uZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ1VudXNlZDsKLSAgICBkZWYuZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI7CiAgICAgZGVmLmZvcm1hdC52aWRlby5wTmF0aXZlV2luZG93ID0gTlVMTDsKIAogICAgIGFkZFBvcnQoZGVmKTsKQEAgLTE1MiwxMSArMTUzLDEzIEBACiAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqb3V0RGVmID0gJmVkaXRQb3J0SW5mbyhrT3V0cHV0UG9ydEluZGV4KS0+bURlZjsKICAgICBvdXREZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IG91dHB1dEJ1ZmZlcldpZHRoKCk7CiAgICAgb3V0RGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gb3V0cHV0QnVmZmVySGVpZ2h0KCk7CisgICAgb3V0RGVmLT5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID0gbU91dHB1dEZvcm1hdDsKICAgICBvdXREZWYtPmZvcm1hdC52aWRlby5uU3RyaWRlID0gb3V0RGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGg7CiAgICAgb3V0RGVmLT5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gb3V0RGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0OwogCisgICAgaW50MzJfdCBicHAgPSAobU91dHB1dEZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyMTYpID8gMiA6IDE7CiAgICAgb3V0RGVmLT5uQnVmZmVyU2l6ZSA9Ci0gICAgICAgIChvdXREZWYtPmZvcm1hdC52aWRlby5uU3RyaWRlICogb3V0RGVmLT5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ICogMykgLyAyOworICAgICAgICAob3V0RGVmLT5mb3JtYXQudmlkZW8ublN0cmlkZSAqIG91dERlZi0+Zm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCAqIGJwcCAqIDMpIC8gMjsKIAogICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKmluRGVmID0gJmVkaXRQb3J0SW5mbyhrSW5wdXRQb3J0SW5kZXgpLT5tRGVmOwogICAgIGluRGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBtV2lkdGg7CkBAIC0xOTEsOSArMTk0LDExIEBACiAKIHZvaWQgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6aGFuZGxlUG9ydFNldHRpbmdzQ2hhbmdlKAogICAgICAgICBib29sICpwb3J0V2lsbFJlc2V0LCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBvdXRwdXRGb3JtYXQsCiAgICAgICAgIENyb3BTZXR0aW5nc01vZGUgY3JvcFNldHRpbmdzTW9kZSwgYm9vbCBmYWtlU3RyaWRlKSB7CiAgICAgKnBvcnRXaWxsUmVzZXQgPSBmYWxzZTsKICAgICBib29sIHNpemVDaGFuZ2VkID0gKHdpZHRoICE9IG1XaWR0aCB8fCBoZWlnaHQgIT0gbUhlaWdodCk7CisgICAgYm9vbCBmb3JtYXRDaGFuZ2VkID0gKG91dHB1dEZvcm1hdCAhPSBtT3V0cHV0Rm9ybWF0KTsKICAgICBib29sIHVwZGF0ZUNyb3AgPSAoY3JvcFNldHRpbmdzTW9kZSA9PSBrQ3JvcFVuU2V0KTsKICAgICBib29sIGNyb3BDaGFuZ2VkID0gKGNyb3BTZXR0aW5nc01vZGUgPT0ga0Nyb3BDaGFuZ2VkKTsKICAgICBib29sIHN0cmlkZUNoYW5nZWQgPSBmYWxzZTsKQEAgLTIwNSwxMyArMjEwLDE4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoc2l6ZUNoYW5nZWQgfHwgY3JvcENoYW5nZWQgfHwgc3RyaWRlQ2hhbmdlZCkgeworICAgIGlmIChmb3JtYXRDaGFuZ2VkIHx8IHNpemVDaGFuZ2VkIHx8IGNyb3BDaGFuZ2VkIHx8IHN0cmlkZUNoYW5nZWQpIHsKKyAgICAgICAgaWYgKGZvcm1hdENoYW5nZWQpIHsKKyAgICAgICAgICAgIEFMT0dEKCJmb3JtYXRDaGFuZ2VkOiAweCUwOHggLT4gMHglMDh4IiwgbU91dHB1dEZvcm1hdCwgb3V0cHV0Rm9ybWF0KTsKKyAgICAgICAgfQorICAgICAgICBtT3V0cHV0Rm9ybWF0ID0gb3V0cHV0Rm9ybWF0OwogICAgICAgICBtV2lkdGggPSB3aWR0aDsKICAgICAgICAgbUhlaWdodCA9IGhlaWdodDsKIAogICAgICAgICBpZiAoKHNpemVDaGFuZ2VkICYmICFtSXNBZGFwdGl2ZSkKICAgICAgICAgICAgIHx8IHdpZHRoID4gbUFkYXB0aXZlTWF4V2lkdGgKLSAgICAgICAgICAgIHx8IGhlaWdodCA+IG1BZGFwdGl2ZU1heEhlaWdodCkgeworICAgICAgICAgICAgfHwgaGVpZ2h0ID4gbUFkYXB0aXZlTWF4SGVpZ2h0CisgICAgICAgICAgICB8fCBmb3JtYXRDaGFuZ2VkKSB7CiAgICAgICAgICAgICBpZiAobUlzQWRhcHRpdmUpIHsKICAgICAgICAgICAgICAgICBpZiAod2lkdGggPiBtQWRhcHRpdmVNYXhXaWR0aCkgewogICAgICAgICAgICAgICAgICAgICBtQWRhcHRpdmVNYXhXaWR0aCA9IHdpZHRoOwpAQCAtMzA1LDI3ICszMTUsMzAgQEAKIHZvaWQgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6Y29weVlWMTJGcmFtZVRvT3V0cHV0QnVmZmVyKAogICAgICAgICB1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyY1ksIGNvbnN0IHVpbnQ4X3QgKnNyY1UsIGNvbnN0IHVpbnQ4X3QgKnNyY1YsCiAgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUpIHsKLSAgICBzaXplX3QgZHN0WVN0cmlkZSA9IG91dHB1dEJ1ZmZlcldpZHRoKCk7CisgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqb3V0RGVmID0gJmVkaXRQb3J0SW5mbyhrT3V0cHV0UG9ydEluZGV4KS0+bURlZjsKKyAgICBpbnQzMl90IGJwcCA9IChvdXREZWYtPmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjE2KSA/IDIgOiAxOworCisgICAgc2l6ZV90IGRzdFlTdHJpZGUgPSBvdXRwdXRCdWZmZXJXaWR0aCgpICogYnBwOwogICAgIHNpemVfdCBkc3RVVlN0cmlkZSA9IGRzdFlTdHJpZGUgLyAyOwogICAgIHNpemVfdCBkc3RIZWlnaHQgPSBvdXRwdXRCdWZmZXJIZWlnaHQoKTsKICAgICB1aW50OF90ICpkc3RTdGFydCA9IGRzdDsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUhlaWdodDsgKytpKSB7Ci0gICAgICAgICBtZW1jcHkoZHN0LCBzcmNZLCBtV2lkdGgpOworICAgICAgICAgbWVtY3B5KGRzdCwgc3JjWSwgbVdpZHRoICogYnBwKTsKICAgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZTsKICAgICAgICAgIGRzdCArPSBkc3RZU3RyaWRlOwogICAgIH0KIAogICAgIGRzdCA9IGRzdFN0YXJ0ICsgZHN0WVN0cmlkZSAqIGRzdEhlaWdodDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1IZWlnaHQgLyAyOyArK2kpIHsKLSAgICAgICAgIG1lbWNweShkc3QsIHNyY1UsIG1XaWR0aCAvIDIpOworICAgICAgICAgbWVtY3B5KGRzdCwgc3JjVSwgbVdpZHRoIC8gMiAqIGJwcCk7CiAgICAgICAgICBzcmNVICs9IHNyY1VTdHJpZGU7CiAgICAgICAgICBkc3QgKz0gZHN0VVZTdHJpZGU7CiAgICAgfQogCiAgICAgZHN0ID0gZHN0U3RhcnQgKyAoNSAqIGRzdFlTdHJpZGUgKiBkc3RIZWlnaHQpIC8gNDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1IZWlnaHQgLyAyOyArK2kpIHsKLSAgICAgICAgIG1lbWNweShkc3QsIHNyY1YsIG1XaWR0aCAvIDIpOworICAgICAgICAgbWVtY3B5KGRzdCwgc3JjViwgbVdpZHRoIC8gMiAqIGJwcCk7CiAgICAgICAgICBzcmNWICs9IHNyY1ZTdHJpZGU7CiAgICAgICAgICBkc3QgKz0gZHN0VVZTdHJpZGU7CiAgICAgfQpAQCAtNTUwLDYgKzU2MywxMCBAQAogICAgICAgICAgICAgRGVzY3JpYmVDb2xvckFzcGVjdHNQYXJhbXMqIGNvbG9yQXNwZWN0c1BhcmFtcyA9CiAgICAgICAgICAgICAgICAgICAgIChEZXNjcmliZUNvbG9yQXNwZWN0c1BhcmFtcyAqKXBhcmFtczsKIAorICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oY29sb3JBc3BlY3RzUGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChjb2xvckFzcGVjdHNQYXJhbXMtPm5Qb3J0SW5kZXggIT0ga091dHB1dFBvcnRJbmRleCkgewogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CiAgICAgICAgICAgICB9CkBAIC01NjIsNiArNTc5LDI4IEBACiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2Uga0Rlc2NyaWJlSGRyU3RhdGljSW5mb0luZGV4OgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIXN1cHBvcnREZXNjcmliZUhkclN0YXRpY0luZm8oKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZEluZGV4OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBEZXNjcmliZUhEUlN0YXRpY0luZm9QYXJhbXMqIGhkclN0YXRpY0luZm9QYXJhbXMgPQorICAgICAgICAgICAgICAgICAgICAoRGVzY3JpYmVIRFJTdGF0aWNJbmZvUGFyYW1zICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShoZHJTdGF0aWNJbmZvUGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChoZHJTdGF0aWNJbmZvUGFyYW1zLT5uUG9ydEluZGV4ICE9IGtPdXRwdXRQb3J0SW5kZXgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBoZHJTdGF0aWNJbmZvUGFyYW1zLT5zSW5mbyA9IG1IZHJTdGF0aWNJbmZvOworCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKICAgICB9CkBAIC01OTUsNiArNjM0LDI5IEBACiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2Uga0Rlc2NyaWJlSGRyU3RhdGljSW5mb0luZGV4OgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIXN1cHBvcnREZXNjcmliZUhkclN0YXRpY0luZm8oKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZEluZGV4OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb25zdCBEZXNjcmliZUhEUlN0YXRpY0luZm9QYXJhbXMqIGhkclN0YXRpY0luZm9QYXJhbXMgPQorICAgICAgICAgICAgICAgICAgICAoRGVzY3JpYmVIRFJTdGF0aWNJbmZvUGFyYW1zICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShoZHJTdGF0aWNJbmZvUGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChoZHJTdGF0aWNJbmZvUGFyYW1zLT5uUG9ydEluZGV4ICE9IGtPdXRwdXRQb3J0SW5kZXgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtSGRyU3RhdGljSW5mbyA9IGhkclN0YXRpY0luZm9QYXJhbXMtPnNJbmZvOworICAgICAgICAgICAgdXBkYXRlUG9ydERlZmluaXRpb25zKGZhbHNlKTsKKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7CiAgICAgfQpAQCAtNjEwLDYgKzY3MiwxMCBAQAogICAgICAgICAgICAgICAgICYmIHN1cHBvcnRzRGVzY3JpYmVDb2xvckFzcGVjdHMoKSkgewogICAgICAgICAqKGludDMyX3QqKWluZGV4ID0ga0Rlc2NyaWJlQ29sb3JBc3BlY3RzSW5kZXg7CiAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LmRlc2NyaWJlSERSU3RhdGljSW5mbyIpCisgICAgICAgICAgICAmJiBzdXBwb3J0RGVzY3JpYmVIZHJTdGF0aWNJbmZvKCkpIHsKKyAgICAgICAgKihpbnQzMl90KilpbmRleCA9IGtEZXNjcmliZUhkclN0YXRpY0luZm9JbmRleDsKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgfQogCiAgICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmdldEV4dGVuc2lvbkluZGV4KG5hbWUsIGluZGV4KTsKQEAgLTYyMyw2ICs2ODksMTAgQEAKICAgICByZXR1cm4ga05vdFN1cHBvcnRlZDsKIH0KIAorYm9vbCBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjpzdXBwb3J0RGVzY3JpYmVIZHJTdGF0aWNJbmZvKCkgeworICAgIHJldHVybiBmYWxzZTsKK30KKwogdm9pZCBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjpvblJlc2V0KCkgewogICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBOT05FOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuY3BwCmluZGV4IDZlNTYzYjcuLjJmYmJiNDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5jcHAKQEAgLTI2LDkgKzI2LDkgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+CiAjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfSW5kZXhFeHQuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYURlZnMuaD4KIAogI2luY2x1ZGUgPHVpL0ZlbmNlLmg+CiAjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlck1hcHBlci5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9Db252ZXJzaW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL0NvbnZlcnNpb24uaAppbmRleCA4ZDhhMmQ5Li5hOWZjZTU1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL0NvbnZlcnNpb24uaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL0NvbnZlcnNpb24uaApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPHZlY3Rvcj4KICNpbmNsdWRlIDxsaXN0PgogCisjaW5jbHVkZSA8Y2ludHR5cGVzPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAjaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KQEAgLTM1LDYgKzM2LDggQEAKICNpbmNsdWRlIDxtZWRpYS9PTVhGZW5jZVBhcmNlbGFibGUuaD4KICNpbmNsdWRlIDxtZWRpYS9PTVhCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9WaWRlb0FQSS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvQ29udmVyc2lvbi5oPgogCiAjaW5jbHVkZSA8YW5kcm9pZC9oaWRsL21lbW9yeS8xLjAvSU1lbW9yeS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvYnVmZmVycXVldWUvMS4wL0lQcm9kdWNlckxpc3RlbmVyLmg+CkBAIC05OSw1MSArMTAyLDEzIEBACiB0eXBlZGVmIDo6YW5kcm9pZDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcgogICAgICAgICBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwogCi0vLyBuYXRpdmVfaGFuZGxlX3QgaGVscGVyIGZ1bmN0aW9ucy4KKy8vIFdlIHdhbnQgdG8gdXNlIGFsbCBmdW5jdGlvbnMgZGVjbGFyZWQgaW4gOjphbmRyb2lkOjpjb252ZXJzaW9uCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpjb252ZXJzaW9uOwogCi0vKioKLSAqIFxicmllZiBUYWtlIGFuIGZkIGFuZCBjcmVhdGUgYSBuYXRpdmUgaGFuZGxlIGNvbnRhaW5pbmcgb25seSB0aGUgZ2l2ZW4gZmQuCi0gKiBUaGUgY3JlYXRlZCBoYW5kbGUgd2lsbCBuZWVkIHRvIGJlIGRlbGV0ZWQgbWFudWFsbHkgd2l0aAotICogYG5hdGl2ZV9oYW5kbGVfZGVsZXRlKClgLgotICoKLSAqIFxwYXJhbVtpbl0gZmQgVGhlIHNvdXJjZSBmaWxlIGRlc2NyaXB0b3IgKG9mIHR5cGUgYGludGApLgotICogXHJldHVybiBUaGUgY3JlYXRlIGBuYXRpdmVfaGFuZGxlX3QqYCB0aGF0IGNvbnRhaW5zIHRoZSBnaXZlbiBccCBmZC4gSWYgdGhlCi0gKiBzdXBwbGllZCBccCBmZCBpcyBuZWdhdGl2ZSwgdGhlIGNyZWF0ZWQgbmF0aXZlIGhhbmRsZSB3aWxsIGNvbnRhaW4gbm8gZmlsZQotICogZGVzY3JpcHRvcnMuCi0gKgotICogSWYgdGhlIG5hdGl2ZSBoYW5kbGUgY2Fubm90IGJlIGNyZWF0ZWQsIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZQotICogYG51bGxwdHJgLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgZHVwbGljYXRlIHRoZSBmaWxlIGRlc2NyaXB0b3IuCi0gKi8KLWlubGluZSBuYXRpdmVfaGFuZGxlX3QqIG5hdGl2ZV9oYW5kbGVfY3JlYXRlX2Zyb21fZmQoaW50IGZkKSB7Ci0gICAgaWYgKGZkIDwgMCkgewotICAgICAgICByZXR1cm4gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMCwgMCk7Ci0gICAgfQotICAgIG5hdGl2ZV9oYW5kbGVfdCogbmggPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKLSAgICBpZiAobmggPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0gICAgbmgtPmRhdGFbMF0gPSBmZDsKLSAgICByZXR1cm4gbmg7Ci19Ci0KLS8qKgotICogXGJyaWVmIEV4dHJhY3QgYSBmaWxlIGRlc2NyaXB0b3IgZnJvbSBhIG5hdGl2ZSBoYW5kbGUuCi0gKgotICogXHBhcmFtW2luXSBuaCBUaGUgc291cmNlIGBuYXRpdmVfaGFuZGxlX3QqYC4KLSAqIFxwYXJhbVtpbl0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBmaWxlIGRlc2NyaXB0b3IgaW4gXHAgbmggdG8gcmVhZCBmcm9tLiBUaGlzCi0gKiBpbnB1dCBoYXMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYDBgLgotICogXHJldHVybiBUaGUgYGluZGV4YC10aCBmaWxlIGRlc2NyaXB0b3IgaW4gXHAgbmguIElmIFxwIG5oIGRvZXMgbm90IGhhdmUKLSAqIGVub3VnaCBmaWxlIGRlc2NyaXB0b3JzLCB0aGUgcmV0dXJuZWQgdmFsdWUgd2lsbCBiZSBgLTFgLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgZHVwbGljYXRlIHRoZSBmaWxlIGRlc2NyaXB0b3IuCi0gKi8KLWlubGluZSBpbnQgbmF0aXZlX2hhbmRsZV9yZWFkX2ZkKG5hdGl2ZV9oYW5kbGVfdCBjb25zdCogbmgsIGludCBpbmRleCA9IDApIHsKLSAgICByZXR1cm4gKChuaCA9PSBudWxscHRyKSB8fCAobmgtPm51bUZkcyA9PSAwKSB8fAotICAgICAgICAgICAgKG5oLT5udW1GZHMgPD0gaW5kZXgpIHx8IChpbmRleCA8IDApKSA/Ci0gICAgICAgICAgICAtMSA6IG5oLT5kYXRhW2luZGV4XTsKLX0KKy8vIE5vdyBzcGVjaWZpY2FsbHkgaW5qZWN0IHRoZXNlIHR3byBmdW5jdGlvbnMgaGVyZSwgYmVjYXVzZSB3ZSdyZSBnb2luZyB0bworLy8gZGVjbGFyZSBmdW5jdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lIGluIHRoaXMgbmFtZXNwYWNlLgordXNpbmcgOjphbmRyb2lkOjpjb252ZXJzaW9uOjpjb252ZXJ0VG87Cit1c2luZyA6OmFuZHJvaWQ6OmNvbnZlcnNpb246OnRvU3RhdHVzVDsKIAogLyoqCiAgKiBDb252ZXJzaW9uIGZ1bmN0aW9ucwpAQCAtMTc4LDE3ICsxNDMsMzQgQEAKICAqLwogCiAvKioKLSAqIFxicmllZiBDb252ZXJ0IGBSZXR1cm48dm9pZD5gIHRvIGBiaW5kZXI6OlN0YXR1c2AuCisgKiBcYnJpZWYgQ29udmVydCBgU3RhdHVzYCB0byBgc3RhdHVzX3RgLiBUaGlzIGlzIGZvciBsZWdhY3kgYmluZGVyIGNhbGxzLgogICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBSZXR1cm48dm9pZD5gLgotICogXHJldHVybiBUaGUgY29ycmVzcG9uZGluZyBgYmluZGVyOjpTdGF0dXNgLgorICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYFN0YXR1c2AuCisgKiBccmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGBzdGF0dXNfdGAuCiAgKi8KLS8vIGNvbnZlcnQ6IFJldHVybjx2b2lkPiAtPiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzCi1pbmxpbmUgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyB0b0JpbmRlclN0YXR1cygKLSAgICAgICAgUmV0dXJuPHZvaWQ+IGNvbnN0JiB0KSB7Ci0gICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21FeGNlcHRpb25Db2RlKAotICAgICAgICAgICAgdC5pc09rKCkgPyBPSyA6IFVOS05PV05fRVJST1IsCi0gICAgICAgICAgICB0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisvLyBjb252ZXJ0OiBTdGF0dXMgLT4gc3RhdHVzX3QKK2lubGluZSBzdGF0dXNfdCB0b1N0YXR1c1QoU3RhdHVzIGNvbnN0JiB0KSB7CisgICAgc3dpdGNoICh0KSB7CisgICAgY2FzZSBTdGF0dXM6Ok5PX0VSUk9SOgorICAgIGNhc2UgU3RhdHVzOjpOQU1FX05PVF9GT1VORDoKKyAgICBjYXNlIFN0YXR1czo6V09VTERfQkxPQ0s6CisgICAgY2FzZSBTdGF0dXM6Ok5PX01FTU9SWToKKyAgICBjYXNlIFN0YXR1czo6QUxSRUFEWV9FWElTVFM6CisgICAgY2FzZSBTdGF0dXM6Ok5PX0lOSVQ6CisgICAgY2FzZSBTdGF0dXM6OkJBRF9WQUxVRToKKyAgICBjYXNlIFN0YXR1czo6REVBRF9PQkpFQ1Q6CisgICAgY2FzZSBTdGF0dXM6OklOVkFMSURfT1BFUkFUSU9OOgorICAgIGNhc2UgU3RhdHVzOjpUSU1FRF9PVVQ6CisgICAgY2FzZSBTdGF0dXM6OkVSUk9SX1VOU1VQUE9SVEVEOgorICAgIGNhc2UgU3RhdHVzOjpVTktOT1dOX0VSUk9SOgorICAgIGNhc2UgU3RhdHVzOjpSRUxFQVNFX0FMTF9CVUZGRVJTOgorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KHQpOworICAgIGNhc2UgU3RhdHVzOjpCVUZGRVJfTkVFRFNfUkVBTExPQ0FUSU9OOgorICAgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dXKCJVbnJlY29nbml6ZWQgc3RhdHVzIHZhbHVlOiAlIiBQUklkMzIsIHN0YXRpY19jYXN0PGludDMyX3Q+KHQpKTsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHN0YXR1c190Pih0KTsKKyAgICB9CiB9CiAKIC8qKgpAQCAtMjA4LDI5ICsxOTAsNyBAQAogICovCiAvLyBjb252ZXJ0OiBTdGF0dXMgLT4gc3RhdHVzX3QKIGlubGluZSBzdGF0dXNfdCB0b1N0YXR1c1QoUmV0dXJuPFN0YXR1cz4gY29uc3QmIHQpIHsKLSAgICByZXR1cm4gdC5pc09rKCkgPyBzdGF0aWNfY2FzdDxzdGF0dXNfdD4oc3RhdGljX2Nhc3Q8U3RhdHVzPih0KSkgOiBVTktOT1dOX0VSUk9SOwotfQotCi0vKioKLSAqIFxicmllZiBDb252ZXJ0IGBSZXR1cm48dm9pZD5gIHRvIGBzdGF0dXNfdGAuIFRoaXMgaXMgZm9yIGxlZ2FjeSBiaW5kZXIgY2FsbHMuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYFJldHVybjx2b2lkPmAuCi0gKiBccmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIGBzdGF0dXNfdGAuCi0gKi8KLS8vIGNvbnZlcnQ6IFJldHVybjx2b2lkPiAtPiBzdGF0dXNfdAotaW5saW5lIHN0YXR1c190IHRvU3RhdHVzVChSZXR1cm48dm9pZD4gY29uc3QmIHQpIHsKLSAgICByZXR1cm4gdC5pc09rKCkgPyBPSyA6IFVOS05PV05fRVJST1I7Ci19Ci0KLS8qKgotICogXGJyaWVmIENvbnZlcnQgYFN0YXR1c2AgdG8gYHN0YXR1c190YC4gVGhpcyBpcyBmb3IgbGVnYWN5IGJpbmRlciBjYWxscy4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgU3RhdHVzYC4KLSAqIFxyZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgYHN0YXR1c190YC4KLSAqLwotLy8gY29udmVydDogU3RhdHVzIC0+IHN0YXR1c190Ci1pbmxpbmUgc3RhdHVzX3QgdG9TdGF0dXNUKFN0YXR1cyBjb25zdCYgdCkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxzdGF0dXNfdD4odCk7CisgICAgcmV0dXJuIHQuaXNPaygpID8gdG9TdGF0dXNUKHN0YXRpY19jYXN0PFN0YXR1cz4odCkpIDogVU5LTk9XTl9FUlJPUjsKIH0KIAogLyoqCkBAIC0yNDEsMTggKzIwMSwyOCBAQAogICovCiAvLyBjb252ZXJ0OiBzdGF0dXNfdCAtPiBTdGF0dXMKIGlubGluZSBTdGF0dXMgdG9TdGF0dXMoc3RhdHVzX3QgbCkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxTdGF0dXM+KGwpOwotfQotCi0vKioKLSAqIFxicmllZiBXcmFwIGBuYXRpdmVfaGFuZGxlX3QqYCBpbiBgaGlkbF9oYW5kbGVgLgotICoKLSAqIFxwYXJhbVtpbl0gbmggVGhlIHNvdXJjZSBgbmF0aXZlX2hhbmRsZV90KmAuCi0gKiBccmV0dXJuIFRoZSBgaGlkbF9oYW5kbGVgIHRoYXQgcG9pbnRzIHRvIFxwIG5oLgotICovCi0vLyB3cmFwOiBuYXRpdmVfaGFuZGxlX3QqIC0+IGhpZGxfaGFuZGxlCi1pbmxpbmUgaGlkbF9oYW5kbGUgaW5IaWRsSGFuZGxlKG5hdGl2ZV9oYW5kbGVfdCBjb25zdCogbmgpIHsKLSAgICByZXR1cm4gaGlkbF9oYW5kbGUobmgpOworICAgIHN3aXRjaCAobCkgeworICAgIGNhc2UgTk9fRVJST1I6CisgICAgY2FzZSBOQU1FX05PVF9GT1VORDoKKyAgICBjYXNlIFdPVUxEX0JMT0NLOgorICAgIGNhc2UgTk9fTUVNT1JZOgorICAgIGNhc2UgQUxSRUFEWV9FWElTVFM6CisgICAgY2FzZSBOT19JTklUOgorICAgIGNhc2UgQkFEX1ZBTFVFOgorICAgIGNhc2UgREVBRF9PQkpFQ1Q6CisgICAgY2FzZSBJTlZBTElEX09QRVJBVElPTjoKKyAgICBjYXNlIFRJTUVEX09VVDoKKyAgICBjYXNlIEVSUk9SX1VOU1VQUE9SVEVEOgorICAgIGNhc2UgVU5LTk9XTl9FUlJPUjoKKyAgICBjYXNlIElHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlJFTEVBU0VfQUxMX0JVRkZFUlM6CisgICAgY2FzZSBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpCVUZGRVJfTkVFRFNfUkVBTExPQ0FUSU9OOgorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8U3RhdHVzPihsKTsKKyAgICBjYXNlIE5PVF9FTk9VR0hfREFUQToKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6QlVGRkVSX05FRURTX1JFQUxMT0NBVElPTjsKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HVygiVW5yZWNvZ25pemVkIHN0YXR1cyB2YWx1ZTogJSIgUFJJZDMyLCBzdGF0aWNfY2FzdDxpbnQzMl90PihsKSk7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxTdGF0dXM+KGwpOworICAgIH0KIH0KIAogLyoqCkBAIC00OTAsMTI4ICs0NjAsNiBAQAogfQogCiAvKioKLSAqIFxicmllZiBDb252ZXJ0IGBpbnQzMl90YCB0byBgRGF0YXNwYWNlYC4KLSAqCi0gKiBccGFyYW1baW5dIGwgVGhlIHNvdXJjZSBgaW50MzJfdGAuCi0gKiBccmVzdWx0IFRoZSBjb3JyZXNwb25kaW5nIGBEYXRhc3BhY2VgLgotICovCi0vLyBjb252ZXJ0OiBpbnQzMl90IC0+IERhdGFzcGFjZQotaW5saW5lIERhdGFzcGFjZSB0b0hhcmR3YXJlRGF0YXNwYWNlKGludDMyX3QgbCkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxEYXRhc3BhY2U+KGwpOwotfQotCi0vKioKLSAqIFxicmllZiBDb252ZXJ0IGBEYXRhc3BhY2VgIHRvIGBpbnQzMl90YC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgRGF0YXNwYWNlYC4KLSAqIFxyZXN1bHQgVGhlIGNvcnJlc3BvbmRpbmcgYGludDMyX3RgLgotICovCi0vLyBjb252ZXJ0OiBEYXRhc3BhY2UgLT4gaW50MzJfdAotaW5saW5lIGludDMyX3QgdG9SYXdEYXRhc3BhY2UoRGF0YXNwYWNlIGNvbnN0JiB0KSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KHQpOwotfQotCi0vKioKLSAqIFxicmllZiBXcmFwIGFuIG9wYXF1ZSBidWZmZXIgaW5zaWRlIGEgYGhpZGxfdmVjPHVpbnQ4X3Q+YC4KLSAqCi0gKiBccGFyYW1baW5dIGwgVGhlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgb3BhcXVlIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbl0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgYnVmZmVyLgotICogXHJldHVybiBBIGBoaWRsX3ZlYzx1aW50OF90PmAgdGhhdCBwb2ludHMgdG8gdGhlIGJ1ZmZlci4KLSAqLwotLy8gd3JhcDogdm9pZCosIHNpemVfdCAtPiBoaWRsX3ZlYzx1aW50OF90PgotaW5saW5lIGhpZGxfdmVjPHVpbnQ4X3Q+IGluSGlkbEJ5dGVzKHZvaWQgY29uc3QqIGwsIHNpemVfdCBzaXplKSB7Ci0gICAgaGlkbF92ZWM8dWludDhfdD4gdDsKLSAgICB0LnNldFRvRXh0ZXJuYWwoc3RhdGljX2Nhc3Q8dWludDhfdCo+KGNvbnN0X2Nhc3Q8dm9pZCo+KGwpKSwgc2l6ZSwgZmFsc2UpOwotICAgIHJldHVybiB0OwotfQotCi0vKioKLSAqIFxicmllZiBDcmVhdGUgYSBgaGlkbF92ZWM8dWludDhfdD5gIHRoYXQgaXMgYSBjb3B5IG9mIGFuIG9wYXF1ZSBidWZmZXIuCi0gKgotICogXHBhcmFtW2luXSBsIFRoZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG9wYXF1ZSBidWZmZXIuCi0gKiBccGFyYW1baW5dIHNpemUgVGhlIHNpemUgb2YgdGhlIGJ1ZmZlci4KLSAqIFxyZXR1cm4gQSBgaGlkbF92ZWM8dWludDhfdD5gIHRoYXQgaXMgYSBjb3B5IG9mIHRoZSBpbnB1dCBidWZmZXIuCi0gKi8KLS8vIGNvbnZlcnQ6IHZvaWQqLCBzaXplX3QgLT4gaGlkbF92ZWM8dWludDhfdD4KLWlubGluZSBoaWRsX3ZlYzx1aW50OF90PiB0b0hpZGxCeXRlcyh2b2lkIGNvbnN0KiBsLCBzaXplX3Qgc2l6ZSkgewotICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IHQ7Ci0gICAgdC5yZXNpemUoc2l6ZSk7Ci0gICAgdWludDhfdCBjb25zdCogc3JjID0gc3RhdGljX2Nhc3Q8dWludDhfdCBjb25zdCo+KGwpOwotICAgIHN0ZDo6Y29weShzcmMsIHNyYyArIHNpemUsIHQuZGF0YSgpKTsKLSAgICByZXR1cm4gdDsKLX0KLQotLyoqCi0gKiBcYnJpZWYgV3JhcCBgR3JhcGhpY0J1ZmZlcmAgaW4gYEFud0J1ZmZlcmAuCi0gKgotICogXHBhcmFtW291dF0gdCBUaGUgd3JhcHBlciBvZiB0eXBlIGBBbndCdWZmZXJgLgotICogXHBhcmFtW2luXSBsIFRoZSBzb3VyY2UgYEdyYXBoaWNCdWZmZXJgLgotICovCi0vLyB3cmFwOiBHcmFwaGljQnVmZmVyIC0+IEFud0J1ZmZlcgotaW5saW5lIHZvaWQgd3JhcEFzKEFud0J1ZmZlciogdCwgR3JhcGhpY0J1ZmZlciBjb25zdCYgbCkgewotICAgIHQtPmF0dHIud2lkdGggPSBsLmdldFdpZHRoKCk7Ci0gICAgdC0+YXR0ci5oZWlnaHQgPSBsLmdldEhlaWdodCgpOwotICAgIHQtPmF0dHIuc3RyaWRlID0gbC5nZXRTdHJpZGUoKTsKLSAgICB0LT5hdHRyLmZvcm1hdCA9IHN0YXRpY19jYXN0PFBpeGVsRm9ybWF0PihsLmdldFBpeGVsRm9ybWF0KCkpOwotICAgIHQtPmF0dHIubGF5ZXJDb3VudCA9IGwuZ2V0TGF5ZXJDb3VudCgpOwotICAgIHQtPmF0dHIudXNhZ2UgPSBsLmdldFVzYWdlKCk7Ci0gICAgdC0+YXR0ci5pZCA9IGwuZ2V0SWQoKTsKLSAgICB0LT5hdHRyLmdlbmVyYXRpb25OdW1iZXIgPSBsLmdldEdlbmVyYXRpb25OdW1iZXIoKTsKLSAgICB0LT5uYXRpdmVIYW5kbGUgPSBoaWRsX2hhbmRsZShsLmhhbmRsZSk7Ci19Ci0KLS8qKgotICogXGJyaWVmIENvbnZlcnQgYEFud0J1ZmZlcmAgdG8gYEdyYXBoaWNCdWZmZXJgLgotICoKLSAqIFxwYXJhbVtvdXRdIGwgVGhlIGRlc3RpbmF0aW9uIGBHcmFwaGljQnVmZmVyYC4KLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBBbndCdWZmZXJgLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBkdXBsaWNhdGUgYWxsIGZpbGUgZGVzY3JpcHRvcnMgaW4gXHAgdC4KLSAqLwotLy8gY29udmVydDogQW53QnVmZmVyIC0+IEdyYXBoaWNCdWZmZXIKLS8vIFJlZjogZnJhbWV3b3Jrcy9uYXRpdmUvbGlicy91aS9HcmFwaGljQnVmZmVyLmNwcDogR3JhcGhpY0J1ZmZlcjo6ZmxhdHRlbgotaW5saW5lIGJvb2wgY29udmVydFRvKEdyYXBoaWNCdWZmZXIqIGwsIEFud0J1ZmZlciBjb25zdCYgdCkgewotICAgIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlID0gdC5uYXRpdmVIYW5kbGUgPT0gbnVsbHB0ciA/Ci0gICAgICAgICAgICBudWxscHRyIDogbmF0aXZlX2hhbmRsZV9jbG9uZSh0Lm5hdGl2ZUhhbmRsZSk7Ci0KLSAgICBzaXplX3QgY29uc3QgbnVtSW50cyA9IDEyICsgKGhhbmRsZSA/IGhhbmRsZS0+bnVtSW50cyA6IDApOwotICAgIGludDMyX3QqIGludHMgPSBuZXcgaW50MzJfdFtudW1JbnRzXTsKLQotICAgIHNpemVfdCBudW1GZHMgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGhhbmRsZSA/IGhhbmRsZS0+bnVtRmRzIDogMCk7Ci0gICAgaW50KiBmZHMgPSBuZXcgaW50W251bUZkc107Ci0KLSAgICBpbnRzWzBdID0gJ0dCRlInOwotICAgIGludHNbMV0gPSBzdGF0aWNfY2FzdDxpbnQzMl90Pih0LmF0dHIud2lkdGgpOwotICAgIGludHNbMl0gPSBzdGF0aWNfY2FzdDxpbnQzMl90Pih0LmF0dHIuaGVpZ2h0KTsKLSAgICBpbnRzWzNdID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4odC5hdHRyLnN0cmlkZSk7Ci0gICAgaW50c1s0XSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHQuYXR0ci5mb3JtYXQpOwotICAgIGludHNbNV0gPSBzdGF0aWNfY2FzdDxpbnQzMl90Pih0LmF0dHIubGF5ZXJDb3VudCk7Ci0gICAgaW50c1s2XSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHQuYXR0ci51c2FnZSk7Ci0gICAgaW50c1s3XSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHQuYXR0ci5pZCA+PiAzMik7Ci0gICAgaW50c1s4XSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHQuYXR0ci5pZCAmIDB4RkZGRkZGRkYpOwotICAgIGludHNbOV0gPSBzdGF0aWNfY2FzdDxpbnQzMl90Pih0LmF0dHIuZ2VuZXJhdGlvbk51bWJlcik7Ci0gICAgaW50c1sxMF0gPSAwOwotICAgIGludHNbMTFdID0gMDsKLSAgICBpZiAoaGFuZGxlKSB7Ci0gICAgICAgIGludHNbMTBdID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oaGFuZGxlLT5udW1GZHMpOwotICAgICAgICBpbnRzWzExXSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGhhbmRsZS0+bnVtSW50cyk7Ci0gICAgICAgIGludCogaW50c1N0YXJ0ID0gaGFuZGxlLT5kYXRhICsgaGFuZGxlLT5udW1GZHM7Ci0gICAgICAgIHN0ZDo6Y29weShoYW5kbGUtPmRhdGEsIGludHNTdGFydCwgZmRzKTsKLSAgICAgICAgc3RkOjpjb3B5KGludHNTdGFydCwgaW50c1N0YXJ0ICsgaGFuZGxlLT5udW1JbnRzLCAmaW50c1sxMl0pOwotICAgIH0KLQotICAgIHZvaWQgY29uc3QqIGNvbnN0QnVmZmVyID0gc3RhdGljX2Nhc3Q8dm9pZCBjb25zdCo+KGludHMpOwotICAgIHNpemVfdCBzaXplID0gbnVtSW50cyAqIHNpemVvZihpbnQzMl90KTsKLSAgICBpbnQgY29uc3QqIGNvbnN0RmRzID0gc3RhdGljX2Nhc3Q8aW50IGNvbnN0Kj4oZmRzKTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBsLT51bmZsYXR0ZW4oY29uc3RCdWZmZXIsIHNpemUsIGNvbnN0RmRzLCBudW1GZHMpOwotCi0gICAgZGVsZXRlIFtdIGZkczsKLSAgICBkZWxldGUgW10gaW50czsKLSAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoYW5kbGUpOwotICAgIHJldHVybiBzdGF0dXMgPT0gTk9fRVJST1I7Ci19Ci0KLS8qKgogICogXGJyaWVmIFdyYXAgYEdyYXBoaWNCdWZmZXJgIGluIGBDb2RlY0J1ZmZlcmAuCiAgKgogICogXHBhcmFtW291dF0gdCBUaGUgd3JhcHBlciBvZiB0eXBlIGBDb2RlY0J1ZmZlcmAuCkBAIC04OTYsMTI4MSArNzQ0LDYgQEAKICNlbmRpZgogfQogCi0vKioKLSAqIENvbnZlcnNpb24gZnVuY3Rpb25zIGZvciB0eXBlcyBvdXRzaWRlIG1lZGlhCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFNvbWUgb2JqZWN0cyBpbiBsaWJ1aSBhbmQgbGliZ3VpIHRoYXQgd2VyZSBtYWRlIHRvIGdvIHRocm91Z2ggYmluZGVyIGNhbGxzIGRvCi0gKiBub3QgZXhwb3NlIHdheXMgdG8gcmVhZCBvciB3cml0ZSB0aGVpciBmaWVsZHMgdG8gdGhlIHB1YmxpYy4gVG8gcGFzcyBhbgotICogb2JqZWN0IG9mIHRoaXMga2luZCB0aHJvdWdoIHRoZSBISURMIGJvdW5kYXJ5LCB0cmFuc2xhdGlvbiBmdW5jdGlvbnMgbmVlZCB0bwotICogd29yayBhcm91bmQgdGhlIGFjY2VzcyByZXN0cmljdGlvbiBieSB1c2luZyB0aGUgcHVibGljbHkgYXZhaWxhYmxlCi0gKiBgZmxhdHRlbigpYCBhbmQgYHVuZmxhdHRlbigpYCBmdW5jdGlvbnMuCi0gKgotICogQWxsIGBmbGF0dGVuKClgIGFuZCBgdW5mbGF0dGVuKClgIG92ZXJsb2FkcyBmb2xsb3cgdGhlIHNhbWUgY29udmVudGlvbiBhcwotICogZm9sbG93czoKLSAqCi0gKiAgICAgc3RhdHVzX3QgZmxhdHRlbihPYmplY3RUeXBlIGNvbnN0JiBvYmplY3QsCi0gKiAgICAgICAgICAgICAgICAgICAgICBbT3RoZXJUeXBlIGNvbnN0JiBvdGhlciwgLi4uXQotICogICAgICAgICAgICAgICAgICAgICAgdm9pZComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLAotICogICAgICAgICAgICAgICAgICAgICAgaW50KiYgZmRzLCBzaXplX3QmIG51bUZkcykKLSAqCi0gKiAgICAgc3RhdHVzX3QgdW5mbGF0dGVuKE9iamVjdFR5cGUqIG9iamVjdCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgW090aGVyVHlwZSogb3RoZXIsIC4uLixdCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgaW50KiYgZmRzLCBzaXplX3QmIG51bUZkcykKLSAqCi0gKiBUaGUgbnVtYmVyIG9mIGBvdGhlcmAgcGFyYW1ldGVycyB2YXJpZXMgZGVwZW5kaW5nIG9uIHRoZSBgT2JqZWN0VHlwZWAuIEZvcgotICogZXhhbXBsZSwgaW4gdGhlIHByb2Nlc3Mgb2YgdW5mbGF0dGVuaW5nIGFuIG9iamVjdCB0aGF0IGNvbnRhaW5zCi0gKiBgaGlkbF9oYW5kbGVgLCBgb3RoZXJgIGlzIG5lZWRlZCB0byBob2xkIGBuYXRpdmVfaGFuZGxlX3RgIG9iamVjdHMgdGhhdCB3aWxsCi0gKiBiZSBjcmVhdGVkLgotICoKLSAqIFRoZSBsYXN0IGZvdXIgcGFyYW1ldGVycyBhbHdheXMgd29yayB0aGUgc2FtZSB3YXkgaW4gYWxsIG92ZXJsb2FkcyBvZgotICogYGZsYXR0ZW4oKWAgYW5kIGB1bmZsYXR0ZW4oKWA6Ci0gKiAtIEZvciBgZmxhdHRlbigpYCwgYGJ1ZmZlcmAgaXMgdGhlIHBvaW50ZXIgdG8gdGhlIG5vbi1mZCBidWZmZXIgdG8gYmUgZmlsbGVkLAotICogICBgc2l6ZWAgaXMgdGhlIHNpemUgKGluIGJ5dGVzKSBvZiB0aGUgbm9uLWZkIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IGBidWZmZXJgLAotICogICBgZmRzYCBpcyB0aGUgcG9pbnRlciB0byB0aGUgZmQgYnVmZmVyIHRvIGJlIGZpbGxlZCwgYW5kIGBudW1GZHNgIGlzIHRoZQotICogICBzaXplIChpbiBpbnRzKSBvZiB0aGUgZmQgYnVmZmVyIHBvaW50ZWQgdG8gYnkgYGZkc2AuCi0gKiAtIEZvciBgdW5mbGF0dGVuKClgLCBgYnVmZmVyYCBpcyB0aGUgcG9pbnRlciB0byB0aGUgbm9uLWZkIGJ1ZmZlciB0byBiZSByZWFkCi0gKiAgIGZyb20sIGBzaXplYCBpcyB0aGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIHRoZSBub24tZmQgYnVmZmVyIHBvaW50ZWQgdG8gYnkKLSAqICAgYGJ1ZmZlcmAsIGBmZHNgIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBmZCBidWZmZXIgdG8gYmUgcmVhZCBmcm9tLCBhbmQKLSAqICAgYG51bUZkc2AgaXMgdGhlIHNpemUgKGluIGludHMpIG9mIHRoZSBmZCBidWZmZXIgcG9pbnRlZCB0byBieSBgZmRzYC4KLSAqIC0gQWZ0ZXIgYSBzdWNjZXNzZnVsIGNhbGwgdG8gYGZsYXR0ZW4oKWAgb3IgYHVuZmxhdHRlbigpYCwgYGJ1ZmZlcmAgYW5kIGBmZHNgCi0gKiAgIHdpbGwgYmUgYWR2YW5jZWQsIHdoaWxlIGBzaXplYCBhbmQgYG51bUZkc2Agd2lsbCBiZSBkZWNyZWFzZWQgdG8gcmVmbGVjdAotICogICBob3cgbXVjaCBzdG9yYWdlL2RhdGEgb2YgdGhlIHR3byBidWZmZXJzIChmZCBhbmQgbm9uLWZkKSBoYXZlIGJlZW4gdXNlZC4KLSAqIC0gQWZ0ZXIgYW4gdW5zdWNjZXNzZnVsIGNhbGwsIHRoZSB2YWx1ZXMgb2YgYGJ1ZmZlcmAsIGBzaXplYCwgYGZkc2AgYW5kCi0gKiAgIGBudW1GZHNgIGFyZSBpbnZhbGlkLgotICoKLSAqIFRoZSByZXR1cm4gdmFsdWUgb2YgYSBzdWNjZXNzZnVsIGBmbGF0dGVuKClgIG9yIGB1bmZsYXR0ZW4oKWAgY2FsbCB3aWxsIGJlCi0gKiBgT0tgIChhbHNvIGFsaWFzZWQgYXMgYE5PX0VSUk9SYCkuIEFueSBvdGhlciB2YWx1ZXMgaW5kaWNhdGUgYSBmYWlsdXJlLgotICoKLSAqIEZvciBlYWNoIG9iamVjdCB0eXBlIHRoYXQgc3VwcG9ydHMgZmxhdHRlbmluZywgdGhlcmUgd2lsbCBiZSB0d28gYWNjb21wYW55aW5nCi0gKiBmdW5jdGlvbnM6IGBnZXRGbGF0dGVuZWRTaXplKClgIGFuZCBgZ2V0RmRDb3VudCgpYC4gYGdldEZsYXR0ZW5lZFNpemUoKWAgd2lsbAotICogcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBub24tZmQgYnVmZmVyIHRoYXQgdGhlIG9iamVjdCB3aWxsIG5lZWQgZm9yCi0gKiBmbGF0dGVuaW5nLiBgZ2V0RmRDb3VudCgpYCB3aWxsIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgZmQgYnVmZmVyIHRoYXQgdGhlCi0gKiBvYmplY3Qgd2lsbCBuZWVkIGZvciBmbGF0dGVuaW5nLgotICoKLSAqIFRoZSBzZXQgb2YgdGhlc2UgZm91ciBmdW5jdGlvbnMsIGBnZXRGbGF0dGVuZWRTaXplKClgLCBgZ2V0RmRDb3VudCgpYCwKLSAqIGBmbGF0dGVuKClgIGFuZCBgdW5mbGF0dGVuKClgLCBhcmUgc2ltaWxhciB0byBmdW5jdGlvbnMgb2YgdGhlIHNhbWUgbmFtZSBpbgotICogdGhlIGFic3RyYWN0IGNsYXNzIGBGbGF0dGVuYWJsZWAuIFRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgdGhhdCBmdW5jdGlvbnMgaW4KLSAqIHRoaXMgZmlsZSBhcmUgbm90IG1lbWJlciBmdW5jdGlvbnMgb2YgdGhlIG9iamVjdCB0eXBlLiBGb3IgZXhhbXBsZSwgd2Ugd3JpdGUKLSAqCi0gKiAgICAgZmxhdHRlbih4LCBidWZmZXIsIHNpemUsIGZkcywgbnVtRmRzKQotICoKLSAqIGluc3RlYWQgb2YKLSAqCi0gKiAgICAgeC5mbGF0dGVuKGJ1ZmZlciwgc2l6ZSwgZmRzLCBudW1GZHMpCi0gKgotICogYmVjYXVzZSB3ZSBjYW5ub3QgbW9kaWZ5IHRoZSB0eXBlIG9mIGB4YC4KLSAqCi0gKiBUaGVyZSBpcyBvbmUgZXhjZXB0aW9uIHRvIHRoZSBuYW1pbmcgY29udmVudGlvbjogYGhpZGxfaGFuZGxlYCB0aGF0Ci0gKiByZXByZXNlbnRzIGEgZmVuY2UuIFRoZSBmb3VyIGZ1bmN0aW9ucyBmb3IgdGhpcyAiRmVuY2UiIHR5cGUgaGF2ZSB0aGUgd29yZAotICogIkZlbmNlIiBhdHRjaGVkIHRvIHRoZWlyIG5hbWVzIGJlY2F1c2UgdGhlIG9iamVjdCB0eXBlLCB3aGljaCBpcwotICogYGhpZGxfaGFuZGxlYCwgZG9lcyBub3QgY2FycnkgdGhlIHNwZWNpYWwgbWVhbmluZyB0aGF0IHRoZSBvYmplY3QgaXRzZWxmIGNhbgotICogb25seSBjb250YWluIHplcm8gb3Igb25lIGZpbGUgZGVzY3JpcHRvci4KLSAqLwotCi0vLyBSZWY6IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvdWkvRmVuY2UuY3BwCi0KLS8qKgotICogXGJyaWVmIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgbm9uLWZkIGJ1ZmZlciByZXF1aXJlZCB0byBmbGF0dGVuIGEgZmVuY2UuCi0gKgotICogXHBhcmFtW2luXSBmZW5jZSBUaGUgaW5wdXQgZmVuY2Ugb2YgdHlwZSBgaGlkbF9oYW5kbGVgLgotICogXHJldHVybiBUaGUgcmVxdWlyZWQgc2l6ZSBvZiB0aGUgZmxhdCBidWZmZXIuCi0gKgotICogVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGlzIGZ1bmN0aW9uIGFsd2F5cyByZXR1cm5zIDQsIHdoaWNoIGlzIHRoZSBudW1iZXIgb2YKLSAqIGJ5dGVzIHJlcXVpcmVkIHRvIHN0b3JlIHRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4gdGhlIGZkCi0gKiBwYXJ0IG9mIHRoZSBmbGF0IGJ1ZmZlci4KLSAqLwotaW5saW5lIHNpemVfdCBnZXRGZW5jZUZsYXR0ZW5lZFNpemUoaGlkbF9oYW5kbGUgY29uc3QmIC8qIGZlbmNlICovKSB7Ci0gICAgcmV0dXJuIDQ7Ci19OwotCi0vKioKLSAqIFxicmllZiBSZXR1cm4gdGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbiBhIGZlbmNlLgotICoKLSAqIFxwYXJhbVtpbl0gZmVuY2UgVGhlIGlucHV0IGZlbmNlIG9mIHR5cGUgYGhpZGxfaGFuZGxlYC4KLSAqIFxyZXR1cm4gYDBgIGlmIFxwIGZlbmNlIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBmaWxlIGRlc2NyaXB0b3IsIG9yIGAxYAotICogb3RoZXJ3aXNlLgotICovCi1pbmxpbmUgc2l6ZV90IGdldEZlbmNlRmRDb3VudChoaWRsX2hhbmRsZSBjb25zdCYgZmVuY2UpIHsKLSAgICByZXR1cm4gbmF0aXZlX2hhbmRsZV9yZWFkX2ZkKGZlbmNlKSA9PSAtMSA/IDAgOiAxOwotfQotCi0vKioKLSAqIFxicmllZiBVbmZsYXR0ZW4gYEZlbmNlYCB0byBgaGlkbF9oYW5kbGVgLgotICoKLSAqIFxwYXJhbVtvdXRdIGZlbmNlIFRoZSBkZXN0aW5hdGlvbiBgaGlkbF9oYW5kbGVgLgotICogXHBhcmFtW291dF0gbmggVGhlIHVuZGVybHlpbmcgbmF0aXZlIGhhbmRsZS4KLSAqIFxwYXJhbVtpbixvdXRdIGJ1ZmZlciBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gZmRzIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIG51bUZkcyBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccmV0dXJuIGBOT19FUlJPUmAgb24gc3VjY2Vzczsgb3RoZXIgdmFsdWUgb24gZmFpbHVyZS4KLSAqCi0gKiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIGBOT19FUlJPUmAsIFxwIG5oIHdpbGwgcG9pbnQgdG8gYSBuZXdseSBjcmVhdGVkCi0gKiBuYXRpdmUgaGFuZGxlLCB3aGljaCBuZWVkcyB0byBiZSBkZWxldGVkIHdpdGggYG5hdGl2ZV9oYW5kbGVfZGVsZXRlKClgCi0gKiBhZnRlcndhcmRzLgotICovCi1pbmxpbmUgc3RhdHVzX3QgdW5mbGF0dGVuRmVuY2UoaGlkbF9oYW5kbGUqIGZlbmNlLCBuYXRpdmVfaGFuZGxlX3QqKiBuaCwKLSAgICAgICAgdm9pZCBjb25zdComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLCBpbnQgY29uc3QqJiBmZHMsIHNpemVfdCYgbnVtRmRzKSB7Ci0gICAgaWYgKHNpemUgPCA0KSB7Ci0gICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgfQotCi0gICAgdWludDMyX3QgbnVtRmRzSW5IYW5kbGU7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIG51bUZkc0luSGFuZGxlKTsKLQotICAgIGlmIChudW1GZHNJbkhhbmRsZSA+IDEpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBpZiAobnVtRmRzIDwgbnVtRmRzSW5IYW5kbGUpIHsKLSAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICB9Ci0KLSAgICBpZiAobnVtRmRzSW5IYW5kbGUpIHsKLSAgICAgICAgKm5oID0gbmF0aXZlX2hhbmRsZV9jcmVhdGVfZnJvbV9mZCgqZmRzKTsKLSAgICAgICAgaWYgKCpuaCA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgICAgICB9Ci0gICAgICAgICpmZW5jZSA9ICpuaDsKLSAgICAgICAgKytmZHM7Ci0gICAgICAgIC0tbnVtRmRzOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICpuaCA9IG51bGxwdHI7Ci0gICAgICAgICpmZW5jZSA9IGhpZGxfaGFuZGxlKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vKioKLSAqIFxicmllZiBGbGF0dGVuIGBoaWRsX2hhbmRsZWAgYXMgYEZlbmNlYC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgaGlkbF9oYW5kbGVgLgotICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBmZHMgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gbnVtRmRzIFRoZSBzaXplIG9mIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgotICovCi1pbmxpbmUgc3RhdHVzX3QgZmxhdHRlbkZlbmNlKGhpZGxfaGFuZGxlIGNvbnN0JiBmZW5jZSwKLSAgICAgICAgdm9pZComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLCBpbnQqJiBmZHMsIHNpemVfdCYgbnVtRmRzKSB7Ci0gICAgaWYgKHNpemUgPCBnZXRGZW5jZUZsYXR0ZW5lZFNpemUoZmVuY2UpIHx8Ci0gICAgICAgICAgICBudW1GZHMgPCBnZXRGZW5jZUZkQ291bnQoZmVuY2UpKSB7Ci0gICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgfQotICAgIC8vIENhc3QgdG8gdWludDMyX3Qgc2luY2UgdGhlIHNpemUgb2YgYSBzaXplX3QgY2FuIHZhcnkgYmV0d2VlbiAzMi0gYW5kCi0gICAgLy8gNjQtYml0IHByb2Nlc3NlcwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihnZXRGZW5jZUZkQ291bnQoZmVuY2UpKSk7Ci0gICAgaW50IGZkID0gbmF0aXZlX2hhbmRsZV9yZWFkX2ZkKGZlbmNlKTsKLSAgICBpZiAoZmQgIT0gLTEpIHsKLSAgICAgICAgKmZkcyA9IGZkOwotICAgICAgICArK2ZkczsKLSAgICAgICAgLS1udW1GZHM7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLyoqCi0gKiBcYnJpZWYgV3JhcCBgRmVuY2VgIGluIGBoaWRsX2hhbmRsZWAuCi0gKgotICogXHBhcmFtW291dF0gdCBUaGUgd3JhcHBlciBvZiB0eXBlIGBoaWRsX2hhbmRsZWAuCi0gKiBccGFyYW1bb3V0XSBuaCBUaGUgbmF0aXZlIGhhbmRsZSBwb2ludGVkIHRvIGJ5IFxwIHQuCi0gKiBccGFyYW1baW5dIGwgVGhlIHNvdXJjZSBgRmVuY2VgLgotICoKLSAqIE9uIHN1Y2Nlc3MsIFxwIG5oIHdpbGwgaG9sZCBhIG5ld2x5IGNyZWF0ZWQgbmF0aXZlIGhhbmRsZSwgd2hpY2ggbXVzdCBiZQotICogZGVsZXRlZCBtYW51YWxseSB3aXRoIGBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpYCBhZnRlcndhcmRzLgotICovCi0vLyB3cmFwOiBGZW5jZSAtPiBoaWRsX2hhbmRsZQotaW5saW5lIGJvb2wgd3JhcEFzKGhpZGxfaGFuZGxlKiB0LCBuYXRpdmVfaGFuZGxlX3QqKiBuaCwgRmVuY2UgY29uc3QmIGwpIHsKLSAgICBzaXplX3QgY29uc3QgYmFzZVNpemUgPSBsLmdldEZsYXR0ZW5lZFNpemUoKTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBiYXNlQnVmZmVyKAotICAgICAgICAgICAgbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQ4X3RbYmFzZVNpemVdKTsKLSAgICBpZiAoIWJhc2VCdWZmZXIpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHNpemVfdCBjb25zdCBiYXNlTnVtRmRzID0gbC5nZXRGZENvdW50KCk7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPGludFtdPiBiYXNlRmRzKAotICAgICAgICAgICAgbmV3IChzdGQ6Om5vdGhyb3cpIGludFtiYXNlTnVtRmRzXSk7Ci0gICAgaWYgKCFiYXNlRmRzKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2b2lkKiBidWZmZXIgPSBzdGF0aWNfY2FzdDx2b2lkKj4oYmFzZUJ1ZmZlci5nZXQoKSk7Ci0gICAgc2l6ZV90IHNpemUgPSBiYXNlU2l6ZTsKLSAgICBpbnQqIGZkcyA9IHN0YXRpY19jYXN0PGludCo+KGJhc2VGZHMuZ2V0KCkpOwotICAgIHNpemVfdCBudW1GZHMgPSBiYXNlTnVtRmRzOwotICAgIGlmIChsLmZsYXR0ZW4oYnVmZmVyLCBzaXplLCBmZHMsIG51bUZkcykgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHZvaWQgY29uc3QqIGNvbnN0QnVmZmVyID0gc3RhdGljX2Nhc3Q8dm9pZCBjb25zdCo+KGJhc2VCdWZmZXIuZ2V0KCkpOwotICAgIHNpemUgPSBiYXNlU2l6ZTsKLSAgICBpbnQgY29uc3QqIGNvbnN0RmRzID0gc3RhdGljX2Nhc3Q8aW50IGNvbnN0Kj4oYmFzZUZkcy5nZXQoKSk7Ci0gICAgbnVtRmRzID0gYmFzZU51bUZkczsKLSAgICBpZiAodW5mbGF0dGVuRmVuY2UodCwgbmgsIGNvbnN0QnVmZmVyLCBzaXplLCBjb25zdEZkcywgbnVtRmRzKQotICAgICAgICAgICAgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi0vKioKLSAqIFxicmllZiBDb252ZXJ0IGBoaWRsX2hhbmRsZWAgdG8gYEZlbmNlYC4KLSAqCi0gKiBccGFyYW1bb3V0XSBsIFRoZSBkZXN0aW5hdGlvbiBgRmVuY2VgLiBgbGAgbXVzdCBub3QgaGF2ZSBiZWVuIHVzZWQKLSAqIChgbC0+aXNWYWxpZCgpYCBtdXN0IHJldHVybiBgZmFsc2VgKSBiZWZvcmUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgaGlkbF9oYW5kbGVgLgotICoKLSAqIElmIFxwIHQgY29udGFpbnMgYSB2YWxpZCBmaWxlIGRlc2NyaXB0b3IsIGl0IHdpbGwgYmUgZHVwbGljYXRlZC4KLSAqLwotLy8gY29udmVydDogaGlkbF9oYW5kbGUgLT4gRmVuY2UKLWlubGluZSBib29sIGNvbnZlcnRUbyhGZW5jZSogbCwgaGlkbF9oYW5kbGUgY29uc3QmIHQpIHsKLSAgICBpbnQgZmQgPSBuYXRpdmVfaGFuZGxlX3JlYWRfZmQodCk7Ci0gICAgaWYgKGZkICE9IC0xKSB7Ci0gICAgICAgIGZkID0gZHVwKGZkKTsKLSAgICAgICAgaWYgKGZkID09IC0xKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbmF0aXZlX2hhbmRsZV90KiBuaCA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlX2Zyb21fZmQoZmQpOwotICAgIGlmIChuaCA9PSBudWxscHRyKSB7Ci0gICAgICAgIGlmIChmZCAhPSAtMSkgewotICAgICAgICAgICAgY2xvc2UoZmQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBzaXplX3QgY29uc3QgYmFzZVNpemUgPSBnZXRGZW5jZUZsYXR0ZW5lZFNpemUodCk7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gYmFzZUJ1ZmZlcigKLSAgICAgICAgICAgIG5ldyAoc3RkOjpub3Rocm93KSB1aW50OF90W2Jhc2VTaXplXSk7Ci0gICAgaWYgKCFiYXNlQnVmZmVyKSB7Ci0gICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG5oKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHNpemVfdCBjb25zdCBiYXNlTnVtRmRzID0gZ2V0RmVuY2VGZENvdW50KHQpOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxpbnRbXT4gYmFzZUZkcygKLSAgICAgICAgICAgIG5ldyAoc3RkOjpub3Rocm93KSBpbnRbYmFzZU51bUZkc10pOwotICAgIGlmICghYmFzZUZkcykgewotICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShuaCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2b2lkKiBidWZmZXIgPSBzdGF0aWNfY2FzdDx2b2lkKj4oYmFzZUJ1ZmZlci5nZXQoKSk7Ci0gICAgc2l6ZV90IHNpemUgPSBiYXNlU2l6ZTsKLSAgICBpbnQqIGZkcyA9IHN0YXRpY19jYXN0PGludCo+KGJhc2VGZHMuZ2V0KCkpOwotICAgIHNpemVfdCBudW1GZHMgPSBiYXNlTnVtRmRzOwotICAgIGlmIChmbGF0dGVuRmVuY2UoaGlkbF9oYW5kbGUobmgpLCBidWZmZXIsIHNpemUsIGZkcywgbnVtRmRzKSAhPSBOT19FUlJPUikgewotICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShuaCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobmgpOwotCi0gICAgdm9pZCBjb25zdCogY29uc3RCdWZmZXIgPSBzdGF0aWNfY2FzdDx2b2lkIGNvbnN0Kj4oYmFzZUJ1ZmZlci5nZXQoKSk7Ci0gICAgc2l6ZSA9IGJhc2VTaXplOwotICAgIGludCBjb25zdCogY29uc3RGZHMgPSBzdGF0aWNfY2FzdDxpbnQgY29uc3QqPihiYXNlRmRzLmdldCgpKTsKLSAgICBudW1GZHMgPSBiYXNlTnVtRmRzOwotICAgIGlmIChsLT51bmZsYXR0ZW4oY29uc3RCdWZmZXIsIHNpemUsIGNvbnN0RmRzLCBudW1GZHMpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gUmVmOiBmcmFtZXdvcmtzL25hdGl2ZS9saWJzL3VpL0ZlbmNlVGltZS5jcHA6IEZlbmNlVGltZTo6U25hcHNob3QKLQotLyoqCi0gKiBcYnJpZWYgUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBub24tZmQgYnVmZmVyIHJlcXVpcmVkIHRvIGZsYXR0ZW4KLSAqIGBGZW5jZVRpbWVTbmFwc2hvdGAuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBpbnB1dCBgRmVuY2VUaW1lU25hcHNob3RgLgotICogXHJldHVybiBUaGUgcmVxdWlyZWQgc2l6ZSBvZiB0aGUgZmxhdCBidWZmZXIuCi0gKi8KLWlubGluZSBzaXplX3QgZ2V0RmxhdHRlbmVkU2l6ZSgKLSAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RmVuY2VUaW1lU25hcHNob3QgY29uc3QmIHQpIHsKLSAgICBjb25zdGV4cHIgc2l6ZV90IG1pbiA9IHNpemVvZih0LnN0YXRlKTsKLSAgICBzd2l0Y2ggKHQuc3RhdGUpIHsKLSAgICAgICAgY2FzZSBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdDo6U3RhdGU6OkVNUFRZOgotICAgICAgICAgICAgcmV0dXJuIG1pbjsKLSAgICAgICAgY2FzZSBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdDo6U3RhdGU6OkZFTkNFOgotICAgICAgICAgICAgcmV0dXJuIG1pbiArIGdldEZlbmNlRmxhdHRlbmVkU2l6ZSh0LmZlbmNlKTsKLSAgICAgICAgY2FzZSBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdDo6U3RhdGU6OlNJR05BTF9USU1FOgotICAgICAgICAgICAgcmV0dXJuIG1pbiArIHNpemVvZigKLSAgICAgICAgICAgICAgICAgICAgOjphbmRyb2lkOjpGZW5jZVRpbWU6OlNuYXBzaG90OjpzaWduYWxUaW1lKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogXGJyaWVmIFJldHVybiB0aGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluCi0gKiBgRmVuY2VUaW1lU25hcHNob3RgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYEZlbmNlVGltZVNuYXBzaG90YC4KLSAqIFxyZXR1cm4gVGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbiBccCBzbmFwc2hvdC4KLSAqLwotaW5saW5lIHNpemVfdCBnZXRGZENvdW50KAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdCBjb25zdCYgdCkgewotICAgIHJldHVybiB0LnN0YXRlID09Ci0gICAgICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdDo6U3RhdGU6OkZFTkNFID8KLSAgICAgICAgICAgIGdldEZlbmNlRmRDb3VudCh0LmZlbmNlKSA6IDA7Ci19Ci0KLS8qKgotICogXGJyaWVmIEZsYXR0ZW4gYEZlbmNlVGltZVNuYXBzaG90YC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgRmVuY2VUaW1lU25hcHNob3RgLgotICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBmZHMgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gbnVtRmRzIFRoZSBzaXplIG9mIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBkdXBsaWNhdGUgdGhlIGZpbGUgZGVzY3JpcHRvciBpbiBgdC5mZW5jZWAgaWYgYHQuc3RhdGUgPT0KLSAqIEZFTkNFYC4KLSAqLwotaW5saW5lIHN0YXR1c190IGZsYXR0ZW4oSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RmVuY2VUaW1lU25hcHNob3QgY29uc3QmIHQsCi0gICAgICAgIHZvaWQqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwgaW50KiYgZmRzLCBzaXplX3QmIG51bUZkcykgewotICAgIGlmIChzaXplIDwgZ2V0RmxhdHRlbmVkU2l6ZSh0KSkgewotICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgIH0KLQotICAgIHN3aXRjaCAodC5zdGF0ZSkgewotICAgICAgICBjYXNlIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZlbmNlVGltZVNuYXBzaG90OjpTdGF0ZTo6RU1QVFk6Ci0gICAgICAgICAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsCi0gICAgICAgICAgICAgICAgICAgIDo6YW5kcm9pZDo6RmVuY2VUaW1lOjpTbmFwc2hvdDo6U3RhdGU6OkVNUFRZKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgY2FzZSBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdDo6U3RhdGU6OkZFTkNFOgotICAgICAgICAgICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLAotICAgICAgICAgICAgICAgICAgICA6OmFuZHJvaWQ6OkZlbmNlVGltZTo6U25hcHNob3Q6OlN0YXRlOjpGRU5DRSk7Ci0gICAgICAgICAgICByZXR1cm4gZmxhdHRlbkZlbmNlKHQuZmVuY2UsIGJ1ZmZlciwgc2l6ZSwgZmRzLCBudW1GZHMpOwotICAgICAgICBjYXNlIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZlbmNlVGltZVNuYXBzaG90OjpTdGF0ZTo6U0lHTkFMX1RJTUU6Ci0gICAgICAgICAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsCi0gICAgICAgICAgICAgICAgICAgIDo6YW5kcm9pZDo6RmVuY2VUaW1lOjpTbmFwc2hvdDo6U3RhdGU6OlNJR05BTF9USU1FKTsKLSAgICAgICAgICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgdC5zaWduYWxUaW1lTnMpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8qKgotICogXGJyaWVmIFVuZmxhdHRlbiBgRmVuY2VUaW1lU25hcHNob3RgLgotICoKLSAqIFxwYXJhbVtvdXRdIHQgVGhlIGRlc3RpbmF0aW9uIGBGZW5jZVRpbWVTbmFwc2hvdGAuCi0gKiBccGFyYW1bb3V0XSBuaCBUaGUgdW5kZXJseWluZyBuYXRpdmUgaGFuZGxlLgotICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBmZHMgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gbnVtRmRzIFRoZSBzaXplIG9mIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgotICoKLSAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgYE5PX0VSUk9SYCBhbmQgdGhlIGNvbnN0cnVjdGVkIHNuYXBzaG90IGNvbnRhaW5zIGEKLSAqIGZpbGUgZGVzY3JpcHRvciwgXHAgbmggd2lsbCBiZSBjcmVhdGVkIHRvIGhvbGQgdGhhdCBmaWxlIGRlc2NyaXB0b3IuIEluIHRoaXMKLSAqIGNhc2UsIFxwIG5oIG5lZWRzIHRvIGJlIGRlbGV0ZWQgd2l0aCBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAgYWZ0ZXJ3YXJkcy4KLSAqLwotaW5saW5lIHN0YXR1c190IHVuZmxhdHRlbigKLSAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RmVuY2VUaW1lU25hcHNob3QqIHQsIG5hdGl2ZV9oYW5kbGVfdCoqIG5oLAotICAgICAgICB2b2lkIGNvbnN0KiYgYnVmZmVyLCBzaXplX3QmIHNpemUsIGludCBjb25zdComIGZkcywgc2l6ZV90JiBudW1GZHMpIHsKLSAgICBpZiAoc2l6ZSA8IHNpemVvZih0LT5zdGF0ZSkpIHsKLSAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICB9Ci0KLSAgICAqbmggPSBudWxscHRyOwotICAgIDo6YW5kcm9pZDo6RmVuY2VUaW1lOjpTbmFwc2hvdDo6U3RhdGUgc3RhdGU7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIHN0YXRlKTsKLSAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgIGNhc2UgOjphbmRyb2lkOjpGZW5jZVRpbWU6OlNuYXBzaG90OjpTdGF0ZTo6RU1QVFk6Ci0gICAgICAgICAgICB0LT5zdGF0ZSA9IEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZlbmNlVGltZVNuYXBzaG90OjpTdGF0ZTo6RU1QVFk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIGNhc2UgOjphbmRyb2lkOjpGZW5jZVRpbWU6OlNuYXBzaG90OjpTdGF0ZTo6RkVOQ0U6Ci0gICAgICAgICAgICB0LT5zdGF0ZSA9IEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZlbmNlVGltZVNuYXBzaG90OjpTdGF0ZTo6RkVOQ0U7Ci0gICAgICAgICAgICByZXR1cm4gdW5mbGF0dGVuRmVuY2UoJnQtPmZlbmNlLCBuaCwgYnVmZmVyLCBzaXplLCBmZHMsIG51bUZkcyk7Ci0gICAgICAgIGNhc2UgOjphbmRyb2lkOjpGZW5jZVRpbWU6OlNuYXBzaG90OjpTdGF0ZTo6U0lHTkFMX1RJTUU6Ci0gICAgICAgICAgICB0LT5zdGF0ZSA9IEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZlbmNlVGltZVNuYXBzaG90OjpTdGF0ZTo6U0lHTkFMX1RJTUU7Ci0gICAgICAgICAgICBpZiAoc2l6ZSA8IHNpemVvZih0LT5zaWduYWxUaW1lTnMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCB0LT5zaWduYWxUaW1lTnMpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8vIFJlZjogZnJhbWV3b3Jrcy9uYXRpdmUvbGlicy9ndWkvRnJhbWVUaW1lc3RhbXBzLmNwcDogRnJhbWVFdmVudHNEZWx0YQotCi0vKioKLSAqIFxicmllZiBSZXR1cm4gYSBsb3dlciBib3VuZCBvbiB0aGUgc2l6ZSBvZiB0aGUgbm9uLWZkIGJ1ZmZlciByZXF1aXJlZCB0bwotICogZmxhdHRlbiBgRnJhbWVFdmVudHNEZWx0YWAuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBpbnB1dCBgRnJhbWVFdmVudHNEZWx0YWAuCi0gKiBccmV0dXJuIEEgbG93ZXIgYm91bmQgb24gdGhlIHNpemUgb2YgdGhlIGZsYXQgYnVmZmVyLgotICovCi1jb25zdGV4cHIgc2l6ZV90IG1pbkZsYXR0ZW5lZFNpemUoCi0gICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRzRGVsdGEgY29uc3QmIC8qIHQgKi8pIHsKLSAgICByZXR1cm4gc2l6ZW9mKHVpbnQ2NF90KSArIC8vIG1GcmFtZU51bWJlcgotICAgICAgICAgICAgc2l6ZW9mKHVpbnQ4X3QpICsgLy8gbUluZGV4Ci0gICAgICAgICAgICBzaXplb2YodWludDhfdCkgKyAvLyBtQWRkUG9zdENvbXBvc2l0ZUNhbGxlZAotICAgICAgICAgICAgc2l6ZW9mKHVpbnQ4X3QpICsgLy8gbUFkZFJldGlyZUNhbGxlZAotICAgICAgICAgICAgc2l6ZW9mKHVpbnQ4X3QpICsgLy8gbUFkZFJlbGVhc2VDYWxsZWQKLSAgICAgICAgICAgIHNpemVvZihuc2Vjc190KSArIC8vIG1Qb3N0ZWRUaW1lCi0gICAgICAgICAgICBzaXplb2YobnNlY3NfdCkgKyAvLyBtUmVxdWVzdGVkUHJlc2VudFRpbWUKLSAgICAgICAgICAgIHNpemVvZihuc2Vjc190KSArIC8vIG1MYXRjaFRpbWUKLSAgICAgICAgICAgIHNpemVvZihuc2Vjc190KSArIC8vIG1GaXJzdFJlZnJlc2hTdGFydFRpbWUKLSAgICAgICAgICAgIHNpemVvZihuc2Vjc190KTsgLy8gbUxhc3RSZWZyZXNoU3RhcnRUaW1lCi19Ci0KLS8qKgotICogXGJyaWVmIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgbm9uLWZkIGJ1ZmZlciByZXF1aXJlZCB0byBmbGF0dGVuCi0gKiBgRnJhbWVFdmVudHNEZWx0YWAuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBpbnB1dCBgRnJhbWVFdmVudHNEZWx0YWAuCi0gKiBccmV0dXJuIFRoZSByZXF1aXJlZCBzaXplIG9mIHRoZSBmbGF0IGJ1ZmZlci4KLSAqLwotaW5saW5lIHNpemVfdCBnZXRGbGF0dGVuZWRTaXplKAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50c0RlbHRhIGNvbnN0JiB0KSB7Ci0gICAgcmV0dXJuIG1pbkZsYXR0ZW5lZFNpemUodCkgKwotICAgICAgICAgICAgZ2V0RmxhdHRlbmVkU2l6ZSh0LmdwdUNvbXBvc2l0aW9uRG9uZUZlbmNlKSArCi0gICAgICAgICAgICBnZXRGbGF0dGVuZWRTaXplKHQuZGlzcGxheVByZXNlbnRGZW5jZSkgKwotICAgICAgICAgICAgZ2V0RmxhdHRlbmVkU2l6ZSh0LmRpc3BsYXlSZXRpcmVGZW5jZSkgKwotICAgICAgICAgICAgZ2V0RmxhdHRlbmVkU2l6ZSh0LnJlbGVhc2VGZW5jZSk7Ci19OwotCi0vKioKLSAqIFxicmllZiBSZXR1cm4gdGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbgotICogYEZyYW1lRXZlbnRzRGVsdGFgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYEZyYW1lRXZlbnRzRGVsdGFgLgotICogXHJldHVybiBUaGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluIFxwIHQuCi0gKi8KLWlubGluZSBzaXplX3QgZ2V0RmRDb3VudCgKLSAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudHNEZWx0YSBjb25zdCYgdCkgewotICAgIHJldHVybiBnZXRGZENvdW50KHQuZ3B1Q29tcG9zaXRpb25Eb25lRmVuY2UpICsKLSAgICAgICAgICAgIGdldEZkQ291bnQodC5kaXNwbGF5UHJlc2VudEZlbmNlKSArCi0gICAgICAgICAgICBnZXRGZENvdW50KHQuZGlzcGxheVJldGlyZUZlbmNlKSArCi0gICAgICAgICAgICBnZXRGZENvdW50KHQucmVsZWFzZUZlbmNlKTsKLX07Ci0KLS8qKgotICogXGJyaWVmIFVuZmxhdHRlbiBgRnJhbWVFdmVudHNEZWx0YWAuCi0gKgotICogXHBhcmFtW291dF0gdCBUaGUgZGVzdGluYXRpb24gYEZyYW1lRXZlbnRzRGVsdGFgLgotICogXHBhcmFtW291dF0gbmggVGhlIHVuZGVybHlpbmcgYXJyYXkgb2YgbmF0aXZlIGhhbmRsZXMuCi0gKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIGZkcyBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBudW1GZHMgVGhlIHNpemUgb2YgdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCi0gKgotICogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBgTk9fRVJST1JgLCBccCBuaCB3aWxsIGhhdmUgbGVuZ3RoIDQsIGFuZCBpdCB3aWxsIGJlCi0gKiBwb3B1bGF0ZWQgd2l0aCBgbnVsbHB0cmAgb3IgbmV3bHkgY3JlYXRlZCBoYW5kbGVzLiBFYWNoIG5vbi1udWxsIHNsb3QgaW4gXHAKLSAqIG5oIHdpbGwgbmVlZCB0byBiZSBkZWxldGVkIG1hbnVhbGx5IHdpdGggYG5hdGl2ZV9oYW5kbGVfZGVsZXRlKClgLgotICovCi1pbmxpbmUgc3RhdHVzX3QgdW5mbGF0dGVuKEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRzRGVsdGEqIHQsCi0gICAgICAgIHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+KiBuaCwKLSAgICAgICAgdm9pZCBjb25zdComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLCBpbnQgY29uc3QqJiBmZHMsIHNpemVfdCYgbnVtRmRzKSB7Ci0gICAgaWYgKHNpemUgPCBtaW5GbGF0dGVuZWRTaXplKCp0KSkgewotICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgIH0KLSAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgdC0+ZnJhbWVOdW1iZXIpOwotCi0gICAgLy8gVGhlc2Ugd2VyZSB3cml0dGVuIGFzIHVpbnQ4X3QgZm9yIGFsaWdubWVudC4KLSAgICB1aW50OF90IHRlbXAgPSAwOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCB0ZW1wKTsKLSAgICBzaXplX3QgaW5kZXggPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHRlbXApOwotICAgIGlmIChpbmRleCA+PSA6OmFuZHJvaWQ6OkZyYW1lRXZlbnRIaXN0b3J5OjpNQVhfRlJBTUVfSElTVE9SWSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICB0LT5pbmRleCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihpbmRleCk7Ci0KLSAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgdGVtcCk7Ci0gICAgdC0+YWRkUG9zdENvbXBvc2l0ZUNhbGxlZCA9IHN0YXRpY19jYXN0PGJvb2w+KHRlbXApOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCB0ZW1wKTsKLSAgICB0LT5hZGRSZXRpcmVDYWxsZWQgPSBzdGF0aWNfY2FzdDxib29sPih0ZW1wKTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgdGVtcCk7Ci0gICAgdC0+YWRkUmVsZWFzZUNhbGxlZCA9IHN0YXRpY19jYXN0PGJvb2w+KHRlbXApOwotCi0gICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIHQtPnBvc3RlZFRpbWVOcyk7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIHQtPnJlcXVlc3RlZFByZXNlbnRUaW1lTnMpOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCB0LT5sYXRjaFRpbWVOcyk7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIHQtPmZpcnN0UmVmcmVzaFN0YXJ0VGltZU5zKTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgdC0+bGFzdFJlZnJlc2hTdGFydFRpbWVOcyk7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIHQtPmRlcXVldWVSZWFkeVRpbWUpOwotCi0gICAgLy8gRmVuY2VzCi0gICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RmVuY2VUaW1lU25hcHNob3QqIHRTbmFwc2hvdFs0XTsKLSAgICB0U25hcHNob3RbMF0gPSAmdC0+Z3B1Q29tcG9zaXRpb25Eb25lRmVuY2U7Ci0gICAgdFNuYXBzaG90WzFdID0gJnQtPmRpc3BsYXlQcmVzZW50RmVuY2U7Ci0gICAgdFNuYXBzaG90WzJdID0gJnQtPmRpc3BsYXlSZXRpcmVGZW5jZTsKLSAgICB0U25hcHNob3RbM10gPSAmdC0+cmVsZWFzZUZlbmNlOwotICAgIG5oLT5yZXNpemUoNCk7Ci0gICAgZm9yIChzaXplX3Qgc25hcHNob3RJbmRleCA9IDA7IHNuYXBzaG90SW5kZXggPCA0OyArK3NuYXBzaG90SW5kZXgpIHsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gdW5mbGF0dGVuKAotICAgICAgICAgICAgICAgIHRTbmFwc2hvdFtzbmFwc2hvdEluZGV4XSwgJigoKm5oKVtzbmFwc2hvdEluZGV4XSksCi0gICAgICAgICAgICAgICAgYnVmZmVyLCBzaXplLCBmZHMsIG51bUZkcyk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHdoaWxlIChzbmFwc2hvdEluZGV4ID4gMCkgewotICAgICAgICAgICAgICAgIC0tc25hcHNob3RJbmRleDsKLSAgICAgICAgICAgICAgICBpZiAoKCpuaClbc25hcHNob3RJbmRleF0gIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgoKm5oKVtzbmFwc2hvdEluZGV4XSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8qKgotICogXGJyaWVmIEZsYXR0ZW4gYEZyYW1lRXZlbnRzRGVsdGFgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBGcmFtZUV2ZW50c0RlbHRhYC4KLSAqIFxwYXJhbVtpbixvdXRdIGJ1ZmZlciBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gZmRzIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIG51bUZkcyBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccmV0dXJuIGBOT19FUlJPUmAgb24gc3VjY2Vzczsgb3RoZXIgdmFsdWUgb24gZmFpbHVyZS4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZHVwbGljYXRlIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluIFxwIHQuCi0gKi8KLS8vIFJlZjogZnJhbWV3b3Jrcy9uYXRpdmUvbGlicy9ndWkvRnJhbWVUaW1lc3RhbXAuY3BwOgotLy8gICAgICBGcmFtZUV2ZW50c0RlbHRhOjpmbGF0dGVuCi1pbmxpbmUgc3RhdHVzX3QgZmxhdHRlbihIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50c0RlbHRhIGNvbnN0JiB0LAotICAgICAgICB2b2lkKiYgYnVmZmVyLCBzaXplX3QmIHNpemUsIGludComIGZkcywgc2l6ZV90IG51bUZkcykgewotICAgIC8vIENoZWNrIHRoYXQgdC5pbmRleCBpcyB3aXRoaW4gYSB2YWxpZCByYW5nZS4KLSAgICBpZiAodC5pbmRleCA+PSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oRnJhbWVFdmVudEhpc3Rvcnk6Ok1BWF9GUkFNRV9ISVNUT1JZKQotICAgICAgICAgICAgfHwgdC5pbmRleCA+IHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDhfdD46Om1heCgpKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCB0LmZyYW1lTnVtYmVyKTsKLQotICAgIC8vIFRoZXNlIGFyZSBzdGF0aWNfY2FzdCB0byB1aW50OF90IGZvciBhbGlnbm1lbnQuCi0gICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCBzdGF0aWNfY2FzdDx1aW50OF90Pih0LmluZGV4KSk7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoCi0gICAgICAgICAgICBidWZmZXIsIHNpemUsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHQuYWRkUG9zdENvbXBvc2l0ZUNhbGxlZCkpOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKAotICAgICAgICAgICAgYnVmZmVyLCBzaXplLCBzdGF0aWNfY2FzdDx1aW50OF90Pih0LmFkZFJldGlyZUNhbGxlZCkpOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKAotICAgICAgICAgICAgYnVmZmVyLCBzaXplLCBzdGF0aWNfY2FzdDx1aW50OF90Pih0LmFkZFJlbGVhc2VDYWxsZWQpKTsKLQotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgdC5wb3N0ZWRUaW1lTnMpOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgdC5yZXF1ZXN0ZWRQcmVzZW50VGltZU5zKTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsIHQubGF0Y2hUaW1lTnMpOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgdC5maXJzdFJlZnJlc2hTdGFydFRpbWVOcyk7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCB0Lmxhc3RSZWZyZXNoU3RhcnRUaW1lTnMpOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgdC5kZXF1ZXVlUmVhZHlUaW1lKTsKLQotICAgIC8vIEZlbmNlcwotICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZlbmNlVGltZVNuYXBzaG90IGNvbnN0KiB0U25hcHNob3RbNF07Ci0gICAgdFNuYXBzaG90WzBdID0gJnQuZ3B1Q29tcG9zaXRpb25Eb25lRmVuY2U7Ci0gICAgdFNuYXBzaG90WzFdID0gJnQuZGlzcGxheVByZXNlbnRGZW5jZTsKLSAgICB0U25hcHNob3RbMl0gPSAmdC5kaXNwbGF5UmV0aXJlRmVuY2U7Ci0gICAgdFNuYXBzaG90WzNdID0gJnQucmVsZWFzZUZlbmNlOwotICAgIGZvciAoc2l6ZV90IHNuYXBzaG90SW5kZXggPSAwOyBzbmFwc2hvdEluZGV4IDwgNDsgKytzbmFwc2hvdEluZGV4KSB7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGZsYXR0ZW4oCi0gICAgICAgICAgICAgICAgKih0U25hcHNob3Rbc25hcHNob3RJbmRleF0pLCBidWZmZXIsIHNpemUsIGZkcywgbnVtRmRzKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8vIFJlZjogZnJhbWV3b3Jrcy9uYXRpdmUvbGlicy9ndWkvRnJhbWVUaW1lc3RhbXBzLmNwcDogRnJhbWVFdmVudEhpc3RvcnlEZWx0YQotCi0vKioKLSAqIFxicmllZiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIG5vbi1mZCBidWZmZXIgcmVxdWlyZWQgdG8gZmxhdHRlbgotICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgotICogXHJldHVybiBUaGUgcmVxdWlyZWQgc2l6ZSBvZiB0aGUgZmxhdCBidWZmZXIuCi0gKi8KLWlubGluZSBzaXplX3QgZ2V0RmxhdHRlbmVkU2l6ZSgKLSAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YSBjb25zdCYgdCkgewotICAgIHNpemVfdCBzaXplID0gNCArIC8vIG1EZWx0YXMuc2l6ZSgpCi0gICAgICAgICAgICBzaXplb2YodC5jb21wb3NpdG9yVGltaW5nKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHQuZGVsdGFzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIHNpemUgKz0gZ2V0RmxhdHRlbmVkU2l6ZSh0LmRlbHRhc1tpXSk7Ci0gICAgfQotICAgIHJldHVybiBzaXplOwotfQotCi0vKioKLSAqIFxicmllZiBSZXR1cm4gdGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbgotICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgotICogXHJldHVybiBUaGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluIFxwIHQuCi0gKi8KLWlubGluZSBzaXplX3QgZ2V0RmRDb3VudCgKLSAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YSBjb25zdCYgdCkgewotICAgIHNpemVfdCBudW1GZHMgPSAwOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdC5kZWx0YXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgbnVtRmRzICs9IGdldEZkQ291bnQodC5kZWx0YXNbaV0pOwotICAgIH0KLSAgICByZXR1cm4gbnVtRmRzOwotfQotCi0vKioKLSAqIFxicmllZiBVbmZsYXR0ZW4gYEZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgotICoKLSAqIFxwYXJhbVtvdXRdIHQgVGhlIGRlc3RpbmF0aW9uIGBGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KLSAqIFxwYXJhbVtvdXRdIG5oIFRoZSB1bmRlcmx5aW5nIGFycmF5IG9mIGFycmF5cyBvZiBuYXRpdmUgaGFuZGxlcy4KLSAqIFxwYXJhbVtpbixvdXRdIGJ1ZmZlciBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gZmRzIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIG51bUZkcyBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccmV0dXJuIGBOT19FUlJPUmAgb24gc3VjY2Vzczsgb3RoZXIgdmFsdWUgb24gZmFpbHVyZS4KLSAqCi0gKiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIGBOT19FUlJPUmAsIFxwIG5oIHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggYG51bGxwdHJgIG9yCi0gKiBuZXdseSBjcmVhdGVkIGhhbmRsZXMuIFRoZSBzZWNvbmQgZGltZW5zaW9uIG9mIFxwIG5oIHdpbGwgYmUgNC4gRWFjaCBub24tbnVsbAotICogc2xvdCBpbiBccCBuaCB3aWxsIG5lZWQgdG8gYmUgZGVsZXRlZCBtYW51YWxseSB3aXRoIGBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpYC4KLSAqLwotaW5saW5lIHN0YXR1c190IHVuZmxhdHRlbigKLSAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YSogdCwKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4gPiogbmgsCi0gICAgICAgIHZvaWQgY29uc3QqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwgaW50IGNvbnN0KiYgZmRzLCBzaXplX3QmIG51bUZkcykgewotICAgIGlmIChzaXplIDwgNCkgewotICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgIH0KLQotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCB0LT5jb21wb3NpdG9yVGltaW5nKTsKLQotICAgIHVpbnQzMl90IGRlbHRhQ291bnQgPSAwOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCBkZWx0YUNvdW50KTsKLSAgICBpZiAoc3RhdGljX2Nhc3Q8c2l6ZV90PihkZWx0YUNvdW50KSA+Ci0gICAgICAgICAgICA6OmFuZHJvaWQ6OkZyYW1lRXZlbnRIaXN0b3J5OjpNQVhfRlJBTUVfSElTVE9SWSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICB0LT5kZWx0YXMucmVzaXplKGRlbHRhQ291bnQpOwotICAgIG5oLT5yZXNpemUoZGVsdGFDb3VudCk7Ci0gICAgZm9yIChzaXplX3QgZGVsdGFJbmRleCA9IDA7IGRlbHRhSW5kZXggPCBkZWx0YUNvdW50OyArK2RlbHRhSW5kZXgpIHsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gdW5mbGF0dGVuKAotICAgICAgICAgICAgICAgICYodC0+ZGVsdGFzW2RlbHRhSW5kZXhdKSwgJigoKm5oKVtkZWx0YUluZGV4XSksCi0gICAgICAgICAgICAgICAgYnVmZmVyLCBzaXplLCBmZHMsIG51bUZkcyk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vKioKLSAqIFxicmllZiBGbGF0dGVuIGBGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgRnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCi0gKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIGZkcyBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBudW1GZHMgVGhlIHNpemUgb2YgdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCi0gKgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGR1cGxpY2F0ZSBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbiBccCB0LgotICovCi1pbmxpbmUgc3RhdHVzX3QgZmxhdHRlbigKLSAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YSBjb25zdCYgdCwKLSAgICAgICAgdm9pZComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLCBpbnQqJiBmZHMsIHNpemVfdCYgbnVtRmRzKSB7Ci0gICAgaWYgKHQuZGVsdGFzLnNpemUoKSA+IDo6YW5kcm9pZDo6RnJhbWVFdmVudEhpc3Rvcnk6Ok1BWF9GUkFNRV9ISVNUT1JZKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIGlmIChzaXplIDwgZ2V0RmxhdHRlbmVkU2l6ZSh0KSkgewotICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgIH0KLQotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgdC5jb21wb3NpdG9yVGltaW5nKTsKLQotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHQuZGVsdGFzLnNpemUoKSkpOwotICAgIGZvciAoc2l6ZV90IGRlbHRhSW5kZXggPSAwOyBkZWx0YUluZGV4IDwgdC5kZWx0YXMuc2l6ZSgpOyArK2RlbHRhSW5kZXgpIHsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZmxhdHRlbih0LmRlbHRhc1tkZWx0YUluZGV4XSwgYnVmZmVyLCBzaXplLCBmZHMsIG51bUZkcyk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vKioKLSAqIFxicmllZiBXcmFwIGA6OmFuZHJvaWQ6OkZyYW1lRXZlbnRIaXN0b3J5RGF0YWAgaW4KLSAqIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KLSAqCi0gKiBccGFyYW1bb3V0XSB0IFRoZSB3cmFwcGVyIG9mIHR5cGUKLSAqIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KLSAqIFxwYXJhbVtvdXRdIG5oIFRoZSBhcnJheSBvZiBhcnJheSBvZiBuYXRpdmUgaGFuZGxlcyB0aGF0IGFyZSByZWZlcnJlZCB0byBieQotICogbWVtYmVycyBvZiBccCB0LgotICogXHBhcmFtW2luXSBsIFRoZSBzb3VyY2UgYDo6YW5kcm9pZDo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCi0gKgotICogT24gc3VjY2VzcywgZWFjaCBtZW1iZXIgb2YgXHAgbmggd2lsbCBiZSBlaXRoZXIgYG51bGxwdHJgIG9yIGEgbmV3bHkgY3JlYXRlZAotICogbmF0aXZlIGhhbmRsZS4gQWxsIHRoZSBub24tYG51bGxwdHJgIGVsZW1lbnRzIG11c3QgYmUgZGVsZXRlZCBpbmRpdmlkdWFsbHkKLSAqIHdpdGggYG5hdGl2ZV9oYW5kbGVfZGVsZXRlKClgLgotICovCi1pbmxpbmUgYm9vbCB3cmFwQXMoSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YSogdCwKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4gPiogbmgsCi0gICAgICAgIDo6YW5kcm9pZDo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YSBjb25zdCYgbCkgewotCi0gICAgc2l6ZV90IGNvbnN0IGJhc2VTaXplID0gbC5nZXRGbGF0dGVuZWRTaXplKCk7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gYmFzZUJ1ZmZlcigKLSAgICAgICAgICAgIG5ldyAoc3RkOjpub3Rocm93KSB1aW50OF90W2Jhc2VTaXplXSk7Ci0gICAgaWYgKCFiYXNlQnVmZmVyKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBzaXplX3QgY29uc3QgYmFzZU51bUZkcyA9IGwuZ2V0RmRDb3VudCgpOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxpbnRbXT4gYmFzZUZkcygKLSAgICAgICAgICAgIG5ldyAoc3RkOjpub3Rocm93KSBpbnRbYmFzZU51bUZkc10pOwotICAgIGlmICghYmFzZUZkcykgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdm9pZCogYnVmZmVyID0gc3RhdGljX2Nhc3Q8dm9pZCo+KGJhc2VCdWZmZXIuZ2V0KCkpOwotICAgIHNpemVfdCBzaXplID0gYmFzZVNpemU7Ci0gICAgaW50KiBmZHMgPSBiYXNlRmRzLmdldCgpOwotICAgIHNpemVfdCBudW1GZHMgPSBiYXNlTnVtRmRzOwotICAgIGlmIChsLmZsYXR0ZW4oYnVmZmVyLCBzaXplLCBmZHMsIG51bUZkcykgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHZvaWQgY29uc3QqIGNvbnN0QnVmZmVyID0gc3RhdGljX2Nhc3Q8dm9pZCBjb25zdCo+KGJhc2VCdWZmZXIuZ2V0KCkpOwotICAgIHNpemUgPSBiYXNlU2l6ZTsKLSAgICBpbnQgY29uc3QqIGNvbnN0RmRzID0gc3RhdGljX2Nhc3Q8aW50IGNvbnN0Kj4oYmFzZUZkcy5nZXQoKSk7Ci0gICAgbnVtRmRzID0gYmFzZU51bUZkczsKLSAgICBpZiAodW5mbGF0dGVuKHQsIG5oLCBjb25zdEJ1ZmZlciwgc2l6ZSwgY29uc3RGZHMsIG51bUZkcykgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi0vKioKLSAqIFxicmllZiBDb252ZXJ0IGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhYCB0bwotICogYDo6YW5kcm9pZDo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCi0gKgotICogXHBhcmFtW291dF0gbCBUaGUgZGVzdGluYXRpb24gYDo6YW5kcm9pZDo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCi0gKgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGR1cGxpY2F0ZSBhbGwgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4gXHAgdC4KLSAqLwotaW5saW5lIGJvb2wgY29udmVydFRvKAotICAgICAgICA6OmFuZHJvaWQ6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGEqIGwsCi0gICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGEgY29uc3QmIHQpIHsKLQotICAgIHNpemVfdCBjb25zdCBiYXNlU2l6ZSA9IGdldEZsYXR0ZW5lZFNpemUodCk7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gYmFzZUJ1ZmZlcigKLSAgICAgICAgICAgIG5ldyAoc3RkOjpub3Rocm93KSB1aW50OF90W2Jhc2VTaXplXSk7Ci0gICAgaWYgKCFiYXNlQnVmZmVyKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBzaXplX3QgY29uc3QgYmFzZU51bUZkcyA9IGdldEZkQ291bnQodCk7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPGludFtdPiBiYXNlRmRzKAotICAgICAgICAgICAgbmV3IChzdGQ6Om5vdGhyb3cpIGludFtiYXNlTnVtRmRzXSk7Ci0gICAgaWYgKCFiYXNlRmRzKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2b2lkKiBidWZmZXIgPSBzdGF0aWNfY2FzdDx2b2lkKj4oYmFzZUJ1ZmZlci5nZXQoKSk7Ci0gICAgc2l6ZV90IHNpemUgPSBiYXNlU2l6ZTsKLSAgICBpbnQqIGZkcyA9IHN0YXRpY19jYXN0PGludCo+KGJhc2VGZHMuZ2V0KCkpOwotICAgIHNpemVfdCBudW1GZHMgPSBiYXNlTnVtRmRzOwotICAgIGlmIChmbGF0dGVuKHQsIGJ1ZmZlciwgc2l6ZSwgZmRzLCBudW1GZHMpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2b2lkIGNvbnN0KiBjb25zdEJ1ZmZlciA9IHN0YXRpY19jYXN0PHZvaWQgY29uc3QqPihiYXNlQnVmZmVyLmdldCgpKTsKLSAgICBzaXplID0gYmFzZVNpemU7Ci0gICAgaW50IGNvbnN0KiBjb25zdEZkcyA9IHN0YXRpY19jYXN0PGludCBjb25zdCo+KGJhc2VGZHMuZ2V0KCkpOwotICAgIG51bUZkcyA9IGJhc2VOdW1GZHM7Ci0gICAgaWYgKGwtPnVuZmxhdHRlbihjb25zdEJ1ZmZlciwgc2l6ZSwgY29uc3RGZHMsIG51bUZkcykgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi0vLyBSZWY6IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvdWkvUmVnaW9uLmNwcAotCi0vKioKLSAqIFxicmllZiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciByZXF1aXJlZCB0byBmbGF0dGVuIGBSZWdpb25gLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYFJlZ2lvbmAuCi0gKiBccmV0dXJuIFRoZSByZXF1aXJlZCBzaXplIG9mIHRoZSBmbGF0IGJ1ZmZlci4KLSAqLwotaW5saW5lIHNpemVfdCBnZXRGbGF0dGVuZWRTaXplKFJlZ2lvbiBjb25zdCYgdCkgewotICAgIHJldHVybiBzaXplb2YodWludDMyX3QpICsgdC5zaXplKCkgKiBzaXplb2YoOjphbmRyb2lkOjpSZWN0KTsKLX0KLQotLyoqCi0gKiBcYnJpZWYgVW5mbGF0dGVuIGBSZWdpb25gLgotICoKLSAqIFxwYXJhbVtvdXRdIHQgVGhlIGRlc3RpbmF0aW9uIGBSZWdpb25gLgotICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgYnVmZmVyLgotICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCi0gKi8KLWlubGluZSBzdGF0dXNfdCB1bmZsYXR0ZW4oUmVnaW9uKiB0LCB2b2lkIGNvbnN0KiYgYnVmZmVyLCBzaXplX3QmIHNpemUpIHsKLSAgICBpZiAoc2l6ZSA8IHNpemVvZih1aW50MzJfdCkpIHsKLSAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBudW1SZWN0cyA9IDA7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIG51bVJlY3RzKTsKLSAgICBpZiAoc2l6ZSA8IG51bVJlY3RzICogc2l6ZW9mKFJlY3QpKSB7Ci0gICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgfQotICAgIGlmIChudW1SZWN0cyA+IChVSU5UMzJfTUFYIC8gc2l6ZW9mKFJlY3QpKSkgewotICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgIH0KLQotICAgIHQtPnJlc2l6ZShudW1SZWN0cyk7Ci0gICAgZm9yIChzaXplX3QgciA9IDA7IHIgPCBudW1SZWN0czsgKytyKSB7Ci0gICAgICAgIDo6YW5kcm9pZDo6UmVjdCByZWN0KDo6YW5kcm9pZDo6UmVjdDo6RU1QVFlfUkVDVCk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlY3QudW5mbGF0dGVuKGJ1ZmZlciwgc2l6ZSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgRmxhdHRlbmFibGVVdGlsczo6YWR2YW5jZShidWZmZXIsIHNpemUsIHNpemVvZihyZWN0KSk7Ci0gICAgICAgICgqdClbcl0gPSBSZWN0ewotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHJlY3QubGVmdCksCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVjdC50b3ApLAotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHJlY3QucmlnaHQpLAotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHJlY3QuYm90dG9tKX07Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLyoqCi0gKiBcYnJpZWYgRmxhdHRlbiBgUmVnaW9uYC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgUmVnaW9uYC4KLSAqIFxwYXJhbVtpbixvdXRdIGJ1ZmZlciBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IGJ1ZmZlci4KLSAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgotICovCi1pbmxpbmUgc3RhdHVzX3QgZmxhdHRlbihSZWdpb24gY29uc3QmIHQsIHZvaWQqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSkgewotICAgIGlmIChzaXplIDwgZ2V0RmxhdHRlbmVkU2l6ZSh0KSkgewotICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgIH0KLQotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHQuc2l6ZSgpKSk7Ci0gICAgZm9yIChzaXplX3QgciA9IDA7IHIgPCB0LnNpemUoKTsgKytyKSB7Ci0gICAgICAgIDo6YW5kcm9pZDo6UmVjdCByZWN0KAotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHRbcl0ubGVmdCksCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4odFtyXS50b3ApLAotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHRbcl0ucmlnaHQpLAotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHRbcl0uYm90dG9tKSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlY3QuZmxhdHRlbihidWZmZXIsIHNpemUpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIEZsYXR0ZW5hYmxlVXRpbHM6OmFkdmFuY2UoYnVmZmVyLCBzaXplLCBzaXplb2YocmVjdCkpOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8qKgotICogXGJyaWVmIENvbnZlcnQgYDo6YW5kcm9pZDo6UmVnaW9uYCB0byBgUmVnaW9uYC4KLSAqCi0gKiBccGFyYW1bb3V0XSB0IFRoZSBkZXN0aW5hdGlvbiBgUmVnaW9uYC4KLSAqIFxwYXJhbVtpbl0gbCBUaGUgc291cmNlIGA6OmFuZHJvaWQ6OlJlZ2lvbmAuCi0gKi8KLS8vIGNvbnZlcnQ6IDo6YW5kcm9pZDo6UmVnaW9uIC0+IFJlZ2lvbgotaW5saW5lIGJvb2wgY29udmVydFRvKFJlZ2lvbiogdCwgOjphbmRyb2lkOjpSZWdpb24gY29uc3QmIGwpIHsKLSAgICBzaXplX3QgY29uc3QgYmFzZVNpemUgPSBsLmdldEZsYXR0ZW5lZFNpemUoKTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBiYXNlQnVmZmVyKAotICAgICAgICAgICAgbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQ4X3RbYmFzZVNpemVdKTsKLSAgICBpZiAoIWJhc2VCdWZmZXIpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHZvaWQqIGJ1ZmZlciA9IHN0YXRpY19jYXN0PHZvaWQqPihiYXNlQnVmZmVyLmdldCgpKTsKLSAgICBzaXplX3Qgc2l6ZSA9IGJhc2VTaXplOwotICAgIGlmIChsLmZsYXR0ZW4oYnVmZmVyLCBzaXplKSAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdm9pZCBjb25zdCogY29uc3RCdWZmZXIgPSBzdGF0aWNfY2FzdDx2b2lkIGNvbnN0Kj4oYmFzZUJ1ZmZlci5nZXQoKSk7Ci0gICAgc2l6ZSA9IGJhc2VTaXplOwotICAgIGlmICh1bmZsYXR0ZW4odCwgY29uc3RCdWZmZXIsIHNpemUpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqCi0gKiBcYnJpZWYgQ29udmVydCBgUmVnaW9uYCB0byBgOjphbmRyb2lkOjpSZWdpb25gLgotICoKLSAqIFxwYXJhbVtvdXRdIGwgVGhlIGRlc3RpbmF0aW9uIGA6OmFuZHJvaWQ6OlJlZ2lvbmAuCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgUmVnaW9uYC4KLSAqLwotLy8gY29udmVydDogUmVnaW9uIC0+IDo6YW5kcm9pZDo6UmVnaW9uCi1pbmxpbmUgYm9vbCBjb252ZXJ0VG8oOjphbmRyb2lkOjpSZWdpb24qIGwsIFJlZ2lvbiBjb25zdCYgdCkgewotICAgIHNpemVfdCBjb25zdCBiYXNlU2l6ZSA9IGdldEZsYXR0ZW5lZFNpemUodCk7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gYmFzZUJ1ZmZlcigKLSAgICAgICAgICAgIG5ldyAoc3RkOjpub3Rocm93KSB1aW50OF90W2Jhc2VTaXplXSk7Ci0gICAgaWYgKCFiYXNlQnVmZmVyKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2b2lkKiBidWZmZXIgPSBzdGF0aWNfY2FzdDx2b2lkKj4oYmFzZUJ1ZmZlci5nZXQoKSk7Ci0gICAgc2l6ZV90IHNpemUgPSBiYXNlU2l6ZTsKLSAgICBpZiAoZmxhdHRlbih0LCBidWZmZXIsIHNpemUpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2b2lkIGNvbnN0KiBjb25zdEJ1ZmZlciA9IHN0YXRpY19jYXN0PHZvaWQgY29uc3QqPihiYXNlQnVmZmVyLmdldCgpKTsKLSAgICBzaXplID0gYmFzZVNpemU7Ci0gICAgaWYgKGwtPnVuZmxhdHRlbihjb25zdEJ1ZmZlciwgc2l6ZSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi0vLyBSZWY6IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvZ3VpL0JHcmFwaGljQnVmZmVyUHJvZHVjZXIuY3BwOgotLy8gICAgICBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0Ci0KLS8qKgotICogXGJyaWVmIFJldHVybiBhIGxvd2VyIGJvdW5kIG9uIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgcmVxdWlyZWQgdG8gZmxhdHRlbgotICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgotICogXHJldHVybiBBIGxvd2VyIGJvdW5kIG9uIHRoZSBzaXplIG9mIHRoZSBmbGF0IGJ1ZmZlci4KLSAqLwotY29uc3RleHByIHNpemVfdCBtaW5GbGF0dGVuZWRTaXplKAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0IGNvbnN0JiAvKiB0ICovKSB7Ci0gICAgcmV0dXJuIHNpemVvZihpbnQ2NF90KSArIC8vIHRpbWVzdGFtcAotICAgICAgICAgICAgc2l6ZW9mKGludCkgKyAvLyBpc0F1dG9UaW1lc3RhbXAKLSAgICAgICAgICAgIHNpemVvZihhbmRyb2lkX2RhdGFzcGFjZSkgKyAvLyBkYXRhU3BhY2UKLSAgICAgICAgICAgIHNpemVvZig6OmFuZHJvaWQ6OlJlY3QpICsgLy8gY3JvcAotICAgICAgICAgICAgc2l6ZW9mKGludCkgKyAvLyBzY2FsaW5nTW9kZQotICAgICAgICAgICAgc2l6ZW9mKHVpbnQzMl90KSArIC8vIHRyYW5zZm9ybQotICAgICAgICAgICAgc2l6ZW9mKHVpbnQzMl90KSArIC8vIHN0aWNreVRyYW5zZm9ybQotICAgICAgICAgICAgc2l6ZW9mKGJvb2wpOyAvLyBnZXRGcmFtZVRpbWVzdGFtcHMKLX0KLQotLyoqCi0gKiBcYnJpZWYgUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgcmVxdWlyZWQgdG8gZmxhdHRlbgotICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgotICogXHJldHVybiBUaGUgcmVxdWlyZWQgc2l6ZSBvZiB0aGUgZmxhdCBidWZmZXIuCi0gKi8KLWlubGluZSBzaXplX3QgZ2V0RmxhdHRlbmVkU2l6ZShIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0IGNvbnN0JiB0KSB7Ci0gICAgcmV0dXJuIG1pbkZsYXR0ZW5lZFNpemUodCkgKwotICAgICAgICAgICAgZ2V0RmVuY2VGbGF0dGVuZWRTaXplKHQuZmVuY2UpICsKLSAgICAgICAgICAgIGdldEZsYXR0ZW5lZFNpemUodC5zdXJmYWNlRGFtYWdlKTsKLX0KLQotLyoqCi0gKiBcYnJpZWYgUmV0dXJuIHRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4KLSAqIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIGlucHV0IGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KLSAqIFxyZXR1cm4gVGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbiBccCB0LgotICovCi1pbmxpbmUgc2l6ZV90IGdldEZkQ291bnQoCi0gICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQgY29uc3QmIHQpIHsKLSAgICByZXR1cm4gZ2V0RmVuY2VGZENvdW50KHQuZmVuY2UpOwotfQotCi0vKioKLSAqIFxicmllZiBGbGF0dGVuIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCi0gKiBccGFyYW1bb3V0XSBuaCBUaGUgbmF0aXZlIGhhbmRsZSBjbG9uZWQgZnJvbSBgdC5mZW5jZWAuCi0gKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIGZkcyBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBudW1GZHMgVGhlIHNpemUgb2YgdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCi0gKgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGR1cGxpY2F0ZSB0aGUgZmlsZSBkZXNjcmlwdG9yIGluIGB0LmZlbmNlYC4gKi8KLWlubGluZSBzdGF0dXNfdCBmbGF0dGVuKEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQgY29uc3QmIHQsCi0gICAgICAgIG5hdGl2ZV9oYW5kbGVfdCoqIG5oLAotICAgICAgICB2b2lkKiYgYnVmZmVyLCBzaXplX3QmIHNpemUsIGludComIGZkcywgc2l6ZV90JiBudW1GZHMpIHsKLSAgICBpZiAoc2l6ZSA8IGdldEZsYXR0ZW5lZFNpemUodCkpIHsKLSAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICB9Ci0KLSAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsIHQudGltZXN0YW1wKTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsIHN0YXRpY19jYXN0PGludD4odC5pc0F1dG9UaW1lc3RhbXApKTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxhbmRyb2lkX2RhdGFzcGFjZV90Pih0LmRhdGFTcGFjZSkpOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgOjphbmRyb2lkOjpSZWN0KAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4odC5jcm9wLmxlZnQpLAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4odC5jcm9wLnRvcCksCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90Pih0LmNyb3AucmlnaHQpLAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4odC5jcm9wLmJvdHRvbSkpKTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsIHN0YXRpY19jYXN0PGludD4odC5zY2FsaW5nTW9kZSkpOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgdC50cmFuc2Zvcm0pOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgdC5zdGlja3lUcmFuc2Zvcm0pOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgdC5nZXRGcmFtZVRpbWVzdGFtcHMpOwotCi0gICAgKm5oID0gdC5mZW5jZS5nZXROYXRpdmVIYW5kbGUoKSA9PSBudWxscHRyID8KLSAgICAgICAgICAgIG51bGxwdHIgOiBuYXRpdmVfaGFuZGxlX2Nsb25lKHQuZmVuY2UpOwotICAgIHN0YXR1c190IHN0YXR1cyA9IGZsYXR0ZW5GZW5jZShoaWRsX2hhbmRsZSgqbmgpLCBidWZmZXIsIHNpemUsIGZkcywgbnVtRmRzKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIHJldHVybiBmbGF0dGVuKHQuc3VyZmFjZURhbWFnZSwgYnVmZmVyLCBzaXplKTsKLX0KLQotLyoqCi0gKiBcYnJpZWYgVW5mbGF0dGVuIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KLSAqCi0gKiBccGFyYW1bb3V0XSB0IFRoZSBkZXN0aW5hdGlvbiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCi0gKiBccGFyYW1bb3V0XSBuaCBUaGUgdW5kZXJseWluZyBuYXRpdmUgaGFuZGxlIGZvciBgdC0+ZmVuY2VgLgotICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBmZHMgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gbnVtRmRzIFRoZSBzaXplIG9mIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgotICoKLSAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgYE5PX0VSUk9SYCBhbmQgYHQtPmZlbmNlYCBjb250YWlucyBhIHZhbGlkIGZpbGUKLSAqIGRlc2NyaXB0b3IsIFxwIG5oIHdpbGwgYmUgYSBuZXdseSBjcmVhdGVkIG5hdGl2ZSBoYW5kbGUgaG9sZGluZyB0aGF0IGZpbGUKLSAqIGRlc2NyaXB0b3IuIFxwIG5oIG5lZWRzIHRvIGJlIGRlbGV0ZWQgd2l0aCBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAKLSAqIGFmdGVyd2FyZHMuCi0gKi8KLWlubGluZSBzdGF0dXNfdCB1bmZsYXR0ZW4oCi0gICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQqIHQsIG5hdGl2ZV9oYW5kbGVfdCoqIG5oLAotICAgICAgICB2b2lkIGNvbnN0KiYgYnVmZmVyLCBzaXplX3QmIHNpemUsIGludCBjb25zdComIGZkcywgc2l6ZV90JiBudW1GZHMpIHsKLSAgICBpZiAoc2l6ZSA8IG1pbkZsYXR0ZW5lZFNpemUoKnQpKSB7Ci0gICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgfQotCi0gICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIHQtPnRpbWVzdGFtcCk7Ci0gICAgaW50IGxJc0F1dG9UaW1lc3RhbXA7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIGxJc0F1dG9UaW1lc3RhbXApOwotICAgIHQtPmlzQXV0b1RpbWVzdGFtcCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGxJc0F1dG9UaW1lc3RhbXApOwotICAgIGFuZHJvaWRfZGF0YXNwYWNlX3QgbERhdGFTcGFjZTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgbERhdGFTcGFjZSk7Ci0gICAgdC0+ZGF0YVNwYWNlID0gc3RhdGljX2Nhc3Q8RGF0YXNwYWNlPihsRGF0YVNwYWNlKTsKLSAgICBSZWN0IGxDcm9wOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCBsQ3JvcCk7Ci0gICAgdC0+Y3JvcCA9IFJlY3R7Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihsQ3JvcC5sZWZ0KSwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGxDcm9wLnRvcCksCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihsQ3JvcC5yaWdodCksCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihsQ3JvcC5ib3R0b20pfTsKLSAgICBpbnQgbFNjYWxpbmdNb2RlOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCBsU2NhbGluZ01vZGUpOwotICAgIHQtPnNjYWxpbmdNb2RlID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4obFNjYWxpbmdNb2RlKTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgdC0+dHJhbnNmb3JtKTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgdC0+c3RpY2t5VHJhbnNmb3JtKTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgdC0+Z2V0RnJhbWVUaW1lc3RhbXBzKTsKLQotICAgIHN0YXR1c190IHN0YXR1cyA9IHVuZmxhdHRlbkZlbmNlKCYodC0+ZmVuY2UpLCBuaCwKLSAgICAgICAgICAgIGJ1ZmZlciwgc2l6ZSwgZmRzLCBudW1GZHMpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgcmV0dXJuIHVuZmxhdHRlbigmKHQtPnN1cmZhY2VEYW1hZ2UpLCBidWZmZXIsIHNpemUpOwotfQotCi0vKioKLSAqIFxicmllZiBXcmFwIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YCBpbgotICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgotICoKLSAqIFxwYXJhbVtvdXRdIHQgVGhlIHdyYXBwZXIgb2YgdHlwZQotICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgotICogXHBhcmFtW291dF0gbmggVGhlIHVuZGVybHlpbmcgbmF0aXZlIGhhbmRsZSBmb3IgYHQtPmZlbmNlYC4KLSAqIFxwYXJhbVtpbl0gbCBUaGUgc291cmNlIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KLSAqCi0gKiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIGB0cnVlYCBhbmQgYHQtPmZlbmNlYCBjb250YWlucyBhIHZhbGlkIGZpbGUKLSAqIGRlc2NyaXB0b3IsIFxwIG5oIHdpbGwgYmUgYSBuZXdseSBjcmVhdGVkIG5hdGl2ZSBoYW5kbGUgaG9sZGluZyB0aGF0IGZpbGUKLSAqIGRlc2NyaXB0b3IuIFxwIG5oIG5lZWRzIHRvIGJlIGRlbGV0ZWQgd2l0aCBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAKLSAqIGFmdGVyd2FyZHMuCi0gKi8KLWlubGluZSBib29sIHdyYXBBcygKLSAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCogdCwKLSAgICAgICAgbmF0aXZlX2hhbmRsZV90KiogbmgsCi0gICAgICAgIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQgY29uc3QmIGwpIHsKLQotICAgIHNpemVfdCBjb25zdCBiYXNlU2l6ZSA9IGwuZ2V0RmxhdHRlbmVkU2l6ZSgpOwotICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IGJhc2VCdWZmZXIoCi0gICAgICAgICAgICBuZXcgKHN0ZDo6bm90aHJvdykgdWludDhfdFtiYXNlU2l6ZV0pOwotICAgIGlmICghYmFzZUJ1ZmZlcikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgc2l6ZV90IGNvbnN0IGJhc2VOdW1GZHMgPSBsLmdldEZkQ291bnQoKTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8aW50W10+IGJhc2VGZHMoCi0gICAgICAgICAgICBuZXcgKHN0ZDo6bm90aHJvdykgaW50W2Jhc2VOdW1GZHNdKTsKLSAgICBpZiAoIWJhc2VGZHMpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHZvaWQqIGJ1ZmZlciA9IHN0YXRpY19jYXN0PHZvaWQqPihiYXNlQnVmZmVyLmdldCgpKTsKLSAgICBzaXplX3Qgc2l6ZSA9IGJhc2VTaXplOwotICAgIGludCogZmRzID0gYmFzZUZkcy5nZXQoKTsKLSAgICBzaXplX3QgbnVtRmRzID0gYmFzZU51bUZkczsKLSAgICBpZiAobC5mbGF0dGVuKGJ1ZmZlciwgc2l6ZSwgZmRzLCBudW1GZHMpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2b2lkIGNvbnN0KiBjb25zdEJ1ZmZlciA9IHN0YXRpY19jYXN0PHZvaWQgY29uc3QqPihiYXNlQnVmZmVyLmdldCgpKTsKLSAgICBzaXplID0gYmFzZVNpemU7Ci0gICAgaW50IGNvbnN0KiBjb25zdEZkcyA9IHN0YXRpY19jYXN0PGludCBjb25zdCo+KGJhc2VGZHMuZ2V0KCkpOwotICAgIG51bUZkcyA9IGJhc2VOdW1GZHM7Ci0gICAgaWYgKHVuZmxhdHRlbih0LCBuaCwgY29uc3RCdWZmZXIsIHNpemUsIGNvbnN0RmRzLCBudW1GZHMpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqCi0gKiBcYnJpZWYgQ29udmVydCBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAgdG8KLSAqIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KLSAqCi0gKiBccGFyYW1bb3V0XSBsIFRoZSBkZXN0aW5hdGlvbiBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCi0gKgotICogSWYgYHQuZmVuY2VgIGhhcyBhIHZhbGlkIGZpbGUgZGVzY3JpcHRvciwgaXQgd2lsbCBiZSBkdXBsaWNhdGVkLgotICovCi1pbmxpbmUgYm9vbCBjb252ZXJ0VG8oCi0gICAgICAgIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQqIGwsCi0gICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQgY29uc3QmIHQpIHsKLQotICAgIHNpemVfdCBjb25zdCBiYXNlU2l6ZSA9IGdldEZsYXR0ZW5lZFNpemUodCk7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gYmFzZUJ1ZmZlcigKLSAgICAgICAgICAgIG5ldyAoc3RkOjpub3Rocm93KSB1aW50OF90W2Jhc2VTaXplXSk7Ci0gICAgaWYgKCFiYXNlQnVmZmVyKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBzaXplX3QgY29uc3QgYmFzZU51bUZkcyA9IGdldEZkQ291bnQodCk7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPGludFtdPiBiYXNlRmRzKAotICAgICAgICAgICAgbmV3IChzdGQ6Om5vdGhyb3cpIGludFtiYXNlTnVtRmRzXSk7Ci0gICAgaWYgKCFiYXNlRmRzKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2b2lkKiBidWZmZXIgPSBzdGF0aWNfY2FzdDx2b2lkKj4oYmFzZUJ1ZmZlci5nZXQoKSk7Ci0gICAgc2l6ZV90IHNpemUgPSBiYXNlU2l6ZTsKLSAgICBpbnQqIGZkcyA9IGJhc2VGZHMuZ2V0KCk7Ci0gICAgc2l6ZV90IG51bUZkcyA9IGJhc2VOdW1GZHM7Ci0gICAgbmF0aXZlX2hhbmRsZV90KiBuaDsKLSAgICBpZiAoZmxhdHRlbih0LCAmbmgsIGJ1ZmZlciwgc2l6ZSwgZmRzLCBudW1GZHMpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2b2lkIGNvbnN0KiBjb25zdEJ1ZmZlciA9IHN0YXRpY19jYXN0PHZvaWQgY29uc3QqPihiYXNlQnVmZmVyLmdldCgpKTsKLSAgICBzaXplID0gYmFzZVNpemU7Ci0gICAgaW50IGNvbnN0KiBjb25zdEZkcyA9IHN0YXRpY19jYXN0PGludCBjb25zdCo+KGJhc2VGZHMuZ2V0KCkpOwotICAgIG51bUZkcyA9IGJhc2VOdW1GZHM7Ci0gICAgaWYgKGwtPnVuZmxhdHRlbihjb25zdEJ1ZmZlciwgc2l6ZSwgY29uc3RGZHMsIG51bUZkcykgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgaWYgKG5oICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UobmgpOwotICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobmgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShuaCk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIFJlZjogZnJhbWV3b3Jrcy9uYXRpdmUvbGlicy9ndWkvQkdyYXBoaWNCdWZmZXJQcm9kdWNlci5jcHA6Ci0vLyAgICAgIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0Ci0KLS8qKgotICogXGJyaWVmIFdyYXAgYEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0YCBpbgotICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0YC4KLSAqCi0gKiBccGFyYW1bb3V0XSB0IFRoZSB3cmFwcGVyIG9mIHR5cGUKLSAqIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dGAuCi0gKiBccGFyYW1bb3V0XSBuaCBUaGUgYXJyYXkgb2YgYXJyYXkgb2YgbmF0aXZlIGhhbmRsZXMgdGhhdCBhcmUgcmVmZXJyZWQgdG8gYnkKLSAqIG1lbWJlcnMgb2YgXHAgdC4KLSAqIFxwYXJhbVtpbl0gbCBUaGUgc291cmNlIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dGAuCi0gKgotICogT24gc3VjY2VzcywgZWFjaCBtZW1iZXIgb2YgXHAgbmggd2lsbCBiZSBlaXRoZXIgYG51bGxwdHJgIG9yIGEgbmV3bHkgY3JlYXRlZAotICogbmF0aXZlIGhhbmRsZS4gQWxsIHRoZSBub24tYG51bGxwdHJgIGVsZW1lbnRzIG11c3QgYmUgZGVsZXRlZCBpbmRpdmlkdWFsbHkKLSAqIHdpdGggYG5hdGl2ZV9oYW5kbGVfZGVsZXRlKClgLgotICovCi0vLyB3cmFwOiBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dCAtPgotLy8gSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQKLWlubGluZSBib29sIHdyYXBBcyhIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dCogdCwKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4gPiogbmgsCi0gICAgICAgIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0IGNvbnN0JiBsKSB7Ci0gICAgaWYgKCF3cmFwQXMoJih0LT5mcmFtZVRpbWVzdGFtcHMpLCBuaCwgbC5mcmFtZVRpbWVzdGFtcHMpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgdC0+d2lkdGggPSBsLndpZHRoOwotICAgIHQtPmhlaWdodCA9IGwuaGVpZ2h0OwotICAgIHQtPnRyYW5zZm9ybUhpbnQgPSBsLnRyYW5zZm9ybUhpbnQ7Ci0gICAgdC0+bnVtUGVuZGluZ0J1ZmZlcnMgPSBsLm51bVBlbmRpbmdCdWZmZXJzOwotICAgIHQtPm5leHRGcmFtZU51bWJlciA9IGwubmV4dEZyYW1lTnVtYmVyOwotICAgIHQtPmJ1ZmZlclJlcGxhY2VkID0gbC5idWZmZXJSZXBsYWNlZDsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqCi0gKiBcYnJpZWYgQ29udmVydCBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXRgIHRvCi0gKiBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXRgLgotICoKLSAqIFxwYXJhbVtvdXRdIGwgVGhlIGRlc3RpbmF0aW9uIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dGAuCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXRgLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBkdXBsaWNhdGUgYWxsIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluIFxwIHQuCi0gKi8KLS8vIGNvbnZlcnQ6IEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0IC0+Ci0vLyBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dAotaW5saW5lIGJvb2wgY29udmVydFRvKAotICAgICAgICBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dCogbCwKLSAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQgY29uc3QmIHQpIHsKLSAgICBpZiAoIWNvbnZlcnRUbygmKGwtPmZyYW1lVGltZXN0YW1wcyksIHQuZnJhbWVUaW1lc3RhbXBzKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGwtPndpZHRoID0gdC53aWR0aDsKLSAgICBsLT5oZWlnaHQgPSB0LmhlaWdodDsKLSAgICBsLT50cmFuc2Zvcm1IaW50ID0gdC50cmFuc2Zvcm1IaW50OwotICAgIGwtPm51bVBlbmRpbmdCdWZmZXJzID0gdC5udW1QZW5kaW5nQnVmZmVyczsKLSAgICBsLT5uZXh0RnJhbWVOdW1iZXIgPSB0Lm5leHRGcmFtZU51bWJlcjsKLSAgICBsLT5idWZmZXJSZXBsYWNlZCA9IHQuYnVmZmVyUmVwbGFjZWQ7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKgotICogXGJyaWVmIENvbnZlcnQgYEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlYCB0bwotICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlYC4KLSAqCi0gKiBccGFyYW1baW5dIGwgVGhlIHNvdXJjZSBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGVgLgotICogXHJldHVybiBUaGUgY29ycmVzcG9uZGluZyBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGVgLgotICovCi1pbmxpbmUgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGUgdG9PbXhEaXNjb25uZWN0TW9kZSgKLSAgICAgICAgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGUgbCkgewotICAgIHN3aXRjaCAobCkgewotICAgICAgICBjYXNlIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlOjpBcGk6Ci0gICAgICAgICAgICByZXR1cm4gSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGU6OkFQSTsKLSAgICAgICAgY2FzZSBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZTo6QWxsTG9jYWw6Ci0gICAgICAgICAgICByZXR1cm4gSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGU6OkFMTF9MT0NBTDsKLSAgICB9Ci0gICAgcmV0dXJuIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlOjpBUEk7Ci19Ci0KLS8qKgotICogXGJyaWVmIENvbnZlcnQgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlYCB0bwotICogYEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlYC4KLSAqCi0gKiBccGFyYW1baW5dIGwgVGhlIHNvdXJjZSBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGVgLgotICogXHJldHVybiBUaGUgY29ycmVzcG9uZGluZyBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGVgLgotICovCi1pbmxpbmUgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGUgdG9HdWlEaXNjb25uZWN0TW9kZSgKLSAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGUgdCkgewotICAgIHN3aXRjaCAodCkgewotICAgICAgICBjYXNlIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlOjpBUEk6Ci0gICAgICAgICAgICByZXR1cm4gQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGU6OkFwaTsKLSAgICAgICAgY2FzZSBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZTo6QUxMX0xPQ0FMOgotICAgICAgICAgICAgcmV0dXJuIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlOjpBbGxMb2NhbDsKLSAgICB9Ci0gICAgcmV0dXJuIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlOjpBcGk7Ci19Ci0KIH0gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgogfSAgLy8gbmFtZXNwYWNlIFYxXzAKIH0gIC8vIG5hbWVzcGFjZSBvbXgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvT214LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL09teC5oCmluZGV4IGE2YTlkM2UuLjVhNDZiMjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvT214LmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9PbXguaApAQCAtMjAsMTMgKzIwLDE1IEBACiAjaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KICNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgogCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214Lmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBPTVhNYXN0ZXI7CitzdHJ1Y3QgT01YTm9kZUluc3RhbmNlOwogCiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIG1lZGlhIHsKQEAgLTUwLDEwICs1Miw5IEBACiB1c2luZyA6OmFuZHJvaWQ6OndwOwogCiB1c2luZyA6OmFuZHJvaWQ6Ok9NWE1hc3RlcjsKLXVzaW5nIDo6YW5kcm9pZDo6T214Tm9kZU93bmVyOwogdXNpbmcgOjphbmRyb2lkOjpPTVhOb2RlSW5zdGFuY2U7CiAKLXN0cnVjdCBPbXggOiBwdWJsaWMgSU9teCwgcHVibGljIGhpZGxfZGVhdGhfcmVjaXBpZW50LCBwdWJsaWMgT214Tm9kZU93bmVyIHsKK3N0cnVjdCBPbXggOiBwdWJsaWMgSU9teCwgcHVibGljIGhpZGxfZGVhdGhfcmVjaXBpZW50IHsKICAgICBPbXgoKTsKICAgICB2aXJ0dWFsIH5PbXgoKTsKIApAQCAtNjgsOCArNjksOCBAQAogICAgIC8vIE1ldGhvZCBmcm9tIGhpZGxfZGVhdGhfcmVjaXBpZW50CiAgICAgdm9pZCBzZXJ2aWNlRGllZCh1aW50NjRfdCBjb29raWUsIGNvbnN0IHdwPElCYXNlPiYgd2hvKSBvdmVycmlkZTsKIAotICAgIC8vIE1ldGhvZCBmcm9tIE9teE5vZGVPd25lcgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZnJlZU5vZGUoc3A8T01YTm9kZUluc3RhbmNlPiBjb25zdCYgaW5zdGFuY2UpIG92ZXJyaWRlOworICAgIC8vIE1ldGhvZCBmb3IgT01YTm9kZUluc3RhbmNlCisgICAgc3RhdHVzX3QgZnJlZU5vZGUoc3A8T01YTm9kZUluc3RhbmNlPiBjb25zdCYgaW5zdGFuY2UpOwogCiBwcm90ZWN0ZWQ6CiAgICAgT01YTWFzdGVyKiBtTWFzdGVyOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaAppbmRleCA0YTNmZTBjLi4zMjJhNjk5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAxNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE3LDE0ICsxNyw3IEBACiAjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfT01YX1YxXzBfV0dSQVBISUNCVUZGRVJQUk9EVUNFUl9ICiAjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfT01YX1YxXzBfV0dSQVBISUNCVUZGRVJQUk9EVUNFUl9ICiAKLSNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgotI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvQmluZGVyLmg+Ci0jaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KLSNpbmNsdWRlIDxndWkvSVByb2R1Y2VyTGlzdGVuZXIuaD4KLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvYnVmZmVycXVldWUvMS4wL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9XR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CkBAIC0zMyw2NyArMjYsOCBAQAogbmFtZXNwYWNlIFYxXzAgewogbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKIAotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6UGl4ZWxGb3JtYXQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6VjFfMDo6QW53QnVmZmVyOwotdXNpbmcgOjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwotdXNpbmcgOjphbmRyb2lkOjpzcDsKLQotdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OgotICAgICAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI7Ci10eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6Ci0gICAgICAgIElQcm9kdWNlckxpc3RlbmVyIEhQcm9kdWNlckxpc3RlbmVyOwotCi10eXBlZGVmIDo6YW5kcm9pZDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlciBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwotdHlwZWRlZiA6OmFuZHJvaWQ6OklQcm9kdWNlckxpc3RlbmVyIEJQcm9kdWNlckxpc3RlbmVyOwotdXNpbmcgOjphbmRyb2lkOjpCbkdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKLQotc3RydWN0IFRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyIDogcHVibGljIEhHcmFwaGljQnVmZmVyUHJvZHVjZXIgewotICAgIHNwPEJHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG1CYXNlOwotICAgIFRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyKHNwPEJHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGNvbnN0JiBiYXNlKTsKLSAgICBSZXR1cm48dm9pZD4gcmVxdWVzdEJ1ZmZlcihpbnQzMl90IHNsb3QsIHJlcXVlc3RCdWZmZXJfY2IgX2hpZGxfY2IpCi0gICAgICAgICAgICBvdmVycmlkZTsKLSAgICBSZXR1cm48aW50MzJfdD4gc2V0TWF4RGVxdWV1ZWRCdWZmZXJDb3VudChpbnQzMl90IG1heERlcXVldWVkQnVmZmVycykKLSAgICAgICAgICAgIG92ZXJyaWRlOwotICAgIFJldHVybjxpbnQzMl90PiBzZXRBc3luY01vZGUoYm9vbCBhc3luYykgb3ZlcnJpZGU7Ci0gICAgUmV0dXJuPHZvaWQ+IGRlcXVldWVCdWZmZXIoCi0gICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBQaXhlbEZvcm1hdCBmb3JtYXQsIHVpbnQzMl90IHVzYWdlLAotICAgICAgICAgICAgYm9vbCBnZXRGcmFtZVRpbWVzdGFtcHMsIGRlcXVldWVCdWZmZXJfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOwotICAgIFJldHVybjxpbnQzMl90PiBkZXRhY2hCdWZmZXIoaW50MzJfdCBzbG90KSBvdmVycmlkZTsKLSAgICBSZXR1cm48dm9pZD4gZGV0YWNoTmV4dEJ1ZmZlcihkZXRhY2hOZXh0QnVmZmVyX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKLSAgICBSZXR1cm48dm9pZD4gYXR0YWNoQnVmZmVyKGNvbnN0IEFud0J1ZmZlciYgYnVmZmVyLCBhdHRhY2hCdWZmZXJfY2IgX2hpZGxfY2IpCi0gICAgICAgICAgICBvdmVycmlkZTsKLSAgICBSZXR1cm48dm9pZD4gcXVldWVCdWZmZXIoCi0gICAgICAgICAgICBpbnQzMl90IHNsb3QsIGNvbnN0IEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQmIGlucHV0LAotICAgICAgICAgICAgcXVldWVCdWZmZXJfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOwotICAgIFJldHVybjxpbnQzMl90PiBjYW5jZWxCdWZmZXIoaW50MzJfdCBzbG90LCBjb25zdCBoaWRsX2hhbmRsZSYgZmVuY2UpCi0gICAgICAgICAgICBvdmVycmlkZTsKLSAgICBSZXR1cm48dm9pZD4gcXVlcnkoaW50MzJfdCB3aGF0LCBxdWVyeV9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7Ci0gICAgUmV0dXJuPHZvaWQ+IGNvbm5lY3QoY29uc3Qgc3A8SFByb2R1Y2VyTGlzdGVuZXI+JiBsaXN0ZW5lciwKLSAgICAgICAgICAgIGludDMyX3QgYXBpLCBib29sIHByb2R1Y2VyQ29udHJvbGxlZEJ5QXBwLAotICAgICAgICAgICAgY29ubmVjdF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7Ci0gICAgUmV0dXJuPGludDMyX3Q+IGRpc2Nvbm5lY3QoCi0gICAgICAgICAgICBpbnQzMl90IGFwaSwKLSAgICAgICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlIG1vZGUpIG92ZXJyaWRlOwotICAgIFJldHVybjxpbnQzMl90PiBzZXRTaWRlYmFuZFN0cmVhbShjb25zdCBoaWRsX2hhbmRsZSYgc3RyZWFtKSBvdmVycmlkZTsKLSAgICBSZXR1cm48dm9pZD4gYWxsb2NhdGVCdWZmZXJzKAotICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKLSAgICAgICAgICAgIFBpeGVsRm9ybWF0IGZvcm1hdCwgdWludDMyX3QgdXNhZ2UpIG92ZXJyaWRlOwotICAgIFJldHVybjxpbnQzMl90PiBhbGxvd0FsbG9jYXRpb24oYm9vbCBhbGxvdykgb3ZlcnJpZGU7Ci0gICAgUmV0dXJuPGludDMyX3Q+IHNldEdlbmVyYXRpb25OdW1iZXIodWludDMyX3QgZ2VuZXJhdGlvbk51bWJlcikgb3ZlcnJpZGU7Ci0gICAgUmV0dXJuPHZvaWQ+IGdldENvbnN1bWVyTmFtZShnZXRDb25zdW1lck5hbWVfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOwotICAgIFJldHVybjxpbnQzMl90PiBzZXRTaGFyZWRCdWZmZXJNb2RlKGJvb2wgc2hhcmVkQnVmZmVyTW9kZSkgb3ZlcnJpZGU7Ci0gICAgUmV0dXJuPGludDMyX3Q+IHNldEF1dG9SZWZyZXNoKGJvb2wgYXV0b1JlZnJlc2gpIG92ZXJyaWRlOwotICAgIFJldHVybjxpbnQzMl90PiBzZXREZXF1ZXVlVGltZW91dChpbnQ2NF90IHRpbWVvdXROcykgb3ZlcnJpZGU7Ci0gICAgUmV0dXJuPHZvaWQ+IGdldExhc3RRdWV1ZWRCdWZmZXIoZ2V0TGFzdFF1ZXVlZEJ1ZmZlcl9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7Ci0gICAgUmV0dXJuPHZvaWQ+IGdldEZyYW1lVGltZXN0YW1wcyhnZXRGcmFtZVRpbWVzdGFtcHNfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOwotICAgIFJldHVybjx2b2lkPiBnZXRVbmlxdWVJZChnZXRVbmlxdWVJZF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7Ci19OwordXNpbmcgVFdHcmFwaGljQnVmZmVyUHJvZHVjZXIgPSA6OmFuZHJvaWQ6OlRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyPAorICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj47CiAKIH0gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgogfSAgLy8gbmFtZXNwYWNlIFYxXzAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuaAppbmRleCBiOWYyMmFiLi40ZTU2Yzk4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5oCkBAIC0yOCw3ICsyOCw3IEBACiAKICNpbmNsdWRlIDxhbmRyb2lkL0JuR3JhcGhpY0J1ZmZlclNvdXJjZS5oPgogCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT214R3JhcGhpY0J1ZmZlclNvdXJjZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewpAQCAtMzcsNyArMzcsNyBAQAogbmFtZXNwYWNlIFYxXzAgewogbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKIAotdXNpbmcgOjphbmRyb2lkOjpHcmFwaGljQnVmZmVyU291cmNlOwordXNpbmcgOjphbmRyb2lkOjpPbXhHcmFwaGljQnVmZmVyU291cmNlOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6RGF0YXNwYWNlOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDo6Q29sb3JBc3BlY3RzOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDo6SUdyYXBoaWNCdWZmZXJTb3VyY2U7CkBAIC02OSwxMCArNjksMTAgQEAKIHN0cnVjdCBUV0dyYXBoaWNCdWZmZXJTb3VyY2UgOiBwdWJsaWMgVEdyYXBoaWNCdWZmZXJTb3VyY2UgewogICAgIHN0cnVjdCBUV09teE5vZGVXcmFwcGVyOwogICAgIHN0cnVjdCBUV09teEJ1ZmZlclNvdXJjZTsKLSAgICBzcDxHcmFwaGljQnVmZmVyU291cmNlPiBtQmFzZTsKKyAgICBzcDxPbXhHcmFwaGljQnVmZmVyU291cmNlPiBtQmFzZTsKICAgICBzcDxJT214QnVmZmVyU291cmNlPiBtT214QnVmZmVyU291cmNlOwogCi0gICAgVFdHcmFwaGljQnVmZmVyU291cmNlKHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+IGNvbnN0JiBiYXNlKTsKKyAgICBUV0dyYXBoaWNCdWZmZXJTb3VyY2Uoc3A8T214R3JhcGhpY0J1ZmZlclNvdXJjZT4gY29uc3QmIGJhc2UpOwogICAgIFJldHVybjxTdGF0dXM+IGNvbmZpZ3VyZSgKICAgICAgICAgICAgIGNvbnN0IHNwPElPbXhOb2RlPiYgb214Tm9kZSwgRGF0YXNwYWNlIGRhdGFzcGFjZSkgb3ZlcnJpZGU7CiAgICAgUmV0dXJuPFN0YXR1cz4gc2V0U3VzcGVuZChib29sIHN1c3BlbmQsIGludDY0X3QgdGltZVVzKSBvdmVycmlkZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV1Byb2R1Y2VyTGlzdGVuZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV1Byb2R1Y2VyTGlzdGVuZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc1ZTQ4YS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dQcm9kdWNlckxpc3RlbmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX09NWF9WMV8wX1dPTVhQUk9EVUNFUkxJU1RFTkVSX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9PTVhfVjFfMF9XT01YUFJPRFVDRVJMSVNURU5FUl9ICi0KLSNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgotI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvSUJpbmRlci5oPgotI2luY2x1ZGUgPGd1aS9JUHJvZHVjZXJMaXN0ZW5lci5oPgotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ncmFwaGljcy9idWZmZXJxdWV1ZS8xLjAvSVByb2R1Y2VyTGlzdGVuZXIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGhhcmR3YXJlIHsKLW5hbWVzcGFjZSBtZWRpYSB7Ci1uYW1lc3BhY2Ugb214IHsKLW5hbWVzcGFjZSBWMV8wIHsKLW5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7Ci0KLXVzaW5nIDo6YW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKLXVzaW5nIDo6YW5kcm9pZDo6c3A7Ci0KLXR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjpJUHJvZHVjZXJMaXN0ZW5lcgotICAgICAgICBIUHJvZHVjZXJMaXN0ZW5lcjsKLXR5cGVkZWYgOjphbmRyb2lkOjpJUHJvZHVjZXJMaXN0ZW5lcgotICAgICAgICBCUHJvZHVjZXJMaXN0ZW5lcjsKLXVzaW5nIDo6YW5kcm9pZDo6Qm5Qcm9kdWNlckxpc3RlbmVyOwotCi1zdHJ1Y3QgVFdQcm9kdWNlckxpc3RlbmVyIDogcHVibGljIEhQcm9kdWNlckxpc3RlbmVyIHsKLSAgICBzcDxCUHJvZHVjZXJMaXN0ZW5lcj4gbUJhc2U7Ci0gICAgVFdQcm9kdWNlckxpc3RlbmVyKHNwPEJQcm9kdWNlckxpc3RlbmVyPiBjb25zdCYgYmFzZSk7Ci0gICAgUmV0dXJuPHZvaWQ+IG9uQnVmZmVyUmVsZWFzZWQoKSBvdmVycmlkZTsKLSAgICBSZXR1cm48Ym9vbD4gbmVlZHNSZWxlYXNlTm90aWZ5KCkgb3ZlcnJpZGU7Ci19OwotCi1jbGFzcyBMV1Byb2R1Y2VyTGlzdGVuZXIgOiBwdWJsaWMgQm5Qcm9kdWNlckxpc3RlbmVyIHsKLXB1YmxpYzoKLSAgICBzcDxIUHJvZHVjZXJMaXN0ZW5lcj4gbUJhc2U7Ci0gICAgTFdQcm9kdWNlckxpc3RlbmVyKHNwPEhQcm9kdWNlckxpc3RlbmVyPiBjb25zdCYgYmFzZSk7Ci0gICAgdm9pZCBvbkJ1ZmZlclJlbGVhc2VkKCkgb3ZlcnJpZGU7Ci0gICAgYm9vbCBuZWVkc1JlbGVhc2VOb3RpZnkoKSBvdmVycmlkZTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgotfSAgLy8gbmFtZXNwYWNlIFYxXzAKLX0gIC8vIG5hbWVzcGFjZSBvbXgKLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfT01YX1YxXzBfV09NWFBST0RVQ0VSTElTVEVORVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L0JXR3JhcGhpY0J1ZmZlclNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L0JXR3JhcGhpY0J1ZmZlclNvdXJjZS5oCmluZGV4IDBmNzhlYjYuLjBlZmZmMjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9CV0dyYXBoaWNCdWZmZXJTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvQldHcmFwaGljQnVmZmVyU291cmNlLmgKQEAgLTIzLDE0ICsyMywxNCBAQAogI2luY2x1ZGUgPGFuZHJvaWQvQm5PTVhCdWZmZXJTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JT01YLmg+CiAKLSNpbmNsdWRlICJHcmFwaGljQnVmZmVyU291cmNlLmgiCisjaW5jbHVkZSAiT214R3JhcGhpY0J1ZmZlclNvdXJjZS5oIgogI2luY2x1ZGUgIklPbXhOb2RlV3JhcHBlci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM7CiB1c2luZyA6OmFuZHJvaWQ6OkJuR3JhcGhpY0J1ZmZlclNvdXJjZTsKLXVzaW5nIDo6YW5kcm9pZDo6R3JhcGhpY0J1ZmZlclNvdXJjZTsKK3VzaW5nIDo6YW5kcm9pZDo6T214R3JhcGhpY0J1ZmZlclNvdXJjZTsKIHVzaW5nIDo6YW5kcm9pZDo6SU9NWE5vZGU7CiB1c2luZyA6OmFuZHJvaWQ6OnNwOwogCkBAIC0zOCwxMCArMzgsMTAgQEAKICAgICBzdHJ1Y3QgQldPTVhCdWZmZXJTb3VyY2U7CiAgICAgc3RydWN0IEJXT214Tm9kZVdyYXBwZXI7CiAKLSAgICBzcDxHcmFwaGljQnVmZmVyU291cmNlPiBtQmFzZTsKKyAgICBzcDxPbXhHcmFwaGljQnVmZmVyU291cmNlPiBtQmFzZTsKICAgICBzcDxJT01YQnVmZmVyU291cmNlPiBtT01YQnVmZmVyU291cmNlOwogCi0gICAgQldHcmFwaGljQnVmZmVyU291cmNlKHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+IGNvbnN0ICZiYXNlKTsKKyAgICBCV0dyYXBoaWNCdWZmZXJTb3VyY2Uoc3A8T214R3JhcGhpY0J1ZmZlclNvdXJjZT4gY29uc3QgJmJhc2UpOwogCiAgICAgU3RhdHVzIGNvbmZpZ3VyZSgKICAgICAgICAgICAgIGNvbnN0IHNwPElPTVhOb2RlPiYgb214Tm9kZSwgaW50MzJfdCBkYXRhU3BhY2UpIG92ZXJyaWRlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L0ZyYW1lRHJvcHBlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L0ZyYW1lRHJvcHBlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWE2ZDRiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9GcmFtZURyb3BwZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEZSQU1FX0RST1BQRVJfSF8KLQotI2RlZmluZSBGUkFNRV9EUk9QUEVSX0hfCi0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IEZyYW1lRHJvcHBlciA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICAvLyBObyBmcmFtZXMgd2lsbCBiZSBkcm9wcGVkIHVudGlsIGEgdmFsaWQgbWF4IGZyYW1lIHJhdGUgaXMgc2V0LgotICAgIEZyYW1lRHJvcHBlcigpOwotCi0gICAgLy8gbWF4RnJhbWVSYXRlIHJlcXVpcmVkIHRvIGJlIHBvc2l0aXZlLgotICAgIHN0YXR1c190IHNldE1heEZyYW1lUmF0ZShmbG9hdCBtYXhGcmFtZVJhdGUpOwotCi0gICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtYXggZnJhbWUgcmF0ZSBoYXMgbm90IGJlZW4gc2V0IHZpYSBzZXRNYXhGcmFtZVJhdGUuCi0gICAgYm9vbCBzaG91bGREcm9wKGludDY0X3QgdGltZVVzKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkZyYW1lRHJvcHBlcigpOwotCi1wcml2YXRlOgotICAgIGludDY0X3QgbURlc2lyZWRNaW5UaW1lVXM7Ci0gICAgaW50NjRfdCBtTWluSW50ZXJ2YWxVczsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEZyYW1lRHJvcHBlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIEZSQU1FX0RST1BQRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGZlZTZmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0ODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgR1JBUEhJQ19CVUZGRVJfU09VUkNFX0hfCi0KLSNkZWZpbmUgR1JBUEhJQ19CVUZGRVJfU09VUkNFX0hfCi0KLSNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgotI2luY2x1ZGUgPGd1aS9CdWZmZXJRdWV1ZS5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL1ZpZGVvQVBJLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgotI2luY2x1ZGUgPG1lZGlhL09NWEZlbmNlUGFyY2VsYWJsZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyUmVmbGVjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+Ci0KLSNpbmNsdWRlIDxhbmRyb2lkL0JuR3JhcGhpY0J1ZmZlclNvdXJjZS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvQm5PTVhCdWZmZXJTb3VyY2UuaD4KLQotI2luY2x1ZGUgIklPbXhOb2RlV3JhcHBlci5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXVzaW5nIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM7Ci0KLXN0cnVjdCBGcmFtZURyb3BwZXI7Ci0KLS8qCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gZmVlZCBPTVggY29kZWNzIGZyb20gYSBTdXJmYWNlIHZpYSBCdWZmZXJRdWV1ZSBvcgotICogSFcgcHJvZHVjZXIuCi0gKgotICogSW5zdGFuY2VzIG9mIHRoZSBjbGFzcyBkb24ndCBydW4gb24gYSBkZWRpY2F0ZWQgdGhyZWFkLiAgSW5zdGVhZCwKLSAqIHZhcmlvdXMgZXZlbnRzIHRyaWdnZXIgZGF0YSBtb3ZlbWVudDoKLSAqCi0gKiAgLSBBdmFpbGFiaWxpdHkgb2YgYSBuZXcgZnJhbWUgb2YgZGF0YSBmcm9tIHRoZSBCdWZmZXJRdWV1ZSAobm90aWZpZWQKLSAqICAgIHZpYSB0aGUgb25GcmFtZUF2YWlsYWJsZSBjYWxsYmFjaykuCi0gKiAgLSBUaGUgcmV0dXJuIG9mIGEgY29kZWMgYnVmZmVyICh2aWEgT25FbXB0eUJ1ZmZlckRvbmUpLgotICogIC0gQXBwbGljYXRpb24gc2lnbmFsaW5nIGVuZC1vZi1zdHJlYW0uCi0gKiAgLSBUcmFuc2l0aW9uIHRvIG9yIGZyb20gImV4ZWN1dGluZyIgc3RhdGUuCi0gKgotICogRnJhbWVzIG9mIGRhdGEgKGFuZCwgcGVyaGFwcywgdGhlIGVuZC1vZi1zdHJlYW0gaW5kaWNhdGlvbikgY2FuIGFycml2ZQotICogYmVmb3JlIHRoZSBjb2RlYyBpcyBpbiB0aGUgImV4ZWN1dGluZyIgc3RhdGUsIHNvIHdlIG5lZWQgdG8gcXVldWUKLSAqIHRoaW5ncyB1cCB1bnRpbCB3ZSdyZSByZWFkeSB0byBnby4KLSAqCi0gKiBUaGUgR3JhcGhpY0J1ZmZlclNvdXJjZSBjYW4gYmUgY29uZmlndXJlIGR5bmFtaWNhbGx5IHRvIGRpc2NhcmQgZnJhbWVzCi0gKiBmcm9tIHRoZSBzb3VyY2U6Ci0gKgotICogLSBpZiB0aGVpciB0aW1lc3RhbXAgaXMgbGVzcyB0aGFuIGEgc3RhcnQgdGltZQotICogLSBpZiB0aGUgc291cmNlIGlzIHN1c3BlbmRlZCBvciBzdG9wcGVkIGFuZCB0aGUgc3VzcGVuZC9zdG9wLXRpbWUgaXMgcmVhY2hlZAotICogLSBpZiBFT1Mgd2FzIHNpZ25hbGVkCi0gKiAtIGlmIHRoZXJlIGlzIG5vIGVuY29kZXIgY29ubmVjdGVkIHRvIGl0Ci0gKgotICogVGhlIHNvdXJjZSwgZnVydGhlcm1vcmUsIG1heSBjaG9vc2UgdG8gbm90IGVuY29kZSAoZHJvcCkgZnJhbWVzIGlmOgotICoKLSAqIC0gdG8gdGhyb3R0bGUgdGhlIGZyYW1lIHJhdGUgKGtlZXAgaXQgdW5kZXIgYSBjZXJ0YWluIGxpbWl0KQotICoKLSAqIEZpbmFsbHkgdGhlIHNvdXJjZSBtYXkgb3B0aW9uYWxseSBob2xkIG9udG8gdGhlIGxhc3Qgbm9uLWRpc2NhcmRlZCBmcmFtZQotICogKGV2ZW4gaWYgaXQgd2FzIGRyb3BwZWQpIHRvIHJlZW5jb2RlIGl0IGFmdGVyIGFuIGludGVydmFsIGlmIG5vIGZ1cnRoZXIKLSAqIGZyYW1lcyBhcmUgc2VudCBieSB0aGUgcHJvZHVjZXIuCi0gKi8KLWNsYXNzIEdyYXBoaWNCdWZmZXJTb3VyY2UgOiBwdWJsaWMgQnVmZmVyUXVldWU6OkNvbnN1bWVyTGlzdGVuZXIgewotcHVibGljOgotICAgIEdyYXBoaWNCdWZmZXJTb3VyY2UoKTsKLQotICAgIHZpcnR1YWwgfkdyYXBoaWNCdWZmZXJTb3VyY2UoKTsKLQotICAgIC8vIFdlIGNhbid0IHRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgY29uc3RydWN0b3IgZmFpbHMsIHNvIHdlIGp1c3Qgc2V0Ci0gICAgLy8gdGhpcyBhbmQgcmVxdWlyZSB0aGF0IHRoZSBjYWxsZXIgdGVzdCB0aGUgdmFsdWUuCi0gICAgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm5zIHRoZSBoYW5kbGUgdG8gdGhlIHByb2R1Y2VyIHNpZGUgb2YgdGhlIEJ1ZmZlclF1ZXVlLiAgQnVmZmVycwotICAgIC8vIHF1ZXVlZCBvbiB0aGlzIHdpbGwgYmUgcmVjZWl2ZWQgYnkgR3JhcGhpY0J1ZmZlclNvdXJjZS4KLSAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBnZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVByb2R1Y2VyOwotICAgIH0KLQotICAgIC8vIE9teEJ1ZmZlclNvdXJjZSBpbnRlcmZhY2UKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gT01YIHRyYW5zaXRpb25zIHRvIE9NWF9TdGF0ZUV4ZWN1dGluZywgd2hpY2ggbWVhbnMKLSAgICAvLyB3ZSBjYW4gc3RhcnQgaGFuZGluZyBpdCBidWZmZXJzLiAgSWYgd2UgYWxyZWFkeSBoYXZlIGJ1ZmZlcnMgb2YgZGF0YQotICAgIC8vIHNpdHRpbmcgaW4gdGhlIEJ1ZmZlclF1ZXVlLCB0aGlzIHdpbGwgc2VuZCB0aGVtIHRvIHRoZSBjb2RlYy4KLSAgICBTdGF0dXMgb25PbXhFeGVjdXRpbmcoKTsKLQotICAgIC8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gT01YIHRyYW5zaXRpb25zIHRvIE9NWF9TdGF0ZUlkbGUsIGluZGljYXRpbmcgdGhhdAotICAgIC8vIHRoZSBjb2RlYyBpcyBtZWFudCB0byByZXR1cm4gYWxsIGJ1ZmZlcnMgYmFjayB0byB0aGUgY2xpZW50IGZvciB0aGVtCi0gICAgLy8gdG8gYmUgZnJlZWQuIERvIE5PVCBzdWJtaXQgYW55IG1vcmUgYnVmZmVycyB0byB0aGUgY29tcG9uZW50LgotICAgIFN0YXR1cyBvbk9teElkbGUoKTsKLQotICAgIC8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gT01YIHRyYW5zaXRpb25zIHRvIE9NWF9TdGF0ZUxvYWRlZCwgaW5kaWNhdGluZyB0aGF0Ci0gICAgLy8gd2UgYXJlIHNodXR0aW5nIGRvd24uCi0gICAgU3RhdHVzIG9uT214TG9hZGVkKCk7Ci0KLSAgICAvLyBBICJjb2RlYyBidWZmZXIiLCBpLmUuIGEgYnVmZmVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gcGFzcyBkYXRhIGludG8KLSAgICAvLyB0aGUgZW5jb2RlciwgaGFzIGJlZW4gYWxsb2NhdGVkLiAgKFRoaXMgY2FsbCBkb2VzIG5vdCBjYWxsIGJhY2sgaW50bwotICAgIC8vIE9NWE5vZGVJbnN0YW5jZS4pCi0gICAgU3RhdHVzIG9uSW5wdXRCdWZmZXJBZGRlZChpbnQzMl90IGJ1ZmZlcklkKTsKLQotICAgIC8vIENhbGxlZCBmcm9tIE9uRW1wdHlCdWZmZXJEb25lLiAgSWYgd2UgaGF2ZSBhIEJRIGJ1ZmZlciBhdmFpbGFibGUsCi0gICAgLy8gZmlsbCBpdCB3aXRoIGEgbmV3IGZyYW1lIG9mIGRhdGE7IG90aGVyd2lzZSwganVzdCBtYXJrIGl0IGFzIGF2YWlsYWJsZS4KLSAgICBTdGF0dXMgb25JbnB1dEJ1ZmZlckVtcHRpZWQoaW50MzJfdCBidWZmZXJJZCwgaW50IGZlbmNlRmQpOwotCi0gICAgLy8gSUdyYXBoaWNCdWZmZXJTb3VyY2UgaW50ZXJmYWNlCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvLyBDb25maWd1cmUgdGhlIGJ1ZmZlciBzb3VyY2UgdG8gYmUgdXNlZCB3aXRoIGFuIE9NWCBub2RlIHdpdGggdGhlIGRlZmF1bHQKLSAgICAvLyBkYXRhIHNwYWNlLgotICAgIHN0YXR1c190IGNvbmZpZ3VyZSgKLSAgICAgICAgY29uc3Qgc3A8SU9teE5vZGVXcmFwcGVyPiAmb214Tm9kZSwKLSAgICAgICAgaW50MzJfdCBkYXRhU3BhY2UsCi0gICAgICAgIGludDMyX3QgYnVmZmVyQ291bnQsCi0gICAgICAgIHVpbnQzMl90IGZyYW1lV2lkdGgsCi0gICAgICAgIHVpbnQzMl90IGZyYW1lSGVpZ2h0LAotICAgICAgICB1aW50MzJfdCBjb25zdW1lclVzYWdlKTsKLQotICAgIC8vIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHRoZSBsYXN0IGlucHV0IGZyYW1lIGhhcyBiZWVuIHN1Ym1pdHRlZCBvciBidWZmZXIKLSAgICAvLyB0aW1lc3RhbXAgaXMgZ3JlYXRlciBvciBlcXVhbCB0aGFuIHN0b3BUaW1lVXMuIFdlIG5lZWQgdG8gc3VibWl0IGFuIGVtcHR5Ci0gICAgLy8gYnVmZmVyIHdpdGggdGhlIEVPUyBmbGFnIHNldC4gIElmIHdlIGRvbid0IGhhdmUgYSBjb2RlYyBidWZmZXIgcmVhZHksCi0gICAgLy8gd2UganVzdCBzZXQgdGhlIG1FbmRPZlN0cmVhbSBmbGFnLgotICAgIHN0YXR1c190IHNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKTsKLQotICAgIC8vIElmIHN1c3BlbmQgaXMgdHJ1ZSwgYWxsIGluY29taW5nIGJ1ZmZlcnMgKGluY2x1ZGluZyB0aG9zZSBjdXJyZW50bHkKLSAgICAvLyBpbiB0aGUgQnVmZmVyUXVldWUpIHdpdGggdGltZXN0YW1wIGxhcmdlciB0aGFuIHRpbWVVcyB3aWxsIGJlIGRpc2NhcmRlZAotICAgIC8vIHVudGlsIHRoZSBzdXNwZW5zaW9uIGlzIGxpZnRlZC4gSWYgc3VzcGVuZCBpcyBmYWxzZSwgYWxsIGluY29taW5nIGJ1ZmZlcnMKLSAgICAvLyBpbmNsdWRpbmcgdGhvc2UgY3VycmVudGx5IGluIHRoZSBCdWZmZXJRdWV1ZSkgd2l0aCB0aW1lc3RhbXAgbGFyZ2VyIHRoYW4KLSAgICAvLyB0aW1lVXMgd2lsbCBiZSBwcm9jZXNzZWQuIHRpbWVVcyB1c2VzIFNZU1RFTV9USU1FX01PTk9UT05JQyB0aW1lIGJhc2UuCi0gICAgc3RhdHVzX3Qgc2V0U3VzcGVuZChib29sIHN1c3BlbmQsIGludDY0X3QgdGltZVVzKTsKLQotICAgIC8vIFNwZWNpZmllcyB0aGUgaW50ZXJ2YWwgYWZ0ZXIgd2hpY2ggd2UgcmVxdWV1ZSB0aGUgYnVmZmVyIHByZXZpb3VzbHkKLSAgICAvLyBxdWV1ZWQgdG8gdGhlIGVuY29kZXIuIFRoaXMgaXMgdXNlZnVsIGluIHRoZSBjYXNlIG9mIHN1cmZhY2UgZmxpbmdlcgotICAgIC8vIHByb3ZpZGluZyB0aGUgaW5wdXQgc3VyZmFjZSBpZiB0aGUgcmVzdWx0aW5nIGVuY29kZWQgc3RyZWFtIGlzIHRvCi0gICAgLy8gYmUgZGlzcGxheWVkICJsaXZlIi4gSWYgd2Ugd2VyZSBub3QgdG8gcHVzaCB0aHJvdWdoIHRoZSBleHRyYSBmcmFtZQotICAgIC8vIHRoZSBkZWNvZGVyIG9uIHRoZSByZW1vdGUgZW5kIHdvdWxkIGJlIHVuYWJsZSB0byBkZWNvZGUgdGhlIGxhdGVzdCBmcmFtZS4KLSAgICAvLyBUaGlzIEFQSSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgdHJhbnNpdGlvbmluZyB0aGUgZW5jb2RlciB0byAiZXhlY3V0aW5nIgotICAgIC8vIHN0YXRlIGFuZCBvbmNlIHRoaXMgYmVoYXZpb3VyIGlzIHNwZWNpZmllZCBpdCBjYW5ub3QgYmUgcmVzZXQuCi0gICAgc3RhdHVzX3Qgc2V0UmVwZWF0UHJldmlvdXNGcmFtZURlbGF5VXMoaW50NjRfdCByZXBlYXRBZnRlclVzKTsKLQotICAgIC8vIFNldHMgdGhlIGlucHV0IGJ1ZmZlciB0aW1lc3RhbXAgb2Zmc2V0LgotICAgIC8vIFdoZW4gc2V0LCB0aGUgc2FtcGxlJ3MgdGltZXN0YW1wIHdpbGwgYmUgYWRqdXN0ZWQgd2l0aCB0aGUgdGltZU9mZnNldFVzLgotICAgIHN0YXR1c190IHNldFRpbWVPZmZzZXRVcyhpbnQ2NF90IHRpbWVPZmZzZXRVcyk7Ci0KLSAgICAvLyBXaGVuIHNldCwgdGhlIG1heCBmcmFtZSByYXRlIGZlZCB0byB0aGUgZW5jb2RlciB3aWxsIGJlIGNhcHBlZCBhdCBtYXhGcHMuCi0gICAgc3RhdHVzX3Qgc2V0TWF4RnBzKGZsb2F0IG1heEZwcyk7Ci0KLSAgICAvLyBTZXRzIHRoZSB0aW1lIGxhcHNlIChvciBzbG93IG1vdGlvbikgcGFyYW1ldGVycy4KLSAgICAvLyBXaGVuIHNldCwgdGhlIHNhbXBsZSdzIHRpbWVzdGFtcCB3aWxsIGJlIG1vZGlmaWVkIHRvIHBsYXliYWNrIGZyYW1lcmF0ZSwKLSAgICAvLyBhbmQgY2FwdHVyZSB0aW1lc3RhbXAgd2lsbCBiZSBtb2RpZmllZCB0byBjYXB0dXJlIHJhdGUuCi0gICAgc3RhdHVzX3Qgc2V0VGltZUxhcHNlQ29uZmlnKGRvdWJsZSBmcHMsIGRvdWJsZSBjYXB0dXJlRnBzKTsKLQotICAgIC8vIFNldHMgdGhlIHN0YXJ0IHRpbWUgdXMgKGluIHN5c3RlbSB0aW1lKSwgc2FtcGxlcyBiZWZvcmUgd2hpY2ggc2hvdWxkCi0gICAgLy8gYmUgZHJvcHBlZCBhbmQgbm90IHN1Ym1pdHRlZCB0byBlbmNvZGVyCi0gICAgc3RhdHVzX3Qgc2V0U3RhcnRUaW1lVXMoaW50NjRfdCBzdGFydFRpbWVVcyk7Ci0KLSAgICAvLyBTZXRzIHRoZSBzdG9wIHRpbWUgdXMgKGluIHN5c3RlbSB0aW1lKSwgc2FtcGxlcyBhZnRlciB3aGljaCBzaG91bGQgYmUgZHJvcHBlZAotICAgIC8vIGFuZCBub3Qgc3VibWl0dGVkIHRvIGVuY29kZXIuIHRpbWVVcyB1c2VzIFNZU1RFTV9USU1FX01PTk9UT05JQyB0aW1lIGJhc2UuCi0gICAgc3RhdHVzX3Qgc2V0U3RvcFRpbWVVcyhpbnQ2NF90IHN0b3BUaW1lVXMpOwotCi0gICAgLy8gR2V0cyB0aGUgc3RvcCB0aW1lIG9mZnNldCBpbiB1cy4gVGhpcyBpcyB0aGUgdGltZSBvZmZzZXQgYmV0d2VlbiBsYXRlc3QgYnVmZmVyCi0gICAgLy8gdGltZSBhbmQgdGhlIHN0b3BUaW1lVXMuIElmIHN0b3AgdGltZSBpcyBub3Qgc2V0LCBJTlZBTElEX09QRVJBVElPTiB3aWxsIGJlIHJldHVybmVkLgotICAgIC8vIElmIHJldHVybiBpcyBPSywgKnN0b3BUaW1lT2Zmc2V0VXMgd2lsbCBjb250YWluIHRoZSB2YWxpZCBvZmZzZXQuIE90aGVyd2lzZSwKLSAgICAvLyAqc3RvcFRpbWVPZmZzZXRVcyB3aWxsIG5vdCBiZSBtb2RpZmllZC4gUG9zaXRpdmUgc3RvcFRpbWVPZmZzZXRVcyBtZWFucyBidWZmZXIgdGltZQotICAgIC8vIGxhcmdlciB0aGFuIHN0b3BUaW1lVXMuCi0gICAgc3RhdHVzX3QgZ2V0U3RvcFRpbWVPZmZzZXRVcyhpbnQ2NF90ICpzdG9wVGltZU9mZnNldFVzKTsKLQotICAgIC8vIFNldHMgdGhlIGRlc2lyZWQgY29sb3IgYXNwZWN0cywgZS5nLiB0byBiZSB1c2VkIHdoZW4gcHJvZHVjZXIgZG9lcyBub3Qgc3BlY2lmeSBhIGRhdGFzcGFjZS4KLSAgICBzdGF0dXNfdCBzZXRDb2xvckFzcGVjdHMoaW50MzJfdCBhc3BlY3RzUGFja2VkKTsKLQotcHJvdGVjdGVkOgotICAgIC8vIEJROjpDb25zdW1lckxpc3RlbmVyIGludGVyZmFjZQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLy8gQnVmZmVyUXVldWU6OkNvbnN1bWVyTGlzdGVuZXIgaW50ZXJmYWNlLCBjYWxsZWQgd2hlbiBhIG5ldyBmcmFtZSBvZgotICAgIC8vIGRhdGEgaXMgYXZhaWxhYmxlLiAgSWYgd2UncmUgZXhlY3V0aW5nIGFuZCBhIGNvZGVjIGJ1ZmZlciBpcwotICAgIC8vIGF2YWlsYWJsZSwgd2UgYWNxdWlyZSB0aGUgYnVmZmVyLCBjb3B5IHRoZSBHcmFwaGljQnVmZmVyIHJlZmVyZW5jZQotICAgIC8vIGludG8gdGhlIGNvZGVjIGJ1ZmZlciwgYW5kIGNhbGwgRW1wdHlbVGhpc11CdWZmZXIuICBJZiB3ZSdyZSBub3QgeWV0Ci0gICAgLy8gZXhlY3V0aW5nIG9yIHRoZXJlJ3Mgbm8gY29kZWMgYnVmZmVyIGF2YWlsYWJsZSwgd2UganVzdCBpbmNyZW1lbnQKLSAgICAvLyBtTnVtRnJhbWVzQXZhaWxhYmxlIGFuZCByZXR1cm4uCi0gICAgdm9pZCBvbkZyYW1lQXZhaWxhYmxlKGNvbnN0IEJ1ZmZlckl0ZW0mIGl0ZW0pIG92ZXJyaWRlOwotCi0gICAgLy8gQnVmZmVyUXVldWU6OkNvbnN1bWVyTGlzdGVuZXIgaW50ZXJmYWNlLCBjYWxsZWQgd2hlbiB0aGUgY2xpZW50IGhhcwotICAgIC8vIHJlbGVhc2VkIG9uZSBvciBtb3JlIEdyYXBoaWNCdWZmZXJzLiAgV2UgY2xlYXIgb3V0IHRoZSBhcHByb3ByaWF0ZQotICAgIC8vIHNldCBvZiBtQnVmZmVyU2xvdCBlbnRyaWVzLgotICAgIHZvaWQgb25CdWZmZXJzUmVsZWFzZWQoKSBvdmVycmlkZTsKLQotICAgIC8vIEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyIGludGVyZmFjZSwgY2FsbGVkIHdoZW4gdGhlIGNsaWVudCBoYXMKLSAgICAvLyBjaGFuZ2VkIHRoZSBzaWRlYmFuZCBzdHJlYW0uIEdyYXBoaWNCdWZmZXJTb3VyY2UgZG9lc24ndCBoYW5kbGUgc2lkZWJhbmQKLSAgICAvLyBzdHJlYW1zIHNvIHRoaXMgaXMgYSBuby1vcCAoYW5kIHNob3VsZCBuZXZlciBiZSBjYWxsZWQpLgotICAgIHZvaWQgb25TaWRlYmFuZFN0cmVhbUNoYW5nZWQoKSBvdmVycmlkZTsKLQotcHJpdmF0ZToKLSAgICAvLyBMb2NrLCBjb3ZlcnMgYWxsIG1lbWJlciB2YXJpYWJsZXMuCi0gICAgbXV0YWJsZSBNdXRleCBtTXV0ZXg7Ci0KLSAgICAvLyBVc2VkIHRvIHJlcG9ydCBjb25zdHJ1Y3RvciBmYWlsdXJlLgotICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7Ci0KLSAgICAvLyBHcmFwaGljIGJ1ZmZlciByZWZlcmVuY2Ugb2JqZWN0cwotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvLyBUaGVzZSBhcmUgdXNlZCB0byBrZWVwIGEgc2hhcmVkIHJlZmVyZW5jZSB0byBHcmFwaGljQnVmZmVycyBhbmQgZ3JhbGxvYyBoYW5kbGVzIG93bmVkIGJ5IHRoZQotICAgIC8vIEdyYXBoaWNCdWZmZXJTb3VyY2UgYXMgd2VsbCBhcyB0byBtYW5hZ2UgdGhlIGNhY2hlIHNsb3RzLiBTZXBhcmF0ZSByZWZlcmVuY2VzIGFyZSBvd25lZCBieQotICAgIC8vIHRoZSBidWZmZXIgY2FjaGUgKGNvbnRyb2xsZWQgYnkgdGhlIGJ1ZmZlciBxdWV1ZS9idWZmZXIgcHJvZHVjZXIpIGFuZCB0aGUgY29kZWMuCi0KLSAgICAvLyBXaGVuIHdlIGdldCBhIGJ1ZmZlciBmcm9tIHRoZSBwcm9kdWNlciAoQlEpIGl0IGRlc2lnbmF0ZXMgdGhlbSB0byBiZSBjYWNoZWQgaW50byBzcGVjaWZpYwotICAgIC8vIHNsb3RzLiBFYWNoIHNsb3Qgb3ducyBhIHNoYXJlZCByZWZlcmVuY2UgdG8gdGhlIGdyYXBoaWMgYnVmZmVyICh3ZSB0cmFjayB0aGVzZSB1c2luZwotICAgIC8vIENhY2hlZEJ1ZmZlcikgdGhhdCBpcyBpbiB0aGF0IHNsb3QsIGJ1dCB0aGUgcHJvZHVjZXIgY29udHJvbHMgdGhlIHNsb3RzLgotICAgIHN0cnVjdCBDYWNoZWRCdWZmZXI7Ci0KLSAgICAvLyBXaGVuIHdlIGFjcXVpcmUgYSBidWZmZXIsIHdlIG11c3QgcmVsZWFzZSBpdCBiYWNrIHRvIHRoZSBwcm9kdWNlciBvbmNlIHdlIChvciB0aGUgY29kZWMpCi0gICAgLy8gbm8gbG9uZ2VyIHVzZXMgaXQgKGFzIGxvbmcgYXMgdGhlIGJ1ZmZlciBpcyBzdGlsbCBpbiB0aGUgY2FjaGUgc2xvdCkuIFdlIHVzZSBzaGFyZWQKLSAgICAvLyBBY3F1aXJlZEJ1ZmZlciBpbnN0YW5jZXMgZm9yIHRoaXMgcHVycG9zZSAtIGFuZCB3ZSBjYWxsIHJlbGVhc2UgYnVmZmVyIHdoZW4gdGhlIGxhc3QKLSAgICAvLyByZWZlcmVuY2UgaXMgcmVsaW5xdWlzaGVkLgotICAgIHN0cnVjdCBBY3F1aXJlZEJ1ZmZlcjsKLQotICAgIC8vIFdlIGFsc28gbmVlZCB0byBrZWVwIHNvbWUgZXh0cmEgbWV0YWRhdGEgKG90aGVyIHRoYW4gdGhlIGJ1ZmZlciByZWZlcmVuY2UpIGZvciBhY3F1aXJlZAotICAgIC8vIGJ1ZmZlcnMuIFRoZXNlIGFyZSB0cmFja2VkIGluIFZpZGVvQnVmZmVyIHN0cnVjdC4KLSAgICBzdHJ1Y3QgVmlkZW9CdWZmZXIgewotICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QWNxdWlyZWRCdWZmZXI+IG1CdWZmZXI7Ci0gICAgICAgIG5zZWNzX3QgbVRpbWVzdGFtcE5zOwotICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZV90IG1EYXRhc3BhY2U7Ci0gICAgfTsKLQotICAgIC8vIENhY2hlZCBhbmQgYXF1aXJlZCBidWZmZXJzCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIHR5cGVkZWYgaW50IHNsb3RfaWQ7Ci0KLSAgICAvLyBNYXBzIGEgc2xvdCB0byB0aGUgY2FjaGVkIGJ1ZmZlciBpbiB0aGF0IHNsb3QKLSAgICBLZXllZFZlY3RvcjxzbG90X2lkLCBzdGQ6OnNoYXJlZF9wdHI8Q2FjaGVkQnVmZmVyPj4gbUJ1ZmZlclNsb3RzOwotCi0gICAgLy8gUXVldWUgb2YgYnVmZmVycyBhY3F1aXJlZCBpbiBjaHJvbm9sb2dpY2FsIG9yZGVyIHRoYXQgYXJlIG5vdCB5ZXQgc3VibWl0dGVkIHRvIHRoZSBjb2RlYwotICAgIExpc3Q8VmlkZW9CdWZmZXI+IG1BdmFpbGFibGVCdWZmZXJzOwotCi0gICAgLy8gTnVtYmVyIG9mIGJ1ZmZlcnMgdGhhdCBoYXZlIGJlZW4gc2lnbmFsZWQgYnkgdGhlIHByb2R1Y2VyIHRoYXQgdGhleSBhcmUgYXZhaWxhYmxlLCBidXQKLSAgICAvLyB3ZSd2ZSBiZWVuIHVuYWJsZSB0byBhY3F1aXJlIHRoZW0gZHVlIHRvIG91ciBtYXggYWNxdWlyZSBjb3VudAotICAgIGludDMyX3QgbU51bUF2YWlsYWJsZVVuYWNxdWlyZWRCdWZmZXJzOwotCi0gICAgLy8gTnVtYmVyIG9mIGZyYW1lcyBhY3F1aXJlZCBmcm9tIGNvbnN1bWVyIChkZWJ1ZyBvbmx5KQotICAgIC8vIChhcyBpbiBhcXVpcmVCdWZmZXIgY2FsbGVkLCBhbmQgcmVsZWFzZSBuZWVkcyB0byBiZSBjYWxsZWQpCi0gICAgaW50MzJfdCBtTnVtT3V0c3RhbmRpbmdBY3F1aXJlczsKLQotICAgIC8vIEFjcXVpcmUgYSBidWZmZXIgZnJvbSB0aGUgQlEgYW5kIHN0b3JlIGl0IGluIHxpdGVtfCBpZiBzdWNjZXNzZnVsCi0gICAgLy8gXHJldHVybiBPSyBvbiBzdWNjZXNzLCBvciBlcnJvciBvbiBmYWlsdXJlLgotICAgIHN0YXR1c190IGFjcXVpcmVCdWZmZXJfbChWaWRlb0J1ZmZlciAqaXRlbSk7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiBhIGJ1ZmZlciB3YXMgYWNxdWlyZWQgZnJvbSB0aGUgcHJvZHVjZXIKLSAgICB2b2lkIG9uQnVmZmVyQWNxdWlyZWRfbChjb25zdCBWaWRlb0J1ZmZlciAmYnVmZmVyKTsKLQotICAgIC8vIG1hcmtzIHRoZSBidWZmZXIgYXQgdGhlIHNsb3Qgbm8gbG9uZ2VyIGNhY2hlZCwgYW5kIGFjY291bnRzIGZvciB0aGUgb3V0c3RhbmRpbmcKLSAgICAvLyBhY3F1aXJlIGNvdW50LiBSZXR1cm5zIHRydWUgaWYgdGhlIHNsb3Qgd2FzIHBvcHVsYXRlZDsgb3RoZXJ3aXNlLCBmYWxzZS4KLSAgICBib29sIGRpc2NhcmRCdWZmZXJJblNsb3RfbChzbG90X2lkIGkpOwotCi0gICAgLy8gbWFya3MgdGhlIGJ1ZmZlciBhdCB0aGUgc2xvdCBpbmRleCBubyBsb25nZXIgY2FjaGVkLCBhbmQgYWNjb3VudHMgZm9yIHRoZSBvdXRzdGFuZGluZwotICAgIC8vIGFjcXVpcmUgY291bnQKLSAgICB2b2lkIGRpc2NhcmRCdWZmZXJBdFNsb3RJbmRleF9sKHNzaXplX3QgYnNpKTsKLQotICAgIC8vIHJlbGVhc2UgYWxsIGFjcXVpcmVkIGFuZCB1bmFjcXVpcmVkIGF2YWlsYWJsZSBidWZmZXJzCi0gICAgLy8gVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gaWYgaXQgZmFpbHMgdG8gYWNxdWlyZSBhbiB1bmFjcXVpcmVkIGF2YWlsYWJsZSBidWZmZXIsIHdoaWNoIHdpbGwKLSAgICAvLyBsZWF2ZSBtTnVtQXZhaWxhYmxlVW5hY3F1aXJlZEJ1ZmZlcnMgcG9zaXRpdmUgb24gcmV0dXJuLgotICAgIHZvaWQgcmVsZWFzZUFsbEF2YWlsYWJsZUJ1ZmZlcnNfbCgpOwotCi0gICAgLy8gcmV0dXJucyB3aGV0aGVyIHdlIGhhdmUgYW55IGF2YWlsYWJsZSBidWZmZXJzIChhY3F1aXJlZCBvciBub3QteWV0LWFjcXVpcmVkKQotICAgIGJvb2wgaGF2ZUF2YWlsYWJsZUJ1ZmZlcnNfbCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuICFtQXZhaWxhYmxlQnVmZmVycy5lbXB0eSgpIHx8IG1OdW1BdmFpbGFibGVVbmFjcXVpcmVkQnVmZmVycyA+IDA7Ci0gICAgfQotCi0gICAgLy8gQ29kZWMgYnVmZmVycwotICAgIC8vIC0tLS0tLS0tLS0tLS0KLQotICAgIC8vIFdoZW4gd2UgcXVldWUgYnVmZmVycyB0byB0aGUgZW5jb2Rlciwgd2UgbXVzdCBob2xkIHRoZSByZWZlcmVuY2VzIHRvIHRoZSBncmFwaGljIGJ1ZmZlcnMKLSAgICAvLyBpbiB0aG9zZSBidWZmZXJzIC0gYXMgdGhlIHByb2R1Y2VyIG1heSBmcmVlIHRoZSBzbG90cy4KLQotICAgIHR5cGVkZWYgaW50MzJfdCBjb2RlY19idWZmZXJfaWQ7Ci0KLSAgICAvLyBzZXQgb2YgY29kZWMgYnVmZmVyIElELXMgb2YgYnVmZmVycyBhdmFpbGFibGUgdG8gZmlsbAotICAgIExpc3Q8Y29kZWNfYnVmZmVyX2lkPiBtRnJlZUNvZGVjQnVmZmVyczsKLQotICAgIC8vIG1hcHMgY29kZWMgYnVmZmVyIElELXMgdG8gYnVmZmVyIGluZm8gc3VibWl0dGVkIHRvIHRoZSBjb2RlYy4gVXNlZCB0byBrZWVwIGEgcmVmZXJlbmNlIGZvcgotICAgIC8vIHRoZSBncmFwaGljcyBidWZmZXIuCi0gICAgS2V5ZWRWZWN0b3I8Y29kZWNfYnVmZmVyX2lkLCBzdGQ6OnNoYXJlZF9wdHI8QWNxdWlyZWRCdWZmZXI+PiBtU3VibWl0dGVkQ29kZWNCdWZmZXJzOwotCi0gICAgLy8gUHJvY2Vzc2VzIHRoZSBuZXh0IGFjcXVpcmVkIGZyYW1lLiBJZiB0aGVyZSBpcyBubyBhdmFpbGFibGUgY29kZWMgYnVmZmVyLCBpdCByZXR1cm5zIGZhbHNlCi0gICAgLy8gd2l0aG91dCBhbnkgZnVydGhlciBhY3Rpb24uCi0gICAgLy8KLSAgICAvLyBPdGhlcndpc2UsIGl0IGNvbnN1bWVzIHRoZSBuZXh0IGFjcXVpcmVkIGZyYW1lIGFuZCBkZXRlcm1pbmVzIGlmIGl0IG5lZWRzIHRvIGJlIGRpc2NhcmRlZCBvcgotICAgIC8vIGRyb3BwZWQuIElmIG5laXRoZXIgYXJlIG5lZWRlZCwgaXQgc3VibWl0cyBpdCB0byB0aGUgY29kZWMuIEl0IGFsc28gc2F2ZXMgdGhlIGxhdGVzdAotICAgIC8vIG5vbi1kcm9wcGVkIGZyYW1lIGFuZCBzdWJtaXRzIGl0IGZvciByZXBlYXQgZW5jb2RpbmcgKGlmIHRoaXMgaXMgZW5hYmxlZCkuCi0gICAgLy8KLSAgICAvLyBccmVxdWlyZSB0aGVyZSBtdXN0IGJlIGFuIGFjcXVpcmVkIGZyYW1lIChpLmUuIHdlJ3JlIGluIHRoZSBvbkZyYW1lQXZhaWxhYmxlIGNhbGxiYWNrLAotICAgIC8vIG9yIGlmIHdlJ3JlIGluIGNvZGVjQnVmZmVyRW1wdGllZCBhbmQgbU51bUZyYW1lc0F2YWlsYWJsZSBpcyBub256ZXJvKS4KLSAgICAvLyBccmVxdWlyZSBjb2RlYyBtdXN0IGJlIGV4ZWN1dGluZwotICAgIC8vIFxyZXR1cm5zIHRydWUgaWYgYWNxdWlyZWQgKGFuZCBoYW5kbGVkKSB0aGUgbmV4dCBmcmFtZS4gT3RoZXJ3aXNlLCBmYWxzZS4KLSAgICBib29sIGZpbGxDb2RlY0J1ZmZlcl9sKCk7Ci0KLSAgICAvLyBDYWxjdWxhdGVzIHRoZSBtZWRpYSB0aW1lc3RhbXAgZm9yIHxpdGVtfCBhbmQgb24gc3VjY2VzcyBpdCBzdWJtaXRzIHRoZSBidWZmZXIgdG8gdGhlIGNvZGVjLAotICAgIC8vIHdoaWxlIGFsc28ga2VlcGluZyBhIHJlZmVyZW5jZSBmb3IgaXQgaW4gbVN1Ym1pdHRlZENvZGVjQnVmZmVycy4KLSAgICAvLyBSZXR1cm5zIFVOS05PV05fRVJST1IgaWYgdGhlIGJ1ZmZlciB3YXMgbm90IHN1Ym1pdHRlZCBkdWUgdG8gYnVmZmVyIHRpbWVzdGFtcC4gT3RoZXJ3aXNlLAotICAgIC8vIGl0IHJldHVybnMgYW55IHN1Ym1pdCBzdWNjZXNzIG9yIGVycm9yIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBjb2RlYy4KLSAgICBzdGF0dXNfdCBzdWJtaXRCdWZmZXJfbChjb25zdCBWaWRlb0J1ZmZlciAmaXRlbSk7Ci0KLSAgICAvLyBTdWJtaXRzIGFuIGVtcHR5IGJ1ZmZlciwgd2l0aCB0aGUgRU9TIGZsYWcgc2V0IGlmIHRoZXJlIGlzIGFuIGF2YWlsYWJsZSBjb2RlYyBidWZmZXIgYW5kCi0gICAgLy8gc2V0cyBtRW5kT2ZTdHJlYW1TZW50IGZsYWcuIERvZXMgbm90aGluZyBpZiB0aGVyZSBpcyBubyBjb2RlYyBidWZmZXIgYXZhaWxhYmxlLgotICAgIHZvaWQgc3VibWl0RW5kT2ZJbnB1dFN0cmVhbV9sKCk7Ci0KLSAgICAvLyBTZXQgdG8gdHJ1ZSBpZiB3ZSB3YW50IHRvIHNlbmQgZW5kLW9mLXN0cmVhbSBhZnRlciB3ZSBydW4gb3V0IG9mIGF2YWlsYWJsZSBmcmFtZXMgZnJvbSB0aGUKLSAgICAvLyBwcm9kdWNlcgotICAgIGJvb2wgbUVuZE9mU3RyZWFtOwotCi0gICAgLy8gRmxhZyB0aGF0IHRoZSBFT1Mgd2FzIHN1Ym1pdHRlZCB0byB0aGUgZW5jb2RlcgotICAgIGJvb2wgbUVuZE9mU3RyZWFtU2VudDsKLQotICAgIC8vIERhdGFzcGFjZSBmb3IgdGhlIGxhc3QgZnJhbWUgc3VibWl0dGVkIHRvIHRoZSBjb2RlYwotICAgIGFuZHJvaWRfZGF0YXNwYWNlIG1MYXN0RGF0YXNwYWNlOwotCi0gICAgLy8gRGVmYXVsdCBjb2xvciBhc3BlY3RzIGZvciB0aGlzIHNvdXJjZQotICAgIGludDMyX3QgbURlZmF1bHRDb2xvckFzcGVjdHNQYWNrZWQ7Ci0KLSAgICAvLyBjYWxsZWQgd2hlbiB0aGUgZGF0YSBzcGFjZSBvZiB0aGUgaW5wdXQgYnVmZmVyIGNoYW5nZXMKLSAgICB2b2lkIG9uRGF0YXNwYWNlQ2hhbmdlZF9sKGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFzcGFjZSwgYW5kcm9pZF9waXhlbF9mb3JtYXQgcGl4ZWxGb3JtYXQpOwotCi0gICAgLy8gUG9pbnRlciBiYWNrIHRvIHRoZSBPbXggbm9kZSB0aGF0IGNyZWF0ZWQgdXMuICBXZSBzZW5kIGJ1ZmZlcnMgaGVyZS4KLSAgICBzcDxJT214Tm9kZVdyYXBwZXI+IG1PTVhOb2RlOwotCi0gICAgLy8gU2V0IGJ5IG9teEV4ZWN1dGluZygpIC8gb214SWRsaW5nKCkuCi0gICAgYm9vbCBtRXhlY3V0aW5nOwotCi0gICAgYm9vbCBtU3VzcGVuZGVkOwotCi0gICAgLy8gcmV0dXJucyB0cnVlIGlmIHRoaXMgc291cmNlIGlzIHVuY29uZGl0aW9uYWxseSBkaXNjYXJkaW5nIGFjcXVpcmVkIGJ1ZmZlcnMgYXQgdGhlIG1vbWVudAotICAgIC8vIHJlZ2FyZGxlc3Mgb2YgdGhlIG1ldGFkYXRhIG9mIHRob3NlIGJ1ZmZlcnMKLSAgICBib29sIGFyZVdlRGlzY2FyZGluZ0F2YWlsYWJsZUJ1ZmZlcnNfbCgpOwotCi0gICAgaW50NjRfdCBtTGFzdEZyYW1lVGltZXN0YW1wVXM7Ci0KLSAgICAvLyBPdXIgQnVmZmVyUXVldWUgaW50ZXJmYWNlcy4gbVByb2R1Y2VyIGlzIHBhc3NlZCB0byB0aGUgcHJvZHVjZXIgdGhyb3VnaAotICAgIC8vIGdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIsIGFuZCBtQ29uc3VtZXIgaXMgdXNlZCBpbnRlcm5hbGx5IHRvIHJldHJpZXZlCi0gICAgLy8gdGhlIGJ1ZmZlcnMgcXVldWVkIGJ5IHRoZSBwcm9kdWNlci4KLSAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtUHJvZHVjZXI7Ci0gICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gbUNvbnN1bWVyOwotCi0gICAgLy8gVGhlIHRpbWUgdG8gc3RvcCBzZW5kaW5nIGJ1ZmZlcnMuCi0gICAgaW50NjRfdCBtU3RvcFRpbWVVczsKLQotICAgIHN0cnVjdCBBY3Rpb25JdGVtIHsKLSAgICAgICAgdHlwZWRlZiBlbnVtIHsKLSAgICAgICAgICAgIFBBVVNFLAotICAgICAgICAgICAgUkVTVU1FLAotICAgICAgICAgICAgU1RPUAotICAgICAgICB9IEFjdGlvblR5cGU7Ci0gICAgICAgIEFjdGlvblR5cGUgbUFjdGlvbjsKLSAgICAgICAgaW50NjRfdCBtQWN0aW9uVGltZVVzOwotICAgIH07Ci0KLSAgICAvLyBNYWludGFpbiBsYXN0IGFjdGlvbiB0aW1lc3RhbXAgdG8gZW5zdXJlIGFsbCB0aGUgYWN0aW9uIHRpbWVzdGFtcHMgYXJlCi0gICAgLy8gbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nLgotICAgIGludDY0X3QgbUxhc3RBY3Rpb25UaW1lVXM7Ci0KLSAgICAvLyBBbiBhY3Rpb24gcXVldWUgdGhhdCBxdWV1ZSB1cCBhbGwgdGhlIGFjdGlvbnMgc2VudCB0byBHcmFwaGljQnVmZmVyU291cmNlLgotICAgIC8vIFNUT1AgYWN0aW9uIHNob3VsZCBvbmx5IHNob3cgdXAgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdCBhcyBhbGwgdGhlIGFjdGlvbnMKLSAgICAvLyBhZnRlciBhIFNUT1AgYWN0aW9uIHdpbGwgYmUgZGlzY2FyZGVkLiBtQWN0aW9uUXVldWUgaXMgcHJvdGVjdGVkIGJ5IG1NdXRleC4KLSAgICBMaXN0PEFjdGlvbkl0ZW0+IG1BY3Rpb25RdWV1ZTsKLQotICAgIC8vLy8KLSAgICBmcmllbmQgc3RydWN0IEFIYW5kbGVyUmVmbGVjdG9yPEdyYXBoaWNCdWZmZXJTb3VyY2U+OwotCi0gICAgZW51bSB7Ci0gICAgICAgIGtXaGF0UmVwZWF0TGFzdEZyYW1lLCAgIC8vLzwgcXVldWUgbGFzdCBmcmFtZSBmb3IgcmVlbmNvZGluZwotICAgIH07Ci0gICAgZW51bSB7Ci0gICAgICAgIGtSZXBlYXRMYXN0RnJhbWVDb3VudCA9IDEwLAotICAgIH07Ci0KLSAgICBpbnQ2NF90IG1Ta2lwRnJhbWVzQmVmb3JlTnM7Ci0KLSAgICBzcDxGcmFtZURyb3BwZXI+IG1GcmFtZURyb3BwZXI7Ci0KLSAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOwotICAgIHNwPEFIYW5kbGVyUmVmbGVjdG9yPEdyYXBoaWNCdWZmZXJTb3VyY2U+ID4gbVJlZmxlY3RvcjsKLQotICAgIC8vIFJlcGVhdCBsYXN0IGZyYW1lIGZlYXR1cmUKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gY29uZmlndXJhdGlvbiBwYXJhbWV0ZXI6IHJlcGVhdCBpbnRlcnZhbCBmb3IgZnJhbWUgcmVwZWF0aW5nICg8MCBpZiByZXBlYXRpbmcgaXMgZGlzYWJsZWQpCi0gICAgaW50NjRfdCBtRnJhbWVSZXBlYXRJbnRlcnZhbFVzOwotCi0gICAgLy8gY3VycmVudCBmcmFtZSByZXBlYXQgZ2VuZXJhdGlvbiAtIHVzZWQgdG8gY2FuY2VsIGEgcGVuZGluZyBmcmFtZSByZXBlYXQKLSAgICBpbnQzMl90IG1SZXBlYXRMYXN0RnJhbWVHZW5lcmF0aW9uOwotCi0gICAgLy8gbnVtYmVyIG9mIHRpbWVzIHRvIHJlcGVhdCBsYXRlc3QgZnJhbWUgKDAgPSBub25lKQotICAgIGludDMyX3QgbU91dHN0YW5kaW5nRnJhbWVSZXBlYXRDb3VudDsKLQotICAgIC8vIFRoZSBwcmV2aW91cyBidWZmZXIgc2hvdWxkJ3ZlIGJlZW4gcmVwZWF0ZWQgYnV0Ci0gICAgLy8gbm8gY29kZWMgYnVmZmVyIHdhcyBhdmFpbGFibGUgYXQgdGhlIHRpbWUuCi0gICAgYm9vbCBtRnJhbWVSZXBlYXRCbG9ja2VkT25Db2RlY0J1ZmZlcjsKLQotICAgIC8vIGhvbGQgYSByZWZlcmVuY2UgdG8gdGhlIGxhc3QgYWNxdWlyZWQgKGFuZCBub3QgZGlzY2FyZGVkKSBmcmFtZSBmb3IgZnJhbWUgcmVwZWF0aW5nCi0gICAgVmlkZW9CdWZmZXIgbUxhdGVzdEJ1ZmZlcjsKLQotICAgIC8vIHF1ZXVlIGxhc3QgZnJhbWUgZm9yIHJlZW5jb2RlIGFmdGVyIHRoZSByZXBlYXQgaW50ZXJ2YWwuCi0gICAgdm9pZCBxdWV1ZUZyYW1lUmVwZWF0X2woKTsKLQotICAgIC8vIHNhdmUgfGl0ZW18IGFzIHRoZSBsYXRlc3QgYnVmZmVyIGFuZCBxdWV1ZSBpdCBmb3IgcmVlbmNvZGUgKHJlcGVhdCkKLSAgICB2b2lkIHNldExhdGVzdEJ1ZmZlcl9sKGNvbnN0IFZpZGVvQnVmZmVyICZpdGVtKTsKLQotICAgIC8vIHN1Ym1pdCBsYXN0IGZyYW1lIHRvIGVuY29kZXIgYW5kIHF1ZXVlIGl0IGZvciByZWVuY29kZQotICAgIC8vIFxyZXR1cm4gdHJ1ZSBpZiBidWZmZXIgd2FzIHN1Ym1pdHRlZCwgZmFsc2UgaWYgaXQgd2Fzbid0IChlLmcuIHNvdXJjZSBpcyBzdXNwZW5kZWQsIHRoZXJlCi0gICAgLy8gaXMgbm8gYXZhaWxhYmxlIGNvZGVjIGJ1ZmZlcikKLSAgICBib29sIHJlcGVhdExhdGVzdEJ1ZmZlcl9sKCk7Ci0KLSAgICAvLyBUaW1lIGxhcHNlIC8gc2xvdyBtb3Rpb24gY29uZmlndXJhdGlvbgotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvLyBkZXNpcmVkIGZyYW1lIHJhdGUgZm9yIGVuY29kaW5nIC0gdmFsdWUgPD0gMCBpZiB1bmRlZmluZWQKLSAgICBkb3VibGUgbUZwczsKLQotICAgIC8vIGRlc2lyZWQgZnJhbWUgcmF0ZSBmb3IgY2FwdHVyZSAtIHZhbHVlIDw9IDAgaWYgdW5kZWZpbmVkCi0gICAgZG91YmxlIG1DYXB0dXJlRnBzOwotCi0gICAgLy8gVGltZSBsYXBzZSBtb2RlIGlzIGVuYWJsZWQgaWYgdGhlIGNhcHR1cmUgZnJhbWUgcmF0ZSBpcyBkZWZpbmVkIGFuZCBpdCBpcwotICAgIC8vIHNtYWxsZXIgdGhhbiBoYWxmIHRoZSBlbmNvZGluZyBmcmFtZSByYXRlIChpZiBkZWZpbmVkKS4gSW4gdGhpcyBtb2RlLAotICAgIC8vIGZyYW1lcyB0aGF0IGNvbWUgaW4gYmV0d2VlbiB0aGUgY2FwdHVyZSBpbnRlcnZhbCAodGhlIHJlY2lwcm9jYWwgb2YgdGhlCi0gICAgLy8gY2FwdHVyZSBmcmFtZSByYXRlKSBhcmUgZHJvcHBlZCBhbmQgdGhlIGVuY29kaW5nIHRpbWVzdGFtcCBpcyBhZGp1c3RlZCB0bwotICAgIC8vIG1hdGNoIHRoZSBkZXNpcmVkIGVuY29kaW5nIGZyYW1lIHJhdGUuCi0gICAgLy8KLSAgICAvLyBTbG93IG1vdGlvbiBtb2RlIGlzIGVuYWJsZWQgaWYgYm90aCBlbmNvZGluZyBhbmQgY2FwdHVyZSBmcmFtZSByYXRlcyBhcmUKLSAgICAvLyBkZWZpbmVkIGFuZCB0aGUgZW5jb2RpbmcgZnJhbWUgcmF0ZSBpcyBsZXNzIHRoYW4gaGFsZiB0aGUgY2FwdHVyZSBmcmFtZQotICAgIC8vIHJhdGUuIEluIHRoaXMgbW9kZSwgdGhlIHNvdXJjZSBpcyBleHBlY3RlZCB0byBwcm9kdWNlIGZyYW1lcyB3aXRoIGFuIGV2ZW4KLSAgICAvLyB0aW1lc3RhbXAgaW50ZXJ2YWwgKGFmdGVyIHJvdW5kaW5nKSB3aXRoIHRoZSBjb25maWd1cmVkIGNhcHR1cmUgZnBzLiBUaGUKLSAgICAvLyBmaXJzdCBzb3VyY2UgdGltZXN0YW1wIGlzIHVzZWQgYXMgdGhlIHNvdXJjZSBiYXNlIHRpbWUuIEFmdGVyd2FyZHMsIHRoZQotICAgIC8vIHRpbWVzdGFtcCBvZiBlYWNoIHNvdXJjZSBmcmFtZSBpcyBzbmFwcGVkIHRvIHRoZSBuZWFyZXN0IGV4cGVjdGVkIGNhcHR1cmUKLSAgICAvLyB0aW1lc3RhbXAgYW5kIHNjYWxlZCB0byBtYXRjaCB0aGUgY29uZmlndXJlZCBlbmNvZGluZyBmcmFtZSByYXRlLgotCi0gICAgLy8gVGhlc2UgbW9kZXMgbXVzdCBiZSBlbmFibGVkIGJlZm9yZSB1c2luZyB0aGlzIHNvdXJjZS4KLQotICAgIC8vIGFkanVzdGVkIGNhcHR1cmUgdGltZXN0YW1wIG9mIHRoZSBiYXNlIGZyYW1lCi0gICAgaW50NjRfdCBtQmFzZUNhcHR1cmVVczsKLQotICAgIC8vIGFkanVzdGVkIGVuY29kaW5nIHRpbWVzdGFtcCBvZiB0aGUgYmFzZSBmcmFtZQotICAgIGludDY0X3QgbUJhc2VGcmFtZVVzOwotCi0gICAgLy8gbnVtYmVyIG9mIGZyYW1lcyBmcm9tIHRoZSBiYXNlIHRpbWUKLSAgICBpbnQ2NF90IG1GcmFtZUNvdW50OwotCi0gICAgLy8gYWRqdXN0ZWQgY2FwdHVyZSB0aW1lc3RhbXAgZm9yIHByZXZpb3VzIGZyYW1lIChuZWdhdGl2ZSBpZiB0aGVyZSB3ZXJlCi0gICAgLy8gbm9uZSkKLSAgICBpbnQ2NF90IG1QcmV2Q2FwdHVyZVVzOwotCi0gICAgLy8gYWRqdXN0ZWQgbWVkaWEgdGltZXN0YW1wIGZvciBwcmV2aW91cyBmcmFtZSAobmVnYXRpdmUgaWYgdGhlcmUgd2VyZSBub25lKQotICAgIGludDY0X3QgbVByZXZGcmFtZVVzOwotCi0gICAgLy8gZGVzaXJlZCBvZmZzZXQgYmV0d2VlbiBtZWRpYSB0aW1lIGFuZCBjYXB0dXJlIHRpbWUKLSAgICBpbnQ2NF90IG1JbnB1dEJ1ZmZlclRpbWVPZmZzZXRVczsKLQotICAgIC8vIENhbGN1bGF0ZXMgYW5kIG91dHB1dHMgdGhlIHRpbWVzdGFtcCB0byB1c2UgZm9yIGEgYnVmZmVyIHdpdGggYSBzcGVjaWZpYyBidWZmZXIgdGltZXN0YW1wCi0gICAgLy8gfGJ1ZmZlclRpbWVzdGFtcE5zfC4gUmV0dXJucyBmYWxzZSBvbiBmYWlsdXJlIChidWZmZXIgdG9vIGNsb3NlIG9yIHRpbWVzdGFtcCBpcyBtb3ZpbmcKLSAgICAvLyBiYWNrd2FyZHMpLiBPdGhlcndpc2UsIHN0b3JlcyB0aGUgbWVkaWEgdGltZXN0YW1wIGluIHwqY29kZWNUaW1lVXN8IGFuZCByZXR1cm5zIHRydWUuCi0gICAgLy8KLSAgICAvLyBUaGlzIG1ldGhvZCB0YWtlcyBpbnRvIGFjY291bnQgdGhlIHN0YXJ0IHRpbWUgb2Zmc2V0IGFuZCBhbnkgdGltZSBsYXBzZSBvciBzbG93IG1vdGlvbiB0aW1lCi0gICAgLy8gYWRqdXN0bWVudCByZXF1ZXN0cy4KLSAgICBib29sIGNhbGN1bGF0ZUNvZGVjVGltZXN0YW1wX2wobnNlY3NfdCBidWZmZXJUaW1lTnMsIGludDY0X3QgKmNvZGVjVGltZVVzKTsKLQotICAgIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoR3JhcGhpY0J1ZmZlclNvdXJjZSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIEdSQVBISUNfQlVGRkVSX1NPVVJDRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTRiNGMwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVguaAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfT01YX0hfCi0jZGVmaW5lIEFORFJPSURfT01YX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9JT01YLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmg+Ci0jaW5jbHVkZSAiT214Tm9kZU93bmVyLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IE9NWE1hc3RlcjsKLXN0cnVjdCBPTVhOb2RlSW5zdGFuY2U7Ci0KLWNsYXNzIE9NWCA6IHB1YmxpYyBCbk9NWCwKLSAgICAgICAgICAgIHB1YmxpYyBPbXhOb2RlT3duZXIsCi0gICAgICAgICAgICBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgewotcHVibGljOgotICAgIE9NWCgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0Tm9kZXMoTGlzdDxDb21wb25lbnRJbmZvPiAqbGlzdCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGFsbG9jYXRlTm9kZSgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHNwPElPTVhPYnNlcnZlcj4gJm9ic2VydmVyLAotICAgICAgICAgICAgc3A8SU9NWE5vZGU+ICpvbXhOb2RlKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlSW5wdXRTdXJmYWNlKAotICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gKmJ1ZmZlclByb2R1Y2VyLAotICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJTb3VyY2U+ICpidWZmZXJTb3VyY2UpOwotCi0gICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4gJnRoZV9sYXRlX3dobyk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGZyZWVOb2RlKGNvbnN0IHNwPE9NWE5vZGVJbnN0YW5jZT4mIGluc3RhbmNlKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfk9NWCgpOwotCi1wcml2YXRlOgotICAgIE11dGV4IG1Mb2NrOwotICAgIE9NWE1hc3RlciAqbU1hc3RlcjsKLSAgICBNZWRpYUNvZGVjc1htbFBhcnNlciBtUGFyc2VyOwotCi0gICAgS2V5ZWRWZWN0b3I8d3A8SUJpbmRlcj4sIHNwPE9NWE5vZGVJbnN0YW5jZT4gPiBtTGl2ZU5vZGVzOwotCi0gICAgT01YKGNvbnN0IE9NWCAmKTsKLSAgICBPTVggJm9wZXJhdG9yPShjb25zdCBPTVggJik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIEFORFJPSURfT01YX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmgKaW5kZXggMTA2NWNhNS4uYTc2MWVmNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuaApAQCAtMjUsOSArMjUsOSBAQAogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgotI2luY2x1ZGUgIk9teE5vZGVPd25lci5oIgogCiAjaW5jbHVkZSA8YW5kcm9pZC9oaWRsL21lbW9yeS8xLjAvSU1lbW9yeS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvT214Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIGNsYXNzIEdyYXBoaWNCdWZmZXI7CkBAIC0zNSwxMSArMzUsMTIgQEAKIGNsYXNzIElPTVhPYnNlcnZlcjsKIHN0cnVjdCBPTVhNYXN0ZXI7CiBjbGFzcyBPTVhCdWZmZXI7Ci10eXBlZGVmIGhpZGw6Om1lbW9yeTo6VjFfMDo6SU1lbW9yeSBJSGlkbE1lbW9yeTsKK3VzaW5nIElIaWRsTWVtb3J5ID0gaGlkbDo6bWVtb3J5OjpWMV8wOjpJTWVtb3J5OwordXNpbmcgaGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA6OmltcGxlbWVudGF0aW9uOjpPbXg7CiAKIHN0cnVjdCBPTVhOb2RlSW5zdGFuY2UgOiBwdWJsaWMgQm5PTVhOb2RlIHsKICAgICBPTVhOb2RlSW5zdGFuY2UoCi0gICAgICAgICAgICBPbXhOb2RlT3duZXIgKm93bmVyLCBjb25zdCBzcDxJT01YT2JzZXJ2ZXI+ICZvYnNlcnZlciwgY29uc3QgY2hhciAqbmFtZSk7CisgICAgICAgICAgICBPbXggKm93bmVyLCBjb25zdCBzcDxJT01YT2JzZXJ2ZXI+ICZvYnNlcnZlciwgY29uc3QgY2hhciAqbmFtZSk7CiAKICAgICB2b2lkIHNldEhhbmRsZShPTVhfSEFORExFVFlQRSBoYW5kbGUpOwogCkBAIC0xMjIsNyArMTIzLDcgQEAKIAogICAgIE11dGV4IG1Mb2NrOwogCi0gICAgT214Tm9kZU93bmVyICptT3duZXI7CisgICAgT214ICptT3duZXI7CiAgICAgT01YX0hBTkRMRVRZUEUgbUhhbmRsZTsKICAgICBzcDxJT01YT2JzZXJ2ZXI+IG1PYnNlcnZlcjsKICAgICBzcDxDYWxsYmFja0Rpc3BhdGNoZXI+IG1EaXNwYXRjaGVyOwpAQCAtMjg3LDYgKzI4OCwyMSBAQAogCiAgICAgYm9vbCBoYW5kbGVEYXRhU3BhY2VDaGFuZ2VkKG9teF9tZXNzYWdlICZtc2cpOwogCisgICAgLyoKKyAgICAgKiBTZXQgdGhlIG1heCBwdHMgZ2FwIGJldHdlZW4gZnJhbWVzLgorICAgICAqCisgICAgICogV2hlbiB0aGUgcHRzIGdhcCBudW1iZXIgaXMgcG9zaXRpdmUsIGl0IGluZGljYXRlcyB0aGUgbWF4aW11bSBwdHMgZ2FwIGJldHdlZW4KKyAgICAgKiB0d28gYWRqYWNlbnQgZnJhbWVzLiBJZiB0d28gZnJhbWVzIGFyZSBmdXJ0aGVyIGFwYXJ0LCB0aW1lc3RhbXBzIHdpbGwgYmUgbW9kaWZpZWQKKyAgICAgKiB0byBtZWV0IHRoaXMgcmVxdWlyZW1lbnQgYmVmb3JlIHRoZSBmcmFtZXMgYXJlIHNlbnQgdG8gdGhlIGVuY29kZXIuCisgICAgICoKKyAgICAgKiBXaGVuIHRoZSBwdHMgZ2FwIG51bWJlciBpcyBuZWdhdGl2ZSwgaXQgaW5kaWNhdGVzIHRoYXQgdGhlIG9yaWdpbmFsIHRpbWVzdGFtcAorICAgICAqIHNob3VsZCBhbHdheXMgYmUgbW9kaWZpZWQgc3VjaCB0aGF0IGFsbCBhZGphY2VudCBmcmFtZXMgaGF2ZSB0aGUgc2FtZSBwdHMgZ2FwCisgICAgICogZXF1YWwgdG8gdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBwYXNzZWQgaW4gbnVtYmVyLiBUaGlzIG9wdGlvbiBpcyB0eXBpY2FsbHkKKyAgICAgKiB1c2VkIHdoZW4gY2xpZW50IHdhbnRzIHRvIG1ha2Ugc3VyZSBhbGwgZnJhbWVzIGFyZSBjYXB0dXJlZCBldmVuIHdoZW4gc291cmNlCisgICAgICogcG90ZW50aWFsbHkgc2VuZHMgb3V0LW9mLW9yZGVyIGZyYW1lcy4KKyAgICAgKgorICAgICAqIFRpbWVzdGFtcHMgd2lsbCBiZSByZXN0b3JlZCB0byB0aGUgb3JpZ2luYWwgd2hlbiB0aGUgb3V0cHV0IGlzIHNlbnQgYmFjayB0byB0aGUgY2xpZW50LgorICAgICAqLwogICAgIHN0YXR1c190IHNldE1heFB0c0dhcFVzKGNvbnN0IHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpOwogICAgIGludDY0X3QgZ2V0Q29kZWNUaW1lc3RhbXAoT01YX1RJQ0tTIHRpbWVzdGFtcCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhTdG9yZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFN0b3JlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMGQ3MTMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFN0b3JlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX09NWFNUT1JFX0hfCi0jZGVmaW5lIEFORFJPSURfT01YU1RPUkVfSF8KLQotI2luY2x1ZGUgPG1lZGlhL0lPTVhTdG9yZS5oPgotI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaD4KLQotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgT01YU3RvcmUgOiBwdWJsaWMgQm5PTVhTdG9yZSB7Ci1wdWJsaWM6Ci0gICAgT01YU3RvcmUoCi0gICAgICAgICAgICBjb25zdCBjaGFyKiBvd25lciA9ICJkZWZhdWx0IiwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbnN0KiBzZWFyY2hEaXJzCi0gICAgICAgICAgICAgICAgPSBNZWRpYUNvZGVjc1htbFBhcnNlcjo6ZGVmYXVsdFNlYXJjaERpcnMsCi0gICAgICAgICAgICBjb25zdCBjaGFyKiBtYWluWG1sTmFtZQotICAgICAgICAgICAgICAgID0gTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmRlZmF1bHRNYWluWG1sTmFtZSwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBlcmZvcm1hbmNlWG1sTmFtZQotICAgICAgICAgICAgICAgID0gTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmRlZmF1bHRQZXJmb3JtYW5jZVhtbE5hbWUsCi0gICAgICAgICAgICBjb25zdCBjaGFyKiBwcm9maWxpbmdSZXN1bHRzWG1sUGF0aAotICAgICAgICAgICAgICAgID0gTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmRlZmF1bHRQcm9maWxpbmdSZXN1bHRzWG1sUGF0aCk7Ci0KLSAgICBzdGF0dXNfdCBsaXN0U2VydmljZUF0dHJpYnV0ZXMoCi0gICAgICAgICAgICBzdGQ6OnZlY3RvcjxBdHRyaWJ1dGU+KiBhdHRyaWJ1dGVzKSBvdmVycmlkZTsKLQotICAgIHN0YXR1c190IGdldE5vZGVQcmVmaXgoc3RkOjpzdHJpbmcqIHByZWZpeCkgb3ZlcnJpZGU7Ci0KLSAgICBzdGF0dXNfdCBsaXN0Um9sZXMoc3RkOjp2ZWN0b3I8Um9sZUluZm8+KiByb2xlTGlzdCkgb3ZlcnJpZGU7Ci0KLSAgICBzdGF0dXNfdCBnZXRPbXgoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIHNwPElPTVg+KiBvbXgpIG92ZXJyaWRlOwotCi0gICAgfk9NWFN0b3JlKCkgb3ZlcnJpZGU7Ci0KLXByb3RlY3RlZDoKLSAgICBzdGF0dXNfdCBtUGFyc2luZ1N0YXR1czsKLSAgICBzdGQ6OnN0cmluZyBtUHJlZml4OwotICAgIHN0ZDo6dmVjdG9yPEF0dHJpYnV0ZT4gbVNlcnZpY2VBdHRyaWJ1dGVMaXN0OwotICAgIHN0ZDo6dmVjdG9yPFJvbGVJbmZvPiBtUm9sZUxpc3Q7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIEFORFJPSURfT01YU1RPUkVfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9PbXhHcmFwaGljQnVmZmVyU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT214R3JhcGhpY0J1ZmZlclNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxOGUwY2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT214R3JhcGhpY0J1ZmZlclNvdXJjZS5oCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE9NWF9HUkFQSElDX0JVRkZFUl9TT1VSQ0VfSF8KKworI2RlZmluZSBPTVhfR1JBUEhJQ19CVUZGRVJfU09VUkNFX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9HcmFwaGljQnVmZmVyU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9CbkdyYXBoaWNCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL0JuT01YQnVmZmVyU291cmNlLmg+CisKKyNpbmNsdWRlICJJT214Tm9kZVdyYXBwZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOworCisvKgorICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGZlZWQgT01YIGNvZGVjcyBmcm9tIGEgU3VyZmFjZSB2aWEgQnVmZmVyUXVldWUgb3IKKyAqIEhXIHByb2R1Y2VyLgorICoKKyAqIFNlZSBtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9HcmFwaGljQnVmZmVyU291cmNlLmggZm9yIGRvY3VtZW50YXRpb24uCisgKi8KK2NsYXNzIE9teEdyYXBoaWNCdWZmZXJTb3VyY2UgOiBwdWJsaWMgR3JhcGhpY0J1ZmZlclNvdXJjZSB7CitwdWJsaWM6CisgICAgT214R3JhcGhpY0J1ZmZlclNvdXJjZSgpID0gZGVmYXVsdDsKKyAgICB2aXJ0dWFsIH5PbXhHcmFwaGljQnVmZmVyU291cmNlKCkgPSBkZWZhdWx0OworCisgICAgLy8gT214QnVmZmVyU291cmNlIGludGVyZmFjZQorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiBPTVggdHJhbnNpdGlvbnMgdG8gT01YX1N0YXRlRXhlY3V0aW5nLCB3aGljaCBtZWFucworICAgIC8vIHdlIGNhbiBzdGFydCBoYW5kaW5nIGl0IGJ1ZmZlcnMuICBJZiB3ZSBhbHJlYWR5IGhhdmUgYnVmZmVycyBvZiBkYXRhCisgICAgLy8gc2l0dGluZyBpbiB0aGUgQnVmZmVyUXVldWUsIHRoaXMgd2lsbCBzZW5kIHRoZW0gdG8gdGhlIGNvZGVjLgorICAgIFN0YXR1cyBvbk9teEV4ZWN1dGluZygpOworCisgICAgLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiBPTVggdHJhbnNpdGlvbnMgdG8gT01YX1N0YXRlSWRsZSwgaW5kaWNhdGluZyB0aGF0CisgICAgLy8gdGhlIGNvZGVjIGlzIG1lYW50IHRvIHJldHVybiBhbGwgYnVmZmVycyBiYWNrIHRvIHRoZSBjbGllbnQgZm9yIHRoZW0KKyAgICAvLyB0byBiZSBmcmVlZC4gRG8gTk9UIHN1Ym1pdCBhbnkgbW9yZSBidWZmZXJzIHRvIHRoZSBjb21wb25lbnQuCisgICAgU3RhdHVzIG9uT214SWRsZSgpOworCisgICAgLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiBPTVggdHJhbnNpdGlvbnMgdG8gT01YX1N0YXRlTG9hZGVkLCBpbmRpY2F0aW5nIHRoYXQKKyAgICAvLyB3ZSBhcmUgc2h1dHRpbmcgZG93bi4KKyAgICBTdGF0dXMgb25PbXhMb2FkZWQoKTsKKworICAgIC8vIFJlc3Qgb2YgdGhlIGludGVyZmFjZSBpbiBHcmFwaGljQnVmZmVyU291cmNlLgorCisgICAgLy8gSUdyYXBoaWNCdWZmZXJTb3VyY2UgaW50ZXJmYWNlCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvLyBDb25maWd1cmUgdGhlIGJ1ZmZlciBzb3VyY2UgdG8gYmUgdXNlZCB3aXRoIGFuIE9NWCBub2RlIHdpdGggdGhlIGRlZmF1bHQKKyAgICAvLyBkYXRhIHNwYWNlLgorICAgIHN0YXR1c190IGNvbmZpZ3VyZSgKKyAgICAgICAgY29uc3Qgc3A8SU9teE5vZGVXcmFwcGVyPiAmb214Tm9kZSwKKyAgICAgICAgaW50MzJfdCBkYXRhU3BhY2UsCisgICAgICAgIGludDMyX3QgYnVmZmVyQ291bnQsCisgICAgICAgIHVpbnQzMl90IGZyYW1lV2lkdGgsCisgICAgICAgIHVpbnQzMl90IGZyYW1lSGVpZ2h0LAorICAgICAgICB1aW50MzJfdCBjb25zdW1lclVzYWdlKTsKKworICAgIC8vIFJlc3Qgb2YgdGhlIGludGVyZmFjZSBpbiBHcmFwaGljQnVmZmVyU291cmNlLgorCitwcml2YXRlOgorICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE9teEdyYXBoaWNCdWZmZXJTb3VyY2UpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBPTVhfR1JBUEhJQ19CVUZGRVJfU09VUkNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaAppbmRleCBjOWZkNzQ1Li41NmZjNjkxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmgKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyUmVmbGVjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+CiAKICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgpAQCAtNDYsNiArNDcsNyBAQAogcHJvdGVjdGVkOgogICAgIGVudW0gewogICAgICAgICBrRGVzY3JpYmVDb2xvckFzcGVjdHNJbmRleCA9IGtQcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFja0luZGV4ICsgMSwKKyAgICAgICAga0Rlc2NyaWJlSGRyU3RhdGljSW5mb0luZGV4ID0ga1ByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrSW5kZXggKyAyLAogICAgIH07CiAKICAgICBlbnVtIHsKQEAgLTc2LDYgKzc4LDggQEAKIAogICAgIHZpcnR1YWwgaW50IGdldENvbG9yQXNwZWN0UHJlZmVyZW5jZSgpOwogCisgICAgdmlydHVhbCBib29sIHN1cHBvcnREZXNjcmliZUhkclN0YXRpY0luZm8oKTsKKwogICAgIC8vIFRoaXMgZnVuY3Rpb24gc2V0cyBib3RoIG1pbmltdW0gYnVmZmVyIGNvdW50IGFuZCBhY3R1YWwgYnVmZmVyIGNvdW50IG9mCiAgICAgLy8gaW5wdXQgcG9ydCB0byBiZSB8bnVtSW5wdXRCdWZmZXJzfC4gSXQgd2lsbCBhbHNvIHNldCBib3RoIG1pbmltdW0gYnVmZmVyCiAgICAgLy8gY291bnQgYW5kIGFjdHVhbCBidWZmZXIgY291bnQgb2Ygb3V0cHV0IHBvcnQgdG8gYmUgfG51bU91dHB1dEJ1ZmZlcnN8LgpAQCAtMTEzLDcgKzExNyw5IEBACiAgICAgLy8gSXQgd2lsbCB0cmlnZ2VyIE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQgZXZlbnQgaWYgbmVjZXNzYXJ5LgogICAgIHZvaWQgaGFuZGxlUG9ydFNldHRpbmdzQ2hhbmdlKAogICAgICAgICAgICAgYm9vbCAqcG9ydFdpbGxSZXNldCwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKLSAgICAgICAgICAgIENyb3BTZXR0aW5nc01vZGUgY3JvcFNldHRpbmdzTW9kZSA9IGtDcm9wVW5TZXQsIGJvb2wgZmFrZVN0cmlkZSA9IGZhbHNlKTsKKyAgICAgICAgICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIG91dHB1dEZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIsCisgICAgICAgICAgICBDcm9wU2V0dGluZ3NNb2RlIGNyb3BTZXR0aW5nc01vZGUgPSBrQ3JvcFVuU2V0LAorICAgICAgICAgICAgYm9vbCBmYWtlU3RyaWRlID0gZmFsc2UpOwogCiAgICAgdm9pZCBjb3B5WVYxMkZyYW1lVG9PdXRwdXRCdWZmZXIoCiAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyY1ksIGNvbnN0IHVpbnQ4X3QgKnNyY1UsIGNvbnN0IHVpbnQ4X3QgKnNyY1YsCkBAIC0xMjksNyArMTM1LDggQEAKICAgICB1aW50MzJfdCBtQWRhcHRpdmVNYXhXaWR0aCwgbUFkYXB0aXZlTWF4SGVpZ2h0OwogICAgIHVpbnQzMl90IG1XaWR0aCwgbUhlaWdodDsKICAgICB1aW50MzJfdCBtQ3JvcExlZnQsIG1Dcm9wVG9wLCBtQ3JvcFdpZHRoLCBtQ3JvcEhlaWdodDsKLQorICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIG1PdXRwdXRGb3JtYXQ7CisgICAgSERSU3RhdGljSW5mbyBtSGRyU3RhdGljSW5mbzsKICAgICBlbnVtIHsKICAgICAgICAgTk9ORSwKICAgICAgICAgQVdBSVRJTkdfRElTQUJMRUQsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IDhiY2I5OWUuLjNiNTIxYWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9BbmRyb2lkLmJwCkBAIC04LDYgKzgsOCBAQAogICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYm1lZGlhX29teCIsCisgICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCkBAIC0zMiwyMSArMzQsMyBAQAogCiAgICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KLQotY2NfdGVzdCB7Ci0gICAgbmFtZTogIkZyYW1lRHJvcHBlcl90ZXN0IiwKLQotICAgIHNyY3M6IFsiRnJhbWVEcm9wcGVyX3Rlc3QuY3BwIl0sCi0KLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICBdLAotCi0gICAgaW5jbHVkZV9kaXJzOiBbImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214Il0sCi0KLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1XZXJyb3IiLAotICAgICAgICAiLVdhbGwiLAotICAgIF0sCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvRnJhbWVEcm9wcGVyX3Rlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0ZyYW1lRHJvcHBlcl90ZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkyNWRhNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvRnJhbWVEcm9wcGVyX3Rlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIkZyYW1lRHJvcHBlcl90ZXN0IgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9GcmFtZURyb3BwZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBUZXN0RnJhbWUgewotICBpbnQ2NF90IHRpbWVVczsKLSAgYm9vbCBzaG91bGREcm9wOwotfTsKLQotc3RhdGljIGNvbnN0IFRlc3RGcmFtZSB0ZXN0RnJhbWVzMjBGcHNbXSA9IHsKLSAgICB7MTAwMDAwMCwgZmFsc2V9LCB7MTA1MDAwMCwgZmFsc2V9LCB7MTEwMDAwMCwgZmFsc2V9LCB7MTE1MDAwMCwgZmFsc2V9LAotICAgIHsxMjAwMDAwLCBmYWxzZX0sIHsxMjUwMDAwLCBmYWxzZX0sIHsxMzAwMDAwLCBmYWxzZX0sIHsxMzUwMDAwLCBmYWxzZX0sCi0gICAgezE0MDAwMDAsIGZhbHNlfSwgezE0NTAwMDAsIGZhbHNlfSwgezE1MDAwMDAsIGZhbHNlfSwgezE1NTAwMDAsIGZhbHNlfSwKLSAgICB7MTYwMDAwMCwgZmFsc2V9LCB7MTY1MDAwMCwgZmFsc2V9LCB7MTcwMDAwMCwgZmFsc2V9LCB7MTc1MDAwMCwgZmFsc2V9LAotICAgIHsxODAwMDAwLCBmYWxzZX0sIHsxODUwMDAwLCBmYWxzZX0sIHsxOTAwMDAwLCBmYWxzZX0sIHsxOTUwMDAwLCBmYWxzZX0sCi19OwotCi1zdGF0aWMgY29uc3QgVGVzdEZyYW1lIHRlc3RGcmFtZXMzMEZwc1tdID0gewotICAgIHsxMDAwMDAwLCBmYWxzZX0sIHsxMDMzMzMzLCBmYWxzZX0sIHsxMDY2NjY3LCBmYWxzZX0sIHsxMTAwMDAwLCBmYWxzZX0sCi0gICAgezExMzMzMzMsIGZhbHNlfSwgezExNjY2NjcsIGZhbHNlfSwgezEyMDAwMDAsIGZhbHNlfSwgezEyMzMzMzMsIGZhbHNlfSwKLSAgICB7MTI2NjY2NywgZmFsc2V9LCB7MTMwMDAwMCwgZmFsc2V9LCB7MTMzMzMzMywgZmFsc2V9LCB7MTM2NjY2NywgZmFsc2V9LAotICAgIHsxNDAwMDAwLCBmYWxzZX0sIHsxNDMzMzMzLCBmYWxzZX0sIHsxNDY2NjY3LCBmYWxzZX0sIHsxNTAwMDAwLCBmYWxzZX0sCi0gICAgezE1MzMzMzMsIGZhbHNlfSwgezE1NjY2NjcsIGZhbHNlfSwgezE2MDAwMDAsIGZhbHNlfSwgezE2MzMzMzMsIGZhbHNlfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBUZXN0RnJhbWUgdGVzdEZyYW1lczQwRnBzW10gPSB7Ci0gICAgezEwMDAwMDAsIGZhbHNlfSwgezEwMjUwMDAsIHRydWV9LCB7MTA1MDAwMCwgZmFsc2V9LCB7MTA3NTAwMCwgZmFsc2V9LAotICAgIHsxMTAwMDAwLCBmYWxzZX0sIHsxMTI1MDAwLCB0cnVlfSwgezExNTAwMDAsIGZhbHNlfSwgezExNzUwMDAsIGZhbHNlfSwKLSAgICB7MTIwMDAwMCwgZmFsc2V9LCB7MTIyNTAwMCwgdHJ1ZX0sIHsxMjUwMDAwLCBmYWxzZX0sIHsxMjc1MDAwLCBmYWxzZX0sCi0gICAgezEzMDAwMDAsIGZhbHNlfSwgezEzMjUwMDAsIHRydWV9LCB7MTM1MDAwMCwgZmFsc2V9LCB7MTM3NTAwMCwgZmFsc2V9LAotICAgIHsxNDAwMDAwLCBmYWxzZX0sIHsxNDI1MDAwLCB0cnVlfSwgezE0NTAwMDAsIGZhbHNlfSwgezE0NzUwMDAsIGZhbHNlfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBUZXN0RnJhbWUgdGVzdEZyYW1lczYwRnBzW10gPSB7Ci0gICAgezEwMDAwMDAsIGZhbHNlfSwgezEwMTY2NjcsIHRydWV9LCB7MTAzMzMzMywgZmFsc2V9LCB7MTA1MDAwMCwgdHJ1ZX0sCi0gICAgezEwNjY2NjcsIGZhbHNlfSwgezEwODMzMzMsIHRydWV9LCB7MTEwMDAwMCwgZmFsc2V9LCB7MTExNjY2NywgdHJ1ZX0sCi0gICAgezExMzMzMzMsIGZhbHNlfSwgezExNTAwMDAsIHRydWV9LCB7MTE2NjY2NywgZmFsc2V9LCB7MTE4MzMzMywgdHJ1ZX0sCi0gICAgezEyMDAwMDAsIGZhbHNlfSwgezEyMTY2NjcsIHRydWV9LCB7MTIzMzMzMywgZmFsc2V9LCB7MTI1MDAwMCwgdHJ1ZX0sCi0gICAgezEyNjY2NjcsIGZhbHNlfSwgezEyODMzMzMsIHRydWV9LCB7MTMwMDAwMCwgZmFsc2V9LCB7MTMxNjY2NywgdHJ1ZX0sCi19OwotCi1zdGF0aWMgY29uc3QgVGVzdEZyYW1lIHRlc3RGcmFtZXNWYXJpYWJsZUZwc1tdID0gewotICAgIC8vIDQwZnBzCi0gICAgezEwMDAwMDAsIGZhbHNlfSwgezEwMjUwMDAsIHRydWV9LCB7MTA1MDAwMCwgZmFsc2V9LCB7MTA3NTAwMCwgZmFsc2V9LAotICAgIHsxMTAwMDAwLCBmYWxzZX0sIHsxMTI1MDAwLCB0cnVlfSwgezExNTAwMDAsIGZhbHNlfSwgezExNzUwMDAsIGZhbHNlfSwKLSAgICB7MTIwMDAwMCwgZmFsc2V9LCB7MTIyNTAwMCwgdHJ1ZX0sIHsxMjUwMDAwLCBmYWxzZX0sIHsxMjc1MDAwLCBmYWxzZX0sCi0gICAgezEzMDAwMDAsIGZhbHNlfSwgezEzMjUwMDAsIHRydWV9LCB7MTM1MDAwMCwgZmFsc2V9LCB7MTM3NTAwMCwgZmFsc2V9LAotICAgIHsxNDAwMDAwLCBmYWxzZX0sIHsxNDI1MDAwLCB0cnVlfSwgezE0NTAwMDAsIGZhbHNlfSwgezE0NzUwMDAsIGZhbHNlfSwKLSAgICAvLyBhIHRpbWVzdGFtcCBqdW1wIHBsdXMgc3dpdGNoIHRvIDIwZnBzCi0gICAgezIwMDAwMDAsIGZhbHNlfSwgezIwNTAwMDAsIGZhbHNlfSwgezIxMDAwMDAsIGZhbHNlfSwgezIxNTAwMDAsIGZhbHNlfSwKLSAgICB7MjIwMDAwMCwgZmFsc2V9LCB7MjI1MDAwMCwgZmFsc2V9LCB7MjMwMDAwMCwgZmFsc2V9LCB7MjM1MDAwMCwgZmFsc2V9LAotICAgIHsyNDAwMDAwLCBmYWxzZX0sIHsyNDUwMDAwLCBmYWxzZX0sIHsyNTAwMDAwLCBmYWxzZX0sIHsyNTUwMDAwLCBmYWxzZX0sCi0gICAgezI2MDAwMDAsIGZhbHNlfSwgezI2NTAwMDAsIGZhbHNlfSwgezI3MDAwMDAsIGZhbHNlfSwgezI3NTAwMDAsIGZhbHNlfSwKLSAgICB7MjgwMDAwMCwgZmFsc2V9LCB7Mjg1MDAwMCwgZmFsc2V9LCB7MjkwMDAwMCwgZmFsc2V9LCB7Mjk1MDAwMCwgZmFsc2V9LAotICAgIC8vIDYwZnBzCi0gICAgezI5NjY2NjcsIGZhbHNlfSwgezI5ODMzMzMsIHRydWV9LCB7MzAwMDAwMCwgZmFsc2V9LCB7MzAxNjY2NywgdHJ1ZX0sCi0gICAgezMwMzMzMzMsIGZhbHNlfSwgezMwNTAwMDAsIHRydWV9LCB7MzA2NjY2NywgZmFsc2V9LCB7MzA4MzMzMywgdHJ1ZX0sCi0gICAgezMxMDAwMDAsIGZhbHNlfSwgezMxMTY2NjcsIHRydWV9LCB7MzEzMzMzMywgZmFsc2V9LCB7MzE1MDAwMCwgdHJ1ZX0sCi0gICAgezMxNjY2NjcsIGZhbHNlfSwgezMxODMzMzMsIHRydWV9LCB7MzIwMDAwMCwgZmFsc2V9LCB7MzIxNjY2NywgdHJ1ZX0sCi0gICAgezMyMzMzMzMsIGZhbHNlfSwgezMyNTAwMDAsIHRydWV9LCB7MzI2NjY2NywgZmFsc2V9LCB7MzI4MzMzMywgdHJ1ZX0sCi19OwotCi1zdGF0aWMgY29uc3QgaW50IGtNYXhUZXN0Sml0dGVyVXMgPSAyMDAwOwotLy8gcmV0dXJuIG9uZSBvZiAxMDAwLCAwLCAtMTAwMCBhcyBqaXR0ZXIuCi1zdGF0aWMgaW50IEdldEppdHRlcihzaXplX3QgaSkgewotICAgIHJldHVybiAoMSAtIChpICUgMykpICogKGtNYXhUZXN0Sml0dGVyVXMgLyAyKTsKLX0KLQotY2xhc3MgRnJhbWVEcm9wcGVyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotcHVibGljOgotICAgIEZyYW1lRHJvcHBlclRlc3QoKSA6IG1GcmFtZURyb3BwZXIobmV3IEZyYW1lRHJvcHBlcigpKSB7Ci0gICAgICAgIEVYUEVDVF9FUShPSywgbUZyYW1lRHJvcHBlci0+c2V0TWF4RnJhbWVSYXRlKDMwLjApKTsKLSAgICB9Ci0KLXByb3RlY3RlZDoKLSAgICB2b2lkIFJ1blRlc3QoY29uc3QgVGVzdEZyYW1lKiBmcmFtZXMsIHNpemVfdCBzaXplKSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0gICAgICAgICAgICBpbnQgaml0dGVyID0gR2V0Sml0dGVyKGkpOwotICAgICAgICAgICAgaW50NjRfdCB0ZXN0VGltZVVzID0gZnJhbWVzW2ldLnRpbWVVcyArIGppdHRlcjsKLSAgICAgICAgICAgIHByaW50ZigidGltZSAlbGxkLCB0ZXN0VGltZSAlbGxkLCBqaXR0ZXIgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpZnJhbWVzW2ldLnRpbWVVcywgKGxvbmcgbG9uZyl0ZXN0VGltZVVzLCBqaXR0ZXIpOwotICAgICAgICAgICAgRVhQRUNUX0VRKGZyYW1lc1tpXS5zaG91bGREcm9wLCBtRnJhbWVEcm9wcGVyLT5zaG91bGREcm9wKHRlc3RUaW1lVXMpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHNwPEZyYW1lRHJvcHBlcj4gbUZyYW1lRHJvcHBlcjsKLX07Ci0KLVRFU1RfRihGcmFtZURyb3BwZXJUZXN0LCBUZXN0SW52YWxpZE1heEZyYW1lUmF0ZSkgewotICAgIEVYUEVDVF9ORShPSywgbUZyYW1lRHJvcHBlci0+c2V0TWF4RnJhbWVSYXRlKC0xLjApKTsKLSAgICBFWFBFQ1RfTkUoT0ssIG1GcmFtZURyb3BwZXItPnNldE1heEZyYW1lUmF0ZSgwKSk7Ci19Ci0KLVRFU1RfRihGcmFtZURyb3BwZXJUZXN0LCBUZXN0MjBGcHMpIHsKLSAgICBSdW5UZXN0KHRlc3RGcmFtZXMyMEZwcywgQVJSQVlfU0laRSh0ZXN0RnJhbWVzMjBGcHMpKTsKLX0KLQotVEVTVF9GKEZyYW1lRHJvcHBlclRlc3QsIFRlc3QzMEZwcykgewotICAgIFJ1blRlc3QodGVzdEZyYW1lczMwRnBzLCBBUlJBWV9TSVpFKHRlc3RGcmFtZXMzMEZwcykpOwotfQotCi1URVNUX0YoRnJhbWVEcm9wcGVyVGVzdCwgVGVzdDQwRnBzKSB7Ci0gICAgUnVuVGVzdCh0ZXN0RnJhbWVzNDBGcHMsIEFSUkFZX1NJWkUodGVzdEZyYW1lczQwRnBzKSk7Ci19Ci0KLVRFU1RfRihGcmFtZURyb3BwZXJUZXN0LCBUZXN0NjBGcHMpIHsKLSAgICBSdW5UZXN0KHRlc3RGcmFtZXM2MEZwcywgQVJSQVlfU0laRSh0ZXN0RnJhbWVzNjBGcHMpKTsKLX0KLQotVEVTVF9GKEZyYW1lRHJvcHBlclRlc3QsIFRlc3RWYXJpYWJsZUZwcykgewotICAgIFJ1blRlc3QodGVzdEZyYW1lc1ZhcmlhYmxlRnBzLCBBUlJBWV9TSVpFKHRlc3RGcmFtZXNWYXJpYWJsZUZwcykpOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvT01YSGFybmVzcy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvT01YSGFybmVzcy5jcHAKaW5kZXggMzI2NjQzOS4uODk1YTRjZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL09NWEhhcm5lc3MuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9PTVhIYXJuZXNzLmNwcApAQCAtMjUsMjAgKzI1LDIyIEBACiAKICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUNvZGVjU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9PTVhCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlRmFjdG9yeS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ludGVyZmFjZVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1NpbXBsZURlY29kaW5nU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvT01YQnVmZmVyLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXguaD4KICNpbmNsdWRlIDxtZWRpYS9vbXgvMS4wL1dPbXguaD4KICNpbmNsdWRlIDxzeXN0ZW0vd2luZG93Lmg+CkBAIC02Nyw3ICs2OSw3IEBACiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogSGFybmVzczo6SGFybmVzcygpCi0gICAgOiBtSW5pdENoZWNrKE5PX0lOSVQpLCBtVXNlVHJlYmxlKGZhbHNlKSB7CisgICAgOiBtSW5pdENoZWNrKE5PX0lOSVQpIHsKICAgICBtSW5pdENoZWNrID0gaW5pdE9NWCgpOwogfQogCkBAIC03OSwyMSArODEsMTIgQEAKIH0KIAogc3RhdHVzX3QgSGFybmVzczo6aW5pdE9NWCgpIHsKLSAgICBpZiAocHJvcGVydHlfZ2V0X2Jvb2woInBlcnNpc3QubWVkaWEudHJlYmxlX29teCIsIHRydWUpKSB7Ci0gICAgICAgIHVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOwotICAgICAgICBzcDxJT214PiB0T214ID0gSU9teDo6Z2V0U2VydmljZSgpOwotICAgICAgICBpZiAodE9teCA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICAgICAgfQotICAgICAgICBtT01YID0gbmV3IHV0aWxzOjpMV09teCh0T214KTsKLSAgICAgICAgbVVzZVRyZWJsZSA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwotICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBzbS0+Z2V0U2VydmljZShTdHJpbmcxNigibWVkaWEuY29kZWMiKSk7Ci0gICAgICAgIHNwPElNZWRpYUNvZGVjU2VydmljZT4gc2VydmljZSA9IGludGVyZmFjZV9jYXN0PElNZWRpYUNvZGVjU2VydmljZT4oYmluZGVyKTsKLSAgICAgICAgbU9NWCA9IHNlcnZpY2UtPmdldE9NWCgpOwotICAgICAgICBtVXNlVHJlYmxlID0gZmFsc2U7CisgICAgdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA7CisgICAgc3A8SU9teD4gdE9teCA9IElPbXg6OmdldFNlcnZpY2UoKTsKKyAgICBpZiAodE9teCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KKyAgICBtT01YID0gbmV3IHV0aWxzOjpMV09teCh0T214KTsKIAogICAgIHJldHVybiBtT01YICE9IDAgPyBPSyA6IE5PX0lOSVQ7CiB9CkBAIC0yMjEsMjUgKzIxNCwxOSBAQAogICAgIGZvciAoT01YX1UzMiBpID0gMDsgaSA8IGRlZi5uQnVmZmVyQ291bnRBY3R1YWw7ICsraSkgewogICAgICAgICBCdWZmZXIgYnVmZmVyOwogICAgICAgICBidWZmZXIubUZsYWdzID0gMDsKLSAgICAgICAgaWYgKG1Vc2VUcmVibGUpIHsKLSAgICAgICAgICAgIGJvb2wgc3VjY2VzczsKLSAgICAgICAgICAgIGF1dG8gdHJhbnNTdGF0dXMgPSBtQWxsb2NhdG9yLT5hbGxvY2F0ZShkZWYubkJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgIFsmc3VjY2VzcywgJmJ1ZmZlcl0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGxfbWVtb3J5IGNvbnN0JiBtKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gczsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5tSGlkbE1lbW9yeSA9IG07Ci0gICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgRVhQRUNUKHRyYW5zU3RhdHVzLmlzT2soKSwKLSAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBjYWxsIGFsbG9jYXRvciIpOwotICAgICAgICAgICAgRVhQRUNUKHN1Y2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICJDYW5ub3QgYWxsb2NhdGUgbWVtb3J5Iik7Ci0gICAgICAgICAgICBlcnIgPSBtT01YTm9kZS0+dXNlQnVmZmVyKHBvcnRJbmRleCwgYnVmZmVyLm1IaWRsTWVtb3J5LCAmYnVmZmVyLm1JRCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBidWZmZXIubU1lbW9yeSA9IG1EZWFsZXItPmFsbG9jYXRlKGRlZi5uQnVmZmVyU2l6ZSk7Ci0gICAgICAgICAgICBDSEVDSyhidWZmZXIubU1lbW9yeSAhPSBOVUxMKTsKLSAgICAgICAgICAgIGVyciA9IG1PTVhOb2RlLT51c2VCdWZmZXIocG9ydEluZGV4LCBidWZmZXIubU1lbW9yeSwgJmJ1ZmZlci5tSUQpOwotICAgICAgICB9CisgICAgICAgIGJvb2wgc3VjY2VzczsKKyAgICAgICAgYXV0byB0cmFuc1N0YXR1cyA9IG1BbGxvY2F0b3ItPmFsbG9jYXRlKGRlZi5uQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICBbJnN1Y2Nlc3MsICZidWZmZXJdKAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzLAorICAgICAgICAgICAgICAgICAgICAgICAgaGlkbF9tZW1vcnkgY29uc3QmIG0pIHsKKyAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IHM7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5tSGlkbE1lbW9yeSA9IG07CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIEVYUEVDVCh0cmFuc1N0YXR1cy5pc09rKCksCisgICAgICAgICAgICAgICAgIkNhbm5vdCBjYWxsIGFsbG9jYXRvciIpOworICAgICAgICBFWFBFQ1Qoc3VjY2VzcywKKyAgICAgICAgICAgICAgICAiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSIpOworICAgICAgICBlcnIgPSBtT01YTm9kZS0+dXNlQnVmZmVyKHBvcnRJbmRleCwgYnVmZmVyLm1IaWRsTWVtb3J5LCAmYnVmZmVyLm1JRCk7CiAKICAgICAgICAgRVhQRUNUX1NVQ0NFU1MoZXJyLCAidXNlQnVmZmVyIik7CiAKQEAgLTI5MSwxMyArMjc4LDEzIEBACiAKIHN0YXRpYyBzcDxJTWVkaWFFeHRyYWN0b3I+IENyZWF0ZUV4dHJhY3RvckZyb21VUkkoY29uc3QgY2hhciAqdXJpKSB7CiAgICAgc3A8RGF0YVNvdXJjZT4gc291cmNlID0KLSAgICAgICAgRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSShOVUxMIC8qIGh0dHBTZXJ2aWNlICovLCB1cmkpOworICAgICAgICBEYXRhU291cmNlRmFjdG9yeTo6Q3JlYXRlRnJvbVVSSShOVUxMIC8qIGh0dHBTZXJ2aWNlICovLCB1cmkpOwogCiAgICAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIHJldHVybiBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRlKHNvdXJjZSk7CisgICAgcmV0dXJuIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Q3JlYXRlKHNvdXJjZSk7CiB9CiAKIHN0YXR1c190IEhhcm5lc3M6OnRlc3RTdGF0ZVRyYW5zaXRpb25zKApAQCAtMzA4LDEzICsyOTUsMTEgQEAKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAotICAgIGlmIChtVXNlVHJlYmxlKSB7Ci0gICAgICAgIG1BbGxvY2F0b3IgPSBJQWxsb2NhdG9yOjpnZXRTZXJ2aWNlKCJhc2htZW0iKTsKLSAgICAgICAgRVhQRUNUKG1BbGxvY2F0b3IgIT0gbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAiQ2Fubm90IG9idGFpbiBoaWRsIEFzaG1lbUFsbG9jYXRvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1EZWFsZXIgPSBuZXcgTWVtb3J5RGVhbGVyKDE2ICogMTAyNCAqIDEwMjQsICJPTVhIYXJuZXNzIik7Ci0gICAgfQorICAgIG1BbGxvY2F0b3IgPSBJQWxsb2NhdG9yOjpnZXRTZXJ2aWNlKCJhc2htZW0iKTsKKyAgICBFWFBFQ1QobUFsbG9jYXRvciAhPSBudWxscHRyLAorICAgICAgICAgICAgIkNhbm5vdCBvYnRhaW4gaGlkbCBBc2htZW1BbGxvY2F0b3IiKTsKKyAgICAvLyBUT0RPOiBXaGVuIFRyZWJsZSBoYXMgTWVtb3J5SGVhcC9NZW1vcnlEZWFsZXIsIHdlIHNob3VsZCBzcGVjaWZ5IHRoZSBoZWFwCisgICAgLy8gc2l6ZSB0byBiZSAxNiAqIDEwMjQgKiAxMDI0LgogCiAgICAgc3A8Q29kZWNPYnNlcnZlcj4gb2JzZXJ2ZXIgPSBuZXcgQ29kZWNPYnNlcnZlcih0aGlzLCArK21DdXJHZW5lcmF0aW9uKTsKIApAQCAtNTQzLDcgKzUyOCw3IEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBzcDxJTWVkaWFTb3VyY2U+IENyZWF0ZVNvdXJjZUZvck1pbWUoY29uc3QgY2hhciAqbWltZSkgeworc3RhdGljIHNwPE1lZGlhU291cmNlPiBDcmVhdGVTb3VyY2VGb3JNaW1lKGNvbnN0IGNoYXIgKm1pbWUpIHsKICAgICBjb25zdCBjaGFyICp1cmwgPSBHZXRVUkxGb3JNaW1lKG1pbWUpOwogCiAgICAgaWYgKHVybCA9PSBOVUxMKSB7CkBAIC01NjQsNyArNTQ5LDcgQEAKICAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmdHJhY2tNaW1lKSk7CiAKICAgICAgICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIHRyYWNrTWltZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBleHRyYWN0b3ItPmdldFRyYWNrKGkpOworICAgICAgICAgICAgcmV0dXJuIENyZWF0ZU1lZGlhU291cmNlRnJvbUlNZWRpYVNvdXJjZShleHRyYWN0b3ItPmdldFRyYWNrKGkpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNjEwLDcgKzU5NSw3IEBACiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKLSAgICBzcDxJTWVkaWFTb3VyY2U+IHNvdXJjZSA9IENyZWF0ZVNvdXJjZUZvck1pbWUobWltZSk7CisgICAgc3A8TWVkaWFTb3VyY2U+IHNvdXJjZSA9IENyZWF0ZVNvdXJjZUZvck1pbWUobWltZSk7CiAKICAgICBpZiAoc291cmNlID09IE5VTEwpIHsKICAgICAgICAgcHJpbnRmKCIgICogVW5hYmxlIHRvIG9wZW4gdGVzdCBjb250ZW50IGZvciB0eXBlICclcycsICIKQEAgLTYyMCwxNCArNjA1LDE0IEBACiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKLSAgICBzcDxJTWVkaWFTb3VyY2U+IHNlZWtTb3VyY2UgPSBDcmVhdGVTb3VyY2VGb3JNaW1lKG1pbWUpOworICAgIHNwPE1lZGlhU291cmNlPiBzZWVrU291cmNlID0gQ3JlYXRlU291cmNlRm9yTWltZShtaW1lKTsKICAgICBpZiAoc291cmNlID09IE5VTEwgfHwgc2Vla1NvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KIAogICAgIENIRUNLX0VRKHNlZWtTb3VyY2UtPnN0YXJ0KCksIChzdGF0dXNfdClPSyk7CiAKLSAgICBzcDxJTWVkaWFTb3VyY2U+IGNvZGVjID0gU2ltcGxlRGVjb2RpbmdTb3VyY2U6OkNyZWF0ZSgKKyAgICBzcDxNZWRpYVNvdXJjZT4gY29kZWMgPSBTaW1wbGVEZWNvZGluZ1NvdXJjZTo6Q3JlYXRlKAogICAgICAgICAgICAgc291cmNlLCAwIC8qIGZsYWdzICovLCBOVUxMIC8qIG5hdGl2ZVdpbmRvdyAqLywgY29tcG9uZW50TmFtZSk7CiAKICAgICBDSEVDSyhjb2RlYyAhPSBOVUxMKTsKQEAgLTY3Myw3ICs2NTgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkU2Vla1RpbWVVcywgcmVxdWVzdGVkU2Vla1RpbWVVcyAvIDFFNik7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXIgPSBOVUxMOworICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXIgPSBOVUxMOwogICAgICAgICAgICAgb3B0aW9ucy5zZXRTZWVrVG8oCiAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZFNlZWtUaW1lVXMsIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19ORVhUX1NZTkMpOwogCkBAIC02ODIsNyArNjY3LDcgQEAKICAgICAgICAgICAgICAgICBhY3R1YWxTZWVrVGltZVVzID0gLTE7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIENIRUNLKGJ1ZmZlciAhPSBOVUxMKTsKLSAgICAgICAgICAgICAgICBDSEVDSyhidWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZhY3R1YWxTZWVrVGltZVVzKSk7CisgICAgICAgICAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhX2RhdGEoKS5maW5kSW50NjQoa0tleVRpbWUsICZhY3R1YWxTZWVrVGltZVVzKSk7CiAgICAgICAgICAgICAgICAgQ0hFQ0soYWN0dWFsU2Vla1RpbWVVcyA+PSAwKTsKIAogICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwpAQCAtNjk0LDcgKzY3OSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBzdGF0dXNfdCBlcnI7Ci0gICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXI7CisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyOwogICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgICBlcnIgPSBjb2RlYy0+cmVhZCgmYnVmZmVyLCAmb3B0aW9ucyk7CiAgICAgICAgICAgICBvcHRpb25zLmNsZWFyU2Vla1RvKCk7CkBAIC03NDMsNyArNzI4LDcgQEAKICAgICAgICAgICAgIENIRUNLKGJ1ZmZlciAhPSBOVUxMKTsKIAogICAgICAgICAgICAgaW50NjRfdCBidWZmZXJUaW1lVXM7Ci0gICAgICAgICAgICBDSEVDSyhidWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZidWZmZXJUaW1lVXMpKTsKKyAgICAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YV9kYXRhKCkuZmluZEludDY0KGtLZXlUaW1lLCAmYnVmZmVyVGltZVVzKSk7CiAgICAgICAgICAgICBpZiAoIUNsb3NlRW5vdWdoKGJ1ZmZlclRpbWVVcywgYWN0dWFsU2Vla1RpbWVVcykpIHsKICAgICAgICAgICAgICAgICBwcmludGYoIlxuICAqIEF0dGVtcHRlZCBzZWVraW5nIHRvICUiIFBSSWQ2NCAiIHVzICglLjJmIHNlY3MpIiwKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkU2Vla1RpbWVVcywgcmVxdWVzdGVkU2Vla1RpbWVVcyAvIDFFNik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvT01YSGFybmVzcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL09NWEhhcm5lc3MuaAppbmRleCA0ZmMwZjc5Li5kY2E3ODdjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvT01YSGFybmVzcy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9PTVhIYXJuZXNzLmgKQEAgLTkzLDggKzkzLDYgQEAKICAgICBDb25kaXRpb24gbU1lc3NhZ2VBZGRlZENvbmRpdGlvbjsKICAgICBpbnQzMl90IG1MYXN0TXNnR2VuZXJhdGlvbjsKICAgICBpbnQzMl90IG1DdXJHZW5lcmF0aW9uOwotICAgIGJvb2wgbVVzZVRyZWJsZTsKLSAgICBzcDxNZW1vcnlEZWFsZXI+IG1EZWFsZXI7CiAgICAgc3A8SUFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKIAogICAgIHN0YXR1c190IGluaXRPTVgoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUgyNjNBc3NlbWJsZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BSDI2M0Fzc2VtYmxlci5jcHAKaW5kZXggNzVjZDkxMS4uMzQzNmU5NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BSDI2M0Fzc2VtYmxlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BSDI2M0Fzc2VtYmxlci5jcHAKQEAgLTI1LDcgKzI1LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzJUU0Fzc2VtYmxlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHMlRTQXNzZW1ibGVyLmNwcAppbmRleCBkY2E1Yzg5Li4wOTg4Nzc0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHMlRTQXNzZW1ibGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHMlRTQXNzZW1ibGVyLmNwcApAQCAtMjYsMTAgKzI2LDEwIEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzJUU0Fzc2VtYmxlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzJUU0Fzc2VtYmxlci5oCmluZGV4IGYzOWMyYjUuLmM5ODdiNWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUcyVFNBc3NlbWJsZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHMlRTQXNzZW1ibGVyLmgKQEAgLTI0LDcgKzI0LDYgQEAKIAogc3RydWN0IEFNZXNzYWdlOwogc3RydWN0IEFTdHJpbmc7Ci1jbGFzcyBNZXRhRGF0YTsKIAogc3RydWN0IEFNUEVHMlRTQXNzZW1ibGVyIDogcHVibGljIEFSVFBBc3NlbWJsZXIgewogICAgIEFNUEVHMlRTQXNzZW1ibGVyKApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUc0RWxlbWVudGFyeUFzc2VtYmxlci5jcHAKaW5kZXggMTU2MDA0Yy4uMWU0MzRjYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHNEVsZW1lbnRhcnlBc3NlbWJsZXIuY3BwCkBAIC0yNyw4ICsyNyw4IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogCiAjaW5jbHVkZSA8Y3R5cGUuaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVBhY2tldFNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FQYWNrZXRTb3VyY2UuY3BwCmluZGV4IDhiYTllMDIuLjIwMWE1ZGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVBhY2tldFNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUGFja2V0U291cmNlLmNwcApAQCAtMjMsOCArMjMsNiBAQAogI2luY2x1ZGUgIkFSYXdBdWRpb0Fzc2VtYmxlci5oIgogI2luY2x1ZGUgIkFTZXNzaW9uRGVzY3JpcHRpb24uaCIKIAotI2luY2x1ZGUgImluY2x1ZGUvYXZjX3V0aWxzLmgiCi0KICNpbmNsdWRlIDxjdHlwZS5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CkBAIC0zMiw2ICszMCw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9hdmNfdXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgpAQCAtMjIwLDcgKzIxOSw3IEBACiAgICAgcmV0dXJuIGNzZDsKIH0KIAotc3A8QUJ1ZmZlcj4gTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKGNvbnN0IGNoYXIgKnBhcmFtcykgeworc3RhdGljIHNwPEFCdWZmZXI+IE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YShjb25zdCBjaGFyICpwYXJhbXMpIHsKICAgICBBU3RyaW5nIHZhbDsKICAgICBDSEVDSyhHZXRBdHRyaWJ1dGUocGFyYW1zLCAiY29uZmlnIiwgJnZhbCkpOwogCkBAIC0yNTgsNyArMjU3LDcgQEAKIH0KIAogLy8gRnJvbSBtcGVnNC1nZW5lcmljIGNvbmZpZ3VyYXRpb24gZGF0YS4KLXNwPEFCdWZmZXI+IE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YTIoY29uc3QgY2hhciAqcGFyYW1zKSB7CitzdGF0aWMgc3A8QUJ1ZmZlcj4gTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhMihjb25zdCBjaGFyICpwYXJhbXMpIHsKICAgICBBU3RyaW5nIHZhbDsKICAgICB1bnNpZ25lZCBsb25nIG9iamVjdFR5cGU7CiAgICAgaWYgKEdldEF0dHJpYnV0ZShwYXJhbXMsICJvYmplY3RUeXBlIiwgJnZhbCkpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBTb3VyY2UuY3BwCmluZGV4IDU3NmEwYTQuLjQ4MjdjZDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQU291cmNlLmNwcApAQCAtNDMsNyArNDMsMTAgQEAKICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpCiAgICAgOiBtSUQoaWQpLAogICAgICAgbUhpZ2hlc3RTZXFOdW1iZXIoMCksCisgICAgICBtUHJldkV4cGVjdGVkKDApLAorICAgICAgbUJhc2VTZXFOdW1iZXIoMCksCiAgICAgICBtTnVtQnVmZmVyc1JlY2VpdmVkKDApLAorICAgICAgbVByZXZOdW1CdWZmZXJzUmVjZWl2ZWQoMCksCiAgICAgICBtTGFzdE5UUFRpbWUoMCksCiAgICAgICBtTGFzdE5UUFRpbWVVcGRhdGVVcygwKSwKICAgICAgIG1Jc3N1ZUZJUlJlcXVlc3RzKGZhbHNlKSwKQEAgLTEwNyw2ICsxMTAsNyBAQAogCiAgICAgaWYgKG1OdW1CdWZmZXJzUmVjZWl2ZWQrKyA9PSAwKSB7CiAgICAgICAgIG1IaWdoZXN0U2VxTnVtYmVyID0gc2VxTnVtOworICAgICAgICBtQmFzZVNlcU51bWJlciA9IHNlcU51bTsKICAgICAgICAgbVF1ZXVlLnB1c2hfYmFjayhidWZmZXIpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CkBAIC0yMjYsNiArMjMwLDIyIEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKKyAgICB1aW50OF90IGZyYWN0aW9uID0gMDsKKworICAgIC8vIEFjY29yZGluZyB0byBhcHBlbmRpeCBBLjMgaW4gUkZDIDM1NTAKKyAgICB1aW50MzJfdCBleHBlY3RlZCA9IG1IaWdoZXN0U2VxTnVtYmVyIC0gbUJhc2VTZXFOdW1iZXIgKyAxOworICAgIGludDY0X3QgaW50ZXJ2YWxFeHBlY3RlZCA9IGV4cGVjdGVkIC0gbVByZXZFeHBlY3RlZDsKKyAgICBpbnQ2NF90IGludGVydmFsUmVjZWl2ZWQgPSBtTnVtQnVmZmVyc1JlY2VpdmVkIC0gbVByZXZOdW1CdWZmZXJzUmVjZWl2ZWQ7CisgICAgaW50NjRfdCBpbnRlcnZhbFBhY2tldExvc3QgPSBpbnRlcnZhbEV4cGVjdGVkIC0gaW50ZXJ2YWxSZWNlaXZlZDsKKworICAgIGlmIChpbnRlcnZhbEV4cGVjdGVkID4gMCAmJiBpbnRlcnZhbFBhY2tldExvc3QgPiAwKSB7CisgICAgICAgIGZyYWN0aW9uID0gKGludGVydmFsUGFja2V0TG9zdCA8PCA4KSAvIGludGVydmFsRXhwZWN0ZWQ7CisgICAgfQorCisgICAgbVByZXZFeHBlY3RlZCA9IGV4cGVjdGVkOworICAgIG1QcmV2TnVtQnVmZmVyc1JlY2VpdmVkID0gbU51bUJ1ZmZlcnNSZWNlaXZlZDsKKyAgICBpbnQzMl90IGN1bXVsYXRpdmVQYWNrZXRMb3N0ID0gKGludDMyX3QpZXhwZWN0ZWQgLSBtTnVtQnVmZmVyc1JlY2VpdmVkOworCiAgICAgdWludDhfdCAqZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5zaXplKCk7CiAKICAgICBkYXRhWzBdID0gMHg4MCB8IDE7CkBAIC0yNDIsMTEgKzI2MiwxMSBAQAogICAgIGRhdGFbMTBdID0gKG1JRCA+PiA4KSAmIDB4ZmY7CiAgICAgZGF0YVsxMV0gPSBtSUQgJiAweGZmOwogCi0gICAgZGF0YVsxMl0gPSAweDAwOyAgLy8gZnJhY3Rpb24gbG9zdAorICAgIGRhdGFbMTJdID0gZnJhY3Rpb247ICAvLyBmcmFjdGlvbiBsb3N0CiAKLSAgICBkYXRhWzEzXSA9IDB4MDA7ICAvLyBjdW11bGF0aXZlIGxvc3QKLSAgICBkYXRhWzE0XSA9IDB4MDA7Ci0gICAgZGF0YVsxNV0gPSAweDAwOworICAgIGRhdGFbMTNdID0gY3VtdWxhdGl2ZVBhY2tldExvc3QgPj4gMTY7ICAvLyBjdW11bGF0aXZlIGxvc3QKKyAgICBkYXRhWzE0XSA9IChjdW11bGF0aXZlUGFja2V0TG9zdCA+PiA4KSAmIDB4ZmY7CisgICAgZGF0YVsxNV0gPSBjdW11bGF0aXZlUGFja2V0TG9zdCAmIDB4ZmY7CiAKICAgICBkYXRhWzE2XSA9IG1IaWdoZXN0U2VxTnVtYmVyID4+IDI0OwogICAgIGRhdGFbMTddID0gKG1IaWdoZXN0U2VxTnVtYmVyID4+IDE2KSAmIDB4ZmY7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5oCmluZGV4IGI3MGY5NGUuLmY0NGU4M2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5oCkBAIC00OSw3ICs0OSwxMCBAQAogcHJpdmF0ZToKICAgICB1aW50MzJfdCBtSUQ7CiAgICAgdWludDMyX3QgbUhpZ2hlc3RTZXFOdW1iZXI7CisgICAgdWludDMyX3QgbVByZXZFeHBlY3RlZDsKKyAgICB1aW50MzJfdCBtQmFzZVNlcU51bWJlcjsKICAgICBpbnQzMl90IG1OdW1CdWZmZXJzUmVjZWl2ZWQ7CisgICAgaW50MzJfdCBtUHJldk51bUJ1ZmZlcnNSZWNlaXZlZDsKIAogICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPiBtUXVldWU7CiAgICAgc3A8QVJUUEFzc2VtYmxlcj4gbUFzc2VtYmxlcjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBXcml0ZXIuY3BwCmluZGV4IDFmNmI2ZjcuLjA2NjdkZjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmNwcApAQCAtMjIsMTMgKzIyLDEzIEBACiAKICNpbmNsdWRlIDxmY250bC5oPgogCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDx1dGlscy9CeXRlT3JkZXIuaD4KIApAQCAtMTA0LDcgKzEwNCw3IEBACiAgICAgbUZkID0gLTE7CiB9CiAKLXN0YXR1c190IEFSVFBXcml0ZXI6OmFkZFNvdXJjZShjb25zdCBzcDxJTWVkaWFTb3VyY2U+ICZzb3VyY2UpIHsKK3N0YXR1c190IEFSVFBXcml0ZXI6OmFkZFNvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSkgewogICAgIG1Tb3VyY2UgPSBzb3VyY2U7CiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMTczLDcgKzE3Myw3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0aWMgdm9pZCBTdHJpcFN0YXJ0Y29kZShNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7CitzdGF0aWMgdm9pZCBTdHJpcFN0YXJ0Y29kZShNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcikgewogICAgIGlmIChidWZmZXItPnJhbmdlX2xlbmd0aCgpIDwgNCkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMTk1LDcgKzE5NSw3IEBACiAKICNpZiAwCiAgICAgICAgICAgICBpZiAobU1vZGUgPT0gSDI2NCkgewotICAgICAgICAgICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXI7CisgICAgICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXI7CiAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobVNvdXJjZS0+cmVhZCgmYnVmZmVyKSwgKHN0YXR1c190KU9LKTsKIAogICAgICAgICAgICAgICAgIFN0cmlwU3RhcnRjb2RlKGJ1ZmZlcik7CkBAIC0yNjUsNyArMjY1LDcgQEAKIH0KIAogdm9pZCBBUlRQV3JpdGVyOjpvblJlYWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBNZWRpYUJ1ZmZlciAqbWVkaWFCdWY7CisgICAgTWVkaWFCdWZmZXJCYXNlICptZWRpYUJ1ZjsKICAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5yZWFkKCZtZWRpYUJ1Zik7CiAKICAgICBpZiAoZXJyICE9IE9LKSB7CkBAIC01MjMsNyArNTIzLDcgQEAKICAgICBBTE9HSSgiJXMiLCBzZHAuY19zdHIoKSk7CiB9CiAKLXZvaWQgQVJUUFdyaXRlcjo6bWFrZUgyNjRTUHJvcFBhcmFtU2V0cyhNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7Cit2b2lkIEFSVFBXcml0ZXI6Om1ha2VIMjY0U1Byb3BQYXJhbVNldHMoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpIHsKICAgICBzdGF0aWMgY29uc3QgY2hhciBrU3RhcnRDb2RlW10gPSAiXHgwMFx4MDBceDAwXHgwMSI7CiAKICAgICBjb25zdCB1aW50OF90ICpkYXRhID0KQEAgLTU2NywxMiArNTY3LDEyIEBACiAgICAgc2VuZChidWZmZXIsIHRydWUgLyogaXNSVENQICovKTsKIH0KIAotdm9pZCBBUlRQV3JpdGVyOjpzZW5kQVZDRGF0YShNZWRpYUJ1ZmZlciAqbWVkaWFCdWYpIHsKK3ZvaWQgQVJUUFdyaXRlcjo6c2VuZEFWQ0RhdGEoTWVkaWFCdWZmZXJCYXNlICptZWRpYUJ1ZikgewogICAgIC8vIDEyIGJ5dGVzIFJUUCBoZWFkZXIgKyAyIGJ5dGVzIGZvciB0aGUgRlUtaW5kaWNhdG9yIGFuZCBGVS1oZWFkZXIuCiAgICAgQ0hFQ0tfR0Uoa01heFBhY2tldFNpemUsIDEydSArIDJ1KTsKIAogICAgIGludDY0X3QgdGltZVVzOwotICAgIENIRUNLKG1lZGlhQnVmLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7CisgICAgQ0hFQ0sobWVkaWFCdWYtPm1ldGFfZGF0YSgpLmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOwogCiAgICAgdWludDMyX3QgcnRwVGltZSA9IG1SVFBUaW1lQmFzZSArICh0aW1lVXMgKiA5IC8gMTAwbGwpOwogCkBAIC02NjMsMTEgKzY2MywxMSBAQAogICAgIG1MYXN0TlRQVGltZSA9IEdldE5vd05UUCgpOwogfQogCi12b2lkIEFSVFBXcml0ZXI6OnNlbmRIMjYzRGF0YShNZWRpYUJ1ZmZlciAqbWVkaWFCdWYpIHsKK3ZvaWQgQVJUUFdyaXRlcjo6c2VuZEgyNjNEYXRhKE1lZGlhQnVmZmVyQmFzZSAqbWVkaWFCdWYpIHsKICAgICBDSEVDS19HRShrTWF4UGFja2V0U2l6ZSwgMTJ1ICsgMnUpOwogCiAgICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgQ0hFQ0sobWVkaWFCdWYtPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKKyAgICBDSEVDSyhtZWRpYUJ1Zi0+bWV0YV9kYXRhKCkuZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7CiAKICAgICB1aW50MzJfdCBydHBUaW1lID0gbVJUUFRpbWVCYXNlICsgKHRpbWVVcyAqIDkgLyAxMDBsbCk7CiAKQEAgLTc0MSw3ICs3NDEsNyBAQAogICAgIHJldHVybiBmcmFtZVNpemU7CiB9CiAKLXZvaWQgQVJUUFdyaXRlcjo6c2VuZEFNUkRhdGEoTWVkaWFCdWZmZXIgKm1lZGlhQnVmKSB7Cit2b2lkIEFSVFBXcml0ZXI6OnNlbmRBTVJEYXRhKE1lZGlhQnVmZmVyQmFzZSAqbWVkaWFCdWYpIHsKICAgICBjb25zdCB1aW50OF90ICptZWRpYURhdGEgPQogICAgICAgICAoY29uc3QgdWludDhfdCAqKW1lZGlhQnVmLT5kYXRhKCkgKyBtZWRpYUJ1Zi0+cmFuZ2Vfb2Zmc2V0KCk7CiAKQEAgLTc1Miw3ICs3NTIsNyBAQAogICAgIGNvbnN0IGJvb2wgaXNXaWRlID0gKG1Nb2RlID09IEFNUl9XQik7CiAKICAgICBpbnQ2NF90IHRpbWVVczsKLSAgICBDSEVDSyhtZWRpYUJ1Zi0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOworICAgIENIRUNLKG1lZGlhQnVmLT5tZXRhX2RhdGEoKS5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKICAgICB1aW50MzJfdCBydHBUaW1lID0gbVJUUFRpbWVCYXNlICsgKHRpbWVVcyAvIChpc1dpZGUgPyAyNTAgOiAxMjUpKTsKIAogICAgIC8vIGhleGR1bXAobWVkaWFEYXRhLCBtZWRpYUxlbmd0aCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBXcml0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5oCmluZGV4IDNjNzA0MmUuLjJmMTM0ODYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5oCkBAIC0zNyw3ICszNyw3IEBACiBzdHJ1Y3QgQVJUUFdyaXRlciA6IHB1YmxpYyBNZWRpYVdyaXRlciB7CiAgICAgZXhwbGljaXQgQVJUUFdyaXRlcihpbnQgZmQpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTb3VyY2UoY29uc3Qgc3A8SU1lZGlhU291cmNlPiAmc291cmNlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFNvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSk7CiAgICAgdmlydHVhbCBib29sIHJlYWNoZWRFT1MoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwpAQCAtNzIsNyArNzIsNyBAQAogICAgIGludCBtUlRDUEZkOwogI2VuZGlmCiAKLSAgICBzcDxJTWVkaWFTb3VyY2U+IG1Tb3VyY2U7CisgICAgc3A8TWVkaWFTb3VyY2U+IG1Tb3VyY2U7CiAgICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKICAgICBzcDxBSGFuZGxlclJlZmxlY3RvcjxBUlRQV3JpdGVyPiA+IG1SZWZsZWN0b3I7CiAKQEAgLTExMCwxMyArMTEwLDEzIEBACiAgICAgdm9pZCBhZGRTUihjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKICAgICB2b2lkIGFkZFNERVMoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CiAKLSAgICB2b2lkIG1ha2VIMjY0U1Byb3BQYXJhbVNldHMoTWVkaWFCdWZmZXIgKmJ1ZmZlcik7CisgICAgdm9pZCBtYWtlSDI2NFNQcm9wUGFyYW1TZXRzKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKTsKICAgICB2b2lkIGR1bXBTZXNzaW9uRGVzYygpOwogCiAgICAgdm9pZCBzZW5kQnllKCk7Ci0gICAgdm9pZCBzZW5kQVZDRGF0YShNZWRpYUJ1ZmZlciAqbWVkaWFCdWYpOwotICAgIHZvaWQgc2VuZEgyNjNEYXRhKE1lZGlhQnVmZmVyICptZWRpYUJ1Zik7Ci0gICAgdm9pZCBzZW5kQU1SRGF0YShNZWRpYUJ1ZmZlciAqbWVkaWFCdWYpOworICAgIHZvaWQgc2VuZEFWQ0RhdGEoTWVkaWFCdWZmZXJCYXNlICptZWRpYUJ1Zik7CisgICAgdm9pZCBzZW5kSDI2M0RhdGEoTWVkaWFCdWZmZXJCYXNlICptZWRpYUJ1Zik7CisgICAgdm9pZCBzZW5kQU1SRGF0YShNZWRpYUJ1ZmZlckJhc2UgKm1lZGlhQnVmKTsKIAogICAgIHZvaWQgc2VuZChjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyLCBib29sIGlzUlRDUCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvU0RQTG9hZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvU0RQTG9hZGVyLmNwcAppbmRleCAwZjQ2YzgzLi5kNDU5Y2JkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1NEUExvYWRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9TRFBMb2FkZXIuY3BwCkBAIC0yMiw4ICsyMiw4IEBACiAKICNpbmNsdWRlICJBU2Vzc2lvbkRlc2NyaXB0aW9uLmgiCiAKLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQQ29ubmVjdGlvbi5oPgotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpAQCAtMzYsNyArMzYsNyBAQAogU0RQTG9hZGVyOjpTRFBMb2FkZXIoCiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAogICAgICAgICB1aW50MzJfdCBmbGFncywKLSAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSkKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlKQogICAgIDogbU5vdGlmeShub3RpZnkpLAogICAgICAgbUZsYWdzKGZsYWdzKSwKICAgICAgIG1OZXRMb29wZXIobmV3IEFMb29wZXIpLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9WaWRlb1NvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9WaWRlb1NvdXJjZS5oCmluZGV4IGFlMGM4NWIuLjRiZTliZjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvVmlkZW9Tb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1ZpZGVvU291cmNlLmgKQEAgLTE4LDkgKzE4LDkgQEAKIAogI2RlZmluZSBWSURFT19TT1VSQ0VfSF8KIAorI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9ydHBfdGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL3J0cF90ZXN0LmNwcAppbmRleCBlNjEyYThkLi40NTkwNjk5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL3J0cF90ZXN0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL3J0cF90ZXN0LmNwcApAQCAtMjAsMTIgKzIwLDExIEBACiAKICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU2ltcGxlRGVjb2RpbmdTb3VyY2UuaD4KIAogI2luY2x1ZGUgIkFSVFBTZXNzaW9uLmgiCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvQW5kcm9pZC5icAppbmRleCAzNTExOWMyLi5iZTEwZmRjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTEsNDUgKzEsNiBAQAogLy8gQnVpbGQgdGhlIHVuaXQgdGVzdHMuCiAKIGNjX3Rlc3QgewotICAgIG5hbWU6ICJTdXJmYWNlTWVkaWFTb3VyY2VfdGVzdCIsCi0KLSAgICBzcmNzOiBbCi0gICAgICAgICJTdXJmYWNlTWVkaWFTb3VyY2VfdGVzdC5jcHAiLAotICAgICAgICAiRHVtbXlSZWNvcmRlci5jcHAiLAotICAgIF0sCi0KLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliRUdMIiwKLSAgICAgICAgImxpYkdMRVN2MiIsCi0gICAgICAgICJsaWJiaW5kZXIiLAotICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYmd1aSIsCi0gICAgICAgICJsaWJtZWRpYSIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodCIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCi0gICAgICAgICJsaWJzeW5jIiwKLSAgICAgICAgImxpYnVpIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgXSwKLQotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvaGFyZHdhcmUiLAotICAgIF0sCi0KLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1XZXJyb3IiLAotICAgICAgICAiLVdhbGwiLAotICAgIF0sCi0KLSAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAotfQotCi1jY190ZXN0IHsKICAgICBuYW1lOiAiTWVkaWFDb2RlY0xpc3RPdmVycmlkZXNfdGVzdCIsCiAKICAgICBzcmNzOiBbIk1lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzX3Rlc3QuY3BwIl0sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9EdW1teVJlY29yZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0R1bW15UmVjb3JkZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjE3MDg4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0R1bW15UmVjb3JkZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiRHVtbXlSZWNvcmRlciIKLS8vICNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSAiRHVtbXlSZWNvcmRlci5oIgotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gc3RhdGljCi12b2lkICpEdW1teVJlY29yZGVyOjp0aHJlYWRXcmFwcGVyKHZvaWQgKnB0aGlzKSB7Ci0gICAgQUxPR1YoIlRocmVhZFdyYXBwZXI6ICVwIiwgcHRoaXMpOwotICAgIER1bW15UmVjb3JkZXIgKndyaXRlciA9IHN0YXRpY19jYXN0PER1bW15UmVjb3JkZXIgKj4ocHRoaXMpOwotICAgIHdyaXRlci0+cmVhZEZyb21Tb3VyY2UoKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotCi1zdGF0dXNfdCBEdW1teVJlY29yZGVyOjpzdGFydCgpIHsKLSAgICBBTE9HVigiU3RhcnQiKTsKLSAgICBtU3RhcnRlZCA9IHRydWU7Ci0KLSAgICBtU291cmNlLT5zdGFydCgpOwotCi0gICAgcHRocmVhZF9hdHRyX3QgYXR0cjsKLSAgICBwdGhyZWFkX2F0dHJfaW5pdCgmYXR0cik7Ci0gICAgcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZhdHRyLCBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSk7Ci0gICAgaW50IGVyciA9IHB0aHJlYWRfY3JlYXRlKCZtVGhyZWFkLCAmYXR0ciwgdGhyZWFkV3JhcHBlciwgdGhpcyk7Ci0gICAgcHRocmVhZF9hdHRyX2Rlc3Ryb3koJmF0dHIpOwotCi0gICAgaWYgKGVycikgewotICAgICAgICBBTE9HRSgiRXJyb3IgY3JlYXRpbmcgdGhyZWFkISIpOwotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi0KLXN0YXR1c190IER1bW15UmVjb3JkZXI6OnN0b3AoKSB7Ci0gICAgQUxPR1YoIlN0b3AiKTsKLSAgICBtU3RhcnRlZCA9IGZhbHNlOwotCi0gICAgbVNvdXJjZS0+c3RvcCgpOwotICAgIHZvaWQgKmR1bW15OwotICAgIHB0aHJlYWRfam9pbihtVGhyZWFkLCAmZHVtbXkpOwotICAgIHN0YXR1c190IGVyciA9IHN0YXRpY19jYXN0PHN0YXR1c190PihyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oZHVtbXkpKTsKLQotICAgIEFMT0dWKCJFbmRpbmcgdGhlIHJlYWRpbmcgdGhyZWFkIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLy8gcHJldGVuZCB0byByZWFkIHRoZSBzb3VyY2UgYnVmZmVycwotdm9pZCBEdW1teVJlY29yZGVyOjpyZWFkRnJvbVNvdXJjZSgpIHsKLSAgICBBTE9HVigiUmVhZEZyb21Tb3VyY2UiKTsKLSAgICBpZiAoIW1TdGFydGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLSAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyOwotICAgIEFMT0dWKCJBIGZha2Ugd3JpdGVyIGFjY2Vzc2luZyB0aGUgZnJhbWVzIik7Ci0gICAgd2hpbGUgKG1TdGFydGVkICYmIChlcnIgPSBtU291cmNlLT5yZWFkKCZidWZmZXIpKSA9PSBPSyl7Ci0gICAgICAgIC8vIGlmIG5vdCBnZXR0aW5nIGEgdmFsaWQgYnVmZmVyIGZyb20gc291cmNlLCB0aGVuIGV4aXQKLSAgICAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIGJ1ZmZlciA9IE5VTEw7Ci0gICAgfQotfQotCi0KLX0gLy8gZW5kIG9mIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9EdW1teVJlY29yZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9EdW1teVJlY29yZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NTk3NzcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvRHVtbXlSZWNvcmRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgRFVNTVlfUkVDT1JERVJfSF8KLSNkZWZpbmUgRFVNTVlfUkVDT1JERVJfSF8KLQotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IE1lZGlhU291cmNlOwotY2xhc3MgTWVkaWFCdWZmZXI7Ci0KLWNsYXNzIER1bW15UmVjb3JkZXIgewotICAgIHB1YmxpYzoKLSAgICAvLyBUaGUgbWVkaWEgc291cmNlIGZyb20gd2hpY2ggdGhpcyB3aWxsIHJlY2VpdmUgZnJhbWVzCi0gICAgc3A8TWVkaWFTb3VyY2U+IG1Tb3VyY2U7Ci0gICAgYm9vbCBtU3RhcnRlZDsKLSAgICBwdGhyZWFkX3QgbVRocmVhZDsKLQotICAgIHN0YXR1c190IHN0YXJ0KCk7Ci0gICAgc3RhdHVzX3Qgc3RvcCgpOwotCi0gICAgLy8gYWN0dWFsIGVudHJ5IHBvaW50IGZvciB0aGUgdGhyZWFkCi0gICAgdm9pZCByZWFkRnJvbVNvdXJjZSgpOwotCi0gICAgLy8gc3RhdGljIGZ1bmN0aW9uIHRvIHdyYXAgdGhlIGFjdHVhbCB0aHJlYWQgZW50cnkgcG9pbnQKLSAgICBzdGF0aWMgdm9pZCAqdGhyZWFkV3JhcHBlcih2b2lkICpwdGhpcyk7Ci0KLSAgICBleHBsaWNpdCBEdW1teVJlY29yZGVyKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKSA6IG1Tb3VyY2Uoc291cmNlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgbVN0YXJ0ZWQoZmFsc2UpIHt9Ci0gICAgfkR1bW15UmVjb3JkZXIoICkge30KLQotICAgIHByaXZhdGU6Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEdW1teVJlY29yZGVyKTsKLX07Ci0KLX0gLy8gZW5kIG9mIG5hbWVzcGFjZSBhbmRyb2lkCi0jZW5kaWYKLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9TdXJmYWNlTWVkaWFTb3VyY2VfdGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9TdXJmYWNlTWVkaWFTb3VyY2VfdGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNDY0ZmYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvU3VyZmFjZU1lZGlhU291cmNlX3Rlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIlN1cmZhY2VNZWRpYVNvdXJjZV90ZXN0IgotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8R0xFUzIvZ2wyLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9tZWRpYXJlY29yZGVyLmg+Ci0KLSNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+Ci0jaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KLSNpbmNsdWRlIDxndWkvSVN1cmZhY2VDb21wb3Nlci5oPgotI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+Ci0jaW5jbHVkZSA8Z3VpL1N1cmZhY2VDb21wb3NlckNsaWVudC5oPgotCi0jaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxPTVhfQ29tcG9uZW50Lmg+Ci0KLSNpbmNsdWRlICJEdW1teVJlY29yZGVyLmgiCi0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBHTFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLXByb3RlY3RlZDoKLQotICAgIEdMVGVzdCgpOgotICAgICAgICAgICAgbUVnbERpc3BsYXkoRUdMX05PX0RJU1BMQVkpLAotICAgICAgICAgICAgbUVnbFN1cmZhY2UoRUdMX05PX1NVUkZBQ0UpLAotICAgICAgICAgICAgbUVnbENvbnRleHQoRUdMX05PX0NPTlRFWFQpIHsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0gICAgICAgIEFMT0dWKCJHTFRlc3Q6OlNldFVwKCkiKTsKLSAgICAgICAgbUVnbERpc3BsYXkgPSBlZ2xHZXREaXNwbGF5KEVHTF9ERUZBVUxUX0RJU1BMQVkpOwotICAgICAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotICAgICAgICBBU1NFUlRfTkUoRUdMX05PX0RJU1BMQVksIG1FZ2xEaXNwbGF5KTsKLQotICAgICAgICBFR0xpbnQgbWFqb3JWZXJzaW9uOwotICAgICAgICBFR0xpbnQgbWlub3JWZXJzaW9uOwotICAgICAgICBFWFBFQ1RfVFJVRShlZ2xJbml0aWFsaXplKG1FZ2xEaXNwbGF5LCAmbWFqb3JWZXJzaW9uLCAmbWlub3JWZXJzaW9uKSk7Ci0gICAgICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0gICAgICAgIFJlY29yZFByb3BlcnR5KCJFZ2xWZXJzaW9uTWFqb3IiLCBtYWpvclZlcnNpb24pOwotICAgICAgICBSZWNvcmRQcm9wZXJ0eSgiRWdsVmVyc2lvbk1ham9yIiwgbWlub3JWZXJzaW9uKTsKLQotICAgICAgICBFR0xpbnQgbnVtQ29uZmlncyA9IDA7Ci0gICAgICAgIEVYUEVDVF9UUlVFKGVnbENob29zZUNvbmZpZyhtRWdsRGlzcGxheSwgZ2V0Q29uZmlnQXR0cmlicygpLCAmbUdsQ29uZmlnLAotICAgICAgICAgICAgICAgIDEsICZudW1Db25maWdzKSk7Ci0gICAgICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0KLSAgICAgICAgY2hhciogZGlzcGxheVNlY3NFbnYgPSBnZXRlbnYoIkdMVEVTVF9ESVNQTEFZX1NFQ1MiKTsKLSAgICAgICAgaWYgKGRpc3BsYXlTZWNzRW52ICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1EaXNwbGF5U2VjcyA9IGF0b2koZGlzcGxheVNlY3NFbnYpOwotICAgICAgICAgICAgaWYgKG1EaXNwbGF5U2VjcyA8IDApIHsKLSAgICAgICAgICAgICAgICBtRGlzcGxheVNlY3MgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbURpc3BsYXlTZWNzID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtRGlzcGxheVNlY3MgPiAwKSB7Ci0gICAgICAgICAgICBtQ29tcG9zZXJDbGllbnQgPSBuZXcgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OwotICAgICAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtQ29tcG9zZXJDbGllbnQtPmluaXRDaGVjaygpKTsKLQotICAgICAgICAgICAgbVN1cmZhY2VDb250cm9sID0gbUNvbXBvc2VyQ2xpZW50LT5jcmVhdGVTdXJmYWNlKAotICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCJUZXN0IFN1cmZhY2UiKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0U3VyZmFjZVdpZHRoKCksIGdldFN1cmZhY2VIZWlnaHQoKSwKLSAgICAgICAgICAgICAgICAgICAgUElYRUxfRk9STUFUX1JHQl84ODgsIDApOwotCi0gICAgICAgICAgICBBU1NFUlRfVFJVRShtU3VyZmFjZUNvbnRyb2wgIT0gTlVMTCk7Ci0gICAgICAgICAgICBBU1NFUlRfVFJVRShtU3VyZmFjZUNvbnRyb2wtPmlzVmFsaWQoKSk7Ci0KLSAgICAgICAgICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6b3Blbkdsb2JhbFRyYW5zYWN0aW9uKCk7Ci0gICAgICAgICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1TdXJmYWNlQ29udHJvbC0+c2V0TGF5ZXIoMHg3RkZGRkZGRikpOwotICAgICAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtU3VyZmFjZUNvbnRyb2wtPnNob3coKSk7Ci0gICAgICAgICAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmNsb3NlR2xvYmFsVHJhbnNhY3Rpb24oKTsKLQotICAgICAgICAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gd2luZG93ID0gbVN1cmZhY2VDb250cm9sLT5nZXRTdXJmYWNlKCk7Ci0gICAgICAgICAgICBtRWdsU3VyZmFjZSA9IGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UobUVnbERpc3BsYXksIG1HbENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgd2luZG93LmdldCgpLCBOVUxMKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dWKCJObyBhY3R1YWwgZGlzcGxheS4gQ2hvb3NpbmcgRUdMU3VyZmFjZSBiYXNlZCBvbiBTdXJmYWNlTWVkaWFTb3VyY2UiKTsKLSAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IHNtcyA9IChuZXcgU3VyZmFjZU1lZGlhU291cmNlKAotICAgICAgICAgICAgICAgICAgICBnZXRTdXJmYWNlV2lkdGgoKSwgZ2V0U3VyZmFjZUhlaWdodCgpKSktPmdldFByb2R1Y2VyKCk7Ci0gICAgICAgICAgICBzcDxTdXJmYWNlPiBzdGMgPSBuZXcgU3VyZmFjZShzbXMpOwotICAgICAgICAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gd2luZG93ID0gc3RjOwotCi0gICAgICAgICAgICBtRWdsU3VyZmFjZSA9IGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UobUVnbERpc3BsYXksIG1HbENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgd2luZG93LmdldCgpLCBOVUxMKTsKLSAgICAgICAgfQotICAgICAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotICAgICAgICBBU1NFUlRfTkUoRUdMX05PX1NVUkZBQ0UsIG1FZ2xTdXJmYWNlKTsKLQotICAgICAgICBtRWdsQ29udGV4dCA9IGVnbENyZWF0ZUNvbnRleHQobUVnbERpc3BsYXksIG1HbENvbmZpZywgRUdMX05PX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgZ2V0Q29udGV4dEF0dHJpYnMoKSk7Ci0gICAgICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0gICAgICAgIEFTU0VSVF9ORShFR0xfTk9fQ09OVEVYVCwgbUVnbENvbnRleHQpOwotCi0gICAgICAgIEVYUEVDVF9UUlVFKGVnbE1ha2VDdXJyZW50KG1FZ2xEaXNwbGF5LCBtRWdsU3VyZmFjZSwgbUVnbFN1cmZhY2UsCi0gICAgICAgICAgICAgICAgbUVnbENvbnRleHQpKTsKLSAgICAgICAgQVNTRVJUX0VRKEVHTF9TVUNDRVNTLCBlZ2xHZXRFcnJvcigpKTsKLQotICAgICAgICBFR0xpbnQgdywgaDsKLSAgICAgICAgRVhQRUNUX1RSVUUoZWdsUXVlcnlTdXJmYWNlKG1FZ2xEaXNwbGF5LCBtRWdsU3VyZmFjZSwgRUdMX1dJRFRILCAmdykpOwotICAgICAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotICAgICAgICBFWFBFQ1RfVFJVRShlZ2xRdWVyeVN1cmZhY2UobUVnbERpc3BsYXksIG1FZ2xTdXJmYWNlLCBFR0xfSEVJR0hULCAmaCkpOwotICAgICAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotICAgICAgICBSZWNvcmRQcm9wZXJ0eSgiRWdsU3VyZmFjZVdpZHRoIiwgdyk7Ci0gICAgICAgIFJlY29yZFByb3BlcnR5KCJFZ2xTdXJmYWNlSGVpZ2h0IiwgaCk7Ci0KLSAgICAgICAgZ2xWaWV3cG9ydCgwLCAwLCB3LCBoKTsKLSAgICAgICAgQVNTRVJUX0VRKEdMZW51bShHTF9OT19FUlJPUiksIGdsR2V0RXJyb3IoKSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgewotICAgICAgICAvLyBEaXNwbGF5IHRoZSByZXN1bHQKLSAgICAgICAgaWYgKG1EaXNwbGF5U2VjcyA+IDAgJiYgbUVnbFN1cmZhY2UgIT0gRUdMX05PX1NVUkZBQ0UpIHsKLSAgICAgICAgICAgIGVnbFN3YXBCdWZmZXJzKG1FZ2xEaXNwbGF5LCBtRWdsU3VyZmFjZSk7Ci0gICAgICAgICAgICBzbGVlcChtRGlzcGxheVNlY3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1Db21wb3NlckNsaWVudCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtQ29tcG9zZXJDbGllbnQtPmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUVnbENvbnRleHQgIT0gRUdMX05PX0NPTlRFWFQpIHsKLSAgICAgICAgICAgIGVnbERlc3Ryb3lDb250ZXh0KG1FZ2xEaXNwbGF5LCBtRWdsQ29udGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1FZ2xTdXJmYWNlICE9IEVHTF9OT19TVVJGQUNFKSB7Ci0gICAgICAgICAgICBlZ2xEZXN0cm95U3VyZmFjZShtRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtRWdsRGlzcGxheSAhPSBFR0xfTk9fRElTUExBWSkgewotICAgICAgICAgICAgZWdsVGVybWluYXRlKG1FZ2xEaXNwbGF5KTsKLSAgICAgICAgfQotICAgICAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotICAgIH0KLQotICAgIHZpcnR1YWwgRUdMaW50IGNvbnN0KiBnZXRDb25maWdBdHRyaWJzKCkgewotICAgICAgICBBTE9HVigiR0xUZXN0IGdldENvbmZpZ0F0dHJpYnMiKTsKLSAgICAgICAgc3RhdGljIEVHTGludCBzRGVmYXVsdENvbmZpZ0F0dHJpYnNbXSA9IHsKLSAgICAgICAgICAgIEVHTF9TVVJGQUNFX1RZUEUsIEVHTF9QQlVGRkVSX0JJVCwKLSAgICAgICAgICAgIEVHTF9SRU5ERVJBQkxFX1RZUEUsIEVHTF9PUEVOR0xfRVMyX0JJVCwKLSAgICAgICAgICAgIEVHTF9SRURfU0laRSwgOCwKLSAgICAgICAgICAgIEVHTF9HUkVFTl9TSVpFLCA4LAotICAgICAgICAgICAgRUdMX0JMVUVfU0laRSwgOCwKLSAgICAgICAgICAgIEVHTF9BTFBIQV9TSVpFLCA4LAotICAgICAgICAgICAgRUdMX0RFUFRIX1NJWkUsIDE2LAotICAgICAgICAgICAgRUdMX1NURU5DSUxfU0laRSwgOCwKLSAgICAgICAgICAgIEVHTF9OT05FIH07Ci0KLSAgICAgICAgcmV0dXJuIHNEZWZhdWx0Q29uZmlnQXR0cmliczsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIEVHTGludCBjb25zdCogZ2V0Q29udGV4dEF0dHJpYnMoKSB7Ci0gICAgICAgIHN0YXRpYyBFR0xpbnQgc0RlZmF1bHRDb250ZXh0QXR0cmlic1tdID0gewotICAgICAgICAgICAgRUdMX0NPTlRFWFRfQ0xJRU5UX1ZFUlNJT04sIDIsCi0gICAgICAgICAgICBFR0xfTk9ORSB9OwotCi0gICAgICAgIHJldHVybiBzRGVmYXVsdENvbnRleHRBdHRyaWJzOwotICAgIH0KLQotICAgIHZpcnR1YWwgRUdMaW50IGdldFN1cmZhY2VXaWR0aCgpIHsKLSAgICAgICAgcmV0dXJuIDUxMjsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIEVHTGludCBnZXRTdXJmYWNlSGVpZ2h0KCkgewotICAgICAgICByZXR1cm4gNTEyOwotICAgIH0KLQotICAgIHZvaWQgbG9hZFNoYWRlcihHTGVudW0gc2hhZGVyVHlwZSwgY29uc3QgY2hhciogcFNvdXJjZSwgR0x1aW50KiBvdXRTaGFkZXIpIHsKLSAgICAgICAgR0x1aW50IHNoYWRlciA9IGdsQ3JlYXRlU2hhZGVyKHNoYWRlclR5cGUpOwotICAgICAgICBBU1NFUlRfRVEoR0xlbnVtKEdMX05PX0VSUk9SKSwgZ2xHZXRFcnJvcigpKTsKLSAgICAgICAgaWYgKHNoYWRlcikgewotICAgICAgICAgICAgZ2xTaGFkZXJTb3VyY2Uoc2hhZGVyLCAxLCAmcFNvdXJjZSwgTlVMTCk7Ci0gICAgICAgICAgICBBU1NFUlRfRVEoR0xlbnVtKEdMX05PX0VSUk9SKSwgZ2xHZXRFcnJvcigpKTsKLSAgICAgICAgICAgIGdsQ29tcGlsZVNoYWRlcihzaGFkZXIpOwotICAgICAgICAgICAgQVNTRVJUX0VRKEdMZW51bShHTF9OT19FUlJPUiksIGdsR2V0RXJyb3IoKSk7Ci0gICAgICAgICAgICBHTGludCBjb21waWxlZCA9IDA7Ci0gICAgICAgICAgICBnbEdldFNoYWRlcml2KHNoYWRlciwgR0xfQ09NUElMRV9TVEFUVVMsICZjb21waWxlZCk7Ci0gICAgICAgICAgICBBU1NFUlRfRVEoR0xlbnVtKEdMX05PX0VSUk9SKSwgZ2xHZXRFcnJvcigpKTsKLSAgICAgICAgICAgIGlmICghY29tcGlsZWQpIHsKLSAgICAgICAgICAgICAgICBHTGludCBpbmZvTGVuID0gMDsKLSAgICAgICAgICAgICAgICBnbEdldFNoYWRlcml2KHNoYWRlciwgR0xfSU5GT19MT0dfTEVOR1RILCAmaW5mb0xlbik7Ci0gICAgICAgICAgICAgICAgQVNTRVJUX0VRKEdMZW51bShHTF9OT19FUlJPUiksIGdsR2V0RXJyb3IoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGluZm9MZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciogYnVmID0gKGNoYXIqKSBtYWxsb2MoaW5mb0xlbik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChidWYpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdsR2V0U2hhZGVySW5mb0xvZyhzaGFkZXIsIGluZm9MZW4sIE5VTEwsIGJ1Zik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlNoYWRlciBjb21waWxlIGxvZzpcbiVzXG4iLCBidWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShidWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgRkFJTCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciogYnVmID0gKGNoYXIqKSBtYWxsb2MoMHgxMDAwKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZikgewotICAgICAgICAgICAgICAgICAgICAgICAgZ2xHZXRTaGFkZXJJbmZvTG9nKHNoYWRlciwgMHgxMDAwLCBOVUxMLCBidWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJTaGFkZXIgY29tcGlsZSBsb2c6XG4lc1xuIiwgYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZBSUwoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBnbERlbGV0ZVNoYWRlcihzaGFkZXIpOwotICAgICAgICAgICAgICAgIHNoYWRlciA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgQVNTRVJUX1RSVUUoc2hhZGVyICE9IDApOwotICAgICAgICAqb3V0U2hhZGVyID0gc2hhZGVyOwotICAgIH0KLQotICAgIHZvaWQgY3JlYXRlUHJvZ3JhbShjb25zdCBjaGFyKiBwVmVydGV4U291cmNlLCBjb25zdCBjaGFyKiBwRnJhZ21lbnRTb3VyY2UsCi0gICAgICAgICAgICBHTHVpbnQqIG91dFBnbSkgewotICAgICAgICBHTHVpbnQgdmVydGV4U2hhZGVyLCBmcmFnbWVudFNoYWRlcjsKLSAgICAgICAgewotICAgICAgICAgICAgU0NPUEVEX1RSQUNFKCJjb21waWxpbmcgdmVydGV4IHNoYWRlciIpOwotICAgICAgICAgICAgbG9hZFNoYWRlcihHTF9WRVJURVhfU0hBREVSLCBwVmVydGV4U291cmNlLCAmdmVydGV4U2hhZGVyKTsKLSAgICAgICAgICAgIGlmIChIYXNGYXRhbEZhaWx1cmUoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB7Ci0gICAgICAgICAgICBTQ09QRURfVFJBQ0UoImNvbXBpbGluZyBmcmFnbWVudCBzaGFkZXIiKTsKLSAgICAgICAgICAgIGxvYWRTaGFkZXIoR0xfRlJBR01FTlRfU0hBREVSLCBwRnJhZ21lbnRTb3VyY2UsICZmcmFnbWVudFNoYWRlcik7Ci0gICAgICAgICAgICBpZiAoSGFzRmF0YWxGYWlsdXJlKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBHTHVpbnQgcHJvZ3JhbSA9IGdsQ3JlYXRlUHJvZ3JhbSgpOwotICAgICAgICBBU1NFUlRfRVEoR0xlbnVtKEdMX05PX0VSUk9SKSwgZ2xHZXRFcnJvcigpKTsKLSAgICAgICAgaWYgKHByb2dyYW0pIHsKLSAgICAgICAgICAgIGdsQXR0YWNoU2hhZGVyKHByb2dyYW0sIHZlcnRleFNoYWRlcik7Ci0gICAgICAgICAgICBBU1NFUlRfRVEoR0xlbnVtKEdMX05PX0VSUk9SKSwgZ2xHZXRFcnJvcigpKTsKLSAgICAgICAgICAgIGdsQXR0YWNoU2hhZGVyKHByb2dyYW0sIGZyYWdtZW50U2hhZGVyKTsKLSAgICAgICAgICAgIEFTU0VSVF9FUShHTGVudW0oR0xfTk9fRVJST1IpLCBnbEdldEVycm9yKCkpOwotICAgICAgICAgICAgZ2xMaW5rUHJvZ3JhbShwcm9ncmFtKTsKLSAgICAgICAgICAgIEdMaW50IGxpbmtTdGF0dXMgPSBHTF9GQUxTRTsKLSAgICAgICAgICAgIGdsR2V0UHJvZ3JhbWl2KHByb2dyYW0sIEdMX0xJTktfU1RBVFVTLCAmbGlua1N0YXR1cyk7Ci0gICAgICAgICAgICBpZiAobGlua1N0YXR1cyAhPSBHTF9UUlVFKSB7Ci0gICAgICAgICAgICAgICAgR0xpbnQgYnVmTGVuZ3RoID0gMDsKLSAgICAgICAgICAgICAgICBnbEdldFByb2dyYW1pdihwcm9ncmFtLCBHTF9JTkZPX0xPR19MRU5HVEgsICZidWZMZW5ndGgpOwotICAgICAgICAgICAgICAgIGlmIChidWZMZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciogYnVmID0gKGNoYXIqKSBtYWxsb2MoYnVmTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZikgewotICAgICAgICAgICAgICAgICAgICAgICAgZ2xHZXRQcm9ncmFtSW5mb0xvZyhwcm9ncmFtLCBidWZMZW5ndGgsIE5VTEwsIGJ1Zik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlByb2dyYW0gbGluayBsb2c6XG4lc1xuIiwgYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZBSUwoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBnbERlbGV0ZVByb2dyYW0ocHJvZ3JhbSk7Ci0gICAgICAgICAgICAgICAgcHJvZ3JhbSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZ2xEZWxldGVTaGFkZXIodmVydGV4U2hhZGVyKTsKLSAgICAgICAgZ2xEZWxldGVTaGFkZXIoZnJhZ21lbnRTaGFkZXIpOwotICAgICAgICBBU1NFUlRfVFJVRShwcm9ncmFtICE9IDApOwotICAgICAgICAqb3V0UGdtID0gcHJvZ3JhbTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgaW50IGFicyhpbnQgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlID4gMCA/IHZhbHVlIDogLXZhbHVlOwotICAgIH0KLQotICAgIDo6dGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IGNoZWNrUGl4ZWwoaW50IHgsIGludCB5LCBpbnQgciwKLSAgICAgICAgICAgIGludCBnLCBpbnQgYiwgaW50IGEsIGludCB0b2xlcmFuY2U9MikgewotICAgICAgICBHTHVieXRlIHBpeGVsWzRdOwotICAgICAgICBTdHJpbmc4IG1zZzsKLSAgICAgICAgZ2xSZWFkUGl4ZWxzKHgsIHksIDEsIDEsIEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUsIHBpeGVsKTsKLSAgICAgICAgR0xlbnVtIGVyciA9IGdsR2V0RXJyb3IoKTsKLSAgICAgICAgaWYgKGVyciAhPSBHTF9OT19FUlJPUikgewotICAgICAgICAgICAgbXNnICs9IFN0cmluZzg6OmZvcm1hdCgiZXJyb3IgcmVhZGluZyBwaXhlbDogJSN4IiwgZXJyKTsKLSAgICAgICAgICAgIHdoaWxlICgoZXJyID0gZ2xHZXRFcnJvcigpKSAhPSBHTF9OT19FUlJPUikgewotICAgICAgICAgICAgICAgIG1zZyArPSBTdHJpbmc4Ojpmb3JtYXQoIiwgJSN4IiwgZXJyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAicGl4ZWwgY2hlY2sgZmFpbHVyZTogJXNcbiIsIG1zZy5zdHJpbmcoKSk7Ci0gICAgICAgICAgICByZXR1cm4gOjp0ZXN0aW5nOjpBc3NlcnRpb25GYWlsdXJlKAotICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6Ok1lc3NhZ2UobXNnLnN0cmluZygpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHIgPj0gMCAmJiBhYnMociAtIGludChwaXhlbFswXSkpID4gdG9sZXJhbmNlKSB7Ci0gICAgICAgICAgICBtc2cgKz0gU3RyaW5nODo6Zm9ybWF0KCJyKCVkIGlzbid0ICVkKSIsIHBpeGVsWzBdLCByKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZyA+PSAwICYmIGFicyhnIC0gaW50KHBpeGVsWzFdKSkgPiB0b2xlcmFuY2UpIHsKLSAgICAgICAgICAgIGlmICghbXNnLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIG1zZyArPSAiICI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtc2cgKz0gU3RyaW5nODo6Zm9ybWF0KCJnKCVkIGlzbid0ICVkKSIsIHBpeGVsWzFdLCBnKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYiA+PSAwICYmIGFicyhiIC0gaW50KHBpeGVsWzJdKSkgPiB0b2xlcmFuY2UpIHsKLSAgICAgICAgICAgIGlmICghbXNnLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIG1zZyArPSAiICI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtc2cgKz0gU3RyaW5nODo6Zm9ybWF0KCJiKCVkIGlzbid0ICVkKSIsIHBpeGVsWzJdLCBiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYSA+PSAwICYmIGFicyhhIC0gaW50KHBpeGVsWzNdKSkgPiB0b2xlcmFuY2UpIHsKLSAgICAgICAgICAgIGlmICghbXNnLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIG1zZyArPSAiICI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtc2cgKz0gU3RyaW5nODo6Zm9ybWF0KCJhKCVkIGlzbid0ICVkKSIsIHBpeGVsWzNdLCBhKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW1zZy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAicGl4ZWwgY2hlY2sgZmFpbHVyZTogJXNcbiIsIG1zZy5zdHJpbmcoKSk7Ci0gICAgICAgICAgICByZXR1cm4gOjp0ZXN0aW5nOjpBc3NlcnRpb25GYWlsdXJlKAotICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6Ok1lc3NhZ2UobXNnLnN0cmluZygpKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gOjp0ZXN0aW5nOjpBc3NlcnRpb25TdWNjZXNzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnQgbURpc3BsYXlTZWNzOwotICAgIHNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4gbUNvbXBvc2VyQ2xpZW50OwotICAgIHNwPFN1cmZhY2VDb250cm9sPiBtU3VyZmFjZUNvbnRyb2w7Ci0KLSAgICBFR0xEaXNwbGF5IG1FZ2xEaXNwbGF5OwotICAgIEVHTFN1cmZhY2UgbUVnbFN1cmZhY2U7Ci0gICAgRUdMQ29udGV4dCBtRWdsQ29udGV4dDsKLSAgICBFR0xDb25maWcgIG1HbENvbmZpZzsKLX07Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyAgICBDbGFzcyBmb3IgIHRoZSBOT04tR0wgdGVzdHMKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi1jbGFzcyBTdXJmYWNlTWVkaWFTb3VyY2VUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci1wdWJsaWM6Ci0KLSAgICBTdXJmYWNlTWVkaWFTb3VyY2VUZXN0KCApOiBtWXV2VGV4V2lkdGgoMTc2KSwgbVl1dlRleEhlaWdodCgxNDQpIHsgfQotICAgIHZvaWQgb25lQnVmZmVyUGFzcyhpbnQgd2lkdGgsIGludCBoZWlnaHQgKTsKLSAgICB2b2lkIG9uZUJ1ZmZlclBhc3NOb0ZpbGwoaW50IHdpZHRoLCBpbnQgaGVpZ2h0ICk7Ci0gICAgc3RhdGljIHZvaWQgZmlsbFlWMTJCdWZmZXIodWludDhfdCogYnVmLCBpbnQgdywgaW50IGgsIGludCBzdHJpZGUpIDsKLSAgICBzdGF0aWMgdm9pZCBmaWxsWVYxMkJ1ZmZlclJlY3QodWludDhfdCogYnVmLCBpbnQgdywgaW50IGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBjb25zdCBhbmRyb2lkX25hdGl2ZV9yZWN0X3QmIHJlY3QpIDsKLXByb3RlY3RlZDoKLQotICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLSAgICAgICAgYW5kcm9pZDo6UHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwotICAgICAgICBtU01TID0gbmV3IFN1cmZhY2VNZWRpYVNvdXJjZShtWXV2VGV4V2lkdGgsIG1ZdXZUZXhIZWlnaHQpOwotICAgICAgICBtU1RDID0gbmV3IFN1cmZhY2UobVNNUy0+Z2V0UHJvZHVjZXIoKSk7Ci0gICAgICAgIG1BTlcgPSBtU1RDOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKLSAgICAgICAgbVNNUy5jbGVhcigpOwotICAgICAgICBtU1RDLmNsZWFyKCk7Ci0gICAgICAgIG1BTlcuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBjb25zdCBpbnQgbVl1dlRleFdpZHRoOwotICAgIGNvbnN0IGludCBtWXV2VGV4SGVpZ2h0OwotCi0gICAgc3A8U3VyZmFjZU1lZGlhU291cmNlPiBtU01TOwotICAgIHNwPFN1cmZhY2U+IG1TVEM7Ci0gICAgc3A8QU5hdGl2ZVdpbmRvdz4gbUFOVzsKLX07Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyAgICBDbGFzcyBmb3IgIHRoZSBHTCB0ZXN0cwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLWNsYXNzIFN1cmZhY2VNZWRpYVNvdXJjZUdMVGVzdCA6IHB1YmxpYyBHTFRlc3QgewotcHVibGljOgotCi0gICAgU3VyZmFjZU1lZGlhU291cmNlR0xUZXN0KCApOiBtWXV2VGV4V2lkdGgoMTc2KSwgbVl1dlRleEhlaWdodCgxNDQpIHsgfQotICAgIHZpcnR1YWwgRUdMaW50IGNvbnN0KiBnZXRDb25maWdBdHRyaWJzKCk7Ci0gICAgdm9pZCBvbmVCdWZmZXJQYXNzR0woaW50IG51bSA9IDApOwotICAgIHN0YXRpYyBzcDxNZWRpYVJlY29yZGVyPiBzZXRVcE1lZGlhUmVjb3JkZXIoaW50IGZpbGVEZXNjcmlwdG9yLCBpbnQgdmlkZW9Tb3VyY2UsCi0gICAgICAgIGludCBvdXRwdXRGb3JtYXQsIGludCB2aWRlb0VuY29kZXIsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGZwcyk7Ci1wcm90ZWN0ZWQ6Ci0KLSAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0gICAgICAgIEFMT0dWKCJTTVMtR0xUZXN0OjpTZXRVcCgpIik7Ci0gICAgICAgIGFuZHJvaWQ6OlByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKLSAgICAgICAgbVNNUyA9IG5ldyBTdXJmYWNlTWVkaWFTb3VyY2UobVl1dlRleFdpZHRoLCBtWXV2VGV4SGVpZ2h0KTsKLSAgICAgICAgbVNUQyA9IG5ldyBTdXJmYWNlKG1TTVMtPmdldFByb2R1Y2VyKCkpOwotICAgICAgICBtQU5XID0gbVNUQzsKLQotICAgICAgICAvLyBEb2luZyB0aGUgc2V0dXAgcmVsYXRlZCB0byB0aGUgR0wgU2lkZQotICAgICAgICBHTFRlc3Q6OlNldFVwKCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgewotICAgICAgICBtU01TLmNsZWFyKCk7Ci0gICAgICAgIG1TVEMuY2xlYXIoKTsKLSAgICAgICAgbUFOVy5jbGVhcigpOwotICAgICAgICBHTFRlc3Q6OlRlYXJEb3duKCk7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRVcEVHTFN1cmZhY2VGcm9tTWVkaWFSZWNvcmRlcihzcDxNZWRpYVJlY29yZGVyPiYgbXIpOwotCi0gICAgY29uc3QgaW50IG1ZdXZUZXhXaWR0aDsKLSAgICBjb25zdCBpbnQgbVl1dlRleEhlaWdodDsKLQotICAgIHNwPFN1cmZhY2VNZWRpYVNvdXJjZT4gbVNNUzsKLSAgICBzcDxTdXJmYWNlPiBtU1RDOwotICAgIHNwPEFOYXRpdmVXaW5kb3c+IG1BTlc7Ci19OwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIE1ldGhvZHMgaW4gU3VyZmFjZU1lZGlhU291cmNlR0xUZXN0Ci0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLUVHTGludCBjb25zdCogU3VyZmFjZU1lZGlhU291cmNlR0xUZXN0OjpnZXRDb25maWdBdHRyaWJzKCkgewotICAgICAgICBBTE9HVigiU3VyZmFjZU1lZGlhU291cmNlR0xUZXN0IGdldENvbmZpZ0F0dHJpYnMiKTsKLSAgICBzdGF0aWMgRUdMaW50IHNEZWZhdWx0Q29uZmlnQXR0cmlic1tdID0gewotICAgICAgICBFR0xfU1VSRkFDRV9UWVBFLCBFR0xfV0lORE9XX0JJVCwKLSAgICAgICAgRUdMX1JFTkRFUkFCTEVfVFlQRSwgRUdMX09QRU5HTF9FUzJfQklULAotICAgICAgICBFR0xfUkVEX1NJWkUsIDgsCi0gICAgICAgIEVHTF9HUkVFTl9TSVpFLCA4LAotICAgICAgICBFR0xfQkxVRV9TSVpFLCA4LAotICAgICAgICBFR0xfUkVDT1JEQUJMRV9BTkRST0lELCBFR0xfVFJVRSwKLSAgICAgICAgRUdMX05PTkUgfTsKLQotICAgIHJldHVybiBzRGVmYXVsdENvbmZpZ0F0dHJpYnM7Ci19Ci0KLS8vIE9uZSBwYXNzIG9mIGRlcXVldWluZyBhbmQgcXVldWluZyBhIEdMQnVmZmVyCi12b2lkIFN1cmZhY2VNZWRpYVNvdXJjZUdMVGVzdDo6b25lQnVmZmVyUGFzc0dMKGludCBudW0pIHsKLSAgICBpbnQgZCA9IG51bSAlIDUwOwotICAgIGZsb2F0IGYgPSAwLjJmOyAvLyAwLjFmICogZDsKLQotICAgIGdsQ2xlYXJDb2xvcigwLCAwLjMsIDAsIDAuNik7Ci0gICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLQotICAgIGdsRW5hYmxlKEdMX1NDSVNTT1JfVEVTVCk7Ci0gICAgZ2xTY2lzc29yKDQgKyBkLCA0ICsgZCwgNCwgNCk7Ci0gICAgZ2xDbGVhckNvbG9yKDEuMCAtIGYsIGYsIGYsIDEuMCk7Ci0gICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLQotICAgIGdsU2Npc3NvcigyNCArIGQsIDQ4ICsgZCwgNCwgNCk7Ci0gICAgZ2xDbGVhckNvbG9yKGYsIDEuMCAtIGYsIGYsIDEuMCk7Ci0gICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLQotICAgIGdsU2Npc3NvcigzNyArIGQsIDE3ICsgZCwgNCwgNCk7Ci0gICAgZ2xDbGVhckNvbG9yKGYsIGYsIDEuMCAtIGYsIDEuMCk7Ci0gICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLQotICAgIC8vIFRoZSBmb2xsb3dpbmcgY2FsbCBkZXF1ZXVlcyBhbmQgcXVldWVzIHRoZSBidWZmZXIKLSAgICBlZ2xTd2FwQnVmZmVycyhtRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UpOwotICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0gICAgZ2xEaXNhYmxlKEdMX1NDSVNTT1JfVEVTVCk7Ci19Ci0KLS8vIFNldCB1cCB0aGUgTWVkaWFSZWNvcmRlciB3aGljaCBydW5zIGluIHRoZSBzYW1lIHByb2Nlc3MgYXMgbWVkaWFzZXJ2ZXIKLXNwPE1lZGlhUmVjb3JkZXI+IFN1cmZhY2VNZWRpYVNvdXJjZUdMVGVzdDo6c2V0VXBNZWRpYVJlY29yZGVyKGludCBmZCwgaW50IHZpZGVvU291cmNlLAotICAgICAgICBpbnQgb3V0cHV0Rm9ybWF0LCBpbnQgdmlkZW9FbmNvZGVyLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmcHMpIHsKLSAgICBzcDxNZWRpYVJlY29yZGVyPiBtciA9IG5ldyBNZWRpYVJlY29yZGVyKFN0cmluZzE2KCkpOwotICAgIG1yLT5zZXRWaWRlb1NvdXJjZSh2aWRlb1NvdXJjZSk7Ci0gICAgbXItPnNldE91dHB1dEZvcm1hdChvdXRwdXRGb3JtYXQpOwotICAgIG1yLT5zZXRWaWRlb0VuY29kZXIodmlkZW9FbmNvZGVyKTsKLSAgICBtci0+c2V0T3V0cHV0RmlsZShmZCk7Ci0gICAgbXItPnNldFZpZGVvU2l6ZSh3aWR0aCwgaGVpZ2h0KTsKLSAgICBtci0+c2V0VmlkZW9GcmFtZVJhdGUoZnBzKTsKLSAgICBtci0+cHJlcGFyZSgpOwotICAgIEFMT0dWKCJTdGFydGluZyBNZWRpYVJlY29yZGVyLi4uIik7Ci0gICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBtci0+c3RhcnQoKSk7Ci0gICAgcmV0dXJuIG1yOwotfQotCi0vLyBxdWVyeSB0aGUgbWVkaWFyZWNvcmRlciBmb3IgYSBzdXJmYWNlbWVpZGFzb3VyY2UgYW5kIGNyZWF0ZSBhbiBlZ2wgc3VyZmFjZSB3aXRoIHRoYXQKLXZvaWQgU3VyZmFjZU1lZGlhU291cmNlR0xUZXN0OjpzZXRVcEVHTFN1cmZhY2VGcm9tTWVkaWFSZWNvcmRlcihzcDxNZWRpYVJlY29yZGVyPiYgbXIpIHsKLSAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBpU1QgPSBtci0+cXVlcnlTdXJmYWNlTWVkaWFTb3VyY2VGcm9tTWVkaWFTZXJ2ZXIoKTsKLSAgICBtU1RDID0gbmV3IFN1cmZhY2UoaVNUKTsKLSAgICBtQU5XID0gbVNUQzsKLQotICAgIGlmIChtRWdsU3VyZmFjZSAhPSBFR0xfTk9fU1VSRkFDRSkgewotICAgICAgICBFWFBFQ1RfVFJVRShlZ2xEZXN0cm95U3VyZmFjZShtRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UpKTsKLSAgICAgICAgbUVnbFN1cmZhY2UgPSBFR0xfTk9fU1VSRkFDRTsKLSAgICB9Ci0gICAgbUVnbFN1cmZhY2UgPSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKG1FZ2xEaXNwbGF5LCBtR2xDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BTlcuZ2V0KCksIE5VTEwpOwotICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0gICAgQVNTRVJUX05FKEVHTF9OT19TVVJGQUNFLCBtRWdsU3VyZmFjZSkgOwotCi0gICAgRVhQRUNUX1RSVUUoZWdsTWFrZUN1cnJlbnQobUVnbERpc3BsYXksIG1FZ2xTdXJmYWNlLCBtRWdsU3VyZmFjZSwKLSAgICAgICAgICAgIG1FZ2xDb250ZXh0KSk7Ci0gICAgQVNTRVJUX0VRKEVHTF9TVUNDRVNTLCBlZ2xHZXRFcnJvcigpKTsKLX0KLQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIE1ldGhvZHMgaW4gU3VyZmFjZU1lZGlhU291cmNlVGVzdAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLS8vIE9uZSBwYXNzIG9mIGRlcXVldWluZyBhbmQgcXVldWluZyB0aGUgYnVmZmVyLiBGaWxsIGl0IGluIHdpdGgKLS8vIGNwdSBZVjEyIGJ1ZmZlcgotdm9pZCBTdXJmYWNlTWVkaWFTb3VyY2VUZXN0OjpvbmVCdWZmZXJQYXNzKGludCB3aWR0aCwgaW50IGhlaWdodCApIHsKLSAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBhbmI7Ci0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBuYXRpdmVfd2luZG93X2RlcXVldWVfYnVmZmVyX2FuZF93YWl0KG1BTlcuZ2V0KCksICZhbmIpKTsKLSAgICBBU1NFUlRfVFJVRShhbmIgIT0gTlVMTCk7Ci0KLQotICAgIC8vIEZpbGwgdGhlIGJ1ZmZlciB3aXRoIHRoZSBhIGNoZWNrZXJib2FyZCBwYXR0ZXJuCi0gICAgdWludDhfdCogaW1nID0gTlVMTDsKLSAgICBzcDxHcmFwaGljQnVmZmVyPiBidWYoR3JhcGhpY0J1ZmZlcjo6ZnJvbShhbmIpKTsKLSAgICBidWYtPmxvY2soR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwgKHZvaWQqKikoJmltZykpOwotICAgIFN1cmZhY2VNZWRpYVNvdXJjZVRlc3Q6OmZpbGxZVjEyQnVmZmVyKGltZywgd2lkdGgsIGhlaWdodCwgYnVmLT5nZXRTdHJpZGUoKSk7Ci0gICAgYnVmLT51bmxvY2soKTsKLQotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbUFOVy0+cXVldWVCdWZmZXIobUFOVy5nZXQoKSwgYnVmLT5nZXROYXRpdmVCdWZmZXIoKSwKLSAgICAgICAgICAgIC0xKSk7Ci19Ci0KLS8vIERlcXVldWluZyBhbmQgcXVldWluZyB0aGUgYnVmZmVyIHdpdGhvdXQgcmVhbGx5IGZpbGxpbmcgaXQgaW4uCi12b2lkIFN1cmZhY2VNZWRpYVNvdXJjZVRlc3Q6Om9uZUJ1ZmZlclBhc3NOb0ZpbGwoCi0gICAgICAgIGludCAvKiB3aWR0aCAqLywgaW50IC8qIGhlaWdodCAgKi8pIHsKLSAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBhbmI7Ci0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBuYXRpdmVfd2luZG93X2RlcXVldWVfYnVmZmVyX2FuZF93YWl0KG1BTlcuZ2V0KCksICZhbmIpKTsKLSAgICBBU1NFUlRfVFJVRShhbmIgIT0gTlVMTCk7Ci0KLSAgICAvLyBXZSBkbyBub3QgZmlsbCB0aGUgYnVmZmVyIGluLiBKdXN0IHF1ZXVlIGl0IGJhY2suCi0gICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmKEdyYXBoaWNCdWZmZXI6OmZyb20oYW5iKSk7Ci0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtQU5XLT5xdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCBidWYtPmdldE5hdGl2ZUJ1ZmZlcigpLAotICAgICAgICAgICAgLTEpKTsKLX0KLQotLy8gRmlsbCBhIFlWMTIgYnVmZmVyIHdpdGggYSBtdWx0aS1jb2xvcmVkIGNoZWNrZXJib2FyZCBwYXR0ZXJuCi12b2lkIFN1cmZhY2VNZWRpYVNvdXJjZVRlc3Q6OmZpbGxZVjEyQnVmZmVyKHVpbnQ4X3QqIGJ1ZiwgaW50IHcsIGludCBoLCBpbnQgc3RyaWRlKSB7Ci0gICAgY29uc3QgaW50IGJsb2NrV2lkdGggPSB3ID4gMTYgPyB3IC8gMTYgOiAxOwotICAgIGNvbnN0IGludCBibG9ja0hlaWdodCA9IGggPiAxNiA/IGggLyAxNiA6IDE7Ci0gICAgY29uc3QgaW50IHl1dlRleE9mZnNldFkgPSAwOwotICAgIGludCB5dXZUZXhTdHJpZGVZID0gc3RyaWRlOwotICAgIGludCB5dXZUZXhPZmZzZXRWID0geXV2VGV4U3RyaWRlWSAqIGg7Ci0gICAgaW50IHl1dlRleFN0cmlkZVYgPSAoeXV2VGV4U3RyaWRlWS8yICsgMHhmKSAmIH4weGY7Ci0gICAgaW50IHl1dlRleE9mZnNldFUgPSB5dXZUZXhPZmZzZXRWICsgeXV2VGV4U3RyaWRlViAqIGgvMjsKLSAgICBpbnQgeXV2VGV4U3RyaWRlVSA9IHl1dlRleFN0cmlkZVY7Ci0gICAgZm9yIChpbnQgeCA9IDA7IHggPCB3OyB4KyspIHsKLSAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBoOyB5KyspIHsKLSAgICAgICAgICAgIGludCBwYXJpdHlYID0gKHggLyBibG9ja1dpZHRoKSAmIDE7Ci0gICAgICAgICAgICBpbnQgcGFyaXR5WSA9ICh5IC8gYmxvY2tIZWlnaHQpICYgMTsKLSAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgaW50ZW5zaXR5ID0gKHBhcml0eVggXiBwYXJpdHlZKSA/IDYzIDogMTkxOwotICAgICAgICAgICAgYnVmW3l1dlRleE9mZnNldFkgKyAoeSAqIHl1dlRleFN0cmlkZVkpICsgeF0gPSBpbnRlbnNpdHk7Ci0gICAgICAgICAgICBpZiAoeCA8IHcgLyAyICYmIHkgPCBoIC8gMikgewotICAgICAgICAgICAgICAgIGJ1Zlt5dXZUZXhPZmZzZXRVICsgKHkgKiB5dXZUZXhTdHJpZGVVKSArIHhdID0gaW50ZW5zaXR5OwotICAgICAgICAgICAgICAgIGlmICh4ICogMiA8IHcgLyAyICYmIHkgKiAyIDwgaCAvIDIpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmW3l1dlRleE9mZnNldFYgKyAoeSoyICogeXV2VGV4U3RyaWRlVikgKyB4KjIgKyAwXSA9Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zlt5dXZUZXhPZmZzZXRWICsgKHkqMiAqIHl1dlRleFN0cmlkZVYpICsgeCoyICsgMV0gPQotICAgICAgICAgICAgICAgICAgICBidWZbeXV2VGV4T2Zmc2V0ViArICgoeSoyKzEpICogeXV2VGV4U3RyaWRlVikgKyB4KjIgKyAwXSA9Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zlt5dXZUZXhPZmZzZXRWICsgKCh5KjIrMSkgKiB5dXZUZXhTdHJpZGVWKSArIHgqMiArIDFdID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludGVuc2l0eTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIEZpbGwgYSBZVjEyIGJ1ZmZlciB3aXRoIHJlZCBvdXRzaWRlIGEgZ2l2ZW4gcmVjdGFuZ2xlIGFuZCBncmVlbiBpbnNpZGUgaXQuCi12b2lkIFN1cmZhY2VNZWRpYVNvdXJjZVRlc3Q6OmZpbGxZVjEyQnVmZmVyUmVjdCh1aW50OF90KiBidWYsIGludCB3LAotICAgICAgICAgICAgICAgICAgaW50IGgsIGludCBzdHJpZGUsIGNvbnN0IGFuZHJvaWRfbmF0aXZlX3JlY3RfdCYgcmVjdCkgewotICAgIGNvbnN0IGludCB5dXZUZXhPZmZzZXRZID0gMDsKLSAgICBpbnQgeXV2VGV4U3RyaWRlWSA9IHN0cmlkZTsKLSAgICBpbnQgeXV2VGV4T2Zmc2V0ViA9IHl1dlRleFN0cmlkZVkgKiBoOwotICAgIGludCB5dXZUZXhTdHJpZGVWID0gKHl1dlRleFN0cmlkZVkvMiArIDB4ZikgJiB+MHhmOwotICAgIGludCB5dXZUZXhPZmZzZXRVID0geXV2VGV4T2Zmc2V0ViArIHl1dlRleFN0cmlkZVYgKiBoLzI7Ci0gICAgaW50IHl1dlRleFN0cmlkZVUgPSB5dXZUZXhTdHJpZGVWOwotICAgIGZvciAoaW50IHggPSAwOyB4IDwgdzsgeCsrKSB7Ci0gICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaDsgeSsrKSB7Ci0gICAgICAgICAgICBib29sIGluc2lkZSA9IHJlY3QubGVmdCA8PSB4ICYmIHggPCByZWN0LnJpZ2h0ICYmCi0gICAgICAgICAgICAgICAgICAgIHJlY3QudG9wIDw9IHkgJiYgeSA8IHJlY3QuYm90dG9tOwotICAgICAgICAgICAgYnVmW3l1dlRleE9mZnNldFkgKyAoeSAqIHl1dlRleFN0cmlkZVkpICsgeF0gPSBpbnNpZGUgPyAyNDAgOiA2NDsKLSAgICAgICAgICAgIGlmICh4IDwgdyAvIDIgJiYgeSA8IGggLyAyKSB7Ci0gICAgICAgICAgICAgICAgYm9vbCBpbnNpZGUgPSByZWN0LmxlZnQgPD0gMip4ICYmIDIqeCA8IHJlY3QucmlnaHQgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QudG9wIDw9IDIqeSAmJiAyKnkgPCByZWN0LmJvdHRvbTsKLSAgICAgICAgICAgICAgICBidWZbeXV2VGV4T2Zmc2V0VSArICh5ICogeXV2VGV4U3RyaWRlVSkgKyB4XSA9IDE2OwotICAgICAgICAgICAgICAgIGJ1Zlt5dXZUZXhPZmZzZXRWICsgKHkgKiB5dXZUZXhTdHJpZGVWKSArIHhdID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2lkZSA/IDE2IDogMjU1OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfSAgLy8vLy8vLy8vIEVuZCBvZiBjbGFzcyBTdXJmYWNlTWVkaWFTb3VyY2VUZXN0Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIENsYXNzIHRvIGltaXRhdGUgdGhlIHJlY29yZGluZyAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXN0cnVjdCBTaW1wbGVEdW1teVJlY29yZGVyIHsKLSAgICAgICAgc3A8TWVkaWFTb3VyY2U+IG1Tb3VyY2U7Ci0KLSAgICAgICAgZXhwbGljaXQgU2ltcGxlRHVtbXlSZWNvcmRlcgotICAgICAgICAgICAgICAgIChjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSk6IG1Tb3VyY2Uoc291cmNlKSB7fQotCi0gICAgICAgIHN0YXR1c190IHN0YXJ0KCkgeyByZXR1cm4gbVNvdXJjZS0+c3RhcnQoKTt9Ci0gICAgICAgIHN0YXR1c190IHN0b3AoKSAgeyByZXR1cm4gbVNvdXJjZS0+c3RvcCgpO30KLQotICAgICAgICAvLyBmYWtlcyByZWFkaW5nIGZyb20gYSBtZWRpYSBzb3VyY2UKLSAgICAgICAgc3RhdHVzX3QgcmVhZEZyb21Tb3VyY2UoKSB7Ci0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyOwotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+cmVhZCgmYnVmZmVyKTsKLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBidWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci19OwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gICAgICAgICAgIFRFU1RTCi0vLyBTdXJmYWNlTWVkaWFTb3VyY2VUZXN0IGNsYXNzIGNvbnRhaW5zIHRlc3RzIHRoYXQgZmlsbCB0aGUgYnVmZmVycwotLy8gdXNpbmcgdGhlIGNwdSBjYWxscwotLy8gU3VyZmFjZU1lZGlhU291cmNlR0xUZXN0IGNsYXNzIGNvbnRhaW5zIHRlc3RzIHRoYXQgZmlsbCB0aGUgYnVmZmVycwotLy8gdXNpbmcgdGhlIEdMIGNhbGxzLgotLy8gVE9ETzogTm9uZSBvZiB0aGUgdGVzdHMgYWN0dWFsbHkgdmVyaWZ5IHRoZSBlbmNvZGVkIGltYWdlcy4uIHNvIGF0IHRoaXMgcG9pbnQsCi0vLyB0aGVzZSBhcmUgbW9zdGx5IGZ1bmN0aW9uYWxpdHkgdGVzdHMgKyB2aXN1YWwgaW5zcGVjdGlvbgotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0vLyBKdXN0IHBhc3Mgb25lIGJ1ZmZlciBmcm9tIHRoZSBuYXRpdmVfd2luZG93IHRvIHRoZSBTdXJmYWNlTWVkaWFTb3VyY2UKLS8vIER1bW15IEVuY29kZXIKLXN0YXRpYyBpbnQgdGVzdElkID0gMTsKLVRFU1RfRihTdXJmYWNlTWVkaWFTb3VyY2VUZXN0LCBESVNBQkxFRF9EdW1teUVuY29kaW5nRnJvbUNwdUZpbGxlZFlWMTJCdWZmZXJOcG90T25lQnVmZmVyUGFzcykgewotICAgIEFMT0dWKCJUZXN0ICMgJWQiLCB0ZXN0SWQrKyk7Ci0gICAgQUxPR1YoIlRlc3RpbmcgT25lQnVmZmVyUGFzcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsKLQotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19mb3JtYXQobUFOVy5nZXQoKSwKLSAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWVYxMikpOwotICAgIG9uZUJ1ZmZlclBhc3MobVl1dlRleFdpZHRoLCBtWXV2VGV4SGVpZ2h0KTsKLX0KLQotLy8gUGFzcyB0aGUgYnVmZmVyIHdpdGggdGhlIHdyb25nIGhlaWdodCBhbmQgd2VpZ2h0IGFuZCBzaG91bGQgbm90IGJlIGFjY2VwdGVkCi0vLyBEdW1teSBFbmNvZGVyCi1URVNUX0YoU3VyZmFjZU1lZGlhU291cmNlVGVzdCwgRElTQUJMRURfRHVtbXlFbmNvZGluZ0Zyb21DcHVGaWxsZWRZVjEyQnVmZmVyTnBvdFdyb25nU2l6ZUJ1ZmZlclBhc3MpIHsKLSAgICBBTE9HVigiVGVzdCAjICVkIiwgdGVzdElkKyspOwotICAgIEFMT0dWKCJUZXN0aW5nIFdyb25nIHNpemUgQnVmZmVyUGFzcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsKLQotICAgIC8vIHNldHRpbmcgdGhlIGNsaWVudCBzaWRlIGJ1ZmZlciBzaXplIGRpZmZlcmVudCB0aGFuIHRoZSBzZXJ2ZXIgc2l6ZQotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19kaW1lbnNpb25zKG1BTlcuZ2V0KCksCi0gICAgICAgICAgICAgMTAsIDEwKSk7Ci0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2Zvcm1hdChtQU5XLmdldCgpLAotICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyKSk7Ci0KLSAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBhbmI7Ci0KLSAgICAvLyBOb3RlOiBtYWtlIHN1cmUgd2UgZ2V0IGFuIEVSUk9SIGJhY2sgd2hlbiBkZXF1ZXVpbmchCi0gICAgQVNTRVJUX05FKE5PX0VSUk9SLCBuYXRpdmVfd2luZG93X2RlcXVldWVfYnVmZmVyX2FuZF93YWl0KG1BTlcuZ2V0KCksICZhbmIpKTsKLX0KLQotLy8gcGFzcyBtdWx0aXBsZSBidWZmZXJzIGZyb20gdGhlIG5hdGl2ZV93aW5kb3cgdGhlIFN1cmZhY2VNZWRpYVNvdXJjZQotLy8gRHVtbXkgRW5jb2RlcgotVEVTVF9GKFN1cmZhY2VNZWRpYVNvdXJjZVRlc3QsICBESVNBQkxFRF9EdW1teUVuY29kaW5nRnJvbUNwdUZpbGxlZFlWMTJCdWZmZXJOcG90TXVsdGlCdWZmZXJQYXNzKSB7Ci0gICAgQUxPR1YoIlRlc3QgIyAlZCIsIHRlc3RJZCsrKTsKLSAgICBBTE9HVigiVGVzdGluZyBNdWx0aUJ1ZmZlclBhc3MsIER1bW15IFJlY29yZGVyICoqKioqKioqKioqKioqKioqKioqKiIpOwotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19mb3JtYXQobUFOVy5nZXQoKSwKLSAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWVYxMikpOwotCi0gICAgU2ltcGxlRHVtbXlSZWNvcmRlciB3cml0ZXIobVNNUyk7Ci0gICAgd3JpdGVyLnN0YXJ0KCk7Ci0KLSAgICBpbnQzMl90IG5GcmFtZXNDb3VudCA9IDA7Ci0gICAgd2hpbGUgKG5GcmFtZXNDb3VudCA8IDMwMCkgewotICAgICAgICBvbmVCdWZmZXJQYXNzKG1ZdXZUZXhXaWR0aCwgbVl1dlRleEhlaWdodCk7Ci0KLSAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCB3cml0ZXIucmVhZEZyb21Tb3VyY2UoKSk7Ci0KLSAgICAgICAgbkZyYW1lc0NvdW50Kys7Ci0gICAgfQotICAgIHdyaXRlci5zdG9wKCk7Ci19Ci0KLS8vIERlbGF5ZWQgcGFzcyBvZiBtdWx0aXBsZSBidWZmZXJzIGZyb20gdGhlIG5hdGl2ZV93aW5kb3cgdGhlIFN1cmZhY2VNZWRpYVNvdXJjZQotLy8gRHVtbXkgRW5jb2RlcgotVEVTVF9GKFN1cmZhY2VNZWRpYVNvdXJjZVRlc3QsICBEdW1teUxhZ0VuY29kaW5nRnJvbUNwdUZpbGxlZFlWMTJCdWZmZXJOcG90TXVsdGlCdWZmZXJQYXNzKSB7Ci0gICAgQUxPR1YoIlRlc3QgIyAlZCIsIHRlc3RJZCsrKTsKLSAgICBBTE9HVigiVGVzdGluZyBNdWx0aUJ1ZmZlclBhc3MsIER1bW15IFJlY29yZGVyIExhZ2dpbmcgKioqKioqKioqKioqKioiKTsKLQotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19mb3JtYXQobUFOVy5nZXQoKSwKLSAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWVYxMikpOwotCi0gICAgU2ltcGxlRHVtbXlSZWNvcmRlciB3cml0ZXIobVNNUyk7Ci0gICAgd3JpdGVyLnN0YXJ0KCk7Ci0KLSAgICBpbnQzMl90IG5GcmFtZXNDb3VudCA9IDE7Ci0gICAgY29uc3QgaW50IEZSQU1FU19MQUcgPSBTdXJmYWNlTWVkaWFTb3VyY2U6Ok1JTl9VTkRFUVVFVUVEX0JVRkZFUlM7Ci0KLSAgICB3aGlsZSAobkZyYW1lc0NvdW50IDw9IDMwMCkgewotICAgICAgICBBTE9HVigiRnJhbWU6ICVkIiwgbkZyYW1lc0NvdW50KTsKLSAgICAgICAgb25lQnVmZmVyUGFzcyhtWXV2VGV4V2lkdGgsIG1ZdXZUZXhIZWlnaHQpOwotICAgICAgICAvLyBGb3JjaW5nIHRoZSB3cml0ZXIgdG8gbGFnIGJlaGluZCBhIGZldyBmcmFtZXMKLSAgICAgICAgaWYgKG5GcmFtZXNDb3VudCA+IEZSQU1FU19MQUcpIHsKLSAgICAgICAgICAgIEFTU0VSVF9FUShOT19FUlJPUiwgd3JpdGVyLnJlYWRGcm9tU291cmNlKCkpOwotICAgICAgICB9Ci0gICAgICAgIG5GcmFtZXNDb3VudCsrOwotICAgIH0KLSAgICB3cml0ZXIuc3RvcCgpOwotfQotCi0vLyBwYXNzIG11bHRpcGxlIGJ1ZmZlcnMgZnJvbSB0aGUgbmF0aXZlX3dpbmRvdyB0aGUgU3VyZmFjZU1lZGlhU291cmNlCi0vLyBBIGR1bW15IHdyaXRlciAoTVVMVElUSFJFQURFRCkgaXMgdXNlZCB0byBzaW11bGF0ZSBhY3R1YWwgTVBFRzRXcml0ZXIKLVRFU1RfRihTdXJmYWNlTWVkaWFTb3VyY2VUZXN0LCBEdW1teVRocmVhZGVkRW5jb2RpbmdGcm9tQ3B1RmlsbGVkWVYxMkJ1ZmZlck5wb3RNdWx0aUJ1ZmZlclBhc3MpIHsKLSAgICBBTE9HVigiVGVzdCAjICVkIiwgdGVzdElkKyspOwotICAgIEFMT0dWKCJUZXN0aW5nIE11bHRpQnVmZmVyUGFzcywgRHVtbXkgUmVjb3JkZXIgTXVsdGktVGhyZWFkZWQgKioqKioqKioqKiIpOwotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19mb3JtYXQobUFOVy5nZXQoKSwKLSAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWVYxMikpOwotCi0gICAgRHVtbXlSZWNvcmRlciB3cml0ZXIobVNNUyk7Ci0gICAgd3JpdGVyLnN0YXJ0KCk7Ci0KLSAgICBpbnQzMl90IG5GcmFtZXNDb3VudCA9IDA7Ci0gICAgd2hpbGUgKG5GcmFtZXNDb3VudCA8PSAzMDApIHsKLSAgICAgICAgQUxPR1YoIkZyYW1lOiAlZCIsIG5GcmFtZXNDb3VudCk7Ci0gICAgICAgIG9uZUJ1ZmZlclBhc3MobVl1dlRleFdpZHRoLCBtWXV2VGV4SGVpZ2h0KTsKLQotICAgICAgICBuRnJhbWVzQ291bnQrKzsKLSAgICB9Ci0gICAgd3JpdGVyLnN0b3AoKTsKLX0KLQotLy8gVGVzdCB0byBleGFtaW5lIGFjdHVhbCBlbmNvZGluZyB1c2luZyBtZWRpYXJlY29yZGVyCi0vLyBXZSB1c2UgdGhlIG1lZGlhc2VydmVyIHRvIGNyZWF0ZSBhIG1lZGlhcmVjb3JkZXIgYW5kIHNlbmQKLS8vIGl0IGJhY2sgdG8gdXMuIFNvIFN1cmZhY2VNZWRpYVNvdXJjZSBsaXZlcyBpbiB0aGUgc2FtZSBwcm9jZXNzCi0vLyBhcyB0aGUgbWVkaWFzZXJ2ZXIuCi0vLyBWZXJ5IGNsb3NlIHRvIHRoZSBhY3R1YWwgY2FtZXJhLCBleGNlcHQgdGhhdCB0aGUKLS8vIGJ1ZmZlcnMgYXJlIGZpbGxlZCBhbmQgcXVldWV1ZCBieSB0aGUgQ1BVIGluc3RlYWQgb2YgR0wuCi1URVNUX0YoU3VyZmFjZU1lZGlhU291cmNlVGVzdCwgRElTQUJMRURfRW5jb2RpbmdGcm9tQ3B1WVYxMkJ1ZmZlck5wb3RXcml0ZU1lZGlhU2VydmVyKSB7Ci0gICAgQUxPR1YoIlRlc3QgIyAlZCIsIHRlc3RJZCsrKTsKLSAgICBBTE9HVigiKioqKioqKioqKioqKiogVGVzdGluZyB0aGUgd2hvbGUgcGlwZWxpbmUgd2l0aCBhY3R1YWwgTWVkaWFSZWNvcmRlciAqKioqKioqKioqKiIpOwotICAgIEFMT0dWKCIqKioqKioqKioqKioqKiBTdXJmYWNlTWVkaWFTb3VyY2UgaXMgc2FtZSBwcm9jZXNzIGFzIG1lZGlhc2VydmVyICAgICoqKioqKioqKioqIik7Ci0KLSAgICBjb25zdCBjaGFyICpmaWxlTmFtZSA9ICIvc2RjYXJkL291dHB1dFN1cmZFbmNNU291cmNlLm1wNCI7Ci0gICAgaW50IGZkID0gb3BlbihmaWxlTmFtZSwgT19SRFdSIHwgT19DUkVBVCwgMDc0NCk7Ci0gICAgaWYgKGZkIDwgMCkgewotICAgICAgICBBTE9HRSgiRVJST1I6IENvdWxkIG5vdCBvcGVuIHRoZSB0aGUgZmlsZSAlcywgZmQgPSAlZCAhISIsIGZpbGVOYW1lLCBmZCk7Ci0gICAgfQotICAgIENIRUNLKGZkID49IDApOwotCi0gICAgc3A8TWVkaWFSZWNvcmRlcj4gbXIgPSBTdXJmYWNlTWVkaWFTb3VyY2VHTFRlc3Q6OnNldFVwTWVkaWFSZWNvcmRlcihmZCwKLSAgICAgICAgICAgIFZJREVPX1NPVVJDRV9TVVJGQUNFLCBPVVRQVVRfRk9STUFUX01QRUdfNCwgVklERU9fRU5DT0RFUl9IMjY0LAotICAgICAgICAgICAgbVl1dlRleFdpZHRoLCBtWXV2VGV4SGVpZ2h0LCAzMCk7Ci0gICAgLy8gZ2V0IHRoZSByZWZlcmVuY2UgdG8gdGhlIHN1cmZhY2VtZWRpYXNvdXJjZSBsaXZpbmcgaW4KLSAgICAvLyBtZWRpYXNlcnZlciB0aGF0IGlzIGNyZWF0ZWQgYnkgc3RhZ2VmcmlnaHRyZWNvcmRlcgotICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGlTVCA9IG1yLT5xdWVyeVN1cmZhY2VNZWRpYVNvdXJjZUZyb21NZWRpYVNlcnZlcigpOwotICAgIG1TVEMgPSBuZXcgU3VyZmFjZShpU1QpOwotICAgIG1BTlcgPSBtU1RDOwotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbmF0aXZlX3dpbmRvd19hcGlfY29ubmVjdChtQU5XLmdldCgpLCBOQVRJVkVfV0lORE9XX0FQSV9DUFUpKTsKLSAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZm9ybWF0KG1BTlcuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lWMTIpKTsKLQotICAgIGludDMyX3QgbkZyYW1lc0NvdW50ID0gMDsKLSAgICB3aGlsZSAobkZyYW1lc0NvdW50IDw9IDMwMCkgewotICAgICAgICBvbmVCdWZmZXJQYXNzTm9GaWxsKG1ZdXZUZXhXaWR0aCwgbVl1dlRleEhlaWdodCk7Ci0gICAgICAgIG5GcmFtZXNDb3VudCsrOwotICAgICAgICBBTE9HVigiZnJhbWVzQ291bnQgPSAlZCIsIG5GcmFtZXNDb3VudCk7Ci0gICAgfQotCi0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBuYXRpdmVfd2luZG93X2FwaV9kaXNjb25uZWN0KG1BTlcuZ2V0KCksIE5BVElWRV9XSU5ET1dfQVBJX0NQVSkpOwotICAgIEFMT0dWKCJTdG9wcGluZyBNZWRpYVJlY29yZGVyLi4uIik7Ci0gICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBtci0+c3RvcCgpKTsKLSAgICBtci5jbGVhcigpOwotICAgIGNsb3NlKGZkKTsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gR0wgdGVzdHMKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0vLyBUZXN0IHRvIGV4YW1pbmUgd2hldGhlciB3ZSBjYW4gY2hvb3NlIHRoZSBSZWNvcmRhYmxlIEFuZHJvaWQgR0xDb25maWcKLS8vIER1bW15UmVjb3JkZXIgdXNlZC0gbm8gcmVhbCBlbmNvZGluZyBoZXJlCi1URVNUX0YoU3VyZmFjZU1lZGlhU291cmNlR0xUZXN0LCBDaG9vc2VBbmRyb2lkUmVjb3JkYWJsZUVHTENvbmZpZ0R1bW15V3JpdGVyKSB7Ci0gICAgQUxPR1YoIlRlc3QgIyAlZCIsIHRlc3RJZCsrKTsKLSAgICBBTE9HVigiVmVyaWZ5IGNyZWF0aW5nIGEgc3VyZmFjZSB3LyByaWdodCBjb25maWcgKyBkdW1teSB3cml0ZXIqKioqKioqKioiKTsKLQotICAgIG1TTVMgPSBuZXcgU3VyZmFjZU1lZGlhU291cmNlKG1ZdXZUZXhXaWR0aCwgbVl1dlRleEhlaWdodCk7Ci0gICAgbVNUQyA9IG5ldyBTdXJmYWNlKG1TTVMtPmdldFByb2R1Y2VyKCkpOwotICAgIG1BTlcgPSBtU1RDOwotCi0gICAgRHVtbXlSZWNvcmRlciB3cml0ZXIobVNNUyk7Ci0gICAgd3JpdGVyLnN0YXJ0KCk7Ci0KLSAgICBpZiAobUVnbFN1cmZhY2UgIT0gRUdMX05PX1NVUkZBQ0UpIHsKLSAgICAgICAgRVhQRUNUX1RSVUUoZWdsRGVzdHJveVN1cmZhY2UobUVnbERpc3BsYXksIG1FZ2xTdXJmYWNlKSk7Ci0gICAgICAgIG1FZ2xTdXJmYWNlID0gRUdMX05PX1NVUkZBQ0U7Ci0gICAgfQotCi0gICAgbUVnbFN1cmZhY2UgPSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKG1FZ2xEaXNwbGF5LCBtR2xDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BTlcuZ2V0KCksIE5VTEwpOwotICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0gICAgQVNTRVJUX05FKEVHTF9OT19TVVJGQUNFLCBtRWdsU3VyZmFjZSkgOwotCi0gICAgRVhQRUNUX1RSVUUoZWdsTWFrZUN1cnJlbnQobUVnbERpc3BsYXksIG1FZ2xTdXJmYWNlLCBtRWdsU3VyZmFjZSwKLSAgICAgICAgICAgIG1FZ2xDb250ZXh0KSk7Ci0gICAgQVNTRVJUX0VRKEVHTF9TVUNDRVNTLCBlZ2xHZXRFcnJvcigpKTsKLQotICAgIGludDMyX3QgbkZyYW1lc0NvdW50ID0gMDsKLSAgICB3aGlsZSAobkZyYW1lc0NvdW50IDw9IDMwMCkgewotICAgICAgICBvbmVCdWZmZXJQYXNzR0woKTsKLSAgICAgICAgbkZyYW1lc0NvdW50Kys7Ci0gICAgICAgIEFMT0dWKCJmcmFtZXNDb3VudCA9ICVkIiwgbkZyYW1lc0NvdW50KTsKLSAgICB9Ci0KLSAgICBFWFBFQ1RfVFJVRShlZ2xNYWtlQ3VycmVudChtRWdsRGlzcGxheSwgRUdMX05PX1NVUkZBQ0UsIEVHTF9OT19TVVJGQUNFLAotICAgICAgICAgICAgRUdMX05PX0NPTlRFWFQpKTsKLSAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotICAgIGVnbERlc3Ryb3lTdXJmYWNlKG1FZ2xEaXNwbGF5LCBtRWdsU3VyZmFjZSk7Ci0gICAgbUVnbFN1cmZhY2UgPSBFR0xfTk9fU1VSRkFDRTsKLQotICAgIHdyaXRlci5zdG9wKCk7Ci19Ci0vLyBUZXN0IHRvIGV4YW1pbmUgd2hldGhlciB3ZSBjYW4gcmVuZGVyIEdMIGJ1ZmZlcnMgaW4gdG8gdGhlIHN1cmZhY2UKLS8vIGNyZWF0ZWQgd2l0aCB0aGUgbmF0aXZlIHdpbmRvdyBoYW5kbGUKLVRFU1RfRihTdXJmYWNlTWVkaWFTb3VyY2VHTFRlc3QsIFJlbmRlcmluZ1RvUmVjb3JkYWJsZUVHTFN1cmZhY2VXb3JrcykgewotICAgIEFMT0dWKCJUZXN0ICMgJWQiLCB0ZXN0SWQrKyk7Ci0gICAgQUxPR1YoIlJlbmRlcmluZ1RvUmVjb3JkYWJsZUVHTFN1cmZhY2VXb3JrcyAqKioqKioqKioqKioqKioqKioqKioiKTsKLSAgICAvLyBEbyB0aGUgcHJvZHVjZXIgc2lkZSBvZiB0aGluZ3MKLSAgICBnbENsZWFyQ29sb3IoMC42LCAwLjYsIDAuNiwgMC42KTsKLSAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotCi0gICAgZ2xFbmFibGUoR0xfU0NJU1NPUl9URVNUKTsKLSAgICBnbFNjaXNzb3IoNCwgNCwgNCwgNCk7Ci0gICAgZ2xDbGVhckNvbG9yKDEuMCwgMC4wLCAwLjAsIDEuMCk7Ci0gICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLQotICAgIGdsU2Npc3NvcigyNCwgNDgsIDQsIDQpOwotICAgIGdsQ2xlYXJDb2xvcigwLjAsIDEuMCwgMC4wLCAxLjApOwotICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0KLSAgICBnbFNjaXNzb3IoMzcsIDE3LCA0LCA0KTsKLSAgICBnbENsZWFyQ29sb3IoMC4wLCAwLjAsIDEuMCwgMS4wKTsKLSAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotCi0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCggMCwgIDAsIDE1MywgMTUzLCAxNTMsIDE1MykpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoNjMsICAwLCAxNTMsIDE1MywgMTUzLCAxNTMpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDYzLCA2MywgMTUzLCAxNTMsIDE1MywgMTUzKSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCggMCwgNjMsIDE1MywgMTUzLCAxNTMsIDE1MykpOwotCi0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCggNCwgIDcsIDI1NSwgICAwLCAgIDAsIDI1NSkpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoMjUsIDUxLCAgIDAsIDI1NSwgICAwLCAyNTUpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDQwLCAxOSwgICAwLCAgIDAsIDI1NSwgMjU1KSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCgyOSwgNTEsIDE1MywgMTUzLCAxNTMsIDE1MykpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoIDUsIDMyLCAxNTMsIDE1MywgMTUzLCAxNTMpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDEzLCAgOCwgMTUzLCAxNTMsIDE1MywgMTUzKSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCg0NiwgIDMsIDE1MywgMTUzLCAxNTMsIDE1MykpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoMzAsIDMzLCAxNTMsIDE1MywgMTUzLCAxNTMpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKCA2LCA1MiwgMTUzLCAxNTMsIDE1MywgMTUzKSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCg1NSwgMzMsIDE1MywgMTUzLCAxNTMsIDE1MykpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoMTYsIDI5LCAxNTMsIDE1MywgMTUzLCAxNTMpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKCAxLCAzMCwgMTUzLCAxNTMsIDE1MywgMTUzKSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCg0MSwgMzcsIDE1MywgMTUzLCAxNTMsIDE1MykpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoNDYsIDI5LCAxNTMsIDE1MywgMTUzLCAxNTMpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDE1LCAyNSwgMTUzLCAxNTMsIDE1MywgMTUzKSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCggMywgNTIsIDE1MywgMTUzLCAxNTMsIDE1MykpOwotfQotCi0vLyBUZXN0IHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBlbmNvZGluZyB3aXRoIEdMIGJ1ZmZlcnMKLS8vIEFjdHVhbCBlbmNvZGVyLCBBY3R1YWwgR0wgQnVmZmVycyBGaWxsZWQgU3VyZmFjZU1lZGlhU291cmNlCi0vLyBUaGUgc2FtZSBwYXR0ZXJuIGlzIHJlbmRlcmVkIGV2ZXJ5IGZyYW1lCi1URVNUX0YoU3VyZmFjZU1lZGlhU291cmNlR0xUZXN0LCBFbmNvZGluZ0Zyb21HTFJnYmFTYW1lSW1hZ2VFYWNoQnVmTnBvdFdyaXRlKSB7Ci0gICAgQUxPR1YoIlRlc3QgIyAlZCIsIHRlc3RJZCsrKTsKLSAgICBBTE9HVigiKioqKioqKioqKioqKiogVGVzdGluZyB0aGUgd2hvbGUgcGlwZWxpbmUgd2l0aCBhY3R1YWwgUmVjb3JkZXIgKioqKioqKioqKioiKTsKLSAgICBBTE9HVigiKioqKioqKioqKioqKiogR0wgRmlsbGluZyB0aGUgYnVmZmVycyAqKioqKioqKioqKiIpOwotICAgIC8vIE5vdGU6IE5vIG5lZWQgdG8gc2V0IHRoZSBjb2xvcmZvcm1hdCBmb3IgdGhlIGJ1ZmZlcnMuIFRoZSBjb2xvcmZvcm1hdCBpcwotICAgIC8vIGluIHRoZSBHUkFsbG9jIGJ1ZmZlcnMgaXRzZWxmLgotCi0gICAgY29uc3QgY2hhciAqZmlsZU5hbWUgPSAiL3NkY2FyZC9vdXRwdXRTdXJmRW5jTVNvdXJjZUdMLm1wNCI7Ci0gICAgaW50IGZkID0gb3BlbihmaWxlTmFtZSwgT19SRFdSIHwgT19DUkVBVCwgMDc0NCk7Ci0gICAgaWYgKGZkIDwgMCkgewotICAgICAgICBBTE9HRSgiRVJST1I6IENvdWxkIG5vdCBvcGVuIHRoZSB0aGUgZmlsZSAlcywgZmQgPSAlZCAhISIsIGZpbGVOYW1lLCBmZCk7Ci0gICAgfQotICAgIENIRUNLKGZkID49IDApOwotCi0gICAgc3A8TWVkaWFSZWNvcmRlcj4gbXIgPSBzZXRVcE1lZGlhUmVjb3JkZXIoZmQsIFZJREVPX1NPVVJDRV9TVVJGQUNFLAotICAgICAgICAgICAgT1VUUFVUX0ZPUk1BVF9NUEVHXzQsIFZJREVPX0VOQ09ERVJfSDI2NCwgbVl1dlRleFdpZHRoLCBtWXV2VGV4SGVpZ2h0LCAzMCk7Ci0KLSAgICAvLyBnZXQgdGhlIHJlZmVyZW5jZSB0byB0aGUgc3VyZmFjZW1lZGlhc291cmNlIGxpdmluZyBpbgotICAgIC8vIG1lZGlhc2VydmVyIHRoYXQgaXMgY3JlYXRlZCBieSBzdGFnZWZyaWdodHJlY29yZGVyCi0gICAgc2V0VXBFR0xTdXJmYWNlRnJvbU1lZGlhUmVjb3JkZXIobXIpOwotCi0gICAgaW50MzJfdCBuRnJhbWVzQ291bnQgPSAwOwotICAgIHdoaWxlIChuRnJhbWVzQ291bnQgPD0gMzAwKSB7Ci0gICAgICAgIG9uZUJ1ZmZlclBhc3NHTCgpOwotICAgICAgICBuRnJhbWVzQ291bnQrKzsKLSAgICAgICAgQUxPR1YoImZyYW1lc0NvdW50ID0gJWQiLCBuRnJhbWVzQ291bnQpOwotICAgIH0KLQotICAgIEVYUEVDVF9UUlVFKGVnbE1ha2VDdXJyZW50KG1FZ2xEaXNwbGF5LCBFR0xfTk9fU1VSRkFDRSwgRUdMX05PX1NVUkZBQ0UsCi0gICAgICAgICAgICBFR0xfTk9fQ09OVEVYVCkpOwotICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0gICAgZWdsRGVzdHJveVN1cmZhY2UobUVnbERpc3BsYXksIG1FZ2xTdXJmYWNlKTsKLSAgICBtRWdsU3VyZmFjZSA9IEVHTF9OT19TVVJGQUNFOwotCi0gICAgQUxPR1YoIlN0b3BwaW5nIE1lZGlhUmVjb3JkZXIuLi4iKTsKLSAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIG1yLT5zdG9wKCkpOwotICAgIG1yLmNsZWFyKCk7Ci0gICAgY2xvc2UoZmQpOwotfQotCi0vLyBUZXN0IHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBlbmNvZGluZyBmcm9tIHRoZSBHTCBCdWZmZXJzCi0vLyBBY3R1YWwgZW5jb2RlciwgQWN0dWFsIEdMIEJ1ZmZlcnMgRmlsbGVkIFN1cmZhY2VNZWRpYVNvdXJjZQotLy8gQSBkaWZmZXJlbnQgcGF0dGVybiBpcyByZW5kZXJlZCBldmVyeSBmcmFtZQotVEVTVF9GKFN1cmZhY2VNZWRpYVNvdXJjZUdMVGVzdCwgRW5jb2RpbmdGcm9tR0xSZ2JhRGlmZkltYWdlRWFjaEJ1Zk5wb3RXcml0ZSkgewotICAgIEFMT0dWKCJUZXN0ICMgJWQiLCB0ZXN0SWQrKyk7Ci0gICAgQUxPR1YoIioqKioqKioqKioqKioqIFRlc3RpbmcgdGhlIHdob2xlIHBpcGVsaW5lIHdpdGggYWN0dWFsIFJlY29yZGVyICoqKioqKioqKioqIik7Ci0gICAgQUxPR1YoIioqKioqKioqKioqKioqIERpZmYgR0wgRmlsbGluZyB0aGUgYnVmZmVycyAqKioqKioqKioqKiIpOwotICAgIC8vIE5vdGU6IE5vIG5lZWQgdG8gc2V0IHRoZSBjb2xvcmZvcm1hdCBmb3IgdGhlIGJ1ZmZlcnMuIFRoZSBjb2xvcmZvcm1hdCBpcwotICAgIC8vIGluIHRoZSBHUkFsbG9jIGJ1ZmZlcnMgaXRzZWxmLgotCi0gICAgY29uc3QgY2hhciAqZmlsZU5hbWUgPSAiL3NkY2FyZC9vdXRwdXRTdXJmRW5jTVNvdXJjZUdMRGlmZi5tcDQiOwotICAgIGludCBmZCA9IG9wZW4oZmlsZU5hbWUsIE9fUkRXUiB8IE9fQ1JFQVQsIDA3NDQpOwotICAgIGlmIChmZCA8IDApIHsKLSAgICAgICAgQUxPR0UoIkVSUk9SOiBDb3VsZCBub3Qgb3BlbiB0aGUgdGhlIGZpbGUgJXMsIGZkID0gJWQgISEiLCBmaWxlTmFtZSwgZmQpOwotICAgIH0KLSAgICBDSEVDSyhmZCA+PSAwKTsKLQotICAgIHNwPE1lZGlhUmVjb3JkZXI+IG1yID0gc2V0VXBNZWRpYVJlY29yZGVyKGZkLCBWSURFT19TT1VSQ0VfU1VSRkFDRSwKLSAgICAgICAgICAgIE9VVFBVVF9GT1JNQVRfTVBFR180LCBWSURFT19FTkNPREVSX0gyNjQsIG1ZdXZUZXhXaWR0aCwgbVl1dlRleEhlaWdodCwgMzApOwotCi0gICAgLy8gZ2V0IHRoZSByZWZlcmVuY2UgdG8gdGhlIHN1cmZhY2VtZWRpYXNvdXJjZSBsaXZpbmcgaW4KLSAgICAvLyBtZWRpYXNlcnZlciB0aGF0IGlzIGNyZWF0ZWQgYnkgc3RhZ2VmcmlnaHRyZWNvcmRlcgotICAgIHNldFVwRUdMU3VyZmFjZUZyb21NZWRpYVJlY29yZGVyKG1yKTsKLQotICAgIGludDMyX3QgbkZyYW1lc0NvdW50ID0gMDsKLSAgICB3aGlsZSAobkZyYW1lc0NvdW50IDw9IDMwMCkgewotICAgICAgICBvbmVCdWZmZXJQYXNzR0wobkZyYW1lc0NvdW50KTsKLSAgICAgICAgbkZyYW1lc0NvdW50Kys7Ci0gICAgICAgIEFMT0dWKCJmcmFtZXNDb3VudCA9ICVkIiwgbkZyYW1lc0NvdW50KTsKLSAgICB9Ci0KLSAgICBFWFBFQ1RfVFJVRShlZ2xNYWtlQ3VycmVudChtRWdsRGlzcGxheSwgRUdMX05PX1NVUkZBQ0UsIEVHTF9OT19TVVJGQUNFLAotICAgICAgICAgICAgRUdMX05PX0NPTlRFWFQpKTsKLSAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotICAgIGVnbERlc3Ryb3lTdXJmYWNlKG1FZ2xEaXNwbGF5LCBtRWdsU3VyZmFjZSk7Ci0gICAgbUVnbFN1cmZhY2UgPSBFR0xfTk9fU1VSRkFDRTsKLQotICAgIEFMT0dWKCJTdG9wcGluZyBNZWRpYVJlY29yZGVyLi4uIik7Ci0gICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBtci0+c3RvcCgpKTsKLSAgICBtci5jbGVhcigpOwotICAgIGNsb3NlKGZkKTsKLX0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UZXh0RGVzY3JpcHRpb25zLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UZXh0RGVzY3JpcHRpb25zLmNwcAppbmRleCBjNzYyYTc0Li4wODhlYWFlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGV4dERlc2NyaXB0aW9ucy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RleHREZXNjcmlwdGlvbnMuY3BwCkBAIC0xNSw3ICsxNSw3IEBACiAgKi8KIAogI2luY2x1ZGUgIlRleHREZXNjcmlwdGlvbnMuaCIKLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWUuY3BwCmluZGV4IGU1MTM0ZWQuLjRiMGQ0N2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZS5jcHAKQEAgLTI3LDcgKzI3LDcgQEAKIHVzaW5nIG5hbWVzcGFjZSB3ZWJtOwogCiBuYW1lc3BhY2Ugewotc3A8QUJ1ZmZlcj4gdG9BQnVmZmVyKE1lZGlhQnVmZmVyICptYnVmKSB7CitzcDxBQnVmZmVyPiB0b0FCdWZmZXIoTWVkaWFCdWZmZXJCYXNlICptYnVmKSB7CiAgICAgc3A8QUJ1ZmZlcj4gYWJ1ZiA9IG5ldyBBQnVmZmVyKG1idWYtPnJhbmdlX2xlbmd0aCgpKTsKICAgICBtZW1jcHkoYWJ1Zi0+ZGF0YSgpLCAodWludDhfdCopIG1idWYtPmRhdGEoKSArIG1idWYtPnJhbmdlX29mZnNldCgpLCBtYnVmLT5yYW5nZV9sZW5ndGgoKSk7CiAgICAgcmV0dXJuIGFidWY7CkBAIC00Niw3ICs0Niw3IEBACiAgICAgICBtRW9zKHRydWUpIHsKIH0KIAotV2VibUZyYW1lOjpXZWJtRnJhbWUoaW50IHR5cGUsIGJvb2wga2V5LCB1aW50NjRfdCBhYnNUaW1lY29kZSwgTWVkaWFCdWZmZXIgKm1idWYpCitXZWJtRnJhbWU6OldlYm1GcmFtZShpbnQgdHlwZSwgYm9vbCBrZXksIHVpbnQ2NF90IGFic1RpbWVjb2RlLCBNZWRpYUJ1ZmZlckJhc2UgKm1idWYpCiAgICAgOiBtVHlwZSh0eXBlKSwKICAgICAgIG1LZXkoa2V5KSwKICAgICAgIG1BYnNUaW1lY29kZShhYnNUaW1lY29kZSksCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWUuaAppbmRleCA0ZjBiMDU1Li5hNDEwYTg3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lLmgKQEAgLTMwLDcgKzMwLDcgQEAKICAgICBjb25zdCBib29sIG1Fb3M7CiAKICAgICBXZWJtRnJhbWUoKTsKLSAgICBXZWJtRnJhbWUoaW50IHR5cGUsIGJvb2wga2V5LCB1aW50NjRfdCBhYnNUaW1lY29kZSwgTWVkaWFCdWZmZXIgKmJ1Zik7CisgICAgV2VibUZyYW1lKGludCB0eXBlLCBib29sIGtleSwgdWludDY0X3QgYWJzVGltZWNvZGUsIE1lZGlhQnVmZmVyQmFzZSAqYnVmKTsKICAgICB+V2VibUZyYW1lKCkge30KIAogICAgIHNwPFdlYm1FbGVtZW50PiBTaW1wbGVCbG9jayh1aW50NjRfdCBiYXNlVGltZWNvZGUpIGNvbnN0OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWVUaHJlYWQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWVUaHJlYWQuY3BwCmluZGV4IDcxYmZiYzkuLjIzMjY5YWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lVGhyZWFkLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZVRocmVhZC5jcHAKQEAgLTI1Miw3ICsyNTIsNyBAQAogfQogCiBXZWJtRnJhbWVNZWRpYVNvdXJjZVRocmVhZDo6V2VibUZyYW1lTWVkaWFTb3VyY2VUaHJlYWQoCi0gICAgICAgIGNvbnN0IHNwPElNZWRpYVNvdXJjZT4mIHNvdXJjZSwKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFTb3VyY2U+JiBzb3VyY2UsCiAgICAgICAgIGludCB0eXBlLAogICAgICAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlPGNvbnN0IHNwPFdlYm1GcmFtZT4gPiYgc2luaywKICAgICAgICAgdWludDY0X3QgdGltZUNvZGVTY2FsZSwKQEAgLTMzNyw3ICszMzcsNyBAQAogICAgIG1TdGFydFRpbWVVcyA9IGtVbmluaXRpYWxpemVkOwogCiAgICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0gICAgTWVkaWFCdWZmZXIgKmJ1ZmZlcjsKKyAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcjsKICAgICB3aGlsZSAoIW1Eb25lICYmIChlcnIgPSBtU291cmNlLT5yZWFkKCZidWZmZXIsIE5VTEwpKSA9PSBPSykgewogICAgICAgICBpZiAoYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA9PSAwKSB7CiAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKQEAgLTM0NSw4ICszNDUsOCBAQAogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAotICAgICAgICBzcDxNZXRhRGF0YT4gbWQgPSBidWZmZXItPm1ldGFfZGF0YSgpOwotICAgICAgICBDSEVDSyhtZC0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZXN0YW1wVXMpKTsKKyAgICAgICAgTWV0YURhdGFCYXNlICZtZCA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgICAgIENIRUNLKG1kLmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVzdGFtcFVzKSk7CiAgICAgICAgIGlmIChtU3RhcnRUaW1lVXMgPT0ga1VuaW5pdGlhbGl6ZWQpIHsKICAgICAgICAgICAgIG1TdGFydFRpbWVVcyA9IHRpbWVzdGFtcFVzOwogICAgICAgICB9CkBAIC0zNzQsNyArMzc0LDcgQEAKICAgICAgICAgQ0hFQ0tfR0UodGltZXN0YW1wVXMsIDBsbCk7CiAKICAgICAgICAgaW50MzJfdCBpc1N5bmMgPSBmYWxzZTsKLSAgICAgICAgbWQtPmZpbmRJbnQzMihrS2V5SXNTeW5jRnJhbWUsICZpc1N5bmMpOworICAgICAgICBtZC5maW5kSW50MzIoa0tleUlzU3luY0ZyYW1lLCAmaXNTeW5jKTsKICAgICAgICAgY29uc3Qgc3A8V2VibUZyYW1lPiBmID0gbmV3IFdlYm1GcmFtZSgKICAgICAgICAgICAgIG1UeXBlLAogICAgICAgICAgICAgaXNTeW5jLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWVUaHJlYWQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lVGhyZWFkLmgKaW5kZXggNTI4OTg0Zi4uNzZjOTFmMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWVUaHJlYWQuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZVRocmVhZC5oCkBAIC0yMCw4ICsyMCw4IEBACiAjaW5jbHVkZSAiV2VibUZyYW1lLmgiCiAjaW5jbHVkZSAiTGlua2VkQmxvY2tpbmdRdWV1ZS5oIgogCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KIAogI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KQEAgLTEyMyw3ICsxMjMsNyBAQAogY2xhc3MgV2VibUZyYW1lTWVkaWFTb3VyY2VUaHJlYWQ6IHB1YmxpYyBXZWJtRnJhbWVTb3VyY2VUaHJlYWQgewogcHVibGljOgogICAgIFdlYm1GcmFtZU1lZGlhU291cmNlVGhyZWFkKAotICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhU291cmNlPiYgc291cmNlLAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFTb3VyY2U+JiBzb3VyY2UsCiAgICAgICAgICAgICBpbnQgdHlwZSwKICAgICAgICAgICAgIExpbmtlZEJsb2NraW5nUXVldWU8Y29uc3Qgc3A8V2VibUZyYW1lPiA+JiBzaW5rLAogICAgICAgICAgICAgdWludDY0X3QgdGltZUNvZGVTY2FsZSwKQEAgLTE0Miw3ICsxNDIsNyBAQAogICAgIH0KIAogcHJpdmF0ZToKLSAgICBjb25zdCBzcDxJTWVkaWFTb3VyY2U+IG1Tb3VyY2U7CisgICAgY29uc3Qgc3A8TWVkaWFTb3VyY2U+IG1Tb3VyY2U7CiAgICAgY29uc3QgdWludDY0X3QgbVRpbWVDb2RlU2NhbGU7CiAgICAgdWludDY0X3QgbVN0YXJ0VGltZVVzOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmNwcAppbmRleCBkNmM2OTMwLi40ZDczZWI4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibVdyaXRlci5jcHAKQEAgLTM2MCw3ICszNjAsNyBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKLXN0YXR1c190IFdlYm1Xcml0ZXI6OmFkZFNvdXJjZShjb25zdCBzcDxJTWVkaWFTb3VyY2U+ICZzb3VyY2UpIHsKK3N0YXR1c190IFdlYm1Xcml0ZXI6OmFkZFNvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKICAgICBpZiAobVN0YXJ0ZWQpIHsKICAgICAgICAgQUxPR0UoIkF0dGVtcHQgdG8gYWRkIHNvdXJjZSBBRlRFUiByZWNvcmRpbmcgaXMgc3RhcnRlZCIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuaAppbmRleCA5ZjNiMTlmLi5mZmU0Yzc5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuaApAQCAtMjEsNyArMjEsNyBAQAogI2luY2x1ZGUgIldlYm1GcmFtZVRocmVhZC5oIgogI2luY2x1ZGUgIkxpbmtlZEJsb2NraW5nUXVldWUuaCIKIAotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVdyaXRlci5oPgogCiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CkBAIC00MCw3ICs0MCw3IEBACiAgICAgfldlYm1Xcml0ZXIoKSB7IHJlc2V0KCk7IH0KIAogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTb3VyY2UoY29uc3Qgc3A8SU1lZGlhU291cmNlPiAmc291cmNlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFNvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW0gPSBOVUxMKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7CkBAIC04NSw3ICs4NSw3IEBACiAgICAgICAgIGNvbnN0IGNoYXIgKm1OYW1lOwogICAgICAgICBzcDxXZWJtRWxlbWVudD4gKCptTWFrZVRyYWNrKShjb25zdCBzcDxNZXRhRGF0YT4mKTsKIAotICAgICAgICBzcDxJTWVkaWFTb3VyY2U+IG1Tb3VyY2U7CisgICAgICAgIHNwPE1lZGlhU291cmNlPiBtU291cmNlOwogICAgICAgICBzcDxXZWJtRWxlbWVudD4gbVRyYWNrRW50cnk7CiAgICAgICAgIHNwPFdlYm1GcmFtZVNvdXJjZVRocmVhZD4gbVRocmVhZDsKICAgICAgICAgTGlua2VkQmxvY2tpbmdRdWV1ZTxjb25zdCBzcDxXZWJtRnJhbWU+ID4gbVNpbms7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjA4YzViLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotY2NfbGlicmFyeV9zaGFyZWQgewotICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF93ZmQiLAotCi0gICAgc3JjczogWwotICAgICAgICAiTWVkaWFTZW5kZXIuY3BwIiwKLSAgICAgICAgIlBhcmFtZXRlcnMuY3BwIiwKLSAgICAgICAgInJ0cC9SVFBTZW5kZXIuY3BwIiwKLSAgICAgICAgInNvdXJjZS9Db252ZXJ0ZXIuY3BwIiwKLSAgICAgICAgInNvdXJjZS9NZWRpYVB1bGxlci5jcHAiLAotICAgICAgICAic291cmNlL1BsYXliYWNrU2Vzc2lvbi5jcHAiLAotICAgICAgICAic291cmNlL1JlcGVhdGVyU291cmNlLmNwcCIsCi0gICAgICAgICJzb3VyY2UvVFNQYWNrZXRpemVyLmNwcCIsCi0gICAgICAgICJzb3VyY2UvV2lmaURpc3BsYXlTb3VyY2UuY3BwIiwKLSAgICAgICAgIlZpZGVvRm9ybWF0cy5jcHAiLAotICAgIF0sCi0KLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvaGFyZHdhcmUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzIiwKLSAgICBdLAotCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm1lZGlhIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlidWkiLAotICAgICAgICAibGliZ3VpIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICBdLAotCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItV25vLW11bHRpY2hhciIsCi0gICAgICAgICItV2Vycm9yIiwKLSAgICAgICAgIi1XYWxsIiwKLSAgICBdLAotCi0gICAgc2FuaXRpemU6IHsKLSAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKLSAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCi0gICAgICAgIF0sCi0gICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAotICAgIH0sCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvTWVkaWFTZW5kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L01lZGlhU2VuZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M0MTJmNS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvTWVkaWFTZW5kZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiTWVkaWFTZW5kZXIiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJNZWRpYVNlbmRlci5oIgotCi0jaW5jbHVkZSAicnRwL1JUUFNlbmRlci5oIgotI2luY2x1ZGUgInNvdXJjZS9UU1BhY2tldGl6ZXIuaCIKLQotI2luY2x1ZGUgImluY2x1ZGUvYXZjX3V0aWxzLmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9JSERDUC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTmV0d29ya1Nlc3Npb24uaD4KLSNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotTWVkaWFTZW5kZXI6Ok1lZGlhU2VuZGVyKAotICAgICAgICBjb25zdCBzcDxBTmV0d29ya1Nlc3Npb24+ICZuZXRTZXNzaW9uLAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSkKLSAgICA6IG1OZXRTZXNzaW9uKG5ldFNlc3Npb24pLAotICAgICAgbU5vdGlmeShub3RpZnkpLAotICAgICAgbU1vZGUoTU9ERV9VTkRFRklORUQpLAotICAgICAgbUdlbmVyYXRpb24oMCksCi0gICAgICBtUHJldlRpbWVVcygtMWxsKSwKLSAgICAgIG1Jbml0RG9uZUNvdW50KDApLAotICAgICAgbUxvZ0ZpbGUoTlVMTCkgewotICAgIC8vIG1Mb2dGaWxlID0gZm9wZW4oIi9kYXRhL21pc2MvbG9nLnRzIiwgIndiIik7Ci19Ci0KLU1lZGlhU2VuZGVyOjp+TWVkaWFTZW5kZXIoKSB7Ci0gICAgaWYgKG1Mb2dGaWxlICE9IE5VTEwpIHsKLSAgICAgICAgZmNsb3NlKG1Mb2dGaWxlKTsKLSAgICAgICAgbUxvZ0ZpbGUgPSBOVUxMOwotICAgIH0KLX0KLQotc3RhdHVzX3QgTWVkaWFTZW5kZXI6OnNldEhEQ1AoY29uc3Qgc3A8SUhEQ1A+ICZoZGNwKSB7Ci0gICAgaWYgKG1Nb2RlICE9IE1PREVfVU5ERUZJTkVEKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBtSERDUCA9IGhkY3A7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXNzaXplX3QgTWVkaWFTZW5kZXI6OmFkZFRyYWNrKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LCB1aW50MzJfdCBmbGFncykgewotICAgIGlmIChtTW9kZSAhPSBNT0RFX1VOREVGSU5FRCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgVHJhY2tJbmZvIGluZm87Ci0gICAgaW5mby5tRm9ybWF0ID0gZm9ybWF0OwotICAgIGluZm8ubUZsYWdzID0gZmxhZ3M7Ci0gICAgaW5mby5tUGFja2V0aXplclRyYWNrSW5kZXggPSAtMTsKLQotICAgIEFTdHJpbmcgbWltZTsKLSAgICBDSEVDSyhmb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOwotICAgIGluZm8ubUlzQXVkaW8gPSAhc3RybmNhc2VjbXAoImF1ZGlvLyIsIG1pbWUuY19zdHIoKSwgNik7Ci0KLSAgICBzaXplX3QgaW5kZXggPSBtVHJhY2tJbmZvcy5zaXplKCk7Ci0gICAgbVRyYWNrSW5mb3MucHVzaF9iYWNrKGluZm8pOwotCi0gICAgcmV0dXJuIGluZGV4OwotfQotCi1zdGF0dXNfdCBNZWRpYVNlbmRlcjo6aW5pdEFzeW5jKAotICAgICAgICBzc2l6ZV90IHRyYWNrSW5kZXgsCi0gICAgICAgIGNvbnN0IGNoYXIgKnJlbW90ZUhvc3QsCi0gICAgICAgIGludDMyX3QgcmVtb3RlUlRQUG9ydCwKLSAgICAgICAgUlRQU2VuZGVyOjpUcmFuc3BvcnRNb2RlIHJ0cE1vZGUsCi0gICAgICAgIGludDMyX3QgcmVtb3RlUlRDUFBvcnQsCi0gICAgICAgIFJUUFNlbmRlcjo6VHJhbnNwb3J0TW9kZSBydGNwTW9kZSwKLSAgICAgICAgaW50MzJfdCAqbG9jYWxSVFBQb3J0KSB7Ci0gICAgaWYgKHRyYWNrSW5kZXggPCAwKSB7Ci0gICAgICAgIGlmIChtTW9kZSAhPSBNT0RFX1VOREVGSU5FRCkgewotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0KLSAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOwotICAgICAgICBpZiAobUhEQ1AgIT0gTlVMTCkgewotICAgICAgICAgICAgLy8gWFhYIERldGVybWluZSBwcm9wZXIgSERDUCB2ZXJzaW9uLgotICAgICAgICAgICAgZmxhZ3MgfD0gVFNQYWNrZXRpemVyOjpFTUlUX0hEQ1AyMF9ERVNDUklQVE9SOwotICAgICAgICB9Ci0gICAgICAgIG1UU1BhY2tldGl6ZXIgPSBuZXcgVFNQYWNrZXRpemVyKGZsYWdzKTsKLQotICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tJbmZvcy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgVHJhY2tJbmZvICppbmZvID0gJm1UcmFja0luZm9zLmVkaXRJdGVtQXQoaSk7Ci0KLSAgICAgICAgICAgIHNzaXplX3QgcGFja2V0aXplclRyYWNrSW5kZXggPQotICAgICAgICAgICAgICAgIG1UU1BhY2tldGl6ZXItPmFkZFRyYWNrKGluZm8tPm1Gb3JtYXQpOwotCi0gICAgICAgICAgICBpZiAocGFja2V0aXplclRyYWNrSW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gcGFja2V0aXplclRyYWNrSW5kZXg7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGluZm8tPm1QYWNrZXRpemVyVHJhY2tJbmRleCA9IHBhY2tldGl6ZXJUcmFja0luZGV4OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFNlbmRlck5vdGlmeSwgdGhpcyk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUdlbmVyYXRpb24pOwotICAgICAgICAgICAgbVRTU2VuZGVyID0gbmV3IFJUUFNlbmRlcihtTmV0U2Vzc2lvbiwgbm90aWZ5KTsKLSAgICAgICAgICAgIGxvb3BlcigpLT5yZWdpc3RlckhhbmRsZXIobVRTU2VuZGVyKTsKLQotICAgICAgICAgICAgZXJyID0gbVRTU2VuZGVyLT5pbml0QXN5bmMoCi0gICAgICAgICAgICAgICAgICAgIHJlbW90ZUhvc3QsCi0gICAgICAgICAgICAgICAgICAgIHJlbW90ZVJUUFBvcnQsCi0gICAgICAgICAgICAgICAgICAgIHJ0cE1vZGUsCi0gICAgICAgICAgICAgICAgICAgIHJlbW90ZVJUQ1BQb3J0LAotICAgICAgICAgICAgICAgICAgICBydGNwTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgbG9jYWxSVFBQb3J0KTsKLQotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIGxvb3BlcigpLT51bnJlZ2lzdGVySGFuZGxlcihtVFNTZW5kZXItPmlkKCkpOwotICAgICAgICAgICAgICAgIG1UU1NlbmRlci5jbGVhcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tJbmZvcy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtVHJhY2tJbmZvcy5lZGl0SXRlbUF0KGkpOwotICAgICAgICAgICAgICAgIGluZm8tPm1QYWNrZXRpemVyVHJhY2tJbmRleCA9IC0xOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtVFNQYWNrZXRpemVyLmNsZWFyKCk7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgbU1vZGUgPSBNT0RFX1RSQU5TUE9SVF9TVFJFQU07Ci0gICAgICAgIG1Jbml0RG9uZUNvdW50ID0gMTsKLQotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgaWYgKG1Nb2RlID09IE1PREVfVFJBTlNQT1JUX1NUUkVBTSkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgaWYgKChzaXplX3QpdHJhY2tJbmRleCA+PSBtVHJhY2tJbmZvcy5zaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIC1FUkFOR0U7Ci0gICAgfQotCi0gICAgVHJhY2tJbmZvICppbmZvID0gJm1UcmFja0luZm9zLmVkaXRJdGVtQXQodHJhY2tJbmRleCk7Ci0KLSAgICBpZiAoaW5mby0+bVNlbmRlciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VuZGVyTm90aWZ5LCB0aGlzKTsKLSAgICBub3RpZnktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUdlbmVyYXRpb24pOwotICAgIG5vdGlmeS0+c2V0U2l6ZSgidHJhY2tJbmRleCIsIHRyYWNrSW5kZXgpOwotCi0gICAgaW5mby0+bVNlbmRlciA9IG5ldyBSVFBTZW5kZXIobU5ldFNlc3Npb24sIG5vdGlmeSk7Ci0gICAgbG9vcGVyKCktPnJlZ2lzdGVySGFuZGxlcihpbmZvLT5tU2VuZGVyKTsKLQotICAgIHN0YXR1c190IGVyciA9IGluZm8tPm1TZW5kZXItPmluaXRBc3luYygKLSAgICAgICAgICAgIHJlbW90ZUhvc3QsCi0gICAgICAgICAgICByZW1vdGVSVFBQb3J0LAotICAgICAgICAgICAgcnRwTW9kZSwKLSAgICAgICAgICAgIHJlbW90ZVJUQ1BQb3J0LAotICAgICAgICAgICAgcnRjcE1vZGUsCi0gICAgICAgICAgICBsb2NhbFJUUFBvcnQpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBsb29wZXIoKS0+dW5yZWdpc3RlckhhbmRsZXIoaW5mby0+bVNlbmRlci0+aWQoKSk7Ci0gICAgICAgIGluZm8tPm1TZW5kZXIuY2xlYXIoKTsKLQotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmIChtTW9kZSA9PSBNT0RFX1VOREVGSU5FRCkgewotICAgICAgICBtSW5pdERvbmVDb3VudCA9IG1UcmFja0luZm9zLnNpemUoKTsKLSAgICB9Ci0KLSAgICBtTW9kZSA9IE1PREVfRUxFTUVOVEFSWV9TVFJFQU1TOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBNZWRpYVNlbmRlcjo6cXVldWVBY2Nlc3NVbml0KAotICAgICAgICBzaXplX3QgdHJhY2tJbmRleCwgY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpIHsKLSAgICBpZiAobU1vZGUgPT0gTU9ERV9VTkRFRklORUQpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIGlmICh0cmFja0luZGV4ID49IG1UcmFja0luZm9zLnNpemUoKSkgewotICAgICAgICByZXR1cm4gLUVSQU5HRTsKLSAgICB9Ci0KLSAgICBpZiAobU1vZGUgPT0gTU9ERV9UUkFOU1BPUlRfU1RSRUFNKSB7Ci0gICAgICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtVHJhY2tJbmZvcy5lZGl0SXRlbUF0KHRyYWNrSW5kZXgpOwotICAgICAgICBpbmZvLT5tQWNjZXNzVW5pdHMucHVzaF9iYWNrKGFjY2Vzc1VuaXQpOwotCi0gICAgICAgIG1UU1BhY2tldGl6ZXItPmV4dHJhY3RDU0RJZk5lY2Vzc2FyeShpbmZvLT5tUGFja2V0aXplclRyYWNrSW5kZXgpOwotCi0gICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgIHNzaXplX3QgbWluVHJhY2tJbmRleCA9IC0xOwotICAgICAgICAgICAgaW50NjRfdCBtaW5UaW1lVXMgPSAtMWxsOwotCi0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja0luZm9zLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgVHJhY2tJbmZvICZpbmZvID0gbVRyYWNrSW5mb3MuaXRlbUF0KGkpOwotCi0gICAgICAgICAgICAgICAgaWYgKGluZm8ubUFjY2Vzc1VuaXRzLmVtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWluVHJhY2tJbmRleCA9IC0xOwotICAgICAgICAgICAgICAgICAgICBtaW5UaW1lVXMgPSAtMWxsOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVczsKLSAgICAgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCA9ICppbmZvLm1BY2Nlc3NVbml0cy5iZWdpbigpOwotICAgICAgICAgICAgICAgIENIRUNLKGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobWluVHJhY2tJbmRleCA8IDAgfHwgdGltZVVzIDwgbWluVGltZVVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1pblRyYWNrSW5kZXggPSBpOwotICAgICAgICAgICAgICAgICAgICBtaW5UaW1lVXMgPSB0aW1lVXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobWluVHJhY2tJbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtVHJhY2tJbmZvcy5lZGl0SXRlbUF0KG1pblRyYWNrSW5kZXgpOwotICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdCA9ICppbmZvLT5tQWNjZXNzVW5pdHMuYmVnaW4oKTsKLSAgICAgICAgICAgIGluZm8tPm1BY2Nlc3NVbml0cy5lcmFzZShpbmZvLT5tQWNjZXNzVW5pdHMuYmVnaW4oKSk7Ci0KLSAgICAgICAgICAgIHNwPEFCdWZmZXI+IHRzUGFja2V0czsKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhY2tldGl6ZUFjY2Vzc1VuaXQoCi0gICAgICAgICAgICAgICAgICAgIG1pblRyYWNrSW5kZXgsIGFjY2Vzc1VuaXQsICZ0c1BhY2tldHMpOwotCi0gICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Mb2dGaWxlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgZndyaXRlKHRzUGFja2V0cy0+ZGF0YSgpLCAxLCB0c1BhY2tldHMtPnNpemUoKSwgbUxvZ0ZpbGUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGludDY0X3QgdGltZVVzOwotICAgICAgICAgICAgICAgIENIRUNLKGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7Ci0gICAgICAgICAgICAgICAgdHNQYWNrZXRzLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwotCi0gICAgICAgICAgICAgICAgZXJyID0gbVRTU2VuZGVyLT5xdWV1ZUJ1ZmZlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIHRzUGFja2V0cywKLSAgICAgICAgICAgICAgICAgICAgICAgIDMzIC8qIHBhY2tldFR5cGUgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICBSVFBTZW5kZXI6OlBBQ0tFVElaQVRJT05fVFJBTlNQT1JUX1NUUkVBTSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgVHJhY2tJbmZvICppbmZvID0gJm1UcmFja0luZm9zLmVkaXRJdGVtQXQodHJhY2tJbmRleCk7Ci0KLSAgICByZXR1cm4gaW5mby0+bVNlbmRlci0+cXVldWVCdWZmZXIoCi0gICAgICAgICAgICBhY2Nlc3NVbml0LAotICAgICAgICAgICAgaW5mby0+bUlzQXVkaW8gPyA5NiA6IDk3IC8qIHBhY2tldFR5cGUgKi8sCi0gICAgICAgICAgICBpbmZvLT5tSXNBdWRpbwotICAgICAgICAgICAgICAgID8gUlRQU2VuZGVyOjpQQUNLRVRJWkFUSU9OX0FBQyA6IFJUUFNlbmRlcjo6UEFDS0VUSVpBVElPTl9IMjY0KTsKLX0KLQotdm9pZCBNZWRpYVNlbmRlcjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7Ci0gICAgICAgIGNhc2Uga1doYXRTZW5kZXJOb3RpZnk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKLSAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9IG1HZW5lcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG9uU2VuZGVyTm90aWZ5KG1zZyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBUUkVTUEFTUygpOwotICAgIH0KLX0KLQotdm9pZCBNZWRpYVNlbmRlcjo6b25TZW5kZXJOb3RpZnkoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBpbnQzMl90IHdoYXQ7Ci0gICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoIndoYXQiLCAmd2hhdCkpOwotCi0gICAgc3dpdGNoICh3aGF0KSB7Ci0gICAgICAgIGNhc2UgUlRQU2VuZGVyOjprV2hhdEluaXREb25lOgotICAgICAgICB7Ci0gICAgICAgICAgICAtLW1Jbml0RG9uZUNvdW50OwotCi0gICAgICAgICAgICBpbnQzMl90IGVycjsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBub3RpZnlJbml0RG9uZShlcnIpOwotICAgICAgICAgICAgICAgICsrbUdlbmVyYXRpb247Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtSW5pdERvbmVDb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgbm90aWZ5SW5pdERvbmUoT0spOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIFJUUFNlbmRlcjo6a1doYXRFcnJvcjoKLSAgICAgICAgewotICAgICAgICAgICAgaW50MzJfdCBlcnI7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOwotCi0gICAgICAgICAgICBub3RpZnlFcnJvcihlcnIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0TmV0d29ya1N0YWxsOgotICAgICAgICB7Ci0gICAgICAgICAgICBzaXplX3QgbnVtQnl0ZXNRdWV1ZWQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTaXplKCJudW1CeXRlc1F1ZXVlZCIsICZudW1CeXRlc1F1ZXVlZCkpOwotCi0gICAgICAgICAgICBub3RpZnlOZXR3b3JrU3RhbGwobnVtQnl0ZXNRdWV1ZWQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0SW5mb3JtU2VuZGVyOgotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQ2NF90IGF2Z0xhdGVuY3lVczsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJhdmdMYXRlbmN5VXMiLCAmYXZnTGF0ZW5jeVVzKSk7Ci0KLSAgICAgICAgICAgIGludDY0X3QgbWF4TGF0ZW5jeVVzOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoIm1heExhdGVuY3lVcyIsICZtYXhMYXRlbmN5VXMpKTsKLQotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0SW5mb3JtU2VuZGVyKTsKLSAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50NjQoImF2Z0xhdGVuY3lVcyIsIGF2Z0xhdGVuY3lVcyk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEludDY0KCJtYXhMYXRlbmN5VXMiLCBtYXhMYXRlbmN5VXMpOwotICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBUUkVTUEFTUygpOwotICAgIH0KLX0KLQotdm9pZCBNZWRpYVNlbmRlcjo6bm90aWZ5SW5pdERvbmUoc3RhdHVzX3QgZXJyKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEluaXREb25lKTsKLSAgICBub3RpZnktPnNldEludDMyKCJlcnIiLCBlcnIpOwotICAgIG5vdGlmeS0+cG9zdCgpOwotfQotCi12b2lkIE1lZGlhU2VuZGVyOjpub3RpZnlFcnJvcihzdGF0dXNfdCBlcnIpIHsKLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0RXJyb3IpOwotICAgIG5vdGlmeS0+c2V0SW50MzIoImVyciIsIGVycik7Ci0gICAgbm90aWZ5LT5wb3N0KCk7Ci19Ci0KLXZvaWQgTWVkaWFTZW5kZXI6Om5vdGlmeU5ldHdvcmtTdGFsbChzaXplX3QgbnVtQnl0ZXNRdWV1ZWQpIHsKLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0TmV0d29ya1N0YWxsKTsKLSAgICBub3RpZnktPnNldFNpemUoIm51bUJ5dGVzUXVldWVkIiwgbnVtQnl0ZXNRdWV1ZWQpOwotICAgIG5vdGlmeS0+cG9zdCgpOwotfQotCi1zdGF0dXNfdCBNZWRpYVNlbmRlcjo6cGFja2V0aXplQWNjZXNzVW5pdCgKLSAgICAgICAgc2l6ZV90IHRyYWNrSW5kZXgsCi0gICAgICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQsCi0gICAgICAgIHNwPEFCdWZmZXI+ICp0c1BhY2tldHMpIHsKLSAgICBjb25zdCBUcmFja0luZm8gJmluZm8gPSBtVHJhY2tJbmZvcy5pdGVtQXQodHJhY2tJbmRleCk7Ci0KLSAgICB1aW50MzJfdCBmbGFncyA9IDA7Ci0KLSAgICBib29sIGlzSERDUEVuY3J5cHRlZCA9IGZhbHNlOwotICAgIHVpbnQ2NF90IGlucHV0Q1RSOwotICAgIHVpbnQ4X3QgSERDUF9wcml2YXRlX2RhdGFbMTZdOwotCi0gICAgYm9vbCBtYW51YWxseVByZXBlbmRTUFNQUFMgPQotICAgICAgICAhaW5mby5tSXNBdWRpbwotICAgICAgICAmJiAoaW5mby5tRmxhZ3MgJiBGTEFHX01BTlVBTExZX1BSRVBFTkRfU1BTX1BQUykKLSAgICAgICAgJiYgSXNJRFIoYWNjZXNzVW5pdCk7Ci0KLSAgICBpZiAobUhEQ1AgIT0gTlVMTCAmJiAhaW5mby5tSXNBdWRpbykgewotICAgICAgICBpc0hEQ1BFbmNyeXB0ZWQgPSB0cnVlOwotCi0gICAgICAgIGlmIChtYW51YWxseVByZXBlbmRTUFNQUFMpIHsKLSAgICAgICAgICAgIGFjY2Vzc1VuaXQgPSBtVFNQYWNrZXRpemVyLT5wcmVwZW5kQ1NEKAotICAgICAgICAgICAgICAgICAgICBpbmZvLm1QYWNrZXRpemVyVHJhY2tJbmRleCwgYWNjZXNzVW5pdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0dXNfdCBlcnI7Ci0gICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlOwotICAgICAgICBpZiAoYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kUG9pbnRlcigiaGFuZGxlIiwgKHZvaWQqKikmaGFuZGxlKQotICAgICAgICAgICAgICAgICYmIGhhbmRsZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpbnQzMl90IHJhbmdlTGVuZ3RoLCByYW5nZU9mZnNldDsKLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnk7Ci0gICAgICAgICAgICBDSEVDSyhhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQzMigicmFuZ2VPZmZzZXQiLCAmcmFuZ2VPZmZzZXQpKTsKLSAgICAgICAgICAgIENIRUNLKGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEludDMyKCJyYW5nZUxlbmd0aCIsICZyYW5nZUxlbmd0aCkpOwotICAgICAgICAgICAgQ0hFQ0soYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kTWVzc2FnZSgibm90aWZ5IiwgJm5vdGlmeSkKLSAgICAgICAgICAgICAgICAgICAgJiYgbm90aWZ5ICE9IE5VTEwpOwotICAgICAgICAgICAgQ0hFQ0tfR0UoKGludDMyX3QpYWNjZXNzVW5pdC0+c2l6ZSgpLCByYW5nZUxlbmd0aCk7Ci0KLSAgICAgICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IGdyYnVmKG5ldyBHcmFwaGljQnVmZmVyKAotICAgICAgICAgICAgICAgICAgICByYW5nZU9mZnNldCArIHJhbmdlTGVuZ3RoIC8qIHdpZHRoICovLCAxIC8qIGhlaWdodCAqLywKLSAgICAgICAgICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZOCwgMSAvKiBsYXllckNvdW50ICovLAotICAgICAgICAgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVIsCi0gICAgICAgICAgICAgICAgICAgIHJhbmdlT2Zmc2V0ICsgcmFuZ2VMZW5ndGggLyogc3RyaWRlICovLCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGtlZXBPd25lcnNoaXAgKi8pKTsKLQotICAgICAgICAgICAgZXJyID0gbUhEQ1AtPmVuY3J5cHROYXRpdmUoCi0gICAgICAgICAgICAgICAgICAgIGdyYnVmLCByYW5nZU9mZnNldCwgcmFuZ2VMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgIHRyYWNrSW5kZXggIC8qIHN0cmVhbUNUUiAqLywKLSAgICAgICAgICAgICAgICAgICAgJmlucHV0Q1RSLAotICAgICAgICAgICAgICAgICAgICBhY2Nlc3NVbml0LT5kYXRhKCkpOwotICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlcnIgPSBtSERDUC0+ZW5jcnlwdCgKLSAgICAgICAgICAgICAgICAgICAgYWNjZXNzVW5pdC0+ZGF0YSgpLCBhY2Nlc3NVbml0LT5zaXplKCksCi0gICAgICAgICAgICAgICAgICAgIHRyYWNrSW5kZXggIC8qIHN0cmVhbUNUUiAqLywKLSAgICAgICAgICAgICAgICAgICAgJmlucHV0Q1RSLAotICAgICAgICAgICAgICAgICAgICBhY2Nlc3NVbml0LT5kYXRhKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBIRENQLWVuY3J5cHQgbWVkaWEgZGF0YSAoZXJyICVkKSIsCi0gICAgICAgICAgICAgICAgICBlcnIpOwotCi0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgSERDUF9wcml2YXRlX2RhdGFbMF0gPSAweDAwOwotCi0gICAgICAgIEhEQ1BfcHJpdmF0ZV9kYXRhWzFdID0KLSAgICAgICAgICAgICgoKHRyYWNrSW5kZXggPj4gMzApICYgMykgPDwgMSkgfCAxOwotCi0gICAgICAgIEhEQ1BfcHJpdmF0ZV9kYXRhWzJdID0gKHRyYWNrSW5kZXggPj4gMjIpICYgMHhmZjsKLQotICAgICAgICBIRENQX3ByaXZhdGVfZGF0YVszXSA9Ci0gICAgICAgICAgICAoKCh0cmFja0luZGV4ID4+IDE1KSAmIDB4N2YpIDw8IDEpIHwgMTsKLQotICAgICAgICBIRENQX3ByaXZhdGVfZGF0YVs0XSA9ICh0cmFja0luZGV4ID4+IDcpICYgMHhmZjsKLQotICAgICAgICBIRENQX3ByaXZhdGVfZGF0YVs1XSA9Ci0gICAgICAgICAgICAoKHRyYWNrSW5kZXggJiAweDdmKSA8PCAxKSB8IDE7Ci0KLSAgICAgICAgSERDUF9wcml2YXRlX2RhdGFbNl0gPSAweDAwOwotCi0gICAgICAgIEhEQ1BfcHJpdmF0ZV9kYXRhWzddID0KLSAgICAgICAgICAgICgoKGlucHV0Q1RSID4+IDYwKSAmIDB4MGYpIDw8IDEpIHwgMTsKLQotICAgICAgICBIRENQX3ByaXZhdGVfZGF0YVs4XSA9IChpbnB1dENUUiA+PiA1MikgJiAweGZmOwotCi0gICAgICAgIEhEQ1BfcHJpdmF0ZV9kYXRhWzldID0KLSAgICAgICAgICAgICgoKGlucHV0Q1RSID4+IDQ1KSAmIDB4N2YpIDw8IDEpIHwgMTsKLQotICAgICAgICBIRENQX3ByaXZhdGVfZGF0YVsxMF0gPSAoaW5wdXRDVFIgPj4gMzcpICYgMHhmZjsKLQotICAgICAgICBIRENQX3ByaXZhdGVfZGF0YVsxMV0gPQotICAgICAgICAgICAgKCgoaW5wdXRDVFIgPj4gMzApICYgMHg3ZikgPDwgMSkgfCAxOwotCi0gICAgICAgIEhEQ1BfcHJpdmF0ZV9kYXRhWzEyXSA9IChpbnB1dENUUiA+PiAyMikgJiAweGZmOwotCi0gICAgICAgIEhEQ1BfcHJpdmF0ZV9kYXRhWzEzXSA9Ci0gICAgICAgICAgICAoKChpbnB1dENUUiA+PiAxNSkgJiAweDdmKSA8PCAxKSB8IDE7Ci0KLSAgICAgICAgSERDUF9wcml2YXRlX2RhdGFbMTRdID0gKGlucHV0Q1RSID4+IDcpICYgMHhmZjsKLQotICAgICAgICBIRENQX3ByaXZhdGVfZGF0YVsxNV0gPQotICAgICAgICAgICAgKChpbnB1dENUUiAmIDB4N2YpIDw8IDEpIHwgMTsKLQotICAgICAgICBmbGFncyB8PSBUU1BhY2tldGl6ZXI6OklTX0VOQ1JZUFRFRDsKLSAgICB9IGVsc2UgaWYgKG1hbnVhbGx5UHJlcGVuZFNQU1BQUykgewotICAgICAgICBmbGFncyB8PSBUU1BhY2tldGl6ZXI6OlBSRVBFTkRfU1BTX1BQU19UT19JRFJfRlJBTUVTOwotICAgIH0KLQotICAgIGludDY0X3QgdGltZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLSAgICBpZiAobVByZXZUaW1lVXMgPCAwbGwgfHwgbVByZXZUaW1lVXMgKyAxMDAwMDBsbCA8PSB0aW1lVXMpIHsKLSAgICAgICAgZmxhZ3MgfD0gVFNQYWNrZXRpemVyOjpFTUlUX1BDUjsKLSAgICAgICAgZmxhZ3MgfD0gVFNQYWNrZXRpemVyOjpFTUlUX1BBVF9BTkRfUE1UOwotCi0gICAgICAgIG1QcmV2VGltZVVzID0gdGltZVVzOwotICAgIH0KLQotICAgIG1UU1BhY2tldGl6ZXItPnBhY2tldGl6ZSgKLSAgICAgICAgICAgIGluZm8ubVBhY2tldGl6ZXJUcmFja0luZGV4LAotICAgICAgICAgICAgYWNjZXNzVW5pdCwKLSAgICAgICAgICAgIHRzUGFja2V0cywKLSAgICAgICAgICAgIGZsYWdzLAotICAgICAgICAgICAgIWlzSERDUEVuY3J5cHRlZCA/IE5VTEwgOiBIRENQX3ByaXZhdGVfZGF0YSwKLSAgICAgICAgICAgICFpc0hEQ1BFbmNyeXB0ZWQgPyAwIDogc2l6ZW9mKEhEQ1BfcHJpdmF0ZV9kYXRhKSwKLSAgICAgICAgICAgIGluZm8ubUlzQXVkaW8gPyAyIDogMCAvKiBudW1TdHVmZmluZ0J5dGVzICovKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L01lZGlhU2VuZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvTWVkaWFTZW5kZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ1MzhlYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvTWVkaWFTZW5kZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTMsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1FRElBX1NFTkRFUl9IXwotCi0jZGVmaW5lIE1FRElBX1NFTkRFUl9IXwotCi0jaW5jbHVkZSAicnRwL1JUUFNlbmRlci5oIgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgQUJ1ZmZlcjsKLXN0cnVjdCBBTmV0d29ya1Nlc3Npb247Ci1zdHJ1Y3QgQU1lc3NhZ2U7Ci1zdHJ1Y3QgSUhEQ1A7Ci1zdHJ1Y3QgVFNQYWNrZXRpemVyOwotCi0vLyBUaGlzIGNsYXNzIGZhY2lsaXRhdGVzIHNlbmRpbmcgb2YgZGF0YSBmcm9tIG9uZSBvciBtb3JlIG1lZGlhIHRyYWNrcwotLy8gdGhyb3VnaCBvbmUgb3IgbW9yZSBSVFAgY2hhbm5lbHMsIGVpdGhlciBwcm92aWRpbmcgYSAxOjEgbWFwcGluZyBmcm9tCi0vLyB0cmFjayB0byBSVFAgY2hhbm5lbCBvciBtdXhpbmcgYWxsIHRyYWNrcyBpbnRvIGEgc2luZ2xlIFJUUCBjaGFubmVsIGFuZAotLy8gdXNpbmcgdHJhbnNwb3J0IHN0cmVhbSBlbmNhcHN1bGF0aW9uLgotLy8gT3B0aW9uYWxseSB0aGUgKHZpZGVvKSBkYXRhIGlzIGVuY3J5cHRlZCB1c2luZyB0aGUgcHJvdmlkZWQgaGRjcCBvYmplY3QuCi1zdHJ1Y3QgTWVkaWFTZW5kZXIgOiBwdWJsaWMgQUhhbmRsZXIgewotICAgIGVudW0gewotICAgICAgICBrV2hhdEluaXREb25lLAotICAgICAgICBrV2hhdEVycm9yLAotICAgICAgICBrV2hhdE5ldHdvcmtTdGFsbCwKLSAgICAgICAga1doYXRJbmZvcm1TZW5kZXIsCi0gICAgfTsKLQotICAgIE1lZGlhU2VuZGVyKAotICAgICAgICAgICAgY29uc3Qgc3A8QU5ldHdvcmtTZXNzaW9uPiAmbmV0U2Vzc2lvbiwKLSAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5KTsKLQotICAgIHN0YXR1c190IHNldEhEQ1AoY29uc3Qgc3A8SUhEQ1A+ICZoZGNwKTsKLQotICAgIGVudW0gRmxhZ0JpdHMgewotICAgICAgICBGTEFHX01BTlVBTExZX1BSRVBFTkRfU1BTX1BQUyA9IDEsCi0gICAgfTsKLSAgICBzc2l6ZV90IGFkZFRyYWNrKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LCB1aW50MzJfdCBmbGFncyk7Ci0KLSAgICAvLyBJZiB0cmFja0luZGV4ID09IC0xLCBpbml0aWFsaXplIGZvciB0cmFuc3BvcnQgc3RyZWFtIG11eGluZy4KLSAgICBzdGF0dXNfdCBpbml0QXN5bmMoCi0gICAgICAgICAgICBzc2l6ZV90IHRyYWNrSW5kZXgsCi0gICAgICAgICAgICBjb25zdCBjaGFyICpyZW1vdGVIb3N0LAotICAgICAgICAgICAgaW50MzJfdCByZW1vdGVSVFBQb3J0LAotICAgICAgICAgICAgUlRQU2VuZGVyOjpUcmFuc3BvcnRNb2RlIHJ0cE1vZGUsCi0gICAgICAgICAgICBpbnQzMl90IHJlbW90ZVJUQ1BQb3J0LAotICAgICAgICAgICAgUlRQU2VuZGVyOjpUcmFuc3BvcnRNb2RlIHJ0Y3BNb2RlLAotICAgICAgICAgICAgaW50MzJfdCAqbG9jYWxSVFBQb3J0KTsKLQotICAgIHN0YXR1c190IHF1ZXVlQWNjZXNzVW5pdCgKLSAgICAgICAgICAgIHNpemVfdCB0cmFja0luZGV4LCBjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwotICAgIHZpcnR1YWwgfk1lZGlhU2VuZGVyKCk7Ci0KLXByaXZhdGU6Ci0gICAgZW51bSB7Ci0gICAgICAgIGtXaGF0U2VuZGVyTm90aWZ5LAotICAgIH07Ci0KLSAgICBlbnVtIE1vZGUgewotICAgICAgICBNT0RFX1VOREVGSU5FRCwKLSAgICAgICAgTU9ERV9UUkFOU1BPUlRfU1RSRUFNLAotICAgICAgICBNT0RFX0VMRU1FTlRBUllfU1RSRUFNUywKLSAgICB9OwotCi0gICAgc3RydWN0IFRyYWNrSW5mbyB7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBtRm9ybWF0OwotICAgICAgICB1aW50MzJfdCBtRmxhZ3M7Ci0gICAgICAgIHNwPFJUUFNlbmRlcj4gbVNlbmRlcjsKLSAgICAgICAgTGlzdDxzcDxBQnVmZmVyPiA+IG1BY2Nlc3NVbml0czsKLSAgICAgICAgc3NpemVfdCBtUGFja2V0aXplclRyYWNrSW5kZXg7Ci0gICAgICAgIGJvb2wgbUlzQXVkaW87Ci0gICAgfTsKLQotICAgIHNwPEFOZXR3b3JrU2Vzc2lvbj4gbU5ldFNlc3Npb247Ci0gICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7Ci0KLSAgICBzcDxJSERDUD4gbUhEQ1A7Ci0KLSAgICBNb2RlIG1Nb2RlOwotICAgIGludDMyX3QgbUdlbmVyYXRpb247Ci0KLSAgICBWZWN0b3I8VHJhY2tJbmZvPiBtVHJhY2tJbmZvczsKLQotICAgIHNwPFRTUGFja2V0aXplcj4gbVRTUGFja2V0aXplcjsKLSAgICBzcDxSVFBTZW5kZXI+IG1UU1NlbmRlcjsKLSAgICBpbnQ2NF90IG1QcmV2VGltZVVzOwotCi0gICAgc2l6ZV90IG1Jbml0RG9uZUNvdW50OwotCi0gICAgRklMRSAqbUxvZ0ZpbGU7Ci0KLSAgICB2b2lkIG9uU2VuZGVyTm90aWZ5KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKLQotICAgIHZvaWQgbm90aWZ5SW5pdERvbmUoc3RhdHVzX3QgZXJyKTsKLSAgICB2b2lkIG5vdGlmeUVycm9yKHN0YXR1c190IGVycik7Ci0gICAgdm9pZCBub3RpZnlOZXR3b3JrU3RhbGwoc2l6ZV90IG51bUJ5dGVzUXVldWVkKTsKLQotICAgIHN0YXR1c190IHBhY2tldGl6ZUFjY2Vzc1VuaXQoCi0gICAgICAgICAgICBzaXplX3QgdHJhY2tJbmRleCwKLSAgICAgICAgICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQsCi0gICAgICAgICAgICBzcDxBQnVmZmVyPiAqdHNQYWNrZXRzKTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1lZGlhU2VuZGVyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gTUVESUFfU0VOREVSX0hfCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9QYXJhbWV0ZXJzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9QYXJhbWV0ZXJzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJhNjFlYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvUGFyYW1ldGVycy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiUGFyYW1ldGVycy5oIgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBzdGF0aWMKLXNwPFBhcmFtZXRlcnM+IFBhcmFtZXRlcnM6OlBhcnNlKGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgc3A8UGFyYW1ldGVycz4gcGFyYW1zID0gbmV3IFBhcmFtZXRlcnM7Ci0gICAgc3RhdHVzX3QgZXJyID0gcGFyYW1zLT5wYXJzZShkYXRhLCBzaXplKTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIHBhcmFtczsKLX0KLQotUGFyYW1ldGVyczo6UGFyYW1ldGVycygpIHt9Ci0KLVBhcmFtZXRlcnM6On5QYXJhbWV0ZXJzKCkge30KLQotc3RhdHVzX3QgUGFyYW1ldGVyczo6cGFyc2UoY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBzaXplX3QgaSA9IDA7Ci0gICAgd2hpbGUgKGkgPCBzaXplKSB7Ci0gICAgICAgIHNpemVfdCBuYW1lU3RhcnQgPSBpOwotICAgICAgICB3aGlsZSAoaSA8IHNpemUgJiYgZGF0YVtpXSAhPSAnOicpIHsKLSAgICAgICAgICAgICsraTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpID09IHNpemUgfHwgaSA9PSBuYW1lU3RhcnQpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBBU3RyaW5nIG5hbWUoJmRhdGFbbmFtZVN0YXJ0XSwgaSAtIG5hbWVTdGFydCk7Ci0gICAgICAgIG5hbWUudHJpbSgpOwotICAgICAgICBuYW1lLnRvbG93ZXIoKTsKLQotICAgICAgICArK2k7Ci0KLSAgICAgICAgc2l6ZV90IHZhbHVlU3RhcnQgPSBpOwotCi0gICAgICAgIHdoaWxlIChpICsgMSA8IHNpemUgJiYgKGRhdGFbaV0gIT0gJ1xyJyB8fCBkYXRhW2kgKyAxXSAhPSAnXG4nKSkgewotICAgICAgICAgICAgKytpOwotICAgICAgICB9Ci0KLSAgICAgICAgQVN0cmluZyB2YWx1ZSgmZGF0YVt2YWx1ZVN0YXJ0XSwgaSAtIHZhbHVlU3RhcnQpOwotICAgICAgICB2YWx1ZS50cmltKCk7Ci0KLSAgICAgICAgbURpY3QuYWRkKG5hbWUsIHZhbHVlKTsKLQotICAgICAgICB3aGlsZSAoaSArIDEgPCBzaXplICYmIGRhdGFbaV0gPT0gJ1xyJyAmJiBkYXRhW2kgKyAxXSA9PSAnXG4nKSB7Ci0gICAgICAgICAgICBpICs9IDI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLWJvb2wgUGFyYW1ldGVyczo6ZmluZFBhcmFtZXRlcihjb25zdCBjaGFyICpuYW1lLCBBU3RyaW5nICp2YWx1ZSkgY29uc3QgewotICAgIEFTdHJpbmcga2V5ID0gbmFtZTsKLSAgICBrZXkudG9sb3dlcigpOwotCi0gICAgc3NpemVfdCBpbmRleCA9IG1EaWN0LmluZGV4T2ZLZXkoa2V5KTsKLQotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgdmFsdWUtPmNsZWFyKCk7Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgICp2YWx1ZSA9IG1EaWN0LnZhbHVlQXQoaW5kZXgpOwotICAgIHJldHVybiB0cnVlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L1BhcmFtZXRlcnMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9QYXJhbWV0ZXJzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZTc4N2UuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L1BhcmFtZXRlcnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IFBhcmFtZXRlcnMgOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgc3RhdGljIHNwPFBhcmFtZXRlcnM+IFBhcnNlKGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBzaXplKTsKLQotICAgIGJvb2wgZmluZFBhcmFtZXRlcihjb25zdCBjaGFyICpuYW1lLCBBU3RyaW5nICp2YWx1ZSkgY29uc3Q7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5QYXJhbWV0ZXJzKCk7Ci0KLXByaXZhdGU6Ci0gICAgS2V5ZWRWZWN0b3I8QVN0cmluZywgQVN0cmluZz4gbURpY3Q7Ci0KLSAgICBQYXJhbWV0ZXJzKCk7Ci0gICAgc3RhdHVzX3QgcGFyc2UoY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IHNpemUpOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUGFyYW1ldGVycyk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L1ZpZGVvRm9ybWF0cy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvVmlkZW9Gb3JtYXRzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJjNTExYy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvVmlkZW9Gb3JtYXRzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTMsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIlZpZGVvRm9ybWF0cyIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIlZpZGVvRm9ybWF0cy5oIgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBzdGF0aWMKLWNvbnN0IFZpZGVvRm9ybWF0czo6Y29uZmlnX3QgVmlkZW9Gb3JtYXRzOjptUmVzb2x1dGlvblRhYmxlW11bMzJdID0gewotICAgIHsKLSAgICAgICAgLy8gQ0VBIFJlc29sdXRpb25zCi0gICAgICAgIHsgNjQwLCA0ODAsIDYwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgNzIwLCA0ODAsIDYwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgNzIwLCA0ODAsIDYwLCB0cnVlLCAwLCAwfSwKLSAgICAgICAgeyA3MjAsIDU3NiwgNTAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyA3MjAsIDU3NiwgNTAsIHRydWUsIDAsIDB9LAotICAgICAgICB7IDEyODAsIDcyMCwgMzAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAxMjgwLCA3MjAsIDYwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMTkyMCwgMTA4MCwgMzAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAxOTIwLCAxMDgwLCA2MCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDE5MjAsIDEwODAsIDYwLCB0cnVlLCAwLCAwfSwKLSAgICAgICAgeyAxMjgwLCA3MjAsIDI1LCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMTI4MCwgNzIwLCA1MCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDE5MjAsIDEwODAsIDI1LCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMTkyMCwgMTA4MCwgNTAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAxOTIwLCAxMDgwLCA1MCwgdHJ1ZSwgMCwgMH0sCi0gICAgICAgIHsgMTI4MCwgNzIwLCAyNCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDE5MjAsIDEwODAsIDI0LCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMCwgMCwgMCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDAsIDAsIDAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAwLCAwLCAwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMCwgMCwgMCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDAsIDAsIDAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAwLCAwLCAwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMCwgMCwgMCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDAsIDAsIDAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAwLCAwLCAwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMCwgMCwgMCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDAsIDAsIDAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAwLCAwLCAwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMCwgMCwgMCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDAsIDAsIDAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAwLCAwLCAwLCBmYWxzZSwgMCwgMH0sCi0gICAgfSwKLSAgICB7Ci0gICAgICAgIC8vIFZFU0EgUmVzb2x1dGlvbnMKLSAgICAgICAgeyA4MDAsIDYwMCwgMzAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyA4MDAsIDYwMCwgNjAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAxMDI0LCA3NjgsIDMwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMTAyNCwgNzY4LCA2MCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDExNTIsIDg2NCwgMzAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAxMTUyLCA4NjQsIDYwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMTI4MCwgNzY4LCAzMCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDEyODAsIDc2OCwgNjAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAxMjgwLCA4MDAsIDMwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMTI4MCwgODAwLCA2MCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDEzNjAsIDc2OCwgMzAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAxMzYwLCA3NjgsIDYwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMTM2NiwgNzY4LCAzMCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDEzNjYsIDc2OCwgNjAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAxMjgwLCAxMDI0LCAzMCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDEyODAsIDEwMjQsIDYwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMTQwMCwgMTA1MCwgMzAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAxNDAwLCAxMDUwLCA2MCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDE0NDAsIDkwMCwgMzAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAxNDQwLCA5MDAsIDYwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMTYwMCwgOTAwLCAzMCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDE2MDAsIDkwMCwgNjAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAxNjAwLCAxMjAwLCAzMCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDE2MDAsIDEyMDAsIDYwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMTY4MCwgMTAyNCwgMzAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAxNjgwLCAxMDI0LCA2MCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDE2ODAsIDEwNTAsIDMwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMTY4MCwgMTA1MCwgNjAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAxOTIwLCAxMjAwLCAzMCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDE5MjAsIDEyMDAsIDYwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMCwgMCwgMCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDAsIDAsIDAsIGZhbHNlLCAwLCAwfSwKLSAgICB9LAotICAgIHsKLSAgICAgICAgLy8gSEggUmVzb2x1dGlvbnMKLSAgICAgICAgeyA4MDAsIDQ4MCwgMzAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyA4MDAsIDQ4MCwgNjAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyA4NTQsIDQ4MCwgMzAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyA4NTQsIDQ4MCwgNjAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyA4NjQsIDQ4MCwgMzAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyA4NjQsIDQ4MCwgNjAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyA2NDAsIDM2MCwgMzAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyA2NDAsIDM2MCwgNjAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyA5NjAsIDU0MCwgMzAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyA5NjAsIDU0MCwgNjAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyA4NDgsIDQ4MCwgMzAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyA4NDgsIDQ4MCwgNjAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAwLCAwLCAwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMCwgMCwgMCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDAsIDAsIDAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAwLCAwLCAwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMCwgMCwgMCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDAsIDAsIDAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAwLCAwLCAwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMCwgMCwgMCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDAsIDAsIDAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAwLCAwLCAwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMCwgMCwgMCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDAsIDAsIDAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAwLCAwLCAwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMCwgMCwgMCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDAsIDAsIDAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAwLCAwLCAwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMCwgMCwgMCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDAsIDAsIDAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAwLCAwLCAwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMCwgMCwgMCwgZmFsc2UsIDAsIDB9LAotICAgIH0KLX07Ci0KLVZpZGVvRm9ybWF0czo6VmlkZW9Gb3JtYXRzKCkgewotICAgIG1lbWNweShtQ29uZmlncywgbVJlc29sdXRpb25UYWJsZSwgc2l6ZW9mKG1Db25maWdzKSk7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1SZXNvbHV0aW9uVHlwZXM7ICsraSkgewotICAgICAgICBtUmVzb2x1dGlvbkVuYWJsZWRbaV0gPSAwOwotICAgIH0KLQotICAgIHNldE5hdGl2ZVJlc29sdXRpb24oUkVTT0xVVElPTl9DRUEsIDApOyAgLy8gZGVmYXVsdCB0byA2NDB4NDgwIHA2MAotfQotCi12b2lkIFZpZGVvRm9ybWF0czo6c2V0TmF0aXZlUmVzb2x1dGlvbihSZXNvbHV0aW9uVHlwZSB0eXBlLCBzaXplX3QgaW5kZXgpIHsKLSAgICBDSEVDS19MVCh0eXBlLCBrTnVtUmVzb2x1dGlvblR5cGVzKTsKLSAgICBDSEVDSyhHZXRDb25maWd1cmF0aW9uKHR5cGUsIGluZGV4LCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKSk7Ci0KLSAgICBtTmF0aXZlVHlwZSA9IHR5cGU7Ci0gICAgbU5hdGl2ZUluZGV4ID0gaW5kZXg7Ci0KLSAgICBzZXRSZXNvbHV0aW9uRW5hYmxlZCh0eXBlLCBpbmRleCk7Ci19Ci0KLXZvaWQgVmlkZW9Gb3JtYXRzOjpnZXROYXRpdmVSZXNvbHV0aW9uKAotICAgICAgICBSZXNvbHV0aW9uVHlwZSAqdHlwZSwgc2l6ZV90ICppbmRleCkgY29uc3QgewotICAgICp0eXBlID0gbU5hdGl2ZVR5cGU7Ci0gICAgKmluZGV4ID0gbU5hdGl2ZUluZGV4OwotfQotCi12b2lkIFZpZGVvRm9ybWF0czo6ZGlzYWJsZUFsbCgpIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1SZXNvbHV0aW9uVHlwZXM7ICsraSkgewotICAgICAgICBtUmVzb2x1dGlvbkVuYWJsZWRbaV0gPSAwOwotICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IDMyOyBqKyspIHsKLSAgICAgICAgICAgIG1Db25maWdzW2ldW2pdLnByb2ZpbGUgPSBtQ29uZmlnc1tpXVtqXS5sZXZlbCA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgVmlkZW9Gb3JtYXRzOjplbmFibGVBbGwoKSB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTnVtUmVzb2x1dGlvblR5cGVzOyArK2kpIHsKLSAgICAgICAgbVJlc29sdXRpb25FbmFibGVkW2ldID0gMHhmZmZmZmZmZjsKLSAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCAzMjsgaisrKSB7Ci0gICAgICAgICAgICBtQ29uZmlnc1tpXVtqXS5wcm9maWxlID0gKDF1bCA8PCBQUk9GSUxFX0NCUCk7Ci0gICAgICAgICAgICBtQ29uZmlnc1tpXVtqXS5sZXZlbCA9ICgxdWwgPDwgTEVWRUxfMzEpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIFZpZGVvRm9ybWF0czo6ZW5hYmxlUmVzb2x1dGlvblVwdG8oCi0gICAgICAgIFJlc29sdXRpb25UeXBlIHR5cGUsIHNpemVfdCBpbmRleCwKLSAgICAgICAgUHJvZmlsZVR5cGUgcHJvZmlsZSwgTGV2ZWxUeXBlIGxldmVsKSB7Ci0gICAgc2l6ZV90IHdpZHRoLCBoZWlnaHQsIGZwcywgc2NvcmU7Ci0gICAgYm9vbCBpbnRlcmxhY2VkOwotICAgIGlmICghR2V0Q29uZmlndXJhdGlvbih0eXBlLCBpbmRleCwgJndpZHRoLCAmaGVpZ2h0LAotICAgICAgICAgICAgJmZwcywgJmludGVybGFjZWQpKSB7Ci0gICAgICAgIEFMT0dFKCJNYXhpbXVtIHJlc29sdXRpb24gbm90IGZvdW5kISIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHNjb3JlID0gd2lkdGggKiBoZWlnaHQgKiBmcHMgKiAoIWludGVybGFjZWQgKyAxKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1SZXNvbHV0aW9uVHlwZXM7ICsraSkgewotICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IDMyOyBqKyspIHsKLSAgICAgICAgICAgIGlmIChHZXRDb25maWd1cmF0aW9uKChSZXNvbHV0aW9uVHlwZSlpLCBqLAotICAgICAgICAgICAgICAgICAgICAmd2lkdGgsICZoZWlnaHQsICZmcHMsICZpbnRlcmxhY2VkKQotICAgICAgICAgICAgICAgICAgICAmJiBzY29yZSA+PSB3aWR0aCAqIGhlaWdodCAqIGZwcyAqICghaW50ZXJsYWNlZCArIDEpKSB7Ci0gICAgICAgICAgICAgICAgc2V0UmVzb2x1dGlvbkVuYWJsZWQoKFJlc29sdXRpb25UeXBlKWksIGopOwotICAgICAgICAgICAgICAgIHNldFByb2ZpbGVMZXZlbCgoUmVzb2x1dGlvblR5cGUpaSwgaiwgcHJvZmlsZSwgbGV2ZWwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIFZpZGVvRm9ybWF0czo6c2V0UmVzb2x1dGlvbkVuYWJsZWQoCi0gICAgICAgIFJlc29sdXRpb25UeXBlIHR5cGUsIHNpemVfdCBpbmRleCwgYm9vbCBlbmFibGVkKSB7Ci0gICAgQ0hFQ0tfTFQodHlwZSwga051bVJlc29sdXRpb25UeXBlcyk7Ci0gICAgQ0hFQ0soR2V0Q29uZmlndXJhdGlvbih0eXBlLCBpbmRleCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCkpOwotCi0gICAgaWYgKGVuYWJsZWQpIHsKLSAgICAgICAgbVJlc29sdXRpb25FbmFibGVkW3R5cGVdIHw9ICgxdWwgPDwgaW5kZXgpOwotICAgICAgICBtQ29uZmlnc1t0eXBlXVtpbmRleF0ucHJvZmlsZSA9ICgxdWwgPDwgUFJPRklMRV9DQlApOwotICAgICAgICBtQ29uZmlnc1t0eXBlXVtpbmRleF0ubGV2ZWwgPSAoMXVsIDw8IExFVkVMXzMxKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtUmVzb2x1dGlvbkVuYWJsZWRbdHlwZV0gJj0gfigxdWwgPDwgaW5kZXgpOwotICAgICAgICBtQ29uZmlnc1t0eXBlXVtpbmRleF0ucHJvZmlsZSA9IDA7Ci0gICAgICAgIG1Db25maWdzW3R5cGVdW2luZGV4XS5sZXZlbCA9IDA7Ci0gICAgfQotfQotCi12b2lkIFZpZGVvRm9ybWF0czo6c2V0UHJvZmlsZUxldmVsKAotICAgICAgICBSZXNvbHV0aW9uVHlwZSB0eXBlLCBzaXplX3QgaW5kZXgsCi0gICAgICAgIFByb2ZpbGVUeXBlIHByb2ZpbGUsIExldmVsVHlwZSBsZXZlbCkgewotICAgIENIRUNLX0xUKHR5cGUsIGtOdW1SZXNvbHV0aW9uVHlwZXMpOwotICAgIENIRUNLKEdldENvbmZpZ3VyYXRpb24odHlwZSwgaW5kZXgsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpKTsKLQotICAgIG1Db25maWdzW3R5cGVdW2luZGV4XS5wcm9maWxlID0gKDF1bCA8PCBwcm9maWxlKTsKLSAgICBtQ29uZmlnc1t0eXBlXVtpbmRleF0ubGV2ZWwgPSAoMXVsIDw8IGxldmVsKTsKLX0KLQotdm9pZCBWaWRlb0Zvcm1hdHM6OmdldFByb2ZpbGVMZXZlbCgKLSAgICAgICAgUmVzb2x1dGlvblR5cGUgdHlwZSwgc2l6ZV90IGluZGV4LAotICAgICAgICBQcm9maWxlVHlwZSAqcHJvZmlsZSwgTGV2ZWxUeXBlICpsZXZlbCkgY29uc3R7Ci0gICAgQ0hFQ0tfTFQodHlwZSwga051bVJlc29sdXRpb25UeXBlcyk7Ci0gICAgQ0hFQ0soR2V0Q29uZmlndXJhdGlvbih0eXBlLCBpbmRleCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCkpOwotCi0gICAgaW50IGksIGJlc3RQcm9maWxlID0gLTEsIGJlc3RMZXZlbCA9IC0xOwotCi0gICAgZm9yIChpID0gMDsgaSA8IGtOdW1Qcm9maWxlVHlwZXM7ICsraSkgewotICAgICAgICBpZiAobUNvbmZpZ3NbdHlwZV1baW5kZXhdLnByb2ZpbGUgJiAoMXVsIDw8IGkpKSB7Ci0gICAgICAgICAgICBiZXN0UHJvZmlsZSA9IGk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwga051bUxldmVsVHlwZXM7ICsraSkgewotICAgICAgICBpZiAobUNvbmZpZ3NbdHlwZV1baW5kZXhdLmxldmVsICYgKDF1bCA8PCBpKSkgewotICAgICAgICAgICAgYmVzdExldmVsID0gaTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChiZXN0UHJvZmlsZSA9PSAtMSB8fCBiZXN0TGV2ZWwgPT0gLTEpIHsKLSAgICAgICAgQUxPR0UoIlByb2ZpbGUgb3IgbGV2ZWwgbm90IHNldCBmb3IgcmVzb2x1dGlvbiB0eXBlICVkLCBpbmRleCAlenUiLAotICAgICAgICAgICAgICAgIHR5cGUsIGluZGV4KTsKLSAgICAgICAgYmVzdFByb2ZpbGUgPSBQUk9GSUxFX0NCUDsKLSAgICAgICAgYmVzdExldmVsID0gTEVWRUxfMzE7Ci0gICAgfQotCi0gICAgKnByb2ZpbGUgPSAoUHJvZmlsZVR5cGUpIGJlc3RQcm9maWxlOwotICAgICpsZXZlbCA9IChMZXZlbFR5cGUpIGJlc3RMZXZlbDsKLX0KLQotYm9vbCBWaWRlb0Zvcm1hdHM6OmlzUmVzb2x1dGlvbkVuYWJsZWQoCi0gICAgICAgIFJlc29sdXRpb25UeXBlIHR5cGUsIHNpemVfdCBpbmRleCkgY29uc3QgewotICAgIENIRUNLX0xUKHR5cGUsIGtOdW1SZXNvbHV0aW9uVHlwZXMpOwotICAgIENIRUNLKEdldENvbmZpZ3VyYXRpb24odHlwZSwgaW5kZXgsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpKTsKLQotICAgIHJldHVybiBtUmVzb2x1dGlvbkVuYWJsZWRbdHlwZV0gJiAoMXVsIDw8IGluZGV4KTsKLX0KLQotLy8gc3RhdGljCi1ib29sIFZpZGVvRm9ybWF0czo6R2V0Q29uZmlndXJhdGlvbigKLSAgICAgICAgUmVzb2x1dGlvblR5cGUgdHlwZSwKLSAgICAgICAgc2l6ZV90IGluZGV4LAotICAgICAgICBzaXplX3QgKndpZHRoLCBzaXplX3QgKmhlaWdodCwgc2l6ZV90ICpmcmFtZXNQZXJTZWNvbmQsCi0gICAgICAgIGJvb2wgKmludGVybGFjZWQpIHsKLSAgICBDSEVDS19MVCh0eXBlLCBrTnVtUmVzb2x1dGlvblR5cGVzKTsKLQotICAgIGlmIChpbmRleCA+PSAzMikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgY29uc3QgY29uZmlnX3QgKmNvbmZpZyA9ICZtUmVzb2x1dGlvblRhYmxlW3R5cGVdW2luZGV4XTsKLQotICAgIGlmIChjb25maWctPndpZHRoID09IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmICh3aWR0aCkgewotICAgICAgICAqd2lkdGggPSBjb25maWctPndpZHRoOwotICAgIH0KLQotICAgIGlmIChoZWlnaHQpIHsKLSAgICAgICAgKmhlaWdodCA9IGNvbmZpZy0+aGVpZ2h0OwotICAgIH0KLQotICAgIGlmIChmcmFtZXNQZXJTZWNvbmQpIHsKLSAgICAgICAgKmZyYW1lc1BlclNlY29uZCA9IGNvbmZpZy0+ZnJhbWVzUGVyU2Vjb25kOwotICAgIH0KLQotICAgIGlmIChpbnRlcmxhY2VkKSB7Ci0gICAgICAgICppbnRlcmxhY2VkID0gY29uZmlnLT5pbnRlcmxhY2VkOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFZpZGVvRm9ybWF0czo6cGFyc2VIMjY0Q29kZWMoY29uc3QgY2hhciAqc3BlYykgewotICAgIHVuc2lnbmVkIHByb2ZpbGUsIGxldmVsLCByZXNbM107Ci0KLSAgICBpZiAoc3NjYW5mKAotICAgICAgICAgICAgc3BlYywKLSAgICAgICAgICAgICIlMDJ4ICUwMnggJTA4WCAlMDhYICUwOFgiLAotICAgICAgICAgICAgJnByb2ZpbGUsCi0gICAgICAgICAgICAmbGV2ZWwsCi0gICAgICAgICAgICAmcmVzWzBdLAotICAgICAgICAgICAgJnJlc1sxXSwKLSAgICAgICAgICAgICZyZXNbMl0pICE9IDUpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bVJlc29sdXRpb25UeXBlczsgKytpKSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgMzI7ICsraikgewotICAgICAgICAgICAgaWYgKHJlc1tpXSAmICgxdWwgPDwgaikpewotICAgICAgICAgICAgICAgIG1SZXNvbHV0aW9uRW5hYmxlZFtpXSB8PSAoMXVsIDw8IGopOwotICAgICAgICAgICAgICAgIGlmIChwcm9maWxlID4gbUNvbmZpZ3NbaV1bal0ucHJvZmlsZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBwcmVmZXIgaGlnaGVyIHByb2ZpbGUgKGV2ZW4gaWYgbGV2ZWwgaXMgbG93ZXIpCi0gICAgICAgICAgICAgICAgICAgIG1Db25maWdzW2ldW2pdLnByb2ZpbGUgPSBwcm9maWxlOwotICAgICAgICAgICAgICAgICAgICBtQ29uZmlnc1tpXVtqXS5sZXZlbCA9IGxldmVsOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvZmlsZSA9PSBtQ29uZmlnc1tpXVtqXS5wcm9maWxlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCA+IG1Db25maWdzW2ldW2pdLmxldmVsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Db25maWdzW2ldW2pdLmxldmVsID0gbGV2ZWw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIHN0YXRpYwotYm9vbCBWaWRlb0Zvcm1hdHM6OkdldFByb2ZpbGVMZXZlbCgKLSAgICAgICAgUHJvZmlsZVR5cGUgcHJvZmlsZSwgTGV2ZWxUeXBlIGxldmVsLCB1bnNpZ25lZCAqcHJvZmlsZUlkYywKLSAgICAgICAgdW5zaWduZWQgKmxldmVsSWRjLCB1bnNpZ25lZCAqY29uc3RyYWludFNldCkgewotICAgIENIRUNLX0xUKHByb2ZpbGUsIGtOdW1Qcm9maWxlVHlwZXMpOwotICAgIENIRUNLX0xUKGxldmVsLCBrTnVtTGV2ZWxUeXBlcyk7Ci0KLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQga1Byb2ZpbGVJRENba051bVByb2ZpbGVUeXBlc10gPSB7Ci0gICAgICAgIDY2LCAgICAgLy8gUFJPRklMRV9DQlAKLSAgICAgICAgMTAwLCAgICAvLyBQUk9GSUxFX0NIUAotICAgIH07Ci0KLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQga0xldmVsSURDW2tOdW1MZXZlbFR5cGVzXSA9IHsKLSAgICAgICAgMzEsICAgICAvLyBMRVZFTF8zMQotICAgICAgICAzMiwgICAgIC8vIExFVkVMXzMyCi0gICAgICAgIDQwLCAgICAgLy8gTEVWRUxfNDAKLSAgICAgICAgNDEsICAgICAvLyBMRVZFTF80MQotICAgICAgICA0MiwgICAgIC8vIExFVkVMXzQyCi0gICAgfTsKLQotICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBrQ29uc3RyYWludFNldFtrTnVtUHJvZmlsZVR5cGVzXSA9IHsKLSAgICAgICAgMHhjMCwgICAvLyBQUk9GSUxFX0NCUAotICAgICAgICAweDBjLCAgIC8vIFBST0ZJTEVfQ0hQCi0gICAgfTsKLQotICAgIGlmIChwcm9maWxlSWRjKSB7Ci0gICAgICAgICpwcm9maWxlSWRjID0ga1Byb2ZpbGVJRENbcHJvZmlsZV07Ci0gICAgfQotCi0gICAgaWYgKGxldmVsSWRjKSB7Ci0gICAgICAgICpsZXZlbElkYyA9IGtMZXZlbElEQ1tsZXZlbF07Ci0gICAgfQotCi0gICAgaWYgKGNvbnN0cmFpbnRTZXQpIHsKLSAgICAgICAgKmNvbnN0cmFpbnRTZXQgPSBrQ29uc3RyYWludFNldFtwcm9maWxlXTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBWaWRlb0Zvcm1hdHM6OnBhcnNlRm9ybWF0U3BlYyhjb25zdCBjaGFyICpzcGVjKSB7Ci0gICAgQ0hFQ0tfRVEoa051bVJlc29sdXRpb25UeXBlcywgMyk7Ci0KLSAgICBkaXNhYmxlQWxsKCk7Ci0KLSAgICB1bnNpZ25lZCBuYXRpdmUsIGR1bW15OwotICAgIHNpemVfdCBzaXplID0gc3RybGVuKHNwZWMpOwotICAgIHNpemVfdCBvZmZzZXQgPSAwOwotCi0gICAgaWYgKHNzY2FuZihzcGVjLCAiJTAyeCAlMDJ4ICIsICZuYXRpdmUsICZkdW1teSkgIT0gMikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgb2Zmc2V0ICs9IDY7IC8vIHNraXAgbmF0aXZlIGFuZCBwcmVmZXJyZWQtZGlzcGxheS1tb2RlLXN1cHBvcnRlZAotICAgIENIRUNLX0xFKG9mZnNldCArIDU4LCBzaXplKTsKLSAgICB3aGlsZSAob2Zmc2V0IDwgc2l6ZSkgewotICAgICAgICBwYXJzZUgyNjRDb2RlYyhzcGVjICsgb2Zmc2V0KTsKLSAgICAgICAgb2Zmc2V0ICs9IDYwOyAvLyBza2lwIEguMjY0LWNvZGVjICsgIiwgIgotICAgIH0KLQotICAgIG1OYXRpdmVJbmRleCA9IG5hdGl2ZSA+PiAzOwotICAgIG1OYXRpdmVUeXBlID0gKFJlc29sdXRpb25UeXBlKShuYXRpdmUgJiA3KTsKLQotICAgIGJvb2wgc3VjY2VzczsKLSAgICBpZiAobU5hdGl2ZVR5cGUgPj0ga051bVJlc29sdXRpb25UeXBlcykgewotICAgICAgICBzdWNjZXNzID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3VjY2VzcyA9IEdldENvbmZpZ3VyYXRpb24oCi0gICAgICAgICAgICAgICAgbU5hdGl2ZVR5cGUsIG1OYXRpdmVJbmRleCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7Ci0gICAgfQotCi0gICAgaWYgKCFzdWNjZXNzKSB7Ci0gICAgICAgIEFMT0dXKCJzaW5rIGFkdmVydGlzZWQgYW4gaWxsZWdhbCBuYXRpdmUgcmVzb2x1dGlvbiwgZm9ydHVuYXRlbHkgIgotICAgICAgICAgICAgICAidGhpcyB2YWx1ZSBpcyBpZ25vcmVkIGZvciB0aGUgdGltZSBiZWluZy4uLiIpOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1BU3RyaW5nIFZpZGVvRm9ybWF0czo6Z2V0Rm9ybWF0U3BlYyhib29sIGZvck00TWVzc2FnZSkgY29uc3QgewotICAgIENIRUNLX0VRKGtOdW1SZXNvbHV0aW9uVHlwZXMsIDMpOwotCi0gICAgLy8gd2ZkX3ZpZGVvX2Zvcm1hdHM6Ci0gICAgLy8gMSBieXRlICJuYXRpdmUiCi0gICAgLy8gMSBieXRlICJwcmVmZXJyZWQtZGlzcGxheS1tb2RlLXN1cHBvcnRlZCIgMCBvciAxCi0gICAgLy8gb25lIG9yIG1vcmUgYXZjIGNvZGVjIHN0cnVjdHVyZXMKLSAgICAvLyAgIDEgYnl0ZSBwcm9maWxlCi0gICAgLy8gICAxIGJ5dGUgbGV2ZWwKLSAgICAvLyAgIDQgYnl0ZSBDRUEgbWFzawotICAgIC8vICAgNCBieXRlIFZFU0EgbWFzawotICAgIC8vICAgNCBieXRlIEhIIG1hc2sKLSAgICAvLyAgIDEgYnl0ZSBsYXRlbmN5Ci0gICAgLy8gICAyIGJ5dGUgbWluLXNsaWNlLXNsaWNlCi0gICAgLy8gICAyIGJ5dGUgc2xpY2UtZW5jLXBhcmFtcwotICAgIC8vICAgMSBieXRlIGZyYW1lcmF0ZS1jb250cm9sLXN1cHBvcnQKLSAgICAvLyAgIG1heC1ocmVzIChub25lIG9yIDIgYnl0ZSkKLSAgICAvLyAgIG1heC12cmVzIChub25lIG9yIDIgYnl0ZSkKLQotICAgIHJldHVybiBBU3RyaW5nUHJpbnRmKAotICAgICAgICAgICAgIiUwMnggMDAgJTAyeCAlMDJ4ICUwOHggJTA4eCAlMDh4IDAwIDAwMDAgMDAwMCAwMCBub25lIG5vbmUiLAotICAgICAgICAgICAgZm9yTTRNZXNzYWdlID8gMHgwMCA6ICgobU5hdGl2ZUluZGV4IDw8IDMpIHwgbU5hdGl2ZVR5cGUpLAotICAgICAgICAgICAgbUNvbmZpZ3NbbU5hdGl2ZVR5cGVdW21OYXRpdmVJbmRleF0ucHJvZmlsZSwKLSAgICAgICAgICAgIG1Db25maWdzW21OYXRpdmVUeXBlXVttTmF0aXZlSW5kZXhdLmxldmVsLAotICAgICAgICAgICAgbVJlc29sdXRpb25FbmFibGVkWzBdLAotICAgICAgICAgICAgbVJlc29sdXRpb25FbmFibGVkWzFdLAotICAgICAgICAgICAgbVJlc29sdXRpb25FbmFibGVkWzJdKTsKLX0KLQotLy8gc3RhdGljCi1ib29sIFZpZGVvRm9ybWF0czo6UGlja0Jlc3RGb3JtYXQoCi0gICAgICAgIGNvbnN0IFZpZGVvRm9ybWF0cyAmc2lua1N1cHBvcnRlZCwKLSAgICAgICAgY29uc3QgVmlkZW9Gb3JtYXRzICZzb3VyY2VTdXBwb3J0ZWQsCi0gICAgICAgIFJlc29sdXRpb25UeXBlICpjaG9zZW5UeXBlLAotICAgICAgICBzaXplX3QgKmNob3NlbkluZGV4LAotICAgICAgICBQcm9maWxlVHlwZSAqY2hvc2VuUHJvZmlsZSwKLSAgICAgICAgTGV2ZWxUeXBlICpjaG9zZW5MZXZlbCkgewotI2lmIDAKLSAgICAvLyBTdXBwb3J0IGZvciB0aGUgbmF0aXZlIGZvcm1hdCBpcyBhIGdyZWF0IGlkZWEsIHRoZSBzcGVjIGluY2x1ZGVzCi0gICAgLy8gdGhlc2UgZmVhdHVyZXMsIGJ1dCBub2JvZHkgc3VwcG9ydHMgaXQgYW5kIHRoZSB0ZXN0cyBkb24ndCB2YWxpZGF0ZSBpdC4KLQotICAgIFJlc29sdXRpb25UeXBlIG5hdGl2ZVR5cGU7Ci0gICAgc2l6ZV90IG5hdGl2ZUluZGV4OwotICAgIHNpbmtTdXBwb3J0ZWQuZ2V0TmF0aXZlUmVzb2x1dGlvbigmbmF0aXZlVHlwZSwgJm5hdGl2ZUluZGV4KTsKLSAgICBpZiAoc2lua1N1cHBvcnRlZC5pc1Jlc29sdXRpb25FbmFibGVkKG5hdGl2ZVR5cGUsIG5hdGl2ZUluZGV4KSkgewotICAgICAgICBpZiAoc291cmNlU3VwcG9ydGVkLmlzUmVzb2x1dGlvbkVuYWJsZWQobmF0aXZlVHlwZSwgbmF0aXZlSW5kZXgpKSB7Ci0gICAgICAgICAgICBBTE9HSSgiQ2hvb3Npbmcgc2luaydzIG5hdGl2ZSByZXNvbHV0aW9uIik7Ci0gICAgICAgICAgICAqY2hvc2VuVHlwZSA9IG5hdGl2ZVR5cGU7Ci0gICAgICAgICAgICAqY2hvc2VuSW5kZXggPSBuYXRpdmVJbmRleDsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1coIlNpbmsgYWR2ZXJ0aXNlZCBuYXRpdmUgcmVzb2x1dGlvbiB0aGF0IGl0IGRvZXNuJ3QgIgotICAgICAgICAgICAgICAiYWN0dWFsbHkgc3VwcG9ydC4uLiBpZ25vcmluZyIpOwotICAgIH0KLQotICAgIHNvdXJjZVN1cHBvcnRlZC5nZXROYXRpdmVSZXNvbHV0aW9uKCZuYXRpdmVUeXBlLCAmbmF0aXZlSW5kZXgpOwotICAgIGlmIChzb3VyY2VTdXBwb3J0ZWQuaXNSZXNvbHV0aW9uRW5hYmxlZChuYXRpdmVUeXBlLCBuYXRpdmVJbmRleCkpIHsKLSAgICAgICAgaWYgKHNpbmtTdXBwb3J0ZWQuaXNSZXNvbHV0aW9uRW5hYmxlZChuYXRpdmVUeXBlLCBuYXRpdmVJbmRleCkpIHsKLSAgICAgICAgICAgIEFMT0dJKCJDaG9vc2luZyBzb3VyY2UncyBuYXRpdmUgcmVzb2x1dGlvbiIpOwotICAgICAgICAgICAgKmNob3NlblR5cGUgPSBuYXRpdmVUeXBlOwotICAgICAgICAgICAgKmNob3NlbkluZGV4ID0gbmF0aXZlSW5kZXg7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dXKCJTb3VyY2UgYWR2ZXJ0aXNlZCBuYXRpdmUgcmVzb2x1dGlvbiB0aGF0IGl0IGRvZXNuJ3QgIgotICAgICAgICAgICAgICAiYWN0dWFsbHkgc3VwcG9ydC4uLiBpZ25vcmluZyIpOwotICAgIH0KLSNlbmRpZgotCi0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgdWludDMyX3QgYmVzdFNjb3JlID0gMDsKLSAgICBzaXplX3QgYmVzdFR5cGUgPSAwOwotICAgIHNpemVfdCBiZXN0SW5kZXggPSAwOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bVJlc29sdXRpb25UeXBlczsgKytpKSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgMzI7ICsraikgewotICAgICAgICAgICAgc2l6ZV90IHdpZHRoLCBoZWlnaHQsIGZyYW1lc1BlclNlY29uZDsKLSAgICAgICAgICAgIGJvb2wgaW50ZXJsYWNlZDsKLSAgICAgICAgICAgIGlmICghR2V0Q29uZmlndXJhdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIChSZXNvbHV0aW9uVHlwZSlpLAotICAgICAgICAgICAgICAgICAgICAgICAgaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICZ3aWR0aCwgJmhlaWdodCwgJmZyYW1lc1BlclNlY29uZCwgJmludGVybGFjZWQpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghc2lua1N1cHBvcnRlZC5pc1Jlc29sdXRpb25FbmFibGVkKChSZXNvbHV0aW9uVHlwZSlpLCBqKQotICAgICAgICAgICAgICAgICAgICB8fCAhc291cmNlU3VwcG9ydGVkLmlzUmVzb2x1dGlvbkVuYWJsZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICAoUmVzb2x1dGlvblR5cGUpaSwgaikpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQUxPR1YoInR5cGUgJXp1LCBpbmRleCAlenUsICV6dSB4ICV6dSAlYyV6dSBzdXBwb3J0ZWQiLAotICAgICAgICAgICAgICAgICAgaSwgaiwgd2lkdGgsIGhlaWdodCwgaW50ZXJsYWNlZCA/ICdpJyA6ICdwJywgZnJhbWVzUGVyU2Vjb25kKTsKLQotICAgICAgICAgICAgdWludDMyX3Qgc2NvcmUgPSB3aWR0aCAqIGhlaWdodCAqIGZyYW1lc1BlclNlY29uZDsKLSAgICAgICAgICAgIGlmICghaW50ZXJsYWNlZCkgewotICAgICAgICAgICAgICAgIHNjb3JlICo9IDI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChmaXJzdCB8fCBzY29yZSA+IGJlc3RTY29yZSkgewotICAgICAgICAgICAgICAgIGJlc3RTY29yZSA9IHNjb3JlOwotICAgICAgICAgICAgICAgIGJlc3RUeXBlID0gaTsKLSAgICAgICAgICAgICAgICBiZXN0SW5kZXggPSBqOwotCi0gICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChmaXJzdCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgKmNob3NlblR5cGUgPSAoUmVzb2x1dGlvblR5cGUpYmVzdFR5cGU7Ci0gICAgKmNob3NlbkluZGV4ID0gYmVzdEluZGV4OwotCi0gICAgLy8gUGljayB0aGUgYmVzdCBwcm9maWxlL2xldmVsIHN1cHBvcnRlZCBieSBib3RoIHNpbmsgYW5kIHNvdXJjZS4KLSAgICBQcm9maWxlVHlwZSBzcmNQcm9maWxlLCBzaW5rUHJvZmlsZTsKLSAgICBMZXZlbFR5cGUgc3JjTGV2ZWwsIHNpbmtMZXZlbDsKLSAgICBzb3VyY2VTdXBwb3J0ZWQuZ2V0UHJvZmlsZUxldmVsKAotICAgICAgICAgICAgICAgICAgICAgICAgKFJlc29sdXRpb25UeXBlKWJlc3RUeXBlLCBiZXN0SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAmc3JjUHJvZmlsZSwgJnNyY0xldmVsKTsKLSAgICBzaW5rU3VwcG9ydGVkLmdldFByb2ZpbGVMZXZlbCgKLSAgICAgICAgICAgICAgICAgICAgICAgIChSZXNvbHV0aW9uVHlwZSliZXN0VHlwZSwgYmVzdEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgJnNpbmtQcm9maWxlLCAmc2lua0xldmVsKTsKLSAgICAqY2hvc2VuUHJvZmlsZSA9IHNyY1Byb2ZpbGUgPCBzaW5rUHJvZmlsZSA/IHNyY1Byb2ZpbGUgOiBzaW5rUHJvZmlsZTsKLSAgICAqY2hvc2VuTGV2ZWwgPSBzcmNMZXZlbCA8IHNpbmtMZXZlbCA/IHNyY0xldmVsIDogc2lua0xldmVsOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9WaWRlb0Zvcm1hdHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9WaWRlb0Zvcm1hdHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQzOGZkMS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvVmlkZW9Gb3JtYXRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDEzLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBWSURFT19GT1JNQVRTX0hfCi0KLSNkZWZpbmUgVklERU9fRk9STUFUU19IXwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IEFTdHJpbmc7Ci0KLS8vIFRoaXMgY2xhc3MgZW5jYXBzdWxhdGVzIHRoYXQgdmlkZW8gcmVzb2x1dGlvbiBjYXBhYmlsaXRpZXMgb2YgYSB3ZmQgc291cmNlCi0vLyBvciBzaW5rIGFzIG91dGxpbmVkIGluIHRoZSB3ZmQgc3BlY3MuIEN1cnJlbnRseSB0aHJlZSBzZXRzIG9mIHJlc29sdXRpb25zCi0vLyBhcmUgc3BlY2lmaWVkLCBlYWNoIG9mIHdoaWNoIHN1cHBvcnRzIHVwIHRvIDMyIHJlc29sdXRpb25zLgotLy8gSW4gYWRkaXRpb24gdG8gaXRzIGNhcGFiaWxpdGllcyBlYWNoIHNpbmsvc291cmNlIGFsc28gcHVibGlzaGVzIGl0cwotLy8gIm5hdGl2ZSIgcmVzb2x1dGlvbiwgcHJlc3VtYWJseSBvbmUgdGhhdCBpcyBwcmVmZXJyZWQgYW1vbmcgYWxsIG90aGVycwotLy8gYmVjYXVzZSBpdCB3b3VsZG4ndCByZXF1aXJlIGFueSBzY2FsaW5nIGFuZCBkaXJlY3RseSBjb3JyZXNwb25kcyB0byB0aGUKLS8vIGRpc3BsYXkgY2FwYWJpbGl0aWVzL3BpeGVscy4KLXN0cnVjdCBWaWRlb0Zvcm1hdHMgewotICAgIFZpZGVvRm9ybWF0cygpOwotCi0gICAgc3RydWN0IGNvbmZpZ190IHsKLSAgICAgICAgc2l6ZV90IHdpZHRoLCBoZWlnaHQsIGZyYW1lc1BlclNlY29uZDsKLSAgICAgICAgYm9vbCBpbnRlcmxhY2VkOwotICAgICAgICB1bnNpZ25lZCBjaGFyIHByb2ZpbGUsIGxldmVsOwotICAgIH07Ci0KLSAgICBlbnVtIFByb2ZpbGVUeXBlIHsKLSAgICAgICAgUFJPRklMRV9DQlAgPSAwLAotICAgICAgICBQUk9GSUxFX0NIUCwKLSAgICAgICAga051bVByb2ZpbGVUeXBlcywKLSAgICB9OwotCi0gICAgZW51bSBMZXZlbFR5cGUgewotICAgICAgICBMRVZFTF8zMSA9IDAsCi0gICAgICAgIExFVkVMXzMyLAotICAgICAgICBMRVZFTF80MCwKLSAgICAgICAgTEVWRUxfNDEsCi0gICAgICAgIExFVkVMXzQyLAotICAgICAgICBrTnVtTGV2ZWxUeXBlcywKLSAgICB9OwotCi0gICAgZW51bSBSZXNvbHV0aW9uVHlwZSB7Ci0gICAgICAgIFJFU09MVVRJT05fQ0VBLAotICAgICAgICBSRVNPTFVUSU9OX1ZFU0EsCi0gICAgICAgIFJFU09MVVRJT05fSEgsCi0gICAgICAgIGtOdW1SZXNvbHV0aW9uVHlwZXMsCi0gICAgfTsKLQotICAgIHZvaWQgc2V0TmF0aXZlUmVzb2x1dGlvbihSZXNvbHV0aW9uVHlwZSB0eXBlLCBzaXplX3QgaW5kZXgpOwotICAgIHZvaWQgZ2V0TmF0aXZlUmVzb2x1dGlvbihSZXNvbHV0aW9uVHlwZSAqdHlwZSwgc2l6ZV90ICppbmRleCkgY29uc3Q7Ci0KLSAgICB2b2lkIGRpc2FibGVBbGwoKTsKLSAgICB2b2lkIGVuYWJsZUFsbCgpOwotICAgIHZvaWQgZW5hYmxlUmVzb2x1dGlvblVwdG8oCi0gICAgICAgICAgICBSZXNvbHV0aW9uVHlwZSB0eXBlLCBzaXplX3QgaW5kZXgsCi0gICAgICAgICAgICBQcm9maWxlVHlwZSBwcm9maWxlLCBMZXZlbFR5cGUgbGV2ZWwpOwotCi0gICAgdm9pZCBzZXRSZXNvbHV0aW9uRW5hYmxlZCgKLSAgICAgICAgICAgIFJlc29sdXRpb25UeXBlIHR5cGUsIHNpemVfdCBpbmRleCwgYm9vbCBlbmFibGVkID0gdHJ1ZSk7Ci0KLSAgICBib29sIGlzUmVzb2x1dGlvbkVuYWJsZWQoUmVzb2x1dGlvblR5cGUgdHlwZSwgc2l6ZV90IGluZGV4KSBjb25zdDsKLQotICAgIHZvaWQgc2V0UHJvZmlsZUxldmVsKAotICAgICAgICAgICAgUmVzb2x1dGlvblR5cGUgdHlwZSwgc2l6ZV90IGluZGV4LAotICAgICAgICAgICAgUHJvZmlsZVR5cGUgcHJvZmlsZSwgTGV2ZWxUeXBlIGxldmVsKTsKLQotICAgIHZvaWQgZ2V0UHJvZmlsZUxldmVsKAotICAgICAgICAgICAgUmVzb2x1dGlvblR5cGUgdHlwZSwgc2l6ZV90IGluZGV4LAotICAgICAgICAgICAgUHJvZmlsZVR5cGUgKnByb2ZpbGUsIExldmVsVHlwZSAqbGV2ZWwpIGNvbnN0OwotCi0gICAgc3RhdGljIGJvb2wgR2V0Q29uZmlndXJhdGlvbigKLSAgICAgICAgICAgIFJlc29sdXRpb25UeXBlIHR5cGUsIHNpemVfdCBpbmRleCwKLSAgICAgICAgICAgIHNpemVfdCAqd2lkdGgsIHNpemVfdCAqaGVpZ2h0LCBzaXplX3QgKmZyYW1lc1BlclNlY29uZCwKLSAgICAgICAgICAgIGJvb2wgKmludGVybGFjZWQpOwotCi0gICAgc3RhdGljIGJvb2wgR2V0UHJvZmlsZUxldmVsKAotICAgICAgICAgICAgUHJvZmlsZVR5cGUgcHJvZmlsZSwgTGV2ZWxUeXBlIGxldmVsLAotICAgICAgICAgICAgdW5zaWduZWQgKnByb2ZpbGVJZGMsIHVuc2lnbmVkICpsZXZlbElkYywKLSAgICAgICAgICAgIHVuc2lnbmVkICpjb25zdHJhaW50U2V0KTsKLQotICAgIGJvb2wgcGFyc2VGb3JtYXRTcGVjKGNvbnN0IGNoYXIgKnNwZWMpOwotICAgIEFTdHJpbmcgZ2V0Rm9ybWF0U3BlYyhib29sIGZvck00TWVzc2FnZSA9IGZhbHNlKSBjb25zdDsKLQotICAgIHN0YXRpYyBib29sIFBpY2tCZXN0Rm9ybWF0KAotICAgICAgICAgICAgY29uc3QgVmlkZW9Gb3JtYXRzICZzaW5rU3VwcG9ydGVkLAotICAgICAgICAgICAgY29uc3QgVmlkZW9Gb3JtYXRzICZzb3VyY2VTdXBwb3J0ZWQsCi0gICAgICAgICAgICBSZXNvbHV0aW9uVHlwZSAqY2hvc2VuVHlwZSwKLSAgICAgICAgICAgIHNpemVfdCAqY2hvc2VuSW5kZXgsCi0gICAgICAgICAgICBQcm9maWxlVHlwZSAqY2hvc2VuUHJvZmlsZSwKLSAgICAgICAgICAgIExldmVsVHlwZSAqY2hvc2VuTGV2ZWwpOwotCi1wcml2YXRlOgotICAgIGJvb2wgcGFyc2VIMjY0Q29kZWMoY29uc3QgY2hhciAqc3BlYyk7Ci0gICAgUmVzb2x1dGlvblR5cGUgbU5hdGl2ZVR5cGU7Ci0gICAgc2l6ZV90IG1OYXRpdmVJbmRleDsKLQotICAgIHVpbnQzMl90IG1SZXNvbHV0aW9uRW5hYmxlZFtrTnVtUmVzb2x1dGlvblR5cGVzXTsKLSAgICBzdGF0aWMgY29uc3QgY29uZmlnX3QgbVJlc29sdXRpb25UYWJsZVtrTnVtUmVzb2x1dGlvblR5cGVzXVszMl07Ci0gICAgY29uZmlnX3QgbUNvbmZpZ3Nba051bVJlc29sdXRpb25UeXBlc11bMzJdOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVmlkZW9Gb3JtYXRzKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gVklERU9fRk9STUFUU19IXwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvcnRwL1JUUEJhc2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9ydHAvUlRQQmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTRmMWVlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9ydHAvUlRQQmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDEzLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBSVFBfQkFTRV9IXwotCi0jZGVmaW5lIFJUUF9CQVNFX0hfCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IFJUUEJhc2UgewotICAgIGVudW0gUGFja2V0aXphdGlvbk1vZGUgewotICAgICAgICBQQUNLRVRJWkFUSU9OX1RSQU5TUE9SVF9TVFJFQU0sCi0gICAgICAgIFBBQ0tFVElaQVRJT05fSDI2NCwKLSAgICAgICAgUEFDS0VUSVpBVElPTl9BQUMsCi0gICAgICAgIFBBQ0tFVElaQVRJT05fTk9ORSwKLSAgICB9OwotCi0gICAgZW51bSBUcmFuc3BvcnRNb2RlIHsKLSAgICAgICAgVFJBTlNQT1JUX1VOREVGSU5FRCwKLSAgICAgICAgVFJBTlNQT1JUX05PTkUsCi0gICAgICAgIFRSQU5TUE9SVF9VRFAsCi0gICAgICAgIFRSQU5TUE9SVF9UQ1AsCi0gICAgICAgIFRSQU5TUE9SVF9UQ1BfSU5URVJMRUFWRUQsCi0gICAgfTsKLQotICAgIC8vIFJlYWxseSBVRFAgX3BheWxvYWRfIHNpemUKLSAgICBjb25zdCB1bnNpZ25lZCBpbnQga01heFVEUFBhY2tldFNpemUgPSAxNDcyOyAgIC8vIDE0NzIgZ29vZCwgMTQ3MyBiYWQgb24gQW5kcm9pZEBIb21lCi0KLSAgICBzdGF0aWMgaW50MzJfdCBQaWNrUmFuZG9tUlRQUG9ydCgpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBSVFBfQkFTRV9IXwotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9ydHAvUlRQU2VuZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9ydHAvUlRQU2VuZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E5ZmRkMi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvcnRwL1JUUFNlbmRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4MDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDEzLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJSVFBTZW5kZXIiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJSVFBTZW5kZXIuaCIKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU5ldHdvcmtTZXNzaW9uLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgotCi0jaW5jbHVkZSAiaW5jbHVkZS9hdmNfdXRpbHMuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1SVFBTZW5kZXI6OlJUUFNlbmRlcigKLSAgICAgICAgY29uc3Qgc3A8QU5ldHdvcmtTZXNzaW9uPiAmbmV0U2Vzc2lvbiwKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpCi0gICAgOiBtTmV0U2Vzc2lvbihuZXRTZXNzaW9uKSwKLSAgICAgIG1Ob3RpZnkobm90aWZ5KSwKLSAgICAgIG1SVFBNb2RlKFRSQU5TUE9SVF9VTkRFRklORUQpLAotICAgICAgbVJUQ1BNb2RlKFRSQU5TUE9SVF9VTkRFRklORUQpLAotICAgICAgbVJUUFNlc3Npb25JRCgwKSwKLSAgICAgIG1SVENQU2Vzc2lvbklEKDApLAotICAgICAgbVJUUENvbm5lY3RlZChmYWxzZSksCi0gICAgICBtUlRDUENvbm5lY3RlZChmYWxzZSksCi0gICAgICBtTGFzdE5UUFRpbWUoMCksCi0gICAgICBtTGFzdFJUUFRpbWUoMCksCi0gICAgICBtTnVtUlRQU2VudCgwKSwKLSAgICAgIG1OdW1SVFBPY3RldHNTZW50KDApLAotICAgICAgbU51bVNSc1NlbnQoMCksCi0gICAgICBtUlRQU2VxTm8oMCksCi0gICAgICBtSGlzdG9yeVNpemUoMCkgewotfQotCi1SVFBTZW5kZXI6On5SVFBTZW5kZXIoKSB7Ci0gICAgaWYgKG1SVENQU2Vzc2lvbklEICE9IDApIHsKLSAgICAgICAgbU5ldFNlc3Npb24tPmRlc3Ryb3lTZXNzaW9uKG1SVENQU2Vzc2lvbklEKTsKLSAgICAgICAgbVJUQ1BTZXNzaW9uSUQgPSAwOwotICAgIH0KLQotICAgIGlmIChtUlRQU2Vzc2lvbklEICE9IDApIHsKLSAgICAgICAgbU5ldFNlc3Npb24tPmRlc3Ryb3lTZXNzaW9uKG1SVFBTZXNzaW9uSUQpOwotICAgICAgICBtUlRQU2Vzc2lvbklEID0gMDsKLSAgICB9Ci19Ci0KLS8vIHN0YXRpYwotaW50MzJfdCBSVFBCYXNlOjpQaWNrUmFuZG9tUlRQUG9ydCgpIHsKLSAgICAvLyBQaWNrIGFuIGV2ZW4gaW50ZWdlciBpbiByYW5nZSBbMTAyNCwgNjU1MzQpCi0KLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtSYW5nZSA9ICg2NTUzNCAtIDEwMjQpIC8gMjsKLQotICAgIHJldHVybiAoaW50MzJfdCkoKChmbG9hdCkoa1JhbmdlICsgMSkgKiByYW5kKCkpIC8gUkFORF9NQVgpICogMiArIDEwMjQ7Ci19Ci0KLXN0YXR1c190IFJUUFNlbmRlcjo6aW5pdEFzeW5jKAotICAgICAgICBjb25zdCBjaGFyICpyZW1vdGVIb3N0LAotICAgICAgICBpbnQzMl90IHJlbW90ZVJUUFBvcnQsCi0gICAgICAgIFRyYW5zcG9ydE1vZGUgcnRwTW9kZSwKLSAgICAgICAgaW50MzJfdCByZW1vdGVSVENQUG9ydCwKLSAgICAgICAgVHJhbnNwb3J0TW9kZSBydGNwTW9kZSwKLSAgICAgICAgaW50MzJfdCAqb3V0TG9jYWxSVFBQb3J0KSB7Ci0gICAgaWYgKG1SVFBNb2RlICE9IFRSQU5TUE9SVF9VTkRFRklORUQKLSAgICAgICAgICAgIHx8IHJ0cE1vZGUgPT0gVFJBTlNQT1JUX1VOREVGSU5FRAotICAgICAgICAgICAgfHwgcnRwTW9kZSA9PSBUUkFOU1BPUlRfTk9ORQotICAgICAgICAgICAgfHwgcnRjcE1vZGUgPT0gVFJBTlNQT1JUX1VOREVGSU5FRCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgQ0hFQ0tfTkUocnRwTW9kZSwgVFJBTlNQT1JUX1RDUF9JTlRFUkxFQVZFRCk7Ci0gICAgQ0hFQ0tfTkUocnRjcE1vZGUsIFRSQU5TUE9SVF9UQ1BfSU5URVJMRUFWRUQpOwotCi0gICAgaWYgKChydGNwTW9kZSA9PSBUUkFOU1BPUlRfTk9ORSAmJiByZW1vdGVSVENQUG9ydCA+PSAwKQotICAgICAgICAgICAgfHwgKHJ0Y3BNb2RlICE9IFRSQU5TUE9SVF9OT05FICYmIHJlbW90ZVJUQ1BQb3J0IDwgMCkpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIHNwPEFNZXNzYWdlPiBydHBOb3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSVFBOb3RpZnksIHRoaXMpOwotCi0gICAgc3A8QU1lc3NhZ2U+IHJ0Y3BOb3RpZnk7Ci0gICAgaWYgKHJlbW90ZVJUQ1BQb3J0ID49IDApIHsKLSAgICAgICAgcnRjcE5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFJUQ1BOb3RpZnksIHRoaXMpOwotICAgIH0KLQotICAgIENIRUNLX0VRKG1SVFBTZXNzaW9uSUQsIDApOwotICAgIENIRUNLX0VRKG1SVENQU2Vzc2lvbklELCAwKTsKLQotICAgIGludDMyX3QgbG9jYWxSVFBQb3J0OwotCi0gICAgZm9yICg7OykgewotICAgICAgICBsb2NhbFJUUFBvcnQgPSBQaWNrUmFuZG9tUlRQUG9ydCgpOwotCi0gICAgICAgIHN0YXR1c190IGVycjsKLSAgICAgICAgaWYgKHJ0cE1vZGUgPT0gVFJBTlNQT1JUX1VEUCkgewotICAgICAgICAgICAgZXJyID0gbU5ldFNlc3Npb24tPmNyZWF0ZVVEUFNlc3Npb24oCi0gICAgICAgICAgICAgICAgICAgIGxvY2FsUlRQUG9ydCwKLSAgICAgICAgICAgICAgICAgICAgcmVtb3RlSG9zdCwKLSAgICAgICAgICAgICAgICAgICAgcmVtb3RlUlRQUG9ydCwKLSAgICAgICAgICAgICAgICAgICAgcnRwTm90aWZ5LAotICAgICAgICAgICAgICAgICAgICAmbVJUUFNlc3Npb25JRCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBDSEVDS19FUShydHBNb2RlLCBUUkFOU1BPUlRfVENQKTsKLSAgICAgICAgICAgIGVyciA9IG1OZXRTZXNzaW9uLT5jcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb24oCi0gICAgICAgICAgICAgICAgICAgIGxvY2FsUlRQUG9ydCwKLSAgICAgICAgICAgICAgICAgICAgcmVtb3RlSG9zdCwKLSAgICAgICAgICAgICAgICAgICAgcmVtb3RlUlRQUG9ydCwKLSAgICAgICAgICAgICAgICAgICAgcnRwTm90aWZ5LAotICAgICAgICAgICAgICAgICAgICAmbVJUUFNlc3Npb25JRCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZW1vdGVSVENQUG9ydCA8IDApIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJ0Y3BNb2RlID09IFRSQU5TUE9SVF9VRFApIHsKLSAgICAgICAgICAgIGVyciA9IG1OZXRTZXNzaW9uLT5jcmVhdGVVRFBTZXNzaW9uKAotICAgICAgICAgICAgICAgICAgICBsb2NhbFJUUFBvcnQgKyAxLAotICAgICAgICAgICAgICAgICAgICByZW1vdGVIb3N0LAotICAgICAgICAgICAgICAgICAgICByZW1vdGVSVENQUG9ydCwKLSAgICAgICAgICAgICAgICAgICAgcnRjcE5vdGlmeSwKLSAgICAgICAgICAgICAgICAgICAgJm1SVENQU2Vzc2lvbklEKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIENIRUNLX0VRKHJ0Y3BNb2RlLCBUUkFOU1BPUlRfVENQKTsKLSAgICAgICAgICAgIGVyciA9IG1OZXRTZXNzaW9uLT5jcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb24oCi0gICAgICAgICAgICAgICAgICAgIGxvY2FsUlRQUG9ydCArIDEsCi0gICAgICAgICAgICAgICAgICAgIHJlbW90ZUhvc3QsCi0gICAgICAgICAgICAgICAgICAgIHJlbW90ZVJUQ1BQb3J0LAotICAgICAgICAgICAgICAgICAgICBydGNwTm90aWZ5LAotICAgICAgICAgICAgICAgICAgICAmbVJUQ1BTZXNzaW9uSUQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBtTmV0U2Vzc2lvbi0+ZGVzdHJveVNlc3Npb24obVJUUFNlc3Npb25JRCk7Ci0gICAgICAgIG1SVFBTZXNzaW9uSUQgPSAwOwotICAgIH0KLQotICAgIGlmIChydHBNb2RlID09IFRSQU5TUE9SVF9VRFApIHsKLSAgICAgICAgbVJUUENvbm5lY3RlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgaWYgKHJ0Y3BNb2RlID09IFRSQU5TUE9SVF9VRFApIHsKLSAgICAgICAgbVJUQ1BDb25uZWN0ZWQgPSB0cnVlOwotICAgIH0KLQotICAgIG1SVFBNb2RlID0gcnRwTW9kZTsKLSAgICBtUlRDUE1vZGUgPSBydGNwTW9kZTsKLSAgICAqb3V0TG9jYWxSVFBQb3J0ID0gbG9jYWxSVFBQb3J0OwotCi0gICAgaWYgKG1SVFBNb2RlID09IFRSQU5TUE9SVF9VRFAKLSAgICAgICAgICAgICYmIChtUlRDUE1vZGUgPT0gVFJBTlNQT1JUX1VEUCB8fCBtUlRDUE1vZGUgPT0gVFJBTlNQT1JUX05PTkUpKSB7Ci0gICAgICAgIG5vdGlmeUluaXREb25lKE9LKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFJUUFNlbmRlcjo6cXVldWVCdWZmZXIoCi0gICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIsIHVpbnQ4X3QgcGFja2V0VHlwZSwgUGFja2V0aXphdGlvbk1vZGUgbW9kZSkgewotICAgIHN0YXR1c190IGVycjsKLQotICAgIHN3aXRjaCAobW9kZSkgewotICAgICAgICBjYXNlIFBBQ0tFVElaQVRJT05fTk9ORToKLSAgICAgICAgICAgIGVyciA9IHF1ZXVlUmF3UGFja2V0KGJ1ZmZlciwgcGFja2V0VHlwZSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFBBQ0tFVElaQVRJT05fVFJBTlNQT1JUX1NUUkVBTToKLSAgICAgICAgICAgIGVyciA9IHF1ZXVlVFNQYWNrZXRzKGJ1ZmZlciwgcGFja2V0VHlwZSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFBBQ0tFVElaQVRJT05fSDI2NDoKLSAgICAgICAgICAgIGVyciAgPSBxdWV1ZUFWQ0J1ZmZlcihidWZmZXIsIHBhY2tldFR5cGUpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFRSRVNQQVNTKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgUlRQU2VuZGVyOjpxdWV1ZVJhd1BhY2tldCgKLSAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJnBhY2tldCwgdWludDhfdCBwYWNrZXRUeXBlKSB7Ci0gICAgQ0hFQ0tfTEUocGFja2V0LT5zaXplKCksIGtNYXhVRFBQYWNrZXRTaXplIC0gMTIpOwotCi0gICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgQ0hFQ0socGFja2V0LT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwotCi0gICAgc3A8QUJ1ZmZlcj4gdWRwUGFja2V0ID0gbmV3IEFCdWZmZXIoMTIgKyBwYWNrZXQtPnNpemUoKSk7Ci0KLSAgICB1ZHBQYWNrZXQtPnNldEludDMyRGF0YShtUlRQU2VxTm8pOwotCi0gICAgdWludDhfdCAqcnRwID0gdWRwUGFja2V0LT5kYXRhKCk7Ci0gICAgcnRwWzBdID0gMHg4MDsKLSAgICBydHBbMV0gPSBwYWNrZXRUeXBlOwotCi0gICAgcnRwWzJdID0gKG1SVFBTZXFObyA+PiA4KSAmIDB4ZmY7Ci0gICAgcnRwWzNdID0gbVJUUFNlcU5vICYgMHhmZjsKLSAgICArK21SVFBTZXFObzsKLQotICAgIHVpbnQzMl90IHJ0cFRpbWUgPSAodGltZVVzICogOSkgLyAxMDBsbDsKLQotICAgIHJ0cFs0XSA9IHJ0cFRpbWUgPj4gMjQ7Ci0gICAgcnRwWzVdID0gKHJ0cFRpbWUgPj4gMTYpICYgMHhmZjsKLSAgICBydHBbNl0gPSAocnRwVGltZSA+PiA4KSAmIDB4ZmY7Ci0gICAgcnRwWzddID0gcnRwVGltZSAmIDB4ZmY7Ci0KLSAgICBydHBbOF0gPSBrU291cmNlSUQgPj4gMjQ7Ci0gICAgcnRwWzldID0gKGtTb3VyY2VJRCA+PiAxNikgJiAweGZmOwotICAgIHJ0cFsxMF0gPSAoa1NvdXJjZUlEID4+IDgpICYgMHhmZjsKLSAgICBydHBbMTFdID0ga1NvdXJjZUlEICYgMHhmZjsKLQotICAgIG1lbWNweSgmcnRwWzEyXSwgcGFja2V0LT5kYXRhKCksIHBhY2tldC0+c2l6ZSgpKTsKLQotICAgIHJldHVybiBzZW5kUlRQUGFja2V0KAotICAgICAgICAgICAgdWRwUGFja2V0LAotICAgICAgICAgICAgdHJ1ZSAvKiBzdG9yZUluSGlzdG9yeSAqLywKLSAgICAgICAgICAgIHRydWUgLyogdGltZVZhbGlkICovLAotICAgICAgICAgICAgQUxvb3Blcjo6R2V0Tm93VXMoKSk7Ci19Ci0KLXN0YXR1c190IFJUUFNlbmRlcjo6cXVldWVUU1BhY2tldHMoCi0gICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZ0c1BhY2tldHMsIHVpbnQ4X3QgcGFja2V0VHlwZSkgewotICAgIENIRUNLX0VRKDB1LCB0c1BhY2tldHMtPnNpemUoKSAlIDE4OCk7Ci0KLSAgICBpbnQ2NF90IHRpbWVVczsKLSAgICBDSEVDSyh0c1BhY2tldHMtPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7Ci0KLSAgICBzaXplX3Qgc3JjT2Zmc2V0ID0gMDsKLSAgICB3aGlsZSAoc3JjT2Zmc2V0IDwgdHNQYWNrZXRzLT5zaXplKCkpIHsKLSAgICAgICAgc3A8QUJ1ZmZlcj4gdWRwUGFja2V0ID0KLSAgICAgICAgICAgIG5ldyBBQnVmZmVyKDEyICsga01heE51bVRTUGFja2V0c1BlclJUUFBhY2tldCAqIDE4OCk7Ci0KLSAgICAgICAgdWRwUGFja2V0LT5zZXRJbnQzMkRhdGEobVJUUFNlcU5vKTsKLQotICAgICAgICB1aW50OF90ICpydHAgPSB1ZHBQYWNrZXQtPmRhdGEoKTsKLSAgICAgICAgcnRwWzBdID0gMHg4MDsKLSAgICAgICAgcnRwWzFdID0gcGFja2V0VHlwZTsKLQotICAgICAgICBydHBbMl0gPSAobVJUUFNlcU5vID4+IDgpICYgMHhmZjsKLSAgICAgICAgcnRwWzNdID0gbVJUUFNlcU5vICYgMHhmZjsKLSAgICAgICAgKyttUlRQU2VxTm87Ci0KLSAgICAgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0gICAgICAgIHVpbnQzMl90IHJ0cFRpbWUgPSAobm93VXMgKiA5KSAvIDEwMGxsOwotCi0gICAgICAgIHJ0cFs0XSA9IHJ0cFRpbWUgPj4gMjQ7Ci0gICAgICAgIHJ0cFs1XSA9IChydHBUaW1lID4+IDE2KSAmIDB4ZmY7Ci0gICAgICAgIHJ0cFs2XSA9IChydHBUaW1lID4+IDgpICYgMHhmZjsKLSAgICAgICAgcnRwWzddID0gcnRwVGltZSAmIDB4ZmY7Ci0KLSAgICAgICAgcnRwWzhdID0ga1NvdXJjZUlEID4+IDI0OwotICAgICAgICBydHBbOV0gPSAoa1NvdXJjZUlEID4+IDE2KSAmIDB4ZmY7Ci0gICAgICAgIHJ0cFsxMF0gPSAoa1NvdXJjZUlEID4+IDgpICYgMHhmZjsKLSAgICAgICAgcnRwWzExXSA9IGtTb3VyY2VJRCAmIDB4ZmY7Ci0KLSAgICAgICAgc2l6ZV90IG51bVRTUGFja2V0cyA9ICh0c1BhY2tldHMtPnNpemUoKSAtIHNyY09mZnNldCkgLyAxODg7Ci0gICAgICAgIGlmIChudW1UU1BhY2tldHMgPiBrTWF4TnVtVFNQYWNrZXRzUGVyUlRQUGFja2V0KSB7Ci0gICAgICAgICAgICBudW1UU1BhY2tldHMgPSBrTWF4TnVtVFNQYWNrZXRzUGVyUlRQUGFja2V0OwotICAgICAgICB9Ci0KLSAgICAgICAgbWVtY3B5KCZydHBbMTJdLCB0c1BhY2tldHMtPmRhdGEoKSArIHNyY09mZnNldCwgbnVtVFNQYWNrZXRzICogMTg4KTsKLQotICAgICAgICB1ZHBQYWNrZXQtPnNldFJhbmdlKDAsIDEyICsgbnVtVFNQYWNrZXRzICogMTg4KTsKLQotICAgICAgICBzcmNPZmZzZXQgKz0gbnVtVFNQYWNrZXRzICogMTg4OwotICAgICAgICBib29sIGlzTGFzdFBhY2tldCA9IChzcmNPZmZzZXQgPT0gdHNQYWNrZXRzLT5zaXplKCkpOwotCi0gICAgICAgIHN0YXR1c190IGVyciA9IHNlbmRSVFBQYWNrZXQoCi0gICAgICAgICAgICAgICAgdWRwUGFja2V0LAotICAgICAgICAgICAgICAgIHRydWUgLyogc3RvcmVJbkhpc3RvcnkgKi8sCi0gICAgICAgICAgICAgICAgaXNMYXN0UGFja2V0IC8qIHRpbWVWYWxpZCAqLywKLSAgICAgICAgICAgICAgICB0aW1lVXMpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFJUUFNlbmRlcjo6cXVldWVBVkNCdWZmZXIoCi0gICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0LCB1aW50OF90IHBhY2tldFR5cGUpIHsKLSAgICBpbnQ2NF90IHRpbWVVczsKLSAgICBDSEVDSyhhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwotCi0gICAgdWludDMyX3QgcnRwVGltZSA9ICh0aW1lVXMgKiA5IC8gMTAwbGwpOwotCi0gICAgTGlzdDxzcDxBQnVmZmVyPiA+IHBhY2tldHM7Ci0KLSAgICBzcDxBQnVmZmVyPiBvdXQgPSBuZXcgQUJ1ZmZlcihrTWF4VURQUGFja2V0U2l6ZSk7Ci0gICAgc2l6ZV90IG91dEJ5dGVzVXNlZCA9IDEyOyAgLy8gUGxhY2Vob2xkZXIgZm9yIFJUUCBoZWFkZXIuCi0KLSAgICBjb25zdCB1aW50OF90ICpkYXRhID0gYWNjZXNzVW5pdC0+ZGF0YSgpOwotICAgIHNpemVfdCBzaXplID0gYWNjZXNzVW5pdC0+c2l6ZSgpOwotICAgIGNvbnN0IHVpbnQ4X3QgKm5hbFN0YXJ0OwotICAgIHNpemVfdCBuYWxTaXplOwotICAgIHdoaWxlIChnZXROZXh0TkFMVW5pdCgKLSAgICAgICAgICAgICAgICAmZGF0YSwgJnNpemUsICZuYWxTdGFydCwgJm5hbFNpemUsCi0gICAgICAgICAgICAgICAgdHJ1ZSAvKiBzdGFydENvZGVGb2xsb3dzICovKSA9PSBPSykgewotICAgICAgICBzaXplX3QgYnl0ZXNOZWVkZWQgPSBuYWxTaXplICsgMjsKLSAgICAgICAgaWYgKG91dEJ5dGVzVXNlZCA9PSAxMikgewotICAgICAgICAgICAgKytieXRlc05lZWRlZDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvdXRCeXRlc1VzZWQgKyBieXRlc05lZWRlZCA+IG91dC0+Y2FwYWNpdHkoKSkgewotICAgICAgICAgICAgYm9vbCBlbWl0U2luZ2xlTkFMUGFja2V0ID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIGlmIChvdXRCeXRlc1VzZWQgPT0gMTIKLSAgICAgICAgICAgICAgICAgICAgJiYgb3V0Qnl0ZXNVc2VkICsgbmFsU2l6ZSA8PSBvdXQtPmNhcGFjaXR5KCkpIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBoYXZlbid0IGVtaXR0ZWQgYW55dGhpbmcgaW50byB0aGUgY3VycmVudCBwYWNrZXQgeWV0IGFuZAotICAgICAgICAgICAgICAgIC8vIHRoaXMgTkFMIHVuaXQgZml0cyBpbnRvIGEgc2luZ2xlLU5BTC11bml0LXBhY2tldCB3aGlsZQotICAgICAgICAgICAgICAgIC8vIGl0IHdvdWxkbid0IGhhdmUgZml0IGFzIHBhcnQgb2YgYSBTVEFQLUEgcGFja2V0LgotCi0gICAgICAgICAgICAgICAgbWVtY3B5KG91dC0+ZGF0YSgpICsgb3V0Qnl0ZXNVc2VkLCBuYWxTdGFydCwgbmFsU2l6ZSk7Ci0gICAgICAgICAgICAgICAgb3V0Qnl0ZXNVc2VkICs9IG5hbFNpemU7Ci0KLSAgICAgICAgICAgICAgICBlbWl0U2luZ2xlTkFMUGFja2V0ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG91dEJ5dGVzVXNlZCA+IDEyKSB7Ci0gICAgICAgICAgICAgICAgb3V0LT5zZXRSYW5nZSgwLCBvdXRCeXRlc1VzZWQpOwotICAgICAgICAgICAgICAgIHBhY2tldHMucHVzaF9iYWNrKG91dCk7Ci0gICAgICAgICAgICAgICAgb3V0ID0gbmV3IEFCdWZmZXIoa01heFVEUFBhY2tldFNpemUpOwotICAgICAgICAgICAgICAgIG91dEJ5dGVzVXNlZCA9IDEyOyAgLy8gUGxhY2Vob2xkZXIgZm9yIFJUUCBoZWFkZXIKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGVtaXRTaW5nbGVOQUxQYWNrZXQpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvdXRCeXRlc1VzZWQgKyBieXRlc05lZWRlZCA8PSBvdXQtPmNhcGFjaXR5KCkpIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCA9IG91dC0+ZGF0YSgpICsgb3V0Qnl0ZXNVc2VkOwotCi0gICAgICAgICAgICBpZiAob3V0Qnl0ZXNVc2VkID09IDEyKSB7Ci0gICAgICAgICAgICAgICAgKmRzdCsrID0gMjQ7ICAvLyBTVEFQLUEgaGVhZGVyCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICpkc3QrKyA9IChuYWxTaXplID4+IDgpICYgMHhmZjsKLSAgICAgICAgICAgICpkc3QrKyA9IG5hbFNpemUgJiAweGZmOwotICAgICAgICAgICAgbWVtY3B5KGRzdCwgbmFsU3RhcnQsIG5hbFNpemUpOwotCi0gICAgICAgICAgICBvdXRCeXRlc1VzZWQgKz0gYnl0ZXNOZWVkZWQ7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRoaXMgc2luZ2xlIE5BTCB1bml0IGRvZXMgbm90IGZpdCBpbnRvIGEgc2luZ2xlIFJUUCBwYWNrZXQsCi0gICAgICAgIC8vIHdlIG5lZWQgdG8gZW1pdCBhbiBGVS1BLgotCi0gICAgICAgIENIRUNLX0VRKG91dEJ5dGVzVXNlZCwgMTJ1KTsKLQotICAgICAgICB1aW50OF90IG5hbFR5cGUgPSBuYWxTdGFydFswXSAmIDB4MWY7Ci0gICAgICAgIHVpbnQ4X3QgbnJpID0gKG5hbFN0YXJ0WzBdID4+IDUpICYgMzsKLQotICAgICAgICBzaXplX3Qgc3JjT2Zmc2V0ID0gMTsKLSAgICAgICAgd2hpbGUgKHNyY09mZnNldCA8IG5hbFNpemUpIHsKLSAgICAgICAgICAgIHNpemVfdCBjb3B5ID0gb3V0LT5jYXBhY2l0eSgpIC0gb3V0Qnl0ZXNVc2VkIC0gMjsKLSAgICAgICAgICAgIGlmIChjb3B5ID4gbmFsU2l6ZSAtIHNyY09mZnNldCkgewotICAgICAgICAgICAgICAgIGNvcHkgPSBuYWxTaXplIC0gc3JjT2Zmc2V0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1aW50OF90ICpkc3QgPSBvdXQtPmRhdGEoKSArIG91dEJ5dGVzVXNlZDsKLSAgICAgICAgICAgIGRzdFswXSA9IChucmkgPDwgNSkgfCAyODsKLQotICAgICAgICAgICAgZHN0WzFdID0gbmFsVHlwZTsKLQotICAgICAgICAgICAgaWYgKHNyY09mZnNldCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgZHN0WzFdIHw9IDB4ODA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzcmNPZmZzZXQgKyBjb3B5ID09IG5hbFNpemUpIHsKLSAgICAgICAgICAgICAgICBkc3RbMV0gfD0gMHg0MDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbWVtY3B5KCZkc3RbMl0sIG5hbFN0YXJ0ICsgc3JjT2Zmc2V0LCBjb3B5KTsKLSAgICAgICAgICAgIHNyY09mZnNldCArPSBjb3B5OwotCi0gICAgICAgICAgICBvdXQtPnNldFJhbmdlKDAsIG91dEJ5dGVzVXNlZCArIGNvcHkgKyAyKTsKLQotICAgICAgICAgICAgcGFja2V0cy5wdXNoX2JhY2sob3V0KTsKLSAgICAgICAgICAgIG91dCA9IG5ldyBBQnVmZmVyKGtNYXhVRFBQYWNrZXRTaXplKTsKLSAgICAgICAgICAgIG91dEJ5dGVzVXNlZCA9IDEyOyAgLy8gUGxhY2Vob2xkZXIgZm9yIFJUUCBoZWFkZXIKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChvdXRCeXRlc1VzZWQgPiAxMikgewotICAgICAgICBvdXQtPnNldFJhbmdlKDAsIG91dEJ5dGVzVXNlZCk7Ci0gICAgICAgIHBhY2tldHMucHVzaF9iYWNrKG91dCk7Ci0gICAgfQotCi0gICAgd2hpbGUgKCFwYWNrZXRzLmVtcHR5KCkpIHsKLSAgICAgICAgc3A8QUJ1ZmZlcj4gb3V0ID0gKnBhY2tldHMuYmVnaW4oKTsKLSAgICAgICAgcGFja2V0cy5lcmFzZShwYWNrZXRzLmJlZ2luKCkpOwotCi0gICAgICAgIG91dC0+c2V0SW50MzJEYXRhKG1SVFBTZXFObyk7Ci0KLSAgICAgICAgYm9vbCBsYXN0ID0gcGFja2V0cy5lbXB0eSgpOwotCi0gICAgICAgIHVpbnQ4X3QgKmRzdCA9IG91dC0+ZGF0YSgpOwotCi0gICAgICAgIGRzdFswXSA9IDB4ODA7Ci0KLSAgICAgICAgZHN0WzFdID0gcGFja2V0VHlwZTsKLSAgICAgICAgaWYgKGxhc3QpIHsKLSAgICAgICAgICAgIGRzdFsxXSB8PSAxIDw8IDc7ICAvLyBNLWJpdAotICAgICAgICB9Ci0KLSAgICAgICAgZHN0WzJdID0gKG1SVFBTZXFObyA+PiA4KSAmIDB4ZmY7Ci0gICAgICAgIGRzdFszXSA9IG1SVFBTZXFObyAmIDB4ZmY7Ci0gICAgICAgICsrbVJUUFNlcU5vOwotCi0gICAgICAgIGRzdFs0XSA9IHJ0cFRpbWUgPj4gMjQ7Ci0gICAgICAgIGRzdFs1XSA9IChydHBUaW1lID4+IDE2KSAmIDB4ZmY7Ci0gICAgICAgIGRzdFs2XSA9IChydHBUaW1lID4+IDgpICYgMHhmZjsKLSAgICAgICAgZHN0WzddID0gcnRwVGltZSAmIDB4ZmY7Ci0gICAgICAgIGRzdFs4XSA9IGtTb3VyY2VJRCA+PiAyNDsKLSAgICAgICAgZHN0WzldID0gKGtTb3VyY2VJRCA+PiAxNikgJiAweGZmOwotICAgICAgICBkc3RbMTBdID0gKGtTb3VyY2VJRCA+PiA4KSAmIDB4ZmY7Ci0gICAgICAgIGRzdFsxMV0gPSBrU291cmNlSUQgJiAweGZmOwotCi0gICAgICAgIHN0YXR1c190IGVyciA9IHNlbmRSVFBQYWNrZXQob3V0LCB0cnVlIC8qIHN0b3JlSW5IaXN0b3J5ICovKTsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBSVFBTZW5kZXI6OnNlbmRSVFBQYWNrZXQoCi0gICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIsIGJvb2wgc3RvcmVJbkhpc3RvcnksCi0gICAgICAgIGJvb2wgdGltZVZhbGlkLCBpbnQ2NF90IHRpbWVVcykgewotICAgIENIRUNLKG1SVFBDb25uZWN0ZWQpOwotCi0gICAgc3RhdHVzX3QgZXJyID0gbU5ldFNlc3Npb24tPnNlbmRSZXF1ZXN0KAotICAgICAgICAgICAgbVJUUFNlc3Npb25JRCwgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpLAotICAgICAgICAgICAgdGltZVZhbGlkLCB0aW1lVXMpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIG1MYXN0TlRQVGltZSA9IEdldE5vd05UUCgpOwotICAgIG1MYXN0UlRQVGltZSA9IFUzMl9BVChidWZmZXItPmRhdGEoKSArIDQpOwotCi0gICAgKyttTnVtUlRQU2VudDsKLSAgICBtTnVtUlRQT2N0ZXRzU2VudCArPSBidWZmZXItPnNpemUoKSAtIDEyOwotCi0gICAgaWYgKHN0b3JlSW5IaXN0b3J5KSB7Ci0gICAgICAgIGlmIChtSGlzdG9yeVNpemUgPT0ga01heEhpc3RvcnlTaXplKSB7Ci0gICAgICAgICAgICBtSGlzdG9yeS5lcmFzZShtSGlzdG9yeS5iZWdpbigpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICsrbUhpc3RvcnlTaXplOwotICAgICAgICB9Ci0gICAgICAgIG1IaXN0b3J5LnB1c2hfYmFjayhidWZmZXIpOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotLy8gc3RhdGljCi11aW50NjRfdCBSVFBTZW5kZXI6OkdldE5vd05UUCgpIHsKLSAgICBzdHJ1Y3QgdGltZXZhbCB0djsKLSAgICBnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMIC8qIHRpbWV6b25lICovKTsKLQotICAgIHVpbnQ2NF90IG5vd1VzID0gdHYudHZfc2VjICogMTAwMDAwMGxsICsgdHYudHZfdXNlYzsKLQotICAgIG5vd1VzICs9ICgoNzBsbCAqIDM2NSArIDE3KSAqIDI0KSAqIDYwICogNjAgKiAxMDAwMDAwbGw7Ci0KLSAgICB1aW50NjRfdCBoaSA9IG5vd1VzIC8gMTAwMDAwMGxsOwotICAgIHVpbnQ2NF90IGxvID0gKCgxbGwgPDwgMzIpICogKG5vd1VzICUgMTAwMDAwMGxsKSkgLyAxMDAwMDAwbGw7Ci0KLSAgICByZXR1cm4gKGhpIDw8IDMyKSB8IGxvOwotfQotCi12b2lkIFJUUFNlbmRlcjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7Ci0gICAgICAgIGNhc2Uga1doYXRSVFBOb3RpZnk6Ci0gICAgICAgIGNhc2Uga1doYXRSVENQTm90aWZ5OgotICAgICAgICAgICAgb25OZXROb3RpZnkobXNnLT53aGF0KCkgPT0ga1doYXRSVFBOb3RpZnksIG1zZyk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgVFJFU1BBU1MoKTsKLSAgICB9Ci19Ci0KLXZvaWQgUlRQU2VuZGVyOjpvbk5ldE5vdGlmeShib29sIGlzUlRQLCBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewotICAgIGludDMyX3QgcmVhc29uOwotICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJyZWFzb24iLCAmcmVhc29uKSk7Ci0KLSAgICBzd2l0Y2ggKHJlYXNvbikgewotICAgICAgICBjYXNlIEFOZXR3b3JrU2Vzc2lvbjo6a1doYXRFcnJvcjoKLSAgICAgICAgewotICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigic2Vzc2lvbklEIiwgJnNlc3Npb25JRCkpOwotCi0gICAgICAgICAgICBpbnQzMl90IGVycjsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7Ci0KLSAgICAgICAgICAgIGludDMyX3QgZXJyb3JPY2N1cmVkRHVyaW5nU2VuZDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzZW5kIiwgJmVycm9yT2NjdXJlZER1cmluZ1NlbmQpKTsKLQotICAgICAgICAgICAgQVN0cmluZyBkZXRhaWw7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTdHJpbmcoImRldGFpbCIsICZkZXRhaWwpKTsKLQotICAgICAgICAgICAgQUxPR0UoIkFuIGVycm9yIG9jY3VycmVkIGR1cmluZyAlcyBpbiBzZXNzaW9uICVkICIKLSAgICAgICAgICAgICAgICAgICIoJWQsICclcycgKCVzKSkuIiwKLSAgICAgICAgICAgICAgICAgIGVycm9yT2NjdXJlZER1cmluZ1NlbmQgPyAic2VuZCIgOiAicmVjZWl2ZSIsCi0gICAgICAgICAgICAgICAgICBzZXNzaW9uSUQsCi0gICAgICAgICAgICAgICAgICBlcnIsCi0gICAgICAgICAgICAgICAgICBkZXRhaWwuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpKTsKLQotICAgICAgICAgICAgbU5ldFNlc3Npb24tPmRlc3Ryb3lTZXNzaW9uKHNlc3Npb25JRCk7Ci0KLSAgICAgICAgICAgIGlmIChzZXNzaW9uSUQgPT0gbVJUUFNlc3Npb25JRCkgewotICAgICAgICAgICAgICAgIG1SVFBTZXNzaW9uSUQgPSAwOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzZXNzaW9uSUQgPT0gbVJUQ1BTZXNzaW9uSUQpIHsKLSAgICAgICAgICAgICAgICBtUlRDUFNlc3Npb25JRCA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghbVJUUENvbm5lY3RlZAotICAgICAgICAgICAgICAgICAgICB8fCAobVJUUE1vZGUgIT0gVFJBTlNQT1JUX05PTkUgJiYgIW1SVENQQ29ubmVjdGVkKSkgewotICAgICAgICAgICAgICAgIC8vIFdlIGhhdmVuJ3QgY29tcGxldGVkIGluaXRpYWxpemF0aW9uLCBhdHRhY2ggdGhlIGVycm9yCi0gICAgICAgICAgICAgICAgLy8gdG8gdGhlIG5vdGlmaWNhdGlvbiBpbnN0ZWFkLgotICAgICAgICAgICAgICAgIG5vdGlmeUluaXREb25lKGVycik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG5vdGlmeUVycm9yKGVycik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgQU5ldHdvcmtTZXNzaW9uOjprV2hhdERhdGFncmFtOgotICAgICAgICB7Ci0gICAgICAgICAgICBzcDxBQnVmZmVyPiBkYXRhOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kQnVmZmVyKCJkYXRhIiwgJmRhdGEpKTsKLQotICAgICAgICAgICAgaWYgKGlzUlRQKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIkh1aD8gUmVjZWl2ZWQgZGF0YSBvbiBSVFAgY29ubmVjdGlvbi4uLiIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvblJUQ1BEYXRhKGRhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIEFOZXR3b3JrU2Vzc2lvbjo6a1doYXRDb25uZWN0ZWQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklEOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInNlc3Npb25JRCIsICZzZXNzaW9uSUQpKTsKLQotICAgICAgICAgICAgaWYgIChpc1JUUCkgewotICAgICAgICAgICAgICAgIENIRUNLX0VRKG1SVFBNb2RlLCBUUkFOU1BPUlRfVENQKTsKLSAgICAgICAgICAgICAgICBDSEVDS19FUShzZXNzaW9uSUQsIG1SVFBTZXNzaW9uSUQpOwotICAgICAgICAgICAgICAgIG1SVFBDb25uZWN0ZWQgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBDSEVDS19FUShtUlRDUE1vZGUsIFRSQU5TUE9SVF9UQ1ApOwotICAgICAgICAgICAgICAgIENIRUNLX0VRKHNlc3Npb25JRCwgbVJUQ1BTZXNzaW9uSUQpOwotICAgICAgICAgICAgICAgIG1SVENQQ29ubmVjdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1SVFBDb25uZWN0ZWQKLSAgICAgICAgICAgICAgICAgICAgJiYgKG1SVENQTW9kZSA9PSBUUkFOU1BPUlRfTk9ORSB8fCBtUlRDUENvbm5lY3RlZCkpIHsKLSAgICAgICAgICAgICAgICBub3RpZnlJbml0RG9uZShPSyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgQU5ldHdvcmtTZXNzaW9uOjprV2hhdE5ldHdvcmtTdGFsbDoKLSAgICAgICAgewotICAgICAgICAgICAgc2l6ZV90IG51bUJ5dGVzUXVldWVkOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU2l6ZSgibnVtQnl0ZXNRdWV1ZWQiLCAmbnVtQnl0ZXNRdWV1ZWQpKTsKLQotICAgICAgICAgICAgbm90aWZ5TmV0d29ya1N0YWxsKG51bUJ5dGVzUXVldWVkKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFRSRVNQQVNTKCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBSVFBTZW5kZXI6Om9uUlRDUERhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgewotICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKTsKLSAgICBzaXplX3Qgc2l6ZSA9IGJ1ZmZlci0+c2l6ZSgpOwotCi0gICAgd2hpbGUgKHNpemUgPiAwKSB7Ci0gICAgICAgIGlmIChzaXplIDwgOCkgewotICAgICAgICAgICAgLy8gVG9vIHNob3J0IHRvIGJlIGEgdmFsaWQgUlRDUCBoZWFkZXIKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKGRhdGFbMF0gPj4gNikgIT0gMikgewotICAgICAgICAgICAgLy8gVW5zdXBwb3J0ZWQgdmVyc2lvbi4KLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkYXRhWzBdICYgMHgyMCkgewotICAgICAgICAgICAgLy8gUGFkZGluZyBwcmVzZW50LgotCi0gICAgICAgICAgICBzaXplX3QgcGFkZGluZ0xlbmd0aCA9IGRhdGFbc2l6ZSAtIDFdOwotCi0gICAgICAgICAgICBpZiAocGFkZGluZ0xlbmd0aCArIDEyID4gc2l6ZSkgewotICAgICAgICAgICAgICAgIC8vIElmIHdlIHJlbW92ZWQgdGhpcyBtdWNoIHBhZGRpbmcgd2UnZCBlbmQgdXAgd2l0aCBzb21ldGhpbmcKLSAgICAgICAgICAgICAgICAvLyB0aGF0J3MgdG9vIHNob3J0IHRvIGJlIGEgdmFsaWQgUlRQIGhlYWRlci4KLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzaXplIC09IHBhZGRpbmdMZW5ndGg7Ci0gICAgICAgIH0KLQotICAgICAgICBzaXplX3QgaGVhZGVyTGVuZ3RoID0gNCAqIChkYXRhWzJdIDw8IDggfCBkYXRhWzNdKSArIDQ7Ci0KLSAgICAgICAgaWYgKHNpemUgPCBoZWFkZXJMZW5ndGgpIHsKLSAgICAgICAgICAgIC8vIE9ubHkgcmVjZWl2ZWQgYSBwYXJ0aWFsIHBhY2tldD8KLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBzd2l0Y2ggKGRhdGFbMV0pIHsKLSAgICAgICAgICAgIGNhc2UgMjAwOgotICAgICAgICAgICAgY2FzZSAyMDE6ICAvLyBSUgotICAgICAgICAgICAgICAgIHBhcnNlUmVjZWl2ZXJSZXBvcnQoZGF0YSwgaGVhZGVyTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAyMDI6ICAvLyBTREVTCi0gICAgICAgICAgICBjYXNlIDIwMzoKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAyMDQ6ICAvLyBBUFAKLSAgICAgICAgICAgICAgICBwYXJzZUFQUChkYXRhLCBoZWFkZXJMZW5ndGgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDIwNTogIC8vIFRTRkIgKHRyYW5zcG9ydCBsYXllciBzcGVjaWZpYyBmZWVkYmFjaykKLSAgICAgICAgICAgICAgICBwYXJzZVRTRkIoZGF0YSwgaGVhZGVyTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAyMDY6ICAvLyBQU0ZCIChwYXlsb2FkIHNwZWNpZmljIGZlZWRiYWNrKQotICAgICAgICAgICAgICAgIC8vIGhleGR1bXAoZGF0YSwgaGVhZGVyTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiVW5rbm93biBSVENQIHBhY2tldCB0eXBlICV1IG9mIHNpemUgJXp1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClkYXRhWzFdLCBoZWFkZXJMZW5ndGgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZGF0YSArPSBoZWFkZXJMZW5ndGg7Ci0gICAgICAgIHNpemUgLT0gaGVhZGVyTGVuZ3RoOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgUlRQU2VuZGVyOjpwYXJzZVJlY2VpdmVyUmVwb3J0KAotICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3QgLyogc2l6ZSAqLykgewotICAgIGZsb2F0IGZyYWN0aW9uTG9zdCA9IGRhdGFbMTJdIC8gMjU2LjBmOwotCi0gICAgQUxPR0koImxvc3QgJS4yZiAlJSBvZiBwYWNrZXRzIGR1cmluZyByZXBvcnQgaW50ZXJ2YWwuIiwKLSAgICAgICAgICAxMDAuMGYgKiBmcmFjdGlvbkxvc3QpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBSVFBTZW5kZXI6OnBhcnNlVFNGQihjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIGlmICgoZGF0YVswXSAmIDB4MWYpICE9IDEpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOyAgLy8gV2Ugb25seSBzdXBwb3J0IE5BQ0sgZm9yIG5vdy4KLSAgICB9Ci0KLSAgICB1aW50MzJfdCBzcmNJZCA9IFUzMl9BVCgmZGF0YVs4XSk7Ci0gICAgaWYgKHNyY0lkICE9IGtTb3VyY2VJRCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAxMjsgaSA8IHNpemU7IGkgKz0gNCkgewotICAgICAgICB1aW50MTZfdCBzZXFObyA9IFUxNl9BVCgmZGF0YVtpXSk7Ci0gICAgICAgIHVpbnQxNl90IGJscCA9IFUxNl9BVCgmZGF0YVtpICsgMl0pOwotCi0gICAgICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQgPSBtSGlzdG9yeS5iZWdpbigpOwotICAgICAgICBib29sIGZvdW5kU2VxTm8gPSBmYWxzZTsKLSAgICAgICAgd2hpbGUgKGl0ICE9IG1IaXN0b3J5LmVuZCgpKSB7Ci0gICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyID0gKml0OwotCi0gICAgICAgICAgICB1aW50MTZfdCBidWZmZXJTZXFObyA9IGJ1ZmZlci0+aW50MzJEYXRhKCkgJiAweGZmZmY7Ci0KLSAgICAgICAgICAgIGJvb2wgcmV0cmFuc21pdCA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKGJ1ZmZlclNlcU5vID09IHNlcU5vKSB7Ci0gICAgICAgICAgICAgICAgcmV0cmFuc21pdCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGJscCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAxNjsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoYmxwICYgKDEgPDwgaSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoYnVmZmVyU2VxTm8gPT0gKChzZXFObyArIGkgKyAxKSAmIDB4ZmZmZikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBibHAgJj0gfigxIDw8IGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0cmFuc21pdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyZXRyYW5zbWl0KSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInJldHJhbnNtaXR0aW5nIHNlcU5vICVkIiwgYnVmZmVyU2VxTm8pOwotCi0gICAgICAgICAgICAgICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRSVFBQYWNrZXQoYnVmZmVyLCBmYWxzZSAvKiBzdG9yZUluSGlzdG9yeSAqLykpOwotCi0gICAgICAgICAgICAgICAgaWYgKGJ1ZmZlclNlcU5vID09IHNlcU5vKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvdW5kU2VxTm8gPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChmb3VuZFNlcU5vICYmIGJscCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgKytpdDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghZm91bmRTZXFObyB8fCBibHAgIT0gMCkgewotICAgICAgICAgICAgQUxPR0koIlNvbWUgc2VxdWVuY2UgbnVtYmVycyB3ZXJlIG5vIGxvbmdlciBhdmFpbGFibGUgZm9yICIKLSAgICAgICAgICAgICAgICAgICJyZXRyYW5zbWlzc2lvbiAoc2VxTm8gPSAlZCwgZm91bmRTZXFObyA9ICVkLCBibHAgPSAweCUwNHgpIiwKLSAgICAgICAgICAgICAgICAgIHNlcU5vLCBmb3VuZFNlcU5vLCBibHApOwotCi0gICAgICAgICAgICBpZiAoIW1IaXN0b3J5LmVtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBpbnQzMl90IGVhcmxpZXN0ID0gKCptSGlzdG9yeS5iZWdpbigpKS0+aW50MzJEYXRhKCkgJiAweGZmZmY7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCBsYXRlc3QgPSAoKi0tbUhpc3RvcnkuZW5kKCkpLT5pbnQzMkRhdGEoKSAmIDB4ZmZmZjsKLQotICAgICAgICAgICAgICAgIEFMT0dJKCJoYXZlIHNlcSBudW1iZXJzIGZyb20gJWQgLSAlZCIsIGVhcmxpZXN0LCBsYXRlc3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBSVFBTZW5kZXI6OnBhcnNlQVBQKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBsYXRlX29mZnNldCA9IDg7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgbGF0ZV9zdHJpbmdbXSA9ICJsYXRlIjsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGF2Z0xhdGVuY3lVc19vZmZzZXQgPSBsYXRlX29mZnNldCArIHNpemVvZihsYXRlX3N0cmluZykgLSAxOwotICAgIHN0YXRpYyBjb25zdCBzaXplX3QgbWF4TGF0ZW5jeVVzX29mZnNldCA9IGF2Z0xhdGVuY3lVc19vZmZzZXQgKyBzaXplb2YoaW50NjRfdCk7Ci0KLSAgICBpZiAoKHNpemUgPj0gKG1heExhdGVuY3lVc19vZmZzZXQgKyBzaXplb2YoaW50NjRfdCkpKQotICAgICAgICAgICAgJiYgIW1lbWNtcChsYXRlX3N0cmluZywgJmRhdGFbbGF0ZV9vZmZzZXRdLCBzaXplb2YobGF0ZV9zdHJpbmcpIC0gMSkpIHsKLSAgICAgICAgaW50NjRfdCBhdmdMYXRlbmN5VXMgPSAoaW50NjRfdClVNjRfQVQoJmRhdGFbYXZnTGF0ZW5jeVVzX29mZnNldF0pOwotICAgICAgICBpbnQ2NF90IG1heExhdGVuY3lVcyA9IChpbnQ2NF90KVU2NF9BVCgmZGF0YVttYXhMYXRlbmN5VXNfb2Zmc2V0XSk7Ci0KLSAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRJbmZvcm1TZW5kZXIpOwotICAgICAgICBub3RpZnktPnNldEludDY0KCJhdmdMYXRlbmN5VXMiLCBhdmdMYXRlbmN5VXMpOwotICAgICAgICBub3RpZnktPnNldEludDY0KCJtYXhMYXRlbmN5VXMiLCBtYXhMYXRlbmN5VXMpOwotICAgICAgICBub3RpZnktPnBvc3QoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgUlRQU2VuZGVyOjpub3RpZnlJbml0RG9uZShzdGF0dXNfdCBlcnIpIHsKLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0SW5pdERvbmUpOwotICAgIG5vdGlmeS0+c2V0SW50MzIoImVyciIsIGVycik7Ci0gICAgbm90aWZ5LT5wb3N0KCk7Ci19Ci0KLXZvaWQgUlRQU2VuZGVyOjpub3RpZnlFcnJvcihzdGF0dXNfdCBlcnIpIHsKLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0RXJyb3IpOwotICAgIG5vdGlmeS0+c2V0SW50MzIoImVyciIsIGVycik7Ci0gICAgbm90aWZ5LT5wb3N0KCk7Ci19Ci0KLXZvaWQgUlRQU2VuZGVyOjpub3RpZnlOZXR3b3JrU3RhbGwoc2l6ZV90IG51bUJ5dGVzUXVldWVkKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdE5ldHdvcmtTdGFsbCk7Ci0gICAgbm90aWZ5LT5zZXRTaXplKCJudW1CeXRlc1F1ZXVlZCIsIG51bUJ5dGVzUXVldWVkKTsKLSAgICBub3RpZnktPnBvc3QoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3J0cC9SVFBTZW5kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9ydHAvUlRQU2VuZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZGZkMDEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3J0cC9SVFBTZW5kZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTMsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFJUUF9TRU5ERVJfSF8KLQotI2RlZmluZSBSVFBfU0VOREVSX0hfCi0KLSNpbmNsdWRlICJSVFBCYXNlLmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IEFCdWZmZXI7Ci1zdHJ1Y3QgQU5ldHdvcmtTZXNzaW9uOwotCi0vLyBBbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBmYWNpbGl0YXRlcyBzZW5kaW5nIG9mIG1lZGlhIGRhdGEgb3ZlciBhbiBSVFAKLS8vIGNoYW5uZWwuIFRoZSBjaGFubmVsIGlzIGVzdGFibGlzaGVkIG92ZXIgYSBVRFAgb3IgVENQIGNvbm5lY3Rpb24gZGVwZW5kaW5nCi0vLyBvbiB3aGljaCAiVHJhbnNwb3J0TW9kZSIgd2FzIGNob3Nlbi4gSW4gYWRkaXRpb24gZGlmZmVyZW50IFJUUCBwYWNrZXRpemF0aW9uCi0vLyBzY2hlbWVzIGFyZSBzdXBwb3J0ZWQgc3VjaCBhcyAiVHJhbnNwb3J0IFN0cmVhbSBQYWNrZXRzIG92ZXIgUlRQIiwKLS8vIG9yICJBVkMvSC4yNjQgZW5jYXBzdWxhdGlvbiBhcyBzcGVjaWZpZWQgaW4gUkZDIDM5ODQgKG5vbi1pbnRlcmxlYXZlZCBtb2RlKSIKLXN0cnVjdCBSVFBTZW5kZXIgOiBwdWJsaWMgUlRQQmFzZSwgcHVibGljIEFIYW5kbGVyIHsKLSAgICBlbnVtIHsKLSAgICAgICAga1doYXRJbml0RG9uZSwKLSAgICAgICAga1doYXRFcnJvciwKLSAgICAgICAga1doYXROZXR3b3JrU3RhbGwsCi0gICAgICAgIGtXaGF0SW5mb3JtU2VuZGVyLAotICAgIH07Ci0gICAgUlRQU2VuZGVyKAotICAgICAgICAgICAgY29uc3Qgc3A8QU5ldHdvcmtTZXNzaW9uPiAmbmV0U2Vzc2lvbiwKLSAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5KTsKLQotICAgIHN0YXR1c190IGluaXRBc3luYygKLSAgICAgICAgICAgICAgY29uc3QgY2hhciAqcmVtb3RlSG9zdCwKLSAgICAgICAgICAgICAgaW50MzJfdCByZW1vdGVSVFBQb3J0LAotICAgICAgICAgICAgICBUcmFuc3BvcnRNb2RlIHJ0cE1vZGUsCi0gICAgICAgICAgICAgIGludDMyX3QgcmVtb3RlUlRDUFBvcnQsCi0gICAgICAgICAgICAgIFRyYW5zcG9ydE1vZGUgcnRjcE1vZGUsCi0gICAgICAgICAgICAgIGludDMyX3QgKm91dExvY2FsUlRQUG9ydCk7Ci0KLSAgICBzdGF0dXNfdCBxdWV1ZUJ1ZmZlcigKLSAgICAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIsCi0gICAgICAgICAgICB1aW50OF90IHBhY2tldFR5cGUsCi0gICAgICAgICAgICBQYWNrZXRpemF0aW9uTW9kZSBtb2RlKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgflJUUFNlbmRlcigpOwotICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7Ci0KLXByaXZhdGU6Ci0gICAgZW51bSB7Ci0gICAgICAgIGtXaGF0UlRQTm90aWZ5LAotICAgICAgICBrV2hhdFJUQ1BOb3RpZnksCi0gICAgfTsKLQotICAgIGNvbnN0IHVuc2lnbmVkIGludCBrTWF4TnVtVFNQYWNrZXRzUGVyUlRQUGFja2V0ID0gKGtNYXhVRFBQYWNrZXRTaXplIC0gMTIpIC8gMTg4OwotICAgIGNvbnN0IHVuc2lnbmVkIGludCBrTWF4SGlzdG9yeVNpemUgICAgICAgICAgICAgID0gMTAyNDsKLSAgICBjb25zdCB1bnNpZ25lZCBpbnQga1NvdXJjZUlEICAgICAgICAgICAgICAgICAgICA9IDB4ZGVhZGJlZWY7Ci0KLSAgICBzcDxBTmV0d29ya1Nlc3Npb24+IG1OZXRTZXNzaW9uOwotICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5OwotICAgIFRyYW5zcG9ydE1vZGUgbVJUUE1vZGU7Ci0gICAgVHJhbnNwb3J0TW9kZSBtUlRDUE1vZGU7Ci0gICAgaW50MzJfdCBtUlRQU2Vzc2lvbklEOwotICAgIGludDMyX3QgbVJUQ1BTZXNzaW9uSUQ7Ci0gICAgYm9vbCBtUlRQQ29ubmVjdGVkOwotICAgIGJvb2wgbVJUQ1BDb25uZWN0ZWQ7Ci0KLSAgICB1aW50NjRfdCBtTGFzdE5UUFRpbWU7Ci0gICAgdWludDMyX3QgbUxhc3RSVFBUaW1lOwotICAgIHVpbnQzMl90IG1OdW1SVFBTZW50OwotICAgIHVpbnQzMl90IG1OdW1SVFBPY3RldHNTZW50OwotICAgIHVpbnQzMl90IG1OdW1TUnNTZW50OwotCi0gICAgdWludDMyX3QgbVJUUFNlcU5vOwotCi0gICAgTGlzdDxzcDxBQnVmZmVyPiA+IG1IaXN0b3J5OwotICAgIHNpemVfdCBtSGlzdG9yeVNpemU7Ci0KLSAgICBzdGF0aWMgdWludDY0X3QgR2V0Tm93TlRQKCk7Ci0KLSAgICBzdGF0dXNfdCBxdWV1ZVJhd1BhY2tldChjb25zdCBzcDxBQnVmZmVyPiAmdHNQYWNrZXRzLCB1aW50OF90IHBhY2tldFR5cGUpOwotICAgIHN0YXR1c190IHF1ZXVlVFNQYWNrZXRzKGNvbnN0IHNwPEFCdWZmZXI+ICZ0c1BhY2tldHMsIHVpbnQ4X3QgcGFja2V0VHlwZSk7Ci0gICAgc3RhdHVzX3QgcXVldWVBVkNCdWZmZXIoY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQsIHVpbnQ4X3QgcGFja2V0VHlwZSk7Ci0KLSAgICBzdGF0dXNfdCBzZW5kUlRQUGFja2V0KAotICAgICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJnBhY2tldCwgYm9vbCBzdG9yZUluSGlzdG9yeSwKLSAgICAgICAgICAgIGJvb2wgdGltZVZhbGlkID0gZmFsc2UsIGludDY0X3QgdGltZVVzID0gLTFsbCk7Ci0KLSAgICB2b2lkIG9uTmV0Tm90aWZ5KGJvb2wgaXNSVFAsIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKLQotICAgIHN0YXR1c190IG9uUlRDUERhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmRhdGEpOwotICAgIHN0YXR1c190IHBhcnNlUmVjZWl2ZXJSZXBvcnQoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOwotICAgIHN0YXR1c190IHBhcnNlVFNGQihjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0gICAgc3RhdHVzX3QgcGFyc2VBUFAoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOwotCi0gICAgdm9pZCBub3RpZnlJbml0RG9uZShzdGF0dXNfdCBlcnIpOwotICAgIHZvaWQgbm90aWZ5RXJyb3Ioc3RhdHVzX3QgZXJyKTsKLSAgICB2b2lkIG5vdGlmeU5ldHdvcmtTdGFsbChzaXplX3QgbnVtQnl0ZXNRdWV1ZWQpOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUlRQU2VuZGVyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gUlRQX1NFTkRFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9Db252ZXJ0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9Db252ZXJ0ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzNhZjE4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvQ29udmVydGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDgyMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIkNvbnZlcnRlciIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnRlci5oIgotCi0jaW5jbHVkZSAiTWVkaWFQdWxsZXIuaCIKLSNpbmNsdWRlICJpbmNsdWRlL2F2Y191dGlscy5oIgotCi0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLSNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgotI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLQotI2luY2x1ZGUgPGFycGEvaW5ldC5oPgotCi0jaW5jbHVkZSA8T01YX1ZpZGVvLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotQ29udmVydGVyOjpDb252ZXJ0ZXIoCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAotICAgICAgICBjb25zdCBzcDxBTG9vcGVyPiAmY29kZWNMb29wZXIsCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmb3V0cHV0Rm9ybWF0LAotICAgICAgICB1aW50MzJfdCBmbGFncykKLSAgICA6IG1Ob3RpZnkobm90aWZ5KSwKLSAgICAgIG1Db2RlY0xvb3Blcihjb2RlY0xvb3BlciksCi0gICAgICBtT3V0cHV0Rm9ybWF0KG91dHB1dEZvcm1hdCksCi0gICAgICBtRmxhZ3MoZmxhZ3MpLAotICAgICAgbUlzVmlkZW8oZmFsc2UpLAotICAgICAgbUlzSDI2NChmYWxzZSksCi0gICAgICBtSXNQQ01BdWRpbyhmYWxzZSksCi0gICAgICBtTmVlZFRvTWFudWFsbHlQcmVwZW5kU1BTUFBTKGZhbHNlKSwKLSAgICAgIG1Eb01vcmVXb3JrUGVuZGluZyhmYWxzZSkKLSNpZiBFTkFCTEVfU0lMRU5DRV9ERVRFQ1RJT04KLSAgICAgICxtRmlyc3RTaWxlbnRGcmFtZVVzKC0xbGwpCi0gICAgICAsbUluU2lsZW50TW9kZShmYWxzZSkKLSNlbmRpZgotICAgICAgLG1QcmV2VmlkZW9CaXRyYXRlKC0xKQotICAgICAgLG1OdW1GcmFtZXNUb0Ryb3AoMCkKLSAgICAgICxtRW5jb2RpbmdTdXNwZW5kZWQoZmFsc2UpCi0gICAgewotICAgIEFTdHJpbmcgbWltZTsKLSAgICBDSEVDSyhtT3V0cHV0Rm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKLQotICAgIGlmICghc3RybmNhc2VjbXAoInZpZGVvLyIsIG1pbWUuY19zdHIoKSwgNikpIHsKLSAgICAgICAgbUlzVmlkZW8gPSB0cnVlOwotCi0gICAgICAgIG1Jc0gyNjQgPSAhc3RyY2FzZWNtcChtaW1lLmNfc3RyKCksIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7Ci0gICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19SQVcsIG1pbWUuY19zdHIoKSkpIHsKLSAgICAgICAgbUlzUENNQXVkaW8gPSB0cnVlOwotICAgIH0KLX0KLQotdm9pZCBDb252ZXJ0ZXI6OnJlbGVhc2VFbmNvZGVyKCkgewotICAgIGlmIChtRW5jb2RlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtRW5jb2Rlci0+cmVsZWFzZSgpOwotICAgIG1FbmNvZGVyLmNsZWFyKCk7Ci0KLSAgICBtSW5wdXRCdWZmZXJRdWV1ZS5jbGVhcigpOwotICAgIG1FbmNvZGVySW5wdXRCdWZmZXJzLmNsZWFyKCk7Ci0gICAgbUVuY29kZXJPdXRwdXRCdWZmZXJzLmNsZWFyKCk7Ci19Ci0KLUNvbnZlcnRlcjo6fkNvbnZlcnRlcigpIHsKLSAgICBDSEVDSyhtRW5jb2RlciA9PSBOVUxMKTsKLX0KLQotdm9pZCBDb252ZXJ0ZXI6OnNodXRkb3duQXN5bmMoKSB7Ci0gICAgQUxPR1YoInNodXRkb3duIik7Ci0gICAgKG5ldyBBTWVzc2FnZShrV2hhdFNodXRkb3duLCB0aGlzKSktPnBvc3QoKTsKLX0KLQotc3RhdHVzX3QgQ29udmVydGVyOjppbml0KCkgewotICAgIHN0YXR1c190IGVyciA9IGluaXRFbmNvZGVyKCk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJlbGVhc2VFbmNvZGVyKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gQ29udmVydGVyOjpnZXRHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSB7Ci0gICAgQ0hFQ0sobUZsYWdzICYgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCk7Ci0gICAgcmV0dXJuIG1HcmFwaGljQnVmZmVyUHJvZHVjZXI7Ci19Ci0KLXNpemVfdCBDb252ZXJ0ZXI6OmdldElucHV0QnVmZmVyQ291bnQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1FbmNvZGVySW5wdXRCdWZmZXJzLnNpemUoKTsKLX0KLQotc3A8QU1lc3NhZ2U+IENvbnZlcnRlcjo6Z2V0T3V0cHV0Rm9ybWF0KCkgY29uc3QgewotICAgIHJldHVybiBtT3V0cHV0Rm9ybWF0OwotfQotCi1ib29sIENvbnZlcnRlcjo6bmVlZFRvTWFudWFsbHlQcmVwZW5kU1BTUFBTKCkgY29uc3QgewotICAgIHJldHVybiBtTmVlZFRvTWFudWFsbHlQcmVwZW5kU1BTUFBTOwotfQotCi0vLyBzdGF0aWMKLWludDMyX3QgQ29udmVydGVyOjpHZXRJbnQzMlByb3BlcnR5KAotICAgICAgICBjb25zdCBjaGFyICpwcm9wTmFtZSwgaW50MzJfdCBkZWZhdWx0VmFsdWUpIHsKLSAgICBjaGFyIHZhbFtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIGlmIChwcm9wZXJ0eV9nZXQocHJvcE5hbWUsIHZhbCwgTlVMTCkpIHsKLSAgICAgICAgY2hhciAqZW5kOwotICAgICAgICB1bnNpZ25lZCBsb25nIHggPSBzdHJ0b3VsKHZhbCwgJmVuZCwgMTApOwotCi0gICAgICAgIGlmICgqZW5kID09ICdcMCcgJiYgZW5kID4gdmFsICYmIHggPiAwKSB7Ci0gICAgICAgICAgICByZXR1cm4geDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBkZWZhdWx0VmFsdWU7Ci19Ci0KLXN0YXR1c190IENvbnZlcnRlcjo6aW5pdEVuY29kZXIoKSB7Ci0gICAgQVN0cmluZyBvdXRwdXRNSU1FOwotICAgIENIRUNLKG1PdXRwdXRGb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmb3V0cHV0TUlNRSkpOwotCi0gICAgYm9vbCBpc0F1ZGlvID0gIXN0cm5jYXNlY21wKG91dHB1dE1JTUUuY19zdHIoKSwgImF1ZGlvLyIsIDYpOwotCi0gICAgaWYgKCFtSXNQQ01BdWRpbykgewotICAgICAgICBtRW5jb2RlciA9IE1lZGlhQ29kZWM6OkNyZWF0ZUJ5VHlwZSgKLSAgICAgICAgICAgICAgICBtQ29kZWNMb29wZXIsIG91dHB1dE1JTUUuY19zdHIoKSwgdHJ1ZSAvKiBlbmNvZGVyICovKTsKLQotICAgICAgICBpZiAobUVuY29kZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG1Jc1BDTUF1ZGlvKSB7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBpbnQzMl90IGF1ZGlvQml0cmF0ZSA9IEdldEludDMyUHJvcGVydHkoIm1lZGlhLndmZC5hdWRpby1iaXRyYXRlIiwgMTI4MDAwKTsKLSAgICBpbnQzMl90IHZpZGVvQml0cmF0ZSA9IEdldEludDMyUHJvcGVydHkoIm1lZGlhLndmZC52aWRlby1iaXRyYXRlIiwgNTAwMDAwMCk7Ci0gICAgbVByZXZWaWRlb0JpdHJhdGUgPSB2aWRlb0JpdHJhdGU7Ci0KLSAgICBBTE9HSSgidXNpbmcgYXVkaW8gYml0cmF0ZSBvZiAlZCBicHMsIHZpZGVvIGJpdHJhdGUgb2YgJWQgYnBzIiwKLSAgICAgICAgICBhdWRpb0JpdHJhdGUsIHZpZGVvQml0cmF0ZSk7Ci0KLSAgICBpZiAoaXNBdWRpbykgewotICAgICAgICBtT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMigiYml0cmF0ZSIsIGF1ZGlvQml0cmF0ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbU91dHB1dEZvcm1hdC0+c2V0SW50MzIoImJpdHJhdGUiLCB2aWRlb0JpdHJhdGUpOwotICAgICAgICBtT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMigiYml0cmF0ZS1tb2RlIiwgT01YX1ZpZGVvX0NvbnRyb2xSYXRlQ29uc3RhbnQpOwotICAgICAgICBtT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMigiZnJhbWUtcmF0ZSIsIDMwKTsKLSAgICAgICAgbU91dHB1dEZvcm1hdC0+c2V0SW50MzIoImktZnJhbWUtaW50ZXJ2YWwiLCAxNSk7ICAvLyBJZnJhbWVzIGV2ZXJ5IDE1IHNlY3MKLQotICAgICAgICAvLyBDb25maWd1cmUgZW5jb2RlciB0byB1c2UgaW50cmEgbWFjcm9ibG9jayByZWZyZXNoIG1vZGUKLSAgICAgICAgbU91dHB1dEZvcm1hdC0+c2V0SW50MzIoImludHJhLXJlZnJlc2gtbW9kZSIsIE9NWF9WSURFT19JbnRyYVJlZnJlc2hDeWNsaWMpOwotCi0gICAgICAgIGludCB3aWR0aCwgaGVpZ2h0LCBtYnM7Ci0gICAgICAgIGlmICghbU91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkKLSAgICAgICAgICAgICAgICB8fCAhbU91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVXBkYXRlIG1hY3JvYmxvY2tzIGluIGEgY3ljbGljIGZhc2hpb24gd2l0aCAxMCUgb2YgYWxsIE1CcyB3aXRoaW4KLSAgICAgICAgLy8gZnJhbWUgZ2V0cyB1cGRhdGVkIGF0IG9uZSB0aW1lLiBJdCB0YWtlcyBhYm91dCAxMCBmcmFtZXMgdG8KLSAgICAgICAgLy8gY29tcGxldGVseSB1cGRhdGUgYSB3aG9sZSB2aWRlbyBmcmFtZS4gSWYgdGhlIGZyYW1lIHJhdGUgaXMgMzAsCi0gICAgICAgIC8vIGl0IHRha2VzIGFib3V0IDMzMyBtcyBpbiB0aGUgYmVzdCBjYXNlIChpZiBuZXh0IGZyYW1lIGlzIG5vdCBhbiBJRFIpCi0gICAgICAgIC8vIHRvIHJlY292ZXIgZnJvbSBhIGxvc3QvY29ycnVwdGVkIHBhY2tldC4KLSAgICAgICAgbWJzID0gKCgod2lkdGggKyAxNSkgLyAxNikgKiAoKGhlaWdodCArIDE1KSAvIDE2KSAqIDEwKSAvIDEwMDsKLSAgICAgICAgbU91dHB1dEZvcm1hdC0+c2V0SW50MzIoImludHJhLXJlZnJlc2gtQ0lSLW1icyIsIG1icyk7Ci0gICAgfQotCi0gICAgQUxPR1YoIm91dHB1dCBmb3JtYXQgaXMgJyVzJyIsIG1PdXRwdXRGb3JtYXQtPmRlYnVnU3RyaW5nKDApLmNfc3RyKCkpOwotCi0gICAgbU5lZWRUb01hbnVhbGx5UHJlcGVuZFNQU1BQUyA9IGZhbHNlOwotCi0gICAgc3RhdHVzX3QgZXJyID0gTk9fSU5JVDsKLQotICAgIGlmICghaXNBdWRpbykgewotICAgICAgICBzcDxBTWVzc2FnZT4gdG1wID0gbU91dHB1dEZvcm1hdC0+ZHVwKCk7Ci0gICAgICAgIHRtcC0+c2V0SW50MzIoInByZXBlbmQtc3BzLXBwcy10by1pZHItZnJhbWVzIiwgMSk7Ci0KLSAgICAgICAgZXJyID0gbUVuY29kZXItPmNvbmZpZ3VyZSgKLSAgICAgICAgICAgICAgICB0bXAsCi0gICAgICAgICAgICAgICAgTlVMTCAvKiBuYXRpdmVXaW5kb3cgKi8sCi0gICAgICAgICAgICAgICAgTlVMTCAvKiBjcnlwdG8gKi8sCi0gICAgICAgICAgICAgICAgTWVkaWFDb2RlYzo6Q09ORklHVVJFX0ZMQUdfRU5DT0RFKTsKLQotICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAvLyBFbmNvZGVyIHN1cHBvcnRlZCBwcmVwZW5kaW5nIFNQUy9QUFMsIHdlIGRvbid0IG5lZWQgdG8gZW11bGF0ZQotICAgICAgICAgICAgLy8gaXQuCi0gICAgICAgICAgICBtT3V0cHV0Rm9ybWF0ID0gdG1wOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbU5lZWRUb01hbnVhbGx5UHJlcGVuZFNQU1BQUyA9IHRydWU7Ci0KLSAgICAgICAgICAgIEFMT0dJKCJXZSBnb2luZyB0byBtYW51YWxseSBwcmVwZW5kIFNQUyBhbmQgUFBTIHRvIElEUiBmcmFtZXMuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIC8vIFdlJ2xsIGdldCBoZXJlIGZvciBhdWRpbyBvciBpZiB3ZSBmYWlsZWQgdG8gY29uZmlndXJlIHRoZSBlbmNvZGVyCi0gICAgICAgIC8vIHRvIGF1dG9tYXRpY2FsbHkgcHJlcGVuZCBTUFMvUFBTIGluIHRoZSBjYXNlIG9mIHZpZGVvLgotCi0gICAgICAgIGVyciA9IG1FbmNvZGVyLT5jb25maWd1cmUoCi0gICAgICAgICAgICAgICAgICAgIG1PdXRwdXRGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgIE5VTEwgLyogbmF0aXZlV2luZG93ICovLAotICAgICAgICAgICAgICAgICAgICBOVUxMIC8qIGNyeXB0byAqLywKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFDb2RlYzo6Q09ORklHVVJFX0ZMQUdfRU5DT0RFKTsKLSAgICB9Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYgKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpIHsKLSAgICAgICAgQ0hFQ0sobUlzVmlkZW8pOwotCi0gICAgICAgIGVyciA9IG1FbmNvZGVyLT5jcmVhdGVJbnB1dFN1cmZhY2UoJm1HcmFwaGljQnVmZmVyUHJvZHVjZXIpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBlcnIgPSBtRW5jb2Rlci0+c3RhcnQoKTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlcnIgPSBtRW5jb2Rlci0+Z2V0SW5wdXRCdWZmZXJzKCZtRW5jb2RlcklucHV0QnVmZmVycyk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0gbUVuY29kZXItPmdldE91dHB1dEJ1ZmZlcnMoJm1FbmNvZGVyT3V0cHV0QnVmZmVycyk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYgKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpIHsKLSAgICAgICAgc2NoZWR1bGVEb01vcmVXb3JrKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIENvbnZlcnRlcjo6bm90aWZ5RXJyb3Ioc3RhdHVzX3QgZXJyKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEVycm9yKTsKLSAgICBub3RpZnktPnNldEludDMyKCJlcnIiLCBlcnIpOwotICAgIG5vdGlmeS0+cG9zdCgpOwotfQotCi0vLyBzdGF0aWMKLWJvb2wgQ29udmVydGVyOjpJc1NpbGVuY2UoY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpIHsKLSAgICBjb25zdCB1aW50OF90ICpwdHIgPSBhY2Nlc3NVbml0LT5kYXRhKCk7Ci0gICAgY29uc3QgdWludDhfdCAqZW5kID0gcHRyICsgYWNjZXNzVW5pdC0+c2l6ZSgpOwotICAgIHdoaWxlIChwdHIgPCBlbmQpIHsKLSAgICAgICAgaWYgKCpwdHIgIT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgICsrcHRyOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIENvbnZlcnRlcjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7Ci0gICAgICAgIGNhc2Uga1doYXRNZWRpYVB1bGxlck5vdGlmeToKLSAgICAgICAgewotICAgICAgICAgICAgaW50MzJfdCB3aGF0OwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoIndoYXQiLCAmd2hhdCkpOwotCi0gICAgICAgICAgICBpZiAoIW1Jc1BDTUF1ZGlvICYmIG1FbmNvZGVyID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiZ290IG1zZyAnJXMnIGFmdGVyIGVuY29kZXIgc2h1dGRvd24uIiwKLSAgICAgICAgICAgICAgICAgICAgICBtc2ctPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAod2hhdCA9PSBNZWRpYVB1bGxlcjo6a1doYXRBY2Nlc3NVbml0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQ7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEJ1ZmZlcigiYWNjZXNzVW5pdCIsICZhY2Nlc3NVbml0KSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgYWNjZXNzVW5pdC0+c2V0TWVkaWFCdWZmZXJCYXNlKE5VTEwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHdoYXQgPT0gTWVkaWFQdWxsZXI6OmtXaGF0RU9TKSB7Ci0gICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyUXVldWUucHVzaF9iYWNrKE5VTEwpOwotCi0gICAgICAgICAgICAgICAgZmVlZEVuY29kZXJJbnB1dEJ1ZmZlcnMoKTsKLQotICAgICAgICAgICAgICAgIHNjaGVkdWxlRG9Nb3JlV29yaygpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBDSEVDS19FUSh3aGF0LCBNZWRpYVB1bGxlcjo6a1doYXRBY2Nlc3NVbml0KTsKLQotICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQ7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kQnVmZmVyKCJhY2Nlc3NVbml0IiwgJmFjY2Vzc1VuaXQpKTsKLQotICAgICAgICAgICAgICAgIGlmIChtTnVtRnJhbWVzVG9Ecm9wID4gMCB8fCBtRW5jb2RpbmdTdXNwZW5kZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1OdW1GcmFtZXNUb0Ryb3AgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAtLW1OdW1GcmFtZXNUb0Ryb3A7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HSSgiZHJvcHBpbmcgZnJhbWUuIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBhY2Nlc3NVbml0LT5zZXRNZWRpYUJ1ZmZlckJhc2UoTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotI2lmIDAKLSAgICAgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqbWJ1ZiA9Ci0gICAgICAgICAgICAgICAgICAgIChNZWRpYUJ1ZmZlciAqKShhY2Nlc3NVbml0LT5nZXRNZWRpYUJ1ZmZlckJhc2UoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1idWYgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HSSgicXVldWVpbmcgbWJ1ZiAlcCIsIG1idWYpOwotICAgICAgICAgICAgICAgICAgICBtYnVmLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgfQotI2VuZGlmCi0KLSNpZiBFTkFCTEVfU0lMRU5DRV9ERVRFQ1RJT04KLSAgICAgICAgICAgICAgICBpZiAoIW1Jc1ZpZGVvKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChJc1NpbGVuY2UoYWNjZXNzVW5pdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtSW5TaWxlbnRNb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUZpcnN0U2lsZW50RnJhbWVVcyA8IDBsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GaXJzdFNpbGVudEZyYW1lVXMgPSBub3dVczsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobm93VXMgPj0gbUZpcnN0U2lsZW50RnJhbWVVcyArIDEwMDAwMDAwbGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5TaWxlbnRNb2RlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HSSgiYXVkaW8gaW4gc2lsZW50IG1vZGUgbm93LiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1JblNpbGVudE1vZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HSSgiYXVkaW8gbm8gbG9uZ2VyIGluIHNpbGVudCBtb2RlLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbUluU2lsZW50TW9kZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgbUZpcnN0U2lsZW50RnJhbWVVcyA9IC0xbGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0jZW5kaWYKLQotICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlclF1ZXVlLnB1c2hfYmFjayhhY2Nlc3NVbml0KTsKLQotICAgICAgICAgICAgICAgIGZlZWRFbmNvZGVySW5wdXRCdWZmZXJzKCk7Ci0KLSAgICAgICAgICAgICAgICBzY2hlZHVsZURvTW9yZVdvcmsoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdEVuY29kZXJBY3Rpdml0eToKLSAgICAgICAgewotI2lmIDAKLSAgICAgICAgICAgIGludDY0X3Qgd2hlblVzOwotICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDY0KCJ3aGVuVXMiLCAmd2hlblVzKSkgewotICAgICAgICAgICAgICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwotICAgICAgICAgICAgICAgIEFMT0dJKCJbJXNdIGtXaGF0RW5jb2RlckFjdGl2aXR5IGFmdGVyICVsbGQgdXMiLAotICAgICAgICAgICAgICAgICAgICAgIG1Jc1ZpZGVvID8gInZpZGVvIiA6ICJhdWRpbyIsIG5vd1VzIC0gd2hlblVzKTsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotCi0gICAgICAgICAgICBtRG9Nb3JlV29ya1BlbmRpbmcgPSBmYWxzZTsKLQotICAgICAgICAgICAgaWYgKG1FbmNvZGVyID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gZG9Nb3JlV29yaygpOwotCi0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgbm90aWZ5RXJyb3IoZXJyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2NoZWR1bGVEb01vcmVXb3JrKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRSZXF1ZXN0SURSRnJhbWU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChtRW5jb2RlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtSXNWaWRlbykgewotICAgICAgICAgICAgICAgIEFMT0dWKCJyZXF1ZXN0aW5nIElEUiBmcmFtZSIpOwotICAgICAgICAgICAgICAgIG1FbmNvZGVyLT5yZXF1ZXN0SURSRnJhbWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdFNodXRkb3duOgotICAgICAgICB7Ci0gICAgICAgICAgICBBTE9HSSgic2h1dHRpbmcgZG93biAlcyBlbmNvZGVyIiwgbUlzVmlkZW8gPyAidmlkZW8iIDogImF1ZGlvIik7Ci0KLSAgICAgICAgICAgIHJlbGVhc2VFbmNvZGVyKCk7Ci0KLSAgICAgICAgICAgIEFTdHJpbmcgbWltZTsKLSAgICAgICAgICAgIENIRUNLKG1PdXRwdXRGb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOwotICAgICAgICAgICAgQUxPR0koImVuY29kZXIgKCVzKSBzaHV0IGRvd24uIiwgbWltZS5jX3N0cigpKTsKLQotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0U2h1dGRvd25Db21wbGV0ZWQpOwotICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXREcm9wQUZyYW1lOgotICAgICAgICB7Ci0gICAgICAgICAgICArK21OdW1GcmFtZXNUb0Ryb3A7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRSZWxlYXNlT3V0cHV0QnVmZmVyOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobUVuY29kZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJJbmRleDsKLSAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYnVmZmVySW5kZXgiLCAoaW50MzJfdCopJmJ1ZmZlckluZGV4KSk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0soYnVmZmVySW5kZXggPCBtRW5jb2Rlck91dHB1dEJ1ZmZlcnMuc2l6ZSgpKTsKLSAgICAgICAgICAgICAgICBtRW5jb2Rlci0+cmVsZWFzZU91dHB1dEJ1ZmZlcihidWZmZXJJbmRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRTdXNwZW5kRW5jb2Rpbmc6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGludDMyX3Qgc3VzcGVuZDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzdXNwZW5kIiwgJnN1c3BlbmQpKTsKLQotICAgICAgICAgICAgbUVuY29kaW5nU3VzcGVuZGVkID0gc3VzcGVuZDsKLQotICAgICAgICAgICAgaWYgKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpIHsKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcGFyYW1zID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0SW50MzIoImRyb3AtaW5wdXQtZnJhbWVzIixzdXNwZW5kKTsKLSAgICAgICAgICAgICAgICBtRW5jb2Rlci0+c2V0UGFyYW1ldGVycyhwYXJhbXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgVFJFU1BBU1MoKTsKLSAgICB9Ci19Ci0KLXZvaWQgQ29udmVydGVyOjpzY2hlZHVsZURvTW9yZVdvcmsoKSB7Ci0gICAgaWYgKG1Jc1BDTUF1ZGlvKSB7Ci0gICAgICAgIC8vIFRoZXJlJ3Mgbm8gZW5jb2RlciBpbnZvbHZlZCBpbiB0aGlzIGNhc2UuCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobURvTW9yZVdvcmtQZW5kaW5nKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtRG9Nb3JlV29ya1BlbmRpbmcgPSB0cnVlOwotCi0jaWYgMQotICAgIGlmIChtRW5jb2RlckFjdGl2aXR5Tm90aWZ5ID09IE5VTEwpIHsKLSAgICAgICAgbUVuY29kZXJBY3Rpdml0eU5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdEVuY29kZXJBY3Rpdml0eSwgdGhpcyk7Ci0gICAgfQotICAgIG1FbmNvZGVyLT5yZXF1ZXN0QWN0aXZpdHlOb3RpZmljYXRpb24obUVuY29kZXJBY3Rpdml0eU5vdGlmeS0+ZHVwKCkpOwotI2Vsc2UKLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0RW5jb2RlckFjdGl2aXR5LCB0aGlzKTsKLSAgICBub3RpZnktPnNldEludDY0KCJ3aGVuVXMiLCBBTG9vcGVyOjpHZXROb3dVcygpKTsKLSAgICBtRW5jb2Rlci0+cmVxdWVzdEFjdGl2aXR5Tm90aWZpY2F0aW9uKG5vdGlmeSk7Ci0jZW5kaWYKLX0KLQotc3RhdHVzX3QgQ29udmVydGVyOjpmZWVkUmF3QXVkaW9JbnB1dEJ1ZmZlcnMoKSB7Ci0gICAgLy8gU3BsaXQgaW5jb21pbmcgUENNIGF1ZGlvIGludG8gYnVmZmVycyBvZiA2IEFVcyBvZiA4MCBhdWRpbyBmcmFtZXMgZWFjaAotICAgIC8vIGFuZCBhZGQgYSA0IGJ5dGUgaGVhZGVyIGFjY29yZGluZyB0byB0aGUgd2lmaSBkaXNwbGF5IHNwZWNzLgotCi0gICAgd2hpbGUgKCFtSW5wdXRCdWZmZXJRdWV1ZS5lbXB0eSgpKSB7Ci0gICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9ICptSW5wdXRCdWZmZXJRdWV1ZS5iZWdpbigpOwotICAgICAgICBtSW5wdXRCdWZmZXJRdWV1ZS5lcmFzZShtSW5wdXRCdWZmZXJRdWV1ZS5iZWdpbigpKTsKLQotICAgICAgICBpbnQxNl90ICpwdHIgPSAoaW50MTZfdCAqKWJ1ZmZlci0+ZGF0YSgpOwotICAgICAgICBpbnQxNl90ICpzdG9wID0gKGludDE2X3QgKikoYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnNpemUoKSk7Ci0gICAgICAgIHdoaWxlIChwdHIgPCBzdG9wKSB7Ci0gICAgICAgICAgICAqcHRyID0gaHRvbnMoKnB0cik7Ci0gICAgICAgICAgICArK3B0cjsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0ZyYW1lU2l6ZSA9IDIgKiBzaXplb2YoaW50MTZfdCk7ICAvLyBzdGVyZW8KLSAgICAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrRnJhbWVzUGVyQVUgPSA4MDsKLSAgICAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTnVtQVVzUGVyUEVTUGFja2V0ID0gNjsKLQotICAgICAgICBpZiAobVBhcnRpYWxBdWRpb0FVICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHNpemVfdCBieXRlc01pc3NpbmdGb3JGdWxsQVUgPQotICAgICAgICAgICAgICAgIGtOdW1BVXNQZXJQRVNQYWNrZXQgKiBrRnJhbWVzUGVyQVUgKiBrRnJhbWVTaXplCi0gICAgICAgICAgICAgICAgLSBtUGFydGlhbEF1ZGlvQVUtPnNpemUoKSArIDQ7Ci0KLSAgICAgICAgICAgIHNpemVfdCBjb3B5ID0gYnVmZmVyLT5zaXplKCk7Ci0gICAgICAgICAgICBpZihjb3B5ID4gYnl0ZXNNaXNzaW5nRm9yRnVsbEFVKSB7Ci0gICAgICAgICAgICAgICAgY29weSA9IGJ5dGVzTWlzc2luZ0ZvckZ1bGxBVTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbWVtY3B5KG1QYXJ0aWFsQXVkaW9BVS0+ZGF0YSgpICsgbVBhcnRpYWxBdWRpb0FVLT5zaXplKCksCi0gICAgICAgICAgICAgICAgICAgYnVmZmVyLT5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgY29weSk7Ci0KLSAgICAgICAgICAgIG1QYXJ0aWFsQXVkaW9BVS0+c2V0UmFuZ2UoMCwgbVBhcnRpYWxBdWRpb0FVLT5zaXplKCkgKyBjb3B5KTsKLQotICAgICAgICAgICAgYnVmZmVyLT5zZXRSYW5nZShidWZmZXItPm9mZnNldCgpICsgY29weSwgYnVmZmVyLT5zaXplKCkgLSBjb3B5KTsKLQotICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7Ci0KLSAgICAgICAgICAgIGludDY0X3QgY29weVVzID0gKGludDY0X3QpKChjb3B5IC8ga0ZyYW1lU2l6ZSkgKiAxRTYgLyA0ODAwMC4wKTsKLSAgICAgICAgICAgIHRpbWVVcyArPSBjb3B5VXM7Ci0gICAgICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7Ci0KLSAgICAgICAgICAgIGlmIChieXRlc01pc3NpbmdGb3JGdWxsQVUgPT0gY29weSkgewotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRBY2Nlc3NVbml0KTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEJ1ZmZlcigiYWNjZXNzVW5pdCIsIG1QYXJ0aWFsQXVkaW9BVSk7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0KLSAgICAgICAgICAgICAgICBtUGFydGlhbEF1ZGlvQVUuY2xlYXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlIChidWZmZXItPnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIHNwPEFCdWZmZXI+IHBhcnRpYWxBdWRpb0FVID0KLSAgICAgICAgICAgICAgICBuZXcgQUJ1ZmZlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIDQKLSAgICAgICAgICAgICAgICAgICAgICAgICsga051bUFVc1BlclBFU1BhY2tldCAqIGtGcmFtZVNpemUgKiBrRnJhbWVzUGVyQVUpOwotCi0gICAgICAgICAgICB1aW50OF90ICpwdHIgPSBwYXJ0aWFsQXVkaW9BVS0+ZGF0YSgpOwotICAgICAgICAgICAgcHRyWzBdID0gMHhhMDsgIC8vIDEwMTAwMDAwYgotICAgICAgICAgICAgcHRyWzFdID0ga051bUFVc1BlclBFU1BhY2tldDsKLSAgICAgICAgICAgIHB0clsyXSA9IDA7ICAvLyByZXNlcnZlZCwgYXVkaW8gX2VtcGhhc2lzX2ZsYWcgPSAwCi0KLSAgICAgICAgICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBrUXVhbnRpemF0aW9uV29yZExlbmd0aCA9IDA7ICAvLyAxNi1iaXQKLSAgICAgICAgICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBrQXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeSA9IDI7ICAvLyA0OEtoegotICAgICAgICAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGtOdW1iZXJPZkF1ZGlvQ2hhbm5lbHMgPSAxOyAgLy8gc3RlcmVvCi0KLSAgICAgICAgICAgIHB0clszXSA9IChrUXVhbnRpemF0aW9uV29yZExlbmd0aCA8PCA2KQotICAgICAgICAgICAgICAgICAgICB8IChrQXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeSA8PCAzKQotICAgICAgICAgICAgICAgICAgICB8IGtOdW1iZXJPZkF1ZGlvQ2hhbm5lbHM7Ci0KLSAgICAgICAgICAgIHNpemVfdCBjb3B5ID0gYnVmZmVyLT5zaXplKCk7Ci0gICAgICAgICAgICBpZiAoY29weSA+IHBhcnRpYWxBdWRpb0FVLT5zaXplKCkgLSA0KSB7Ci0gICAgICAgICAgICAgICAgY29weSA9IHBhcnRpYWxBdWRpb0FVLT5zaXplKCkgLSA0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtZW1jcHkoJnB0cls0XSwgYnVmZmVyLT5kYXRhKCksIGNvcHkpOwotCi0gICAgICAgICAgICBwYXJ0aWFsQXVkaW9BVS0+c2V0UmFuZ2UoMCwgNCArIGNvcHkpOwotICAgICAgICAgICAgYnVmZmVyLT5zZXRSYW5nZShidWZmZXItPm9mZnNldCgpICsgY29weSwgYnVmZmVyLT5zaXplKCkgLSBjb3B5KTsKLQotICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7Ci0KLSAgICAgICAgICAgIHBhcnRpYWxBdWRpb0FVLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwotCi0gICAgICAgICAgICBpbnQ2NF90IGNvcHlVcyA9IChpbnQ2NF90KSgoY29weSAvIGtGcmFtZVNpemUpICogMUU2IC8gNDgwMDAuMCk7Ci0gICAgICAgICAgICB0aW1lVXMgKz0gY29weVVzOwotICAgICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwotCi0gICAgICAgICAgICBpZiAoY29weSA9PSBwYXJ0aWFsQXVkaW9BVS0+Y2FwYWNpdHkoKSAtIDQpIHsKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0QWNjZXNzVW5pdCk7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRCdWZmZXIoImFjY2Vzc1VuaXQiLCBwYXJ0aWFsQXVkaW9BVSk7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0KLSAgICAgICAgICAgICAgICBwYXJ0aWFsQXVkaW9BVS5jbGVhcigpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtUGFydGlhbEF1ZGlvQVUgPSBwYXJ0aWFsQXVkaW9BVTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgQ29udmVydGVyOjpmZWVkRW5jb2RlcklucHV0QnVmZmVycygpIHsKLSAgICBpZiAobUlzUENNQXVkaW8pIHsKLSAgICAgICAgcmV0dXJuIGZlZWRSYXdBdWRpb0lucHV0QnVmZmVycygpOwotICAgIH0KLQotICAgIHdoaWxlICghbUlucHV0QnVmZmVyUXVldWUuZW1wdHkoKQotICAgICAgICAgICAgJiYgIW1BdmFpbEVuY29kZXJJbnB1dEluZGljZXMuZW1wdHkoKSkgewotICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSAqbUlucHV0QnVmZmVyUXVldWUuYmVnaW4oKTsKLSAgICAgICAgbUlucHV0QnVmZmVyUXVldWUuZXJhc2UobUlucHV0QnVmZmVyUXVldWUuYmVnaW4oKSk7Ci0KLSAgICAgICAgc2l6ZV90IGJ1ZmZlckluZGV4ID0gKm1BdmFpbEVuY29kZXJJbnB1dEluZGljZXMuYmVnaW4oKTsKLSAgICAgICAgbUF2YWlsRW5jb2RlcklucHV0SW5kaWNlcy5lcmFzZShtQXZhaWxFbmNvZGVySW5wdXRJbmRpY2VzLmJlZ2luKCkpOwotCi0gICAgICAgIGludDY0X3QgdGltZVVzID0gMGxsOwotICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7Ci0KLSAgICAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7Ci0KLSAgICAgICAgICAgIG1lbWNweShtRW5jb2RlcklucHV0QnVmZmVycy5pdGVtQXQoYnVmZmVySW5kZXgpLT5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgYnVmZmVyLT5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgYnVmZmVyLT5zaXplKCkpOwotCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqbWVkaWFCdWZmZXIgPQotICAgICAgICAgICAgICAgIChNZWRpYUJ1ZmZlciAqKShidWZmZXItPmdldE1lZGlhQnVmZmVyQmFzZSgpKTsKLSAgICAgICAgICAgIGlmIChtZWRpYUJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbUVuY29kZXJJbnB1dEJ1ZmZlcnMuaXRlbUF0KGJ1ZmZlckluZGV4KS0+c2V0TWVkaWFCdWZmZXJCYXNlKAotICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFCdWZmZXIpOwotCi0gICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRNZWRpYUJ1ZmZlckJhc2UoTlVMTCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmbGFncyA9IE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0VPUzsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXR1c190IGVyciA9IG1FbmNvZGVyLT5xdWV1ZUlucHV0QnVmZmVyKAotICAgICAgICAgICAgICAgIGJ1ZmZlckluZGV4LCAwLCAoYnVmZmVyID09IE5VTEwpID8gMCA6IGJ1ZmZlci0+c2l6ZSgpLAotICAgICAgICAgICAgICAgIHRpbWVVcywgZmxhZ3MpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXNwPEFCdWZmZXI+IENvbnZlcnRlcjo6cHJlcGVuZENTRChjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCkgY29uc3QgewotICAgIENIRUNLKG1DU0QwICE9IE5VTEwpOwotCi0gICAgc3A8QUJ1ZmZlcj4gZHVwID0gbmV3IEFCdWZmZXIoYWNjZXNzVW5pdC0+c2l6ZSgpICsgbUNTRDAtPnNpemUoKSk7Ci0gICAgbWVtY3B5KGR1cC0+ZGF0YSgpLCBtQ1NEMC0+ZGF0YSgpLCBtQ1NEMC0+c2l6ZSgpKTsKLSAgICBtZW1jcHkoZHVwLT5kYXRhKCkgKyBtQ1NEMC0+c2l6ZSgpLCBhY2Nlc3NVbml0LT5kYXRhKCksIGFjY2Vzc1VuaXQtPnNpemUoKSk7Ci0KLSAgICBpbnQ2NF90IHRpbWVVczsKLSAgICBDSEVDSyhhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwotCi0gICAgZHVwLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwotCi0gICAgcmV0dXJuIGR1cDsKLX0KLQotc3RhdHVzX3QgQ29udmVydGVyOjpkb01vcmVXb3JrKCkgewotICAgIHN0YXR1c190IGVycjsKLQotICAgIGlmICghKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpKSB7Ci0gICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgIHNpemVfdCBidWZmZXJJbmRleDsKLSAgICAgICAgICAgIGVyciA9IG1FbmNvZGVyLT5kZXF1ZXVlSW5wdXRCdWZmZXIoJmJ1ZmZlckluZGV4KTsKLQotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtQXZhaWxFbmNvZGVySW5wdXRJbmRpY2VzLnB1c2hfYmFjayhidWZmZXJJbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmZWVkRW5jb2RlcklucHV0QnVmZmVycygpOwotICAgIH0KLQotICAgIGZvciAoOzspIHsKLSAgICAgICAgc2l6ZV90IGJ1ZmZlckluZGV4OwotICAgICAgICBzaXplX3Qgb2Zmc2V0OwotICAgICAgICBzaXplX3Qgc2l6ZTsKLSAgICAgICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgICAgIHVpbnQzMl90IGZsYWdzOwotICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSA9IE5VTEw7Ci0gICAgICAgIGVyciA9IG1FbmNvZGVyLT5kZXF1ZXVlT3V0cHV0QnVmZmVyKAotICAgICAgICAgICAgICAgICZidWZmZXJJbmRleCwgJm9mZnNldCwgJnNpemUsICZ0aW1lVXMsICZmbGFncyk7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgaWYgKGVyciA9PSBJTkZPX0ZPUk1BVF9DSEFOR0VEKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBJTkZPX09VVFBVVF9CVUZGRVJTX0NIQU5HRUQpIHsKLSAgICAgICAgICAgICAgICBtRW5jb2Rlci0+Z2V0T3V0cHV0QnVmZmVycygmbUVuY29kZXJPdXRwdXRCdWZmZXJzKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGVyciA9PSAtRUFHQUlOKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gT0s7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmbGFncyAmIE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0VPUykgewotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0RU9TKTsKLSAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwotICAgICAgICB9IGVsc2UgewotI2lmIDAKLSAgICAgICAgICAgIGlmIChtSXNWaWRlbykgewotICAgICAgICAgICAgICAgIGludDMyX3QgdmlkZW9CaXRyYXRlID0gR2V0SW50MzJQcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJtZWRpYS53ZmQudmlkZW8tYml0cmF0ZSIsIDUwMDAwMDApOwotCi0gICAgICAgICAgICAgICAgc2V0VmlkZW9CaXRyYXRlKHZpZGVvQml0cmF0ZSk7Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLQotICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOwotICAgICAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gb3V0YnVmID0gbUVuY29kZXJPdXRwdXRCdWZmZXJzLml0ZW1BdChidWZmZXJJbmRleCk7Ci0KLSAgICAgICAgICAgIGlmIChvdXRidWYtPm1ldGEoKS0+ZmluZFBvaW50ZXIoImhhbmRsZSIsICh2b2lkKiopJmhhbmRsZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpbnQzMl90IHJhbmdlTGVuZ3RoLCByYW5nZU9mZnNldDsKLSAgICAgICAgICAgICAgICBDSEVDSyhvdXRidWYtPm1ldGEoKS0+ZmluZEludDMyKCJyYW5nZU9mZnNldCIsICZyYW5nZU9mZnNldCkpOwotICAgICAgICAgICAgICAgIENIRUNLKG91dGJ1Zi0+bWV0YSgpLT5maW5kSW50MzIoInJhbmdlTGVuZ3RoIiwgJnJhbmdlTGVuZ3RoKSk7Ci0gICAgICAgICAgICAgICAgb3V0YnVmLT5tZXRhKCktPnNldFBvaW50ZXIoImhhbmRsZSIsIE5VTEwpOwotCi0gICAgICAgICAgICAgICAgLy8gTWVkaWFTZW5kZXIgd2lsbCBwb3N0IHRoZSBmb2xsb3dpbmcgbWVzc2FnZSB3aGVuIEhEQ1AKLSAgICAgICAgICAgICAgICAvLyBpcyBkb25lLCB0byByZWxlYXNlIHRoZSBvdXRwdXQgYnVmZmVyIGJhY2sgdG8gZW5jb2Rlci4KLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5KG5ldyBBTWVzc2FnZShrV2hhdFJlbGVhc2VPdXRwdXRCdWZmZXIsIHRoaXMpKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJidWZmZXJJbmRleCIsIGJ1ZmZlckluZGV4KTsKLQotICAgICAgICAgICAgICAgIGJ1ZmZlciA9IG5ldyBBQnVmZmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VMZW5ndGggPiAoaW50MzJfdClzaXplID8gcmFuZ2VMZW5ndGggOiBzaXplKTsKLSAgICAgICAgICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0UG9pbnRlcigiaGFuZGxlIiwgaGFuZGxlKTsKLSAgICAgICAgICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50MzIoInJhbmdlT2Zmc2V0IiwgcmFuZ2VPZmZzZXQpOwotICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigicmFuZ2VMZW5ndGgiLCByYW5nZUxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldE1lc3NhZ2UoIm5vdGlmeSIsIG5vdGlmeSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1ZmZlciA9IG5ldyBBQnVmZmVyKHNpemUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7Ci0KLSAgICAgICAgICAgIEFMT0dWKCJbJXNdIHRpbWUgJWxsZCB1cyAoJS4yZiBzZWNzKSIsCi0gICAgICAgICAgICAgICAgICAgIG1Jc1ZpZGVvID8gInZpZGVvIiA6ICJhdWRpbyIsIChsb25nIGxvbmcpdGltZVVzLCB0aW1lVXMgLyAxRTYpOwotCi0gICAgICAgICAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCksIG91dGJ1Zi0+YmFzZSgpICsgb2Zmc2V0LCBzaXplKTsKLQotICAgICAgICAgICAgaWYgKGZsYWdzICYgTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfQ09ERUNDT05GSUcpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobUlzSDI2NCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUNTRDAgPSBidWZmZXI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbU91dHB1dEZvcm1hdC0+c2V0QnVmZmVyKCJjc2QtMCIsIGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobU5lZWRUb01hbnVhbGx5UHJlcGVuZFNQU1BQUwotICAgICAgICAgICAgICAgICAgICAgICAgJiYgbUlzSDI2NAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG1GbGFncyAmIEZMQUdfUFJFUEVORF9DU0RfSUZfTkVDRVNTQVJZKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgSXNJRFIoYnVmZmVyKSkgewotICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSBwcmVwZW5kQ1NEKGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEFjY2Vzc1VuaXQpOwotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0QnVmZmVyKCJhY2Nlc3NVbml0IiwgYnVmZmVyKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghaGFuZGxlKSB7Ci0gICAgICAgICAgICBtRW5jb2Rlci0+cmVsZWFzZU91dHB1dEJ1ZmZlcihidWZmZXJJbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZmxhZ3MgJiBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19FT1MpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotdm9pZCBDb252ZXJ0ZXI6OnJlcXVlc3RJRFJGcmFtZSgpIHsKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVxdWVzdElEUkZyYW1lLCB0aGlzKSktPnBvc3QoKTsKLX0KLQotdm9pZCBDb252ZXJ0ZXI6OmRyb3BBRnJhbWUoKSB7Ci0gICAgLy8gVW5zdXBwb3J0ZWQgaW4gc3VyZmFjZSBpbnB1dCBtb2RlLgotICAgIENIRUNLKCEobUZsYWdzICYgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCkpOwotCi0gICAgKG5ldyBBTWVzc2FnZShrV2hhdERyb3BBRnJhbWUsIHRoaXMpKS0+cG9zdCgpOwotfQotCi12b2lkIENvbnZlcnRlcjo6c3VzcGVuZEVuY29kaW5nKGJvb2wgc3VzcGVuZCkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdXNwZW5kRW5jb2RpbmcsIHRoaXMpOwotICAgIG1zZy0+c2V0SW50MzIoInN1c3BlbmQiLCBzdXNwZW5kKTsKLSAgICBtc2ctPnBvc3QoKTsKLX0KLQotaW50MzJfdCBDb252ZXJ0ZXI6OmdldFZpZGVvQml0cmF0ZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVByZXZWaWRlb0JpdHJhdGU7Ci19Ci0KLXZvaWQgQ29udmVydGVyOjpzZXRWaWRlb0JpdHJhdGUoaW50MzJfdCBiaXRSYXRlKSB7Ci0gICAgaWYgKG1Jc1ZpZGVvICYmIG1FbmNvZGVyICE9IE5VTEwgJiYgYml0UmF0ZSAhPSBtUHJldlZpZGVvQml0cmF0ZSkgewotICAgICAgICBzcDxBTWVzc2FnZT4gcGFyYW1zID0gbmV3IEFNZXNzYWdlOwotICAgICAgICBwYXJhbXMtPnNldEludDMyKCJ2aWRlby1iaXRyYXRlIiwgYml0UmF0ZSk7Ci0KLSAgICAgICAgbUVuY29kZXItPnNldFBhcmFtZXRlcnMocGFyYW1zKTsKLQotICAgICAgICBtUHJldlZpZGVvQml0cmF0ZSA9IGJpdFJhdGU7Ci0gICAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9Db252ZXJ0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvQ29udmVydGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkOTVhYjUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9Db252ZXJ0ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIENPTlZFUlRFUl9IXwotCi0jZGVmaW5lIENPTlZFUlRFUl9IXwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBBQnVmZmVyOwotY2xhc3MgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKLXN0cnVjdCBNZWRpYUNvZGVjOwotY2xhc3MgTWVkaWFDb2RlY0J1ZmZlcjsKLQotI2RlZmluZSBFTkFCTEVfU0lMRU5DRV9ERVRFQ1RJT04gICAgICAgIDAKLQotLy8gVXRpbGl0eSBjbGFzcyB0aGF0IHJlY2VpdmVzIG1lZGlhIGFjY2VzcyB1bml0cyBhbmQgY29udmVydHMgdGhlbSBpbnRvCi0vLyBtZWRpYSBhY2Nlc3MgdW5pdCBvZiBhIGRpZmZlcmVudCBmb3JtYXQuCi0vLyBSaWdodCBub3cgdGhpcydsbCBjb252ZXJ0IHJhdyB2aWRlbyBpbnRvIEguMjY0IGFuZCByYXcgYXVkaW8gaW50byBBQUMuCi1zdHJ1Y3QgQ29udmVydGVyIDogcHVibGljIEFIYW5kbGVyIHsKLSAgICBlbnVtIHsKLSAgICAgICAga1doYXRBY2Nlc3NVbml0LAotICAgICAgICBrV2hhdEVPUywKLSAgICAgICAga1doYXRFcnJvciwKLSAgICAgICAga1doYXRTaHV0ZG93bkNvbXBsZXRlZCwKLSAgICB9OwotCi0gICAgZW51bSBGbGFnQml0cyB7Ci0gICAgICAgIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQgICAgICAgICAgPSAxLAotICAgICAgICBGTEFHX1BSRVBFTkRfQ1NEX0lGX05FQ0VTU0FSWSAgID0gMiwKLSAgICB9OwotICAgIENvbnZlcnRlcihjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKLSAgICAgICAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gJmNvZGVjTG9vcGVyLAotICAgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm91dHB1dEZvcm1hdCwKLSAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKLQotICAgIHN0YXR1c190IGluaXQoKTsKLQotICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGdldEdyYXBoaWNCdWZmZXJQcm9kdWNlcigpOwotCi0gICAgc2l6ZV90IGdldElucHV0QnVmZmVyQ291bnQoKSBjb25zdDsKLQotICAgIHNwPEFNZXNzYWdlPiBnZXRPdXRwdXRGb3JtYXQoKSBjb25zdDsKLSAgICBib29sIG5lZWRUb01hbnVhbGx5UHJlcGVuZFNQU1BQUygpIGNvbnN0OwotCi0gICAgdm9pZCBmZWVkQWNjZXNzVW5pdChjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCk7Ci0gICAgdm9pZCBzaWduYWxFT1MoKTsKLQotICAgIHZvaWQgcmVxdWVzdElEUkZyYW1lKCk7Ci0KLSAgICB2b2lkIGRyb3BBRnJhbWUoKTsKLSAgICB2b2lkIHN1c3BlbmRFbmNvZGluZyhib29sIHN1c3BlbmQpOwotCi0gICAgdm9pZCBzaHV0ZG93bkFzeW5jKCk7Ci0KLSAgICBpbnQzMl90IGdldFZpZGVvQml0cmF0ZSgpIGNvbnN0OwotICAgIHZvaWQgc2V0VmlkZW9CaXRyYXRlKGludDMyX3QgYml0cmF0ZSk7Ci0KLSAgICBzdGF0aWMgaW50MzJfdCBHZXRJbnQzMlByb3BlcnR5KGNvbnN0IGNoYXIgKnByb3BOYW1lLCBpbnQzMl90IGRlZmF1bHRWYWx1ZSk7Ci0KLSAgICBlbnVtIHsKLSAgICAgICAgLy8gTVVTVCBub3QgY29uZmxpY3Qgd2l0aCBwcml2YXRlIGVudW1zIGJlbG93LgotICAgICAgICBrV2hhdE1lZGlhUHVsbGVyTm90aWZ5ID0gJ3B1bE4nLAotICAgIH07Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5Db252ZXJ0ZXIoKTsKLSAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwotCi1wcml2YXRlOgotICAgIGVudW0gewotICAgICAgICBrV2hhdERvTW9yZVdvcmssCi0gICAgICAgIGtXaGF0UmVxdWVzdElEUkZyYW1lLAotICAgICAgICBrV2hhdFN1c3BlbmRFbmNvZGluZywKLSAgICAgICAga1doYXRTaHV0ZG93biwKLSAgICAgICAga1doYXRFbmNvZGVyQWN0aXZpdHksCi0gICAgICAgIGtXaGF0RHJvcEFGcmFtZSwKLSAgICAgICAga1doYXRSZWxlYXNlT3V0cHV0QnVmZmVyLAotICAgIH07Ci0KLSAgICBzcDxBTWVzc2FnZT4gbU5vdGlmeTsKLSAgICBzcDxBTG9vcGVyPiBtQ29kZWNMb29wZXI7Ci0gICAgc3A8QU1lc3NhZ2U+IG1PdXRwdXRGb3JtYXQ7Ci0gICAgdWludDMyX3QgbUZsYWdzOwotICAgIGJvb2wgbUlzVmlkZW87Ci0gICAgYm9vbCBtSXNIMjY0OwotICAgIGJvb2wgbUlzUENNQXVkaW87Ci0gICAgYm9vbCBtTmVlZFRvTWFudWFsbHlQcmVwZW5kU1BTUFBTOwotCi0gICAgc3A8TWVkaWFDb2RlYz4gbUVuY29kZXI7Ci0gICAgc3A8QU1lc3NhZ2U+IG1FbmNvZGVyQWN0aXZpdHlOb3RpZnk7Ci0KLSAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwotCi0gICAgVmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+ID4gbUVuY29kZXJJbnB1dEJ1ZmZlcnM7Ci0gICAgVmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+ID4gbUVuY29kZXJPdXRwdXRCdWZmZXJzOwotCi0gICAgTGlzdDxzaXplX3Q+IG1BdmFpbEVuY29kZXJJbnB1dEluZGljZXM7Ci0KLSAgICBMaXN0PHNwPEFCdWZmZXI+ID4gbUlucHV0QnVmZmVyUXVldWU7Ci0KLSAgICBzcDxBQnVmZmVyPiBtQ1NEMDsKLQotICAgIGJvb2wgbURvTW9yZVdvcmtQZW5kaW5nOwotCi0jaWYgRU5BQkxFX1NJTEVOQ0VfREVURUNUSU9OCi0gICAgaW50NjRfdCBtRmlyc3RTaWxlbnRGcmFtZVVzOwotICAgIGJvb2wgbUluU2lsZW50TW9kZTsKLSNlbmRpZgotCi0gICAgc3A8QUJ1ZmZlcj4gbVBhcnRpYWxBdWRpb0FVOwotCi0gICAgaW50MzJfdCBtUHJldlZpZGVvQml0cmF0ZTsKLQotICAgIGludDMyX3QgbU51bUZyYW1lc1RvRHJvcDsKLSAgICBib29sIG1FbmNvZGluZ1N1c3BlbmRlZDsKLQotICAgIHN0YXR1c190IGluaXRFbmNvZGVyKCk7Ci0gICAgdm9pZCByZWxlYXNlRW5jb2RlcigpOwotCi0gICAgc3RhdHVzX3QgZmVlZEVuY29kZXJJbnB1dEJ1ZmZlcnMoKTsKLQotICAgIHZvaWQgc2NoZWR1bGVEb01vcmVXb3JrKCk7Ci0gICAgc3RhdHVzX3QgZG9Nb3JlV29yaygpOwotCi0gICAgdm9pZCBub3RpZnlFcnJvcihzdGF0dXNfdCBlcnIpOwotCi0gICAgLy8gUGFja2V0aXplcyByYXcgUENNIGF1ZGlvIGRhdGEgYXZhaWxhYmxlIGluIG1JbnB1dEJ1ZmZlclF1ZXVlCi0gICAgLy8gaW50byBhIGZvcm1hdCBzdWl0YWJsZSBmb3IgdHJhbnNwb3J0IHN0cmVhbSBpbmNsdXNpb24gYW5kCi0gICAgLy8gbm90aWZpZXMgdGhlIG9ic2VydmVyLgotICAgIHN0YXR1c190IGZlZWRSYXdBdWRpb0lucHV0QnVmZmVycygpOwotCi0gICAgc3RhdGljIGJvb2wgSXNTaWxlbmNlKGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KTsKLQotICAgIHNwPEFCdWZmZXI+IHByZXBlbmRDU0QoY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpIGNvbnN0OwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ29udmVydGVyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gQ09OVkVSVEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL01lZGlhUHVsbGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvTWVkaWFQdWxsZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTA3YTRlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvTWVkaWFQdWxsZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiTWVkaWFQdWxsZXIiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJNZWRpYVB1bGxlci5oIgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotTWVkaWFQdWxsZXI6Ok1lZGlhUHVsbGVyKAotICAgICAgICBjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpCi0gICAgOiBtU291cmNlKHNvdXJjZSksCi0gICAgICBtTm90aWZ5KG5vdGlmeSksCi0gICAgICBtUHVsbEdlbmVyYXRpb24oMCksCi0gICAgICBtSXNBdWRpbyhmYWxzZSksCi0gICAgICBtUGF1c2VkKGZhbHNlKSB7Ci0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBzb3VyY2UtPmdldEZvcm1hdCgpOwotICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgQ0hFQ0sobWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOwotCi0gICAgbUlzQXVkaW8gPSAhc3RybmNhc2VjbXAobWltZSwgImF1ZGlvLyIsIDYpOwotfQotCi1NZWRpYVB1bGxlcjo6fk1lZGlhUHVsbGVyKCkgewotfQotCi1zdGF0dXNfdCBNZWRpYVB1bGxlcjo6cG9zdFN5bmNocm9ub3VzbHlBbmRSZXR1cm5FcnJvcigKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7Ci0gICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmICghcmVzcG9uc2UtPmZpbmRJbnQzMigiZXJyIiwgJmVycikpIHsKLSAgICAgICAgZXJyID0gT0s7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgTWVkaWFQdWxsZXI6OnN0YXJ0KCkgewotICAgIHJldHVybiBwb3N0U3luY2hyb25vdXNseUFuZFJldHVybkVycm9yKG5ldyBBTWVzc2FnZShrV2hhdFN0YXJ0LCB0aGlzKSk7Ci19Ci0KLXZvaWQgTWVkaWFQdWxsZXI6OnN0b3BBc3luYyhjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wLCB0aGlzKTsKLSAgICBtc2ctPnNldE1lc3NhZ2UoIm5vdGlmeSIsIG5vdGlmeSk7Ci0gICAgbXNnLT5wb3N0KCk7Ci19Ci0KLXZvaWQgTWVkaWFQdWxsZXI6OnBhdXNlKCkgewotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQYXVzZSwgdGhpcykpLT5wb3N0KCk7Ci19Ci0KLXZvaWQgTWVkaWFQdWxsZXI6OnJlc3VtZSgpIHsKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVzdW1lLCB0aGlzKSktPnBvc3QoKTsKLX0KLQotdm9pZCBNZWRpYVB1bGxlcjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7Ci0gICAgICAgIGNhc2Uga1doYXRTdGFydDoKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdHVzX3QgZXJyOwotICAgICAgICAgICAgaWYgKG1Jc0F1ZGlvKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyBhdHJvY2l0eSBjYXVzZXMgQXVkaW9Tb3VyY2UgdG8gZGVsaXZlciBhYnNvbHV0ZQotICAgICAgICAgICAgICAgIC8vIHN5c3RlbVRpbWUoKSBiYXNlZCB0aW1lc3RhbXBzIChvZmYgYnkgMSB1cykuCi0gICAgICAgICAgICAgICAgc3A8TWV0YURhdGE+IHBhcmFtcyA9IG5ldyBNZXRhRGF0YTsKLSAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEludDY0KGtLZXlUaW1lLCAxbGwpOwotICAgICAgICAgICAgICAgIGVyciA9IG1Tb3VyY2UtPnN0YXJ0KHBhcmFtcy5nZXQoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVyciA9IG1Tb3VyY2UtPnN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgic291cmNlIGZhaWxlZCB0byBzdGFydCB3LyBlcnIgJWQiLCBlcnIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgICAgIHNjaGVkdWxlUHVsbCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7Ci0KLSAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwotICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdFN0b3A6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KCk7Ci0gICAgICAgICAgICBjb25zdCBjaGFyICp0bXA7Ci0gICAgICAgICAgICBDSEVDSyhtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZ0bXApKTsKLSAgICAgICAgICAgIEFTdHJpbmcgbWltZSA9IHRtcDsKLQotICAgICAgICAgICAgQUxPR0koIk1lZGlhUHVsbGVyKCVzKSBzdG9wcGluZy4iLCBtaW1lLmNfc3RyKCkpOwotICAgICAgICAgICAgbVNvdXJjZS0+c3RvcCgpOwotICAgICAgICAgICAgQUxPR0koIk1lZGlhUHVsbGVyKCVzKSBzdG9wcGVkLiIsIG1pbWUuY19zdHIoKSk7Ci0gICAgICAgICAgICArK21QdWxsR2VuZXJhdGlvbjsKLQotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeTsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoIm5vdGlmeSIsICZub3RpZnkpKTsKLSAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0UHVsbDoKLSAgICAgICAgewotICAgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOwotCi0gICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPSBtUHVsbEdlbmVyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTWVkaWFCdWZmZXIgKm1idWY7Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5yZWFkKCZtYnVmKTsKLQotICAgICAgICAgICAgaWYgKG1QYXVzZWQpIHsKLSAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1idWYtPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbWJ1ZiA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc2NoZWR1bGVQdWxsKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0koInN0cmVhbSBlbmRlZC4iKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZXJyb3IgJWQgcmVhZGluZyBzdHJlYW0uIiwgZXJyKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0RU9TKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobWJ1Zi0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOwotCi0gICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdCA9IG5ldyBBQnVmZmVyKG1idWYtPnJhbmdlX2xlbmd0aCgpKTsKLQotICAgICAgICAgICAgICAgIG1lbWNweShhY2Nlc3NVbml0LT5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopbWJ1Zi0+ZGF0YSgpICsgbWJ1Zi0+cmFuZ2Vfb2Zmc2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgIG1idWYtPnJhbmdlX2xlbmd0aCgpKTsKLQotICAgICAgICAgICAgICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobUlzQXVkaW8pIHsKLSAgICAgICAgICAgICAgICAgICAgbWJ1Zi0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICBtYnVmID0gTlVMTDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyB2aWRlbyBlbmNvZGVyIHdpbGwgcmVsZWFzZSBNZWRpYUJ1ZmZlciB3aGVuIGRvbmUKLSAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCB1bmRlcmx5aW5nIGRhdGEuCi0gICAgICAgICAgICAgICAgICAgIGFjY2Vzc1VuaXQtPnNldE1lZGlhQnVmZmVyQmFzZShtYnVmKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0KLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRBY2Nlc3NVbml0KTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEJ1ZmZlcigiYWNjZXNzVW5pdCIsIGFjY2Vzc1VuaXQpOwotICAgICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1idWYgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigicG9zdGVkIG1idWYgJXAiLCBtYnVmKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzY2hlZHVsZVB1bGwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdFBhdXNlOgotICAgICAgICB7Ci0gICAgICAgICAgICBtUGF1c2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdFJlc3VtZToKLSAgICAgICAgewotICAgICAgICAgICAgbVBhdXNlZCA9IGZhbHNlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgVFJFU1BBU1MoKTsKLSAgICB9Ci19Ci0KLXZvaWQgTWVkaWFQdWxsZXI6OnNjaGVkdWxlUHVsbCgpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UHVsbCwgdGhpcyk7Ci0gICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1QdWxsR2VuZXJhdGlvbik7Ci0gICAgbXNnLT5wb3N0KCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvTWVkaWFQdWxsZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvTWVkaWFQdWxsZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI5MWJiMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL01lZGlhUHVsbGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1FRElBX1BVTExFUl9IXwotCi0jZGVmaW5lIE1FRElBX1BVTExFUl9IXwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBNZWRpYVNvdXJjZTsKLQotc3RydWN0IE1lZGlhUHVsbGVyIDogcHVibGljIEFIYW5kbGVyIHsKLSAgICBlbnVtIHsKLSAgICAgICAga1doYXRFT1MsCi0gICAgICAgIGtXaGF0QWNjZXNzVW5pdAotICAgIH07Ci0KLSAgICBNZWRpYVB1bGxlcihjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpOwotCi0gICAgc3RhdHVzX3Qgc3RhcnQoKTsKLSAgICB2b2lkIHN0b3BBc3luYyhjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSk7Ci0KLSAgICB2b2lkIHBhdXNlKCk7Ci0gICAgdm9pZCByZXN1bWUoKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7Ci0gICAgdmlydHVhbCB+TWVkaWFQdWxsZXIoKTsKLQotcHJpdmF0ZToKLSAgICBlbnVtIHsKLSAgICAgICAga1doYXRTdGFydCwKLSAgICAgICAga1doYXRTdG9wLAotICAgICAgICBrV2hhdFB1bGwsCi0gICAgICAgIGtXaGF0UGF1c2UsCi0gICAgICAgIGtXaGF0UmVzdW1lLAotICAgIH07Ci0KLSAgICBzcDxNZWRpYVNvdXJjZT4gbVNvdXJjZTsKLSAgICBzcDxBTWVzc2FnZT4gbU5vdGlmeTsKLSAgICBpbnQzMl90IG1QdWxsR2VuZXJhdGlvbjsKLSAgICBib29sIG1Jc0F1ZGlvOwotICAgIGJvb2wgbVBhdXNlZDsKLQotICAgIHN0YXR1c190IHBvc3RTeW5jaHJvbm91c2x5QW5kUmV0dXJuRXJyb3IoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwotICAgIHZvaWQgc2NoZWR1bGVQdWxsKCk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNZWRpYVB1bGxlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIE1FRElBX1BVTExFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9QbGF5YmFja1Nlc3Npb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9QbGF5YmFja1Nlc3Npb24uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWVjY2EwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvUGxheWJhY2tTZXNzaW9uLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExMTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDEyLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJQbGF5YmFja1Nlc3Npb24iCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJQbGF5YmFja1Nlc3Npb24uaCIKLQotI2luY2x1ZGUgIkNvbnZlcnRlci5oIgotI2luY2x1ZGUgIk1lZGlhUHVsbGVyLmgiCi0jaW5jbHVkZSAiUmVwZWF0ZXJTb3VyY2UuaCIKLSNpbmNsdWRlICJpbmNsdWRlL2F2Y191dGlscy5oIgotI2luY2x1ZGUgIldpZmlEaXNwbGF5U291cmNlLmgiCi0KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLSNpbmNsdWRlIDxtZWRpYS9JSERDUC5oPgotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KLQotI2luY2x1ZGUgPE9NWF9JVkNvbW1vbi5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBXaWZpRGlzcGxheVNvdXJjZTo6UGxheWJhY2tTZXNzaW9uOjpUcmFjayA6IHB1YmxpYyBBSGFuZGxlciB7Ci0gICAgZW51bSB7Ci0gICAgICAgIGtXaGF0U3RvcHBlZCwKLSAgICB9OwotCi0gICAgVHJhY2soY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCi0gICAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gJnB1bGxMb29wZXIsCi0gICAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gJmNvZGVjTG9vcGVyLAotICAgICAgICAgIGNvbnN0IHNwPE1lZGlhUHVsbGVyPiAmbWVkaWFQdWxsZXIsCi0gICAgICAgICAgY29uc3Qgc3A8Q29udmVydGVyPiAmY29udmVydGVyKTsKLQotICAgIFRyYWNrKGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCk7Ci0KLSAgICB2b2lkIHNldFJlcGVhdGVyU291cmNlKGNvbnN0IHNwPFJlcGVhdGVyU291cmNlPiAmc291cmNlKTsKLQotICAgIHNwPEFNZXNzYWdlPiBnZXRGb3JtYXQoKTsKLSAgICBib29sIGlzQXVkaW8oKSBjb25zdDsKLQotICAgIGNvbnN0IHNwPENvbnZlcnRlcj4gJmNvbnZlcnRlcigpIGNvbnN0OwotICAgIGNvbnN0IHNwPFJlcGVhdGVyU291cmNlPiAmcmVwZWF0ZXJTb3VyY2UoKSBjb25zdDsKLQotICAgIHNzaXplX3QgbWVkaWFTZW5kZXJUcmFja0luZGV4KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRNZWRpYVNlbmRlclRyYWNrSW5kZXgoc2l6ZV90IGluZGV4KTsKLQotICAgIHN0YXR1c190IHN0YXJ0KCk7Ci0gICAgdm9pZCBzdG9wQXN5bmMoKTsKLQotICAgIHZvaWQgcGF1c2UoKTsKLSAgICB2b2lkIHJlc3VtZSgpOwotCi0gICAgdm9pZCBxdWV1ZUFjY2Vzc1VuaXQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpOwotICAgIHNwPEFCdWZmZXI+IGRlcXVldWVBY2Nlc3NVbml0KCk7Ci0KLSAgICBib29sIGhhc091dHB1dEJ1ZmZlcihpbnQ2NF90ICp0aW1lVXMpIGNvbnN0OwotICAgIHZvaWQgcXVldWVPdXRwdXRCdWZmZXIoY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpOwotICAgIHNwPEFCdWZmZXI+IGRlcXVldWVPdXRwdXRCdWZmZXIoKTsKLQotI2lmIFNVU1BFTkRfVklERU9fSUZfSURMRQotICAgIGJvb2wgaXNTdXNwZW5kZWQoKSBjb25zdDsKLSNlbmRpZgotCi0gICAgc2l6ZV90IGNvdW50UXVldWVkT3V0cHV0QnVmZmVycygpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1RdWV1ZWRPdXRwdXRCdWZmZXJzLnNpemUoKTsKLSAgICB9Ci0KLSAgICB2b2lkIHJlcXVlc3RJRFJGcmFtZSgpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKLSAgICB2aXJ0dWFsIH5UcmFjaygpOwotCi1wcml2YXRlOgotICAgIGVudW0gewotICAgICAgICBrV2hhdE1lZGlhUHVsbGVyU3RvcHBlZCwKLSAgICB9OwotCi0gICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7Ci0gICAgc3A8QUxvb3Blcj4gbVB1bGxMb29wZXI7Ci0gICAgc3A8QUxvb3Blcj4gbUNvZGVjTG9vcGVyOwotICAgIHNwPE1lZGlhUHVsbGVyPiBtTWVkaWFQdWxsZXI7Ci0gICAgc3A8Q29udmVydGVyPiBtQ29udmVydGVyOwotICAgIHNwPEFNZXNzYWdlPiBtRm9ybWF0OwotICAgIGJvb2wgbVN0YXJ0ZWQ7Ci0gICAgc3NpemVfdCBtTWVkaWFTZW5kZXJUcmFja0luZGV4OwotICAgIGJvb2wgbUlzQXVkaW87Ci0gICAgTGlzdDxzcDxBQnVmZmVyPiA+IG1RdWV1ZWRBY2Nlc3NVbml0czsKLSAgICBzcDxSZXBlYXRlclNvdXJjZT4gbVJlcGVhdGVyU291cmNlOwotICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPiBtUXVldWVkT3V0cHV0QnVmZmVyczsKLSAgICBpbnQ2NF90IG1MYXN0T3V0cHV0QnVmZmVyUXVldWVkVGltZVVzOwotCi0gICAgc3RhdGljIGJvb2wgSXNBdWRpb0Zvcm1hdChjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhUcmFjayk7Ci19OwotCi1XaWZpRGlzcGxheVNvdXJjZTo6UGxheWJhY2tTZXNzaW9uOjpUcmFjazo6VHJhY2soCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAotICAgICAgICBjb25zdCBzcDxBTG9vcGVyPiAmcHVsbExvb3BlciwKLSAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gJmNvZGVjTG9vcGVyLAotICAgICAgICBjb25zdCBzcDxNZWRpYVB1bGxlcj4gJm1lZGlhUHVsbGVyLAotICAgICAgICBjb25zdCBzcDxDb252ZXJ0ZXI+ICZjb252ZXJ0ZXIpCi0gICAgOiBtTm90aWZ5KG5vdGlmeSksCi0gICAgICBtUHVsbExvb3BlcihwdWxsTG9vcGVyKSwKLSAgICAgIG1Db2RlY0xvb3Blcihjb2RlY0xvb3BlciksCi0gICAgICBtTWVkaWFQdWxsZXIobWVkaWFQdWxsZXIpLAotICAgICAgbUNvbnZlcnRlcihjb252ZXJ0ZXIpLAotICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAotICAgICAgbUlzQXVkaW8oSXNBdWRpb0Zvcm1hdChtQ29udmVydGVyLT5nZXRPdXRwdXRGb3JtYXQoKSkpLAotICAgICAgbUxhc3RPdXRwdXRCdWZmZXJRdWV1ZWRUaW1lVXMoLTFsbCkgewotfQotCi1XaWZpRGlzcGxheVNvdXJjZTo6UGxheWJhY2tTZXNzaW9uOjpUcmFjazo6VHJhY2soCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkKLSAgICA6IG1Ob3RpZnkobm90aWZ5KSwKLSAgICAgIG1Gb3JtYXQoZm9ybWF0KSwKLSAgICAgIG1TdGFydGVkKGZhbHNlKSwKLSAgICAgIG1Jc0F1ZGlvKElzQXVkaW9Gb3JtYXQoZm9ybWF0KSksCi0gICAgICBtTGFzdE91dHB1dEJ1ZmZlclF1ZXVlZFRpbWVVcygtMWxsKSB7Ci19Ci0KLVdpZmlEaXNwbGF5U291cmNlOjpQbGF5YmFja1Nlc3Npb246OlRyYWNrOjp+VHJhY2soKSB7Ci0gICAgQ0hFQ0soIW1TdGFydGVkKTsKLX0KLQotLy8gc3RhdGljCi1ib29sIFdpZmlEaXNwbGF5U291cmNlOjpQbGF5YmFja1Nlc3Npb246OlRyYWNrOjpJc0F1ZGlvRm9ybWF0KAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgewotICAgIEFTdHJpbmcgbWltZTsKLSAgICBDSEVDSyhmb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOwotCi0gICAgcmV0dXJuICFzdHJuY2FzZWNtcChtaW1lLmNfc3RyKCksICJhdWRpby8iLCA2KTsKLX0KLQotc3A8QU1lc3NhZ2U+IFdpZmlEaXNwbGF5U291cmNlOjpQbGF5YmFja1Nlc3Npb246OlRyYWNrOjpnZXRGb3JtYXQoKSB7Ci0gICAgcmV0dXJuIG1Gb3JtYXQgIT0gTlVMTCA/IG1Gb3JtYXQgOiBtQ29udmVydGVyLT5nZXRPdXRwdXRGb3JtYXQoKTsKLX0KLQotYm9vbCBXaWZpRGlzcGxheVNvdXJjZTo6UGxheWJhY2tTZXNzaW9uOjpUcmFjazo6aXNBdWRpbygpIGNvbnN0IHsKLSAgICByZXR1cm4gbUlzQXVkaW87Ci19Ci0KLWNvbnN0IHNwPENvbnZlcnRlcj4gJldpZmlEaXNwbGF5U291cmNlOjpQbGF5YmFja1Nlc3Npb246OlRyYWNrOjpjb252ZXJ0ZXIoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Db252ZXJ0ZXI7Ci19Ci0KLWNvbnN0IHNwPFJlcGVhdGVyU291cmNlPiAmCi1XaWZpRGlzcGxheVNvdXJjZTo6UGxheWJhY2tTZXNzaW9uOjpUcmFjazo6cmVwZWF0ZXJTb3VyY2UoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1SZXBlYXRlclNvdXJjZTsKLX0KLQotc3NpemVfdCBXaWZpRGlzcGxheVNvdXJjZTo6UGxheWJhY2tTZXNzaW9uOjpUcmFjazo6bWVkaWFTZW5kZXJUcmFja0luZGV4KCkgY29uc3QgewotICAgIENIRUNLX0dFKG1NZWRpYVNlbmRlclRyYWNrSW5kZXgsIDApOwotICAgIHJldHVybiBtTWVkaWFTZW5kZXJUcmFja0luZGV4OwotfQotCi12b2lkIFdpZmlEaXNwbGF5U291cmNlOjpQbGF5YmFja1Nlc3Npb246OlRyYWNrOjpzZXRNZWRpYVNlbmRlclRyYWNrSW5kZXgoCi0gICAgICAgIHNpemVfdCBpbmRleCkgewotICAgIG1NZWRpYVNlbmRlclRyYWNrSW5kZXggPSBpbmRleDsKLX0KLQotc3RhdHVzX3QgV2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbjo6VHJhY2s6OnN0YXJ0KCkgewotICAgIEFMT0dWKCJUcmFjazo6c3RhcnQgaXNBdWRpbz0lZCIsIG1Jc0F1ZGlvKTsKLQotICAgIENIRUNLKCFtU3RhcnRlZCk7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLQotICAgIGlmIChtTWVkaWFQdWxsZXIgIT0gTlVMTCkgewotICAgICAgICBlcnIgPSBtTWVkaWFQdWxsZXItPnN0YXJ0KCk7Ci0gICAgfQotCi0gICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICBtU3RhcnRlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotdm9pZCBXaWZpRGlzcGxheVNvdXJjZTo6UGxheWJhY2tTZXNzaW9uOjpUcmFjazo6c3RvcEFzeW5jKCkgewotICAgIEFMT0dWKCJUcmFjazo6c3RvcEFzeW5jIGlzQXVkaW89JWQiLCBtSXNBdWRpbyk7Ci0KLSAgICBpZiAobUNvbnZlcnRlciAhPSBOVUxMKSB7Ci0gICAgICAgIG1Db252ZXJ0ZXItPnNodXRkb3duQXN5bmMoKTsKLSAgICB9Ci0KLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0TWVkaWFQdWxsZXJTdG9wcGVkLCB0aGlzKTsKLQotICAgIGlmIChtU3RhcnRlZCAmJiBtTWVkaWFQdWxsZXIgIT0gTlVMTCkgewotICAgICAgICBpZiAobVJlcGVhdGVyU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgIC8vIExldCdzIHVuYmxvY2sgTWVkaWFQdWxsZXIncyBNZWRpYVNvdXJjZTo6cmVhZCgpLgotICAgICAgICAgICAgbVJlcGVhdGVyU291cmNlLT53YWtlVXAoKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1NZWRpYVB1bGxlci0+c3RvcEFzeW5jKG1zZyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICAgICAgbXNnLT5wb3N0KCk7Ci0gICAgfQotfQotCi12b2lkIFdpZmlEaXNwbGF5U291cmNlOjpQbGF5YmFja1Nlc3Npb246OlRyYWNrOjpwYXVzZSgpIHsKLSAgICBtTWVkaWFQdWxsZXItPnBhdXNlKCk7Ci19Ci0KLXZvaWQgV2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbjo6VHJhY2s6OnJlc3VtZSgpIHsKLSAgICBtTWVkaWFQdWxsZXItPnJlc3VtZSgpOwotfQotCi12b2lkIFdpZmlEaXNwbGF5U291cmNlOjpQbGF5YmFja1Nlc3Npb246OlRyYWNrOjpvbk1lc3NhZ2VSZWNlaXZlZCgKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7Ci0gICAgICAgIGNhc2Uga1doYXRNZWRpYVB1bGxlclN0b3BwZWQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1Db252ZXJ0ZXIuY2xlYXIoKTsKLQotICAgICAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLQotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0U3RvcHBlZCk7Ci0gICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKLQotICAgICAgICAgICAgQUxPR0koImtXaGF0U3RvcHBlZCAlcyBwb3N0ZWQiLCBtSXNBdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFRSRVNQQVNTKCk7Ci0gICAgfQotfQotCi12b2lkIFdpZmlEaXNwbGF5U291cmNlOjpQbGF5YmFja1Nlc3Npb246OlRyYWNrOjpxdWV1ZUFjY2Vzc1VuaXQoCi0gICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KSB7Ci0gICAgbVF1ZXVlZEFjY2Vzc1VuaXRzLnB1c2hfYmFjayhhY2Nlc3NVbml0KTsKLX0KLQotc3A8QUJ1ZmZlcj4gV2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbjo6VHJhY2s6OmRlcXVldWVBY2Nlc3NVbml0KCkgewotICAgIGlmIChtUXVldWVkQWNjZXNzVW5pdHMuZW1wdHkoKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0ID0gKm1RdWV1ZWRBY2Nlc3NVbml0cy5iZWdpbigpOwotICAgIENIRUNLKGFjY2Vzc1VuaXQgIT0gTlVMTCk7Ci0KLSAgICBtUXVldWVkQWNjZXNzVW5pdHMuZXJhc2UobVF1ZXVlZEFjY2Vzc1VuaXRzLmJlZ2luKCkpOwotCi0gICAgcmV0dXJuIGFjY2Vzc1VuaXQ7Ci19Ci0KLXZvaWQgV2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbjo6VHJhY2s6OnNldFJlcGVhdGVyU291cmNlKAotICAgICAgICBjb25zdCBzcDxSZXBlYXRlclNvdXJjZT4gJnNvdXJjZSkgewotICAgIG1SZXBlYXRlclNvdXJjZSA9IHNvdXJjZTsKLX0KLQotdm9pZCBXaWZpRGlzcGxheVNvdXJjZTo6UGxheWJhY2tTZXNzaW9uOjpUcmFjazo6cmVxdWVzdElEUkZyYW1lKCkgewotICAgIGlmIChtSXNBdWRpbykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG1SZXBlYXRlclNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1SZXBlYXRlclNvdXJjZS0+d2FrZVVwKCk7Ci0gICAgfQotCi0gICAgbUNvbnZlcnRlci0+cmVxdWVzdElEUkZyYW1lKCk7Ci19Ci0KLWJvb2wgV2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbjo6VHJhY2s6Omhhc091dHB1dEJ1ZmZlcigKLSAgICAgICAgaW50NjRfdCAqdGltZVVzKSBjb25zdCB7Ci0gICAgKnRpbWVVcyA9IDBsbDsKLQotICAgIGlmIChtUXVldWVkT3V0cHV0QnVmZmVycy5lbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBjb25zdCBzcDxBQnVmZmVyPiAmb3V0cHV0QnVmZmVyID0gKm1RdWV1ZWRPdXRwdXRCdWZmZXJzLmJlZ2luKCk7Ci0KLSAgICBDSEVDSyhvdXRwdXRCdWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpKTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIFdpZmlEaXNwbGF5U291cmNlOjpQbGF5YmFja1Nlc3Npb246OlRyYWNrOjpxdWV1ZU91dHB1dEJ1ZmZlcigKLSAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpIHsKLSAgICBtUXVldWVkT3V0cHV0QnVmZmVycy5wdXNoX2JhY2soYWNjZXNzVW5pdCk7Ci0gICAgbUxhc3RPdXRwdXRCdWZmZXJRdWV1ZWRUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwotfQotCi1zcDxBQnVmZmVyPiBXaWZpRGlzcGxheVNvdXJjZTo6UGxheWJhY2tTZXNzaW9uOjpUcmFjazo6ZGVxdWV1ZU91dHB1dEJ1ZmZlcigpIHsKLSAgICBDSEVDSyghbVF1ZXVlZE91dHB1dEJ1ZmZlcnMuZW1wdHkoKSk7Ci0KLSAgICBzcDxBQnVmZmVyPiBvdXRwdXRCdWZmZXIgPSAqbVF1ZXVlZE91dHB1dEJ1ZmZlcnMuYmVnaW4oKTsKLSAgICBtUXVldWVkT3V0cHV0QnVmZmVycy5lcmFzZShtUXVldWVkT3V0cHV0QnVmZmVycy5iZWdpbigpKTsKLQotICAgIHJldHVybiBvdXRwdXRCdWZmZXI7Ci19Ci0KLSNpZiBTVVNQRU5EX1ZJREVPX0lGX0lETEUKLWJvb2wgV2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbjo6VHJhY2s6OmlzU3VzcGVuZGVkKCkgY29uc3QgewotICAgIGlmICghbVF1ZXVlZE91dHB1dEJ1ZmZlcnMuZW1wdHkoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKG1MYXN0T3V0cHV0QnVmZmVyUXVldWVkVGltZVVzIDwgMGxsKSB7Ci0gICAgICAgIC8vIFdlJ3ZlIG5ldmVyIHNlZW4gYW4gb3V0cHV0IGJ1ZmZlciBxdWV1ZWQsIGJ1dCB0cmFja3Mgc3RhcnQKLSAgICAgICAgLy8gb3V0IGxpdmUsIG5vdCBzdXNwZW5kZWQuCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBJZiB3ZSd2ZSBub3Qgc2VlbiBuZXcgb3V0cHV0IGRhdGEgZm9yIDYwbXMgb3IgbW9yZSwgd2UgY29uc2lkZXIKLSAgICAvLyB0aGlzIHRyYWNrIHN1c3BlbmRlZCBmb3IgdGhlIHRpbWUgYmVpbmcuCi0gICAgcmV0dXJuIChBTG9vcGVyOjpHZXROb3dVcygpIC0gbUxhc3RPdXRwdXRCdWZmZXJRdWV1ZWRUaW1lVXMpID4gNjAwMDBsbDsKLX0KLSNlbmRpZgotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1XaWZpRGlzcGxheVNvdXJjZTo6UGxheWJhY2tTZXNzaW9uOjpQbGF5YmFja1Nlc3Npb24oCi0gICAgICAgIGNvbnN0IFN0cmluZzE2ICZvcFBhY2thZ2VOYW1lLAotICAgICAgICBjb25zdCBzcDxBTmV0d29ya1Nlc3Npb24+ICZuZXRTZXNzaW9uLAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKLSAgICAgICAgY29uc3QgaW5fYWRkciAmaW50ZXJmYWNlQWRkciwKLSAgICAgICAgY29uc3Qgc3A8SUhEQ1A+ICZoZGNwLAotICAgICAgICBjb25zdCBjaGFyICpwYXRoKQotICAgIDogbU9wUGFja2FnZU5hbWUob3BQYWNrYWdlTmFtZSksCi0gICAgICBtTmV0U2Vzc2lvbihuZXRTZXNzaW9uKSwKLSAgICAgIG1Ob3RpZnkobm90aWZ5KSwKLSAgICAgIG1JbnRlcmZhY2VBZGRyKGludGVyZmFjZUFkZHIpLAotICAgICAgbUhEQ1AoaGRjcCksCi0gICAgICBtTG9jYWxSVFBQb3J0KC0xKSwKLSAgICAgIG1XZUFyZURlYWQoZmFsc2UpLAotICAgICAgbVBhdXNlZChmYWxzZSksCi0gICAgICBtTGFzdExpZmVzaWduVXMoKSwKLSAgICAgIG1WaWRlb1RyYWNrSW5kZXgoLTEpLAotICAgICAgbVByZXZUaW1lVXMoLTFsbCksCi0gICAgICBtUHVsbEV4dHJhY3RvclBlbmRpbmcoZmFsc2UpLAotICAgICAgbVB1bGxFeHRyYWN0b3JHZW5lcmF0aW9uKDApLAotICAgICAgbUZpcnN0U2FtcGxlVGltZVJlYWxVcygtMWxsKSwKLSAgICAgIG1GaXJzdFNhbXBsZVRpbWVVcygtMWxsKSB7Ci0gICAgaWYgKHBhdGggIT0gTlVMTCkgewotICAgICAgICBtTWVkaWFQYXRoLnNldFRvKHBhdGgpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgV2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbjo6aW5pdCgKLSAgICAgICAgY29uc3QgY2hhciAqY2xpZW50SVAsCi0gICAgICAgIGludDMyX3QgY2xpZW50UnRwLAotICAgICAgICBSVFBTZW5kZXI6OlRyYW5zcG9ydE1vZGUgcnRwTW9kZSwKLSAgICAgICAgaW50MzJfdCBjbGllbnRSdGNwLAotICAgICAgICBSVFBTZW5kZXI6OlRyYW5zcG9ydE1vZGUgcnRjcE1vZGUsCi0gICAgICAgIGJvb2wgZW5hYmxlQXVkaW8sCi0gICAgICAgIGJvb2wgdXNlUENNQXVkaW8sCi0gICAgICAgIGJvb2wgZW5hYmxlVmlkZW8sCi0gICAgICAgIFZpZGVvRm9ybWF0czo6UmVzb2x1dGlvblR5cGUgdmlkZW9SZXNvbHV0aW9uVHlwZSwKLSAgICAgICAgc2l6ZV90IHZpZGVvUmVzb2x1dGlvbkluZGV4LAotICAgICAgICBWaWRlb0Zvcm1hdHM6OlByb2ZpbGVUeXBlIHZpZGVvUHJvZmlsZVR5cGUsCi0gICAgICAgIFZpZGVvRm9ybWF0czo6TGV2ZWxUeXBlIHZpZGVvTGV2ZWxUeXBlKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdE1lZGlhU2VuZGVyTm90aWZ5LCB0aGlzKTsKLSAgICBtTWVkaWFTZW5kZXIgPSBuZXcgTWVkaWFTZW5kZXIobU5ldFNlc3Npb24sIG5vdGlmeSk7Ci0gICAgbG9vcGVyKCktPnJlZ2lzdGVySGFuZGxlcihtTWVkaWFTZW5kZXIpOwotCi0gICAgbU1lZGlhU2VuZGVyLT5zZXRIRENQKG1IRENQKTsKLQotICAgIHN0YXR1c190IGVyciA9IHNldHVwUGFja2V0aXplcigKLSAgICAgICAgICAgIGVuYWJsZUF1ZGlvLAotICAgICAgICAgICAgdXNlUENNQXVkaW8sCi0gICAgICAgICAgICBlbmFibGVWaWRlbywKLSAgICAgICAgICAgIHZpZGVvUmVzb2x1dGlvblR5cGUsCi0gICAgICAgICAgICB2aWRlb1Jlc29sdXRpb25JbmRleCwKLSAgICAgICAgICAgIHZpZGVvUHJvZmlsZVR5cGUsCi0gICAgICAgICAgICB2aWRlb0xldmVsVHlwZSk7Ci0KLSAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgIGVyciA9IG1NZWRpYVNlbmRlci0+aW5pdEFzeW5jKAotICAgICAgICAgICAgICAgIC0xIC8qIHRyYWNrSW5kZXggKi8sCi0gICAgICAgICAgICAgICAgY2xpZW50SVAsCi0gICAgICAgICAgICAgICAgY2xpZW50UnRwLAotICAgICAgICAgICAgICAgIHJ0cE1vZGUsCi0gICAgICAgICAgICAgICAgY2xpZW50UnRjcCwKLSAgICAgICAgICAgICAgICBydGNwTW9kZSwKLSAgICAgICAgICAgICAgICAmbUxvY2FsUlRQUG9ydCk7Ci0gICAgfQotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBtTG9jYWxSVFBQb3J0ID0gLTE7Ci0KLSAgICAgICAgbG9vcGVyKCktPnVucmVnaXN0ZXJIYW5kbGVyKG1NZWRpYVNlbmRlci0+aWQoKSk7Ci0gICAgICAgIG1NZWRpYVNlbmRlci5jbGVhcigpOwotCi0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgdXBkYXRlTGl2ZW5lc3MoKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotV2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbjo6flBsYXliYWNrU2Vzc2lvbigpIHsKLX0KLQotaW50MzJfdCBXaWZpRGlzcGxheVNvdXJjZTo6UGxheWJhY2tTZXNzaW9uOjpnZXRSVFBQb3J0KCkgY29uc3QgewotICAgIHJldHVybiBtTG9jYWxSVFBQb3J0OwotfQotCi1pbnQ2NF90IFdpZmlEaXNwbGF5U291cmNlOjpQbGF5YmFja1Nlc3Npb246OmdldExhc3RMaWZlc2lnblVzKCkgY29uc3QgewotICAgIHJldHVybiBtTGFzdExpZmVzaWduVXM7Ci19Ci0KLXZvaWQgV2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbjo6dXBkYXRlTGl2ZW5lc3MoKSB7Ci0gICAgbUxhc3RMaWZlc2lnblVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLX0KLQotc3RhdHVzX3QgV2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbjo6cGxheSgpIHsKLSAgICB1cGRhdGVMaXZlbmVzcygpOwotCi0gICAgKG5ldyBBTWVzc2FnZShrV2hhdFJlc3VtZSwgdGhpcykpLT5wb3N0KCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFdpZmlEaXNwbGF5U291cmNlOjpQbGF5YmFja1Nlc3Npb246Om9uTWVkaWFTZW5kZXJJbml0aWFsaXplZCgpIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBtVHJhY2tzLmVkaXRWYWx1ZUF0KGkpLT5zdGFydCgpKTsKLSAgICB9Ci0KLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0U2Vzc2lvbkVzdGFibGlzaGVkKTsKLSAgICBub3RpZnktPnBvc3QoKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgV2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbjo6cGF1c2UoKSB7Ci0gICAgdXBkYXRlTGl2ZW5lc3MoKTsKLQotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQYXVzZSwgdGhpcykpLT5wb3N0KCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgV2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbjo6ZGVzdHJveUFzeW5jKCkgewotICAgIEFMT0dJKCJkZXN0cm95QXN5bmMiKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7ICsraSkgewotICAgICAgICBtVHJhY2tzLnZhbHVlQXQoaSktPnN0b3BBc3luYygpOwotICAgIH0KLX0KLQotdm9pZCBXaWZpRGlzcGxheVNvdXJjZTo6UGxheWJhY2tTZXNzaW9uOjpvbk1lc3NhZ2VSZWNlaXZlZCgKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7Ci0gICAgICAgIGNhc2Uga1doYXRDb252ZXJ0ZXJOb3RpZnk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChtV2VBcmVEZWFkKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImRyb3BwaW5nIG1zZyAnJXMnIGJlY2F1c2Ugd2UncmUgZGVhZCIsCi0gICAgICAgICAgICAgICAgICAgICAgbXNnLT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOwotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludDMyX3Qgd2hhdDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ3aGF0IiwgJndoYXQpKTsKLQotICAgICAgICAgICAgc2l6ZV90IHRyYWNrSW5kZXg7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTaXplKCJ0cmFja0luZGV4IiwgJnRyYWNrSW5kZXgpKTsKLQotICAgICAgICAgICAgaWYgKHdoYXQgPT0gQ29udmVydGVyOjprV2hhdEFjY2Vzc1VuaXQpIHsKLSAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0OwotICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEJ1ZmZlcigiYWNjZXNzVW5pdCIsICZhY2Nlc3NVbml0KSk7Ci0KLSAgICAgICAgICAgICAgICBjb25zdCBzcDxUcmFjaz4gJnRyYWNrID0gbVRyYWNrcy52YWx1ZUZvcih0cmFja0luZGV4KTsKLQotICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1NZWRpYVNlbmRlci0+cXVldWVBY2Nlc3NVbml0KAotICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1lZGlhU2VuZGVyVHJhY2tJbmRleCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzVW5pdCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5vdGlmeVNlc3Npb25EZWFkKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IENvbnZlcnRlcjo6a1doYXRFT1MpIHsKLSAgICAgICAgICAgICAgICBDSEVDS19FUSh3aGF0LCBDb252ZXJ0ZXI6OmtXaGF0RU9TKTsKLQotICAgICAgICAgICAgICAgIEFMT0dJKCJvdXRwdXQgRU9TIG9uIHRyYWNrICV6dSIsIHRyYWNrSW5kZXgpOwotCi0gICAgICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IG1UcmFja3MuaW5kZXhPZktleSh0cmFja0luZGV4KTsKLSAgICAgICAgICAgICAgICBDSEVDS19HRShpbmRleCwgMCk7Ci0KLSAgICAgICAgICAgICAgICBjb25zdCBzcDxDb252ZXJ0ZXI+ICZjb252ZXJ0ZXIgPQotICAgICAgICAgICAgICAgICAgICBtVHJhY2tzLnZhbHVlQXQoaW5kZXgpLT5jb252ZXJ0ZXIoKTsKLSAgICAgICAgICAgICAgICBsb29wZXIoKS0+dW5yZWdpc3RlckhhbmRsZXIoY29udmVydGVyLT5pZCgpKTsKLQotICAgICAgICAgICAgICAgIG1UcmFja3MucmVtb3ZlSXRlbXNBdChpbmRleCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobVRyYWNrcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0koIlJlYWNoZWQgRU9TIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ICE9IENvbnZlcnRlcjo6a1doYXRTaHV0ZG93bkNvbXBsZXRlZCkgewotICAgICAgICAgICAgICAgIENIRUNLX0VRKHdoYXQsIENvbnZlcnRlcjo6a1doYXRFcnJvcik7Ci0KLSAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnI7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKLQotICAgICAgICAgICAgICAgIEFMT0dFKCJjb252ZXJ0ZXIgc2lnbmFsZWQgZXJyb3IgJWQiLCBlcnIpOwotCi0gICAgICAgICAgICAgICAgbm90aWZ5U2Vzc2lvbkRlYWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdE1lZGlhU2VuZGVyTm90aWZ5OgotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQzMl90IHdoYXQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigid2hhdCIsICZ3aGF0KSk7Ci0KLSAgICAgICAgICAgIGlmICh3aGF0ID09IE1lZGlhU2VuZGVyOjprV2hhdEluaXREb25lKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyOwotICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9uTWVkaWFTZW5kZXJJbml0aWFsaXplZCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG5vdGlmeVNlc3Npb25EZWFkKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IE1lZGlhU2VuZGVyOjprV2hhdEVycm9yKSB7Ci0gICAgICAgICAgICAgICAgbm90aWZ5U2Vzc2lvbkRlYWQoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBNZWRpYVNlbmRlcjo6a1doYXROZXR3b3JrU3RhbGwpIHsKLSAgICAgICAgICAgICAgICBzaXplX3QgbnVtQnl0ZXNRdWV1ZWQ7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU2l6ZSgibnVtQnl0ZXNRdWV1ZWQiLCAmbnVtQnl0ZXNRdWV1ZWQpKTsKLQotICAgICAgICAgICAgICAgIGlmIChtVmlkZW9UcmFja0luZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8VHJhY2s+ICZ2aWRlb1RyYWNrID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFja3MudmFsdWVGb3IobVZpZGVvVHJhY2tJbmRleCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc3A8Q29udmVydGVyPiBjb252ZXJ0ZXIgPSB2aWRlb1RyYWNrLT5jb252ZXJ0ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnZlcnRlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZXItPmRyb3BBRnJhbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBNZWRpYVNlbmRlcjo6a1doYXRJbmZvcm1TZW5kZXIpIHsKLSAgICAgICAgICAgICAgICBvblNpbmtGZWVkYmFjayhtc2cpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBUUkVTUEFTUygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0VHJhY2tOb3RpZnk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGludDMyX3Qgd2hhdDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ3aGF0IiwgJndoYXQpKTsKLQotICAgICAgICAgICAgc2l6ZV90IHRyYWNrSW5kZXg7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTaXplKCJ0cmFja0luZGV4IiwgJnRyYWNrSW5kZXgpKTsKLQotICAgICAgICAgICAgaWYgKHdoYXQgPT0gVHJhY2s6OmtXaGF0U3RvcHBlZCkgewotICAgICAgICAgICAgICAgIEFMT0dJKCJUcmFjayAlenUgc3RvcHBlZCIsIHRyYWNrSW5kZXgpOwotCi0gICAgICAgICAgICAgICAgc3A8VHJhY2s+IHRyYWNrID0gbVRyYWNrcy52YWx1ZUZvcih0cmFja0luZGV4KTsKLSAgICAgICAgICAgICAgICBsb29wZXIoKS0+dW5yZWdpc3RlckhhbmRsZXIodHJhY2stPmlkKCkpOwotICAgICAgICAgICAgICAgIG1UcmFja3MucmVtb3ZlSXRlbSh0cmFja0luZGV4KTsKLSAgICAgICAgICAgICAgICB0cmFjay5jbGVhcigpOwotCi0gICAgICAgICAgICAgICAgaWYgKCFtVHJhY2tzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HSSgibm90IGFsbCB0cmFja3MgYXJlIHN0b3BwZWQgeWV0Iik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGxvb3BlcigpLT51bnJlZ2lzdGVySGFuZGxlcihtTWVkaWFTZW5kZXItPmlkKCkpOwotICAgICAgICAgICAgICAgIG1NZWRpYVNlbmRlci5jbGVhcigpOwotCi0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFNlc3Npb25EZXN0cm95ZWQpOwotICAgICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0UGF1c2U6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChtRXh0cmFjdG9yICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICArK21QdWxsRXh0cmFjdG9yR2VuZXJhdGlvbjsKLSAgICAgICAgICAgICAgICBtRmlyc3RTYW1wbGVUaW1lUmVhbFVzID0gLTFsbDsKLSAgICAgICAgICAgICAgICBtRmlyc3RTYW1wbGVUaW1lVXMgPSAtMWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobVBhdXNlZCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgICAgICBtVHJhY2tzLmVkaXRWYWx1ZUF0KGkpLT5wYXVzZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtUGF1c2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdFJlc3VtZToKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG1FeHRyYWN0b3IgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHNjaGVkdWxlUHVsbEV4dHJhY3RvcigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIW1QYXVzZWQpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICAgICAgbVRyYWNrcy5lZGl0VmFsdWVBdChpKS0+cmVzdW1lKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1QYXVzZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdFB1bGxFeHRyYWN0b3JTYW1wbGU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKLQotICAgICAgICAgICAgaWYgKGdlbmVyYXRpb24gIT0gbVB1bGxFeHRyYWN0b3JHZW5lcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1QdWxsRXh0cmFjdG9yUGVuZGluZyA9IGZhbHNlOwotCi0gICAgICAgICAgICBvblB1bGxFeHRyYWN0b3IoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFRSRVNQQVNTKCk7Ci0gICAgfQotfQotCi12b2lkIFdpZmlEaXNwbGF5U291cmNlOjpQbGF5YmFja1Nlc3Npb246Om9uU2lua0ZlZWRiYWNrKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgaW50NjRfdCBhdmdMYXRlbmN5VXM7Ci0gICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoImF2Z0xhdGVuY3lVcyIsICZhdmdMYXRlbmN5VXMpKTsKLQotICAgIGludDY0X3QgbWF4TGF0ZW5jeVVzOwotICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJtYXhMYXRlbmN5VXMiLCAmbWF4TGF0ZW5jeVVzKSk7Ci0KLSAgICBBTE9HSSgic2luayByZXBvcnRzIGF2Zy4gbGF0ZW5jeSBvZiAlbGxkIG1zIChtYXggJWxsZCBtcykiLAotICAgICAgICAgIGF2Z0xhdGVuY3lVcyAvIDEwMDBsbCwKLSAgICAgICAgICBtYXhMYXRlbmN5VXMgLyAxMDAwbGwpOwotCi0gICAgaWYgKG1WaWRlb1RyYWNrSW5kZXggPj0gMCkgewotICAgICAgICBjb25zdCBzcDxUcmFjaz4gJnZpZGVvVHJhY2sgPSBtVHJhY2tzLnZhbHVlRm9yKG1WaWRlb1RyYWNrSW5kZXgpOwotICAgICAgICBzcDxDb252ZXJ0ZXI+IGNvbnZlcnRlciA9IHZpZGVvVHJhY2stPmNvbnZlcnRlcigpOwotCi0gICAgICAgIGlmIChjb252ZXJ0ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgaW50MzJfdCB2aWRlb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgIENvbnZlcnRlcjo6R2V0SW50MzJQcm9wZXJ0eSgibWVkaWEud2ZkLnZpZGVvLWJpdHJhdGUiLCAtMSk7Ci0KLSAgICAgICAgICAgIGNoYXIgdmFsW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgICAgICAgICBpZiAodmlkZW9CaXRyYXRlIDwgMAotICAgICAgICAgICAgICAgICAgICAmJiBwcm9wZXJ0eV9nZXQoIm1lZGlhLndmZC52aWRlby1iaXRyYXRlIiwgdmFsLCBOVUxMKQotICAgICAgICAgICAgICAgICAgICAmJiAhc3RyY2FzZWNtcCgiYWRhcHRpdmUiLCB2YWwpKSB7Ci0gICAgICAgICAgICAgICAgdmlkZW9CaXRyYXRlID0gY29udmVydGVyLT5nZXRWaWRlb0JpdHJhdGUoKTsKLQotICAgICAgICAgICAgICAgIGlmIChhdmdMYXRlbmN5VXMgPiAzMDAwMDBsbCkgewotICAgICAgICAgICAgICAgICAgICB2aWRlb0JpdHJhdGUgKj0gMC42OwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXZnTGF0ZW5jeVVzIDwgMTAwMDAwbGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdmlkZW9CaXRyYXRlICo9IDEuMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh2aWRlb0JpdHJhdGUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHZpZGVvQml0cmF0ZSA8IDUwMDAwMCkgewotICAgICAgICAgICAgICAgICAgICB2aWRlb0JpdHJhdGUgPSA1MDAwMDA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2aWRlb0JpdHJhdGUgPiAxMDAwMDAwMCkgewotICAgICAgICAgICAgICAgICAgICB2aWRlb0JpdHJhdGUgPSAxMDAwMDAwMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAodmlkZW9CaXRyYXRlICE9IGNvbnZlcnRlci0+Z2V0VmlkZW9CaXRyYXRlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0koInNldHRpbmcgdmlkZW8gYml0cmF0ZSB0byAlZCBicHMiLCB2aWRlb0JpdHJhdGUpOwotCi0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlci0+c2V0VmlkZW9CaXRyYXRlKHZpZGVvQml0cmF0ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc3A8UmVwZWF0ZXJTb3VyY2U+IHJlcGVhdGVyU291cmNlID0gdmlkZW9UcmFjay0+cmVwZWF0ZXJTb3VyY2UoKTsKLSAgICAgICAgaWYgKHJlcGVhdGVyU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGRvdWJsZSByYXRlSHogPQotICAgICAgICAgICAgICAgIENvbnZlcnRlcjo6R2V0SW50MzJQcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJtZWRpYS53ZmQudmlkZW8tZnJhbWVyYXRlIiwgLTEpOwotCi0gICAgICAgICAgICBjaGFyIHZhbFtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgICAgICAgICAgaWYgKHJhdGVIeiA8IDAuMAotICAgICAgICAgICAgICAgICAgICAmJiBwcm9wZXJ0eV9nZXQoIm1lZGlhLndmZC52aWRlby1mcmFtZXJhdGUiLCB2YWwsIE5VTEwpCi0gICAgICAgICAgICAgICAgICAgICYmICFzdHJjYXNlY21wKCJhZGFwdGl2ZSIsIHZhbCkpIHsKLSAgICAgICAgICAgICAgICAgcmF0ZUh6ID0gcmVwZWF0ZXJTb3VyY2UtPmdldEZyYW1lUmF0ZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGF2Z0xhdGVuY3lVcyA+IDMwMDAwMGxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJhdGVIeiAqPSAwLjk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhdmdMYXRlbmN5VXMgPCAyMDAwMDBsbCkgewotICAgICAgICAgICAgICAgICAgICByYXRlSHogKj0gMS4xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHJhdGVIeiA+IDApIHsKLSAgICAgICAgICAgICAgICBpZiAocmF0ZUh6IDwgNS4wKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJhdGVIeiA9IDUuMDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJhdGVIeiA+IDMwLjApIHsKLSAgICAgICAgICAgICAgICAgICAgcmF0ZUh6ID0gMzAuMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocmF0ZUh6ICE9IHJlcGVhdGVyU291cmNlLT5nZXRGcmFtZVJhdGUoKSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HSSgic2V0dGluZyBmcmFtZSByYXRlIHRvICUuMmYgSHoiLCByYXRlSHopOwotCi0gICAgICAgICAgICAgICAgICAgIHJlcGVhdGVyU291cmNlLT5zZXRGcmFtZVJhdGUocmF0ZUh6KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXR1c190IFdpZmlEaXNwbGF5U291cmNlOjpQbGF5YmFja1Nlc3Npb246OnNldHVwTWVkaWFQYWNrZXRpemVyKAotICAgICAgICBib29sIGVuYWJsZUF1ZGlvLCBib29sIGVuYWJsZVZpZGVvKSB7Ci0gICAgbUV4dHJhY3RvciA9IG5ldyBOdU1lZGlhRXh0cmFjdG9yOwotCi0gICAgc3RhdHVzX3QgZXJyID0gbUV4dHJhY3Rvci0+c2V0RGF0YVNvdXJjZSgKLSAgICAgICAgICAgIE5VTEwgLyogaHR0cFNlcnZpY2UgKi8sIG1NZWRpYVBhdGguY19zdHIoKSk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgc2l6ZV90IG4gPSBtRXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOwotICAgIGJvb2wgaGF2ZUF1ZGlvID0gZmFsc2U7Ci0gICAgYm9vbCBoYXZlVmlkZW8gPSBmYWxzZTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG47ICsraSkgewotICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OwotICAgICAgICBlcnIgPSBtRXh0cmFjdG9yLT5nZXRUcmFja0Zvcm1hdChpLCAmZm9ybWF0KTsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIEFTdHJpbmcgbWltZTsKLSAgICAgICAgQ0hFQ0soZm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKLQotICAgICAgICBib29sIGlzQXVkaW8gPSAhc3RybmNhc2VjbXAobWltZS5jX3N0cigpLCAiYXVkaW8vIiwgNik7Ci0gICAgICAgIGJvb2wgaXNWaWRlbyA9ICFzdHJuY2FzZWNtcChtaW1lLmNfc3RyKCksICJ2aWRlby8iLCA2KTsKLQotICAgICAgICBpZiAoaXNBdWRpbyAmJiBlbmFibGVBdWRpbyAmJiAhaGF2ZUF1ZGlvKSB7Ci0gICAgICAgICAgICBoYXZlQXVkaW8gPSB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKGlzVmlkZW8gJiYgZW5hYmxlVmlkZW8gJiYgIWhhdmVWaWRlbykgewotICAgICAgICAgICAgaGF2ZVZpZGVvID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gbUV4dHJhY3Rvci0+c2VsZWN0VHJhY2soaSk7Ci0KLSAgICAgICAgc2l6ZV90IHRyYWNrSW5kZXggPSBtVHJhY2tzLnNpemUoKTsKLQotICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0VHJhY2tOb3RpZnksIHRoaXMpOwotICAgICAgICBub3RpZnktPnNldFNpemUoInRyYWNrSW5kZXgiLCB0cmFja0luZGV4KTsKLQotICAgICAgICBzcDxUcmFjaz4gdHJhY2sgPSBuZXcgVHJhY2sobm90aWZ5LCBmb3JtYXQpOwotICAgICAgICBsb29wZXIoKS0+cmVnaXN0ZXJIYW5kbGVyKHRyYWNrKTsKLQotICAgICAgICBtVHJhY2tzLmFkZCh0cmFja0luZGV4LCB0cmFjayk7Ci0KLSAgICAgICAgbUV4dHJhY3RvclRyYWNrVG9JbnRlcm5hbFRyYWNrLmFkZChpLCB0cmFja0luZGV4KTsKLQotICAgICAgICBpZiAoaXNWaWRlbykgewotICAgICAgICAgICAgbVZpZGVvVHJhY2tJbmRleCA9IHRyYWNrSW5kZXg7Ci0gICAgICAgIH0KLQotICAgICAgICB1aW50MzJfdCBmbGFncyA9IE1lZGlhU2VuZGVyOjpGTEFHX01BTlVBTExZX1BSRVBFTkRfU1BTX1BQUzsKLQotICAgICAgICBzc2l6ZV90IG1lZGlhU2VuZGVyVHJhY2tJbmRleCA9Ci0gICAgICAgICAgICBtTWVkaWFTZW5kZXItPmFkZFRyYWNrKGZvcm1hdCwgZmxhZ3MpOwotICAgICAgICBDSEVDS19HRShtZWRpYVNlbmRlclRyYWNrSW5kZXgsIDApOwotCi0gICAgICAgIHRyYWNrLT5zZXRNZWRpYVNlbmRlclRyYWNrSW5kZXgobWVkaWFTZW5kZXJUcmFja0luZGV4KTsKLQotICAgICAgICBpZiAoKGhhdmVBdWRpbyB8fCAhZW5hYmxlQXVkaW8pICYmIChoYXZlVmlkZW8gfHwgIWVuYWJsZVZpZGVvKSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgV2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbjo6c2NoZWR1bGVQdWxsRXh0cmFjdG9yKCkgewotICAgIGlmIChtUHVsbEV4dHJhY3RvclBlbmRpbmcpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGludDY0X3QgZGVsYXlVcyA9IDEwMDAwMDA7IC8vIGRlZmF1bHQgZGVsYXkgaXMgMSBzZWMKLSAgICBpbnQ2NF90IHNhbXBsZVRpbWVVczsKLSAgICBzdGF0dXNfdCBlcnIgPSBtRXh0cmFjdG9yLT5nZXRTYW1wbGVUaW1lKCZzYW1wbGVUaW1lVXMpOwotCi0gICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLQotICAgICAgICBpZiAobUZpcnN0U2FtcGxlVGltZVJlYWxVcyA8IDBsbCkgewotICAgICAgICAgICAgbUZpcnN0U2FtcGxlVGltZVJlYWxVcyA9IG5vd1VzOwotICAgICAgICAgICAgbUZpcnN0U2FtcGxlVGltZVVzID0gc2FtcGxlVGltZVVzOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50NjRfdCB3aGVuVXMgPSBzYW1wbGVUaW1lVXMgLSBtRmlyc3RTYW1wbGVUaW1lVXMgKyBtRmlyc3RTYW1wbGVUaW1lUmVhbFVzOwotICAgICAgICBkZWxheVVzID0gd2hlblVzIC0gbm93VXM7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1coImNvdWxkIG5vdCBnZXQgc2FtcGxlIHRpbWUgKCVkKSIsIGVycik7Ci0gICAgfQotCi0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFB1bGxFeHRyYWN0b3JTYW1wbGUsIHRoaXMpOwotICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtUHVsbEV4dHJhY3RvckdlbmVyYXRpb24pOwotICAgIG1zZy0+cG9zdChkZWxheVVzKTsKLQotICAgIG1QdWxsRXh0cmFjdG9yUGVuZGluZyA9IHRydWU7Ci19Ci0KLXZvaWQgV2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbjo6b25QdWxsRXh0cmFjdG9yKCkgewotICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQgPSBuZXcgQUJ1ZmZlcigxMDI0ICogMTAyNCk7Ci0gICAgc3RhdHVzX3QgZXJyID0gbUV4dHJhY3Rvci0+cmVhZFNhbXBsZURhdGEoYWNjZXNzVW5pdCk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAvLyBFT1MuCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IHRpbWVVczsKLSAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIG1FeHRyYWN0b3ItPmdldFNhbXBsZVRpbWUoJnRpbWVVcykpOwotCi0gICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQ2NCgKLSAgICAgICAgICAgICJ0aW1lVXMiLCBtRmlyc3RTYW1wbGVUaW1lUmVhbFVzICsgdGltZVVzIC0gbUZpcnN0U2FtcGxlVGltZVVzKTsKLQotICAgIHNpemVfdCB0cmFja0luZGV4OwotICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywgbUV4dHJhY3Rvci0+Z2V0U2FtcGxlVHJhY2tJbmRleCgmdHJhY2tJbmRleCkpOwotCi0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENvbnZlcnRlck5vdGlmeSwgdGhpcyk7Ci0KLSAgICBtc2ctPnNldFNpemUoCi0gICAgICAgICAgICAidHJhY2tJbmRleCIsIG1FeHRyYWN0b3JUcmFja1RvSW50ZXJuYWxUcmFjay52YWx1ZUZvcih0cmFja0luZGV4KSk7Ci0KLSAgICBtc2ctPnNldEludDMyKCJ3aGF0IiwgQ29udmVydGVyOjprV2hhdEFjY2Vzc1VuaXQpOwotICAgIG1zZy0+c2V0QnVmZmVyKCJhY2Nlc3NVbml0IiwgYWNjZXNzVW5pdCk7Ci0gICAgbXNnLT5wb3N0KCk7Ci0KLSAgICBtRXh0cmFjdG9yLT5hZHZhbmNlKCk7Ci0KLSAgICBzY2hlZHVsZVB1bGxFeHRyYWN0b3IoKTsKLX0KLQotc3RhdHVzX3QgV2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbjo6c2V0dXBQYWNrZXRpemVyKAotICAgICAgICBib29sIGVuYWJsZUF1ZGlvLAotICAgICAgICBib29sIHVzZVBDTUF1ZGlvLAotICAgICAgICBib29sIGVuYWJsZVZpZGVvLAotICAgICAgICBWaWRlb0Zvcm1hdHM6OlJlc29sdXRpb25UeXBlIHZpZGVvUmVzb2x1dGlvblR5cGUsCi0gICAgICAgIHNpemVfdCB2aWRlb1Jlc29sdXRpb25JbmRleCwKLSAgICAgICAgVmlkZW9Gb3JtYXRzOjpQcm9maWxlVHlwZSB2aWRlb1Byb2ZpbGVUeXBlLAotICAgICAgICBWaWRlb0Zvcm1hdHM6OkxldmVsVHlwZSB2aWRlb0xldmVsVHlwZSkgewotICAgIENIRUNLKGVuYWJsZUF1ZGlvIHx8IGVuYWJsZVZpZGVvKTsKLQotICAgIGlmICghbU1lZGlhUGF0aC5lbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBzZXR1cE1lZGlhUGFja2V0aXplcihlbmFibGVBdWRpbywgZW5hYmxlVmlkZW8pOwotICAgIH0KLQotICAgIGlmIChlbmFibGVWaWRlbykgewotICAgICAgICBzdGF0dXNfdCBlcnIgPSBhZGRWaWRlb1NvdXJjZSgKLSAgICAgICAgICAgICAgICB2aWRlb1Jlc29sdXRpb25UeXBlLCB2aWRlb1Jlc29sdXRpb25JbmRleCwgdmlkZW9Qcm9maWxlVHlwZSwKLSAgICAgICAgICAgICAgICB2aWRlb0xldmVsVHlwZSk7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICghZW5hYmxlQXVkaW8pIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIHJldHVybiBhZGRBdWRpb1NvdXJjZSh1c2VQQ01BdWRpbyk7Ci19Ci0KLXN0YXR1c190IFdpZmlEaXNwbGF5U291cmNlOjpQbGF5YmFja1Nlc3Npb246OmFkZFNvdXJjZSgKLSAgICAgICAgYm9vbCBpc1ZpZGVvLCBjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSwgYm9vbCBpc1JlcGVhdGVyU291cmNlLAotICAgICAgICBib29sIHVzZVBDTUF1ZGlvLCB1bnNpZ25lZCBwcm9maWxlSWRjLCB1bnNpZ25lZCBsZXZlbElkYywKLSAgICAgICAgdW5zaWduZWQgY29uc3RyYWludFNldCwgc2l6ZV90ICpudW1JbnB1dEJ1ZmZlcnMpIHsKLSAgICBDSEVDSyghdXNlUENNQXVkaW8gfHwgIWlzVmlkZW8pOwotICAgIENIRUNLKCFpc1JlcGVhdGVyU291cmNlIHx8IGlzVmlkZW8pOwotICAgIENIRUNLKCFwcm9maWxlSWRjIHx8IGlzVmlkZW8pOwotICAgIENIRUNLKCFsZXZlbElkYyB8fCBpc1ZpZGVvKTsKLSAgICBDSEVDSyghY29uc3RyYWludFNldCB8fCBpc1ZpZGVvKTsKLQotICAgIHNwPEFMb29wZXI+IHB1bGxMb29wZXIgPSBuZXcgQUxvb3BlcjsKLSAgICBwdWxsTG9vcGVyLT5zZXROYW1lKCJwdWxsX2xvb3BlciIpOwotCi0gICAgcHVsbExvb3Blci0+c3RhcnQoCi0gICAgICAgICAgICBmYWxzZSAvKiBydW5PbkNhbGxpbmdUaHJlYWQgKi8sCi0gICAgICAgICAgICBmYWxzZSAvKiBjYW5DYWxsSmF2YSAqLywKLSAgICAgICAgICAgIFBSSU9SSVRZX0FVRElPKTsKLQotICAgIHNwPEFMb29wZXI+IGNvZGVjTG9vcGVyID0gbmV3IEFMb29wZXI7Ci0gICAgY29kZWNMb29wZXItPnNldE5hbWUoImNvZGVjX2xvb3BlciIpOwotCi0gICAgY29kZWNMb29wZXItPnN0YXJ0KAotICAgICAgICAgICAgZmFsc2UgLyogcnVuT25DYWxsaW5nVGhyZWFkICovLAotICAgICAgICAgICAgZmFsc2UgLyogY2FuQ2FsbEphdmEgKi8sCi0gICAgICAgICAgICBQUklPUklUWV9BVURJTyk7Ci0KLSAgICBzaXplX3QgdHJhY2tJbmRleDsKLQotICAgIHNwPEFNZXNzYWdlPiBub3RpZnk7Ci0KLSAgICB0cmFja0luZGV4ID0gbVRyYWNrcy5zaXplKCk7Ci0KLSAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OwotICAgIHN0YXR1c190IGVyciA9IGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZShzb3VyY2UtPmdldEZvcm1hdCgpLCAmZm9ybWF0KTsKLSAgICBDSEVDS19FUShlcnIsIChzdGF0dXNfdClPSyk7Ci0KLSAgICBpZiAoaXNWaWRlbykgewotICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7Ci0gICAgICAgIGZvcm1hdC0+c2V0SW50MzIoCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuX2lucHV0LW1ldGFkYXRhLWJ1ZmZlci10eXBlIiwga01ldGFkYXRhQnVmZmVyVHlwZUFOV0J1ZmZlcik7Ci0gICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImFuZHJvaWQuX3N0b3JlLW1ldGFkYXRhLWluLWJ1ZmZlcnMtb3V0cHV0IiwgKG1IRENQICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgJiYgKG1IRENQLT5nZXRDYXBzKCkgJiBIRENQTW9kdWxlOjpIRENQX0NBUFNfRU5DUllQVF9OQVRJVkUpKTsKLSAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigKLSAgICAgICAgICAgICAgICAiY29sb3ItZm9ybWF0IiwgT01YX0NPTE9SX0Zvcm1hdEFuZHJvaWRPcGFxdWUpOwotICAgICAgICBmb3JtYXQtPnNldEludDMyKCJwcm9maWxlLWlkYyIsIHByb2ZpbGVJZGMpOwotICAgICAgICBmb3JtYXQtPnNldEludDMyKCJsZXZlbC1pZGMiLCBsZXZlbElkYyk7Ci0gICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImNvbnN0cmFpbnQtc2V0IiwgY29uc3RyYWludFNldCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKHVzZVBDTUF1ZGlvKSB7Ci0gICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJwY20tZW5jb2RpbmciLCBrQXVkaW9FbmNvZGluZ1BjbTE2Yml0KTsKLSAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdENvbnZlcnRlck5vdGlmeSwgdGhpcyk7Ci0gICAgbm90aWZ5LT5zZXRTaXplKCJ0cmFja0luZGV4IiwgdHJhY2tJbmRleCk7Ci0KLSAgICBzcDxDb252ZXJ0ZXI+IGNvbnZlcnRlciA9IG5ldyBDb252ZXJ0ZXIobm90aWZ5LCBjb2RlY0xvb3BlciwgZm9ybWF0KTsKLQotICAgIGxvb3BlcigpLT5yZWdpc3RlckhhbmRsZXIoY29udmVydGVyKTsKLQotICAgIGVyciA9IGNvbnZlcnRlci0+aW5pdCgpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIiVzIGNvbnZlcnRlciByZXR1cm5lZCBlcnIgJWQiLCBpc1ZpZGVvID8gInZpZGVvIiA6ICJhdWRpbyIsIGVycik7Ci0KLSAgICAgICAgbG9vcGVyKCktPnVucmVnaXN0ZXJIYW5kbGVyKGNvbnZlcnRlci0+aWQoKSk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgbm90aWZ5ID0gbmV3IEFNZXNzYWdlKENvbnZlcnRlcjo6a1doYXRNZWRpYVB1bGxlck5vdGlmeSwgY29udmVydGVyKTsKLSAgICBub3RpZnktPnNldFNpemUoInRyYWNrSW5kZXgiLCB0cmFja0luZGV4KTsKLQotICAgIHNwPE1lZGlhUHVsbGVyPiBwdWxsZXIgPSBuZXcgTWVkaWFQdWxsZXIoc291cmNlLCBub3RpZnkpOwotICAgIHB1bGxMb29wZXItPnJlZ2lzdGVySGFuZGxlcihwdWxsZXIpOwotCi0gICAgaWYgKG51bUlucHV0QnVmZmVycyAhPSBOVUxMKSB7Ci0gICAgICAgICpudW1JbnB1dEJ1ZmZlcnMgPSBjb252ZXJ0ZXItPmdldElucHV0QnVmZmVyQ291bnQoKTsKLSAgICB9Ci0KLSAgICBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRUcmFja05vdGlmeSwgdGhpcyk7Ci0gICAgbm90aWZ5LT5zZXRTaXplKCJ0cmFja0luZGV4IiwgdHJhY2tJbmRleCk7Ci0KLSAgICBzcDxUcmFjaz4gdHJhY2sgPSBuZXcgVHJhY2soCi0gICAgICAgICAgICBub3RpZnksIHB1bGxMb29wZXIsIGNvZGVjTG9vcGVyLCBwdWxsZXIsIGNvbnZlcnRlcik7Ci0KLSAgICBpZiAoaXNSZXBlYXRlclNvdXJjZSkgewotICAgICAgICB0cmFjay0+c2V0UmVwZWF0ZXJTb3VyY2Uoc3RhdGljX2Nhc3Q8UmVwZWF0ZXJTb3VyY2UgKj4oc291cmNlLmdldCgpKSk7Ci0gICAgfQotCi0gICAgbG9vcGVyKCktPnJlZ2lzdGVySGFuZGxlcih0cmFjayk7Ci0KLSAgICBtVHJhY2tzLmFkZCh0cmFja0luZGV4LCB0cmFjayk7Ci0KLSAgICBpZiAoaXNWaWRlbykgewotICAgICAgICBtVmlkZW9UcmFja0luZGV4ID0gdHJhY2tJbmRleDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBmbGFncyA9IDA7Ci0gICAgaWYgKGNvbnZlcnRlci0+bmVlZFRvTWFudWFsbHlQcmVwZW5kU1BTUFBTKCkpIHsKLSAgICAgICAgZmxhZ3MgfD0gTWVkaWFTZW5kZXI6OkZMQUdfTUFOVUFMTFlfUFJFUEVORF9TUFNfUFBTOwotICAgIH0KLQotICAgIHNzaXplX3QgbWVkaWFTZW5kZXJUcmFja0luZGV4ID0KLSAgICAgICAgbU1lZGlhU2VuZGVyLT5hZGRUcmFjayhjb252ZXJ0ZXItPmdldE91dHB1dEZvcm1hdCgpLCBmbGFncyk7Ci0gICAgQ0hFQ0tfR0UobWVkaWFTZW5kZXJUcmFja0luZGV4LCAwKTsKLQotICAgIHRyYWNrLT5zZXRNZWRpYVNlbmRlclRyYWNrSW5kZXgobWVkaWFTZW5kZXJUcmFja0luZGV4KTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgV2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbjo6YWRkVmlkZW9Tb3VyY2UoCi0gICAgICAgIFZpZGVvRm9ybWF0czo6UmVzb2x1dGlvblR5cGUgdmlkZW9SZXNvbHV0aW9uVHlwZSwKLSAgICAgICAgc2l6ZV90IHZpZGVvUmVzb2x1dGlvbkluZGV4LAotICAgICAgICBWaWRlb0Zvcm1hdHM6OlByb2ZpbGVUeXBlIHZpZGVvUHJvZmlsZVR5cGUsCi0gICAgICAgIFZpZGVvRm9ybWF0czo6TGV2ZWxUeXBlIHZpZGVvTGV2ZWxUeXBlKSB7Ci0gICAgc2l6ZV90IHdpZHRoLCBoZWlnaHQsIGZyYW1lc1BlclNlY29uZDsKLSAgICBib29sIGludGVybGFjZWQ7Ci0gICAgQ0hFQ0soVmlkZW9Gb3JtYXRzOjpHZXRDb25maWd1cmF0aW9uKAotICAgICAgICAgICAgICAgIHZpZGVvUmVzb2x1dGlvblR5cGUsCi0gICAgICAgICAgICAgICAgdmlkZW9SZXNvbHV0aW9uSW5kZXgsCi0gICAgICAgICAgICAgICAgJndpZHRoLAotICAgICAgICAgICAgICAgICZoZWlnaHQsCi0gICAgICAgICAgICAgICAgJmZyYW1lc1BlclNlY29uZCwKLSAgICAgICAgICAgICAgICAmaW50ZXJsYWNlZCkpOwotCi0gICAgdW5zaWduZWQgcHJvZmlsZUlkYywgbGV2ZWxJZGMsIGNvbnN0cmFpbnRTZXQ7Ci0gICAgQ0hFQ0soVmlkZW9Gb3JtYXRzOjpHZXRQcm9maWxlTGV2ZWwoCi0gICAgICAgICAgICAgICAgdmlkZW9Qcm9maWxlVHlwZSwKLSAgICAgICAgICAgICAgICB2aWRlb0xldmVsVHlwZSwKLSAgICAgICAgICAgICAgICAmcHJvZmlsZUlkYywKLSAgICAgICAgICAgICAgICAmbGV2ZWxJZGMsCi0gICAgICAgICAgICAgICAgJmNvbnN0cmFpbnRTZXQpKTsKLQotICAgIHNwPFN1cmZhY2VNZWRpYVNvdXJjZT4gc291cmNlID0gbmV3IFN1cmZhY2VNZWRpYVNvdXJjZSh3aWR0aCwgaGVpZ2h0KTsKLQotICAgIHNvdXJjZS0+c2V0VXNlQWJzb2x1dGVUaW1lc3RhbXBzKCk7Ci0KLSAgICBzcDxSZXBlYXRlclNvdXJjZT4gdmlkZW9Tb3VyY2UgPQotICAgICAgICBuZXcgUmVwZWF0ZXJTb3VyY2Uoc291cmNlLCBmcmFtZXNQZXJTZWNvbmQpOwotCi0gICAgc2l6ZV90IG51bUlucHV0QnVmZmVyczsKLSAgICBzdGF0dXNfdCBlcnIgPSBhZGRTb3VyY2UoCi0gICAgICAgICAgICB0cnVlIC8qIGlzVmlkZW8gKi8sIHZpZGVvU291cmNlLCB0cnVlIC8qIGlzUmVwZWF0ZXJTb3VyY2UgKi8sCi0gICAgICAgICAgICBmYWxzZSAvKiB1c2VQQ01BdWRpbyAqLywgcHJvZmlsZUlkYywgbGV2ZWxJZGMsIGNvbnN0cmFpbnRTZXQsCi0gICAgICAgICAgICAmbnVtSW5wdXRCdWZmZXJzKTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlcnIgPSBzb3VyY2UtPnNldE1heEFjcXVpcmVkQnVmZmVyQ291bnQobnVtSW5wdXRCdWZmZXJzKTsKLSAgICBDSEVDS19FUShlcnIsIChzdGF0dXNfdClPSyk7Ci0KLSAgICBtUHJvZHVjZXIgPSBzb3VyY2UtPmdldFByb2R1Y2VyKCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFdpZmlEaXNwbGF5U291cmNlOjpQbGF5YmFja1Nlc3Npb246OmFkZEF1ZGlvU291cmNlKGJvb2wgdXNlUENNQXVkaW8pIHsKLSAgICBzcDxBdWRpb1NvdXJjZT4gYXVkaW9Tb3VyY2UgPSBuZXcgQXVkaW9Tb3VyY2UoCi0gICAgICAgICAgICBBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWCwKLSAgICAgICAgICAgIG1PcFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlUmF0ZSAqLywKLSAgICAgICAgICAgIDIgLyogY2hhbm5lbENvdW50ICovKTsKLQotICAgIGlmIChhdWRpb1NvdXJjZS0+aW5pdENoZWNrKCkgPT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGFkZFNvdXJjZSgKLSAgICAgICAgICAgICAgICBmYWxzZSAvKiBpc1ZpZGVvICovLCBhdWRpb1NvdXJjZSwgZmFsc2UgLyogaXNSZXBlYXRlclNvdXJjZSAqLywKLSAgICAgICAgICAgICAgICB1c2VQQ01BdWRpbywgMCAvKiBwcm9maWxlSWRjICovLCAwIC8qIGxldmVsSWRjICovLAotICAgICAgICAgICAgICAgIDAgLyogY29uc3RyYWludFNldCAqLywgTlVMTCAvKiBudW1JbnB1dEJ1ZmZlcnMgKi8pOwotICAgIH0KLQotICAgIEFMT0dXKCJVbmFibGUgdG8gaW5zdGFudGlhdGUgYXVkaW8gc291cmNlIik7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IFdpZmlEaXNwbGF5U291cmNlOjpQbGF5YmFja1Nlc3Npb246OmdldFN1cmZhY2VUZXh0dXJlKCkgewotICAgIHJldHVybiBtUHJvZHVjZXI7Ci19Ci0KLXZvaWQgV2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbjo6cmVxdWVzdElEUkZyYW1lKCkgewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7ICsraSkgewotICAgICAgICBjb25zdCBzcDxUcmFjaz4gJnRyYWNrID0gbVRyYWNrcy52YWx1ZUF0KGkpOwotCi0gICAgICAgIHRyYWNrLT5yZXF1ZXN0SURSRnJhbWUoKTsKLSAgICB9Ci19Ci0KLXZvaWQgV2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbjo6bm90aWZ5U2Vzc2lvbkRlYWQoKSB7Ci0gICAgLy8gSW5mb3JtIFdpZmlEaXNwbGF5U291cmNlIG9mIG91ciBwcmVtYXR1cmUgZGVhdGggKHdpc2gpLgotICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRTZXNzaW9uRGVhZCk7Ci0gICAgbm90aWZ5LT5wb3N0KCk7Ci0KLSAgICBtV2VBcmVEZWFkID0gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9QbGF5YmFja1Nlc3Npb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvUGxheWJhY2tTZXNzaW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NjczZGYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9QbGF5YmFja1Nlc3Npb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFBMQVlCQUNLX1NFU1NJT05fSF8KLQotI2RlZmluZSBQTEFZQkFDS19TRVNTSU9OX0hfCi0KLSNpbmNsdWRlICJNZWRpYVNlbmRlci5oIgotI2luY2x1ZGUgIlZpZGVvRm9ybWF0cy5oIgotI2luY2x1ZGUgIldpZmlEaXNwbGF5U291cmNlLmgiCi0KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBBQnVmZmVyOwotc3RydWN0IElIRENQOwotY2xhc3MgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKLXN0cnVjdCBNZWRpYVB1bGxlcjsKLXN0cnVjdCBNZWRpYVNvdXJjZTsKLXN0cnVjdCBNZWRpYVNlbmRlcjsKLXN0cnVjdCBOdU1lZGlhRXh0cmFjdG9yOwotCi0vLyBFbmNhcHN1bGF0ZXMgdGhlIHN0YXRlIG9mIGFuIFJUUC9SVENQIHNlc3Npb24gaW4gdGhlIGNvbnRleHQgb2Ygd2lmaQotLy8gZGlzcGxheS4KLXN0cnVjdCBXaWZpRGlzcGxheVNvdXJjZTo6UGxheWJhY2tTZXNzaW9uIDogcHVibGljIEFIYW5kbGVyIHsKLSAgICBQbGF5YmFja1Nlc3Npb24oCi0gICAgICAgICAgICBjb25zdCBTdHJpbmcxNiAmb3BQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgIGNvbnN0IHNwPEFOZXR3b3JrU2Vzc2lvbj4gJm5ldFNlc3Npb24sCi0gICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICZpbnRlcmZhY2VBZGRyLAotICAgICAgICAgICAgY29uc3Qgc3A8SUhEQ1A+ICZoZGNwLAotICAgICAgICAgICAgY29uc3QgY2hhciAqcGF0aCA9IE5VTEwpOwotCi0gICAgc3RhdHVzX3QgaW5pdCgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNsaWVudElQLAotICAgICAgICAgICAgaW50MzJfdCBjbGllbnRSdHAsCi0gICAgICAgICAgICBSVFBTZW5kZXI6OlRyYW5zcG9ydE1vZGUgcnRwTW9kZSwKLSAgICAgICAgICAgIGludDMyX3QgY2xpZW50UnRjcCwKLSAgICAgICAgICAgIFJUUFNlbmRlcjo6VHJhbnNwb3J0TW9kZSBydGNwTW9kZSwKLSAgICAgICAgICAgIGJvb2wgZW5hYmxlQXVkaW8sCi0gICAgICAgICAgICBib29sIHVzZVBDTUF1ZGlvLAotICAgICAgICAgICAgYm9vbCBlbmFibGVWaWRlbywKLSAgICAgICAgICAgIFZpZGVvRm9ybWF0czo6UmVzb2x1dGlvblR5cGUgdmlkZW9SZXNvbHV0aW9uVHlwZSwKLSAgICAgICAgICAgIHNpemVfdCB2aWRlb1Jlc29sdXRpb25JbmRleCwKLSAgICAgICAgICAgIFZpZGVvRm9ybWF0czo6UHJvZmlsZVR5cGUgdmlkZW9Qcm9maWxlVHlwZSwKLSAgICAgICAgICAgIFZpZGVvRm9ybWF0czo6TGV2ZWxUeXBlIHZpZGVvTGV2ZWxUeXBlKTsKLQotICAgIHZvaWQgZGVzdHJveUFzeW5jKCk7Ci0KLSAgICBpbnQzMl90IGdldFJUUFBvcnQoKSBjb25zdDsKLQotICAgIGludDY0X3QgZ2V0TGFzdExpZmVzaWduVXMoKSBjb25zdDsKLSAgICB2b2lkIHVwZGF0ZUxpdmVuZXNzKCk7Ci0KLSAgICBzdGF0dXNfdCBwbGF5KCk7Ci0gICAgc3RhdHVzX3QgZmluaXNoUGxheSgpOwotICAgIHN0YXR1c190IHBhdXNlKCk7Ci0KLSAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBnZXRTdXJmYWNlVGV4dHVyZSgpOwotCi0gICAgdm9pZCByZXF1ZXN0SURSRnJhbWUoKTsKLQotICAgIGVudW0gewotICAgICAgICBrV2hhdFNlc3Npb25EZWFkLAotICAgICAgICBrV2hhdEJpbmFyeURhdGEsCi0gICAgICAgIGtXaGF0U2Vzc2lvbkVzdGFibGlzaGVkLAotICAgICAgICBrV2hhdFNlc3Npb25EZXN0cm95ZWQsCi0gICAgfTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7Ci0gICAgdmlydHVhbCB+UGxheWJhY2tTZXNzaW9uKCk7Ci0KLXByaXZhdGU6Ci0gICAgc3RydWN0IFRyYWNrOwotCi0gICAgZW51bSB7Ci0gICAgICAgIGtXaGF0TWVkaWFQdWxsZXJOb3RpZnksCi0gICAgICAgIGtXaGF0Q29udmVydGVyTm90aWZ5LAotICAgICAgICBrV2hhdFRyYWNrTm90aWZ5LAotICAgICAgICBrV2hhdFVwZGF0ZVN1cmZhY2UsCi0gICAgICAgIGtXaGF0UGF1c2UsCi0gICAgICAgIGtXaGF0UmVzdW1lLAotICAgICAgICBrV2hhdE1lZGlhU2VuZGVyTm90aWZ5LAotICAgICAgICBrV2hhdFB1bGxFeHRyYWN0b3JTYW1wbGUsCi0gICAgfTsKLQotICAgIFN0cmluZzE2IG1PcFBhY2thZ2VOYW1lOwotCi0gICAgc3A8QU5ldHdvcmtTZXNzaW9uPiBtTmV0U2Vzc2lvbjsKLSAgICBzcDxBTWVzc2FnZT4gbU5vdGlmeTsKLSAgICBpbl9hZGRyIG1JbnRlcmZhY2VBZGRyOwotICAgIHNwPElIRENQPiBtSERDUDsKLSAgICBBU3RyaW5nIG1NZWRpYVBhdGg7Ci0KLSAgICBzcDxNZWRpYVNlbmRlcj4gbU1lZGlhU2VuZGVyOwotICAgIGludDMyX3QgbUxvY2FsUlRQUG9ydDsKLQotICAgIGJvb2wgbVdlQXJlRGVhZDsKLSAgICBib29sIG1QYXVzZWQ7Ci0KLSAgICBpbnQ2NF90IG1MYXN0TGlmZXNpZ25VczsKLQotICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG1Qcm9kdWNlcjsKLQotICAgIEtleWVkVmVjdG9yPHNpemVfdCwgc3A8VHJhY2s+ID4gbVRyYWNrczsKLSAgICBzc2l6ZV90IG1WaWRlb1RyYWNrSW5kZXg7Ci0KLSAgICBpbnQ2NF90IG1QcmV2VGltZVVzOwotCi0gICAgc3A8TnVNZWRpYUV4dHJhY3Rvcj4gbUV4dHJhY3RvcjsKLSAgICBLZXllZFZlY3RvcjxzaXplX3QsIHNpemVfdD4gbUV4dHJhY3RvclRyYWNrVG9JbnRlcm5hbFRyYWNrOwotICAgIGJvb2wgbVB1bGxFeHRyYWN0b3JQZW5kaW5nOwotICAgIGludDMyX3QgbVB1bGxFeHRyYWN0b3JHZW5lcmF0aW9uOwotICAgIGludDY0X3QgbUZpcnN0U2FtcGxlVGltZVJlYWxVczsKLSAgICBpbnQ2NF90IG1GaXJzdFNhbXBsZVRpbWVVczsKLQotICAgIHN0YXR1c190IHNldHVwTWVkaWFQYWNrZXRpemVyKGJvb2wgZW5hYmxlQXVkaW8sIGJvb2wgZW5hYmxlVmlkZW8pOwotCi0gICAgc3RhdHVzX3Qgc2V0dXBQYWNrZXRpemVyKAotICAgICAgICAgICAgYm9vbCBlbmFibGVBdWRpbywKLSAgICAgICAgICAgIGJvb2wgdXNlUENNQXVkaW8sCi0gICAgICAgICAgICBib29sIGVuYWJsZVZpZGVvLAotICAgICAgICAgICAgVmlkZW9Gb3JtYXRzOjpSZXNvbHV0aW9uVHlwZSB2aWRlb1Jlc29sdXRpb25UeXBlLAotICAgICAgICAgICAgc2l6ZV90IHZpZGVvUmVzb2x1dGlvbkluZGV4LAotICAgICAgICAgICAgVmlkZW9Gb3JtYXRzOjpQcm9maWxlVHlwZSB2aWRlb1Byb2ZpbGVUeXBlLAotICAgICAgICAgICAgVmlkZW9Gb3JtYXRzOjpMZXZlbFR5cGUgdmlkZW9MZXZlbFR5cGUpOwotCi0gICAgc3RhdHVzX3QgYWRkU291cmNlKAotICAgICAgICAgICAgYm9vbCBpc1ZpZGVvLAotICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UsCi0gICAgICAgICAgICBib29sIGlzUmVwZWF0ZXJTb3VyY2UsCi0gICAgICAgICAgICBib29sIHVzZVBDTUF1ZGlvLAotICAgICAgICAgICAgdW5zaWduZWQgcHJvZmlsZUlkYywKLSAgICAgICAgICAgIHVuc2lnbmVkIGxldmVsSWRjLAotICAgICAgICAgICAgdW5zaWduZWQgY29udHJhaW50U2V0LAotICAgICAgICAgICAgc2l6ZV90ICpudW1JbnB1dEJ1ZmZlcnMpOwotCi0gICAgc3RhdHVzX3QgYWRkVmlkZW9Tb3VyY2UoCi0gICAgICAgICAgICBWaWRlb0Zvcm1hdHM6OlJlc29sdXRpb25UeXBlIHZpZGVvUmVzb2x1dGlvblR5cGUsCi0gICAgICAgICAgICBzaXplX3QgdmlkZW9SZXNvbHV0aW9uSW5kZXgsCi0gICAgICAgICAgICBWaWRlb0Zvcm1hdHM6OlByb2ZpbGVUeXBlIHZpZGVvUHJvZmlsZVR5cGUsCi0gICAgICAgICAgICBWaWRlb0Zvcm1hdHM6OkxldmVsVHlwZSB2aWRlb0xldmVsVHlwZSk7Ci0KLSAgICBzdGF0dXNfdCBhZGRBdWRpb1NvdXJjZShib29sIHVzZVBDTUF1ZGlvKTsKLQotICAgIHN0YXR1c190IG9uTWVkaWFTZW5kZXJJbml0aWFsaXplZCgpOwotCi0gICAgdm9pZCBub3RpZnlTZXNzaW9uRGVhZCgpOwotCi0gICAgdm9pZCBzY2hlZHVsZVB1bGxFeHRyYWN0b3IoKTsKLSAgICB2b2lkIG9uUHVsbEV4dHJhY3RvcigpOwotCi0gICAgdm9pZCBvblNpbmtGZWVkYmFjayhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhQbGF5YmFja1Nlc3Npb24pOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBQTEFZQkFDS19TRVNTSU9OX0hfCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvUmVwZWF0ZXJTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9SZXBlYXRlclNvdXJjZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNmI2NjMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9SZXBlYXRlclNvdXJjZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJSZXBlYXRlclNvdXJjZSIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIlJlcGVhdGVyU291cmNlLmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotUmVwZWF0ZXJTb3VyY2U6OlJlcGVhdGVyU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlLCBkb3VibGUgcmF0ZUh6KQotICAgIDogbVN0YXJ0ZWQoZmFsc2UpLAotICAgICAgbVNvdXJjZShzb3VyY2UpLAotICAgICAgbVJhdGVIeihyYXRlSHopLAotICAgICAgbUJ1ZmZlcihOVUxMKSwKLSAgICAgIG1SZXN1bHQoT0spLAotICAgICAgbUxhc3RCdWZmZXJVcGRhdGVVcygtMWxsKSwKLSAgICAgIG1TdGFydFRpbWVVcygtMWxsKSwKLSAgICAgIG1GcmFtZUNvdW50KDApIHsKLX0KLQotUmVwZWF0ZXJTb3VyY2U6On5SZXBlYXRlclNvdXJjZSgpIHsKLSAgICBDSEVDSyghbVN0YXJ0ZWQpOwotfQotCi1kb3VibGUgUmVwZWF0ZXJTb3VyY2U6OmdldEZyYW1lUmF0ZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVJhdGVIejsKLX0KLQotdm9pZCBSZXBlYXRlclNvdXJjZTo6c2V0RnJhbWVSYXRlKGRvdWJsZSByYXRlSHopIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKHJhdGVIeiA9PSBtUmF0ZUh6KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobVN0YXJ0VGltZVVzID49IDBsbCkgewotICAgICAgICBpbnQ2NF90IG5leHRUaW1lVXMgPSBtU3RhcnRUaW1lVXMgKyAobUZyYW1lQ291bnQgKiAxMDAwMDAwbGwpIC8gbVJhdGVIejsKLSAgICAgICAgbVN0YXJ0VGltZVVzID0gbmV4dFRpbWVVczsKLSAgICAgICAgbUZyYW1lQ291bnQgPSAwOwotICAgIH0KLSAgICBtUmF0ZUh6ID0gcmF0ZUh6OwotfQotCi1zdGF0dXNfdCBSZXBlYXRlclNvdXJjZTo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgewotICAgIENIRUNLKCFtU3RhcnRlZCk7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5zdGFydChwYXJhbXMpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIG1CdWZmZXIgPSBOVUxMOwotICAgIG1SZXN1bHQgPSBPSzsKLSAgICBtU3RhcnRUaW1lVXMgPSAtMWxsOwotICAgIG1GcmFtZUNvdW50ID0gMDsKLQotICAgIG1Mb29wZXIgPSBuZXcgQUxvb3BlcjsKLSAgICBtTG9vcGVyLT5zZXROYW1lKCJyZXBlYXRlcl9sb29wZXIiKTsKLSAgICBtTG9vcGVyLT5zdGFydCgpOwotCi0gICAgbVJlZmxlY3RvciA9IG5ldyBBSGFuZGxlclJlZmxlY3RvcjxSZXBlYXRlclNvdXJjZT4odGhpcyk7Ci0gICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1SZWZsZWN0b3IpOwotCi0gICAgcG9zdFJlYWQoKTsKLQotICAgIG1TdGFydGVkID0gdHJ1ZTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgUmVwZWF0ZXJTb3VyY2U6OnN0b3AoKSB7Ci0gICAgQ0hFQ0sobVN0YXJ0ZWQpOwotCi0gICAgQUxPR1YoInN0b3BwaW5nIik7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5zdG9wKCk7Ci0KLSAgICBpZiAobUxvb3BlciAhPSBOVUxMKSB7Ci0gICAgICAgIG1Mb29wZXItPnN0b3AoKTsKLSAgICAgICAgbUxvb3Blci5jbGVhcigpOwotCi0gICAgICAgIG1SZWZsZWN0b3IuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBpZiAobUJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIEFMT0dWKCJyZWxlYXNpbmcgbWJ1ZiAlcCIsIG1CdWZmZXIpOwotICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgIH0KLQotCi0gICAgQUxPR1YoInN0b3BwZWQiKTsKLQotICAgIG1TdGFydGVkID0gZmFsc2U7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1zcDxNZXRhRGF0YT4gUmVwZWF0ZXJTb3VyY2U6OmdldEZvcm1hdCgpIHsKLSAgICByZXR1cm4gbVNvdXJjZS0+Z2V0Rm9ybWF0KCk7Ci19Ci0KLXN0YXR1c190IFJlcGVhdGVyU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKLSAgICBpbnQ2NF90IHNlZWtUaW1lVXM7Ci0gICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIHNlZWtNb2RlOwotICAgIENIRUNLKG9wdGlvbnMgPT0gTlVMTCB8fCAhb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmc2Vla01vZGUpKTsKLQotICAgIGZvciAoOzspIHsKLSAgICAgICAgaW50NjRfdCBidWZmZXJUaW1lVXMgPSAtMWxsOwotCi0gICAgICAgIGlmIChtU3RhcnRUaW1lVXMgPCAwbGwpIHsKLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgICAgICAgICB3aGlsZSAoKG1MYXN0QnVmZmVyVXBkYXRlVXMgPCAwbGwgfHwgbUJ1ZmZlciA9PSBOVUxMKQotICAgICAgICAgICAgICAgICAgICAmJiBtUmVzdWx0ID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgbUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQUxPR1YoIm5vdyByZXN1bWluZy4iKTsKLSAgICAgICAgICAgIG1TdGFydFRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0gICAgICAgICAgICBidWZmZXJUaW1lVXMgPSBtU3RhcnRUaW1lVXM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBidWZmZXJUaW1lVXMgPSBtU3RhcnRUaW1lVXMgKyAobUZyYW1lQ291bnQgKiAxMDAwMDAwbGwpIC8gbVJhdGVIejsKLQotICAgICAgICAgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0gICAgICAgICAgICBpbnQ2NF90IGRlbGF5VXMgPSBidWZmZXJUaW1lVXMgLSBub3dVczsKLQotICAgICAgICAgICAgaWYgKGRlbGF5VXMgPiAwbGwpIHsKLSAgICAgICAgICAgICAgICB1c2xlZXAoZGVsYXlVcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBib29sIHN0YWxlID0gZmFsc2U7Ci0KLSAgICAgICAgewotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICAgICAgICAgIGlmIChtUmVzdWx0ICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobUJ1ZmZlciA9PSBOVUxMKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbVJlc3VsdDsKLSAgICAgICAgICAgIH0KLQotI2lmIFNVU1BFTkRfVklERU9fSUZfSURMRQotICAgICAgICAgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0gICAgICAgICAgICBpZiAobm93VXMgLSBtTGFzdEJ1ZmZlclVwZGF0ZVVzID4gMTAwMDAwMGxsKSB7Ci0gICAgICAgICAgICAgICAgbUxhc3RCdWZmZXJVcGRhdGVVcyA9IC0xbGw7Ci0gICAgICAgICAgICAgICAgc3RhbGUgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlCi0jZW5kaWYKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5hZGRfcmVmKCk7Ci0gICAgICAgICAgICAgICAgKmJ1ZmZlciA9IG1CdWZmZXI7Ci0gICAgICAgICAgICAgICAgKCpidWZmZXIpLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIGJ1ZmZlclRpbWVVcyk7Ci0gICAgICAgICAgICAgICAgKyttRnJhbWVDb3VudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghc3RhbGUpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgbVN0YXJ0VGltZVVzID0gLTFsbDsKLSAgICAgICAgbUZyYW1lQ291bnQgPSAwOwotICAgICAgICBBTE9HVigibm93IGRvcm1hbnQiKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgUmVwZWF0ZXJTb3VyY2U6OnBvc3RSZWFkKCkgewotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRSZWFkLCBtUmVmbGVjdG9yKSktPnBvc3QoKTsKLX0KLQotdm9pZCBSZXBlYXRlclNvdXJjZTo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7Ci0gICAgICAgIGNhc2Uga1doYXRSZWFkOgotICAgICAgICB7Ci0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyOwotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+cmVhZCgmYnVmZmVyKTsKLQotICAgICAgICAgICAgQUxPR1YoInJlYWQgbWJ1ZiAlcCIsIGJ1ZmZlcik7Ci0KLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgICAgICAgICBpZiAobUJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICAgICAgICAgIG1SZXN1bHQgPSBlcnI7Ci0gICAgICAgICAgICBtTGFzdEJ1ZmZlclVwZGF0ZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLQotICAgICAgICAgICAgbUNvbmRpdGlvbi5icm9hZGNhc3QoKTsKLQotICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgICAgIHBvc3RSZWFkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBUUkVTUEFTUygpOwotICAgIH0KLX0KLQotdm9pZCBSZXBlYXRlclNvdXJjZTo6d2FrZVVwKCkgewotICAgIEFMT0dWKCJ3YWtlVXAiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIGlmIChtTGFzdEJ1ZmZlclVwZGF0ZVVzIDwgMGxsICYmIG1CdWZmZXIgIT0gTlVMTCkgewotICAgICAgICBtTGFzdEJ1ZmZlclVwZGF0ZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLSAgICAgICAgbUNvbmRpdGlvbi5icm9hZGNhc3QoKTsKLSAgICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1JlcGVhdGVyU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1JlcGVhdGVyU291cmNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNDE0ZmQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9SZXBlYXRlclNvdXJjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotI2lmbmRlZiBSRVBFQVRFUl9TT1VSQ0VfSF8KLQotI2RlZmluZSBSRVBFQVRFUl9TT1VSQ0VfSF8KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyUmVmbGVjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KLQotI2RlZmluZSBTVVNQRU5EX1ZJREVPX0lGX0lETEUgICAwCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gVGhpcyBNZWRpYVNvdXJjZSBkZWxpdmVycyBmcmFtZXMgYXQgYSBjb25zdGFudCByYXRlIGJ5IHJlcGVhdGluZyBidWZmZXJzCi0vLyBpZiBuZWNlc3NhcnkuCi1zdHJ1Y3QgUmVwZWF0ZXJTb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UgewotICAgIFJlcGVhdGVyU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlLCBkb3VibGUgcmF0ZUh6KTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpOwotCi0gICAgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7Ci0KLSAgICAvLyBJZiBSZXBlYXRlclNvdXJjZSBpcyBjdXJyZW50bHkgZG9ybWFudCwgYmVjYXVzZSBTdXJmYWNlRmxpbmdlciBkaWRuJ3QKLSAgICAvLyBzZW5kIHVwZGF0ZXMgaW4gYSB3aGlsZSwgdGhpcyBpcyBpdHMgd2FrZXVwIGNhbGwuCi0gICAgdm9pZCB3YWtlVXAoKTsKLQotICAgIGRvdWJsZSBnZXRGcmFtZVJhdGUoKSBjb25zdDsKLSAgICB2b2lkIHNldEZyYW1lUmF0ZShkb3VibGUgcmF0ZUh6KTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgflJlcGVhdGVyU291cmNlKCk7Ci0KLXByaXZhdGU6Ci0gICAgZW51bSB7Ci0gICAgICAgIGtXaGF0UmVhZCwKLSAgICB9OwotCi0gICAgTXV0ZXggbUxvY2s7Ci0gICAgQ29uZGl0aW9uIG1Db25kaXRpb247Ci0KLSAgICBib29sIG1TdGFydGVkOwotCi0gICAgc3A8TWVkaWFTb3VyY2U+IG1Tb3VyY2U7Ci0gICAgZG91YmxlIG1SYXRlSHo7Ci0KLSAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOwotICAgIHNwPEFIYW5kbGVyUmVmbGVjdG9yPFJlcGVhdGVyU291cmNlPiA+IG1SZWZsZWN0b3I7Ci0KLSAgICBNZWRpYUJ1ZmZlciAqbUJ1ZmZlcjsKLSAgICBzdGF0dXNfdCBtUmVzdWx0OwotICAgIGludDY0X3QgbUxhc3RCdWZmZXJVcGRhdGVVczsKLQotICAgIGludDY0X3QgbVN0YXJ0VGltZVVzOwotICAgIGludDMyX3QgbUZyYW1lQ291bnQ7Ci0KLSAgICB2b2lkIHBvc3RSZWFkKCk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhSZXBlYXRlclNvdXJjZSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gUkVQRUFURVJfU09VUkNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1RTUGFja2V0aXplci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1RTUGFja2V0aXplci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NWJhOTQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9UU1BhY2tldGl6ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTA1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIlRTUGFja2V0aXplciIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIlRTUGFja2V0aXplci5oIgotI2luY2x1ZGUgImluY2x1ZGUvYXZjX3V0aWxzLmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotCi0jaW5jbHVkZSA8YXJwYS9pbmV0Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IFRTUGFja2V0aXplcjo6VHJhY2sgOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgVHJhY2soY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCi0gICAgICAgICAgdW5zaWduZWQgUElELCB1bnNpZ25lZCBzdHJlYW1UeXBlLCB1bnNpZ25lZCBzdHJlYW1JRCk7Ci0KLSAgICB1bnNpZ25lZCBQSUQoKSBjb25zdDsKLSAgICB1bnNpZ25lZCBzdHJlYW1UeXBlKCkgY29uc3Q7Ci0gICAgdW5zaWduZWQgc3RyZWFtSUQoKSBjb25zdDsKLQotICAgIC8vIFJldHVybnMgdGhlIHByZXZpb3VzIHZhbHVlLgotICAgIHVuc2lnbmVkIGluY3JlbWVudENvbnRpbnVpdHlDb3VudGVyKCk7Ci0KLSAgICBib29sIGlzQXVkaW8oKSBjb25zdDsKLSAgICBib29sIGlzVmlkZW8oKSBjb25zdDsKLQotICAgIGJvb2wgaXNIMjY0KCkgY29uc3Q7Ci0gICAgYm9vbCBpc0FBQygpIGNvbnN0OwotICAgIGJvb2wgbGFja3NBRFRTSGVhZGVyKCkgY29uc3Q7Ci0gICAgYm9vbCBpc1BDTUF1ZGlvKCkgY29uc3Q7Ci0KLSAgICBzcDxBQnVmZmVyPiBwcmVwZW5kQ1NEKGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KSBjb25zdDsKLSAgICBzcDxBQnVmZmVyPiBwcmVwZW5kQURUU0hlYWRlcihjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCkgY29uc3Q7Ci0KLSAgICBzaXplX3QgY291bnREZXNjcmlwdG9ycygpIGNvbnN0OwotICAgIHNwPEFCdWZmZXI+IGRlc2NyaXB0b3JBdChzaXplX3QgaW5kZXgpIGNvbnN0OwotCi0gICAgdm9pZCBmaW5hbGl6ZSgpOwotICAgIHZvaWQgZXh0cmFjdENTRElmTmVjZXNzYXJ5KCk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5UcmFjaygpOwotCi1wcml2YXRlOgotICAgIHNwPEFNZXNzYWdlPiBtRm9ybWF0OwotCi0gICAgdW5zaWduZWQgbVBJRDsKLSAgICB1bnNpZ25lZCBtU3RyZWFtVHlwZTsKLSAgICB1bnNpZ25lZCBtU3RyZWFtSUQ7Ci0gICAgdW5zaWduZWQgbUNvbnRpbnVpdHlDb3VudGVyOwotCi0gICAgQVN0cmluZyBtTUlNRTsKLSAgICBWZWN0b3I8c3A8QUJ1ZmZlcj4gPiBtQ1NEOwotCi0gICAgVmVjdG9yPHNwPEFCdWZmZXI+ID4gbURlc2NyaXB0b3JzOwotCi0gICAgYm9vbCBtQXVkaW9MYWNrc0FURFNIZWFkZXJzOwotICAgIGJvb2wgbUZpbmFsaXplZDsKLSAgICBib29sIG1FeHRyYWN0ZWRDU0Q7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhUcmFjayk7Ci19OwotCi1UU1BhY2tldGl6ZXI6OlRyYWNrOjpUcmFjaygKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCi0gICAgICAgIHVuc2lnbmVkIFBJRCwgdW5zaWduZWQgc3RyZWFtVHlwZSwgdW5zaWduZWQgc3RyZWFtSUQpCi0gICAgOiBtRm9ybWF0KGZvcm1hdCksCi0gICAgICBtUElEKFBJRCksCi0gICAgICBtU3RyZWFtVHlwZShzdHJlYW1UeXBlKSwKLSAgICAgIG1TdHJlYW1JRChzdHJlYW1JRCksCi0gICAgICBtQ29udGludWl0eUNvdW50ZXIoMCksCi0gICAgICBtQXVkaW9MYWNrc0FURFNIZWFkZXJzKGZhbHNlKSwKLSAgICAgIG1GaW5hbGl6ZWQoZmFsc2UpLAotICAgICAgbUV4dHJhY3RlZENTRChmYWxzZSkgewotICAgIENIRUNLKGZvcm1hdC0+ZmluZFN0cmluZygibWltZSIsICZtTUlNRSkpOwotfQotCi12b2lkIFRTUGFja2V0aXplcjo6VHJhY2s6OmV4dHJhY3RDU0RJZk5lY2Vzc2FyeSgpIHsKLSAgICBpZiAobUV4dHJhY3RlZENTRCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCFzdHJjYXNlY21wKG1NSU1FLmNfc3RyKCksIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQykKLSAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKG1NSU1FLmNfc3RyKCksIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQykpIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7OyArK2kpIHsKLSAgICAgICAgICAgIHNwPEFCdWZmZXI+IGNzZDsKLSAgICAgICAgICAgIGlmICghbUZvcm1hdC0+ZmluZEJ1ZmZlcihBU3RyaW5nUHJpbnRmKCJjc2QtJWQiLCBpKS5jX3N0cigpLCAmY3NkKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtQ1NELnB1c2goY3NkKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghc3RyY2FzZWNtcChtTUlNRS5jX3N0cigpLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpKSB7Ci0gICAgICAgICAgICBpbnQzMl90IGlzQURUUzsKLSAgICAgICAgICAgIGlmICghbUZvcm1hdC0+ZmluZEludDMyKCJpcy1hZHRzIiwgJmlzQURUUykgfHwgaXNBRFRTID09IDApIHsKLSAgICAgICAgICAgICAgICBtQXVkaW9MYWNrc0FURFNIZWFkZXJzID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIG1FeHRyYWN0ZWRDU0QgPSB0cnVlOwotfQotCi1UU1BhY2tldGl6ZXI6OlRyYWNrOjp+VHJhY2soKSB7Ci19Ci0KLXVuc2lnbmVkIFRTUGFja2V0aXplcjo6VHJhY2s6OlBJRCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVBJRDsKLX0KLQotdW5zaWduZWQgVFNQYWNrZXRpemVyOjpUcmFjazo6c3RyZWFtVHlwZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVN0cmVhbVR5cGU7Ci19Ci0KLXVuc2lnbmVkIFRTUGFja2V0aXplcjo6VHJhY2s6OnN0cmVhbUlEKCkgY29uc3QgewotICAgIHJldHVybiBtU3RyZWFtSUQ7Ci19Ci0KLXVuc2lnbmVkIFRTUGFja2V0aXplcjo6VHJhY2s6OmluY3JlbWVudENvbnRpbnVpdHlDb3VudGVyKCkgewotICAgIHVuc2lnbmVkIHByZXZDb3VudGVyID0gbUNvbnRpbnVpdHlDb3VudGVyOwotCi0gICAgaWYgKCsrbUNvbnRpbnVpdHlDb3VudGVyID09IDE2KSB7Ci0gICAgICAgIG1Db250aW51aXR5Q291bnRlciA9IDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIHByZXZDb3VudGVyOwotfQotCi1ib29sIFRTUGFja2V0aXplcjo6VHJhY2s6OmlzQXVkaW8oKSBjb25zdCB7Ci0gICAgcmV0dXJuICFzdHJuY2FzZWNtcCgiYXVkaW8vIiwgbU1JTUUuY19zdHIoKSwgNik7Ci19Ci0KLWJvb2wgVFNQYWNrZXRpemVyOjpUcmFjazo6aXNWaWRlbygpIGNvbnN0IHsKLSAgICByZXR1cm4gIXN0cm5jYXNlY21wKCJ2aWRlby8iLCBtTUlNRS5jX3N0cigpLCA2KTsKLX0KLQotYm9vbCBUU1BhY2tldGl6ZXI6OlRyYWNrOjppc0gyNjQoKSBjb25zdCB7Ci0gICAgcmV0dXJuICFzdHJjYXNlY21wKG1NSU1FLmNfc3RyKCksIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7Ci19Ci0KLWJvb2wgVFNQYWNrZXRpemVyOjpUcmFjazo6aXNBQUMoKSBjb25zdCB7Ci0gICAgcmV0dXJuICFzdHJjYXNlY21wKG1NSU1FLmNfc3RyKCksIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyk7Ci19Ci0KLWJvb2wgVFNQYWNrZXRpemVyOjpUcmFjazo6aXNQQ01BdWRpbygpIGNvbnN0IHsKLSAgICByZXR1cm4gIXN0cmNhc2VjbXAobU1JTUUuY19zdHIoKSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKLX0KLQotYm9vbCBUU1BhY2tldGl6ZXI6OlRyYWNrOjpsYWNrc0FEVFNIZWFkZXIoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1BdWRpb0xhY2tzQVREU0hlYWRlcnM7Ci19Ci0KLXNwPEFCdWZmZXI+IFRTUGFja2V0aXplcjo6VHJhY2s6OnByZXBlbmRDU0QoCi0gICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KSBjb25zdCB7Ci0gICAgc2l6ZV90IHNpemUgPSAwOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNTRC5zaXplKCk7ICsraSkgewotICAgICAgICBzaXplICs9IG1DU0QuaXRlbUF0KGkpLT5zaXplKCk7Ci0gICAgfQotCi0gICAgc3A8QUJ1ZmZlcj4gZHVwID0gbmV3IEFCdWZmZXIoYWNjZXNzVW5pdC0+c2l6ZSgpICsgc2l6ZSk7Ci0gICAgc2l6ZV90IG9mZnNldCA9IDA7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ1NELnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZjc2QgPSBtQ1NELml0ZW1BdChpKTsKLQotICAgICAgICBtZW1jcHkoZHVwLT5kYXRhKCkgKyBvZmZzZXQsIGNzZC0+ZGF0YSgpLCBjc2QtPnNpemUoKSk7Ci0gICAgICAgIG9mZnNldCArPSBjc2QtPnNpemUoKTsKLSAgICB9Ci0KLSAgICBtZW1jcHkoZHVwLT5kYXRhKCkgKyBvZmZzZXQsIGFjY2Vzc1VuaXQtPmRhdGEoKSwgYWNjZXNzVW5pdC0+c2l6ZSgpKTsKLQotICAgIHJldHVybiBkdXA7Ci19Ci0KLXNwPEFCdWZmZXI+IFRTUGFja2V0aXplcjo6VHJhY2s6OnByZXBlbmRBRFRTSGVhZGVyKAotICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCkgY29uc3QgewotICAgIENIRUNLX0VRKG1DU0Quc2l6ZSgpLCAxdSk7Ci0KLSAgICBjb25zdCB1aW50OF90ICpjb2RlY19zcGVjaWZpY19kYXRhID0gbUNTRC5pdGVtQXQoMCktPmRhdGEoKTsKLQotICAgIGNvbnN0IHVpbnQzMl90IGFhY19mcmFtZV9sZW5ndGggPSBhY2Nlc3NVbml0LT5zaXplKCkgKyA3OwotCi0gICAgc3A8QUJ1ZmZlcj4gZHVwID0gbmV3IEFCdWZmZXIoYWFjX2ZyYW1lX2xlbmd0aCk7Ci0KLSAgICB1bnNpZ25lZCBwcm9maWxlID0gKGNvZGVjX3NwZWNpZmljX2RhdGFbMF0gPj4gMykgLSAxOwotCi0gICAgdW5zaWduZWQgc2FtcGxpbmdfZnJlcV9pbmRleCA9Ci0gICAgICAgICgoY29kZWNfc3BlY2lmaWNfZGF0YVswXSAmIDcpIDw8IDEpCi0gICAgICAgIHwgKGNvZGVjX3NwZWNpZmljX2RhdGFbMV0gPj4gNyk7Ci0KLSAgICB1bnNpZ25lZCBjaGFubmVsX2NvbmZpZ3VyYXRpb24gPQotICAgICAgICAoY29kZWNfc3BlY2lmaWNfZGF0YVsxXSA+PiAzKSAmIDB4MGY7Ci0KLSAgICB1aW50OF90ICpwdHIgPSBkdXAtPmRhdGEoKTsKLQotICAgICpwdHIrKyA9IDB4ZmY7Ci0gICAgKnB0cisrID0gMHhmOTsgIC8vIGIxMTExMTAwMSwgSUQ9MShNUEVHLTIpLCBsYXllcj0wLCBwcm90ZWN0aW9uX2Fic2VudD0xCi0KLSAgICAqcHRyKysgPQotICAgICAgICBwcm9maWxlIDw8IDYKLSAgICAgICAgfCBzYW1wbGluZ19mcmVxX2luZGV4IDw8IDIKLSAgICAgICAgfCAoKGNoYW5uZWxfY29uZmlndXJhdGlvbiA+PiAyKSAmIDEpOyAgLy8gcHJpdmF0ZV9iaXQ9MAotCi0gICAgLy8gb3JpZ2luYWxfY29weT0wLCBob21lPTAsIGNvcHlyaWdodF9pZF9iaXQ9MCwgY29weXJpZ2h0X2lkX3N0YXJ0PTAKLSAgICAqcHRyKysgPQotICAgICAgICAoY2hhbm5lbF9jb25maWd1cmF0aW9uICYgMykgPDwgNgotICAgICAgICB8IGFhY19mcmFtZV9sZW5ndGggPj4gMTE7Ci0gICAgKnB0cisrID0gKGFhY19mcmFtZV9sZW5ndGggPj4gMykgJiAweGZmOwotICAgICpwdHIrKyA9IChhYWNfZnJhbWVfbGVuZ3RoICYgNykgPDwgNTsKLQotICAgIC8vIGFkdHNfYnVmZmVyX2Z1bGxuZXNzPTAsIG51bWJlcl9vZl9yYXdfZGF0YV9ibG9ja3NfaW5fZnJhbWU9MAotICAgICpwdHIrKyA9IDA7Ci0KLSAgICBtZW1jcHkocHRyLCBhY2Nlc3NVbml0LT5kYXRhKCksIGFjY2Vzc1VuaXQtPnNpemUoKSk7Ci0KLSAgICByZXR1cm4gZHVwOwotfQotCi1zaXplX3QgVFNQYWNrZXRpemVyOjpUcmFjazo6Y291bnREZXNjcmlwdG9ycygpIGNvbnN0IHsKLSAgICByZXR1cm4gbURlc2NyaXB0b3JzLnNpemUoKTsKLX0KLQotc3A8QUJ1ZmZlcj4gVFNQYWNrZXRpemVyOjpUcmFjazo6ZGVzY3JpcHRvckF0KHNpemVfdCBpbmRleCkgY29uc3QgewotICAgIENIRUNLX0xUKGluZGV4LCBtRGVzY3JpcHRvcnMuc2l6ZSgpKTsKLSAgICByZXR1cm4gbURlc2NyaXB0b3JzLml0ZW1BdChpbmRleCk7Ci19Ci0KLXZvaWQgVFNQYWNrZXRpemVyOjpUcmFjazo6ZmluYWxpemUoKSB7Ci0gICAgaWYgKG1GaW5hbGl6ZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChpc0gyNjQoKSkgewotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBBVkMgdmlkZW8gZGVzY3JpcHRvciAoNDApCi0KLSAgICAgICAgICAgIHNwPEFCdWZmZXI+IGRlc2NyaXB0b3IgPSBuZXcgQUJ1ZmZlcig2KTsKLSAgICAgICAgICAgIHVpbnQ4X3QgKmRhdGEgPSBkZXNjcmlwdG9yLT5kYXRhKCk7Ci0gICAgICAgICAgICBkYXRhWzBdID0gNDA7ICAvLyBkZXNjcmlwdG9yX3RhZwotICAgICAgICAgICAgZGF0YVsxXSA9IDQ7ICAvLyBkZXNjcmlwdG9yX2xlbmd0aAotCi0gICAgICAgICAgICBpZiAobUNTRC5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfR0UobUNTRC5zaXplKCksIDF1KTsKLSAgICAgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmc3BzID0gbUNTRC5pdGVtQXQoMCk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0soIW1lbWNtcCgiXHgwMFx4MDBceDAwXHgwMSIsIHNwcy0+ZGF0YSgpLCA0KSk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfR0Uoc3BzLT5zaXplKCksIDd1KTsKLSAgICAgICAgICAgICAgICAvLyBwcm9maWxlX2lkYywgY29uc3RyYWludF9zZXQqLCBsZXZlbF9pZGMKLSAgICAgICAgICAgICAgICBtZW1jcHkoJmRhdGFbMl0sIHNwcy0+ZGF0YSgpICsgNCwgMyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGludDMyX3QgcHJvZmlsZUlkYywgbGV2ZWxJZGMsIGNvbnN0cmFpbnRTZXQ7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobUZvcm1hdC0+ZmluZEludDMyKCJwcm9maWxlLWlkYyIsICZwcm9maWxlSWRjKSk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobUZvcm1hdC0+ZmluZEludDMyKCJsZXZlbC1pZGMiLCAmbGV2ZWxJZGMpKTsKLSAgICAgICAgICAgICAgICBDSEVDSyhtRm9ybWF0LT5maW5kSW50MzIoImNvbnN0cmFpbnQtc2V0IiwgJmNvbnN0cmFpbnRTZXQpKTsKLSAgICAgICAgICAgICAgICBDSEVDS19HRShwcm9maWxlSWRjLCAwKTsKLSAgICAgICAgICAgICAgICBDSEVDS19HRShsZXZlbElkYywgMCk7Ci0gICAgICAgICAgICAgICAgZGF0YVsyXSA9IHByb2ZpbGVJZGM7ICAgIC8vIHByb2ZpbGVfaWRjCi0gICAgICAgICAgICAgICAgZGF0YVszXSA9IGNvbnN0cmFpbnRTZXQ7IC8vIGNvbnN0cmFpbnRfc2V0KgotICAgICAgICAgICAgICAgIGRhdGFbNF0gPSBsZXZlbElkYzsgICAgICAvLyBsZXZlbF9pZGMKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQVZDX3N0aWxsX3ByZXNlbnQ9MCwgQVZDXzI0X2hvdXJfcGljdHVyZV9mbGFnPTAsIHJlc2VydmVkCi0gICAgICAgICAgICBkYXRhWzVdID0gMHgzZjsKLQotICAgICAgICAgICAgbURlc2NyaXB0b3JzLnB1c2hfYmFjayhkZXNjcmlwdG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEFWQyB0aW1pbmcgYW5kIEhSRCBkZXNjcmlwdG9yICg0MikKLQotICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gZGVzY3JpcHRvciA9IG5ldyBBQnVmZmVyKDQpOwotICAgICAgICAgICAgdWludDhfdCAqZGF0YSA9IGRlc2NyaXB0b3ItPmRhdGEoKTsKLSAgICAgICAgICAgIGRhdGFbMF0gPSA0MjsgIC8vIGRlc2NyaXB0b3JfdGFnCi0gICAgICAgICAgICBkYXRhWzFdID0gMjsgIC8vIGRlc2NyaXB0b3JfbGVuZ3RoCi0KLSAgICAgICAgICAgIC8vIGhyZF9tYW5hZ2VtZW50X3ZhbGlkX2ZsYWcgPSAwCi0gICAgICAgICAgICAvLyByZXNlcnZlZCA9IDExMTExMWIKLSAgICAgICAgICAgIC8vIHBpY3R1cmVfYW5kX3RpbWluZ19pbmZvX3ByZXNlbnQgPSAwCi0KLSAgICAgICAgICAgIGRhdGFbMl0gPSAweDdlOwotCi0gICAgICAgICAgICAvLyBmaXhlZF9mcmFtZV9yYXRlX2ZsYWcgPSAwCi0gICAgICAgICAgICAvLyB0ZW1wb3JhbF9wb2NfZmxhZyA9IDAKLSAgICAgICAgICAgIC8vIHBpY3R1cmVfdG9fZGlzcGxheV9jb252ZXJzaW9uX2ZsYWcgPSAwCi0gICAgICAgICAgICAvLyByZXNlcnZlZCA9IDExMTExYgotICAgICAgICAgICAgZGF0YVszXSA9IDB4MWY7Ci0KLSAgICAgICAgICAgIG1EZXNjcmlwdG9ycy5wdXNoX2JhY2soZGVzY3JpcHRvcik7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGlzUENNQXVkaW8oKSkgewotICAgICAgICAvLyBMUENNIGF1ZGlvIHN0cmVhbSBkZXNjcmlwdG9yICgweDgzKQotCi0gICAgICAgIGludDMyX3QgY2hhbm5lbENvdW50OwotICAgICAgICBDSEVDSyhtRm9ybWF0LT5maW5kSW50MzIoImNoYW5uZWwtY291bnQiLCAmY2hhbm5lbENvdW50KSk7Ci0gICAgICAgIENIRUNLX0VRKGNoYW5uZWxDb3VudCwgMik7Ci0KLSAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlOwotICAgICAgICBDSEVDSyhtRm9ybWF0LT5maW5kSW50MzIoInNhbXBsZS1yYXRlIiwgJnNhbXBsZVJhdGUpKTsKLSAgICAgICAgQ0hFQ0soc2FtcGxlUmF0ZSA9PSA0NDEwMCB8fCBzYW1wbGVSYXRlID09IDQ4MDAwKTsKLQotICAgICAgICBzcDxBQnVmZmVyPiBkZXNjcmlwdG9yID0gbmV3IEFCdWZmZXIoNCk7Ci0gICAgICAgIHVpbnQ4X3QgKmRhdGEgPSBkZXNjcmlwdG9yLT5kYXRhKCk7Ci0gICAgICAgIGRhdGFbMF0gPSAweDgzOyAgLy8gZGVzY3JpcHRvcl90YWcKLSAgICAgICAgZGF0YVsxXSA9IDI7ICAvLyBkZXNjcmlwdG9yX2xlbmd0aAotCi0gICAgICAgIHVuc2lnbmVkIHNhbXBsaW5nX2ZyZXF1ZW5jeSA9IChzYW1wbGVSYXRlID09IDQ0MTAwKSA/IDEgOiAyOwotCi0gICAgICAgIGRhdGFbMl0gPSAoc2FtcGxpbmdfZnJlcXVlbmN5IDw8IDUpCi0gICAgICAgICAgICAgICAgICAgIHwgKDMgLyogcmVzZXJ2ZWQgKi8gPDwgMSkKLSAgICAgICAgICAgICAgICAgICAgfCAwIC8qIGVtcGhhc2lzX2ZsYWcgKi87Ci0KLSAgICAgICAgZGF0YVszXSA9Ci0gICAgICAgICAgICAoMSAvKiBudW1iZXJfb2ZfY2hhbm5lbHMgPSBzdGVyZW8gKi8gPDwgNSkKLSAgICAgICAgICAgIHwgMHhmIC8qIHJlc2VydmVkICovOwotCi0gICAgICAgIG1EZXNjcmlwdG9ycy5wdXNoX2JhY2soZGVzY3JpcHRvcik7Ci0gICAgfQotCi0gICAgbUZpbmFsaXplZCA9IHRydWU7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLVRTUGFja2V0aXplcjo6VFNQYWNrZXRpemVyKHVpbnQzMl90IGZsYWdzKQotICAgIDogbUZsYWdzKGZsYWdzKSwKLSAgICAgIG1QQVRDb250aW51aXR5Q291bnRlcigwKSwKLSAgICAgIG1QTVRDb250aW51aXR5Q291bnRlcigwKSB7Ci0gICAgaW5pdENyY1RhYmxlKCk7Ci0KLSAgICBpZiAoZmxhZ3MgJiAoRU1JVF9IRENQMjBfREVTQ1JJUFRPUiB8IEVNSVRfSERDUDIxX0RFU0NSSVBUT1IpKSB7Ci0gICAgICAgIGludDMyX3QgaGRjcFZlcnNpb247Ci0gICAgICAgIGlmIChmbGFncyAmIEVNSVRfSERDUDIwX0RFU0NSSVBUT1IpIHsKLSAgICAgICAgICAgIENIRUNLKCEoZmxhZ3MgJiBFTUlUX0hEQ1AyMV9ERVNDUklQVE9SKSk7Ci0gICAgICAgICAgICBoZGNwVmVyc2lvbiA9IDB4MjA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBDSEVDSyghKGZsYWdzICYgRU1JVF9IRENQMjBfREVTQ1JJUFRPUikpOwotCi0gICAgICAgICAgICAvLyBIRENQMi4wIF9hbmRfIEhEQ1AgMi4xIHNwZWNzIHNheSB0byBzZXQgdGhlIHZlcnNpb24KLSAgICAgICAgICAgIC8vIGluc2lkZSB0aGUgSERDUCBkZXNjcmlwdG9yIHRvIDB4MjAhISEKLSAgICAgICAgICAgIGhkY3BWZXJzaW9uID0gMHgyMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEhEQ1AgZGVzY3JpcHRvcgotICAgICAgICBzcDxBQnVmZmVyPiBkZXNjcmlwdG9yID0gbmV3IEFCdWZmZXIoNyk7Ci0gICAgICAgIHVpbnQ4X3QgKmRhdGEgPSBkZXNjcmlwdG9yLT5kYXRhKCk7Ci0gICAgICAgIGRhdGFbMF0gPSAweDA1OyAgLy8gZGVzY3JpcHRvcl90YWcKLSAgICAgICAgZGF0YVsxXSA9IDU7ICAvLyBkZXNjcmlwdG9yX2xlbmd0aAotICAgICAgICBkYXRhWzJdID0gJ0gnOwotICAgICAgICBkYXRhWzNdID0gJ0QnOwotICAgICAgICBkYXRhWzRdID0gJ0MnOwotICAgICAgICBkYXRhWzVdID0gJ1AnOwotICAgICAgICBkYXRhWzZdID0gaGRjcFZlcnNpb247Ci0KLSAgICAgICAgbVByb2dyYW1JbmZvRGVzY3JpcHRvcnMucHVzaF9iYWNrKGRlc2NyaXB0b3IpOwotICAgIH0KLX0KLQotVFNQYWNrZXRpemVyOjp+VFNQYWNrZXRpemVyKCkgewotfQotCi1zc2l6ZV90IFRTUGFja2V0aXplcjo6YWRkVHJhY2soY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKLSAgICBBU3RyaW5nIG1pbWU7Ci0gICAgQ0hFQ0soZm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKLQotICAgIHVuc2lnbmVkIFBJRFN0YXJ0OwotICAgIGJvb2wgaXNWaWRlbyA9ICFzdHJuY2FzZWNtcCgidmlkZW8vIiwgbWltZS5jX3N0cigpLCA2KTsKLSAgICBib29sIGlzQXVkaW8gPSAhc3RybmNhc2VjbXAoImF1ZGlvLyIsIG1pbWUuY19zdHIoKSwgNik7Ci0KLSAgICBpZiAoaXNWaWRlbykgewotICAgICAgICBQSURTdGFydCA9IDB4MTAxMTsKLSAgICB9IGVsc2UgaWYgKGlzQXVkaW8pIHsKLSAgICAgICAgUElEU3RhcnQgPSAweDExMDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwotICAgIH0KLQotICAgIHVuc2lnbmVkIHN0cmVhbVR5cGU7Ci0gICAgdW5zaWduZWQgc3RyZWFtSURTdGFydDsKLSAgICB1bnNpZ25lZCBzdHJlYW1JRFN0b3A7Ci0KLSAgICBpZiAoIXN0cmNhc2VjbXAobWltZS5jX3N0cigpLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpKSB7Ci0gICAgICAgIHN0cmVhbVR5cGUgPSAweDFiOwotICAgICAgICBzdHJlYW1JRFN0YXJ0ID0gMHhlMDsKLSAgICAgICAgc3RyZWFtSURTdG9wID0gMHhlZjsKLSAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUuY19zdHIoKSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKSkgewotICAgICAgICBzdHJlYW1UeXBlID0gMHgwZjsKLSAgICAgICAgc3RyZWFtSURTdGFydCA9IDB4YzA7Ci0gICAgICAgIHN0cmVhbUlEU3RvcCA9IDB4ZGY7Ci0gICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLmNfc3RyKCksIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpIHsKLSAgICAgICAgc3RyZWFtVHlwZSA9IDB4ODM7Ci0gICAgICAgIHN0cmVhbUlEU3RhcnQgPSAweGJkOwotICAgICAgICBzdHJlYW1JRFN0b3AgPSAweGJkOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBzaXplX3QgbnVtVHJhY2tzT2ZUaGlzVHlwZSA9IDA7Ci0gICAgdW5zaWduZWQgUElEID0gUElEU3RhcnQ7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgY29uc3Qgc3A8VHJhY2s+ICZ0cmFjayA9IG1UcmFja3MuaXRlbUF0KGkpOwotCi0gICAgICAgIGlmICh0cmFjay0+c3RyZWFtVHlwZSgpID09IHN0cmVhbVR5cGUpIHsKLSAgICAgICAgICAgICsrbnVtVHJhY2tzT2ZUaGlzVHlwZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgoaXNBdWRpbyAmJiB0cmFjay0+aXNBdWRpbygpKSB8fCAoaXNWaWRlbyAmJiB0cmFjay0+aXNWaWRlbygpKSkgewotICAgICAgICAgICAgKytQSUQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB1bnNpZ25lZCBzdHJlYW1JRCA9IHN0cmVhbUlEU3RhcnQgKyBudW1UcmFja3NPZlRoaXNUeXBlOwotICAgIGlmIChzdHJlYW1JRCA+IHN0cmVhbUlEU3RvcCkgewotICAgICAgICByZXR1cm4gLUVSQU5HRTsKLSAgICB9Ci0KLSAgICBzcDxUcmFjaz4gdHJhY2sgPSBuZXcgVHJhY2soZm9ybWF0LCBQSUQsIHN0cmVhbVR5cGUsIHN0cmVhbUlEKTsKLSAgICByZXR1cm4gbVRyYWNrcy5hZGQodHJhY2spOwotfQotCi1zdGF0dXNfdCBUU1BhY2tldGl6ZXI6OmV4dHJhY3RDU0RJZk5lY2Vzc2FyeShzaXplX3QgdHJhY2tJbmRleCkgewotICAgIGlmICh0cmFja0luZGV4ID49IG1UcmFja3Muc2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiAtRVJBTkdFOwotICAgIH0KLQotICAgIGNvbnN0IHNwPFRyYWNrPiAmdHJhY2sgPSBtVHJhY2tzLml0ZW1BdCh0cmFja0luZGV4KTsKLSAgICB0cmFjay0+ZXh0cmFjdENTRElmTmVjZXNzYXJ5KCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFRTUGFja2V0aXplcjo6cGFja2V0aXplKAotICAgICAgICBzaXplX3QgdHJhY2tJbmRleCwKLSAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJl9hY2Nlc3NVbml0LAotICAgICAgICBzcDxBQnVmZmVyPiAqcGFja2V0cywKLSAgICAgICAgdWludDMyX3QgZmxhZ3MsCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKlBFU19wcml2YXRlX2RhdGEsIHNpemVfdCBQRVNfcHJpdmF0ZV9kYXRhX2xlbiwKLSAgICAgICAgc2l6ZV90IG51bVN0dWZmaW5nQnl0ZXMpIHsKLSAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0ID0gX2FjY2Vzc1VuaXQ7Ci0KLSAgICBpbnQ2NF90IHRpbWVVczsKLSAgICBDSEVDSyhhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwotCi0gICAgcGFja2V0cy0+Y2xlYXIoKTsKLQotICAgIGlmICh0cmFja0luZGV4ID49IG1UcmFja3Muc2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiAtRVJBTkdFOwotICAgIH0KLQotICAgIGNvbnN0IHNwPFRyYWNrPiAmdHJhY2sgPSBtVHJhY2tzLml0ZW1BdCh0cmFja0luZGV4KTsKLQotICAgIGlmICh0cmFjay0+aXNIMjY0KCkgJiYgKGZsYWdzICYgUFJFUEVORF9TUFNfUFBTX1RPX0lEUl9GUkFNRVMpCi0gICAgICAgICAgICAmJiBJc0lEUihhY2Nlc3NVbml0KSkgewotICAgICAgICAvLyBwcmVwZW5kIGNvZGVjIHNwZWNpZmljIGRhdGEsIGkuZS4gU1BTIGFuZCBQUFMuCi0gICAgICAgIGFjY2Vzc1VuaXQgPSB0cmFjay0+cHJlcGVuZENTRChhY2Nlc3NVbml0KTsKLSAgICB9IGVsc2UgaWYgKHRyYWNrLT5pc0FBQygpICYmIHRyYWNrLT5sYWNrc0FEVFNIZWFkZXIoKSkgewotICAgICAgICBDSEVDSyghKGZsYWdzICYgSVNfRU5DUllQVEVEKSk7Ci0gICAgICAgIGFjY2Vzc1VuaXQgPSB0cmFjay0+cHJlcGVuZEFEVFNIZWFkZXIoYWNjZXNzVW5pdCk7Ci0gICAgfQotCi0gICAgLy8gMHg0NwotICAgIC8vIHRyYW5zcG9ydF9lcnJvcl9pbmRpY2F0b3IgPSBiMAotICAgIC8vIHBheWxvYWRfdW5pdF9zdGFydF9pbmRpY2F0b3IgPSBiMQotICAgIC8vIHRyYW5zcG9ydF9wcmlvcml0eSA9IGIwCi0gICAgLy8gUElECi0gICAgLy8gdHJhbnNwb3J0X3NjcmFtYmxpbmdfY29udHJvbCA9IGIwMAotICAgIC8vIGFkYXB0YXRpb25fZmllbGRfY29udHJvbCA9IGI/PwotICAgIC8vIGNvbnRpbnVpdHlfY291bnRlciA9IGI/Pz8/Ci0gICAgLy8gLS0gcGF5bG9hZCBmb2xsb3dzCi0gICAgLy8gcGFja2V0X3N0YXJ0Y29kZV9wcmVmaXggPSAweDAwMDAwMQotICAgIC8vIHN0cmVhbV9pZAotICAgIC8vIFBFU19wYWNrZXRfbGVuZ3RoID0gMHg/Pz8/Ci0gICAgLy8gcmVzZXJ2ZWQgPSBiMTAKLSAgICAvLyBQRVNfc2NyYW1ibGluZ19jb250cm9sID0gYjAwCi0gICAgLy8gUEVTX3ByaW9yaXR5ID0gYjAKLSAgICAvLyBkYXRhX2FsaWdubWVudF9pbmRpY2F0b3IgPSBiMQotICAgIC8vIGNvcHlyaWdodCA9IGIwCi0gICAgLy8gb3JpZ2luYWxfb3JfY29weSA9IGIwCi0gICAgLy8gUFRTX0RUU19mbGFncyA9IGIxMCAgKFBUUyBvbmx5KQotICAgIC8vIEVTQ1JfZmxhZyA9IGIwCi0gICAgLy8gRVNfcmF0ZV9mbGFnID0gYjAKLSAgICAvLyBEU01fdHJpY2tfbW9kZV9mbGFnID0gYjAKLSAgICAvLyBhZGRpdGlvbmFsX2NvcHlfaW5mb19mbGFnID0gYjAKLSAgICAvLyBQRVNfQ1JDX2ZsYWcgPSBiMAotICAgIC8vIFBFU19leHRlbnNpb25fZmxhZyA9IGIwCi0gICAgLy8gUEVTX2hlYWRlcl9kYXRhX2xlbmd0aCA9IDB4MDUKLSAgICAvLyByZXNlcnZlZCA9IGIwMDEwIChQVFMpCi0gICAgLy8gUFRTWzMyLi4zMF0gPSBiPz8/Ci0gICAgLy8gcmVzZXJ2ZWQgPSBiMQotICAgIC8vIFBUU1syOS4uMTVdID0gYj8/PyA/Pz8/ID8/Pz8gPz8/PyAoMTUgYml0cykKLSAgICAvLyByZXNlcnZlZCA9IGIxCi0gICAgLy8gUFRTWzE0Li4wXSA9IGI/Pz8gPz8/PyA/Pz8/ID8/Pz8gKDE1IGJpdHMpCi0gICAgLy8gcmVzZXJ2ZWQgPSBiMQotICAgIC8vIHRoZSBmaXJzdCBmcmFnbWVudCBvZiAiYnVmZmVyIiBmb2xsb3dzCi0KLSAgICAvLyBFYWNoIHRyYW5zcG9ydCBwYWNrZXQgKGV4Y2VwdCBmb3IgdGhlIGxhc3Qgb25lIGNvbnRyaWJ1dGluZyB0byB0aGUgUEVTCi0gICAgLy8gcGF5bG9hZCkgbXVzdCBjb250YWluIGEgbXVsdGlwbGUgb2YgMTYgYnl0ZXMgb2YgcGF5bG9hZCBwZXIgSERDUCBzcGVjLgotICAgIGJvb2wgYWxpZ25QYXlsb2FkID0KLSAgICAgICAgKG1GbGFncyAmIChFTUlUX0hEQ1AyMF9ERVNDUklQVE9SIHwgRU1JVF9IRENQMjFfREVTQ1JJUFRPUikpOwotCi0gICAgLyoKLSAgICAgICBhKSBUaGUgdmVyeSBmaXJzdCBQRVMgdHJhbnNwb3J0IHN0cmVhbSBwYWNrZXQgY29udGFpbnMKLQotICAgICAgIDQgYnl0ZXMgb2YgVFMgaGVhZGVyCi0gICAgICAgLi4uIHBhZGRpbmcKLSAgICAgICAxNCBieXRlcyBvZiBzdGF0aWMgUEVTIGhlYWRlcgotICAgICAgIFBFU19wcml2YXRlX2RhdGFfbGVuICsgMSBieXRlcyAob25seSBpZiBQRVNfcHJpdmF0ZV9kYXRhX2xlbiA+IDApCi0gICAgICAgbnVtU3R1ZmZpbmdCeXRlcyBieXRlcwotCi0gICAgICAgZm9sbG93ZWQgYnkgdGhlIHBheWxvYWQKLQotICAgICAgIGIpIFN1YnNlcXVlbnQgUEVTIHRyYW5zcG9ydCBzdHJlYW0gcGFja2V0cyBjb250YWluCi0KLSAgICAgICA0IGJ5dGVzIG9mIFRTIGhlYWRlcgotICAgICAgIC4uLiBwYWRkaW5nCi0KLSAgICAgICBmb2xsb3dlZCBieSB0aGUgcGF5bG9hZAotICAgICovCi0KLSAgICBzaXplX3QgUEVTX3BhY2tldF9sZW5ndGggPSBhY2Nlc3NVbml0LT5zaXplKCkgKyA4ICsgbnVtU3R1ZmZpbmdCeXRlczsKLSAgICBpZiAoUEVTX3ByaXZhdGVfZGF0YV9sZW4gPiAwKSB7Ci0gICAgICAgIFBFU19wYWNrZXRfbGVuZ3RoICs9IFBFU19wcml2YXRlX2RhdGFfbGVuICsgMTsKLSAgICB9Ci0KLSAgICBzaXplX3QgbnVtVFNQYWNrZXRzID0gMTsKLQotICAgIHsKLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBQRVMgaGVhZGVyIGZpdHMgaW50byBhIHNpbmdsZSBUUyBwYWNrZXQ6Ci0gICAgICAgIHNpemVfdCBQRVNfaGVhZGVyX3NpemUgPSAxNCArIG51bVN0dWZmaW5nQnl0ZXM7Ci0gICAgICAgIGlmIChQRVNfcHJpdmF0ZV9kYXRhX2xlbiA+IDApIHsKLSAgICAgICAgICAgIFBFU19oZWFkZXJfc2l6ZSArPSBQRVNfcHJpdmF0ZV9kYXRhX2xlbiArIDE7Ci0gICAgICAgIH0KLQotICAgICAgICBDSEVDS19MRShQRVNfaGVhZGVyX3NpemUsIDE4OHUgLSA0dSk7Ci0KLSAgICAgICAgc2l6ZV90IHNpemVBdmFpbGFibGVGb3JQYXlsb2FkID0gMTg4IC0gNCAtIFBFU19oZWFkZXJfc2l6ZTsKLSAgICAgICAgc2l6ZV90IG51bUJ5dGVzT2ZQYXlsb2FkID0gYWNjZXNzVW5pdC0+c2l6ZSgpOwotCi0gICAgICAgIGlmIChudW1CeXRlc09mUGF5bG9hZCA+IHNpemVBdmFpbGFibGVGb3JQYXlsb2FkKSB7Ci0gICAgICAgICAgICBudW1CeXRlc09mUGF5bG9hZCA9IHNpemVBdmFpbGFibGVGb3JQYXlsb2FkOwotCi0gICAgICAgICAgICBpZiAoYWxpZ25QYXlsb2FkICYmIG51bUJ5dGVzT2ZQYXlsb2FkID4gMTYpIHsKLSAgICAgICAgICAgICAgICBudW1CeXRlc09mUGF5bG9hZCAtPSAobnVtQnl0ZXNPZlBheWxvYWQgJSAxNik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzaXplX3QgbnVtUGFkZGluZ0J5dGVzID0gc2l6ZUF2YWlsYWJsZUZvclBheWxvYWQgLSBudW1CeXRlc09mUGF5bG9hZDsKLSAgICAgICAgQUxPR1YoInBhY2tldCAxIGNvbnRhaW5zICV6ZCBwYWRkaW5nIGJ5dGVzIGFuZCAlemQgYnl0ZXMgb2YgcGF5bG9hZCIsCi0gICAgICAgICAgICAgIG51bVBhZGRpbmdCeXRlcywgbnVtQnl0ZXNPZlBheWxvYWQpOwotCi0gICAgICAgIHNpemVfdCBudW1CeXRlc09mUGF5bG9hZFJlbWFpbmluZyA9IGFjY2Vzc1VuaXQtPnNpemUoKSAtIG51bUJ5dGVzT2ZQYXlsb2FkOwotCi0jaWYgMAotICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGhvcGVmdWxseSBpbGx1c3RyYXRlcyB0aGUgbG9naWMgdGhhdCBsZWQgdG8gdGhlCi0gICAgICAgIC8vIG1vcmUgZWZmaWNpZW50IGNvbXB1dGF0aW9uIGluIHRoZSAjZWxzZSBibG9jay4uLgotCi0gICAgICAgIHdoaWxlIChudW1CeXRlc09mUGF5bG9hZFJlbWFpbmluZyA+IDApIHsKLSAgICAgICAgICAgIHNpemVfdCBzaXplQXZhaWxhYmxlRm9yUGF5bG9hZCA9IDE4OCAtIDQ7Ci0KLSAgICAgICAgICAgIHNpemVfdCBudW1CeXRlc09mUGF5bG9hZCA9IG51bUJ5dGVzT2ZQYXlsb2FkUmVtYWluaW5nOwotCi0gICAgICAgICAgICBpZiAobnVtQnl0ZXNPZlBheWxvYWQgPiBzaXplQXZhaWxhYmxlRm9yUGF5bG9hZCkgewotICAgICAgICAgICAgICAgIG51bUJ5dGVzT2ZQYXlsb2FkID0gc2l6ZUF2YWlsYWJsZUZvclBheWxvYWQ7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYWxpZ25QYXlsb2FkICYmIG51bUJ5dGVzT2ZQYXlsb2FkID4gMTYpIHsKLSAgICAgICAgICAgICAgICAgICAgbnVtQnl0ZXNPZlBheWxvYWQgLT0gKG51bUJ5dGVzT2ZQYXlsb2FkICUgMTYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2l6ZV90IG51bVBhZGRpbmdCeXRlcyA9IHNpemVBdmFpbGFibGVGb3JQYXlsb2FkIC0gbnVtQnl0ZXNPZlBheWxvYWQ7Ci0gICAgICAgICAgICBBTE9HSSgicGFja2V0ICV6ZCBjb250YWlucyAlemQgcGFkZGluZyBieXRlcyBhbmQgJXpkIGJ5dGVzIG9mIHBheWxvYWQiLAotICAgICAgICAgICAgICAgICAgICBudW1UU1BhY2tldHMgKyAxLCBudW1QYWRkaW5nQnl0ZXMsIG51bUJ5dGVzT2ZQYXlsb2FkKTsKLQotICAgICAgICAgICAgbnVtQnl0ZXNPZlBheWxvYWRSZW1haW5pbmcgLT0gbnVtQnl0ZXNPZlBheWxvYWQ7Ci0gICAgICAgICAgICArK251bVRTUGFja2V0czsKLSAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgLy8gVGhpcyBpcyBob3cgbWFueSBieXRlcyBvZiBwYXlsb2FkIGVhY2ggc3Vic2VxdWVudCBUUyBwYWNrZXQKLSAgICAgICAgLy8gY2FuIGNvbnRhaW4gYXQgbW9zdC4KLSAgICAgICAgc2l6ZUF2YWlsYWJsZUZvclBheWxvYWQgPSAxODggLSA0OwotICAgICAgICBzaXplX3Qgc2l6ZUF2YWlsYWJsZUZvckFsaWduZWRQYXlsb2FkID0gc2l6ZUF2YWlsYWJsZUZvclBheWxvYWQ7Ci0gICAgICAgIGlmIChhbGlnblBheWxvYWQpIHsKLSAgICAgICAgICAgIC8vIFdlJ3JlIG9ubHkgZ29pbmcgdG8gdXNlIGEgc3Vic2V0IG9mIHRoZSBhdmFpbGFibGUgc3BhY2UKLSAgICAgICAgICAgIC8vIHNpbmNlIHdlIG5lZWQgdG8gbWFrZSBlYWNoIGZyYWdtZW50IGEgbXVsdGlwbGUgb2YgMTYgaW4gc2l6ZS4KLSAgICAgICAgICAgIHNpemVBdmFpbGFibGVGb3JBbGlnbmVkUGF5bG9hZCAtPQotICAgICAgICAgICAgICAgIChzaXplQXZhaWxhYmxlRm9yQWxpZ25lZFBheWxvYWQgJSAxNik7Ci0gICAgICAgIH0KLQotICAgICAgICBzaXplX3QgbnVtRnVsbFRTUGFja2V0cyA9Ci0gICAgICAgICAgICBudW1CeXRlc09mUGF5bG9hZFJlbWFpbmluZyAvIHNpemVBdmFpbGFibGVGb3JBbGlnbmVkUGF5bG9hZDsKLQotICAgICAgICBudW1UU1BhY2tldHMgKz0gbnVtRnVsbFRTUGFja2V0czsKLQotICAgICAgICBudW1CeXRlc09mUGF5bG9hZFJlbWFpbmluZyAtPQotICAgICAgICAgICAgbnVtRnVsbFRTUGFja2V0cyAqIHNpemVBdmFpbGFibGVGb3JBbGlnbmVkUGF5bG9hZDsKLQotICAgICAgICAvLyBudW1CeXRlc09mUGF5bG9hZFJlbWFpbmluZyA8IHNpemVBdmFpbGFibGVGb3JBbGlnbmVkUGF5bG9hZAotICAgICAgICBpZiAobnVtRnVsbFRTUGFja2V0cyA9PSAwICYmIG51bUJ5dGVzT2ZQYXlsb2FkUmVtYWluaW5nID4gMCkgewotICAgICAgICAgICAgLy8gVGhlcmUgd2Fzbid0IGVub3VnaCBwYXlsb2FkIGxlZnQgdG8gZm9ybSBhIGZ1bGwgYWxpZ25lZCBwYXlsb2FkLAotICAgICAgICAgICAgLy8gdGhlIGxhc3QgcGFja2V0IGRvZXNuJ3QgaGF2ZSB0byBiZSBhbGlnbmVkLgotICAgICAgICAgICAgKytudW1UU1BhY2tldHM7Ci0gICAgICAgIH0gZWxzZSBpZiAobnVtRnVsbFRTUGFja2V0cyA+IDAKLSAgICAgICAgICAgICAgICAmJiBudW1CeXRlc09mUGF5bG9hZFJlbWFpbmluZwotICAgICAgICAgICAgICAgICAgICArIHNpemVBdmFpbGFibGVGb3JBbGlnbmVkUGF5bG9hZCA+IHNpemVBdmFpbGFibGVGb3JQYXlsb2FkKSB7Ci0gICAgICAgICAgICAvLyBUaGUgbGFzdCBwYWNrZXQgZW1pdHRlZCBoYWQgYSBmdWxsIGFsaWduZWQgcGF5bG9hZCBhbmQgdG9nZXRoZXIKLSAgICAgICAgICAgIC8vIHdpdGggdGhlIGJ5dGVzIHJlbWFpbmluZyBkb2VzIGV4Y2VlZCB0aGUgdW5hbGlnbmVkIHBheWxvYWQKLSAgICAgICAgICAgIC8vIHNpemUsIHNvIHdlIG5lZWQgYW5vdGhlciBwYWNrZXQuCi0gICAgICAgICAgICArK251bVRTUGFja2V0czsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgfQotCi0gICAgaWYgKGZsYWdzICYgRU1JVF9QQVRfQU5EX1BNVCkgewotICAgICAgICBudW1UU1BhY2tldHMgKz0gMjsKLSAgICB9Ci0KLSAgICBpZiAoZmxhZ3MgJiBFTUlUX1BDUikgewotICAgICAgICArK251bVRTUGFja2V0czsKLSAgICB9Ci0KLSAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcihudW1UU1BhY2tldHMgKiAxODgpOwotICAgIHVpbnQ4X3QgKnBhY2tldERhdGFTdGFydCA9IGJ1ZmZlci0+ZGF0YSgpOwotCi0gICAgaWYgKGZsYWdzICYgRU1JVF9QQVRfQU5EX1BNVCkgewotICAgICAgICAvLyBQcm9ncmFtIEFzc29jaWF0aW9uIFRhYmxlIChQQVQpOgotICAgICAgICAvLyAweDQ3Ci0gICAgICAgIC8vIHRyYW5zcG9ydF9lcnJvcl9pbmRpY2F0b3IgPSBiMAotICAgICAgICAvLyBwYXlsb2FkX3VuaXRfc3RhcnRfaW5kaWNhdG9yID0gYjEKLSAgICAgICAgLy8gdHJhbnNwb3J0X3ByaW9yaXR5ID0gYjAKLSAgICAgICAgLy8gUElEID0gYjAwMDAwMDAwMDAwMDAgKDEzIGJpdHMpCi0gICAgICAgIC8vIHRyYW5zcG9ydF9zY3JhbWJsaW5nX2NvbnRyb2wgPSBiMDAKLSAgICAgICAgLy8gYWRhcHRhdGlvbl9maWVsZF9jb250cm9sID0gYjAxIChubyBhZGFwdGF0aW9uIGZpZWxkLCBwYXlsb2FkIG9ubHkpCi0gICAgICAgIC8vIGNvbnRpbnVpdHlfY291bnRlciA9IGI/Pz8/Ci0gICAgICAgIC8vIHNraXAgPSAweDAwCi0gICAgICAgIC8vIC0tLSBwYXlsb2FkIGZvbGxvd3MKLSAgICAgICAgLy8gdGFibGVfaWQgPSAweDAwCi0gICAgICAgIC8vIHNlY3Rpb25fc3ludGF4X2luZGljYXRvciA9IGIxCi0gICAgICAgIC8vIG11c3RfYmVfemVybyA9IGIwCi0gICAgICAgIC8vIHJlc2VydmVkID0gYjExCi0gICAgICAgIC8vIHNlY3Rpb25fbGVuZ3RoID0gMHgwMGQKLSAgICAgICAgLy8gdHJhbnNwb3J0X3N0cmVhbV9pZCA9IDB4MDAwMAotICAgICAgICAvLyByZXNlcnZlZCA9IGIxMQotICAgICAgICAvLyB2ZXJzaW9uX251bWJlciA9IGIwMDAwMQotICAgICAgICAvLyBjdXJyZW50X25leHRfaW5kaWNhdG9yID0gYjEKLSAgICAgICAgLy8gc2VjdGlvbl9udW1iZXIgPSAweDAwCi0gICAgICAgIC8vIGxhc3Rfc2VjdGlvbl9udW1iZXIgPSAweDAwCi0gICAgICAgIC8vICAgb25lIHByb2dyYW0gZm9sbG93czoKLSAgICAgICAgLy8gICBwcm9ncmFtX251bWJlciA9IDB4MDAwMQotICAgICAgICAvLyAgIHJlc2VydmVkID0gYjExMQotICAgICAgICAvLyAgIHByb2dyYW1fbWFwX1BJRCA9IGtQSURfUE1UICgxMyBiaXRzISkKLSAgICAgICAgLy8gQ1JDID0gMHg/Pz8/Pz8/PwotCi0gICAgICAgIGlmICgrK21QQVRDb250aW51aXR5Q291bnRlciA9PSAxNikgewotICAgICAgICAgICAgbVBBVENvbnRpbnVpdHlDb3VudGVyID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHVpbnQ4X3QgKnB0ciA9IHBhY2tldERhdGFTdGFydDsKLSAgICAgICAgKnB0cisrID0gMHg0NzsKLSAgICAgICAgKnB0cisrID0gMHg0MDsKLSAgICAgICAgKnB0cisrID0gMHgwMDsKLSAgICAgICAgKnB0cisrID0gMHgxMCB8IG1QQVRDb250aW51aXR5Q291bnRlcjsKLSAgICAgICAgKnB0cisrID0gMHgwMDsKLQotICAgICAgICB1aW50OF90ICpjcmNEYXRhU3RhcnQgPSBwdHI7Ci0gICAgICAgICpwdHIrKyA9IDB4MDA7Ci0gICAgICAgICpwdHIrKyA9IDB4YjA7Ci0gICAgICAgICpwdHIrKyA9IDB4MGQ7Ci0gICAgICAgICpwdHIrKyA9IDB4MDA7Ci0gICAgICAgICpwdHIrKyA9IDB4MDA7Ci0gICAgICAgICpwdHIrKyA9IDB4YzM7Ci0gICAgICAgICpwdHIrKyA9IDB4MDA7Ci0gICAgICAgICpwdHIrKyA9IDB4MDA7Ci0gICAgICAgICpwdHIrKyA9IDB4MDA7Ci0gICAgICAgICpwdHIrKyA9IDB4MDE7Ci0gICAgICAgICpwdHIrKyA9IDB4ZTAgfCAoa1BJRF9QTVQgPj4gOCk7Ci0gICAgICAgICpwdHIrKyA9IGtQSURfUE1UICYgMHhmZjsKLQotICAgICAgICBDSEVDS19FUShwdHIgLSBjcmNEYXRhU3RhcnQsIDEyKTsKLSAgICAgICAgdWludDMyX3QgY3JjID0gaHRvbmwoY3JjMzIoY3JjRGF0YVN0YXJ0LCBwdHIgLSBjcmNEYXRhU3RhcnQpKTsKLSAgICAgICAgbWVtY3B5KHB0ciwgJmNyYywgNCk7Ci0gICAgICAgIHB0ciArPSA0OwotCi0gICAgICAgIHNpemVfdCBzaXplTGVmdCA9IHBhY2tldERhdGFTdGFydCArIDE4OCAtIHB0cjsKLSAgICAgICAgbWVtc2V0KHB0ciwgMHhmZiwgc2l6ZUxlZnQpOwotCi0gICAgICAgIHBhY2tldERhdGFTdGFydCArPSAxODg7Ci0KLSAgICAgICAgLy8gUHJvZ3JhbSBNYXAgKFBNVCk6Ci0gICAgICAgIC8vIDB4NDcKLSAgICAgICAgLy8gdHJhbnNwb3J0X2Vycm9yX2luZGljYXRvciA9IGIwCi0gICAgICAgIC8vIHBheWxvYWRfdW5pdF9zdGFydF9pbmRpY2F0b3IgPSBiMQotICAgICAgICAvLyB0cmFuc3BvcnRfcHJpb3JpdHkgPSBiMAotICAgICAgICAvLyBQSUQgPSBrUElEX1BNVCAoMTMgYml0cykKLSAgICAgICAgLy8gdHJhbnNwb3J0X3NjcmFtYmxpbmdfY29udHJvbCA9IGIwMAotICAgICAgICAvLyBhZGFwdGF0aW9uX2ZpZWxkX2NvbnRyb2wgPSBiMDEgKG5vIGFkYXB0YXRpb24gZmllbGQsIHBheWxvYWQgb25seSkKLSAgICAgICAgLy8gY29udGludWl0eV9jb3VudGVyID0gYj8/Pz8KLSAgICAgICAgLy8gc2tpcCA9IDB4MDAKLSAgICAgICAgLy8gLS0gcGF5bG9hZCBmb2xsb3dzCi0gICAgICAgIC8vIHRhYmxlX2lkID0gMHgwMgotICAgICAgICAvLyBzZWN0aW9uX3N5bnRheF9pbmRpY2F0b3IgPSBiMQotICAgICAgICAvLyBtdXN0X2JlX3plcm8gPSBiMAotICAgICAgICAvLyByZXNlcnZlZCA9IGIxMQotICAgICAgICAvLyBzZWN0aW9uX2xlbmd0aCA9IDB4Pz8/Ci0gICAgICAgIC8vIHByb2dyYW1fbnVtYmVyID0gMHgwMDAxCi0gICAgICAgIC8vIHJlc2VydmVkID0gYjExCi0gICAgICAgIC8vIHZlcnNpb25fbnVtYmVyID0gYjAwMDAxCi0gICAgICAgIC8vIGN1cnJlbnRfbmV4dF9pbmRpY2F0b3IgPSBiMQotICAgICAgICAvLyBzZWN0aW9uX251bWJlciA9IDB4MDAKLSAgICAgICAgLy8gbGFzdF9zZWN0aW9uX251bWJlciA9IDB4MDAKLSAgICAgICAgLy8gcmVzZXJ2ZWQgPSBiMTExCi0gICAgICAgIC8vIFBDUl9QSUQgPSBrUENSX1BJRCAoMTMgYml0cykKLSAgICAgICAgLy8gcmVzZXJ2ZWQgPSBiMTExMQotICAgICAgICAvLyBwcm9ncmFtX2luZm9fbGVuZ3RoID0gMHg/Pz8KLSAgICAgICAgLy8gICBwcm9ncmFtX2luZm9fZGVzY3JpcHRvcnMgZm9sbG93Ci0gICAgICAgIC8vIG9uZSBvciBtb3JlIGVsZW1lbnRhcnkgc3RyZWFtIGRlc2NyaXB0aW9ucyBmb2xsb3c6Ci0gICAgICAgIC8vICAgc3RyZWFtX3R5cGUgPSAweD8/Ci0gICAgICAgIC8vICAgcmVzZXJ2ZWQgPSBiMTExCi0gICAgICAgIC8vICAgZWxlbWVudGFyeV9QSUQgPSBiPyA/Pz8/ID8/Pz8gPz8/PyAoMTMgYml0cykKLSAgICAgICAgLy8gICByZXNlcnZlZCA9IGIxMTExCi0gICAgICAgIC8vICAgRVNfaW5mb19sZW5ndGggPSAweDAwMAotICAgICAgICAvLyBDUkMgPSAweD8/Pz8/Pz8/Ci0KLSAgICAgICAgaWYgKCsrbVBNVENvbnRpbnVpdHlDb3VudGVyID09IDE2KSB7Ci0gICAgICAgICAgICBtUE1UQ29udGludWl0eUNvdW50ZXIgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgcHRyID0gcGFja2V0RGF0YVN0YXJ0OwotICAgICAgICAqcHRyKysgPSAweDQ3OwotICAgICAgICAqcHRyKysgPSAweDQwIHwgKGtQSURfUE1UID4+IDgpOwotICAgICAgICAqcHRyKysgPSBrUElEX1BNVCAmIDB4ZmY7Ci0gICAgICAgICpwdHIrKyA9IDB4MTAgfCBtUE1UQ29udGludWl0eUNvdW50ZXI7Ci0gICAgICAgICpwdHIrKyA9IDB4MDA7Ci0KLSAgICAgICAgY3JjRGF0YVN0YXJ0ID0gcHRyOwotICAgICAgICAqcHRyKysgPSAweDAyOwotCi0gICAgICAgICpwdHIrKyA9IDB4MDA7ICAvLyBzZWN0aW9uX2xlbmd0aCB0byBiZSBmaWxsZWQgaW4gYmVsb3cuCi0gICAgICAgICpwdHIrKyA9IDB4MDA7Ci0KLSAgICAgICAgKnB0cisrID0gMHgwMDsKLSAgICAgICAgKnB0cisrID0gMHgwMTsKLSAgICAgICAgKnB0cisrID0gMHhjMzsKLSAgICAgICAgKnB0cisrID0gMHgwMDsKLSAgICAgICAgKnB0cisrID0gMHgwMDsKLSAgICAgICAgKnB0cisrID0gMHhlMCB8IChrUElEX1BDUiA+PiA4KTsKLSAgICAgICAgKnB0cisrID0ga1BJRF9QQ1IgJiAweGZmOwotCi0gICAgICAgIHNpemVfdCBwcm9ncmFtX2luZm9fbGVuZ3RoID0gMDsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUHJvZ3JhbUluZm9EZXNjcmlwdG9ycy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgcHJvZ3JhbV9pbmZvX2xlbmd0aCArPSBtUHJvZ3JhbUluZm9EZXNjcmlwdG9ycy5pdGVtQXQoaSktPnNpemUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIENIRUNLX0xUKHByb2dyYW1faW5mb19sZW5ndGgsIDB4NDAwdSk7Ci0gICAgICAgICpwdHIrKyA9IDB4ZjAgfCAocHJvZ3JhbV9pbmZvX2xlbmd0aCA+PiA4KTsKLSAgICAgICAgKnB0cisrID0gKHByb2dyYW1faW5mb19sZW5ndGggJiAweGZmKTsKLQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Qcm9ncmFtSW5mb0Rlc2NyaXB0b3JzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmZGVzYyA9IG1Qcm9ncmFtSW5mb0Rlc2NyaXB0b3JzLml0ZW1BdChpKTsKLSAgICAgICAgICAgIG1lbWNweShwdHIsIGRlc2MtPmRhdGEoKSwgZGVzYy0+c2l6ZSgpKTsKLSAgICAgICAgICAgIHB0ciArPSBkZXNjLT5zaXplKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIGNvbnN0IHNwPFRyYWNrPiAmdHJhY2sgPSBtVHJhY2tzLml0ZW1BdChpKTsKLQotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIGFsbCB0aGUgZGVjcmlwdG9ycyBoYXZlIGJlZW4gYWRkZWQuCi0gICAgICAgICAgICB0cmFjay0+ZmluYWxpemUoKTsKLQotICAgICAgICAgICAgKnB0cisrID0gdHJhY2stPnN0cmVhbVR5cGUoKTsKLSAgICAgICAgICAgICpwdHIrKyA9IDB4ZTAgfCAodHJhY2stPlBJRCgpID4+IDgpOwotICAgICAgICAgICAgKnB0cisrID0gdHJhY2stPlBJRCgpICYgMHhmZjsKLQotICAgICAgICAgICAgc2l6ZV90IEVTX2luZm9fbGVuZ3RoID0gMDsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdHJhY2stPmNvdW50RGVzY3JpcHRvcnMoKTsgKytpKSB7Ci0gICAgICAgICAgICAgICAgRVNfaW5mb19sZW5ndGggKz0gdHJhY2stPmRlc2NyaXB0b3JBdChpKS0+c2l6ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ0hFQ0tfTEUoRVNfaW5mb19sZW5ndGgsIDB4ZmZmdSk7Ci0KLSAgICAgICAgICAgICpwdHIrKyA9IDB4ZjAgfCAoRVNfaW5mb19sZW5ndGggPj4gOCk7Ci0gICAgICAgICAgICAqcHRyKysgPSAoRVNfaW5mb19sZW5ndGggJiAweGZmKTsKLQotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0cmFjay0+Y291bnREZXNjcmlwdG9ycygpOyArK2kpIHsKLSAgICAgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmZGVzY3JpcHRvciA9IHRyYWNrLT5kZXNjcmlwdG9yQXQoaSk7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KHB0ciwgZGVzY3JpcHRvci0+ZGF0YSgpLCBkZXNjcmlwdG9yLT5zaXplKCkpOwotICAgICAgICAgICAgICAgIHB0ciArPSBkZXNjcmlwdG9yLT5zaXplKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzaXplX3Qgc2VjdGlvbl9sZW5ndGggPSBwdHIgLSAoY3JjRGF0YVN0YXJ0ICsgMykgKyA0IC8qIENSQyAqLzsKLQotICAgICAgICBjcmNEYXRhU3RhcnRbMV0gPSAweGIwIHwgKHNlY3Rpb25fbGVuZ3RoID4+IDgpOwotICAgICAgICBjcmNEYXRhU3RhcnRbMl0gPSBzZWN0aW9uX2xlbmd0aCAmIDB4ZmY7Ci0KLSAgICAgICAgY3JjID0gaHRvbmwoY3JjMzIoY3JjRGF0YVN0YXJ0LCBwdHIgLSBjcmNEYXRhU3RhcnQpKTsKLSAgICAgICAgbWVtY3B5KHB0ciwgJmNyYywgNCk7Ci0gICAgICAgIHB0ciArPSA0OwotCi0gICAgICAgIHNpemVMZWZ0ID0gcGFja2V0RGF0YVN0YXJ0ICsgMTg4IC0gcHRyOwotICAgICAgICBtZW1zZXQocHRyLCAweGZmLCBzaXplTGVmdCk7Ci0KLSAgICAgICAgcGFja2V0RGF0YVN0YXJ0ICs9IDE4ODsKLSAgICB9Ci0KLSAgICBpZiAoZmxhZ3MgJiBFTUlUX1BDUikgewotICAgICAgICAvLyBQQ1Igc3RyZWFtCi0gICAgICAgIC8vIDB4NDcKLSAgICAgICAgLy8gdHJhbnNwb3J0X2Vycm9yX2luZGljYXRvciA9IGIwCi0gICAgICAgIC8vIHBheWxvYWRfdW5pdF9zdGFydF9pbmRpY2F0b3IgPSBiMQotICAgICAgICAvLyB0cmFuc3BvcnRfcHJpb3JpdHkgPSBiMAotICAgICAgICAvLyBQSUQgPSBrUENSX1BJRCAoMTMgYml0cykKLSAgICAgICAgLy8gdHJhbnNwb3J0X3NjcmFtYmxpbmdfY29udHJvbCA9IGIwMAotICAgICAgICAvLyBhZGFwdGF0aW9uX2ZpZWxkX2NvbnRyb2wgPSBiMTAgKGFkYXB0YXRpb24gZmllbGQgb25seSwgbm8gcGF5bG9hZCkKLSAgICAgICAgLy8gY29udGludWl0eV9jb3VudGVyID0gYjAwMDAgKGRvZXMgbm90IGluY3JlbWVudCkKLSAgICAgICAgLy8gYWRhcHRhdGlvbl9maWVsZF9sZW5ndGggPSAxODMKLSAgICAgICAgLy8gZGlzY29udGludWl0eV9pbmRpY2F0b3IgPSBiMAotICAgICAgICAvLyByYW5kb21fYWNjZXNzX2luZGljYXRvciA9IGIwCi0gICAgICAgIC8vIGVsZW1lbnRhcnlfc3RyZWFtX3ByaW9yaXR5X2luZGljYXRvciA9IGIwCi0gICAgICAgIC8vIFBDUl9mbGFnID0gYjEKLSAgICAgICAgLy8gT1BDUl9mbGFnID0gYjAKLSAgICAgICAgLy8gc3BsaWNpbmdfcG9pbnRfZmxhZyA9IGIwCi0gICAgICAgIC8vIHRyYW5zcG9ydF9wcml2YXRlX2RhdGFfZmxhZyA9IGIwCi0gICAgICAgIC8vIGFkYXB0YXRpb25fZmllbGRfZXh0ZW5zaW9uX2ZsYWcgPSBiMAotICAgICAgICAvLyBwcm9ncmFtX2Nsb2NrX3JlZmVyZW5jZV9iYXNlID0gYj8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/PwotICAgICAgICAvLyByZXNlcnZlZCA9IGIxMTExMTEKLSAgICAgICAgLy8gcHJvZ3JhbV9jbG9ja19yZWZlcmVuY2VfZXh0ZW5zaW9uID0gYj8/Pz8/Pz8/PwotCi0gICAgICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwotCi0gICAgICAgIHVpbnQ2NF90IFBDUiA9IG5vd1VzICogMjc7ICAvLyBQQ1IgYmFzZWQgb24gYSAyN01IeiBjbG9jawotICAgICAgICB1aW50NjRfdCBQQ1JfYmFzZSA9IFBDUiAvIDMwMDsKLSAgICAgICAgdWludDMyX3QgUENSX2V4dCA9IFBDUiAlIDMwMDsKLQotICAgICAgICB1aW50OF90ICpwdHIgPSBwYWNrZXREYXRhU3RhcnQ7Ci0gICAgICAgICpwdHIrKyA9IDB4NDc7Ci0gICAgICAgICpwdHIrKyA9IDB4NDAgfCAoa1BJRF9QQ1IgPj4gOCk7Ci0gICAgICAgICpwdHIrKyA9IGtQSURfUENSICYgMHhmZjsKLSAgICAgICAgKnB0cisrID0gMHgyMDsKLSAgICAgICAgKnB0cisrID0gMHhiNzsgIC8vIGFkYXB0YXRpb25fZmllbGRfbGVuZ3RoCi0gICAgICAgICpwdHIrKyA9IDB4MTA7Ci0gICAgICAgICpwdHIrKyA9IChQQ1JfYmFzZSA+PiAyNSkgJiAweGZmOwotICAgICAgICAqcHRyKysgPSAoUENSX2Jhc2UgPj4gMTcpICYgMHhmZjsKLSAgICAgICAgKnB0cisrID0gKFBDUl9iYXNlID4+IDkpICYgMHhmZjsKLSAgICAgICAgKnB0cisrID0gKChQQ1JfYmFzZSAmIDEpIDw8IDcpIHwgMHg3ZSB8ICgoUENSX2V4dCA+PiA4KSAmIDEpOwotICAgICAgICAqcHRyKysgPSAoUENSX2V4dCAmIDB4ZmYpOwotCi0gICAgICAgIHNpemVfdCBzaXplTGVmdCA9IHBhY2tldERhdGFTdGFydCArIDE4OCAtIHB0cjsKLSAgICAgICAgbWVtc2V0KHB0ciwgMHhmZiwgc2l6ZUxlZnQpOwotCi0gICAgICAgIHBhY2tldERhdGFTdGFydCArPSAxODg7Ci0gICAgfQotCi0gICAgdWludDY0X3QgUFRTID0gKHRpbWVVcyAqIDlsbCkgLyAxMDBsbDsKLQotICAgIGlmIChQRVNfcGFja2V0X2xlbmd0aCA+PSA2NTUzNikgewotICAgICAgICAvLyBUaGlzIHJlYWxseSBzaG91bGQgb25seSBoYXBwZW4gZm9yIHZpZGVvLgotICAgICAgICBDSEVDSyh0cmFjay0+aXNWaWRlbygpKTsKLQotICAgICAgICAvLyBJdCdzIHZhbGlkIHRvIHNldCB0aGlzIHRvIDAgZm9yIHZpZGVvIGFjY29yZGluZyB0byB0aGUgc3BlY3MuCi0gICAgICAgIFBFU19wYWNrZXRfbGVuZ3RoID0gMDsKLSAgICB9Ci0KLSAgICBzaXplX3Qgc2l6ZUF2YWlsYWJsZUZvclBheWxvYWQgPSAxODggLSA0IC0gMTQgLSBudW1TdHVmZmluZ0J5dGVzOwotICAgIGlmIChQRVNfcHJpdmF0ZV9kYXRhX2xlbiA+IDApIHsKLSAgICAgICAgc2l6ZUF2YWlsYWJsZUZvclBheWxvYWQgLT0gUEVTX3ByaXZhdGVfZGF0YV9sZW4gKyAxOwotICAgIH0KLQotICAgIHNpemVfdCBjb3B5ID0gYWNjZXNzVW5pdC0+c2l6ZSgpOwotCi0gICAgaWYgKGNvcHkgPiBzaXplQXZhaWxhYmxlRm9yUGF5bG9hZCkgewotICAgICAgICBjb3B5ID0gc2l6ZUF2YWlsYWJsZUZvclBheWxvYWQ7Ci0KLSAgICAgICAgaWYgKGFsaWduUGF5bG9hZCAmJiBjb3B5ID4gMTYpIHsKLSAgICAgICAgICAgIGNvcHkgLT0gKGNvcHkgJSAxNik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzaXplX3QgbnVtUGFkZGluZ0J5dGVzID0gc2l6ZUF2YWlsYWJsZUZvclBheWxvYWQgLSBjb3B5OwotCi0gICAgdWludDhfdCAqcHRyID0gcGFja2V0RGF0YVN0YXJ0OwotICAgICpwdHIrKyA9IDB4NDc7Ci0gICAgKnB0cisrID0gMHg0MCB8ICh0cmFjay0+UElEKCkgPj4gOCk7Ci0gICAgKnB0cisrID0gdHJhY2stPlBJRCgpICYgMHhmZjsKLQotICAgICpwdHIrKyA9IChudW1QYWRkaW5nQnl0ZXMgPiAwID8gMHgzMCA6IDB4MTApCi0gICAgICAgICAgICAgICAgfCB0cmFjay0+aW5jcmVtZW50Q29udGludWl0eUNvdW50ZXIoKTsKLQotICAgIGlmIChudW1QYWRkaW5nQnl0ZXMgPiAwKSB7Ci0gICAgICAgICpwdHIrKyA9IG51bVBhZGRpbmdCeXRlcyAtIDE7Ci0gICAgICAgIGlmIChudW1QYWRkaW5nQnl0ZXMgPj0gMikgewotICAgICAgICAgICAgKnB0cisrID0gMHgwMDsKLSAgICAgICAgICAgIG1lbXNldChwdHIsIDB4ZmYsIG51bVBhZGRpbmdCeXRlcyAtIDIpOwotICAgICAgICAgICAgcHRyICs9IG51bVBhZGRpbmdCeXRlcyAtIDI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAqcHRyKysgPSAweDAwOwotICAgICpwdHIrKyA9IDB4MDA7Ci0gICAgKnB0cisrID0gMHgwMTsKLSAgICAqcHRyKysgPSB0cmFjay0+c3RyZWFtSUQoKTsKLSAgICAqcHRyKysgPSBQRVNfcGFja2V0X2xlbmd0aCA+PiA4OwotICAgICpwdHIrKyA9IFBFU19wYWNrZXRfbGVuZ3RoICYgMHhmZjsKLSAgICAqcHRyKysgPSAweDg0OwotICAgICpwdHIrKyA9IChQRVNfcHJpdmF0ZV9kYXRhX2xlbiA+IDApID8gMHg4MSA6IDB4ODA7Ci0KLSAgICBzaXplX3QgaGVhZGVyTGVuZ3RoID0gMHgwNSArIG51bVN0dWZmaW5nQnl0ZXM7Ci0gICAgaWYgKFBFU19wcml2YXRlX2RhdGFfbGVuID4gMCkgewotICAgICAgICBoZWFkZXJMZW5ndGggKz0gMSArIFBFU19wcml2YXRlX2RhdGFfbGVuOwotICAgIH0KLQotICAgICpwdHIrKyA9IGhlYWRlckxlbmd0aDsKLQotICAgICpwdHIrKyA9IDB4MjAgfCAoKChQVFMgPj4gMzApICYgNykgPDwgMSkgfCAxOwotICAgICpwdHIrKyA9IChQVFMgPj4gMjIpICYgMHhmZjsKLSAgICAqcHRyKysgPSAoKChQVFMgPj4gMTUpICYgMHg3ZikgPDwgMSkgfCAxOwotICAgICpwdHIrKyA9IChQVFMgPj4gNykgJiAweGZmOwotICAgICpwdHIrKyA9ICgoUFRTICYgMHg3ZikgPDwgMSkgfCAxOwotCi0gICAgaWYgKFBFU19wcml2YXRlX2RhdGFfbGVuID4gMCkgewotICAgICAgICAqcHRyKysgPSAweDhlOyAgLy8gUEVTX3ByaXZhdGVfZGF0YV9mbGFnLCByZXNlcnZlZC4KLSAgICAgICAgbWVtY3B5KHB0ciwgUEVTX3ByaXZhdGVfZGF0YSwgUEVTX3ByaXZhdGVfZGF0YV9sZW4pOwotICAgICAgICBwdHIgKz0gUEVTX3ByaXZhdGVfZGF0YV9sZW47Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TdHVmZmluZ0J5dGVzOyArK2kpIHsKLSAgICAgICAgKnB0cisrID0gMHhmZjsKLSAgICB9Ci0KLSAgICBtZW1jcHkocHRyLCBhY2Nlc3NVbml0LT5kYXRhKCksIGNvcHkpOwotICAgIHB0ciArPSBjb3B5OwotCi0gICAgQ0hFQ0tfRVEocHRyLCBwYWNrZXREYXRhU3RhcnQgKyAxODgpOwotICAgIHBhY2tldERhdGFTdGFydCArPSAxODg7Ci0KLSAgICBzaXplX3Qgb2Zmc2V0ID0gY29weTsKLSAgICB3aGlsZSAob2Zmc2V0IDwgYWNjZXNzVW5pdC0+c2l6ZSgpKSB7Ci0gICAgICAgIC8vIGZvciBzdWJzZXF1ZW50IGZyYWdtZW50cyBvZiAiYnVmZmVyIjoKLSAgICAgICAgLy8gMHg0NwotICAgICAgICAvLyB0cmFuc3BvcnRfZXJyb3JfaW5kaWNhdG9yID0gYjAKLSAgICAgICAgLy8gcGF5bG9hZF91bml0X3N0YXJ0X2luZGljYXRvciA9IGIwCi0gICAgICAgIC8vIHRyYW5zcG9ydF9wcmlvcml0eSA9IGIwCi0gICAgICAgIC8vIFBJRCA9IGIwIDAwMDEgMTExMCA/Pz8/ICgxMyBiaXRzKSBbMHgxZTAgKyAxICsgc291cmNlSW5kZXhdCi0gICAgICAgIC8vIHRyYW5zcG9ydF9zY3JhbWJsaW5nX2NvbnRyb2wgPSBiMDAKLSAgICAgICAgLy8gYWRhcHRhdGlvbl9maWVsZF9jb250cm9sID0gYj8/Ci0gICAgICAgIC8vIGNvbnRpbnVpdHlfY291bnRlciA9IGI/Pz8/Ci0gICAgICAgIC8vIHRoZSBmcmFnbWVudCBvZiAiYnVmZmVyIiBmb2xsb3dzLgotCi0gICAgICAgIHNpemVfdCBzaXplQXZhaWxhYmxlRm9yUGF5bG9hZCA9IDE4OCAtIDQ7Ci0KLSAgICAgICAgc2l6ZV90IGNvcHkgPSBhY2Nlc3NVbml0LT5zaXplKCkgLSBvZmZzZXQ7Ci0KLSAgICAgICAgaWYgKGNvcHkgPiBzaXplQXZhaWxhYmxlRm9yUGF5bG9hZCkgewotICAgICAgICAgICAgY29weSA9IHNpemVBdmFpbGFibGVGb3JQYXlsb2FkOwotCi0gICAgICAgICAgICBpZiAoYWxpZ25QYXlsb2FkICYmIGNvcHkgPiAxNikgewotICAgICAgICAgICAgICAgIGNvcHkgLT0gKGNvcHkgJSAxNik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzaXplX3QgbnVtUGFkZGluZ0J5dGVzID0gc2l6ZUF2YWlsYWJsZUZvclBheWxvYWQgLSBjb3B5OwotCi0gICAgICAgIHVpbnQ4X3QgKnB0ciA9IHBhY2tldERhdGFTdGFydDsKLSAgICAgICAgKnB0cisrID0gMHg0NzsKLSAgICAgICAgKnB0cisrID0gMHgwMCB8ICh0cmFjay0+UElEKCkgPj4gOCk7Ci0gICAgICAgICpwdHIrKyA9IHRyYWNrLT5QSUQoKSAmIDB4ZmY7Ci0KLSAgICAgICAgKnB0cisrID0gKG51bVBhZGRpbmdCeXRlcyA+IDAgPyAweDMwIDogMHgxMCkKLSAgICAgICAgICAgICAgICAgICAgfCB0cmFjay0+aW5jcmVtZW50Q29udGludWl0eUNvdW50ZXIoKTsKLQotICAgICAgICBpZiAobnVtUGFkZGluZ0J5dGVzID4gMCkgewotICAgICAgICAgICAgKnB0cisrID0gbnVtUGFkZGluZ0J5dGVzIC0gMTsKLSAgICAgICAgICAgIGlmIChudW1QYWRkaW5nQnl0ZXMgPj0gMikgewotICAgICAgICAgICAgICAgICpwdHIrKyA9IDB4MDA7Ci0gICAgICAgICAgICAgICAgbWVtc2V0KHB0ciwgMHhmZiwgbnVtUGFkZGluZ0J5dGVzIC0gMik7Ci0gICAgICAgICAgICAgICAgcHRyICs9IG51bVBhZGRpbmdCeXRlcyAtIDI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBtZW1jcHkocHRyLCBhY2Nlc3NVbml0LT5kYXRhKCkgKyBvZmZzZXQsIGNvcHkpOwotICAgICAgICBwdHIgKz0gY29weTsKLSAgICAgICAgQ0hFQ0tfRVEocHRyLCBwYWNrZXREYXRhU3RhcnQgKyAxODgpOwotCi0gICAgICAgIG9mZnNldCArPSBjb3B5OwotICAgICAgICBwYWNrZXREYXRhU3RhcnQgKz0gMTg4OwotICAgIH0KLQotICAgIENIRUNLKHBhY2tldERhdGFTdGFydCA9PSBidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+Y2FwYWNpdHkoKSk7Ci0KLSAgICAqcGFja2V0cyA9IGJ1ZmZlcjsKLQotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBUU1BhY2tldGl6ZXI6OmluaXRDcmNUYWJsZSgpIHsKLSAgICB1aW50MzJfdCBwb2x5ID0gMHgwNEMxMURCNzsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKLSAgICAgICAgdWludDMyX3QgY3JjID0gaSA8PCAyNDsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA4OyBqKyspIHsKLSAgICAgICAgICAgIGNyYyA9IChjcmMgPDwgMSkgXiAoKGNyYyAmIDB4ODAwMDAwMDApID8gKHBvbHkpIDogMCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUNyY1RhYmxlW2ldID0gY3JjOwotICAgIH0KLX0KLQotdWludDMyX3QgVFNQYWNrZXRpemVyOjpjcmMzMihjb25zdCB1aW50OF90ICpzdGFydCwgc2l6ZV90IHNpemUpIGNvbnN0IHsKLSAgICB1aW50MzJfdCBjcmMgPSAweEZGRkZGRkZGOwotICAgIGNvbnN0IHVpbnQ4X3QgKnA7Ci0KLSAgICBmb3IgKHAgPSBzdGFydDsgcCA8IHN0YXJ0ICsgc2l6ZTsgKytwKSB7Ci0gICAgICAgIGNyYyA9IChjcmMgPDwgOCkgXiBtQ3JjVGFibGVbKChjcmMgPj4gMjQpIF4gKnApICYgMHhGRl07Ci0gICAgfQotCi0gICAgcmV0dXJuIGNyYzsKLX0KLQotc3A8QUJ1ZmZlcj4gVFNQYWNrZXRpemVyOjpwcmVwZW5kQ1NEKAotICAgICAgICBzaXplX3QgdHJhY2tJbmRleCwgY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpIGNvbnN0IHsKLSAgICBDSEVDS19MVCh0cmFja0luZGV4LCBtVHJhY2tzLnNpemUoKSk7Ci0KLSAgICBjb25zdCBzcDxUcmFjaz4gJnRyYWNrID0gbVRyYWNrcy5pdGVtQXQodHJhY2tJbmRleCk7Ci0gICAgQ0hFQ0sodHJhY2stPmlzSDI2NCgpICYmIElzSURSKGFjY2Vzc1VuaXQpKTsKLQotICAgIGludDY0X3QgdGltZVVzOwotICAgIENIRUNLKGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7Ci0KLSAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0MiA9IHRyYWNrLT5wcmVwZW5kQ1NEKGFjY2Vzc1VuaXQpOwotCi0gICAgYWNjZXNzVW5pdDItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7Ci0KLSAgICByZXR1cm4gYWNjZXNzVW5pdDI7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvVFNQYWNrZXRpemVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1RTUGFja2V0aXplci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGNiMTc5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvVFNQYWNrZXRpemVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRTX1BBQ0tFVElaRVJfSF8KLQotI2RlZmluZSBUU19QQUNLRVRJWkVSX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBBQnVmZmVyOwotc3RydWN0IEFNZXNzYWdlOwotCi0vLyBGb3JtcyB0aGUgcGFja2V0cyBvZiBhIHRyYW5zcG9ydCBzdHJlYW0gZ2l2ZW4gYWNjZXNzIHVuaXRzLgotLy8gRW1pdHMgbWV0YWRhdGEgdGFibGVzIChQQVQgYW5kIFBNVCkgYW5kIHRpbWVzdGFtcCBzdHJlYW0gKFBDUikgYmFzZWQKLS8vIG9uIGZsYWdzLgotc3RydWN0IFRTUGFja2V0aXplciA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICBlbnVtIHsKLSAgICAgICAgRU1JVF9IRENQMjBfREVTQ1JJUFRPUiA9IDEsCi0gICAgICAgIEVNSVRfSERDUDIxX0RFU0NSSVBUT1IgPSAyLAotICAgIH07Ci0gICAgZXhwbGljaXQgVFNQYWNrZXRpemVyKHVpbnQzMl90IGZsYWdzKTsKLQotICAgIC8vIFJldHVybnMgdHJhY2tJbmRleCBvciBlcnJvci4KLSAgICBzc2l6ZV90IGFkZFRyYWNrKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KTsKLQotICAgIGVudW0gewotICAgICAgICBFTUlUX1BBVF9BTkRfUE1UICAgICAgICAgICAgICAgID0gMSwKLSAgICAgICAgRU1JVF9QQ1IgICAgICAgICAgICAgICAgICAgICAgICA9IDIsCi0gICAgICAgIElTX0VOQ1JZUFRFRCAgICAgICAgICAgICAgICAgICAgPSA0LAotICAgICAgICBQUkVQRU5EX1NQU19QUFNfVE9fSURSX0ZSQU1FUyAgID0gOCwKLSAgICB9OwotICAgIHN0YXR1c190IHBhY2tldGl6ZSgKLSAgICAgICAgICAgIHNpemVfdCB0cmFja0luZGV4LCBjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCwKLSAgICAgICAgICAgIHNwPEFCdWZmZXI+ICpwYWNrZXRzLAotICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCi0gICAgICAgICAgICBjb25zdCB1aW50OF90ICpQRVNfcHJpdmF0ZV9kYXRhLCBzaXplX3QgUEVTX3ByaXZhdGVfZGF0YV9sZW4sCi0gICAgICAgICAgICBzaXplX3QgbnVtU3R1ZmZpbmdCeXRlcyA9IDApOwotCi0gICAgc3RhdHVzX3QgZXh0cmFjdENTRElmTmVjZXNzYXJ5KHNpemVfdCB0cmFja0luZGV4KTsKLQotICAgIC8vIFhYWCB0byBiZSByZW1vdmVkIG9uY2UgZW5jb2RlciBjb25maWcgb3B0aW9uIHRha2VzIGNhcmUgb2YgdGhpcyBmb3IKLSAgICAvLyBlbmNyeXB0ZWQgbW9kZS4KLSAgICBzcDxBQnVmZmVyPiBwcmVwZW5kQ1NEKAotICAgICAgICAgICAgc2l6ZV90IHRyYWNrSW5kZXgsIGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KSBjb25zdDsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgflRTUGFja2V0aXplcigpOwotCi1wcml2YXRlOgotICAgIGVudW0gewotICAgICAgICBrUElEX1BNVCA9IDB4MTAwLAotICAgICAgICBrUElEX1BDUiA9IDB4MTAwMCwKLSAgICB9OwotCi0gICAgc3RydWN0IFRyYWNrOwotCi0gICAgdWludDMyX3QgbUZsYWdzOwotICAgIFZlY3RvcjxzcDxUcmFjaz4gPiBtVHJhY2tzOwotCi0gICAgVmVjdG9yPHNwPEFCdWZmZXI+ID4gbVByb2dyYW1JbmZvRGVzY3JpcHRvcnM7Ci0KLSAgICB1bnNpZ25lZCBtUEFUQ29udGludWl0eUNvdW50ZXI7Ci0gICAgdW5zaWduZWQgbVBNVENvbnRpbnVpdHlDb3VudGVyOwotCi0gICAgdWludDMyX3QgbUNyY1RhYmxlWzI1Nl07Ci0KLSAgICB2b2lkIGluaXRDcmNUYWJsZSgpOwotICAgIHVpbnQzMl90IGNyYzMyKGNvbnN0IHVpbnQ4X3QgKnN0YXJ0LCBzaXplX3Qgc2l6ZSkgY29uc3Q7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhUU1BhY2tldGl6ZXIpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBUU19QQUNLRVRJWkVSX0hfCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvV2lmaURpc3BsYXlTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9XaWZpRGlzcGxheVNvdXJjZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2OTVlNWQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9XaWZpRGlzcGxheVNvdXJjZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNzM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiV2lmaURpc3BsYXlTb3VyY2UiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJXaWZpRGlzcGxheVNvdXJjZS5oIgotI2luY2x1ZGUgIlBsYXliYWNrU2Vzc2lvbi5oIgotI2luY2x1ZGUgIlBhcmFtZXRlcnMuaCIKLSNpbmNsdWRlICJydHAvUlRQU2VuZGVyLmgiCi0KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9JSERDUC5oPgotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9JUmVtb3RlRGlzcGxheUNsaWVudC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vUGFyc2VkTWVzc2FnZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KLQotI2luY2x1ZGUgPGFycGEvaW5ldC5oPgotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIHN0YXRpYwotY29uc3QgaW50NjRfdCBXaWZpRGlzcGxheVNvdXJjZTo6a1JlYXBlckludGVydmFsVXM7Ci1jb25zdCBpbnQ2NF90IFdpZmlEaXNwbGF5U291cmNlOjprVGVhcmRvd25UcmlnZ2VyVGltZW91U2VjczsKLWNvbnN0IGludDY0X3QgV2lmaURpc3BsYXlTb3VyY2U6OmtQbGF5YmFja1Nlc3Npb25UaW1lb3V0U2VjczsKLWNvbnN0IGludDY0X3QgV2lmaURpc3BsYXlTb3VyY2U6OmtQbGF5YmFja1Nlc3Npb25UaW1lb3V0VXM7Ci1jb25zdCBBU3RyaW5nIFdpZmlEaXNwbGF5U291cmNlOjpzVXNlckFnZW50ID0gTWFrZVVzZXJBZ2VudCgpOwotCi1XaWZpRGlzcGxheVNvdXJjZTo6V2lmaURpc3BsYXlTb3VyY2UoCi0gICAgICAgIGNvbnN0IFN0cmluZzE2ICZvcFBhY2thZ2VOYW1lLAotICAgICAgICBjb25zdCBzcDxBTmV0d29ya1Nlc3Npb24+ICZuZXRTZXNzaW9uLAotICAgICAgICBjb25zdCBzcDxJUmVtb3RlRGlzcGxheUNsaWVudD4gJmNsaWVudCwKLSAgICAgICAgY29uc3QgY2hhciAqcGF0aCkKLSAgICA6IG1PcFBhY2thZ2VOYW1lKG9wUGFja2FnZU5hbWUpLAotICAgICAgbVN0YXRlKElOSVRJQUxJWkVEKSwKLSAgICAgIG1OZXRTZXNzaW9uKG5ldFNlc3Npb24pLAotICAgICAgbUNsaWVudChjbGllbnQpLAotICAgICAgbVNlc3Npb25JRCgwKSwKLSAgICAgIG1TdG9wUmVwbHlJRChOVUxMKSwKLSAgICAgIG1DaG9zZW5SVFBQb3J0KC0xKSwKLSAgICAgIG1Vc2luZ1BDTUF1ZGlvKGZhbHNlKSwKLSAgICAgIG1DbGllbnRTZXNzaW9uSUQoMCksCi0gICAgICBtUmVhcGVyUGVuZGluZyhmYWxzZSksCi0gICAgICBtTmV4dENTZXEoMSksCi0gICAgICBtVXNpbmdIRENQKGZhbHNlKSwKLSAgICAgIG1Jc0hEQ1AyXzAoZmFsc2UpLAotICAgICAgbUhEQ1BQb3J0KDApLAotICAgICAgbUhEQ1BJbml0aWFsaXphdGlvbkNvbXBsZXRlKGZhbHNlKSwKLSAgICAgIG1TZXR1cFRyaWdnZXJEZWZlcnJlZChmYWxzZSksCi0gICAgICBtUGxheWJhY2tTZXNzaW9uRXN0YWJsaXNoZWQoZmFsc2UpIHsKLSAgICBpZiAocGF0aCAhPSBOVUxMKSB7Ci0gICAgICAgIG1NZWRpYVBhdGguc2V0VG8ocGF0aCk7Ci0gICAgfQotCi0gICAgbVN1cHBvcnRlZFNvdXJjZVZpZGVvRm9ybWF0cy5kaXNhYmxlQWxsKCk7Ci0KLSAgICBtU3VwcG9ydGVkU291cmNlVmlkZW9Gb3JtYXRzLnNldE5hdGl2ZVJlc29sdXRpb24oCi0gICAgICAgICAgICBWaWRlb0Zvcm1hdHM6OlJFU09MVVRJT05fQ0VBLCA1KTsgIC8vIDEyODB4NzIwIHAzMAotCi0gICAgLy8gRW5hYmxlIGFsbCByZXNvbHV0aW9ucyB1cCB0byAxMjgweDcyMHAzMAotICAgIG1TdXBwb3J0ZWRTb3VyY2VWaWRlb0Zvcm1hdHMuZW5hYmxlUmVzb2x1dGlvblVwdG8oCi0gICAgICAgICAgICBWaWRlb0Zvcm1hdHM6OlJFU09MVVRJT05fQ0VBLCA1LAotICAgICAgICAgICAgVmlkZW9Gb3JtYXRzOjpQUk9GSUxFX0NIUCwgIC8vIENvbnN0cmFpbmVkIEhpZ2ggUHJvZmlsZQotICAgICAgICAgICAgVmlkZW9Gb3JtYXRzOjpMRVZFTF8zMik7ICAgIC8vIExldmVsIDMuMgotfQotCi1XaWZpRGlzcGxheVNvdXJjZTo6fldpZmlEaXNwbGF5U291cmNlKCkgewotfQotCi1zdGF0aWMgc3RhdHVzX3QgUG9zdEFuZEF3YWl0UmVzcG9uc2UoCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBzcDxBTWVzc2FnZT4gKnJlc3BvbnNlKSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZShyZXNwb25zZSk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYgKHJlc3BvbnNlID09IE5VTEwgfHwgISgqcmVzcG9uc2UpLT5maW5kSW50MzIoImVyciIsICZlcnIpKSB7Ci0gICAgICAgIGVyciA9IE9LOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IFdpZmlEaXNwbGF5U291cmNlOjpzdGFydChjb25zdCBjaGFyICppZmFjZSkgewotICAgIENIRUNLX0VRKG1TdGF0ZSwgSU5JVElBTElaRUQpOwotCi0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFN0YXJ0LCB0aGlzKTsKLSAgICBtc2ctPnNldFN0cmluZygiaWZhY2UiLCBpZmFjZSk7Ci0KLSAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7Ci0gICAgcmV0dXJuIFBvc3RBbmRBd2FpdFJlc3BvbnNlKG1zZywgJnJlc3BvbnNlKTsKLX0KLQotc3RhdHVzX3QgV2lmaURpc3BsYXlTb3VyY2U6OnN0b3AoKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFN0b3AsIHRoaXMpOwotCi0gICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwotICAgIHJldHVybiBQb3N0QW5kQXdhaXRSZXNwb25zZShtc2csICZyZXNwb25zZSk7Ci19Ci0KLXN0YXR1c190IFdpZmlEaXNwbGF5U291cmNlOjpwYXVzZSgpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UGF1c2UsIHRoaXMpOwotCi0gICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwotICAgIHJldHVybiBQb3N0QW5kQXdhaXRSZXNwb25zZShtc2csICZyZXNwb25zZSk7Ci19Ci0KLXN0YXR1c190IFdpZmlEaXNwbGF5U291cmNlOjpyZXN1bWUoKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlc3VtZSwgdGhpcyk7Ci0KLSAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7Ci0gICAgcmV0dXJuIFBvc3RBbmRBd2FpdFJlc3BvbnNlKG1zZywgJnJlc3BvbnNlKTsKLX0KLQotdm9pZCBXaWZpRGlzcGxheVNvdXJjZTo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7Ci0gICAgICAgIGNhc2Uga1doYXRTdGFydDoKLSAgICAgICAgewotICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7Ci0KLSAgICAgICAgICAgIEFTdHJpbmcgaWZhY2U7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTdHJpbmcoImlmYWNlIiwgJmlmYWNlKSk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOwotCi0gICAgICAgICAgICBzc2l6ZV90IGNvbG9uUG9zID0gaWZhY2UuZmluZCgiOiIpOwotCi0gICAgICAgICAgICB1bnNpZ25lZCBsb25nIHBvcnQ7Ci0KLSAgICAgICAgICAgIGlmIChjb2xvblBvcyA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcyA9IGlmYWNlLmNfc3RyKCkgKyBjb2xvblBvcyArIDE7Ci0KLSAgICAgICAgICAgICAgICBjaGFyICplbmQ7Ci0gICAgICAgICAgICAgICAgcG9ydCA9IHN0cnRvdWwocywgJmVuZCwgMTApOwotCi0gICAgICAgICAgICAgICAgaWYgKGVuZCA9PSBzIHx8ICplbmQgIT0gJ1wwJyB8fCBwb3J0ID4gNjU1MzUpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZmFjZS5lcmFzZShjb2xvblBvcywgaWZhY2Uuc2l6ZSgpIC0gY29sb25Qb3MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcG9ydCA9IGtXaWZpRGlzcGxheURlZmF1bHRQb3J0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGluZXRfYXRvbihpZmFjZS5jX3N0cigpLCAmbUludGVyZmFjZUFkZHIpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFJUU1BOb3RpZnksIHRoaXMpOwotCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IG1OZXRTZXNzaW9uLT5jcmVhdGVSVFNQU2VydmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnRlcmZhY2VBZGRyLCBwb3J0LCBub3RpZnksICZtU2Vzc2lvbklEKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSAtRUlOVkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVN0YXRlID0gQVdBSVRJTkdfQ0xJRU5UX0NPTk5FQ1RJT047Ci0KLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKLSAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRSVFNQTm90aWZ5OgotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQzMl90IHJlYXNvbjsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJyZWFzb24iLCAmcmVhc29uKSk7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAocmVhc29uKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBBTmV0d29ya1Nlc3Npb246OmtXaGF0RXJyb3I6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNlc3Npb25JRDsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInNlc3Npb25JRCIsICZzZXNzaW9uSUQpKTsKLQotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGVycjsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKLQotICAgICAgICAgICAgICAgICAgICBBU3RyaW5nIGRldGFpbDsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU3RyaW5nKCJkZXRhaWwiLCAmZGV0YWlsKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkFuIGVycm9yIG9jY3VycmVkIGluIHNlc3Npb24gJWQgKCVkLCAnJXMvJXMnKS4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGVyciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpKTsKLQotICAgICAgICAgICAgICAgICAgICBtTmV0U2Vzc2lvbi0+ZGVzdHJveVNlc3Npb24oc2Vzc2lvbklEKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbklEID09IG1DbGllbnRTZXNzaW9uSUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRTZXNzaW9uSUQgPSAwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ2xpZW50LT5vbkRpc3BsYXlFcnJvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVJlbW90ZURpc3BsYXlDbGllbnQ6OmtEaXNwbGF5RXJyb3JVbmtub3duKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjYXNlIEFOZXR3b3JrU2Vzc2lvbjo6a1doYXRDbGllbnRDb25uZWN0ZWQ6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNlc3Npb25JRDsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInNlc3Npb25JRCIsICZzZXNzaW9uSUQpKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobUNsaWVudFNlc3Npb25JRCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJBIGNsaWVudCB0cmllZCB0byBjb25uZWN0LCBidXQgd2UgYWxyZWFkeSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGF2ZSBvbmUuIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1OZXRTZXNzaW9uLT5kZXN0cm95U2Vzc2lvbihzZXNzaW9uSUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtU3RhdGUsIEFXQUlUSU5HX0NMSUVOVF9DT05ORUNUSU9OKTsKLQotICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTdHJpbmcoImNsaWVudC1pcCIsICZtQ2xpZW50SW5mby5tUmVtb3RlSVApKTsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU3RyaW5nKCJzZXJ2ZXItaXAiLCAmbUNsaWVudEluZm8ubUxvY2FsSVApKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobUNsaWVudEluZm8ubVJlbW90ZUlQID09IG1DbGllbnRJbmZvLm1Mb2NhbElQKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBEaXNhbGxvdyBjb25uZWN0aW9ucyBmcm9tIHRoZSBsb2NhbCBpbnRlcmZhY2UKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBzZWN1cml0eSByZWFzb25zLgotICAgICAgICAgICAgICAgICAgICAgICAgbU5ldFNlc3Npb24tPmRlc3Ryb3lTZXNzaW9uKHNlc3Npb25JRCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VydmVyLXBvcnQiLCAmbUNsaWVudEluZm8ubUxvY2FsUG9ydCkpOwotICAgICAgICAgICAgICAgICAgICBtQ2xpZW50SW5mby5tUGxheWJhY2tTZXNzaW9uSUQgPSAtMTsKLQotICAgICAgICAgICAgICAgICAgICBtQ2xpZW50U2Vzc2lvbklEID0gc2Vzc2lvbklEOwotCi0gICAgICAgICAgICAgICAgICAgIEFMT0dJKCJXZSBub3cgaGF2ZSBhIGNsaWVudCAoJWQpIGNvbm5lY3RlZC4iLCBzZXNzaW9uSUQpOwotCi0gICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IEFXQUlUSU5HX0NMSUVOVF9TRVRVUDsKLQotICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBzZW5kTTEoc2Vzc2lvbklEKTsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoZXJyLCAoc3RhdHVzX3QpT0spOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjYXNlIEFOZXR3b3JrU2Vzc2lvbjo6a1doYXREYXRhOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gb25SZWNlaXZlQ2xpZW50RGF0YShtc2cpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DbGllbnQtPm9uRGlzcGxheUVycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUmVtb3RlRGlzcGxheUNsaWVudDo6a0Rpc3BsYXlFcnJvclVua25vd24pOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSNpZiAwCi0gICAgICAgICAgICAgICAgICAgIC8vIHRlc3Rpbmcgb25seS4KLSAgICAgICAgICAgICAgICAgICAgY2hhciB2YWxbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5X2dldCgibWVkaWEud2ZkLnRyaWdnZXIiLCB2YWwsIE5VTEwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmNhc2VjbXAodmFsLCAicGF1c2UiKSAmJiBtU3RhdGUgPT0gUExBWUlORykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFBMQVlJTkdfVE9fUEFVU0VEOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRUcmlnZ2VyKG1DbGllbnRTZXNzaW9uSUQsIFRSSUdHRVJfUEFVU0UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcCh2YWwsICJwbGF5IikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1TdGF0ZSA9PSBQQVVTRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBQQVVTRURfVE9fUExBWUlORzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kVHJpZ2dlcihtQ2xpZW50U2Vzc2lvbklELCBUUklHR0VSX1BMQVkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2FzZSBBTmV0d29ya1Nlc3Npb246OmtXaGF0TmV0d29ya1N0YWxsOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgVFJFU1BBU1MoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdFN0b3A6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJm1TdG9wUmVwbHlJRCkpOwotCi0gICAgICAgICAgICBDSEVDS19MVChtU3RhdGUsIEFXQUlUSU5HX0NMSUVOVF9URUFSRE9XTik7Ci0KLSAgICAgICAgICAgIGlmIChtU3RhdGUgPj0gQVdBSVRJTkdfQ0xJRU5UX1BMQVkpIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGEgc2Vzc2lvbiwgaS5lLiBhIHByZXZpb3VzIFNFVFVQIHN1Y2NlZWRlZC4KLQotICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHNlbmRUcmlnZ2VyKAotICAgICAgICAgICAgICAgICAgICAgICAgbUNsaWVudFNlc3Npb25JRCwgVFJJR0dFUl9URUFSRE9XTik7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IEFXQUlUSU5HX0NMSUVOVF9URUFSRE9XTjsKLQotICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0VGVhcmRvd25UcmlnZ2VyVGltZWRPdXQsIHRoaXMpKS0+cG9zdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVGVhcmRvd25UcmlnZ2VyVGltZW91U2VjcyAqIDEwMDAwMDBsbCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoLgotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmaW5pc2hTdG9wKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRQYXVzZToKLSAgICAgICAgewotICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOwotCi0gICAgICAgICAgICBpZiAobVN0YXRlICE9IFBMQVlJTkcpIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVN0YXRlID0gUExBWUlOR19UT19QQVVTRUQ7Ci0gICAgICAgICAgICAgICAgc2VuZFRyaWdnZXIobUNsaWVudFNlc3Npb25JRCwgVFJJR0dFUl9QQVVTRSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKLSAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRSZXN1bWU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLQotICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBQQVVTRUQpIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVN0YXRlID0gUEFVU0VEX1RPX1BMQVlJTkc7Ci0gICAgICAgICAgICAgICAgc2VuZFRyaWdnZXIobUNsaWVudFNlc3Npb25JRCwgVFJJR0dFUl9QTEFZKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOwotICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdFJlYXBEZWFkQ2xpZW50czoKLSAgICAgICAgewotICAgICAgICAgICAgbVJlYXBlclBlbmRpbmcgPSBmYWxzZTsKLQotICAgICAgICAgICAgaWYgKG1DbGllbnRTZXNzaW9uSUQgPT0gMAotICAgICAgICAgICAgICAgICAgICB8fCBtQ2xpZW50SW5mby5tUGxheWJhY2tTZXNzaW9uID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1DbGllbnRJbmZvLm1QbGF5YmFja1Nlc3Npb24tPmdldExhc3RMaWZlc2lnblVzKCkKLSAgICAgICAgICAgICAgICAgICAgKyBrUGxheWJhY2tTZXNzaW9uVGltZW91dFVzIDwgQUxvb3Blcjo6R2V0Tm93VXMoKSkgewotICAgICAgICAgICAgICAgIEFMT0dJKCJwbGF5YmFjayBzZXNzaW9uIHRpbWVkIG91dCwgcmVhcGluZy4iKTsKLQotICAgICAgICAgICAgICAgIG1OZXRTZXNzaW9uLT5kZXN0cm95U2Vzc2lvbihtQ2xpZW50U2Vzc2lvbklEKTsKLSAgICAgICAgICAgICAgICBtQ2xpZW50U2Vzc2lvbklEID0gMDsKLQotICAgICAgICAgICAgICAgIG1DbGllbnQtPm9uRGlzcGxheUVycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgSVJlbW90ZURpc3BsYXlDbGllbnQ6OmtEaXNwbGF5RXJyb3JVbmtub3duKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2NoZWR1bGVSZWFwZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdFBsYXliYWNrU2Vzc2lvbk5vdGlmeToKLSAgICAgICAgewotICAgICAgICAgICAgaW50MzJfdCBwbGF5YmFja1Nlc3Npb25JRDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJwbGF5YmFja1Nlc3Npb25JRCIsICZwbGF5YmFja1Nlc3Npb25JRCkpOwotCi0gICAgICAgICAgICBpbnQzMl90IHdoYXQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigid2hhdCIsICZ3aGF0KSk7Ci0KLSAgICAgICAgICAgIGlmICh3aGF0ID09IFBsYXliYWNrU2Vzc2lvbjo6a1doYXRTZXNzaW9uRGVhZCkgewotICAgICAgICAgICAgICAgIEFMT0dJKCJwbGF5YmFjayBzZXNzaW9uIHdhbnRzIHRvIHF1aXQuIik7Ci0KLSAgICAgICAgICAgICAgICBtQ2xpZW50LT5vbkRpc3BsYXlFcnJvcigKLSAgICAgICAgICAgICAgICAgICAgICAgIElSZW1vdGVEaXNwbGF5Q2xpZW50OjprRGlzcGxheUVycm9yVW5rbm93bik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gUGxheWJhY2tTZXNzaW9uOjprV2hhdFNlc3Npb25Fc3RhYmxpc2hlZCkgewotICAgICAgICAgICAgICAgIG1QbGF5YmFja1Nlc3Npb25Fc3RhYmxpc2hlZCA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICBpZiAobUNsaWVudCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbVNpbmtTdXBwb3J0c1ZpZGVvKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ2xpZW50LT5vbkRpc3BsYXlDb25uZWN0ZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAvLyBTdXJmYWNlVGV4dHVyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvLyB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLy8gaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVXNpbmdIRENQCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IElSZW1vdGVEaXNwbGF5Q2xpZW50OjprRGlzcGxheUZsYWdTZWN1cmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgd2lkdGgsIGhlaWdodDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soVmlkZW9Gb3JtYXRzOjpHZXRDb25maWd1cmF0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNob3NlblZpZGVvUmVzb2x1dGlvblR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2hvc2VuVmlkZW9SZXNvbHV0aW9uSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAvKiBmcmFtZXNQZXJTZWNvbmQgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIC8qIGludGVybGFjZWQgKi8pKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbUNsaWVudC0+b25EaXNwbGF5Q29ubmVjdGVkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2xpZW50SW5mby5tUGxheWJhY2tTZXNzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPmdldFN1cmZhY2VUZXh0dXJlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Vc2luZ0hEQ1AKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gSVJlbW90ZURpc3BsYXlDbGllbnQ6OmtEaXNwbGF5RmxhZ1NlY3VyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5YmFja1Nlc3Npb25JRCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmaW5pc2hQbGF5KCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobVN0YXRlID09IEFCT1VUX1RPX1BMQVkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVN0YXRlID0gUExBWUlORzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gUGxheWJhY2tTZXNzaW9uOjprV2hhdFNlc3Npb25EZXN0cm95ZWQpIHsKLSAgICAgICAgICAgICAgICBkaXNjb25uZWN0Q2xpZW50MigpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBDSEVDS19FUSh3aGF0LCBQbGF5YmFja1Nlc3Npb246OmtXaGF0QmluYXJ5RGF0YSk7Ci0KLSAgICAgICAgICAgICAgICBpbnQzMl90IGNoYW5uZWw7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImNoYW5uZWwiLCAmY2hhbm5lbCkpOwotCi0gICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gZGF0YTsKLSAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRCdWZmZXIoImRhdGEiLCAmZGF0YSkpOwotCi0gICAgICAgICAgICAgICAgQ0hFQ0tfTEUoY2hhbm5lbCwgMHhmZik7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfTEUoZGF0YS0+c2l6ZSgpLCAweGZmZmZ1KTsKLQotICAgICAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklEOwotICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzZXNzaW9uSUQiLCAmc2Vzc2lvbklEKSk7Ci0KLSAgICAgICAgICAgICAgICBjaGFyIGhlYWRlcls0XTsKLSAgICAgICAgICAgICAgICBoZWFkZXJbMF0gPSAnJCc7Ci0gICAgICAgICAgICAgICAgaGVhZGVyWzFdID0gY2hhbm5lbDsKLSAgICAgICAgICAgICAgICBoZWFkZXJbMl0gPSBkYXRhLT5zaXplKCkgPj4gODsKLSAgICAgICAgICAgICAgICBoZWFkZXJbM10gPSBkYXRhLT5zaXplKCkgJiAweGZmOwotCi0gICAgICAgICAgICAgICAgbU5ldFNlc3Npb24tPnNlbmRSZXF1ZXN0KAotICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklELCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKTsKLQotICAgICAgICAgICAgICAgIG1OZXRTZXNzaW9uLT5zZW5kUmVxdWVzdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JRCwgZGF0YS0+ZGF0YSgpLCBkYXRhLT5zaXplKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0S2VlcEFsaXZlOgotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQzMl90IHNlc3Npb25JRDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzZXNzaW9uSUQiLCAmc2Vzc2lvbklEKSk7Ci0KLSAgICAgICAgICAgIGlmIChtQ2xpZW50U2Vzc2lvbklEICE9IHNlc3Npb25JRCkgewotICAgICAgICAgICAgICAgIC8vIE9ic29sZXRlIGV2ZW50LCBjbGllbnQgaXMgYWxyZWFkeSBnb25lLgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZW5kTTE2KHNlc3Npb25JRCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRUZWFyZG93blRyaWdnZXJUaW1lZE91dDoKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBBV0FJVElOR19DTElFTlRfVEVBUkRPV04pIHsKLSAgICAgICAgICAgICAgICBBTE9HSSgiVEVBUkRPV04gdHJpZ2dlciB0aW1lZCBvdXQsIGZvcmNpbmcgZGlzY29ubmVjdGlvbi4iKTsKLQotICAgICAgICAgICAgICAgIENIRUNLKG1TdG9wUmVwbHlJRCAhPSBOVUxMKTsKLSAgICAgICAgICAgICAgICBmaW5pc2hTdG9wKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRIRENQTm90aWZ5OgotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQzMl90IG1zZ0NvZGUsIGV4dDEsIGV4dDI7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigibXNnIiwgJm1zZ0NvZGUpKTsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJleHQxIiwgJmV4dDEpKTsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJleHQyIiwgJmV4dDIpKTsKLQotICAgICAgICAgICAgQUxPR0koIlNhdyBIRENQIG5vdGlmaWNhdGlvbiBjb2RlICVkLCBleHQxICVkLCBleHQyICVkIiwKLSAgICAgICAgICAgICAgICAgICAgbXNnQ29kZSwgZXh0MSwgZXh0Mik7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAobXNnQ29kZSkgewotICAgICAgICAgICAgICAgIGNhc2UgSERDUE1vZHVsZTo6SERDUF9JTklUSUFMSVpBVElPTl9DT01QTEVURToKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1IRENQSW5pdGlhbGl6YXRpb25Db21wbGV0ZSA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1TZXR1cFRyaWdnZXJEZWZlcnJlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVNldHVwVHJpZ2dlckRlZmVycmVkID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRUcmlnZ2VyKG1DbGllbnRTZXNzaW9uSUQsIFRSSUdHRVJfU0VUVVApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNhc2UgSERDUE1vZHVsZTo6SERDUF9TSFVURE9XTl9DT01QTEVURToKLSAgICAgICAgICAgICAgICBjYXNlIEhEQ1BNb2R1bGU6OkhEQ1BfU0hVVERPV05fRkFJTEVEOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVWdseSBoYWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBjYWxsIHRvCi0gICAgICAgICAgICAgICAgICAgIC8vIEhEQ1BPYnNlcnZlcjo6bm90aWZ5IGlzIGNvbXBsZXRlbHkgaGFuZGxlZCBiZWZvcmUKLSAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2xlYXIgdGhlIEhEQ1AgaW5zdGFuY2UgYW5kIHVubG9hZCB0aGUgc2hhcmVkCi0gICAgICAgICAgICAgICAgICAgIC8vIGxpYnJhcnkgOigKLSAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdEZpbmlzaFN0b3AyLCB0aGlzKSktPnBvc3QoMzAwMDAwbGwpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkhEQ1AgZmFpbHVyZSwgc2h1dHRpbmcgZG93bi4iKTsKLQotICAgICAgICAgICAgICAgICAgICBtQ2xpZW50LT5vbkRpc3BsYXlFcnJvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUmVtb3RlRGlzcGxheUNsaWVudDo6a0Rpc3BsYXlFcnJvclVua25vd24pOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRGaW5pc2hTdG9wMjoKLSAgICAgICAgewotICAgICAgICAgICAgZmluaXNoU3RvcDIoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFRSRVNQQVNTKCk7Ci0gICAgfQotfQotCi12b2lkIFdpZmlEaXNwbGF5U291cmNlOjpyZWdpc3RlclJlc3BvbnNlSGFuZGxlcigKLSAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsIGludDMyX3QgY3NlcSwgSGFuZGxlUlRTUFJlc3BvbnNlRnVuYyBmdW5jKSB7Ci0gICAgUmVzcG9uc2VJRCBpZDsKLSAgICBpZC5tU2Vzc2lvbklEID0gc2Vzc2lvbklEOwotICAgIGlkLm1DU2VxID0gY3NlcTsKLSAgICBtUmVzcG9uc2VIYW5kbGVycy5hZGQoaWQsIGZ1bmMpOwotfQotCi1zdGF0dXNfdCBXaWZpRGlzcGxheVNvdXJjZTo6c2VuZE0xKGludDMyX3Qgc2Vzc2lvbklEKSB7Ci0gICAgQVN0cmluZyByZXF1ZXN0ID0gIk9QVElPTlMgKiBSVFNQLzEuMFxyXG4iOwotICAgIEFwcGVuZENvbW1vblJlc3BvbnNlKCZyZXF1ZXN0LCBtTmV4dENTZXEpOwotCi0gICAgcmVxdWVzdC5hcHBlbmQoCi0gICAgICAgICAgICAiUmVxdWlyZTogb3JnLndmYS53ZmQxLjBcclxuIgotICAgICAgICAgICAgIlxyXG4iKTsKLQotICAgIHN0YXR1c190IGVyciA9Ci0gICAgICAgIG1OZXRTZXNzaW9uLT5zZW5kUmVxdWVzdChzZXNzaW9uSUQsIHJlcXVlc3QuY19zdHIoKSwgcmVxdWVzdC5zaXplKCkpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHJlZ2lzdGVyUmVzcG9uc2VIYW5kbGVyKAotICAgICAgICAgICAgc2Vzc2lvbklELCBtTmV4dENTZXEsICZXaWZpRGlzcGxheVNvdXJjZTo6b25SZWNlaXZlTTFSZXNwb25zZSk7Ci0KLSAgICArK21OZXh0Q1NlcTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgV2lmaURpc3BsYXlTb3VyY2U6OnNlbmRNMyhpbnQzMl90IHNlc3Npb25JRCkgewotICAgIEFTdHJpbmcgYm9keSA9Ci0gICAgICAgICJ3ZmRfY29udGVudF9wcm90ZWN0aW9uXHJcbiIKLSAgICAgICAgIndmZF92aWRlb19mb3JtYXRzXHJcbiIKLSAgICAgICAgIndmZF9hdWRpb19jb2RlY3NcclxuIgotICAgICAgICAid2ZkX2NsaWVudF9ydHBfcG9ydHNcclxuIjsKLQotICAgIEFTdHJpbmcgcmVxdWVzdCA9ICJHRVRfUEFSQU1FVEVSIHJ0c3A6Ly9sb2NhbGhvc3Qvd2ZkMS4wIFJUU1AvMS4wXHJcbiI7Ci0gICAgQXBwZW5kQ29tbW9uUmVzcG9uc2UoJnJlcXVlc3QsIG1OZXh0Q1NlcSk7Ci0KLSAgICByZXF1ZXN0LmFwcGVuZCgiQ29udGVudC1UeXBlOiB0ZXh0L3BhcmFtZXRlcnNcclxuIik7Ci0gICAgcmVxdWVzdC5hcHBlbmQoQVN0cmluZ1ByaW50ZigiQ29udGVudC1MZW5ndGg6ICVkXHJcbiIsIGJvZHkuc2l6ZSgpKSk7Ci0gICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKLSAgICByZXF1ZXN0LmFwcGVuZChib2R5KTsKLQotICAgIHN0YXR1c190IGVyciA9Ci0gICAgICAgIG1OZXRTZXNzaW9uLT5zZW5kUmVxdWVzdChzZXNzaW9uSUQsIHJlcXVlc3QuY19zdHIoKSwgcmVxdWVzdC5zaXplKCkpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHJlZ2lzdGVyUmVzcG9uc2VIYW5kbGVyKAotICAgICAgICAgICAgc2Vzc2lvbklELCBtTmV4dENTZXEsICZXaWZpRGlzcGxheVNvdXJjZTo6b25SZWNlaXZlTTNSZXNwb25zZSk7Ci0KLSAgICArK21OZXh0Q1NlcTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgV2lmaURpc3BsYXlTb3VyY2U6OnNlbmRNNChpbnQzMl90IHNlc3Npb25JRCkgewotICAgIENIRUNLX0VRKHNlc3Npb25JRCwgbUNsaWVudFNlc3Npb25JRCk7Ci0KLSAgICBBU3RyaW5nIGJvZHk7Ci0KLSAgICBpZiAobVNpbmtTdXBwb3J0c1ZpZGVvKSB7Ci0gICAgICAgIGJvZHkuYXBwZW5kKCJ3ZmRfdmlkZW9fZm9ybWF0czogIik7Ci0KLSAgICAgICAgVmlkZW9Gb3JtYXRzIGNob3NlblZpZGVvRm9ybWF0OwotICAgICAgICBjaG9zZW5WaWRlb0Zvcm1hdC5kaXNhYmxlQWxsKCk7Ci0gICAgICAgIGNob3NlblZpZGVvRm9ybWF0LnNldE5hdGl2ZVJlc29sdXRpb24oCi0gICAgICAgICAgICAgICAgbUNob3NlblZpZGVvUmVzb2x1dGlvblR5cGUsIG1DaG9zZW5WaWRlb1Jlc29sdXRpb25JbmRleCk7Ci0gICAgICAgIGNob3NlblZpZGVvRm9ybWF0LnNldFByb2ZpbGVMZXZlbCgKLSAgICAgICAgICAgICAgICBtQ2hvc2VuVmlkZW9SZXNvbHV0aW9uVHlwZSwgbUNob3NlblZpZGVvUmVzb2x1dGlvbkluZGV4LAotICAgICAgICAgICAgICAgIG1DaG9zZW5WaWRlb1Byb2ZpbGUsIG1DaG9zZW5WaWRlb0xldmVsKTsKLQotICAgICAgICBib2R5LmFwcGVuZChjaG9zZW5WaWRlb0Zvcm1hdC5nZXRGb3JtYXRTcGVjKHRydWUgLyogZm9yTTRNZXNzYWdlICovKSk7Ci0gICAgICAgIGJvZHkuYXBwZW5kKCJcclxuIik7Ci0gICAgfQotCi0gICAgaWYgKG1TaW5rU3VwcG9ydHNBdWRpbykgewotICAgICAgICBib2R5LmFwcGVuZCgKLSAgICAgICAgICAgICAgICBBU3RyaW5nUHJpbnRmKCJ3ZmRfYXVkaW9fY29kZWNzOiAlc1xyXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVVzaW5nUENNQXVkaW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAiTFBDTSAwMDAwMDAwMiAwMCIgLy8gMiBjaCBQQ00gNDhrSHoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiQUFDIDAwMDAwMDAxIDAwIikpKTsgIC8vIDIgY2ggQUFDIDQ4a0h6Ci0gICAgfQotCi0gICAgYm9keS5hcHBlbmQoCi0gICAgICAgICAgICBBU3RyaW5nUHJpbnRmKAotICAgICAgICAgICAgICAgICJ3ZmRfcHJlc2VudGF0aW9uX1VSTDogcnRzcDovLyVzL3dmZDEuMC9zdHJlYW1pZD0wIG5vbmVcclxuIiwKLSAgICAgICAgICAgICAgICBtQ2xpZW50SW5mby5tTG9jYWxJUC5jX3N0cigpKSk7Ci0KLSAgICBib2R5LmFwcGVuZCgKLSAgICAgICAgICAgIEFTdHJpbmdQcmludGYoCi0gICAgICAgICAgICAgICAgIndmZF9jbGllbnRfcnRwX3BvcnRzOiAlc1xyXG4iLCBtV2ZkQ2xpZW50UnRwUG9ydHMuY19zdHIoKSkpOwotCi0gICAgQVN0cmluZyByZXF1ZXN0ID0gIlNFVF9QQVJBTUVURVIgcnRzcDovL2xvY2FsaG9zdC93ZmQxLjAgUlRTUC8xLjBcclxuIjsKLSAgICBBcHBlbmRDb21tb25SZXNwb25zZSgmcmVxdWVzdCwgbU5leHRDU2VxKTsKLQotICAgIHJlcXVlc3QuYXBwZW5kKCJDb250ZW50LVR5cGU6IHRleHQvcGFyYW1ldGVyc1xyXG4iKTsKLSAgICByZXF1ZXN0LmFwcGVuZChBU3RyaW5nUHJpbnRmKCJDb250ZW50LUxlbmd0aDogJWRcclxuIiwgYm9keS5zaXplKCkpKTsKLSAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOwotICAgIHJlcXVlc3QuYXBwZW5kKGJvZHkpOwotCi0gICAgc3RhdHVzX3QgZXJyID0KLSAgICAgICAgbU5ldFNlc3Npb24tPnNlbmRSZXF1ZXN0KHNlc3Npb25JRCwgcmVxdWVzdC5jX3N0cigpLCByZXF1ZXN0LnNpemUoKSk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcmVnaXN0ZXJSZXNwb25zZUhhbmRsZXIoCi0gICAgICAgICAgICBzZXNzaW9uSUQsIG1OZXh0Q1NlcSwgJldpZmlEaXNwbGF5U291cmNlOjpvblJlY2VpdmVNNFJlc3BvbnNlKTsKLQotICAgICsrbU5leHRDU2VxOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBXaWZpRGlzcGxheVNvdXJjZTo6c2VuZFRyaWdnZXIoCi0gICAgICAgIGludDMyX3Qgc2Vzc2lvbklELCBUcmlnZ2VyVHlwZSB0cmlnZ2VyVHlwZSkgewotICAgIEFTdHJpbmcgYm9keSA9ICJ3ZmRfdHJpZ2dlcl9tZXRob2Q6ICI7Ci0gICAgc3dpdGNoICh0cmlnZ2VyVHlwZSkgewotICAgICAgICBjYXNlIFRSSUdHRVJfU0VUVVA6Ci0gICAgICAgICAgICBib2R5LmFwcGVuZCgiU0VUVVAiKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRSSUdHRVJfVEVBUkRPV046Ci0gICAgICAgICAgICBBTE9HSSgiU2VuZGluZyBURUFSRE9XTiB0cmlnZ2VyLiIpOwotICAgICAgICAgICAgYm9keS5hcHBlbmQoIlRFQVJET1dOIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUUklHR0VSX1BBVVNFOgotICAgICAgICAgICAgYm9keS5hcHBlbmQoIlBBVVNFIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUUklHR0VSX1BMQVk6Ci0gICAgICAgICAgICBib2R5LmFwcGVuZCgiUExBWSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBUUkVTUEFTUygpOwotICAgIH0KLQotICAgIGJvZHkuYXBwZW5kKCJcclxuIik7Ci0KLSAgICBBU3RyaW5nIHJlcXVlc3QgPSAiU0VUX1BBUkFNRVRFUiBydHNwOi8vbG9jYWxob3N0L3dmZDEuMCBSVFNQLzEuMFxyXG4iOwotICAgIEFwcGVuZENvbW1vblJlc3BvbnNlKCZyZXF1ZXN0LCBtTmV4dENTZXEpOwotCi0gICAgcmVxdWVzdC5hcHBlbmQoIkNvbnRlbnQtVHlwZTogdGV4dC9wYXJhbWV0ZXJzXHJcbiIpOwotICAgIHJlcXVlc3QuYXBwZW5kKEFTdHJpbmdQcmludGYoIkNvbnRlbnQtTGVuZ3RoOiAlZFxyXG4iLCBib2R5LnNpemUoKSkpOwotICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7Ci0gICAgcmVxdWVzdC5hcHBlbmQoYm9keSk7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPQotICAgICAgICBtTmV0U2Vzc2lvbi0+c2VuZFJlcXVlc3Qoc2Vzc2lvbklELCByZXF1ZXN0LmNfc3RyKCksIHJlcXVlc3Quc2l6ZSgpKTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICByZWdpc3RlclJlc3BvbnNlSGFuZGxlcigKLSAgICAgICAgICAgIHNlc3Npb25JRCwgbU5leHRDU2VxLCAmV2lmaURpc3BsYXlTb3VyY2U6Om9uUmVjZWl2ZU01UmVzcG9uc2UpOwotCi0gICAgKyttTmV4dENTZXE7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFdpZmlEaXNwbGF5U291cmNlOjpzZW5kTTE2KGludDMyX3Qgc2Vzc2lvbklEKSB7Ci0gICAgQVN0cmluZyByZXF1ZXN0ID0gIkdFVF9QQVJBTUVURVIgcnRzcDovL2xvY2FsaG9zdC93ZmQxLjAgUlRTUC8xLjBcclxuIjsKLSAgICBBcHBlbmRDb21tb25SZXNwb25zZSgmcmVxdWVzdCwgbU5leHRDU2VxKTsKLQotICAgIENIRUNLX0VRKHNlc3Npb25JRCwgbUNsaWVudFNlc3Npb25JRCk7Ci0gICAgcmVxdWVzdC5hcHBlbmQoCi0gICAgICAgICAgICBBU3RyaW5nUHJpbnRmKCJTZXNzaW9uOiAlZFxyXG4iLCBtQ2xpZW50SW5mby5tUGxheWJhY2tTZXNzaW9uSUQpKTsKLSAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOyAgLy8gRW1wdHkgYm9keQotCi0gICAgc3RhdHVzX3QgZXJyID0KLSAgICAgICAgbU5ldFNlc3Npb24tPnNlbmRSZXF1ZXN0KHNlc3Npb25JRCwgcmVxdWVzdC5jX3N0cigpLCByZXF1ZXN0LnNpemUoKSk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcmVnaXN0ZXJSZXNwb25zZUhhbmRsZXIoCi0gICAgICAgICAgICBzZXNzaW9uSUQsIG1OZXh0Q1NlcSwgJldpZmlEaXNwbGF5U291cmNlOjpvblJlY2VpdmVNMTZSZXNwb25zZSk7Ci0KLSAgICArK21OZXh0Q1NlcTsKLQotICAgIHNjaGVkdWxlS2VlcEFsaXZlKHNlc3Npb25JRCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFdpZmlEaXNwbGF5U291cmNlOjpvblJlY2VpdmVNMVJlc3BvbnNlKAotICAgICAgICBpbnQzMl90IC8qIHNlc3Npb25JRCAqLywgY29uc3Qgc3A8UGFyc2VkTWVzc2FnZT4gJm1zZykgewotICAgIGludDMyX3Qgc3RhdHVzQ29kZTsKLSAgICBpZiAoIW1zZy0+Z2V0U3RhdHVzQ29kZSgmc3RhdHVzQ29kZSkpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBpZiAoc3RhdHVzQ29kZSAhPSAyMDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotLy8gc2lua19hdWRpb19saXN0IDo9ICgiTFBDTSJ8IkFBQyJ8IkFDMyIgSEVYRElHSVQqOCBIRVhESUdJVCoyKQotLy8gICAgICAgICAgICAgICAgICAgICAgICgiLCAiIHNpbmtfYXVkaW9fbGlzdCkqCi1zdGF0aWMgdm9pZCBHZXRBdWRpb01vZGVzKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKnByZWZpeCwgdWludDMyX3QgKm1vZGVzKSB7Ci0gICAgKm1vZGVzID0gMDsKLQotICAgIHNpemVfdCBwcmVmaXhMZW4gPSBzdHJsZW4ocHJlZml4KTsKLQotICAgIHdoaWxlICgqcyAhPSAnMCcpIHsKLSAgICAgICAgaWYgKCFzdHJuY21wKHMsIHByZWZpeCwgcHJlZml4TGVuKSAmJiBzW3ByZWZpeExlbl0gPT0gJyAnKSB7Ci0gICAgICAgICAgICB1bnNpZ25lZCBsYXRlbmN5OwotICAgICAgICAgICAgaWYgKHNzY2FuZigmc1twcmVmaXhMZW4gKyAxXSwgIiUwOHggJTAyeCIsIG1vZGVzLCAmbGF0ZW5jeSkgIT0gMikgewotICAgICAgICAgICAgICAgICptb2RlcyA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IGNoYXIgKmNvbW1hUG9zID0gc3RyY2hyKHMsICcsJyk7Ci0gICAgICAgIGlmIChjb21tYVBvcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBzID0gY29tbWFQb3MgKyAxOwotCi0gICAgICAgICAgICB3aGlsZSAoaXNzcGFjZSgqcykpIHsKLSAgICAgICAgICAgICAgICArK3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdHVzX3QgV2lmaURpc3BsYXlTb3VyY2U6Om9uUmVjZWl2ZU0zUmVzcG9uc2UoCi0gICAgICAgIGludDMyX3Qgc2Vzc2lvbklELCBjb25zdCBzcDxQYXJzZWRNZXNzYWdlPiAmbXNnKSB7Ci0gICAgaW50MzJfdCBzdGF0dXNDb2RlOwotICAgIGlmICghbXNnLT5nZXRTdGF0dXNDb2RlKCZzdGF0dXNDb2RlKSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGlmIChzdGF0dXNDb2RlICE9IDIwMCkgewotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgc3A8UGFyYW1ldGVycz4gcGFyYW1zID0KLSAgICAgICAgUGFyYW1ldGVyczo6UGFyc2UobXNnLT5nZXRDb250ZW50KCksIHN0cmxlbihtc2ctPmdldENvbnRlbnQoKSkpOwotCi0gICAgaWYgKHBhcmFtcyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgQVN0cmluZyB2YWx1ZTsKLSAgICBpZiAoIXBhcmFtcy0+ZmluZFBhcmFtZXRlcigid2ZkX2NsaWVudF9ydHBfcG9ydHMiLCAmdmFsdWUpKSB7Ci0gICAgICAgIEFMT0dFKCJTaW5rIGRvZXNuJ3QgcmVwb3J0IGl0cyBjaG9pY2Ugb2Ygd2ZkX2NsaWVudF9ydHBfcG9ydHMuIik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgdW5zaWduZWQgcG9ydDAgPSAwLCBwb3J0MSA9IDA7Ci0gICAgaWYgKHNzY2FuZih2YWx1ZS5jX3N0cigpLAotICAgICAgICAgICAgICAgIlJUUC9BVlAvVURQO3VuaWNhc3QgJXUgJXUgbW9kZT1wbGF5IiwKLSAgICAgICAgICAgICAgICZwb3J0MCwKLSAgICAgICAgICAgICAgICZwb3J0MSkgPT0gMgotICAgICAgICB8fCBzc2NhbmYodmFsdWUuY19zdHIoKSwKLSAgICAgICAgICAgICAgICJSVFAvQVZQL1RDUDt1bmljYXN0ICV1ICV1IG1vZGU9cGxheSIsCi0gICAgICAgICAgICAgICAmcG9ydDAsCi0gICAgICAgICAgICAgICAmcG9ydDEpID09IDIpIHsKLSAgICAgICAgICAgIGlmIChwb3J0MCA9PSAwIHx8IHBvcnQwID4gNjU1MzUgfHwgcG9ydDEgIT0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJTaW5rIGNob3NlIGl0cyB3ZmRfY2xpZW50X3J0cF9wb3J0cyBwb29ybHkgKCVzKSIsCi0gICAgICAgICAgICAgICAgICAgICAgdmFsdWUuY19zdHIoKSk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoc3RyY21wKHZhbHVlLmNfc3RyKCksICJSVFAvQVZQL1RDUDtpbnRlcmxlYXZlZCBtb2RlPXBsYXkiKSkgewotICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgdmFsdWUgZm9yIHdmZF9jbGllbnRfcnRwX3BvcnRzICglcykiLAotICAgICAgICAgICAgICB2YWx1ZS5jX3N0cigpKTsKLQotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgbVdmZENsaWVudFJ0cFBvcnRzID0gdmFsdWU7Ci0gICAgbUNob3NlblJUUFBvcnQgPSBwb3J0MDsKLQotICAgIGlmICghcGFyYW1zLT5maW5kUGFyYW1ldGVyKCJ3ZmRfdmlkZW9fZm9ybWF0cyIsICZ2YWx1ZSkpIHsKLSAgICAgICAgQUxPR0UoIlNpbmsgZG9lc24ndCByZXBvcnQgaXRzIGNob2ljZSBvZiB3ZmRfdmlkZW9fZm9ybWF0cy4iKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBtU2lua1N1cHBvcnRzVmlkZW8gPSBmYWxzZTsKLQotICAgIGlmICAoISh2YWx1ZSA9PSAibm9uZSIpKSB7Ci0gICAgICAgIG1TaW5rU3VwcG9ydHNWaWRlbyA9IHRydWU7Ci0gICAgICAgIGlmICghbVN1cHBvcnRlZFNpbmtWaWRlb0Zvcm1hdHMucGFyc2VGb3JtYXRTcGVjKHZhbHVlLmNfc3RyKCkpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHBhcnNlIHNpbmsgcHJvdmlkZWQgd2ZkX3ZpZGVvX2Zvcm1hdHMgKCVzKSIsCi0gICAgICAgICAgICAgICAgICB2YWx1ZS5jX3N0cigpKTsKLQotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghVmlkZW9Gb3JtYXRzOjpQaWNrQmVzdEZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgbVN1cHBvcnRlZFNpbmtWaWRlb0Zvcm1hdHMsCi0gICAgICAgICAgICAgICAgICAgIG1TdXBwb3J0ZWRTb3VyY2VWaWRlb0Zvcm1hdHMsCi0gICAgICAgICAgICAgICAgICAgICZtQ2hvc2VuVmlkZW9SZXNvbHV0aW9uVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgJm1DaG9zZW5WaWRlb1Jlc29sdXRpb25JbmRleCwKLSAgICAgICAgICAgICAgICAgICAgJm1DaG9zZW5WaWRlb1Byb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICZtQ2hvc2VuVmlkZW9MZXZlbCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJTaW5rIGFuZCBzb3VyY2Ugc2hhcmUgbm8gY29tbW9ubHkgc3VwcG9ydGVkIHZpZGVvICIKLSAgICAgICAgICAgICAgICAgICJmb3JtYXRzLiIpOwotCi0gICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBzaXplX3Qgd2lkdGgsIGhlaWdodCwgZnJhbWVzUGVyU2Vjb25kOwotICAgICAgICBib29sIGludGVybGFjZWQ7Ci0gICAgICAgIENIRUNLKFZpZGVvRm9ybWF0czo6R2V0Q29uZmlndXJhdGlvbigKLSAgICAgICAgICAgICAgICAgICAgbUNob3NlblZpZGVvUmVzb2x1dGlvblR5cGUsCi0gICAgICAgICAgICAgICAgICAgIG1DaG9zZW5WaWRlb1Jlc29sdXRpb25JbmRleCwKLSAgICAgICAgICAgICAgICAgICAgJndpZHRoLAotICAgICAgICAgICAgICAgICAgICAmaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAmZnJhbWVzUGVyU2Vjb25kLAotICAgICAgICAgICAgICAgICAgICAmaW50ZXJsYWNlZCkpOwotCi0gICAgICAgIEFMT0dJKCJQaWNrZWQgdmlkZW8gcmVzb2x1dGlvbiAlenUgeCAlenUgJWMlenUiLAotICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBpbnRlcmxhY2VkID8gJ2knIDogJ3AnLCBmcmFtZXNQZXJTZWNvbmQpOwotCi0gICAgICAgIEFMT0dJKCJQaWNrZWQgQVZDIHByb2ZpbGUgJWQsIGxldmVsICVkIiwKLSAgICAgICAgICAgICAgbUNob3NlblZpZGVvUHJvZmlsZSwgbUNob3NlblZpZGVvTGV2ZWwpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dJKCJTaW5rIGRvZXNuJ3Qgc3VwcG9ydCB2aWRlbyBhdCBhbGwuIik7Ci0gICAgfQotCi0gICAgaWYgKCFwYXJhbXMtPmZpbmRQYXJhbWV0ZXIoIndmZF9hdWRpb19jb2RlY3MiLCAmdmFsdWUpKSB7Ci0gICAgICAgIEFMT0dFKCJTaW5rIGRvZXNuJ3QgcmVwb3J0IGl0cyBjaG9pY2Ugb2Ygd2ZkX2F1ZGlvX2NvZGVjcy4iKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBtU2lua1N1cHBvcnRzQXVkaW8gPSBmYWxzZTsKLQotICAgIGlmICAoISh2YWx1ZSA9PSAibm9uZSIpKSB7Ci0gICAgICAgIG1TaW5rU3VwcG9ydHNBdWRpbyA9IHRydWU7Ci0KLSAgICAgICAgdWludDMyX3QgbW9kZXM7Ci0gICAgICAgIEdldEF1ZGlvTW9kZXModmFsdWUuY19zdHIoKSwgIkFBQyIsICZtb2Rlcyk7Ci0KLSAgICAgICAgYm9vbCBzdXBwb3J0c0FBQyA9IChtb2RlcyAmIDEpICE9IDA7ICAvLyBBQUMgMmNoIDQ4a0h6Ci0KLSAgICAgICAgR2V0QXVkaW9Nb2Rlcyh2YWx1ZS5jX3N0cigpLCAiTFBDTSIsICZtb2Rlcyk7Ci0KLSAgICAgICAgYm9vbCBzdXBwb3J0c1BDTSA9IChtb2RlcyAmIDIpICE9IDA7ICAvLyBMUENNIDJjaCA0OGtIegotCi0gICAgICAgIGlmIChzdXBwb3J0c1BDTQotICAgICAgICAgICAgICAgICYmIHByb3BlcnR5X2dldF9ib29sKCJtZWRpYS53ZmQudXNlLXBjbS1hdWRpbyIsIGZhbHNlKSkgewotICAgICAgICAgICAgQUxPR0koIlVzaW5nIFBDTSBhdWRpby4iKTsKLSAgICAgICAgICAgIG1Vc2luZ1BDTUF1ZGlvID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChzdXBwb3J0c0FBQykgewotICAgICAgICAgICAgQUxPR0koIlVzaW5nIEFBQyBhdWRpby4iKTsKLSAgICAgICAgICAgIG1Vc2luZ1BDTUF1ZGlvID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3VwcG9ydHNQQ00pIHsKLSAgICAgICAgICAgIEFMT0dJKCJVc2luZyBQQ00gYXVkaW8uIik7Ci0gICAgICAgICAgICBtVXNpbmdQQ01BdWRpbyA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HSSgiU2luayBkb2Vzbid0IHN1cHBvcnQgYW4gYXVkaW8gZm9ybWF0IHdlIGRvLiIpOwotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0koIlNpbmsgZG9lc24ndCBzdXBwb3J0IGF1ZGlvIGF0IGFsbC4iKTsKLSAgICB9Ci0KLSAgICBpZiAoIW1TaW5rU3VwcG9ydHNWaWRlbyAmJiAhbVNpbmtTdXBwb3J0c0F1ZGlvKSB7Ci0gICAgICAgIEFMT0dFKCJTaW5rIHN1cHBvcnRzIG5laXRoZXIgdmlkZW8gbm9yIGF1ZGlvLi4uIik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBtVXNpbmdIRENQID0gZmFsc2U7Ci0gICAgaWYgKCFwYXJhbXMtPmZpbmRQYXJhbWV0ZXIoIndmZF9jb250ZW50X3Byb3RlY3Rpb24iLCAmdmFsdWUpKSB7Ci0gICAgICAgIEFMT0dJKCJTaW5rIGRvZXNuJ3QgYXBwZWFyIHRvIHN1cHBvcnQgY29udGVudCBwcm90ZWN0aW9uLiIpOwotICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gIm5vbmUiKSB7Ci0gICAgICAgIEFMT0dJKCJTaW5rIGRvZXMgbm90IHN1cHBvcnQgY29udGVudCBwcm90ZWN0aW9uLiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1Vc2luZ0hEQ1AgPSB0cnVlOwotCi0gICAgICAgIGJvb2wgaXNIRENQMl8wID0gZmFsc2U7Ci0gICAgICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCJIRENQMi4wICIpKSB7Ci0gICAgICAgICAgICBpc0hEQ1AyXzAgPSB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKCF2YWx1ZS5zdGFydHNXaXRoKCJIRENQMi4xICIpKSB7Ci0gICAgICAgICAgICBBTE9HRSgibWFsZm9ybWVkIHdmZF9jb250ZW50X3Byb3RlY3Rpb246ICclcyciLCB2YWx1ZS5jX3N0cigpKTsKLQotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIGludDMyX3QgaGRjcFBvcnQ7Ci0gICAgICAgIGlmICghUGFyc2VkTWVzc2FnZTo6R2V0SW50MzJBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlLmNfc3RyKCkgKyA4LCAicG9ydCIsICZoZGNwUG9ydCkKLSAgICAgICAgICAgICAgICB8fCBoZGNwUG9ydCA8IDEgfHwgaGRjcFBvcnQgPiA2NTUzNSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIG1Jc0hEQ1AyXzAgPSBpc0hEQ1AyXzA7Ci0gICAgICAgIG1IRENQUG9ydCA9IGhkY3BQb3J0OwotCi0gICAgICAgIHN0YXR1c190IGVyciA9IG1ha2VIRENQKCk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gaW5zdGFudGlhdGUgSERDUCBjb21wb25lbnQuICIKLSAgICAgICAgICAgICAgICAgICJOb3QgdXNpbmcgSERDUCBhZnRlciBhbGwuIik7Ci0KLSAgICAgICAgICAgIG1Vc2luZ0hEQ1AgPSBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBzZW5kTTQoc2Vzc2lvbklEKTsKLX0KLQotc3RhdHVzX3QgV2lmaURpc3BsYXlTb3VyY2U6Om9uUmVjZWl2ZU00UmVzcG9uc2UoCi0gICAgICAgIGludDMyX3Qgc2Vzc2lvbklELCBjb25zdCBzcDxQYXJzZWRNZXNzYWdlPiAmbXNnKSB7Ci0gICAgaW50MzJfdCBzdGF0dXNDb2RlOwotICAgIGlmICghbXNnLT5nZXRTdGF0dXNDb2RlKCZzdGF0dXNDb2RlKSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGlmIChzdGF0dXNDb2RlICE9IDIwMCkgewotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgaWYgKG1Vc2luZ0hEQ1AgJiYgIW1IRENQSW5pdGlhbGl6YXRpb25Db21wbGV0ZSkgewotICAgICAgICBBTE9HSSgiRGVmZXJyaW5nIFNFVFVQIHRyaWdnZXIgdW50aWwgSERDUCBpbml0aWFsaXphdGlvbiBjb21wbGV0ZXMuIik7Ci0KLSAgICAgICAgbVNldHVwVHJpZ2dlckRlZmVycmVkID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIHJldHVybiBzZW5kVHJpZ2dlcihzZXNzaW9uSUQsIFRSSUdHRVJfU0VUVVApOwotfQotCi1zdGF0dXNfdCBXaWZpRGlzcGxheVNvdXJjZTo6b25SZWNlaXZlTTVSZXNwb25zZSgKLSAgICAgICAgaW50MzJfdCAvKiBzZXNzaW9uSUQgKi8sIGNvbnN0IHNwPFBhcnNlZE1lc3NhZ2U+ICZtc2cpIHsKLSAgICBpbnQzMl90IHN0YXR1c0NvZGU7Ci0gICAgaWYgKCFtc2ctPmdldFN0YXR1c0NvZGUoJnN0YXR1c0NvZGUpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgaWYgKHN0YXR1c0NvZGUgIT0gMjAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFdpZmlEaXNwbGF5U291cmNlOjpvblJlY2VpdmVNMTZSZXNwb25zZSgKLSAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsIGNvbnN0IHNwPFBhcnNlZE1lc3NhZ2U+ICYgLyogbXNnICovKSB7Ci0gICAgLy8gSWYgb25seSB0aGUgcmVzcG9uc2Ugd2FzIHJlcXVpcmVkIHRvIGluY2x1ZGUgYSAiU2Vzc2lvbjoiIGhlYWRlci4uLgotCi0gICAgQ0hFQ0tfRVEoc2Vzc2lvbklELCBtQ2xpZW50U2Vzc2lvbklEKTsKLQotICAgIGlmIChtQ2xpZW50SW5mby5tUGxheWJhY2tTZXNzaW9uICE9IE5VTEwpIHsKLSAgICAgICAgbUNsaWVudEluZm8ubVBsYXliYWNrU2Vzc2lvbi0+dXBkYXRlTGl2ZW5lc3MoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgV2lmaURpc3BsYXlTb3VyY2U6OnNjaGVkdWxlUmVhcGVyKCkgewotICAgIGlmIChtUmVhcGVyUGVuZGluZykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbVJlYXBlclBlbmRpbmcgPSB0cnVlOwotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRSZWFwRGVhZENsaWVudHMsIHRoaXMpKS0+cG9zdChrUmVhcGVySW50ZXJ2YWxVcyk7Ci19Ci0KLXZvaWQgV2lmaURpc3BsYXlTb3VyY2U6OnNjaGVkdWxlS2VlcEFsaXZlKGludDMyX3Qgc2Vzc2lvbklEKSB7Ci0gICAgLy8gV2UgbmVlZCB0byBzZW5kIHVwZGF0ZXMgYXQgbGVhc3QgNSBzZWNzIGJlZm9yZSB0aGUgdGltZW91dCBpcyBzZXQgdG8KLSAgICAvLyBleHBpcmUsIG1ha2Ugc3VyZSB0aGUgdGltZW91dCBpcyBncmVhdGVyIHRoYW4gNSBzZWNzIHRvIGJlZ2luIHdpdGguCi0gICAgQ0hFQ0tfR1Qoa1BsYXliYWNrU2Vzc2lvblRpbWVvdXRVcywgNTAwMDAwMGxsKTsKLQotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRLZWVwQWxpdmUsIHRoaXMpOwotICAgIG1zZy0+c2V0SW50MzIoInNlc3Npb25JRCIsIHNlc3Npb25JRCk7Ci0gICAgbXNnLT5wb3N0KGtQbGF5YmFja1Nlc3Npb25UaW1lb3V0VXMgLSA1MDAwMDAwbGwpOwotfQotCi1zdGF0dXNfdCBXaWZpRGlzcGxheVNvdXJjZTo6b25SZWNlaXZlQ2xpZW50RGF0YShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewotICAgIGludDMyX3Qgc2Vzc2lvbklEOwotICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzZXNzaW9uSUQiLCAmc2Vzc2lvbklEKSk7Ci0KLSAgICBzcDxSZWZCYXNlPiBvYmo7Ci0gICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJkYXRhIiwgJm9iaikpOwotCi0gICAgc3A8UGFyc2VkTWVzc2FnZT4gZGF0YSA9Ci0gICAgICAgIHN0YXRpY19jYXN0PFBhcnNlZE1lc3NhZ2UgKj4ob2JqLmdldCgpKTsKLQotICAgIEFMT0dWKCJzZXNzaW9uICVkIHJlY2VpdmVkICclcyciLAotICAgICAgICAgIHNlc3Npb25JRCwgZGF0YS0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKLQotICAgIEFTdHJpbmcgbWV0aG9kOwotICAgIEFTdHJpbmcgdXJpOwotICAgIGRhdGEtPmdldFJlcXVlc3RGaWVsZCgwLCAmbWV0aG9kKTsKLQotICAgIGludDMyX3QgY3NlcTsKLSAgICBpZiAoIWRhdGEtPmZpbmRJbnQzMigiY3NlcSIsICZjc2VxKSkgewotICAgICAgICBzZW5kRXJyb3JSZXNwb25zZShzZXNzaW9uSUQsICI0MDAgQmFkIFJlcXVlc3QiLCAtMSAvKiBjc2VxICovKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBpZiAobWV0aG9kLnN0YXJ0c1dpdGgoIlJUU1AvIikpIHsKLSAgICAgICAgLy8gVGhpcyBpcyBhIHJlc3BvbnNlLgotCi0gICAgICAgIFJlc3BvbnNlSUQgaWQ7Ci0gICAgICAgIGlkLm1TZXNzaW9uSUQgPSBzZXNzaW9uSUQ7Ci0gICAgICAgIGlkLm1DU2VxID0gY3NlcTsKLQotICAgICAgICBzc2l6ZV90IGluZGV4ID0gbVJlc3BvbnNlSGFuZGxlcnMuaW5kZXhPZktleShpZCk7Ci0KLSAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgQUxPR1coIlJlY2VpdmVkIHVuc29saWNpdGVkIHNlcnZlciByZXNwb25zZSwgY3NlcSAlZCIsIGNzZXEpOwotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIEhhbmRsZVJUU1BSZXNwb25zZUZ1bmMgZnVuYyA9IG1SZXNwb25zZUhhbmRsZXJzLnZhbHVlQXQoaW5kZXgpOwotICAgICAgICBtUmVzcG9uc2VIYW5kbGVycy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKLQotICAgICAgICBzdGF0dXNfdCBlcnIgPSAodGhpcy0+KmZ1bmMpKHNlc3Npb25JRCwgZGF0YSk7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgQUxPR1coIlJlc3BvbnNlIGhhbmRsZXIgZm9yIHNlc3Npb24gJWQsIGNzZXEgJWQgcmV0dXJuZWQgIgotICAgICAgICAgICAgICAgICAgImVyciAlZCAoJXMpIiwKLSAgICAgICAgICAgICAgICAgIHNlc3Npb25JRCwgY3NlcSwgZXJyLCBzdHJlcnJvcigtZXJyKSk7Ci0KLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgQVN0cmluZyB2ZXJzaW9uOwotICAgIGRhdGEtPmdldFJlcXVlc3RGaWVsZCgyLCAmdmVyc2lvbik7Ci0gICAgaWYgKCEodmVyc2lvbiA9PSBBU3RyaW5nKCJSVFNQLzEuMCIpKSkgewotICAgICAgICBzZW5kRXJyb3JSZXNwb25zZShzZXNzaW9uSUQsICI1MDUgUlRTUCBWZXJzaW9uIG5vdCBzdXBwb3J0ZWQiLCBjc2VxKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwotICAgIH0KLQotICAgIHN0YXR1c190IGVycjsKLSAgICBpZiAobWV0aG9kID09ICJPUFRJT05TIikgewotICAgICAgICBlcnIgPSBvbk9wdGlvbnNSZXF1ZXN0KHNlc3Npb25JRCwgY3NlcSwgZGF0YSk7Ci0gICAgfSBlbHNlIGlmIChtZXRob2QgPT0gIlNFVFVQIikgewotICAgICAgICBlcnIgPSBvblNldHVwUmVxdWVzdChzZXNzaW9uSUQsIGNzZXEsIGRhdGEpOwotICAgIH0gZWxzZSBpZiAobWV0aG9kID09ICJQTEFZIikgewotICAgICAgICBlcnIgPSBvblBsYXlSZXF1ZXN0KHNlc3Npb25JRCwgY3NlcSwgZGF0YSk7Ci0gICAgfSBlbHNlIGlmIChtZXRob2QgPT0gIlBBVVNFIikgewotICAgICAgICBlcnIgPSBvblBhdXNlUmVxdWVzdChzZXNzaW9uSUQsIGNzZXEsIGRhdGEpOwotICAgIH0gZWxzZSBpZiAobWV0aG9kID09ICJURUFSRE9XTiIpIHsKLSAgICAgICAgZXJyID0gb25UZWFyZG93blJlcXVlc3Qoc2Vzc2lvbklELCBjc2VxLCBkYXRhKTsKLSAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PSAiR0VUX1BBUkFNRVRFUiIpIHsKLSAgICAgICAgZXJyID0gb25HZXRQYXJhbWV0ZXJSZXF1ZXN0KHNlc3Npb25JRCwgY3NlcSwgZGF0YSk7Ci0gICAgfSBlbHNlIGlmIChtZXRob2QgPT0gIlNFVF9QQVJBTUVURVIiKSB7Ci0gICAgICAgIGVyciA9IG9uU2V0UGFyYW1ldGVyUmVxdWVzdChzZXNzaW9uSUQsIGNzZXEsIGRhdGEpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNlbmRFcnJvclJlc3BvbnNlKHNlc3Npb25JRCwgIjQwNSBNZXRob2QgTm90IEFsbG93ZWQiLCBjc2VxKTsKLQotICAgICAgICBlcnIgPSBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBXaWZpRGlzcGxheVNvdXJjZTo6b25PcHRpb25zUmVxdWVzdCgKLSAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsCi0gICAgICAgIGludDMyX3QgY3NlcSwKLSAgICAgICAgY29uc3Qgc3A8UGFyc2VkTWVzc2FnZT4gJmRhdGEpIHsKLSAgICBpbnQzMl90IHBsYXliYWNrU2Vzc2lvbklEOwotICAgIHNwPFBsYXliYWNrU2Vzc2lvbj4gcGxheWJhY2tTZXNzaW9uID0KLSAgICAgICAgZmluZFBsYXliYWNrU2Vzc2lvbihkYXRhLCAmcGxheWJhY2tTZXNzaW9uSUQpOwotCi0gICAgaWYgKHBsYXliYWNrU2Vzc2lvbiAhPSBOVUxMKSB7Ci0gICAgICAgIHBsYXliYWNrU2Vzc2lvbi0+dXBkYXRlTGl2ZW5lc3MoKTsKLSAgICB9Ci0KLSAgICBBU3RyaW5nIHJlc3BvbnNlID0gIlJUU1AvMS4wIDIwMCBPS1xyXG4iOwotICAgIEFwcGVuZENvbW1vblJlc3BvbnNlKCZyZXNwb25zZSwgY3NlcSk7Ci0KLSAgICByZXNwb25zZS5hcHBlbmQoCi0gICAgICAgICAgICAiUHVibGljOiBvcmcud2ZhLndmZDEuMCwgU0VUVVAsIFRFQVJET1dOLCBQTEFZLCBQQVVTRSwgIgotICAgICAgICAgICAgIkdFVF9QQVJBTUVURVIsIFNFVF9QQVJBTUVURVJcclxuIik7Ci0KLSAgICByZXNwb25zZS5hcHBlbmQoIlxyXG4iKTsKLQotICAgIHN0YXR1c190IGVyciA9IG1OZXRTZXNzaW9uLT5zZW5kUmVxdWVzdChzZXNzaW9uSUQsIHJlc3BvbnNlLmNfc3RyKCkpOwotCi0gICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICBlcnIgPSBzZW5kTTMoc2Vzc2lvbklEKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBXaWZpRGlzcGxheVNvdXJjZTo6b25TZXR1cFJlcXVlc3QoCi0gICAgICAgIGludDMyX3Qgc2Vzc2lvbklELAotICAgICAgICBpbnQzMl90IGNzZXEsCi0gICAgICAgIGNvbnN0IHNwPFBhcnNlZE1lc3NhZ2U+ICZkYXRhKSB7Ci0gICAgQ0hFQ0tfRVEoc2Vzc2lvbklELCBtQ2xpZW50U2Vzc2lvbklEKTsKLSAgICBpZiAobUNsaWVudEluZm8ubVBsYXliYWNrU2Vzc2lvbklEICE9IC0xKSB7Ci0gICAgICAgIC8vIFdlIG9ubHkgc3VwcG9ydCBhIHNpbmdsZSBwbGF5YmFjayBzZXNzaW9uIHBlciBjbGllbnQuCi0gICAgICAgIC8vIFRoaXMgaXMgZHVlIHRvIHRoZSByZXZlcnNlZCBrZWVwLWFsaXZlIGRlc2lnbiBpbiB0aGUgd2ZkIHNwZWNzLi4uCi0gICAgICAgIHNlbmRFcnJvclJlc3BvbnNlKHNlc3Npb25JRCwgIjQwMCBCYWQgUmVxdWVzdCIsIGNzZXEpOwotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIEFTdHJpbmcgdHJhbnNwb3J0OwotICAgIGlmICghZGF0YS0+ZmluZFN0cmluZygidHJhbnNwb3J0IiwgJnRyYW5zcG9ydCkpIHsKLSAgICAgICAgc2VuZEVycm9yUmVzcG9uc2Uoc2Vzc2lvbklELCAiNDAwIEJhZCBSZXF1ZXN0IiwgY3NlcSk7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgUlRQU2VuZGVyOjpUcmFuc3BvcnRNb2RlIHJ0cE1vZGUgPSBSVFBTZW5kZXI6OlRSQU5TUE9SVF9VRFA7Ci0KLSAgICBpbnQgY2xpZW50UnRwLCBjbGllbnRSdGNwOwotICAgIGlmICh0cmFuc3BvcnQuc3RhcnRzV2l0aCgiUlRQL0FWUC9UQ1A7IikpIHsKLSAgICAgICAgQVN0cmluZyBpbnRlcmxlYXZlZDsKLSAgICAgICAgaWYgKFBhcnNlZE1lc3NhZ2U6OkdldEF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LmNfc3RyKCksICJpbnRlcmxlYXZlZCIsICZpbnRlcmxlYXZlZCkKLSAgICAgICAgICAgICAgICAmJiBzc2NhbmYoaW50ZXJsZWF2ZWQuY19zdHIoKSwgIiVkLSVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmNsaWVudFJ0cCwgJmNsaWVudFJ0Y3ApID09IDIpIHsKLSAgICAgICAgICAgIHJ0cE1vZGUgPSBSVFBTZW5kZXI6OlRSQU5TUE9SVF9UQ1BfSU5URVJMRUFWRUQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBib29sIGJhZFJlcXVlc3QgPSBmYWxzZTsKLQotICAgICAgICAgICAgQVN0cmluZyBjbGllbnRQb3J0OwotICAgICAgICAgICAgaWYgKCFQYXJzZWRNZXNzYWdlOjpHZXRBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQuY19zdHIoKSwgImNsaWVudF9wb3J0IiwgJmNsaWVudFBvcnQpKSB7Ci0gICAgICAgICAgICAgICAgYmFkUmVxdWVzdCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHNzY2FuZihjbGllbnRQb3J0LmNfc3RyKCksICIlZC0lZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2xpZW50UnRwLCAmY2xpZW50UnRjcCkgPT0gMikgewotICAgICAgICAgICAgfSBlbHNlIGlmIChzc2NhbmYoY2xpZW50UG9ydC5jX3N0cigpLCAiJWQiLCAmY2xpZW50UnRwKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgLy8gTm8gUlRDUC4KLSAgICAgICAgICAgICAgICBjbGllbnRSdGNwID0gLTE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJhZFJlcXVlc3QgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoYmFkUmVxdWVzdCkgewotICAgICAgICAgICAgICAgIHNlbmRFcnJvclJlc3BvbnNlKHNlc3Npb25JRCwgIjQwMCBCYWQgUmVxdWVzdCIsIGNzZXEpOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJ0cE1vZGUgPSBSVFBTZW5kZXI6OlRSQU5TUE9SVF9UQ1A7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHRyYW5zcG9ydC5zdGFydHNXaXRoKCJSVFAvQVZQO3VuaWNhc3Q7IikKLSAgICAgICAgICAgIHx8IHRyYW5zcG9ydC5zdGFydHNXaXRoKCJSVFAvQVZQL1VEUDt1bmljYXN0OyIpKSB7Ci0gICAgICAgIGJvb2wgYmFkUmVxdWVzdCA9IGZhbHNlOwotCi0gICAgICAgIEFTdHJpbmcgY2xpZW50UG9ydDsKLSAgICAgICAgaWYgKCFQYXJzZWRNZXNzYWdlOjpHZXRBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5jX3N0cigpLCAiY2xpZW50X3BvcnQiLCAmY2xpZW50UG9ydCkpIHsKLSAgICAgICAgICAgIGJhZFJlcXVlc3QgPSB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKHNzY2FuZihjbGllbnRQb3J0LmNfc3RyKCksICIlZC0lZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZjbGllbnRSdHAsICZjbGllbnRSdGNwKSA9PSAyKSB7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3NjYW5mKGNsaWVudFBvcnQuY19zdHIoKSwgIiVkIiwgJmNsaWVudFJ0cCkgPT0gMSkgewotICAgICAgICAgICAgLy8gTm8gUlRDUC4KLSAgICAgICAgICAgIGNsaWVudFJ0Y3AgPSAtMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJhZFJlcXVlc3QgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJhZFJlcXVlc3QpIHsKLSAgICAgICAgICAgIHNlbmRFcnJvclJlc3BvbnNlKHNlc3Npb25JRCwgIjQwMCBCYWQgUmVxdWVzdCIsIGNzZXEpOwotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotI2lmIDEKLSAgICAvLyBUaGUgb2xkZXIgTEcgZG9uZ2xlcyBkb2Vzbid0IHNwZWNpZnkgY2xpZW50X3BvcnQ9eHh4IGFwcGFyZW50bHkuCi0gICAgfSBlbHNlIGlmICh0cmFuc3BvcnQgPT0gIlJUUC9BVlAvVURQO3VuaWNhc3QiKSB7Ci0gICAgICAgIGNsaWVudFJ0cCA9IDE5MDAwOwotICAgICAgICBjbGllbnRSdGNwID0gLTE7Ci0jZW5kaWYKLSAgICB9IGVsc2UgewotICAgICAgICBzZW5kRXJyb3JSZXNwb25zZShzZXNzaW9uSUQsICI0NjEgVW5zdXBwb3J0ZWQgVHJhbnNwb3J0IiwgY3NlcSk7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBpbnQzMl90IHBsYXliYWNrU2Vzc2lvbklEID0gbWFrZVVuaXF1ZVBsYXliYWNrU2Vzc2lvbklEKCk7Ci0KLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0UGxheWJhY2tTZXNzaW9uTm90aWZ5LCB0aGlzKTsKLSAgICBub3RpZnktPnNldEludDMyKCJwbGF5YmFja1Nlc3Npb25JRCIsIHBsYXliYWNrU2Vzc2lvbklEKTsKLSAgICBub3RpZnktPnNldEludDMyKCJzZXNzaW9uSUQiLCBzZXNzaW9uSUQpOwotCi0gICAgc3A8UGxheWJhY2tTZXNzaW9uPiBwbGF5YmFja1Nlc3Npb24gPQotICAgICAgICBuZXcgUGxheWJhY2tTZXNzaW9uKAotICAgICAgICAgICAgICAgIG1PcFBhY2thZ2VOYW1lLCBtTmV0U2Vzc2lvbiwgbm90aWZ5LCBtSW50ZXJmYWNlQWRkciwgbUhEQ1AsIG1NZWRpYVBhdGguY19zdHIoKSk7Ci0KLSAgICBsb29wZXIoKS0+cmVnaXN0ZXJIYW5kbGVyKHBsYXliYWNrU2Vzc2lvbik7Ci0KLSAgICBBU3RyaW5nIHVyaTsKLSAgICBkYXRhLT5nZXRSZXF1ZXN0RmllbGQoMSwgJnVyaSk7Ci0KLSAgICBpZiAoc3RybmNhc2VjbXAoInJ0c3A6Ly8iLCB1cmkuY19zdHIoKSwgNykpIHsKLSAgICAgICAgc2VuZEVycm9yUmVzcG9uc2Uoc2Vzc2lvbklELCAiNDAwIEJhZCBSZXF1ZXN0IiwgY3NlcSk7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgaWYgKCEodXJpLnN0YXJ0c1dpdGgoInJ0c3A6Ly8iKSAmJiB1cmkuZW5kc1dpdGgoIi93ZmQxLjAvc3RyZWFtaWQ9MCIpKSkgewotICAgICAgICBzZW5kRXJyb3JSZXNwb25zZShzZXNzaW9uSUQsICI0MDQgTm90IGZvdW5kIiwgY3NlcSk7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgUlRQU2VuZGVyOjpUcmFuc3BvcnRNb2RlIHJ0Y3BNb2RlID0gUlRQU2VuZGVyOjpUUkFOU1BPUlRfVURQOwotICAgIGlmIChjbGllbnRSdGNwIDwgMCkgewotICAgICAgICBydGNwTW9kZSA9IFJUUFNlbmRlcjo6VFJBTlNQT1JUX05PTkU7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZXJyID0gcGxheWJhY2tTZXNzaW9uLT5pbml0KAotICAgICAgICAgICAgbUNsaWVudEluZm8ubVJlbW90ZUlQLmNfc3RyKCksCi0gICAgICAgICAgICBjbGllbnRSdHAsCi0gICAgICAgICAgICBydHBNb2RlLAotICAgICAgICAgICAgY2xpZW50UnRjcCwKLSAgICAgICAgICAgIHJ0Y3BNb2RlLAotICAgICAgICAgICAgbVNpbmtTdXBwb3J0c0F1ZGlvLAotICAgICAgICAgICAgbVVzaW5nUENNQXVkaW8sCi0gICAgICAgICAgICBtU2lua1N1cHBvcnRzVmlkZW8sCi0gICAgICAgICAgICBtQ2hvc2VuVmlkZW9SZXNvbHV0aW9uVHlwZSwKLSAgICAgICAgICAgIG1DaG9zZW5WaWRlb1Jlc29sdXRpb25JbmRleCwKLSAgICAgICAgICAgIG1DaG9zZW5WaWRlb1Byb2ZpbGUsCi0gICAgICAgICAgICBtQ2hvc2VuVmlkZW9MZXZlbCk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIGxvb3BlcigpLT51bnJlZ2lzdGVySGFuZGxlcihwbGF5YmFja1Nlc3Npb24tPmlkKCkpOwotICAgICAgICBwbGF5YmFja1Nlc3Npb24uY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKGVycikgewotICAgICAgICBjYXNlIE9LOgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgLUVOT0VOVDoKLSAgICAgICAgICAgIHNlbmRFcnJvclJlc3BvbnNlKHNlc3Npb25JRCwgIjQwNCBOb3QgRm91bmQiLCBjc2VxKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBzZW5kRXJyb3JSZXNwb25zZShzZXNzaW9uSUQsICI0MDMgRm9yYmlkZGVuIiwgY3NlcSk7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIG1DbGllbnRJbmZvLm1QbGF5YmFja1Nlc3Npb25JRCA9IHBsYXliYWNrU2Vzc2lvbklEOwotICAgIG1DbGllbnRJbmZvLm1QbGF5YmFja1Nlc3Npb24gPSBwbGF5YmFja1Nlc3Npb247Ci0KLSAgICBBU3RyaW5nIHJlc3BvbnNlID0gIlJUU1AvMS4wIDIwMCBPS1xyXG4iOwotICAgIEFwcGVuZENvbW1vblJlc3BvbnNlKCZyZXNwb25zZSwgY3NlcSwgcGxheWJhY2tTZXNzaW9uSUQpOwotCi0gICAgaWYgKHJ0cE1vZGUgPT0gUlRQU2VuZGVyOjpUUkFOU1BPUlRfVENQX0lOVEVSTEVBVkVEKSB7Ci0gICAgICAgIHJlc3BvbnNlLmFwcGVuZCgKLSAgICAgICAgICAgICAgICBBU3RyaW5nUHJpbnRmKAotICAgICAgICAgICAgICAgICAgICAiVHJhbnNwb3J0OiBSVFAvQVZQL1RDUDtpbnRlcmxlYXZlZD0lZC0lZDsiLAotICAgICAgICAgICAgICAgICAgICBjbGllbnRSdHAsIGNsaWVudFJ0Y3ApKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpbnQzMl90IHNlcnZlclJ0cCA9IHBsYXliYWNrU2Vzc2lvbi0+Z2V0UlRQUG9ydCgpOwotCi0gICAgICAgIEFTdHJpbmcgdHJhbnNwb3J0U3RyaW5nID0gIlVEUCI7Ci0gICAgICAgIGlmIChydHBNb2RlID09IFJUUFNlbmRlcjo6VFJBTlNQT1JUX1RDUCkgewotICAgICAgICAgICAgdHJhbnNwb3J0U3RyaW5nID0gIlRDUCI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY2xpZW50UnRjcCA+PSAwKSB7Ci0gICAgICAgICAgICByZXNwb25zZS5hcHBlbmQoCi0gICAgICAgICAgICAgICAgICAgIEFTdHJpbmdQcmludGYoCi0gICAgICAgICAgICAgICAgICAgICAgICAiVHJhbnNwb3J0OiBSVFAvQVZQLyVzO3VuaWNhc3Q7Y2xpZW50X3BvcnQ9JWQtJWQ7IgotICAgICAgICAgICAgICAgICAgICAgICAgInNlcnZlcl9wb3J0PSVkLSVkXHJcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRTdHJpbmcuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFJ0cCwgY2xpZW50UnRjcCwgc2VydmVyUnRwLCBzZXJ2ZXJSdHAgKyAxKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXNwb25zZS5hcHBlbmQoCi0gICAgICAgICAgICAgICAgICAgIEFTdHJpbmdQcmludGYoCi0gICAgICAgICAgICAgICAgICAgICAgICAiVHJhbnNwb3J0OiBSVFAvQVZQLyVzO3VuaWNhc3Q7Y2xpZW50X3BvcnQ9JWQ7IgotICAgICAgICAgICAgICAgICAgICAgICAgInNlcnZlcl9wb3J0PSVkXHJcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRTdHJpbmcuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFJ0cCwgc2VydmVyUnRwKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXNwb25zZS5hcHBlbmQoIlxyXG4iKTsKLQotICAgIGVyciA9IG1OZXRTZXNzaW9uLT5zZW5kUmVxdWVzdChzZXNzaW9uSUQsIHJlc3BvbnNlLmNfc3RyKCkpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIG1TdGF0ZSA9IEFXQUlUSU5HX0NMSUVOVF9QTEFZOwotCi0gICAgc2NoZWR1bGVSZWFwZXIoKTsKLSAgICBzY2hlZHVsZUtlZXBBbGl2ZShzZXNzaW9uSUQpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBXaWZpRGlzcGxheVNvdXJjZTo6b25QbGF5UmVxdWVzdCgKLSAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsCi0gICAgICAgIGludDMyX3QgY3NlcSwKLSAgICAgICAgY29uc3Qgc3A8UGFyc2VkTWVzc2FnZT4gJmRhdGEpIHsKLSAgICBpbnQzMl90IHBsYXliYWNrU2Vzc2lvbklEOwotICAgIHNwPFBsYXliYWNrU2Vzc2lvbj4gcGxheWJhY2tTZXNzaW9uID0KLSAgICAgICAgZmluZFBsYXliYWNrU2Vzc2lvbihkYXRhLCAmcGxheWJhY2tTZXNzaW9uSUQpOwotCi0gICAgaWYgKHBsYXliYWNrU2Vzc2lvbiA9PSBOVUxMKSB7Ci0gICAgICAgIHNlbmRFcnJvclJlc3BvbnNlKHNlc3Npb25JRCwgIjQ1NCBTZXNzaW9uIE5vdCBGb3VuZCIsIGNzZXEpOwotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGlmIChtU3RhdGUgIT0gQVdBSVRJTkdfQ0xJRU5UX1BMQVkKLSAgICAgJiYgbVN0YXRlICE9IFBBVVNFRF9UT19QTEFZSU5HCi0gICAgICYmIG1TdGF0ZSAhPSBQQVVTRUQpIHsKLSAgICAgICAgQUxPR1coIlJlY2VpdmVkIFBMQVkgcmVxdWVzdCBidXQgd2UncmUgaW4gc3RhdGUgJWQiLCBtU3RhdGUpOwotCi0gICAgICAgIHNlbmRFcnJvclJlc3BvbnNlKAotICAgICAgICAgICAgICAgIHNlc3Npb25JRCwgIjQ1NSBNZXRob2QgTm90IFZhbGlkIGluIFRoaXMgU3RhdGUiLCBjc2VxKTsKLQotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgQUxPR0koIlJlY2VpdmVkIFBMQVkgcmVxdWVzdC4iKTsKLSAgICBpZiAobVBsYXliYWNrU2Vzc2lvbkVzdGFibGlzaGVkKSB7Ci0gICAgICAgIGZpbmlzaFBsYXkoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HSSgiZGVmZXJyaW5nIFBMQVkgcmVxdWVzdCB1bnRpbCBzZXNzaW9uIGVzdGFibGlzaGVkLiIpOwotICAgIH0KLQotICAgIEFTdHJpbmcgcmVzcG9uc2UgPSAiUlRTUC8xLjAgMjAwIE9LXHJcbiI7Ci0gICAgQXBwZW5kQ29tbW9uUmVzcG9uc2UoJnJlc3BvbnNlLCBjc2VxLCBwbGF5YmFja1Nlc3Npb25JRCk7Ci0gICAgcmVzcG9uc2UuYXBwZW5kKCJSYW5nZTogbnB0PW5vdy1cclxuIik7Ci0gICAgcmVzcG9uc2UuYXBwZW5kKCJcclxuIik7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBtTmV0U2Vzc2lvbi0+c2VuZFJlcXVlc3Qoc2Vzc2lvbklELCByZXNwb25zZS5jX3N0cigpKTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiAobVN0YXRlID09IFBBVVNFRF9UT19QTEFZSU5HIHx8IG1QbGF5YmFja1Nlc3Npb25Fc3RhYmxpc2hlZCkgewotICAgICAgICBtU3RhdGUgPSBQTEFZSU5HOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgQ0hFQ0tfRVEobVN0YXRlLCBBV0FJVElOR19DTElFTlRfUExBWSk7Ci0gICAgbVN0YXRlID0gQUJPVVRfVE9fUExBWTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBXaWZpRGlzcGxheVNvdXJjZTo6ZmluaXNoUGxheSgpIHsKLSAgICBjb25zdCBzcDxQbGF5YmFja1Nlc3Npb24+ICZwbGF5YmFja1Nlc3Npb24gPQotICAgICAgICBtQ2xpZW50SW5mby5tUGxheWJhY2tTZXNzaW9uOwotCi0gICAgc3RhdHVzX3QgZXJyID0gcGxheWJhY2tTZXNzaW9uLT5wbGF5KCk7Ci0gICAgQ0hFQ0tfRVEoZXJyLCAoc3RhdHVzX3QpT0spOwotfQotCi1zdGF0dXNfdCBXaWZpRGlzcGxheVNvdXJjZTo6b25QYXVzZVJlcXVlc3QoCi0gICAgICAgIGludDMyX3Qgc2Vzc2lvbklELAotICAgICAgICBpbnQzMl90IGNzZXEsCi0gICAgICAgIGNvbnN0IHNwPFBhcnNlZE1lc3NhZ2U+ICZkYXRhKSB7Ci0gICAgaW50MzJfdCBwbGF5YmFja1Nlc3Npb25JRDsKLSAgICBzcDxQbGF5YmFja1Nlc3Npb24+IHBsYXliYWNrU2Vzc2lvbiA9Ci0gICAgICAgIGZpbmRQbGF5YmFja1Nlc3Npb24oZGF0YSwgJnBsYXliYWNrU2Vzc2lvbklEKTsKLQotICAgIGlmIChwbGF5YmFja1Nlc3Npb24gPT0gTlVMTCkgewotICAgICAgICBzZW5kRXJyb3JSZXNwb25zZShzZXNzaW9uSUQsICI0NTQgU2Vzc2lvbiBOb3QgRm91bmQiLCBjc2VxKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBBTE9HSSgiUmVjZWl2ZWQgUEFVU0UgcmVxdWVzdC4iKTsKLQotICAgIGlmIChtU3RhdGUgIT0gUExBWUlOR19UT19QQVVTRUQgJiYgbVN0YXRlICE9IFBMQVlJTkcpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIHN0YXR1c190IGVyciA9IHBsYXliYWNrU2Vzc2lvbi0+cGF1c2UoKTsKLSAgICBDSEVDS19FUShlcnIsIChzdGF0dXNfdClPSyk7Ci0KLSAgICBBU3RyaW5nIHJlc3BvbnNlID0gIlJUU1AvMS4wIDIwMCBPS1xyXG4iOwotICAgIEFwcGVuZENvbW1vblJlc3BvbnNlKCZyZXNwb25zZSwgY3NlcSwgcGxheWJhY2tTZXNzaW9uSUQpOwotICAgIHJlc3BvbnNlLmFwcGVuZCgiXHJcbiIpOwotCi0gICAgZXJyID0gbU5ldFNlc3Npb24tPnNlbmRSZXF1ZXN0KHNlc3Npb25JRCwgcmVzcG9uc2UuY19zdHIoKSk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgbVN0YXRlID0gUEFVU0VEOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgV2lmaURpc3BsYXlTb3VyY2U6Om9uVGVhcmRvd25SZXF1ZXN0KAotICAgICAgICBpbnQzMl90IHNlc3Npb25JRCwKLSAgICAgICAgaW50MzJfdCBjc2VxLAotICAgICAgICBjb25zdCBzcDxQYXJzZWRNZXNzYWdlPiAmZGF0YSkgewotICAgIEFMT0dJKCJSZWNlaXZlZCBURUFSRE9XTiByZXF1ZXN0LiIpOwotCi0gICAgaW50MzJfdCBwbGF5YmFja1Nlc3Npb25JRDsKLSAgICBzcDxQbGF5YmFja1Nlc3Npb24+IHBsYXliYWNrU2Vzc2lvbiA9Ci0gICAgICAgIGZpbmRQbGF5YmFja1Nlc3Npb24oZGF0YSwgJnBsYXliYWNrU2Vzc2lvbklEKTsKLQotICAgIGlmIChwbGF5YmFja1Nlc3Npb24gPT0gTlVMTCkgewotICAgICAgICBzZW5kRXJyb3JSZXNwb25zZShzZXNzaW9uSUQsICI0NTQgU2Vzc2lvbiBOb3QgRm91bmQiLCBjc2VxKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBBU3RyaW5nIHJlc3BvbnNlID0gIlJUU1AvMS4wIDIwMCBPS1xyXG4iOwotICAgIEFwcGVuZENvbW1vblJlc3BvbnNlKCZyZXNwb25zZSwgY3NlcSwgcGxheWJhY2tTZXNzaW9uSUQpOwotICAgIHJlc3BvbnNlLmFwcGVuZCgiQ29ubmVjdGlvbjogY2xvc2VcclxuIik7Ci0gICAgcmVzcG9uc2UuYXBwZW5kKCJcclxuIik7Ci0KLSAgICBtTmV0U2Vzc2lvbi0+c2VuZFJlcXVlc3Qoc2Vzc2lvbklELCByZXNwb25zZS5jX3N0cigpKTsKLQotICAgIGlmIChtU3RhdGUgPT0gQVdBSVRJTkdfQ0xJRU5UX1RFQVJET1dOKSB7Ci0gICAgICAgIENIRUNLKG1TdG9wUmVwbHlJRCAhPSBOVUxMKTsKLSAgICAgICAgZmluaXNoU3RvcCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1DbGllbnQtPm9uRGlzcGxheUVycm9yKElSZW1vdGVEaXNwbGF5Q2xpZW50OjprRGlzcGxheUVycm9yVW5rbm93bik7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIFdpZmlEaXNwbGF5U291cmNlOjpmaW5pc2hTdG9wKCkgewotICAgIEFMT0dWKCJmaW5pc2hTdG9wIik7Ci0KLSAgICBtU3RhdGUgPSBTVE9QUElORzsKLQotICAgIGRpc2Nvbm5lY3RDbGllbnRBc3luYygpOwotfQotCi12b2lkIFdpZmlEaXNwbGF5U291cmNlOjpmaW5pc2hTdG9wQWZ0ZXJEaXNjb25uZWN0aW5nQ2xpZW50KCkgewotICAgIEFMT0dWKCJmaW5pc2hTdG9wQWZ0ZXJEaXNjb25uZWN0aW5nQ2xpZW50Iik7Ci0KLSAgICBpZiAobUhEQ1AgIT0gTlVMTCkgewotICAgICAgICBBTE9HSSgiSW5pdGlhdGluZyBIRENQIHNodXRkb3duLiIpOwotICAgICAgICBtSERDUC0+c2h1dGRvd25Bc3luYygpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZmluaXNoU3RvcDIoKTsKLX0KLQotdm9pZCBXaWZpRGlzcGxheVNvdXJjZTo6ZmluaXNoU3RvcDIoKSB7Ci0gICAgQUxPR1YoImZpbmlzaFN0b3AyIik7Ci0KLSAgICBpZiAobUhEQ1AgIT0gTlVMTCkgewotICAgICAgICBtSERDUC0+c2V0T2JzZXJ2ZXIoTlVMTCk7Ci0gICAgICAgIG1IRENQT2JzZXJ2ZXIuY2xlYXIoKTsKLSAgICAgICAgbUhEQ1AuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBpZiAobVNlc3Npb25JRCAhPSAwKSB7Ci0gICAgICAgIG1OZXRTZXNzaW9uLT5kZXN0cm95U2Vzc2lvbihtU2Vzc2lvbklEKTsKLSAgICAgICAgbVNlc3Npb25JRCA9IDA7Ci0gICAgfQotCi0gICAgQUxPR0koIldlJ3JlIHN0b3BwZWQuIik7Ci0gICAgbVN0YXRlID0gU1RPUFBFRDsKLQotICAgIHN0YXR1c190IGVyciA9IE9LOwotCi0gICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKLSAgICByZXNwb25zZS0+cG9zdFJlcGx5KG1TdG9wUmVwbHlJRCk7Ci19Ci0KLXN0YXR1c190IFdpZmlEaXNwbGF5U291cmNlOjpvbkdldFBhcmFtZXRlclJlcXVlc3QoCi0gICAgICAgIGludDMyX3Qgc2Vzc2lvbklELAotICAgICAgICBpbnQzMl90IGNzZXEsCi0gICAgICAgIGNvbnN0IHNwPFBhcnNlZE1lc3NhZ2U+ICZkYXRhKSB7Ci0gICAgaW50MzJfdCBwbGF5YmFja1Nlc3Npb25JRDsKLSAgICBzcDxQbGF5YmFja1Nlc3Npb24+IHBsYXliYWNrU2Vzc2lvbiA9Ci0gICAgICAgIGZpbmRQbGF5YmFja1Nlc3Npb24oZGF0YSwgJnBsYXliYWNrU2Vzc2lvbklEKTsKLQotICAgIGlmIChwbGF5YmFja1Nlc3Npb24gPT0gTlVMTCkgewotICAgICAgICBzZW5kRXJyb3JSZXNwb25zZShzZXNzaW9uSUQsICI0NTQgU2Vzc2lvbiBOb3QgRm91bmQiLCBjc2VxKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBwbGF5YmFja1Nlc3Npb24tPnVwZGF0ZUxpdmVuZXNzKCk7Ci0KLSAgICBBU3RyaW5nIHJlc3BvbnNlID0gIlJUU1AvMS4wIDIwMCBPS1xyXG4iOwotICAgIEFwcGVuZENvbW1vblJlc3BvbnNlKCZyZXNwb25zZSwgY3NlcSwgcGxheWJhY2tTZXNzaW9uSUQpOwotICAgIHJlc3BvbnNlLmFwcGVuZCgiXHJcbiIpOwotCi0gICAgc3RhdHVzX3QgZXJyID0gbU5ldFNlc3Npb24tPnNlbmRSZXF1ZXN0KHNlc3Npb25JRCwgcmVzcG9uc2UuY19zdHIoKSk7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgV2lmaURpc3BsYXlTb3VyY2U6Om9uU2V0UGFyYW1ldGVyUmVxdWVzdCgKLSAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsCi0gICAgICAgIGludDMyX3QgY3NlcSwKLSAgICAgICAgY29uc3Qgc3A8UGFyc2VkTWVzc2FnZT4gJmRhdGEpIHsKLSAgICBpbnQzMl90IHBsYXliYWNrU2Vzc2lvbklEOwotICAgIHNwPFBsYXliYWNrU2Vzc2lvbj4gcGxheWJhY2tTZXNzaW9uID0KLSAgICAgICAgZmluZFBsYXliYWNrU2Vzc2lvbihkYXRhLCAmcGxheWJhY2tTZXNzaW9uSUQpOwotCi0gICAgaWYgKHBsYXliYWNrU2Vzc2lvbiA9PSBOVUxMKSB7Ci0gICAgICAgIHNlbmRFcnJvclJlc3BvbnNlKHNlc3Npb25JRCwgIjQ1NCBTZXNzaW9uIE5vdCBGb3VuZCIsIGNzZXEpOwotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGlmIChzdHJzdHIoZGF0YS0+Z2V0Q29udGVudCgpLCAid2ZkX2lkcl9yZXF1ZXN0XHJcbiIpKSB7Ci0gICAgICAgIHBsYXliYWNrU2Vzc2lvbi0+cmVxdWVzdElEUkZyYW1lKCk7Ci0gICAgfQotCi0gICAgcGxheWJhY2tTZXNzaW9uLT51cGRhdGVMaXZlbmVzcygpOwotCi0gICAgQVN0cmluZyByZXNwb25zZSA9ICJSVFNQLzEuMCAyMDAgT0tcclxuIjsKLSAgICBBcHBlbmRDb21tb25SZXNwb25zZSgmcmVzcG9uc2UsIGNzZXEsIHBsYXliYWNrU2Vzc2lvbklEKTsKLSAgICByZXNwb25zZS5hcHBlbmQoIlxyXG4iKTsKLQotICAgIHN0YXR1c190IGVyciA9IG1OZXRTZXNzaW9uLT5zZW5kUmVxdWVzdChzZXNzaW9uSUQsIHJlc3BvbnNlLmNfc3RyKCkpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBXaWZpRGlzcGxheVNvdXJjZTo6QXBwZW5kQ29tbW9uUmVzcG9uc2UoCi0gICAgICAgIEFTdHJpbmcgKnJlc3BvbnNlLCBpbnQzMl90IGNzZXEsIGludDMyX3QgcGxheWJhY2tTZXNzaW9uSUQpIHsKLSAgICB0aW1lX3Qgbm93ID0gdGltZShOVUxMKTsKLSAgICBzdHJ1Y3QgdG0gKm5vdzIgPSBnbXRpbWUoJm5vdyk7Ci0gICAgY2hhciBidWZbMTI4XTsKLSAgICBzdHJmdGltZShidWYsIHNpemVvZihidWYpLCAiJWEsICVkICViICVZICVIOiVNOiVTICV6Iiwgbm93Mik7Ci0KLSAgICByZXNwb25zZS0+YXBwZW5kKCJEYXRlOiAiKTsKLSAgICByZXNwb25zZS0+YXBwZW5kKGJ1Zik7Ci0gICAgcmVzcG9uc2UtPmFwcGVuZCgiXHJcbiIpOwotCi0gICAgcmVzcG9uc2UtPmFwcGVuZChBU3RyaW5nUHJpbnRmKCJTZXJ2ZXI6ICVzXHJcbiIsIHNVc2VyQWdlbnQuY19zdHIoKSkpOwotCi0gICAgaWYgKGNzZXEgPj0gMCkgewotICAgICAgICByZXNwb25zZS0+YXBwZW5kKEFTdHJpbmdQcmludGYoIkNTZXE6ICVkXHJcbiIsIGNzZXEpKTsKLSAgICB9Ci0KLSAgICBpZiAocGxheWJhY2tTZXNzaW9uSUQgPj0gMGxsKSB7Ci0gICAgICAgIHJlc3BvbnNlLT5hcHBlbmQoCi0gICAgICAgICAgICAgICAgQVN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgICAgICAgICAgIlNlc3Npb246ICVkO3RpbWVvdXQ9JWxsZFxyXG4iLAotICAgICAgICAgICAgICAgICAgICBwbGF5YmFja1Nlc3Npb25JRCwga1BsYXliYWNrU2Vzc2lvblRpbWVvdXRTZWNzKSk7Ci0gICAgfQotfQotCi12b2lkIFdpZmlEaXNwbGF5U291cmNlOjpzZW5kRXJyb3JSZXNwb25zZSgKLSAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsCi0gICAgICAgIGNvbnN0IGNoYXIgKmVycm9yRGV0YWlsLAotICAgICAgICBpbnQzMl90IGNzZXEpIHsKLSAgICBBU3RyaW5nIHJlc3BvbnNlOwotICAgIHJlc3BvbnNlLmFwcGVuZCgiUlRTUC8xLjAgIik7Ci0gICAgcmVzcG9uc2UuYXBwZW5kKGVycm9yRGV0YWlsKTsKLSAgICByZXNwb25zZS5hcHBlbmQoIlxyXG4iKTsKLQotICAgIEFwcGVuZENvbW1vblJlc3BvbnNlKCZyZXNwb25zZSwgY3NlcSk7Ci0KLSAgICByZXNwb25zZS5hcHBlbmQoIlxyXG4iKTsKLQotICAgIG1OZXRTZXNzaW9uLT5zZW5kUmVxdWVzdChzZXNzaW9uSUQsIHJlc3BvbnNlLmNfc3RyKCkpOwotfQotCi1pbnQzMl90IFdpZmlEaXNwbGF5U291cmNlOjptYWtlVW5pcXVlUGxheWJhY2tTZXNzaW9uSUQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHJhbmQoKTsKLX0KLQotc3A8V2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbj4gV2lmaURpc3BsYXlTb3VyY2U6OmZpbmRQbGF5YmFja1Nlc3Npb24oCi0gICAgICAgIGNvbnN0IHNwPFBhcnNlZE1lc3NhZ2U+ICZkYXRhLCBpbnQzMl90ICpwbGF5YmFja1Nlc3Npb25JRCkgY29uc3QgewotICAgIGlmICghZGF0YS0+ZmluZEludDMyKCJzZXNzaW9uIiwgcGxheWJhY2tTZXNzaW9uSUQpKSB7Ci0gICAgICAgIC8vIFhYWCB0aGUgb2xkZXIgZG9uZ2xlcyBkbyBub3QgYWx3YXlzIGluY2x1ZGUgYSAiU2Vzc2lvbjoiIGhlYWRlci4KLSAgICAgICAgKnBsYXliYWNrU2Vzc2lvbklEID0gbUNsaWVudEluZm8ubVBsYXliYWNrU2Vzc2lvbklEOwotICAgICAgICByZXR1cm4gbUNsaWVudEluZm8ubVBsYXliYWNrU2Vzc2lvbjsKLSAgICB9Ci0KLSAgICBpZiAoKnBsYXliYWNrU2Vzc2lvbklEICE9IG1DbGllbnRJbmZvLm1QbGF5YmFja1Nlc3Npb25JRCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gbUNsaWVudEluZm8ubVBsYXliYWNrU2Vzc2lvbjsKLX0KLQotdm9pZCBXaWZpRGlzcGxheVNvdXJjZTo6ZGlzY29ubmVjdENsaWVudEFzeW5jKCkgewotICAgIEFMT0dWKCJkaXNjb25uZWN0Q2xpZW50Iik7Ci0KLSAgICBpZiAobUNsaWVudEluZm8ubVBsYXliYWNrU2Vzc2lvbiA9PSBOVUxMKSB7Ci0gICAgICAgIGRpc2Nvbm5lY3RDbGllbnQyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobUNsaWVudEluZm8ubVBsYXliYWNrU2Vzc2lvbiAhPSBOVUxMKSB7Ci0gICAgICAgIEFMT0dWKCJEZXN0cm95aW5nIFBsYXliYWNrU2Vzc2lvbiIpOwotICAgICAgICBtQ2xpZW50SW5mby5tUGxheWJhY2tTZXNzaW9uLT5kZXN0cm95QXN5bmMoKTsKLSAgICB9Ci19Ci0KLXZvaWQgV2lmaURpc3BsYXlTb3VyY2U6OmRpc2Nvbm5lY3RDbGllbnQyKCkgewotICAgIEFMT0dWKCJkaXNjb25uZWN0Q2xpZW50MiIpOwotCi0gICAgaWYgKG1DbGllbnRJbmZvLm1QbGF5YmFja1Nlc3Npb24gIT0gTlVMTCkgewotICAgICAgICBsb29wZXIoKS0+dW5yZWdpc3RlckhhbmRsZXIobUNsaWVudEluZm8ubVBsYXliYWNrU2Vzc2lvbi0+aWQoKSk7Ci0gICAgICAgIG1DbGllbnRJbmZvLm1QbGF5YmFja1Nlc3Npb24uY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBpZiAobUNsaWVudFNlc3Npb25JRCAhPSAwKSB7Ci0gICAgICAgIG1OZXRTZXNzaW9uLT5kZXN0cm95U2Vzc2lvbihtQ2xpZW50U2Vzc2lvbklEKTsKLSAgICAgICAgbUNsaWVudFNlc3Npb25JRCA9IDA7Ci0gICAgfQotCi0gICAgbUNsaWVudC0+b25EaXNwbGF5RGlzY29ubmVjdGVkKCk7Ci0KLSAgICBmaW5pc2hTdG9wQWZ0ZXJEaXNjb25uZWN0aW5nQ2xpZW50KCk7Ci19Ci0KLXN0cnVjdCBXaWZpRGlzcGxheVNvdXJjZTo6SERDUE9ic2VydmVyIDogcHVibGljIEJuSERDUE9ic2VydmVyIHsKLSAgICBleHBsaWNpdCBIRENQT2JzZXJ2ZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpOwotCi0gICAgdmlydHVhbCB2b2lkIG5vdGlmeSgKLSAgICAgICAgICAgIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICpvYmopOwotCi1wcml2YXRlOgotICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5OwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSERDUE9ic2VydmVyKTsKLX07Ci0KLVdpZmlEaXNwbGF5U291cmNlOjpIRENQT2JzZXJ2ZXI6OkhEQ1BPYnNlcnZlcigKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpCi0gICAgOiBtTm90aWZ5KG5vdGlmeSkgewotfQotCi12b2lkIFdpZmlEaXNwbGF5U291cmNlOjpIRENQT2JzZXJ2ZXI6Om5vdGlmeSgKLSAgICAgICAgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKiAvKiBvYmogKi8pIHsKLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigibXNnIiwgbXNnKTsKLSAgICBub3RpZnktPnNldEludDMyKCJleHQxIiwgZXh0MSk7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigiZXh0MiIsIGV4dDIpOwotICAgIG5vdGlmeS0+cG9zdCgpOwotfQotCi1zdGF0dXNfdCBXaWZpRGlzcGxheVNvdXJjZTo6bWFrZUhEQ1AoKSB7Ci0gICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwotICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5wbGF5ZXIiKSk7Ci0KLSAgICBzcDxJTWVkaWFQbGF5ZXJTZXJ2aWNlPiBzZXJ2aWNlID0KLSAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhUGxheWVyU2VydmljZT4oYmluZGVyKTsKLQotICAgIENIRUNLKHNlcnZpY2UgIT0gTlVMTCk7Ci0KLSAgICBtSERDUCA9IHNlcnZpY2UtPm1ha2VIRENQKHRydWUgLyogY3JlYXRlRW5jcnlwdGlvbk1vZHVsZSAqLyk7Ci0KLSAgICBpZiAobUhEQ1AgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdEhEQ1BOb3RpZnksIHRoaXMpOwotICAgIG1IRENQT2JzZXJ2ZXIgPSBuZXcgSERDUE9ic2VydmVyKG5vdGlmeSk7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBtSERDUC0+c2V0T2JzZXJ2ZXIobUhEQ1BPYnNlcnZlcik7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IEhEQ1Agb2JzZXJ2ZXIuIik7Ci0KLSAgICAgICAgbUhEQ1BPYnNlcnZlci5jbGVhcigpOwotICAgICAgICBtSERDUC5jbGVhcigpOwotCi0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgQUxPR0koIkluaXRpYXRpbmcgSERDUCBuZWdvdGlhdGlvbiB3LyBob3N0ICVzOiVkIiwKLSAgICAgICAgICAgIG1DbGllbnRJbmZvLm1SZW1vdGVJUC5jX3N0cigpLCBtSERDUFBvcnQpOwotCi0gICAgZXJyID0gbUhEQ1AtPmluaXRBc3luYyhtQ2xpZW50SW5mby5tUmVtb3RlSVAuY19zdHIoKSwgbUhEQ1BQb3J0KTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvV2lmaURpc3BsYXlTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvV2lmaURpc3BsYXlTb3VyY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI1YTY3NS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1dpZmlEaXNwbGF5U291cmNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDEyLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBXSUZJX0RJU1BMQVlfU09VUkNFX0hfCi0KLSNkZWZpbmUgV0lGSV9ESVNQTEFZX1NPVVJDRV9IXwotCi0jaW5jbHVkZSAiVmlkZW9Gb3JtYXRzLmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTmV0d29ya1Nlc3Npb24uaD4KLQotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLQotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IEFSZXBseVRva2VuOwotc3RydWN0IElIRENQOwotY2xhc3MgSVJlbW90ZURpc3BsYXlDbGllbnQ7Ci1zdHJ1Y3QgUGFyc2VkTWVzc2FnZTsKLQotLy8gUmVwcmVzZW50cyB0aGUgUlRTUCBzZXJ2ZXIgYWN0aW5nIGFzIGEgd2lmaSBkaXNwbGF5IHNvdXJjZS4KLS8vIE1hbmFnZXMgaW5jb21pbmcgY29ubmVjdGlvbnMsIHNldHMgdXAgUGxheWJhY2sgc2Vzc2lvbnMgYXMgbmVjZXNzYXJ5Lgotc3RydWN0IFdpZmlEaXNwbGF5U291cmNlIDogcHVibGljIEFIYW5kbGVyIHsKLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQga1dpZmlEaXNwbGF5RGVmYXVsdFBvcnQgPSA3MjM2OwotCi0gICAgV2lmaURpc3BsYXlTb3VyY2UoCi0gICAgICAgICAgICBjb25zdCBTdHJpbmcxNiAmb3BQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgIGNvbnN0IHNwPEFOZXR3b3JrU2Vzc2lvbj4gJm5ldFNlc3Npb24sCi0gICAgICAgICAgICBjb25zdCBzcDxJUmVtb3RlRGlzcGxheUNsaWVudD4gJmNsaWVudCwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGggPSBOVUxMKTsKLQotICAgIHN0YXR1c190IHN0YXJ0KGNvbnN0IGNoYXIgKmlmYWNlKTsKLSAgICBzdGF0dXNfdCBzdG9wKCk7Ci0KLSAgICBzdGF0dXNfdCBwYXVzZSgpOwotICAgIHN0YXR1c190IHJlc3VtZSgpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+V2lmaURpc3BsYXlTb3VyY2UoKTsKLSAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwotCi1wcml2YXRlOgotICAgIHN0cnVjdCBQbGF5YmFja1Nlc3Npb247Ci0gICAgc3RydWN0IEhEQ1BPYnNlcnZlcjsKLQotICAgIGVudW0gU3RhdGUgewotICAgICAgICBJTklUSUFMSVpFRCwKLSAgICAgICAgQVdBSVRJTkdfQ0xJRU5UX0NPTk5FQ1RJT04sCi0gICAgICAgIEFXQUlUSU5HX0NMSUVOVF9TRVRVUCwKLSAgICAgICAgQVdBSVRJTkdfQ0xJRU5UX1BMQVksCi0gICAgICAgIEFCT1VUX1RPX1BMQVksCi0gICAgICAgIFBMQVlJTkcsCi0gICAgICAgIFBMQVlJTkdfVE9fUEFVU0VELAotICAgICAgICBQQVVTRUQsCi0gICAgICAgIFBBVVNFRF9UT19QTEFZSU5HLAotICAgICAgICBBV0FJVElOR19DTElFTlRfVEVBUkRPV04sCi0gICAgICAgIFNUT1BQSU5HLAotICAgICAgICBTVE9QUEVELAotICAgIH07Ci0KLSAgICBlbnVtIHsKLSAgICAgICAga1doYXRTdGFydCwKLSAgICAgICAga1doYXRSVFNQTm90aWZ5LAotICAgICAgICBrV2hhdFN0b3AsCi0gICAgICAgIGtXaGF0UGF1c2UsCi0gICAgICAgIGtXaGF0UmVzdW1lLAotICAgICAgICBrV2hhdFJlYXBEZWFkQ2xpZW50cywKLSAgICAgICAga1doYXRQbGF5YmFja1Nlc3Npb25Ob3RpZnksCi0gICAgICAgIGtXaGF0S2VlcEFsaXZlLAotICAgICAgICBrV2hhdEhEQ1BOb3RpZnksCi0gICAgICAgIGtXaGF0RmluaXNoU3RvcDIsCi0gICAgICAgIGtXaGF0VGVhcmRvd25UcmlnZ2VyVGltZWRPdXQsCi0gICAgfTsKLQotICAgIHN0cnVjdCBSZXNwb25zZUlEIHsKLSAgICAgICAgaW50MzJfdCBtU2Vzc2lvbklEOwotICAgICAgICBpbnQzMl90IG1DU2VxOwotCi0gICAgICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFJlc3BvbnNlSUQgJm90aGVyKSBjb25zdCB7Ci0gICAgICAgICAgICByZXR1cm4gbVNlc3Npb25JRCA8IG90aGVyLm1TZXNzaW9uSUQKLSAgICAgICAgICAgICAgICB8fCAobVNlc3Npb25JRCA9PSBvdGhlci5tU2Vzc2lvbklECi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBtQ1NlcSA8IG90aGVyLm1DU2VxKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICB0eXBlZGVmIHN0YXR1c190IChXaWZpRGlzcGxheVNvdXJjZTo6KkhhbmRsZVJUU1BSZXNwb25zZUZ1bmMpKAotICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsIGNvbnN0IHNwPFBhcnNlZE1lc3NhZ2U+ICZtc2cpOwotCi0gICAgc3RhdGljIGNvbnN0IGludDY0X3Qga1JlYXBlckludGVydmFsVXMgPSAxMDAwMDAwbGw7Ci0KLSAgICAvLyBXZSByZXF1ZXN0IHRoYXQgdGhlIGRvbmdsZSBzZW5kIHVzIGEgIlRFQVJET1dOIiBpbiBvcmRlciB0bwotICAgIC8vIHBlcmZvcm0gYW4gb3JkZXJseSBzaHV0ZG93bi4gV2UncmUgd2lsbGluZyB0byB3YWl0IHVwIHRvIDIgc2VjcwotICAgIC8vIGZvciB0aGlzIG1lc3NhZ2UgdG8gYXJyaXZlLCBhZnRlciB0aGF0IHdlJ2xsIGZvcmNlIGEgZGlzY29ubmVjdAotICAgIC8vIGluc3RlYWQuCi0gICAgc3RhdGljIGNvbnN0IGludDY0X3Qga1RlYXJkb3duVHJpZ2dlclRpbWVvdVNlY3MgPSAyOwotCi0gICAgc3RhdGljIGNvbnN0IGludDY0X3Qga1BsYXliYWNrU2Vzc2lvblRpbWVvdXRTZWNzID0gMzA7Ci0KLSAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrUGxheWJhY2tTZXNzaW9uVGltZW91dFVzID0KLSAgICAgICAga1BsYXliYWNrU2Vzc2lvblRpbWVvdXRTZWNzICogMTAwMDAwMGxsOwotCi0gICAgc3RhdGljIGNvbnN0IEFTdHJpbmcgc1VzZXJBZ2VudDsKLQotICAgIFN0cmluZzE2IG1PcFBhY2thZ2VOYW1lOwotCi0gICAgU3RhdGUgbVN0YXRlOwotICAgIFZpZGVvRm9ybWF0cyBtU3VwcG9ydGVkU291cmNlVmlkZW9Gb3JtYXRzOwotICAgIHNwPEFOZXR3b3JrU2Vzc2lvbj4gbU5ldFNlc3Npb247Ci0gICAgc3A8SVJlbW90ZURpc3BsYXlDbGllbnQ+IG1DbGllbnQ7Ci0gICAgQVN0cmluZyBtTWVkaWFQYXRoOwotICAgIHN0cnVjdCBpbl9hZGRyIG1JbnRlcmZhY2VBZGRyOwotICAgIGludDMyX3QgbVNlc3Npb25JRDsKLQotICAgIHNwPEFSZXBseVRva2VuPiBtU3RvcFJlcGx5SUQ7Ci0KLSAgICBBU3RyaW5nIG1XZmRDbGllbnRSdHBQb3J0czsKLSAgICBpbnQzMl90IG1DaG9zZW5SVFBQb3J0OyAgLy8gZXh0cmFjdGVkIGZyb20gIndmZF9jbGllbnRfcnRwX3BvcnRzIgotCi0gICAgYm9vbCBtU2lua1N1cHBvcnRzVmlkZW87Ci0gICAgVmlkZW9Gb3JtYXRzIG1TdXBwb3J0ZWRTaW5rVmlkZW9Gb3JtYXRzOwotCi0gICAgVmlkZW9Gb3JtYXRzOjpSZXNvbHV0aW9uVHlwZSBtQ2hvc2VuVmlkZW9SZXNvbHV0aW9uVHlwZTsKLSAgICBzaXplX3QgbUNob3NlblZpZGVvUmVzb2x1dGlvbkluZGV4OwotICAgIFZpZGVvRm9ybWF0czo6UHJvZmlsZVR5cGUgbUNob3NlblZpZGVvUHJvZmlsZTsKLSAgICBWaWRlb0Zvcm1hdHM6OkxldmVsVHlwZSBtQ2hvc2VuVmlkZW9MZXZlbDsKLQotICAgIGJvb2wgbVNpbmtTdXBwb3J0c0F1ZGlvOwotCi0gICAgYm9vbCBtVXNpbmdQQ01BdWRpbzsKLSAgICBpbnQzMl90IG1DbGllbnRTZXNzaW9uSUQ7Ci0KLSAgICBzdHJ1Y3QgQ2xpZW50SW5mbyB7Ci0gICAgICAgIEFTdHJpbmcgbVJlbW90ZUlQOwotICAgICAgICBBU3RyaW5nIG1Mb2NhbElQOwotICAgICAgICBpbnQzMl90IG1Mb2NhbFBvcnQ7Ci0gICAgICAgIGludDMyX3QgbVBsYXliYWNrU2Vzc2lvbklEOwotICAgICAgICBzcDxQbGF5YmFja1Nlc3Npb24+IG1QbGF5YmFja1Nlc3Npb247Ci0gICAgfTsKLSAgICBDbGllbnRJbmZvIG1DbGllbnRJbmZvOwotCi0gICAgYm9vbCBtUmVhcGVyUGVuZGluZzsKLQotICAgIGludDMyX3QgbU5leHRDU2VxOwotCi0gICAgS2V5ZWRWZWN0b3I8UmVzcG9uc2VJRCwgSGFuZGxlUlRTUFJlc3BvbnNlRnVuYz4gbVJlc3BvbnNlSGFuZGxlcnM7Ci0KLSAgICAvLyBIRENQIHNwZWNpZmljIHNlY3Rpb24gPj4+PgotICAgIGJvb2wgbVVzaW5nSERDUDsKLSAgICBib29sIG1Jc0hEQ1AyXzA7Ci0gICAgaW50MzJfdCBtSERDUFBvcnQ7Ci0gICAgc3A8SUhEQ1A+IG1IRENQOwotICAgIHNwPEhEQ1BPYnNlcnZlcj4gbUhEQ1BPYnNlcnZlcjsKLQotICAgIGJvb2wgbUhEQ1BJbml0aWFsaXphdGlvbkNvbXBsZXRlOwotICAgIGJvb2wgbVNldHVwVHJpZ2dlckRlZmVycmVkOwotCi0gICAgYm9vbCBtUGxheWJhY2tTZXNzaW9uRXN0YWJsaXNoZWQ7Ci0KLSAgICBzdGF0dXNfdCBtYWtlSERDUCgpOwotICAgIC8vIDw8PDwgSERDUCBzcGVjaWZpYyBzZWN0aW9uCi0KLSAgICBzdGF0dXNfdCBzZW5kTTEoaW50MzJfdCBzZXNzaW9uSUQpOwotICAgIHN0YXR1c190IHNlbmRNMyhpbnQzMl90IHNlc3Npb25JRCk7Ci0gICAgc3RhdHVzX3Qgc2VuZE00KGludDMyX3Qgc2Vzc2lvbklEKTsKLQotICAgIGVudW0gVHJpZ2dlclR5cGUgewotICAgICAgICBUUklHR0VSX1NFVFVQLAotICAgICAgICBUUklHR0VSX1RFQVJET1dOLAotICAgICAgICBUUklHR0VSX1BBVVNFLAotICAgICAgICBUUklHR0VSX1BMQVksCi0gICAgfTsKLQotICAgIC8vIE01Ci0gICAgc3RhdHVzX3Qgc2VuZFRyaWdnZXIoaW50MzJfdCBzZXNzaW9uSUQsIFRyaWdnZXJUeXBlIHRyaWdnZXJUeXBlKTsKLQotICAgIHN0YXR1c190IHNlbmRNMTYoaW50MzJfdCBzZXNzaW9uSUQpOwotCi0gICAgc3RhdHVzX3Qgb25SZWNlaXZlTTFSZXNwb25zZSgKLSAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklELCBjb25zdCBzcDxQYXJzZWRNZXNzYWdlPiAmbXNnKTsKLQotICAgIHN0YXR1c190IG9uUmVjZWl2ZU0zUmVzcG9uc2UoCi0gICAgICAgICAgICBpbnQzMl90IHNlc3Npb25JRCwgY29uc3Qgc3A8UGFyc2VkTWVzc2FnZT4gJm1zZyk7Ci0KLSAgICBzdGF0dXNfdCBvblJlY2VpdmVNNFJlc3BvbnNlKAotICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsIGNvbnN0IHNwPFBhcnNlZE1lc3NhZ2U+ICZtc2cpOwotCi0gICAgc3RhdHVzX3Qgb25SZWNlaXZlTTVSZXNwb25zZSgKLSAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklELCBjb25zdCBzcDxQYXJzZWRNZXNzYWdlPiAmbXNnKTsKLQotICAgIHN0YXR1c190IG9uUmVjZWl2ZU0xNlJlc3BvbnNlKAotICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsIGNvbnN0IHNwPFBhcnNlZE1lc3NhZ2U+ICZtc2cpOwotCi0gICAgdm9pZCByZWdpc3RlclJlc3BvbnNlSGFuZGxlcigKLSAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklELCBpbnQzMl90IGNzZXEsIEhhbmRsZVJUU1BSZXNwb25zZUZ1bmMgZnVuYyk7Ci0KLSAgICBzdGF0dXNfdCBvblJlY2VpdmVDbGllbnREYXRhKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKLQotICAgIHN0YXR1c190IG9uT3B0aW9uc1JlcXVlc3QoCi0gICAgICAgICAgICBpbnQzMl90IHNlc3Npb25JRCwKLSAgICAgICAgICAgIGludDMyX3QgY3NlcSwKLSAgICAgICAgICAgIGNvbnN0IHNwPFBhcnNlZE1lc3NhZ2U+ICZkYXRhKTsKLQotICAgIHN0YXR1c190IG9uU2V0dXBSZXF1ZXN0KAotICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsCi0gICAgICAgICAgICBpbnQzMl90IGNzZXEsCi0gICAgICAgICAgICBjb25zdCBzcDxQYXJzZWRNZXNzYWdlPiAmZGF0YSk7Ci0KLSAgICBzdGF0dXNfdCBvblBsYXlSZXF1ZXN0KAotICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsCi0gICAgICAgICAgICBpbnQzMl90IGNzZXEsCi0gICAgICAgICAgICBjb25zdCBzcDxQYXJzZWRNZXNzYWdlPiAmZGF0YSk7Ci0KLSAgICBzdGF0dXNfdCBvblBhdXNlUmVxdWVzdCgKLSAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklELAotICAgICAgICAgICAgaW50MzJfdCBjc2VxLAotICAgICAgICAgICAgY29uc3Qgc3A8UGFyc2VkTWVzc2FnZT4gJmRhdGEpOwotCi0gICAgc3RhdHVzX3Qgb25UZWFyZG93blJlcXVlc3QoCi0gICAgICAgICAgICBpbnQzMl90IHNlc3Npb25JRCwKLSAgICAgICAgICAgIGludDMyX3QgY3NlcSwKLSAgICAgICAgICAgIGNvbnN0IHNwPFBhcnNlZE1lc3NhZ2U+ICZkYXRhKTsKLQotICAgIHN0YXR1c190IG9uR2V0UGFyYW1ldGVyUmVxdWVzdCgKLSAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklELAotICAgICAgICAgICAgaW50MzJfdCBjc2VxLAotICAgICAgICAgICAgY29uc3Qgc3A8UGFyc2VkTWVzc2FnZT4gJmRhdGEpOwotCi0gICAgc3RhdHVzX3Qgb25TZXRQYXJhbWV0ZXJSZXF1ZXN0KAotICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsCi0gICAgICAgICAgICBpbnQzMl90IGNzZXEsCi0gICAgICAgICAgICBjb25zdCBzcDxQYXJzZWRNZXNzYWdlPiAmZGF0YSk7Ci0KLSAgICB2b2lkIHNlbmRFcnJvclJlc3BvbnNlKAotICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsCi0gICAgICAgICAgICBjb25zdCBjaGFyICplcnJvckRldGFpbCwKLSAgICAgICAgICAgIGludDMyX3QgY3NlcSk7Ci0KLSAgICBzdGF0aWMgdm9pZCBBcHBlbmRDb21tb25SZXNwb25zZSgKLSAgICAgICAgICAgIEFTdHJpbmcgKnJlc3BvbnNlLCBpbnQzMl90IGNzZXEsIGludDMyX3QgcGxheWJhY2tTZXNzaW9uSUQgPSAtMWxsKTsKLQotICAgIHZvaWQgc2NoZWR1bGVSZWFwZXIoKTsKLSAgICB2b2lkIHNjaGVkdWxlS2VlcEFsaXZlKGludDMyX3Qgc2Vzc2lvbklEKTsKLQotICAgIGludDMyX3QgbWFrZVVuaXF1ZVBsYXliYWNrU2Vzc2lvbklEKCkgY29uc3Q7Ci0KLSAgICBzcDxQbGF5YmFja1Nlc3Npb24+IGZpbmRQbGF5YmFja1Nlc3Npb24oCi0gICAgICAgICAgICBjb25zdCBzcDxQYXJzZWRNZXNzYWdlPiAmZGF0YSwgaW50MzJfdCAqcGxheWJhY2tTZXNzaW9uSUQpIGNvbnN0OwotCi0gICAgdm9pZCBmaW5pc2hTdG9wKCk7Ci0gICAgdm9pZCBkaXNjb25uZWN0Q2xpZW50QXN5bmMoKTsKLSAgICB2b2lkIGRpc2Nvbm5lY3RDbGllbnQyKCk7Ci0gICAgdm9pZCBmaW5pc2hTdG9wQWZ0ZXJEaXNjb25uZWN0aW5nQ2xpZW50KCk7Ci0gICAgdm9pZCBmaW5pc2hTdG9wMigpOwotCi0gICAgdm9pZCBmaW5pc2hQbGF5KCk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhXaWZpRGlzcGxheVNvdXJjZSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIFdJRklfRElTUExBWV9TT1VSQ0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL0FuZHJvaWQuYnAKaW5kZXggMzUwNzI4NC4uYTRmYTM0MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL0FuZHJvaWQuYnAKQEAgLTE1LDEwICsxNSw3IEBACiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliZXhwYXQiLAotICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teF91dGlscyIsCiAgICAgXSwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL0FuZHJvaWQuYnAgYi9tZWRpYS9tdHAvQW5kcm9pZC5icAppbmRleCA1ZDVhZTQ5Li4yY2Y5YjgyIDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvQW5kcm9pZC5icAorKysgYi9tZWRpYS9tdHAvQW5kcm9pZC5icApAQCAtMTcsMTMgKzE3LDE0IEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYm10cCIsCiAgICAgc3JjczogWwotICAgICAgICAiQXN5bmNJTy5jcHAiLAogICAgICAgICAiTXRwRGF0YVBhY2tldC5jcHAiLAogICAgICAgICAiTXRwRGVidWcuY3BwIiwKKyAgICAgICAgIk10cERlc2NyaXB0b3JzLmNwcCIsCiAgICAgICAgICJNdHBEZXZIYW5kbGUuY3BwIiwKICAgICAgICAgIk10cERldmljZS5jcHAiLAogICAgICAgICAiTXRwRGV2aWNlSW5mby5jcHAiLAogICAgICAgICAiTXRwRXZlbnRQYWNrZXQuY3BwIiwKKyAgICAgICAgIk10cEZmc0NvbXBhdEhhbmRsZS5jcHAiLAogICAgICAgICAiTXRwRmZzSGFuZGxlLmNwcCIsCiAgICAgICAgICJNdHBPYmplY3RJbmZvLmNwcCIsCiAgICAgICAgICJNdHBQYWNrZXQuY3BwIiwKQEAgLTM1LDYgKzM2LDcgQEAKICAgICAgICAgIk10cFN0b3JhZ2VJbmZvLmNwcCIsCiAgICAgICAgICJNdHBTdHJpbmdCdWZmZXIuY3BwIiwKICAgICAgICAgIk10cFV0aWxzLmNwcCIsCisgICAgICAgICJQb3NpeEFzeW5jSU8uY3BwIiwKICAgICBdLAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLiJdLAogICAgIGNmbGFnczogWwpAQCAtNDUsOCArNDcsOCBAQAogICAgICAgICAiLVdlcnJvciIsCiAgICAgXSwKICAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXN5bmNpbyIsCiAgICAgICAgICJsaWJiYXNlIiwKLSAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJ1c2Job3N0IiwKICAgICBdLApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL0FzeW5jSU8uY3BwIGIvbWVkaWEvbXRwL0FzeW5jSU8uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmIwN2RjLi4wMDAwMDAwCi0tLSBhL21lZGlhL210cC9Bc3luY0lPLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8Y29uZGl0aW9uX3ZhcmlhYmxlPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxtdXRleD4KLSNpbmNsdWRlIDxxdWV1ZT4KLQotI2luY2x1ZGUgIkFzeW5jSU8uaCIKLQotbmFtZXNwYWNlIHsKLQotdm9pZCByZWFkX2Z1bmMoc3RydWN0IGFpb2NiICphaW9jYnApIHsKLSAgICBhaW9jYnAtPnJldCA9IFRFTVBfRkFJTFVSRV9SRVRSWShwcmVhZChhaW9jYnAtPmFpb19maWxkZXMsCi0gICAgICAgICAgICAgICAgYWlvY2JwLT5haW9fYnVmLCBhaW9jYnAtPmFpb19uYnl0ZXMsIGFpb2NicC0+YWlvX29mZnNldCkpOwotICAgIGlmIChhaW9jYnAtPnJldCA9PSAtMSkgYWlvY2JwLT5lcnJvciA9IGVycm5vOwotfQotCi12b2lkIHdyaXRlX2Z1bmMoc3RydWN0IGFpb2NiICphaW9jYnApIHsKLSAgICBhaW9jYnAtPnJldCA9IFRFTVBfRkFJTFVSRV9SRVRSWShwd3JpdGUoYWlvY2JwLT5haW9fZmlsZGVzLAotICAgICAgICAgICAgICAgIGFpb2NicC0+YWlvX2J1ZiwgYWlvY2JwLT5haW9fbmJ5dGVzLCBhaW9jYnAtPmFpb19vZmZzZXQpKTsKLSAgICBpZiAoYWlvY2JwLT5yZXQgPT0gLTEpIGFpb2NicC0+ZXJyb3IgPSBlcnJubzsKLX0KLQotdm9pZCBzcGxpY2VfcmVhZF9mdW5jKHN0cnVjdCBhaW9jYiAqYWlvY2JwKSB7Ci0gICAgbG9mZl90IGxvbmdfb2Zmc2V0ID0gYWlvY2JwLT5haW9fb2Zmc2V0OwotICAgIGFpb2NicC0+cmV0ID0gVEVNUF9GQUlMVVJFX1JFVFJZKHNwbGljZShhaW9jYnAtPmFpb19maWxkZXMsCi0gICAgICAgICAgICAgICAgJmxvbmdfb2Zmc2V0LCBhaW9jYnAtPmFpb19zaW5rLAotICAgICAgICAgICAgICAgIE5VTEwsIGFpb2NicC0+YWlvX25ieXRlcywgMCkpOwotICAgIGlmIChhaW9jYnAtPnJldCA9PSAtMSkgYWlvY2JwLT5lcnJvciA9IGVycm5vOwotfQotCi12b2lkIHNwbGljZV93cml0ZV9mdW5jKHN0cnVjdCBhaW9jYiAqYWlvY2JwKSB7Ci0gICAgbG9mZl90IGxvbmdfb2Zmc2V0ID0gYWlvY2JwLT5haW9fb2Zmc2V0OwotICAgIGFpb2NicC0+cmV0ID0gVEVNUF9GQUlMVVJFX1JFVFJZKHNwbGljZShhaW9jYnAtPmFpb19maWxkZXMsIE5VTEwsCi0gICAgICAgICAgICAgICAgYWlvY2JwLT5haW9fc2luaywgJmxvbmdfb2Zmc2V0LAotICAgICAgICAgICAgICAgIGFpb2NicC0+YWlvX25ieXRlcywgMCkpOwotICAgIGlmIChhaW9jYnAtPnJldCA9PSAtMSkgYWlvY2JwLT5lcnJvciA9IGVycm5vOwotfQotCi1zdGQ6OnF1ZXVlPHN0ZDo6dW5pcXVlX3B0cjxzdHJ1Y3QgYWlvY2I+PiBxdWV1ZTsKLXN0ZDo6bXV0ZXggcXVldWVfbG9jazsKLXN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIHF1ZXVlX2NvbmQ7Ci1zdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSB3cml0ZV9jb25kOwotaW50IGRvbmUgPSAxOwotdm9pZCBzcGxpY2Vfd3JpdGVfcG9vbF9mdW5jKGludCkgewotICAgIHdoaWxlKDEpIHsKLSAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsayhxdWV1ZV9sb2NrKTsKLSAgICAgICAgcXVldWVfY29uZC53YWl0KGxrLCBbXXtyZXR1cm4gIXF1ZXVlLmVtcHR5KCkgfHwgZG9uZTt9KTsKLSAgICAgICAgaWYgKHF1ZXVlLmVtcHR5KCkgJiYgZG9uZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxzdHJ1Y3QgYWlvY2I+IGFpb2NicCA9IHN0ZDo6bW92ZShxdWV1ZS5mcm9udCgpKTsKLSAgICAgICAgcXVldWUucG9wKCk7Ci0gICAgICAgIGxrLnVubG9jaygpOwotICAgICAgICB3cml0ZV9jb25kLm5vdGlmeV9vbmUoKTsKLSAgICAgICAgc3BsaWNlX3dyaXRlX2Z1bmMoYWlvY2JwLmdldCgpKTsKLSAgICAgICAgY2xvc2UoYWlvY2JwLT5haW9fZmlsZGVzKTsKLSAgICB9Ci19Ci0KLXZvaWQgd3JpdGVfcG9vbF9mdW5jKGludCkgewotICAgIHdoaWxlKDEpIHsKLSAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsayhxdWV1ZV9sb2NrKTsKLSAgICAgICAgcXVldWVfY29uZC53YWl0KGxrLCBbXXtyZXR1cm4gIXF1ZXVlLmVtcHR5KCkgfHwgZG9uZTt9KTsKLSAgICAgICAgaWYgKHF1ZXVlLmVtcHR5KCkgJiYgZG9uZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxzdHJ1Y3QgYWlvY2I+IGFpb2NicCA9IHN0ZDo6bW92ZShxdWV1ZS5mcm9udCgpKTsKLSAgICAgICAgcXVldWUucG9wKCk7Ci0gICAgICAgIGxrLnVubG9jaygpOwotICAgICAgICB3cml0ZV9jb25kLm5vdGlmeV9vbmUoKTsKLSAgICAgICAgYWlvY2JwLT5yZXQgPSBURU1QX0ZBSUxVUkVfUkVUUlkocHdyaXRlKGFpb2NicC0+YWlvX2ZpbGRlcywKLSAgICAgICAgICAgICAgICAgICAgYWlvY2JwLT5haW9fcG9vbF9idWYuZ2V0KCksIGFpb2NicC0+YWlvX25ieXRlcywgYWlvY2JwLT5haW9fb2Zmc2V0KSk7Ci0gICAgICAgIGlmIChhaW9jYnAtPnJldCA9PSAtMSkgYWlvY2JwLT5lcnJvciA9IGVycm5vOwotICAgIH0KLX0KLQotY29uc3RleHByIGludCBOVU1fVEhSRUFEUyA9IDE7Ci1jb25zdGV4cHIgaW50IE1BWF9RVUVVRV9TSVpFID0gMTA7Ci1zdGQ6OnRocmVhZCBwb29sW05VTV9USFJFQURTXTsKLQotfSAvLyBlbmQgYW5vbnltb3VzIG5hbWVzcGFjZQotCi1haW9jYjo6fmFpb2NiKCkgewotICAgIENIRUNLKCF0aHJlYWQuam9pbmFibGUoKSk7Ci19Ci0KLXZvaWQgYWlvX3Bvb2xfaW5pdCh2b2lkKGYpKGludCkpIHsKLSAgICBDSEVDSyhkb25lID09IDEpOwotICAgIGRvbmUgPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1RIUkVBRFM7IGkrKykgewotICAgICAgICBwb29sW2ldID0gc3RkOjp0aHJlYWQoZiwgaSk7Ci0gICAgfQotfQotCi12b2lkIGFpb19wb29sX3NwbGljZV9pbml0KCkgewotICAgIGFpb19wb29sX2luaXQoc3BsaWNlX3dyaXRlX3Bvb2xfZnVuYyk7Ci19Ci0KLXZvaWQgYWlvX3Bvb2xfd3JpdGVfaW5pdCgpIHsKLSAgICBhaW9fcG9vbF9pbml0KHdyaXRlX3Bvb2xfZnVuYyk7Ci19Ci0KLXZvaWQgYWlvX3Bvb2xfZW5kKCkgewotICAgIGRvbmUgPSAxOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1RIUkVBRFM7IGkrKykgewotICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxrKHF1ZXVlX2xvY2spOwotICAgICAgICBsay51bmxvY2soKTsKLSAgICAgICAgcXVldWVfY29uZC5ub3RpZnlfb25lKCk7Ci0gICAgfQotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fVEhSRUFEUzsgaSsrKSB7Ci0gICAgICAgIHBvb2xbaV0uam9pbigpOwotICAgIH0KLX0KLQotLy8gdXNlZCBmb3IgYm90aCB3cml0ZXMgYW5kIHNwbGljZXMgZGVwZW5kaW5nIG9uIHdoaWNoIGluaXQgd2FzIHVzZWQgYmVmb3JlLgotaW50IGFpb19wb29sX3dyaXRlKHN0cnVjdCBhaW9jYiAqYWlvY2JwKSB7Ci0gICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsayhxdWV1ZV9sb2NrKTsKLSAgICB3cml0ZV9jb25kLndhaXQobGssIFtde3JldHVybiBxdWV1ZS5zaXplKCkgPCBNQVhfUVVFVUVfU0laRTt9KTsKLSAgICBxdWV1ZS5wdXNoKHN0ZDo6dW5pcXVlX3B0cjxzdHJ1Y3QgYWlvY2I+KGFpb2NicCkpOwotICAgIGxrLnVubG9jaygpOwotICAgIHF1ZXVlX2NvbmQubm90aWZ5X29uZSgpOwotICAgIHJldHVybiAwOwotfQotCi1pbnQgYWlvX3JlYWQoc3RydWN0IGFpb2NiICphaW9jYnApIHsKLSAgICBhaW9jYnAtPnRocmVhZCA9IHN0ZDo6dGhyZWFkKHJlYWRfZnVuYywgYWlvY2JwKTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IGFpb193cml0ZShzdHJ1Y3QgYWlvY2IgKmFpb2NicCkgewotICAgIGFpb2NicC0+dGhyZWFkID0gc3RkOjp0aHJlYWQod3JpdGVfZnVuYywgYWlvY2JwKTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IGFpb19zcGxpY2VfcmVhZChzdHJ1Y3QgYWlvY2IgKmFpb2NicCkgewotICAgIGFpb2NicC0+dGhyZWFkID0gc3RkOjp0aHJlYWQoc3BsaWNlX3JlYWRfZnVuYywgYWlvY2JwKTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IGFpb19zcGxpY2Vfd3JpdGUoc3RydWN0IGFpb2NiICphaW9jYnApIHsKLSAgICBhaW9jYnAtPnRocmVhZCA9IHN0ZDo6dGhyZWFkKHNwbGljZV93cml0ZV9mdW5jLCBhaW9jYnApOwotICAgIHJldHVybiAwOwotfQotCi1pbnQgYWlvX2Vycm9yKGNvbnN0IHN0cnVjdCBhaW9jYiAqYWlvY2JwKSB7Ci0gICAgcmV0dXJuIGFpb2NicC0+ZXJyb3I7Ci19Ci0KLXNzaXplX3QgYWlvX3JldHVybihzdHJ1Y3QgYWlvY2IgKmFpb2NicCkgewotICAgIHJldHVybiBhaW9jYnAtPnJldDsKLX0KLQotaW50IGFpb19zdXNwZW5kKHN0cnVjdCBhaW9jYiAqYWlvY2JwW10sIGludCBuLAotICAgICAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKikgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgIGFpb2NicFtpXS0+dGhyZWFkLmpvaW4oKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBhaW9fY2FuY2VsKGludCwgc3RydWN0IGFpb2NiICopIHsKLSAgICAvLyBOb3QgaW1wbGVtZW50ZWQKLSAgICByZXR1cm4gLTE7Ci19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL210cC9Bc3luY0lPLmggYi9tZWRpYS9tdHAvQXN5bmNJTy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDgwODI4Li4wMDAwMDAwCi0tLSBhL21lZGlhL210cC9Bc3luY0lPLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfQVNZTkNJT19ICi0jZGVmaW5lIF9BU1lOQ0lPX0gKLQotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8bGludXgvYWlvX2FiaS5oPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8dGhyZWFkPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0vKioKLSAqIFByb3ZpZGVzIGEgc3Vic2V0IG9mIFBPU0lYIGFpbyBvcGVyYXRpb25zLCBhcyB3ZWxsCi0gKiBhcyBzaW1pbGFyIG9wZXJhdGlvbnMgd2l0aCBzcGxpY2UgYW5kIHRocmVhZHBvb2xzLgotICovCi0KLXN0cnVjdCBhaW9jYiB7Ci0gICAgaW50IGFpb19maWxkZXM7ICAgICAvLyBBc3N1bWVkIHRvIGJlIHRoZSBzb3VyY2UgZm9yIHNwbGljZXMKLSAgICB2b2lkICphaW9fYnVmOyAgICAgIC8vIFVudXNlZCBmb3Igc3BsaWNlcwotCi0gICAgLy8gVXNlZCBmb3IgdGhyZWFkcG9vbCBvcGVyYXRpb25zIG9ubHksIGZyZWVkIGF1dG9tYXRpY2FsbHkKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Y2hhcltdPiBhaW9fcG9vbF9idWY7Ci0KLSAgICBvZmZfdCBhaW9fb2Zmc2V0OwotICAgIHNpemVfdCBhaW9fbmJ5dGVzOwotCi0gICAgaW50IGFpb19zaW5rOyAgICAgICAvLyBVbnVzZWQgZm9yIG5vbiBzcGxpY2Ugci93Ci0KLSAgICAvLyBVc2VkIGludGVybmFsbHkKLSAgICBzdGQ6OnRocmVhZCB0aHJlYWQ7Ci0gICAgc3NpemVfdCByZXQ7Ci0gICAgaW50IGVycm9yOwotCi0gICAgfmFpb2NiKCk7Ci19OwotCi0vLyBTdWJtaXQgYSByZXF1ZXN0IGZvciBJTyB0byBiZSBjb21wbGV0ZWQKLWludCBhaW9fcmVhZChzdHJ1Y3QgYWlvY2IgKik7Ci1pbnQgYWlvX3dyaXRlKHN0cnVjdCBhaW9jYiAqKTsKLWludCBhaW9fc3BsaWNlX3JlYWQoc3RydWN0IGFpb2NiICopOwotaW50IGFpb19zcGxpY2Vfd3JpdGUoc3RydWN0IGFpb2NiICopOwotCi0vLyBTdXNwZW5kIGN1cnJlbnQgdGhyZWFkIHVudGlsIGdpdmVuIElPIGlzIGNvbXBsZXRlLCBhdCB3aGljaCBwb2ludAotLy8gaXRzIHJldHVybiB2YWx1ZSBhbmQgYW55IGVycm9ycyBjYW4gYmUgYWNjZXNzZWQKLS8vIEFsbCBzdWJtaXR0ZWQgcmVxdWVzdHMgbXVzdCBoYXZlIGEgY29ycmVzcG9uZGluZyBzdXNwZW5kLgotLy8gYWlvY2ItPmFpb19idWYgbXVzdCByZWZlciB0byB2YWxpZCBtZW1vcnkgdW50aWwgYWZ0ZXIgdGhlIHN1c3BlbmQgY2FsbAotaW50IGFpb19zdXNwZW5kKHN0cnVjdCBhaW9jYiAqW10sIGludCwgY29uc3Qgc3RydWN0IHRpbWVzcGVjICopOwotaW50IGFpb19lcnJvcihjb25zdCBzdHJ1Y3QgYWlvY2IgKik7Ci1zc2l6ZV90IGFpb19yZXR1cm4oc3RydWN0IGFpb2NiICopOwotCi0vLyAoQ3VycmVudGx5IHVuaW1wbGVtZW50ZWQpCi1pbnQgYWlvX2NhbmNlbChpbnQsIHN0cnVjdCBhaW9jYiAqKTsKLQotLy8gSW5pdGlhbGl6ZSBhIHRocmVhZHBvb2wgdG8gcGVyZm9ybSBJTy4gT25seSBvbmUgcG9vbCBjYW4gYmUKLS8vIHJ1bm5pbmcgYXQgYSB0aW1lLgotdm9pZCBhaW9fcG9vbF93cml0ZV9pbml0KCk7Ci12b2lkIGFpb19wb29sX3NwbGljZV9pbml0KCk7Ci0vLyBTdXNwZW5kIGN1cnJlbnQgdGhyZWFkIHVudGlsIGFsbCBxdWV1ZWQgd29yayBpcyBjb21wbGV0ZSwgdGhlbiBlbmRzIHRoZSB0aHJlYWRwb29sCi12b2lkIGFpb19wb29sX2VuZCgpOwotLy8gU3VibWl0IElPIHdvcmsgZm9yIHRoZSB0aHJlYWRwb29sIHRvIGNvbXBsZXRlLiBNZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSB3b3JrIGlzCi0vLyBmcmVlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIHdvcmsgaXMgY29tcGxldGUuCi1pbnQgYWlvX3Bvb2xfd3JpdGUoc3RydWN0IGFpb2NiICopOwotCi0jZW5kaWYgLy8gQVNZTkNJT19ICi0KZGlmZiAtLWdpdCBhL21lZGlhL210cC9JTXRwRGF0YWJhc2UuaCBiL21lZGlhL210cC9JTXRwRGF0YWJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjQ1MDkyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL0lNdHBEYXRhYmFzZS5oCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfSV9NVFBfREFUQUJBU0VfSAorI2RlZmluZSBfSV9NVFBfREFUQUJBU0VfSAorCisjaW5jbHVkZSAiTXRwVHlwZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBEYXRhUGFja2V0OworY2xhc3MgTXRwUHJvcGVydHk7CitjbGFzcyBNdHBPYmplY3RJbmZvOworY2xhc3MgTXRwU3RyaW5nQnVmZmVyOworCitjbGFzcyBJTXRwRGF0YWJhc2UgeworcHVibGljOgorICAgIHZpcnR1YWwgfklNdHBEYXRhYmFzZSgpIHt9CisKKyAgICAvLyBDYWxsZWQgZnJvbSBTZW5kT2JqZWN0SW5mbyB0byByZXNlcnZlIGEgZGF0YWJhc2UgZW50cnkgZm9yIHRoZSBpbmNvbWluZyBmaWxlLgorICAgIHZpcnR1YWwgTXRwT2JqZWN0SGFuZGxlICAgICAgICAgYmVnaW5TZW5kT2JqZWN0KGNvbnN0IGNoYXIqIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0b3JhZ2VJRCBzdG9yYWdlKSA9IDA7CisKKyAgICAvLyBDYWxsZWQgdG8gcmVwb3J0IHN1Y2Nlc3Mgb3IgZmFpbHVyZSBvZiB0aGUgU2VuZE9iamVjdCBmaWxlIHRyYW5zZmVyLgorICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICAgICAgZW5kU2VuZE9iamVjdChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1Y2NlZWRlZCkgPSAwOworICAgIAorICAgIC8vIENhbGxlZCB0byByZXNjYW4gYSBmaWxlLCBzdWNoIGFzIGFmdGVyIGFuIGVkaXQuCisgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgICAgICAgICByZXNjYW5GaWxlKGNvbnN0IGNoYXIqIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQpID0gMDsKKworICAgIHZpcnR1YWwgTXRwT2JqZWN0SGFuZGxlTGlzdCogICAgZ2V0T2JqZWN0TGlzdChNdHBTdG9yYWdlSUQgc3RvcmFnZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50KSA9IDA7CisKKyAgICB2aXJ0dWFsIGludCAgICAgICAgICAgICAgICAgICAgIGdldE51bU9iamVjdHMoTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCkgPSAwOworCisgICAgLy8gY2FsbGVlIHNob3VsZCBkZWxldGVbXSB0aGUgcmVzdWx0cyBmcm9tIHRoZXNlCisgICAgLy8gcmVzdWx0cyBjYW4gYmUgTlVMTAorICAgIHZpcnR1YWwgTXRwT2JqZWN0Rm9ybWF0TGlzdCogICAgZ2V0U3VwcG9ydGVkUGxheWJhY2tGb3JtYXRzKCkgPSAwOworICAgIHZpcnR1YWwgTXRwT2JqZWN0Rm9ybWF0TGlzdCogICAgZ2V0U3VwcG9ydGVkQ2FwdHVyZUZvcm1hdHMoKSA9IDA7CisgICAgdmlydHVhbCBNdHBPYmplY3RQcm9wZXJ0eUxpc3QqICBnZXRTdXBwb3J0ZWRPYmplY3RQcm9wZXJ0aWVzKE10cE9iamVjdEZvcm1hdCBmb3JtYXQpID0gMDsKKyAgICB2aXJ0dWFsIE10cERldmljZVByb3BlcnR5TGlzdCogIGdldFN1cHBvcnRlZERldmljZVByb3BlcnRpZXMoKSA9IDA7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGdldE9iamVjdFByb3BlcnR5VmFsdWUoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0UHJvcGVydHkgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCkgPSAwOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBzZXRPYmplY3RQcm9wZXJ0eVZhbHVlKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpID0gMDsKKworICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgZ2V0RGV2aWNlUHJvcGVydHlWYWx1ZShNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCYgcGFja2V0KSA9IDA7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIHNldERldmljZVByb3BlcnR5VmFsdWUoTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCkgPSAwOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICByZXNldERldmljZVByb3BlcnR5KE10cERldmljZVByb3BlcnR5IHByb3BlcnR5KSA9IDA7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGdldE9iamVjdFByb3BlcnR5TGlzdChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsIHVpbnQzMl90IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3JvdXBDb2RlLCBpbnQgZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCkgPSAwOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBnZXRPYmplY3RJbmZvKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEluZm8mIGluZm8pID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCogICAgICAgICAgICAgICAgICAgZ2V0VGh1bWJuYWlsKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsIHNpemVfdCYgb3V0VGh1bWJTaXplKSA9IDA7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGdldE9iamVjdEZpbGVQYXRoKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0cmluZ0J1ZmZlciYgb3V0RmlsZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QmIG91dEZpbGVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCYgb3V0Rm9ybWF0KSA9IDA7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGJlZ2luRGVsZXRlT2JqZWN0KE10cE9iamVjdEhhbmRsZSBoYW5kbGUpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgICAgIGVuZERlbGV0ZU9iamVjdChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLCBib29sIHN1Y2NlZWRlZCkgPSAwOworCisgICAgdmlydHVhbCBNdHBPYmplY3RIYW5kbGVMaXN0KiAgICBnZXRPYmplY3RSZWZlcmVuY2VzKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpID0gMDsKKworICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgc2V0T2JqZWN0UmVmZXJlbmNlcyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGVMaXN0KiByZWZlcmVuY2VzKSA9IDA7CisKKyAgICB2aXJ0dWFsIE10cFByb3BlcnR5KiAgICAgICAgICAgIGdldE9iamVjdFByb3BlcnR5RGVzYyhNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCkgPSAwOworCisgICAgdmlydHVhbCBNdHBQcm9wZXJ0eSogICAgICAgICAgICBnZXREZXZpY2VQcm9wZXJ0eURlc2MoTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHkpID0gMDsKKworICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgYmVnaW5Nb3ZlT2JqZWN0KE10cE9iamVjdEhhbmRsZSBoYW5kbGUsIE10cE9iamVjdEhhbmRsZSBuZXdQYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0b3JhZ2VJRCBuZXdTdG9yYWdlKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgICAgIGVuZE1vdmVPYmplY3QoTXRwT2JqZWN0SGFuZGxlIG9sZFBhcmVudCwgTXRwT2JqZWN0SGFuZGxlIG5ld1BhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwU3RvcmFnZUlEIG9sZFN0b3JhZ2UsIE10cFN0b3JhZ2VJRCBuZXdTdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlLCBib29sIHN1Y2NlZWRlZCkgPSAwOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBiZWdpbkNvcHlPYmplY3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgTXRwT2JqZWN0SGFuZGxlIG5ld1BhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwU3RvcmFnZUlEIG5ld1N0b3JhZ2UpOworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICAgICAgZW5kQ29weU9iamVjdChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLCBib29sIHN1Y2NlZWRlZCk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX0lfTVRQX0RBVEFCQVNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9JTXRwSGFuZGxlLmggYi9tZWRpYS9tdHAvSU10cEhhbmRsZS5oCmluZGV4IDA1NTc1OTYuLmZkMTRiMTggMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9JTXRwSGFuZGxlLmgKKysrIGIvbWVkaWEvbXRwL0lNdHBIYW5kbGUuaApAQCAtMTgsMTMgKzE4LDEzIEBACiAKICNpbmNsdWRlIDxsaW51eC91c2IvZl9tdHAuaD4KIAotY29uc3RleHByIGNoYXIgRkZTX01UUF9FUDBbXSA9ICIvZGV2L3VzYi1mZnMvbXRwL2VwMCI7CituYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIElNdHBIYW5kbGUgewogcHVibGljOgogICAgIC8vIFJldHVybiBudW1iZXIgb2YgYnl0ZXMgcmVhZC93cml0dGVuLCBvciAtMSBhbmQgZXJybm8gaXMgc2V0Ci0gICAgdmlydHVhbCBpbnQgcmVhZCh2b2lkICpkYXRhLCBpbnQgbGVuKSA9IDA7Ci0gICAgdmlydHVhbCBpbnQgd3JpdGUoY29uc3Qgdm9pZCAqZGF0YSwgaW50IGxlbikgPSAwOworICAgIHZpcnR1YWwgaW50IHJlYWQodm9pZCAqZGF0YSwgc2l6ZV90IGxlbikgPSAwOworICAgIHZpcnR1YWwgaW50IHdyaXRlKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pID0gMDsKIAogICAgIC8vIFJldHVybiAwIGlmIHNlbmQvcmVjZWl2ZSBpcyBzdWNjZXNzZnVsLCBvciAtMSBhbmQgZXJybm8gaXMgc2V0CiAgICAgdmlydHVhbCBpbnQgcmVjZWl2ZUZpbGUobXRwX2ZpbGVfcmFuZ2UgbWZyLCBib29sIHplcm9fcGFja2V0KSA9IDA7CkBAIC0zMiwxNiArMzIsMTQgQEAKICAgICB2aXJ0dWFsIGludCBzZW5kRXZlbnQobXRwX2V2ZW50IG1lKSA9IDA7CiAKICAgICAvLyBSZXR1cm4gMCBpZiBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bCwgb3IgLTEgZWxzZQotICAgIHZpcnR1YWwgaW50IHN0YXJ0KCkgPSAwOwotICAgIHZpcnR1YWwgaW50IGNvbmZpZ3VyZShib29sIHB0cCkgPSAwOworICAgIHZpcnR1YWwgaW50IHN0YXJ0KGJvb2wgcHRwKSA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKSA9IDA7CiAKICAgICB2aXJ0dWFsIH5JTXRwSGFuZGxlKCkge30KIH07CiAKLUlNdHBIYW5kbGUgKmdldF9mZnNfaGFuZGxlKCk7Ci1JTXRwSGFuZGxlICpnZXRfbXRwX2hhbmRsZSgpOworfQogCiAjZW5kaWYgLy8gX0lNVFBfSEFORExFX0gKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERhdGFQYWNrZXQuY3BwIGIvbWVkaWEvbXRwL010cERhdGFQYWNrZXQuY3BwCmluZGV4IGQxYzcxZDcuLjk5MmRjOWEgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBEYXRhUGFja2V0LmNwcAorKysgYi9tZWRpYS9tdHAvTXRwRGF0YVBhY2tldC5jcHAKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlICJNdHBEYXRhUGFja2V0LmgiCiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CkBAIC0xMjksNyArMTMwLDcgQEAKICAgICAgICAgICAgIGRlbGV0ZSByZXN1bHQ7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQotICAgICAgICByZXN1bHQtPnB1c2godmFsdWUpOworICAgICAgICByZXN1bHQtPnB1c2hfYmFjayh2YWx1ZSk7CiAgICAgfQogICAgIHJldHVybiByZXN1bHQ7CiB9CkBAIC0xNDUsNyArMTQ2LDcgQEAKICAgICAgICAgICAgIGRlbGV0ZSByZXN1bHQ7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQotICAgICAgICByZXN1bHQtPnB1c2godmFsdWUpOworICAgICAgICByZXN1bHQtPnB1c2hfYmFjayh2YWx1ZSk7CiAgICAgfQogICAgIHJldHVybiByZXN1bHQ7CiB9CkBAIC0xNjEsNyArMTYyLDcgQEAKICAgICAgICAgICAgIGRlbGV0ZSByZXN1bHQ7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQotICAgICAgICByZXN1bHQtPnB1c2godmFsdWUpOworICAgICAgICByZXN1bHQtPnB1c2hfYmFjayh2YWx1ZSk7CiAgICAgfQogICAgIHJldHVybiByZXN1bHQ7CiB9CkBAIC0xNzcsNyArMTc4LDcgQEAKICAgICAgICAgICAgIGRlbGV0ZSByZXN1bHQ7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQotICAgICAgICByZXN1bHQtPnB1c2godmFsdWUpOworICAgICAgICByZXN1bHQtPnB1c2hfYmFjayh2YWx1ZSk7CiAgICAgfQogICAgIHJldHVybiByZXN1bHQ7CiB9CkBAIC0xOTMsNyArMTk0LDcgQEAKICAgICAgICAgICAgIGRlbGV0ZSByZXN1bHQ7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQotICAgICAgICByZXN1bHQtPnB1c2godmFsdWUpOworICAgICAgICByZXN1bHQtPnB1c2hfYmFjayh2YWx1ZSk7CiAgICAgfQogICAgIHJldHVybiByZXN1bHQ7CiB9CkBAIC0yMDksNyArMjEwLDcgQEAKICAgICAgICAgICAgIGRlbGV0ZSByZXN1bHQ7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQotICAgICAgICByZXN1bHQtPnB1c2godmFsdWUpOworICAgICAgICByZXN1bHQtPnB1c2hfYmFjayh2YWx1ZSk7CiAgICAgfQogICAgIHJldHVybiByZXN1bHQ7CiB9CkBAIC0yMjUsNyArMjI2LDcgQEAKICAgICAgICAgICAgIGRlbGV0ZSByZXN1bHQ7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQotICAgICAgICByZXN1bHQtPnB1c2godmFsdWUpOworICAgICAgICByZXN1bHQtPnB1c2hfYmFjayh2YWx1ZSk7CiAgICAgfQogICAgIHJldHVybiByZXN1bHQ7CiB9CkBAIC0yNDEsNyArMjQyLDcgQEAKICAgICAgICAgICAgIGRlbGV0ZSByZXN1bHQ7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQotICAgICAgICByZXN1bHQtPnB1c2godmFsdWUpOworICAgICAgICByZXN1bHQtPnB1c2hfYmFjayh2YWx1ZSk7CiAgICAgfQogICAgIHJldHVybiByZXN1bHQ7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGF0YVBhY2tldC5oIGIvbWVkaWEvbXRwL010cERhdGFQYWNrZXQuaAppbmRleCBhNDQ5ZDZmLi4xZGRiODIxIDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwRGF0YVBhY2tldC5oCisrKyBiL21lZGlhL210cC9NdHBEYXRhUGFja2V0LmgKQEAgLTIwLDEyICsyMCwxMiBAQAogI2luY2x1ZGUgIk10cFBhY2tldC5oIgogI2luY2x1ZGUgIm10cC5oIgogCi1jbGFzcyBJTXRwSGFuZGxlOwogc3RydWN0IHVzYl9kZXZpY2U7CiBzdHJ1Y3QgdXNiX3JlcXVlc3Q7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorY2xhc3MgSU10cEhhbmRsZTsKIGNsYXNzIE10cFN0cmluZ0J1ZmZlcjsKIAogY2xhc3MgTXRwRGF0YVBhY2tldCA6IHB1YmxpYyBNdHBQYWNrZXQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERhdGFiYXNlLmggYi9tZWRpYS9tdHAvTXRwRGF0YWJhc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU2YWM3YS4uMDAwMDAwMAotLS0gYS9tZWRpYS9tdHAvTXRwRGF0YWJhc2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfTVRQX0RBVEFCQVNFX0gKLSNkZWZpbmUgX01UUF9EQVRBQkFTRV9ICi0KLSNpbmNsdWRlICJNdHBUeXBlcy5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIE10cERhdGFQYWNrZXQ7Ci1jbGFzcyBNdHBQcm9wZXJ0eTsKLWNsYXNzIE10cE9iamVjdEluZm87Ci0KLWNsYXNzIE10cERhdGFiYXNlIHsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIH5NdHBEYXRhYmFzZSgpIHt9Ci0KLSAgICAvLyBjYWxsZWQgZnJvbSBTZW5kT2JqZWN0SW5mbyB0byByZXNlcnZlIGEgZGF0YWJhc2UgZW50cnkgZm9yIHRoZSBpbmNvbWluZyBmaWxlCi0gICAgdmlydHVhbCBNdHBPYmplY3RIYW5kbGUgICAgICAgICBiZWdpblNlbmRPYmplY3QoY29uc3QgY2hhciogcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwU3RvcmFnZUlEIHN0b3JhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfdCBtb2RpZmllZCkgPSAwOwotCi0gICAgLy8gY2FsbGVkIHRvIHJlcG9ydCBzdWNjZXNzIG9yIGZhaWx1cmUgb2YgdGhlIFNlbmRPYmplY3QgZmlsZSB0cmFuc2ZlcgotICAgIC8vIHN1Y2Nlc3Mgc2hvdWxkIHNpZ25hbCBhIG5vdGlmaWNhdGlvbiBvZiB0aGUgbmV3IG9iamVjdCdzIGNyZWF0aW9uLAotICAgIC8vIGZhaWx1cmUgc2hvdWxkIHJlbW92ZSB0aGUgZGF0YWJhc2UgZW50cnkgY3JlYXRlZCBpbiBiZWdpblNlbmRPYmplY3QKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgICAgIGVuZFNlbmRPYmplY3QoY29uc3QgY2hhciogcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZWVkZWQpID0gMDsKLQotICAgIHZpcnR1YWwgTXRwT2JqZWN0SGFuZGxlTGlzdCogICAgZ2V0T2JqZWN0TGlzdChNdHBTdG9yYWdlSUQgc3RvcmFnZUlELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50KSA9IDA7Ci0KLSAgICB2aXJ0dWFsIGludCAgICAgICAgICAgICAgICAgICAgIGdldE51bU9iamVjdHMoTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCkgPSAwOwotCi0gICAgLy8gY2FsbGVlIHNob3VsZCBkZWxldGVbXSB0aGUgcmVzdWx0cyBmcm9tIHRoZXNlCi0gICAgLy8gcmVzdWx0cyBjYW4gYmUgTlVMTAotICAgIHZpcnR1YWwgTXRwT2JqZWN0Rm9ybWF0TGlzdCogICAgZ2V0U3VwcG9ydGVkUGxheWJhY2tGb3JtYXRzKCkgPSAwOwotICAgIHZpcnR1YWwgTXRwT2JqZWN0Rm9ybWF0TGlzdCogICAgZ2V0U3VwcG9ydGVkQ2FwdHVyZUZvcm1hdHMoKSA9IDA7Ci0gICAgdmlydHVhbCBNdHBPYmplY3RQcm9wZXJ0eUxpc3QqICBnZXRTdXBwb3J0ZWRPYmplY3RQcm9wZXJ0aWVzKE10cE9iamVjdEZvcm1hdCBmb3JtYXQpID0gMDsKLSAgICB2aXJ0dWFsIE10cERldmljZVByb3BlcnR5TGlzdCogIGdldFN1cHBvcnRlZERldmljZVByb3BlcnRpZXMoKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGdldE9iamVjdFByb3BlcnR5VmFsdWUoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0UHJvcGVydHkgcHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCkgPSAwOwotCi0gICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBzZXRPYmplY3RQcm9wZXJ0eVZhbHVlKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpID0gMDsKLQotICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgZ2V0RGV2aWNlUHJvcGVydHlWYWx1ZShNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCYgcGFja2V0KSA9IDA7Ci0KLSAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIHNldERldmljZVByb3BlcnR5VmFsdWUoTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCkgPSAwOwotCi0gICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICByZXNldERldmljZVByb3BlcnR5KE10cERldmljZVByb3BlcnR5IHByb3BlcnR5KSA9IDA7Ci0KLSAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGdldE9iamVjdFByb3BlcnR5TGlzdChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsIHVpbnQzMl90IHByb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3JvdXBDb2RlLCBpbnQgZGVwdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCkgPSAwOwotCi0gICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBnZXRPYmplY3RJbmZvKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEluZm8mIGluZm8pID0gMDsKLQotICAgIHZpcnR1YWwgdm9pZCogICAgICAgICAgICAgICAgICAgZ2V0VGh1bWJuYWlsKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsIHNpemVfdCYgb3V0VGh1bWJTaXplKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGdldE9iamVjdEZpbGVQYXRoKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0cmluZyYgb3V0RmlsZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QmIG91dEZpbGVMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCYgb3V0Rm9ybWF0KSA9IDA7Ci0KLSAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGRlbGV0ZUZpbGUoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkgPSAwOwotCi0gICAgdmlydHVhbCBNdHBPYmplY3RIYW5kbGVMaXN0KiAgICBnZXRPYmplY3RSZWZlcmVuY2VzKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpID0gMDsKLQotICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgc2V0T2JqZWN0UmVmZXJlbmNlcyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGVMaXN0KiByZWZlcmVuY2VzKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIE10cFByb3BlcnR5KiAgICAgICAgICAgIGdldE9iamVjdFByb3BlcnR5RGVzYyhNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCkgPSAwOwotCi0gICAgdmlydHVhbCBNdHBQcm9wZXJ0eSogICAgICAgICAgICBnZXREZXZpY2VQcm9wZXJ0eURlc2MoTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHkpID0gMDsKLQotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICAgICAgc2Vzc2lvblN0YXJ0ZWQoKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgICAgIHNlc3Npb25FbmRlZCgpID0gMDsKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBfTVRQX0RBVEFCQVNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBEZWJ1Zy5oIGIvbWVkaWEvbXRwL010cERlYnVnLmgKaW5kZXggNWI1M2UzMS4uOGQ0ODI3MyAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cERlYnVnLmgKKysrIGIvbWVkaWEvbXRwL010cERlYnVnLmgKQEAgLTE4LDEwICsxOCwxMCBAQAogI2RlZmluZSBfTVRQX0RFQlVHX0gKIAogLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQogI2luY2x1ZGUgIk10cFR5cGVzLmgiCiAKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgTXRwRGVidWcgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERlc2NyaXB0b3JzLmNwcCBiL21lZGlhL210cC9NdHBEZXNjcmlwdG9ycy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEzMzZjOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBEZXNjcmlwdG9ycy5jcHAKQEAgLTAsMCArMSwyODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgIk10cERlc2NyaXB0b3JzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY29uc3Qgc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciBtdHBfaW50ZXJmYWNlX2Rlc2MgPSB7CisgICAgLmJMZW5ndGggPSBVU0JfRFRfSU5URVJGQUNFX1NJWkUsCisgICAgLmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9JTlRFUkZBQ0UsCisgICAgLmJJbnRlcmZhY2VOdW1iZXIgPSAwLAorICAgIC5iTnVtRW5kcG9pbnRzID0gMywKKyAgICAuYkludGVyZmFjZUNsYXNzID0gVVNCX0NMQVNTX1NUSUxMX0lNQUdFLAorICAgIC5iSW50ZXJmYWNlU3ViQ2xhc3MgPSAxLAorICAgIC5iSW50ZXJmYWNlUHJvdG9jb2wgPSAxLAorICAgIC5pSW50ZXJmYWNlID0gMSwKK307CisKK2NvbnN0IHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgcHRwX2ludGVyZmFjZV9kZXNjID0geworICAgIC5iTGVuZ3RoID0gVVNCX0RUX0lOVEVSRkFDRV9TSVpFLAorICAgIC5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfSU5URVJGQUNFLAorICAgIC5iSW50ZXJmYWNlTnVtYmVyID0gMCwKKyAgICAuYk51bUVuZHBvaW50cyA9IDMsCisgICAgLmJJbnRlcmZhY2VDbGFzcyA9IFVTQl9DTEFTU19TVElMTF9JTUFHRSwKKyAgICAuYkludGVyZmFjZVN1YkNsYXNzID0gMSwKKyAgICAuYkludGVyZmFjZVByb3RvY29sID0gMSwKK307CisKK2NvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcl9ub19hdWRpbyBmc19zaW5rID0geworICAgIC5iTGVuZ3RoID0gVVNCX0RUX0VORFBPSU5UX1NJWkUsCisgICAgLmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9FTkRQT0lOVCwKKyAgICAuYkVuZHBvaW50QWRkcmVzcyA9IDEgfCBVU0JfRElSX0lOLAorICAgIC5ibUF0dHJpYnV0ZXMgPSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLLAorICAgIC53TWF4UGFja2V0U2l6ZSA9IE1BWF9QQUNLRVRfU0laRV9GUywKK307CisKK2NvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcl9ub19hdWRpbyBmc19zb3VyY2UgPSB7CisgICAgLmJMZW5ndGggPSBVU0JfRFRfRU5EUE9JTlRfU0laRSwKKyAgICAuYkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX0VORFBPSU5ULAorICAgIC5iRW5kcG9pbnRBZGRyZXNzID0gMiB8IFVTQl9ESVJfT1VULAorICAgIC5ibUF0dHJpYnV0ZXMgPSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLLAorICAgIC53TWF4UGFja2V0U2l6ZSA9IE1BWF9QQUNLRVRfU0laRV9GUywKK307CisKK2NvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcl9ub19hdWRpbyBpbnRyID0geworICAgIC5iTGVuZ3RoID0gVVNCX0RUX0VORFBPSU5UX1NJWkUsCisgICAgLmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9FTkRQT0lOVCwKKyAgICAuYkVuZHBvaW50QWRkcmVzcyA9IDMgfCBVU0JfRElSX0lOLAorICAgIC5ibUF0dHJpYnV0ZXMgPSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQsCisgICAgLndNYXhQYWNrZXRTaXplID0gTUFYX1BBQ0tFVF9TSVpFX0VWLAorICAgIC5iSW50ZXJ2YWwgPSA2LAorfTsKKworY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yX25vX2F1ZGlvIGhzX3NpbmsgPSB7CisgICAgLmJMZW5ndGggPSBVU0JfRFRfRU5EUE9JTlRfU0laRSwKKyAgICAuYkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX0VORFBPSU5ULAorICAgIC5iRW5kcG9pbnRBZGRyZXNzID0gMSB8IFVTQl9ESVJfSU4sCisgICAgLmJtQXR0cmlidXRlcyA9IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEssCisgICAgLndNYXhQYWNrZXRTaXplID0gTUFYX1BBQ0tFVF9TSVpFX0hTLAorfTsKKworY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yX25vX2F1ZGlvIGhzX3NvdXJjZSA9IHsKKyAgICAuYkxlbmd0aCA9IFVTQl9EVF9FTkRQT0lOVF9TSVpFLAorICAgIC5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfRU5EUE9JTlQsCisgICAgLmJFbmRwb2ludEFkZHJlc3MgPSAyIHwgVVNCX0RJUl9PVVQsCisgICAgLmJtQXR0cmlidXRlcyA9IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEssCisgICAgLndNYXhQYWNrZXRTaXplID0gTUFYX1BBQ0tFVF9TSVpFX0hTLAorfTsKKworY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yX25vX2F1ZGlvIHNzX3NpbmsgPSB7CisgICAgLmJMZW5ndGggPSBVU0JfRFRfRU5EUE9JTlRfU0laRSwKKyAgICAuYkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX0VORFBPSU5ULAorICAgIC5iRW5kcG9pbnRBZGRyZXNzID0gMSB8IFVTQl9ESVJfSU4sCisgICAgLmJtQXR0cmlidXRlcyA9IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEssCisgICAgLndNYXhQYWNrZXRTaXplID0gTUFYX1BBQ0tFVF9TSVpFX1NTLAorfTsKKworY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yX25vX2F1ZGlvIHNzX3NvdXJjZSA9IHsKKyAgICAuYkxlbmd0aCA9IFVTQl9EVF9FTkRQT0lOVF9TSVpFLAorICAgIC5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfRU5EUE9JTlQsCisgICAgLmJFbmRwb2ludEFkZHJlc3MgPSAyIHwgVVNCX0RJUl9PVVQsCisgICAgLmJtQXR0cmlidXRlcyA9IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEssCisgICAgLndNYXhQYWNrZXRTaXplID0gTUFYX1BBQ0tFVF9TSVpFX1NTLAorfTsKKworY29uc3Qgc3RydWN0IHVzYl9zc19lcF9jb21wX2Rlc2NyaXB0b3Igc3Nfc2lua19jb21wID0geworICAgIC5iTGVuZ3RoID0gc2l6ZW9mKHNzX3NpbmtfY29tcCksCisgICAgLmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9TU19FTkRQT0lOVF9DT01QLAorICAgIC5iTWF4QnVyc3QgPSA2LAorfTsKKworY29uc3Qgc3RydWN0IHVzYl9zc19lcF9jb21wX2Rlc2NyaXB0b3Igc3Nfc291cmNlX2NvbXAgPSB7CisgICAgLmJMZW5ndGggPSBzaXplb2Yoc3Nfc291cmNlX2NvbXApLAorICAgIC5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfU1NfRU5EUE9JTlRfQ09NUCwKKyAgICAuYk1heEJ1cnN0ID0gNiwKK307CisKK2NvbnN0IHN0cnVjdCB1c2Jfc3NfZXBfY29tcF9kZXNjcmlwdG9yIHNzX2ludHJfY29tcCA9IHsKKyAgICAuYkxlbmd0aCA9IHNpemVvZihzc19pbnRyX2NvbXApLAorICAgIC5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfU1NfRU5EUE9JTlRfQ09NUCwKK307CisKK2NvbnN0IHN0cnVjdCBmdW5jX2Rlc2MgbXRwX2ZzX2Rlc2NyaXB0b3JzID0geworICAgIC5pbnRmID0gbXRwX2ludGVyZmFjZV9kZXNjLAorICAgIC5zaW5rID0gZnNfc2luaywKKyAgICAuc291cmNlID0gZnNfc291cmNlLAorICAgIC5pbnRyID0gaW50ciwKK307CisKK2NvbnN0IHN0cnVjdCBmdW5jX2Rlc2MgbXRwX2hzX2Rlc2NyaXB0b3JzID0geworICAgIC5pbnRmID0gbXRwX2ludGVyZmFjZV9kZXNjLAorICAgIC5zaW5rID0gaHNfc2luaywKKyAgICAuc291cmNlID0gaHNfc291cmNlLAorICAgIC5pbnRyID0gaW50ciwKK307CisKK2NvbnN0IHN0cnVjdCBzc19mdW5jX2Rlc2MgbXRwX3NzX2Rlc2NyaXB0b3JzID0geworICAgIC5pbnRmID0gbXRwX2ludGVyZmFjZV9kZXNjLAorICAgIC5zaW5rID0gc3Nfc2luaywKKyAgICAuc2lua19jb21wID0gc3Nfc2lua19jb21wLAorICAgIC5zb3VyY2UgPSBzc19zb3VyY2UsCisgICAgLnNvdXJjZV9jb21wID0gc3Nfc291cmNlX2NvbXAsCisgICAgLmludHIgPSBpbnRyLAorICAgIC5pbnRyX2NvbXAgPSBzc19pbnRyX2NvbXAsCit9OworCitjb25zdCBzdHJ1Y3QgZnVuY19kZXNjIHB0cF9mc19kZXNjcmlwdG9ycyA9IHsKKyAgICAuaW50ZiA9IHB0cF9pbnRlcmZhY2VfZGVzYywKKyAgICAuc2luayA9IGZzX3NpbmssCisgICAgLnNvdXJjZSA9IGZzX3NvdXJjZSwKKyAgICAuaW50ciA9IGludHIsCit9OworCitjb25zdCBzdHJ1Y3QgZnVuY19kZXNjIHB0cF9oc19kZXNjcmlwdG9ycyA9IHsKKyAgICAuaW50ZiA9IHB0cF9pbnRlcmZhY2VfZGVzYywKKyAgICAuc2luayA9IGhzX3NpbmssCisgICAgLnNvdXJjZSA9IGhzX3NvdXJjZSwKKyAgICAuaW50ciA9IGludHIsCit9OworCitjb25zdCBzdHJ1Y3Qgc3NfZnVuY19kZXNjIHB0cF9zc19kZXNjcmlwdG9ycyA9IHsKKyAgICAuaW50ZiA9IHB0cF9pbnRlcmZhY2VfZGVzYywKKyAgICAuc2luayA9IHNzX3NpbmssCisgICAgLnNpbmtfY29tcCA9IHNzX3NpbmtfY29tcCwKKyAgICAuc291cmNlID0gc3Nfc291cmNlLAorICAgIC5zb3VyY2VfY29tcCA9IHNzX3NvdXJjZV9jb21wLAorICAgIC5pbnRyID0gaW50ciwKKyAgICAuaW50cl9jb21wID0gc3NfaW50cl9jb21wLAorfTsKKworY29uc3Qgc3RydWN0IGZ1bmN0aW9uZnNfc3RyaW5ncyBtdHBfc3RyaW5ncyA9IHsKKyAgICAuaGVhZGVyID0geworICAgICAgICAubWFnaWMgPSBodG9sZTMyKEZVTkNUSU9ORlNfU1RSSU5HU19NQUdJQyksCisgICAgICAgIC5sZW5ndGggPSBodG9sZTMyKHNpemVvZihtdHBfc3RyaW5ncykpLAorICAgICAgICAuc3RyX2NvdW50ID0gaHRvbGUzMigxKSwKKyAgICAgICAgLmxhbmdfY291bnQgPSBodG9sZTMyKDEpLAorICAgIH0sCisgICAgLmxhbmcwID0geworICAgICAgICAuY29kZSA9IGh0b2xlMTYoMHgwNDA5KSwKKyAgICAgICAgLnN0cjEgPSBTVFJfSU5URVJGQUNFLAorICAgIH0sCit9OworCitjb25zdCBzdHJ1Y3QgdXNiX29zX2Rlc2NfaGVhZGVyIG10cF9vc19kZXNjX2hlYWRlciA9IHsKKyAgICAuaW50ZXJmYWNlID0gaHRvbGUzMigxKSwKKyAgICAuZHdMZW5ndGggPSBodG9sZTMyKHNpemVvZih1c2Jfb3NfZGVzY19oZWFkZXIpICsgc2l6ZW9mKHVzYl9leHRfY29tcGF0X2Rlc2MpKSwKKyAgICAuYmNkVmVyc2lvbiA9IGh0b2xlMTYoMSksCisgICAgLndJbmRleCA9IGh0b2xlMTYoNCksCisgICAgLmJDb3VudCA9IGh0b2xlMTYoMSksCisgICAgLlJlc2VydmVkID0gaHRvbGUxNigwKSwKK307CisKK2NvbnN0IHN0cnVjdCB1c2JfZXh0X2NvbXBhdF9kZXNjIG10cF9vc19kZXNjX2NvbXBhdCA9IHsKKyAgICAuYkZpcnN0SW50ZXJmYWNlTnVtYmVyID0gMCwKKyAgICAuUmVzZXJ2ZWQxID0gaHRvbGUzMigxKSwKKyAgICAuQ29tcGF0aWJsZUlEID0geyAnTScsICdUJywgJ1AnIH0sCisgICAgLlN1YkNvbXBhdGlibGVJRCA9IHswfSwKKyAgICAuUmVzZXJ2ZWQyID0gezB9LAorfTsKKworY29uc3Qgc3RydWN0IHVzYl9leHRfY29tcGF0X2Rlc2MgcHRwX29zX2Rlc2NfY29tcGF0ID0geworICAgIC5iRmlyc3RJbnRlcmZhY2VOdW1iZXIgPSAwLAorICAgIC5SZXNlcnZlZDEgPSBodG9sZTMyKDEpLAorICAgIC5Db21wYXRpYmxlSUQgPSB7ICdQJywgJ1QnLCAnUCcgfSwKKyAgICAuU3ViQ29tcGF0aWJsZUlEID0gezB9LAorICAgIC5SZXNlcnZlZDIgPSB7MH0sCit9OworCitjb25zdCBzdHJ1Y3QgZGVzY192MiBtdHBfZGVzY192MiA9IHsKKyAgICAuaGVhZGVyID0geworICAgICAgICAubWFnaWMgPSBodG9sZTMyKEZVTkNUSU9ORlNfREVTQ1JJUFRPUlNfTUFHSUNfVjIpLAorICAgICAgICAubGVuZ3RoID0gaHRvbGUzMihzaXplb2Yoc3RydWN0IGRlc2NfdjIpKSwKKyAgICAgICAgLmZsYWdzID0gRlVOQ1RJT05GU19IQVNfRlNfREVTQyB8IEZVTkNUSU9ORlNfSEFTX0hTX0RFU0MgfAorICAgICAgICAgICAgICAgICBGVU5DVElPTkZTX0hBU19TU19ERVNDIHwgRlVOQ1RJT05GU19IQVNfTVNfT1NfREVTQywKKyAgICB9LAorICAgIC5mc19jb3VudCA9IDQsCisgICAgLmhzX2NvdW50ID0gNCwKKyAgICAuc3NfY291bnQgPSA3LAorICAgIC5vc19jb3VudCA9IDEsCisgICAgLmZzX2Rlc2NzID0gbXRwX2ZzX2Rlc2NyaXB0b3JzLAorICAgIC5oc19kZXNjcyA9IG10cF9oc19kZXNjcmlwdG9ycywKKyAgICAuc3NfZGVzY3MgPSBtdHBfc3NfZGVzY3JpcHRvcnMsCisgICAgLm9zX2hlYWRlciA9IG10cF9vc19kZXNjX2hlYWRlciwKKyAgICAub3NfZGVzYyA9IG10cF9vc19kZXNjX2NvbXBhdCwKK307CisKK2NvbnN0IHN0cnVjdCBkZXNjX3YyIHB0cF9kZXNjX3YyID0geworICAgIC5oZWFkZXIgPSB7CisgICAgICAgIC5tYWdpYyA9IGh0b2xlMzIoRlVOQ1RJT05GU19ERVNDUklQVE9SU19NQUdJQ19WMiksCisgICAgICAgIC5sZW5ndGggPSBodG9sZTMyKHNpemVvZihzdHJ1Y3QgZGVzY192MikpLAorICAgICAgICAuZmxhZ3MgPSBGVU5DVElPTkZTX0hBU19GU19ERVNDIHwgRlVOQ1RJT05GU19IQVNfSFNfREVTQyB8CisgICAgICAgICAgICAgICAgIEZVTkNUSU9ORlNfSEFTX1NTX0RFU0MgfCBGVU5DVElPTkZTX0hBU19NU19PU19ERVNDLAorICAgIH0sCisgICAgLmZzX2NvdW50ID0gNCwKKyAgICAuaHNfY291bnQgPSA0LAorICAgIC5zc19jb3VudCA9IDcsCisgICAgLm9zX2NvdW50ID0gMSwKKyAgICAuZnNfZGVzY3MgPSBwdHBfZnNfZGVzY3JpcHRvcnMsCisgICAgLmhzX2Rlc2NzID0gcHRwX2hzX2Rlc2NyaXB0b3JzLAorICAgIC5zc19kZXNjcyA9IHB0cF9zc19kZXNjcmlwdG9ycywKKyAgICAub3NfaGVhZGVyID0gbXRwX29zX2Rlc2NfaGVhZGVyLAorICAgIC5vc19kZXNjID0gcHRwX29zX2Rlc2NfY29tcGF0LAorfTsKKworY29uc3Qgc3RydWN0IGRlc2NfdjEgbXRwX2Rlc2NfdjEgPSB7CisgICAgLmhlYWRlciA9IHsKKyAgICAgICAgLm1hZ2ljID0gaHRvbGUzMihGVU5DVElPTkZTX0RFU0NSSVBUT1JTX01BR0lDKSwKKyAgICAgICAgLmxlbmd0aCA9IGh0b2xlMzIoc2l6ZW9mKHN0cnVjdCBkZXNjX3YxKSksCisgICAgICAgIC5mc19jb3VudCA9IDQsCisgICAgICAgIC5oc19jb3VudCA9IDQsCisgICAgfSwKKyAgICAuZnNfZGVzY3MgPSBtdHBfZnNfZGVzY3JpcHRvcnMsCisgICAgLmhzX2Rlc2NzID0gbXRwX2hzX2Rlc2NyaXB0b3JzLAorfTsKKworY29uc3Qgc3RydWN0IGRlc2NfdjEgcHRwX2Rlc2NfdjEgPSB7CisgICAgLmhlYWRlciA9IHsKKyAgICAgICAgLm1hZ2ljID0gaHRvbGUzMihGVU5DVElPTkZTX0RFU0NSSVBUT1JTX01BR0lDKSwKKyAgICAgICAgLmxlbmd0aCA9IGh0b2xlMzIoc2l6ZW9mKHN0cnVjdCBkZXNjX3YxKSksCisgICAgICAgIC5mc19jb3VudCA9IDQsCisgICAgICAgIC5oc19jb3VudCA9IDQsCisgICAgfSwKKyAgICAuZnNfZGVzY3MgPSBwdHBfZnNfZGVzY3JpcHRvcnMsCisgICAgLmhzX2Rlc2NzID0gcHRwX2hzX2Rlc2NyaXB0b3JzLAorfTsKKworYm9vbCB3cml0ZURlc2NyaXB0b3JzKGludCBmZCwgYm9vbCBwdHApIHsKKyAgICBzc2l6ZV90IHJldCA9IFRFTVBfRkFJTFVSRV9SRVRSWSh3cml0ZShmZCwKKyAgICAgICAgICAgICAgICAmKHB0cCA/IHB0cF9kZXNjX3YyIDogbXRwX2Rlc2NfdjIpLCBzaXplb2YoZGVzY192MikpKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCBmZCA8PCAiU3dpdGNoaW5nIHRvIFYxIGRlc2NyaXB0b3IgZm9ybWF0IjsKKyAgICAgICAgcmV0ID0gVEVNUF9GQUlMVVJFX1JFVFJZKHdyaXRlKGZkLAorICAgICAgICAgICAgICAgICAgICAmKHB0cCA/IHB0cF9kZXNjX3YxIDogbXRwX2Rlc2NfdjEpLCBzaXplb2YoZGVzY192MSkpKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8IGZkIDw8ICJXcml0aW5nIGRlc2NyaXB0b3JzIGZhaWxlZCI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0ID0gVEVNUF9GQUlMVVJFX1JFVFJZKHdyaXRlKGZkLCAmbXRwX3N0cmluZ3MsIHNpemVvZihtdHBfc3RyaW5ncykpKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCBmZCA8PCAiV3JpdGluZyBzdHJpbmdzIGZhaWxlZCI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGVzY3JpcHRvcnMuaCBiL21lZGlhL210cC9NdHBEZXNjcmlwdG9ycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MDBhMjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwRGVzY3JpcHRvcnMuaApAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTVRQX0RFU0NSSVBUT1JTX0gKKyNkZWZpbmUgTVRQX0RFU0NSSVBUT1JTX0gKKworI2luY2x1ZGUgPGxpbnV4L3VzYi9jaDkuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IvZnVuY3Rpb25mcy5oPgorI2luY2x1ZGUgPHN5cy9lbmRpYW4uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgY2hhciBGRlNfTVRQX0VQMFtdID0gIi9kZXYvdXNiLWZmcy9tdHAvZXAwIjsKK2NvbnN0ZXhwciBjaGFyIEZGU19NVFBfRVBfSU5bXSA9ICIvZGV2L3VzYi1mZnMvbXRwL2VwMSI7Citjb25zdGV4cHIgY2hhciBGRlNfTVRQX0VQX09VVFtdID0gIi9kZXYvdXNiLWZmcy9tdHAvZXAyIjsKK2NvbnN0ZXhwciBjaGFyIEZGU19NVFBfRVBfSU5UUltdID0gIi9kZXYvdXNiLWZmcy9tdHAvZXAzIjsKKworY29uc3RleHByIGNoYXIgRkZTX1BUUF9FUDBbXSA9ICIvZGV2L3VzYi1mZnMvcHRwL2VwMCI7Citjb25zdGV4cHIgY2hhciBGRlNfUFRQX0VQX0lOW10gPSAiL2Rldi91c2ItZmZzL3B0cC9lcDEiOworY29uc3RleHByIGNoYXIgRkZTX1BUUF9FUF9PVVRbXSA9ICIvZGV2L3VzYi1mZnMvcHRwL2VwMiI7Citjb25zdGV4cHIgY2hhciBGRlNfUFRQX0VQX0lOVFJbXSA9ICIvZGV2L3VzYi1mZnMvcHRwL2VwMyI7CisKK2NvbnN0ZXhwciBpbnQgTUFYX1BBQ0tFVF9TSVpFX0ZTID0gNjQ7Citjb25zdGV4cHIgaW50IE1BWF9QQUNLRVRfU0laRV9IUyA9IDUxMjsKK2NvbnN0ZXhwciBpbnQgTUFYX1BBQ0tFVF9TSVpFX1NTID0gMTAyNDsKK2NvbnN0ZXhwciBpbnQgTUFYX1BBQ0tFVF9TSVpFX0VWID0gMjg7CisKK3N0cnVjdCBmdW5jX2Rlc2MgeworICAgIHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgaW50ZjsKKyAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3Jfbm9fYXVkaW8gc2luazsKKyAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3Jfbm9fYXVkaW8gc291cmNlOworICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcl9ub19hdWRpbyBpbnRyOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHNzX2Z1bmNfZGVzYyB7CisgICAgc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciBpbnRmOworICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcl9ub19hdWRpbyBzaW5rOworICAgIHN0cnVjdCB1c2Jfc3NfZXBfY29tcF9kZXNjcmlwdG9yIHNpbmtfY29tcDsKKyAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3Jfbm9fYXVkaW8gc291cmNlOworICAgIHN0cnVjdCB1c2Jfc3NfZXBfY29tcF9kZXNjcmlwdG9yIHNvdXJjZV9jb21wOworICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcl9ub19hdWRpbyBpbnRyOworICAgIHN0cnVjdCB1c2Jfc3NfZXBfY29tcF9kZXNjcmlwdG9yIGludHJfY29tcDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBkZXNjX3YxIHsKKyAgICBzdHJ1Y3QgdXNiX2Z1bmN0aW9uZnNfZGVzY3NfaGVhZF92MSB7CisgICAgICAgIF9fbGUzMiBtYWdpYzsKKyAgICAgICAgX19sZTMyIGxlbmd0aDsKKyAgICAgICAgX19sZTMyIGZzX2NvdW50OworICAgICAgICBfX2xlMzIgaHNfY291bnQ7CisgICAgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBoZWFkZXI7CisgICAgc3RydWN0IGZ1bmNfZGVzYyBmc19kZXNjcywgaHNfZGVzY3M7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgZGVzY192MiB7CisgICAgc3RydWN0IHVzYl9mdW5jdGlvbmZzX2Rlc2NzX2hlYWRfdjIgaGVhZGVyOworICAgIC8vIFRoZSByZXN0IG9mIHRoZSBzdHJ1Y3R1cmUgZGVwZW5kcyBvbiB0aGUgZmxhZ3MgaW4gdGhlIGhlYWRlci4KKyAgICBfX2xlMzIgZnNfY291bnQ7CisgICAgX19sZTMyIGhzX2NvdW50OworICAgIF9fbGUzMiBzc19jb3VudDsKKyAgICBfX2xlMzIgb3NfY291bnQ7CisgICAgc3RydWN0IGZ1bmNfZGVzYyBmc19kZXNjcywgaHNfZGVzY3M7CisgICAgc3RydWN0IHNzX2Z1bmNfZGVzYyBzc19kZXNjczsKKyAgICBzdHJ1Y3QgdXNiX29zX2Rlc2NfaGVhZGVyIG9zX2hlYWRlcjsKKyAgICBzdHJ1Y3QgdXNiX2V4dF9jb21wYXRfZGVzYyBvc19kZXNjOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLy8gT1MgZGVzY3JpcHRvciBjb250ZW50cyBzaG91bGQgbm90IGJlIGNoYW5nZWQuIFNlZSBiLzY0NzkwNTM2Lgorc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IGRlc2NfdjIpID09IHNpemVvZih1c2JfZnVuY3Rpb25mc19kZXNjc19oZWFkX3YyKSArCisgICAgICAgIDE2ICsgMiAqIHNpemVvZihzdHJ1Y3QgZnVuY19kZXNjKSArIHNpemVvZihzdHJ1Y3Qgc3NfZnVuY19kZXNjKSArCisgICAgICAgIHNpemVvZih1c2Jfb3NfZGVzY19oZWFkZXIpICsgc2l6ZW9mKHVzYl9leHRfY29tcGF0X2Rlc2MpLAorICAgICAgICAiU2l6ZSBvZiBtdHAgZGVzY3JpcHRvciBpcyBpbmNvcnJlY3QhIik7CisKKyNkZWZpbmUgU1RSX0lOVEVSRkFDRSAiTVRQIgorc3RydWN0IGZ1bmN0aW9uZnNfbGFuZyB7CisgICAgX19sZTE2IGNvZGU7CisgICAgY2hhciBzdHIxW3NpemVvZihTVFJfSU5URVJGQUNFKV07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgZnVuY3Rpb25mc19zdHJpbmdzIHsKKyAgICBzdHJ1Y3QgdXNiX2Z1bmN0aW9uZnNfc3RyaW5nc19oZWFkIGhlYWRlcjsKKyAgICBzdHJ1Y3QgZnVuY3Rpb25mc19sYW5nIGxhbmcwOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBkZXNjX3YyIG10cF9kZXNjX3YyOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBkZXNjX3YyIHB0cF9kZXNjX3YyOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBkZXNjX3YxIG10cF9kZXNjX3YxOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBkZXNjX3YxIHB0cF9kZXNjX3YxOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBmdW5jdGlvbmZzX3N0cmluZ3MgbXRwX3N0cmluZ3M7CisKK2Jvb2wgd3JpdGVEZXNjcmlwdG9ycyhpbnQgZmQsIGJvb2wgcHRwKTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIE1UUF9ERVNDUklQVE9SU19ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGV2SGFuZGxlLmNwcCBiL21lZGlhL210cC9NdHBEZXZIYW5kbGUuY3BwCmluZGV4IDlhYTBhZWMuLmU4YmRmODAgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBEZXZIYW5kbGUuY3BwCisrKyBiL21lZGlhL210cC9NdHBEZXZIYW5kbGUuY3BwCkBAIC0xNCw1NyArMTQsMzcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGRpcmVudC5oPgogI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvY2g5Lmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9lbmRpYW4uaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgotI2luY2x1ZGUgIklNdHBIYW5kbGUuaCIKKyNpbmNsdWRlICJNdHBEZXZIYW5kbGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjb25zdGV4cHIgY2hhciBtdHBfZGV2X3BhdGhbXSA9ICIvZGV2L210cF91c2IiOwogCi1jbGFzcyBNdHBEZXZIYW5kbGUgOiBwdWJsaWMgSU10cEhhbmRsZSB7Ci1wcml2YXRlOgotICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBtRmQ7Ci0KLXB1YmxpYzoKLSAgICBNdHBEZXZIYW5kbGUoKTsKLSAgICB+TXRwRGV2SGFuZGxlKCk7Ci0gICAgaW50IHJlYWQodm9pZCAqZGF0YSwgaW50IGxlbik7Ci0gICAgaW50IHdyaXRlKGNvbnN0IHZvaWQgKmRhdGEsIGludCBsZW4pOwotCi0gICAgaW50IHJlY2VpdmVGaWxlKG10cF9maWxlX3JhbmdlIG1mciwgYm9vbCk7Ci0gICAgaW50IHNlbmRGaWxlKG10cF9maWxlX3JhbmdlIG1mcik7Ci0gICAgaW50IHNlbmRFdmVudChtdHBfZXZlbnQgbWUpOwotCi0gICAgaW50IHN0YXJ0KCk7Ci0gICAgdm9pZCBjbG9zZSgpOwotCi0gICAgaW50IGNvbmZpZ3VyZShib29sIHB0cCk7Ci19OwotCiBNdHBEZXZIYW5kbGU6Ok10cERldkhhbmRsZSgpCiAgICAgOiBtRmQoLTEpIHt9OwogCiBNdHBEZXZIYW5kbGU6On5NdHBEZXZIYW5kbGUoKSB7fQogCi1pbnQgTXRwRGV2SGFuZGxlOjpyZWFkKHZvaWQgKmRhdGEsIGludCBsZW4pIHsKK2ludCBNdHBEZXZIYW5kbGU6OnJlYWQodm9pZCAqZGF0YSwgc2l6ZV90IGxlbikgewogICAgIHJldHVybiA6OnJlYWQobUZkLCBkYXRhLCBsZW4pOwogfQogCi1pbnQgTXRwRGV2SGFuZGxlOjp3cml0ZShjb25zdCB2b2lkICpkYXRhLCBpbnQgbGVuKSB7CitpbnQgTXRwRGV2SGFuZGxlOjp3cml0ZShjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKSB7CiAgICAgcmV0dXJuIDo6d3JpdGUobUZkLCBkYXRhLCBsZW4pOwogfQogCkBAIC04MCw4ICs2MCw4IEBACiAgICAgcmV0dXJuIGlvY3RsKG1GZCwgTVRQX1NFTkRfRVZFTlQsIHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgbG9uZz4oJm1lKSk7CiB9CiAKLWludCBNdHBEZXZIYW5kbGU6OnN0YXJ0KCkgewotICAgIG1GZCA9IGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZChURU1QX0ZBSUxVUkVfUkVUUlkob3BlbihtdHBfZGV2X3BhdGgsIE9fUkRXUikpKTsKK2ludCBNdHBEZXZIYW5kbGU6OnN0YXJ0KGJvb2wgLyogcHRwICovKSB7CisgICAgbUZkLnJlc2V0KFRFTVBfRkFJTFVSRV9SRVRSWShvcGVuKG10cF9kZXZfcGF0aCwgT19SRFdSKSkpOwogICAgIGlmIChtRmQgPT0gLTEpIHJldHVybiAtMTsKICAgICByZXR1cm4gMDsKIH0KQEAgLTkwLDExICs3MCw0IEBACiAgICAgbUZkLnJlc2V0KCk7CiB9CiAKLWludCBNdHBEZXZIYW5kbGU6OmNvbmZpZ3VyZShib29sKSB7Ci0gICAgLy8gTm90aGluZyB0byBkbywgZHJpdmVyIGNhbiBjb25maWd1cmUgaXRzZWxmCi0gICAgcmV0dXJuIDA7Ci19Ci0KLUlNdHBIYW5kbGUgKmdldF9tdHBfaGFuZGxlKCkgewotICAgIHJldHVybiBuZXcgTXRwRGV2SGFuZGxlKCk7Ci19Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGV2SGFuZGxlLmggYi9tZWRpYS9tdHAvTXRwRGV2SGFuZGxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQwYWM4NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBEZXZIYW5kbGUuaApAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX0RFVl9IQU5ETEVfSAorI2RlZmluZSBfTVRQX0RFVl9IQU5ETEVfSAorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgorI2luY2x1ZGUgIklNdHBIYW5kbGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBEZXZIYW5kbGUgOiBwdWJsaWMgSU10cEhhbmRsZSB7Citwcml2YXRlOgorICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBtRmQ7CisKK3B1YmxpYzoKKyAgICBNdHBEZXZIYW5kbGUoKTsKKyAgICB+TXRwRGV2SGFuZGxlKCk7CisgICAgaW50IHJlYWQodm9pZCAqZGF0YSwgc2l6ZV90IGxlbik7CisgICAgaW50IHdyaXRlKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pOworCisgICAgaW50IHJlY2VpdmVGaWxlKG10cF9maWxlX3JhbmdlIG1mciwgYm9vbCk7CisgICAgaW50IHNlbmRGaWxlKG10cF9maWxlX3JhbmdlIG1mcik7CisgICAgaW50IHNlbmRFdmVudChtdHBfZXZlbnQgbWUpOworCisgICAgaW50IHN0YXJ0KGJvb2wgcHRwKTsKKyAgICB2b2lkIGNsb3NlKCk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX0ZGU19IQU5ETEVfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERldmljZS5jcHAgYi9tZWRpYS9tdHAvTXRwRGV2aWNlLmNwcAppbmRleCAwYmY3ODU0Li45OTM3OTdhIDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwRGV2aWNlLmNwcAorKysgYi9tZWRpYS9tdHAvTXRwRGV2aWNlLmNwcApAQCAtMjYyLDcgKzI2Miw3IEBACiAgICAgICAgICAgICAgICAgTXRwRGV2aWNlUHJvcGVydHkgcHJvcENvZGUgPSAoKm1EZXZpY2VJbmZvLT5tRGV2aWNlUHJvcGVydGllcylbaV07CiAgICAgICAgICAgICAgICAgTXRwUHJvcGVydHkqIHByb3BlcnR5ID0gZ2V0RGV2aWNlUHJvcERlc2MocHJvcENvZGUpOwogICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eSkKLSAgICAgICAgICAgICAgICAgICAgbURldmljZVByb3BlcnRpZXMucHVzaChwcm9wZXJ0eSk7CisgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VQcm9wZXJ0aWVzLnB1c2hfYmFjayhwcm9wZXJ0eSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0zMjcsNyArMzI3LDcgQEAKIH0KIAogYm9vbCBNdHBEZXZpY2U6Om9wZW5TZXNzaW9uKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsZyhtTXV0ZXgpOwogCiAgICAgbVNlc3Npb25JRCA9IDA7CiAgICAgbVRyYW5zYWN0aW9uSUQgPSAwOwpAQCAtMzUzLDcgKzM1Myw3IEBACiB9CiAKIE10cERldmljZUluZm8qIE10cERldmljZTo6Z2V0RGV2aWNlSW5mbygpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbGcobU11dGV4KTsKIAogICAgIG1SZXF1ZXN0LnJlc2V0KCk7CiAgICAgaWYgKCFzZW5kUmVxdWVzdChNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfSU5GTykpCkBAIC0zNzIsNyArMzcyLDcgQEAKIH0KIAogTXRwU3RvcmFnZUlETGlzdCogTXRwRGV2aWNlOjpnZXRTdG9yYWdlSURzKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsZyhtTXV0ZXgpOwogCiAgICAgbVJlcXVlc3QucmVzZXQoKTsKICAgICBpZiAoIXNlbmRSZXF1ZXN0KE1UUF9PUEVSQVRJT05fR0VUX1NUT1JBR0VfSURTKSkKQEAgLTM4Nyw3ICszODcsNyBAQAogfQogCiBNdHBTdG9yYWdlSW5mbyogTXRwRGV2aWNlOjpnZXRTdG9yYWdlSW5mbyhNdHBTdG9yYWdlSUQgc3RvcmFnZUlEKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxnKG1NdXRleCk7CiAKICAgICBtUmVxdWVzdC5yZXNldCgpOwogICAgIG1SZXF1ZXN0LnNldFBhcmFtZXRlcigxLCBzdG9yYWdlSUQpOwpAQCAtNDA4LDcgKzQwOCw3IEBACiAKIE10cE9iamVjdEhhbmRsZUxpc3QqIE10cERldmljZTo6Z2V0T2JqZWN0SGFuZGxlcyhNdHBTdG9yYWdlSUQgc3RvcmFnZUlELAogICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsZyhtTXV0ZXgpOwogCiAgICAgbVJlcXVlc3QucmVzZXQoKTsKICAgICBtUmVxdWVzdC5zZXRQYXJhbWV0ZXIoMSwgc3RvcmFnZUlEKTsKQEAgLTQyNiw3ICs0MjYsNyBAQAogfQogCiBNdHBPYmplY3RJbmZvKiBNdHBEZXZpY2U6OmdldE9iamVjdEluZm8oTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsZyhtTXV0ZXgpOwogCiAgICAgLy8gRklYTUUgLSB3ZSBtaWdodCB3YW50IHRvIGFkZCBzb21lIGNhY2hpbmcgaGVyZQogCkBAIC00NDgsNyArNDQ4LDcgQEAKIH0KIAogdm9pZCogTXRwRGV2aWNlOjpnZXRUaHVtYm5haWwoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgaW50JiBvdXRMZW5ndGgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbGcobU11dGV4KTsKIAogICAgIG1SZXF1ZXN0LnJlc2V0KCk7CiAgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDEsIGhhbmRsZSk7CkBAIC00NjMsNyArNDYzLDcgQEAKIH0KIAogTXRwT2JqZWN0SGFuZGxlIE10cERldmljZTo6c2VuZE9iamVjdEluZm8oTXRwT2JqZWN0SW5mbyogaW5mbykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsZyhtTXV0ZXgpOwogCiAgICAgbVJlcXVlc3QucmVzZXQoKTsKICAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50ID0gaW5mby0+bVBhcmVudDsKQEAgLTUxNyw3ICs1MTcsNyBAQAogfQogCiBib29sIE10cERldmljZTo6c2VuZE9iamVjdChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLCBpbnQgc2l6ZSwgaW50IHNyY0ZEKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxnKG1NdXRleCk7CiAKICAgICBpZiAobUxhc3RTZW5kT2JqZWN0SW5mb1RyYW5zYWN0aW9uSUQgKyAxICE9IG1UcmFuc2FjdGlvbklEIHx8CiAgICAgICAgICAgICBtTGFzdFNlbmRPYmplY3RJbmZvT2JqZWN0SGFuZGxlICE9IGhhbmRsZSkgewpAQCAtNTM3LDcgKzUzNyw3IEBACiB9CiAKIGJvb2wgTXRwRGV2aWNlOjpkZWxldGVPYmplY3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsZyhtTXV0ZXgpOwogCiAgICAgbVJlcXVlc3QucmVzZXQoKTsKICAgICBtUmVxdWVzdC5zZXRQYXJhbWV0ZXIoMSwgaGFuZGxlKTsKQEAgLTU3Miw3ICs1NzIsNyBAQAogfQogCiBNdHBPYmplY3RQcm9wZXJ0eUxpc3QqIE10cERldmljZTo6Z2V0T2JqZWN0UHJvcHNTdXBwb3J0ZWQoTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsZyhtTXV0ZXgpOwogCiAgICAgbVJlcXVlc3QucmVzZXQoKTsKICAgICBtUmVxdWVzdC5zZXRQYXJhbWV0ZXIoMSwgZm9ybWF0KTsKQEAgLTU4OSw3ICs1ODksNyBAQAogfQogCiBNdHBQcm9wZXJ0eSogTXRwRGV2aWNlOjpnZXREZXZpY2VQcm9wRGVzYyhNdHBEZXZpY2VQcm9wZXJ0eSBjb2RlKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxnKG1NdXRleCk7CiAKICAgICBtUmVxdWVzdC5yZXNldCgpOwogICAgIG1SZXF1ZXN0LnNldFBhcmFtZXRlcigxLCBjb2RlKTsKQEAgLTYwOSw3ICs2MDksNyBAQAogfQogCiBNdHBQcm9wZXJ0eSogTXRwRGV2aWNlOjpnZXRPYmplY3RQcm9wRGVzYyhNdHBPYmplY3RQcm9wZXJ0eSBjb2RlLCBNdHBPYmplY3RGb3JtYXQgZm9ybWF0KSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxnKG1NdXRleCk7CiAKICAgICBtUmVxdWVzdC5yZXNldCgpOwogICAgIG1SZXF1ZXN0LnNldFBhcmFtZXRlcigxLCBjb2RlKTsKQEAgLTYzMyw3ICs2MzMsNyBAQAogICAgIGlmIChwcm9wZXJ0eSA9PSBudWxscHRyKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbGcobU11dGV4KTsKIAogICAgIG1SZXF1ZXN0LnJlc2V0KCk7CiAgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDEsIGhhbmRsZSk7CkBAIC02ODQsNyArNjg0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhZE9iamVjdENhbGxiYWNrIGNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogZXhwZWN0ZWRMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNsaWVudERhdGEpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbGcobU11dGV4KTsKIAogICAgIG1SZXF1ZXN0LnJlc2V0KCk7CiAgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDEsIGhhbmRsZSk7CkBAIC04MDYsNyArODA2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqd3JpdHRlblNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhZE9iamVjdENhbGxiYWNrIGNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNsaWVudERhdGEpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbGcobU11dGV4KTsKIAogICAgIG1SZXF1ZXN0LnJlc2V0KCk7CiAgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDEsIGhhbmRsZSk7CkBAIC04MjgsNyArODI4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICp3cml0dGVuU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWRPYmplY3RDYWxsYmFjayBjYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNsaWVudERhdGEpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbGcobU11dGV4KTsKIAogICAgIG1SZXF1ZXN0LnJlc2V0KCk7CiAgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDEsIGhhbmRsZSk7CkBAIC05MDgsNyArOTA4LDcgQEAKIH0KIAogaW50IE10cERldmljZTo6c3VibWl0RXZlbnRSZXF1ZXN0KCkgewotICAgIGlmIChtRXZlbnRNdXRleC50cnlMb2NrKCkpIHsKKyAgICBpZiAoIW1FdmVudE11dGV4LnRyeV9sb2NrKCkpIHsKICAgICAgICAgLy8gQW4gZXZlbnQgaXMgYmVpbmcgcmVhcGVkIG9uIGFub3RoZXIgdGhyZWFkLgogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQpAQCAtOTE2LDcgKzkxNiw3IEBACiAgICAgICAgIC8vIEFuIGV2ZW50IHJlcXVlc3Qgd2FzIHN1Ym1pdHRlZCwgYnV0IG5vIHJlYXBFdmVudFJlcXVlc3QgY2FsbGVkIHNvIGZhci4KICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUV2ZW50TXV0ZXhGb3JJbnRlcnJ1cHQpOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsZyhtRXZlbnRNdXRleEZvckludGVycnVwdCk7CiAgICAgbUV2ZW50UGFja2V0LnNlbmRSZXF1ZXN0KG1SZXF1ZXN0SW50cik7CiAgICAgY29uc3QgaW50IGN1cnJlbnRIYW5kbGUgPSArK21DdXJyZW50RXZlbnRIYW5kbGU7CiAgICAgbVByb2Nlc3NpbmdFdmVudCA9IHRydWU7CkBAIC05MjUsNyArOTI1LDcgQEAKIH0KIAogaW50IE10cERldmljZTo6cmVhcEV2ZW50UmVxdWVzdChpbnQgaGFuZGxlLCB1aW50MzJfdCAoKnBhcmFtZXRlcnMpWzNdKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1FdmVudE11dGV4KTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbGcobUV2ZW50TXV0ZXgpOwogICAgIGlmICghbVByb2Nlc3NpbmdFdmVudCB8fCBtQ3VycmVudEV2ZW50SGFuZGxlICE9IGhhbmRsZSB8fCAhcGFyYW1ldGVycykgewogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQpAQCAtOTQwLDcgKzk0MCw3IEBACiB9CiAKIHZvaWQgTXRwRGV2aWNlOjpkaXNjYXJkRXZlbnRSZXF1ZXN0KGludCBoYW5kbGUpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUV2ZW50TXV0ZXhGb3JJbnRlcnJ1cHQpOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsZyhtRXZlbnRNdXRleEZvckludGVycnVwdCk7CiAgICAgaWYgKG1DdXJyZW50RXZlbnRIYW5kbGUgIT0gaGFuZGxlKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGV2aWNlLmggYi9tZWRpYS9tdHAvTXRwRGV2aWNlLmgKaW5kZXggYTlhM2UwZS4uOGNmOWU1ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cERldmljZS5oCisrKyBiL21lZGlhL210cC9NdHBEZXZpY2UuaApAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgIk10cFJlc3BvbnNlUGFja2V0LmgiCiAjaW5jbHVkZSAiTXRwVHlwZXMuaCIKIAotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKyNpbmNsdWRlIDxtdXRleD4KIAogc3RydWN0IHVzYl9kZXZpY2U7CiBzdHJ1Y3QgdXNiX3JlcXVlc3Q7CkBAIC02Nyw5ICs2Nyw5IEBACiAgICAgTXRwT2JqZWN0SGFuZGxlICAgICAgICAgbUxhc3RTZW5kT2JqZWN0SW5mb09iamVjdEhhbmRsZTsKIAogICAgIC8vIHRvIGVuc3VyZSBvbmx5IG9uZSBNVFAgdHJhbnNhY3Rpb24gYXQgYSB0aW1lCi0gICAgTXV0ZXggICAgICAgICAgICAgICAgICAgbU11dGV4OwotICAgIE11dGV4ICAgICAgICAgICAgICAgICAgIG1FdmVudE11dGV4OwotICAgIE11dGV4ICAgICAgICAgICAgICAgICAgIG1FdmVudE11dGV4Rm9ySW50ZXJydXB0OworICAgIHN0ZDo6bXV0ZXggICAgICAgICAgICAgIG1NdXRleDsKKyAgICBzdGQ6Om11dGV4ICAgICAgICAgICAgICBtRXZlbnRNdXRleDsKKyAgICBzdGQ6Om11dGV4ICAgICAgICAgICAgICBtRXZlbnRNdXRleEZvckludGVycnVwdDsKIAogICAgIC8vIFJlbWVtYmVyIHRoZSBkZXZpY2UncyBwYWNrZXQgZGl2aXNpb24gbW9kZS4KICAgICBVcmJQYWNrZXREaXZpc2lvbk1vZGUgICBtUGFja2V0RGl2aXNpb25Nb2RlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cEV2ZW50UGFja2V0LmggYi9tZWRpYS9tdHAvTXRwRXZlbnRQYWNrZXQuaAppbmRleCAzZjNiNmEzLi45NGQ2ZWJmIDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwRXZlbnRQYWNrZXQuaAorKysgYi9tZWRpYS9tdHAvTXRwRXZlbnRQYWNrZXQuaApAQCAtMjAsNiArMjAsOCBAQAogI2luY2x1ZGUgIk10cFBhY2tldC5oIgogI2luY2x1ZGUgIm10cC5oIgogCisjaW5jbHVkZSA8ZXJybm8uaD4KKwogY2xhc3MgSU10cEhhbmRsZTsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cEZmc0NvbXBhdEhhbmRsZS5jcHAgYi9tZWRpYS9tdHAvTXRwRmZzQ29tcGF0SGFuZGxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmIzNDJjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cEZmc0NvbXBhdEhhbmRsZS5jcHAKQEAgLTAsMCArMSwzNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IvY2g5Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiL2Z1bmN0aW9uZnMuaD4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9lbmRpYW4uaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJQb3NpeEFzeW5jSU8uaCIKKyNpbmNsdWRlICJNdHBGZnNDb21wYXRIYW5kbGUuaCIKKyNpbmNsdWRlICJtdHAuaCIKKworI2RlZmluZSBGVU5DVElPTkZTX0VORFBPSU5UX0FMTE9DICAgICAgIF9JT1IoJ2cnLCAyMzEsIF9fdTMyKQorCituYW1lc3BhY2UgeworCisvLyBNdXN0IGJlIGRpdmlzaWJsZSBieSBhbGwgbWF4IHBhY2tldCBzaXplIHZhbHVlcworY29uc3RleHByIGludCBNQVhfRklMRV9DSFVOS19TSVpFID0gMzE0NTcyODsKKworLy8gU2FmZSB2YWx1ZXMgc2luY2Ugc29tZSBkZXZpY2VzIGNhbm5vdCBoYW5kbGUgbGFyZ2UgRE1BcworLy8gVG8gZ2V0IGdvb2QgcGVyZm9ybWFuY2UsIG92ZXJyaWRlIHRoZXNlIHdpdGgKKy8vIGhpZ2hlciB2YWx1ZXMgcGVyIGRldmljZSB1c2luZyB0aGUgcHJvcGVydGllcworLy8gc3lzLnVzYi5mZnMubWF4X3JlYWQgYW5kIHN5cy51c2IuZmZzLm1heF93cml0ZQorY29uc3RleHByIGludCBVU0JfRkZTX01BWF9XUklURSA9IE1UUF9CVUZGRVJfU0laRTsKK2NvbnN0ZXhwciBpbnQgVVNCX0ZGU19NQVhfUkVBRCA9IE1UUF9CVUZGRVJfU0laRTsKKworc3RhdGljX2Fzc2VydChVU0JfRkZTX01BWF9XUklURSA+IDAsICJNYXggci93IHZhbHVlcyBtdXN0IGJlID4gMCEiKTsKK3N0YXRpY19hc3NlcnQoVVNCX0ZGU19NQVhfUkVBRCA+IDAsICJNYXggci93IHZhbHVlcyBtdXN0IGJlID4gMCEiKTsKKworY29uc3RleHByIHVuc2lnbmVkIGludCBNQVhfTVRQX0ZJTEVfU0laRSA9IDB4RkZGRkZGRkY7CisKK2NvbnN0ZXhwciBzaXplX3QgRU5EUE9JTlRfQUxMT0NfUkVUUklFUyA9IDEwOworCit9IC8vIGFub255bW91cyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNdHBGZnNDb21wYXRIYW5kbGU6Ok10cEZmc0NvbXBhdEhhbmRsZShpbnQgY29udHJvbEZkKSA6CisgICAgTXRwRmZzSGFuZGxlKGNvbnRyb2xGZCksCisgICAgbU1heFdyaXRlKFVTQl9GRlNfTUFYX1dSSVRFKSwKKyAgICBtTWF4UmVhZChVU0JfRkZTX01BWF9SRUFEKSB7fQorCitNdHBGZnNDb21wYXRIYW5kbGU6On5NdHBGZnNDb21wYXRIYW5kbGUoKSB7fQorCitpbnQgTXRwRmZzQ29tcGF0SGFuZGxlOjp3cml0ZUhhbmRsZShpbnQgZmQsIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBsZW4pIHsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBjb25zdCBjaGFyKiBidWYgPSBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oZGF0YSk7CisgICAgd2hpbGUgKGxlbiA+IDApIHsKKyAgICAgICAgaW50IHdyaXRlX2xlbiA9IHN0ZDo6bWluKG1NYXhXcml0ZSwgbGVuKTsKKyAgICAgICAgaW50IG4gPSBURU1QX0ZBSUxVUkVfUkVUUlkoOjp3cml0ZShmZCwgYnVmLCB3cml0ZV9sZW4pKTsKKworICAgICAgICBpZiAobiA8IDApIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJ3cml0ZSBFUlJPUjogZmQgPSAiIDw8IGZkIDw8ICIsIG4gPSAiIDw8IG47CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0gZWxzZSBpZiAobiA8IHdyaXRlX2xlbikgeworICAgICAgICAgICAgZXJybm8gPSBFSU87CisgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAibGVzcyB3cml0dGVuIHRoYW4gZXhwZWN0ZWQiOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGJ1ZiArPSBuOworICAgICAgICBsZW4gLT0gbjsKKyAgICAgICAgcmV0ICs9IG47CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBNdHBGZnNDb21wYXRIYW5kbGU6OnJlYWRIYW5kbGUoaW50IGZkLCB2b2lkKiBkYXRhLCBzaXplX3QgbGVuKSB7CisgICAgaW50IHJldCA9IDA7CisgICAgY2hhciogYnVmID0gc3RhdGljX2Nhc3Q8Y2hhcio+KGRhdGEpOworICAgIHdoaWxlIChsZW4gPiAwKSB7CisgICAgICAgIGludCByZWFkX2xlbiA9IHN0ZDo6bWluKG1NYXhSZWFkLCBsZW4pOworICAgICAgICBpbnQgbiA9IFRFTVBfRkFJTFVSRV9SRVRSWSg6OnJlYWQoZmQsIGJ1ZiwgcmVhZF9sZW4pKTsKKyAgICAgICAgaWYgKG4gPCAwKSB7CisgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAicmVhZCBFUlJPUjogZmQgPSAiIDw8IGZkIDw8ICIsIG4gPSAiIDw8IG47CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgcmV0ICs9IG47CisgICAgICAgIGlmIChuIDwgcmVhZF9sZW4pIC8vIGRvbmUgcmVhZGluZyBlYXJseQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGJ1ZiArPSBuOworICAgICAgICBsZW4gLT0gbjsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IE10cEZmc0NvbXBhdEhhbmRsZTo6c3RhcnQoYm9vbCBwdHApIHsKKyAgICBpZiAoIW9wZW5FbmRwb2ludHMocHRwKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE5VTV9JT19CVUZTOyBpKyspIHsKKyAgICAgICAgbUlvYnVmW2ldLmJ1ZnMucmVzaXplKE1BWF9GSUxFX0NIVU5LX1NJWkUpOworICAgICAgICBwb3NpeF9tYWR2aXNlKG1Jb2J1ZltpXS5idWZzLmRhdGEoKSwgTUFYX0ZJTEVfQ0hVTktfU0laRSwKKyAgICAgICAgICAgICAgICBQT1NJWF9NQURWX1NFUVVFTlRJQUwgfCBQT1NJWF9NQURWX1dJTExORUVEKTsKKyAgICB9CisKKyAgICAvLyBHZXQgZGV2aWNlIHNwZWNpZmljIHIvdyBzaXplCisgICAgbU1heFdyaXRlID0gYW5kcm9pZDo6YmFzZTo6R2V0SW50UHJvcGVydHkoInN5cy51c2IuZmZzLm1heF93cml0ZSIsIFVTQl9GRlNfTUFYX1dSSVRFKTsKKyAgICBtTWF4UmVhZCA9IGFuZHJvaWQ6OmJhc2U6OkdldEludFByb3BlcnR5KCJzeXMudXNiLmZmcy5tYXhfcmVhZCIsIFVTQl9GRlNfTUFYX1JFQUQpOworCisgICAgc2l6ZV90IGF0dGVtcHRzID0gMDsKKyAgICB3aGlsZSAobU1heFdyaXRlID49IFVTQl9GRlNfTUFYX1dSSVRFICYmIG1NYXhSZWFkID49IFVTQl9GRlNfTUFYX1JFQUQgJiYKKyAgICAgICAgICAgIGF0dGVtcHRzIDwgRU5EUE9JTlRfQUxMT0NfUkVUUklFUykgeworICAgICAgICAvLyBJZiBsYXJnZXIgY29udGlndW91cyBjaHVua3Mgb2YgbWVtb3J5IGFyZW4ndCBhdmFpbGFibGUsIGF0dGVtcHQgdG8gdHJ5CisgICAgICAgIC8vIHNtYWxsZXIgYWxsb2NhdGlvbnMuCisgICAgICAgIGlmIChpb2N0bChtQnVsa0luLCBGVU5DVElPTkZTX0VORFBPSU5UX0FMTE9DLCBzdGF0aWNfY2FzdDxfX3UzMj4obU1heFdyaXRlKSkgfHwKKyAgICAgICAgICAgIGlvY3RsKG1CdWxrT3V0LCBGVU5DVElPTkZTX0VORFBPSU5UX0FMTE9DLCBzdGF0aWNfY2FzdDxfX3UzMj4obU1heFJlYWQpKSkgeworICAgICAgICAgICAgaWYgKGVycm5vID09IEVOT0RFVikgeworICAgICAgICAgICAgICAgIC8vIERyaXZlciBoYXNuJ3QgZW5hYmxlZCBlbmRwb2ludHMgeWV0LgorICAgICAgICAgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEwMCkpOworICAgICAgICAgICAgICAgIGF0dGVtcHRzICs9IDE7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtTWF4V3JpdGUgLz0gMjsKKyAgICAgICAgICAgIG1NYXhSZWFkIC89MjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIC8vIFRyeSB0byBzdGFydCBNdHBTZXJ2ZXIgYW55d2F5LCB3aXRoIHRoZSBzbWFsbGVzdCBtYXggci93IHZhbHVlcworICAgIG1NYXhXcml0ZSA9IFVTQl9GRlNfTUFYX1dSSVRFOworICAgIG1NYXhSZWFkID0gVVNCX0ZGU19NQVhfUkVBRDsKKyAgICBQTE9HKEVSUk9SKSA8PCAiRnVuY3Rpb25mcyBjb3VsZCBub3QgYWxsb2NhdGUgYW55IG1lbW9yeSEiOworICAgIHJldHVybiAwOworfQorCitpbnQgTXRwRmZzQ29tcGF0SGFuZGxlOjpyZWFkKHZvaWQqIGRhdGEsIHNpemVfdCBsZW4pIHsKKyAgICByZXR1cm4gcmVhZEhhbmRsZShtQnVsa091dCwgZGF0YSwgbGVuKTsKK30KKworaW50IE10cEZmc0NvbXBhdEhhbmRsZTo6d3JpdGUoY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IGxlbikgeworICAgIHJldHVybiB3cml0ZUhhbmRsZShtQnVsa0luLCBkYXRhLCBsZW4pOworfQorCitpbnQgTXRwRmZzQ29tcGF0SGFuZGxlOjpyZWNlaXZlRmlsZShtdHBfZmlsZV9yYW5nZSBtZnIsIGJvb2wgemVyb19wYWNrZXQpIHsKKyAgICAvLyBXaGVuIHJlY2VpdmluZyBmaWxlcywgdGhlIGluY29taW5nIGxlbmd0aCBpcyBnaXZlbiBpbiAzMiBiaXRzLgorICAgIC8vIEEgPjRHIGZpbGUgaXMgZ2l2ZW4gYXMgMHhGRkZGRkZGRgorICAgIHVpbnQzMl90IGZpbGVfbGVuZ3RoID0gbWZyLmxlbmd0aDsKKyAgICB1aW50NjRfdCBvZmZzZXQgPSBtZnIub2Zmc2V0OworICAgIGludCBwYWNrZXRfc2l6ZSA9IGdldFBhY2tldFNpemUobUJ1bGtPdXQpOworCisgICAgdW5zaWduZWQgY2hhciAqZGF0YSA9IG1Jb2J1ZlswXS5idWZzLmRhdGEoKTsKKyAgICB1bnNpZ25lZCBjaGFyICpkYXRhMiA9IG1Jb2J1ZlsxXS5idWZzLmRhdGEoKTsKKworICAgIHN0cnVjdCBhaW9jYiBhaW87CisgICAgYWlvLmFpb19maWxkZXMgPSBtZnIuZmQ7CisgICAgYWlvLmFpb19idWYgPSBudWxscHRyOworICAgIHN0cnVjdCBhaW9jYiAqYWlvbFtdID0geyZhaW99OworICAgIGludCByZXQgPSAtMTsKKyAgICBzaXplX3QgbGVuZ3RoOworICAgIGJvb2wgcmVhZCA9IGZhbHNlOworICAgIGJvb2wgd3JpdGUgPSBmYWxzZTsKKworICAgIHBvc2l4X2ZhZHZpc2UobWZyLmZkLCAwLCAwLCBQT1NJWF9GQURWX1NFUVVFTlRJQUwgfCBQT1NJWF9GQURWX05PUkVVU0UpOworCisgICAgLy8gQnJlYWsgZG93biB0aGUgZmlsZSBpbnRvIHBpZWNlcyB0aGF0IGZpdCBpbiBidWZmZXJzCisgICAgd2hpbGUgKGZpbGVfbGVuZ3RoID4gMCB8fCB3cml0ZSkgeworICAgICAgICBpZiAoZmlsZV9sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBsZW5ndGggPSBzdGQ6Om1pbihzdGF0aWNfY2FzdDx1aW50MzJfdD4oTUFYX0ZJTEVfQ0hVTktfU0laRSksIGZpbGVfbGVuZ3RoKTsKKworICAgICAgICAgICAgLy8gUmVhZCBkYXRhIGZyb20gVVNCLCBoYW5kbGUgZXJyb3JzIGFmdGVyIHdhaXRpbmcgZm9yIHdyaXRlIHRocmVhZC4KKyAgICAgICAgICAgIHJldCA9IHJlYWRIYW5kbGUobUJ1bGtPdXQsIGRhdGEsIGxlbmd0aCk7CisKKyAgICAgICAgICAgIGlmIChmaWxlX2xlbmd0aCAhPSBNQVhfTVRQX0ZJTEVfU0laRSAmJiByZXQgPCBzdGF0aWNfY2FzdDxpbnQ+KGxlbmd0aCkpIHsKKyAgICAgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgICAgICBlcnJubyA9IEVJTzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlYWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHdyaXRlKSB7CisgICAgICAgICAgICAvLyBnZXQgdGhlIHJldHVybiBzdGF0dXMgb2YgdGhlIGxhc3Qgd3JpdGUgcmVxdWVzdAorICAgICAgICAgICAgYWlvX3N1c3BlbmQoYWlvbCwgMSwgbnVsbHB0cik7CisKKyAgICAgICAgICAgIGludCB3cml0dGVuID0gYWlvX3JldHVybigmYWlvKTsKKyAgICAgICAgICAgIGlmICh3cml0dGVuID09IC0xKSB7CisgICAgICAgICAgICAgICAgZXJybm8gPSBhaW9fZXJyb3IoJmFpbyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXRpY19jYXN0PHNpemVfdD4od3JpdHRlbikgPCBhaW8uYWlvX25ieXRlcykgeworICAgICAgICAgICAgICAgIGVycm5vID0gRUlPOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyaXRlID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgcmVhZGluZyBhYm92ZQorICAgICAgICBpZiAocmV0ID09IC0xKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVhZCkgeworICAgICAgICAgICAgaWYgKGZpbGVfbGVuZ3RoID09IE1BWF9NVFBfRklMRV9TSVpFKSB7CisgICAgICAgICAgICAgICAgLy8gRm9yIGxhcmdlciBmaWxlcywgcmVjZWl2ZSB1bnRpbCBhIHNob3J0IHBhY2tldCBpcyByZWNlaXZlZC4KKyAgICAgICAgICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8c2l6ZV90PihyZXQpIDwgbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbGVfbGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZpbGVfbGVuZ3RoIC09IHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEVucXVldWUgYSBuZXcgd3JpdGUgcmVxdWVzdAorICAgICAgICAgICAgYWlvX3ByZXBhcmUoJmFpbywgZGF0YSwgbGVuZ3RoLCBvZmZzZXQpOworICAgICAgICAgICAgYWlvX3dyaXRlKCZhaW8pOworCisgICAgICAgICAgICBvZmZzZXQgKz0gcmV0OworICAgICAgICAgICAgc3RkOjpzd2FwKGRhdGEsIGRhdGEyKTsKKworICAgICAgICAgICAgd3JpdGUgPSB0cnVlOworICAgICAgICAgICAgcmVhZCA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIC8vIFJlY2VpdmUgYW4gZW1wdHkgcGFja2V0IGlmIHNpemUgaXMgYSBtdWx0aXBsZSBvZiB0aGUgZW5kcG9pbnQgc2l6ZS4KKyAgICBpZiAocmV0ICUgcGFja2V0X3NpemUgPT0gMCB8fCB6ZXJvX3BhY2tldCkgeworICAgICAgICBpZiAoVEVNUF9GQUlMVVJFX1JFVFJZKDo6cmVhZChtQnVsa091dCwgZGF0YSwgcGFja2V0X3NpemUpKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBNdHBGZnNDb21wYXRIYW5kbGU6OnNlbmRGaWxlKG10cF9maWxlX3JhbmdlIG1mcikgeworICAgIHVpbnQ2NF90IGZpbGVfbGVuZ3RoID0gbWZyLmxlbmd0aDsKKyAgICB1aW50MzJfdCBnaXZlbl9sZW5ndGggPSBzdGQ6Om1pbihzdGF0aWNfY2FzdDx1aW50NjRfdD4oTUFYX01UUF9GSUxFX1NJWkUpLAorICAgICAgICAgICAgZmlsZV9sZW5ndGggKyBzaXplb2YobXRwX2RhdGFfaGVhZGVyKSk7CisgICAgdWludDY0X3Qgb2Zmc2V0ID0gbWZyLm9mZnNldDsKKyAgICBpbnQgcGFja2V0X3NpemUgPSBnZXRQYWNrZXRTaXplKG1CdWxrSW4pOworCisgICAgLy8gSWYgZmlsZV9sZW5ndGggaXMgbGFyZ2VyIHRoYW4gYSBzaXplX3QsIHRydW5jYXRpbmcgd291bGQgcHJvZHVjZSB0aGUgd3JvbmcgY29tcGFyaXNvbi4KKyAgICAvLyBJbnN0ZWFkLCBwcm9tb3RlIHRoZSBsZWZ0IHNpZGUgdG8gNjQgYml0cywgdGhlbiB0cnVuY2F0ZSB0aGUgc21hbGwgcmVzdWx0LgorICAgIGludCBpbml0X3JlYWRfbGVuID0gc3RkOjptaW4oCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50NjRfdD4ocGFja2V0X3NpemUgLSBzaXplb2YobXRwX2RhdGFfaGVhZGVyKSksIGZpbGVfbGVuZ3RoKTsKKworICAgIHVuc2lnbmVkIGNoYXIgKmRhdGEgPSBtSW9idWZbMF0uYnVmcy5kYXRhKCk7CisgICAgdW5zaWduZWQgY2hhciAqZGF0YTIgPSBtSW9idWZbMV0uYnVmcy5kYXRhKCk7CisKKyAgICBwb3NpeF9mYWR2aXNlKG1mci5mZCwgMCwgMCwgUE9TSVhfRkFEVl9TRVFVRU5USUFMIHwgUE9TSVhfRkFEVl9OT1JFVVNFKTsKKworICAgIHN0cnVjdCBhaW9jYiBhaW87CisgICAgYWlvLmFpb19maWxkZXMgPSBtZnIuZmQ7CisgICAgc3RydWN0IGFpb2NiICphaW9sW10gPSB7JmFpb307CisgICAgaW50IHJldCwgbGVuZ3RoOworICAgIGludCBlcnJvciA9IDA7CisgICAgYm9vbCByZWFkID0gZmFsc2U7CisgICAgYm9vbCB3cml0ZSA9IGZhbHNlOworCisgICAgLy8gU2VuZCB0aGUgaGVhZGVyIGRhdGEKKyAgICBtdHBfZGF0YV9oZWFkZXIgKmhlYWRlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8bXRwX2RhdGFfaGVhZGVyKj4oZGF0YSk7CisgICAgaGVhZGVyLT5sZW5ndGggPSBodG9sZTMyKGdpdmVuX2xlbmd0aCk7CisgICAgaGVhZGVyLT50eXBlID0gaHRvbGUxNigyKTsgLyogZGF0YSBwYWNrZXQgKi8KKyAgICBoZWFkZXItPmNvbW1hbmQgPSBodG9sZTE2KG1mci5jb21tYW5kKTsKKyAgICBoZWFkZXItPnRyYW5zYWN0aW9uX2lkID0gaHRvbGUzMihtZnIudHJhbnNhY3Rpb25faWQpOworCisgICAgLy8gU29tZSBob3N0cyBkb24ndCBzdXBwb3J0IGhlYWRlci9kYXRhIHNlcGFyYXRpb24gZXZlbiB0aG91Z2ggTVRQIGFsbG93cyBpdAorICAgIC8vIEhhbmRsZSBieSBmaWxsaW5nIGZpcnN0IHBhY2tldCB3aXRoIGluaXRpYWwgZmlsZSBkYXRhCisgICAgaWYgKFRFTVBfRkFJTFVSRV9SRVRSWShwcmVhZChtZnIuZmQsIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGRhdGEpICsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG10cF9kYXRhX2hlYWRlciksIGluaXRfcmVhZF9sZW4sIG9mZnNldCkpCisgICAgICAgICAgICAhPSBpbml0X3JlYWRfbGVuKSByZXR1cm4gLTE7CisgICAgaWYgKHdyaXRlSGFuZGxlKG1CdWxrSW4sIGRhdGEsIHNpemVvZihtdHBfZGF0YV9oZWFkZXIpICsgaW5pdF9yZWFkX2xlbikgPT0gLTEpIHJldHVybiAtMTsKKyAgICBmaWxlX2xlbmd0aCAtPSBpbml0X3JlYWRfbGVuOworICAgIG9mZnNldCArPSBpbml0X3JlYWRfbGVuOworICAgIHJldCA9IGluaXRfcmVhZF9sZW4gKyBzaXplb2YobXRwX2RhdGFfaGVhZGVyKTsKKworICAgIC8vIEJyZWFrIGRvd24gdGhlIGZpbGUgaW50byBwaWVjZXMgdGhhdCBmaXQgaW4gYnVmZmVycworICAgIHdoaWxlIChmaWxlX2xlbmd0aCA+IDApIHsKKyAgICAgICAgaWYgKHJlYWQpIHsKKyAgICAgICAgICAgIC8vIFdhaXQgZm9yIHRoZSBwcmV2aW91cyByZWFkIHRvIGZpbmlzaAorICAgICAgICAgICAgYWlvX3N1c3BlbmQoYWlvbCwgMSwgbnVsbHB0cik7CisgICAgICAgICAgICByZXQgPSBhaW9fcmV0dXJuKCZhaW8pOworICAgICAgICAgICAgaWYgKHJldCA9PSAtMSkgeworICAgICAgICAgICAgICAgIGVycm5vID0gYWlvX2Vycm9yKCZhaW8pOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGF0aWNfY2FzdDxzaXplX3Q+KHJldCkgPCBhaW8uYWlvX25ieXRlcykgeworICAgICAgICAgICAgICAgIGVycm5vID0gRUlPOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmlsZV9sZW5ndGggLT0gcmV0OworICAgICAgICAgICAgb2Zmc2V0ICs9IHJldDsKKyAgICAgICAgICAgIHN0ZDo6c3dhcChkYXRhLCBkYXRhMik7CisgICAgICAgICAgICByZWFkID0gZmFsc2U7CisgICAgICAgICAgICB3cml0ZSA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXJyb3IgPT0gLTEpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmaWxlX2xlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIGxlbmd0aCA9IHN0ZDo6bWluKHN0YXRpY19jYXN0PHVpbnQ2NF90PihNQVhfRklMRV9DSFVOS19TSVpFKSwgZmlsZV9sZW5ndGgpOworICAgICAgICAgICAgLy8gUXVldWUgdXAgYW5vdGhlciByZWFkCisgICAgICAgICAgICBhaW9fcHJlcGFyZSgmYWlvLCBkYXRhLCBsZW5ndGgsIG9mZnNldCk7CisgICAgICAgICAgICBhaW9fcmVhZCgmYWlvKTsKKyAgICAgICAgICAgIHJlYWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHdyaXRlKSB7CisgICAgICAgICAgICBpZiAod3JpdGVIYW5kbGUobUJ1bGtJbiwgZGF0YTIsIHJldCkgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBlcnJvciA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGUgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChyZXQgJSBwYWNrZXRfc2l6ZSA9PSAwKSB7CisgICAgICAgIC8vIElmIHRoZSBsYXN0IHBhY2tldCB3YXNuJ3Qgc2hvcnQsIHNlbmQgYSBmaW5hbCBlbXB0eSBwYWNrZXQKKyAgICAgICAgaWYgKFRFTVBfRkFJTFVSRV9SRVRSWSg6OndyaXRlKG1CdWxrSW4sIGRhdGEsIDApKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRmZzQ29tcGF0SGFuZGxlLmggYi9tZWRpYS9tdHAvTXRwRmZzQ29tcGF0SGFuZGxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk4MmQ2MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBGZnNDb21wYXRIYW5kbGUuaApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX0ZGU19DT01QQVRfSEFORExFX0gKKyNkZWZpbmUgX01UUF9GRlNfQ09NUEFUX0hBTkRMRV9ICisKKyNpbmNsdWRlIDxNdHBGZnNIYW5kbGUuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gY2xhc3MgTXRwRmZzSGFuZGxlVGVzdDsKKworY2xhc3MgTXRwRmZzQ29tcGF0SGFuZGxlIDogcHVibGljIE10cEZmc0hhbmRsZSB7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IGZyaWVuZCBjbGFzcyBhbmRyb2lkOjpNdHBGZnNIYW5kbGVUZXN0OworcHJpdmF0ZToKKyAgICBpbnQgd3JpdGVIYW5kbGUoaW50IGZkLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKTsKKyAgICBpbnQgcmVhZEhhbmRsZShpbnQgZmQsIHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pOworCisgICAgc2l6ZV90IG1NYXhXcml0ZTsKKyAgICBzaXplX3QgbU1heFJlYWQ7CisKK3B1YmxpYzoKKyAgICBpbnQgcmVhZCh2b2lkKiBkYXRhLCBzaXplX3QgbGVuKSBvdmVycmlkZTsKKyAgICBpbnQgd3JpdGUoY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IGxlbikgb3ZlcnJpZGU7CisgICAgaW50IHJlY2VpdmVGaWxlKG10cF9maWxlX3JhbmdlIG1mciwgYm9vbCB6ZXJvX3BhY2tldCkgb3ZlcnJpZGU7CisgICAgaW50IHNlbmRGaWxlKG10cF9maWxlX3JhbmdlIG1mcikgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBPcGVuIGZmcyBlbmRwb2ludHMgYW5kIGFsbG9jYXRlIG5lY2Vzc2FyeSBrZXJuZWwgYW5kIHVzZXIgbWVtb3J5LgorICAgICAqIFdpbGwgc2xlZXAgdW50aWwgZW5kcG9pbnRzIGFyZSBlbmFibGVkLCBmb3IgdXAgdG8gMSBzZWNvbmQuCisgICAgICovCisgICAgaW50IHN0YXJ0KGJvb2wgcHRwKSBvdmVycmlkZTsKKworICAgIE10cEZmc0NvbXBhdEhhbmRsZShpbnQgY29udHJvbEZkKTsKKyAgICB+TXRwRmZzQ29tcGF0SGFuZGxlKCk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX0ZGU19DT01QQVRfSEFORExFX0gKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cEZmc0hhbmRsZS5jcHAgYi9tZWRpYS9tdHAvTXRwRmZzSGFuZGxlLmNwcAppbmRleCA5MTM5OTI1Li5mMjVmYzcxIDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwRmZzSGFuZGxlLmNwcAorKysgYi9tZWRpYS9tdHAvTXRwRmZzSGFuZGxlLmNwcApAQCAtMTYsMzA2ICsxNiwzOSBAQAogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGFzeW5jaW8vQXN5bmNJTy5oPgogI2luY2x1ZGUgPGRpcmVudC5oPgogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxsaW51eC91c2IvY2g5Lmg+Ci0jaW5jbHVkZSA8bGludXgvdXNiL2Z1bmN0aW9uZnMuaD4KLSNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzeXMvZW5kaWFuLmg+CisjaW5jbHVkZSA8c3lzL2V2ZW50ZmQuaD4KICNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KICNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy9wb2xsLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDx2ZWN0b3I+CiAKLSNpbmNsdWRlICJBc3luY0lPLmgiCisjaW5jbHVkZSAiUG9zaXhBc3luY0lPLmgiCisjaW5jbHVkZSAiTXRwRGVzY3JpcHRvcnMuaCIKICNpbmNsdWRlICJNdHBGZnNIYW5kbGUuaCIKICNpbmNsdWRlICJtdHAuaCIKIAotI2RlZmluZSBjcHVfdG9fbGUxNih4KSAgaHRvbGUxNih4KQotI2RlZmluZSBjcHVfdG9fbGUzMih4KSAgaHRvbGUzMih4KQotCi0jZGVmaW5lIEZVTkNUSU9ORlNfRU5EUE9JTlRfQUxMT0MgICAgICAgX0lPUignZycsIDIzMSwgX191MzIpCi0KIG5hbWVzcGFjZSB7CiAKLWNvbnN0ZXhwciBjaGFyIEZGU19NVFBfRVBfSU5bXSA9ICIvZGV2L3VzYi1mZnMvbXRwL2VwMSI7Ci1jb25zdGV4cHIgY2hhciBGRlNfTVRQX0VQX09VVFtdID0gIi9kZXYvdXNiLWZmcy9tdHAvZXAyIjsKLWNvbnN0ZXhwciBjaGFyIEZGU19NVFBfRVBfSU5UUltdID0gIi9kZXYvdXNiLWZmcy9tdHAvZXAzIjsKLQotY29uc3RleHByIGludCBNQVhfUEFDS0VUX1NJWkVfRlMgPSA2NDsKLWNvbnN0ZXhwciBpbnQgTUFYX1BBQ0tFVF9TSVpFX0hTID0gNTEyOwotY29uc3RleHByIGludCBNQVhfUEFDS0VUX1NJWkVfU1MgPSAxMDI0OwotCi0vLyBNdXN0IGJlIGRpdmlzaWJsZSBieSBhbGwgbWF4IHBhY2tldCBzaXplIHZhbHVlcwotY29uc3RleHByIGludCBNQVhfRklMRV9DSFVOS19TSVpFID0gMzE0NTcyODsKLQotLy8gU2FmZSB2YWx1ZXMgc2luY2Ugc29tZSBkZXZpY2VzIGNhbm5vdCBoYW5kbGUgbGFyZ2UgRE1BcwotLy8gVG8gZ2V0IGdvb2QgcGVyZm9ybWFuY2UsIG92ZXJyaWRlIHRoZXNlIHdpdGgKLS8vIGhpZ2hlciB2YWx1ZXMgcGVyIGRldmljZSB1c2luZyB0aGUgcHJvcGVydGllcwotLy8gc3lzLnVzYi5mZnMubWF4X3JlYWQgYW5kIHN5cy51c2IuZmZzLm1heF93cml0ZQotY29uc3RleHByIGludCBVU0JfRkZTX01BWF9XUklURSA9IE1UUF9CVUZGRVJfU0laRTsKLWNvbnN0ZXhwciBpbnQgVVNCX0ZGU19NQVhfUkVBRCA9IE1UUF9CVUZGRVJfU0laRTsKK2NvbnN0ZXhwciB1bnNpZ25lZCBBSU9fQlVGU19NQVggPSAxMjg7Citjb25zdGV4cHIgdW5zaWduZWQgQUlPX0JVRl9MRU4gPSAxNjM4NDsKIAogY29uc3RleHByIHVuc2lnbmVkIEZGU19OVU1fRVZFTlRTID0gNTsKIAotc3RhdGljX2Fzc2VydChVU0JfRkZTX01BWF9XUklURSA+IDAsICJNYXggci93IHZhbHVlcyBtdXN0IGJlID4gMCEiKTsKLXN0YXRpY19hc3NlcnQoVVNCX0ZGU19NQVhfUkVBRCA+IDAsICJNYXggci93IHZhbHVlcyBtdXN0IGJlID4gMCEiKTsKK2NvbnN0ZXhwciB1bnNpZ25lZCBNQVhfRklMRV9DSFVOS19TSVpFID0gQUlPX0JVRlNfTUFYICogQUlPX0JVRl9MRU47CiAKLWNvbnN0ZXhwciB1bnNpZ25lZCBpbnQgTUFYX01UUF9GSUxFX1NJWkUgPSAweEZGRkZGRkZGOworY29uc3RleHByIHVpbnQzMl90IE1BWF9NVFBfRklMRV9TSVpFID0gMHhGRkZGRkZGRjsKIAotY29uc3RleHByIHNpemVfdCBFTkRQT0lOVF9BTExPQ19SRVRSSUVTID0gMTA7Ci0KLXN0cnVjdCBmdW5jX2Rlc2MgewotICAgIHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgaW50ZjsKLSAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3Jfbm9fYXVkaW8gc2luazsKLSAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3Jfbm9fYXVkaW8gc291cmNlOwotICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcl9ub19hdWRpbyBpbnRyOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotc3RydWN0IHNzX2Z1bmNfZGVzYyB7Ci0gICAgc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciBpbnRmOwotICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcl9ub19hdWRpbyBzaW5rOwotICAgIHN0cnVjdCB1c2Jfc3NfZXBfY29tcF9kZXNjcmlwdG9yIHNpbmtfY29tcDsKLSAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3Jfbm9fYXVkaW8gc291cmNlOwotICAgIHN0cnVjdCB1c2Jfc3NfZXBfY29tcF9kZXNjcmlwdG9yIHNvdXJjZV9jb21wOwotICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcl9ub19hdWRpbyBpbnRyOwotICAgIHN0cnVjdCB1c2Jfc3NfZXBfY29tcF9kZXNjcmlwdG9yIGludHJfY29tcDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCBkZXNjX3YxIHsKLSAgICBzdHJ1Y3QgdXNiX2Z1bmN0aW9uZnNfZGVzY3NfaGVhZF92MSB7Ci0gICAgICAgIF9fbGUzMiBtYWdpYzsKLSAgICAgICAgX19sZTMyIGxlbmd0aDsKLSAgICAgICAgX19sZTMyIGZzX2NvdW50OwotICAgICAgICBfX2xlMzIgaHNfY291bnQ7Ci0gICAgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBoZWFkZXI7Ci0gICAgc3RydWN0IGZ1bmNfZGVzYyBmc19kZXNjcywgaHNfZGVzY3M7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdHJ1Y3QgZGVzY192MiB7Ci0gICAgc3RydWN0IHVzYl9mdW5jdGlvbmZzX2Rlc2NzX2hlYWRfdjIgaGVhZGVyOwotICAgIC8vIFRoZSByZXN0IG9mIHRoZSBzdHJ1Y3R1cmUgZGVwZW5kcyBvbiB0aGUgZmxhZ3MgaW4gdGhlIGhlYWRlci4KLSAgICBfX2xlMzIgZnNfY291bnQ7Ci0gICAgX19sZTMyIGhzX2NvdW50OwotICAgIF9fbGUzMiBzc19jb3VudDsKLSAgICBfX2xlMzIgb3NfY291bnQ7Ci0gICAgc3RydWN0IGZ1bmNfZGVzYyBmc19kZXNjcywgaHNfZGVzY3M7Ci0gICAgc3RydWN0IHNzX2Z1bmNfZGVzYyBzc19kZXNjczsKLSAgICBzdHJ1Y3QgdXNiX29zX2Rlc2NfaGVhZGVyIG9zX2hlYWRlcjsKLSAgICBzdHJ1Y3QgdXNiX2V4dF9jb21wYXRfZGVzYyBvc19kZXNjOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotY29uc3Qgc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciBtdHBfaW50ZXJmYWNlX2Rlc2MgPSB7Ci0gICAgLmJMZW5ndGggPSBVU0JfRFRfSU5URVJGQUNFX1NJWkUsCi0gICAgLmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9JTlRFUkZBQ0UsCi0gICAgLmJJbnRlcmZhY2VOdW1iZXIgPSAwLAotICAgIC5iTnVtRW5kcG9pbnRzID0gMywKLSAgICAuYkludGVyZmFjZUNsYXNzID0gVVNCX0NMQVNTX1NUSUxMX0lNQUdFLAotICAgIC5iSW50ZXJmYWNlU3ViQ2xhc3MgPSAxLAotICAgIC5iSW50ZXJmYWNlUHJvdG9jb2wgPSAxLAotICAgIC5pSW50ZXJmYWNlID0gMSwKLX07Ci0KLWNvbnN0IHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgcHRwX2ludGVyZmFjZV9kZXNjID0gewotICAgIC5iTGVuZ3RoID0gVVNCX0RUX0lOVEVSRkFDRV9TSVpFLAotICAgIC5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfSU5URVJGQUNFLAotICAgIC5iSW50ZXJmYWNlTnVtYmVyID0gMCwKLSAgICAuYk51bUVuZHBvaW50cyA9IDMsCi0gICAgLmJJbnRlcmZhY2VDbGFzcyA9IFVTQl9DTEFTU19TVElMTF9JTUFHRSwKLSAgICAuYkludGVyZmFjZVN1YkNsYXNzID0gMSwKLSAgICAuYkludGVyZmFjZVByb3RvY29sID0gMSwKLX07Ci0KLWNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcl9ub19hdWRpbyBmc19zaW5rID0gewotICAgIC5iTGVuZ3RoID0gVVNCX0RUX0VORFBPSU5UX1NJWkUsCi0gICAgLmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9FTkRQT0lOVCwKLSAgICAuYkVuZHBvaW50QWRkcmVzcyA9IDEgfCBVU0JfRElSX0lOLAotICAgIC5ibUF0dHJpYnV0ZXMgPSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLLAotICAgIC53TWF4UGFja2V0U2l6ZSA9IE1BWF9QQUNLRVRfU0laRV9GUywKLX07Ci0KLWNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcl9ub19hdWRpbyBmc19zb3VyY2UgPSB7Ci0gICAgLmJMZW5ndGggPSBVU0JfRFRfRU5EUE9JTlRfU0laRSwKLSAgICAuYkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX0VORFBPSU5ULAotICAgIC5iRW5kcG9pbnRBZGRyZXNzID0gMiB8IFVTQl9ESVJfT1VULAotICAgIC5ibUF0dHJpYnV0ZXMgPSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLLAotICAgIC53TWF4UGFja2V0U2l6ZSA9IE1BWF9QQUNLRVRfU0laRV9GUywKLX07Ci0KLWNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcl9ub19hdWRpbyBmc19pbnRyID0gewotICAgIC5iTGVuZ3RoID0gVVNCX0RUX0VORFBPSU5UX1NJWkUsCi0gICAgLmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9FTkRQT0lOVCwKLSAgICAuYkVuZHBvaW50QWRkcmVzcyA9IDMgfCBVU0JfRElSX0lOLAotICAgIC5ibUF0dHJpYnV0ZXMgPSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQsCi0gICAgLndNYXhQYWNrZXRTaXplID0gTUFYX1BBQ0tFVF9TSVpFX0ZTLAotICAgIC5iSW50ZXJ2YWwgPSA2LAotfTsKLQotY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yX25vX2F1ZGlvIGhzX3NpbmsgPSB7Ci0gICAgLmJMZW5ndGggPSBVU0JfRFRfRU5EUE9JTlRfU0laRSwKLSAgICAuYkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX0VORFBPSU5ULAotICAgIC5iRW5kcG9pbnRBZGRyZXNzID0gMSB8IFVTQl9ESVJfSU4sCi0gICAgLmJtQXR0cmlidXRlcyA9IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEssCi0gICAgLndNYXhQYWNrZXRTaXplID0gTUFYX1BBQ0tFVF9TSVpFX0hTLAotfTsKLQotY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yX25vX2F1ZGlvIGhzX3NvdXJjZSA9IHsKLSAgICAuYkxlbmd0aCA9IFVTQl9EVF9FTkRQT0lOVF9TSVpFLAotICAgIC5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfRU5EUE9JTlQsCi0gICAgLmJFbmRwb2ludEFkZHJlc3MgPSAyIHwgVVNCX0RJUl9PVVQsCi0gICAgLmJtQXR0cmlidXRlcyA9IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEssCi0gICAgLndNYXhQYWNrZXRTaXplID0gTUFYX1BBQ0tFVF9TSVpFX0hTLAotfTsKLQotY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yX25vX2F1ZGlvIGhzX2ludHIgPSB7Ci0gICAgLmJMZW5ndGggPSBVU0JfRFRfRU5EUE9JTlRfU0laRSwKLSAgICAuYkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX0VORFBPSU5ULAotICAgIC5iRW5kcG9pbnRBZGRyZXNzID0gMyB8IFVTQl9ESVJfSU4sCi0gICAgLmJtQXR0cmlidXRlcyA9IFVTQl9FTkRQT0lOVF9YRkVSX0lOVCwKLSAgICAud01heFBhY2tldFNpemUgPSBNQVhfUEFDS0VUX1NJWkVfSFMsCi0gICAgLmJJbnRlcnZhbCA9IDYsCi19OwotCi1jb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3Jfbm9fYXVkaW8gc3Nfc2luayA9IHsKLSAgICAuYkxlbmd0aCA9IFVTQl9EVF9FTkRQT0lOVF9TSVpFLAotICAgIC5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfRU5EUE9JTlQsCi0gICAgLmJFbmRwb2ludEFkZHJlc3MgPSAxIHwgVVNCX0RJUl9JTiwKLSAgICAuYm1BdHRyaWJ1dGVzID0gVVNCX0VORFBPSU5UX1hGRVJfQlVMSywKLSAgICAud01heFBhY2tldFNpemUgPSBNQVhfUEFDS0VUX1NJWkVfU1MsCi19OwotCi1jb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3Jfbm9fYXVkaW8gc3Nfc291cmNlID0gewotICAgIC5iTGVuZ3RoID0gVVNCX0RUX0VORFBPSU5UX1NJWkUsCi0gICAgLmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9FTkRQT0lOVCwKLSAgICAuYkVuZHBvaW50QWRkcmVzcyA9IDIgfCBVU0JfRElSX09VVCwKLSAgICAuYm1BdHRyaWJ1dGVzID0gVVNCX0VORFBPSU5UX1hGRVJfQlVMSywKLSAgICAud01heFBhY2tldFNpemUgPSBNQVhfUEFDS0VUX1NJWkVfU1MsCi19OwotCi1jb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3Jfbm9fYXVkaW8gc3NfaW50ciA9IHsKLSAgICAuYkxlbmd0aCA9IFVTQl9EVF9FTkRQT0lOVF9TSVpFLAotICAgIC5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfRU5EUE9JTlQsCi0gICAgLmJFbmRwb2ludEFkZHJlc3MgPSAzIHwgVVNCX0RJUl9JTiwKLSAgICAuYm1BdHRyaWJ1dGVzID0gVVNCX0VORFBPSU5UX1hGRVJfSU5ULAotICAgIC53TWF4UGFja2V0U2l6ZSA9IE1BWF9QQUNLRVRfU0laRV9TUywKLSAgICAuYkludGVydmFsID0gNiwKLX07Ci0KLWNvbnN0IHN0cnVjdCB1c2Jfc3NfZXBfY29tcF9kZXNjcmlwdG9yIHNzX3NpbmtfY29tcCA9IHsKLSAgICAuYkxlbmd0aCA9IHNpemVvZihzc19zaW5rX2NvbXApLAotICAgIC5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfU1NfRU5EUE9JTlRfQ09NUCwKLSAgICAuYk1heEJ1cnN0ID0gNiwKLX07Ci0KLWNvbnN0IHN0cnVjdCB1c2Jfc3NfZXBfY29tcF9kZXNjcmlwdG9yIHNzX3NvdXJjZV9jb21wID0gewotICAgIC5iTGVuZ3RoID0gc2l6ZW9mKHNzX3NvdXJjZV9jb21wKSwKLSAgICAuYkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX1NTX0VORFBPSU5UX0NPTVAsCi0gICAgLmJNYXhCdXJzdCA9IDYsCi19OwotCi1jb25zdCBzdHJ1Y3QgdXNiX3NzX2VwX2NvbXBfZGVzY3JpcHRvciBzc19pbnRyX2NvbXAgPSB7Ci0gICAgLmJMZW5ndGggPSBzaXplb2Yoc3NfaW50cl9jb21wKSwKLSAgICAuYkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX1NTX0VORFBPSU5UX0NPTVAsCi19OwotCi1jb25zdCBzdHJ1Y3QgZnVuY19kZXNjIG10cF9mc19kZXNjcmlwdG9ycyA9IHsKLSAgICAuaW50ZiA9IG10cF9pbnRlcmZhY2VfZGVzYywKLSAgICAuc2luayA9IGZzX3NpbmssCi0gICAgLnNvdXJjZSA9IGZzX3NvdXJjZSwKLSAgICAuaW50ciA9IGZzX2ludHIsCi19OwotCi1jb25zdCBzdHJ1Y3QgZnVuY19kZXNjIG10cF9oc19kZXNjcmlwdG9ycyA9IHsKLSAgICAuaW50ZiA9IG10cF9pbnRlcmZhY2VfZGVzYywKLSAgICAuc2luayA9IGhzX3NpbmssCi0gICAgLnNvdXJjZSA9IGhzX3NvdXJjZSwKLSAgICAuaW50ciA9IGhzX2ludHIsCi19OwotCi1jb25zdCBzdHJ1Y3Qgc3NfZnVuY19kZXNjIG10cF9zc19kZXNjcmlwdG9ycyA9IHsKLSAgICAuaW50ZiA9IG10cF9pbnRlcmZhY2VfZGVzYywKLSAgICAuc2luayA9IHNzX3NpbmssCi0gICAgLnNpbmtfY29tcCA9IHNzX3NpbmtfY29tcCwKLSAgICAuc291cmNlID0gc3Nfc291cmNlLAotICAgIC5zb3VyY2VfY29tcCA9IHNzX3NvdXJjZV9jb21wLAotICAgIC5pbnRyID0gc3NfaW50ciwKLSAgICAuaW50cl9jb21wID0gc3NfaW50cl9jb21wLAotfTsKLQotY29uc3Qgc3RydWN0IGZ1bmNfZGVzYyBwdHBfZnNfZGVzY3JpcHRvcnMgPSB7Ci0gICAgLmludGYgPSBwdHBfaW50ZXJmYWNlX2Rlc2MsCi0gICAgLnNpbmsgPSBmc19zaW5rLAotICAgIC5zb3VyY2UgPSBmc19zb3VyY2UsCi0gICAgLmludHIgPSBmc19pbnRyLAotfTsKLQotY29uc3Qgc3RydWN0IGZ1bmNfZGVzYyBwdHBfaHNfZGVzY3JpcHRvcnMgPSB7Ci0gICAgLmludGYgPSBwdHBfaW50ZXJmYWNlX2Rlc2MsCi0gICAgLnNpbmsgPSBoc19zaW5rLAotICAgIC5zb3VyY2UgPSBoc19zb3VyY2UsCi0gICAgLmludHIgPSBoc19pbnRyLAotfTsKLQotY29uc3Qgc3RydWN0IHNzX2Z1bmNfZGVzYyBwdHBfc3NfZGVzY3JpcHRvcnMgPSB7Ci0gICAgLmludGYgPSBwdHBfaW50ZXJmYWNlX2Rlc2MsCi0gICAgLnNpbmsgPSBzc19zaW5rLAotICAgIC5zaW5rX2NvbXAgPSBzc19zaW5rX2NvbXAsCi0gICAgLnNvdXJjZSA9IHNzX3NvdXJjZSwKLSAgICAuc291cmNlX2NvbXAgPSBzc19zb3VyY2VfY29tcCwKLSAgICAuaW50ciA9IHNzX2ludHIsCi0gICAgLmludHJfY29tcCA9IHNzX2ludHJfY29tcCwKLX07Ci0KLSNkZWZpbmUgU1RSX0lOVEVSRkFDRSAiTVRQIgotY29uc3Qgc3RydWN0IHsKLSAgICBzdHJ1Y3QgdXNiX2Z1bmN0aW9uZnNfc3RyaW5nc19oZWFkIGhlYWRlcjsKLSAgICBzdHJ1Y3QgewotICAgICAgICBfX2xlMTYgY29kZTsKLSAgICAgICAgY29uc3QgY2hhciBzdHIxW3NpemVvZihTVFJfSU5URVJGQUNFKV07Ci0gICAgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBsYW5nMDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgc3RyaW5ncyA9IHsKLSAgICAuaGVhZGVyID0gewotICAgICAgICAubWFnaWMgPSBjcHVfdG9fbGUzMihGVU5DVElPTkZTX1NUUklOR1NfTUFHSUMpLAotICAgICAgICAubGVuZ3RoID0gY3B1X3RvX2xlMzIoc2l6ZW9mKHN0cmluZ3MpKSwKLSAgICAgICAgLnN0cl9jb3VudCA9IGNwdV90b19sZTMyKDEpLAotICAgICAgICAubGFuZ19jb3VudCA9IGNwdV90b19sZTMyKDEpLAotICAgIH0sCi0gICAgLmxhbmcwID0gewotICAgICAgICAuY29kZSA9IGNwdV90b19sZTE2KDB4MDQwOSksCi0gICAgICAgIC5zdHIxID0gU1RSX0lOVEVSRkFDRSwKLSAgICB9LAotfTsKLQotc3RydWN0IHVzYl9vc19kZXNjX2hlYWRlciBtdHBfb3NfZGVzY19oZWFkZXIgPSB7Ci0gICAgLmludGVyZmFjZSA9IGh0b2xlMzIoMSksCi0gICAgLmR3TGVuZ3RoID0gaHRvbGUzMihzaXplb2YodXNiX29zX2Rlc2NfaGVhZGVyKSArIHNpemVvZih1c2JfZXh0X2NvbXBhdF9kZXNjKSksCi0gICAgLmJjZFZlcnNpb24gPSBodG9sZTE2KDEpLAotICAgIC53SW5kZXggPSBodG9sZTE2KDQpLAotICAgIC5iQ291bnQgPSBodG9sZTE2KDEpLAotICAgIC5SZXNlcnZlZCA9IGh0b2xlMTYoMCksCi19OwotCi1zdHJ1Y3QgdXNiX2V4dF9jb21wYXRfZGVzYyBtdHBfb3NfZGVzY19jb21wYXQgPSB7Ci0gICAgLmJGaXJzdEludGVyZmFjZU51bWJlciA9IDAsCi0gICAgLlJlc2VydmVkMSA9IGh0b2xlMzIoMSksCi0gICAgLkNvbXBhdGlibGVJRCA9IHsgJ00nLCAnVCcsICdQJyB9LAotICAgIC5TdWJDb21wYXRpYmxlSUQgPSB7MH0sCi0gICAgLlJlc2VydmVkMiA9IHswfSwKLX07Ci0KLXN0cnVjdCB1c2JfZXh0X2NvbXBhdF9kZXNjIHB0cF9vc19kZXNjX2NvbXBhdCA9IHsKLSAgICAuYkZpcnN0SW50ZXJmYWNlTnVtYmVyID0gMCwKLSAgICAuUmVzZXJ2ZWQxID0gaHRvbGUzMigxKSwKLSAgICAuQ29tcGF0aWJsZUlEID0geyAnUCcsICdUJywgJ1AnIH0sCi0gICAgLlN1YkNvbXBhdGlibGVJRCA9IHswfSwKLSAgICAuUmVzZXJ2ZWQyID0gezB9LAotfTsKK3N0cnVjdCB0aW1lc3BlYyBaRVJPX1RJTUVPVVQgPSB7IDAsIDAgfTsKIAogc3RydWN0IG10cF9kZXZpY2Vfc3RhdHVzIHsKICAgICB1aW50MTZfdCAgd0xlbmd0aDsKQEAgLTMyNiw5ICs1OSwxOSBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLU10cEZmc0hhbmRsZTo6TXRwRmZzSGFuZGxlKCkgOgotICAgIG1NYXhXcml0ZShVU0JfRkZTX01BWF9XUklURSksCi0gICAgbU1heFJlYWQoVVNCX0ZGU19NQVhfUkVBRCkge30KK2ludCBNdHBGZnNIYW5kbGU6OmdldFBhY2tldFNpemUoaW50IGZmc19mZCkgeworICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciBkZXNjOworICAgIGlmIChpb2N0bChmZnNfZmQsIEZVTkNUSU9ORlNfRU5EUE9JTlRfREVTQywgcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBsb25nPigmZGVzYykpKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJDb3VsZCBub3QgZ2V0IEZGUyBidWxrLWluIGRlc2NyaXB0b3IiOworICAgICAgICByZXR1cm4gTUFYX1BBQ0tFVF9TSVpFX0hTOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBkZXNjLndNYXhQYWNrZXRTaXplOworICAgIH0KK30KKworTXRwRmZzSGFuZGxlOjpNdHBGZnNIYW5kbGUoaW50IGNvbnRyb2xGZCkgeworICAgIG1Db250cm9sLnJlc2V0KGNvbnRyb2xGZCk7Cit9CiAKIE10cEZmc0hhbmRsZTo6fk10cEZmc0hhbmRsZSgpIHt9CiAKQEAgLTMzOCw3MyArODEsOTUgQEAKICAgICBtQnVsa091dC5yZXNldCgpOwogfQogCi1ib29sIE10cEZmc0hhbmRsZTo6aW5pdEZ1bmN0aW9uZnMoKSB7Ci0gICAgc3NpemVfdCByZXQ7Ci0gICAgc3RydWN0IGRlc2NfdjEgdjFfZGVzY3JpcHRvcjsKLSAgICBzdHJ1Y3QgZGVzY192MiB2Ml9kZXNjcmlwdG9yOwotCi0gICAgdjJfZGVzY3JpcHRvci5oZWFkZXIubWFnaWMgPSBjcHVfdG9fbGUzMihGVU5DVElPTkZTX0RFU0NSSVBUT1JTX01BR0lDX1YyKTsKLSAgICB2Ml9kZXNjcmlwdG9yLmhlYWRlci5sZW5ndGggPSBjcHVfdG9fbGUzMihzaXplb2YodjJfZGVzY3JpcHRvcikpOwotICAgIHYyX2Rlc2NyaXB0b3IuaGVhZGVyLmZsYWdzID0gRlVOQ1RJT05GU19IQVNfRlNfREVTQyB8IEZVTkNUSU9ORlNfSEFTX0hTX0RFU0MgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlVOQ1RJT05GU19IQVNfU1NfREVTQyB8IEZVTkNUSU9ORlNfSEFTX01TX09TX0RFU0M7Ci0gICAgdjJfZGVzY3JpcHRvci5mc19jb3VudCA9IDQ7Ci0gICAgdjJfZGVzY3JpcHRvci5oc19jb3VudCA9IDQ7Ci0gICAgdjJfZGVzY3JpcHRvci5zc19jb3VudCA9IDc7Ci0gICAgdjJfZGVzY3JpcHRvci5vc19jb3VudCA9IDE7Ci0gICAgdjJfZGVzY3JpcHRvci5mc19kZXNjcyA9IG1QdHAgPyBwdHBfZnNfZGVzY3JpcHRvcnMgOiBtdHBfZnNfZGVzY3JpcHRvcnM7Ci0gICAgdjJfZGVzY3JpcHRvci5oc19kZXNjcyA9IG1QdHAgPyBwdHBfaHNfZGVzY3JpcHRvcnMgOiBtdHBfaHNfZGVzY3JpcHRvcnM7Ci0gICAgdjJfZGVzY3JpcHRvci5zc19kZXNjcyA9IG1QdHAgPyBwdHBfc3NfZGVzY3JpcHRvcnMgOiBtdHBfc3NfZGVzY3JpcHRvcnM7Ci0gICAgdjJfZGVzY3JpcHRvci5vc19oZWFkZXIgPSBtdHBfb3NfZGVzY19oZWFkZXI7Ci0gICAgdjJfZGVzY3JpcHRvci5vc19kZXNjID0gbVB0cCA/IHB0cF9vc19kZXNjX2NvbXBhdCA6IG10cF9vc19kZXNjX2NvbXBhdDsKLQotICAgIGlmIChtQ29udHJvbCA8IDApIHsgLy8gbWlnaHQgaGF2ZSBhbHJlYWR5IGRvbmUgdGhpcyBiZWZvcmUKLSAgICAgICAgbUNvbnRyb2wucmVzZXQoVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4oRkZTX01UUF9FUDAsIE9fUkRXUikpKTsKLSAgICAgICAgaWYgKG1Db250cm9sIDwgMCkgewotICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgRkZTX01UUF9FUDAgPDwgIjogY2Fubm90IG9wZW4gY29udHJvbCBlbmRwb2ludCI7Ci0gICAgICAgICAgICBnb3RvIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIHJldCA9IFRFTVBfRkFJTFVSRV9SRVRSWSg6OndyaXRlKG1Db250cm9sLCAmdjJfZGVzY3JpcHRvciwgc2l6ZW9mKHYyX2Rlc2NyaXB0b3IpKSk7Ci0gICAgICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgICAgICB2MV9kZXNjcmlwdG9yLmhlYWRlci5tYWdpYyA9IGNwdV90b19sZTMyKEZVTkNUSU9ORlNfREVTQ1JJUFRPUlNfTUFHSUMpOwotICAgICAgICAgICAgdjFfZGVzY3JpcHRvci5oZWFkZXIubGVuZ3RoID0gY3B1X3RvX2xlMzIoc2l6ZW9mKHYxX2Rlc2NyaXB0b3IpKTsKLSAgICAgICAgICAgIHYxX2Rlc2NyaXB0b3IuaGVhZGVyLmZzX2NvdW50ID0gNDsKLSAgICAgICAgICAgIHYxX2Rlc2NyaXB0b3IuaGVhZGVyLmhzX2NvdW50ID0gNDsKLSAgICAgICAgICAgIHYxX2Rlc2NyaXB0b3IuZnNfZGVzY3MgPSBtUHRwID8gcHRwX2ZzX2Rlc2NyaXB0b3JzIDogbXRwX2ZzX2Rlc2NyaXB0b3JzOwotICAgICAgICAgICAgdjFfZGVzY3JpcHRvci5oc19kZXNjcyA9IG1QdHAgPyBwdHBfaHNfZGVzY3JpcHRvcnMgOiBtdHBfaHNfZGVzY3JpcHRvcnM7Ci0gICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCBGRlNfTVRQX0VQMCA8PCAiU3dpdGNoaW5nIHRvIFYxIGRlc2NyaXB0b3IgZm9ybWF0IjsKLSAgICAgICAgICAgIHJldCA9IFRFTVBfRkFJTFVSRV9SRVRSWSg6OndyaXRlKG1Db250cm9sLCAmdjFfZGVzY3JpcHRvciwgc2l6ZW9mKHYxX2Rlc2NyaXB0b3IpKSk7Ci0gICAgICAgICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8IEZGU19NVFBfRVAwIDw8ICJXcml0aW5nIGRlc2NyaXB0b3JzIGZhaWxlZCI7Ci0gICAgICAgICAgICAgICAgZ290byBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0ID0gVEVNUF9GQUlMVVJFX1JFVFJZKDo6d3JpdGUobUNvbnRyb2wsICZzdHJpbmdzLCBzaXplb2Yoc3RyaW5ncykpKTsKLSAgICAgICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgICAgIFBMT0coRVJST1IpIDw8IEZGU19NVFBfRVAwIDw8ICJXcml0aW5nIHN0cmluZ3MgZmFpbGVkIjsKLSAgICAgICAgICAgIGdvdG8gZXJyOworYm9vbCBNdHBGZnNIYW5kbGU6Om9wZW5FbmRwb2ludHMoYm9vbCBwdHApIHsKKyAgICBpZiAobUJ1bGtJbiA8IDApIHsKKyAgICAgICAgbUJ1bGtJbi5yZXNldChURU1QX0ZBSUxVUkVfUkVUUlkob3BlbihwdHAgPyBGRlNfUFRQX0VQX0lOIDogRkZTX01UUF9FUF9JTiwgT19SRFdSKSkpOworICAgICAgICBpZiAobUJ1bGtJbiA8IDApIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8IChwdHAgPyBGRlNfUFRQX0VQX0lOIDogRkZTX01UUF9FUF9JTikgPDwgIjogY2Fubm90IG9wZW4gYnVsayBpbiBlcCI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKG1CdWxrSW4gPiAtMSB8fCBtQnVsa091dCA+IC0xIHx8IG1JbnRyID4gLTEpCi0gICAgICAgIExPRyhXQVJOSU5HKSA8PCAiRW5kcG9pbnRzIHdlcmUgbm90IGNsb3NlZCBiZWZvcmUgY29uZmlndXJlISI7CiAKKyAgICBpZiAobUJ1bGtPdXQgPCAwKSB7CisgICAgICAgIG1CdWxrT3V0LnJlc2V0KFRFTVBfRkFJTFVSRV9SRVRSWShvcGVuKHB0cCA/IEZGU19QVFBfRVBfT1VUIDogRkZTX01UUF9FUF9PVVQsIE9fUkRXUikpKTsKKyAgICAgICAgaWYgKG1CdWxrT3V0IDwgMCkgeworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgKHB0cCA/IEZGU19QVFBfRVBfT1VUIDogRkZTX01UUF9FUF9PVVQpIDw8ICI6IGNhbm5vdCBvcGVuIGJ1bGsgb3V0IGVwIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtSW50ciA8IDApIHsKKyAgICAgICAgbUludHIucmVzZXQoVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4ocHRwID8gRkZTX1BUUF9FUF9JTlRSIDogRkZTX01UUF9FUF9JTlRSLCBPX1JEV1IpKSk7CisgICAgICAgIGlmIChtSW50ciA8IDApIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8IChwdHAgPyBGRlNfUFRQX0VQX0lOVFIgOiBGRlNfTVRQX0VQX0lOVFIpIDw8ICI6IGNhbm5vdCBvcGVuIGludHIgZXAiOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQogICAgIHJldHVybiB0cnVlOworfQogCi1lcnI6Ci0gICAgY2xvc2VDb25maWcoKTsKLSAgICByZXR1cm4gZmFsc2U7Cit2b2lkIE10cEZmc0hhbmRsZTo6YWR2aXNlKGludCBmZCkgeworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBOVU1fSU9fQlVGUzsgaSsrKSB7CisgICAgICAgIGlmIChwb3NpeF9tYWR2aXNlKG1Jb2J1ZltpXS5idWZzLmRhdGEoKSwgTUFYX0ZJTEVfQ0hVTktfU0laRSwKKyAgICAgICAgICAgICAgICBQT1NJWF9NQURWX1NFUVVFTlRJQUwgfCBQT1NJWF9NQURWX1dJTExORUVEKSA8IDApCisgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIG1hZHZpc2UiOworICAgIH0KKyAgICBpZiAocG9zaXhfZmFkdmlzZShmZCwgMCwgMCwKKyAgICAgICAgICAgICAgICBQT1NJWF9GQURWX1NFUVVFTlRJQUwgfCBQT1NJWF9GQURWX05PUkVVU0UgfCBQT1NJWF9GQURWX1dJTExORUVEKSA8IDApCisgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gZmFkdmlzZSI7Cit9CisKK2Jvb2wgTXRwRmZzSGFuZGxlOjp3cml0ZURlc2NyaXB0b3JzKGJvb2wgcHRwKSB7CisgICAgcmV0dXJuIDo6YW5kcm9pZDo6d3JpdGVEZXNjcmlwdG9ycyhtQ29udHJvbCwgcHRwKTsKIH0KIAogdm9pZCBNdHBGZnNIYW5kbGU6OmNsb3NlQ29uZmlnKCkgewogICAgIG1Db250cm9sLnJlc2V0KCk7CiB9CiAKLXZvaWQgTXRwRmZzSGFuZGxlOjpjb250cm9sTG9vcCgpIHsKLSAgICB3aGlsZSAoIWhhbmRsZUV2ZW50KCkpIHt9Ci0gICAgTE9HKERFQlVHKSA8PCAiTXRwIHNlcnZlciBzaHV0dGluZyBkb3duIjsKK2ludCBNdHBGZnNIYW5kbGU6OmRvQXN5bmModm9pZCogZGF0YSwgc2l6ZV90IGxlbiwgYm9vbCByZWFkLCBib29sIHplcm9fcGFja2V0KSB7CisgICAgc3RydWN0IGlvX2V2ZW50IGlvZXZzW0FJT19CVUZTX01BWF07CisgICAgc2l6ZV90IHRvdGFsID0gMDsKKworICAgIHdoaWxlICh0b3RhbCA8IGxlbikgeworICAgICAgICBzaXplX3QgdGhpc19sZW4gPSBzdGQ6Om1pbihsZW4gLSB0b3RhbCwgc3RhdGljX2Nhc3Q8c2l6ZV90PihBSU9fQlVGX0xFTiAqIEFJT19CVUZTX01BWCkpOworICAgICAgICBpbnQgbnVtX2J1ZnMgPSB0aGlzX2xlbiAvIEFJT19CVUZfTEVOICsgKHRoaXNfbGVuICUgQUlPX0JVRl9MRU4gPT0gMCA/IDAgOiAxKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fYnVmczsgaSsrKSB7CisgICAgICAgICAgICBtSW9idWZbMF0uYnVmW2ldID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBjaGFyKj4oZGF0YSkgKyB0b3RhbCArIGkgKiBBSU9fQlVGX0xFTjsKKyAgICAgICAgfQorICAgICAgICBpbnQgcmV0ID0gaW9idWZTdWJtaXQoJm1Jb2J1ZlswXSwgcmVhZCA/IG1CdWxrT3V0IDogbUJ1bGtJbiwgdGhpc19sZW4sIHJlYWQpOworICAgICAgICBpZiAocmV0IDwgMCkgcmV0dXJuIC0xOworICAgICAgICByZXQgPSB3YWl0RXZlbnRzKCZtSW9idWZbMF0sIHJldCwgaW9ldnMsIG51bGxwdHIpOworICAgICAgICBpZiAocmV0IDwgMCkgcmV0dXJuIC0xOworICAgICAgICB0b3RhbCArPSByZXQ7CisgICAgICAgIGlmIChzdGF0aWNfY2FzdDxzaXplX3Q+KHJldCkgPCB0aGlzX2xlbikgYnJlYWs7CisgICAgfQorCisgICAgaW50IHBhY2tldF9zaXplID0gZ2V0UGFja2V0U2l6ZShyZWFkID8gbUJ1bGtPdXQgOiBtQnVsa0luKTsKKyAgICBpZiAobGVuICUgcGFja2V0X3NpemUgPT0gMCAmJiB6ZXJvX3BhY2tldCkgeworICAgICAgICBpbnQgcmV0ID0gaW9idWZTdWJtaXQoJm1Jb2J1ZlswXSwgcmVhZCA/IG1CdWxrT3V0IDogbUJ1bGtJbiwgMCwgcmVhZCk7CisgICAgICAgIGlmIChyZXQgPCAwKSByZXR1cm4gLTE7CisgICAgICAgIHJldCA9IHdhaXRFdmVudHMoJm1Jb2J1ZlswXSwgcmV0LCBpb2V2cywgbnVsbHB0cik7CisgICAgICAgIGlmIChyZXQgPCAwKSByZXR1cm4gLTE7CisgICAgfQorCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IEFJT19CVUZTX01BWDsgaSsrKSB7CisgICAgICAgIG1Jb2J1ZlswXS5idWZbaV0gPSBtSW9idWZbMF0uYnVmcy5kYXRhKCkgKyBpICogQUlPX0JVRl9MRU47CisgICAgfQorICAgIHJldHVybiB0b3RhbDsKK30KKworaW50IE10cEZmc0hhbmRsZTo6cmVhZCh2b2lkKiBkYXRhLCBzaXplX3QgbGVuKSB7CisgICAgLy8gWmVybyBwYWNrZXRzIGFyZSBoYW5kbGVkIGJ5IHJlY2VpdmVGaWxlKCkKKyAgICByZXR1cm4gZG9Bc3luYyhkYXRhLCBsZW4sIHRydWUsIGZhbHNlKTsKK30KKworaW50IE10cEZmc0hhbmRsZTo6d3JpdGUoY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IGxlbikgeworICAgIHJldHVybiBkb0FzeW5jKGNvbnN0X2Nhc3Q8dm9pZCo+KGRhdGEpLCBsZW4sIGZhbHNlLCB0cnVlKTsKIH0KIAogaW50IE10cEZmc0hhbmRsZTo6aGFuZGxlRXZlbnQoKSB7CisKICAgICBzdGQ6OnZlY3Rvcjx1c2JfZnVuY3Rpb25mc19ldmVudD4gZXZlbnRzKEZGU19OVU1fRVZFTlRTKTsKICAgICB1c2JfZnVuY3Rpb25mc19ldmVudCAqZXZlbnQgPSBldmVudHMuZGF0YSgpOwogICAgIGludCBuYnl0ZXMgPSBURU1QX0ZBSUxVUkVfUkVUUlkoOjpyZWFkKG1Db250cm9sLCBldmVudCwKQEAgLTQxNywxMSArMTgyLDkgQEAKICAgICAgICAgc3dpdGNoIChldmVudC0+dHlwZSkgewogICAgICAgICBjYXNlIEZVTkNUSU9ORlNfQklORDoKICAgICAgICAgY2FzZSBGVU5DVElPTkZTX0VOQUJMRToKLSAgICAgICAgY2FzZSBGVU5DVElPTkZTX1JFU1VNRToKICAgICAgICAgICAgIHJldCA9IDA7CiAgICAgICAgICAgICBlcnJubyA9IDA7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGVU5DVElPTkZTX1NVU1BFTkQ6CiAgICAgICAgIGNhc2UgRlVOQ1RJT05GU19VTkJJTkQ6CiAgICAgICAgIGNhc2UgRlVOQ1RJT05GU19ESVNBQkxFOgogICAgICAgICAgICAgZXJybm8gPSBFU0hVVERPV047CkBAIC00MzEsOCArMTk0LDExIEBACiAgICAgICAgICAgICBpZiAoaGFuZGxlQ29udHJvbFJlcXVlc3QoJmV2ZW50LT51LnNldHVwKSA9PSAtMSkKICAgICAgICAgICAgICAgICByZXQgPSAtMTsKICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZVTkNUSU9ORlNfU1VTUEVORDoKKyAgICAgICAgY2FzZSBGVU5DVElPTkZTX1JFU1VNRToKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiTXRwIEV2ZW50ICIgPDwgZXZlbnQtPnR5cGUgPDwgIiAodW5rbm93bikiOworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTXRwIEV2ZW50ICIgPDwgZXZlbnQtPnR5cGUgPDwgIiAodW5rbm93bikiOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiByZXQ7CkBAIC00NDYsNDAxICsyMTIsNDQ1IEBACiAgICAgdWludDE2X3QgdmFsdWUgPSBzZXR1cC0+d1ZhbHVlOwogICAgIHN0ZDo6dmVjdG9yPGNoYXI+IGJ1ZjsKICAgICBidWYucmVzaXplKGxlbmd0aCk7CisgICAgaW50IHJldCA9IDA7CiAKICAgICBpZiAoISh0eXBlICYgVVNCX0RJUl9JTikpIHsKICAgICAgICAgaWYgKDo6cmVhZChtQ29udHJvbCwgYnVmLmRhdGEoKSwgbGVuZ3RoKSAhPSBsZW5ndGgpIHsKLSAgICAgICAgICAgIFBMT0coREVCVUcpIDw8ICJNdHAgZXJyb3IgY3RybHJlcSByZWFkIGRhdGEiOworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIk10cCBlcnJvciBjdHJscmVxIHJlYWQgZGF0YSI7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoKHR5cGUgJiBVU0JfVFlQRV9NQVNLKSA9PSBVU0JfVFlQRV9DTEFTUyAmJiBpbmRleCA9PSAwICYmIHZhbHVlID09IDApIHsKICAgICAgICAgc3dpdGNoKGNvZGUpIHsKKyAgICAgICAgY2FzZSBNVFBfUkVRX1JFU0VUOgorICAgICAgICBjYXNlIE1UUF9SRVFfQ0FOQ0VMOgorICAgICAgICAgICAgZXJybm8gPSBFQ0FOQ0VMRUQ7CisgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIE1UUF9SRVFfR0VUX0RFVklDRV9TVEFUVVM6CiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChsZW5ndGggPCBzaXplb2Yoc3RydWN0IG10cF9kZXZpY2Vfc3RhdHVzKSkgeworICAgICAgICAgICAgaWYgKGxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgbXRwX2RldmljZV9zdGF0dXMpICsgNCkgeworICAgICAgICAgICAgICAgIGVycm5vID0gRUlOVkFMOwogICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHN0cnVjdCBtdHBfZGV2aWNlX3N0YXR1cyAqc3QgPSByZWludGVycHJldF9jYXN0PHN0cnVjdCBtdHBfZGV2aWNlX3N0YXR1cyo+KGJ1Zi5kYXRhKCkpOwogICAgICAgICAgICAgc3QtPndMZW5ndGggPSBodG9sZTE2KHNpemVvZihzdCkpOwotICAgICAgICAgICAgc3QtPndDb2RlID0gTVRQX1JFU1BPTlNFX09LOworICAgICAgICAgICAgaWYgKG1DYW5jZWxlZCkgeworICAgICAgICAgICAgICAgIHN0LT53TGVuZ3RoICs9IDQ7CisgICAgICAgICAgICAgICAgc3QtPndDb2RlID0gTVRQX1JFU1BPTlNFX1RSQU5TQUNUSU9OX0NBTkNFTExFRDsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCAqZW5kcG9pbnRzID0gcmVpbnRlcnByZXRfY2FzdDx1aW50MTZfdCo+KHN0ICsgMSk7CisgICAgICAgICAgICAgICAgZW5kcG9pbnRzWzBdID0gaW9jdGwobUJ1bGtJbiwgRlVOQ1RJT05GU19FTkRQT0lOVF9SRVZNQVApOworICAgICAgICAgICAgICAgIGVuZHBvaW50c1sxXSA9IGlvY3RsKG1CdWxrT3V0LCBGVU5DVElPTkZTX0VORFBPSU5UX1JFVk1BUCk7CisgICAgICAgICAgICAgICAgbUNhbmNlbGVkID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0LT53Q29kZSA9IE1UUF9SRVNQT05TRV9PSzsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGxlbmd0aCA9IHN0LT53TGVuZ3RoOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIExPRyhERUJVRykgPDwgIlVucmVjb2duaXplZCBNdHAgY2xhc3MgcmVxdWVzdCEgIiA8PCBjb2RlOworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5yZWNvZ25pemVkIE10cCBjbGFzcyByZXF1ZXN0ISAiIDw8IGNvZGU7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBMT0coREVCVUcpIDw8ICJVbnJlY29nbml6ZWQgcmVxdWVzdCB0eXBlICIgPDwgdHlwZTsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5yZWNvZ25pemVkIHJlcXVlc3QgdHlwZSAiIDw8IHR5cGU7CiAgICAgfQogCiAgICAgaWYgKHR5cGUgJiBVU0JfRElSX0lOKSB7CiAgICAgICAgIGlmICg6OndyaXRlKG1Db250cm9sLCBidWYuZGF0YSgpLCBsZW5ndGgpICE9IGxlbmd0aCkgewotICAgICAgICAgICAgUExPRyhERUJVRykgPDwgIk10cCBlcnJvciBjdHJscmVxIHdyaXRlIGRhdGEiOworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIk10cCBlcnJvciBjdHJscmVxIHdyaXRlIGRhdGEiOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiAwOwogfQogCi1pbnQgTXRwRmZzSGFuZGxlOjp3cml0ZUhhbmRsZShpbnQgZmQsIGNvbnN0IHZvaWQqIGRhdGEsIGludCBsZW4pIHsKLSAgICBMT0coVkVSQk9TRSkgPDwgIk1UUCBhYm91dCB0byB3cml0ZSBmZCA9ICIgPDwgZmQgPDwgIiwgbGVuPSIgPDwgbGVuOwotICAgIGludCByZXQgPSAwOwotICAgIGNvbnN0IGNoYXIqIGJ1ZiA9IHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihkYXRhKTsKLSAgICB3aGlsZSAobGVuID4gMCkgewotICAgICAgICBpbnQgd3JpdGVfbGVuID0gc3RkOjptaW4obU1heFdyaXRlLCBsZW4pOwotICAgICAgICBpbnQgbiA9IFRFTVBfRkFJTFVSRV9SRVRSWSg6OndyaXRlKGZkLCBidWYsIHdyaXRlX2xlbikpOworaW50IE10cEZmc0hhbmRsZTo6c3RhcnQoYm9vbCBwdHApIHsKKyAgICBpZiAoIW9wZW5FbmRwb2ludHMocHRwKSkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0gICAgICAgIGlmIChuIDwgMCkgewotICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIndyaXRlIEVSUk9SOiBmZCA9ICIgPDwgZmQgPDwgIiwgbiA9ICIgPDwgbjsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfSBlbHNlIGlmIChuIDwgd3JpdGVfbGVuKSB7Ci0gICAgICAgICAgICBlcnJubyA9IEVJTzsKLSAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJsZXNzIHdyaXR0ZW4gdGhhbiBleHBlY3RlZCI7Ci0gICAgICAgICAgICByZXR1cm4gLTE7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE5VTV9JT19CVUZTOyBpKyspIHsKKyAgICAgICAgbUlvYnVmW2ldLmJ1ZnMucmVzaXplKE1BWF9GSUxFX0NIVU5LX1NJWkUpOworICAgICAgICBtSW9idWZbaV0uaW9jYi5yZXNpemUoQUlPX0JVRlNfTUFYKTsKKyAgICAgICAgbUlvYnVmW2ldLmlvY2JzLnJlc2l6ZShBSU9fQlVGU19NQVgpOworICAgICAgICBtSW9idWZbaV0uYnVmLnJlc2l6ZShBSU9fQlVGU19NQVgpOworICAgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgQUlPX0JVRlNfTUFYOyBqKyspIHsKKyAgICAgICAgICAgIG1Jb2J1ZltpXS5idWZbal0gPSBtSW9idWZbaV0uYnVmcy5kYXRhKCkgKyBqICogQUlPX0JVRl9MRU47CisgICAgICAgICAgICBtSW9idWZbaV0uaW9jYltqXSA9ICZtSW9idWZbaV0uaW9jYnNbal07CiAgICAgICAgIH0KLSAgICAgICAgYnVmICs9IG47Ci0gICAgICAgIGxlbiAtPSBuOwotICAgICAgICByZXQgKz0gbjsKICAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KIAotaW50IE10cEZmc0hhbmRsZTo6cmVhZEhhbmRsZShpbnQgZmQsIHZvaWQqIGRhdGEsIGludCBsZW4pIHsKLSAgICBMT0coVkVSQk9TRSkgPDwgIk1UUCBhYm91dCB0byByZWFkIGZkID0gIiA8PCBmZCA8PCAiLCBsZW49IiA8PCBsZW47Ci0gICAgaW50IHJldCA9IDA7Ci0gICAgY2hhciogYnVmID0gc3RhdGljX2Nhc3Q8Y2hhcio+KGRhdGEpOwotICAgIHdoaWxlIChsZW4gPiAwKSB7Ci0gICAgICAgIGludCByZWFkX2xlbiA9IHN0ZDo6bWluKG1NYXhSZWFkLCBsZW4pOwotICAgICAgICBpbnQgbiA9IFRFTVBfRkFJTFVSRV9SRVRSWSg6OnJlYWQoZmQsIGJ1ZiwgcmVhZF9sZW4pKTsKLSAgICAgICAgaWYgKG4gPCAwKSB7Ci0gICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAicmVhZCBFUlJPUjogZmQgPSAiIDw8IGZkIDw8ICIsIG4gPSAiIDw8IG47Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0ICs9IG47Ci0gICAgICAgIGlmIChuIDwgcmVhZF9sZW4pIC8vIGRvbmUgcmVhZGluZyBlYXJseQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGJ1ZiArPSBuOwotICAgICAgICBsZW4gLT0gbjsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotaW50IE10cEZmc0hhbmRsZTo6c3BsaWNlUmVhZEhhbmRsZShpbnQgZmQsIGludCBwaXBlX291dCwgaW50IGxlbikgewotICAgIExPRyhWRVJCT1NFKSA8PCAiTVRQIGFib3V0IHRvIHNwbGljZSByZWFkIGZkID0gIiA8PCBmZCA8PCAiLCBsZW49IiA8PCBsZW47Ci0gICAgaW50IHJldCA9IDA7Ci0gICAgbG9mZl90IGR1bW15b2ZmOwotICAgIHdoaWxlIChsZW4gPiAwKSB7Ci0gICAgICAgIGludCByZWFkX2xlbiA9IHN0ZDo6bWluKG1NYXhSZWFkLCBsZW4pOwotICAgICAgICBkdW1teW9mZiA9IDA7Ci0gICAgICAgIGludCBuID0gVEVNUF9GQUlMVVJFX1JFVFJZKHNwbGljZShmZCwgJmR1bW15b2ZmLCBwaXBlX291dCwgbnVsbHB0ciwgcmVhZF9sZW4sIDApKTsKLSAgICAgICAgaWYgKG4gPCAwKSB7Ci0gICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAic3BsaWNlIHJlYWQgRVJST1I6IGZkID0gIiA8PCBmZCA8PCAiLCBuID0gIiA8PCBuOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIHJldCArPSBuOwotICAgICAgICBpZiAobiA8IHJlYWRfbGVuKSAvLyBkb25lIHJlYWRpbmcgZWFybHkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBsZW4gLT0gbjsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotaW50IE10cEZmc0hhbmRsZTo6cmVhZCh2b2lkKiBkYXRhLCBpbnQgbGVuKSB7Ci0gICAgcmV0dXJuIHJlYWRIYW5kbGUobUJ1bGtPdXQsIGRhdGEsIGxlbik7Ci19Ci0KLWludCBNdHBGZnNIYW5kbGU6OndyaXRlKGNvbnN0IHZvaWQqIGRhdGEsIGludCBsZW4pIHsKLSAgICByZXR1cm4gd3JpdGVIYW5kbGUobUJ1bGtJbiwgZGF0YSwgbGVuKTsKLX0KLQotaW50IE10cEZmc0hhbmRsZTo6c3RhcnQoKSB7Ci0gICAgbUxvY2subG9jaygpOwotCi0gICAgbUJ1bGtJbi5yZXNldChURU1QX0ZBSUxVUkVfUkVUUlkob3BlbihGRlNfTVRQX0VQX0lOLCBPX1JEV1IpKSk7Ci0gICAgaWYgKG1CdWxrSW4gPCAwKSB7Ci0gICAgICAgIFBMT0coRVJST1IpIDw8IEZGU19NVFBfRVBfSU4gPDwgIjogY2Fubm90IG9wZW4gYnVsayBpbiBlcCI7CisgICAgbWVtc2V0KCZtQ3R4LCAwLCBzaXplb2YobUN0eCkpOworICAgIGlmIChpb19zZXR1cChBSU9fQlVGU19NQVgsICZtQ3R4KSA8IDApIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgInVuYWJsZSB0byBzZXR1cCBhaW8iOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQorICAgIG1FdmVudEZkLnJlc2V0KGV2ZW50ZmQoMCwgRUZEX05PTkJMT0NLKSk7CisgICAgbVBvbGxGZHNbMF0uZmQgPSBtQ29udHJvbDsKKyAgICBtUG9sbEZkc1swXS5ldmVudHMgPSBQT0xMSU47CisgICAgbVBvbGxGZHNbMV0uZmQgPSBtRXZlbnRGZDsKKyAgICBtUG9sbEZkc1sxXS5ldmVudHMgPSBQT0xMSU47CiAKLSAgICBtQnVsa091dC5yZXNldChURU1QX0ZBSUxVUkVfUkVUUlkob3BlbihGRlNfTVRQX0VQX09VVCwgT19SRFdSKSkpOwotICAgIGlmIChtQnVsa091dCA8IDApIHsKLSAgICAgICAgUExPRyhFUlJPUikgPDwgRkZTX01UUF9FUF9PVVQgPDwgIjogY2Fubm90IG9wZW4gYnVsayBvdXQgZXAiOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgbUludHIucmVzZXQoVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4oRkZTX01UUF9FUF9JTlRSLCBPX1JEV1IpKSk7Ci0gICAgaWYgKG1JbnRyIDwgMCkgewotICAgICAgICBQTE9HKEVSUk9SKSA8PCBGRlNfTVRQX0VQMCA8PCAiOiBjYW5ub3Qgb3BlbiBpbnRyIGVwIjsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIG1CdWZmZXIxLnJlc2l6ZShNQVhfRklMRV9DSFVOS19TSVpFKTsKLSAgICBtQnVmZmVyMi5yZXNpemUoTUFYX0ZJTEVfQ0hVTktfU0laRSk7Ci0gICAgcG9zaXhfbWFkdmlzZShtQnVmZmVyMS5kYXRhKCksIE1BWF9GSUxFX0NIVU5LX1NJWkUsCi0gICAgICAgICAgICBQT1NJWF9NQURWX1NFUVVFTlRJQUwgfCBQT1NJWF9NQURWX1dJTExORUVEKTsKLSAgICBwb3NpeF9tYWR2aXNlKG1CdWZmZXIyLmRhdGEoKSwgTUFYX0ZJTEVfQ0hVTktfU0laRSwKLSAgICAgICAgICAgIFBPU0lYX01BRFZfU0VRVUVOVElBTCB8IFBPU0lYX01BRFZfV0lMTE5FRUQpOwotCi0gICAgLy8gSGFuZGxlIGNvbnRyb2wgcmVxdWVzdHMuCi0gICAgc3RkOjp0aHJlYWQgdChbdGhpc10oKSB7IHRoaXMtPmNvbnRyb2xMb29wKCk7IH0pOwotICAgIHQuZGV0YWNoKCk7Ci0KLSAgICAvLyBHZXQgZGV2aWNlIHNwZWNpZmljIHIvdyBzaXplCi0gICAgbU1heFdyaXRlID0gYW5kcm9pZDo6YmFzZTo6R2V0SW50UHJvcGVydHkoInN5cy51c2IuZmZzLm1heF93cml0ZSIsIFVTQl9GRlNfTUFYX1dSSVRFKTsKLSAgICBtTWF4UmVhZCA9IGFuZHJvaWQ6OmJhc2U6OkdldEludFByb3BlcnR5KCJzeXMudXNiLmZmcy5tYXhfcmVhZCIsIFVTQl9GRlNfTUFYX1JFQUQpOwotCi0gICAgc2l6ZV90IGF0dGVtcHRzID0gMDsKLSAgICB3aGlsZSAobU1heFdyaXRlID49IFVTQl9GRlNfTUFYX1dSSVRFICYmIG1NYXhSZWFkID49IFVTQl9GRlNfTUFYX1JFQUQgJiYKLSAgICAgICAgICAgIGF0dGVtcHRzIDwgRU5EUE9JTlRfQUxMT0NfUkVUUklFUykgewotICAgICAgICAvLyBJZiBsYXJnZXIgY29udGlndW91cyBjaHVua3Mgb2YgbWVtb3J5IGFyZW4ndCBhdmFpbGFibGUsIGF0dGVtcHQgdG8gdHJ5Ci0gICAgICAgIC8vIHNtYWxsZXIgYWxsb2NhdGlvbnMuCi0gICAgICAgIGlmIChpb2N0bChtQnVsa0luLCBGVU5DVElPTkZTX0VORFBPSU5UX0FMTE9DLCBzdGF0aWNfY2FzdDxfX3UzMj4obU1heFdyaXRlKSkgfHwKLSAgICAgICAgICAgIGlvY3RsKG1CdWxrT3V0LCBGVU5DVElPTkZTX0VORFBPSU5UX0FMTE9DLCBzdGF0aWNfY2FzdDxfX3UzMj4obU1heFJlYWQpKSkgewotICAgICAgICAgICAgaWYgKGVycm5vID09IEVOT0RFVikgewotICAgICAgICAgICAgICAgIC8vIERyaXZlciBoYXNuJ3QgZW5hYmxlZCBlbmRwb2ludHMgeWV0LgotICAgICAgICAgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEwMCkpOwotICAgICAgICAgICAgICAgIGF0dGVtcHRzICs9IDE7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTWF4V3JpdGUgLz0gMjsKLSAgICAgICAgICAgIG1NYXhSZWFkIC89MjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgfQotICAgIC8vIFRyeSB0byBzdGFydCBNdHBTZXJ2ZXIgYW55d2F5LCB3aXRoIHRoZSBzbWFsbGVzdCBtYXggci93IHZhbHVlcwotICAgIFBMT0coRVJST1IpIDw8ICJGdW5jdGlvbmZzIGNvdWxkIG5vdCBhbGxvY2F0ZSBhbnkgbWVtb3J5ISI7CisgICAgbUNhbmNlbGVkID0gZmFsc2U7CiAgICAgcmV0dXJuIDA7CiB9CiAKLWludCBNdHBGZnNIYW5kbGU6OmNvbmZpZ3VyZShib29sIHVzZVB0cCkgewotICAgIC8vIFdhaXQgdGlsbCBwcmV2aW91cyBzZXJ2ZXIgaW52b2NhdGlvbiBoYXMgY2xvc2VkCi0gICAgaWYgKCFtTG9jay50cnlfbG9ja19mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygzMDApKSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJNdHBTZXJ2ZXIgd2FzIHVuYWJsZSB0byBnZXQgY29uZmlndXJlIGxvY2siOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGludCByZXQgPSAwOwotCi0gICAgLy8gSWYgcHRwIGlzIGNoYW5nZWQsIHRoZSBjb25maWd1cmF0aW9uIG11c3QgYmUgcmV3cml0dGVuCi0gICAgaWYgKG1QdHAgIT0gdXNlUHRwKSB7Ci0gICAgICAgIGNsb3NlRW5kcG9pbnRzKCk7Ci0gICAgICAgIGNsb3NlQ29uZmlnKCk7Ci0gICAgfQotICAgIG1QdHAgPSB1c2VQdHA7Ci0KLSAgICBpZiAoIWluaXRGdW5jdGlvbmZzKCkpIHsKLSAgICAgICAgcmV0ID0gLTE7Ci0gICAgfQotICAgIG1Mb2NrLnVubG9jaygpOwotICAgIHJldHVybiByZXQ7Ci19Ci0KIHZvaWQgTXRwRmZzSGFuZGxlOjpjbG9zZSgpIHsKKyAgICBpb19kZXN0cm95KG1DdHgpOwogICAgIGNsb3NlRW5kcG9pbnRzKCk7Ci0gICAgbUxvY2sudW5sb2NrKCk7CisgICAgY2xvc2VDb25maWcoKTsKIH0KIAotLyogUmVhZCBmcm9tIFVTQiBhbmQgd3JpdGUgdG8gYSBsb2NhbCBmaWxlLiAqLwotaW50IE10cEZmc0hhbmRsZTo6cmVjZWl2ZUZpbGUobXRwX2ZpbGVfcmFuZ2UgbWZyLCBib29sIHplcm9fcGFja2V0KSB7Ci0gICAgLy8gV2hlbiByZWNlaXZpbmcgZmlsZXMsIHRoZSBpbmNvbWluZyBsZW5ndGggaXMgZ2l2ZW4gaW4gMzIgYml0cy4KLSAgICAvLyBBID40RyBmaWxlIGlzIGdpdmVuIGFzIDB4RkZGRkZGRkYKLSAgICB1aW50MzJfdCBmaWxlX2xlbmd0aCA9IG1mci5sZW5ndGg7Ci0gICAgdWludDY0X3Qgb2Zmc2V0ID0gbWZyLm9mZnNldDsKLSAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgbUJ1bGtPdXRfZGVzYzsKLSAgICBpbnQgcGFja2V0X3NpemU7CitpbnQgTXRwRmZzSGFuZGxlOjp3YWl0RXZlbnRzKHN0cnVjdCBpb19idWZmZXIgKmJ1ZiwgaW50IG1pbl9ldmVudHMsIHN0cnVjdCBpb19ldmVudCAqZXZlbnRzLAorICAgICAgICBpbnQgKmNvdW50ZXIpIHsKKyAgICBpbnQgbnVtX2V2ZW50cyA9IDA7CisgICAgaW50IHJldCA9IDA7CisgICAgaW50IGVycm9yID0gMDsKIAotICAgIGlmIChpb2N0bChtQnVsa091dCwgRlVOQ1RJT05GU19FTkRQT0lOVF9ERVNDLCByZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGxvbmc+KCZtQnVsa091dF9kZXNjKSkpIHsKLSAgICAgICAgUExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCBnZXQgRkZTIGJ1bGstb3V0IGRlc2NyaXB0b3IiOwotICAgICAgICBwYWNrZXRfc2l6ZSA9IE1BWF9QQUNLRVRfU0laRV9IUzsKLSAgICB9IGVsc2UgewotICAgICAgICBwYWNrZXRfc2l6ZSA9IG1CdWxrT3V0X2Rlc2Mud01heFBhY2tldFNpemU7CisgICAgd2hpbGUgKG51bV9ldmVudHMgPCBtaW5fZXZlbnRzKSB7CisgICAgICAgIGlmIChwb2xsKG1Qb2xsRmRzLCAyLCAwKSA9PSAtMSkgeworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIk10cCBlcnJvciBkdXJpbmcgcG9sbCgpIjsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAobVBvbGxGZHNbMF0ucmV2ZW50cyAmIFBPTExJTikgeworICAgICAgICAgICAgbVBvbGxGZHNbMF0ucmV2ZW50cyA9IDA7CisgICAgICAgICAgICBpZiAoaGFuZGxlRXZlbnQoKSA9PSAtMSkgeworICAgICAgICAgICAgICAgIGVycm9yID0gZXJybm87CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Qb2xsRmRzWzFdLnJldmVudHMgJiBQT0xMSU4pIHsKKyAgICAgICAgICAgIG1Qb2xsRmRzWzFdLnJldmVudHMgPSAwOworICAgICAgICAgICAgdWludDY0X3QgZXZfY250ID0gMDsKKworICAgICAgICAgICAgaWYgKDo6cmVhZChtRXZlbnRGZCwgJmV2X2NudCwgc2l6ZW9mKGV2X2NudCkpID09IC0xKSB7CisgICAgICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIk10cCB1bmFibGUgdG8gcmVhZCBldmVudGZkIjsKKyAgICAgICAgICAgICAgICBlcnJvciA9IGVycm5vOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJdCdzIHBvc3NpYmxlIHRoYXQgaW9fZ2V0ZXZlbnRzIHdpbGwgcmV0dXJuIG1vcmUgZXZlbnRzIHRoYW4gdGhlIGV2ZW50RmQgcmVwb3J0ZWQsCisgICAgICAgICAgICAvLyBzaW5jZSBldmVudHMgbWF5IGFwcGVhciBpbiB0aGUgdGltZSBiZXR3ZWVuIHRoZSBjYWxscy4gSW4gdGhpcyBjYXNlLCB0aGUgZXZlbnRGZCB3aWxsCisgICAgICAgICAgICAvLyBzaG93IHVwIGFzIHJlYWRhYmxlIG5leHQgaXRlcmF0aW9uLCBidXQgdGhlcmUgd2lsbCBiZSBmZXdlciBvciBubyBldmVudHMgdG8gYWN0dWFsbHkKKyAgICAgICAgICAgIC8vIHdhaXQgZm9yLiBUaHVzIHdlIG5ldmVyIHdhbnQgaW9fZ2V0ZXZlbnRzIHRvIGJsb2NrLgorICAgICAgICAgICAgaW50IHRoaXNfZXZlbnRzID0gVEVNUF9GQUlMVVJFX1JFVFJZKGlvX2dldGV2ZW50cyhtQ3R4LCAwLCBBSU9fQlVGU19NQVgsIGV2ZW50cywgJlpFUk9fVElNRU9VVCkpOworICAgICAgICAgICAgaWYgKHRoaXNfZXZlbnRzID09IC0xKSB7CisgICAgICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIk10cCBlcnJvciBnZXR0aW5nIGV2ZW50cyI7CisgICAgICAgICAgICAgICAgZXJyb3IgPSBlcnJubzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEFkZCB1cCB0aGUgdG90YWwgYW1vdW50IG9mIGRhdGEgYW5kIGZpbmQgZXJyb3JzIG9uIHRoZSB3YXkuCisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHRoaXNfZXZlbnRzKTsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKGV2ZW50c1tqXS5yZXMgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGVycm5vID0gLWV2ZW50c1tqXS5yZXM7CisgICAgICAgICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJNdHAgZ290IGVycm9yIGV2ZW50IGF0ICIgPDwgaiA8PCAiIGFuZCAiIDw8IGJ1Zi0+YWN0dWFsIDw8ICIgdG90YWwiOworICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGVycm5vOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXQgKz0gZXZlbnRzW2pdLnJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG51bV9ldmVudHMgKz0gdGhpc19ldmVudHM7CisgICAgICAgICAgICBpZiAoY291bnRlcikKKyAgICAgICAgICAgICAgICAqY291bnRlciArPSB0aGlzX2V2ZW50czsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgICAgIGVycm5vID0gZXJyb3I7CisgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgTXRwRmZzSGFuZGxlOjpjYW5jZWxUcmFuc2FjdGlvbigpIHsKKyAgICAvLyBEZXZpY2UgY2FuY2VscyBieSBzdGFsbGluZyBib3RoIGJ1bGsgZW5kcG9pbnRzLgorICAgIGlmICg6OnJlYWQobUJ1bGtJbiwgbnVsbHB0ciwgMCkgIT0gLTEgfHwgZXJybm8gIT0gRUJBRE1TRykKKyAgICAgICAgUExPRyhFUlJPUikgPDwgIk10cCBzdGFsbCBmYWlsZWQgb24gYnVsayBpbiI7CisgICAgaWYgKDo6d3JpdGUobUJ1bGtPdXQsIG51bGxwdHIsIDApICE9IC0xIHx8IGVycm5vICE9IEVCQURNU0cpCisgICAgICAgIFBMT0coRVJST1IpIDw8ICJNdHAgc3RhbGwgZmFpbGVkIG9uIGJ1bGsgb3V0IjsKKyAgICBtQ2FuY2VsZWQgPSB0cnVlOworICAgIGVycm5vID0gRUNBTkNFTEVEOworfQorCitpbnQgTXRwRmZzSGFuZGxlOjpjYW5jZWxFdmVudHMoc3RydWN0IGlvY2IgKippb2NiLCBzdHJ1Y3QgaW9fZXZlbnQgKmV2ZW50cywgdW5zaWduZWQgc3RhcnQsCisgICAgICAgIHVuc2lnbmVkIGVuZCkgeworICAgIC8vIFNvbWUgbWFucGFnZXMgZm9yIGlvX2NhbmNlbCBhcmUgb3V0IG9mIGRhdGUgYW5kIGluY29ycmVjdC4KKyAgICAvLyBpb19jYW5jZWwgd2lsbCByZXR1cm4gLUVJTlBST0dSRVNTIG9uIHN1Y2Nlc3MgYW5kIGRvZXMKKyAgICAvLyBub3QgcGxhY2UgdGhlIGV2ZW50IGluIHRoZSBnaXZlbiBtZW1vcnkuIFdlIGhhdmUgdG8gdXNlCisgICAgLy8gaW9fZ2V0ZXZlbnRzIHRvIHdhaXQgZm9yIGFsbCB0aGUgZXZlbnRzIHdlIGNhbmNlbGxlZC4KKyAgICBpbnQgcmV0ID0gMDsKKyAgICB1bnNpZ25lZCBudW1fZXZlbnRzID0gMDsKKyAgICBpbnQgc2F2ZV9lcnJubyA9IGVycm5vOworICAgIGVycm5vID0gMDsKKworICAgIGZvciAodW5zaWduZWQgaiA9IHN0YXJ0OyBqIDwgZW5kOyBqKyspIHsKKyAgICAgICAgaWYgKGlvX2NhbmNlbChtQ3R4LCBpb2NiW2pdLCBudWxscHRyKSAhPSAtMSB8fCBlcnJubyAhPSBFSU5QUk9HUkVTUykgeworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIk10cCBjb3VsZG4ndCBjYW5jZWwgcmVxdWVzdCAiIDw8IGo7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBudW1fZXZlbnRzKys7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG51bV9ldmVudHMgIT0gZW5kIC0gc3RhcnQpIHsKKyAgICAgICAgcmV0ID0gLTE7CisgICAgICAgIGVycm5vID0gRUlPOworICAgIH0KKyAgICBpbnQgZXZzID0gVEVNUF9GQUlMVVJFX1JFVFJZKGlvX2dldGV2ZW50cyhtQ3R4LCBudW1fZXZlbnRzLCBBSU9fQlVGU19NQVgsIGV2ZW50cywgbnVsbHB0cikpOworICAgIGlmIChzdGF0aWNfY2FzdDx1bnNpZ25lZD4oZXZzKSAhPSBudW1fZXZlbnRzKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJNdHAgY291bGRuJ3QgY2FuY2VsIGFsbCByZXF1ZXN0cywgZ290ICIgPDwgZXZzOworICAgICAgICByZXQgPSAtMTsKICAgICB9CiAKLSAgICBjaGFyICpkYXRhID0gbUJ1ZmZlcjEuZGF0YSgpOwotICAgIGNoYXIgKmRhdGEyID0gbUJ1ZmZlcjIuZGF0YSgpOworICAgIHVpbnQ2NF90IGV2X2NudCA9IDA7CisgICAgaWYgKG51bV9ldmVudHMgJiYgOjpyZWFkKG1FdmVudEZkLCAmZXZfY250LCBzaXplb2YoZXZfY250KSkgPT0gLTEpCisgICAgICAgIFBMT0coRVJST1IpIDw8ICJNdHAgVW5hYmxlIHRvIHJlYWQgZXZlbnQgZmQiOworCisgICAgaWYgKHJldCA9PSAwKSB7CisgICAgICAgIC8vIFJlc3RvcmUgZXJybm8gc2luY2UgaXQgcHJvYmFibHkgZ290IG92ZXJyaWRlbiB3aXRoIEVJTlBST0dSRVNTLgorICAgICAgICBlcnJubyA9IHNhdmVfZXJybm87CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBNdHBGZnNIYW5kbGU6OmlvYnVmU3VibWl0KHN0cnVjdCBpb19idWZmZXIgKmJ1ZiwgaW50IGZkLCB1bnNpZ25lZCBsZW5ndGgsIGJvb2wgcmVhZCkgeworICAgIGludCByZXQgPSAwOworICAgIGJ1Zi0+YWN0dWFsID0gQUlPX0JVRlNfTUFYOworICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCBBSU9fQlVGU19NQVg7IGorKykgeworICAgICAgICB1bnNpZ25lZCBycV9sZW5ndGggPSBzdGQ6Om1pbihBSU9fQlVGX0xFTiwgbGVuZ3RoIC0gQUlPX0JVRl9MRU4gKiBqKTsKKyAgICAgICAgaW9fcHJlcChidWYtPmlvY2Jbal0sIGZkLCBidWYtPmJ1ZltqXSwgcnFfbGVuZ3RoLCAwLCByZWFkKTsKKyAgICAgICAgYnVmLT5pb2NiW2pdLT5haW9fZmxhZ3MgfD0gSU9DQl9GTEFHX1JFU0ZEOworICAgICAgICBidWYtPmlvY2Jbal0tPmFpb19yZXNmZCA9IG1FdmVudEZkOworCisgICAgICAgIC8vIE5vdCBlbm91Z2ggZGF0YSwgc28gdGFibGUgaXMgdHJ1bmNhdGVkLgorICAgICAgICBpZiAocnFfbGVuZ3RoIDwgQUlPX0JVRl9MRU4gfHwgbGVuZ3RoID09IEFJT19CVUZfTEVOICogKGogKyAxKSkgeworICAgICAgICAgICAgYnVmLT5hY3R1YWwgPSBqICsgMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0ID0gaW9fc3VibWl0KG1DdHgsIGJ1Zi0+YWN0dWFsLCBidWYtPmlvY2IuZGF0YSgpKTsKKyAgICBpZiAocmV0ICE9IHN0YXRpY19jYXN0PGludD4oYnVmLT5hY3R1YWwpKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJNdHAgaW9fc3VibWl0IGdvdCAiIDw8IHJldCA8PCAiIGV4cGVjdGVkICIgPDwgYnVmLT5hY3R1YWw7CisgICAgICAgIGlmIChyZXQgIT0gLTEpIHsKKyAgICAgICAgICAgIGVycm5vID0gRUlPOworICAgICAgICB9CisgICAgICAgIHJldCA9IC0xOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgTXRwRmZzSGFuZGxlOjpyZWNlaXZlRmlsZShtdHBfZmlsZV9yYW5nZSBtZnIsIGJvb2wgemVyb19wYWNrZXQpIHsKKyAgICAvLyBXaGVuIHJlY2VpdmluZyBmaWxlcywgdGhlIGluY29taW5nIGxlbmd0aCBpcyBnaXZlbiBpbiAzMiBiaXRzLgorICAgIC8vIEEgPj00RyBmaWxlIGlzIGdpdmVuIGFzIDB4RkZGRkZGRkYKKyAgICB1aW50MzJfdCBmaWxlX2xlbmd0aCA9IG1mci5sZW5ndGg7CisgICAgdWludDY0X3Qgb2Zmc2V0ID0gbWZyLm9mZnNldDsKIAogICAgIHN0cnVjdCBhaW9jYiBhaW87CiAgICAgYWlvLmFpb19maWxkZXMgPSBtZnIuZmQ7CiAgICAgYWlvLmFpb19idWYgPSBudWxscHRyOwogICAgIHN0cnVjdCBhaW9jYiAqYWlvbFtdID0geyZhaW99OwotICAgIGludCByZXQgPSAtMTsKLSAgICBzaXplX3QgbGVuZ3RoOwotICAgIGJvb2wgcmVhZCA9IGZhbHNlOwotICAgIGJvb2wgd3JpdGUgPSBmYWxzZTsKLSAgICBib29sIHNob3J0X3BhY2tldCA9IGZhbHNlOwogCi0gICAgcG9zaXhfZmFkdmlzZShtZnIuZmQsIDAsIDAsIFBPU0lYX0ZBRFZfU0VRVUVOVElBTCB8IFBPU0lYX0ZBRFZfTk9SRVVTRSk7CisgICAgaW50IHJldCA9IC0xOworICAgIHVuc2lnbmVkIGkgPSAwOworICAgIHNpemVfdCBsZW5ndGg7CisgICAgc3RydWN0IGlvX2V2ZW50IGlvZXZzW0FJT19CVUZTX01BWF07CisgICAgYm9vbCBoYXNfd3JpdGUgPSBmYWxzZTsKKyAgICBib29sIGVycm9yID0gZmFsc2U7CisgICAgYm9vbCB3cml0ZV9lcnJvciA9IGZhbHNlOworICAgIGludCBwYWNrZXRfc2l6ZSA9IGdldFBhY2tldFNpemUobUJ1bGtPdXQpOworICAgIGJvb2wgc2hvcnRfcGFja2V0ID0gZmFsc2U7CisgICAgYWR2aXNlKG1mci5mZCk7CiAKICAgICAvLyBCcmVhayBkb3duIHRoZSBmaWxlIGludG8gcGllY2VzIHRoYXQgZml0IGluIGJ1ZmZlcnMKLSAgICB3aGlsZSAoZmlsZV9sZW5ndGggPiAwIHx8IHdyaXRlKSB7CisgICAgd2hpbGUgKGZpbGVfbGVuZ3RoID4gMCB8fCBoYXNfd3JpdGUpIHsKKyAgICAgICAgLy8gUXVldWUgYW4gYXN5bmNocm9ub3VzIHJlYWQgZnJvbSBVU0IuCiAgICAgICAgIGlmIChmaWxlX2xlbmd0aCA+IDApIHsKICAgICAgICAgICAgIGxlbmd0aCA9IHN0ZDo6bWluKHN0YXRpY19jYXN0PHVpbnQzMl90PihNQVhfRklMRV9DSFVOS19TSVpFKSwgZmlsZV9sZW5ndGgpOwotCi0gICAgICAgICAgICAvLyBSZWFkIGRhdGEgZnJvbSBVU0IsIGhhbmRsZSBlcnJvcnMgYWZ0ZXIgd2FpdGluZyBmb3Igd3JpdGUgdGhyZWFkLgotICAgICAgICAgICAgcmV0ID0gcmVhZEhhbmRsZShtQnVsa091dCwgZGF0YSwgbGVuZ3RoKTsKLQotICAgICAgICAgICAgaWYgKGZpbGVfbGVuZ3RoICE9IE1BWF9NVFBfRklMRV9TSVpFICYmIHJldCA8IHN0YXRpY19jYXN0PGludD4obGVuZ3RoKSkgewotICAgICAgICAgICAgICAgIHJldCA9IC0xOwotICAgICAgICAgICAgICAgIGVycm5vID0gRUlPOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVhZCA9IHRydWU7CisgICAgICAgICAgICBpZiAoaW9idWZTdWJtaXQoJm1Jb2J1ZltpXSwgbUJ1bGtPdXQsIGxlbmd0aCwgdHJ1ZSkgPT0gLTEpCisgICAgICAgICAgICAgICAgZXJyb3IgPSB0cnVlOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHdyaXRlKSB7Ci0gICAgICAgICAgICAvLyBnZXQgdGhlIHJldHVybiBzdGF0dXMgb2YgdGhlIGxhc3Qgd3JpdGUgcmVxdWVzdAorICAgICAgICAvLyBHZXQgdGhlIHJldHVybiBzdGF0dXMgb2YgdGhlIGxhc3Qgd3JpdGUgcmVxdWVzdC4KKyAgICAgICAgaWYgKGhhc193cml0ZSkgewogICAgICAgICAgICAgYWlvX3N1c3BlbmQoYWlvbCwgMSwgbnVsbHB0cik7Ci0KICAgICAgICAgICAgIGludCB3cml0dGVuID0gYWlvX3JldHVybigmYWlvKTsKLSAgICAgICAgICAgIGlmICh3cml0dGVuID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgZXJybm8gPSBhaW9fZXJyb3IoJmFpbyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHN0YXRpY19jYXN0PHNpemVfdD4od3JpdHRlbikgPCBhaW8uYWlvX25ieXRlcykgewotICAgICAgICAgICAgICAgIGVycm5vID0gRUlPOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICBlcnJubyA9IHdyaXR0ZW4gPT0gLTEgPyBhaW9fZXJyb3IoJmFpbykgOiBFSU87CisgICAgICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIk10cCBlcnJvciB3cml0aW5nIHRvIGRpc2siOworICAgICAgICAgICAgICAgIHdyaXRlX2Vycm9yID0gdHJ1ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdyaXRlID0gZmFsc2U7CisgICAgICAgICAgICBoYXNfd3JpdGUgPSBmYWxzZTsKICAgICAgICAgfQogCi0gICAgICAgIC8vIElmIHRoZXJlIHdhcyBhbiBlcnJvciByZWFkaW5nIGFib3ZlCi0gICAgICAgIGlmIChyZXQgPT0gLTEpIHsKKyAgICAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAocmVhZCkgeworICAgICAgICAvLyBHZXQgdGhlIHJlc3VsdCBvZiB0aGUgcmVhZCByZXF1ZXN0LCBhbmQgcXVldWUgYSB3cml0ZSB0byBkaXNrLgorICAgICAgICBpZiAoZmlsZV9sZW5ndGggPiAwKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBudW1fZXZlbnRzID0gMDsKKyAgICAgICAgICAgIHJldCA9IDA7CisgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydF9pID0gbUlvYnVmW2ldLmFjdHVhbDsKKyAgICAgICAgICAgIHdoaWxlIChudW1fZXZlbnRzIDwgc2hvcnRfaSkgeworICAgICAgICAgICAgICAgIC8vIEdldCBhbGwgZXZlbnRzIHVwIHRvIHRoZSBzaG9ydCByZWFkLCBpZiB0aGVyZSBpcyBvbmUuCisgICAgICAgICAgICAgICAgLy8gV2UgbXVzdCB3YWl0IGZvciBlYWNoIGV2ZW50IHNpbmNlIGRhdGEgdHJhbnNmZXIgY291bGQgZW5kIGF0IGFueSB0aW1lLgorICAgICAgICAgICAgICAgIGludCB0aGlzX2V2ZW50cyA9IDA7CisgICAgICAgICAgICAgICAgaW50IGV2ZW50X3JldCA9IHdhaXRFdmVudHMoJm1Jb2J1ZltpXSwgMSwgaW9ldnMsICZ0aGlzX2V2ZW50cyk7CisgICAgICAgICAgICAgICAgbnVtX2V2ZW50cyArPSB0aGlzX2V2ZW50czsKKworICAgICAgICAgICAgICAgIGlmIChldmVudF9yZXQgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FuY2VsRXZlbnRzKG1Jb2J1ZltpXS5pb2NiLmRhdGEoKSwgaW9ldnMsIG51bV9ldmVudHMsIG1Jb2J1ZltpXS5hY3R1YWwpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldCArPSBldmVudF9yZXQ7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB0aGlzX2V2ZW50czsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHN0cnVjdCBpb19ldmVudCBjb250YWlucyBhIHBvaW50ZXIgdG8gdGhlIGFzc29jaWF0ZWQgc3RydWN0IGlvY2IgYXMgYSBfX3U2NC4KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRpY19jYXN0PF9fdTY0Pihpb2V2c1tqXS5yZXMpIDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHN0cnVjdCBpb2NiKj4oaW9ldnNbal0ub2JqKS0+YWlvX25ieXRlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UndmUgZm91bmQgYSBzaG9ydCBldmVudC4gU3RvcmUgdGhlIGluZGV4IHNpbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudHMgd29uJ3QgbmVjZXNzYXJpbHkgYXJyaXZlIGluIHRoZSBvcmRlciB0aGV5IGFyZSBxdWV1ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydF9pID0gKGlvZXZzW2pdLm9iaiAtIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3Q+KG1Jb2J1ZltpXS5pb2Nicy5kYXRhKCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gc2l6ZW9mKHN0cnVjdCBpb2NiKSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydF9wYWNrZXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNob3J0X3BhY2tldCkgeworICAgICAgICAgICAgICAgIGlmIChjYW5jZWxFdmVudHMobUlvYnVmW2ldLmlvY2IuZGF0YSgpLCBpb2V2cywgc2hvcnRfaSwgbUlvYnVmW2ldLmFjdHVhbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVfZXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChmaWxlX2xlbmd0aCA9PSBNQVhfTVRQX0ZJTEVfU0laRSkgewogICAgICAgICAgICAgICAgIC8vIEZvciBsYXJnZXIgZmlsZXMsIHJlY2VpdmUgdW50aWwgYSBzaG9ydCBwYWNrZXQgaXMgcmVjZWl2ZWQuCiAgICAgICAgICAgICAgICAgaWYgKHN0YXRpY19jYXN0PHNpemVfdD4ocmV0KSA8IGxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICBmaWxlX2xlbmd0aCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHNob3J0X3BhY2tldCA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChyZXQgPCBzdGF0aWNfY2FzdDxpbnQ+KGxlbmd0aCkpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiBmaWxlIGlzIGxlc3MgdGhhbiA0RyBhbmQgd2UgZ2V0IGEgc2hvcnQgcGFja2V0LCBpdCdzIGFuIGVycm9yLgorICAgICAgICAgICAgICAgIGVycm5vID0gRUlPOworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIk10cCBnb3QgdW5leHBlY3RlZCBzaG9ydCBwYWNrZXQiOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gUmVjZWl2ZSBhbiBlbXB0eSBwYWNrZXQgaWYgc2l6ZSBpcyBhIG11bHRpcGxlIG9mIHRoZSBlbmRwb2ludCBzaXplLgogICAgICAgICAgICAgICAgIGZpbGVfbGVuZ3RoIC09IHJldDsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHdyaXRlX2Vycm9yKSB7CisgICAgICAgICAgICAgICAgY2FuY2VsVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIC8vIEVucXVldWUgYSBuZXcgd3JpdGUgcmVxdWVzdAotICAgICAgICAgICAgYWlvLmFpb19idWYgPSBkYXRhOwotICAgICAgICAgICAgYWlvLmFpb19zaW5rID0gbWZyLmZkOwotICAgICAgICAgICAgYWlvLmFpb19vZmZzZXQgPSBvZmZzZXQ7Ci0gICAgICAgICAgICBhaW8uYWlvX25ieXRlcyA9IHJldDsKKyAgICAgICAgICAgIGFpb19wcmVwYXJlKCZhaW8sIG1Jb2J1ZltpXS5idWZzLmRhdGEoKSwgcmV0LCBvZmZzZXQpOwogICAgICAgICAgICAgYWlvX3dyaXRlKCZhaW8pOwogCiAgICAgICAgICAgICBvZmZzZXQgKz0gcmV0OwotICAgICAgICAgICAgc3RkOjpzd2FwKGRhdGEsIGRhdGEyKTsKLQotICAgICAgICAgICAgd3JpdGUgPSB0cnVlOwotICAgICAgICAgICAgcmVhZCA9IGZhbHNlOworICAgICAgICAgICAgaSA9IChpICsgMSkgJSBOVU1fSU9fQlVGUzsKKyAgICAgICAgICAgIGhhc193cml0ZSA9IHRydWU7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKChyZXQgJSBwYWNrZXRfc2l6ZSA9PSAwICYmICFzaG9ydF9wYWNrZXQpIHx8IHplcm9fcGFja2V0KSB7Ci0gICAgICAgIGlmIChURU1QX0ZBSUxVUkVfUkVUUlkoOjpyZWFkKG1CdWxrT3V0LCBkYXRhLCBwYWNrZXRfc2l6ZSkpICE9IDApIHsKKyAgICAgICAgLy8gUmVjZWl2ZSBhbiBlbXB0eSBwYWNrZXQgaWYgc2l6ZSBpcyBhIG11bHRpcGxlIG9mIHRoZSBlbmRwb2ludCBzaXplCisgICAgICAgIC8vIGFuZCB3ZSBkaWRuJ3QgYWxyZWFkeSBnZXQgYW4gZW1wdHkgcGFja2V0IGZyb20gdGhlIGhlYWRlciBvciBsYXJnZSBmaWxlLgorICAgICAgICBpZiAocmVhZChtSW9idWZbMF0uYnVmcy5kYXRhKCksIHBhY2tldF9zaXplKSAhPSAwKSB7CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIDA7CiB9CiAKLS8qIFJlYWQgZnJvbSBhIGxvY2FsIGZpbGUgYW5kIHNlbmQgb3ZlciBVU0IuICovCiBpbnQgTXRwRmZzSGFuZGxlOjpzZW5kRmlsZShtdHBfZmlsZV9yYW5nZSBtZnIpIHsKICAgICB1aW50NjRfdCBmaWxlX2xlbmd0aCA9IG1mci5sZW5ndGg7CiAgICAgdWludDMyX3QgZ2l2ZW5fbGVuZ3RoID0gc3RkOjptaW4oc3RhdGljX2Nhc3Q8dWludDY0X3Q+KE1BWF9NVFBfRklMRV9TSVpFKSwKICAgICAgICAgICAgIGZpbGVfbGVuZ3RoICsgc2l6ZW9mKG10cF9kYXRhX2hlYWRlcikpOwogICAgIHVpbnQ2NF90IG9mZnNldCA9IG1mci5vZmZzZXQ7Ci0gICAgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yIG1CdWxrSW5fZGVzYzsKLSAgICBpbnQgcGFja2V0X3NpemU7Ci0KLSAgICBpZiAoaW9jdGwobUJ1bGtJbiwgRlVOQ1RJT05GU19FTkRQT0lOVF9ERVNDLCByZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGxvbmc+KCZtQnVsa0luX2Rlc2MpKSkgewotICAgICAgICBQTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IGdldCBGRlMgYnVsay1pbiBkZXNjcmlwdG9yIjsKLSAgICAgICAgcGFja2V0X3NpemUgPSBNQVhfUEFDS0VUX1NJWkVfSFM7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcGFja2V0X3NpemUgPSBtQnVsa0luX2Rlc2Mud01heFBhY2tldFNpemU7Ci0gICAgfQorICAgIGludCBwYWNrZXRfc2l6ZSA9IGdldFBhY2tldFNpemUobUJ1bGtJbik7CiAKICAgICAvLyBJZiBmaWxlX2xlbmd0aCBpcyBsYXJnZXIgdGhhbiBhIHNpemVfdCwgdHJ1bmNhdGluZyB3b3VsZCBwcm9kdWNlIHRoZSB3cm9uZyBjb21wYXJpc29uLgogICAgIC8vIEluc3RlYWQsIHByb21vdGUgdGhlIGxlZnQgc2lkZSB0byA2NCBiaXRzLCB0aGVuIHRydW5jYXRlIHRoZSBzbWFsbCByZXN1bHQuCiAgICAgaW50IGluaXRfcmVhZF9sZW4gPSBzdGQ6Om1pbigKICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ2NF90PihwYWNrZXRfc2l6ZSAtIHNpemVvZihtdHBfZGF0YV9oZWFkZXIpKSwgZmlsZV9sZW5ndGgpOwogCi0gICAgY2hhciAqZGF0YSA9IG1CdWZmZXIxLmRhdGEoKTsKLSAgICBjaGFyICpkYXRhMiA9IG1CdWZmZXIyLmRhdGEoKTsKLQotICAgIHBvc2l4X2ZhZHZpc2UobWZyLmZkLCAwLCAwLCBQT1NJWF9GQURWX1NFUVVFTlRJQUwgfCBQT1NJWF9GQURWX05PUkVVU0UpOworICAgIGFkdmlzZShtZnIuZmQpOwogCiAgICAgc3RydWN0IGFpb2NiIGFpbzsKICAgICBhaW8uYWlvX2ZpbGRlcyA9IG1mci5mZDsKICAgICBzdHJ1Y3QgYWlvY2IgKmFpb2xbXSA9IHsmYWlvfTsKLSAgICBpbnQgcmV0LCBsZW5ndGg7Ci0gICAgaW50IGVycm9yID0gMDsKLSAgICBib29sIHJlYWQgPSBmYWxzZTsKLSAgICBib29sIHdyaXRlID0gZmFsc2U7CisgICAgaW50IHJldCA9IDA7CisgICAgaW50IGxlbmd0aCwgbnVtX3JlYWQ7CisgICAgdW5zaWduZWQgaSA9IDA7CisgICAgc3RydWN0IGlvX2V2ZW50IGlvZXZzW0FJT19CVUZTX01BWF07CisgICAgYm9vbCBlcnJvciA9IGZhbHNlOworICAgIGJvb2wgaGFzX3dyaXRlID0gZmFsc2U7CiAKICAgICAvLyBTZW5kIHRoZSBoZWFkZXIgZGF0YQotICAgIG10cF9kYXRhX2hlYWRlciAqaGVhZGVyID0gcmVpbnRlcnByZXRfY2FzdDxtdHBfZGF0YV9oZWFkZXIqPihkYXRhKTsKLSAgICBoZWFkZXItPmxlbmd0aCA9IF9fY3B1X3RvX2xlMzIoZ2l2ZW5fbGVuZ3RoKTsKLSAgICBoZWFkZXItPnR5cGUgPSBfX2NwdV90b19sZTE2KDIpOyAvKiBkYXRhIHBhY2tldCAqLwotICAgIGhlYWRlci0+Y29tbWFuZCA9IF9fY3B1X3RvX2xlMTYobWZyLmNvbW1hbmQpOwotICAgIGhlYWRlci0+dHJhbnNhY3Rpb25faWQgPSBfX2NwdV90b19sZTMyKG1mci50cmFuc2FjdGlvbl9pZCk7CisgICAgbXRwX2RhdGFfaGVhZGVyICpoZWFkZXIgPSByZWludGVycHJldF9jYXN0PG10cF9kYXRhX2hlYWRlcio+KG1Jb2J1ZlswXS5idWZzLmRhdGEoKSk7CisgICAgaGVhZGVyLT5sZW5ndGggPSBodG9sZTMyKGdpdmVuX2xlbmd0aCk7CisgICAgaGVhZGVyLT50eXBlID0gaHRvbGUxNigyKTsgLy8gZGF0YSBwYWNrZXQKKyAgICBoZWFkZXItPmNvbW1hbmQgPSBodG9sZTE2KG1mci5jb21tYW5kKTsKKyAgICBoZWFkZXItPnRyYW5zYWN0aW9uX2lkID0gaHRvbGUzMihtZnIudHJhbnNhY3Rpb25faWQpOwogCiAgICAgLy8gU29tZSBob3N0cyBkb24ndCBzdXBwb3J0IGhlYWRlci9kYXRhIHNlcGFyYXRpb24gZXZlbiB0aG91Z2ggTVRQIGFsbG93cyBpdAogICAgIC8vIEhhbmRsZSBieSBmaWxsaW5nIGZpcnN0IHBhY2tldCB3aXRoIGluaXRpYWwgZmlsZSBkYXRhCi0gICAgaWYgKFRFTVBfRkFJTFVSRV9SRVRSWShwcmVhZChtZnIuZmQsIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGRhdGEpICsKKyAgICBpZiAoVEVNUF9GQUlMVVJFX1JFVFJZKHByZWFkKG1mci5mZCwgbUlvYnVmWzBdLmJ1ZnMuZGF0YSgpICsKICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG10cF9kYXRhX2hlYWRlciksIGluaXRfcmVhZF9sZW4sIG9mZnNldCkpCiAgICAgICAgICAgICAhPSBpbml0X3JlYWRfbGVuKSByZXR1cm4gLTE7Ci0gICAgaWYgKHdyaXRlSGFuZGxlKG1CdWxrSW4sIGRhdGEsIHNpemVvZihtdHBfZGF0YV9oZWFkZXIpICsgaW5pdF9yZWFkX2xlbikgPT0gLTEpIHJldHVybiAtMTsKKyAgICBpZiAoZG9Bc3luYyhtSW9idWZbMF0uYnVmcy5kYXRhKCksIHNpemVvZihtdHBfZGF0YV9oZWFkZXIpICsgaW5pdF9yZWFkX2xlbiwKKyAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UgLyogemxwcyBhcmUgaGFuZGxlZCBiZWxvdyAqLykgPT0gLTEpCisgICAgICAgIHJldHVybiAtMTsKICAgICBmaWxlX2xlbmd0aCAtPSBpbml0X3JlYWRfbGVuOwogICAgIG9mZnNldCArPSBpbml0X3JlYWRfbGVuOwogICAgIHJldCA9IGluaXRfcmVhZF9sZW4gKyBzaXplb2YobXRwX2RhdGFfaGVhZGVyKTsKIAogICAgIC8vIEJyZWFrIGRvd24gdGhlIGZpbGUgaW50byBwaWVjZXMgdGhhdCBmaXQgaW4gYnVmZmVycwotICAgIHdoaWxlKGZpbGVfbGVuZ3RoID4gMCkgewotICAgICAgICBpZiAocmVhZCkgewotICAgICAgICAgICAgLy8gV2FpdCBmb3IgdGhlIHByZXZpb3VzIHJlYWQgdG8gZmluaXNoCi0gICAgICAgICAgICBhaW9fc3VzcGVuZChhaW9sLCAxLCBudWxscHRyKTsKLSAgICAgICAgICAgIHJldCA9IGFpb19yZXR1cm4oJmFpbyk7Ci0gICAgICAgICAgICBpZiAocmV0ID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgZXJybm8gPSBhaW9fZXJyb3IoJmFpbyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHN0YXRpY19jYXN0PHNpemVfdD4ocmV0KSA8IGFpby5haW9fbmJ5dGVzKSB7Ci0gICAgICAgICAgICAgICAgZXJybm8gPSBFSU87Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmaWxlX2xlbmd0aCAtPSByZXQ7Ci0gICAgICAgICAgICBvZmZzZXQgKz0gcmV0OwotICAgICAgICAgICAgc3RkOjpzd2FwKGRhdGEsIGRhdGEyKTsKLSAgICAgICAgICAgIHJlYWQgPSBmYWxzZTsKLSAgICAgICAgICAgIHdyaXRlID0gdHJ1ZTsKKyAgICB3aGlsZShmaWxlX2xlbmd0aCA+IDAgfHwgaGFzX3dyaXRlKSB7CisgICAgICAgIGlmIChmaWxlX2xlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIC8vIFF1ZXVlIHVwIGEgcmVhZCBmcm9tIGRpc2suCisgICAgICAgICAgICBsZW5ndGggPSBzdGQ6Om1pbihzdGF0aWNfY2FzdDx1aW50NjRfdD4oTUFYX0ZJTEVfQ0hVTktfU0laRSksIGZpbGVfbGVuZ3RoKTsKKyAgICAgICAgICAgIGFpb19wcmVwYXJlKCZhaW8sIG1Jb2J1ZltpXS5idWZzLmRhdGEoKSwgbGVuZ3RoLCBvZmZzZXQpOworICAgICAgICAgICAgYWlvX3JlYWQoJmFpbyk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoZXJyb3IgPT0gLTEpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKGhhc193cml0ZSkgeworICAgICAgICAgICAgLy8gV2FpdCBmb3IgdXNiIHdyaXRlLiBDYW5jZWwgdW53cml0dGVuIHBvcnRpb24gaWYgdGhlcmUncyBhbiBlcnJvci4KKyAgICAgICAgICAgIGludCBudW1fZXZlbnRzID0gMDsKKyAgICAgICAgICAgIGlmICh3YWl0RXZlbnRzKCZtSW9idWZbKGktMSklTlVNX0lPX0JVRlNdLCBtSW9idWZbKGktMSklTlVNX0lPX0JVRlNdLmFjdHVhbCwgaW9ldnMsCisgICAgICAgICAgICAgICAgICAgICAgICAmbnVtX2V2ZW50cykgIT0gcmV0KSB7CisgICAgICAgICAgICAgICAgZXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIGNhbmNlbEV2ZW50cyhtSW9idWZbKGktMSklTlVNX0lPX0JVRlNdLmlvY2IuZGF0YSgpLCBpb2V2cywgbnVtX2V2ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Jb2J1ZlsoaS0xKSVOVU1fSU9fQlVGU10uYWN0dWFsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhhc193cml0ZSA9IGZhbHNlOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGZpbGVfbGVuZ3RoID4gMCkgewotICAgICAgICAgICAgbGVuZ3RoID0gc3RkOjptaW4oc3RhdGljX2Nhc3Q8dWludDY0X3Q+KE1BWF9GSUxFX0NIVU5LX1NJWkUpLCBmaWxlX2xlbmd0aCk7Ci0gICAgICAgICAgICAvLyBRdWV1ZSB1cCBhbm90aGVyIHJlYWQKLSAgICAgICAgICAgIGFpby5haW9fYnVmID0gZGF0YTsKLSAgICAgICAgICAgIGFpby5haW9fb2Zmc2V0ID0gb2Zmc2V0OwotICAgICAgICAgICAgYWlvLmFpb19uYnl0ZXMgPSBsZW5ndGg7Ci0gICAgICAgICAgICBhaW9fcmVhZCgmYWlvKTsKLSAgICAgICAgICAgIHJlYWQgPSB0cnVlOworICAgICAgICAgICAgLy8gV2FpdCBmb3IgdGhlIHByZXZpb3VzIHJlYWQgdG8gZmluaXNoCisgICAgICAgICAgICBhaW9fc3VzcGVuZChhaW9sLCAxLCBudWxscHRyKTsKKyAgICAgICAgICAgIG51bV9yZWFkID0gYWlvX3JldHVybigmYWlvKTsKKyAgICAgICAgICAgIGlmIChzdGF0aWNfY2FzdDxzaXplX3Q+KG51bV9yZWFkKSA8IGFpby5haW9fbmJ5dGVzKSB7CisgICAgICAgICAgICAgICAgZXJybm8gPSBudW1fcmVhZCA9PSAtMSA/IGFpb19lcnJvcigmYWlvKSA6IEVJTzsKKyAgICAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiTXRwIGVycm9yIHJlYWRpbmcgZnJvbSBkaXNrIjsKKyAgICAgICAgICAgICAgICBjYW5jZWxUcmFuc2FjdGlvbigpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmlsZV9sZW5ndGggLT0gbnVtX3JlYWQ7CisgICAgICAgICAgICBvZmZzZXQgKz0gbnVtX3JlYWQ7CisKKyAgICAgICAgICAgIGlmIChlcnJvcikgeworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUXVldWUgdXAgYSB3cml0ZSB0byB1c2IuCisgICAgICAgICAgICBpZiAoaW9idWZTdWJtaXQoJm1Jb2J1ZltpXSwgbUJ1bGtJbiwgbnVtX3JlYWQsIGZhbHNlKSA9PSAtMSkgeworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhhc193cml0ZSA9IHRydWU7CisgICAgICAgICAgICByZXQgPSBudW1fcmVhZDsKICAgICAgICAgfQogCi0gICAgICAgIGlmICh3cml0ZSkgewotICAgICAgICAgICAgaWYgKHdyaXRlSGFuZGxlKG1CdWxrSW4sIGRhdGEyLCByZXQpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgZXJyb3IgPSAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdyaXRlID0gZmFsc2U7Ci0gICAgICAgIH0KKyAgICAgICAgaSA9IChpICsgMSkgJSBOVU1fSU9fQlVGUzsKICAgICB9CiAKICAgICBpZiAocmV0ICUgcGFja2V0X3NpemUgPT0gMCkgewogICAgICAgICAvLyBJZiB0aGUgbGFzdCBwYWNrZXQgd2Fzbid0IHNob3J0LCBzZW5kIGEgZmluYWwgZW1wdHkgcGFja2V0Ci0gICAgICAgIGlmIChURU1QX0ZBSUxVUkVfUkVUUlkoOjp3cml0ZShtQnVsa0luLCBkYXRhLCAwKSkgIT0gMCkgeworICAgICAgICBpZiAod3JpdGUobUlvYnVmWzBdLmJ1ZnMuZGF0YSgpLCAwKSAhPSAwKSB7CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KICAgICB9Ci0KICAgICByZXR1cm4gMDsKIH0KIApAQCAtODY1LDcgKzY3NSwzIEBACiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAotSU10cEhhbmRsZSAqZ2V0X2Zmc19oYW5kbGUoKSB7Ci0gICAgcmV0dXJuIG5ldyBhbmRyb2lkOjpNdHBGZnNIYW5kbGUoKTsKLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cEZmc0hhbmRsZS5oIGIvbWVkaWEvbXRwL010cEZmc0hhbmRsZS5oCmluZGV4IGRhMGNkOWYuLmZlMzQzZjcgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBGZnNIYW5kbGUuaAorKysgYi9tZWRpYS9tdHAvTXRwRmZzSGFuZGxlLmgKQEAgLTE4LDMwICsxOCw0NSBAQAogI2RlZmluZSBfTVRQX0ZGU19IQU5ETEVfSAogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Fpb19hYmkuaD4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxzeXMvcG9sbC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCiAjaW5jbHVkZSA8SU10cEhhbmRsZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIE10cEZmc0hhbmRsZVRlc3Q7Citjb25zdGV4cHIgaW50IE5VTV9JT19CVUZTID0gMjsKKworc3RydWN0IGlvX2J1ZmZlciB7CisgICAgc3RkOjp2ZWN0b3I8c3RydWN0IGlvY2I+IGlvY2JzOyAgICAgLy8gSG9sZHMgbWVtb3J5IGZvciBhbGwgaW9jYnMuIE5vdCB1c2VkIGRpcmVjdGx5LgorICAgIHN0ZDo6dmVjdG9yPHN0cnVjdCBpb2NiKj4gaW9jYjsgICAgIC8vIFBvaW50ZXJzIHRvIGluZGl2aWR1YWwgaW9jYnMsIGZvciBzeXNjYWxscworICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+IGJ1ZnM7ICAgIC8vIEEgbGFyZ2UgYnVmZmVyLCB1c2VkIHdpdGggZmlsZXN5c3RlbSBpbworICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXIqPiBidWY7ICAgIC8vIFBvaW50ZXJzIHdpdGhpbiB0aGUgbGFyZ2VyIGJ1ZmZlciwgZm9yIHN5c2NhbGxzCisgICAgdW5zaWduZWQgYWN0dWFsOyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG51bWJlciBvZiBidWZmZXJzIHN1Ym1pdHRlZCBmb3IgdGhpcyByZXF1ZXN0Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gY2xhc3MgTXRwRmZzSGFuZGxlVGVzdDsKIAogY2xhc3MgTXRwRmZzSGFuZGxlIDogcHVibGljIElNdHBIYW5kbGUgewotICAgIGZyaWVuZCBjbGFzcyBhbmRyb2lkOjpNdHBGZnNIYW5kbGVUZXN0OwotcHJpdmF0ZToKLSAgICBpbnQgd3JpdGVIYW5kbGUoaW50IGZkLCBjb25zdCB2b2lkICpkYXRhLCBpbnQgbGVuKTsKLSAgICBpbnQgcmVhZEhhbmRsZShpbnQgZmQsIHZvaWQgKmRhdGEsIGludCBsZW4pOwotICAgIGludCBzcGxpY2VSZWFkSGFuZGxlKGludCBmZCwgaW50IGZkX291dCwgaW50IGxlbik7Ci0gICAgYm9vbCBpbml0RnVuY3Rpb25mcygpOworICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBmcmllbmQgY2xhc3MgTXRwRmZzSGFuZGxlVGVzdDsKK3Byb3RlY3RlZDoKICAgICB2b2lkIGNsb3NlQ29uZmlnKCk7CiAgICAgdm9pZCBjbG9zZUVuZHBvaW50cygpOwotICAgIHZvaWQgZG9TZW5kRXZlbnQobXRwX2V2ZW50IG1lKTsKLQotICAgIHZvaWQgY29udHJvbExvb3AoKTsKKyAgICB2b2lkIGFkdmlzZShpbnQgZmQpOworICAgIGludCBoYW5kbGVDb250cm9sUmVxdWVzdChjb25zdCBzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpyZXF1ZXN0KTsKKyAgICBpbnQgZG9Bc3luYyh2b2lkKiBkYXRhLCBzaXplX3QgbGVuLCBib29sIHJlYWQsIGJvb2wgemVyb19wYWNrZXQpOwogICAgIGludCBoYW5kbGVFdmVudCgpOwotICAgIGludCBoYW5kbGVDb250cm9sUmVxdWVzdChjb25zdCBzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpzZXR1cCk7CisgICAgdm9pZCBjYW5jZWxUcmFuc2FjdGlvbigpOworICAgIHZvaWQgZG9TZW5kRXZlbnQobXRwX2V2ZW50IG1lKTsKKyAgICBib29sIG9wZW5FbmRwb2ludHMoYm9vbCBwdHApOwogCi0gICAgYm9vbCBtUHRwOworICAgIHN0YXRpYyBpbnQgZ2V0UGFja2V0U2l6ZShpbnQgZmZzX2ZkKTsKIAotICAgIHN0ZDo6dGltZWRfbXV0ZXggbUxvY2s7CisgICAgYm9vbCBtQ2FuY2VsZWQ7CiAKICAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgbUNvbnRyb2w7CiAgICAgLy8gImluIiBmcm9tIHRoZSBob3N0J3MgcGVyc3BlY3RpdmUgPT4gc2luayBmb3IgbXRwIHNlcnZlcgpAQCAtNTAsMzAgKzY1LDM3IEBACiAgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIG1CdWxrT3V0OwogICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBtSW50cjsKIAotICAgIGludCBtTWF4V3JpdGU7Ci0gICAgaW50IG1NYXhSZWFkOworICAgIGFpb19jb250ZXh0X3QgbUN0eDsKIAotICAgIHN0ZDo6dmVjdG9yPGNoYXI+IG1CdWZmZXIxOwotICAgIHN0ZDo6dmVjdG9yPGNoYXI+IG1CdWZmZXIyOworICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBtRXZlbnRGZDsKKyAgICBzdHJ1Y3QgcG9sbGZkIG1Qb2xsRmRzWzJdOworCisgICAgc3RydWN0IGlvX2J1ZmZlciBtSW9idWZbTlVNX0lPX0JVRlNdOworCisgICAgLy8gU3VibWl0IGFuIGlvIHJlcXVlc3Qgb2YgZ2l2ZW4gbGVuZ3RoLiBSZXR1cm4gYW1vdW50IHN1Ym1pdHRlZCBvciAtMS4KKyAgICBpbnQgaW9idWZTdWJtaXQoc3RydWN0IGlvX2J1ZmZlciAqYnVmLCBpbnQgZmQsIHVuc2lnbmVkIGxlbmd0aCwgYm9vbCByZWFkKTsKKworICAgIC8vIENhbmNlbCBzdWJtaXR0ZWQgcmVxdWVzdHMgZnJvbSBzdGFydCB0byBlbmQgaW4gdGhlIGdpdmVuIGFycmF5LiBSZXR1cm4gMCBvciAtMS4KKyAgICBpbnQgY2FuY2VsRXZlbnRzKHN0cnVjdCBpb2NiICoqaW9jYiwgc3RydWN0IGlvX2V2ZW50ICpldmVudHMsIHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCBlbmQpOworCisgICAgLy8gV2FpdCBmb3IgYXQgbWluaW11bSB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGV2ZW50cy4gUmV0dXJucyB0aGUgYW1vdW50IG9mIGRhdGEgaW4gdGhlIHJldHVybmVkCisgICAgLy8gZXZlbnRzLiBJbmNyZW1lbnRzIGNvdW50ZXIgYnkgdGhlIG51bWJlciBvZiBldmVudHMgcmV0dXJuZWQuCisgICAgaW50IHdhaXRFdmVudHMoc3RydWN0IGlvX2J1ZmZlciAqYnVmLCBpbnQgbWluX2V2ZW50cywgc3RydWN0IGlvX2V2ZW50ICpldmVudHMsIGludCAqY291bnRlcik7CiAKIHB1YmxpYzoKLSAgICBpbnQgcmVhZCh2b2lkICpkYXRhLCBpbnQgbGVuKTsKLSAgICBpbnQgd3JpdGUoY29uc3Qgdm9pZCAqZGF0YSwgaW50IGxlbik7CisgICAgaW50IHJlYWQodm9pZCAqZGF0YSwgc2l6ZV90IGxlbikgb3ZlcnJpZGU7CisgICAgaW50IHdyaXRlKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pIG92ZXJyaWRlOwogCi0gICAgaW50IHJlY2VpdmVGaWxlKG10cF9maWxlX3JhbmdlIG1mciwgYm9vbCB6ZXJvX3BhY2tldCk7Ci0gICAgaW50IHNlbmRGaWxlKG10cF9maWxlX3JhbmdlIG1mcik7Ci0gICAgaW50IHNlbmRFdmVudChtdHBfZXZlbnQgbWUpOworICAgIGludCByZWNlaXZlRmlsZShtdHBfZmlsZV9yYW5nZSBtZnIsIGJvb2wgemVyb19wYWNrZXQpIG92ZXJyaWRlOworICAgIGludCBzZW5kRmlsZShtdHBfZmlsZV9yYW5nZSBtZnIpIG92ZXJyaWRlOworICAgIGludCBzZW5kRXZlbnQobXRwX2V2ZW50IG1lKSBvdmVycmlkZTsKIAotICAgIC8qKgotICAgICAqIE9wZW4gZmZzIGVuZHBvaW50cyBhbmQgYWxsb2NhdGUgbmVjZXNzYXJ5IGtlcm5lbCBhbmQgdXNlciBtZW1vcnkuCi0gICAgICogV2lsbCBzbGVlcCB1bnRpbCBlbmRwb2ludHMgYXJlIGVuYWJsZWQsIGZvciB1cCB0byAxIHNlY29uZC4KLSAgICAgKi8KLSAgICBpbnQgc3RhcnQoKTsKLSAgICB2b2lkIGNsb3NlKCk7CisgICAgaW50IHN0YXJ0KGJvb2wgcHRwKSBvdmVycmlkZTsKKyAgICB2b2lkIGNsb3NlKCkgb3ZlcnJpZGU7CiAKLSAgICBpbnQgY29uZmlndXJlKGJvb2wgcHRwKTsKKyAgICBib29sIHdyaXRlRGVzY3JpcHRvcnMoYm9vbCBwdHApOwogCi0gICAgTXRwRmZzSGFuZGxlKCk7CisgICAgTXRwRmZzSGFuZGxlKGludCBjb250cm9sRmQpOwogICAgIH5NdHBGZnNIYW5kbGUoKTsKIH07CiAKQEAgLTkwLDUgKzExMiw1IEBACiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAotI2VuZGlmIC8vIF9NVFBfRkZfSEFORExFX0gKKyNlbmRpZiAvLyBfTVRQX0ZGU19IQU5ETEVfSAogCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwUGFja2V0LmggYi9tZWRpYS9tdHAvTXRwUGFja2V0LmgKaW5kZXggZDQ3YzkxZC4uOTg0MmIyOCAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cFBhY2tldC5oCisrKyBiL21lZGlhL210cC9NdHBQYWNrZXQuaApAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL21hY3Jvcy5oPgogCisjaW5jbHVkZSAiTXRwRGVidWcuaCIKICNpbmNsdWRlICJNdHBUeXBlcy5oIgogCiBzdHJ1Y3QgdXNiX2RldmljZTsKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBQcm9wZXJ0eS5jcHAgYi9tZWRpYS9tdHAvTXRwUHJvcGVydHkuY3BwCmluZGV4IDAzOWU0ZjUuLjVjMDJhMGQgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBQcm9wZXJ0eS5jcHAKKysrIGIvbWVkaWEvbXRwL010cFByb3BlcnR5LmNwcApAQCAtMTgsNiArMTgsMTAgQEAKIAogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKwogI2luY2x1ZGUgIk10cERhdGFQYWNrZXQuaCIKICNpbmNsdWRlICJNdHBEZWJ1Zy5oIgogI2luY2x1ZGUgIk10cFByb3BlcnR5LmgiCkBAIC0zMzYsNyArMzQwLDcgQEAKIH0KIAogdm9pZCBNdHBQcm9wZXJ0eTo6cHJpbnQoKSB7Ci0gICAgTXRwU3RyaW5nIGJ1ZmZlcjsKKyAgICBzdGQ6OnN0cmluZyBidWZmZXI7CiAgICAgYm9vbCBkZXZpY2VQcm9wID0gaXNEZXZpY2VQcm9wZXJ0eSgpOwogICAgIGlmIChkZXZpY2VQcm9wKQogICAgICAgICBBTE9HSSgiICAgICVzICglMDRYKSIsIE10cERlYnVnOjpnZXREZXZpY2VQcm9wQ29kZU5hbWUobUNvZGUpLCBtQ29kZSk7CkBAIC0zNDYsMTEgKzM1MCwxMSBAQAogICAgIEFMT0dJKCIgICAgd3JpdGVhYmxlICVzIiwgKG1Xcml0ZWFibGUgPyAidHJ1ZSIgOiAiZmFsc2UiKSk7CiAgICAgYnVmZmVyID0gIiAgICBkZWZhdWx0IHZhbHVlOiAiOwogICAgIHByaW50KG1EZWZhdWx0VmFsdWUsIGJ1ZmZlcik7Ci0gICAgQUxPR0koIiVzIiwgKGNvbnN0IGNoYXIgKilidWZmZXIpOworICAgIEFMT0dJKCIlcyIsIGJ1ZmZlci5jX3N0cigpKTsKICAgICBpZiAoZGV2aWNlUHJvcCkgewogICAgICAgICBidWZmZXIgPSAiICAgIGN1cnJlbnQgdmFsdWU6ICI7CiAgICAgICAgIHByaW50KG1DdXJyZW50VmFsdWUsIGJ1ZmZlcik7Ci0gICAgICAgIEFMT0dJKCIlcyIsIChjb25zdCBjaGFyICopYnVmZmVyKTsKKyAgICAgICAgQUxPR0koIiVzIiwgYnVmZmVyLmNfc3RyKCkpOwogICAgIH0KICAgICBzd2l0Y2ggKG1Gb3JtRmxhZykgewogICAgICAgICBjYXNlIGtGb3JtTm9uZToKQEAgLTM2Myw3ICszNjcsNyBAQAogICAgICAgICAgICAgYnVmZmVyICs9ICIsICI7CiAgICAgICAgICAgICBwcmludChtU3RlcFNpemUsIGJ1ZmZlcik7CiAgICAgICAgICAgICBidWZmZXIgKz0gIikiOwotICAgICAgICAgICAgQUxPR0koIiVzIiwgKGNvbnN0IGNoYXIgKilidWZmZXIpOworICAgICAgICAgICAgQUxPR0koIiVzIiwgYnVmZmVyLmNfc3RyKCkpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2Uga0Zvcm1FbnVtOgogICAgICAgICAgICAgYnVmZmVyID0gIiAgICBFbnVtIHsgIjsKQEAgLTM3Miw3ICszNzYsNyBAQAogICAgICAgICAgICAgICAgIGJ1ZmZlciArPSAiICI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBidWZmZXIgKz0gIn0iOwotICAgICAgICAgICAgQUxPR0koIiVzIiwgKGNvbnN0IGNoYXIgKilidWZmZXIpOworICAgICAgICAgICAgQUxPR0koIiVzIiwgYnVmZmVyLmNfc3RyKCkpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2Uga0Zvcm1EYXRlVGltZToKICAgICAgICAgICAgIEFMT0dJKCIgICAgRGF0ZVRpbWVcbiIpOwpAQCAtMzgzLDQyICszODcsNDcgQEAKICAgICB9CiB9CiAKLXZvaWQgTXRwUHJvcGVydHk6OnByaW50KE10cFByb3BlcnR5VmFsdWUmIHZhbHVlLCBNdHBTdHJpbmcmIGJ1ZmZlcikgewordm9pZCBNdHBQcm9wZXJ0eTo6cHJpbnQoTXRwUHJvcGVydHlWYWx1ZSYgdmFsdWUsIHN0ZDo6c3RyaW5nJiBidWZmZXIpIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gczsKICAgICBzd2l0Y2ggKG1UeXBlKSB7CiAgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UODoKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmRGb3JtYXQoIiVkIiwgdmFsdWUudS5pOCk7CisgICAgICAgICAgICBidWZmZXIgKz0gc3RkOjp0b19zdHJpbmcodmFsdWUudS5pOCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UODoKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmRGb3JtYXQoIiVkIiwgdmFsdWUudS51OCk7CisgICAgICAgICAgICBidWZmZXIgKz0gc3RkOjp0b19zdHJpbmcodmFsdWUudS51OCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQxNjoKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmRGb3JtYXQoIiVkIiwgdmFsdWUudS5pMTYpOworICAgICAgICAgICAgYnVmZmVyICs9IHN0ZDo6dG9fc3RyaW5nKHZhbHVlLnUuaTE2KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQxNjoKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmRGb3JtYXQoIiVkIiwgdmFsdWUudS51MTYpOworICAgICAgICAgICAgYnVmZmVyICs9IHN0ZDo6dG9fc3RyaW5nKHZhbHVlLnUudTE2KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDMyOgotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZEZvcm1hdCgiJWQiLCB2YWx1ZS51LmkzMik7CisgICAgICAgICAgICBidWZmZXIgKz0gc3RkOjp0b19zdHJpbmcodmFsdWUudS5pMzIpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDMyOgotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZEZvcm1hdCgiJWQiLCB2YWx1ZS51LnUzMik7CisgICAgICAgICAgICBidWZmZXIgKz0gc3RkOjp0b19zdHJpbmcodmFsdWUudS51MzIpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UNjQ6Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kRm9ybWF0KCIlIiBQUklkNjQsIHZhbHVlLnUuaTY0KTsKKyAgICAgICAgICAgIGJ1ZmZlciArPSBzdGQ6OnRvX3N0cmluZyh2YWx1ZS51Lmk2NCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UNjQ6Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kRm9ybWF0KCIlIiBQUkl1NjQsIHZhbHVlLnUudTY0KTsKKyAgICAgICAgICAgIGJ1ZmZlciArPSBzdGQ6OnRvX3N0cmluZyh2YWx1ZS51LnU2NCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQxMjg6Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kRm9ybWF0KCIlMDhYJTA4WCUwOFglMDhYIiwgdmFsdWUudS5pMTI4WzBdLCB2YWx1ZS51LmkxMjhbMV0sCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlLnUuaTEyOFsyXSwgdmFsdWUudS5pMTI4WzNdKTsKKyAgICAgICAgICAgIGZvciAoYXV0byBpIDogdmFsdWUudS5pMTI4KSB7CisgICAgICAgICAgICAgICAgcyA8PCBzdGQ6OmhleCA8PCBzdGQ6OnNldGZpbGwoJzAnKSA8PCBzdGQ6OnVwcGVyY2FzZSA8PCBpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmZmVyICs9IHMuc3RyKCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UMTI4OgotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZEZvcm1hdCgiJTA4WCUwOFglMDhYJTA4WCIsIHZhbHVlLnUudTEyOFswXSwgdmFsdWUudS51MTI4WzFdLAotICAgICAgICAgICAgICAgICAgICB2YWx1ZS51LnUxMjhbMl0sIHZhbHVlLnUudTEyOFszXSk7CisgICAgICAgICAgICBmb3IgKGF1dG8gaSA6IHZhbHVlLnUudTEyOCkgeworICAgICAgICAgICAgICAgIHMgPDwgc3RkOjpoZXggPDwgc3RkOjpzZXRmaWxsKCcwJykgPDwgc3RkOjp1cHBlcmNhc2UgPDwgaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1ZmZlciArPSBzLnN0cigpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgTVRQX1RZUEVfU1RSOgotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZEZvcm1hdCgiJXMiLCB2YWx1ZS5zdHIpOworICAgICAgICAgICAgYnVmZmVyICs9IHZhbHVlLnN0cjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR0UoInVuc3VwcG9ydGVkIHR5cGUgZm9yIE10cFByb3BlcnR5OjpwcmludFxuIik7CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwUHJvcGVydHkuaCBiL21lZGlhL210cC9NdHBQcm9wZXJ0eS5oCmluZGV4IDAzYzA4ZTEuLmJmZDVmN2YgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBQcm9wZXJ0eS5oCisrKyBiL21lZGlhL210cC9NdHBQcm9wZXJ0eS5oCkBAIC0xOSw2ICsxOSw4IEBACiAKICNpbmNsdWRlICJNdHBUeXBlcy5oIgogCisjaW5jbHVkZSA8c3RyaW5nPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIE10cERhdGFQYWNrZXQ7CkBAIC05Nyw3ICs5OSw2IEBACiAgICAgdm9pZCAgICAgICAgICAgICAgICBzZXRGb3JtRGF0ZVRpbWUoKTsKIAogICAgIHZvaWQgICAgICAgICAgICAgICAgcHJpbnQoKTsKLSAgICB2b2lkICAgICAgICAgICAgICAgIHByaW50KE10cFByb3BlcnR5VmFsdWUmIHZhbHVlLCBNdHBTdHJpbmcmIGJ1ZmZlcik7CiAKICAgICBpbmxpbmUgYm9vbCAgICAgICAgIGlzRGV2aWNlUHJvcGVydHkoKSBjb25zdCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICggICAoKG1Db2RlICYgMHhGMDAwKSA9PSAweDUwMDApCkBAIC0xMTAsNiArMTExLDcgQEAKICAgICBNdHBQcm9wZXJ0eVZhbHVlKiAgIHJlYWRBcnJheVZhbHVlcyhNdHBEYXRhUGFja2V0JiBwYWNrZXQsIHVpbnQzMl90JiBsZW5ndGgpOwogICAgIHZvaWQgICAgICAgICAgICAgICAgd3JpdGVBcnJheVZhbHVlcyhNdHBEYXRhUGFja2V0JiBwYWNrZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFByb3BlcnR5VmFsdWUqIHZhbHVlcywgdWludDMyX3QgbGVuZ3RoKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHByaW50KE10cFByb3BlcnR5VmFsdWUmIHZhbHVlLCBzdGQ6OnN0cmluZyYgYnVmZmVyKTsKIH07CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU2VydmVyLmNwcCBiL21lZGlhL210cC9NdHBTZXJ2ZXIuY3BwCmluZGV4IDY3ZmQyMjEuLmNjZGRkNmUgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBTZXJ2ZXIuY3BwCisrKyBiL21lZGlhL210cC9NdHBTZXJ2ZXIuY3BwCkBAIC0xNCw2ICsxNCw4IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxjaHJvbm8+CiAjaW5jbHVkZSA8ZGlyZW50Lmg+CkBAIC0zMCw3ICszMiwxMSBAQAogI2RlZmluZSBMT0dfVEFHICJNdHBTZXJ2ZXIiCiAKICNpbmNsdWRlICJNdHBEZWJ1Zy5oIgotI2luY2x1ZGUgIk10cERhdGFiYXNlLmgiCisjaW5jbHVkZSAiSU10cERhdGFiYXNlLmgiCisjaW5jbHVkZSAiTXRwRGVzY3JpcHRvcnMuaCIKKyNpbmNsdWRlICJNdHBEZXZIYW5kbGUuaCIKKyNpbmNsdWRlICJNdHBGZnNDb21wYXRIYW5kbGUuaCIKKyNpbmNsdWRlICJNdHBGZnNIYW5kbGUuaCIKICNpbmNsdWRlICJNdHBPYmplY3RJbmZvLmgiCiAjaW5jbHVkZSAiTXRwUHJvcGVydHkuaCIKICNpbmNsdWRlICJNdHBTZXJ2ZXIuaCIKQEAgLTY0LDggKzcwLDggQEAKICAgICBNVFBfT1BFUkFUSU9OX1NFVF9ERVZJQ0VfUFJPUF9WQUxVRSwKICAgICBNVFBfT1BFUkFUSU9OX1JFU0VUX0RFVklDRV9QUk9QX1ZBTFVFLAogLy8gICAgTVRQX09QRVJBVElPTl9URVJNSU5BVEVfT1BFTl9DQVBUVVJFLAotLy8gICAgTVRQX09QRVJBVElPTl9NT1ZFX09CSkVDVCwKLS8vICAgIE1UUF9PUEVSQVRJT05fQ09QWV9PQkpFQ1QsCisgICAgTVRQX09QRVJBVElPTl9NT1ZFX09CSkVDVCwKKyAgICBNVFBfT1BFUkFUSU9OX0NPUFlfT0JKRUNULAogICAgIE1UUF9PUEVSQVRJT05fR0VUX1BBUlRJQUxfT0JKRUNULAogLy8gICAgTVRQX09QRVJBVElPTl9JTklUSUFURV9PUEVOX0NBUFRVUkUsCiAgICAgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1BST1BTX1NVUFBPUlRFRCwKQEAgLTk1LDE3ICsxMDEsMTMgQEAKICAgICBNVFBfRVZFTlRfREVWSUNFX1BST1BfQ0hBTkdFRCwKIH07CiAKLU10cFNlcnZlcjo6TXRwU2VydmVyKE10cERhdGFiYXNlKiBkYXRhYmFzZSwgYm9vbCBwdHAsCi0gICAgICAgICAgICAgICAgICAgIGludCBmaWxlR3JvdXAsIGludCBmaWxlUGVybSwgaW50IGRpcmVjdG9yeVBlcm0sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IE10cFN0cmluZyYgZGV2aWNlSW5mb01hbnVmYWN0dXJlciwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgTXRwU3RyaW5nJiBkZXZpY2VJbmZvTW9kZWwsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IE10cFN0cmluZyYgZGV2aWNlSW5mb0RldmljZVZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IE10cFN0cmluZyYgZGV2aWNlSW5mb1NlcmlhbE51bWJlcikKK010cFNlcnZlcjo6TXRwU2VydmVyKElNdHBEYXRhYmFzZSogZGF0YWJhc2UsIGludCBjb250cm9sRmQsIGJvb2wgcHRwLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VJbmZvTWFudWZhY3R1cmVyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VJbmZvTW9kZWwsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZUluZm9EZXZpY2VWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VJbmZvU2VyaWFsTnVtYmVyKQogICAgIDogICBtRGF0YWJhc2UoZGF0YWJhc2UpLAogICAgICAgICBtUHRwKHB0cCksCi0gICAgICAgIG1GaWxlR3JvdXAoZmlsZUdyb3VwKSwKLSAgICAgICAgbUZpbGVQZXJtaXNzaW9uKGZpbGVQZXJtKSwKLSAgICAgICAgbURpcmVjdG9yeVBlcm1pc3Npb24oZGlyZWN0b3J5UGVybSksCiAgICAgICAgIG1EZXZpY2VJbmZvTWFudWZhY3R1cmVyKGRldmljZUluZm9NYW51ZmFjdHVyZXIpLAogICAgICAgICBtRGV2aWNlSW5mb01vZGVsKGRldmljZUluZm9Nb2RlbCksCiAgICAgICAgIG1EZXZpY2VJbmZvRGV2aWNlVmVyc2lvbihkZXZpY2VJbmZvRGV2aWNlVmVyc2lvbiksCkBAIC0xMTcsNTAgKzExOSwzOCBAQAogICAgICAgICBtU2VuZE9iamVjdEZpbGVTaXplKDApLAogICAgICAgICBtU2VuZE9iamVjdE1vZGlmaWVkVGltZSgwKQogeworICAgIGJvb2wgZmZzX29rID0gYWNjZXNzKEZGU19NVFBfRVAwLCBXX09LKSA9PSAwOworICAgIGlmIChmZnNfb2spIHsKKyAgICAgICAgYm9vbCBhaW9fY29tcGF0ID0gYW5kcm9pZDo6YmFzZTo6R2V0Qm9vbFByb3BlcnR5KCJzeXMudXNiLmZmcy5haW9fY29tcGF0IiwgZmFsc2UpOworICAgICAgICBtSGFuZGxlID0gYWlvX2NvbXBhdCA/IG5ldyBNdHBGZnNDb21wYXRIYW5kbGUoY29udHJvbEZkKSA6IG5ldyBNdHBGZnNIYW5kbGUoY29udHJvbEZkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtSGFuZGxlID0gbmV3IE10cERldkhhbmRsZSgpOworICAgIH0KIH0KIAogTXRwU2VydmVyOjp+TXRwU2VydmVyKCkgewogfQogCi1JTXRwSGFuZGxlKiBNdHBTZXJ2ZXI6OnNIYW5kbGUgPSBudWxscHRyOwotCi1pbnQgTXRwU2VydmVyOjpjb25maWd1cmUoYm9vbCB1c2VQdHApIHsKLSAgICBpZiAoc0hhbmRsZSA9PSBudWxscHRyKSB7Ci0gICAgICAgIGJvb2wgZmZzX29rID0gYWNjZXNzKEZGU19NVFBfRVAwLCBXX09LKSA9PSAwOwotICAgICAgICBzSGFuZGxlID0gZmZzX29rID8gZ2V0X2Zmc19oYW5kbGUoKSA6IGdldF9tdHBfaGFuZGxlKCk7Ci0gICAgfQotCi0gICAgaW50IHJldCA9IHNIYW5kbGUtPmNvbmZpZ3VyZSh1c2VQdHApOwotICAgIGlmIChyZXQpIEFMT0dFKCJGYWlsZWQgdG8gY29uZmlndXJlIE1UUCBkcml2ZXIhIik7Ci0gICAgYW5kcm9pZDo6YmFzZTo6U2V0UHJvcGVydHkoInN5cy51c2IuZmZzLm10cC5yZWFkeSIsICIxIik7Ci0KLSAgICByZXR1cm4gcmV0OwotfQotCiB2b2lkIE10cFNlcnZlcjo6YWRkU3RvcmFnZShNdHBTdG9yYWdlKiBzdG9yYWdlKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxnKG1NdXRleCk7CiAKLSAgICBtU3RvcmFnZXMucHVzaChzdG9yYWdlKTsKKyAgICBtU3RvcmFnZXMucHVzaF9iYWNrKHN0b3JhZ2UpOwogICAgIHNlbmRTdG9yZUFkZGVkKHN0b3JhZ2UtPmdldFN0b3JhZ2VJRCgpKTsKIH0KIAogdm9pZCBNdHBTZXJ2ZXI6OnJlbW92ZVN0b3JhZ2UoTXRwU3RvcmFnZSogc3RvcmFnZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU3RvcmFnZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKG1TdG9yYWdlc1tpXSA9PSBzdG9yYWdlKSB7Ci0gICAgICAgICAgICBtU3RvcmFnZXMucmVtb3ZlQXQoaSk7Ci0gICAgICAgICAgICBzZW5kU3RvcmVSZW1vdmVkKHN0b3JhZ2UtPmdldFN0b3JhZ2VJRCgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxnKG1NdXRleCk7CisgICAgYXV0byBpdGVyID0gc3RkOjpmaW5kKG1TdG9yYWdlcy5iZWdpbigpLCBtU3RvcmFnZXMuZW5kKCksIHN0b3JhZ2UpOworICAgIGlmIChpdGVyICE9IG1TdG9yYWdlcy5lbmQoKSkgeworICAgICAgICBzZW5kU3RvcmVSZW1vdmVkKHN0b3JhZ2UtPmdldFN0b3JhZ2VJRCgpKTsKKyAgICAgICAgbVN0b3JhZ2VzLmVyYXNlKGl0ZXIpOwogICAgIH0KIH0KIAogTXRwU3RvcmFnZSogTXRwU2VydmVyOjpnZXRTdG9yYWdlKE10cFN0b3JhZ2VJRCBpZCkgewogICAgIGlmIChpZCA9PSAwKQogICAgICAgICByZXR1cm4gbVN0b3JhZ2VzWzBdOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVN0b3JhZ2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIE10cFN0b3JhZ2UqIHN0b3JhZ2UgPSBtU3RvcmFnZXNbaV07CisgICAgZm9yIChNdHBTdG9yYWdlICpzdG9yYWdlIDogbVN0b3JhZ2VzKSB7CiAgICAgICAgIGlmIChzdG9yYWdlLT5nZXRTdG9yYWdlSUQoKSA9PSBpZCkKICAgICAgICAgICAgIHJldHVybiBzdG9yYWdlOwogICAgIH0KQEAgLTE3NCwxOSArMTY0LDE0IEBACiB9CiAKIHZvaWQgTXRwU2VydmVyOjpydW4oKSB7Ci0gICAgaWYgKCFzSGFuZGxlKSB7Ci0gICAgICAgIEFMT0dFKCJNdHBTZXJ2ZXIgd2FzIG5ldmVyIGNvbmZpZ3VyZWQhIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoc0hhbmRsZS0+c3RhcnQoKSkgeworICAgIGlmIChtSGFuZGxlLT5zdGFydChtUHRwKSkgewogICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHN0YXJ0IHVzYiBkcml2ZXIhIik7Ci0gICAgICAgIHNIYW5kbGUtPmNsb3NlKCk7CisgICAgICAgIG1IYW5kbGUtPmNsb3NlKCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICB3aGlsZSAoMSkgewotICAgICAgICBpbnQgcmV0ID0gbVJlcXVlc3QucmVhZChzSGFuZGxlKTsKKyAgICAgICAgaW50IHJldCA9IG1SZXF1ZXN0LnJlYWQobUhhbmRsZSk7CiAgICAgICAgIGlmIChyZXQgPCAwKSB7CiAgICAgICAgICAgICBBTE9HRSgicmVxdWVzdCByZWFkIHJldHVybmVkICVkLCBlcnJubzogJWQiLCByZXQsIGVycm5vKTsKICAgICAgICAgICAgIGlmIChlcnJubyA9PSBFQ0FOQ0VMRUQpIHsKQEAgLTIwNSw3ICsxOTAsNyBAQAogICAgICAgICAgICAgICAgICAgICB8fCBvcGVyYXRpb24gPT0gTVRQX09QRVJBVElPTl9TRVRfT0JKRUNUX1BST1BfVkFMVUUKICAgICAgICAgICAgICAgICAgICAgfHwgb3BlcmF0aW9uID09IE1UUF9PUEVSQVRJT05fU0VUX0RFVklDRV9QUk9QX1ZBTFVFKTsKICAgICAgICAgaWYgKGRhdGFJbikgewotICAgICAgICAgICAgaW50IHJldCA9IG1EYXRhLnJlYWQoc0hhbmRsZSk7CisgICAgICAgICAgICBpbnQgcmV0ID0gbURhdGEucmVhZChtSGFuZGxlKTsKICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoImRhdGEgcmVhZCByZXR1cm5lZCAlZCwgZXJybm86ICVkIiwgcmV0LCBlcnJubyk7CiAgICAgICAgICAgICAgICAgaWYgKGVycm5vID09IEVDQU5DRUxFRCkgewpAQCAtMjI0LDcgKzIwOSw3IEBACiAgICAgICAgICAgICAgICAgbURhdGEuc2V0T3BlcmF0aW9uQ29kZShvcGVyYXRpb24pOwogICAgICAgICAgICAgICAgIG1EYXRhLnNldFRyYW5zYWN0aW9uSUQodHJhbnNhY3Rpb24pOwogICAgICAgICAgICAgICAgIEFMT0dWKCJzZW5kaW5nIGRhdGE6Iik7Ci0gICAgICAgICAgICAgICAgcmV0ID0gbURhdGEud3JpdGUoc0hhbmRsZSk7CisgICAgICAgICAgICAgICAgcmV0ID0gbURhdGEud3JpdGUobUhhbmRsZSk7CiAgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0UoInJlcXVlc3Qgd3JpdGUgcmV0dXJuZWQgJWQsIGVycm5vOiAlZCIsIHJldCwgZXJybm8pOwogICAgICAgICAgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUNBTkNFTEVEKSB7CkBAIC0yMzcsNyArMjIyLDcgQEAKIAogICAgICAgICAgICAgbVJlc3BvbnNlLnNldFRyYW5zYWN0aW9uSUQodHJhbnNhY3Rpb24pOwogICAgICAgICAgICAgQUxPR1YoInNlbmRpbmcgcmVzcG9uc2UgJTA0WCIsIG1SZXNwb25zZS5nZXRSZXNwb25zZUNvZGUoKSk7Ci0gICAgICAgICAgICByZXQgPSBtUmVzcG9uc2Uud3JpdGUoc0hhbmRsZSk7CisgICAgICAgICAgICByZXQgPSBtUmVzcG9uc2Uud3JpdGUobUhhbmRsZSk7CiAgICAgICAgICAgICBjb25zdCBpbnQgc2F2ZWRFcnJubyA9IGVycm5vOwogICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKICAgICAgICAgICAgICAgICBBTE9HRSgicmVxdWVzdCB3cml0ZSByZXR1cm5lZCAlZCwgZXJybm86ICVkIiwgcmV0LCBlcnJubyk7CkBAIC0yNjEsMTAgKzI0Niw3IEBACiAgICAgfQogICAgIG1PYmplY3RFZGl0TGlzdC5jbGVhcigpOwogCi0gICAgaWYgKG1TZXNzaW9uT3BlbikKLSAgICAgICAgbURhdGFiYXNlLT5zZXNzaW9uRW5kZWQoKTsKLQotICAgIHNIYW5kbGUtPmNsb3NlKCk7CisgICAgbUhhbmRsZS0+Y2xvc2UoKTsKIH0KIAogdm9pZCBNdHBTZXJ2ZXI6OnNlbmRPYmplY3RBZGRlZChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKSB7CkBAIC0yOTcsMTUgKzI3OSwxNSBAQAogICAgICAgICBtRXZlbnQuc2V0RXZlbnRDb2RlKGNvZGUpOwogICAgICAgICBtRXZlbnQuc2V0VHJhbnNhY3Rpb25JRChtUmVxdWVzdC5nZXRUcmFuc2FjdGlvbklEKCkpOwogICAgICAgICBtRXZlbnQuc2V0UGFyYW1ldGVyKDEsIHBhcmFtMSk7Ci0gICAgICAgIGlmIChtRXZlbnQud3JpdGUoc0hhbmRsZSkpCisgICAgICAgIGlmIChtRXZlbnQud3JpdGUobUhhbmRsZSkpCiAgICAgICAgICAgICBBTE9HRSgiTXRwIHNlbmQgZXZlbnQgZmFpbGVkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgfQogfQogCi12b2lkIE10cFNlcnZlcjo6YWRkRWRpdE9iamVjdChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLCBNdHBTdHJpbmcmIHBhdGgsCit2b2lkIE10cFNlcnZlcjo6YWRkRWRpdE9iamVjdChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLCBNdHBTdHJpbmdCdWZmZXImIHBhdGgsCiAgICAgICAgIHVpbnQ2NF90IHNpemUsIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsIGludCBmZCkgewogICAgIE9iamVjdEVkaXQqICBlZGl0ID0gbmV3IE9iamVjdEVkaXQoaGFuZGxlLCBwYXRoLCBzaXplLCBmb3JtYXQsIGZkKTsKLSAgICBtT2JqZWN0RWRpdExpc3QuYWRkKGVkaXQpOworICAgIG1PYmplY3RFZGl0TGlzdC5wdXNoX2JhY2soZWRpdCk7CiB9CiAKIE10cFNlcnZlcjo6T2JqZWN0RWRpdCogTXRwU2VydmVyOjpnZXRFZGl0T2JqZWN0KE10cE9iamVjdEhhbmRsZSBoYW5kbGUpIHsKQEAgLTMyMyw3ICszMDUsNyBAQAogICAgICAgICBPYmplY3RFZGl0KiBlZGl0ID0gbU9iamVjdEVkaXRMaXN0W2ldOwogICAgICAgICBpZiAoZWRpdC0+bUhhbmRsZSA9PSBoYW5kbGUpIHsKICAgICAgICAgICAgIGRlbGV0ZSBlZGl0OwotICAgICAgICAgICAgbU9iamVjdEVkaXRMaXN0LnJlbW92ZUF0KGkpOworICAgICAgICAgICAgbU9iamVjdEVkaXRMaXN0LmVyYXNlKG1PYmplY3RFZGl0TGlzdC5iZWdpbigpICsgaSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICB9CkBAIC0zMzEsMTIgKzMxMywxMiBAQAogfQogCiB2b2lkIE10cFNlcnZlcjo6Y29tbWl0RWRpdChPYmplY3RFZGl0KiBlZGl0KSB7Ci0gICAgbURhdGFiYXNlLT5lbmRTZW5kT2JqZWN0KChjb25zdCBjaGFyICopZWRpdC0+bVBhdGgsIGVkaXQtPm1IYW5kbGUsIGVkaXQtPm1Gb3JtYXQsIHRydWUpOworICAgIG1EYXRhYmFzZS0+cmVzY2FuRmlsZSgoY29uc3QgY2hhciAqKWVkaXQtPm1QYXRoLCBlZGl0LT5tSGFuZGxlLCBlZGl0LT5tRm9ybWF0KTsKIH0KIAogCiBib29sIE10cFNlcnZlcjo6aGFuZGxlUmVxdWVzdCgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbGcobU11dGV4KTsKIAogICAgIE10cE9wZXJhdGlvbkNvZGUgb3BlcmF0aW9uID0gbVJlcXVlc3QuZ2V0T3BlcmF0aW9uQ29kZSgpOwogICAgIE10cFJlc3BvbnNlQ29kZSByZXNwb25zZTsKQEAgLTM0NCw5ICszMjYsOSBAQAogICAgIG1SZXNwb25zZS5yZXNldCgpOwogCiAgICAgaWYgKG1TZW5kT2JqZWN0SGFuZGxlICE9IGtJbnZhbGlkT2JqZWN0SGFuZGxlICYmIG9wZXJhdGlvbiAhPSBNVFBfT1BFUkFUSU9OX1NFTkRfT0JKRUNUKSB7Ci0gICAgICAgIC8vIEZJWE1FIC0gbmVlZCB0byBkZWxldGUgbVNlbmRPYmplY3RIYW5kbGUgZnJvbSB0aGUgZGF0YWJhc2UKLSAgICAgICAgQUxPR0UoImV4cGVjdGVkIFNlbmRPYmplY3QgYWZ0ZXIgU2VuZE9iamVjdEluZm8iKTsKICAgICAgICAgbVNlbmRPYmplY3RIYW5kbGUgPSBrSW52YWxpZE9iamVjdEhhbmRsZTsKKyAgICAgICAgbVNlbmRPYmplY3RGb3JtYXQgPSAwOworICAgICAgICBtU2VuZE9iamVjdE1vZGlmaWVkVGltZSA9IDA7CiAgICAgfQogCiAgICAgaW50IGNvbnRhaW5lcnR5cGUgPSBtUmVxdWVzdC5nZXRDb250YWluZXJUeXBlKCk7CkBAIC00MjksNiArNDExLDEyIEBACiAgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9ERUxFVEVfT0JKRUNUOgogICAgICAgICAgICAgcmVzcG9uc2UgPSBkb0RlbGV0ZU9iamVjdCgpOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9DT1BZX09CSkVDVDoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9Db3B5T2JqZWN0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX01PVkVfT0JKRUNUOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb01vdmVPYmplY3QoKTsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9QUk9QX0RFU0M6CiAgICAgICAgICAgICByZXNwb25zZSA9IGRvR2V0T2JqZWN0UHJvcERlc2MoKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtNTE2LDggKzUwNCw2IEBACiAgICAgbVNlc3Npb25JRCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKICAgICBtU2Vzc2lvbk9wZW4gPSB0cnVlOwogCi0gICAgbURhdGFiYXNlLT5zZXNzaW9uU3RhcnRlZCgpOwotCiAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKIH0KIApAQCAtNTI2LDcgKzUxMiw2IEBACiAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfU0VTU0lPTl9OT1RfT1BFTjsKICAgICBtU2Vzc2lvbklEID0gMDsKICAgICBtU2Vzc2lvbk9wZW4gPSBmYWxzZTsKLSAgICBtRGF0YWJhc2UtPnNlc3Npb25FbmRlZCgpOwogICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7CiB9CiAKQEAgLTU5NCw2ICs1NzksOCBAQAogICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfU1RPUkFHRV9JRDsKIAogICAgIE10cE9iamVjdEhhbmRsZUxpc3QqIGhhbmRsZXMgPSBtRGF0YWJhc2UtPmdldE9iamVjdExpc3Qoc3RvcmFnZUlELCBmb3JtYXQsIHBhcmVudCk7CisgICAgaWYgKGhhbmRsZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX09CSkVDVF9IQU5ETEU7CiAgICAgbURhdGEucHV0QVVJbnQzMihoYW5kbGVzKTsKICAgICBkZWxldGUgaGFuZGxlczsKICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOwpAQCAtNzgyLDcgKzc2OSw3IEBACiAgICAgaWYgKG1SZXF1ZXN0LmdldFBhcmFtZXRlckNvdW50KCkgPCAxKQogICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfUEFSQU1FVEVSOwogICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7Ci0gICAgTXRwU3RyaW5nIHBhdGhCdWY7CisgICAgTXRwU3RyaW5nQnVmZmVyIHBhdGhCdWY7CiAgICAgaW50NjRfdCBmaWxlTGVuZ3RoOwogICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQ7CiAgICAgaW50IHJlc3VsdCA9IG1EYXRhYmFzZS0+Z2V0T2JqZWN0RmlsZVBhdGgoaGFuZGxlLCBwYXRoQnVmLCBmaWxlTGVuZ3RoLCBmb3JtYXQpOwpAQCAtODAzLDcgKzc5MCw3IEBACiAgICAgbWZyLnRyYW5zYWN0aW9uX2lkID0gbVJlcXVlc3QuZ2V0VHJhbnNhY3Rpb25JRCgpOwogCiAgICAgLy8gdGhlbiB0cmFuc2ZlciB0aGUgZmlsZQotICAgIGludCByZXQgPSBzSGFuZGxlLT5zZW5kRmlsZShtZnIpOworICAgIGludCByZXQgPSBtSGFuZGxlLT5zZW5kRmlsZShtZnIpOwogICAgIGlmIChyZXQgPCAwKSB7CiAgICAgICAgIEFMT0dFKCJNdHAgc2VuZCBmaWxlIGdvdCBlcnJvciAlcyIsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgIGlmIChlcnJubyA9PSBFQ0FOQ0VMRUQpIHsKQEAgLTgyMiw3ICs4MDksNyBAQAogICAgIHVpbnQ2NF90IGZpbmFsc2l6ZSA9IHNzdGF0LnN0X3NpemU7CiAgICAgQUxPR1YoIlNlbnQgYSBmaWxlIG92ZXIgTVRQLiBUaW1lOiAlZiBzLCBTaXplOiAlIiBQUkl1NjQgIiwgUmF0ZTogJWYgYnl0ZXMvcyIsCiAgICAgICAgICAgICBkaWZmLmNvdW50KCksIGZpbmFsc2l6ZSwgKChkb3VibGUpIGZpbmFsc2l6ZSkgLyBkaWZmLmNvdW50KCkpOwotICAgIGNsb3NlKG1mci5mZCk7CisgICAgY2xvc2VPYmpGZChtZnIuZmQsIGZpbGVQYXRoKTsKICAgICByZXR1cm4gcmVzdWx0OwogfQogCkBAIC04MzYsNyArODIzLDcgQEAKICAgICAgICAgLy8gc2VuZCBkYXRhCiAgICAgICAgIG1EYXRhLnNldE9wZXJhdGlvbkNvZGUobVJlcXVlc3QuZ2V0T3BlcmF0aW9uQ29kZSgpKTsKICAgICAgICAgbURhdGEuc2V0VHJhbnNhY3Rpb25JRChtUmVxdWVzdC5nZXRUcmFuc2FjdGlvbklEKCkpOwotICAgICAgICBtRGF0YS53cml0ZURhdGEoc0hhbmRsZSwgdGh1bWIsIHRodW1iU2l6ZSk7CisgICAgICAgIG1EYXRhLndyaXRlRGF0YShtSGFuZGxlLCB0aHVtYiwgdGh1bWJTaXplKTsKICAgICAgICAgZnJlZSh0aHVtYik7CiAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7CiAgICAgfSBlbHNlIHsKQEAgLTg2OCw3ICs4NTUsNyBAQAogICAgICAgICAvLyBzdGFuZGFyZCBHZXRQYXJ0aWFsT2JqZWN0CiAgICAgICAgIGxlbmd0aCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigzKTsKICAgICB9Ci0gICAgTXRwU3RyaW5nIHBhdGhCdWY7CisgICAgTXRwU3RyaW5nQnVmZmVyIHBhdGhCdWY7CiAgICAgaW50NjRfdCBmaWxlTGVuZ3RoOwogICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQ7CiAgICAgaW50IHJlc3VsdCA9IG1EYXRhYmFzZS0+Z2V0T2JqZWN0RmlsZVBhdGgoaGFuZGxlLCBwYXRoQnVmLCBmaWxlTGVuZ3RoLCBmb3JtYXQpOwpAQCAtODc4LDYgKzg2NSw3IEBACiAgICAgICAgIGxlbmd0aCA9IGZpbGVMZW5ndGggLSBvZmZzZXQ7CiAKICAgICBjb25zdCBjaGFyKiBmaWxlUGF0aCA9IChjb25zdCBjaGFyICopcGF0aEJ1ZjsKKyAgICBBTE9HVigic2VuZGluZyBwYXJ0aWFsICVzICUiIFBSSXU2NCAiICUiIFBSSXUzMiwgZmlsZVBhdGgsIG9mZnNldCwgbGVuZ3RoKTsKICAgICBtdHBfZmlsZV9yYW5nZSAgbWZyOwogICAgIG1mci5mZCA9IG9wZW4oZmlsZVBhdGgsIE9fUkRPTkxZKTsKICAgICBpZiAobWZyLmZkIDwgMCkgewpAQCAtODkwLDcgKzg3OCw3IEBACiAgICAgbVJlc3BvbnNlLnNldFBhcmFtZXRlcigxLCBsZW5ndGgpOwogCiAgICAgLy8gdHJhbnNmZXIgdGhlIGZpbGUKLSAgICBpbnQgcmV0ID0gc0hhbmRsZS0+c2VuZEZpbGUobWZyKTsKKyAgICBpbnQgcmV0ID0gbUhhbmRsZS0+c2VuZEZpbGUobWZyKTsKICAgICBBTE9HVigiTVRQX1NFTkRfRklMRV9XSVRIX0hFQURFUiByZXR1cm5lZCAlZFxuIiwgcmV0KTsKICAgICByZXN1bHQgPSBNVFBfUkVTUE9OU0VfT0s7CiAgICAgaWYgKHJldCA8IDApIHsKQEAgLTg5OSwxMiArODg3LDEyIEBACiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHJlc3VsdCA9IE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOwogICAgIH0KLSAgICBjbG9zZShtZnIuZmQpOworICAgIGNsb3NlT2JqRmQobWZyLmZkLCBmaWxlUGF0aCk7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9TZW5kT2JqZWN0SW5mbygpIHsKLSAgICBNdHBTdHJpbmcgcGF0aDsKKyAgICBNdHBTdHJpbmdCdWZmZXIgcGF0aDsKICAgICB1aW50MTZfdCB0ZW1wMTY7CiAgICAgdWludDMyX3QgdGVtcDMyOwogCkBAIC05MTgsNyArOTA2LDcgQEAKIAogICAgIC8vIHNwZWNpYWwgY2FzZSB0aGUgcm9vdAogICAgIGlmIChwYXJlbnQgPT0gTVRQX1BBUkVOVF9ST09UKSB7Ci0gICAgICAgIHBhdGggPSBzdG9yYWdlLT5nZXRQYXRoKCk7CisgICAgICAgIHBhdGguc2V0KHN0b3JhZ2UtPmdldFBhdGgoKSk7CiAgICAgICAgIHBhcmVudCA9IDA7CiAgICAgfSBlbHNlIHsKICAgICAgICAgaW50NjRfdCBsZW5ndGg7CkBAIC05NTAsNyArOTM4LDcgQEAKICAgICBpZiAoIW1EYXRhLmdldFVJbnQzMih0ZW1wMzIpKSByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfUEFSQU1FVEVSOyAgLy8gc2VxdWVuY2UgbnVtYmVyCiAgICAgTXRwU3RyaW5nQnVmZmVyIG5hbWUsIGNyZWF0ZWQsIG1vZGlmaWVkOwogICAgIGlmICghbURhdGEuZ2V0U3RyaW5nKG5hbWUpKSByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfUEFSQU1FVEVSOyAgICAvLyBmaWxlIG5hbWUKLSAgICBpZiAobmFtZS5nZXRDaGFyQ291bnQoKSA9PSAwKSB7CisgICAgaWYgKG5hbWUuaXNFbXB0eSgpKSB7CiAgICAgICAgIEFMT0dFKCJlbXB0eSBuYW1lIik7CiAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9QQVJBTUVURVI7CiAgICAgfQpAQCAtOTY0LDggKzk1Miw4IEBACiAgICAgICAgIG1vZGlmaWVkVGltZSA9IDA7CiAKICAgICBpZiAocGF0aFtwYXRoLnNpemUoKSAtIDFdICE9ICcvJykKLSAgICAgICAgcGF0aCArPSAiLyI7Ci0gICAgcGF0aCArPSAoY29uc3QgY2hhciAqKW5hbWU7CisgICAgICAgIHBhdGguYXBwZW5kKCIvIik7CisgICAgcGF0aC5hcHBlbmQobmFtZSk7CiAKICAgICAvLyBjaGVjayBzcGFjZSBmaXJzdAogICAgIGlmIChtU2VuZE9iamVjdEZpbGVTaXplID4gc3RvcmFnZS0+Z2V0RnJlZVNwYWNlKCkpCkBAIC05ODAsMjkgKzk2OCwyNSBAQAogICAgIH0KIAogICAgIEFMT0dEKCJwYXRoOiAlcyBwYXJlbnQ6ICVkIHN0b3JhZ2VJRDogJTA4WCIsIChjb25zdCBjaGFyKilwYXRoLCBwYXJlbnQsIHN0b3JhZ2VJRCk7Ci0gICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSA9IG1EYXRhYmFzZS0+YmVnaW5TZW5kT2JqZWN0KChjb25zdCBjaGFyKilwYXRoLAotICAgICAgICAgICAgZm9ybWF0LCBwYXJlbnQsIHN0b3JhZ2VJRCwgbVNlbmRPYmplY3RGaWxlU2l6ZSwgbW9kaWZpZWRUaW1lKTsKKyAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlID0gbURhdGFiYXNlLT5iZWdpblNlbmRPYmplY3QoKGNvbnN0IGNoYXIqKXBhdGgsIGZvcm1hdCwKKyAgICAgICAgICAgIHBhcmVudCwgc3RvcmFnZUlEKTsKICAgICBpZiAoaGFuZGxlID09IGtJbnZhbGlkT2JqZWN0SGFuZGxlKSB7CiAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKICAgICB9CiAKLSAgaWYgKGZvcm1hdCA9PSBNVFBfRk9STUFUX0FTU09DSUFUSU9OKSB7Ci0gICAgICAgIG1vZGVfdCBtYXNrID0gdW1hc2soMCk7Ci0gICAgICAgIGludCByZXQgPSBta2RpcigoY29uc3QgY2hhciAqKXBhdGgsIG1EaXJlY3RvcnlQZXJtaXNzaW9uKTsKLSAgICAgICAgdW1hc2sobWFzayk7Ci0gICAgICAgIGlmIChyZXQgJiYgcmV0ICE9IC1FRVhJU1QpCisgICAgaWYgKGZvcm1hdCA9PSBNVFBfRk9STUFUX0FTU09DSUFUSU9OKSB7CisgICAgICAgIGludCByZXQgPSBtYWtlRm9sZGVyKChjb25zdCBjaGFyICopcGF0aCk7CisgICAgICAgIGlmIChyZXQpCiAgICAgICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0dFTkVSQUxfRVJST1I7Ci0gICAgICAgIGNob3duKChjb25zdCBjaGFyICopcGF0aCwgZ2V0dWlkKCksIG1GaWxlR3JvdXApOwogCiAgICAgICAgIC8vIFNlbmRPYmplY3QgZG9lcyBub3QgZ2V0IHNlbnQgZm9yIGRpcmVjdG9yaWVzLCBzbyBjYWxsIGVuZFNlbmRPYmplY3QgaGVyZSBpbnN0ZWFkCi0gICAgICAgIG1EYXRhYmFzZS0+ZW5kU2VuZE9iamVjdChwYXRoLCBoYW5kbGUsIE1UUF9GT1JNQVRfQVNTT0NJQVRJT04sIE1UUF9SRVNQT05TRV9PSyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbVNlbmRPYmplY3RGaWxlUGF0aCA9IHBhdGg7Ci0gICAgICAgIC8vIHNhdmUgdGhlIGhhbmRsZSBmb3IgdGhlIFNlbmRPYmplY3QgY2FsbCwgd2hpY2ggc2hvdWxkIGZvbGxvdwotICAgICAgICBtU2VuZE9iamVjdEhhbmRsZSA9IGhhbmRsZTsKLSAgICAgICAgbVNlbmRPYmplY3RGb3JtYXQgPSBmb3JtYXQ7Ci0gICAgICAgIG1TZW5kT2JqZWN0TW9kaWZpZWRUaW1lID0gbW9kaWZpZWRUaW1lOworICAgICAgICBtRGF0YWJhc2UtPmVuZFNlbmRPYmplY3QoaGFuZGxlLCBNVFBfUkVTUE9OU0VfT0spOwogICAgIH0KKyAgICBtU2VuZE9iamVjdEZpbGVQYXRoID0gcGF0aDsKKyAgICAvLyBzYXZlIHRoZSBoYW5kbGUgZm9yIHRoZSBTZW5kT2JqZWN0IGNhbGwsIHdoaWNoIHNob3VsZCBmb2xsb3cKKyAgICBtU2VuZE9iamVjdEhhbmRsZSA9IGhhbmRsZTsKKyAgICBtU2VuZE9iamVjdEZvcm1hdCA9IGZvcm1hdDsKKyAgICBtU2VuZE9iamVjdE1vZGlmaWVkVGltZSA9IG1vZGlmaWVkVGltZTsKIAogICAgIG1SZXNwb25zZS5zZXRQYXJhbWV0ZXIoMSwgc3RvcmFnZUlEKTsKICAgICBtUmVzcG9uc2Uuc2V0UGFyYW1ldGVyKDIsIHBhcmVudCk7CkBAIC0xMDExLDYgKzk5NSwxNTMgQEAKICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOwogfQogCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb01vdmVPYmplY3QoKSB7CisgICAgaWYgKCFoYXNTdG9yYWdlKCkpCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICBpZiAobVJlcXVlc3QuZ2V0UGFyYW1ldGVyQ291bnQoKSA8IDMpCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgTXRwT2JqZWN0SGFuZGxlIG9iamVjdEhhbmRsZSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKKyAgICBNdHBTdG9yYWdlSUQgc3RvcmFnZUlEID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDIpOworICAgIE10cFN0b3JhZ2UqIHN0b3JhZ2UgPSBnZXRTdG9yYWdlKHN0b3JhZ2VJRCk7CisgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigzKTsKKyAgICBpZiAoIXN0b3JhZ2UpCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9TVE9SQUdFX0lEOworICAgIE10cFN0cmluZ0J1ZmZlciBwYXRoOworICAgIE10cFJlc3BvbnNlQ29kZSByZXN1bHQ7CisKKyAgICBNdHBTdHJpbmdCdWZmZXIgZnJvbVBhdGg7CisgICAgaW50NjRfdCBmaWxlTGVuZ3RoOworICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQ7CisgICAgTXRwT2JqZWN0SW5mbyBpbmZvKG9iamVjdEhhbmRsZSk7CisgICAgcmVzdWx0ID0gbURhdGFiYXNlLT5nZXRPYmplY3RJbmZvKG9iamVjdEhhbmRsZSwgaW5mbyk7CisgICAgaWYgKHJlc3VsdCAhPSBNVFBfUkVTUE9OU0VfT0spCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgcmVzdWx0ID0gbURhdGFiYXNlLT5nZXRPYmplY3RGaWxlUGF0aChvYmplY3RIYW5kbGUsIGZyb21QYXRoLCBmaWxlTGVuZ3RoLCBmb3JtYXQpOworICAgIGlmIChyZXN1bHQgIT0gTVRQX1JFU1BPTlNFX09LKQorICAgICAgICByZXR1cm4gcmVzdWx0OworCisgICAgLy8gc3BlY2lhbCBjYXNlIHRoZSByb290CisgICAgaWYgKHBhcmVudCA9PSAwKSB7CisgICAgICAgIHBhdGguc2V0KHN0b3JhZ2UtPmdldFBhdGgoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50NjRfdCBwYXJlbnRMZW5ndGg7CisgICAgICAgIE10cE9iamVjdEZvcm1hdCBwYXJlbnRGb3JtYXQ7CisgICAgICAgIHJlc3VsdCA9IG1EYXRhYmFzZS0+Z2V0T2JqZWN0RmlsZVBhdGgocGFyZW50LCBwYXRoLCBwYXJlbnRMZW5ndGgsIHBhcmVudEZvcm1hdCk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gTVRQX1JFU1BPTlNFX09LKQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgaWYgKHBhcmVudEZvcm1hdCAhPSBNVFBfRk9STUFUX0FTU09DSUFUSU9OKQorICAgICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX1BBUkVOVF9PQkpFQ1Q7CisgICAgfQorCisgICAgaWYgKHBhdGhbcGF0aC5zaXplKCkgLSAxXSAhPSAnLycpCisgICAgICAgIHBhdGguYXBwZW5kKCIvIik7CisgICAgcGF0aC5hcHBlbmQoaW5mby5tTmFtZSk7CisKKyAgICByZXN1bHQgPSBtRGF0YWJhc2UtPmJlZ2luTW92ZU9iamVjdChvYmplY3RIYW5kbGUsIHBhcmVudCwgc3RvcmFnZUlEKTsKKyAgICBpZiAocmVzdWx0ICE9IE1UUF9SRVNQT05TRV9PSykKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKworICAgIGlmIChpbmZvLm1TdG9yYWdlSUQgPT0gc3RvcmFnZUlEKSB7CisgICAgICAgIEFMT0dWKCJNb3ZpbmcgZmlsZSBmcm9tICVzIHRvICVzIiwgKGNvbnN0IGNoYXIqKWZyb21QYXRoLCAoY29uc3QgY2hhciopcGF0aCk7CisgICAgICAgIGlmIChyZW5hbWVUbyhmcm9tUGF0aCwgcGF0aCkpIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJyZW5hbWUoKSBmYWlsZWQgZnJvbSAiIDw8IGZyb21QYXRoIDw8ICIgdG8gIiA8PCBwYXRoOworICAgICAgICAgICAgcmVzdWx0ID0gTVRQX1JFU1BPTlNFX0dFTkVSQUxfRVJST1I7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiTW92aW5nIGFjcm9zcyBzdG9yYWdlcyBmcm9tICVzIHRvICVzIiwgKGNvbnN0IGNoYXIqKWZyb21QYXRoLCAoY29uc3QgY2hhciopcGF0aCk7CisgICAgICAgIGlmIChmb3JtYXQgPT0gTVRQX0ZPUk1BVF9BU1NPQ0lBVElPTikgeworICAgICAgICAgICAgaW50IHJldCA9IG1ha2VGb2xkZXIoKGNvbnN0IGNoYXIgKilwYXRoKTsKKyAgICAgICAgICAgIHJldCArPSBjb3B5UmVjdXJzaXZlKGZyb21QYXRoLCBwYXRoKTsKKyAgICAgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGVsZXRlUGF0aChmcm9tUGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoY29weUZpbGUoZnJvbVBhdGgsIHBhdGgpKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gTVRQX1JFU1BPTlNFX0dFTkVSQUxfRVJST1I7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRlbGV0ZVBhdGgoZnJvbVBhdGgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gSWYgdGhlIG1vdmUgZmFpbGVkLCB1bmRvIHRoZSBkYXRhYmFzZSBjaGFuZ2UKKyAgICBtRGF0YWJhc2UtPmVuZE1vdmVPYmplY3QoaW5mby5tUGFyZW50LCBwYXJlbnQsIGluZm8ubVN0b3JhZ2VJRCwgc3RvcmFnZUlELCBvYmplY3RIYW5kbGUsCisgICAgICAgICAgICByZXN1bHQgPT0gTVRQX1JFU1BPTlNFX09LKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvQ29weU9iamVjdCgpIHsKKyAgICBpZiAoIWhhc1N0b3JhZ2UoKSkKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOworICAgIE10cFJlc3BvbnNlQ29kZSByZXN1bHQgPSBNVFBfUkVTUE9OU0VfT0s7CisgICAgaWYgKG1SZXF1ZXN0LmdldFBhcmFtZXRlckNvdW50KCkgPCAzKQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfUEFSQU1FVEVSOworICAgIE10cE9iamVjdEhhbmRsZSBvYmplY3RIYW5kbGUgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigyKTsKKyAgICBNdHBTdG9yYWdlKiBzdG9yYWdlID0gZ2V0U3RvcmFnZShzdG9yYWdlSUQpOworICAgIE10cE9iamVjdEhhbmRsZSBwYXJlbnQgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMyk7CisgICAgaWYgKCFzdG9yYWdlKQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfU1RPUkFHRV9JRDsKKyAgICBNdHBTdHJpbmdCdWZmZXIgcGF0aDsKKworICAgIE10cFN0cmluZ0J1ZmZlciBmcm9tUGF0aDsKKyAgICBpbnQ2NF90IGZpbGVMZW5ndGg7CisgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdDsKKyAgICBNdHBPYmplY3RJbmZvIGluZm8ob2JqZWN0SGFuZGxlKTsKKyAgICByZXN1bHQgPSBtRGF0YWJhc2UtPmdldE9iamVjdEluZm8ob2JqZWN0SGFuZGxlLCBpbmZvKTsKKyAgICBpZiAocmVzdWx0ICE9IE1UUF9SRVNQT05TRV9PSykKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICByZXN1bHQgPSBtRGF0YWJhc2UtPmdldE9iamVjdEZpbGVQYXRoKG9iamVjdEhhbmRsZSwgZnJvbVBhdGgsIGZpbGVMZW5ndGgsIGZvcm1hdCk7CisgICAgaWYgKHJlc3VsdCAhPSBNVFBfUkVTUE9OU0VfT0spCisgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICAvLyBzcGVjaWFsIGNhc2UgdGhlIHJvb3QKKyAgICBpZiAocGFyZW50ID09IDApIHsKKyAgICAgICAgcGF0aC5zZXQoc3RvcmFnZS0+Z2V0UGF0aCgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQ2NF90IHBhcmVudExlbmd0aDsKKyAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IHBhcmVudEZvcm1hdDsKKyAgICAgICAgcmVzdWx0ID0gbURhdGFiYXNlLT5nZXRPYmplY3RGaWxlUGF0aChwYXJlbnQsIHBhdGgsIHBhcmVudExlbmd0aCwgcGFyZW50Rm9ybWF0KTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBNVFBfUkVTUE9OU0VfT0spCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICBpZiAocGFyZW50Rm9ybWF0ICE9IE1UUF9GT1JNQVRfQVNTT0NJQVRJT04pCisgICAgICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfUEFSRU5UX09CSkVDVDsKKyAgICB9CisKKyAgICAvLyBjaGVjayBzcGFjZSBmaXJzdAorICAgIGlmICgodWludDY0X3QpIGZpbGVMZW5ndGggPiBzdG9yYWdlLT5nZXRGcmVlU3BhY2UoKSkKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9TVE9SQUdFX0ZVTEw7CisKKyAgICBpZiAocGF0aFtwYXRoLnNpemUoKSAtIDFdICE9ICcvJykKKyAgICAgICAgcGF0aC5hcHBlbmQoIi8iKTsKKyAgICBwYXRoLmFwcGVuZChpbmZvLm1OYW1lKTsKKworICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUgPSBtRGF0YWJhc2UtPmJlZ2luQ29weU9iamVjdChvYmplY3RIYW5kbGUsIHBhcmVudCwgc3RvcmFnZUlEKTsKKyAgICBpZiAoaGFuZGxlID09IGtJbnZhbGlkT2JqZWN0SGFuZGxlKSB7CisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICB9CisKKyAgICBBTE9HVigiQ29weWluZyBmaWxlIGZyb20gJXMgdG8gJXMiLCAoY29uc3QgY2hhciopZnJvbVBhdGgsIChjb25zdCBjaGFyKilwYXRoKTsKKyAgICBpZiAoZm9ybWF0ID09IE1UUF9GT1JNQVRfQVNTT0NJQVRJT04pIHsKKyAgICAgICAgaW50IHJldCA9IG1ha2VGb2xkZXIoKGNvbnN0IGNoYXIgKilwYXRoKTsKKyAgICAgICAgcmV0ICs9IGNvcHlSZWN1cnNpdmUoZnJvbVBhdGgsIHBhdGgpOworICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICByZXN1bHQgPSBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChjb3B5RmlsZShmcm9tUGF0aCwgcGF0aCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgbURhdGFiYXNlLT5lbmRDb3B5T2JqZWN0KGhhbmRsZSwgcmVzdWx0KTsKKyAgICBtUmVzcG9uc2Uuc2V0UGFyYW1ldGVyKDEsIGhhbmRsZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwogTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9TZW5kT2JqZWN0KCkgewogICAgIGlmICghaGFzU3RvcmFnZSgpKQogICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0dFTkVSQUxfRVJST1I7CkBAIC0xMDI5LDIzICsxMTYwLDMyIEBACiAgICAgfQogCiAgICAgLy8gcmVhZCB0aGUgaGVhZGVyLCBhbmQgcG9zc2libHkgc29tZSBkYXRhCi0gICAgcmV0ID0gbURhdGEucmVhZChzSGFuZGxlKTsKKyAgICByZXQgPSBtRGF0YS5yZWFkKG1IYW5kbGUpOwogICAgIGlmIChyZXQgPCBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKSB7CiAgICAgICAgIHJlc3VsdCA9IE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOwogICAgICAgICBnb3RvIGRvbmU7CiAgICAgfQogICAgIGluaXRpYWxEYXRhID0gcmV0IC0gTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRTsKIAorICAgIGlmIChtU2VuZE9iamVjdEZvcm1hdCA9PSBNVFBfRk9STUFUX0FTU09DSUFUSU9OKSB7CisgICAgICAgIGlmIChpbml0aWFsRGF0YSAhPSAwKQorICAgICAgICAgICAgQUxPR0UoIkV4cGVjdGVkIGZvbGRlciBzaXplIHRvIGJlIDAhIik7CisgICAgICAgIG1TZW5kT2JqZWN0SGFuZGxlID0ga0ludmFsaWRPYmplY3RIYW5kbGU7CisgICAgICAgIG1TZW5kT2JqZWN0Rm9ybWF0ID0gMDsKKyAgICAgICAgbVNlbmRPYmplY3RNb2RpZmllZFRpbWUgPSAwOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKwogICAgIG10cF9maWxlX3JhbmdlICBtZnI7CiAgICAgbWZyLmZkID0gb3BlbihtU2VuZE9iamVjdEZpbGVQYXRoLCBPX1JEV1IgfCBPX0NSRUFUIHwgT19UUlVOQywgU19JUlVTUiB8IFNfSVdVU1IpOwogICAgIGlmIChtZnIuZmQgPCAwKSB7CiAgICAgICAgIHJlc3VsdCA9IE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOwogICAgICAgICBnb3RvIGRvbmU7CiAgICAgfQotICAgIGZjaG93bihtZnIuZmQsIGdldHVpZCgpLCBtRmlsZUdyb3VwKTsKKyAgICBmY2hvd24obWZyLmZkLCBnZXR1aWQoKSwgRklMRV9HUk9VUCk7CiAgICAgLy8gc2V0IHBlcm1pc3Npb25zCiAgICAgbWFzayA9IHVtYXNrKDApOwotICAgIGZjaG1vZChtZnIuZmQsIG1GaWxlUGVybWlzc2lvbik7CisgICAgZmNobW9kKG1mci5mZCwgRklMRV9QRVJNKTsKICAgICB1bWFzayhtYXNrKTsKIAogICAgIGlmIChpbml0aWFsRGF0YSA+IDApIHsKQEAgLTEwNjgsNyArMTIwOCw3IEBACiAgICAgICAgIG1mci50cmFuc2FjdGlvbl9pZCA9IDA7CiAKICAgICAgICAgLy8gdHJhbnNmZXIgdGhlIGZpbGUKLSAgICAgICAgcmV0ID0gc0hhbmRsZS0+cmVjZWl2ZUZpbGUobWZyLCBtZnIubGVuZ3RoID09IDAgJiYKKyAgICAgICAgcmV0ID0gbUhhbmRsZS0+cmVjZWl2ZUZpbGUobWZyLCBtZnIubGVuZ3RoID09IDAgJiYKICAgICAgICAgICAgICAgICBpbml0aWFsRGF0YSA9PSBNVFBfQlVGRkVSX1NJWkUgLSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKTsKICAgICAgICAgaWYgKChyZXQgPCAwKSAmJiAoZXJybm8gPT0gRUNBTkNFTEVEKSkgewogICAgICAgICAgICAgaXNDYW5jZWxlZCA9IHRydWU7CkBAIC0xMDg2LDcgKzEyMjYsNyBAQAogICAgIH0KIAogICAgIGZzdGF0KG1mci5mZCwgJnNzdGF0KTsKLSAgICBjbG9zZShtZnIuZmQpOworICAgIGNsb3NlT2JqRmQobWZyLmZkLCBtU2VuZE9iamVjdEZpbGVQYXRoKTsKIAogICAgIGlmIChyZXQgPCAwKSB7CiAgICAgICAgIEFMT0dFKCJNdHAgcmVjZWl2ZSBmaWxlIGdvdCBlcnJvciAlcyIsIHN0cmVycm9yKGVycm5vKSk7CkBAIC0xMTAxLDggKzEyNDEsNyBAQAogICAgIC8vIHJlc2V0IHNvIHdlIGRvbid0IGF0dGVtcHQgdG8gc2VuZCB0aGUgZGF0YSBiYWNrCiAgICAgbURhdGEucmVzZXQoKTsKIAotICAgIG1EYXRhYmFzZS0+ZW5kU2VuZE9iamVjdChtU2VuZE9iamVjdEZpbGVQYXRoLCBtU2VuZE9iamVjdEhhbmRsZSwgbVNlbmRPYmplY3RGb3JtYXQsCi0gICAgICAgICAgICByZXN1bHQgPT0gTVRQX1JFU1BPTlNFX09LKTsKKyAgICBtRGF0YWJhc2UtPmVuZFNlbmRPYmplY3QobVNlbmRPYmplY3RIYW5kbGUsIHJlc3VsdCA9PSBNVFBfUkVTUE9OU0VfT0spOwogICAgIG1TZW5kT2JqZWN0SGFuZGxlID0ga0ludmFsaWRPYmplY3RIYW5kbGU7CiAgICAgbVNlbmRPYmplY3RGb3JtYXQgPSAwOwogICAgIG1TZW5kT2JqZWN0TW9kaWZpZWRUaW1lID0gMDsKQEAgLTExMTUsNjUgKzEyNTQsNiBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyB2b2lkIGRlbGV0ZVJlY3Vyc2l2ZShjb25zdCBjaGFyKiBwYXRoKSB7Ci0gICAgY2hhciBwYXRoYnVmW1BBVEhfTUFYXTsKLSAgICBzaXplX3QgcGF0aExlbmd0aCA9IHN0cmxlbihwYXRoKTsKLSAgICBpZiAocGF0aExlbmd0aCA+PSBzaXplb2YocGF0aGJ1ZikgLSAxKSB7Ci0gICAgICAgIEFMT0dFKCJwYXRoIHRvbyBsb25nOiAlc1xuIiwgcGF0aCk7Ci0gICAgfQotICAgIHN0cmNweShwYXRoYnVmLCBwYXRoKTsKLSAgICBpZiAocGF0aGJ1ZltwYXRoTGVuZ3RoIC0gMV0gIT0gJy8nKSB7Ci0gICAgICAgIHBhdGhidWZbcGF0aExlbmd0aCsrXSA9ICcvJzsKLSAgICB9Ci0gICAgY2hhciogZmlsZVNwb3QgPSBwYXRoYnVmICsgcGF0aExlbmd0aDsKLSAgICBpbnQgcGF0aFJlbWFpbmluZyA9IHNpemVvZihwYXRoYnVmKSAtIHBhdGhMZW5ndGggLSAxOwotCi0gICAgRElSKiBkaXIgPSBvcGVuZGlyKHBhdGgpOwotICAgIGlmICghZGlyKSB7Ci0gICAgICAgIEFMT0dFKCJvcGVuZGlyICVzIGZhaWxlZDogJXMiLCBwYXRoLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3RydWN0IGRpcmVudCogZW50cnk7Ci0gICAgd2hpbGUgKChlbnRyeSA9IHJlYWRkaXIoZGlyKSkpIHsKLSAgICAgICAgY29uc3QgY2hhciogbmFtZSA9IGVudHJ5LT5kX25hbWU7Ci0KLSAgICAgICAgLy8gaWdub3JlICIuIiBhbmQgIi4uIgotICAgICAgICBpZiAobmFtZVswXSA9PSAnLicgJiYgKG5hbWVbMV0gPT0gMCB8fCAobmFtZVsxXSA9PSAnLicgJiYgbmFtZVsyXSA9PSAwKSkpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IG5hbWVMZW5ndGggPSBzdHJsZW4obmFtZSk7Ci0gICAgICAgIGlmIChuYW1lTGVuZ3RoID4gcGF0aFJlbWFpbmluZykgewotICAgICAgICAgICAgQUxPR0UoInBhdGggJXMvJXMgdG9vIGxvbmdcbiIsIHBhdGgsIG5hbWUpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgc3RyY3B5KGZpbGVTcG90LCBuYW1lKTsKLQotICAgICAgICBpZiAoZW50cnktPmRfdHlwZSA9PSBEVF9ESVIpIHsKLSAgICAgICAgICAgIGRlbGV0ZVJlY3Vyc2l2ZShwYXRoYnVmKTsKLSAgICAgICAgICAgIHJtZGlyKHBhdGhidWYpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdW5saW5rKHBhdGhidWYpOwotICAgICAgICB9Ci0gICAgfQotICAgIGNsb3NlZGlyKGRpcik7Ci19Ci0KLXN0YXRpYyB2b2lkIGRlbGV0ZVBhdGgoY29uc3QgY2hhciogcGF0aCkgewotICAgIHN0cnVjdCBzdGF0IHN0YXRidWY7Ci0gICAgaWYgKHN0YXQocGF0aCwgJnN0YXRidWYpID09IDApIHsKLSAgICAgICAgaWYgKFNfSVNESVIoc3RhdGJ1Zi5zdF9tb2RlKSkgewotICAgICAgICAgICAgZGVsZXRlUmVjdXJzaXZlKHBhdGgpOwotICAgICAgICAgICAgcm1kaXIocGF0aCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB1bmxpbmsocGF0aCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiZGVsZXRlUGF0aCBzdGF0IGZhaWxlZCBmb3IgJXM6ICVzIiwgcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICB9Ci19Ci0KIE10cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvRGVsZXRlT2JqZWN0KCkgewogICAgIGlmICghaGFzU3RvcmFnZSgpKQogICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfT0JKRUNUX0hBTkRMRTsKQEAgLTExODQsMTkgKzEyNjQsMjEgQEAKICAgICAvLyBGSVhNRSAtIHN1cHBvcnQgZGVsZXRpbmcgYWxsIG9iamVjdHMgaWYgaGFuZGxlIGlzIDB4RkZGRkZGRkYKICAgICAvLyBGSVhNRSAtIGltcGxlbWVudCBkZWxldGluZyBvYmplY3RzIGJ5IGZvcm1hdAogCi0gICAgTXRwU3RyaW5nIGZpbGVQYXRoOworICAgIE10cFN0cmluZ0J1ZmZlciBmaWxlUGF0aDsKICAgICBpbnQ2NF90IGZpbGVMZW5ndGg7CiAgICAgaW50IHJlc3VsdCA9IG1EYXRhYmFzZS0+Z2V0T2JqZWN0RmlsZVBhdGgoaGFuZGxlLCBmaWxlUGF0aCwgZmlsZUxlbmd0aCwgZm9ybWF0KTsKLSAgICBpZiAocmVzdWx0ID09IE1UUF9SRVNQT05TRV9PSykgewotICAgICAgICBBTE9HVigiZGVsZXRpbmcgJXMiLCAoY29uc3QgY2hhciAqKWZpbGVQYXRoKTsKLSAgICAgICAgcmVzdWx0ID0gbURhdGFiYXNlLT5kZWxldGVGaWxlKGhhbmRsZSk7Ci0gICAgICAgIC8vIERvbid0IGRlbGV0ZSB0aGUgYWN0dWFsIGZpbGVzIHVubGVzcyB0aGUgZGF0YWJhc2UgZGVsZXRpb24gaXMgYWxsb3dlZAotICAgICAgICBpZiAocmVzdWx0ID09IE1UUF9SRVNQT05TRV9PSykgewotICAgICAgICAgICAgZGVsZXRlUGF0aCgoY29uc3QgY2hhciAqKWZpbGVQYXRoKTsKLSAgICAgICAgfQotICAgIH0KKyAgICBpZiAocmVzdWx0ICE9IE1UUF9SRVNQT05TRV9PSykKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKIAotICAgIHJldHVybiByZXN1bHQ7CisgICAgLy8gRG9uJ3QgZGVsZXRlIHRoZSBhY3R1YWwgZmlsZXMgdW5sZXNzIHRoZSBkYXRhYmFzZSBkZWxldGlvbiBpcyBhbGxvd2VkCisgICAgcmVzdWx0ID0gbURhdGFiYXNlLT5iZWdpbkRlbGV0ZU9iamVjdChoYW5kbGUpOworICAgIGlmIChyZXN1bHQgIT0gTVRQX1JFU1BPTlNFX09LKQorICAgICAgICByZXR1cm4gcmVzdWx0OworCisgICAgYm9vbCBzdWNjZXNzID0gZGVsZXRlUGF0aCgoY29uc3QgY2hhciAqKWZpbGVQYXRoKTsKKworICAgIG1EYXRhYmFzZS0+ZW5kRGVsZXRlT2JqZWN0KGhhbmRsZSwgc3VjY2Vzcyk7CisgICAgcmV0dXJuIHN1Y2Nlc3MgPyByZXN1bHQgOiBNVFBfUkVTUE9OU0VfUEFSVElBTF9ERUxFVElPTjsKIH0KIAogTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXRPYmplY3RQcm9wRGVzYygpIHsKQEAgLTEyNTUsNyArMTMzNyw3IEBACiAgICAgQUxPR1YoInJlY2VpdmluZyBwYXJ0aWFsICVzICUiIFBSSXU2NCAiICUiIFBSSXUzMiwgZmlsZVBhdGgsIG9mZnNldCwgbGVuZ3RoKTsKIAogICAgIC8vIHJlYWQgdGhlIGhlYWRlciwgYW5kIHBvc3NpYmx5IHNvbWUgZGF0YQotICAgIGludCByZXQgPSBtRGF0YS5yZWFkKHNIYW5kbGUpOworICAgIGludCByZXQgPSBtRGF0YS5yZWFkKG1IYW5kbGUpOwogICAgIGlmIChyZXQgPCBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKQogICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0dFTkVSQUxfRVJST1I7CiAgICAgaW50IGluaXRpYWxEYXRhID0gcmV0IC0gTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRTsKQEAgLTEyNzgsNyArMTM2MCw3IEBACiAgICAgICAgIG1mci50cmFuc2FjdGlvbl9pZCA9IDA7CiAKICAgICAgICAgLy8gdHJhbnNmZXIgdGhlIGZpbGUKLSAgICAgICAgcmV0ID0gc0hhbmRsZS0+cmVjZWl2ZUZpbGUobWZyLCBtZnIubGVuZ3RoID09IDAgJiYKKyAgICAgICAgcmV0ID0gbUhhbmRsZS0+cmVjZWl2ZUZpbGUobWZyLCBtZnIubGVuZ3RoID09IDAgJiYKICAgICAgICAgICAgICAgICBpbml0aWFsRGF0YSA9PSBNVFBfQlVGRkVSX1NJWkUgLSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKTsKICAgICAgICAgaWYgKChyZXQgPCAwKSAmJiAoZXJybm8gPT0gRUNBTkNFTEVEKSkgewogICAgICAgICAgICAgaXNDYW5jZWxlZCA9IHRydWU7CkBAIC0xMzMyLDcgKzE0MTQsNyBAQAogICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0dFTkVSQUxfRVJST1I7CiAgICAgfQogCi0gICAgTXRwU3RyaW5nIHBhdGg7CisgICAgTXRwU3RyaW5nQnVmZmVyIHBhdGg7CiAgICAgaW50NjRfdCBmaWxlTGVuZ3RoOwogICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQ7CiAgICAgaW50IHJlc3VsdCA9IG1EYXRhYmFzZS0+Z2V0T2JqZWN0RmlsZVBhdGgoaGFuZGxlLCBwYXRoLCBmaWxlTGVuZ3RoLCBmb3JtYXQpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFNlcnZlci5oIGIvbWVkaWEvbXRwL010cFNlcnZlci5oCmluZGV4IDA4YTllNGEuLmY2OTM5ZDcgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBTZXJ2ZXIuaAorKysgYi9tZWRpYS9tdHAvTXRwU2VydmVyLmgKQEAgLTIxLDQyICsyMSwzNiBAQAogI2luY2x1ZGUgIk10cERhdGFQYWNrZXQuaCIKICNpbmNsdWRlICJNdHBSZXNwb25zZVBhY2tldC5oIgogI2luY2x1ZGUgIk10cEV2ZW50UGFja2V0LmgiCisjaW5jbHVkZSAiTXRwU3RyaW5nQnVmZmVyLmgiCiAjaW5jbHVkZSAibXRwLmgiCiAjaW5jbHVkZSAiTXRwVXRpbHMuaCIKICNpbmNsdWRlICJJTXRwSGFuZGxlLmgiCiAKLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8cXVldWU+CiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHF1ZXVlPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIE10cERhdGFiYXNlOworY2xhc3MgSU10cERhdGFiYXNlOwogY2xhc3MgTXRwU3RvcmFnZTsKIAogY2xhc3MgTXRwU2VydmVyIHsKIAogcHJpdmF0ZToKLSAgICBNdHBEYXRhYmFzZSogICAgICAgIG1EYXRhYmFzZTsKKyAgICBJTXRwRGF0YWJhc2UqICAgICAgIG1EYXRhYmFzZTsKIAogICAgIC8vIGFwcGVhciBhcyBhIFBUUCBkZXZpY2UKICAgICBib29sICAgICAgICAgICAgICAgIG1QdHA7CiAKLSAgICAvLyBncm91cCB0byBvd24gbmV3IGZpbGVzIGFuZCBmb2xkZXJzCi0gICAgaW50ICAgICAgICAgICAgICAgICBtRmlsZUdyb3VwOwotICAgIC8vIHBlcm1pc3Npb25zIGZvciBuZXcgZmlsZXMgYW5kIGRpcmVjdG9yaWVzCi0gICAgaW50ICAgICAgICAgICAgICAgICBtRmlsZVBlcm1pc3Npb247Ci0gICAgaW50ICAgICAgICAgICAgICAgICBtRGlyZWN0b3J5UGVybWlzc2lvbjsKLQogICAgIC8vIE1hbnVmYWN0dXJlciB0byByZXBvcnQgaW4gRGV2aWNlSW5mbwotICAgIE10cFN0cmluZyAgICAgICAgICAgbURldmljZUluZm9NYW51ZmFjdHVyZXI7CisgICAgTXRwU3RyaW5nQnVmZmVyICAgICBtRGV2aWNlSW5mb01hbnVmYWN0dXJlcjsKICAgICAvLyBNb2RlbCB0byByZXBvcnQgaW4gRGV2aWNlSW5mbwotICAgIE10cFN0cmluZyAgICAgICAgICAgbURldmljZUluZm9Nb2RlbDsKKyAgICBNdHBTdHJpbmdCdWZmZXIgICAgIG1EZXZpY2VJbmZvTW9kZWw7CiAgICAgLy8gRGV2aWNlIHZlcnNpb24gdG8gcmVwb3J0IGluIERldmljZUluZm8KLSAgICBNdHBTdHJpbmcgICAgICAgICAgIG1EZXZpY2VJbmZvRGV2aWNlVmVyc2lvbjsKKyAgICBNdHBTdHJpbmdCdWZmZXIgICAgIG1EZXZpY2VJbmZvRGV2aWNlVmVyc2lvbjsKICAgICAvLyBTZXJpYWwgbnVtYmVyIHRvIHJlcG9ydCBpbiBEZXZpY2VJbmZvCi0gICAgTXRwU3RyaW5nICAgICAgICAgICBtRGV2aWNlSW5mb1NlcmlhbE51bWJlcjsKKyAgICBNdHBTdHJpbmdCdWZmZXIgICAgIG1EZXZpY2VJbmZvU2VyaWFsTnVtYmVyOwogCiAgICAgLy8gY3VycmVudCBzZXNzaW9uIElECiAgICAgTXRwU2Vzc2lvbklEICAgICAgICBtU2Vzc2lvbklEOwpAQCAtNzEsMjMgKzY1LDIzIEBACiAKICAgICBNdHBTdG9yYWdlTGlzdCAgICAgIG1TdG9yYWdlczsKIAotICAgIHN0YXRpYyBJTXRwSGFuZGxlKiAgc0hhbmRsZTsKKyAgICBJTXRwSGFuZGxlKiAgICAgICAgIG1IYW5kbGU7CiAKICAgICAvLyBoYW5kbGUgZm9yIG5ldyBvYmplY3QsIHNldCBieSBTZW5kT2JqZWN0SW5mbyBhbmQgdXNlZCBieSBTZW5kT2JqZWN0CiAgICAgTXRwT2JqZWN0SGFuZGxlICAgICBtU2VuZE9iamVjdEhhbmRsZTsKICAgICBNdHBPYmplY3RGb3JtYXQgICAgIG1TZW5kT2JqZWN0Rm9ybWF0OwotICAgIE10cFN0cmluZyAgICAgICAgICAgbVNlbmRPYmplY3RGaWxlUGF0aDsKKyAgICBNdHBTdHJpbmdCdWZmZXIgICAgIG1TZW5kT2JqZWN0RmlsZVBhdGg7CiAgICAgc2l6ZV90ICAgICAgICAgICAgICBtU2VuZE9iamVjdEZpbGVTaXplOwogICAgIHRpbWVfdCAgICAgICAgICAgICAgbVNlbmRPYmplY3RNb2RpZmllZFRpbWU7CiAKLSAgICBNdXRleCAgICAgICAgICAgICAgIG1NdXRleDsKKyAgICBzdGQ6Om11dGV4ICAgICAgICAgIG1NdXRleDsKIAogICAgIC8vIHJlcHJlc2VudHMgYW4gTVRQIG9iamVjdCB0aGF0IGlzIGJlaW5nIGVkaXRlZCB1c2luZyB0aGUgYW5kcm9pZCBleHRlbnNpb25zCiAgICAgLy8gZm9yIGRpcmVjdCBlZGl0aW5nIChCZWdpbkVkaXRPYmplY3QsIFNlbmRQYXJ0aWFsT2JqZWN0LCBUcnVuY2F0ZU9iamVjdCBhbmQgRW5kRWRpdE9iamVjdCkKICAgICBjbGFzcyBPYmplY3RFZGl0IHsKICAgICAgICAgcHVibGljOgogICAgICAgICBNdHBPYmplY3RIYW5kbGUgICAgIG1IYW5kbGU7Ci0gICAgICAgIE10cFN0cmluZyAgICAgICAgICAgbVBhdGg7CisgICAgICAgIE10cFN0cmluZ0J1ZmZlciAgICAgICAgICAgbVBhdGg7CiAgICAgICAgIHVpbnQ2NF90ICAgICAgICAgICAgbVNpemU7CiAgICAgICAgIE10cE9iamVjdEZvcm1hdCAgICAgbUZvcm1hdDsKICAgICAgICAgaW50ICAgICAgICAgICAgICAgICBtRkQ7CkBAIC0xMDEsMTUgKzk1LDE0IEBACiAgICAgICAgICAgICBjbG9zZShtRkQpOwogICAgICAgICB9CiAgICAgfTsKLSAgICBWZWN0b3I8T2JqZWN0RWRpdCo+ICBtT2JqZWN0RWRpdExpc3Q7CisgICAgc3RkOjp2ZWN0b3I8T2JqZWN0RWRpdCo+ICBtT2JqZWN0RWRpdExpc3Q7CiAKIHB1YmxpYzoKLSAgICAgICAgICAgICAgICAgICAgICAgIE10cFNlcnZlcihNdHBEYXRhYmFzZSogZGF0YWJhc2UsIGJvb2wgcHRwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGVHcm91cCwgaW50IGZpbGVQZXJtLCBpbnQgZGlyZWN0b3J5UGVybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE10cFN0cmluZyYgZGV2aWNlSW5mb01hbnVmYWN0dXJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE10cFN0cmluZyYgZGV2aWNlSW5mb01vZGVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTXRwU3RyaW5nJiBkZXZpY2VJbmZvRGV2aWNlVmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE10cFN0cmluZyYgZGV2aWNlSW5mb1NlcmlhbE51bWJlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBNdHBTZXJ2ZXIoSU10cERhdGFiYXNlKiBkYXRhYmFzZSwgaW50IGNvbnRyb2xGZCwgYm9vbCBwdHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VJbmZvTWFudWZhY3R1cmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlSW5mb01vZGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlSW5mb0RldmljZVZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VJbmZvU2VyaWFsTnVtYmVyKTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5NdHBTZXJ2ZXIoKTsKIAogICAgIE10cFN0b3JhZ2UqICAgICAgICAgZ2V0U3RvcmFnZShNdHBTdG9yYWdlSUQgaWQpOwpAQCAtMTE4LDcgKzExMSw2IEBACiAgICAgdm9pZCAgICAgICAgICAgICAgICBhZGRTdG9yYWdlKE10cFN0b3JhZ2UqIHN0b3JhZ2UpOwogICAgIHZvaWQgICAgICAgICAgICAgICAgcmVtb3ZlU3RvcmFnZShNdHBTdG9yYWdlKiBzdG9yYWdlKTsKIAotICAgIHN0YXRpYyBpbnQgICAgICAgICAgY29uZmlndXJlKGJvb2wgdXNlUHRwKTsKICAgICB2b2lkICAgICAgICAgICAgICAgIHJ1bigpOwogCiAgICAgdm9pZCAgICAgICAgICAgICAgICBzZW5kT2JqZWN0QWRkZWQoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CkBAIC0xMzAsNyArMTIyLDcgQEAKICAgICB2b2lkICAgICAgICAgICAgICAgIHNlbmRTdG9yZVJlbW92ZWQoTXRwU3RvcmFnZUlEIGlkKTsKICAgICB2b2lkICAgICAgICAgICAgICAgIHNlbmRFdmVudChNdHBFdmVudENvZGUgY29kZSwgdWludDMyX3QgcGFyYW0xKTsKIAotICAgIHZvaWQgICAgICAgICAgICAgICAgYWRkRWRpdE9iamVjdChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLCBNdHBTdHJpbmcmIHBhdGgsCisgICAgdm9pZCAgICAgICAgICAgICAgICBhZGRFZGl0T2JqZWN0KE10cE9iamVjdEhhbmRsZSBoYW5kbGUsIE10cFN0cmluZ0J1ZmZlciYgcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgc2l6ZSwgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwgaW50IGZkKTsKICAgICBPYmplY3RFZGl0KiAgICAgICAgIGdldEVkaXRPYmplY3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CiAgICAgdm9pZCAgICAgICAgICAgICAgICByZW1vdmVFZGl0T2JqZWN0KE10cE9iamVjdEhhbmRsZSBoYW5kbGUpOwpAQCAtMTYxLDYgKzE1Myw4IEBACiAgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb1NlbmRPYmplY3RJbmZvKCk7CiAgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb1NlbmRPYmplY3QoKTsKICAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvRGVsZXRlT2JqZWN0KCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb01vdmVPYmplY3QoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvQ29weU9iamVjdCgpOwogICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9HZXRPYmplY3RQcm9wRGVzYygpOwogICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9HZXREZXZpY2VQcm9wRGVzYygpOwogICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9TZW5kUGFydGlhbE9iamVjdCgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFN0b3JhZ2UuY3BwIGIvbWVkaWEvbXRwL010cFN0b3JhZ2UuY3BwCmluZGV4IGQ3N2NhNzIuLmExNDczMjUgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBTdG9yYWdlLmNwcAorKysgYi9tZWRpYS9tdHAvTXRwU3RvcmFnZS5jcHAKQEAgLTE3LDcgKzE3LDYgQEAKICNkZWZpbmUgTE9HX1RBRyAiTXRwU3RvcmFnZSIKIAogI2luY2x1ZGUgIk10cERlYnVnLmgiCi0jaW5jbHVkZSAiTXRwRGF0YWJhc2UuaCIKICNpbmNsdWRlICJNdHBTdG9yYWdlLmgiCiAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KQEAgLTMzLDE0ICszMiwxMiBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBNdHBTdG9yYWdlOjpNdHBTdG9yYWdlKE10cFN0b3JhZ2VJRCBpZCwgY29uc3QgY2hhciogZmlsZVBhdGgsCi0gICAgICAgIGNvbnN0IGNoYXIqIGRlc2NyaXB0aW9uLCB1aW50NjRfdCByZXNlcnZlU3BhY2UsCi0gICAgICAgIGJvb2wgcmVtb3ZhYmxlLCB1aW50NjRfdCBtYXhGaWxlU2l6ZSkKKyAgICAgICAgY29uc3QgY2hhciogZGVzY3JpcHRpb24sIGJvb2wgcmVtb3ZhYmxlLCB1aW50NjRfdCBtYXhGaWxlU2l6ZSkKICAgICA6ICAgbVN0b3JhZ2VJRChpZCksCiAgICAgICAgIG1GaWxlUGF0aChmaWxlUGF0aCksCiAgICAgICAgIG1EZXNjcmlwdGlvbihkZXNjcmlwdGlvbiksCiAgICAgICAgIG1NYXhDYXBhY2l0eSgwKSwKICAgICAgICAgbU1heEZpbGVTaXplKG1heEZpbGVTaXplKSwKLSAgICAgICAgbVJlc2VydmVTcGFjZShyZXNlcnZlU3BhY2UpLAogICAgICAgICBtUmVtb3ZhYmxlKHJlbW92YWJsZSkKIHsKICAgICBBTE9HVigiTXRwU3RvcmFnZSBpZDogJWQgcGF0aDogJXNcbiIsIGlkLCBmaWxlUGF0aCk7CkBAIC03NSw4ICs3Miw3IEBACiAgICAgc3RydWN0IHN0YXRmcyAgIHN0YXQ7CiAgICAgaWYgKHN0YXRmcyhnZXRQYXRoKCksICZzdGF0KSkKICAgICAgICAgcmV0dXJuIC0xOwotICAgIHVpbnQ2NF90IGZyZWVTcGFjZSA9ICh1aW50NjRfdClzdGF0LmZfYmF2YWlsICogKHVpbnQ2NF90KXN0YXQuZl9ic2l6ZTsKLSAgICByZXR1cm4gKGZyZWVTcGFjZSA+IG1SZXNlcnZlU3BhY2UgPyBmcmVlU3BhY2UgLSBtUmVzZXJ2ZVNwYWNlIDogMCk7CisgICAgcmV0dXJuICh1aW50NjRfdClzdGF0LmZfYmF2YWlsICogKHVpbnQ2NF90KXN0YXQuZl9ic2l6ZTsKIH0KIAogY29uc3QgY2hhciogTXRwU3RvcmFnZTo6Z2V0RGVzY3JpcHRpb24oKSBjb25zdCB7CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU3RvcmFnZS5oIGIvbWVkaWEvbXRwL010cFN0b3JhZ2UuaAppbmRleCBlNWEyZTU3Li5lOTUxOGRkIDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwU3RvcmFnZS5oCisrKyBiL21lZGlhL210cC9NdHBTdG9yYWdlLmgKQEAgLTE3LDYgKzE3LDcgQEAKICNpZm5kZWYgX01UUF9TVE9SQUdFX0gKICNkZWZpbmUgX01UUF9TVE9SQUdFX0gKIAorI2luY2x1ZGUgIk10cFN0cmluZ0J1ZmZlci5oIgogI2luY2x1ZGUgIk10cFR5cGVzLmgiCiAjaW5jbHVkZSAibXRwLmgiCiAKQEAgLTI4LDE3ICsyOSwxNSBAQAogCiBwcml2YXRlOgogICAgIE10cFN0b3JhZ2VJRCAgICAgICAgICAgIG1TdG9yYWdlSUQ7Ci0gICAgTXRwU3RyaW5nICAgICAgICAgICAgICAgbUZpbGVQYXRoOwotICAgIE10cFN0cmluZyAgICAgICAgICAgICAgIG1EZXNjcmlwdGlvbjsKKyAgICBNdHBTdHJpbmdCdWZmZXIgICAgICAgICBtRmlsZVBhdGg7CisgICAgTXRwU3RyaW5nQnVmZmVyICAgICAgICAgbURlc2NyaXB0aW9uOwogICAgIHVpbnQ2NF90ICAgICAgICAgICAgICAgIG1NYXhDYXBhY2l0eTsKICAgICB1aW50NjRfdCAgICAgICAgICAgICAgICBtTWF4RmlsZVNpemU7Ci0gICAgLy8gYW1vdW50IG9mIGZyZWUgc3BhY2UgdG8gbGVhdmUgdW5hbGxvY2F0ZWQKLSAgICB1aW50NjRfdCAgICAgICAgICAgICAgICBtUmVzZXJ2ZVNwYWNlOwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1SZW1vdmFibGU7CiAKIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBTdG9yYWdlKE10cFN0b3JhZ2VJRCBpZCwgY29uc3QgY2hhciogZmlsZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkZXNjcmlwdGlvbiwgdWludDY0X3QgcmVzZXJ2ZVNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGVzY3JpcHRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlbW92YWJsZSwgdWludDY0X3QgbWF4RmlsZVNpemUpOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5NdHBTdG9yYWdlKCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBTdHJpbmdCdWZmZXIuY3BwIGIvbWVkaWEvbXRwL010cFN0cmluZ0J1ZmZlci5jcHAKaW5kZXggZGYwNDY5NC4uY2QzNzliZiAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cFN0cmluZ0J1ZmZlci5jcHAKKysrIGIvbWVkaWEvbXRwL010cFN0cmluZ0J1ZmZlci5jcHAKQEAgLTE2LDE2OCArMTYsOTcgQEAKIAogI2RlZmluZSBMT0dfVEFHICJNdHBTdHJpbmdCdWZmZXIiCiAKLSNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjb2RlY3Z0PgorI2luY2x1ZGUgPGxvY2FsZT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSAiTXRwRGF0YVBhY2tldC5oIgogI2luY2x1ZGUgIk10cFN0cmluZ0J1ZmZlci5oIgogCi1uYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgewogCi1NdHBTdHJpbmdCdWZmZXI6Ok10cFN0cmluZ0J1ZmZlcigpCi0gICAgOiAgIG1DaGFyQ291bnQoMCksCi0gICAgICAgIG1CeXRlQ291bnQoMSkKLXsKLSAgICBtQnVmZmVyWzBdID0gMDsKK3N0ZDo6d3N0cmluZ19jb252ZXJ0PHN0ZDo6Y29kZWN2dF91dGY4X3V0ZjE2PGNoYXIxNl90PixjaGFyMTZfdD4gZ0NvbnZlcnQ7CisKK3N0YXRpYyBzdGQ6OnN0cmluZyB1dGYxNlRvVXRmOChzdGQ6OnUxNnN0cmluZyBpbnB1dF9zdHIpIHsKKyAgICByZXR1cm4gZ0NvbnZlcnQudG9fYnl0ZXMoaW5wdXRfc3RyKTsKIH0KIAorc3RhdGljIHN0ZDo6dTE2c3RyaW5nIHV0ZjhUb1V0ZjE2KHN0ZDo6c3RyaW5nIGlucHV0X3N0cikgeworICAgIHJldHVybiBnQ29udmVydC5mcm9tX2J5dGVzKGlucHV0X3N0cik7Cit9CisKK30gLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwogTXRwU3RyaW5nQnVmZmVyOjpNdHBTdHJpbmdCdWZmZXIoY29uc3QgY2hhciogc3JjKQotICAgIDogICBtQ2hhckNvdW50KDApLAotICAgICAgICBtQnl0ZUNvdW50KDEpCiB7CiAgICAgc2V0KHNyYyk7CiB9CiAKIE10cFN0cmluZ0J1ZmZlcjo6TXRwU3RyaW5nQnVmZmVyKGNvbnN0IHVpbnQxNl90KiBzcmMpCi0gICAgOiAgIG1DaGFyQ291bnQoMCksCi0gICAgICAgIG1CeXRlQ291bnQoMSkKIHsKICAgICBzZXQoc3JjKTsKIH0KIAogTXRwU3RyaW5nQnVmZmVyOjpNdHBTdHJpbmdCdWZmZXIoY29uc3QgTXRwU3RyaW5nQnVmZmVyJiBzcmMpCi0gICAgOiAgIG1DaGFyQ291bnQoc3JjLm1DaGFyQ291bnQpLAotICAgICAgICBtQnl0ZUNvdW50KHNyYy5tQnl0ZUNvdW50KQogewotICAgIG1lbWNweShtQnVmZmVyLCBzcmMubUJ1ZmZlciwgbUJ5dGVDb3VudCk7Ci19Ci0KLQotTXRwU3RyaW5nQnVmZmVyOjp+TXRwU3RyaW5nQnVmZmVyKCkgeworICAgIG1TdHJpbmcgPSBzcmMubVN0cmluZzsKIH0KIAogdm9pZCBNdHBTdHJpbmdCdWZmZXI6OnNldChjb25zdCBjaGFyKiBzcmMpIHsKLSAgICAvLyBjb3VudCB0aGUgY2hhcmFjdGVycwotICAgIGludCBjb3VudCA9IDA7Ci0gICAgY2hhciBjaDsKLSAgICBjaGFyKiBkZXN0ID0gKGNoYXIqKW1CdWZmZXI7Ci0KLSAgICB3aGlsZSAoKGNoID0gKnNyYysrKSAhPSAwICYmIGNvdW50IDwgTVRQX1NUUklOR19NQVhfQ0hBUkFDVEVSX05VTUJFUikgewotICAgICAgICBpZiAoKGNoICYgMHg4MCkgPT0gMCkgewotICAgICAgICAgICAgLy8gc2luZ2xlIGJ5dGUgY2hhcmFjdGVyCi0gICAgICAgICAgICAqZGVzdCsrID0gY2g7Ci0gICAgICAgIH0gZWxzZSBpZiAoKGNoICYgMHhFMCkgPT0gMHhDMCkgewotICAgICAgICAgICAgLy8gdHdvIGJ5dGUgY2hhcmFjdGVyCi0gICAgICAgICAgICBjaGFyIGNoMSA9ICpzcmMrKzsKLSAgICAgICAgICAgIGlmICghIGNoMSkgewotICAgICAgICAgICAgICAgIC8vIGxhc3QgY2hhcmFjdGVyIHdhcyB0cnVuY2F0ZWQsIHNvIGlnbm9yZSBsYXN0IGJ5dGUKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgKmRlc3QrKyA9IGNoOwotICAgICAgICAgICAgKmRlc3QrKyA9IGNoMTsKLSAgICAgICAgfSBlbHNlIGlmICgoY2ggJiAweEYwKSA9PSAweEUwKSB7Ci0gICAgICAgICAgICAvLyAzIGJ5dGUgY2hhcgotICAgICAgICAgICAgY2hhciBjaDEgPSAqc3JjKys7Ci0gICAgICAgICAgICBpZiAoISBjaDEpIHsKLSAgICAgICAgICAgICAgICAvLyBsYXN0IGNoYXJhY3RlciB3YXMgdHJ1bmNhdGVkLCBzbyBpZ25vcmUgbGFzdCBieXRlCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaGFyIGNoMiA9ICpzcmMrKzsKLSAgICAgICAgICAgIGlmICghIGNoMikgewotICAgICAgICAgICAgICAgIC8vIGxhc3QgY2hhcmFjdGVyIHdhcyB0cnVuY2F0ZWQsIHNvIGlnbm9yZSBsYXN0IGJ5dGUKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgKmRlc3QrKyA9IGNoOwotICAgICAgICAgICAgKmRlc3QrKyA9IGNoMTsKLSAgICAgICAgICAgICpkZXN0KysgPSBjaDI7Ci0gICAgICAgIH0KLSAgICAgICAgY291bnQrKzsKLSAgICB9Ci0KLSAgICAqZGVzdCsrID0gMDsKLSAgICBtQnl0ZUNvdW50ID0gZGVzdCAtIChjaGFyKiltQnVmZmVyOwotICAgIG1DaGFyQ291bnQgPSBjb3VudDsKKyAgICBtU3RyaW5nID0gc3RkOjpzdHJpbmcoc3JjKTsKIH0KIAogdm9pZCBNdHBTdHJpbmdCdWZmZXI6OnNldChjb25zdCB1aW50MTZfdCogc3JjKSB7Ci0gICAgaW50IGNvdW50ID0gMDsKLSAgICB1aW50MTZfdCBjaDsKLSAgICB1aW50OF90KiBkZXN0ID0gbUJ1ZmZlcjsKLQotICAgIHdoaWxlICgoY2ggPSAqc3JjKyspICE9IDAgJiYgY291bnQgPCBNVFBfU1RSSU5HX01BWF9DSEFSQUNURVJfTlVNQkVSKSB7Ci0gICAgICAgIGlmIChjaCA+PSAweDA4MDApIHsKLSAgICAgICAgICAgICpkZXN0KysgPSAodWludDhfdCkoMHhFMCB8IChjaCA+PiAxMikpOwotICAgICAgICAgICAgKmRlc3QrKyA9ICh1aW50OF90KSgweDgwIHwgKChjaCA+PiA2KSAmIDB4M0YpKTsKLSAgICAgICAgICAgICpkZXN0KysgPSAodWludDhfdCkoMHg4MCB8IChjaCAmIDB4M0YpKTsKLSAgICAgICAgfSBlbHNlIGlmIChjaCA+PSAweDgwKSB7Ci0gICAgICAgICAgICAqZGVzdCsrID0gKHVpbnQ4X3QpKDB4QzAgfCAoY2ggPj4gNikpOwotICAgICAgICAgICAgKmRlc3QrKyA9ICh1aW50OF90KSgweDgwIHwgKGNoICYgMHgzRikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKmRlc3QrKyA9IGNoOwotICAgICAgICB9Ci0gICAgICAgIGNvdW50Kys7Ci0gICAgfQotICAgICpkZXN0KysgPSAwOwotICAgIG1DaGFyQ291bnQgPSBjb3VudDsKLSAgICBtQnl0ZUNvdW50ID0gZGVzdCAtIG1CdWZmZXI7CisgICAgbVN0cmluZyA9IHV0ZjE2VG9VdGY4KHN0ZDo6dTE2c3RyaW5nKChjb25zdCBjaGFyMTZfdCopc3JjKSk7CiB9CiAKIGJvb2wgTXRwU3RyaW5nQnVmZmVyOjpyZWFkRnJvbVBhY2tldChNdHBEYXRhUGFja2V0KiBwYWNrZXQpIHsKICAgICB1aW50OF90IGNvdW50OwogICAgIGlmICghcGFja2V0LT5nZXRVSW50OChjb3VudCkpCiAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoY291bnQgPT0gMCkKKyAgICAgICAgcmV0dXJuIHRydWU7CiAKLSAgICB1aW50OF90KiBkZXN0ID0gbUJ1ZmZlcjsKKyAgICBzdGQ6OnZlY3RvcjxjaGFyMTZfdD4gYnVmZmVyKGNvdW50KTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgdWludDE2X3QgY2g7Ci0KICAgICAgICAgaWYgKCFwYWNrZXQtPmdldFVJbnQxNihjaCkpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmIChjaCA+PSAweDA4MDApIHsKLSAgICAgICAgICAgICpkZXN0KysgPSAodWludDhfdCkoMHhFMCB8IChjaCA+PiAxMikpOwotICAgICAgICAgICAgKmRlc3QrKyA9ICh1aW50OF90KSgweDgwIHwgKChjaCA+PiA2KSAmIDB4M0YpKTsKLSAgICAgICAgICAgICpkZXN0KysgPSAodWludDhfdCkoMHg4MCB8IChjaCAmIDB4M0YpKTsKLSAgICAgICAgfSBlbHNlIGlmIChjaCA+PSAweDgwKSB7Ci0gICAgICAgICAgICAqZGVzdCsrID0gKHVpbnQ4X3QpKDB4QzAgfCAoY2ggPj4gNikpOwotICAgICAgICAgICAgKmRlc3QrKyA9ICh1aW50OF90KSgweDgwIHwgKGNoICYgMHgzRikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKmRlc3QrKyA9IGNoOwotICAgICAgICB9CisgICAgICAgIGJ1ZmZlcltpXSA9IGNoOwogICAgIH0KLSAgICAqZGVzdCsrID0gMDsKLSAgICBtQ2hhckNvdW50ID0gY291bnQ7Ci0gICAgbUJ5dGVDb3VudCA9IGRlc3QgLSBtQnVmZmVyOworICAgIGlmIChidWZmZXJbY291bnQtMV0gIT0gJ1wwJykgeworICAgICAgICBBTE9HRSgiTXRwIHN0cmluZyBub3QgbnVsbCB0ZXJtaW5hdGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtU3RyaW5nID0gdXRmMTZUb1V0Zjgoc3RkOjp1MTZzdHJpbmcoYnVmZmVyLmRhdGEoKSkpOwogICAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIE10cFN0cmluZ0J1ZmZlcjo6d3JpdGVUb1BhY2tldChNdHBEYXRhUGFja2V0KiBwYWNrZXQpIGNvbnN0IHsKLSAgICBpbnQgY291bnQgPSBtQ2hhckNvdW50OwotICAgIGNvbnN0IHVpbnQ4X3QqIHNyYyA9IG1CdWZmZXI7Ci0gICAgcGFja2V0LT5wdXRVSW50OChjb3VudCA+IDAgPyBjb3VudCArIDEgOiAwKTsKKyAgICBzdGQ6OnUxNnN0cmluZyBzcmMxNiA9IHV0ZjhUb1V0ZjE2KG1TdHJpbmcpOworICAgIGludCBjb3VudCA9IHNyYzE2Lmxlbmd0aCgpOwogCi0gICAgLy8gZXhwYW5kIHV0ZjggdG8gMTYgYml0IGNoYXJzCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgIHVpbnQxNl90IGNoOwotICAgICAgICB1aW50MTZfdCBjaDEgPSAqc3JjKys7Ci0gICAgICAgIGlmICgoY2gxICYgMHg4MCkgPT0gMCkgewotICAgICAgICAgICAgLy8gc2luZ2xlIGJ5dGUgY2hhcmFjdGVyCi0gICAgICAgICAgICBjaCA9IGNoMTsKLSAgICAgICAgfSBlbHNlIGlmICgoY2gxICYgMHhFMCkgPT0gMHhDMCkgewotICAgICAgICAgICAgLy8gdHdvIGJ5dGUgY2hhcmFjdGVyCi0gICAgICAgICAgICB1aW50MTZfdCBjaDIgPSAqc3JjKys7Ci0gICAgICAgICAgICBjaCA9ICgoY2gxICYgMHgxRikgPDwgNikgfCAoY2gyICYgMHgzRik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyB0aHJlZSBieXRlIGNoYXJhY3RlcgotICAgICAgICAgICAgdWludDE2X3QgY2gyID0gKnNyYysrOwotICAgICAgICAgICAgdWludDE2X3QgY2gzID0gKnNyYysrOwotICAgICAgICAgICAgY2ggPSAoKGNoMSAmIDB4MEYpIDw8IDEyKSB8ICgoY2gyICYgMHgzRikgPDwgNikgfCAoY2gzICYgMHgzRik7CisgICAgaWYgKGNvdW50ID09IDApIHsKKyAgICAgICAgcGFja2V0LT5wdXRVSW50OCgwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBwYWNrZXQtPnB1dFVJbnQ4KHN0ZDo6bWluKGNvdW50ICsgMSwgTVRQX1NUUklOR19NQVhfQ0hBUkFDVEVSX05VTUJFUikpOworCisgICAgaW50IGkgPSAwOworICAgIGZvciAoY2hhcjE2X3QgJmMgOiBzcmMxNikgeworICAgICAgICBpZiAoaSA9PSBNVFBfU1RSSU5HX01BWF9DSEFSQUNURVJfTlVNQkVSIC0gMSkgeworICAgICAgICAgICAgLy8gTGVhdmUgYSBzbG90IGZvciBudWxsIHRlcm1pbmF0aW9uLgorICAgICAgICAgICAgQUxPR0koIk10cCB0cnVuY2F0aW5nIGxvbmcgc3RyaW5nXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIHBhY2tldC0+cHV0VUludDE2KGNoKTsKKyAgICAgICAgcGFja2V0LT5wdXRVSW50MTYoYyk7CisgICAgICAgIGkrKzsKICAgICB9CiAgICAgLy8gb25seSB0ZXJtaW5hdGUgd2l0aCB6ZXJvIGlmIHN0cmluZyBpcyBub3QgZW1wdHkKLSAgICBpZiAoY291bnQgPiAwKQotICAgICAgICBwYWNrZXQtPnB1dFVJbnQxNigwKTsKKyAgICBwYWNrZXQtPnB1dFVJbnQxNigwKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBTdHJpbmdCdWZmZXIuaCBiL21lZGlhL210cC9NdHBTdHJpbmdCdWZmZXIuaAppbmRleCBiY2YyYTQ4Li40Y2VjNThhIDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwU3RyaW5nQnVmZmVyLmgKKysrIGIvbWVkaWEvbXRwL010cFN0cmluZ0J1ZmZlci5oCkBAIC0xNyw3ICsxNyw5IEBACiAjaWZuZGVmIF9NVFBfU1RSSU5HX0JVRkZFUl9ICiAjZGVmaW5lIF9NVFBfU1RSSU5HX0JVRkZFUl9ICiAKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nPgogCiAvLyBNYXggQ2hhcmFjdGVyIG51bWJlciBvZiBhIE1UUCBTdHJpbmcKICNkZWZpbmUgTVRQX1NUUklOR19NQVhfQ0hBUkFDVEVSX05VTUJFUiAgICAgICAgICAgICAyNTUKQEAgLTMwLDMxICszMiwzOSBAQAogY2xhc3MgTXRwU3RyaW5nQnVmZmVyIHsKIAogcHJpdmF0ZToKLSAgICAvLyBtQnVmZmVyIGNvbnRhaW5zIHN0cmluZyBpbiBVVEY4IGZvcm1hdAotICAgIC8vIG1heGltdW0gMyBieXRlcy9jaGFyYWN0ZXIsIHdpdGggMSBleHRyYSBmb3IgemVybyB0ZXJtaW5hdGlvbgotICAgIHVpbnQ4X3QgICAgICAgICBtQnVmZmVyW01UUF9TVFJJTkdfTUFYX0NIQVJBQ1RFUl9OVU1CRVIgKiAzICsgMV07Ci0gICAgaW50ICAgICAgICAgICAgIG1DaGFyQ291bnQ7Ci0gICAgaW50ICAgICAgICAgICAgIG1CeXRlQ291bnQ7CisgICAgc3RkOjpzdHJpbmcgICAgIG1TdHJpbmc7CiAKIHB1YmxpYzoKLSAgICAgICAgICAgICAgICAgICAgTXRwU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgICAgIE10cFN0cmluZ0J1ZmZlcigpIHt9OworICAgICAgICAgICAgICAgICAgICB+TXRwU3RyaW5nQnVmZmVyKCkge307CisKICAgICBleHBsaWNpdCAgICAgICAgTXRwU3RyaW5nQnVmZmVyKGNvbnN0IGNoYXIqIHNyYyk7CiAgICAgZXhwbGljaXQgICAgICAgIE10cFN0cmluZ0J1ZmZlcihjb25zdCB1aW50MTZfdCogc3JjKTsKICAgICAgICAgICAgICAgICAgICAgTXRwU3RyaW5nQnVmZmVyKGNvbnN0IE10cFN0cmluZ0J1ZmZlciYgc3JjKTsKLSAgICB2aXJ0dWFsICAgICAgICAgfk10cFN0cmluZ0J1ZmZlcigpOwogCiAgICAgdm9pZCAgICAgICAgICAgIHNldChjb25zdCBjaGFyKiBzcmMpOwogICAgIHZvaWQgICAgICAgICAgICBzZXQoY29uc3QgdWludDE2X3QqIHNyYyk7CiAKKyAgICBpbmxpbmUgdm9pZCAgICAgYXBwZW5kKGNvbnN0IGNoYXIqIG90aGVyKTsKKyAgICBpbmxpbmUgdm9pZCAgICAgYXBwZW5kKE10cFN0cmluZ0J1ZmZlciAmb3RoZXIpOworCiAgICAgYm9vbCAgICAgICAgICAgIHJlYWRGcm9tUGFja2V0KE10cERhdGFQYWNrZXQqIHBhY2tldCk7CiAgICAgdm9pZCAgICAgICAgICAgIHdyaXRlVG9QYWNrZXQoTXRwRGF0YVBhY2tldCogcGFja2V0KSBjb25zdDsKIAotICAgIGlubGluZSBpbnQgICAgICBnZXRDaGFyQ291bnQoKSBjb25zdCB7IHJldHVybiBtQ2hhckNvdW50OyB9Ci0gICAgaW5saW5lIGludCAgICAgIGdldEJ5dGVDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1CeXRlQ291bnQ7IH0KKyAgICBpbmxpbmUgYm9vbCAgICAgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIG1TdHJpbmcuZW1wdHkoKTsgfQorICAgIGlubGluZSBpbnQgICAgICBzaXplKCkgY29uc3QgeyByZXR1cm4gbVN0cmluZy5sZW5ndGgoKTsgfQogCi0JaW5saW5lIG9wZXJhdG9yIGNvbnN0IGNoYXIqKCkgY29uc3QgeyByZXR1cm4gKGNvbnN0IGNoYXIgKiltQnVmZmVyOyB9CisgICAgaW5saW5lIG9wZXJhdG9yIGNvbnN0IGNoYXIqKCkgY29uc3QgeyByZXR1cm4gbVN0cmluZy5jX3N0cigpOyB9CiB9OwogCitpbmxpbmUgdm9pZCBNdHBTdHJpbmdCdWZmZXI6OmFwcGVuZChjb25zdCBjaGFyKiBvdGhlcikgeworICAgIG1TdHJpbmcgKz0gb3RoZXI7Cit9CisKK2lubGluZSB2b2lkIE10cFN0cmluZ0J1ZmZlcjo6YXBwZW5kKE10cFN0cmluZ0J1ZmZlciAmb3RoZXIpIHsKKyAgICBtU3RyaW5nICs9IG90aGVyLm1TdHJpbmc7Cit9CisKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAvLyBfTVRQX1NUUklOR19CVUZGRVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFR5cGVzLmggYi9tZWRpYS9tdHAvTXRwVHlwZXMuaAppbmRleCBjNzQ5YzY2Li5lNmFjMjNjIDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwVHlwZXMuaAorKysgYi9tZWRpYS9tdHAvTXRwVHlwZXMuaApAQCAtMTgsOCArMTgsNyBAQAogI2RlZmluZSBfTVRQX1RZUEVTX0gKIAogI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgInV0aWxzL1N0cmluZzguaCIKLSNpbmNsdWRlICJ1dGlscy9WZWN0b3IuaCIKKyNpbmNsdWRlIDx2ZWN0b3I+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNTEsMTggKzUwLDE4IEBACiBjbGFzcyBNdHBEZXZpY2U7CiBjbGFzcyBNdHBQcm9wZXJ0eTsKIAotdHlwZWRlZiBWZWN0b3I8TXRwU3RvcmFnZSAqPiBNdHBTdG9yYWdlTGlzdDsKLXR5cGVkZWYgVmVjdG9yPE10cERldmljZSo+IE10cERldmljZUxpc3Q7Ci10eXBlZGVmIFZlY3RvcjxNdHBQcm9wZXJ0eSo+IE10cFByb3BlcnR5TGlzdDsKK3R5cGVkZWYgc3RkOjp2ZWN0b3I8TXRwU3RvcmFnZSAqPiBNdHBTdG9yYWdlTGlzdDsKK3R5cGVkZWYgc3RkOjp2ZWN0b3I8TXRwRGV2aWNlKj4gTXRwRGV2aWNlTGlzdDsKK3R5cGVkZWYgc3RkOjp2ZWN0b3I8TXRwUHJvcGVydHkqPiBNdHBQcm9wZXJ0eUxpc3Q7CiAKLXR5cGVkZWYgVmVjdG9yPHVpbnQ4X3Q+IFVJbnQ4TGlzdDsKLXR5cGVkZWYgVmVjdG9yPHVpbnQxNl90PiBVSW50MTZMaXN0OwotdHlwZWRlZiBWZWN0b3I8dWludDMyX3Q+IFVJbnQzMkxpc3Q7Ci10eXBlZGVmIFZlY3Rvcjx1aW50NjRfdD4gVUludDY0TGlzdDsKLXR5cGVkZWYgVmVjdG9yPGludDhfdD4gSW50OExpc3Q7Ci10eXBlZGVmIFZlY3RvcjxpbnQxNl90PiBJbnQxNkxpc3Q7Ci10eXBlZGVmIFZlY3RvcjxpbnQzMl90PiBJbnQzMkxpc3Q7Ci10eXBlZGVmIFZlY3RvcjxpbnQ2NF90PiBJbnQ2NExpc3Q7Cit0eXBlZGVmIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFVJbnQ4TGlzdDsKK3R5cGVkZWYgc3RkOjp2ZWN0b3I8dWludDE2X3Q+IFVJbnQxNkxpc3Q7Cit0eXBlZGVmIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBVSW50MzJMaXN0OwordHlwZWRlZiBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gVUludDY0TGlzdDsKK3R5cGVkZWYgc3RkOjp2ZWN0b3I8aW50OF90PiBJbnQ4TGlzdDsKK3R5cGVkZWYgc3RkOjp2ZWN0b3I8aW50MTZfdD4gSW50MTZMaXN0OwordHlwZWRlZiBzdGQ6OnZlY3RvcjxpbnQzMl90PiBJbnQzMkxpc3Q7Cit0eXBlZGVmIHN0ZDo6dmVjdG9yPGludDY0X3Q+IEludDY0TGlzdDsKIAogdHlwZWRlZiBVSW50MTZMaXN0IE10cE9iamVjdFByb3BlcnR5TGlzdDsKIHR5cGVkZWYgVUludDE2TGlzdCBNdHBEZXZpY2VQcm9wZXJ0eUxpc3Q7CkBAIC03MSw4ICs3MCw2IEBACiB0eXBlZGVmIFVJbnQxNkxpc3QgTXRwT2JqZWN0UHJvcGVydHlMaXN0OwogdHlwZWRlZiBVSW50MzJMaXN0IE10cFN0b3JhZ2VJRExpc3Q7CiAKLXR5cGVkZWYgU3RyaW5nOCAgICBNdHBTdHJpbmc7Ci0KIGVudW0gVXJiUGFja2V0RGl2aXNpb25Nb2RlIHsKICAgICAvLyBGaXJzdCBwYWNrZXQgb25seSBjb250YWlucyBhIGhlYWRlci4KICAgICBGSVJTVF9QQUNLRVRfT05MWV9IRUFERVIsCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwVXRpbHMuY3BwIGIvbWVkaWEvbXRwL010cFV0aWxzLmNwcAppbmRleCBlYmYzNjAxLi44NTY0NTc2IDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwVXRpbHMuY3BwCisrKyBiL21lZGlhL210cC9NdHBVdGlscy5jcHAKQEAgLTE2LDEzICsxNiwzMyBAQAogCiAjZGVmaW5lIExPR19UQUcgIk10cFV0aWxzIgogCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3lzL3NlbmRmaWxlLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgIk10cFV0aWxzLmgiCiAKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorY29uc3RleHByIHVuc2lnbmVkIGxvbmcgRklMRV9DT1BZX1NJWkUgPSAyNjIxNDQ7CisKK3N0YXRpYyB2b2lkIGFjY2Vzc19vayhjb25zdCBjaGFyICpwYXRoKSB7CisgICAgaWYgKGFjY2VzcyhwYXRoLCBGX09LKSA9PSAtMSkgeworICAgICAgICAvLyBJZ25vcmUuIEZhaWx1cmUgY291bGQgYmUgY29tbW9uIGluIGNhc2VzIG9mIGRlbGV0ZSB3aGVyZQorICAgICAgICAvLyB0aGUgbWV0YWRhdGEgd2FzIHVwZGF0ZWQgdGhyb3VnaCBvdGhlciBwYXRocy4KKyAgICB9Cit9CisKIC8qCiBEYXRlVGltZSBzdHJpbmdzIGZvbGxvdyBhIGNvbXBhdGlibGUgc3Vic2V0IG9mIHRoZSBkZWZpbml0aW9uIGZvdW5kIGluIElTTyA4NjAxLCBhbmQKIHRha2UgdGhlIGZvcm0gb2YgYSBVbmljb2RlIHN0cmluZyBmb3JtYXR0ZWQgYXM6ICJZWVlZTU1ERFRoaG1tc3MucyIuIEluIHRoaXMKQEAgLTc4LDQgKzk4LDE3MCBAQAogICAgICAgICB0bS50bV9tZGF5LCB0bS50bV9ob3VyLCB0bS50bV9taW4sIHRtLnRtX3NlYyk7CiB9CiAKK2ludCBtYWtlRm9sZGVyKGNvbnN0IGNoYXIgKnBhdGgpIHsKKyAgICBtb2RlX3QgbWFzayA9IHVtYXNrKDApOworICAgIGludCByZXQgPSBta2RpcigoY29uc3QgY2hhciAqKXBhdGgsIERJUl9QRVJNKTsKKyAgICB1bWFzayhtYXNrKTsKKyAgICBpZiAocmV0ICYmIHJldCAhPSAtRUVYSVNUKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIGZvbGRlciAiIDw8IHBhdGg7CisgICAgICAgIHJldCA9IC0xOworICAgIH0gZWxzZSB7CisgICAgICAgIGNob3duKChjb25zdCBjaGFyICopcGF0aCwgZ2V0dWlkKCksIEZJTEVfR1JPVVApOworICAgIH0KKyAgICBhY2Nlc3Nfb2socGF0aCk7CisgICAgcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBDb3BpZXMgdGFyZ2V0IHBhdGggYW5kIGFsbCBjaGlsZHJlbiB0byBkZXN0aW5hdGlvbiBwYXRoLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgdmFsdWUgaW5kaWNhdGluZyBudW1iZXIgb2YgZmFpbHVyZXMKKyAqLworaW50IGNvcHlSZWN1cnNpdmUoY29uc3QgY2hhciAqZnJvbVBhdGgsIGNvbnN0IGNoYXIgKnRvUGF0aCkgeworICAgIGludCByZXQgPSAwOworICAgIHN0cmluZyBmcm9tUGF0aFN0cihmcm9tUGF0aCk7CisgICAgc3RyaW5nIHRvUGF0aFN0cih0b1BhdGgpOworCisgICAgRElSKiBkaXIgPSBvcGVuZGlyKGZyb21QYXRoKTsKKyAgICBpZiAoIWRpcikgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAib3BlbmRpciAiIDw8IGZyb21QYXRoIDw8ICIgZmFpbGVkIjsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoZnJvbVBhdGhTdHJbZnJvbVBhdGhTdHIuc2l6ZSgpLTFdICE9ICcvJykKKyAgICAgICAgZnJvbVBhdGhTdHIgKz0gJy8nOworICAgIGlmICh0b1BhdGhTdHJbdG9QYXRoU3RyLnNpemUoKS0xXSAhPSAnLycpCisgICAgICAgIHRvUGF0aFN0ciArPSAnLyc7CisKKyAgICBzdHJ1Y3QgZGlyZW50KiBlbnRyeTsKKyAgICB3aGlsZSAoKGVudHJ5ID0gcmVhZGRpcihkaXIpKSkgeworICAgICAgICBjb25zdCBjaGFyKiBuYW1lID0gZW50cnktPmRfbmFtZTsKKworICAgICAgICAvLyBpZ25vcmUgIi4iIGFuZCAiLi4iCisgICAgICAgIGlmIChuYW1lWzBdID09ICcuJyAmJiAobmFtZVsxXSA9PSAwIHx8IChuYW1lWzFdID09ICcuJyAmJiBuYW1lWzJdID09IDApKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3RyaW5nIG9sZEZpbGUgPSBmcm9tUGF0aFN0ciArIG5hbWU7CisgICAgICAgIHN0cmluZyBuZXdGaWxlID0gdG9QYXRoU3RyICsgbmFtZTsKKworICAgICAgICBpZiAoZW50cnktPmRfdHlwZSA9PSBEVF9ESVIpIHsKKyAgICAgICAgICAgIHJldCArPSBtYWtlRm9sZGVyKG5ld0ZpbGUuY19zdHIoKSk7CisgICAgICAgICAgICByZXQgKz0gY29weVJlY3Vyc2l2ZShvbGRGaWxlLmNfc3RyKCksIG5ld0ZpbGUuY19zdHIoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXQgKz0gY29weUZpbGUob2xkRmlsZS5jX3N0cigpLCBuZXdGaWxlLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBjb3B5RmlsZShjb25zdCBjaGFyICpmcm9tUGF0aCwgY29uc3QgY2hhciAqdG9QYXRoKSB7CisgICAgYXV0byBzdGFydCA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOworCisgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIGZyb21GZChvcGVuKGZyb21QYXRoLCBPX1JET05MWSkpOworICAgIGlmIChmcm9tRmQgPT0gLTEpIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBvcGVuIGNvcHkgZnJvbSAiIDw8IGZyb21QYXRoOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCB0b0ZkKG9wZW4odG9QYXRoLCBPX0NSRUFUIHwgT19XUk9OTFksIEZJTEVfUEVSTSkpOworICAgIGlmICh0b0ZkID09IC0xKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gb3BlbiBjb3B5IHRvICIgPDwgdG9QYXRoOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG9mZl90IG9mZnNldCA9IDA7CisKKyAgICBzdHJ1Y3Qgc3RhdCBzc3RhdCA9IHt9OworICAgIGlmIChzdGF0KGZyb21QYXRoLCAmc3N0YXQpID09IC0xKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBvZmZfdCBsZW5ndGggPSBzc3RhdC5zdF9zaXplOworICAgIGludCByZXQgPSAwOworCisgICAgd2hpbGUgKG9mZnNldCA8IGxlbmd0aCkgeworICAgICAgICBzc2l6ZV90IHRyYW5zZmVyX2xlbmd0aCA9IHN0ZDo6bWluKGxlbmd0aCAtIG9mZnNldCwgKG9mZl90KSBGSUxFX0NPUFlfU0laRSk7CisgICAgICAgIHJldCA9IHNlbmRmaWxlKHRvRmQsIGZyb21GZCwgJm9mZnNldCwgdHJhbnNmZXJfbGVuZ3RoKTsKKyAgICAgICAgaWYgKHJldCAhPSB0cmFuc2Zlcl9sZW5ndGgpIHsKKyAgICAgICAgICAgIHJldCA9IC0xOworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkNvcHlpbmcgZmFpbGVkISI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBhdXRvIGVuZCA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOworICAgIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbjxkb3VibGU+IGRpZmYgPSBlbmQgLSBzdGFydDsKKyAgICBMT0coREVCVUcpIDw8ICJDb3BpZWQgYSBmaWxlIHdpdGggTVRQLiBUaW1lOiAiIDw8IGRpZmYuY291bnQoKSA8PCAiIHMsIFNpemU6ICIgPDwgbGVuZ3RoIDw8CisgICAgICAgICIsIFJhdGU6ICIgPDwgKChkb3VibGUpIGxlbmd0aCkgLyBkaWZmLmNvdW50KCkgPDwgIiBieXRlcy9zIjsKKyAgICBjaG93bih0b1BhdGgsIGdldHVpZCgpLCBGSUxFX0dST1VQKTsKKyAgICBhY2Nlc3Nfb2sodG9QYXRoKTsKKyAgICByZXR1cm4gcmV0ID09IC0xID8gLTEgOiAwOworfQorCit2b2lkIGRlbGV0ZVJlY3Vyc2l2ZShjb25zdCBjaGFyKiBwYXRoKSB7CisgICAgc3RyaW5nIHBhdGhTdHIocGF0aCk7CisgICAgaWYgKHBhdGhTdHJbcGF0aFN0ci5zaXplKCktMV0gIT0gJy8nKSB7CisgICAgICAgIHBhdGhTdHIgKz0gJy8nOworICAgIH0KKworICAgIERJUiogZGlyID0gb3BlbmRpcihwYXRoKTsKKyAgICBpZiAoIWRpcikgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAib3BlbmRpciAiIDw8IHBhdGggPDwgIiBmYWlsZWQiOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RydWN0IGRpcmVudCogZW50cnk7CisgICAgd2hpbGUgKChlbnRyeSA9IHJlYWRkaXIoZGlyKSkpIHsKKyAgICAgICAgY29uc3QgY2hhciogbmFtZSA9IGVudHJ5LT5kX25hbWU7CisKKyAgICAgICAgLy8gaWdub3JlICIuIiBhbmQgIi4uIgorICAgICAgICBpZiAobmFtZVswXSA9PSAnLicgJiYgKG5hbWVbMV0gPT0gMCB8fCAobmFtZVsxXSA9PSAnLicgJiYgbmFtZVsyXSA9PSAwKSkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHN0cmluZyBjaGlsZFBhdGggPSBwYXRoU3RyICsgbmFtZTsKKyAgICAgICAgaW50IHN1Y2Nlc3M7CisgICAgICAgIGlmIChlbnRyeS0+ZF90eXBlID09IERUX0RJUikgeworICAgICAgICAgICAgZGVsZXRlUmVjdXJzaXZlKGNoaWxkUGF0aC5jX3N0cigpKTsKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSBybWRpcihjaGlsZFBhdGguY19zdHIoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdWNjZXNzID0gdW5saW5rKGNoaWxkUGF0aC5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICBhY2Nlc3Nfb2soY2hpbGRQYXRoLmNfc3RyKCkpOworICAgICAgICBpZiAoc3VjY2VzcyA9PSAtMSkKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJEZWxldGluZyBwYXRoICIgPDwgY2hpbGRQYXRoIDw8ICIgZmFpbGVkIjsKKyAgICB9CisgICAgY2xvc2VkaXIoZGlyKTsKK30KKworYm9vbCBkZWxldGVQYXRoKGNvbnN0IGNoYXIqIHBhdGgpIHsKKyAgICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworICAgIGludCBzdWNjZXNzOworICAgIGlmIChzdGF0KHBhdGgsICZzdGF0YnVmKSA9PSAwKSB7CisgICAgICAgIGlmIChTX0lTRElSKHN0YXRidWYuc3RfbW9kZSkpIHsKKyAgICAgICAgICAgIC8vIHJtZGlyIHdpbGwgZmFpbCBpZiB0aGUgZGlyZWN0b3J5IGlzIG5vbiBlbXB0eSwgc28KKyAgICAgICAgICAgIC8vIHRoZXJlIGlzIG5vIG5lZWQgdG8ga2VlcCBlcnJvcnMgZnJvbSBkZWxldGVSZWN1cnNpdmUKKyAgICAgICAgICAgIGRlbGV0ZVJlY3Vyc2l2ZShwYXRoKTsKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSBybWRpcihwYXRoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSB1bmxpbmsocGF0aCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAiZGVsZXRlUGF0aCBzdGF0IGZhaWxlZCBmb3IgIiA8PCBwYXRoOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChzdWNjZXNzID09IC0xKQorICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRGVsZXRpbmcgcGF0aCAiIDw8IHBhdGggPDwgIiBmYWlsZWQiOworICAgIGFjY2Vzc19vayhwYXRoKTsKKyAgICByZXR1cm4gc3VjY2VzcyA9PSAwOworfQorCitpbnQgcmVuYW1lVG8oY29uc3QgY2hhciAqb2xkUGF0aCwgY29uc3QgY2hhciAqbmV3UGF0aCkgeworICAgIGludCByZXQgPSByZW5hbWUob2xkUGF0aCwgbmV3UGF0aCk7CisgICAgYWNjZXNzX29rKG9sZFBhdGgpOworICAgIGFjY2Vzc19vayhuZXdQYXRoKTsKKyAgICByZXR1cm4gcmV0OworfQorCisvLyBDYWxscyBhY2Nlc3MoMikgb24gdGhlIHBhdGggdG8gdXBkYXRlIHVuZGVybHlpbmcgZmlsZXN5c3RlbXMsCisvLyB0aGVuIGNsb3NlcyB0aGUgZmQuCit2b2lkIGNsb3NlT2JqRmQoaW50IGZkLCBjb25zdCBjaGFyICpwYXRoKSB7CisgICAgY2xvc2UoZmQpOworICAgIGFjY2Vzc19vayhwYXRoKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBVdGlscy5oIGIvbWVkaWEvbXRwL010cFV0aWxzLmgKaW5kZXggNjFmOTA1NS4uMjFmNWRmMCAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cFV0aWxzLmgKKysrIGIvbWVkaWEvbXRwL010cFV0aWxzLmgKQEAgLTE3LDEzICsxNywyNiBAQAogI2lmbmRlZiBfTVRQX1VUSUxTX0gKICNkZWZpbmUgX01UUF9VVElMU19ICiAKKyNpbmNsdWRlICJwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaCIKKwogI2luY2x1ZGUgPHN0ZGludC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK2NvbnN0ZXhwciBpbnQgRklMRV9HUk9VUCA9IEFJRF9NRURJQV9SVzsKK2NvbnN0ZXhwciBpbnQgRklMRV9QRVJNID0gMDY2NDsKK2NvbnN0ZXhwciBpbnQgRElSX1BFUk0gPSAwNzc1OworCiBib29sIHBhcnNlRGF0ZVRpbWUoY29uc3QgY2hhciogZGF0ZVRpbWUsIHRpbWVfdCYgb3V0U2Vjb25kcyk7CiB2b2lkIGZvcm1hdERhdGVUaW1lKHRpbWVfdCBzZWNvbmRzLCBjaGFyKiBidWZmZXIsIGludCBidWZmZXJMZW5ndGgpOwogCitpbnQgbWFrZUZvbGRlcihjb25zdCBjaGFyICpwYXRoKTsKK2ludCBjb3B5UmVjdXJzaXZlKGNvbnN0IGNoYXIgKmZyb21QYXRoLCBjb25zdCBjaGFyICp0b1BhdGgpOworaW50IGNvcHlGaWxlKGNvbnN0IGNoYXIgKmZyb21QYXRoLCBjb25zdCBjaGFyICp0b1BhdGgpOworYm9vbCBkZWxldGVQYXRoKGNvbnN0IGNoYXIqIHBhdGgpOworaW50IHJlbmFtZVRvKGNvbnN0IGNoYXIgKm9sZFBhdGgsIGNvbnN0IGNoYXIgKm5ld1BhdGgpOworCit2b2lkIGNsb3NlT2JqRmQoaW50IGZkLCBjb25zdCBjaGFyICpwYXRoKTsKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAvLyBfTVRQX1VUSUxTX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9PV05FUlMgYi9tZWRpYS9tdHAvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxOTMwN2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvT1dORVJTCkBAIC0wLDAgKzEgQEAKK3poYW5namVycnlAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL1Bvc2l4QXN5bmNJTy5jcHAgYi9tZWRpYS9tdHAvUG9zaXhBc3luY0lPLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjdjNTY4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL1Bvc2l4QXN5bmNJTy5jcHAKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8cXVldWU+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJQb3NpeEFzeW5jSU8uaCIKKworbmFtZXNwYWNlIHsKKwordm9pZCByZWFkX2Z1bmMoc3RydWN0IGFpb2NiICphaW9jYnApIHsKKyAgICBhaW9jYnAtPnJldCA9IFRFTVBfRkFJTFVSRV9SRVRSWShwcmVhZChhaW9jYnAtPmFpb19maWxkZXMsCisgICAgICAgICAgICAgICAgYWlvY2JwLT5haW9fYnVmLCBhaW9jYnAtPmFpb19uYnl0ZXMsIGFpb2NicC0+YWlvX29mZnNldCkpOworICAgIGlmIChhaW9jYnAtPnJldCA9PSAtMSkgYWlvY2JwLT5lcnJvciA9IGVycm5vOworfQorCit2b2lkIHdyaXRlX2Z1bmMoc3RydWN0IGFpb2NiICphaW9jYnApIHsKKyAgICBhaW9jYnAtPnJldCA9IFRFTVBfRkFJTFVSRV9SRVRSWShwd3JpdGUoYWlvY2JwLT5haW9fZmlsZGVzLAorICAgICAgICAgICAgICAgIGFpb2NicC0+YWlvX2J1ZiwgYWlvY2JwLT5haW9fbmJ5dGVzLCBhaW9jYnAtPmFpb19vZmZzZXQpKTsKKyAgICBpZiAoYWlvY2JwLT5yZXQgPT0gLTEpIGFpb2NicC0+ZXJyb3IgPSBlcnJubzsKK30KKworfSAvLyBlbmQgYW5vbnltb3VzIG5hbWVzcGFjZQorCithaW9jYjo6fmFpb2NiKCkgeworICAgIENIRUNLKCF0aHJlYWQuam9pbmFibGUoKSk7Cit9CisKK2ludCBhaW9fcmVhZChzdHJ1Y3QgYWlvY2IgKmFpb2NicCkgeworICAgIGFpb2NicC0+dGhyZWFkID0gc3RkOjp0aHJlYWQocmVhZF9mdW5jLCBhaW9jYnApOworICAgIHJldHVybiAwOworfQorCitpbnQgYWlvX3dyaXRlKHN0cnVjdCBhaW9jYiAqYWlvY2JwKSB7CisgICAgYWlvY2JwLT50aHJlYWQgPSBzdGQ6OnRocmVhZCh3cml0ZV9mdW5jLCBhaW9jYnApOworICAgIHJldHVybiAwOworfQorCitpbnQgYWlvX2Vycm9yKGNvbnN0IHN0cnVjdCBhaW9jYiAqYWlvY2JwKSB7CisgICAgcmV0dXJuIGFpb2NicC0+ZXJyb3I7Cit9CisKK3NzaXplX3QgYWlvX3JldHVybihzdHJ1Y3QgYWlvY2IgKmFpb2NicCkgeworICAgIHJldHVybiBhaW9jYnAtPnJldDsKK30KKworaW50IGFpb19zdXNwZW5kKHN0cnVjdCBhaW9jYiAqYWlvY2JwW10sIGludCBuLAorICAgICAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKikgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGFpb2NicFtpXS0+dGhyZWFkLmpvaW4oKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgYWlvX3ByZXBhcmUoc3RydWN0IGFpb2NiICphaW9jYnAsIHZvaWQqIGJ1Ziwgc2l6ZV90IGNvdW50LCBvZmZfdCBvZmZzZXQpIHsKKyAgICBhaW9jYnAtPmFpb19idWYgPSBidWY7CisgICAgYWlvY2JwLT5haW9fb2Zmc2V0ID0gb2Zmc2V0OworICAgIGFpb2NicC0+YWlvX25ieXRlcyA9IGNvdW50OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL1Bvc2l4QXN5bmNJTy5oIGIvbWVkaWEvbXRwL1Bvc2l4QXN5bmNJTy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MGFhZWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvUG9zaXhBc3luY0lPLmgKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1BPU0lYQVNZTkNJT19ICisjZGVmaW5lIF9QT1NJWEFTWU5DSU9fSAorCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHRocmVhZD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworLyoqCisgKiBQcm92aWRlcyBhIHN1YnNldCBvZiBQT1NJWCBhaW8gb3BlcmF0aW9ucy4KKyAqLworCitzdHJ1Y3QgYWlvY2IgeworICAgIGludCBhaW9fZmlsZGVzOworICAgIHZvaWQgKmFpb19idWY7CisKKyAgICBvZmZfdCBhaW9fb2Zmc2V0OworICAgIHNpemVfdCBhaW9fbmJ5dGVzOworCisgICAgLy8gVXNlZCBpbnRlcm5hbGx5CisgICAgc3RkOjp0aHJlYWQgdGhyZWFkOworICAgIHNzaXplX3QgcmV0OworICAgIGludCBlcnJvcjsKKworICAgIH5haW9jYigpOworfTsKKworLy8gU3VibWl0IGEgcmVxdWVzdCBmb3IgSU8gdG8gYmUgY29tcGxldGVkCitpbnQgYWlvX3JlYWQoc3RydWN0IGFpb2NiICopOworaW50IGFpb193cml0ZShzdHJ1Y3QgYWlvY2IgKik7CisKKy8vIFN1c3BlbmQgY3VycmVudCB0aHJlYWQgdW50aWwgZ2l2ZW4gSU8gaXMgY29tcGxldGUsIGF0IHdoaWNoIHBvaW50CisvLyBpdHMgcmV0dXJuIHZhbHVlIGFuZCBhbnkgZXJyb3JzIGNhbiBiZSBhY2Nlc3NlZAorLy8gQWxsIHN1Ym1pdHRlZCByZXF1ZXN0cyBtdXN0IGhhdmUgYSBjb3JyZXNwb25kaW5nIHN1c3BlbmQuCisvLyBhaW9jYi0+YWlvX2J1ZiBtdXN0IHJlZmVyIHRvIHZhbGlkIG1lbW9yeSB1bnRpbCBhZnRlciB0aGUgc3VzcGVuZCBjYWxsCitpbnQgYWlvX3N1c3BlbmQoc3RydWN0IGFpb2NiICpbXSwgaW50LCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKik7CitpbnQgYWlvX2Vycm9yKGNvbnN0IHN0cnVjdCBhaW9jYiAqKTsKK3NzaXplX3QgYWlvX3JldHVybihzdHJ1Y3QgYWlvY2IgKik7CisKKy8vIEhlbHBlciBtZXRob2QgZm9yIHNldHRpbmcgYWlvY2IgbWVtYmVycwordm9pZCBhaW9fcHJlcGFyZShzdHJ1Y3QgYWlvY2IgKiwgdm9pZCosIHNpemVfdCwgb2ZmX3QpOworCisjZW5kaWYgLy8gUE9TSVhBU1lOQ0lPX0gKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9tdHAvdGVzdHMvQW5kcm9pZC5icAppbmRleCBmZTcwMThiLi4wNzUwMjA4IDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9tdHAvdGVzdHMvQW5kcm9pZC5icApAQCAtMzEsOCArMzEsOSBAQAogfQogCiBjY190ZXN0IHsKLSAgICBuYW1lOiAiYXN5bmNfaW9fdGVzdCIsCi0gICAgc3JjczogWyJBc3luY0lPX3Rlc3QuY3BwIl0sCisgICAgbmFtZTogInBvc2l4X2FzeW5jX2lvX3Rlc3QiLAorICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAorICAgIHNyY3M6IFsiUG9zaXhBc3luY0lPX3Rlc3QuY3BwIl0sCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmJhc2UiLAogICAgICAgICAibGlibXRwIiwKZGlmZiAtLWdpdCBhL21lZGlhL210cC90ZXN0cy9Bc3luY0lPX3Rlc3QuY3BwIGIvbWVkaWEvbXRwL3Rlc3RzL0FzeW5jSU9fdGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZjQ1MzguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbXRwL3Rlc3RzL0FzeW5jSU9fdGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNkZWZpbmUgTE9HX1RBRyAiQXN5bmNJT190ZXN0LmNwcCIKLQotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS90ZXN0X3V0aWxzLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkFzeW5jSU8uaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jb25zdGV4cHIgaW50IFRFU1RfUEFDS0VUX1NJWkUgPSA1MTI7Ci1jb25zdGV4cHIgaW50IFBPT0xfQ09VTlQgPSAxMDsKLQotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGR1bW15RGF0YVN0ciA9Ci0gICAgIi8qXG4gKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0XG4gKlxuICogTGljZW5zZWQgdW4iCi0gICAgImRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXMiCi0gICAgImUgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGMiCi0gICAgIm9weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiCi0gICAgIi0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHMiCi0gICAgIm9mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiAiCi0gICAgIkJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG8iCi0gICAgInIgaW1wbGllZC5cbiAqIFNlIjsKLQotCi1jbGFzcyBBc3luY0lPVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotcHJvdGVjdGVkOgotICAgIFRlbXBvcmFyeUZpbGUgZHVtbXlfZmlsZTsKLQotICAgIEFzeW5jSU9UZXN0KCkge30KLSAgICB+QXN5bmNJT1Rlc3QoKSB7fQotfTsKLQotVEVTVF9GKEFzeW5jSU9UZXN0LCB0ZXN0UmVhZCkgewotICAgIGNoYXIgYnVmW1RFU1RfUEFDS0VUX1NJWkUgKyAxXTsKLSAgICBidWZbVEVTVF9QQUNLRVRfU0laRV0gPSAnXDAnOwotICAgIEVYUEVDVF9FUSh3cml0ZShkdW1teV9maWxlLmZkLCBkdW1teURhdGFTdHIuY19zdHIoKSwgVEVTVF9QQUNLRVRfU0laRSksIFRFU1RfUEFDS0VUX1NJWkUpOwotICAgIHN0cnVjdCBhaW9jYiBhaW87Ci0gICAgc3RydWN0IGFpb2NiICphaW9sW10gPSB7JmFpb307Ci0gICAgYWlvLmFpb19maWxkZXMgPSBkdW1teV9maWxlLmZkOwotICAgIGFpby5haW9fYnVmID0gYnVmOwotICAgIGFpby5haW9fb2Zmc2V0ID0gMDsKLSAgICBhaW8uYWlvX25ieXRlcyA9IFRFU1RfUEFDS0VUX1NJWkU7Ci0KLSAgICBFWFBFQ1RfRVEoYWlvX3JlYWQoJmFpbyksIDApOwotICAgIEVYUEVDVF9FUShhaW9fc3VzcGVuZChhaW9sLCAxLCBudWxscHRyKSwgMCk7Ci0gICAgRVhQRUNUX0VRKGFpb19yZXR1cm4oJmFpbyksIFRFU1RfUEFDS0VUX1NJWkUpOwotICAgIEVYUEVDVF9TVFJFUShidWYsIGR1bW15RGF0YVN0ci5jX3N0cigpKTsKLX0KLQotVEVTVF9GKEFzeW5jSU9UZXN0LCB0ZXN0V3JpdGUpIHsKLSAgICBjaGFyIGJ1ZltURVNUX1BBQ0tFVF9TSVpFICsgMV07Ci0gICAgYnVmW1RFU1RfUEFDS0VUX1NJWkVdID0gJ1wwJzsKLSAgICBzdHJ1Y3QgYWlvY2IgYWlvOwotICAgIHN0cnVjdCBhaW9jYiAqYWlvbFtdID0geyZhaW99OwotICAgIGFpby5haW9fZmlsZGVzID0gZHVtbXlfZmlsZS5mZDsKLSAgICBhaW8uYWlvX2J1ZiA9IGNvbnN0X2Nhc3Q8Y2hhcio+KGR1bW15RGF0YVN0ci5jX3N0cigpKTsKLSAgICBhaW8uYWlvX29mZnNldCA9IDA7Ci0gICAgYWlvLmFpb19uYnl0ZXMgPSBURVNUX1BBQ0tFVF9TSVpFOwotCi0gICAgRVhQRUNUX0VRKGFpb193cml0ZSgmYWlvKSwgMCk7Ci0gICAgRVhQRUNUX0VRKGFpb19zdXNwZW5kKGFpb2wsIDEsIG51bGxwdHIpLCAwKTsKLSAgICBFWFBFQ1RfRVEoYWlvX3JldHVybigmYWlvKSwgVEVTVF9QQUNLRVRfU0laRSk7Ci0gICAgRVhQRUNUX0VRKHJlYWQoZHVtbXlfZmlsZS5mZCwgYnVmLCBURVNUX1BBQ0tFVF9TSVpFKSwgVEVTVF9QQUNLRVRfU0laRSk7Ci0gICAgRVhQRUNUX1NUUkVRKGJ1ZiwgZHVtbXlEYXRhU3RyLmNfc3RyKCkpOwotfQotCi1URVNUX0YoQXN5bmNJT1Rlc3QsIHRlc3RFcnJvcikgewotICAgIGNoYXIgYnVmW1RFU1RfUEFDS0VUX1NJWkUgKyAxXTsKLSAgICBidWZbVEVTVF9QQUNLRVRfU0laRV0gPSAnXDAnOwotICAgIHN0cnVjdCBhaW9jYiBhaW87Ci0gICAgc3RydWN0IGFpb2NiICphaW9sW10gPSB7JmFpb307Ci0gICAgYWlvLmFpb19maWxkZXMgPSAtMTsKLSAgICBhaW8uYWlvX2J1ZiA9IGNvbnN0X2Nhc3Q8Y2hhcio+KGR1bW15RGF0YVN0ci5jX3N0cigpKTsKLSAgICBhaW8uYWlvX29mZnNldCA9IDA7Ci0gICAgYWlvLmFpb19uYnl0ZXMgPSBURVNUX1BBQ0tFVF9TSVpFOwotCi0gICAgRVhQRUNUX0VRKGFpb193cml0ZSgmYWlvKSwgMCk7Ci0gICAgRVhQRUNUX0VRKGFpb19zdXNwZW5kKGFpb2wsIDEsIG51bGxwdHIpLCAwKTsKLSAgICBFWFBFQ1RfRVEoYWlvX3JldHVybigmYWlvKSwgLTEpOwotICAgIEVYUEVDVF9FUShhaW9fZXJyb3IoJmFpbyksIEVCQURGKTsKLX0KLQotVEVTVF9GKEFzeW5jSU9UZXN0LCB0ZXN0U3BsaWNlUmVhZCkgewotICAgIGNoYXIgYnVmW1RFU1RfUEFDS0VUX1NJWkUgKyAxXTsKLSAgICBidWZbVEVTVF9QQUNLRVRfU0laRV0gPSAnXDAnOwotICAgIGludCBwaXBlRmRbMl07Ci0gICAgRVhQRUNUX0VRKHBpcGUocGlwZUZkKSwgMCk7Ci0gICAgRVhQRUNUX0VRKHdyaXRlKGR1bW15X2ZpbGUuZmQsIGR1bW15RGF0YVN0ci5jX3N0cigpLCBURVNUX1BBQ0tFVF9TSVpFKSwgVEVTVF9QQUNLRVRfU0laRSk7Ci0gICAgc3RydWN0IGFpb2NiIGFpbzsKLSAgICBzdHJ1Y3QgYWlvY2IgKmFpb2xbXSA9IHsmYWlvfTsKLSAgICBhaW8uYWlvX2ZpbGRlcyA9IGR1bW15X2ZpbGUuZmQ7Ci0gICAgYWlvLmFpb19zaW5rID0gcGlwZUZkWzFdOwotICAgIGFpby5haW9fb2Zmc2V0ID0gMDsKLSAgICBhaW8uYWlvX25ieXRlcyA9IFRFU1RfUEFDS0VUX1NJWkU7Ci0KLSAgICBFWFBFQ1RfRVEoYWlvX3NwbGljZV9yZWFkKCZhaW8pLCAwKTsKLSAgICBFWFBFQ1RfRVEoYWlvX3N1c3BlbmQoYWlvbCwgMSwgbnVsbHB0ciksIDApOwotICAgIEVYUEVDVF9FUShhaW9fcmV0dXJuKCZhaW8pLCBURVNUX1BBQ0tFVF9TSVpFKTsKLQotICAgIEVYUEVDVF9FUShyZWFkKHBpcGVGZFswXSwgYnVmLCBURVNUX1BBQ0tFVF9TSVpFKSwgVEVTVF9QQUNLRVRfU0laRSk7Ci0gICAgRVhQRUNUX1NUUkVRKGJ1ZiwgZHVtbXlEYXRhU3RyLmNfc3RyKCkpOwotfQotCi1URVNUX0YoQXN5bmNJT1Rlc3QsIHRlc3RTcGxpY2VXcml0ZSkgewotICAgIGNoYXIgYnVmW1RFU1RfUEFDS0VUX1NJWkUgKyAxXTsKLSAgICBidWZbVEVTVF9QQUNLRVRfU0laRV0gPSAnXDAnOwotICAgIGludCBwaXBlRmRbMl07Ci0gICAgRVhQRUNUX0VRKHBpcGUocGlwZUZkKSwgMCk7Ci0gICAgRVhQRUNUX0VRKHdyaXRlKHBpcGVGZFsxXSwgZHVtbXlEYXRhU3RyLmNfc3RyKCksIFRFU1RfUEFDS0VUX1NJWkUpLCBURVNUX1BBQ0tFVF9TSVpFKTsKLSAgICBzdHJ1Y3QgYWlvY2IgYWlvOwotICAgIHN0cnVjdCBhaW9jYiAqYWlvbFtdID0geyZhaW99OwotICAgIGFpby5haW9fZmlsZGVzID0gcGlwZUZkWzBdOwotICAgIGFpby5haW9fc2luayA9IGR1bW15X2ZpbGUuZmQ7Ci0gICAgYWlvLmFpb19vZmZzZXQgPSAwOwotICAgIGFpby5haW9fbmJ5dGVzID0gVEVTVF9QQUNLRVRfU0laRTsKLQotICAgIEVYUEVDVF9FUShhaW9fc3BsaWNlX3dyaXRlKCZhaW8pLCAwKTsKLSAgICBFWFBFQ1RfRVEoYWlvX3N1c3BlbmQoYWlvbCwgMSwgbnVsbHB0ciksIDApOwotICAgIEVYUEVDVF9FUShhaW9fcmV0dXJuKCZhaW8pLCBURVNUX1BBQ0tFVF9TSVpFKTsKLSAgICBFWFBFQ1RfRVEocmVhZChkdW1teV9maWxlLmZkLCBidWYsIFRFU1RfUEFDS0VUX1NJWkUpLCBURVNUX1BBQ0tFVF9TSVpFKTsKLSAgICBFWFBFQ1RfU1RSRVEoYnVmLCBkdW1teURhdGFTdHIuY19zdHIoKSk7Ci19Ci0KLVRFU1RfRihBc3luY0lPVGVzdCwgdGVzdFBvb2xXcml0ZSkgewotICAgIGFpb19wb29sX3dyaXRlX2luaXQoKTsKLSAgICBjaGFyIGJ1ZltURVNUX1BBQ0tFVF9TSVpFICogUE9PTF9DT1VOVCArIDFdOwotICAgIGJ1ZltURVNUX1BBQ0tFVF9TSVpFICogUE9PTF9DT1VOVF0gPSAnXDAnOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBQT09MX0NPVU5UOyBpKyspIHsKLSAgICAgICAgc3RydWN0IGFpb2NiICphaW9wID0gbmV3IHN0cnVjdCBhaW9jYjsKLSAgICAgICAgYWlvcC0+YWlvX2ZpbGRlcyA9IGR1bW15X2ZpbGUuZmQ7Ci0gICAgICAgIGFpb3AtPmFpb19wb29sX2J1ZiA9IHN0ZDo6dW5pcXVlX3B0cjxjaGFyW10+KG5ldyBjaGFyW1RFU1RfUEFDS0VUX1NJWkVdKTsKLSAgICAgICAgbWVtY3B5KGFpb3AtPmFpb19wb29sX2J1Zi5nZXQoKSwgZHVtbXlEYXRhU3RyLmNfc3RyKCksIFRFU1RfUEFDS0VUX1NJWkUpOwotICAgICAgICBhaW9wLT5haW9fb2Zmc2V0ID0gaSAqIFRFU1RfUEFDS0VUX1NJWkU7Ci0gICAgICAgIGFpb3AtPmFpb19uYnl0ZXMgPSBURVNUX1BBQ0tFVF9TSVpFOwotICAgICAgICBFWFBFQ1RfRVEoYWlvX3Bvb2xfd3JpdGUoYWlvcCksIDApOwotICAgIH0KLSAgICBhaW9fcG9vbF9lbmQoKTsKLSAgICBFWFBFQ1RfRVEocmVhZChkdW1teV9maWxlLmZkLCBidWYsIFRFU1RfUEFDS0VUX1NJWkUgKiBQT09MX0NPVU5UKSwgVEVTVF9QQUNLRVRfU0laRSAqIFBPT0xfQ09VTlQpOwotCi0gICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBQT09MX0NPVU5UOyBpKyspCi0gICAgICAgIHNzIDw8IGR1bW15RGF0YVN0cjsKLQotICAgIEVYUEVDVF9TVFJFUShidWYsIHNzLnN0cigpLmNfc3RyKCkpOwotfQotCi1URVNUX0YoQXN5bmNJT1Rlc3QsIHRlc3RTcGxpY2VQb29sV3JpdGUpIHsKLSAgICBhaW9fcG9vbF9zcGxpY2VfaW5pdCgpOwotICAgIGNoYXIgYnVmW1RFU1RfUEFDS0VUX1NJWkUgKiBQT09MX0NPVU5UICsgMV07Ci0gICAgYnVmW1RFU1RfUEFDS0VUX1NJWkUgKiBQT09MX0NPVU5UXSA9ICdcMCc7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IFBPT0xfQ09VTlQ7IGkrKykgewotICAgICAgICBpbnQgcGlwZUZkWzJdOwotICAgICAgICBFWFBFQ1RfRVEocGlwZShwaXBlRmQpLCAwKTsKLSAgICAgICAgRVhQRUNUX0VRKHdyaXRlKHBpcGVGZFsxXSwgZHVtbXlEYXRhU3RyLmNfc3RyKCksIFRFU1RfUEFDS0VUX1NJWkUpLCBURVNUX1BBQ0tFVF9TSVpFKTsKLSAgICAgICAgc3RydWN0IGFpb2NiICphaW9wID0gbmV3IHN0cnVjdCBhaW9jYjsKLSAgICAgICAgYWlvcC0+YWlvX2ZpbGRlcyA9IHBpcGVGZFswXTsKLSAgICAgICAgYWlvcC0+YWlvX3NpbmsgPSBkdW1teV9maWxlLmZkOwotICAgICAgICBhaW9wLT5haW9fb2Zmc2V0ID0gaSAqIFRFU1RfUEFDS0VUX1NJWkU7Ci0gICAgICAgIGFpb3AtPmFpb19uYnl0ZXMgPSBURVNUX1BBQ0tFVF9TSVpFOwotICAgICAgICBFWFBFQ1RfRVEoYWlvX3Bvb2xfd3JpdGUoYWlvcCksIDApOwotICAgIH0KLSAgICBhaW9fcG9vbF9lbmQoKTsKLSAgICBFWFBFQ1RfRVEocmVhZChkdW1teV9maWxlLmZkLCBidWYsIFRFU1RfUEFDS0VUX1NJWkUgKiBQT09MX0NPVU5UKSwgVEVTVF9QQUNLRVRfU0laRSAqIFBPT0xfQ09VTlQpOwotCi0gICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBQT09MX0NPVU5UOyBpKyspCi0gICAgICAgIHNzIDw8IGR1bW15RGF0YVN0cjsKLQotICAgIEVYUEVDVF9TVFJFUShidWYsIHNzLnN0cigpLmNfc3RyKCkpOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvdGVzdHMvTXRwRmZzSGFuZGxlX3Rlc3QuY3BwIGIvbWVkaWEvbXRwL3Rlc3RzL010cEZmc0hhbmRsZV90ZXN0LmNwcAppbmRleCA1NTRmODY3Li5jOWM5ZTYyIDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvdGVzdHMvTXRwRmZzSGFuZGxlX3Rlc3QuY3BwCisrKyBiL21lZGlhL210cC90ZXN0cy9NdHBGZnNIYW5kbGVfdGVzdC5jcHAKQEAgLTIzLDE1ICsyMywxNSBAQAogI2luY2x1ZGUgPHJhbmRvbT4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8bG9nL2xvZy5oPgogCisjaW5jbHVkZSAiTXRwRGVzY3JpcHRvcnMuaCIKICNpbmNsdWRlICJNdHBGZnNIYW5kbGUuaCIKKyNpbmNsdWRlICJNdHBGZnNDb21wYXRIYW5kbGUuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jb25zdGV4cHIgaW50IE1BWF9GSUxFX0NIVU5LX1NJWkUgPSAzICogMTAyNCAqIDEwMjQ7Ci0KLWNvbnN0ZXhwciBpbnQgVEVTVF9QQUNLRVRfU0laRSA9IDUxMjsKK2NvbnN0ZXhwciBpbnQgVEVTVF9QQUNLRVRfU0laRSA9IDUwMDsKIGNvbnN0ZXhwciBpbnQgU01BTExfTVVMVCA9IDMwOwogY29uc3RleHByIGludCBNRURfTVVMVCA9IDUxMDsKIApAQCAtNDMsMTcgKzQzLDE5IEBACiAgICAgIi0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHMiCiAgICAgIm9mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiAiCiAgICAgIkJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG8iCi0gICAgInIgaW1wbGllZC5cbiAqIFNlIjsKKyAgICAiciBpbSI7CiAKIC8qKgogICogRnVuY3Rpb25hbCB0ZXN0cyBmb3IgdGhlIE10cEZmc0hhbmRsZSBjbGFzcy4gRW5zdXJlcyBoZWFkZXIgYW5kIGRhdGEgaW50ZWdyaXR5CiAgKiBieSBtb2NraW5nIGZmcyBlbmRwb2ludHMgYXMgcGlwZXMgdG8gY2FwdHVyZSBpbnB1dCAvIG91dHB1dC4KICAqLwordGVtcGxhdGUgPGNsYXNzIFQ+CiBjbGFzcyBNdHBGZnNIYW5kbGVUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CiBwcm90ZWN0ZWQ6Ci0gICAgc3RkOjp1bmlxdWVfcHRyPElNdHBIYW5kbGU+IGhhbmRsZTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TXRwRmZzSGFuZGxlPiBoYW5kbGU7CiAKICAgICAvLyBQaXBlcyBmb3IgcmVhZGluZyBlbmRwb2ludCBkYXRhCisgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIGNvbnRyb2w7CiAgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIGJ1bGtfaW47CiAgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIGJ1bGtfb3V0OwogICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBpbnRyOwpAQCAtNjIsODggKzY0LDE5NCBAQAogCiAgICAgTXRwRmZzSGFuZGxlVGVzdCgpIHsKICAgICAgICAgaW50IGZkWzJdOwotICAgICAgICBoYW5kbGUgPSBzdGQ6OnVuaXF1ZV9wdHI8SU10cEhhbmRsZT4oZ2V0X2Zmc19oYW5kbGUoKSk7Ci0gICAgICAgIE10cEZmc0hhbmRsZSAqZmZzX2hhbmRsZSA9IHN0YXRpY19jYXN0PE10cEZmc0hhbmRsZSo+KGhhbmRsZS5nZXQoKSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKGZmc19oYW5kbGUgIT0gTlVMTCk7CisgICAgICAgIGhhbmRsZSA9IHN0ZDo6bWFrZV91bmlxdWU8VD4oLTEpOworCisgICAgICAgIEVYUEVDVF9FUShwaXBlKGZkKSwgMCk7CisgICAgICAgIGNvbnRyb2wucmVzZXQoZmRbMF0pOworICAgICAgICBoYW5kbGUtPm1Db250cm9sLnJlc2V0KGZkWzFdKTsKIAogICAgICAgICBFWFBFQ1RfRVEocGlwZShmZCksIDApOwogICAgICAgICBFWFBFQ1RfRVEoZmNudGwoZmRbMF0sIEZfU0VUUElQRV9TWiwgMTA0ODU3NiksIDEwNDg1NzYpOwogICAgICAgICBidWxrX2luLnJlc2V0KGZkWzBdKTsKLSAgICAgICAgZmZzX2hhbmRsZS0+bUJ1bGtJbi5yZXNldChmZFsxXSk7CisgICAgICAgIGhhbmRsZS0+bUJ1bGtJbi5yZXNldChmZFsxXSk7CiAKICAgICAgICAgRVhQRUNUX0VRKHBpcGUoZmQpLCAwKTsKICAgICAgICAgRVhQRUNUX0VRKGZjbnRsKGZkWzBdLCBGX1NFVFBJUEVfU1osIDEwNDg1NzYpLCAxMDQ4NTc2KTsKICAgICAgICAgYnVsa19vdXQucmVzZXQoZmRbMV0pOwotICAgICAgICBmZnNfaGFuZGxlLT5tQnVsa091dC5yZXNldChmZFswXSk7CisgICAgICAgIGhhbmRsZS0+bUJ1bGtPdXQucmVzZXQoZmRbMF0pOwogCiAgICAgICAgIEVYUEVDVF9FUShwaXBlKGZkKSwgMCk7CiAgICAgICAgIGludHIucmVzZXQoZmRbMF0pOwotICAgICAgICBmZnNfaGFuZGxlLT5tSW50ci5yZXNldChmZFsxXSk7CisgICAgICAgIGhhbmRsZS0+bUludHIucmVzZXQoZmRbMV0pOwogCi0gICAgICAgIGZmc19oYW5kbGUtPm1CdWZmZXIxLnJlc2l6ZShNQVhfRklMRV9DSFVOS19TSVpFKTsKLSAgICAgICAgZmZzX2hhbmRsZS0+bUJ1ZmZlcjIucmVzaXplKE1BWF9GSUxFX0NIVU5LX1NJWkUpOworICAgICAgICBFWFBFQ1RfRVEoaGFuZGxlLT5zdGFydChmYWxzZSksIDApOwogICAgIH0KIAotICAgIH5NdHBGZnNIYW5kbGVUZXN0KCkge30KKyAgICB+TXRwRmZzSGFuZGxlVGVzdCgpIHsKKyAgICAgICAgaGFuZGxlLT5jbG9zZSgpOworICAgIH0KIH07CiAKLVRFU1RfRihNdHBGZnNIYW5kbGVUZXN0LCB0ZXN0UmVhZCkgewotICAgIEVYUEVDVF9FUSh3cml0ZShidWxrX291dCwgZHVtbXlEYXRhU3RyLmNfc3RyKCksIFRFU1RfUEFDS0VUX1NJWkUpLCBURVNUX1BBQ0tFVF9TSVpFKTsKK3R5cGVkZWYgOjp0ZXN0aW5nOjpUeXBlczxNdHBGZnNIYW5kbGUsIE10cEZmc0NvbXBhdEhhbmRsZT4gbXRwSGFuZGxlczsKK1RZUEVEX1RFU1RfQ0FTRShNdHBGZnNIYW5kbGVUZXN0LCBtdHBIYW5kbGVzKTsKKworVFlQRURfVEVTVChNdHBGZnNIYW5kbGVUZXN0LCB0ZXN0TXRwQ29udHJvbCkgeworICAgIEVYUEVDVF9UUlVFKHRoaXMtPmhhbmRsZS0+d3JpdGVEZXNjcmlwdG9ycyhmYWxzZSkpOworICAgIHN0cnVjdCBkZXNjX3YyIGRlc2M7CisgICAgc3RydWN0IGZ1bmN0aW9uZnNfc3RyaW5ncyBzdHJpbmdzOworICAgIEVYUEVDVF9FUShyZWFkKHRoaXMtPmNvbnRyb2wsICZkZXNjLCBzaXplb2YoZGVzYykpLCAobG9uZylzaXplb2YoZGVzYykpOworICAgIEVYUEVDVF9FUShyZWFkKHRoaXMtPmNvbnRyb2wsICZzdHJpbmdzLCBzaXplb2Yoc3RyaW5ncykpLCAobG9uZylzaXplb2Yoc3RyaW5ncykpOworICAgIEVYUEVDVF9UUlVFKHN0ZDo6bWVtY21wKCZkZXNjLCAmbXRwX2Rlc2NfdjIsIHNpemVvZihkZXNjKSkgPT0gMCk7CisgICAgRVhQRUNUX1RSVUUoc3RkOjptZW1jbXAoJnN0cmluZ3MsICZtdHBfc3RyaW5ncywgc2l6ZW9mKHN0cmluZ3MpKSA9PSAwKTsKK30KKworVFlQRURfVEVTVChNdHBGZnNIYW5kbGVUZXN0LCB0ZXN0UHRwQ29udHJvbCkgeworICAgIEVYUEVDVF9UUlVFKHRoaXMtPmhhbmRsZS0+d3JpdGVEZXNjcmlwdG9ycyh0cnVlKSk7CisgICAgc3RydWN0IGRlc2NfdjIgZGVzYzsKKyAgICBzdHJ1Y3QgZnVuY3Rpb25mc19zdHJpbmdzIHN0cmluZ3M7CisgICAgRVhQRUNUX0VRKHJlYWQodGhpcy0+Y29udHJvbCwgJmRlc2MsIHNpemVvZihkZXNjKSksIChsb25nKXNpemVvZihkZXNjKSk7CisgICAgRVhQRUNUX0VRKHJlYWQodGhpcy0+Y29udHJvbCwgJnN0cmluZ3MsIHNpemVvZihzdHJpbmdzKSksIChsb25nKXNpemVvZihzdHJpbmdzKSk7CisgICAgRVhQRUNUX1RSVUUoc3RkOjptZW1jbXAoJmRlc2MsICZwdHBfZGVzY192Miwgc2l6ZW9mKGRlc2MpKSA9PSAwKTsKKyAgICBFWFBFQ1RfVFJVRShzdGQ6Om1lbWNtcCgmc3RyaW5ncywgJm10cF9zdHJpbmdzLCBzaXplb2Yoc3RyaW5ncykpID09IDApOworfQorCitUWVBFRF9URVNUKE10cEZmc0hhbmRsZVRlc3QsIHRlc3RSZWFkKSB7CisgICAgRVhQRUNUX0VRKHdyaXRlKHRoaXMtPmJ1bGtfb3V0LCBkdW1teURhdGFTdHIuY19zdHIoKSwgVEVTVF9QQUNLRVRfU0laRSksIFRFU1RfUEFDS0VUX1NJWkUpOwogICAgIGNoYXIgYnVmW1RFU1RfUEFDS0VUX1NJWkUgKyAxXTsKICAgICBidWZbVEVTVF9QQUNLRVRfU0laRV0gPSAnXDAnOwotICAgIEVYUEVDVF9FUShoYW5kbGUtPnJlYWQoYnVmLCBURVNUX1BBQ0tFVF9TSVpFKSwgVEVTVF9QQUNLRVRfU0laRSk7CisgICAgRVhQRUNUX0VRKHRoaXMtPmhhbmRsZS0+cmVhZChidWYsIFRFU1RfUEFDS0VUX1NJWkUpLCBURVNUX1BBQ0tFVF9TSVpFKTsKICAgICBFWFBFQ1RfU1RSRVEoYnVmLCBkdW1teURhdGFTdHIuY19zdHIoKSk7CiB9CiAKLVRFU1RfRihNdHBGZnNIYW5kbGVUZXN0LCB0ZXN0V3JpdGUpIHsKK1RZUEVEX1RFU1QoTXRwRmZzSGFuZGxlVGVzdCwgdGVzdFJlYWRMYXJnZSkgeworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgIGludCBzaXplID0gVEVTVF9QQUNLRVRfU0laRSAqIE1FRF9NVUxUOworICAgIGNoYXIgYnVmW3NpemUgKyAxXTsKKyAgICBidWZbc2l6ZV0gPSAnXDAnOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNRURfTVVMVDsgaSsrKQorICAgICAgICBzcyA8PCBkdW1teURhdGFTdHI7CisKKyAgICBFWFBFQ1RfRVEod3JpdGUodGhpcy0+YnVsa19vdXQsIHNzLnN0cigpLmNfc3RyKCksIHNpemUpLCBzaXplKTsKKyAgICBFWFBFQ1RfRVEodGhpcy0+aGFuZGxlLT5yZWFkKGJ1Ziwgc2l6ZSksIHNpemUpOworCisgICAgRVhQRUNUX1NUUkVRKGJ1Ziwgc3Muc3RyKCkuY19zdHIoKSk7Cit9CisKK1RZUEVEX1RFU1QoTXRwRmZzSGFuZGxlVGVzdCwgdGVzdFdyaXRlKSB7CiAgICAgY2hhciBidWZbVEVTVF9QQUNLRVRfU0laRSArIDFdOwogICAgIGJ1ZltURVNUX1BBQ0tFVF9TSVpFXSA9ICdcMCc7Ci0gICAgRVhQRUNUX0VRKGhhbmRsZS0+d3JpdGUoZHVtbXlEYXRhU3RyLmNfc3RyKCksIFRFU1RfUEFDS0VUX1NJWkUpLCBURVNUX1BBQ0tFVF9TSVpFKTsKLSAgICBFWFBFQ1RfRVEocmVhZChidWxrX2luLCBidWYsIFRFU1RfUEFDS0VUX1NJWkUpLCBURVNUX1BBQ0tFVF9TSVpFKTsKKyAgICBFWFBFQ1RfRVEodGhpcy0+aGFuZGxlLT53cml0ZShkdW1teURhdGFTdHIuY19zdHIoKSwgVEVTVF9QQUNLRVRfU0laRSksIFRFU1RfUEFDS0VUX1NJWkUpOworICAgIEVYUEVDVF9FUShyZWFkKHRoaXMtPmJ1bGtfaW4sIGJ1ZiwgVEVTVF9QQUNLRVRfU0laRSksIFRFU1RfUEFDS0VUX1NJWkUpOwogICAgIEVYUEVDVF9TVFJFUShidWYsIGR1bW15RGF0YVN0ci5jX3N0cigpKTsKIH0KIAotVEVTVF9GKE10cEZmc0hhbmRsZVRlc3QsIHRlc3RSZWNlaXZlRmlsZVNtYWxsKSB7CitUWVBFRF9URVNUKE10cEZmc0hhbmRsZVRlc3QsIHRlc3RXcml0ZUxhcmdlKSB7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgaW50IHNpemUgPSBURVNUX1BBQ0tFVF9TSVpFICogTUVEX01VTFQ7CisgICAgY2hhciBidWZbc2l6ZSArIDFdOworICAgIGJ1ZltzaXplXSA9ICdcMCc7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE1FRF9NVUxUOyBpKyspCisgICAgICAgIHNzIDw8IGR1bW15RGF0YVN0cjsKKworICAgIEVYUEVDVF9FUSh0aGlzLT5oYW5kbGUtPndyaXRlKHNzLnN0cigpLmNfc3RyKCksIHNpemUpLCBzaXplKTsKKyAgICBFWFBFQ1RfRVEocmVhZCh0aGlzLT5idWxrX2luLCBidWYsIHNpemUpLCBzaXplKTsKKworICAgIEVYUEVDVF9TVFJFUShidWYsIHNzLnN0cigpLmNfc3RyKCkpOworfQorCitUWVBFRF9URVNUKE10cEZmc0hhbmRsZVRlc3QsIHRlc3RSZWNlaXZlRmlsZUVtcHR5KSB7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgbXRwX2ZpbGVfcmFuZ2UgbWZyOworICAgIGludCBzaXplID0gMDsKKyAgICBjaGFyIGJ1ZltzaXplICsgMV07CisgICAgYnVmW3NpemVdID0gJ1wwJzsKKworICAgIG1mci5vZmZzZXQgPSAwOworICAgIG1mci5sZW5ndGggPSBzaXplOworICAgIG1mci5mZCA9IHRoaXMtPmR1bW15X2ZpbGUuZmQ7CisKKyAgICBFWFBFQ1RfRVEod3JpdGUodGhpcy0+YnVsa19vdXQsIHNzLnN0cigpLmNfc3RyKCksIHNpemUpLCBzaXplKTsKKyAgICBFWFBFQ1RfRVEodGhpcy0+aGFuZGxlLT5yZWNlaXZlRmlsZShtZnIsIGZhbHNlKSwgMCk7CisKKyAgICBFWFBFQ1RfRVEocmVhZCh0aGlzLT5kdW1teV9maWxlLmZkLCBidWYsIHNpemUpLCBzaXplKTsKK30KKworVFlQRURfVEVTVChNdHBGZnNIYW5kbGVUZXN0LCB0ZXN0UmVjZWl2ZUZpbGVTbWFsbCkgewogICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwogICAgIG10cF9maWxlX3JhbmdlIG1mcjsKICAgICBpbnQgc2l6ZSA9IFRFU1RfUEFDS0VUX1NJWkUgKiBTTUFMTF9NVUxUOwogICAgIGNoYXIgYnVmW3NpemUgKyAxXTsKICAgICBidWZbc2l6ZV0gPSAnXDAnOwogCisgICAgbWZyLm9mZnNldCA9IDA7CiAgICAgbWZyLmxlbmd0aCA9IHNpemU7Ci0gICAgbWZyLmZkID0gZHVtbXlfZmlsZS5mZDsKKyAgICBtZnIuZmQgPSB0aGlzLT5kdW1teV9maWxlLmZkOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU01BTExfTVVMVDsgaSsrKQogICAgICAgICBzcyA8PCBkdW1teURhdGFTdHI7CiAKLSAgICBFWFBFQ1RfRVEod3JpdGUoYnVsa19vdXQsIHNzLnN0cigpLmNfc3RyKCksIHNpemUpLCBzaXplKTsKLSAgICBFWFBFQ1RfRVEoaGFuZGxlLT5yZWNlaXZlRmlsZShtZnIsIGZhbHNlKSwgMCk7CisgICAgRVhQRUNUX0VRKHdyaXRlKHRoaXMtPmJ1bGtfb3V0LCBzcy5zdHIoKS5jX3N0cigpLCBzaXplKSwgc2l6ZSk7CisgICAgRVhQRUNUX0VRKHRoaXMtPmhhbmRsZS0+cmVjZWl2ZUZpbGUobWZyLCBmYWxzZSksIDApOwogCi0gICAgRVhQRUNUX0VRKHJlYWQoZHVtbXlfZmlsZS5mZCwgYnVmLCBzaXplKSwgc2l6ZSk7CisgICAgRVhQRUNUX0VRKHJlYWQodGhpcy0+ZHVtbXlfZmlsZS5mZCwgYnVmLCBzaXplKSwgc2l6ZSk7CiAKICAgICBFWFBFQ1RfU1RSRVEoYnVmLCBzcy5zdHIoKS5jX3N0cigpKTsKIH0KIAotVEVTVF9GKE10cEZmc0hhbmRsZVRlc3QsIHRlc3RSZWNlaXZlRmlsZU1lZCkgeworVFlQRURfVEVTVChNdHBGZnNIYW5kbGVUZXN0LCB0ZXN0UmVjZWl2ZUZpbGVNZWQpIHsKICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKICAgICBtdHBfZmlsZV9yYW5nZSBtZnI7CiAgICAgaW50IHNpemUgPSBURVNUX1BBQ0tFVF9TSVpFICogTUVEX01VTFQ7CiAgICAgY2hhciBidWZbc2l6ZSArIDFdOwogICAgIGJ1ZltzaXplXSA9ICdcMCc7CiAKKyAgICBtZnIub2Zmc2V0ID0gMDsKICAgICBtZnIubGVuZ3RoID0gc2l6ZTsKLSAgICBtZnIuZmQgPSBkdW1teV9maWxlLmZkOworICAgIG1mci5mZCA9IHRoaXMtPmR1bW15X2ZpbGUuZmQ7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNRURfTVVMVDsgaSsrKQogICAgICAgICBzcyA8PCBkdW1teURhdGFTdHI7CiAKLSAgICBFWFBFQ1RfRVEod3JpdGUoYnVsa19vdXQsIHNzLnN0cigpLmNfc3RyKCksIHNpemUpLCBzaXplKTsKLSAgICBFWFBFQ1RfRVEoaGFuZGxlLT5yZWNlaXZlRmlsZShtZnIsIGZhbHNlKSwgMCk7CisgICAgRVhQRUNUX0VRKHdyaXRlKHRoaXMtPmJ1bGtfb3V0LCBzcy5zdHIoKS5jX3N0cigpLCBzaXplKSwgc2l6ZSk7CisgICAgRVhQRUNUX0VRKHRoaXMtPmhhbmRsZS0+cmVjZWl2ZUZpbGUobWZyLCBmYWxzZSksIDApOwogCi0gICAgRVhQRUNUX0VRKHJlYWQoZHVtbXlfZmlsZS5mZCwgYnVmLCBzaXplKSwgc2l6ZSk7CisgICAgRVhQRUNUX0VRKHJlYWQodGhpcy0+ZHVtbXlfZmlsZS5mZCwgYnVmLCBzaXplKSwgc2l6ZSk7CiAKICAgICBFWFBFQ1RfU1RSRVEoYnVmLCBzcy5zdHIoKS5jX3N0cigpKTsKIH0KIAotVEVTVF9GKE10cEZmc0hhbmRsZVRlc3QsIHRlc3RTZW5kRmlsZVNtYWxsKSB7CitUWVBFRF9URVNUKE10cEZmc0hhbmRsZVRlc3QsIHRlc3RSZWNlaXZlRmlsZU1lZFBhcnRpYWwpIHsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICBtdHBfZmlsZV9yYW5nZSBtZnI7CisgICAgaW50IHNpemUgPSBURVNUX1BBQ0tFVF9TSVpFICogTUVEX01VTFQ7CisgICAgY2hhciBidWZbc2l6ZSArIDFdOworICAgIGJ1ZltzaXplXSA9ICdcMCc7CisKKyAgICBtZnIuZmQgPSB0aGlzLT5kdW1teV9maWxlLmZkOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUVEX01VTFQ7IGkrKykKKyAgICAgICAgc3MgPDwgZHVtbXlEYXRhU3RyOworCisgICAgRVhQRUNUX0VRKHdyaXRlKHRoaXMtPmJ1bGtfb3V0LCBzcy5zdHIoKS5jX3N0cigpLCBzaXplKSwgc2l6ZSk7CisKKyAgICBzdGQ6OnJhbmRvbV9kZXZpY2UgcmQ7CisgICAgc3RkOjptdDE5OTM3IGdlbihyZCgpKTsKKyAgICBzdGQ6OnVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjw+IGRpcygxLCBURVNUX1BBQ0tFVF9TSVpFKTsKKyAgICBpbnQgb2Zmc2V0ID0gMDsKKyAgICB3aGlsZSAob2Zmc2V0ICE9IHNpemUpIHsKKyAgICAgICAgbWZyLm9mZnNldCA9IG9mZnNldDsKKyAgICAgICAgaW50IGxlbmd0aCA9IHN0ZDo6bWluKHNpemUgLSBvZmZzZXQsIGRpcyhnZW4pKTsKKyAgICAgICAgbWZyLmxlbmd0aCA9IGxlbmd0aDsKKworICAgICAgICBFWFBFQ1RfRVEodGhpcy0+aGFuZGxlLT5yZWNlaXZlRmlsZShtZnIsIGZhbHNlKSwgMCk7CisgICAgICAgIG9mZnNldCArPSBsZW5ndGg7CisgICAgfQorCisgICAgRVhQRUNUX0VRKHJlYWQodGhpcy0+ZHVtbXlfZmlsZS5mZCwgYnVmLCBzaXplKSwgc2l6ZSk7CisKKyAgICBFWFBFQ1RfU1RSRVEoYnVmLCBzcy5zdHIoKS5jX3N0cigpKTsKK30KKworVFlQRURfVEVTVChNdHBGZnNIYW5kbGVUZXN0LCB0ZXN0U2VuZEZpbGVTbWFsbCkgewogICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwogICAgIG10cF9maWxlX3JhbmdlIG1mcjsKICAgICBtZnIuY29tbWFuZCA9IDQyOwpAQCAtMTU0LDE0ICsyNjIsMTQgQEAKICAgICBidWZbc2l6ZSArIHNpemVvZihtdHBfZGF0YV9oZWFkZXIpXSA9ICdcMCc7CiAKICAgICBtZnIubGVuZ3RoID0gc2l6ZTsKLSAgICBtZnIuZmQgPSBkdW1teV9maWxlLmZkOworICAgIG1mci5mZCA9IHRoaXMtPmR1bW15X2ZpbGUuZmQ7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTTUFMTF9NVUxUOyBpKyspCiAgICAgICAgIHNzIDw8IGR1bW15RGF0YVN0cjsKIAotICAgIEVYUEVDVF9FUSh3cml0ZShkdW1teV9maWxlLmZkLCBzcy5zdHIoKS5jX3N0cigpLCBzaXplKSwgc2l6ZSk7Ci0gICAgRVhQRUNUX0VRKGhhbmRsZS0+c2VuZEZpbGUobWZyKSwgMCk7CisgICAgRVhQRUNUX0VRKHdyaXRlKHRoaXMtPmR1bW15X2ZpbGUuZmQsIHNzLnN0cigpLmNfc3RyKCksIHNpemUpLCBzaXplKTsKKyAgICBFWFBFQ1RfRVEodGhpcy0+aGFuZGxlLT5zZW5kRmlsZShtZnIpLCAwKTsKIAotICAgIEVYUEVDVF9FUShyZWFkKGJ1bGtfaW4sIGJ1Ziwgc2l6ZSArIHNpemVvZihtdHBfZGF0YV9oZWFkZXIpKSwKKyAgICBFWFBFQ1RfRVEocmVhZCh0aGlzLT5idWxrX2luLCBidWYsIHNpemUgKyBzaXplb2YobXRwX2RhdGFfaGVhZGVyKSksCiAgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nPihzaXplICsgc2l6ZW9mKG10cF9kYXRhX2hlYWRlcikpKTsKIAogICAgIHN0cnVjdCBtdHBfZGF0YV9oZWFkZXIgKmhlYWRlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8c3RydWN0IG10cF9kYXRhX2hlYWRlcio+KGJ1Zik7CkBAIC0xNzIsNyArMjgwLDcgQEAKICAgICBFWFBFQ1RfRVEoaGVhZGVyLT50cmFuc2FjdGlvbl9pZCwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PigxMzM3KSk7CiB9CiAKLVRFU1RfRihNdHBGZnNIYW5kbGVUZXN0LCB0ZXN0U2VuZEZpbGVNZWQpIHsKK1RZUEVEX1RFU1QoTXRwRmZzSGFuZGxlVGVzdCwgdGVzdFNlbmRGaWxlTWVkKSB7CiAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CiAgICAgbXRwX2ZpbGVfcmFuZ2UgbWZyOwogICAgIG1mci5jb21tYW5kID0gNDI7CkBAIC0xODMsMTQgKzI5MSwxNCBAQAogICAgIGJ1ZltzaXplICsgc2l6ZW9mKG10cF9kYXRhX2hlYWRlcildID0gJ1wwJzsKIAogICAgIG1mci5sZW5ndGggPSBzaXplOwotICAgIG1mci5mZCA9IGR1bW15X2ZpbGUuZmQ7CisgICAgbWZyLmZkID0gdGhpcy0+ZHVtbXlfZmlsZS5mZDsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1FRF9NVUxUOyBpKyspCiAgICAgICAgIHNzIDw8IGR1bW15RGF0YVN0cjsKIAotICAgIEVYUEVDVF9FUSh3cml0ZShkdW1teV9maWxlLmZkLCBzcy5zdHIoKS5jX3N0cigpLCBzaXplKSwgc2l6ZSk7Ci0gICAgRVhQRUNUX0VRKGhhbmRsZS0+c2VuZEZpbGUobWZyKSwgMCk7CisgICAgRVhQRUNUX0VRKHdyaXRlKHRoaXMtPmR1bW15X2ZpbGUuZmQsIHNzLnN0cigpLmNfc3RyKCksIHNpemUpLCBzaXplKTsKKyAgICBFWFBFQ1RfRVEodGhpcy0+aGFuZGxlLT5zZW5kRmlsZShtZnIpLCAwKTsKIAotICAgIEVYUEVDVF9FUShyZWFkKGJ1bGtfaW4sIGJ1Ziwgc2l6ZSArIHNpemVvZihtdHBfZGF0YV9oZWFkZXIpKSwKKyAgICBFWFBFQ1RfRVEocmVhZCh0aGlzLT5idWxrX2luLCBidWYsIHNpemUgKyBzaXplb2YobXRwX2RhdGFfaGVhZGVyKSksCiAgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nPihzaXplICsgc2l6ZW9mKG10cF9kYXRhX2hlYWRlcikpKTsKIAogICAgIHN0cnVjdCBtdHBfZGF0YV9oZWFkZXIgKmhlYWRlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8c3RydWN0IG10cF9kYXRhX2hlYWRlcio+KGJ1Zik7CkBAIC0yMDEsMTAgKzMwOSwxMCBAQAogICAgIEVYUEVDVF9FUShoZWFkZXItPnRyYW5zYWN0aW9uX2lkLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KDEzMzcpKTsKIH0KIAotVEVTVF9GKE10cEZmc0hhbmRsZVRlc3QsIHRlc3RTZW5kRmlsZU1lZFBhcnRpYWwpIHsKK1RZUEVEX1RFU1QoTXRwRmZzSGFuZGxlVGVzdCwgdGVzdFNlbmRGaWxlTWVkUGFydGlhbCkgewogICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwogICAgIG10cF9maWxlX3JhbmdlIG1mcjsKLSAgICBtZnIuZmQgPSBkdW1teV9maWxlLmZkOworICAgIG1mci5mZCA9IHRoaXMtPmR1bW15X2ZpbGUuZmQ7CiAgICAgbWZyLmNvbW1hbmQgPSA0MjsKICAgICBtZnIudHJhbnNhY3Rpb25faWQgPSAxMzM3OwogICAgIGludCBzaXplID0gVEVTVF9QQUNLRVRfU0laRSAqIE1FRF9NVUxUOwpAQCAtMjE0LDcgKzMyMiw3IEBACiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNRURfTVVMVDsgaSsrKQogICAgICAgICBzcyA8PCBkdW1teURhdGFTdHI7CiAKLSAgICBFWFBFQ1RfRVEod3JpdGUoZHVtbXlfZmlsZS5mZCwgc3Muc3RyKCkuY19zdHIoKSwgc2l6ZSksIHNpemUpOworICAgIEVYUEVDVF9FUSh3cml0ZSh0aGlzLT5kdW1teV9maWxlLmZkLCBzcy5zdHIoKS5jX3N0cigpLCBzaXplKSwgc2l6ZSk7CiAKICAgICBzdGQ6OnJhbmRvbV9kZXZpY2UgcmQ7CiAgICAgc3RkOjptdDE5OTM3IGdlbihyZCgpKTsKQEAgLTIyNSw5ICszMzMsOSBAQAogICAgICAgICBpbnQgbGVuZ3RoID0gc3RkOjptaW4oc2l6ZSAtIG9mZnNldCwgZGlzKGdlbikpOwogICAgICAgICBtZnIubGVuZ3RoID0gbGVuZ3RoOwogICAgICAgICBjaGFyIHRlbXBfYnVmW2xlbmd0aCArIHNpemVvZihtdHBfZGF0YV9oZWFkZXIpXTsKLSAgICAgICAgRVhQRUNUX0VRKGhhbmRsZS0+c2VuZEZpbGUobWZyKSwgMCk7CisgICAgICAgIEVYUEVDVF9FUSh0aGlzLT5oYW5kbGUtPnNlbmRGaWxlKG1mciksIDApOwogCi0gICAgICAgIEVYUEVDVF9FUShyZWFkKGJ1bGtfaW4sIHRlbXBfYnVmLCBsZW5ndGggKyBzaXplb2YobXRwX2RhdGFfaGVhZGVyKSksCisgICAgICAgIEVYUEVDVF9FUShyZWFkKHRoaXMtPmJ1bGtfaW4sIHRlbXBfYnVmLCBsZW5ndGggKyBzaXplb2YobXRwX2RhdGFfaGVhZGVyKSksCiAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8bG9uZz4obGVuZ3RoICsgc2l6ZW9mKG10cF9kYXRhX2hlYWRlcikpKTsKIAogICAgICAgICBzdHJ1Y3QgbXRwX2RhdGFfaGVhZGVyICpoZWFkZXIgPSByZWludGVycHJldF9jYXN0PHN0cnVjdCBtdHBfZGF0YV9oZWFkZXIqPih0ZW1wX2J1Zik7CkBAIC0yNDEsNyArMzQ5LDcgQEAKICAgICBFWFBFQ1RfU1RSRVEoYnVmLCBzcy5zdHIoKS5jX3N0cigpKTsKIH0KIAotVEVTVF9GKE10cEZmc0hhbmRsZVRlc3QsIHRlc3RTZW5kRmlsZUVtcHR5KSB7CitUWVBFRF9URVNUKE10cEZmc0hhbmRsZVRlc3QsIHRlc3RTZW5kRmlsZUVtcHR5KSB7CiAgICAgbXRwX2ZpbGVfcmFuZ2UgbWZyOwogICAgIG1mci5jb21tYW5kID0gNDI7CiAgICAgbWZyLnRyYW5zYWN0aW9uX2lkID0gMTMzNzsKQEAgLTI1MSwxMSArMzU5LDExIEBACiAgICAgYnVmW3NpemUgKyBzaXplb2YobXRwX2RhdGFfaGVhZGVyKV0gPSAnXDAnOwogCiAgICAgbWZyLmxlbmd0aCA9IHNpemU7Ci0gICAgbWZyLmZkID0gZHVtbXlfZmlsZS5mZDsKKyAgICBtZnIuZmQgPSB0aGlzLT5kdW1teV9maWxlLmZkOwogCi0gICAgRVhQRUNUX0VRKGhhbmRsZS0+c2VuZEZpbGUobWZyKSwgMCk7CisgICAgRVhQRUNUX0VRKHRoaXMtPmhhbmRsZS0+c2VuZEZpbGUobWZyKSwgMCk7CiAKLSAgICBFWFBFQ1RfRVEocmVhZChidWxrX2luLCBidWYsIHNpemUgKyBzaXplb2YobXRwX2RhdGFfaGVhZGVyKSksCisgICAgRVhQRUNUX0VRKHJlYWQodGhpcy0+YnVsa19pbiwgYnVmLCBzaXplICsgc2l6ZW9mKG10cF9kYXRhX2hlYWRlcikpLAogICAgICAgICAgICAgc3RhdGljX2Nhc3Q8bG9uZz4oc2l6ZSArIHNpemVvZihtdHBfZGF0YV9oZWFkZXIpKSk7CiAKICAgICBzdHJ1Y3QgbXRwX2RhdGFfaGVhZGVyICpoZWFkZXIgPSByZWludGVycHJldF9jYXN0PHN0cnVjdCBtdHBfZGF0YV9oZWFkZXIqPihidWYpOwpAQCAtMjY1LDE1ICszNzMsMTUgQEAKICAgICBFWFBFQ1RfRVEoaGVhZGVyLT50cmFuc2FjdGlvbl9pZCwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PigxMzM3KSk7CiB9CiAKLVRFU1RfRihNdHBGZnNIYW5kbGVUZXN0LCB0ZXN0U2VuZEV2ZW50KSB7CitUWVBFRF9URVNUKE10cEZmc0hhbmRsZVRlc3QsIHRlc3RTZW5kRXZlbnQpIHsKICAgICBzdHJ1Y3QgbXRwX2V2ZW50IGV2ZW50OwogICAgIGV2ZW50Lmxlbmd0aCA9IFRFU1RfUEFDS0VUX1NJWkU7CiAgICAgZXZlbnQuZGF0YSA9IGNvbnN0X2Nhc3Q8Y2hhcio+KGR1bW15RGF0YVN0ci5jX3N0cigpKTsKICAgICBjaGFyIGJ1ZltURVNUX1BBQ0tFVF9TSVpFICsgMV07CiAgICAgYnVmW1RFU1RfUEFDS0VUX1NJWkVdID0gJ1wwJzsKIAotICAgIGhhbmRsZS0+c2VuZEV2ZW50KGV2ZW50KTsKLSAgICByZWFkKGludHIsIGJ1ZiwgVEVTVF9QQUNLRVRfU0laRSk7CisgICAgdGhpcy0+aGFuZGxlLT5zZW5kRXZlbnQoZXZlbnQpOworICAgIHJlYWQodGhpcy0+aW50ciwgYnVmLCBURVNUX1BBQ0tFVF9TSVpFKTsKICAgICBFWFBFQ1RfU1RSRVEoYnVmLCBkdW1teURhdGFTdHIuY19zdHIoKSk7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL210cC90ZXN0cy9Qb3NpeEFzeW5jSU9fdGVzdC5jcHAgYi9tZWRpYS9tdHAvdGVzdHMvUG9zaXhBc3luY0lPX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMzM3YWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvdGVzdHMvUG9zaXhBc3luY0lPX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBMT0dfVEFHICJQb3NpeEFzeW5jSU9fdGVzdC5jcHAiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdGVzdF91dGlscy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSAiUG9zaXhBc3luY0lPLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY29uc3RleHByIGludCBURVNUX1BBQ0tFVF9TSVpFID0gNTEyOworCitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgZHVtbXlEYXRhU3RyID0KKyAgICAiLypcbiAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3RcbiAqXG4gKiBMaWNlbnNlZCB1biIKKyAgICAiZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1cyIKKyAgICAiZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgYyIKKyAgICAib3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSIKKyAgICAiLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgcyIKKyAgICAib2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiICIKKyAgICAiQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3MgbyIKKyAgICAiciBpbXBsaWVkLlxuICogU2UiOworCisKK2NsYXNzIFBvc2l4QXN5bmNJT1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK3Byb3RlY3RlZDoKKyAgICBUZW1wb3JhcnlGaWxlIGR1bW15X2ZpbGU7CisKKyAgICBQb3NpeEFzeW5jSU9UZXN0KCkge30KKyAgICB+UG9zaXhBc3luY0lPVGVzdCgpIHt9Cit9OworCitURVNUX0YoUG9zaXhBc3luY0lPVGVzdCwgdGVzdFJlYWQpIHsKKyAgICBjaGFyIGJ1ZltURVNUX1BBQ0tFVF9TSVpFICsgMV07CisgICAgYnVmW1RFU1RfUEFDS0VUX1NJWkVdID0gJ1wwJzsKKyAgICBFWFBFQ1RfRVEod3JpdGUoZHVtbXlfZmlsZS5mZCwgZHVtbXlEYXRhU3RyLmNfc3RyKCksIFRFU1RfUEFDS0VUX1NJWkUpLCBURVNUX1BBQ0tFVF9TSVpFKTsKKyAgICBzdHJ1Y3QgYWlvY2IgYWlvOworICAgIHN0cnVjdCBhaW9jYiAqYWlvbFtdID0geyZhaW99OworICAgIGFpby5haW9fZmlsZGVzID0gZHVtbXlfZmlsZS5mZDsKKyAgICBhaW8uYWlvX2J1ZiA9IGJ1ZjsKKyAgICBhaW8uYWlvX29mZnNldCA9IDA7CisgICAgYWlvLmFpb19uYnl0ZXMgPSBURVNUX1BBQ0tFVF9TSVpFOworCisgICAgRVhQRUNUX0VRKGFpb19yZWFkKCZhaW8pLCAwKTsKKyAgICBFWFBFQ1RfRVEoYWlvX3N1c3BlbmQoYWlvbCwgMSwgbnVsbHB0ciksIDApOworICAgIEVYUEVDVF9FUShhaW9fcmV0dXJuKCZhaW8pLCBURVNUX1BBQ0tFVF9TSVpFKTsKKyAgICBFWFBFQ1RfU1RSRVEoYnVmLCBkdW1teURhdGFTdHIuY19zdHIoKSk7Cit9CisKK1RFU1RfRihQb3NpeEFzeW5jSU9UZXN0LCB0ZXN0V3JpdGUpIHsKKyAgICBjaGFyIGJ1ZltURVNUX1BBQ0tFVF9TSVpFICsgMV07CisgICAgYnVmW1RFU1RfUEFDS0VUX1NJWkVdID0gJ1wwJzsKKyAgICBzdHJ1Y3QgYWlvY2IgYWlvOworICAgIHN0cnVjdCBhaW9jYiAqYWlvbFtdID0geyZhaW99OworICAgIGFpby5haW9fZmlsZGVzID0gZHVtbXlfZmlsZS5mZDsKKyAgICBhaW8uYWlvX2J1ZiA9IGNvbnN0X2Nhc3Q8Y2hhcio+KGR1bW15RGF0YVN0ci5jX3N0cigpKTsKKyAgICBhaW8uYWlvX29mZnNldCA9IDA7CisgICAgYWlvLmFpb19uYnl0ZXMgPSBURVNUX1BBQ0tFVF9TSVpFOworCisgICAgRVhQRUNUX0VRKGFpb193cml0ZSgmYWlvKSwgMCk7CisgICAgRVhQRUNUX0VRKGFpb19zdXNwZW5kKGFpb2wsIDEsIG51bGxwdHIpLCAwKTsKKyAgICBFWFBFQ1RfRVEoYWlvX3JldHVybigmYWlvKSwgVEVTVF9QQUNLRVRfU0laRSk7CisgICAgRVhQRUNUX0VRKHJlYWQoZHVtbXlfZmlsZS5mZCwgYnVmLCBURVNUX1BBQ0tFVF9TSVpFKSwgVEVTVF9QQUNLRVRfU0laRSk7CisgICAgRVhQRUNUX1NUUkVRKGJ1ZiwgZHVtbXlEYXRhU3RyLmNfc3RyKCkpOworfQorCitURVNUX0YoUG9zaXhBc3luY0lPVGVzdCwgdGVzdEVycm9yKSB7CisgICAgY2hhciBidWZbVEVTVF9QQUNLRVRfU0laRSArIDFdOworICAgIGJ1ZltURVNUX1BBQ0tFVF9TSVpFXSA9ICdcMCc7CisgICAgc3RydWN0IGFpb2NiIGFpbzsKKyAgICBzdHJ1Y3QgYWlvY2IgKmFpb2xbXSA9IHsmYWlvfTsKKyAgICBhaW8uYWlvX2ZpbGRlcyA9IC0xOworICAgIGFpby5haW9fYnVmID0gY29uc3RfY2FzdDxjaGFyKj4oZHVtbXlEYXRhU3RyLmNfc3RyKCkpOworICAgIGFpby5haW9fb2Zmc2V0ID0gMDsKKyAgICBhaW8uYWlvX25ieXRlcyA9IFRFU1RfUEFDS0VUX1NJWkU7CisKKyAgICBFWFBFQ1RfRVEoYWlvX3dyaXRlKCZhaW8pLCAwKTsKKyAgICBFWFBFQ1RfRVEoYWlvX3N1c3BlbmQoYWlvbCwgMSwgbnVsbHB0ciksIDApOworICAgIEVYUEVDVF9FUShhaW9fcmV0dXJuKCZhaW8pLCAtMSk7CisgICAgRVhQRUNUX0VRKGFpb19lcnJvcigmYWlvKSwgRUJBREYpOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvQW5kcm9pZC5icCBiL21lZGlhL25kay9BbmRyb2lkLmJwCmluZGV4IDBkNDhkZTEuLjRhMzY2ODEgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9BbmRyb2lkLmJwCisrKyBiL21lZGlhL25kay9BbmRyb2lkLmJwCkBAIC0zNyw2ICszNyw3IEBACiAgICAgc3JjczogWwogICAgICAgICAiTmRrTWVkaWFDb2RlYy5jcHAiLAogICAgICAgICAiTmRrTWVkaWFDcnlwdG8uY3BwIiwKKyAgICAgICAgIk5ka01lZGlhRGF0YVNvdXJjZS5jcHAiLAogICAgICAgICAiTmRrTWVkaWFFeHRyYWN0b3IuY3BwIiwKICAgICAgICAgIk5ka01lZGlhRm9ybWF0LmNwcCIsCiAgICAgICAgICJOZGtNZWRpYU11eGVyLmNwcCIsCkBAIC02Nyw5ICs2OCwxMCBAQAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlibWVkaWFfb214IiwKICAgICAgICAgImxpYm1lZGlhX2puaSIsCiAgICAgICAgICJsaWJtZWRpYWRybSIsCi0gICAgICAgICJsaWJza2lhIiwKKyAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlibG9nIiwKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtJbWFnZS5jcHAgYi9tZWRpYS9uZGsvTmRrSW1hZ2UuY3BwCmluZGV4IGM0ZmY1MzcuLjIwYjE2NjcgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtJbWFnZS5jcHAKKysrIGIvbWVkaWEvbmRrL05ka0ltYWdlLmNwcApAQCAtMzcsOCArMzcsOCBAQAogICAgICAgICBtVGltZXN0YW1wKHRpbWVzdGFtcCksIG1XaWR0aCh3aWR0aCksIG1IZWlnaHQoaGVpZ2h0KSwgbU51bVBsYW5lcyhudW1QbGFuZXMpIHsKIH0KIAotLy8gQ2FuIG9ubHkgYmUgY2FsbGVkIGJ5IGZyZWUoKSB3aXRoIG1Mb2NrIGhvbGQKIEFJbWFnZTo6fkFJbWFnZSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmICghbUlzQ2xvc2VkKSB7CiAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoCiAgICAgICAgICAgICAgICAgIkVycm9yOiBBSW1hZ2UgJXAgaXMgZGVsZXRlZCBiZWZvcmUgcmV0dXJuaW5nIGJ1ZmZlciB0byBBSW1hZ2VSZWFkZXIhIiwgdGhpcyk7CkBAIC03OCw3ICs3OCw2IEBACiAgICAgICAgIEFMT0dFKCJDYW5ub3QgZnJlZSBBSW1hZ2UgYmVmb3JlIGNsb3NlISIpOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgZGVsZXRlIHRoaXM7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtJbWFnZVJlYWRlci5jcHAgYi9tZWRpYS9uZGsvTmRrSW1hZ2VSZWFkZXIuY3BwCmluZGV4IGZkNmVjYjUuLmJlNjM1ZmYgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtJbWFnZVJlYWRlci5jcHAKKysrIGIvbWVkaWEvbmRrL05ka0ltYWdlUmVhZGVyLmNwcApAQCAtNjU3LDcgKzY1Nyw3IEBACiAKIEVYUE9SVAogbWVkaWFfc3RhdHVzX3QgQUltYWdlUmVhZGVyX2dldFdpbmRvdyhBSW1hZ2VSZWFkZXIqIHJlYWRlciwgLypvdXQqL0FOYXRpdmVXaW5kb3cqKiB3aW5kb3cpIHsKLSAgICBBTE9HRSgiJXMiLCBfX0ZVTkNUSU9OX18pOworICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7CiAgICAgaWYgKHJlYWRlciA9PSBudWxscHRyIHx8IHdpbmRvdyA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCBhcmd1bWVudC4gcmVhZGVyICVwLCB3aW5kb3cgJXAiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVhZGVyLCB3aW5kb3cpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhQ29kZWMuY3BwIGIvbWVkaWEvbmRrL05ka01lZGlhQ29kZWMuY3BwCmluZGV4IDEyOGVkYmEuLjZiMjBiY2EgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtNZWRpYUNvZGVjLmNwcAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFDb2RlYy5jcHAKQEAgLTUyLDYgKzUyLDcgQEAKIAogZW51bSB7CiAgICAga1doYXRBY3Rpdml0eU5vdGlmeSwKKyAgICBrV2hhdEFzeW5jTm90aWZ5LAogICAgIGtXaGF0UmVxdWVzdEFjdGl2aXR5Tm90aWZpY2F0aW9ucywKICAgICBrV2hhdFN0b3BBY3Rpdml0eU5vdGlmaWNhdGlvbnMsCiB9OwpAQCAtODgsNiArODksMTEgQEAKICAgICBib29sIG1SZXF1ZXN0ZWRBY3Rpdml0eU5vdGlmaWNhdGlvbjsKICAgICBPbkNvZGVjRXZlbnQgbUNhbGxiYWNrOwogICAgIHZvaWQgKm1DYWxsYmFja1VzZXJEYXRhOworCisgICAgc3A8QU1lc3NhZ2U+IG1Bc3luY05vdGlmeTsKKyAgICBtdXRhYmxlIE11dGV4IG1Bc3luY0NhbGxiYWNrTG9jazsKKyAgICBBTWVkaWFDb2RlY09uQXN5bmNOb3RpZnlDYWxsYmFjayBtQXN5bmNDYWxsYmFjazsKKyAgICB2b2lkICptQXN5bmNDYWxsYmFja1VzZXJEYXRhOwogfTsKIAogQ29kZWNIYW5kbGVyOjpDb2RlY0hhbmRsZXIoQU1lZGlhQ29kZWMgKmNvZGVjKSB7CkBAIC0xMjgsNiArMTM0LDE0NyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0QXN5bmNOb3RpZnk6CisgICAgICAgIHsKKyAgICAgICAgICAgICBpbnQzMl90IGNiSUQ7CisgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiY2FsbGJhY2tJRCIsICZjYklEKSkgeworICAgICAgICAgICAgICAgICBBTE9HRSgia1doYXRBc3luY05vdGlmeTogY2FsbGJhY2tJRCBpcyBleHBlY3RlZC4iKTsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgQUxPR1YoImtXaGF0QXN5bmNOb3RpZnk6IGNiSUQgPSAlZCIsIGNiSUQpOworCisgICAgICAgICAgICAgc3dpdGNoIChjYklEKSB7CisgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFDb2RlYzo6Q0JfSU5QVVRfQVZBSUxBQkxFOgorICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGluZGV4OworICAgICAgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiaW5kZXgiLCAmaW5kZXgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNCX0lOUFVUX0FWQUlMQUJMRTogaW5kZXggaXMgZXhwZWN0ZWQuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ29kZWMtPm1Bc3luY0NhbGxiYWNrTG9jayk7CisgICAgICAgICAgICAgICAgICAgICBpZiAobUNvZGVjLT5tQXN5bmNDYWxsYmFja1VzZXJEYXRhICE9IE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtQ29kZWMtPm1Bc3luY0NhbGxiYWNrLm9uQXN5bmNJbnB1dEF2YWlsYWJsZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tQXN5bmNDYWxsYmFjay5vbkFzeW5jSW5wdXRBdmFpbGFibGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Bc3luY0NhbGxiYWNrVXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CisgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvZGVjOjpDQl9PVVRQVVRfQVZBSUxBQkxFOgorICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGluZGV4OworICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplOworICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7CisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZsYWdzOworCisgICAgICAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJpbmRleCIsICZpbmRleCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ0JfT1VUUFVUX0FWQUlMQUJMRTogaW5kZXggaXMgZXhwZWN0ZWQuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZFNpemUoIm9mZnNldCIsICZvZmZzZXQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNCX09VVFBVVF9BVkFJTEFCTEU6IG9mZnNldCBpcyBleHBlY3RlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kU2l6ZSgic2l6ZSIsICZzaXplKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDQl9PVVRQVVRfQVZBSUxBQkxFOiBzaXplIGlzIGV4cGVjdGVkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ0JfT1VUUFVUX0FWQUlMQUJMRTogdGltZVVzIGlzIGV4cGVjdGVkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiZmxhZ3MiLCAmZmxhZ3MpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNCX09VVFBVVF9BVkFJTEFCTEU6IGZsYWdzIGlzIGV4cGVjdGVkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICBBTWVkaWFDb2RlY0J1ZmZlckluZm8gYnVmZmVySW5mbyA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdClvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3Qpc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lVXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KWZsYWdzfTsKKworICAgICAgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Db2RlYy0+bUFzeW5jQ2FsbGJhY2tMb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgIGlmIChtQ29kZWMtPm1Bc3luY0NhbGxiYWNrVXNlckRhdGEgIT0gTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1Db2RlYy0+bUFzeW5jQ2FsbGJhY2sub25Bc3luY091dHB1dEF2YWlsYWJsZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tQXN5bmNDYWxsYmFjay5vbkFzeW5jT3V0cHV0QXZhaWxhYmxlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tQXN5bmNDYWxsYmFja1VzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVySW5mbyk7CisgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvZGVjOjpDQl9PVVRQVVRfRk9STUFUX0NIQU5HRUQ6CisgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZE1lc3NhZ2UoImZvcm1hdCIsICZmb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNCX09VVFBVVF9GT1JNQVRfQ0hBTkdFRDogZm9ybWF0IGlzIGV4cGVjdGVkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKmFNZWRpYUZvcm1hdCA9IEFNZWRpYUZvcm1hdF9mcm9tTXNnKCZmb3JtYXQpOworCisgICAgICAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNvZGVjLT5tQXN5bmNDYWxsYmFja0xvY2spOworICAgICAgICAgICAgICAgICAgICAgaWYgKG1Db2RlYy0+bUFzeW5jQ2FsbGJhY2tVc2VyRGF0YSAhPSBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbUNvZGVjLT5tQXN5bmNDYWxsYmFjay5vbkFzeW5jRm9ybWF0Q2hhbmdlZCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tQXN5bmNDYWxsYmFjay5vbkFzeW5jRm9ybWF0Q2hhbmdlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUFzeW5jQ2FsbGJhY2tVc2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFNZWRpYUZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvZGVjOjpDQl9FUlJPUjoKKyAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyOworICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBhY3Rpb25Db2RlOworICAgICAgICAgICAgICAgICAgICAgQVN0cmluZyBkZXRhaWw7CisgICAgICAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDQl9FUlJPUjogZXJyIGlzIGV4cGVjdGVkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiYWN0aW9uIiwgJmFjdGlvbkNvZGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNCX0VSUk9SOiBhY3Rpb24gaXMgZXhwZWN0ZWQuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICBtc2ctPmZpbmRTdHJpbmcoImRldGFpbCIsICZkZXRhaWwpOworICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkRlY29kZXIgcmVwb3J0ZWQgZXJyb3IoMHgleCksIGFjdGlvbkNvZGUoJWQpLCBkZXRhaWwoJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciwgYWN0aW9uQ29kZSwgZGV0YWlsLmNfc3RyKCkpOworCisgICAgICAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNvZGVjLT5tQXN5bmNDYWxsYmFja0xvY2spOworICAgICAgICAgICAgICAgICAgICAgaWYgKG1Db2RlYy0+bUFzeW5jQ2FsbGJhY2tVc2VyRGF0YSAhPSBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbUNvZGVjLT5tQXN5bmNDYWxsYmFjay5vbkFzeW5jRXJyb3IgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUFzeW5jQ2FsbGJhY2sub25Bc3luY0Vycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tQXN5bmNDYWxsYmFja1VzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlX2Vycm9yKGVyciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25Db2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJrV2hhdEFzeW5jTm90aWZ5OiBjYWxsYmFja0lEKCVkKSBpcyB1bmV4cGVjdGVkLiIsIGNiSUQpOworICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIGtXaGF0U3RvcEFjdGl2aXR5Tm90aWZpY2F0aW9uczoKICAgICAgICAgewogICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CkBAIC0xNjIsNyArMzA5LDcgQEAKICAgICBzaXplX3QgcmVzID0gbURhdGEtPm1Mb29wZXItPnN0YXJ0KAogICAgICAgICAgICAgZmFsc2UsICAgICAgLy8gcnVuT25DYWxsaW5nVGhyZWFkCiAgICAgICAgICAgICB0cnVlLCAgICAgICAvLyBjYW5DYWxsSmF2YSBYWFgKLSAgICAgICAgICAgIFBSSU9SSVRZX0ZPUkVHUk9VTkQpOworICAgICAgICAgICAgUFJJT1JJVFlfQVVESU8pOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzdGFydCB0aGUgbG9vcGVyIik7CiAgICAgICAgIEFNZWRpYUNvZGVjX2RlbGV0ZShtRGF0YSk7CkBAIC0xODMsNiArMzMwLDkgQEAKICAgICBtRGF0YS0+bVJlcXVlc3RlZEFjdGl2aXR5Tm90aWZpY2F0aW9uID0gZmFsc2U7CiAgICAgbURhdGEtPm1DYWxsYmFjayA9IE5VTEw7CiAKKyAgICBtRGF0YS0+bUFzeW5jQ2FsbGJhY2sgPSB7fTsKKyAgICBtRGF0YS0+bUFzeW5jQ2FsbGJhY2tVc2VyRGF0YSA9IE5VTEw7CisKICAgICByZXR1cm4gbURhdGE7CiB9CiAKQEAgLTIyMiw2ICszNzIsMzIgQEAKIH0KIAogRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19nZXROYW1lKAorICAgICAgICBBTWVkaWFDb2RlYyAqbURhdGEsCisgICAgICAgIGNoYXIqKiBvdXRfbmFtZSkgeworICAgIGlmIChvdXRfbmFtZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorCisgICAgQVN0cmluZyBjb21wTmFtZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtRGF0YS0+bUNvZGVjLT5nZXROYW1lKCZjb21wTmFtZSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKGVycik7CisgICAgfQorICAgICpvdXRfbmFtZSA9IHN0cmR1cChjb21wTmFtZS5jX3N0cigpKTsKKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCitFWFBPUlQKK3ZvaWQgQU1lZGlhQ29kZWNfcmVsZWFzZU5hbWUoCisgICAgICAgIEFNZWRpYUNvZGVjICogLyogbURhdGEgKi8sCisgICAgICAgIGNoYXIqIG5hbWUpIHsKKyAgICBpZiAobmFtZSAhPSBOVUxMKSB7CisgICAgICAgIGZyZWUobmFtZSk7CisgICAgfQorfQorCitFWFBPUlQKIG1lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX2NvbmZpZ3VyZSgKICAgICAgICAgQU1lZGlhQ29kZWMgKm1EYXRhLAogICAgICAgICBjb25zdCBBTWVkaWFGb3JtYXQqIGZvcm1hdCwKQEAgLTIzNiw4ICs0MTIsNDAgQEAKICAgICAgICAgc3VyZmFjZSA9IChTdXJmYWNlKikgd2luZG93OwogICAgIH0KIAotICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IobURhdGEtPm1Db2RlYy0+Y29uZmlndXJlKG5hdGl2ZUZvcm1hdCwgc3VyZmFjZSwKLSAgICAgICAgICAgIGNyeXB0byA/IGNyeXB0by0+bUNyeXB0byA6IE5VTEwsIGZsYWdzKSk7CisgICAgc3RhdHVzX3QgZXJyID0gbURhdGEtPm1Db2RlYy0+Y29uZmlndXJlKG5hdGl2ZUZvcm1hdCwgc3VyZmFjZSwKKyAgICAgICAgICAgIGNyeXB0byA/IGNyeXB0by0+bUNyeXB0byA6IE5VTEwsIGZsYWdzKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJjb25maWd1cmU6IGVyciglZCksIGZhaWxlZCB3aXRoIGZvcm1hdDogJXMiLAorICAgICAgICAgICAgICBlcnIsIG5hdGl2ZUZvcm1hdC0+ZGVidWdTdHJpbmcoMCkuY19zdHIoKSk7CisgICAgfQorICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IoZXJyKTsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19zZXRBc3luY05vdGlmeUNhbGxiYWNrKAorICAgICAgICBBTWVkaWFDb2RlYyAqbURhdGEsCisgICAgICAgIEFNZWRpYUNvZGVjT25Bc3luY05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAorICAgICAgICB2b2lkICp1c2VyZGF0YSkgeworICAgIGlmIChtRGF0YS0+bUFzeW5jTm90aWZ5ID09IE5VTEwgJiYgdXNlcmRhdGEgIT0gTlVMTCkgeworICAgICAgICBtRGF0YS0+bUFzeW5jTm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0QXN5bmNOb3RpZnksIG1EYXRhLT5tSGFuZGxlcik7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1EYXRhLT5tQ29kZWMtPnNldENhbGxiYWNrKG1EYXRhLT5tQXN5bmNOb3RpZnkpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgic2V0QXN5bmNOb3RpZnlDYWxsYmFjazogZXJyKCVkKSwgZmFpbGVkIHRvIHNldCBhc3luYyBjYWxsYmFjayIsIGVycik7CisgICAgICAgICAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKGVycik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobURhdGEtPm1Bc3luY0NhbGxiYWNrTG9jayk7CisgICAgbURhdGEtPm1Bc3luY0NhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgbURhdGEtPm1Bc3luY0NhbGxiYWNrVXNlckRhdGEgPSB1c2VyZGF0YTsKKworICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19yZWxlYXNlQ3J5cHRvKEFNZWRpYUNvZGVjICptRGF0YSkgeworICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IobURhdGEtPm1Db2RlYy0+cmVsZWFzZUNyeXB0bygpKTsKIH0KIAogRVhQT1JUCkBAIC0yODIsNiArNDkwLDE5IEBACiAKIEVYUE9SVAogdWludDhfdCogQU1lZGlhQ29kZWNfZ2V0SW5wdXRCdWZmZXIoQU1lZGlhQ29kZWMgKm1EYXRhLCBzaXplX3QgaWR4LCBzaXplX3QgKm91dF9zaXplKSB7CisgICAgaWYgKG1EYXRhLT5tQXN5bmNOb3RpZnkgIT0gTlVMTCkgeworICAgICAgICAvLyBBc3luY2hyb25vdXMgbW9kZQorICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBhYnVmOworICAgICAgICBpZiAobURhdGEtPm1Db2RlYy0+Z2V0SW5wdXRCdWZmZXIoaWR4LCAmYWJ1ZikgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBpZiAob3V0X3NpemUgIT0gTlVMTCkgeworICAgICAgICAgICAgKm91dF9zaXplID0gYWJ1Zi0+Y2FwYWNpdHkoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWJ1Zi0+ZGF0YSgpOworICAgIH0KKwogICAgIGFuZHJvaWQ6OlZlY3RvcjxhbmRyb2lkOjpzcDxhbmRyb2lkOjpNZWRpYUNvZGVjQnVmZmVyPiA+IGFidWZzOwogICAgIGlmIChtRGF0YS0+bUNvZGVjLT5nZXRJbnB1dEJ1ZmZlcnMoJmFidWZzKSA9PSAwKSB7CiAgICAgICAgIHNpemVfdCBuID0gYWJ1ZnMuc2l6ZSgpOwpAQCAtMzA0LDYgKzUyNSwxOSBAQAogCiBFWFBPUlQKIHVpbnQ4X3QqIEFNZWRpYUNvZGVjX2dldE91dHB1dEJ1ZmZlcihBTWVkaWFDb2RlYyAqbURhdGEsIHNpemVfdCBpZHgsIHNpemVfdCAqb3V0X3NpemUpIHsKKyAgICBpZiAobURhdGEtPm1Bc3luY05vdGlmeSAhPSBOVUxMKSB7CisgICAgICAgIC8vIEFzeW5jaHJvbm91cyBtb2RlCisgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IGFidWY7CisgICAgICAgIGlmIChtRGF0YS0+bUNvZGVjLT5nZXRPdXRwdXRCdWZmZXIoaWR4LCAmYWJ1ZikgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBpZiAob3V0X3NpemUgIT0gTlVMTCkgeworICAgICAgICAgICAgKm91dF9zaXplID0gYWJ1Zi0+Y2FwYWNpdHkoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWJ1Zi0+ZGF0YSgpOworICAgIH0KKwogICAgIGFuZHJvaWQ6OlZlY3RvcjxhbmRyb2lkOjpzcDxhbmRyb2lkOjpNZWRpYUNvZGVjQnVmZmVyPiA+IGFidWZzOwogICAgIGlmIChtRGF0YS0+bUNvZGVjLT5nZXRPdXRwdXRCdWZmZXJzKCZhYnVmcykgPT0gMCkgewogICAgICAgICBzaXplX3QgbiA9IGFidWZzLnNpemUoKTsKQEAgLTM2Nyw2ICs2MDEsMjAgQEAKIH0KIAogRVhQT1JUCitBTWVkaWFGb3JtYXQqIEFNZWRpYUNvZGVjX2dldElucHV0Rm9ybWF0KEFNZWRpYUNvZGVjICptRGF0YSkgeworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7CisgICAgbURhdGEtPm1Db2RlYy0+Z2V0SW5wdXRGb3JtYXQoJmZvcm1hdCk7CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9mcm9tTXNnKCZmb3JtYXQpOworfQorCitFWFBPUlQKK0FNZWRpYUZvcm1hdCogQU1lZGlhQ29kZWNfZ2V0QnVmZmVyRm9ybWF0KEFNZWRpYUNvZGVjICptRGF0YSwgc2l6ZV90IGluZGV4KSB7CisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdDsKKyAgICBtRGF0YS0+bUNvZGVjLT5nZXRPdXRwdXRGb3JtYXQoaW5kZXgsICZmb3JtYXQpOworICAgIHJldHVybiBBTWVkaWFGb3JtYXRfZnJvbU1zZygmZm9ybWF0KTsKK30KKworRVhQT1JUCiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19yZWxlYXNlT3V0cHV0QnVmZmVyKEFNZWRpYUNvZGVjICptRGF0YSwgc2l6ZV90IGlkeCwgYm9vbCByZW5kZXIpIHsKICAgICBpZiAocmVuZGVyKSB7CiAgICAgICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IobURhdGEtPm1Db2RlYy0+cmVuZGVyT3V0cHV0QnVmZmVyQW5kUmVsZWFzZShpZHgpKTsKQEAgLTUzNSw2ICs3ODMsMTYgQEAKICAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKGVycik7CiB9CiAKK0VYUE9SVAorYm9vbCBBTWVkaWFDb2RlY0FjdGlvbkNvZGVfaXNSZWNvdmVyYWJsZShpbnQzMl90IGFjdGlvbkNvZGUpIHsKKyAgICByZXR1cm4gKGFjdGlvbkNvZGUgPT0gQUNUSU9OX0NPREVfUkVDT1ZFUkFCTEUpOworfQorCitFWFBPUlQKK2Jvb2wgQU1lZGlhQ29kZWNBY3Rpb25Db2RlX2lzVHJhbnNpZW50KGludDMyX3QgYWN0aW9uQ29kZSkgeworICAgIHJldHVybiAoYWN0aW9uQ29kZSA9PSBBQ1RJT05fQ09ERV9UUkFOU0lFTlQpOworfQorCiAKIEVYUE9SVAogdm9pZCBBTWVkaWFDb2RlY0NyeXB0b0luZm9fc2V0UGF0dGVybihBTWVkaWFDb2RlY0NyeXB0b0luZm8gKmluZm8sCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFEYXRhU291cmNlLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMDBlNWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFEYXRhU291cmNlLmNwcApAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTmRrTWVkaWFEYXRhU291cmNlIgorCisjaW5jbHVkZSAiTmRrTWVkaWFEYXRhU291cmNlUHJpdi5oIgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxqbmkuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUVycm9yLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFEYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvSW50ZXJmYWNlVXRpbHMuaD4KKworI2luY2x1ZGUgIi4uLy4uL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUEJhc2UuaCIKKyNpbmNsdWRlICIuLi8uLi9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051Q2FjaGVkU291cmNlMi5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworc3RydWN0IEFNZWRpYURhdGFTb3VyY2UgeworICAgIHZvaWQgKnVzZXJkYXRhOworICAgIEFNZWRpYURhdGFTb3VyY2VSZWFkQXQgcmVhZEF0OworICAgIEFNZWRpYURhdGFTb3VyY2VHZXRTaXplIGdldFNpemU7CisgICAgQU1lZGlhRGF0YVNvdXJjZUNsb3NlIGNsb3NlOworfTsKKworTmRrRGF0YVNvdXJjZTo6TmRrRGF0YVNvdXJjZShBTWVkaWFEYXRhU291cmNlICpkYXRhU291cmNlKQorICAgIDogbURhdGFTb3VyY2UoQU1lZGlhRGF0YVNvdXJjZV9uZXcoKSkgeworICAgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRSZWFkQXQobURhdGFTb3VyY2UsIGRhdGFTb3VyY2UtPnJlYWRBdCk7CisgICAgICBBTWVkaWFEYXRhU291cmNlX3NldEdldFNpemUobURhdGFTb3VyY2UsIGRhdGFTb3VyY2UtPmdldFNpemUpOworICAgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRDbG9zZShtRGF0YVNvdXJjZSwgZGF0YVNvdXJjZS0+Y2xvc2UpOworICAgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRVc2VyZGF0YShtRGF0YVNvdXJjZSwgZGF0YVNvdXJjZS0+dXNlcmRhdGEpOworfQorCitOZGtEYXRhU291cmNlOjp+TmRrRGF0YVNvdXJjZSgpIHsKKyAgICBBTWVkaWFEYXRhU291cmNlX2RlbGV0ZShtRGF0YVNvdXJjZSk7Cit9CisKK3N0YXR1c190IE5ka0RhdGFTb3VyY2U6OmluaXRDaGVjaygpIGNvbnN0IHsKKyAgICByZXR1cm4gT0s7Cit9CisKK3NzaXplX3QgTmRrRGF0YVNvdXJjZTo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICBpZiAobURhdGFTb3VyY2UtPmdldFNpemUgPT0gTlVMTCB8fCBtRGF0YVNvdXJjZS0+dXNlcmRhdGEgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBtRGF0YVNvdXJjZS0+cmVhZEF0KG1EYXRhU291cmNlLT51c2VyZGF0YSwgb2Zmc2V0LCBkYXRhLCBzaXplKTsKK30KKworc3RhdHVzX3QgTmRrRGF0YVNvdXJjZTo6Z2V0U2l6ZShvZmY2NF90ICpzaXplKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIGlmIChtRGF0YVNvdXJjZS0+Z2V0U2l6ZSA9PSBOVUxMIHx8IG1EYXRhU291cmNlLT51c2VyZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBpZiAoc2l6ZSAhPSBOVUxMKSB7CisgICAgICAgICpzaXplID0gbURhdGFTb3VyY2UtPmdldFNpemUobURhdGFTb3VyY2UtPnVzZXJkYXRhKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitTdHJpbmc4IE5ka0RhdGFTb3VyY2U6OnRvU3RyaW5nKCkgeworICAgIHJldHVybiBTdHJpbmc4Ojpmb3JtYXQoIk5ka0RhdGFTb3VyY2UocGlkICVkLCB1aWQgJWQpIiwgZ2V0cGlkKCksIGdldHVpZCgpKTsKK30KKworU3RyaW5nOCBOZGtEYXRhU291cmNlOjpnZXRNSU1FVHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gU3RyaW5nOCgiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7Cit9CisKK3ZvaWQgTmRrRGF0YVNvdXJjZTo6Y2xvc2UoKSB7CisgICAgaWYgKG1EYXRhU291cmNlLT5jbG9zZSAhPSBOVUxMICYmIG1EYXRhU291cmNlLT51c2VyZGF0YSAhPSBOVUxMKSB7CisgICAgICAgIG1EYXRhU291cmNlLT5jbG9zZShtRGF0YVNvdXJjZS0+dXNlcmRhdGEpOworICAgIH0KK30KKworZXh0ZXJuICJDIiB7CisKK0VYUE9SVAorQU1lZGlhRGF0YVNvdXJjZSogQU1lZGlhRGF0YVNvdXJjZV9uZXcoKSB7CisgICAgQU1lZGlhRGF0YVNvdXJjZSAqbVNvdXJjZSA9IG5ldyBBTWVkaWFEYXRhU291cmNlKCk7CisgICAgbVNvdXJjZS0+dXNlcmRhdGEgPSBOVUxMOworICAgIG1Tb3VyY2UtPnJlYWRBdCA9IE5VTEw7CisgICAgbVNvdXJjZS0+Z2V0U2l6ZSA9IE5VTEw7CisgICAgbVNvdXJjZS0+Y2xvc2UgPSBOVUxMOworICAgIHJldHVybiBtU291cmNlOworfQorCitFWFBPUlQKK3ZvaWQgQU1lZGlhRGF0YVNvdXJjZV9kZWxldGUoQU1lZGlhRGF0YVNvdXJjZSAqbVNvdXJjZSkgeworICAgIEFMT0dWKCJkdG9yIik7CisgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbVNvdXJjZTsKKyAgICB9Cit9CisKK0VYUE9SVAordm9pZCBBTWVkaWFEYXRhU291cmNlX3NldFVzZXJkYXRhKEFNZWRpYURhdGFTb3VyY2UgKm1Tb3VyY2UsIHZvaWQgKnVzZXJkYXRhKSB7CisgICAgbVNvdXJjZS0+dXNlcmRhdGEgPSB1c2VyZGF0YTsKK30KKworRVhQT1JUCit2b2lkIEFNZWRpYURhdGFTb3VyY2Vfc2V0UmVhZEF0KEFNZWRpYURhdGFTb3VyY2UgKm1Tb3VyY2UsIEFNZWRpYURhdGFTb3VyY2VSZWFkQXQgcmVhZEF0KSB7CisgICAgbVNvdXJjZS0+cmVhZEF0ID0gcmVhZEF0OworfQorCitFWFBPUlQKK3ZvaWQgQU1lZGlhRGF0YVNvdXJjZV9zZXRHZXRTaXplKEFNZWRpYURhdGFTb3VyY2UgKm1Tb3VyY2UsIEFNZWRpYURhdGFTb3VyY2VHZXRTaXplIGdldFNpemUpIHsKKyAgICBtU291cmNlLT5nZXRTaXplID0gZ2V0U2l6ZTsKK30KKworRVhQT1JUCit2b2lkIEFNZWRpYURhdGFTb3VyY2Vfc2V0Q2xvc2UoQU1lZGlhRGF0YVNvdXJjZSAqbVNvdXJjZSwgQU1lZGlhRGF0YVNvdXJjZUNsb3NlIGNsb3NlKSB7CisgICAgbVNvdXJjZS0+Y2xvc2UgPSBjbG9zZTsKK30KKworfSAvLyBleHRlcm4gIkMiCisKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2VQcml2LmggYi9tZWRpYS9uZGsvTmRrTWVkaWFEYXRhU291cmNlUHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhOWM4NjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFEYXRhU291cmNlUHJpdi5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKy8qCisgKiBUaGlzIGZpbGUgZGVmaW5lcyBhbiBOREsgQVBJLgorICogRG8gbm90IHJlbW92ZSBtZXRob2RzLgorICogRG8gbm90IGNoYW5nZSBtZXRob2Qgc2lnbmF0dXJlcy4KKyAqIERvIG5vdCBjaGFuZ2UgdGhlIHZhbHVlIG9mIGNvbnN0YW50cy4KKyAqIERvIG5vdCBjaGFuZ2UgdGhlIHNpemUgb2YgYW55IG9mIHRoZSBjbGFzc2VzIGRlZmluZWQgaW4gaGVyZS4KKyAqIERvIG5vdCByZWZlcmVuY2UgdHlwZXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIE5ESy4KKyAqIERvIG5vdCAjaW5jbHVkZSBmaWxlcyB0aGF0IGFyZW4ndCBwYXJ0IG9mIHRoZSBOREsuCisgKi8KKworI2lmbmRlZiBfTkRLX01FRElBX0RBVEFTT1VSQ0VfUFJJVl9ICisjZGVmaW5lIF9OREtfTUVESUFfREFUQVNPVVJDRV9QUklWX0gKKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworc3RydWN0IE5ka0RhdGFTb3VyY2UgOiBwdWJsaWMgRGF0YVNvdXJjZSB7CisKKyAgICBOZGtEYXRhU291cmNlKEFNZWRpYURhdGFTb3VyY2UgKik7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OworICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqKTsKKyAgICB2aXJ0dWFsIFN0cmluZzggdG9TdHJpbmcoKTsKKyAgICB2aXJ0dWFsIFN0cmluZzggZ2V0TUlNRVR5cGUoKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfk5ka0RhdGFTb3VyY2UoKTsKKworcHJpdmF0ZToKKworICAgIE11dGV4IG1Mb2NrOworICAgIEFNZWRpYURhdGFTb3VyY2UgKm1EYXRhU291cmNlOworCit9OworCisjZW5kaWYgLy8gX05ES19NRURJQV9EQVRBU09VUkNFX1BSSVZfSAorCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFEcm0uY3BwIGIvbWVkaWEvbmRrL05ka01lZGlhRHJtLmNwcAppbmRleCBlZWNjODU4Li42ZDEwZjFjIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrTWVkaWFEcm0uY3BwCisrKyBiL21lZGlhL25kay9OZGtNZWRpYURybS5jcHAKQEAgLTIyNCw3ICsyMjQsNyBAQAogCiBzdGF0aWMgYm9vbCBmaW5kSWQoQU1lZGlhRHJtICptT2JqLCBjb25zdCBBTWVkaWFEcm1CeXRlQXJyYXkgJmlkLCBMaXN0PGlkdmVjX3Q+OjppdGVyYXRvciAmaXRlcikgewogICAgIGZvciAoaXRlciA9IG1PYmotPm1JZHMuYmVnaW4oKTsgaXRlciAhPSBtT2JqLT5tSWRzLmVuZCgpOyArK2l0ZXIpIHsKLSAgICAgICAgaWYgKGl0ZXItPmFycmF5KCkgPT0gaWQucHRyICYmIGl0ZXItPnNpemUoKSA9PSBpZC5sZW5ndGgpIHsKKyAgICAgICAgaWYgKGlkLmxlbmd0aCA9PSBpdGVyLT5zaXplKCkgJiYgbWVtY21wKGl0ZXItPmFycmF5KCksIGlkLnB0ciwgaXRlci0+c2l6ZSgpKSA9PSAwKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KQEAgLTI0MCw3ICsyNDAsNyBAQAogICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOwogICAgIH0KICAgICBWZWN0b3I8dWludDhfdD4gc2Vzc2lvbjsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBtT2JqLT5tRHJtLT5vcGVuU2Vzc2lvbihzZXNzaW9uKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtT2JqLT5tRHJtLT5vcGVuU2Vzc2lvbihEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsTWF4LCBzZXNzaW9uKTsKICAgICBpZiAoc3RhdHVzID09IE9LKSB7CiAgICAgICAgIG1PYmotPm1JZHMucHVzaF9mcm9udChzZXNzaW9uKTsKICAgICAgICAgTGlzdDxpZHZlY190Pjo6aXRlcmF0b3IgaXRlciA9IG1PYmotPm1JZHMuYmVnaW4oKTsKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFFeHRyYWN0b3IuY3BwCmluZGV4IGU2NzdkMDAuLmI1ZTYwYTQgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtNZWRpYUV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRXh0cmFjdG9yLmNwcApAQCAtMjAsNiArMjAsNyBAQAogCiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvci5oPgogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSAiTmRrTWVkaWFEYXRhU291cmNlUHJpdi5oIgogI2luY2x1ZGUgIk5ka01lZGlhRm9ybWF0UHJpdi5oIgogCiAKQEAgLTQyLDcgKzQzLDEyIEBACiBzdGF0aWMgbWVkaWFfc3RhdHVzX3QgdHJhbnNsYXRlX2Vycm9yKHN0YXR1c190IGVycikgewogICAgIGlmIChlcnIgPT0gT0spIHsKICAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKKyAgICB9IGVsc2UgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICB9IGVsc2UgaWYgKGVyciA9PSBFUlJPUl9JTykgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOwogICAgIH0KKwogICAgIEFMT0dFKCJzZiBlcnJvciBjb2RlOiAlZCIsIGVycik7CiAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogfQpAQCAtNTAsNyArNTYsNiBAQAogc3RydWN0IEFNZWRpYUV4dHJhY3RvciB7CiAgICAgc3A8TnVNZWRpYUV4dHJhY3Rvcj4gbUltcGw7CiAgICAgc3A8QUJ1ZmZlcj4gbVBzc2hCdWY7Ci0KIH07CiAKIGV4dGVybiAiQyIgewpAQCAtMTIxLDYgKzEyNiwxOCBAQAogfQogCiBFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlQ3VzdG9tKEFNZWRpYUV4dHJhY3RvciogbURhdGEsIEFNZWRpYURhdGFTb3VyY2UgKnNyYykgeworICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IobURhdGEtPm1JbXBsLT5zZXREYXRhU291cmNlKG5ldyBOZGtEYXRhU291cmNlKHNyYykpKTsKK30KKworRVhQT1JUCitBTWVkaWFGb3JtYXQqIEFNZWRpYUV4dHJhY3Rvcl9nZXRGaWxlRm9ybWF0KEFNZWRpYUV4dHJhY3RvciAqbURhdGEpIHsKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgIG1EYXRhLT5tSW1wbC0+Z2V0RmlsZUZvcm1hdCgmZm9ybWF0KTsKKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2Zyb21Nc2coJmZvcm1hdCk7Cit9CisKK0VYUE9SVAogc2l6ZV90IEFNZWRpYUV4dHJhY3Rvcl9nZXRUcmFja0NvdW50KEFNZWRpYUV4dHJhY3RvciAqbURhdGEpIHsKICAgICByZXR1cm4gbURhdGEtPm1JbXBsLT5jb3VudFRyYWNrcygpOwogfQpAQCAtMTgyLDYgKzE5OSwxNiBAQAogfQogCiBFWFBPUlQKK3NzaXplX3QgQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVNpemUoQU1lZGlhRXh0cmFjdG9yICptRGF0YSkgeworICAgIHNpemVfdCBzYW1wbGVTaXplOworICAgIHN0YXR1c190IGVyciA9IG1EYXRhLT5tSW1wbC0+Z2V0U2FtcGxlU2l6ZSgmc2FtcGxlU2l6ZSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBzYW1wbGVTaXplOworfQorCitFWFBPUlQKIHVpbnQzMl90IEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVGbGFncyhBTWVkaWFFeHRyYWN0b3IgKm1EYXRhKSB7CiAgICAgaW50IHNhbXBsZUZsYWdzID0gMDsKICAgICBzcDxNZXRhRGF0YT4gbWV0YTsKQEAgLTM3OSw2ICs0MDYsODAgQEAKICAgICAgICAgICAgIChzaXplX3QqKSBjcnlwdGVkZGF0YSk7CiB9CiAKK0VYUE9SVAoraW50NjRfdCBBTWVkaWFFeHRyYWN0b3JfZ2V0Q2FjaGVkRHVyYXRpb24oQU1lZGlhRXh0cmFjdG9yICpleCkgeworICAgIGJvb2wgZW9zOworICAgIGludDY0X3QgZHVyYXRpb25VczsKKyAgICBpZiAoZXgtPm1JbXBsLT5nZXRDYWNoZWREdXJhdGlvbigmZHVyYXRpb25VcywgJmVvcykpIHsKKyAgICAgICAgcmV0dXJuIGR1cmF0aW9uVXM7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlRm9ybWF0KEFNZWRpYUV4dHJhY3RvciAqZXgsIEFNZWRpYUZvcm1hdCAqZm10KSB7CisgICAgaWYgKGZtdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorCisgICAgc3A8TWV0YURhdGE+IHNhbXBsZU1ldGE7CisgICAgc3RhdHVzX3QgZXJyID0gZXgtPm1JbXBsLT5nZXRTYW1wbGVNZXRhKCZzYW1wbGVNZXRhKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IoZXJyKTsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gbWV0YTsKKyAgICBBTWVkaWFGb3JtYXRfZ2V0Rm9ybWF0KGZtdCwgJm1ldGEpOworICAgIG1ldGEtPmNsZWFyKCk7CisKKyAgICBpbnQzMl90IGxheWVySWQ7CisgICAgaWYgKHNhbXBsZU1ldGEtPmZpbmRJbnQzMihrS2V5VGVtcG9yYWxMYXllcklkLCAmbGF5ZXJJZCkpIHsKKyAgICAgICAgbWV0YS0+c2V0SW50MzIoQU1FRElBRk9STUFUX0tFWV9URU1QT1JBTF9MQVlFUl9JRCwgbGF5ZXJJZCk7CisgICAgfQorCisgICAgc2l6ZV90IHRyYWNrSW5kZXg7CisgICAgZXJyID0gZXgtPm1JbXBsLT5nZXRTYW1wbGVUcmFja0luZGV4KCZ0cmFja0luZGV4KTsKKyAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgIG1ldGEtPnNldEludDMyKEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSU5ERVgsIHRyYWNrSW5kZXgpOworICAgICAgICBzcDxBTWVzc2FnZT4gdHJhY2tGb3JtYXQ7CisgICAgICAgIEFTdHJpbmcgbWltZTsKKyAgICAgICAgZXJyID0gZXgtPm1JbXBsLT5nZXRUcmFja0Zvcm1hdCh0cmFja0luZGV4LCAmdHJhY2tGb3JtYXQpOworICAgICAgICBpZiAoZXJyID09IE9LCisgICAgICAgICAgICAgICAgJiYgdHJhY2tGb3JtYXQgIT0gTlVMTAorICAgICAgICAgICAgICAgICYmIHRyYWNrRm9ybWF0LT5maW5kU3RyaW5nKEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpKSB7CisgICAgICAgICAgICBtZXRhLT5zZXRTdHJpbmcoQU1FRElBRk9STUFUX0tFWV9NSU1FLCBtaW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGludDY0X3QgZHVyYXRpb25VczsKKyAgICBpZiAoc2FtcGxlTWV0YS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uVXMpKSB7CisgICAgICAgIG1ldGEtPnNldEludDY0KEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIGR1cmF0aW9uVXMpOworICAgIH0KKworICAgIHVpbnQzMl90IGRhdGFUeXBlOyAvLyB1bnVzZWQKKyAgICBjb25zdCB2b2lkICpzZWlEYXRhOworICAgIHNpemVfdCBzZWlMZW5ndGg7CisgICAgaWYgKHNhbXBsZU1ldGEtPmZpbmREYXRhKGtLZXlTRUksICZkYXRhVHlwZSwgJnNlaURhdGEsICZzZWlMZW5ndGgpKSB7CisgICAgICAgIHNwPEFCdWZmZXI+IHNlaSA9IEFCdWZmZXI6OkNyZWF0ZUFzQ29weShzZWlEYXRhLCBzZWlMZW5ndGgpOzsKKyAgICAgICAgbWV0YS0+c2V0QnVmZmVyKEFNRURJQUZPUk1BVF9LRVlfU0VJLCBzZWkpOworICAgIH0KKworICAgIGNvbnN0IHZvaWQgKm1wZWdVc2VyRGF0YVBvaW50ZXI7CisgICAgc2l6ZV90IG1wZWdVc2VyRGF0YUxlbmd0aDsKKyAgICBpZiAoc2FtcGxlTWV0YS0+ZmluZERhdGEoCisgICAgICAgICAgICBrS2V5TXBlZ1VzZXJEYXRhLCAmZGF0YVR5cGUsICZtcGVnVXNlckRhdGFQb2ludGVyLCAmbXBlZ1VzZXJEYXRhTGVuZ3RoKSkgeworICAgICAgICBzcDxBQnVmZmVyPiBtcGVnVXNlckRhdGEgPSBBQnVmZmVyOjpDcmVhdGVBc0NvcHkobXBlZ1VzZXJEYXRhUG9pbnRlciwgbXBlZ1VzZXJEYXRhTGVuZ3RoKTsKKyAgICAgICAgbWV0YS0+c2V0QnVmZmVyKEFNRURJQUZPUk1BVF9LRVlfTVBFR19VU0VSX0RBVEEsIG1wZWdVc2VyRGF0YSk7CisgICAgfQorCisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3JfZGlzY29ubmVjdChBTWVkaWFFeHRyYWN0b3IgKiBleCkgeworICAgIGV4LT5tSW1wbC0+ZGlzY29ubmVjdCgpOworICAgIHJldHVybiBBTUVESUFfT0s7Cit9CiAKIH0gLy8gZXh0ZXJuICJDIgogCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXQuY3BwIGIvbWVkaWEvbmRrL05ka01lZGlhRm9ybWF0LmNwcAppbmRleCBlZTI3NTIwLi5mMzJiODNlIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXQuY3BwCisrKyBiL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdC5jcHAKQEAgLTI1LDcgKzI1LDYgQEAKICNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmg+CiAjaW5jbHVkZSA8YW5kcm9pZF91dGlsX0JpbmRlci5oPgogCkBAIC0xMjUsNiArMTI0LDE0IEBACiAgICAgICAgICAgICAgICAgcmV0LmFwcGVuZEZvcm1hdCgiZG91YmxlKCVmKSIsIHZhbCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZVJlY3Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b207CisgICAgICAgICAgICAgICAgZi0+ZmluZFJlY3QobmFtZSwgJmxlZnQsICZ0b3AsICZyaWdodCwgJmJvdHRvbSk7CisgICAgICAgICAgICAgICAgcmV0LmFwcGVuZEZvcm1hdCgiUmVjdCglIiBQUklkMzIgIiwgJSIgUFJJZDMyICIsICUiIFBSSWQzMiAiLCAlIiBQUklkMzIgIikiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlU3RyaW5nOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIEFTdHJpbmcgdmFsOwpAQCAtMTY1LDExICsxNzIsMjIgQEAKIH0KIAogRVhQT1JUCitib29sIEFNZWRpYUZvcm1hdF9nZXREb3VibGUoQU1lZGlhRm9ybWF0KiBmb3JtYXQsIGNvbnN0IGNoYXIgKm5hbWUsIGRvdWJsZSAqb3V0KSB7CisgICAgcmV0dXJuIGZvcm1hdC0+bUZvcm1hdC0+ZmluZERvdWJsZShuYW1lLCBvdXQpOworfQorCitFWFBPUlQKIGJvb2wgQU1lZGlhRm9ybWF0X2dldFNpemUoQU1lZGlhRm9ybWF0KiBmb3JtYXQsIGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCAqb3V0KSB7CiAgICAgcmV0dXJuIGZvcm1hdC0+bUZvcm1hdC0+ZmluZFNpemUobmFtZSwgb3V0KTsKIH0KIAogRVhQT1JUCitib29sIEFNZWRpYUZvcm1hdF9nZXRSZWN0KEFNZWRpYUZvcm1hdCogZm9ybWF0LCBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICpsZWZ0LCBpbnQzMl90ICp0b3AsIGludDMyX3QgKnJpZ2h0LCBpbnQzMl90ICpib3R0b20pIHsKKyAgICByZXR1cm4gZm9ybWF0LT5tRm9ybWF0LT5maW5kUmVjdChuYW1lLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOworfQorCitFWFBPUlQKIGJvb2wgQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcihBTWVkaWFGb3JtYXQqIGZvcm1hdCwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCoqIGRhdGEsIHNpemVfdCAqb3V0c2l6ZSkgewogICAgIHNwPEFCdWZmZXI+IGJ1ZjsKICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kQnVmZmVyKG5hbWUsICZidWYpKSB7CkBAIC0yMTYsNiArMjM0LDIyIEBACiB9CiAKIEVYUE9SVAordm9pZCBBTWVkaWFGb3JtYXRfc2V0RG91YmxlKEFNZWRpYUZvcm1hdCogZm9ybWF0LCBjb25zdCBjaGFyKiBuYW1lLCBkb3VibGUgdmFsdWUpIHsKKyAgICBmb3JtYXQtPm1Gb3JtYXQtPnNldERvdWJsZShuYW1lLCB2YWx1ZSk7Cit9CisKK0VYUE9SVAordm9pZCBBTWVkaWFGb3JtYXRfc2V0U2l6ZShBTWVkaWFGb3JtYXQqIGZvcm1hdCwgY29uc3QgY2hhciogbmFtZSwgc2l6ZV90IHZhbHVlKSB7CisgICAgZm9ybWF0LT5tRm9ybWF0LT5zZXRTaXplKG5hbWUsIHZhbHVlKTsKK30KKworRVhQT1JUCit2b2lkIEFNZWRpYUZvcm1hdF9zZXRSZWN0KEFNZWRpYUZvcm1hdCogZm9ybWF0LCBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxlZnQsIGludDMyX3QgdG9wLCBpbnQzMl90IHJpZ2h0LCBpbnQzMl90IGJvdHRvbSkgeworICAgIGZvcm1hdC0+bUZvcm1hdC0+c2V0UmVjdChuYW1lLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOworfQorCitFWFBPUlQKIHZvaWQgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhBTWVkaWFGb3JtYXQqIGZvcm1hdCwgY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogdmFsdWUpIHsKICAgICAvLyBBTWVzc2FnZTo6c2V0U3RyaW5nKCkgbWFrZXMgYSBjb3B5IG9mIHRoZSBzdHJpbmcKICAgICBmb3JtYXQtPm1Gb3JtYXQtPnNldFN0cmluZyhuYW1lLCB2YWx1ZSwgc3RybGVuKHZhbHVlKSk7CkBAIC0yMzMsMzAgKzI2Nyw3MiBAQAogfQogCiAKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FBQ19EUkNfQVRURU5VQVRJT05fRkFDVE9SID0gImFhYy1kcmMtY3V0LWxldmVsIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FBQ19EUkNfQk9PU1RfRkFDVE9SID0gImFhYy1kcmMtYm9vc3QtbGV2ZWwiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUFDX0RSQ19IRUFWWV9DT01QUkVTU0lPTiA9ICJhYWMtZHJjLWhlYXZ5LWNvbXByZXNzaW9uIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FBQ19EUkNfVEFSR0VUX1JFRkVSRU5DRV9MRVZFTCA9ICJhYWMtdGFyZ2V0LXJlZi1sZXZlbCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BQUNfRU5DT0RFRF9UQVJHRVRfTEVWRUwgPSAiYWFjLWVuY29kZWQtdGFyZ2V0LWxldmVsIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FBQ19NQVhfT1VUUFVUX0NIQU5ORUxfQ09VTlQgPSAiYWFjLW1heC1vdXRwdXQtY2hhbm5lbF9jb3VudCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BQUNfUFJPRklMRSA9ICJhYWMtcHJvZmlsZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BQUNfU0JSX01PREUgPSAiYWFjLXNici1tb2RlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1NFU1NJT05fSUQgPSAiYXVkaW8tc2Vzc2lvbi1pZCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9CSVRSQVRFX01PREUgPSAiYml0cmF0ZS1tb2RlIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0JJVF9SQVRFID0gImJpdHJhdGUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ0FQVFVSRV9SQVRFID0gImNhcHR1cmUtcmF0ZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5UID0gImNoYW5uZWwtY291bnQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9NQVNLID0gImNoYW5uZWwtbWFzayI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DT0xPUl9GT1JNQVQgPSAiY29sb3ItZm9ybWF0IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1JBTkdFID0gImNvbG9yLXJhbmdlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1NUQU5EQVJEID0gImNvbG9yLXN0YW5kYXJkIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1RSQU5TRkVSID0gImNvbG9yLXRyYW5zZmVyIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTVBMRVhJVFkgPSAiY29tcGxleGl0eSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DU0QgPSAiY3NkIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NTRF8wID0gImNzZC0wIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NTRF8xID0gImNzZC0xIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NTRF8yID0gImNzZC0yIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfQ1JPUCA9ICJjcm9wIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfSEVJR0hUID0gImRpc3BsYXktaGVpZ2h0IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfV0lEVEggPSAiZGlzcGxheS13aWR0aCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiA9ICJkdXJhdGlvblVzIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0ZMQUNfQ09NUFJFU1NJT05fTEVWRUwgPSAiZmxhYy1jb21wcmVzc2lvbi1sZXZlbCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9GUkFNRV9SQVRFID0gImZyYW1lLXJhdGUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfR1JJRF9DT0xVTU5TID0gImdyaWQtY29scyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9HUklEX1JPV1MgPSAiZ3JpZC1yb3dzIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0hEUl9TVEFUSUNfSU5GTyA9ICJoZHItc3RhdGljLWluZm8iOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hUID0gImhlaWdodCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JTlRSQV9SRUZSRVNIX1BFUklPRCA9ICJpbnRyYS1yZWZyZXNoLXBlcmlvZCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JU19BRFRTID0gImlzLWFkdHMiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSVNfQVVUT1NFTEVDVCA9ICJpcy1hdXRvc2VsZWN0IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lTX0RFRkFVTFQgPSAiaXMtZGVmYXVsdCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JU19GT1JDRURfU1VCVElUTEUgPSAiaXMtZm9yY2VkLXN1YnRpdGxlIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lfRlJBTUVfSU5URVJWQUwgPSAiaS1mcmFtZS1pbnRlcnZhbCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MQU5HVUFHRSA9ICJsYW5ndWFnZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MQVRFTkNZID0gImxhdGVuY3kiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTEVWRUwgPSAibGV2ZWwiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUFYX0hFSUdIVCA9ICJtYXgtaGVpZ2h0IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BWF9JTlBVVF9TSVpFID0gIm1heC1pbnB1dC1zaXplIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BWF9XSURUSCA9ICJtYXgtd2lkdGgiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUlNRSA9ICJtaW1lIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01QRUdfVVNFUl9EQVRBID0gIm1wZWctdXNlci1kYXRhIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX09QRVJBVElOR19SQVRFID0gIm9wZXJhdGluZy1yYXRlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1BDTV9FTkNPRElORyA9ICJwY20tZW5jb2RpbmciOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUFJJT1JJVFkgPSAicHJpb3JpdHkiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUFJPRklMRSA9ICJwcm9maWxlIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1BVU0hfQkxBTktfQlVGRkVSU19PTl9TVE9QID0gInB1c2gtYmxhbmstYnVmZmVycy1vbi1zaHV0ZG93biI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9SRVBFQVRfUFJFVklPVVNfRlJBTUVfQUZURVIgPSAicmVwZWF0LXByZXZpb3VzLWZyYW1lLWFmdGVyIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1JPVEFUSU9OID0gInJvdGF0aW9uLWRlZ3JlZXMiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUgPSAic2FtcGxlLXJhdGUiOwotRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfV0lEVEggPSAid2lkdGgiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU0VJID0gInNlaSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9TTElDRV9IRUlHSFQgPSAic2xpY2UtaGVpZ2h0IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NUUklERSA9ICJzdHJpZGUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJfSUQgPSAidGVtcG9yYWwtbGF5ZXItaWQiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJJTkcgPSAidHMtc2NoZW1hIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RJTEVfSEVJR0hUID0gInRpbGUtaGVpZ2h0IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RJTEVfV0lEVEggPSAidGlsZS13aWR0aCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USU1FX1VTID0gInRpbWVVcyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9UUkFDS19JRCA9ICJ0cmFjay1pZCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9UUkFDS19JTkRFWCA9ICJ0cmFjay1pbmRleCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9XSURUSCA9ICJ3aWR0aCI7CiAKIAogfSAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFNdXhlci5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFNdXhlci5jcHAKaW5kZXggODBhNDM5MS4uZGZmYzRkNyAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhTXV4ZXIuY3BwCisrKyBiL21lZGlhL25kay9OZGtNZWRpYU11eGVyLmNwcApAQCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KZGlmZiAtLWdpdCBhL21lZGlhL25kay9PV05FUlMgYi9tZWRpYS9uZGsvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZTgzNDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9uZGsvT1dORVJTCkBAIC0wLDAgKzEsNSBAQAorbWFyY29uZUBnb29nbGUuY29tCisjIEZvciBBSW1hZ2UvQUltYWdlUmVhZGVyCitldGFsdmFsYUBnb29nbGUuY29tCit5aW5jaGlheWVoQGdvb2dsZS5jb20KK3poaWp1bmhlQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtJbWFnZS5oCmluZGV4IDE5MzE0OTYuLjE5ZGY3NjAgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2UuaApAQCAtNDQsMTEgKzQ0LDcgQEAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlX2J1ZmZlci5oPgogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyNiAqLwogCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpZiBfX0FORFJPSURfQVBJX18gPj0gMjQKK19fQkVHSU5fREVDTFMKIAogLyoqCiAgKiBBSW1hZ2UgaXMgYW4gb3BhcXVlIHR5cGUgdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gaW1hZ2UgZ2VuZXJhdGVkIGJ5IHtAbGluayBBSW1hZ2VSZWFkZXJ9LgpAQCAtNzYsMTQgKzcyLDE1IEBACiAgICAgQUlNQUdFX0ZPUk1BVF9SR0JBXzg4ODggICAgICAgICA9IDB4MSwKIAogICAgIC8qKgotICAgICAqIDMyIGJpdHMgUkdCWCBmb3JtYXQsIDggYml0cyBmb3IgZWFjaCBvZiB0aGUgZm91ciBjaGFubmVscy4KKyAgICAgKiAzMiBiaXRzIFJHQlggZm9ybWF0LCA4IGJpdHMgZm9yIGVhY2ggb2YgdGhlIGZvdXIgY2hhbm5lbHMuICBUaGUgdmFsdWVzCisgICAgICogb2YgdGhlIGFscGhhIGNoYW5uZWwgYml0cyBhcmUgaWdub3JlZCAoaW1hZ2UgaXMgYXNzdW1lZCB0byBiZSBvcGFxdWUpLgogICAgICAqCiAgICAgICogPHA+CiAgICAgICogQ29ycmVzcG9uZGluZyBmb3JtYXRzOgogICAgICAqIDx1bD4KICAgICAgKiA8bGk+QUhhcmR3YXJlQnVmZmVyOiBBSEFSRFdBUkVCVUZGRVJfRk9STUFUX1I4RzhCOFg4X1VOT1JNPC9saT4KICAgICAgKiA8bGk+VnVsa2FuOiBWS19GT1JNQVRfUjhHOEI4QThfVU5PUk08L2xpPgotICAgICAqIDxsaT5PcGVuR0wgRVM6IEdMX1JHQkE4PC9saT4KKyAgICAgKiA8bGk+T3BlbkdMIEVTOiBHTF9SR0I4PC9saT4KICAgICAgKiA8L3VsPgogICAgICAqIDwvcD4KICAgICAgKgpAQCAtNTE5LDYgKzUxNiw4IEBACiAgICAgaW50MzJfdCBib3R0b207CiB9IEFJbWFnZUNyb3BSZWN0OwogCisjaWYgX19BTkRST0lEX0FQSV9fID49IDI0CisKIC8qKgogICogUmV0dXJuIHRoZSBpbWFnZSBiYWNrIHRoZSB0aGUgc3lzdGVtIGFuZCBkZWxldGUgdGhlIEFJbWFnZSBvYmplY3QgZnJvbSBtZW1vcnkuCiAgKgpAQCAtNzE5LDcgKzcxOCw3IEBACiAKICNpZiBfX0FORFJPSURfQVBJX18gPj0gMjYKIAotLyoKKy8qKgogICogUmV0dXJuIHRoZSBpbWFnZSBiYWNrIHRoZSB0aGUgc3lzdGVtIGFuZCBkZWxldGUgdGhlIEFJbWFnZSBvYmplY3QgZnJvbSBtZW1vcnkgYXN5bmNocm9ub3VzbHkuCiAgKgogICogPHA+U2ltaWxhciB0byB7QGxpbmsgQUltYWdlX2RlbGV0ZX0sIGRvIE5PVCB1c2UgdGhlIGltYWdlIHBvaW50ZXIgYWZ0ZXIgdGhpcyBtZXRob2QgcmV0dXJucy4KQEAgLTc0OCw4ICs3NDcsOSBAQAogICogQUhhcmR3YXJlQnVmZmVyX2FjcXVpcmV9IHRvIGFjcXVpcmUgYW4gZXh0cmEgcmVmZXJlbmNlLCBhbmQgY2FsbCB7QGxpbmsgQUhhcmR3YXJlQnVmZmVyX3JlbGVhc2V9CiAgKiBvbmNlIGl0IGhhcyBmaW5pc2hlZCB1c2luZyBpdCBpbiBvcmRlciB0byBwcm9wZXJseSBkZWFsbG9jYXRlIHRoZSB1bmRlcmx5aW5nIG1lbW9yeSBtYW5hZ2VkIGJ5CiAgKiB7QGxpbmsgQUhhcmR3YXJlQnVmZmVyfS4gSWYgdGhlIGNhbGxlciBoYXMgYWNxdWlyZWQgZXh0cmEgcmVmZXJlbmNlIG9uIGFuIHtAbGluayBBSGFyZHdhcmVCdWZmZXJ9Ci0gKiByZXR1cm5lZCBmcm9tIHRoaXMgZnVuY3Rpb24sIGl0IG11c3QgYWxzbyBsaXN0ZW4gdG8ge0BsaW5rIG9uQnVmZmVyRnJlZWR9IGNhbGxiYWNrIHRvIGJlCi0gKiBub3RpZmllZCB3aGVuIHRoZSBidWZmZXIgaXMgbm8gbG9uZ2VyIHVzZWQgYnkge0BsaW5rIEFJbWFnZVJlYWRlcn0uPC9wPgorICogcmV0dXJuZWQgZnJvbSB0aGlzIGZ1bmN0aW9uLCBpdCBtdXN0IGFsc28gcmVnaXN0ZXIgYSBsaXN0ZW5lciB1c2luZyB0aGUgZnVuY3Rpb24KKyAqIHtAbGluayBBSW1hZ2VSZWFkZXJfc2V0QnVmZmVyUmVtb3ZlZExpc3RlbmVyfSB0byBiZSBub3RpZmllZCB3aGVuIHRoZSBidWZmZXIgaXMgbm8gbG9uZ2VyIHVzZWQKKyAqIGJ5IHtAbGluayBBSW1hZ2VSZWFkZXJ9LjwvcD4KICAqCiAgKiBAcGFyYW0gaW1hZ2UgdGhlIHtAbGluayBBSW1hZ2V9IG9mIGludGVyZXN0LgogICogQHBhcmFtIG91dEJ1ZmZlciBUaGUgbWVtb3J5IGFyZWEgcG9pbnRlZCB0byBieSBidWZmZXIgd2lsbCBjb250YWluIHRoZSBhY3F1aXJlZCBBSGFyZHdhcmVCdWZmZXIKQEAgLTc2NCw5ICs3NjQsNyBAQAogCiAjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI2ICovCiAKLSNpZmRlZiBfX2NwbHVzcGx1cwotfSAvLyBleHRlcm4gIkMiCi0jZW5kaWYKK19fRU5EX0RFQ0xTCiAKICNlbmRpZiAvL19OREtfSU1BR0VfSAogCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtJbWFnZVJlYWRlci5oIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2VSZWFkZXIuaAppbmRleCA3YTBjMTdiLi41NzE0MTBiIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtJbWFnZVJlYWRlci5oCisrKyBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlUmVhZGVyLmgKQEAgLTQyLDExICs0Miw3IEBACiAjaW5jbHVkZSAiTmRrTWVkaWFFcnJvci5oIgogI2luY2x1ZGUgIk5ka0ltYWdlLmgiCiAKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyNAorX19CRUdJTl9ERUNMUwogCiAvKioKICAqIEFJbWFnZSBpcyBhbiBvcGFxdWUgdHlwZSB0aGF0IGFsbG93cyBkaXJlY3QgYXBwbGljYXRpb24gYWNjZXNzIHRvIGltYWdlIGRhdGEgcmVuZGVyZWQgaW50byBhCkBAIC01NCw2ICs1MCw4IEBACiAgKi8KIHR5cGVkZWYgc3RydWN0IEFJbWFnZVJlYWRlciBBSW1hZ2VSZWFkZXI7CiAKKyNpZiBfX0FORFJPSURfQVBJX18gPj0gMjQKKwogLyoqCiAgKiBDcmVhdGUgYSBuZXcgcmVhZGVyIGZvciBpbWFnZXMgb2YgdGhlIGRlc2lyZWQgc2l6ZSBhbmQgZm9ybWF0LgogICoKQEAgLTI1OCw3ICsyNTYsNyBAQAogCiAKIC8qKgotICogVGhlIGRlZmluaXRpb24gb2Yge0BsaW5rIEFJbWFnZVJlYWRlcn0gbmV3IGltYWdlIGF2YWlsYWJsZSBjYWxsYmFjay4KKyAqIFNpZ25hdHVyZSBvZiB0aGUgY2FsbGJhY2sgd2hpY2ggaXMgY2FsbGVkIHdoZW4gYSBuZXcgaW1hZ2UgaXMgYXZhaWxhYmxlIGZyb20ge0BsaW5rIEFJbWFnZVJlYWRlcn0uCiAgKgogICogQHBhcmFtIGNvbnRleHQgVGhlIG9wdGlvbmFsIGFwcGxpY2F0aW9uIGNvbnRleHQgcHJvdmlkZWQgYnkgdXNlciBpbgogICogICAgICAgICAgICAgICAge0BsaW5rIEFJbWFnZVJlYWRlcl9zZXRJbWFnZUxpc3RlbmVyfS4KQEAgLTI2NywxMSArMjY1LDExIEBACiB0eXBlZGVmIHZvaWQgKCpBSW1hZ2VSZWFkZXJfSW1hZ2VDYWxsYmFjaykodm9pZCogY29udGV4dCwgQUltYWdlUmVhZGVyKiByZWFkZXIpOwogCiB0eXBlZGVmIHN0cnVjdCBBSW1hZ2VSZWFkZXJfSW1hZ2VMaXN0ZW5lciB7Ci0gICAgLy8vIG9wdGlvbmFsIGFwcGxpY2F0aW9uIGNvbnRleHQuCisgICAgLy8vIE9wdGlvbmFsIGFwcGxpY2F0aW9uIGNvbnRleHQgcGFzc2VkIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgb2YgdGhlIGNhbGxiYWNrLgogICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ7CiAKICAgICAvKioKLSAgICAgKiBUaGlzIGNhbGxiYWNrIGlzIGNhbGxlZCB3aGVuIHRoZXJlIGlzIGEgbmV3IGltYWdlIGF2YWlsYWJsZSBmb3IgaW4gdGhlIGltYWdlIHJlYWRlcidzIHF1ZXVlLgorICAgICAqIFRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkIHdoZW4gdGhlcmUgaXMgYSBuZXcgaW1hZ2UgYXZhaWxhYmxlIGluIHRoZSBpbWFnZSByZWFkZXIncyBxdWV1ZS4KICAgICAgKgogICAgICAqIDxwPlRoZSBjYWxsYmFjayBoYXBwZW5zIG9uIG9uZSBkZWRpY2F0ZWQgdGhyZWFkIHBlciB7QGxpbmsgQUltYWdlUmVhZGVyfSBpbnN0YW5jZS4gSXQgaXMgb2theQogICAgICAqIHRvIHVzZSBBSW1hZ2VSZWFkZXJfKiBhbmQgQUltYWdlXyogbWV0aG9kcyB3aXRoaW4gdGhlIGNhbGxiYWNrLiBOb3RlIHRoYXQgaXQgaXMgcG9zc2libGUgdGhhdApAQCAtMjg3LDExICsyODUsMTEgQEAKIC8qKgogICogU2V0IHRoZSBvbkltYWdlQXZhaWxhYmxlIGxpc3RlbmVyIG9mIHRoaXMgaW1hZ2UgcmVhZGVyLgogICoKLSAqIDxwPk5vdGUgdGhhdCBjYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgcmVwbGFjZSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLjwvcD4KKyAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCByZXBsYWNlIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCiAgKgogICogQHBhcmFtIHJlYWRlciBUaGUgaW1hZ2UgcmVhZGVyIG9mIGludGVyZXN0LgotICogQHBhcmFtIGxpc3RlbmVyIHRoZSB7QGxpbmsgQUltYWdlUmVhZGVyX0ltYWdlTGlzdGVuZXJ9IHRvIGJlIHJlZ2lzdGVyZWQuIFNldCB0aGlzIHRvIE5VTEwgaWYKLSAqICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBubyBsb25nZXIgbmVlZHMgdG8gbGlzdGVuIHRvIG5ldyBpbWFnZXMuCisgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIHtAbGluayBBSW1hZ2VSZWFkZXJfSW1hZ2VMaXN0ZW5lcn0gdG8gYmUgcmVnaXN0ZXJlZC4gU2V0IHRoaXMgdG8gTlVMTCBpZgorICogICAgICAgICAgICAgICAgIHRoZSBhcHBsaWNhdGlvbiBubyBsb25nZXIgbmVlZHMgdG8gbGlzdGVuIHRvIG5ldyBpbWFnZXMuCiAgKgogICogQHJldHVybiA8dWw+CiAgKiAgICAgICAgIDxsaT57QGxpbmsgQU1FRElBX09LfSBpZiB0aGUgbWV0aG9kIGNhbGwgc3VjY2VlZHMuPC9saT4KQEAgLTMwNyw5ICszMDUsOSBAQAogLyoqCiAgKiBBSW1hZ2VSZWFkZXIgY29uc3RydWN0b3Igc2ltaWxhciB0byB7QGxpbmsgQUltYWdlUmVhZGVyX25ld30gdGhhdCB0YWtlcyBhbiBhZGRpdGlvbmFsIHBhcmFtZXRlcgogICogZm9yIHRoZSBjb25zdW1lciB1c2FnZS4gQWxsIG90aGVyIHBhcmFtZXRlcnMgYW5kIHRoZSByZXR1cm4gdmFsdWVzIGFyZSBpZGVudGljYWwgdG8gdGhvc2UgcGFzc2VkCi0gKiB0byB7QGxpbmUgQUltYWdlUmVhZGVyX25ld30uCisgKiB0byB7QGxpbmsgQUltYWdlUmVhZGVyX25ld30uCiAgKgotICogPHA+SWYgdGhlIHtAY29kZSBmb3JtYXR9IGlzIHtAbGluayBBSU1BR0VfRk9STUFUX1BSSVZBVEV9LCB0aGUgY3JlYXRlZCB7QGxpbmsgQUltYWdlUmVhZGVyfQorICogPHA+SWYgdGhlIFxjIGZvcm1hdCBpcyB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9QUklWQVRFfSwgdGhlIGNyZWF0ZWQge0BsaW5rIEFJbWFnZVJlYWRlcn0KICAqIHdpbGwgcHJvZHVjZSBpbWFnZXMgd2hvc2UgY29udGVudHMgYXJlIG5vdCBkaXJlY3RseSBhY2Nlc3NpYmxlIGJ5IHRoZSBhcHBsaWNhdGlvbi4gVGhlIGFwcGxpY2F0aW9uIGNhbgogICogc3RpbGwgYWNxdWlyZSBpbWFnZXMgZnJvbSB0aGlzIHtAbGluayBBSW1hZ2VSZWFkZXJ9IGFuZCBhY2Nlc3Mge0BsaW5rIEFIYXJkd2FyZUJ1ZmZlcn0gdmlhCiAgKiB7QGxpbmsgQUltYWdlX2dldEhhcmR3YXJlQnVmZmVyKCl9LiBUaGUge0BsaW5rIEFIYXJkd2FyZUJ1ZmZlcn0gZ2FpbmVkIHRoaXMgd2F5IGNhbiB0aGVuCkBAIC0zMjQsNyArMzIyLDcgQEAKICAqIEFJbWFnZVJlYWRlcn1zIHVzaW5nIG90aGVyIGZvcm1hdCBzdWNoIGFzIHtAbGluayBBSU1BR0VfRk9STUFUX1lVVl80MjBfODg4fS48L3A+CiAgKgogICogPHA+Tm90ZSB0aGF0IG5vdCBhbGwgZm9ybWF0IGFuZCB1c2FnZSBmbGFnIGNvbWJpbmF0aW9uIGlzIHN1cHBvcnRlZCBieSB0aGUge0BsaW5rIEFJbWFnZVJlYWRlcn0sCi0gKiBlc3BlY2lhbGx5IGlmIHtAY29kZSBmb3JtYXR9IGlzIHtAbGluayBBSU1BR0VfRk9STUFUX1BSSVZBVEV9LCB7QGNvZGUgdXNhZ2V9IG11c3Qgbm90IGluY2x1ZGUgZWl0aGVyCisgKiBlc3BlY2lhbGx5IGlmIFxjIGZvcm1hdCBpcyB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9QUklWQVRFfSwgXGMgdXNhZ2UgbXVzdCBub3QgaW5jbHVkZSBlaXRoZXIKICAqIHtAbGluayBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfUkVBRF9SQVJFTFl9IG9yIHtAbGluayBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfUkVBRF9PRlRFTn08L3A+CiAgKgogICogQHBhcmFtIHdpZHRoIFRoZSBkZWZhdWx0IHdpZHRoIGluIHBpeGVscyBvZiB0aGUgSW1hZ2VzIHRoYXQgdGhpcyByZWFkZXIgd2lsbCBwcm9kdWNlLgpAQCAtMzY5LDcgKzM2Nyw3IEBACiAgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LCBpbnQzMl90IGZvcm1hdCwgdWludDY0X3QgdXNhZ2UsIGludDMyX3QgbWF4SW1hZ2VzLAogICAgICAgICAvKm91dCovIEFJbWFnZVJlYWRlcioqIHJlYWRlcik7CiAKLS8qCisvKioKICAqIEFjcXVpcmUgdGhlIG5leHQge0BsaW5rIEFJbWFnZX0gZnJvbSB0aGUgaW1hZ2UgcmVhZGVyJ3MgcXVldWUgYXN5bmNocm9ub3VzbHkuCiAgKgogICogPHA+QUltYWdlUmVhZGVyIGFjcXVpcmUgbWV0aG9kIHNpbWlsYXIgdG8ge0BsaW5rIEFJbWFnZVJlYWRlcl9hY3F1aXJlTmV4dEltYWdlfSB0aGF0IHRha2VzIGFuCkBAIC0zNzksNyArMzc3LDcgQEAKICAqIEBwYXJhbSBhY3F1aXJlRmVuY2VGZCBBIHN5bmMgZmVuY2UgZmQgZGVmaW5lZCBpbiB7QGxpbmsgc3luYy5ofSwgd2hpY2ggaXMgdXNlZCB0byBzaWduYWwgd2hlbiB0aGUKICAqICAgICAgICAgYnVmZmVyIGlzIHJlYWR5IHRvIGNvbnN1bWUuIFdoZW4gc3luY2hyb25pemF0aW9uIGZlbmNlIGlzIG5vdCBuZWVkZWQsIGZlbmNlIHdpbGwgYmUgc2V0CiAgKiAgICAgICAgIHRvIC0xIGFuZCB0aGUge0BsaW5rIEFJbWFnZX0gcmV0dXJuZWQgaXMgcmVhZHkgZm9yIHVzZSBpbW1lZGlhdGVseS4gT3RoZXJ3aXNlLCB1c2VyIHNoYWxsCi0gKiAgICAgICAgIHVzZSBzeXNjYWxscyBzdWNoIGFzIHtAY29kZSBwb2xsKCl9LCB7QGNvZGUgZXBvbGwoKX0sIHtAY29kZSBzZWxlY3QoKX0gdG8gd2FpdCBmb3IgdGhlCisgKiAgICAgICAgIHVzZSBzeXNjYWxscyBzdWNoIGFzIFxjIHBvbGwoKSwgXGMgZXBvbGwoKSwgXGMgc2VsZWN0KCkgdG8gd2FpdCBmb3IgdGhlCiAgKiAgICAgICAgIGZlbmNlIGZkIHRvIGNoYW5nZSBzdGF0dXMgYmVmb3JlIGF0dGVtcHRpbmcgdG8gYWNjZXNzIHRoZSB7QGxpbmsgQUltYWdlfSByZXR1cm5lZC4KICAqCiAgKiBAc2VlIHN5bmMuaApAQCAtMzg4LDcgKzM4Niw3IEBACiBtZWRpYV9zdGF0dXNfdCBBSW1hZ2VSZWFkZXJfYWNxdWlyZU5leHRJbWFnZUFzeW5jKAogICAgICAgICBBSW1hZ2VSZWFkZXIqIHJlYWRlciwgLypvdXQqL0FJbWFnZSoqIGltYWdlLCAvKm91dCovaW50KiBhY3F1aXJlRmVuY2VGZCk7CiAKLS8qCisvKioKICAqIEFjcXVpcmUgdGhlIGxhdGVzdCB7QGxpbmsgQUltYWdlfSBmcm9tIHRoZSBpbWFnZSByZWFkZXIncyBxdWV1ZSBhc3luY2hyb25vdXNseSwgZHJvcHBpbmcgb2xkZXIKICAqIGltYWdlcy4KICAqCkBAIC0zOTksNyArMzk3LDcgQEAKICAqIEBwYXJhbSBhY3F1aXJlRmVuY2VGZCBBIHN5bmMgZmVuY2UgZmQgZGVmaW5lZCBpbiB7QGxpbmsgc3luYy5ofSwgd2hpY2ggaXMgdXNlZCB0byBzaWduYWwgd2hlbiB0aGUKICAqICAgICAgICAgYnVmZmVyIGlzIHJlYWR5IHRvIGNvbnN1bWUuIFdoZW4gc3luY2hyb25pemF0aW9uIGZlbmNlIGlzIG5vdCBuZWVkZWQsIGZlbmNlIHdpbGwgYmUgc2V0CiAgKiAgICAgICAgIHRvIC0xIGFuZCB0aGUge0BsaW5rIEFJbWFnZX0gcmV0dXJuZWQgaXMgcmVhZHkgZm9yIHVzZSBpbW1lZGlhdGVseS4gT3RoZXJ3aXNlLCB1c2VyIHNoYWxsCi0gKiAgICAgICAgIHVzZSBzeXNjYWxscyBzdWNoIGFzIHtAY29kZSBwb2xsKCl9LCB7QGNvZGUgZXBvbGwoKX0sIHtAY29kZSBzZWxlY3QoKX0gdG8gd2FpdCBmb3IgdGhlCisgKiAgICAgICAgIHVzZSBzeXNjYWxscyBzdWNoIGFzIFxjIHBvbGwoKSwgXGMgZXBvbGwoKSwgXGMgc2VsZWN0KCkgdG8gd2FpdCBmb3IgdGhlCiAgKiAgICAgICAgIGZlbmNlIGZkIHRvIGNoYW5nZSBzdGF0dXMgYmVmb3JlIGF0dGVtcHRpbmcgdG8gYWNjZXNzIHRoZSB7QGxpbmsgQUltYWdlfSByZXR1cm5lZC4KICAqCiAgKiBAc2VlIHN5bmMuaApAQCAtNDA4LDcgKzQwNiw3IEBACiBtZWRpYV9zdGF0dXNfdCBBSW1hZ2VSZWFkZXJfYWNxdWlyZUxhdGVzdEltYWdlQXN5bmMoCiAgICAgICAgIEFJbWFnZVJlYWRlciogcmVhZGVyLCAvKm91dCovQUltYWdlKiogaW1hZ2UsIC8qb3V0Ki9pbnQqIGFjcXVpcmVGZW5jZUZkKTsKIC8qKgotICogVGhlIGRlZmluaXRpb24gb2Yge0BsaW5rIEFJbWFnZVJlYWRlcn0gYnVmZmVyIHJlbW92ZWQgY2FsbGJhY2suCisgKiBTaWduYXR1cmUgb2YgdGhlIGNhbGxiYWNrIHdoaWNoIGlzIGNhbGxlZCB3aGVuIHtAbGluayBBSW1hZ2VSZWFkZXJ9IGlzIGFib3V0IHRvIHJlbW92ZSBhIGJ1ZmZlci4KICAqCiAgKiBAcGFyYW0gY29udGV4dCBUaGUgb3B0aW9uYWwgYXBwbGljYXRpb24gY29udGV4dCBwcm92aWRlZCBieSB1c2VyIGluCiAgKiAgICAgICAgICAgICAgICB7QGxpbmsgQUltYWdlUmVhZGVyX3NldEJ1ZmZlclJlbW92ZWRMaXN0ZW5lcn0uCkBAIC00MjAsNyArNDE4LDcgQEAKICAgICAgICAgQUhhcmR3YXJlQnVmZmVyKiBidWZmZXIpOwogCiB0eXBlZGVmIHN0cnVjdCBBSW1hZ2VSZWFkZXJfQnVmZmVyUmVtb3ZlZExpc3RlbmVyIHsKLSAgICAvLy8gb3B0aW9uYWwgYXBwbGljYXRpb24gY29udGV4dC4KKyAgICAvLy8gT3B0aW9uYWwgYXBwbGljYXRpb24gY29udGV4dCBwYXNzZWQgYXMgdGhlIGZpcnN0IHBhcmFtZXRlciBvZiB0aGUgY2FsbGJhY2suCiAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgY29udGV4dDsKIAogICAgIC8qKgpAQCAtNDY1LDEwICs0NjMsNyBAQAogCiAjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI2ICovCiAKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19IC8vIGV4dGVybiAiQyIKLSNlbmRpZgorX19FTkRfREVDTFMKIAogI2VuZGlmIC8vX05ES19JTUFHRV9SRUFERVJfSAogCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUNvZGVjLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUNvZGVjLmgKaW5kZXggN2U3ZTgxZS4uZjRhNTFkMCAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFDb2RlYy5oCisrKyBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhQ29kZWMuaApAQCAtMzQsMTMgKzM0LDExIEBACiAjaW5jbHVkZSAiTmRrTWVkaWFFcnJvci5oIgogI2luY2x1ZGUgIk5ka01lZGlhRm9ybWF0LmgiCiAKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKK19fQkVHSU5fREVDTFMKIAogc3RydWN0IEFOYXRpdmVXaW5kb3c7Cit0eXBlZGVmIHN0cnVjdCBBTmF0aXZlV2luZG93IEFOYXRpdmVXaW5kb3c7CiAKLSNpZiBfX0FORFJPSURfQVBJX18gPj0gMjEKIAogc3RydWN0IEFNZWRpYUNvZGVjOwogdHlwZWRlZiBzdHJ1Y3QgQU1lZGlhQ29kZWMgQU1lZGlhQ29kZWM7CkBAIC01NSwxNCArNTMsNjggQEAKIHR5cGVkZWYgc3RydWN0IEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyBBTWVkaWFDb2RlY0NyeXB0b0luZm87CiAKIGVudW0geworICAgIEFNRURJQUNPREVDX0JVRkZFUl9GTEFHX0NPREVDX0NPTkZJRyA9IDIsCiAgICAgQU1FRElBQ09ERUNfQlVGRkVSX0ZMQUdfRU5EX09GX1NUUkVBTSA9IDQsCisgICAgQU1FRElBQ09ERUNfQlVGRkVSX0ZMQUdfUEFSVElBTF9GUkFNRSA9IDgsCisKICAgICBBTUVESUFDT0RFQ19DT05GSUdVUkVfRkxBR19FTkNPREUgPSAxLAogICAgIEFNRURJQUNPREVDX0lORk9fT1VUUFVUX0JVRkZFUlNfQ0hBTkdFRCA9IC0zLAogICAgIEFNRURJQUNPREVDX0lORk9fT1VUUFVUX0ZPUk1BVF9DSEFOR0VEID0gLTIsCi0gICAgQU1FRElBQ09ERUNfSU5GT19UUllfQUdBSU5fTEFURVIgPSAtMQorICAgIEFNRURJQUNPREVDX0lORk9fVFJZX0FHQUlOX0xBVEVSID0gLTEsCiB9OwogCiAvKioKKyAqIENhbGxlZCB3aGVuIGFuIGlucHV0IGJ1ZmZlciBiZWNvbWVzIGF2YWlsYWJsZS4KKyAqIFRoZSBzcGVjaWZpZWQgaW5kZXggaXMgdGhlIGluZGV4IG9mIHRoZSBhdmFpbGFibGUgaW5wdXQgYnVmZmVyLgorICovCit0eXBlZGVmIHZvaWQgKCpBTWVkaWFDb2RlY09uQXN5bmNJbnB1dEF2YWlsYWJsZSkoCisgICAgICAgIEFNZWRpYUNvZGVjICpjb2RlYywKKyAgICAgICAgdm9pZCAqdXNlcmRhdGEsCisgICAgICAgIGludDMyX3QgaW5kZXgpOworLyoqCisgKiBDYWxsZWQgd2hlbiBhbiBvdXRwdXQgYnVmZmVyIGJlY29tZXMgYXZhaWxhYmxlLgorICogVGhlIHNwZWNpZmllZCBpbmRleCBpcyB0aGUgaW5kZXggb2YgdGhlIGF2YWlsYWJsZSBvdXRwdXQgYnVmZmVyLgorICogVGhlIHNwZWNpZmllZCBidWZmZXJJbmZvIGNvbnRhaW5zIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgYXZhaWxhYmxlIG91dHB1dCBidWZmZXIuCisgKi8KK3R5cGVkZWYgdm9pZCAoKkFNZWRpYUNvZGVjT25Bc3luY091dHB1dEF2YWlsYWJsZSkoCisgICAgICAgIEFNZWRpYUNvZGVjICpjb2RlYywKKyAgICAgICAgdm9pZCAqdXNlcmRhdGEsCisgICAgICAgIGludDMyX3QgaW5kZXgsCisgICAgICAgIEFNZWRpYUNvZGVjQnVmZmVySW5mbyAqYnVmZmVySW5mbyk7CisvKioKKyAqIENhbGxlZCB3aGVuIHRoZSBvdXRwdXQgZm9ybWF0IGhhcyBjaGFuZ2VkLgorICogVGhlIHNwZWNpZmllZCBmb3JtYXQgY29udGFpbnMgdGhlIG5ldyBvdXRwdXQgZm9ybWF0LgorICovCit0eXBlZGVmIHZvaWQgKCpBTWVkaWFDb2RlY09uQXN5bmNGb3JtYXRDaGFuZ2VkKSgKKyAgICAgICAgQU1lZGlhQ29kZWMgKmNvZGVjLAorICAgICAgICB2b2lkICp1c2VyZGF0YSwKKyAgICAgICAgQU1lZGlhRm9ybWF0ICpmb3JtYXQpOworLyoqCisgKiBDYWxsZWQgd2hlbiB0aGUgTWVkaWFDb2RlYyBlbmNvdW50ZXJlZCBhbiBlcnJvci4KKyAqIFRoZSBzcGVjaWZpZWQgYWN0aW9uQ29kZSBpbmRpY2F0ZXMgdGhlIHBvc3NpYmxlIGFjdGlvbnMgdGhhdCBjbGllbnQgY2FuIHRha2UsCisgKiBhbmQgaXQgY2FuIGJlIGNoZWNrZWQgYnkgY2FsbGluZyBBTWVkaWFDb2RlY0FjdGlvbkNvZGVfaXNSZWNvdmVyYWJsZSBvcgorICogQU1lZGlhQ29kZWNBY3Rpb25Db2RlX2lzVHJhbnNpZW50LiBJZiBib3RoIEFNZWRpYUNvZGVjQWN0aW9uQ29kZV9pc1JlY292ZXJhYmxlKCkKKyAqIGFuZCBBTWVkaWFDb2RlY0FjdGlvbkNvZGVfaXNUcmFuc2llbnQoKSByZXR1cm4gZmFsc2UsIHRoZW4gdGhlIGNvZGVjIGVycm9yIGlzIGZhdGFsCisgKiBhbmQgdGhlIGNvZGVjIG11c3QgYmUgZGVsZXRlZC4KKyAqIFRoZSBzcGVjaWZpZWQgZGV0YWlsIG1heSBjb250YWluIG1vcmUgZGV0YWlsZWQgbWVzc2FnZXMgYWJvdXQgdGhpcyBlcnJvci4KKyAqLwordHlwZWRlZiB2b2lkICgqQU1lZGlhQ29kZWNPbkFzeW5jRXJyb3IpKAorICAgICAgICBBTWVkaWFDb2RlYyAqY29kZWMsCisgICAgICAgIHZvaWQgKnVzZXJkYXRhLAorICAgICAgICBtZWRpYV9zdGF0dXNfdCBlcnJvciwKKyAgICAgICAgaW50MzJfdCBhY3Rpb25Db2RlLAorICAgICAgICBjb25zdCBjaGFyICpkZXRhaWwpOworCitzdHJ1Y3QgQU1lZGlhQ29kZWNPbkFzeW5jTm90aWZ5Q2FsbGJhY2sgeworICAgICAgQU1lZGlhQ29kZWNPbkFzeW5jSW5wdXRBdmFpbGFibGUgIG9uQXN5bmNJbnB1dEF2YWlsYWJsZTsKKyAgICAgIEFNZWRpYUNvZGVjT25Bc3luY091dHB1dEF2YWlsYWJsZSBvbkFzeW5jT3V0cHV0QXZhaWxhYmxlOworICAgICAgQU1lZGlhQ29kZWNPbkFzeW5jRm9ybWF0Q2hhbmdlZCAgIG9uQXN5bmNGb3JtYXRDaGFuZ2VkOworICAgICAgQU1lZGlhQ29kZWNPbkFzeW5jRXJyb3IgICAgICAgICAgIG9uQXN5bmNFcnJvcjsKK307CisKKyNpZiBfX0FORFJPSURfQVBJX18gPj0gMjEKKworLyoqCiAgKiBDcmVhdGUgY29kZWMgYnkgbmFtZS4gVXNlIHRoaXMgaWYgeW91IGtub3cgdGhlIGV4YWN0IGNvZGVjIHlvdSB3YW50IHRvIHVzZS4KICAqIFdoZW4gY29uZmlndXJpbmcsIHlvdSB3aWxsIG5lZWQgdG8gc3BlY2lmeSB3aGV0aGVyIHRvIHVzZSB0aGUgY29kZWMgYXMgYW4KICAqIGVuY29kZXIgb3IgZGVjb2Rlci4KQEAgLTE0OSw2ICsyMDEsNyBAQAogCiAjaWYgKGRlZmluZWQoX19jcGx1c3BsdXMpICYmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wpIHx8IFwKICAgICBfX1NURENfVkVSU0lPTl9fID49IDIwMTExMkwKKyNpbmNsdWRlIDxhc3NlcnQuaD4KIHN0YXRpY19hc3NlcnQoc2l6ZW9mKF9vZmZfdF9jb21wYXQpID09IHNpemVvZihsb25nKSwKICAgICAgICAgICAgICAgIl9vZmZfdF9jb21wYXQgZG9lcyBub3QgbWF0Y2ggdGhlIE5ESyBBQkkuIFNlZSAiCiAgICAgICAgICAgICAgICJodHRwczovL2dpdGh1Yi5jb20vYW5kcm9pZC1uZGsvbmRrL2lzc3Vlcy80NTkuIik7CkBAIC0xNzksNiArMjMyLDEyIEBACiBBTWVkaWFGb3JtYXQqIEFNZWRpYUNvZGVjX2dldE91dHB1dEZvcm1hdChBTWVkaWFDb2RlYyopOwogCiAvKioKKyAqIEdldCBmb3JtYXQgb2YgdGhlIGJ1ZmZlci4gVGhlIHNwZWNpZmllZCBidWZmZXIgaW5kZXggbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSBvYnRhaW5lZCBmcm9tCisgKiBkZXF1ZXVlT3V0cHV0QnVmZmVyLgorICovCitBTWVkaWFGb3JtYXQqIEFNZWRpYUNvZGVjX2dldEJ1ZmZlckZvcm1hdChBTWVkaWFDb2RlYyosIHNpemVfdCBpbmRleCk7CisKKy8qKgogICogSWYgeW91IGFyZSBkb25lIHdpdGggYSBidWZmZXIsIHVzZSB0aGlzIGNhbGwgdG8gcmV0dXJuIHRoZSBidWZmZXIgdG8KICAqIHRoZSBjb2RlYy4gSWYgeW91IHByZXZpb3VzbHkgc3BlY2lmaWVkIGEgc3VyZmFjZSB3aGVuIGNvbmZpZ3VyaW5nIHRoaXMKICAqIHZpZGVvIGRlY29kZXIgeW91IGNhbiBvcHRpb25hbGx5IHJlbmRlciB0aGUgYnVmZmVyLgpAQCAtMjA4LDYgKzI2Nyw4IEBACiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19yZWxlYXNlT3V0cHV0QnVmZmVyQXRUaW1lKAogICAgICAgICBBTWVkaWFDb2RlYyAqbURhdGEsIHNpemVfdCBpZHgsIGludDY0X3QgdGltZXN0YW1wTnMpOwogCisjaWYgX19BTkRST0lEX0FQSV9fID49IDI2CisKIC8qKgogICogQ3JlYXRlcyBhIFN1cmZhY2UgdGhhdCBjYW4gYmUgdXNlZCBhcyB0aGUgaW5wdXQgdG8gZW5jb2RlciwgaW4gcGxhY2Ugb2YgaW5wdXQgYnVmZmVycwogICoKQEAgLTI3OCw3ICszMzksNzIgQEAKICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbShBTWVkaWFDb2RlYyAqbURhdGEpOwogCisjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI2ICovCiAKKyNpZiBfX0FORFJPSURfQVBJX18gPj0gMjgKKworLyoqCisgKiBHZXQgdGhlIGNvbXBvbmVudCBuYW1lLiBJZiB0aGUgY29kZWMgd2FzIGNyZWF0ZWQgYnkgY3JlYXRlRGVjb2RlckJ5VHlwZQorICogb3IgY3JlYXRlRW5jb2RlckJ5VHlwZSwgd2hhdCBjb21wb25lbnQgaXMgY2hvc2VuIGlzIG5vdCBrbm93biBiZWZvcmVoYW5kLgorICogQ2FsbGVyIHNoYWxsIGNhbGwgQU1lZGlhQ29kZWNfcmVsZWFzZU5hbWUgdG8gZnJlZSB0aGUgcmV0dXJuZWQgcG9pbnRlci4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfZ2V0TmFtZShBTWVkaWFDb2RlYyosIGNoYXIqKiBvdXRfbmFtZSk7CisKKy8qKgorICogRnJlZSB0aGUgbWVtb3J5IHBvaW50ZWQgYnkgbmFtZSB3aGljaCBpcyByZXR1cm5lZCBieSBBTWVkaWFDb2RlY19nZXROYW1lLgorICovCit2b2lkIEFNZWRpYUNvZGVjX3JlbGVhc2VOYW1lKEFNZWRpYUNvZGVjKiwgY2hhciogbmFtZSk7CisKKy8qKgorICogU2V0IGFuIGFzeW5jaHJvbm91cyBjYWxsYmFjayBmb3IgYWN0aW9uYWJsZSBBTWVkaWFDb2RlYyBldmVudHMuCisgKiBXaGVuIGFzeW5jaHJvbm91cyBjYWxsYmFjayBpcyBlbmFibGVkLCB0aGUgY2xpZW50IHNob3VsZCBub3QgY2FsbAorICogQU1lZGlhQ29kZWNfZ2V0SW5wdXRCdWZmZXJzKCksIEFNZWRpYUNvZGVjX2dldE91dHB1dEJ1ZmZlcnMoKSwKKyAqIEFNZWRpYUNvZGVjX2RlcXVldWVJbnB1dEJ1ZmZlcigpIG9yIEFNZWRpYUNvZGVjX2RlcXVldWVPdXRwdXRCdWZmZXIoKS4KKyAqCisgKiBBbHNvLCBBTWVkaWFDb2RlY19mbHVzaCgpIGJlaGF2ZXMgZGlmZmVyZW50bHkgaW4gYXN5bmNocm9ub3VzIG1vZGUuCisgKiBBZnRlciBjYWxsaW5nIEFNZWRpYUNvZGVjX2ZsdXNoKCksIHlvdSBtdXN0IGNhbGwgQU1lZGlhQ29kZWNfc3RhcnQoKSB0bworICogInJlc3VtZSIgcmVjZWl2aW5nIGlucHV0IGJ1ZmZlcnMsIGV2ZW4gaWYgYW4gaW5wdXQgc3VyZmFjZSB3YXMgY3JlYXRlZC4KKyAqCisgKiBSZWZlciB0byB0aGUgZGVmaW5pdGlvbiBvZiBBTWVkaWFDb2RlY09uQXN5bmNOb3RpZnlDYWxsYmFjayBvbiBob3cgZWFjaAorICogY2FsbGJhY2sgZnVuY3Rpb24gaXMgY2FsbGVkIGFuZCB3aGF0IGFyZSBzcGVjaWZpZWQuCisgKiBUaGUgc3BlY2lmaWVkIHVzZXJkYXRhIGlzIHRoZSBwb2ludGVyIHVzZWQgd2hlbiB0aG9zZSBjYWxsYmFjayBmdW5jdGlvbnMgYXJlCisgKiBjYWxsZWQuCisgKgorICogQWxsIGNhbGxiYWNrcyBhcmUgZmlyZWQgb24gb25lIE5ESyBpbnRlcm5hbCB0aHJlYWQuCisgKiBBTWVkaWFDb2RlY19zZXRBc3luY05vdGlmeUNhbGxiYWNrIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIHRoZSBjYWxsYmFjayB0aHJlYWQuCisgKiBObyBoZWF2eSBkdXR5IHRhc2sgc2hvdWxkIGJlIHBlcmZvcm1lZCBvbiBjYWxsYmFjayB0aHJlYWQuCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX3NldEFzeW5jTm90aWZ5Q2FsbGJhY2soCisgICAgICAgIEFNZWRpYUNvZGVjKiwKKyAgICAgICAgQU1lZGlhQ29kZWNPbkFzeW5jTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCisgICAgICAgIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqCisgKiBSZWxlYXNlIHRoZSBjcnlwdG8gaWYgYXBwbGljYWJsZS4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfcmVsZWFzZUNyeXB0byhBTWVkaWFDb2RlYyopOworCisvKioKKyAqIENhbGwgdGhpcyBhZnRlciBBTWVkaWFDb2RlY19jb25maWd1cmUoKSByZXR1cm5zIHN1Y2Nlc3NmdWxseSB0byBnZXQgdGhlIGlucHV0CisgKiBmb3JtYXQgYWNjZXB0ZWQgYnkgdGhlIGNvZGVjLiBEbyB0aGlzIHRvIGRldGVybWluZSB3aGF0IG9wdGlvbmFsIGNvbmZpZ3VyYXRpb24KKyAqIHBhcmFtZXRlcnMgd2VyZSBzdXBwb3J0ZWQgYnkgdGhlIGNvZGVjLgorICovCitBTWVkaWFGb3JtYXQqIEFNZWRpYUNvZGVjX2dldElucHV0Rm9ybWF0KEFNZWRpYUNvZGVjKik7CisKKy8qKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBjb2RlYyBjYW5ub3QgcHJvY2VlZCBmdXJ0aGVyLCBidXQgY2FuIGJlIHJlY292ZXJlZCBieSBzdG9wcGluZywKKyAqIGNvbmZpZ3VyaW5nLCBhbmQgc3RhcnRpbmcgYWdhaW4uCisgKi8KK2Jvb2wgQU1lZGlhQ29kZWNBY3Rpb25Db2RlX2lzUmVjb3ZlcmFibGUoaW50MzJfdCBhY3Rpb25Db2RlKTsKKworLyoqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNvZGVjIGVycm9yIGlzIGEgdHJhbnNpZW50IGlzc3VlLCBwZXJoYXBzIGR1ZSB0bworICogcmVzb3VyY2UgY29uc3RyYWludHMsIGFuZCB0aGF0IHRoZSBtZXRob2QgKG9yIGVuY29kaW5nL2RlY29kaW5nKSBtYXkgYmUKKyAqIHJldHJpZWQgYXQgYSBsYXRlciB0aW1lLgorICovCitib29sIEFNZWRpYUNvZGVjQWN0aW9uQ29kZV9pc1RyYW5zaWVudChpbnQzMl90IGFjdGlvbkNvZGUpOworCisjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI4ICovCiAKIHR5cGVkZWYgZW51bSB7CiAgICAgQU1FRElBQ09ERUNSWVBUT0lORk9fTU9ERV9DTEVBUiA9IDAsCkBAIC0zNjAsOCArNDg2LDYgQEAKIAogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyMSAqLwogCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0gLy8gZXh0ZXJuICJDIgotI2VuZGlmCitfX0VORF9ERUNMUwogCiAjZW5kaWYgLy9fTkRLX01FRElBX0NPREVDX0gKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhQ3J5cHRvLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUNyeXB0by5oCmluZGV4IDkyMzY3NjUuLmQzMWRiZGMgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhQ3J5cHRvLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFDcnlwdG8uaApAQCAtMzIsMTcgKzMyLDE1IEBACiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3RkYm9vbC5oPgogCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpZiBfX0FORFJPSURfQVBJX18gPj0gMjEKK19fQkVHSU5fREVDTFMKIAogc3RydWN0IEFNZWRpYUNyeXB0bzsKIHR5cGVkZWYgc3RydWN0IEFNZWRpYUNyeXB0byBBTWVkaWFDcnlwdG87CiAKIHR5cGVkZWYgdWludDhfdCBBTWVkaWFVVUlEWzE2XTsKIAorI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyMQorCiBib29sIEFNZWRpYUNyeXB0b19pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCBBTWVkaWFVVUlEIHV1aWQpOwogCiBib29sIEFNZWRpYUNyeXB0b19yZXF1aXJlc1NlY3VyZURlY29kZXJDb21wb25lbnQoY29uc3QgY2hhciAqbWltZSk7CkBAIC01Myw4ICs1MSw2IEBACiAKICNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjEgKi8KIAotI2lmZGVmIF9fY3BsdXNwbHVzCi19IC8vIGV4dGVybiAiQyIKLSNlbmRpZgorX19FTkRfREVDTFMKIAogI2VuZGlmIC8vIF9OREtfTUVESUFfQ1JZUFRPX0gKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRGF0YVNvdXJjZS5oIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFEYXRhU291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUyZTM1MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRGF0YVNvdXJjZS5oCkBAIC0wLDAgKzEsMTQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisvKgorICogVGhpcyBmaWxlIGRlZmluZXMgYW4gTkRLIEFQSS4KKyAqIERvIG5vdCByZW1vdmUgbWV0aG9kcy4KKyAqIERvIG5vdCBjaGFuZ2UgbWV0aG9kIHNpZ25hdHVyZXMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSB2YWx1ZSBvZiBjb25zdGFudHMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSBzaXplIG9mIGFueSBvZiB0aGUgY2xhc3NlcyBkZWZpbmVkIGluIGhlcmUuCisgKiBEbyBub3QgcmVmZXJlbmNlIHR5cGVzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBOREsuCisgKiBEbyBub3QgI2luY2x1ZGUgZmlsZXMgdGhhdCBhcmVuJ3QgcGFydCBvZiB0aGUgTkRLLgorICovCisKKyNpZm5kZWYgX05ES19NRURJQV9EQVRBU09VUkNFX0gKKyNkZWZpbmUgX05ES19NRURJQV9EQVRBU09VUkNFX0gKKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvci5oPgorCitfX0JFR0lOX0RFQ0xTCisKK3N0cnVjdCBBTWVkaWFEYXRhU291cmNlOwordHlwZWRlZiBzdHJ1Y3QgQU1lZGlhRGF0YVNvdXJjZSBBTWVkaWFEYXRhU291cmNlOworCisjaWYgX19BTkRST0lEX0FQSV9fID49IDI4CisKKy8qCisgKiBBTWVkaWFEYXRhU291cmNlJ3MgY2FsbGJhY2tzIHdpbGwgYmUgaW52b2tlZCBvbiBhbiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHRocmVhZAorICogb3IgdGhyZWFkIHBvb2wuIE5vIGd1YXJhbnRlZXMgYXJlIHByb3ZpZGVkIGFib3V0IHdoaWNoIHRocmVhZChzKSB3aWxsIGJlIHVzZWQgZm9yCisgKiBjYWxsYmFja3MuIEhvd2V2ZXIsIGl0IGlzIGd1YXJhbnRlZWQgdGhhdCBBTWVkaWFEYXRhU291cmNlJ3MgY2FsbGJhY2tzIHdpbGwgb25seQorICogZXZlciBiZSBpbnZva2VkIGJ5IGEgc2luZ2xlIHRocmVhZCBhdCBhIHRpbWUuCisgKgorICogVGhlcmUgd2lsbCBiZSBhIHRocmVhZCBzeW5jaHJvbml6YXRpb24gcG9pbnQgYmV0d2VlbiBlYWNoIGNhbGwgdG8gZW5zdXJlIHRoYXQKKyAqIG1vZGlmaWNhdGlvbnMgdG8gdGhlIHN0YXRlIG9mIHlvdXIgQU1lZGlhRGF0YVNvdXJjZSBhcmUgdmlzaWJsZSB0byBmdXR1cmUKKyAqIGNhbGxzLiBUaGlzIG1lYW5zIHlvdSBkb24ndCBuZWVkIHRvIGRvIHlvdXIgb3duIHN5bmNocm9uaXphdGlvbiB1bmxlc3MgeW91J3JlCisgKiBtb2RpZnlpbmcgdGhlIEFNZWRpYURhdGFTb3VyY2UgZnJvbSBhbm90aGVyIHRocmVhZCB3aGlsZSBpdCdzIGJlaW5nIHVzZWQgYnkgdGhlCisgKiBmcmFtZXdvcmsuCisgKi8KKworLyoqCisgKiBDYWxsZWQgdG8gcmVxdWVzdCBkYXRhIGZyb20gdGhlIGdpdmVuIHxvZmZzZXR8LgorICoKKyAqIEltcGxlbWVudGF0aW9ucyBzaG91bGQgc2hvdWxkIHdyaXRlIHVwIHRvIHxzaXplfCBieXRlcyBpbnRvCisgKiB8YnVmZmVyfCwgYW5kIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uCisgKgorICogUmV0dXJuIDAgaWYgc2l6ZSBpcyB6ZXJvICh0aHVzIG5vIGJ5dGVzIGFyZSByZWFkKS4KKyAqCisgKiBSZXR1cm4gLTEgdG8gaW5kaWNhdGUgdGhhdCBlbmQgb2Ygc3RyZWFtIGlzIHJlYWNoZWQuCisgKi8KK3R5cGVkZWYgc3NpemVfdCAoKkFNZWRpYURhdGFTb3VyY2VSZWFkQXQpKAorICAgICAgICB2b2lkICp1c2VyZGF0YSwgb2ZmNjRfdCBvZmZzZXQsIHZvaWQgKiBidWZmZXIsIHNpemVfdCBzaXplKTsKKworLyoqCisgKiBDYWxsZWQgdG8gZ2V0IHRoZSBzaXplIG9mIHRoZSBkYXRhIHNvdXJjZS4KKyAqCisgKiBSZXR1cm4gdGhlIHNpemUgb2YgZGF0YSBzb3VyY2UgaW4gYnl0ZXMsIG9yIC0xIGlmIHRoZSBzaXplIGlzIHVua25vd24uCisgKi8KK3R5cGVkZWYgc3NpemVfdCAoKkFNZWRpYURhdGFTb3VyY2VHZXRTaXplKSh2b2lkICp1c2VyZGF0YSk7CisKKy8qKgorICogQ2FsbGVkIHRvIGNsb3NlIHRoZSBkYXRhIHNvdXJjZSBhbmQgcmVsZWFzZSBhc3NvY2lhdGVkIHJlc291cmNlcy4KKyAqIFRoZSBOREsgbWVkaWEgZnJhbWV3b3JrIGd1YXJhbnRlZXMgdGhhdCBhZnRlciB8Y2xvc2V8IGlzIGNhbGxlZAorICogbm8gZnV0dXJlIGNhbGxiYWNrcyB3aWxsIGJlIGludm9rZWQgb24gdGhlIGRhdGEgc291cmNlLgorICovCit0eXBlZGVmIHZvaWQgKCpBTWVkaWFEYXRhU291cmNlQ2xvc2UpKHZvaWQgKnVzZXJkYXRhKTsKKworLyoqCisgKiBDcmVhdGUgbmV3IG1lZGlhIGRhdGEgc291cmNlLiBSZXR1cm5zIE5VTEwgaWYgbWVtb3J5IGFsbG9jYXRpb24KKyAqIGZvciB0aGUgbmV3IGRhdGEgc291cmNlIG9iamVjdCBmYWlscy4KKyAqLworQU1lZGlhRGF0YVNvdXJjZSogQU1lZGlhRGF0YVNvdXJjZV9uZXcoKTsKKworLyoqCisgKiBEZWxldGUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgbWVkaWEgZGF0YSBzb3VyY2UuCisgKi8KK3ZvaWQgQU1lZGlhRGF0YVNvdXJjZV9kZWxldGUoQU1lZGlhRGF0YVNvdXJjZSopOworCisvKioKKyAqIFNldCBhbiB1c2VyIHByb3ZpZGVkIG9wYXF1ZSBoYW5kbGUuIFRoaXMgb3BhcXVlIGhhbmRsZSBpcyBwYXNzZWQgYXMKKyAqIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUgZGF0YSBzb3VyY2UgY2FsbGJhY2tzLgorICovCit2b2lkIEFNZWRpYURhdGFTb3VyY2Vfc2V0VXNlcmRhdGEoCisgICAgICAgIEFNZWRpYURhdGFTb3VyY2UqLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKgorICogU2V0IGEgY3VzdG9tIGNhbGxiYWNrIGZvciBzdXBwbHlpbmcgcmFuZG9tIGFjY2VzcyBtZWRpYSBkYXRhIHRvIHRoZQorICogTkRLIG1lZGlhIGZyYW1ld29yay4KKyAqCisgKiBJbXBsZW1lbnQgdGhpcyBpZiB5b3VyIGFwcCBoYXMgc3BlY2lhbCByZXF1aXJlbWVudHMgZm9yIHRoZSB3YXkgbWVkaWEKKyAqIGRhdGEgaXMgb2J0YWluZWQsIG9yIGlmIHlvdSBuZWVkIGEgY2FsbGJhY2sgd2hlbiBkYXRhIGlzIHJlYWQgYnkgdGhlCisgKiBOREsgbWVkaWEgZnJhbWV3b3JrLgorICoKKyAqIFBsZWFzZSByZWZlciB0byB0aGUgZGVmaW5pdGlvbiBvZiBBTWVkaWFEYXRhU291cmNlUmVhZEF0IGZvcgorICogYWRkaXRpb25hbCBkZXRhaWxzLgorICovCit2b2lkIEFNZWRpYURhdGFTb3VyY2Vfc2V0UmVhZEF0KAorICAgICAgICBBTWVkaWFEYXRhU291cmNlKiwKKyAgICAgICAgQU1lZGlhRGF0YVNvdXJjZVJlYWRBdCk7CisKKy8qKgorICogU2V0IGEgY3VzdG9tIGNhbGxiYWNrIGZvciBzdXBwbHlpbmcgdGhlIHNpemUgb2YgdGhlIGRhdGEgc291cmNlIHRvIHRoZQorICogTkRLIG1lZGlhIGZyYW1ld29yay4KKyAqCisgKiBQbGVhc2UgcmVmZXIgdG8gdGhlIGRlZmluaXRpb24gb2YgQU1lZGlhRGF0YVNvdXJjZUdldFNpemUgZm9yCisgKiBhZGRpdGlvbmFsIGRldGFpbHMuCisgKi8KK3ZvaWQgQU1lZGlhRGF0YVNvdXJjZV9zZXRHZXRTaXplKAorICAgICAgICBBTWVkaWFEYXRhU291cmNlKiwKKyAgICAgICAgQU1lZGlhRGF0YVNvdXJjZUdldFNpemUpOworCisvKioKKyAqIFNldCBhIGN1c3RvbSBjYWxsYmFjayB0byByZWNlaXZlIHNpZ25hbCBmcm9tIHRoZSBOREsgbWVkaWEgZnJhbWV3b3JrCisgKiB3aGVuIHRoZSBkYXRhIHNvdXJjZSBpcyBjbG9zZWQuCisgKgorICogUGxlYXNlIHJlZmVyIHRvIHRoZSBkZWZpbml0aW9uIG9mIEFNZWRpYURhdGFTb3VyY2VDbG9zZSBmb3IKKyAqIGFkZGl0aW9uYWwgZGV0YWlscy4KKyAqLwordm9pZCBBTWVkaWFEYXRhU291cmNlX3NldENsb3NlKAorICAgICAgICBBTWVkaWFEYXRhU291cmNlKiwKKyAgICAgICAgQU1lZGlhRGF0YVNvdXJjZUNsb3NlKTsKKworI2VuZGlmICAvKl9fQU5EUk9JRF9BUElfXyA+PSAyOCAqLworCitfX0VORF9ERUNMUworCisjZW5kaWYgLy8gX05ES19NRURJQV9EQVRBU09VUkNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRHJtLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYURybS5oCmluZGV4IGNiYTQzODAuLjllOWY0YzMgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRHJtLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFEcm0uaApAQCAtMzMsMTEgKzMzLDcgQEAKIAogI2luY2x1ZGUgIk5ka01lZGlhRXJyb3IuaCIKIAotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaWYgX19BTkRST0lEX0FQSV9fID49IDIxCitfX0JFR0lOX0RFQ0xTCiAKIHN0cnVjdCBBTWVkaWFEcm07CiB0eXBlZGVmIHN0cnVjdCBBTWVkaWFEcm0gQU1lZGlhRHJtOwpAQCAtNTIsNyArNDgsNiBAQAogdHlwZWRlZiBBTWVkaWFEcm1CeXRlQXJyYXkgQU1lZGlhRHJtS2V5U2V0SWQ7CiB0eXBlZGVmIEFNZWRpYURybUJ5dGVBcnJheSBBTWVkaWFEcm1TZWN1cmVTdG9wOwogCi0KIHR5cGVkZWYgZW51bSBBTWVkaWFEcm1FdmVudFR5cGUgewogICAgIC8qKgogICAgICAqIFRoaXMgZXZlbnQgdHlwZSBpbmRpY2F0ZXMgdGhhdCB0aGUgYXBwIG5lZWRzIHRvIHJlcXVlc3QgYSBjZXJ0aWZpY2F0ZSBmcm9tCkBAIC04Myw2ICs3OCw3IEBACiB0eXBlZGVmIHZvaWQgKCpBTWVkaWFEcm1FdmVudExpc3RlbmVyKShBTWVkaWFEcm0gKiwgY29uc3QgQU1lZGlhRHJtU2Vzc2lvbklkICpzZXNzaW9uSWQsCiAgICAgICAgIEFNZWRpYURybUV2ZW50VHlwZSBldmVudFR5cGUsIGludCBleHRyYSwgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGRhdGFTaXplKTsKIAorI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyMQogCiAvKioKICAqIFF1ZXJ5IGlmIHRoZSBnaXZlbiBzY2hlbWUgaWRlbnRpZmllZCBieSBpdHMgVVVJRCBpcyBzdXBwb3J0ZWQgb24gdGhpcyBkZXZpY2UsIGFuZApAQCAtNDUyLDggKzQ0OCw2IEBACiAKICNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjEgKi8KIAotI2lmZGVmIF9fY3BsdXNwbHVzCi19IC8vIGV4dGVybiAiQyIKLSNlbmRpZgorX19FTkRfREVDTFMKIAogI2VuZGlmIC8vX05ES19NRURJQV9EUk1fSApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFcnJvci5oIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFcnJvci5oCmluZGV4IDFiNTEzNjQuLjEzYWFjYzkgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRXJyb3IuaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUVycm9yLmgKQEAgLTMwLDE1ICszMCwyMiBAQAogCiAjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CiAKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyMQorX19CRUdJTl9ERUNMUwogCiB0eXBlZGVmIGVudW0gewogICAgIEFNRURJQV9PSyA9IDAsCiAKKyAgICAvKioKKyAgICAgKiBUaGlzIGluZGljYXRlcyByZXF1aXJlZCByZXNvdXJjZSB3YXMgbm90IGFibGUgdG8gYmUgYWxsb2NhdGVkLgorICAgICAqLworICAgIEFNRURJQUNPREVDX0VSUk9SX0lOU1VGRklDSUVOVF9SRVNPVVJDRSA9IDExMDAsCisKKyAgICAvKioKKyAgICAgKiBUaGlzIGluZGljYXRlcyB0aGUgcmVzb3VyY2UgbWFuYWdlciByZWNsYWltZWQgdGhlIG1lZGlhIHJlc291cmNlIHVzZWQgYnkgdGhlIGNvZGVjLgorICAgICAqIFdpdGggdGhpcyBlcnJvciwgdGhlIGNvZGVjIG11c3QgYmUgcmVsZWFzZWQsIGFzIGl0IGhhcyBtb3ZlZCB0byB0ZXJtaW5hbCBzdGF0ZS4KKyAgICAgKi8KKyAgICBBTUVESUFDT0RFQ19FUlJPUl9SRUNMQUlNRUQgICAgICAgICAgICAgPSAxMTAxLAorCiAgICAgQU1FRElBX0VSUk9SX0JBU0UgICAgICAgICAgICAgICAgICA9IC0xMDAwMCwKICAgICBBTUVESUFfRVJST1JfVU5LTk9XTiAgICAgICAgICAgICAgID0gQU1FRElBX0VSUk9SX0JBU0UsCiAgICAgQU1FRElBX0VSUk9SX01BTEZPUk1FRCAgICAgICAgICAgICA9IEFNRURJQV9FUlJPUl9CQVNFIC0gMSwKQEAgLTQ2LDYgKzUzLDggQEAKICAgICBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1QgICAgICAgID0gQU1FRElBX0VSUk9SX0JBU0UgLSAzLAogICAgIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUiAgICAgPSBBTUVESUFfRVJST1JfQkFTRSAtIDQsCiAgICAgQU1FRElBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OICAgICA9IEFNRURJQV9FUlJPUl9CQVNFIC0gNSwKKyAgICBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTSAgICAgICAgID0gQU1FRElBX0VSUk9SX0JBU0UgLSA2LAorICAgIEFNRURJQV9FUlJPUl9JTyAgICAgICAgICAgICAgICAgICAgPSBBTUVESUFfRVJST1JfQkFTRSAtIDcsCiAKICAgICBBTUVESUFfRFJNX0VSUk9SX0JBU0UgICAgICAgICAgICAgID0gLTIwMDAwLAogICAgIEFNRURJQV9EUk1fTk9UX1BST1ZJU0lPTkVEICAgICAgICAgPSBBTUVESUFfRFJNX0VSUk9SX0JBU0UgLSAxLApAQCAtNjcsMTAgKzc2LDYgQEAKIAogfSBtZWRpYV9zdGF0dXNfdDsKIAotI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyMSAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0gLy8gZXh0ZXJuICJDIgotI2VuZGlmCitfX0VORF9ERUNMUwogCiAjZW5kaWYgLy8gX05ES19NRURJQV9FUlJPUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUV4dHJhY3Rvci5oIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFeHRyYWN0b3IuaAppbmRleCBjMzE4MGRjLi5mN2I5Y2ZkIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUV4dHJhY3Rvci5oCisrKyBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRXh0cmFjdG9yLmgKQEAgLTMyLDE4ICszMiwxNiBAQAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCiAjaW5jbHVkZSAiTmRrTWVkaWFDb2RlYy5oIgorI2luY2x1ZGUgIk5ka01lZGlhRGF0YVNvdXJjZS5oIgogI2luY2x1ZGUgIk5ka01lZGlhRm9ybWF0LmgiCiAjaW5jbHVkZSAiTmRrTWVkaWFDcnlwdG8uaCIKIAotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaWYgX19BTkRST0lEX0FQSV9fID49IDIxCitfX0JFR0lOX0RFQ0xTCiAKIHN0cnVjdCBBTWVkaWFFeHRyYWN0b3I7CiB0eXBlZGVmIHN0cnVjdCBBTWVkaWFFeHRyYWN0b3IgQU1lZGlhRXh0cmFjdG9yOwogCisjaWYgX19BTkRST0lEX0FQSV9fID49IDIxCiAKIC8qKgogICogQ3JlYXRlIG5ldyBtZWRpYSBleHRyYWN0b3IKQEAgLTY3LDYgKzY1LDE1IEBACiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZShBTWVkaWFFeHRyYWN0b3IqLCBjb25zdCBjaGFyICpsb2NhdGlvbik7CiAgICAgICAgIC8vIFRPRE8gc3VwcG9ydCBoZWFkZXJzCiAKKyNpZiBfX0FORFJPSURfQVBJX18gPj0gMjgKKworLyoqCisgKiBTZXQgdGhlIGN1c3RvbSBkYXRhIHNvdXJjZSBpbXBsZW1lbnRhdGlvbiBmcm9tIHdoaWNoIHRoZSBleHRyYWN0b3Igd2lsbCByZWFkLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZUN1c3RvbShBTWVkaWFFeHRyYWN0b3IqLCBBTWVkaWFEYXRhU291cmNlICpzcmMpOworCisjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI4ICovCisKIC8qKgogICogUmV0dXJuIHRoZSBudW1iZXIgb2YgdHJhY2tzIGluIHRoZSBwcmV2aW91c2x5IHNwZWNpZmllZCBtZWRpYSBmaWxlCiAgKi8KQEAgLTE1NSwxNiArMTYyLDYyIEBACiAKIEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyAqQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZUNyeXB0b0luZm8oQU1lZGlhRXh0cmFjdG9yICopOwogCi0KIGVudW0gewogICAgIEFNRURJQUVYVFJBQ1RPUl9TQU1QTEVfRkxBR19TWU5DID0gMSwKICAgICBBTUVESUFFWFRSQUNUT1JfU0FNUExFX0ZMQUdfRU5DUllQVEVEID0gMiwKIH07CiAKKyNpZiBfX0FORFJPSURfQVBJX18gPj0gMjgKKworLyoqCisgKiBSZXR1cm5zIHRoZSBmb3JtYXQgb2YgdGhlIGV4dHJhY3Rvci4gVGhlIGNhbGxlciBtdXN0IGZyZWUgdGhlIHJldHVybmVkIGZvcm1hdAorICogdXNpbmcgQU1lZGlhRm9ybWF0X2RlbGV0ZShmb3JtYXQpLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBhbHdheXMgcmV0dXJuIGEgZm9ybWF0OyBob3dldmVyLCB0aGUgZm9ybWF0IGNvdWxkIGJlIGVtcHR5CisgKiAobm8ga2V5LXZhbHVlIHBhaXJzKSBpZiB0aGUgbWVkaWEgY29udGFpbmVyIGRvZXMgbm90IHByb3ZpZGUgZm9ybWF0IGluZm9ybWF0aW9uLgorICovCitBTWVkaWFGb3JtYXQqIEFNZWRpYUV4dHJhY3Rvcl9nZXRGaWxlRm9ybWF0KEFNZWRpYUV4dHJhY3RvciopOworCisvKioKKyAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIGN1cnJlbnQgc2FtcGxlIGluIGJ5dGVzLCBvciAtMSB3aGVuIG5vIHNhbXBsZXMgYXJlCisgKiBhdmFpbGFibGUgKGVuZCBvZiBzdHJlYW0pLiBUaGlzIEFQSSBjYW4gYmUgdXNlZCBpbiBpbiBjb25qdW5jdGlvbiB3aXRoCisgKiBBTWVkaWFFeHRyYWN0b3JfcmVhZFNhbXBsZURhdGE6CisgKgorICogc3NpemVfdCBzYW1wbGVTaXplID0gQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVNpemUoZXgpOworICogdWludDhfdCAqYnVmID0gbmV3IHVpbnQ4X3Rbc2FtcGxlU2l6ZV07CisgKiBBTWVkaWFFeHRyYWN0b3JfcmVhZFNhbXBsZURhdGEoZXgsIGJ1Ziwgc2FtcGxlU2l6ZSk7CisgKgorICovCitzc2l6ZV90IEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVTaXplKEFNZWRpYUV4dHJhY3RvciopOworCisvKioKKyAqIFJldHVybnMgdGhlIGR1cmF0aW9uIG9mIGNhY2hlZCBtZWRpYSBzYW1wbGVzIGRvd25sb2FkZWQgZnJvbSBhIG5ldHdvcmsgZGF0YSBzb3VyY2UKKyAqIChBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZSB3aXRoIGEgImh0dHAocykiIFVSSSkgaW4gbWljcm9zZWNvbmRzLgorICoKKyAqIFRoaXMgaW5mb3JtYXRpb24gaXMgY2FsY3VsYXRlZCB1c2luZyB0b3RhbCBiaXRyYXRlOyBpZiB0b3RhbCBiaXRyYXRlIGlzIG5vdCBpbiB0aGUKKyAqIG1lZGlhIGNvbnRhaW5lciBpdCBpcyBjYWxjdWxhdGVkIHVzaW5nIHRvdGFsIGR1cmF0aW9uIGFuZCBmaWxlIHNpemUuCisgKgorICogUmV0dXJucyAtMSB3aGVuIHRoZSBleHRyYWN0b3IgaXMgbm90IHJlYWRpbmcgZnJvbSBhIG5ldHdvcmsgZGF0YSBzb3VyY2UsIG9yIHdoZW4gdGhlCisgKiBjYWNoZWQgZHVyYXRpb24gY2Fubm90IGJlIGNhbGN1bGF0ZWQgKGJpdHJhdGUsIGR1cmF0aW9uLCBhbmQgZmlsZSBzaXplIGluZm9ybWF0aW9uCisgKiBub3QgYXZhaWxhYmxlKS4KKyAqLworaW50NjRfdCBBTWVkaWFFeHRyYWN0b3JfZ2V0Q2FjaGVkRHVyYXRpb24oQU1lZGlhRXh0cmFjdG9yICopOworCisvKioKKyAqIFJlYWQgdGhlIGN1cnJlbnQgc2FtcGxlJ3MgbWV0YWRhdGEgZm9ybWF0IGludG8gfGZtdHwuIEV4YW1wbGVzIG9mIHNhbXBsZSBtZXRhZGF0YSBhcmUKKyAqIFNFSSAoc3VwcGxlbWVudGFsIGVuaGFuY2VtZW50IGluZm9ybWF0aW9uKSBhbmQgTVBFRyB1c2VyIGRhdGEsIGJvdGggb2Ygd2hpY2ggY2FuIGVtYmVkCisgKiBjbG9zZWQtY2FwdGlvbiBkYXRhLgorICoKKyAqIFJldHVybnMgQU1FRElBX09LIG9uIHN1Y2Nlc3Mgb3IgQU1FRElBX0VSUk9SXyogdG8gaW5kaWNhdGUgZmFpbHVyZSByZWFzb24uCisgKiBFeGlzdGluZyBrZXktdmFsdWUgcGFpcnMgaW4gfGZtdHwgd291bGQgYmUgcmVtb3ZlZCBpZiB0aGlzIEFQSSByZXR1cm5zIEFNRURJQV9PSy4KKyAqIFRoZSBjb250ZW50cyBvZiB8Zm10fCBpcyB1bmRlZmluZWQgaWYgdGhpcyBBUEkgcmV0dXJucyBBTUVESUFfRVJST1JfKi4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZUZvcm1hdChBTWVkaWFFeHRyYWN0b3IgKmV4LCBBTWVkaWFGb3JtYXQgKmZtdCk7CisKKyNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjggKi8KKwogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyMSAqLwogCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0gLy8gZXh0ZXJuICJDIgotI2VuZGlmCitfX0VORF9ERUNMUwogCiAjZW5kaWYgLy8gX05ES19NRURJQV9FWFRSQUNUT1JfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFGb3JtYXQuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRm9ybWF0LmgKaW5kZXggYTJhMjFkMi4uNjg3MDU0ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFGb3JtYXQuaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUZvcm1hdC5oCkBAIC0zMiwxNSArMzIsMTMgQEAKIAogI2luY2x1ZGUgIk5ka01lZGlhRXJyb3IuaCIKIAotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaWYgX19BTkRST0lEX0FQSV9fID49IDIxCitfX0JFR0lOX0RFQ0xTCiAKIHN0cnVjdCBBTWVkaWFGb3JtYXQ7CiB0eXBlZGVmIHN0cnVjdCBBTWVkaWFGb3JtYXQgQU1lZGlhRm9ybWF0OwogCisjaWYgX19BTkRST0lEX0FQSV9fID49IDIxCisKIEFNZWRpYUZvcm1hdCAqQU1lZGlhRm9ybWF0X25ldygpOwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhRm9ybWF0X2RlbGV0ZShBTWVkaWFGb3JtYXQqKTsKIApAQCAtNTMsNiArNTEsNyBAQAogYm9vbCBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciAqbmFtZSwgaW50MzJfdCAqb3V0KTsKIGJvb2wgQU1lZGlhRm9ybWF0X2dldEludDY0KEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIgKm5hbWUsIGludDY0X3QgKm91dCk7CiBib29sIEFNZWRpYUZvcm1hdF9nZXRGbG9hdChBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyICpuYW1lLCBmbG9hdCAqb3V0KTsKK2Jvb2wgQU1lZGlhRm9ybWF0X2dldFNpemUoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90ICpvdXQpOwogLyoqCiAgKiBUaGUgcmV0dXJuZWQgZGF0YSBpcyBvd25lZCBieSB0aGUgZm9ybWF0IGFuZCByZW1haW5zIHZhbGlkIGFzIGxvbmcgYXMgdGhlIG5hbWVkIGVudHJ5CiAgKiBpcyBwYXJ0IG9mIHRoZSBmb3JtYXQuCkBAIC04MiwzNSArODEsODYgQEAKIC8qKgogICogWFhYIHNob3VsZCB0aGVzZSBiZSBpbnRzL2VudW1zIHRoYXQgd2UgbG9vayB1cCBpbiBhIHRhYmxlIGFzIG5lZWRlZD8KICAqLworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUFDX0RSQ19BVFRFTlVBVElPTl9GQUNUT1I7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BQUNfRFJDX0JPT1NUX0ZBQ1RPUjsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FBQ19EUkNfSEVBVllfQ09NUFJFU1NJT047CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BQUNfRFJDX1RBUkdFVF9SRUZFUkVOQ0VfTEVWRUw7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BQUNfRU5DT0RFRF9UQVJHRVRfTEVWRUw7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BQUNfTUFYX09VVFBVVF9DSEFOTkVMX0NPVU5UOwogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUFDX1BST0ZJTEU7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BQUNfU0JSX01PREU7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BVURJT19TRVNTSU9OX0lEOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQklUUkFURV9NT0RFOwogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEU7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DQVBUVVJFX1JBVEU7CiBleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5UOwogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9NQVNLOwogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfRk9STUFUOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfUkFOR0U7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DT0xPUl9TVEFOREFSRDsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1RSQU5TRkVSOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09NUExFWElUWTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NTRDsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NTRF8wOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzE7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DU0RfMjsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfQ1JPUDsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfSEVJR0hUOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9XSURUSDsKIGV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OOwogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRkxBQ19DT01QUkVTU0lPTl9MRVZFTDsKIGV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0ZSQU1FX1JBVEU7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9HUklEX0NPTFVNTlM7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9HUklEX1JPV1M7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9IRFJfU1RBVElDX0lORk87CiBleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9IRUlHSFQ7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JTlRSQV9SRUZSRVNIX1BFUklPRDsKIGV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lTX0FEVFM7CiBleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JU19BVVRPU0VMRUNUOwogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSVNfREVGQVVMVDsKIGV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lTX0ZPUkNFRF9TVUJUSVRMRTsKIGV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lfRlJBTUVfSU5URVJWQUw7CiBleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MQU5HVUFHRTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xBVEVOQ1k7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MRVZFTDsKIGV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BWF9IRUlHSFQ7CiBleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRTsKIGV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BWF9XSURUSDsKIGV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01JTUU7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NUEVHX1VTRVJfREFUQTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX09QRVJBVElOR19SQVRFOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUENNX0VOQ09ESU5HOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUFJJT1JJVFk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QUk9GSUxFOwogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUFVTSF9CTEFOS19CVUZGRVJTX09OX1NUT1A7CiBleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9SRVBFQVRfUFJFVklPVVNfRlJBTUVfQUZURVI7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9ST1RBVElPTjsKIGV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfV0lEVEg7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9TRUk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9TTElDRV9IRUlHSFQ7CiBleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9TVFJJREU7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9URU1QT1JBTF9MQVlFUl9JRDsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSSU5HOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVElMRV9IRUlHSFQ7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USUxFX1dJRFRIOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUzsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lEOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSU5ERVg7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9XSURUSDsKIAogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyMSAqLwogCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0gLy8gZXh0ZXJuICJDIgotI2VuZGlmCisjaWYgX19BTkRST0lEX0FQSV9fID49IDI4Citib29sIEFNZWRpYUZvcm1hdF9nZXREb3VibGUoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciAqbmFtZSwgZG91YmxlICpvdXQpOworYm9vbCBBTWVkaWFGb3JtYXRfZ2V0UmVjdChBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICpsZWZ0LCBpbnQzMl90ICp0b3AsIGludDMyX3QgKnJpZ2h0LCBpbnQzMl90ICpib3R0b20pOworCit2b2lkIEFNZWRpYUZvcm1hdF9zZXREb3VibGUoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciogbmFtZSwgZG91YmxlIHZhbHVlKTsKK3ZvaWQgQU1lZGlhRm9ybWF0X3NldFNpemUoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciogbmFtZSwgc2l6ZV90IHZhbHVlKTsKK3ZvaWQgQU1lZGlhRm9ybWF0X3NldFJlY3QoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBsZWZ0LCBpbnQzMl90IHRvcCwgaW50MzJfdCByaWdodCwgaW50MzJfdCBib3R0b20pOworI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyOCAqLworCitfX0VORF9ERUNMUwogCiAjZW5kaWYgLy8gX05ES19NRURJQV9GT1JNQVRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFNdXhlci5oIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFNdXhlci5oCmluZGV4IDI1OTg3YTIuLjFlY2QxY2EgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhTXV4ZXIuaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYU11eGVyLmgKQEAgLTM1LDExICszNSw3IEBACiAjaW5jbHVkZSAiTmRrTWVkaWFFcnJvci5oIgogI2luY2x1ZGUgIk5ka01lZGlhRm9ybWF0LmgiCiAKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyMQorX19CRUdJTl9ERUNMUwogCiBzdHJ1Y3QgQU1lZGlhTXV4ZXI7CiB0eXBlZGVmIHN0cnVjdCBBTWVkaWFNdXhlciBBTWVkaWFNdXhlcjsKQEAgLTQ5LDYgKzQ1LDggQEAKICAgICBBTUVESUFNVVhFUl9PVVRQVVRfRk9STUFUX1dFQk0gICA9IDEsCiB9IE91dHB1dEZvcm1hdDsKIAorI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyMQorCiAvKioKICAqIENyZWF0ZSBuZXcgbWVkaWEgbXV4ZXIKICAqLwpAQCAtMTE3LDggKzExNSw2IEBACiAKICNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjEgKi8KIAotI2lmZGVmIF9fY3BsdXNwbHVzCi19IC8vIGV4dGVybiAiQyIKLSNlbmRpZgorX19FTkRfREVDTFMKIAogI2VuZGlmIC8vIF9OREtfTUVESUFfTVVYRVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2xpYm1lZGlhbmRrLm1hcC50eHQgYi9tZWRpYS9uZGsvbGlibWVkaWFuZGsubWFwLnR4dAppbmRleCBkN2FkMzcwLi5mYjU2Njk0IDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvbGlibWVkaWFuZGsubWFwLnR4dAorKysgYi9tZWRpYS9uZGsvbGlibWVkaWFuZGsubWFwLnR4dApAQCAtMjYsMzAgKzI2LDYzIEBACiAgICAgQUltYWdlX2dldFBsYW5lUm93U3RyaWRlOyAjIGludHJvZHVjZWQ9MjQKICAgICBBSW1hZ2VfZ2V0VGltZXN0YW1wOyAjIGludHJvZHVjZWQ9MjQKICAgICBBSW1hZ2VfZ2V0V2lkdGg7ICMgaW50cm9kdWNlZD0yNAorICAgIEFNRURJQUZPUk1BVF9LRVlfQUFDX0RSQ19BVFRFTlVBVElPTl9GQUNUT1I7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX0FBQ19EUkNfQk9PU1RfRkFDVE9SOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9BQUNfRFJDX0hFQVZZX0NPTVBSRVNTSU9OOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9BQUNfRFJDX1RBUkdFVF9SRUZFUkVOQ0VfTEVWRUw7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX0FBQ19FTkNPREVEX1RBUkdFVF9MRVZFTDsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfQUFDX01BWF9PVVRQVVRfQ0hBTk5FTF9DT1VOVDsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfQUFDX1BST0ZJTEU7ICMgdmFyCisgICAgQU1FRElBRk9STUFUX0tFWV9BQUNfU0JSX01PREU7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1NFU1NJT05fSUQ7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX0JJVFJBVEVfTU9ERTsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEU7ICMgdmFyCisgICAgQU1FRElBRk9STUFUX0tFWV9DQVBUVVJFX1JBVEU7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQ7ICMgdmFyCiAgICAgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX01BU0s7ICMgdmFyCiAgICAgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9GT1JNQVQ7ICMgdmFyCisgICAgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9SQU5HRTsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfU1RBTkRBUkQ7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1RSQU5TRkVSOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9DT01QTEVYSVRZOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX0NST1A7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OOyAjIHZhcgogICAgIEFNRURJQUZPUk1BVF9LRVlfRkxBQ19DT01QUkVTU0lPTl9MRVZFTDsgIyB2YXIKICAgICBBTUVESUFGT1JNQVRfS0VZX0ZSQU1FX1JBVEU7ICMgdmFyCisgICAgQU1FRElBRk9STUFUX0tFWV9HUklEX0NPTFVNTlM7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX0dSSURfUk9XUzsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfSERSX1NUQVRJQ19JTkZPOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQ7ICMgdmFyCisgICAgQU1FRElBRk9STUFUX0tFWV9JTlRSQV9SRUZSRVNIX1BFUklPRDsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfSVNfQURUUzsgIyB2YXIKICAgICBBTUVESUFGT1JNQVRfS0VZX0lTX0FVVE9TRUxFQ1Q7ICMgdmFyCiAgICAgQU1FRElBRk9STUFUX0tFWV9JU19ERUZBVUxUOyAjIHZhcgogICAgIEFNRURJQUZPUk1BVF9LRVlfSVNfRk9SQ0VEX1NVQlRJVExFOyAjIHZhcgogICAgIEFNRURJQUZPUk1BVF9LRVlfSV9GUkFNRV9JTlRFUlZBTDsgIyB2YXIKICAgICBBTUVESUFGT1JNQVRfS0VZX0xBTkdVQUdFOyAjIHZhcgorICAgIEFNRURJQUZPUk1BVF9LRVlfTEFURU5DWTsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfTEVWRUw7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX01BWF9IRUlHSFQ7ICMgdmFyCiAgICAgQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRTsgIyB2YXIKICAgICBBTUVESUFGT1JNQVRfS0VZX01BWF9XSURUSDsgIyB2YXIKICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUU7ICMgdmFyCisgICAgQU1FRElBRk9STUFUX0tFWV9PUEVSQVRJTkdfUkFURTsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfUENNX0VOQ09ESU5HOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9QUklPUklUWTsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfUFJPRklMRTsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfUFVTSF9CTEFOS19CVUZGRVJTX09OX1NUT1A7ICMgdmFyCiAgICAgQU1FRElBRk9STUFUX0tFWV9SRVBFQVRfUFJFVklPVVNfRlJBTUVfQUZURVI7ICMgdmFyCisgICAgQU1FRElBRk9STUFUX0tFWV9ST1RBVElPTjsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEU7ICMgdmFyCisgICAgQU1FRElBRk9STUFUX0tFWV9TTElDRV9IRUlHSFQ7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX1NUUklERTsgIyB2YXIKKyAgICBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSSU5HOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9USUxFX0hFSUdIVDsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfVElMRV9XSURUSDsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSUQ7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX1dJRFRIOyAjIHZhcgorICAgIEFNZWRpYUNvZGVjQWN0aW9uQ29kZV9pc1JlY292ZXJhYmxlOyAjIGludHJvZHVjZWQ9MjgKKyAgICBBTWVkaWFDb2RlY0FjdGlvbkNvZGVfaXNUcmFuc2llbnQ7ICMgaW50cm9kdWNlZD0yOAogICAgIEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19kZWxldGU7CiAgICAgQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2dldENsZWFyQnl0ZXM7CiAgICAgQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2dldEVuY3J5cHRlZEJ5dGVzOwpAQCAtNjgsMTIgKzEwMSwxNyBAQAogICAgIEFNZWRpYUNvZGVjX2RlcXVldWVPdXRwdXRCdWZmZXI7CiAgICAgQU1lZGlhQ29kZWNfZmx1c2g7CiAgICAgQU1lZGlhQ29kZWNfZ2V0SW5wdXRCdWZmZXI7CisgICAgQU1lZGlhQ29kZWNfZ2V0SW5wdXRGb3JtYXQ7ICMgaW50cm9kdWNlZD0yOAorICAgIEFNZWRpYUNvZGVjX2dldE5hbWU7ICMgaW50cm9kdWNlZD0yOAogICAgIEFNZWRpYUNvZGVjX2dldE91dHB1dEJ1ZmZlcjsKICAgICBBTWVkaWFDb2RlY19nZXRPdXRwdXRGb3JtYXQ7CiAgICAgQU1lZGlhQ29kZWNfcXVldWVJbnB1dEJ1ZmZlcjsKICAgICBBTWVkaWFDb2RlY19xdWV1ZVNlY3VyZUlucHV0QnVmZmVyOworICAgIEFNZWRpYUNvZGVjX3JlbGVhc2VDcnlwdG87ICMgaW50cm9kdWNlZD0yOAorICAgIEFNZWRpYUNvZGVjX3JlbGVhc2VOYW1lOyAjIGludHJvZHVjZWQ9MjgKICAgICBBTWVkaWFDb2RlY19yZWxlYXNlT3V0cHV0QnVmZmVyOwogICAgIEFNZWRpYUNvZGVjX3JlbGVhc2VPdXRwdXRCdWZmZXJBdFRpbWU7CisgICAgQU1lZGlhQ29kZWNfc2V0QXN5bmNOb3RpZnlDYWxsYmFjazsgIyBpbnRyb2R1Y2VkPTI4CiAgICAgQU1lZGlhQ29kZWNfc2V0T3V0cHV0U3VyZmFjZTsgIyBpbnRyb2R1Y2VkPTI0CiAgICAgQU1lZGlhQ29kZWNfc2V0UGFyYW1ldGVyczsgIyBpbnRyb2R1Y2VkPTI2CiAgICAgQU1lZGlhQ29kZWNfc2V0SW5wdXRTdXJmYWNlOyAjIGludHJvZHVjZWQ9MjYKQEAgLTg2LDYgKzEyNCwxMiBAQAogICAgIEFNZWRpYUNyeXB0b19pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZDsKICAgICBBTWVkaWFDcnlwdG9fbmV3OwogICAgIEFNZWRpYUNyeXB0b19yZXF1aXJlc1NlY3VyZURlY29kZXJDb21wb25lbnQ7CisgICAgQU1lZGlhRGF0YVNvdXJjZV9kZWxldGU7ICAgICAgIyBpbnRyb2R1Y2VkPTI4CisgICAgQU1lZGlhRGF0YVNvdXJjZV9uZXc7ICAgICAgICAgIyBpbnRyb2R1Y2VkPTI4CisgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRDbG9zZTsgICAgIyBpbnRyb2R1Y2VkPTI4CisgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRHZXRTaXplOyAgIyBpbnRyb2R1Y2VkPTI4CisgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRSZWFkQXQ7ICAgIyBpbnRyb2R1Y2VkPTI4CisgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRVc2VyZGF0YTsgIyBpbnRyb2R1Y2VkPTI4CiAgICAgQU1lZGlhRHJtX2Nsb3NlU2Vzc2lvbjsKICAgICBBTWVkaWFEcm1fY3JlYXRlQnlVVUlEOwogICAgIEFNZWRpYURybV9kZWNyeXB0OwpAQCAtMTExLDkgKzE1NSwxMyBAQAogICAgIEFNZWRpYURybV92ZXJpZnk7CiAgICAgQU1lZGlhRXh0cmFjdG9yX2FkdmFuY2U7CiAgICAgQU1lZGlhRXh0cmFjdG9yX2RlbGV0ZTsKKyAgICBBTWVkaWFFeHRyYWN0b3JfZ2V0Q2FjaGVkRHVyYXRpb247ICMgaW50cm9kdWNlZD0yOAorICAgIEFNZWRpYUV4dHJhY3Rvcl9nZXRGaWxlRm9ybWF0OyAgICAgIyBpbnRyb2R1Y2VkPTI4CiAgICAgQU1lZGlhRXh0cmFjdG9yX2dldFBzc2hJbmZvOwogICAgIEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVDcnlwdG9JbmZvOwogICAgIEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVGbGFnczsKKyAgICBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlRm9ybWF0OyAgICMgaW50cm9kdWNlZD0yOAorICAgIEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVTaXplOyAgICAgIyBpbnRyb2R1Y2VkPTI4CiAgICAgQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVRpbWU7CiAgICAgQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVRyYWNrSW5kZXg7CiAgICAgQU1lZGlhRXh0cmFjdG9yX2dldFRyYWNrQ291bnQ7CkBAIC0xMjMsMjAgKzE3MSwyNiBAQAogICAgIEFNZWRpYUV4dHJhY3Rvcl9zZWVrVG87CiAgICAgQU1lZGlhRXh0cmFjdG9yX3NlbGVjdFRyYWNrOwogICAgIEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlOworICAgIEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlQ3VzdG9tOyAjIGludHJvZHVjZWQ9MjgKICAgICBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZUZkOwogICAgIEFNZWRpYUV4dHJhY3Rvcl91bnNlbGVjdFRyYWNrOwogICAgIEFNZWRpYUZvcm1hdF9kZWxldGU7CiAgICAgQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcjsKKyAgICBBTWVkaWFGb3JtYXRfZ2V0RG91YmxlOyAjIGludHJvZHVjZWQ9MjgKICAgICBBTWVkaWFGb3JtYXRfZ2V0RmxvYXQ7CiAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyOwogICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQ2NDsKKyAgICBBTWVkaWFGb3JtYXRfZ2V0UmVjdDsgIyBpbnRyb2R1Y2VkPTI4CiAgICAgQU1lZGlhRm9ybWF0X2dldFNpemU7CiAgICAgQU1lZGlhRm9ybWF0X2dldFN0cmluZzsKICAgICBBTWVkaWFGb3JtYXRfbmV3OwogICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXI7CisgICAgQU1lZGlhRm9ybWF0X3NldERvdWJsZTsgIyBpbnRyb2R1Y2VkPTI4CiAgICAgQU1lZGlhRm9ybWF0X3NldEZsb2F0OwogICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMjsKICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQ7CisgICAgQU1lZGlhRm9ybWF0X3NldFJlY3Q7ICMgaW50cm9kdWNlZD0yOAorICAgIEFNZWRpYUZvcm1hdF9zZXRTaXplOyAjIGludHJvZHVjZWQ9MjgKICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nOwogICAgIEFNZWRpYUZvcm1hdF90b1N0cmluZzsKICAgICBBTWVkaWFNdXhlcl9hZGRUcmFjazsKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL0FuZHJvaWQuYnAgYi9tZWRpYS91dGlscy9BbmRyb2lkLmJwCmluZGV4IDcyOTE3ZGQuLmQ2ZGFlNWIgMTAwNjQ0Ci0tLSBhL21lZGlhL3V0aWxzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvdXRpbHMvQW5kcm9pZC5icApAQCAtMTIsNyArMTIsNyBAQAogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJtZWRpYXV0aWxzIiwKIAogICAgIHNyY3M6IFsKQEAgLTI0LDcgKzI0LDYgQEAKICAgICBdLAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJiaW5kZXIiLAotICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJtZW11bnJlYWNoYWJsZSIsCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9JU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuY3BwIGIvbWVkaWEvdXRpbHMvSVNjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmNwcAppbmRleCAyMmZiYzk3Li5iMjEwNDA0IDEwMDY0NAotLS0gYS9tZWRpYS91dGlscy9JU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuY3BwCisrKyBiL21lZGlhL3V0aWxzL0lTY2hlZHVsaW5nUG9saWN5U2VydmljZS5jcHAKQEAgLTI1LDYgKzI1LDcgQEAKIC8vIEtlZXAgaW4gc3luYyB3aXRoIGZyYW1ld29ya3MvYmFzZS9jb3JlL2phdmEvYW5kcm9pZC9vcy9JU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuYWlkbAogZW51bSB7CiAgICAgUkVRVUVTVF9QUklPUklUWV9UUkFOU0FDVElPTiA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCisgICAgUkVRVUVTVF9DUFVTRVRfQk9PU1QsCiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC02MCw2ICs2MSwyMyBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CisKKyAgICB2aXJ0dWFsIGludCByZXF1ZXN0Q3B1c2V0Qm9vc3QoYm9vbCBlbmFibGUsIGNvbnN0IHNwPElJbnRlcmZhY2U+JiBjbGllbnQpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU2NoZWR1bGluZ1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihlbmFibGUpOworICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGNsaWVudCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoUkVRVUVTVF9DUFVTRVRfQk9PU1QsIGRhdGEsICZyZXBseSwgMCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgLy8gZmFpbCBvbiBleGNlcHRpb246IGZvcmNlIGJpbmRlciByZWNvbm5lY3Rpb24KKyAgICAgICAgaWYgKHJlcGx5LnJlYWRFeGNlcHRpb25Db2RlKCkgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CiB9OwogCiBJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UsICJhbmRyb2lkLm9zLklTY2hlZHVsaW5nUG9saWN5U2VydmljZSIpOwpAQCAtNzEsNiArODksNyBAQAogewogICAgIHN3aXRjaCAoY29kZSkgewogICAgIGNhc2UgUkVRVUVTVF9QUklPUklUWV9UUkFOU0FDVElPTjoKKyAgICBjYXNlIFJFUVVFU1RfQ1BVU0VUX0JPT1NUOgogICAgICAgICAvLyBOb3QgcmVhY2hlZAogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvSVNjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmggYi9tZWRpYS91dGlscy9JU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuaAppbmRleCAxMDE1Njc3Li5lNGY3YzBkIDEwMDY0NAotLS0gYS9tZWRpYS91dGlscy9JU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuaAorKysgYi9tZWRpYS91dGlscy9JU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuaApAQCAtMjksNiArMjksNyBAQAogICAgIHZpcnR1YWwgaW50ICAgICAgICAgcmVxdWVzdFByaW9yaXR5KC8qcGlkX3QqL2ludDMyX3QgcGlkLCAvKnBpZF90Ki9pbnQzMl90IHRpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW8sIGJvb2wgaXNGb3JBcHAsIGJvb2wgYXN5bmNocm9ub3VzKSA9IDA7CiAKKyAgICB2aXJ0dWFsIGludCAgICAgICAgIHJlcXVlc3RDcHVzZXRCb29zdChib29sIGVuYWJsZSwgY29uc3Qgc3A8SUludGVyZmFjZT4mIGNsaWVudCkgPSAwOwogfTsKIAogY2xhc3MgQm5TY2hlZHVsaW5nUG9saWN5U2VydmljZSA6IHB1YmxpYyBCbkludGVyZmFjZTxJU2NoZWR1bGluZ1BvbGljeVNlcnZpY2U+CmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9PV05FUlMgYi9tZWRpYS91dGlscy9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjljYjU2NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL09XTkVSUwpAQCAtMCwwICsxIEBACitna2FzdGVuQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL1NjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmNwcCBiL21lZGlhL3V0aWxzL1NjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmNwcAppbmRleCBkNzA1NWVmLi40ZTk3OTJmIDEwMDY0NAotLS0gYS9tZWRpYS91dGlscy9TY2hlZHVsaW5nUG9saWN5U2VydmljZS5jcHAKKysrIGIvbWVkaWEvdXRpbHMvU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuY3BwCkBAIC01OSw0ICs1OSwzMSBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKK2ludCByZXF1ZXN0Q3B1c2V0Qm9vc3QoYm9vbCBlbmFibGUsIGNvbnN0IHNwPElJbnRlcmZhY2U+ICZjbGllbnQpCit7CisgICAgaW50IHJldDsKKyAgICBzTXV0ZXgubG9jaygpOworICAgIHNwPElTY2hlZHVsaW5nUG9saWN5U2VydmljZT4gc3BzID0gc1NjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlOworICAgIHNNdXRleC51bmxvY2soKTsKKyAgICBpZiAoc3BzID09IDApIHsKKyAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmNoZWNrU2VydmljZShfc2NoZWR1bGluZ19wb2xpY3kpOworICAgICAgICBpZiAoYmluZGVyID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgfQorICAgICAgICBzcHMgPSBpbnRlcmZhY2VfY2FzdDxJU2NoZWR1bGluZ1BvbGljeVNlcnZpY2U+KGJpbmRlcik7CisgICAgICAgIHNNdXRleC5sb2NrKCk7CisgICAgICAgIHNTY2hlZHVsaW5nUG9saWN5U2VydmljZSA9IHNwczsKKyAgICAgICAgc011dGV4LnVubG9jaygpOworICAgIH0KKyAgICByZXQgPSBzcHMtPnJlcXVlc3RDcHVzZXRCb29zdChlbmFibGUsIGNsaWVudCk7CisgICAgaWYgKHJldCAhPSBERUFEX09CSkVDVCkgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBBTE9HVygiU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UgZGllZCIpOworICAgIHNNdXRleC5sb2NrKCk7CisgICAgc1NjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmNsZWFyKCk7CisgICAgc011dGV4LnVubG9jaygpOworICAgIHJldHVybiByZXQ7Cit9CisKIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL1NjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmggYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuaAppbmRleCA0N2Q4NzM0Li5hMzM1MzlmIDEwMDY0NAotLS0gYS9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuaAorKysgYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuaApAQCAtMTcsOCArMTcsMTEgQEAKICNpZm5kZWYgX0FORFJPSURfU0NIRURVTElOR19QT0xJQ1lfU0VSVklDRV9ICiAjZGVmaW5lIF9BTkRST0lEX1NDSEVEVUxJTkdfUE9MSUNZX1NFUlZJQ0VfSAogCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK2NsYXNzIElJbnRlcmZhY2U7CiAvLyBSZXF1ZXN0IGVsZXZhdGVkIHByaW9yaXR5IGZvciB0aHJlYWQgdGlkLCB3aG9zZSB0aHJlYWQgZ3JvdXAgbGVhZGVyIG11c3QgYmUgcGlkLgogLy8gVGhlIHByaW9yaXR5IHBhcmFtZXRlciBpcyBjdXJyZW50bHkgcmVzdHJpY3RlZCB0byBlaXRoZXIgMSBvciAyLgogLy8gVGhlIGFzeW5jaHJvbm91cyBwYXJhbWV0ZXIgc2hvdWxkIGJlICd0cnVlJyB0byByZXR1cm4gaW1tZWRpYXRlbHksCkBAIC0yNiw2ICsyOSwxNCBAQAogLy8gVGhlIGRlZmF1bHQgdmFsdWUgJ2ZhbHNlJyBtZWFucyB0byByZXR1cm4gYWZ0ZXIgcmVxdWVzdCBoYXMgYmVlbiBlbnF1ZXVlZCBhbmQgZXhlY3V0ZWQuCiBpbnQgcmVxdWVzdFByaW9yaXR5KHBpZF90IHBpZCwgcGlkX3QgdGlkLCBpbnQzMl90IHByaW8sIGJvb2wgaXNGb3JBcHAsIGJvb2wgYXN5bmNocm9ub3VzID0gZmFsc2UpOwogCisvLyBSZXF1ZXN0IHRvIG1vdmUgbWVkaWEuY29kZWMgcHJvY2VzcyBiZXR3ZWVuIFNQX0ZPUkVHUk9VTkQgYW5kIFNQX1RPUF9BUFAuCisvLyBXaGVuICdlbmFibGUnIGlzICd0cnVlJywgc2VydmVyIHdpbGwgYXR0ZW1wdCB0byBtb3ZlIG1lZGlhLmNvZGVjIHByb2Nlc3MKKy8vIGZyb20gU1BfRk9SRUdST1VORCBpbnRvIFNQX1RPUF9BUFAgY3B1c2V0LiBBIHZhbGlkICdjbGllbnQnIG11c3QgYmUgcHJvdmlkZWQKKy8vIGZvciB0aGUgc2VydmVyIHRvIHJlY2VpdmUgZGVhdGggbm90aWZpY2F0aW9ucy4gV2hlbiAnZW5hYmxlJyBpcyAnZmFsc2UnLCBzZXJ2ZXIKKy8vIHdpbGwgYXR0ZW1wdCB0byBtb3ZlIG1lZGlhLmNvZGVjIHByb2Nlc3MgYmFjayB0byB0aGUgb3JpZ2luYWwgY3B1c2V0LCBhbmQKKy8vICdjbGllbnQnIGlzIGlnbm9yZWQgaW4gdGhpcyBjYXNlLgoraW50IHJlcXVlc3RDcHVzZXRCb29zdChib29sIGVuYWJsZSwgY29uc3Qgc3A8SUludGVyZmFjZT4gJmNsaWVudCk7CisKIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgIC8vIF9BTkRST0lEX1NDSEVEVUxJTkdfUE9MSUNZX1NFUlZJQ0VfSApkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL0FuZHJvaWQubWsgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWY5ZGM1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL0FuZHJvaWQubWsKQEAgLTAsMCArMSw3MiBAQAorIworIyBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIFRoaXMgcGFja2FnZSBpcyBleGNsdWRlZCBmcm9tIGJ1aWxkIGZvciBub3cgc2luY2UgQVBJcyB1c2luZyB0aGlzIGFwayBiZWNhbWUgaGlkZGVuLgorIworI0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKyNpZm5lcSAoJChUQVJHRVRfQlVJTERfUERLKSx0cnVlKSAjIEJ1aWxkIE1lZGlhQ29tcG9uZW50cyBvbmx5IGlmIHRoaXMgaXMgbm90IGEgUERLIGJ1aWxkLiAgTWVkaWFDb21wb25lbnRzIHdvbid0CisjIyBidWlsZCBpbiBQREsgYnVpbGRzIGJlY2F1c2UgZnJhbWV3b3Jrcy9iYXNlL2NvcmUvamF2YSBpcyBub3QgYXZhaWxhYmxlIGJ1dAorIyMgSU1lZGlhU2Vzc2lvbjIuYWlkbCBhbmQgSU1lZGlhQ29udHJvbGxlcjIuYWlkbCBhcmUgdXNpbmcgY2xhc3NlcyBmcm9tCisjIyBmcmFtZXdvcmtzL2Jhc2UvY29yZS9qYXZhLgorIworI2luY2x1ZGUgJChDTEVBUl9WQVJTKQorIworI0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBNZWRpYUNvbXBvbmVudHMKKyNMT0NBTF9NT0RVTEVfT1dORVIgOj0gZ29vZ2xlCisjCisjIyBUT0RPOiBjcmVhdGUgYSBzZXBhcmF0ZSBrZXkgZm9yIHRoaXMgcGFja2FnZS4KKyNMT0NBTF9DRVJUSUZJQ0FURSA6PSBwbGF0Zm9ybQorIworIyMgVE9ETzogVXNlIFN5c3RlbSBTREsgb25jZSBwdWJsaWMgQVBJcyBhcmUgYXBwcm92ZWQKKyMjIExPQ0FMX1NES19WRVJTSU9OIDo9IHN5c3RlbV9jdXJyZW50CisjTE9DQUxfUFJJVkFURV9QTEFURk9STV9BUElTIDo9IHRydWUKKyMKKyNMT0NBTF9TUkNfRklMRVMgOj0gXAorIyAgICAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykgXAorIyAgICAkKGNhbGwgYWxsLUlhaWRsLWZpbGVzLXVuZGVyLCBzcmMpCisjCisjTE9DQUxfUFJPR1VBUkRfRkxBR19GSUxFUyA6PSBwcm9ndWFyZC5jZmcKKyMKKyNMT0NBTF9NVUxUSUxJQiA6PSBmaXJzdAorIworI0xPQ0FMX0pBVkFfTElCUkFSSUVTICs9IGFuZHJvaWQtc3VwcG9ydC1hbm5vdGF0aW9ucworIworIyMgVG8gZW1iZWQgbmF0aXZlIGxpYnJhcmllcyBpbiBwYWNrYWdlLCB1bmNvbW1lbnQgdGhlIGxpbmVzIGJlbG93LgorIyNMT0NBTF9NT0RVTEVfVEFHUyA6PSBzYW1wbGVzCisjI0xPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyMjICAgIGxpYmFhY2V4dHJhY3RvciBcCisjIyAgICBsaWJhbXJleHRyYWN0b3IgXAorIyMgICAgbGliZmxhY2V4dHJhY3RvciBcCisjIyAgICBsaWJtaWRpZXh0cmFjdG9yIFwKKyMjICAgIGxpYm1rdmV4dHJhY3RvciBcCisjIyAgICBsaWJtcDNleHRyYWN0b3IgXAorIyMgICAgbGlibXA0ZXh0cmFjdG9yIFwKKyMjICAgIGxpYm1wZWcyZXh0cmFjdG9yIFwKKyMjICAgIGxpYm9nZ2V4dHJhY3RvciBcCisjIyAgICBsaWJ3YXZleHRyYWN0b3IgXAorIworIyMgVE9ETzogUmVtb3ZlIGRlcGVuZGVuY3kgd2l0aCBvdGhlciBzdXBwb3J0IGxpYnJhcmllcy4KKyNMT0NBTF9TVEFUSUNfQU5EUk9JRF9MSUJSQVJJRVMgKz0gXAorIyAgICBhbmRyb2lkLXN1cHBvcnQtdjQgXAorIyAgICBhbmRyb2lkLXN1cHBvcnQtdjctYXBwY29tcGF0IFwKKyMgICAgYW5kcm9pZC1zdXBwb3J0LXY3LXBhbGV0dGUKKyNMT0NBTF9VU0VfQUFQVDIgOj0gdHJ1ZQorIworI2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQorIworI2VuZGlmICAjIGlmbmVxICgkKFRBUkdFVF9CVUlMRF9QREspLHRydWUpCisjCisjaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGZkY2ExCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwxNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iY29tLmFuZHJvaWQubWVkaWEudXBkYXRlIgorICAgIGFuZHJvaWQ6dmVyc2lvbkNvZGU9IjEiCisgICAgYW5kcm9pZDp2ZXJzaW9uTmFtZT0iMS4wIiA+CisKKyAgICA8YXBwbGljYXRpb24KKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iTWVkaWEgQ29tcG9uZW50cyBVcGRhdGUiCisgICAgICAgIGFuZHJvaWQ6bXVsdGlBcmNoPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmFsbG93QmFja3VwPSJmYWxzZSIKKyAgICAgICAgYW5kcm9pZDpoYXNDb2RlPSJmYWxzZSIKKyAgICAgICAgYW5kcm9pZDpleHRyYWN0TmF0aXZlTGlicz0iZmFsc2UiPgorICAgIDwvYXBwbGljYXRpb24+CisKKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcHJvZ3VhcmQuY2ZnIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Byb2d1YXJkLmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2JmNzMwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Byb2d1YXJkLmNmZwpAQCAtMCwwICsxLDIwIEBACisjCisjIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgS2VlcCBlbnRyeSBwb2ludCBmb3IgdXBkYXRhYmxlIEphdmEgY2xhc3NlcworLWtlZXAgcHVibGljIGNsYXNzIGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5BcGlGYWN0b3J5IHsKKyAgIHB1YmxpYyBzdGF0aWMgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLkFwaUZhY3RvcnkgaW5pdGlhbGl6ZShhbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvKTsKK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2F1ZGlvdHJhY2tfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdmZDUxZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19hdWRpb3RyYWNrX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19hdWRpb3RyYWNrX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2M4MjUyCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyOGRkZWEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2RpYWxvZ19jbG9zZV9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE5Y2Q3NQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wYXVzZV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wYXVzZV9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTkyYWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNzA3ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3BsYXlfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMzMmQwMAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wbGF5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wbGF5X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzQ1ZWUzCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAxZDM0MQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdG9wX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdG9wX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDZiNjVkCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdWJ0aXRsZV9kaXNhYmxlZC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfc3VidGl0bGVfZGlzYWJsZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNTRmNjEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfc3VidGl0bGVfZGlzYWJsZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdWJ0aXRsZV9lbmFibGVkLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdWJ0aXRsZV9lbmFibGVkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjhmZWJlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N1YnRpdGxlX2VuYWJsZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZDMwNWQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg3ZmRlNAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTczOWRmNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGMzNDRhCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMDM0MjAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzIzZTQ1NQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDBjMjVhMwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hZmRiOWMxCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44NDZjMTA5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV90dl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV90dl9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zM2JmNDg0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfdHZfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM5MTFiNWMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfdHZfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2F1ZGlvdHJhY2tfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk0ZWQ1MAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19hdWRpb3RyYWNrX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19hdWRpb3RyYWNrX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2Y3ZTBjCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NTU4YTgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2RpYWxvZ19jbG9zZV9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBhMWE4NAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wYXVzZV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wYXVzZV9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDlhZWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MDY4ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BsYXlfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNjNzc3YwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wbGF5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wbGF5X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjA4Nzk1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FkMmM5YwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9zdG9wX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9zdG9wX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDAyYWI3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9zdWJ0aXRsZV9kaXNhYmxlZC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3VidGl0bGVfZGlzYWJsZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNTRmNjEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3VidGl0bGVfZGlzYWJsZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9zdWJ0aXRsZV9lbmFibGVkLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9zdWJ0aXRsZV9lbmFibGVkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjhmZWJlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N1YnRpdGxlX2VuYWJsZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NDZlYTQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ3OTBjNgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQwMWRjMAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjRkNTg2Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYmI3NzIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2NjOTg0NQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjI2MTdlMQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jZWZlZjNjCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45YTAwNDdjCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV90dl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV90dl9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jYTVkNmEyCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfdHZfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjgxMzQzMTAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfdHZfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfYXVkaW90cmFja19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfYXVkaW90cmFja19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWM4OTlmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfYXVkaW90cmFja19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NzhlMDAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk5MmZjNQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzg4NGU2Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGF1c2VfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MGFjNjUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkyMTA0ZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGxheV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGxheV9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTVjMDYyCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGxheV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMmQ0OTUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfc3RvcF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfc3RvcF9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjM5MzM2Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYzVhNmMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmRkMjE0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiN2JkY2QKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2ZlNTc2Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhNWQ2YWEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWFkZmEzCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNWZlMGIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWM0OGE3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MWU5MTEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTQyMThhCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMzBmYWIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2FhOTAzCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZTJmMjkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzg3MWUyCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNTdmNjMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDQxYjAxCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYmI2OTQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGUxMDEzCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMzUyYzMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDUzMmU5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNmJhMzAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmEzYjVmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNGJiMjIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTU2MTI3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MTdhOWYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmY2MzNlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNTE4MTEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTZhNTNjCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MDVkY2EKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGU0ZWEzCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNjcyNGYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTNiNDEwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMThhYmQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTgxMTMzCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MGIxOTEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGFiYTNkCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMzRkNWIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTk1N2IzCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZDM4NGYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGM2Mjk3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YWI2ODQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWU3Zjc1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhYTNjYTMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2FlY2RlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiOGQwYjYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDBiZTNjCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNGYxYmYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTE4YjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YzJjMDAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGZhZTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NGMyODkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWY5MzI3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZTFmNjkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTZmYWZkCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMmJkODcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzNhMWY4Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4YzEwNjkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjJiODAzCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZmJhMDIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTdmMmQyCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZjU0NzgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTk1YWYwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MGI3ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZGQyMTQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI3YmRjZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZmU1NzYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE1ZDZhYQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhYWRmYTMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI1ZmUwYgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YzQ4YTcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQxZTkxMQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNDIxOGEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIzMGZhYgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YWE5MDMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdlMmYyOQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ODcxZTIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM1N2Y2MwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNDFiMDEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRiYjY5NAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZTEwMTMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMzNTJjMwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNTMyZTkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM2YmEzMAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYTNiNWYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ0YmIyMgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNTcwZjQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVhNDAzZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NDRiZmQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkNjA0OAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMGQ1NTgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNiYzQ4ZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZDhmOGUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThiOTBlNQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMjM0YTcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdkNDUyZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MWNmNWEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBkMDhiNAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZWIzZjEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZhZThiMwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMGZjMDgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJhMTZhYwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNTk4Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ2ZDE2ZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNzA0NTUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU2ZGIxMwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMzgyOGEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFjY2M3MwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjOGNlZDkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQwMWI5ZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMzFkZDMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVmNzhlNAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YzJjZGIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdjNWJlYQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYWQwZDQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZhNTkyMwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ODdlMjUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMwNmRiOAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMjI1YmEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk2OTdkZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzN2VjMjEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE4NDBiZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NDVlM2EKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMzN2M2NQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZGQyMTQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI3YmRjZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRkYzEzMgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTQ2MTdjCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjMwNzczCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNWQ3ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIzOGQ1OAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNDAzNDlkCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mNjdjNDYzCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdmY2ViZjUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVhMzJhN2EKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ2MmNhMzcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfdHZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzEzMTI1NgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfdHZfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2F1ZGlvdHJhY2tfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMzFlMWIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfYXVkaW90cmFja19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU5NDZhMgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODVlODdmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2RpYWxvZ19jbG9zZV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYjQ0MDEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfcGF1c2VfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VhN2UwMwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzYzNTM4Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BsYXlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NDVjM2EKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfcGxheV9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRhM2JhNQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNWNhMTgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFjMTgzZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYjY3OWUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFjNjA1MQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwODM5MTQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNjM2NhZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNDQ0Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJkNjM3NwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYmQxZGEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJlNzEwOAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZjU5NmIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYzMmUxYQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NjhlMDQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQyMGRkOQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZTM5ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVkYzE1ZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4YWViYWYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVhNmE0ZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YjkxY2UKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVmNjZmOQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZWEzNGIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUyZGUwNAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMWFhMjEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM0YmNjMAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NjZiMzUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ1YThmYgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZWIxMzIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRhMmI2MAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiODBhYTkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE1ZWZlNAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMGNjMzEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZhZTZmYwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ODE2YzkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ0MjkzMQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZDViN2YKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAzYTBmZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMmE2NTUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBkZWJjMgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZTc4YTcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EzZjk5MQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZmFkOWUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZkZDhkNAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MGZkNWYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIwYjVjMQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZTFlZjEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE3MTBkNAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MWMwODAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM0YWEyMQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YTZiMzAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZlOGZlMAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3Yjg0MGUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYyNDA1MAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxYzE4YzEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU5NzUzZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMjkxYjEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMxYzYxOQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MDRhNzAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdlMGE2MAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3YjFmM2UKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM1NTFlYwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzODY2N2UKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZiODE4MwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4OTNmMTgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM1ZTE1NgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRiNjc5ZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWM2MDUxCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA4MzkxNAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2MzY2FmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM0NDRjZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmQ2Mzc3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRiZDFkYQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmU3MTA4Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDlmNTk2YgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjMyZTFhCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU2OGUwNAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDIwZGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJlMzllNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWRjMTVmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhhZWJhZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWE2YTRmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRiOTFjZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWY2NmY5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFlYTM0YgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTJkZTA0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIxYWEyMQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzRiY2MwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZmZmEwMQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmY3ZTU3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZhYzRkYwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmE4NmY1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMwMTA5MAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mzk2ZjBlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE5MDAxYgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjcxNTgxCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU5NjIwOAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjY5NTAwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdlMWJkNgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGU4ZjE5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYzMmU5NQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWQ1ZDJlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYwZDUyNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzYxYWUxCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFhM2Y4NAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2QxNjZmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJlNTI3ZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWIyYThlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMzN2FmNQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2YzMWVmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBkOWY1NwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjhlYjc3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZhMGUxNAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzQyNWUxCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M3NmUxOQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDJmMWVkCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVmZGNkZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2U5YjgxOQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyOWU0NDMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ5Y2E4OQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYzc1ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNiZDI3YwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYmIwYWMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI1MTRhYQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlN2ZlNWMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZiMmMxMAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYjY3OWUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFjNjA1MQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRiMjEyMQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2U3ZTNhCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODYwMWNlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0OTI4ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkyZmQ3NwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mMTcxYThjCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jOGNiNmNhCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjljODg2M2QKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjkzMzUwMzgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV90dl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE2YTQ4NTgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV90dl9kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGNhNjc4NwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDAucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjMwNWQyCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDEucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAxLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTM5NWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAxLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDIucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGE3MjgyCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDMucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2YwZjUzCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmE4MGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDUucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA1LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWMzOTM5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA1LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDYucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA2LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjAyNTM2Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA2LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDcucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA3LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTIyOGY0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA3LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDgucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA4LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDQyNzdlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA4LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDkucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA5LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODY1YmZiCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTAucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzEwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2M1ZDZiCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzEwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTEucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzExLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmY0YWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzExLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTIucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzEyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjMwNjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzEyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTMucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzEzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTkzMjRlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzEzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzE0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODYxOGYwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzE0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTUucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzE1LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTBkNzcwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzE1LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzAwLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMGQ3NzAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzAwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzAxLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDEucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYjRlNTAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzAxLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzAyLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYjVmMDMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzAyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzAzLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNWM3NTgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzAzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNWM3ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA1LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMjg3ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA1LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA2LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDYucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViN2QwY2YKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA2LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA3LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDcucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZmE3MmIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA3LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA4LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDgucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NTBlZWEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA4LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA5LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNDQzNTUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzEwLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlODc3YzMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzEwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzExLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTEucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MjdmMGEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzExLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzEyLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYjE5YmIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzEyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzEzLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNTkyMWUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzEzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzE0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0Yjc2YjEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzE0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzE1LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMzA1ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzE1LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGE5NTI1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2N1c3RvbV9wcm9ncmVzcy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2N1c3RvbV9wcm9ncmVzcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTczMWE2ZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvY3VzdG9tX3Byb2dyZXNzLnhtbApAQCAtMCwwICsxLDM2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8bGF5ZXItbGlzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiID4KKyAgICA8aXRlbSBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9iYWNrZ3JvdW5kIj4KKyAgICAgICAgPHNoYXBlIGFuZHJvaWQ6c2hhcGU9InJlY3RhbmdsZSIgPgorICAgICAgICAgICAgPHNvbGlkIGFuZHJvaWQ6Y29sb3I9IiMyNjAwMDAwMCIgLz4KKyAgICAgICAgPC9zaGFwZT4KKyAgICA8L2l0ZW0+CisgICAgPGl0ZW0gYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvc2Vjb25kYXJ5UHJvZ3Jlc3MiPgorICAgICAgICA8Y2xpcD4KKyAgICAgICAgICAgIDxzaGFwZSBhbmRyb2lkOnNoYXBlPSJyZWN0YW5nbGUiID4KKyAgICAgICAgICAgICAgICA8c29saWQgYW5kcm9pZDpjb2xvcj0iIzVDZmZmZmZmIiAvPgorICAgICAgICAgICAgPC9zaGFwZT4KKyAgICAgICAgPC9jbGlwPgorICAgIDwvaXRlbT4KKyAgICA8aXRlbSBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9wcm9ncmVzcyI+CisgICAgICAgIDxjbGlwPgorICAgICAgICAgICAgPHNoYXBlIGFuZHJvaWQ6c2hhcGU9InJlY3RhbmdsZSIgPgorICAgICAgICAgICAgICAgIDxzb2xpZCBhbmRyb2lkOmNvbG9yPSIjZmZmZmZmIiAvPgorICAgICAgICAgICAgPC9zaGFwZT4KKyAgICAgICAgPC9jbGlwPgorICAgIDwvaXRlbT4KKzwvbGF5ZXItbGlzdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2N1c3RvbV9wcm9ncmVzc190aHVtYi54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2N1c3RvbV9wcm9ncmVzc190aHVtYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEzNTk3MAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvY3VzdG9tX3Byb2dyZXNzX3RodW1iLnhtbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8c2hhcGUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6c2hhcGU9Im92YWwiID4KKyAgICA8c29saWQgYW5kcm9pZDpjb2xvcj0iI2ZmZmZmZiIgLz4KKyAgICA8c2l6ZQorICAgICAgICBhbmRyb2lkOmhlaWdodD0iQGRpbWVuL21jdjJfY3VzdG9tX3Byb2dyZXNzX3RodW1iX3NpemUiCisgICAgICAgIGFuZHJvaWQ6d2lkdGg9IkBkaW1lbi9tY3YyX2N1c3RvbV9wcm9ncmVzc190aHVtYl9zaXplIiAvPgorPC9zaGFwZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2Fycm93X2JhY2sueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19hcnJvd19iYWNrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjVmNzFlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19hcnJvd19iYWNrLnhtbApAQCAtMCwwICsxLDkgQEAKKzx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgorICAgICAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKKyAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgorICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KKyAgICA8cGF0aAorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMjAsMTFINy44M2w1LjU5LC01LjU5TDEyLDRsLTgsOCA4LDggMS40MSwtMS40MUw3LjgzLDEzSDIwdi0yeiIKKyAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KKzwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19hc3BlY3RfcmF0aW8ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19hc3BlY3RfcmF0aW8ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MjI4ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2FzcGVjdF9yYXRpby54bWwKQEAgLTAsMCArMSw5IEBACis8dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKKyAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCisgICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKKyAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+CisgICAgPHBhdGgKKyAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE5LDEyaC0ydjNoLTN2Mmg1di01ek03LDloM0wxMCw3TDUsN3Y1aDJMNyw5ek0yMSwzTDMsM2MtMS4xLDAgLTIsMC45IC0yLDJ2MTRjMCwxLjEgMC45LDIgMiwyaDE4YzEuMSwwIDIsLTAuOSAyLC0yTDIzLDVjMCwtMS4xIC0wLjksLTIgLTIsLTJ6TTIxLDE5LjAxTDMsMTkuMDFMMyw0Ljk5aDE4djE0LjAyeiIKKyAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KKzwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19hdWRpb3RyYWNrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfYXVkaW90cmFjay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdjMTJiNQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfYXVkaW90cmFjay54bWwKQEAgLTAsMCArMSw5IEBACis8dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgorICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgorICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKKyAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KKyAgICA8cGF0aAorICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIKKyAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTEyLDN2OS4yOGMtMC40NywtMC4xNyAtMC45NywtMC4yOCAtMS41LC0wLjI4QzguMDEsMTIgNiwxNC4wMSA2LDE2LjVTOC4wMSwyMSAxMC41LDIxYzIuMzEsMCA0LjIsLTEuNzUgNC40NSwtNEgxNVY2aDRWM2gtN3oiLz4KKzwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19jaGVjay54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2NoZWNrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmY3MjBiCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19jaGVjay54bWwKQEAgLTAsMCArMSwxMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCisgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCisgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNCIKKyAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNCI+CisKKyAgICA8cGF0aAorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMCAwaDI0djI0SDB6IiAvPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIgorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNOSAxNi4yTDQuOCAxMmwtMS40IDEuNEw5IDE5IDIxIDdsLTEuNC0xLjRMOSAxNi4yeiIgLz4KKzwvdmVjdG9yPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfY2hldnJvbl9sZWZ0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfY2hldnJvbl9sZWZ0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzM2ZDE3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19jaGV2cm9uX2xlZnQueG1sCkBAIC0wLDAgKzEsOSBAQAorPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCisgICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgorICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCisgICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xNS40MSw3LjQxTDE0LDZsLTYsNiA2LDYgMS40MSwtMS40MUwxMC44MywxMnoiCisgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Cis8L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfY2hldnJvbl9yaWdodC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2NoZXZyb25fcmlnaHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMmNlMDkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2NoZXZyb25fcmlnaHQueG1sCkBAIC0wLDAgKzEsOSBAQAorPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCisgICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgorICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCisgICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xMCw2TDguNTksNy40MSAxMy4xNywxMmwtNC41OCw0LjU5TDEwLDE4bDYsLTZ6IgorICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgorPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2RlZmF1bHRfYWxidW1faW1hZ2UueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19kZWZhdWx0X2FsYnVtX2ltYWdlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2VlNjQzCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19kZWZhdWx0X2FsYnVtX2ltYWdlLnhtbApAQCAtMCwwICsxLDE0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDp3aWR0aD0iNTEyZHAiCisgICAgYW5kcm9pZDpoZWlnaHQ9IjUxMmRwIgorICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iNTEyIgorICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjUxMiI+CisKKyAgICA8cGF0aAorICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iIzYxNjE2MSIKKyAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTSAwIDAgSCA1MTIgViA1MTIgSCAwIFYgMCBaIiAvPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjNTI1MjUyIgorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMjU2LDE1MXYxMjMuMTRjLTYuODgtNC4wMi0xNC44Mi02LjQ4LTIzLjMzLTYuNDggYy0yNS43OCwwLTQ2LjY3LDIwLjg4LTQ2LjY3LDQ2LjY3YzAsMjUuNzgsMjAuODgsNDYuNjcsNDYuNjcsNDYuNjdzNDYuNjctMjAuODgsNDYuNjctNDYuNjdWMTk3LjY3SDMyNlYxNTFIMjU2eiIgLz4KKzwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19mb3J3YXJkXzMwLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZm9yd2FyZF8zMC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VmZGYxNgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZm9yd2FyZF8zMC54bWwKQEAgLTAsMCArMSwxMiBAQAorPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6d2lkdGg9IjQwZHAiCisgICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSI0MGRwIgorICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCisgICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgorICAgIDxncm91cD4KKyAgICAgICAgPGNsaXAtcGF0aCBhbmRyb2lkOnBhdGhEYXRhPSJNMjQsMjRIMFYwaDI0djI0eiBNIDAsMCIgLz4KKyAgICA8cGF0aAorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNOS42IDEzLjVoLjRjLjIgMCAuNCwtLjEuNSwtLjJzLjIsLS4yLjIsLS40di0uMnMtLjEsLS4xLC0uMSwtLjIsLS4xLC0uMSwtLjIsLS4xaC0uNXMtLjEuMSwtLjIuMSwtLjEuMSwtLjEuMnYuMmgtMWMwLC0uMiAwLC0uMy4xLC0uNXMuMiwtLjMuMywtLjQuMywtLjIuNCwtLjIuNCwtLjEuNSwtLjFjLjIgMCAuNCAwIC42LjFzLjMuMS41LjIuMi4yLjMuNC4xLjMuMS41di4zcy0uMS4yLC0uMS4zLC0uMS4yLC0uMi4yLC0uMi4xLC0uMy4yYy4yLjEuNC4yLjUuNHMuMi40LjIuNmMwIC4yIDAgLjQsLS4xLjVzLS4yLjMsLS4zLjQsLS4zLjIsLS41LjIsLS40LjEsLS42LjFjLS4yIDAsLS40IDAsLS41LC0uMXMtLjMsLS4xLC0uNSwtLjIsLS4yLC0uMiwtLjMsLS40LC0uMSwtLjQsLS4xLC0uNmguOHYuMnMuMS4xLjEuMi4xLjEuMi4xaC41cy4xLC0uMS4yLC0uMS4xLC0uMS4xLC0uMnYtLjVzLS4xLC0uMSwtLjEsLS4yLC0uMSwtLjEsLS4yLC0uMWgtLjZ2LS43em01LjcuN2MwIC4zIDAgLjYsLS4xLjhsLS4zLjZzLS4zLjMsLS41LjMsLS40LjEsLS42LjEsLS40IDAsLS42LC0uMSwtLjMsLS4yLC0uNSwtLjMsLS4yLC0uMywtLjMsLS42LC0uMSwtLjUsLS4xLC0uOHYtLjdjMCwtLjMgMCwtLjYuMSwtLjhsLjMsLS42cy4zLC0uMy41LC0uMy40LC0uMS42LC0uMS40IDAgLjYuMS4zLjIuNS4zLjIuMy4zLjYuMS41LjEuOHYuN3ptLS45LC0uOHYtLjVzLS4xLC0uMiwtLjEsLS4zLC0uMSwtLjEsLS4yLC0uMiwtLjIsLS4xLC0uMywtLjEsLS4yIDAsLS4zLjFsLS4yLjJzLS4xLjIsLS4xLjN2MnMuMS4yLjEuMy4xLjEuMi4yLjIuMS4zLjEuMiAwIC4zLC0uMWwuMiwtLjJzLjEsLS4yLjEsLS4zdi0xLjV6TTQgMTNjMCA0LjQgMy42IDggOCA4czgsLTMuNiA4LC04aC0yYzAgMy4zLC0yLjcgNiwtNiA2cy02LC0yLjcsLTYsLTYgMi43LC02IDYsLTZ2NGw1LC01LC01LC01djRjLTQuNCAwLC04IDMuNiwtOCA4eiIKKyAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KKyAgICA8L2dyb3VwPgorPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2Z1bGxzY3JlZW4ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19mdWxsc2NyZWVuLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjRmNmJjCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19mdWxsc2NyZWVuLnhtbApAQCAtMCwwICsxLDkgQEAKKzx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgorICAgICAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKKyAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgorICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KKyAgICA8cGF0aAorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNNywxNEw1LDE0djVoNXYtMkw3LDE3di0zek01LDEwaDJMNyw3aDNMMTAsNUw1LDV2NXpNMTcsMTdoLTN2Mmg1di01aC0ydjN6TTE0LDV2MmgzdjNoMkwxOSw1aC01eiIKKyAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KKzwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19mdWxsc2NyZWVuX2V4aXQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19mdWxsc2NyZWVuX2V4aXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMjA0ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2Z1bGxzY3JlZW5fZXhpdC54bWwKQEAgLTAsMCArMSw5IEBACis8dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKKyAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCisgICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKKyAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+CisgICAgPHBhdGgKKyAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTUsMTZoM3YzaDJ2LTVMNSwxNHYyek04LDhMNSw4djJoNUwxMCw1TDgsNXYzek0xNCwxOWgydi0zaDN2LTJoLTV2NXpNMTYsOEwxNiw1aC0ydjVoNUwxOSw4aC0zeiIKKyAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KKzwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19oZWxwLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfaGVscC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQxZDc1ZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfaGVscC54bWwKQEAgLTAsMCArMSwxNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCisgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCisgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNCIKKyAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNCI+CisKKyAgICA8cGF0aAorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMCAwaDI0djI0SDB6IiAvPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIgorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMQorMTdoLTJ2LTJoMnYyem0yLjA3LTcuNzVsLS45IC45MiBDMTMuNDUgMTIuOSAxMyAxMy41IDEzIDE1aC0ydi0uNWMwLTEuMSAuNDUgLTIuMQorMS4xNy0yLjgzbDEuMjQtMS4yNmMuMzctLjM2IC41OSAtLjg2IC41OSAtMS40MSAwLTEuMS0uOS0yLTItMnMtMiAuOS0yIDJIOGMwLTIuMjEKKzEuNzktNCA0LTRzNCAxLjc5IDQgNGMwIC44OC0uMzYgMS42OC0uOTMgMi4yNXoiIC8+Cis8L3ZlY3Rvcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2hpZ2hfcXVhbGl0eS54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2hpZ2hfcXVhbGl0eS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc2ZTIyZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfaGlnaF9xdWFsaXR5LnhtbApAQCAtMCwwICsxLDEzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDp3aWR0aD0iMzRkcCIKKyAgICBhbmRyb2lkOmhlaWdodD0iMzRkcCIKKyAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0IgorICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0Ij4KKworICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0wIDBoMjR2MjRIMHoiIC8+CisgICAgPHBhdGgKKyAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xOSA0SDVjLTEuMTEgMC0yIDAuOS0yIDJ2MTJjMCAxLjEgMC44OSAyIDIgMmgxNGMxLjEgMCAyLTAuOSAyLTJWNmMwLTEuMS0wLjktMi0yLTJ6bS04IDExSDkuNXYtMmgtMnYySDZWOWgxLjV2Mi41aDJWOUgxMXY2em03LTFjMCAwLjU1LTAuNDUgMS0xIDFoLTAuNzV2MS41aC0xLjVWMTVIMTRjLTAuNTUgMC0xLTAuNDUtMS0xdi00YzAtMC41NSAwLjQ1IC0xIDEtMWgzYzAuNTUgMCAxIDAuNDUgMSAxdjR6bS0zLjUtMC41aDJ2LTNoLTJ2M3oiIC8+Cis8L3ZlY3Rvcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2xhdW5jaC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2xhdW5jaC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdhZjZhYQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfbGF1bmNoLnhtbApAQCAtMCwwICsxLDkgQEAKKzx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCisgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCisgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgorICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIgorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTksMTlINVY1aDdWM0g1Yy0xLjExLDAgLTIsMC45IC0yLDJ2MTRjMCwxLjEgMC44OSwyIDIsMmgxNGMxLjEsMCAyLC0wLjkgMiwtMnYtN2gtMnY3ek0xNCwzdjJoMy41OWwtOS44Myw5LjgzIDEuNDEsMS40MUwxOSw2LjQxVjEwaDJWM2gtN3oiLz4KKzwvdmVjdG9yPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfbXV0ZS54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX211dGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MGFhZWMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX211dGUueG1sCkBAIC0wLDAgKzEsOSBAQAorPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCisgICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgorICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCisgICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xNi41LDEyYzAsLTEuNzcgLTEuMDIsLTMuMjkgLTIuNSwtNC4wM3YyLjIxbDIuNDUsMi40NWMwLjAzLC0wLjIgMC4wNSwtMC40MSAwLjA1LC0wLjYzek0xOSwxMmMwLDAuOTQgLTAuMiwxLjgyIC0wLjU0LDIuNjRsMS41MSwxLjUxQzIwLjYzLDE0LjkxIDIxLDEzLjUgMjEsMTJjMCwtNC4yOCAtMi45OSwtNy44NiAtNywtOC43N3YyLjA2YzIuODksMC44NiA1LDMuNTQgNSw2Ljcxek00LjI3LDNMMyw0LjI3IDcuNzMsOUwzLDl2Nmg0bDUsNXYtNi43M2w0LjI1LDQuMjVjLTAuNjcsMC41MiAtMS40MiwwLjkzIC0yLjI1LDEuMTh2Mi4wNmMxLjM4LC0wLjMxIDIuNjMsLTAuOTUgMy42OSwtMS44MUwxOS43MywyMSAyMSwxOS43M2wtOSwtOUw0LjI3LDN6TTEyLDRMOS45MSw2LjA5IDEyLDguMThMMTIsNHoiCisgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Cis8L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcGF1c2VfY2lyY2xlX2ZpbGxlZC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3BhdXNlX2NpcmNsZV9maWxsZWQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYmUyMjgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3BhdXNlX2NpcmNsZV9maWxsZWQueG1sCkBAIC0wLDAgKzEsOSBAQAorPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6d2lkdGg9IjQwZHAiCisgICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSI0MGRwIgorICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCisgICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xMiwyQzYuNDgsMiAyLDYuNDggMiwxMnM0LjQ4LDEwIDEwLDEwIDEwLC00LjQ4IDEwLC0xMFMxNy41MiwyIDEyLDJ6TTExLDE2TDksMTZMOSw4aDJ2OHpNMTUsMTZoLTJMMTMsOGgydjh6IgorICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgorPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3BsYXlfY2lyY2xlX2ZpbGxlZC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3BsYXlfY2lyY2xlX2ZpbGxlZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQzOWRlZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcGxheV9jaXJjbGVfZmlsbGVkLnhtbApAQCAtMCwwICsxLDkgQEAKKzx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOndpZHRoPSI0MGRwIgorICAgICAgICBhbmRyb2lkOmhlaWdodD0iNDBkcCIKKyAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgorICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KKyAgICA8cGF0aAorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTIsMkM2LjQ4LDIgMiw2LjQ4IDIsMTJzNC40OCwxMCAxMCwxMCAxMCwtNC40OCAxMCwtMTBTMTcuNTIsMiAxMiwyek0xMCwxNi41di05bDYsNC41IC02LDQuNXoiCisgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Cis8L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcmVwbGF5X2NpcmNsZV9maWxsZWQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19yZXBsYXlfY2lyY2xlX2ZpbGxlZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU2ZDVkOQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcmVwbGF5X2NpcmNsZV9maWxsZWQueG1sCkBAIC0wLDAgKzEsMTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOndpZHRoPSI0MGRwIgorICAgIGFuZHJvaWQ6aGVpZ2h0PSI0MGRwIgorICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQiCisgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQiPgorCisgICAgPHBhdGgKKyAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTAsMGgyNHYyNEgwVjB6IiAvPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIgorICAgICAgICBhbmRyb2lkOmZpbGxUeXBlPSJldmVuT2RkIgorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTIsMkM2LjQ4LDIsMiw2LjQ4LDIsMTJjMCw1LjUyLDQuNDgsMTAsMTAsMTBjNS41MiwwLDEwLTQuNDgsMTAtMTAKK0MyMiw2LjQ4LDE3LjUyLDIsMTIsMnoKK00xOCwxMmMwLDMuMzEtMi42OSw2LTYsNmMtMy4zMSwwLTYtMi42OS02LTZoMmMwLDIuMjEsMS43OSw0LDQsNHM0LTEuNzksNC00cy0xLjc5LTQtNC00djNMOCw3bDQtNHYzCitDMTUuMzEsNiwxOCw4LjY5LDE4LDEyeiIgLz4KKzwvdmVjdG9yPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcmV3aW5kXzEwLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcmV3aW5kXzEwLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTU4NmI0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19yZXdpbmRfMTAueG1sCkBAIC0wLDAgKzEsMTIgQEAKKzx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOndpZHRoPSI0MGRwIgorICAgICAgICBhbmRyb2lkOmhlaWdodD0iNDBkcCIKKyAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgorICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KKyAgICA8Z3JvdXA+CisgICAgICAgIDxjbGlwLXBhdGggYW5kcm9pZDpwYXRoRGF0YT0iTTAsMGgyNHYyNEgwVjB6IE0gMCwwIiAvPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xMiA1VjFMNyA2bDUgNVY3YzMuMyAwIDYgMi43IDYgNnMtMi43IDYsLTYgNiwtNiwtMi43LC02LC02SDRjMCA0LjQgMy42IDggOCA4czgsLTMuNiA4LC04LC0zLjYsLTgsLTgsLTh6bS0xLjEgMTFIMTB2LTMuM0w5IDEzdi0uN2wxLjgsLS42aC4xVjE2em00LjMsLTEuOGMwIC4zIDAgLjYsLS4xLjhsLS4zLjZzLS4zLjMsLS41LjMsLS40LjEsLS42LjEsLS40IDAsLS42LC0uMSwtLjMsLS4yLC0uNSwtLjMsLS4yLC0uMywtLjMsLS42LC0uMSwtLjUsLS4xLC0uOHYtLjdjMCwtLjMgMCwtLjYuMSwtLjhsLjMsLS42cy4zLC0uMy41LC0uMy40LC0uMS42LC0uMS40IDAgLjYuMWMuMi4xLjMuMi41LjNzLjIuMy4zLjYuMS41LjEuOHYuN3ptLS45LC0uOHYtLjVzLS4xLC0uMiwtLjEsLS4zLC0uMSwtLjEsLS4yLC0uMiwtLjIsLS4xLC0uMywtLjEsLS4yIDAsLS4zLjFsLS4yLjJzLS4xLjIsLS4xLjN2MnMuMS4yLjEuMy4xLjEuMi4yLjIuMS4zLjEuMiAwIC4zLC0uMWwuMiwtLjJzLjEsLS4yLjEsLS4zdi0xLjV6IgorICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgorICAgIDwvZ3JvdXA+Cis8L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2QueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVjYjZkMgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2QueG1sCkBAIC0wLDAgKzEsMTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgorICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgorICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQiCisgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQiPgorCisgICAgPHBhdGgKKyAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTAsMGgyNHYyNEgwVjB6IiAvPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIgorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTksM0g1QzMuODksMywzLDMuOSwzLDV2MTRjMCwxLjEsMC44OSwyLDIsMmgxNGMxLjEsMCwyLTAuOSwyLTJWNUMyMSwzLjksMjAuMSwzLDE5LDN6CitNMTMsOWg0YzAuNTUsMCwxLDAuNDUsMSwxdjQgYzAsMC41NS0wLjQ1LDEtMSwxaC00Vjl6CitNOS41LDEzLjV2LTFIN2MtMC41NSwwLTEtMC40NS0xLTFWMTBjMC0wLjU1LDAuNDUtMSwxLTFoM2MwLjU1LDAsMSwwLjQ1LDEsMXYxSDkuNXYtMC41aC0ydjFIMTAKK2MwLjU1LDAsMSwwLjQ1LDEsMVYxNGMwLDAuNTUtMC40NSwxLTEsMUg3Yy0wLjU1LDAtMS0wLjQ1LTEtMXYtMWgxLjV2MC41SDkuNXoKK00xNC41LDEzLjVoMnYtM2gtMlYxMy41eiIgLz4KKzwvdmVjdG9yPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2V0dGluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zZXR0aW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU5ZWNjMQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2V0dGluZ3MueG1sCkBAIC0wLDAgKzEsOSBAQAorPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCisgICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgorICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCisgICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xOS40MywxMi45OGMwLjA0LC0wLjMyIDAuMDcsLTAuNjQgMC4wNywtMC45OHMtMC4wMywtMC42NiAtMC4wNywtMC45OGwyLjExLC0xLjY1YzAuMTksLTAuMTUgMC4yNCwtMC40MiAwLjEyLC0wLjY0bC0yLC0zLjQ2Yy0wLjEyLC0wLjIyIC0wLjM5LC0wLjMgLTAuNjEsLTAuMjJsLTIuNDksMWMtMC41MiwtMC40IC0xLjA4LC0wLjczIC0xLjY5LC0wLjk4bC0wLjM4LC0yLjY1QzE0LjQ2LDIuMTggMTQuMjUsMiAxNCwyaC00Yy0wLjI1LDAgLTAuNDYsMC4xOCAtMC40OSwwLjQybC0wLjM4LDIuNjVjLTAuNjEsMC4yNSAtMS4xNywwLjU5IC0xLjY5LDAuOThsLTIuNDksLTFjLTAuMjMsLTAuMDkgLTAuNDksMCAtMC42MSwwLjIybC0yLDMuNDZjLTAuMTMsMC4yMiAtMC4wNywwLjQ5IDAuMTIsMC42NGwyLjExLDEuNjVjLTAuMDQsMC4zMiAtMC4wNywwLjY1IC0wLjA3LDAuOThzMC4wMywwLjY2IDAuMDcsMC45OGwtMi4xMSwxLjY1Yy0wLjE5LDAuMTUgLTAuMjQsMC40MiAtMC4xMiwwLjY0bDIsMy40NmMwLjEyLDAuMjIgMC4zOSwwLjMgMC42MSwwLjIybDIuNDksLTFjMC41MiwwLjQgMS4wOCwwLjczIDEuNjksMC45OGwwLjM4LDIuNjVjMC4wMywwLjI0IDAuMjQsMC40MiAwLjQ5LDAuNDJoNGMwLjI1LDAgMC40NiwtMC4xOCAwLjQ5LC0wLjQybDAuMzgsLTIuNjVjMC42MSwtMC4yNSAxLjE3LC0wLjU5IDEuNjksLTAuOThsMi40OSwxYzAuMjMsMC4wOSAwLjQ5LDAgMC42MSwtMC4yMmwyLC0zLjQ2YzAuMTIsLTAuMjIgMC4wNywtMC40OSAtMC4xMiwtMC42NGwtMi4xMSwtMS42NXpNMTIsMTUuNWMtMS45MywwIC0zLjUsLTEuNTcgLTMuNSwtMy41czEuNTcsLTMuNSAzLjUsLTMuNSAzLjUsMS41NyAzLjUsMy41IC0xLjU3LDMuNSAtMy41LDMuNXoiCisgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Cis8L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2tpcF9uZXh0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2tpcF9uZXh0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWYyODEyCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19za2lwX25leHQueG1sCkBAIC0wLDAgKzEsOSBAQAorPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6d2lkdGg9IjQwZHAiCisgICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSI0MGRwIgorICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCisgICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik02LDE4bDguNSwtNkw2LDZ2MTJ6TTE2LDZ2MTJoMlY2aC0yeiIKKyAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KKzwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19za2lwX3ByZXZpb3VzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2tpcF9wcmV2aW91cy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFkYTMxNAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2tpcF9wcmV2aW91cy54bWwKQEAgLTAsMCArMSw5IEBACis8dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDp3aWR0aD0iNDBkcCIKKyAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjQwZHAiCisgICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKKyAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+CisgICAgPHBhdGgKKyAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTYsNmgydjEyTDYsMTh6TTkuNSwxMmw4LjUsNkwxOCw2eiIKKyAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KKzwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zdWJ0aXRsZV9vZmYueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zdWJ0aXRsZV9vZmYueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYTcyN2EKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3N1YnRpdGxlX29mZi54bWwKQEAgLTAsMCArMSwxOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCisgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCisgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNCIKKyAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNCI+CisKKyAgICA8cGF0aAorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMCwwaDI0djI0SDBWMHoiIC8+CisgICAgPHBhdGgKKyAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xOS41LDUuNXYxM2gtMTV2LTEzSDE5LjV6IE0xOSw0SDVDMy44OSw0LDMsNC45LDMsNnYxMmMwLDEuMSwwLjg5LDIsMiwyaDE0YzEuMSwwLDItMC45LDItMlY2QzIxLDQuOSwyMC4xLDQsMTksNEwxOSw0eiIgLz4KKyAgICA8cGF0aAorICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIKKyAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTExLDExSDkuNXYtMC41aC0ydjNoMlYxM0gxMXYxYzAsMC41NS0wLjQ1LDEtMSwxSDdjLTAuNTUsMC0xLTAuNDUtMS0xdi00YzAtMC41NSwwLjQ1LTEsMS0xaDNjMC41NSwwLDEsMC40NSwxLDFWMTF6IiAvPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIgorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTgsMTFoLTEuNXYtMC41aC0ydjNoMlYxM0gxOHYxYzAsMC41NS0wLjQ1LDEtMSwxaC0zYy0wLjU1LDAtMS0wLjQ1LTEtMXYtNGMwLTAuNTUsMC40NS0xLDEtMWgzYzAuNTUsMCwxLDAuNDUsMSwxVjExeiIgLz4KKzwvdmVjdG9yPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc3VidGl0bGVfb24ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zdWJ0aXRsZV9vbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M5MWMwNgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc3VidGl0bGVfb24ueG1sCkBAIC0wLDAgKzEsMTMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgorICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgorICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQiCisgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQiPgorCisgICAgPHBhdGgKKyAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTAgMGgyNHYyNEgweiIgLz4KKyAgICA8cGF0aAorICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIKKyAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE5IDRINWMtMS4xMSAwLTIgMC45LTIgMnYxMmMwIDEuMSAwLjg5IDIgMiAyaDE0YzEuMSAwIDItMC45IDItMlY2YzAtMS4xLTAuOS0yLTItMnptLTggN0g5LjV2LTAuNWgtMnYzaDJWMTNIMTF2MWMwIDAuNTUtMC40NSAxLTEgMUg3Yy0wLjU1IDAtMS0wLjQ1LTEtMXYtNGMwLTAuNTUgMC40NSAtMSAxLTFoM2MwLjU1IDAgMSAwLjQ1IDEgMXYxem03IDBoLTEuNXYtMC41aC0ydjNoMlYxM0gxOHYxYzAgMC41NS0wLjQ1IDEtMSAxaC0zYy0wLjU1IDAtMS0wLjQ1LTEtMXYtNGMwLTAuNTUgMC40NSAtMSAxLTFoM2MwLjU1IDAgMSAwLjQ1IDEgMXYxeiIgLz4KKzwvdmVjdG9yPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfdW5tdXRlLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfdW5tdXRlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGZiMmI5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY191bm11dGUueG1sCkBAIC0wLDAgKzEsOSBAQAorPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCisgICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgorICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCisgICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0zLDl2Nmg0bDUsNUwxMiw0TDcsOUwzLDl6TTE2LjUsMTJjMCwtMS43NyAtMS4wMiwtMy4yOSAtMi41LC00LjAzdjguMDVjMS40OCwtMC43MyAyLjUsLTIuMjUgMi41LC00LjAyek0xNCwzLjIzdjIuMDZjMi44OSwwLjg2IDUsMy41NCA1LDYuNzFzLTIuMTEsNS44NSAtNSw2LjcxdjIuMDZjNC4wMSwtMC45MSA3LC00LjQ5IDcsLTguNzdzLTIuOTksLTcuODYgLTcsLTguNzd6IgorICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgorPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0ZWRfZGFyay54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0ZWRfZGFyay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEwZmYxMwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RlZF9kYXJrLnhtbApAQCAtMCwwICsxLDUxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxhbmltYXRpb24tbGlzdAorICAgICAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6b25lc2hvdD0idHJ1ZSI+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Cis8L2FuaW1hdGlvbi1saXN0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGVkX2xpZ2h0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RlZF9saWdodC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNmYzdmZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RlZF9saWdodC54bWwKQEAgLTAsMCArMSw1MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8YW5pbWF0aW9uLWxpc3QKKyAgICAgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOm9uZXNob3Q9InRydWUiPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKzwvYW5pbWF0aW9uLWxpc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0aW5nX2RhcmsueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGluZ19kYXJrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWFmN2IzCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGluZ19kYXJrLnhtbApAQCAtMCwwICsxLDUxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxhbmltYXRpb24tbGlzdAorICAgICAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6b25lc2hvdD0iZmFsc2UiPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKzwvYW5pbWF0aW9uLWxpc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0aW5nX2xpZ2h0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RpbmdfbGlnaHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYjQxNzAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0aW5nX2xpZ2h0LnhtbApAQCAtMCwwICsxLDUxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxhbmltYXRpb24tbGlzdAorICAgICAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6b25lc2hvdD0iZmFsc2UiPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Cis8L2FuaW1hdGlvbi1saXN0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fZGFyay54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9kYXJrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjFkZmFhCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fZGFyay54bWwKQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGVkX2RhcmsiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2FibGU9InRydWUiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGluZ19kYXJrIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrIiAvPgorPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2xpZ2h0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2xpZ2h0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDNkODRlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fbGlnaHQueG1sCkBAIC0wLDAgKzEsMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RlZF9saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrYWJsZT0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0aW5nX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQiIC8+Cis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfY2xvc2VfZGFyay54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19jbG9zZV9kYXJrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODhjOGM3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfY2xvc2VfZGFyay54bWwKQEAgLTAsMCArMSwxOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZGlhbG9nX2Nsb3NlX2RhcmsiIC8+Cis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfY2xvc2VfbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfY2xvc2VfbGlnaHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNTBlMGYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19jbG9zZV9saWdodC54bWwKQEAgLTAsMCArMSwyNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbT4KKyAgICAgICAgPGJpdG1hcAorICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19kaWFsb2dfY2xvc2VfbGlnaHQiCisgICAgICAgICAgICBhbmRyb2lkOmFscGhhPSIwLjg3IiAvPgorICAgIDwvaXRlbT4KKworPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZGlhbG9nX21hdGVyaWFsX2JhY2tncm91bmRfZGFyay54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19tYXRlcmlhbF9iYWNrZ3JvdW5kX2RhcmsueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYzdlY2EKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19tYXRlcmlhbF9iYWNrZ3JvdW5kX2RhcmsueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSBUaGlzIGlzIHRoZSBjb3B5IG9mIEBkcmF3YWJsZS9hYmNfZGlhbG9nX21hdGVyaWFsX2JhY2tncm91bmRfZGFyayBleGNlcHQgZm9yIGluc2V0CisgICAgIHdoaWNoIGluY2x1ZGVzIHVubmVjZXNzYXJ5IHBhZGRpbmcuIC0tPgorPHNoYXBlIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDpzaGFwZT0icmVjdGFuZ2xlIj4KKyAgICA8Y29ybmVycyBhbmRyb2lkOnJhZGl1cz0iMmRwIiAvPgorICAgIDxzb2xpZCBhbmRyb2lkOmNvbG9yPSJAY29sb3IvYmFja2dyb3VuZF9mbG9hdGluZ19tYXRlcmlhbF9kYXJrIiAvPgorPC9zaGFwZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19tYXRlcmlhbF9iYWNrZ3JvdW5kX2xpZ2h0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZGlhbG9nX21hdGVyaWFsX2JhY2tncm91bmRfbGlnaHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYjIzNWEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19tYXRlcmlhbF9iYWNrZ3JvdW5kX2xpZ2h0LnhtbApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gVGhpcyBpcyB0aGUgY29weSBvZiBAZHJhd2FibGUvYWJjX2RpYWxvZ19tYXRlcmlhbF9iYWNrZ3JvdW5kX2xpZ2h0IGV4Y2VwdCBmb3IgaW5zZXQKKyAgICAgd2hpY2ggaW5jbHVkZXMgdW5uZWNlc3NhcnkgcGFkZGluZy4gLS0+Cis8c2hhcGUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOnNoYXBlPSJyZWN0YW5nbGUiPgorICAgIDxjb3JuZXJzIGFuZHJvaWQ6cmFkaXVzPSIyZHAiIC8+CisgICAgPHNvbGlkIGFuZHJvaWQ6Y29sb3I9IkBjb2xvci9iYWNrZ3JvdW5kX2Zsb2F0aW5nX21hdGVyaWFsX2xpZ2h0IiAvPgorPC9zaGFwZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2dyb3VwX2NvbGxhcHNlLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZ3JvdXBfY29sbGFwc2UueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNzJiYzgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2dyb3VwX2NvbGxhcHNlLnhtbApAQCAtMCwwICsxLDM1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxhbmltYXRpb24tbGlzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6b25lc2hvdD0idHJ1ZSI+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzAwIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMDEiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8wMiIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzAzIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMDQiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8wNSIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzA2IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMDciIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8wOCIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzA5IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMTAiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8xMSIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzEyIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMTMiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8xNCIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzE1IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KKzwvYW5pbWF0aW9uLWxpc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2dyb3VwX2V4cGFuZC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2dyb3VwX2V4cGFuZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIzZmRiNgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZ3JvdXBfZXhwYW5kLnhtbApAQCAtMCwwICsxLDM1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxhbmltYXRpb24tbGlzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6b25lc2hvdD0idHJ1ZSI+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2V4cGFuZF8wMCIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2V4cGFuZF8wMSIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2V4cGFuZF8wMiIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2V4cGFuZF8wMyIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2V4cGFuZF8wNCIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2V4cGFuZF8wNSIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2V4cGFuZF8wNiIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2V4cGFuZF8wNyIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2V4cGFuZF8wOCIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2V4cGFuZF8wOSIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2V4cGFuZF8xMCIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2V4cGFuZF8xMSIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2V4cGFuZF8xMiIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2V4cGFuZF8xMyIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2V4cGFuZF8xNCIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2V4cGFuZF8xNSIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Cis8L2FuaW1hdGlvbi1saXN0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wYXVzZV9kYXJrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGF1c2VfZGFyay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYyMThhNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGF1c2VfZGFyay54bWwKQEAgLTAsMCArMSwxOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbWVkaWFfcGF1c2VfZGFyayIgLz4KKzwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3BhdXNlX2xpZ2h0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGF1c2VfbGlnaHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZDFmMDIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3BhdXNlX2xpZ2h0LnhtbApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtPgorICAgICAgICA8Yml0bWFwCisgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX21lZGlhX3BhdXNlX2xpZ2h0IgorICAgICAgICAgICAgYW5kcm9pZDphbHBoYT0iMC44NyIgLz4KKyAgICA8L2l0ZW0+Cis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wbGF5X2RhcmsueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wbGF5X2RhcmsueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNDVhMzMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3BsYXlfZGFyay54bWwKQEAgLTAsMCArMSwxOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbWVkaWFfcGxheV9kYXJrIiAvPgorPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGxheV9saWdodC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3BsYXlfbGlnaHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZmI3YTYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3BsYXlfbGlnaHQueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0+CisgICAgICAgIDxiaXRtYXAKKyAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfbWVkaWFfcGxheV9saWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YWxwaGE9IjAuODciIC8+CisgICAgPC9pdGVtPgorPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfc3RvcF9kYXJrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfc3RvcF9kYXJrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTEwOGE5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9zdG9wX2RhcmsueG1sCkBAIC0wLDAgKzEsMTkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21lZGlhX3N0b3BfZGFyayIgLz4KKzwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3N0b3BfbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9zdG9wX2xpZ2h0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmM2Y2U4Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9zdG9wX2xpZ2h0LnhtbApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtPgorICAgICAgICA8Yml0bWFwCisgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX21lZGlhX3N0b3BfbGlnaHQiCisgICAgICAgICAgICBhbmRyb2lkOmFscGhhPSIwLjg3IiAvPgorICAgIDwvaXRlbT4KKzwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX3ZvbF90eXBlX2F1ZGlvdHJhY2tfZGFyay54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX3ZvbF90eXBlX2F1ZGlvdHJhY2tfZGFyay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRmNGZkNgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfdm9sX3R5cGVfYXVkaW90cmFja19kYXJrLnhtbApAQCAtMCwwICsxLDE5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19hdWRpb3RyYWNrX2RhcmsiIC8+Cis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2xpZ2h0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfdm9sX3R5cGVfYXVkaW90cmFja19saWdodC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM5ZGJjMAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfdm9sX3R5cGVfYXVkaW90cmFja19saWdodC54bWwKQEAgLTAsMCArMSwyMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbT4KKyAgICAgICAgPGJpdG1hcAorICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19hdWRpb3RyYWNrX2xpZ2h0IgorICAgICAgICAgICAgYW5kcm9pZDphbHBoYT0iMC44NyIgLz4KKyAgICA8L2l0ZW0+Cis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9pbnRlcnBvbGF0b3IvbXJfZmFzdF9vdXRfc2xvd19pbi54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2ludGVycG9sYXRvci9tcl9mYXN0X291dF9zbG93X2luLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjZhMTcxCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9pbnRlcnBvbGF0b3IvbXJfZmFzdF9vdXRfc2xvd19pbi54bWwKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgfiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgIH4KKyAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIH4KKyAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICB+CisgIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgIC0tPgorCis8cGF0aEludGVycG9sYXRvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpjb250cm9sWDE9IjAuNCIKKyAgICBhbmRyb2lkOmNvbnRyb2xZMT0iMCIKKyAgICBhbmRyb2lkOmNvbnRyb2xYMj0iMC4yIgorICAgIGFuZHJvaWQ6Y29udHJvbFkyPSIxIi8+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2ludGVycG9sYXRvci9tcl9saW5lYXJfb3V0X3Nsb3dfaW4ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9pbnRlcnBvbGF0b3IvbXJfbGluZWFyX291dF9zbG93X2luLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGJmMjk4Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9pbnRlcnBvbGF0b3IvbXJfbGluZWFyX291dF9zbG93X2luLnhtbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICB+IENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAgfgorICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgfgorICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIH4KKyAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAgLS0+CisKKzxwYXRoSW50ZXJwb2xhdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmNvbnRyb2xYMT0iMCIKKyAgICBhbmRyb2lkOmNvbnRyb2xZMT0iMCIKKyAgICBhbmRyb2lkOmNvbnRyb2xYMj0iMC4yIgorICAgIGFuZHJvaWQ6Y29udHJvbFkyPSIxIi8+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF9tdXNpYy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF9tdXNpYy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U0ZDM2NQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX211c2ljLnhtbApAQCAtMCwwICsxLDM5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgorCisgICAgPFZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZHAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMC4yNSIvPgorCisgICAgPEltYWdlVmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FsYnVtIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwLjUiCisgICAgICAgIGFuZHJvaWQ6c2NhbGVUeXBlPSJmaXRDZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfZGVmYXVsdF9hbGJ1bV9pbWFnZSIgLz4KKworICAgIDxWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAuMjUiLz4KKzwvTGluZWFyTGF5b3V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX3NldHRpbmdzX2xpc3RfaXRlbS54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF9zZXR0aW5nc19saXN0X2l0ZW0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNTZkY2EKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF9zZXR0aW5nc19saXN0X2l0ZW0ueG1sCkBAIC0wLDAgKzEsNjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2hlaWdodCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGNvbG9yL2JsYWNrX29wYWNpdHlfNzAiPgorCisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2hlaWdodCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgorCisgICAgICAgIDxJbWFnZVZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaWNvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19pY29uX3NpemUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2ljb25fc2l6ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbj0iOGRwIgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICA8UmVsYXRpdmVMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19oZWlnaHQiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+CisKKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL21haW5fdGV4dCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX3RleHRfaGVpZ2h0IgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyZHAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iQGNvbG9yL3doaXRlIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfbWFpbl90ZXh0X3NpemUiLz4KKworICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3ViX3RleHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc190ZXh0X2hlaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvbWFpbl90ZXh0IgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyZHAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iQGNvbG9yL3doaXRlX29wYWNpdHlfNzAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19zdWJfdGV4dF9zaXplIi8+CisgICAgPC9SZWxhdGl2ZUxheW91dD4KKzwvTGluZWFyTGF5b3V0PgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF9zdWJfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX3N1Yl9zZXR0aW5nc19saXN0X2l0ZW0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NDdhNzIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF9zdWJfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbApAQCAtMCwwICsxLDUzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19oZWlnaHQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBjb2xvci9ibGFja19vcGFjaXR5XzcwIj4KKworICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19oZWlnaHQiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KKworICAgICAgICA8SW1hZ2VWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2NoZWNrIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2ljb25fc2l6ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaWNvbl9zaXplIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luPSI4ZHAiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfY2hlY2siLz4KKyAgICA8L0xpbmVhckxheW91dD4KKworICAgIDxSZWxhdGl2ZUxheW91dAorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2hlaWdodCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KKworICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGV4dCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX3RleHRfaGVpZ2h0IgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyZHAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iQGNvbG9yL3doaXRlIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfbWFpbl90ZXh0X3NpemUiLz4KKyAgICA8L1JlbGF0aXZlTGF5b3V0PgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF90cmFuc3BvcnRfY29udHJvbHMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZW1iZWRkZWRfdHJhbnNwb3J0X2NvbnRyb2xzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2E1OTU3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZW1iZWRkZWRfdHJhbnNwb3J0X2NvbnRyb2xzLnhtbApAQCAtMCwwICsxLDMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSJAZGltZW4vbWN2Ml90cmFuc3BvcnRfY29udHJvbHNfcGFkZGluZyIKKyAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iQGRpbWVuL21jdjJfdHJhbnNwb3J0X2NvbnRyb2xzX3BhZGRpbmciCisgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJ2aXNpYmxlIj4KKworICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3ByZXYiIHN0eWxlPSJAc3R5bGUvRW1iZWRkZWRUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5QcmV2aW91cyIgLz4KKyAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9yZXciIHN0eWxlPSJAc3R5bGUvRW1iZWRkZWRUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5SZXciIC8+CisgICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvcGF1c2UiIHN0eWxlPSJAc3R5bGUvRW1iZWRkZWRUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5QYXVzZSIgLz4KKyAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9mZndkIiBzdHlsZT0iQHN0eWxlL0VtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uRmZ3ZCIgLz4KKyAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9uZXh0IiBzdHlsZT0iQHN0eWxlL0VtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uTmV4dCIgLz4KKzwvTGluZWFyTGF5b3V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfbGFuZHNjYXBlX211c2ljLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfbGFuZHNjYXBlX211c2ljLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2U3MDU4Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9sYW5kc2NhcGVfbXVzaWMueG1sCkBAIC0wLDAgKzEsNTQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNCMzAwRkYwMCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KKworICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tdXNpY19pbWFnZSIKKyAgICAgICAgc3R5bGU9IkBzdHlsZS9GdWxsTXVzaWNMYW5kc2NhcGUuSW1hZ2UiPgorCisgICAgICAgIDxJbWFnZVZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWxidW0iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL21jdjJfZnVsbF9hbGJ1bV9pbWFnZV9sYW5kc2NhcGVfc2l6ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9hbGJ1bV9pbWFnZV9sYW5kc2NhcGVfc2l6ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfZGVmYXVsdF9hbGJ1bV9pbWFnZSIvPgorICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL211c2ljX3RleHQiCisgICAgICAgIHN0eWxlPSJAc3R5bGUvRnVsbE11c2ljTGFuZHNjYXBlLlRleHQiPgorCisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aXRsZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9tY3YyX211c2ljX3RpdGxlX3Vua25vd25fdGV4dCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjIwc3AiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0iYm9sZCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjRkZGRkZGIiAvPgorICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYXJ0aXN0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL21jdjJfbXVzaWNfYXJ0aXN0X3Vua25vd25fdGV4dCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE2c3AiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iI0JCQkJCQiIgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKzwvTGluZWFyTGF5b3V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfcG9ydHJhaXRfbXVzaWMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9wb3J0cmFpdF9tdXNpYy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVmMWJiMwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfcG9ydHJhaXRfbXVzaWMueG1sCkBAIC0wLDAgKzEsNTMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+CisKKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXVzaWNfaW1hZ2UiCisgICAgICAgIHN0eWxlPSJAc3R5bGUvRnVsbE11c2ljUG9ydHJhaXQuSW1hZ2UiPgorCisgICAgICAgIDxJbWFnZVZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWxidW0iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL21jdjJfZnVsbF9hbGJ1bV9pbWFnZV9wb3J0cmFpdF9zaXplIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX2FsYnVtX2ltYWdlX3BvcnRyYWl0X3NpemUiCisgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX2RlZmF1bHRfYWxidW1faW1hZ2UiLz4KKyAgICA8L0xpbmVhckxheW91dD4KKworICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tdXNpY190ZXh0IgorICAgICAgICBzdHlsZT0iQHN0eWxlL0Z1bGxNdXNpY1BvcnRyYWl0LlRleHQiPgorCisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aXRsZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJAZGltZW4vbWN2Ml9mdWxsX2FsYnVtX2ltYWdlX3BvcnRyYWl0X3NpemUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9tY3YyX211c2ljX3RpdGxlX3Vua25vd25fdGV4dCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjIwc3AiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0iYm9sZCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjRkZGRkZGIiAvPgorICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYXJ0aXN0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tY3YyX2Z1bGxfYWxidW1faW1hZ2VfcG9ydHJhaXRfc2l6ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL21jdjJfbXVzaWNfYXJ0aXN0X3Vua25vd25fdGV4dCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE2c3AiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iI0JCQkJCQiIgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKzwvTGluZWFyTGF5b3V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTJlYTVlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9zZXR0aW5nc19saXN0X2l0ZW0ueG1sCkBAIC0wLDAgKzEsNjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaGVpZ2h0IgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAY29sb3IvYmxhY2tfb3BhY2l0eV83MCI+CisKKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19oZWlnaHQiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KKworICAgICAgICA8SW1hZ2VWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2ljb24iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19pY29uX3NpemUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaWNvbl9zaXplIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luPSI4ZHAiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIvPgorICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgPFJlbGF0aXZlTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19oZWlnaHQiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+CisKKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL21haW5fdGV4dCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfdGV4dF9oZWlnaHQiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyZHAiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAY29sb3Ivd2hpdGUiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX21haW5fdGV4dF9zaXplIi8+CisKKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N1Yl90ZXh0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc190ZXh0X2hlaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvbWFpbl90ZXh0IgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyZHAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iQGNvbG9yL3doaXRlX29wYWNpdHlfNzAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX3N1Yl90ZXh0X3NpemUiLz4KKyAgICA8L1JlbGF0aXZlTGF5b3V0PgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX3N1Yl9zZXR0aW5nc19saXN0X2l0ZW0ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9zdWJfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTEyOGQwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9zdWJfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbApAQCAtMCwwICsxLDUzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX2hlaWdodCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGNvbG9yL2JsYWNrX29wYWNpdHlfNzAiPgorCisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaGVpZ2h0IgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI+CisKKyAgICAgICAgPEltYWdlVmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9jaGVjayIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX2ljb25fc2l6ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19pY29uX3NpemUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW49IjhkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19jaGVjayIvPgorICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgPFJlbGF0aXZlTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19oZWlnaHQiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+CisKKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RleHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX3RleHRfaGVpZ2h0IgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyZHAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iQGNvbG9yL3doaXRlIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19tYWluX3RleHRfc2l6ZSIvPgorICAgIDwvUmVsYXRpdmVMYXlvdXQ+Cis8L0xpbmVhckxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX3RyYW5zcG9ydF9jb250cm9scy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX3RyYW5zcG9ydF9jb250cm9scy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkxNDc4NQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfdHJhbnNwb3J0X2NvbnRyb2xzLnhtbApAQCAtMCwwICsxLDMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSJAZGltZW4vbWN2Ml90cmFuc3BvcnRfY29udHJvbHNfcGFkZGluZyIKKyAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iQGRpbWVuL21jdjJfdHJhbnNwb3J0X2NvbnRyb2xzX3BhZGRpbmciCisgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJ2aXNpYmxlIj4KKworICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3ByZXYiIHN0eWxlPSJAc3R5bGUvRnVsbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLlByZXZpb3VzIiAvPgorICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3JldyIgc3R5bGU9IkBzdHlsZS9GdWxsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uUmV3IiAvPgorICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3BhdXNlIiBzdHlsZT0iQHN0eWxlL0Z1bGxUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5QYXVzZSIgLz4KKyAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9mZndkIiBzdHlsZT0iQHN0eWxlL0Z1bGxUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5GZndkIiAvPgorICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL25leHQiIHN0eWxlPSJAc3R5bGUvRnVsbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLk5leHQiIC8+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21lZGlhX2NvbnRyb2xsZXIueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbWVkaWFfY29udHJvbGxlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY1OGYwNAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21lZGlhX2NvbnRyb2xsZXIueG1sCkBAIC0wLDAgKzEsMjY1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bGF5b3V0RGlyZWN0aW9uPSJsdHIiPgorCisgICAgPFJlbGF0aXZlTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGl0bGVfYmFyIgorICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBsYXlvdXQvdGl0bGVfYmFyX2dyYWRpZW50IgorICAgICAgICBzdHlsZT0iQHN0eWxlL1RpdGxlQmFyIj4KKworICAgICAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlX2Jhcl9sZWZ0IgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudExlZnQ9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgorCisgICAgICAgICAgICA8SW1hZ2VCdXR0b24KKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2JhY2siCisgICAgICAgICAgICAgICAgYW5kcm9pZDpjbGlja2FibGU9InRydWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFN0YXJ0PSJ0cnVlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjVkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJ2aXNpYmxlIgorICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvVGl0bGVCYXJCdXR0b24uQmFjayIvPgorCisgICAgICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlX3RleHQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9ImVuZCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvUmlnaHRPZj0iQGlkL2JhY2siCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDptYXhMaW5lcz0iMSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI1ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI1ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE1c3AiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiNGRkZGRkZGRiIvPgorICAgICAgICA8L0xpbmVhckxheW91dD4KKworICAgICAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlX2Jhcl9yaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRSaWdodD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI+CisKKyAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FkX2V4dGVybmFsX2xpbmsiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpjbGlja2FibGU9InRydWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFJpZ2h0PSJ0cnVlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjVkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjEwZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIj4KKworICAgICAgICAgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FkX3RleHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjVkaXAiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9NZWRpYUNvbnRyb2xWaWV3Ml9hZF90ZXh0IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxMHNwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iI0ZGRkZGRkZGIiAvPgorCisgICAgICAgICAgICAgICAgPEltYWdlQnV0dG9uCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWRfbGF1bmNoIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiCisgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvVGl0bGVCYXJCdXR0b24uTGF1bmNoIiAvPgorICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICAgICAgICAgIDx2aWV3IGNsYXNzPSJjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcC5NZWRpYVJvdXRlQnV0dG9uIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2FzdCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb249IkBzdHJpbmcvbXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iCisgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9UaXRsZUJhckJ1dHRvbiIgLz4KKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICA8L1JlbGF0aXZlTGF5b3V0PgorCisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2NlbnRlcl92aWV3IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgorICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL21pbmltYWxfZXh0cmFfdmlldyIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0icmlnaHQiPgorCisgICAgICAgIDxJbWFnZUJ1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9mdWxsc2NyZWVuIgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvQm90dG9tQmFyQnV0dG9uLkZ1bGxTY3JlZW4iIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICA8UmVsYXRpdmVMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9jdXN0b21fcHJvZ3Jlc3NfdGh1bWJfc2l6ZSI+CisKKyAgICAgICAgPFNlZWtCYXIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvcHJvZ3Jlc3MiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9jdXN0b21fcHJvZ3Jlc3NfdGh1bWJfc2l6ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uPSJAc3RyaW5nL21jdjJfc2Vla19iYXJfZGVzYyIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZz0iMGRwIgorICAgICAgICAgICAgYW5kcm9pZDptYXhIZWlnaHQ9IkBkaW1lbi9tY3YyX2N1c3RvbV9wcm9ncmVzc19tYXhfc2l6ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSJAZGltZW4vbWN2Ml9jdXN0b21fcHJvZ3Jlc3NfbWF4X3NpemUiCisgICAgICAgICAgICBhbmRyb2lkOmVsZXZhdGlvbj0iMTBkcCIvPgorCisgICAgICAgIDxWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3Byb2dyZXNzX2J1ZmZlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2J1ZmZlcl92aWV3X2hlaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50Qm90dG9tPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAY29sb3IvYm90dG9tX2Jhcl9iYWNrZ3JvdW5kIgorICAgICAgICAgICAgYW5kcm9pZDplbGV2YXRpb249IjBkcCIvPgorICAgIDwvUmVsYXRpdmVMYXlvdXQ+CisKKyAgICA8UmVsYXRpdmVMYXlvdXQKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9ib3R0b21fYmFyIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjQ0ZHAiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGNvbG9yL2JvdHRvbV9iYXJfYmFja2dyb3VuZCI+CisKKyAgICAgICAgPExpbmVhckxheW91dAorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9ib3R0b21fYmFyX2xlZnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFN0YXJ0PSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiPgorCisgICAgICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FkX3NraXBfdGltZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjRkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxMnNwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjRkZGRkZGIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgLz4KKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICAgICAgPExpbmVhckxheW91dAorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aW1lIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9SaWdodE9mPSJAaWQvYm90dG9tX2Jhcl9sZWZ0IgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMTBkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxMGRwIgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiID4KKworICAgICAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aW1lX2N1cnJlbnQiCisgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9UaW1lVGV4dC5DdXJyZW50Ii8+CisgICAgICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpbWVfaW50ZXJwdW5jdCIKKyAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1RpbWVUZXh0LkludGVycHVuY3QiLz4KKyAgICAgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGltZV9lbmQiCisgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9UaW1lVGV4dC5FbmQiLz4KKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICAgICAgPExpbmVhckxheW91dAorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9ib3R0b21fYmFyX3JpZ2h0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRFbmQ9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9InJpZ2h0Ij4KKworICAgICAgICAgICAgPExpbmVhckxheW91dAorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYmFzaWNfY29udHJvbHMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIiA+CisKKyAgICAgICAgICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hZF9yZW1haW5pbmciCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTJzcCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiNGRkZGRkYiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgLz4KKworICAgICAgICAgICAgICAgIDxJbWFnZUJ1dHRvbgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL211dGUiCisgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvQm90dG9tQmFyQnV0dG9uLk11dGUiIC8+CisgICAgICAgICAgICAgICAgPEltYWdlQnV0dG9uCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3VidGl0bGUiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2NhbGVUeXBlPSJmaXRDZW50ZXIiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKKyAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9Cb3R0b21CYXJCdXR0b24uQ0MiIC8+CisgICAgICAgICAgICAgICAgPEltYWdlQnV0dG9uCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZnVsbHNjcmVlbiIKKyAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9Cb3R0b21CYXJCdXR0b24uRnVsbFNjcmVlbiIvPgorICAgICAgICAgICAgICAgIDxJbWFnZUJ1dHRvbgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL292ZXJmbG93X3JpZ2h0IgorICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0JvdHRvbUJhckJ1dHRvbi5PdmVyZmxvd1JpZ2h0Ii8+CisgICAgICAgICAgICA8L0xpbmVhckxheW91dD4KKworICAgICAgICAgICAgPExpbmVhckxheW91dAorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZXh0cmFfY29udHJvbHMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCI+CisKKyAgICAgICAgICAgICAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY3VzdG9tX2J1dHRvbnMiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgorCisgICAgICAgICAgICAgICAgPEltYWdlQnV0dG9uCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdmlkZW9fcXVhbGl0eSIKKyAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9Cb3R0b21CYXJCdXR0b24uVmlkZW9RdWFsaXR5IiAvPgorICAgICAgICAgICAgICAgIDxJbWFnZUJ1dHRvbgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NldHRpbmdzIgorICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0JvdHRvbUJhckJ1dHRvbi5TZXR0aW5ncyIgLz4KKyAgICAgICAgICAgICAgICA8SW1hZ2VCdXR0b24KKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9vdmVyZmxvd19sZWZ0IgorICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0JvdHRvbUJhckJ1dHRvbi5PdmVyZmxvd0xlZnQiLz4KKyAgICAgICAgICAgIDwvTGluZWFyTGF5b3V0PgorICAgICAgICA8L0xpbmVhckxheW91dD4KKyAgICA8L1JlbGF0aXZlTGF5b3V0PgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9taW5pbWFsX3RyYW5zcG9ydF9jb250cm9scy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9taW5pbWFsX3RyYW5zcG9ydF9jb250cm9scy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAwYzgwYgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21pbmltYWxfdHJhbnNwb3J0X2NvbnRyb2xzLnhtbApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI+CisKKyAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9wYXVzZSIgc3R5bGU9IkBzdHlsZS9NaW5pbWFsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24iIC8+Cis8L0xpbmVhckxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jaG9vc2VyX2RpYWxvZy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jaG9vc2VyX2RpYWxvZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU4OWUxNgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21yX2Nob29zZXJfZGlhbG9nLnhtbApAQCAtMCwwICsxLDU1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+CisgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfY2hvb3Nlcl90aXRsZSIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMjRkcCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjI0ZHAiCisgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iMjRkcCIKKyAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL21yX2Nob29zZXJfdGl0bGUiCisgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9ImVuZCIKKyAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlRpdGxlIiAvPgorICAgIDxMaXN0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX2Nob29zZXJfbGlzdCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpkaXZpZGVyPSJAYW5kcm9pZDpjb2xvci90cmFuc3BhcmVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpkaXZpZGVySGVpZ2h0PSIwZHAiIC8+CisgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9lbXB0eSIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjI0MGRwIgorICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSI5MGRwIgorICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIxNmRwIgorICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTZkcCIKKyAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIj4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9tcl9jaG9vc2VyX3NlYXJjaGluZyIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5NZWRpYVJvdXRlci5TZWNvbmRhcnlUZXh0IiAvPgorICAgICAgICA8UHJvZ3Jlc3NCYXIgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjE1MGRwIgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmluZGV0ZXJtaW5hdGU9InRydWUiCisgICAgICAgICAgICAgICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci9wcm9ncmVzc0JhclN0eWxlSG9yaXpvbnRhbCIgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY2hvb3Nlcl9saXN0X2l0ZW0ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY2hvb3Nlcl9saXN0X2l0ZW0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ODg3OWIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jaG9vc2VyX2xpc3RfaXRlbS54bWwKQEAgLTAsMCArMSw1MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDptaW5IZWlnaHQ9IjU2ZHAiCisgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjI0ZHAiCisgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIyNGRwIgorICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIgPgorCisgICAgPEltYWdlVmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX2Nob29zZXJfcm91dGVfaWNvbiIKKyAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIyNGRwIgorICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIyNGRwIgorICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjI0ZHAiIC8+CisKKyAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIxZHAiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIgPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX2Nob29zZXJfcm91dGVfbmFtZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMzJkcCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJtYXJxdWVlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlByaW1hcnlUZXh0IiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX2Nob29zZXJfcm91dGVfZGVzYyIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMjRkcCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJtYXJxdWVlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlNlY29uZGFyeVRleHQiIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY29udHJvbGxlcl9tYXRlcmlhbF9kaWFsb2dfYi54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jb250cm9sbGVyX21hdGVyaWFsX2RpYWxvZ19iLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzA0NDcxCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY29udHJvbGxlcl9tYXRlcmlhbF9kaWFsb2dfYi54bWwKQEAgLTAsMCArMSwyMDYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPEZyYW1lTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmlkPSJAK2lkL21yX2V4cGFuZGFibGVfYXJlYSIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCI+CisgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL21yX2RpYWxvZ19hcmVhIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9Ij9hbmRyb2lkOmF0dHIvY29sb3JCYWNrZ3JvdW5kRmxvYXRpbmciPgorICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvbXJfdGl0bGVfYmFyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyNGRwIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjEyZHAiCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIiA+CisgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9tcl9uYW1lIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI3MmRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9ImVuZCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuTWVkaWFSb3V0ZXIuVGl0bGUiIC8+CisgICAgICAgICAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9tcl9jbG9zZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iNDhkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjQ4ZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uPSJAc3RyaW5nL21yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iCisgICAgICAgICAgICAgICAgYW5kcm9pZDpzcmM9Ij9hdHRyL21lZGlhUm91dGVDbG9zZURyYXdhYmxlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iP2FuZHJvaWQ6YXR0ci9zZWxlY3RhYmxlSXRlbUJhY2tncm91bmRCb3JkZXJsZXNzIiAvPgorICAgICAgICA8L0xpbmVhckxheW91dD4KKyAgICAgICAgPEZyYW1lTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvbXJfY3VzdG9tX2NvbnRyb2wiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgLz4KKyAgICAgICAgPEZyYW1lTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvbXJfZGVmYXVsdF9jb250cm9sIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorICAgICAgICAgICAgPEltYWdlVmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX2FydCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDphZGp1c3RWaWV3Qm91bmRzPSJ0cnVlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2NhbGVUeXBlPSJmaXRYWSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9Ij9hbmRyb2lkOmF0dHIvY29sb3JQcmltYXJ5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InRvcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbj0iQHN0cmluZy9tcl9jb250cm9sbGVyX2FsYnVtX2FydCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiIC8+CisgICAgICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iCisgICAgICAgICAgICAgICAgYW5kcm9pZDpzcGxpdE1vdGlvbkV2ZW50cz0iZmFsc2UiPgorICAgICAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9tcl9tZWRpYV9tYWluX2NvbnRyb2wiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjE2ZHAiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iMTZkcCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSI/YXR0ci9tZWRpYVJvdXRlQ29udHJvbFBhbmVsVGhlbWVPdmVybGF5Ij4KKyAgICAgICAgICAgICAgICAgICAgPFJlbGF0aXZlTGF5b3V0CisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL21yX3BsYXliYWNrX2NvbnRyb2wiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyNGRwIgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjEyZHAiID4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL21yX2NvbnRyb2xfcGxheWJhY2tfY3RybCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjEyZHAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRSaWdodD0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbj0iQHN0cmluZy9tcl9jb250cm9sbGVyX3BsYXkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSI/YW5kcm9pZDphdHRyL3NlbGVjdGFibGVJdGVtQmFja2dyb3VuZEJvcmRlcmxlc3MiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL21yX2NvbnRyb2xfdGl0bGVfY29udGFpbmVyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9MZWZ0T2Y9IkBpZC9tcl9jb250cm9sX3BsYXliYWNrX2N0cmwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRMZWZ0PSJ0cnVlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9tcl9jb250cm9sX3RpdGxlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlByaW1hcnlUZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfY29udHJvbF9zdWJ0aXRsZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5NZWRpYVJvdXRlci5TZWNvbmRhcnlUZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L0xpbmVhckxheW91dD4KKyAgICAgICAgICAgICAgICAgICAgPC9SZWxhdGl2ZUxheW91dD4KKyAgICAgICAgICAgICAgICAgICAgPFZpZXcgYW5kcm9pZDppZD0iQCtpZC9tcl9jb250cm9sX2RpdmlkZXIiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjhkcCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgLz4KKyAgICAgICAgICAgICAgICAgICAgPExpbmVhckxheW91dAorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tcl92b2x1bWVfY29udHJvbCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDptaW5IZWlnaHQ9IjQ4ZHAiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjI0ZHAiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTJkcCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3BsaXRNb3Rpb25FdmVudHM9ImZhbHNlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxJbWFnZVZpZXcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMjRkcCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjI0ZHAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzcmM9Ij9hdHRyL21lZGlhUm91dGVBdWRpb1RyYWNrRHJhd2FibGUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzY2FsZVR5cGU9ImNlbnRlciIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTaW5jZSBkaWFsb2cncyB0b3AgbGF5b3V0IG1yX2V4cGFuZGFibGVfYXJlYSBpcyBjbGlja2FibGUsIGl0IHByb3BhZ2F0ZXMgcHJlc3NlZCBzdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBpdHMgbm9uLWNsaWNrYWJsZSBjaGlsZHJlbi4gU3BlY2lmeSBhbmRyb2lkOmNsaWNrYWJsZT0idHJ1ZSIgdG8gcHJldmVudCB2b2x1bWUgc2xpZGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gaGF2aW5nIGZhbHNlIHByZXNzZWQgc3RhdGUuIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwLk1lZGlhUm91dGVWb2x1bWVTbGlkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL21yX3ZvbHVtZV9zbGlkZXIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkcCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm1pbkhlaWdodD0iNDhkcCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm1heEhlaWdodD0iNDhkcCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpjbGlja2FibGU9InRydWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb249IkBzdHJpbmcvbXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwLk1lZGlhUm91dGVFeHBhbmRDb2xsYXBzZUJ1dHRvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXJfZ3JvdXBfZXhwYW5kX2NvbGxhcHNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI0OGRwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNDhkcCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmc9IjEyZHAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSI/YW5kcm9pZDphdHRyL3NlbGVjdGFibGVJdGVtQmFja2dyb3VuZEJvcmRlcmxlc3MiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIi8+CisgICAgICAgICAgICAgICAgICAgIDwvTGluZWFyTGF5b3V0PgorICAgICAgICAgICAgICAgIDwvTGluZWFyTGF5b3V0PgorICAgICAgICAgICAgICAgIDxjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcC5PdmVybGF5TGlzdFZpZXcKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tcl92b2x1bWVfZ3JvdXBfbGlzdCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSJAZGltZW4vbXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9wYWRkaW5nX3RvcCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzY3JvbGxiYXJTdHlsZT0ib3V0c2lkZU92ZXJsYXkiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y2xpcFRvUGFkZGluZz0iZmFsc2UiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzcGxpdE1vdGlvbkV2ZW50cz0iZmFsc2UiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9Ij9hdHRyL21lZGlhUm91dGVDb250cm9sUGFuZWxUaGVtZU92ZXJsYXkiIC8+CisgICAgICAgICAgICA8L0xpbmVhckxheW91dD4KKyAgICAgICAgPC9GcmFtZUxheW91dD4KKyAgICAgICAgPFNjcm9sbFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYnV0dG9uUGFuZWwiCisgICAgICAgICAgICBzdHlsZT0iP2F0dHIvYnV0dG9uQmFyU3R5bGUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmZpbGxWaWV3cG9ydD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2Nyb2xsSW5kaWNhdG9ycz0idG9wfGJvdHRvbSI+CisgICAgICAgICAgICA8YW5kcm9pZC5zdXBwb3J0LnY3LndpZGdldC5CdXR0b25CYXJMYXlvdXQKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iYm90dG9tIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0RGlyZWN0aW9uPSJsb2NhbGUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjRkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIxMmRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxMmRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iNGRwIj4KKyAgICAgICAgICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2J1dHRvbjMiCisgICAgICAgICAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL2J1dHRvbkJhck5ldXRyYWxCdXR0b25TdHlsZSIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiLz4KKyAgICAgICAgICAgICAgICA8YW5kcm9pZC5zdXBwb3J0LnY0LndpZGdldC5TcGFjZQorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NwYWNlciIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkcCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZHAiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJpbnZpc2libGUiLz4KKyAgICAgICAgICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2J1dHRvbjIiCisgICAgICAgICAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL2J1dHRvbkJhck5lZ2F0aXZlQnV0dG9uU3R5bGUiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ii8+CisgICAgICAgICAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9idXR0b24xIgorICAgICAgICAgICAgICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci9idXR0b25CYXJQb3NpdGl2ZUJ1dHRvblN0eWxlIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIvPgorICAgICAgICAgICAgPC9hbmRyb2lkLnN1cHBvcnQudjcud2lkZ2V0LkJ1dHRvbkJhckxheW91dD4KKyAgICAgICAgPC9TY3JvbGxWaWV3PgorICAgIDwvTGluZWFyTGF5b3V0PgorPC9GcmFtZUxheW91dD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21yX2NvbnRyb2xsZXJfdm9sdW1lX2l0ZW0ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY29udHJvbGxlcl92b2x1bWVfaXRlbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg5MDU4YgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21yX2NvbnRyb2xsZXJfdm9sdW1lX2l0ZW0ueG1sCkBAIC0wLDAgKzEsNTIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC92b2x1bWVfaXRlbV9jb250YWluZXIiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2l0ZW1faGVpZ2h0IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMjRkcCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI2MGRwIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSI4ZHAiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIgPgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9tcl9uYW1lIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlNlY29uZGFyeVRleHQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiIC8+CisgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiPgorICAgICAgICAgICAgPEltYWdlVmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX3ZvbHVtZV9pdGVtX2ljb24iCisgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJAZGltZW4vbXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9pdGVtX2ljb25fc2l6ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9pdGVtX2ljb25fc2l6ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI4ZHAiCisgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iOGRwIgorICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iZml0Q2VudGVyIgorICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNyYz0iP2F0dHIvbWVkaWFSb3V0ZUF1ZGlvVHJhY2tEcmF3YWJsZSIgLz4KKyAgICAgICAgICAgIDxhbmRyb2lkLnN1cHBvcnQudjcuYXBwLk1lZGlhUm91dGVWb2x1bWVTbGlkZXIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL21yX3ZvbHVtZV9zbGlkZXIiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNDBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm1pbkhlaWdodD0iNDBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm1heEhlaWdodD0iNDBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbj0iQHN0cmluZy9tcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIC8+CisgICAgICAgIDwvTGluZWFyTGF5b3V0PgorICAgIDwvTGluZWFyTGF5b3V0PgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9zZXR0aW5nc19saXN0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L3NldHRpbmdzX2xpc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMzA1MzgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9zZXR0aW5nc19saXN0LnhtbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxMaXN0VmlldyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX3dpZHRoIgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaGVpZ2h0IgorICAgIGFuZHJvaWQ6ZGl2aWRlcj0iQG51bGwiCisgICAgYW5kcm9pZDpkaXZpZGVySGVpZ2h0PSIwZHAiPgorPC9MaXN0Vmlldz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC90aXRsZV9iYXJfZ3JhZGllbnQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvdGl0bGVfYmFyX2dyYWRpZW50LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjFmYzZlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvdGl0bGVfYmFyX2dyYWRpZW50LnhtbApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzaGFwZSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpzaGFwZT0icmVjdGFuZ2xlIj4KKyAgICA8Z3JhZGllbnQKKyAgICAgICAgYW5kcm9pZDpzdGFydENvbG9yPSJAY29sb3IvdGl0bGVfYmFyX2dyYWRpZW50X3N0YXJ0IgorICAgICAgICBhbmRyb2lkOmVuZENvbG9yPSJAY29sb3IvdGl0bGVfYmFyX2dyYWRpZW50X2VuZCIKKyAgICAgICAgYW5kcm9pZDphbmdsZT0iLTI3MCIgLz4KKzwvc2hhcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYWYvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hZi9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzIzMGFkCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYWYvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN0ZWxzZWwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iVG9lc3RlbGxlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQ2FzdC1rbm9wcGllIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iVWl0c2FhaS1rbm9wcGllLiBPbnRrb3BwZWwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IlVpdHNhYWkta25vcHBpZS4gS29wcGVsIHRhbnMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iVWl0c2FhaS1rbm9wcGllLiBHZWtvcHBlbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJTYWFpIHVpdCBuYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlZpbmQgdGFucyB0b2VzdGVsbGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iT250a29wcGVsIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iSG91IG9wIHVpdHNhYWkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+Ik1hYWsgdG9lIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iU3BlZWwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IkxhYXQgd2FnIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iU3RvcCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlZvdSB1aXQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlZvdSBpbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVta3Vuc3dlcmsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iVm9sdW1lZ2x5ZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IkdlZW4gbWVkaWEgaXMgZ2VraWVzIG5pZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iR2VlbiBpbmxpZ3RpbmcgYmVza2lrYmFhciBuaWUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlNhYWkgdGFucyBza2VybSB1aXQiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWFtL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYW0vc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlhMTkwMwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWFtL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLhiLXhiK3hi5PhibUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4YiY4Yij4Yiq4Yur4YuO4Ym9Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4YuoQ2FzdCDhiqDhi53hiKvhiK0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJDYXN0IOGKoOGLneGIq+GIreGNoiDhjI3hipXhipnhipDhibUg4Ymw4YmL4Yit4Yyn4YiNIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0IOGKoOGLneGIq+GIrSDhiaDhiJvhjIjhipPhipjhibUg4YiL4YutIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3Qg4Yqg4Yud4Yir4Yit4Y2iIOGJsOGMiOGKk+GKneGJt+GIjSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJDYXN0IOGKoOGLteGIreGMjSDhi4jhi7AiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLhiJjhiKPhiKrhi6vhi47hib3hipUg4Ymg4Yib4YyN4YqY4Ym1IOGIi+GLrSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLhjI3hipXhipnhipDhibUg4Yqg4YmL4Yit4YylIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iQ2FzdCDhiJvhi7XhiKjhjI0g4Yqg4YmB4YidIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLhi53hjIsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLhiqDhjKvhi43hibUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuGIiOGKoOGNjeGJsyDhiqDhiYHhiJ0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLhiqDhiYHhiJ0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLhiqDhiLXhjYsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuGIsOGJpeGIteGJpSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuGLqOGKoOGIjeGJoOGInSDhiLXhipAt4Yyl4Ymg4YmlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuGJsOGKleGIuOGIq+GJs+GJvSDhi6jhi7XhiJ3hjYUg4YiY4YmG4Yyj4Yyg4Yiq4YurIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLhiJ3hipXhiJ0g4Yib4YiF4Yuw4Yio4YiY4Yio4YyDIOGKoOGIjeGJsOGImOGIqOGMoOGInSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4Yid4YqV4YidIOGImOGIqOGMgyDhiqDhi63hjIjhip3hiJ0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuGIm+GLqyDhjIjhjL3hipUg4Ymg4YiY4YuN4Yiw4Yu1IOGIi+GLrSI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYXIvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hci9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGZiOTdkCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYXIvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+Itin2YTZhti42KfZhSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLYp9mE2KPYrNmH2LLYqSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+Itiy2LEg2KfZhNil2LHYs9in2YQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLYstixINin2YTYpdix2LPYp9mELiDYqtmFINmC2LfYuSDYp9mE2KfYqti12KfZhCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i2LLYsSDYp9mE2KXYsdiz2KfZhC4g2KzYp9ix2Y0g2KfZhNin2KrYtdin2YQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i2LLYsSDYp9mE2KXYsdiz2KfZhC4g2KrZhSDYp9mE2KfYqti12KfZhCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLYpdix2LPYp9mEINil2YTZiSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Itis2KfYsdmNINin2YTYqNit2Ksg2LnZhiDYo9is2YfYstipIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+ItmC2LfYuSDYp9mE2KfYqti12KfZhCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+Itil2YrZgtin2YEg2KfZhNil2LHYs9in2YQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+Itil2LrZhNin2YIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLYqti02LrZitmEIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLYpdmK2YLYp9mBINmF2KTZgtiqIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i2KXZitmC2KfZgSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+Itiq2YjYs9mK2LkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+Itiq2LXYutmK2LEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLYtdmI2LHYqSDYp9mE2KPZhNio2YjZhSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLYtNix2YrYtyDYqtmF2LHZitixINmF2LPYqtmI2Ykg2KfZhNi12YjYqiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i2YTZhSDZitiq2YUg2KfYrtiq2YrYp9ixINij2Yog2YjYs9in2KbYtyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i2YTYpyDYqtiq2YjZgdixINij2Yog2YXYudmE2YjZhdin2KoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Itis2KfYsdmNINil2LHYs9in2YQg2KfZhNi02KfYtNipIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hei9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWF6L3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYzYwYWIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hei9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkNpaGF6bGFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iWWF5xLFtIGTDvHltyZlzaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IllhecSxbSBkw7x5bcmZc2kuIEJhxJ9sYW50xLEga8mZc2lsZGkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IllhecSxbSBkw7x5bcmZc2kuIFFvxZ91bHVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IllhecSxbSBkw7x5bcmZc2kuIFFvxZ91bGR1Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkJ1cmEgeWF5xLFtbGF5xLFuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iQ2loYXpsYXIgYXh0YXLEsWzEsXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iQmHEn2xhbnTEsW7EsSBryZlzaW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJZYXnEsW3EsSBkYXlhbmTEsXLEsW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlFhcGFkxLFuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iT3luYWTEsW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IkR1cmR1cnVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iRGF5YW5kxLFyxLFuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iR2VuacWfbMmZbmRpcmluIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJZxLHEn2NhbWxhxZ9kxLFyxLFuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxib20gaW5jyZlzyZluyZl0aSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJTyZlzIGjJmXJtaSBkaXlpcmPJmXlpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJIZcOnIGJpciBtZWRpYSBzZcOnaWxtyZl5aWIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IsaPbMOnYXRhbiBtyZlsdW1hdCB5b3hkdXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkVrcmFuIHlhecSxbWxhbsSxciI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYitzcitMYXRuL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYitzcitMYXRuL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNWJkNmUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1iK3NyK0xhdG4vc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJVcmXEkWFqaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkR1Z21lIFByZWJhY2kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJEdWdtZSBQcmViYWNpLiBWZXphIGplIHByZWtpbnV0YSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iRHVnbWUgUHJlYmFjaS4gUG92ZXp1amUgc2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iRHVnbWUgUHJlYmFjaS4gUG92ZXphbiBqZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJQcmViYWN1aiBuYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlByb25hbGHFvmVuamUgdXJlxJFhamEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iUHJla2luaSB2ZXp1Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iWmF1c3RhdmkgcHJlYmFjaXZhbmplIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJaYXR2b3JpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUHVzdGkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXppcmFqIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iWmF1c3RhdmkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJQcm/FoWlyaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iU2t1cGkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJPbW90IGFsYnVtYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJLbGl6YcSNIHphIGphxI1pbnUgenZ1a2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5lbWEgaXphYnJhbmloIG1lZGlqYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTmlzdSBkb3N0dXBuZSBuaWtha3ZlIGluZm9ybWFjaWplIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJQcmViYWN1amUgc2UgZWtyYW4iPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJlL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYmUvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMzOTFjMQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJlL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLQodGW0YHRgtGN0LzQsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLQn9GA0YvQu9Cw0LTRiyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0YvRliI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0YvRli4g0JDQtNC60LvRjtGH0LDQvdCwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLQmtC90L7Qv9C60LAg0YLRgNCw0L3RgdC70Y/RhtGL0ZYuINCG0LTQt9C1INC/0LDQtNC60LvRjtGH0Y3QvdC90LUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i0JrQvdC+0L/QutCwINGC0YDQsNC90YHQu9GP0YbRi9GWLiDQn9Cw0LTQutC70Y7Rh9Cw0L3QsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLQotGA0LDQvdGB0LvRltGA0LDQstCw0YbRjCDQvdCwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i0J/QvtGI0YPQuiDQv9GA0YvQu9Cw0LQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i0JDQtNC70YPRh9GL0YbRjCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+ItCh0L/Ri9C90ZbRhtGMINGC0YDQsNC90YHQu9GP0YbRi9GOIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLQl9Cw0LrRgNGL0YbRjCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+ItCf0YDQsNC50LPRgNCw0YbRjCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i0J/RgNGL0L/Ri9C90ZbRhtGMIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i0KHQv9GL0L3RltGG0YwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLQoNCw0LfQs9Cw0YDQvdGD0YbRjCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i0JfQs9Cw0YDQvdGD0YbRjCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+ItCS0L7QutC70LDQtNC60LAg0LDQu9GM0LHQvtC80LAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i0J/QsNGe0LfRg9C90L7QuiDQs9GD0YfQvdCw0YHRhtGWIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLQnNC10LTRi9GP0YTQsNC50Lsg0L3QtSDQstGL0LHRgNCw0L3RiyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i0IbQvdGE0LDRgNC80LDRhtGL0Y8g0LDQtNGB0YPRgtC90ZbRh9Cw0LUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+ItCt0LrRgNCw0L0g0YLRgNCw0L3RgdC70Y/RhtGL0ZYiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJnL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYmcvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY3MTJkNAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJnL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLQodC40YHRgtC10LzQsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLQo9GB0YLRgNC+0LnRgdGC0LLQsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItCR0YPRgtC+0L0g0LfQsCDQv9GA0LXQtNCw0LLQsNC90LUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLQkdGD0YLQvtC9INC30LAg0L/RgNC10LTQsNCy0LDQvdC1LiDQktGA0YrQt9C60LDRgtCwINC1INC/0YDQtdC60YDQsNGC0LXQvdCwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLQkdGD0YLQvtC9INC30LAg0L/RgNC10LTQsNCy0LDQvdC1LiDQodCy0YrRgNC30LLQsCDRgdC1Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+ItCR0YPRgtC+0L0g0LfQsCDQv9GA0LXQtNCw0LLQsNC90LUuINCj0YHRgtCw0L3QvtCy0LXQvdCwINC1INCy0YDRitC30LrQsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLQn9GA0LXQtNCw0LLQsNC90LUg0LrRitC8Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i0KLRitGA0YHRj9GCINGB0LUg0YPRgdGC0YDQvtC50YHRgtCy0LAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i0J/RgNC10LrRgNCw0YLRj9Cy0LDQvdC1INC90LAg0LLRgNGK0LfQutCw0YLQsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+ItCh0L/QuNGA0LDQvdC1INC90LAg0L/RgNC10LTQsNCy0LDQvdC10YLQviI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i0JfQsNGC0LLQsNGA0Y/QvdC1Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i0J/Rg9GB0LrQsNC90LUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCf0L7RgdGC0LDQstGP0L3QtSDQvdCwINC/0LDRg9C30LAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLQodC/0LjRgNCw0L3QtSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+ItCg0LDQt9Cz0YrQstCw0L3QtSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i0KHQstC40LLQsNC90LUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLQntCx0LvQvtC20LrQsCDQvdCwINCw0LvQsdGD0LzQsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLQn9C70YrQt9Cz0LDRhyDQt9CwINGB0LjQu9Cw0YLQsCDQvdCwINC30LLRg9C60LAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItCd0Y/QvNCwINC40LfQsdGA0LDQvdCwINC80YPQu9GC0LjQvNC10LTQuNGPIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLQndGP0LzQsCDQvdCw0LvQuNGH0L3QsCDQuNC90YTQvtGA0LzQsNGG0LjRjyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i0JXQutGA0LDQvdGK0YIg0YHQtSDQv9GA0LXQtNCw0LLQsCI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYm4vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ibi9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmY1OTMyCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYm4vc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuCmuOCmv+CmuOCnjeCmn+Cnh+CmriI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgpqHgpr/gpq3gpr7gpofgprjgppfgp4HgprLgpr8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgppXgpr7gprjgp43gpp8g4KaV4Kaw4Ka+4KawIOCmrOCni+CmpOCmvuCmriI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuCmleCmvuCmuOCnjeCmnyDgppXgprDgpr7gprAg4Kas4KeL4Kak4Ka+4Kau4Ke3IOCmuOCmguCmr+Cni+CmlyDgpqzgpr/gpprgp43gppvgpr/gpqjgp43gpqgg4Ka54Kav4Ka84KeH4Kab4KeHIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLgppXgpr7gprjgp43gpp8g4KaV4Kaw4Ka+4KawIOCmrOCni+CmpOCmvuCmruCntyDgprjgpoLgpq/gp4vgppcg4KaV4Kaw4Ka+IOCmueCmmuCnjeCmm+CnhyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgppXgpr7gprjgp43gpp8g4KaV4Kaw4Ka+4KawIOCmrOCni+CmpOCmvuCmruCntyDgprjgpoLgpq/gp4HgppXgp43gpqQg4Ka54Kav4Ka84KeH4Kab4KeHIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuCmj+CmpOCnhyDgppXgpr7gprjgp43gpp8g4KaV4Kaw4KeB4KaoIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4Kah4Ka/4Kat4Ka+4KaH4Ka44KaX4KeB4Kay4Ka/4KaV4KeHIOCmluCni+CmgeCmnOCmviDgprngpprgp43gppvgp4ciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4Ka44KaC4Kav4KeL4KaXIOCmrOCmv+CmmuCnjeCmm+Cmv+CmqOCnjeCmqCDgppXgprDgp4HgpqgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLgppXgpr7gprjgp43gpp8g4KaV4Kaw4Ka+IOCmrOCmqOCnjeCmpyDgppXgprDgp4HgpqgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuCmrOCmqOCnjeCmpyDgppXgprDgp4HgpqgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLgpprgpr7gprLgpr7gpqgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuCmrOCmv+CmsOCmvuCmriDgpqbgpr/gpqgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLgpqXgpr7gpq7gpr7gpqgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLgpqzgpqHgprwg4KaV4Kaw4KeB4KaoIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLgprjgppngp43gppXgp4Hgpprgpr/gpqQg4KaV4Kaw4KeB4KaoIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4KaF4KeN4Kav4Ka+4Kay4Kas4Ka+4KauIOCmtuCniOCmsuCmvyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgpq3gprLgpr/gpongpq4g4Ka44KeN4Kay4Ka+4KaH4Kah4Ka+4KawIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgppXgp4vgpqjgp4sg4Kau4Ka/4Kah4Ka/4Kav4Ka84Ka+IOCmqOCmv+CmsOCnjeCmrOCmvuCmmuCmqCDgppXgprDgpr4g4Ka54Kav4Ka84Kao4Ka/Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgppXgp4vgpqjgp4sg4Kak4Kal4KeN4KavIOCmieCmquCmsuCmrOCnjeCmpyDgpqjgp4fgpociPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuCmuOCnjeCmleCnjeCmsOCngOCmqCDgppXgpr7gprjgp43gpp8g4KaV4Kaw4Ka+IOCmueCmmuCnjeCmm+CnhyI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYnMvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1icy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTFjNzQyCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYnMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJVcmXEkWFqaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkR1Z21lIHphIGVtaXRpcmFuamUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJEdWdtZSB6YSBlbWl0aXJhbmplLiBWZXphIGplIHByZWtpbnV0YSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iRHVnbWUgemEgZW1pdGlyYW5qZS4gUG92ZXppdmFuamUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iRHVnbWUgemEgZW1pdGlyYW5qZS4gUG92ZXphbm8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iRW1pdGlyYW5qZSBuYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlRyYcW+ZW5qZSB1cmXEkWFqYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJQcmVraW5pIHZlenUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJaYXVzdGF2aSBwcmViYWNpdmFuamUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlphdHZvcmkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJSZXByb2R1Y2lyYWoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXppcmFqIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iWmF1c3RhdmkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJQcm/FoWlyaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iU2t1cGkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJPbW90IGFsYnVtYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJLbGl6YcSNIHphIGphxI1pbnUgenZ1a2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5pamVkYW4gbWVkaWogbmlqZSBvZGFicmFuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOZW1hIGRvc3R1cG5paCBpbmZvcm1hY2lqYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iUHJlYmFjdWplIHNlIGVrcmFuIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1jYS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWNhL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmODVhY2YKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1jYS9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEaXNwb3NpdGl1cyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJvdMOzIGRcJ2VtZXRyZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJvdMOzIEVtZXQuIERlc2Nvbm5lY3RhdC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJvdMOzIEVtZXQuIFNcJ2VzdMOgIGNvbm5lY3RhbnQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJvdMOzIEVtZXQuIENvbm5lY3RhdC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iRW1ldCBhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iU1wnZXN0YW4gY2VyY2FudCBkaXNwb3NpdGl1cyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEZXNjb25uZWN0YSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkF0dXJhIGxcJ2VtaXNzacOzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJUYW5jYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlcHJvZHVlaXgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBvc2EgZW4gcGF1c2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJBdHVyYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkRlc3BsZWdhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJSZXBsZWdhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iSW1hdGdlIGRlIGxcJ8OgbGJ1bSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJDb250cm9sIGxsaXNjYW50IGRlIHZvbHVtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJObyBzXCdoYSBzZWxlY2Npb25hdCBjYXAgZml0eGVyIG11bHRpbcOoZGlhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJObyBoaSBoYSBpbmZvcm1hY2nDsyBkaXNwb25pYmxlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJFbWlzc2nDsyBkZSBwYW50YWxsYSI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtY3Mvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWE4OTIwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtY3Mvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3TDqW0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iWmHFmcOtemVuw60iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJUbGHEjcOtdGtvIG9kZXPDrWzDoW7DrSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IlRsYcSNw610a28gb2Rlc8OtbMOhbsOtLiBPZHBvamVubyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iVGxhxI3DrXRrbyBvZGVzw61sw6Fuw60uIFDFmWlwb2pvdsOhbsOtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IlRsYcSNw610a28gb2Rlc8OtbMOhbsOtLiBQxZlpcG9qZW5vIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+Ik9kZXPDrWxhdCBkbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkhsZWTDoW7DrSB6YcWZw616ZW7DrSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJPZHBvaml0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iWmFzdGF2aXQgb2Rlc8OtbMOhbsOtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJaYXbFmcOtdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlDFmWVocsOhdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUG96YXN0YXZpdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+Ilphc3Rhdml0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iUm96YmFsaXQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlNiYWxpdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Ik9iYWwgYWxiYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJQb3N1dm7DrWsgaGxhc2l0b3N0aSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmVieWxhIHZ5YnLDoW5hIMW+w6FkbsOhIG3DqWRpYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTmVqc291IGvCoGRpc3BvemljaSDFvsOhZG7DqSBpbmZvcm1hY2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Ik9kZXPDrWzDoW7DrSBvYnNhaHUgb2JyYXpvdmt5Ijwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1kYS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWRhL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlN2E3OTAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1kYS9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdGVtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkVuaGVkZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0LWtuYXAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJDYXN0LWtuYXAuIEZvcmJpbmRlbHNlbiBlciBhZmJydWR0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0LWtuYXAuIE9wcmV0dGVyIGZvcmJpbmRlbHNlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3Qta25hcC4gVGlsc2x1dHRldCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJDYXN0IHRpbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkZpbmRlciBlbmhlZGVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkFmYnJ5ZCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlN0b3AgbWVkIGF0IGNhc3RlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJMdWsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJBZnNwaWwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlPDpnQgcMOlIHBhdXNlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iU3RvcCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlVkdmlkIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJTa2p1bCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtZ3JhZmlrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+Ikx5ZHN0eXJrZXNreWRlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iSW5nZW4gbWVkaWVyIGVyIG1hcmtlcmV0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJEZXIgZXIgaW5nZW4gdGlsZ8OmbmdlbGlnZSBvcGx5c25pbmdlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iU2vDpnJtZW4gY2FzdGVzIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1kZS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWRlL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YmY1N2MKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1kZS9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdGVtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkdlcsOkdGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0LVN5bWJvbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IlN0cmVhbWluZy1TY2hhbHRmbMOkY2hlLiBOaWNodCB2ZXJidW5kZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IlN0cmVhbWluZy1TY2hhbHRmbMOkY2hlLiBWZXJiaW5kdW5nIHdpcmQgaGVyZ2VzdGVsbHQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iU3RyZWFtaW5nLVNjaGFsdGZsw6RjaGUuIFZlcmJ1bmRlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJTdHJlYW1lbiBhdWYiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJHZXLDpHRlIHdlcmRlbiBnZXN1Y2h0LiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJWZXJiaW5kdW5nIHRyZW5uZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJTdHJlYW1pbmcgYmVlbmRlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iU2NobGllw59lbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IldpZWRlcmdlYmVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzaWVyZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJCZWVuZGVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iTWF4aW1pZXJlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iTWluaW1pZXJlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtY292ZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iU2NoaWViZXJlZ2xlciBmw7xyIGRpZSBMYXV0c3TDpHJrZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iS2VpbmUgTWVkaWVuIGF1c2dld8OkaGx0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJLZWluZSBJbmZvcm1hdGlvbmVuIHZlcmbDvGdiYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkJpbGRzY2hpcm0gd2lyZCBnZXN0cmVhbXQuIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVsL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MmY2OWIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbC9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4izqPPjc+Dz4TOt868zrEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4izqPPhc+DzrrOtc+Fzq3PgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+Is6azr/Phc68z4DOryBDYXN0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4izprOv8+FzrzPgM6vIM68zrXPhM6szrTOv8+DzrfPgi4gzpHPgM6/z4PPhc69zrTOrc64zrfOus61Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLOms6/z4XOvM+Azq8gzrzOtc+EzqzOtM6/z4POty4gzqPPjc69zrTOtc+Dzrcgz4POtSDOtc6+zq3Ou865zr7OtyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLOms6/z4XOvM+Azq8gzrzOtc+EzqzOtM6/z4POt8+CLiDOo8+Fzr3OtM6tzrjOt866zrUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4izpzOtc+EzqzOtM6/z4POtyDPg861Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4izpXPjc+BzrXPg863IM+Dz4XPg866zrXPhc+Ozr0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4izpHPgM6/z4PPjc69zrTOtc+DzrciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLOlM65zrHOus6/z4DOriDOvM61z4TOrM60zr/Pg863z4IiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+Is6azrvOtc6vz4POuc68zr8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLOkc69zrHPgM6xz4HOsc6zz4nOs86uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLOoM6xz43Pg863Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4izpTOuc6xzrrOv8+Azq4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLOkc69zqzPgM+Ez4XOvs63Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLOo8+NzrzPgM+Ez4XOvs63Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4izpXOvs+Oz4bPhc67zrvOvyDOrM67zrzPgM6/z4XOvCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLOoc+FzrjOvM65z4PPhM65zrrPjCDOrc69z4TOsc+DzrfPgiDOrs+Hzr/PhSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4izpTOtc69IM6tz4fOv8+Fzr0gzrXPgM65zrvOtc6zzrXOryDOvM6tz4POsSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4izpTOtc69IM+Fz4DOrM+Bz4fOv8+Fzr0gzrTOuc6xzrjOrc+DzrnOvM61z4Igz4DOu863z4HOv8+Gzr/Pgc6vzrXPgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4izpzOtc+EzqzOtM6/z4POtyDOv864z4zOvc63z4IiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJBVS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJBVS9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDNmMjE5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tckFVL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRGV2aWNlcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3QgYnV0dG9uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQ2FzdCBidXR0b24uIERpc2Nvbm5lY3RlZCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQ2FzdCBidXR0b24uIENvbm5lY3RpbmciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQ2FzdCBidXR0b24uIENvbm5lY3RlZCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJDYXN0IHRvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iRmluZGluZyBkZXZpY2VzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRpc2Nvbm5lY3QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJTdG9wIGNhc3RpbmciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkNsb3NlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUGxheSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTdG9wIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRXhwYW5kIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJDb2xsYXBzZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtIGFydCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJWb2x1bWUgc2xpZGVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJObyBtZWRpYSBzZWxlY3RlZCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTm8gaW5mbyBhdmFpbGFibGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkNhc3Rpbmcgc2NyZWVuIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1yQ0Evc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1yQ0Evc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQzZjIxOQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJDQS9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdGVtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRldmljZXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0IGJ1dHRvbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3QgYnV0dG9uLiBEaXNjb25uZWN0ZWQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkNhc3QgYnV0dG9uLiBDb25uZWN0aW5nIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3QgYnV0dG9uLiBDb25uZWN0ZWQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdCB0byI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkZpbmRpbmcgZGV2aWNlcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEaXNjb25uZWN0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iU3RvcCBjYXN0aW5nIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJDbG9zZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlBsYXkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iU3RvcCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkV4cGFuZCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iQ29sbGFwc2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bSBhcnQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iVm9sdW1lIHNsaWRlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTm8gbWVkaWEgc2VsZWN0ZWQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5vIGluZm8gYXZhaWxhYmxlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJDYXN0aW5nIHNjcmVlbiI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tckdCL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tckdCL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkM2YyMTkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1yR0Ivc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3RlbSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEZXZpY2VzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQ2FzdCBidXR0b24iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJDYXN0IGJ1dHRvbi4gRGlzY29ubmVjdGVkIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0IGJ1dHRvbi4gQ29ubmVjdGluZyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0IGJ1dHRvbi4gQ29ubmVjdGVkIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkNhc3QgdG8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJGaW5kaW5nIGRldmljZXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGlzY29ubmVjdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlN0b3AgY2FzdGluZyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iQ2xvc2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJQbGF5Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlN0b3AiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJFeHBhbmQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkNvbGxhcHNlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW0gYXJ0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlZvbHVtZSBzbGlkZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5vIG1lZGlhIHNlbGVjdGVkIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJObyBpbmZvIGF2YWlsYWJsZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iQ2FzdGluZyBzY3JlZW4iPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJJTi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJJTi9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDNmMjE5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tcklOL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRGV2aWNlcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3QgYnV0dG9uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQ2FzdCBidXR0b24uIERpc2Nvbm5lY3RlZCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQ2FzdCBidXR0b24uIENvbm5lY3RpbmciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQ2FzdCBidXR0b24uIENvbm5lY3RlZCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJDYXN0IHRvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iRmluZGluZyBkZXZpY2VzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRpc2Nvbm5lY3QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJTdG9wIGNhc3RpbmciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkNsb3NlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUGxheSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTdG9wIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRXhwYW5kIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJDb2xsYXBzZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtIGFydCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJWb2x1bWUgc2xpZGVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJObyBtZWRpYSBzZWxlY3RlZCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTm8gaW5mbyBhdmFpbGFibGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkNhc3Rpbmcgc2NyZWVuIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1yWEMvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1yWEMvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg3MDA3ZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJYQy9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCOU3lzdGVt4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAj+KAjuKAjuKAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAjuKAj+KAjuKAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAjuKAjuKAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAj+KAjuKAjuKAj+KAj+KAjuKAjuKAjuKAjuKAj+KAj+KAjuKAjuKAj+KAjuKAj+KAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjkRldmljZXPigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI7igI/igI/igI7igI7igI/igI/igI7igI/igI7igI/igI7igI7igI/igI/igI7igI/igI7igI7igI7igI/igI/igI/igI7igI/igI7igI7igI7igI/igI/igI7igI7igI7igI/igI/igI7igI/igI/igI/igI7igI7igI/igI/igI/igI/igI/igI7igI/igI/igI/igI/igI/igI7igI/igI7igI7igI7igI7igI/igI7igI7igI7igI/igI5DYXN0IGJ1dHRvbuKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAj+KAjuKAj+KAjuKAj+KAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAj+KAjuKAjuKAj+KAj+KAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAj+KAj+KAjuKAj+KAjuKAj+KAj+KAjuKAj+KAjuKAjuKAj+KAj+KAj+KAjuKAj+KAjuKAjuKAjuKAjkNhc3QgYnV0dG9uLiBEaXNjb25uZWN0ZWTigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAjuKAj+KAj+KAjuKAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAjuKAj+KAjuKAj+KAjuKAjuKAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAjuKAj+KAjuKAj+KAjuKAjkNhc3QgYnV0dG9uLiBDb25uZWN0aW5n4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAjuKAjuKAj+KAj+KAjuKAj+KAjuKAjuKAj+KAj+KAj+KAjuKAj+KAj+KAjuKAj+KAj+KAj+KAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAjuKAjuKAj+KAjuKAj+KAjuKAjuKAj+KAjuKAj+KAjuKAj+KAjuKAj+KAj+KAjuKAjuKAjuKAj+KAj+KAj+KAjuKAj+KAj+KAj+KAj+KAjuKAj+KAjuKAjuKAj+KAjuKAj+KAjuKAj+KAjkNhc3QgYnV0dG9uLiBDb25uZWN0ZWTigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCO4oCP4oCP4oCO4oCOQ2FzdCB0b+KAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAjuKAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAjuKAj+KAj+KAj+KAj+KAjuKAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAj+KAj+KAj+KAj+KAj+KAjuKAjuKAj+KAjuKAjuKAj+KAj+KAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjkZpbmRpbmcgZGV2aWNlc+KAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI7igI/igI/igI7igI7igI7igI/igI7igI7igI7igI7igI/igI7igI7igI7igI7igI7igI7igI/igI/igI/igI/igI7igI/igI/igI/igI7igI/igI7igI/igI7igI7igI7igI/igI7igI7igI7igI/igI7igI/igI/igI7igI7igI7igI/igI7igI/igI7igI7igI/igI/igI7igI7igI/igI7igI/igI7igI7igI7igI/igI/igI7igI7igI5EaXNjb25uZWN04oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCOU3RvcCBjYXN0aW5n4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI/igI/igI/igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI/igI/igI/igI7igI7igI7igI/igI/igI/igI7igI7igI/igI/igI/igI7igI/igI7igI/igI7igI/igI7igI/igI7igI/igI/igI/igI/igI7igI7igI7igI7igI7igI/igI/igI/igI/igI7igI/igI7igI/igI/igI/igI7igI7igI/igI7igI/igI/igI/igI7igI7igI5DbG9zZeKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjuKAjuKAj+KAjuKAjuKAj+KAjuKAj+KAj+KAj+KAj+KAj+KAjuKAjuKAj+KAj+KAjuKAjuKAjuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAj+KAjuKAj+KAjuKAjuKAjuKAj+KAj+KAj+KAjuKAjuKAjuKAj+KAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjlBsYXnigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAjuKAjuKAjuKAj+KAj+KAjuKAj+KAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjuKAjlBhdXNl4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCOU3RvcOKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAjuKAjuKAj+KAj+KAjuKAj+KAj+KAj+KAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAj+KAj+KAj+KAj+KAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAj+KAjuKAjuKAjuKAj+KAjuKAjuKAj+KAj+KAjuKAj+KAj+KAjkV4cGFuZOKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCO4oCOQ29sbGFwc2XigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI/igI/igI7igI/igI/igI7igI7igI/igI7igI7igI/igI7igI7igI7igI/igI7igI7igI/igI/igI7igI7igI7igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI7igI/igI7igI7igI/igI7igI/igI7igI/igI/igI/igI/igI7igI/igI7igI/igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI7igI7igI7igI7igI/igI5BbGJ1bSBhcnTigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCO4oCP4oCO4oCP4oCP4oCO4oCP4oCOVm9sdW1lIHNsaWRlcuKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCO4oCP4oCOTm8gbWVkaWEgc2VsZWN0ZWTigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAjuKAj+KAj+KAjuKAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAj+KAjuKAj+KAj+KAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAjuKAj+KAj+KAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAj+KAj+KAjuKAj+KAj+KAj+KAj+KAjuKAjuKAjuKAj+KAj+KAjuKAjuKAjk5vIGluZm8gYXZhaWxhYmxl4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI/igI/igI7igI7igI7igI7igI/igI/igI/igI7igI7igI/igI7igI7igI7igI7igI7igI7igI/igI/igI/igI/igI7igI7igI/igI7igI/igI/igI7igI/igI/igI/igI/igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI7igI/igI7igI/igI7igI/igI7igI/igI7igI/igI/igI7igI/igI/igI7igI7igI7igI7igI7igI/igI/igI5DYXN0aW5nIHNjcmVlbuKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXMtclVTL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXMtclVTL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MWVhZDEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lcy1yVVMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbWEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRGlzcG9zaXRpdm9zIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQm90w7NuIHBhcmEgdHJhbnNtaXRpciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJvdMOzbiBwYXJhIHRyYW5zbWl0aXIgKGRlc2NvbmVjdGFkbykiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJvdMOzbiBwYXJhIHRyYW5zbWl0aXIgKGNvbmVjdGFuZG8pIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJvdMOzbiBwYXJhIHRyYW5zbWl0aXIgKGNvbmVjdGFkbykiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iVHJhbnNtaXRpciBhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iQnVzY2FuZG8gZGlzcG9zaXRpdm9zIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRlc2NvbmVjdGFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iRGV0ZW5lciBsYSB0cmFuc21pc2nDs24iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkNlcnJhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlcHJvZHVjaXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkRldGVuZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJNb3N0cmFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJPY3VsdGFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iSW1hZ2VuIGRlbCDDoWxidW0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQ29udHJvbCBkZXNsaXphbnRlIGRlbCB2b2x1bWVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJObyBzZSBzZWxlY2Npb27DsyBuaW5nw7puIGNvbnRlbmlkbyBtdWx0aW1lZGlhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJTaW4gaW5mb3JtYWNpw7NuIGRpc3BvbmlibGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlRyYW5zbWl0aWVuZG8gcGFudGFsbGEiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVzL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXMvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY0MzAwOAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVzL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJvdMOzbiBkZSBlbnZpYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJCb3TDs24gZGUgZW52aWFyLiBEZXNjb25lY3RhZG8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJvdMOzbiBkZSBlbnZpYXIuIENvbmVjdGFuZG8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQm90w7NuIGRlIGVudmlhci4gQ29uZWN0YWRvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkVudmlhciBhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iQnVzY2FuZG8gZGlzcG9zaXRpdm9zIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRlc2NvbmVjdGFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iRGV0ZW5lciBlbnbDrW8gZGUgY29udGVuaWRvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJDZXJyYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJSZXByb2R1Y2lyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkRldGVuZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJNb3N0cmFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJPY3VsdGFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iUG9ydGFkYSBkZWwgw6FsYnVtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkNvbnRyb2wgZGVzbGl6YW50ZSBkZSB2b2x1bWVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJObyBzZSBoYSBzZWxlY2Npb25hZG8gbmluZ8O6biBtZWRpbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTm8gaGF5IGluZm9ybWFjacOzbiBkaXNwb25pYmxlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJFbnZpYW5kbyBwYW50YWxsYSI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXQvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ldC9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTMyMzViCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXQvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlPDvHN0ZWVtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlNlYWRtZWQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLDnGxla2FuZGVudXBwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iw5xsZWthbmRlbnVwcC4gw5xoZW5kdXMgb24ga2F0a2VzdGF0dWQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IsOcbGVrYW5kZW51cHAuIMOcaGVuZGFtaW5lIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IsOcbGVrYW5kZW51cHAuIMOcaGVuZGF0dWQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iw5xsZWthbmRtaW5lIHNlYWRtZXNzZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlNlYWRtZXRlIG90c2ltaW5lIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkthdGtlc3RhIMO8aGVuZHVzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iUGVhdGEgw7xsZWthbmRtaW5lIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJTdWxnZW1pbmUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJFc2l0YW1pbmUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBlYXRhbWluZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlBlYXRhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iTGFpZW5kYW1pbmUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkFoZW5kYW1pbmUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bWkga3VqdW5kdXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iSGVsaXR1Z2V2dXNlIGxpdWd1ciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTWVlZGlhdCBwb2xlIHZhbGl0dWQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IlRlYXZlIHB1dWR1YiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iRWtyYWFuaWt1dmEgw7xsZWthbmRtaW5lIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ldS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWV1L3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYTE5ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ldS9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJHYWlsdWFrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iSWdvcnJpIGJvdG9pYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+Iklnb3J0emVrbyBib3RvaWEuIERlc2tvbmVrdGF0dXRhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJJZ29ydHpla28gYm90b2lhLiBLb25la3RhdHplbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJJZ29ydHpla28gYm90b2lhLiBLb25la3RhdHV0YSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJJZ29ycmkgaG9uYToiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJHYWlsdWFrIGJpbGF0emVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRlc2tvbmVrdGF0dSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlV0emkgaWdvcnR6ZWFyaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iSXR4aSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkVycmVwcm9kdXppdHUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNhdHUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJHZWxkaXR1Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iWmFiYWxkdSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iVG9sZXN0dSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtYXJlbiBhemFsYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJCb2x1bWVuYXJlbiBncmFkdWF0emFpbGVhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJFeiBkYSBoYXV0YXR1IG11bHRpbWVkaWEtZWR1a2lyaWsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkV6IGRhZ28gaW5mb3JtYXppb3JpayI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iUGFudGFpbGEgaWdvcnR6ZW4iPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZhL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZmEvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM2Yzc3OQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZhL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLYs9uM2LPYqtmFIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+Itiv2LPYqtqv2KfZh+KAjNmH2KciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLYr9qp2YXZhyDYp9ix2LPYp9mEINmF2K3YqtmI2KciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLYr9qp2YXZhyDZgdix2LPYqtin2K/Zhi4g2KfYsdiq2KjYp9i3INmC2LfYuSDYtNivIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLYr9qp2YXZhyDZgdix2LPYqtin2K/Zhi4g2K/Ysdit2KfZhCDZhdix2KrYqNi34oCM2LPYp9iy24wiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i2K/aqdmF2Ycg2YHYsdiz2KrYp9iv2YYuINmF2LHYqtio2Lcg2LTYryI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLYp9ix2LPYp9mEINmF2K3YqtmI2Kcg2KjZhyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Itm+24zYr9inINqp2LHYr9mGINiv2LPYqtqv2KfZh+KAjNmH2KciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i2YLYt9i5INin2LHYqtio2KfYtyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+Itiq2YjZgtmBINin2LHYs9in2YQg2YXYrdiq2YjYpyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i2KjYs9iq2YYiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLZvtiu2LQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItmF2qnYqyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+Itiq2YjZgtmBIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i2KjYstix2q8g2qnYsdiv2YYiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+Itqp2YjahtqpINqp2LHYr9mGIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i2LnaqdizINix2YjbjCDYrNmE2K8g2KLZhNio2YjZhSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLZhNi62LLZhtiv2Ycg2YXbjNiy2KfZhiDYtdiv2KciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Itix2LPYp9mG2Ycg2KfZhtiq2K7Yp9ioINmG2LTYr9mHINin2LPYqiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i2KfYt9mE2KfYudin2Kog2K/YsSDYr9iz2KrYsdizINmG24zYs9iqIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLYr9ix2K3Yp9mEINmB2LHYs9iq2KfYr9mGINi12YHYrdmHIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1maS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZpL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ODM0MzUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1maS9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iSsOkcmplc3RlbG3DpCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJMYWl0dGVldCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3QtcGFpbmlrZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3QtcGFpbmlrZS4gWWh0ZXlzIGthdGthaXN0dSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQ2FzdC1wYWluaWtlLiBZaGRpc3RldMOkw6RuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3QtcGFpbmlrZS4gWWhkaXN0ZXR0eSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJTdW9yYXRvaXN0b24ga29oZGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJFdHNpdMOkw6RuIGxhaXR0ZWl0YSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJLYXRrYWlzZSB5aHRleXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJMb3BldGEgc3VvcmF0b2lzdG8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlN1bGplIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iVG9pc3RhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJLZXNrZXl0w6QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJQeXPDpHl0w6QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJMYWFqZW5uYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iVGlpdmlzdMOkIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW1pbiBrYW5zaWt1dmEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iw4TDpG5lbnZvaW1ha2t1dWRlbiBsaXVrdXPDpMOkZGluIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJFaSB2YWxpdHR1YSBtZWRpYWEuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJUaWV0b2phIGVpIG9sZSBzYWF0YXZpbGxhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJTdW9yYXRvaXN0ZXRhYW4gbsOkeXR0w7bDpCI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZnItckNBL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZnItckNBL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0Zjk4NGIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1mci1yQ0Evc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3TDqG1lIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkFwcGFyZWlscyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJvdXRvbiBEaWZmdXNlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJvdXRvbiBEaWZmdXNlci4gRMOpY29ubmVjdMOpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJCb3V0b24gRGlmZnVzZXIuIENvbm5leGlvbiBlbiBjb3Vyc+KApiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJCb3V0b24gRGlmZnVzZXIuIENvbm5lY3TDqSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJEaWZmdXNlciBzdXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJSZWNoZXJjaGUgZFwnYXBwYXJlaWxzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlNlIGTDqWNvbm5lY3RlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkFycsOqdGVyIGxhIGRpZmZ1c2lvbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iRmVybWVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iTGlyZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iSW50ZXJyb21wcmUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJBcnLDqnRlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkTDqXZlbG9wcGVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJSw6lkdWlyZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkltYWdlIGRlIGxcJ2FsYnVtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkN1cnNldXIgZGUgcsOpZ2xhZ2UgZHUgdm9sdW1lIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJBdWN1biBtw6lkaWEgc8OpbGVjdGlvbm7DqSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iQXVjdW5lIGluZm9ybWF0aW9uIGRpc3BvbmlibGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkRpZmZ1c2lvbiBkZSBsXCfDqWNyYW4gZW4gY291cnMiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZyL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZnIvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJjMzEyZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZyL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0w6htZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJBcHBhcmVpbHMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJJY8O0bmUgQ2FzdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+Ikljw7RuZSBDYXN0LiBEw6ljb25uZWN0w6kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+Ikljw7RuZSBDYXN0LiBDb25uZXhpb27igKYiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iSWPDtG5lIENhc3QuIENvbm5lY3TDqSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJDYXN0ZXIgc3VyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iUmVjaGVyY2hlIGRcJ2FwcGFyZWlsc+KApiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEw6ljb25uZWN0ZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJBcnLDqnRlciBsYSBkaWZmdXNpb24iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkZlcm1lciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkxlY3R1cmUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iQXJyw6p0ZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJEw6l2ZWxvcHBlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iUsOpZHVpcmUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJJbWFnZSBkZSBsXCdhbGJ1bSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJDdXJzZXVyIGRlIHZvbHVtZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iQXVjdW4gbcOpZGlhIHPDqWxlY3Rpb25uw6kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkF1Y3VuZSBpbmZvcm1hdGlvbiBkaXNwb25pYmxlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJEaWZmdXNpb24gZGUgbFwnw6ljcmFuIGVuIGNvdXJz4oCmIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1nbC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWdsL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMmMzNTQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1nbC9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEaXNwb3NpdGl2b3MiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJCb3TDs24gZGUgZW1pdGlyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQm90w7NuIGRlIGVtaXRpci4gRGVzY29uZWN0YWRvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJCb3TDs24gZGUgZW1pdGlyLiBDb25lY3RhbmRvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJvdMOzbiBkZSBlbWl0aXIuIENvbmVjdGFkbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJFbWl0aXIgYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkJ1c2NhbmRvIGRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEZXNjb25lY3RhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkRldGVyIGVtaXNpw7NuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJQZWNoYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJSZXByb2R1Y2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iRGV0ZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJBbXBsaWFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJDb250cmFlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IlBvcnRhZGEgZG8gw6FsYnVtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkNvbnRyb2wgZGVzcHJhemFibGUgZG8gdm9sdW1lIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOb24gc2Ugc2VsZWNjaW9uYXJvbiByZWN1cnNvcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTm9uIGhhaSBpbmZvcm1hY2nDs24gZGlzcG/DsWlibGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkVtaXNpw7NuIGRlIHBhbnRhbGxhIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ndS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWd1L3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZDVmM2YKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ndS9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4Kq44Kq/4Kq44KuN4Kqf4KquIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuCqieCqquCqleCqsOCqo+CriyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuCqleCqvuCquOCrjeCqnyDgqpXgqrDgq4sg4Kqs4Kqf4KqoIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4KqV4Kq+4Kq44KuN4KqfIOCqleCqsOCriyDgqqzgqp/gqqguIOCqoeCqv+CquOCrjeCqleCqqOCrh+CqleCrjeCqnyDgqpXgqrDgq43gqq/gq4HgqoIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuCqleCqvuCquOCrjeCqnyDgqpXgqrDgq4sg4Kqs4Kqf4KqoLiDgqpXgqqjgq4fgqpXgq43gqp8g4Kql4KqIIOCqsOCqueCrjeCqr+CrgeCqgiDgqpvgq4ciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4KqV4Kq+4Kq44KuN4KqfIOCqleCqsOCriyDgqqzgqp/gqqguIOCqleCqqOCrh+CqleCrjeCqnyDgqqXgqq/gq4HgqoIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4KqG4Kqo4Kq+IOCqquCqsCDgqpXgqr7gqrjgq43gqp8g4KqV4Kqw4KuLIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4KqJ4Kqq4KqV4Kqw4Kqj4KuLIOCqtuCri+Cqp+CrgCDgqrDgqrngq43gqq/gqr7gqoIg4Kqb4KuA4KqPIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuCqoeCqv+CquOCrjeCqleCqqOCrh+CqleCrjeCqnyDgqpXgqrDgq4siPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLgqpXgqr7gqrjgq43gqp8g4KqV4Kqw4Kq14Kq+4Kqo4KuB4KqCIOCqsOCri+CqleCriyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4Kqs4KqC4KqnIOCqleCqsOCriyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuCqmuCqsuCqvuCqteCriyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4Kql4KuL4Kqt4Kq+4Kq14KuLIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4Kqw4KuL4KqV4KuLIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4Kq14Kq/4Kq44KuN4Kqk4KuD4KqkIOCqleCqsOCriyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4Kq44KqC4KqV4KuB4Kqa4Kq/4KqkIOCqleCqsOCriyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuCqhuCqsuCrjeCqrOCqriDgqpXgqrLgqr4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4Kq14KuJ4Kqy4KuN4Kqv4KuB4KquIOCquOCrjeCqsuCqvuCqh+CqoeCqsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4KqV4KuL4KqIIOCqruCrgOCqoeCqv+Cqr+CqviDgqqrgqrjgqoLgqqYg4KqV4Kqw4KuH4KqyIOCqqOCqpeCrgCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4KqV4KuL4KqIIOCqruCqvuCqueCqv+CqpOCrgCDgqongqqrgqrLgqqzgq43gqqcg4Kqo4Kql4KuAIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLgqrjgq43gqpXgq43gqrDgq4Dgqqjgqqjgq4cg4KqV4Kq+4Kq44KuN4KqfIOCqleCqsOCrgCDgqrDgqrngq43gqq/gqr7gqoIg4Kqb4KuHIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1oaS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWhpL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NTJhNTkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1oaS9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4KS44KS/4KS44KWN4KSf4KSuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuCkoeCkv+CkteCkvuCkh+CkuCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuCkleCkvuCkuOCljeCknyDgpJXgpLDgpYfgpIIg4KSs4KSf4KSoIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4KSV4KS+4KS44KWN4KSfIOCkleCksOClh+CkgiDgpKzgpJ/gpKguIOCkoeCkv+CkuOCkleCkqOClh+CkleCljeCknyDgpLngpYgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuCkleCkvuCkuOCljeCknyDgpJXgpLDgpYfgpIIg4KSs4KSf4KSoLiDgpJXgpKjgpYfgpJXgpY3gpJ8g4KS54KWLIOCksOCkueCkviDgpLngpYgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4KSV4KS+4KS44KWN4KSfIOCkleCksOClh+CkgiDgpKzgpJ/gpKguIOCkleCkqOClh+CkleCljeCknyDgpLngpYgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4KSH4KS4IOCkquCksCDgpJXgpL7gpLjgpY3igI3gpJ8g4KSV4KSw4KWH4KSCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4KSh4KS/4KS14KS+4KSH4KS4IOCkouClguCkguCkoiDgpLDgpLngpL4g4KS54KWIIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuCkoeCkv+CkuOCkleCkqOClh+CkleCljeCknyDgpJXgpLDgpYfgpIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLgpJXgpL7gpLjgpY3gpJ8g4KSV4KSw4KSo4KS+IOCkrOCkguCkpiDgpJXgpLDgpYfgpIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuCkrOCkguCkpiDgpJXgpLDgpYfgpIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLgpJrgpLLgpL7gpI/gpIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuCksOCli+CkleClh+CkgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuCkrOCkguCkpiDgpJXgpLDgpYfgpIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLgpLXgpL/gpLjgpY3gpKTgpL7gpLAg4KSV4KSw4KWH4KSCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLgpJvgpYvgpJ/gpL4g4KSV4KSw4KWH4KSCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4KSP4KSy4KWN4KSs4KSuIOCkhuCksOCljeCknyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgpLXgpYngpLLgpY3gpK/gpYLgpK4g4KS44KWN4KSy4KS+4KSH4KSh4KSwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgpJXgpYvgpIgg4KSu4KWA4KSh4KS/4KSv4KS+IOCkmuCkr+CkqOCkv+CkpCDgpKjgpLngpYDgpIIg4KS54KWIIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgpJXgpYvgpIgg4KSc4KS+4KSo4KSV4KS+4KSw4KWAIOCkruCljOCknOClguCkpiDgpKjgpLngpYDgpIIg4KS54KWIIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLgpLjgpY3gpJXgpY3gpLDgpYDgpKgg4KSV4KS+4KS44KWN4KSfIOCkueCliyDgpLDgpLngpYAg4KS54KWIIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1oci9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWhyL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNDNlZTcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1oci9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3VzdGF2Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlVyZcSRYWppIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iR3VtYiB6YSBlbWl0aXJhbmplIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iR3VtYiB6YSBlbWl0aXJhbmplLiBWZXphIHByZWtpbnV0YSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iR3VtYiB6YSBlbWl0aXJhbmplLiBQb3Zleml2YW5qZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJHdW1iIHphIGVtaXRpcmFuamUuIFBvdmV6YW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iRW1pdGlyYW5qZSBuYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlRyYcW+ZW5qZSB1cmXEkWFqYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJQcmVraW5pIHZlenUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJaYXVzdGF2aSBlbWl0aXJhbmplIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJaYXR2YXJhbmplIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUmVwcm9kdWtjaWphIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXV6aXJhbmplIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iWmF1c3RhdmkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJQcm/FoWlyaXZhbmplIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJTYcW+aW1hbmplIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iTmFzbG92bmljYSBhbGJ1bWEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iS2xpemHEjSB6YSBnbGFzbm/Eh3UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5pamUgb2RhYnJhbiBuaWplZGFuIG1lZGlqIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJJbmZvcm1hY2lqZSBuaXN1IGRvc3R1cG5lIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJFbWl0aXJhbmplIHphc2xvbmEiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWh1L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaHUvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM2YmRmZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWh1L3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJSZW5kc3plciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJFc3prw7Z6w7ZrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iw4F0a8O8bGTDqXMgZ29tYiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IsOBdGvDvGxkw6lzIGdvbWIuIEthcGNzb2xhdCBib250dmEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IsOBdGvDvGxkw6lzIGdvbWIuIENzYXRsYWtvesOhcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLDgXRrw7xsZMOpcyBnb21iLiBDc2F0bGFrb3p0YXR2YSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLDgXRrw7xsZMOpcyBpZGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJFc3prw7Z6w7ZrIGtlcmVzw6lzZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJMZXbDoWxhc3p0w6FzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iw4F0a8O8bGTDqXMgbGXDoWxsw610w6FzYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iQmV6w6Fyw6FzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iTGVqw6F0c3rDoXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlN6w7xuZXRlbHRldMOpcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+Ikxlw6FsbMOtdMOhcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IktpYm9udMOhcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iw5Zzc3plY3N1a8OhcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkxlbWV6Ym9yw610w7MiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iSGFuZ2VyxZFzemFiw6FseXrDsyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmluY3MgbcOpZGlhIGtpdsOhbGFzenR2YSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTmluY3MgaW5mb3Jtw6FjacOzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJLw6lwZXJuecWRdGFydGFsb20gw6F0a8O8bGTDqXNlIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1oeS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWh5L3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYzgyYjcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1oeS9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i1YDVodW01aHVr9Wh1oDVoyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLVjdWh1oDWhNWl1oAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLVgNWl1bzVodaA1bHVodWv1bTVodW2INWv1bjVs9Wh1a8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLVgNWl1bzVodaA1bHVodWv1bTVodW2INWv1bjVs9Wh1a86INWN1aHWgNaE1bYg1aHVttW71aHVv9W+1aHVriDVpyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i1YDVpdW81aHWgNWx1aHVr9W01aHVtiDVr9W41bPVodWvOiDVjdWh1oDWhNWoINWv1aHVutWh1a/WgdW+1bjWgtW0INWnIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+ItWA1aXVvNWh1oDVsdWh1a/VtNWh1bYg1a/VuNWz1aHVrzog1Y3VodaA1oTVqCDVr9Wh1brVodWv1oHVvtWh1a4g1aciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i1LjVttW/1oDVpdaEINW91aHWgNaE1agiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLVjdWh1oDWhNWl1oDVqyDVuNaA1bjVttW41oLVtCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLUsdW21bvVodW/1aXVrCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+ItS01aHVpNWh1oDVpdaB1bbVpdWsINWw1aXVvNWh1oDVsdWh1a/VuNaC1bTVqCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i1ZPVodWv1aXVrCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+ItWG1b7VodWj1aHWgNWv1aXVrCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i1LTVodWk1aHWgCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+ItS01aHVpNWh1oDVpdaB1bbVpdWsIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i1LjVttWk1aHWgNWx1aHVr9Wl1awiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+ItS/1bjVrtWv1aXVrCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+ItSx1azVotW41bTVqyDVt9Wh1brVq9WvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItWB1aHVtdW21asg1bjWgtWq1aPVttW41oLVqdW11aHVtiDVr9Wh1oDVo9Wh1b7VuNaA1avVuSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i1YTVpdWk1avVoSDWhtWh1bXVrNWl1oAg1bnVpdW2INWo1bbVv9aA1b7VpdWsIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLVj9Wl1bLVpdWv1bjWgtWp1bXVuNaC1bbVttWl1oDVqCDVsNWh1b3VodW21aXVrNWrINW51aXVtiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i1LfVr9aA1aHVttWoINWw1aXVvNWh1oDVsdWh1a/VvtW41oLVtCDVpyI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaW4vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1pbi9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjI3NTJlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaW4vc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJQZXJhbmdrYXQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJUb21ib2wgQ2FzdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IlRvbWJvbCBDYXN0LiBUZXJwdXR1cyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iVG9tYm9sIENhc3QuIE1lbmdodWJ1bmdrYW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iVG9tYm9sIENhc3QuIFRlcmh1YnVuZyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJUcmFuc21pc2lrYW4ga2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJNZW5jYXJpIHBlcmFuZ2thdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJQdXR1c2thbiBzYW1idW5nYW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJIZW50aWthbiBjYXN0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJUdXR1cCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlB1dGFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJKZWRhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iQmVyaGVudGkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJMdWFza2FuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJDaXV0a2FuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iU2FtcHVsIGFsYnVtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkJpbGFoIGdlc2VyIHZvbHVtZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iVGlkYWsgYWRhIG1lZGlhIHlhbmcgZGlwaWxpaCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iVGlkYWsgYWRhIGluZm8geWFuZyB0ZXJzZWRpYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iVHJhbnNtaXNpIGxheWFyIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1pcy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWlzL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMzVlYTYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1pcy9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iS2VyZmkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iVMOma2kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLDmnRzZW5kaW5nYXJobmFwcHVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iw5p0c2VuZGluZ2FyaG5hcHB1ci4gQWZ0ZW5ndCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iw5p0c2VuZGluZ2FyaG5hcHB1ci4gVGVuZ2lzdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLDmnRzZW5kaW5nYXJobmFwcHVyLiBUZW5ndCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJTZW5kYSDDunQgw60iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJMZWl0YcOwIGHDsCB0w6ZranVtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkFmdGVuZ2phc3QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJTdMO2w7B2YSDDunRzZW5kaW5ndSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iTG9rYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlNwaWxhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJIbMOpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iU3TDtsOwdmEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJTdMOma2thIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJNaW5ua2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJQbMO2dHV1bXNsYWciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iSGxqw7PDsHN0eXJrc3NsZcOwaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iRW5naW5uIG1pw7BpbGwgdmFsaW5uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJFbmdhciB1cHBsw71zaW5nYXIgw60gYm/DsGkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlNrasOhciBzZW5kdXIgw7p0Ijwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1pdC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWl0L3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNmUzYWMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1pdC9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEaXNwb3NpdGl2aSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IlB1bHNhbnRlIFRyYXNtZXR0aSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IlB1bHNhbnRlIFRyYXNtZXR0aS4gRGlzY29ubmVzc28iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IlB1bHNhbnRlIFRyYXNtZXR0aS4gQ29ubmVzc2lvbmUgaW4gY29yc28iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iUHVsc2FudGUgVHJhc21ldHRpLiBDb25uZXNzbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJUcmFzbWV0dGkgYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlJpY2VyY2EgZGkgZGlzcG9zaXRpdmkgaW4gY29yc28iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iU2NvbGxlZ2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJJbnRlcnJvbXBpIHRyYXNtaXNzaW9uZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iQ2hpdWRpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUmlwcm9kdWNpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkludGVycm9tcGkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJFc3BhbmRpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJDb21wcmltaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkNvcGVydGluYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJEaXNwb3NpdGl2byBkaSBzY29ycmltZW50byBkZWwgdm9sdW1lIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOZXNzdW4gY29udGVudXRvIG11bHRpbWVkaWFsZSBzZWxlemlvbmF0byI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTmVzc3VuYSBpbmZvcm1hemlvbmUgZGlzcG9uaWJpbGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlRyYXNtaXNzaW9uZSBkZWxsbyBzY2hlcm1vIGluIGNvcnNvIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1pdy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWl3L3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MmIwY2UKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1pdy9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i157Xoteo15vXqiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLXnteb16nXmdeo15nXnSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuKAj9ec15fXptefINeU16TXotec16ogQ2FzdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuKAj9ec15fXptefINeU16TXotec16ogQ2FzdC4g157XoNeV16rXpyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4oCP15zXl9em158g15TXpNei15zXqiBDYXN0LiDXnteq15fXkdeoIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuKAj9ec15fXptefINeU16TXotec16ogQ2FzdC4g157Xl9eV15HXqCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLXlNei15HXqNeUINeQ15wiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLXnteX16TXqSDXnteb16nXmdeo15nXnSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLXoNeq16ciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLXlNek16HXpyDXkNeqINeU15TXoteR16jXlCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i16HXkteV16giPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLXlNek16LXnCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i15TXqdeU15QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLXlNek16HXpyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IteU16jXl9eRIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLXm9eV15XXpSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Itei15jXmdek16og15DXnNeR15XXnSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLXnteX15XXldefINei15XXptee15QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Itec15Ag16DXkdeX16jXlCDXnteT15nXlCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i15DXmdefINee15nXk9eiINeW157XmdefIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLXlNei15HXqNeqINee16HXmiDXnteq15HXptei16oiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWphL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtamEvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE0OTcyNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWphL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLjgrfjgrnjg4bjg6AiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i56uv5pyrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i44Kt44Oj44K544OI44Ki44Kk44Kz44OzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i44Kt44Oj44K544OIIOOCouOCpOOCs+ODs+OAguaOpee2muino+mZpOa4iOOBvyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i44Kt44Oj44K544OIIOOCouOCpOOCs+ODs+OAguaOpee2muS4rSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLjgq3jg6Pjgrnjg4gg44Ki44Kk44Kz44Oz44CC5o6l57aa5riI44G/Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuOCreODo+OCueODiOOBmeOCi+ODh+ODkOOCpOOCuSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Iuerr+acq+OCkuaknOe0ouOBl+OBpuOBhOOBvuOBmSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLmjqXntprjgpLop6PpmaQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLjgq3jg6Pjgrnjg4jjgpLlgZzmraIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IumWieOBmOOCiyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuWGjeeUnyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i5LiA5pmC5YGc5q2iIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i5YGc5q2iIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i5bGV6ZaLIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLmipjjgorjgZ/jgZ/jgoAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLjgqLjg6vjg5Djg6DjgqLjg7zjg4giPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i6Z+z6YeP44K544Op44Kk44OA44O8Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLjg6Hjg4fjgqPjgqLjgYzpgbjmip7jgZXjgozjgabjgYTjgb7jgZvjgpMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuaDheWgseOBjOOBguOCiuOBvuOBm+OCkyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i55S76Z2i44KS44Kt44Oj44K544OI44GX44Gm44GE44G+44GZIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rYS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWthL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkYTA4MWEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rYS9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4YOh4YOY4YOh4YOi4YOU4YOb4YOQIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuGDm+GDneGDrOGDp+GDneGDkeGDmOGDmuGDneGDkeGDlOGDkeGDmCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuGDouGDoOGDkOGDnOGDoeGDmuGDmOGDoOGDlOGDkeGDmOGDoSDhg6bhg5jhg5rhg5Dhg5nhg5giPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLhg6Lhg6Dhg5Dhg5zhg6Hhg5rhg5jhg6Dhg5Thg5Hhg5jhg6Eg4YOm4YOY4YOa4YOQ4YOZ4YOYLiDhg5Lhg5Dhg5fhg5jhg6jhg6Phg5rhg5giPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuGDouGDoOGDkOGDnOGDoeGDmuGDmOGDoOGDlOGDkeGDmOGDoSDhg6bhg5jhg5rhg5Dhg5nhg5guIOGDm+GDmOGDm+GDk+GDmOGDnOGDkOGDoOGDlOGDneGDkeGDoSDhg5Phg5Dhg5nhg5Dhg5Xhg6jhg5jhg6Dhg5Thg5Hhg5AiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4YOi4YOg4YOQ4YOc4YOh4YOa4YOY4YOg4YOU4YOR4YOY4YOhIOGDpuGDmOGDmuGDkOGDmeGDmC4g4YOT4YOQ4YOZ4YOQ4YOV4YOo4YOY4YOg4YOU4YOR4YOj4YOa4YOYIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuGDouGDoOGDkOGDnOGDoeGDmuGDmOGDoOGDlOGDkeGDkDoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLhg5vhg53hg6zhg6fhg53hg5Hhg5jhg5rhg53hg5Hhg5Thg5Hhg5jhg6Eg4YOb4YOd4YOr4YOY4YOU4YOR4YOQLi4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuGDmeGDkOGDleGDqOGDmOGDoOGDmOGDoSDhg5Lhg5Dhg6zhg6fhg5Xhg5Thg6Lhg5AiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLhg6Lhg6Dhg5Dhg5zhg6Hhg5rhg5jhg6Dhg5Thg5Hhg5jhg6Eg4YOo4YOU4YOs4YOn4YOV4YOU4YOi4YOQIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLhg5Phg5Dhg67hg6Phg6Dhg5Xhg5AiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLhg5Phg5Dhg5nhg5Xhg6Dhg5AiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuGDnuGDkOGDo+GDluGDkCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuGDqOGDlOGDrOGDp+GDleGDlOGDouGDkCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuGDkuGDkOGDqOGDmuGDkCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4YOp4YOQ4YOZ4YOU4YOq4YOV4YOQIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4YOQ4YOa4YOR4YOd4YOb4YOY4YOhIOGDkuGDkOGDoOGDlOGDmeGDkOGDnOGDmCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLhg67hg5vhg5jhg6Eg4YOh4YOa4YOQ4YOY4YOT4YOU4YOg4YOYIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLhg5vhg5Thg5Phg5jhg5Ag4YOQ4YOg4YOp4YOU4YOj4YOa4YOYIOGDkOGDoCDhg5Dhg6Dhg5jhg6EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuGDmOGDnOGDpOGDneGDoOGDm+GDkOGDquGDmOGDkCDhg5Dhg6Ag4YOQ4YOg4YOY4YOhIOGDruGDlOGDmuGDm+GDmOGDoeGDkOGDrOGDleGDk+GDneGDm+GDmCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4YOb4YOY4YOb4YOT4YOY4YOc4YOQ4YOg4YOU4YOd4YOR4YOhIOGDlOGDmeGDoOGDkOGDnOGDmOGDoSDhg5Lhg5Dhg5Phg5Dhg6rhg5Thg5vhg5AiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWtrL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta2svc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRkY2JiMwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWtrL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLQltKv0LnQtSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLSmtKx0YDRi9C70pPRi9C70LDRgCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItCi0YDQsNC90YHQu9GP0YbQuNGP0LvQsNGDINGC0q/QudC80LXRgdGWIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iXCLQotGA0LDQvdGB0LvRj9GG0LjRj9C70LDRg1wiINGC0q/QudC80LXRgdGWLiDQkNC20YvRgNCw0YLRg9C70YsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+Ilwi0KLRgNCw0L3RgdC70Y/RhtC40Y/Qu9Cw0YNcIiDRgtKv0LnQvNC10YHRli4g0prQvtGB0YvQu9GD0LTQsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJcItCi0YDQsNC90YHQu9GP0YbQuNGP0LvQsNGDXCIg0YLSr9C50LzQtdGB0ZYuINKa0L7RgdGL0LvQtNGLIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItCa0LXQu9C10YHRltCz0LUg0YLRgNCw0L3RgdC70Y/RhtC40Y/Qu9Cw0YMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLSmtKx0YDRi9C70pPRi9C70LDRgNC00Ysg0YLQsNCx0YMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i0JDQttGL0YDQsNGC0YMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLQotGA0LDQvdGB0LvRj9GG0LjRj9C70LDRg9C00Ysg0YLQvtKb0YLQsNGC0YMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+ItCW0LDQsdGDIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i0J7QudC90LDRgtGDIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLQmtGW0LTRltGA0YLRgyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+ItCi0L7Sm9GC0LDRgtGDIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i0JbQsNGOIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLQltC40Y4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLQkNC70YzQsdC+0Lwg0YjQtdCx0LXRgNGWIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItCU0YvQsdGL0YEg0LTQtdKj0LPQtdC50ZbQvdGW0qMg0LbSr9Cz0ZbRgNGC0LrRltGB0ZYiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItCV0YjQsdGW0YAg0YLQsNGB0YPRiNGLINGC0LDSo9C00LDQu9C80LDSk9Cw0L0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+ItKa0L7QuyDQttC10YLRltC80LTRliDQsNKb0L/QsNGA0LDRgiDQttC+0psiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+ItCt0LrRgNCw0L3QtNGLINGC0YDQsNC90YHQu9GP0YbQuNGP0LvQsNGDIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rbS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWttL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NDc4MGUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rbS9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4Z6U4Z+S4Z6a4Z6W4Z+Q4Z6T4Z+S4Z6SIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuGep+GelOGegOGemuGejuGfjSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuGelOGfiuGevOGej+Geu+GehOGegeGetuGenyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuGegeGetuGen+GelOGfiuGevOGej+Geu+GehOGfliDhnpThnrbhnpPhnoDhnrbhno/hn4vhnpXhn5Lhno/hnrbhnoXhn4siPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuGegeGetuGen+GelOGfiuGevOGej+Geu+GehOGfliDhnoDhn4bhnpbhnrvhnoThnpfhn5LhnofhnrbhnpThn4siPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4Z6B4Z624Z6f4Z6U4Z+K4Z684Z6P4Z674Z6E4Z+WIOGelOGetuGek+Gel+GfkuGeh+GetuGelOGfi+GeoOGevuGemSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLhnpThnonhn5LhnofhnrzhnpPhnpHhn4UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLhnoDhn4bhnpbhnrvhnoThnp/hn5Lhnpzhn4LhnoThnprhnoDhnqfhnpThnoDhnprhno7hn40iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4Z6V4Z+S4Z6K4Z624Z6F4Z+LIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4Z6I4Z6U4Z+L4Z6X4Z+S4Z6H4Z624Z6U4Z+LIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLhnpThnrfhnpEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLhnoXhnrbhnoDhn4siPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuGeleGfkuGeouGetuGegCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuGeiOGelOGfiyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuGeluGehOGfkuGemuGeuOGegCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4Z6U4Z6E4Z+S4Z6a4Z694Z6YIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4Z6f4Z+S4Z6T4Z624Z6K4Z+D4Z6f4Z634Z6b4Z+S4Z6U4Z+I4Z6i4Z624Z6b4Z+L4Z6U4Z+K4Z674Z6YIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuGemuGelOGetuGemuGegOGemOGfkuGemuGet+Gej+Gen+GfhuGeoeGfgeGehCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4Z6C4Z+S4Z6Y4Z624Z6T4Z6A4Z624Z6a4Z6H4Z+S4Z6a4Z6+4Z6f4Z6Y4Z+B4Z6M4Z+A4Z6R4Z+BIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLhnpjhnrfhnpPhnpjhnrbhnpPhnpbhn5Dhno/hn4zhnpjhnrbhnpPhnpHhn4EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuGegOGfhuGeluGeu+GehOGegeGetuGen+GeouGfgeGegOGfkuGemuGehOGfiyI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta24vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rbi9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjM3ZmRkCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta24vc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuCyuOCyv+CyuOCzjeCyn+CygiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgsrjgsr7gsqfgsqjgspfgsrPgs4EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgsqzgsr/gsqTgs43gsqTgsrDgsr/gsrjgs4Eg4LKs4LKf4LKo4LON4oCMIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4LKs4LK/4LKk4LON4LKk4LKw4LK/4LK44LOBIOCyrOCyn+CyqOCzjeKAjC4g4LK44LKC4LKq4LKw4LON4LKVIOCyleCyoeCyv+CypOCyl+CziuCys+Cyv+CyuOCysuCyvuCyl+Cyv+CypuCzhiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4LKs4LK/4LKk4LON4LKk4LKw4LK/4LK44LOBIOCyrOCyn+CyqOCzjeKAjC4g4LK44LKC4LKq4LKw4LON4LKV4LK/4LK44LKy4LK+4LKX4LOB4LKk4LON4LKk4LK/4LKm4LOGIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuCyrOCyv+CypOCzjeCypOCysOCyv+CyuOCzgSDgsqzgsp/gsqjgs43igIwuIOCyuOCyguCyquCysOCzjeCyleCyv+CypOCyl+CziuCyguCyoeCyv+CypuCzhiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLgsofgsqbgspXgs43gspXgs4Yg4LKs4LK/4LKk4LON4LKk4LKw4LK/4LK44LK/Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4LK44LK+4LKn4LKo4LKX4LKz4LKo4LON4LKo4LOBIOCyueCzgeCyoeCzgeCyleCysuCyvuCyl+CzgeCypOCzjeCypOCyv+CypuCzhiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLgsrjgsoLgsqrgsrDgs43gspUg4LKV4LKh4LK/4LKk4LKX4LOK4LKz4LK/4LK44LOBIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4LKs4LK/4LKk4LON4LKk4LKw4LK/4LK44LOB4LK14LK/4LKV4LOGIOCyqOCyv+CysuCzjeCysuCyv+CyuOCyvyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4LKu4LOB4LKa4LON4LKa4LOBIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4LKq4LON4LKy4LOHIOCyruCyvuCyoeCyvyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4LK14LK/4LKw4LK+4LKuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4LKo4LK/4LKy4LON4LKy4LK/4LK44LK/Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4LK14LK/4LK44LON4LKk4LKw4LK/4LK44LOBIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLgsrjgsoLgspXgs4Hgsprgsr/gsrjgs4EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLgsobgsrLgs43gsqzgsq7gs40g4LKV4LKy4LOGIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuCyteCyvuCysuCzjeCyr+CzguCyruCzjSDgsrjgs43gsrLgs4jgsqHgsrDgs40iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuCyr+CyvuCyteCzgeCypuCzhyDgsq7gsr7gsqfgs43gsq/gsq4g4LKG4LKv4LON4LKV4LOG4LKu4LK+4LKh4LKy4LK+4LKX4LK/4LKy4LON4LKyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgsq/gsr7gsrXgs4Hgsqbgs4cg4LKu4LK+4LK54LK/4LKk4LK/IOCysuCyreCzjeCyr+CyteCyv+CysuCzjeCysiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4LKq4LKw4LKm4LOG4LKv4LKo4LON4LKo4LOBIOCyrOCyv+CypOCzjeCypOCysOCyv+CyuOCysuCyvuCyl+CzgeCypOCzjeCypOCyv+CypuCzhiI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta28vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rby9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTg5M2E5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta28vc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuyLnOyKpO2FnCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLquLDquLAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLsoITshqEg67KE7Yq8Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i7KCE7IahIOuyhO2KvC4g7Jew6rKwIO2VtOygnOuQqCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i7KCE7IahIOuyhO2KvC4g7Jew6rKwIOykkSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLsoITshqEg67KE7Yq8LiDsl7DqsrDrkKgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i7KCE7Iah7ZWgIOq4sOq4sCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Iuq4sOq4sOulvCDssL7ripQg7KSRIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuyXsOqysCDtlbTsoJwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLsoITshqEg7KSR7KeAIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLri6vquLAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLsnqzsg50iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuydvOyLnOykkeyngCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuykkeyngCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+Iu2OvOy5mOq4sCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i7KCR6riwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i7JWo67KU7JWE7Yq4Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuuzvOulqCDsiqzrnbzsnbTrjZQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuyEoO2Dne2VnCDrr7jrlJTslrQg7JeG7J2MIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLsoJXrs7TqsIAg7JeG7Iq164uI64ukLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i7ZmU66m0IOyghOyGoSDspJEiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWt5L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta3kvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc4MTNhZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWt5L3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLQotGD0YLRg9C8Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+ItCi0q/Qt9C806nQutGC06nRgCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItCi0YvRiNC60Ysg0Y3QutGA0LDQvdCz0LAg0YfRi9Cz0LDRgNGD0YMg0LHQsNGB0LrRi9GH0YsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLQotGL0YjQutGLINGN0LrRgNCw0L3Qs9CwINGH0YvQs9Cw0YDRg9GDINCx0LDRgdC60YvRh9GLLiDQotKv0LfQvNOp0Log0LDQttGL0YDQsNC/INGC0YPRgNCw0YIuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLQotGL0YjQutGLINGN0LrRgNCw0L3Qs9CwINGH0YvQs9Cw0YDRg9GDINCx0LDRgdC60YvRh9GLLiDQotKv0LfQvNOp0Log0YLRg9GC0LDRiNGD0YPQtNCwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+ItCi0YvRiNC60Ysg0Y3QutGA0LDQvdCz0LAg0YfRi9Cz0LDRgNGD0YMg0LHQsNGB0LrRi9GH0YsuINCi0q/Qt9C806nQuiDRgtGD0YLQsNGI0YvQvyDRgtGD0YDQsNGCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItCi06nQvNOp0L3QutKv0LPTqSDRh9GL0LPQsNGA0YPRgyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+ItCi0q/Qt9C806nQutGC06nRgCDQuNC30LTQtdC70q/Sr9C006kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i0JDQttGL0YDQsNGC0YPRgyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+ItCi0YvRiNC6INGN0LrRgNCw0L3Qs9CwINGH0YvQs9Cw0YDQvdGDINGC0L7QutGC0L7RgtGD0YMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+ItCW0LDQsdGD0YMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLQntC50L3QvtGC0YPRgyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i0KLRi9C90LTRi9GA0YPRgyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+ItCi0L7QutGC0L7RgtGD0YMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLQltCw0LnRi9C/INC606nRgNGB06nRgtKv0q8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+ItCW0YvQudGL0YjRgtGL0YDRg9GDIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i0JDQu9GM0LHQvtC8INC80YPQutCw0LHQsNGB0YsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i0q7QvdC00q8g0LrQsNGC0YPRg9C70LDRgtGD0YPRh9GDINGB0YvQtNGL0YDQvNCwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLQkdC40YAg0LTQsCDQvNC10LTQuNCwINGE0LDQudC7INGC0LDQvdC00LDQu9Cz0LDQvSDQttC+0LoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+ItCt0Ycg0LzQsNCw0LvRi9C80LDRgiDQttC+0LoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+ItCi0YvRiNC60Ysg0Y3QutGA0LDQvdCz0LAg0YfRi9Cz0LDRgNGL0LvRg9GD0LTQsCI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbGFuZC9kaW1lbnMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbGFuZC9kaW1lbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZjFlMWQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1sYW5kL2RpbWVucy54bWwKQEAgLTAsMCArMSwyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cmVzb3VyY2VzPgorICAgIDwhLS0gTWVkaWFSb3V0ZUNvbnRyb2xsZXIncyB2b2x1bWUgZ3JvdXAgbGlzdCAtLT4KKyAgICA8ZWF0LWNvbW1lbnQgLz4KKyAgICA8IS0tIE1heGltdW0gaGVpZ2h0IG9mIHZvbHVtZSBncm91cCBsaXN0LiAtLT4KKyAgICA8ZGltZW4gbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9tYXhfaGVpZ2h0Ij4xMzJkcDwvZGltZW4+CisgICAgPCEtLSBIZWlnaHQgb2Ygdm9sdW1lIGdyb3VwIGl0ZW0uIC0tPgorICAgIDxkaW1lbiBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2l0ZW1faGVpZ2h0Ij42MWRwPC9kaW1lbj4KKyAgICA8IS0tIFNpemUgb2YgYW4gaXRlbSdzIGljb24uIC0tPgorICAgIDxkaW1lbiBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2l0ZW1faWNvbl9zaXplIj4xOGRwPC9kaW1lbj4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbG8vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1sby9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTczN2RiCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbG8vc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuC6peC6sOC6muC6u+C6miI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLguq3gurjgupvgurDguoHguq3gupkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgupvgurjgu4jguqHigIvguoTgurLigIvguqrigIvgupfgu4wiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgupvgurjgu4jguqHguqrgurvgu4jguofguqrgurHgupnguo3gurLgupkuIOC6leC6seC6lOC6geC6suC6meC7gOC6iuC6t+C7iOC6reC6oeC6leC7jeC7iOC7geC6peC7ieC6pyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4Lqb4Lq44LuI4Lqh4Lqq4Lq74LuI4LqH4Lqq4Lqx4LqZ4LqN4Lqy4LqZLiDguoHgurPguqXgurHguofgu4Dguorgurfgu4jguq3guqHgupXgu43gu4giPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4Lqb4Lq44LuI4Lqh4Lqq4Lq74LuI4LqH4Lqq4Lqx4LqZ4LqN4Lqy4LqZLiDgu4Dguorgurfgu4jguq3guqHgupXgu43gu4jgu4HguqXgu4nguqciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4Lqq4Lq74LuI4LqH4Lqq4Lqx4LqZ4LqN4Lqy4LqZ4Lqr4LqyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4LqB4Lqz4Lql4Lqx4LqH4oCL4LqK4Lqt4LqB4oCL4Lqr4Lqy4oCL4Lqt4Lq44oCL4Lqb4Lqw4oCL4LqB4Lqt4LqZIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuC6leC6seC6lOC6geC6suC6meC7gOC6iuC6t+C7iOC6reC6oeC6leC7jeC7iCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuC6ouC6uOC6lOC6geC6suC6meC6quC6u+C7iOC6h+C6quC6seC6meC6jeC6suC6mSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4Lqb4Lq04LqUIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4Lqr4Lq84Lq04LuJ4LqZIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLguqLgurjgupTguorgurvgu4jguqfguoTgurLguqciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLguqLgurjgupQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLguoLgurDguqvguo3gurLguo0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuC6q+C6jeC7jeC7ieC6peC6u+C6hyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuC7nOC7ieC6suC6m+C6u+C6geC6reC6sOC6peC6sOC6muC7jeC7ieC6siI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgupXgurvguqfgupvgurHguprguqXgurDgupTgurHguprguqrgur3guociPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuC6muC7jeC7iOKAi+C7hOC6lOC7ieKAi+C7gOC6peC6t+C6reC6geKAi+C6oeC6teKAi+C7gOC6lOC6jeKAi+C7g+C6lOKAi+C7hOC6p+C7iSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4Lqa4LuN4LuI4oCL4Lqh4Lq14oCL4LqC4LuN4LuJ4oCL4Lqh4Lq54LqZIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLguoHgurLgupnguqrgurvgu4jguofgup7gurLguprgu5zgu4ngurLguojgu40iPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWx0L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbHQvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYwMzZkMQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWx0L3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IsSucmVuZ2luaWFpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iUGVyZGF2aW1vIG15Z3R1a2FzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iUGVyZGF2aW1vIG15Z3R1a2FzLiBBdHNpanVuZ3RhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJQZXJkYXZpbW8gbXlndHVrYXMuIFByaXNpanVuZ2lhbWEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iUGVyZGF2aW1vIG15Z3R1a2FzLiBQcmlzaWp1bmd0YSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJQZXJkdW90aSDEryI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlJhbmRhbWkgxK9yZW5naW5pYWkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iQXRqdW5ndGkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJTdXN0YWJkeXRpIHBlcmRhdmltxIUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlXFvmRhcnl0aSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkxlaXN0aSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUHJpc3RhYmR5dGkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTdXN0YWJkeXRpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iScWhc2tsZWlzdGkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlN1dHJhdWt0aSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtbyB2aXLFoWVsaXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iR2Fyc3VtbyDFoWxpYXXFvmlrbGlzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOZXBhc2lyaW5rdGEgam9raWEgbWVkaWphIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJJbmZvcm1hY2lqYSBuZXBhc2lla2lhbWEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlBlcmR1b2RhbWFzIGVrcmFuYXMiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWx2L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbHYvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU0MDYzZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWx2L3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0xJNtYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJJZXLEq2NlcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkFwcmFpZGVzIHBvZ2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJBcHJhaWRlcyBwb2dhLiBTYXZpZW5vanVtcyBwxIFydHJhdWt0cyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQXByYWlkZXMgcG9nYS4gTm90aWVrIHNhdmllbm9qdW1hIGl6dmVpZGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQXByYWlkZXMgcG9nYS4gU2F2aWVub2p1bXMgaXp2ZWlkb3RzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkFwcmFpZMSrxaFhbmEgdXogaWVyxKtjaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Ik5vdGllayBpZXLEq8SNdSBtZWtsxJPFoWFuYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJBdHZpZW5vdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkFwdHVyxJN0IGFwcmFpZGkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkFpenbEk3J0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iQXRza2HFhm90Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJBcHR1csSTdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkFwdHVyxJN0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iSXp2xJNyc3QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlNha8S8YXV0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW1hIHbEgWNpxYbFoSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJTa2HEvHVtYSBzbMSrZG5pcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmF2IGF0bGFzxKt0aSBtdWx0aXZpZGVzIGZhaWxpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOYXYgcGllZWphbWEgaW5mb3JtxIFjaWphIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJOb3RpZWsgZWtyxIFuYSBhcHJhaWRlIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tay9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1rL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZGVlMzYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tay9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i0KHQuNGB0YLQtdC8Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+ItCj0YDQtdC00LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLQmtC+0L/Rh9C10YLQviDQt9CwIENhc3QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLQmtC+0L/Rh9C1INC30LAgQ2FzdC4g0JjRgdC60LvRg9GH0LXQvdC+Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLQmtC+0L/Rh9C1INC30LAgQ2FzdC4g0KHQtSDQv9C+0LLRgNC30YPQstCwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+ItCa0L7Qv9GH0LUg0LfQsCBDYXN0LiDQn9C+0LLRgNC30LDQvdC+Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItCV0LzQuNGC0YPQstCw0Zgg0L3QsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+ItCh0LUg0LHQsNGA0LDQsNGCINGD0YDQtdC00LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i0JjRgdC60LvRg9GH0LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLQodC+0L/RgNC4INCz0L4g0LXQvNC40YLRg9Cy0LDRmtC10YLQviI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i0JfQsNGC0LLQvtGA0LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLQoNC10L/RgNC+0LTRg9GG0LjRgNCw0ZgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCf0LDRg9C30LjRgNCw0ZgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLQodC+0L/RgNC4Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i0J/RgNC+0YjQuNGA0LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+ItCh0L7QsdC10YDQuCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+ItCa0L7RgNC40YbQsCDQvdCwINCw0LvQsdGD0LwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i0JvQuNC30LPQsNGHINC30LAg0ZjQsNGH0LjQvdCwINC90LAg0LfQstGD0LoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItCd0LUg0YHQtSDQuNC30LHRgNCw0L3QuCDQvNC10LTQuNGD0LzQuCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i0J3QtdC80LAg0LTQvtGB0YLQsNC/0L3QuCDQuNC90YTQvtGA0LzQsNGG0LjQuCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i0JXQutGA0LDQvdC+0YIg0YHQtSDQtdC80LjRgtGD0LLQsCI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbWwvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tbC9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDkxNGI5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbWwvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuC0uOC0v+C0uOC1jeC0seC1jeC0seC0giI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgtIngtKrgtJXgtLDgtKPgtJngtY3gtJngtb4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgtJ/gtL7gtKrgtY3gtKrgtYHgtJrgtYbgtK/gtY3gtK/gtYHgtJUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgtJXgtL7gtLjgtY3gtLHgtY3gtLHgtY0g4LSs4LSf4LWN4LSf4LW6LiDgtLXgtL/gtJrgtY3gtJvgtYfgtKbgtL/gtJrgtY3gtJrgtYEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuC0leC0vuC0uOC1jeC0seC1jeC0seC1jSDgtKzgtJ/gtY3gtJ/gtbouIOC0leC0o+C0leC1jeKAjOC0seC1jeC0seC1geC0muC1huC0r+C1jeC0r+C1geC0qOC1jeC0qOC1gSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgtJXgtL7gtLjgtY3gtLHgtY3gtLHgtY0g4LSs4LSf4LWN4LSf4LW6LiDgtJXgtKPgtJXgtY3gtLHgtY3gtLHgtYHgtJrgtYbgtK/gtY3gtKTgtYEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4LSH4LSk4LS/4LSy4LWH4LSV4LWN4LSV4LWNIOC0leC0vuC0uOC1jeC0seC1jeC0seC1geC0muC1huC0r+C1jeC0r+C1geC0lSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuC0ieC0quC0leC0sOC0o+C0meC1jeC0meC1viDgtJXgtKPgtY3gtJ/gtYbgtKTgtY3gtKTgtYHgtKjgtY3gtKjgtYEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4LS14LS/4LSa4LWN4LSb4LWH4LSm4LS/4LSV4LWN4LSV4LWB4LSVIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4LSV4LS+4LS44LWN4LSx4LWN4LSx4LWB4LSa4LWG4LSv4LWN4LSv4LW9IOC0qOC0v+C1vOC0pOC1jeC0pOC1geC0lSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4LSF4LS14LS44LS+4LSo4LS/4LSq4LWN4LSq4LS/4LSV4LWN4LSV4LWB4LSVIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4LSq4LWN4LSy4LWHIOC0muC1huC0r+C1jeC0r+C1geC0lSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4LSk4LW94LSV4LWN4LSV4LS+4LSy4LSCIOC0qOC0v+C1vOC0pOC1jeC0pOC1giI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuC0qOC0v+C0sOC1jeKAjeC0pOC1jeC0pOC1geC0lSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuC0teC0v+C0leC0uOC0v+C0quC1jeC0quC0v+C0leC1jeC0leC1geC0lSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4LSa4LWB4LSw4LWB4LSV4LWN4LSV4LWB4LSVIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4LSG4LW94LSs4LSCIOC0huC1vOC0n+C1jeC0n+C1jSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgtLXgtYvgtLPgtL/gtK/gtIIg4LS44LWN4LSy4LWI4LSh4LW8Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgtK7gtYDgtKHgtL/gtK/gtK/gtYrgtKjgtY3gtKjgtYHgtIIg4LSk4LS/4LSw4LSe4LWN4LSe4LWG4LSf4LWB4LSk4LWN4LSk4LS/4LSf4LWN4LSf4LS/4LSy4LWN4LSyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgtLXgtL/gtLXgtLDgtJngtY3gtJngtLPgtYrgtKjgtY3gtKjgtYHgtIIg4LSy4LSt4LWN4LSv4LSu4LSy4LWN4LSyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLgtLjgtY3igIzgtJXgtY3gtLDgtYDgtbsg4LSV4LS+4LS44LWN4LSx4LWN4LSx4LWB4LSa4LWG4LSv4LWN4LSv4LWB4LSo4LWN4LSo4LWBIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tbi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1uL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmODdjOTIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tbi9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i0KHQuNGB0YLQtdC8Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+ItCi06nRhdOp06nRgNOp0LzQttKv0q/QtCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItCU0LDQvNC20YPRg9C70LDRhSDRgtC+0LLRh9C70YPRg9GAIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i0JTQsNC80LbRg9GD0LvQsNGFINGC0L7QstGH0LvRg9GD0YAuINCh0LDQu9GB0LDQvSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i0JTQsNC80LbRg9GD0LvQsNGFINGC0L7QstGH0LvRg9GD0YAuINCl0L7Qu9Cx0L7QtiDQsdCw0LnQvdCwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+ItCU0LDQvNC20YPRg9C70LDRhSDRgtC+0LLRh9C70YPRg9GALiDQpdC+0LvQsdC+0LPQtNGB0L7QvSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLQlNCw0LzQttGD0YPQu9Cw0YUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLQotOp0YXTqdOp0YDTqdC80LYg0YXQsNC50LYg0LHQsNC50L3QsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLQodCw0LvQs9Cw0YUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLQlNCw0LzQttGD0YPQu9Cw0YXRi9CzINC30L7Qs9GB0L7QvtGFIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLQpdCw0LDRhSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+ItCi0L7Qs9C70YPRg9C70LDRhSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i0KLSr9GAINC30L7Qs9GB0L7QvtGFIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i0JfQvtCz0YHQvtC+0YUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLQlNGN0LvQs9GN0YUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+ItCl0YPRgNCw0LDRhSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+ItCm0L7QvNCz0LjQudC9INC30YPRgNCw0LMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i0JTRg9GD0L3RiyDRgtKv0LLRiNC40L0g0YLQsNCw0YDRg9GD0LvQsNCz0YciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItCv0LzQsNGAINGHINC80LXQtNC40LAg0YHQvtC90LPQvtC+0LPSr9C5Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLQnNGN0LTRjdGN0LvRjdC7INCx0LDQudGF0LPSr9C5INCx0LDQudC90LAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+ItCU0Y3Qu9Cz0Y3RhtC40LnQsyDQtNCw0LzQttGD0YPQu9C2INCx0LDQudC90LAiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1yL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbXIvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZmYmViYgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1yL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLgpLjgpL/gpLjgpY3gpJ/gpK4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4KSh4KS/4KS14KWN4KS54KS+4KSH4KS44KWH4KS4Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4KSV4KS+4KS44KWN4KSfIOCkrOCkn+CkoyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuCkleCkvuCkuOCljeCknyDgpKzgpJ/gpKMuIOCkoeCkv+CkuOCljeCkleCkqOClh+CkleCljeCknyDgpJXgpYfgpLLgpYciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuCkleCkvuCkuOCljeCknyDgpKzgpJ/gpKMuIOCkleCkqOClh+CkleCljeCknyDgpJXgpLDgpKQg4KSG4KS54KWHIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuCkleCkvuCkuOCljeCknyDgpKzgpJ/gpKMuIOCkleCkqOClh+CkleCljeCknyDgpJXgpYfgpLLgpYciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4KSv4KS+4KS14KSwIOCkleCkvuCkuOCljeCknyDgpJXgpLDgpL4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLgpKHgpL/gpLXgpY3gpLngpL7gpIfgpLjgpYfgpLgg4KS24KWL4KSn4KSkIOCkhuCkueClhyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLgpKHgpL/gpLjgpY3igI3gpJXgpKjgpYfgpJXgpY3igI3gpJ8g4KSV4KSw4KS+Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4KSV4KS+4KS44KWN4KSfIOCkleCksOCko+ClhyDgpKXgpL7gpILgpKzgpLXgpL4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuCkrOCkguCkpiDgpJXgpLDgpL4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLgpKrgpY3gpLLgpYcg4KSV4KSw4KS+Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLgpLXgpL/gpLDgpL7gpK4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLgpKXgpL7gpILgpKzgpL4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLgpLXgpL/gpLjgpY3gpKTgpYPgpKQg4KSV4KSw4KS+Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLgpLjgpILgpJXgpYHgpJrgpL/gpKQg4KSV4KSw4KS+Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4KSF4KSy4KWN4KSs4KSuIOCkleCksuCkviI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgpLXgpY3gpLngpYngpLLgpY3gpK/gpYLgpK4g4KS44KWN4KSy4KS+4KSv4KSh4KSwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgpK7gpYDgpKHgpL/gpK/gpL4g4KSo4KS/4KS14KSh4KSy4KS+IOCkqOCkvuCkueClgCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4KSV4KWL4KSj4KSk4KWA4KS54KWAIOCkruCkvuCkueCkv+CkpOClgCDgpIngpKrgpLLgpKzgpY3gpKcg4KSo4KS+4KS54KWAIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLgpLjgpY3gpJXgpY3gpLDgpYDgpKgg4KSV4KS+4KS44KWN4oCN4KSfIOCkleCksOCkpCDgpIbgpLngpYciPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1zL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbXMvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg1ZTQ4MAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1zL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iUGVyYW50aSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJ1dGFuZyBIYW50YXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJCdXRhbmcgaGFudGFyLiBTYW1idW5nYW4gZGlwdXR1c2thbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQnV0YW5nIGhhbnRhci4gTWVueWFtYnVuZyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJCdXRhbmcgaGFudGFyLiBEaXNhbWJ1bmdrYW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iSGFudGFyIGtlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iTWVuY2FyaSBwZXJhbnRpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlB1dHVza2FuIHNhbWJ1bmdhbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkJlcmhlbnRpIG1lbmdoYW50YXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlR1dHVwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iTWFpbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iSmVkYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkJlcmhlbnRpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iS2VtYmFuZ2thbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iUnVudHVoa2FuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iU2VuaSBhbGJ1bSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJQZWx1bmN1ciBrZWxhbnRhbmdhbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iVGlhZGEgbWVkaWEgZGlwaWxpaCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTWFrbHVtYXQgdGlkYWsgdGVyc2VkaWEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Ik1lbmdoYW50YXIgc2tyaW4iPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW15L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbXkvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgzZDgwNQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW15L3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLhgIXhgJThgIXhgLoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4YCF4YCA4YC64YCV4YCF4YC54YCF4YCK4YC64YC44YCZ4YC74YCs4YC4Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4YCA4YCs4YCF4YC64YCQ4YC64YCc4YCv4YCV4YC64YCb4YCU4YC6IOGAgeGAnOGAr+GAkOGAuiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuGAgOGArOGAheGAuuGAgeGAnOGAr+GAkOGAuuGBiyDhgIHhgLvhgK3hgJDhgLrhgIbhgIDhgLrhgJnhgJHhgKzhgLjhgJXhgKsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuGAgOGArOGAheGAuuGAgeGAnOGAr+GAkOGAuuGBiyDhgIHhgLvhgK3hgJDhgLrhgIbhgIDhgLrhgJThgLHhgJ7hgIrhgLoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4YCA4YCs4YCF4YC64YCB4YCc4YCv4YCQ4YC64YGLIOGAgeGAu+GAreGAkOGAuuGAhuGAgOGAuuGAkeGArOGAuOGAnuGAiuGAuiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLhgIDhgKzhgIXhgLrhgJzhgK/hgJXhgLrhgJvhgJThgLog4YCF4YCA4YC6Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4YCF4YCA4YC64YCV4YCF4YC54YCF4YCK4YC64YC44YCZ4YC74YCs4YC4IOGAm+GAvuGArOGAluGAveGAseGAgeGAvOGAhOGAuuGAuCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLhgIbhgIDhgLrhgJ7hgL3hgJrhgLrhgJnhgL7hgK8g4YCW4YC84YCQ4YC64YCb4YCU4YC6Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4YCA4YCs4YCF4YC64YCc4YCv4YCV4YC64YCB4YC84YCE4YC64YC4IOGAm+GAleGAuuGAm+GAlOGAuiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4YCV4YCt4YCQ4YC64YCb4YCU4YC6Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4YCW4YC94YCE4YC34YC64YCb4YCU4YC6Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLhgIHhgI/hgJvhgJXhgLrhgJvhgJThgLoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLhgJvhgJXhgLrhgJvhgJThgLoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLhgJbhgLzhgJThgLfhgLrhgIHhgLvhgJvhgJThgLrhgYMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuGAgeGAseGAq+GAgOGAuuGAnuGAreGAmeGAuuGAuOGAm+GAlOGAui4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuGAoeGAmuGAuuGAnOGAuuGAmOGAmeGAuuGAleGAr+GAtiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLhgKHhgJ7hgLbhgKHhgJDhgK3hgK/hgLjhgKHhgIDhgLvhgJrhgLrhgIHhgLvhgK3hgJThgLrhgJ7hgIrhgLfhgLog4YCG4YCc4YCt4YCv4YCA4YC64YCS4YCrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLhgJnhgIrhgLrhgJ7hgIrhgLfhgLrhgJnhgK7hgJLhgK7hgJnhgL4g4YCZ4YCb4YC94YCx4YC44YCB4YC74YCa4YC64YCR4YCs4YC44YCV4YCrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLhgKHhgIHhgLvhgIDhgLrhgKHhgJzhgIDhgLog4YCZ4YCb4YCb4YC+4YCt4YCU4YCt4YCv4YCE4YC64YCV4YCrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLhgJDhgIrhgLrhgLjhgJbhgLzhgJDhgLrhgJvhgLHhgLgg4YCZ4YC74YCA4YC64YCU4YC+4YCs4YCV4YC84YCE4YC6Ijwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1uYi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW5iL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNzY0YzkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1uYi9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdGVtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkVuaGV0ZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0LWlrb25ldCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3Qta25hcHBlbi4gRnJha29ibGV0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0LWtuYXBwZW4uIEtvYmxlciB0aWwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQ2FzdC1rbmFwcGVuLiBUaWxrb2JsZXQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdCB0aWwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJTw7hrZXIgZXR0ZXIgZW5oZXRlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJLb2JsZSBmcmEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJTdG9wcCBjYXN0aW5nZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+Ikx1a2siPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJTcGlsbCBhdiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iU2V0dCBww6UgcGF1c2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTdG9wcCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlV0dmlkIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJTa2p1bCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtZ3JhZmlrayI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJHbGlkZWJyeXRlciBmb3Igdm9sdW0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IkR1IGhhciBpa2tlIHZhbGd0IG5vZW4gbWVkaWVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJJbmdlbiBpbmZvcm1hc2pvbiBlciB0aWxnamVuZ2VsaWciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkNhc3RlciBza2plcm1lbiI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbmUvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1uZS9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmMyZTFhCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbmUvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuCkquCljeCksOCko+CkvuCksuClgCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgpIngpKrgpJXgpLDgpKPgpLngpLDgpYIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0IOCkrOCkn+CkqCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3Qg4KSs4KSf4KSo4KWkIOCknOCkoeCkvuCkqCDgpLXgpL/gpJrgpY3gpJvgpYfgpKYg4KSt4KSv4KWLIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0IOCkrOCkn+CkqOClpCDgpJzgpKHgpL7gpKgg4KS54KWB4KSB4KSm4KWIIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3Qg4KSs4KSf4KSo4KWkIOCknOCkoeCkvuCkqCDgpK3gpK/gpYsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4KSv4KS44KSu4KS+IENhc3Qg4KSX4KSw4KWN4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4KSv4KSo4KWN4KSk4KWN4KSw4KS54KSw4KWCIOCkquCkpOCljeCkpOCkviDgpLLgpJfgpL7gpIngpIHgpKbgpYgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4KS14KS/4KSa4KWN4KSb4KWH4KSmIOCkl+CksOCljeCkqOClgeCkueCli+CkuOCljSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+ImNhc3Rpbmcg4KSw4KWL4KSV4KWN4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgpKzgpKjgpY3gpKYg4KSX4KSw4KWN4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4KSs4KSc4KS+4KSJ4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLgpLDgpYvgpJXgpY3gpKjgpYHgpLngpYvgpLjgpY0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLgpLDgpYvgpJXgpY3gpKjgpYHgpLngpYvgpLjgpY0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLgpLXgpL/gpLjgpY3gpKTgpL7gpLAg4KSX4KSw4KWN4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLgpLjgpILgpJXgpY3gpLfgpL/gpKrgpY3gpKQg4KSq4KS+4KSw4KWN4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4KSP4KSy4KWN4KSs4KSuIOCkhuCksOCljeCknyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgpK3gpYvgpLLgpY3gpK/gpYHgpK7gpJXgpYsg4KS44KWN4KSy4KS+4KSH4KSh4KSwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgpJXgpYHgpKjgpYgg4KSu4KS/4KSh4KS/4KSv4KS+IOCkmuCkr+CkqCDgpK3gpI/gpJXgpYsg4KSb4KWI4KSoIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgpJzgpL7gpKjgpJXgpL7gpLDgpYAg4KSJ4KSq4KSy4KSs4KWN4KSnIOCkm+CliOCkqCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4KS44KWN4KSV4KWN4KSw4KS/4KSoIGNhc3Qg4KSX4KSw4KWN4KSm4KWIIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ubC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW5sL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZGY2MmQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ubC9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdGVlbSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJBcHBhcmF0ZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0LWljb29uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQ2FzdC1pY29vbi4gVmVyYmluZGluZyB2ZXJicm9rZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkNhc3QtaWNvb24uIFZlcmJpbmRpbmcgbWFrZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQ2FzdC1pY29vbi4gVmVyYm9uZGVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkNhc3RlbiBuYWFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iQXBwYXJhdGVuIHpvZWtlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJMb3Nrb3BwZWxlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkNhc3RlbiBzdG9wcGVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJTbHVpdGVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iQWZzcGVsZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+Ik9uZGVyYnJla2VuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iU3RvcHBlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlVpdHZvdXdlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iU2FtZW52b3V3ZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bWhvZXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iVm9sdW1lc2NodWlmcmVnZWxhYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IkdlZW4gbWVkaWEgZ2VzZWxlY3RlZXJkIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJHZWVuIGluZm9ybWF0aWUgYmVzY2hpa2JhYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlNjaGVybSBjYXN0ZW4iPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXBhL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcGEvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI1ZGY3MQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXBhL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLgqLjgqL/gqLjgqJ/gqK4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4Kih4Ki/4Ki14Ki+4KiI4Ki44Ki+4KiCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4KiV4Ki+4Ki44KifIOCorOCon+CoqCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuColeCovuCouOConyDgqKzgqJ/gqKjgpaQg4Kih4Ki/4Ki44KiV4Kio4KmI4KiV4KifIOColeCpgOCopOCoviDgqJfgqL/gqIYiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuColeCovuCouOConyDgqKzgqJ/gqKjgpaQg4KiV4Kio4KmI4KiV4KifIOColeCpgOCopOCoviDgqJzgqL4g4Kiw4Ki/4Ki54Ki+IOCoueCpiCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgqJXgqL7gqLjgqJ8g4Kis4Kif4Kio4KWkIOColeCoqOCpiOColeConyDgqJXgqYDgqKTgqL4g4KiX4Ki/4KiGIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuCoj+CopeCphyDgqJXgqL7gqLjgqJ8g4KiV4Kiw4KmLIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4Kih4KmA4Ki14Ki+4KiI4Ki44Ki+4KiCIOCoqOCpguCpsCDgqLLgqbHgqK3gqL/gqIYg4Kic4Ki+IOCosOCov+CoueCoviDgqLngqYgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4Kih4Ki/4Ki44KiV4Kio4KmI4KiV4KifIOColeCosOCpiyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuColeCovuCouOConyDgqJXgqLDgqKjgqL4g4Kis4Kmw4KimIOColeCosOCpiyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4Kis4Kmw4KimIOColeCosOCpiyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuCoquCosuCphyDgqJXgqLDgqYsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuCosOCpi+ColeCpiyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuCorOCpsOCopiDgqJXgqLDgqYsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLgqLXgqL/gqLjgqKTgqL7gqLAg4KiV4Kiw4KmLIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLgqKzgqbDgqKYg4KiV4Kiw4KmLIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4KiQ4Kiy4Kis4KiuIOCohuCosOConyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgqLXgqYzgqLLgqK/gqYLgqK4g4Ki44Kiy4Ki+4KiI4Kih4KiwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgqJXgqYvgqIgg4Ki14KmAIOCoruCpgOCooeCpgOCohiDgqKjgqLngqYDgqIIg4Kia4KmB4Kij4Ki/4KiGIOCol+Cov+CohiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4KiV4KmL4KiIIOConOCovuCoo+ColeCovuCosOCpgCDgqIngqKrgqLLgqKzgqKcg4Kio4Ki54KmA4KiCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLgqLjgqJXgqY3gqLDgqYDgqKgg4Kic4KmL4KmcIOCosOCov+CoueCoviDgqLngqYgiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXBsL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcGwvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc5MmE2ZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXBsL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iVXJ6xIVkemVuaWEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJQcnp5Y2lzayBDYXN0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iUHJ6eWNpc2sgUHJ6ZcWbbGlqIGVrcmFuLiBSb3rFgsSFY3pvbm8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IlByenljaXNrIFByemXFm2xpaiBla3Jhbi4gxYHEhWN6xJkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iUHJ6eWNpc2sgUHJ6ZcWbbGlqIGVrcmFuLiBQb8WCxIVjem9ubyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJQcnplc3nFgmFqIG5hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iWm5hamRvd2FuaWUgdXJ6xIVkemXFhCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJPZMWCxIVjeiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlphdHJ6eW1haiBwcnplc3nFgmFuaWUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlphbWtuaWoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJPZHR3w7NyeiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iV3N0cnp5bWFqIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iWmF0cnp5bWFqIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iUm96d2nFhCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iWndpxYQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJPa8WCYWRrYSBhbGJ1bXUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iU3V3YWsgZ8WCb8Wbbm/Fm2NpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOaWUgd3licmFubyBtdWx0aW1lZGnDs3ciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkJyYWsgaW5mb3JtYWNqaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iUHJ6ZXN5xYJhbSBla3JhbiI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcHQtckJSL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcHQtckJSL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzYzYxOWQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wdC1yQlIvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbWEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRGlzcG9zaXRpdm9zIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQm90w6NvIFRyYW5zbWl0aXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJCb3TDo28gXCJUcmFuc21pdGlyXCIuIERlc2NvbmVjdGFkbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQm90w6NvIFwiVHJhbnNtaXRpclwiLiBDb25lY3RhbmRvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJvdMOjbyBcIlRyYW5zbWl0aXJcIi4gQ29uZWN0YWRvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlRyYW5zbWl0aXIgcGFyYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkxvY2FsaXphbmRvIGRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEZXNjb25lY3RhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkludGVycm9tcGVyIHRyYW5zbWlzc8OjbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iRmVjaGFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUmVwcm9kdXppciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2FyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iUGFyYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJFeHBhbmRpciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iUmVjb2xoZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBcnRlIGRvIMOhbGJ1bSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJDb250cm9sZSBkZXNsaXphbnRlIGRlIHZvbHVtZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmVuaHVtYSBtw61kaWEgc2VsZWNpb25hZGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5lbmh1bWEgaW5mb3JtYcOnw6NvIGRpc3BvbsOtdmVsIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJUcmFuc21pdGluZG8gYSB0ZWxhIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wdC1yUFQvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wdC1yUFQvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YwYTYxZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXB0LXJQVC9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEaXNwb3NpdGl2b3MiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJCb3TDo28gVHJhbnNtaXRpciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJvdMOjbyBUcmFuc21pdGlyLiBEZXNsaWdhZG8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJvdMOjbyBUcmFuc21pdGlyLiBBIGxpZ2FyLi4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJvdMOjbyBUcmFuc21pdGlyLiBMaWdhZG8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iVHJhbnNtaXRpciBwYXJhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iQSBsb2NhbGl6YXIgZGlzcG9zaXRpdm9zIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRlc2Fzc29jaWFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iUGFyYXIgYSB0cmFuc21pc3PDo28iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkZlY2hhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlcHJvZHV6aXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IkludGVycm9tcGVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iUGFyYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJFeHBhbmRpciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iUmVkdXppciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkltYWdlbSBkbyDDoWxidW0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQ29udHJvbG8gZGUgZGVzbGl6ZSBkbyB2b2x1bWUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5lbmh1bSBzdXBvcnRlIG11bHRpbcOpZGlhIHNlbGVjaW9uYWRvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOZW5odW1hIGluZm9ybWHDp8OjbyBkaXNwb27DrXZlbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iQSB0cmFuc21pdGlyIG8gZWNyw6MiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXB0L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcHQvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNjNjE5ZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXB0L3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJvdMOjbyBUcmFuc21pdGlyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQm90w6NvIFwiVHJhbnNtaXRpclwiLiBEZXNjb25lY3RhZG8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJvdMOjbyBcIlRyYW5zbWl0aXJcIi4gQ29uZWN0YW5kbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJCb3TDo28gXCJUcmFuc21pdGlyXCIuIENvbmVjdGFkbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJUcmFuc21pdGlyIHBhcmEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJMb2NhbGl6YW5kbyBkaXNwb3NpdGl2b3MiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGVzY29uZWN0YXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJJbnRlcnJvbXBlciB0cmFuc21pc3PDo28iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkZlY2hhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlcHJvZHV6aXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlBhcmFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRXhwYW5kaXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlJlY29saGVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQXJ0ZSBkbyDDoWxidW0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQ29udHJvbGUgZGVzbGl6YW50ZSBkZSB2b2x1bWUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5lbmh1bWEgbcOtZGlhIHNlbGVjaW9uYWRhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOZW5odW1hIGluZm9ybWHDp8OjbyBkaXNwb27DrXZlbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iVHJhbnNtaXRpbmRvIGEgdGVsYSI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcm8vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1yby9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWJiMmY2Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcm8vc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEaXNwb3ppdGl2ZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJ1dG9udWwgZGUgcHJvaWVjyJtpZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJ1dG9udWwgZGUgcHJvaWVjyJtpZS4gRGVjb25lY3RhdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQnV0b251bCBkZSBwcm9pZWPIm2llLiBTZSBjb25lY3RlYXrEgyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJCdXRvbnVsIGRlIHByb2llY8ibaWUuIENvbmVjdGF0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlByb2llY3RhyJtpIHBlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iU2UgY2F1dMSDIGRpc3Bveml0aXZlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRlY29uZWN0YcibaS12xIMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJOdSBtYWkgcHJvaWVjdGHIm2kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IsOObmNoaWRlyJtpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUmVkYcibaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iw45udHJlcnVwZcibaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+Ik9wcmnIm2kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJFeHRpbmRlyJtpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJSZXN0csOibmdlyJtpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iR3JhZmljYSBhbGJ1bXVsdWkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iR2xpc29yIHBlbnRydSB2b2x1bSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmljaXVuIGZpyJlpZXIgbWVkaWEgc2VsZWN0YXQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik51IHN1bnQgZGlzcG9uaWJpbGUgaW5mb3JtYcibaWkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlNlIHByb2llY3RlYXrEgyBlY3JhbnVsIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ydS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXJ1L3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNDYyZDIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ydS9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i0KHQuNGB0YLQtdC80LAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i0KPRgdGC0YDQvtC50YHRgtCy0LAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLQmtC90L7Qv9C60LAg0YLRgNCw0L3RgdC70Y/RhtC40LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLQmtC90L7Qv9C60LAg0YLRgNCw0L3RgdC70Y/RhtC40LguINCj0YHRgtGA0L7QudGB0YLQstC+INC+0YLQutC70Y7Rh9C10L3Qvi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0LjQuC4g0KPRgdGC0YDQvtC50YHRgtCy0L4g0L/QvtC00LrQu9GO0YfQsNC10YLRgdGPLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLQmtC90L7Qv9C60LAg0YLRgNCw0L3RgdC70Y/RhtC40LguINCj0YHRgtGA0L7QudGB0YLQstC+INC/0L7QtNC60LvRjtGH0LXQvdC+LiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLQktGL0LHQtdGA0LjRgtC1INGD0YHRgtGA0L7QudGB0YLQstC+Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i0J/QvtC40YHQuiDRg9GB0YLRgNC+0LnRgdGC0LLigKYiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i0J7RgtC60LvRjtGH0LjRgtGMIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i0J/RgNC10LrRgNCw0YLQuNGC0Ywg0YLRgNCw0L3RgdC70Y/RhtC40Y4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+ItCX0LDQutGA0YvRgtGMIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i0JLQvtGB0L/RgNC+0LjQt9Cy0LXRgdGC0LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCf0YDQuNC+0YHRgtCw0L3QvtCy0LjRgtGMIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i0J7RgdGC0LDQvdC+0LLQuNGC0YwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLQoNCw0LfQstC10YDQvdGD0YLRjCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i0KHQstC10YDQvdGD0YLRjCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+ItCe0LHQu9C+0LbQutCwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItCg0LXQs9GD0LvRj9GC0L7RgCDQs9GA0L7QvNC60L7RgdGC0LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItCc0LXQtNC40LDRhNCw0LnQuyDQvdC1INCy0YvQsdGA0LDQvSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i0JTQsNC90L3Ri9GFINC90LXRgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i0J/QvtC00LrQu9GO0YfQtdC90LjQtSDQuiDRg9C00LDQu9C10L3QvdC+0LzRgyDQvNC+0L3QuNGC0L7RgNGDIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zaS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNpL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NWNlNTAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zaS9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4La04Lav4LeK4Law4Lat4LeS4La6Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuC2i+C2tOC3j+C2guC2nCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuC3gOC3kuC2muC3j+C3gSDgtrbgt5zgtq3gt4rgtq3gtrgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgt4Dgt5Lgtprgt4/gt4Eg4La24Lec4Lat4LeK4Lat4La4LiDgt4Dgt5Lgt4PgtrHgt4rgtrDgt5Ig4Laa4La74LaxIOC2veC2r+C3kyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4LeA4LeS4Laa4LeP4LeBIOC2tuC3nOC2reC3iuC2reC2uCDgt4Pgtrjgt4rgtrbgtrHgt4rgtrAg4Laa4La74La44LeS4Lax4LeKIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuC3gOC3kuC2muC3j+C3gSDgtrbgt5zgtq3gt4rgtq3gtrgg4LeD4La44LeK4La24Lax4LeK4LawIOC2muC2u+C2sSDgtr3gtq/gt5MiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4LeA4LeS4Laa4LeP4LeB4La6Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4LaL4La04LeP4LaC4LacIOC3g+C3meC3gOC3k+C2uCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLgt4Dgt5Lgt4PgtrHgt4rgtrDgt5Ig4Laa4La74Lax4LeK4LaxIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4LeA4LeS4Laa4LeP4LeBIOC2muC3kuC2u+C3k+C2uCDgtrHgtq3gtrsg4Laa4La74Lax4LeK4LaxIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgt4Dgt4PgtrHgt4rgtrEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLgtrDgt4/gt4DgtrHgtrog4Laa4La74Lax4LeK4LaxIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLgt4Dgt5Lgtrvgt4/gtrgg4Lac4Lax4LeK4LeA4Lax4LeK4LaxIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4Lax4Lat4La7IOC2muC2u+C2seC3iuC2sSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuC2r+C3kuC2nCDgt4Tgtrvgt5LgtrHgt4rgtrEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuC3hOC2muC3lOC3heC2seC3iuC2sSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuC2h+C2veC3iuC2tuC2uCDgtprgtr3gt4/gt4AiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4LeE4LasIOC2tOC2u+C3kuC2uOC3jyDgt4Pgt4rgtr3gtrrgt5LgtqngtrvgtroiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuC2uOC3j+C2sOC3iuKAjeC2uuC2uiDgtq3gt53gtrvgt48g4Lax4LeQ4LatIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgtr3gtrbgt48g4Lac4LatIOC3hOC3kOC2muC3kiDgtq3gt5zgtrvgtq3gt5Tgtrvgt5Qg4Lax4Lec4La44LeQ4LatIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLgt4Dgt5Lgtprgt4/gt4Eg4Lat4LeS4La74La6Ijwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zay9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNrL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1OGFhMTEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zay9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdMOpbSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJaYXJpYWRlbmlhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iVGxhxI1pZGxvIHByZW5vc3UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJUbGHEjWlkbG8gcHJlbm9zdS4gT2Rwb2plbsOpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJUbGHEjWlkbG8gcHJlbm9zdS4gUHJpcMOhamEgc2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iVGxhxI1pZGxvIHByZW5vc3UuIFByaXBvamVuw6kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iUHJlbm9zIGRvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iSMS+YWRhasO6IHNhIHphcmlhZGVuaWEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iT2Rwb2ppxaUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJaYXN0YXZpxaUgcHJlbsOhxaFhbmllIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJaYXZyaWXFpSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlByZWhyYcWlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQb3phc3RhdmnFpSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+Ilphc3RhdmnFpSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlJvemJhbGnFpSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iWmJhbGnFpSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Ik9icsOhem9rIGFsYnVtdSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJQb3PDunZhxI0gaGxhc2l0b3N0aSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmllIHPDuiB2eWJyYW7DqSDFvmlhZG5lIG3DqWRpw6EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5pZSBzw7oga8KgZGlzcG96w61jaWkgxb5pYWRuZSBpbmZvcm3DoWNpZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iUHJlbsOhxaFhIHNhIG9icmF6b3ZrYSI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc2wvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zbC9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2E0Y2U0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc2wvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJOYXByYXZlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iR3VtYiB6YSBwcmVkdmFqYW5qZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+Ikd1bWIgemEgcHJlZHZhamFuamUuIFBvdmV6YXZhIGplIHByZWtpbmplbmEuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJHdW1iIHphIHByZWR2YWphbmplLiBWenBvc3RhdmxqYW5qZSBwb3ZlemF2ZS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iR3VtYiB6YSBwcmVkdmFqYW5qZS4gUG92ZXphdmEgamUgdnpwb3N0YXZsamVuYS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iUHJlZHZhamFuamUgcHJlazoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJJc2thbmplIG5hcHJhdiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJQcmVraW5pIHBvdmV6YXZvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iVXN0YXZpIHByZWR2YWphbmplIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJaYXByaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlByZWR2YWphbmplIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJaYXVzdGF2aSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlVzdGF2aSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlJhesWhaXJpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJTdHJuaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Ik5hc2xvdm5pY2EgYWxidW1hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkRyc25payB6YSBnbGFzbm9zdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmkgaXpicmFuZSBwcmVkc3Rhdm5vc3RpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJQb2RhdGtpIG5pc28gbmEgdm9sam8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlByZWR2YWphbmplIHphc2xvbmEiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNxL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3Evc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE2ZTExMAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNxL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1pIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlBhamlzamV0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQnV0b25pIGkgdHJhbnNtZXRpbWl0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQnV0b25pIGkgdHJhbnNtZXRpbWl0LiBKZSBpIHNoa8OrcHV0dXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJ1dG9uaSBpIHRyYW5zbWV0aW1pdC4gUG8gbGlkaGV0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJ1dG9uaSBpIHRyYW5zbWV0aW1pdC4gSmUgaSBsaWRodXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iVHJhbnNtZXRvIHRlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iUG8ga8OrcmtvbiBwYWppc2plIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlNoa8OrcHV0ZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+Ik5kYWxvIHRyYW5zbWV0aW1pbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iTWJ5bGwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJMdWFqIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXV6w6siPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJOZGFsbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlpnamVyb2plIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJQYWxvc2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJLb3BlcnRpbmEgZSBhbGJ1bWl0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlJyw6tzaHFpdMOrc2kgaSB2b2x1bWl0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOdWsgdSB6Z2pvZGggYXNuasOrIG1lZGlhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOdWsgamVwZXQgYXNuasOrIGluZm9ybWFjaW9uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJQbyB0cmFuc21ldG9uIGVrcmFuaW4iPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNyL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3Ivc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FhYmFkNQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNyL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLQodC40YHRgtC10LwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i0KPRgNC10ZLQsNGY0LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLQlNGD0LPQvNC1INCf0YDQtdCx0LDRhtC4Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i0JTRg9Cz0LzQtSDQn9GA0LXQsdCw0YbQuC4g0JLQtdC30LAg0ZjQtSDQv9GA0LXQutC40L3Rg9GC0LAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+ItCU0YPQs9C80LUg0J/RgNC10LHQsNGG0LguINCf0L7QstC10LfRg9GY0LUg0YHQtSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLQlNGD0LPQvNC1INCf0YDQtdCx0LDRhtC4LiDQn9C+0LLQtdC30LDQvSDRmNC1Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItCf0YDQtdCx0LDRhtGD0Zgg0L3QsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+ItCf0YDQvtC90LDQu9Cw0LbQtdGa0LUg0YPRgNC10ZLQsNGY0LAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i0J/RgNC10LrQuNC90Lgg0LLQtdC30YMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLQl9Cw0YPRgdGC0LDQstC4INC/0YDQtdCx0LDRhtC40LLQsNGa0LUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+ItCX0LDRgtCy0L7RgNC4Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i0J/Rg9GB0YLQuCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i0J/QsNGD0LfQuNGA0LDRmCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+ItCX0LDRg9GB0YLQsNCy0LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLQn9GA0L7RiNC40YDQuCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i0KHQutGD0L/QuCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+ItCe0LzQvtGCINCw0LvQsdGD0LzQsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLQmtC70LjQt9Cw0Ycg0LfQsCDRmNCw0YfQuNC90YMg0LfQstGD0LrQsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0J3QtdC80LAg0LjQt9Cw0LHRgNCw0L3QuNGFINC80LXQtNC40ZjQsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i0J3QuNGB0YMg0LTQvtGB0YLRg9C/0L3QtSDQvdC40LrQsNC60LLQtSDQuNC90YTQvtGA0LzQsNGG0LjRmNC1Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLQn9GA0LXQsdCw0YbRg9GY0LUg0YHQtSDQtdC60YDQsNC9Ijwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN2L3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhN2QzZTAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdi9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdGVtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkVuaGV0ZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0LWtuYXBwZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJDYXN0LWtuYXBwZW4uIEZyw6Vua29wcGxhZCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQ2FzdC1rbmFwcGVuLiBBbnNsdXRlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0LWtuYXBwZW4uIEFuc2x1dGVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkNhc3RhIHRpbGwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJMZXRhciBlZnRlciBlbmhldGVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IktvcHBsYSBmcsOlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlNsdXRhIGNhc3RhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJTdMOkbmciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJTcGVsYSB1cHAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iQXZicnl0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iVXTDtmthIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJLb21wcmltZXJhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iU2tpdm9tc2xhZyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJWb2x5bXJlZ2xhZ2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IkluZ2EgbWVkaWEgaGFyIHZhbHRzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJEZXQgZmlubnMgaW5nZW4gaW5mb3JtYXRpb24iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlNrw6RybWVuIGNhc3RhcyI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3cvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTYyY2IxCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3cvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+Ik1mdW1vIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlZpZmFhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iS2l0dWZlIGNoYSBrdXR1bWEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJLaXR1ZmUgY2hhIGt1dHVtYS4gS2ltZW9uZG9sZXdhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJLaXR1ZmUgY2hhIGt1dHVtYS4gS2luYXVuZ2FuaXNoYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJLaXR1ZmUgY2hhIGt1dHVtYS4gS2ltZXVuZ2FuaXNod2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iVHVtYSBrd2VueWUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJJbmF0YWZ1dGEgdmlmYWEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iT25kb2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJBY2hhIGt1dHVtYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iRnVuZ2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJDaGV6YSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iU2l0aXNoYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlNpbWFtaXNoYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlBhbnVhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJLdW5qYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IlNhbmFhIHlhIGFsYmFtdSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJLaXRlbGV6aSBjaGEgc2F1dGkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ikhha3VuYSBtYXVkaHVpIHlhbGl5b2NoYWd1bGl3YSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iSGFrdW5hIG1hZWxlem8geWFsaXlvcGF0aWthbmEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkluYXR1bWEgc2tyaW5pIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdzYwMGRwL2RpbWVucy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdzYwMGRwL2RpbWVucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA0MjM0OAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN3NjAwZHAvZGltZW5zLnhtbApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxyZXNvdXJjZXM+CisgICAgPCEtLSBUaGUgcGxhdGZvcm0ncyBkZXNpcmVkIGZpeGVkIHdpZHRoIGZvciBhIGRpYWxvZyBhbG9uZyB0aGUgbWFqb3IgYXhpcworICAgICAgICAgKHRoZSBzY3JlZW4gaXMgaW4gbGFuZHNjYXBlKS4gVGhpcyBtYXkgYmUgZWl0aGVyIGEgZnJhY3Rpb24gb3IgYSBkaW1lbnNpb24uLS0+CisgICAgPGl0ZW0gdHlwZT0iZGltZW4iIG5hbWU9Im1yX2RpYWxvZ19maXhlZF93aWR0aF9tYWpvciI+NjAlPC9pdGVtPgorICAgIDwhLS0gVGhlIHBsYXRmb3JtJ3MgZGVzaXJlZCBmaXhlZCB3aWR0aCBmb3IgYSBkaWFsb2cgYWxvbmcgdGhlIG1pbm9yIGF4aXMKKyAgICAgICAgICh0aGUgc2NyZWVuIGlzIGluIHBvcnRyYWl0KS4gVGhpcyBtYXkgYmUgZWl0aGVyIGEgZnJhY3Rpb24gb3IgYSBkaW1lbnNpb24uLS0+CisgICAgPGl0ZW0gdHlwZT0iZGltZW4iIG5hbWU9Im1yX2RpYWxvZ19maXhlZF93aWR0aF9taW5vciI+OTAlPC9pdGVtPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdzcyMGRwL2RpbWVucy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdzcyMGRwL2RpbWVucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM0YWI4ZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN3NzIwZHAvZGltZW5zLnhtbApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxyZXNvdXJjZXM+CisgICAgPCEtLSBUaGUgcGxhdGZvcm0ncyBkZXNpcmVkIGZpeGVkIHdpZHRoIGZvciBhIGRpYWxvZyBhbG9uZyB0aGUgbWFqb3IgYXhpcworICAgICAgICAgKHRoZSBzY3JlZW4gaXMgaW4gbGFuZHNjYXBlKS4gVGhpcyBtYXkgYmUgZWl0aGVyIGEgZnJhY3Rpb24gb3IgYSBkaW1lbnNpb24uLS0+CisgICAgPGl0ZW0gdHlwZT0iZGltZW4iIG5hbWU9Im1yX2RpYWxvZ19maXhlZF93aWR0aF9tYWpvciI+NTAlPC9pdGVtPgorICAgIDwhLS0gVGhlIHBsYXRmb3JtJ3MgZGVzaXJlZCBmaXhlZCB3aWR0aCBmb3IgYSBkaWFsb2cgYWxvbmcgdGhlIG1pbm9yIGF4aXMKKyAgICAgICAgICh0aGUgc2NyZWVuIGlzIGluIHBvcnRyYWl0KS4gVGhpcyBtYXkgYmUgZWl0aGVyIGEgZnJhY3Rpb24gb3IgYSBkaW1lbnNpb24uLS0+CisgICAgPGl0ZW0gdHlwZT0iZGltZW4iIG5hbWU9Im1yX2RpYWxvZ19maXhlZF93aWR0aF9taW5vciI+NzAlPC9pdGVtPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10YS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRhL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxOTc4ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10YS9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4K6a4K6/4K644K+N4K6f4K6u4K+NIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuCumuCuvuCupOCuqeCumeCvjeCuleCus+CvjSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuCupOCuv+CusOCviOCur+Cuv+Cun+CvgSDgrqrgrp/gr43grp/grqngr40iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgroXgrqngr4Hgrqrgr43grqrgr4HgrqTgrrLgr40g4K6q4K+K4K6k4K+N4K6k4K6+4K6p4K+NLiDgrqTgr4HgrqPgr43grp/grr/grpXgr43grpXgrqrgr43grqrgrp/gr43grp/grqTgr4EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuCuheCuqeCvgeCuquCvjeCuquCvgeCupOCusuCvjSDgrqrgr4rgrqTgr43grqTgrr7grqngr40uIOCuh+Cuo+CviOCuleCvjeCuleCuv+CuseCupOCvgSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgroXgrqngr4Hgrqrgr43grqrgr4HgrqTgrrLgr40g4K6q4K+K4K6k4K+N4K6k4K6+4K6p4K+NLiDgrofgrqPgr4jgrpXgr43grpXgrqrgr43grqrgrp/gr43grp/grqTgr4EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4K6H4K6k4K6x4K+N4K6V4K+BIOCuheCuqeCvgeCuquCvjeCuquCvgSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuCumuCuvuCupOCuqeCumeCvjeCuleCus+CviOCupOCvjSDgrqTgr4fgrp/gr4HgrpXgrr/grrHgrqTgr4EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4K6k4K+K4K6f4K6w4K+N4K6q4K+I4K6k4K+NIOCupOCvgeCuo+CvjeCun+CuvyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuCuheCuqeCvgeCuquCvjeCuquCvgeCuteCupOCviCDgrqjgrr/grrHgr4HgrqTgr43grqTgr4EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuCuruCvguCun+CvgeCuruCvjSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuCuh+Cur+CuleCvjeCuleCvgeCuruCvjSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4K6H4K6f4K+I4K6o4K6/4K6x4K+B4K6k4K+N4K6k4K+B4K6u4K+NIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4K6o4K6/4K6x4K+B4K6k4K+N4K6k4K+B4K614K6k4K6x4K+N4K6V4K6+4K6pIOCuquCviuCupOCvjeCupOCuvuCuqeCvjSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuCuteCuv+CusOCuv+CuteCuvuCuleCvjeCuleCvgSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4K6a4K+B4K6w4K+B4K6V4K+N4K6V4K+BIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4K6G4K6y4K+N4K6q4K6u4K+NIOCuhuCusOCvjeCun+CvjSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgrpLgrrLgrr/grq/grrPgrrXgr4Eg4K644K+N4K6y4K+I4K6f4K6w4K+NIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgrq7gr4Dgrp/grr/grq/grr4g4K6O4K6k4K+B4K614K+B4K6u4K+NIOCupOCvh+CusOCvjeCuqOCvjeCupOCvhuCun+CvgeCuleCvjeCuleCuquCvjeCuquCun+CuteCuv+CusuCvjeCusuCviCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4K6k4K6V4K614K6y4K+NIOCujuCupOCvgeCuteCvgeCuruCuv+CusuCvjeCusuCviCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4K6k4K6/4K6w4K+I4K6v4K+IIOCuheCuqeCvgeCuquCvjeCuquCvgeCuleCuv+CuseCvgOCusOCvjeCuleCus+CvjSI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGUvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10ZS9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDMxMmUzCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGUvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuCwuOCwv+CwuOCxjeCwn+CwruCxjSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgsKrgsLDgsL/gsJXgsLDgsL7gsLLgsYEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgsKrgsY3gsLDgsLjgsL7gsLDgsIIg4LCa4LGH4LCv4LC/IOCwrOCwn+CwqOCxjSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuCwquCxjeCwsOCwuOCwvuCwsCDgsKzgsJ/gsKjgsY0uIOCwoeCwv+CwuOCxjeKAjOCwleCwqOCxhuCwleCxjeCwn+CxjSDgsJrgsYfgsK/gsKzgsKHgsL/gsILgsKbgsL8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuCwquCxjeCwsOCwuOCwvuCwsCDgsKzgsJ/gsKjgsY0uIOCwleCwqOCxhuCwleCxjeCwn+CxjSDgsJrgsYfgsLjgsY3gsKTgsYvgsILgsKbgsL8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4LCq4LGN4LCw4LC44LC+4LCwIOCwrOCwn+CwqOCxjS4g4LCV4LCo4LGG4LCV4LGN4LCf4LGNIOCwmuCxh+Cwr+CwrOCwoeCwv+CwguCwpuCwvyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLgsKbgsYDgsKjgsL/gsJXgsL8g4LCq4LGN4LCw4LC44LC+4LCw4LCCIOCwmuCxh+Cwr+CwguCwoeCwvyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuCwquCwsOCwv+CwleCwsOCwvuCwsuCwqOCxgSDgsJXgsKjgsYHgsJfgsYrgsILgsJ/gsYvgsILgsKbgsL8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4LCh4LC/4LC44LGN4oCM4LCV4LCo4LGG4LCV4LGN4LCf4LGNIOCwmuCxh+Cwr+CwvyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuCwquCxjeCwsOCwuOCwvuCwsOCwvuCwqOCxjeCwqOCwvyDgsIbgsKrgsL/gsLXgsYfgsK/gsL8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuCwruCxguCwuOCwv+CwteCxh+CwuOCxjeCwpOCxgeCwguCwpuCwvyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuCwquCxjeCwsuCxhyDgsJrgsYfgsLjgsY3gsKTgsYHgsILgsKbgsL8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuCwquCwvuCwnOCxjSDgsJrgsYfgsLjgsY3gsKTgsYHgsILgsKbgsL8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLgsIbgsKrgsL/gsLXgsYfgsK/gsL8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLgsLXgsL/gsLjgsY3gsKTgsLDgsL/gsILgsKrgsJzgsYfgsLjgsY3gsKTgsYHgsILgsKbgsL8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuCwleCxgeCwpuCwv+CwuOCxjeCwpOCxgeCwguCwpuCwvyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuCwhuCwsuCxjeCwrOCwruCxjSDgsIbgsLDgsY3gsJ/gsY0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4LC14LC+4LCy4LGN4LCv4LGC4LCu4LGNIOCwuOCxjeCwsuCwr+Cwv+CwoeCwsOCxjSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4LCu4LGA4LCh4LC/4LCv4LC+IOCwj+CwpuCxgCDgsI7gsILgsJrgsYHgsJXgsYvgsKzgsKHgsLLgsYfgsKbgsYEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuCwuOCwruCwvuCwmuCwvuCwsOCwgiDgsIXgsILgsKbgsYHgsKzgsL7gsJ/gsYHgsLLgsYsg4LCy4LGH4LCm4LGBIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLgsLjgsY3gsJXgsY3gsLDgsYDgsKjgsY3igIzgsKjgsYEg4LCq4LGN4LCw4LC44LC+4LCw4LCCIOCwmuCxh+CwuOCxjeCwpOCxi+CwguCwpuCwvyI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGgvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10aC9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmE4YWU1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGgvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuC4o+C4sOC4muC4miI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLguK3guLjguJvguIHguKPguJPguYwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLguJvguLjguYjguKEgXCLguYHguITguKrguJXguYxcIiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuC4m+C4uOC5iOC4oSBcIuC5geC4hOC4quC4leC5jFwiIOC4ouC4geC5gOC4peC4tOC4geC4geC4suC4o+C5gOC4iuC4t+C5iOC4reC4oeC4leC5iOC4rSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4Lib4Li44LmI4LihIFwi4LmB4LiE4Liq4LiV4LmMXCIg4LiB4Liz4Lil4Lix4LiH4LmA4LiK4Li34LmI4Lit4Lih4LiV4LmI4LitIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuC4m+C4uOC5iOC4oSBcIuC5geC4hOC4quC4leC5jFwiIOC5gOC4iuC4t+C5iOC4reC4oeC4leC5iOC4reC5geC4peC5ieC4pyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLguYHguITguKrguJXguYzguYTguJvguKLguLHguIciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLguIHguLPguKXguLHguIfguITguYnguJnguKvguLLguK3guLjguJvguIHguKPguJPguYwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4Lii4LiB4LmA4Lil4Li04LiB4LiB4Liy4Lij4LmA4LiK4Li34LmI4Lit4Lih4LiV4LmI4LitIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4Lir4Lii4Li44LiU4LmB4LiE4Liq4LiV4LmMIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLguJvguLTguJQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLguYDguKXguYjguJkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuC4q+C4ouC4uOC4lOC4iuC4seC5iOC4p+C4hOC4o+C4suC4pyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuC4q+C4ouC4uOC4lCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuC4guC4ouC4suC4oiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4Lii4Li44LiaIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4Lib4LiB4Lit4Lix4Lil4Lia4Lix4LmJ4LihIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuC5geC4luC4muC5gOC4peC4t+C5iOC4reC4meC4m+C4o+C4seC4muC4o+C4sOC4lOC4seC4muC5gOC4quC4teC4ouC4hyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4LmE4Lih4LmI4LmE4LiU4LmJ4LmA4Lil4Li34Lit4LiB4Liq4Li34LmI4Lit4LmE4Lin4LmJIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLguYTguKHguYjguKHguLXguILguYnguK3guKHguLnguKUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuC4geC4s+C4peC4seC4h+C5geC4hOC4quC4leC5jOC4q+C4meC5ieC4suC4iOC4rSI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGwvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10bC9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGJlM2QwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGwvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3RlbSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJNZ2EgRGV2aWNlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQnV0dG9uIG5hIEktY2FzdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJ1dHRvbiBuYSBJLWNhc3QuIE5hZGlza29uZWt0YSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQnV0dG9uIG5hIEktY2FzdC4gS3Vtb2tvbmVrdGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQnV0dG9uIG5hIEktY2FzdC4gTmFrYWtvbmVrdGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iSS1jYXN0IHNhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iTmFnaGFoYW5hcCBuZyBtZ2EgZGV2aWNlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IklkaXNrb25la3RhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iSWhpbnRvIGFuZyBwYWctY2FzdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iSXNhcmEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJJLXBsYXkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IkktcGF1c2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJJaGludG8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJQYWxhd2FraW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkktY29sbGFwc2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bSBhcnQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iU2xpZGVyIG5nIHZvbHVtZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iV2FsYW5nIHBpbmlsaW5nIG1lZGlhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJXYWxhbmcgYXZhaWxhYmxlIG5hIGltcG9ybWFzeW9uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJLaW5hLWNhc3QgYW5nIHNjcmVlbiI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdHIvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10ci9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWY2MzkyCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdHIvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJDaWhhemxhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IllhecSxbmxhIGTDvMSfbWVzaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IllhecSxbmxhIGTDvMSfbWVzaS4gQmHEn2xhbnTEsSBrZXNpbGRpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJZYXnEsW5sYSBkw7zEn21lc2kuIEJhxJ9sYW7EsXlvciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJZYXnEsW5sYSBkw7zEn21lc2kuIEJhxJ9sYW5kxLEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4ixZ51cmF5YSB5YXnEsW5sYToiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJDaWhhemxhciBidWx1bnV5b3IiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iQmHEn2xhbnTEsXnEsSBrZXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJZYXnEsW7EsSBkdXJkdXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkthcGF0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iT3luYXQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IkR1cmFrbGF0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iRHVyZHVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iR2VuacWfbGV0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJEYXJhbHQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGLDvG0ga2FwYcSfxLEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iU2VzIGTDvHpleWkga2F5ZMSxcm1hIMOndWJ1xJ91Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJNZWR5YSBzZcOnaWxtZWRpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJCaWxnaSB5b2siPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkVrcmFuIHlhecSxbmxhbsSxeW9yIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy11ay9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXVrL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZDM2NWUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy11ay9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i0KHQuNGB0YLQtdC80LAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i0J/RgNC40YHRgtGA0L7RlyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0ZbRlyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0ZbRly4g0JLRltC04oCZ0ZTQtNC90LDQvdC+Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLQmtC90L7Qv9C60LAg0YLRgNCw0L3RgdC70Y/RhtGW0ZcuINCf0ZbQtOKAmdGU0LTQvdCw0L3QvdGPIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0ZbRly4g0J/RltC04oCZ0ZTQtNC90LDQvdC+Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItCi0YDQsNC90YHQu9GO0LLQsNGC0Lgg0L3QsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+ItCf0L7RiNGD0Log0L/RgNC40YHRgtGA0L7Rl9CyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+ItCS0ZbQtNC60LvRjtGH0LjRgtC4Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i0J/RgNC40L/QuNC90LjRgtC4INGC0YDQsNC90YHQu9GP0YbRltGOIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLQl9Cw0LrRgNC40YLQuCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+ItCS0ZbQtNGC0LLQvtGA0LjRgtC4Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLQn9GA0LjQt9GD0L/QuNC90LjRgtC4Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i0J/RgNC40L/QuNC90LjRgtC4Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i0KDQvtC30LPQvtGA0L3Rg9GC0LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+ItCX0LPQvtGA0L3Rg9GC0LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLQntCx0LrQu9Cw0LTQuNC90LrQsCDQsNC70YzQsdC+0LzRgyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLQn9C+0LLQt9GD0L3QvtC6INCz0YPRh9C90L7RgdGC0ZYiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItCc0LXQtNGW0LAt0YTQsNC50Lsg0L3QtSDQstC40LHRgNCw0L3QviI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i0J3QtdC80LDRlCDQtNCw0L3QuNGFIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLQotGA0LDQvdGB0LvRj9GG0ZbRjyDQtdC60YDQsNC90LAiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXVyL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdXIvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMyYzU5OAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXVyL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLYs9iz2bnZhSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLYotmE2KfYqiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+Itqp2KfYs9m5INqp2LHZhtuSINqp2Kcg2KjZudmGIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i2qnYp9iz2bkg2qnYsdmG25Ig2qnYpyDYqNm52YbblCDYutuM2LEg2YXZhtiz2YTaqSDbgduSIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLaqdin2LPZuSDaqdix2YbbkiDaqdinINio2bnZhtuUINmF2YbYs9mE2qkg24HZiCDYsduB2Kcg24HbkiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLaqdin2LPZuSDaqdix2YbbkiDaqdinINio2bnZhtuUINmF2YbYs9mE2qkg24HbkiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLYp9izINmF24zauiDaqdin2LPZuSDaqdix24zauiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Itii2YTYp9iqINiq2YTYp9i0INuB2Ygg2LHbgduSINuB24zauiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLYutuM2LEg2YXZhtiz2YTaqSDaqdix24zauiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+Itqp2KfYs9m5INqp2LHZhtinINio2YbYryDaqdix24zauiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i2KjZhtivINqp2LHbjNq6Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i2obZhNin2KbbjNq6Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLZhdmI2YLZiNmBINqp2LHbjNq6Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i2LHZiNqp24zauiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+Itm+2r7bjNmE2KfYptuM2roiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+Itiz2qnbjNqR24zauiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Itin2YTYqNmFINii2LHZuSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLZiNin2YTbjNmI2YUg2LPZhNin2KbbjNqI2LEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Itqp2YjYptuMINmF24zaiNuM2Kcg2YXZhtiq2K7YqCDZhtuB24zauiDbgduSIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLaqdmI2KbbjCDZhdi52YTZiNmF2KfYqiDYr9iz2KrbjNin2Kgg2YbbgduM2roiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Itiz2qnYsduM2YYg2qnYp9iz2bkg24HZiCDYsduB24wg24HbkiI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdXovc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy11ei9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGEwODE3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdXovc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlRpemltIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlF1cmlsbWFsYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJUcmFuc2xhdHNpeWEgdHVnbWFzaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IlRyYW5zbGF0c2l5YSB0dWdtYXNpLiBVemlsZGkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IlRyYW5zbGF0c2l5YSB0dWdtYXNpLiBVbGFubW9xZGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iVHJhbnNsYXRzaXlhIHR1Z21hc2kuIFVsYW5kaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJRdXlpZGFnaWdhIHRyYW5zbGF0c2l5YSBxaWxpc2g6Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iUXVyaWxtYWxhcm5pIHRvcGlzaCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJVbGFuaXNobmkgdXppc2giPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJUcmFuc2xhdHNpeWFuaSB0b+KAmHh0YXRpc2giPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IllvcGlzaCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkJvc2hsYXNoIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJUb+KAmHh0YXRpYiB0dXJpc2giPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJUb+KAmHh0YXRpc2giPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJZb3lpc2giPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IllpZ+KAmGlzaCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYm9tIG11cW92YXNpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlRvdnVzaCBiYWxhbmRsaWdpIHNsYXlkZXJpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJNdWx0aW1lZGlhIHRhbmxhbWFnYW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkhlY2ggcWFuZGF5IG1h4oCZbHVtb3QgeW/igJhxIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJFa3Jhbm5pIHRyYW5zbGF0c2l5YSBxaWxpc2giPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXZpL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdmkvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA5OGNjYQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXZpL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJI4buHIHRo4buRbmciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iVGhp4bq/dCBi4buLIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iTsO6dCB0cnV54buBbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+Ik7DunQgdHJ1eeG7gW4uIMSQw6Mgbmfhuq90IGvhur90IG7hu5FpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJOw7p0IHRydXnhu4FuLiDEkGFuZyBr4bq/dCBu4buRaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJOw7p0IHRydXnhu4FuLiDEkMOjIGvhur90IG7hu5FpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlRydXnhu4FuIHThu5tpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4ixJBhbmcgdMOsbSB0aGnhur90IGLhu4siPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iTmfhuq90IGvhur90IG7hu5FpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iROG7q25nIHRydXnhu4FuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLEkMOzbmciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJQaMOhdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iVOG6oW0gZOG7q25nIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iROG7q25nIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iTeG7nyBy4buZbmciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlRodSBn4buNbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuG6om5oIGLDrGEgYWxidW0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iVGhhbmggdHLGsOG7o3Qgw6JtIGzGsOG7o25nIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJLaMO0bmcgY8OzIHBoxrDGoW5nIHRp4buHbiBuw6BvIMSRxrDhu6NjIGNo4buNbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iS2jDtG5nIGPDsyB0aMO0bmcgdGluIG7DoG8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IsSQYW5nIHRydXnhu4FuIG3DoG4gaMOsbmgiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXpoLXJDTi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXpoLXJDTi9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTIyZDAxCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtemgtckNOL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLns7vnu58iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i6K6+5aSHIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i5oqV5bCE5oyJ6ZKuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i5oqV5bCE5oyJ6ZKu44CC5bey5pat5byA6L+e5o6lIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLmipXlsITmjInpkq7jgILmraPlnKjov57mjqUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i5oqV5bCE5oyJ6ZKu44CC5bey6L+e5o6lIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuaKleWwhOWIsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Iuato+WcqOafpeaJvuiuvuWkhyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLmlq3lvIDov57mjqUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLlgZzmraLmipXlsIQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuWFs+mXrSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuaSreaUviI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i5pqC5YGcIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i5YGc5q2iIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i5bGV5byAIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLmlLbotbciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLkuJPovpHlsIHpnaIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i6Z+z6YeP5ruR5Z2XIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLmnKrpgInmi6nku7vkvZXlqpLkvZMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuayoeacieS7u+S9leebuOWFs+S/oeaBryI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i5q2j5Zyo5oqV5bCE5bGP5bmVIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16aC1ySEsvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16aC1ySEsvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU2ZTVjMgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXpoLXJISy9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i57O757WxIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+Iuijnee9riI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuaKleaUvuaMiemIlSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuaKleaUvuaMiemIleOAguW3suino+mZpOmAo+aOpSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i5oqV5pS+5oyJ6YiV44CC5q2j5Zyo6YCj5o6lIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuaKleaUvuaMiemIleOAguW3sumAo+aOpSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLmipXmlL7oh7MiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLmraPlnKjlsIvmib7oo53nva4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i5Lit5pa36YCj57eaIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i5YGc5q2i5oqV5pS+Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLpl5zplokiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLmkq3mlL4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+Iuaaq+WBnCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuWBnOatoiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuWxlemWiyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i5pS25ZCIIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i5bCI6Lyv5bCB6Z2iIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+Iumfs+mHj+a7keahvyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i5bCa5pyq6YG45pOH5aqS6auUIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLmspLmnInoqbPntLDos4fmlpkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Iuato+WcqOaKleaUvuieouW5lSI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtemgtclRXL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtemgtclRXL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYWZkZTEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16aC1yVFcvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+Iuezu+e1sSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLoo53nva4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLmipXmlL7mjInpiJUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLmipXmlL7mjInpiJXvvJvlt7LkuK3mlrfpgKPnt5oiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuaKleaUvuaMiemIle+8m+mAo+e3muS4rSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLmipXmlL7mjInpiJXvvJvlt7LpgKPnt5oiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i5oqV5pS+5YiwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i5q2j5Zyo5bCL5om+6KOd572uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuS4reaWt+mAo+e3miI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuWBnOatouaKleaUviI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i6Zec6ZaJIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i5pKt5pS+Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLmmqvlgZwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLlgZzmraIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLlsZXplosiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuaUtuWQiCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuWwiOi8r+WwgemdoiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLpn7Pph4/mu5Hmob8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuacqumBuOWPluS7u+S9leWqkumrlCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i5rKS5pyJ5Y+v55So55qE6LOH6KiKIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLmraPlnKjmipXmlL7onqLluZUiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXp1L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtenUvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEwN2M0MwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXp1L3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJJc2lzdGltdSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJBbWFkaXZheWlzaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+Iklua2lub2JobyB5ZS1DYXN0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iSW5raW5vYmhvIHlva3VzYWthemEuIEt1bnFhbnl1bGl3ZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iSW5raW5vYmhvIHlva3VzYWthemEuIEt1eWF4aHVueXdhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Iklua2lub2JobyB5b2t1c2FrYXphLiBLdXhodW55aXdlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlNha2F6YSBrdS0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJJdGhvbGEgYW1hZGl2YXlpc2kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iTnFhbXVsYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+Ik1pc2EgdWt1c2FrYXphIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJWYWxhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iRGxhbGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+Ik1pc2EgaXNpa2hhc2hhbmEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJNaXNhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iTndlYmEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkdvcWEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJVYnVjaWtvIGJlLWFsYmhhbXUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iSXNpbGF5aWRhIHNldm9sdW11Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJBeWlraG8gaW1pZGl5YSBla2hldGhpd2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkFsdWtobyB1bHdhemkgb2x1dGhvbGFrYWxheW8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IklzaWtyaW5pIHNva3VzYWthemEiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2FycmF5cy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9hcnJheXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExODczMjAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9hcnJheXMueG1sCkBAIC0wLDAgKzEsMjcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHJlc291cmNlcz4KKyAgICA8aW50ZWdlci1hcnJheSBuYW1lPSJzcGVlZF9tdWx0aXBsaWVkX2J5XzEwMCI+CisgICAgICAgIDxpdGVtPjI1PC9pdGVtPgorICAgICAgICA8aXRlbT41MDwvaXRlbT4KKyAgICAgICAgPGl0ZW0+NzU8L2l0ZW0+CisgICAgICAgIDxpdGVtPjEwMDwvaXRlbT4KKyAgICAgICAgPGl0ZW0+MTI1PC9pdGVtPgorICAgICAgICA8aXRlbT4xNTA8L2l0ZW0+CisgICAgICAgIDxpdGVtPjIwMDwvaXRlbT4KKyAgICA8L2ludGVnZXItYXJyYXk+Cis8L3Jlc291cmNlcz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9hdHRycy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9hdHRycy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM3Mjg1YgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2F0dHJzLnhtbApAQCAtMCwwICsxLDQ0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxyZXNvdXJjZXM+CisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9Ik1lZGlhUm91dGVCdXR0b24iPgorICAgICAgICA8IS0tIFRoaXMgZHJhd2FibGUgaXMgYSBzdGF0ZSBsaXN0IHdoZXJlIHRoZSAiY2hlY2tlZCIgc3RhdGUKKyAgICAgICAgICAgICBpbmRpY2F0ZXMgYWN0aXZlIG1lZGlhIHJvdXRpbmcuICBDaGVja2FibGUgaW5kaWNhdGVzIGNvbm5lY3RpbmcKKyAgICAgICAgICAgICBhbmQgbm9uLWNoZWNrZWQgLyBub24tY2hlY2thYmxlIGluZGljYXRlcworICAgICAgICAgICAgIHRoYXQgbWVkaWEgaXMgcGxheWluZyB0byB0aGUgbG9jYWwgZGV2aWNlIG9ubHkuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJleHRlcm5hbFJvdXRlRW5hYmxlZERyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBUaW50IHRvIGFwcGx5IHRvIHRoZSBtZWRpYSByb3V0ZSBidXR0b24gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVCdXR0b25UaW50IiBmb3JtYXQ9ImNvbG9yIiAvPgorCisgICAgICAgIDxhdHRyIG5hbWU9ImFuZHJvaWQ6bWluV2lkdGgiIC8+CisgICAgICAgIDxhdHRyIG5hbWU9ImFuZHJvaWQ6bWluSGVpZ2h0IiAvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CisKKyAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlQnV0dG9uU3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVDbG9zZURyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlUGxheURyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlUGF1c2VEcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZVN0b3BEcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZUF1ZGlvVHJhY2tEcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZURlZmF1bHRJY29uRHJhd2FibGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVUdkljb25EcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZVNwZWFrZXJJY29uRHJhd2FibGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVTcGVha2VyR3JvdXBJY29uRHJhd2FibGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVDb250cm9sUGFuZWxUaGVtZU92ZXJsYXkiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorCisgICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZVRoZW1lIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvY29sb3JzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2NvbG9ycy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdiYzI5OQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2NvbG9ycy54bWwKQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cmVzb3VyY2VzPgorICAgIDxjb2xvciBuYW1lPSJncmF5Ij4jODA4MDgwPC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0id2hpdGUiPiNmZmZmZmY8L2NvbG9yPgorICAgIDxjb2xvciBuYW1lPSJ3aGl0ZV9vcGFjaXR5XzcwIj4jQjNmZmZmZmY8L2NvbG9yPgorICAgIDxjb2xvciBuYW1lPSJibGFja19vcGFjaXR5XzcwIj4jQjMwMDAwMDA8L2NvbG9yPgorICAgIDxjb2xvciBuYW1lPSJ0aXRsZV9iYXJfZ3JhZGllbnRfc3RhcnQiPiM1MDAwMDAwMDwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9InRpdGxlX2Jhcl9ncmFkaWVudF9lbmQiPiMwMDAwMDAwMDwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9ImJvdHRvbV9iYXJfYmFja2dyb3VuZCI+IzQwMjAyMDIwPC9jb2xvcj4KKzwvcmVzb3VyY2VzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2RpbWVucy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9kaW1lbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkN2IwMjIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9kaW1lbnMueG1sCkBAIC0wLDAgKzEsNzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHJlc291cmNlcz4KKyAgICA8IS0tIERpYWxvZyBzaXplIC0tPgorICAgIDxlYXQtY29tbWVudCAvPgorICAgIDwhLS0gVGhlIHBsYXRmb3JtJ3MgZGVzaXJlZCBmaXhlZCB3aWR0aCBmb3IgYSBkaWFsb2cgYWxvbmcgdGhlIG1ham9yIGF4aXMKKyAgICAgICAgICh0aGUgc2NyZWVuIGlzIGluIGxhbmRzY2FwZSkuIFRoaXMgbWF5IGJlIGVpdGhlciBhIGZyYWN0aW9uIG9yIGEgZGltZW5zaW9uLi0tPgorICAgIDxkaW1lbiBuYW1lPSJtcl9kaWFsb2dfZml4ZWRfd2lkdGhfbWFqb3IiPjMyMGRwPC9kaW1lbj4KKyAgICA8IS0tIFRoZSBwbGF0Zm9ybSdzIGRlc2lyZWQgZml4ZWQgd2lkdGggZm9yIGEgZGlhbG9nIGFsb25nIHRoZSBtaW5vciBheGlzCisgICAgICAgICAodGhlIHNjcmVlbiBpcyBpbiBwb3J0cmFpdCkuIFRoaXMgbWF5IGJlIGVpdGhlciBhIGZyYWN0aW9uIG9yIGEgZGltZW5zaW9uLi0tPgorICAgIDxkaW1lbiBuYW1lPSJtcl9kaWFsb2dfZml4ZWRfd2lkdGhfbWlub3IiPjMyMGRwPC9kaW1lbj4KKworICAgIDwhLS0gTWVkaWFSb3V0ZUNvbnRyb2xsZXIncyB2b2x1bWUgZ3JvdXAgbGlzdCAtLT4KKyAgICA8ZWF0LWNvbW1lbnQgLz4KKyAgICA8IS0tIE1heGltdW0gaGVpZ2h0IG9mIHZvbHVtZSBncm91cCBsaXN0LiAtLT4KKyAgICA8ZGltZW4gbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9tYXhfaGVpZ2h0Ij4yODhkcDwvZGltZW4+CisgICAgPCEtLSBIZWlnaHQgb2Ygdm9sdW1lIGdyb3VwIGl0ZW0uIC0tPgorICAgIDxkaW1lbiBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2l0ZW1faGVpZ2h0Ij42OGRwPC9kaW1lbj4KKyAgICA8IS0tIFNpemUgb2YgYW4gaXRlbSdzIGljb24uIC0tPgorICAgIDxkaW1lbiBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2l0ZW1faWNvbl9zaXplIj4yNGRwPC9kaW1lbj4KKworICAgIDxkaW1lbiBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X3BhZGRpbmdfdG9wIj4xNmRwPC9kaW1lbj4KKyAgICA8IS0tIEdyb3VwIGxpc3QgZXhwYW5kL2NvbGxhcHNlIGFuaW1hdGlvbiBkdXJhdGlvbi4gLS0+CisgICAgPGludGVnZXIgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9hbmltYXRpb25fZHVyYXRpb25fbXMiPjQwMDwvaW50ZWdlcj4KKyAgICA8IS0tIEdyb3VwIGxpc3QgZmFkZSBpbiBhbmltYXRpb24gZHVyYXRpb24uIC0tPgorICAgIDxpbnRlZ2VyIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfZmFkZV9pbl9kdXJhdGlvbl9tcyI+NDAwPC9pbnRlZ2VyPgorICAgIDwhLS0gR3JvdXAgbGlzdCBmYWRlIG91dCBhbmltYXRpb24gZHVyYXRpb24uIC0tPgorICAgIDxpbnRlZ2VyIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfZmFkZV9vdXRfZHVyYXRpb25fbXMiPjIwMDwvaW50ZWdlcj4KKworICAgIDxkaW1lbiBuYW1lPSJtY3YyX2VtYmVkZGVkX3NldHRpbmdzX3dpZHRoIj4xNTBkcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9Im1jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaGVpZ2h0Ij4zNmRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ibWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19pY29uX3NpemUiPjIwZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJtY3YyX2VtYmVkZGVkX3NldHRpbmdzX3RleHRfaGVpZ2h0Ij4xOGRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ibWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19tYWluX3RleHRfc2l6ZSI+MTJzcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9Im1jdjJfZW1iZWRkZWRfc2V0dGluZ3Nfc3ViX3RleHRfc2l6ZSI+MTBzcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9Im1jdjJfZnVsbF9zZXR0aW5nc193aWR0aCI+MjI1ZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJtY3YyX2Z1bGxfc2V0dGluZ3NfaGVpZ2h0Ij41NGRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ibWN2Ml9mdWxsX3NldHRpbmdzX2ljb25fc2l6ZSI+MzBkcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9Im1jdjJfZnVsbF9zZXR0aW5nc190ZXh0X2hlaWdodCI+MjdkcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9Im1jdjJfZnVsbF9zZXR0aW5nc19tYWluX3RleHRfc2l6ZSI+MTZzcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9Im1jdjJfZnVsbF9zZXR0aW5nc19zdWJfdGV4dF9zaXplIj4xM3NwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ibWN2Ml9zZXR0aW5nc19vZmZzZXQiPjhkcDwvZGltZW4+CisKKyAgICA8ZGltZW4gbmFtZT0ibWN2Ml90cmFuc3BvcnRfY29udHJvbHNfcGFkZGluZyI+NGRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ibWN2Ml9wYXVzZV9pY29uX3NpemUiPjM2ZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJtY3YyX2Z1bGxfaWNvbl9zaXplIj4yOGRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ibWN2Ml9lbWJlZGRlZF9pY29uX3NpemUiPjI0ZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJtY3YyX21pbmltYWxfaWNvbl9zaXplIj4yNGRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ibWN2Ml9pY29uX21hcmdpbiI+MTBkcDwvZGltZW4+CisKKyAgICA8ZGltZW4gbmFtZT0ibWN2Ml9mdWxsX2FsYnVtX2ltYWdlX3BvcnRyYWl0X3NpemUiPjIzMmRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ibWN2Ml9mdWxsX2FsYnVtX2ltYWdlX2xhbmRzY2FwZV9zaXplIj4xNzZkcDwvZGltZW4+CisKKyAgICA8ZGltZW4gbmFtZT0ibWN2Ml9jdXN0b21fcHJvZ3Jlc3NfbWF4X3NpemUiPjJkcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9Im1jdjJfY3VzdG9tX3Byb2dyZXNzX3RodW1iX3NpemUiPjEyZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJtY3YyX2J1ZmZlcl92aWV3X2hlaWdodCI+NWRwPC9kaW1lbj4KKyAgICA8IS0tIFRPRE86IGFkanVzdCBib3R0b20gYmFyIHZpZXcgLS0+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU5N2EzYgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsMTU3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKworICAgIDwhLS0gTmFtZSBmb3IgdGhlIGRlZmF1bHQgc3lzdGVtIHJvdXRlIHByaW9yIHRvIEplbGx5YmVhbi4gW0NIQVIgTElNSVQ9MzBdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiPlN5c3RlbTwvc3RyaW5nPgorCisgICAgPCEtLSBOYW1lIGZvciB0aGUgdXNlciByb3V0ZSBjYXRlZ29yeSBjcmVhdGVkIHdoZW4gcHVibGlzaGluZyByb3V0ZXMgdG8gdGhlIHN5c3RlbSBpbiBKZWxseWJlYW4gYW5kIGFib3ZlLiBbQ0hBUiBMSU1JVD0zMF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiPkRldmljZXM8L3N0cmluZz4KKworICAgIDwhLS0gU3RyaW5nIHRvIGJlIHNob3duIGFzIGEgdG9vbHRpcCBvZiBNZWRpYVJvdXRlQnV0dG9uCisgICAgICAgIENhc3QgaXMgdGhlIHN0YW5kYXJkIGFuZHJvaWQgdmVyYiBmb3Igc2VuZGluZyBjb250ZW50IHRvIGEgcmVtb3RlIGRldmljZS4gW0NIQVIgTElNSVQ9NTBdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iPkNhc3QgYnV0dG9uPC9zdHJpbmc+CisKKyAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gb2YgYSBNZWRpYVJvdXRlQnV0dG9uIGZvciBhY2Nlc3NpYmlsaXR5IHN1cHBvcnQgd2hlbiBubyByZW1vdGUgZGV2aWNlIGlzIGNvbm5lY3RlZC4KKyAgICAgICAgQ2FzdCBpcyB0aGUgc3RhbmRhcmQgYW5kcm9pZCB2ZXJiIGZvciBzZW5kaW5nIGNvbnRlbnQgdG8gYSByZW1vdGUgZGV2aWNlLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCI+Q2FzdCBidXR0b24uIERpc2Nvbm5lY3RlZDwvc3RyaW5nPgorCisgICAgPCEtLSBDb250ZW50IGRlc2NyaXB0aW9uIG9mIGEgTWVkaWFSb3V0ZUJ1dHRvbiBmb3IgYWNjZXNzaWJpbGl0eSBzdXBwb3J0IHdoaWxlIGNvbm5lY3RpbmcgdG8gYSByZW1vdGUgZGV2aWNlLgorICAgICAgICBDYXN0IGlzIHRoZSBzdGFuZGFyZCBhbmRyb2lkIHZlcmIgZm9yIHNlbmRpbmcgY29udGVudCB0byBhIHJlbW90ZSBkZXZpY2UuIFtDSEFSIExJTUlUPU5PTkVdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyI+Q2FzdCBidXR0b24uIENvbm5lY3Rpbmc8L3N0cmluZz4KKworICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBvZiBhIE1lZGlhUm91dGVCdXR0b24gZm9yIGFjY2Vzc2liaWxpdHkgc3VwcG9ydCB3aGVuIGEgcmVtb3RlIGRldmljZSBpcyBjb25uZWN0ZWQuCisgICAgICAgIENhc3QgaXMgdGhlIHN0YW5kYXJkIGFuZHJvaWQgdmVyYiBmb3Igc2VuZGluZyBjb250ZW50IHRvIGEgcmVtb3RlIGRldmljZS4gW0NIQVIgTElNSVQ9Tk9ORV0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiPkNhc3QgYnV0dG9uLiBDb25uZWN0ZWQ8L3N0cmluZz4KKworICAgIDwhLS0gVGl0bGUgb2YgdGhlIG1lZGlhIHJvdXRlIGNob29zZXIgZGlhbG9nLiBbQ0hBUiBMSU1JVD0zMF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIj5DYXN0IHRvPC9zdHJpbmc+CisKKyAgICA8IS0tIFBsYWNlaG9sZGVyIHRleHQgdG8gc2hvdyB3aGVuIG5vIGRldmljZXMgaGF2ZSBiZWVuIGZvdW5kLiBbQ0hBUiBMSU1JVD01MF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyI+RmluZGluZyBkZXZpY2VzPC9zdHJpbmc+CisKKyAgICA8IS0tIEJ1dHRvbiB0byBkaXNjb25uZWN0IGZyb20gYSBtZWRpYSByb3V0ZS4gIFtDSEFSIExJTUlUPTMwXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCI+RGlzY29ubmVjdDwvc3RyaW5nPgorCisgICAgPCEtLSBCdXR0b24gdG8gc3RvcCBwbGF5YmFjayBhbmQgZGlzY29ubmVjdCBmcm9tIGEgbWVkaWEgcm91dGUuIFtDSEFSIExJTUlUPTMwXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIj5TdG9wIGNhc3Rpbmc8L3N0cmluZz4KKworICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiBkaWFsb2cgY2xvc2UgYnV0dG9uLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iPkNsb3NlPC9zdHJpbmc+CisKKyAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gZm9yIGFjY2Vzc2liaWxpdHkgKG5vdCBzaG93biBvbiB0aGUgc2NyZWVuKTogbWVkaWEgcGxheSBidXR0b24uIFtDSEFSIExJTUlUPU5PTkVdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5Ij5QbGF5PC9zdHJpbmc+CisKKyAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gZm9yIGFjY2Vzc2liaWxpdHkgKG5vdCBzaG93biBvbiB0aGUgc2NyZWVuKTogbWVkaWEgcGF1c2UgYnV0dG9uLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiPlBhdXNlPC9zdHJpbmc+CisKKyAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gZm9yIGFjY2Vzc2liaWxpdHkgKG5vdCBzaG93biBvbiB0aGUgc2NyZWVuKTogbWVkaWEgc3RvcCBidXR0b24uIFtDSEFSIExJTUlUPU5PTkVdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIj5TdG9wPC9zdHJpbmc+CisKKyAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gZm9yIGFjY2Vzc2liaWxpdHkgKG5vdCBzaG93biBvbiB0aGUgc2NyZWVuKTogZ3JvdXAgZXhwYW5kIGJ1dHRvbi4gUHJlc3NpbmcgYnV0dG9uIHNob3dzIGdyb3VwIG1lbWJlcnMgb2YgYSBzZWxlY3RlZCByb3V0ZSBncm91cC4gW0NIQVIgTElNSVQ9Tk9ORV0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCI+RXhwYW5kPC9zdHJpbmc+CisKKyAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gZm9yIGFjY2Vzc2liaWxpdHkgKG5vdCBzaG93biBvbiB0aGUgc2NyZWVuKTogZ3JvdXAgY29sbGFwc2UgYnV0dG9uLiBQcmVzc2luZyBidXR0b24gaGlkZXMgZ3JvdXAgbWVtYmVycyBvZiBhIHNlbGVjdGVkIHJvdXRlIGdyb3VwLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiPkNvbGxhcHNlPC9zdHJpbmc+CisKKyAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gZm9yIGFjY2Vzc2liaWxpdHkgKG5vdCBzaG93biBvbiB0aGUgc2NyZWVuKTogYWxidW0gYXJ0IGJ1dHRvbi4gQ2xpY2tpbmcgb24gdGhlIGFsYnVtIGFydCB0YWtlcyB1c2VyIHRvIGEgcHJlZGVmaW5lZCBhY3Rpdml0eSBwZXIgbWVkaWEgYXBwLiBbQ0hBUiBMSU1JVD01MF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCI+QWxidW0gYXJ0PC9zdHJpbmc+CisKKyAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gZm9yIGFjY2Vzc2liaWxpdHkgKG5vdCBzaG93biBvbiB0aGUgc2NyZWVuKTogdm9sdW1lIHNsaWRlci4gW0NIQVIgTElNSVQ9Tk9ORV0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiPlZvbHVtZSBzbGlkZXI8L3N0cmluZz4KKworICAgIDwhLS0gUGxhY2Vob2xkZXIgdGV4dCB0byBzaG93IHdoZW4gbm8gbWVkaWEgaGF2ZSBiZWVuIHNlbGVjdGVkIGZvciBwbGF5YmFjay4gW0NIQVIgTElNSVQ9NTBdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCI+Tm8gbWVkaWEgc2VsZWN0ZWQ8L3N0cmluZz4KKworICAgIDwhLS0gUGxhY2Vob2xkZXIgdGV4dCB0byBzaG93IHdoZW4gbm8gdGl0bGUvZGVzY3JpcHRpb24gaGF2ZSBiZWVuIGZvdW5kIGZvciBhIGdpdmVuIHNvbmcvdmlkZW8uIFtDSEFSIExJTUlUPTUwXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiPk5vIGluZm8gYXZhaWxhYmxlPC9zdHJpbmc+CisKKyAgICA8IS0tIFBsYWNlaG9sZGVyIHRleHQgaW5kaWNhdGluZyB0aGF0IHRoZSB1c2VyIGlzIGN1cnJlbnRseSBjYXN0aW5nIHNjcmVlbi4gW0NIQVIgTElNSVQ9NTBdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiI+Q2FzdGluZyBzY3JlZW48L3N0cmluZz4KKworICAgIDwhLS0gVGV4dCBmb3IgZXJyb3IgYWxlcnQgd2hlbiBhIHZpZGVvIGNvbnRhaW5lciBpcyBub3QgdmFsaWQgZm9yIHByb2dyZXNzaXZlIGRvd25sb2FkL3BsYXliYWNrLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9IlZpZGVvVmlldzJfZXJyb3JfdGV4dF9pbnZhbGlkX3Byb2dyZXNzaXZlX3BsYXliYWNrIj5UaGlzIHZpZGVvIGlzblwndCB2YWxpZCBmb3Igc3RyZWFtaW5nIHRvIHRoaXMgZGV2aWNlLjwvc3RyaW5nPgorICAgIDwhLS0gVGV4dCBmb3IgZXJyb3IgYWxlcnQgd2hlbiBhIHZpZGVvIGNhbm5vdCBiZSBwbGF5ZWQuIEl0IGNhbiBiZSB1c2VkIGJ5IGFueSBhcHAuIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iVmlkZW9WaWV3Ml9lcnJvcl90ZXh0X3Vua25vd24iPkNhblwndCBwbGF5IHRoaXMgdmlkZW8uPC9zdHJpbmc+CisgICAgPCEtLSBCdXR0b24gdG8gY2xvc2UgZXJyb3IgYWxlcnQgd2hlbiBhIHZpZGVvIGNhbm5vdCBiZSBwbGF5ZWQuIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iVmlkZW9WaWV3Ml9lcnJvcl9idXR0b24iPk9LPC9zdHJpbmc+CisKKyAgICA8IS0tIFRleHQgZm9yIGRpc3BsYXlpbmcgYWQgc2tpcCB3YWl0IHRpbWUuIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfYWRfc2tpcF93YWl0X3RpbWUiPgorICAgICAgICBZb3UgY2FuIHNraXAgQWQgaW4gPHhsaWZmOmcgaWQ9IndhaXRfdGltZSIgZXhhbXBsZT0iNSI+JTEkZDwveGxpZmY6Zz5zCisgICAgPC9zdHJpbmc+CisgICAgPCEtLSBUZXh0IGZvciBkaXNwbGF5aW5nIGFkIHRvdGFsIHJlbWFpbmluZyB0aW1lLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX2FkX3JlbWFpbmluZ190aW1lIj4KKyAgICAgICAgQWQgwrcgPHhsaWZmOmcgaWQ9InJlbWFpbmluZ190aW1lIiBleGFtcGxlPSIxOjE1Ij4lMSRzPC94bGlmZjpnPiByZW1haW5pbmcKKyAgICA8L3N0cmluZz4KKyAgICA8IS0tIFBsYWNlaG9sZGVyIHRleHQgaW5kaWNhdGluZyB0aGF0IHRoZSB1c2VyIGNhbiBwcmVzcyB0aGUgYnV0dG9uIHRvIGdvIHRvIGFuIGV4dGVybmFsIHdlYnNpdGUuIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfYWRfdGV4dCI+VmlzaXQgQWR2ZXJ0aXNlcjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfc3VidGl0bGVfdGV4dCI+Q2xvc2VkIGNhcHRpb248L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX3N1YnRpdGxlX29mZl90ZXh0Ij5PZmY8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX2F1ZGlvX3RyYWNrX3RleHQiPkF1ZGlvIHRyYWNrPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml9hdWRpb190cmFja19ub25lX3RleHQiPk5vbmU8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX3ZpZGVvX3F1YWxpdHlfdGV4dCI+VmlkZW8gcXVhbGl0eTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfdmlkZW9fcXVhbGl0eV9hdXRvX3RleHQiPkF1dG88L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX2hlbHBfdGV4dCI+SGVscCAmYW1wOyBmZWVkYmFjazwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfcGxheWJhY2tfc3BlZWRfdGV4dCI+UGxheWJhY2sgc3BlZWQ8L3N0cmluZz4KKyAgICA8c3RyaW5nLWFycmF5IG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX3BsYXliYWNrX3NwZWVkcyI+CisgICAgICAgIDxpdGVtPjAuMjV4PC9pdGVtPgorICAgICAgICA8aXRlbT4wLjV4PC9pdGVtPgorICAgICAgICA8aXRlbT4wLjc1eDwvaXRlbT4KKyAgICAgICAgPGl0ZW0+Tm9ybWFsPC9pdGVtPgorICAgICAgICA8aXRlbT4xLjI1eDwvaXRlbT4KKyAgICAgICAgPGl0ZW0+MS41eDwvaXRlbT4KKyAgICAgICAgPGl0ZW0+Mng8L2l0ZW0+CisgICAgPC9zdHJpbmctYXJyYXk+CisgICAgPCEtLSBQbGFjZWhvbGRlciB0ZXh0IGZvciBkaXNwbGF5aW5nIHRpbWUuIFVzZWQgdG8gY2FsY3VsYXRlIHdoaWNoIHNpemUgbGF5b3V0IHRvIHVzZS4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml90aW1lX3BsYWNlaG9sZGVyIj4wMDowMDowMDwvc3RyaW5nPgorCisgICAgPCEtLSBUZXh0IGZvciBkaXNwbGF5aW5nIHN1YnRpdGxlIHRyYWNrIG51bWJlci4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml9zdWJ0aXRsZV90cmFja19udW1iZXJfdGV4dCI+CisgICAgICAgIFRyYWNrIDx4bGlmZjpnIGlkPSJ0cmFja19udW1iZXIiIGV4YW1wbGU9IjEiPiUxJHM8L3hsaWZmOmc+CisgICAgPC9zdHJpbmc+CisgICAgPCEtLSBUZXh0IGZvciBkaXNwbGF5aW5nIGF1ZGlvIHRyYWNrIG51bWJlci4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml9hdWRpb190cmFja19udW1iZXJfdGV4dCI+CisgICAgICAgIFRyYWNrIDx4bGlmZjpnIGlkPSJhdWRpb19udW1iZXIiIGV4YW1wbGU9IjEiPiUxJHM8L3hsaWZmOmc+CisgICAgPC9zdHJpbmc+CisgICAgPCEtLSBUZXh0IGZvciBkaXNwbGF5aW5nIHVua25vd24gc29uZyB0aXRsZS4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJtY3YyX211c2ljX3RpdGxlX3Vua25vd25fdGV4dCI+U29uZyB0aXRsZSB1bmtub3duPC9zdHJpbmc+CisgICAgPCEtLSBUZXh0IGZvciBkaXNwbGF5aW5nIHVua25vd24gYXJ0aXN0IG5hbWUuIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9tdXNpY19hcnRpc3RfdW5rbm93bl90ZXh0Ij5BcnRpc3QgdW5rbm93bjwvc3RyaW5nPgorCisgICAgPCEtLUNvbnRlbnQgRGVzY3JpcHRpb25zIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9iYWNrX2J1dHRvbl9kZXNjIj5CYWNrPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtY3YyX292ZXJmbG93X2xlZnRfYnV0dG9uX2Rlc2MiPlNlZSBtb3JlIGJ1dHRvbnM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1jdjJfb3ZlcmZsb3dfcmlnaHRfYnV0dG9uX2Rlc2MiPkJhY2sgdG8gcHJldmlvdXMgYnV0dG9uIGxpc3Q8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1jdjJfc2Vla19iYXJfZGVzYyI+UGxheWJhY2sgcHJvZ3Jlc3M8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1jdjJfc2V0dGluZ3NfYnV0dG9uX2Rlc2MiPlNldHRpbmdzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtY3YyX3ZpZGVvX3F1YWxpdHlfYnV0dG9uX2Rlc2MiPlZpZGVvIFF1YWxpdHkgU2VsZWN0aW9uPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtY3YyX2NjX2lzX29uIj5TdWJ0aXRsZSBpcyBvbi4gQ2xpY2sgdG8gaGlkZSBpdC48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1jdjJfY2NfaXNfb2ZmIj5TdWJ0aXRsZSBpcyBvZmYuIENsaWNrIHRvIHNob3cgaXQuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtY3YyX3JlcGxheV9idXR0b25fZGVzYyI+UmVwbGF5PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtY3YyX3BsYXlfYnV0dG9uX2Rlc2MiPlBsYXk8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1jdjJfcGF1c2VfYnV0dG9uX2Rlc2MiPlBhdXNlPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtY3YyX3ByZXZpb3VzX2J1dHRvbl9kZXNjIj5QcmV2aW91cyBtZWRpYTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9uZXh0X2J1dHRvbl9kZXNjIj5OZXh0IG1lZGlhPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtY3YyX3Jld2luZF9idXR0b25fZGVzYyI+UmV3aW5kIGJ5IDEwIHNlY29uZHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1jdjJfZmZ3ZF9idXR0b25fZGVzYyI+R28gZm9yd2FyZCBieSAzMCBzZWNvbmRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtY3YyX2xhdW5jaF9idXR0b25fZGVzYyI+TGF1bmNoIExpbms8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1jdjJfbXV0ZWRfYnV0dG9uX2Rlc2MiPk11dGVkLiBDbGljayB0byB1bm11dGU8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1jdjJfdW5tdXRlZF9idXR0b25fZGVzYyI+Q2xpY2sgdG8gTXV0ZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9mdWxsX3NjcmVlbl9idXR0b25fZGVzYyI+RnVsbCBzY3JlZW48L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvc3R5bGUueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvc3R5bGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViOWE4ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zdHlsZS54bWwKQEAgLTAsMCArMSwyMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8cmVzb3VyY2VzPgorICAgIDxzdHlsZSBuYW1lPSJGdWxsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24iPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBudWxsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9tYXJnaW4iPkBkaW1lbi9tY3YyX2ljb25fbWFyZ2luPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNjYWxlVHlwZSI+Zml0WFk8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJGdWxsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uUHJldmlvdXMiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX3NraXBfcHJldmlvdXM8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5AZGltZW4vbWN2Ml9mdWxsX2ljb25fc2l6ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9mdWxsX2ljb25fc2l6ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9wcmV2aW91c19idXR0b25fZGVzYzwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IkZ1bGxUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5OZXh0Ij4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19za2lwX25leHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5AZGltZW4vbWN2Ml9mdWxsX2ljb25fc2l6ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9mdWxsX2ljb25fc2l6ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9uZXh0X2J1dHRvbl9kZXNjPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iRnVsbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLlBhdXNlIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19wYXVzZV9jaXJjbGVfZmlsbGVkPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfcGF1c2VfaWNvbl9zaXplPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX3BhdXNlX2ljb25fc2l6ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9wYXVzZV9idXR0b25fZGVzYzwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IkZ1bGxUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5GZndkIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19mb3J3YXJkXzMwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfZnVsbF9pY29uX3NpemU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+QGRpbWVuL21jdjJfZnVsbF9pY29uX3NpemU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfZmZ3ZF9idXR0b25fZGVzYzwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IkZ1bGxUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5SZXciPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX3Jld2luZF8xMDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX2Z1bGxfaWNvbl9zaXplPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX2Z1bGxfaWNvbl9zaXplPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX3Jld2luZF9idXR0b25fZGVzYzwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IkVtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24iPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBudWxsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9tYXJnaW4iPkBkaW1lbi9tY3YyX2ljb25fbWFyZ2luPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNjYWxlVHlwZSI+Zml0WFk8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJFbWJlZGRlZFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLlByZXZpb3VzIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19za2lwX3ByZXZpb3VzPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfZW1iZWRkZWRfaWNvbl9zaXplPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9wcmV2aW91c19idXR0b25fZGVzYzwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IkVtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uTmV4dCI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfc2tpcF9uZXh0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfZW1iZWRkZWRfaWNvbl9zaXplPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9uZXh0X2J1dHRvbl9kZXNjPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iRW1iZWRkZWRUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5QYXVzZSI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfcGF1c2VfY2lyY2xlX2ZpbGxlZDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX3BhdXNlX2ljb25fc2l6ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9wYXVzZV9pY29uX3NpemU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfcGF1c2VfYnV0dG9uX2Rlc2M8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJFbWJlZGRlZFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLkZmd2QiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX2ZvcndhcmRfMzA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5AZGltZW4vbWN2Ml9lbWJlZGRlZF9pY29uX3NpemU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+QGRpbWVuL21jdjJfZW1iZWRkZWRfaWNvbl9zaXplPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX2Zmd2RfYnV0dG9uX2Rlc2M8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJFbWJlZGRlZFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLlJldyI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfcmV3aW5kXzEwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfZW1iZWRkZWRfaWNvbl9zaXplPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9yZXdpbmRfYnV0dG9uX2Rlc2M8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJNaW5pbWFsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24iPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBudWxsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfcGF1c2VfaWNvbl9zaXplPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX3BhdXNlX2ljb25fc2l6ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfbWFyZ2luIj5AZGltZW4vbWN2Ml9pY29uX21hcmdpbjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzY2FsZVR5cGUiPmZpdFhZPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX3BhdXNlX2NpcmNsZV9maWxsZWQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfcGF1c2VfYnV0dG9uX2Rlc2M8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUaXRsZUJhciI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5tYXRjaF9wYXJlbnQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+NDZkcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nU3RhcnQiPjVkcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nRW5kIj41ZHA8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUaXRsZUJhckJ1dHRvbiI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+QG51bGw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj4zNmRwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPjM2ZHA8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUaXRsZUJhckJ1dHRvbi5CYWNrIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19hcnJvd19iYWNrPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX2JhY2tfYnV0dG9uX2Rlc2M8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUaXRsZUJhckJ1dHRvbi5MYXVuY2giPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX2xhdW5jaDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9sYXVuY2hfYnV0dG9uX2Rlc2M8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUaW1lVGV4dCI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj53cmFwX2NvbnRlbnQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+d3JhcF9jb250ZW50PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdTdGFydCI+NGRwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdFbmQiPjRkcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPmJvbGQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFNpemUiPjE0c3A8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Z3Jhdml0eSI+Y2VudGVyPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGltZVRleHQuQ3VycmVudCI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj5AY29sb3Ivd2hpdGU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dCI+QHN0cmluZy9NZWRpYUNvbnRyb2xWaWV3Ml90aW1lX3BsYWNlaG9sZGVyPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGltZVRleHQuSW50ZXJwdW5jdCI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj5AY29sb3Ivd2hpdGVfb3BhY2l0eV83MDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Ij7CtzwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRpbWVUZXh0LkVuZCI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj5AY29sb3Ivd2hpdGVfb3BhY2l0eV83MDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Ij5Ac3RyaW5nL01lZGlhQ29udHJvbFZpZXcyX3RpbWVfcGxhY2Vob2xkZXI8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJCb3R0b21CYXJCdXR0b24iPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBudWxsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfZW1iZWRkZWRfaWNvbl9zaXplPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfbWFyZ2luIj5AZGltZW4vbWN2Ml9pY29uX21hcmdpbjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpncmF2aXR5Ij5jZW50ZXJfaG9yaXpvbnRhbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzY2FsZVR5cGUiPmZpdFhZPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iQm90dG9tQmFyQnV0dG9uLkNDIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19zdWJ0aXRsZV9vZmY8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfY2NfaXNfb2ZmPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iQm90dG9tQmFyQnV0dG9uLkZ1bGxTY3JlZW4iPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX2Z1bGxzY3JlZW48L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfZnVsbF9zY3JlZW5fYnV0dG9uX2Rlc2M8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJCb3R0b21CYXJCdXR0b24uT3ZlcmZsb3dSaWdodCI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfY2hldnJvbl9yaWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9vdmVyZmxvd19yaWdodF9idXR0b25fZGVzYzwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IkJvdHRvbUJhckJ1dHRvbi5PdmVyZmxvd0xlZnQiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX2NoZXZyb25fbGVmdDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9vdmVyZmxvd19sZWZ0X2J1dHRvbl9kZXNjPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iQm90dG9tQmFyQnV0dG9uLlNldHRpbmdzIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19zZXR0aW5nczwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9zZXR0aW5nc19idXR0b25fZGVzYzwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IkJvdHRvbUJhckJ1dHRvbi5NdXRlIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY191bm11dGU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfdW5tdXRlZF9idXR0b25fZGVzYzwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IkJvdHRvbUJhckJ1dHRvbi5WaWRlb1F1YWxpdHkiPgorICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19oaWdoX3F1YWxpdHk8L2l0ZW0+CisgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX3ZpZGVvX3F1YWxpdHlfYnV0dG9uX2Rlc2M8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJGdWxsTXVzaWNQb3J0cmFpdCI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+MGRwPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iRnVsbE11c2ljUG9ydHJhaXQuSW1hZ2UiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+bWF0Y2hfcGFyZW50PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93ZWlnaHQiPjAuNjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpncmF2aXR5Ij5jZW50ZXI8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJGdWxsTXVzaWNQb3J0cmFpdC5UZXh0Ij4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPm1hdGNoX3BhcmVudDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2VpZ2h0Ij4wLjQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Z3Jhdml0eSI+dG9wfGNlbnRlcjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpvcmllbnRhdGlvbiI+dmVydGljYWw8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJGdWxsTXVzaWNMYW5kc2NhcGUiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+MGRwPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iRnVsbE11c2ljTGFuZHNjYXBlLkltYWdlIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5tYXRjaF9wYXJlbnQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dlaWdodCI+MC4zNTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpncmF2aXR5Ij5jZW50ZXJ8cmlnaHQ8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJGdWxsTXVzaWNMYW5kc2NhcGUuVGV4dCI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+bWF0Y2hfcGFyZW50PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93ZWlnaHQiPjAuNjU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQiPjI0ZHA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Z3Jhdml0eSI+Y2VudGVyfGxlZnQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6b3JpZW50YXRpb24iPnZlcnRpY2FsPC9pdGVtPgorICAgIDwvc3R5bGU+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N0eWxlcy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkZTY5MDAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCkBAIC0wLDAgKzEsMzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHJlc291cmNlcz4KKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0Lk1lZGlhUm91dGVyLk1lZGlhUm91dGVCdXR0b24iCisgICAgICAgICAgICBwYXJlbnQ9IldpZGdldC5BcHBDb21wYXQuQWN0aW9uQnV0dG9uIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZXh0ZXJuYWxSb3V0ZUVuYWJsZWREcmF3YWJsZSI+QGRyYXdhYmxlL21yX2J1dHRvbl9kYXJrPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0Lk1lZGlhUm91dGVyLkxpZ2h0Lk1lZGlhUm91dGVCdXR0b24iCisgICAgICAgICAgICBwYXJlbnQ9IldpZGdldC5BcHBDb21wYXQuTGlnaHQuQWN0aW9uQnV0dG9uIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZXh0ZXJuYWxSb3V0ZUVuYWJsZWREcmF3YWJsZSI+QGRyYXdhYmxlL21yX2J1dHRvbl9saWdodDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlRpdGxlIiBwYXJlbnQ9IlRleHRBcHBlYXJhbmNlLkFwcENvbXBhdC5UaXRsZSIgLz4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5NZWRpYVJvdXRlci5QcmltYXJ5VGV4dCIgcGFyZW50PSJUZXh0QXBwZWFyYW5jZS5BcHBDb21wYXQuU3ViaGVhZCIgLz4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5NZWRpYVJvdXRlci5TZWNvbmRhcnlUZXh0IiBwYXJlbnQ9IlRleHRBcHBlYXJhbmNlLkFwcENvbXBhdC5Cb2R5MSIgLz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvc3ltYm9scy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zeW1ib2xzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTBlOGM2Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvc3ltYm9scy54bWwKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+Cis8cmVzb3VyY2VzPgorICAgIDwhLS1qYXZhLXN5bWJvbCB0eXBlPSJpZCIgbmFtZT0iY2MiIC8+CisgICAgPGphdmEtc3ltYm9sIHR5cGU9ImlkIiBuYW1lPSJmZndkIiAvPgorICAgIDxqYXZhLXN5bWJvbCB0eXBlPSJpZCIgbmFtZT0ibWVkaWFjb250cm9sbGVyX3Byb2dyZXNzIiAvPgorICAgIDxqYXZhLXN5bWJvbCB0eXBlPSJpZCIgbmFtZT0ibmV4dCIgLz4KKyAgICA8amF2YS1zeW1ib2wgdHlwZT0iaWQiIG5hbWU9InBhdXNlIiAvPgorICAgIDxqYXZhLXN5bWJvbCB0eXBlPSJpZCIgbmFtZT0icHJldiIgLz4KKyAgICA8amF2YS1zeW1ib2wgdHlwZT0iaWQiIG5hbWU9InJldyIgLz4KKyAgICA8amF2YS1zeW1ib2wgdHlwZT0iaWQiIG5hbWU9InRpbWUiIC8+CisgICAgPGphdmEtc3ltYm9sIHR5cGU9ImlkIiBuYW1lPSJ0aW1lX2N1cnJlbnQiIC8tLT4KKzwvcmVzb3VyY2VzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3RoZW1lcy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy90aGVtZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YTc1NGIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy90aGVtZXMueG1sCkBAIC0wLDAgKzEsNzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHJlc291cmNlcz4KKworICAgIDxzdHlsZSBuYW1lPSJUaGVtZS5NZWRpYVJvdXRlciIgcGFyZW50PSJhbmRyb2lkOlRoZW1lLk1hdGVyaWFsIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dOb1RpdGxlIj50cnVlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQnV0dG9uU3R5bGUiPkBzdHlsZS9XaWRnZXQuTWVkaWFSb3V0ZXIuTWVkaWFSb3V0ZUJ1dHRvbjwvaXRlbT4KKworICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQ2xvc2VEcmF3YWJsZSI+QGRyYXdhYmxlL21yX2RpYWxvZ19jbG9zZV9kYXJrPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlUGxheURyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfcGxheV9kYXJrPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlUGF1c2VEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3BhdXNlX2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVTdG9wRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9zdG9wX2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVBdWRpb1RyYWNrRHJhd2FibGUiPkBkcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVEZWZhdWx0SWNvbkRyYXdhYmxlIj5AZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlVHZJY29uRHJhd2FibGUiPkBkcmF3YWJsZS9pY192b2xfdHlwZV90dl9kYXJrPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlU3BlYWtlckljb25EcmF3YWJsZSI+QGRyYXdhYmxlL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVNwZWFrZXJHcm91cEljb25EcmF3YWJsZSI+QGRyYXdhYmxlL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyazwvaXRlbT4KKworICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQ29udHJvbFBhbmVsVGhlbWVPdmVybGF5Ij5AbnVsbDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRoZW1lLk1lZGlhUm91dGVyLkxpZ2h0Q29udHJvbFBhbmVsIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZUNvbnRyb2xQYW5lbFRoZW1lT3ZlcmxheSI+QHN0eWxlL1RoZW1lT3ZlcmxheS5NZWRpYVJvdXRlci5MaWdodDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRoZW1lLk1lZGlhUm91dGVyLkxpZ2h0IiBwYXJlbnQ9ImFuZHJvaWQ6VGhlbWUuTWF0ZXJpYWwuTGlnaHQiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd05vVGl0bGUiPnRydWU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVCdXR0b25TdHlsZSI+QHN0eWxlL1dpZGdldC5NZWRpYVJvdXRlci5MaWdodC5NZWRpYVJvdXRlQnV0dG9uPC9pdGVtPgorCisgICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVDbG9zZURyYXdhYmxlIj5AZHJhd2FibGUvbXJfZGlhbG9nX2Nsb3NlX2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlUGxheURyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfcGxheV9saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVBhdXNlRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9wYXVzZV9saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVN0b3BEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3N0b3BfbGlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVBdWRpb1RyYWNrRHJhd2FibGUiPkBkcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlRGVmYXVsdEljb25EcmF3YWJsZSI+QGRyYXdhYmxlL2ljX21yX2J1dHRvbl9ncmV5PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlVHZJY29uRHJhd2FibGUiPkBkcmF3YWJsZS9pY192b2xfdHlwZV90dl9saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVNwZWFrZXJJY29uRHJhd2FibGUiPkBkcmF3YWJsZS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlU3BlYWtlckdyb3VwSWNvbkRyYXdhYmxlIj5AZHJhd2FibGUvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodDwvaXRlbT4KKworICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQ29udHJvbFBhbmVsVGhlbWVPdmVybGF5Ij5AbnVsbDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRoZW1lLk1lZGlhUm91dGVyLkxpZ2h0LkRhcmtDb250cm9sUGFuZWwiPgorICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQ29udHJvbFBhbmVsVGhlbWVPdmVybGF5Ij5Ac3R5bGUvVGhlbWVPdmVybGF5Lk1lZGlhUm91dGVyLkRhcms8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUaGVtZU92ZXJsYXkuTWVkaWFSb3V0ZXIuRGFyayIgcGFyZW50PSJhbmRyb2lkOlRoZW1lLk1hdGVyaWFsIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVBsYXlEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3BsYXlfZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVBhdXNlRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9wYXVzZV9kYXJrPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlU3RvcERyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfc3RvcF9kYXJrPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQXVkaW9UcmFja0RyYXdhYmxlIj5AZHJhd2FibGUvbXJfdm9sX3R5cGVfYXVkaW90cmFja19kYXJrPC9pdGVtPgorCisgICAgPC9zdHlsZT4KKyAgICA8c3R5bGUgbmFtZT0iVGhlbWVPdmVybGF5Lk1lZGlhUm91dGVyLkxpZ2h0IiBwYXJlbnQ9ImFuZHJvaWQ6VGhlbWUuTWF0ZXJpYWwuTGlnaHQiPgorICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlUGxheURyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfcGxheV9saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVBhdXNlRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9wYXVzZV9saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVN0b3BEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3N0b3BfbGlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVBdWRpb1RyYWNrRHJhd2FibGUiPkBkcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2xpZ2h0PC9pdGVtPgorICAgIDwvc3R5bGU+CisKKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3J1bmN0cy5zaCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9ydW5jdHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFiMWExZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9ydW5jdHMuc2gKQEAgLTAsMCArMSwyMjQgQEAKKyMhL2Jpbi9iYXNoCisjIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgVXNhZ2UgJy4gcnVuY3RzLnNoJworCitmdW5jdGlvbiBfcnVudGVzdF9jdHNfbWVkaWFjb21wb25lbnRfdXNhZ2UoKSB7CisgIGVjaG8gJ3J1bnRlc3QtY3RzLU1lZGlhQ29tcG9uZW50cyBbb3B0aW9uXTogQnVpbGQsIGZsYXNoIGRldmljZSwnCisgIGVjaG8gJyAgICAgICAgICAgICAgYW5kIHJ1biBzdWJzZXQgb2YgQ3RzTWVkaWFUZXN0Q2FzZXMgdGhhdCBNZWRpYUNvbXBvbmVudHMgY292ZXJzLicKKyAgZWNobyAnICAgICAgICAgICpXYXJuaW5nKiBUaGlzIGJ5cGFzc2VzIENUUyBzZXR1cCAoZS5nLiBkb3dubG9hZCBtZWRpYSBjb250ZW50cyBmcm9tIHNlcnZlciknCisgIGVjaG8gJyAgICAgICAgICBGb3IgcnVubmluZyBDVFMgaW4gb2ZmaWNpYWwgd2F5LCB1c2UgYXRlc3Qgb3IgY3RzLXRyYWRlZmVkICcKKyAgZWNobyAnICAgICAtaHwtLWhlbHA6IFRoaXMgaGVscCcKKyAgZWNobyAnICAgICAtLXNraXA6IFNraXAgYnVpbGQgYW5kIGZsYXNoLiBKdXN0IHJlcnVuLXRlc3RzJworICBlY2hvICcgICAgIC0tbWluOiBPbmx5IHJlYnVpbGQgdGVzdHMgYW5kIHVwZGF0YWJsZSBsaWJyYXJ5LicKKyAgZWNobyAnICAgICAtLXRlc3Q6IE9ubHkgcmVidWlsZCB0ZXN0cycKKyAgZWNobyAnICAgICAtcyBbZGV2aWNlX2lkXTogU3BlY2lmeSBhIGRldmljZSBuYW1lIHRvIHJ1biB0ZXN0IGFnYWluc3QuJworICBlY2hvICcgICAgICAgICAgICAgICAgICAgICBZb3UgY2FuIGRlZmluZSAke0FEQkhPU1R9IGluc3RlYWQuJworICBlY2hvICcgICAgIC1yIFtjb3VudF06IFJlcGVhdCB0ZXN0cyBmb3IgZ2l2ZW4gY291bnQuIEl0IHdpbGwgc3RvcCB3aGVuIGZhaWxzLicKKyAgZWNobyAnICAgICAtLWlnbm9yZTogS2VlcCByZXBlYXRpbmcgdGVzdHMgZXZlbiB3aGVuIGl0IGZhaWxzLicKKyAgZWNobyAnICAgICAtdCBbdGVzdF06IE9ubHkgcnVuIHRoZSBzcGVjaWZpYyB0ZXN0LiBDYW4gYmUgZWl0aGVyIGEgY2xhc3Mgb3IgYSBtZXRob2QuJworfQorCitmdW5jdGlvbiBydW50ZXN0LWN0cy1NZWRpYUNvbXBvbmVudHMoKSB7CisgICMgRWRpdCBoZXJlIGlmIHlvdSB3YW50IHRvIHN1cHBvcnQgb3RoZXIgdGVzdHMuCisgICMgTGlzdCB1cCBsaWJzIGFuZCBhcGtzIGluIHRoZSBtZWRpYV9hcGkgbmVlZGVkIGZvciB0ZXN0cywgYW5kIHBsYWNlIHRlc3QgdGFyZ2V0IGF0IHRoZSBsYXN0LgorICBsb2NhbCBURVNUX1BBQ0tBR0VfRElSPSgiZnJhbWV3b3Jrcy9hdi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdCIpCisgIGxvY2FsIFRFU1RfUEFDS0FHRT0oImFuZHJvaWQubWVkaWEuY3RzIikKKyAgbG9jYWwgQlVJTERfVEFSR0VUUz0oIk1lZGlhQ29tcG9uZW50cyIgIkN0c01lZGlhVGVzdENhc2VzIikKKyAgIyBEb24ndCBpbmNsdWRlIE1lZGlhQ29tcG9uZW50cyAtLSBpZiB3ZSBzaW1wbHkgaW5zdGFsbCBpdCwgc3lzdGVtIHNlcnZlcgorICAjIHdvdWxkbid0IHVzZSB0aGUgaW5zdGFsbGVkIG9uZS4KKyAgbG9jYWwgSU5TVEFMTF9UQVJHRVRTPSgiQ3RzTWVkaWFUZXN0Q2FzZXMiKQorICBsb2NhbCBURVNUX1JVTk5FUj0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgbG9jYWwgREVQRU5ERU5DSUVTPSgibW9ja2l0by10YXJnZXQtbWludXMtanVuaXQ0IiAiYW5kcm9pZC1zdXBwb3J0LXRlc3QiICJjb21wYXRpYmlsaXR5LWRldmljZS11dGlsIikKKyAgbG9jYWwgREVGQVVMVF9URVNUX1RBUkdFVD0iIgorICBERUZBVUxUX1RFU1RfVEFSR0VUKz0iYW5kcm9pZC5tZWRpYS5jdHMuTWVkaWFCcm93c2VyMlRlc3QiCisgIERFRkFVTFRfVEVTVF9UQVJHRVQrPSIsYW5kcm9pZC5tZWRpYS5jdHMuTWVkaWFDb250cm9sbGVyMlRlc3QiCisgIERFRkFVTFRfVEVTVF9UQVJHRVQrPSIsYW5kcm9pZC5tZWRpYS5jdHMuTWVkaWFNZXRhZGF0YTJUZXN0IgorICBERUZBVUxUX1RFU1RfVEFSR0VUKz0iLGFuZHJvaWQubWVkaWEuY3RzLk1lZGlhU2Vzc2lvbjJUZXN0IgorICBERUZBVUxUX1RFU1RfVEFSR0VUKz0iLGFuZHJvaWQubWVkaWEuY3RzLk1lZGlhU2Vzc2lvbjJfUGVybWlzc2lvblRlc3QiCisgIERFRkFVTFRfVEVTVF9UQVJHRVQrPSIsYW5kcm9pZC5tZWRpYS5jdHMuTWVkaWFTZXNzaW9uTWFuYWdlcl9NZWRpYVNlc3Npb24yVGVzdCIKKyAgREVGQVVMVF9URVNUX1RBUkdFVCs9IixhbmRyb2lkLm1lZGlhLmN0cy5TZXNzaW9uVG9rZW4yVGVzdCIKKyAgaWYgW1sgLXogIiR7QU5EUk9JRF9CVUlMRF9UT1B9IiBdXTsgdGhlbgorICAgIGVjaG8gIk5lZWRzIHRvIGx1bmNoIGEgdGFyZ2V0IGZpcnN0IgorICAgIHJldHVybgorICBmaQorCisgIGxvY2FsIG9sZF9wYXRoPSR7T0xEUFdEfQorICB3aGlsZSB0cnVlOyBkbworICAgIGxvY2FsIE9QVElPTl9TS0lQPSJmYWxzZSIKKyAgICBsb2NhbCBPUFRJT05fTUlOPSJmYWxzZSIKKyAgICBsb2NhbCBPUFRJT05fVEVTVD0iZmFsc2UiCisgICAgbG9jYWwgT1BUSU9OX1JFUEVBVF9DT1VOVD0iMSIKKyAgICBsb2NhbCBPUFRJT05fSUdOT1JFPSJmYWxzZSIKKyAgICBsb2NhbCBPUFRJT05fVEVTVF9UQVJHRVQ9IiR7REVGQVVMVF9URVNUX1RBUkdFVH0iCisgICAgbG9jYWwgYWRiaG9zdF9sb2NhbAorICAgIHdoaWxlICgoICIkIyIgKSk7IGRvCisgICAgICBjYXNlICIkezF9IiBpbgorICAgICAgICAtaHwtLWhlbHApCisgICAgICAgICAgX3J1bnRlc3RfY3RzX21lZGlhY29tcG9uZW50X3VzYWdlCisgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgOzsKKyAgICAgICAgLS1za2lwKQorICAgICAgICAgIE9QVElPTl9TS0lQPSJ0cnVlIgorICAgICAgICAgIDs7CisgICAgICAgIC0tbWluKQorICAgICAgICAgIE9QVElPTl9NSU49InRydWUiCisgICAgICAgICAgOzsKKyAgICAgICAgLS10ZXN0KQorICAgICAgICAgIE9QVElPTl9URVNUPSJ0cnVlIgorICAgICAgICAgIDs7CisgICAgICAgIC1zKQorICAgICAgICAgIHNoaWZ0CisgICAgICAgICAgYWRiaG9zdF9sb2NhbD0kezF9CisgICAgICAgICAgOzsKKyAgICAgICAgLXIpCisgICAgICAgICAgc2hpZnQKKyAgICAgICAgICBPUFRJT05fUkVQRUFUX0NPVU5UPSIkezF9IgorICAgICAgICAgIDs7CisgICAgICAgIC0taWdub3JlKQorICAgICAgICAgIE9QVElPTl9JR05PUkU9InRydWUiCisgICAgICAgICAgOzsKKyAgICAgICAgLXQpCisgICAgICAgICAgc2hpZnQKKyAgICAgICAgICBPUFRJT05fVEVTVF9UQVJHRVQ9IiR7MX0iCisgICAgICBlc2FjCisgICAgICBzaGlmdAorICAgIGRvbmUKKworICAgICMgQnVpbGQgYWRiIGNvbW1hbmQuCisgICAgbG9jYWwgYWRiCisgICAgaWYgW1sgLXogIiR7YWRiaG9zdF9sb2NhbH0iIF1dOyB0aGVuCisgICAgICBhZGJob3N0X2xvY2FsPSR7QURCSE9TVH0KKyAgICBmaQorICAgIGlmIFtbIC16ICIke2FkYmhvc3RfbG9jYWx9IiBdXTsgdGhlbgorICAgICAgbG9jYWwgZGV2aWNlX2NvdW50PSQoYWRiIGRldmljZXMgfCBzZWQgJy9eW1s6c3BhY2U6XV0qJC9kJyB8IHdjIC1sKQorICAgICAgaWYgW1sgIiR7ZGV2aWNlX2NvdW50fSIgIT0gIjIiIF1dOyB0aGVuCisgICAgICAgIGVjaG8gIlRvbyBtYW55IGRldmljZXMuIFNwZWNpZnkgYSBkZXZpY2UuIiAmJiBicmVhaworICAgICAgZmkKKyAgICAgIGFkYj0iYWRiIgorICAgIGVsc2UKKyAgICAgIGFkYj0iYWRiIC1zICR7YWRiaG9zdF9sb2NhbH0iCisgICAgZmkKKworICAgIGxvY2FsIHRhcmdldF9kaXI9IiR7QU5EUk9JRF9CVUlMRF9UT1B9LyR7VEVTVF9QQUNLQUdFX0RJUn0iCisgICAgI2xvY2FsIFRFU1RfUEFDS0FHRT0kKHNlZCAtbiAncy9eLipcYnBhY2thZ2VcYj0iXChbYS16MC05XC5dKlwpIi4qJC9cMS9wJyAke3RhcmdldF9kaXJ9L0FuZHJvaWRNYW5pZmVzdC54bWwpCisKKyAgICBpZiBbWyAiJHtPUFRJT05fU0tJUH0iICE9ICJ0cnVlIiBdXTsgdGhlbgorICAgICAgIyBCdWlsZCBkZXBlbmRlbmNpZXMgaWYgbmVlZGVkLgorICAgICAgbG9jYWwgZGVwZW5kZW5jeQorICAgICAgbG9jYWwgYnVpbGRfZGVwZW5kZW5jeT0iIgorICAgICAgZm9yIGRlcGVuZGVuY3kgaW4gJHtERVBFTkRFTkNJRVNbQF19OyBkbworICAgICAgICBpZiBbWyAiJHtkZXBlbmRlbmN5fSIgPT0gIm91dC8iKiBdXTsgdGhlbgorICAgICAgICAgIGlmIFtbICEgLWYgJHtBTkRST0lEX0JVSUxEX1RPUH0vJHtkZXBlbmRlbmN5fSBdXTsgdGhlbgorICAgICAgICAgICAgYnVpbGRfZGVwZW5kZW5jeT0idHJ1ZSIKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgZmkKKyAgICAgICAgZWxzZQorICAgICAgICAgIGlmIFtbICIkKGZpbmQgJHtPVVR9IC1uYW1lICR7ZGVwZW5kZW5jeX1faW50ZXJtZWRpYXRlcyB8IHdjIC1sKSIgPT0gIjAiIF1dOyB0aGVuCisgICAgICAgICAgICBidWlsZF9kZXBlbmRlbmN5PSJ0cnVlIgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICBmaQorICAgICAgICBmaQorICAgICAgZG9uZQorICAgICAgaWYgW1sgIiR7YnVpbGRfZGVwZW5kZW5jeX0iID09ICJ0cnVlIiBdXTsgdGhlbgorICAgICAgICBlY2hvICJCdWlsZGluZyBkZXBlbmRlbmNpZXMuIFdpbGwgb25seSBwcmludCBzdGRlcnIuIgorICAgICAgICBtICR7REVQRU5ERU5DSUVTW0BdfSAtaiA+IC9kZXYvbnVsbAorICAgICAgZmkKKworICAgICAgIyBCdWlsZCB0ZXN0IGFwayBhbmQgcmVxdWlyZWQgYXBrLgorICAgICAgbG9jYWwgYnVpbGRfdGFyZ2V0cworICAgICAgaWYgW1sgIiR7T1BUSU9OX1RFU1R9IiA9PSAidHJ1ZSIgXV07IHRoZW4KKyAgICAgICAgYnVpbGRfdGFyZ2V0cz0iJHtJTlNUQUxMX1RBUkdFVFNbQF19IgorICAgICAgZWxpZiBbWyAiJHtPUFRJT05fTUlOfSIgPT0gInRydWUiIF1dOyB0aGVuCisgICAgICAgIGJ1aWxkX3RhcmdldHM9IiR7QlVJTERfVEFSR0VUU1tAXX0iCisgICAgICBlbHNlCisgICAgICAgIGJ1aWxkX3RhcmdldHM9IiR7QlVJTERfVEFSR0VUU1tAXX0gZHJvaWQiCisgICAgICBmaQorICAgICAgbSAke2J1aWxkX3RhcmdldHN9IC1qIHx8IGJyZWFrCisKKyAgICAgIGlmIFtbICIke09QVElPTl9URVNUfSIgIT0gInRydWUiIF1dOyB0aGVuCisgICAgICAgICMgRmxhc2ggb25seSB3aGVuIG5lZWRlZAorICAgICAgICBsb2NhbCBkZXZpY2VfYnVpbGRfdHlwZT0iJCgke2FkYn0gc2hlbGwgZ2V0cHJvcCByby5idWlsZC50eXBlKSIKKyAgICAgICAgaWYgW1sgIiR7ZGV2aWNlX2J1aWxkX3R5cGV9IiA9PSAidXNlciIgXV07IHRoZW4KKyAgICAgICAgICAjIFVzZXIgYnVpbGQuIENhbm5vdCBhZGIgc3luYworICAgICAgICAgICR7YWRifSByZWJvb3QgYm9vdGxvYWRlcgorICAgICAgICAgIGZhc3Rib290IGZsYXNoYWxsCisgICAgICAgIGVsc2UKKyAgICAgICAgICAke2FkYn0gcm9vdAorICAgICAgICAgIGxvY2FsIGRldmljZV92ZXJpdHlfbW9kZT0iJCgke2FkYn0gc2hlbGwgZ2V0cHJvcCByby5ib290LnZlcml0eW1vZGUpIgorICAgICAgICAgIGlmIFtbICIke2RldmljZV92ZXJpdHlfbW9kZX0iICE9ICJkaXNhYmxlZCIgXV07IHRoZW4KKyAgICAgICAgICAgICR7YWRifSBkaXNhYmxlLXZlcml0eQorICAgICAgICAgICAgJHthZGJ9IHJlYm9vdAorICAgICAgICAgICAgJHthZGJ9IHdhaXQtZm9yLWRldmljZSB8fCBicmVhaworICAgICAgICAgICAgJHthZGJ9IHJvb3QKKyAgICAgICAgICBmaQorICAgICAgICAgICR7YWRifSByZW1vdW50CisgICAgICAgICAgJHthZGJ9IHNoZWxsIHN0b3AKKyAgICAgICAgICAke2FkYn0gc2hlbGwgc2V0cHJvcCBsb2cudGFnLk1lZGlhU2Vzc2lvblNlcnZpY2UgREVCVUcKKyAgICAgICAgICAke2FkYn0gc3luYworICAgICAgICAgICR7YWRifSBzaGVsbCBzdGFydAorICAgICAgICBmaQorICAgICAgICAke2FkYn0gd2FpdC1mb3ItZGV2aWNlIHx8IGJyZWFrCisgICAgICAgICMgRW5zdXJlIHBhY2thZ2UgbWFuYWdlciBpcyBsb2FkZWQuCisgICAgICAgICMgVE9ETyhqYWV3YW4pOiBGaW5kIGJldHRlciB3YXkgdG8gd2FpdAorICAgICAgICBzbGVlcCAxNQorICAgICAgZmkKKworICAgICAgIyBJbnN0YWxsIGFwa3MKKyAgICAgIGxvY2FsIGluc3RhbGxfZmFpbGVkPSJmYWxzZSIKKyAgICAgIGZvciB0YXJnZXQgaW4gJHtJTlNUQUxMX1RBUkdFVFNbQF19OyBkbworICAgICAgICBsb2NhbCBhcGtfcGF0aD0kKGZpbmQgJHtPVVR9L3N5c3RlbSAke09VVH0vZGF0YSAtbmFtZSAke3RhcmdldH0uYXBrKQorICAgICAgICBsb2NhbCBhcGtfbnVtPSQoZmluZCAke09VVH0vc3lzdGVtICR7T1VUfS9kYXRhIC1uYW1lICR7dGFyZ2V0fS5hcGsgfCB3YyAtbCkKKyAgICAgICAgaWYgW1sgIiR7YXBrX251bX0iICE9ICIxIiBdXTsgdGhlbgorICAgICAgICAgIGVjaG8gIkNhbm5vdCBsb2NhdGUgYSAke3RhcmdldH0uYXBrLiBGb3VuZCAke2Fwa19udW19IGFwa3MiICYmIGJyZWFrCisgICAgICAgIGZpCisgICAgICAgIGVjaG8gIkluc3RhbGxpbmcgJHt0YXJnZXR9LmFway4gcGF0aD0ke2Fwa19wYXRofSIKKyAgICAgICAgJHthZGJ9IGluc3RhbGwgLXIgJHthcGtfcGF0aH0KKyAgICAgICAgaWYgW1sgIiR7P30iICE9ICIwIiBdXTsgdGhlbgorICAgICAgICAgIGluc3RhbGxfZmFpbGVkPSJ0cnVlIgorICAgICAgICAgIGJyZWFrCisgICAgICAgIGZpCisgICAgICBkb25lCisgICAgICBpZiBbWyAiJHtpbnN0YWxsX2ZhaWxlZH0iID09ICJ0cnVlIiBdXTsgdGhlbgorICAgICAgICBlY2hvICJGYWlsZWQgdG8gaW5zdGFsbC4gVGVzdCB3b3VsZG4ndCBydW4uIgorICAgICAgICBicmVhaworICAgICAgZmkKKyAgICBmaQorCisgICAgbG9jYWwgdGVzdF90YXJnZXQ9IiIKKyAgICBpZiBbWyAtbiAiJHtPUFRJT05fVEVTVF9UQVJHRVR9IiBdXTsgdGhlbgorICAgICAgdGVzdF90YXJnZXQ9Ii1lIGNsYXNzICR7T1BUSU9OX1RFU1RfVEFSR0VUfSIKKyAgICBmaQorCisgICAgbG9jYWwgaQorICAgIGxvY2FsIHRtcGZpbGU9JCh0ZW1wZmlsZSkKKyAgICBmb3IgKChpPTE7IGkgPD0gJHtPUFRJT05fUkVQRUFUX0NPVU5UfTsgaSsrKSk7IGRvCisgICAgICBlY2hvICJSdW4gdGVzdCAke2l9LyR7T1BUSU9OX1JFUEVBVF9DT1VOVH0iCisgICAgICAke2FkYn0gc2hlbGwgYW0gaW5zdHJ1bWVudCAke3Rlc3RfdGFyZ2V0fSAtdyAke1RFU1RfUEFDS0FHRX0vJHtURVNUX1JVTk5FUn0gPiYgJHt0bXBmaWxlfQorICAgICAgY2F0ICR7dG1wZmlsZX0KKyAgICAgIGlmIFtbICIke09QVElPTl9JR05PUkV9IiAhPSAidHJ1ZSIgXV07IHRoZW4KKyAgICAgICAgaWYgW1sgLW4gIiQoZ3JlcCAke3RtcGZpbGV9IC1lICdGQUlMVVJFXHxjcmFzaGVkJykiIF1dOyB0aGVuCisgICAgICAgICAgIyBhbSBpbnN0cnVtZW50IGRvZXNuJ3QgcmV0dXJuIGVycm9yIGNvZGUgc28gbmVlZCB0byBncmVwIHJlc3VsdCBtZXNzYWdlIGluc3RlYWQKKyAgICAgICAgICBicmVhaworICAgICAgICBmaQorICAgICAgZmkKKyAgICBkb25lCisgICAgcm0gJHt0bXBmaWxlfQorICAgIGJyZWFrCisgIGRvbmUKK30KKworZWNobyAiRm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgYWRkZWQgdG8geW91ciBlbnZpcm9ubWVudDoiCitfcnVudGVzdF9jdHNfbWVkaWFjb21wb25lbnRfdXNhZ2UKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvSU1lZGlhQ29udHJvbGxlcjIuYWlkbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvSU1lZGlhQ29udHJvbGxlcjIuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDg4YjcwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9JTWVkaWFDb250cm9sbGVyMi5haWRsCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5JTWVkaWFTZXNzaW9uMjsKKworLyoqCisgKiBJbnRlcmZhY2UgZnJvbSBNZWRpYVNlc3Npb24yIHRvIE1lZGlhQ29udHJvbGxlcjIuCisgKiA8cD4KKyAqIEtlZXAgdGhpcyBpbnRlcmZhY2Ugb25ld2F5LiBPdGhlcndpc2UgYSBtYWxpY2lvdXMgYXBwIG1heSBpbXBsZW1lbnQgZmFrZSB2ZXJzaW9uIG9mIHRoaXMsCisgKiBhbmQgaG9sZHMgY2FsbHMgZnJvbSBzZXNzaW9uIHRvIG1ha2Ugc2Vzc2lvbiBvd25lcihzKSBmcm96ZW4uCisgKi8KKy8vIFRPRE8oamFld2FuKTogKFBvc3QgUCkgSGFuZGxlIHdoZW4gdGhlIHBsYXlsaXN0IGJlY29tZXMgdG9vIGh1Z2UuCisvLyAgICAgICAgICAgICAgIE5vdGUgdGhhdCBQYXJjZWxsZWRTbGljZUxpc3QgaXNuJ3QgYSBnb29kIGlkZWEgZm9yIHRoZSBwdXJwb3NlLiAoc2VlOiBiLzM3NDkzNjc3KQorb25ld2F5IGludGVyZmFjZSBJTWVkaWFDb250cm9sbGVyMiB7CisgICAgdm9pZCBvblBsYXllclN0YXRlQ2hhbmdlZChpbnQgc3RhdGUpOworICAgIHZvaWQgb25Qb3NpdGlvbkNoYW5nZWQobG9uZyBldmVudFRpbWVNcywgbG9uZyBwb3NpdGlvbk1zKTsKKyAgICB2b2lkIG9uUGxheWJhY2tTcGVlZENoYW5nZWQoZmxvYXQgc3BlZWQpOworICAgIHZvaWQgb25CdWZmZXJlZFBvc2l0aW9uQ2hhbmdlZChsb25nIGJ1ZmZlcmVkUG9zaXRpb25Ncyk7CisgICAgdm9pZCBvblBsYXlsaXN0Q2hhbmdlZChpbiBMaXN0PEJ1bmRsZT4gcGxheWxpc3QsIGluIEJ1bmRsZSBtZXRhZGF0YSk7CisgICAgdm9pZCBvblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkKGluIEJ1bmRsZSBtZXRhZGF0YSk7CisgICAgdm9pZCBvblBsYXliYWNrSW5mb0NoYW5nZWQoaW4gQnVuZGxlIHBsYXliYWNrSW5mbyk7CisgICAgdm9pZCBvblJlcGVhdE1vZGVDaGFuZ2VkKGludCByZXBlYXRNb2RlKTsKKyAgICB2b2lkIG9uU2h1ZmZsZU1vZGVDaGFuZ2VkKGludCBzaHVmZmxlTW9kZSk7CisgICAgdm9pZCBvbkVycm9yKGludCBlcnJvckNvZGUsIGluIEJ1bmRsZSBleHRyYXMpOworCisgICAgdm9pZCBvbkNvbm5lY3RlZChJTWVkaWFTZXNzaW9uMiBzZXNzaW9uQmluZGVyLCBpbiBCdW5kbGUgY29tbWFuZEdyb3VwLAorICAgICAgICAgICAgaW50IHBsYXllclN0YXRlLCBsb25nIHBvc2l0aW9uRXZlbnRUaW1lTXMsIGxvbmcgcG9zaXRpb25NcywgZmxvYXQgcGxheWJhY2tTcGVlZCwKKyAgICAgICAgICAgIGxvbmcgYnVmZmVyZWRQb3NpdGlvbk1zLCBpbiBCdW5kbGUgcGxheWJhY2tJbmZvLCBpbnQgcmVwZWF0TW9kZSwgaW50IHNodWZmbGVNb2RlLAorICAgICAgICAgICAgaW4gTGlzdDxCdW5kbGU+IHBsYXlsaXN0LCBpbiBQZW5kaW5nSW50ZW50IHNlc3Npb25BY3Rpdml0eSk7CisgICAgdm9pZCBvbkRpc2Nvbm5lY3RlZCgpOworCisgICAgdm9pZCBvbkN1c3RvbUxheW91dENoYW5nZWQoaW4gTGlzdDxCdW5kbGU+IGNvbW1hbmRCdXR0b25saXN0KTsKKyAgICB2b2lkIG9uQWxsb3dlZENvbW1hbmRzQ2hhbmdlZChpbiBCdW5kbGUgY29tbWFuZHMpOworCisgICAgdm9pZCBvbkN1c3RvbUNvbW1hbmQoaW4gQnVuZGxlIGNvbW1hbmQsIGluIEJ1bmRsZSBhcmdzLCBpbiBSZXN1bHRSZWNlaXZlciByZWNlaXZlcik7CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gQnJvd3NlciBzZXBjaWZpYworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICB2b2lkIG9uR2V0TGlicmFyeVJvb3REb25lKGluIEJ1bmRsZSByb290SGludHMsIFN0cmluZyByb290TWVkaWFJZCwgaW4gQnVuZGxlIHJvb3RFeHRyYSk7CisgICAgdm9pZCBvbkdldEl0ZW1Eb25lKFN0cmluZyBtZWRpYUlkLCBpbiBCdW5kbGUgcmVzdWx0KTsKKyAgICB2b2lkIG9uQ2hpbGRyZW5DaGFuZ2VkKFN0cmluZyByb290TWVkaWFJZCwgaW50IGl0ZW1Db3VudCwgaW4gQnVuZGxlIGV4dHJhcyk7CisgICAgdm9pZCBvbkdldENoaWxkcmVuRG9uZShTdHJpbmcgcGFyZW50SWQsIGludCBwYWdlLCBpbnQgcGFnZVNpemUsIGluIExpc3Q8QnVuZGxlPiByZXN1bHQsCisgICAgICAgICAgICBpbiBCdW5kbGUgZXh0cmFzKTsKKyAgICB2b2lkIG9uU2VhcmNoUmVzdWx0Q2hhbmdlZChTdHJpbmcgcXVlcnksIGludCBpdGVtQ291bnQsIGluIEJ1bmRsZSBleHRyYXMpOworICAgIHZvaWQgb25HZXRTZWFyY2hSZXN1bHREb25lKFN0cmluZyBxdWVyeSwgaW50IHBhZ2UsIGludCBwYWdlU2l6ZSwgaW4gTGlzdDxCdW5kbGU+IHJlc3VsdCwKKyAgICAgICAgICAgIGluIEJ1bmRsZSBleHRyYXMpOworfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9JTWVkaWFTZXNzaW9uMi5haWRsIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9JTWVkaWFTZXNzaW9uMi5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NDQ2N2QKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL0lNZWRpYVNlc3Npb24yLmFpZGwKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworCitpbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuSU1lZGlhQ29udHJvbGxlcjI7CisKKy8qKgorICogSW50ZXJmYWNlIGZyb20gTWVkaWFDb250cm9sbGVyMiB0byBNZWRpYVNlc3Npb24yLgorICogPHA+CisgKiBLZWVwIHRoaXMgaW50ZXJmYWNlIG9uZXdheS4gT3RoZXJ3aXNlIGEgbWFsaWNpb3VzIGFwcCBtYXkgaW1wbGVtZW50IGZha2UgdmVyc2lvbiBvZiB0aGlzLAorICogYW5kIGhvbGRzIGNhbGxzIGZyb20gc2Vzc2lvbiB0byBtYWtlIHNlc3Npb24gb3duZXIocykgZnJvemVuLgorICovCisgLy8gVE9ETyhqYWV3YW4pOiAoUG9zdCBQKSBIYW5kbGUgd2hlbiB0aGUgcGxheWxpc3QgYmVjb21lcyB0b28gaHVnZS4KKyAvLyAgICAgICAgICAgICAgIE5vdGUgdGhhdCBQYXJjZWxsZWRTbGljZUxpc3QgaXNuJ3QgYSBnb29kIGlkZWEgZm9yIHRoZSBwdXJwb3NlLiAoc2VlOiBiLzM3NDkzNjc3KQorb25ld2F5IGludGVyZmFjZSBJTWVkaWFTZXNzaW9uMiB7CisgICAgLy8gVE9ETyhqYWV3YW4pOiBhZGQgb25Db21tYW5kKCkgdG8gc2VuZCBwcml2YXRlIGNvbW1hbmQKKworICAgIC8vIFRPRE8oamFld2FuKTogKFBvc3QgUCkgV2UgbWF5IGNvbnNpZGVyIHRvIGFkZCBhbm90aGVyIGJpbmRlciBqdXN0IGZvciB0aGUgY29ubmVjdGlvbgorICAgIC8vICAgICAgICAgICAgICAgbm90IHRvIGV4cG9zZSBvdGhlciBtZXRob2RzIHRvIHRoZSBjb250cm9sbGVyIHdob3NlIGNvbm5lY3Rpb24gd2Fzbid0IGFjY2VwdGVkLgorICAgIC8vICAgICAgICAgICAgICAgQnV0IHRoaXMgd291bGQgYmUgZW5vdWdoIGZvciBub3cgYmVjYXVzZSBpdCdzIHRoZSBzYW1lIGFzIGV4aXN0aW5nCisgICAgLy8gICAgICAgICAgICAgICBNZWRpYUJyb3dzZXIgYW5kIE1lZGlhQnJvd3NlclNlcnZpY2UuCisgICAgdm9pZCBjb25uZWN0KElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIGNhbGxpbmdQYWNrYWdlKTsKKyAgICB2b2lkIHJlbGVhc2UoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyKTsKKworICAgIHZvaWQgc2V0Vm9sdW1lVG8oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgdmFsdWUsIGludCBmbGFncyk7CisgICAgdm9pZCBhZGp1c3RWb2x1bWUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgZGlyZWN0aW9uLCBpbnQgZmxhZ3MpOworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIHNlbmQgY29tbWFuZAorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICB2b2lkIHNlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsCisgICAgICAgICAgICBpbnQgY29tbWFuZENvZGUsIGluIEJ1bmRsZSBhcmdzKTsKKyAgICB2b2lkIHNlbmRDdXN0b21Db21tYW5kKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW4gQnVuZGxlIGNvbW1hbmQsIGluIEJ1bmRsZSBhcmdzLAorICAgICAgICAgICAgaW4gUmVzdWx0UmVjZWl2ZXIgcmVjZWl2ZXIpOworCisgICAgdm9pZCBwcmVwYXJlRnJvbVVyaShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGluIFVyaSB1cmksIGluIEJ1bmRsZSBleHRyYXMpOworICAgIHZvaWQgcHJlcGFyZUZyb21TZWFyY2goSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgcXVlcnksIGluIEJ1bmRsZSBleHRyYXMpOworICAgIHZvaWQgcHJlcGFyZUZyb21NZWRpYUlkKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIG1lZGlhSWQsIGluIEJ1bmRsZSBleHRyYXMpOworICAgIHZvaWQgcGxheUZyb21VcmkoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbiBVcmkgdXJpLCBpbiBCdW5kbGUgZXh0cmFzKTsKKyAgICB2b2lkIHBsYXlGcm9tU2VhcmNoKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIHF1ZXJ5LCBpbiBCdW5kbGUgZXh0cmFzKTsKKyAgICB2b2lkIHBsYXlGcm9tTWVkaWFJZChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBtZWRpYUlkLCBpbiBCdW5kbGUgZXh0cmFzKTsKKyAgICB2b2lkIHNldFJhdGluZyhJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBtZWRpYUlkLCBpbiBCdW5kbGUgcmF0aW5nKTsKKworICAgIHZvaWQgc2V0UGxheWxpc3QoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbiBMaXN0PEJ1bmRsZT4gcGxheWxpc3QsIGluIEJ1bmRsZSBtZXRhZGF0YSk7CisgICAgdm9pZCB1cGRhdGVQbGF5bGlzdE1ldGFkYXRhKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW4gQnVuZGxlIG1ldGFkYXRhKTsKKyAgICB2b2lkIGFkZFBsYXlsaXN0SXRlbShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGludCBpbmRleCwgaW4gQnVuZGxlIG1lZGlhSXRlbSk7CisgICAgdm9pZCByZW1vdmVQbGF5bGlzdEl0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbiBCdW5kbGUgbWVkaWFJdGVtKTsKKyAgICB2b2lkIHJlcGxhY2VQbGF5bGlzdEl0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgaW5kZXgsIGluIEJ1bmRsZSBtZWRpYUl0ZW0pOworICAgIHZvaWQgc2tpcFRvUGxheWxpc3RJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW4gQnVuZGxlIG1lZGlhSXRlbSk7CisgICAgdm9pZCBza2lwVG9QcmV2aW91c0l0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyKTsKKyAgICB2b2lkIHNraXBUb05leHRJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlcik7CisgICAgdm9pZCBzZXRSZXBlYXRNb2RlKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IHJlcGVhdE1vZGUpOworICAgIHZvaWQgc2V0U2h1ZmZsZU1vZGUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgc2h1ZmZsZU1vZGUpOworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIGxpYnJhcnkgc2VydmljZSBzcGVjaWZpYworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICB2b2lkIGdldExpYnJhcnlSb290KElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW4gQnVuZGxlIHJvb3RIaW50cyk7CisgICAgdm9pZCBnZXRJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIG1lZGlhSWQpOworICAgIHZvaWQgZ2V0Q2hpbGRyZW4oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgcGFyZW50SWQsIGludCBwYWdlLCBpbnQgcGFnZVNpemUsCisgICAgICAgICAgICBpbiBCdW5kbGUgZXh0cmFzKTsKKyAgICB2b2lkIHNlYXJjaChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBxdWVyeSwgaW4gQnVuZGxlIGV4dHJhcyk7CisgICAgdm9pZCBnZXRTZWFyY2hSZXN1bHQoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgcXVlcnksIGludCBwYWdlLCBpbnQgcGFnZVNpemUsCisgICAgICAgICAgICBpbiBCdW5kbGUgZXh0cmFzKTsKKyAgICB2b2lkIHN1YnNjcmliZShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBwYXJlbnRJZCwgaW4gQnVuZGxlIGV4dHJhcyk7CisgICAgdm9pZCB1bnN1YnNjcmliZShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBwYXJlbnRJZCk7Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhQnJvd3NlcjJJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhQnJvd3NlcjJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkwOTA5OQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFCcm93c2VyMkltcGwuamF2YQpAQCAtMCwwICsxLDIzNyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFCcm93c2VyMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQnJvd3NlcjIuQnJvd3NlckNhbGxiYWNrOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yOworaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhQnJvd3NlcjJQcm92aWRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKKworcHVibGljIGNsYXNzIE1lZGlhQnJvd3NlcjJJbXBsIGV4dGVuZHMgTWVkaWFDb250cm9sbGVyMkltcGwgaW1wbGVtZW50cyBNZWRpYUJyb3dzZXIyUHJvdmlkZXIgeworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYUJyb3dzZXIyIjsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gREVCVUcgPSB0cnVlOyAvLyBUT0RPKGphZXdhbik6IGNoYW5nZS4KKworICAgIHByaXZhdGUgZmluYWwgTWVkaWFCcm93c2VyMiBtSW5zdGFuY2U7CisgICAgcHJpdmF0ZSBmaW5hbCBNZWRpYUJyb3dzZXIyLkJyb3dzZXJDYWxsYmFjayBtQ2FsbGJhY2s7CisKKyAgICBwdWJsaWMgTWVkaWFCcm93c2VyMkltcGwoQ29udGV4dCBjb250ZXh0LCBNZWRpYUJyb3dzZXIyIGluc3RhbmNlLCBTZXNzaW9uVG9rZW4yIHRva2VuLAorICAgICAgICAgICAgRXhlY3V0b3IgZXhlY3V0b3IsIEJyb3dzZXJDYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBpbnN0YW5jZSwgdG9rZW4sIGV4ZWN1dG9yLCBjYWxsYmFjayk7CisgICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOworICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUgTWVkaWFCcm93c2VyMiBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIChNZWRpYUJyb3dzZXIyKSBzdXBlci5nZXRJbnN0YW5jZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGdldExpYnJhcnlSb290X2ltcGwoQnVuZGxlIHJvb3RIaW50cykgeworICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVyKCk7CisgICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBiaW5kZXIuZ2V0TGlicmFyeVJvb3QoZ2V0Q29udHJvbGxlclN0dWIoKSwgcm9vdEhpbnRzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUgZGlzY29ubmVjdC4KKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHN1YnNjcmliZV9pbXBsKFN0cmluZyBwYXJlbnRJZCwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICBpZiAocGFyZW50SWQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGFyZW50SWQgc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXIoKTsKKyAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGJpbmRlci5zdWJzY3JpYmUoZ2V0Q29udHJvbGxlclN0dWIoKSwgcGFyZW50SWQsIGV4dHJhcyk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlIGRpc2Nvbm5lY3QuCisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB1bnN1YnNjcmliZV9pbXBsKFN0cmluZyBwYXJlbnRJZCkgeworICAgICAgICBpZiAocGFyZW50SWQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGFyZW50SWQgc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXIoKTsKKyAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGJpbmRlci51bnN1YnNjcmliZShnZXRDb250cm9sbGVyU3R1YigpLCBwYXJlbnRJZCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlIGRpc2Nvbm5lY3QuCisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBnZXRJdGVtX2ltcGwoU3RyaW5nIG1lZGlhSWQpIHsKKyAgICAgICAgaWYgKG1lZGlhSWQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWVkaWFJZCBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcigpOworICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYmluZGVyLmdldEl0ZW0oZ2V0Q29udHJvbGxlclN0dWIoKSwgbWVkaWFJZCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlIGRpc2Nvbm5lY3QuCisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBnZXRDaGlsZHJlbl9pbXBsKFN0cmluZyBwYXJlbnRJZCwgaW50IHBhZ2UsIGludCBwYWdlU2l6ZSwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICBpZiAocGFyZW50SWQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGFyZW50SWQgc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocGFnZSA8IDEgfHwgcGFnZVNpemUgPCAxKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOZWl0aGVyIHBhZ2Ugbm9yIHBhZ2VTaXplIHNob3VsZCBiZSBsZXNzIHRoYW4gMSIpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcigpOworICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYmluZGVyLmdldENoaWxkcmVuKGdldENvbnRyb2xsZXJTdHViKCksIHBhcmVudElkLCBwYWdlLCBwYWdlU2l6ZSwgZXh0cmFzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUgZGlzY29ubmVjdC4KKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNlYXJjaF9pbXBsKFN0cmluZyBxdWVyeSwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocXVlcnkpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJxdWVyeSBzaG91bGRuJ3QgYmUgZW1wdHkiKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVyKCk7CisgICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBiaW5kZXIuc2VhcmNoKGdldENvbnRyb2xsZXJTdHViKCksIHF1ZXJ5LCBleHRyYXMpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZSBkaXNjb25uZWN0LgorICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZ2V0U2VhcmNoUmVzdWx0X2ltcGwoU3RyaW5nIHF1ZXJ5LCBpbnQgcGFnZSwgaW50IHBhZ2VTaXplLCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInF1ZXJ5IHNob3VsZG4ndCBiZSBlbXB0eSIpOworICAgICAgICB9CisgICAgICAgIGlmIChwYWdlIDwgMSB8fCBwYWdlU2l6ZSA8IDEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5laXRoZXIgcGFnZSBub3IgcGFnZVNpemUgc2hvdWxkIGJlIGxlc3MgdGhhbiAxIik7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcigpOworICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYmluZGVyLmdldFNlYXJjaFJlc3VsdChnZXRDb250cm9sbGVyU3R1YigpLCBxdWVyeSwgcGFnZSwgcGFnZVNpemUsIGV4dHJhcyk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlIGRpc2Nvbm5lY3QuCisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkdldExpYnJhcnlSb290RG9uZSgKKyAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSByb290SGludHMsIGZpbmFsIFN0cmluZyByb290TWVkaWFJZCwgZmluYWwgQnVuZGxlIHJvb3RFeHRyYSkgeworICAgICAgICBnZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7CisgICAgICAgICAgICBtQ2FsbGJhY2sub25HZXRMaWJyYXJ5Um9vdERvbmUoZ2V0SW5zdGFuY2UoKSwgcm9vdEhpbnRzLCByb290TWVkaWFJZCwgcm9vdEV4dHJhKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25HZXRJdGVtRG9uZShTdHJpbmcgbWVkaWFJZCwgTWVkaWFJdGVtMiBpdGVtKSB7CisgICAgICAgIGdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKKyAgICAgICAgICAgIG1DYWxsYmFjay5vbkdldEl0ZW1Eb25lKGdldEluc3RhbmNlKCksIG1lZGlhSWQsIGl0ZW0pOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkdldENoaWxkcmVuRG9uZShTdHJpbmcgcGFyZW50SWQsIGludCBwYWdlLCBpbnQgcGFnZVNpemUsIExpc3Q8TWVkaWFJdGVtMj4gcmVzdWx0LAorICAgICAgICAgICAgQnVuZGxlIGV4dHJhcykgeworICAgICAgICBnZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7CisgICAgICAgICAgICBtQ2FsbGJhY2sub25HZXRDaGlsZHJlbkRvbmUoZ2V0SW5zdGFuY2UoKSwgcGFyZW50SWQsIHBhZ2UsIHBhZ2VTaXplLCByZXN1bHQsIGV4dHJhcyk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uU2VhcmNoUmVzdWx0Q2hhbmdlZChTdHJpbmcgcXVlcnksIGludCBpdGVtQ291bnQsIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4geworICAgICAgICAgICAgbUNhbGxiYWNrLm9uU2VhcmNoUmVzdWx0Q2hhbmdlZChnZXRJbnN0YW5jZSgpLCBxdWVyeSwgaXRlbUNvdW50LCBleHRyYXMpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkdldFNlYXJjaFJlc3VsdERvbmUoU3RyaW5nIHF1ZXJ5LCBpbnQgcGFnZSwgaW50IHBhZ2VTaXplLCBMaXN0PE1lZGlhSXRlbTI+IHJlc3VsdCwKKyAgICAgICAgICAgIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4geworICAgICAgICAgICAgbUNhbGxiYWNrLm9uR2V0U2VhcmNoUmVzdWx0RG9uZShnZXRJbnN0YW5jZSgpLCBxdWVyeSwgcGFnZSwgcGFnZVNpemUsIHJlc3VsdCwgZXh0cmFzKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25DaGlsZHJlbkNoYW5nZWQoZmluYWwgU3RyaW5nIHBhcmVudElkLCBpbnQgaXRlbUNvdW50LCBmaW5hbCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIGdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKKyAgICAgICAgICAgIG1DYWxsYmFjay5vbkNoaWxkcmVuQ2hhbmdlZChnZXRJbnN0YW5jZSgpLCBwYXJlbnRJZCwgaXRlbUNvdW50LCBleHRyYXMpOworICAgICAgICB9KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhQ29udHJvbGxlcjJJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhQ29udHJvbGxlcjJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ5MzY1YQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFDb250cm9sbGVyMkltcGwuamF2YQpAQCAtMCwwICsxLDExNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFVF9WT0xVTUU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9BRERfSVRFTTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1JFTU9WRV9JVEVNOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfUkVQTEFDRV9JVEVNOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfU0VUX0xJU1Q7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfTElTVF9NRVRBREFUQTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9SRVBFQVRfTU9ERTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9TSFVGRkxFX01PREU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1BMQVlfRlJPTV9NRURJQV9JRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUExBWV9GUk9NX1NFQVJDSDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUExBWV9GUk9NX1VSSTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUFJFUEFSRV9GUk9NX01FRElBX0lEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QUkVQQVJFX0ZST01fU0VBUkNIOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QUkVQQVJFX0ZST01fVVJJOworCitpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5TZXJ2aWNlQ29ubmVjdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlczsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvbnRyb2xsZXIyLkNvbnRyb2xsZXJDYWxsYmFjazsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjIuUGxheWJhY2tJbmZvOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50LlJlcGVhdE1vZGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXlsaXN0QWdlbnQuU2h1ZmZsZU1vZGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLkNvbW1hbmRCdXR0b247CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZEdyb3VwMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvblNlcnZpY2UyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuUmF0aW5nMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFDb250cm9sbGVyMlByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Vc2VySGFuZGxlOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLkd1YXJkZWRCeTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOworCitwdWJsaWMgY2xhc3MgTWVkaWFDb250cm9sbGVyMkltcGwgaW1wbGVtZW50cyBNZWRpYUNvbnRyb2xsZXIyUHJvdmlkZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFDb250cm9sbGVyMiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7IC8vIFRPRE8oamFld2FuKTogQ2hhbmdlCisKKyAgICBwcml2YXRlIGZpbmFsIE1lZGlhQ29udHJvbGxlcjIgbUluc3RhbmNlOworICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtTG9jayA9IG5ldyBPYmplY3QoKTsKKworICAgIHByaXZhdGUgZmluYWwgTWVkaWFDb250cm9sbGVyMlN0dWIgbUNvbnRyb2xsZXJTdHViOworICAgIHByaXZhdGUgZmluYWwgU2Vzc2lvblRva2VuMiBtVG9rZW47CisgICAgcHJpdmF0ZSBmaW5hbCBDb250cm9sbGVyQ2FsbGJhY2sgbUNhbGxiYWNrOworICAgIHByaXZhdGUgZmluYWwgRXhlY3V0b3IgbUNhbGxiYWNrRXhlY3V0b3I7CisgICAgcHJpdmF0ZSBmaW5hbCBJQmluZGVyLkRlYXRoUmVjaXBpZW50IG1EZWF0aFJlY2lwaWVudDsKKworICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKKyAgICBwcml2YXRlIFNlc3Npb25TZXJ2aWNlQ29ubmVjdGlvbiBtU2VydmljZUNvbm5lY3Rpb247CisgICAgQEd1YXJkZWRCeSgibUxvY2siKQorICAgIHByaXZhdGUgYm9vbGVhbiBtSXNSZWxlYXNlZDsKKyAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCisgICAgcHJpdmF0ZSBMaXN0PE1lZGlhSXRlbTI+IG1QbGF5bGlzdDsKKyAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCisgICAgcHJpdmF0ZSBNZWRpYU1ldGFkYXRhMiBtUGxheWxpc3RNZXRhZGF0YTsKKyAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCisgICAgcHJpdmF0ZSBAUmVwZWF0TW9kZSBpbnQgbVJlcGVhdE1vZGU7CisgICAgQEd1YXJkZWRCeSgibUxvY2siKQorICAgIHByaXZhdGUgQFNodWZmbGVNb2RlIGludCBtU2h1ZmZsZU1vZGU7CisgICAgQEd1YXJkZWRCeSgibUxvY2siKQorICAgIHByaXZhdGUgaW50IG1QbGF5ZXJTdGF0ZTsKKyAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCisgICAgcHJpdmF0ZSBsb25nIG1Qb3NpdGlvbkV2ZW50VGltZU1zOworICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKKyAgICBwcml2YXRlIGxvbmcgbVBvc2l0aW9uTXM7CisgICAgQEd1YXJkZWRCeSgibUxvY2siKQorICAgIHByaXZhdGUgZmxvYXQgbVBsYXliYWNrU3BlZWQ7CisgICAgQEd1YXJkZWRCeSgibUxvY2siKQorICAgIHByaXZhdGUgbG9uZyBtQnVmZmVyZWRQb3NpdGlvbk1zOworICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKKyAgICBwcml2YXRlIFBsYXliYWNrSW5mbyBtUGxheWJhY2tJbmZvOworICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKKyAgICBwcml2YXRlIFBlbmRpbmdJbnRlbnQgbVNlc3Npb25BY3Rpdml0eTsKKyAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCisgICAgcHJpdmF0ZSBTZXNzaW9uQ29tbWFuZEdyb3VwMiBtQWxsb3dlZENvbW1hbmRzOworCisgICAgLy8gQXNzaWdubWVudCBzaG91bGQgYmUgdXNlZCB3aXRoIHRoZSBsb2NrIGhvbGQsIGJ1dCBzaG91bGQgYmUgdXNlZCB3aXRob3V0IGEgbG9jayB0byBwcmV2ZW50CisgICAgLy8gcG90ZW50aWFsIGRlYWRsb2NrLgorICAgIC8vIFBvc3RmaXggLUJpbmRlciBpcyBhZGRlZCB0byBleHBsaWNpdGx5IHNob3cgdGhhdCBpdCdzIHBvdGVudGlhbGx5IHJlbW90ZSBwcm9jZXNzIGNhbGwuCisgICAgLy8gVGVjaG5pY2FsbHkgLUludGVyZmFjZSBpcyBtb3JlIGNvcnJlY3QsIGJ1dCBpdCBtYXkgbWlzcmVhZCB0aGF0IGl0J3MgaW50ZXJmYWNlICh2cyBjbGFzcykKKyAgICAvLyBzbyBsZXQncyBrZWVwIHRoaXMgcG9zdGZpeCB1bnRpbCB3ZSBmaW5kIGJldHRlciBwb3N0Zml4LgorICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKKyAgICBwcml2YXRlIHZvbGF0aWxlIElNZWRpYVNlc3Npb24yIG1TZXNzaW9uQmluZGVyOworCisgICAgLy8gVE9ETyhqYWV3YW4pOiBSZXF1aXJlIHNlc3Npb24gYWN0aXZlbmVzcyBjaGFuZ2VkIGxpc3RlbmVyLCBiZWNhdXNlIGNvbnRyb2xsZXIgY2FuIGJlCisgICAgLy8gICAgICAgICAgICAgICBhdmFpbGFibGUgd2hlbiB0aGUgc2Vzc2lvbidzIHBsYXllciBpcyBudWxsLgorICAgIHB1YmxpYyBNZWRpYUNvbnRyb2xsZXIySW1wbChDb250ZXh0IGNvbnRleHQsIE1lZGlhQ29udHJvbGxlcjIgaW5zdGFuY2UsIFNlc3Npb25Ub2tlbjIgdG9rZW4sCisgICAgICAgICAgICBFeGVjdXRvciBleGVjdXRvciwgQ29udHJvbGxlckNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOworICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250ZXh0IHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRva2VuID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInRva2VuIHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNhbGxiYWNrID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbGxiYWNrIHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGV4ZWN1dG9yID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImV4ZWN1dG9yIHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICBtQ29udHJvbGxlclN0dWIgPSBuZXcgTWVkaWFDb250cm9sbGVyMlN0dWIodGhpcyk7CisgICAgICAgIG1Ub2tlbiA9IHRva2VuOworICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IgPSBleGVjdXRvcjsKKyAgICAgICAgbURlYXRoUmVjaXBpZW50ID0gKCkgLT4geworICAgICAgICAgICAgbUluc3RhbmNlLmNsb3NlKCk7CisgICAgICAgIH07CisKKyAgICAgICAgbVNlc3Npb25CaW5kZXIgPSBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7CisgICAgICAgIC8vIFRPRE8oamFld2FuKTogTW9yZSBzYW5pdHkgY2hlY2tzLgorICAgICAgICBpZiAobVRva2VuLmdldFR5cGUoKSA9PSBTZXNzaW9uVG9rZW4yLlRZUEVfU0VTU0lPTikgeworICAgICAgICAgICAgLy8gU2Vzc2lvbgorICAgICAgICAgICAgbVNlcnZpY2VDb25uZWN0aW9uID0gbnVsbDsKKyAgICAgICAgICAgIGNvbm5lY3RUb1Nlc3Npb24oU2Vzc2lvblRva2VuMkltcGwuZnJvbShtVG9rZW4pLmdldFNlc3Npb25CaW5kZXIoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBTZXNzaW9uIHNlcnZpY2UKKyAgICAgICAgICAgIGlmIChQcm9jZXNzLm15VWlkKCkgPT0gUHJvY2Vzcy5TWVNURU1fVUlEKSB7CisgICAgICAgICAgICAgICAgLy8gSXQncyBzeXN0ZW0gc2VydmVyIChNZWRpYVNlc3Npb25TZXJ2aWNlKSB0aGF0IHdhbnRzIHRvIG1vbml0b3Igc2Vzc2lvbi4KKyAgICAgICAgICAgICAgICAvLyBEb24ndCBiaW5kIGlmIGFibGUuLgorICAgICAgICAgICAgICAgIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IFNlc3Npb25Ub2tlbjJJbXBsLmZyb20obVRva2VuKS5nZXRTZXNzaW9uQmluZGVyKCk7CisgICAgICAgICAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBiaW5kZXIgaW4gdGhlIHNlc3Npb24gdG9rZW4gaW5zdGVhZCBvZiBiaW5kIGJ5IGl0cyBvd24uCisgICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSBzZXJ2ZXIgd2lsbCBob2xkcyB0aGUgYmluZGluZyB0byB0aGUgc2VydmljZSAqZm9yZXZlciogYW5kIHNlcnZpY2UKKyAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBuZXZlciBzdG9wLgorICAgICAgICAgICAgICAgICAgICBtU2VydmljZUNvbm5lY3Rpb24gPSBudWxsOworICAgICAgICAgICAgICAgICAgICBjb25uZWN0VG9TZXNzaW9uKFNlc3Npb25Ub2tlbjJJbXBsLmZyb20obVRva2VuKS5nZXRTZXNzaW9uQmluZGVyKCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICAvLyBTaG91bGQgaGFwcGVuIG9ubHkgd2hlbiBzeXN0ZW0gc2VydmVyIHdhbnRzIHRvIGRpc3BhdGNoIG1lZGlhIGtleSBldmVudHMgdG8KKyAgICAgICAgICAgICAgICAgICAgLy8gYSBkZWFkIHNlcnZpY2UuCisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlN5c3RlbSBzZXJ2ZXIgYmluZHMgdG8gYSBzZXNzaW9uIHNlcnZpY2UuIFNob3VsZCB1bmJpbmQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSB1c2UuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbVNlcnZpY2VDb25uZWN0aW9uID0gbmV3IFNlc3Npb25TZXJ2aWNlQ29ubmVjdGlvbigpOworICAgICAgICAgICAgY29ubmVjdFRvU2VydmljZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNvbm5lY3RUb1NlcnZpY2UoKSB7CisgICAgICAgIC8vIFNlcnZpY2UuIE5lZWRzIHRvIGdldCBmcmVzaCBiaW5kZXIgd2hlbmV2ZXIgY29ubmVjdGlvbiBpcyBuZWVkZWQuCisgICAgICAgIFNlc3Npb25Ub2tlbjJJbXBsIGltcGwgPSBTZXNzaW9uVG9rZW4ySW1wbC5mcm9tKG1Ub2tlbik7CisgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhU2Vzc2lvblNlcnZpY2UyLlNFUlZJQ0VfSU5URVJGQUNFKTsKKyAgICAgICAgaW50ZW50LnNldENsYXNzTmFtZShtVG9rZW4uZ2V0UGFja2FnZU5hbWUoKSwgaW1wbC5nZXRTZXJ2aWNlTmFtZSgpKTsKKworICAgICAgICAvLyBVc2UgYmluZFNlcnZpY2UoKSBpbnN0ZWFkIG9mIHN0YXJ0Rm9yZWdyb3VuZFNlcnZpY2UoKSB0byBzdGFydCBzZXNzaW9uIHNlcnZpY2UgZm9yIHRocmVlCisgICAgICAgIC8vIHJlYXNvbnMuCisgICAgICAgIC8vIDEuIFByZXZlbnQgc2Vzc2lvbiBzZXJ2aWNlIG93bmVyJ3Mgc3RvcFNlbGYoKSBmcm9tIGRlc3Ryb3lpbmcgc2VydmljZS4KKyAgICAgICAgLy8gICAgV2l0aCB0aGUgc3RhcnRGb3JlZ3JvdW5kU2VydmljZSgpLCBzZXJ2aWNlJ3MgY2FsbCBvZiBzdG9wU2VsZigpIHdpbGwgdHJpZ2dlciBpbW1lZGlhdGUKKyAgICAgICAgLy8gICAgb25EZXN0cm95KCkgY2FsbHMgb24gdGhlIG1haW4gdGhyZWFkIGV2ZW4gd2hlbiBvbkNvbm5lY3QoKSBpcyBydW5uaW5nIGluIGFub3RoZXIKKyAgICAgICAgLy8gICAgdGhyZWFkLgorICAgICAgICAvLyAyLiBNaW5pbWl6ZSBBUElzIGZvciBkZXZlbG9wZXJzIHRvIHRha2UgY2FyZSBhYm91dC4KKyAgICAgICAgLy8gICAgV2l0aCBiaW5kU2VydmljZSgpLCBkZXZlbG9wZXJzIG9ubHkgbmVlZCB0byB0YWtlIGNhcmUgYWJvdXQgU2VydmljZS5vbkJpbmQoKQorICAgICAgICAvLyAgICBidXQgU2VydmljZS5vblN0YXJ0Q29tbWFuZCgpIHNob3VsZCBiZSBhbHNvIHRha2VuIGNhcmUgYWJvdXQgd2l0aCB0aGUKKyAgICAgICAgLy8gICAgc3RhcnRGb3JlZ3JvdW5kU2VydmljZSgpLgorICAgICAgICAvLyAzLiBGdXR1cmUgc3VwcG9ydCBmb3IgVUktbGVzcyBwbGF5YmFjaworICAgICAgICAvLyAgICBJZiBhIHNlcnZpY2Ugd2FudHMgdG8ga2VlcCBydW5uaW5nLCBpdCBzaG91bGQgYmUgZWl0aGVyIGZvcmVncm91bmQgc2VydmljZSBvcgorICAgICAgICAvLyAgICBib3VuZGVkIHNlcnZpY2UuIEJ1dCB0aGVyZSBoYWQgYmVlbiByZXF1ZXN0IGZvciB0aGUgZmVhdHVyZSBmb3Igc3lzdGVtIGFwcHMKKyAgICAgICAgLy8gICAgYW5kIHVzaW5nIGJpbmRTZXJ2aWNlKCkgd2lsbCBiZSBiZXR0ZXIgZml0IHdpdGggaXQuCisgICAgICAgIGJvb2xlYW4gcmVzdWx0OworICAgICAgICBpZiAoUHJvY2Vzcy5teVVpZCgpID09IFByb2Nlc3MuU1lTVEVNX1VJRCkgeworICAgICAgICAgICAgLy8gVXNlIGJpbmRTZXJ2aWNlQXNVc2VyKCkgZm9yIGJpbmRpbmcgZnJvbSBzeXN0ZW0gc2VydmljZSB0byBhdm9pZCBmb2xsb3dpbmcgd2FybmluZy4KKyAgICAgICAgICAgIC8vIENvbnRleHRJbXBsOiBDYWxsaW5nIGEgbWV0aG9kIGluIHRoZSBzeXN0ZW0gcHJvY2VzcyB3aXRob3V0IGEgcXVhbGlmaWVkIHVzZXIKKyAgICAgICAgICAgIHJlc3VsdCA9IG1Db250ZXh0LmJpbmRTZXJ2aWNlQXNVc2VyKGludGVudCwgbVNlcnZpY2VDb25uZWN0aW9uLCBDb250ZXh0LkJJTkRfQVVUT19DUkVBVEUsCisgICAgICAgICAgICAgICAgICAgIFVzZXJIYW5kbGUuZ2V0VXNlckhhbmRsZUZvclVpZChtVG9rZW4uZ2V0VWlkKCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG1Db250ZXh0LmJpbmRTZXJ2aWNlKGludGVudCwgbVNlcnZpY2VDb25uZWN0aW9uLCBDb250ZXh0LkJJTkRfQVVUT19DUkVBVEUpOworICAgICAgICB9CisgICAgICAgIGlmICghcmVzdWx0KSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJiaW5kIHRvICIgKyBtVG9rZW4gKyAiIGZhaWxlZCIpOworICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJiaW5kIHRvICIgKyBtVG9rZW4gKyAiIHN1Y2Nlc3MiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjb25uZWN0VG9TZXNzaW9uKElNZWRpYVNlc3Npb24yIHNlc3Npb25CaW5kZXIpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNlc3Npb25CaW5kZXIuY29ubmVjdChtQ29udHJvbGxlclN0dWIsIG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCkpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRvIGNhbGwgY29ubmVjdGlvbiByZXF1ZXN0LiBGcmFtZXdvcmsgd2lsbCByZXRyeSIKKyAgICAgICAgICAgICAgICAgICAgKyAiIGF1dG9tYXRpY2FsbHkiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsb3NlX2ltcGwoKSB7CisgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVsZWFzZSBmcm9tICIgKyBtVG9rZW4pOworICAgICAgICB9CisgICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlcjsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgaWYgKG1Jc1JlbGVhc2VkKSB7CisgICAgICAgICAgICAgICAgLy8gUHJldmVudCByZS1lbnRlcmFuY2UgZnJvbSB0aGUgQ29udHJvbGxlckNhbGxiYWNrLm9uRGlzY29ubmVjdGVkKCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtSXNSZWxlYXNlZCA9IHRydWU7CisgICAgICAgICAgICBpZiAobVNlcnZpY2VDb25uZWN0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQ29udGV4dC51bmJpbmRTZXJ2aWNlKG1TZXJ2aWNlQ29ubmVjdGlvbik7CisgICAgICAgICAgICAgICAgbVNlcnZpY2VDb25uZWN0aW9uID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJpbmRlciA9IG1TZXNzaW9uQmluZGVyOworICAgICAgICAgICAgbVNlc3Npb25CaW5kZXIgPSBudWxsOworICAgICAgICAgICAgbUNvbnRyb2xsZXJTdHViLmRlc3Ryb3koKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYmluZGVyLmFzQmluZGVyKCkudW5saW5rVG9EZWF0aChtRGVhdGhSZWNpcGllbnQsIDApOworICAgICAgICAgICAgICAgIGJpbmRlci5yZWxlYXNlKG1Db250cm9sbGVyU3R1Yik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIE5vLW9wLgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4geworICAgICAgICAgICAgbUNhbGxiYWNrLm9uRGlzY29ubmVjdGVkKG1JbnN0YW5jZSk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIElNZWRpYVNlc3Npb24yIGdldFNlc3Npb25CaW5kZXIoKSB7CisgICAgICAgIHJldHVybiBtU2Vzc2lvbkJpbmRlcjsKKyAgICB9CisKKyAgICBNZWRpYUNvbnRyb2xsZXIyU3R1YiBnZXRDb250cm9sbGVyU3R1YigpIHsKKyAgICAgICAgcmV0dXJuIG1Db250cm9sbGVyU3R1YjsKKyAgICB9CisKKyAgICBFeGVjdXRvciBnZXRDYWxsYmFja0V4ZWN1dG9yKCkgeworICAgICAgICByZXR1cm4gbUNhbGxiYWNrRXhlY3V0b3I7CisgICAgfQorCisgICAgQ29udGV4dCBnZXRDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gbUNvbnRleHQ7CisgICAgfQorCisgICAgTWVkaWFDb250cm9sbGVyMiBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKKyAgICB9CisKKyAgICAvLyBSZXR1cm5zIHNlc3Npb24gYmluZGVyIGlmIHRoZSBjb250cm9sbGVyIGNhbiBzZW5kIHRoZSBjb21tYW5kLgorICAgIElNZWRpYVNlc3Npb24yIGdldFNlc3Npb25CaW5kZXJJZkFibGUoaW50IGNvbW1hbmRDb2RlKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIGlmICghbUFsbG93ZWRDb21tYW5kcy5oYXNDb21tYW5kKGNvbW1hbmRDb2RlKSkgeworICAgICAgICAgICAgICAgIC8vIENhbm5vdCBzZW5kIGJlY2F1c2UgaXNuJ3QgYWxsb3dlZCB0by4KKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb250cm9sbGVyIGlzbid0IGFsbG93ZWQgdG8gY2FsbCBjb21tYW5kLCBjb21tYW5kQ29kZT0iCisgICAgICAgICAgICAgICAgICAgICAgICArIGNvbW1hbmRDb2RlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPKGphZXdhbik6IFNob3VsZCB3ZSBkbyB0aGlzIHdpdGggdGhlIGxvY2sgaG9sZD8KKyAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gbVNlc3Npb25CaW5kZXI7CisgICAgICAgIGlmIChiaW5kZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gQ2Fubm90IHNlbmQgYmVjYXVzZSBkaXNjb25uZWN0ZWQuCisgICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzIGRpc2Nvbm5lY3RlZCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBiaW5kZXI7CisgICAgfQorCisgICAgLy8gUmV0dXJucyBzZXNzaW9uIGJpbmRlciBpZiB0aGUgY29udHJvbGxlciBjYW4gc2VuZCB0aGUgY29tbWFuZC4KKyAgICBJTWVkaWFTZXNzaW9uMiBnZXRTZXNzaW9uQmluZGVySWZBYmxlKFNlc3Npb25Db21tYW5kMiBjb21tYW5kKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIGlmICghbUFsbG93ZWRDb21tYW5kcy5oYXNDb21tYW5kKGNvbW1hbmQpKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ29udHJvbGxlciBpc24ndCBhbGxvd2VkIHRvIGNhbGwgY29tbWFuZCwgY29tbWFuZD0iICsgY29tbWFuZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBTaG91bGQgd2UgZG8gdGhpcyB3aXRoIHRoZSBsb2NrIGhvbGQ/CisgICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IG1TZXNzaW9uQmluZGVyOworICAgICAgICBpZiAoYmluZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIENhbm5vdCBzZW5kIGJlY2F1c2UgZGlzY29ubmVjdGVkLgorICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpcyBkaXNjb25uZWN0ZWQiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYmluZGVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXNzaW9uVG9rZW4yIGdldFNlc3Npb25Ub2tlbl9pbXBsKCkgeworICAgICAgICByZXR1cm4gbVRva2VuOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGVkX2ltcGwoKSB7CisgICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IG1TZXNzaW9uQmluZGVyOworICAgICAgICByZXR1cm4gYmluZGVyICE9IG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcGxheV9pbXBsKCkgeworICAgICAgICBzZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZQkFDS19QTEFZKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwYXVzZV9pbXBsKCkgeworICAgICAgICBzZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZQkFDS19QQVVTRSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3RvcF9pbXBsKCkgeworICAgICAgICBzZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZQkFDS19TVE9QKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBza2lwVG9QbGF5bGlzdEl0ZW1faW1wbChNZWRpYUl0ZW0yIGl0ZW0pIHsKKyAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbSBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IG1TZXNzaW9uQmluZGVyOworICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYmluZGVyLnNraXBUb1BsYXlsaXN0SXRlbShtQ29udHJvbGxlclN0dWIsIGl0ZW0udG9CdW5kbGUoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNraXBUb1ByZXZpb3VzSXRlbV9pbXBsKCkgeworICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBtU2Vzc2lvbkJpbmRlcjsKKyAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGJpbmRlci5za2lwVG9QcmV2aW91c0l0ZW0obUNvbnRyb2xsZXJTdHViKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2tpcFRvTmV4dEl0ZW1faW1wbCgpIHsKKyAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gbVNlc3Npb25CaW5kZXI7CisgICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBiaW5kZXIuc2tpcFRvTmV4dEl0ZW0obUNvbnRyb2xsZXJTdHViKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChpbnQgY29tbWFuZENvZGUpIHsKKyAgICAgICAgc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKGNvbW1hbmRDb2RlLCBudWxsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKGludCBjb21tYW5kQ29kZSwgQnVuZGxlIGFyZ3MpIHsKKyAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gbVNlc3Npb25CaW5kZXI7CisgICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBiaW5kZXIuc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKG1Db250cm9sbGVyU3R1YiwgY29tbWFuZENvZGUsIGFyZ3MpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUGVuZGluZ0ludGVudCBnZXRTZXNzaW9uQWN0aXZpdHlfaW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIG1TZXNzaW9uQWN0aXZpdHk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0Vm9sdW1lVG9faW1wbChpbnQgdmFsdWUsIGludCBmbGFncykgeworICAgICAgICAvLyBUT0RPKGhkbW9vbik6IHNhbml0eSBjaGVjaworICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9TRVRfVk9MVU1FKTsKKyAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGJpbmRlci5zZXRWb2x1bWVUbyhtQ29udHJvbGxlclN0dWIsIHZhbHVlLCBmbGFncyk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFkanVzdFZvbHVtZV9pbXBsKGludCBkaXJlY3Rpb24sIGludCBmbGFncykgeworICAgICAgICAvLyBUT0RPKGhkbW9vbik6IHNhbml0eSBjaGVjaworICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9TRVRfVk9MVU1FKTsKKyAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGJpbmRlci5hZGp1c3RWb2x1bWUobUNvbnRyb2xsZXJTdHViLCBkaXJlY3Rpb24sIGZsYWdzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcHJlcGFyZUZyb21VcmlfaW1wbChVcmkgdXJpLCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoQ09NTUFORF9DT0RFX1NFU1NJT05fUFJFUEFSRV9GUk9NX1VSSSk7CisgICAgICAgIGlmICh1cmkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidXJpIHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGJpbmRlci5wcmVwYXJlRnJvbVVyaShtQ29udHJvbGxlclN0dWIsIHVyaSwgZXh0cmFzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUuCisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwcmVwYXJlRnJvbVNlYXJjaF9pbXBsKFN0cmluZyBxdWVyeSwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKAorICAgICAgICAgICAgICAgIENPTU1BTkRfQ09ERV9TRVNTSU9OX1BSRVBBUkVfRlJPTV9TRUFSQ0gpOworICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocXVlcnkpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJxdWVyeSBzaG91bGRuJ3QgYmUgZW1wdHkiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYmluZGVyLnByZXBhcmVGcm9tU2VhcmNoKG1Db250cm9sbGVyU3R1YiwgcXVlcnksIGV4dHJhcyk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlLgorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcHJlcGFyZUZyb21NZWRpYUlkX2ltcGwoU3RyaW5nIG1lZGlhSWQsIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZSgKKyAgICAgICAgICAgICAgICBDT01NQU5EX0NPREVfU0VTU0lPTl9QUkVQQVJFX0ZST01fTUVESUFfSUQpOworICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZWRpYUlkIHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGJpbmRlci5wcmVwYXJlRnJvbU1lZGlhSWQobUNvbnRyb2xsZXJTdHViLCBtZWRpYUlkLCBleHRyYXMpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZS4KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHBsYXlGcm9tVXJpX2ltcGwoVXJpIHVyaSwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9TRVNTSU9OX1BMQVlfRlJPTV9VUkkpOworICAgICAgICBpZiAodXJpID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVyaSBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBiaW5kZXIucGxheUZyb21VcmkobUNvbnRyb2xsZXJTdHViLCB1cmksIGV4dHJhcyk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlLgorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcGxheUZyb21TZWFyY2hfaW1wbChTdHJpbmcgcXVlcnksIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZShDT01NQU5EX0NPREVfU0VTU0lPTl9QTEFZX0ZST01fU0VBUkNIKTsKKyAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicXVlcnkgc2hvdWxkbid0IGJlIGVtcHR5Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGJpbmRlci5wbGF5RnJvbVNlYXJjaChtQ29udHJvbGxlclN0dWIsIHF1ZXJ5LCBleHRyYXMpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZS4KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHBsYXlGcm9tTWVkaWFJZF9pbXBsKFN0cmluZyBtZWRpYUlkLCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoCisgICAgICAgICAgICAgICAgQ09NTUFORF9DT0RFX1NFU1NJT05fUExBWV9GUk9NX01FRElBX0lEKTsKKyAgICAgICAgaWYgKG1lZGlhSWQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWVkaWFJZCBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBiaW5kZXIucGxheUZyb21NZWRpYUlkKG1Db250cm9sbGVyU3R1YiwgbWVkaWFJZCwgZXh0cmFzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUuCisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRSYXRpbmdfaW1wbChTdHJpbmcgbWVkaWFJZCwgUmF0aW5nMiByYXRpbmcpIHsKKyAgICAgICAgaWYgKG1lZGlhSWQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWVkaWFJZCBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGlmIChyYXRpbmcgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicmF0aW5nIHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBtU2Vzc2lvbkJpbmRlcjsKKyAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGJpbmRlci5zZXRSYXRpbmcobUNvbnRyb2xsZXJTdHViLCBtZWRpYUlkLCByYXRpbmcudG9CdW5kbGUoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlLgorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2VuZEN1c3RvbUNvbW1hbmRfaW1wbChTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCwgQnVuZGxlIGFyZ3MsIFJlc3VsdFJlY2VpdmVyIGNiKSB7CisgICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmQgc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKGNvbW1hbmQpOworICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYmluZGVyLnNlbmRDdXN0b21Db21tYW5kKG1Db250cm9sbGVyU3R1YiwgY29tbWFuZC50b0J1bmRsZSgpLCBhcmdzLCBjYik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PE1lZGlhSXRlbTI+IGdldFBsYXlsaXN0X2ltcGwoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIHJldHVybiBtUGxheWxpc3Q7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRQbGF5bGlzdF9pbXBsKExpc3Q8TWVkaWFJdGVtMj4gbGlzdCwgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKKyAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibGlzdCBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9MSVNUKTsKKyAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBMaXN0PEJ1bmRsZT4gYnVuZGxlTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgYnVuZGxlTGlzdC5hZGQobGlzdC5nZXQoaSkudG9CdW5kbGUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBCdW5kbGUgbWV0YWRhdGFCdW5kbGUgPSAobWV0YWRhdGEgPT0gbnVsbCkgPyBudWxsIDogbWV0YWRhdGEudG9CdW5kbGUoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYmluZGVyLnNldFBsYXlsaXN0KG1Db250cm9sbGVyU3R1YiwgYnVuZGxlTGlzdCwgbWV0YWRhdGFCdW5kbGUpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWVkaWFNZXRhZGF0YTIgZ2V0UGxheWxpc3RNZXRhZGF0YV9pbXBsKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICByZXR1cm4gbVBsYXlsaXN0TWV0YWRhdGE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVQbGF5bGlzdE1ldGFkYXRhX2ltcGwoTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKKyAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZSgKKyAgICAgICAgICAgICAgICBDT01NQU5EX0NPREVfUExBWUxJU1RfU0VUX0xJU1RfTUVUQURBVEEpOworICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIEJ1bmRsZSBtZXRhZGF0YUJ1bmRsZSA9IChtZXRhZGF0YSA9PSBudWxsKSA/IG51bGwgOiBtZXRhZGF0YS50b0J1bmRsZSgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBiaW5kZXIudXBkYXRlUGxheWxpc3RNZXRhZGF0YShtQ29udHJvbGxlclN0dWIsIG1ldGFkYXRhQnVuZGxlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcHJlcGFyZV9pbXBsKCkgeworICAgICAgICBzZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZQkFDS19QUkVQQVJFKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmYXN0Rm9yd2FyZF9pbXBsKCkgeworICAgICAgICAvLyBUT0RPKGphZXdhbik6IEltcGxlbWVudCB0aGlzLiBOb3RlIHRoYXQgZmFzdCBmb3J3YXJkIGlzbid0IGEgdHJhbnNwb3J0IGNvbW1hbmQgYW55bW9yZQorICAgICAgICAvL3NlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChNZWRpYVNlc3Npb24yLkNPTU1BTkRfQ09ERV9TRVNTSU9OX0ZBU1RfRk9SV0FSRCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmV3aW5kX2ltcGwoKSB7CisgICAgICAgIC8vIFRPRE8oamFld2FuKTogSW1wbGVtZW50IHRoaXMuIE5vdGUgdGhhdCByZXdpbmQgaXNuJ3QgYSB0cmFuc3BvcnQgY29tbWFuZCBhbnltb3JlCisgICAgICAgIC8vc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKE1lZGlhU2Vzc2lvbjIuQ09NTUFORF9DT0RFX1NFU1NJT05fUkVXSU5EKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZWVrVG9faW1wbChsb25nIHBvcykgeworICAgICAgICBpZiAocG9zIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicG9zaXRpb24gc2hvdWxkbid0IGJlIG5lZ2F0aXZlIik7CisgICAgICAgIH0KKyAgICAgICAgQnVuZGxlIGFyZ3MgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIGFyZ3MucHV0TG9uZyhNZWRpYVNlc3Npb24yU3R1Yi5BUkdVTUVOVF9LRVlfUE9TSVRJT04sIHBvcyk7CisgICAgICAgIHNlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1NFRUtfVE8sIGFyZ3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFkZFBsYXlsaXN0SXRlbV9pbXBsKGludCBpbmRleCwgTWVkaWFJdGVtMiBpdGVtKSB7CisgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImluZGV4IHNob3VsZG4ndCBiZSBuZWdhdGl2ZSIpOworICAgICAgICB9CisgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9QTEFZTElTVF9BRERfSVRFTSk7CisgICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBiaW5kZXIuYWRkUGxheWxpc3RJdGVtKG1Db250cm9sbGVyU3R1YiwgaW5kZXgsIGl0ZW0udG9CdW5kbGUoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBsYXlsaXN0SXRlbV9pbXBsKE1lZGlhSXRlbTIgaXRlbSkgeworICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtIHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZShDT01NQU5EX0NPREVfUExBWUxJU1RfUkVNT1ZFX0lURU0pOworICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYmluZGVyLnJlbW92ZVBsYXlsaXN0SXRlbShtQ29udHJvbGxlclN0dWIsIGl0ZW0udG9CdW5kbGUoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlcGxhY2VQbGF5bGlzdEl0ZW1faW1wbChpbnQgaW5kZXgsIE1lZGlhSXRlbTIgaXRlbSkgeworICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbmRleCBzaG91bGRuJ3QgYmUgbmVnYXRpdmUiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtIHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZShDT01NQU5EX0NPREVfUExBWUxJU1RfUkVQTEFDRV9JVEVNKTsKKyAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGJpbmRlci5yZXBsYWNlUGxheWxpc3RJdGVtKG1Db250cm9sbGVyU3R1YiwgaW5kZXgsIGl0ZW0udG9CdW5kbGUoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0U2h1ZmZsZU1vZGVfaW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIG1TaHVmZmxlTW9kZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRTaHVmZmxlTW9kZV9pbXBsKGludCBzaHVmZmxlTW9kZSkgeworICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKAorICAgICAgICAgICAgICAgIENPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfU0hVRkZMRV9NT0RFKTsKKyAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGJpbmRlci5zZXRTaHVmZmxlTW9kZShtQ29udHJvbGxlclN0dWIsIHNodWZmbGVNb2RlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRSZXBlYXRNb2RlX2ltcGwoKSB7CisgICAgICAgIHJldHVybiBtUmVwZWF0TW9kZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRSZXBlYXRNb2RlX2ltcGwoaW50IHJlcGVhdE1vZGUpIHsKKyAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZShDT01NQU5EX0NPREVfUExBWUxJU1RfU0VUX1JFUEVBVF9NT0RFKTsKKyAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGJpbmRlci5zZXRSZXBlYXRNb2RlKG1Db250cm9sbGVyU3R1YiwgcmVwZWF0TW9kZSk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBQbGF5YmFja0luZm8gZ2V0UGxheWJhY2tJbmZvX2ltcGwoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIHJldHVybiBtUGxheWJhY2tJbmZvOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRQbGF5ZXJTdGF0ZV9pbXBsKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICByZXR1cm4gbVBsYXllclN0YXRlOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZ2V0Q3VycmVudFBvc2l0aW9uX2ltcGwoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIGxvbmcgdGltZURpZmYgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIG1Qb3NpdGlvbkV2ZW50VGltZU1zOworICAgICAgICAgICAgbG9uZyBleHBlY3RlZFBvc2l0aW9uID0gbVBvc2l0aW9uTXMgKyAobG9uZykgKG1QbGF5YmFja1NwZWVkICogdGltZURpZmYpOworICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIGV4cGVjdGVkUG9zaXRpb24pOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZsb2F0IGdldFBsYXliYWNrU3BlZWRfaW1wbCgpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgcmV0dXJuIG1QbGF5YmFja1NwZWVkOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZ2V0QnVmZmVyZWRQb3NpdGlvbl9pbXBsKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICByZXR1cm4gbUJ1ZmZlcmVkUG9zaXRpb25NczsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNZWRpYUl0ZW0yIGdldEN1cnJlbnRNZWRpYUl0ZW1faW1wbCgpIHsKKyAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBJbXBsZW1lbnQKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgdm9pZCBwdXNoUGxheWVyU3RhdGVDaGFuZ2VzKGZpbmFsIGludCBzdGF0ZSkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBtUGxheWVyU3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgfQorICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKKyAgICAgICAgICAgIGlmICghbUluc3RhbmNlLmlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2FsbGJhY2sub25QbGF5ZXJTdGF0ZUNoYW5nZWQobUluc3RhbmNlLCBzdGF0ZSk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIC8vIFRPRE8oamFld2FuKTogUmVuYW1lIHRvIHNlZWsgY29tcGxldGVkCisgICAgdm9pZCBwdXNoUG9zaXRpb25DaGFuZ2VzKGZpbmFsIGxvbmcgZXZlbnRUaW1lTXMsIGZpbmFsIGxvbmcgcG9zaXRpb25NcykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBtUG9zaXRpb25FdmVudFRpbWVNcyA9IGV2ZW50VGltZU1zOworICAgICAgICAgICAgbVBvc2l0aW9uTXMgPSBwb3NpdGlvbk1zOworICAgICAgICB9CisgICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4geworICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DYWxsYmFjay5vblNlZWtDb21wbGV0ZWQobUluc3RhbmNlLCBwb3NpdGlvbk1zKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgdm9pZCBwdXNoUGxheWJhY2tTcGVlZENoYW5nZXMoZmluYWwgZmxvYXQgc3BlZWQpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgbVBsYXliYWNrU3BlZWQgPSBzcGVlZDsKKyAgICAgICAgfQorICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKKyAgICAgICAgICAgIGlmICghbUluc3RhbmNlLmlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2FsbGJhY2sub25QbGF5YmFja1NwZWVkQ2hhbmdlZChtSW5zdGFuY2UsIHNwZWVkKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgdm9pZCBwdXNoQnVmZmVyZWRQb3NpdGlvbkNoYW5nZXMoZmluYWwgbG9uZyBidWZmZXJlZFBvc2l0aW9uTXMpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgbUJ1ZmZlcmVkUG9zaXRpb25NcyA9IGJ1ZmZlcmVkUG9zaXRpb25NczsKKyAgICAgICAgfQorICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKKyAgICAgICAgICAgIGlmICghbUluc3RhbmNlLmlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEZpeCB0aGlzIC0tIGl0J3Mgbm93IGJ1ZmZlcmVkIHN0YXRlCisgICAgICAgICAgICAvL21DYWxsYmFjay5vbkJ1ZmZlcmVkUG9zaXRpb25DaGFuZ2VkKG1JbnN0YW5jZSwgYnVmZmVyZWRQb3NpdGlvbk1zKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgdm9pZCBwdXNoUGxheWJhY2tJbmZvQ2hhbmdlcyhmaW5hbCBQbGF5YmFja0luZm8gaW5mbykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBtUGxheWJhY2tJbmZvID0gaW5mbzsKKyAgICAgICAgfQorICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKKyAgICAgICAgICAgIGlmICghbUluc3RhbmNlLmlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2FsbGJhY2sub25QbGF5YmFja0luZm9DaGFuZ2VkKG1JbnN0YW5jZSwgaW5mbyk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHZvaWQgcHVzaFBsYXlsaXN0Q2hhbmdlcyhmaW5hbCBMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0LCBmaW5hbCBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBtUGxheWxpc3QgPSBwbGF5bGlzdDsKKyAgICAgICAgICAgIG1QbGF5bGlzdE1ldGFkYXRhID0gbWV0YWRhdGE7CisgICAgICAgIH0KKyAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7CisgICAgICAgICAgICBpZiAoIW1JbnN0YW5jZS5pc0Nvbm5lY3RlZCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkKG1JbnN0YW5jZSwgcGxheWxpc3QsIG1ldGFkYXRhKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgdm9pZCBwdXNoUGxheWxpc3RNZXRhZGF0YUNoYW5nZXMoTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgbVBsYXlsaXN0TWV0YWRhdGEgPSBtZXRhZGF0YTsKKyAgICAgICAgfQorICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKKyAgICAgICAgICAgIGlmICghbUluc3RhbmNlLmlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2FsbGJhY2sub25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZChtSW5zdGFuY2UsIG1ldGFkYXRhKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgdm9pZCBwdXNoU2h1ZmZsZU1vZGVDaGFuZ2VzKGludCBzaHVmZmxlTW9kZSkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBtU2h1ZmZsZU1vZGUgPSBzaHVmZmxlTW9kZTsKKyAgICAgICAgfQorICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKKyAgICAgICAgICAgIGlmICghbUluc3RhbmNlLmlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2FsbGJhY2sub25TaHVmZmxlTW9kZUNoYW5nZWQobUluc3RhbmNlLCBzaHVmZmxlTW9kZSk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHZvaWQgcHVzaFJlcGVhdE1vZGVDaGFuZ2VzKGludCByZXBlYXRNb2RlKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIG1SZXBlYXRNb2RlID0gcmVwZWF0TW9kZTsKKyAgICAgICAgfQorICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKKyAgICAgICAgICAgIGlmICghbUluc3RhbmNlLmlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2FsbGJhY2sub25SZXBlYXRNb2RlQ2hhbmdlZChtSW5zdGFuY2UsIHJlcGVhdE1vZGUpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICB2b2lkIHB1c2hFcnJvcihpbnQgZXJyb3JDb2RlLCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4geworICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DYWxsYmFjay5vbkVycm9yKG1JbnN0YW5jZSwgZXJyb3JDb2RlLCBleHRyYXMpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICAvLyBTaG91bGQgYmUgdXNlZCB3aXRob3V0IGEgbG9jayB0byBwcmV2ZW50IHBvdGVudGlhbCBkZWFkbG9jay4KKyAgICB2b2lkIG9uQ29ubmVjdGVkTm90TG9ja2VkKElNZWRpYVNlc3Npb24yIHNlc3Npb25CaW5kZXIsCisgICAgICAgICAgICBmaW5hbCBTZXNzaW9uQ29tbWFuZEdyb3VwMiBhbGxvd2VkQ29tbWFuZHMsCisgICAgICAgICAgICBmaW5hbCBpbnQgcGxheWVyU3RhdGUsCisgICAgICAgICAgICBmaW5hbCBsb25nIHBvc2l0aW9uRXZlbnRUaW1lTXMsCisgICAgICAgICAgICBmaW5hbCBsb25nIHBvc2l0aW9uTXMsCisgICAgICAgICAgICBmaW5hbCBmbG9hdCBwbGF5YmFja1NwZWVkLAorICAgICAgICAgICAgZmluYWwgbG9uZyBidWZmZXJlZFBvc2l0aW9uTXMsCisgICAgICAgICAgICBmaW5hbCBQbGF5YmFja0luZm8gaW5mbywKKyAgICAgICAgICAgIGZpbmFsIGludCByZXBlYXRNb2RlLAorICAgICAgICAgICAgZmluYWwgaW50IHNodWZmbGVNb2RlLAorICAgICAgICAgICAgZmluYWwgTGlzdDxNZWRpYUl0ZW0yPiBwbGF5bGlzdCwKKyAgICAgICAgICAgIGZpbmFsIFBlbmRpbmdJbnRlbnQgc2Vzc2lvbkFjdGl2aXR5KSB7CisgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAib25Db25uZWN0ZWROb3RMb2NrZWQgc2Vzc2lvbkJpbmRlcj0iICsgc2Vzc2lvbkJpbmRlcgorICAgICAgICAgICAgICAgICAgICArICIsIGFsbG93ZWRDb21tYW5kcz0iICsgYWxsb3dlZENvbW1hbmRzKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIGNsb3NlID0gZmFsc2U7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbkJpbmRlciA9PSBudWxsIHx8IGFsbG93ZWRDb21tYW5kcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gQ29ubmVjdGlvbiByZWplY3RlZC4KKyAgICAgICAgICAgICAgICBjbG9zZSA9IHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgICAgIGlmIChtSXNSZWxlYXNlZCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtU2Vzc2lvbkJpbmRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkNhbm5vdCBiZSBub3RpZmllZCBhYm91dCB0aGUgY29ubmVjdGlvbiByZXN1bHQgbWFueSB0aW1lcy4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIFByb2JhYmx5IGEgYnVnIG9yIG1hbGljaW91cyBhcHAuIik7CisgICAgICAgICAgICAgICAgICAgIGNsb3NlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQWxsb3dlZENvbW1hbmRzID0gYWxsb3dlZENvbW1hbmRzOworICAgICAgICAgICAgICAgIG1QbGF5ZXJTdGF0ZSA9IHBsYXllclN0YXRlOworICAgICAgICAgICAgICAgIG1Qb3NpdGlvbkV2ZW50VGltZU1zID0gcG9zaXRpb25FdmVudFRpbWVNczsKKyAgICAgICAgICAgICAgICBtUG9zaXRpb25NcyA9IHBvc2l0aW9uTXM7CisgICAgICAgICAgICAgICAgbVBsYXliYWNrU3BlZWQgPSBwbGF5YmFja1NwZWVkOworICAgICAgICAgICAgICAgIG1CdWZmZXJlZFBvc2l0aW9uTXMgPSBidWZmZXJlZFBvc2l0aW9uTXM7CisgICAgICAgICAgICAgICAgbVBsYXliYWNrSW5mbyA9IGluZm87CisgICAgICAgICAgICAgICAgbVJlcGVhdE1vZGUgPSByZXBlYXRNb2RlOworICAgICAgICAgICAgICAgIG1TaHVmZmxlTW9kZSA9IHNodWZmbGVNb2RlOworICAgICAgICAgICAgICAgIG1QbGF5bGlzdCA9IHBsYXlsaXN0OworICAgICAgICAgICAgICAgIG1TZXNzaW9uQWN0aXZpdHkgPSBzZXNzaW9uQWN0aXZpdHk7CisgICAgICAgICAgICAgICAgbVNlc3Npb25CaW5kZXIgPSBzZXNzaW9uQmluZGVyOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEltcGxlbWVudGF0aW9uIGZvciB0aGUgbG9jYWwgYmluZGVyIGlzIG5vLW9wLAorICAgICAgICAgICAgICAgICAgICAvLyBzbyBjYW4gYmUgdXNlZCB3aXRob3V0IHdvcnJ5aW5nIGFib3V0IGRlYWRsb2NrLgorICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbkJpbmRlci5hc0JpbmRlcigpLmxpbmtUb0RlYXRoKG1EZWF0aFJlY2lwaWVudCwgMCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJTZXNzaW9uIGRpZWQgdG9vIGVhcmx5LiIsIGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNsb3NlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogS2VlcCBjb21tYW5kcyB0byBwcmV2ZW50cyBpbGxlZ2FsIEFQSSBjYWxscy4KKyAgICAgICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4geworICAgICAgICAgICAgICAgIC8vIE5vdGU6IFdlIG1heSB0cmlnZ2VyIENvbnRyb2xsZXJDYWxsYmFja3Mgd2l0aCB0aGUgaW5pdGlhbCB2YWx1ZXMKKyAgICAgICAgICAgICAgICAvLyBCdXQgaXQncyBoYXJkIHRvIGRlZmluZSB0aGUgb3JkZXIgb2YgdGhlIGNvbnRyb2xsZXIgY2FsbGJhY2tzCisgICAgICAgICAgICAgICAgLy8gT25seSBub3RpZnkgYWJvdXQgdGhlCisgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uQ29ubmVjdGVkKG1JbnN0YW5jZSwgYWxsb3dlZENvbW1hbmRzKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGNsb3NlKSB7CisgICAgICAgICAgICAgICAgLy8gVHJpY2sgdG8gY2FsbCByZWxlYXNlKCkgd2l0aG91dCBob2xkaW5nIHRoZSBsb2NrLCB0byBwcmV2ZW50IHBvdGVudGlhbCBkZWFkbG9jaworICAgICAgICAgICAgICAgIC8vIHdpdGggdGhlIGRldmVsb3BlcidzIGN1c3RvbSBsb2NrIHdpdGhpbiB0aGUgQ29udHJvbGxlckNhbGxiYWNrLm9uRGlzY29ubmVjdGVkKCkuCisgICAgICAgICAgICAgICAgbUluc3RhbmNlLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIG9uQ3VzdG9tQ29tbWFuZChmaW5hbCBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCwgZmluYWwgQnVuZGxlIGFyZ3MsCisgICAgICAgICAgICBmaW5hbCBSZXN1bHRSZWNlaXZlciByZWNlaXZlcikgeworICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIm9uQ3VzdG9tQ29tbWFuZCBjbWQ9IiArIGNvbW1hbmQpOworICAgICAgICB9CisgICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4geworICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBEb3VibGUgY2hlY2sgaWYgdGhlIGNvbnRyb2xsZXIgZXhpc3RzLgorICAgICAgICAgICAgbUNhbGxiYWNrLm9uQ3VzdG9tQ29tbWFuZChtSW5zdGFuY2UsIGNvbW1hbmQsIGFyZ3MsIHJlY2VpdmVyKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgdm9pZCBvbkFsbG93ZWRDb21tYW5kc0NoYW5nZWQoZmluYWwgU2Vzc2lvbkNvbW1hbmRHcm91cDIgY29tbWFuZHMpIHsKKyAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7CisgICAgICAgICAgICBtQ2FsbGJhY2sub25BbGxvd2VkQ29tbWFuZHNDaGFuZ2VkKG1JbnN0YW5jZSwgY29tbWFuZHMpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICB2b2lkIG9uQ3VzdG9tTGF5b3V0Q2hhbmdlZChmaW5hbCBMaXN0PENvbW1hbmRCdXR0b24+IGxheW91dCkgeworICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKKyAgICAgICAgICAgIG1DYWxsYmFjay5vbkN1c3RvbUxheW91dENoYW5nZWQobUluc3RhbmNlLCBsYXlvdXQpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICAvLyBUaGlzIHdpbGwgYmUgY2FsbGVkIG9uIHRoZSBtYWluIHRocmVhZC4KKyAgICBwcml2YXRlIGNsYXNzIFNlc3Npb25TZXJ2aWNlQ29ubmVjdGlvbiBpbXBsZW1lbnRzIFNlcnZpY2VDb25uZWN0aW9uIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZUNvbm5lY3RlZChDb21wb25lbnROYW1lIG5hbWUsIElCaW5kZXIgc2VydmljZSkgeworICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGl0J3MgYWx3YXlzIG1haW4tdGhyZWFkLgorICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25TZXJ2aWNlQ29ubmVjdGVkICIgKyBuYW1lICsgIiAiICsgdGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBTYW5pdHkgY2hlY2sKKyAgICAgICAgICAgIGlmICghbVRva2VuLmdldFBhY2thZ2VOYW1lKCkuZXF1YWxzKG5hbWUuZ2V0UGFja2FnZU5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICBMb2cud3RmKFRBRywgbmFtZSArICIgd2FzIGNvbm5lY3RlZCwgYnV0IGV4cGVjdGVkIHBrZz0iCisgICAgICAgICAgICAgICAgICAgICAgICArIG1Ub2tlbi5nZXRQYWNrYWdlTmFtZSgpICsgIiB3aXRoIGlkPSIgKyBtVG9rZW4uZ2V0SWQoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgc2Vzc2lvbkJpbmRlciA9IElNZWRpYVNlc3Npb24yLlN0dWIuYXNJbnRlcmZhY2Uoc2VydmljZSk7CisgICAgICAgICAgICBjb25uZWN0VG9TZXNzaW9uKHNlc3Npb25CaW5kZXIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZURpc2Nvbm5lY3RlZChDb21wb25lbnROYW1lIG5hbWUpIHsKKyAgICAgICAgICAgIC8vIFRlbXBvcmFsIGxvc2Ugb2YgdGhlIGJpbmRpbmcgYmVjYXVzZSBvZiB0aGUgc2VydmljZSBjcmFzaC4gU3lzdGVtIHdpbGwgYXV0b21hdGljYWxseQorICAgICAgICAgICAgLy8gcmViaW5kLCBzbyBqdXN0IG5vLW9wLgorICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBSZWFsbHk/IEVpdGhlciBkaXNjb25uZWN0IGNsZWFubHkgb3IKKyAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gc2VydmljZSAiICsgbmFtZSArICIgaXMgZGlzY29ubmVjdGVkLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQmluZGluZ0RpZWQoQ29tcG9uZW50TmFtZSBuYW1lKSB7CisgICAgICAgICAgICAvLyBQZXJtYW5lbnQgbG9zZSBvZiB0aGUgYmluZGluZyBiZWNhdXNlIG9mIHRoZSBzZXJ2aWNlIHBhY2thZ2UgdXBkYXRlIG9yIHJlbW92ZWQuCisgICAgICAgICAgICAvLyBUaGlzIFNlc3Npb25TZXJ2aWNlUmVjb3JkIHdpbGwgYmUgcmVtb3ZlZCBhY2NvcmRpbmdseSwgYnV0IGZvcmdldCBzZXNzaW9uIGJpbmRlciBoZXJlCisgICAgICAgICAgICAvLyBmb3Igc3VyZS4KKyAgICAgICAgICAgIG1JbnN0YW5jZS5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQbGF5YmFja0luZm9JbXBsIGltcGxlbWVudHMgUGxheWJhY2tJbmZvUHJvdmlkZXIgeworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUExBWUJBQ0tfVFlQRSA9CisgICAgICAgICAgICAgICAgImFuZHJvaWQubWVkaWEucGxheWJhY2tpbmZvX2ltcGwucGxheWJhY2tfdHlwZSI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09OVFJPTF9UWVBFID0KKyAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5wbGF5YmFja2luZm9faW1wbC5jb250cm9sX3R5cGUiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX01BWF9WT0xVTUUgPQorICAgICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLnBsYXliYWNraW5mb19pbXBsLm1heF92b2x1bWUiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NVUlJFTlRfVk9MVU1FID0KKyAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5wbGF5YmFja2luZm9faW1wbC5jdXJyZW50X3ZvbHVtZSI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQVVESU9fQVRUUklCVVRFUyA9CisgICAgICAgICAgICAgICAgImFuZHJvaWQubWVkaWEucGxheWJhY2tpbmZvX2ltcGwuYXVkaW9fYXR0cnMiOworCisgICAgICAgIHByaXZhdGUgZmluYWwgUGxheWJhY2tJbmZvIG1JbnN0YW5jZTsKKworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtUGxheWJhY2tUeXBlOworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtQ29udHJvbFR5cGU7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1NYXhWb2x1bWU7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1DdXJyZW50Vm9sdW1lOworICAgICAgICBwcml2YXRlIGZpbmFsIEF1ZGlvQXR0cmlidXRlcyBtQXVkaW9BdHRyczsKKworICAgICAgICBwcml2YXRlIFBsYXliYWNrSW5mb0ltcGwoaW50IHBsYXliYWNrVHlwZSwgQXVkaW9BdHRyaWJ1dGVzIGF0dHJzLCBpbnQgY29udHJvbFR5cGUsCisgICAgICAgICAgICAgICAgaW50IG1heCwgaW50IGN1cnJlbnQpIHsKKyAgICAgICAgICAgIG1QbGF5YmFja1R5cGUgPSBwbGF5YmFja1R5cGU7CisgICAgICAgICAgICBtQXVkaW9BdHRycyA9IGF0dHJzOworICAgICAgICAgICAgbUNvbnRyb2xUeXBlID0gY29udHJvbFR5cGU7CisgICAgICAgICAgICBtTWF4Vm9sdW1lID0gbWF4OworICAgICAgICAgICAgbUN1cnJlbnRWb2x1bWUgPSBjdXJyZW50OworICAgICAgICAgICAgbUluc3RhbmNlID0gbmV3IFBsYXliYWNrSW5mbyh0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGdldFBsYXliYWNrVHlwZV9pbXBsKCkgeworICAgICAgICAgICAgcmV0dXJuIG1QbGF5YmFja1R5cGU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEF1ZGlvQXR0cmlidXRlcyBnZXRBdWRpb0F0dHJpYnV0ZXNfaW1wbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQXVkaW9BdHRyczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGdldENvbnRyb2xUeXBlX2ltcGwoKSB7CisgICAgICAgICAgICByZXR1cm4gbUNvbnRyb2xUeXBlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0TWF4Vm9sdW1lX2ltcGwoKSB7CisgICAgICAgICAgICByZXR1cm4gbU1heFZvbHVtZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGdldEN1cnJlbnRWb2x1bWVfaW1wbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ3VycmVudFZvbHVtZTsKKyAgICAgICAgfQorCisgICAgICAgIFBsYXliYWNrSW5mbyBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7CisgICAgICAgIH0KKworICAgICAgICBCdW5kbGUgdG9CdW5kbGUoKSB7CisgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgYnVuZGxlLnB1dEludChLRVlfUExBWUJBQ0tfVFlQRSwgbVBsYXliYWNrVHlwZSk7CisgICAgICAgICAgICBidW5kbGUucHV0SW50KEtFWV9DT05UUk9MX1RZUEUsIG1Db250cm9sVHlwZSk7CisgICAgICAgICAgICBidW5kbGUucHV0SW50KEtFWV9NQVhfVk9MVU1FLCBtTWF4Vm9sdW1lKTsKKyAgICAgICAgICAgIGJ1bmRsZS5wdXRJbnQoS0VZX0NVUlJFTlRfVk9MVU1FLCBtQ3VycmVudFZvbHVtZSk7CisgICAgICAgICAgICBidW5kbGUucHV0UGFyY2VsYWJsZShLRVlfQVVESU9fQVRUUklCVVRFUywgbUF1ZGlvQXR0cnMpOworICAgICAgICAgICAgcmV0dXJuIGJ1bmRsZTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBQbGF5YmFja0luZm8gY3JlYXRlUGxheWJhY2tJbmZvKGludCBwbGF5YmFja1R5cGUsIEF1ZGlvQXR0cmlidXRlcyBhdHRycywKKyAgICAgICAgICAgICAgICBpbnQgY29udHJvbFR5cGUsIGludCBtYXgsIGludCBjdXJyZW50KSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFBsYXliYWNrSW5mb0ltcGwocGxheWJhY2tUeXBlLCBhdHRycywgY29udHJvbFR5cGUsIG1heCwgY3VycmVudCkKKyAgICAgICAgICAgICAgICAgICAgLmdldEluc3RhbmNlKCk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgUGxheWJhY2tJbmZvIGZyb21CdW5kbGUoQnVuZGxlIGJ1bmRsZSkgeworICAgICAgICAgICAgaWYgKGJ1bmRsZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBpbnQgdm9sdW1lVHlwZSA9IGJ1bmRsZS5nZXRJbnQoS0VZX1BMQVlCQUNLX1RZUEUpOworICAgICAgICAgICAgZmluYWwgaW50IHZvbHVtZUNvbnRyb2wgPSBidW5kbGUuZ2V0SW50KEtFWV9DT05UUk9MX1RZUEUpOworICAgICAgICAgICAgZmluYWwgaW50IG1heFZvbHVtZSA9IGJ1bmRsZS5nZXRJbnQoS0VZX01BWF9WT0xVTUUpOworICAgICAgICAgICAgZmluYWwgaW50IGN1cnJlbnRWb2x1bWUgPSBidW5kbGUuZ2V0SW50KEtFWV9DVVJSRU5UX1ZPTFVNRSk7CisgICAgICAgICAgICBmaW5hbCBBdWRpb0F0dHJpYnV0ZXMgYXR0cnMgPSBidW5kbGUuZ2V0UGFyY2VsYWJsZShLRVlfQVVESU9fQVRUUklCVVRFUyk7CisKKyAgICAgICAgICAgIHJldHVybiBjcmVhdGVQbGF5YmFja0luZm8odm9sdW1lVHlwZSwgYXR0cnMsIHZvbHVtZUNvbnRyb2wsIG1heFZvbHVtZSwgY3VycmVudFZvbHVtZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhQ29udHJvbGxlcjJTdHViLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhQ29udHJvbGxlcjJTdHViLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNmYzVkZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFDb250cm9sbGVyMlN0dWIuamF2YQpAQCAtMCwwICsxLDQ3MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvbnRyb2xsZXIyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5Db21tYW5kQnV0dG9uOworaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmRHcm91cDI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYUNvbnRyb2xsZXIySW1wbC5QbGF5YmFja0luZm9JbXBsOworaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjJJbXBsLkNvbW1hbmRCdXR0b25JbXBsOworCitpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBNZWRpYUNvbnRyb2xsZXIyU3R1YiBleHRlbmRzIElNZWRpYUNvbnRyb2xsZXIyLlN0dWIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFDb250cm9sbGVyMlN0dWIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSB0cnVlOyAvLyBUT0RPKGphZXdhbik6IENoYW5nZQorCisgICAgcHJpdmF0ZSBmaW5hbCBXZWFrUmVmZXJlbmNlPE1lZGlhQ29udHJvbGxlcjJJbXBsPiBtQ29udHJvbGxlcjsKKworICAgIE1lZGlhQ29udHJvbGxlcjJTdHViKE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXIpIHsKKyAgICAgICAgbUNvbnRyb2xsZXIgPSBuZXcgV2Vha1JlZmVyZW5jZTw+KGNvbnRyb2xsZXIpOworICAgIH0KKworICAgIHByaXZhdGUgTWVkaWFDb250cm9sbGVyMkltcGwgZ2V0Q29udHJvbGxlcigpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyID0gbUNvbnRyb2xsZXIuZ2V0KCk7CisgICAgICAgIGlmIChjb250cm9sbGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNvbnRyb2xsZXIgaXMgcmVsZWFzZWQiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29udHJvbGxlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIE1lZGlhQnJvd3NlcjJJbXBsIGdldEJyb3dzZXIoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKKyAgICAgICAgaWYgKGNvbnRyb2xsZXIgaW5zdGFuY2VvZiBNZWRpYUJyb3dzZXIySW1wbCkgeworICAgICAgICAgICAgcmV0dXJuIChNZWRpYUJyb3dzZXIySW1wbCkgY29udHJvbGxlcjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgeworICAgICAgICBtQ29udHJvbGxlci5jbGVhcigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uUGxheWVyU3RhdGVDaGFuZ2VkKGludCBzdGF0ZSkgeworICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNvbnRyb2xsZXIucHVzaFBsYXllclN0YXRlQ2hhbmdlcyhzdGF0ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25Qb3NpdGlvbkNoYW5nZWQobG9uZyBldmVudFRpbWVNcywgbG9uZyBwb3NpdGlvbk1zKSB7CisgICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGV2ZW50VGltZU1zIDwgMCkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAib25Qb3NpdGlvbkNoYW5nZWQoKTogSWdub3JpbmcgbmVnYXRpdmUgZXZlbnRUaW1lTXMiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAocG9zaXRpb25NcyA8IDApIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIm9uUG9zaXRpb25DaGFuZ2VkKCk6IElnbm9yaW5nIG5lZ2F0aXZlIHBvc2l0aW9uTXMiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBjb250cm9sbGVyLnB1c2hQb3NpdGlvbkNoYW5nZXMoZXZlbnRUaW1lTXMsIHBvc2l0aW9uTXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uUGxheWJhY2tTcGVlZENoYW5nZWQoZmxvYXQgc3BlZWQpIHsKKyAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBjb250cm9sbGVyLnB1c2hQbGF5YmFja1NwZWVkQ2hhbmdlcyhzcGVlZCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25CdWZmZXJlZFBvc2l0aW9uQ2hhbmdlZChsb25nIGJ1ZmZlcmVkUG9zaXRpb25NcykgeworICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChidWZmZXJlZFBvc2l0aW9uTXMgPCAwKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJvbkJ1ZmZlcmVkUG9zaXRpb25DaGFuZ2VkKCk6IElnbm9yaW5nIG5lZ2F0aXZlIGJ1ZmZlcmVkUG9zaXRpb25NcyIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNvbnRyb2xsZXIucHVzaEJ1ZmZlcmVkUG9zaXRpb25DaGFuZ2VzKGJ1ZmZlcmVkUG9zaXRpb25Ncyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25QbGF5bGlzdENoYW5nZWQoTGlzdDxCdW5kbGU+IHBsYXlsaXN0QnVuZGxlLCBCdW5kbGUgbWV0YWRhdGFCdW5kbGUpIHsKKyAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAocGxheWxpc3RCdW5kbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAib25QbGF5bGlzdENoYW5nZWQoKTogSWdub3JpbmcgbnVsbCBwbGF5bGlzdCBmcm9tICIgKyBjb250cm9sbGVyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZvciAoQnVuZGxlIGJ1bmRsZSA6IHBsYXlsaXN0QnVuZGxlKSB7CisgICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBNZWRpYUl0ZW0yLmZyb21CdW5kbGUoYnVuZGxlKTsKKyAgICAgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJvblBsYXlsaXN0Q2hhbmdlZCgpOiBJZ25vcmluZyBudWxsIGl0ZW0gaW4gcGxheWxpc3QiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGxheWxpc3QuYWRkKGl0ZW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhID0gTWVkaWFNZXRhZGF0YTIuZnJvbUJ1bmRsZShtZXRhZGF0YUJ1bmRsZSk7CisgICAgICAgIGNvbnRyb2xsZXIucHVzaFBsYXlsaXN0Q2hhbmdlcyhwbGF5bGlzdCwgbWV0YWRhdGEpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWQoQnVuZGxlIG1ldGFkYXRhQnVuZGxlKSB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEgPSBNZWRpYU1ldGFkYXRhMi5mcm9tQnVuZGxlKG1ldGFkYXRhQnVuZGxlKTsKKyAgICAgICAgY29udHJvbGxlci5wdXNoUGxheWxpc3RNZXRhZGF0YUNoYW5nZXMobWV0YWRhdGEpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uUmVwZWF0TW9kZUNoYW5nZWQoaW50IHJlcGVhdE1vZGUpIHsKKyAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBjb250cm9sbGVyLnB1c2hSZXBlYXRNb2RlQ2hhbmdlcyhyZXBlYXRNb2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblBsYXliYWNrSW5mb0NoYW5nZWQoQnVuZGxlIHBsYXliYWNrSW5mbykgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24geworICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIm9uUGxheWJhY2tJbmZvQ2hhbmdlZCIpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgTWVkaWFDb250cm9sbGVyMi5QbGF5YmFja0luZm8gaW5mbyA9IFBsYXliYWNrSW5mb0ltcGwuZnJvbUJ1bmRsZShwbGF5YmFja0luZm8pOworICAgICAgICBpZiAoaW5mbyA9PSBudWxsKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJvblBsYXliYWNrSW5mb0NoYW5nZWQoKTogSWdub3JpbmcgbnVsbCBwbGF5YmFja0luZm8iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBjb250cm9sbGVyLnB1c2hQbGF5YmFja0luZm9DaGFuZ2VzKGluZm8pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU2h1ZmZsZU1vZGVDaGFuZ2VkKGludCBzaHVmZmxlTW9kZSkgeworICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNvbnRyb2xsZXIucHVzaFNodWZmbGVNb2RlQ2hhbmdlcyhzaHVmZmxlTW9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25FcnJvcihpbnQgZXJyb3JDb2RlLCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgY29udHJvbGxlci5wdXNoRXJyb3IoZXJyb3JDb2RlLCBleHRyYXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ29ubmVjdGVkKElNZWRpYVNlc3Npb24yIHNlc3Npb25CaW5kZXIsIEJ1bmRsZSBjb21tYW5kR3JvdXAsCisgICAgICAgICAgICBpbnQgcGxheWVyU3RhdGUsIGxvbmcgcG9zaXRpb25FdmVudFRpbWVNcywgbG9uZyBwb3NpdGlvbk1zLCBmbG9hdCBwbGF5YmFja1NwZWVkLAorICAgICAgICAgICAgbG9uZyBidWZmZXJlZFBvc2l0aW9uTXMsIEJ1bmRsZSBwbGF5YmFja0luZm8sIGludCBzaHVmZmxlTW9kZSwgaW50IHJlcGVhdE1vZGUsCisgICAgICAgICAgICBMaXN0PEJ1bmRsZT4gaXRlbUJ1bmRsZUxpc3QsIFBlbmRpbmdJbnRlbnQgc2Vzc2lvbkFjdGl2aXR5KSB7CisgICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXIgPSBtQ29udHJvbGxlci5nZXQoKTsKKyAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25Db25uZWN0ZWQgYWZ0ZXIgTWVkaWFDb250cm9sbGVyMi5jbG9zZSgpIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gY29udHJvbGxlci5nZXRDb250ZXh0KCk7CisgICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gaXRlbUxpc3QgPSBudWxsOworICAgICAgICBpZiAoaXRlbUJ1bmRsZUxpc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgaXRlbUxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbUJ1bmRsZUxpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBNZWRpYUl0ZW0yLmZyb21CdW5kbGUoaXRlbUJ1bmRsZUxpc3QuZ2V0KGkpKTsKKyAgICAgICAgICAgICAgICBpZiAoaXRlbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGl0ZW1MaXN0LmFkZChpdGVtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29udHJvbGxlci5vbkNvbm5lY3RlZE5vdExvY2tlZChzZXNzaW9uQmluZGVyLAorICAgICAgICAgICAgICAgIFNlc3Npb25Db21tYW5kR3JvdXAyLmZyb21CdW5kbGUoY29tbWFuZEdyb3VwKSwKKyAgICAgICAgICAgICAgICBwbGF5ZXJTdGF0ZSwgcG9zaXRpb25FdmVudFRpbWVNcywgcG9zaXRpb25NcywgcGxheWJhY2tTcGVlZCwgYnVmZmVyZWRQb3NpdGlvbk1zLAorICAgICAgICAgICAgICAgIFBsYXliYWNrSW5mb0ltcGwuZnJvbUJ1bmRsZShwbGF5YmFja0luZm8pLCByZXBlYXRNb2RlLCBzaHVmZmxlTW9kZSwKKyAgICAgICAgICAgICAgICBpdGVtTGlzdCwgc2Vzc2lvbkFjdGl2aXR5KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkRpc2Nvbm5lY3RlZCgpIHsKKyAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlciA9IG1Db250cm9sbGVyLmdldCgpOworICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvbkRpc2Nvbm5lY3RlZCBhZnRlciBNZWRpYUNvbnRyb2xsZXIyLmNsb3NlKCkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBjb250cm9sbGVyLmdldEluc3RhbmNlKCkuY2xvc2UoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkN1c3RvbUxheW91dENoYW5nZWQoTGlzdDxCdW5kbGU+IGNvbW1hbmRCdXR0b25saXN0KSB7CisgICAgICAgIGlmIChjb21tYW5kQnV0dG9ubGlzdCA9PSBudWxsKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJvbkN1c3RvbUxheW91dENoYW5nZWQoKTogSWdub3JpbmcgbnVsbCBjb21tYW5kQnV0dG9ubGlzdCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBSZXZpc2l0IGhlcmUuIENvdWxkIGJlIGEgYnVnCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgTGlzdDxDb21tYW5kQnV0dG9uPiBsYXlvdXQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21tYW5kQnV0dG9ubGlzdC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgQ29tbWFuZEJ1dHRvbiBidXR0b24gPSBDb21tYW5kQnV0dG9uSW1wbC5mcm9tQnVuZGxlKGNvbW1hbmRCdXR0b25saXN0LmdldChpKSk7CisgICAgICAgICAgICBpZiAoYnV0dG9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBsYXlvdXQuYWRkKGJ1dHRvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29udHJvbGxlci5vbkN1c3RvbUxheW91dENoYW5nZWQobGF5b3V0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkFsbG93ZWRDb21tYW5kc0NoYW5nZWQoQnVuZGxlIGNvbW1hbmRzQnVuZGxlKSB7CisgICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBSZXZpc2l0IGhlcmUuIENvdWxkIGJlIGEgYnVnCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU2Vzc2lvbkNvbW1hbmRHcm91cDIgY29tbWFuZHMgPSBTZXNzaW9uQ29tbWFuZEdyb3VwMi5mcm9tQnVuZGxlKGNvbW1hbmRzQnVuZGxlKTsKKyAgICAgICAgaWYgKGNvbW1hbmRzID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIm9uQWxsb3dlZENvbW1hbmRzQ2hhbmdlZCgpOiBJZ25vcmluZyBudWxsIGNvbW1hbmRzIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgY29udHJvbGxlci5vbkFsbG93ZWRDb21tYW5kc0NoYW5nZWQoY29tbWFuZHMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3VzdG9tQ29tbWFuZChCdW5kbGUgY29tbWFuZEJ1bmRsZSwgQnVuZGxlIGFyZ3MsIFJlc3VsdFJlY2VpdmVyIHJlY2VpdmVyKSB7CisgICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQgPSBTZXNzaW9uQ29tbWFuZDIuZnJvbUJ1bmRsZShjb21tYW5kQnVuZGxlKTsKKyAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAib25DdXN0b21Db21tYW5kKCk6IElnbm9yaW5nIG51bGwgY29tbWFuZCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNvbnRyb2xsZXIub25DdXN0b21Db21tYW5kKGNvbW1hbmQsIGFyZ3MsIHJlY2VpdmVyKTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIE1lZGlhQnJvd3NlciBzcGVjaWZpYworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25HZXRMaWJyYXJ5Um9vdERvbmUoQnVuZGxlIHJvb3RIaW50cywgU3RyaW5nIHJvb3RNZWRpYUlkLCBCdW5kbGUgcm9vdEV4dHJhKQorICAgICAgICAgICAgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24geworICAgICAgICBmaW5hbCBNZWRpYUJyb3dzZXIySW1wbCBicm93c2VyOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYnJvd3NlciA9IGdldEJyb3dzZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChicm93c2VyID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogUmV2aXNpdCBoZXJlLiBDb3VsZCBiZSBhIGJ1ZworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGJyb3dzZXIub25HZXRMaWJyYXJ5Um9vdERvbmUocm9vdEhpbnRzLCByb290TWVkaWFJZCwgcm9vdEV4dHJhKTsKKyAgICB9CisKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uR2V0SXRlbURvbmUoU3RyaW5nIG1lZGlhSWQsIEJ1bmRsZSBpdGVtQnVuZGxlKSB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChtZWRpYUlkID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIm9uR2V0SXRlbURvbmUoKTogSWdub3JpbmcgbnVsbCBtZWRpYUlkIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgTWVkaWFCcm93c2VyMkltcGwgYnJvd3NlcjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJyb3dzZXIgPSBnZXRCcm93c2VyKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnJvd3NlciA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJldmlzaXQgaGVyZS4gQ291bGQgYmUgYSBidWcKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBicm93c2VyLm9uR2V0SXRlbURvbmUobWVkaWFJZCwgTWVkaWFJdGVtMi5mcm9tQnVuZGxlKGl0ZW1CdW5kbGUpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkdldENoaWxkcmVuRG9uZShTdHJpbmcgcGFyZW50SWQsIGludCBwYWdlLCBpbnQgcGFnZVNpemUsCisgICAgICAgICAgICBMaXN0PEJ1bmRsZT4gaXRlbUJ1bmRsZUxpc3QsIEJ1bmRsZSBleHRyYXMpIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIm9uR2V0Q2hpbGRyZW5Eb25lKCk6IElnbm9yaW5nIG51bGwgcGFyZW50SWQiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBNZWRpYUJyb3dzZXIySW1wbCBicm93c2VyOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYnJvd3NlciA9IGdldEJyb3dzZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChicm93c2VyID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogUmV2aXNpdCBoZXJlLiBDb3VsZCBiZSBhIGJ1ZworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiByZXN1bHQgPSBudWxsOworICAgICAgICBpZiAoaXRlbUJ1bmRsZUxpc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICBmb3IgKEJ1bmRsZSBidW5kbGUgOiBpdGVtQnVuZGxlTGlzdCkgeworICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoTWVkaWFJdGVtMi5mcm9tQnVuZGxlKGJ1bmRsZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyb3dzZXIub25HZXRDaGlsZHJlbkRvbmUocGFyZW50SWQsIHBhZ2UsIHBhZ2VTaXplLCByZXN1bHQsIGV4dHJhcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TZWFyY2hSZXN1bHRDaGFuZ2VkKFN0cmluZyBxdWVyeSwgaW50IGl0ZW1Db3VudCwgQnVuZGxlIGV4dHJhcykKKyAgICAgICAgICAgIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAib25TZWFyY2hSZXN1bHRDaGFuZ2VkKCk6IElnbm9yaW5nIGVtcHR5IHF1ZXJ5Iik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgTWVkaWFCcm93c2VyMkltcGwgYnJvd3NlcjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJyb3dzZXIgPSBnZXRCcm93c2VyKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnJvd3NlciA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJldmlzaXQgaGVyZS4gQ291bGQgYmUgYSBidWcKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBicm93c2VyLm9uU2VhcmNoUmVzdWx0Q2hhbmdlZChxdWVyeSwgaXRlbUNvdW50LCBleHRyYXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uR2V0U2VhcmNoUmVzdWx0RG9uZShTdHJpbmcgcXVlcnksIGludCBwYWdlLCBpbnQgcGFnZVNpemUsCisgICAgICAgICAgICBMaXN0PEJ1bmRsZT4gaXRlbUJ1bmRsZUxpc3QsIEJ1bmRsZSBleHRyYXMpIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAib25HZXRTZWFyY2hSZXN1bHREb25lKCk6IElnbm9yaW5nIGVtcHR5IHF1ZXJ5Iik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgTWVkaWFCcm93c2VyMkltcGwgYnJvd3NlcjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJyb3dzZXIgPSBnZXRCcm93c2VyKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnJvd3NlciA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJldmlzaXQgaGVyZS4gQ291bGQgYmUgYSBidWcKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgaWYgKGl0ZW1CdW5kbGVMaXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgZm9yIChCdW5kbGUgYnVuZGxlIDogaXRlbUJ1bmRsZUxpc3QpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkKE1lZGlhSXRlbTIuZnJvbUJ1bmRsZShidW5kbGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicm93c2VyLm9uR2V0U2VhcmNoUmVzdWx0RG9uZShxdWVyeSwgcGFnZSwgcGFnZVNpemUsIHJlc3VsdCwgZXh0cmFzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNoaWxkcmVuQ2hhbmdlZChTdHJpbmcgcGFyZW50SWQsIGludCBpdGVtQ291bnQsIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIm9uQ2hpbGRyZW5DaGFuZ2VkKCk6IElnbm9yaW5nIG51bGwgcGFyZW50SWQiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBNZWRpYUJyb3dzZXIySW1wbCBicm93c2VyOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYnJvd3NlciA9IGdldEJyb3dzZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChicm93c2VyID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogUmV2aXNpdCBoZXJlLiBDb3VsZCBiZSBhIGJ1ZworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGJyb3dzZXIub25DaGlsZHJlbkNoYW5nZWQocGFyZW50SWQsIGl0ZW1Db3VudCwgZXh0cmFzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhSXRlbTJJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhSXRlbTJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEwYTBmMQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFJdGVtMkltcGwuamF2YQpAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTIuRkxBR19CUk9XU0FCTEU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMi5GTEFHX1BMQVlBQkxFOworCitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuRGF0YVNvdXJjZURlc2M7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMi5CdWlsZGVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMi5GbGFnczsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOworaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhSXRlbTJQcm92aWRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworCitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CisKK3B1YmxpYyBjbGFzcyBNZWRpYUl0ZW0ySW1wbCBpbXBsZW1lbnRzIE1lZGlhSXRlbTJQcm92aWRlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9JRCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhaXRlbTIuaWQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRkxBR1MgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWl0ZW0yLmZsYWdzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX01FVEFEQVRBID0gImFuZHJvaWQubWVkaWEubWVkaWFpdGVtMi5tZXRhZGF0YSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9VVUlEID0gImFuZHJvaWQubWVkaWEubWVkaWFpdGVtMi51dWlkIjsKKworICAgIHByaXZhdGUgZmluYWwgTWVkaWFJdGVtMiBtSW5zdGFuY2U7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUlkOworICAgIHByaXZhdGUgZmluYWwgaW50IG1GbGFnczsKKyAgICBwcml2YXRlIGZpbmFsIFVVSUQgbVVVSUQ7CisgICAgcHJpdmF0ZSBNZWRpYU1ldGFkYXRhMiBtTWV0YWRhdGE7CisgICAgcHJpdmF0ZSBEYXRhU291cmNlRGVzYyBtRGF0YVNvdXJjZURlc2M7CisKKyAgICAvLyBGcm9tIHRoZSBwdWJsaWMgQVBJCisgICAgcHVibGljIE1lZGlhSXRlbTJJbXBsKEBOb25OdWxsIFN0cmluZyBtZWRpYUlkLCBATnVsbGFibGUgRGF0YVNvdXJjZURlc2MgZHNkLAorICAgICAgICAgICAgQE51bGxhYmxlIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhLCBARmxhZ3MgaW50IGZsYWdzKSB7CisgICAgICAgIHRoaXMobWVkaWFJZCwgZHNkLCBtZXRhZGF0YSwgZmxhZ3MsIG51bGwpOworICAgIH0KKworICAgIHByaXZhdGUgTWVkaWFJdGVtMkltcGwoQE5vbk51bGwgU3RyaW5nIG1lZGlhSWQsIEBOdWxsYWJsZSBEYXRhU291cmNlRGVzYyBkc2QsCisgICAgICAgICAgICBATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEsIEBGbGFncyBpbnQgZmxhZ3MsIEBOdWxsYWJsZSBVVUlEIHV1aWQpIHsKKyAgICAgICAgaWYgKG1lZGlhSWQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWVkaWFJZCBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGlmIChtZXRhZGF0YSAhPSBudWxsICYmICFUZXh0VXRpbHMuZXF1YWxzKG1lZGlhSWQsIG1ldGFkYXRhLmdldE1lZGlhSWQoKSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm1ldGFkYXRhJ3MgaWQgc2hvdWxkIGJlIG1hdGNoZWQgd2l0aCB0aGUgbWVkaWFpZCIpOworICAgICAgICB9CisKKyAgICAgICAgbUlkID0gbWVkaWFJZDsKKyAgICAgICAgbURhdGFTb3VyY2VEZXNjID0gZHNkOworICAgICAgICBtTWV0YWRhdGEgPSBtZXRhZGF0YTsKKyAgICAgICAgbUZsYWdzID0gZmxhZ3M7CisgICAgICAgIG1VVUlEID0gKHV1aWQgPT0gbnVsbCkgPyBVVUlELnJhbmRvbVVVSUQoKSA6IHV1aWQ7CisKKyAgICAgICAgbUluc3RhbmNlID0gbmV3IE1lZGlhSXRlbTIodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzX2ltcGwoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBNZWRpYUl0ZW0yKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIE1lZGlhSXRlbTIgb3RoZXIgPSAoTWVkaWFJdGVtMikgb2JqOworICAgICAgICByZXR1cm4gbVVVSUQuZXF1YWxzKCgoTWVkaWFJdGVtMkltcGwpIG90aGVyLmdldFByb3ZpZGVyKCkpLm1VVUlEKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhpcyBvYmplY3QgYXMgYSBidW5kbGUgdG8gc2hhcmUgYmV0d2VlbiBwcm9jZXNzZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgbmV3IGJ1bmRsZSBpbnN0YW5jZQorICAgICAqLworICAgIHB1YmxpYyBCdW5kbGUgdG9CdW5kbGVfaW1wbCgpIHsKKyAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgYnVuZGxlLnB1dFN0cmluZyhLRVlfSUQsIG1JZCk7CisgICAgICAgIGJ1bmRsZS5wdXRJbnQoS0VZX0ZMQUdTLCBtRmxhZ3MpOworICAgICAgICBpZiAobU1ldGFkYXRhICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJ1bmRsZS5wdXRCdW5kbGUoS0VZX01FVEFEQVRBLCBtTWV0YWRhdGEudG9CdW5kbGUoKSk7CisgICAgICAgIH0KKyAgICAgICAgYnVuZGxlLnB1dFN0cmluZyhLRVlfVVVJRCwgbVVVSUQudG9TdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBidW5kbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgTWVkaWFJdGVtMiBmcm9tIHRoZSB7QGxpbmsgQnVuZGxlfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBidW5kbGUgVGhlIGJ1bmRsZSB3aGljaCB3YXMgcHVibGlzaGVkIGJ5IHtAbGluayBNZWRpYUl0ZW0yI3RvQnVuZGxlKCl9LgorICAgICAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgTWVkaWFJdGVtMgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFJdGVtMiBmcm9tQnVuZGxlX2ltcGwoQE5vbk51bGwgQnVuZGxlIGJ1bmRsZSkgeworICAgICAgICBpZiAoYnVuZGxlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFN0cmluZyB1dWlkU3RyaW5nID0gYnVuZGxlLmdldFN0cmluZyhLRVlfVVVJRCk7CisgICAgICAgIHJldHVybiBmcm9tQnVuZGxlKGJ1bmRsZSwgVVVJRC5mcm9tU3RyaW5nKHV1aWRTdHJpbmcpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBNZWRpYUl0ZW0yIGZyb20gdGhlIHtAbGluayBCdW5kbGV9IHdpdGggdGhlIHNwZWNpZmllZCB7QGxpbmsgVVVJRH0uCisgICAgICogSWYge0BsaW5rIFVVSUR9CisgICAgICogY2FuIGJlIG51bGwgZm9yIGNyZWF0aW5nIG5ldy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBidW5kbGUgVGhlIGJ1bmRsZSB3aGljaCB3YXMgcHVibGlzaGVkIGJ5IHtAbGluayBNZWRpYUl0ZW0yI3RvQnVuZGxlKCl9LgorICAgICAqIEBwYXJhbSB1dWlkIEEge0BsaW5rIFVVSUR9IHRvIG92ZXJyaWRlLiBDYW4gYmUge0BsaW5rIG51bGx9IGZvciBvdmVycmlkZS4KKyAgICAgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIE1lZGlhSXRlbTIKKyAgICAgKi8KKyAgICBzdGF0aWMgTWVkaWFJdGVtMiBmcm9tQnVuZGxlKEBOb25OdWxsIEJ1bmRsZSBidW5kbGUsIEBOdWxsYWJsZSBVVUlEIHV1aWQpIHsKKyAgICAgICAgaWYgKGJ1bmRsZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBTdHJpbmcgaWQgPSBidW5kbGUuZ2V0U3RyaW5nKEtFWV9JRCk7CisgICAgICAgIGZpbmFsIEJ1bmRsZSBtZXRhZGF0YUJ1bmRsZSA9IGJ1bmRsZS5nZXRCdW5kbGUoS0VZX01FVEFEQVRBKTsKKyAgICAgICAgZmluYWwgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEgPSBNZWRpYU1ldGFkYXRhMi5mcm9tQnVuZGxlKG1ldGFkYXRhQnVuZGxlKTsKKyAgICAgICAgZmluYWwgaW50IGZsYWdzID0gYnVuZGxlLmdldEludChLRVlfRkxBR1MpOworICAgICAgICByZXR1cm4gbmV3IE1lZGlhSXRlbTJJbXBsKGlkLCBudWxsLCBtZXRhZGF0YSwgZmxhZ3MsIHV1aWQpLmdldEluc3RhbmNlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBNZWRpYUl0ZW0yIGdldEluc3RhbmNlKCkgeworICAgICAgICByZXR1cm4gbUluc3RhbmNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmdfaW1wbCgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJNZWRpYUl0ZW0yeyIpOworICAgICAgICBzYi5hcHBlbmQoIm1GbGFncz0iKS5hcHBlbmQobUZsYWdzKTsKKyAgICAgICAgc2IuYXBwZW5kKCIsIG1NZXRhZGF0YT0iKS5hcHBlbmQobU1ldGFkYXRhKTsKKyAgICAgICAgc2IuYXBwZW5kKCd9Jyk7CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBARmxhZ3MgaW50IGdldEZsYWdzX2ltcGwoKSB7CisgICAgICAgIHJldHVybiBtRmxhZ3M7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNCcm93c2FibGVfaW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIChtRmxhZ3MgJiBGTEFHX0JST1dTQUJMRSkgIT0gMDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1BsYXlhYmxlX2ltcGwoKSB7CisgICAgICAgIHJldHVybiAobUZsYWdzICYgRkxBR19QTEFZQUJMRSkgIT0gMDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRNZXRhZGF0YV9pbXBsKEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgeworICAgICAgICBpZiAobWV0YWRhdGEgIT0gbnVsbCAmJiAhVGV4dFV0aWxzLmVxdWFscyhtSWQsIG1ldGFkYXRhLmdldE1lZGlhSWQoKSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm1ldGFkYXRhJ3MgaWQgc2hvdWxkIGJlIG1hdGNoZWQgd2l0aCB0aGUgbWVkaWFJZCIpOworICAgICAgICB9CisgICAgICAgIG1NZXRhZGF0YSA9IG1ldGFkYXRhOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgZ2V0TWV0YWRhdGFfaW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIG1NZXRhZGF0YTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQE5vbk51bGwgU3RyaW5nIGdldE1lZGlhSWRfaW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIG1JZDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQE51bGxhYmxlIERhdGFTb3VyY2VEZXNjIGdldERhdGFTb3VyY2VEZXNjX2ltcGwoKSB7CisgICAgICAgIHJldHVybiBtRGF0YVNvdXJjZURlc2M7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVySW1wbCBpbXBsZW1lbnRzIE1lZGlhSXRlbTJQcm92aWRlci5CdWlsZGVyUHJvdmlkZXIgeworICAgICAgICBwcml2YXRlIEJ1aWxkZXIgbUluc3RhbmNlOworICAgICAgICBwcml2YXRlIEBGbGFncyBpbnQgbUZsYWdzOworICAgICAgICBwcml2YXRlIFN0cmluZyBtTWVkaWFJZDsKKyAgICAgICAgcHJpdmF0ZSBNZWRpYU1ldGFkYXRhMiBtTWV0YWRhdGE7CisgICAgICAgIHByaXZhdGUgRGF0YVNvdXJjZURlc2MgbURhdGFTb3VyY2VEZXNjOworCisgICAgICAgIHB1YmxpYyBCdWlsZGVySW1wbChCdWlsZGVyIGluc3RhbmNlLCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOworICAgICAgICAgICAgbUZsYWdzID0gZmxhZ3M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0TWVkaWFJZF9pbXBsKEBOdWxsYWJsZSBTdHJpbmcgbWVkaWFJZCkgeworICAgICAgICAgICAgbU1lZGlhSWQgPSBtZWRpYUlkOworICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRNZXRhZGF0YV9pbXBsKEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgeworICAgICAgICAgICAgbU1ldGFkYXRhID0gbWV0YWRhdGE7CisgICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldERhdGFTb3VyY2VEZXNjX2ltcGwoQE51bGxhYmxlIERhdGFTb3VyY2VEZXNjIGRhdGFTb3VyY2VEZXNjKSB7CisgICAgICAgICAgICBtRGF0YVNvdXJjZURlc2MgPSBkYXRhU291cmNlRGVzYzsKKyAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE1lZGlhSXRlbTIgYnVpbGRfaW1wbCgpIHsKKyAgICAgICAgICAgIFN0cmluZyBpZCA9IChtTWV0YWRhdGEgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgPyBtTWV0YWRhdGEuZ2V0U3RyaW5nKE1lZGlhTWV0YWRhdGEyLk1FVEFEQVRBX0tFWV9NRURJQV9JRCkgOiBudWxsOworICAgICAgICAgICAgaWYgKGlkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyAgVE9ETyhqYWV3YW4pOiBEb3VibGUgY2hlY2sgaWYgaXRzIHN1ZmZpY2llbnQgKGUuZy4gVXNlIFVVSUQgaW5zdGVhZD8pCisgICAgICAgICAgICAgICAgaWQgPSAobU1lZGlhSWQgIT0gbnVsbCkgPyBtTWVkaWFJZCA6IHRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhSXRlbTJJbXBsKGlkLCBtRGF0YVNvdXJjZURlc2MsIG1NZXRhZGF0YSwgbUZsYWdzKS5nZXRJbnN0YW5jZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUxpYnJhcnlTZXJ2aWNlMkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFMaWJyYXJ5U2VydmljZTJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YzNGNkNAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFMaWJyYXJ5U2VydmljZTJJbXBsLmphdmEKQEAgLTAsMCArMSwxNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMi5MaWJyYXJ5Um9vdDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyLk1lZGlhTGlicmFyeVNlc3Npb247CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMi5NZWRpYUxpYnJhcnlTZXNzaW9uLkJ1aWxkZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMi5NZWRpYUxpYnJhcnlTZXNzaW9uLk1lZGlhTGlicmFyeVNlc3Npb25DYWxsYmFjazsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWxpc3RBZ2VudDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLkNvbnRyb2xsZXJJbmZvOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uU2VydmljZTI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yOworaW1wb3J0IGFuZHJvaWQubWVkaWEuVm9sdW1lUHJvdmlkZXIyOworaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhTGlicmFyeVNlcnZpY2UyUHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKKworaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjJJbXBsLkJ1aWxkZXJCYXNlSW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOworCitwdWJsaWMgY2xhc3MgTWVkaWFMaWJyYXJ5U2VydmljZTJJbXBsIGV4dGVuZHMgTWVkaWFTZXNzaW9uU2VydmljZTJJbXBsIGltcGxlbWVudHMKKyAgICAgICAgTWVkaWFMaWJyYXJ5U2VydmljZTJQcm92aWRlciB7CisgICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVNlc3Npb25TZXJ2aWNlMiBtSW5zdGFuY2U7CisgICAgcHJpdmF0ZSBNZWRpYUxpYnJhcnlTZXNzaW9uIG1MaWJyYXJ5U2Vzc2lvbjsKKworICAgIHB1YmxpYyBNZWRpYUxpYnJhcnlTZXJ2aWNlMkltcGwoTWVkaWFMaWJyYXJ5U2VydmljZTIgaW5zdGFuY2UpIHsKKyAgICAgICAgc3VwZXIoaW5zdGFuY2UpOworICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZV9pbXBsKCkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZV9pbXBsKCk7CisKKyAgICAgICAgLy8gRWZmZWN0aXZlbHkgZmluYWwKKyAgICAgICAgTWVkaWFTZXNzaW9uMiBzZXNzaW9uID0gZ2V0U2Vzc2lvbigpOworICAgICAgICBpZiAoIShzZXNzaW9uIGluc3RhbmNlb2YgTWVkaWFMaWJyYXJ5U2Vzc2lvbikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeHBlY3RlZCBNZWRpYUxpYnJhcnlTZXNzaW9uLCBidXQgcmV0dXJuZWQgTWVkaWFTZXNzaW9uMiIpOworICAgICAgICB9CisgICAgICAgIG1MaWJyYXJ5U2Vzc2lvbiA9IChNZWRpYUxpYnJhcnlTZXNzaW9uKSBnZXRTZXNzaW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgaW50IGdldFNlc3Npb25UeXBlKCkgeworICAgICAgICByZXR1cm4gU2Vzc2lvblRva2VuMi5UWVBFX0xJQlJBUllfU0VSVklDRTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1lZGlhTGlicmFyeVNlc3Npb25JbXBsIGV4dGVuZHMgTWVkaWFTZXNzaW9uMkltcGwKKyAgICAgICAgICAgIGltcGxlbWVudHMgTWVkaWFMaWJyYXJ5U2Vzc2lvblByb3ZpZGVyIHsKKyAgICAgICAgcHVibGljIE1lZGlhTGlicmFyeVNlc3Npb25JbXBsKENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICBNZWRpYVBsYXllckJhc2UgcGxheWVyLCBTdHJpbmcgaWQsIE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LAorICAgICAgICAgICAgICAgIFZvbHVtZVByb3ZpZGVyMiB2b2x1bWVQcm92aWRlciwKKyAgICAgICAgICAgICAgICBQZW5kaW5nSW50ZW50IHNlc3Npb25BY3Rpdml0eSwgRXhlY3V0b3IgY2FsbGJhY2tFeGVjdXRvciwKKyAgICAgICAgICAgICAgICBNZWRpYUxpYnJhcnlTZXNzaW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHBsYXllciwgaWQsIHBsYXlsaXN0QWdlbnQsIHZvbHVtZVByb3ZpZGVyLCBzZXNzaW9uQWN0aXZpdHksCisgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrRXhlY3V0b3IsIGNhbGxiYWNrKTsKKyAgICAgICAgICAgIC8vIERvbid0IHB1dCBhbnkgZXh0cmEgaW5pdGlhbGl6YXRpb24gaGVyZS4gSGVyZSdzIHRoZSByZWFzb24uCisgICAgICAgICAgICAvLyBTeXN0ZW0gc2VydmljZSB3aWxsIHJlY29nbml6ZSB0aGlzIHNlc3Npb24gaW5zaWRlIG9mIHRoZSBzdXBlciBjb25zdHJ1Y3RvciBhbmQgd291bGQKKyAgICAgICAgICAgIC8vIGNvbm5lY3QgdG8gdGhpcyBzZXNzaW9uIGFzc3VtaW5nIHRoYXQgaW5pdGlhbGl6YXRpb24gaXMgZmluaXNoZWQuIEhvd2V2ZXIsIGlmIGFueQorICAgICAgICAgICAgLy8gaW5pdGlhbGl6YXRpb24gbG9naWMgaXMgaGVyZSwgY2FsbHMgZnJvbSB0aGUgc2VydmVyIHdvdWxkIGZhaWwuCisgICAgICAgICAgICAvLyBzZWU6IE1lZGlhU2Vzc2lvbjJTdHViI2Nvbm5lY3QoKQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIE1lZGlhTGlicmFyeVNlc3Npb24gY3JlYXRlSW5zdGFuY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhTGlicmFyeVNlc3Npb24odGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgTWVkaWFMaWJyYXJ5U2Vzc2lvbiBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAoTWVkaWFMaWJyYXJ5U2Vzc2lvbikgc3VwZXIuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBNZWRpYUxpYnJhcnlTZXNzaW9uQ2FsbGJhY2sgZ2V0Q2FsbGJhY2soKSB7CisgICAgICAgICAgICByZXR1cm4gKE1lZGlhTGlicmFyeVNlc3Npb25DYWxsYmFjaykgc3VwZXIuZ2V0Q2FsbGJhY2soKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGlsZHJlbkNoYW5nZWRfaW1wbChDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBTdHJpbmcgcGFyZW50SWQsCisgICAgICAgICAgICAgICAgaW50IGl0ZW1Db3VudCwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbnRyb2xsZXIgc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGFyZW50SWQgc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdldFNlc3Npb25TdHViKCkubm90aWZ5Q2hpbGRyZW5DaGFuZ2VkTm90TG9ja2VkKGNvbnRyb2xsZXIsIHBhcmVudElkLCBpdGVtQ291bnQsCisgICAgICAgICAgICAgICAgICAgIGV4dHJhcyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgbm90aWZ5Q2hpbGRyZW5DaGFuZ2VkX2ltcGwoU3RyaW5nIHBhcmVudElkLCBpbnQgaXRlbUNvdW50LCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgICAgICBpZiAocGFyZW50SWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhcmVudElkIHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnZXRTZXNzaW9uU3R1YigpLm5vdGlmeUNoaWxkcmVuQ2hhbmdlZE5vdExvY2tlZChwYXJlbnRJZCwgaXRlbUNvdW50LCBleHRyYXMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG5vdGlmeVNlYXJjaFJlc3VsdENoYW5nZWRfaW1wbChDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBTdHJpbmcgcXVlcnksCisgICAgICAgICAgICAgICAgaW50IGl0ZW1Db3VudCwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICAgICAgZW5zdXJlQ2FsbGluZ1RocmVhZCgpOworICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbnRyb2xsZXIgc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJxdWVyeSBzaG91bGRuJ3QgYmUgZW1wdHkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdldFNlc3Npb25TdHViKCkubm90aWZ5U2VhcmNoUmVzdWx0Q2hhbmdlZChjb250cm9sbGVyLCBxdWVyeSwgaXRlbUNvdW50LCBleHRyYXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVySW1wbAorICAgICAgICAgICAgZXh0ZW5kcyBCdWlsZGVyQmFzZUltcGw8TWVkaWFMaWJyYXJ5U2Vzc2lvbiwgTWVkaWFMaWJyYXJ5U2Vzc2lvbkNhbGxiYWNrPiB7CisgICAgICAgIHB1YmxpYyBCdWlsZGVySW1wbChNZWRpYUxpYnJhcnlTZXJ2aWNlMiBzZXJ2aWNlLCBCdWlsZGVyIGluc3RhbmNlLAorICAgICAgICAgICAgICAgIEV4ZWN1dG9yIGNhbGxiYWNrRXhlY3V0b3IsIE1lZGlhTGlicmFyeVNlc3Npb25DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICAgICAgc3VwZXIoc2VydmljZSk7CisgICAgICAgICAgICBzZXRTZXNzaW9uQ2FsbGJhY2tfaW1wbChjYWxsYmFja0V4ZWN1dG9yLCBjYWxsYmFjayk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE1lZGlhTGlicmFyeVNlc3Npb24gYnVpbGRfaW1wbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGwobUNvbnRleHQsIG1QbGF5ZXIsIG1JZCwgbVBsYXlsaXN0QWdlbnQsCisgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVQcm92aWRlciwgbVNlc3Npb25BY3Rpdml0eSwgbUNhbGxiYWNrRXhlY3V0b3IsIG1DYWxsYmFjaykuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgTGlicmFyeVJvb3RJbXBsIGltcGxlbWVudHMgTGlicmFyeVJvb3RQcm92aWRlciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgTGlicmFyeVJvb3QgbUluc3RhbmNlOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUm9vdElkOworICAgICAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtRXh0cmFzOworCisgICAgICAgIHB1YmxpYyBMaWJyYXJ5Um9vdEltcGwoTGlicmFyeVJvb3QgaW5zdGFuY2UsIFN0cmluZyByb290SWQsIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgICAgIGlmIChyb290SWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvb3RJZCBzaG91bGRuJ3QgYmUgbnVsbC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOworICAgICAgICAgICAgbVJvb3RJZCA9IHJvb3RJZDsKKyAgICAgICAgICAgIG1FeHRyYXMgPSBleHRyYXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRSb290SWRfaW1wbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtUm9vdElkOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCdW5kbGUgZ2V0RXh0cmFzX2ltcGwoKSB7CisgICAgICAgICAgICByZXR1cm4gbUV4dHJhczsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFNZXRhZGF0YTJJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhTWV0YWRhdGEySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMWM1MzIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhTWV0YWRhdGEySW1wbC5qYXZhCkBAIC0wLDAgKzEsMzczIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTIuKjsKKworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTIuQml0bWFwS2V5OworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTIuQnVpbGRlcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyLkxvbmdLZXk7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMi5SYXRpbmdLZXk7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMi5UZXh0S2V5OworaW1wb3J0IGFuZHJvaWQubWVkaWEuUmF0aW5nMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYU1ldGFkYXRhMlByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5BcnJheU1hcDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS51dGlsLlNldDsKKworcHVibGljIGNsYXNzIE1lZGlhTWV0YWRhdGEySW1wbCBpbXBsZW1lbnRzIE1lZGlhTWV0YWRhdGEyUHJvdmlkZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFNZXRhZGF0YTIiOworCisgICAgc3RhdGljIGZpbmFsIGludCBNRVRBREFUQV9UWVBFX0xPTkcgPSAwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgTUVUQURBVEFfVFlQRV9URVhUID0gMTsKKyAgICBzdGF0aWMgZmluYWwgaW50IE1FVEFEQVRBX1RZUEVfQklUTUFQID0gMjsKKyAgICBzdGF0aWMgZmluYWwgaW50IE1FVEFEQVRBX1RZUEVfUkFUSU5HID0gMzsKKyAgICBzdGF0aWMgZmluYWwgaW50IE1FVEFEQVRBX1RZUEVfRkxPQVQgPSA0OworICAgIHN0YXRpYyBmaW5hbCBBcnJheU1hcDxTdHJpbmcsIEludGVnZXI+IE1FVEFEQVRBX0tFWVNfVFlQRTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRSA9IG5ldyBBcnJheU1hcDxTdHJpbmcsIEludGVnZXI+KCk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX1RJVExFLCBNRVRBREFUQV9UWVBFX1RFWFQpOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BUlRJU1QsIE1FVEFEQVRBX1RZUEVfVEVYVCk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RVUkFUSU9OLCBNRVRBREFUQV9UWVBFX0xPTkcpOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BTEJVTSwgTUVUQURBVEFfVFlQRV9URVhUKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQVVUSE9SLCBNRVRBREFUQV9UWVBFX1RFWFQpOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9XUklURVIsIE1FVEFEQVRBX1RZUEVfVEVYVCk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0NPTVBPU0VSLCBNRVRBREFUQV9UWVBFX1RFWFQpOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9DT01QSUxBVElPTiwgTUVUQURBVEFfVFlQRV9URVhUKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfREFURSwgTUVUQURBVEFfVFlQRV9URVhUKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfWUVBUiwgTUVUQURBVEFfVFlQRV9MT05HKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfR0VOUkUsIE1FVEFEQVRBX1RZUEVfVEVYVCk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX1RSQUNLX05VTUJFUiwgTUVUQURBVEFfVFlQRV9MT05HKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfTlVNX1RSQUNLUywgTUVUQURBVEFfVFlQRV9MT05HKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfRElTQ19OVU1CRVIsIE1FVEFEQVRBX1RZUEVfTE9ORyk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0FMQlVNX0FSVElTVCwgTUVUQURBVEFfVFlQRV9URVhUKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQVJULCBNRVRBREFUQV9UWVBFX0JJVE1BUCk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0FSVF9VUkksIE1FVEFEQVRBX1RZUEVfVEVYVCk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0FMQlVNX0FSVCwgTUVUQURBVEFfVFlQRV9CSVRNQVApOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BTEJVTV9BUlRfVVJJLCBNRVRBREFUQV9UWVBFX1RFWFQpOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9VU0VSX1JBVElORywgTUVUQURBVEFfVFlQRV9SQVRJTkcpOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9SQVRJTkcsIE1FVEFEQVRBX1RZUEVfUkFUSU5HKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfRElTUExBWV9USVRMRSwgTUVUQURBVEFfVFlQRV9URVhUKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfRElTUExBWV9TVUJUSVRMRSwgTUVUQURBVEFfVFlQRV9URVhUKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfRElTUExBWV9ERVNDUklQVElPTiwgTUVUQURBVEFfVFlQRV9URVhUKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfRElTUExBWV9JQ09OLCBNRVRBREFUQV9UWVBFX0JJVE1BUCk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RJU1BMQVlfSUNPTl9VUkksIE1FVEFEQVRBX1RZUEVfVEVYVCk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX01FRElBX0lELCBNRVRBREFUQV9UWVBFX1RFWFQpOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9CVF9GT0xERVJfVFlQRSwgTUVUQURBVEFfVFlQRV9MT05HKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfTUVESUFfVVJJLCBNRVRBREFUQV9UWVBFX1RFWFQpOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BRFZFUlRJU0VNRU5ULCBNRVRBREFUQV9UWVBFX0xPTkcpOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9ET1dOTE9BRF9TVEFUVVMsIE1FVEFEQVRBX1RZUEVfTE9ORyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQFRleHRLZXkKKyAgICBTdHJpbmdbXSBQUkVGRVJSRURfREVTQ1JJUFRJT05fT1JERVIgPSB7CisgICAgICAgICAgICBNRVRBREFUQV9LRVlfVElUTEUsCisgICAgICAgICAgICBNRVRBREFUQV9LRVlfQVJUSVNULAorICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FMQlVNLAorICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FMQlVNX0FSVElTVCwKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9XUklURVIsCisgICAgICAgICAgICBNRVRBREFUQV9LRVlfQVVUSE9SLAorICAgICAgICAgICAgTUVUQURBVEFfS0VZX0NPTVBPU0VSCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEBCaXRtYXBLZXkKKyAgICBTdHJpbmdbXSBQUkVGRVJSRURfQklUTUFQX09SREVSID0geworICAgICAgICAgICAgTUVUQURBVEFfS0VZX0RJU1BMQVlfSUNPTiwKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9BUlQsCisgICAgICAgICAgICBNRVRBREFUQV9LRVlfQUxCVU1fQVJUCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEBUZXh0S2V5CisgICAgU3RyaW5nW10gUFJFRkVSUkVEX1VSSV9PUkRFUiA9IHsKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9ESVNQTEFZX0lDT05fVVJJLAorICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FSVF9VUkksCisgICAgICAgICAgICBNRVRBREFUQV9LRVlfQUxCVU1fQVJUX1VSSQorICAgIH07CisKKyAgICBwcml2YXRlIGZpbmFsIE1lZGlhTWV0YWRhdGEyIG1JbnN0YW5jZTsKKyAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOworCisgICAgcHVibGljIE1lZGlhTWV0YWRhdGEySW1wbChCdW5kbGUgYnVuZGxlKSB7CisgICAgICAgIG1JbnN0YW5jZSA9IG5ldyBNZWRpYU1ldGFkYXRhMih0aGlzKTsKKyAgICAgICAgbUJ1bmRsZSA9IGJ1bmRsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVkaWFNZXRhZGF0YTIgZ2V0SW5zdGFuY2UoKSB7CisgICAgICAgIHJldHVybiBtSW5zdGFuY2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXlfaW1wbChTdHJpbmcga2V5KSB7CisgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1CdW5kbGUuY29udGFpbnNLZXkoa2V5KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFRleHRfaW1wbChAVGV4dEtleSBTdHJpbmcga2V5KSB7CisgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0Q2hhclNlcXVlbmNlKGtleSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEBOdWxsYWJsZSBTdHJpbmcgZ2V0TWVkaWFJZF9pbXBsKCkgeworICAgICAgICByZXR1cm4gbUluc3RhbmNlLmdldFN0cmluZyhNRVRBREFUQV9LRVlfTUVESUFfSUQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nX2ltcGwoQFRleHRLZXkgU3RyaW5nIGtleSkgeworICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0ID0gbUJ1bmRsZS5nZXRDaGFyU2VxdWVuY2Uoa2V5KTsKKyAgICAgICAgaWYgKHRleHQgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHRleHQudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBnZXRMb25nX2ltcGwoQExvbmdLZXkgU3RyaW5nIGtleSkgeworICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtQnVuZGxlLmdldExvbmcoa2V5LCAwKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmF0aW5nMiBnZXRSYXRpbmdfaW1wbChAUmF0aW5nS2V5IFN0cmluZyBrZXkpIHsKKyAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPKGphZXdhbik6IEFkZCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CisgICAgICAgIFJhdGluZzIgcmF0aW5nID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJhdGluZyA9IFJhdGluZzIuZnJvbUJ1bmRsZShtQnVuZGxlLmdldEJ1bmRsZShrZXkpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGlnbm9yZSwgdmFsdWUgd2FzIG5vdCBhIHJhdGluZworICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRvIHJldHJpZXZlIGEga2V5IGFzIFJhdGluZy4iLCBlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmF0aW5nOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmbG9hdCBnZXRGbG9hdF9pbXBsKEBGbG9hdEtleSBTdHJpbmcga2V5KSB7CisgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0RmxvYXQoa2V5KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQml0bWFwIGdldEJpdG1hcF9pbXBsKEBCaXRtYXBLZXkgU3RyaW5nIGtleSkgeworICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIEJpdG1hcCBibXAgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYm1wID0gbUJ1bmRsZS5nZXRQYXJjZWxhYmxlKGtleSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBpZ25vcmUsIHZhbHVlIHdhcyBub3QgYSBiaXRtYXAKKyAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0byByZXRyaWV2ZSBhIGtleSBhcyBCaXRtYXAuIiwgZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJtcDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnVuZGxlIGdldEV4dHJhc19pbXBsKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0QnVuZGxlKE1FVEFEQVRBX0tFWV9FWFRSQVMpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gaWdub3JlLCB2YWx1ZSB3YXMgbm90IGFuIGJ1bmRsZQorICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRvIHJldHJpZXZlIGFuIGV4dHJhIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBzaXplX2ltcGwoKSB7CisgICAgICAgIHJldHVybiBtQnVuZGxlLnNpemUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PFN0cmluZz4ga2V5U2V0X2ltcGwoKSB7CisgICAgICAgIHJldHVybiBtQnVuZGxlLmtleVNldCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCdW5kbGUgdG9CdW5kbGVfaW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIG1CdW5kbGU7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBNZWRpYU1ldGFkYXRhMiBmcm9tQnVuZGxlX2ltcGwoQnVuZGxlIGJ1bmRsZSkgeworICAgICAgICByZXR1cm4gKGJ1bmRsZSA9PSBudWxsKSA/IG51bGwgOiBuZXcgTWVkaWFNZXRhZGF0YTJJbXBsKGJ1bmRsZSkuZ2V0SW5zdGFuY2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXJJbXBsIGltcGxlbWVudHMgTWVkaWFNZXRhZGF0YTJQcm92aWRlci5CdWlsZGVyUHJvdmlkZXIgeworICAgICAgICBwcml2YXRlIGZpbmFsIE1lZGlhTWV0YWRhdGEyLkJ1aWxkZXIgbUluc3RhbmNlOworICAgICAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOworCisgICAgICAgIHB1YmxpYyBCdWlsZGVySW1wbChNZWRpYU1ldGFkYXRhMi5CdWlsZGVyIGluc3RhbmNlKSB7CisgICAgICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKKyAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQnVpbGRlckltcGwoTWVkaWFNZXRhZGF0YTIuQnVpbGRlciBpbnN0YW5jZSwgTWVkaWFNZXRhZGF0YTIgc291cmNlKSB7CisgICAgICAgICAgICBpZiAoc291cmNlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzb3VyY2Ugc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOworICAgICAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoc291cmNlLnRvQnVuZGxlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJ1aWxkZXJJbXBsKGludCBtYXhCaXRtYXBTaXplKSB7CisgICAgICAgICAgICBtSW5zdGFuY2UgPSBuZXcgTWVkaWFNZXRhZGF0YTIuQnVpbGRlcih0aGlzKTsKKyAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKCk7CisKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIGtleSA6IG1CdW5kbGUua2V5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBtQnVuZGxlLmdldChrZXkpOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJpdG1hcCkgeworICAgICAgICAgICAgICAgICAgICBCaXRtYXAgYm1wID0gKEJpdG1hcCkgdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGlmIChibXAuZ2V0SGVpZ2h0KCkgPiBtYXhCaXRtYXBTaXplIHx8IGJtcC5nZXRXaWR0aCgpID4gbWF4Qml0bWFwU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnB1dEJpdG1hcChrZXksIHNjYWxlQml0bWFwKGJtcCwgbWF4Qml0bWFwU2l6ZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHB1dFRleHRfaW1wbChAVGV4dEtleSBTdHJpbmcga2V5LCBDaGFyU2VxdWVuY2UgdmFsdWUpIHsKKyAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5jb250YWluc0tleShrZXkpKSB7CisgICAgICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5nZXQoa2V5KSAhPSBNRVRBREFUQV9UWVBFX1RFWFQpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlICIgKyBrZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIga2V5IGNhbm5vdCBiZSB1c2VkIHRvIHB1dCBhIENoYXJTZXF1ZW5jZSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CdW5kbGUucHV0Q2hhclNlcXVlbmNlKGtleSwgdmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnVpbGRlciBwdXRTdHJpbmdfaW1wbChAVGV4dEtleSBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5jb250YWluc0tleShrZXkpKSB7CisgICAgICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5nZXQoa2V5KSAhPSBNRVRBREFUQV9UWVBFX1RFWFQpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlICIgKyBrZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIga2V5IGNhbm5vdCBiZSB1c2VkIHRvIHB1dCBhIFN0cmluZyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CdW5kbGUucHV0Q2hhclNlcXVlbmNlKGtleSwgdmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnVpbGRlciBwdXRMb25nX2ltcGwoQExvbmdLZXkgU3RyaW5nIGtleSwgbG9uZyB2YWx1ZSkgeworICAgICAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmNvbnRhaW5zS2V5KGtleSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmdldChrZXkpICE9IE1FVEFEQVRBX1RZUEVfTE9ORykgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgIiArIGtleQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBrZXkgY2Fubm90IGJlIHVzZWQgdG8gcHV0IGEgbG9uZyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CdW5kbGUucHV0TG9uZyhrZXksIHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgcHV0UmF0aW5nX2ltcGwoQFJhdGluZ0tleSBTdHJpbmcga2V5LCBSYXRpbmcyIHZhbHVlKSB7CisgICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuY29udGFpbnNLZXkoa2V5KSkgeworICAgICAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuZ2V0KGtleSkgIT0gTUVUQURBVEFfVFlQRV9SQVRJTkcpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlICIgKyBrZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIga2V5IGNhbm5vdCBiZSB1c2VkIHRvIHB1dCBhIFJhdGluZyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CdW5kbGUucHV0QnVuZGxlKGtleSwgdmFsdWUudG9CdW5kbGUoKSk7CisgICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHB1dEJpdG1hcF9pbXBsKEBCaXRtYXBLZXkgU3RyaW5nIGtleSwgQml0bWFwIHZhbHVlKSB7CisgICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuY29udGFpbnNLZXkoa2V5KSkgeworICAgICAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuZ2V0KGtleSkgIT0gTUVUQURBVEFfVFlQRV9CSVRNQVApIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlICIgKyBrZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIga2V5IGNhbm5vdCBiZSB1c2VkIHRvIHB1dCBhIEJpdG1hcCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CdW5kbGUucHV0UGFyY2VsYWJsZShrZXksIHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgcHV0RmxvYXRfaW1wbChARmxvYXRLZXkgU3RyaW5nIGtleSwgZmxvYXQgdmFsdWUpIHsKKyAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5jb250YWluc0tleShrZXkpKSB7CisgICAgICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5nZXQoa2V5KSAhPSBNRVRBREFUQV9UWVBFX0ZMT0FUKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSAiICsga2V5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGtleSBjYW5ub3QgYmUgdXNlZCB0byBwdXQgYSBmbG9hdCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CdW5kbGUucHV0RmxvYXQoa2V5LCB2YWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEV4dHJhc19pbXBsKEJ1bmRsZSBidW5kbGUpIHsKKyAgICAgICAgICAgIG1CdW5kbGUucHV0QnVuZGxlKE1FVEFEQVRBX0tFWV9FWFRSQVMsIGJ1bmRsZSk7CisgICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBNZWRpYU1ldGFkYXRhMiBidWlsZF9pbXBsKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYU1ldGFkYXRhMkltcGwobUJ1bmRsZSkuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgQml0bWFwIHNjYWxlQml0bWFwKEJpdG1hcCBibXAsIGludCBtYXhTaXplKSB7CisgICAgICAgICAgICBmbG9hdCBtYXhTaXplRiA9IG1heFNpemU7CisgICAgICAgICAgICBmbG9hdCB3aWR0aFNjYWxlID0gbWF4U2l6ZUYgLyBibXAuZ2V0V2lkdGgoKTsKKyAgICAgICAgICAgIGZsb2F0IGhlaWdodFNjYWxlID0gbWF4U2l6ZUYgLyBibXAuZ2V0SGVpZ2h0KCk7CisgICAgICAgICAgICBmbG9hdCBzY2FsZSA9IE1hdGgubWluKHdpZHRoU2NhbGUsIGhlaWdodFNjYWxlKTsKKyAgICAgICAgICAgIGludCBoZWlnaHQgPSAoaW50KSAoYm1wLmdldEhlaWdodCgpICogc2NhbGUpOworICAgICAgICAgICAgaW50IHdpZHRoID0gKGludCkgKGJtcC5nZXRXaWR0aCgpICogc2NhbGUpOworICAgICAgICAgICAgcmV0dXJuIEJpdG1hcC5jcmVhdGVTY2FsZWRCaXRtYXAoYm1wLCB3aWR0aCwgaGVpZ2h0LCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVBsYXlsaXN0QWdlbnRJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhUGxheWxpc3RBZ2VudEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmQ0ZTFhCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVBsYXlsaXN0QWdlbnRJbXBsLmphdmEKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uQ2FsbGJhY2tFeGVjdXRvcjsKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5EYXRhU291cmNlRGVzYzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWxpc3RBZ2VudDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWxpc3RBZ2VudC5QbGF5bGlzdEV2ZW50Q2FsbGJhY2s7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFQbGF5bGlzdEFnZW50UHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkFycmF5TWFwOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hbm5vdGF0aW9ucy5HdWFyZGVkQnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKKworcHVibGljIGNsYXNzIE1lZGlhUGxheWxpc3RBZ2VudEltcGwgaW1wbGVtZW50cyBNZWRpYVBsYXlsaXN0QWdlbnRQcm92aWRlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVBsYXlsaXN0QWdlbnQiOworCisgICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgbUluc3RhbmNlOworCisgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbUxvY2sgPSBuZXcgT2JqZWN0KCk7CisgICAgQEd1YXJkZWRCeSgibUxvY2siKQorICAgIHByaXZhdGUgZmluYWwgQXJyYXlNYXA8UGxheWxpc3RFdmVudENhbGxiYWNrLCBFeGVjdXRvcj4gbUNhbGxiYWNrcyA9IG5ldyBBcnJheU1hcDw+KCk7CisKKyAgICBwdWJsaWMgTWVkaWFQbGF5bGlzdEFnZW50SW1wbChNZWRpYVBsYXlsaXN0QWdlbnQgaW5zdGFuY2UpIHsKKyAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgZmluYWwgcHVibGljIHZvaWQgcmVnaXN0ZXJQbGF5bGlzdEV2ZW50Q2FsbGJhY2tfaW1wbCgKKyAgICAgICAgICAgIEBOb25OdWxsIEBDYWxsYmFja0V4ZWN1dG9yIEV4ZWN1dG9yIGV4ZWN1dG9yLCBATm9uTnVsbCBQbGF5bGlzdEV2ZW50Q2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgaWYgKGV4ZWN1dG9yID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImV4ZWN1dG9yIHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNhbGxiYWNrID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbGxiYWNrIHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgIH0KKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBpZiAobUNhbGxiYWNrcy5nZXQoY2FsbGJhY2spICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJjYWxsYmFjayBpcyBhbHJlYWR5IGFkZGVkLiBJZ25vcmluZy4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2FsbGJhY2tzLnB1dChjYWxsYmFjaywgZXhlY3V0b3IpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgZmluYWwgcHVibGljIHZvaWQgdW5yZWdpc3RlclBsYXlsaXN0RXZlbnRDYWxsYmFja19pbXBsKAorICAgICAgICAgICAgQE5vbk51bGwgUGxheWxpc3RFdmVudENhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIGlmIChjYWxsYmFjayA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYWxsYmFjayBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIG1DYWxsYmFja3MucmVtb3ZlKGNhbGxiYWNrKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIGZpbmFsIHB1YmxpYyB2b2lkIG5vdGlmeVBsYXlsaXN0Q2hhbmdlZF9pbXBsKCkgeworICAgICAgICBBcnJheU1hcDxQbGF5bGlzdEV2ZW50Q2FsbGJhY2ssIEV4ZWN1dG9yPiBjYWxsYmFja3MgPSBnZXRDYWxsYmFja3MoKTsKKyAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiBwbGF5bGlzdD0gbUluc3RhbmNlLmdldFBsYXlsaXN0KCk7CisgICAgICAgIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhID0gbUluc3RhbmNlLmdldFBsYXlsaXN0TWV0YWRhdGEoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYWxsYmFja3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIFBsYXlsaXN0RXZlbnRDYWxsYmFjayBjYWxsYmFjayA9IGNhbGxiYWNrcy5rZXlBdChpKTsKKyAgICAgICAgICAgIGZpbmFsIEV4ZWN1dG9yIGV4ZWN1dG9yID0gY2FsbGJhY2tzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBleGVjdXRvci5leGVjdXRlKCgpIC0+IGNhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkKAorICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2UsIHBsYXlsaXN0LCBtZXRhZGF0YSkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgZmluYWwgcHVibGljIHZvaWQgbm90aWZ5UGxheWxpc3RNZXRhZGF0YUNoYW5nZWRfaW1wbCgpIHsKKyAgICAgICAgQXJyYXlNYXA8UGxheWxpc3RFdmVudENhbGxiYWNrLCBFeGVjdXRvcj4gY2FsbGJhY2tzID0gZ2V0Q2FsbGJhY2tzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FsbGJhY2tzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBQbGF5bGlzdEV2ZW50Q2FsbGJhY2sgY2FsbGJhY2sgPSBjYWxsYmFja3Mua2V5QXQoaSk7CisgICAgICAgICAgICBmaW5hbCBFeGVjdXRvciBleGVjdXRvciA9IGNhbGxiYWNrcy52YWx1ZUF0KGkpOworICAgICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiBjYWxsYmFjay5vblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkKAorICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2UsIG1JbnN0YW5jZS5nZXRQbGF5bGlzdE1ldGFkYXRhKCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIGZpbmFsIHB1YmxpYyB2b2lkIG5vdGlmeVNodWZmbGVNb2RlQ2hhbmdlZF9pbXBsKCkgeworICAgICAgICBBcnJheU1hcDxQbGF5bGlzdEV2ZW50Q2FsbGJhY2ssIEV4ZWN1dG9yPiBjYWxsYmFja3MgPSBnZXRDYWxsYmFja3MoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYWxsYmFja3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIFBsYXlsaXN0RXZlbnRDYWxsYmFjayBjYWxsYmFjayA9IGNhbGxiYWNrcy5rZXlBdChpKTsKKyAgICAgICAgICAgIGZpbmFsIEV4ZWN1dG9yIGV4ZWN1dG9yID0gY2FsbGJhY2tzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBleGVjdXRvci5leGVjdXRlKCgpIC0+IGNhbGxiYWNrLm9uU2h1ZmZsZU1vZGVDaGFuZ2VkKAorICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2UsIG1JbnN0YW5jZS5nZXRTaHVmZmxlTW9kZSgpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBmaW5hbCBwdWJsaWMgdm9pZCBub3RpZnlSZXBlYXRNb2RlQ2hhbmdlZF9pbXBsKCkgeworICAgICAgICBBcnJheU1hcDxQbGF5bGlzdEV2ZW50Q2FsbGJhY2ssIEV4ZWN1dG9yPiBjYWxsYmFja3MgPSBnZXRDYWxsYmFja3MoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYWxsYmFja3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIFBsYXlsaXN0RXZlbnRDYWxsYmFjayBjYWxsYmFjayA9IGNhbGxiYWNrcy5rZXlBdChpKTsKKyAgICAgICAgICAgIGZpbmFsIEV4ZWN1dG9yIGV4ZWN1dG9yID0gY2FsbGJhY2tzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBleGVjdXRvci5leGVjdXRlKCgpIC0+IGNhbGxiYWNrLm9uUmVwZWF0TW9kZUNoYW5nZWQoCisgICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZSwgbUluc3RhbmNlLmdldFJlcGVhdE1vZGUoKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEBOdWxsYWJsZSBMaXN0PE1lZGlhSXRlbTI+IGdldFBsYXlsaXN0X2ltcGwoKSB7CisgICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFBsYXlsaXN0X2ltcGwoQE5vbk51bGwgTGlzdDxNZWRpYUl0ZW0yPiBsaXN0LAorICAgICAgICAgICAgQE51bGxhYmxlIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7CisgICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhMiBnZXRQbGF5bGlzdE1ldGFkYXRhX2ltcGwoKSB7CisgICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVBsYXlsaXN0TWV0YWRhdGFfaW1wbChATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKKyAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZGRQbGF5bGlzdEl0ZW1faW1wbChpbnQgaW5kZXgsIEBOb25OdWxsIE1lZGlhSXRlbTIgaXRlbSkgeworICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBsYXlsaXN0SXRlbV9pbXBsKEBOb25OdWxsIE1lZGlhSXRlbTIgaXRlbSkgeworICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlcGxhY2VQbGF5bGlzdEl0ZW1faW1wbChpbnQgaW5kZXgsIEBOb25OdWxsIE1lZGlhSXRlbTIgaXRlbSkgeworICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNraXBUb1BsYXlsaXN0SXRlbV9pbXBsKEBOb25OdWxsIE1lZGlhSXRlbTIgaXRlbSkgeworICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNraXBUb1ByZXZpb3VzSXRlbV9pbXBsKCkgeworICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNraXBUb05leHRJdGVtX2ltcGwoKSB7CisgICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRSZXBlYXRNb2RlX2ltcGwoKSB7CisgICAgICAgIHJldHVybiBNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfTk9ORTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRSZXBlYXRNb2RlX2ltcGwoaW50IHJlcGVhdE1vZGUpIHsKKyAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldFNodWZmbGVNb2RlX2ltcGwoKSB7CisgICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCisgICAgICAgIHJldHVybiBNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX05PTkU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0U2h1ZmZsZU1vZGVfaW1wbChpbnQgc2h1ZmZsZU1vZGUpIHsKKyAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQE51bGxhYmxlIE1lZGlhSXRlbTIgZ2V0TWVkaWFJdGVtX2ltcGwoQE5vbk51bGwgRGF0YVNvdXJjZURlc2MgZHNkKSB7CisgICAgICAgIGlmIChkc2QgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZHNkIHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiBpdGVtTGlzdCA9IG1JbnN0YW5jZS5nZXRQbGF5bGlzdCgpOworICAgICAgICBpZiAoaXRlbUxpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtTGlzdC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgTWVkaWFJdGVtMiBpdGVtID0gaXRlbUxpc3QuZ2V0KGkpOworICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCAmJiBpdGVtLmdldERhdGFTb3VyY2VEZXNjKCkgPT0gZHNkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBBcnJheU1hcDxQbGF5bGlzdEV2ZW50Q2FsbGJhY2ssIEV4ZWN1dG9yPiBnZXRDYWxsYmFja3MoKSB7CisgICAgICAgIEFycmF5TWFwPFBsYXlsaXN0RXZlbnRDYWxsYmFjaywgRXhlY3V0b3I+IGNhbGxiYWNrcyA9IG5ldyBBcnJheU1hcDw+KCk7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIGNhbGxiYWNrcy5wdXRBbGwobUNhbGxiYWNrcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNhbGxiYWNrczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhU2Vzc2lvbjJJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhU2Vzc2lvbjJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVjNjA0MgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFTZXNzaW9uMkltcGwuamF2YQpAQCAtMCwwICsxLDE1NTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX0NVU1RPTTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yLlRZUEVfTElCUkFSWV9TRVJWSUNFOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjIuVFlQRV9TRVNTSU9OOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjIuVFlQRV9TRVNTSU9OX1NFUlZJQ0U7CisKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7CitpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUmVzb2x2ZUluZm87CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0F0dHJpYnV0ZXM7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0ZvY3VzUmVxdWVzdDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkRhdGFTb3VyY2VEZXNjOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjIuUGxheWJhY2tJbmZvOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllckJhc2U7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllckJhc2UuUGxheWVyRXZlbnRDYWxsYmFjazsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZS5QbGF5ZXJTdGF0ZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWxpc3RBZ2VudDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWxpc3RBZ2VudC5QbGF5bGlzdEV2ZW50Q2FsbGJhY2s7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5CdWlsZGVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5Db21tYW5kQnV0dG9uOworaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmRHcm91cDI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLkNvbnRyb2xsZXJJbmZvOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5PbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5TZXNzaW9uQ2FsbGJhY2s7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb25TZXJ2aWNlMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5Wb2x1bWVQcm92aWRlcjI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhU2Vzc2lvbk1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFTZXNzaW9uMlByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOworaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uR3VhcmRlZEJ5OworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOworCitwdWJsaWMgY2xhc3MgTWVkaWFTZXNzaW9uMkltcGwgaW1wbGVtZW50cyBNZWRpYVNlc3Npb24yUHJvdmlkZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFTZXNzaW9uMiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7Ly9Mb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRyk7CisKKyAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtTG9jayA9IG5ldyBPYmplY3QoKTsKKworICAgIHByaXZhdGUgZmluYWwgTWVkaWFTZXNzaW9uMiBtSW5zdGFuY2U7CisgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1JZDsKKyAgICBwcml2YXRlIGZpbmFsIEV4ZWN1dG9yIG1DYWxsYmFja0V4ZWN1dG9yOworICAgIHByaXZhdGUgZmluYWwgU2Vzc2lvbkNhbGxiYWNrIG1DYWxsYmFjazsKKyAgICBwcml2YXRlIGZpbmFsIE1lZGlhU2Vzc2lvbjJTdHViIG1TZXNzaW9uU3R1YjsKKyAgICBwcml2YXRlIGZpbmFsIFNlc3Npb25Ub2tlbjIgbVNlc3Npb25Ub2tlbjsKKyAgICBwcml2YXRlIGZpbmFsIEF1ZGlvTWFuYWdlciBtQXVkaW9NYW5hZ2VyOworICAgIHByaXZhdGUgZmluYWwgUGVuZGluZ0ludGVudCBtU2Vzc2lvbkFjdGl2aXR5OworICAgIHByaXZhdGUgZmluYWwgUGxheWVyRXZlbnRDYWxsYmFjayBtUGxheWVyRXZlbnRDYWxsYmFjazsKKyAgICBwcml2YXRlIGZpbmFsIFBsYXlsaXN0RXZlbnRDYWxsYmFjayBtUGxheWxpc3RFdmVudENhbGxiYWNrOworCisgICAgLy8gbVBsYXllciBpcyBzZXQgdG8gbnVsbCB3aGVuIHRoZSBzZXNzaW9uIGlzIGNsb3NlZCwgYW5kIHdlIHNob3VsZG4ndCB0aHJvdyBhbiBleGNlcHRpb24KKyAgICAvLyBub3IgbGVhdmUgbG9nIGFsd2F5cyBmb3IgdXNpbmcgbVBsYXllciB3aGVuIGl0J3MgbnVsbC4gSGVyZSdzIHRoZSByZWFzb24uCisgICAgLy8gV2hlbiBhIE1lZGlhU2Vzc2lvbjIgaXMgY2xvc2VkLCB0aGVyZSBjb3VsZCBiZSBhIHBlbmRlZCBvcGVyYXRpb24gaW4gdGhlIHNlc3Npb24gY2FsbGJhY2sKKyAgICAvLyBleGVjdXRvciB0aGF0IG1heSB3YW50IHRvIGFjY2VzcyB0aGUgcGxheWVyLiBIZXJlJ3MgdGhlIHNhbXBsZSBjb2RlIHNuaXBwZXQgZm9yIHRoYXQuCisgICAgLy8KKyAgICAvLyAgIHB1YmxpYyB2b2lkIG9uRm9vKCkgeworICAgIC8vICAgICBpZiAobVBsYXllciA9PSBudWxsKSByZXR1cm47IC8vIGZpcnN0IGNoZWNrCisgICAgLy8gICAgIG1TZXNzaW9uQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRvcigoKSAtPiB7CisgICAgLy8gICAgICAgLy8gRXJyb3IuIFNlc3Npb24gbWF5IGJlIGNsb3NlZCBhbmQgbVBsYXllciBjYW4gYmUgbnVsbCBoZXJlLgorICAgIC8vICAgICAgIG1QbGF5ZXIuZm9vKCk7CisgICAgLy8gICAgIH0pOworICAgIC8vICAgfQorICAgIC8vCisgICAgLy8gQnkgYWRkaW5nIHByb3RlY3RpdmUgY29kZSwgd2UgY2FuIGFsc28gcHJvdGVjdCBBUElzIGZyb20gYmVpbmcgY2FsbGVkIGFmdGVyIHRoZSBjbG9zZSgpCisgICAgLy8KKyAgICAvLyBUT0RPKGphZXdhbik6IFNob3VsZCB3ZSBwdXQgdm9sYXRpbGUgaGVyZT8KKyAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCisgICAgcHJpdmF0ZSBNZWRpYVBsYXllckJhc2UgbVBsYXllcjsKKyAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCisgICAgcHJpdmF0ZSBNZWRpYVBsYXlsaXN0QWdlbnQgbVBsYXlsaXN0QWdlbnQ7CisgICAgQEd1YXJkZWRCeSgibUxvY2siKQorICAgIHByaXZhdGUgU2Vzc2lvblBsYXlsaXN0QWdlbnQgbVNlc3Npb25QbGF5bGlzdEFnZW50OworICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKKyAgICBwcml2YXRlIFZvbHVtZVByb3ZpZGVyMiBtVm9sdW1lUHJvdmlkZXI7CisgICAgQEd1YXJkZWRCeSgibUxvY2siKQorICAgIHByaXZhdGUgUGxheWJhY2tJbmZvIG1QbGF5YmFja0luZm87CisgICAgQEd1YXJkZWRCeSgibUxvY2siKQorICAgIHByaXZhdGUgT25EYXRhU291cmNlTWlzc2luZ0hlbHBlciBtRHNtSGVscGVyOworCisgICAgLyoqCisgICAgICogQ2FuIGJlIG9ubHkgY2FsbGVkIGJ5IHRoZSB7QGxpbmsgQnVpbGRlciNidWlsZCgpfS4KKyAgICAgKiBAcGFyYW0gY29udGV4dAorICAgICAqIEBwYXJhbSBwbGF5ZXIKKyAgICAgKiBAcGFyYW0gaWQKKyAgICAgKiBAcGFyYW0gcGxheWxpc3RBZ2VudAorICAgICAqIEBwYXJhbSB2b2x1bWVQcm92aWRlcgorICAgICAqIEBwYXJhbSBzZXNzaW9uQWN0aXZpdHkKKyAgICAgKiBAcGFyYW0gY2FsbGJhY2tFeGVjdXRvcgorICAgICAqIEBwYXJhbSBjYWxsYmFjaworICAgICAqLworICAgIHB1YmxpYyBNZWRpYVNlc3Npb24ySW1wbChDb250ZXh0IGNvbnRleHQsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIsIFN0cmluZyBpZCwKKyAgICAgICAgICAgIE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LCBWb2x1bWVQcm92aWRlcjIgdm9sdW1lUHJvdmlkZXIsCisgICAgICAgICAgICBQZW5kaW5nSW50ZW50IHNlc3Npb25BY3Rpdml0eSwKKyAgICAgICAgICAgIEV4ZWN1dG9yIGNhbGxiYWNrRXhlY3V0b3IsIFNlc3Npb25DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICAvLyBUT0RPKGphZXdhbik6IEtlZXAgb3RoZXIgcGFyYW1zLgorICAgICAgICBtSW5zdGFuY2UgPSBjcmVhdGVJbnN0YW5jZSgpOworCisgICAgICAgIC8vIEFyZ3VtZW50IGNoZWNrcyBhcmUgZG9uZSBieSBidWlsZGVyIGFscmVhZHkuCisgICAgICAgIC8vIEluaXRpYWxpemUgZmluYWxzIGZpcnN0LgorICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIG1JZCA9IGlkOworICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IgPSBjYWxsYmFja0V4ZWN1dG9yOworICAgICAgICBtU2Vzc2lvbkFjdGl2aXR5ID0gc2Vzc2lvbkFjdGl2aXR5OworICAgICAgICBtU2Vzc2lvblN0dWIgPSBuZXcgTWVkaWFTZXNzaW9uMlN0dWIodGhpcyk7CisgICAgICAgIG1BdWRpb01hbmFnZXIgPSAoQXVkaW9NYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BVURJT19TRVJWSUNFKTsKKyAgICAgICAgbVBsYXllckV2ZW50Q2FsbGJhY2sgPSBuZXcgTXlQbGF5ZXJFdmVudENhbGxiYWNrKHRoaXMpOworICAgICAgICBtUGxheWxpc3RFdmVudENhbGxiYWNrID0gbmV3IE15UGxheWxpc3RFdmVudENhbGxiYWNrKHRoaXMpOworCisgICAgICAgIC8vIEluZmVyIHR5cGUgZnJvbSB0aGUgaWQgYW5kIHBhY2thZ2UgbmFtZS4KKyAgICAgICAgU3RyaW5nIGxpYnJhcnlTZXJ2aWNlID0gZ2V0U2VydmljZU5hbWUoY29udGV4dCwgTWVkaWFMaWJyYXJ5U2VydmljZTIuU0VSVklDRV9JTlRFUkZBQ0UsIGlkKTsKKyAgICAgICAgU3RyaW5nIHNlc3Npb25TZXJ2aWNlID0gZ2V0U2VydmljZU5hbWUoY29udGV4dCwgTWVkaWFTZXNzaW9uU2VydmljZTIuU0VSVklDRV9JTlRFUkZBQ0UsIGlkKTsKKyAgICAgICAgaWYgKHNlc3Npb25TZXJ2aWNlICE9IG51bGwgJiYgbGlicmFyeVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQW1iaWd1b3VzIHNlc3Npb24gdHlwZS4gTXVsdGlwbGUiCisgICAgICAgICAgICAgICAgICAgICsgIiBzZXNzaW9uIHNlcnZpY2VzIGRlZmluZSB0aGUgc2FtZSBpZD0iICsgaWQpOworICAgICAgICB9IGVsc2UgaWYgKGxpYnJhcnlTZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TZXNzaW9uVG9rZW4gPSBuZXcgU2Vzc2lvblRva2VuMkltcGwoUHJvY2Vzcy5teVVpZCgpLCBUWVBFX0xJQlJBUllfU0VSVklDRSwKKyAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwgbGlicmFyeVNlcnZpY2UsIGlkLCBtU2Vzc2lvblN0dWIpLmdldEluc3RhbmNlKCk7CisgICAgICAgIH0gZWxzZSBpZiAoc2Vzc2lvblNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgbVNlc3Npb25Ub2tlbiA9IG5ldyBTZXNzaW9uVG9rZW4ySW1wbChQcm9jZXNzLm15VWlkKCksIFRZUEVfU0VTU0lPTl9TRVJWSUNFLAorICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpLCBzZXNzaW9uU2VydmljZSwgaWQsIG1TZXNzaW9uU3R1YikuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TZXNzaW9uVG9rZW4gPSBuZXcgU2Vzc2lvblRva2VuMkltcGwoUHJvY2Vzcy5teVVpZCgpLCBUWVBFX1NFU1NJT04sCisgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCksIG51bGwsIGlkLCBtU2Vzc2lvblN0dWIpLmdldEluc3RhbmNlKCk7CisgICAgICAgIH0KKworICAgICAgICB1cGRhdGVQbGF5ZXIocGxheWVyLCBwbGF5bGlzdEFnZW50LCB2b2x1bWVQcm92aWRlcik7CisKKyAgICAgICAgLy8gQXNrIHNlcnZlciBmb3IgdGhlIHNhbml0eSBjaGVjaywgYW5kIHN0YXJ0cworICAgICAgICAvLyBTYW5pdHkgY2hlY2sgZm9yIG1ha2luZyBzZXNzaW9uIElEIHVuaXF1ZSAncGVyIHBhY2thZ2UnIGNhbm5vdCBiZSBkb25lIGluIGhlcmUuCisgICAgICAgIC8vIFNlcnZlciBjYW4gb25seSBrbm93IGlmIHRoZSBwYWNrYWdlIGhhcyBhbm90aGVyIHByb2Nlc3MgYW5kIGhhcyBhbm90aGVyIHNlc3Npb24gd2l0aCB0aGUKKyAgICAgICAgLy8gc2FtZSBpZC4gTm90ZSB0aGF0ICdJRCBpcyB1bmlxdWUgcGVyIHBhY2thZ2UnIGlzIGltcG9ydGFudCBmb3IgY29udHJvbGxlciB0byBkaXN0aW5ndWlzaAorICAgICAgICAvLyBhIHNlc3Npb24gaW4gYW5vdGhlciBwYWNrYWdlLgorICAgICAgICBNZWRpYVNlc3Npb25NYW5hZ2VyIG1hbmFnZXIgPQorICAgICAgICAgICAgICAgIChNZWRpYVNlc3Npb25NYW5hZ2VyKSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTUVESUFfU0VTU0lPTl9TRVJWSUNFKTsKKyAgICAgICAgaWYgKCFtYW5hZ2VyLmNyZWF0ZVNlc3Npb24yKG1TZXNzaW9uVG9rZW4pKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJTZXNzaW9uIHdpdGggdGhlIHNhbWUgaWQgaXMgYWxyZWFkeSB1c2VkIGJ5IgorICAgICAgICAgICAgICAgICAgICArICIgYW5vdGhlciBwcm9jZXNzLiBVc2UgTWVkaWFDb250cm9sbGVyMiBpbnN0ZWFkLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgTWVkaWFTZXNzaW9uMiBjcmVhdGVJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVNlc3Npb24yKHRoaXMpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTZXJ2aWNlTmFtZShDb250ZXh0IGNvbnRleHQsIFN0cmluZyBzZXJ2aWNlQWN0aW9uLCBTdHJpbmcgaWQpIHsKKyAgICAgICAgUGFja2FnZU1hbmFnZXIgbWFuYWdlciA9IGNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICAgICAgSW50ZW50IHNlcnZpY2VJbnRlbnQgPSBuZXcgSW50ZW50KHNlcnZpY2VBY3Rpb24pOworICAgICAgICBzZXJ2aWNlSW50ZW50LnNldFBhY2thZ2UoY29udGV4dC5nZXRQYWNrYWdlTmFtZSgpKTsKKyAgICAgICAgTGlzdDxSZXNvbHZlSW5mbz4gc2VydmljZXMgPSBtYW5hZ2VyLnF1ZXJ5SW50ZW50U2VydmljZXMoc2VydmljZUludGVudCwKKyAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlci5HRVRfTUVUQV9EQVRBKTsKKyAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gbnVsbDsKKyAgICAgICAgaWYgKHNlcnZpY2VzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgc2VydmljZUlkID0gU2Vzc2lvblRva2VuMkltcGwuZ2V0U2Vzc2lvbklkKHNlcnZpY2VzLmdldChpKSk7CisgICAgICAgICAgICAgICAgaWYgKHNlcnZpY2VJZCAhPSBudWxsICYmIFRleHRVdGlscy5lcXVhbHMoaWQsIHNlcnZpY2VJZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZpY2VzLmdldChpKS5zZXJ2aWNlSW5mbyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmljZU5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQW1iaWd1b3VzIHNlc3Npb24gdHlwZS4gTXVsdGlwbGUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBzZXNzaW9uIHNlcnZpY2VzIGRlZmluZSB0aGUgc2FtZSBpZD0iICsgaWQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VOYW1lID0gc2VydmljZXMuZ2V0KGkpLnNlcnZpY2VJbmZvLm5hbWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzZXJ2aWNlTmFtZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVQbGF5ZXJfaW1wbChATm9uTnVsbCBNZWRpYVBsYXllckJhc2UgcGxheWVyLCBNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwKKyAgICAgICAgICAgIFZvbHVtZVByb3ZpZGVyMiB2b2x1bWVQcm92aWRlcikgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKKyAgICAgICAgaWYgKHBsYXllciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwbGF5ZXIgc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICB1cGRhdGVQbGF5ZXIocGxheWVyLCBwbGF5bGlzdEFnZW50LCB2b2x1bWVQcm92aWRlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVBsYXllcihNZWRpYVBsYXllckJhc2UgcGxheWVyLCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQsCisgICAgICAgICAgICBWb2x1bWVQcm92aWRlcjIgdm9sdW1lUHJvdmlkZXIpIHsKKyAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIG9sZFBsYXllcjsKKyAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IG9sZEFnZW50OworICAgICAgICBmaW5hbCBQbGF5YmFja0luZm8gaW5mbyA9IGNyZWF0ZVBsYXliYWNrSW5mbyh2b2x1bWVQcm92aWRlciwgcGxheWVyLmdldEF1ZGlvQXR0cmlidXRlcygpKTsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgb2xkUGxheWVyID0gbVBsYXllcjsKKyAgICAgICAgICAgIG9sZEFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7CisgICAgICAgICAgICBtUGxheWVyID0gcGxheWVyOworICAgICAgICAgICAgaWYgKGFnZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtU2Vzc2lvblBsYXlsaXN0QWdlbnQgPSBuZXcgU2Vzc2lvblBsYXlsaXN0QWdlbnQodGhpcywgbVBsYXllcik7CisgICAgICAgICAgICAgICAgaWYgKG1Ec21IZWxwZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvblBsYXlsaXN0QWdlbnQuc2V0T25EYXRhU291cmNlTWlzc2luZ0hlbHBlcihtRHNtSGVscGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYWdlbnQgPSBtU2Vzc2lvblBsYXlsaXN0QWdlbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUGxheWxpc3RBZ2VudCA9IGFnZW50OworICAgICAgICAgICAgbVZvbHVtZVByb3ZpZGVyID0gdm9sdW1lUHJvdmlkZXI7CisgICAgICAgICAgICBtUGxheWJhY2tJbmZvID0gaW5mbzsKKyAgICAgICAgfQorICAgICAgICBpZiAocGxheWVyICE9IG9sZFBsYXllcikgeworICAgICAgICAgICAgcGxheWVyLnJlZ2lzdGVyUGxheWVyRXZlbnRDYWxsYmFjayhtQ2FsbGJhY2tFeGVjdXRvciwgbVBsYXllckV2ZW50Q2FsbGJhY2spOworICAgICAgICAgICAgaWYgKG9sZFBsYXllciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gV2FybmluZzogUG9vcmx5IGltcGxlbWVudCBwbGF5ZXIgbWF5IGlnbm9yZSB0aGlzCisgICAgICAgICAgICAgICAgb2xkUGxheWVyLnVucmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKG1QbGF5ZXJFdmVudENhbGxiYWNrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoYWdlbnQgIT0gb2xkQWdlbnQpIHsKKyAgICAgICAgICAgIGFnZW50LnJlZ2lzdGVyUGxheWxpc3RFdmVudENhbGxiYWNrKG1DYWxsYmFja0V4ZWN1dG9yLCBtUGxheWxpc3RFdmVudENhbGxiYWNrKTsKKyAgICAgICAgICAgIGlmIChvbGRBZ2VudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gV2FybmluZzogUG9vcmx5IGltcGxlbWVudCBwbGF5ZXIgbWF5IGlnbm9yZSB0aGlzCisgICAgICAgICAgICAgICAgb2xkQWdlbnQudW5yZWdpc3RlclBsYXlsaXN0RXZlbnRDYWxsYmFjayhtUGxheWxpc3RFdmVudENhbGxiYWNrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChvbGRQbGF5ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeVBsYXliYWNrSW5mb0NoYW5nZWQoaW5mbyk7CisgICAgICAgICAgICBub3RpZnlQbGF5ZXJVcGRhdGVkTm90TG9ja2VkKG9sZFBsYXllcik7CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBSZXBlYXQgdGhlIHNhbWUgdGhpbmcgZm9yIHRoZSBwbGF5bGlzdCBhZ2VudC4KKyAgICB9CisKKyAgICBwcml2YXRlIFBsYXliYWNrSW5mbyBjcmVhdGVQbGF5YmFja0luZm8oVm9sdW1lUHJvdmlkZXIyIHZvbHVtZVByb3ZpZGVyLCBBdWRpb0F0dHJpYnV0ZXMgYXR0cnMpIHsKKyAgICAgICAgUGxheWJhY2tJbmZvIGluZm87CisgICAgICAgIGlmICh2b2x1bWVQcm92aWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICBpbnQgc3RyZWFtOworICAgICAgICAgICAgaWYgKGF0dHJzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPSBBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPSBhdHRycy5nZXRWb2x1bWVDb250cm9sU3RyZWFtKCk7CisgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBBdWRpb01hbmFnZXIuVVNFX0RFRkFVTFRfU1RSRUFNX1RZUEUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSXQgbWF5IGhhcHBlbiBpZiB0aGUgQXVkaW9BdHRyaWJ1dGVzIGRvZXNuJ3QgaGF2ZSB1c2FnZS4KKyAgICAgICAgICAgICAgICAgICAgLy8gQ2hhbmdlIGl0IHRvIHRoZSBTVFJFQU1fTVVTSUMgYmVjYXVzZSBpdCdzIG5vdCBzdXBwb3J0ZWQgYnkgYXVkaW8gbWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAvLyBmb3IgcXVlcnlpbmcgdm9sdW1lIGxldmVsLgorICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPSBBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluZm8gPSBNZWRpYUNvbnRyb2xsZXIySW1wbC5QbGF5YmFja0luZm9JbXBsLmNyZWF0ZVBsYXliYWNrSW5mbygKKyAgICAgICAgICAgICAgICAgICAgUGxheWJhY2tJbmZvLlBMQVlCQUNLX1RZUEVfTE9DQUwsCisgICAgICAgICAgICAgICAgICAgIGF0dHJzLAorICAgICAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLmlzVm9sdW1lRml4ZWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gVm9sdW1lUHJvdmlkZXIyLlZPTFVNRV9DT05UUk9MX0ZJWEVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBWb2x1bWVQcm92aWRlcjIuVk9MVU1FX0NPTlRST0xfQUJTT0xVVEUsCisgICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtTWF4Vm9sdW1lKHN0cmVhbSksCisgICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtVm9sdW1lKHN0cmVhbSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW5mbyA9IE1lZGlhQ29udHJvbGxlcjJJbXBsLlBsYXliYWNrSW5mb0ltcGwuY3JlYXRlUGxheWJhY2tJbmZvKAorICAgICAgICAgICAgICAgICAgICBQbGF5YmFja0luZm8uUExBWUJBQ0tfVFlQRV9SRU1PVEUgLyogQ29udHJvbFR5cGUgKi8sCisgICAgICAgICAgICAgICAgICAgIGF0dHJzLAorICAgICAgICAgICAgICAgICAgICB2b2x1bWVQcm92aWRlci5nZXRDb250cm9sVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICB2b2x1bWVQcm92aWRlci5nZXRNYXhWb2x1bWUoKSwKKyAgICAgICAgICAgICAgICAgICAgdm9sdW1lUHJvdmlkZXIuZ2V0Q3VycmVudFZvbHVtZSgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW5mbzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZV9pbXBsKCkgeworICAgICAgICAvLyBTdG9wIHN5c3RlbSBzZXJ2aWNlIGZyb20gbGlzdGVuaW5nIHRoaXMgc2Vzc2lvbiBmaXJzdC4KKyAgICAgICAgTWVkaWFTZXNzaW9uTWFuYWdlciBtYW5hZ2VyID0KKyAgICAgICAgICAgICAgICAoTWVkaWFTZXNzaW9uTWFuYWdlcikgbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0Lk1FRElBX1NFU1NJT05fU0VSVklDRSk7CisgICAgICAgIG1hbmFnZXIuZGVzdHJveVNlc3Npb24yKG1TZXNzaW9uVG9rZW4pOworCisgICAgICAgIGlmIChtU2Vzc2lvblN0dWIgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAic2Vzc2lvbiBpcyBub3cgdW5hdmFpbGFibGUsIGlkPSIgKyBtSWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSW52YWxpZGF0ZSBwcmV2aW91c2x5IHB1Ymxpc2hlZCBzZXNzaW9uIHN0dWIuCisgICAgICAgICAgICBtU2Vzc2lvblN0dWIuZGVzdHJveU5vdExvY2tlZCgpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXI7CisgICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudDsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgcGxheWVyID0gbVBsYXllcjsKKyAgICAgICAgICAgIG1QbGF5ZXIgPSBudWxsOworICAgICAgICAgICAgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKKyAgICAgICAgICAgIG1QbGF5bGlzdEFnZW50ID0gbnVsbDsKKyAgICAgICAgICAgIG1TZXNzaW9uUGxheWxpc3RBZ2VudCA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBsYXllciAhPSBudWxsKSB7CisgICAgICAgICAgICBwbGF5ZXIudW5yZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2sobVBsYXllckV2ZW50Q2FsbGJhY2spOworICAgICAgICB9CisgICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7CisgICAgICAgICAgICBhZ2VudC51bnJlZ2lzdGVyUGxheWxpc3RFdmVudENhbGxiYWNrKG1QbGF5bGlzdEV2ZW50Q2FsbGJhY2spOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1lZGlhUGxheWVyQmFzZSBnZXRQbGF5ZXJfaW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIGdldFBsYXllcigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNZWRpYVBsYXlsaXN0QWdlbnQgZ2V0UGxheWxpc3RBZ2VudF9pbXBsKCkgeworICAgICAgICByZXR1cm4gbVBsYXlsaXN0QWdlbnQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFZvbHVtZVByb3ZpZGVyMiBnZXRWb2x1bWVQcm92aWRlcl9pbXBsKCkgeworICAgICAgICByZXR1cm4gbVZvbHVtZVByb3ZpZGVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXNzaW9uVG9rZW4yIGdldFRva2VuX2ltcGwoKSB7CisgICAgICAgIHJldHVybiBtU2Vzc2lvblRva2VuOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PENvbnRyb2xsZXJJbmZvPiBnZXRDb25uZWN0ZWRDb250cm9sbGVyc19pbXBsKCkgeworICAgICAgICByZXR1cm4gbVNlc3Npb25TdHViLmdldENvbnRyb2xsZXJzKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0QXVkaW9Gb2N1c1JlcXVlc3RfaW1wbChBdWRpb0ZvY3VzUmVxdWVzdCBhZnIpIHsKKyAgICAgICAgLy8gaW1wbGVtZW50CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcGxheV9pbXBsKCkgeworICAgICAgICBlbnN1cmVDYWxsaW5nVGhyZWFkKCk7CisgICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIgPSBtUGxheWVyOworICAgICAgICBpZiAocGxheWVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHBsYXllci5wbGF5KCk7CisgICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwYXVzZV9pbXBsKCkgeworICAgICAgICBlbnN1cmVDYWxsaW5nVGhyZWFkKCk7CisgICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIgPSBtUGxheWVyOworICAgICAgICBpZiAocGxheWVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHBsYXllci5wYXVzZSgpOworICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3RvcF9pbXBsKCkgeworICAgICAgICBlbnN1cmVDYWxsaW5nVGhyZWFkKCk7CisgICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIgPSBtUGxheWVyOworICAgICAgICBpZiAocGxheWVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHBsYXllci5yZXNldCgpOworICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2tpcFRvUGxheWxpc3RJdGVtX2ltcGwoQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7CisgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKKyAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFnZW50LnNraXBUb1BsYXlsaXN0SXRlbShpdGVtKTsKKyAgICAgICAgfSBlbHNlIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNraXBUb1ByZXZpb3VzSXRlbV9pbXBsKCkgeworICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKKyAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFnZW50LnNraXBUb1ByZXZpb3VzSXRlbSgpOworICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2tpcFRvTmV4dEl0ZW1faW1wbCgpIHsKKyAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7CisgICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7CisgICAgICAgICAgICBhZ2VudC5za2lwVG9OZXh0SXRlbSgpOworICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0Q3VzdG9tTGF5b3V0X2ltcGwoQE5vbk51bGwgQ29udHJvbGxlckluZm8gY29udHJvbGxlciwKKyAgICAgICAgICAgIEBOb25OdWxsIExpc3Q8Q29tbWFuZEJ1dHRvbj4gbGF5b3V0KSB7CisgICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKKyAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udHJvbGxlciBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGlmIChsYXlvdXQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibGF5b3V0IHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeUN1c3RvbUxheW91dE5vdExvY2tlZChjb250cm9sbGVyLCBsYXlvdXQpOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gVE9ETyhqYWV3YW4pOiBJbXBsZW1lbnQgZm9sbG93cworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRBbGxvd2VkQ29tbWFuZHNfaW1wbChATm9uTnVsbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyLAorICAgICAgICAgICAgQE5vbk51bGwgU2Vzc2lvbkNvbW1hbmRHcm91cDIgY29tbWFuZHMpIHsKKyAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udHJvbGxlciBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGlmIChjb21tYW5kcyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb21tYW5kcyBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIG1TZXNzaW9uU3R1Yi5zZXRBbGxvd2VkQ29tbWFuZHMoY29udHJvbGxlciwgY29tbWFuZHMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNlbmRDdXN0b21Db21tYW5kX2ltcGwoQE5vbk51bGwgQ29udHJvbGxlckluZm8gY29udHJvbGxlciwKKyAgICAgICAgICAgIEBOb25OdWxsIFNlc3Npb25Db21tYW5kMiBjb21tYW5kLCBCdW5kbGUgYXJncywgUmVzdWx0UmVjZWl2ZXIgcmVjZWl2ZXIpIHsKKyAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udHJvbGxlciBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmQgc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBtU2Vzc2lvblN0dWIuc2VuZEN1c3RvbUNvbW1hbmQoY29udHJvbGxlciwgY29tbWFuZCwgYXJncywgcmVjZWl2ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNlbmRDdXN0b21Db21tYW5kX2ltcGwoQE5vbk51bGwgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQsIEJ1bmRsZSBhcmdzKSB7CisgICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmQgc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBtU2Vzc2lvblN0dWIuc2VuZEN1c3RvbUNvbW1hbmQoY29tbWFuZCwgYXJncyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0UGxheWxpc3RfaW1wbChATm9uTnVsbCBMaXN0PE1lZGlhSXRlbTI+IGxpc3QsIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7CisgICAgICAgIGlmIChsaXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImxpc3Qgc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBlbnN1cmVDYWxsaW5nVGhyZWFkKCk7CisgICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OworICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgYWdlbnQuc2V0UGxheWxpc3QobGlzdCwgbWV0YWRhdGEpOworICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdXBkYXRlUGxheWxpc3RNZXRhZGF0YV9pbXBsKE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7CisgICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OworICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgYWdlbnQudXBkYXRlUGxheWxpc3RNZXRhZGF0YShtZXRhZGF0YSk7CisgICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZGRQbGF5bGlzdEl0ZW1faW1wbChpbnQgaW5kZXgsIEBOb25OdWxsIE1lZGlhSXRlbTIgaXRlbSkgeworICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbmRleCBzaG91bGRuJ3QgYmUgbmVnYXRpdmUiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtIHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7CisgICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7CisgICAgICAgICAgICBhZ2VudC5hZGRQbGF5bGlzdEl0ZW0oaW5kZXgsIGl0ZW0pOworICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUGxheWxpc3RJdGVtX2ltcGwoQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7CisgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKKyAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFnZW50LnJlbW92ZVBsYXlsaXN0SXRlbShpdGVtKTsKKyAgICAgICAgfSBlbHNlIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlcGxhY2VQbGF5bGlzdEl0ZW1faW1wbChpbnQgaW5kZXgsIEBOb25OdWxsIE1lZGlhSXRlbTIgaXRlbSkgeworICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbmRleCBzaG91bGRuJ3QgYmUgbmVnYXRpdmUiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtIHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7CisgICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7CisgICAgICAgICAgICBhZ2VudC5yZXBsYWNlUGxheWxpc3RJdGVtKGluZGV4LCBpdGVtKTsKKyAgICAgICAgfSBlbHNlIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PE1lZGlhSXRlbTI+IGdldFBsYXlsaXN0X2ltcGwoKSB7CisgICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OworICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGFnZW50LmdldFBsYXlsaXN0KCk7CisgICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1lZGlhTWV0YWRhdGEyIGdldFBsYXlsaXN0TWV0YWRhdGFfaW1wbCgpIHsKKyAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7CisgICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gYWdlbnQuZ2V0UGxheWxpc3RNZXRhZGF0YSgpOworICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNZWRpYUl0ZW0yIGdldEN1cnJlbnRQbGF5bGlzdEl0ZW1faW1wbCgpIHsKKyAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBJbXBsZW1lbnQKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRSZXBlYXRNb2RlX2ltcGwoKSB7CisgICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OworICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGFnZW50LmdldFJlcGVhdE1vZGUoKTsKKyAgICAgICAgfSBlbHNlIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX05PTkU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0UmVwZWF0TW9kZV9pbXBsKGludCByZXBlYXRNb2RlKSB7CisgICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OworICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgYWdlbnQuc2V0UmVwZWF0TW9kZShyZXBlYXRNb2RlKTsKKyAgICAgICAgfSBlbHNlIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0U2h1ZmZsZU1vZGVfaW1wbCgpIHsKKyAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7CisgICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gYWdlbnQuZ2V0U2h1ZmZsZU1vZGUoKTsKKyAgICAgICAgfSBlbHNlIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9OT05FOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFNodWZmbGVNb2RlX2ltcGwoaW50IHNodWZmbGVNb2RlKSB7CisgICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OworICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgYWdlbnQuc2V0U2h1ZmZsZU1vZGUoc2h1ZmZsZU1vZGUpOworICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcHJlcGFyZV9pbXBsKCkgeworICAgICAgICBlbnN1cmVDYWxsaW5nVGhyZWFkKCk7CisgICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIgPSBtUGxheWVyOworICAgICAgICBpZiAocGxheWVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHBsYXllci5wcmVwYXJlKCk7CisgICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZWVrVG9faW1wbChsb25nIHBvcykgeworICAgICAgICBlbnN1cmVDYWxsaW5nVGhyZWFkKCk7CisgICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIgPSBtUGxheWVyOworICAgICAgICBpZiAocGxheWVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHBsYXllci5zZWVrVG8ocG9zKTsKKyAgICAgICAgfSBlbHNlIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBAUGxheWVyU3RhdGUgaW50IGdldFBsYXllclN0YXRlX2ltcGwoKSB7CisgICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIgPSBtUGxheWVyOworICAgICAgICBpZiAocGxheWVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtUGxheWVyLmdldFBsYXllclN0YXRlKCk7CisgICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE1lZGlhUGxheWVyQmFzZS5QTEFZRVJfU1RBVEVfRVJST1I7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZ2V0Q3VycmVudFBvc2l0aW9uX2ltcGwoKSB7CisgICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIgPSBtUGxheWVyOworICAgICAgICBpZiAocGxheWVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtUGxheWVyLmdldEN1cnJlbnRQb3NpdGlvbigpOworICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBNZWRpYVBsYXllckJhc2UuVU5LTk9XTl9USU1FOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGdldEJ1ZmZlcmVkUG9zaXRpb25faW1wbCgpIHsKKyAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7CisgICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXIuZ2V0QnVmZmVyZWRQb3NpdGlvbigpOworICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBNZWRpYVBsYXllckJhc2UuVU5LTk9XTl9USU1FOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG5vdGlmeUVycm9yX2ltcGwoaW50IGVycm9yQ29kZSwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICBtU2Vzc2lvblN0dWIubm90aWZ5RXJyb3IoZXJyb3JDb2RlLCBleHRyYXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldE9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXJfaW1wbChATm9uTnVsbCBPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyIGhlbHBlcikgeworICAgICAgICBpZiAoaGVscGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImhlbHBlciBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIG1Ec21IZWxwZXIgPSBoZWxwZXI7CisgICAgICAgICAgICBpZiAobVNlc3Npb25QbGF5bGlzdEFnZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtU2Vzc2lvblBsYXlsaXN0QWdlbnQuc2V0T25EYXRhU291cmNlTWlzc2luZ0hlbHBlcihoZWxwZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xlYXJPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyX2ltcGwoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIG1Ec21IZWxwZXIgPSBudWxsOworICAgICAgICAgICAgaWYgKG1TZXNzaW9uUGxheWxpc3RBZ2VudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVNlc3Npb25QbGF5bGlzdEFnZW50LmNsZWFyT25EYXRhU291cmNlTWlzc2luZ0hlbHBlcigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gUHJvdGVjdGVkIG9yIHByaXZhdGUgbWV0aG9kcworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgLy8gRW5mb3JjZXMgZGV2ZWxvcGVycyB0byBjYWxsIGFsbCB0aGUgbWV0aG9kcyBvbiB0aGUgaW5pdGlhbGx5IGdpdmVuIHRocmVhZAorICAgIC8vIGJlY2F1c2UgY2FsbHMgZnJvbSB0aGUgTWVkaWFDb250cm9sbGVyMiB3aWxsIGJlIHJ1biBvbiB0aGUgdGhyZWFkLgorICAgIC8vIFRPRE8oamFld2FuKTogU2hvdWxkIHdlIGFsbG93IGNhbGxzIGZyb20gdGhlIG11bHRpcGxlIHRocmVhZD8KKyAgICAvLyAgICAgICAgICAgICAgIEkgcHJlZmVyIHRoaXMgd2F5IGJlY2F1c2UgYWxsb3dpbmcgbXVsdGlwbGUgdGhyZWFkIG1heSBjYXNlIHRyaWNreSBpc3N1ZSBsaWtlCisgICAgLy8gICAgICAgICAgICAgICBiLzYzNDQ2MzYwLiBJZiB0aGUge0BsaW5rICNzZXRQbGF5ZXIoKX0gd2l0aCB7QGNvZGUgbnVsbH0gY2FuIGJlIGNhbGxlZCBmcm9tCisgICAgLy8gICAgICAgICAgICAgICBhbm90aGVyIHRocmVhZCwgdHJhbnNwb3J0IGNvbnRyb2xzIGNhbiBiZSBjYWxsZWQgYWZ0ZXIgdGhhdC4KKyAgICAvLyAgICAgICAgICAgICAgIFRoYXQncyBiYXNpY2FsbHkgdGhlIGRldmVsb3BlcidzIG1pc3Rha2UsIGJ1dCB0aGV5IGNhbm5vdCB1bmRlcnN0YW5kIHdoYXQncworICAgIC8vICAgICAgICAgICAgICAgaGFwcGVuaW5nIGJlaGluZCB1bnRpbCB3ZSB0ZWxsIHRoZW0gc28uCisgICAgLy8gICAgICAgICAgICAgICBJZiBlbmZvcmNpbmcgY2FsbGxpbmcgdGhyZWFkIGRvZXNuJ3QgbG9vayBnb29kLCB3ZSBjYW4gYWx0ZXJuYXRpdmVseSBwaWNrCisgICAgLy8gICAgICAgICAgICAgICAxLiBBbGxvdyBjYWxscyBmcm9tIHJhbmRvbSB0aHJlYWRzIGZvciBhbGwgbWV0aG9kcy4KKyAgICAvLyAgICAgICAgICAgICAgIDIuIEFsbG93IGNhbGxzIGZyb20gcmFuZG9tIHRocmVhZHMgZm9yIGFsbCBtZXRob2RzLCBleGNlcHQgZm9yIHRoZQorICAgIC8vICAgICAgICAgICAgICAgICAge0BsaW5rICNzZXRQbGF5ZXIoKX0uCisgICAgdm9pZCBlbnN1cmVDYWxsaW5nVGhyZWFkKCkgeworICAgICAgICAvLyBUT0RPKGphZXdhbik6IFVuY29tbWVudCBvciByZW1vdmUKKyAgICAgICAgLyoKKyAgICAgICAgaWYgKG1IYW5kbGVyLmdldExvb3BlcigpICE9IExvb3Blci5teUxvb3BlcigpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJSdW4gdGhpcyBvbiB0aGUgZ2l2ZW4gdGhyZWFkIik7CisgICAgICAgIH0qLworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBub3RpZnlQbGF5bGlzdENoYW5nZWRPbkV4ZWN1dG9yKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LAorICAgICAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiBsaXN0LCBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgeworICAgICAgICBpZiAocGxheWxpc3RBZ2VudCAhPSBtUGxheWxpc3RBZ2VudCkgeworICAgICAgICAgICAgLy8gSWdub3JlIGNhbGxzIGZyb20gdGhlIG9sZCBhZ2VudC4KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtQ2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWQobUluc3RhbmNlLCBwbGF5bGlzdEFnZW50LCBsaXN0LCBtZXRhZGF0YSk7CisgICAgICAgIG1TZXNzaW9uU3R1Yi5ub3RpZnlQbGF5bGlzdENoYW5nZWROb3RMb2NrZWQobGlzdCwgbWV0YWRhdGEpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBub3RpZnlQbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZE9uRXhlY3V0b3IoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsCisgICAgICAgICAgICBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgeworICAgICAgICBpZiAocGxheWxpc3RBZ2VudCAhPSBtUGxheWxpc3RBZ2VudCkgeworICAgICAgICAgICAgLy8gSWdub3JlIGNhbGxzIGZyb20gdGhlIG9sZCBhZ2VudC4KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtQ2FsbGJhY2sub25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZChtSW5zdGFuY2UsIHBsYXlsaXN0QWdlbnQsIG1ldGFkYXRhKTsKKyAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeVBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkTm90TG9ja2VkKG1ldGFkYXRhKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbm90aWZ5UmVwZWF0TW9kZUNoYW5nZWRPbkV4ZWN1dG9yKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LAorICAgICAgICAgICAgaW50IHJlcGVhdE1vZGUpIHsKKyAgICAgICAgaWYgKHBsYXlsaXN0QWdlbnQgIT0gbVBsYXlsaXN0QWdlbnQpIHsKKyAgICAgICAgICAgIC8vIElnbm9yZSBjYWxscyBmcm9tIHRoZSBvbGQgYWdlbnQuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbUNhbGxiYWNrLm9uUmVwZWF0TW9kZUNoYW5nZWQobUluc3RhbmNlLCBwbGF5bGlzdEFnZW50LCByZXBlYXRNb2RlKTsKKyAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeVJlcGVhdE1vZGVDaGFuZ2VkTm90TG9ja2VkKHJlcGVhdE1vZGUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBub3RpZnlTaHVmZmxlTW9kZUNoYW5nZWRPbkV4ZWN1dG9yKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LAorICAgICAgICAgICAgaW50IHNodWZmbGVNb2RlKSB7CisgICAgICAgIGlmIChwbGF5bGlzdEFnZW50ICE9IG1QbGF5bGlzdEFnZW50KSB7CisgICAgICAgICAgICAvLyBJZ25vcmUgY2FsbHMgZnJvbSB0aGUgb2xkIGFnZW50LgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1DYWxsYmFjay5vblNodWZmbGVNb2RlQ2hhbmdlZChtSW5zdGFuY2UsIHBsYXlsaXN0QWdlbnQsIHNodWZmbGVNb2RlKTsKKyAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeVNodWZmbGVNb2RlQ2hhbmdlZE5vdExvY2tlZChzaHVmZmxlTW9kZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG5vdGlmeVBsYXllclVwZGF0ZWROb3RMb2NrZWQoTWVkaWFQbGF5ZXJCYXNlIG9sZFBsYXllcikgeworICAgICAgICBmaW5hbCBNZWRpYVBsYXllckJhc2UgcGxheWVyID0gbVBsYXllcjsKKyAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiAoQ2FuIGJlIHBvc3QtUCkgRmluZCBiZXR0ZXIgd2F5IGZvciBwbGF5ZXIuZ2V0UGxheWVyU3RhdGUoKSAvLworICAgICAgICAvLyAgICAgICAgICAgICAgIEluIHRoZW9yeSwgU2Vzc2lvbi5nZXRYWFgoKSBtYXkgbm90IGJlIHRoZSBzYW1lIGFzIFBsYXllci5nZXRYWFgoKQorICAgICAgICAvLyAgICAgICAgICAgICAgIGFuZCB3ZSBzaG91bGQgbm90aWZ5IGluZm9ybWF0aW9uIG9mIHRoZSBzZXNzaW9uLmdldFhYWCgpIGluc3RlYWQgb2YKKyAgICAgICAgLy8gICAgICAgICAgICAgICBwbGF5ZXIuZ2V0WFhYKCkKKyAgICAgICAgLy8gTm90aWZ5IHRvIGNvbnRyb2xsZXJzIGFzIHdlbGwuCisgICAgICAgIGZpbmFsIGludCBzdGF0ZSA9IHBsYXllci5nZXRQbGF5ZXJTdGF0ZSgpOworICAgICAgICBpZiAoc3RhdGUgIT0gb2xkUGxheWVyLmdldFBsYXllclN0YXRlKCkpIHsKKyAgICAgICAgICAgIG1TZXNzaW9uU3R1Yi5ub3RpZnlQbGF5ZXJTdGF0ZUNoYW5nZWROb3RMb2NrZWQoc3RhdGUpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgbG9uZyBjdXJyZW50VGltZU1zID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGZpbmFsIGxvbmcgcG9zaXRpb24gPSBwbGF5ZXIuZ2V0Q3VycmVudFBvc2l0aW9uKCk7CisgICAgICAgIGlmIChwb3NpdGlvbiAhPSBvbGRQbGF5ZXIuZ2V0Q3VycmVudFBvc2l0aW9uKCkpIHsKKyAgICAgICAgICAgIG1TZXNzaW9uU3R1Yi5ub3RpZnlQb3NpdGlvbkNoYW5nZWROb3RMb2NrZWQoY3VycmVudFRpbWVNcywgcG9zaXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgZmxvYXQgc3BlZWQgPSBwbGF5ZXIuZ2V0UGxheWJhY2tTcGVlZCgpOworICAgICAgICBpZiAoc3BlZWQgIT0gb2xkUGxheWVyLmdldFBsYXliYWNrU3BlZWQoKSkgeworICAgICAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeVBsYXliYWNrU3BlZWRDaGFuZ2VkTm90TG9ja2VkKHNwZWVkKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGxvbmcgYnVmZmVyZWRQb3NpdGlvbiA9IHBsYXllci5nZXRCdWZmZXJlZFBvc2l0aW9uKCk7CisgICAgICAgIGlmIChidWZmZXJlZFBvc2l0aW9uICE9IG9sZFBsYXllci5nZXRCdWZmZXJlZFBvc2l0aW9uKCkpIHsKKyAgICAgICAgICAgIG1TZXNzaW9uU3R1Yi5ub3RpZnlCdWZmZXJlZFBvc2l0aW9uQ2hhbmdlZE5vdExvY2tlZChidWZmZXJlZFBvc2l0aW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIENvbnRleHQgZ2V0Q29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIG1Db250ZXh0OworICAgIH0KKworICAgIE1lZGlhU2Vzc2lvbjIgZ2V0SW5zdGFuY2UoKSB7CisgICAgICAgIHJldHVybiBtSW5zdGFuY2U7CisgICAgfQorCisgICAgTWVkaWFQbGF5ZXJCYXNlIGdldFBsYXllcigpIHsKKyAgICAgICAgcmV0dXJuIG1QbGF5ZXI7CisgICAgfQorCisgICAgTWVkaWFQbGF5bGlzdEFnZW50IGdldFBsYXlsaXN0QWdlbnQoKSB7CisgICAgICAgIHJldHVybiBtUGxheWxpc3RBZ2VudDsKKyAgICB9CisKKyAgICBFeGVjdXRvciBnZXRDYWxsYmFja0V4ZWN1dG9yKCkgeworICAgICAgICByZXR1cm4gbUNhbGxiYWNrRXhlY3V0b3I7CisgICAgfQorCisgICAgU2Vzc2lvbkNhbGxiYWNrIGdldENhbGxiYWNrKCkgeworICAgICAgICByZXR1cm4gbUNhbGxiYWNrOworICAgIH0KKworICAgIE1lZGlhU2Vzc2lvbjJTdHViIGdldFNlc3Npb25TdHViKCkgeworICAgICAgICByZXR1cm4gbVNlc3Npb25TdHViOworICAgIH0KKworICAgIFZvbHVtZVByb3ZpZGVyMiBnZXRWb2x1bWVQcm92aWRlcigpIHsKKyAgICAgICAgcmV0dXJuIG1Wb2x1bWVQcm92aWRlcjsKKyAgICB9CisKKyAgICBQbGF5YmFja0luZm8gZ2V0UGxheWJhY2tJbmZvKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICByZXR1cm4gbVBsYXliYWNrSW5mbzsKKyAgICAgICAgfQorICAgIH0KKworICAgIFBlbmRpbmdJbnRlbnQgZ2V0U2Vzc2lvbkFjdGl2aXR5KCkgeworICAgICAgICByZXR1cm4gbVNlc3Npb25BY3Rpdml0eTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNeVBsYXllckV2ZW50Q2FsbGJhY2sgZXh0ZW5kcyBQbGF5ZXJFdmVudENhbGxiYWNrIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBXZWFrUmVmZXJlbmNlPE1lZGlhU2Vzc2lvbjJJbXBsPiBtU2Vzc2lvbjsKKworICAgICAgICBwcml2YXRlIE15UGxheWVyRXZlbnRDYWxsYmFjayhNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uKSB7CisgICAgICAgICAgICBtU2Vzc2lvbiA9IG5ldyBXZWFrUmVmZXJlbmNlPD4oc2Vzc2lvbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DdXJyZW50RGF0YVNvdXJjZUNoYW5nZWQoTWVkaWFQbGF5ZXJCYXNlIG1wYiwgRGF0YVNvdXJjZURlc2MgZHNkKSB7CisgICAgICAgICAgICBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gZ2V0U2Vzc2lvbigpOworICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCB8fCBkc2QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4geworICAgICAgICAgICAgICAgIE1lZGlhSXRlbTIgaXRlbSA9IGdldE1lZGlhSXRlbShzZXNzaW9uLCBkc2QpOworICAgICAgICAgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25DdXJyZW50TWVkaWFJdGVtQ2hhbmdlZChzZXNzaW9uLmdldEluc3RhbmNlKCksIG1wYiwgaXRlbSk7CisgICAgICAgICAgICAgICAgLy8gVE9ETyAoamFld2FuKTogTm90aWZ5IGNvbnRyb2xsZXJzIHRocm91Z2ggYXBwcm9wcmlhdGUgY2FsbGJhY2suIChiLzc0NTA1OTM2KQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25NZWRpYVByZXBhcmVkKE1lZGlhUGxheWVyQmFzZSBtcGIsIERhdGFTb3VyY2VEZXNjIGRzZCkgeworICAgICAgICAgICAgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IGdldFNlc3Npb24oKTsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwgfHwgZHNkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKKyAgICAgICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBnZXRNZWRpYUl0ZW0oc2Vzc2lvbiwgZHNkKTsKKyAgICAgICAgICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uTWVkaWFQcmVwYXJlZChzZXNzaW9uLmdldEluc3RhbmNlKCksIG1wYiwgaXRlbSk7CisgICAgICAgICAgICAgICAgLy8gVE9ETyAoamFld2FuKTogTm90aWZ5IGNvbnRyb2xsZXJzIHRocm91Z2ggYXBwcm9wcmlhdGUgY2FsbGJhY2suIChiLzc0NTA1OTM2KQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25QbGF5ZXJTdGF0ZUNoYW5nZWQoTWVkaWFQbGF5ZXJCYXNlIG1wYiwgaW50IHN0YXRlKSB7CisgICAgICAgICAgICBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gZ2V0U2Vzc2lvbigpOworICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4geworICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vblBsYXllclN0YXRlQ2hhbmdlZChzZXNzaW9uLmdldEluc3RhbmNlKCksIG1wYiwgc3RhdGUpOworICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0U2Vzc2lvblN0dWIoKS5ub3RpZnlQbGF5ZXJTdGF0ZUNoYW5nZWROb3RMb2NrZWQoc3RhdGUpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25CdWZmZXJpbmdTdGF0ZUNoYW5nZWQoTWVkaWFQbGF5ZXJCYXNlIG1wYiwgRGF0YVNvdXJjZURlc2MgZHNkLCBpbnQgc3RhdGUpIHsKKyAgICAgICAgICAgIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBnZXRTZXNzaW9uKCk7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsIHx8IGRzZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7CisgICAgICAgICAgICAgICAgTWVkaWFJdGVtMiBpdGVtID0gZ2V0TWVkaWFJdGVtKHNlc3Npb24sIGRzZCk7CisgICAgICAgICAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbkJ1ZmZlcmluZ1N0YXRlQ2hhbmdlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgbXBiLCBpdGVtLCBzdGF0ZSk7CisgICAgICAgICAgICAgICAgLy8gVE9ETyAoamFld2FuKTogTm90aWZ5IGNvbnRyb2xsZXJzIHRocm91Z2ggYXBwcm9wcmlhdGUgY2FsbGJhY2suIChiLzc0NTA1OTM2KQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIE1lZGlhU2Vzc2lvbjJJbXBsIGdldFNlc3Npb24oKSB7CisgICAgICAgICAgICBmaW5hbCBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gbVNlc3Npb24uZ2V0KCk7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsICYmIERFQlVHKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU2Vzc2lvbiBpcyBjbG9zZWQiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHNlc3Npb247CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIE1lZGlhSXRlbTIgZ2V0TWVkaWFJdGVtKE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24sIERhdGFTb3VyY2VEZXNjIGRzZCkgeworICAgICAgICAgICAgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gc2Vzc2lvbi5nZXRQbGF5bGlzdEFnZW50KCk7CisgICAgICAgICAgICBpZiAoYWdlbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJTZXNzaW9uIGlzIGNsb3NlZCIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTWVkaWFJdGVtMiBpdGVtID0gYWdlbnQuZ2V0TWVkaWFJdGVtKGRzZCk7CisgICAgICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkNvdWxkIG5vdCBmaW5kIG1hdGNoaW5nIGl0ZW0gZm9yIGRzZD0iICsgZHNkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBpdGVtOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTXlQbGF5bGlzdEV2ZW50Q2FsbGJhY2sgZXh0ZW5kcyBQbGF5bGlzdEV2ZW50Q2FsbGJhY2sgeworICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8TWVkaWFTZXNzaW9uMkltcGw+IG1TZXNzaW9uOworCisgICAgICAgIHByaXZhdGUgTXlQbGF5bGlzdEV2ZW50Q2FsbGJhY2soTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbikgeworICAgICAgICAgICAgbVNlc3Npb24gPSBuZXcgV2Vha1JlZmVyZW5jZTw+KHNlc3Npb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheWxpc3RDaGFuZ2VkKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LCBMaXN0PE1lZGlhSXRlbTI+IGxpc3QsCisgICAgICAgICAgICAgICAgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKKyAgICAgICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBtU2Vzc2lvbi5nZXQoKTsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXNzaW9uLm5vdGlmeVBsYXlsaXN0Q2hhbmdlZE9uRXhlY3V0b3IocGxheWxpc3RBZ2VudCwgbGlzdCwgbWV0YWRhdGEpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWQoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsCisgICAgICAgICAgICAgICAgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKKyAgICAgICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBtU2Vzc2lvbi5nZXQoKTsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXNzaW9uLm5vdGlmeVBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkT25FeGVjdXRvcihwbGF5bGlzdEFnZW50LCBtZXRhZGF0YSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25SZXBlYXRNb2RlQ2hhbmdlZChNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwgaW50IHJlcGVhdE1vZGUpIHsKKyAgICAgICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBtU2Vzc2lvbi5nZXQoKTsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXNzaW9uLm5vdGlmeVJlcGVhdE1vZGVDaGFuZ2VkT25FeGVjdXRvcihwbGF5bGlzdEFnZW50LCByZXBlYXRNb2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblNodWZmbGVNb2RlQ2hhbmdlZChNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwgaW50IHNodWZmbGVNb2RlKSB7CisgICAgICAgICAgICBmaW5hbCBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gbVNlc3Npb24uZ2V0KCk7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2Vzc2lvbi5ub3RpZnlTaHVmZmxlTW9kZUNoYW5nZWRPbkV4ZWN1dG9yKHBsYXlsaXN0QWdlbnQsIHNodWZmbGVNb2RlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQ29tbWFuZEltcGwgaW1wbGVtZW50cyBDb21tYW5kUHJvdmlkZXIgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTU1BTkRfQ09ERQorICAgICAgICAgICAgICAgID0gImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIuY29tbWFuZC5jb21tYW5kX2NvZGUiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTU1BTkRfQ1VTVE9NX0NPTU1BTkQKKyAgICAgICAgICAgICAgICA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmNvbW1hbmQuY3VzdG9tX2NvbW1hbmQiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTU1BTkRfRVhUUkFTCisgICAgICAgICAgICAgICAgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYV9zZXNzaW9uMi5jb21tYW5kLmV4dHJhcyI7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZXNzaW9uQ29tbWFuZDIgbUluc3RhbmNlOworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtQ29tbWFuZENvZGU7CisgICAgICAgIC8vIE5vbm51bGwgaWYgaXQncyBjdXN0b20gY29tbWFuZAorICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQ3VzdG9tQ29tbWFuZDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUV4dHJhczsKKworICAgICAgICBwdWJsaWMgQ29tbWFuZEltcGwoU2Vzc2lvbkNvbW1hbmQyIGluc3RhbmNlLCBpbnQgY29tbWFuZENvZGUpIHsKKyAgICAgICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOworICAgICAgICAgICAgbUNvbW1hbmRDb2RlID0gY29tbWFuZENvZGU7CisgICAgICAgICAgICBtQ3VzdG9tQ29tbWFuZCA9IG51bGw7CisgICAgICAgICAgICBtRXh0cmFzID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb21tYW5kSW1wbChTZXNzaW9uQ29tbWFuZDIgaW5zdGFuY2UsIEBOb25OdWxsIFN0cmluZyBhY3Rpb24sCisgICAgICAgICAgICAgICAgQE51bGxhYmxlIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFjdGlvbiBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7CisgICAgICAgICAgICBtQ29tbWFuZENvZGUgPSBDT01NQU5EX0NPREVfQ1VTVE9NOworICAgICAgICAgICAgbUN1c3RvbUNvbW1hbmQgPSBhY3Rpb247CisgICAgICAgICAgICBtRXh0cmFzID0gZXh0cmFzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Q29tbWFuZENvZGVfaW1wbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ29tbWFuZENvZGU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEBOdWxsYWJsZSBTdHJpbmcgZ2V0Q3VzdG9tQ29tbWFuZF9pbXBsKCkgeworICAgICAgICAgICAgcmV0dXJuIG1DdXN0b21Db21tYW5kOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBATnVsbGFibGUgQnVuZGxlIGdldEV4dHJhc19pbXBsKCkgeworICAgICAgICAgICAgcmV0dXJuIG1FeHRyYXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiBhIG5ldyBCdW5kbGUgaW5zdGFuY2UgZnJvbSB0aGUgQ29tbWFuZAorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCdW5kbGUgdG9CdW5kbGVfaW1wbCgpIHsKKyAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICBidW5kbGUucHV0SW50KEtFWV9DT01NQU5EX0NPREUsIG1Db21tYW5kQ29kZSk7CisgICAgICAgICAgICBidW5kbGUucHV0U3RyaW5nKEtFWV9DT01NQU5EX0NVU1RPTV9DT01NQU5ELCBtQ3VzdG9tQ29tbWFuZCk7CisgICAgICAgICAgICBidW5kbGUucHV0QnVuZGxlKEtFWV9DT01NQU5EX0VYVFJBUywgbUV4dHJhcyk7CisgICAgICAgICAgICByZXR1cm4gYnVuZGxlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gYSBuZXcgQ29tbWFuZCBpbnN0YW5jZSBmcm9tIHRoZSBCdW5kbGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgU2Vzc2lvbkNvbW1hbmQyIGZyb21CdW5kbGVfaW1wbChATm9uTnVsbCBCdW5kbGUgY29tbWFuZCkgeworICAgICAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmQgc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBjb2RlID0gY29tbWFuZC5nZXRJbnQoS0VZX0NPTU1BTkRfQ09ERSk7CisgICAgICAgICAgICBpZiAoY29kZSAhPSBDT01NQU5EX0NPREVfQ1VTVE9NKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXNzaW9uQ29tbWFuZDIoY29kZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFN0cmluZyBjdXN0b21Db21tYW5kID0gY29tbWFuZC5nZXRTdHJpbmcoS0VZX0NPTU1BTkRfQ1VTVE9NX0NPTU1BTkQpOworICAgICAgICAgICAgICAgIGlmIChjdXN0b21Db21tYW5kID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2Vzc2lvbkNvbW1hbmQyKGN1c3RvbUNvbW1hbmQsIGNvbW1hbmQuZ2V0QnVuZGxlKEtFWV9DT01NQU5EX0VYVFJBUykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFsc19pbXBsKE9iamVjdCBvYmopIHsKKyAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIENvbW1hbmRJbXBsKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbW1hbmRJbXBsIG90aGVyID0gKENvbW1hbmRJbXBsKSBvYmo7CisgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IENvbXBhcmUgQ29tbWFuZHMgd2l0aCB0aGUgZ2VuZXJhdGVkIFVVSUQsIGFzIHdlJ3JlIGRvaW5nIGZvciB0aGUgTUkyLgorICAgICAgICAgICAgcmV0dXJuIG1Db21tYW5kQ29kZSA9PSBvdGhlci5tQ29tbWFuZENvZGUKKyAgICAgICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmVxdWFscyhtQ3VzdG9tQ29tbWFuZCwgb3RoZXIubUN1c3RvbUNvbW1hbmQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGVfaW1wbCgpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBwcmltZSA9IDMxOworICAgICAgICAgICAgcmV0dXJuICgobUN1c3RvbUNvbW1hbmQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgPyBtQ3VzdG9tQ29tbWFuZC5oYXNoQ29kZSgpIDogMCkgKiBwcmltZSArIG1Db21tYW5kQ29kZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudCBzZXQgb2Yge0BsaW5rIFNlc3Npb25Db21tYW5kMn0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb21tYW5kR3JvdXBJbXBsIGltcGxlbWVudHMgQ29tbWFuZEdyb3VwUHJvdmlkZXIgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTU1BTkRTID0KKyAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5tZWRpYXNlc3Npb24yLmNvbW1hbmRncm91cC5jb21tYW5kcyI7CisKKyAgICAgICAgLy8gUHJlZml4IGZvciBhbGwgY29tbWFuZCBjb2RlcworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0NPTU1BTkRfQ09ERSA9ICJDT01NQU5EX0NPREVfIjsKKworICAgICAgICAvLyBQcmVmaXggZm9yIGNvbW1hbmQgY29kZXMgdGhhdCB3aWxsIGJlIHNlbnQgZGlyZWN0bHkgdG8gdGhlIE1lZGlhUGxheWVyQmFzZQorICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0NPTU1BTkRfQ09ERV9QTEFZQkFDSyA9ICJDT01NQU5EX0NPREVfUExBWUJBQ0tfIjsKKworICAgICAgICAvLyBQcmVmaXggZm9yIGNvbW1hbmQgY29kZXMgdGhhdCB3aWxsIGJlIHNlbnQgZGlyZWN0bHkgdG8gdGhlIE1lZGlhUGxheWxpc3RBZ2VudAorICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0NPTU1BTkRfQ09ERV9QTEFZTElTVCA9ICJDT01NQU5EX0NPREVfUExBWUxJU1RfIjsKKworICAgICAgICBwcml2YXRlIFNldDxTZXNzaW9uQ29tbWFuZDI+IG1Db21tYW5kcyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZXNzaW9uQ29tbWFuZEdyb3VwMiBtSW5zdGFuY2U7CisKKyAgICAgICAgcHVibGljIENvbW1hbmRHcm91cEltcGwoU2Vzc2lvbkNvbW1hbmRHcm91cDIgaW5zdGFuY2UsIE9iamVjdCBvdGhlcikgeworICAgICAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7CisgICAgICAgICAgICBpZiAob3RoZXIgIT0gbnVsbCAmJiBvdGhlciBpbnN0YW5jZW9mIENvbW1hbmRHcm91cEltcGwpIHsKKyAgICAgICAgICAgICAgICBtQ29tbWFuZHMuYWRkQWxsKCgoQ29tbWFuZEdyb3VwSW1wbCkgb3RoZXIpLm1Db21tYW5kcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ29tbWFuZEdyb3VwSW1wbCgpIHsKKyAgICAgICAgICAgIG1JbnN0YW5jZSA9IG5ldyBTZXNzaW9uQ29tbWFuZEdyb3VwMih0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBhZGRDb21tYW5kX2ltcGwoQE5vbk51bGwgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQpIHsKKyAgICAgICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb21tYW5kIHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29tbWFuZHMuYWRkKGNvbW1hbmQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZEFsbFByZWRlZmluZWRDb21tYW5kc19pbXBsKCkgeworICAgICAgICAgICAgYWRkQ29tbWFuZHNXaXRoUHJlZml4KFBSRUZJWF9DT01NQU5EX0NPREUpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBhZGRBbGxQbGF5YmFja0NvbW1hbmRzKCkgeworICAgICAgICAgICAgYWRkQ29tbWFuZHNXaXRoUHJlZml4KFBSRUZJWF9DT01NQU5EX0NPREVfUExBWUJBQ0spOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBhZGRBbGxQbGF5bGlzdENvbW1hbmRzKCkgeworICAgICAgICAgICAgYWRkQ29tbWFuZHNXaXRoUHJlZml4KFBSRUZJWF9DT01NQU5EX0NPREVfUExBWUxJU1QpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGFkZENvbW1hbmRzV2l0aFByZWZpeChTdHJpbmcgcHJlZml4KSB7CisgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IChDYW4gYmUgcG9zdC1QKTogRG9uJ3QgdXNlIHJlZmxlY3Rpb24gZm9yIHRoaXMgcHVycG9zZS4KKyAgICAgICAgICAgIGZpbmFsIEZpZWxkW10gZmllbGRzID0gTWVkaWFTZXNzaW9uMi5jbGFzcy5nZXRGaWVsZHMoKTsKKyAgICAgICAgICAgIGlmIChmaWVsZHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZHNbaV0uZ2V0TmFtZSgpLnN0YXJ0c1dpdGgocHJlZml4KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29tbWFuZHMuYWRkKG5ldyBTZXNzaW9uQ29tbWFuZDIoZmllbGRzW2ldLmdldEludChudWxsKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5leHBlY3RlZCAiICsgZmllbGRzW2ldICsgIiBpbiBNZWRpYVNlc3Npb24yIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlQ29tbWFuZF9pbXBsKEBOb25OdWxsIFNlc3Npb25Db21tYW5kMiBjb21tYW5kKSB7CisgICAgICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29tbWFuZCBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNvbW1hbmRzLnJlbW92ZShjb21tYW5kKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNDb21tYW5kX2ltcGwoQE5vbk51bGwgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQpIHsKKyAgICAgICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb21tYW5kIHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbUNvbW1hbmRzLmNvbnRhaW5zKGNvbW1hbmQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0NvbW1hbmRfaW1wbChpbnQgY29kZSkgeworICAgICAgICAgICAgaWYgKGNvZGUgPT0gQ09NTUFORF9DT0RFX0NVU1RPTSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVzZSBoYXNDb21tYW5kKENvbW1hbmQpIGZvciBjdXN0b20gY29tbWFuZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCA6IG1Db21tYW5kcykgeworICAgICAgICAgICAgICAgIGlmIChjb21tYW5kLmdldENvbW1hbmRDb2RlKCkgPT0gY29kZSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFNldDxTZXNzaW9uQ29tbWFuZDI+IGdldENvbW1hbmRzX2ltcGwoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0Q29tbWFuZHMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTZXQ8U2Vzc2lvbkNvbW1hbmQyPiBnZXRDb21tYW5kcygpIHsKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQobUNvbW1hbmRzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIG5ldyBidW5kbGUgZnJvbSB0aGUgQ29tbWFuZEdyb3VwCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ1bmRsZSB0b0J1bmRsZV9pbXBsKCkgeworICAgICAgICAgICAgQXJyYXlMaXN0PEJ1bmRsZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgZm9yIChTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCA6IG1Db21tYW5kcykgeworICAgICAgICAgICAgICAgIGxpc3QuYWRkKGNvbW1hbmQudG9CdW5kbGUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgYnVuZGxlLnB1dFBhcmNlbGFibGVBcnJheUxpc3QoS0VZX0NPTU1BTkRTLCBsaXN0KTsKKyAgICAgICAgICAgIHJldHVybiBidW5kbGU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiBuZXcgaW5zdGFuY2Ugb2YgQ29tbWFuZEdyb3VwIGZyb20gdGhlIGJ1bmRsZQorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBATnVsbGFibGUgU2Vzc2lvbkNvbW1hbmRHcm91cDIgZnJvbUJ1bmRsZV9pbXBsKEJ1bmRsZSBjb21tYW5kcykgeworICAgICAgICAgICAgaWYgKGNvbW1hbmRzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExpc3Q8UGFyY2VsYWJsZT4gbGlzdCA9IGNvbW1hbmRzLmdldFBhcmNlbGFibGVBcnJheUxpc3QoS0VZX0NPTU1BTkRTKTsKKyAgICAgICAgICAgIGlmIChsaXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFNlc3Npb25Db21tYW5kR3JvdXAyIGNvbW1hbmRHcm91cCA9IG5ldyBTZXNzaW9uQ29tbWFuZEdyb3VwMigpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgUGFyY2VsYWJsZSBwYXJjZWxhYmxlID0gbGlzdC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKCEocGFyY2VsYWJsZSBpbnN0YW5jZW9mIEJ1bmRsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEJ1bmRsZSBjb21tYW5kQnVuZGxlID0gKEJ1bmRsZSkgcGFyY2VsYWJsZTsKKyAgICAgICAgICAgICAgICBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCA9IFNlc3Npb25Db21tYW5kMi5mcm9tQnVuZGxlKGNvbW1hbmRCdW5kbGUpOworICAgICAgICAgICAgICAgIGlmIChjb21tYW5kICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY29tbWFuZEdyb3VwLmFkZENvbW1hbmQoY29tbWFuZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGNvbW1hbmRHcm91cDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29udHJvbGxlckluZm9JbXBsIGltcGxlbWVudHMgQ29udHJvbGxlckluZm9Qcm92aWRlciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgQ29udHJvbGxlckluZm8gbUluc3RhbmNlOworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtVWlkOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUGFja2FnZU5hbWU7CisgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtSXNUcnVzdGVkOworICAgICAgICBwcml2YXRlIGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIG1Db250cm9sbGVyQmluZGVyOworCisgICAgICAgIHB1YmxpYyBDb250cm9sbGVySW5mb0ltcGwoQ29udGV4dCBjb250ZXh0LCBDb250cm9sbGVySW5mbyBpbnN0YW5jZSwgaW50IHVpZCwKKyAgICAgICAgICAgICAgICBpbnQgcGlkLCBATm9uTnVsbCBTdHJpbmcgcGFja2FnZU5hbWUsIEBOb25OdWxsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxiYWNrKSB7CisgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocGFja2FnZU5hbWUpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGFja2FnZU5hbWUgc2hvdWxkbid0IGJlIGVtcHR5Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbGxiYWNrIHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOworICAgICAgICAgICAgbVVpZCA9IHVpZDsKKyAgICAgICAgICAgIG1QYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lOworICAgICAgICAgICAgbUNvbnRyb2xsZXJCaW5kZXIgPSBjYWxsYmFjazsKKyAgICAgICAgICAgIE1lZGlhU2Vzc2lvbk1hbmFnZXIgbWFuYWdlciA9CisgICAgICAgICAgICAgICAgICAoTWVkaWFTZXNzaW9uTWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTUVESUFfU0VTU0lPTl9TRVJWSUNFKTsKKyAgICAgICAgICAgIC8vIEFzayBzZXJ2ZXIgd2hldGhlciB0aGUgY29udHJvbGxlciBpcyB0cnVzdGVkLgorICAgICAgICAgICAgLy8gQXBwIGNhbm5vdCBrbm93IHRoaXMgYmVjYXVzZSBhcHBzIGNhbm5vdCBxdWVyeSBlbmFibGVkIG5vdGlmaWNhdGlvbiBsaXN0ZW5lciBmb3IKKyAgICAgICAgICAgIC8vIGFub3RoZXIgcGFja2FnZSwgYnV0IHN5c3RlbSBzZXJ2ZXIgY2FuIGRvLgorICAgICAgICAgICAgbUlzVHJ1c3RlZCA9IG1hbmFnZXIuaXNUcnVzdGVkRm9yTWVkaWFDb250cm9sKAorICAgICAgICAgICAgICAgICAgICBuZXcgTWVkaWFTZXNzaW9uTWFuYWdlci5SZW1vdGVVc2VySW5mbyhwYWNrYWdlTmFtZSwgcGlkLCB1aWQpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lX2ltcGwoKSB7CisgICAgICAgICAgICByZXR1cm4gbVBhY2thZ2VOYW1lOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0VWlkX2ltcGwoKSB7CisgICAgICAgICAgICByZXR1cm4gbVVpZDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1RydXN0ZWRfaW1wbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtSXNUcnVzdGVkOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGVfaW1wbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ29udHJvbGxlckJpbmRlci5oYXNoQ29kZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFsc19pbXBsKE9iamVjdCBvYmopIHsKKyAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIENvbnRyb2xsZXJJbmZvKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBlcXVhbHMoKChDb250cm9sbGVySW5mbykgb2JqKS5nZXRQcm92aWRlcigpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nX2ltcGwoKSB7CisgICAgICAgICAgICByZXR1cm4gIkNvbnRyb2xsZXJJbmZvIHtwa2c9IiArIG1QYWNrYWdlTmFtZSArICIsIHVpZD0iICsgbVVpZCArICIsIHRydXN0ZWQ9IgorICAgICAgICAgICAgICAgICAgICArIG1Jc1RydXN0ZWQgKyAifSI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ29udHJvbGxlckJpbmRlci5oYXNoQ29kZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBDb250cm9sbGVySW5mb0ltcGwpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29udHJvbGxlckluZm9JbXBsIG90aGVyID0gKENvbnRyb2xsZXJJbmZvSW1wbCkgb2JqOworICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sbGVyQmluZGVyLmFzQmluZGVyKCkuZXF1YWxzKG90aGVyLm1Db250cm9sbGVyQmluZGVyLmFzQmluZGVyKCkpOworICAgICAgICB9CisKKyAgICAgICAgQ29udHJvbGxlckluZm8gZ2V0SW5zdGFuY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOworICAgICAgICB9CisKKyAgICAgICAgSUJpbmRlciBnZXRJZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ29udHJvbGxlckJpbmRlci5hc0JpbmRlcigpOworICAgICAgICB9CisKKyAgICAgICAgSU1lZGlhQ29udHJvbGxlcjIgZ2V0Q29udHJvbGxlckJpbmRlcigpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ29udHJvbGxlckJpbmRlcjsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBDb250cm9sbGVySW5mb0ltcGwgZnJvbShDb250cm9sbGVySW5mbyBjb250cm9sbGVyKSB7CisgICAgICAgICAgICByZXR1cm4gKENvbnRyb2xsZXJJbmZvSW1wbCkgY29udHJvbGxlci5nZXRQcm92aWRlcigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb21tYW5kQnV0dG9uSW1wbCBpbXBsZW1lbnRzIENvbW1hbmRCdXR0b25Qcm92aWRlciB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09NTUFORAorICAgICAgICAgICAgICAgID0gImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIuY29tbWFuZF9idXR0b24uY29tbWFuZCI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfSUNPTl9SRVNfSUQKKyAgICAgICAgICAgICAgICA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmNvbW1hbmRfYnV0dG9uLmljb25fcmVzX2lkIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ESVNQTEFZX05BTUUKKyAgICAgICAgICAgICAgICA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmNvbW1hbmRfYnV0dG9uLmRpc3BsYXlfbmFtZSI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRVhUUkFTCisgICAgICAgICAgICAgICAgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYV9zZXNzaW9uMi5jb21tYW5kX2J1dHRvbi5leHRyYXMiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0VOQUJMRUQKKyAgICAgICAgICAgICAgICA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmNvbW1hbmRfYnV0dG9uLmVuYWJsZWQiOworCisgICAgICAgIHByaXZhdGUgZmluYWwgQ29tbWFuZEJ1dHRvbiBtSW5zdGFuY2U7CisgICAgICAgIHByaXZhdGUgU2Vzc2lvbkNvbW1hbmQyIG1Db21tYW5kOworICAgICAgICBwcml2YXRlIGludCBtSWNvblJlc0lkOworICAgICAgICBwcml2YXRlIFN0cmluZyBtRGlzcGxheU5hbWU7CisgICAgICAgIHByaXZhdGUgQnVuZGxlIG1FeHRyYXM7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtRW5hYmxlZDsKKworICAgICAgICBwdWJsaWMgQ29tbWFuZEJ1dHRvbkltcGwoQE51bGxhYmxlIFNlc3Npb25Db21tYW5kMiBjb21tYW5kLCBpbnQgaWNvblJlc0lkLAorICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBTdHJpbmcgZGlzcGxheU5hbWUsIEJ1bmRsZSBleHRyYXMsIGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICAgICAgbUNvbW1hbmQgPSBjb21tYW5kOworICAgICAgICAgICAgbUljb25SZXNJZCA9IGljb25SZXNJZDsKKyAgICAgICAgICAgIG1EaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lOworICAgICAgICAgICAgbUV4dHJhcyA9IGV4dHJhczsKKyAgICAgICAgICAgIG1FbmFibGVkID0gZW5hYmxlZDsKKyAgICAgICAgICAgIG1JbnN0YW5jZSA9IG5ldyBDb21tYW5kQnV0dG9uKHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBATnVsbGFibGUKKyAgICAgICAgU2Vzc2lvbkNvbW1hbmQyIGdldENvbW1hbmRfaW1wbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ29tbWFuZDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGdldEljb25SZXNJZF9pbXBsKCkgeworICAgICAgICAgICAgcmV0dXJuIG1JY29uUmVzSWQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEBOdWxsYWJsZSBTdHJpbmcgZ2V0RGlzcGxheU5hbWVfaW1wbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtRGlzcGxheU5hbWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEBOdWxsYWJsZSBCdW5kbGUgZ2V0RXh0cmFzX2ltcGwoKSB7CisgICAgICAgICAgICByZXR1cm4gbUV4dHJhczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWRfaW1wbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtRW5hYmxlZDsKKyAgICAgICAgfQorCisgICAgICAgIEBOb25OdWxsIEJ1bmRsZSB0b0J1bmRsZSgpIHsKKyAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICBidW5kbGUucHV0QnVuZGxlKEtFWV9DT01NQU5ELCBtQ29tbWFuZC50b0J1bmRsZSgpKTsKKyAgICAgICAgICAgIGJ1bmRsZS5wdXRJbnQoS0VZX0lDT05fUkVTX0lELCBtSWNvblJlc0lkKTsKKyAgICAgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoS0VZX0RJU1BMQVlfTkFNRSwgbURpc3BsYXlOYW1lKTsKKyAgICAgICAgICAgIGJ1bmRsZS5wdXRCdW5kbGUoS0VZX0VYVFJBUywgbUV4dHJhcyk7CisgICAgICAgICAgICBidW5kbGUucHV0Qm9vbGVhbihLRVlfRU5BQkxFRCwgbUVuYWJsZWQpOworICAgICAgICAgICAgcmV0dXJuIGJ1bmRsZTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBATnVsbGFibGUgQ29tbWFuZEJ1dHRvbiBmcm9tQnVuZGxlKEJ1bmRsZSBidW5kbGUpIHsKKyAgICAgICAgICAgIGlmIChidW5kbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29tbWFuZEJ1dHRvbi5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgQ29tbWFuZEJ1dHRvbi5CdWlsZGVyKCk7CisgICAgICAgICAgICBidWlsZGVyLnNldENvbW1hbmQoU2Vzc2lvbkNvbW1hbmQyLmZyb21CdW5kbGUoYnVuZGxlLmdldEJ1bmRsZShLRVlfQ09NTUFORCkpKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0SWNvblJlc0lkKGJ1bmRsZS5nZXRJbnQoS0VZX0lDT05fUkVTX0lELCAwKSk7CisgICAgICAgICAgICBidWlsZGVyLnNldERpc3BsYXlOYW1lKGJ1bmRsZS5nZXRTdHJpbmcoS0VZX0RJU1BMQVlfTkFNRSkpOworICAgICAgICAgICAgYnVpbGRlci5zZXRFeHRyYXMoYnVuZGxlLmdldEJ1bmRsZShLRVlfRVhUUkFTKSk7CisgICAgICAgICAgICBidWlsZGVyLnNldEVuYWJsZWQoYnVuZGxlLmdldEJvb2xlYW4oS0VZX0VOQUJMRUQpKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gTWFsZm9ybWVkIG9yIHZlcnNpb24gbWlzbWF0Y2guIFJldHVybiBudWxsIGZvciBub3cuCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQnVpbGRlciBmb3Ige0BsaW5rIENvbW1hbmRCdXR0b259LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVySW1wbCBpbXBsZW1lbnRzIENvbW1hbmRCdXR0b25Qcm92aWRlci5CdWlsZGVyUHJvdmlkZXIgeworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb21tYW5kQnV0dG9uLkJ1aWxkZXIgbUluc3RhbmNlOworICAgICAgICAgICAgcHJpdmF0ZSBTZXNzaW9uQ29tbWFuZDIgbUNvbW1hbmQ7CisgICAgICAgICAgICBwcml2YXRlIGludCBtSWNvblJlc0lkOworICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbURpc3BsYXlOYW1lOworICAgICAgICAgICAgcHJpdmF0ZSBCdW5kbGUgbUV4dHJhczsKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtRW5hYmxlZDsKKworICAgICAgICAgICAgcHVibGljIEJ1aWxkZXJJbXBsKENvbW1hbmRCdXR0b24uQnVpbGRlciBpbnN0YW5jZSkgeworICAgICAgICAgICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOworICAgICAgICAgICAgICAgIG1FbmFibGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgQ29tbWFuZEJ1dHRvbi5CdWlsZGVyIHNldENvbW1hbmRfaW1wbChTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCkgeworICAgICAgICAgICAgICAgIG1Db21tYW5kID0gY29tbWFuZDsKKyAgICAgICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBDb21tYW5kQnV0dG9uLkJ1aWxkZXIgc2V0SWNvblJlc0lkX2ltcGwoaW50IHJlc0lkKSB7CisgICAgICAgICAgICAgICAgbUljb25SZXNJZCA9IHJlc0lkOworICAgICAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIENvbW1hbmRCdXR0b24uQnVpbGRlciBzZXREaXNwbGF5TmFtZV9pbXBsKFN0cmluZyBkaXNwbGF5TmFtZSkgeworICAgICAgICAgICAgICAgIG1EaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lOworICAgICAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIENvbW1hbmRCdXR0b24uQnVpbGRlciBzZXRFbmFibGVkX2ltcGwoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgICAgICAgICAgbUVuYWJsZWQgPSBlbmFibGVkOworICAgICAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIENvbW1hbmRCdXR0b24uQnVpbGRlciBzZXRFeHRyYXNfaW1wbChCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgICAgICAgICAgbUV4dHJhcyA9IGV4dHJhczsKKyAgICAgICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBDb21tYW5kQnV0dG9uIGJ1aWxkX2ltcGwoKSB7CisgICAgICAgICAgICAgICAgaWYgKG1FbmFibGVkICYmIG1Db21tYW5kID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRW5hYmxlZCBidXR0b24gbmVlZHMgQ29tbWFuZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZm9yIGNvbnRyb2xsZXIgdG8gaW52b2tlIHRoZSBjb21tYW5kIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtQ29tbWFuZCAhPSBudWxsICYmIG1Db21tYW5kLmdldENvbW1hbmRDb2RlKCkgPT0gQ09NTUFORF9DT0RFX0NVU1RPTQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG1JY29uUmVzSWQgPT0gMCB8fCBUZXh0VXRpbHMuaXNFbXB0eShtRGlzcGxheU5hbWUpKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDdXN0b20gY29tbWFuZHMgbmVlZHMgaWNvbiBhbmQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGFuZCBuYW1lIHRvIGRpc3BsYXkiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21tYW5kQnV0dG9uSW1wbChtQ29tbWFuZCwgbUljb25SZXNJZCwgbURpc3BsYXlOYW1lLCBtRXh0cmFzLCBtRW5hYmxlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5tSW5zdGFuY2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEJ1aWxkZXJCYXNlSW1wbDxUIGV4dGVuZHMgTWVkaWFTZXNzaW9uMiwgQyBleHRlbmRzIFNlc3Npb25DYWxsYmFjaz4KKyAgICAgICAgICAgIGltcGxlbWVudHMgQnVpbGRlckJhc2VQcm92aWRlcjxULCBDPiB7CisgICAgICAgIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisgICAgICAgIE1lZGlhUGxheWVyQmFzZSBtUGxheWVyOworICAgICAgICBTdHJpbmcgbUlkOworICAgICAgICBFeGVjdXRvciBtQ2FsbGJhY2tFeGVjdXRvcjsKKyAgICAgICAgQyBtQ2FsbGJhY2s7CisgICAgICAgIE1lZGlhUGxheWxpc3RBZ2VudCBtUGxheWxpc3RBZ2VudDsKKyAgICAgICAgVm9sdW1lUHJvdmlkZXIyIG1Wb2x1bWVQcm92aWRlcjsKKyAgICAgICAgUGVuZGluZ0ludGVudCBtU2Vzc2lvbkFjdGl2aXR5OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNvbnRleHQgYSBjb250ZXh0CisgICAgICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFueSBwYXJhbWV0ZXIgaXMgbnVsbCwgb3IgdGhlIHBsYXllciBpcyBhCisgICAgICAgICAqICAgICAge0BsaW5rIE1lZGlhU2Vzc2lvbjJ9IG9yIHtAbGluayBNZWRpYUNvbnRyb2xsZXIyfS4KKyAgICAgICAgICovCisgICAgICAgIC8vIFRPRE8oamFld2FuKTogQWxzbyBuZWVkIGV4ZWN1dG9yCisgICAgICAgIHB1YmxpYyBCdWlsZGVyQmFzZUltcGwoQE5vbk51bGwgQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udGV4dCBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICAgICAgLy8gRW5zdXJlIG5vbi1udWxsCisgICAgICAgICAgICBtSWQgPSAiIjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRQbGF5ZXJfaW1wbChATm9uTnVsbCBNZWRpYVBsYXllckJhc2UgcGxheWVyKSB7CisgICAgICAgICAgICBpZiAocGxheWVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwbGF5ZXIgc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1QbGF5ZXIgPSBwbGF5ZXI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UGxheWxpc3RBZ2VudF9pbXBsKEBOb25OdWxsIE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50KSB7CisgICAgICAgICAgICBpZiAocGxheWxpc3RBZ2VudCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGxheWxpc3RBZ2VudCBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVBsYXlsaXN0QWdlbnQgPSBwbGF5bGlzdEFnZW50OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFZvbHVtZVByb3ZpZGVyX2ltcGwoVm9sdW1lUHJvdmlkZXIyIHZvbHVtZVByb3ZpZGVyKSB7CisgICAgICAgICAgICBtVm9sdW1lUHJvdmlkZXIgPSB2b2x1bWVQcm92aWRlcjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRTZXNzaW9uQWN0aXZpdHlfaW1wbChQZW5kaW5nSW50ZW50IHBpKSB7CisgICAgICAgICAgICBtU2Vzc2lvbkFjdGl2aXR5ID0gcGk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0SWRfaW1wbChATm9uTnVsbCBTdHJpbmcgaWQpIHsKKyAgICAgICAgICAgIGlmIChpZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaWQgc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1JZCA9IGlkOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFNlc3Npb25DYWxsYmFja19pbXBsKEBOb25OdWxsIEV4ZWN1dG9yIGV4ZWN1dG9yLCBATm9uTnVsbCBDIGNhbGxiYWNrKSB7CisgICAgICAgICAgICBpZiAoZXhlY3V0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImV4ZWN1dG9yIHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbGxiYWNrIHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvciA9IGV4ZWN1dG9yOworICAgICAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFQgYnVpbGRfaW1wbCgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlckltcGwgZXh0ZW5kcyBCdWlsZGVyQmFzZUltcGw8TWVkaWFTZXNzaW9uMiwgU2Vzc2lvbkNhbGxiYWNrPiB7CisgICAgICAgIHB1YmxpYyBCdWlsZGVySW1wbChDb250ZXh0IGNvbnRleHQsIEJ1aWxkZXIgaW5zdGFuY2UpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBNZWRpYVNlc3Npb24yIGJ1aWxkX2ltcGwoKSB7CisgICAgICAgICAgICBpZiAobUNhbGxiYWNrRXhlY3V0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yID0gbUNvbnRleHQuZ2V0TWFpbkV4ZWN1dG9yKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUNhbGxiYWNrID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2sgPSBuZXcgU2Vzc2lvbkNhbGxiYWNrKCkge307CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvbjJJbXBsKG1Db250ZXh0LCBtUGxheWVyLCBtSWQsIG1QbGF5bGlzdEFnZW50LAorICAgICAgICAgICAgICAgICAgICBtVm9sdW1lUHJvdmlkZXIsIG1TZXNzaW9uQWN0aXZpdHksIG1DYWxsYmFja0V4ZWN1dG9yLCBtQ2FsbGJhY2spLmdldEluc3RhbmNlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhU2Vzc2lvbjJTdHViLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhU2Vzc2lvbjJTdHViLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM2NTdkNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFTZXNzaW9uMlN0dWIuamF2YQpAQCAtMCwwICsxLDExMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMi5MaWJyYXJ5Um9vdDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5Db21tYW5kQnV0dG9uOworaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmRHcm91cDI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLkNvbnRyb2xsZXJJbmZvOworaW1wb3J0IGFuZHJvaWQubWVkaWEuUmF0aW5nMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlZvbHVtZVByb3ZpZGVyMjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5EZWFkT2JqZWN0RXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlc3VsdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLkd1YXJkZWRCeTsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkFycmF5TWFwOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OworCitpbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTJJbXBsLk1lZGlhTGlicmFyeVNlc3Npb25JbXBsOworaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjJJbXBsLkNvbW1hbmRCdXR0b25JbXBsOworaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjJJbXBsLkNvbW1hbmRHcm91cEltcGw7CitpbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMkltcGwuQ29udHJvbGxlckluZm9JbXBsOworCitpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworcHVibGljIGNsYXNzIE1lZGlhU2Vzc2lvbjJTdHViIGV4dGVuZHMgSU1lZGlhU2Vzc2lvbjIuU3R1YiB7CisKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR1VNRU5UX0tFWV9QT1NJVElPTiA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmtleV9wb3NpdGlvbiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdVTUVOVF9LRVlfSVRFTV9JTkRFWCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmtleV9pdGVtX2luZGV4IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR1VNRU5UX0tFWV9QTEFZTElTVF9QQVJBTVMgPQorICAgICAgICAgICAgImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIua2V5X3BsYXlsaXN0X3BhcmFtcyI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhU2Vzc2lvbjJTdHViIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsgLy8gVE9ETyhqYWV3YW4pOiBSZW5hbWUuCisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTcGFyc2VBcnJheTxTZXNzaW9uQ29tbWFuZDI+IHNDb21tYW5kc0Zvck9uQ29tbWFuZFJlcXVlc3QgPQorICAgICAgICAgICAgbmV3IFNwYXJzZUFycmF5PD4oKTsKKworICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOworICAgIHByaXZhdGUgZmluYWwgV2Vha1JlZmVyZW5jZTxNZWRpYVNlc3Npb24ySW1wbD4gbVNlc3Npb247CisKKyAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCisgICAgcHJpdmF0ZSBmaW5hbCBBcnJheU1hcDxJQmluZGVyLCBDb250cm9sbGVySW5mbz4gbUNvbnRyb2xsZXJzID0gbmV3IEFycmF5TWFwPD4oKTsKKyAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8SUJpbmRlcj4gbUNvbm5lY3RpbmdDb250cm9sbGVycyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCisgICAgcHJpdmF0ZSBmaW5hbCBBcnJheU1hcDxDb250cm9sbGVySW5mbywgU2Vzc2lvbkNvbW1hbmRHcm91cDI+IG1BbGxvd2VkQ29tbWFuZEdyb3VwTWFwID0KKyAgICAgICAgICAgIG5ldyBBcnJheU1hcDw+KCk7CisgICAgQEd1YXJkZWRCeSgibUxvY2siKQorICAgIHByaXZhdGUgZmluYWwgQXJyYXlNYXA8Q29udHJvbGxlckluZm8sIFNldDxTdHJpbmc+PiBtU3Vic2NyaXB0aW9ucyA9IG5ldyBBcnJheU1hcDw+KCk7CisKKyAgICBwdWJsaWMgTWVkaWFTZXNzaW9uMlN0dWIoTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbikgeworICAgICAgICBtU2Vzc2lvbiA9IG5ldyBXZWFrUmVmZXJlbmNlPD4oc2Vzc2lvbik7CisKKyAgICAgICAgc3luY2hyb25pemVkIChzQ29tbWFuZHNGb3JPbkNvbW1hbmRSZXF1ZXN0KSB7CisgICAgICAgICAgICBpZiAoc0NvbW1hbmRzRm9yT25Db21tYW5kUmVxdWVzdC5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIENvbW1hbmRHcm91cEltcGwgZ3JvdXAgPSBuZXcgQ29tbWFuZEdyb3VwSW1wbCgpOworICAgICAgICAgICAgICAgIGdyb3VwLmFkZEFsbFBsYXliYWNrQ29tbWFuZHMoKTsKKyAgICAgICAgICAgICAgICBncm91cC5hZGRBbGxQbGF5bGlzdENvbW1hbmRzKCk7CisgICAgICAgICAgICAgICAgU2V0PFNlc3Npb25Db21tYW5kMj4gY29tbWFuZHMgPSBncm91cC5nZXRDb21tYW5kcygpOworICAgICAgICAgICAgICAgIGZvciAoU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQgOiBjb21tYW5kcykgeworICAgICAgICAgICAgICAgICAgICBzQ29tbWFuZHNGb3JPbkNvbW1hbmRSZXF1ZXN0LmFwcGVuZChjb21tYW5kLmdldENvbW1hbmRDb2RlKCksIGNvbW1hbmQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3lOb3RMb2NrZWQoKSB7CisgICAgICAgIGZpbmFsIExpc3Q8Q29udHJvbGxlckluZm8+IGxpc3Q7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIG1TZXNzaW9uLmNsZWFyKCk7CisgICAgICAgICAgICBsaXN0ID0gZ2V0Q29udHJvbGxlcnMoKTsKKyAgICAgICAgICAgIG1Db250cm9sbGVycy5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgSU1lZGlhQ29udHJvbGxlcjIgY29udHJvbGxlckJpbmRlciA9CisgICAgICAgICAgICAgICAgICAgICgoQ29udHJvbGxlckluZm9JbXBsKSBsaXN0LmdldChpKS5nZXRQcm92aWRlcigpKS5nZXRDb250cm9sbGVyQmluZGVyKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIFNob3VsZCBiZSB1c2VkIHdpdGhvdXQgYSBsb2NrIGhvbGQgdG8gcHJldmVudCBwb3RlbnRpYWwgZGVhZGxvY2suCisgICAgICAgICAgICAgICAgY29udHJvbGxlckJpbmRlci5vbkRpc2Nvbm5lY3RlZCgpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBDb250cm9sbGVyIGlzIGdvbmUuIFNob3VsZCBiZSBmaW5lIGJlY2F1c2Ugd2UncmUgZGVzdHJveWluZy4KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgTWVkaWFTZXNzaW9uMkltcGwgZ2V0U2Vzc2lvbigpIHsKKyAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IG1TZXNzaW9uLmdldCgpOworICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsICYmIERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJTZXNzaW9uIGlzIGNsb3NlZCIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNlc3Npb247CisgICAgfQorCisgICAgcHJpdmF0ZSBNZWRpYUxpYnJhcnlTZXNzaW9uSW1wbCBnZXRMaWJyYXJ5U2Vzc2lvbigpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgICAgICBmaW5hbCBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gZ2V0U2Vzc2lvbigpOworICAgICAgICBpZiAoIShzZXNzaW9uIGluc3RhbmNlb2YgTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGwpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiU2Vzc2lvbiBpc24ndCBhIGxpYnJhcnkgc2Vzc2lvbiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGwpIHNlc3Npb247CisgICAgfQorCisgICAgLy8gR2V0IGNvbnRyb2xsZXIgaWYgdGhlIGNvbW1hbmQgZnJvbSBjYWxsZXIgdG8gc2Vzc2lvbiBpcyBhYmxlIHRvIGJlIGhhbmRsZWQuCisgICAgcHJpdmF0ZSBDb250cm9sbGVySW5mbyBnZXRDb250cm9sbGVySWZBYmxlKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlcikgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBmaW5hbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVySW5mbyA9IG1Db250cm9sbGVycy5nZXQoY2FsbGVyLmFzQmluZGVyKCkpOworICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXJJbmZvID09IG51bGwgJiYgREVCVUcpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJDb250cm9sbGVyIGlzIGRpc2Nvbm5lY3RlZCIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY29udHJvbGxlckluZm87CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBHZXQgY29udHJvbGxlciBpZiB0aGUgY29tbWFuZCBmcm9tIGNhbGxlciB0byBzZXNzaW9uIGlzIGFibGUgdG8gYmUgaGFuZGxlZC4KKyAgICBwcml2YXRlIENvbnRyb2xsZXJJbmZvIGdldENvbnRyb2xsZXJJZkFibGUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgY29tbWFuZENvZGUpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgZmluYWwgQ29udHJvbGxlckluZm8gY29udHJvbGxlckluZm8gPSBnZXRDb250cm9sbGVySWZBYmxlKGNhbGxlcik7CisgICAgICAgICAgICBpZiAoY29udHJvbGxlckluZm8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU2Vzc2lvbkNvbW1hbmRHcm91cDIgYWxsb3dlZENvbW1hbmRzID0gbUFsbG93ZWRDb21tYW5kR3JvdXBNYXAuZ2V0KGNvbnRyb2xsZXJJbmZvKTsKKyAgICAgICAgICAgIGlmIChhbGxvd2VkQ29tbWFuZHMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNvbnRyb2xsZXIgd2l0aCBudWxsIGFsbG93ZWQgY29tbWFuZHMuIElnbm9yaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWFsbG93ZWRDb21tYW5kcy5oYXNDb21tYW5kKGNvbW1hbmRDb2RlKSkgeworICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJDb250cm9sbGVyIGlzbid0IGFsbG93ZWQgZm9yIGNvbW1hbmQgIiArIGNvbW1hbmRDb2RlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY29udHJvbGxlckluZm87CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBHZXQgY29udHJvbGxlciBpZiB0aGUgY29tbWFuZCBmcm9tIGNhbGxlciB0byBzZXNzaW9uIGlzIGFibGUgdG8gYmUgaGFuZGxlZC4KKyAgICBwcml2YXRlIENvbnRyb2xsZXJJbmZvIGdldENvbnRyb2xsZXJJZkFibGUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBmaW5hbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVySW5mbyA9IGdldENvbnRyb2xsZXJJZkFibGUoY2FsbGVyKTsKKyAgICAgICAgICAgIGlmIChjb250cm9sbGVySW5mbyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTZXNzaW9uQ29tbWFuZEdyb3VwMiBhbGxvd2VkQ29tbWFuZHMgPSBtQWxsb3dlZENvbW1hbmRHcm91cE1hcC5nZXQoY29udHJvbGxlckluZm8pOworICAgICAgICAgICAgaWYgKGFsbG93ZWRDb21tYW5kcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ29udHJvbGxlciB3aXRoIG51bGwgYWxsb3dlZCBjb21tYW5kcy4gSWdub3JpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghYWxsb3dlZENvbW1hbmRzLmhhc0NvbW1hbmQoY29tbWFuZCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ29udHJvbGxlciBpc24ndCBhbGxvd2VkIGZvciBjb21tYW5kICIgKyBjb21tYW5kKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY29udHJvbGxlckluZm87CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBSZXR1cm4gYmluZGVyIGlmIHRoZSBzZXNzaW9uIGlzIGFibGUgdG8gc2VuZCBhIGNvbW1hbmQgdG8gdGhlIGNvbnRyb2xsZXIuCisgICAgcHJpdmF0ZSBJTWVkaWFDb250cm9sbGVyMiBnZXRDb250cm9sbGVyQmluZGVySWZBYmxlKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIpIHsKKyAgICAgICAgaWYgKGdldFNlc3Npb24oKSA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBnZXRTZXNzaW9uKCkgYWxyZWFkeSBsb2dnZWQgaWYgc2Vzc2lvbiBpcyBjbG9zZWQuCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBDb250cm9sbGVySW5mb0ltcGwgaW1wbCA9IENvbnRyb2xsZXJJbmZvSW1wbC5mcm9tKGNvbnRyb2xsZXIpOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBpZiAobUNvbnRyb2xsZXJzLmdldChpbXBsLmdldElkKCkpICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgfHwgbUNvbm5lY3RpbmdDb250cm9sbGVycy5jb250YWlucyhpbXBsLmdldElkKCkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGltcGwuZ2V0Q29udHJvbGxlckJpbmRlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjb250cm9sbGVyICsgIiBpc24ndCBjb25uZWN0ZWQgbm9yIGNvbm5lY3RpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gUmV0dXJuIGJpbmRlciBpZiB0aGUgc2Vzc2lvbiBpcyBhYmxlIHRvIHNlbmQgYSBjb21tYW5kIHRvIHRoZSBjb250cm9sbGVyLgorICAgIHByaXZhdGUgSU1lZGlhQ29udHJvbGxlcjIgZ2V0Q29udHJvbGxlckJpbmRlcklmQWJsZShDb250cm9sbGVySW5mbyBjb250cm9sbGVyLAorICAgICAgICAgICAgaW50IGNvbW1hbmRDb2RlKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIFNlc3Npb25Db21tYW5kR3JvdXAyIGFsbG93ZWRDb21tYW5kcyA9IG1BbGxvd2VkQ29tbWFuZEdyb3VwTWFwLmdldChjb250cm9sbGVyKTsKKyAgICAgICAgICAgIGlmIChhbGxvd2VkQ29tbWFuZHMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNvbnRyb2xsZXIgd2l0aCBudWxsIGFsbG93ZWQgY29tbWFuZHMuIElnbm9yaW5nIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWFsbG93ZWRDb21tYW5kcy5oYXNDb21tYW5kKGNvbW1hbmRDb2RlKSkgeworICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJDb250cm9sbGVyIGlzbid0IGFsbG93ZWQgZm9yIGNvbW1hbmQgIiArIGNvbW1hbmRDb2RlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZ2V0Q29udHJvbGxlckJpbmRlcklmQWJsZShjb250cm9sbGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvbkNvbW1hbmQoQE5vbk51bGwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgY29tbWFuZENvZGUsCisgICAgICAgICAgICBATm9uTnVsbCBTZXNzaW9uUnVubmFibGUgcnVubmFibGUpIHsKKyAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IGdldFNlc3Npb24oKTsKKyAgICAgICAgZmluYWwgQ29udHJvbGxlckluZm8gY29udHJvbGxlciA9IGdldENvbnRyb2xsZXJJZkFibGUoY2FsbGVyLCBjb21tYW5kQ29kZSk7CisgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwgfHwgY29udHJvbGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7CisgICAgICAgICAgICBpZiAoZ2V0Q29udHJvbGxlcklmQWJsZShjYWxsZXIsIGNvbW1hbmRDb2RlKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQgPSBzQ29tbWFuZHNGb3JPbkNvbW1hbmRSZXF1ZXN0LmdldChjb21tYW5kQ29kZSk7CisgICAgICAgICAgICBpZiAoY29tbWFuZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBhY2NlcHRlZCA9IHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbkNvbW1hbmRSZXF1ZXN0KHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsIGNvbW1hbmQpOworICAgICAgICAgICAgICAgIGlmICghYWNjZXB0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgcnVuIHJlamVjdGVkIGNvbW1hbmQuCisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ29tbWFuZCAoY29kZT0iICsgY29tbWFuZENvZGUgKyAiKSBmcm9tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjb250cm9sbGVyICsgIiB3YXMgcmVqZWN0ZWQgYnkgIiArIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBydW5uYWJsZS5ydW4oc2Vzc2lvbiwgY29udHJvbGxlcik7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvbkJyb3dzZXJDb21tYW5kKEBOb25OdWxsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwKKyAgICAgICAgICAgIEBOb25OdWxsIExpYnJhcnlTZXNzaW9uUnVubmFibGUgcnVubmFibGUpIHsKKyAgICAgICAgZmluYWwgTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGwgc2Vzc2lvbiA9IGdldExpYnJhcnlTZXNzaW9uKCk7CisgICAgICAgIC8vIFRPRE8oamFld2FuKTogQ29uc2lkZXIgY29tbWFuZCBjb2RlCisgICAgICAgIGZpbmFsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVySWZBYmxlKGNhbGxlcik7CisgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwgfHwgY29udHJvbGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7CisgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IENvbnNpZGVyIGNvbW1hbmQgY29kZQorICAgICAgICAgICAgaWYgKGdldENvbnRyb2xsZXJJZkFibGUoY2FsbGVyKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcnVubmFibGUucnVuKHNlc3Npb24sIGNvbnRyb2xsZXIpOworICAgICAgICB9KTsKKyAgICB9CisKKworICAgIHByaXZhdGUgdm9pZCBub3RpZnlBbGwoaW50IGNvbW1hbmRDb2RlLCBATm9uTnVsbCBOb3RpZnlSdW5uYWJsZSBydW5uYWJsZSkgeworICAgICAgICBMaXN0PENvbnRyb2xsZXJJbmZvPiBjb250cm9sbGVycyA9IGdldENvbnRyb2xsZXJzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udHJvbGxlcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIG5vdGlmeUludGVybmFsKGNvbnRyb2xsZXJzLmdldChpKSwKKyAgICAgICAgICAgICAgICAgICAgZ2V0Q29udHJvbGxlckJpbmRlcklmQWJsZShjb250cm9sbGVycy5nZXQoaSksIGNvbW1hbmRDb2RlKSwgcnVubmFibGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG5vdGlmeUFsbChATm9uTnVsbCBOb3RpZnlSdW5uYWJsZSBydW5uYWJsZSkgeworICAgICAgICBMaXN0PENvbnRyb2xsZXJJbmZvPiBjb250cm9sbGVycyA9IGdldENvbnRyb2xsZXJzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udHJvbGxlcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIG5vdGlmeUludGVybmFsKGNvbnRyb2xsZXJzLmdldChpKSwKKyAgICAgICAgICAgICAgICAgICAgZ2V0Q29udHJvbGxlckJpbmRlcklmQWJsZShjb250cm9sbGVycy5nZXQoaSkpLCBydW5uYWJsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbm90aWZ5KEBOb25OdWxsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIEBOb25OdWxsIE5vdGlmeVJ1bm5hYmxlIHJ1bm5hYmxlKSB7CisgICAgICAgIG5vdGlmeUludGVybmFsKGNvbnRyb2xsZXIsIGdldENvbnRyb2xsZXJCaW5kZXJJZkFibGUoY29udHJvbGxlciksIHJ1bm5hYmxlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbm90aWZ5KEBOb25OdWxsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIGludCBjb21tYW5kQ29kZSwKKyAgICAgICAgICAgIEBOb25OdWxsIE5vdGlmeVJ1bm5hYmxlIHJ1bm5hYmxlKSB7CisgICAgICAgIG5vdGlmeUludGVybmFsKGNvbnRyb2xsZXIsIGdldENvbnRyb2xsZXJCaW5kZXJJZkFibGUoY29udHJvbGxlciwgY29tbWFuZENvZGUpLCBydW5uYWJsZSk7CisgICAgfQorCisgICAgLy8gRG8gbm90IGNhbGwgdGhpcyBBUEkgZGlyZWN0bHkuIFVzZSBub3RpZnkoKSBpbnN0ZWFkLgorICAgIHByaXZhdGUgdm9pZCBub3RpZnlJbnRlcm5hbChATm9uTnVsbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyLAorICAgICAgICAgICAgQE5vbk51bGwgSU1lZGlhQ29udHJvbGxlcjIgaUNvbnRyb2xsZXIsIEBOb25OdWxsIE5vdGlmeVJ1bm5hYmxlIHJ1bm5hYmxlKSB7CisgICAgICAgIGlmIChjb250cm9sbGVyID09IG51bGwgfHwgaUNvbnRyb2xsZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBydW5uYWJsZS5ydW4oY29udHJvbGxlciwgaUNvbnRyb2xsZXIpOworICAgICAgICB9IGNhdGNoIChEZWFkT2JqZWN0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY29udHJvbGxlci50b1N0cmluZygpICsgIiBpcyBnb25lIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvbkNvbnRyb2xsZXJDbG9zZWQoaUNvbnRyb2xsZXIpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gQ3VycmVudGx5IGl0J3MgVHJhbnNhY3Rpb25Ub29MYXJnZUV4Y2VwdGlvbiBvciBEZWFkU3lzdGVtRXhjZXB0aW9uLgorICAgICAgICAgICAgLy8gV2UnZCBiZXR0ZXIgdG8gbGVhdmUgbG9nIGZvciB0aG9zZSBjYXNlcyBiZWNhdXNlCisgICAgICAgICAgICAvLyAgIC0gVHJhbnNhY3Rpb25Ub29MYXJnZUV4Y2VwdGlvbiBtZWFucyB0aGF0IHdlIG1heSBuZWVkIHRvIGZpeCBvdXIgY29kZS4KKyAgICAgICAgICAgIC8vICAgICAoZS5nLiBhZGQgcGFnaW5hdGlvbiBvciBzcGVjaWFsIHdheSB0byBkZWxpdmVyIEJpdG1hcCkKKyAgICAgICAgICAgIC8vICAgLSBEZWFkU3lzdGVtRXhjZXB0aW9uIG1lYW5zIHRoYXQgZXJyb3JzIGFyb3VuZCBpdCBjYW4gYmUgaWdub3JlZC4KKyAgICAgICAgICAgIExvZy53KFRBRywgIkV4Y2VwdGlvbiBpbiAiICsgY29udHJvbGxlci50b1N0cmluZygpLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvbkNvbnRyb2xsZXJDbG9zZWQoSU1lZGlhQ29udHJvbGxlcjIgaUNvbnRyb2xsZXIpIHsKKyAgICAgICAgQ29udHJvbGxlckluZm8gY29udHJvbGxlcjsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgY29udHJvbGxlciA9IG1Db250cm9sbGVycy5yZW1vdmUoaUNvbnRyb2xsZXIuYXNCaW5kZXIoKSk7CisgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJyZWxlYXNpbmcgIiArIGNvbnRyb2xsZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVN1YnNjcmlwdGlvbnMucmVtb3ZlKGNvbnRyb2xsZXIpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBnZXRTZXNzaW9uKCk7CisgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwgfHwgY29udHJvbGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7CisgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25EaXNjb25uZWN0ZWQoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLCBjb250cm9sbGVyKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIEFJREwgbWV0aG9kcyBmb3Igc2Vzc2lvbiBvdmVycmlkZXMKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY29ubmVjdChmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBjYWxsaW5nUGFja2FnZSkKKyAgICAgICAgICAgIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IGdldFNlc3Npb24oKTsKKyAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IHNlc3Npb24uZ2V0Q29udGV4dCgpOworICAgICAgICBmaW5hbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVySW5mbyA9IG5ldyBDb250cm9sbGVySW5mbyhjb250ZXh0LAorICAgICAgICAgICAgICAgIEJpbmRlci5nZXRDYWxsaW5nVWlkKCksIEJpbmRlci5nZXRDYWxsaW5nUGlkKCksIGNhbGxpbmdQYWNrYWdlLCBjYWxsZXIpOworICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKKyAgICAgICAgICAgIGlmIChnZXRTZXNzaW9uKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgICAgICAvLyBLZWVwIGNvbm5lY3RpbmcgY29udHJvbGxlcnMuCisgICAgICAgICAgICAgICAgLy8gVGhpcyBoZWxwcyBzZXNzaW9ucyB0byBjYWxsIEFQSXMgaW4gdGhlIG9uQ29ubmVjdCgpIChlLmcuIHNldEN1c3RvbUxheW91dCgpKQorICAgICAgICAgICAgICAgIC8vIGluc3RlYWQgb2YgcGVuZGluZyB0aGVtLgorICAgICAgICAgICAgICAgIG1Db25uZWN0aW5nQ29udHJvbGxlcnMuYWRkKENvbnRyb2xsZXJJbmZvSW1wbC5mcm9tKGNvbnRyb2xsZXJJbmZvKS5nZXRJZCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFNlc3Npb25Db21tYW5kR3JvdXAyIGFsbG93ZWRDb21tYW5kcyA9IHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbkNvbm5lY3QoCisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgY29udHJvbGxlckluZm8pOworICAgICAgICAgICAgLy8gRG9uJ3QgcmVqZWN0IGNvbm5lY3Rpb24gZm9yIHRoZSByZXF1ZXN0IGZyb20gdHJ1c3RlZCBhcHAuCisgICAgICAgICAgICAvLyBPdGhlcndpc2Ugc2VydmVyIHdpbGwgZmFpbCB0byByZXRyaWV2ZSBzZXNzaW9uJ3MgaW5mb3JtYXRpb24gdG8gZGlzcGF0Y2gKKyAgICAgICAgICAgIC8vIG1lZGlhIGtleXMgdG8uCisgICAgICAgICAgICBib29sZWFuIGFjY2VwdCA9IGFsbG93ZWRDb21tYW5kcyAhPSBudWxsIHx8IGNvbnRyb2xsZXJJbmZvLmlzVHJ1c3RlZCgpOworICAgICAgICAgICAgaWYgKGFjY2VwdCkgeworICAgICAgICAgICAgICAgIENvbnRyb2xsZXJJbmZvSW1wbCBjb250cm9sbGVySW1wbCA9IENvbnRyb2xsZXJJbmZvSW1wbC5mcm9tKGNvbnRyb2xsZXJJbmZvKTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQWNjZXB0aW5nIGNvbm5lY3Rpb24sIGNvbnRyb2xsZXJJbmZvPSIgKyBjb250cm9sbGVySW5mbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhbGxvd2VkQ29tbWFuZHM9IiArIGFsbG93ZWRDb21tYW5kcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChhbGxvd2VkQ29tbWFuZHMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBGb3IgdHJ1c3RlZCBhcHBzLCBzZW5kIG5vbi1udWxsIGFsbG93ZWQgY29tbWFuZHMgdG8ga2VlcCBjb25uZWN0aW9uLgorICAgICAgICAgICAgICAgICAgICBhbGxvd2VkQ29tbWFuZHMgPSBuZXcgU2Vzc2lvbkNvbW1hbmRHcm91cDIoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGluZ0NvbnRyb2xsZXJzLnJlbW92ZShjb250cm9sbGVySW1wbC5nZXRJZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xsZXJzLnB1dChjb250cm9sbGVySW1wbC5nZXRJZCgpLCAgY29udHJvbGxlckluZm8pOworICAgICAgICAgICAgICAgICAgICBtQWxsb3dlZENvbW1hbmRHcm91cE1hcC5wdXQoY29udHJvbGxlckluZm8sIGFsbG93ZWRDb21tYW5kcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIElmIGNvbm5lY3Rpb24gaXMgYWNjZXB0ZWQsIG5vdGlmeSB0aGUgY3VycmVudCBzdGF0ZSB0byB0aGUgY29udHJvbGxlci4KKyAgICAgICAgICAgICAgICAvLyBJdCdzIG5lZWRlZCBiZWNhdXNlIHdlIGNhbm5vdCBjYWxsIHN5bmNocm9ub3VzIGNhbGxzIGJldHdlZW4gc2Vzc2lvbi9jb250cm9sbGVyLgorICAgICAgICAgICAgICAgIC8vIE5vdGU6IFdlJ3JlIGRvaW5nIHRoaXMgYWZ0ZXIgdGhlIG9uQ29ubmVjdGlvbkNoYW5nZWQoKSwgYnV0IHRoZXJlJ3Mgbm8gZ3VhcmFudGVlCisgICAgICAgICAgICAgICAgLy8gICAgICAgdGhhdCBldmVudHMgaGVyZSBhcmUgbm90aWZpZWQgYWZ0ZXIgdGhlIG9uQ29ubmVjdGVkKCkgYmVjYXVzZQorICAgICAgICAgICAgICAgIC8vICAgICAgIElNZWRpYUNvbnRyb2xsZXIyIGlzIG9uZXdheSAoaS5lLiBhc3luYyBjYWxsKSBhbmQgU3R1YiB3aWxsCisgICAgICAgICAgICAgICAgLy8gICAgICAgdXNlIHRocmVhZCBwb2xsIGZvciBpbmNvbWluZyBjYWxscy4KKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcGxheWVyU3RhdGUgPSBzZXNzaW9uLmdldEluc3RhbmNlKCkuZ2V0UGxheWVyU3RhdGUoKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBsb25nIHBvc2l0aW9uRXZlbnRUaW1lTXMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBsb25nIHBvc2l0aW9uTXMgPSBzZXNzaW9uLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudFBvc2l0aW9uKCk7CisgICAgICAgICAgICAgICAgZmluYWwgZmxvYXQgcGxheWJhY2tTcGVlZCA9IHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5nZXRQbGF5YmFja1NwZWVkKCk7CisgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBidWZmZXJlZFBvc2l0aW9uTXMgPSBzZXNzaW9uLmdldEluc3RhbmNlKCkuZ2V0QnVmZmVyZWRQb3NpdGlvbigpOworICAgICAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBwbGF5YmFja0luZm9CdW5kbGUgPSAoKE1lZGlhQ29udHJvbGxlcjJJbXBsLlBsYXliYWNrSW5mb0ltcGwpCisgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldFBsYXliYWNrSW5mbygpLmdldFByb3ZpZGVyKCkpLnRvQnVuZGxlKCk7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHJlcGVhdE1vZGUgPSBzZXNzaW9uLmdldEluc3RhbmNlKCkuZ2V0UmVwZWF0TW9kZSgpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBzaHVmZmxlTW9kZSA9IHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5nZXRTaHVmZmxlTW9kZSgpOworICAgICAgICAgICAgICAgIGZpbmFsIFBlbmRpbmdJbnRlbnQgc2Vzc2lvbkFjdGl2aXR5ID0gc2Vzc2lvbi5nZXRTZXNzaW9uQWN0aXZpdHkoKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRDb21tYW5kcy5oYXNDb21tYW5kKFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfR0VUX0xJU1QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLmdldFBsYXlsaXN0KCkgOiBudWxsOworICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8QnVuZGxlPiBwbGF5bGlzdEJ1bmRsZTsKKyAgICAgICAgICAgICAgICBpZiAocGxheWxpc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBwbGF5bGlzdEJ1bmRsZSA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEZpbmQgYSB3YXkgdG8gYXZvaWQgY29uY3VycmVudCBtb2RpZmljYXRpb24gZXhjZXB0aW9uLgorICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBsYXlsaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYUl0ZW0yIGl0ZW0gPSBwbGF5bGlzdC5nZXQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQnVuZGxlIGl0ZW1CdW5kbGUgPSBpdGVtLnRvQnVuZGxlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1CdW5kbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5bGlzdEJ1bmRsZS5hZGQoaXRlbUJ1bmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcGxheWxpc3RCdW5kbGUgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIERvdWJsZSBjaGVjayBpZiBzZXNzaW9uIGlzIHN0aWxsIHRoZXJlLCBiZWNhdXNlIGNsb3NlKCkgY2FuIGJlIGNhbGxlZCBpbiBhbm90aGVyCisgICAgICAgICAgICAgICAgLy8gdGhyZWFkLgorICAgICAgICAgICAgICAgIGlmIChnZXRTZXNzaW9uKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNhbGxlci5vbkNvbm5lY3RlZChNZWRpYVNlc3Npb24yU3R1Yi50aGlzLCBhbGxvd2VkQ29tbWFuZHMudG9CdW5kbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJTdGF0ZSwgcG9zaXRpb25FdmVudFRpbWVNcywgcG9zaXRpb25NcywgcGxheWJhY2tTcGVlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJlZFBvc2l0aW9uTXMsIHBsYXliYWNrSW5mb0J1bmRsZSwgcmVwZWF0TW9kZSwgc2h1ZmZsZU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWxpc3RCdW5kbGUsIHNlc3Npb25BY3Rpdml0eSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ29udHJvbGxlciBtYXkgYmUgZGllZCBwcmVtYXR1cmVseS4KKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUgaGVyZS4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3RpbmdDb250cm9sbGVycy5yZW1vdmUoQ29udHJvbGxlckluZm9JbXBsLmZyb20oY29udHJvbGxlckluZm8pLmdldElkKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmVqZWN0aW5nIGNvbm5lY3Rpb24sIGNvbnRyb2xsZXJJbmZvPSIgKyBjb250cm9sbGVySW5mbyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNhbGxlci5vbkRpc2Nvbm5lY3RlZCgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIENvbnRyb2xsZXIgbWF5IGJlIGRpZWQgcHJlbWF0dXJlbHkuCisgICAgICAgICAgICAgICAgICAgIC8vIE5vdCBhbiBpc3N1ZSBiZWNhdXNlIHdlJ2xsIGlnbm9yZSBpdCBhbnl3YXkuCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIG9uQ29udHJvbGxlckNsb3NlZChjYWxsZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFZvbHVtZVRvKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgaW50IHZhbHVlLCBmaW5hbCBpbnQgZmxhZ3MpCisgICAgICAgICAgICB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7CisgICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VUX1ZPTFVNRSwKKyAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4geworICAgICAgICAgICAgICAgICAgICBWb2x1bWVQcm92aWRlcjIgdm9sdW1lUHJvdmlkZXIgPSBzZXNzaW9uLmdldFZvbHVtZVByb3ZpZGVyKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh2b2x1bWVQcm92aWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFNldCBsb2NhbCBzdHJlYW0gdm9sdW1lCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVQcm92aWRlci5vblNldFZvbHVtZVRvKHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFkanVzdFZvbHVtZShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGludCBkaXJlY3Rpb24sIGludCBmbGFncykKKyAgICAgICAgICAgIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKKyAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVRfVk9MVU1FLAorICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7CisgICAgICAgICAgICAgICAgICAgIFZvbHVtZVByb3ZpZGVyMiB2b2x1bWVQcm92aWRlciA9IHNlc3Npb24uZ2V0Vm9sdW1lUHJvdmlkZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZvbHVtZVByb3ZpZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogQWRqdXN0IGxvY2FsIHN0cmVhbSB2b2x1bWUKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZVByb3ZpZGVyLm9uQWRqdXN0Vm9sdW1lKGRpcmVjdGlvbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLAorICAgICAgICAgICAgaW50IGNvbW1hbmRDb2RlLCBCdW5kbGUgYXJncykgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24geworICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBjb21tYW5kQ29kZSwgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKKyAgICAgICAgICAgIHN3aXRjaCAoY29tbWFuZENvZGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUJBQ0tfUExBWToKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnBsYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1BBVVNFOgorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkucGF1c2UoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1NUT1A6CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5zdG9wKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZQkFDS19QUkVQQVJFOgorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkucHJlcGFyZSgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUJBQ0tfU0VFS19UTzoKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnNlZWtUbyhhcmdzLmdldExvbmcoQVJHVU1FTlRfS0VZX1BPU0lUSU9OKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogUmVzZW5kIHVua25vd24gKG5ldykgY29tbWFuZHMgdGhyb3VnaCB0aGUgY3VzdG9tIGNvbW1hbmQuCisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNlbmRDdXN0b21Db21tYW5kKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgQnVuZGxlIGNvbW1hbmRCdW5kbGUsCisgICAgICAgICAgICBmaW5hbCBCdW5kbGUgYXJncywgZmluYWwgUmVzdWx0UmVjZWl2ZXIgcmVjZWl2ZXIpIHsKKyAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IGdldFNlc3Npb24oKTsKKyAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFNlc3Npb25Db21tYW5kMiBjb21tYW5kID0gU2Vzc2lvbkNvbW1hbmQyLmZyb21CdW5kbGUoY29tbWFuZEJ1bmRsZSk7CisgICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgInNlbmRDdXN0b21Db21tYW5kKCk6IElnbm9yaW5nIG51bGwgY29tbWFuZCBmcm9tICIKKyAgICAgICAgICAgICAgICAgICAgKyBnZXRDb250cm9sbGVySWZBYmxlKGNhbGxlcikpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZpbmFsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVySWZBYmxlKGNhbGxlciwgY29tbWFuZCk7CisgICAgICAgIGlmIChjb250cm9sbGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKKyAgICAgICAgICAgIGlmIChnZXRDb250cm9sbGVySWZBYmxlKGNhbGxlciwgY29tbWFuZCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbkN1c3RvbUNvbW1hbmQoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLAorICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCBjb21tYW5kLCBhcmdzLCByZWNlaXZlcik7CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHByZXBhcmVGcm9tVXJpKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgVXJpIHVyaSwKKyAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1BSRVBBUkVfRlJPTV9VUkksCisgICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHVyaSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJwcmVwYXJlRnJvbVVyaSgpOiBJZ25vcmluZyBudWxsIHVyaSBmcm9tICIgKyBjb250cm9sbGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25QcmVwYXJlRnJvbVVyaShzZXNzaW9uLmdldEluc3RhbmNlKCksIGNvbnRyb2xsZXIsIHVyaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYXMpOworICAgICAgICAgICAgICAgIH0pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHByZXBhcmVGcm9tU2VhcmNoKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIHF1ZXJ5LAorICAgICAgICAgICAgZmluYWwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUFJFUEFSRV9GUk9NX1NFQVJDSCwKKyAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4geworICAgICAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocXVlcnkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJwcmVwYXJlRnJvbVNlYXJjaCgpOiBJZ25vcmluZyBlbXB0eSBxdWVyeSBmcm9tICIgKyBjb250cm9sbGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25QcmVwYXJlRnJvbVNlYXJjaChzZXNzaW9uLmdldEluc3RhbmNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgcXVlcnksIGV4dHJhcyk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcHJlcGFyZUZyb21NZWRpYUlkKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIG1lZGlhSWQsCisgICAgICAgICAgICBmaW5hbCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QUkVQQVJFX0ZST01fTUVESUFfSUQsCisgICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKKyAgICAgICAgICAgIGlmIChtZWRpYUlkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJwcmVwYXJlRnJvbU1lZGlhSWQoKTogSWdub3JpbmcgbnVsbCBtZWRpYUlkIGZyb20gIiArIGNvbnRyb2xsZXIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vblByZXBhcmVGcm9tTWVkaWFJZChzZXNzaW9uLmdldEluc3RhbmNlKCksCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsIG1lZGlhSWQsIGV4dHJhcyk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHBsYXlGcm9tVXJpKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgVXJpIHVyaSwKKyAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1BMQVlfRlJPTV9VUkksCisgICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHVyaSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJwbGF5RnJvbVVyaSgpOiBJZ25vcmluZyBudWxsIHVyaSBmcm9tICIgKyBjb250cm9sbGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25QbGF5RnJvbVVyaShzZXNzaW9uLmdldEluc3RhbmNlKCksIGNvbnRyb2xsZXIsIHVyaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYXMpOworICAgICAgICAgICAgICAgIH0pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHBsYXlGcm9tU2VhcmNoKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIHF1ZXJ5LAorICAgICAgICAgICAgZmluYWwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUExBWV9GUk9NX1NFQVJDSCwKKyAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4geworICAgICAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocXVlcnkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJwbGF5RnJvbVNlYXJjaCgpOiBJZ25vcmluZyBlbXB0eSBxdWVyeSBmcm9tICIgKyBjb250cm9sbGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25QbGF5RnJvbVNlYXJjaChzZXNzaW9uLmdldEluc3RhbmNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgcXVlcnksIGV4dHJhcyk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcGxheUZyb21NZWRpYUlkKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIG1lZGlhSWQsCisgICAgICAgICAgICBmaW5hbCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QTEFZX0ZST01fTUVESUFfSUQsCisgICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lZGlhSWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAicGxheUZyb21NZWRpYUlkKCk6IElnbm9yaW5nIG51bGwgbWVkaWFJZCBmcm9tICIgKyBjb250cm9sbGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25QbGF5RnJvbU1lZGlhSWQoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLCBjb250cm9sbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSWQsIGV4dHJhcyk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0UmF0aW5nKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIG1lZGlhSWQsCisgICAgICAgICAgICBmaW5hbCBCdW5kbGUgcmF0aW5nQnVuZGxlKSB7CisgICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9TRVRfUkFUSU5HLAorICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtZWRpYUlkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgInNldFJhdGluZygpOiBJZ25vcmluZyBudWxsIG1lZGlhSWQgZnJvbSAiICsgY29udHJvbGxlcik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHJhdGluZ0J1bmRsZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJzZXRSYXRpbmcoKTogSWdub3JpbmcgbnVsbCByYXRpbmdCdW5kbGUgZnJvbSAiICsgY29udHJvbGxlcik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgUmF0aW5nMiByYXRpbmcgPSBSYXRpbmcyLmZyb21CdW5kbGUocmF0aW5nQnVuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJhdGluZyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmF0aW5nQnVuZGxlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJzZXRSYXRpbmcoKTogSWdub3JpbmcgbnVsbCByYXRpbmcgZnJvbSAiICsgY29udHJvbGxlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vblNldFJhdGluZyhzZXNzaW9uLmdldEluc3RhbmNlKCksIGNvbnRyb2xsZXIsIG1lZGlhSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0aW5nKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRQbGF5bGlzdChmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIExpc3Q8QnVuZGxlPiBwbGF5bGlzdCwKKyAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBtZXRhZGF0YSkgeworICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9MSVNULCAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4geworICAgICAgICAgICAgaWYgKHBsYXlsaXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJzZXRQbGF5bGlzdCgpOiBJZ25vcmluZyBudWxsIHBsYXlsaXN0IGZyb20gIiArIGNvbnRyb2xsZXIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwbGF5bGlzdC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIC8vIFJlY3JlYXRlcyBVVUlEIGluIHRoZSBwbGF5bGlzdAorICAgICAgICAgICAgICAgIE1lZGlhSXRlbTIgaXRlbSA9IE1lZGlhSXRlbTJJbXBsLmZyb21CdW5kbGUocGxheWxpc3QuZ2V0KGkpLCBudWxsKTsKKyAgICAgICAgICAgICAgICBpZiAoaXRlbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKGl0ZW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5zZXRQbGF5bGlzdChsaXN0LCBNZWRpYU1ldGFkYXRhMi5mcm9tQnVuZGxlKG1ldGFkYXRhKSk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVBsYXlsaXN0TWV0YWRhdGEoZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBCdW5kbGUgbWV0YWRhdGEpIHsKKyAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfTElTVF9NRVRBREFUQSwKKyAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4geworICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnVwZGF0ZVBsYXlsaXN0TWV0YWRhdGEoTWVkaWFNZXRhZGF0YTIuZnJvbUJ1bmRsZShtZXRhZGF0YSkpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZGRQbGF5bGlzdEl0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgaW5kZXgsIEJ1bmRsZSBtZWRpYUl0ZW0pIHsKKyAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9BRERfSVRFTSwKKyAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4geworICAgICAgICAgICAgICAgICAgICAvLyBSZXNldHMgdGhlIFVVSUQgZnJvbSB0aGUgaW5jb21pbmcgbWVkaWEgaWQsIHNvIGNvbnRyb2xsZXIgbWF5IHJldXNlIGEgbWVkaWEKKyAgICAgICAgICAgICAgICAgICAgLy8gaXRlbSBtdWx0aXBsZSB0aW1lcyBmb3IgYWRkUGxheWxpc3RJdGVtLgorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkuYWRkUGxheWxpc3RJdGVtKGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhSXRlbTJJbXBsLmZyb21CdW5kbGUobWVkaWFJdGVtLCBudWxsKSk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUGxheWxpc3RJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgQnVuZGxlIG1lZGlhSXRlbSkgeworICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1JFTU9WRV9JVEVNLAorICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7CisgICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBNZWRpYUl0ZW0yLmZyb21CdW5kbGUobWVkaWFJdGVtKTsKKyAgICAgICAgICAgIC8vIE5vdGU6IE1lZGlhSXRlbTIgaGFzIGhpZGRlbiBVVUlEIHRvIGlkZW50aWZ5IGl0IGFjcm9zcyB0aGUgcHJvY2Vzc2VzLgorICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnJlbW92ZVBsYXlsaXN0SXRlbShpdGVtKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVwbGFjZVBsYXlsaXN0SXRlbShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGludCBpbmRleCwgQnVuZGxlIG1lZGlhSXRlbSkgeworICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1JFUExBQ0VfSVRFTSwKKyAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4geworICAgICAgICAgICAgICAgICAgICAvLyBSZXNldHMgdGhlIFVVSUQgZnJvbSB0aGUgaW5jb21pbmcgbWVkaWEgaWQsIHNvIGNvbnRyb2xsZXIgbWF5IHJldXNlIGEgbWVkaWEKKyAgICAgICAgICAgICAgICAgICAgLy8gaXRlbSBtdWx0aXBsZSB0aW1lcyBmb3IgcmVwbGFjZVBsYXlsaXN0SXRlbS4KKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnJlcGxhY2VQbGF5bGlzdEl0ZW0oaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFJdGVtMkltcGwuZnJvbUJ1bmRsZShtZWRpYUl0ZW0sIG51bGwpKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBza2lwVG9QbGF5bGlzdEl0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBCdW5kbGUgbWVkaWFJdGVtKSB7CisgICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfU0tJUF9UT19QTEFZTElTVF9JVEVNLAorICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtZWRpYUl0ZW0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic2tpcFRvUGxheWxpc3RJdGVtKCk6IElnbm9yaW5nIG51bGwgbWVkaWFJdGVtIGZyb20gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNvbnRyb2xsZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IE1lZGlhSXRlbTIgaGFzIGhpZGRlbiBVVUlEIHRvIGlkZW50aWZ5IGl0IGFjcm9zcyB0aGUgcHJvY2Vzc2VzLgorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkuc2tpcFRvUGxheWxpc3RJdGVtKE1lZGlhSXRlbTIuZnJvbUJ1bmRsZShtZWRpYUl0ZW0pKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBza2lwVG9QcmV2aW91c0l0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyKSB7CisgICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfU0tJUF9QUkVWX0lURU0sCisgICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnNraXBUb1ByZXZpb3VzSXRlbSgpOworICAgICAgICAgICAgICAgIH0pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNraXBUb05leHRJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlcikgeworICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NLSVBfTkVYVF9JVEVNLAorICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5za2lwVG9OZXh0SXRlbSgpOworICAgICAgICAgICAgICAgIH0pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFJlcGVhdE1vZGUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgcmVwZWF0TW9kZSkgeworICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9SRVBFQVRfTU9ERSwKKyAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4geworICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkuc2V0UmVwZWF0TW9kZShyZXBlYXRNb2RlKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRTaHVmZmxlTW9kZShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGludCBzaHVmZmxlTW9kZSkgeworICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9TSFVGRkxFX01PREUsCisgICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnNldFNodWZmbGVNb2RlKHNodWZmbGVNb2RlKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gQUlETCBtZXRob2RzIGZvciBMaWJyYXJ5U2Vzc2lvbiBvdmVycmlkZXMKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBnZXRMaWJyYXJ5Um9vdChmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIEJ1bmRsZSByb290SGludHMpCisgICAgICAgICAgICB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7CisgICAgICAgIG9uQnJvd3NlckNvbW1hbmQoY2FsbGVyLCAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4geworICAgICAgICAgICAgZmluYWwgTGlicmFyeVJvb3Qgcm9vdCA9IHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbkdldExpYnJhcnlSb290KHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgcm9vdEhpbnRzKTsKKyAgICAgICAgICAgIG5vdGlmeShjb250cm9sbGVyLCAodW51c2VkLCBpQ29udHJvbGxlcikgLT4geworICAgICAgICAgICAgICAgIGlDb250cm9sbGVyLm9uR2V0TGlicmFyeVJvb3REb25lKHJvb3RIaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvb3QgPT0gbnVsbCA/IG51bGwgOiByb290LmdldFJvb3RJZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgcm9vdCA9PSBudWxsID8gbnVsbCA6IHJvb3QuZ2V0RXh0cmFzKCkpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGdldEl0ZW0oZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBTdHJpbmcgbWVkaWFJZCkKKyAgICAgICAgICAgIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKKyAgICAgICAgb25Ccm93c2VyQ29tbWFuZChjYWxsZXIsIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7CisgICAgICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm1lZGlhSWQgc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgTWVkaWFJdGVtMiByZXN1bHQgPSBzZXNzaW9uLmdldENhbGxiYWNrKCkub25HZXRJdGVtKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgbWVkaWFJZCk7CisgICAgICAgICAgICBub3RpZnkoY29udHJvbGxlciwgKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKKyAgICAgICAgICAgICAgICBpQ29udHJvbGxlci5vbkdldEl0ZW1Eb25lKG1lZGlhSWQsIHJlc3VsdCA9PSBudWxsID8gbnVsbCA6IHJlc3VsdC50b0J1bmRsZSgpKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBnZXRDaGlsZHJlbihmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBwYXJlbnRJZCwKKyAgICAgICAgICAgIGZpbmFsIGludCBwYWdlLCBmaW5hbCBpbnQgcGFnZVNpemUsIGZpbmFsIEJ1bmRsZSBleHRyYXMpIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKKyAgICAgICAgb25Ccm93c2VyQ29tbWFuZChjYWxsZXIsIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7CisgICAgICAgICAgICBpZiAocGFyZW50SWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJwYXJlbnRJZCBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGFnZSA8IDEgfHwgcGFnZVNpemUgPCAxKSB7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIk5laXRoZXIgcGFnZSBub3IgcGFnZVNpemUgc2hvdWxkIGJlIGxlc3MgdGhhbiAxIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gcmVzdWx0ID0gc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uR2V0Q2hpbGRyZW4oc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLAorICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCBwYXJlbnRJZCwgcGFnZSwgcGFnZVNpemUsIGV4dHJhcyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LnNpemUoKSA+IHBhZ2VTaXplKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigib25HZXRDaGlsZHJlbigpIHNob3VsZG4ndCByZXR1cm4gbWVkaWEgaXRlbXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAibW9yZSB0aGFuIHBhZ2VTaXplLiByZXN1bHQuc2l6ZSgpPSIgKyByZXN1bHQuc2l6ZSgpICsgIiBwYWdlU2l6ZT0iCisgICAgICAgICAgICAgICAgICAgICAgICArIHBhZ2VTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIExpc3Q8QnVuZGxlPiBidW5kbGVMaXN0OworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYnVuZGxlTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgICAgIGZvciAoTWVkaWFJdGVtMiBpdGVtIDogcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgICAgIGJ1bmRsZUxpc3QuYWRkKGl0ZW0gPT0gbnVsbCA/IG51bGwgOiBpdGVtLnRvQnVuZGxlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnVuZGxlTGlzdCA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub3RpZnkoY29udHJvbGxlciwgKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKKyAgICAgICAgICAgICAgICBpQ29udHJvbGxlci5vbkdldENoaWxkcmVuRG9uZShwYXJlbnRJZCwgcGFnZSwgcGFnZVNpemUsIGJ1bmRsZUxpc3QsIGV4dHJhcyk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2VhcmNoKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIHF1ZXJ5LCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIG9uQnJvd3NlckNvbW1hbmQoY2FsbGVyLCAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4geworICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgInNlYXJjaCgpOiBJZ25vcmluZyBlbXB0eSBxdWVyeSBmcm9tICIgKyBjb250cm9sbGVyKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25TZWFyY2goc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLCBjb250cm9sbGVyLCBxdWVyeSwgZXh0cmFzKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZ2V0U2VhcmNoUmVzdWx0KGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIHF1ZXJ5LAorICAgICAgICAgICAgZmluYWwgaW50IHBhZ2UsIGZpbmFsIGludCBwYWdlU2l6ZSwgZmluYWwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICBvbkJyb3dzZXJDb21tYW5kKGNhbGxlciwgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKKyAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJnZXRTZWFyY2hSZXN1bHQoKTogSWdub3JpbmcgZW1wdHkgcXVlcnkgZnJvbSAiICsgY29udHJvbGxlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBhZ2UgPCAxIHx8IHBhZ2VTaXplIDwgMSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgImdldFNlYXJjaFJlc3VsdCgpOiBJZ25vcmluZyBuZWdhdGl2ZSBwYWdlIC8gcGFnZVNpemUuIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHBhZ2U9IiArIHBhZ2UgKyAiIHBhZ2VTaXplPSIgKyBwYWdlU2l6ZSArICIgZnJvbSAiICsgY29udHJvbGxlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiByZXN1bHQgPSBzZXNzaW9uLmdldENhbGxiYWNrKCkub25HZXRTZWFyY2hSZXN1bHQoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLAorICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCBxdWVyeSwgcGFnZSwgcGFnZVNpemUsIGV4dHJhcyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LnNpemUoKSA+IHBhZ2VTaXplKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigib25HZXRTZWFyY2hSZXN1bHQoKSBzaG91bGRuJ3QgcmV0dXJuIG1lZGlhICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIml0ZW1zIG1vcmUgdGhhbiBwYWdlU2l6ZS4gcmVzdWx0LnNpemUoKT0iICsgcmVzdWx0LnNpemUoKSArICIgcGFnZVNpemU9IgorICAgICAgICAgICAgICAgICAgICAgICAgKyBwYWdlU2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBMaXN0PEJ1bmRsZT4gYnVuZGxlTGlzdDsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJ1bmRsZUxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgICAgICAgICBmb3IgKE1lZGlhSXRlbTIgaXRlbSA6IHJlc3VsdCkgeworICAgICAgICAgICAgICAgICAgICBidW5kbGVMaXN0LmFkZChpdGVtID09IG51bGwgPyBudWxsIDogaXRlbS50b0J1bmRsZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJ1bmRsZUxpc3QgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm90aWZ5KGNvbnRyb2xsZXIsICh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7CisgICAgICAgICAgICAgICAgaUNvbnRyb2xsZXIub25HZXRTZWFyY2hSZXN1bHREb25lKHF1ZXJ5LCBwYWdlLCBwYWdlU2l6ZSwgYnVuZGxlTGlzdCwgZXh0cmFzKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdWJzY3JpYmUoZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBTdHJpbmcgcGFyZW50SWQsCisgICAgICAgICAgICBmaW5hbCBCdW5kbGUgb3B0aW9uKSB7CisgICAgICAgIG9uQnJvd3NlckNvbW1hbmQoY2FsbGVyLCAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4geworICAgICAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJzdWJzY3JpYmUoKTogSWdub3JpbmcgbnVsbCBwYXJlbnRJZCBmcm9tICIgKyBjb250cm9sbGVyKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25TdWJzY3JpYmUoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLAorICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCBwYXJlbnRJZCwgb3B0aW9uKTsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgICAgICBTZXQ8U3RyaW5nPiBzdWJzY3JpcHRpb24gPSBtU3Vic2NyaXB0aW9ucy5nZXQoY29udHJvbGxlcik7CisgICAgICAgICAgICAgICAgaWYgKHN1YnNjcmlwdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbiA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgICAgICAgICAgICAgbVN1YnNjcmlwdGlvbnMucHV0KGNvbnRyb2xsZXIsIHN1YnNjcmlwdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5hZGQocGFyZW50SWQpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB1bnN1YnNjcmliZShmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBwYXJlbnRJZCkgeworICAgICAgICBvbkJyb3dzZXJDb21tYW5kKGNhbGxlciwgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKKyAgICAgICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAidW5zdWJzY3JpYmUoKTogSWdub3JpbmcgbnVsbCBwYXJlbnRJZCBmcm9tICIgKyBjb250cm9sbGVyKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25VbnN1YnNjcmliZShzZXNzaW9uLmdldEluc3RhbmNlKCksIGNvbnRyb2xsZXIsIHBhcmVudElkKTsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgICAgICBtU3Vic2NyaXB0aW9ucy5yZW1vdmUoY29udHJvbGxlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBBUElzIGZvciBNZWRpYVNlc3Npb24ySW1wbAorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIC8vIFRPRE8oamFld2FuKTogKENhbiBiZSBQb3N0LVApIE5lZWQgYSB3YXkgdG8gZ2V0IGNvbnRyb2xsZXIgd2l0aCBwZXJtaXNzaW9ucworICAgIHB1YmxpYyBMaXN0PENvbnRyb2xsZXJJbmZvPiBnZXRDb250cm9sbGVycygpIHsKKyAgICAgICAgQXJyYXlMaXN0PENvbnRyb2xsZXJJbmZvPiBjb250cm9sbGVycyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Db250cm9sbGVycy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJzLmFkZChtQ29udHJvbGxlcnMudmFsdWVBdChpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXJzOworICAgIH0KKworICAgIC8vIFNob3VsZCBiZSB1c2VkIHdpdGhvdXQgYSBsb2NrIHRvIHByZXZlbnQgcG90ZW50aWFsIGRlYWRsb2NrLgorICAgIHB1YmxpYyB2b2lkIG5vdGlmeVBsYXllclN0YXRlQ2hhbmdlZE5vdExvY2tlZChpbnQgc3RhdGUpIHsKKyAgICAgICAgbm90aWZ5QWxsKChjb250cm9sbGVyLCBpQ29udHJvbGxlcikgLT4geworICAgICAgICAgICAgaUNvbnRyb2xsZXIub25QbGF5ZXJTdGF0ZUNoYW5nZWQoc3RhdGUpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICAvLyBUT0RPKGphZXdhbik6IFJlbmFtZQorICAgIHB1YmxpYyB2b2lkIG5vdGlmeVBvc2l0aW9uQ2hhbmdlZE5vdExvY2tlZChsb25nIGV2ZW50VGltZU1zLCBsb25nIHBvc2l0aW9uTXMpIHsKKyAgICAgICAgbm90aWZ5QWxsKChjb250cm9sbGVyLCBpQ29udHJvbGxlcikgLT4geworICAgICAgICAgICAgaUNvbnRyb2xsZXIub25Qb3NpdGlvbkNoYW5nZWQoZXZlbnRUaW1lTXMsIHBvc2l0aW9uTXMpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlQbGF5YmFja1NwZWVkQ2hhbmdlZE5vdExvY2tlZChmbG9hdCBzcGVlZCkgeworICAgICAgICBub3RpZnlBbGwoKGNvbnRyb2xsZXIsIGlDb250cm9sbGVyKSAtPiB7CisgICAgICAgICAgICBpQ29udHJvbGxlci5vblBsYXliYWNrU3BlZWRDaGFuZ2VkKHNwZWVkKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbm90aWZ5QnVmZmVyZWRQb3NpdGlvbkNoYW5nZWROb3RMb2NrZWQobG9uZyBidWZmZXJlZFBvc2l0aW9uTXMpIHsKKyAgICAgICAgbm90aWZ5QWxsKChjb250cm9sbGVyLCBpQ29udHJvbGxlcikgLT4geworICAgICAgICAgICAgaUNvbnRyb2xsZXIub25CdWZmZXJlZFBvc2l0aW9uQ2hhbmdlZChidWZmZXJlZFBvc2l0aW9uTXMpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlDdXN0b21MYXlvdXROb3RMb2NrZWQoQ29udHJvbGxlckluZm8gY29udHJvbGxlciwgTGlzdDxDb21tYW5kQnV0dG9uPiBsYXlvdXQpIHsKKyAgICAgICAgbm90aWZ5KGNvbnRyb2xsZXIsICh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7CisgICAgICAgICAgICBMaXN0PEJ1bmRsZT4gbGF5b3V0QnVuZGxlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsYXlvdXQuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gKChDb21tYW5kQnV0dG9uSW1wbCkgbGF5b3V0LmdldChpKS5nZXRQcm92aWRlcigpKS50b0J1bmRsZSgpOworICAgICAgICAgICAgICAgIGlmIChidW5kbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBsYXlvdXRCdW5kbGVzLmFkZChidW5kbGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlDb250cm9sbGVyLm9uQ3VzdG9tTGF5b3V0Q2hhbmdlZChsYXlvdXRCdW5kbGVzKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbm90aWZ5UGxheWxpc3RDaGFuZ2VkTm90TG9ja2VkKExpc3Q8TWVkaWFJdGVtMj4gcGxheWxpc3QsIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7CisgICAgICAgIGZpbmFsIExpc3Q8QnVuZGxlPiBidW5kbGVMaXN0OworICAgICAgICBpZiAocGxheWxpc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgYnVuZGxlTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwbGF5bGlzdC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChwbGF5bGlzdC5nZXQoaSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gcGxheWxpc3QuZ2V0KGkpLnRvQnVuZGxlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChidW5kbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlTGlzdC5hZGQoYnVuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1bmRsZUxpc3QgPSBudWxsOworICAgICAgICB9CisgICAgICAgIGZpbmFsIEJ1bmRsZSBtZXRhZGF0YUJ1bmRsZSA9IChtZXRhZGF0YSA9PSBudWxsKSA/IG51bGwgOiBtZXRhZGF0YS50b0J1bmRsZSgpOworICAgICAgICBub3RpZnlBbGwoKGNvbnRyb2xsZXIsIGlDb250cm9sbGVyKSAtPiB7CisgICAgICAgICAgICBpZiAoZ2V0Q29udHJvbGxlckJpbmRlcklmQWJsZShjb250cm9sbGVyLAorICAgICAgICAgICAgICAgICAgICBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX0dFVF9MSVNUKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaUNvbnRyb2xsZXIub25QbGF5bGlzdENoYW5nZWQoYnVuZGxlTGlzdCwgbWV0YWRhdGFCdW5kbGUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChnZXRDb250cm9sbGVyQmluZGVySWZBYmxlKGNvbnRyb2xsZXIsCisgICAgICAgICAgICAgICAgICAgIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfR0VUX0xJU1RfTUVUQURBVEEpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpQ29udHJvbGxlci5vblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkKG1ldGFkYXRhQnVuZGxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbm90aWZ5UGxheWxpc3RNZXRhZGF0YUNoYW5nZWROb3RMb2NrZWQoTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKKyAgICAgICAgZmluYWwgQnVuZGxlIG1ldGFkYXRhQnVuZGxlID0gKG1ldGFkYXRhID09IG51bGwpID8gbnVsbCA6IG1ldGFkYXRhLnRvQnVuZGxlKCk7CisgICAgICAgIG5vdGlmeUFsbChTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX0dFVF9MSVNUX01FVEFEQVRBLAorICAgICAgICAgICAgICAgICh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7CisgICAgICAgICAgICAgICAgICAgIGlDb250cm9sbGVyLm9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWQobWV0YWRhdGFCdW5kbGUpOworICAgICAgICAgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG5vdGlmeVJlcGVhdE1vZGVDaGFuZ2VkTm90TG9ja2VkKGludCByZXBlYXRNb2RlKSB7CisgICAgICAgIG5vdGlmeUFsbCgodW51c2VkLCBpQ29udHJvbGxlcikgLT4geworICAgICAgICAgICAgaUNvbnRyb2xsZXIub25SZXBlYXRNb2RlQ2hhbmdlZChyZXBlYXRNb2RlKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbm90aWZ5U2h1ZmZsZU1vZGVDaGFuZ2VkTm90TG9ja2VkKGludCBzaHVmZmxlTW9kZSkgeworICAgICAgICBub3RpZnlBbGwoKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKKyAgICAgICAgICAgIGlDb250cm9sbGVyLm9uU2h1ZmZsZU1vZGVDaGFuZ2VkKHNodWZmbGVNb2RlKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbm90aWZ5UGxheWJhY2tJbmZvQ2hhbmdlZChNZWRpYUNvbnRyb2xsZXIyLlBsYXliYWNrSW5mbyBwbGF5YmFja0luZm8pIHsKKyAgICAgICAgZmluYWwgQnVuZGxlIHBsYXliYWNrSW5mb0J1bmRsZSA9CisgICAgICAgICAgICAgICAgKChNZWRpYUNvbnRyb2xsZXIySW1wbC5QbGF5YmFja0luZm9JbXBsKSBwbGF5YmFja0luZm8uZ2V0UHJvdmlkZXIoKSkudG9CdW5kbGUoKTsKKyAgICAgICAgbm90aWZ5QWxsKCh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7CisgICAgICAgICAgICBpQ29udHJvbGxlci5vblBsYXliYWNrSW5mb0NoYW5nZWQocGxheWJhY2tJbmZvQnVuZGxlKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QWxsb3dlZENvbW1hbmRzKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIFNlc3Npb25Db21tYW5kR3JvdXAyIGNvbW1hbmRzKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIG1BbGxvd2VkQ29tbWFuZEdyb3VwTWFwLnB1dChjb250cm9sbGVyLCBjb21tYW5kcyk7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5KGNvbnRyb2xsZXIsICh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7CisgICAgICAgICAgICBpQ29udHJvbGxlci5vbkFsbG93ZWRDb21tYW5kc0NoYW5nZWQoY29tbWFuZHMudG9CdW5kbGUoKSk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlbmRDdXN0b21Db21tYW5kKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIFNlc3Npb25Db21tYW5kMiBjb21tYW5kLCBCdW5kbGUgYXJncywKKyAgICAgICAgICAgIFJlc3VsdFJlY2VpdmVyIHJlY2VpdmVyKSB7CisgICAgICAgIGlmIChyZWNlaXZlciAhPSBudWxsICYmIGNvbnRyb2xsZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ29udHJvbGxlciBzaG91bGRuJ3QgYmUgbnVsbCBpZiByZXN1bHQgcmVjZWl2ZXIgaXMiCisgICAgICAgICAgICAgICAgICAgICsgIiBzcGVjaWZpZWQiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb21tYW5kIHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5KGNvbnRyb2xsZXIsICh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7CisgICAgICAgICAgICBCdW5kbGUgY29tbWFuZEJ1bmRsZSA9IGNvbW1hbmQudG9CdW5kbGUoKTsKKyAgICAgICAgICAgIGlDb250cm9sbGVyLm9uQ3VzdG9tQ29tbWFuZChjb21tYW5kQnVuZGxlLCBhcmdzLCBudWxsKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2VuZEN1c3RvbUNvbW1hbmQoU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQsIEJ1bmRsZSBhcmdzKSB7CisgICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmQgc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBCdW5kbGUgY29tbWFuZEJ1bmRsZSA9IGNvbW1hbmQudG9CdW5kbGUoKTsKKyAgICAgICAgbm90aWZ5QWxsKCh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7CisgICAgICAgICAgICBpQ29udHJvbGxlci5vbkN1c3RvbUNvbW1hbmQoY29tbWFuZEJ1bmRsZSwgYXJncywgbnVsbCk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG5vdGlmeUVycm9yKGludCBlcnJvckNvZGUsIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgbm90aWZ5QWxsKCh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7CisgICAgICAgICAgICBpQ29udHJvbGxlci5vbkVycm9yKGVycm9yQ29kZSwgZXh0cmFzKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIEFQSXMgZm9yIE1lZGlhTGlicmFyeVNlc3Npb25JbXBsCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgcHVibGljIHZvaWQgbm90aWZ5U2VhcmNoUmVzdWx0Q2hhbmdlZChDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBTdHJpbmcgcXVlcnksIGludCBpdGVtQ291bnQsCisgICAgICAgICAgICBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIG5vdGlmeShjb250cm9sbGVyLCAodW51c2VkLCBpQ29udHJvbGxlcikgLT4geworICAgICAgICAgICAgaUNvbnRyb2xsZXIub25TZWFyY2hSZXN1bHRDaGFuZ2VkKHF1ZXJ5LCBpdGVtQ291bnQsIGV4dHJhcyk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNoaWxkcmVuQ2hhbmdlZE5vdExvY2tlZChDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBTdHJpbmcgcGFyZW50SWQsCisgICAgICAgICAgICBpbnQgaXRlbUNvdW50LCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIG5vdGlmeShjb250cm9sbGVyLCAodW51c2VkLCBpQ29udHJvbGxlcikgLT4geworICAgICAgICAgICAgaWYgKGlzU3Vic2NyaWJlZChjb250cm9sbGVyLCBwYXJlbnRJZCkpIHsKKyAgICAgICAgICAgICAgICBpQ29udHJvbGxlci5vbkNoaWxkcmVuQ2hhbmdlZChwYXJlbnRJZCwgaXRlbUNvdW50LCBleHRyYXMpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGlsZHJlbkNoYW5nZWROb3RMb2NrZWQoU3RyaW5nIHBhcmVudElkLCBpbnQgaXRlbUNvdW50LCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIG5vdGlmeUFsbCgoY29udHJvbGxlciwgaUNvbnRyb2xsZXIpIC0+IHsKKyAgICAgICAgICAgIGlmIChpc1N1YnNjcmliZWQoY29udHJvbGxlciwgcGFyZW50SWQpKSB7CisgICAgICAgICAgICAgICAgaUNvbnRyb2xsZXIub25DaGlsZHJlbkNoYW5nZWQocGFyZW50SWQsIGl0ZW1Db3VudCwgZXh0cmFzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzU3Vic2NyaWJlZChDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBTdHJpbmcgcGFyZW50SWQpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgU2V0PFN0cmluZz4gc3Vic2NyaXB0aW9ucyA9IG1TdWJzY3JpcHRpb25zLmdldChjb250cm9sbGVyKTsKKyAgICAgICAgICAgIGlmIChzdWJzY3JpcHRpb25zID09IG51bGwgfHwgIXN1YnNjcmlwdGlvbnMuY29udGFpbnMocGFyZW50SWQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBNaXNjCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgQEZ1bmN0aW9uYWxJbnRlcmZhY2UKKyAgICBwcml2YXRlIGludGVyZmFjZSBTZXNzaW9uUnVubmFibGUgeworICAgICAgICB2b2lkIHJ1bihmaW5hbCBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uLCBmaW5hbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyKTsKKyAgICB9CisKKyAgICBARnVuY3Rpb25hbEludGVyZmFjZQorICAgIHByaXZhdGUgaW50ZXJmYWNlIExpYnJhcnlTZXNzaW9uUnVubmFibGUgeworICAgICAgICB2b2lkIHJ1bihmaW5hbCBNZWRpYUxpYnJhcnlTZXNzaW9uSW1wbCBzZXNzaW9uLCBmaW5hbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyKTsKKyAgICB9CisKKyAgICBARnVuY3Rpb25hbEludGVyZmFjZQorICAgIHByaXZhdGUgaW50ZXJmYWNlIE5vdGlmeVJ1bm5hYmxlIHsKKyAgICAgICAgdm9pZCBydW4oZmluYWwgQ29udHJvbGxlckluZm8gY29udHJvbGxlciwKKyAgICAgICAgICAgICAgICBmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBpQ29udHJvbGxlcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhU2Vzc2lvblNlcnZpY2UySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzNlYjY1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwuamF2YQpAQCAtMCwwICsxLDE2OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dC5OT1RJRklDQVRJT05fU0VSVklDRTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb25NYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllckJhc2U7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllckJhc2UuUGxheWVyRXZlbnRDYWxsYmFjazsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb25TZXJ2aWNlMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvblNlcnZpY2UyLk1lZGlhTm90aWZpY2F0aW9uOworaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjIuVG9rZW5UeXBlOworaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhU2Vzc2lvblNlcnZpY2UyUHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLkd1YXJkZWRCeTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisvLyBUT0RPKGphZXdhbik6IE5lZWQgYSB0ZXN0IGZvciBzZXNzaW9uIHNlcnZpY2UgaXRzZWxmLgorcHVibGljIGNsYXNzIE1lZGlhU2Vzc2lvblNlcnZpY2UySW1wbCBpbXBsZW1lbnRzIE1lZGlhU2Vzc2lvblNlcnZpY2UyUHJvdmlkZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNUFNlc3Npb25TZXJ2aWNlIjsgLy8gdG8gbWVldCAyMyBjaGFyIGxpbWl0IGluIExvZyB0YWcKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsgLy8gVE9ETyhqYWV3YW4pOiBDaGFuZ2UgdGhpcy4gKGIvNzQwOTQ2MTEpCisKKyAgICBwcml2YXRlIGZpbmFsIE1lZGlhU2Vzc2lvblNlcnZpY2UyIG1JbnN0YW5jZTsKKyAgICBwcml2YXRlIGZpbmFsIFBsYXllckV2ZW50Q2FsbGJhY2sgbUNhbGxiYWNrID0gbmV3IFNlc3Npb25TZXJ2aWNlRXZlbnRDYWxsYmFjaygpOworCisgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbUxvY2sgPSBuZXcgT2JqZWN0KCk7CisgICAgQEd1YXJkZWRCeSgibUxvY2siKQorICAgIHByaXZhdGUgTm90aWZpY2F0aW9uTWFuYWdlciBtTm90aWZpY2F0aW9uTWFuYWdlcjsKKyAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCisgICAgcHJpdmF0ZSBJbnRlbnQgbVN0YXJ0U2VsZkludGVudDsKKworICAgIHByaXZhdGUgYm9vbGVhbiBtSXNSdW5uaW5nRm9yZWdyb3VuZDsKKyAgICBwcml2YXRlIE1lZGlhU2Vzc2lvbjIgbVNlc3Npb247CisKKyAgICBwdWJsaWMgTWVkaWFTZXNzaW9uU2VydmljZTJJbXBsKE1lZGlhU2Vzc2lvblNlcnZpY2UyIGluc3RhbmNlKSB7CisgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiTWVkaWFTZXNzaW9uU2VydmljZTJJbXBsKCIgKyBpbnN0YW5jZSArICIpIik7CisgICAgICAgIH0KKyAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1lZGlhU2Vzc2lvbjIgZ2V0U2Vzc2lvbl9pbXBsKCkgeworICAgICAgICByZXR1cm4gZ2V0U2Vzc2lvbigpOworICAgIH0KKworICAgIE1lZGlhU2Vzc2lvbjIgZ2V0U2Vzc2lvbigpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgcmV0dXJuIG1TZXNzaW9uOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1lZGlhTm90aWZpY2F0aW9uIG9uVXBkYXRlTm90aWZpY2F0aW9uX2ltcGwoKSB7CisgICAgICAgIC8vIFByb3ZpZGUgZGVmYXVsdCBub3RpZmljYXRpb24gVUkgbGF0ZXIuCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlX2ltcGwoKSB7CisgICAgICAgIG1Ob3RpZmljYXRpb25NYW5hZ2VyID0gKE5vdGlmaWNhdGlvbk1hbmFnZXIpIG1JbnN0YW5jZS5nZXRTeXN0ZW1TZXJ2aWNlKAorICAgICAgICAgICAgICAgIE5PVElGSUNBVElPTl9TRVJWSUNFKTsKKyAgICAgICAgbVN0YXJ0U2VsZkludGVudCA9IG5ldyBJbnRlbnQobUluc3RhbmNlLCBtSW5zdGFuY2UuZ2V0Q2xhc3MoKSk7CisKKyAgICAgICAgU2Vzc2lvblRva2VuMiB0b2tlbiA9IG5ldyBTZXNzaW9uVG9rZW4yKG1JbnN0YW5jZSwgbUluc3RhbmNlLmdldFBhY2thZ2VOYW1lKCksCisgICAgICAgICAgICAgICAgbUluc3RhbmNlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgaWYgKHRva2VuLmdldFR5cGUoKSAhPSBnZXRTZXNzaW9uVHlwZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXhwZWN0ZWQgc2Vzc2lvbiBzZXJ2aWNlLCBidXQgd2FzICIgKyB0b2tlbi5nZXRUeXBlKCkpOworICAgICAgICB9CisgICAgICAgIG1TZXNzaW9uID0gbUluc3RhbmNlLm9uQ3JlYXRlU2Vzc2lvbih0b2tlbi5nZXRJZCgpKTsKKyAgICAgICAgaWYgKG1TZXNzaW9uID09IG51bGwgfHwgIXRva2VuLmdldElkKCkuZXF1YWxzKG1TZXNzaW9uLmdldFRva2VuKCkuZ2V0SWQoKSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeHBlY3RlZCBzZXNzaW9uIHdpdGggaWQgIiArIHRva2VuLmdldElkKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBidXQgZ290ICIgKyBtU2Vzc2lvbik7CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBVbmNvbW1lbnQgaGVyZS4KKyAgICAgICAgLy8gbVNlc3Npb24ucmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKG1DYWxsYmFjaywgbVNlc3Npb24uZ2V0RXhlY3V0b3IoKSk7CisgICAgfQorCisgICAgQFRva2VuVHlwZSBpbnQgZ2V0U2Vzc2lvblR5cGUoKSB7CisgICAgICAgIHJldHVybiBTZXNzaW9uVG9rZW4yLlRZUEVfU0VTU0lPTl9TRVJWSUNFOworICAgIH0KKworICAgIHB1YmxpYyBJQmluZGVyIG9uQmluZF9pbXBsKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgaWYgKE1lZGlhU2Vzc2lvblNlcnZpY2UyLlNFUlZJQ0VfSU5URVJGQUNFLmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gKChNZWRpYVNlc3Npb24ySW1wbCkgbVNlc3Npb24uZ2V0UHJvdmlkZXIoKSkuZ2V0U2Vzc2lvblN0dWIoKS5hc0JpbmRlcigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVOb3RpZmljYXRpb24oaW50IHBsYXllclN0YXRlKSB7CisgICAgICAgIE1lZGlhTm90aWZpY2F0aW9uIG1lZGlhTm90aWZpY2F0aW9uID0gbUluc3RhbmNlLm9uVXBkYXRlTm90aWZpY2F0aW9uKCk7CisgICAgICAgIGlmIChtZWRpYU5vdGlmaWNhdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoKHBsYXllclN0YXRlKSB7CisgICAgICAgICAgICBjYXNlIE1lZGlhUGxheWVyQmFzZS5QTEFZRVJfU1RBVEVfUExBWUlORzoKKyAgICAgICAgICAgICAgICBpZiAoIW1Jc1J1bm5pbmdGb3JlZ3JvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgIG1Jc1J1bm5pbmdGb3JlZ3JvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnN0YXJ0Rm9yZWdyb3VuZFNlcnZpY2UobVN0YXJ0U2VsZkludGVudCk7CisgICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5zdGFydEZvcmVncm91bmQobWVkaWFOb3RpZmljYXRpb24uZ2V0Tm90aWZpY2F0aW9uSWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYU5vdGlmaWNhdGlvbi5nZXROb3RpZmljYXRpb24oKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1lZGlhUGxheWVyQmFzZS5QTEFZRVJfU1RBVEVfSURMRToKKyAgICAgICAgICAgIGNhc2UgTWVkaWFQbGF5ZXJCYXNlLlBMQVlFUl9TVEFURV9FUlJPUjoKKyAgICAgICAgICAgICAgICBpZiAobUlzUnVubmluZ0ZvcmVncm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgbUlzUnVubmluZ0ZvcmVncm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnN0b3BGb3JlZ3JvdW5kKHRydWUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIG1Ob3RpZmljYXRpb25NYW5hZ2VyLm5vdGlmeShtZWRpYU5vdGlmaWNhdGlvbi5nZXROb3RpZmljYXRpb25JZCgpLAorICAgICAgICAgICAgICAgIG1lZGlhTm90aWZpY2F0aW9uLmdldE5vdGlmaWNhdGlvbigpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFNlc3Npb25TZXJ2aWNlRXZlbnRDYWxsYmFjayBleHRlbmRzIFBsYXllckV2ZW50Q2FsbGJhY2sgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25QbGF5ZXJTdGF0ZUNoYW5nZWQoTWVkaWFQbGF5ZXJCYXNlIHBsYXllciwgaW50IHN0YXRlKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdGhpcworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNZWRpYU5vdGlmaWNhdGlvbkltcGwgaW1wbGVtZW50cyBNZWRpYU5vdGlmaWNhdGlvblByb3ZpZGVyIHsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbU5vdGlmaWNhdGlvbklkOworICAgICAgICBwcml2YXRlIE5vdGlmaWNhdGlvbiBtTm90aWZpY2F0aW9uOworCisgICAgICAgIHB1YmxpYyBNZWRpYU5vdGlmaWNhdGlvbkltcGwoTWVkaWFOb3RpZmljYXRpb24gaW5zdGFuY2UsIGludCBub3RpZmljYXRpb25JZCwKKyAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisgICAgICAgICAgICBpZiAobm90aWZpY2F0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJub3RpZmljYXRpb24gc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Ob3RpZmljYXRpb25JZCA9IG5vdGlmaWNhdGlvbklkOworICAgICAgICAgICAgbU5vdGlmaWNhdGlvbiA9IG5vdGlmaWNhdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGdldE5vdGlmaWNhdGlvbklkX2ltcGwoKSB7CisgICAgICAgICAgICByZXR1cm4gbU5vdGlmaWNhdGlvbklkOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBOb3RpZmljYXRpb24gZ2V0Tm90aWZpY2F0aW9uX2ltcGwoKSB7CisgICAgICAgICAgICByZXR1cm4gbU5vdGlmaWNhdGlvbjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvUmF0aW5nMkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvUmF0aW5nMkltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTU4MTI5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9SYXRpbmcySW1wbC5qYXZhCkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuUmF0aW5nMi4qOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5SYXRpbmcyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuUmF0aW5nMi5TdHlsZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5SYXRpbmcyUHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworCitwdWJsaWMgZmluYWwgY2xhc3MgUmF0aW5nMkltcGwgaW1wbGVtZW50cyBSYXRpbmcyUHJvdmlkZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUmF0aW5nMiI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NUWUxFID0gImFuZHJvaWQubWVkaWEucmF0aW5nMi5zdHlsZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9WQUxVRSA9ICJhbmRyb2lkLm1lZGlhLnJhdGluZzIudmFsdWUiOworCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgZmxvYXQgUkFUSU5HX05PVF9SQVRFRCA9IC0xLjBmOworCisgICAgcHJpdmF0ZSBmaW5hbCBSYXRpbmcyIG1JbnN0YW5jZTsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtUmF0aW5nU3R5bGU7CisgICAgcHJpdmF0ZSBmaW5hbCBmbG9hdCBtUmF0aW5nVmFsdWU7CisKKyAgICBwcml2YXRlIFJhdGluZzJJbXBsKEBTdHlsZSBpbnQgcmF0aW5nU3R5bGUsIGZsb2F0IHJhdGluZykgeworICAgICAgICBtUmF0aW5nU3R5bGUgPSByYXRpbmdTdHlsZTsKKyAgICAgICAgbVJhdGluZ1ZhbHVlID0gcmF0aW5nOworICAgICAgICBtSW5zdGFuY2UgPSBuZXcgUmF0aW5nMih0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nX2ltcGwoKSB7CisgICAgICAgIHJldHVybiAiUmF0aW5nMjpzdHlsZT0iICsgbVJhdGluZ1N0eWxlICsgIiByYXRpbmc9IgorICAgICAgICAgICAgICAgICsgKG1SYXRpbmdWYWx1ZSA8IDAuMGYgPyAidW5yYXRlZCIgOiBTdHJpbmcudmFsdWVPZihtUmF0aW5nVmFsdWUpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHNfaW1wbChPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFJhdGluZzIpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgUmF0aW5nMkltcGwgb3RoZXIgPSAoUmF0aW5nMkltcGwpICgoUmF0aW5nMikgb2JqKS5nZXRQcm92aWRlcigpOworICAgICAgICByZXR1cm4gbVJhdGluZ1N0eWxlID09IG90aGVyLm1SYXRpbmdTdHlsZQorICAgICAgICAgICAgICAgICYmIG1SYXRpbmdWYWx1ZSA9PSBvdGhlci5tUmF0aW5nVmFsdWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZV9pbXBsKCkgeworICAgICAgICByZXR1cm4gT2JqZWN0cy5oYXNoKG1SYXRpbmdTdHlsZSwgbVJhdGluZ1ZhbHVlKTsKKyAgICB9CisKKyAgICBSYXRpbmcyIGdldEluc3RhbmNlKCkgeworICAgICAgICByZXR1cm4gbUluc3RhbmNlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUmF0aW5nMiBmcm9tQnVuZGxlX2ltcGwoQnVuZGxlIGJ1bmRsZSkgeworICAgICAgICBpZiAoYnVuZGxlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgUmF0aW5nMkltcGwoYnVuZGxlLmdldEludChLRVlfU1RZTEUpLCBidW5kbGUuZ2V0RmxvYXQoS0VZX1ZBTFVFKSkuZ2V0SW5zdGFuY2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVuZGxlIHRvQnVuZGxlX2ltcGwoKSB7CisgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIGJ1bmRsZS5wdXRJbnQoS0VZX1NUWUxFLCBtUmF0aW5nU3R5bGUpOworICAgICAgICBidW5kbGUucHV0RmxvYXQoS0VZX1ZBTFVFLCBtUmF0aW5nVmFsdWUpOworICAgICAgICByZXR1cm4gYnVuZGxlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUmF0aW5nMiBuZXdVbnJhdGVkUmF0aW5nX2ltcGwoQFN0eWxlIGludCByYXRpbmdTdHlsZSkgeworICAgICAgICBzd2l0Y2gocmF0aW5nU3R5bGUpIHsKKyAgICAgICAgICAgIGNhc2UgUkFUSU5HX0hFQVJUOgorICAgICAgICAgICAgY2FzZSBSQVRJTkdfVEhVTUJfVVBfRE9XTjoKKyAgICAgICAgICAgIGNhc2UgUkFUSU5HXzNfU1RBUlM6CisgICAgICAgICAgICBjYXNlIFJBVElOR180X1NUQVJTOgorICAgICAgICAgICAgY2FzZSBSQVRJTkdfNV9TVEFSUzoKKyAgICAgICAgICAgIGNhc2UgUkFUSU5HX1BFUkNFTlRBR0U6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSYXRpbmcySW1wbChyYXRpbmdTdHlsZSwgUkFUSU5HX05PVF9SQVRFRCkuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFJhdGluZzIgbmV3SGVhcnRSYXRpbmdfaW1wbChib29sZWFuIGhhc0hlYXJ0KSB7CisgICAgICAgIHJldHVybiBuZXcgUmF0aW5nMkltcGwoUkFUSU5HX0hFQVJULCBoYXNIZWFydCA/IDEuMGYgOiAwLjBmKS5nZXRJbnN0YW5jZSgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUmF0aW5nMiBuZXdUaHVtYlJhdGluZ19pbXBsKGJvb2xlYW4gdGh1bWJJc1VwKSB7CisgICAgICAgIHJldHVybiBuZXcgUmF0aW5nMkltcGwoUkFUSU5HX1RIVU1CX1VQX0RPV04sIHRodW1iSXNVcCA/IDEuMGYgOiAwLjBmKS5nZXRJbnN0YW5jZSgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUmF0aW5nMiBuZXdTdGFyUmF0aW5nX2ltcGwoaW50IHN0YXJSYXRpbmdTdHlsZSwgZmxvYXQgc3RhclJhdGluZykgeworICAgICAgICBmbG9hdCBtYXhSYXRpbmcgPSBSQVRJTkdfTk9UX1JBVEVEOworICAgICAgICBzd2l0Y2goc3RhclJhdGluZ1N0eWxlKSB7CisgICAgICAgICAgICBjYXNlIFJBVElOR18zX1NUQVJTOgorICAgICAgICAgICAgICAgIG1heFJhdGluZyA9IDMuMGY7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJBVElOR180X1NUQVJTOgorICAgICAgICAgICAgICAgIG1heFJhdGluZyA9IDQuMGY7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJBVElOR181X1NUQVJTOgorICAgICAgICAgICAgICAgIG1heFJhdGluZyA9IDUuMGY7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkludmFsaWQgcmF0aW5nIHN0eWxlICgiICsgc3RhclJhdGluZ1N0eWxlICsgIikgZm9yIGEgc3RhciByYXRpbmciKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHN0YXJSYXRpbmcgPCAwLjBmKSB8fCAoc3RhclJhdGluZyA+IG1heFJhdGluZykpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIlRyeWluZyB0byBzZXQgb3V0IG9mIHJhbmdlIHN0YXItYmFzZWQgcmF0aW5nIik7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IFJhdGluZzJJbXBsKHN0YXJSYXRpbmdTdHlsZSwgc3RhclJhdGluZykuZ2V0SW5zdGFuY2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFJhdGluZzIgbmV3UGVyY2VudGFnZVJhdGluZ19pbXBsKGZsb2F0IHBlcmNlbnQpIHsKKyAgICAgICAgaWYgKChwZXJjZW50IDwgMC4wZikgfHwgKHBlcmNlbnQgPiAxMDAuMGYpKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJJbnZhbGlkIHBlcmNlbnRhZ2UtYmFzZWQgcmF0aW5nIHZhbHVlIik7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmF0aW5nMkltcGwoUkFUSU5HX1BFUkNFTlRBR0UsIHBlcmNlbnQpLmdldEluc3RhbmNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JhdGVkX2ltcGwoKSB7CisgICAgICAgIHJldHVybiBtUmF0aW5nVmFsdWUgPj0gMC4wZjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldFJhdGluZ1N0eWxlX2ltcGwoKSB7CisgICAgICAgIHJldHVybiBtUmF0aW5nU3R5bGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaGFzSGVhcnRfaW1wbCgpIHsKKyAgICAgICAgaWYgKG1SYXRpbmdTdHlsZSAhPSBSQVRJTkdfSEVBUlQpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAobVJhdGluZ1ZhbHVlID09IDEuMGYpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNUaHVtYlVwX2ltcGwoKSB7CisgICAgICAgIGlmIChtUmF0aW5nU3R5bGUgIT0gUkFUSU5HX1RIVU1CX1VQX0RPV04pIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAobVJhdGluZ1ZhbHVlID09IDEuMGYpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZsb2F0IGdldFN0YXJSYXRpbmdfaW1wbCgpIHsKKyAgICAgICAgc3dpdGNoIChtUmF0aW5nU3R5bGUpIHsKKyAgICAgICAgICAgIGNhc2UgUkFUSU5HXzNfU1RBUlM6CisgICAgICAgICAgICBjYXNlIFJBVElOR180X1NUQVJTOgorICAgICAgICAgICAgY2FzZSBSQVRJTkdfNV9TVEFSUzoKKyAgICAgICAgICAgICAgICBpZiAobUluc3RhbmNlLmlzUmF0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbVJhdGluZ1ZhbHVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xLjBmOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZsb2F0IGdldFBlcmNlbnRSYXRpbmdfaW1wbCgpIHsKKyAgICAgICAgaWYgKChtUmF0aW5nU3R5bGUgIT0gUkFUSU5HX1BFUkNFTlRBR0UpIHx8ICFtSW5zdGFuY2UuaXNSYXRlZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gLTEuMGY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbVJhdGluZ1ZhbHVlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9Sb3V0ZVBsYXllci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9Sb3V0ZVBsYXllci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NTBkMzQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1JvdXRlUGxheWVyLmphdmEKQEAgLTAsMCArMSwxNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkRhdGFTb3VyY2VEZXNjOworaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb247CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLlBsYXliYWNrU3RhdGU7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uUmVxdWlyZXNBcGk7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhSXRlbVN0YXR1czsKK2ltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFTZXNzaW9uU3RhdHVzOworaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuUmVtb3RlUGxheWJhY2tDbGllbnQ7CitpbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5SZW1vdGVQbGF5YmFja0NsaWVudC5JdGVtQWN0aW9uQ2FsbGJhY2s7CitpbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5SZW1vdGVQbGF5YmFja0NsaWVudC5TZXNzaW9uQWN0aW9uQ2FsbGJhY2s7CitpbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5SZW1vdGVQbGF5YmFja0NsaWVudC5TdGF0dXNDYWxsYmFjazsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK0BSZXF1aXJlc0FwaShhcGkgPSBCdWlsZC5WRVJTSU9OX0NPREVTLkxPTExJUE9QKQorcHVibGljIGNsYXNzIFJvdXRlUGxheWVyIGV4dGVuZHMgTWVkaWFTZXNzaW9uLkNhbGxiYWNrIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgUExBWUJBQ0tfQUNUSU9OUyA9IFBsYXliYWNrU3RhdGUuQUNUSU9OX1BBVVNFCisgICAgICAgICAgICB8IFBsYXliYWNrU3RhdGUuQUNUSU9OX1BMQVkgfCBQbGF5YmFja1N0YXRlLkFDVElPTl9TRUVLX1RPCisgICAgICAgICAgICB8IFBsYXliYWNrU3RhdGUuQUNUSU9OX0ZBU1RfRk9SV0FSRCB8IFBsYXliYWNrU3RhdGUuQUNUSU9OX1JFV0lORDsKKworICAgIHByaXZhdGUgUmVtb3RlUGxheWJhY2tDbGllbnQgbUNsaWVudDsKKyAgICBwcml2YXRlIFN0cmluZyBtU2Vzc2lvbklkOworICAgIHByaXZhdGUgU3RyaW5nIG1JdGVtSWQ7CisgICAgcHJpdmF0ZSBQbGF5ZXJFdmVudENhbGxiYWNrIG1DYWxsYmFjazsKKworICAgIHByaXZhdGUgU3RhdHVzQ2FsbGJhY2sgbVN0YXR1c0NhbGxiYWNrID0gbmV3IFN0YXR1c0NhbGxiYWNrKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25JdGVtU3RhdHVzQ2hhbmdlZChCdW5kbGUgZGF0YSwKKyAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cywKKyAgICAgICAgICAgICAgICBTdHJpbmcgaXRlbUlkLCBNZWRpYUl0ZW1TdGF0dXMgaXRlbVN0YXR1cykgeworICAgICAgICAgICAgdXBkYXRlU2Vzc2lvblN0YXR1cyhzZXNzaW9uSWQsIHNlc3Npb25TdGF0dXMpOworICAgICAgICAgICAgdXBkYXRlSXRlbVN0YXR1cyhpdGVtSWQsIGl0ZW1TdGF0dXMpOworICAgICAgICB9CisgICAgfTsKKworICAgIHB1YmxpYyBSb3V0ZVBsYXllcihDb250ZXh0IGNvbnRleHQsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgeworICAgICAgICBtQ2xpZW50ID0gbmV3IFJlbW90ZVBsYXliYWNrQ2xpZW50KGNvbnRleHQsIHJvdXRlKTsKKyAgICAgICAgbUNsaWVudC5zZXRTdGF0dXNDYWxsYmFjayhtU3RhdHVzQ2FsbGJhY2spOworICAgICAgICBtQ2xpZW50LnN0YXJ0U2Vzc2lvbihudWxsLCBuZXcgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMpIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVTZXNzaW9uU3RhdHVzKHNlc3Npb25JZCwgc2Vzc2lvblN0YXR1cyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uUGxheSgpIHsKKyAgICAgICAgbUNsaWVudC5yZXN1bWUobnVsbCwgbmV3IFNlc3Npb25BY3Rpb25DYWxsYmFjaygpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEsCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgdXBkYXRlU2Vzc2lvblN0YXR1cyhzZXNzaW9uSWQsIHNlc3Npb25TdGF0dXMpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblBhdXNlKCkgeworICAgICAgICBtQ2xpZW50LnBhdXNlKG51bGwsIG5ldyBTZXNzaW9uQWN0aW9uQ2FsbGJhY2soKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhLAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cykgeworICAgICAgICAgICAgICAgIHVwZGF0ZVNlc3Npb25TdGF0dXMoc2Vzc2lvbklkLCBzZXNzaW9uU3RhdHVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TZWVrVG8obG9uZyBwb3MpIHsKKyAgICAgICAgbUNsaWVudC5zZWVrKG1JdGVtSWQsIHBvcywgbnVsbCwgbmV3IEl0ZW1BY3Rpb25DYWxsYmFjaygpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEsCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaXRlbUlkLCBNZWRpYUl0ZW1TdGF0dXMgaXRlbVN0YXR1cykgeworICAgICAgICAgICAgICAgIHVwZGF0ZVNlc3Npb25TdGF0dXMoc2Vzc2lvbklkLCBzZXNzaW9uU3RhdHVzKTsKKyAgICAgICAgICAgICAgICB1cGRhdGVJdGVtU3RhdHVzKGl0ZW1JZCwgaXRlbVN0YXR1cyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKKyAgICAgICAgbUNsaWVudC5zdG9wKG51bGwsIG5ldyBTZXNzaW9uQWN0aW9uQ2FsbGJhY2soKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhLAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cykgeworICAgICAgICAgICAgICAgIHVwZGF0ZVNlc3Npb25TdGF0dXMoc2Vzc2lvbklkLCBzZXNzaW9uU3RhdHVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UGxheWVyRXZlbnRDYWxsYmFjayhQbGF5ZXJFdmVudENhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9wZW5WaWRlbyhEYXRhU291cmNlRGVzYyBkc2QpIHsKKyAgICAgICAgbUNsaWVudC5wbGF5KGRzZC5nZXRVcmkoKSwgInZpZGVvL21wNCIsIG51bGwsIDAsIG51bGwsIG5ldyBJdGVtQWN0aW9uQ2FsbGJhY2soKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhLAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGl0ZW1JZCwgTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMpIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVTZXNzaW9uU3RhdHVzKHNlc3Npb25JZCwgc2Vzc2lvblN0YXR1cyk7CisgICAgICAgICAgICAgICAgdXBkYXRlSXRlbVN0YXR1cyhpdGVtSWQsIGl0ZW1TdGF0dXMpOworICAgICAgICAgICAgICAgIHBsYXlJbnRlcm5hbChkc2QuZ2V0VXJpKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlKCkgeworICAgICAgICBpZiAobUNsaWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ2xpZW50LnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1DbGllbnQgPSBudWxsOworICAgICAgICB9CisgICAgICAgIGlmIChtQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgbUNhbGxiYWNrID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwbGF5SW50ZXJuYWwoVXJpIHVyaSkgeworICAgICAgICBtQ2xpZW50LnBsYXkodXJpLCAidmlkZW8vbXA0IiwgbnVsbCwgMCwgbnVsbCwgbmV3IEl0ZW1BY3Rpb25DYWxsYmFjaygpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEsCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaXRlbUlkLCBNZWRpYUl0ZW1TdGF0dXMgaXRlbVN0YXR1cykgeworICAgICAgICAgICAgICAgIHVwZGF0ZVNlc3Npb25TdGF0dXMoc2Vzc2lvbklkLCBzZXNzaW9uU3RhdHVzKTsKKyAgICAgICAgICAgICAgICB1cGRhdGVJdGVtU3RhdHVzKGl0ZW1JZCwgaXRlbVN0YXR1cyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTZXNzaW9uU3RhdHVzKFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzKSB7CisgICAgICAgIG1TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUl0ZW1TdGF0dXMoU3RyaW5nIGl0ZW1JZCwgTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMpIHsKKyAgICAgICAgbUl0ZW1JZCA9IGl0ZW1JZDsKKyAgICAgICAgaWYgKGl0ZW1TdGF0dXMgPT0gbnVsbCB8fCBtQ2FsbGJhY2sgPT0gbnVsbCkgcmV0dXJuOworICAgICAgICBtQ2FsbGJhY2sub25QbGF5ZXJTdGF0ZUNoYW5nZWQoaXRlbVN0YXR1cyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBQbGF5ZXJFdmVudENhbGxiYWNrIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25QbGF5ZXJTdGF0ZUNoYW5nZWQoTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMpIHsgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvU2Vzc2lvblBsYXlsaXN0QWdlbnQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvU2Vzc2lvblBsYXlsaXN0QWdlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzU3MGFhCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9TZXNzaW9uUGxheWxpc3RBZ2VudC5qYXZhCkBAIC0wLDAgKzEsNDk0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuRGF0YVNvdXJjZURlc2M7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllckJhc2U7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllckJhc2UuUGxheWVyRXZlbnRDYWxsYmFjazsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWxpc3RBZ2VudDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuT25EYXRhU291cmNlTWlzc2luZ0hlbHBlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXJyYXlNYXA7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hbm5vdGF0aW9ucy5HdWFyZGVkQnk7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZExvY2FsUmFuZG9tOworCitwdWJsaWMgY2xhc3MgU2Vzc2lvblBsYXlsaXN0QWdlbnQgZXh0ZW5kcyBNZWRpYVBsYXlsaXN0QWdlbnQgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU2Vzc2lvblBsYXlsaXN0QWdlbnQiOworICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHN0YXRpYyBmaW5hbCBpbnQgRU5EX09GX1BMQVlMSVNUID0gLTE7CisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgc3RhdGljIGZpbmFsIGludCBOT19WQUxJRF9JVEVNUyA9IC0yOworCisgICAgcHJpdmF0ZSBmaW5hbCBQbGF5SXRlbSBtRW9wUGxheUl0ZW0gPSBuZXcgUGxheUl0ZW0oRU5EX09GX1BMQVlMSVNULCBudWxsKTsKKworICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOworICAgIHByaXZhdGUgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgbVNlc3Npb25JbXBsOworICAgIHByaXZhdGUgZmluYWwgTXlQbGF5ZXJFdmVudENhbGxiYWNrIG1QbGF5ZXJDYWxsYmFjazsKKworICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKKyAgICBwcml2YXRlIE1lZGlhUGxheWVyQmFzZSBtUGxheWVyOworICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKKyAgICBwcml2YXRlIE9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXIgbURzbUhlbHBlcjsKKyAgICAvLyBUT0RPOiBDaGVjayBpZiBoYXZpbmcgdGhlIHNhbWUgaXRlbSBpcyBva2F5IChiLzc0MDkwNzQxKQorICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKKyAgICBwcml2YXRlIEFycmF5TGlzdDxNZWRpYUl0ZW0yPiBtUGxheWxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8TWVkaWFJdGVtMj4gbVNodWZmbGVkTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKKyAgICBwcml2YXRlIE1hcDxNZWRpYUl0ZW0yLCBEYXRhU291cmNlRGVzYz4gbUl0ZW1Ec2RNYXAgPSBuZXcgQXJyYXlNYXA8PigpOworICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKKyAgICBwcml2YXRlIE1lZGlhTWV0YWRhdGEyIG1NZXRhZGF0YTsKKyAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCisgICAgcHJpdmF0ZSBpbnQgbVJlcGVhdE1vZGU7CisgICAgQEd1YXJkZWRCeSgibUxvY2siKQorICAgIHByaXZhdGUgaW50IG1TaHVmZmxlTW9kZTsKKyAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCisgICAgcHJpdmF0ZSBQbGF5SXRlbSBtQ3VycmVudDsKKworICAgIC8vIENhbGxlZCBvbiBzZXNzaW9uIGNhbGxiYWNrIGV4ZWN1dG9yLgorICAgIHByaXZhdGUgY2xhc3MgTXlQbGF5ZXJFdmVudENhbGxiYWNrIGV4dGVuZHMgUGxheWVyRXZlbnRDYWxsYmFjayB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ3VycmVudERhdGFTb3VyY2VDaGFuZ2VkKEBOb25OdWxsIE1lZGlhUGxheWVyQmFzZSBtcGIsCisgICAgICAgICAgICAgICAgQE51bGxhYmxlIERhdGFTb3VyY2VEZXNjIGRzZCkgeworICAgICAgICAgICAgaWYgKG1QbGF5ZXIgIT0gbXBiKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgICAgIGlmIChkc2QgPT0gbnVsbCAmJiBtQ3VycmVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50ID0gZ2V0TmV4dFZhbGlkUGxheUl0ZW1Mb2NrZWQobUN1cnJlbnQuc2h1ZmZsZWRJZHgsIDEpOworICAgICAgICAgICAgICAgICAgICB1cGRhdGVDdXJyZW50SWZOZWVkZWRMb2NrZWQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFBsYXlJdGVtIHsKKyAgICAgICAgaW50IHNodWZmbGVkSWR4OworICAgICAgICBEYXRhU291cmNlRGVzYyBkc2Q7CisgICAgICAgIE1lZGlhSXRlbTIgbWVkaWFJdGVtOworCisgICAgICAgIFBsYXlJdGVtKGludCBzaHVmZmxlZElkeCkgeworICAgICAgICAgICAgdGhpcyhzaHVmZmxlZElkeCwgbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBQbGF5SXRlbShpbnQgc2h1ZmZsZWRJZHgsIERhdGFTb3VyY2VEZXNjIGRzZCkgeworICAgICAgICAgICAgdGhpcy5zaHVmZmxlZElkeCA9IHNodWZmbGVkSWR4OworICAgICAgICAgICAgaWYgKHNodWZmbGVkSWR4ID49IDApIHsKKyAgICAgICAgICAgICAgICB0aGlzLm1lZGlhSXRlbSA9IG1TaHVmZmxlZExpc3QuZ2V0KHNodWZmbGVkSWR4KTsKKyAgICAgICAgICAgICAgICBpZiAoZHNkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kc2QgPSByZXRyaWV2ZURhdGFTb3VyY2VEZXNjTG9ja2VkKHRoaXMubWVkaWFJdGVtKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuZHNkID0gZHNkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gaXNWYWxpZCgpIHsKKyAgICAgICAgICAgIGlmICh0aGlzID09IG1Fb3BQbGF5SXRlbSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1lZGlhSXRlbSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGRzZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNodWZmbGVkSWR4ID49IG1TaHVmZmxlZExpc3Quc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1lZGlhSXRlbSAhPSBtU2h1ZmZsZWRMaXN0LmdldChzaHVmZmxlZElkeCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWVkaWFJdGVtLmdldERhdGFTb3VyY2VEZXNjKCkgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAmJiAhbWVkaWFJdGVtLmdldERhdGFTb3VyY2VEZXNjKCkuZXF1YWxzKGRzZCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTZXNzaW9uUGxheWxpc3RBZ2VudChATm9uTnVsbCBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uSW1wbCwKKyAgICAgICAgICAgIEBOb25OdWxsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIpIHsKKyAgICAgICAgaWYgKHNlc3Npb25JbXBsID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlc3Npb25JbXBsIHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBsYXllciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwbGF5ZXIgc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBtU2Vzc2lvbkltcGwgPSBzZXNzaW9uSW1wbDsKKyAgICAgICAgbVBsYXllciA9IHBsYXllcjsKKyAgICAgICAgbVBsYXllckNhbGxiYWNrID0gbmV3IE15UGxheWVyRXZlbnRDYWxsYmFjaygpOworICAgICAgICBtUGxheWVyLnJlZ2lzdGVyUGxheWVyRXZlbnRDYWxsYmFjayhtU2Vzc2lvbkltcGwuZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLCBtUGxheWVyQ2FsbGJhY2spOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBsYXllcihATm9uTnVsbCBNZWRpYVBsYXllckJhc2UgcGxheWVyKSB7CisgICAgICAgIGlmIChwbGF5ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGxheWVyIHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgaWYgKHBsYXllciA9PSBtUGxheWVyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVBsYXllci51bnJlZ2lzdGVyUGxheWVyRXZlbnRDYWxsYmFjayhtUGxheWVyQ2FsbGJhY2spOworICAgICAgICAgICAgbVBsYXllciA9IHBsYXllcjsKKyAgICAgICAgICAgIG1QbGF5ZXIucmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKAorICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbkltcGwuZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLCBtUGxheWVyQ2FsbGJhY2spOworICAgICAgICAgICAgdXBkYXRlUGxheWVyRGF0YVNvdXJjZUxvY2tlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0T25EYXRhU291cmNlTWlzc2luZ0hlbHBlcihPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyIGhlbHBlcikgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBtRHNtSGVscGVyID0gaGVscGVyOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYXJPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBtRHNtSGVscGVyID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBATnVsbGFibGUgTGlzdDxNZWRpYUl0ZW0yPiBnZXRQbGF5bGlzdCgpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QobVBsYXlsaXN0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFBsYXlsaXN0KEBOb25OdWxsIExpc3Q8TWVkaWFJdGVtMj4gbGlzdCwgQE51bGxhYmxlIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7CisgICAgICAgIGlmIChsaXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImxpc3Qgc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgfQorCisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIG1JdGVtRHNkTWFwLmNsZWFyKCk7CisKKyAgICAgICAgICAgIG1QbGF5bGlzdC5jbGVhcigpOworICAgICAgICAgICAgbVBsYXlsaXN0LmFkZEFsbChsaXN0KTsKKyAgICAgICAgICAgIGFwcGx5U2h1ZmZsZU1vZGVMb2NrZWQoKTsKKworICAgICAgICAgICAgbU1ldGFkYXRhID0gbWV0YWRhdGE7CisgICAgICAgICAgICBtQ3VycmVudCA9IGdldE5leHRWYWxpZFBsYXlJdGVtTG9ja2VkKEVORF9PRl9QTEFZTElTVCwgMSk7CisgICAgICAgICAgICB1cGRhdGVQbGF5ZXJEYXRhU291cmNlTG9ja2VkKCk7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UGxheWxpc3RDaGFuZ2VkKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhMiBnZXRQbGF5bGlzdE1ldGFkYXRhKCkgeworICAgICAgICByZXR1cm4gbU1ldGFkYXRhOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVBsYXlsaXN0TWV0YWRhdGEoQE51bGxhYmxlIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIGlmIChtZXRhZGF0YSA9PSBtTWV0YWRhdGEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtTWV0YWRhdGEgPSBtZXRhZGF0YTsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFkZFBsYXlsaXN0SXRlbShpbnQgaW5kZXgsIEBOb25OdWxsIE1lZGlhSXRlbTIgaXRlbSkgeworICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtIHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgaW5kZXggPSBjbGFtcChpbmRleCwgbVBsYXlsaXN0LnNpemUoKSk7CisgICAgICAgICAgICBpbnQgc2h1ZmZsZWRJZHggPSBpbmRleDsKKyAgICAgICAgICAgIG1QbGF5bGlzdC5hZGQoaW5kZXgsIGl0ZW0pOworICAgICAgICAgICAgaWYgKG1TaHVmZmxlTW9kZSA9PSBNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBtU2h1ZmZsZWRMaXN0LmFkZChpbmRleCwgaXRlbSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgaXRlbSBpbiByYW5kb20gcG9zaXRpb24gb2YgbVNodWZmbGVkTGlzdC4KKyAgICAgICAgICAgICAgICBzaHVmZmxlZElkeCA9IFRocmVhZExvY2FsUmFuZG9tLmN1cnJlbnQoKS5uZXh0SW50KG1TaHVmZmxlZExpc3Quc2l6ZSgpICsgMSk7CisgICAgICAgICAgICAgICAgbVNodWZmbGVkTGlzdC5hZGQoc2h1ZmZsZWRJZHgsIGl0ZW0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFoYXNWYWxpZEl0ZW0oKSkgeworICAgICAgICAgICAgICAgIG1DdXJyZW50ID0gZ2V0TmV4dFZhbGlkUGxheUl0ZW1Mb2NrZWQoRU5EX09GX1BMQVlMSVNULCAxKTsKKyAgICAgICAgICAgICAgICB1cGRhdGVQbGF5ZXJEYXRhU291cmNlTG9ja2VkKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHVwZGF0ZUN1cnJlbnRJZk5lZWRlZExvY2tlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG5vdGlmeVBsYXlsaXN0Q2hhbmdlZCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBsYXlsaXN0SXRlbShATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKKyAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbSBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIGlmICghbVBsYXlsaXN0LnJlbW92ZShpdGVtKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TaHVmZmxlZExpc3QucmVtb3ZlKGl0ZW0pOworICAgICAgICAgICAgbUl0ZW1Ec2RNYXAucmVtb3ZlKGl0ZW0pOworICAgICAgICAgICAgdXBkYXRlQ3VycmVudElmTmVlZGVkTG9ja2VkKCk7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UGxheWxpc3RDaGFuZ2VkKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVwbGFjZVBsYXlsaXN0SXRlbShpbnQgaW5kZXgsIEBOb25OdWxsIE1lZGlhSXRlbTIgaXRlbSkgeworICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtIHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgaWYgKG1QbGF5bGlzdC5zaXplKCkgPD0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluZGV4ID0gY2xhbXAoaW5kZXgsIG1QbGF5bGlzdC5zaXplKCkgLSAxKTsKKyAgICAgICAgICAgIGludCBzaHVmZmxlZElkeCA9IG1TaHVmZmxlZExpc3QuaW5kZXhPZihtUGxheWxpc3QuZ2V0KGluZGV4KSk7CisgICAgICAgICAgICBtSXRlbURzZE1hcC5yZW1vdmUobVNodWZmbGVkTGlzdC5nZXQoc2h1ZmZsZWRJZHgpKTsKKyAgICAgICAgICAgIG1TaHVmZmxlZExpc3Quc2V0KHNodWZmbGVkSWR4LCBpdGVtKTsKKyAgICAgICAgICAgIG1QbGF5bGlzdC5zZXQoaW5kZXgsIGl0ZW0pOworICAgICAgICAgICAgaWYgKCFoYXNWYWxpZEl0ZW0oKSkgeworICAgICAgICAgICAgICAgIG1DdXJyZW50ID0gZ2V0TmV4dFZhbGlkUGxheUl0ZW1Mb2NrZWQoRU5EX09GX1BMQVlMSVNULCAxKTsKKyAgICAgICAgICAgICAgICB1cGRhdGVQbGF5ZXJEYXRhU291cmNlTG9ja2VkKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHVwZGF0ZUN1cnJlbnRJZk5lZWRlZExvY2tlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG5vdGlmeVBsYXlsaXN0Q2hhbmdlZCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNraXBUb1BsYXlsaXN0SXRlbShATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKKyAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbSBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIGlmICghaGFzVmFsaWRJdGVtKCkgfHwgaXRlbS5lcXVhbHMobUN1cnJlbnQubWVkaWFJdGVtKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBzaHVmZmxlZElkeCA9IG1TaHVmZmxlZExpc3QuaW5kZXhPZihpdGVtKTsKKyAgICAgICAgICAgIGlmIChzaHVmZmxlZElkeCA8IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ3VycmVudCA9IG5ldyBQbGF5SXRlbShzaHVmZmxlZElkeCk7CisgICAgICAgICAgICB1cGRhdGVDdXJyZW50SWZOZWVkZWRMb2NrZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNraXBUb1ByZXZpb3VzSXRlbSgpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgaWYgKCFoYXNWYWxpZEl0ZW0oKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFBsYXlJdGVtIHByZXYgPSBnZXROZXh0VmFsaWRQbGF5SXRlbUxvY2tlZChtQ3VycmVudC5zaHVmZmxlZElkeCwgLTEpOworICAgICAgICAgICAgaWYgKHByZXYgIT0gbUVvcFBsYXlJdGVtKSB7CisgICAgICAgICAgICAgICAgbUN1cnJlbnQgPSBwcmV2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgdXBkYXRlQ3VycmVudElmTmVlZGVkTG9ja2VkKCk7CisgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNraXBUb05leHRJdGVtKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBpZiAoIWhhc1ZhbGlkSXRlbSgpIHx8IG1DdXJyZW50ID09IG1Fb3BQbGF5SXRlbSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFBsYXlJdGVtIG5leHQgPSBnZXROZXh0VmFsaWRQbGF5SXRlbUxvY2tlZChtQ3VycmVudC5zaHVmZmxlZElkeCwgMSk7CisgICAgICAgICAgICBpZiAobmV4dCAhPSBtRW9wUGxheUl0ZW0pIHsKKyAgICAgICAgICAgICAgICBtQ3VycmVudCA9IG5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1cGRhdGVDdXJyZW50SWZOZWVkZWRMb2NrZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0UmVwZWF0TW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIG1SZXBlYXRNb2RlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFJlcGVhdE1vZGUoaW50IHJlcGVhdE1vZGUpIHsKKyAgICAgICAgaWYgKHJlcGVhdE1vZGUgPCBNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfTk9ORQorICAgICAgICAgICAgICAgIHx8IHJlcGVhdE1vZGUgPiBNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfR1JPVVApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBpZiAobVJlcGVhdE1vZGUgPT0gcmVwZWF0TW9kZSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1SZXBlYXRNb2RlID0gcmVwZWF0TW9kZTsKKyAgICAgICAgICAgIHN3aXRjaCAocmVwZWF0TW9kZSkgeworICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX09ORToKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50ICE9IG51bGwgJiYgbUN1cnJlbnQgIT0gbUVvcFBsYXlJdGVtKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtUGxheWVyLmxvb3BDdXJyZW50KHRydWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX0FMTDoKKyAgICAgICAgICAgICAgICBjYXNlIE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9HUk9VUDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50ID09IG1Fb3BQbGF5SXRlbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnQgPSBnZXROZXh0VmFsaWRQbGF5SXRlbUxvY2tlZChFTkRfT0ZfUExBWUxJU1QsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlUGxheWVyRGF0YVNvdXJjZUxvY2tlZCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIHBhc3MgdGhyb3VnaAorICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX05PTkU6CisgICAgICAgICAgICAgICAgICAgIG1QbGF5ZXIubG9vcEN1cnJlbnQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBub3RpZnlSZXBlYXRNb2RlQ2hhbmdlZCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0U2h1ZmZsZU1vZGUoKSB7CisgICAgICAgIHJldHVybiBtU2h1ZmZsZU1vZGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0U2h1ZmZsZU1vZGUoaW50IHNodWZmbGVNb2RlKSB7CisgICAgICAgIGlmIChzaHVmZmxlTW9kZSA8IE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfTk9ORQorICAgICAgICAgICAgICAgIHx8IHNodWZmbGVNb2RlID4gTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9HUk9VUCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIGlmIChtU2h1ZmZsZU1vZGUgPT0gc2h1ZmZsZU1vZGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU2h1ZmZsZU1vZGUgPSBzaHVmZmxlTW9kZTsKKyAgICAgICAgICAgIGFwcGx5U2h1ZmZsZU1vZGVMb2NrZWQoKTsKKyAgICAgICAgICAgIHVwZGF0ZUN1cnJlbnRJZk5lZWRlZExvY2tlZCgpOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVNodWZmbGVNb2RlQ2hhbmdlZCgpOworICAgIH0KKworICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIGludCBnZXRDdXJTaHVmZmxlZEluZGV4KCkgeworICAgICAgICByZXR1cm4gaGFzVmFsaWRJdGVtKCkgPyBtQ3VycmVudC5zaHVmZmxlZElkeCA6IE5PX1ZBTElEX0lURU1TOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBoYXNWYWxpZEl0ZW0oKSB7CisgICAgICAgIHJldHVybiBtQ3VycmVudCAhPSBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgRGF0YVNvdXJjZURlc2MgcmV0cmlldmVEYXRhU291cmNlRGVzY0xvY2tlZChNZWRpYUl0ZW0yIGl0ZW0pIHsKKyAgICAgICAgRGF0YVNvdXJjZURlc2MgZHNkID0gaXRlbS5nZXREYXRhU291cmNlRGVzYygpOworICAgICAgICBpZiAoZHNkICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1JdGVtRHNkTWFwLnB1dChpdGVtLCBkc2QpOworICAgICAgICAgICAgcmV0dXJuIGRzZDsKKyAgICAgICAgfQorICAgICAgICBkc2QgPSBtSXRlbURzZE1hcC5nZXQoaXRlbSk7CisgICAgICAgIGlmIChkc2QgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGRzZDsKKyAgICAgICAgfQorICAgICAgICBPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyIGhlbHBlciA9IG1Ec21IZWxwZXI7CisgICAgICAgIGlmIChoZWxwZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gVE9ETzogRG8gbm90IGNhbGwgb25EYXRhU291cmNlTWlzc2luZyB3aXRoIHRoZSBsb2NrIChiLzc0MDkwNzQxKS4KKyAgICAgICAgICAgIGRzZCA9IGhlbHBlci5vbkRhdGFTb3VyY2VNaXNzaW5nKG1TZXNzaW9uSW1wbC5nZXRJbnN0YW5jZSgpLCBpdGVtKTsKKyAgICAgICAgICAgIGlmIChkc2QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1JdGVtRHNkTWFwLnB1dChpdGVtLCBkc2QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBkc2Q7CisgICAgfQorCisgICAgLy8gVE9ETzogY29uc2lkZXIgdG8gY2FsbCB1cGRhdGVDdXJyZW50SWZOZWVkZWRMb2NrZWQgaW5zaWRlIChiLzc0MDkwNzQxKQorICAgIHByaXZhdGUgUGxheUl0ZW0gZ2V0TmV4dFZhbGlkUGxheUl0ZW1Mb2NrZWQoaW50IGN1clNodWZmbGVkSWR4LCBpbnQgZGlyZWN0aW9uKSB7CisgICAgICAgIGludCBzaXplID0gbVBsYXlsaXN0LnNpemUoKTsKKyAgICAgICAgaWYgKGN1clNodWZmbGVkSWR4ID09IEVORF9PRl9QTEFZTElTVCkgeworICAgICAgICAgICAgY3VyU2h1ZmZsZWRJZHggPSAoZGlyZWN0aW9uID4gMCkgPyAtMSA6IHNpemU7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIGN1clNodWZmbGVkSWR4ICs9IGRpcmVjdGlvbjsKKyAgICAgICAgICAgIGlmIChjdXJTaHVmZmxlZElkeCA8IDAgfHwgY3VyU2h1ZmZsZWRJZHggPj0gbVBsYXlsaXN0LnNpemUoKSkgeworICAgICAgICAgICAgICAgIGlmIChtUmVwZWF0TW9kZSA9PSBSRVBFQVRfTU9ERV9OT05FKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoaSA9PSBzaXplIC0gMSkgPyBudWxsIDogbUVvcFBsYXlJdGVtOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGN1clNodWZmbGVkSWR4ID0gY3VyU2h1ZmZsZWRJZHggPCAwID8gbVBsYXlsaXN0LnNpemUoKSAtIDEgOiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERhdGFTb3VyY2VEZXNjIGRzZCA9IHJldHJpZXZlRGF0YVNvdXJjZURlc2NMb2NrZWQobVNodWZmbGVkTGlzdC5nZXQoY3VyU2h1ZmZsZWRJZHgpKTsKKyAgICAgICAgICAgIGlmIChkc2QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUGxheUl0ZW0oY3VyU2h1ZmZsZWRJZHgsIGRzZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUN1cnJlbnRJZk5lZWRlZExvY2tlZCgpIHsKKyAgICAgICAgaWYgKCFoYXNWYWxpZEl0ZW0oKSB8fCBtQ3VycmVudC5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpbnQgc2h1ZmZsZWRJZHggPSBtU2h1ZmZsZWRMaXN0LmluZGV4T2YobUN1cnJlbnQubWVkaWFJdGVtKTsKKyAgICAgICAgaWYgKHNodWZmbGVkSWR4ID49IDApIHsKKyAgICAgICAgICAgIC8vIEFkZGVkIGFuIGl0ZW0uCisgICAgICAgICAgICBtQ3VycmVudC5zaHVmZmxlZElkeCA9IHNodWZmbGVkSWR4OworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1DdXJyZW50LnNodWZmbGVkSWR4ID49IG1TaHVmZmxlZExpc3Quc2l6ZSgpKSB7CisgICAgICAgICAgICBtQ3VycmVudCA9IGdldE5leHRWYWxpZFBsYXlJdGVtTG9ja2VkKG1TaHVmZmxlZExpc3Quc2l6ZSgpIC0gMSwgMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQ3VycmVudC5tZWRpYUl0ZW0gPSBtU2h1ZmZsZWRMaXN0LmdldChtQ3VycmVudC5zaHVmZmxlZElkeCk7CisgICAgICAgICAgICBpZiAocmV0cmlldmVEYXRhU291cmNlRGVzY0xvY2tlZChtQ3VycmVudC5tZWRpYUl0ZW0pID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQ3VycmVudCA9IGdldE5leHRWYWxpZFBsYXlJdGVtTG9ja2VkKG1DdXJyZW50LnNodWZmbGVkSWR4LCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB1cGRhdGVQbGF5ZXJEYXRhU291cmNlTG9ja2VkKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlUGxheWVyRGF0YVNvdXJjZUxvY2tlZCgpIHsKKyAgICAgICAgaWYgKG1DdXJyZW50ID09IG51bGwgfHwgbUN1cnJlbnQgPT0gbUVvcFBsYXlJdGVtKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1QbGF5ZXIuZ2V0Q3VycmVudERhdGFTb3VyY2UoKSAhPSBtQ3VycmVudC5kc2QpIHsKKyAgICAgICAgICAgIG1QbGF5ZXIuc2V0RGF0YVNvdXJjZShtQ3VycmVudC5kc2QpOworICAgICAgICAgICAgbVBsYXllci5sb29wQ3VycmVudChtUmVwZWF0TW9kZSA9PSBNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfT05FKTsKKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPOiBDYWxsIHNldE5leHREYXRhU291cmNlIChiLzc0MDkwNzQxKQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhcHBseVNodWZmbGVNb2RlTG9ja2VkKCkgeworICAgICAgICBtU2h1ZmZsZWRMaXN0LmNsZWFyKCk7CisgICAgICAgIG1TaHVmZmxlZExpc3QuYWRkQWxsKG1QbGF5bGlzdCk7CisgICAgICAgIGlmIChtU2h1ZmZsZU1vZGUgPT0gTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9BTEwKKyAgICAgICAgICAgICAgICB8fCBtU2h1ZmZsZU1vZGUgPT0gTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9HUk9VUCkgeworICAgICAgICAgICAgQ29sbGVjdGlvbnMuc2h1ZmZsZShtU2h1ZmZsZWRMaXN0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENsYW1wcyB2YWx1ZSB0byBbMCwgc2l6ZV0KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgY2xhbXAoaW50IHZhbHVlLCBpbnQgc2l6ZSkgeworICAgICAgICBpZiAodmFsdWUgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHZhbHVlID4gc2l6ZSkgPyBzaXplIDogdmFsdWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9TZXNzaW9uVG9rZW4ySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9TZXNzaW9uVG9rZW4ySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1Y2Y4YzQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1Nlc3Npb25Ub2tlbjJJbXBsLmphdmEKQEAgLTAsMCArMSwyNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yLlRZUEVfU0VTU0lPTjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yLlRZUEVfU0VTU0lPTl9TRVJWSUNFOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjIuVFlQRV9MSUJSQVJZX1NFUlZJQ0U7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5SZXNvbHZlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uU2VydmljZTI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yOworaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMi5Ub2tlblR5cGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuU2Vzc2lvblRva2VuMlByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBTZXNzaW9uVG9rZW4ySW1wbCBpbXBsZW1lbnRzIFNlc3Npb25Ub2tlbjJQcm92aWRlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9VSUQgPSAiYW5kcm9pZC5tZWRpYS50b2tlbi51aWQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVFlQRSA9ICJhbmRyb2lkLm1lZGlhLnRva2VuLnR5cGUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUEFDS0FHRV9OQU1FID0gImFuZHJvaWQubWVkaWEudG9rZW4ucGFja2FnZV9uYW1lIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NFUlZJQ0VfTkFNRSA9ICJhbmRyb2lkLm1lZGlhLnRva2VuLnNlcnZpY2VfbmFtZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9JRCA9ICJhbmRyb2lkLm1lZGlhLnRva2VuLmlkIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NFU1NJT05fQklOREVSID0gImFuZHJvaWQubWVkaWEudG9rZW4uc2Vzc2lvbl9iaW5kZXIiOworCisgICAgcHJpdmF0ZSBmaW5hbCBTZXNzaW9uVG9rZW4yIG1JbnN0YW5jZTsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtVWlkOworICAgIHByaXZhdGUgZmluYWwgQFRva2VuVHlwZSBpbnQgbVR5cGU7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVBhY2thZ2VOYW1lOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1TZXJ2aWNlTmFtZTsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtSWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBJTWVkaWFTZXNzaW9uMiBtU2Vzc2lvbkJpbmRlcjsKKworICAgIC8qKgorICAgICAqIFB1YmxpYyBjb25zdHJ1Y3RvciBmb3IgdGhlIGxlZ2FjeSBzdXBwb3J0IChpLmUuIGJyb3dzZXIgY2FuIHRyeSBjb25uZWN0aW5nIHRvIGFueSBicm93c2VyCisgICAgICogc2VydmljZSBpZiBpdCBrbm93cyB0aGUgc2VydmljZSBuYW1lKQorICAgICAqLworICAgIHB1YmxpYyBTZXNzaW9uVG9rZW4ySW1wbChDb250ZXh0IGNvbnRleHQsIFNlc3Npb25Ub2tlbjIgaW5zdGFuY2UsCisgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBzZXJ2aWNlTmFtZSwgaW50IHVpZCkgeworICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocGFja2FnZU5hbWUpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYWNrYWdlTmFtZSBzaG91bGRuJ3QgYmUgZW1wdHkiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoc2VydmljZU5hbWUpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZXJ2aWNlTmFtZSBzaG91bGRuJ3QgYmUgZW1wdHkiKTsKKyAgICAgICAgfQorICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKKyAgICAgICAgLy8gQ2FsY3VsYXRlIHVpZCBpZiBpdCdzIG5vdCBzcGVjaWZpZWQuCisgICAgICAgIGZpbmFsIFBhY2thZ2VNYW5hZ2VyIG1hbmFnZXIgPSBjb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIGlmICh1aWQgPCAwKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHVpZCA9IG1hbmFnZXIuZ2V0UGFja2FnZVVpZChwYWNrYWdlTmFtZSwgMCk7CisgICAgICAgICAgICB9IGNhdGNoIChOYW1lTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBmaW5kIHBhY2thZ2UgIiArIHBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtVWlkID0gdWlkOworCisgICAgICAgIC8vIEluZmVyIGlkIGFuZCB0eXBlIGZyb20gcGFja2FnZSBuYW1lIGFuZCBzZXJ2aWNlIG5hbWUKKyAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUgbXVsdGktdXNlci4KKyAgICAgICAgU3RyaW5nIGlkID0gZ2V0U2Vzc2lvbklkRnJvbVNlcnZpY2UobWFuYWdlciwgTWVkaWFMaWJyYXJ5U2VydmljZTIuU0VSVklDRV9JTlRFUkZBQ0UsCisgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUsIHNlcnZpY2VOYW1lKTsKKyAgICAgICAgaWYgKGlkICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1JZCA9IGlkOworICAgICAgICAgICAgbVR5cGUgPSBUWVBFX0xJQlJBUllfU0VSVklDRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHJldHJ5IHdpdGggc2Vzc2lvbiBzZXJ2aWNlCisgICAgICAgICAgICBtSWQgPSBnZXRTZXNzaW9uSWRGcm9tU2VydmljZShtYW5hZ2VyLCBNZWRpYVNlc3Npb25TZXJ2aWNlMi5TRVJWSUNFX0lOVEVSRkFDRSwKKyAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUsIHNlcnZpY2VOYW1lKTsKKyAgICAgICAgICAgIG1UeXBlID0gVFlQRV9TRVNTSU9OX1NFUlZJQ0U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1JZCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZXJ2aWNlICIgKyBzZXJ2aWNlTmFtZSArICIgZG9lc24ndCBpbXBsZW1lbnQiCisgICAgICAgICAgICAgICAgICAgICsgIiBzZXNzaW9uIHNlcnZpY2Ugbm9yIGxpYnJhcnkgc2VydmljZS4gVXNlIHNlcnZpY2UncyBmdWxsIG5hbWUuIik7CisgICAgICAgIH0KKyAgICAgICAgbVBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7CisgICAgICAgIG1TZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOworICAgICAgICBtU2Vzc2lvbkJpbmRlciA9IG51bGw7CisgICAgfQorCisgICAgU2Vzc2lvblRva2VuMkltcGwoaW50IHVpZCwgaW50IHR5cGUsIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHNlcnZpY2VOYW1lLCBTdHJpbmcgaWQsCisgICAgICAgICAgICBJTWVkaWFTZXNzaW9uMiBzZXNzaW9uQmluZGVyKSB7CisgICAgICAgIC8vIFRPRE8oamFld2FuKTogQWRkIHNhbml0eSBjaGVjayAoYi83Mzg2Mzg2NSkKKyAgICAgICAgbVVpZCA9IHVpZDsKKyAgICAgICAgbVR5cGUgPSB0eXBlOworICAgICAgICBtUGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZTsKKyAgICAgICAgbVNlcnZpY2VOYW1lID0gc2VydmljZU5hbWU7CisgICAgICAgIG1JZCA9IGlkOworICAgICAgICBtU2Vzc2lvbkJpbmRlciA9IHNlc3Npb25CaW5kZXI7CisgICAgICAgIG1JbnN0YW5jZSA9IG5ldyBTZXNzaW9uVG9rZW4yKHRoaXMpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTZXNzaW9uSWRGcm9tU2VydmljZShQYWNrYWdlTWFuYWdlciBtYW5hZ2VyLCBTdHJpbmcgc2VydmljZUludGVyZmFjZSwKKyAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHNlcnZpY2VOYW1lKSB7CisgICAgICAgIEludGVudCBzZXJ2aWNlSW50ZW50ID0gbmV3IEludGVudChzZXJ2aWNlSW50ZXJmYWNlKTsKKyAgICAgICAgc2VydmljZUludGVudC5zZXRQYWNrYWdlKHBhY2thZ2VOYW1lKTsKKyAgICAgICAgLy8gVXNlIHF1ZXJ5SW50ZW50U2VydmljZXMgdG8gZmluZCBzZXJ2aWNlcyB3aXRoIE1lZGlhTGlicmFyeVNlcnZpY2UyLlNFUlZJQ0VfSU5URVJGQUNFLgorICAgICAgICAvLyBXZSBjYW5ub3QgdXNlIHJlc29sdmVTZXJ2aWNlIHdpdGggaW50ZW50IHNwZWNpZmllZCBjbGFzcyBuYW1lLCBiZWNhdXNlIHJlc29sdmVTZXJ2aWNlCisgICAgICAgIC8vIGlnbm9yZXMgYWN0aW9ucyBpZiBJbnRlbnQuc2V0Q2xhc3NOYW1lKCkgaXMgc3BlY2lmaWVkLgorICAgICAgICBMaXN0PFJlc29sdmVJbmZvPiBsaXN0ID0gbWFuYWdlci5xdWVyeUludGVudFNlcnZpY2VzKAorICAgICAgICAgICAgICAgIHNlcnZpY2VJbnRlbnQsIFBhY2thZ2VNYW5hZ2VyLkdFVF9NRVRBX0RBVEEpOworICAgICAgICBpZiAobGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBSZXNvbHZlSW5mbyByZXNvbHZlSW5mbyA9IGxpc3QuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlSW5mbyA9PSBudWxsIHx8IHJlc29sdmVJbmZvLnNlcnZpY2VJbmZvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuZXF1YWxzKHJlc29sdmVJbmZvLnNlcnZpY2VJbmZvLm5hbWUsIHNlcnZpY2VOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U2Vzc2lvbklkKHJlc29sdmVJbmZvKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2Vzc2lvbklkKFJlc29sdmVJbmZvIHJlc29sdmVJbmZvKSB7CisgICAgICAgIGlmIChyZXNvbHZlSW5mbyA9PSBudWxsIHx8IHJlc29sdmVJbmZvLnNlcnZpY2VJbmZvID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGVsc2UgaWYgKHJlc29sdmVJbmZvLnNlcnZpY2VJbmZvLm1ldGFEYXRhID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiByZXNvbHZlSW5mby5zZXJ2aWNlSW5mby5tZXRhRGF0YS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIE1lZGlhU2Vzc2lvblNlcnZpY2UyLlNFUlZJQ0VfTUVUQV9EQVRBLCAiIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgU2Vzc2lvblRva2VuMiBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lX2ltcGwoKSB7CisgICAgICAgIHJldHVybiBtUGFja2FnZU5hbWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRVaWRfaW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIG1VaWQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRJZF9pbXAoKSB7CisgICAgICAgIHJldHVybiBtSWQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRUeXBlX2ltcGwoKSB7CisgICAgICAgIHJldHVybiBtVHlwZTsKKyAgICB9CisKKyAgICBTdHJpbmcgZ2V0U2VydmljZU5hbWUoKSB7CisgICAgICAgIHJldHVybiBtU2VydmljZU5hbWU7CisgICAgfQorCisgICAgSU1lZGlhU2Vzc2lvbjIgZ2V0U2Vzc2lvbkJpbmRlcigpIHsKKyAgICAgICAgcmV0dXJuIG1TZXNzaW9uQmluZGVyOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU2Vzc2lvblRva2VuMiBmcm9tQnVuZGxlX2ltcGwoQnVuZGxlIGJ1bmRsZSkgeworICAgICAgICBpZiAoYnVuZGxlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGZpbmFsIGludCB1aWQgPSBidW5kbGUuZ2V0SW50KEtFWV9VSUQpOworICAgICAgICBmaW5hbCBAVG9rZW5UeXBlIGludCB0eXBlID0gYnVuZGxlLmdldEludChLRVlfVFlQRSwgLTEpOworICAgICAgICBmaW5hbCBTdHJpbmcgcGFja2FnZU5hbWUgPSBidW5kbGUuZ2V0U3RyaW5nKEtFWV9QQUNLQUdFX05BTUUpOworICAgICAgICBmaW5hbCBTdHJpbmcgc2VydmljZU5hbWUgPSBidW5kbGUuZ2V0U3RyaW5nKEtFWV9TRVJWSUNFX05BTUUpOworICAgICAgICBmaW5hbCBTdHJpbmcgaWQgPSBidW5kbGUuZ2V0U3RyaW5nKEtFWV9JRCk7CisgICAgICAgIGZpbmFsIElCaW5kZXIgc2Vzc2lvbkJpbmRlciA9IGJ1bmRsZS5nZXRCaW5kZXIoS0VZX1NFU1NJT05fQklOREVSKTsKKworICAgICAgICAvLyBTYW5pdHkgY2hlY2suCisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBUWVBFX1NFU1NJT046CisgICAgICAgICAgICAgICAgaWYgKHNlc3Npb25CaW5kZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmV4cGVjdGVkIHNlc3Npb25CaW5kZXIgZm9yIHNlc3Npb24sIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBiaW5kZXI9IiArIHNlc3Npb25CaW5kZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVFlQRV9TRVNTSU9OX1NFUlZJQ0U6CisgICAgICAgICAgICBjYXNlIFRZUEVfTElCUkFSWV9TRVJWSUNFOgorICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShzZXJ2aWNlTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU2Vzc2lvbiBzZXJ2aWNlIG5lZWRzIHNlcnZpY2UgbmFtZSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCB0eXBlIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHBhY2thZ2VOYW1lKSB8fCBpZCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQYWNrYWdlIG5hbWUgbm9yIElEIGNhbm5vdCBiZSBudWxsLiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgU2Vzc2lvblRva2VuMkltcGwodWlkLCB0eXBlLCBwYWNrYWdlTmFtZSwgc2VydmljZU5hbWUsIGlkLAorICAgICAgICAgICAgICAgIHNlc3Npb25CaW5kZXIgIT0gbnVsbCA/IElNZWRpYVNlc3Npb24yLlN0dWIuYXNJbnRlcmZhY2Uoc2Vzc2lvbkJpbmRlcikgOiBudWxsKQorICAgICAgICAgICAgICAgIC5nZXRJbnN0YW5jZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCdW5kbGUgdG9CdW5kbGVfaW1wbCgpIHsKKyAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgYnVuZGxlLnB1dEludChLRVlfVUlELCBtVWlkKTsKKyAgICAgICAgYnVuZGxlLnB1dFN0cmluZyhLRVlfUEFDS0FHRV9OQU1FLCBtUGFja2FnZU5hbWUpOworICAgICAgICBidW5kbGUucHV0U3RyaW5nKEtFWV9TRVJWSUNFX05BTUUsIG1TZXJ2aWNlTmFtZSk7CisgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoS0VZX0lELCBtSWQpOworICAgICAgICBidW5kbGUucHV0SW50KEtFWV9UWVBFLCBtVHlwZSk7CisgICAgICAgIGJ1bmRsZS5wdXRCaW5kZXIoS0VZX1NFU1NJT05fQklOREVSLAorICAgICAgICAgICAgICAgIG1TZXNzaW9uQmluZGVyICE9IG51bGwgPyBtU2Vzc2lvbkJpbmRlci5hc0JpbmRlcigpIDogbnVsbCk7CisgICAgICAgIHJldHVybiBidW5kbGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZV9pbXBsKCkgeworICAgICAgICBmaW5hbCBpbnQgcHJpbWUgPSAzMTsKKyAgICAgICAgcmV0dXJuIG1UeXBlCisgICAgICAgICAgICAgICAgKyBwcmltZSAqIChtVWlkCisgICAgICAgICAgICAgICAgKyBwcmltZSAqIChtUGFja2FnZU5hbWUuaGFzaENvZGUoKQorICAgICAgICAgICAgICAgICsgcHJpbWUgKiAobUlkLmhhc2hDb2RlKCkKKyAgICAgICAgICAgICAgICArIHByaW1lICogKG1TZXJ2aWNlTmFtZSAhPSBudWxsID8gbVNlcnZpY2VOYW1lLmhhc2hDb2RlKCkgOiAwKSkpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHNfaW1wbChPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFNlc3Npb25Ub2tlbjIpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgU2Vzc2lvblRva2VuMkltcGwgb3RoZXIgPSBmcm9tKChTZXNzaW9uVG9rZW4yKSBvYmopOworICAgICAgICByZXR1cm4gbVVpZCA9PSBvdGhlci5tVWlkCisgICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmVxdWFscyhtUGFja2FnZU5hbWUsIG90aGVyLm1QYWNrYWdlTmFtZSkKKyAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuZXF1YWxzKG1TZXJ2aWNlTmFtZSwgb3RoZXIubVNlcnZpY2VOYW1lKQorICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5lcXVhbHMobUlkLCBvdGhlci5tSWQpCisgICAgICAgICAgICAgICAgJiYgbVR5cGUgPT0gb3RoZXIubVR5cGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZ19pbXBsKCkgeworICAgICAgICByZXR1cm4gIlNlc3Npb25Ub2tlbiB7cGtnPSIgKyBtUGFja2FnZU5hbWUgKyAiIGlkPSIgKyBtSWQgKyAiIHR5cGU9IiArIG1UeXBlCisgICAgICAgICAgICAgICAgKyAiIHNlcnZpY2U9IiArIG1TZXJ2aWNlTmFtZSArICIgYmluZGVyPSIgKyBtU2Vzc2lvbkJpbmRlciArICJ9IjsKKyAgICB9CisKKyAgICBzdGF0aWMgU2Vzc2lvblRva2VuMkltcGwgZnJvbShTZXNzaW9uVG9rZW4yIHRva2VuKSB7CisgICAgICAgIHJldHVybiAoKFNlc3Npb25Ub2tlbjJJbXBsKSB0b2tlbi5nZXRQcm92aWRlcigpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1ZvbHVtZVByb3ZpZGVyMkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvVm9sdW1lUHJvdmlkZXIySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMjJlMWIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1ZvbHVtZVByb3ZpZGVyMkltcGwuamF2YQpAQCAtMCwwICsxLDkzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlZvbHVtZVByb3ZpZGVyMi5WT0xVTUVfQ09OVFJPTF9BQlNPTFVURTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5Wb2x1bWVQcm92aWRlcjIuVk9MVU1FX0NPTlRST0xfRklYRUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuVm9sdW1lUHJvdmlkZXIyLlZPTFVNRV9DT05UUk9MX1JFTEFUSVZFOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5Wb2x1bWVQcm92aWRlcjI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuVm9sdW1lUHJvdmlkZXIyUHJvdmlkZXI7CisKK3B1YmxpYyBjbGFzcyBWb2x1bWVQcm92aWRlcjJJbXBsIGltcGxlbWVudHMgVm9sdW1lUHJvdmlkZXIyUHJvdmlkZXIgeworICAgIHByaXZhdGUgZmluYWwgVm9sdW1lUHJvdmlkZXIyIG1JbnN0YW5jZTsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtQ29udHJvbFR5cGU7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbU1heFZvbHVtZTsKKworICAgIHByaXZhdGUgaW50IG1DdXJyZW50Vm9sdW1lOworICAgIHByaXZhdGUgQ2FsbGJhY2sgbUNhbGxiYWNrOworCisgICAgcHVibGljIFZvbHVtZVByb3ZpZGVyMkltcGwoVm9sdW1lUHJvdmlkZXIyIGluc3RhbmNlLAorICAgICAgICAgICAgQFZvbHVtZVByb3ZpZGVyMi5Db250cm9sVHlwZSBpbnQgY29udHJvbFR5cGUsIGludCBtYXhWb2x1bWUsIGludCBjdXJyZW50Vm9sdW1lKSB7CisgICAgICAgIGlmIChjb250cm9sVHlwZSAhPSBWT0xVTUVfQ09OVFJPTF9GSVhFRCAmJiBjb250cm9sVHlwZSAhPSBWT0xVTUVfQ09OVFJPTF9SRUxBVElWRQorICAgICAgICAgICAgICAgICYmIGNvbnRyb2xUeXBlICE9IFZPTFVNRV9DT05UUk9MX0FCU09MVVRFKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ3cm9uZyBjb250cm9sVHlwZSAiICsgY29udHJvbFR5cGUpOworICAgICAgICB9CisgICAgICAgIGlmIChtYXhWb2x1bWUgPCAwIHx8IGN1cnJlbnRWb2x1bWUgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ2b2x1bWUgc2hvdWxkbid0IGJlIG5lZ2F0aXZlIgorICAgICAgICAgICAgICAgICAgICArICIsIG1heFZvbHVtZT0iICsgbWF4Vm9sdW1lICsgIiwgY3VycmVudFZvbHVtZT0iICsgY3VycmVudFZvbHVtZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGN1cnJlbnRWb2x1bWUgPiBtYXhWb2x1bWUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImN1cnJlbnRWb2x1bWUgc2hvdWxkbid0IGJlIGdyZWF0ZXIgdGhhbiBtYXhWb2x1bWUiCisgICAgICAgICAgICAgICAgICAgICsgIiwgbWF4Vm9sdW1lPSIgKyBtYXhWb2x1bWUgKyAiLCBjdXJyZW50Vm9sdW1lPSIgKyBjdXJyZW50Vm9sdW1lKTsKKyAgICAgICAgfQorICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKKyAgICAgICAgbUNvbnRyb2xUeXBlID0gY29udHJvbFR5cGU7CisgICAgICAgIG1NYXhWb2x1bWUgPSBtYXhWb2x1bWU7CisgICAgICAgIG1DdXJyZW50Vm9sdW1lID0gY3VycmVudFZvbHVtZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldENvbnRyb2xUeXBlX2ltcGwoKSB7CisgICAgICAgIHJldHVybiBtQ29udHJvbFR5cGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRNYXhWb2x1bWVfaW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIG1NYXhWb2x1bWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRDdXJyZW50Vm9sdW1lX2ltcGwoKSB7CisgICAgICAgIHJldHVybiBtQ3VycmVudFZvbHVtZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRDdXJyZW50Vm9sdW1lX2ltcGwoaW50IGN1cnJlbnRWb2x1bWUpIHsKKyAgICAgICAgaWYgKGN1cnJlbnRWb2x1bWUgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjdXJyZW50Vm9sdW1lIHNob3VsZG4ndCBiZSBuZWdhdGl2ZSIKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBjdXJyZW50Vm9sdW1lPSIgKyBjdXJyZW50Vm9sdW1lKTsKKyAgICAgICAgfQorICAgICAgICBtQ3VycmVudFZvbHVtZSA9IGN1cnJlbnRWb2x1bWU7CisgICAgICAgIGlmIChtQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgbUNhbGxiYWNrLm9uVm9sdW1lQ2hhbmdlZChtSW5zdGFuY2UpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhIGNhbGxiYWNrIHRvIHJlY2VpdmUgdm9sdW1lIGNoYW5nZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2FsbGJhY2soQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgfQorCisgICAgLyoqCisgICAgICogTGlzdGVucyBmb3IgY2hhbmdlcyB0byB0aGUgdm9sdW1lLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQ2FsbGJhY2sgeworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBvblZvbHVtZUNoYW5nZWQoVm9sdW1lUHJvdmlkZXIyIHZvbHVtZVByb3ZpZGVyKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3N1YnRpdGxlL0Nsb3NlZENhcHRpb25SZW5kZXJlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9DbG9zZWRDYXB0aW9uUmVuZGVyZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjdlZWM5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9DbG9zZWRDYXB0aW9uUmVuZGVyZXIuamF2YQpAQCAtMCwwICsxLDE1MDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQubWVkaWEuc3VidGl0bGU7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuVHlwZWZhY2U7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUZvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlOworaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmdCdWlsZGVyOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0UGFpbnQ7CitpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkNoYXJhY3RlclN0eWxlOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5TdHlsZVNwYW47CitpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlVuZGVybGluZVNwYW47CitpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlVwZGF0ZUFwcGVhcmFuY2U7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5UeXBlZFZhbHVlOworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQ2FwdGlvbmluZ01hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQ2FwdGlvbmluZ01hbmFnZXIuQ2FwdGlvblN0eWxlOworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkNhcHRpb25pbmdNYW5hZ2VyLkNhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworLy8gTm90ZTogVGhpcyBpcyBmb3JrZWQgZnJvbSBhbmRyb2lkLm1lZGlhLkNsb3NlZENhcHRpb25SZW5kZXJlciBzaW5jZSBQCitwdWJsaWMgY2xhc3MgQ2xvc2VkQ2FwdGlvblJlbmRlcmVyIGV4dGVuZHMgU3VidGl0bGVDb250cm9sbGVyLlJlbmRlcmVyIHsKKyAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBDZWE2MDhDQ1dpZGdldCBtQ0NXaWRnZXQ7CisKKyAgICBwdWJsaWMgQ2xvc2VkQ2FwdGlvblJlbmRlcmVyKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoTWVkaWFGb3JtYXQgZm9ybWF0KSB7CisgICAgICAgIGlmIChmb3JtYXQuY29udGFpbnNLZXkoTWVkaWFGb3JtYXQuS0VZX01JTUUpKSB7CisgICAgICAgICAgICBTdHJpbmcgbWltZVR5cGUgPSBmb3JtYXQuZ2V0U3RyaW5nKE1lZGlhRm9ybWF0LktFWV9NSU1FKTsKKyAgICAgICAgICAgIHJldHVybiBNZWRpYUZvcm1hdC5NSU1FVFlQRV9URVhUX0NFQV82MDguZXF1YWxzKG1pbWVUeXBlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN1YnRpdGxlVHJhY2sgY3JlYXRlVHJhY2soTWVkaWFGb3JtYXQgZm9ybWF0KSB7CisgICAgICAgIFN0cmluZyBtaW1lVHlwZSA9IGZvcm1hdC5nZXRTdHJpbmcoTWVkaWFGb3JtYXQuS0VZX01JTUUpOworICAgICAgICBpZiAoTWVkaWFGb3JtYXQuTUlNRVRZUEVfVEVYVF9DRUFfNjA4LmVxdWFscyhtaW1lVHlwZSkpIHsKKyAgICAgICAgICAgIGlmIChtQ0NXaWRnZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1DQ1dpZGdldCA9IG5ldyBDZWE2MDhDQ1dpZGdldChtQ29udGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IENlYTYwOENhcHRpb25UcmFjayhtQ0NXaWRnZXQsIGZvcm1hdCk7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5vIG1hdGNoaW5nIGZvcm1hdDogIiArIGZvcm1hdC50b1N0cmluZygpKTsKKyAgICB9Cit9CisKK2NsYXNzIENlYTYwOENhcHRpb25UcmFjayBleHRlbmRzIFN1YnRpdGxlVHJhY2sgeworICAgIHByaXZhdGUgZmluYWwgQ2VhNjA4Q0NQYXJzZXIgbUNDUGFyc2VyOworICAgIHByaXZhdGUgZmluYWwgQ2VhNjA4Q0NXaWRnZXQgbVJlbmRlcmluZ1dpZGdldDsKKworICAgIENlYTYwOENhcHRpb25UcmFjayhDZWE2MDhDQ1dpZGdldCByZW5kZXJpbmdXaWRnZXQsIE1lZGlhRm9ybWF0IGZvcm1hdCkgeworICAgICAgICBzdXBlcihmb3JtYXQpOworCisgICAgICAgIG1SZW5kZXJpbmdXaWRnZXQgPSByZW5kZXJpbmdXaWRnZXQ7CisgICAgICAgIG1DQ1BhcnNlciA9IG5ldyBDZWE2MDhDQ1BhcnNlcihtUmVuZGVyaW5nV2lkZ2V0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkRhdGEoYnl0ZVtdIGRhdGEsIGJvb2xlYW4gZW9zLCBsb25nIHJ1bklEKSB7CisgICAgICAgIG1DQ1BhcnNlci5wYXJzZShkYXRhKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVuZGVyaW5nV2lkZ2V0IGdldFJlbmRlcmluZ1dpZGdldCgpIHsKKyAgICAgICAgcmV0dXJuIG1SZW5kZXJpbmdXaWRnZXQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdXBkYXRlVmlldyhWZWN0b3I8Q3VlPiBhY3RpdmVDdWVzKSB7CisgICAgICAgIC8vIE92ZXJyaWRpbmcgd2l0aCBOTy1PUCwgQ0MgcmVuZGVyaW5nIGJ5LXBhc3NlcyB0aGlzCisgICAgfQorfQorCisvKioKKyAqIEFic3RyYWN0IHdpZGdldCBjbGFzcyB0byByZW5kZXIgYSBjbG9zZWQgY2FwdGlvbiB0cmFjay4KKyAqLworYWJzdHJhY3QgY2xhc3MgQ2xvc2VkQ2FwdGlvbldpZGdldCBleHRlbmRzIFZpZXdHcm91cCBpbXBsZW1lbnRzIFN1YnRpdGxlVHJhY2suUmVuZGVyaW5nV2lkZ2V0IHsKKworICAgIGludGVyZmFjZSBDbG9zZWRDYXB0aW9uTGF5b3V0IHsKKyAgICAgICAgdm9pZCBzZXRDYXB0aW9uU3R5bGUoQ2FwdGlvblN0eWxlIGNhcHRpb25TdHlsZSk7CisgICAgICAgIHZvaWQgc2V0Rm9udFNjYWxlKGZsb2F0IHNjYWxlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDYXB0aW9uU3R5bGUgREVGQVVMVF9DQVBUSU9OX1NUWUxFID0gQ2FwdGlvblN0eWxlLkRFRkFVTFQ7CisKKyAgICAvKiogQ2FwdGlvbmluZyBtYW5hZ2VyLCB1c2VkIHRvIG9idGFpbiBhbmQgdHJhY2sgY2FwdGlvbiBwcm9wZXJ0aWVzLiAqLworICAgIHByaXZhdGUgZmluYWwgQ2FwdGlvbmluZ01hbmFnZXIgbU1hbmFnZXI7CisKKyAgICAvKiogQ3VycmVudCBjYXB0aW9uIHN0eWxlLiAqLworICAgIHByb3RlY3RlZCBDYXB0aW9uU3R5bGUgbUNhcHRpb25TdHlsZTsKKworICAgIC8qKiBDYWxsYmFjayBmb3IgcmVuZGVyaW5nIGNoYW5nZXMuICovCisgICAgcHJvdGVjdGVkIE9uQ2hhbmdlZExpc3RlbmVyIG1MaXN0ZW5lcjsKKworICAgIC8qKiBDb25jcmV0ZSBsYXlvdXQgb2YgQ0MuICovCisgICAgcHJvdGVjdGVkIENsb3NlZENhcHRpb25MYXlvdXQgbUNsb3NlZENhcHRpb25MYXlvdXQ7CisKKyAgICAvKiogV2hldGhlciBhIGNhcHRpb24gc3R5bGUgY2hhbmdlIGxpc3RlbmVyIGlzIHJlZ2lzdGVyZWQuICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1IYXNDaGFuZ2VMaXN0ZW5lcjsKKworICAgIHB1YmxpYyBDbG9zZWRDYXB0aW9uV2lkZ2V0KENvbnRleHQgY29udGV4dCkgeworICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBDbG9zZWRDYXB0aW9uV2lkZ2V0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDApOworICAgIH0KKworICAgIHB1YmxpYyBDbG9zZWRDYXB0aW9uV2lkZ2V0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgZGVmU3R5bGUsIDApOworICAgIH0KKworICAgIHB1YmxpYyBDbG9zZWRDYXB0aW9uV2lkZ2V0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyLAorICAgICAgICAgICAgaW50IGRlZlN0eWxlUmVzKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIsIGRlZlN0eWxlUmVzKTsKKworICAgICAgICAvLyBDYW5ub3QgcmVuZGVyIHRleHQgb3ZlciB2aWRlbyB3aGVuIGxheWVyIHR5cGUgaXMgaGFyZHdhcmUuCisgICAgICAgIHNldExheWVyVHlwZShWaWV3LkxBWUVSX1RZUEVfU09GVFdBUkUsIG51bGwpOworCisgICAgICAgIG1NYW5hZ2VyID0gKENhcHRpb25pbmdNYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DQVBUSU9OSU5HX1NFUlZJQ0UpOworICAgICAgICBtQ2FwdGlvblN0eWxlID0gREVGQVVMVF9DQVBUSU9OX1NUWUxFLmFwcGx5U3R5bGUobU1hbmFnZXIuZ2V0VXNlclN0eWxlKCkpOworCisgICAgICAgIG1DbG9zZWRDYXB0aW9uTGF5b3V0ID0gY3JlYXRlQ2FwdGlvbkxheW91dChjb250ZXh0KTsKKyAgICAgICAgbUNsb3NlZENhcHRpb25MYXlvdXQuc2V0Q2FwdGlvblN0eWxlKG1DYXB0aW9uU3R5bGUpOworICAgICAgICBtQ2xvc2VkQ2FwdGlvbkxheW91dC5zZXRGb250U2NhbGUobU1hbmFnZXIuZ2V0Rm9udFNjYWxlKCkpOworICAgICAgICBhZGRWaWV3KChWaWV3R3JvdXApIG1DbG9zZWRDYXB0aW9uTGF5b3V0LCBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAorICAgICAgICAgICAgICAgIExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpOworCisgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYWJzdHJhY3QgQ2xvc2VkQ2FwdGlvbkxheW91dCBjcmVhdGVDYXB0aW9uTGF5b3V0KENvbnRleHQgY29udGV4dCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRPbkNoYW5nZWRMaXN0ZW5lcihPbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICBmaW5hbCBpbnQgd2lkdGhTcGVjID0gTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKHdpZHRoLCBNZWFzdXJlU3BlYy5FWEFDVExZKTsKKyAgICAgICAgZmluYWwgaW50IGhlaWdodFNwZWMgPSBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoaGVpZ2h0LCBNZWFzdXJlU3BlYy5FWEFDVExZKTsKKworICAgICAgICBtZWFzdXJlKHdpZHRoU3BlYywgaGVpZ2h0U3BlYyk7CisgICAgICAgIGxheW91dCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgeworICAgICAgICBpZiAodmlzaWJsZSkgeworICAgICAgICAgICAgc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICB9CisKKyAgICAgICAgbWFuYWdlQ2hhbmdlTGlzdGVuZXIoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkF0dGFjaGVkVG9XaW5kb3coKSB7CisgICAgICAgIHN1cGVyLm9uQXR0YWNoZWRUb1dpbmRvdygpOworCisgICAgICAgIG1hbmFnZUNoYW5nZUxpc3RlbmVyKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKSB7CisgICAgICAgIHN1cGVyLm9uRGV0YWNoZWRGcm9tV2luZG93KCk7CisKKyAgICAgICAgbWFuYWdlQ2hhbmdlTGlzdGVuZXIoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgeworICAgICAgICBzdXBlci5vbk1lYXN1cmUod2lkdGhNZWFzdXJlU3BlYywgaGVpZ2h0TWVhc3VyZVNwZWMpOworICAgICAgICAoKFZpZXdHcm91cCkgbUNsb3NlZENhcHRpb25MYXlvdXQpLm1lYXN1cmUod2lkdGhNZWFzdXJlU3BlYywgaGVpZ2h0TWVhc3VyZVNwZWMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTGF5b3V0KGJvb2xlYW4gY2hhbmdlZCwgaW50IGwsIGludCB0LCBpbnQgciwgaW50IGIpIHsKKyAgICAgICAgKChWaWV3R3JvdXApIG1DbG9zZWRDYXB0aW9uTGF5b3V0KS5sYXlvdXQobCwgdCwgciwgYik7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFuYWdlcyB3aGV0aGVyIHRoaXMgcmVuZGVyZXIgaXMgbGlzdGVuaW5nIGZvciBjYXB0aW9uIHN0eWxlIGNoYW5nZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBDYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIgbUNhcHRpb25pbmdMaXN0ZW5lciA9IG5ldyBDYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblVzZXJTdHlsZUNoYW5nZWQoQ2FwdGlvblN0eWxlIHVzZXJTdHlsZSkgeworICAgICAgICAgICAgbUNhcHRpb25TdHlsZSA9IERFRkFVTFRfQ0FQVElPTl9TVFlMRS5hcHBseVN0eWxlKHVzZXJTdHlsZSk7CisgICAgICAgICAgICBtQ2xvc2VkQ2FwdGlvbkxheW91dC5zZXRDYXB0aW9uU3R5bGUobUNhcHRpb25TdHlsZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Gb250U2NhbGVDaGFuZ2VkKGZsb2F0IGZvbnRTY2FsZSkgeworICAgICAgICAgICAgbUNsb3NlZENhcHRpb25MYXlvdXQuc2V0Rm9udFNjYWxlKGZvbnRTY2FsZSk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSB2b2lkIG1hbmFnZUNoYW5nZUxpc3RlbmVyKCkgeworICAgICAgICBmaW5hbCBib29sZWFuIG5lZWRzTGlzdGVuZXIgPSBpc0F0dGFjaGVkVG9XaW5kb3coKSAmJiBnZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFOworICAgICAgICBpZiAobUhhc0NoYW5nZUxpc3RlbmVyICE9IG5lZWRzTGlzdGVuZXIpIHsKKyAgICAgICAgICAgIG1IYXNDaGFuZ2VMaXN0ZW5lciA9IG5lZWRzTGlzdGVuZXI7CisKKyAgICAgICAgICAgIGlmIChuZWVkc0xpc3RlbmVyKSB7CisgICAgICAgICAgICAgICAgbU1hbmFnZXIuYWRkQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyKG1DYXB0aW9uaW5nTGlzdGVuZXIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtTWFuYWdlci5yZW1vdmVDYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIobUNhcHRpb25pbmdMaXN0ZW5lcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogQ0NQYXJzZXIgcHJvY2Vzc2VzIENFQS02MDggY2xvc2VkIGNhcHRpb24gZGF0YS4KKyAqCisgKiBJdCBjYWxscyBiYWNrIGludG8gT25EaXNwbGF5Q2hhbmdlZExpc3RlbmVyIHVwb24KKyAqIGRpc3BsYXkgY2hhbmdlIHdpdGggc3R5bGVkIHRleHQgZm9yIHJlbmRlcmluZy4KKyAqCisgKi8KK2NsYXNzIENlYTYwOENDUGFyc2VyIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfUk9XUyA9IDE1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9DT0xTID0gMzI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkNlYTYwOENDUGFyc2VyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVkFMSUQgPSAtMTsKKworICAgIC8vIEVJQS1DRUEtNjA4OiBUYWJsZSA3MCAtIENvbnRyb2wgQ29kZXMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkNMID0gMHgyMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlMgID0gMHgyMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQU9GID0gMHgyMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQU9OID0gMHgyMzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVSID0gMHgyNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUlUyID0gMHgyNTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUlUzID0gMHgyNjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUlU0ID0gMHgyNzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRk9OID0gMHgyODsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkRDID0gMHgyOTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFIgID0gMHgyYTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUlREID0gMHgyYjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRURNID0gMHgyYzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ1IgID0gMHgyZDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU5NID0gMHgyZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU9DID0gMHgyZjsKKworICAgIC8vIFRyYW5zcGFyZW50IFNwYWNlCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBUUyA9ICdcdTAwQTAnOworCisgICAgLy8gQ2FwdGlvbmluZyBNb2RlcworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNT0RFX1VOS05PV04gPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNT0RFX1BBSU5UX09OID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9ST0xMX1VQID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9QT1BfT04gPSAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNT0RFX1RFWFQgPSA0OworCisgICAgcHJpdmF0ZSBmaW5hbCBEaXNwbGF5TGlzdGVuZXIgbUxpc3RlbmVyOworCisgICAgcHJpdmF0ZSBpbnQgbU1vZGUgPSBNT0RFX1BBSU5UX09OOworICAgIHByaXZhdGUgaW50IG1Sb2xsVXBTaXplID0gNDsKKyAgICBwcml2YXRlIGludCBtUHJldkN0cmxDb2RlID0gSU5WQUxJRDsKKworICAgIHByaXZhdGUgQ0NNZW1vcnkgbURpc3BsYXkgPSBuZXcgQ0NNZW1vcnkoKTsKKyAgICBwcml2YXRlIENDTWVtb3J5IG1Ob25EaXNwbGF5ID0gbmV3IENDTWVtb3J5KCk7CisgICAgcHJpdmF0ZSBDQ01lbW9yeSBtVGV4dE1lbSA9IG5ldyBDQ01lbW9yeSgpOworCisgICAgQ2VhNjA4Q0NQYXJzZXIoRGlzcGxheUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBhcnNlKGJ5dGVbXSBkYXRhKSB7CisgICAgICAgIENDRGF0YVtdIGNjRGF0YSA9IENDRGF0YS5mcm9tQnl0ZUFycmF5KGRhdGEpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2NEYXRhLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNjRGF0YVtpXS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGhhbmRsZUN0cmxDb2RlKGNjRGF0YVtpXSkKKyAgICAgICAgICAgICAgICAgICAgfHwgaGFuZGxlVGFiT2Zmc2V0cyhjY0RhdGFbaV0pCisgICAgICAgICAgICAgICAgICAgIHx8IGhhbmRsZVBBQ0NvZGUoY2NEYXRhW2ldKQorICAgICAgICAgICAgICAgICAgICB8fCBoYW5kbGVNaWRSb3dDb2RlKGNjRGF0YVtpXSkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaGFuZGxlRGlzcGxheWFibGVDaGFycyhjY0RhdGFbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgaW50ZXJmYWNlIERpc3BsYXlMaXN0ZW5lciB7CisgICAgICAgIHZvaWQgb25EaXNwbGF5Q2hhbmdlZChTcGFubmFibGVTdHJpbmdCdWlsZGVyW10gc3R5bGVkVGV4dHMpOworICAgICAgICBDYXB0aW9uU3R5bGUgZ2V0Q2FwdGlvblN0eWxlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBDQ01lbW9yeSBnZXRNZW1vcnkoKSB7CisgICAgICAgIC8vIGdldCB0aGUgQ0MgbWVtb3J5IHRvIG9wZXJhdGUgb24gZm9yIGN1cnJlbnQgbW9kZQorICAgICAgICBzd2l0Y2ggKG1Nb2RlKSB7CisgICAgICAgIGNhc2UgTU9ERV9QT1BfT046CisgICAgICAgICAgICByZXR1cm4gbU5vbkRpc3BsYXk7CisgICAgICAgIGNhc2UgTU9ERV9URVhUOgorICAgICAgICAgICAgLy8gVE9ETyhjaHopOiBzdXBwb3J0IG9ubHkgY2FwdGlvbiBtb2RlIGZvciBub3csCisgICAgICAgICAgICAvLyBpbiB0ZXh0IG1vZGUsIGR1bXAgZXZlcnl0aGluZyB0byB0ZXh0IG1lbS4KKyAgICAgICAgICAgIHJldHVybiBtVGV4dE1lbTsKKyAgICAgICAgY2FzZSBNT0RFX1BBSU5UX09OOgorICAgICAgICBjYXNlIE1PREVfUk9MTF9VUDoKKyAgICAgICAgICAgIHJldHVybiBtRGlzcGxheTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExvZy53KFRBRywgInVucmVjb2dpbml6ZWQgbW9kZTogIiArIG1Nb2RlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbURpc3BsYXk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGhhbmRsZURpc3BsYXlhYmxlQ2hhcnMoQ0NEYXRhIGNjRGF0YSkgeworICAgICAgICBpZiAoIWNjRGF0YS5pc0Rpc3BsYXlhYmxlQ2hhcigpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBFeHRlbmRlZCBjaGFyIGluY2x1ZGVzIDEgYXV0b21hdGljIGJhY2tzcGFjZQorICAgICAgICBpZiAoY2NEYXRhLmlzRXh0ZW5kZWRDaGFyKCkpIHsKKyAgICAgICAgICAgIGdldE1lbW9yeSgpLmJzKCk7CisgICAgICAgIH0KKworICAgICAgICBnZXRNZW1vcnkoKS53cml0ZVRleHQoY2NEYXRhLmdldERpc3BsYXlUZXh0KCkpOworCisgICAgICAgIGlmIChtTW9kZSA9PSBNT0RFX1BBSU5UX09OIHx8IG1Nb2RlID09IE1PREVfUk9MTF9VUCkgeworICAgICAgICAgICAgdXBkYXRlRGlzcGxheSgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGhhbmRsZU1pZFJvd0NvZGUoQ0NEYXRhIGNjRGF0YSkgeworICAgICAgICBTdHlsZUNvZGUgbSA9IGNjRGF0YS5nZXRNaWRSb3coKTsKKyAgICAgICAgaWYgKG0gIT0gbnVsbCkgeworICAgICAgICAgICAgZ2V0TWVtb3J5KCkud3JpdGVNaWRSb3dDb2RlKG0pOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBoYW5kbGVQQUNDb2RlKENDRGF0YSBjY0RhdGEpIHsKKyAgICAgICAgUEFDIHBhYyA9IGNjRGF0YS5nZXRQQUMoKTsKKworICAgICAgICBpZiAocGFjICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChtTW9kZSA9PSBNT0RFX1JPTExfVVApIHsKKyAgICAgICAgICAgICAgICBnZXRNZW1vcnkoKS5tb3ZlQmFzZWxpbmVUbyhwYWMuZ2V0Um93KCksIG1Sb2xsVXBTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdldE1lbW9yeSgpLndyaXRlUEFDKHBhYyk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaGFuZGxlVGFiT2Zmc2V0cyhDQ0RhdGEgY2NEYXRhKSB7CisgICAgICAgIGludCB0YWJzID0gY2NEYXRhLmdldFRhYk9mZnNldCgpOworCisgICAgICAgIGlmICh0YWJzID4gMCkgeworICAgICAgICAgICAgZ2V0TWVtb3J5KCkudGFiKHRhYnMpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGhhbmRsZUN0cmxDb2RlKENDRGF0YSBjY0RhdGEpIHsKKyAgICAgICAgaW50IGN0cmxDb2RlID0gY2NEYXRhLmdldEN0cmxDb2RlKCk7CisKKyAgICAgICAgaWYgKG1QcmV2Q3RybENvZGUgIT0gSU5WQUxJRCAmJiBtUHJldkN0cmxDb2RlID09IGN0cmxDb2RlKSB7CisgICAgICAgICAgICAvLyBkaXNjYXJkIGRvdWJsZSBjdHJsIGNvZGVzIChidXQgaWYgdGhlcmUncyBhIDNyZCBvbmUsIHdlIHN0aWxsIHRha2UgdGhhdCkKKyAgICAgICAgICAgIG1QcmV2Q3RybENvZGUgPSBJTlZBTElEOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2goY3RybENvZGUpIHsKKyAgICAgICAgY2FzZSBSQ0w6CisgICAgICAgICAgICAvLyBzZWxlY3QgcG9wLW9uIHN0eWxlCisgICAgICAgICAgICBtTW9kZSA9IE1PREVfUE9QX09OOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQlM6CisgICAgICAgICAgICBnZXRNZW1vcnkoKS5icygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgREVSOgorICAgICAgICAgICAgZ2V0TWVtb3J5KCkuZGVyKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVTI6CisgICAgICAgIGNhc2UgUlUzOgorICAgICAgICBjYXNlIFJVNDoKKyAgICAgICAgICAgIG1Sb2xsVXBTaXplID0gKGN0cmxDb2RlIC0gMHgyMyk7CisgICAgICAgICAgICAvLyBlcmFzZSBtZW1vcnkgaWYgY3VycmVudGx5IGluIG90aGVyIHN0eWxlCisgICAgICAgICAgICBpZiAobU1vZGUgIT0gTU9ERV9ST0xMX1VQKSB7CisgICAgICAgICAgICAgICAgbURpc3BsYXkuZXJhc2UoKTsKKyAgICAgICAgICAgICAgICBtTm9uRGlzcGxheS5lcmFzZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gc2VsZWN0IHJvbGwtdXAgc3R5bGUKKyAgICAgICAgICAgIG1Nb2RlID0gTU9ERV9ST0xMX1VQOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRk9OOgorICAgICAgICAgICAgTG9nLmkoVEFHLCAiRmxhc2ggT24iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJEQzoKKyAgICAgICAgICAgIC8vIHNlbGVjdCBwYWludC1vbiBzdHlsZQorICAgICAgICAgICAgbU1vZGUgPSBNT0RFX1BBSU5UX09OOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVFI6CisgICAgICAgICAgICBtTW9kZSA9IE1PREVfVEVYVDsKKyAgICAgICAgICAgIG1UZXh0TWVtLmVyYXNlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVEQ6CisgICAgICAgICAgICBtTW9kZSA9IE1PREVfVEVYVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVETToKKyAgICAgICAgICAgIC8vIGVyYXNlIGRpc3BsYXkgbWVtb3J5CisgICAgICAgICAgICBtRGlzcGxheS5lcmFzZSgpOworICAgICAgICAgICAgdXBkYXRlRGlzcGxheSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1I6CisgICAgICAgICAgICBpZiAobU1vZGUgPT0gTU9ERV9ST0xMX1VQKSB7CisgICAgICAgICAgICAgICAgZ2V0TWVtb3J5KCkucm9sbFVwKG1Sb2xsVXBTaXplKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZ2V0TWVtb3J5KCkuY3IoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtTW9kZSA9PSBNT0RFX1JPTExfVVApIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVEaXNwbGF5KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFTk06CisgICAgICAgICAgICAvLyBlcmFzZSBub24tZGlzcGxheSBtZW1vcnkKKyAgICAgICAgICAgIG1Ob25EaXNwbGF5LmVyYXNlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFT0M6CisgICAgICAgICAgICAvLyBzd2FwIGRpc3BsYXkvbm9uLWRpc3BsYXkgbWVtb3J5CisgICAgICAgICAgICBzd2FwTWVtb3J5KCk7CisgICAgICAgICAgICAvLyBzd2l0Y2ggdG8gcG9wLW9uIHN0eWxlCisgICAgICAgICAgICBtTW9kZSA9IE1PREVfUE9QX09OOworICAgICAgICAgICAgdXBkYXRlRGlzcGxheSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSU5WQUxJRDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIG1QcmV2Q3RybENvZGUgPSBJTlZBTElEOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgbVByZXZDdHJsQ29kZSA9IGN0cmxDb2RlOworCisgICAgICAgIC8vIGhhbmRsZWQKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZURpc3BsYXkoKSB7CisgICAgICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgQ2FwdGlvblN0eWxlIGNhcHRpb25TdHlsZSA9IG1MaXN0ZW5lci5nZXRDYXB0aW9uU3R5bGUoKTsKKyAgICAgICAgICAgIG1MaXN0ZW5lci5vbkRpc3BsYXlDaGFuZ2VkKG1EaXNwbGF5LmdldFN0eWxlZFRleHQoY2FwdGlvblN0eWxlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3dhcE1lbW9yeSgpIHsKKyAgICAgICAgQ0NNZW1vcnkgdGVtcCA9IG1EaXNwbGF5OworICAgICAgICBtRGlzcGxheSA9IG1Ob25EaXNwbGF5OworICAgICAgICBtTm9uRGlzcGxheSA9IHRlbXA7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3R5bGVDb2RlIHsKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBDT0xPUl9XSElURSA9IDA7CisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfR1JFRU4gPSAxOworICAgICAgICBzdGF0aWMgZmluYWwgaW50IENPTE9SX0JMVUUgPSAyOworICAgICAgICBzdGF0aWMgZmluYWwgaW50IENPTE9SX0NZQU4gPSAzOworICAgICAgICBzdGF0aWMgZmluYWwgaW50IENPTE9SX1JFRCA9IDQ7CisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfWUVMTE9XID0gNTsKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBDT0xPUl9NQUdFTlRBID0gNjsKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBDT0xPUl9JTlZBTElEID0gNzsKKworICAgICAgICBzdGF0aWMgZmluYWwgaW50IFNUWUxFX0lUQUxJQ1MgICA9IDB4MDAwMDAwMDE7CisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgU1RZTEVfVU5ERVJMSU5FID0gMHgwMDAwMDAwMjsKKworICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gbUNvbG9yTWFwID0geworICAgICAgICAgICAgIldISVRFIiwgIkdSRUVOIiwgIkJMVUUiLCAiQ1lBTiIsICJSRUQiLCAiWUVMTE9XIiwgIk1BR0VOVEEiLCAiSU5WQUxJRCIKKyAgICAgICAgfTsKKworICAgICAgICBmaW5hbCBpbnQgbVN0eWxlOworICAgICAgICBmaW5hbCBpbnQgbUNvbG9yOworCisgICAgICAgIHN0YXRpYyBTdHlsZUNvZGUgZnJvbUJ5dGUoYnl0ZSBkYXRhMikgeworICAgICAgICAgICAgaW50IHN0eWxlID0gMDsKKyAgICAgICAgICAgIGludCBjb2xvciA9IChkYXRhMiA+PiAxKSAmIDB4NzsKKworICAgICAgICAgICAgaWYgKChkYXRhMiAmIDB4MSkgIT0gMCkgeworICAgICAgICAgICAgICAgIHN0eWxlIHw9IFNUWUxFX1VOREVSTElORTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvbG9yID09IENPTE9SX0lOVkFMSUQpIHsKKyAgICAgICAgICAgICAgICAvLyBXSElURSBJVEFMSUNTCisgICAgICAgICAgICAgICAgY29sb3IgPSBDT0xPUl9XSElURTsKKyAgICAgICAgICAgICAgICBzdHlsZSB8PSBTVFlMRV9JVEFMSUNTOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbmV3IFN0eWxlQ29kZShzdHlsZSwgY29sb3IpOworICAgICAgICB9CisKKyAgICAgICAgU3R5bGVDb2RlKGludCBzdHlsZSwgaW50IGNvbG9yKSB7CisgICAgICAgICAgICBtU3R5bGUgPSBzdHlsZTsKKyAgICAgICAgICAgIG1Db2xvciA9IGNvbG9yOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBpc0l0YWxpY3MoKSB7CisgICAgICAgICAgICByZXR1cm4gKG1TdHlsZSAmIFNUWUxFX0lUQUxJQ1MpICE9IDA7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGlzVW5kZXJsaW5lKCkgeworICAgICAgICAgICAgcmV0dXJuIChtU3R5bGUgJiBTVFlMRV9VTkRFUkxJTkUpICE9IDA7CisgICAgICAgIH0KKworICAgICAgICBpbnQgZ2V0Q29sb3IoKSB7CisgICAgICAgICAgICByZXR1cm4gbUNvbG9yOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHN0ciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBzdHIuYXBwZW5kKCJ7Iik7CisgICAgICAgICAgICBzdHIuYXBwZW5kKG1Db2xvck1hcFttQ29sb3JdKTsKKyAgICAgICAgICAgIGlmICgobVN0eWxlICYgU1RZTEVfSVRBTElDUykgIT0gMCkgeworICAgICAgICAgICAgICAgIHN0ci5hcHBlbmQoIiwgSVRBTElDUyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChtU3R5bGUgJiBTVFlMRV9VTkRFUkxJTkUpICE9IDApIHsKKyAgICAgICAgICAgICAgICBzdHIuYXBwZW5kKCIsIFVOREVSTElORSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyLmFwcGVuZCgifSIpOworCisgICAgICAgICAgICByZXR1cm4gc3RyLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQQUMgZXh0ZW5kcyBTdHlsZUNvZGUgeworICAgICAgICBmaW5hbCBpbnQgbVJvdzsKKyAgICAgICAgZmluYWwgaW50IG1Db2w7CisKKyAgICAgICAgc3RhdGljIFBBQyBmcm9tQnl0ZXMoYnl0ZSBkYXRhMSwgYnl0ZSBkYXRhMikgeworICAgICAgICAgICAgaW50W10gcm93VGFibGUgPSB7MTEsIDEsIDMsIDEyLCAxNCwgNSwgNywgOX07CisgICAgICAgICAgICBpbnQgcm93ID0gcm93VGFibGVbZGF0YTEgJiAweDA3XSArICgoZGF0YTIgJiAweDIwKSA+PiA1KTsKKyAgICAgICAgICAgIGludCBzdHlsZSA9IDA7CisgICAgICAgICAgICBpZiAoKGRhdGEyICYgMSkgIT0gMCkgeworICAgICAgICAgICAgICAgIHN0eWxlIHw9IFNUWUxFX1VOREVSTElORTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoZGF0YTIgJiAweDEwKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgLy8gaW5kZW50IGNvZGUKKyAgICAgICAgICAgICAgICBpbnQgaW5kZW50ID0gKGRhdGEyID4+IDEpICYgMHg3OworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUEFDKHJvdywgaW5kZW50ICogNCwgc3R5bGUsIENPTE9SX1dISVRFKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gc3R5bGUgY29kZQorICAgICAgICAgICAgICAgIGludCBjb2xvciA9IChkYXRhMiA+PiAxKSAmIDB4NzsKKworICAgICAgICAgICAgICAgIGlmIChjb2xvciA9PSBDT0xPUl9JTlZBTElEKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdISVRFIElUQUxJQ1MKKyAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBDT0xPUl9XSElURTsKKyAgICAgICAgICAgICAgICAgICAgc3R5bGUgfD0gU1RZTEVfSVRBTElDUzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQQUMocm93LCAtMSwgc3R5bGUsIGNvbG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFBBQyhpbnQgcm93LCBpbnQgY29sLCBpbnQgc3R5bGUsIGludCBjb2xvcikgeworICAgICAgICAgICAgc3VwZXIoc3R5bGUsIGNvbG9yKTsKKyAgICAgICAgICAgIG1Sb3cgPSByb3c7CisgICAgICAgICAgICBtQ29sID0gY29sOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBpc0luZGVudFBBQygpIHsKKyAgICAgICAgICAgIHJldHVybiAobUNvbCA+PSAwKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBnZXRSb3coKSB7CisgICAgICAgICAgICByZXR1cm4gbVJvdzsKKyAgICAgICAgfQorCisgICAgICAgIGludCBnZXRDb2woKSB7CisgICAgICAgICAgICByZXR1cm4gbUNvbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoInslZCwgJWR9LCAlcyIsCisgICAgICAgICAgICAgICAgICAgIG1Sb3csIG1Db2wsIHN1cGVyLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTXV0YWJsZSB2ZXJzaW9uIG9mIEJhY2tncm91bmRTcGFuIHRvIGZhY2lsaXRhdGUgdGV4dCByZW5kZXJpbmcgd2l0aCBlZGdlIHN0eWxlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE11dGFibGVCYWNrZ3JvdW5kQ29sb3JTcGFuIGV4dGVuZHMgQ2hhcmFjdGVyU3R5bGUKKyAgICAgICAgICAgIGltcGxlbWVudHMgVXBkYXRlQXBwZWFyYW5jZSB7CisgICAgICAgIHByaXZhdGUgaW50IG1Db2xvcjsKKworICAgICAgICBwdWJsaWMgTXV0YWJsZUJhY2tncm91bmRDb2xvclNwYW4oaW50IGNvbG9yKSB7CisgICAgICAgICAgICBtQ29sb3IgPSBjb2xvcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEJhY2tncm91bmRDb2xvcihpbnQgY29sb3IpIHsKKyAgICAgICAgICAgIG1Db2xvciA9IGNvbG9yOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRCYWNrZ3JvdW5kQ29sb3IoKSB7CisgICAgICAgICAgICByZXR1cm4gbUNvbG9yOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZURyYXdTdGF0ZShUZXh0UGFpbnQgZHMpIHsKKyAgICAgICAgICAgIGRzLmJnQ29sb3IgPSBtQ29sb3I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDQ0xpbmVCdWlsZGVyIGtlZXBzIHRyYWNrIG9mIGRpc3BsYXlhYmxlIGNoYXJzLCBhcyB3ZWxsIGFzCisgICAgICogTWlkUm93IHN0eWxlcyBhbmQgUEFDcywgZm9yIGEgc2luZ2xlIGxpbmUgb2YgQ0MgbWVtb3J5LgorICAgICAqCisgICAgICogSXQgZ2VuZXJhdGVzIHN0eWxlZCB0ZXh0IHZpYSBnZXRTdHlsZWRUZXh0KCkgbWV0aG9kLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENDTGluZUJ1aWxkZXIgeworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZ0J1aWxkZXIgbURpc3BsYXlDaGFyczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHlsZUNvZGVbXSBtTWlkUm93U3R5bGVzOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0eWxlQ29kZVtdIG1QQUNTdHlsZXM7CisKKyAgICAgICAgQ0NMaW5lQnVpbGRlcihTdHJpbmcgc3RyKSB7CisgICAgICAgICAgICBtRGlzcGxheUNoYXJzID0gbmV3IFN0cmluZ0J1aWxkZXIoc3RyKTsKKyAgICAgICAgICAgIG1NaWRSb3dTdHlsZXMgPSBuZXcgU3R5bGVDb2RlW21EaXNwbGF5Q2hhcnMubGVuZ3RoKCldOworICAgICAgICAgICAgbVBBQ1N0eWxlcyA9IG5ldyBTdHlsZUNvZGVbbURpc3BsYXlDaGFycy5sZW5ndGgoKV07CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNldENoYXJBdChpbnQgaW5kZXgsIGNoYXIgY2gpIHsKKyAgICAgICAgICAgIG1EaXNwbGF5Q2hhcnMuc2V0Q2hhckF0KGluZGV4LCBjaCk7CisgICAgICAgICAgICBtTWlkUm93U3R5bGVzW2luZGV4XSA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNldE1pZFJvd0F0KGludCBpbmRleCwgU3R5bGVDb2RlIG0pIHsKKyAgICAgICAgICAgIG1EaXNwbGF5Q2hhcnMuc2V0Q2hhckF0KGluZGV4LCAnICcpOworICAgICAgICAgICAgbU1pZFJvd1N0eWxlc1tpbmRleF0gPSBtOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzZXRQQUNBdChpbnQgaW5kZXgsIFBBQyBwYWMpIHsKKyAgICAgICAgICAgIG1QQUNTdHlsZXNbaW5kZXhdID0gcGFjOworICAgICAgICB9CisKKyAgICAgICAgY2hhciBjaGFyQXQoaW50IGluZGV4KSB7CisgICAgICAgICAgICByZXR1cm4gbURpc3BsYXlDaGFycy5jaGFyQXQoaW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgaW50IGxlbmd0aCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtRGlzcGxheUNoYXJzLmxlbmd0aCgpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBhcHBseVN0eWxlU3BhbigKKyAgICAgICAgICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIHN0eWxlZFRleHQsCisgICAgICAgICAgICAgICAgU3R5bGVDb2RlIHMsIGludCBzdGFydCwgaW50IGVuZCkgeworICAgICAgICAgICAgaWYgKHMuaXNJdGFsaWNzKCkpIHsKKyAgICAgICAgICAgICAgICBzdHlsZWRUZXh0LnNldFNwYW4oCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3R5bGVTcGFuKGFuZHJvaWQuZ3JhcGhpY3MuVHlwZWZhY2UuSVRBTElDKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBlbmQsIFNwYW5uYWJsZS5TUEFOX0VYQ0xVU0lWRV9FWENMVVNJVkUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHMuaXNVbmRlcmxpbmUoKSkgeworICAgICAgICAgICAgICAgIHN0eWxlZFRleHQuc2V0U3BhbigKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBVbmRlcmxpbmVTcGFuKCksCisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgZW5kLCBTcGFubmFibGUuU1BBTl9FWENMVVNJVkVfRVhDTFVTSVZFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgZ2V0U3R5bGVkVGV4dChDYXB0aW9uU3R5bGUgY2FwdGlvblN0eWxlKSB7CisgICAgICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIHN0eWxlZFRleHQgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcihtRGlzcGxheUNoYXJzKTsKKyAgICAgICAgICAgIGludCBzdGFydCA9IC0xLCBuZXh0ID0gMDsKKyAgICAgICAgICAgIGludCBzdHlsZVN0YXJ0ID0gLTE7CisgICAgICAgICAgICBTdHlsZUNvZGUgY3VyU3R5bGUgPSBudWxsOworICAgICAgICAgICAgd2hpbGUgKG5leHQgPCBtRGlzcGxheUNoYXJzLmxlbmd0aCgpKSB7CisgICAgICAgICAgICAgICAgU3R5bGVDb2RlIG5ld1N0eWxlID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAobU1pZFJvd1N0eWxlc1tuZXh0XSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGFwcGx5IG1pZC1yb3cgc3R5bGUgY2hhbmdlCisgICAgICAgICAgICAgICAgICAgIG5ld1N0eWxlID0gbU1pZFJvd1N0eWxlc1tuZXh0XTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1QQUNTdHlsZXNbbmV4dF0gIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAmJiAoc3R5bGVTdGFydCA8IDAgfHwgc3RhcnQgPCAwKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBhcHBseSBQQUMgc3R5bGUgY2hhbmdlLCBvbmx5IGlmOgorICAgICAgICAgICAgICAgICAgICAvLyAxLiBubyBzdHlsZSBzZXQsIG9yCisgICAgICAgICAgICAgICAgICAgIC8vIDIuIHN0eWxlIHNldCwgYnV0IHByZXYgY2hhciBpcyBub25lLWRpc3BsYXlhYmxlCisgICAgICAgICAgICAgICAgICAgIG5ld1N0eWxlID0gbVBBQ1N0eWxlc1tuZXh0XTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG5ld1N0eWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY3VyU3R5bGUgPSBuZXdTdHlsZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlU3RhcnQgPj0gMCAmJiBzdGFydCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcHBseVN0eWxlU3BhbihzdHlsZWRUZXh0LCBuZXdTdHlsZSwgc3R5bGVTdGFydCwgbmV4dCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3R5bGVTdGFydCA9IG5leHQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG1EaXNwbGF5Q2hhcnMuY2hhckF0KG5leHQpICE9IFRTKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gbmV4dDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnQgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBpbnQgZXhwYW5kZWRTdGFydCA9IG1EaXNwbGF5Q2hhcnMuY2hhckF0KHN0YXJ0KSA9PSAnICcgPyBzdGFydCA6IHN0YXJ0IC0gMTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGV4cGFuZGVkRW5kID0gbURpc3BsYXlDaGFycy5jaGFyQXQobmV4dCAtIDEpID09ICcgJyA/IG5leHQgOiBuZXh0ICsgMTsKKyAgICAgICAgICAgICAgICAgICAgc3R5bGVkVGV4dC5zZXRTcGFuKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNdXRhYmxlQmFja2dyb3VuZENvbG9yU3BhbihjYXB0aW9uU3R5bGUuYmFja2dyb3VuZENvbG9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRlZFN0YXJ0LCBleHBhbmRlZEVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGFubmFibGUuU1BBTl9FWENMVVNJVkVfRVhDTFVTSVZFKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlU3RhcnQgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlTdHlsZVNwYW4oc3R5bGVkVGV4dCwgY3VyU3R5bGUsIHN0eWxlU3RhcnQsIGV4cGFuZGVkRW5kKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzdGFydCA9IC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBzdHlsZWRUZXh0OworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDQ01lbW9yeSBtb2RlbHMgYSBjb25zb2xlLXN0eWxlIGRpc3BsYXkuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ0NNZW1vcnkgeworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQmxhbmtMaW5lOworICAgICAgICBwcml2YXRlIGZpbmFsIENDTGluZUJ1aWxkZXJbXSBtTGluZXMgPSBuZXcgQ0NMaW5lQnVpbGRlcltNQVhfUk9XUyArIDJdOworICAgICAgICBwcml2YXRlIGludCBtUm93OworICAgICAgICBwcml2YXRlIGludCBtQ29sOworCisgICAgICAgIENDTWVtb3J5KCkgeworICAgICAgICAgICAgY2hhcltdIGJsYW5rID0gbmV3IGNoYXJbTUFYX0NPTFMgKyAyXTsKKyAgICAgICAgICAgIEFycmF5cy5maWxsKGJsYW5rLCBUUyk7CisgICAgICAgICAgICBtQmxhbmtMaW5lID0gbmV3IFN0cmluZyhibGFuayk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGVyYXNlKCkgeworICAgICAgICAgICAgLy8gZXJhc2UgYWxsIGxpbmVzCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1MaW5lcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIG1MaW5lc1tpXSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUm93ID0gTUFYX1JPV1M7CisgICAgICAgICAgICBtQ29sID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgZGVyKCkgeworICAgICAgICAgICAgaWYgKG1MaW5lc1ttUm93XSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQ29sOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1MaW5lc1ttUm93XS5jaGFyQXQoaSkgIT0gVFMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBtQ29sOyBqIDwgbUxpbmVzW21Sb3ddLmxlbmd0aCgpOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGluZXNbal0uc2V0Q2hhckF0KGosIFRTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtTGluZXNbbVJvd10gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdm9pZCB0YWIoaW50IHRhYnMpIHsKKyAgICAgICAgICAgIG1vdmVDdXJzb3JCeUNvbCh0YWJzKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgYnMoKSB7CisgICAgICAgICAgICBtb3ZlQ3Vyc29yQnlDb2woLTEpOworICAgICAgICAgICAgaWYgKG1MaW5lc1ttUm93XSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUxpbmVzW21Sb3ddLnNldENoYXJBdChtQ29sLCBUUyk7CisgICAgICAgICAgICAgICAgaWYgKG1Db2wgPT0gTUFYX0NPTFMgLSAxKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNwZWMgcmVjb21tZW5kYXRpb246CisgICAgICAgICAgICAgICAgICAgIC8vIGlmIGN1cnNvciB3YXMgYXQgY29sIDMyLCBtb3ZlIGN1cnNvcgorICAgICAgICAgICAgICAgICAgICAvLyBiYWNrIHRvIGNvbCAzMSBhbmQgZXJhc2UgYm90aCBjb2wgMzEmMzIKKyAgICAgICAgICAgICAgICAgICAgbUxpbmVzW21Sb3ddLnNldENoYXJBdChNQVhfQ09MUywgVFMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgY3IoKSB7CisgICAgICAgICAgICBtb3ZlQ3Vyc29yVG8obVJvdyArIDEsIDEpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCByb2xsVXAoaW50IHdpbmRvd1NpemUpIHsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8PSBtUm93IC0gd2luZG93U2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgbUxpbmVzW2ldID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBzdGFydFJvdyA9IG1Sb3cgLSB3aW5kb3dTaXplICsgMTsKKyAgICAgICAgICAgIGlmIChzdGFydFJvdyA8IDEpIHsKKyAgICAgICAgICAgICAgICBzdGFydFJvdyA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGkgPSBzdGFydFJvdzsgaSA8IG1Sb3c7IGkrKykgeworICAgICAgICAgICAgICAgIG1MaW5lc1tpXSA9IG1MaW5lc1tpICsgMV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGkgPSBtUm93OyBpIDwgbUxpbmVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgLy8gY2xlYXIgYmFzZSByb3cKKyAgICAgICAgICAgICAgICBtTGluZXNbaV0gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gZGVmYXVsdCB0byBjb2wgMSwgaW4gY2FzZSBQQUMgaXMgbm90IHNlbnQKKyAgICAgICAgICAgIG1Db2wgPSAxOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3cml0ZVRleHQoU3RyaW5nIHRleHQpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGV4dC5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgZ2V0TGluZUJ1ZmZlcihtUm93KS5zZXRDaGFyQXQobUNvbCwgdGV4dC5jaGFyQXQoaSkpOworICAgICAgICAgICAgICAgIG1vdmVDdXJzb3JCeUNvbCgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgd3JpdGVNaWRSb3dDb2RlKFN0eWxlQ29kZSBtKSB7CisgICAgICAgICAgICBnZXRMaW5lQnVmZmVyKG1Sb3cpLnNldE1pZFJvd0F0KG1Db2wsIG0pOworICAgICAgICAgICAgbW92ZUN1cnNvckJ5Q29sKDEpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3cml0ZVBBQyhQQUMgcGFjKSB7CisgICAgICAgICAgICBpZiAocGFjLmlzSW5kZW50UEFDKCkpIHsKKyAgICAgICAgICAgICAgICBtb3ZlQ3Vyc29yVG8ocGFjLmdldFJvdygpLCBwYWMuZ2V0Q29sKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtb3ZlQ3Vyc29yVG8ocGFjLmdldFJvdygpLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdldExpbmVCdWZmZXIobVJvdykuc2V0UEFDQXQobUNvbCwgcGFjKTsKKyAgICAgICAgfQorCisgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXJbXSBnZXRTdHlsZWRUZXh0KENhcHRpb25TdHlsZSBjYXB0aW9uU3R5bGUpIHsKKyAgICAgICAgICAgIEFycmF5TGlzdDxTcGFubmFibGVTdHJpbmdCdWlsZGVyPiByb3dzID0gbmV3IEFycmF5TGlzdDw+KE1BWF9ST1dTKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IE1BWF9ST1dTOyBpKyspIHsKKyAgICAgICAgICAgICAgICByb3dzLmFkZChtTGluZXNbaV0gIT0gbnVsbCA/CisgICAgICAgICAgICAgICAgICAgICAgICBtTGluZXNbaV0uZ2V0U3R5bGVkVGV4dChjYXB0aW9uU3R5bGUpIDogbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcm93cy50b0FycmF5KG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyW01BWF9ST1dTXSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgY2xhbXAoaW50IHgsIGludCBtaW4sIGludCBtYXgpIHsKKyAgICAgICAgICAgIHJldHVybiB4IDwgbWluID8gbWluIDogKHggPiBtYXggPyBtYXggOiB4KTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBtb3ZlQ3Vyc29yVG8oaW50IHJvdywgaW50IGNvbCkgeworICAgICAgICAgICAgbVJvdyA9IGNsYW1wKHJvdywgMSwgTUFYX1JPV1MpOworICAgICAgICAgICAgbUNvbCA9IGNsYW1wKGNvbCwgMSwgTUFYX0NPTFMpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIG1vdmVDdXJzb3JUb1JvdyhpbnQgcm93KSB7CisgICAgICAgICAgICBtUm93ID0gY2xhbXAocm93LCAxLCBNQVhfUk9XUyk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgbW92ZUN1cnNvckJ5Q29sKGludCBjb2wpIHsKKyAgICAgICAgICAgIG1Db2wgPSBjbGFtcChtQ29sICsgY29sLCAxLCBNQVhfQ09MUyk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgbW92ZUJhc2VsaW5lVG8oaW50IGJhc2VSb3csIGludCB3aW5kb3dTaXplKSB7CisgICAgICAgICAgICBpZiAobVJvdyA9PSBiYXNlUm93KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGFjdHVhbFdpbmRvd1NpemUgPSB3aW5kb3dTaXplOworICAgICAgICAgICAgaWYgKGJhc2VSb3cgPCBhY3R1YWxXaW5kb3dTaXplKSB7CisgICAgICAgICAgICAgICAgYWN0dWFsV2luZG93U2l6ZSA9IGJhc2VSb3c7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVJvdyA8IGFjdHVhbFdpbmRvd1NpemUpIHsKKyAgICAgICAgICAgICAgICBhY3R1YWxXaW5kb3dTaXplID0gbVJvdzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBpZiAoYmFzZVJvdyA8IG1Sb3cpIHsKKyAgICAgICAgICAgICAgICAvLyBjb3B5IGZyb20gYm90dG9tIHRvIHRvcCByb3cKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSBhY3R1YWxXaW5kb3dTaXplIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgbUxpbmVzW2Jhc2VSb3cgLSBpXSA9IG1MaW5lc1ttUm93IC0gaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBjb3B5IGZyb20gdG9wIHRvIGJvdHRvbSByb3cKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYWN0dWFsV2luZG93U2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIG1MaW5lc1tiYXNlUm93IC0gaV0gPSBtTGluZXNbbVJvdyAtIGldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGNsZWFyIHJlc3Qgb2YgdGhlIHJvd3MKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gYmFzZVJvdyAtIHdpbmRvd1NpemU7IGkrKykgeworICAgICAgICAgICAgICAgIG1MaW5lc1tpXSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGkgPSBiYXNlUm93ICsgMTsgaSA8IG1MaW5lcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIG1MaW5lc1tpXSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIENDTGluZUJ1aWxkZXIgZ2V0TGluZUJ1ZmZlcihpbnQgcm93KSB7CisgICAgICAgICAgICBpZiAobUxpbmVzW3Jvd10gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1MaW5lc1tyb3ddID0gbmV3IENDTGluZUJ1aWxkZXIobUJsYW5rTGluZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbUxpbmVzW3Jvd107CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIENDRGF0YSBwYXJzZXMgdGhlIHJhdyBDQyBieXRlIHBhaXIgaW50byBkaXNwbGF5YWJsZSBjaGFycywKKyAgICAgKiBtaXNjIGNvbnRyb2wgY29kZXMsIE1pZC1Sb3cgb3IgUHJlYW1ibGUgQWRkcmVzcyBDb2Rlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDQ0RhdGEgeworICAgICAgICBwcml2YXRlIGZpbmFsIGJ5dGUgbVR5cGU7CisgICAgICAgIHByaXZhdGUgZmluYWwgYnl0ZSBtRGF0YTE7CisgICAgICAgIHByaXZhdGUgZmluYWwgYnl0ZSBtRGF0YTI7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gbUN0cmxDb2RlTWFwID0geworICAgICAgICAgICAgIlJDTCIsICJCUyIgLCAiQU9GIiwgIkFPTiIsCisgICAgICAgICAgICAiREVSIiwgIlJVMiIsICJSVTMiLCAiUlU0IiwKKyAgICAgICAgICAgICJGT04iLCAiUkRDIiwgIlRSIiAsICJSVEQiLAorICAgICAgICAgICAgIkVETSIsICJDUiIgLCAiRU5NIiwgIkVPQyIsCisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gbVNwZWNpYWxDaGFyTWFwID0geworICAgICAgICAgICAgIlx1MDBBRSIsCisgICAgICAgICAgICAiXHUwMEIwIiwKKyAgICAgICAgICAgICJcdTAwQkQiLAorICAgICAgICAgICAgIlx1MDBCRiIsCisgICAgICAgICAgICAiXHUyMTIyIiwKKyAgICAgICAgICAgICJcdTAwQTIiLAorICAgICAgICAgICAgIlx1MDBBMyIsCisgICAgICAgICAgICAiXHUyNjZBIiwgLy8gRWlnaHRoIG5vdGUKKyAgICAgICAgICAgICJcdTAwRTAiLAorICAgICAgICAgICAgIlx1MDBBMCIsIC8vIFRyYW5zcGFyZW50IHNwYWNlCisgICAgICAgICAgICAiXHUwMEU4IiwKKyAgICAgICAgICAgICJcdTAwRTIiLAorICAgICAgICAgICAgIlx1MDBFQSIsCisgICAgICAgICAgICAiXHUwMEVFIiwKKyAgICAgICAgICAgICJcdTAwRjQiLAorICAgICAgICAgICAgIlx1MDBGQiIsCisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gbVNwYW5pc2hDaGFyTWFwID0geworICAgICAgICAgICAgLy8gU3BhbmlzaCBhbmQgbWlzYyBjaGFycworICAgICAgICAgICAgIlx1MDBDMSIsIC8vIEEKKyAgICAgICAgICAgICJcdTAwQzkiLCAvLyBFCisgICAgICAgICAgICAiXHUwMEQzIiwgLy8gSQorICAgICAgICAgICAgIlx1MDBEQSIsIC8vIE8KKyAgICAgICAgICAgICJcdTAwREMiLCAvLyBVCisgICAgICAgICAgICAiXHUwMEZDIiwgLy8gdQorICAgICAgICAgICAgIlx1MjAxOCIsIC8vIG9wZW5pbmcgc2luZ2xlIHF1b3RlCisgICAgICAgICAgICAiXHUwMEExIiwgLy8gaW52ZXJ0ZWQgZXhjbGFtYXRpb24gbWFyaworICAgICAgICAgICAgIioiLAorICAgICAgICAgICAgIiciLAorICAgICAgICAgICAgIlx1MjAxNCIsIC8vIGVtIGRhc2gKKyAgICAgICAgICAgICJcdTAwQTkiLCAvLyBDb3B5cmlnaHQKKyAgICAgICAgICAgICJcdTIxMjAiLCAvLyBTZXJ2aWNlbWFyaworICAgICAgICAgICAgIlx1MjAyMiIsIC8vIHJvdW5kIGJ1bGxldAorICAgICAgICAgICAgIlx1MjAxQyIsIC8vIG9wZW5pbmcgZG91YmxlIHF1b3RlCisgICAgICAgICAgICAiXHUyMDFEIiwgLy8gY2xvc2luZyBkb3VibGUgcXVvdGUKKyAgICAgICAgICAgIC8vIEZyZW5jaAorICAgICAgICAgICAgIlx1MDBDMCIsCisgICAgICAgICAgICAiXHUwMEMyIiwKKyAgICAgICAgICAgICJcdTAwQzciLAorICAgICAgICAgICAgIlx1MDBDOCIsCisgICAgICAgICAgICAiXHUwMENBIiwKKyAgICAgICAgICAgICJcdTAwQ0IiLAorICAgICAgICAgICAgIlx1MDBFQiIsCisgICAgICAgICAgICAiXHUwMENFIiwKKyAgICAgICAgICAgICJcdTAwQ0YiLAorICAgICAgICAgICAgIlx1MDBFRiIsCisgICAgICAgICAgICAiXHUwMEQ0IiwKKyAgICAgICAgICAgICJcdTAwRDkiLAorICAgICAgICAgICAgIlx1MDBGOSIsCisgICAgICAgICAgICAiXHUwMERCIiwKKyAgICAgICAgICAgICJcdTAwQUIiLAorICAgICAgICAgICAgIlx1MDBCQiIKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBtUHJvdHVndWVzZUNoYXJNYXAgPSB7CisgICAgICAgICAgICAvLyBQb3J0dWd1ZXNlCisgICAgICAgICAgICAiXHUwMEMzIiwKKyAgICAgICAgICAgICJcdTAwRTMiLAorICAgICAgICAgICAgIlx1MDBDRCIsCisgICAgICAgICAgICAiXHUwMENDIiwKKyAgICAgICAgICAgICJcdTAwRUMiLAorICAgICAgICAgICAgIlx1MDBEMiIsCisgICAgICAgICAgICAiXHUwMEYyIiwKKyAgICAgICAgICAgICJcdTAwRDUiLAorICAgICAgICAgICAgIlx1MDBGNSIsCisgICAgICAgICAgICAieyIsCisgICAgICAgICAgICAifSIsCisgICAgICAgICAgICAiXFwiLAorICAgICAgICAgICAgIl4iLAorICAgICAgICAgICAgIl8iLAorICAgICAgICAgICAgInwiLAorICAgICAgICAgICAgIn4iLAorICAgICAgICAgICAgLy8gR2VybWFuIGFuZCBtaXNjIGNoYXJzCisgICAgICAgICAgICAiXHUwMEM0IiwKKyAgICAgICAgICAgICJcdTAwRTQiLAorICAgICAgICAgICAgIlx1MDBENiIsCisgICAgICAgICAgICAiXHUwMEY2IiwKKyAgICAgICAgICAgICJcdTAwREYiLAorICAgICAgICAgICAgIlx1MDBBNSIsCisgICAgICAgICAgICAiXHUwMEE0IiwKKyAgICAgICAgICAgICJcdTI1MDIiLCAvLyB2ZXJ0aWNhbCBiYXIKKyAgICAgICAgICAgICJcdTAwQzUiLAorICAgICAgICAgICAgIlx1MDBFNSIsCisgICAgICAgICAgICAiXHUwMEQ4IiwKKyAgICAgICAgICAgICJcdTAwRjgiLAorICAgICAgICAgICAgIlx1MjUwQyIsIC8vIHRvcC1sZWZ0IGNvcm5lcgorICAgICAgICAgICAgIlx1MjUxMCIsIC8vIHRvcC1yaWdodCBjb3JuZXIKKyAgICAgICAgICAgICJcdTI1MTQiLCAvLyBsb3dlci1sZWZ0IGNvcm5lcgorICAgICAgICAgICAgIlx1MjUxOCIsIC8vIGxvd2VyLXJpZ2h0IGNvcm5lcgorICAgICAgICB9OworCisgICAgICAgIHN0YXRpYyBDQ0RhdGFbXSBmcm9tQnl0ZUFycmF5KGJ5dGVbXSBkYXRhKSB7CisgICAgICAgICAgICBDQ0RhdGFbXSBjY0RhdGEgPSBuZXcgQ0NEYXRhW2RhdGEubGVuZ3RoIC8gM107CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2NEYXRhLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgY2NEYXRhW2ldID0gbmV3IENDRGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbaSAqIDNdLAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtpICogMyArIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtpICogMyArIDJdKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGNjRGF0YTsKKyAgICAgICAgfQorCisgICAgICAgIENDRGF0YShieXRlIHR5cGUsIGJ5dGUgZGF0YTEsIGJ5dGUgZGF0YTIpIHsKKyAgICAgICAgICAgIG1UeXBlID0gdHlwZTsKKyAgICAgICAgICAgIG1EYXRhMSA9IGRhdGExOworICAgICAgICAgICAgbURhdGEyID0gZGF0YTI7CisgICAgICAgIH0KKworICAgICAgICBpbnQgZ2V0Q3RybENvZGUoKSB7CisgICAgICAgICAgICBpZiAoKG1EYXRhMSA9PSAweDE0IHx8IG1EYXRhMSA9PSAweDFjKQorICAgICAgICAgICAgICAgICAgICAmJiBtRGF0YTIgPj0gMHgyMCAmJiBtRGF0YTIgPD0gMHgyZikgeworICAgICAgICAgICAgICAgIHJldHVybiBtRGF0YTI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDsKKyAgICAgICAgfQorCisgICAgICAgIFN0eWxlQ29kZSBnZXRNaWRSb3coKSB7CisgICAgICAgICAgICAvLyBvbmx5IHN1cHBvcnQgc3RhbmRhcmQgTWlkLXJvdyBjb2RlcywgaWdub3JlCisgICAgICAgICAgICAvLyBvcHRpb25hbCBiYWNrZ3JvdW5kL2ZvcmVncm91bmQgbWlkLXJvdyBjb2RlcworICAgICAgICAgICAgaWYgKChtRGF0YTEgPT0gMHgxMSB8fCBtRGF0YTEgPT0gMHgxOSkKKyAgICAgICAgICAgICAgICAgICAgJiYgbURhdGEyID49IDB4MjAgJiYgbURhdGEyIDw9IDB4MmYpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gU3R5bGVDb2RlLmZyb21CeXRlKG1EYXRhMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIFBBQyBnZXRQQUMoKSB7CisgICAgICAgICAgICBpZiAoKG1EYXRhMSAmIDB4NzApID09IDB4MTAKKyAgICAgICAgICAgICAgICAgICAgJiYgKG1EYXRhMiAmIDB4NDApID09IDB4NDAKKyAgICAgICAgICAgICAgICAgICAgJiYgKChtRGF0YTEgJiAweDA3KSAhPSAwIHx8IChtRGF0YTIgJiAweDIwKSA9PSAwKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBQQUMuZnJvbUJ5dGVzKG1EYXRhMSwgbURhdGEyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgaW50IGdldFRhYk9mZnNldCgpIHsKKyAgICAgICAgICAgIGlmICgobURhdGExID09IDB4MTcgfHwgbURhdGExID09IDB4MWYpCisgICAgICAgICAgICAgICAgICAgICYmIG1EYXRhMiA+PSAweDIxICYmIG1EYXRhMiA8PSAweDIzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1EYXRhMiAmIDB4MzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBpc0Rpc3BsYXlhYmxlQ2hhcigpIHsKKyAgICAgICAgICAgIHJldHVybiBpc0Jhc2ljQ2hhcigpIHx8IGlzU3BlY2lhbENoYXIoKSB8fCBpc0V4dGVuZGVkQ2hhcigpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGdldERpc3BsYXlUZXh0KCkgeworICAgICAgICAgICAgU3RyaW5nIHN0ciA9IGdldEJhc2ljQ2hhcnMoKTsKKworICAgICAgICAgICAgaWYgKHN0ciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgc3RyID0gIGdldFNwZWNpYWxDaGFyKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoc3RyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyID0gZ2V0RXh0ZW5kZWRDaGFyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gc3RyOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgY3RybENvZGVUb1N0cmluZyhpbnQgY3RybENvZGUpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ3RybENvZGVNYXBbY3RybENvZGUgLSAweDIwXTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc0Jhc2ljQ2hhcigpIHsKKyAgICAgICAgICAgIHJldHVybiBtRGF0YTEgPj0gMHgyMCAmJiBtRGF0YTEgPD0gMHg3ZjsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc1NwZWNpYWxDaGFyKCkgeworICAgICAgICAgICAgcmV0dXJuICgobURhdGExID09IDB4MTEgfHwgbURhdGExID09IDB4MTkpCisgICAgICAgICAgICAgICAgICAgICYmIG1EYXRhMiA+PSAweDMwICYmIG1EYXRhMiA8PSAweDNmKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc0V4dGVuZGVkQ2hhcigpIHsKKyAgICAgICAgICAgIHJldHVybiAoKG1EYXRhMSA9PSAweDEyIHx8IG1EYXRhMSA9PSAweDFBCisgICAgICAgICAgICAgICAgICAgIHx8IG1EYXRhMSA9PSAweDEzIHx8IG1EYXRhMSA9PSAweDFCKQorICAgICAgICAgICAgICAgICAgICAmJiBtRGF0YTIgPj0gMHgyMCAmJiBtRGF0YTIgPD0gMHgzZik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGNoYXIgZ2V0QmFzaWNDaGFyKGJ5dGUgZGF0YSkgeworICAgICAgICAgICAgY2hhciBjOworICAgICAgICAgICAgLy8gcmVwbGFjZSB0aGUgbm9uLUFTQ0lJIG9uZXMKKyAgICAgICAgICAgIHN3aXRjaCAoZGF0YSkgeworICAgICAgICAgICAgICAgIGNhc2UgMHgyQTogYyA9ICdcdTAwRTEnOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDB4NUM6IGMgPSAnXHUwMEU5JzsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweDVFOiBjID0gJ1x1MDBFRCc7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMHg1RjogYyA9ICdcdTAwRjMnOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDB4NjA6IGMgPSAnXHUwMEZBJzsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweDdCOiBjID0gJ1x1MDBFNyc7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMHg3QzogYyA9ICdcdTAwRjcnOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDB4N0Q6IGMgPSAnXHUwMEQxJzsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweDdFOiBjID0gJ1x1MDBGMSc7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMHg3RjogYyA9ICdcdTI1ODgnOyBicmVhazsgLy8gRnVsbCBibG9jaworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGMgPSAoY2hhcikgZGF0YTsgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYzsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGdldEJhc2ljQ2hhcnMoKSB7CisgICAgICAgICAgICBpZiAobURhdGExID49IDB4MjAgJiYgbURhdGExIDw9IDB4N2YpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigyKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChnZXRCYXNpY0NoYXIobURhdGExKSk7CisgICAgICAgICAgICAgICAgaWYgKG1EYXRhMiA+PSAweDIwICYmIG1EYXRhMiA8PSAweDdmKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGdldEJhc2ljQ2hhcihtRGF0YTIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFN0cmluZyBnZXRTcGVjaWFsQ2hhcigpIHsKKyAgICAgICAgICAgIGlmICgobURhdGExID09IDB4MTEgfHwgbURhdGExID09IDB4MTkpCisgICAgICAgICAgICAgICAgICAgICYmIG1EYXRhMiA+PSAweDMwICYmIG1EYXRhMiA8PSAweDNmKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TcGVjaWFsQ2hhck1hcFttRGF0YTIgLSAweDMwXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFN0cmluZyBnZXRFeHRlbmRlZENoYXIoKSB7CisgICAgICAgICAgICBpZiAoKG1EYXRhMSA9PSAweDEyIHx8IG1EYXRhMSA9PSAweDFBKQorICAgICAgICAgICAgICAgICAgICAmJiBtRGF0YTIgPj0gMHgyMCAmJiBtRGF0YTIgPD0gMHgzZil7CisgICAgICAgICAgICAgICAgLy8gMSBTcGFuaXNoL0ZyZW5jaCBjaGFyCisgICAgICAgICAgICAgICAgcmV0dXJuIG1TcGFuaXNoQ2hhck1hcFttRGF0YTIgLSAweDIwXTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKG1EYXRhMSA9PSAweDEzIHx8IG1EYXRhMSA9PSAweDFCKQorICAgICAgICAgICAgICAgICAgICAmJiBtRGF0YTIgPj0gMHgyMCAmJiBtRGF0YTIgPD0gMHgzZil7CisgICAgICAgICAgICAgICAgLy8gMSBQb3J0dWd1ZXNlL0dlcm1hbi9EYW5pc2ggY2hhcgorICAgICAgICAgICAgICAgIHJldHVybiBtUHJvdHVndWVzZUNoYXJNYXBbbURhdGEyIC0gMHgyMF07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICBTdHJpbmcgc3RyOworCisgICAgICAgICAgICBpZiAobURhdGExIDwgMHgxMCAmJiBtRGF0YTIgPCAweDEwKSB7CisgICAgICAgICAgICAgICAgLy8gTnVsbCBQYWQsIGlnbm9yZQorICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJbJWRdTnVsbDogJTAyeCAlMDJ4IiwgbVR5cGUsIG1EYXRhMSwgbURhdGEyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IGN0cmxDb2RlID0gZ2V0Q3RybENvZGUoKTsKKyAgICAgICAgICAgIGlmIChjdHJsQ29kZSAhPSBJTlZBTElEKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIlslZF0lcyIsIG1UeXBlLCBjdHJsQ29kZVRvU3RyaW5nKGN0cmxDb2RlKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCB0YWJPZmZzZXQgPSBnZXRUYWJPZmZzZXQoKTsKKyAgICAgICAgICAgIGlmICh0YWJPZmZzZXQgPiAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIlslZF1UYWIlZCIsIG1UeXBlLCB0YWJPZmZzZXQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBQQUMgcGFjID0gZ2V0UEFDKCk7CisgICAgICAgICAgICBpZiAocGFjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiWyVkXVBBQzogJXMiLCBtVHlwZSwgcGFjLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHlsZUNvZGUgbSA9IGdldE1pZFJvdygpOworICAgICAgICAgICAgaWYgKG0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJbJWRdTWlkLXJvdzogJXMiLCBtVHlwZSwgbS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGlzRGlzcGxheWFibGVDaGFyKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiWyVkXURpc3BsYXlhYmxlOiAlcyAoJTAyeCAlMDJ4KSIsCisgICAgICAgICAgICAgICAgICAgICAgICBtVHlwZSwgZ2V0RGlzcGxheVRleHQoKSwgbURhdGExLCBtRGF0YTIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiWyVkXUludmFsaWQ6ICUwMnggJTAyeCIsIG1UeXBlLCBtRGF0YTEsIG1EYXRhMik7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogV2lkZ2V0IGNhcGFibGUgb2YgcmVuZGVyaW5nIENFQS02MDggY2xvc2VkIGNhcHRpb25zLgorICovCitjbGFzcyBDZWE2MDhDQ1dpZGdldCBleHRlbmRzIENsb3NlZENhcHRpb25XaWRnZXQgaW1wbGVtZW50cyBDZWE2MDhDQ1BhcnNlci5EaXNwbGF5TGlzdGVuZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFJlY3QgbVRleHRCb3VuZHMgPSBuZXcgUmVjdCgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBtRHVtbXlUZXh0ID0gIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQiOworCisgICAgcHVibGljIENlYTYwOENDV2lkZ2V0KENvbnRleHQgY29udGV4dCkgeworICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBDZWE2MDhDQ1dpZGdldChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2VhNjA4Q0NXaWRnZXQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZSkgeworICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZSwgMCk7CisgICAgfQorCisgICAgcHVibGljIENlYTYwOENDV2lkZ2V0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyLAorICAgICAgICAgICAgaW50IGRlZlN0eWxlUmVzKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIsIGRlZlN0eWxlUmVzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2xvc2VkQ2FwdGlvbkxheW91dCBjcmVhdGVDYXB0aW9uTGF5b3V0KENvbnRleHQgY29udGV4dCkgeworICAgICAgICByZXR1cm4gbmV3IENDTGF5b3V0KGNvbnRleHQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRGlzcGxheUNoYW5nZWQoU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcltdIHN0eWxlZFRleHRzKSB7CisgICAgICAgICgoQ0NMYXlvdXQpIG1DbG9zZWRDYXB0aW9uTGF5b3V0KS51cGRhdGUoc3R5bGVkVGV4dHMpOworCisgICAgICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbUxpc3RlbmVyLm9uQ2hhbmdlZCh0aGlzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDYXB0aW9uU3R5bGUgZ2V0Q2FwdGlvblN0eWxlKCkgeworICAgICAgICByZXR1cm4gbUNhcHRpb25TdHlsZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDQ0xpbmVCb3ggZXh0ZW5kcyBUZXh0VmlldyB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IEZPTlRfUEFERElOR19SQVRJTyA9IDAuNzVmOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBFREdFX09VVExJTkVfUkFUSU8gPSAwLjFmOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBFREdFX1NIQURPV19SQVRJTyA9IDAuMDVmOworICAgICAgICBwcml2YXRlIGZsb2F0IG1PdXRsaW5lV2lkdGg7CisgICAgICAgIHByaXZhdGUgZmxvYXQgbVNoYWRvd1JhZGl1czsKKyAgICAgICAgcHJpdmF0ZSBmbG9hdCBtU2hhZG93T2Zmc2V0OworCisgICAgICAgIHByaXZhdGUgaW50IG1UZXh0Q29sb3IgPSBDb2xvci5XSElURTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUJnQ29sb3IgPSBDb2xvci5CTEFDSzsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUVkZ2VUeXBlID0gQ2FwdGlvblN0eWxlLkVER0VfVFlQRV9OT05FOworICAgICAgICBwcml2YXRlIGludCBtRWRnZUNvbG9yID0gQ29sb3IuVFJBTlNQQVJFTlQ7CisKKyAgICAgICAgQ0NMaW5lQm94KENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgICAgICBzZXRHcmF2aXR5KEdyYXZpdHkuQ0VOVEVSKTsKKyAgICAgICAgICAgIHNldEJhY2tncm91bmRDb2xvcihDb2xvci5UUkFOU1BBUkVOVCk7CisgICAgICAgICAgICBzZXRUZXh0Q29sb3IoQ29sb3IuV0hJVEUpOworICAgICAgICAgICAgc2V0VHlwZWZhY2UoVHlwZWZhY2UuTU9OT1NQQUNFKTsKKyAgICAgICAgICAgIHNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworCisgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZXMgcmVzID0gZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpOworCisgICAgICAgICAgICAvLyBnZXQgdGhlIGRlZmF1bHQgKHdpbGwgYmUgdXBkYXRlZCBsYXRlciBkdXJpbmcgbWVhc3VyZSkKKyAgICAgICAgICAgIG1PdXRsaW5lV2lkdGggPSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRpbWVuLnN1YnRpdGxlX291dGxpbmVfd2lkdGgpOworICAgICAgICAgICAgbVNoYWRvd1JhZGl1cyA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuZGltZW4uc3VidGl0bGVfc2hhZG93X3JhZGl1cyk7CisgICAgICAgICAgICBtU2hhZG93T2Zmc2V0ID0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kaW1lbi5zdWJ0aXRsZV9zaGFkb3dfb2Zmc2V0KTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2V0Q2FwdGlvblN0eWxlKENhcHRpb25TdHlsZSBjYXB0aW9uU3R5bGUpIHsKKyAgICAgICAgICAgIG1UZXh0Q29sb3IgPSBjYXB0aW9uU3R5bGUuZm9yZWdyb3VuZENvbG9yOworICAgICAgICAgICAgbUJnQ29sb3IgPSBjYXB0aW9uU3R5bGUuYmFja2dyb3VuZENvbG9yOworICAgICAgICAgICAgbUVkZ2VUeXBlID0gY2FwdGlvblN0eWxlLmVkZ2VUeXBlOworICAgICAgICAgICAgbUVkZ2VDb2xvciA9IGNhcHRpb25TdHlsZS5lZGdlQ29sb3I7CisKKyAgICAgICAgICAgIHNldFRleHRDb2xvcihtVGV4dENvbG9yKTsKKyAgICAgICAgICAgIGlmIChtRWRnZVR5cGUgPT0gQ2FwdGlvblN0eWxlLkVER0VfVFlQRV9EUk9QX1NIQURPVykgeworICAgICAgICAgICAgICAgIHNldFNoYWRvd0xheWVyKG1TaGFkb3dSYWRpdXMsIG1TaGFkb3dPZmZzZXQsIG1TaGFkb3dPZmZzZXQsIG1FZGdlQ29sb3IpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzZXRTaGFkb3dMYXllcigwLCAwLCAwLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgeworICAgICAgICAgICAgZmxvYXQgZm9udFNpemUgPSBNZWFzdXJlU3BlYy5nZXRTaXplKGhlaWdodE1lYXN1cmVTcGVjKSAqIEZPTlRfUEFERElOR19SQVRJTzsKKyAgICAgICAgICAgIHNldFRleHRTaXplKFR5cGVkVmFsdWUuQ09NUExFWF9VTklUX1BYLCBmb250U2l6ZSk7CisKKyAgICAgICAgICAgIG1PdXRsaW5lV2lkdGggPSBFREdFX09VVExJTkVfUkFUSU8gKiBmb250U2l6ZSArIDEuMGY7CisgICAgICAgICAgICBtU2hhZG93UmFkaXVzID0gRURHRV9TSEFET1dfUkFUSU8gKiBmb250U2l6ZSArIDEuMGY7OworICAgICAgICAgICAgbVNoYWRvd09mZnNldCA9IG1TaGFkb3dSYWRpdXM7CisKKyAgICAgICAgICAgIC8vIHNldCBmb250IHNjYWxlIGluIHRoZSBYIGRpcmVjdGlvbiB0byBtYXRjaCB0aGUgcmVxdWlyZWQgd2lkdGgKKyAgICAgICAgICAgIHNldFNjYWxlWCgxLjBmKTsKKyAgICAgICAgICAgIGdldFBhaW50KCkuZ2V0VGV4dEJvdW5kcyhtRHVtbXlUZXh0LCAwLCBtRHVtbXlUZXh0Lmxlbmd0aCgpLCBtVGV4dEJvdW5kcyk7CisgICAgICAgICAgICBmbG9hdCBhY3R1YWxUZXh0V2lkdGggPSBtVGV4dEJvdW5kcy53aWR0aCgpOworICAgICAgICAgICAgZmxvYXQgcmVxdWlyZWRUZXh0V2lkdGggPSBNZWFzdXJlU3BlYy5nZXRTaXplKHdpZHRoTWVhc3VyZVNwZWMpOworICAgICAgICAgICAgc2V0U2NhbGVYKHJlcXVpcmVkVGV4dFdpZHRoIC8gYWN0dWFsVGV4dFdpZHRoKTsKKworICAgICAgICAgICAgc3VwZXIub25NZWFzdXJlKHdpZHRoTWVhc3VyZVNwZWMsIGhlaWdodE1lYXN1cmVTcGVjKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGMpIHsKKyAgICAgICAgICAgIGlmIChtRWRnZVR5cGUgPT0gQ2FwdGlvblN0eWxlLkVER0VfVFlQRV9VTlNQRUNJRklFRAorICAgICAgICAgICAgICAgICAgICB8fCBtRWRnZVR5cGUgPT0gQ2FwdGlvblN0eWxlLkVER0VfVFlQRV9OT05FCisgICAgICAgICAgICAgICAgICAgIHx8IG1FZGdlVHlwZSA9PSBDYXB0aW9uU3R5bGUuRURHRV9UWVBFX0RST1BfU0hBRE9XKSB7CisgICAgICAgICAgICAgICAgLy8gdGhlc2UgZWRnZSBzdHlsZXMgZG9uJ3QgcmVxdWlyZSBhIHNlY29uZCBwYXNzCisgICAgICAgICAgICAgICAgc3VwZXIub25EcmF3KGMpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1FZGdlVHlwZSA9PSBDYXB0aW9uU3R5bGUuRURHRV9UWVBFX09VVExJTkUpIHsKKyAgICAgICAgICAgICAgICBkcmF3RWRnZU91dGxpbmUoYyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFJhaXNlZCBvciBkZXByZXNzZWQKKyAgICAgICAgICAgICAgICBkcmF3RWRnZVJhaXNlZE9yRGVwcmVzc2VkKGMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGRyYXdFZGdlT3V0bGluZShDYW52YXMgYykgeworICAgICAgICAgICAgVGV4dFBhaW50IHRleHRQYWludCA9IGdldFBhaW50KCk7CisKKyAgICAgICAgICAgIFBhaW50LlN0eWxlIHByZXZpb3VzU3R5bGUgPSB0ZXh0UGFpbnQuZ2V0U3R5bGUoKTsKKyAgICAgICAgICAgIFBhaW50LkpvaW4gcHJldmlvdXNKb2luID0gdGV4dFBhaW50LmdldFN0cm9rZUpvaW4oKTsKKyAgICAgICAgICAgIGZsb2F0IHByZXZpb3VzV2lkdGggPSB0ZXh0UGFpbnQuZ2V0U3Ryb2tlV2lkdGgoKTsKKworICAgICAgICAgICAgc2V0VGV4dENvbG9yKG1FZGdlQ29sb3IpOworICAgICAgICAgICAgdGV4dFBhaW50LnNldFN0eWxlKFBhaW50LlN0eWxlLkZJTExfQU5EX1NUUk9LRSk7CisgICAgICAgICAgICB0ZXh0UGFpbnQuc2V0U3Ryb2tlSm9pbihQYWludC5Kb2luLlJPVU5EKTsKKyAgICAgICAgICAgIHRleHRQYWludC5zZXRTdHJva2VXaWR0aChtT3V0bGluZVdpZHRoKTsKKworICAgICAgICAgICAgLy8gRHJhdyBvdXRsaW5lIGFuZCBiYWNrZ3JvdW5kIG9ubHkuCisgICAgICAgICAgICBzdXBlci5vbkRyYXcoYyk7CisKKyAgICAgICAgICAgIC8vIFJlc3RvcmUgb3JpZ2luYWwgc2V0dGluZ3MuCisgICAgICAgICAgICBzZXRUZXh0Q29sb3IobVRleHRDb2xvcik7CisgICAgICAgICAgICB0ZXh0UGFpbnQuc2V0U3R5bGUocHJldmlvdXNTdHlsZSk7CisgICAgICAgICAgICB0ZXh0UGFpbnQuc2V0U3Ryb2tlSm9pbihwcmV2aW91c0pvaW4pOworICAgICAgICAgICAgdGV4dFBhaW50LnNldFN0cm9rZVdpZHRoKHByZXZpb3VzV2lkdGgpOworCisgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGJhY2tncm91bmQuCisgICAgICAgICAgICBzZXRCYWNrZ3JvdW5kU3BhbnMoQ29sb3IuVFJBTlNQQVJFTlQpOworICAgICAgICAgICAgLy8gRHJhdyBmb3JlZ3JvdW5kIG9ubHkuCisgICAgICAgICAgICBzdXBlci5vbkRyYXcoYyk7CisgICAgICAgICAgICAvLyBSZXN0b3JlIHRoZSBiYWNrZ3JvdW5kLgorICAgICAgICAgICAgc2V0QmFja2dyb3VuZFNwYW5zKG1CZ0NvbG9yKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBkcmF3RWRnZVJhaXNlZE9yRGVwcmVzc2VkKENhbnZhcyBjKSB7CisgICAgICAgICAgICBUZXh0UGFpbnQgdGV4dFBhaW50ID0gZ2V0UGFpbnQoKTsKKworICAgICAgICAgICAgUGFpbnQuU3R5bGUgcHJldmlvdXNTdHlsZSA9IHRleHRQYWludC5nZXRTdHlsZSgpOworICAgICAgICAgICAgdGV4dFBhaW50LnNldFN0eWxlKFBhaW50LlN0eWxlLkZJTEwpOworCisgICAgICAgICAgICBmaW5hbCBib29sZWFuIHJhaXNlZCA9IG1FZGdlVHlwZSA9PSBDYXB0aW9uU3R5bGUuRURHRV9UWVBFX1JBSVNFRDsKKyAgICAgICAgICAgIGZpbmFsIGludCBjb2xvclVwID0gcmFpc2VkID8gQ29sb3IuV0hJVEUgOiBtRWRnZUNvbG9yOworICAgICAgICAgICAgZmluYWwgaW50IGNvbG9yRG93biA9IHJhaXNlZCA/IG1FZGdlQ29sb3IgOiBDb2xvci5XSElURTsKKyAgICAgICAgICAgIGZpbmFsIGZsb2F0IG9mZnNldCA9IG1TaGFkb3dSYWRpdXMgLyAyZjsKKworICAgICAgICAgICAgLy8gRHJhdyBiYWNrZ3JvdW5kIGFuZCB0ZXh0IHdpdGggc2hhZG93IHVwCisgICAgICAgICAgICBzZXRTaGFkb3dMYXllcihtU2hhZG93UmFkaXVzLCAtb2Zmc2V0LCAtb2Zmc2V0LCBjb2xvclVwKTsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjKTsKKworICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBiYWNrZ3JvdW5kLgorICAgICAgICAgICAgc2V0QmFja2dyb3VuZFNwYW5zKENvbG9yLlRSQU5TUEFSRU5UKTsKKworICAgICAgICAgICAgLy8gRHJhdyB0ZXh0IHdpdGggc2hhZG93IGRvd24KKyAgICAgICAgICAgIHNldFNoYWRvd0xheWVyKG1TaGFkb3dSYWRpdXMsICtvZmZzZXQsICtvZmZzZXQsIGNvbG9yRG93bik7CisgICAgICAgICAgICBzdXBlci5vbkRyYXcoYyk7CisKKyAgICAgICAgICAgIC8vIFJlc3RvcmUgc2V0dGluZ3MKKyAgICAgICAgICAgIHRleHRQYWludC5zZXRTdHlsZShwcmV2aW91c1N0eWxlKTsKKworICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgYmFja2dyb3VuZC4KKyAgICAgICAgICAgIHNldEJhY2tncm91bmRTcGFucyhtQmdDb2xvcik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgc2V0QmFja2dyb3VuZFNwYW5zKGludCBjb2xvcikgeworICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQgPSBnZXRUZXh0KCk7CisgICAgICAgICAgICBpZiAodGV4dCBpbnN0YW5jZW9mIFNwYW5uYWJsZSkgeworICAgICAgICAgICAgICAgIFNwYW5uYWJsZSBzcGFubmFibGUgPSAoU3Bhbm5hYmxlKSB0ZXh0OworICAgICAgICAgICAgICAgIENlYTYwOENDUGFyc2VyLk11dGFibGVCYWNrZ3JvdW5kQ29sb3JTcGFuW10gYmdTcGFucyA9IHNwYW5uYWJsZS5nZXRTcGFucygKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIHNwYW5uYWJsZS5sZW5ndGgoKSwgQ2VhNjA4Q0NQYXJzZXIuTXV0YWJsZUJhY2tncm91bmRDb2xvclNwYW4uY2xhc3MpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmdTcGFucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBiZ1NwYW5zW2ldLnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ0NMYXlvdXQgZXh0ZW5kcyBMaW5lYXJMYXlvdXQgaW1wbGVtZW50cyBDbG9zZWRDYXB0aW9uTGF5b3V0IHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9ST1dTID0gQ2VhNjA4Q0NQYXJzZXIuTUFYX1JPV1M7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IFNBRkVfQVJFQV9SQVRJTyA9IDAuOWY7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDQ0xpbmVCb3hbXSBtTGluZUJveGVzID0gbmV3IENDTGluZUJveFtNQVhfUk9XU107CisKKyAgICAgICAgQ0NMYXlvdXQoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgICAgIHNldEdyYXZpdHkoR3Jhdml0eS5TVEFSVCk7CisgICAgICAgICAgICBzZXRPcmllbnRhdGlvbihMaW5lYXJMYXlvdXQuVkVSVElDQUwpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfUk9XUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgbUxpbmVCb3hlc1tpXSA9IG5ldyBDQ0xpbmVCb3goZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgICAgICAgICBhZGRWaWV3KG1MaW5lQm94ZXNbaV0sIExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsIExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldENhcHRpb25TdHlsZShDYXB0aW9uU3R5bGUgY2FwdGlvblN0eWxlKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9ST1dTOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtTGluZUJveGVzW2ldLnNldENhcHRpb25TdHlsZShjYXB0aW9uU3R5bGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEZvbnRTY2FsZShmbG9hdCBmb250U2NhbGUpIHsKKyAgICAgICAgICAgIC8vIElnbm9yZXMgdGhlIGZvbnQgc2NhbGUgY2hhbmdlcyBvZiB0aGUgc3lzdGVtIHdpZGUgQ0MgcHJlZmVyZW5jZS4KKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgdXBkYXRlKFNwYW5uYWJsZVN0cmluZ0J1aWxkZXJbXSB0ZXh0QnVmZmVyKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9ST1dTOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAodGV4dEJ1ZmZlcltpXSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1MaW5lQm94ZXNbaV0uc2V0VGV4dCh0ZXh0QnVmZmVyW2ldLCBUZXh0Vmlldy5CdWZmZXJUeXBlLlNQQU5OQUJMRSk7CisgICAgICAgICAgICAgICAgICAgIG1MaW5lQm94ZXNbaV0uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1MaW5lQm94ZXNbaV0uc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZShpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7CisgICAgICAgICAgICBzdXBlci5vbk1lYXN1cmUod2lkdGhNZWFzdXJlU3BlYywgaGVpZ2h0TWVhc3VyZVNwZWMpOworCisgICAgICAgICAgICBpbnQgc2FmZVdpZHRoID0gZ2V0TWVhc3VyZWRXaWR0aCgpOworICAgICAgICAgICAgaW50IHNhZmVIZWlnaHQgPSBnZXRNZWFzdXJlZEhlaWdodCgpOworCisgICAgICAgICAgICAvLyBDRUEtNjA4IGFzc3VtZXMgNDozIHZpZGVvCisgICAgICAgICAgICBpZiAoc2FmZVdpZHRoICogMyA+PSBzYWZlSGVpZ2h0ICogNCkgeworICAgICAgICAgICAgICAgIHNhZmVXaWR0aCA9IHNhZmVIZWlnaHQgKiA0IC8gMzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2FmZUhlaWdodCA9IHNhZmVXaWR0aCAqIDMgLyA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2FmZVdpZHRoICo9IFNBRkVfQVJFQV9SQVRJTzsKKyAgICAgICAgICAgIHNhZmVIZWlnaHQgKj0gU0FGRV9BUkVBX1JBVElPOworCisgICAgICAgICAgICBpbnQgbGluZUhlaWdodCA9IHNhZmVIZWlnaHQgLyBNQVhfUk9XUzsKKyAgICAgICAgICAgIGludCBsaW5lSGVpZ2h0TWVhc3VyZVNwZWMgPSBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoCisgICAgICAgICAgICAgICAgICAgIGxpbmVIZWlnaHQsIE1lYXN1cmVTcGVjLkVYQUNUTFkpOworICAgICAgICAgICAgaW50IGxpbmVXaWR0aE1lYXN1cmVTcGVjID0gTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKAorICAgICAgICAgICAgICAgICAgICBzYWZlV2lkdGgsIE1lYXN1cmVTcGVjLkVYQUNUTFkpOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9ST1dTOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtTGluZUJveGVzW2ldLm1lYXN1cmUobGluZVdpZHRoTWVhc3VyZVNwZWMsIGxpbmVIZWlnaHRNZWFzdXJlU3BlYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25MYXlvdXQoYm9vbGVhbiBjaGFuZ2VkLCBpbnQgbCwgaW50IHQsIGludCByLCBpbnQgYikgeworICAgICAgICAgICAgLy8gc2FmZSBjYXB0aW9uIGFyZWEKKyAgICAgICAgICAgIGludCB2aWV3UG9ydFdpZHRoID0gciAtIGw7CisgICAgICAgICAgICBpbnQgdmlld1BvcnRIZWlnaHQgPSBiIC0gdDsKKyAgICAgICAgICAgIGludCBzYWZlV2lkdGgsIHNhZmVIZWlnaHQ7CisgICAgICAgICAgICAvLyBDRUEtNjA4IGFzc3VtZXMgNDozIHZpZGVvCisgICAgICAgICAgICBpZiAodmlld1BvcnRXaWR0aCAqIDMgPj0gdmlld1BvcnRIZWlnaHQgKiA0KSB7CisgICAgICAgICAgICAgICAgc2FmZVdpZHRoID0gdmlld1BvcnRIZWlnaHQgKiA0IC8gMzsKKyAgICAgICAgICAgICAgICBzYWZlSGVpZ2h0ID0gdmlld1BvcnRIZWlnaHQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNhZmVXaWR0aCA9IHZpZXdQb3J0V2lkdGg7CisgICAgICAgICAgICAgICAgc2FmZUhlaWdodCA9IHZpZXdQb3J0V2lkdGggKiAzIC8gNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNhZmVXaWR0aCAqPSBTQUZFX0FSRUFfUkFUSU87CisgICAgICAgICAgICBzYWZlSGVpZ2h0ICo9IFNBRkVfQVJFQV9SQVRJTzsKKyAgICAgICAgICAgIGludCBsZWZ0ID0gKHZpZXdQb3J0V2lkdGggLSBzYWZlV2lkdGgpIC8gMjsKKyAgICAgICAgICAgIGludCB0b3AgPSAodmlld1BvcnRIZWlnaHQgLSBzYWZlSGVpZ2h0KSAvIDI7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX1JPV1M7IGkrKykgeworICAgICAgICAgICAgICAgIG1MaW5lQm94ZXNbaV0ubGF5b3V0KAorICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvcCArIHNhZmVIZWlnaHQgKiBpIC8gTUFYX1JPV1MsCisgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ICsgc2FmZVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgdG9wICsgc2FmZUhlaWdodCAqIChpICsgMSkgLyBNQVhfUk9XUyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3N1YnRpdGxlL01lZGlhVGltZVByb3ZpZGVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3N1YnRpdGxlL01lZGlhVGltZVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYzNmQ3ZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvTWVkaWFUaW1lUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhLnN1YnRpdGxlOworCisvLyBOb3RlOiBUaGlzIGlzIGp1c3QgY29waWVkIGZyb20gYW5kcm9pZC5tZWRpYS5NZWRpYVRpbWVQcm92aWRlci4KK3B1YmxpYyBpbnRlcmZhY2UgTWVkaWFUaW1lUHJvdmlkZXIgeworICAgIC8vIHdlIGRvIG5vdCBhbGxvdyBuZWdhdGl2ZSBtZWRpYSB0aW1lCisgICAgLyoqCisgICAgICogUHJlc2VudGF0aW9uIHRpbWUgdmFsdWUgaWYgbm8gdGltZWQgZXZlbnQgbm90aWZpY2F0aW9uIGlzIHJlcXVlc3RlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGxvbmcgTk9fVElNRSA9IC0xOworCisgICAgLyoqCisgICAgICogQ2FuY2VscyBhbGwgcHJldmlvdXMgbm90aWZpY2F0aW9uIHJlcXVlc3QgZnJvbSB0aGlzIGxpc3RlbmVyIGlmIGFueS4gIEl0CisgICAgICogcmVnaXN0ZXJzIHRoZSBsaXN0ZW5lciB0byBnZXQgc2VlayBhbmQgc3RvcCBub3RpZmljYXRpb25zLiAgSWYgdGltZVVzIGlzCisgICAgICogbm90IG5lZ2F0aXZlLCBpdCBhbHNvIHJlZ2lzdGVycyB0aGUgbGlzdGVuZXIgZm9yIGEgdGltZWQgZXZlbnQKKyAgICAgKiBub3RpZmljYXRpb24gd2hlbiB0aGUgcHJlc2VudGF0aW9uIHRpbWUgcmVhY2hlcyAoYmVjb21lcyBncmVhdGVyKSB0aGFuCisgICAgICogdGhlIHZhbHVlIHNwZWNpZmllZC4gIFRoaXMgaGFwcGVucyBpbW1lZGlhdGVseSBpZiB0aGUgY3VycmVudCBtZWRpYSB0aW1lCisgICAgICogaXMgbGFyZ2VyIHRoYW4gb3IgZXF1YWwgdG8gdGltZVVzLgorICAgICAqCisgICAgICogQHBhcmFtIHRpbWVVcyBwcmVzZW50YXRpb24gdGltZSB0byBnZXQgdGltZWQgZXZlbnQgY2FsbGJhY2sgYXQgKG9yCisgICAgICogICAgICAgICAgICAgICB7QGxpbmsgI05PX1RJTUV9KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG5vdGlmeUF0KGxvbmcgdGltZVVzLCBPbk1lZGlhVGltZUxpc3RlbmVyIGxpc3RlbmVyKTsKKworICAgIC8qKgorICAgICAqIENhbmNlbHMgYWxsIHByZXZpb3VzIG5vdGlmaWNhdGlvbiByZXF1ZXN0IGZyb20gdGhpcyBsaXN0ZW5lciBpZiBhbnkuICBJdAorICAgICAqIHJlZ2lzdGVycyB0aGUgbGlzdGVuZXIgdG8gZ2V0IHNlZWsgYW5kIHN0b3Agbm90aWZpY2F0aW9ucy4gIElmIHRoZSBtZWRpYQorICAgICAqIGlzIHN0b3BwZWQsIHRoZSBsaXN0ZW5lciB3aWxsIGltbWVkaWF0ZWx5IHJlY2VpdmUgYSBzdG9wIG5vdGlmaWNhdGlvbi4KKyAgICAgKiBPdGhlcndpc2UsIGl0IHdpbGwgcmVjZWl2ZSBhIHRpbWVkIGV2ZW50IG5vdGlmaWNhdG9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNjaGVkdWxlVXBkYXRlKE9uTWVkaWFUaW1lTGlzdGVuZXIgbGlzdGVuZXIpOworCisgICAgLyoqCisgICAgICogQ2FuY2VscyBhbGwgcHJldmlvdXMgbm90aWZpY2F0aW9uIHJlcXVlc3QgZnJvbSB0aGlzIGxpc3RlbmVyIGlmIGFueS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjYW5jZWxOb3RpZmljYXRpb25zKE9uTWVkaWFUaW1lTGlzdGVuZXIgbGlzdGVuZXIpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjdXJyZW50IHByZXNlbnRhdGlvbiB0aW1lLgorICAgICAqCisgICAgICogQHBhcmFtIHByZWNpc2UgICBXaGV0aGVyIGdldHRpbmcgYSBwcmVjaXNlIHRpbWUgaXMgaW1wb3J0YW50LiBUaGlzIGlzCisgICAgICogICAgICAgICAgICAgICAgICBtb3JlIGNvc3RseS4KKyAgICAgKiBAcGFyYW0gbW9ub3RvbmljIFdoZXRoZXIgcmV0dXJuZWQgdGltZSBzaG91bGQgYmUgbW9ub3RvbmljOiB0aGF0IGlzLAorICAgICAqICAgICAgICAgICAgICAgICAgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBsYXN0IHJldHVybmVkIHRpbWUuICBEb24ndAorICAgICAqICAgICAgICAgICAgICAgICAgYWx3YXlzIHNldCB0aGlzIHRvIHRydWUuICBFLmcuIHRoaXMgaGFzIHVuZGVzaXJlZAorICAgICAqICAgICAgICAgICAgICAgICAgY29uc2VxdWVuY2VzIGlmIHRoZSBtZWRpYSBpcyBzZWVrZWQgYmV0d2VlbiBjYWxscy4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgbWVkaWEgaXMgbm90IGluaXRpYWxpemVkCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0Q3VycmVudFRpbWVVcyhib29sZWFuIHByZWNpc2UsIGJvb2xlYW4gbW9ub3RvbmljKQorICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKKworICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIE9uTWVkaWFUaW1lTGlzdGVuZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHJlZ2lzdGVyZWQgdGltZSB3YXMgcmVhY2hlZCBuYXR1cmFsbHkuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB0aW1lVXMgY3VycmVudCBtZWRpYSB0aW1lCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9uVGltZWRFdmVudChsb25nIHRpbWVVcyk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBtZWRpYSB0aW1lIGNoYW5nZWQgZHVlIHRvIHNlZWtpbmcuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB0aW1lVXMgY3VycmVudCBtZWRpYSB0aW1lCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9uU2Vlayhsb25nIHRpbWVVcyk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBwbGF5YmFjayBzdG9wcGVkLiAgVGhpcyBpcyBub3QgY2FsbGVkIG9uIHBhdXNlLCBvbmx5CisgICAgICAgICAqIG9uIGZ1bGwgc3RvcCwgYXQgd2hpY2ggcG9pbnQgdGhlcmUgaXMgbm8gZnVydGhlciBjdXJyZW50IG1lZGlhIHRpbWUuCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9uU3RvcCgpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9TdWJ0aXRsZUNvbnRyb2xsZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvU3VidGl0bGVDb250cm9sbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRkNTVkNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvU3VidGl0bGVDb250cm9sbGVyLmphdmEKQEAgLTAsMCArMSw1MDggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQubWVkaWEuc3VidGl0bGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRm9ybWF0OworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyLlRyYWNrSW5mbzsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkNhcHRpb25pbmdNYW5hZ2VyOworCitpbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuc3VidGl0bGUuU3VidGl0bGVUcmFjay5SZW5kZXJpbmdXaWRnZXQ7CisKKy8vIE5vdGU6IFRoaXMgaXMgZm9ya2VkIGZyb20gYW5kcm9pZC5tZWRpYS5TdWJ0aXRsZUNvbnRyb2xsZXIgc2luY2UgUAorLyoqCisgKiBUaGUgc3VidGl0bGUgY29udHJvbGxlciBwcm92aWRlcyB0aGUgYXJjaGl0ZWN0dXJlIHRvIGRpc3BsYXkgc3VidGl0bGVzIGZvciBhCisgKiBtZWRpYSBzb3VyY2UuICBJdCBhbGxvd3Mgc3BlY2lmeWluZyB3aGljaCB0cmFja3MgdG8gZGlzcGxheSwgb24gd2hpY2ggYW5jaG9yCisgKiB0byBkaXNwbGF5IHRoZW0sIGFuZCBhbHNvIGFsbG93cyBhZGRpbmcgZXh0ZXJuYWwsIG91dC1vZi1iYW5kIHN1YnRpdGxlIHRyYWNrcy4KKyAqLworcHVibGljIGNsYXNzIFN1YnRpdGxlQ29udHJvbGxlciB7CisgICAgcHJpdmF0ZSBNZWRpYVRpbWVQcm92aWRlciBtVGltZVByb3ZpZGVyOworICAgIHByaXZhdGUgVmVjdG9yPFJlbmRlcmVyPiBtUmVuZGVyZXJzOworICAgIHByaXZhdGUgVmVjdG9yPFN1YnRpdGxlVHJhY2s+IG1UcmFja3M7CisgICAgcHJpdmF0ZSBTdWJ0aXRsZVRyYWNrIG1TZWxlY3RlZFRyYWNrOworICAgIHByaXZhdGUgYm9vbGVhbiBtU2hvd2luZzsKKyAgICBwcml2YXRlIENhcHRpb25pbmdNYW5hZ2VyIG1DYXB0aW9uaW5nTWFuYWdlcjsKKyAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0hBVF9TSE9XID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0hBVF9ISURFID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0hBVF9TRUxFQ1RfVFJBQ0sgPSAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXSEFUX1NFTEVDVF9ERUZBVUxUX1RSQUNLID0gNDsKKworICAgIHByaXZhdGUgZmluYWwgSGFuZGxlci5DYWxsYmFjayBtQ2FsbGJhY2sgPSBuZXcgSGFuZGxlci5DYWxsYmFjaygpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgIGNhc2UgV0hBVF9TSE9XOgorICAgICAgICAgICAgICAgIGRvU2hvdygpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSBXSEFUX0hJREU6CisgICAgICAgICAgICAgICAgZG9IaWRlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlIFdIQVRfU0VMRUNUX1RSQUNLOgorICAgICAgICAgICAgICAgIGRvU2VsZWN0VHJhY2soKFN1YnRpdGxlVHJhY2spbXNnLm9iaik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlIFdIQVRfU0VMRUNUX0RFRkFVTFRfVFJBQ0s6CisgICAgICAgICAgICAgICAgZG9TZWxlY3REZWZhdWx0VHJhY2soKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgQ2FwdGlvbmluZ01hbmFnZXIuQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyIG1DYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIgPQorICAgICAgICBuZXcgQ2FwdGlvbmluZ01hbmFnZXIuQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVuYWJsZWRDaGFuZ2VkKGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICAgICAgICAgIHNlbGVjdERlZmF1bHRUcmFjaygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uTG9jYWxlQ2hhbmdlZChMb2NhbGUgbG9jYWxlKSB7CisgICAgICAgICAgICAgICAgc2VsZWN0RGVmYXVsdFRyYWNrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICBwdWJsaWMgU3VidGl0bGVDb250cm9sbGVyKENvbnRleHQgY29udGV4dCkgeworICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBzdWJ0aXRsZSBjb250cm9sbGVyIGZvciBhIG1lZGlhIHBsYXliYWNrIG9iamVjdCB0aGF0IGltcGxlbWVudHMKKyAgICAgKiB0aGUgTWVkaWFUaW1lUHJvdmlkZXIgaW50ZXJmYWNlLgorICAgICAqCisgICAgICogQHBhcmFtIHRpbWVQcm92aWRlcgorICAgICAqLworICAgIHB1YmxpYyBTdWJ0aXRsZUNvbnRyb2xsZXIoCisgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICBNZWRpYVRpbWVQcm92aWRlciB0aW1lUHJvdmlkZXIsCisgICAgICAgICAgICBMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBtVGltZVByb3ZpZGVyID0gdGltZVByb3ZpZGVyOworICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKworICAgICAgICBtUmVuZGVyZXJzID0gbmV3IFZlY3RvcjxSZW5kZXJlcj4oKTsKKyAgICAgICAgbVNob3dpbmcgPSBmYWxzZTsKKyAgICAgICAgbVRyYWNrcyA9IG5ldyBWZWN0b3I8U3VidGl0bGVUcmFjaz4oKTsKKyAgICAgICAgbUNhcHRpb25pbmdNYW5hZ2VyID0KKyAgICAgICAgICAgIChDYXB0aW9uaW5nTWFuYWdlciljb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DQVBUSU9OSU5HX1NFUlZJQ0UpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIG1DYXB0aW9uaW5nTWFuYWdlci5yZW1vdmVDYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIoCisgICAgICAgICAgICAgICAgbUNhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lcik7CisgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgYXZhaWxhYmxlIHN1YnRpdGxlIHRyYWNrcyBmb3IgdGhpcyBtZWRpYS4gVGhlc2UgaW5jbHVkZQorICAgICAqIHRoZSB0cmFja3MgZm91bmQgYnkge0BsaW5rIE1lZGlhUGxheWVyfSBhcyB3ZWxsIGFzIGFueSB0cmFja3MgYWRkZWQKKyAgICAgKiBtYW51YWxseSB2aWEge0BsaW5rICNhZGRUcmFja30uCisgICAgICovCisgICAgcHVibGljIFN1YnRpdGxlVHJhY2tbXSBnZXRUcmFja3MoKSB7CisgICAgICAgIHN5bmNocm9uaXplZChtVHJhY2tzKSB7CisgICAgICAgICAgICBTdWJ0aXRsZVRyYWNrW10gdHJhY2tzID0gbmV3IFN1YnRpdGxlVHJhY2tbbVRyYWNrcy5zaXplKCldOworICAgICAgICAgICAgbVRyYWNrcy50b0FycmF5KHRyYWNrcyk7CisgICAgICAgICAgICByZXR1cm4gdHJhY2tzOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHN1YnRpdGxlIHRyYWNrCisgICAgICovCisgICAgcHVibGljIFN1YnRpdGxlVHJhY2sgZ2V0U2VsZWN0ZWRUcmFjaygpIHsKKyAgICAgICAgcmV0dXJuIG1TZWxlY3RlZFRyYWNrOworICAgIH0KKworICAgIHByaXZhdGUgUmVuZGVyaW5nV2lkZ2V0IGdldFJlbmRlcmluZ1dpZGdldCgpIHsKKyAgICAgICAgaWYgKG1TZWxlY3RlZFRyYWNrID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtU2VsZWN0ZWRUcmFjay5nZXRSZW5kZXJpbmdXaWRnZXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZWxlY3RzIGEgc3VidGl0bGUgdHJhY2suICBBcyBhIHJlc3VsdCwgdGhpcyB0cmFjayB3aWxsIHJlY2VpdmUKKyAgICAgKiBpbi1iYW5kIGRhdGEgZnJvbSB0aGUge0BsaW5rIE1lZGlhUGxheWVyfS4gIEhvd2V2ZXIsIHRoaXMgZG9lcworICAgICAqIG5vdCBjaGFuZ2UgdGhlIHN1YnRpdGxlIHZpc2liaWxpdHkuCisgICAgICoKKyAgICAgKiBTaG91bGQgYmUgY2FsbGVkIGZyb20gdGhlIGFuY2hvcidzIChVSSkgdGhyZWFkLiB7QHNlZSAjQW5jaG9yLmdldFN1YnRpdGxlTG9vcGVyfQorICAgICAqCisgICAgICogQHBhcmFtIHRyYWNrIFRoZSBzdWJ0aXRsZSB0cmFjayB0byBzZWxlY3QuICBUaGlzIG11c3QgYmUgb25lIG9mIHRoZQorICAgICAqICAgICAgICAgICAgICB0cmFja3MgaW4ge0BsaW5rICNnZXRUcmFja3N9LgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdHJhY2sgd2FzIHN1Y2Nlc3NmdWxseSBzZWxlY3RlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3RUcmFjayhTdWJ0aXRsZVRyYWNrIHRyYWNrKSB7CisgICAgICAgIGlmICh0cmFjayAhPSBudWxsICYmICFtVHJhY2tzLmNvbnRhaW5zKHRyYWNrKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHJvY2Vzc09uQW5jaG9yKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoV0hBVF9TRUxFQ1RfVFJBQ0ssIHRyYWNrKSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb1NlbGVjdFRyYWNrKFN1YnRpdGxlVHJhY2sgdHJhY2spIHsKKyAgICAgICAgbVRyYWNrSXNFeHBsaWNpdCA9IHRydWU7CisgICAgICAgIGlmIChtU2VsZWN0ZWRUcmFjayA9PSB0cmFjaykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1TZWxlY3RlZFRyYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TZWxlY3RlZFRyYWNrLmhpZGUoKTsKKyAgICAgICAgICAgIG1TZWxlY3RlZFRyYWNrLnNldFRpbWVQcm92aWRlcihudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIG1TZWxlY3RlZFRyYWNrID0gdHJhY2s7CisgICAgICAgIGlmIChtQW5jaG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1BbmNob3Iuc2V0U3VidGl0bGVXaWRnZXQoZ2V0UmVuZGVyaW5nV2lkZ2V0KCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1TZWxlY3RlZFRyYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TZWxlY3RlZFRyYWNrLnNldFRpbWVQcm92aWRlcihtVGltZVByb3ZpZGVyKTsKKyAgICAgICAgICAgIG1TZWxlY3RlZFRyYWNrLnNob3coKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbUxpc3RlbmVyLm9uU3VidGl0bGVUcmFja1NlbGVjdGVkKHRyYWNrKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgc3VidGl0bGUgdHJhY2sgYmFzZWQgb24gc3lzdGVtIHByZWZlcmVuY2VzLCBvciBudWxsLAorICAgICAqIGlmIG5vIHN1Y2ggdHJhY2sgZXhpc3RzIGluIHRoaXMgbWFuYWdlci4KKyAgICAgKgorICAgICAqIFN1cHBvcnRzIEhMUy1mbGFnczogQVVUT1NFTEVDVCwgRk9SQ0VEICYgREVGQVVMVC4KKyAgICAgKgorICAgICAqIDEuIElmIGNhcHRpb25pbmcgaXMgZGlzYWJsZWQsIG9ubHkgY29uc2lkZXIgRk9SQ0VEIHRyYWNrcy4gT3RoZXJ3aXNlLAorICAgICAqIGNvbnNpZGVyIGFsbCB0cmFja3MsIGJ1dCBwcmVmZXIgbm9uLUZPUkNFRCBvbmVzLgorICAgICAqIDIuIElmIHVzZXIgc2VsZWN0ZWQgIkRlZmF1bHQiIGNhcHRpb24gbGFuZ3VhZ2U6CisgICAgICogICBhLiBJZiB0aGVyZSBpcyBhIGNvbnNpZGVyZWQgdHJhY2sgd2l0aCBERUZBVUxUPXllcywgcmV0dXJucyB0aGF0IHRyYWNrCisgICAgICogICAgICAoZmF2b3IgdGhlIGZpcnN0IG9uZSBpbiB0aGUgY3VycmVudCBsYW5ndWFnZSBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuCisgICAgICogICAgICBvbmUgZGVmYXVsdCB0cmFja3MsIG9yIHRoZSBmaXJzdCBpbiBnZW5lcmFsIGlmIG5vbmUgb2YgdGhlbSBhcmUgaW4KKyAgICAgKiAgICAgIHRoZSBjdXJyZW50IGxhbmd1YWdlKS4KKyAgICAgKiAgIGIuIE90aGVyd2lzZSwgaWYgdGhlcmUgaXMgYSB0cmFjayB3aXRoIEFVVE9TRUxFQ1Q9eWVzIGluIHRoZSBjdXJyZW50CisgICAgICogICAgICBsYW5ndWFnZSwgcmV0dXJuIHRoYXQgb25lLgorICAgICAqICAgYy4gSWYgdGhlcmUgYXJlIG5vIGRlZmF1bHQgdHJhY2tzLCBhbmQgbm8gYXV0b3NlbGVjdGFibGUgdHJhY2tzIGluIHRoZQorICAgICAqICAgICAgY3VycmVudCBsYW5ndWFnZSwgcmV0dXJuIG51bGwuCisgICAgICogMy4gSWYgdGhlcmUgaXMgYSB0cmFjayB3aXRoIHRoZSBjYXB0aW9uIGxhbmd1YWdlLCBzZWxlY3QgdGhhdCBvbmUuICBQcmVmZXIKKyAgICAgKiB0aGUgb25lIHdpdGggQVVUT1NFTEVDVD1uby4KKyAgICAgKgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlc2UgZmxhZ3MgYXJlIERFRkFVTFQ9bm8sIEFVVE9TRUxFQ1Q9eWVzCisgICAgICogYW5kIEZPUkNFRD1uby4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3VidGl0bGVUcmFjayBnZXREZWZhdWx0VHJhY2soKSB7CisgICAgICAgIFN1YnRpdGxlVHJhY2sgYmVzdFRyYWNrID0gbnVsbDsKKyAgICAgICAgaW50IGJlc3RTY29yZSA9IC0xOworCisgICAgICAgIExvY2FsZSBzZWxlY3RlZExvY2FsZSA9IG1DYXB0aW9uaW5nTWFuYWdlci5nZXRMb2NhbGUoKTsKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IHNlbGVjdGVkTG9jYWxlOworICAgICAgICBpZiAobG9jYWxlID09IG51bGwpIHsKKyAgICAgICAgICAgIGxvY2FsZSA9IExvY2FsZS5nZXREZWZhdWx0KCk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBzZWxlY3RGb3JjZWQgPSAhbUNhcHRpb25pbmdNYW5hZ2VyLmlzRW5hYmxlZCgpOworCisgICAgICAgIHN5bmNocm9uaXplZChtVHJhY2tzKSB7CisgICAgICAgICAgICBmb3IgKFN1YnRpdGxlVHJhY2sgdHJhY2s6IG1UcmFja3MpIHsKKyAgICAgICAgICAgICAgICBNZWRpYUZvcm1hdCBmb3JtYXQgPSB0cmFjay5nZXRGb3JtYXQoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbGFuZ3VhZ2UgPSBmb3JtYXQuZ2V0U3RyaW5nKE1lZGlhRm9ybWF0LktFWV9MQU5HVUFHRSk7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBmb3JjZWQgPQorICAgICAgICAgICAgICAgICAgICBmb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfSVNfRk9SQ0VEX1NVQlRJVExFLCAwKSAhPSAwOworICAgICAgICAgICAgICAgIGJvb2xlYW4gYXV0b3NlbGVjdCA9CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdC5nZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9JU19BVVRPU0VMRUNULCAxKSAhPSAwOworICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNfZGVmYXVsdCA9CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdC5nZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9JU19ERUZBVUxULCAwKSAhPSAwOworCisgICAgICAgICAgICAgICAgYm9vbGVhbiBsYW5ndWFnZU1hdGNoZXMgPQorICAgICAgICAgICAgICAgICAgICAobG9jYWxlID09IG51bGwgfHwKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxlLmdldExhbmd1YWdlKCkuZXF1YWxzKCIiKSB8fAorICAgICAgICAgICAgICAgICAgICBsb2NhbGUuZ2V0SVNPM0xhbmd1YWdlKCkuZXF1YWxzKGxhbmd1YWdlKSB8fAorICAgICAgICAgICAgICAgICAgICBsb2NhbGUuZ2V0TGFuZ3VhZ2UoKS5lcXVhbHMobGFuZ3VhZ2UpKTsKKyAgICAgICAgICAgICAgICAvLyBpc19kZWZhdWx0IGlzIG1lYW5pbmdsZXNzIHVubGVzcyBjYXB0aW9uIGxhbmd1YWdlIGlzICdkZWZhdWx0JworICAgICAgICAgICAgICAgIGludCBzY29yZSA9IChmb3JjZWQgPyAwIDogOCkgKworICAgICAgICAgICAgICAgICAgICAoKChzZWxlY3RlZExvY2FsZSA9PSBudWxsKSAmJiBpc19kZWZhdWx0KSA/IDQgOiAwKSArCisgICAgICAgICAgICAgICAgICAgIChhdXRvc2VsZWN0ID8gMCA6IDIpICsgKGxhbmd1YWdlTWF0Y2hlcyA/IDEgOiAwKTsKKworICAgICAgICAgICAgICAgIGlmIChzZWxlY3RGb3JjZWQgJiYgIWZvcmNlZCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyB3ZSB0cmVhdCBudWxsIGxvY2FsZS9sYW5ndWFnZSBhcyBtYXRjaGluZyBhbnkgbGFuZ3VhZ2UKKyAgICAgICAgICAgICAgICBpZiAoKHNlbGVjdGVkTG9jYWxlID09IG51bGwgJiYgaXNfZGVmYXVsdCkgfHwKKyAgICAgICAgICAgICAgICAgICAgKGxhbmd1YWdlTWF0Y2hlcyAmJgorICAgICAgICAgICAgICAgICAgICAgKGF1dG9zZWxlY3QgfHwgZm9yY2VkIHx8IHNlbGVjdGVkTG9jYWxlICE9IG51bGwpKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcmUgPiBiZXN0U2NvcmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RTY29yZSA9IHNjb3JlOworICAgICAgICAgICAgICAgICAgICAgICAgYmVzdFRyYWNrID0gdHJhY2s7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJlc3RUcmFjazsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbVRyYWNrSXNFeHBsaWNpdCA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBtVmlzaWJpbGl0eUlzRXhwbGljaXQgPSBmYWxzZTsKKworICAgIC8qKiBzaG91bGQgYmUgY2FsbGVkIGZyb20gYW5jaG9yIHRocmVhZCAqLworICAgIHB1YmxpYyB2b2lkIHNlbGVjdERlZmF1bHRUcmFjaygpIHsKKyAgICAgICAgcHJvY2Vzc09uQW5jaG9yKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoV0hBVF9TRUxFQ1RfREVGQVVMVF9UUkFDSykpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb1NlbGVjdERlZmF1bHRUcmFjaygpIHsKKyAgICAgICAgaWYgKG1UcmFja0lzRXhwbGljaXQpIHsKKyAgICAgICAgICAgIC8vIElmIHRyYWNrIHNlbGVjdGlvbiBpcyBleHBsaWNpdCwgYnV0IHZpc2liaWxpdHkKKyAgICAgICAgICAgIC8vIGlzIG5vdCwgaXQgZmFsbHMgYmFjayB0byB0aGUgY2FwdGlvbmluZyBzZXR0aW5nCisgICAgICAgICAgICBpZiAoIW1WaXNpYmlsaXR5SXNFeHBsaWNpdCkgeworICAgICAgICAgICAgICAgIGlmIChtQ2FwdGlvbmluZ01hbmFnZXIuaXNFbmFibGVkKCkgfHwKKyAgICAgICAgICAgICAgICAgICAgKG1TZWxlY3RlZFRyYWNrICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFRyYWNrLmdldEZvcm1hdCgpLmdldEludGVnZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFGb3JtYXQuS0VZX0lTX0ZPUkNFRF9TVUJUSVRMRSwgMCkgIT0gMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2hvdygpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVNlbGVjdGVkVHJhY2sgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgbVNlbGVjdGVkVHJhY2suZ2V0VHJhY2tUeXBlKCkgPT0gVHJhY2tJbmZvLk1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEUpIHsKKyAgICAgICAgICAgICAgICAgICAgaGlkZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtVmlzaWJpbGl0eUlzRXhwbGljaXQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdlIGNhbiBoYXZlIGEgZGVmYXVsdCAoZm9yY2VkKSB0cmFjayBldmVuIGlmIGNhcHRpb25pbmcKKyAgICAgICAgLy8gaXMgbm90IGVuYWJsZWQuICBUaGlzIGlzIGhhbmRsZWQgYnkgZ2V0RGVmYXVsdFRyYWNrKCkuCisgICAgICAgIC8vIFNob3cgdGhpcyB0cmFjayB1bmxlc3Mgc3VidGl0bGVzIHdlcmUgZXhwbGljaXRseSBoaWRkZW4uCisgICAgICAgIFN1YnRpdGxlVHJhY2sgdHJhY2sgPSBnZXREZWZhdWx0VHJhY2soKTsKKyAgICAgICAgaWYgKHRyYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNlbGVjdFRyYWNrKHRyYWNrKTsKKyAgICAgICAgICAgIG1UcmFja0lzRXhwbGljaXQgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmICghbVZpc2liaWxpdHlJc0V4cGxpY2l0KSB7CisgICAgICAgICAgICAgICAgc2hvdygpOworICAgICAgICAgICAgICAgIG1WaXNpYmlsaXR5SXNFeHBsaWNpdCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqIG11c3QgYmUgY2FsbGVkIGZyb20gYW5jaG9yIHRocmVhZCAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICBjaGVja0FuY2hvckxvb3BlcigpOworICAgICAgICBoaWRlKCk7CisgICAgICAgIHNlbGVjdFRyYWNrKG51bGwpOworICAgICAgICBtVHJhY2tzLmNsZWFyKCk7CisgICAgICAgIG1UcmFja0lzRXhwbGljaXQgPSBmYWxzZTsKKyAgICAgICAgbVZpc2liaWxpdHlJc0V4cGxpY2l0ID0gZmFsc2U7CisgICAgICAgIG1DYXB0aW9uaW5nTWFuYWdlci5yZW1vdmVDYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIoCisgICAgICAgICAgICAgICAgbUNhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIG5ldywgZXh0ZXJuYWwgc3VidGl0bGUgdHJhY2sgdG8gdGhlIG1hbmFnZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZm9ybWF0IHRoZSBmb3JtYXQgb2YgdGhlIHRyYWNrIHRoYXQgd2lsbCBpbmNsdWRlIGF0IGxlYXN0CisgICAgICogICAgICAgICAgICAgICB0aGUgTUlNRSB0eXBlIHtAbGluayBNZWRpYUZvcm1hdEBLRVlfTUlNRX0uCisgICAgICogQHJldHVybiB0aGUgY3JlYXRlZCB7QGxpbmsgU3VidGl0bGVUcmFja30gb2JqZWN0CisgICAgICovCisgICAgcHVibGljIFN1YnRpdGxlVHJhY2sgYWRkVHJhY2soTWVkaWFGb3JtYXQgZm9ybWF0KSB7CisgICAgICAgIHN5bmNocm9uaXplZChtUmVuZGVyZXJzKSB7CisgICAgICAgICAgICBmb3IgKFJlbmRlcmVyIHJlbmRlcmVyOiBtUmVuZGVyZXJzKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlbmRlcmVyLnN1cHBvcnRzKGZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgU3VidGl0bGVUcmFjayB0cmFjayA9IHJlbmRlcmVyLmNyZWF0ZVRyYWNrKGZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQobVRyYWNrcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVHJhY2tzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYXB0aW9uaW5nTWFuYWdlci5hZGRDYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFja3MuYWRkKHRyYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFjazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaG93IHRoZSBzZWxlY3RlZCAob3IgZGVmYXVsdCkgc3VidGl0bGUgdHJhY2suCisgICAgICoKKyAgICAgKiBTaG91bGQgYmUgY2FsbGVkIGZyb20gdGhlIGFuY2hvcidzIChVSSkgdGhyZWFkLiB7QHNlZSAjQW5jaG9yLmdldFN1YnRpdGxlTG9vcGVyfQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNob3coKSB7CisgICAgICAgIHByb2Nlc3NPbkFuY2hvcihtSGFuZGxlci5vYnRhaW5NZXNzYWdlKFdIQVRfU0hPVykpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb1Nob3coKSB7CisgICAgICAgIG1TaG93aW5nID0gdHJ1ZTsKKyAgICAgICAgbVZpc2liaWxpdHlJc0V4cGxpY2l0ID0gdHJ1ZTsKKyAgICAgICAgaWYgKG1TZWxlY3RlZFRyYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TZWxlY3RlZFRyYWNrLnNob3coKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEhpZGUgdGhlIHNlbGVjdGVkIChvciBkZWZhdWx0KSBzdWJ0aXRsZSB0cmFjay4KKyAgICAgKgorICAgICAqIFNob3VsZCBiZSBjYWxsZWQgZnJvbSB0aGUgYW5jaG9yJ3MgKFVJKSB0aHJlYWQuIHtAc2VlICNBbmNob3IuZ2V0U3VidGl0bGVMb29wZXJ9CisgICAgICovCisgICAgcHVibGljIHZvaWQgaGlkZSgpIHsKKyAgICAgICAgcHJvY2Vzc09uQW5jaG9yKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoV0hBVF9ISURFKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvSGlkZSgpIHsKKyAgICAgICAgbVZpc2liaWxpdHlJc0V4cGxpY2l0ID0gdHJ1ZTsKKyAgICAgICAgaWYgKG1TZWxlY3RlZFRyYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TZWxlY3RlZFRyYWNrLmhpZGUoKTsKKyAgICAgICAgfQorICAgICAgICBtU2hvd2luZyA9IGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVyZmFjZSBmb3Igc3VwcG9ydGluZyBhIHNpbmdsZSBvciBtdWx0aXBsZSBzdWJ0aXRsZSB0eXBlcyBpbiB7QGxpbmsKKyAgICAgKiBNZWRpYVBsYXllcn0uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBSZW5kZXJlciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgYnkge0BsaW5rIE1lZGlhUGxheWVyfSdzIHtAbGluayBTdWJ0aXRsZUNvbnRyb2xsZXJ9IHdoZW4gYSBuZXcKKyAgICAgICAgICogc3VidGl0bGUgdHJhY2sgaXMgZGV0ZWN0ZWQsIHRvIHNlZSBpZiBpdCBzaG91bGQgdXNlIHRoaXMgb2JqZWN0IHRvCisgICAgICAgICAqIHBhcnNlIGFuZCBkaXNwbGF5IHRoaXMgc3VidGl0bGUgdHJhY2suCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBmb3JtYXQgdGhlIGZvcm1hdCBvZiB0aGUgdHJhY2sgdGhhdCB3aWxsIGluY2x1ZGUgYXQgbGVhc3QKKyAgICAgICAgICogICAgICAgICAgICAgICB0aGUgTUlNRSB0eXBlIHtAbGluayBNZWRpYUZvcm1hdEBLRVlfTUlNRX0uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgdHJhY2sgZm9ybWF0IGlzIHN1cHBvcnRlZCBieSB0aGlzCisgICAgICAgICAqIHJlbmRlcmVyCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdXBwb3J0cyhNZWRpYUZvcm1hdCBmb3JtYXQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgYnkge0BsaW5rIE1lZGlhUGxheWVyfSdzIHtAbGluayBTdWJ0aXRsZUNvbnRyb2xsZXJ9IGZvciBlYWNoCisgICAgICAgICAqIHN1YnRpdGxlIHRyYWNrIHRoYXQgd2FzIGRldGVjdGVkIGFuZCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyBvYmplY3QgdG8KKyAgICAgICAgICogY3JlYXRlIGEge0BsaW5rIFN1YnRpdGxlVHJhY2t9IG9iamVjdC4gIFRoaXMgb2JqZWN0IHdpbGwgYmUgY3JlYXRlZAorICAgICAgICAgKiBmb3IgZWFjaCB0cmFjayB0aGF0IHdhcyBmb3VuZC4gIElmIHRoZSB0cmFjayBpcyBzZWxlY3RlZCBmb3IgZGlzcGxheSwKKyAgICAgICAgICogdGhpcyBvYmplY3Qgd2lsbCBiZSB1c2VkIHRvIHBhcnNlIGFuZCBkaXNwbGF5IHRoZSB0cmFjayBkYXRhLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZm9ybWF0IHRoZSBmb3JtYXQgb2YgdGhlIHRyYWNrIHRoYXQgd2lsbCBpbmNsdWRlIGF0IGxlYXN0CisgICAgICAgICAqICAgICAgICAgICAgICAgdGhlIE1JTUUgdHlwZSB7QGxpbmsgTWVkaWFGb3JtYXRAS0VZX01JTUV9LgorICAgICAgICAgKiBAcmV0dXJuIGEge0BsaW5rIFN1YnRpdGxlVHJhY2t9IG9iamVjdCB0aGF0IHdpbGwgYmUgdXNlZCB0byBwYXJzZQorICAgICAgICAgKiBhbmQgcmVuZGVyIHRoZSBzdWJ0aXRsZSB0cmFjay4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBTdWJ0aXRsZVRyYWNrIGNyZWF0ZVRyYWNrKE1lZGlhRm9ybWF0IGZvcm1hdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIHN1cHBvcnQgZm9yIGEgc3VidGl0bGUgZm9ybWF0IGluIHtAbGluayBNZWRpYVBsYXllcn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVuZGVyZXIgYSB7QGxpbmsgU3VidGl0bGVDb250cm9sbGVyLlJlbmRlcmVyfSBvYmplY3QgdGhhdCBhZGRzCisgICAgICogICAgICAgICAgICAgICAgIHN1cHBvcnQgZm9yIGEgc3VidGl0bGUgZm9ybWF0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyUmVuZGVyZXIoUmVuZGVyZXIgcmVuZGVyZXIpIHsKKyAgICAgICAgc3luY2hyb25pemVkKG1SZW5kZXJlcnMpIHsKKyAgICAgICAgICAgIC8vIFRPRE8gaG93IHRvIGdldCBhdmFpbGFibGUgcmVuZGVyZXJzIGluIHRoZSBzeXN0ZW0KKyAgICAgICAgICAgIGlmICghbVJlbmRlcmVycy5jb250YWlucyhyZW5kZXJlcikpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPIHNob3VsZCBhZGRlZCByZW5kZXJlcnMgb3ZlcnJpZGUgZXhpc3Rpbmcgb25lcyAodG8gYWxsb3cgcmVwbGFjaW5nPykKKyAgICAgICAgICAgICAgICBtUmVuZGVyZXJzLmFkZChyZW5kZXJlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNSZW5kZXJlckZvcihNZWRpYUZvcm1hdCBmb3JtYXQpIHsKKyAgICAgICAgc3luY2hyb25pemVkKG1SZW5kZXJlcnMpIHsKKyAgICAgICAgICAgIC8vIFRPRE8gaG93IHRvIGdldCBhdmFpbGFibGUgcmVuZGVyZXJzIGluIHRoZSBzeXN0ZW0KKyAgICAgICAgICAgIGZvciAoUmVuZGVyZXIgcmVuZGVyZXI6IG1SZW5kZXJlcnMpIHsKKyAgICAgICAgICAgICAgICBpZiAocmVuZGVyZXIuc3VwcG9ydHMoZm9ybWF0KSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdWJ0aXRsZSBhbmNob3IsIGFuIG9iamVjdCB0aGF0IGlzIGFibGUgdG8gZGlzcGxheSBhIHN1YnRpdGxlIHJlbmRlcmVyLAorICAgICAqIGUuZy4gYSBWaWRlb1ZpZXcuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBBbmNob3IgeworICAgICAgICAvKioKKyAgICAgICAgICogQW5jaG9yIHNob3VsZCB1c2UgdGhlIHN1cHBsaWVkIHN1YnRpdGxlIHJlbmRlcmluZyB3aWRnZXQsIG9yCisgICAgICAgICAqIG5vbmUgaWYgaXQgaXMgbnVsbC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFN1YnRpdGxlV2lkZ2V0KFJlbmRlcmluZ1dpZGdldCBzdWJ0aXRsZVdpZGdldCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuY2hvcnMgcHJvdmlkZSB0aGUgbG9vcGVyIG9uIHdoaWNoIGFsbCB0cmFjayB2aXNpYmlsaXR5IGNoYW5nZXMKKyAgICAgICAgICogKHRyYWNrLnNob3cvaGlkZSwgc2V0U3VidGl0bGVXaWRnZXQpIHdpbGwgdGFrZSBwbGFjZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBMb29wZXIgZ2V0U3VidGl0bGVMb29wZXIoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEFuY2hvciBtQW5jaG9yOworCisgICAgLyoqCisgICAgICogIGNhbGxlZCBmcm9tIGFuY2hvcidzIGxvb3BlciAoaWYgYW55LCBib3RoIHdoZW4gdW5zZXR0aW5nIGFuZAorICAgICAqICBzZXR0aW5nKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFuY2hvcihBbmNob3IgYW5jaG9yKSB7CisgICAgICAgIGlmIChtQW5jaG9yID09IGFuY2hvcikgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1BbmNob3IgIT0gbnVsbCkgeworICAgICAgICAgICAgY2hlY2tBbmNob3JMb29wZXIoKTsKKyAgICAgICAgICAgIG1BbmNob3Iuc2V0U3VidGl0bGVXaWRnZXQobnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgbUFuY2hvciA9IGFuY2hvcjsKKyAgICAgICAgbUhhbmRsZXIgPSBudWxsOworICAgICAgICBpZiAobUFuY2hvciAhPSBudWxsKSB7CisgICAgICAgICAgICBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKG1BbmNob3IuZ2V0U3VidGl0bGVMb29wZXIoKSwgbUNhbGxiYWNrKTsKKyAgICAgICAgICAgIGNoZWNrQW5jaG9yTG9vcGVyKCk7CisgICAgICAgICAgICBtQW5jaG9yLnNldFN1YnRpdGxlV2lkZ2V0KGdldFJlbmRlcmluZ1dpZGdldCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja0FuY2hvckxvb3BlcigpIHsKKyAgICAgICAgYXNzZXJ0IG1IYW5kbGVyICE9IG51bGwgOiAiU2hvdWxkIGhhdmUgYSBsb29wZXIgYWxyZWFkeSI7CisgICAgICAgIGFzc2VydCBMb29wZXIubXlMb29wZXIoKSA9PSBtSGFuZGxlci5nZXRMb29wZXIoKQorICAgICAgICAgICAgICAgIDogIk11c3QgYmUgY2FsbGVkIGZyb20gdGhlIGFuY2hvcidzIGxvb3BlciI7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NPbkFuY2hvcihNZXNzYWdlIG0pIHsKKyAgICAgICAgYXNzZXJ0IG1IYW5kbGVyICE9IG51bGwgOiAiU2hvdWxkIGhhdmUgYSBsb29wZXIgYWxyZWFkeSI7CisgICAgICAgIGlmIChMb29wZXIubXlMb29wZXIoKSA9PSBtSGFuZGxlci5nZXRMb29wZXIoKSkgeworICAgICAgICAgICAgbUhhbmRsZXIuZGlzcGF0Y2hNZXNzYWdlKG0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2UobSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50ZXJmYWNlIExpc3RlbmVyIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIGEgc3VidGl0bGUgdHJhY2sgaGFzIGJlZW4gc2VsZWN0ZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB0cmFjayBzZWxlY3RlZCBzdWJ0aXRsZSB0cmFjayBvciBudWxsCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvblN1YnRpdGxlVHJhY2tTZWxlY3RlZChTdWJ0aXRsZVRyYWNrIHRyYWNrKTsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3RlbmVyIG1MaXN0ZW5lcjsKK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvU3VidGl0bGVUcmFjay5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9TdWJ0aXRsZVRyYWNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI5MDY0YQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvU3VidGl0bGVUcmFjay5qYXZhCkBAIC0wLDAgKzEsNjk2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhLnN1YnRpdGxlOworCitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUZvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyMi5UcmFja0luZm87CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5TdWJ0aXRsZURhdGE7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvbmdTcGFyc2VBcnJheTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuUGFpcjsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU29ydGVkTWFwOworaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKKy8vIE5vdGU6IFRoaXMgaXMgZm9ya2VkIGZyb20gYW5kcm9pZC5tZWRpYS5TdWJ0aXRsZVRyYWNrIHNpbmNlIFAKKy8qKgorICogQSBzdWJ0aXRsZSB0cmFjayBhYnN0cmFjdCBiYXNlIGNsYXNzIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yIHBhcnNpbmcgYW5kIGRpc3BsYXlpbmcKKyAqIGFuIGluc3RhbmNlIG9mIGEgcGFydGljdWxhciB0eXBlIG9mIHN1YnRpdGxlLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3VidGl0bGVUcmFjayBpbXBsZW1lbnRzIE1lZGlhVGltZVByb3ZpZGVyLk9uTWVkaWFUaW1lTGlzdGVuZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3VidGl0bGVUcmFjayI7CisgICAgcHJpdmF0ZSBsb25nIG1MYXN0VXBkYXRlVGltZU1zOworICAgIHByaXZhdGUgbG9uZyBtTGFzdFRpbWVNczsKKworICAgIHByaXZhdGUgUnVubmFibGUgbVJ1bm5hYmxlOworCisgICAgZmluYWwgcHJpdmF0ZSBMb25nU3BhcnNlQXJyYXk8UnVuPiBtUnVuc0J5RW5kVGltZSA9IG5ldyBMb25nU3BhcnNlQXJyYXk8UnVuPigpOworICAgIGZpbmFsIHByaXZhdGUgTG9uZ1NwYXJzZUFycmF5PFJ1bj4gbVJ1bnNCeUlEID0gbmV3IExvbmdTcGFyc2VBcnJheTxSdW4+KCk7CisKKyAgICBwcml2YXRlIEN1ZUxpc3QgbUN1ZXM7CisgICAgZmluYWwgcHJpdmF0ZSBWZWN0b3I8Q3VlPiBtQWN0aXZlQ3VlcyA9IG5ldyBWZWN0b3I8Q3VlPigpOworICAgIHByb3RlY3RlZCBib29sZWFuIG1WaXNpYmxlOworCisgICAgcHVibGljIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKKworICAgIHByb3RlY3RlZCBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKKworICAgIHByaXZhdGUgTWVkaWFGb3JtYXQgbUZvcm1hdDsKKworICAgIHB1YmxpYyBTdWJ0aXRsZVRyYWNrKE1lZGlhRm9ybWF0IGZvcm1hdCkgeworICAgICAgICBtRm9ybWF0ID0gZm9ybWF0OworICAgICAgICBtQ3VlcyA9IG5ldyBDdWVMaXN0KCk7CisgICAgICAgIGNsZWFyQWN0aXZlQ3VlcygpOworICAgICAgICBtTGFzdFRpbWVNcyA9IC0xOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBNZWRpYUZvcm1hdCBnZXRGb3JtYXQoKSB7CisgICAgICAgIHJldHVybiBtRm9ybWF0OworICAgIH0KKworICAgIHByaXZhdGUgbG9uZyBtTmV4dFNjaGVkdWxlZFRpbWVNcyA9IC0xOworCisgICAgcHVibGljIHZvaWQgb25EYXRhKFN1YnRpdGxlRGF0YSBkYXRhKSB7CisgICAgICAgIGxvbmcgcnVuSUQgPSBkYXRhLmdldFN0YXJ0VGltZVVzKCkgKyAxOworICAgICAgICBvbkRhdGEoZGF0YS5nZXREYXRhKCksIHRydWUgLyogZW9zICovLCBydW5JRCk7CisgICAgICAgIHNldFJ1bkRpc2NhcmRUaW1lTXMoCisgICAgICAgICAgICAgICAgcnVuSUQsCisgICAgICAgICAgICAgICAgKGRhdGEuZ2V0U3RhcnRUaW1lVXMoKSArIGRhdGEuZ2V0RHVyYXRpb25VcygpKSAvIDEwMDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZXJlIGlzIGlucHV0IGRhdGEgZm9yIHRoZSBzdWJ0aXRsZSB0cmFjay4gIFRoZQorICAgICAqIGNvbXBsZXRlIHN1YnRpdGxlIGZvciBhIHRyYWNrIGNhbiBpbmNsdWRlIG11bHRpcGxlIHdob2xlIHVuaXRzCisgICAgICogKHJ1bnMpLiAgRWFjaCBvZiB0aGVzZSB1bml0cyBjYW4gaGF2ZSBtdWx0aXBsZSBzZWN0aW9ucy4gIFRoZQorICAgICAqIGNvbnRlbnRzIG9mIGEgcnVuIGFyZSBzdWJtaXR0ZWQgaW4gc2VxdWVudGlhbCBvcmRlciwgd2l0aCBlb3MKKyAgICAgKiBpbmRpY2F0aW5nIHRoZSBsYXN0IHNlY3Rpb24gb2YgdGhlIHJ1bi4gIENhbGxzIGZyb20gZGlmZmVyZW50CisgICAgICogcnVucyBtdXN0IG5vdCBiZSBpbnRlcm1peGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGRhdGEgc3VidGl0bGUgZGF0YSBieXRlIGJ1ZmZlcgorICAgICAqIEBwYXJhbSBlb3MgdHJ1ZSBpZiB0aGlzIGlzIHRoZSBsYXN0IHNlY3Rpb24gb2YgdGhlIHJ1bi4KKyAgICAgKiBAcGFyYW0gcnVuSUQgbW9zdGx5LXVuaXF1ZSBJRCBmb3IgdGhpcyBydW4gb2YgZGF0YS4gIFN1YnRpdGxlIGN1ZXMKKyAgICAgKiAgICAgICAgICAgICAgd2l0aCBydW5JRCBvZiAwIGFyZSBkaXNjYXJkZWQgaW1tZWRpYXRlbHkgYWZ0ZXIKKyAgICAgKiAgICAgICAgICAgICAgZGlzcGxheS4gIEN1ZXMgd2l0aCBydW5JRCBvZiB+MCBhcmUgZGlzY2FyZGVkCisgICAgICogICAgICAgICAgICAgIG9ubHkgYXQgdGhlIGRlbGV0aW9uIG9mIHRoZSB0cmFjayBvYmplY3QuICBDdWVzCisgICAgICogICAgICAgICAgICAgIHdpdGggb3RoZXIgcnVuSUQtcyBhcmUgZGlzY2FyZGVkIGF0IHRoZSBlbmQgb2YgdGhlCisgICAgICogICAgICAgICAgICAgIHJ1biwgd2hpY2ggZGVmYXVsdHMgdG8gdGhlIGxhdGVzdCB0aW1lc3RhbXAgb2YKKyAgICAgKiAgICAgICAgICAgICAgYW55IG9mIGl0cyBjdWVzICh3aXRoIHRoaXMgcnVuSUQpLgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIG9uRGF0YShieXRlW10gZGF0YSwgYm9vbGVhbiBlb3MsIGxvbmcgcnVuSUQpOworCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gYWRkaW5nIHRoZSBzdWJ0aXRsZSByZW5kZXJpbmcgd2lkZ2V0IHRvIHRoZSB2aWV3IGhpZXJhcmNoeSwKKyAgICAgKiBhcyB3ZWxsIGFzIHdoZW4gc2hvd2luZyBvciBoaWRpbmcgdGhlIHN1YnRpdGxlIHRyYWNrLCBvciB3aGVuIHRoZSB2aWRlbworICAgICAqIHN1cmZhY2UgcG9zaXRpb24gaGFzIGNoYW5nZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSB3aWRnZXQgdGhhdCByZW5kZXJzIHRoaXMgc3VidGl0bGUgdHJhY2suIEZvciBtb3N0IHJlbmRlcmVycworICAgICAqICAgICAgICAgdGhlcmUgc2hvdWxkIGJlIGEgc2luZ2xlIHNoYXJlZCBpbnN0YW5jZSB0aGF0IGlzIHVzZWQgZm9yIGFsbAorICAgICAqICAgICAgICAgdHJhY2tzIHN1cHBvcnRlZCBieSB0aGF0IHJlbmRlcmVyLCBhcyBhdCBtb3N0IG9uZSBzdWJ0aXRsZSB0cmFjaworICAgICAqICAgICAgICAgaXMgdmlzaWJsZSBhdCBvbmUgdGltZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgUmVuZGVyaW5nV2lkZ2V0IGdldFJlbmRlcmluZ1dpZGdldCgpOworCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIGFjdGl2ZSBjdWVzIGhhdmUgY2hhbmdlZCwgYW5kIHRoZSBjb250ZW50cyBvZiB0aGUgc3VidGl0bGUKKyAgICAgKiB2aWV3IHNob3VsZCBiZSB1cGRhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHVwZGF0ZVZpZXcoVmVjdG9yPEN1ZT4gYWN0aXZlQ3Vlcyk7CisKKyAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgdXBkYXRlQWN0aXZlQ3Vlcyhib29sZWFuIHJlYnVpbGQsIGxvbmcgdGltZU1zKSB7CisgICAgICAgIC8vIG91dC1vZi1vcmRlciB0aW1lcyBtZWFuIHNlZWtpbmcgb3IgbmV3IGFjdGl2ZSBjdWVzIGJlaW5nIGFkZGVkCisgICAgICAgIC8vIChkdXJpbmcgdGhlaXIgb3duIHRpbWVzcGFuKQorICAgICAgICBpZiAocmVidWlsZCB8fCBtTGFzdFVwZGF0ZVRpbWVNcyA+IHRpbWVNcykgeworICAgICAgICAgICAgY2xlYXJBY3RpdmVDdWVzKCk7CisgICAgICAgIH0KKworICAgICAgICBmb3IoSXRlcmF0b3I8UGFpcjxMb25nLCBDdWU+ID4gaXQgPQorICAgICAgICAgICAgICAgIG1DdWVzLmVudHJpZXNCZXR3ZWVuKG1MYXN0VXBkYXRlVGltZU1zLCB0aW1lTXMpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7CisgICAgICAgICAgICBQYWlyPExvbmcsIEN1ZT4gZXZlbnQgPSBpdC5uZXh0KCk7CisgICAgICAgICAgICBDdWUgY3VlID0gZXZlbnQuc2Vjb25kOworCisgICAgICAgICAgICBpZiAoY3VlLm1FbmRUaW1lTXMgPT0gZXZlbnQuZmlyc3QpIHsKKyAgICAgICAgICAgICAgICAvLyByZW1vdmUgcGFzdCBjdWVzCisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJSZW1vdmluZyAiICsgY3VlKTsKKyAgICAgICAgICAgICAgICBtQWN0aXZlQ3Vlcy5yZW1vdmUoY3VlKTsKKyAgICAgICAgICAgICAgICBpZiAoY3VlLm1SdW5JRCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGl0LnJlbW92ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VlLm1TdGFydFRpbWVNcyA9PSBldmVudC5maXJzdCkgeworICAgICAgICAgICAgICAgIC8vIGFkZCBuZXcgY3VlcworICAgICAgICAgICAgICAgIC8vIFRSSUNLWTogdGhpcyB3aWxsIGhhcHBlbiBpbiBzdGFydCBvcmRlcgorICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiQWRkaW5nICIgKyBjdWUpOworICAgICAgICAgICAgICAgIGlmIChjdWUubUlubmVyVGltZXNNcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGN1ZS5vblRpbWUodGltZU1zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUFjdGl2ZUN1ZXMuYWRkKGN1ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGN1ZS5tSW5uZXJUaW1lc01zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBjdWUgaXMgbW9kaWZpZWQKKyAgICAgICAgICAgICAgICBjdWUub25UaW1lKHRpbWVNcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBjb21wbGV0ZSBhbnkgcnVucyAqLworICAgICAgICB3aGlsZSAobVJ1bnNCeUVuZFRpbWUuc2l6ZSgpID4gMCAmJgorICAgICAgICAgICAgICAgbVJ1bnNCeUVuZFRpbWUua2V5QXQoMCkgPD0gdGltZU1zKSB7CisgICAgICAgICAgICByZW1vdmVSdW5zQnlFbmRUaW1lSW5kZXgoMCk7IC8vIHJlbW92ZXMgZWxlbWVudAorICAgICAgICB9CisgICAgICAgIG1MYXN0VXBkYXRlVGltZU1zID0gdGltZU1zOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZW1vdmVSdW5zQnlFbmRUaW1lSW5kZXgoaW50IGl4KSB7CisgICAgICAgIFJ1biBydW4gPSBtUnVuc0J5RW5kVGltZS52YWx1ZUF0KGl4KTsKKyAgICAgICAgd2hpbGUgKHJ1biAhPSBudWxsKSB7CisgICAgICAgICAgICBDdWUgY3VlID0gcnVuLm1GaXJzdEN1ZTsKKyAgICAgICAgICAgIHdoaWxlIChjdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1DdWVzLnJlbW92ZShjdWUpOworICAgICAgICAgICAgICAgIEN1ZSBuZXh0Q3VlID0gY3VlLm1OZXh0SW5SdW47CisgICAgICAgICAgICAgICAgY3VlLm1OZXh0SW5SdW4gPSBudWxsOworICAgICAgICAgICAgICAgIGN1ZSA9IG5leHRDdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUnVuc0J5SUQucmVtb3ZlKHJ1bi5tUnVuSUQpOworICAgICAgICAgICAgUnVuIG5leHRSdW4gPSBydW4ubU5leHRSdW5BdEVuZFRpbWVNczsKKyAgICAgICAgICAgIHJ1bi5tUHJldlJ1bkF0RW5kVGltZU1zID0gbnVsbDsKKyAgICAgICAgICAgIHJ1bi5tTmV4dFJ1bkF0RW5kVGltZU1zID0gbnVsbDsKKyAgICAgICAgICAgIHJ1biA9IG5leHRSdW47CisgICAgICAgIH0KKyAgICAgICAgbVJ1bnNCeUVuZFRpbWUucmVtb3ZlQXQoaXgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIC8qIHJlbW92ZSBhbGwgY3VlcyAodW50YW5nbGUgYWxsIGNyb3NzLWxpbmtzKSAqLworICAgICAgICBpbnQgc2l6ZSA9IG1SdW5zQnlFbmRUaW1lLnNpemUoKTsKKyAgICAgICAgZm9yKGludCBpeCA9IHNpemUgLSAxOyBpeCA+PSAwOyBpeC0tKSB7CisgICAgICAgICAgICByZW1vdmVSdW5zQnlFbmRUaW1lSW5kZXgoaXgpOworICAgICAgICB9CisKKyAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHRha2VUaW1lKGxvbmcgdGltZU1zKSB7CisgICAgICAgIG1MYXN0VGltZU1zID0gdGltZU1zOworICAgIH0KKworICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBjbGVhckFjdGl2ZUN1ZXMoKSB7CisgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiQ2xlYXJpbmcgIiArIG1BY3RpdmVDdWVzLnNpemUoKSArICIgYWN0aXZlIGN1ZXMiKTsKKyAgICAgICAgbUFjdGl2ZUN1ZXMuY2xlYXIoKTsKKyAgICAgICAgbUxhc3RVcGRhdGVUaW1lTXMgPSAtMTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzY2hlZHVsZVRpbWVkRXZlbnRzKCkgeworICAgICAgICAvKiBnZXQgdGltZXMgZm9yIHRoZSBuZXh0IGV2ZW50ICovCisgICAgICAgIGlmIChtVGltZVByb3ZpZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1OZXh0U2NoZWR1bGVkVGltZU1zID0gbUN1ZXMubmV4dFRpbWVBZnRlcihtTGFzdFRpbWVNcyk7CisgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgInNjaGVkIEAiICsgbU5leHRTY2hlZHVsZWRUaW1lTXMgKyAiIGFmdGVyICIgKyBtTGFzdFRpbWVNcyk7CisgICAgICAgICAgICBtVGltZVByb3ZpZGVyLm5vdGlmeUF0KAorICAgICAgICAgICAgICAgICAgICBtTmV4dFNjaGVkdWxlZFRpbWVNcyA+PSAwID8KKyAgICAgICAgICAgICAgICAgICAgICAgIChtTmV4dFNjaGVkdWxlZFRpbWVNcyAqIDEwMDApIDogTWVkaWFUaW1lUHJvdmlkZXIuTk9fVElNRSwKKyAgICAgICAgICAgICAgICAgICAgdGhpcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblRpbWVkRXZlbnQobG9uZyB0aW1lVXMpIHsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJvblRpbWVkRXZlbnQgIiArIHRpbWVVcyk7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgbG9uZyB0aW1lTXMgPSB0aW1lVXMgLyAxMDAwOworICAgICAgICAgICAgdXBkYXRlQWN0aXZlQ3VlcyhmYWxzZSwgdGltZU1zKTsKKyAgICAgICAgICAgIHRha2VUaW1lKHRpbWVNcyk7CisgICAgICAgIH0KKyAgICAgICAgdXBkYXRlVmlldyhtQWN0aXZlQ3Vlcyk7CisgICAgICAgIHNjaGVkdWxlVGltZWRFdmVudHMoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblNlZWsobG9uZyB0aW1lVXMpIHsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJvblNlZWsgIiArIHRpbWVVcyk7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgbG9uZyB0aW1lTXMgPSB0aW1lVXMgLyAxMDAwOworICAgICAgICAgICAgdXBkYXRlQWN0aXZlQ3Vlcyh0cnVlLCB0aW1lTXMpOworICAgICAgICAgICAgdGFrZVRpbWUodGltZU1zKTsKKyAgICAgICAgfQorICAgICAgICB1cGRhdGVWaWV3KG1BY3RpdmVDdWVzKTsKKyAgICAgICAgc2NoZWR1bGVUaW1lZEV2ZW50cygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgIm9uU3RvcCIpOworICAgICAgICAgICAgY2xlYXJBY3RpdmVDdWVzKCk7CisgICAgICAgICAgICBtTGFzdFRpbWVNcyA9IC0xOworICAgICAgICB9CisgICAgICAgIHVwZGF0ZVZpZXcobUFjdGl2ZUN1ZXMpOworICAgICAgICBtTmV4dFNjaGVkdWxlZFRpbWVNcyA9IC0xOworICAgICAgICBtVGltZVByb3ZpZGVyLm5vdGlmeUF0KE1lZGlhVGltZVByb3ZpZGVyLk5PX1RJTUUsIHRoaXMpOworICAgIH0KKworICAgIHByb3RlY3RlZCBNZWRpYVRpbWVQcm92aWRlciBtVGltZVByb3ZpZGVyOworCisgICAgcHVibGljIHZvaWQgc2hvdygpIHsKKyAgICAgICAgaWYgKG1WaXNpYmxlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBtVmlzaWJsZSA9IHRydWU7CisgICAgICAgIFJlbmRlcmluZ1dpZGdldCByZW5kZXJpbmdXaWRnZXQgPSBnZXRSZW5kZXJpbmdXaWRnZXQoKTsKKyAgICAgICAgaWYgKHJlbmRlcmluZ1dpZGdldCAhPSBudWxsKSB7CisgICAgICAgICAgICByZW5kZXJpbmdXaWRnZXQuc2V0VmlzaWJsZSh0cnVlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobVRpbWVQcm92aWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtVGltZVByb3ZpZGVyLnNjaGVkdWxlVXBkYXRlKHRoaXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaGlkZSgpIHsKKyAgICAgICAgaWYgKCFtVmlzaWJsZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1UaW1lUHJvdmlkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVRpbWVQcm92aWRlci5jYW5jZWxOb3RpZmljYXRpb25zKHRoaXMpOworICAgICAgICB9CisgICAgICAgIFJlbmRlcmluZ1dpZGdldCByZW5kZXJpbmdXaWRnZXQgPSBnZXRSZW5kZXJpbmdXaWRnZXQoKTsKKyAgICAgICAgaWYgKHJlbmRlcmluZ1dpZGdldCAhPSBudWxsKSB7CisgICAgICAgICAgICByZW5kZXJpbmdXaWRnZXQuc2V0VmlzaWJsZShmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgbVZpc2libGUgPSBmYWxzZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIGJvb2xlYW4gYWRkQ3VlKEN1ZSBjdWUpIHsKKyAgICAgICAgbUN1ZXMuYWRkKGN1ZSk7CisKKyAgICAgICAgaWYgKGN1ZS5tUnVuSUQgIT0gMCkgeworICAgICAgICAgICAgUnVuIHJ1biA9IG1SdW5zQnlJRC5nZXQoY3VlLm1SdW5JRCk7CisgICAgICAgICAgICBpZiAocnVuID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBydW4gPSBuZXcgUnVuKCk7CisgICAgICAgICAgICAgICAgbVJ1bnNCeUlELnB1dChjdWUubVJ1bklELCBydW4pOworICAgICAgICAgICAgICAgIHJ1bi5tRW5kVGltZU1zID0gY3VlLm1FbmRUaW1lTXM7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJ1bi5tRW5kVGltZU1zIDwgY3VlLm1FbmRUaW1lTXMpIHsKKyAgICAgICAgICAgICAgICBydW4ubUVuZFRpbWVNcyA9IGN1ZS5tRW5kVGltZU1zOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBsaW5rLXVwIGN1ZXMgaW4gdGhlIHNhbWUgcnVuCisgICAgICAgICAgICBjdWUubU5leHRJblJ1biA9IHJ1bi5tRmlyc3RDdWU7CisgICAgICAgICAgICBydW4ubUZpcnN0Q3VlID0gY3VlOworICAgICAgICB9CisKKyAgICAgICAgLy8gaWYgYSBjdWUgaXMgYWRkZWQgdGhhdCBzaG91bGQgYmUgdmlzaWJsZSwgbmVlZCB0byByZWZyZXNoIHZpZXcKKyAgICAgICAgbG9uZyBub3dNcyA9IC0xOworICAgICAgICBpZiAobVRpbWVQcm92aWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG5vd01zID0gbVRpbWVQcm92aWRlci5nZXRDdXJyZW50VGltZVVzKAorICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogcHJlY2lzZSAqLywgdHJ1ZSAvKiBtb25vdG9uaWMgKi8pIC8gMTAwMDsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gaGFuZGxlIGFzIGl0IHdlIGFyZSBub3QgcGxheWluZworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJtVmlzaWJsZT0iICsgbVZpc2libGUgKyAiLCAiICsKKyAgICAgICAgICAgICAgICBjdWUubVN0YXJ0VGltZU1zICsgIiA8PSAiICsgbm93TXMgKyAiLCAiICsKKyAgICAgICAgICAgICAgICBjdWUubUVuZFRpbWVNcyArICIgPj0gIiArIG1MYXN0VGltZU1zKTsKKworICAgICAgICBpZiAobVZpc2libGUgJiYKKyAgICAgICAgICAgICAgICBjdWUubVN0YXJ0VGltZU1zIDw9IG5vd01zICYmCisgICAgICAgICAgICAgICAgLy8gd2UgZG9uJ3QgdHJ1c3Qgbm93TXMsIHNvIGNoZWNrIGFueSBjdWUgc2luY2UgbGFzdCBjYWxsYmFjaworICAgICAgICAgICAgICAgIGN1ZS5tRW5kVGltZU1zID49IG1MYXN0VGltZU1zKSB7CisgICAgICAgICAgICBpZiAobVJ1bm5hYmxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVJ1bm5hYmxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIFN1YnRpdGxlVHJhY2sgdHJhY2sgPSB0aGlzOworICAgICAgICAgICAgZmluYWwgbG9uZyB0aGVuTXMgPSBub3dNczsKKyAgICAgICAgICAgIG1SdW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW4gd2l0aCBzeW5jaHJvbml6ZWQsIGl0IGlzIHBvc3NpYmxlIHRoYXQgd2UgYXJlIGdvaW5nCisgICAgICAgICAgICAgICAgICAgIC8vIHRvIGRvIG11bHRpcGxlIHVwZGF0ZXMgYXMgdGhlIHJ1bm5hYmxlIGNvdWxkIGJlIGFscmVhZHkKKyAgICAgICAgICAgICAgICAgICAgLy8gcnVubmluZy4KKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0cmFjaykgeworICAgICAgICAgICAgICAgICAgICAgICAgbVJ1bm5hYmxlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUFjdGl2ZUN1ZXModHJ1ZSwgdGhlbk1zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVZpZXcobUFjdGl2ZUN1ZXMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIC8vIGRlbGF5IHVwZGF0ZSBzbyB3ZSBkb24ndCB1cGRhdGUgdmlldyBvbiBldmVyeSBjdWUuICBUT0RPIHdoeSAxMD8KKyAgICAgICAgICAgIGlmIChtSGFuZGxlci5wb3N0RGVsYXllZChtUnVubmFibGUsIDEwIC8qIGRlbGF5ICovKSkgeworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAic2NoZWR1bGluZyB1cGRhdGUiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudyhUQUcsICJmYWlsZWQgdG8gc2NoZWR1bGUgc3VidGl0bGUgdmlldyB1cGRhdGUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1WaXNpYmxlICYmCisgICAgICAgICAgICAgICAgY3VlLm1FbmRUaW1lTXMgPj0gbUxhc3RUaW1lTXMgJiYKKyAgICAgICAgICAgICAgICAoY3VlLm1TdGFydFRpbWVNcyA8IG1OZXh0U2NoZWR1bGVkVGltZU1zIHx8CisgICAgICAgICAgICAgICAgIG1OZXh0U2NoZWR1bGVkVGltZU1zIDwgMCkpIHsKKyAgICAgICAgICAgIHNjaGVkdWxlVGltZWRFdmVudHMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0VGltZVByb3ZpZGVyKE1lZGlhVGltZVByb3ZpZGVyIHRpbWVQcm92aWRlcikgeworICAgICAgICBpZiAobVRpbWVQcm92aWRlciA9PSB0aW1lUHJvdmlkZXIpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAobVRpbWVQcm92aWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtVGltZVByb3ZpZGVyLmNhbmNlbE5vdGlmaWNhdGlvbnModGhpcyk7CisgICAgICAgIH0KKyAgICAgICAgbVRpbWVQcm92aWRlciA9IHRpbWVQcm92aWRlcjsKKyAgICAgICAgaWYgKG1UaW1lUHJvdmlkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVRpbWVQcm92aWRlci5zY2hlZHVsZVVwZGF0ZSh0aGlzKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgc3RhdGljIGNsYXNzIEN1ZUxpc3QgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkN1ZUxpc3QiOworICAgICAgICAvLyBzaW1wbGlzdGljLCBpbmVmZmljaWVudCBpbXBsZW1lbnRhdGlvbgorICAgICAgICBwcml2YXRlIFNvcnRlZE1hcDxMb25nLCBWZWN0b3I8Q3VlPiA+IG1DdWVzOworICAgICAgICBwdWJsaWMgYm9vbGVhbiBERUJVRyA9IGZhbHNlOworCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBhZGRFdmVudChDdWUgY3VlLCBsb25nIHRpbWVNcykgeworICAgICAgICAgICAgVmVjdG9yPEN1ZT4gY3VlcyA9IG1DdWVzLmdldCh0aW1lTXMpOworICAgICAgICAgICAgaWYgKGN1ZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGN1ZXMgPSBuZXcgVmVjdG9yPEN1ZT4oMik7CisgICAgICAgICAgICAgICAgbUN1ZXMucHV0KHRpbWVNcywgY3Vlcyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGN1ZXMuY29udGFpbnMoY3VlKSkgeworICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBkdXBsaWNhdGUgY3VlcworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY3Vlcy5hZGQoY3VlKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHJlbW92ZUV2ZW50KEN1ZSBjdWUsIGxvbmcgdGltZU1zKSB7CisgICAgICAgICAgICBWZWN0b3I8Q3VlPiBjdWVzID0gbUN1ZXMuZ2V0KHRpbWVNcyk7CisgICAgICAgICAgICBpZiAoY3VlcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY3Vlcy5yZW1vdmUoY3VlKTsKKyAgICAgICAgICAgICAgICBpZiAoY3Vlcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtQ3Vlcy5yZW1vdmUodGltZU1zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhZGQoQ3VlIGN1ZSkgeworICAgICAgICAgICAgLy8gaWdub3JlIG5vbi1wb3NpdGl2ZS1kdXJhdGlvbiBjdWVzCisgICAgICAgICAgICBpZiAoY3VlLm1TdGFydFRpbWVNcyA+PSBjdWUubUVuZFRpbWVNcykKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIGlmICghYWRkRXZlbnQoY3VlLCBjdWUubVN0YXJ0VGltZU1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbG9uZyBsYXN0VGltZU1zID0gY3VlLm1TdGFydFRpbWVNczsKKyAgICAgICAgICAgIGlmIChjdWUubUlubmVyVGltZXNNcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChsb25nIHRpbWVNczogY3VlLm1Jbm5lclRpbWVzTXMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVNcyA+IGxhc3RUaW1lTXMgJiYgdGltZU1zIDwgY3VlLm1FbmRUaW1lTXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZEV2ZW50KGN1ZSwgdGltZU1zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RUaW1lTXMgPSB0aW1lTXM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFkZEV2ZW50KGN1ZSwgY3VlLm1FbmRUaW1lTXMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKEN1ZSBjdWUpIHsKKyAgICAgICAgICAgIHJlbW92ZUV2ZW50KGN1ZSwgY3VlLm1TdGFydFRpbWVNcyk7CisgICAgICAgICAgICBpZiAoY3VlLm1Jbm5lclRpbWVzTXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAobG9uZyB0aW1lTXM6IGN1ZS5tSW5uZXJUaW1lc01zKSB7CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZUV2ZW50KGN1ZSwgdGltZU1zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZW1vdmVFdmVudChjdWUsIGN1ZS5tRW5kVGltZU1zKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJdGVyYWJsZTxQYWlyPExvbmcsIEN1ZT4+IGVudHJpZXNCZXR3ZWVuKAorICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgbGFzdFRpbWVNcywgZmluYWwgbG9uZyB0aW1lTXMpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSXRlcmFibGU8UGFpcjxMb25nLCBDdWU+ID4oKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIEl0ZXJhdG9yPFBhaXI8TG9uZywgQ3VlPiA+IGl0ZXJhdG9yKCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgInNsaWNlICgiICsgbGFzdFRpbWVNcyArICIsICIgKyB0aW1lTXMgKyAiXT0iKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRW50cnlJdGVyYXRvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1ZXMuc3ViTWFwKGxhc3RUaW1lTXMgKyAxLCB0aW1lTXMgKyAxKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRW50cnlJdGVyYXRvcihudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgbG9uZyBuZXh0VGltZUFmdGVyKGxvbmcgdGltZU1zKSB7CisgICAgICAgICAgICBTb3J0ZWRNYXA8TG9uZywgVmVjdG9yPEN1ZT4+IHRhaWwgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB0YWlsID0gbUN1ZXMudGFpbE1hcCh0aW1lTXMgKyAxKTsKKyAgICAgICAgICAgICAgICBpZiAodGFpbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWlsLmZpcnN0S2V5KCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2goSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9IGNhdGNoKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzIEVudHJ5SXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcjxQYWlyPExvbmcsIEN1ZT4gPiB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICFtRG9uZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgUGFpcjxMb25nLCBDdWU+IG5leHQoKSB7CisgICAgICAgICAgICAgICAgaWYgKG1Eb25lKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCIiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUxhc3RFbnRyeSA9IG5ldyBQYWlyPExvbmcsIEN1ZT4oCisgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFRpbWVNcywgbUxpc3RJdGVyYXRvci5uZXh0KCkpOworICAgICAgICAgICAgICAgIG1MYXN0TGlzdEl0ZXJhdG9yID0gbUxpc3RJdGVyYXRvcjsKKyAgICAgICAgICAgICAgICBpZiAoIW1MaXN0SXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIG5leHRLZXkoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG1MYXN0RW50cnk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeworICAgICAgICAgICAgICAgIC8vIG9ubHkgYWxsb3cgcmVtb3ZpbmcgZW5kIHRhZ3MKKyAgICAgICAgICAgICAgICBpZiAobUxhc3RMaXN0SXRlcmF0b3IgPT0gbnVsbCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RFbnRyeS5zZWNvbmQubUVuZFRpbWVNcyAhPSBtTGFzdEVudHJ5LmZpcnN0KSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIiIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBlbmQtY3VlCisgICAgICAgICAgICAgICAgbUxhc3RMaXN0SXRlcmF0b3IucmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgbUxhc3RMaXN0SXRlcmF0b3IgPSBudWxsOworICAgICAgICAgICAgICAgIGlmIChtQ3Vlcy5nZXQobUxhc3RFbnRyeS5maXJzdCkuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbUN1ZXMucmVtb3ZlKG1MYXN0RW50cnkuZmlyc3QpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIHJlbW92ZSByZXN0IG9mIHRoZSBjdWVzCisgICAgICAgICAgICAgICAgQ3VlIGN1ZSA9IG1MYXN0RW50cnkuc2Vjb25kOworICAgICAgICAgICAgICAgIHJlbW92ZUV2ZW50KGN1ZSwgY3VlLm1TdGFydFRpbWVNcyk7CisgICAgICAgICAgICAgICAgaWYgKGN1ZS5tSW5uZXJUaW1lc01zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChsb25nIHRpbWVNczogY3VlLm1Jbm5lclRpbWVzTXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUV2ZW50KGN1ZSwgdGltZU1zKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIEVudHJ5SXRlcmF0b3IoU29ydGVkTWFwPExvbmcsIFZlY3RvcjxDdWU+ID4gY3VlcykgeworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCBjdWVzICsgIiIpOworICAgICAgICAgICAgICAgIG1SZW1haW5pbmdDdWVzID0gY3VlczsKKyAgICAgICAgICAgICAgICBtTGFzdExpc3RJdGVyYXRvciA9IG51bGw7CisgICAgICAgICAgICAgICAgbmV4dEtleSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIHZvaWQgbmV4dEtleSgpIHsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVJlbWFpbmluZ0N1ZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VGltZU1zID0gbVJlbWFpbmluZ0N1ZXMuZmlyc3RLZXkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1MaXN0SXRlcmF0b3IgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZW1haW5pbmdDdWVzLmdldChtQ3VycmVudFRpbWVNcykuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlbWFpbmluZ0N1ZXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVtYWluaW5nQ3Vlcy50YWlsTWFwKG1DdXJyZW50VGltZU1zICsgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZW1haW5pbmdDdWVzID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1Eb25lID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbURvbmUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgbVJlbWFpbmluZ0N1ZXMgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgbUxpc3RJdGVyYXRvciA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IHdoaWxlICghbUxpc3RJdGVyYXRvci5oYXNOZXh0KCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIGxvbmcgbUN1cnJlbnRUaW1lTXM7CisgICAgICAgICAgICBwcml2YXRlIEl0ZXJhdG9yPEN1ZT4gbUxpc3RJdGVyYXRvcjsKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtRG9uZTsKKyAgICAgICAgICAgIHByaXZhdGUgU29ydGVkTWFwPExvbmcsIFZlY3RvcjxDdWU+ID4gbVJlbWFpbmluZ0N1ZXM7CisgICAgICAgICAgICBwcml2YXRlIEl0ZXJhdG9yPEN1ZT4gbUxhc3RMaXN0SXRlcmF0b3I7CisgICAgICAgICAgICBwcml2YXRlIFBhaXI8TG9uZyxDdWU+IG1MYXN0RW50cnk7CisgICAgICAgIH0KKworICAgICAgICBDdWVMaXN0KCkgeworICAgICAgICAgICAgbUN1ZXMgPSBuZXcgVHJlZU1hcDxMb25nLCBWZWN0b3I8Q3VlPj4oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ3VlIHsKKyAgICAgICAgcHVibGljIGxvbmcgbVN0YXJ0VGltZU1zOworICAgICAgICBwdWJsaWMgbG9uZyBtRW5kVGltZU1zOworICAgICAgICBwdWJsaWMgbG9uZ1tdIG1Jbm5lclRpbWVzTXM7CisgICAgICAgIHB1YmxpYyBsb25nIG1SdW5JRDsKKworICAgICAgICBwdWJsaWMgQ3VlIG1OZXh0SW5SdW47CisKKyAgICAgICAgcHVibGljIHZvaWQgb25UaW1lKGxvbmcgdGltZU1zKSB7IH0KKyAgICB9CisKKyAgICAvKiogdXBkYXRlIG1SdW5zQnlFbmRUaW1lICh3aXRoIGRlZmF1bHQgZW5kIHRpbWUpICovCisgICAgcHJvdGVjdGVkIHZvaWQgZmluaXNoZWRSdW4obG9uZyBydW5JRCkgeworICAgICAgICBpZiAocnVuSUQgIT0gMCAmJiBydW5JRCAhPSB+MCkgeworICAgICAgICAgICAgUnVuIHJ1biA9IG1SdW5zQnlJRC5nZXQocnVuSUQpOworICAgICAgICAgICAgaWYgKHJ1biAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcnVuLnN0b3JlQnlFbmRUaW1lTXMobVJ1bnNCeUVuZFRpbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqIHVwZGF0ZSBtUnVuc0J5RW5kVGltZSB3aXRoIGdpdmVuIGVuZCB0aW1lICovCisgICAgcHVibGljIHZvaWQgc2V0UnVuRGlzY2FyZFRpbWVNcyhsb25nIHJ1bklELCBsb25nIHRpbWVNcykgeworICAgICAgICBpZiAocnVuSUQgIT0gMCAmJiBydW5JRCAhPSB+MCkgeworICAgICAgICAgICAgUnVuIHJ1biA9IG1SdW5zQnlJRC5nZXQocnVuSUQpOworICAgICAgICAgICAgaWYgKHJ1biAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcnVuLm1FbmRUaW1lTXMgPSB0aW1lTXM7CisgICAgICAgICAgICAgICAgcnVuLnN0b3JlQnlFbmRUaW1lTXMobVJ1bnNCeUVuZFRpbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqIHdoZXRoZXIgdGhpcyBpcyBhIHRleHQgdHJhY2sgd2hvIGZpcmVzIGV2ZW50cyBpbnN0ZWFkIGdldHRpbmcgcmVuZGVyZWQgKi8KKyAgICBwdWJsaWMgaW50IGdldFRyYWNrVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldFJlbmRlcmluZ1dpZGdldCgpID09IG51bGwKKyAgICAgICAgICAgICAgICA/IFRyYWNrSW5mby5NRURJQV9UUkFDS19UWVBFX1RJTUVEVEVYVAorICAgICAgICAgICAgICAgIDogVHJhY2tJbmZvLk1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEU7CisgICAgfQorCisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSdW4geworICAgICAgICBwdWJsaWMgQ3VlIG1GaXJzdEN1ZTsKKyAgICAgICAgcHVibGljIFJ1biBtTmV4dFJ1bkF0RW5kVGltZU1zOworICAgICAgICBwdWJsaWMgUnVuIG1QcmV2UnVuQXRFbmRUaW1lTXM7CisgICAgICAgIHB1YmxpYyBsb25nIG1FbmRUaW1lTXMgPSAtMTsKKyAgICAgICAgcHVibGljIGxvbmcgbVJ1bklEID0gMDsKKyAgICAgICAgcHJpdmF0ZSBsb25nIG1TdG9yZWRFbmRUaW1lTXMgPSAtMTsKKworICAgICAgICBwdWJsaWMgdm9pZCBzdG9yZUJ5RW5kVGltZU1zKExvbmdTcGFyc2VBcnJheTxSdW4+IHJ1bnNCeUVuZFRpbWUpIHsKKyAgICAgICAgICAgIC8vIHJlbW92ZSBvbGQgdmFsdWUgaWYgYW55CisgICAgICAgICAgICBpbnQgaXggPSBydW5zQnlFbmRUaW1lLmluZGV4T2ZLZXkobVN0b3JlZEVuZFRpbWVNcyk7CisgICAgICAgICAgICBpZiAoaXggPj0gMCkgeworICAgICAgICAgICAgICAgIGlmIChtUHJldlJ1bkF0RW5kVGltZU1zID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHRoaXMgPT0gcnVuc0J5RW5kVGltZS52YWx1ZUF0KGl4KSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtTmV4dFJ1bkF0RW5kVGltZU1zID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnNCeUVuZFRpbWUucmVtb3ZlQXQoaXgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcnVuc0J5RW5kVGltZS5zZXRWYWx1ZUF0KGl4LCBtTmV4dFJ1bkF0RW5kVGltZU1zKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZW1vdmVBdEVuZFRpbWVNcygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBhZGQgbmV3IHZhbHVlCisgICAgICAgICAgICBpZiAobUVuZFRpbWVNcyA+PSAwKSB7CisgICAgICAgICAgICAgICAgbVByZXZSdW5BdEVuZFRpbWVNcyA9IG51bGw7CisgICAgICAgICAgICAgICAgbU5leHRSdW5BdEVuZFRpbWVNcyA9IHJ1bnNCeUVuZFRpbWUuZ2V0KG1FbmRUaW1lTXMpOworICAgICAgICAgICAgICAgIGlmIChtTmV4dFJ1bkF0RW5kVGltZU1zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbU5leHRSdW5BdEVuZFRpbWVNcy5tUHJldlJ1bkF0RW5kVGltZU1zID0gdGhpczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcnVuc0J5RW5kVGltZS5wdXQobUVuZFRpbWVNcywgdGhpcyk7CisgICAgICAgICAgICAgICAgbVN0b3JlZEVuZFRpbWVNcyA9IG1FbmRUaW1lTXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmVBdEVuZFRpbWVNcygpIHsKKyAgICAgICAgICAgIFJ1biBwcmV2ID0gbVByZXZSdW5BdEVuZFRpbWVNczsKKworICAgICAgICAgICAgaWYgKG1QcmV2UnVuQXRFbmRUaW1lTXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1QcmV2UnVuQXRFbmRUaW1lTXMubU5leHRSdW5BdEVuZFRpbWVNcyA9IG1OZXh0UnVuQXRFbmRUaW1lTXM7CisgICAgICAgICAgICAgICAgbVByZXZSdW5BdEVuZFRpbWVNcyA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobU5leHRSdW5BdEVuZFRpbWVNcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbU5leHRSdW5BdEVuZFRpbWVNcy5tUHJldlJ1bkF0RW5kVGltZU1zID0gcHJldjsKKyAgICAgICAgICAgICAgICBtTmV4dFJ1bkF0RW5kVGltZU1zID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVyZmFjZSBmb3IgcmVuZGVyaW5nIHN1YnRpdGxlcyBvbnRvIGEgQ2FudmFzLgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgUmVuZGVyaW5nV2lkZ2V0IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIHdpZGdldCdzIGNhbGxiYWNrLCB3aGljaCBpcyB1c2VkIHRvIHNlbmQgdXBkYXRlcyB3aGVuIHRoZQorICAgICAgICAgKiByZW5kZXJlZCBkYXRhIGhhcyBjaGFuZ2VkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgdXBkYXRlIGNhbGxiYWNrCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRPbkNoYW5nZWRMaXN0ZW5lcihPbkNoYW5nZWRMaXN0ZW5lciBjYWxsYmFjayk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIHdpZGdldCdzIHNpemUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB3aWR0aCB3aWR0aCBpbiBwaXhlbHMKKyAgICAgICAgICogQHBhcmFtIGhlaWdodCBoZWlnaHQgaW4gcGl4ZWxzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgd2hldGhlciB0aGUgd2lkZ2V0IHNob3VsZCBkcmF3IHN1YnRpdGxlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHZpc2libGUgdHJ1ZSBpZiBzdWJ0aXRsZXMgc2hvdWxkIGJlIGRyYXduLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmVuZGVycyBzdWJ0aXRsZXMgb250byBhIHtAbGluayBDYW52YXN9LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYyBjYW52YXMgb24gd2hpY2ggdG8gcmVuZGVyIHN1YnRpdGxlcworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgZHJhdyhDYW52YXMgYyk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSB3aWRnZXQgaXMgYXR0YWNoZWQgdG8gYSB3aW5kb3cuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkF0dGFjaGVkVG9XaW5kb3coKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHdpZGdldCBpcyBkZXRhY2hlZCBmcm9tIGEgd2luZG93LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGJhY2sgdXNlZCB0byBzZW5kIHVwZGF0ZXMgYWJvdXQgY2hhbmdlcyB0byByZW5kZXJpbmcgZGF0YS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnRlcmZhY2UgT25DaGFuZ2VkTGlzdGVuZXIgeworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgcmVuZGVyaW5nIGRhdGEgaGFzIGNoYW5nZWQuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogQHBhcmFtIHJlbmRlcmluZ1dpZGdldCB0aGUgd2lkZ2V0IHdob3NlIGRhdGEgaGFzIGNoYW5nZWQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DaGFuZ2VkKFJlbmRlcmluZ1dpZGdldCByZW5kZXJpbmdXaWRnZXQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS91cGRhdGUvQXBpRmFjdG9yeS5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS91cGRhdGUvQXBpRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YmU1NDkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3VwZGF0ZS9BcGlGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwyNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFCcm93c2VyMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQnJvd3NlcjIuQnJvd3NlckNhbGxiYWNrOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjIuQ29udHJvbGxlckNhbGxiYWNrOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTIuTGlicmFyeVJvb3Q7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMi5NZWRpYUxpYnJhcnlTZXNzaW9uOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTIuTWVkaWFMaWJyYXJ5U2Vzc2lvbi5NZWRpYUxpYnJhcnlTZXNzaW9uQ2FsbGJhY2s7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWxpc3RBZ2VudDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZEdyb3VwMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuQ29udHJvbGxlckluZm87CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLlNlc3Npb25DYWxsYmFjazsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvblNlcnZpY2UyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uU2VydmljZTIuTWVkaWFOb3RpZmljYXRpb247CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5SYXRpbmcyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlZvbHVtZVByb3ZpZGVyMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYUJyb3dzZXIyUHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFDb250cm9sVmlldzJQcm92aWRlcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYUNvbnRyb2xsZXIyUHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFJdGVtMlByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhTGlicmFyeVNlcnZpY2UyUHJvdmlkZXIuTGlicmFyeVJvb3RQcm92aWRlcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYU1ldGFkYXRhMlByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhUGxheWxpc3RBZ2VudFByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhU2Vzc2lvbjJQcm92aWRlcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYVNlc3Npb24yUHJvdmlkZXIuQnVpbGRlckJhc2VQcm92aWRlcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYVNlc3Npb24yUHJvdmlkZXIuQ29tbWFuZEJ1dHRvblByb3ZpZGVyLkJ1aWxkZXJQcm92aWRlcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYVNlc3Npb25TZXJ2aWNlMlByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhU2Vzc2lvblNlcnZpY2UyUHJvdmlkZXIuTWVkaWFOb3RpZmljYXRpb25Qcm92aWRlcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5TZXNzaW9uVG9rZW4yUHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuU3RhdGljUHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuVmlkZW9WaWV3MlByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlZpZXdHcm91cFByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlZvbHVtZVByb3ZpZGVyMlByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSUludGVyZmFjZTsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lk1lZGlhQ29udHJvbFZpZXcyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlZpZGVvVmlldzI7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5JTWVkaWFDb250cm9sbGVyMjsKK2ltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYUJyb3dzZXIySW1wbDsKK2ltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYUNvbnRyb2xsZXIySW1wbDsKK2ltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0ySW1wbDsKK2ltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMkltcGw7CitpbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTJJbXBsLkxpYnJhcnlSb290SW1wbDsKK2ltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMkltcGw7CitpbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50SW1wbDsKK2ltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24ySW1wbDsKK2ltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb25TZXJ2aWNlMkltcGw7CitpbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuUmF0aW5nMkltcGw7CitpbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMkltcGw7CitpbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuVm9sdW1lUHJvdmlkZXIySW1wbDsKK2ltcG9ydCBjb20uYW5kcm9pZC53aWRnZXQuTWVkaWFDb250cm9sVmlldzJJbXBsOworaW1wb3J0IGNvbS5hbmRyb2lkLndpZGdldC5WaWRlb1ZpZXcySW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOworCitwdWJsaWMgZmluYWwgY2xhc3MgQXBpRmFjdG9yeSBpbXBsZW1lbnRzIFN0YXRpY1Byb3ZpZGVyIHsKKyAgICBwcml2YXRlIEFwaUZhY3RvcnkoKSB7IH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RhdGljUHJvdmlkZXIgaW5pdGlhbGl6ZShBcHBsaWNhdGlvbkluZm8gdXBkYXRhYmxlSW5mbykgeworICAgICAgICBBcGlIZWxwZXIuaW5pdGlhbGl6ZSh1cGRhdGFibGVJbmZvKTsKKyAgICAgICAgcmV0dXJuIG5ldyBBcGlGYWN0b3J5KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1lZGlhQ29udHJvbGxlcjJQcm92aWRlciBjcmVhdGVNZWRpYUNvbnRyb2xsZXIyKAorICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LCBNZWRpYUNvbnRyb2xsZXIyIGluc3RhbmNlLCBTZXNzaW9uVG9rZW4yIHRva2VuLAorICAgICAgICAgICAgRXhlY3V0b3IgZXhlY3V0b3IsIENvbnRyb2xsZXJDYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICByZXR1cm4gbmV3IE1lZGlhQ29udHJvbGxlcjJJbXBsKGNvbnRleHQsIGluc3RhbmNlLCB0b2tlbiwgZXhlY3V0b3IsIGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWVkaWFCcm93c2VyMlByb3ZpZGVyIGNyZWF0ZU1lZGlhQnJvd3NlcjIoQ29udGV4dCBjb250ZXh0LCBNZWRpYUJyb3dzZXIyIGluc3RhbmNlLAorICAgICAgICAgICAgU2Vzc2lvblRva2VuMiB0b2tlbiwgRXhlY3V0b3IgZXhlY3V0b3IsIEJyb3dzZXJDYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICByZXR1cm4gbmV3IE1lZGlhQnJvd3NlcjJJbXBsKGNvbnRleHQsIGluc3RhbmNlLCB0b2tlbiwgZXhlY3V0b3IsIGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWVkaWFTZXNzaW9uMlByb3ZpZGVyLkNvbW1hbmRQcm92aWRlciBjcmVhdGVNZWRpYVNlc3Npb24yQ29tbWFuZCgKKyAgICAgICAgICAgIFNlc3Npb25Db21tYW5kMiBpbnN0YW5jZSwgaW50IGNvbW1hbmRDb2RlLCBTdHJpbmcgYWN0aW9uLCBCdW5kbGUgZXh0cmEpIHsKKyAgICAgICAgaWYgKGFjdGlvbiA9PSBudWxsICYmIGV4dHJhID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFTZXNzaW9uMkltcGwuQ29tbWFuZEltcGwoaW5zdGFuY2UsIGNvbW1hbmRDb2RlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvbjJJbXBsLkNvbW1hbmRJbXBsKGluc3RhbmNlLCBhY3Rpb24sIGV4dHJhKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2Vzc2lvbkNvbW1hbmQyIGZyb21CdW5kbGVfTWVkaWFTZXNzaW9uMkNvbW1hbmQoQnVuZGxlIGNvbW1hbmQpIHsKKyAgICAgICAgcmV0dXJuIE1lZGlhU2Vzc2lvbjJJbXBsLkNvbW1hbmRJbXBsLmZyb21CdW5kbGVfaW1wbChjb21tYW5kKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWVkaWFTZXNzaW9uMlByb3ZpZGVyLkNvbW1hbmRHcm91cFByb3ZpZGVyIGNyZWF0ZU1lZGlhU2Vzc2lvbjJDb21tYW5kR3JvdXAoCisgICAgICAgICAgICBTZXNzaW9uQ29tbWFuZEdyb3VwMiBpbnN0YW5jZSwgU2Vzc2lvbkNvbW1hbmRHcm91cDIgb3RoZXIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVNlc3Npb24ySW1wbC5Db21tYW5kR3JvdXBJbXBsKGluc3RhbmNlLAorICAgICAgICAgICAgICAgIChvdGhlciA9PSBudWxsKSA/IG51bGwgOiBvdGhlci5nZXRQcm92aWRlcigpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2Vzc2lvbkNvbW1hbmRHcm91cDIgZnJvbUJ1bmRsZV9NZWRpYVNlc3Npb24yQ29tbWFuZEdyb3VwKEJ1bmRsZSBjb21tYW5kcykgeworICAgICAgICByZXR1cm4gTWVkaWFTZXNzaW9uMkltcGwuQ29tbWFuZEdyb3VwSW1wbC5mcm9tQnVuZGxlX2ltcGwoY29tbWFuZHMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNZWRpYVNlc3Npb24yUHJvdmlkZXIuQ29udHJvbGxlckluZm9Qcm92aWRlciBjcmVhdGVNZWRpYVNlc3Npb24yQ29udHJvbGxlckluZm8oCisgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIENvbnRyb2xsZXJJbmZvIGluc3RhbmNlLCBpbnQgdWlkLCBpbnQgcGlkLCBTdHJpbmcgcGFja2FnZU5hbWUsCisgICAgICAgICAgICBJSW50ZXJmYWNlIGNhbGxiYWNrKSB7CisgICAgICAgIHJldHVybiBuZXcgTWVkaWFTZXNzaW9uMkltcGwuQ29udHJvbGxlckluZm9JbXBsKGNvbnRleHQsCisgICAgICAgICAgICAgICAgaW5zdGFuY2UsIHVpZCwgcGlkLCBwYWNrYWdlTmFtZSwgKElNZWRpYUNvbnRyb2xsZXIyKSBjYWxsYmFjayk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ1aWxkZXJQcm92aWRlciBjcmVhdGVNZWRpYVNlc3Npb24yQ29tbWFuZEJ1dHRvbkJ1aWxkZXIoCisgICAgICAgICAgICBNZWRpYVNlc3Npb24yLkNvbW1hbmRCdXR0b24uQnVpbGRlciBpbnN0YW5jZSkgeworICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvbjJJbXBsLkNvbW1hbmRCdXR0b25JbXBsLkJ1aWxkZXJJbXBsKGluc3RhbmNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlckJhc2VQcm92aWRlcjxNZWRpYVNlc3Npb24yLCBTZXNzaW9uQ2FsbGJhY2s+IGNyZWF0ZU1lZGlhU2Vzc2lvbjJCdWlsZGVyKAorICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LCBNZWRpYVNlc3Npb24yLkJ1aWxkZXIgaW5zdGFuY2UpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVNlc3Npb24ySW1wbC5CdWlsZGVySW1wbChjb250ZXh0LCBpbnN0YW5jZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1lZGlhU2Vzc2lvblNlcnZpY2UyUHJvdmlkZXIgY3JlYXRlTWVkaWFTZXNzaW9uU2VydmljZTIoTWVkaWFTZXNzaW9uU2VydmljZTIgaW5zdGFuY2UpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwoaW5zdGFuY2UpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNZWRpYU5vdGlmaWNhdGlvblByb3ZpZGVyIGNyZWF0ZU1lZGlhU2Vzc2lvblNlcnZpY2UyTWVkaWFOb3RpZmljYXRpb24oCisgICAgICAgICAgICBNZWRpYU5vdGlmaWNhdGlvbiBpbnN0YW5jZSwgaW50IG5vdGlmaWNhdGlvbklkLCBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisgICAgICAgIHJldHVybiBuZXcgTWVkaWFTZXNzaW9uU2VydmljZTJJbXBsLk1lZGlhTm90aWZpY2F0aW9uSW1wbCgKKyAgICAgICAgICAgICAgICBpbnN0YW5jZSwgbm90aWZpY2F0aW9uSWQsIG5vdGlmaWNhdGlvbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1lZGlhU2Vzc2lvblNlcnZpY2UyUHJvdmlkZXIgY3JlYXRlTWVkaWFMaWJyYXJ5U2VydmljZTIoTWVkaWFMaWJyYXJ5U2VydmljZTIgaW5zdGFuY2UpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUxpYnJhcnlTZXJ2aWNlMkltcGwoaW5zdGFuY2UpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCdWlsZGVyQmFzZVByb3ZpZGVyPE1lZGlhTGlicmFyeVNlc3Npb24sIE1lZGlhTGlicmFyeVNlc3Npb25DYWxsYmFjaz4KKyAgICAgICAgY3JlYXRlTWVkaWFMaWJyYXJ5U2VydmljZTJCdWlsZGVyKE1lZGlhTGlicmFyeVNlcnZpY2UyIHNlcnZpY2UsCisgICAgICAgICAgICBNZWRpYUxpYnJhcnlTZXNzaW9uLkJ1aWxkZXIgaW5zdGFuY2UsIEV4ZWN1dG9yIGNhbGxiYWNrRXhlY3V0b3IsCisgICAgICAgICAgICBNZWRpYUxpYnJhcnlTZXNzaW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUxpYnJhcnlTZXJ2aWNlMkltcGwuQnVpbGRlckltcGwoc2VydmljZSwgaW5zdGFuY2UsIGNhbGxiYWNrRXhlY3V0b3IsCisgICAgICAgICAgICAgICAgY2FsbGJhY2spOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaWJyYXJ5Um9vdFByb3ZpZGVyIGNyZWF0ZU1lZGlhTGlicmFyeVNlcnZpY2UyTGlicmFyeVJvb3QoCisgICAgICAgICAgICBMaWJyYXJ5Um9vdCBpbnN0YW5jZSwgU3RyaW5nIHJvb3RJZCwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICByZXR1cm4gbmV3IExpYnJhcnlSb290SW1wbChpbnN0YW5jZSwgcm9vdElkLCBleHRyYXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNZWRpYUNvbnRyb2xWaWV3MlByb3ZpZGVyIGNyZWF0ZU1lZGlhQ29udHJvbFZpZXcyKE1lZGlhQ29udHJvbFZpZXcyIGluc3RhbmNlLAorICAgICAgICAgICAgVmlld0dyb3VwUHJvdmlkZXIgc3VwZXJQcm92aWRlciwgVmlld0dyb3VwUHJvdmlkZXIgcHJpdmF0ZVByb3ZpZGVyLAorICAgICAgICAgICAgQE51bGxhYmxlIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwgaW50IGRlZlN0eWxlUmVzKSB7CisgICAgICAgIHJldHVybiBuZXcgTWVkaWFDb250cm9sVmlldzJJbXBsKGluc3RhbmNlLCBzdXBlclByb3ZpZGVyLCBwcml2YXRlUHJvdmlkZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBWaWRlb1ZpZXcyUHJvdmlkZXIgY3JlYXRlVmlkZW9WaWV3MigKKyAgICAgICAgICAgIFZpZGVvVmlldzIgaW5zdGFuY2UsIFZpZXdHcm91cFByb3ZpZGVyIHN1cGVyUHJvdmlkZXIsIFZpZXdHcm91cFByb3ZpZGVyIHByaXZhdGVQcm92aWRlciwKKyAgICAgICAgICAgIEBOdWxsYWJsZSBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsIGludCBkZWZTdHlsZVJlcykgeworICAgICAgICByZXR1cm4gbmV3IFZpZGVvVmlldzJJbXBsKGluc3RhbmNlLCBzdXBlclByb3ZpZGVyLCBwcml2YXRlUHJvdmlkZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXNzaW9uVG9rZW4yUHJvdmlkZXIgY3JlYXRlU2Vzc2lvblRva2VuMihDb250ZXh0IGNvbnRleHQsIFNlc3Npb25Ub2tlbjIgaW5zdGFuY2UsCisgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBzZXJ2aWNlTmFtZSwgaW50IHVpZCkgeworICAgICAgICByZXR1cm4gbmV3IFNlc3Npb25Ub2tlbjJJbXBsKGNvbnRleHQsIGluc3RhbmNlLCBwYWNrYWdlTmFtZSwgc2VydmljZU5hbWUsIHVpZCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNlc3Npb25Ub2tlbjIgZnJvbUJ1bmRsZV9TZXNzaW9uVG9rZW4yKEJ1bmRsZSBidW5kbGUpIHsKKyAgICAgICAgcmV0dXJuIFNlc3Npb25Ub2tlbjJJbXBsLmZyb21CdW5kbGVfaW1wbChidW5kbGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNZWRpYUl0ZW0yUHJvdmlkZXIuQnVpbGRlclByb3ZpZGVyIGNyZWF0ZU1lZGlhSXRlbTJCdWlsZGVyKE1lZGlhSXRlbTIuQnVpbGRlciBpbnN0YW5jZSwKKyAgICAgICAgICAgIGludCBmbGFncykgeworICAgICAgICByZXR1cm4gbmV3IE1lZGlhSXRlbTJJbXBsLkJ1aWxkZXJJbXBsKGluc3RhbmNlLCBmbGFncyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1lZGlhSXRlbTIgZnJvbUJ1bmRsZV9NZWRpYUl0ZW0yKEJ1bmRsZSBidW5kbGUpIHsKKyAgICAgICAgcmV0dXJuIE1lZGlhSXRlbTJJbXBsLmZyb21CdW5kbGVfaW1wbChidW5kbGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBWb2x1bWVQcm92aWRlcjJQcm92aWRlciBjcmVhdGVWb2x1bWVQcm92aWRlcjIoVm9sdW1lUHJvdmlkZXIyIGluc3RhbmNlLCBpbnQgY29udHJvbFR5cGUsCisgICAgICAgICAgICBpbnQgbWF4Vm9sdW1lLCBpbnQgY3VycmVudFZvbHVtZSkgeworICAgICAgICByZXR1cm4gbmV3IFZvbHVtZVByb3ZpZGVyMkltcGwoaW5zdGFuY2UsIGNvbnRyb2xUeXBlLCBtYXhWb2x1bWUsIGN1cnJlbnRWb2x1bWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNZWRpYU1ldGFkYXRhMiBmcm9tQnVuZGxlX01lZGlhTWV0YWRhdGEyKEJ1bmRsZSBidW5kbGUpIHsKKyAgICAgICAgcmV0dXJuIE1lZGlhTWV0YWRhdGEySW1wbC5mcm9tQnVuZGxlX2ltcGwoYnVuZGxlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWVkaWFNZXRhZGF0YTJQcm92aWRlci5CdWlsZGVyUHJvdmlkZXIgY3JlYXRlTWVkaWFNZXRhZGF0YTJCdWlsZGVyKAorICAgICAgICAgICAgTWVkaWFNZXRhZGF0YTIuQnVpbGRlciBpbnN0YW5jZSkgeworICAgICAgICByZXR1cm4gbmV3IE1lZGlhTWV0YWRhdGEySW1wbC5CdWlsZGVySW1wbChpbnN0YW5jZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1lZGlhTWV0YWRhdGEyUHJvdmlkZXIuQnVpbGRlclByb3ZpZGVyIGNyZWF0ZU1lZGlhTWV0YWRhdGEyQnVpbGRlcigKKyAgICAgICAgICAgIE1lZGlhTWV0YWRhdGEyLkJ1aWxkZXIgaW5zdGFuY2UsIE1lZGlhTWV0YWRhdGEyIHNvdXJjZSkgeworICAgICAgICByZXR1cm4gbmV3IE1lZGlhTWV0YWRhdGEySW1wbC5CdWlsZGVySW1wbChpbnN0YW5jZSwgc291cmNlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmF0aW5nMiBmcm9tQnVuZGxlX1JhdGluZzIoQnVuZGxlIGJ1bmRsZSkgeworICAgICAgICByZXR1cm4gUmF0aW5nMkltcGwuZnJvbUJ1bmRsZV9pbXBsKGJ1bmRsZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJhdGluZzIgbmV3VW5yYXRlZFJhdGluZ19SYXRpbmcyKGludCByYXRpbmdTdHlsZSkgeworICAgICAgICByZXR1cm4gUmF0aW5nMkltcGwubmV3VW5yYXRlZFJhdGluZ19pbXBsKHJhdGluZ1N0eWxlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmF0aW5nMiBuZXdIZWFydFJhdGluZ19SYXRpbmcyKGJvb2xlYW4gaGFzSGVhcnQpIHsKKyAgICAgICAgcmV0dXJuIFJhdGluZzJJbXBsLm5ld0hlYXJ0UmF0aW5nX2ltcGwoaGFzSGVhcnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSYXRpbmcyIG5ld1RodW1iUmF0aW5nX1JhdGluZzIoYm9vbGVhbiB0aHVtYklzVXApIHsKKyAgICAgICAgcmV0dXJuIFJhdGluZzJJbXBsLm5ld1RodW1iUmF0aW5nX2ltcGwodGh1bWJJc1VwKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmF0aW5nMiBuZXdTdGFyUmF0aW5nX1JhdGluZzIoaW50IHN0YXJSYXRpbmdTdHlsZSwgZmxvYXQgc3RhclJhdGluZykgeworICAgICAgICByZXR1cm4gUmF0aW5nMkltcGwubmV3U3RhclJhdGluZ19pbXBsKHN0YXJSYXRpbmdTdHlsZSwgc3RhclJhdGluZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJhdGluZzIgbmV3UGVyY2VudGFnZVJhdGluZ19SYXRpbmcyKGZsb2F0IHBlcmNlbnQpIHsKKyAgICAgICAgcmV0dXJuIFJhdGluZzJJbXBsLm5ld1BlcmNlbnRhZ2VSYXRpbmdfaW1wbChwZXJjZW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWVkaWFQbGF5bGlzdEFnZW50UHJvdmlkZXIgY3JlYXRlTWVkaWFQbGF5bGlzdEFnZW50KE1lZGlhUGxheWxpc3RBZ2VudCBpbnN0YW5jZSkgeworICAgICAgICByZXR1cm4gbmV3IE1lZGlhUGxheWxpc3RBZ2VudEltcGwoaW5zdGFuY2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvdXBkYXRlL0FwaUhlbHBlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS91cGRhdGUvQXBpSGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ4YmI0OAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvdXBkYXRlL0FwaUhlbHBlci5qYXZhCkBAIC0wLDAgKzEsMTQyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZTsKKworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dFdyYXBwZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzLlRoZW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuWG1sUmVzb3VyY2VQYXJzZXI7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uR3VhcmRlZEJ5OworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC53aWRnZXQuU3BhY2U7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY3LndpZGdldC5CdXR0b25CYXJMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dFRoZW1lV3JhcHBlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwLk1lZGlhUm91dGVCdXR0b247CitpbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHAuTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uOworaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwLk1lZGlhUm91dGVWb2x1bWVTbGlkZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHAuT3ZlcmxheUxpc3RWaWV3OworCitwdWJsaWMgZmluYWwgY2xhc3MgQXBpSGVscGVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBBcHBsaWNhdGlvbkluZm8gc1VwZGF0YWJsZUluZm87CisKKyAgICBAR3VhcmRlZEJ5KCJ0aGlzIikKKyAgICBwcml2YXRlIHN0YXRpYyBUaGVtZSBzTGliVGhlbWU7CisKKyAgICBwcml2YXRlIEFwaUhlbHBlcigpIHsgfQorCisgICAgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZShBcHBsaWNhdGlvbkluZm8gdXBkYXRhYmxlSW5mbykgeworICAgICAgICBpZiAoc1VwZGF0YWJsZUluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW5pdGlhbGl6ZSBzaG91bGQgb25seSBiZSBjYWxsZWQgb25jZSIpOworICAgICAgICB9CisKKyAgICAgICAgc1VwZGF0YWJsZUluZm8gPSB1cGRhdGFibGVJbmZvOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VzIGdldExpYlJlc291cmNlcyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIGdldExpYlRoZW1lKGNvbnRleHQpLmdldFJlc291cmNlcygpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVGhlbWUgZ2V0TGliVGhlbWUoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGlmIChzTGliVGhlbWUgIT0gbnVsbCkgcmV0dXJuIHNMaWJUaGVtZTsKKworICAgICAgICByZXR1cm4gZ2V0TGliVGhlbWVTeW5jaHJvbml6ZWQoY29udGV4dCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBUaGVtZSBnZXRMaWJUaGVtZShDb250ZXh0IGNvbnRleHQsIGludCB0aGVtZUlkKSB7CisgICAgICAgIFRoZW1lIHRoZW1lID0gZ2V0TGliUmVzb3VyY2VzKGNvbnRleHQpLm5ld1RoZW1lKCk7CisgICAgICAgIHRoZW1lLmFwcGx5U3R5bGUodGhlbWVJZCwgdHJ1ZSk7CisgICAgICAgIHJldHVybiB0aGVtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExheW91dEluZmxhdGVyIGdldExheW91dEluZmxhdGVyKENvbnRleHQgY29udGV4dCkgeworICAgICAgICByZXR1cm4gZ2V0TGF5b3V0SW5mbGF0ZXIoY29udGV4dCwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMYXlvdXRJbmZsYXRlciBnZXRMYXlvdXRJbmZsYXRlcihDb250ZXh0IGNvbnRleHQsIFRoZW1lIHRoZW1lKSB7CisgICAgICAgIGlmICh0aGVtZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aGVtZSA9IGdldExpYlRoZW1lKGNvbnRleHQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETyAoYi83Mjk3NTk3Nik6IEF2b2lkIHRvIHVzZSBDb250ZXh0VGhlbWVXcmFwcGVyIHdpdGggYXBwIGNvbnRleHQgYW5kIGxpYiB0aGVtZS4KKyAgICAgICAgTGF5b3V0SW5mbGF0ZXIgbGF5b3V0SW5mbGF0ZXIgPSBMYXlvdXRJbmZsYXRlci5mcm9tKGNvbnRleHQpLmNsb25lSW5Db250ZXh0KAorICAgICAgICAgICAgICAgIG5ldyBDb250ZXh0VGhlbWVXcmFwcGVyKGNvbnRleHQsIHRoZW1lKSk7CisgICAgICAgIGxheW91dEluZmxhdGVyLnNldEZhY3RvcnkyKG5ldyBMYXlvdXRJbmZsYXRlci5GYWN0b3J5MigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KAorICAgICAgICAgICAgICAgICAgICBWaWV3IHBhcmVudCwgU3RyaW5nIG5hbWUsIENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgICAgICAgICAgaWYgKE1lZGlhUm91dGVCdXR0b24uY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVCdXR0b24oY29udGV4dCwgYXR0cnMpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoTWVkaWFSb3V0ZVZvbHVtZVNsaWRlci5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZVZvbHVtZVNsaWRlcihjb250ZXh0LCBhdHRycyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChNZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24uY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVFeHBhbmRDb2xsYXBzZUJ1dHRvbihjb250ZXh0LCBhdHRycyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChPdmVybGF5TGlzdFZpZXcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE92ZXJsYXlMaXN0Vmlldyhjb250ZXh0LCBhdHRycyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChCdXR0b25CYXJMYXlvdXQuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1dHRvbkJhckxheW91dChjb250ZXh0LCBhdHRycyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChTcGFjZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3BhY2UoY29udGV4dCwgYXR0cnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZVZpZXcoU3RyaW5nIG5hbWUsIENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG9uQ3JlYXRlVmlldyhudWxsLCBuYW1lLCBjb250ZXh0LCBhdHRycyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gbGF5b3V0SW5mbGF0ZXI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBWaWV3IGluZmxhdGVMaWJMYXlvdXQoQ29udGV4dCBjb250ZXh0LCBpbnQgbGliUmVzSWQpIHsKKyAgICAgICAgcmV0dXJuIGluZmxhdGVMaWJMYXlvdXQoY29udGV4dCwgZ2V0TGliVGhlbWUoY29udGV4dCksIGxpYlJlc0lkLCBudWxsLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBWaWV3IGluZmxhdGVMaWJMYXlvdXQoQ29udGV4dCBjb250ZXh0LCBUaGVtZSB0aGVtZSwgaW50IGxpYlJlc0lkKSB7CisgICAgICAgIHJldHVybiBpbmZsYXRlTGliTGF5b3V0KGNvbnRleHQsIHRoZW1lLCBsaWJSZXNJZCwgbnVsbCwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVmlldyBpbmZsYXRlTGliTGF5b3V0KENvbnRleHQgY29udGV4dCwgVGhlbWUgdGhlbWUsIGludCBsaWJSZXNJZCwKKyAgICAgICAgICAgIEBOdWxsYWJsZSBWaWV3R3JvdXAgcm9vdCwgYm9vbGVhbiBhdHRhY2hUb1Jvb3QpIHsKKyAgICAgICAgdHJ5IChYbWxSZXNvdXJjZVBhcnNlciBwYXJzZXIgPSBnZXRMaWJSZXNvdXJjZXMoY29udGV4dCkuZ2V0TGF5b3V0KGxpYlJlc0lkKSkgeworICAgICAgICAgICAgcmV0dXJuIGdldExheW91dEluZmxhdGVyKGNvbnRleHQsIHRoZW1lKS5pbmZsYXRlKHBhcnNlciwgcm9vdCwgYXR0YWNoVG9Sb290KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBUaGVtZSBnZXRMaWJUaGVtZVN5bmNocm9uaXplZChDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgaWYgKHNMaWJUaGVtZSAhPSBudWxsKSByZXR1cm4gc0xpYlRoZW1lOworCisgICAgICAgIGlmIChzVXBkYXRhYmxlSW5mbyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbml0aWFsaXplIGhhc24ndCBiZWVuIGNhbGxlZCB5ZXQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gc0xpYlRoZW1lID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpCisgICAgICAgICAgICAgICAgICAgIC5nZXRSZXNvdXJjZXNGb3JBcHBsaWNhdGlvbihzVXBkYXRhYmxlSW5mbykubmV3VGhlbWUoKTsKKyAgICAgICAgfSBjYXRjaCAoTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwaTI0L21lZGlhL01lZGlhUm91dGVyQXBpMjQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcGkyNC9tZWRpYS9NZWRpYVJvdXRlckFwaTI0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE0NmFmNgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcGkyNC9tZWRpYS9NZWRpYVJvdXRlckFwaTI0LmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOworCisvLyBAQFJlcXVpcmVzQXBpKDI0KQorZmluYWwgY2xhc3MgTWVkaWFSb3V0ZXJBcGkyNCB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBSb3V0ZUluZm8geworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBnZXREZXZpY2VUeXBlKE9iamVjdCByb3V0ZU9iaikgeworICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldERldmljZVR5cGUoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVBY3Rpb25Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZThkNDcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVBY3Rpb25Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMzMzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwOworCitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC52aWV3LkFjdGlvblByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVNlbGVjdG9yOworaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXI7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CisKKy8qKgorICogVGhlIG1lZGlhIHJvdXRlIGFjdGlvbiBwcm92aWRlciBkaXNwbGF5cyBhIHtAbGluayBNZWRpYVJvdXRlQnV0dG9uIG1lZGlhIHJvdXRlIGJ1dHRvbn0KKyAqIGluIHRoZSBhcHBsaWNhdGlvbidzIHtAbGluayBBY3Rpb25CYXJ9IHRvIGFsbG93IHRoZSB1c2VyIHRvIHNlbGVjdCByb3V0ZXMgYW5kCisgKiB0byBjb250cm9sIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcm91dGUuCisgKiA8cD4KKyAqIFRoZSBhcHBsaWNhdGlvbiBtdXN0IHNwZWNpZnkgdGhlIGtpbmRzIG9mIHJvdXRlcyB0aGF0IHRoZSB1c2VyIHNob3VsZCBiZSBhbGxvd2VkCisgKiB0byBzZWxlY3QgYnkgc3BlY2lmeWluZyBhIHtAbGluayBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3J9IHdpdGggdGhlCisgKiB7QGxpbmsgI3NldFJvdXRlU2VsZWN0b3J9IG1ldGhvZC4KKyAqIDwvcD48cD4KKyAqIFJlZmVyIHRvIHtAbGluayBNZWRpYVJvdXRlQnV0dG9ufSBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgYnV0dG9uIHRoYXQgd2lsbAorICogYXBwZWFyIGluIHRoZSBhY3Rpb24gYmFyIG1lbnUuICBOb3RlIHRoYXQgaW5zdGVhZCBvZiBkaXNhYmxpbmcgdGhlIGJ1dHRvbgorICogd2hlbiBubyByb3V0ZXMgYXJlIGF2YWlsYWJsZSwgdGhlIGFjdGlvbiBwcm92aWRlciB3aWxsIGluc3RlYWQgbWFrZSB0aGUKKyAqIG1lbnUgaXRlbSBpbnZpc2libGUuICBJbiB0aGlzIHdheSwgdGhlIGJ1dHRvbiB3aWxsIG9ubHkgYmUgdmlzaWJsZSB3aGVuIGl0CisgKiBpcyBwb3NzaWJsZSBmb3IgdGhlIHVzZXIgdG8gZGlzY292ZXIgYW5kIHNlbGVjdCBhIG1hdGNoaW5nIHJvdXRlLgorICogPC9wPgorICoKKyAqIDxoMz5QcmVyZXF1aXNpdGVzPC9oMz4KKyAqIDxwPgorICogVG8gdXNlIHRoZSBtZWRpYSByb3V0ZSBhY3Rpb24gcHJvdmlkZXIsIHRoZSBhY3Rpdml0eSBtdXN0IGJlIGEgc3ViY2xhc3Mgb2YKKyAqIHtAbGluayBBcHBDb21wYXRBY3Rpdml0eX0gZnJvbSB0aGUgPGNvZGU+YW5kcm9pZC5zdXBwb3J0LnY3LmFwcGNvbXBhdDwvY29kZT4KKyAqIHN1cHBvcnQgbGlicmFyeS4gIFJlZmVyIHRvIHN1cHBvcnQgbGlicmFyeSBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzLgorICogPC9wPgorICoKKyAqIDxoMz5FeGFtcGxlPC9oMz4KKyAqIDxwPgorICogPC9wPjxwPgorICogVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBkZWZpbmUgYSBtZW51IHJlc291cmNlIHRvIGluY2x1ZGUgdGhlIHByb3ZpZGVyIGluIHRoZQorICogYWN0aW9uIGJhciBvcHRpb25zIG1lbnUuICBOb3RlIHRoYXQgdGhlIHN1cHBvcnQgbGlicmFyeSBhY3Rpb24gYmFyIHVzZXMgYXR0cmlidXRlcworICogdGhhdCBhcmUgZGVmaW5lZCBpbiB0aGUgYXBwbGljYXRpb24ncyByZXNvdXJjZSBuYW1lc3BhY2UgcmF0aGVyIHRoYW4gdGhlIGZyYW1ld29yaydzCisgKiByZXNvdXJjZSBuYW1lc3BhY2UgdG8gY29uZmlndXJlIGVhY2ggaXRlbS4KKyAqIDwvcD48cHJlPgorICogJmx0O21lbnUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICogICAgICAgICB4bWxuczphcHA9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMtYXV0byI+CisgKiAgICAgJmx0O2l0ZW0gYW5kcm9pZDppZD0iQCtpZC9tZWRpYV9yb3V0ZV9tZW51X2l0ZW0iCisgKiAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvbWVkaWFfcm91dGVfbWVudV90aXRsZSIKKyAqICAgICAgICAgYXBwOnNob3dBc0FjdGlvbj0iYWx3YXlzIgorICogICAgICAgICBhcHA6YWN0aW9uUHJvdmlkZXJDbGFzcz0iYW5kcm9pZC5zdXBwb3J0LnY3LmFwcC5NZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIiLz4KKyAqICZsdDsvbWVudT4KKyAqIDwvcHJlPjxwPgorICogVGhlbiBjb25maWd1cmUgdGhlIG1lbnUgYW5kIHNldCB0aGUgcm91dGUgc2VsZWN0b3IgZm9yIHRoZSBjaG9vc2VyLgorICogPC9wPjxwcmU+CisgKiBwdWJsaWMgY2xhc3MgTXlBY3Rpdml0eSBleHRlbmRzIEFwcENvbXBhdEFjdGl2aXR5IHsKKyAqICAgICBwcml2YXRlIE1lZGlhUm91dGVyIG1Sb3V0ZXI7CisgKiAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlci5DYWxsYmFjayBtQ2FsbGJhY2s7CisgKiAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlU2VsZWN0b3IgbVNlbGVjdG9yOworICoKKyAqICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgKiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgKgorICogICAgICAgICBtUm91dGVyID0gTWVkaWFyb3V0ZXIuZ2V0SW5zdGFuY2UodGhpcyk7CisgKiAgICAgICAgIG1TZWxlY3RvciA9IG5ldyBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlcigpCisgKiAgICAgICAgICAgICAgICAgLmFkZENvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9BVURJTykKKyAqICAgICAgICAgICAgICAgICAuYWRkQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9SRU1PVEVfUExBWUJBQ0spCisgKiAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgKiAgICAgICAgIG1DYWxsYmFjayA9IG5ldyBNeUNhbGxiYWNrKCk7CisgKiAgICAgfQorICoKKyAqICAgICAvLyBBZGQgdGhlIGNhbGxiYWNrIG9uIHN0YXJ0IHRvIHRlbGwgdGhlIG1lZGlhIHJvdXRlciB3aGF0IGtpbmRzIG9mIHJvdXRlcworICogICAgIC8vIHRoZSBhcHBsaWNhdGlvbiBpcyBpbnRlcmVzdGVkIGluIHNvIHRoYXQgaXQgY2FuIHRyeSB0byBkaXNjb3ZlciBzdWl0YWJsZSBvbmVzLgorICogICAgIHB1YmxpYyB2b2lkIG9uU3RhcnQoKSB7CisgKiAgICAgICAgIHN1cGVyLm9uU3RhcnQoKTsKKyAqCisgKiAgICAgICAgIG1lZGlhUm91dGVyLmFkZENhbGxiYWNrKG1TZWxlY3RvciwgbUNhbGxiYWNrLAorICogICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUlkpOworICoKKyAqICAgICAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gbWVkaWFSb3V0ZXIudXBkYXRlU2VsZWN0ZWRSb3V0ZShtU2VsZWN0b3IpOworICogICAgICAgICAvLyBkbyBzb21ldGhpbmcgd2l0aCB0aGUgcm91dGUuLi4KKyAqICAgICB9CisgKgorICogICAgIC8vIFJlbW92ZSB0aGUgc2VsZWN0b3Igb24gc3RvcCB0byB0ZWxsIHRoZSBtZWRpYSByb3V0ZXIgdGhhdCBpdCBubyBsb25nZXIKKyAqICAgICAvLyBuZWVkcyB0byBpbnZlc3QgZWZmb3J0IHRyeWluZyB0byBkaXNjb3ZlciByb3V0ZXMgb2YgdGhlc2Uga2luZHMgZm9yIG5vdy4KKyAqICAgICBwdWJsaWMgdm9pZCBvblN0b3AoKSB7CisgKiAgICAgICAgIHN1cGVyLm9uU3RvcCgpOworICoKKyAqICAgICAgICAgbWVkaWFSb3V0ZXIucmVtb3ZlQ2FsbGJhY2sobUNhbGxiYWNrKTsKKyAqICAgICB9CisgKgorICogICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlT3B0aW9uc01lbnUoTWVudSBtZW51KSB7CisgKiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlT3B0aW9uc01lbnUobWVudSk7CisgKgorICogICAgICAgICBnZXRNZW51SW5mbGF0ZXIoKS5pbmZsYXRlKFIubWVudS5zYW1wbGVfbWVkaWFfcm91dGVyX21lbnUsIG1lbnUpOworICoKKyAqICAgICAgICAgTWVudUl0ZW0gbWVkaWFSb3V0ZU1lbnVJdGVtID0gbWVudS5maW5kSXRlbShSLmlkLm1lZGlhX3JvdXRlX21lbnVfaXRlbSk7CisgKiAgICAgICAgIE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlciBtZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIgPQorICogICAgICAgICAgICAgICAgIChNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIpTWVudUl0ZW1Db21wYXQuZ2V0QWN0aW9uUHJvdmlkZXIobWVkaWFSb3V0ZU1lbnVJdGVtKTsKKyAqICAgICAgICAgbWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyLnNldFJvdXRlU2VsZWN0b3IobVNlbGVjdG9yKTsKKyAqICAgICAgICAgcmV0dXJuIHRydWU7CisgKiAgICAgfQorICoKKyAqICAgICBwcml2YXRlIGZpbmFsIGNsYXNzIE15Q2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVJvdXRlci5DYWxsYmFjayB7CisgKiAgICAgICAgIC8vIEltcGxlbWVudCBjYWxsYmFjayBtZXRob2RzIGFzIG5lZWRlZC4KKyAqICAgICB9CisgKiB9CisgKiA8L3ByZT4KKyAqCisgKiBAc2VlICNzZXRSb3V0ZVNlbGVjdG9yCisgKi8KK3B1YmxpYyBjbGFzcyBNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIgZXh0ZW5kcyBBY3Rpb25Qcm92aWRlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIiOworCisgICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlciBtUm91dGVyOworICAgIHByaXZhdGUgZmluYWwgTWVkaWFSb3V0ZXJDYWxsYmFjayBtQ2FsbGJhY2s7CisKKyAgICBwcml2YXRlIE1lZGlhUm91dGVTZWxlY3RvciBtU2VsZWN0b3IgPSBNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFk7CisgICAgcHJpdmF0ZSBNZWRpYVJvdXRlRGlhbG9nRmFjdG9yeSBtRGlhbG9nRmFjdG9yeSA9IE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5LmdldERlZmF1bHQoKTsKKyAgICBwcml2YXRlIE1lZGlhUm91dGVCdXR0b24gbUJ1dHRvbjsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgdGhlIGFjdGlvbiBwcm92aWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworCisgICAgICAgIG1Sb3V0ZXIgPSBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZShjb250ZXh0KTsKKyAgICAgICAgbUNhbGxiYWNrID0gbmV3IE1lZGlhUm91dGVyQ2FsbGJhY2sodGhpcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRoYXQgdGhlIHVzZXIgY2FuCisgICAgICogc2VsZWN0IHVzaW5nIHRoZSBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHNlbGVjdG9yLCBuZXZlciBudWxsLgorICAgICAqLworICAgIEBOb25OdWxsCisgICAgcHVibGljIE1lZGlhUm91dGVTZWxlY3RvciBnZXRSb3V0ZVNlbGVjdG9yKCkgeworICAgICAgICByZXR1cm4gbVNlbGVjdG9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGZvciBmaWx0ZXJpbmcgdGhlIHJvdXRlcyB0aGF0IHRoZSB1c2VyIGNhbgorICAgICAqIHNlbGVjdCB1c2luZyB0aGUgbWVkaWEgcm91dGUgY2hvb3NlciBkaWFsb2cuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yLCBtdXN0IG5vdCBiZSBudWxsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJvdXRlU2VsZWN0b3IoQE5vbk51bGwgTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7CisgICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1TZWxlY3Rvci5lcXVhbHMoc2VsZWN0b3IpKSB7CisgICAgICAgICAgICAvLyBGSVhNRTogV2UgY3VycmVudGx5IGhhdmUgbm8gd2F5IG9mIGtub3dpbmcgd2hldGhlciB0aGUgYWN0aW9uIHByb3ZpZGVyCisgICAgICAgICAgICAvLyBpcyBzdGlsbCBuZWVkZWQgYnkgdGhlIFVJLiAgVW5mb3J0dW5hdGVseSB0aGlzIG1lYW5zIHRoZSBhY3Rpb24gcHJvdmlkZXIKKyAgICAgICAgICAgIC8vIG1heSBsZWFrIGNhbGxiYWNrcyB1bnRpbCBnYXJiYWdlIGNvbGxlY3Rpb24gb2NjdXJzLiAgVGhpcyBtYXkgcmVzdWx0IGluCisgICAgICAgICAgICAvLyBtZWRpYSByb3V0ZSBwcm92aWRlcnMgZG9pbmcgbW9yZSB3b3JrIHRoYW4gbmVjZXNzYXJ5IGluIHRoZSBzaG9ydCB0ZXJtCisgICAgICAgICAgICAvLyB3aGlsZSB0cnlpbmcgdG8gZGlzY292ZXIgcm91dGVzIHRoYXQgYXJlIG5vIGxvbmdlciBvZiBpbnRlcmVzdCB0byB0aGUKKyAgICAgICAgICAgIC8vIGFwcGxpY2F0aW9uLiAgVG8gc29sdmUgdGhpcyBwcm9ibGVtLCB0aGUgYWN0aW9uIHByb3ZpZGVyIHdpbGwgbmVlZCBzb21lCisgICAgICAgICAgICAvLyBpbmRpY2F0aW9uIGZyb20gdGhlIGZyYW1ld29yayB0aGF0IGl0IGlzIGJlaW5nIGRlc3Ryb3llZC4KKyAgICAgICAgICAgIGlmICghbVNlbGVjdG9yLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIG1Sb3V0ZXIucmVtb3ZlQ2FsbGJhY2sobUNhbGxiYWNrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghc2VsZWN0b3IuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgbVJvdXRlci5hZGRDYWxsYmFjayhzZWxlY3RvciwgbUNhbGxiYWNrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TZWxlY3RvciA9IHNlbGVjdG9yOworICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7CisKKyAgICAgICAgICAgIGlmIChtQnV0dG9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQnV0dG9uLnNldFJvdXRlU2VsZWN0b3Ioc2VsZWN0b3IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbWVkaWEgcm91dGUgZGlhbG9nIGZhY3RvcnkgdG8gdXNlIHdoZW4gc2hvd2luZyB0aGUgcm91dGUgY2hvb3NlcgorICAgICAqIG9yIGNvbnRyb2xsZXIgZGlhbG9nLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgZGlhbG9nIGZhY3RvcnksIG5ldmVyIG51bGwuCisgICAgICovCisgICAgQE5vbk51bGwKKyAgICBwdWJsaWMgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkgZ2V0RGlhbG9nRmFjdG9yeSgpIHsKKyAgICAgICAgcmV0dXJuIG1EaWFsb2dGYWN0b3J5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG1lZGlhIHJvdXRlIGRpYWxvZyBmYWN0b3J5IHRvIHVzZSB3aGVuIHNob3dpbmcgdGhlIHJvdXRlIGNob29zZXIKKyAgICAgKiBvciBjb250cm9sbGVyIGRpYWxvZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmYWN0b3J5IFRoZSBkaWFsb2cgZmFjdG9yeSwgbXVzdCBub3QgYmUgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREaWFsb2dGYWN0b3J5KEBOb25OdWxsIE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5IGZhY3RvcnkpIHsKKyAgICAgICAgaWYgKGZhY3RvcnkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZmFjdG9yeSBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAobURpYWxvZ0ZhY3RvcnkgIT0gZmFjdG9yeSkgeworICAgICAgICAgICAgbURpYWxvZ0ZhY3RvcnkgPSBmYWN0b3J5OworCisgICAgICAgICAgICBpZiAobUJ1dHRvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUJ1dHRvbi5zZXREaWFsb2dGYWN0b3J5KGZhY3RvcnkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgYXNzb2NpYXRlZCBtZWRpYSByb3V0ZSBidXR0b24sIG9yIG51bGwgaWYgaXQgaGFzIG5vdCB5ZXQgYmVlbiBjcmVhdGVkLgorICAgICAqLworICAgIEBOdWxsYWJsZQorICAgIHB1YmxpYyBNZWRpYVJvdXRlQnV0dG9uIGdldE1lZGlhUm91dGVCdXR0b24oKSB7CisgICAgICAgIHJldHVybiBtQnV0dG9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSBtZWRpYSByb3V0ZSBidXR0b24gaXMgYmVpbmcgY3JlYXRlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjdXN0b21pemUgdGhlIGJ1dHRvbi4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIE1lZGlhUm91dGVCdXR0b24gb25DcmVhdGVNZWRpYVJvdXRlQnV0dG9uKCkgeworICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVCdXR0b24oZ2V0Q29udGV4dCgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQorICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlQWN0aW9uVmlldygpIHsKKyAgICAgICAgaWYgKG1CdXR0b24gIT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAib25DcmVhdGVBY3Rpb25WaWV3OiB0aGlzIEFjdGlvblByb3ZpZGVyIGlzIGFscmVhZHkgYXNzb2NpYXRlZCAiICsKKyAgICAgICAgICAgICAgICAgICAgIndpdGggYSBtZW51IGl0ZW0uIERvbid0IHJldXNlIE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlciBpbnN0YW5jZXMhICIgKworICAgICAgICAgICAgICAgICAgICAiQWJhbmRvbmluZyB0aGUgb2xkIG1lbnUgaXRlbS4uLiIpOworICAgICAgICB9CisKKyAgICAgICAgbUJ1dHRvbiA9IG9uQ3JlYXRlTWVkaWFSb3V0ZUJ1dHRvbigpOworICAgICAgICBtQnV0dG9uLnNldENoZWF0U2hlZXRFbmFibGVkKHRydWUpOworICAgICAgICBtQnV0dG9uLnNldFJvdXRlU2VsZWN0b3IobVNlbGVjdG9yKTsKKyAgICAgICAgbUJ1dHRvbi5zZXREaWFsb2dGYWN0b3J5KG1EaWFsb2dGYWN0b3J5KTsKKyAgICAgICAgbUJ1dHRvbi5zZXRMYXlvdXRQYXJhbXMobmV3IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMoCisgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsCisgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpKTsKKyAgICAgICAgcmV0dXJuIG1CdXR0b247CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25QZXJmb3JtRGVmYXVsdEFjdGlvbigpIHsKKyAgICAgICAgaWYgKG1CdXR0b24gIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1CdXR0b24uc2hvd0RpYWxvZygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvdmVycmlkZXNJdGVtVmlzaWJpbGl0eSgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCkgeworICAgICAgICByZXR1cm4gbVJvdXRlci5pc1JvdXRlQXZhaWxhYmxlKG1TZWxlY3RvciwKKyAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5BVkFJTEFCSUxJVFlfRkxBR19JR05PUkVfREVGQVVMVF9ST1VURSk7CisgICAgfQorCisgICAgdm9pZCByZWZyZXNoUm91dGUoKSB7CisgICAgICAgIHJlZnJlc2hWaXNpYmlsaXR5KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgTWVkaWFSb3V0ZXJDYWxsYmFjayBleHRlbmRzIE1lZGlhUm91dGVyLkNhbGxiYWNrIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBXZWFrUmVmZXJlbmNlPE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlcj4gbVByb3ZpZGVyV2VhazsKKworICAgICAgICBwdWJsaWMgTWVkaWFSb3V0ZXJDYWxsYmFjayhNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIpIHsKKyAgICAgICAgICAgIG1Qcm92aWRlcldlYWsgPSBuZXcgV2Vha1JlZmVyZW5jZTxNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXI+KHByb3ZpZGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQWRkZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgeworICAgICAgICAgICAgcmVmcmVzaFJvdXRlKHJvdXRlcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVJlbW92ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgeworICAgICAgICAgICAgcmVmcmVzaFJvdXRlKHJvdXRlcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgeworICAgICAgICAgICAgcmVmcmVzaFJvdXRlKHJvdXRlcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlckFkZGVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUHJvdmlkZXJJbmZvIHByb3ZpZGVyKSB7CisgICAgICAgICAgICByZWZyZXNoUm91dGUocm91dGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblByb3ZpZGVyUmVtb3ZlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlByb3ZpZGVySW5mbyBwcm92aWRlcikgeworICAgICAgICAgICAgcmVmcmVzaFJvdXRlKHJvdXRlcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlckNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Qcm92aWRlckluZm8gcHJvdmlkZXIpIHsKKyAgICAgICAgICAgIHJlZnJlc2hSb3V0ZShyb3V0ZXIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHJlZnJlc2hSb3V0ZShNZWRpYVJvdXRlciByb3V0ZXIpIHsKKyAgICAgICAgICAgIE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlciBwcm92aWRlciA9IG1Qcm92aWRlcldlYWsuZ2V0KCk7CisgICAgICAgICAgICBpZiAocHJvdmlkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHByb3ZpZGVyLnJlZnJlc2hSb3V0ZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByb3V0ZXIucmVtb3ZlQ2FsbGJhY2sodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVCdXR0b24uamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUJ1dHRvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZThhNjMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVCdXR0b24uamF2YQpAQCAtMCwwICsxLDYyOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKKworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dFdyYXBwZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db2xvclN0YXRlTGlzdDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5BbmltYXRpb25EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNUYXNrOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZUNvbXBhdDsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjcud2lkZ2V0LlRvb2x0aXBDb21wYXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU291bmRFZmZlY3RDb25zdGFudHM7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuQXBpSGVscGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5SOworaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVNlbGVjdG9yOworaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXI7CisKKy8qKgorICogVGhlIG1lZGlhIHJvdXRlIGJ1dHRvbiBhbGxvd3MgdGhlIHVzZXIgdG8gc2VsZWN0IHJvdXRlcyBhbmQgdG8gY29udHJvbCB0aGUKKyAqIGN1cnJlbnRseSBzZWxlY3RlZCByb3V0ZS4KKyAqIDxwPgorICogVGhlIGFwcGxpY2F0aW9uIG11c3Qgc3BlY2lmeSB0aGUga2luZHMgb2Ygcm91dGVzIHRoYXQgdGhlIHVzZXIgc2hvdWxkIGJlIGFsbG93ZWQKKyAqIHRvIHNlbGVjdCBieSBzcGVjaWZ5aW5nIGEge0BsaW5rIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3Rvcn0gd2l0aCB0aGUKKyAqIHtAbGluayAjc2V0Um91dGVTZWxlY3Rvcn0gbWV0aG9kLgorICogPC9wPjxwPgorICogV2hlbiB0aGUgZGVmYXVsdCByb3V0ZSBpcyBzZWxlY3RlZCBvciB3aGVuIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcm91dGUgZG9lcyBub3QKKyAqIG1hdGNoIHRoZSB7QGxpbmsgI2dldFJvdXRlU2VsZWN0b3IoKSBzZWxlY3Rvcn0sIHRoZSBidXR0b24gd2lsbCBhcHBlYXIgaW4KKyAqIGFuIGluYWN0aXZlIHN0YXRlIGluZGljYXRpbmcgdGhhdCB0aGUgYXBwbGljYXRpb24gaXMgbm90IGNvbm5lY3RlZCB0byBhCisgKiByb3V0ZSBvZiB0aGUga2luZCB0aGF0IGl0IHdhbnRzIHRvIHVzZS4gIENsaWNraW5nIG9uIHRoZSBidXR0b24gb3BlbnMKKyAqIGEge0BsaW5rIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nfSB0byBhbGxvdyB0aGUgdXNlciB0byBzZWxlY3QgYSByb3V0ZS4KKyAqIElmIG5vIG5vbi1kZWZhdWx0IHJvdXRlcyBtYXRjaCB0aGUgc2VsZWN0b3IgYW5kIGl0IGlzIG5vdCBwb3NzaWJsZSBmb3IgYW4gYWN0aXZlCisgKiBzY2FuIHRvIGRpc2NvdmVyIGFueSBtYXRjaGluZyByb3V0ZXMsIHRoZW4gdGhlIGJ1dHRvbiBpcyBkaXNhYmxlZCBhbmQgY2Fubm90CisgKiBiZSBjbGlja2VkLgorICogPC9wPjxwPgorICogV2hlbiBhIG5vbi1kZWZhdWx0IHJvdXRlIGlzIHNlbGVjdGVkIHRoYXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IsIHRoZSBidXR0b24gd2lsbAorICogYXBwZWFyIGluIGFuIGFjdGl2ZSBzdGF0ZSBpbmRpY2F0aW5nIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGlzIGNvbm5lY3RlZAorICogdG8gYSByb3V0ZSBvZiB0aGUga2luZCB0aGF0IGl0IHdhbnRzIHRvIHVzZS4gIFRoZSBidXR0b24gbWF5IGFsc28gYXBwZWFyCisgKiBpbiBhbiBpbnRlcm1lZGlhcnkgY29ubmVjdGluZyBzdGF0ZSBpZiB0aGUgcm91dGUgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgY29ubmVjdGluZworICogdG8gdGhlIGRlc3RpbmF0aW9uIGJ1dCBoYXMgbm90IHlldCBjb21wbGV0ZWQgZG9pbmcgc28uICBJbiBlaXRoZXIgY2FzZSwgY2xpY2tpbmcKKyAqIG9uIHRoZSBidXR0b24gb3BlbnMgYSB7QGxpbmsgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2d9IHRvIGFsbG93IHRoZSB1c2VyCisgKiB0byBjb250cm9sIG9yIGRpc2Nvbm5lY3QgZnJvbSB0aGUgY3VycmVudCByb3V0ZS4KKyAqIDwvcD4KKyAqCisgKiA8aDM+UHJlcmVxdWlzaXRlczwvaDM+CisgKiA8cD4KKyAqIFRvIHVzZSB0aGUgbWVkaWEgcm91dGUgYnV0dG9uLCB0aGUgYWN0aXZpdHkgbXVzdCBiZSBhIHN1YmNsYXNzIG9mCisgKiB7QGxpbmsgRnJhZ21lbnRBY3Rpdml0eX0gZnJvbSB0aGUgPGNvZGU+YW5kcm9pZC5zdXBwb3J0LnY0PC9jb2RlPgorICogc3VwcG9ydCBsaWJyYXJ5LiAgUmVmZXIgdG8gc3VwcG9ydCBsaWJyYXJ5IGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMuCisgKiA8L3A+CisgKgorICogQHNlZSBNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIKKyAqIEBzZWUgI3NldFJvdXRlU2VsZWN0b3IKKyAqLworcHVibGljIGNsYXNzIE1lZGlhUm91dGVCdXR0b24gZXh0ZW5kcyBWaWV3IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUm91dGVCdXR0b24iOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENIT09TRVJfRlJBR01FTlRfVEFHID0KKyAgICAgICAgICAgICJhbmRyb2lkLnN1cHBvcnQudjcubWVkaWFyb3V0ZXI6TWVkaWFSb3V0ZUNob29zZXJEaWFsb2dGcmFnbWVudCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRST0xMRVJfRlJBR01FTlRfVEFHID0KKyAgICAgICAgICAgICJhbmRyb2lkLnN1cHBvcnQudjcubWVkaWFyb3V0ZXI6TWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2dGcmFnbWVudCI7CisKKyAgICBwcml2YXRlIGZpbmFsIE1lZGlhUm91dGVyIG1Sb3V0ZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlckNhbGxiYWNrIG1DYWxsYmFjazsKKworICAgIHByaXZhdGUgTWVkaWFSb3V0ZVNlbGVjdG9yIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5FTVBUWTsKKyAgICBwcml2YXRlIGludCBtUm91dGVDYWxsYmFja0ZsYWdzOworICAgIHByaXZhdGUgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkgbURpYWxvZ0ZhY3RvcnkgPSBNZWRpYVJvdXRlRGlhbG9nRmFjdG9yeS5nZXREZWZhdWx0KCk7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbUF0dGFjaGVkVG9XaW5kb3c7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTcGFyc2VBcnJheTxEcmF3YWJsZS5Db25zdGFudFN0YXRlPiBzUmVtb3RlSW5kaWNhdG9yQ2FjaGUgPQorICAgICAgICAgICAgbmV3IFNwYXJzZUFycmF5PD4oMik7CisgICAgcHJpdmF0ZSBSZW1vdGVJbmRpY2F0b3JMb2FkZXIgbVJlbW90ZUluZGljYXRvckxvYWRlcjsKKyAgICBwcml2YXRlIERyYXdhYmxlIG1SZW1vdGVJbmRpY2F0b3I7CisgICAgcHJpdmF0ZSBib29sZWFuIG1SZW1vdGVBY3RpdmU7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Jc0Nvbm5lY3Rpbmc7CisKKyAgICBwcml2YXRlIENvbG9yU3RhdGVMaXN0IG1CdXR0b25UaW50OworICAgIHByaXZhdGUgaW50IG1NaW5XaWR0aDsKKyAgICBwcml2YXRlIGludCBtTWluSGVpZ2h0OworCisgICAgLy8gVGhlIGNoZWNrZWQgc3RhdGUgaXMgdXNlZCB3aGVuIGNvbm5lY3RlZCB0byBhIHJlbW90ZSByb3V0ZS4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBDSEVDS0VEX1NUQVRFX1NFVCA9IHsKKyAgICAgICAgYW5kcm9pZC5SLmF0dHIuc3RhdGVfY2hlY2tlZAorICAgIH07CisKKyAgICAvLyBUaGUgY2hlY2thYmxlIHN0YXRlIGlzIHVzZWQgd2hpbGUgY29ubmVjdGluZyB0byBhIHJlbW90ZSByb3V0ZS4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBDSEVDS0FCTEVfU1RBVEVfU0VUID0geworICAgICAgICBhbmRyb2lkLlIuYXR0ci5zdGF0ZV9jaGVja2FibGUKKyAgICB9OworCisgICAgcHVibGljIE1lZGlhUm91dGVCdXR0b24oQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIE1lZGlhUm91dGVCdXR0b24oQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgUi5hdHRyLm1lZGlhUm91dGVCdXR0b25TdHlsZSk7CisgICAgfQorCisgICAgcHVibGljIE1lZGlhUm91dGVCdXR0b24oQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIpIHsKKyAgICAgICAgc3VwZXIoTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5jcmVhdGVUaGVtZWRCdXR0b25Db250ZXh0KGNvbnRleHQpLCBhdHRycywgZGVmU3R5bGVBdHRyKTsKKyAgICAgICAgY29udGV4dCA9IGdldENvbnRleHQoKTsKKworICAgICAgICBtUm91dGVyID0gTWVkaWFSb3V0ZXIuZ2V0SW5zdGFuY2UoY29udGV4dCk7CisgICAgICAgIG1DYWxsYmFjayA9IG5ldyBNZWRpYVJvdXRlckNhbGxiYWNrKCk7CisKKyAgICAgICAgUmVzb3VyY2VzLlRoZW1lIHRoZW1lID0gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhjb250ZXh0KS5uZXdUaGVtZSgpOworICAgICAgICB0aGVtZS5hcHBseVN0eWxlKE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0Um91dGVyVGhlbWVJZChjb250ZXh0KSwgdHJ1ZSk7CisgICAgICAgIFR5cGVkQXJyYXkgYSA9IHRoZW1lLm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsCisgICAgICAgICAgICAgICAgUi5zdHlsZWFibGUuTWVkaWFSb3V0ZUJ1dHRvbiwgZGVmU3R5bGVBdHRyLCAwKTsKKworICAgICAgICBtQnV0dG9uVGludCA9IGEuZ2V0Q29sb3JTdGF0ZUxpc3QoUi5zdHlsZWFibGUuTWVkaWFSb3V0ZUJ1dHRvbl9tZWRpYVJvdXRlQnV0dG9uVGludCk7CisgICAgICAgIG1NaW5XaWR0aCA9IGEuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAorICAgICAgICAgICAgICAgIFIuc3R5bGVhYmxlLk1lZGlhUm91dGVCdXR0b25fYW5kcm9pZF9taW5XaWR0aCwgMCk7CisgICAgICAgIG1NaW5IZWlnaHQgPSBhLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKKyAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5NZWRpYVJvdXRlQnV0dG9uX2FuZHJvaWRfbWluSGVpZ2h0LCAwKTsKKyAgICAgICAgaW50IHJlbW90ZUluZGljYXRvclJlc0lkID0gYS5nZXRSZXNvdXJjZUlkKAorICAgICAgICAgICAgICAgIFIuc3R5bGVhYmxlLk1lZGlhUm91dGVCdXR0b25fZXh0ZXJuYWxSb3V0ZUVuYWJsZWREcmF3YWJsZSwgMCk7CisgICAgICAgIGEucmVjeWNsZSgpOworCisgICAgICAgIGlmIChyZW1vdGVJbmRpY2F0b3JSZXNJZCAhPSAwKSB7CisgICAgICAgICAgICBEcmF3YWJsZS5Db25zdGFudFN0YXRlIHJlbW90ZUluZGljYXRvclN0YXRlID0KKyAgICAgICAgICAgICAgICAgICAgc1JlbW90ZUluZGljYXRvckNhY2hlLmdldChyZW1vdGVJbmRpY2F0b3JSZXNJZCk7CisgICAgICAgICAgICBpZiAocmVtb3RlSW5kaWNhdG9yU3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNldFJlbW90ZUluZGljYXRvckRyYXdhYmxlKHJlbW90ZUluZGljYXRvclN0YXRlLm5ld0RyYXdhYmxlKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yTG9hZGVyID0gbmV3IFJlbW90ZUluZGljYXRvckxvYWRlcihyZW1vdGVJbmRpY2F0b3JSZXNJZCk7CisgICAgICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvckxvYWRlci5leGVjdXRlT25FeGVjdXRvcihBc3luY1Rhc2suVEhSRUFEX1BPT0xfRVhFQ1VUT1IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdXBkYXRlQ29udGVudERlc2NyaXB0aW9uKCk7CisgICAgICAgIHNldENsaWNrYWJsZSh0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBtZWRpYSByb3V0ZSBzZWxlY3RvciBmb3IgZmlsdGVyaW5nIHRoZSByb3V0ZXMgdGhhdCB0aGUgdXNlciBjYW4KKyAgICAgKiBzZWxlY3QgdXNpbmcgdGhlIG1lZGlhIHJvdXRlIGNob29zZXIgZGlhbG9nLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgc2VsZWN0b3IsIG5ldmVyIG51bGwuCisgICAgICovCisgICAgQE5vbk51bGwKKyAgICBwdWJsaWMgTWVkaWFSb3V0ZVNlbGVjdG9yIGdldFJvdXRlU2VsZWN0b3IoKSB7CisgICAgICAgIHJldHVybiBtU2VsZWN0b3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRoYXQgdGhlIHVzZXIgY2FuCisgICAgICogc2VsZWN0IHVzaW5nIHRoZSBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Um91dGVTZWxlY3RvcihNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgc2V0Um91dGVTZWxlY3RvcihzZWxlY3RvciwgMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRoYXQgdGhlIHVzZXIgY2FuCisgICAgICogc2VsZWN0IHVzaW5nIHRoZSBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IuCisgICAgICogQHBhcmFtIGZsYWdzIEZsYWdzIHRvIGNvbnRyb2wgdGhlIGJlaGF2aW9yIG9mIHRoZSBjYWxsYmFjay4gTWF5IGJlIHplcm8gb3IgYSBjb21iaW5hdGlvbiBvZgorICAgICAqICAgICAgICAgICAgICB7QGxpbmsgI01lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTn0gYW5kCisgICAgICogICAgICAgICAgICAgIHtAbGluayAjTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19VTkZJTFRFUkVEX0VWRU5UU30uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Um91dGVTZWxlY3RvcihNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IsIGludCBmbGFncykgeworICAgICAgICBpZiAobVNlbGVjdG9yLmVxdWFscyhzZWxlY3RvcikgJiYgbVJvdXRlQ2FsbGJhY2tGbGFncyA9PSBmbGFncykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghbVNlbGVjdG9yLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgbVJvdXRlci5yZW1vdmVDYWxsYmFjayhtQ2FsbGJhY2spOworICAgICAgICB9CisgICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsIHx8IHNlbGVjdG9yLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgbVNlbGVjdG9yID0gTWVkaWFSb3V0ZVNlbGVjdG9yLkVNUFRZOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbVNlbGVjdG9yID0gc2VsZWN0b3I7CisgICAgICAgIG1Sb3V0ZUNhbGxiYWNrRmxhZ3MgPSBmbGFnczsKKworICAgICAgICBpZiAobUF0dGFjaGVkVG9XaW5kb3cpIHsKKyAgICAgICAgICAgIG1Sb3V0ZXIuYWRkQ2FsbGJhY2soc2VsZWN0b3IsIG1DYWxsYmFjaywgZmxhZ3MpOworICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBtZWRpYSByb3V0ZSBkaWFsb2cgZmFjdG9yeSB0byB1c2Ugd2hlbiBzaG93aW5nIHRoZSByb3V0ZSBjaG9vc2VyCisgICAgICogb3IgY29udHJvbGxlciBkaWFsb2cuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBkaWFsb2cgZmFjdG9yeSwgbmV2ZXIgbnVsbC4KKyAgICAgKi8KKyAgICBATm9uTnVsbAorICAgIHB1YmxpYyBNZWRpYVJvdXRlRGlhbG9nRmFjdG9yeSBnZXREaWFsb2dGYWN0b3J5KCkgeworICAgICAgICByZXR1cm4gbURpYWxvZ0ZhY3Rvcnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbWVkaWEgcm91dGUgZGlhbG9nIGZhY3RvcnkgdG8gdXNlIHdoZW4gc2hvd2luZyB0aGUgcm91dGUgY2hvb3NlcgorICAgICAqIG9yIGNvbnRyb2xsZXIgZGlhbG9nLgorICAgICAqCisgICAgICogQHBhcmFtIGZhY3RvcnkgVGhlIGRpYWxvZyBmYWN0b3J5LCBtdXN0IG5vdCBiZSBudWxsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERpYWxvZ0ZhY3RvcnkoQE5vbk51bGwgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkgZmFjdG9yeSkgeworICAgICAgICBpZiAoZmFjdG9yeSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJmYWN0b3J5IG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorCisgICAgICAgIG1EaWFsb2dGYWN0b3J5ID0gZmFjdG9yeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaG93IHRoZSByb3V0ZSBjaG9vc2VyIG9yIGNvbnRyb2xsZXIgZGlhbG9nLgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSBkZWZhdWx0IHJvdXRlIGlzIHNlbGVjdGVkIG9yIGlmIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcm91dGUgZG9lcworICAgICAqIG5vdCBtYXRjaCB0aGUge0BsaW5rICNnZXRSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yfSwgdGhlbiBzaG93cyB0aGUgcm91dGUgY2hvb3NlciBkaWFsb2cuCisgICAgICogT3RoZXJ3aXNlLCBzaG93cyB0aGUgcm91dGUgY29udHJvbGxlciBkaWFsb2cgdG8gb2ZmZXIgdGhlIHVzZXIKKyAgICAgKiBhIGNob2ljZSB0byBkaXNjb25uZWN0IGZyb20gdGhlIHJvdXRlIG9yIHBlcmZvcm0gb3RoZXIgY29udHJvbCBhY3Rpb25zCisgICAgICogc3VjaCBhcyBzZXR0aW5nIHRoZSByb3V0ZSdzIHZvbHVtZS4KKyAgICAgKiA8L3A+PHA+CisgICAgICogVGhlIGFwcGxpY2F0aW9uIGNhbiBjdXN0b21pemUgdGhlIGRpYWxvZ3MgYnkgY2FsbGluZyB7QGxpbmsgI3NldERpYWxvZ0ZhY3Rvcnl9CisgICAgICogdG8gcHJvdmlkZSBhIGN1c3RvbWl6ZWQgZGlhbG9nIGZhY3RvcnkuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBkaWFsb2cgd2FzIGFjdHVhbGx5IHNob3duLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIGFjdGl2aXR5IGlzIG5vdCBhIHN1YmNsYXNzIG9mCisgICAgICoge0BsaW5rIEZyYWdtZW50QWN0aXZpdHl9LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHNob3dEaWFsb2coKSB7CisgICAgICAgIGlmICghbUF0dGFjaGVkVG9XaW5kb3cpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIEZyYWdtZW50TWFuYWdlciBmbSA9IGdldEFjdGl2aXR5KCkuZ2V0RnJhZ21lbnRNYW5hZ2VyKCk7CisgICAgICAgIGlmIChmbSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgYWN0aXZpdHkgbXVzdCBiZSBhIHN1YmNsYXNzIG9mIEZyYWdtZW50QWN0aXZpdHkiKTsKKyAgICAgICAgfQorCisgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IG1Sb3V0ZXIuZ2V0U2VsZWN0ZWRSb3V0ZSgpOworICAgICAgICBpZiAocm91dGUuaXNEZWZhdWx0T3JCbHVldG9vdGgoKSB8fCAhcm91dGUubWF0Y2hlc1NlbGVjdG9yKG1TZWxlY3RvcikpIHsKKyAgICAgICAgICAgIGlmIChmbS5maW5kRnJhZ21lbnRCeVRhZyhDSE9PU0VSX0ZSQUdNRU5UX1RBRykgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgInNob3dEaWFsb2coKTogUm91dGUgY2hvb3NlciBkaWFsb2cgYWxyZWFkeSBzaG93aW5nISIpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQgZiA9CisgICAgICAgICAgICAgICAgICAgIG1EaWFsb2dGYWN0b3J5Lm9uQ3JlYXRlQ2hvb3NlckRpYWxvZ0ZyYWdtZW50KCk7CisgICAgICAgICAgICBmLnNldFJvdXRlU2VsZWN0b3IobVNlbGVjdG9yKTsKKyAgICAgICAgICAgIGYuc2hvdyhmbSwgQ0hPT1NFUl9GUkFHTUVOVF9UQUcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGZtLmZpbmRGcmFnbWVudEJ5VGFnKENPTlRST0xMRVJfRlJBR01FTlRfVEFHKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic2hvd0RpYWxvZygpOiBSb3V0ZSBjb250cm9sbGVyIGRpYWxvZyBhbHJlYWR5IHNob3dpbmchIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2dGcmFnbWVudCBmID0KKyAgICAgICAgICAgICAgICAgICAgbURpYWxvZ0ZhY3Rvcnkub25DcmVhdGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQoKTsKKyAgICAgICAgICAgIGYuc2hvdyhmbSwgQ09OVFJPTExFUl9GUkFHTUVOVF9UQUcpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworCisgICAgcHJpdmF0ZSBBY3Rpdml0eSBnZXRBY3Rpdml0eSgpIHsKKyAgICAgICAgLy8gR3Jvc3Mgd2F5IG9mIHVud3JhcHBpbmcgdGhlIEFjdGl2aXR5IHNvIHdlIGNhbiBnZXQgdGhlIEZyYWdtZW50TWFuYWdlcgorICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBnZXRDb250ZXh0KCk7CisgICAgICAgIHdoaWxlIChjb250ZXh0IGluc3RhbmNlb2YgQ29udGV4dFdyYXBwZXIpIHsKKyAgICAgICAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKEFjdGl2aXR5KWNvbnRleHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250ZXh0ID0gKChDb250ZXh0V3JhcHBlciljb250ZXh0KS5nZXRCYXNlQ29udGV4dCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciB0byBlbmFibGUgc2hvd2luZyBhIHRvYXN0IHdpdGggdGhlIGNvbnRlbnQgZGVzY3JpcHRvciBvZiB0aGUKKyAgICAgKiBidXR0b24gd2hlbiB0aGUgYnV0dG9uIGlzIGxvbmcgcHJlc3NlZC4KKyAgICAgKi8KKyAgICB2b2lkIHNldENoZWF0U2hlZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICAgIFRvb2x0aXBDb21wYXQuc2V0VG9vbHRpcFRleHQodGhpcywgZW5hYmxlCisgICAgICAgICAgICAgICAgPyBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGdldENvbnRleHQoKSkKKyAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZyhSLnN0cmluZy5tcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbikKKyAgICAgICAgICAgICAgICA6IG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1DbGljaygpIHsKKyAgICAgICAgLy8gU2VuZCB0aGUgYXBwcm9wcmlhdGUgYWNjZXNzaWJpbGl0eSBldmVudHMgYW5kIGNhbGwgbGlzdGVuZXJzCisgICAgICAgIGJvb2xlYW4gaGFuZGxlZCA9IHN1cGVyLnBlcmZvcm1DbGljaygpOworICAgICAgICBpZiAoIWhhbmRsZWQpIHsKKyAgICAgICAgICAgIHBsYXlTb3VuZEVmZmVjdChTb3VuZEVmZmVjdENvbnN0YW50cy5DTElDSyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNob3dEaWFsb2coKSB8fCBoYW5kbGVkOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBpbnRbXSBvbkNyZWF0ZURyYXdhYmxlU3RhdGUoaW50IGV4dHJhU3BhY2UpIHsKKyAgICAgICAgZmluYWwgaW50W10gZHJhd2FibGVTdGF0ZSA9IHN1cGVyLm9uQ3JlYXRlRHJhd2FibGVTdGF0ZShleHRyYVNwYWNlICsgMSk7CisKKyAgICAgICAgLy8gVGVjaG5pY2FsbHkgd2Ugc2hvdWxkIGJlIGhhbmRsaW5nIHRoaXMgbW9yZSBjb21wbGV0ZWx5LCBidXQgdGhlc2UKKyAgICAgICAgLy8gYXJlIGltcGxlbWVudGF0aW9uIGRldGFpbHMgaGVyZS4gQ2hlY2thYmxlIGlzIHVzZWQgdG8gZXhwcmVzcyB0aGUgY29ubmVjdGluZworICAgICAgICAvLyBkcmF3YWJsZSBzdGF0ZSBhbmQgaXQncyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCBjaGVjayBmb3IgdGhlIHB1cnBvc2VzCisgICAgICAgIC8vIG9mIHN0YXRlIHNlbGVjdGlvbiBoZXJlLgorICAgICAgICBpZiAobUlzQ29ubmVjdGluZykgeworICAgICAgICAgICAgbWVyZ2VEcmF3YWJsZVN0YXRlcyhkcmF3YWJsZVN0YXRlLCBDSEVDS0FCTEVfU1RBVEVfU0VUKTsKKyAgICAgICAgfSBlbHNlIGlmIChtUmVtb3RlQWN0aXZlKSB7CisgICAgICAgICAgICBtZXJnZURyYXdhYmxlU3RhdGVzKGRyYXdhYmxlU3RhdGUsIENIRUNLRURfU1RBVEVfU0VUKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZHJhd2FibGVTdGF0ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBkcmF3YWJsZVN0YXRlQ2hhbmdlZCgpIHsKKyAgICAgICAgc3VwZXIuZHJhd2FibGVTdGF0ZUNoYW5nZWQoKTsKKworICAgICAgICBpZiAobVJlbW90ZUluZGljYXRvciAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnRbXSBteURyYXdhYmxlU3RhdGUgPSBnZXREcmF3YWJsZVN0YXRlKCk7CisgICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yLnNldFN0YXRlKG15RHJhd2FibGVTdGF0ZSk7CisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgZHJhd2FibGUgdG8gdXNlIGFzIHRoZSByZW1vdGUgcm91dGUgaW5kaWNhdG9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlbW90ZUluZGljYXRvckRyYXdhYmxlKERyYXdhYmxlIGQpIHsKKyAgICAgICAgaWYgKG1SZW1vdGVJbmRpY2F0b3JMb2FkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvckxvYWRlci5jYW5jZWwoZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1SZW1vdGVJbmRpY2F0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvci5zZXRDYWxsYmFjayhudWxsKTsKKyAgICAgICAgICAgIHVuc2NoZWR1bGVEcmF3YWJsZShtUmVtb3RlSW5kaWNhdG9yKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobUJ1dHRvblRpbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGQgPSBEcmF3YWJsZUNvbXBhdC53cmFwKGQubXV0YXRlKCkpOworICAgICAgICAgICAgICAgIERyYXdhYmxlQ29tcGF0LnNldFRpbnRMaXN0KGQsIG1CdXR0b25UaW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGQuc2V0Q2FsbGJhY2sodGhpcyk7CisgICAgICAgICAgICBkLnNldFN0YXRlKGdldERyYXdhYmxlU3RhdGUoKSk7CisgICAgICAgICAgICBkLnNldFZpc2libGUoZ2V0VmlzaWJpbGl0eSgpID09IFZJU0lCTEUsIGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBtUmVtb3RlSW5kaWNhdG9yID0gZDsKKworICAgICAgICByZWZyZXNoRHJhd2FibGVTdGF0ZSgpOworICAgICAgICBpZiAobUF0dGFjaGVkVG9XaW5kb3cgJiYgbVJlbW90ZUluZGljYXRvciAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgbVJlbW90ZUluZGljYXRvci5nZXRDdXJyZW50KCkgaW5zdGFuY2VvZiBBbmltYXRpb25EcmF3YWJsZSkgeworICAgICAgICAgICAgQW5pbWF0aW9uRHJhd2FibGUgY3VyRHJhd2FibGUgPSAoQW5pbWF0aW9uRHJhd2FibGUpIG1SZW1vdGVJbmRpY2F0b3IuZ2V0Q3VycmVudCgpOworICAgICAgICAgICAgaWYgKG1Jc0Nvbm5lY3RpbmcpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWN1ckRyYXdhYmxlLmlzUnVubmluZygpKSB7CisgICAgICAgICAgICAgICAgICAgIGN1ckRyYXdhYmxlLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChtUmVtb3RlQWN0aXZlKSB7CisgICAgICAgICAgICAgICAgaWYgKGN1ckRyYXdhYmxlLmlzUnVubmluZygpKSB7CisgICAgICAgICAgICAgICAgICAgIGN1ckRyYXdhYmxlLnN0b3AoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY3VyRHJhd2FibGUuc2VsZWN0RHJhd2FibGUoY3VyRHJhd2FibGUuZ2V0TnVtYmVyT2ZGcmFtZXMoKSAtIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gdmVyaWZ5RHJhd2FibGUoRHJhd2FibGUgd2hvKSB7CisgICAgICAgIHJldHVybiBzdXBlci52ZXJpZnlEcmF3YWJsZSh3aG8pIHx8IHdobyA9PSBtUmVtb3RlSW5kaWNhdG9yOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGp1bXBEcmF3YWJsZXNUb0N1cnJlbnRTdGF0ZSgpIHsKKyAgICAgICAgLy8gV2UgY2FuJ3QgY2FsbCBzdXBlciB0byBoYW5kbGUgdGhlIGJhY2tncm91bmQgc28gd2UgZG8gaXQgb3Vyc2VsdmVzLgorICAgICAgICAvL3N1cGVyLmp1bXBEcmF3YWJsZXNUb0N1cnJlbnRTdGF0ZSgpOworICAgICAgICBpZiAoZ2V0QmFja2dyb3VuZCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIERyYXdhYmxlQ29tcGF0Lmp1bXBUb0N1cnJlbnRTdGF0ZShnZXRCYWNrZ3JvdW5kKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSGFuZGxlIG91ciBvd24gcmVtb3RlIGluZGljYXRvci4KKyAgICAgICAgaWYgKG1SZW1vdGVJbmRpY2F0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgRHJhd2FibGVDb21wYXQuanVtcFRvQ3VycmVudFN0YXRlKG1SZW1vdGVJbmRpY2F0b3IpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VmlzaWJpbGl0eShpbnQgdmlzaWJpbGl0eSkgeworICAgICAgICBzdXBlci5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOworCisgICAgICAgIGlmIChtUmVtb3RlSW5kaWNhdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1SZW1vdGVJbmRpY2F0b3Iuc2V0VmlzaWJsZShnZXRWaXNpYmlsaXR5KCkgPT0gVklTSUJMRSwgZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCkgeworICAgICAgICBzdXBlci5vbkF0dGFjaGVkVG9XaW5kb3coKTsKKworICAgICAgICBtQXR0YWNoZWRUb1dpbmRvdyA9IHRydWU7CisgICAgICAgIGlmICghbVNlbGVjdG9yLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgbVJvdXRlci5hZGRDYWxsYmFjayhtU2VsZWN0b3IsIG1DYWxsYmFjaywgbVJvdXRlQ2FsbGJhY2tGbGFncyk7CisgICAgICAgIH0KKyAgICAgICAgcmVmcmVzaFJvdXRlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKSB7CisgICAgICAgIG1BdHRhY2hlZFRvV2luZG93ID0gZmFsc2U7CisgICAgICAgIGlmICghbVNlbGVjdG9yLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgbVJvdXRlci5yZW1vdmVDYWxsYmFjayhtQ2FsbGJhY2spOworICAgICAgICB9CisKKyAgICAgICAgc3VwZXIub25EZXRhY2hlZEZyb21XaW5kb3coKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgeworICAgICAgICBmaW5hbCBpbnQgd2lkdGhTaXplID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZSh3aWR0aE1lYXN1cmVTcGVjKTsKKyAgICAgICAgZmluYWwgaW50IGhlaWdodFNpemUgPSBNZWFzdXJlU3BlYy5nZXRTaXplKGhlaWdodE1lYXN1cmVTcGVjKTsKKyAgICAgICAgZmluYWwgaW50IHdpZHRoTW9kZSA9IE1lYXN1cmVTcGVjLmdldE1vZGUod2lkdGhNZWFzdXJlU3BlYyk7CisgICAgICAgIGZpbmFsIGludCBoZWlnaHRNb2RlID0gTWVhc3VyZVNwZWMuZ2V0TW9kZShoZWlnaHRNZWFzdXJlU3BlYyk7CisKKyAgICAgICAgZmluYWwgaW50IHdpZHRoID0gTWF0aC5tYXgobU1pbldpZHRoLCBtUmVtb3RlSW5kaWNhdG9yICE9IG51bGwgPworICAgICAgICAgICAgICAgIG1SZW1vdGVJbmRpY2F0b3IuZ2V0SW50cmluc2ljV2lkdGgoKSArIGdldFBhZGRpbmdMZWZ0KCkgKyBnZXRQYWRkaW5nUmlnaHQoKSA6IDApOworICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gTWF0aC5tYXgobU1pbkhlaWdodCwgbVJlbW90ZUluZGljYXRvciAhPSBudWxsID8KKyAgICAgICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yLmdldEludHJpbnNpY0hlaWdodCgpICsgZ2V0UGFkZGluZ1RvcCgpICsgZ2V0UGFkZGluZ0JvdHRvbSgpIDogMCk7CisKKyAgICAgICAgaW50IG1lYXN1cmVkV2lkdGg7CisgICAgICAgIHN3aXRjaCAod2lkdGhNb2RlKSB7CisgICAgICAgICAgICBjYXNlIE1lYXN1cmVTcGVjLkVYQUNUTFk6CisgICAgICAgICAgICAgICAgbWVhc3VyZWRXaWR0aCA9IHdpZHRoU2l6ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTWVhc3VyZVNwZWMuQVRfTU9TVDoKKyAgICAgICAgICAgICAgICBtZWFzdXJlZFdpZHRoID0gTWF0aC5taW4od2lkdGhTaXplLCB3aWR0aCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgY2FzZSBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRDoKKyAgICAgICAgICAgICAgICBtZWFzdXJlZFdpZHRoID0gd2lkdGg7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpbnQgbWVhc3VyZWRIZWlnaHQ7CisgICAgICAgIHN3aXRjaCAoaGVpZ2h0TW9kZSkgeworICAgICAgICAgICAgY2FzZSBNZWFzdXJlU3BlYy5FWEFDVExZOgorICAgICAgICAgICAgICAgIG1lYXN1cmVkSGVpZ2h0ID0gaGVpZ2h0U2l6ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTWVhc3VyZVNwZWMuQVRfTU9TVDoKKyAgICAgICAgICAgICAgICBtZWFzdXJlZEhlaWdodCA9IE1hdGgubWluKGhlaWdodFNpemUsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgY2FzZSBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRDoKKyAgICAgICAgICAgICAgICBtZWFzdXJlZEhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHNldE1lYXN1cmVkRGltZW5zaW9uKG1lYXN1cmVkV2lkdGgsIG1lYXN1cmVkSGVpZ2h0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKworICAgICAgICBpZiAobVJlbW90ZUluZGljYXRvciAhPSBudWxsKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgbGVmdCA9IGdldFBhZGRpbmdMZWZ0KCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgcmlnaHQgPSBnZXRXaWR0aCgpIC0gZ2V0UGFkZGluZ1JpZ2h0KCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgdG9wID0gZ2V0UGFkZGluZ1RvcCgpOworICAgICAgICAgICAgZmluYWwgaW50IGJvdHRvbSA9IGdldEhlaWdodCgpIC0gZ2V0UGFkZGluZ0JvdHRvbSgpOworCisgICAgICAgICAgICBmaW5hbCBpbnQgZHJhd1dpZHRoID0gbVJlbW90ZUluZGljYXRvci5nZXRJbnRyaW5zaWNXaWR0aCgpOworICAgICAgICAgICAgZmluYWwgaW50IGRyYXdIZWlnaHQgPSBtUmVtb3RlSW5kaWNhdG9yLmdldEludHJpbnNpY0hlaWdodCgpOworICAgICAgICAgICAgZmluYWwgaW50IGRyYXdMZWZ0ID0gbGVmdCArIChyaWdodCAtIGxlZnQgLSBkcmF3V2lkdGgpIC8gMjsKKyAgICAgICAgICAgIGZpbmFsIGludCBkcmF3VG9wID0gdG9wICsgKGJvdHRvbSAtIHRvcCAtIGRyYXdIZWlnaHQpIC8gMjsKKworICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvci5zZXRCb3VuZHMoZHJhd0xlZnQsIGRyYXdUb3AsCisgICAgICAgICAgICAgICAgICAgIGRyYXdMZWZ0ICsgZHJhd1dpZHRoLCBkcmF3VG9wICsgZHJhd0hlaWdodCk7CisgICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yLmRyYXcoY2FudmFzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgcmVmcmVzaFJvdXRlKCkgeworICAgICAgICBmaW5hbCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBtUm91dGVyLmdldFNlbGVjdGVkUm91dGUoKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpc1JlbW90ZSA9ICFyb3V0ZS5pc0RlZmF1bHRPckJsdWV0b290aCgpICYmIHJvdXRlLm1hdGNoZXNTZWxlY3RvcihtU2VsZWN0b3IpOworICAgICAgICBmaW5hbCBib29sZWFuIGlzQ29ubmVjdGluZyA9IGlzUmVtb3RlICYmIHJvdXRlLmlzQ29ubmVjdGluZygpOworICAgICAgICBib29sZWFuIG5lZWRzUmVmcmVzaCA9IGZhbHNlOworICAgICAgICBpZiAobVJlbW90ZUFjdGl2ZSAhPSBpc1JlbW90ZSkgeworICAgICAgICAgICAgbVJlbW90ZUFjdGl2ZSA9IGlzUmVtb3RlOworICAgICAgICAgICAgbmVlZHNSZWZyZXNoID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUlzQ29ubmVjdGluZyAhPSBpc0Nvbm5lY3RpbmcpIHsKKyAgICAgICAgICAgIG1Jc0Nvbm5lY3RpbmcgPSBpc0Nvbm5lY3Rpbmc7CisgICAgICAgICAgICBuZWVkc1JlZnJlc2ggPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5lZWRzUmVmcmVzaCkgeworICAgICAgICAgICAgdXBkYXRlQ29udGVudERlc2NyaXB0aW9uKCk7CisgICAgICAgICAgICByZWZyZXNoRHJhd2FibGVTdGF0ZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChtQXR0YWNoZWRUb1dpbmRvdykgeworICAgICAgICAgICAgc2V0RW5hYmxlZChtUm91dGVyLmlzUm91dGVBdmFpbGFibGUobVNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5BVkFJTEFCSUxJVFlfRkxBR19JR05PUkVfREVGQVVMVF9ST1VURSkpOworICAgICAgICB9CisgICAgICAgIGlmIChtUmVtb3RlSW5kaWNhdG9yICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBtUmVtb3RlSW5kaWNhdG9yLmdldEN1cnJlbnQoKSBpbnN0YW5jZW9mIEFuaW1hdGlvbkRyYXdhYmxlKSB7CisgICAgICAgICAgICBBbmltYXRpb25EcmF3YWJsZSBjdXJEcmF3YWJsZSA9IChBbmltYXRpb25EcmF3YWJsZSkgbVJlbW90ZUluZGljYXRvci5nZXRDdXJyZW50KCk7CisgICAgICAgICAgICBpZiAobUF0dGFjaGVkVG9XaW5kb3cpIHsKKyAgICAgICAgICAgICAgICBpZiAoKG5lZWRzUmVmcmVzaCB8fCBpc0Nvbm5lY3RpbmcpICYmICFjdXJEcmF3YWJsZS5pc1J1bm5pbmcoKSkgeworICAgICAgICAgICAgICAgICAgICBjdXJEcmF3YWJsZS5zdGFydCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNSZW1vdGUgJiYgIWlzQ29ubmVjdGluZykgeworICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIHJvdXRlIGlzIGFscmVhZHkgY29ubmVjdGVkIGJlZm9yZSB0aGUgdmlldyBpcyBhdHRhY2hlZCwgc2hvdyB0aGUgbGFzdAorICAgICAgICAgICAgICAgIC8vIGZyYW1lIG9mIHRoZSBjb25uZWN0ZWQgYW5pbWF0aW9uIGltbWVkaWF0ZWx5LgorICAgICAgICAgICAgICAgIGlmIChjdXJEcmF3YWJsZS5pc1J1bm5pbmcoKSkgeworICAgICAgICAgICAgICAgICAgICBjdXJEcmF3YWJsZS5zdG9wKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGN1ckRyYXdhYmxlLnNlbGVjdERyYXdhYmxlKGN1ckRyYXdhYmxlLmdldE51bWJlck9mRnJhbWVzKCkgLSAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVDb250ZW50RGVzY3JpcHRpb24oKSB7CisgICAgICAgIGludCByZXNJZDsKKyAgICAgICAgaWYgKG1Jc0Nvbm5lY3RpbmcpIHsKKyAgICAgICAgICAgIHJlc0lkID0gUi5zdHJpbmcubXJfY2FzdF9idXR0b25fY29ubmVjdGluZzsKKyAgICAgICAgfSBlbHNlIGlmIChtUmVtb3RlQWN0aXZlKSB7CisgICAgICAgICAgICByZXNJZCA9IFIuc3RyaW5nLm1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc0lkID0gUi5zdHJpbmcubXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkOworICAgICAgICB9CisgICAgICAgIHNldENvbnRlbnREZXNjcmlwdGlvbihBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGdldENvbnRleHQoKSkuZ2V0U3RyaW5nKHJlc0lkKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBNZWRpYVJvdXRlckNhbGxiYWNrIGV4dGVuZHMgTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgeworICAgICAgICBNZWRpYVJvdXRlckNhbGxiYWNrKCkgeworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVBZGRlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7CisgICAgICAgICAgICByZWZyZXNoUm91dGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUmVtb3ZlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7CisgICAgICAgICAgICByZWZyZXNoUm91dGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQ2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7CisgICAgICAgICAgICByZWZyZXNoUm91dGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlU2VsZWN0ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgeworICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVVuc2VsZWN0ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgeworICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlckFkZGVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUHJvdmlkZXJJbmZvIHByb3ZpZGVyKSB7CisgICAgICAgICAgICByZWZyZXNoUm91dGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblByb3ZpZGVyUmVtb3ZlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlByb3ZpZGVySW5mbyBwcm92aWRlcikgeworICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlckNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Qcm92aWRlckluZm8gcHJvdmlkZXIpIHsKKyAgICAgICAgICAgIHJlZnJlc2hSb3V0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBSZW1vdGVJbmRpY2F0b3JMb2FkZXIgZXh0ZW5kcyBBc3luY1Rhc2s8Vm9pZCwgVm9pZCwgRHJhd2FibGU+IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVJlc0lkOworCisgICAgICAgIFJlbW90ZUluZGljYXRvckxvYWRlcihpbnQgcmVzSWQpIHsKKyAgICAgICAgICAgIG1SZXNJZCA9IHJlc0lkOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBEcmF3YWJsZSBkb0luQmFja2dyb3VuZChWb2lkLi4uIHBhcmFtcykgeworICAgICAgICAgICAgcmV0dXJuIEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoZ2V0Q29udGV4dCgpKS5nZXREcmF3YWJsZShtUmVzSWQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdEV4ZWN1dGUoRHJhd2FibGUgcmVtb3RlSW5kaWNhdG9yKSB7CisgICAgICAgICAgICBjYWNoZUFuZFJlc2V0KHJlbW90ZUluZGljYXRvcik7CisgICAgICAgICAgICBzZXRSZW1vdGVJbmRpY2F0b3JEcmF3YWJsZShyZW1vdGVJbmRpY2F0b3IpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uQ2FuY2VsbGVkKERyYXdhYmxlIHJlbW90ZUluZGljYXRvcikgeworICAgICAgICAgICAgY2FjaGVBbmRSZXNldChyZW1vdGVJbmRpY2F0b3IpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGNhY2hlQW5kUmVzZXQoRHJhd2FibGUgcmVtb3RlSW5kaWNhdG9yKSB7CisgICAgICAgICAgICBpZiAocmVtb3RlSW5kaWNhdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzUmVtb3RlSW5kaWNhdG9yQ2FjaGUucHV0KG1SZXNJZCwgcmVtb3RlSW5kaWNhdG9yLmdldENvbnN0YW50U3RhdGUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yTG9hZGVyID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNob29zZXJEaWFsb2cuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNob29zZXJEaWFsb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWM2NGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQ2hvb3NlckRpYWxvZy5qYXZhCkBAIC0wLDAgKzEsNDA1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwOworCitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvLkNPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVEVEOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mby5DT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RJTkc7CisKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkLmFwcC5EaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjcuYXBwLkFwcENvbXBhdERpYWxvZzsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRUaGVtZVdyYXBwZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5BcGlIZWxwZXI7CitpbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLlI7CitpbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlU2VsZWN0b3I7CitpbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIHJvdXRlIGNob29zZXIgZGlhbG9nIGZvciB7QGxpbmsgTWVkaWFSb3V0ZXJ9LgorICogPHA+CisgKiBUaGlzIGRpYWxvZyBhbGxvd3MgdGhlIHVzZXIgdG8gY2hvb3NlIGEgcm91dGUgdGhhdCBtYXRjaGVzIGEgZ2l2ZW4gc2VsZWN0b3IuCisgKiA8L3A+CisgKgorICogQHNlZSBNZWRpYVJvdXRlQnV0dG9uCisgKiBAc2VlIE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlcgorICovCitwdWJsaWMgY2xhc3MgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgeworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUm91dGVDaG9vc2VyRGlhbG9nIjsKKworICAgIC8vIERvIG5vdCB1cGRhdGUgdGhlIHJvdXRlIGxpc3QgaW1tZWRpYXRlbHkgdG8gYXZvaWQgdW5uYXR1cmFsIGRpYWxvZyBjaGFuZ2UuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBVUERBVEVfUk9VVEVTX0RFTEFZX01TID0gMzAwTDsKKyAgICBzdGF0aWMgZmluYWwgaW50IE1TR19VUERBVEVfUk9VVEVTID0gMTsKKworICAgIHByaXZhdGUgZmluYWwgTWVkaWFSb3V0ZXIgbVJvdXRlcjsKKyAgICBwcml2YXRlIGZpbmFsIE1lZGlhUm91dGVyQ2FsbGJhY2sgbUNhbGxiYWNrOworCisgICAgcHJpdmF0ZSBUZXh0VmlldyBtVGl0bGVWaWV3OworICAgIHByaXZhdGUgTWVkaWFSb3V0ZVNlbGVjdG9yIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5FTVBUWTsKKyAgICBwcml2YXRlIEFycmF5TGlzdDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IG1Sb3V0ZXM7CisgICAgcHJpdmF0ZSBSb3V0ZUFkYXB0ZXIgbUFkYXB0ZXI7CisgICAgcHJpdmF0ZSBMaXN0VmlldyBtTGlzdFZpZXc7CisgICAgcHJpdmF0ZSBib29sZWFuIG1BdHRhY2hlZFRvV2luZG93OworICAgIHByaXZhdGUgbG9uZyBtTGFzdFVwZGF0ZVRpbWU7CisgICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19VUERBVEVfUk9VVEVTOgorICAgICAgICAgICAgICAgICAgICB1cGRhdGVSb3V0ZXMoKExpc3Q8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPikgbWVzc2FnZS5vYmopOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBwdWJsaWMgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2coQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgMCk7CisgICAgfQorCisgICAgcHVibGljIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nKENvbnRleHQgY29udGV4dCwgaW50IHRoZW1lKSB7CisgICAgICAgIC8vIFRPRE8gKGIvNzI5NzU5NzYpOiBBdm9pZCB0byB1c2UgQ29udGV4dFRoZW1lV3JhcHBlciB3aXRoIGFwcCBjb250ZXh0IGFuZCBsaWIgdGhlbWUuCisgICAgICAgIHN1cGVyKG5ldyBDb250ZXh0VGhlbWVXcmFwcGVyKGNvbnRleHQsIEFwaUhlbHBlci5nZXRMaWJUaGVtZShjb250ZXh0LAorICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0Um91dGVyVGhlbWVJZChjb250ZXh0KSkpLCB0aGVtZSk7CisgICAgICAgIGNvbnRleHQgPSBnZXRDb250ZXh0KCk7CisKKyAgICAgICAgbVJvdXRlciA9IE1lZGlhUm91dGVyLmdldEluc3RhbmNlKGNvbnRleHQpOworICAgICAgICBtQ2FsbGJhY2sgPSBuZXcgTWVkaWFSb3V0ZXJDYWxsYmFjaygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGZvciBmaWx0ZXJpbmcgdGhlIHJvdXRlcyB0aGF0IHRoZSB1c2VyIGNhbiBzZWxlY3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBzZWxlY3RvciwgbmV2ZXIgbnVsbC4KKyAgICAgKi8KKyAgICBATm9uTnVsbAorICAgIHB1YmxpYyBNZWRpYVJvdXRlU2VsZWN0b3IgZ2V0Um91dGVTZWxlY3RvcigpIHsKKyAgICAgICAgcmV0dXJuIG1TZWxlY3RvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBtZWRpYSByb3V0ZSBzZWxlY3RvciBmb3IgZmlsdGVyaW5nIHRoZSByb3V0ZXMgdGhhdCB0aGUgdXNlciBjYW4gc2VsZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGVjdG9yIFRoZSBzZWxlY3RvciwgbXVzdCBub3QgYmUgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSb3V0ZVNlbGVjdG9yKEBOb25OdWxsIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvcikgeworICAgICAgICBpZiAoc2VsZWN0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VsZWN0b3IgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtU2VsZWN0b3IuZXF1YWxzKHNlbGVjdG9yKSkgeworICAgICAgICAgICAgbVNlbGVjdG9yID0gc2VsZWN0b3I7CisKKyAgICAgICAgICAgIGlmIChtQXR0YWNoZWRUb1dpbmRvdykgeworICAgICAgICAgICAgICAgIG1Sb3V0ZXIucmVtb3ZlQ2FsbGJhY2sobUNhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICBtUm91dGVyLmFkZENhbGxiYWNrKHNlbGVjdG9yLCBtQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZWZyZXNoUm91dGVzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgdG8gZmlsdGVyIHRoZSBzZXQgb2Ygcm91dGVzIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBsaXN0LgorICAgICAqIDxwPgorICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGl0ZXJhdGVzIG92ZXIgYWxsIHJvdXRlcyBpbiB0aGUgcHJvdmlkZWQgbGlzdCBhbmQKKyAgICAgKiByZW1vdmVzIHRob3NlIGZvciB3aGljaCB7QGxpbmsgI29uRmlsdGVyUm91dGV9IHJldHVybnMgZmFsc2UuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHJvdXRlcyBUaGUgbGlzdCBvZiByb3V0ZXMgdG8gZmlsdGVyIGluLXBsYWNlLCBuZXZlciBudWxsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uRmlsdGVyUm91dGVzKEBOb25OdWxsIExpc3Q8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiByb3V0ZXMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IHJvdXRlcy5zaXplKCk7IGktLSA+IDA7ICkgeworICAgICAgICAgICAgaWYgKCFvbkZpbHRlclJvdXRlKHJvdXRlcy5nZXQoaSkpKSB7CisgICAgICAgICAgICAgICAgcm91dGVzLnJlbW92ZShpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBsaXN0LgorICAgICAqIDxwPgorICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgdHJ1ZSBmb3IgZW5hYmxlZCBub24tZGVmYXVsdCByb3V0ZXMgdGhhdAorICAgICAqIG1hdGNoIHRoZSBzZWxlY3Rvci4gIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGZpbHRlciByb3V0ZXMKKyAgICAgKiBkaWZmZXJlbnRseS4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcm91dGUgVGhlIHJvdXRlIHRvIGNvbnNpZGVyLCBuZXZlciBudWxsLgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcm91dGUgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBjaG9vc2VyIGRpYWxvZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBvbkZpbHRlclJvdXRlKEBOb25OdWxsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgeworICAgICAgICByZXR1cm4gIXJvdXRlLmlzRGVmYXVsdE9yQmx1ZXRvb3RoKCkgJiYgcm91dGUuaXNFbmFibGVkKCkKKyAgICAgICAgICAgICAgICAmJiByb3V0ZS5tYXRjaGVzU2VsZWN0b3IobVNlbGVjdG9yKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KHRpdGxlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShpbnQgdGl0bGVJZCkgeworICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQodGl0bGVJZCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KEFwaUhlbHBlci5pbmZsYXRlTGliTGF5b3V0KGdldENvbnRleHQoKSwgQXBpSGVscGVyLmdldExpYlRoZW1lKGdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldFJvdXRlclRoZW1lSWQoZ2V0Q29udGV4dCgpKSksCisgICAgICAgICAgICAgICAgUi5sYXlvdXQubXJfY2hvb3Nlcl9kaWFsb2cpKTsKKworICAgICAgICBtUm91dGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIG1BZGFwdGVyID0gbmV3IFJvdXRlQWRhcHRlcihnZXRDb250ZXh0KCksIG1Sb3V0ZXMpOworICAgICAgICBtTGlzdFZpZXcgPSAoTGlzdFZpZXcpZmluZFZpZXdCeUlkKFIuaWQubXJfY2hvb3Nlcl9saXN0KTsKKyAgICAgICAgbUxpc3RWaWV3LnNldEFkYXB0ZXIobUFkYXB0ZXIpOworICAgICAgICBtTGlzdFZpZXcuc2V0T25JdGVtQ2xpY2tMaXN0ZW5lcihtQWRhcHRlcik7CisgICAgICAgIG1MaXN0Vmlldy5zZXRFbXB0eVZpZXcoZmluZFZpZXdCeUlkKGFuZHJvaWQuUi5pZC5lbXB0eSkpOworICAgICAgICBtVGl0bGVWaWV3ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfY2hvb3Nlcl90aXRsZSk7CisKKyAgICAgICAgdXBkYXRlTGF5b3V0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgd2lkdGggb2YgdGhlIGRpYWxvZy4gQWxzbyBjYWxsZWQgd2hlbiBjb25maWd1cmF0aW9uIGNoYW5nZXMuCisgICAgICovCisgICAgdm9pZCB1cGRhdGVMYXlvdXQoKSB7CisgICAgICAgIGdldFdpbmRvdygpLnNldExheW91dChNZWRpYVJvdXRlRGlhbG9nSGVscGVyLmdldERpYWxvZ1dpZHRoKGdldENvbnRleHQoKSksCisgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQXR0YWNoZWRUb1dpbmRvdygpIHsKKyAgICAgICAgc3VwZXIub25BdHRhY2hlZFRvV2luZG93KCk7CisKKyAgICAgICAgbUF0dGFjaGVkVG9XaW5kb3cgPSB0cnVlOworICAgICAgICBtUm91dGVyLmFkZENhbGxiYWNrKG1TZWxlY3RvciwgbUNhbGxiYWNrLCBNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU4pOworICAgICAgICByZWZyZXNoUm91dGVzKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKSB7CisgICAgICAgIG1BdHRhY2hlZFRvV2luZG93ID0gZmFsc2U7CisgICAgICAgIG1Sb3V0ZXIucmVtb3ZlQ2FsbGJhY2sobUNhbGxiYWNrKTsKKyAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX1VQREFURV9ST1VURVMpOworCisgICAgICAgIHN1cGVyLm9uRGV0YWNoZWRGcm9tV2luZG93KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVmcmVzaGVzIHRoZSBsaXN0IG9mIHJvdXRlcyB0aGF0IGFyZSBzaG93biBpbiB0aGUgY2hvb3NlciBkaWFsb2cuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVmcmVzaFJvdXRlcygpIHsKKyAgICAgICAgaWYgKG1BdHRhY2hlZFRvV2luZG93KSB7CisgICAgICAgICAgICBBcnJheUxpc3Q8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiByb3V0ZXMgPSBuZXcgQXJyYXlMaXN0PD4obVJvdXRlci5nZXRSb3V0ZXMoKSk7CisgICAgICAgICAgICBvbkZpbHRlclJvdXRlcyhyb3V0ZXMpOworICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChyb3V0ZXMsIFJvdXRlQ29tcGFyYXRvci5zSW5zdGFuY2UpOworICAgICAgICAgICAgaWYgKFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpIC0gbUxhc3RVcGRhdGVUaW1lID49IFVQREFURV9ST1VURVNfREVMQVlfTVMpIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVSb3V0ZXMocm91dGVzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX1VQREFURV9ST1VURVMpOworICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlQXRUaW1lKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX1VQREFURV9ST1VURVMsIHJvdXRlcyksCisgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFVwZGF0ZVRpbWUgKyBVUERBVEVfUk9VVEVTX0RFTEFZX01TKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgdXBkYXRlUm91dGVzKExpc3Q8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiByb3V0ZXMpIHsKKyAgICAgICAgbUxhc3RVcGRhdGVUaW1lID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CisgICAgICAgIG1Sb3V0ZXMuY2xlYXIoKTsKKyAgICAgICAgbVJvdXRlcy5hZGRBbGwocm91dGVzKTsKKyAgICAgICAgbUFkYXB0ZXIubm90aWZ5RGF0YVNldENoYW5nZWQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFJvdXRlQWRhcHRlciBleHRlbmRzIEFycmF5QWRhcHRlcjxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+CisgICAgICAgICAgICBpbXBsZW1lbnRzIExpc3RWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIgeworICAgICAgICBwcml2YXRlIGZpbmFsIERyYXdhYmxlIG1EZWZhdWx0SWNvbjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBEcmF3YWJsZSBtVHZJY29uOworICAgICAgICBwcml2YXRlIGZpbmFsIERyYXdhYmxlIG1TcGVha2VySWNvbjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBEcmF3YWJsZSBtU3BlYWtlckdyb3VwSWNvbjsKKworICAgICAgICBwdWJsaWMgUm91dGVBZGFwdGVyKENvbnRleHQgY29udGV4dCwgTGlzdDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IHJvdXRlcykgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgMCwgcm91dGVzKTsKKworICAgICAgICAgICAgVHlwZWRBcnJheSBzdHlsZWRBdHRyaWJ1dGVzID0gQXBpSGVscGVyLmdldExpYlRoZW1lKGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0Um91dGVyVGhlbWVJZChjb250ZXh0KSkub2J0YWluU3R5bGVkQXR0cmlidXRlcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgaW50W10geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmF0dHIubWVkaWFSb3V0ZURlZmF1bHRJY29uRHJhd2FibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuYXR0ci5tZWRpYVJvdXRlVHZJY29uRHJhd2FibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuYXR0ci5tZWRpYVJvdXRlU3BlYWtlckljb25EcmF3YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5hdHRyLm1lZGlhUm91dGVTcGVha2VyR3JvdXBJY29uRHJhd2FibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgbURlZmF1bHRJY29uID0gc3R5bGVkQXR0cmlidXRlcy5nZXREcmF3YWJsZSgwKTsKKyAgICAgICAgICAgIG1Udkljb24gPSBzdHlsZWRBdHRyaWJ1dGVzLmdldERyYXdhYmxlKDEpOworICAgICAgICAgICAgbVNwZWFrZXJJY29uID0gc3R5bGVkQXR0cmlidXRlcy5nZXREcmF3YWJsZSgyKTsKKyAgICAgICAgICAgIG1TcGVha2VyR3JvdXBJY29uID0gc3R5bGVkQXR0cmlidXRlcy5nZXREcmF3YWJsZSgzKTsKKyAgICAgICAgICAgIHN0eWxlZEF0dHJpYnV0ZXMucmVjeWNsZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGFyZUFsbEl0ZW1zRW5hYmxlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoaW50IHBvc2l0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SXRlbShwb3NpdGlvbikuaXNFbmFibGVkKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFZpZXcgZ2V0VmlldyhpbnQgcG9zaXRpb24sIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBwYXJlbnQpIHsKKyAgICAgICAgICAgIFZpZXcgdmlldyA9IGNvbnZlcnRWaWV3OworICAgICAgICAgICAgaWYgKHZpZXcgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHZpZXcgPSBBcGlIZWxwZXIuaW5mbGF0ZUxpYkxheW91dChnZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBBcGlIZWxwZXIuZ2V0TGliVGhlbWUoZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldFJvdXRlclRoZW1lSWQoZ2V0Q29udGV4dCgpKSksCisgICAgICAgICAgICAgICAgICAgICAgICBSLmxheW91dC5tcl9jaG9vc2VyX2xpc3RfaXRlbSwgcGFyZW50LCBmYWxzZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IGdldEl0ZW0ocG9zaXRpb24pOworICAgICAgICAgICAgVGV4dFZpZXcgdGV4dDEgPSAoVGV4dFZpZXcpIHZpZXcuZmluZFZpZXdCeUlkKFIuaWQubXJfY2hvb3Nlcl9yb3V0ZV9uYW1lKTsKKyAgICAgICAgICAgIFRleHRWaWV3IHRleHQyID0gKFRleHRWaWV3KSB2aWV3LmZpbmRWaWV3QnlJZChSLmlkLm1yX2Nob29zZXJfcm91dGVfZGVzYyk7CisgICAgICAgICAgICB0ZXh0MS5zZXRUZXh0KHJvdXRlLmdldE5hbWUoKSk7CisgICAgICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24gPSByb3V0ZS5nZXREZXNjcmlwdGlvbigpOworICAgICAgICAgICAgYm9vbGVhbiBpc0Nvbm5lY3RlZE9yQ29ubmVjdGluZyA9CisgICAgICAgICAgICAgICAgICAgIHJvdXRlLmdldENvbm5lY3Rpb25TdGF0ZSgpID09IENPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVEVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgcm91dGUuZ2V0Q29ubmVjdGlvblN0YXRlKCkgPT0gQ09OTkVDVElPTl9TVEFURV9DT05ORUNUSU5HOworICAgICAgICAgICAgaWYgKGlzQ29ubmVjdGVkT3JDb25uZWN0aW5nICYmICFUZXh0VXRpbHMuaXNFbXB0eShkZXNjcmlwdGlvbikpIHsKKyAgICAgICAgICAgICAgICB0ZXh0MS5zZXRHcmF2aXR5KEdyYXZpdHkuQk9UVE9NKTsKKyAgICAgICAgICAgICAgICB0ZXh0Mi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgdGV4dDIuc2V0VGV4dChkZXNjcmlwdGlvbik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRleHQxLnNldEdyYXZpdHkoR3Jhdml0eS5DRU5URVJfVkVSVElDQUwpOworICAgICAgICAgICAgICAgIHRleHQyLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgICAgICB0ZXh0Mi5zZXRUZXh0KCIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpZXcuc2V0RW5hYmxlZChyb3V0ZS5pc0VuYWJsZWQoKSk7CisKKyAgICAgICAgICAgIEltYWdlVmlldyBpY29uVmlldyA9IChJbWFnZVZpZXcpIHZpZXcuZmluZFZpZXdCeUlkKFIuaWQubXJfY2hvb3Nlcl9yb3V0ZV9pY29uKTsKKyAgICAgICAgICAgIGlmIChpY29uVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWNvblZpZXcuc2V0SW1hZ2VEcmF3YWJsZShnZXRJY29uRHJhd2FibGUocm91dGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB2aWV3OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbUNsaWNrKEFkYXB0ZXJWaWV3PD8+IHBhcmVudCwgVmlldyB2aWV3LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IGdldEl0ZW0ocG9zaXRpb24pOworICAgICAgICAgICAgaWYgKHJvdXRlLmlzRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgcm91dGUuc2VsZWN0KCk7CisgICAgICAgICAgICAgICAgZGlzbWlzcygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBEcmF3YWJsZSBnZXRJY29uRHJhd2FibGUoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7CisgICAgICAgICAgICBVcmkgaWNvblVyaSA9IHJvdXRlLmdldEljb25VcmkoKTsKKyAgICAgICAgICAgIGlmIChpY29uVXJpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IGdldENvbnRleHQoKS5nZXRDb250ZW50UmVzb2x2ZXIoKS5vcGVuSW5wdXRTdHJlYW0oaWNvblVyaSk7CisgICAgICAgICAgICAgICAgICAgIERyYXdhYmxlIGRyYXdhYmxlID0gRHJhd2FibGUuY3JlYXRlRnJvbVN0cmVhbShpcywgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkcmF3YWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZHJhd2FibGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0byBsb2FkICIgKyBpY29uVXJpLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gRmFsbHMgYmFjay4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdEljb25EcmF3YWJsZShyb3V0ZSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIERyYXdhYmxlIGdldERlZmF1bHRJY29uRHJhd2FibGUoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgdHlwZSBvZiB0aGUgcmVjZWl2ZXIgZGV2aWNlIGlzIHNwZWNpZmllZCwgdXNlIGl0LgorICAgICAgICAgICAgc3dpdGNoIChyb3V0ZS5nZXREZXZpY2VUeXBlKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uREVWSUNFX1RZUEVfVFY6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtVHZJY29uOworICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFSb3V0ZXIuUm91dGVJbmZvLkRFVklDRV9UWVBFX1NQRUFLRVI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtU3BlYWtlckljb247CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgbWFrZSB0aGUgYmVzdCBndWVzcyBiYXNlZCBvbiBvdGhlciByb3V0ZSBpbmZvcm1hdGlvbi4KKyAgICAgICAgICAgIGlmIChyb3V0ZSBpbnN0YW5jZW9mIE1lZGlhUm91dGVyLlJvdXRlR3JvdXApIHsKKyAgICAgICAgICAgICAgICAvLyBPbmx5IHNwZWFrZXJzIGNhbiBiZSBncm91cGVkIGZvciBub3cuCisgICAgICAgICAgICAgICAgcmV0dXJuIG1TcGVha2VyR3JvdXBJY29uOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1EZWZhdWx0SWNvbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgY2xhc3MgTWVkaWFSb3V0ZXJDYWxsYmFjayBleHRlbmRzIE1lZGlhUm91dGVyLkNhbGxiYWNrIHsKKyAgICAgICAgTWVkaWFSb3V0ZXJDYWxsYmFjaygpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQWRkZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgeworICAgICAgICAgICAgcmVmcmVzaFJvdXRlcygpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVSZW1vdmVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIGluZm8pIHsKKyAgICAgICAgICAgIHJlZnJlc2hSb3V0ZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQ2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7CisgICAgICAgICAgICByZWZyZXNoUm91dGVzKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVNlbGVjdGVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7CisgICAgICAgICAgICBkaXNtaXNzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgUm91dGVDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvcjxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBSb3V0ZUNvbXBhcmF0b3Igc0luc3RhbmNlID0gbmV3IFJvdXRlQ29tcGFyYXRvcigpOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIGxocywgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJocykgeworICAgICAgICAgICAgcmV0dXJuIGxocy5nZXROYW1lKCkuY29tcGFyZVRvSWdub3JlQ2FzZShyaHMuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNob29zZXJEaWFsb2dGcmFnbWVudC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQ2hvb3NlckRpYWxvZ0ZyYWdtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVlNmIyOQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNob29zZXJEaWFsb2dGcmFnbWVudC5qYXZhCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwOworCitpbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nOworaW1wb3J0IGFuZHJvaWQuYXBwLkRpYWxvZ0ZyYWdtZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKKworaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVNlbGVjdG9yOworCisvKioKKyAqIE1lZGlhIHJvdXRlIGNob29zZXIgZGlhbG9nIGZyYWdtZW50LgorICogPHA+CisgKiBDcmVhdGVzIGEge0BsaW5rIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nfS4gIFRoZSBhcHBsaWNhdGlvbiBtYXkgc3ViY2xhc3MKKyAqIHRoaXMgZGlhbG9nIGZyYWdtZW50IHRvIGN1c3RvbWl6ZSB0aGUgbWVkaWEgcm91dGUgY2hvb3NlciBkaWFsb2cuCisgKiA8L3A+CisgKi8KK3B1YmxpYyBjbGFzcyBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZ0ZyYWdtZW50IGV4dGVuZHMgRGlhbG9nRnJhZ21lbnQgeworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIEFSR1VNRU5UX1NFTEVDVE9SID0gInNlbGVjdG9yIjsKKworICAgIHByaXZhdGUgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2cgbURpYWxvZzsKKyAgICBwcml2YXRlIE1lZGlhUm91dGVTZWxlY3RvciBtU2VsZWN0b3I7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbWVkaWEgcm91dGUgY2hvb3NlciBkaWFsb2cgZnJhZ21lbnQuCisgICAgICogPHA+CisgICAgICogQWxsIHN1YmNsYXNzZXMgb2YgdGhpcyBjbGFzcyBtdXN0IGFsc28gcG9zc2VzcyBhIGRlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZ0ZyYWdtZW50KCkgeworICAgICAgICBzZXRDYW5jZWxhYmxlKHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGZvciBmaWx0ZXJpbmcgdGhlIHJvdXRlcyB0aGF0IHRoZSB1c2VyIGNhbiBzZWxlY3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBzZWxlY3RvciwgbmV2ZXIgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVkaWFSb3V0ZVNlbGVjdG9yIGdldFJvdXRlU2VsZWN0b3IoKSB7CisgICAgICAgIGVuc3VyZVJvdXRlU2VsZWN0b3IoKTsKKyAgICAgICAgcmV0dXJuIG1TZWxlY3RvcjsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5zdXJlUm91dGVTZWxlY3RvcigpIHsKKyAgICAgICAgaWYgKG1TZWxlY3RvciA9PSBudWxsKSB7CisgICAgICAgICAgICBCdW5kbGUgYXJncyA9IGdldEFyZ3VtZW50cygpOworICAgICAgICAgICAgaWYgKGFyZ3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5mcm9tQnVuZGxlKGFyZ3MuZ2V0QnVuZGxlKEFSR1VNRU5UX1NFTEVDVE9SKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVNlbGVjdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtU2VsZWN0b3IgPSBNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBtZWRpYSByb3V0ZSBzZWxlY3RvciBmb3IgZmlsdGVyaW5nIHRoZSByb3V0ZXMgdGhhdCB0aGUgdXNlciBjYW4gc2VsZWN0LgorICAgICAqIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgZnJhZ21lbnQgaXMgYWRkZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSb3V0ZVNlbGVjdG9yKE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvcikgeworICAgICAgICBpZiAoc2VsZWN0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VsZWN0b3IgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICB9CisKKyAgICAgICAgZW5zdXJlUm91dGVTZWxlY3RvcigpOworICAgICAgICBpZiAoIW1TZWxlY3Rvci5lcXVhbHMoc2VsZWN0b3IpKSB7CisgICAgICAgICAgICBtU2VsZWN0b3IgPSBzZWxlY3RvcjsKKworICAgICAgICAgICAgQnVuZGxlIGFyZ3MgPSBnZXRBcmd1bWVudHMoKTsKKyAgICAgICAgICAgIGlmIChhcmdzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhcmdzID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXJncy5wdXRCdW5kbGUoQVJHVU1FTlRfU0VMRUNUT1IsIHNlbGVjdG9yLmFzQnVuZGxlKCkpOworICAgICAgICAgICAgc2V0QXJndW1lbnRzKGFyZ3MpOworCisgICAgICAgICAgICBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZyBkaWFsb2cgPSAoTWVkaWFSb3V0ZUNob29zZXJEaWFsb2cpZ2V0RGlhbG9nKCk7CisgICAgICAgICAgICBpZiAoZGlhbG9nICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkaWFsb2cuc2V0Um91dGVTZWxlY3RvcihzZWxlY3Rvcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgY2hvb3NlciBkaWFsb2cgaXMgYmVpbmcgY3JlYXRlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjdXN0b21pemUgdGhlIGRpYWxvZy4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nIG9uQ3JlYXRlQ2hvb3NlckRpYWxvZygKKyAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nKGNvbnRleHQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBEaWFsb2cgb25DcmVhdGVEaWFsb2coQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBtRGlhbG9nID0gb25DcmVhdGVDaG9vc2VyRGlhbG9nKGdldENvbnRleHQoKSwgc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgbURpYWxvZy5zZXRSb3V0ZVNlbGVjdG9yKGdldFJvdXRlU2VsZWN0b3IoKSk7CisgICAgICAgIHJldHVybiBtRGlhbG9nOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQoQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHsKKyAgICAgICAgc3VwZXIub25Db25maWd1cmF0aW9uQ2hhbmdlZChuZXdDb25maWcpOworICAgICAgICBpZiAobURpYWxvZyAhPSBudWxsKSB7CisgICAgICAgICAgICBtRGlhbG9nLnVwZGF0ZUxheW91dCgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZy5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MGNmY2EKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nLmphdmEKQEAgLTAsMCArMSwxNDg2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc3VwcG9ydC52NC5tZWRpYS5zZXNzaW9uLlBsYXliYWNrU3RhdGVDb21wYXQuQUNUSU9OX1BBVVNFOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuc2Vzc2lvbi5QbGF5YmFja1N0YXRlQ29tcGF0LkFDVElPTl9QTEFZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuc2Vzc2lvbi5QbGF5YmFja1N0YXRlQ29tcGF0LkFDVElPTl9QTEFZX1BBVVNFOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuc2Vzc2lvbi5QbGF5YmFja1N0YXRlQ29tcGF0LkFDVElPTl9TVE9QOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Rhc2s7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuTWVkaWFEZXNjcmlwdGlvbkNvbXBhdDsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuTWVkaWFNZXRhZGF0YUNvbXBhdDsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuc2Vzc2lvbi5NZWRpYUNvbnRyb2xsZXJDb21wYXQ7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0Lm1lZGlhLnNlc3Npb24uTWVkaWFTZXNzaW9uQ29tcGF0OworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5tZWRpYS5zZXNzaW9uLlBsYXliYWNrU3RhdGVDb21wYXQ7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LnV0aWwuT2JqZWN0c0NvbXBhdDsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudENvbXBhdDsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjcuZ3JhcGhpY3MuUGFsZXR0ZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRUaGVtZVdyYXBwZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5NZWFzdXJlU3BlYzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyOworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFjY2VsZXJhdGVEZWNlbGVyYXRlSW50ZXJwb2xhdG9yOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQWxwaGFBbmltYXRpb247CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb247CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25TZXQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25VdGlsczsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLlRyYW5zZm9ybWF0aW9uOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uVHJhbnNsYXRlQW5pbWF0aW9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VCdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5SZWxhdGl2ZUxheW91dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TZWVrQmFyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCitpbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLkFwaUhlbHBlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuUjsKK2ltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVTZWxlY3RvcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwLk92ZXJsYXlMaXN0Vmlldy5PdmVybGF5T2JqZWN0OworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIHJvdXRlIGNvbnRyb2xsZXIgZGlhbG9nIGZvciB7QGxpbmsgTWVkaWFSb3V0ZXJ9LgorICogPHA+CisgKiBUaGlzIGRpYWxvZyBhbGxvd3MgdGhlIHVzZXIgdG8gY29udHJvbCBvciBkaXNjb25uZWN0IGZyb20gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByb3V0ZS4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIE1lZGlhUm91dGVCdXR0b24KKyAqIEBzZWUgTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyCisgKi8KK3B1YmxpYyBjbGFzcyBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZyBleHRlbmRzIEFsZXJ0RGlhbG9nIHsKKyAgICAvLyBUYWdzIHNob3VsZCBiZSBsZXNzIHRoYW4gMjQgY2hhcmFjdGVycyBsb25nIChzZWUgZG9jcyBmb3IgYW5kcm9pZC51dGlsLkxvZy5pc0xvZ2dhYmxlKCkpCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFSb3V0ZUN0cmxEaWFsb2ciOworICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpOworCisgICAgLy8gVGltZSB0byB3YWl0IGJlZm9yZSB1cGRhdGluZyB0aGUgdm9sdW1lIHdoZW4gdGhlIHVzZXIgbGV0cyBnbyBvZiB0aGUgc2VlayBiYXIKKyAgICAvLyB0byBhbGxvdyB0aGUgcm91dGUgcHJvdmlkZXIgdGltZSB0byBwcm9wYWdhdGUgdGhlIGNoYW5nZSBhbmQgcHVibGlzaCBhIG5ldworICAgIC8vIHJvdXRlIGRlc2NyaXB0b3IuCisgICAgc3RhdGljIGZpbmFsIGludCBWT0xVTUVfVVBEQVRFX0RFTEFZX01JTExJUyA9IDUwMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RJT05fVElNRU9VVF9NSUxMSVMgPSAoaW50KSBUaW1lVW5pdC5TRUNPTkRTLnRvTWlsbGlzKDMwTCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVUVE9OX05FVVRSQUxfUkVTX0lEID0gYW5kcm9pZC5SLmlkLmJ1dHRvbjM7CisgICAgc3RhdGljIGZpbmFsIGludCBCVVRUT05fRElTQ09OTkVDVF9SRVNfSUQgPSBhbmRyb2lkLlIuaWQuYnV0dG9uMjsKKyAgICBzdGF0aWMgZmluYWwgaW50IEJVVFRPTl9TVE9QX1JFU19JRCA9IGFuZHJvaWQuUi5pZC5idXR0b24xOworCisgICAgZmluYWwgTWVkaWFSb3V0ZXIgbVJvdXRlcjsKKyAgICBwcml2YXRlIGZpbmFsIE1lZGlhUm91dGVyQ2FsbGJhY2sgbUNhbGxiYWNrOworICAgIGZpbmFsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBtUm91dGU7CisKKyAgICBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgYm9vbGVhbiBtQ3JlYXRlZDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUF0dGFjaGVkVG9XaW5kb3c7CisKKyAgICBwcml2YXRlIGludCBtRGlhbG9nQ29udGVudFdpZHRoOworCisgICAgcHJpdmF0ZSBWaWV3IG1DdXN0b21Db250cm9sVmlldzsKKworICAgIHByaXZhdGUgQnV0dG9uIG1EaXNjb25uZWN0QnV0dG9uOworICAgIHByaXZhdGUgQnV0dG9uIG1TdG9wQ2FzdGluZ0J1dHRvbjsKKyAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1QbGF5YmFja0NvbnRyb2xCdXR0b247CisgICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtQ2xvc2VCdXR0b247CisgICAgcHJpdmF0ZSBNZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24gbUdyb3VwRXhwYW5kQ29sbGFwc2VCdXR0b247CisKKyAgICBwcml2YXRlIEZyYW1lTGF5b3V0IG1FeHBhbmRhYmxlQXJlYUxheW91dDsKKyAgICBwcml2YXRlIExpbmVhckxheW91dCBtRGlhbG9nQXJlYUxheW91dDsKKyAgICBGcmFtZUxheW91dCBtRGVmYXVsdENvbnRyb2xMYXlvdXQ7CisgICAgcHJpdmF0ZSBGcmFtZUxheW91dCBtQ3VzdG9tQ29udHJvbExheW91dDsKKyAgICBwcml2YXRlIEltYWdlVmlldyBtQXJ0VmlldzsKKyAgICBwcml2YXRlIFRleHRWaWV3IG1UaXRsZVZpZXc7CisgICAgcHJpdmF0ZSBUZXh0VmlldyBtU3VidGl0bGVWaWV3OworICAgIHByaXZhdGUgVGV4dFZpZXcgbVJvdXRlTmFtZVRleHRWaWV3OworCisgICAgcHJpdmF0ZSBib29sZWFuIG1Wb2x1bWVDb250cm9sRW5hYmxlZCA9IHRydWU7CisgICAgLy8gTGF5b3V0IGZvciBtZWRpYSBjb250cm9sbGVycyBpbmNsdWRpbmcgcGxheS9wYXVzZSBidXR0b24gYW5kIHRoZSBtYWluIHZvbHVtZSBzbGlkZXIuCisgICAgcHJpdmF0ZSBMaW5lYXJMYXlvdXQgbU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQ7CisgICAgcHJpdmF0ZSBSZWxhdGl2ZUxheW91dCBtUGxheWJhY2tDb250cm9sTGF5b3V0OworICAgIHByaXZhdGUgTGluZWFyTGF5b3V0IG1Wb2x1bWVDb250cm9sTGF5b3V0OworICAgIHByaXZhdGUgVmlldyBtRGl2aWRlclZpZXc7CisKKyAgICBPdmVybGF5TGlzdFZpZXcgbVZvbHVtZUdyb3VwTGlzdDsKKyAgICBWb2x1bWVHcm91cEFkYXB0ZXIgbVZvbHVtZUdyb3VwQWRhcHRlcjsKKyAgICBwcml2YXRlIExpc3Q8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiBtR3JvdXBNZW1iZXJSb3V0ZXM7CisgICAgU2V0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gbUdyb3VwTWVtYmVyUm91dGVzQWRkZWQ7CisgICAgcHJpdmF0ZSBTZXQ8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiBtR3JvdXBNZW1iZXJSb3V0ZXNSZW1vdmVkOworICAgIFNldDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IG1Hcm91cE1lbWJlclJvdXRlc0FuaW1hdGluZ1dpdGhCaXRtYXA7CisgICAgU2Vla0JhciBtVm9sdW1lU2xpZGVyOworICAgIFZvbHVtZUNoYW5nZUxpc3RlbmVyIG1Wb2x1bWVDaGFuZ2VMaXN0ZW5lcjsKKyAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gbVJvdXRlSW5Wb2x1bWVTbGlkZXJUb3VjaGVkOworICAgIHByaXZhdGUgaW50IG1Wb2x1bWVHcm91cExpc3RJdGVtSWNvblNpemU7CisgICAgcHJpdmF0ZSBpbnQgbVZvbHVtZUdyb3VwTGlzdEl0ZW1IZWlnaHQ7CisgICAgcHJpdmF0ZSBpbnQgbVZvbHVtZUdyb3VwTGlzdE1heEhlaWdodDsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtVm9sdW1lR3JvdXBMaXN0UGFkZGluZ1RvcDsKKyAgICBNYXA8TWVkaWFSb3V0ZXIuUm91dGVJbmZvLCBTZWVrQmFyPiBtVm9sdW1lU2xpZGVyTWFwOworCisgICAgTWVkaWFDb250cm9sbGVyQ29tcGF0IG1NZWRpYUNvbnRyb2xsZXI7CisgICAgTWVkaWFDb250cm9sbGVyQ2FsbGJhY2sgbUNvbnRyb2xsZXJDYWxsYmFjazsKKyAgICBQbGF5YmFja1N0YXRlQ29tcGF0IG1TdGF0ZTsKKyAgICBNZWRpYURlc2NyaXB0aW9uQ29tcGF0IG1EZXNjcmlwdGlvbjsKKworICAgIEZldGNoQXJ0VGFzayBtRmV0Y2hBcnRUYXNrOworICAgIEJpdG1hcCBtQXJ0SWNvbkJpdG1hcDsKKyAgICBVcmkgbUFydEljb25Vcmk7CisgICAgYm9vbGVhbiBtQXJ0SWNvbklzTG9hZGVkOworICAgIEJpdG1hcCBtQXJ0SWNvbkxvYWRlZEJpdG1hcDsKKyAgICBpbnQgbUFydEljb25CYWNrZ3JvdW5kQ29sb3I7CisKKyAgICBib29sZWFuIG1IYXNQZW5kaW5nVXBkYXRlOworICAgIGJvb2xlYW4gbVBlbmRpbmdVcGRhdGVBbmltYXRpb25OZWVkZWQ7CisKKyAgICBib29sZWFuIG1Jc0dyb3VwRXhwYW5kZWQ7CisgICAgYm9vbGVhbiBtSXNHcm91cExpc3RBbmltYXRpbmc7CisgICAgYm9vbGVhbiBtSXNHcm91cExpc3RBbmltYXRpb25QZW5kaW5nOworICAgIGludCBtR3JvdXBMaXN0QW5pbWF0aW9uRHVyYXRpb25NczsKKyAgICBwcml2YXRlIGludCBtR3JvdXBMaXN0RmFkZUluRHVyYXRpb25NczsKKyAgICBwcml2YXRlIGludCBtR3JvdXBMaXN0RmFkZU91dER1cmF0aW9uTXM7CisKKyAgICBwcml2YXRlIEludGVycG9sYXRvciBtSW50ZXJwb2xhdG9yOworICAgIHByaXZhdGUgSW50ZXJwb2xhdG9yIG1MaW5lYXJPdXRTbG93SW5JbnRlcnBvbGF0b3I7CisgICAgcHJpdmF0ZSBJbnRlcnBvbGF0b3IgbUZhc3RPdXRTbG93SW5JbnRlcnBvbGF0b3I7CisgICAgcHJpdmF0ZSBJbnRlcnBvbGF0b3IgbUFjY2VsZXJhdGVEZWNlbGVyYXRlSW50ZXJwb2xhdG9yOworCisgICAgZmluYWwgQWNjZXNzaWJpbGl0eU1hbmFnZXIgbUFjY2Vzc2liaWxpdHlNYW5hZ2VyOworCisgICAgUnVubmFibGUgbUdyb3VwTGlzdEZhZGVJbkFuaW1hdGlvbiA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIHN0YXJ0R3JvdXBMaXN0RmFkZUluQW5pbWF0aW9uKCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHVibGljIE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nKENvbnRleHQgY29udGV4dCkgeworICAgICAgICB0aGlzKGNvbnRleHQsIDApOworICAgIH0KKworICAgIHB1YmxpYyBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZyhDb250ZXh0IGNvbnRleHQsIGludCB0aGVtZSkgeworICAgICAgICAvLyBUT0RPIChiLzcyOTc1OTc2KTogQXZvaWQgdG8gdXNlIENvbnRleHRUaGVtZVdyYXBwZXIgd2l0aCBhcHAgY29udGV4dCBhbmQgbGliIHRoZW1lLgorICAgICAgICBzdXBlcihuZXcgQ29udGV4dFRoZW1lV3JhcHBlcihjb250ZXh0LCBBcGlIZWxwZXIuZ2V0TGliVGhlbWUoY29udGV4dCwKKyAgICAgICAgICAgICAgICBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldFJvdXRlclRoZW1lSWQoY29udGV4dCkpKSwgdGhlbWUpOworICAgICAgICBtQ29udGV4dCA9IGdldENvbnRleHQoKTsKKworICAgICAgICBtQ29udHJvbGxlckNhbGxiYWNrID0gbmV3IE1lZGlhQ29udHJvbGxlckNhbGxiYWNrKCk7CisgICAgICAgIG1Sb3V0ZXIgPSBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZShtQ29udGV4dCk7CisgICAgICAgIG1DYWxsYmFjayA9IG5ldyBNZWRpYVJvdXRlckNhbGxiYWNrKCk7CisgICAgICAgIG1Sb3V0ZSA9IG1Sb3V0ZXIuZ2V0U2VsZWN0ZWRSb3V0ZSgpOworICAgICAgICBzZXRNZWRpYVNlc3Npb24obVJvdXRlci5nZXRNZWRpYVNlc3Npb25Ub2tlbigpKTsKKyAgICAgICAgbVZvbHVtZUdyb3VwTGlzdFBhZGRpbmdUb3AgPSBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGNvbnRleHQpLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKKyAgICAgICAgICAgICAgICBSLmRpbWVuLm1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfcGFkZGluZ190b3ApOworICAgICAgICBtQWNjZXNzaWJpbGl0eU1hbmFnZXIgPQorICAgICAgICAgICAgICAgIChBY2Nlc3NpYmlsaXR5TWFuYWdlcikgbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkFDQ0VTU0lCSUxJVFlfU0VSVklDRSk7CisgICAgICAgIG1MaW5lYXJPdXRTbG93SW5JbnRlcnBvbGF0b3IgPSBBbmltYXRpb25VdGlscy5sb2FkSW50ZXJwb2xhdG9yKAorICAgICAgICAgICAgICAgIG1Db250ZXh0LCBhbmRyb2lkLlIuaW50ZXJwb2xhdG9yLmxpbmVhcl9vdXRfc2xvd19pbik7CisgICAgICAgIG1GYXN0T3V0U2xvd0luSW50ZXJwb2xhdG9yID0gQW5pbWF0aW9uVXRpbHMubG9hZEludGVycG9sYXRvcigKKyAgICAgICAgICAgICAgICBtQ29udGV4dCwgYW5kcm9pZC5SLmludGVycG9sYXRvci5mYXN0X291dF9zbG93X2luKTsKKyAgICAgICAgbUFjY2VsZXJhdGVEZWNlbGVyYXRlSW50ZXJwb2xhdG9yID0gbmV3IEFjY2VsZXJhdGVEZWNlbGVyYXRlSW50ZXJwb2xhdG9yKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgcm91dGUgdGhhdCB0aGlzIGRpYWxvZyBpcyBjb250cm9sbGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIGdldFJvdXRlKCkgeworICAgICAgICByZXR1cm4gbVJvdXRlOworICAgIH0KKworICAgIHByaXZhdGUgTWVkaWFSb3V0ZXIuUm91dGVHcm91cCBnZXRHcm91cCgpIHsKKyAgICAgICAgaWYgKG1Sb3V0ZSBpbnN0YW5jZW9mIE1lZGlhUm91dGVyLlJvdXRlR3JvdXApIHsKKyAgICAgICAgICAgIHJldHVybiAoTWVkaWFSb3V0ZXIuUm91dGVHcm91cCkgbVJvdXRlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb3ZpZGVzIHRoZSBzdWJjbGFzcyBhbiBvcHBvcnR1bml0eSB0byBjcmVhdGUgYSB2aWV3IHRoYXQgd2lsbCByZXBsYWNlIHRoZSBkZWZhdWx0IG1lZGlhCisgICAgICogY29udHJvbHMgZm9yIHRoZSBjdXJyZW50bHkgcGxheWluZyBjb250ZW50LgorICAgICAqCisgICAgICogQHBhcmFtIHNhdmVkSW5zdGFuY2VTdGF0ZSBUaGUgZGlhbG9nJ3Mgc2F2ZWQgaW5zdGFuY2Ugc3RhdGUuCisgICAgICogQHJldHVybiBUaGUgbWVkaWEgY29udHJvbCB2aWV3LCBvciBudWxsIGlmIG5vbmUuCisgICAgICovCisgICAgcHVibGljIFZpZXcgb25DcmVhdGVNZWRpYUNvbnRyb2xWaWV3KEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbWVkaWEgY29udHJvbCB2aWV3IHRoYXQgd2FzIGNyZWF0ZWQgYnkge0BsaW5rICNvbkNyZWF0ZU1lZGlhQ29udHJvbFZpZXcoQnVuZGxlKX0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBtZWRpYSBjb250cm9sIHZpZXcsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVmlldyBnZXRNZWRpYUNvbnRyb2xWaWV3KCkgeworICAgICAgICByZXR1cm4gbUN1c3RvbUNvbnRyb2xWaWV3OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciB0byBlbmFibGUgdGhlIHZvbHVtZSBzbGlkZXIgYW5kIHZvbHVtZSBjb250cm9sIHVzaW5nIHRoZSB2b2x1bWUga2V5cworICAgICAqIHdoZW4gdGhlIHJvdXRlIHN1cHBvcnRzIGl0LgorICAgICAqIDxwPgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRydWUuCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZvbHVtZUNvbnRyb2xFbmFibGVkKGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICAgIGlmIChtVm9sdW1lQ29udHJvbEVuYWJsZWQgIT0gZW5hYmxlKSB7CisgICAgICAgICAgICBtVm9sdW1lQ29udHJvbEVuYWJsZWQgPSBlbmFibGU7CisgICAgICAgICAgICBpZiAobUNyZWF0ZWQpIHsKKyAgICAgICAgICAgICAgICB1cGRhdGUoZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRvIGVuYWJsZSB0aGUgdm9sdW1lIHNsaWRlciBhbmQgdm9sdW1lIGNvbnRyb2wgdXNpbmcgdGhlIHZvbHVtZSBrZXlzCisgICAgICogd2hlbiB0aGUgcm91dGUgc3VwcG9ydHMgaXQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNWb2x1bWVDb250cm9sRW5hYmxlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1Wb2x1bWVDb250cm9sRW5hYmxlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNlc3Npb24gdG8gdXNlIGZvciBtZXRhZGF0YSBhbmQgdHJhbnNwb3J0IGNvbnRyb2xzLiBUaGUgZGlhbG9nCisgICAgICogd2lsbCBsaXN0ZW4gdG8gY2hhbmdlcyBvbiB0aGlzIHNlc3Npb24gYW5kIHVwZGF0ZSB0aGUgVUkgYXV0b21hdGljYWxseSBpbgorICAgICAqIHJlc3BvbnNlIHRvIGNoYW5nZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2Vzc2lvblRva2VuIFRoZSB0b2tlbiBmb3IgdGhlIHNlc3Npb24gdG8gdXNlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXRNZWRpYVNlc3Npb24oTWVkaWFTZXNzaW9uQ29tcGF0LlRva2VuIHNlc3Npb25Ub2tlbikgeworICAgICAgICBpZiAobU1lZGlhQ29udHJvbGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLnVucmVnaXN0ZXJDYWxsYmFjayhtQ29udHJvbGxlckNhbGxiYWNrKTsKKyAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIgPSBudWxsOworICAgICAgICB9CisgICAgICAgIGlmIChzZXNzaW9uVG9rZW4gPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghbUF0dGFjaGVkVG9XaW5kb3cpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlciA9IG5ldyBNZWRpYUNvbnRyb2xsZXJDb21wYXQobUNvbnRleHQsIHNlc3Npb25Ub2tlbik7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciBjcmVhdGluZyBtZWRpYSBjb250cm9sbGVyIGluIHNldE1lZGlhU2Vzc2lvbi4iLCBlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobU1lZGlhQ29udHJvbGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLnJlZ2lzdGVyQ2FsbGJhY2sobUNvbnRyb2xsZXJDYWxsYmFjayk7CisgICAgICAgIH0KKyAgICAgICAgTWVkaWFNZXRhZGF0YUNvbXBhdCBtZXRhZGF0YSA9IG1NZWRpYUNvbnRyb2xsZXIgPT0gbnVsbCA/IG51bGwKKyAgICAgICAgICAgICAgICA6IG1NZWRpYUNvbnRyb2xsZXIuZ2V0TWV0YWRhdGEoKTsKKyAgICAgICAgbURlc2NyaXB0aW9uID0gbWV0YWRhdGEgPT0gbnVsbCA/IG51bGwgOiBtZXRhZGF0YS5nZXREZXNjcmlwdGlvbigpOworICAgICAgICBtU3RhdGUgPSBtTWVkaWFDb250cm9sbGVyID09IG51bGwgPyBudWxsIDogbU1lZGlhQ29udHJvbGxlci5nZXRQbGF5YmFja1N0YXRlKCk7CisgICAgICAgIHVwZGF0ZUFydEljb25JZk5lZWRlZCgpOworICAgICAgICB1cGRhdGUoZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHNlc3Npb24gdG8gdXNlIGZvciBtZXRhZGF0YSBhbmQgdHJhbnNwb3J0IGNvbnRyb2xzLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgdG9rZW4gZm9yIHRoZSBzZXNzaW9uIHRvIHVzZSBvciBudWxsIGlmIG5vbmUuCisgICAgICovCisgICAgcHVibGljIE1lZGlhU2Vzc2lvbkNvbXBhdC5Ub2tlbiBnZXRNZWRpYVNlc3Npb24oKSB7CisgICAgICAgIHJldHVybiBtTWVkaWFDb250cm9sbGVyID09IG51bGwgPyBudWxsIDogbU1lZGlhQ29udHJvbGxlci5nZXRTZXNzaW9uVG9rZW4oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgZ2V0V2luZG93KCkuc2V0QmFja2dyb3VuZERyYXdhYmxlUmVzb3VyY2UoYW5kcm9pZC5SLmNvbG9yLnRyYW5zcGFyZW50KTsKKworICAgICAgICBzZXRDb250ZW50VmlldyhBcGlIZWxwZXIuaW5mbGF0ZUxpYkxheW91dChtQ29udGV4dCwKKyAgICAgICAgICAgICAgICBBcGlIZWxwZXIuZ2V0TGliVGhlbWUobUNvbnRleHQsIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0Um91dGVyVGhlbWVJZChtQ29udGV4dCkpLAorICAgICAgICAgICAgICAgIFIubGF5b3V0Lm1yX2NvbnRyb2xsZXJfbWF0ZXJpYWxfZGlhbG9nX2IpKTsKKworICAgICAgICAvLyBSZW1vdmUgdGhlIG5ldXRyYWwgYnV0dG9uLgorICAgICAgICBmaW5kVmlld0J5SWQoQlVUVE9OX05FVVRSQUxfUkVTX0lEKS5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisKKyAgICAgICAgQ2xpY2tMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBDbGlja0xpc3RlbmVyKCk7CisKKyAgICAgICAgbUV4cGFuZGFibGVBcmVhTGF5b3V0ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfZXhwYW5kYWJsZV9hcmVhKTsKKyAgICAgICAgbUV4cGFuZGFibGVBcmVhTGF5b3V0LnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgZGlzbWlzcygpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgbURpYWxvZ0FyZWFMYXlvdXQgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9kaWFsb2dfYXJlYSk7CisgICAgICAgIG1EaWFsb2dBcmVhTGF5b3V0LnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgLy8gRWF0IHVuaGFuZGxlZCB0b3VjaCBldmVudHMuCisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBpbnQgY29sb3IgPSBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldEJ1dHRvblRleHRDb2xvcihtQ29udGV4dCk7CisgICAgICAgIG1EaXNjb25uZWN0QnV0dG9uID0gZmluZFZpZXdCeUlkKEJVVFRPTl9ESVNDT05ORUNUX1JFU19JRCk7CisgICAgICAgIG1EaXNjb25uZWN0QnV0dG9uLnNldFRleHQoCisgICAgICAgICAgICAgICAgQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhtQ29udGV4dCkuZ2V0U3RyaW5nKFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCkpOworICAgICAgICBtRGlzY29ubmVjdEJ1dHRvbi5zZXRUZXh0Q29sb3IoY29sb3IpOworICAgICAgICBtRGlzY29ubmVjdEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobGlzdGVuZXIpOworCisgICAgICAgIG1TdG9wQ2FzdGluZ0J1dHRvbiA9IGZpbmRWaWV3QnlJZChCVVRUT05fU1RPUF9SRVNfSUQpOworICAgICAgICBtU3RvcENhc3RpbmdCdXR0b24uc2V0VGV4dCgKKyAgICAgICAgICAgICAgICBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1Db250ZXh0KS5nZXRTdHJpbmcoUi5zdHJpbmcubXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmcpKTsKKyAgICAgICAgbVN0b3BDYXN0aW5nQnV0dG9uLnNldFRleHRDb2xvcihjb2xvcik7CisgICAgICAgIG1TdG9wQ2FzdGluZ0J1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobGlzdGVuZXIpOworCisgICAgICAgIG1Sb3V0ZU5hbWVUZXh0VmlldyA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX25hbWUpOworICAgICAgICBtQ2xvc2VCdXR0b24gPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9jbG9zZSk7CisgICAgICAgIG1DbG9zZUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICBtQ3VzdG9tQ29udHJvbExheW91dCA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX2N1c3RvbV9jb250cm9sKTsKKyAgICAgICAgbURlZmF1bHRDb250cm9sTGF5b3V0ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfZGVmYXVsdF9jb250cm9sKTsKKworICAgICAgICAvLyBTdGFydCB0aGUgc2Vzc2lvbiBhY3Rpdml0eSB3aGVuIGEgY29udGVudCBpdGVtIChhbGJ1bSBhcnQsIHRpdGxlIG9yIHN1YnRpdGxlKSBpcyBjbGlja2VkLgorICAgICAgICBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBvbkNsaWNrTGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgaWYgKG1NZWRpYUNvbnRyb2xsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBQZW5kaW5nSW50ZW50IHBpID0gbU1lZGlhQ29udHJvbGxlci5nZXRTZXNzaW9uQWN0aXZpdHkoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGkuc2VuZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc21pc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFBlbmRpbmdJbnRlbnQuQ2FuY2VsZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgcGkgKyAiIHdhcyBub3Qgc2VudCwgaXQgaGFkIGJlZW4gY2FuY2VsZWQuIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIG1BcnRWaWV3ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfYXJ0KTsKKyAgICAgICAgbUFydFZpZXcuc2V0T25DbGlja0xpc3RlbmVyKG9uQ2xpY2tMaXN0ZW5lcik7CisgICAgICAgIGZpbmRWaWV3QnlJZChSLmlkLm1yX2NvbnRyb2xfdGl0bGVfY29udGFpbmVyKS5zZXRPbkNsaWNrTGlzdGVuZXIob25DbGlja0xpc3RlbmVyKTsKKworICAgICAgICBtTWVkaWFNYWluQ29udHJvbExheW91dCA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX21lZGlhX21haW5fY29udHJvbCk7CisgICAgICAgIG1EaXZpZGVyVmlldyA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX2NvbnRyb2xfZGl2aWRlcik7CisKKyAgICAgICAgbVBsYXliYWNrQ29udHJvbExheW91dCA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX3BsYXliYWNrX2NvbnRyb2wpOworICAgICAgICBtVGl0bGVWaWV3ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfY29udHJvbF90aXRsZSk7CisgICAgICAgIG1TdWJ0aXRsZVZpZXcgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9jb250cm9sX3N1YnRpdGxlKTsKKyAgICAgICAgbVBsYXliYWNrQ29udHJvbEJ1dHRvbiA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX2NvbnRyb2xfcGxheWJhY2tfY3RybCk7CisgICAgICAgIG1QbGF5YmFja0NvbnRyb2xCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKGxpc3RlbmVyKTsKKworICAgICAgICBtVm9sdW1lQ29udHJvbExheW91dCA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX3ZvbHVtZV9jb250cm9sKTsKKyAgICAgICAgbVZvbHVtZUNvbnRyb2xMYXlvdXQuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICBtVm9sdW1lU2xpZGVyID0gZmluZFZpZXdCeUlkKFIuaWQubXJfdm9sdW1lX3NsaWRlcik7CisgICAgICAgIG1Wb2x1bWVTbGlkZXIuc2V0VGFnKG1Sb3V0ZSk7CisgICAgICAgIG1Wb2x1bWVDaGFuZ2VMaXN0ZW5lciA9IG5ldyBWb2x1bWVDaGFuZ2VMaXN0ZW5lcigpOworICAgICAgICBtVm9sdW1lU2xpZGVyLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKG1Wb2x1bWVDaGFuZ2VMaXN0ZW5lcik7CisKKyAgICAgICAgbVZvbHVtZUdyb3VwTGlzdCA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX3ZvbHVtZV9ncm91cF9saXN0KTsKKyAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzID0gbmV3IEFycmF5TGlzdDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+KCk7CisgICAgICAgIG1Wb2x1bWVHcm91cEFkYXB0ZXIgPSBuZXcgVm9sdW1lR3JvdXBBZGFwdGVyKG1Wb2x1bWVHcm91cExpc3QuZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgIG1Hcm91cE1lbWJlclJvdXRlcyk7CisgICAgICAgIG1Wb2x1bWVHcm91cExpc3Quc2V0QWRhcHRlcihtVm9sdW1lR3JvdXBBZGFwdGVyKTsKKyAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzQW5pbWF0aW5nV2l0aEJpdG1hcCA9IG5ldyBIYXNoU2V0PD4oKTsKKworICAgICAgICBNZWRpYVJvdXRlclRoZW1lSGVscGVyLnNldE1lZGlhQ29udHJvbHNCYWNrZ3JvdW5kQ29sb3IobUNvbnRleHQsCisgICAgICAgICAgICAgICAgbU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQsIG1Wb2x1bWVHcm91cExpc3QsIGdldEdyb3VwKCkgIT0gbnVsbCk7CisgICAgICAgIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuc2V0Vm9sdW1lU2xpZGVyQ29sb3IobUNvbnRleHQsCisgICAgICAgICAgICAgICAgKE1lZGlhUm91dGVWb2x1bWVTbGlkZXIpIG1Wb2x1bWVTbGlkZXIsIG1NZWRpYU1haW5Db250cm9sTGF5b3V0KTsKKyAgICAgICAgbVZvbHVtZVNsaWRlck1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgbVZvbHVtZVNsaWRlck1hcC5wdXQobVJvdXRlLCBtVm9sdW1lU2xpZGVyKTsKKworICAgICAgICBtR3JvdXBFeHBhbmRDb2xsYXBzZUJ1dHRvbiA9CisgICAgICAgICAgICAgICAgZmluZFZpZXdCeUlkKFIuaWQubXJfZ3JvdXBfZXhwYW5kX2NvbGxhcHNlKTsKKyAgICAgICAgbUdyb3VwRXhwYW5kQ29sbGFwc2VCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICBtSXNHcm91cEV4cGFuZGVkID0gIW1Jc0dyb3VwRXhwYW5kZWQ7CisgICAgICAgICAgICAgICAgaWYgKG1Jc0dyb3VwRXhwYW5kZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbVZvbHVtZUdyb3VwTGlzdC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxvYWRJbnRlcnBvbGF0b3IoKTsKKyAgICAgICAgICAgICAgICB1cGRhdGVMYXlvdXRIZWlnaHQodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBsb2FkSW50ZXJwb2xhdG9yKCk7CisgICAgICAgIG1Hcm91cExpc3RBbmltYXRpb25EdXJhdGlvbk1zID0gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhtQ29udGV4dCkuZ2V0SW50ZWdlcigKKyAgICAgICAgICAgICAgICBSLmludGVnZXIubXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9hbmltYXRpb25fZHVyYXRpb25fbXMpOworICAgICAgICBtR3JvdXBMaXN0RmFkZUluRHVyYXRpb25NcyA9IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUNvbnRleHQpLmdldEludGVnZXIoCisgICAgICAgICAgICAgICAgUi5pbnRlZ2VyLm1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfZmFkZV9pbl9kdXJhdGlvbl9tcyk7CisgICAgICAgIG1Hcm91cExpc3RGYWRlT3V0RHVyYXRpb25NcyA9IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUNvbnRleHQpLmdldEludGVnZXIoCisgICAgICAgICAgICAgICAgUi5pbnRlZ2VyLm1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfZmFkZV9vdXRfZHVyYXRpb25fbXMpOworCisgICAgICAgIG1DdXN0b21Db250cm9sVmlldyA9IG9uQ3JlYXRlTWVkaWFDb250cm9sVmlldyhzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBpZiAobUN1c3RvbUNvbnRyb2xWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1DdXN0b21Db250cm9sTGF5b3V0LmFkZFZpZXcobUN1c3RvbUNvbnRyb2xWaWV3KTsKKyAgICAgICAgICAgIG1DdXN0b21Db250cm9sTGF5b3V0LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgfQorICAgICAgICBtQ3JlYXRlZCA9IHRydWU7CisgICAgICAgIHVwZGF0ZUxheW91dCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHdpZHRoIG9mIHRoZSBkaWFsb2cuIEFsc28gY2FsbGVkIHdoZW4gY29uZmlndXJhdGlvbiBjaGFuZ2VzLgorICAgICAqLworICAgIHZvaWQgdXBkYXRlTGF5b3V0KCkgeworICAgICAgICBpbnQgd2lkdGggPSBNZWRpYVJvdXRlRGlhbG9nSGVscGVyLmdldERpYWxvZ1dpZHRoKG1Db250ZXh0KTsKKyAgICAgICAgZ2V0V2luZG93KCkuc2V0TGF5b3V0KHdpZHRoLCBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCk7CisKKyAgICAgICAgVmlldyBkZWNvclZpZXcgPSBnZXRXaW5kb3coKS5nZXREZWNvclZpZXcoKTsKKyAgICAgICAgbURpYWxvZ0NvbnRlbnRXaWR0aCA9IHdpZHRoIC0gZGVjb3JWaWV3LmdldFBhZGRpbmdMZWZ0KCkgLSBkZWNvclZpZXcuZ2V0UGFkZGluZ1JpZ2h0KCk7CisKKyAgICAgICAgUmVzb3VyY2VzIHJlcyA9IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUNvbnRleHQpOworICAgICAgICBtVm9sdW1lR3JvdXBMaXN0SXRlbUljb25TaXplID0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKKyAgICAgICAgICAgICAgICBSLmRpbWVuLm1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfaXRlbV9pY29uX3NpemUpOworICAgICAgICBtVm9sdW1lR3JvdXBMaXN0SXRlbUhlaWdodCA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCisgICAgICAgICAgICAgICAgUi5kaW1lbi5tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2l0ZW1faGVpZ2h0KTsKKyAgICAgICAgbVZvbHVtZUdyb3VwTGlzdE1heEhlaWdodCA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCisgICAgICAgICAgICAgICAgUi5kaW1lbi5tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X21heF9oZWlnaHQpOworCisgICAgICAgIC8vIEZldGNoIGFydCBpY29ucyBhZ2FpbiBmb3IgbGF5b3V0IGNoYW5nZXMgdG8gcmVzaXplIGl0IGFjY29yZGluZ2x5CisgICAgICAgIG1BcnRJY29uQml0bWFwID0gbnVsbDsKKyAgICAgICAgbUFydEljb25VcmkgPSBudWxsOworICAgICAgICB1cGRhdGVBcnRJY29uSWZOZWVkZWQoKTsKKyAgICAgICAgdXBkYXRlKGZhbHNlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkF0dGFjaGVkVG9XaW5kb3coKSB7CisgICAgICAgIHN1cGVyLm9uQXR0YWNoZWRUb1dpbmRvdygpOworICAgICAgICBtQXR0YWNoZWRUb1dpbmRvdyA9IHRydWU7CisKKyAgICAgICAgbVJvdXRlci5hZGRDYWxsYmFjayhNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFksIG1DYWxsYmFjaywKKyAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1VORklMVEVSRURfRVZFTlRTKTsKKyAgICAgICAgc2V0TWVkaWFTZXNzaW9uKG1Sb3V0ZXIuZ2V0TWVkaWFTZXNzaW9uVG9rZW4oKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKSB7CisgICAgICAgIG1Sb3V0ZXIucmVtb3ZlQ2FsbGJhY2sobUNhbGxiYWNrKTsKKyAgICAgICAgc2V0TWVkaWFTZXNzaW9uKG51bGwpOworICAgICAgICBtQXR0YWNoZWRUb1dpbmRvdyA9IGZhbHNlOworICAgICAgICBzdXBlci5vbkRldGFjaGVkRnJvbVdpbmRvdygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RG93bihpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgaWYgKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9WT0xVTUVfRE9XTgorICAgICAgICAgICAgICAgIHx8IGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9WT0xVTUVfVVApIHsKKyAgICAgICAgICAgIG1Sb3V0ZS5yZXF1ZXN0VXBkYXRlVm9sdW1lKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9WT0xVTUVfRE9XTiA/IC0xIDogMSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIub25LZXlEb3duKGtleUNvZGUsIGV2ZW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbktleVVwKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgeworICAgICAgICBpZiAoa2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX1ZPTFVNRV9ET1dOCisgICAgICAgICAgICAgICAgfHwga2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX1ZPTFVNRV9VUCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLm9uS2V5VXAoa2V5Q29kZSwgZXZlbnQpOworICAgIH0KKworICAgIHZvaWQgdXBkYXRlKGJvb2xlYW4gYW5pbWF0ZSkgeworICAgICAgICAvLyBEZWZlciBkaWFsb2cgdXBkYXRlcyBpZiBhIHVzZXIgaXMgYWRqdXN0aW5nIGEgdm9sdW1lIGluIHRoZSBsaXN0CisgICAgICAgIGlmIChtUm91dGVJblZvbHVtZVNsaWRlclRvdWNoZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgbUhhc1BlbmRpbmdVcGRhdGUgPSB0cnVlOworICAgICAgICAgICAgbVBlbmRpbmdVcGRhdGVBbmltYXRpb25OZWVkZWQgfD0gYW5pbWF0ZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtSGFzUGVuZGluZ1VwZGF0ZSA9IGZhbHNlOworICAgICAgICBtUGVuZGluZ1VwZGF0ZUFuaW1hdGlvbk5lZWRlZCA9IGZhbHNlOworICAgICAgICBpZiAoIW1Sb3V0ZS5pc1NlbGVjdGVkKCkgfHwgbVJvdXRlLmlzRGVmYXVsdE9yQmx1ZXRvb3RoKCkpIHsKKyAgICAgICAgICAgIGRpc21pc3MoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1DcmVhdGVkKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBtUm91dGVOYW1lVGV4dFZpZXcuc2V0VGV4dChtUm91dGUuZ2V0TmFtZSgpKTsKKyAgICAgICAgbURpc2Nvbm5lY3RCdXR0b24uc2V0VmlzaWJpbGl0eShtUm91dGUuY2FuRGlzY29ubmVjdCgpID8gVmlldy5WSVNJQkxFIDogVmlldy5HT05FKTsKKyAgICAgICAgaWYgKG1DdXN0b21Db250cm9sVmlldyA9PSBudWxsICYmIG1BcnRJY29uSXNMb2FkZWQpIHsKKyAgICAgICAgICAgIGlmIChpc0JpdG1hcFJlY3ljbGVkKG1BcnRJY29uTG9hZGVkQml0bWFwKSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbid0IHNldCBhcnR3b3JrIGltYWdlIHdpdGggcmVjeWNsZWQgYml0bWFwOiAiICsgbUFydEljb25Mb2FkZWRCaXRtYXApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtQXJ0Vmlldy5zZXRJbWFnZUJpdG1hcChtQXJ0SWNvbkxvYWRlZEJpdG1hcCk7CisgICAgICAgICAgICAgICAgbUFydFZpZXcuc2V0QmFja2dyb3VuZENvbG9yKG1BcnRJY29uQmFja2dyb3VuZENvbG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsZWFyTG9hZGVkQml0bWFwKCk7CisgICAgICAgIH0KKyAgICAgICAgdXBkYXRlVm9sdW1lQ29udHJvbExheW91dCgpOworICAgICAgICB1cGRhdGVQbGF5YmFja0NvbnRyb2xMYXlvdXQoKTsKKyAgICAgICAgdXBkYXRlTGF5b3V0SGVpZ2h0KGFuaW1hdGUpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc0JpdG1hcFJlY3ljbGVkKEJpdG1hcCBiaXRtYXApIHsKKyAgICAgICAgcmV0dXJuIGJpdG1hcCAhPSBudWxsICYmIGJpdG1hcC5pc1JlY3ljbGVkKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGNhblNob3dQbGF5YmFja0NvbnRyb2xMYXlvdXQoKSB7CisgICAgICAgIHJldHVybiBtQ3VzdG9tQ29udHJvbFZpZXcgPT0gbnVsbCAmJiAobURlc2NyaXB0aW9uICE9IG51bGwgfHwgbVN0YXRlICE9IG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGhlaWdodCBvZiBtYWluIG1lZGlhIGNvbnRyb2xsZXIgd2hpY2ggaW5jbHVkZXMgcGxheWJhY2sgY29udHJvbCBhbmQgbWFzdGVyCisgICAgICogdm9sdW1lIGNvbnRyb2wuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZ2V0TWFpbkNvbnRyb2xsZXJIZWlnaHQoYm9vbGVhbiBzaG93UGxheWJhY2tDb250cm9sKSB7CisgICAgICAgIGludCBoZWlnaHQgPSAwOworICAgICAgICBpZiAoc2hvd1BsYXliYWNrQ29udHJvbCB8fCBtVm9sdW1lQ29udHJvbExheW91dC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7CisgICAgICAgICAgICBoZWlnaHQgKz0gbU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQuZ2V0UGFkZGluZ1RvcCgpCisgICAgICAgICAgICAgICAgICAgICsgbU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQuZ2V0UGFkZGluZ0JvdHRvbSgpOworICAgICAgICAgICAgaWYgKHNob3dQbGF5YmFja0NvbnRyb2wpIHsKKyAgICAgICAgICAgICAgICBoZWlnaHQgKz0gIG1QbGF5YmFja0NvbnRyb2xMYXlvdXQuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtVm9sdW1lQ29udHJvbExheW91dC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7CisgICAgICAgICAgICAgICAgaGVpZ2h0ICs9IG1Wb2x1bWVDb250cm9sTGF5b3V0LmdldE1lYXN1cmVkSGVpZ2h0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2hvd1BsYXliYWNrQ29udHJvbCAmJiBtVm9sdW1lQ29udHJvbExheW91dC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7CisgICAgICAgICAgICAgICAgaGVpZ2h0ICs9IG1EaXZpZGVyVmlldy5nZXRNZWFzdXJlZEhlaWdodCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBoZWlnaHQ7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZU1lZGlhQ29udHJvbFZpc2liaWxpdHkoYm9vbGVhbiBjYW5TaG93UGxheWJhY2tDb250cm9sTGF5b3V0KSB7CisgICAgICAgIC8vIFRPRE86IFVwZGF0ZSB0aGUgdG9wIGFuZCBib3R0b20gcGFkZGluZyBvZiB0aGUgY29udHJvbCBsYXlvdXQgYWNjb3JkaW5nIHRvIHRoZSBkaXNwbGF5CisgICAgICAgIC8vIGhlaWdodC4KKyAgICAgICAgbURpdmlkZXJWaWV3LnNldFZpc2liaWxpdHkoKG1Wb2x1bWVDb250cm9sTGF5b3V0LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUKKyAgICAgICAgICAgICAgICAmJiBjYW5TaG93UGxheWJhY2tDb250cm9sTGF5b3V0KSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7CisgICAgICAgIG1NZWRpYU1haW5Db250cm9sTGF5b3V0LnNldFZpc2liaWxpdHkoKG1Wb2x1bWVDb250cm9sTGF5b3V0LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LkdPTkUKKyAgICAgICAgICAgICAgICAmJiAhY2FuU2hvd1BsYXliYWNrQ29udHJvbExheW91dCkgPyBWaWV3LkdPTkUgOiBWaWV3LlZJU0lCTEUpOworICAgIH0KKworICAgIHZvaWQgdXBkYXRlTGF5b3V0SGVpZ2h0KGZpbmFsIGJvb2xlYW4gYW5pbWF0ZSkgeworICAgICAgICAvLyBXZSBuZWVkIHRvIGRlZmVyIHRoZSB1cGRhdGUgdW50aWwgdGhlIGZpcnN0IGxheW91dCBoYXMgb2NjdXJyZWQsIGFzIHdlIGRvbid0IHlldCBrbm93IHRoZQorICAgICAgICAvLyBvdmVyYWxsIHZpc2libGUgZGlzcGxheSBzaXplIGluIHdoaWNoIHRoZSB3aW5kb3cgdGhpcyB2aWV3IGlzIGF0dGFjaGVkIHRvIGhhcyBiZWVuCisgICAgICAgIC8vIHBvc2l0aW9uZWQgaW4uCisgICAgICAgIG1EZWZhdWx0Q29udHJvbExheW91dC5yZXF1ZXN0TGF5b3V0KCk7CisgICAgICAgIFZpZXdUcmVlT2JzZXJ2ZXIgb2JzZXJ2ZXIgPSBtRGVmYXVsdENvbnRyb2xMYXlvdXQuZ2V0Vmlld1RyZWVPYnNlcnZlcigpOworICAgICAgICBvYnNlcnZlci5hZGRPbkdsb2JhbExheW91dExpc3RlbmVyKG5ldyBWaWV3VHJlZU9ic2VydmVyLk9uR2xvYmFsTGF5b3V0TGlzdGVuZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uR2xvYmFsTGF5b3V0KCkgeworICAgICAgICAgICAgICAgIG1EZWZhdWx0Q29udHJvbExheW91dC5nZXRWaWV3VHJlZU9ic2VydmVyKCkucmVtb3ZlR2xvYmFsT25MYXlvdXRMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgICAgICBpZiAobUlzR3JvdXBMaXN0QW5pbWF0aW5nKSB7CisgICAgICAgICAgICAgICAgICAgIG1Jc0dyb3VwTGlzdEFuaW1hdGlvblBlbmRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUxheW91dEhlaWdodEludGVybmFsKGFuaW1hdGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXBkYXRlcyB0aGUgaGVpZ2h0IG9mIHZpZXdzIGFuZCBoaWRlIGFydHdvcmsgb3IgbWV0YWRhdGEgaWYgc3BhY2UgaXMgbGltaXRlZC4KKyAgICAgKi8KKyAgICB2b2lkIHVwZGF0ZUxheW91dEhlaWdodEludGVybmFsKGJvb2xlYW4gYW5pbWF0ZSkgeworICAgICAgICAvLyBNZWFzdXJlIHRoZSBzaXplIG9mIHdpZGdldHMgYW5kIGdldCB0aGUgaGVpZ2h0IG9mIG1haW4gY29tcG9uZW50cy4KKyAgICAgICAgaW50IG9sZEhlaWdodCA9IGdldExheW91dEhlaWdodChtTWVkaWFNYWluQ29udHJvbExheW91dCk7CisgICAgICAgIHNldExheW91dEhlaWdodChtTWVkaWFNYWluQ29udHJvbExheW91dCwgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpOworICAgICAgICB1cGRhdGVNZWRpYUNvbnRyb2xWaXNpYmlsaXR5KGNhblNob3dQbGF5YmFja0NvbnRyb2xMYXlvdXQoKSk7CisgICAgICAgIFZpZXcgZGVjb3JWaWV3ID0gZ2V0V2luZG93KCkuZ2V0RGVjb3JWaWV3KCk7CisgICAgICAgIGRlY29yVmlldy5tZWFzdXJlKAorICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhnZXRXaW5kb3coKS5nZXRBdHRyaWJ1dGVzKCkud2lkdGgsIE1lYXN1cmVTcGVjLkVYQUNUTFkpLAorICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVEKTsKKyAgICAgICAgc2V0TGF5b3V0SGVpZ2h0KG1NZWRpYU1haW5Db250cm9sTGF5b3V0LCBvbGRIZWlnaHQpOworICAgICAgICBpbnQgYXJ0Vmlld0hlaWdodCA9IDA7CisgICAgICAgIGlmIChtQ3VzdG9tQ29udHJvbFZpZXcgPT0gbnVsbCAmJiBtQXJ0Vmlldy5nZXREcmF3YWJsZSgpIGluc3RhbmNlb2YgQml0bWFwRHJhd2FibGUpIHsKKyAgICAgICAgICAgIEJpdG1hcCBhcnQgPSAoKEJpdG1hcERyYXdhYmxlKSBtQXJ0Vmlldy5nZXREcmF3YWJsZSgpKS5nZXRCaXRtYXAoKTsKKyAgICAgICAgICAgIGlmIChhcnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGFydFZpZXdIZWlnaHQgPSBnZXREZXNpcmVkQXJ0SGVpZ2h0KGFydC5nZXRXaWR0aCgpLCBhcnQuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgICAgIG1BcnRWaWV3LnNldFNjYWxlVHlwZShhcnQuZ2V0V2lkdGgoKSA+PSBhcnQuZ2V0SGVpZ2h0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgID8gSW1hZ2VWaWV3LlNjYWxlVHlwZS5GSVRfWFkgOiBJbWFnZVZpZXcuU2NhbGVUeXBlLkZJVF9DRU5URVIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGludCBtYWluQ29udHJvbGxlckhlaWdodCA9IGdldE1haW5Db250cm9sbGVySGVpZ2h0KGNhblNob3dQbGF5YmFja0NvbnRyb2xMYXlvdXQoKSk7CisgICAgICAgIGludCB2b2x1bWVHcm91cExpc3RDb3VudCA9IG1Hcm91cE1lbWJlclJvdXRlcy5zaXplKCk7CisgICAgICAgIC8vIFNjYWxlIGRvd24gdm9sdW1lIGdyb3VwIGxpc3QgaXRlbXMgaW4gbGFuZHNjYXBlIG1vZGUuCisgICAgICAgIGludCBleHBhbmRlZEdyb3VwTGlzdEhlaWdodCA9IGdldEdyb3VwKCkgPT0gbnVsbCA/IDAgOgorICAgICAgICAgICAgICAgIG1Wb2x1bWVHcm91cExpc3RJdGVtSGVpZ2h0ICogZ2V0R3JvdXAoKS5nZXRSb3V0ZXMoKS5zaXplKCk7CisgICAgICAgIGlmICh2b2x1bWVHcm91cExpc3RDb3VudCA+IDApIHsKKyAgICAgICAgICAgIGV4cGFuZGVkR3JvdXBMaXN0SGVpZ2h0ICs9IG1Wb2x1bWVHcm91cExpc3RQYWRkaW5nVG9wOworICAgICAgICB9CisgICAgICAgIGV4cGFuZGVkR3JvdXBMaXN0SGVpZ2h0ID0gTWF0aC5taW4oZXhwYW5kZWRHcm91cExpc3RIZWlnaHQsIG1Wb2x1bWVHcm91cExpc3RNYXhIZWlnaHQpOworICAgICAgICBpbnQgdmlzaWJsZUdyb3VwTGlzdEhlaWdodCA9IG1Jc0dyb3VwRXhwYW5kZWQgPyBleHBhbmRlZEdyb3VwTGlzdEhlaWdodCA6IDA7CisKKyAgICAgICAgaW50IGRlc2lyZWRDb250cm9sTGF5b3V0SGVpZ2h0ID0KKyAgICAgICAgICAgICAgICBNYXRoLm1heChhcnRWaWV3SGVpZ2h0LCB2aXNpYmxlR3JvdXBMaXN0SGVpZ2h0KSArIG1haW5Db250cm9sbGVySGVpZ2h0OworICAgICAgICBSZWN0IHZpc2libGVSZWN0ID0gbmV3IFJlY3QoKTsKKyAgICAgICAgZGVjb3JWaWV3LmdldFdpbmRvd1Zpc2libGVEaXNwbGF5RnJhbWUodmlzaWJsZVJlY3QpOworICAgICAgICAvLyBIZWlnaHQgb2Ygbm9uLWNvbnRyb2wgdmlld3MgaW4gZGVjb3Igdmlldy4KKyAgICAgICAgLy8gVGhpcyBpbmNsdWRlcyB0aXRsZSBiYXIsIGJ1dHRvbiBiYXIsIGFuZCBkaWFsb2cncyB2ZXJ0aWNhbCBwYWRkaW5nIHdoaWNoIHNob3VsZCBiZQorICAgICAgICAvLyBhbHdheXMgc2hvd24uCisgICAgICAgIGludCBub25Db250cm9sVmlld0hlaWdodCA9IG1EaWFsb2dBcmVhTGF5b3V0LmdldE1lYXN1cmVkSGVpZ2h0KCkKKyAgICAgICAgICAgICAgICAtIG1EZWZhdWx0Q29udHJvbExheW91dC5nZXRNZWFzdXJlZEhlaWdodCgpOworICAgICAgICAvLyBNYXhpbXVtIGFsbG93ZWQgaGVpZ2h0IGZvciBjb250cm9scyB0byBmaXQgc2NyZWVuLgorICAgICAgICBpbnQgbWF4aW11bUNvbnRyb2xWaWV3SGVpZ2h0ID0gdmlzaWJsZVJlY3QuaGVpZ2h0KCkgLSBub25Db250cm9sVmlld0hlaWdodDsKKworICAgICAgICAvLyBTaG93IGFydHdvcmsgaWYgaXQgZml0cyB0aGUgc2NyZWVuLgorICAgICAgICBpZiAobUN1c3RvbUNvbnRyb2xWaWV3ID09IG51bGwgJiYgYXJ0Vmlld0hlaWdodCA+IDAKKyAgICAgICAgICAgICAgICAmJiBkZXNpcmVkQ29udHJvbExheW91dEhlaWdodCA8PSBtYXhpbXVtQ29udHJvbFZpZXdIZWlnaHQpIHsKKyAgICAgICAgICAgIG1BcnRWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIHNldExheW91dEhlaWdodChtQXJ0VmlldywgYXJ0Vmlld0hlaWdodCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoZ2V0TGF5b3V0SGVpZ2h0KG1Wb2x1bWVHcm91cExpc3QpICsgbU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQuZ2V0TWVhc3VyZWRIZWlnaHQoKQorICAgICAgICAgICAgICAgICAgICA+PSBtRGVmYXVsdENvbnRyb2xMYXlvdXQuZ2V0TWVhc3VyZWRIZWlnaHQoKSkgeworICAgICAgICAgICAgICAgIG1BcnRWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFydFZpZXdIZWlnaHQgPSAwOworICAgICAgICAgICAgZGVzaXJlZENvbnRyb2xMYXlvdXRIZWlnaHQgPSB2aXNpYmxlR3JvdXBMaXN0SGVpZ2h0ICsgbWFpbkNvbnRyb2xsZXJIZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgLy8gU2hvdyB0aGUgcGxheWJhY2sgY29udHJvbCBpZiBpdCBmaXRzIHRoZSBzY3JlZW4uCisgICAgICAgIGlmIChjYW5TaG93UGxheWJhY2tDb250cm9sTGF5b3V0KCkKKyAgICAgICAgICAgICAgICAmJiBkZXNpcmVkQ29udHJvbExheW91dEhlaWdodCA8PSBtYXhpbXVtQ29udHJvbFZpZXdIZWlnaHQpIHsKKyAgICAgICAgICAgIG1QbGF5YmFja0NvbnRyb2xMYXlvdXQuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVBsYXliYWNrQ29udHJvbExheW91dC5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgIH0KKyAgICAgICAgdXBkYXRlTWVkaWFDb250cm9sVmlzaWJpbGl0eShtUGxheWJhY2tDb250cm9sTGF5b3V0LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUpOworICAgICAgICBtYWluQ29udHJvbGxlckhlaWdodCA9IGdldE1haW5Db250cm9sbGVySGVpZ2h0KAorICAgICAgICAgICAgICAgIG1QbGF5YmFja0NvbnRyb2xMYXlvdXQuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRSk7CisgICAgICAgIGRlc2lyZWRDb250cm9sTGF5b3V0SGVpZ2h0ID0KKyAgICAgICAgICAgICAgICBNYXRoLm1heChhcnRWaWV3SGVpZ2h0LCB2aXNpYmxlR3JvdXBMaXN0SGVpZ2h0KSArIG1haW5Db250cm9sbGVySGVpZ2h0OworCisgICAgICAgIC8vIExpbWl0IHRoZSB2b2x1bWUgZ3JvdXAgbGlzdCBoZWlnaHQgdG8gZml0IHRoZSBzY3JlZW4uCisgICAgICAgIGlmIChkZXNpcmVkQ29udHJvbExheW91dEhlaWdodCA+IG1heGltdW1Db250cm9sVmlld0hlaWdodCkgeworICAgICAgICAgICAgdmlzaWJsZUdyb3VwTGlzdEhlaWdodCAtPSAoZGVzaXJlZENvbnRyb2xMYXlvdXRIZWlnaHQgLSBtYXhpbXVtQ29udHJvbFZpZXdIZWlnaHQpOworICAgICAgICAgICAgZGVzaXJlZENvbnRyb2xMYXlvdXRIZWlnaHQgPSBtYXhpbXVtQ29udHJvbFZpZXdIZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgLy8gVXBkYXRlIHRoZSBsYXlvdXRzIHdpdGggdGhlIGNvbXB1dGVkIGhlaWdodHMuCisgICAgICAgIG1NZWRpYU1haW5Db250cm9sTGF5b3V0LmNsZWFyQW5pbWF0aW9uKCk7CisgICAgICAgIG1Wb2x1bWVHcm91cExpc3QuY2xlYXJBbmltYXRpb24oKTsKKyAgICAgICAgbURlZmF1bHRDb250cm9sTGF5b3V0LmNsZWFyQW5pbWF0aW9uKCk7CisgICAgICAgIGlmIChhbmltYXRlKSB7CisgICAgICAgICAgICBhbmltYXRlTGF5b3V0SGVpZ2h0KG1NZWRpYU1haW5Db250cm9sTGF5b3V0LCBtYWluQ29udHJvbGxlckhlaWdodCk7CisgICAgICAgICAgICBhbmltYXRlTGF5b3V0SGVpZ2h0KG1Wb2x1bWVHcm91cExpc3QsIHZpc2libGVHcm91cExpc3RIZWlnaHQpOworICAgICAgICAgICAgYW5pbWF0ZUxheW91dEhlaWdodChtRGVmYXVsdENvbnRyb2xMYXlvdXQsIGRlc2lyZWRDb250cm9sTGF5b3V0SGVpZ2h0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNldExheW91dEhlaWdodChtTWVkaWFNYWluQ29udHJvbExheW91dCwgbWFpbkNvbnRyb2xsZXJIZWlnaHQpOworICAgICAgICAgICAgc2V0TGF5b3V0SGVpZ2h0KG1Wb2x1bWVHcm91cExpc3QsIHZpc2libGVHcm91cExpc3RIZWlnaHQpOworICAgICAgICAgICAgc2V0TGF5b3V0SGVpZ2h0KG1EZWZhdWx0Q29udHJvbExheW91dCwgZGVzaXJlZENvbnRyb2xMYXlvdXRIZWlnaHQpOworICAgICAgICB9CisgICAgICAgIC8vIE1heGltaXplIHRoZSB3aW5kb3cgc2l6ZSB3aXRoIGEgdHJhbnNwYXJlbnQgbGF5b3V0IGluIGFkdmFuY2UgZm9yIHNtb290aCBhbmltYXRpb24uCisgICAgICAgIHNldExheW91dEhlaWdodChtRXhwYW5kYWJsZUFyZWFMYXlvdXQsIHZpc2libGVSZWN0LmhlaWdodCgpKTsKKyAgICAgICAgcmVidWlsZFZvbHVtZUdyb3VwTGlzdChhbmltYXRlKTsKKyAgICB9CisKKyAgICB2b2lkIHVwZGF0ZVZvbHVtZUdyb3VwSXRlbUhlaWdodChWaWV3IGl0ZW0pIHsKKyAgICAgICAgTGluZWFyTGF5b3V0IGNvbnRhaW5lciA9IChMaW5lYXJMYXlvdXQpIGl0ZW0uZmluZFZpZXdCeUlkKFIuaWQudm9sdW1lX2l0ZW1fY29udGFpbmVyKTsKKyAgICAgICAgc2V0TGF5b3V0SGVpZ2h0KGNvbnRhaW5lciwgbVZvbHVtZUdyb3VwTGlzdEl0ZW1IZWlnaHQpOworICAgICAgICBWaWV3IGljb24gPSBpdGVtLmZpbmRWaWV3QnlJZChSLmlkLm1yX3ZvbHVtZV9pdGVtX2ljb24pOworICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIGxwID0gaWNvbi5nZXRMYXlvdXRQYXJhbXMoKTsKKyAgICAgICAgbHAud2lkdGggPSBtVm9sdW1lR3JvdXBMaXN0SXRlbUljb25TaXplOworICAgICAgICBscC5oZWlnaHQgPSBtVm9sdW1lR3JvdXBMaXN0SXRlbUljb25TaXplOworICAgICAgICBpY29uLnNldExheW91dFBhcmFtcyhscCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFuaW1hdGVMYXlvdXRIZWlnaHQoZmluYWwgVmlldyB2aWV3LCBpbnQgdGFyZ2V0SGVpZ2h0KSB7CisgICAgICAgIGZpbmFsIGludCBzdGFydFZhbHVlID0gZ2V0TGF5b3V0SGVpZ2h0KHZpZXcpOworICAgICAgICBmaW5hbCBpbnQgZW5kVmFsdWUgPSB0YXJnZXRIZWlnaHQ7CisgICAgICAgIEFuaW1hdGlvbiBhbmltID0gbmV3IEFuaW1hdGlvbigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgYXBwbHlUcmFuc2Zvcm1hdGlvbihmbG9hdCBpbnRlcnBvbGF0ZWRUaW1lLCBUcmFuc2Zvcm1hdGlvbiB0KSB7CisgICAgICAgICAgICAgICAgaW50IGhlaWdodCA9IHN0YXJ0VmFsdWUgLSAoaW50KSAoKHN0YXJ0VmFsdWUgLSBlbmRWYWx1ZSkgKiBpbnRlcnBvbGF0ZWRUaW1lKTsKKyAgICAgICAgICAgICAgICBzZXRMYXlvdXRIZWlnaHQodmlldywgaGVpZ2h0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgYW5pbS5zZXREdXJhdGlvbihtR3JvdXBMaXN0QW5pbWF0aW9uRHVyYXRpb25Ncyk7CisgICAgICAgIGlmIChhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+PSAyMSkgeworICAgICAgICAgICAgYW5pbS5zZXRJbnRlcnBvbGF0b3IobUludGVycG9sYXRvcik7CisgICAgICAgIH0KKyAgICAgICAgdmlldy5zdGFydEFuaW1hdGlvbihhbmltKTsKKyAgICB9CisKKyAgICB2b2lkIGxvYWRJbnRlcnBvbGF0b3IoKSB7CisgICAgICAgIG1JbnRlcnBvbGF0b3IgPQorICAgICAgICAgICAgICAgIG1Jc0dyb3VwRXhwYW5kZWQgPyBtTGluZWFyT3V0U2xvd0luSW50ZXJwb2xhdG9yIDogbUZhc3RPdXRTbG93SW5JbnRlcnBvbGF0b3I7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVZvbHVtZUNvbnRyb2xMYXlvdXQoKSB7CisgICAgICAgIGlmIChpc1ZvbHVtZUNvbnRyb2xBdmFpbGFibGUobVJvdXRlKSkgeworICAgICAgICAgICAgaWYgKG1Wb2x1bWVDb250cm9sTGF5b3V0LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LkdPTkUpIHsKKyAgICAgICAgICAgICAgICBtVm9sdW1lQ29udHJvbExheW91dC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgbVZvbHVtZVNsaWRlci5zZXRNYXgobVJvdXRlLmdldFZvbHVtZU1heCgpKTsKKyAgICAgICAgICAgICAgICBtVm9sdW1lU2xpZGVyLnNldFByb2dyZXNzKG1Sb3V0ZS5nZXRWb2x1bWUoKSk7CisgICAgICAgICAgICAgICAgbUdyb3VwRXhwYW5kQ29sbGFwc2VCdXR0b24uc2V0VmlzaWJpbGl0eShnZXRHcm91cCgpID09IG51bGwgPyBWaWV3LkdPTkUKKyAgICAgICAgICAgICAgICAgICAgICAgIDogVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Wb2x1bWVDb250cm9sTGF5b3V0LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWJ1aWxkVm9sdW1lR3JvdXBMaXN0KGJvb2xlYW4gYW5pbWF0ZSkgeworICAgICAgICBMaXN0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gcm91dGVzID0gZ2V0R3JvdXAoKSA9PSBudWxsID8gbnVsbCA6IGdldEdyb3VwKCkuZ2V0Um91dGVzKCk7CisgICAgICAgIGlmIChyb3V0ZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzLmNsZWFyKCk7CisgICAgICAgICAgICBtVm9sdW1lR3JvdXBBZGFwdGVyLm5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7CisgICAgICAgIH0gZWxzZSBpZiAoTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5saXN0VW5vcmRlcmVkRXF1YWxzKG1Hcm91cE1lbWJlclJvdXRlcywgcm91dGVzKSkgeworICAgICAgICAgICAgbVZvbHVtZUdyb3VwQWRhcHRlci5ub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgSGFzaE1hcDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8sIFJlY3Q+IHByZXZpb3VzUm91dGVCb3VuZE1hcCA9IGFuaW1hdGUKKyAgICAgICAgICAgICAgICAgICAgPyBNZWRpYVJvdXRlRGlhbG9nSGVscGVyLmdldEl0ZW1Cb3VuZE1hcChtVm9sdW1lR3JvdXBMaXN0LCBtVm9sdW1lR3JvdXBBZGFwdGVyKQorICAgICAgICAgICAgICAgICAgICA6IG51bGw7CisgICAgICAgICAgICBIYXNoTWFwPE1lZGlhUm91dGVyLlJvdXRlSW5mbywgQml0bWFwRHJhd2FibGU+IHByZXZpb3VzUm91dGVCaXRtYXBNYXAgPSBhbmltYXRlCisgICAgICAgICAgICAgICAgICAgID8gTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5nZXRJdGVtQml0bWFwTWFwKG1Db250ZXh0LCBtVm9sdW1lR3JvdXBMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVHcm91cEFkYXB0ZXIpIDogbnVsbDsKKyAgICAgICAgICAgIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkID0KKyAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5nZXRJdGVtc0FkZGVkKG1Hcm91cE1lbWJlclJvdXRlcywgcm91dGVzKTsKKyAgICAgICAgICAgIG1Hcm91cE1lbWJlclJvdXRlc1JlbW92ZWQgPSBNZWRpYVJvdXRlRGlhbG9nSGVscGVyLmdldEl0ZW1zUmVtb3ZlZChtR3JvdXBNZW1iZXJSb3V0ZXMsCisgICAgICAgICAgICAgICAgICAgIHJvdXRlcyk7CisgICAgICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXMuYWRkQWxsKDAsIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkKTsKKyAgICAgICAgICAgIG1Hcm91cE1lbWJlclJvdXRlcy5yZW1vdmVBbGwobUdyb3VwTWVtYmVyUm91dGVzUmVtb3ZlZCk7CisgICAgICAgICAgICBtVm9sdW1lR3JvdXBBZGFwdGVyLm5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7CisgICAgICAgICAgICBpZiAoYW5pbWF0ZSAmJiBtSXNHcm91cEV4cGFuZGVkCisgICAgICAgICAgICAgICAgICAgICYmIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkLnNpemUoKSArIG1Hcm91cE1lbWJlclJvdXRlc1JlbW92ZWQuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIGFuaW1hdGVHcm91cExpc3RJdGVtcyhwcmV2aW91c1JvdXRlQm91bmRNYXAsIHByZXZpb3VzUm91dGVCaXRtYXBNYXApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZCA9IG51bGw7CisgICAgICAgICAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzUmVtb3ZlZCA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYW5pbWF0ZUdyb3VwTGlzdEl0ZW1zKGZpbmFsIE1hcDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8sIFJlY3Q+IHByZXZpb3VzUm91dGVCb3VuZE1hcCwKKyAgICAgICAgICAgIGZpbmFsIE1hcDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8sIEJpdG1hcERyYXdhYmxlPiBwcmV2aW91c1JvdXRlQml0bWFwTWFwKSB7CisgICAgICAgIG1Wb2x1bWVHcm91cExpc3Quc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgIG1Wb2x1bWVHcm91cExpc3QucmVxdWVzdExheW91dCgpOworICAgICAgICBtSXNHcm91cExpc3RBbmltYXRpbmcgPSB0cnVlOworICAgICAgICBWaWV3VHJlZU9ic2VydmVyIG9ic2VydmVyID0gbVZvbHVtZUdyb3VwTGlzdC5nZXRWaWV3VHJlZU9ic2VydmVyKCk7CisgICAgICAgIG9ic2VydmVyLmFkZE9uR2xvYmFsTGF5b3V0TGlzdGVuZXIobmV3IFZpZXdUcmVlT2JzZXJ2ZXIuT25HbG9iYWxMYXlvdXRMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25HbG9iYWxMYXlvdXQoKSB7CisgICAgICAgICAgICAgICAgbVZvbHVtZUdyb3VwTGlzdC5nZXRWaWV3VHJlZU9ic2VydmVyKCkucmVtb3ZlR2xvYmFsT25MYXlvdXRMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgICAgICBhbmltYXRlR3JvdXBMaXN0SXRlbXNJbnRlcm5hbChwcmV2aW91c1JvdXRlQm91bmRNYXAsIHByZXZpb3VzUm91dGVCaXRtYXBNYXApOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICB2b2lkIGFuaW1hdGVHcm91cExpc3RJdGVtc0ludGVybmFsKAorICAgICAgICAgICAgTWFwPE1lZGlhUm91dGVyLlJvdXRlSW5mbywgUmVjdD4gcHJldmlvdXNSb3V0ZUJvdW5kTWFwLAorICAgICAgICAgICAgTWFwPE1lZGlhUm91dGVyLlJvdXRlSW5mbywgQml0bWFwRHJhd2FibGU+IHByZXZpb3VzUm91dGVCaXRtYXBNYXApIHsKKyAgICAgICAgaWYgKG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkID09IG51bGwgfHwgbUdyb3VwTWVtYmVyUm91dGVzUmVtb3ZlZCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaW50IGdyb3VwU2l6ZURlbHRhID0gbUdyb3VwTWVtYmVyUm91dGVzQWRkZWQuc2l6ZSgpIC0gbUdyb3VwTWVtYmVyUm91dGVzUmVtb3ZlZC5zaXplKCk7CisgICAgICAgIGJvb2xlYW4gbGlzdGVuZXJSZWdpc3RlcmVkID0gZmFsc2U7CisgICAgICAgIEFuaW1hdGlvbi5BbmltYXRpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBBbmltYXRpb24uQW5pbWF0aW9uTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uU3RhcnQoQW5pbWF0aW9uIGFuaW1hdGlvbikgeworICAgICAgICAgICAgICAgIG1Wb2x1bWVHcm91cExpc3Quc3RhcnRBbmltYXRpb25BbGwoKTsKKyAgICAgICAgICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LnBvc3REZWxheWVkKG1Hcm91cExpc3RGYWRlSW5BbmltYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBtR3JvdXBMaXN0QW5pbWF0aW9uRHVyYXRpb25Ncyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoQW5pbWF0aW9uIGFuaW1hdGlvbikgeyB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25SZXBlYXQoQW5pbWF0aW9uIGFuaW1hdGlvbikgeyB9CisgICAgICAgIH07CisKKyAgICAgICAgLy8gQW5pbWF0ZSB2aXNpYmxlIGl0ZW1zIGZyb20gcHJldmlvdXMgcG9zaXRpb25zIHRvIGN1cnJlbnQgcG9zaXRpb25zIGV4Y2VwdCByb3V0ZXMgYWRkZWQKKyAgICAgICAgLy8ganVzdCBiZWZvcmUuIEFkZGVkIHJvdXRlcyB3aWxsIHJlbWFpbiBoaWRkZW4gdW50aWwgdHJhbnNsYXRlIGFuaW1hdGlvbiBmaW5pc2hlcy4KKyAgICAgICAgaW50IGZpcnN0ID0gbVZvbHVtZUdyb3VwTGlzdC5nZXRGaXJzdFZpc2libGVQb3NpdGlvbigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Wb2x1bWVHcm91cExpc3QuZ2V0Q2hpbGRDb3VudCgpOyArK2kpIHsKKyAgICAgICAgICAgIFZpZXcgdmlldyA9IG1Wb2x1bWVHcm91cExpc3QuZ2V0Q2hpbGRBdChpKTsKKyAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IGZpcnN0ICsgaTsKKyAgICAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IG1Wb2x1bWVHcm91cEFkYXB0ZXIuZ2V0SXRlbShwb3NpdGlvbik7CisgICAgICAgICAgICBSZWN0IHByZXZpb3VzQm91bmRzID0gcHJldmlvdXNSb3V0ZUJvdW5kTWFwLmdldChyb3V0ZSk7CisgICAgICAgICAgICBpbnQgY3VycmVudFRvcCA9IHZpZXcuZ2V0VG9wKCk7CisgICAgICAgICAgICBpbnQgcHJldmlvdXNUb3AgPSBwcmV2aW91c0JvdW5kcyAhPSBudWxsID8gcHJldmlvdXNCb3VuZHMudG9wCisgICAgICAgICAgICAgICAgICAgIDogKGN1cnJlbnRUb3AgKyBtVm9sdW1lR3JvdXBMaXN0SXRlbUhlaWdodCAqIGdyb3VwU2l6ZURlbHRhKTsKKyAgICAgICAgICAgIEFuaW1hdGlvblNldCBhbmltU2V0ID0gbmV3IEFuaW1hdGlvblNldCh0cnVlKTsKKyAgICAgICAgICAgIGlmIChtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZCAhPSBudWxsICYmIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkLmNvbnRhaW5zKHJvdXRlKSkgeworICAgICAgICAgICAgICAgIHByZXZpb3VzVG9wID0gY3VycmVudFRvcDsKKyAgICAgICAgICAgICAgICBBbmltYXRpb24gYWxwaGFBbmltID0gbmV3IEFscGhhQW5pbWF0aW9uKDAuMGYsIDAuMGYpOworICAgICAgICAgICAgICAgIGFscGhhQW5pbS5zZXREdXJhdGlvbihtR3JvdXBMaXN0RmFkZUluRHVyYXRpb25Ncyk7CisgICAgICAgICAgICAgICAgYW5pbVNldC5hZGRBbmltYXRpb24oYWxwaGFBbmltKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFuaW1hdGlvbiB0cmFuc2xhdGlvbkFuaW0gPSBuZXcgVHJhbnNsYXRlQW5pbWF0aW9uKDAsIDAsIHByZXZpb3VzVG9wIC0gY3VycmVudFRvcCwgMCk7CisgICAgICAgICAgICB0cmFuc2xhdGlvbkFuaW0uc2V0RHVyYXRpb24obUdyb3VwTGlzdEFuaW1hdGlvbkR1cmF0aW9uTXMpOworICAgICAgICAgICAgYW5pbVNldC5hZGRBbmltYXRpb24odHJhbnNsYXRpb25BbmltKTsKKyAgICAgICAgICAgIGFuaW1TZXQuc2V0RmlsbEFmdGVyKHRydWUpOworICAgICAgICAgICAgYW5pbVNldC5zZXRGaWxsRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgIGFuaW1TZXQuc2V0SW50ZXJwb2xhdG9yKG1JbnRlcnBvbGF0b3IpOworICAgICAgICAgICAgaWYgKCFsaXN0ZW5lclJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lclJlZ2lzdGVyZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGFuaW1TZXQuc2V0QW5pbWF0aW9uTGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlldy5jbGVhckFuaW1hdGlvbigpOworICAgICAgICAgICAgdmlldy5zdGFydEFuaW1hdGlvbihhbmltU2V0KTsKKyAgICAgICAgICAgIHByZXZpb3VzUm91dGVCb3VuZE1hcC5yZW1vdmUocm91dGUpOworICAgICAgICAgICAgcHJldmlvdXNSb3V0ZUJpdG1hcE1hcC5yZW1vdmUocm91dGUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgYSBtZW1iZXIgcm91dGUgZG9lc24ndCBleGlzdCBhbnkgbG9uZ2VyLCBpdCBjYW4gYmUgZWl0aGVyIHJlbW92ZWQgb3IgbW92ZWQgb3V0IG9mIHRoZQorICAgICAgICAvLyBMaXN0VmlldyBsYXlvdXQgYm91bmRhcnkuIEluIHRoaXMgY2FzZSwgdXNlIHRoZSBwcmV2aW91c2x5IGNhcHR1cmVkIGJpdG1hcHMgZm9yCisgICAgICAgIC8vIGFuaW1hdGlvbi4KKyAgICAgICAgZm9yIChNYXAuRW50cnk8TWVkaWFSb3V0ZXIuUm91dGVJbmZvLCBCaXRtYXBEcmF3YWJsZT4gaXRlbQorICAgICAgICAgICAgICAgIDogcHJldmlvdXNSb3V0ZUJpdG1hcE1hcC5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBmaW5hbCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBpdGVtLmdldEtleSgpOworICAgICAgICAgICAgZmluYWwgQml0bWFwRHJhd2FibGUgYml0bWFwID0gaXRlbS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgZmluYWwgUmVjdCBib3VuZHMgPSBwcmV2aW91c1JvdXRlQm91bmRNYXAuZ2V0KHJvdXRlKTsKKyAgICAgICAgICAgIE92ZXJsYXlPYmplY3Qgb2JqZWN0ID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChtR3JvdXBNZW1iZXJSb3V0ZXNSZW1vdmVkLmNvbnRhaW5zKHJvdXRlKSkgeworICAgICAgICAgICAgICAgIG9iamVjdCA9IG5ldyBPdmVybGF5T2JqZWN0KGJpdG1hcCwgYm91bmRzKS5zZXRBbHBoYUFuaW1hdGlvbigxLjBmLCAwLjBmKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldER1cmF0aW9uKG1Hcm91cExpc3RGYWRlT3V0RHVyYXRpb25NcykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbnRlcnBvbGF0b3IobUludGVycG9sYXRvcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCBkZWx0YVkgPSBncm91cFNpemVEZWx0YSAqIG1Wb2x1bWVHcm91cExpc3RJdGVtSGVpZ2h0OworICAgICAgICAgICAgICAgIG9iamVjdCA9IG5ldyBPdmVybGF5T2JqZWN0KGJpdG1hcCwgYm91bmRzKS5zZXRUcmFuc2xhdGVZQW5pbWF0aW9uKGRlbHRhWSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXREdXJhdGlvbihtR3JvdXBMaXN0QW5pbWF0aW9uRHVyYXRpb25NcykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbnRlcnBvbGF0b3IobUludGVycG9sYXRvcikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBbmltYXRpb25FbmRMaXN0ZW5lcihuZXcgT3ZlcmxheU9iamVjdC5PbkFuaW1hdGlvbkVuZExpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXNBbmltYXRpbmdXaXRoQml0bWFwLnJlbW92ZShyb3V0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVHcm91cEFkYXB0ZXIubm90aWZ5RGF0YVNldENoYW5nZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXNBbmltYXRpbmdXaXRoQml0bWFwLmFkZChyb3V0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LmFkZE92ZXJsYXlPYmplY3Qob2JqZWN0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgc3RhcnRHcm91cExpc3RGYWRlSW5BbmltYXRpb24oKSB7CisgICAgICAgIGNsZWFyR3JvdXBMaXN0QW5pbWF0aW9uKHRydWUpOworICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LnJlcXVlc3RMYXlvdXQoKTsKKyAgICAgICAgVmlld1RyZWVPYnNlcnZlciBvYnNlcnZlciA9IG1Wb2x1bWVHcm91cExpc3QuZ2V0Vmlld1RyZWVPYnNlcnZlcigpOworICAgICAgICBvYnNlcnZlci5hZGRPbkdsb2JhbExheW91dExpc3RlbmVyKG5ldyBWaWV3VHJlZU9ic2VydmVyLk9uR2xvYmFsTGF5b3V0TGlzdGVuZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uR2xvYmFsTGF5b3V0KCkgeworICAgICAgICAgICAgICAgIG1Wb2x1bWVHcm91cExpc3QuZ2V0Vmlld1RyZWVPYnNlcnZlcigpLnJlbW92ZUdsb2JhbE9uTGF5b3V0TGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICAgICAgc3RhcnRHcm91cExpc3RGYWRlSW5BbmltYXRpb25JbnRlcm5hbCgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICB2b2lkIHN0YXJ0R3JvdXBMaXN0RmFkZUluQW5pbWF0aW9uSW50ZXJuYWwoKSB7CisgICAgICAgIGlmIChtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZCAhPSBudWxsICYmIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkLnNpemUoKSAhPSAwKSB7CisgICAgICAgICAgICBmYWRlSW5BZGRlZFJvdXRlcygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmluaXNoQW5pbWF0aW9uKHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBmaW5pc2hBbmltYXRpb24oYm9vbGVhbiBhbmltYXRlKSB7CisgICAgICAgIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkID0gbnVsbDsKKyAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzUmVtb3ZlZCA9IG51bGw7CisgICAgICAgIG1Jc0dyb3VwTGlzdEFuaW1hdGluZyA9IGZhbHNlOworICAgICAgICBpZiAobUlzR3JvdXBMaXN0QW5pbWF0aW9uUGVuZGluZykgeworICAgICAgICAgICAgbUlzR3JvdXBMaXN0QW5pbWF0aW9uUGVuZGluZyA9IGZhbHNlOworICAgICAgICAgICAgdXBkYXRlTGF5b3V0SGVpZ2h0KGFuaW1hdGUpOworICAgICAgICB9CisgICAgICAgIG1Wb2x1bWVHcm91cExpc3Quc2V0RW5hYmxlZCh0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZmFkZUluQWRkZWRSb3V0ZXMoKSB7CisgICAgICAgIEFuaW1hdGlvbi5BbmltYXRpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBBbmltYXRpb24uQW5pbWF0aW9uTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uU3RhcnQoQW5pbWF0aW9uIGFuaW1hdGlvbikgeyB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoQW5pbWF0aW9uIGFuaW1hdGlvbikgeworICAgICAgICAgICAgICAgIGZpbmlzaEFuaW1hdGlvbih0cnVlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblJlcGVhdChBbmltYXRpb24gYW5pbWF0aW9uKSB7IH0KKyAgICAgICAgfTsKKyAgICAgICAgYm9vbGVhbiBsaXN0ZW5lclJlZ2lzdGVyZWQgPSBmYWxzZTsKKyAgICAgICAgaW50IGZpcnN0ID0gbVZvbHVtZUdyb3VwTGlzdC5nZXRGaXJzdFZpc2libGVQb3NpdGlvbigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Wb2x1bWVHcm91cExpc3QuZ2V0Q2hpbGRDb3VudCgpOyArK2kpIHsKKyAgICAgICAgICAgIFZpZXcgdmlldyA9IG1Wb2x1bWVHcm91cExpc3QuZ2V0Q2hpbGRBdChpKTsKKyAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IGZpcnN0ICsgaTsKKyAgICAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IG1Wb2x1bWVHcm91cEFkYXB0ZXIuZ2V0SXRlbShwb3NpdGlvbik7CisgICAgICAgICAgICBpZiAobUdyb3VwTWVtYmVyUm91dGVzQWRkZWQuY29udGFpbnMocm91dGUpKSB7CisgICAgICAgICAgICAgICAgQW5pbWF0aW9uIGFscGhhQW5pbSA9IG5ldyBBbHBoYUFuaW1hdGlvbigwLjBmLCAxLjBmKTsKKyAgICAgICAgICAgICAgICBhbHBoYUFuaW0uc2V0RHVyYXRpb24obUdyb3VwTGlzdEZhZGVJbkR1cmF0aW9uTXMpOworICAgICAgICAgICAgICAgIGFscGhhQW5pbS5zZXRGaWxsRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICBhbHBoYUFuaW0uc2V0RmlsbEFmdGVyKHRydWUpOworICAgICAgICAgICAgICAgIGlmICghbGlzdGVuZXJSZWdpc3RlcmVkKSB7CisgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyUmVnaXN0ZXJlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGFscGhhQW5pbS5zZXRBbmltYXRpb25MaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZpZXcuY2xlYXJBbmltYXRpb24oKTsKKyAgICAgICAgICAgICAgICB2aWV3LnN0YXJ0QW5pbWF0aW9uKGFscGhhQW5pbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGNsZWFyR3JvdXBMaXN0QW5pbWF0aW9uKGJvb2xlYW4gZXhjZXB0QWRkZWRSb3V0ZXMpIHsKKyAgICAgICAgaW50IGZpcnN0ID0gbVZvbHVtZUdyb3VwTGlzdC5nZXRGaXJzdFZpc2libGVQb3NpdGlvbigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Wb2x1bWVHcm91cExpc3QuZ2V0Q2hpbGRDb3VudCgpOyArK2kpIHsKKyAgICAgICAgICAgIFZpZXcgdmlldyA9IG1Wb2x1bWVHcm91cExpc3QuZ2V0Q2hpbGRBdChpKTsKKyAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IGZpcnN0ICsgaTsKKyAgICAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IG1Wb2x1bWVHcm91cEFkYXB0ZXIuZ2V0SXRlbShwb3NpdGlvbik7CisgICAgICAgICAgICBpZiAoZXhjZXB0QWRkZWRSb3V0ZXMgJiYgbUdyb3VwTWVtYmVyUm91dGVzQWRkZWQgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAmJiBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZC5jb250YWlucyhyb3V0ZSkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExpbmVhckxheW91dCBjb250YWluZXIgPSAoTGluZWFyTGF5b3V0KSB2aWV3LmZpbmRWaWV3QnlJZChSLmlkLnZvbHVtZV9pdGVtX2NvbnRhaW5lcik7CisgICAgICAgICAgICBjb250YWluZXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgQW5pbWF0aW9uU2V0IGFuaW1TZXQgPSBuZXcgQW5pbWF0aW9uU2V0KHRydWUpOworICAgICAgICAgICAgQW5pbWF0aW9uIGFscGhhQW5pbSA9IG5ldyBBbHBoYUFuaW1hdGlvbigxLjBmLCAxLjBmKTsKKyAgICAgICAgICAgIGFscGhhQW5pbS5zZXREdXJhdGlvbigwKTsKKyAgICAgICAgICAgIGFuaW1TZXQuYWRkQW5pbWF0aW9uKGFscGhhQW5pbSk7CisgICAgICAgICAgICBBbmltYXRpb24gdHJhbnNsYXRpb25BbmltID0gbmV3IFRyYW5zbGF0ZUFuaW1hdGlvbigwLCAwLCAwLCAwKTsKKyAgICAgICAgICAgIHRyYW5zbGF0aW9uQW5pbS5zZXREdXJhdGlvbigwKTsKKyAgICAgICAgICAgIGFuaW1TZXQuc2V0RmlsbEFmdGVyKHRydWUpOworICAgICAgICAgICAgYW5pbVNldC5zZXRGaWxsRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgIHZpZXcuY2xlYXJBbmltYXRpb24oKTsKKyAgICAgICAgICAgIHZpZXcuc3RhcnRBbmltYXRpb24oYW5pbVNldCk7CisgICAgICAgIH0KKyAgICAgICAgbVZvbHVtZUdyb3VwTGlzdC5zdG9wQW5pbWF0aW9uQWxsKCk7CisgICAgICAgIGlmICghZXhjZXB0QWRkZWRSb3V0ZXMpIHsKKyAgICAgICAgICAgIGZpbmlzaEFuaW1hdGlvbihmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlUGxheWJhY2tDb250cm9sTGF5b3V0KCkgeworICAgICAgICBpZiAoY2FuU2hvd1BsYXliYWNrQ29udHJvbExheW91dCgpKSB7CisgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGl0bGUgPSBtRGVzY3JpcHRpb24gPT0gbnVsbCA/IG51bGwgOiBtRGVzY3JpcHRpb24uZ2V0VGl0bGUoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gaGFzVGl0bGUgPSAhVGV4dFV0aWxzLmlzRW1wdHkodGl0bGUpOworCisgICAgICAgICAgICBDaGFyU2VxdWVuY2Ugc3VidGl0bGUgPSBtRGVzY3JpcHRpb24gPT0gbnVsbCA/IG51bGwgOiBtRGVzY3JpcHRpb24uZ2V0U3VidGl0bGUoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gaGFzU3VidGl0bGUgPSAhVGV4dFV0aWxzLmlzRW1wdHkoc3VidGl0bGUpOworCisgICAgICAgICAgICBib29sZWFuIHNob3dUaXRsZSA9IGZhbHNlOworICAgICAgICAgICAgYm9vbGVhbiBzaG93U3VidGl0bGUgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChtUm91dGUuZ2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKCkKKyAgICAgICAgICAgICAgICAgICAgIT0gTWVkaWFSb3V0ZXIuUm91dGVJbmZvLlBSRVNFTlRBVElPTl9ESVNQTEFZX0lEX05PTkUpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgdXNlciBpcyBjdXJyZW50bHkgY2FzdGluZyBzY3JlZW4uCisgICAgICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUNvbnRleHQpLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4pKTsKKyAgICAgICAgICAgICAgICBzaG93VGl0bGUgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChtU3RhdGUgPT0gbnVsbCB8fCBtU3RhdGUuZ2V0U3RhdGUoKSA9PSBQbGF5YmFja1N0YXRlQ29tcGF0LlNUQVRFX05PTkUpIHsKKyAgICAgICAgICAgICAgICAvLyBTaG93ICJObyBtZWRpYSBzZWxlY3RlZCIgYXMgd2UgZG9uJ3QgeWV0IGtub3cgdGhlIHBsYXliYWNrIHN0YXRlLgorICAgICAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dChBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1Db250ZXh0KS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5tcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkKSk7CisgICAgICAgICAgICAgICAgc2hvd1RpdGxlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWhhc1RpdGxlICYmICFoYXNTdWJ0aXRsZSkgeworICAgICAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dChBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1Db250ZXh0KS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5tcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlKSk7CisgICAgICAgICAgICAgICAgc2hvd1RpdGxlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGhhc1RpdGxlKSB7CisgICAgICAgICAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dCh0aXRsZSk7CisgICAgICAgICAgICAgICAgICAgIHNob3dUaXRsZSA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChoYXNTdWJ0aXRsZSkgeworICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVWaWV3LnNldFRleHQoc3VidGl0bGUpOworICAgICAgICAgICAgICAgICAgICBzaG93U3VidGl0bGUgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VmlzaWJpbGl0eShzaG93VGl0bGUgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOworICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRWaXNpYmlsaXR5KHNob3dTdWJ0aXRsZSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7CisKKyAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNQbGF5aW5nID0gbVN0YXRlLmdldFN0YXRlKCkgPT0gUGxheWJhY2tTdGF0ZUNvbXBhdC5TVEFURV9CVUZGRVJJTkcKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1TdGF0ZS5nZXRTdGF0ZSgpID09IFBsYXliYWNrU3RhdGVDb21wYXQuU1RBVEVfUExBWUlORzsKKyAgICAgICAgICAgICAgICBDb250ZXh0IHBsYXliYWNrQ29udHJvbEJ1dHRvbkNvbnRleHQgPSBtUGxheWJhY2tDb250cm9sQnV0dG9uLmdldENvbnRleHQoKTsKKyAgICAgICAgICAgICAgICBib29sZWFuIHZpc2libGUgPSB0cnVlOworICAgICAgICAgICAgICAgIGludCBpY29uRHJhd2FibGVBdHRyID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgaWNvbkRlc2NSZXNJZCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKGlzUGxheWluZyAmJiBpc1BhdXNlQWN0aW9uU3VwcG9ydGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWNvbkRyYXdhYmxlQXR0ciA9IFIuYXR0ci5tZWRpYVJvdXRlUGF1c2VEcmF3YWJsZTsKKyAgICAgICAgICAgICAgICAgICAgaWNvbkRlc2NSZXNJZCA9IFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfcGF1c2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc1BsYXlpbmcgJiYgaXNTdG9wQWN0aW9uU3VwcG9ydGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWNvbkRyYXdhYmxlQXR0ciA9IFIuYXR0ci5tZWRpYVJvdXRlU3RvcERyYXdhYmxlOworICAgICAgICAgICAgICAgICAgICBpY29uRGVzY1Jlc0lkID0gUi5zdHJpbmcubXJfY29udHJvbGxlcl9zdG9wOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzUGxheWluZyAmJiBpc1BsYXlBY3Rpb25TdXBwb3J0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBpY29uRHJhd2FibGVBdHRyID0gUi5hdHRyLm1lZGlhUm91dGVQbGF5RHJhd2FibGU7CisgICAgICAgICAgICAgICAgICAgIGljb25EZXNjUmVzSWQgPSBSLnN0cmluZy5tcl9jb250cm9sbGVyX3BsYXk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdmlzaWJsZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtUGxheWJhY2tDb250cm9sQnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJsZSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7CisgICAgICAgICAgICAgICAgaWYgKHZpc2libGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbVBsYXliYWNrQ29udHJvbEJ1dHRvbi5zZXRJbWFnZVJlc291cmNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0VGhlbWVSZXNvdXJjZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXliYWNrQ29udHJvbEJ1dHRvbkNvbnRleHQsIGljb25EcmF3YWJsZUF0dHIpKTsKKyAgICAgICAgICAgICAgICAgICAgbVBsYXliYWNrQ29udHJvbEJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tDb250cm9sQnV0dG9uQ29udGV4dC5nZXRSZXNvdXJjZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFRleHQoaWNvbkRlc2NSZXNJZCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc1BsYXlBY3Rpb25TdXBwb3J0ZWQoKSB7CisgICAgICAgIHJldHVybiAobVN0YXRlLmdldEFjdGlvbnMoKSAmIChBQ1RJT05fUExBWSB8IEFDVElPTl9QTEFZX1BBVVNFKSkgIT0gMDsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNQYXVzZUFjdGlvblN1cHBvcnRlZCgpIHsKKyAgICAgICAgcmV0dXJuIChtU3RhdGUuZ2V0QWN0aW9ucygpICYgKEFDVElPTl9QQVVTRSB8IEFDVElPTl9QTEFZX1BBVVNFKSkgIT0gMDsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNTdG9wQWN0aW9uU3VwcG9ydGVkKCkgeworICAgICAgICByZXR1cm4gKG1TdGF0ZS5nZXRBY3Rpb25zKCkgJiBBQ1RJT05fU1RPUCkgIT0gMDsKKyAgICB9CisKKyAgICBib29sZWFuIGlzVm9sdW1lQ29udHJvbEF2YWlsYWJsZShNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKKyAgICAgICAgcmV0dXJuIG1Wb2x1bWVDb250cm9sRW5hYmxlZCAmJiByb3V0ZS5nZXRWb2x1bWVIYW5kbGluZygpCisgICAgICAgICAgICAgICAgPT0gTWVkaWFSb3V0ZXIuUm91dGVJbmZvLlBMQVlCQUNLX1ZPTFVNRV9WQVJJQUJMRTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0TGF5b3V0SGVpZ2h0KFZpZXcgdmlldykgeworICAgICAgICByZXR1cm4gdmlldy5nZXRMYXlvdXRQYXJhbXMoKS5oZWlnaHQ7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgc2V0TGF5b3V0SGVpZ2h0KFZpZXcgdmlldywgaW50IGhlaWdodCkgeworICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIGxwID0gdmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKKyAgICAgICAgbHAuaGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICB2aWV3LnNldExheW91dFBhcmFtcyhscCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB1cmlFcXVhbHMoVXJpIHVyaTEsIFVyaSB1cmkyKSB7CisgICAgICAgIGlmICh1cmkxICE9IG51bGwgJiYgdXJpMS5lcXVhbHModXJpMikpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKHVyaTEgPT0gbnVsbCAmJiB1cmkyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGRlc2lyZWQgYXJ0IGhlaWdodCB0byBmaXQgaW50byBjb250cm9sbGVyIGRpYWxvZy4KKyAgICAgKi8KKyAgICBpbnQgZ2V0RGVzaXJlZEFydEhlaWdodChpbnQgb3JpZ2luYWxXaWR0aCwgaW50IG9yaWdpbmFsSGVpZ2h0KSB7CisgICAgICAgIGlmIChvcmlnaW5hbFdpZHRoID49IG9yaWdpbmFsSGVpZ2h0KSB7CisgICAgICAgICAgICAvLyBGb3IgbGFuZHNjYXBlIGFydCwgZml0IHdpZHRoIHRvIGRpYWxvZyB3aWR0aC4KKyAgICAgICAgICAgIHJldHVybiAoaW50KSAoKGZsb2F0KSBtRGlhbG9nQ29udGVudFdpZHRoICogb3JpZ2luYWxIZWlnaHQgLyBvcmlnaW5hbFdpZHRoICsgMC41Zik7CisgICAgICAgIH0KKyAgICAgICAgLy8gRm9yIHBvcnRyYWl0IGFydCwgZml0IGhlaWdodCB0byAxNjo5IHJhdGlvIGNhc2UncyBoZWlnaHQuCisgICAgICAgIHJldHVybiAoaW50KSAoKGZsb2F0KSBtRGlhbG9nQ29udGVudFdpZHRoICogOSAvIDE2ICsgMC41Zik7CisgICAgfQorCisgICAgdm9pZCB1cGRhdGVBcnRJY29uSWZOZWVkZWQoKSB7CisgICAgICAgIGlmIChtQ3VzdG9tQ29udHJvbFZpZXcgIT0gbnVsbCB8fCAhaXNJY29uQ2hhbmdlZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1GZXRjaEFydFRhc2sgIT0gbnVsbCkgeworICAgICAgICAgICAgbUZldGNoQXJ0VGFzay5jYW5jZWwodHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgbUZldGNoQXJ0VGFzayA9IG5ldyBGZXRjaEFydFRhc2soKTsKKyAgICAgICAgbUZldGNoQXJ0VGFzay5leGVjdXRlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYXIgdGhlIGJpdG1hcCBsb2FkZWQgYnkgRmV0Y2hBcnRUYXNrLiBXaWxsIGJlIGNhbGxlZCBhZnRlciB0aGUgbG9hZGVkIGJpdG1hcHMgYXJlIGFwcGxpZWQKKyAgICAgKiB0byBhcnR3b3JrLCBvciBubyBsb25nZXIgdmFsaWQuCisgICAgICovCisgICAgdm9pZCBjbGVhckxvYWRlZEJpdG1hcCgpIHsKKyAgICAgICAgbUFydEljb25Jc0xvYWRlZCA9IGZhbHNlOworICAgICAgICBtQXJ0SWNvbkxvYWRlZEJpdG1hcCA9IG51bGw7CisgICAgICAgIG1BcnRJY29uQmFja2dyb3VuZENvbG9yID0gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYSBuZXcgYXJ0IGltYWdlIGlzIGRpZmZlcmVudCBmcm9tIGFuIG9yaWdpbmFsIGFydCBpbWFnZS4gQ29tcGFyZXMKKyAgICAgKiBCaXRtYXAgb2JqZWN0cyBmaXJzdCwgYW5kIHRoZW4gY29tcGFyZXMgVVJJcyBvbmx5IGlmIGJpdG1hcCBpcyB1bmNoYW5nZWQgd2l0aAorICAgICAqIGEgbnVsbCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNJY29uQ2hhbmdlZCgpIHsKKyAgICAgICAgQml0bWFwIG5ld0JpdG1hcCA9IG1EZXNjcmlwdGlvbiA9PSBudWxsID8gbnVsbCA6IG1EZXNjcmlwdGlvbi5nZXRJY29uQml0bWFwKCk7CisgICAgICAgIFVyaSBuZXdVcmkgPSBtRGVzY3JpcHRpb24gPT0gbnVsbCA/IG51bGwgOiBtRGVzY3JpcHRpb24uZ2V0SWNvblVyaSgpOworICAgICAgICBCaXRtYXAgb2xkQml0bWFwID0gbUZldGNoQXJ0VGFzayA9PSBudWxsID8gbUFydEljb25CaXRtYXAgOiBtRmV0Y2hBcnRUYXNrLmdldEljb25CaXRtYXAoKTsKKyAgICAgICAgVXJpIG9sZFVyaSA9IG1GZXRjaEFydFRhc2sgPT0gbnVsbCA/IG1BcnRJY29uVXJpIDogbUZldGNoQXJ0VGFzay5nZXRJY29uVXJpKCk7CisgICAgICAgIGlmIChvbGRCaXRtYXAgIT0gbmV3Qml0bWFwKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChvbGRCaXRtYXAgPT0gbnVsbCAmJiAhdXJpRXF1YWxzKG9sZFVyaSwgbmV3VXJpKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgY2xhc3MgTWVkaWFSb3V0ZXJDYWxsYmFjayBleHRlbmRzIE1lZGlhUm91dGVyLkNhbGxiYWNrIHsKKyAgICAgICAgTWVkaWFSb3V0ZXJDYWxsYmFjaygpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVW5zZWxlY3RlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgeworICAgICAgICAgICAgdXBkYXRlKGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQ2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgeworICAgICAgICAgICAgdXBkYXRlKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVWb2x1bWVDaGFuZ2VkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7CisgICAgICAgICAgICBTZWVrQmFyIHZvbHVtZVNsaWRlciA9IG1Wb2x1bWVTbGlkZXJNYXAuZ2V0KHJvdXRlKTsKKyAgICAgICAgICAgIGludCB2b2x1bWUgPSByb3V0ZS5nZXRWb2x1bWUoKTsKKyAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9uUm91dGVWb2x1bWVDaGFuZ2VkKCksIHJvdXRlLmdldFZvbHVtZToiICsgdm9sdW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh2b2x1bWVTbGlkZXIgIT0gbnVsbCAmJiBtUm91dGVJblZvbHVtZVNsaWRlclRvdWNoZWQgIT0gcm91dGUpIHsKKyAgICAgICAgICAgICAgICB2b2x1bWVTbGlkZXIuc2V0UHJvZ3Jlc3Modm9sdW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgY2xhc3MgTWVkaWFDb250cm9sbGVyQ2FsbGJhY2sgZXh0ZW5kcyBNZWRpYUNvbnRyb2xsZXJDb21wYXQuQ2FsbGJhY2sgeworICAgICAgICBNZWRpYUNvbnRyb2xsZXJDYWxsYmFjaygpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblNlc3Npb25EZXN0cm95ZWQoKSB7CisgICAgICAgICAgICBpZiAobU1lZGlhQ29udHJvbGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlci51bnJlZ2lzdGVyQ2FsbGJhY2sobUNvbnRyb2xsZXJDYWxsYmFjayk7CisgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlciA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25QbGF5YmFja1N0YXRlQ2hhbmdlZChQbGF5YmFja1N0YXRlQ29tcGF0IHN0YXRlKSB7CisgICAgICAgICAgICBtU3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgIHVwZGF0ZShmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25NZXRhZGF0YUNoYW5nZWQoTWVkaWFNZXRhZGF0YUNvbXBhdCBtZXRhZGF0YSkgeworICAgICAgICAgICAgbURlc2NyaXB0aW9uID0gbWV0YWRhdGEgPT0gbnVsbCA/IG51bGwgOiBtZXRhZGF0YS5nZXREZXNjcmlwdGlvbigpOworICAgICAgICAgICAgdXBkYXRlQXJ0SWNvbklmTmVlZGVkKCk7CisgICAgICAgICAgICB1cGRhdGUoZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBDbGlja0xpc3RlbmVyIGltcGxlbWVudHMgVmlldy5PbkNsaWNrTGlzdGVuZXIgeworICAgICAgICBDbGlja0xpc3RlbmVyKCkgeworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICBpbnQgaWQgPSB2LmdldElkKCk7CisgICAgICAgICAgICBpZiAoaWQgPT0gQlVUVE9OX1NUT1BfUkVTX0lEIHx8IGlkID09IEJVVFRPTl9ESVNDT05ORUNUX1JFU19JRCkgeworICAgICAgICAgICAgICAgIGlmIChtUm91dGUuaXNTZWxlY3RlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXIudW5zZWxlY3QoaWQgPT0gQlVUVE9OX1NUT1BfUkVTX0lEID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5VTlNFTEVDVF9SRUFTT05fU1RPUFBFRCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX0RJU0NPTk5FQ1RFRCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRpc21pc3MoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaWQgPT0gUi5pZC5tcl9jb250cm9sX3BsYXliYWNrX2N0cmwpIHsKKyAgICAgICAgICAgICAgICBpZiAobU1lZGlhQ29udHJvbGxlciAhPSBudWxsICYmIG1TdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNQbGF5aW5nID0gbVN0YXRlLmdldFN0YXRlKCkgPT0gUGxheWJhY2tTdGF0ZUNvbXBhdC5TVEFURV9QTEFZSU5HOworICAgICAgICAgICAgICAgICAgICBpbnQgYWN0aW9uRGVzY1Jlc0lkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzUGxheWluZyAmJiBpc1BhdXNlQWN0aW9uU3VwcG9ydGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIuZ2V0VHJhbnNwb3J0Q29udHJvbHMoKS5wYXVzZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uRGVzY1Jlc0lkID0gUi5zdHJpbmcubXJfY29udHJvbGxlcl9wYXVzZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc1BsYXlpbmcgJiYgaXNTdG9wQWN0aW9uU3VwcG9ydGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIuZ2V0VHJhbnNwb3J0Q29udHJvbHMoKS5zdG9wKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25EZXNjUmVzSWQgPSBSLnN0cmluZy5tcl9jb250cm9sbGVyX3N0b3A7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzUGxheWluZyAmJiBpc1BsYXlBY3Rpb25TdXBwb3J0ZWQoKSl7CisgICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLmdldFRyYW5zcG9ydENvbnRyb2xzKCkucGxheSgpOworICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uRGVzY1Jlc0lkID0gUi5zdHJpbmcubXJfY29udHJvbGxlcl9wbGF5OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIEFubm91bmNlIHRoZSBhY3Rpb24gZm9yIGFjY2Vzc2liaWxpdHkuCisgICAgICAgICAgICAgICAgICAgIGlmIChtQWNjZXNzaWJpbGl0eU1hbmFnZXIgIT0gbnVsbCAmJiBtQWNjZXNzaWJpbGl0eU1hbmFnZXIuaXNFbmFibGVkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBhY3Rpb25EZXNjUmVzSWQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50Q29tcGF0LlRZUEVfQU5OT1VOQ0VNRU5UKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnNldFBhY2thZ2VOYW1lKG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuc2V0Q2xhc3NOYW1lKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldFRleHQoKS5hZGQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUNvbnRleHQpLmdldFN0cmluZyhhY3Rpb25EZXNjUmVzSWQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BY2Nlc3NpYmlsaXR5TWFuYWdlci5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaWQgPT0gUi5pZC5tcl9jbG9zZSkgeworICAgICAgICAgICAgICAgIGRpc21pc3MoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgVm9sdW1lQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBTZWVrQmFyLk9uU2Vla0JhckNoYW5nZUxpc3RlbmVyIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBSdW5uYWJsZSBtU3RvcFRyYWNraW5nVG91Y2ggPSBuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBpZiAobVJvdXRlSW5Wb2x1bWVTbGlkZXJUb3VjaGVkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbVJvdXRlSW5Wb2x1bWVTbGlkZXJUb3VjaGVkID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1IYXNQZW5kaW5nVXBkYXRlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGUobVBlbmRpbmdVcGRhdGVBbmltYXRpb25OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIFZvbHVtZUNoYW5nZUxpc3RlbmVyKCkgeworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRUcmFja2luZ1RvdWNoKFNlZWtCYXIgc2Vla0JhcikgeworICAgICAgICAgICAgaWYgKG1Sb3V0ZUluVm9sdW1lU2xpZGVyVG91Y2hlZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVZvbHVtZVNsaWRlci5yZW1vdmVDYWxsYmFja3MobVN0b3BUcmFja2luZ1RvdWNoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Sb3V0ZUluVm9sdW1lU2xpZGVyVG91Y2hlZCA9IChNZWRpYVJvdXRlci5Sb3V0ZUluZm8pIHNlZWtCYXIuZ2V0VGFnKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TdG9wVHJhY2tpbmdUb3VjaChTZWVrQmFyIHNlZWtCYXIpIHsKKyAgICAgICAgICAgIC8vIERlZmVyIHJlc2V0dGluZyBtVm9sdW1lU2xpZGVyVG91Y2hlZCB0byBhbGxvdyB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIKKyAgICAgICAgICAgIC8vIGEgbGl0dGxlIHRpbWUgdG8gc2V0dGxlIGludG8gaXRzIG5ldyBzdGF0ZSBhbmQgcHVibGlzaCB0aGUgZmluYWwKKyAgICAgICAgICAgIC8vIHZvbHVtZSB1cGRhdGUuCisgICAgICAgICAgICBtVm9sdW1lU2xpZGVyLnBvc3REZWxheWVkKG1TdG9wVHJhY2tpbmdUb3VjaCwgVk9MVU1FX1VQREFURV9ERUxBWV9NSUxMSVMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvZ3Jlc3NDaGFuZ2VkKFNlZWtCYXIgc2Vla0JhciwgaW50IHByb2dyZXNzLCBib29sZWFuIGZyb21Vc2VyKSB7CisgICAgICAgICAgICBpZiAoZnJvbVVzZXIpIHsKKyAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSAoTWVkaWFSb3V0ZXIuUm91dGVJbmZvKSBzZWVrQmFyLmdldFRhZygpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblByb2dyZXNzQ2hhbmdlZCgpOiBjYWxsaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJNZWRpYVJvdXRlci5Sb3V0ZUluZm8ucmVxdWVzdFNldFZvbHVtZSgiICsgcHJvZ3Jlc3MgKyAiKSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByb3V0ZS5yZXF1ZXN0U2V0Vm9sdW1lKHByb2dyZXNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgVm9sdW1lR3JvdXBBZGFwdGVyIGV4dGVuZHMgQXJyYXlBZGFwdGVyPE1lZGlhUm91dGVyLlJvdXRlSW5mbz4geworICAgICAgICBmaW5hbCBmbG9hdCBtRGlzYWJsZWRBbHBoYTsKKworICAgICAgICBwdWJsaWMgVm9sdW1lR3JvdXBBZGFwdGVyKENvbnRleHQgY29udGV4dCwgTGlzdDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IG9iamVjdHMpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIDAsIG9iamVjdHMpOworICAgICAgICAgICAgbURpc2FibGVkQWxwaGEgPSBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldERpc2FibGVkQWxwaGEoY29udGV4dCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKGludCBwb3NpdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWaWV3IGdldFZpZXcoZmluYWwgaW50IHBvc2l0aW9uLCBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgcGFyZW50KSB7CisgICAgICAgICAgICBWaWV3IHYgPSBjb252ZXJ0VmlldzsKKyAgICAgICAgICAgIGlmICh2ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB2ID0gTGF5b3V0SW5mbGF0ZXIuZnJvbShwYXJlbnQuZ2V0Q29udGV4dCgpKS5pbmZsYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgUi5sYXlvdXQubXJfY29udHJvbGxlcl92b2x1bWVfaXRlbSwgcGFyZW50LCBmYWxzZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHVwZGF0ZVZvbHVtZUdyb3VwSXRlbUhlaWdodCh2KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gZ2V0SXRlbShwb3NpdGlvbik7CisgICAgICAgICAgICBpZiAocm91dGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNFbmFibGVkID0gcm91dGUuaXNFbmFibGVkKCk7CisKKyAgICAgICAgICAgICAgICBUZXh0VmlldyByb3V0ZU5hbWUgPSAoVGV4dFZpZXcpIHYuZmluZFZpZXdCeUlkKFIuaWQubXJfbmFtZSk7CisgICAgICAgICAgICAgICAgcm91dGVOYW1lLnNldEVuYWJsZWQoaXNFbmFibGVkKTsKKyAgICAgICAgICAgICAgICByb3V0ZU5hbWUuc2V0VGV4dChyb3V0ZS5nZXROYW1lKCkpOworCisgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZVZvbHVtZVNsaWRlciB2b2x1bWVTbGlkZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgKE1lZGlhUm91dGVWb2x1bWVTbGlkZXIpIHYuZmluZFZpZXdCeUlkKFIuaWQubXJfdm9sdW1lX3NsaWRlcik7CisgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5zZXRWb2x1bWVTbGlkZXJDb2xvcigKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5nZXRDb250ZXh0KCksIHZvbHVtZVNsaWRlciwgbVZvbHVtZUdyb3VwTGlzdCk7CisgICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldFRhZyhyb3V0ZSk7CisgICAgICAgICAgICAgICAgbVZvbHVtZVNsaWRlck1hcC5wdXQocm91dGUsIHZvbHVtZVNsaWRlcik7CisgICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldEhpZGVUaHVtYighaXNFbmFibGVkKTsKKyAgICAgICAgICAgICAgICB2b2x1bWVTbGlkZXIuc2V0RW5hYmxlZChpc0VuYWJsZWQpOworICAgICAgICAgICAgICAgIGlmIChpc0VuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzVm9sdW1lQ29udHJvbEF2YWlsYWJsZShyb3V0ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZVNsaWRlci5zZXRNYXgocm91dGUuZ2V0Vm9sdW1lTWF4KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldFByb2dyZXNzKHJvdXRlLmdldFZvbHVtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZVNsaWRlci5zZXRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcihtVm9sdW1lQ2hhbmdlTGlzdGVuZXIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldE1heCgxMDApOworICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldFByb2dyZXNzKDEwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVTbGlkZXIuc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBJbWFnZVZpZXcgdm9sdW1lSXRlbUljb24gPQorICAgICAgICAgICAgICAgICAgICAgICAgKEltYWdlVmlldykgdi5maW5kVmlld0J5SWQoUi5pZC5tcl92b2x1bWVfaXRlbV9pY29uKTsKKyAgICAgICAgICAgICAgICB2b2x1bWVJdGVtSWNvbi5zZXRBbHBoYShpc0VuYWJsZWQgPyAweEZGIDogKGludCkgKDB4RkYgKiBtRGlzYWJsZWRBbHBoYSkpOworCisgICAgICAgICAgICAgICAgLy8gSWYgb3ZlcmxheSBiaXRtYXAgZXhpc3RzLCByZWFsIHZpZXcgc2hvdWxkIHJlbWFpbiBoaWRkZW4gdW50aWwKKyAgICAgICAgICAgICAgICAvLyB0aGUgYW5pbWF0aW9uIGVuZHMuCisgICAgICAgICAgICAgICAgTGluZWFyTGF5b3V0IGNvbnRhaW5lciA9IChMaW5lYXJMYXlvdXQpIHYuZmluZFZpZXdCeUlkKFIuaWQudm9sdW1lX2l0ZW1fY29udGFpbmVyKTsKKyAgICAgICAgICAgICAgICBjb250YWluZXIuc2V0VmlzaWJpbGl0eShtR3JvdXBNZW1iZXJSb3V0ZXNBbmltYXRpbmdXaXRoQml0bWFwLmNvbnRhaW5zKHJvdXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgPyBWaWV3LklOVklTSUJMRSA6IFZpZXcuVklTSUJMRSk7CisKKyAgICAgICAgICAgICAgICAvLyBSb3V0ZXMgd2hpY2ggYXJlIGJlaW5nIGFkZGVkIHdpbGwgYmUgaW52aXNpYmxlIHVudGlsIGFuaW1hdGlvbiBlbmRzLgorICAgICAgICAgICAgICAgIGlmIChtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZCAhPSBudWxsICYmIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkLmNvbnRhaW5zKHJvdXRlKSkgeworICAgICAgICAgICAgICAgICAgICBBbmltYXRpb24gYWxwaGFBbmltID0gbmV3IEFscGhhQW5pbWF0aW9uKDAuMGYsIDAuMGYpOworICAgICAgICAgICAgICAgICAgICBhbHBoYUFuaW0uc2V0RHVyYXRpb24oMCk7CisgICAgICAgICAgICAgICAgICAgIGFscGhhQW5pbS5zZXRGaWxsRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgYWxwaGFBbmltLnNldEZpbGxBZnRlcih0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgdi5jbGVhckFuaW1hdGlvbigpOworICAgICAgICAgICAgICAgICAgICB2LnN0YXJ0QW5pbWF0aW9uKGFscGhhQW5pbSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIEZldGNoQXJ0VGFzayBleHRlbmRzIEFzeW5jVGFzazxWb2lkLCBWb2lkLCBCaXRtYXA+IHsKKyAgICAgICAgLy8gU2hvdyBhbmltYXRpb24gb25seSB3aGVuIGZldGNoaW5nIHRha2VzIGEgbG9uZyB0aW1lLgorICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFNIT1dfQU5JTV9USU1FX1RIUkVTSE9MRF9NSUxMSVMgPSAxMjBMOworCisgICAgICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1JY29uQml0bWFwOworICAgICAgICBwcml2YXRlIGZpbmFsIFVyaSBtSWNvblVyaTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUJhY2tncm91bmRDb2xvcjsKKyAgICAgICAgcHJpdmF0ZSBsb25nIG1TdGFydFRpbWVNaWxsaXM7CisKKyAgICAgICAgRmV0Y2hBcnRUYXNrKCkgeworICAgICAgICAgICAgQml0bWFwIGJpdG1hcCA9IG1EZXNjcmlwdGlvbiA9PSBudWxsID8gbnVsbCA6IG1EZXNjcmlwdGlvbi5nZXRJY29uQml0bWFwKCk7CisgICAgICAgICAgICBpZiAoaXNCaXRtYXBSZWN5Y2xlZChiaXRtYXApKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2FuJ3QgZmV0Y2ggdGhlIGdpdmVuIGFydCBiaXRtYXAgYmVjYXVzZSBpdCdzIGFscmVhZHkgcmVjeWNsZWQuIik7CisgICAgICAgICAgICAgICAgYml0bWFwID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1JY29uQml0bWFwID0gYml0bWFwOworICAgICAgICAgICAgbUljb25VcmkgPSBtRGVzY3JpcHRpb24gPT0gbnVsbCA/IG51bGwgOiBtRGVzY3JpcHRpb24uZ2V0SWNvblVyaSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJpdG1hcCBnZXRJY29uQml0bWFwKCkgeworICAgICAgICAgICAgcmV0dXJuIG1JY29uQml0bWFwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFVyaSBnZXRJY29uVXJpKCkgeworICAgICAgICAgICAgcmV0dXJuIG1JY29uVXJpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUHJlRXhlY3V0ZSgpIHsKKyAgICAgICAgICAgIG1TdGFydFRpbWVNaWxsaXMgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIGNsZWFyTG9hZGVkQml0bWFwKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEJpdG1hcCBkb0luQmFja2dyb3VuZChWb2lkLi4uIGFyZykgeworICAgICAgICAgICAgQml0bWFwIGFydCA9IG51bGw7CisgICAgICAgICAgICBpZiAobUljb25CaXRtYXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGFydCA9IG1JY29uQml0bWFwOworICAgICAgICAgICAgfSBlbHNlIGlmIChtSWNvblVyaSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHN0cmVhbSA9IG9wZW5JbnB1dFN0cmVhbUJ5U2NoZW1lKG1JY29uVXJpKSkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5hYmxlIHRvIG9wZW46ICIgKyBtSWNvblVyaSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBRdWVyeSBhcnQgc2l6ZS4KKyAgICAgICAgICAgICAgICAgICAgQml0bWFwRmFjdG9yeS5PcHRpb25zIG9wdGlvbnMgPSBuZXcgQml0bWFwRmFjdG9yeS5PcHRpb25zKCk7CisgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuaW5KdXN0RGVjb2RlQm91bmRzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgQml0bWFwRmFjdG9yeS5kZWNvZGVTdHJlYW0oc3RyZWFtLCBudWxsLCBvcHRpb25zKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMub3V0V2lkdGggPT0gMCB8fCBvcHRpb25zLm91dEhlaWdodCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBSZXdpbmQgdGhlIHN0cmVhbSBpbiBvcmRlciB0byByZXN0YXJ0IGFydCBkZWNvZGluZy4KKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5yZXNldCgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBGYWlsZWQgdG8gcmV3aW5kIHRoZSBzdHJlYW0sIHRyeSB0byByZW9wZW4gaXQuCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc3RyZWFtID0gb3BlbklucHV0U3RyZWFtQnlTY2hlbWUobUljb25VcmkpKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5hYmxlIHRvIG9wZW46ICIgKyBtSWNvblVyaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHJlcXVpcmVkIHNpemUgdG8gZGVjb2RlIHRoZSBhcnQgYW5kIHBvc3NpYmx5IHJlc2l6ZSBpdC4KKyAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5pbkp1c3REZWNvZGVCb3VuZHMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHJlcUhlaWdodCA9IGdldERlc2lyZWRBcnRIZWlnaHQob3B0aW9ucy5vdXRXaWR0aCwgb3B0aW9ucy5vdXRIZWlnaHQpOworICAgICAgICAgICAgICAgICAgICBpbnQgcmF0aW8gPSBvcHRpb25zLm91dEhlaWdodCAvIHJlcUhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5pblNhbXBsZVNpemUgPSBNYXRoLm1heCgxLCBJbnRlZ2VyLmhpZ2hlc3RPbmVCaXQocmF0aW8pKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ2FuY2VsbGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGFydCA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlU3RyZWFtKHN0cmVhbSwgbnVsbCwgb3B0aW9ucyk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSl7CisgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlVuYWJsZSB0byBvcGVuOiAiICsgbUljb25VcmksIGUpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpc0JpdG1hcFJlY3ljbGVkKGFydCkpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW4ndCB1c2UgcmVjeWNsZWQgYml0bWFwOiAiICsgYXJ0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhcnQgIT0gbnVsbCAmJiBhcnQuZ2V0V2lkdGgoKSA8IGFydC5nZXRIZWlnaHQoKSkgeworICAgICAgICAgICAgICAgIC8vIFBvcnRyYWl0IGFydCByZXF1aXJlcyBkb21pbmFudCBjb2xvciBhcyBiYWNrZ3JvdW5kIGNvbG9yLgorICAgICAgICAgICAgICAgIFBhbGV0dGUgcGFsZXR0ZSA9IG5ldyBQYWxldHRlLkJ1aWxkZXIoYXJ0KS5tYXhpbXVtQ29sb3JDb3VudCgxKS5nZW5lcmF0ZSgpOworICAgICAgICAgICAgICAgIG1CYWNrZ3JvdW5kQ29sb3IgPSBwYWxldHRlLmdldFN3YXRjaGVzKCkuaXNFbXB0eSgpCisgICAgICAgICAgICAgICAgICAgICAgICA/IDAgOiBwYWxldHRlLmdldFN3YXRjaGVzKCkuZ2V0KDApLmdldFJnYigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGFydDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvblBvc3RFeGVjdXRlKEJpdG1hcCBhcnQpIHsKKyAgICAgICAgICAgIG1GZXRjaEFydFRhc2sgPSBudWxsOworICAgICAgICAgICAgaWYgKCFPYmplY3RzQ29tcGF0LmVxdWFscyhtQXJ0SWNvbkJpdG1hcCwgbUljb25CaXRtYXApCisgICAgICAgICAgICAgICAgICAgIHx8ICFPYmplY3RzQ29tcGF0LmVxdWFscyhtQXJ0SWNvblVyaSwgbUljb25VcmkpKSB7CisgICAgICAgICAgICAgICAgbUFydEljb25CaXRtYXAgPSBtSWNvbkJpdG1hcDsKKyAgICAgICAgICAgICAgICBtQXJ0SWNvbkxvYWRlZEJpdG1hcCA9IGFydDsKKyAgICAgICAgICAgICAgICBtQXJ0SWNvblVyaSA9IG1JY29uVXJpOworICAgICAgICAgICAgICAgIG1BcnRJY29uQmFja2dyb3VuZENvbG9yID0gbUJhY2tncm91bmRDb2xvcjsKKyAgICAgICAgICAgICAgICBtQXJ0SWNvbklzTG9hZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBsb25nIGVsYXBzZWRUaW1lTWlsbGlzID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgLSBtU3RhcnRUaW1lTWlsbGlzOworICAgICAgICAgICAgICAgIC8vIExvYWRlZCBiaXRtYXAgd2lsbCBiZSBhcHBsaWVkIG9uIHRoZSBuZXh0IHVwZGF0ZQorICAgICAgICAgICAgICAgIHVwZGF0ZShlbGFwc2VkVGltZU1pbGxpcyA+IFNIT1dfQU5JTV9USU1FX1RIUkVTSE9MRF9NSUxMSVMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBvcGVuSW5wdXRTdHJlYW1CeVNjaGVtZShVcmkgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgU3RyaW5nIHNjaGVtZSA9IHVyaS5nZXRTY2hlbWUoKS50b0xvd2VyQ2FzZSgpOworICAgICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChDb250ZW50UmVzb2x2ZXIuU0NIRU1FX0FORFJPSURfUkVTT1VSQ0UuZXF1YWxzKHNjaGVtZSkKKyAgICAgICAgICAgICAgICAgICAgfHwgQ29udGVudFJlc29sdmVyLlNDSEVNRV9DT05URU5ULmVxdWFscyhzY2hlbWUpCisgICAgICAgICAgICAgICAgICAgIHx8IENvbnRlbnRSZXNvbHZlci5TQ0hFTUVfRklMRS5lcXVhbHMoc2NoZW1lKSkgeworICAgICAgICAgICAgICAgIHN0cmVhbSA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLm9wZW5JbnB1dFN0cmVhbSh1cmkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBVUkwgdXJsID0gbmV3IFVSTCh1cmkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgVVJMQ29ubmVjdGlvbiBjb25uID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgY29ubi5zZXRDb25uZWN0VGltZW91dChDT05ORUNUSU9OX1RJTUVPVVRfTUlMTElTKTsKKyAgICAgICAgICAgICAgICBjb25uLnNldFJlYWRUaW1lb3V0KENPTk5FQ1RJT05fVElNRU9VVF9NSUxMSVMpOworICAgICAgICAgICAgICAgIHN0cmVhbSA9IGNvbm4uZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAoc3RyZWFtID09IG51bGwpID8gbnVsbCA6IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHN0cmVhbSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2dGcmFnbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNWQ3NGYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQuamF2YQpAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwOworCitpbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nOworaW1wb3J0IGFuZHJvaWQuYXBwLkRpYWxvZ0ZyYWdtZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKKworLyoqCisgKiBNZWRpYSByb3V0ZSBjb250cm9sbGVyIGRpYWxvZyBmcmFnbWVudC4KKyAqIDxwPgorICogQ3JlYXRlcyBhIHtAbGluayBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZ30uICBUaGUgYXBwbGljYXRpb24gbWF5IHN1YmNsYXNzCisgKiB0aGlzIGRpYWxvZyBmcmFnbWVudCB0byBjdXN0b21pemUgdGhlIG1lZGlhIHJvdXRlIGNvbnRyb2xsZXIgZGlhbG9nLgorICogPC9wPgorICovCitwdWJsaWMgY2xhc3MgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2dGcmFnbWVudCBleHRlbmRzIERpYWxvZ0ZyYWdtZW50IHsKKyAgICBwcml2YXRlIE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nIG1EaWFsb2c7CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG1lZGlhIHJvdXRlIGNvbnRyb2xsZXIgZGlhbG9nIGZyYWdtZW50LgorICAgICAqIDxwPgorICAgICAqIEFsbCBzdWJjbGFzc2VzIG9mIHRoaXMgY2xhc3MgbXVzdCBhbHNvIHBvc3Nlc3MgYSBkZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2dGcmFnbWVudCgpIHsKKyAgICAgICAgc2V0Q2FuY2VsYWJsZSh0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgY29udHJvbGxlciBkaWFsb2cgaXMgYmVpbmcgY3JlYXRlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjdXN0b21pemUgdGhlIGRpYWxvZy4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nIG9uQ3JlYXRlQ29udHJvbGxlckRpYWxvZygKKyAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nKGNvbnRleHQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBEaWFsb2cgb25DcmVhdGVEaWFsb2coQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBtRGlhbG9nID0gb25DcmVhdGVDb250cm9sbGVyRGlhbG9nKGdldENvbnRleHQoKSwgc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgcmV0dXJuIG1EaWFsb2c7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TdG9wKCkgeworICAgICAgICBzdXBlci5vblN0b3AoKTsKKyAgICAgICAgaWYgKG1EaWFsb2cgIT0gbnVsbCkgeworICAgICAgICAgICAgbURpYWxvZy5jbGVhckdyb3VwTGlzdEFuaW1hdGlvbihmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnKSB7CisgICAgICAgIHN1cGVyLm9uQ29uZmlndXJhdGlvbkNoYW5nZWQobmV3Q29uZmlnKTsKKyAgICAgICAgaWYgKG1EaWFsb2cgIT0gbnVsbCkgeworICAgICAgICAgICAgbURpYWxvZy51cGRhdGVMYXlvdXQoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWVhZjM5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRGlhbG9nRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7CisKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOworCisvKioKKyAqIFRoZSBtZWRpYSByb3V0ZSBkaWFsb2cgZmFjdG9yeSBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhlIG1lZGlhIHJvdXRlCisgKiBjaG9vc2VyIGFuZCBjb250cm9sbGVyIGRpYWxvZ3MgYXMgbmVlZGVkLgorICogPHA+CisgKiBUaGUgYXBwbGljYXRpb24gY2FuIGN1c3RvbWl6ZSB0aGUgZGlhbG9ncyBieSBwcm92aWRpbmcgYSBzdWJjbGFzcyBvZiB0aGUKKyAqIGRpYWxvZyBmYWN0b3J5IHRvIHRoZSB7QGxpbmsgTWVkaWFSb3V0ZUJ1dHRvbn0gdXNpbmcgdGhlCisgKiB7QGxpbmsgTWVkaWFSb3V0ZUJ1dHRvbiNzZXREaWFsb2dGYWN0b3J5IHNldERpYWxvZ0ZhY3Rvcnl9IG1ldGhvZC4KKyAqIDwvcD4KKyAqLworcHVibGljIGNsYXNzIE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZWRpYVJvdXRlRGlhbG9nRmFjdG9yeSBzRGVmYXVsdCA9IG5ldyBNZWRpYVJvdXRlRGlhbG9nRmFjdG9yeSgpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGRlZmF1bHQgbWVkaWEgcm91dGUgZGlhbG9nIGZhY3RvcnkuCisgICAgICovCisgICAgcHVibGljIE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5KCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGRlZmF1bHQgbWVkaWEgcm91dGUgZGlhbG9nIGZhY3RvcnksIG5ldmVyIG51bGwuCisgICAgICovCisgICAgQE5vbk51bGwKKyAgICBwdWJsaWMgc3RhdGljIE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5IGdldERlZmF1bHQoKSB7CisgICAgICAgIHJldHVybiBzRGVmYXVsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgY2hvb3NlciBkaWFsb2cgaXMgYmVpbmcgb3BlbmVkIGFuZCBpdCBpcyB0aW1lIHRvIGNyZWF0ZSB0aGUgZnJhZ21lbnQuCisgICAgICogPHA+CisgICAgICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY3JlYXRlIGEgY3VzdG9taXplZCBmcmFnbWVudC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZyBmcmFnbWVudCwgbXVzdCBub3QgYmUgbnVsbC4KKyAgICAgKi8KKyAgICBATm9uTnVsbAorICAgIHB1YmxpYyBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZ0ZyYWdtZW50IG9uQ3JlYXRlQ2hvb3NlckRpYWxvZ0ZyYWdtZW50KCkgeworICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgY29udHJvbGxlciBkaWFsb2cgaXMgYmVpbmcgb3BlbmVkIGFuZCBpdCBpcyB0aW1lIHRvIGNyZWF0ZSB0aGUgZnJhZ21lbnQuCisgICAgICogPHA+CisgICAgICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY3JlYXRlIGEgY3VzdG9taXplZCBmcmFnbWVudC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBtZWRpYSByb3V0ZSBjb250cm9sbGVyIGRpYWxvZyBmcmFnbWVudCwgbXVzdCBub3QgYmUgbnVsbC4KKyAgICAgKi8KKyAgICBATm9uTnVsbAorICAgIHB1YmxpYyBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZ0ZyYWdtZW50IG9uQ3JlYXRlQ29udHJvbGxlckRpYWxvZ0ZyYWdtZW50KCkgeworICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVEaWFsb2dIZWxwZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhYWJmN2IKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVEaWFsb2dIZWxwZXIuamF2YQpAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkJpdG1hcERyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5BcGlIZWxwZXI7CitpbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLlI7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitmaW5hbCBjbGFzcyBNZWRpYVJvdXRlRGlhbG9nSGVscGVyIHsKKyAgICAvKioKKyAgICAgKiBUaGUgZnJhbWV3b3JrIHNob3VsZCBzZXQgdGhlIGRpYWxvZyB3aWR0aCBwcm9wZXJseSwgYnV0IHNvbWVob3cgaXQgZG9lc24ndCB3b3JrLCBoZW5jZQorICAgICAqIGR1cGxpY2F0aW5nIGEgc2ltaWxhciBsb2dpYyBoZXJlIHRvIGRldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgZGlhbG9nIHdpZHRoLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldERpYWxvZ1dpZHRoKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBEaXNwbGF5TWV0cmljcyBtZXRyaWNzID0gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhjb250ZXh0KS5nZXREaXNwbGF5TWV0cmljcygpOworICAgICAgICBib29sZWFuIGlzUG9ydHJhaXQgPSBtZXRyaWNzLndpZHRoUGl4ZWxzIDwgbWV0cmljcy5oZWlnaHRQaXhlbHM7CisKKyAgICAgICAgVHlwZWRWYWx1ZSB2YWx1ZSA9IG5ldyBUeXBlZFZhbHVlKCk7CisgICAgICAgIEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoY29udGV4dCkuZ2V0VmFsdWUoaXNQb3J0cmFpdAorICAgICAgICAgICAgICAgID8gUi5kaW1lbi5tcl9kaWFsb2dfZml4ZWRfd2lkdGhfbWlub3IKKyAgICAgICAgICAgICAgICA6IFIuZGltZW4ubXJfZGlhbG9nX2ZpeGVkX3dpZHRoX21ham9yLCB2YWx1ZSwgdHJ1ZSk7CisgICAgICAgIGlmICh2YWx1ZS50eXBlID09IFR5cGVkVmFsdWUuVFlQRV9ESU1FTlNJT04pIHsKKyAgICAgICAgICAgIHJldHVybiAoaW50KSB2YWx1ZS5nZXREaW1lbnNpb24obWV0cmljcyk7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUudHlwZSA9PSBUeXBlZFZhbHVlLlRZUEVfRlJBQ1RJT04pIHsKKyAgICAgICAgICAgIHJldHVybiAoaW50KSB2YWx1ZS5nZXRGcmFjdGlvbihtZXRyaWNzLndpZHRoUGl4ZWxzLCBtZXRyaWNzLndpZHRoUGl4ZWxzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGFyZXMgdHdvIGxpc3RzIHJlZ2FyZGxlc3Mgb2Ygb3JkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdDEgQSBsaXN0CisgICAgICogQHBhcmFtIGxpc3QyIEEgbGlzdCB0byBiZSBjb21wYXJlZCB3aXRoIHtAY29kZSBsaXN0MX0KKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdHdvIGxpc3RzIGhhdmUgZXhhY3RseSBzYW1lIGl0ZW1zIHJlZ2FyZGxlc3Mgb2Ygb3JkZXIsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxFPiBib29sZWFuIGxpc3RVbm9yZGVyZWRFcXVhbHMoTGlzdDxFPiBsaXN0MSwgTGlzdDxFPiBsaXN0MikgeworICAgICAgICBIYXNoU2V0PEU+IHNldDEgPSBuZXcgSGFzaFNldDw+KGxpc3QxKTsKKyAgICAgICAgSGFzaFNldDxFPiBzZXQyID0gbmV3IEhhc2hTZXQ8PihsaXN0Mik7CisgICAgICAgIHJldHVybiBzZXQxLmVxdWFscyhzZXQyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlcyB0d28gbGlzdHMgYW5kIHJldHVybnMgYSBzZXQgb2YgaXRlbXMgd2hpY2ggZXhpc3QKKyAgICAgKiBhZnRlci1saXN0IGJ1dCBiZWZvcmUtbGlzdCwgd2hpY2ggbWVhbnMgbmV3bHkgYWRkZWQgaXRlbXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmVmb3JlIEEgbGlzdAorICAgICAqIEBwYXJhbSBhZnRlciBBIGxpc3QgdG8gYmUgY29tcGFyZWQgd2l0aCB7QGNvZGUgYmVmb3JlfQorICAgICAqIEByZXR1cm4gQSBzZXQgb2YgaXRlbXMgd2hpY2ggY29udGFpbnMgbmV3bHkgYWRkZWQgaXRlbXMgd2hpbGUKKyAgICAgKiBjb21wYXJpbmcge0Bjb2RlIGFmdGVyfSB0byB7QGNvZGUgYmVmb3JlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxFPiBTZXQ8RT4gZ2V0SXRlbXNBZGRlZChMaXN0PEU+IGJlZm9yZSwgTGlzdDxFPiBhZnRlcikgeworICAgICAgICBIYXNoU2V0PEU+IHNldCA9IG5ldyBIYXNoU2V0PD4oYWZ0ZXIpOworICAgICAgICBzZXQucmVtb3ZlQWxsKGJlZm9yZSk7CisgICAgICAgIHJldHVybiBzZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGFyZXMgdHdvIGxpc3RzIGFuZCByZXR1cm5zIGEgc2V0IG9mIGl0ZW1zIHdoaWNoIGV4aXN0CisgICAgICogYmVmb3JlLWxpc3QgYnV0IGFmdGVyLWxpc3QsIHdoaWNoIG1lYW5zIHJlbW92ZWQgaXRlbXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmVmb3JlIEEgbGlzdAorICAgICAqIEBwYXJhbSBhZnRlciBBIGxpc3QgdG8gYmUgY29tcGFyZWQgd2l0aCB7QGNvZGUgYmVmb3JlfQorICAgICAqIEByZXR1cm4gQSBzZXQgb2YgaXRlbXMgd2hpY2ggY29udGFpbnMgcmVtb3ZlZCBpdGVtcyB3aGlsZQorICAgICAqIGNvbXBhcmluZyB7QGNvZGUgYWZ0ZXJ9IHRvIHtAY29kZSBiZWZvcmV9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPEU+IFNldDxFPiBnZXRJdGVtc1JlbW92ZWQoTGlzdDxFPiBiZWZvcmUsIExpc3Q8RT4gYWZ0ZXIpIHsKKyAgICAgICAgSGFzaFNldDxFPiBzZXQgPSBuZXcgSGFzaFNldDw+KGJlZm9yZSk7CisgICAgICAgIHNldC5yZW1vdmVBbGwoYWZ0ZXIpOworICAgICAgICByZXR1cm4gc2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyBhbiBpdGVtLVJlY3QgbWFwIHdoaWNoIGluZGljYXRlcyB3aGVyZSBtZW1iZXIKKyAgICAgKiBpdGVtcyBhcmUgbG9jYXRlZCBpbiB0aGUgZ2l2ZW4gTGlzdFZpZXcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdFZpZXcgQSBsaXN0IHZpZXcKKyAgICAgKiBAcGFyYW0gYWRhcHRlciBBbiBhcnJheSBhZGFwdGVyIHdoaWNoIGNvbnRhaW5zIGFuIGFycmF5IG9mIGl0ZW1zLgorICAgICAqIEByZXR1cm4gQSBtYXAgb2YgaXRlbXMgYW5kIGJvdW5kcyBvZiB0aGVpciB2aWV3cyBsb2NhdGVkIGluIHRoZSBnaXZlbiBsaXN0IHZpZXcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8RT4gSGFzaE1hcDxFLCBSZWN0PiBnZXRJdGVtQm91bmRNYXAoTGlzdFZpZXcgbGlzdFZpZXcsCisgICAgICAgICAgICBBcnJheUFkYXB0ZXI8RT4gYWRhcHRlcikgeworICAgICAgICBIYXNoTWFwPEUsIFJlY3Q+IGl0ZW1Cb3VuZE1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgaW50IGZpcnN0VmlzaWJsZVBvc2l0aW9uID0gbGlzdFZpZXcuZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Vmlldy5nZXRDaGlsZENvdW50KCk7ICsraSkgeworICAgICAgICAgICAgaW50IHBvc2l0aW9uID0gZmlyc3RWaXNpYmxlUG9zaXRpb24gKyBpOworICAgICAgICAgICAgRSBpdGVtID0gYWRhcHRlci5nZXRJdGVtKHBvc2l0aW9uKTsKKyAgICAgICAgICAgIFZpZXcgdmlldyA9IGxpc3RWaWV3LmdldENoaWxkQXQoaSk7CisgICAgICAgICAgICBpdGVtQm91bmRNYXAucHV0KGl0ZW0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBSZWN0KHZpZXcuZ2V0TGVmdCgpLCB2aWV3LmdldFRvcCgpLCB2aWV3LmdldFJpZ2h0KCksIHZpZXcuZ2V0Qm90dG9tKCkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaXRlbUJvdW5kTWFwOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyBhbiBpdGVtLUJpdG1hcERyYXdhYmxlIG1hcCB3aGljaCBzdG9yZXMgc25hcHNob3RzCisgICAgICogb2YgbWVtYmVyIGl0ZW1zIGluIHRoZSBnaXZlbiBMaXN0Vmlldy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IEEgY29udGV4dAorICAgICAqIEBwYXJhbSBsaXN0VmlldyBBIGxpc3QgdmlldworICAgICAqIEBwYXJhbSBhZGFwdGVyIEFuIGFycmF5IGFkYXB0ZXIgd2hpY2ggY29udGFpbnMgYW4gYXJyYXkgb2YgaXRlbXMuCisgICAgICogQHJldHVybiBBIG1hcCBvZiBpdGVtcyBhbmQgc25hcHNob3RzIG9mIHRoZWlyIHZpZXdzIGluIHRoZSBnaXZlbiBsaXN0IHZpZXcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8RT4gSGFzaE1hcDxFLCBCaXRtYXBEcmF3YWJsZT4gZ2V0SXRlbUJpdG1hcE1hcChDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICBMaXN0VmlldyBsaXN0VmlldywgQXJyYXlBZGFwdGVyPEU+IGFkYXB0ZXIpIHsKKyAgICAgICAgSGFzaE1hcDxFLCBCaXRtYXBEcmF3YWJsZT4gaXRlbUJpdG1hcE1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgaW50IGZpcnN0VmlzaWJsZVBvc2l0aW9uID0gbGlzdFZpZXcuZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Vmlldy5nZXRDaGlsZENvdW50KCk7ICsraSkgeworICAgICAgICAgICAgaW50IHBvc2l0aW9uID0gZmlyc3RWaXNpYmxlUG9zaXRpb24gKyBpOworICAgICAgICAgICAgRSBpdGVtID0gYWRhcHRlci5nZXRJdGVtKHBvc2l0aW9uKTsKKyAgICAgICAgICAgIFZpZXcgdmlldyA9IGxpc3RWaWV3LmdldENoaWxkQXQoaSk7CisgICAgICAgICAgICBpdGVtQml0bWFwTWFwLnB1dChpdGVtLCBnZXRWaWV3Qml0bWFwKGNvbnRleHQsIHZpZXcpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaXRlbUJpdG1hcE1hcDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBCaXRtYXBEcmF3YWJsZSBnZXRWaWV3Qml0bWFwKENvbnRleHQgY29udGV4dCwgVmlldyB2aWV3KSB7CisgICAgICAgIEJpdG1hcCBiaXRtYXAgPSBCaXRtYXAuY3JlYXRlQml0bWFwKHZpZXcuZ2V0V2lkdGgoKSwgdmlldy5nZXRIZWlnaHQoKSwKKyAgICAgICAgICAgICAgICBCaXRtYXAuQ29uZmlnLkFSR0JfODg4OCk7CisgICAgICAgIENhbnZhcyBjYW52YXMgPSBuZXcgQ2FudmFzKGJpdG1hcCk7CisgICAgICAgIHZpZXcuZHJhdyhjYW52YXMpOworICAgICAgICByZXR1cm4gbmV3IEJpdG1hcERyYXdhYmxlKGNvbnRleHQuZ2V0UmVzb3VyY2VzKCksIGJpdG1hcCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRGlzY292ZXJ5RnJhZ21lbnQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZURpc2NvdmVyeUZyYWdtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJlZTExOAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZURpc2NvdmVyeUZyYWdtZW50LmphdmEKQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQuYXBwLkZyYWdtZW50OworCitpbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVTZWxlY3RvcjsKKworLyoqCisgKiBNZWRpYSByb3V0ZSBkaXNjb3ZlcnkgZnJhZ21lbnQuCisgKiA8cD4KKyAqIFRoaXMgZnJhZ21lbnQgdGFrZXMgY2FyZSBvZiByZWdpc3RlcmluZyBhIGNhbGxiYWNrIGZvciBtZWRpYSByb3V0ZSBkaXNjb3ZlcnkKKyAqIGR1cmluZyB0aGUge0BsaW5rIEZyYWdtZW50I29uU3RhcnQgb25TdGFydCgpfSBwaGFzZQorICogYW5kIHJlbW92aW5nIGl0IGR1cmluZyB0aGUge0BsaW5rIEZyYWdtZW50I29uU3RvcCBvblN0b3AoKX0gcGhhc2UuCisgKiA8L3A+PHA+CisgKiBUaGUgYXBwbGljYXRpb24gbXVzdCBzdXBwbHkgYSByb3V0ZSBzZWxlY3RvciB0byBzcGVjaWZ5IHRoZSBraW5kcyBvZiByb3V0ZXMKKyAqIHRvIGRpc2NvdmVyLiAgVGhlIGFwcGxpY2F0aW9uIG1heSBhbHNvIG92ZXJyaWRlIHtAbGluayAjb25DcmVhdGVDYWxsYmFja30gdG8KKyAqIHByb3ZpZGUgdGhlIHtAbGluayBNZWRpYVJvdXRlcn0gY2FsbGJhY2sgdG8gcmVnaXN0ZXIuCisgKiA8L3A+PHA+CisgKiBOb3RlIHRoYXQgdGhlIGRpc2NvdmVyeSBjYWxsYmFjayBtYWtlcyB0aGUgYXBwbGljYXRpb24gYmUgY29ubmVjdGVkIHdpdGggYWxsIHRoZQorICoge0BsaW5rIGFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHNlcnZpY2VzfQorICogd2hpbGUgaXQgaXMgcmVnaXN0ZXJlZC4KKyAqIDwvcD4KKyAqLworcHVibGljIGNsYXNzIE1lZGlhUm91dGVEaXNjb3ZlcnlGcmFnbWVudCBleHRlbmRzIEZyYWdtZW50IHsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBBUkdVTUVOVF9TRUxFQ1RPUiA9ICJzZWxlY3RvciI7CisKKyAgICBwcml2YXRlIE1lZGlhUm91dGVyIG1Sb3V0ZXI7CisgICAgcHJpdmF0ZSBNZWRpYVJvdXRlU2VsZWN0b3IgbVNlbGVjdG9yOworICAgIHByaXZhdGUgTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgbUNhbGxiYWNrOworCisgICAgcHVibGljIE1lZGlhUm91dGVEaXNjb3ZlcnlGcmFnbWVudCgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBtZWRpYSByb3V0ZXIgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIE1lZGlhUm91dGVyIGdldE1lZGlhUm91dGVyKCkgeworICAgICAgICBlbnN1cmVSb3V0ZXIoKTsKKyAgICAgICAgcmV0dXJuIG1Sb3V0ZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZVJvdXRlcigpIHsKKyAgICAgICAgaWYgKG1Sb3V0ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbVJvdXRlciA9IE1lZGlhUm91dGVyLmdldEluc3RhbmNlKGdldENvbnRleHQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBtZWRpYSByb3V0ZSBzZWxlY3RvciBmb3IgZmlsdGVyaW5nIHRoZSByb3V0ZXMgdG8gYmUgZGlzY292ZXJlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHNlbGVjdG9yLCBuZXZlciBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBNZWRpYVJvdXRlU2VsZWN0b3IgZ2V0Um91dGVTZWxlY3RvcigpIHsKKyAgICAgICAgZW5zdXJlUm91dGVTZWxlY3RvcigpOworICAgICAgICByZXR1cm4gbVNlbGVjdG9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGZvciBmaWx0ZXJpbmcgdGhlIHJvdXRlcyB0byBiZSBkaXNjb3ZlcmVkLgorICAgICAqIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgZnJhZ21lbnQgaXMgYWRkZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSb3V0ZVNlbGVjdG9yKE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvcikgeworICAgICAgICBpZiAoc2VsZWN0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VsZWN0b3IgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICB9CisKKyAgICAgICAgZW5zdXJlUm91dGVTZWxlY3RvcigpOworICAgICAgICBpZiAoIW1TZWxlY3Rvci5lcXVhbHMoc2VsZWN0b3IpKSB7CisgICAgICAgICAgICBtU2VsZWN0b3IgPSBzZWxlY3RvcjsKKworICAgICAgICAgICAgQnVuZGxlIGFyZ3MgPSBnZXRBcmd1bWVudHMoKTsKKyAgICAgICAgICAgIGlmIChhcmdzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhcmdzID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXJncy5wdXRCdW5kbGUoQVJHVU1FTlRfU0VMRUNUT1IsIHNlbGVjdG9yLmFzQnVuZGxlKCkpOworICAgICAgICAgICAgc2V0QXJndW1lbnRzKGFyZ3MpOworCisgICAgICAgICAgICBpZiAobUNhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtUm91dGVyLnJlbW92ZUNhbGxiYWNrKG1DYWxsYmFjayk7CisgICAgICAgICAgICAgICAgbVJvdXRlci5hZGRDYWxsYmFjayhtU2VsZWN0b3IsIG1DYWxsYmFjaywgb25QcmVwYXJlQ2FsbGJhY2tGbGFncygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBlbnN1cmVSb3V0ZVNlbGVjdG9yKCkgeworICAgICAgICBpZiAobVNlbGVjdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgIEJ1bmRsZSBhcmdzID0gZ2V0QXJndW1lbnRzKCk7CisgICAgICAgICAgICBpZiAoYXJncyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVNlbGVjdG9yID0gTWVkaWFSb3V0ZVNlbGVjdG9yLmZyb21CdW5kbGUoYXJncy5nZXRCdW5kbGUoQVJHVU1FTlRfU0VMRUNUT1IpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtU2VsZWN0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5FTVBUWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCB0byBjcmVhdGUgdGhlIHtAbGluayBhbmRyb2lkLnN1cHBvcnQudjcubWVkaWEuTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgY2FsbGJhY2t9CisgICAgICogdGhhdCB3aWxsIGJlIHJlZ2lzdGVyZWQuCisgICAgICogPHA+CisgICAgICogVGhlIGRlZmF1bHQgY2FsbGJhY2sgZG9lcyBub3RoaW5nLiAgVGhlIGFwcGxpY2F0aW9uIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0bworICAgICAqIHN1cHBseSBpdHMgb3duIGNhbGxiYWNrLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIG5ldyBjYWxsYmFjaywgb3IgbnVsbCBpZiBubyBjYWxsYmFjayBzaG91bGQgYmUgcmVnaXN0ZXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgb25DcmVhdGVDYWxsYmFjaygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVJvdXRlci5DYWxsYmFjaygpIHsgfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgdG8gcHJlcGFyZSB0aGUgY2FsbGJhY2sgZmxhZ3MgdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiB0aGUKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhLk1lZGlhUm91dGVyLkNhbGxiYWNrIGNhbGxiYWNrfSBpcyByZWdpc3RlcmVkLgorICAgICAqIDxwPgorICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMge0BsaW5rIE1lZGlhUm91dGVyI0NBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUll9LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGRlc2lyZWQgY2FsbGJhY2sgZmxhZ3MuCisgICAgICovCisgICAgcHVibGljIGludCBvblByZXBhcmVDYWxsYmFja0ZsYWdzKCkgeworICAgICAgICByZXR1cm4gTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblN0YXJ0KCkgeworICAgICAgICBzdXBlci5vblN0YXJ0KCk7CisKKyAgICAgICAgZW5zdXJlUm91dGVTZWxlY3RvcigpOworICAgICAgICBlbnN1cmVSb3V0ZXIoKTsKKyAgICAgICAgbUNhbGxiYWNrID0gb25DcmVhdGVDYWxsYmFjaygpOworICAgICAgICBpZiAobUNhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Sb3V0ZXIuYWRkQ2FsbGJhY2sobVNlbGVjdG9yLCBtQ2FsbGJhY2ssIG9uUHJlcGFyZUNhbGxiYWNrRmxhZ3MoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblN0b3AoKSB7CisgICAgICAgIGlmIChtQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgbVJvdXRlci5yZW1vdmVDYWxsYmFjayhtQ2FsbGJhY2spOworICAgICAgICAgICAgbUNhbGxiYWNrID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHN1cGVyLm9uU3RvcCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVFeHBhbmRDb2xsYXBzZUJ1dHRvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMGE5NWEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVFeHBhbmRDb2xsYXBzZUJ1dHRvbi5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yRmlsdGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmZDb2xvckZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkFuaW1hdGlvbkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5jb250ZW50LkNvbnRleHRDb21wYXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZUJ1dHRvbjsKKworaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5BcGlIZWxwZXI7CitpbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLlI7CisKKy8qKgorICogQ2hldnJvbi9DYXJldCBidXR0b24gdG8gZXhwYW5kL2NvbGxhcHNlIGdyb3VwIHZvbHVtZSBsaXN0IHdpdGggYW5pbWF0aW9uLgorICovCitwdWJsaWMgY2xhc3MgTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uIGV4dGVuZHMgSW1hZ2VCdXR0b24geworICAgIGZpbmFsIEFuaW1hdGlvbkRyYXdhYmxlIG1FeHBhbmRBbmltYXRpb25EcmF3YWJsZTsKKyAgICBmaW5hbCBBbmltYXRpb25EcmF3YWJsZSBtQ29sbGFwc2VBbmltYXRpb25EcmF3YWJsZTsKKyAgICBmaW5hbCBTdHJpbmcgbUV4cGFuZEdyb3VwRGVzY3JpcHRpb247CisgICAgZmluYWwgU3RyaW5nIG1Db2xsYXBzZUdyb3VwRGVzY3JpcHRpb247CisgICAgYm9vbGVhbiBtSXNHcm91cEV4cGFuZGVkOworICAgIE9uQ2xpY2tMaXN0ZW5lciBtTGlzdGVuZXI7CisKKyAgICBwdWJsaWMgTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uKENvbnRleHQgY29udGV4dCkgeworICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBNZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24oQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgMCk7CisgICAgfQorCisgICAgcHVibGljIE1lZGlhUm91dGVFeHBhbmRDb2xsYXBzZUJ1dHRvbihDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0cikgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyKTsKKyAgICAgICAgbUV4cGFuZEFuaW1hdGlvbkRyYXdhYmxlID0gKEFuaW1hdGlvbkRyYXdhYmxlKQorICAgICAgICAgICAgICAgIEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoY29udGV4dCkuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5tcl9ncm91cF9leHBhbmQpOworICAgICAgICBtQ29sbGFwc2VBbmltYXRpb25EcmF3YWJsZSA9IChBbmltYXRpb25EcmF3YWJsZSkKKyAgICAgICAgICAgICAgICBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGNvbnRleHQpLmdldERyYXdhYmxlKFIuZHJhd2FibGUubXJfZ3JvdXBfY29sbGFwc2UpOworCisgICAgICAgIENvbG9yRmlsdGVyIGZpbHRlciA9IG5ldyBQb3J0ZXJEdWZmQ29sb3JGaWx0ZXIoCisgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXRDb250cm9sbGVyQ29sb3IoY29udGV4dCwgZGVmU3R5bGVBdHRyKSwKKyAgICAgICAgICAgICAgICBQb3J0ZXJEdWZmLk1vZGUuU1JDX0lOKTsKKyAgICAgICAgbUV4cGFuZEFuaW1hdGlvbkRyYXdhYmxlLnNldENvbG9yRmlsdGVyKGZpbHRlcik7CisgICAgICAgIG1Db2xsYXBzZUFuaW1hdGlvbkRyYXdhYmxlLnNldENvbG9yRmlsdGVyKGZpbHRlcik7CisKKyAgICAgICAgbUV4cGFuZEdyb3VwRGVzY3JpcHRpb24gPQorICAgICAgICAgICAgICAgIEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoY29udGV4dCkuZ2V0U3RyaW5nKFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwKTsKKyAgICAgICAgbUNvbGxhcHNlR3JvdXBEZXNjcmlwdGlvbiA9CisgICAgICAgICAgICAgICAgQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhjb250ZXh0KS5nZXRTdHJpbmcoUi5zdHJpbmcubXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCk7CisKKyAgICAgICAgc2V0SW1hZ2VEcmF3YWJsZShtRXhwYW5kQW5pbWF0aW9uRHJhd2FibGUuZ2V0RnJhbWUoMCkpOworICAgICAgICBzZXRDb250ZW50RGVzY3JpcHRpb24obUV4cGFuZEdyb3VwRGVzY3JpcHRpb24pOworCisgICAgICAgIHN1cGVyLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdmlldykgeworICAgICAgICAgICAgICAgIG1Jc0dyb3VwRXhwYW5kZWQgPSAhbUlzR3JvdXBFeHBhbmRlZDsKKyAgICAgICAgICAgICAgICBpZiAobUlzR3JvdXBFeHBhbmRlZCkgeworICAgICAgICAgICAgICAgICAgICBzZXRJbWFnZURyYXdhYmxlKG1FeHBhbmRBbmltYXRpb25EcmF3YWJsZSk7CisgICAgICAgICAgICAgICAgICAgIG1FeHBhbmRBbmltYXRpb25EcmF3YWJsZS5zdGFydCgpOworICAgICAgICAgICAgICAgICAgICBzZXRDb250ZW50RGVzY3JpcHRpb24obUNvbGxhcHNlR3JvdXBEZXNjcmlwdGlvbik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0SW1hZ2VEcmF3YWJsZShtQ29sbGFwc2VBbmltYXRpb25EcmF3YWJsZSk7CisgICAgICAgICAgICAgICAgICAgIG1Db2xsYXBzZUFuaW1hdGlvbkRyYXdhYmxlLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgICAgIHNldENvbnRlbnREZXNjcmlwdGlvbihtRXhwYW5kR3JvdXBEZXNjcmlwdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtTGlzdGVuZXIub25DbGljayh2aWV3KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldE9uQ2xpY2tMaXN0ZW5lcihPbkNsaWNrTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlVm9sdW1lU2xpZGVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVWb2x1bWVTbGlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDVkMjBlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlVm9sdW1lU2xpZGVyLmphdmEKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TZWVrQmFyOworCisvKioKKyAqIFZvbHVtZSBzbGlkZXIgd2l0aCBzaG93aW5nLCBoaWRpbmcsIGFuZCBhcHBseWluZyBhbHBoYSBzdXBwb3J0cyB0byB0aGUgdGh1bWIuCisgKi8KK3B1YmxpYyBjbGFzcyBNZWRpYVJvdXRlVm9sdW1lU2xpZGVyIGV4dGVuZHMgU2Vla0JhciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVJvdXRlVm9sdW1lU2xpZGVyIjsKKworICAgIHByaXZhdGUgZmluYWwgZmxvYXQgbURpc2FibGVkQWxwaGE7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbUhpZGVUaHVtYjsKKyAgICBwcml2YXRlIERyYXdhYmxlIG1UaHVtYjsKKyAgICBwcml2YXRlIGludCBtQ29sb3I7CisKKyAgICBwdWJsaWMgTWVkaWFSb3V0ZVZvbHVtZVNsaWRlcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVkaWFSb3V0ZVZvbHVtZVNsaWRlcihDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisgICAgICAgIG1EaXNhYmxlZEFscGhhID0gTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXREaXNhYmxlZEFscGhhKGNvbnRleHQpOworICAgIH0KKworICAgIHB1YmxpYyBNZWRpYVJvdXRlVm9sdW1lU2xpZGVyKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIpOworICAgICAgICBtRGlzYWJsZWRBbHBoYSA9IE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0RGlzYWJsZWRBbHBoYShjb250ZXh0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBkcmF3YWJsZVN0YXRlQ2hhbmdlZCgpIHsKKyAgICAgICAgc3VwZXIuZHJhd2FibGVTdGF0ZUNoYW5nZWQoKTsKKyAgICAgICAgaW50IGFscGhhID0gaXNFbmFibGVkKCkgPyAweEZGIDogKGludCkgKDB4RkYgKiBtRGlzYWJsZWRBbHBoYSk7CisKKyAgICAgICAgLy8gVGhlIHRodW1iIGRyYXdhYmxlIGlzIGEgY29sbGVjdGlvbiBvZiBkcmF3YWJsZXMgYW5kIGl0cyBjdXJyZW50IGRyYXdhYmxlcyBhcmUgY2hhbmdlZCBwZXIKKyAgICAgICAgLy8gc3RhdGUuIEFwcGx5IHRoZSBjb2xvciBmaWx0ZXIgYW5kIGFscGhhIG9uIGV2ZXJ5IHN0YXRlIGNoYW5nZS4KKyAgICAgICAgaWYgKG1UaHVtYiAhPSBudWxsKSB7CisgICAgICAgICAgICBtVGh1bWIuc2V0Q29sb3JGaWx0ZXIobUNvbG9yLCBQb3J0ZXJEdWZmLk1vZGUuU1JDX0lOKTsKKyAgICAgICAgICAgIG1UaHVtYi5zZXRBbHBoYShhbHBoYSk7CisgICAgICAgIH0KKworICAgICAgICBnZXRQcm9ncmVzc0RyYXdhYmxlKCkuc2V0Q29sb3JGaWx0ZXIobUNvbG9yLCBQb3J0ZXJEdWZmLk1vZGUuU1JDX0lOKTsKKyAgICAgICAgZ2V0UHJvZ3Jlc3NEcmF3YWJsZSgpLnNldEFscGhhKGFscGhhKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRUaHVtYihEcmF3YWJsZSB0aHVtYikgeworICAgICAgICBtVGh1bWIgPSB0aHVtYjsKKyAgICAgICAgc3VwZXIuc2V0VGh1bWIobUhpZGVUaHVtYiA/IG51bGwgOiBtVGh1bWIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciB0byBzaG93IG9yIGhpZGUgdGh1bWIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SGlkZVRodW1iKGJvb2xlYW4gaGlkZVRodW1iKSB7CisgICAgICAgIGlmIChtSGlkZVRodW1iID09IGhpZGVUaHVtYikgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1IaWRlVGh1bWIgPSBoaWRlVGh1bWI7CisgICAgICAgIHN1cGVyLnNldFRodW1iKG1IaWRlVGh1bWIgPyBudWxsIDogbVRodW1iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2b2x1bWUgc2xpZGVyIGNvbG9yLiBUaGUgY2hhbmdlIHRha2VzIGVmZmVjdCBuZXh0IHRpbWUgZHJhd2FibGUgc3RhdGUgaXMgY2hhbmdlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY29sb3IgY2Fubm90IGJlIHRyYW5zbHVjZW50LCBvdGhlcndpc2UgdGhlIHVuZGVybHlpbmcgcHJvZ3Jlc3MgYmFyIHdpbGwgYmUgc2VlbiB0aHJvdWdoCisgICAgICogdGhlIHRodW1iLgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb2xvcihpbnQgY29sb3IpIHsKKyAgICAgICAgaWYgKG1Db2xvciA9PSBjb2xvcikgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChDb2xvci5hbHBoYShjb2xvcikgIT0gMHhGRikgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiVm9sdW1lIHNsaWRlciBjb2xvciBjYW5ub3QgYmUgdHJhbnNsdWNlbnQ6ICMiICsgSW50ZWdlci50b0hleFN0cmluZyhjb2xvcikpOworICAgICAgICB9CisgICAgICAgIG1Db2xvciA9IGNvbG9yOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlclRoZW1lSGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNmMDQyZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5qYXZhCkBAIC0wLDAgKzEsMjEyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uSW50RGVmOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5ncmFwaGljcy5Db2xvclV0aWxzOworaW1wb3J0IGFuZHJvaWQudXRpbC5UeXBlZFZhbHVlOworaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0VGhlbWVXcmFwcGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitpbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLlI7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworCitmaW5hbCBjbGFzcyBNZWRpYVJvdXRlclRoZW1lSGVscGVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBNSU5fQ09OVFJBU1QgPSAzLjBmOworCisgICAgQEludERlZih7Q09MT1JfREFSS19PTl9MSUdIVF9CQUNLR1JPVU5ELCBDT0xPUl9XSElURV9PTl9EQVJLX0JBQ0tHUk9VTkR9KQorICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKKyAgICBwcml2YXRlIEBpbnRlcmZhY2UgQ29udHJvbGxlckNvbG9yVHlwZSB7fQorCisgICAgc3RhdGljIGZpbmFsIGludCBDT0xPUl9EQVJLX09OX0xJR0hUX0JBQ0tHUk9VTkQgPSAweERFMDAwMDAwOyAvKiBPcGFjaXR5IG9mIDg3JSAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfV0hJVEVfT05fREFSS19CQUNLR1JPVU5EID0gQ29sb3IuV0hJVEU7CisKKyAgICBwcml2YXRlIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIoKSB7CisgICAgfQorCisgICAgc3RhdGljIENvbnRleHQgY3JlYXRlVGhlbWVkQnV0dG9uQ29udGV4dChDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgLy8gQXBwbHkgYmFzZSBNZWRpYSBSb3V0ZXIgdGhlbWUuCisgICAgICAgIGNvbnRleHQgPSBuZXcgQ29udGV4dFRoZW1lV3JhcHBlcihjb250ZXh0LCBnZXRSb3V0ZXJUaGVtZUlkKGNvbnRleHQpKTsKKworICAgICAgICAvLyBBcHBseSBjdXN0b20gTWVkaWEgUm91dGVyIHRoZW1lLgorICAgICAgICBpbnQgc3R5bGUgPSBnZXRUaGVtZVJlc291cmNlKGNvbnRleHQsIFIuYXR0ci5tZWRpYVJvdXRlVGhlbWUpOworICAgICAgICBpZiAoc3R5bGUgIT0gMCkgeworICAgICAgICAgICAgY29udGV4dCA9IG5ldyBDb250ZXh0VGhlbWVXcmFwcGVyKGNvbnRleHQsIHN0eWxlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjb250ZXh0OworICAgIH0KKworICAgIC8qCisgICAgICogVGhlIGZvbGxvd2luZyB0d28gbWV0aG9kcyBhcmUgdG8gYmUgdXNlZCBpbiBjb25qdW5jdGlvbi4gVGhleSBzaG91bGQgYmUgdXNlZCB0byBwcmVwYXJlCisgICAgICogdGhlIGNvbnRleHQgYW5kIHRoZW1lIGZvciBhIHN1cGVyIGNsYXNzIGNvbnN0cnVjdG9yICh0aGUgbGF0dGVyIG1ldGhvZCByZWxpZXMgb24gdGhlCisgICAgICogZm9ybWVyIG1ldGhvZCB0byBwcm9wZXJseSBwcmVwYXJlIHRoZSBjb250ZXh0KToKKyAgICAgKiAgIHN1cGVyKGNvbnRleHQgPSBjcmVhdGVUaGVtZWREaWFsb2dDb250ZXh0KGNvbnRleHQsIHRoZW1lKSwKKyAgICAgKiAgICAgICAgICAgY3JlYXRlVGhlbWVkRGlhbG9nU3R5bGUoY29udGV4dCkpOworICAgICAqCisgICAgICogSXQgd2lsbCBhcHBseSB0aGVtZSBpbiB0aGUgZm9sbG93aW5nIG9yZGVyIChzdHlsZSBsb29rdXBzIHdpbGwgYmUgZG9uZSBpbiByZXZlcnNlKToKKyAgICAgKiAgIDEpIEN1cnJlbnQgdGhlbWUKKyAgICAgKiAgIDIpIFN1cHBsaWVkIHRoZW1lCisgICAgICogICAzKSBCYXNlIE1lZGlhIFJvdXRlciB0aGVtZQorICAgICAqICAgNCkgQ3VzdG9tIE1lZGlhIFJvdXRlciB0aGVtZSwgaWYgcHJvdmlkZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgQ29udGV4dCBjcmVhdGVUaGVtZWREaWFsb2dDb250ZXh0KENvbnRleHQgY29udGV4dCwgaW50IHRoZW1lLCBib29sZWFuIGFsZXJ0RGlhbG9nKSB7CisgICAgICAgIC8vIDEpIEN1cnJlbnQgdGhlbWUgaXMgYWxyZWFkeSBhcHBsaWVkIHRvIHRoZSBjb250ZXh0CisKKyAgICAgICAgLy8gMikgSWYgbm8gdGhlbWUgaXMgc3VwcGxpZWQsIGxvb2sgaXQgdXAgZnJvbSB0aGUgY29udGV4dCAoZGlhbG9nVGhlbWUvYWxlcnREaWFsb2dUaGVtZSkKKyAgICAgICAgaWYgKHRoZW1lID09IDApIHsKKyAgICAgICAgICAgIHRoZW1lID0gZ2V0VGhlbWVSZXNvdXJjZShjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAhYWxlcnREaWFsb2cgPyBhbmRyb2lkLlIuYXR0ci5kaWFsb2dUaGVtZSA6IGFuZHJvaWQuUi5hdHRyLmFsZXJ0RGlhbG9nVGhlbWUpOworICAgICAgICB9CisgICAgICAgIC8vICAgIEFwcGx5IGl0CisgICAgICAgIGNvbnRleHQgPSBuZXcgQ29udGV4dFRoZW1lV3JhcHBlcihjb250ZXh0LCB0aGVtZSk7CisKKyAgICAgICAgLy8gMykgSWYgYSBjdXN0b20gTWVkaWEgUm91dGVyIHRoZW1lIGlzIHByb3ZpZGVkIHRoZW4gYXBwbHkgdGhlIGJhc2UgdGhlbWUKKyAgICAgICAgaWYgKGdldFRoZW1lUmVzb3VyY2UoY29udGV4dCwgUi5hdHRyLm1lZGlhUm91dGVUaGVtZSkgIT0gMCkgeworICAgICAgICAgICAgY29udGV4dCA9IG5ldyBDb250ZXh0VGhlbWVXcmFwcGVyKGNvbnRleHQsIGdldFJvdXRlclRoZW1lSWQoY29udGV4dCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNvbnRleHQ7CisgICAgfQorICAgIC8vIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIHByZXZpb3VzIG1ldGhvZC4KKyAgICBzdGF0aWMgaW50IGNyZWF0ZVRoZW1lZERpYWxvZ1N0eWxlKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAvLyA0KSBBcHBseSB0aGUgY3VzdG9tIE1lZGlhIFJvdXRlciB0aGVtZQorICAgICAgICBpbnQgdGhlbWUgPSBnZXRUaGVtZVJlc291cmNlKGNvbnRleHQsIFIuYXR0ci5tZWRpYVJvdXRlVGhlbWUpOworICAgICAgICBpZiAodGhlbWUgPT0gMCkgeworICAgICAgICAgICAgLy8gMykgTm8gY3VzdG9tIE1lZGlhUm91dGVyIHRoZW1lIHdhcyBwcm92aWRlZCBzbyBhcHBseSB0aGUgYmFzZSB0aGVtZSBpbnN0ZWFkCisgICAgICAgICAgICB0aGVtZSA9IGdldFJvdXRlclRoZW1lSWQoY29udGV4dCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdGhlbWU7CisgICAgfQorICAgIC8vIEVORC4gUHJldmlvdXMgdHdvIG1ldGhvZHMgc2hvdWxkIGJlIHVzZWQgaW4gY29uanVuY3Rpb24uCisKKyAgICBzdGF0aWMgaW50IGdldFRoZW1lUmVzb3VyY2UoQ29udGV4dCBjb250ZXh0LCBpbnQgYXR0cikgeworICAgICAgICBUeXBlZFZhbHVlIHZhbHVlID0gbmV3IFR5cGVkVmFsdWUoKTsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0VGhlbWUoKS5yZXNvbHZlQXR0cmlidXRlKGF0dHIsIHZhbHVlLCB0cnVlKSA/IHZhbHVlLnJlc291cmNlSWQgOiAwOworICAgIH0KKworICAgIHN0YXRpYyBmbG9hdCBnZXREaXNhYmxlZEFscGhhKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBUeXBlZFZhbHVlIHZhbHVlID0gbmV3IFR5cGVkVmFsdWUoKTsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0VGhlbWUoKS5yZXNvbHZlQXR0cmlidXRlKGFuZHJvaWQuUi5hdHRyLmRpc2FibGVkQWxwaGEsIHZhbHVlLCB0cnVlKQorICAgICAgICAgICAgICAgID8gdmFsdWUuZ2V0RmxvYXQoKSA6IDAuNWY7CisgICAgfQorCisgICAgc3RhdGljIEBDb250cm9sbGVyQ29sb3JUeXBlIGludCBnZXRDb250cm9sbGVyQ29sb3IoQ29udGV4dCBjb250ZXh0LCBpbnQgc3R5bGUpIHsKKyAgICAgICAgaW50IHByaW1hcnlDb2xvciA9IGdldFRoZW1lQ29sb3IoY29udGV4dCwgc3R5bGUsIGFuZHJvaWQuUi5hdHRyLmNvbG9yUHJpbWFyeSk7CisgICAgICAgIGlmIChwcmltYXJ5Q29sb3IgPT0gMCkgeworICAgICAgICAgICAgcHJpbWFyeUNvbG9yID0gZ2V0VGhlbWVDb2xvcihjb250ZXh0LCBzdHlsZSwgYW5kcm9pZC5SLmF0dHIuY29sb3JQcmltYXJ5KTsKKyAgICAgICAgICAgIGlmIChwcmltYXJ5Q29sb3IgPT0gMCkgeworICAgICAgICAgICAgICAgIHByaW1hcnlDb2xvciA9IDB4RkYwMDAwMDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKENvbG9yVXRpbHMuY2FsY3VsYXRlQ29udHJhc3QoQ09MT1JfV0hJVEVfT05fREFSS19CQUNLR1JPVU5ELCBwcmltYXJ5Q29sb3IpCisgICAgICAgICAgICAgICAgPj0gTUlOX0NPTlRSQVNUKSB7CisgICAgICAgICAgICByZXR1cm4gQ09MT1JfV0hJVEVfT05fREFSS19CQUNLR1JPVU5EOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDT0xPUl9EQVJLX09OX0xJR0hUX0JBQ0tHUk9VTkQ7CisgICAgfQorCisgICAgc3RhdGljIGludCBnZXRCdXR0b25UZXh0Q29sb3IoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGludCBwcmltYXJ5Q29sb3IgPSBnZXRUaGVtZUNvbG9yKGNvbnRleHQsIDAsIGFuZHJvaWQuUi5hdHRyLmNvbG9yUHJpbWFyeSk7CisgICAgICAgIGludCBiYWNrZ3JvdW5kQ29sb3IgPSBnZXRUaGVtZUNvbG9yKGNvbnRleHQsIDAsIGFuZHJvaWQuUi5hdHRyLmNvbG9yQmFja2dyb3VuZCk7CisKKyAgICAgICAgaWYgKENvbG9yVXRpbHMuY2FsY3VsYXRlQ29udHJhc3QocHJpbWFyeUNvbG9yLCBiYWNrZ3JvdW5kQ29sb3IpIDwgTUlOX0NPTlRSQVNUKSB7CisgICAgICAgICAgICAvLyBEZWZhdWx0IHRvIGNvbG9yQWNjZW50IGlmIHRoZSBjb250cmFzdCByYXRpbyBpcyBsb3cuCisgICAgICAgICAgICByZXR1cm4gZ2V0VGhlbWVDb2xvcihjb250ZXh0LCAwLCBhbmRyb2lkLlIuYXR0ci5jb2xvckFjY2VudCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHByaW1hcnlDb2xvcjsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBzZXRNZWRpYUNvbnRyb2xzQmFja2dyb3VuZENvbG9yKAorICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LCBWaWV3IG1haW5Db250cm9scywgVmlldyBncm91cENvbnRyb2xzLCBib29sZWFuIGhhc0dyb3VwKSB7CisgICAgICAgIGludCBwcmltYXJ5Q29sb3IgPSBnZXRUaGVtZUNvbG9yKGNvbnRleHQsIDAsIGFuZHJvaWQuUi5hdHRyLmNvbG9yUHJpbWFyeSk7CisgICAgICAgIGludCBwcmltYXJ5RGFya0NvbG9yID0gZ2V0VGhlbWVDb2xvcihjb250ZXh0LCAwLCBhbmRyb2lkLlIuYXR0ci5jb2xvclByaW1hcnlEYXJrKTsKKyAgICAgICAgaWYgKGhhc0dyb3VwICYmIGdldENvbnRyb2xsZXJDb2xvcihjb250ZXh0LCAwKSA9PSBDT0xPUl9EQVJLX09OX0xJR0hUX0JBQ0tHUk9VTkQpIHsKKyAgICAgICAgICAgIC8vIEluc3RlYWQgb2Ygc2hvd2luZyBkYXJrIGNvbnRyb2xzIGluIGEgcG9zc2libHkgZGFyayAoaS5lLiB0aGUgcHJpbWFyeSBkYXJrKSwgbW9kZWwKKyAgICAgICAgICAgIC8vIHRoZSB3aGl0ZSBkaWFsb2cgYW5kIHVzZSB0aGUgcHJpbWFyeSBjb2xvciBmb3IgdGhlIGdyb3VwIGNvbnRyb2xzLgorICAgICAgICAgICAgcHJpbWFyeURhcmtDb2xvciA9IHByaW1hcnlDb2xvcjsKKyAgICAgICAgICAgIHByaW1hcnlDb2xvciA9IENvbG9yLldISVRFOworICAgICAgICB9CisgICAgICAgIG1haW5Db250cm9scy5zZXRCYWNrZ3JvdW5kQ29sb3IocHJpbWFyeUNvbG9yKTsKKyAgICAgICAgZ3JvdXBDb250cm9scy5zZXRCYWNrZ3JvdW5kQ29sb3IocHJpbWFyeURhcmtDb2xvcik7CisgICAgICAgIC8vIEFsc28gc3RvcmUgdGhlIGJhY2tncm91bmQgY29sb3JzIHRvIHRoZSB2aWV3IHRhZ3MuIFRoZXkgYXJlIHVzZWQgaW4KKyAgICAgICAgLy8gc2V0Vm9sdW1lU2xpZGVyQ29sb3IoKSBiZWxvdy4KKyAgICAgICAgbWFpbkNvbnRyb2xzLnNldFRhZyhwcmltYXJ5Q29sb3IpOworICAgICAgICBncm91cENvbnRyb2xzLnNldFRhZyhwcmltYXJ5RGFya0NvbG9yKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBzZXRWb2x1bWVTbGlkZXJDb2xvcigKKyAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwgTWVkaWFSb3V0ZVZvbHVtZVNsaWRlciB2b2x1bWVTbGlkZXIsIFZpZXcgYmFja2dyb3VuZFZpZXcpIHsKKyAgICAgICAgaW50IGNvbnRyb2xsZXJDb2xvciA9IGdldENvbnRyb2xsZXJDb2xvcihjb250ZXh0LCAwKTsKKyAgICAgICAgaWYgKENvbG9yLmFscGhhKGNvbnRyb2xsZXJDb2xvcikgIT0gMHhGRikgeworICAgICAgICAgICAgLy8gQ29tcG9zaXRlIHdpdGggdGhlIGJhY2tncm91bmQgaW4gb3JkZXIgbm90IHRvIHNob3cgdGhlIHVuZGVybHlpbmcgcHJvZ3Jlc3MgYmFyCisgICAgICAgICAgICAvLyB0aHJvdWdoIHRoZSB0aHVtYi4KKyAgICAgICAgICAgIGludCBiYWNrZ3JvdW5kQ29sb3IgPSAoaW50KSBiYWNrZ3JvdW5kVmlldy5nZXRUYWcoKTsKKyAgICAgICAgICAgIGNvbnRyb2xsZXJDb2xvciA9IENvbG9yVXRpbHMuY29tcG9zaXRlQ29sb3JzKGNvbnRyb2xsZXJDb2xvciwgYmFja2dyb3VuZENvbG9yKTsKKyAgICAgICAgfQorICAgICAgICB2b2x1bWVTbGlkZXIuc2V0Q29sb3IoY29udHJvbGxlckNvbG9yKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTGlnaHRUaGVtZShDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgVHlwZWRWYWx1ZSB2YWx1ZSA9IG5ldyBUeXBlZFZhbHVlKCk7CisgICAgICAgIC8vIFRPRE8oc3VuZ3Nvbyk6IFN3aXRjaCB0byBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmF0dHIuaXNMaWdodFRoZW1lCisgICAgICAgIHJldHVybiBjb250ZXh0LmdldFRoZW1lKCkucmVzb2x2ZUF0dHJpYnV0ZShhbmRyb2lkLnN1cHBvcnQudjcuYXBwY29tcGF0LlIuYXR0ci5pc0xpZ2h0VGhlbWUsCisgICAgICAgICAgICAgICAgdmFsdWUsIHRydWUpICYmIHZhbHVlLmRhdGEgIT0gMDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VGhlbWVDb2xvcihDb250ZXh0IGNvbnRleHQsIGludCBzdHlsZSwgaW50IGF0dHIpIHsKKyAgICAgICAgaWYgKHN0eWxlICE9IDApIHsKKyAgICAgICAgICAgIGludFtdIGF0dHJzID0geyBhdHRyIH07CisgICAgICAgICAgICBUeXBlZEFycmF5IHRhID0gY29udGV4dC5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKHN0eWxlLCBhdHRycyk7CisgICAgICAgICAgICBpbnQgY29sb3IgPSB0YS5nZXRDb2xvcigwLCAwKTsKKyAgICAgICAgICAgIHRhLnJlY3ljbGUoKTsKKyAgICAgICAgICAgIGlmIChjb2xvciAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbG9yOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFR5cGVkVmFsdWUgdmFsdWUgPSBuZXcgVHlwZWRWYWx1ZSgpOworICAgICAgICBjb250ZXh0LmdldFRoZW1lKCkucmVzb2x2ZUF0dHJpYnV0ZShhdHRyLCB2YWx1ZSwgdHJ1ZSk7CisgICAgICAgIGlmICh2YWx1ZS5yZXNvdXJjZUlkICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldFJlc291cmNlcygpLmdldENvbG9yKHZhbHVlLnJlc291cmNlSWQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWx1ZS5kYXRhOworICAgIH0KKworICAgIHN0YXRpYyBpbnQgZ2V0Um91dGVyVGhlbWVJZChDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgaW50IHRoZW1lSWQ7CisgICAgICAgIGlmIChpc0xpZ2h0VGhlbWUoY29udGV4dCkpIHsKKyAgICAgICAgICAgIGlmIChnZXRDb250cm9sbGVyQ29sb3IoY29udGV4dCwgMCkgPT0gQ09MT1JfREFSS19PTl9MSUdIVF9CQUNLR1JPVU5EKSB7CisgICAgICAgICAgICAgICAgdGhlbWVJZCA9IFIuc3R5bGUuVGhlbWVfTWVkaWFSb3V0ZXJfTGlnaHQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRoZW1lSWQgPSBSLnN0eWxlLlRoZW1lX01lZGlhUm91dGVyX0xpZ2h0X0RhcmtDb250cm9sUGFuZWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoZ2V0Q29udHJvbGxlckNvbG9yKGNvbnRleHQsIDApID09IENPTE9SX0RBUktfT05fTElHSFRfQkFDS0dST1VORCkgeworICAgICAgICAgICAgICAgIHRoZW1lSWQgPSBSLnN0eWxlLlRoZW1lX01lZGlhUm91dGVyX0xpZ2h0Q29udHJvbFBhbmVsOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aGVtZUlkID0gUi5zdHlsZS5UaGVtZV9NZWRpYVJvdXRlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhlbWVJZDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL092ZXJsYXlMaXN0Vmlldy5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9PdmVybGF5TGlzdFZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDBkZWUyCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9PdmVybGF5TGlzdFZpZXcuamF2YQpAQCAtMCwwICsxLDI2NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkJpdG1hcERyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3I7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBBIExpc3RWaWV3IHdoaWNoIGhhcyBhbiBhZGRpdGlvbmFsIG92ZXJsYXkgbGF5ZXIuIHtAbGluayBCaXRtYXBEcmF3YWJsZX0KKyAqIGNhbiBiZSBhZGRlZCB0byB0aGUgbGF5ZXIgYW5kIGNhbiBiZSBhbmltYXRlZC4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE92ZXJsYXlMaXN0VmlldyBleHRlbmRzIExpc3RWaWV3IHsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8T3ZlcmxheU9iamVjdD4gbU92ZXJsYXlPYmplY3RzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICBwdWJsaWMgT3ZlcmxheUxpc3RWaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgT3ZlcmxheUxpc3RWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT3ZlcmxheUxpc3RWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYW4gb2JqZWN0IHRvIHRoZSBvdmVybGF5IGxheWVyLgorICAgICAqCisgICAgICogQHBhcmFtIG9iamVjdCBBbiBvYmplY3QgdG8gYmUgYWRkZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkT3ZlcmxheU9iamVjdChPdmVybGF5T2JqZWN0IG9iamVjdCkgeworICAgICAgICBtT3ZlcmxheU9iamVjdHMuYWRkKG9iamVjdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnRzIGFsbCBhbmltYXRpb25zIG9mIG9iamVjdHMgaW4gdGhlIG92ZXJsYXkgbGF5ZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRBbmltYXRpb25BbGwoKSB7CisgICAgICAgIGZvciAoT3ZlcmxheU9iamVjdCBvYmplY3QgOiBtT3ZlcmxheU9iamVjdHMpIHsKKyAgICAgICAgICAgIGlmICghb2JqZWN0LmlzQW5pbWF0aW9uU3RhcnRlZCgpKSB7CisgICAgICAgICAgICAgICAgb2JqZWN0LnN0YXJ0QW5pbWF0aW9uKGdldERyYXdpbmdUaW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcHMgYWxsIGFuaW1hdGlvbnMgb2Ygb2JqZWN0cyBpbiB0aGUgb3ZlcmxheSBsYXllci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wQW5pbWF0aW9uQWxsKCkgeworICAgICAgICBmb3IgKE92ZXJsYXlPYmplY3Qgb2JqZWN0IDogbU92ZXJsYXlPYmplY3RzKSB7CisgICAgICAgICAgICBvYmplY3Quc3RvcEFuaW1hdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7CisgICAgICAgIGlmIChtT3ZlcmxheU9iamVjdHMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgSXRlcmF0b3I8T3ZlcmxheU9iamVjdD4gaXQgPSBtT3ZlcmxheU9iamVjdHMuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBPdmVybGF5T2JqZWN0IG9iamVjdCA9IGl0Lm5leHQoKTsKKyAgICAgICAgICAgICAgICBCaXRtYXBEcmF3YWJsZSBiaXRtYXAgPSBvYmplY3QuZ2V0Qml0bWFwRHJhd2FibGUoKTsKKyAgICAgICAgICAgICAgICBpZiAoYml0bWFwICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYml0bWFwLmRyYXcoY2FudmFzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFvYmplY3QudXBkYXRlKGdldERyYXdpbmdUaW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGl0LnJlbW92ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgY2xhc3MgdGhhdCByZXByZXNlbnRzIGFuIG9iamVjdCB0byBiZSBzaG93biBpbiB0aGUgb3ZlcmxheSBsYXllci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE92ZXJsYXlPYmplY3QgeworICAgICAgICBwcml2YXRlIEJpdG1hcERyYXdhYmxlIG1CaXRtYXA7CisgICAgICAgIHByaXZhdGUgZmxvYXQgbUN1cnJlbnRBbHBoYSA9IDEuMGY7CisgICAgICAgIHByaXZhdGUgUmVjdCBtQ3VycmVudEJvdW5kczsKKyAgICAgICAgcHJpdmF0ZSBJbnRlcnBvbGF0b3IgbUludGVycG9sYXRvcjsKKyAgICAgICAgcHJpdmF0ZSBsb25nIG1EdXJhdGlvbjsKKyAgICAgICAgcHJpdmF0ZSBSZWN0IG1TdGFydFJlY3Q7CisgICAgICAgIHByaXZhdGUgaW50IG1EZWx0YVk7CisgICAgICAgIHByaXZhdGUgZmxvYXQgbVN0YXJ0QWxwaGEgPSAxLjBmOworICAgICAgICBwcml2YXRlIGZsb2F0IG1FbmRBbHBoYSA9IDEuMGY7CisgICAgICAgIHByaXZhdGUgbG9uZyBtU3RhcnRUaW1lOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUlzQW5pbWF0aW9uU3RhcnRlZDsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Jc0FuaW1hdGlvbkVuZGVkOworICAgICAgICBwcml2YXRlIE9uQW5pbWF0aW9uRW5kTGlzdGVuZXIgbUxpc3RlbmVyOworCisgICAgICAgIHB1YmxpYyBPdmVybGF5T2JqZWN0KEJpdG1hcERyYXdhYmxlIGJpdG1hcCwgUmVjdCBzdGFydFJlY3QpIHsKKyAgICAgICAgICAgIG1CaXRtYXAgPSBiaXRtYXA7CisgICAgICAgICAgICBtU3RhcnRSZWN0ID0gc3RhcnRSZWN0OworICAgICAgICAgICAgbUN1cnJlbnRCb3VuZHMgPSBuZXcgUmVjdChzdGFydFJlY3QpOworICAgICAgICAgICAgaWYgKG1CaXRtYXAgIT0gbnVsbCAmJiBtQ3VycmVudEJvdW5kcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUJpdG1hcC5zZXRBbHBoYSgoaW50KSAobUN1cnJlbnRBbHBoYSAqIDI1NSkpOworICAgICAgICAgICAgICAgIG1CaXRtYXAuc2V0Qm91bmRzKG1DdXJyZW50Qm91bmRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBiaXRtYXAgdGhhdCB0aGlzIG9iamVjdCByZXByZXNlbnRzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIEJpdG1hcERyYXdhYmxlIHRoYXQgdGhpcyBvYmplY3QgaGFzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJpdG1hcERyYXdhYmxlIGdldEJpdG1hcERyYXdhYmxlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1CaXRtYXA7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgc3RhcnRlZCBzdGF0dXMgb2YgdGhlIGFuaW1hdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBhbmltYXRpb24gaGFzIHN0YXJ0ZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQW5pbWF0aW9uU3RhcnRlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtSXNBbmltYXRpb25TdGFydGVkOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgYW5pbWF0aW9uIGZvciB2YXJ5aW5nIGFscGhhLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc3RhcnRBbHBoYSBTdGFydGluZyBhbHBoYSB2YWx1ZSBmb3IgdGhlIGFuaW1hdGlvbiwgd2hlcmUgMS4wIG1lYW5zCisgICAgICAgICAqIGZ1bGx5IG9wYXF1ZSBhbmQgMC4wIG1lYW5zIGZ1bGx5IHRyYW5zcGFyZW50LgorICAgICAgICAgKiBAcGFyYW0gZW5kQWxwaGEgRW5kaW5nIGFscGhhIHZhbHVlIGZvciB0aGUgYW5pbWF0aW9uLgorICAgICAgICAgKiBAcmV0dXJuIFRoaXMgT3ZlcmxheU9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5pbmcgb2YgY2FsbHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgT3ZlcmxheU9iamVjdCBzZXRBbHBoYUFuaW1hdGlvbihmbG9hdCBzdGFydEFscGhhLCBmbG9hdCBlbmRBbHBoYSkgeworICAgICAgICAgICAgbVN0YXJ0QWxwaGEgPSBzdGFydEFscGhhOworICAgICAgICAgICAgbUVuZEFscGhhID0gZW5kQWxwaGE7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIGFuaW1hdGlvbiBmb3IgbW92aW5nIG9iamVjdHMgdmVydGljYWxseS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGRlbHRhWSBEaXN0YW5jZSB0byBtb3ZlIGluIHBpeGVscy4KKyAgICAgICAgICogQHJldHVybiBUaGlzIE92ZXJsYXlPYmplY3QgdG8gYWxsb3cgZm9yIGNoYWluaW5nIG9mIGNhbGxzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE92ZXJsYXlPYmplY3Qgc2V0VHJhbnNsYXRlWUFuaW1hdGlvbihpbnQgZGVsdGFZKSB7CisgICAgICAgICAgICBtRGVsdGFZID0gZGVsdGFZOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyBob3cgbG9uZyB0aGUgYW5pbWF0aW9uIHdpbGwgbGFzdC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGR1cmF0aW9uIER1cmF0aW9uIGluIG1pbGxpc2Vjb25kcworICAgICAgICAgKiBAcmV0dXJuIFRoaXMgT3ZlcmxheU9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5pbmcgb2YgY2FsbHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgT3ZlcmxheU9iamVjdCBzZXREdXJhdGlvbihsb25nIGR1cmF0aW9uKSB7CisgICAgICAgICAgICBtRHVyYXRpb24gPSBkdXJhdGlvbjsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIGFjY2VsZXJhdGlvbiBjdXJ2ZSBmb3IgdGhpcyBhbmltYXRpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBpbnRlcnBvbGF0b3IgVGhlIGludGVycG9sYXRvciB3aGljaCBkZWZpbmVzIHRoZSBhY2NlbGVyYXRpb24gY3VydmUKKyAgICAgICAgICogQHJldHVybiBUaGlzIE92ZXJsYXlPYmplY3QgdG8gYWxsb3cgZm9yIGNoYWluaW5nIG9mIGNhbGxzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE92ZXJsYXlPYmplY3Qgc2V0SW50ZXJwb2xhdG9yKEludGVycG9sYXRvciBpbnRlcnBvbGF0b3IpIHsKKyAgICAgICAgICAgIG1JbnRlcnBvbGF0b3IgPSBpbnRlcnBvbGF0b3I7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBCaW5kcyBhbiBhbmltYXRpb24gZW5kIGxpc3RlbmVyIHRvIHRoZSBhbmltYXRpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgYW5pbWF0aW9uIGVuZCBsaXN0ZW5lciB0byBiZSBub3RpZmllZC4KKyAgICAgICAgICogQHJldHVybiBUaGlzIE92ZXJsYXlPYmplY3QgdG8gYWxsb3cgZm9yIGNoYWluaW5nIG9mIGNhbGxzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE92ZXJsYXlPYmplY3Qgc2V0QW5pbWF0aW9uRW5kTGlzdGVuZXIoT25BbmltYXRpb25FbmRMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTdGFydHMgdGhlIGFuaW1hdGlvbiBhbmQgc2V0cyB0aGUgc3RhcnQgdGltZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHN0YXJ0VGltZSBTdGFydCB0aW1lIHRvIGJlIHNldCBpbiBNaWxsaXMKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0QW5pbWF0aW9uKGxvbmcgc3RhcnRUaW1lKSB7CisgICAgICAgICAgICBtU3RhcnRUaW1lID0gc3RhcnRUaW1lOworICAgICAgICAgICAgbUlzQW5pbWF0aW9uU3RhcnRlZCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU3RvcHMgdGhlIGFuaW1hdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHN0b3BBbmltYXRpb24oKSB7CisgICAgICAgICAgICBtSXNBbmltYXRpb25TdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Jc0FuaW1hdGlvbkVuZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1MaXN0ZW5lci5vbkFuaW1hdGlvbkVuZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGN1bGF0ZXMgYW5kIHVwZGF0ZXMgY3VycmVudCBib3VuZHMgYW5kIGFscGhhIHZhbHVlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY3VycmVudFRpbWUgQ3VycmVudCB0aW1lLmluIG1pbGxpcworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gdXBkYXRlKGxvbmcgY3VycmVudFRpbWUpIHsKKyAgICAgICAgICAgIGlmIChtSXNBbmltYXRpb25FbmRlZCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZsb2F0IG5vcm1hbGl6ZWRUaW1lID0gKGN1cnJlbnRUaW1lIC0gbVN0YXJ0VGltZSkgLyAoZmxvYXQpIG1EdXJhdGlvbjsKKyAgICAgICAgICAgIG5vcm1hbGl6ZWRUaW1lID0gTWF0aC5tYXgoMC4wZiwgTWF0aC5taW4oMS4wZiwgbm9ybWFsaXplZFRpbWUpKTsKKyAgICAgICAgICAgIGlmICghbUlzQW5pbWF0aW9uU3RhcnRlZCkgeworICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRUaW1lID0gMC4wZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZsb2F0IGludGVycG9sYXRlZFRpbWUgPSAobUludGVycG9sYXRvciA9PSBudWxsKSA/IG5vcm1hbGl6ZWRUaW1lCisgICAgICAgICAgICAgICAgICAgIDogbUludGVycG9sYXRvci5nZXRJbnRlcnBvbGF0aW9uKG5vcm1hbGl6ZWRUaW1lKTsKKyAgICAgICAgICAgIGludCBkZWx0YVkgPSAoaW50KSAobURlbHRhWSAqIGludGVycG9sYXRlZFRpbWUpOworICAgICAgICAgICAgbUN1cnJlbnRCb3VuZHMudG9wID0gbVN0YXJ0UmVjdC50b3AgKyBkZWx0YVk7CisgICAgICAgICAgICBtQ3VycmVudEJvdW5kcy5ib3R0b20gPSBtU3RhcnRSZWN0LmJvdHRvbSArIGRlbHRhWTsKKyAgICAgICAgICAgIG1DdXJyZW50QWxwaGEgPSBtU3RhcnRBbHBoYSArIChtRW5kQWxwaGEgLSBtU3RhcnRBbHBoYSkgKiBpbnRlcnBvbGF0ZWRUaW1lOworICAgICAgICAgICAgaWYgKG1CaXRtYXAgIT0gbnVsbCAmJiBtQ3VycmVudEJvdW5kcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUJpdG1hcC5zZXRBbHBoYSgoaW50KSAobUN1cnJlbnRBbHBoYSAqIDI1NSkpOworICAgICAgICAgICAgICAgIG1CaXRtYXAuc2V0Qm91bmRzKG1DdXJyZW50Qm91bmRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtSXNBbmltYXRpb25TdGFydGVkICYmIG5vcm1hbGl6ZWRUaW1lID49IDEuMGYpIHsKKyAgICAgICAgICAgICAgICBtSXNBbmltYXRpb25FbmRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1MaXN0ZW5lci5vbkFuaW1hdGlvbkVuZCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAhbUlzQW5pbWF0aW9uRW5kZWQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQW4gYW5pbWF0aW9uIGxpc3RlbmVyIHRoYXQgcmVjZWl2ZXMgbm90aWZpY2F0aW9ucyB3aGVuIHRoZSBhbmltYXRpb24gZW5kcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnRlcmZhY2UgT25BbmltYXRpb25FbmRMaXN0ZW5lciB7CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIE5vdGlmaWVzIHRoZSBlbmQgb2YgdGhlIGFuaW1hdGlvbi4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9qZWxseWJlYW4tbXIxL01lZGlhUm91dGVySmVsbHliZWFuTXIxLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvamVsbHliZWFuLW1yMS9NZWRpYVJvdXRlckplbGx5YmVhbk1yMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NTM5YmQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvamVsbHliZWFuLW1yMS9NZWRpYVJvdXRlckplbGx5YmVhbk1yMS5qYXZhCkBAIC0wLDAgKzEsMTg1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmRpc3BsYXkuRGlzcGxheU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uUmVxdWlyZXNBcGk7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuRGlzcGxheTsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworCisvLyBAQFJlcXVpcmVzQXBpKDE3KQorZmluYWwgY2xhc3MgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEiOworCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlQ2FsbGJhY2soQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDYWxsYmFja1Byb3h5PENhbGxiYWNrPihjYWxsYmFjayk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBSb3V0ZUluZm8geworICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFbmFibGVkKE9iamVjdCByb3V0ZU9iaikgeworICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmlzRW5hYmxlZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBEaXNwbGF5IGdldFByZXNlbnRhdGlvbkRpc3BsYXkoT2JqZWN0IHJvdXRlT2JqKSB7CisgICAgICAgICAgICAvLyBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mby5nZXRQcmVzZW50YXRpb25EaXNwbGF5KCkgd2FzCisgICAgICAgICAgICAvLyBhZGRlZCBpbiBBUEkgMTcuIEhvd2V2ZXIsIHNvbWUgZmFjdG9yeSByZWxlYXNlcyBvZiBKQiBNUjEgbWlzc2VkIGl0LgorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0UHJlc2VudGF0aW9uRGlzcGxheSgpOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXJyb3IgZXgpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgZ2V0IHByZXNlbnRhdGlvbiBkaXNwbGF5IGZvciB0aGUgcm91dGUuIiwgZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBDYWxsYmFjayBleHRlbmRzIE1lZGlhUm91dGVySmVsbHliZWFuLkNhbGxiYWNrIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVByZXNlbnRhdGlvbkRpc3BsYXlDaGFuZ2VkKE9iamVjdCByb3V0ZU9iaik7CisgICAgfQorCisgICAgLyoqCisgICAgICogV29ya2Fyb3VuZCB0aGUgZmFjdCB0aGF0IHRoZSB2ZXJzaW9uIG9mIE1lZGlhUm91dGVyLmFkZENhbGxiYWNrKCkgdGhhdCBhY2NlcHRzIGEKKyAgICAgKiBmbGFnIHRvIHBlcmZvcm0gYW4gYWN0aXZlIHNjYW4gZG9lcyBub3QgZXhpc3QgaW4gSkIgTVIxIHNvIHdlIG5lZWQgdG8gZm9yY2UKKyAgICAgKiB3aWZpIGRpc3BsYXkgc2NhbnMgZGlyZWN0bHkgdGhyb3VnaCB0aGUgRGlzcGxheU1hbmFnZXIuCisgICAgICogRG8gbm90IHVzZSBvbiBKQiBNUjIgYW5kIGFib3ZlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQWN0aXZlU2Nhbldvcmthcm91bmQgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisgICAgICAgIC8vIFRpbWUgYmV0d2VlbiB3aWZpIGRpc3BsYXkgc2NhbnMgd2hlbiBhY3RpdmVseSBzY2FubmluZyBpbiBtaWxsaXNlY29uZHMuCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXSUZJX0RJU1BMQVlfU0NBTl9JTlRFUlZBTCA9IDE1MDAwOworCisgICAgICAgIHByaXZhdGUgZmluYWwgRGlzcGxheU1hbmFnZXIgbURpc3BsYXlNYW5hZ2VyOworICAgICAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgbUhhbmRsZXI7CisgICAgICAgIHByaXZhdGUgTWV0aG9kIG1TY2FuV2lmaURpc3BsYXlzTWV0aG9kOworCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtQWN0aXZlbHlTY2FubmluZ1dpZmlEaXNwbGF5czsKKworICAgICAgICBwdWJsaWMgQWN0aXZlU2Nhbldvcmthcm91bmQoQ29udGV4dCBjb250ZXh0LCBIYW5kbGVyIGhhbmRsZXIpIHsKKyAgICAgICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgIT0gMTcpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbURpc3BsYXlNYW5hZ2VyID0gKERpc3BsYXlNYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5ESVNQTEFZX1NFUlZJQ0UpOworICAgICAgICAgICAgbUhhbmRsZXIgPSBoYW5kbGVyOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2NhbldpZmlEaXNwbGF5c01ldGhvZCA9IERpc3BsYXlNYW5hZ2VyLmNsYXNzLmdldE1ldGhvZCgic2NhbldpZmlEaXNwbGF5cyIpOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVTY2FuUm91dGVUeXBlcyhpbnQgcm91dGVUeXBlcykgeworICAgICAgICAgICAgLy8gT24gSkIgTVIxLCB0aGVyZSBpcyBubyBBUEkgdG8gc2NhbiB3aWZpIGRpc3BsYXkgcm91dGVzLgorICAgICAgICAgICAgLy8gSW5zdGVhZCB3ZSBtdXN0IG1ha2UgYSBkaXJlY3QgY2FsbCBpbnRvIHRoZSBEaXNwbGF5TWFuYWdlciB0byBzY2FuCisgICAgICAgICAgICAvLyB3aWZpIGRpc3BsYXlzIG9uIHRoaXMgdmVyc2lvbiBidXQgb25seSB3aGVuIGxpdmUgdmlkZW8gcm91dGVzIGFyZSByZXF1ZXN0ZWQuCisgICAgICAgICAgICAvLyBTZWUgYWxzbyB0aGUgSmVsbHliZWFuTXIySW1wbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZC4KKyAgICAgICAgICAgIC8vIFRoaXMgd2FzIGZpeGVkIGluIEpCIE1SMiBieSBhZGRpbmcgYSBuZXcgb3ZlcmxvYWQgb2YgYWRkQ2FsbGJhY2soKSB0bworICAgICAgICAgICAgLy8gZW5hYmxlIGFjdGl2ZSBzY2FubmluZyBvbiByZXF1ZXN0LgorICAgICAgICAgICAgaWYgKChyb3V0ZVR5cGVzICYgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUk9VVEVfVFlQRV9MSVZFX1ZJREVPKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtQWN0aXZlbHlTY2FubmluZ1dpZmlEaXNwbGF5cykgeworICAgICAgICAgICAgICAgICAgICBpZiAobVNjYW5XaWZpRGlzcGxheXNNZXRob2QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZWx5U2Nhbm5pbmdXaWZpRGlzcGxheXMgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgbUhhbmRsZXIucG9zdCh0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBzY2FuIGZvciB3aWZpIGRpc3BsYXlzIGJlY2F1c2UgdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiRGlzcGxheU1hbmFnZXIuc2NhbldpZmlEaXNwbGF5cygpIG1ldGhvZCBpcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm5vdCBhdmFpbGFibGUgb24gdGhpcyBkZXZpY2UuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChtQWN0aXZlbHlTY2FubmluZ1dpZmlEaXNwbGF5cykgeworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlbHlTY2FubmluZ1dpZmlEaXNwbGF5cyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVDYWxsYmFja3ModGhpcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIGlmIChtQWN0aXZlbHlTY2FubmluZ1dpZmlEaXNwbGF5cykgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1TY2FuV2lmaURpc3BsYXlzTWV0aG9kLmludm9rZShtRGlzcGxheU1hbmFnZXIpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IHNjYW4gZm9yIHdpZmkgZGlzcGxheXMuIiwgZXgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IHNjYW4gZm9yIHdpZmkgZGlzcGxheXMuIiwgZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtSGFuZGxlci5wb3N0RGVsYXllZCh0aGlzLCBXSUZJX0RJU1BMQVlfU0NBTl9JTlRFUlZBTCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXb3JrYXJvdW5kIHRoZSBmYWN0IHRoYXQgdGhlIGlzQ29ubmVjdGluZygpIG1ldGhvZCBkb2VzIG5vdCBleGlzdCBpbiBKQiBNUjEuCisgICAgICogRG8gbm90IHVzZSBvbiBKQiBNUjIgYW5kIGFib3ZlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgSXNDb25uZWN0aW5nV29ya2Fyb3VuZCB7CisgICAgICAgIHByaXZhdGUgTWV0aG9kIG1HZXRTdGF0dXNDb2RlTWV0aG9kOworICAgICAgICBwcml2YXRlIGludCBtU3RhdHVzQ29ubmVjdGluZzsKKworICAgICAgICBwdWJsaWMgSXNDb25uZWN0aW5nV29ya2Fyb3VuZCgpIHsKKyAgICAgICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgIT0gMTcpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBGaWVsZCBzdGF0dXNDb25uZWN0aW5nRmllbGQgPQorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8uY2xhc3MuZ2V0RmllbGQoIlNUQVRVU19DT05ORUNUSU5HIik7CisgICAgICAgICAgICAgICAgbVN0YXR1c0Nvbm5lY3RpbmcgPSBzdGF0dXNDb25uZWN0aW5nRmllbGQuZ2V0SW50KG51bGwpOworICAgICAgICAgICAgICAgIG1HZXRTdGF0dXNDb2RlTWV0aG9kID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvLmNsYXNzLmdldE1ldGhvZCgiZ2V0U3RhdHVzQ29kZSIpOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDb25uZWN0aW5nKE9iamVjdCByb3V0ZU9iaikgeworICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPQorICAgICAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmo7CisKKyAgICAgICAgICAgIGlmIChtR2V0U3RhdHVzQ29kZU1ldGhvZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHN0YXR1c0NvZGUgPSAoSW50ZWdlciltR2V0U3RhdHVzQ29kZU1ldGhvZC5pbnZva2Uocm91dGUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzQ29kZSA9PSBtU3RhdHVzQ29ubmVjdGluZzsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQXNzdW1lIG5vdCBjb25uZWN0aW5nLgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIENhbGxiYWNrUHJveHk8VCBleHRlbmRzIENhbGxiYWNrPgorICAgICAgICAgICAgZXh0ZW5kcyBNZWRpYVJvdXRlckplbGx5YmVhbi5DYWxsYmFja1Byb3h5PFQ+IHsKKyAgICAgICAgcHVibGljIENhbGxiYWNrUHJveHkoVCBjYWxsYmFjaykgeworICAgICAgICAgICAgc3VwZXIoY2FsbGJhY2spOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVQcmVzZW50YXRpb25EaXNwbGF5Q2hhbmdlZChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciwKKyAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgeworICAgICAgICAgICAgbUNhbGxiYWNrLm9uUm91dGVQcmVzZW50YXRpb25EaXNwbGF5Q2hhbmdlZChyb3V0ZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvamVsbHliZWFuLW1yMi9NZWRpYVJvdXRlckplbGx5YmVhbk1yMi5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2plbGx5YmVhbi1tcjIvTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTAzNTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2plbGx5YmVhbi1tcjIvTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjIuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7CisKKy8vIEBAUmVxdWlyZXNBcGkoMTgpCitmaW5hbCBjbGFzcyBNZWRpYVJvdXRlckplbGx5YmVhbk1yMiB7CisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0RGVmYXVsdFJvdXRlKE9iamVjdCByb3V0ZXJPYmopIHsKKyAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlcilyb3V0ZXJPYmopLmdldERlZmF1bHRSb3V0ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRDYWxsYmFjayhPYmplY3Qgcm91dGVyT2JqLCBpbnQgdHlwZXMsIE9iamVjdCBjYWxsYmFja09iaiwgaW50IGZsYWdzKSB7CisgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlcilyb3V0ZXJPYmopLmFkZENhbGxiYWNrKHR5cGVzLAorICAgICAgICAgICAgICAgIChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLkNhbGxiYWNrKWNhbGxiYWNrT2JqLCBmbGFncyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBSb3V0ZUluZm8geworICAgICAgICBwdWJsaWMgc3RhdGljIENoYXJTZXF1ZW5jZSBnZXREZXNjcmlwdGlvbihPYmplY3Qgcm91dGVPYmopIHsKKyAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXREZXNjcmlwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29ubmVjdGluZyhPYmplY3Qgcm91dGVPYmopIHsKKyAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5pc0Nvbm5lY3RpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgVXNlclJvdXRlSW5mbyB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZXNjcmlwdGlvbihPYmplY3Qgcm91dGVPYmosIENoYXJTZXF1ZW5jZSBkZXNjcmlwdGlvbikgeworICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9qZWxseWJlYW4vTWVkaWFSb3V0ZXJKZWxseWJlYW4uamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9qZWxseWJlYW4vTWVkaWFSb3V0ZXJKZWxseWJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmI1OWI4Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2plbGx5YmVhbi9NZWRpYVJvdXRlckplbGx5YmVhbi5qYXZhCkBAIC0wLDAgKzEsNDYyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8vIEBAUmVxdWlyZXNBcGkoMTYpCitmaW5hbCBjbGFzcyBNZWRpYVJvdXRlckplbGx5YmVhbiB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVJvdXRlckplbGx5YmVhbiI7CisKKyAgICAvLyBhbmRyb2lkLm1lZGlhLkF1ZGlvU3lzdGVtLkRFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFAgPSAweDgwOworICAgIC8vIGFuZHJvaWQubWVkaWEuQXVkaW9TeXN0ZW0uREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTID0gMHgxMDA7CisgICAgLy8gYW5kcm9pZC5tZWRpYS5BdWRpb1N5c3RlbS5ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVIgPSAweDIwMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfT1VUX0JMVUVUT09USCA9IDB4ODAgfCAweDEwMCB8IDB4MjAwOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUk9VVEVfVFlQRV9MSVZFX0FVRElPID0gMHgxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJPVVRFX1RZUEVfTElWRV9WSURFTyA9IDB4MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBST1VURV9UWVBFX1VTRVIgPSAweDAwODAwMDAwOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxMX1JPVVRFX1RZUEVTID0KKyAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlJPVVRFX1RZUEVfTElWRV9BVURJTworICAgICAgICAgICAgfCBNZWRpYVJvdXRlckplbGx5YmVhbi5ST1VURV9UWVBFX0xJVkVfVklERU8KKyAgICAgICAgICAgIHwgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUk9VVEVfVFlQRV9VU0VSOworCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0TWVkaWFSb3V0ZXIoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5NRURJQV9ST1VURVJfU0VSVklDRSk7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoeyAicmF3dHlwZXMiLCAidW5jaGVja2VkIiB9KQorICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRSb3V0ZXMoT2JqZWN0IHJvdXRlck9iaikgeworICAgICAgICBmaW5hbCBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciA9IChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iajsKKyAgICAgICAgZmluYWwgaW50IGNvdW50ID0gcm91dGVyLmdldFJvdXRlQ291bnQoKTsKKyAgICAgICAgTGlzdCBvdXQgPSBuZXcgQXJyYXlMaXN0KGNvdW50KTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBvdXQuYWRkKHJvdXRlci5nZXRSb3V0ZUF0KGkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb3V0OworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsgInJhd3R5cGVzIiwgInVuY2hlY2tlZCIgfSkKKyAgICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0Q2F0ZWdvcmllcyhPYmplY3Qgcm91dGVyT2JqKSB7CisgICAgICAgIGZpbmFsIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyID0gKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqOworICAgICAgICBmaW5hbCBpbnQgY291bnQgPSByb3V0ZXIuZ2V0Q2F0ZWdvcnlDb3VudCgpOworICAgICAgICBMaXN0IG91dCA9IG5ldyBBcnJheUxpc3QoY291bnQpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIG91dC5hZGQocm91dGVyLmdldENhdGVnb3J5QXQoaSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBvdXQ7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0U2VsZWN0ZWRSb3V0ZShPYmplY3Qgcm91dGVyT2JqLCBpbnQgdHlwZSkgeworICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iaikuZ2V0U2VsZWN0ZWRSb3V0ZSh0eXBlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2VsZWN0Um91dGUoT2JqZWN0IHJvdXRlck9iaiwgaW50IHR5cGVzLCBPYmplY3Qgcm91dGVPYmopIHsKKyAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iaikuc2VsZWN0Um91dGUodHlwZXMsCisgICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkQ2FsbGJhY2soT2JqZWN0IHJvdXRlck9iaiwgaW50IHR5cGVzLCBPYmplY3QgY2FsbGJhY2tPYmopIHsKKyAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iaikuYWRkQ2FsbGJhY2sodHlwZXMsCisgICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuQ2FsbGJhY2spY2FsbGJhY2tPYmopOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVDYWxsYmFjayhPYmplY3Qgcm91dGVyT2JqLCBPYmplY3QgY2FsbGJhY2tPYmopIHsKKyAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iaikucmVtb3ZlQ2FsbGJhY2soCisgICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuQ2FsbGJhY2spY2FsbGJhY2tPYmopOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVJvdXRlQ2F0ZWdvcnkoT2JqZWN0IHJvdXRlck9iaiwKKyAgICAgICAgICAgIFN0cmluZyBuYW1lLCBib29sZWFuIGlzR3JvdXBhYmxlKSB7CisgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5jcmVhdGVSb3V0ZUNhdGVnb3J5KG5hbWUsIGlzR3JvdXBhYmxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVVc2VyUm91dGUoT2JqZWN0IHJvdXRlck9iaiwgT2JqZWN0IGNhdGVnb3J5T2JqKSB7CisgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5jcmVhdGVVc2VyUm91dGUoCisgICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVDYXRlZ29yeSljYXRlZ29yeU9iaik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFVzZXJSb3V0ZShPYmplY3Qgcm91dGVyT2JqLCBPYmplY3Qgcm91dGVPYmopIHsKKyAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iaikuYWRkVXNlclJvdXRlKAorICAgICAgICAgICAgICAgIChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVVc2VyUm91dGUoT2JqZWN0IHJvdXRlck9iaiwgT2JqZWN0IHJvdXRlT2JqKSB7CisgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlcilyb3V0ZXJPYmopLnJlbW92ZVVzZXJSb3V0ZSgKKyAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVDYWxsYmFjayhDYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICByZXR1cm4gbmV3IENhbGxiYWNrUHJveHk8Q2FsbGJhY2s+KGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVWb2x1bWVDYWxsYmFjayhWb2x1bWVDYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICByZXR1cm4gbmV3IFZvbHVtZUNhbGxiYWNrUHJveHk8Vm9sdW1lQ2FsbGJhY2s+KGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbGVhbiBjaGVja1JvdXRlZFRvQmx1ZXRvb3RoKENvbnRleHQgY29udGV4dCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQXVkaW9NYW5hZ2VyIGF1ZGlvTWFuYWdlciA9IChBdWRpb01hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZSgKKyAgICAgICAgICAgICAgICAgICAgQ29udGV4dC5BVURJT19TRVJWSUNFKTsKKyAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBhdWRpb01hbmFnZXIuZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZE1ldGhvZCgKKyAgICAgICAgICAgICAgICAgICAgImdldERldmljZXNGb3JTdHJlYW0iLCBpbnQuY2xhc3MpOworICAgICAgICAgICAgaW50IGRldmljZSA9IChJbnRlZ2VyKSBtZXRob2QuaW52b2tlKGF1ZGlvTWFuYWdlciwgQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQyk7CisgICAgICAgICAgICByZXR1cm4gKGRldmljZSAmIERFVklDRV9PVVRfQkxVRVRPT1RIKSAhPSAwOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBSb3V0ZUluZm8geworICAgICAgICBwdWJsaWMgc3RhdGljIENoYXJTZXF1ZW5jZSBnZXROYW1lKE9iamVjdCByb3V0ZU9iaiwgQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0TmFtZShjb250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQ2hhclNlcXVlbmNlIGdldFN0YXR1cyhPYmplY3Qgcm91dGVPYmopIHsKKyAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRTdGF0dXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFN1cHBvcnRlZFR5cGVzKE9iamVjdCByb3V0ZU9iaikgeworICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldFN1cHBvcnRlZFR5cGVzKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRDYXRlZ29yeShPYmplY3Qgcm91dGVPYmopIHsKKyAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRDYXRlZ29yeSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBEcmF3YWJsZSBnZXRJY29uRHJhd2FibGUoT2JqZWN0IHJvdXRlT2JqKSB7CisgICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0SWNvbkRyYXdhYmxlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBnZXRQbGF5YmFja1R5cGUoT2JqZWN0IHJvdXRlT2JqKSB7CisgICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0UGxheWJhY2tUeXBlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBnZXRQbGF5YmFja1N0cmVhbShPYmplY3Qgcm91dGVPYmopIHsKKyAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRQbGF5YmFja1N0cmVhbSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0Vm9sdW1lKE9iamVjdCByb3V0ZU9iaikgeworICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldFZvbHVtZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0Vm9sdW1lTWF4KE9iamVjdCByb3V0ZU9iaikgeworICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldFZvbHVtZU1heCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0Vm9sdW1lSGFuZGxpbmcoT2JqZWN0IHJvdXRlT2JqKSB7CisgICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0Vm9sdW1lSGFuZGxpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFRhZyhPYmplY3Qgcm91dGVPYmopIHsKKyAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRUYWcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRUYWcoT2JqZWN0IHJvdXRlT2JqLCBPYmplY3QgdGFnKSB7CisgICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5zZXRUYWcodGFnKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXF1ZXN0U2V0Vm9sdW1lKE9iamVjdCByb3V0ZU9iaiwgaW50IHZvbHVtZSkgeworICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikucmVxdWVzdFNldFZvbHVtZSh2b2x1bWUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlcXVlc3RVcGRhdGVWb2x1bWUoT2JqZWN0IHJvdXRlT2JqLCBpbnQgZGlyZWN0aW9uKSB7CisgICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5yZXF1ZXN0VXBkYXRlVm9sdW1lKGRpcmVjdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRHcm91cChPYmplY3Qgcm91dGVPYmopIHsKKyAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRHcm91cCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzR3JvdXAoT2JqZWN0IHJvdXRlT2JqKSB7CisgICAgICAgICAgICByZXR1cm4gcm91dGVPYmogaW5zdGFuY2VvZiBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlR3JvdXA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJvdXRlR3JvdXAgeworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ICJyYXd0eXBlcyIsICJ1bmNoZWNrZWQiIH0pCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRHcm91cGVkUm91dGVzKE9iamVjdCBncm91cE9iaikgeworICAgICAgICAgICAgZmluYWwgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUdyb3VwIGdyb3VwID0KKyAgICAgICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVHcm91cClncm91cE9iajsKKyAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IGdyb3VwLmdldFJvdXRlQ291bnQoKTsKKyAgICAgICAgICAgIExpc3Qgb3V0ID0gbmV3IEFycmF5TGlzdChjb3VudCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBvdXQuYWRkKGdyb3VwLmdldFJvdXRlQXQoaSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG91dDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgVXNlclJvdXRlSW5mbyB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXROYW1lKE9iamVjdCByb3V0ZU9iaiwgQ2hhclNlcXVlbmNlIG5hbWUpIHsKKyAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKS5zZXROYW1lKG5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFN0YXR1cyhPYmplY3Qgcm91dGVPYmosIENoYXJTZXF1ZW5jZSBzdGF0dXMpIHsKKyAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKS5zZXRTdGF0dXMoc3RhdHVzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJY29uRHJhd2FibGUoT2JqZWN0IHJvdXRlT2JqLCBEcmF3YWJsZSBpY29uKSB7CisgICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaikuc2V0SWNvbkRyYXdhYmxlKGljb24pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFBsYXliYWNrVHlwZShPYmplY3Qgcm91dGVPYmosIGludCB0eXBlKSB7CisgICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaikuc2V0UGxheWJhY2tUeXBlKHR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFBsYXliYWNrU3RyZWFtKE9iamVjdCByb3V0ZU9iaiwgaW50IHN0cmVhbSkgeworICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldFBsYXliYWNrU3RyZWFtKHN0cmVhbSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Vm9sdW1lKE9iamVjdCByb3V0ZU9iaiwgaW50IHZvbHVtZSkgeworICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldFZvbHVtZSh2b2x1bWUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFZvbHVtZU1heChPYmplY3Qgcm91dGVPYmosIGludCB2b2x1bWVNYXgpIHsKKyAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKS5zZXRWb2x1bWVNYXgodm9sdW1lTWF4KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRWb2x1bWVIYW5kbGluZyhPYmplY3Qgcm91dGVPYmosIGludCB2b2x1bWVIYW5kbGluZykgeworICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldFZvbHVtZUhhbmRsaW5nKHZvbHVtZUhhbmRsaW5nKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRWb2x1bWVDYWxsYmFjayhPYmplY3Qgcm91dGVPYmosIE9iamVjdCB2b2x1bWVDYWxsYmFja09iaikgeworICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldFZvbHVtZUNhbGxiYWNrKAorICAgICAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Wb2x1bWVDYWxsYmFjayl2b2x1bWVDYWxsYmFja09iaik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UmVtb3RlQ29udHJvbENsaWVudChPYmplY3Qgcm91dGVPYmosIE9iamVjdCByY2NPYmopIHsKKyAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKS5zZXRSZW1vdGVDb250cm9sQ2xpZW50KAorICAgICAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5SZW1vdGVDb250cm9sQ2xpZW50KXJjY09iaik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJvdXRlQ2F0ZWdvcnkgeworICAgICAgICBwdWJsaWMgc3RhdGljIENoYXJTZXF1ZW5jZSBnZXROYW1lKE9iamVjdCBjYXRlZ29yeU9iaiwgQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlQ2F0ZWdvcnkpY2F0ZWdvcnlPYmopLmdldE5hbWUoY29udGV4dCk7CisgICAgICAgIH0KKworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ICJyYXd0eXBlcyIsICJ1bmNoZWNrZWQiIH0pCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRSb3V0ZXMoT2JqZWN0IGNhdGVnb3J5T2JqKSB7CisgICAgICAgICAgICBBcnJheUxpc3Qgb3V0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlQ2F0ZWdvcnkpY2F0ZWdvcnlPYmopLmdldFJvdXRlcyhvdXQpOworICAgICAgICAgICAgcmV0dXJuIG91dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFN1cHBvcnRlZFR5cGVzKE9iamVjdCBjYXRlZ29yeU9iaikgeworICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUNhdGVnb3J5KWNhdGVnb3J5T2JqKS5nZXRTdXBwb3J0ZWRUeXBlcygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzR3JvdXBhYmxlKE9iamVjdCBjYXRlZ29yeU9iaikgeworICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUNhdGVnb3J5KWNhdGVnb3J5T2JqKS5pc0dyb3VwYWJsZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgQ2FsbGJhY2sgeworICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlU2VsZWN0ZWQoaW50IHR5cGUsIE9iamVjdCByb3V0ZU9iaik7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbnNlbGVjdGVkKGludCB0eXBlLCBPYmplY3Qgcm91dGVPYmopOworICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQWRkZWQoT2JqZWN0IHJvdXRlT2JqKTsKKyAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVJlbW92ZWQoT2JqZWN0IHJvdXRlT2JqKTsKKyAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUNoYW5nZWQoT2JqZWN0IHJvdXRlT2JqKTsKKyAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUdyb3VwZWQoT2JqZWN0IHJvdXRlT2JqLCBPYmplY3QgZ3JvdXBPYmosIGludCBpbmRleCk7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbmdyb3VwZWQoT2JqZWN0IHJvdXRlT2JqLCBPYmplY3QgZ3JvdXBPYmopOworICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVm9sdW1lQ2hhbmdlZChPYmplY3Qgcm91dGVPYmopOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFZvbHVtZUNhbGxiYWNrIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVTZXRSZXF1ZXN0KE9iamVjdCByb3V0ZU9iaiwgaW50IHZvbHVtZSk7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lVXBkYXRlUmVxdWVzdChPYmplY3Qgcm91dGVPYmosIGludCBkaXJlY3Rpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdvcmthcm91bmQgZm9yIGxpbWl0YXRpb25zIG9mIHNlbGVjdFJvdXRlKCkgb24gSkIgYW5kIEpCIE1SMS4KKyAgICAgKiBEbyBub3QgdXNlIG9uIEpCIE1SMiBhbmQgYWJvdmUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBTZWxlY3RSb3V0ZVdvcmthcm91bmQgeworICAgICAgICBwcml2YXRlIE1ldGhvZCBtU2VsZWN0Um91dGVJbnRNZXRob2Q7CisKKyAgICAgICAgcHVibGljIFNlbGVjdFJvdXRlV29ya2Fyb3VuZCgpIHsKKyAgICAgICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgPCAxNiB8fCBCdWlsZC5WRVJTSU9OLlNES19JTlQgPiAxNykgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2VsZWN0Um91dGVJbnRNZXRob2QgPSBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLmNsYXNzLmdldE1ldGhvZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJzZWxlY3RSb3V0ZUludCIsIGludC5jbGFzcywgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8uY2xhc3MpOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3RSb3V0ZShPYmplY3Qgcm91dGVyT2JqLCBpbnQgdHlwZXMsIE9iamVjdCByb3V0ZU9iaikgeworICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIgPSAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlcilyb3V0ZXJPYmo7CisgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9CisgICAgICAgICAgICAgICAgICAgIChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iajsKKworICAgICAgICAgICAgaW50IHJvdXRlVHlwZXMgPSByb3V0ZS5nZXRTdXBwb3J0ZWRUeXBlcygpOworICAgICAgICAgICAgaWYgKChyb3V0ZVR5cGVzICYgUk9VVEVfVFlQRV9VU0VSKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gSGFuZGxlIG5vbi11c2VyIHJvdXRlcy4KKyAgICAgICAgICAgICAgICAvLyBPbiBKQiBhbmQgSkIgTVIxLCB0aGUgc2VsZWN0Um91dGUoKSBBUEkgb25seSBzdXBwb3J0cyBwcm9ncmFtbWF0aWNhbGx5CisgICAgICAgICAgICAgICAgLy8gc2VsZWN0aW5nIHVzZXIgcm91dGVzLiAgU28gaW5zdGVhZCB3ZSByZWx5IG9uIHRoZSBoaWRkZW4gc2VsZWN0Um91dGVJbnQoKQorICAgICAgICAgICAgICAgIC8vIG1ldGhvZCBvbiB0aGVzZSB2ZXJzaW9ucyBvZiB0aGUgcGxhdGZvcm0uCisgICAgICAgICAgICAgICAgLy8gVGhpcyBsaW1pdGF0aW9uIHdhcyByZW1vdmVkIGluIEpCIE1SMi4KKyAgICAgICAgICAgICAgICBpZiAobVNlbGVjdFJvdXRlSW50TWV0aG9kICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RSb3V0ZUludE1ldGhvZC5pbnZva2Uocm91dGVyLCB0eXBlcywgcm91dGUpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBzdWNjZXNzIQorICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgcHJvZ3JhbW1hdGljYWxseSBzZWxlY3Qgbm9uLXVzZXIgcm91dGUuICAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIk1lZGlhIHJvdXRpbmcgbWF5IG5vdCB3b3JrLiIsIGV4KTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IHByb2dyYW1tYXRpY2FsbHkgc2VsZWN0IG5vbi11c2VyIHJvdXRlLiAgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJNZWRpYSByb3V0aW5nIG1heSBub3Qgd29yay4iLCBleCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgcHJvZ3JhbW1hdGljYWxseSBzZWxlY3Qgbm9uLXVzZXIgcm91dGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImJlY2F1c2UgdGhlIHBsYXRmb3JtIGlzIG1pc3NpbmcgdGhlIHNlbGVjdFJvdXRlSW50KCkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm1ldGhvZC4gIE1lZGlhIHJvdXRpbmcgbWF5IG5vdCB3b3JrLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRGVmYXVsdCBoYW5kbGluZy4KKyAgICAgICAgICAgIHJvdXRlci5zZWxlY3RSb3V0ZSh0eXBlcywgcm91dGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogV29ya2Fyb3VuZCB0aGUgZmFjdCB0aGF0IHRoZSBnZXREZWZhdWx0Um91dGUoKSBtZXRob2QgZG9lcyBub3QgZXhpc3QgaW4gSkIgYW5kIEpCIE1SMS4KKyAgICAgKiBEbyBub3QgdXNlIG9uIEpCIE1SMiBhbmQgYWJvdmUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBHZXREZWZhdWx0Um91dGVXb3JrYXJvdW5kIHsKKyAgICAgICAgcHJpdmF0ZSBNZXRob2QgbUdldFN5c3RlbUF1ZGlvUm91dGVNZXRob2Q7CisKKyAgICAgICAgcHVibGljIEdldERlZmF1bHRSb3V0ZVdvcmthcm91bmQoKSB7CisgICAgICAgICAgICBpZiAoQnVpbGQuVkVSU0lPTi5TREtfSU5UIDwgMTYgfHwgQnVpbGQuVkVSU0lPTi5TREtfSU5UID4gMTcpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbUdldFN5c3RlbUF1ZGlvUm91dGVNZXRob2QgPQorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5jbGFzcy5nZXRNZXRob2QoImdldFN5c3RlbUF1ZGlvUm91dGUiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXREZWZhdWx0Um91dGUoT2JqZWN0IHJvdXRlck9iaikgeworICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIgPSAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlcilyb3V0ZXJPYmo7CisKKyAgICAgICAgICAgIGlmIChtR2V0U3lzdGVtQXVkaW9Sb3V0ZU1ldGhvZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1HZXRTeXN0ZW1BdWRpb1JvdXRlTWV0aG9kLmludm9rZShyb3V0ZXIpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDb3VsZCBub3QgZmluZCB0aGUgbWV0aG9kIG9yIGl0IGRvZXMgbm90IHdvcmsuCisgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIGZpcnN0IHJvdXRlIGFuZCBob3BlIGZvciB0aGUgYmVzdC4KKyAgICAgICAgICAgIHJldHVybiByb3V0ZXIuZ2V0Um91dGVBdCgwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBDYWxsYmFja1Byb3h5PFQgZXh0ZW5kcyBDYWxsYmFjaz4KKyAgICAgICAgICAgIGV4dGVuZHMgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5DYWxsYmFjayB7CisgICAgICAgIHByb3RlY3RlZCBmaW5hbCBUIG1DYWxsYmFjazsKKworICAgICAgICBwdWJsaWMgQ2FsbGJhY2tQcm94eShUIGNhbGxiYWNrKSB7CisgICAgICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlU2VsZWN0ZWQoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIsCisgICAgICAgICAgICAgICAgaW50IHR5cGUsIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7CisgICAgICAgICAgICBtQ2FsbGJhY2sub25Sb3V0ZVNlbGVjdGVkKHR5cGUsIHJvdXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVW5zZWxlY3RlZChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciwKKyAgICAgICAgICAgICAgICBpbnQgdHlwZSwgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKKyAgICAgICAgICAgIG1DYWxsYmFjay5vblJvdXRlVW5zZWxlY3RlZCh0eXBlLCByb3V0ZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUFkZGVkKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyLAorICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7CisgICAgICAgICAgICBtQ2FsbGJhY2sub25Sb3V0ZUFkZGVkKHJvdXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUmVtb3ZlZChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciwKKyAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgeworICAgICAgICAgICAgbUNhbGxiYWNrLm9uUm91dGVSZW1vdmVkKHJvdXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQ2hhbmdlZChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciwKKyAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgeworICAgICAgICAgICAgbUNhbGxiYWNrLm9uUm91dGVDaGFuZ2VkKHJvdXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlR3JvdXBlZChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciwKKyAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSwKKyAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlR3JvdXAgZ3JvdXAsIGludCBpbmRleCkgeworICAgICAgICAgICAgbUNhbGxiYWNrLm9uUm91dGVHcm91cGVkKHJvdXRlLCBncm91cCwgaW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbmdyb3VwZWQoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIsCisgICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUsCisgICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUdyb3VwIGdyb3VwKSB7CisgICAgICAgICAgICBtQ2FsbGJhY2sub25Sb3V0ZVVuZ3JvdXBlZChyb3V0ZSwgZ3JvdXApOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVWb2x1bWVDaGFuZ2VkKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyLAorICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7CisgICAgICAgICAgICBtQ2FsbGJhY2sub25Sb3V0ZVZvbHVtZUNoYW5nZWQocm91dGUpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFZvbHVtZUNhbGxiYWNrUHJveHk8VCBleHRlbmRzIFZvbHVtZUNhbGxiYWNrPgorICAgICAgICAgICAgZXh0ZW5kcyBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlZvbHVtZUNhbGxiYWNrIHsKKyAgICAgICAgcHJvdGVjdGVkIGZpbmFsIFQgbUNhbGxiYWNrOworCisgICAgICAgIHB1YmxpYyBWb2x1bWVDYWxsYmFja1Byb3h5KFQgY2FsbGJhY2spIHsKKyAgICAgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lU2V0UmVxdWVzdChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSwKKyAgICAgICAgICAgICAgICBpbnQgdm9sdW1lKSB7CisgICAgICAgICAgICBtQ2FsbGJhY2sub25Wb2x1bWVTZXRSZXF1ZXN0KHJvdXRlLCB2b2x1bWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lVXBkYXRlUmVxdWVzdChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSwKKyAgICAgICAgICAgICAgICBpbnQgZGlyZWN0aW9uKSB7CisgICAgICAgICAgICBtQ2FsbGJhY2sub25Wb2x1bWVVcGRhdGVSZXF1ZXN0KHJvdXRlLCBkaXJlY3Rpb24pOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhQ29udHJvbEludGVudC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhQ29udHJvbEludGVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkOWU3NzcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFDb250cm9sSW50ZW50LmphdmEKQEAgLTAsMCArMSwxMjI4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworCisvKioKKyAqIENvbnN0YW50cyBmb3IgbWVkaWEgY29udHJvbCBpbnRlbnRzLgorICogPHA+CisgKiBUaGlzIGNsYXNzIGRlY2xhcmVzIGEgc2V0IG9mIHN0YW5kYXJkIG1lZGlhIGNvbnRyb2wgaW50ZW50IGNhdGVnb3JpZXMgYW5kIGFjdGlvbnMgdGhhdAorICogYXBwbGljYXRpb25zIGNhbiB1c2UgdG8gaWRlbnRpZnkgdGhlIGNhcGFiaWxpdGllcyBvZiBtZWRpYSByb3V0ZXMgYW5kIGNvbnRyb2wgdGhlbS4KKyAqIDwvcD4KKyAqCisgKiA8aDM+TWVkaWEgY29udHJvbCBpbnRlbnQgY2F0ZWdvcmllczwvaDM+CisgKiA8cD4KKyAqIE1lZGlhIGNvbnRyb2wgaW50ZW50IGNhdGVnb3JpZXMgc3BlY2lmeSBtZWFucyBieSB3aGljaCBhcHBsaWNhdGlvbnMgY2FuCisgKiBzZW5kIG1lZGlhIHRvIHRoZSBkZXN0aW5hdGlvbiBvZiBhIG1lZGlhIHJvdXRlLiAgQ2F0ZWdvcmllcyBhcmUgc29tZXRpbWVzIHJlZmVycmVkCisgKiB0byBhcyBkZXNjcmliaW5nICJ0eXBlcyIgb3IgImtpbmRzIiBvZiByb3V0ZXMuCisgKiA8L3A+PHA+CisgKiBGb3IgZXhhbXBsZSwgaWYgYSByb3V0ZSBzdXBwb3J0cyB0aGUge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgcmVtb3RlIHBsYXliYWNrIGNhdGVnb3J5fSwKKyAqIHRoZW4gYW4gYXBwbGljYXRpb24gY2FuIGFzayBpdCB0byBwbGF5IG1lZGlhIHJlbW90ZWx5IGJ5IHNlbmRpbmcgYQorICoge0BsaW5rICNBQ1RJT05fUExBWSBwbGF5fSBvciB7QGxpbmsgI0FDVElPTl9FTlFVRVVFIGVucXVldWV9IGludGVudCB3aXRoIHRoZSBVcmkgb2YgdGhlCisgKiBtZWRpYSBjb250ZW50IHRvIHBsYXkuICBTdWNoIGEgcm91dGUgbWF5IHRoZW4gYmUgcmVmZXJyZWQgdG8gYXMKKyAqIGEgInJlbW90ZSBwbGF5YmFjayByb3V0ZSIgYmVjYXVzZSBpdCBzdXBwb3J0cyByZW1vdGUgcGxheWJhY2sgcmVxdWVzdHMuICBJdCBpcyBjb21tb24KKyAqIGZvciBhIHJvdXRlIHRvIHN1cHBvcnQgbXVsdGlwbGUgY2F0ZWdvcmllcyBvZiByZXF1ZXN0cyBhdCB0aGUgc2FtZSB0aW1lLCBzdWNoIGFzCisgKiBsaXZlIGF1ZGlvIGFuZCBsaXZlIHZpZGVvLgorICogPC9wPjxwPgorICogVGhlIGZvbGxvd2luZyBzdGFuZGFyZCByb3V0ZSBjYXRlZ29yaWVzIGFyZSBkZWZpbmVkLgorICogPC9wPjx1bD4KKyAqIDxsaT57QGxpbmsgI0NBVEVHT1JZX0xJVkVfQVVESU8gTGl2ZSBhdWRpb306IFRoZSByb3V0ZSBzdXBwb3J0cyBzdHJlYW1pbmcgbGl2ZSBhdWRpbworICogZnJvbSB0aGUgZGV2aWNlIHRvIHRoZSBkZXN0aW5hdGlvbi4gIExpdmUgYXVkaW8gcm91dGVzIGluY2x1ZGUgbG9jYWwgc3BlYWtlcnMKKyAqIGFuZCBCbHVldG9vdGggaGVhZHNldHMuCisgKiA8bGk+e0BsaW5rICNDQVRFR09SWV9MSVZFX1ZJREVPIExpdmUgdmlkZW99OiBUaGUgcm91dGUgc3VwcG9ydHMgc3RyZWFtaW5nIGxpdmUgdmlkZW8KKyAqIGZyb20gdGhlIGRldmljZSB0byB0aGUgZGVzdGluYXRpb24uICBMaXZlIHZpZGVvIHJvdXRlcyBpbmNsdWRlIGxvY2FsIGRpc3BsYXlzCisgKiBhbmQgd2lyZWxlc3MgZGlzcGxheXMgdGhhdCBzdXBwb3J0IG1pcnJvcmluZyBhbmQKKyAqIHtAbGluayBhbmRyb2lkLmFwcC5QcmVzZW50YXRpb24gcHJlc2VudGF0aW9uc30uICBMaXZlIHZpZGVvIHJvdXRlcyB0eXBpY2FsbHkgYWxzbworICogc3VwcG9ydCBsaXZlIGF1ZGlvIGNhcGFiaWxpdGllcy4KKyAqIDxsaT57QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyBSZW1vdGUgcGxheWJhY2t9OiBUaGUgcm91dGUgc3VwcG9ydHMgc2VuZGluZworICogcmVtb3RlIHBsYXliYWNrIHJlcXVlc3RzIGZvciBtZWRpYSBjb250ZW50IHRvIHRoZSBkZXN0aW5hdGlvbi4gIFRoZSBjb250ZW50IHRvIGJlCisgKiBwbGF5ZWQgaXMgaWRlbnRpZmllZCBieSBhIFVyaSBhbmQgbWltZS10eXBlLgorICogPC91bD48cD4KKyAqIE1lZGlhIHJvdXRlIHByb3ZpZGVycyBtYXkgZGVmaW5lIGN1c3RvbSBtZWRpYSBjb250cm9sIGludGVudCBjYXRlZ29yaWVzIG9mIHRoZWlyIG93biBpbgorICogYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIG9uZXMuICBDdXN0b20gY2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byBwcm92aWRlIGEgdmFyaWV0eQorICogb2YgZmVhdHVyZXMgdG8gYXBwbGljYXRpb25zIHRoYXQgcmVjb2duaXplIGFuZCBrbm93IGhvdyB0byB1c2UgdGhlbS4gIEZvciBleGFtcGxlLAorICogYSBtZWRpYSByb3V0ZSBwcm92aWRlciBtaWdodCBkZWZpbmUgYSBjdXN0b20gY2F0ZWdvcnkgdG8gaW5kaWNhdGUgdGhhdCBpdHMgcm91dGVzCisgKiBzdXBwb3J0IGEgc3BlY2lhbCBkZXZpY2Utc3BlY2lmaWMgY29udHJvbCBpbnRlcmZhY2UgaW4gYWRkaXRpb24gdG8gb3RoZXIKKyAqIHN0YW5kYXJkIGZlYXR1cmVzLgorICogPC9wPjxwPgorICogQXBwbGljYXRpb25zIGNhbiBkZXRlcm1pbmUgd2hpY2ggY2F0ZWdvcmllcyBhIHJvdXRlIHN1cHBvcnRzIGJ5IHVzaW5nIHRoZQorICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzdXBwb3J0c0NvbnRyb2xDYXRlZ29yeSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnl9CisgKiBvciB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI2dldENvbnRyb2xGaWx0ZXJzIE1lZGlhUm91dGVyLlJvdXRlSW5mby5nZXRDb250cm9sRmlsdGVyc30KKyAqIG1ldGhvZHMuICBBcHBsaWNhdGlvbnMgY2FuIGFsc28gc3BlY2lmeSB0aGUgdHlwZXMgb2Ygcm91dGVzIHRoYXQgdGhleSB3YW50IHRvIHVzZSBieQorICogY3JlYXRpbmcge0BsaW5rIE1lZGlhUm91dGVTZWxlY3RvciBtZWRpYSByb3V0ZSBzZWxlY3RvcnN9IHRoYXQgY29udGFpbiB0aGUgZGVzaXJlZAorICogY2F0ZWdvcmllcyBhbmQgYXJlIHVzZWQgdG8gZmlsdGVyIHJvdXRlcyBpbiBzZXZlcmFsIHBhcnRzIG9mIHRoZSBtZWRpYSByb3V0ZXIgQVBJLgorICogPC9wPgorICoKKyAqIDxoMz5NZWRpYSBjb250cm9sIGludGVudCBhY3Rpb25zPC9oMz4KKyAqIDxwPgorICogTWVkaWEgY29udHJvbCBpbnRlbnQgYWN0aW9ucyBzcGVjaWZ5IHBhcnRpY3VsYXIgZnVuY3Rpb25zIHRoYXQgYXBwbGljYXRpb25zCisgKiBjYW4gYXNrIHRoZSBkZXN0aW5hdGlvbiBvZiBhIG1lZGlhIHJvdXRlIHRvIHBlcmZvcm0uICBNZWRpYSByb3V0ZSBjb250cm9sIHJlcXVlc3RzCisgKiB0YWtlIHRoZSBmb3JtIG9mIGludGVudHMgaW4gYSBzaW1pbGFyIG1hbm5lciB0byBvdGhlciBpbnRlbnRzIHVzZWQgdG8gc3RhcnQgYWN0aXZpdGllcworICogb3Igc2VuZCBicm9hZGNhc3RzLiAgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCBtZWRpYSBjb250cm9sIGludGVudHMgYXJlIGRpcmVjdGVkIHRvCisgKiByb3V0ZXMgcmF0aGVyIHRoYW4gYWN0aXZpdHkgb3IgYnJvYWRjYXN0IHJlY2VpdmVyIGNvbXBvbmVudHMuCisgKiA8L3A+PHA+CisgKiBFYWNoIG1lZGlhIHJvdXRlIGNvbnRyb2wgaW50ZW50IHNwZWNpZmllcyBhbiBhY3Rpb24sIGEgY2F0ZWdvcnkgYW5kIHNvbWUgbnVtYmVyIG9mIHBhcmFtZXRlcnMKKyAqIHRoYXQgYXJlIHN1cHBsaWVkIGFzIGV4dHJhcy4gIEFwcGxpY2F0aW9ucyBzZW5kIG1lZGlhIGNvbnRyb2wgcmVxdWVzdHMgdG8gcm91dGVzIHVzaW5nIHRoZQorICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QgTWVkaWFSb3V0ZXIuUm91dGVJbmZvLnNlbmRDb250cm9sUmVxdWVzdH0KKyAqIG1ldGhvZCBhbmQgcmVjZWl2ZSByZXN1bHRzIHZpYSBhIGNhbGxiYWNrLgorICogPC9wPjxwPgorICogQWxsIG1lZGlhIGNvbnRyb2wgaW50ZW50IGFjdGlvbnMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVkaWEgY29udHJvbCBpbnRlbnQgY2F0ZWdvcmllcworICogdGhhdCBzdXBwb3J0IHRoZW0uICBUaHVzIG9ubHkgcmVtb3RlIHBsYXliYWNrIHJvdXRlcyBtYXkgcGVyZm9ybSByZW1vdGUgcGxheWJhY2sgYWN0aW9ucy4KKyAqIFRoZSBkb2N1bWVudGF0aW9uIG9mIGVhY2ggYWN0aW9uIHNwZWNpZmllcyB0aGUgY2F0ZWdvcnkgdG8gd2hpY2ggdGhlIGFjdGlvbiBiZWxvbmdzLAorICogdGhlIHBhcmFtZXRlcnMgaXQgcmVxdWlyZXMsIGFuZCB0aGUgcmVzdWx0cyBpdCByZXR1cm5zLgorICogPC9wPgorICoKKyAqIDxoMz5MaXZlIGF1ZGlvIGFuZCBsaXZlIHZpZGVvIHJvdXRlczwvaDM+CisgKiA8cD4KKyAqIHtAbGluayAjQ0FURUdPUllfTElWRV9BVURJTyBMaXZlIGF1ZGlvfSBhbmQge0BsaW5rICNDQVRFR09SWV9MSVZFX1ZJREVPIGxpdmUgdmlkZW99CisgKiByb3V0ZXMgcHJlc2VudCBtZWRpYSB1c2luZyBzdGFuZGFyZCBzeXN0ZW0gaW50ZXJmYWNlcyBzdWNoIGFzIGF1ZGlvIHN0cmVhbXMsCisgKiB7QGxpbmsgYW5kcm9pZC5hcHAuUHJlc2VudGF0aW9uIHByZXNlbnRhdGlvbnN9IG9yIGRpc3BsYXkgbWlycm9yaW5nLiAgVGhlc2Ugcm91dGVzIGFyZQorICogdGhlIGVhc2llc3QgdG8gdXNlIGJlY2F1c2UgYXBwbGljYXRpb25zIHNpbXBseSByZW5kZXIgY29udGVudCBsb2NhbGx5IG9uIHRoZSBkZXZpY2UKKyAqIGFuZCB0aGUgc3lzdGVtIHN0cmVhbXMgaXQgdG8gdGhlIHJvdXRlIGRlc3RpbmF0aW9uIGF1dG9tYXRpY2FsbHkuCisgKiA8L3A+PHA+CisgKiBJbiBtb3N0IGNhc2VzLCBhcHBsaWNhdGlvbnMgY2FuIHN0cmVhbSBjb250ZW50IHRvIGxpdmUgYXVkaW8gYW5kIGxpdmUgdmlkZW8gcm91dGVzIGluCisgKiB0aGUgc2FtZSB3YXkgdGhleSB3b3VsZCBwbGF5IHRoZSBjb250ZW50IGxvY2FsbHkgd2l0aG91dCBhbnkgbW9kaWZpY2F0aW9uLiAgSG93ZXZlciwKKyAqIGFwcGxpY2F0aW9ucyBtYXkgYWxzbyBiZSBhYmxlIHRvIHRha2UgYWR2YW50YWdlIG9mIG1vcmUgc29waGlzdGljYXRlZCBmZWF0dXJlcyBzdWNoCisgKiBhcyBzZWNvbmQtc2NyZWVuIHByZXNlbnRhdGlvbiBBUElzIHRoYXQgYXJlIHBhcnRpY3VsYXIgdG8gdGhlc2Ugcm91dGVzLgorICogPC9wPgorICoKKyAqIDxoMz5SZW1vdGUgcGxheWJhY2sgcm91dGVzPC9oMz4KKyAqIDxwPgorICoge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgUmVtb3RlIHBsYXliYWNrfSByb3V0ZXMgcHJlc2VudCBtZWRpYSByZW1vdGVseQorICogYnkgcGxheWluZyBjb250ZW50IGZyb20gYSBVcmkuCisgKiBUaGVzZSByb3V0ZXMgZGVzdGluYXRpb25zIHRha2UgcmVzcG9uc2liaWxpdHkgZm9yIGZldGNoaW5nIGFuZCByZW5kZXJpbmcgY29udGVudAorICogb24gdGhlaXIgb3duLiAgQXBwbGljYXRpb25zIGRvIG5vdCByZW5kZXIgdGhlIGNvbnRlbnQgdGhlbXNlbHZlczsgaW5zdGVhZCwgYXBwbGljYXRpb25zCisgKiBzZW5kIGNvbnRyb2wgcmVxdWVzdHMgdG8gaW5pdGlhdGUgcGxheSwgcGF1c2UsIHJlc3VtZSwgb3Igc3RvcCBtZWRpYSBpdGVtcyBhbmQgcmVjZWl2ZQorICogc3RhdHVzIHVwZGF0ZXMgYXMgdGhleSBjaGFuZ2Ugc3RhdGUuCisgKiA8L3A+CisgKgorICogPGg0PlNlc3Npb25zPC9oND4KKyAqIDxwPgorICogRWFjaCByZW1vdGUgbWVkaWEgcGxheWJhY2sgYWN0aW9uIGlzIGNvbmR1Y3RlZCB3aXRoaW4gdGhlIHNjb3BlIG9mIGEgc2Vzc2lvbi4KKyAqIFNlc3Npb25zIGFyZSB1c2VkIHRvIHByZXZlbnQgYXBwbGljYXRpb25zIGZyb20gYWNjaWRlbnRhbGx5IGludGVyZmVyaW5nIHdpdGggb25lCisgKiBhbm90aGVyIGJlY2F1c2UgYXQgbW9zdCBvbmUgc2Vzc2lvbiBjYW4gYmUgdmFsaWQgYXQgYSB0aW1lLgorICogPC9wPjxwPgorICogQSBzZXNzaW9uIGNhbiBiZSBjcmVhdGVkIHVzaW5nIHRoZSB7QGxpbmsgI0FDVElPTl9TVEFSVF9TRVNTSU9OIHN0YXJ0IHNlc3Npb24gYWN0aW9ufQorICogYW5kIHRlcm1pbmF0ZWQgdXNpbmcgdGhlIHtAbGluayAjQUNUSU9OX0VORF9TRVNTSU9OIGVuZCBzZXNzaW9uIGFjdGlvbn0gd2hlbiB0aGUKKyAqIHJvdXRlIHByb3ZpZGVzIGV4cGxpY2l0IHNlc3Npb24gbWFuYWdlbWVudCBmZWF0dXJlcy4KKyAqIDwvcD48cD4KKyAqIEV4cGxpY2l0IHNlc3Npb24gbWFuYWdlbWVudCB3YXMgYWRkZWQgaW4gYSBsYXRlciByZXZpc2lvbiBvZiB0aGUgcHJvdG9jb2wgc28gbm90CisgKiBhbGwgcm91dGVzIHN1cHBvcnQgaXQuICBJZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCBleHBsaWNpdCBzZXNzaW9uIG1hbmFnZW1lbnQKKyAqIHRoZW4gaW1wbGljaXQgc2Vzc2lvbiBtYW5hZ2VtZW50IG1heSBzdGlsbCBiZSB1c2VkLiAgSW1wbGljaXQgc2Vzc2lvbiBtYW5hZ2VtZW50CisgKiByZWxpZXMgb24gdGhlIHVzZSBvZiB0aGUge0BsaW5rICNBQ1RJT05fUExBWSBwbGF5fSBhbmQge0BsaW5rICNBQ1RJT05fRU5RVUVVRSBlbnF1ZXVlfQorICogYWN0aW9ucyB3aGljaCBoYXZlIHRoZSBzaWRlLWVmZmVjdCBvZiBjcmVhdGluZyBhIG5ldyBzZXNzaW9uIGlmIG5vbmUgaXMgcHJvdmlkZWQKKyAqIGFzIGFyZ3VtZW50LgorICogPC9wPjxwPgorICogV2hlbiBhIG5ldyBzZXNzaW9uIGlzIGNyZWF0ZWQsIHRoZSBwcmV2aW91cyBzZXNzaW9uIGlzIGludmFsaWRhdGVkIGFuZCBhbnkgb25nb2luZworICogbWVkaWEgcGxheWJhY2sgaXMgc3RvcHBlZCBiZWZvcmUgdGhlIHJlcXVlc3RlZCBhY3Rpb24gaXMgcGVyZm9ybWVkLiAgQW55IGF0dGVtcHQKKyAqIHRvIHVzZSBhbiBpbnZhbGlkYXRlZCBzZXNzaW9uIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLiAgKFByb3RvY29sIGltcGxlbWVudGF0aW9ucworICogYXJlIGVuY291cmFnZWQgdG8gYWdncmVzc2l2ZWx5IGRpc2NhcmQgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGludmFsaWRhdGVkIHNlc3Npb25zCisgKiBzaW5jZSBpdCBpcyBubyBsb25nZXIgb2YgdXNlLikKKyAqIDwvcD48cD4KKyAqIEVhY2ggc2Vzc2lvbiBpcyBpZGVudGlmaWVkIGJ5IGEgdW5pcXVlIHNlc3Npb24gaWQgdGhhdCBtYXkgYmUgdXNlZCB0byBjb250cm9sCisgKiB0aGUgc2Vzc2lvbiB1c2luZyBhY3Rpb25zIHN1Y2ggYXMgcGF1c2UsIHJlc3VtZSwgc3RvcCBhbmQgZW5kIHNlc3Npb24uCisgKiA8L3A+CisgKgorICogPGg0Pk1lZGlhIGl0ZW1zPC9oND4KKyAqIDxwPgorICogRWFjaCBzdWNjZXNzZnVsIHtAbGluayAjQUNUSU9OX1BMQVkgcGxheX0gb3Ige0BsaW5rICNBQ1RJT05fRU5RVUVVRSBlbnF1ZXVlfSBhY3Rpb24KKyAqIHJldHVybnMgYSB1bmlxdWUgbWVkaWEgaXRlbSBpZCB0aGF0IGFuIGFwcGxpY2F0aW9uIGNhbiB1c2UgdG8gbW9uaXRvciBhbmQgY29udHJvbAorICogcGxheWJhY2suICBUaGUgbWVkaWEgaXRlbSBpZCBtYXkgYmUgcGFzc2VkIHRvIG90aGVyIGFjdGlvbnMgc3VjaCBhcworICoge0BsaW5rICNBQ1RJT05fU0VFSyBzZWVrfSBvciB7QGxpbmsgI0FDVElPTl9HRVRfU1RBVFVTIGdldCBzdGF0dXN9LiAgSXQgd2lsbCBhbHNvIGFwcGVhcgorICogYXMgYSBwYXJhbWV0ZXIgaW4gc3RhdHVzIHVwZGF0ZSBicm9hZGNhc3RzIHRvIGlkZW50aWZ5IHRoZSBhc3NvY2lhdGVkIHBsYXliYWNrIHJlcXVlc3QuCisgKiA8L3A+PHA+CisgKiBFYWNoIG1lZGlhIGl0ZW0gaXMgc2NvcGVkIHRvIHRoZSBzZXNzaW9uIGluIHdoaWNoIGl0IHdhcyBjcmVhdGVkLiAgVGhlcmVmb3JlIG1lZGlhIGl0ZW0KKyAqIGlkcyBhcmUgb25seSBldmVyIHVzZWQgdG9nZXRoZXIgd2l0aCBzZXNzaW9uIGlkcy4gIE1lZGlhIGl0ZW0gaWRzIGFyZSBtZWFuaW5nbGVzcworICogb24gdGhlaXIgb3duLiAgV2hlbiB0aGUgc2Vzc2lvbiBpcyBpbnZhbGlkYXRlZCwgYWxsIG9mIGl0cyBtZWRpYSBpdGVtcyBhcmUgYWxzbworICogaW52YWxpZGF0ZWQuCisgKiA8L3A+CisgKgorICogPGg0PlRoZSBwbGF5YmFjayBxdWV1ZTwvaDQ+CisgKiA8cD4KKyAqIEVhY2ggc2Vzc2lvbiBoYXMgaXRzIG93biBwbGF5YmFjayBxdWV1ZSB0aGF0IGNvbnNpc3RzIG9mIHRoZSBtZWRpYSBpdGVtcyB0aGF0CisgKiBhcmUgcGVuZGluZywgcGxheWluZywgYnVmZmVyaW5nIG9yIHBhdXNlZC4gIEl0ZW1zIGFyZSBhZGRlZCB0byB0aGUgcXVldWUgd2hlbgorICogYSBwbGF5YmFjayByZXF1ZXN0IGlzIGlzc3VlZC4gIEl0ZW1zIGFyZSByZW1vdmVkIGZyb20gdGhlIHF1ZXVlIHdoZW4gdGhleSBhcmUgbm8KKyAqIGxvbmdlciBlbGlnaWJsZSBmb3IgcGxheWJhY2sgKGVudGVyIHRlcm1pbmFsIHN0YXRlcykuCisgKiA8L3A+PHA+CisgKiBBcyBkZXNjcmliZWQgaW4gdGhlIHtAbGluayBNZWRpYUl0ZW1TdGF0dXN9IGNsYXNzLCBtZWRpYSBpdGVtcyBpbml0aWFsbHkKKyAqIHN0YXJ0IGluIGEgcGVuZGluZyBzdGF0ZSwgdHJhbnNpdGlvbiB0byB0aGUgcGxheWluZyAob3IgYnVmZmVyaW5nIG9yIHBhdXNlZCkgc3RhdGUKKyAqIGR1cmluZyBwbGF5YmFjaywgYW5kIGVuZCBpbiBhIGZpbmlzaGVkLCBjYW5jZWxlZCwgaW52YWxpZGF0ZWQgb3IgZXJyb3Igc3RhdGUuCisgKiBPbmNlIHRoZSBjdXJyZW50IGl0ZW0gZW50ZXJzIGEgdGVybWluYWwgc3RhdGUsIHBsYXliYWNrIHByb2NlZWRzIG9uIHRvIHRoZQorICogbmV4dCBpdGVtLgorICogPC9wPjxwPgorICogVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBkZXRlcm1pbmUgd2hldGhlciB0aGUgcm91dGUgc3VwcG9ydHMgcXVldWluZyBieSBjaGVja2luZworICogd2hldGhlciB0aGUge0BsaW5rICNBQ1RJT05fRU5RVUVVRX0gYWN0aW9uIGlzIGRlY2xhcmVkIGluIHRoZSByb3V0ZSdzIGNvbnRyb2wgZmlsdGVyCisgKiB1c2luZyB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3N1cHBvcnRzQ29udHJvbFJlcXVlc3QgUm91dGVJbmZvLnN1cHBvcnRzQ29udHJvbFJlcXVlc3R9LgorICogPC9wPjxwPgorICogSWYgdGhlIHtAbGluayAjQUNUSU9OX0VOUVVFVUV9IGFjdGlvbiBpcyBzdXBwb3J0ZWQgYnkgdGhlIHJvdXRlLCB0aGVuIHRoZSByb3V0ZSBwcm9taXNlcworICogdG8gYWxsb3cgYXQgbGVhc3QgdHdvIGl0ZW1zIChwb3NzaWJseSBtb3JlKSB0byBiZSBlbnF1ZXVlZCBhdCBhIHRpbWUuICBFbnF1ZXVlZCBpdGVtcyBwbGF5CisgKiBiYWNrIHRvIGJhY2sgb25lIGFmdGVyIHRoZSBvdGhlciBhcyB0aGUgcHJldmlvdXMgaXRlbSBjb21wbGV0ZXMuICBJZGVhbGx5IHRoZXJlIHNob3VsZAorICogYmUgbm8gYXVkaWJsZSBwYXVzZSBiZXR3ZWVuIGl0ZW1zIGZvciBzdGFuZGFyZCBhdWRpbyBjb250ZW50IHR5cGVzLgorICogPC9wPjxwPgorICogSWYgdGhlIHtAbGluayAjQUNUSU9OX0VOUVVFVUV9IGFjdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSByb3V0ZSwgdGhlbiB0aGUgcXVldWUKKyAqIGVmZmVjdGl2ZWx5IGNvbnRhaW5zIGF0IG1vc3Qgb25lIGl0ZW0gYXQgYSB0aW1lLiAgRWFjaCBwbGF5IGFjdGlvbiBoYXMgdGhlIGVmZmVjdCBvZgorICogY2xlYXJpbmcgdGhlIHF1ZXVlIGFuZCByZXNldHRpbmcgaXRzIHN0YXRlIGJlZm9yZSB0aGUgbmV4dCBpdGVtIGlzIHBsYXllZC4KKyAqIDwvcD4KKyAqCisgKiA8aDQ+SW1wYWN0IG9mIHBhdXNlLCByZXN1bWUsIHN0b3AgYW5kIHBsYXkgYWN0aW9ucyBvbiB0aGUgcGxheWJhY2sgcXVldWU8L2g0PgorICogPHA+CisgKiBUaGUgcGF1c2UsIHJlc3VtZSBhbmQgc3RvcCBhY3Rpb25zIGFmZmVjdCB0aGUgc2Vzc2lvbidzIHdob2xlIHF1ZXVlLiAgUGF1c2UgY2F1c2VzCisgKiB0aGUgcGxheWJhY2sgcXVldWUgdG8gYmUgc3VzcGVuZGVkIG5vIG1hdHRlciB3aGljaCBpdGVtIGlzIGN1cnJlbnRseSBwbGF5aW5nLgorICogUmVzdW1lIHJldmVyc2VzIHRoZSBlZmZlY3RzIG9mIHBhdXNlLiAgU3RvcCBjbGVhcnMgdGhlIHF1ZXVlIGFuZCBhbHNvIHJlc2V0cworICogdGhlIHBhdXNlIGZsYWcganVzdCBsaWtlIHJlc3VtZS4KKyAqIDwvcD48cD4KKyAqIEFzIGRlc2NyaWJlZCBlYXJsaWVyLCB0aGUgcGxheSBhY3Rpb24gaGFzIHRoZSBlZmZlY3Qgb2YgY2xlYXJpbmcgdGhlIHF1ZXVlCisgKiBhbmQgY29tcGxldGVseSByZXNldHRpbmcgaXRzIHN0YXRlIChsaWtlIHRoZSBzdG9wIGFjdGlvbikgdGhlbiBlbnF1ZXVpbmcgYQorICogbmV3IG1lZGlhIGl0ZW0gdG8gYmUgcGxheWVkIGltbWVkaWF0ZWx5LiAgUGxheSBpcyB0aGVyZWZvcmUgZXF1aXZhbGVudAorICogdG8gc3RvcCBmb2xsb3dlZCBieSBhbiBhY3Rpb24gdG8gZW5xdWV1ZSBhbiBpdGVtLgorICogPC9wPjxwPgorICogVGhlIHBsYXkgYWN0aW9uIGlzIGFsc28gc3BlY2lhbCBpbiB0aGF0IGl0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBuZXcgc2Vzc2lvbnMuCisgKiBBbiBhcHBsaWNhdGlvbiB3aXRoIHNpbXBsZSBuZWVkcyBtYXkgZmluZCB0aGF0IGl0IG9ubHkgbmVlZHMgdG8gdXNlIHBsYXkKKyAqIChhbmQgb2NjYXNpb25hbGx5IHN0b3ApIHRvIGNvbnRyb2wgcGxheWJhY2suCisgKiA8L3A+CisgKgorICogPGg0PlJlc29sdmluZyBjb25mbGljdHMgYmV0d2VlbiBhcHBsaWNhdGlvbnM8L2g0PgorICogPHA+CisgKiBXaGVuIGFuIGFwcGxpY2F0aW9uIGhhcyBhIHZhbGlkIHNlc3Npb24sIGl0IGlzIGVzc2VudGlhbGx5IGluIGNvbnRyb2wgb2YgcmVtb3RlIHBsYXliYWNrCisgKiBvbiB0aGUgcm91dGUuICBObyBvdGhlciBhcHBsaWNhdGlvbiBjYW4gdmlldyBvciBtb2RpZnkgdGhlIHJlbW90ZSBwbGF5YmFjayBzdGF0ZQorICogb2YgdGhhdCBhcHBsaWNhdGlvbidzIHNlc3Npb24gd2l0aG91dCBrbm93aW5nIGl0cyBpZC4KKyAqIDwvcD48cD4KKyAqIEhvd2V2ZXIsIG90aGVyIGFwcGxpY2F0aW9ucyBjYW4gcGVyZm9ybSBhY3Rpb25zIHRoYXQgaGF2ZSB0aGUgZWZmZWN0IG9mIHN0b3BwaW5nCisgKiBwbGF5YmFjayBhbmQgaW52YWxpZGF0aW5nIHRoZSBjdXJyZW50IHNlc3Npb24uICBXaGVuIHRoaXMgb2NjdXJzLCB0aGUgZm9ybWVyIGFwcGxpY2F0aW9uCisgKiB3aWxsIGJlIGluZm9ybWVkIHRoYXQgaXQgaGFzIGxvc3QgY29udHJvbCBieSB3YXkgb2YgaW5kaXZpZHVhbCBtZWRpYSBpdGVtIHN0YXR1cworICogdXBkYXRlIGJyb2FkY2FzdHMgdGhhdCBpbmRpY2F0ZSB0aGF0IGl0cyBxdWV1ZWQgbWVkaWEgaXRlbXMgaGF2ZSBiZWNvbWUKKyAqIHtAbGluayBNZWRpYUl0ZW1TdGF0dXMjUExBWUJBQ0tfU1RBVEVfSU5WQUxJREFURUQgaW52YWxpZGF0ZWR9LiAgVGhpcyBicm9hZGNhc3QKKyAqIGltcGxpZXMgdGhhdCBwbGF5YmFjayB3YXMgdGVybWluYXRlZCBhYm5vcm1hbGx5IGJ5IGFuIGV4dGVybmFsIGNhdXNlLgorICogPC9wPjxwPgorICogQXBwbGljYXRpb25zIHNob3VsZCBoYW5kbGUgY29uZmxpY3RzIGNvbnNlcnZhdGl2ZWx5IHRvIGFsbG93IG90aGVyIGFwcGxpY2F0aW9ucyB0bworICogc21vb3RobHkgYXNzdW1lIGNvbnRyb2wgb3ZlciB0aGUgcm91dGUuICBXaGVuIGEgY29uZmxpY3Qgb2NjdXJzLCB0aGUgY3VycmVudGx5IHBsYXlpbmcKKyAqIGFwcGxpY2F0aW9uIHNob3VsZCByZWxlYXNlIGl0cyBzZXNzaW9uIGFuZCBhbGxvdyB0aGUgbmV3IGFwcGxpY2F0aW9uIHRvIHVzZSB0aGUKKyAqIHJvdXRlIHVudGlsIHN1Y2ggdGltZSBhcyB0aGUgdXNlciBpbnRlcnZlbmVzIHRvIHRha2Ugb3ZlciB0aGUgcm91dGUgYWdhaW4gYW5kIGJlZ2luCisgKiBhIG5ldyBwbGF5YmFjayBzZXNzaW9uLgorICogPC9wPgorICoKKyAqIDxoND5CYXNpYyBhY3Rpb25zPC9oND4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBiYXNpYyBhY3Rpb25zIG11c3QgYmUgc3VwcG9ydGVkIChhbGwgb3Igbm90aGluZykgYnkgYWxsIHJlbW90ZQorICogcGxheWJhY2sgcm91dGVzLiAgVGhlc2UgYWN0aW9ucyBmb3JtIHRoZSBiYXNpcyBvZiB0aGUgcmVtb3RlIHBsYXliYWNrIHByb3RvY29sCisgKiBhbmQgYXJlIHJlcXVpcmVkIGluIGFsbCBpbXBsZW1lbnRhdGlvbnMuCisgKiA8L3A+PHVsPgorICogPGxpPntAbGluayAjQUNUSU9OX1BMQVkgUGxheX06IFN0YXJ0cyBwbGF5aW5nIGNvbnRlbnQgc3BlY2lmaWVkIGJ5IGEgZ2l2ZW4gVXJpCisgKiBhbmQgcmV0dXJucyBhIG5ldyBtZWRpYSBpdGVtIGlkIHRvIGRlc2NyaWJlIHRoZSByZXF1ZXN0LiAgSW1wbGljaXRseSBjcmVhdGVzIGEgbmV3CisgKiBzZXNzaW9uIGlmIG5vIHNlc3Npb24gaWQgd2FzIHNwZWNpZmllZCBhcyBhIHBhcmFtZXRlci4KKyAqIDxsaT57QGxpbmsgI0FDVElPTl9TRUVLIFNlZWt9OiBTZXRzIHRoZSBjb250ZW50IHBsYXliYWNrIHBvc2l0aW9uIG9mIGEgc3BlY2lmaWMgbWVkaWEgaXRlbS4KKyAqIDxsaT57QGxpbmsgI0FDVElPTl9HRVRfU1RBVFVTIEdldCBzdGF0dXN9OiBHZXRzIHRoZSBzdGF0dXMgb2YgYSBtZWRpYSBpdGVtCisgKiBpbmNsdWRpbmcgdGhlIGl0ZW0ncyBjdXJyZW50IHBsYXliYWNrIHBvc2l0aW9uIGFuZCBwcm9ncmVzcy4KKyAqIDxsaT57QGxpbmsgI0FDVElPTl9QQVVTRSBQYXVzZX06IFBhdXNlcyBwbGF5YmFjayBvZiB0aGUgcXVldWUuCisgKiA8bGk+e0BsaW5rICNBQ1RJT05fUkVTVU1FIFJlc3VtZX06IFJlc3VtZXMgcGxheWJhY2sgb2YgdGhlIHF1ZXVlLgorICogPGxpPntAbGluayAjQUNUSU9OX1NUT1AgU3RvcH06IFN0b3BzIHBsYXliYWNrLCBjbGVhcnMgdGhlIHF1ZXVlLCBhbmQgcmVzZXRzIHRoZQorICogcGF1c2Ugc3RhdGUuCisgKiA8L3VsPgorICoKKyAqIDxoND5RdWV1ZSBhY3Rpb25zPC9oND4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBxdWV1ZSBhY3Rpb25zIG11c3QgYmUgc3VwcG9ydGVkIChhbGwgb3Igbm90aGluZykgYnkgcmVtb3RlCisgKiBwbGF5YmFjayByb3V0ZXMgdGhhdCBvZmZlciBvcHRpb25hbCBxdWV1aW5nIGNhcGFiaWxpdGllcy4KKyAqIDwvcD48dWw+CisgKiA8bGk+e0BsaW5rICNBQ1RJT05fRU5RVUVVRSBFbnF1ZXVlfTogRW5xdWV1ZXMgY29udGVudCBzcGVjaWZpZWQgYnkgYSBnaXZlbiBVcmkKKyAqIGFuZCByZXR1cm5zIGEgbmV3IG1lZGlhIGl0ZW0gaWQgdG8gZGVzY3JpYmUgdGhlIHJlcXVlc3QuICBJbXBsaWNpdGx5IGNyZWF0ZXMgYSBuZXcKKyAqIHNlc3Npb24gaWYgbm8gc2Vzc2lvbiBpZCB3YXMgc3BlY2lmaWVkIGFzIGEgcGFyYW1ldGVyLgorICogPGxpPntAbGluayAjQUNUSU9OX1JFTU9WRSBSZW1vdmV9OiBSZW1vdmVzIGEgc3BlY2lmaWVkIG1lZGlhIGl0ZW0gZnJvbSB0aGUgcXVldWUuCisgKiA8L3VsPgorICoKKyAqIDxoND5TZXNzaW9uIGFjdGlvbnM8L2g0PgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIHNlc3Npb24gYWN0aW9ucyBtdXN0IGJlIHN1cHBvcnRlZCAoYWxsIG9yIG5vdGhpbmcpIGJ5IHJlbW90ZQorICogcGxheWJhY2sgcm91dGVzIHRoYXQgb2ZmZXIgb3B0aW9uYWwgc2Vzc2lvbiBtYW5hZ2VtZW50IGNhcGFiaWxpdGllcy4KKyAqIDwvcD48dWw+CisgKiA8bGk+e0BsaW5rICNBQ1RJT05fU1RBUlRfU0VTU0lPTiBTdGFydCBzZXNzaW9ufTogU3RhcnRzIGEgbmV3IHNlc3Npb24gZXhwbGljaXRseS4KKyAqIDxsaT57QGxpbmsgI0FDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVMgR2V0IHNlc3Npb24gc3RhdHVzfTogR2V0cyB0aGUgc3RhdHVzIG9mIGEgc2Vzc2lvbi4KKyAqIDxsaT57QGxpbmsgI0FDVElPTl9FTkRfU0VTU0lPTiBFbmQgc2Vzc2lvbn06IEVuZHMgYSBzZXNzaW9uIGV4cGxpY2l0bHkuCisgKiA8L3VsPgorICoKKyAqIDxoND5JbXBsZW1lbnRhdGlvbiBub3RlPC9oND4KKyAqIDxwPgorICogSW1wbGVtZW50YXRpb25zIG9mIHRoZSByZW1vdGUgcGxheWJhY2sgcHJvdG9jb2wgbXVzdCBpbXBsZW1lbnQgPGVtPmFsbDwvZW0+IG9mIHRoZQorICogZG9jdW1lbnRlZCBhY3Rpb25zLCBwYXJhbWV0ZXJzIGFuZCByZXN1bHRzLiAgTm90ZSB0aGF0IHRoZSBkb2N1bWVudGF0aW9uIGlzIHdyaXR0ZW4gZnJvbQorICogdGhlIHBlcnNwZWN0aXZlIG9mIGEgY2xpZW50IG9mIHRoZSBwcm90b2NvbC4gIEluIHBhcnRpY3VsYXIsIHdoZW5ldmVyIGEgcGFyYW1ldGVyCisgKiBpcyBkZXNjcmliZWQgYXMgYmVpbmcgIm9wdGlvbmFsIiwgaXQgaXMgb25seSBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgY2xpZW50LgorICogQ29tcGxpYW50IG1lZGlhIHJvdXRlIHByb3ZpZGVyIGltcGxlbWVudGF0aW9ucyBvZiB0aGlzIHByb3RvY29sIG11c3Qgc3VwcG9ydCBhbGwKKyAqIG9mIHRoZSBmZWF0dXJlcyBkZXNjcmliZWQgaGVyZWluLgorICogPC9wPgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTWVkaWFDb250cm9sSW50ZW50IHsKKyAgICAvKiBSb3V0ZSBjYXRlZ29yaWVzLiAqLworCisgICAgLyoqCisgICAgICogTWVkaWEgY29udHJvbCBjYXRlZ29yeTogTGl2ZSBhdWRpby4KKyAgICAgKiA8cD4KKyAgICAgKiBBIHJvdXRlIHRoYXQgc3VwcG9ydHMgbGl2ZSBhdWRpbyByb3V0aW5nIHdpbGwgYWxsb3cgdGhlIG1lZGlhIGF1ZGlvIHN0cmVhbQorICAgICAqIHRvIGJlIHNlbnQgdG8gc3VwcG9ydGVkIGRlc3RpbmF0aW9ucy4gIFRoaXMgY2FuIGluY2x1ZGUgaW50ZXJuYWwgc3BlYWtlcnMgb3IKKyAgICAgKiBhdWRpbyBqYWNrcyBvbiB0aGUgZGV2aWNlIGl0c2VsZiwgQTJEUCBkZXZpY2VzLCBhbmQgbW9yZS4KKyAgICAgKiA8L3A+PHA+CisgICAgICogV2hlbiBhIGxpdmUgYXVkaW8gcm91dGUgaXMgc2VsZWN0ZWQsIGF1ZGlvIHJvdXRpbmcgaXMgdHJhbnNwYXJlbnQgdG8gdGhlIGFwcGxpY2F0aW9uLgorICAgICAqIEFsbCBhdWRpbyBwbGF5ZWQgb24gdGhlIG1lZGlhIHN0cmVhbSB3aWxsIGJlIHJvdXRlZCB0byB0aGUgc2VsZWN0ZWQgZGVzdGluYXRpb24uCisgICAgICogPC9wPjxwPgorICAgICAqIFJlZmVyIHRvIHRoZSBjbGFzcyBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzIGFib3V0IGxpdmUgYXVkaW8gcm91dGVzLgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SWV9MSVZFX0FVRElPID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmNhdGVnb3J5LkxJVkVfQVVESU8iOworCisgICAgLyoqCisgICAgICogTWVkaWEgY29udHJvbCBjYXRlZ29yeTogTGl2ZSB2aWRlby4KKyAgICAgKiA8cD4KKyAgICAgKiBBIHJvdXRlIHRoYXQgc3VwcG9ydHMgbGl2ZSB2aWRlbyByb3V0aW5nIHdpbGwgYWxsb3cgYSBtaXJyb3JlZCB2ZXJzaW9uCisgICAgICogb2YgdGhlIGRldmljZSdzIHByaW1hcnkgZGlzcGxheSBvciBhIGN1c3RvbWl6ZWQKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5hcHAuUHJlc2VudGF0aW9uIFByZXNlbnRhdGlvbn0gdG8gYmUgc2VudCB0byBzdXBwb3J0ZWQKKyAgICAgKiBkZXN0aW5hdGlvbnMuCisgICAgICogPC9wPjxwPgorICAgICAqIFdoZW4gYSBsaXZlIHZpZGVvIHJvdXRlIGlzIHNlbGVjdGVkLCBhdWRpbyBhbmQgdmlkZW8gcm91dGluZyBpcyB0cmFuc3BhcmVudAorICAgICAqIHRvIHRoZSBhcHBsaWNhdGlvbi4gIEJ5IGRlZmF1bHQsIGF1ZGlvIGFuZCB2aWRlbyBpcyByb3V0ZWQgdG8gdGhlIHNlbGVjdGVkCisgICAgICogZGVzdGluYXRpb24uICBGb3IgY2VydGFpbiBsaXZlIHZpZGVvIHJvdXRlcywgdGhlIGFwcGxpY2F0aW9uIG1heSBhbHNvIHVzZSBhCisgICAgICoge0BsaW5rIGFuZHJvaWQuYXBwLlByZXNlbnRhdGlvbiBQcmVzZW50YXRpb259IHRvIHJlcGxhY2UgdGhlIG1pcnJvcmVkIHZpZXcKKyAgICAgKiBvbiB0aGUgZXh0ZXJuYWwgZGlzcGxheSB3aXRoIGRpZmZlcmVudCBjb250ZW50LgorICAgICAqIDwvcD48cD4KKyAgICAgKiBSZWZlciB0byB0aGUgY2xhc3MgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscyBhYm91dCBsaXZlIHZpZGVvIHJvdXRlcy4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNnZXRQcmVzZW50YXRpb25EaXNwbGF5KCkKKyAgICAgKiBAc2VlIGFuZHJvaWQuYXBwLlByZXNlbnRhdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JZX0xJVkVfVklERU8gPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuY2F0ZWdvcnkuTElWRV9WSURFTyI7CisKKyAgICAvKioKKyAgICAgKiBNZWRpYSBjb250cm9sIGNhdGVnb3J5OiBSZW1vdGUgcGxheWJhY2suCisgICAgICogPHA+CisgICAgICogQSByb3V0ZSB0aGF0IHN1cHBvcnRzIHJlbW90ZSBwbGF5YmFjayByb3V0aW5nIHdpbGwgYWxsb3cgYW4gYXBwbGljYXRpb24gdG8gc2VuZAorICAgICAqIHJlcXVlc3RzIHRvIHBsYXkgY29udGVudCByZW1vdGVseSB0byBzdXBwb3J0ZWQgZGVzdGluYXRpb25zLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBSZW1vdGUgcGxheWJhY2sgcm91dGVzIGRlc3RpbmF0aW9ucyBvcGVyYXRlIGluZGVwZW5kZW50bHkgb2YgdGhlIGxvY2FsIGRldmljZS4KKyAgICAgKiBXaGVuIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIGlzIHNlbGVjdGVkLCB0aGUgYXBwbGljYXRpb24gY2FuIGNvbnRyb2wgdGhlIGNvbnRlbnQKKyAgICAgKiBwbGF5aW5nIG9uIHRoZSBkZXN0aW5hdGlvbiBieSBzZW5kaW5nIG1lZGlhIGNvbnRyb2wgYWN0aW9ucyB0byB0aGUgcm91dGUuCisgICAgICogVGhlIGFwcGxpY2F0aW9uIG1heSBhbHNvIHJlY2VpdmUgc3RhdHVzIHVwZGF0ZXMgZnJvbSB0aGUgcm91dGUgcmVnYXJkaW5nCisgICAgICogcmVtb3RlIHBsYXliYWNrLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBSZWZlciB0byB0aGUgY2xhc3MgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscyBhYm91dCByZW1vdGUgcGxheWJhY2sgcm91dGVzLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyA9CisgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuY2F0ZWdvcnkuUkVNT1RFX1BMQVlCQUNLIjsKKworICAgIC8qIFJlbW90ZSBwbGF5YmFjayBhY3Rpb25zIHRoYXQgYWZmZWN0IGluZGl2aWR1YWwgaXRlbXMuICovCisKKyAgICAvKioKKyAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IFBsYXkgbWVkaWEgaXRlbS4KKyAgICAgKiA8cD4KKyAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9CisgICAgICogbWVkaWEgY29udHJvbC4KKyAgICAgKiA8L3A+PHA+CisgICAgICogVGhpcyBhY3Rpb24gY2F1c2VzIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIHRvIHN0YXJ0IHBsYXlpbmcgY29udGVudCB3aXRoCisgICAgICogdGhlIHtAbGluayBVcml9IHNwZWNpZmllZCBpbiB0aGUge0BsaW5rIEludGVudH0ncyB7QGxpbmsgSW50ZW50I2dldERhdGEoKSBkYXRhIHVyaX0uCisgICAgICogVGhlIGFjdGlvbiByZXR1cm5zIGEgbWVkaWEgc2Vzc2lvbiBpZCBhbmQgbWVkaWEgaXRlbSBpZCB3aGljaCBjYW4gYmUgdXNlZAorICAgICAqIHRvIGNvbnRyb2wgcGxheWJhY2sgdXNpbmcgb3RoZXIgcmVtb3RlIHBsYXliYWNrIGFjdGlvbnMuCisgICAgICogPC9wPjxwPgorICAgICAqIE9uY2UgaW5pdGlhdGVkLCBwbGF5YmFjayBvZiB0aGUgc3BlY2lmaWVkIGNvbnRlbnQgd2lsbCBiZSBtYW5hZ2VkIGluZGVwZW5kZW50bHkKKyAgICAgKiBieSB0aGUgZGVzdGluYXRpb24uICBUaGUgYXBwbGljYXRpb24gd2lsbCByZWNlaXZlIHN0YXR1cyB1cGRhdGVzIGFzIHRoZSBzdGF0ZQorICAgICAqIG9mIHRoZSBtZWRpYSBpdGVtIGNoYW5nZXMuCisgICAgICogPC9wPjxwPgorICAgICAqIElmIHRoZSBkYXRhIHVyaSBzcGVjaWZpZXMgYW4gSFRUUCBvciBIVFRQUyBzY2hlbWUsIHRoZW4gdGhlIGRlc3RpbmF0aW9uIGlzCisgICAgICogcmVzcG9uc2libGUgZm9yIGZvbGxvd2luZyBIVFRQIHJlZGlyZWN0cyB0byBhIHJlYXNvbmFibGUgZGVwdGggb2YgYXQgbGVhc3QgMworICAgICAqIGxldmVscyBhcyBtaWdodCB0eXBpY2FsbHkgYmUgaGFuZGxlZCBieSBhIHdlYiBicm93c2VyLiAgSWYgYW4gSFRUUCBlcnJvcgorICAgICAqIG9jY3VycywgdGhlbiB0aGUgZGVzdGluYXRpb24gc2hvdWxkIHNlbmQgYSB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzIHN0YXR1cyB1cGRhdGV9CisgICAgICogYmFjayB0byB0aGUgY2xpZW50IGluZGljYXRpbmcgdGhlIHtAbGluayBNZWRpYUl0ZW1TdGF0dXMjUExBWUJBQ0tfU1RBVEVfRVJST1IgZXJyb3J9CisgICAgICoge0BsaW5rIE1lZGlhSXRlbVN0YXR1cyNnZXRQbGF5YmFja1N0YXRlKCkgcGxheWJhY2sgc3RhdGV9LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIDxoMz5PbmUgaXRlbSBhdCBhIHRpbWU8L2gzPgorICAgICAqIDxwPgorICAgICAqIEVhY2ggc3VjY2Vzc2Z1bCBwbGF5IGFjdGlvbiA8ZW0+cmVwbGFjZXM8L2VtPiB0aGUgcHJldmlvdXMgcGxheSBhY3Rpb24uCisgICAgICogSWYgYW4gaXRlbSBpcyBhbHJlYWR5IHBsYXlpbmcsIHRoZW4gaXQgaXMgY2FuY2VsZWQsIHRoZSBzZXNzaW9uJ3MgcGxheWJhY2sgcXVldWUKKyAgICAgKiBpcyBjbGVhcmVkIGFuZCB0aGUgbmV3IGl0ZW0gYmVnaW5zIHBsYXlpbmcgaW1tZWRpYXRlbHkgKHJlZ2FyZGxlc3Mgb2YKKyAgICAgKiB3aGV0aGVyIHRoZSBwcmV2aW91c2x5IHBsYXlpbmcgaXRlbSBoYWQgYmVlbiBwYXVzZWQpLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBQbGF5IGlzIHRoZXJlZm9yZSBlcXVpdmFsZW50IHRvIHtAbGluayAjQUNUSU9OX1NUT1Agc3RvcH0gZm9sbG93ZWQgYnkgYW4gYWN0aW9uCisgICAgICogdG8gZW5xdWV1ZSBhIG5ldyBtZWRpYSBpdGVtIHRvIGJlIHBsYXllZCBpbW1lZGlhdGVseS4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiA8aDM+U2Vzc2lvbnM8L2gzPgorICAgICAqIDxwPgorICAgICAqIFRoaXMgcmVxdWVzdCBoYXMgdGhlIGVmZmVjdCBvZiBpbXBsaWNpdGx5IGNyZWF0aW5nIGEgbWVkaWEgc2Vzc2lvbiB3aGVuZXZlciB0aGUKKyAgICAgKiBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzcGVjaWZ5IHRoZSB7QGxpbmsgI0VYVFJBX1NFU1NJT05fSUQgc2Vzc2lvbiBpZH0gcGFyYW1ldGVyLgorICAgICAqIEJlY2F1c2UgdGhlcmUgY2FuIG9ubHkgYmUgYXQgbW9zdCBvbmUgdmFsaWQgc2Vzc2lvbiBhdCBhIHRpbWUsIGNyZWF0aW5nIGEgbmV3IHNlc3Npb24KKyAgICAgKiBoYXMgdGhlIHNpZGUtZWZmZWN0IG9mIGludmFsaWRhdGluZyBhbnkgZXhpc3Rpbmcgc2Vzc2lvbnMgYW5kIHRoZWlyIG1lZGlhIGl0ZW1zLAorICAgICAqIHRoZW4gaGFuZGxpbmcgdGhlIHBsYXliYWNrIHJlcXVlc3Qgd2l0aCBhIG5ldyBzZXNzaW9uLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBJZiB0aGUgYXBwbGljYXRpb24gc3BlY2lmaWVzIGFuIGludmFsaWQgc2Vzc2lvbiBpZCwgdGhlbiBhbiBlcnJvciBpcyByZXR1cm5lZC4KKyAgICAgKiBXaGVuIHRoaXMgaGFwcGVucywgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBhc3N1bWUgdGhhdCBpdHMgc2Vzc2lvbgorICAgICAqIGlzIG5vIGxvbmdlciB2YWxpZC4gIFRvIG9idGFpbiBhIG5ldyBzZXNzaW9uLCB0aGUgYXBwbGljYXRpb24gbWF5IHRyeSBhZ2FpbgorICAgICAqIGFuZCBvbWl0IHRoZSBzZXNzaW9uIGlkIHBhcmFtZXRlci4gIEhvd2V2ZXIsIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQKKyAgICAgKiBvbmx5IHJldHJ5IHJlcXVlc3RzIGR1ZSB0byBhbiBleHBsaWNpdCBhY3Rpb24gcGVyZm9ybWVkIGJ5IHRoZSB1c2VyLAorICAgICAqIHN1Y2ggYXMgdGhlIHVzZXIgY2xpY2tpbmcgb24gYSAicGxheSIgYnV0dG9uIGluIHRoZSBVSSwgc2luY2UgYW5vdGhlcgorICAgICAqIGFwcGxpY2F0aW9uIG1heSBiZSB0cnlpbmcgdG8gdGFrZSBjb250cm9sIG9mIHRoZSByb3V0ZSBhbmQgdGhlIGZvcm1lcgorICAgICAqIGFwcGxpY2F0aW9uIHNob3VsZCB0cnkgdG8gc3RheSBvdXQgb2YgaXRzIHdheS4KKyAgICAgKiA8L3A+PHA+CisgICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gc2Vzc2lvbnMsIHF1ZXVlcyBhbmQgbWVkaWEgaXRlbXMsIHBsZWFzZSByZWZlciB0byB0aGUKKyAgICAgKiBjbGFzcyBkb2N1bWVudGF0aW9uLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YgdGhlCisgICAgICogc2Vzc2lvbiB0byB3aGljaCB0aGUgcGxheWJhY2sgcmVxdWVzdCBiZWxvbmdzLiAgSWYgb21pdHRlZCwgYSBuZXcgc2Vzc2lvbgorICAgICAqIGlzIGNyZWF0ZWQgaW1wbGljaXRseS4KKyAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX0NPTlRFTlRfUE9TSVRJT059IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyB0aGUgaW5pdGlhbAorICAgICAqIGNvbnRlbnQgcGxheWJhY2sgcG9zaXRpb24gYXMgYSBsb25nIGludGVnZXIgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBmcm9tCisgICAgICogdGhlIGJlZ2lubmluZyBvZiB0aGUgY29udGVudC4KKyAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX01FVEFEQVRBfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgbWV0YWRhdGEgYXNzb2NpYXRlZAorICAgICAqIHdpdGggdGhlIGNvbnRlbnQgc3VjaCBhcyB0aGUgdGl0bGUgb2YgYSBzb25nLgorICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fU1RBVFVTX1VQREFURV9SRUNFSVZFUn0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIGEKKyAgICAgKiB7QGxpbmsgUGVuZGluZ0ludGVudH0gZm9yIGEgYnJvYWRjYXN0IHJlY2VpdmVyIHRoYXQgd2lsbCByZWNlaXZlIHN0YXR1cyB1cGRhdGVzCisgICAgICogYWJvdXQgdGhlIG1lZGlhIGl0ZW0uCisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4oYWx3YXlzIHJldHVybmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YgdGhlCisgICAgICogc2Vzc2lvbiB0aGF0IHdhcyBhZmZlY3RlZCBieSB0aGUgcmVxdWVzdC4gIFRoaXMgd2lsbCBiZSBhIG5ldyBzZXNzaW9uIGluCisgICAgICogdGhlIGNhc2Ugd2hlcmUgbm8gc2Vzc2lvbiBpZCB3YXMgc3VwcGxpZWQgYXMgYSBwYXJhbWV0ZXIuCisgICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4ob3B0aW9uYWwsIG9sZCBpbXBsZW1lbnRhdGlvbnMgbWF5CisgICAgICogb21pdCB0aGlzIGtleSk8L2VtPjogU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlIG1lZGlhIHNlc3Npb24uCisgICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9JRH0gPGVtPihhbHdheXMgcmV0dXJuZWQpPC9lbT46IFNwZWNpZmllcyBhbiBvcGFxdWUgc3RyaW5nIGlkZW50aWZpZXIKKyAgICAgKiB0byB1c2UgdG8gcmVmZXIgdG8gdGhlIG1lZGlhIGl0ZW0gaW4gc3Vic2VxdWVudCByZXF1ZXN0cyBzdWNoIGFzCisgICAgICoge0BsaW5rICNBQ1RJT05fR0VUX1NUQVRVU30uCisgICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9TVEFUVVN9IDxlbT4oYWx3YXlzIHJldHVybmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGluaXRpYWwgc3RhdHVzIG9mCisgICAgICogdGhlIG5ldyBtZWRpYSBpdGVtLgorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiA8aDM+U3RhdHVzIHVwZGF0ZXM8L2gzPgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSBjbGllbnQgc3VwcGxpZXMgYW4KKyAgICAgKiB7QGxpbmsgI0VYVFJBX0lURU1fU1RBVFVTX1VQREFURV9SRUNFSVZFUiBpdGVtIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJ9CisgICAgICogdGhlbiB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgc3RhdHVzIHVwZGF0ZXMgdG8gdGhlIHJlY2VpdmVyCisgICAgICogd2hlbiBzaWduaWZpY2FudCBtZWRpYSBpdGVtIHN0YXRlIGNoYW5nZXMgb2NjdXIgc3VjaCBhcyB3aGVuIHBsYXliYWNrIHN0YXJ0cyBvcgorICAgICAqIHN0b3BzLiAgVGhlIHJlY2VpdmVyIHdpbGwgbm90IGJlIGludm9rZWQgZm9yIGNvbnRlbnQgcGxheWJhY2sgcG9zaXRpb24gY2hhbmdlcy4KKyAgICAgKiBUaGUgYXBwbGljYXRpb24gbWF5IHJldHJpZXZlIHRoZSBjdXJyZW50IHBsYXliYWNrIHBvc2l0aW9uIHdoZW4gbmVjZXNzYXJ5CisgICAgICogdXNpbmcgdGhlIHtAbGluayAjQUNUSU9OX0dFVF9TVEFUVVN9IHJlcXVlc3QuCisgICAgICogPC9wPjxwPgorICAgICAqIFJlZmVyIHRvIHtAbGluayBNZWRpYUl0ZW1TdGF0dXN9IGZvciBkZXRhaWxzLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIDxoMz5FcnJvcnM8L2gzPgorICAgICAqIDxwPgorICAgICAqIFRoaXMgYWN0aW9uIHJldHVybnMgYW4gZXJyb3IgaWYgYSBzZXNzaW9uIGlkIHdhcyBwcm92aWRlZCBidXQgaXMgdW5rbm93biBvcgorICAgICAqIG5vIGxvbmdlciB2YWxpZCwgaWYgdGhlIGl0ZW0gVXJpIG9yIGNvbnRlbnQgdHlwZSBpcyBub3Qgc3VwcG9ydGVkLCBvciBpZgorICAgICAqIGFueSBvdGhlciBhcmd1bWVudHMgYXJlIGludmFsaWQuCisgICAgICogPC9wPjx1bD4KKyAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9FUlJPUl9DT0RFfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGNhdXNlIG9mIHRoZSBlcnJvci4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogPGgzPkV4YW1wbGU8L2gzPgorICAgICAqIDxwcmU+CisgICAgICogTWVkaWFSb3V0ZXIgbWVkaWFSb3V0ZXIgPSBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZShjb250ZXh0KTsKKyAgICAgKiBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBtZWRpYVJvdXRlci5nZXRTZWxlY3RlZFJvdXRlKCk7CisgICAgICogSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9QTEFZKTsKKyAgICAgKiBpbnRlbnQuYWRkQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyk7CisgICAgICogaW50ZW50LnNldERhdGFBbmRUeXBlKCJodHRwOi8vZXhhbXBsZS5jb20vdmlkZW9zL21vdmllLm1wNCIsICJ2aWRlby9tcDQiKTsKKyAgICAgKiBpZiAocm91dGUuc3VwcG9ydHNDb250cm9sUmVxdWVzdChpbnRlbnQpKSB7CisgICAgICogICAgIE1lZGlhUm91dGVyLkNvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgY2FsbGJhY2sgPSBuZXcgTWVkaWFSb3V0ZXIuQ29udHJvbFJlcXVlc3RDYWxsYmFjaygpIHsKKyAgICAgKiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhKSB7CisgICAgICogICAgICAgICAgICAgLy8gVGhlIHJlcXVlc3Qgc3VjY2VlZGVkLgorICAgICAqICAgICAgICAgICAgIC8vIFBsYXliYWNrIG1heSBiZSBjb250cm9sbGVkIHVzaW5nIHRoZSByZXR1cm5lZCBzZXNzaW9uIGFuZCBpdGVtIGlkLgorICAgICAqICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWQgPSBkYXRhLmdldFN0cmluZyhNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfU0VTU0lPTl9JRCk7CisgICAgICogICAgICAgICAgICAgU3RyaW5nIGl0ZW1JZCA9IGRhdGEuZ2V0U3RyaW5nKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9JVEVNX0lEKTsKKyAgICAgKiAgICAgICAgICAgICBNZWRpYUl0ZW1TdGF0dXMgc3RhdHVzID0gTWVkaWFJdGVtU3RhdHVzLmZyb21CdW5kbGUoZGF0YS5nZXRCdW5kbGUoCisgICAgICogICAgICAgICAgICAgICAgICAgICBNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9TVEFUVVMpKTsKKyAgICAgKiAgICAgICAgICAgICAvLyAuLi4KKyAgICAgKiAgICAgICAgIH0KKyAgICAgKgorICAgICAqICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihTdHJpbmcgbWVzc2FnZSwgQnVuZGxlIGRhdGEpIHsKKyAgICAgKiAgICAgICAgICAgICAvLyBBbiBlcnJvciBvY2N1cnJlZCEKKyAgICAgKiAgICAgICAgIH0KKyAgICAgKiAgICAgfTsKKyAgICAgKiAgICAgcm91dGUuc2VuZENvbnRyb2xSZXF1ZXN0KGludGVudCwgY2FsbGJhY2spOworICAgICAqIH08L3ByZT4KKyAgICAgKgorICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAorICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSworICAgICAqIEBzZWUgI0FDVElPTl9TRUVLCisgICAgICogQHNlZSAjQUNUSU9OX0dFVF9TVEFUVVMKKyAgICAgKiBAc2VlICNBQ1RJT05fUEFVU0UKKyAgICAgKiBAc2VlICNBQ1RJT05fUkVTVU1FCisgICAgICogQHNlZSAjQUNUSU9OX1NUT1AKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fUExBWSA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uUExBWSI7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IEVucXVldWUgbWVkaWEgaXRlbS4KKyAgICAgKiA8cD4KKyAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9CisgICAgICogbWVkaWEgY29udHJvbC4KKyAgICAgKiA8L3A+PHA+CisgICAgICogVGhpcyBhY3Rpb24gd29ya3MganVzdCBsaWtlIHtAbGluayAjQUNUSU9OX1BMQVkgcGxheX0gZXhjZXB0IHRoYXQgaXQgZG9lcworICAgICAqIG5vdCBjbGVhciB0aGUgcXVldWUgb3IgcmVzZXQgdGhlIHBhdXNlIHN0YXRlIHdoZW4gaXQgZW5xdWV1ZXMgdGhlCisgICAgICogbmV3IG1lZGlhIGl0ZW0gaW50byB0aGUgc2Vzc2lvbidzIHBsYXliYWNrIHF1ZXVlLiAgVGhpcyBhY3Rpb24gb25seQorICAgICAqIGVucXVldWVzIGEgbWVkaWEgaXRlbSB3aXRoIG5vIG90aGVyIHNpZGUtZWZmZWN0cyBvbiB0aGUgcXVldWUuCisgICAgICogPC9wPjxwPgorICAgICAqIElmIHRoZSBxdWV1ZSBpcyBjdXJyZW50bHkgZW1wdHkgYW5kIHRoZW4gdGhlIGl0ZW0gd2lsbCBwbGF5IGltbWVkaWF0ZWx5CisgICAgICogKGFzc3VtaW5nIHRoZSBxdWV1ZSBpcyBub3QgcGF1c2VkKS4gIE90aGVyd2lzZSwgdGhlIGl0ZW0gd2lsbCBwbGF5CisgICAgICogYWZ0ZXIgYWxsIGVhcmxpZXIgaXRlbXMgaW4gdGhlIHF1ZXVlIGhhdmUgZmluaXNoZWQgb3IgYmVlbiByZW1vdmVkLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBUaGUgZW5xdWV1ZSBhY3Rpb24gY2FuIGJlIHVzZWQgdG8gY3JlYXRlIG5ldyBzZXNzaW9ucyBqdXN0IGxpa2UgcGxheS4KKyAgICAgKiBJdHMgcGFyYW1ldGVycyBhbmQgcmVzdWx0cyBhcmUgYWxzbyB0aGUgc2FtZS4gIE9ubHkgdGhlIHF1ZXVpbmcgYmVoYXZpb3IKKyAgICAgKiBpcyBkaWZmZXJlbnQuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHNlZSAjQUNUSU9OX1BMQVkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fRU5RVUVVRSA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uRU5RVUVVRSI7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IFNlZWsgbWVkaWEgaXRlbSB0byBhIG5ldyBwbGF5YmFjayBwb3NpdGlvbi4KKyAgICAgKiA8cD4KKyAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9CisgICAgICogbWVkaWEgY29udHJvbC4KKyAgICAgKiA8L3A+PHA+CisgICAgICogVGhpcyBhY3Rpb24gY2F1c2VzIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIHRvIG1vZGlmeSB0aGUgY3VycmVudCBwbGF5YmFjayBwb3NpdGlvbgorICAgICAqIG9mIHRoZSBzcGVjaWZpZWQgbWVkaWEgaXRlbS4KKyAgICAgKiA8L3A+PHA+CisgICAgICogVGhpcyBhY3Rpb24gb25seSBhZmZlY3RzIHRoZSBwbGF5YmFjayBwb3NpdGlvbiBvZiB0aGUgbWVkaWEgaXRlbTsgbm90IGl0cyBwbGF5YmFjayBzdGF0ZS4KKyAgICAgKiBJZiB0aGUgcGxheWJhY2sgcXVldWUgaXMgcGF1c2VkLCB0aGVuIHNlZWtpbmcgc2V0cyB0aGUgcG9zaXRpb24gYnV0IHRoZSBpdGVtCisgICAgICogcmVtYWlucyBwYXVzZWQuICBMaWtld2lzZSBpZiB0aGUgaXRlbSBpcyBwbGF5aW5nLCB0aGVuIHNlZWtpbmcgd2lsbCBjYXVzZSBwbGF5YmFjaworICAgICAqIHRvIGp1bXAgdG8gdGhlIG5ldyBwb3NpdGlvbiBhbmQgY29udGludWUgcGxheWluZyBmcm9tIHRoYXQgcG9pbnQuICBJZiB0aGUgaXRlbSBoYXMKKyAgICAgKiBub3QgeWV0IHN0YXJ0ZWQgcGxheWluZywgdGhlbiB0aGUgbmV3IHBsYXliYWNrIHBvc2l0aW9uIGlzIHJlbWVtYmVyZWQgYnkgdGhlCisgICAgICogcXVldWUgYW5kIHVzZWQgYXMgdGhlIGl0ZW0ncyBpbml0aWFsIGNvbnRlbnQgcG9zaXRpb24gd2hlbiBwbGF5YmFjayBldmVudHVhbGx5IGJlZ2lucy4KKyAgICAgKiA8L3A+PHA+CisgICAgICogSWYgc3VjY2Vzc2Z1bCwgdGhlIG1lZGlhIGl0ZW0ncyBwbGF5YmFjayBwb3NpdGlvbiBpcyBjaGFuZ2VkLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YgdGhlIHNlc3Npb24KKyAgICAgKiB0byB3aGljaCB0aGUgbWVkaWEgaXRlbSBiZWxvbmdzLgorICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgbWVkaWEgaXRlbSBpZCBvZgorICAgICAqIHRoZSBtZWRpYSBpdGVtIHRvIHNlZWsuCisgICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9DT05URU5UX1BPU0lUSU9OfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIG5ldworICAgICAqIGNvbnRlbnQgcG9zaXRpb24gZm9yIHBsYXliYWNrIGFzIGEgbG9uZyBpbnRlZ2VyIG51bWJlciBvZiBtaWxsaXNlY29uZHMgZnJvbQorICAgICAqIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbnRlbnQuCisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KG9wdGlvbmFsLCBvbGQgaW1wbGVtZW50YXRpb25zIG1heQorICAgICAqIG9taXQgdGhpcyBrZXkpPC9lbT46IFNwZWNpZmllcyB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgorICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fU1RBVFVTfSA8ZW0+KGFsd2F5cyByZXR1cm5lZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBuZXcgc3RhdHVzIG9mCisgICAgICogdGhlIG1lZGlhIGl0ZW0uCisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIDxoMz5FcnJvcnM8L2gzPgorICAgICAqIDxwPgorICAgICAqIFRoaXMgYWN0aW9uIHJldHVybnMgYW4gZXJyb3IgaWYgdGhlIHNlc3Npb24gaWQgb3IgbWVkaWEgaXRlbSBpZCBhcmUgdW5rbm93bgorICAgICAqIG9yIG5vIGxvbmdlciB2YWxpZCwgaWYgdGhlIGNvbnRlbnQgcG9zaXRpb24gaXMgaW52YWxpZCwgb3IgaWYgdGhlIG1lZGlhIGl0ZW0KKyAgICAgKiBpcyBpbiBhIHRlcm1pbmFsIHN0YXRlLgorICAgICAqIDwvcD48dWw+CisgICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAorICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TRUVLID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5TRUVLIjsKKworICAgIC8qKgorICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogR2V0IG1lZGlhIGl0ZW0gcGxheWJhY2sgc3RhdHVzCisgICAgICogYW5kIHByb2dyZXNzIGluZm9ybWF0aW9uLgorICAgICAqIDxwPgorICAgICAqIFVzZWQgd2l0aCByb3V0ZXMgdGhhdCBzdXBwb3J0IHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFja30KKyAgICAgKiBtZWRpYSBjb250cm9sLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBUaGlzIGFjdGlvbiBhc2tzIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIHRvIHByb3ZpZGUgdXBkYXRlZCBwbGF5YmFjayBzdGF0dXMgYW5kIHByb2dyZXNzCisgICAgICogaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNwZWNpZmllZCBtZWRpYSBpdGVtLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YgdGhlIHNlc3Npb24KKyAgICAgKiB0byB3aGljaCB0aGUgbWVkaWEgaXRlbSBiZWxvbmdzLgorICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgbWVkaWEgaXRlbSBpZCBvZgorICAgICAqIHRoZSBtZWRpYSBpdGVtIHRvIHF1ZXJ5LgorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiA8aDM+UmVzdWx0IGRhdGE8L2gzPgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU30gPGVtPihvcHRpb25hbCwgb2xkIGltcGxlbWVudGF0aW9ucyBtYXkKKyAgICAgKiBvbWl0IHRoaXMga2V5KTwvZW0+OiBTcGVjaWZpZXMgdGhlIHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbi4KKyAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX1NUQVRVU30gPGVtPihhbHdheXMgcmV0dXJuZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgY3VycmVudCBzdGF0dXMgb2YKKyAgICAgKiB0aGUgbWVkaWEgaXRlbS4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogPGgzPkVycm9yczwvaDM+CisgICAgICogPHA+CisgICAgICogVGhpcyBhY3Rpb24gcmV0dXJucyBhbiBlcnJvciBpZiB0aGUgc2Vzc2lvbiBpZCBvciBtZWRpYSBpdGVtIGlkIGFyZSB1bmtub3duCisgICAgICogb3Igbm8gbG9uZ2VyIHZhbGlkLgorICAgICAqIDwvcD48dWw+CisgICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAorICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSworICAgICAqIEBzZWUgI0VYVFJBX0lURU1fU1RBVFVTX1VQREFURV9SRUNFSVZFUgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9HRVRfU1RBVFVTID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5HRVRfU1RBVFVTIjsKKworICAgIC8qKgorICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogUmVtb3ZlIG1lZGlhIGl0ZW0gZnJvbSBzZXNzaW9uJ3MgcXVldWUuCisgICAgICogPHA+CisgICAgICogVXNlZCB3aXRoIHJvdXRlcyB0aGF0IHN1cHBvcnQge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgcmVtb3RlIHBsYXliYWNrfQorICAgICAqIG1lZGlhIGNvbnRyb2wuCisgICAgICogPC9wPjxwPgorICAgICAqIFRoaXMgYWN0aW9uIGFza3MgYSByZW1vdGUgcGxheWJhY2sgcm91dGUgdG8gcmVtb3ZlIHRoZSBzcGVjaWZpZWQgbWVkaWEgaXRlbQorICAgICAqIGZyb20gdGhlIHNlc3Npb24ncyBwbGF5YmFjayBxdWV1ZS4gIElmIHRoZSBjdXJyZW50IGl0ZW0gaXMgcmVtb3ZlZCwgdGhlbgorICAgICAqIHBsYXliYWNrIHdpbGwgcHJvY2VlZCB0byB0aGUgbmV4dCBtZWRpYSBpdGVtIChhc3N1bWluZyB0aGUgcXVldWUgaGFzIG5vdCBiZWVuCisgICAgICogcGF1c2VkKS4KKyAgICAgKiA8L3A+PHA+CisgICAgICogVGhpcyBhY3Rpb24gZG9lcyBub3QgYWZmZWN0IHRoZSBwYXVzZSBzdGF0ZSBvZiB0aGUgcXVldWUuICBJZiB0aGUgcXVldWUgd2FzIHBhdXNlZAorICAgICAqIHRoZW4gaXQgcmVtYWlucyBwYXVzZWQgKGV2ZW4gaWYgaXQgaXMgbm93IGVtcHR5KSB1bnRpbCBhIHJlc3VtZSwgc3RvcCBvciBwbGF5CisgICAgICogYWN0aW9uIGlzIGlzc3VlZCB0aGF0IGNhdXNlcyB0aGUgcGF1c2Ugc3RhdGUgdG8gYmUgY2xlYXJlZC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiA8aDM+UmVxdWVzdCBwYXJhbWV0ZXJzPC9oMz4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mIHRoZSBzZXNzaW9uCisgICAgICogdG8gd2hpY2ggdGhlIG1lZGlhIGl0ZW0gYmVsb25ncy4KKyAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIG1lZGlhIGl0ZW0gaWQgb2YKKyAgICAgKiB0aGUgbWVkaWEgaXRlbSB0byByZW1vdmUuCisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KG9wdGlvbmFsLCBvbGQgaW1wbGVtZW50YXRpb25zIG1heQorICAgICAqIG9taXQgdGhpcyBrZXkpPC9lbT46IFNwZWNpZmllcyB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgorICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fU1RBVFVTfSA8ZW0+KGFsd2F5cyByZXR1cm5lZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBuZXcgc3RhdHVzIG9mCisgICAgICogdGhlIG1lZGlhIGl0ZW0uCisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIDxoMz5FcnJvcnM8L2gzPgorICAgICAqIDxwPgorICAgICAqIFRoaXMgYWN0aW9uIHJldHVybnMgYW4gZXJyb3IgaWYgdGhlIHNlc3Npb24gaWQgb3IgbWVkaWEgaXRlbSBpZCBhcmUgdW5rbm93bgorICAgICAqIG9yIG5vIGxvbmdlciB2YWxpZCwgb3IgaWYgdGhlIG1lZGlhIGl0ZW0gaXMgaW4gYSB0ZXJtaW5hbCBzdGF0ZSAoYW5kIHRoZXJlZm9yZQorICAgICAqIG5vIGxvbmdlciBpbiB0aGUgcXVldWUpLgorICAgICAqIDwvcD48dWw+CisgICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAorICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9SRU1PVkUgPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuYWN0aW9uLlJFTU9WRSI7CisKKyAgICAvKiBSZW1vdGUgcGxheWJhY2sgYWN0aW9ucyB0aGF0IGFmZmVjdCB0aGUgd2hvbGUgcGxheWJhY2sgcXVldWUuICovCisKKyAgICAvKioKKyAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IFBhdXNlIG1lZGlhIHBsYXliYWNrLgorICAgICAqIDxwPgorICAgICAqIFVzZWQgd2l0aCByb3V0ZXMgdGhhdCBzdXBwb3J0IHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFja30KKyAgICAgKiBtZWRpYSBjb250cm9sLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBUaGlzIGFjdGlvbiBjYXVzZXMgdGhlIHBsYXliYWNrIHF1ZXVlIG9mIHRoZSBzcGVjaWZpZWQgc2Vzc2lvbiB0byBiZSBwYXVzZWQuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogPGgzPlJlcXVlc3QgcGFyYW1ldGVyczwvaDM+CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZiB0aGUgc2Vzc2lvbgorICAgICAqIHdob3NlIHBsYXliYWNrIHF1ZXVlIGlzIHRvIGJlIHBhdXNlZC4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogPGgzPlJlc3VsdCBkYXRhPC9oMz4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4ob3B0aW9uYWwsIG9sZCBpbXBsZW1lbnRhdGlvbnMgbWF5CisgICAgICogb21pdCB0aGlzIGtleSk8L2VtPjogU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlIG1lZGlhIHNlc3Npb24uCisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIDxoMz5FcnJvcnM8L2gzPgorICAgICAqIDxwPgorICAgICAqIFRoaXMgYWN0aW9uIHJldHVybnMgYW4gZXJyb3IgaWYgdGhlIHNlc3Npb24gaWQgaXMgdW5rbm93biBvciBubyBsb25nZXIgdmFsaWQuCisgICAgICogPC9wPjx1bD4KKyAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9FUlJPUl9DT0RFfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGNhdXNlIG9mIHRoZSBlcnJvci4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogQHNlZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0CisgICAgICogQHNlZSAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLCisgICAgICogQHNlZSAjQUNUSU9OX1JFU1VNRQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9QQVVTRSA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uUEFVU0UiOworCisgICAgLyoqCisgICAgICogUmVtb3RlIHBsYXliYWNrIG1lZGlhIGNvbnRyb2wgYWN0aW9uOiBSZXN1bWUgbWVkaWEgcGxheWJhY2sgKHVucGF1c2UpLgorICAgICAqIDxwPgorICAgICAqIFVzZWQgd2l0aCByb3V0ZXMgdGhhdCBzdXBwb3J0IHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFja30KKyAgICAgKiBtZWRpYSBjb250cm9sLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBUaGlzIGFjdGlvbiBjYXVzZXMgdGhlIHBsYXliYWNrIHF1ZXVlIG9mIHRoZSBzcGVjaWZpZWQgc2Vzc2lvbiB0byBiZSByZXN1bWVkLgorICAgICAqIFJldmVyc2VzIHRoZSBlZmZlY3RzIG9mIHtAbGluayAjQUNUSU9OX1BBVVNFfS4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiA8aDM+UmVxdWVzdCBwYXJhbWV0ZXJzPC9oMz4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mIHRoZSBzZXNzaW9uCisgICAgICogd2hvc2UgcGxheWJhY2sgcXVldWUgaXMgdG8gYmUgcmVzdW1lZC4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogPGgzPlJlc3VsdCBkYXRhPC9oMz4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4ob3B0aW9uYWwsIG9sZCBpbXBsZW1lbnRhdGlvbnMgbWF5CisgICAgICogb21pdCB0aGlzIGtleSk8L2VtPjogU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlIG1lZGlhIHNlc3Npb24uCisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIDxoMz5FcnJvcnM8L2gzPgorICAgICAqIDxwPgorICAgICAqIFRoaXMgYWN0aW9uIHJldHVybnMgYW4gZXJyb3IgaWYgdGhlIHNlc3Npb24gaWQgaXMgdW5rbm93biBvciBubyBsb25nZXIgdmFsaWQuCisgICAgICogPC9wPjx1bD4KKyAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9FUlJPUl9DT0RFfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGNhdXNlIG9mIHRoZSBlcnJvci4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogQHNlZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0CisgICAgICogQHNlZSAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLCisgICAgICogQHNlZSAjQUNUSU9OX1BBVVNFCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1JFU1VNRSA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uUkVTVU1FIjsKKworICAgIC8qKgorICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogU3RvcCBtZWRpYSBwbGF5YmFjayAoY2xlYXIgcXVldWUgYW5kIHVucGF1c2UpLgorICAgICAqIDxwPgorICAgICAqIFVzZWQgd2l0aCByb3V0ZXMgdGhhdCBzdXBwb3J0IHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFja30KKyAgICAgKiBtZWRpYSBjb250cm9sLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBUaGlzIGFjdGlvbiBjYXVzZXMgYSByZW1vdGUgcGxheWJhY2sgcm91dGUgdG8gc3RvcCBwbGF5YmFjaywgY2FuY2VsIGFuZCByZW1vdmUKKyAgICAgKiBhbGwgbWVkaWEgaXRlbXMgZnJvbSB0aGUgc2Vzc2lvbidzIG1lZGlhIGl0ZW0gcXVldWUgYW5kLCByZXNldCB0aGUgcXVldWUncworICAgICAqIHBhdXNlIHN0YXRlLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBJZiBzdWNjZXNzZnVsLCB0aGUgc3RhdHVzIG9mIGFsbCBtZWRpYSBpdGVtcyBpbiB0aGUgcXVldWUgaXMgc2V0IHRvCisgICAgICoge0BsaW5rIE1lZGlhSXRlbVN0YXR1cyNQTEFZQkFDS19TVEFURV9DQU5DRUxFRCBjYW5jZWxlZH0gYW5kIGEgc3RhdHVzIHVwZGF0ZSBpcyBzZW50CisgICAgICogdG8gdGhlIGFwcHJvcHJpYXRlIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJzIGluZGljYXRpbmcgdGhlIG5ldyBzdGF0dXMgb2YgZWFjaCBpdGVtLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YKKyAgICAgKiB0aGUgc2Vzc2lvbiB3aG9zZSBwbGF5YmFjayBxdWV1ZSBpcyB0byBiZSBzdG9wcGVkIChjbGVhcmVkIGFuZCB1bnBhdXNlZCkuCisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KG9wdGlvbmFsLCBvbGQgaW1wbGVtZW50YXRpb25zIG1heQorICAgICAqIG9taXQgdGhpcyBrZXkpPC9lbT46IFNwZWNpZmllcyB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiA8aDM+RXJyb3JzPC9oMz4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBzZXNzaW9uIGlkIGlzIHVua25vd24gb3Igbm8gbG9uZ2VyIHZhbGlkLgorICAgICAqIDwvcD48dWw+CisgICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAorICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TVE9QID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5TVE9QIjsKKworICAgIC8qKgorICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogU3RhcnQgc2Vzc2lvbi4KKyAgICAgKiA8cD4KKyAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9CisgICAgICogbWVkaWEgY29udHJvbC4KKyAgICAgKiA8L3A+PHA+CisgICAgICogVGhpcyBhY3Rpb24gY2F1c2VzIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIHRvIGludmFsaWRhdGUgdGhlIGN1cnJlbnQgc2Vzc2lvbgorICAgICAqIGFuZCBzdGFydCBhIG5ldyBzZXNzaW9uLiAgVGhlIG5ldyBzZXNzaW9uIGluaXRpYWxseSBoYXMgYW4gZW1wdHkgcXVldWUuCisgICAgICogPC9wPjxwPgorICAgICAqIElmIHN1Y2Nlc3NmdWwsIHRoZSBzdGF0dXMgb2YgYWxsIG1lZGlhIGl0ZW1zIGluIHRoZSBwcmV2aW91cyBzZXNzaW9uJ3MgcXVldWUgaXMgc2V0IHRvCisgICAgICoge0BsaW5rIE1lZGlhSXRlbVN0YXR1cyNQTEFZQkFDS19TVEFURV9JTlZBTElEQVRFRCBpbnZhbGlkYXRlZH0gYW5kIGEgc3RhdHVzIHVwZGF0ZQorICAgICAqIGlzIHNlbnQgdG8gdGhlIGFwcHJvcHJpYXRlIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJzIGluZGljYXRpbmcgdGhlIG5ldyBzdGF0dXMKKyAgICAgKiBvZiBlYWNoIGl0ZW0uICBUaGUgcHJldmlvdXMgc2Vzc2lvbiBiZWNvbWVzIG5vIGxvbmdlciB2YWxpZCBhbmQgdGhlIG5ldyBzZXNzaW9uCisgICAgICogdGFrZXMgY29udHJvbCBvZiB0aGUgcm91dGUuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogPGgzPlJlcXVlc3QgcGFyYW1ldGVyczwvaDM+CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTX1VQREFURV9SRUNFSVZFUn0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIGEKKyAgICAgKiB7QGxpbmsgUGVuZGluZ0ludGVudH0gZm9yIGEgYnJvYWRjYXN0IHJlY2VpdmVyIHRoYXQgd2lsbCByZWNlaXZlIHN0YXR1cyB1cGRhdGVzCisgICAgICogYWJvdXQgdGhlIG1lZGlhIHNlc3Npb24uCisgICAgICogPGxpPntAbGluayAjRVhUUkFfTUVTU0FHRV9SRUNFSVZFUn0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIGEKKyAgICAgKiB7QGxpbmsgUGVuZGluZ0ludGVudH0gZm9yIGEgYnJvYWRjYXN0IHJlY2VpdmVyIHRoYXQgd2lsbCByZWNlaXZlIG1lc3NhZ2VzIGZyb20KKyAgICAgKiB0aGUgbWVkaWEgc2Vzc2lvbi4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogPGgzPlJlc3VsdCBkYXRhPC9oMz4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihhbHdheXMgcmV0dXJuZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZiB0aGUKKyAgICAgKiBzZXNzaW9uIHRoYXQgd2FzIHN0YXJ0ZWQgYnkgdGhlIHJlcXVlc3QuICBUaGlzIHdpbGwgYWx3YXlzIGJlIGEgYnJhbmQgbmV3IHNlc3Npb24KKyAgICAgKiBkaXN0aW5jdCBmcm9tIGFueSBvdGhlciBwcmV2aW91c2x5IGNyZWF0ZWQgc2Vzc2lvbnMuCisgICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4oYWx3YXlzIHJldHVybmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlCisgICAgICogc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiA8aDM+U3RhdHVzIHVwZGF0ZXM8L2gzPgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSBjbGllbnQgc3VwcGxpZXMgYQorICAgICAqIHtAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJ9CisgICAgICogdGhlbiB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgc3RhdHVzIHVwZGF0ZXMgdG8gdGhlIHJlY2VpdmVyCisgICAgICogd2hlbiBzaWduaWZpY2FudCBtZWRpYSBzZXNzaW9uIHN0YXRlIGNoYW5nZXMgb2NjdXIgc3VjaCBhcyB3aGVuIHRoZSBzZXNzaW9uJ3MKKyAgICAgKiBxdWV1ZSBpcyBwYXVzZWQgb3IgcmVzdW1lZCBvciB3aGVuIHRoZSBzZXNzaW9uIGlzIHRlcm1pbmF0ZWQgb3IgaW52YWxpZGF0ZWQuCisgICAgICogPC9wPjxwPgorICAgICAqIFJlZmVyIHRvIHtAbGluayBNZWRpYVNlc3Npb25TdGF0dXN9IGZvciBkZXRhaWxzLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIDxoMz5DdXN0b20gbWVzc2FnZXM8L2gzPgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSBjbGllbnQgc3VwcGxpZXMgYSB7QGxpbmsgI0VYVFJBX01FU1NBR0VfUkVDRUlWRVIgbWVzc2FnZSByZWNlaXZlcn0KKyAgICAgKiB0aGVuIHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBpcyByZXNwb25zaWJsZSBmb3Igc2VuZGluZyBtZXNzYWdlcyB0byB0aGUgcmVjZWl2ZXIKKyAgICAgKiB3aGVuIHRoZSBzZXNzaW9uIGhhcyBhbnkgbWVzc2FnZXMgdG8gc2VuZC4KKyAgICAgKiA8L3A+PHA+CisgICAgICogUmVmZXIgdG8ge0BsaW5rICNFWFRSQV9NRVNTQUdFfSBmb3IgZGV0YWlscy4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiA8aDM+RXJyb3JzPC9oMz4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBzZXNzaW9uIGNvdWxkIG5vdCBiZSBjcmVhdGVkLgorICAgICAqIDwvcD48dWw+CisgICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAorICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TVEFSVF9TRVNTSU9OID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5TVEFSVF9TRVNTSU9OIjsKKworICAgIC8qKgorICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogR2V0IG1lZGlhIHNlc3Npb24gc3RhdHVzIGluZm9ybWF0aW9uLgorICAgICAqIDxwPgorICAgICAqIFVzZWQgd2l0aCByb3V0ZXMgdGhhdCBzdXBwb3J0IHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFja30KKyAgICAgKiBtZWRpYSBjb250cm9sLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBUaGlzIGFjdGlvbiBhc2tzIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIHRvIHByb3ZpZGUgdXBkYXRlZCBzdGF0dXMgaW5mb3JtYXRpb24KKyAgICAgKiBhYm91dCB0aGUgc3BlY2lmaWVkIG1lZGlhIHNlc3Npb24uCisgICAgICogPC9wPgorICAgICAqCisgICAgICogPGgzPlJlcXVlc3QgcGFyYW1ldGVyczwvaDM+CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZiB0aGUKKyAgICAgKiBzZXNzaW9uIHdob3NlIHN0YXR1cyBpcyB0byBiZSByZXRyaWV2ZWQuCisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KGFsd2F5cyByZXR1cm5lZCk8L2VtPjogU3BlY2lmaWVzIHRoZQorICAgICAqIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiA8aDM+RXJyb3JzPC9oMz4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBzZXNzaW9uIGlkIGlzIHVua25vd24gb3Igbm8gbG9uZ2VyIHZhbGlkLgorICAgICAqIDwvcD48dWw+CisgICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAorICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSworICAgICAqIEBzZWUgI0VYVFJBX1NFU1NJT05fU1RBVFVTX1VQREFURV9SRUNFSVZFUgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVMgPQorICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5HRVRfU0VTU0lPTl9TVEFUVVMiOworCisgICAgLyoqCisgICAgICogUmVtb3RlIHBsYXliYWNrIG1lZGlhIGNvbnRyb2wgYWN0aW9uOiBFbmQgc2Vzc2lvbi4KKyAgICAgKiA8cD4KKyAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9CisgICAgICogbWVkaWEgY29udHJvbC4KKyAgICAgKiA8L3A+PHA+CisgICAgICogVGhpcyBhY3Rpb24gY2F1c2VzIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIHRvIGVuZCB0aGUgc3BlY2lmaWVkIHNlc3Npb24uCisgICAgICogVGhlIHNlc3Npb24gYmVjb21lcyBubyBsb25nZXIgdmFsaWQgYW5kIHRoZSByb3V0ZSBjZWFzZXMgdG8gYmUgdW5kZXIgY29udHJvbAorICAgICAqIG9mIHRoZSBzZXNzaW9uLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBJZiBzdWNjZXNzZnVsLCB0aGUgc3RhdHVzIG9mIHRoZSBzZXNzaW9uIGlzIHNldCB0bworICAgICAqIHtAbGluayBNZWRpYVNlc3Npb25TdGF0dXMjU0VTU0lPTl9TVEFURV9FTkRFRH0gYW5kIGEgc3RhdHVzIHVwZGF0ZSBpcyBzZW50IHRvCisgICAgICogdGhlIHNlc3Npb24ncyBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBBZGRpdGlvbmFsbHksIHRoZSBzdGF0dXMgb2YgYWxsIG1lZGlhIGl0ZW1zIGluIHRoZSBxdWV1ZSBpcyBzZXQgdG8KKyAgICAgKiB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzI1BMQVlCQUNLX1NUQVRFX0NBTkNFTEVEIGNhbmNlbGVkfSBhbmQgYSBzdGF0dXMgdXBkYXRlIGlzIHNlbnQKKyAgICAgKiB0byB0aGUgYXBwcm9wcmlhdGUgc3RhdHVzIHVwZGF0ZSByZWNlaXZlcnMgaW5kaWNhdGluZyB0aGUgbmV3IHN0YXR1cyBvZiBlYWNoIGl0ZW0uCisgICAgICogPC9wPgorICAgICAqCisgICAgICogPGgzPlJlcXVlc3QgcGFyYW1ldGVyczwvaDM+CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZgorICAgICAqIHRoZSBzZXNzaW9uIHRvIGVuZC4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogPGgzPlJlc3VsdCBkYXRhPC9oMz4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4oYWx3YXlzIHJldHVybmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlCisgICAgICogc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiA8aDM+RXJyb3JzPC9oMz4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBzZXNzaW9uIGlkIGlzIHVua25vd24gb3Igbm8gbG9uZ2VyIHZhbGlkLgorICAgICAqIEluIG90aGVyIHdvcmRzLCBpdCBpcyBhbiBlcnJvciB0byBhdHRlbXB0IHRvIGVuZCBhIHNlc3Npb24gb3RoZXIgdGhhbiB0aGUKKyAgICAgKiBjdXJyZW50IHNlc3Npb24uCisgICAgICogPC9wPjx1bD4KKyAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9FUlJPUl9DT0RFfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGNhdXNlIG9mIHRoZSBlcnJvci4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogQHNlZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0CisgICAgICogQHNlZSAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0VORF9TRVNTSU9OID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5FTkRfU0VTU0lPTiI7CisKKyAgICAvKioKKyAgICAgKiBDdXN0b20gbWVkaWEgY29udHJvbCBhY3Rpb246IFNlbmQge0BsaW5rICNFWFRSQV9NRVNTQUdFfS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGFjdGlvbiBhc2tzIGEgcm91dGUgdG8gaGFuZGxlIGEgbWVzc2FnZSBkZXNjcmliZWQgYnkgRVhUUkFfTUVTU0FHRS4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiA8aDM+UmVxdWVzdCBwYXJhbWV0ZXJzPC9oMz4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mIHRoZSBzZXNzaW9uCisgICAgICogdG8gd2hpY2ggd2lsbCBoYW5kbGUgdGhpcyBtZXNzYWdlLgorICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX01FU1NBR0V9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgbWVzc2FnZSB0byBzZW5kLgorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiA8aDM+UmVzdWx0IGRhdGE8L2gzPgorICAgICAqIEFueSBtZXNzYWdlcyBkZWZpbmVkIGJ5IGVhY2ggbWVkaWEgcm91dGUgcHJvdmlkZXIuCisgICAgICoKKyAgICAgKiA8aDM+RXJyb3JzPC9oMz4KKyAgICAgKiBBbnkgZXJyb3IgbWVzc2FnZXMgZGVmaW5lZCBieSBlYWNoIG1lZGlhIHJvdXRlIHByb3ZpZGVyLgorICAgICAqCisgICAgICogQHNlZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1NFTkRfTUVTU0FHRSA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uU0VORF9NRVNTQUdFIjsKKworICAgIC8qIEV4dHJhcyBhbmQgcmVsYXRlZCBjb25zdGFudHMuICovCisKKyAgICAvKioKKyAgICAgKiBCdW5kbGUgZXh0cmE6IE1lZGlhIHNlc3Npb24gaWQuCisgICAgICogPHA+CisgICAgICogQW4gb3BhcXVlIHVuaXF1ZSBpZGVudGlmaWVyIHRoYXQgaWRlbnRpZmllcyB0aGUgcmVtb3RlIHBsYXliYWNrIG1lZGlhIHNlc3Npb24uCisgICAgICogPC9wPjxwPgorICAgICAqIFVzZWQgd2l0aCB2YXJpb3VzIGFjdGlvbnMgdG8gc3BlY2lmeSB0aGUgaWQgb2YgdGhlIG1lZGlhIHNlc3Npb24gdG8gYmUgY29udHJvbGxlZC4KKyAgICAgKiA8L3A+PHA+CisgICAgICogSW5jbHVkZWQgaW4gYnJvYWRjYXN0IGludGVudHMgc2VudCB0bworICAgICAqIHtAbGluayAjRVhUUkFfSVRFTV9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIGl0ZW0gc3RhdHVzIHVwZGF0ZSByZWNlaXZlcnN9IHRvIGlkZW50aWZ5CisgICAgICogdGhlIHNlc3Npb24gdG8gd2hpY2ggdGhlIGl0ZW0gaW4gcXVlc3Rpb24gYmVsb25ncy4KKyAgICAgKiA8L3A+PHA+CisgICAgICogSW5jbHVkZWQgaW4gYnJvYWRjYXN0IGludGVudHMgc2VudCB0bworICAgICAqIHtAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIHNlc3Npb24gc3RhdHVzIHVwZGF0ZSByZWNlaXZlcnN9IHRvIGlkZW50aWZ5CisgICAgICogdGhlIHNlc3Npb24uCisgICAgICogPC9wPjxwPgorICAgICAqIFRoZSB2YWx1ZSBpcyBhIHVuaXF1ZSBzdHJpbmcgdmFsdWUgZ2VuZXJhdGVkIGJ5IHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlcgorICAgICAqIHRvIHJlcHJlc2VudCBvbmUgcGFydGljdWxhciBtZWRpYSBzZXNzaW9uLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCisgICAgICogQHNlZSAjQUNUSU9OX1NFRUsKKyAgICAgKiBAc2VlICNBQ1RJT05fR0VUX1NUQVRVUworICAgICAqIEBzZWUgI0FDVElPTl9QQVVTRQorICAgICAqIEBzZWUgI0FDVElPTl9SRVNVTUUKKyAgICAgKiBAc2VlICNBQ1RJT05fU1RPUAorICAgICAqIEBzZWUgI0FDVElPTl9TVEFSVF9TRVNTSU9OCisgICAgICogQHNlZSAjQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVUworICAgICAqIEBzZWUgI0FDVElPTl9FTkRfU0VTU0lPTgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1NFU1NJT05fSUQgPQorICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLlNFU1NJT05fSUQiOworCisgICAgLyoqCisgICAgICogQnVuZGxlIGV4dHJhOiBNZWRpYSBzZXNzaW9uIHN0YXR1cy4KKyAgICAgKiA8cD4KKyAgICAgKiBSZXR1cm5lZCBhcyBhIHJlc3VsdCBmcm9tIG1lZGlhIHNlc3Npb24gYWN0aW9ucyBzdWNoIGFzIHtAbGluayAjQUNUSU9OX1NUQVJUX1NFU1NJT059LAorICAgICAqIHtAbGluayAjQUNUSU9OX1BBVVNFfSwgYW5kIHtAbGluayAjQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVU30KKyAgICAgKiB0byBkZXNjcmliZSB0aGUgc3RhdHVzIG9mIHRoZSBzcGVjaWZpZWQgbWVkaWEgc2Vzc2lvbi4KKyAgICAgKiA8L3A+PHA+CisgICAgICogSW5jbHVkZWQgaW4gYnJvYWRjYXN0IGludGVudHMgc2VudCB0bworICAgICAqIHtAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIHNlc3Npb24gc3RhdHVzIHVwZGF0ZSByZWNlaXZlcnN9IHRvIHByb3ZpZGUKKyAgICAgKiB1cGRhdGVkIHN0YXR1cyBpbmZvcm1hdGlvbi4KKyAgICAgKiA8L3A+PHA+CisgICAgICogVGhlIHZhbHVlIGlzIGEge0BsaW5rIGFuZHJvaWQub3MuQnVuZGxlfSBvZiBkYXRhIHRoYXQgY2FuIGJlIGNvbnZlcnRlZCBpbnRvCisgICAgICogYSB7QGxpbmsgTWVkaWFTZXNzaW9uU3RhdHVzfSBvYmplY3QgdXNpbmcKKyAgICAgKiB7QGxpbmsgTWVkaWFTZXNzaW9uU3RhdHVzI2Zyb21CdW5kbGUgTWVkaWFTZXNzaW9uU3RhdHVzLmZyb21CdW5kbGV9LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCisgICAgICogQHNlZSAjQUNUSU9OX1NFRUsKKyAgICAgKiBAc2VlICNBQ1RJT05fR0VUX1NUQVRVUworICAgICAqIEBzZWUgI0FDVElPTl9QQVVTRQorICAgICAqIEBzZWUgI0FDVElPTl9SRVNVTUUKKyAgICAgKiBAc2VlICNBQ1RJT05fU1RPUAorICAgICAqIEBzZWUgI0FDVElPTl9TVEFSVF9TRVNTSU9OCisgICAgICogQHNlZSAjQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVUworICAgICAqIEBzZWUgI0FDVElPTl9FTkRfU0VTU0lPTgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1NFU1NJT05fU1RBVFVTID0KKyAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5TRVNTSU9OX1NUQVRVUyI7CisKKyAgICAvKioKKyAgICAgKiBCdW5kbGUgZXh0cmE6IE1lZGlhIHNlc3Npb24gc3RhdHVzIHVwZGF0ZSByZWNlaXZlci4KKyAgICAgKiA8cD4KKyAgICAgKiBVc2VkIHdpdGgge0BsaW5rICNBQ1RJT05fU1RBUlRfU0VTU0lPTn0gdG8gc3BlY2lmeSBhIHtAbGluayBQZW5kaW5nSW50ZW50fSBmb3IgYQorICAgICAqIGJyb2FkY2FzdCByZWNlaXZlciB0aGF0IHdpbGwgcmVjZWl2ZSBzdGF0dXMgdXBkYXRlcyBhYm91dCB0aGUgbWVkaWEgc2Vzc2lvbi4KKyAgICAgKiA8L3A+PHA+CisgICAgICogV2hlbmV2ZXIgdGhlIHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbiBjaGFuZ2VzLCB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgd2lsbAorICAgICAqIHNlbmQgYSBicm9hZGNhc3QgdG8gdGhlIHBlbmRpbmcgaW50ZW50IHdpdGggZXh0cmFzIHRoYXQgaWRlbnRpZnkgdGhlIHNlc3Npb24KKyAgICAgKiBpZCBhbmQgaXRzIHVwZGF0ZWQgc3RhdHVzLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBUaGUgdmFsdWUgaXMgYSB7QGxpbmsgUGVuZGluZ0ludGVudH0uCisgICAgICogPC9wPgorICAgICAqCisgICAgICogPGgzPkJyb2FkY2FzdCBleHRyYXM8L2gzPgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YKKyAgICAgKiB0aGUgc2Vzc2lvbi4KKyAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU30gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlCisgICAgICogc2Vzc2lvbiBhcyBhIGJ1bmRsZSB0aGF0IGNhbiBiZSBkZWNvZGVkIGludG8gYSB7QGxpbmsgTWVkaWFTZXNzaW9uU3RhdHVzfSBvYmplY3QuCisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIEBzZWUgI0FDVElPTl9TVEFSVF9TRVNTSU9OCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfU0VTU0lPTl9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSID0KKyAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5TRVNTSU9OX1NUQVRVU19VUERBVEVfUkVDRUlWRVIiOworCisgICAgLyoqCisgICAgICogQnVuZGxlIGV4dHJhOiBNZWRpYSBtZXNzYWdlIHJlY2VpdmVyLgorICAgICAqIDxwPgorICAgICAqIFVzZWQgd2l0aCB7QGxpbmsgI0FDVElPTl9TVEFSVF9TRVNTSU9OfSB0byBzcGVjaWZ5IGEge0BsaW5rIFBlbmRpbmdJbnRlbnR9IGZvciBhCisgICAgICogYnJvYWRjYXN0IHJlY2VpdmVyIHRoYXQgd2lsbCByZWNlaXZlIG1lc3NhZ2VzIGZyb20gdGhlIG1lZGlhIHNlc3Npb24uCisgICAgICogPC9wPjxwPgorICAgICAqIFdoZW4gdGhlIG1lZGlhIHNlc3Npb24gaGFzIGEgbWVzc2FnZSB0byBzZW5kLCB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgd2lsbAorICAgICAqIHNlbmQgYSBicm9hZGNhc3QgdG8gdGhlIHBlbmRpbmcgaW50ZW50IHdpdGggZXh0cmFzIHRoYXQgaWRlbnRpZnkgdGhlIHNlc3Npb24KKyAgICAgKiBpZCBhbmQgaXRzIG1lc3NhZ2UuCisgICAgICogPC9wPjxwPgorICAgICAqIFRoZSB2YWx1ZSBpcyBhIHtAbGluayBQZW5kaW5nSW50ZW50fS4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiA8aDM+QnJvYWRjYXN0IGV4dHJhczwvaDM+CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZgorICAgICAqIHRoZSBzZXNzaW9uLgorICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX01FU1NBR0V9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgbWVzc2FnZSBmcm9tCisgICAgICogdGhlIHNlc3Npb24gYXMgYSBidW5kbGUgb2JqZWN0LgorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiBAc2VlICNBQ1RJT05fU1RBUlRfU0VTU0lPTgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX01FU1NBR0VfUkVDRUlWRVIgPQorICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLk1FU1NBR0VfUkVDRUlWRVIiOworCisgICAgLyoqCisgICAgICogQnVuZGxlIGV4dHJhOiBNZWRpYSBpdGVtIGlkLgorICAgICAqIDxwPgorICAgICAqIEFuIG9wYXF1ZSB1bmlxdWUgaWRlbnRpZmllciByZXR1cm5lZCBhcyBhIHJlc3VsdCBmcm9tIHtAbGluayAjQUNUSU9OX1BMQVl9IG9yCisgICAgICoge0BsaW5rICNBQ1RJT05fRU5RVUVVRX0gdGhhdCByZXByZXNlbnRzIHRoZSBtZWRpYSBpdGVtIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhlCisgICAgICogcGxheWJhY2sgcmVxdWVzdC4KKyAgICAgKiA8L3A+PHA+CisgICAgICogVXNlZCB3aXRoIHZhcmlvdXMgYWN0aW9ucyB0byBzcGVjaWZ5IHRoZSBpZCBvZiB0aGUgbWVkaWEgaXRlbSB0byBiZSBjb250cm9sbGVkLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBJbmNsdWRlZCBpbiBicm9hZGNhc3QgaW50ZW50cyBzZW50IHRvCisgICAgICoge0BsaW5rICNFWFRSQV9JVEVNX1NUQVRVU19VUERBVEVfUkVDRUlWRVIgc3RhdHVzIHVwZGF0ZSByZWNlaXZlcnN9IHRvIGlkZW50aWZ5CisgICAgICogdGhlIGl0ZW0gaW4gcXVlc3Rpb24uCisgICAgICogPC9wPjxwPgorICAgICAqIFRoZSB2YWx1ZSBpcyBhIHVuaXF1ZSBzdHJpbmcgdmFsdWUgZ2VuZXJhdGVkIGJ5IHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlcgorICAgICAqIHRvIHJlcHJlc2VudCBvbmUgcGFydGljdWxhciBtZWRpYSBpdGVtLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCisgICAgICogQHNlZSAjQUNUSU9OX0VOUVVFVUUKKyAgICAgKiBAc2VlICNBQ1RJT05fU0VFSworICAgICAqIEBzZWUgI0FDVElPTl9HRVRfU1RBVFVTCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSVRFTV9JRCA9CisgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuZXh0cmEuSVRFTV9JRCI7CisKKyAgICAvKioKKyAgICAgKiBCdW5kbGUgZXh0cmE6IE1lZGlhIGl0ZW0gc3RhdHVzLgorICAgICAqIDxwPgorICAgICAqIFJldHVybmVkIGFzIGEgcmVzdWx0IGZyb20gbWVkaWEgaXRlbSBhY3Rpb25zIHN1Y2ggYXMge0BsaW5rICNBQ1RJT05fUExBWX0sCisgICAgICoge0BsaW5rICNBQ1RJT05fRU5RVUVVRX0sIHtAbGluayAjQUNUSU9OX1NFRUt9LCBhbmQge0BsaW5rICNBQ1RJT05fR0VUX1NUQVRVU30KKyAgICAgKiB0byBkZXNjcmliZSB0aGUgc3RhdHVzIG9mIHRoZSBzcGVjaWZpZWQgbWVkaWEgaXRlbS4KKyAgICAgKiA8L3A+PHA+CisgICAgICogSW5jbHVkZWQgaW4gYnJvYWRjYXN0IGludGVudHMgc2VudCB0bworICAgICAqIHtAbGluayAjRVhUUkFfSVRFTV9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIGl0ZW0gc3RhdHVzIHVwZGF0ZSByZWNlaXZlcnN9IHRvIHByb3ZpZGUKKyAgICAgKiB1cGRhdGVkIHN0YXR1cyBpbmZvcm1hdGlvbi4KKyAgICAgKiA8L3A+PHA+CisgICAgICogVGhlIHZhbHVlIGlzIGEge0BsaW5rIGFuZHJvaWQub3MuQnVuZGxlfSBvZiBkYXRhIHRoYXQgY2FuIGJlIGNvbnZlcnRlZCBpbnRvCisgICAgICogYSB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzfSBvYmplY3QgdXNpbmcKKyAgICAgKiB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzI2Zyb21CdW5kbGUgTWVkaWFJdGVtU3RhdHVzLmZyb21CdW5kbGV9LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCisgICAgICogQHNlZSAjQUNUSU9OX0VOUVVFVUUKKyAgICAgKiBAc2VlICNBQ1RJT05fU0VFSworICAgICAqIEBzZWUgI0FDVElPTl9HRVRfU1RBVFVTCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSVRFTV9TVEFUVVMgPQorICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLklURU1fU1RBVFVTIjsKKworICAgIC8qKgorICAgICAqIExvbmcgZXh0cmE6IE1lZGlhIGl0ZW0gY29udGVudCBwb3NpdGlvbi4KKyAgICAgKiA8cD4KKyAgICAgKiBVc2VkIHdpdGgge0BsaW5rICNBQ1RJT05fUExBWX0gb3Ige0BsaW5rICNBQ1RJT05fRU5RVUVVRX0gdG8gc3BlY2lmeSB0aGUKKyAgICAgKiBzdGFydGluZyBwbGF5YmFjayBwb3NpdGlvbi4KKyAgICAgKiA8L3A+PHA+CisgICAgICogVXNlZCB3aXRoIHtAbGluayAjQUNUSU9OX1NFRUt9IHRvIHNldCBhIG5ldyBwbGF5YmFjayBwb3NpdGlvbi4KKyAgICAgKiA8L3A+PHA+CisgICAgICogVGhlIHZhbHVlIGlzIGEgbG9uZyBpbnRlZ2VyIG51bWJlciBvZiBtaWxsaXNlY29uZHMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb250ZW50LgorICAgICAqIDxwPgorICAgICAqCisgICAgICogQHNlZSAjQUNUSU9OX1BMQVkKKyAgICAgKiBAc2VlICNBQ1RJT05fRU5RVUVVRQorICAgICAqIEBzZWUgI0FDVElPTl9TRUVLCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSVRFTV9DT05URU5UX1BPU0lUSU9OID0KKyAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5JVEVNX1BPU0lUSU9OIjsKKworICAgIC8qKgorICAgICAqIEJ1bmRsZSBleHRyYTogTWVkaWEgaXRlbSBtZXRhZGF0YS4KKyAgICAgKiA8cD4KKyAgICAgKiBVc2VkIHdpdGgge0BsaW5rICNBQ1RJT05fUExBWX0gb3Ige0BsaW5rICNBQ1RJT05fRU5RVUVVRX0gdG8gc3BlY2lmeSBtZXRhZGF0YQorICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29udGVudCBvZiBhIG1lZGlhIGl0ZW0uCisgICAgICogPC9wPjxwPgorICAgICAqIFRoZSB2YWx1ZSBpcyBhIHtAbGluayBhbmRyb2lkLm9zLkJ1bmRsZX0gb2YgbWV0YWRhdGEga2V5LXZhbHVlIHBhaXJzIGFzIGRlZmluZWQKKyAgICAgKiBpbiB7QGxpbmsgTWVkaWFJdGVtTWV0YWRhdGF9LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCisgICAgICogQHNlZSAjQUNUSU9OX0VOUVVFVUUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9JVEVNX01FVEFEQVRBID0KKyAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5JVEVNX01FVEFEQVRBIjsKKworICAgIC8qKgorICAgICAqIEJ1bmRsZSBleHRyYTogSFRUUCByZXF1ZXN0IGhlYWRlcnMuCisgICAgICogPHA+CisgICAgICogVXNlZCB3aXRoIHtAbGluayAjQUNUSU9OX1BMQVl9IG9yIHtAbGluayAjQUNUSU9OX0VOUVVFVUV9IHRvIHNwZWNpZnkgSFRUUCByZXF1ZXN0CisgICAgICogaGVhZGVycyB0byBiZSBpbmNsdWRlZCB3aGVuIGZldGNoaW5nIHRvIHRoZSBjb250ZW50IGluZGljYXRlZCBieSB0aGUgbWVkaWEKKyAgICAgKiBpdGVtJ3MgZGF0YSBVcmkuCisgICAgICogPC9wPjxwPgorICAgICAqIFRoaXMgZXh0cmEgbWF5IGJlIHVzZWQgdG8gcHJvdmlkZSBhdXRoZW50aWNhdGlvbiB0b2tlbnMgYW5kIG90aGVyCisgICAgICogcGFyYW1ldGVycyB0byB0aGUgc2VydmVyIHNlcGFyYXRlbHkgZnJvbSB0aGUgbWVkaWEgaXRlbSdzIGRhdGEgVXJpLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBUaGUgdmFsdWUgaXMgYSB7QGxpbmsgYW5kcm9pZC5vcy5CdW5kbGV9IG9mIHN0cmluZyBiYXNlZCBrZXktdmFsdWUgcGFpcnMKKyAgICAgKiB0aGF0IGRlc2NyaWJlIHRoZSBIVFRQIHJlcXVlc3QgaGVhZGVycy4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAc2VlICNBQ1RJT05fUExBWQorICAgICAqIEBzZWUgI0FDVElPTl9FTlFVRVVFCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSVRFTV9IVFRQX0hFQURFUlMgPQorICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLkhUVFBfSEVBREVSUyI7CisKKyAgICAvKioKKyAgICAgKiBCdW5kbGUgZXh0cmE6IE1lZGlhIGl0ZW0gc3RhdHVzIHVwZGF0ZSByZWNlaXZlci4KKyAgICAgKiA8cD4KKyAgICAgKiBVc2VkIHdpdGgge0BsaW5rICNBQ1RJT05fUExBWX0gb3Ige0BsaW5rICNBQ1RJT05fRU5RVUVVRX0gdG8gc3BlY2lmeQorICAgICAqIGEge0BsaW5rIFBlbmRpbmdJbnRlbnR9IGZvciBhCisgICAgICogYnJvYWRjYXN0IHJlY2VpdmVyIHRoYXQgd2lsbCByZWNlaXZlIHN0YXR1cyB1cGRhdGVzIGFib3V0IGEgcGFydGljdWxhcgorICAgICAqIG1lZGlhIGl0ZW0uCisgICAgICogPC9wPjxwPgorICAgICAqIFdoZW5ldmVyIHRoZSBzdGF0dXMgb2YgdGhlIG1lZGlhIGl0ZW0gY2hhbmdlcywgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHdpbGwKKyAgICAgKiBzZW5kIGEgYnJvYWRjYXN0IHRvIHRoZSBwZW5kaW5nIGludGVudCB3aXRoIGV4dHJhcyB0aGF0IGlkZW50aWZ5IHRoZSBzZXNzaW9uCisgICAgICogdG8gd2hpY2ggdGhlIGl0ZW0gYmVsb25ncywgdGhlIHNlc3Npb24gc3RhdHVzLCB0aGUgaXRlbSdzIGlkCisgICAgICogYW5kIHRoZSBpdGVtJ3MgdXBkYXRlZCBzdGF0dXMuCisgICAgICogPC9wPjxwPgorICAgICAqIFRoZSBzYW1lIHBlbmRpbmcgaW50ZW50IGFuZCBicm9hZGNhc3QgcmVjZWl2ZXIgbWF5IGJlIHNoYXJlZCBieSBhbnkgbnVtYmVyIG9mCisgICAgICogbWVkaWEgaXRlbXMgc2luY2UgdGhlIGJyb2FkY2FzdCBpbnRlbnQgaW5jbHVkZXMgdGhlIG1lZGlhIHNlc3Npb24gaWQKKyAgICAgKiBhbmQgbWVkaWEgaXRlbSBpZC4KKyAgICAgKiA8L3A+PHA+CisgICAgICogVGhlIHZhbHVlIGlzIGEge0BsaW5rIFBlbmRpbmdJbnRlbnR9LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIDxoMz5Ccm9hZGNhc3QgZXh0cmFzPC9oMz4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mCisgICAgICogdGhlIHNlc3Npb24gdG8gd2hpY2ggdGhlIGl0ZW0gaW4gcXVlc3Rpb24gYmVsb25ncy4KKyAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU30gPGVtPihvcHRpb25hbCwgb2xkIGltcGxlbWVudGF0aW9ucyBtYXkKKyAgICAgKiBvbWl0IHRoaXMga2V5KTwvZW0+OiBTcGVjaWZpZXMgdGhlIHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbi4KKyAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIG1lZGlhIGl0ZW0gaWQgb2YgdGhlCisgICAgICogbWVkaWEgaXRlbSBpbiBxdWVzdGlvbi4KKyAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX1NUQVRVU30gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlCisgICAgICogaXRlbSBhcyBhIGJ1bmRsZSB0aGF0IGNhbiBiZSBkZWNvZGVkIGludG8gYSB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzfSBvYmplY3QuCisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCisgICAgICogQHNlZSAjQUNUSU9OX0VOUVVFVUUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9JVEVNX1NUQVRVU19VUERBVEVfUkVDRUlWRVIgPQorICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLklURU1fU1RBVFVTX1VQREFURV9SRUNFSVZFUiI7CisKKyAgICAvKioKKyAgICAgKiBCdW5kbGUgZXh0cmE6IE1lc3NhZ2UuCisgICAgICogPHA+CisgICAgICogVXNlZCB3aXRoIHtAbGluayAjQUNUSU9OX1NFTkRfTUVTU0FHRX0sIGFuZCBpbmNsdWRlZCBpbiBicm9hZGNhc3QgaW50ZW50cyBzZW50IHRvCisgICAgICoge0BsaW5rICNFWFRSQV9NRVNTQUdFX1JFQ0VJVkVSIG1lc3NhZ2UgcmVjZWl2ZXJzfSB0byBkZXNjcmliZSBhIG1lc3NhZ2UgYmV0d2VlbiBhCisgICAgICogc2Vzc2lvbiBhbmQgYSBtZWRpYSByb3V0ZSBwcm92aWRlci4KKyAgICAgKiA8L3A+PHA+CisgICAgICogVGhlIHZhbHVlIGlzIGEge0BsaW5rIGFuZHJvaWQub3MuQnVuZGxlfS4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfTUVTU0FHRSA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5NRVNTQUdFIjsKKworICAgIC8qKgorICAgICAqIEludGVnZXIgZXh0cmE6IEVycm9yIGNvZGUuCisgICAgICogPHA+CisgICAgICogVXNlZCB3aXRoIGFsbCBtZWRpYSBjb250cm9sIHJlcXVlc3RzIHRvIGRlc2NyaWJlIHRoZSBjYXVzZSBvZiBhbiBlcnJvci4KKyAgICAgKiBUaGlzIGV4dHJhIG1heSBiZSBvbWl0dGVkIHdoZW4gdGhlIGVycm9yIGlzIHVua25vd24uCisgICAgICogPC9wPjxwPgorICAgICAqIFRoZSB2YWx1ZSBpcyBvbmUgb2Y6IHtAbGluayAjRVJST1JfVU5LTk9XTn0sIHtAbGluayAjRVJST1JfVU5TVVBQT1JURURfT1BFUkFUSU9OfSwKKyAgICAgKiB7QGxpbmsgI0VSUk9SX0lOVkFMSURfU0VTU0lPTl9JRH0sIHtAbGluayAjRVJST1JfSU5WQUxJRF9JVEVNX0lEfS4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfRVJST1JfQ09ERSA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5FUlJPUl9DT0RFIjsKKworICAgIC8qKgorICAgICAqIEVycm9yIGNvZGU6IEFuIHVua25vd24gZXJyb3Igb2NjdXJyZWQuCisgICAgICoKKyAgICAgKiBAc2VlICNFWFRSQV9FUlJPUl9DT0RFCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfVU5LTk9XTiA9IDA7CisKKyAgICAvKioKKyAgICAgKiBFcnJvciBjb2RlOiBUaGUgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgICoKKyAgICAgKiBAc2VlICNFWFRSQV9FUlJPUl9DT0RFCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfVU5TVVBQT1JURURfT1BFUkFUSU9OID0gMTsKKworICAgIC8qKgorICAgICAqIEVycm9yIGNvZGU6IFRoZSBzZXNzaW9uIGlkIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdCB3YXMgaW52YWxpZC4KKyAgICAgKgorICAgICAqIEBzZWUgI0VYVFJBX0VSUk9SX0NPREUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9JTlZBTElEX1NFU1NJT05fSUQgPSAyOworCisgICAgLyoqCisgICAgICogRXJyb3IgY29kZTogVGhlIGl0ZW0gaWQgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0IHdhcyBpbnZhbGlkLgorICAgICAqCisgICAgICogQHNlZSAjRVhUUkFfRVJST1JfQ09ERQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0lOVkFMSURfSVRFTV9JRCA9IDM7CisKKyAgICBwcml2YXRlIE1lZGlhQ29udHJvbEludGVudCgpIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFJdGVtTWV0YWRhdGEuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYUl0ZW1NZXRhZGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MmRkYjYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFJdGVtTWV0YWRhdGEuamF2YQpAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CisKKy8qKgorICogQ29uc3RhbnRzIGZvciBzcGVjaWZ5aW5nIG1ldGFkYXRhIGFib3V0IGEgbWVkaWEgaXRlbSBhcyBhIHtAbGluayBCdW5kbGV9LgorICogPHA+CisgKiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgdGhlIHJlbW90ZSBwbGF5YmFjayBwcm90b2NvbCBkZXNjcmliZWQgYnkgdGhlCisgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IE1lZGlhQ29udHJvbEludGVudH0gY2xhc3MuCisgKiA8L3A+PHA+CisgKiBNZWRpYSBpdGVtIG1ldGFkYXRhIGlzIGRlc2NyaWJlZCBhcyBhIGJ1bmRsZSBvZiBrZXkvdmFsdWUgcGFpcnMgYXMgZGVmaW5lZAorICogaW4gdGhpcyBjbGFzcy4gIFRoZSBkb2N1bWVudGF0aW9uIHNwZWNpZmllcyB0aGUgdHlwZSBvZiB2YWx1ZSBhc3NvY2lhdGVkCisgKiB3aXRoIGVhY2gga2V5LgorICogPC9wPjxwPgorICogQW4gYXBwbGljYXRpb24gbWF5IHNwZWNpZnkgYWRkaXRpb25hbCBjdXN0b20gbWV0YWRhdGEga2V5cyBidXQgdGhlcmUgaXMgbm8gZ3VhcmFudGVlCisgKiB0aGF0IHRoZXkgd2lsbCBiZSByZWNvZ25pemVkIGJ5IHRoZSBkZXN0aW5hdGlvbi4KKyAqIDwvcD4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE1lZGlhSXRlbU1ldGFkYXRhIHsKKyAgICAvKgorICAgICAqIE5vdGU6IE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIgYWxzbyBkZWZpbmVzIGEgY29sbGVjdGlvbiBvZiBtZXRhZGF0YSBrZXlzIHRoYXQgY2FuIGJlCisgICAgICogcmV0cmlldmVkIGZyb20gYSBjb250ZW50IHN0cmVhbSBhbHRob3VnaCB0aGUgcmVwcmVzZW50YXRpb24gaXMgc29tZXdoYXQgZGlmZmVyZW50IGhlcmUKKyAgICAgKiBzaW5jZSB3ZSBhcmUgc2VuZGluZyB0aGUgZGF0YSB0byBhIHJlbW90ZSBlbmRwb2ludC4KKyAgICAgKi8KKworICAgIHByaXZhdGUgTWVkaWFJdGVtTWV0YWRhdGEoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RyaW5nIGtleTogQWxidW0gYXJ0aXN0IG5hbWUuCisgICAgICogPHA+CisgICAgICogVGhlIHZhbHVlIGlzIGEgc3RyaW5nIHN1aXRhYmxlIGZvciBkaXNwbGF5LgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQUxCVU1fQVJUSVNUID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuQUxCVU1fQVJUSVNUIjsKKworICAgIC8qKgorICAgICAqIFN0cmluZyBrZXk6IEFsYnVtIHRpdGxlLgorICAgICAqIDxwPgorICAgICAqIFRoZSB2YWx1ZSBpcyBhIHN0cmluZyBzdWl0YWJsZSBmb3IgZGlzcGxheS4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FMQlVNX1RJVExFID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuQUxCVU1fVElUTEUiOworCisgICAgLyoqCisgICAgICogU3RyaW5nIGtleTogQXJ0d29yayBVcmkuCisgICAgICogPHA+CisgICAgICogVGhlIHZhbHVlIGlzIGEgc3RyaW5nIFVSSSBmb3IgYW4gaW1hZ2UgZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIG1lZGlhIGl0ZW0sCisgICAgICogc3VjaCBhcyBhbGJ1bSBvciBjb3ZlciBhcnQuCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BUlRXT1JLX1VSSSA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkFSVFdPUktfVVJJIjsKKworICAgIC8qKgorICAgICAqIFN0cmluZyBrZXk6IEFydGlzdCBuYW1lLgorICAgICAqIDxwPgorICAgICAqIFRoZSB2YWx1ZSBpcyBhIHN0cmluZyBzdWl0YWJsZSBmb3IgZGlzcGxheS4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FSVElTVCA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkFSVElTVCI7CisKKyAgICAvKioKKyAgICAgKiBTdHJpbmcga2V5OiBBdXRob3IgbmFtZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgdmFsdWUgaXMgYSBzdHJpbmcgc3VpdGFibGUgZm9yIGRpc3BsYXkuCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BVVRIT1IgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5BVVRIT1IiOworCisgICAgLyoqCisgICAgICogU3RyaW5nIGtleTogQ29tcG9zZXIgbmFtZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgdmFsdWUgaXMgYSBzdHJpbmcgc3VpdGFibGUgZm9yIGRpc3BsYXkuCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT01QT1NFUiA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkNPTVBPU0VSIjsKKworICAgIC8qKgorICAgICAqIFN0cmluZyBrZXk6IFRyYWNrIHRpdGxlLgorICAgICAqIDxwPgorICAgICAqIFRoZSB2YWx1ZSBpcyBhIHN0cmluZyBzdWl0YWJsZSBmb3IgZGlzcGxheS4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1RJVExFID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuVElUTEUiOworCisgICAgLyoqCisgICAgICogSW50ZWdlciBrZXk6IFllYXIgb2YgcHVibGljYXRpb24uCisgICAgICogPHA+CisgICAgICogVGhlIHZhbHVlIGlzIGFuIGludGVnZXIgeWVhciBudW1iZXIuCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ZRUFSID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuWUVBUiI7CisKKyAgICAvKioKKyAgICAgKiBJbnRlZ2VyIGtleTogVHJhY2sgbnVtYmVyIChzdWNoIGFzIGEgdHJhY2sgb24gYSBDRCkuCisgICAgICogPHA+CisgICAgICogVGhlIHZhbHVlIGlzIGEgb25lLWJhc2VkIGludGVnZXIgdHJhY2sgbnVtYmVyLgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVFJBQ0tfTlVNQkVSID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuVFJBQ0tfTlVNQkVSIjsKKworICAgIC8qKgorICAgICAqIEludGVnZXIga2V5OiBEaXNjIG51bWJlciB3aXRoaW4gYSBjb2xsZWN0aW9uLgorICAgICAqIDxwPgorICAgICAqIFRoZSB2YWx1ZSBpcyBhIG9uZS1iYXNlZCBpbnRlZ2VyIGRpc2MgbnVtYmVyLgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRElTQ19OVU1CRVIgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5ESVNDX05VTUJFUiI7CisKKyAgICAvKioKKyAgICAgKiBMb25nIGtleTogSXRlbSBwbGF5YmFjayBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMuCisgICAgICogPHA+CisgICAgICogVGhlIHZhbHVlIGlzIGEgPGNvZGU+bG9uZzwvY29kZT4gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy4KKyAgICAgKiA8L3A+PHA+CisgICAgICogVGhlIGR1cmF0aW9uIG1ldGFkYXRhIGlzIG9ubHkgYSBoaW50IHRvIGVuYWJsZSBhIHJlbW90ZSBtZWRpYSBwbGF5ZXIgdG8KKyAgICAgKiBndWVzcyB0aGUgZHVyYXRpb24gb2YgdGhlIGNvbnRlbnQgYmVmb3JlIGl0IGFjdHVhbGx5IG9wZW5zIHRoZSBtZWRpYSBzdHJlYW0uCisgICAgICogVGhlIHJlbW90ZSBtZWRpYSBwbGF5ZXIgc2hvdWxkIHN0aWxsIGRldGVybWluZSB0aGUgYWN0dWFsIGNvbnRlbnQgZHVyYXRpb24gZnJvbQorICAgICAqIHRoZSBtZWRpYSBzdHJlYW0gaXRzZWxmIGluZGVwZW5kZW50IG9mIHRoZSB2YWx1ZSB0aGF0IG1heSBiZSBzcGVjaWZpZWQgYnkgdGhpcyBrZXkuCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9EVVJBVElPTiA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkRVUkFUSU9OIjsKK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYUl0ZW1TdGF0dXMuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYUl0ZW1TdGF0dXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGVhMmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhSXRlbVN0YXR1cy5qYXZhCkBAIC0wLDAgKzEsMzkyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LnV0aWwuVGltZVV0aWxzOworCisvKioKKyAqIERlc2NyaWJlcyB0aGUgcGxheWJhY2sgc3RhdHVzIG9mIGEgbWVkaWEgaXRlbS4KKyAqIDxwPgorICogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIHRoZSByZW1vdGUgcGxheWJhY2sgcHJvdG9jb2wgZGVzY3JpYmVkIGJ5IHRoZQorICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBNZWRpYUNvbnRyb2xJbnRlbnR9IGNsYXNzLgorICogPC9wPjxwPgorICogQXMgYSBtZWRpYSBpdGVtIGlzIHBsYXllZCwgaXQgdHJhbnNpdGlvbnMgdGhyb3VnaCBhIHNlcXVlbmNlIG9mIHN0YXRlcyBpbmNsdWRpbmc6CisgKiB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX1BFTkRJTkcgcGVuZGluZ30sIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfQlVGRkVSSU5HIGJ1ZmZlcmluZ30sCisgKiB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX1BMQVlJTkcgcGxheWluZ30sIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfUEFVU0VEIHBhdXNlZH0sCisgKiB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX0ZJTklTSEVEIGZpbmlzaGVkfSwge0BsaW5rICNQTEFZQkFDS19TVEFURV9DQU5DRUxFRCBjYW5jZWxlZH0sCisgKiB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX0lOVkFMSURBVEVEIGludmFsaWRhdGVkfSwgYW5kCisgKiB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX0VSUk9SIGVycm9yfS4gIFJlZmVyIHRvIHRoZSBkb2N1bWVudGF0aW9uIG9mIGVhY2ggc3RhdGUKKyAqIGZvciBhbiBleHBsYW5hdGlvbiBvZiBpdHMgbWVhbmluZy4KKyAqIDwvcD48cD4KKyAqIFdoaWxlIHRoZSBpdGVtIGlzIHBsYXlpbmcsIHRoZSBwbGF5YmFjayBzdGF0dXMgbWF5IGFsc28gaW5jbHVkZSBwcm9ncmVzcyBpbmZvcm1hdGlvbgorICogYWJvdXQgdGhlIHtAbGluayAjZ2V0Q29udGVudFBvc2l0aW9uIGNvbnRlbnQgcG9zaXRpb259IGFuZAorICoge0BsaW5rICNnZXRDb250ZW50RHVyYXRpb24gY29udGVudCBkdXJhdGlvbn0gYWx0aG91Z2ggbm90IGFsbCByb3V0ZSBkZXN0aW5hdGlvbnMKKyAqIHdpbGwgcmVwb3J0IGl0LgorICogPC9wPjxwPgorICogVG8gbW9uaXRvciBwbGF5YmFjayBzdGF0dXMsIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgc3VwcGx5IGEge0BsaW5rIFBlbmRpbmdJbnRlbnR9IHRvIHVzZSBhcyB0aGUKKyAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjRVhUUkFfSVRFTV9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIGl0ZW0gc3RhdHVzIHVwZGF0ZSByZWNlaXZlcn0KKyAqIGZvciBhIGdpdmVuIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVkgcGxheWJhY2sgcmVxdWVzdH0uICBOb3RlIHRoYXQKKyAqIHRoZSBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyIHdpbGwgb25seSBiZSBpbnZva2VkIGZvciBtYWpvciBzdGF0dXMgY2hhbmdlcyBzdWNoIGFzIGEKKyAqIHRyYW5zaXRpb24gZnJvbSBwbGF5aW5nIHRvIGZpbmlzaGVkLgorICogPC9wPjxwIGNsYXNzPSJub3RlIj4KKyAqIFRoZSBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyIHdpbGwgbm90IGJlIGludm9rZWQgZm9yIG1pbm9yIHByb2dyZXNzIHVwZGF0ZXMgc3VjaCBhcworICogY2hhbmdlcyB0byBwbGF5YmFjayBwb3NpdGlvbiBvciBkdXJhdGlvbi4gIElmIHRoZSBhcHBsaWNhdGlvbiB3YW50cyB0byBtb25pdG9yCisgKiBwbGF5YmFjayBwcm9ncmVzcywgdGhlbiBpdCBtdXN0IHVzZSB0aGUKKyAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0dFVF9TVEFUVVMgZ2V0IHN0YXR1cyByZXF1ZXN0fSB0byBwb2xsIGZvciBjaGFuZ2VzCisgKiBwZXJpb2RpY2FsbHkgYW5kIGVzdGltYXRlIHRoZSBwbGF5YmFjayBwb3NpdGlvbiB3aGlsZSBwbGF5aW5nLiAgTm90ZSB0aGF0IHRoZXJlIG1heQorICogYmUgYSBzaWduaWZpY2FudCBwb3dlciBpbXBhY3QgdG8gcG9sbGluZyBzbyB0aGUgYXBwbGljYXRpb24gaXMgYWR2aXNlZCBvbmx5CisgKiB0byBwb2xsIHdoZW4gdGhlIHNjcmVlbiBpcyBvbiBhbmQgbmV2ZXIgbW9yZSB0aGFuIGFib3V0IG9uY2UgZXZlcnkgNSBzZWNvbmRzIG9yIHNvLgorICogPC9wPjxwPgorICogVGhpcyBvYmplY3QgaXMgaW1tdXRhYmxlIG9uY2UgY3JlYXRlZCB1c2luZyBhIHtAbGluayBCdWlsZGVyfSBpbnN0YW5jZS4KKyAqIDwvcD4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE1lZGlhSXRlbVN0YXR1cyB7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVElNRVNUQU1QID0gInRpbWVzdGFtcCI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUExBWUJBQ0tfU1RBVEUgPSAicGxheWJhY2tTdGF0ZSI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09OVEVOVF9QT1NJVElPTiA9ICJjb250ZW50UG9zaXRpb24iOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTlRFTlRfRFVSQVRJT04gPSAiY29udGVudER1cmF0aW9uIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9FWFRSQVMgPSAiZXh0cmFzIjsKKworICAgIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOworCisgICAgLyoqCisgICAgICogUGxheWJhY2sgc3RhdGU6IFBlbmRpbmcuCisgICAgICogPHA+CisgICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIGl0ZW0gaGFzIG5vdCB5ZXQgc3RhcnRlZCBwbGF5YmFjayBidXQgd2lsbCBiZSBwbGF5ZWQgZXZlbnR1YWxseS4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfU1RBVEVfUEVORElORyA9IDA7CisKKyAgICAvKioKKyAgICAgKiBQbGF5YmFjayBzdGF0ZTogUGxheWluZy4KKyAgICAgKiA8cD4KKyAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgaXRlbSBpcyBjdXJyZW50bHkgcGxheWluZy4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfU1RBVEVfUExBWUlORyA9IDE7CisKKyAgICAvKioKKyAgICAgKiBQbGF5YmFjayBzdGF0ZTogUGF1c2VkLgorICAgICAqIDxwPgorICAgICAqIEluZGljYXRlcyB0aGF0IHBsYXliYWNrIG9mIHRoZSBtZWRpYSBpdGVtIGhhcyBiZWVuIHBhdXNlZC4gIFBsYXliYWNrIGNhbiBiZQorICAgICAqIHJlc3VtZWQgdXNpbmcgdGhlIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1JFU1VNRSByZXN1bWV9IGFjdGlvbi4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfU1RBVEVfUEFVU0VEID0gMjsKKworICAgIC8qKgorICAgICAqIFBsYXliYWNrIHN0YXRlOiBCdWZmZXJpbmcgb3Igc2Vla2luZyB0byBhIG5ldyBwb3NpdGlvbi4KKyAgICAgKiA8cD4KKyAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgaXRlbSBoYXMgYmVlbiB0ZW1wb3JhcmlseSBpbnRlcnJ1cHRlZAorICAgICAqIHRvIGZldGNoIG1vcmUgY29udGVudC4gIFBsYXliYWNrIHdpbGwgY29udGludWUgYXV0b21hdGljYWxseQorICAgICAqIHdoZW4gZW5vdWdoIGNvbnRlbnQgaGFzIGJlZW4gYnVmZmVyZWQuCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1NUQVRFX0JVRkZFUklORyA9IDM7CisKKyAgICAvKioKKyAgICAgKiBQbGF5YmFjayBzdGF0ZTogRmluaXNoZWQuCisgICAgICogPHA+CisgICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIGl0ZW0gcGxheWVkIHRvIHRoZSBlbmQgb2YgdGhlIGNvbnRlbnQgYW5kIGZpbmlzaGVkIG5vcm1hbGx5LgorICAgICAqIDwvcD48cD4KKyAgICAgKiBBIGZpbmlzaGVkIG1lZGlhIGl0ZW0gY2Fubm90IGJlIHJlc3VtZWQuICBUbyBwbGF5IHRoZSBjb250ZW50IGFnYWluLCB0aGUgYXBwbGljYXRpb24KKyAgICAgKiBtdXN0IHNlbmQgYSBuZXcge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWSBwbGF5fSBvcgorICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VOUVVFVUUgZW5xdWV1ZX0gYWN0aW9uLgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TVEFURV9GSU5JU0hFRCA9IDQ7CisKKyAgICAvKioKKyAgICAgKiBQbGF5YmFjayBzdGF0ZTogQ2FuY2VsZWQuCisgICAgICogPHA+CisgICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIGl0ZW0gd2FzIGV4cGxpY2l0bHkgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZSBieSB0aGUKKyAgICAgKiBhcHBsaWNhdGlvbi4gIEl0ZW1zIG1heSBiZSBjYW5jZWxlZCBhbmQgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZSB1c2luZworICAgICAqIHRoZSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9SRU1PVkUgcmVtb3ZlfSBvcgorICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NUT1Agc3RvcH0gYWN0aW9uIG9yIGJ5IGlzc3VpbmcKKyAgICAgKiBhbm90aGVyIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVkgcGxheX0gYWN0aW9uIHRoYXQgaGFzIHRoZQorICAgICAqIHNpZGUtZWZmZWN0IG9mIGNsZWFyaW5nIHRoZSBxdWV1ZS4KKyAgICAgKiA8L3A+PHA+CisgICAgICogQSBjYW5jZWxlZCBtZWRpYSBpdGVtIGNhbm5vdCBiZSByZXN1bWVkLiAgVG8gcGxheSB0aGUgY29udGVudCBhZ2FpbiwgdGhlCisgICAgICogYXBwbGljYXRpb24gbXVzdCBzZW5kIGEgbmV3IHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVkgcGxheX0gb3IKKyAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTlFVRVVFIGVucXVldWV9IGFjdGlvbi4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfU1RBVEVfQ0FOQ0VMRUQgPSA1OworCisgICAgLyoqCisgICAgICogUGxheWJhY2sgc3RhdGU6IEludmFsaWRhdGVkLgorICAgICAqIDxwPgorICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBpdGVtIHdhcyBpbnZhbGlkYXRlZCBwZXJtYW5lbnRseSBhbmQgaW52b2x1bnRhcmlseS4KKyAgICAgKiBUaGlzIHN0YXRlIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgbWVkaWEgaXRlbSB3YXMgaW52YWxpZGF0ZWQgYW5kIHJlbW92ZWQKKyAgICAgKiBmcm9tIHRoZSBxdWV1ZSBiZWNhdXNlIHRoZSBzZXNzaW9uIHRvIHdoaWNoIGl0IGJlbG9uZ3Mgd2FzIGludmFsaWRhdGVkCisgICAgICogKHR5cGljYWxseSBieSBhbm90aGVyIGFwcGxpY2F0aW9uIHRha2luZyBjb250cm9sIG9mIHRoZSByb3V0ZSkuCisgICAgICogPC9wPjxwPgorICAgICAqIFdoZW4gaW52YWxpZGF0aW9uIG9jY3VycywgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBnZW5lcmFsbHkgd2FpdCBmb3IgdGhlIHVzZXIKKyAgICAgKiB0byBwZXJmb3JtIGFuIGV4cGxpY2l0IGFjdGlvbiwgc3VjaCBhcyBjbGlja2luZyBvbiBhIHBsYXkgYnV0dG9uIGluIHRoZSBVSSwKKyAgICAgKiBiZWZvcmUgY3JlYXRpbmcgYSBuZXcgbWVkaWEgc2Vzc2lvbiB0byBhdm9pZCB1bm5lY2Vzc2FyaWx5IGludGVycnVwdGluZworICAgICAqIGFub3RoZXIgYXBwbGljYXRpb24gdGhhdCBtYXkgaGF2ZSBqdXN0IHN0YXJ0ZWQgdXNpbmcgdGhlIHJvdXRlLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBBbiBpbnZhbGlkYXRlZCBtZWRpYSBpdGVtIGNhbm5vdCBiZSByZXN1bWVkLiAgVG8gcGxheSB0aGUgY29udGVudCBhZ2FpbiwgdGhlIGFwcGxpY2F0aW9uCisgICAgICogbXVzdCBzZW5kIGEgbmV3IHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVkgcGxheX0gb3IKKyAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTlFVRVVFIGVucXVldWV9IGFjdGlvbi4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfU1RBVEVfSU5WQUxJREFURUQgPSA2OworCisgICAgLyoqCisgICAgICogUGxheWJhY2sgc3RhdGU6IFBsYXliYWNrIGhhbHRlZCBvciBhYm9ydGVkIGR1ZSB0byBhbiBlcnJvci4KKyAgICAgKiA8cD4KKyAgICAgKiBFeGFtcGxlcyBvZiBlcnJvcnMgYXJlIG5vIG5ldHdvcmsgY29ubmVjdGl2aXR5IHdoZW4gYXR0ZW1wdGluZyB0byByZXRyaWV2ZSBjb250ZW50CisgICAgICogZnJvbSBhIHNlcnZlciwgb3IgZXhwaXJlZCB1c2VyIGNyZWRlbnRpYWxzIHdoZW4gdHJ5aW5nIHRvIHBsYXkgc3Vic2NyaXB0aW9uLWJhc2VkCisgICAgICogY29udGVudC4KKyAgICAgKiA8L3A+PHA+CisgICAgICogQSBtZWRpYSBpdGVtIGluIHRoZSBlcnJvciBzdGF0ZSBjYW5ub3QgYmUgcmVzdW1lZC4gIFRvIHBsYXkgdGhlIGNvbnRlbnQgYWdhaW4sCisgICAgICogdGhlIGFwcGxpY2F0aW9uIG11c3Qgc2VuZCBhIG5ldyB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QTEFZIHBsYXl9IG9yCisgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5RVUVVRSBlbnF1ZXVlfSBhY3Rpb24uCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1NUQVRFX0VSUk9SID0gNzsKKworICAgIC8qKgorICAgICAqIEludGVnZXIgZXh0cmE6IEhUVFAgc3RhdHVzIGNvZGUuCisgICAgICogPHA+CisgICAgICogU3BlY2lmaWVzIHRoZSBIVFRQIHN0YXR1cyBjb2RlIHRoYXQgd2FzIGVuY291bnRlcmVkIHdoZW4gdGhlIGNvbnRlbnQKKyAgICAgKiB3YXMgcmVxdWVzdGVkIGFmdGVyIGFsbCByZWRpcmVjdHMgd2VyZSBmb2xsb3dlZC4gIFRoaXMga2V5IG9ubHkgbmVlZHMgdG8KKyAgICAgKiBzcGVjaWZpZWQgd2hlbiB0aGUgY29udGVudCB1cmkgdXNlcyB0aGUgSFRUUCBvciBIVFRQUyBzY2hlbWUgYW5kIGFuIGVycm9yCisgICAgICogb2NjdXJyZWQuICBUaGlzIGtleSBtYXkgYmUgb21pdHRlZCBpZiB0aGUgY29udGVudCB3YXMgYWJsZSB0byBiZSBwbGF5ZWQKKyAgICAgKiBzdWNjZXNzZnVsbHk7IHRoZXJlIGlzIG5vIG5lZWQgdG8gcmVwb3J0IGEgMjAwIChPSykgc3RhdHVzIGNvZGUuCisgICAgICogPC9wPjxwPgorICAgICAqIFRoZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyIEhUVFAgc3RhdHVzIGNvZGUsIHN1Y2ggYXMgNDAxIChVbmF1dGhvcml6ZWQpLAorICAgICAqIDQwNCAoTm90IEZvdW5kKSwgb3IgNTAwIChTZXJ2ZXIgRXJyb3IpLCBvciAwIGlmIG5vbmUuCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0hUVFBfU1RBVFVTX0NPREUgPQorICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuc3RhdHVzLmV4dHJhLkhUVFBfU1RBVFVTX0NPREUiOworCisgICAgLyoqCisgICAgICogQnVuZGxlIGV4dHJhOiBIVFRQIHJlc3BvbnNlIGhlYWRlcnMuCisgICAgICogPHA+CisgICAgICogU3BlY2lmaWVzIHRoZSBIVFRQIHJlc3BvbnNlIGhlYWRlcnMgdGhhdCB3ZXJlIHJldHVybmVkIHdoZW4gdGhlIGNvbnRlbnQgd2FzCisgICAgICogcmVxdWVzdGVkIGZyb20gdGhlIG5ldHdvcmsuICBUaGUgaGVhZGVycyBtYXkgaW5jbHVkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgICAgICogYWJvdXQgdGhlIGNvbnRlbnQgb3IgYW55IGVycm9ycyBjb25kaXRpb25zIHRoYXQgd2VyZSBlbmNvdW50ZXJlZCB3aGlsZQorICAgICAqIHRyeWluZyB0byBmZXRjaCB0aGUgY29udGVudC4KKyAgICAgKiA8L3A+PHA+CisgICAgICogVGhlIHZhbHVlIGlzIGEge0BsaW5rIGFuZHJvaWQub3MuQnVuZGxlfSBvZiBzdHJpbmcgYmFzZWQga2V5LXZhbHVlIHBhaXJzCisgICAgICogdGhhdCBkZXNjcmliZSB0aGUgSFRUUCByZXNwb25zZSBoZWFkZXJzLgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9IVFRQX1JFU1BPTlNFX0hFQURFUlMgPQorICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuc3RhdHVzLmV4dHJhLkhUVFBfUkVTUE9OU0VfSEVBREVSUyI7CisKKyAgICBNZWRpYUl0ZW1TdGF0dXMoQnVuZGxlIGJ1bmRsZSkgeworICAgICAgICBtQnVuZGxlID0gYnVuZGxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHRpbWVzdGFtcCBhc3NvY2lhdGVkIHdpdGggdGhlIHN0YXR1cyBpbmZvcm1hdGlvbiBpbgorICAgICAqIG1pbGxpc2Vjb25kcyBzaW5jZSBib290IGluIHRoZSB7QGxpbmsgU3lzdGVtQ2xvY2sjZWxhcHNlZFJlYWx0aW1lfSB0aW1lIGJhc2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBzdGF0dXMgdGltZXN0YW1wIGluIHRoZSB7QGxpbmsgU3lzdGVtQ2xvY2sjZWxhcHNlZFJlYWx0aW1lKCl9IHRpbWUgYmFzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRUaW1lc3RhbXAoKSB7CisgICAgICAgIHJldHVybiBtQnVuZGxlLmdldExvbmcoS0VZX1RJTUVTVEFNUCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgcGxheWJhY2sgc3RhdGUgb2YgdGhlIG1lZGlhIGl0ZW0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBwbGF5YmFjayBzdGF0ZS4gIE9uZSBvZiB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX1BFTkRJTkd9LAorICAgICAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfUExBWUlOR30sIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfUEFVU0VEfSwKKyAgICAgKiB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX0JVRkZFUklOR30sIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfRklOSVNIRUR9LAorICAgICAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfQ0FOQ0VMRUR9LCB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX0lOVkFMSURBVEVEfSwKKyAgICAgKiBvciB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX0VSUk9SfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFBsYXliYWNrU3RhdGUoKSB7CisgICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfUExBWUJBQ0tfU1RBVEUsIFBMQVlCQUNLX1NUQVRFX0VSUk9SKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBjb250ZW50IHBsYXliYWNrIHBvc2l0aW9uIGFzIGEgbG9uZyBpbnRlZ2VyIG51bWJlciBvZiBtaWxsaXNlY29uZHMKKyAgICAgKiBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbnRlbnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBjb250ZW50IHBsYXliYWNrIHBvc2l0aW9uIGluIG1pbGxpc2Vjb25kcywgb3IgLTEgaWYgdW5rbm93bi4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRDb250ZW50UG9zaXRpb24oKSB7CisgICAgICAgIHJldHVybiBtQnVuZGxlLmdldExvbmcoS0VZX0NPTlRFTlRfUE9TSVRJT04sIC0xKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB0b3RhbCBkdXJhdGlvbiBvZiB0aGUgY29udGVudCB0byBiZSBwbGF5ZWQgYXMgYSBsb25nIGludGVnZXIgbnVtYmVyIG9mCisgICAgICogbWlsbGlzZWNvbmRzLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgY29udGVudCBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMsIG9yIC0xIGlmIHVua25vd24uCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0Q29udGVudER1cmF0aW9uKCkgeworICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRMb25nKEtFWV9DT05URU5UX0RVUkFUSU9OLCAtMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBhIGJ1bmRsZSBvZiBleHRyYXMgZm9yIHRoaXMgc3RhdHVzIG9iamVjdC4KKyAgICAgKiBUaGUgZXh0cmFzIHdpbGwgYmUgaWdub3JlZCBieSB0aGUgbWVkaWEgcm91dGVyIGJ1dCB0aGV5IG1heSBiZSB1c2VkCisgICAgICogYnkgYXBwbGljYXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBCdW5kbGUgZ2V0RXh0cmFzKCkgeworICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRCdW5kbGUoS0VZX0VYVFJBUyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICByZXN1bHQuYXBwZW5kKCJNZWRpYUl0ZW1TdGF0dXN7ICIpOworICAgICAgICByZXN1bHQuYXBwZW5kKCJ0aW1lc3RhbXA9Iik7CisgICAgICAgIFRpbWVVdGlscy5mb3JtYXREdXJhdGlvbihTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKSAtIGdldFRpbWVzdGFtcCgpLCByZXN1bHQpOworICAgICAgICByZXN1bHQuYXBwZW5kKCIgbXMgYWdvIik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgcGxheWJhY2tTdGF0ZT0iKS5hcHBlbmQocGxheWJhY2tTdGF0ZVRvU3RyaW5nKGdldFBsYXliYWNrU3RhdGUoKSkpOworICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGNvbnRlbnRQb3NpdGlvbj0iKS5hcHBlbmQoZ2V0Q29udGVudFBvc2l0aW9uKCkpOworICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGNvbnRlbnREdXJhdGlvbj0iKS5hcHBlbmQoZ2V0Q29udGVudER1cmF0aW9uKCkpOworICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGV4dHJhcz0iKS5hcHBlbmQoZ2V0RXh0cmFzKCkpOworICAgICAgICByZXN1bHQuYXBwZW5kKCIgfSIpOworICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHBsYXliYWNrU3RhdGVUb1N0cmluZyhpbnQgcGxheWJhY2tTdGF0ZSkgeworICAgICAgICBzd2l0Y2ggKHBsYXliYWNrU3RhdGUpIHsKKyAgICAgICAgICAgIGNhc2UgUExBWUJBQ0tfU1RBVEVfUEVORElORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gInBlbmRpbmciOworICAgICAgICAgICAgY2FzZSBQTEFZQkFDS19TVEFURV9CVUZGRVJJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuICJidWZmZXJpbmciOworICAgICAgICAgICAgY2FzZSBQTEFZQkFDS19TVEFURV9QTEFZSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiAicGxheWluZyI7CisgICAgICAgICAgICBjYXNlIFBMQVlCQUNLX1NUQVRFX1BBVVNFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gInBhdXNlZCI7CisgICAgICAgICAgICBjYXNlIFBMQVlCQUNLX1NUQVRFX0ZJTklTSEVEOgorICAgICAgICAgICAgICAgIHJldHVybiAiZmluaXNoZWQiOworICAgICAgICAgICAgY2FzZSBQTEFZQkFDS19TVEFURV9DQU5DRUxFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gImNhbmNlbGVkIjsKKyAgICAgICAgICAgIGNhc2UgUExBWUJBQ0tfU1RBVEVfSU5WQUxJREFURUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJpbnZhbGlkYXRlZCI7CisgICAgICAgICAgICBjYXNlIFBMQVlCQUNLX1NUQVRFX0VSUk9SOgorICAgICAgICAgICAgICAgIHJldHVybiAiZXJyb3IiOworICAgICAgICB9CisgICAgICAgIHJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKHBsYXliYWNrU3RhdGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIHRoaXMgb2JqZWN0IHRvIGEgYnVuZGxlIGZvciBzZXJpYWxpemF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgY29udGVudHMgb2YgdGhlIG9iamVjdCByZXByZXNlbnRlZCBhcyBhIGJ1bmRsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnVuZGxlIGFzQnVuZGxlKCkgeworICAgICAgICByZXR1cm4gbUJ1bmRsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZyb20gYSBidW5kbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVuZGxlIFRoZSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKiBAcmV0dXJuIFRoZSBuZXcgaW5zdGFuY2UsIG9yIG51bGwgaWYgdGhlIGJ1bmRsZSB3YXMgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE1lZGlhSXRlbVN0YXR1cyBmcm9tQnVuZGxlKEJ1bmRsZSBidW5kbGUpIHsKKyAgICAgICAgcmV0dXJuIGJ1bmRsZSAhPSBudWxsID8gbmV3IE1lZGlhSXRlbVN0YXR1cyhidW5kbGUpIDogbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCdWlsZGVyIGZvciB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzIG1lZGlhIGl0ZW0gc3RhdHVzIG9iamVjdHN9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1CdW5kbGU7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBtZWRpYSBpdGVtIHN0YXR1cyBidWlsZGVyIHVzaW5nIHRoZSBjdXJyZW50IHRpbWUgYXMgdGhlCisgICAgICAgICAqIHJlZmVyZW5jZSB0aW1lc3RhbXAuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwbGF5YmFja1N0YXRlIFRoZSBpdGVtIHBsYXliYWNrIHN0YXRlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIoaW50IHBsYXliYWNrU3RhdGUpIHsKKyAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICBzZXRUaW1lc3RhbXAoU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCkpOworICAgICAgICAgICAgc2V0UGxheWJhY2tTdGF0ZShwbGF5YmFja1N0YXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgbWVkaWEgaXRlbSBzdGF0dXMgYnVpbGRlciB3aG9zZSBpbml0aWFsIGNvbnRlbnRzIGFyZQorICAgICAgICAgKiBjb3BpZWQgZnJvbSBhbiBleGlzdGluZyBzdGF0dXMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlcihNZWRpYUl0ZW1TdGF0dXMgc3RhdHVzKSB7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzdGF0dXMgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZShzdGF0dXMubUJ1bmRsZSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgdGltZXN0YW1wIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3RhdHVzIGluZm9ybWF0aW9uIGluCisgICAgICAgICAqIG1pbGxpc2Vjb25kcyBzaW5jZSBib290IGluIHRoZSB7QGxpbmsgU3lzdGVtQ2xvY2sjZWxhcHNlZFJlYWx0aW1lfSB0aW1lIGJhc2UuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRUaW1lc3RhbXAobG9uZyBlbGFwc2VkUmVhbHRpbWVUaW1lc3RhbXApIHsKKyAgICAgICAgICAgIG1CdW5kbGUucHV0TG9uZyhLRVlfVElNRVNUQU1QLCBlbGFwc2VkUmVhbHRpbWVUaW1lc3RhbXApOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgcGxheWJhY2sgc3RhdGUgb2YgdGhlIG1lZGlhIGl0ZW0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRQbGF5YmFja1N0YXRlKGludCBwbGF5YmFja1N0YXRlKSB7CisgICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfUExBWUJBQ0tfU1RBVEUsIHBsYXliYWNrU3RhdGUpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgY29udGVudCBwbGF5YmFjayBwb3NpdGlvbiBhcyBhIGxvbmcgaW50ZWdlciBudW1iZXIgb2YgbWlsbGlzZWNvbmRzCisgICAgICAgICAqIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgY29udGVudC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldENvbnRlbnRQb3NpdGlvbihsb25nIHBvc2l0aW9uTWlsbGlzZWNvbmRzKSB7CisgICAgICAgICAgICBtQnVuZGxlLnB1dExvbmcoS0VZX0NPTlRFTlRfUE9TSVRJT04sIHBvc2l0aW9uTWlsbGlzZWNvbmRzKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIHRvdGFsIGR1cmF0aW9uIG9mIHRoZSBjb250ZW50IHRvIGJlIHBsYXllZCBhcyBhIGxvbmcgaW50ZWdlciBudW1iZXIKKyAgICAgICAgICogb2YgbWlsbGlzZWNvbmRzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Q29udGVudER1cmF0aW9uKGxvbmcgZHVyYXRpb25NaWxsaXNlY29uZHMpIHsKKyAgICAgICAgICAgIG1CdW5kbGUucHV0TG9uZyhLRVlfQ09OVEVOVF9EVVJBVElPTiwgZHVyYXRpb25NaWxsaXNlY29uZHMpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyBhIGJ1bmRsZSBvZiBleHRyYXMgZm9yIHRoaXMgc3RhdHVzIG9iamVjdC4KKyAgICAgICAgICogVGhlIGV4dHJhcyB3aWxsIGJlIGlnbm9yZWQgYnkgdGhlIG1lZGlhIHJvdXRlciBidXQgdGhleSBtYXkgYmUgdXNlZAorICAgICAgICAgKiBieSBhcHBsaWNhdGlvbnMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRFeHRyYXMoQnVuZGxlIGV4dHJhcykgeworICAgICAgICAgICAgbUJ1bmRsZS5wdXRCdW5kbGUoS0VZX0VYVFJBUywgZXh0cmFzKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJ1aWxkcyB0aGUge0BsaW5rIE1lZGlhSXRlbVN0YXR1cyBtZWRpYSBpdGVtIHN0YXR1cyBvYmplY3R9LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE1lZGlhSXRlbVN0YXR1cyBidWlsZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFJdGVtU3RhdHVzKG1CdW5kbGUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVEZXNjcmlwdG9yLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZURlc2NyaXB0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmM4NGZjCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVEZXNjcmlwdG9yLmphdmEKQEAgLTAsMCArMSw2OTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRTZW5kZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIERlc2NyaWJlcyB0aGUgcHJvcGVydGllcyBvZiBhIHJvdXRlLgorICogPHA+CisgKiBFYWNoIHJvdXRlIGlzIHVuaXF1ZWx5IGlkZW50aWZpZWQgYnkgYW4gb3BhcXVlIGlkIHN0cmluZy4gIFRoaXMgdG9rZW4KKyAqIG1heSB0YWtlIGFueSBmb3JtIGFzIGxvbmcgYXMgaXQgaXMgdW5pcXVlIHdpdGhpbiB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIuCisgKiA8L3A+PHA+CisgKiBUaGlzIG9iamVjdCBpcyBpbW11dGFibGUgb25jZSBjcmVhdGVkIHVzaW5nIGEge0BsaW5rIEJ1aWxkZXJ9IGluc3RhbmNlLgorICogPC9wPgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTWVkaWFSb3V0ZURlc2NyaXB0b3IgeworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0lEID0gImlkIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9HUk9VUF9NRU1CRVJfSURTID0gImdyb3VwTWVtYmVySWRzIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9OQU1FID0gIm5hbWUiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RFU0NSSVBUSU9OID0gInN0YXR1cyI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfSUNPTl9VUkkgPSAiaWNvblVyaSI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRU5BQkxFRCA9ICJlbmFibGVkIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT05ORUNUSU5HID0gImNvbm5lY3RpbmciOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTk5FQ1RJT05fU1RBVEUgPSAiY29ubmVjdGlvblN0YXRlIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT05UUk9MX0ZJTFRFUlMgPSAiY29udHJvbEZpbHRlcnMiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BMQVlCQUNLX1RZUEUgPSAicGxheWJhY2tUeXBlIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QTEFZQkFDS19TVFJFQU0gPSAicGxheWJhY2tTdHJlYW0iOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RFVklDRV9UWVBFID0gImRldmljZVR5cGUiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1ZPTFVNRSA9ICJ2b2x1bWUiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1ZPTFVNRV9NQVggPSAidm9sdW1lTWF4IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9WT0xVTUVfSEFORExJTkcgPSAidm9sdW1lSGFuZGxpbmciOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BSRVNFTlRBVElPTl9ESVNQTEFZX0lEID0gInByZXNlbnRhdGlvbkRpc3BsYXlJZCI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRVhUUkFTID0gImV4dHJhcyI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ0FOX0RJU0NPTk5FQ1QgPSAiY2FuRGlzY29ubmVjdCI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VUVElOR1NfSU5URU5UID0gInNldHRpbmdzSW50ZW50IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9NSU5fQ0xJRU5UX1ZFUlNJT04gPSAibWluQ2xpZW50VmVyc2lvbiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTUFYX0NMSUVOVF9WRVJTSU9OID0gIm1heENsaWVudFZlcnNpb24iOworCisgICAgZmluYWwgQnVuZGxlIG1CdW5kbGU7CisgICAgTGlzdDxJbnRlbnRGaWx0ZXI+IG1Db250cm9sRmlsdGVyczsKKworICAgIE1lZGlhUm91dGVEZXNjcmlwdG9yKEJ1bmRsZSBidW5kbGUsIExpc3Q8SW50ZW50RmlsdGVyPiBjb250cm9sRmlsdGVycykgeworICAgICAgICBtQnVuZGxlID0gYnVuZGxlOworICAgICAgICBtQ29udHJvbEZpbHRlcnMgPSBjb250cm9sRmlsdGVyczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB1bmlxdWUgaWQgb2YgdGhlIHJvdXRlLgorICAgICAqIDxwPgorICAgICAqIFRoZSByb3V0ZSBpZCBhc3NvY2lhdGVkIHdpdGggYSByb3V0ZSBkZXNjcmlwdG9yIGZ1bmN0aW9ucyBhcyBhIHN0YWJsZQorICAgICAqIGlkZW50aWZpZXIgZm9yIHRoZSByb3V0ZSBhbmQgbXVzdCBiZSB1bmlxdWUgYW1vbmcgYWxsIHJvdXRlcyBvZmZlcmVkCisgICAgICogYnkgdGhlIHByb3ZpZGVyLgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgeworICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRTdHJpbmcoS0VZX0lEKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBncm91cCBtZW1iZXIgaWRzIG9mIHRoZSByb3V0ZS4KKyAgICAgKiA8cD4KKyAgICAgKiBBIHJvdXRlIGRlc2NyaXB0b3IgdGhhdCBoYXMgb25lIG9yIG1vcmUgZ3JvdXAgbWVtYmVyIHJvdXRlIGlkcworICAgICAqIHJlcHJlc2VudHMgYSByb3V0ZSBncm91cC4gQSBtZW1iZXIgcm91dGUgbWF5IGJlbG9uZyB0byBhbm90aGVyIGdyb3VwLgorICAgICAqIDwvcD4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCisgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRHcm91cE1lbWJlcklkcygpIHsKKyAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0U3RyaW5nQXJyYXlMaXN0KEtFWV9HUk9VUF9NRU1CRVJfSURTKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB1c2VyLXZpc2libGUgbmFtZSBvZiB0aGUgcm91dGUuCisgICAgICogPHA+CisgICAgICogVGhlIHJvdXRlIG5hbWUgaWRlbnRpZmllcyB0aGUgZGVzdGluYXRpb24gcmVwcmVzZW50ZWQgYnkgdGhlIHJvdXRlLgorICAgICAqIEl0IG1heSBiZSBhIHVzZXItc3VwcGxpZWQgbmFtZSwgYW4gYWxpYXMsIG9yIGRldmljZSBzZXJpYWwgbnVtYmVyLgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBtQnVuZGxlLmdldFN0cmluZyhLRVlfTkFNRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdXNlci12aXNpYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSByb3V0ZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgcm91dGUgZGVzY3JpcHRpb24gZGVzY3JpYmVzIHRoZSBraW5kIG9mIGRlc3RpbmF0aW9uIHJlcHJlc2VudGVkIGJ5IHRoZSByb3V0ZS4KKyAgICAgKiBJdCBtYXkgYmUgYSB1c2VyLXN1cHBsaWVkIHN0cmluZywgYSBtb2RlbCBudW1iZXIgb3IgYnJhbmQgb2YgZGV2aWNlLgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRTdHJpbmcoS0VZX0RFU0NSSVBUSU9OKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBVUkkgb2YgdGhlIGljb24gcmVwcmVzZW50aW5nIHRoaXMgcm91dGUuCisgICAgICogPHA+CisgICAgICogVGhpcyBpY29uIHdpbGwgYmUgdXNlZCBpbiBwaWNrZXIgVUlzIGlmIGF2YWlsYWJsZS4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIFVyaSBnZXRJY29uVXJpKCkgeworICAgICAgICBTdHJpbmcgaWNvblVyaSA9IG1CdW5kbGUuZ2V0U3RyaW5nKEtFWV9JQ09OX1VSSSk7CisgICAgICAgIHJldHVybiBpY29uVXJpID09IG51bGwgPyBudWxsIDogVXJpLnBhcnNlKGljb25VcmkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgd2hldGhlciB0aGUgcm91dGUgaXMgZW5hYmxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7CisgICAgICAgIHJldHVybiBtQnVuZGxlLmdldEJvb2xlYW4oS0VZX0VOQUJMRUQsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgd2hldGhlciB0aGUgcm91dGUgaXMgY29ubmVjdGluZy4KKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXRDb25uZWN0aW9uU3RhdGV9IGluc3RlYWQKKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGluZygpIHsKKyAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0Qm9vbGVhbihLRVlfQ09OTkVDVElORywgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGNvbm5lY3Rpb24gc3RhdGUgb2YgdGhlIHJvdXRlLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgY29ubmVjdGlvbiBzdGF0ZSBvZiB0aGlzIHJvdXRlOgorICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUR9LAorICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jQ09OTkVDVElPTl9TVEFURV9DT05ORUNUSU5HfSwgb3IKKyAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0NPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVEVEfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldENvbm5lY3Rpb25TdGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEtFWV9DT05ORUNUSU9OX1NUQVRFLAorICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mby5DT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB3aGV0aGVyIHRoZSByb3V0ZSBjYW4gYmUgZGlzY29ubmVjdGVkIHdpdGhvdXQgc3RvcHBpbmcgcGxheWJhY2suCisgICAgICogPHA+CisgICAgICogVGhlIHJvdXRlIGNhbiBub3JtYWxseSBiZSBkaXNjb25uZWN0ZWQgd2l0aG91dCBzdG9wcGluZyBwbGF5YmFjayB3aGVuCisgICAgICogdGhlIGRlc3RpbmF0aW9uIGRldmljZSBvbiB0aGUgcm91dGUgaXMgY29ubmVjdGVkIHRvIHR3byBvciBtb3JlIHNvdXJjZQorICAgICAqIGRldmljZXMuIFRoZSByb3V0ZSBwcm92aWRlciBzaG91bGQgdXBkYXRlIHRoZSByb3V0ZSBpbW1lZGlhdGVseSB3aGVuIHRoZQorICAgICAqIG51bWJlciBvZiBjb25uZWN0ZWQgZGV2aWNlcyBjaGFuZ2VzLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBUbyBzcGVjaWZ5IHRoYXQgdGhlIHJvdXRlIHNob3VsZCBkaXNjb25uZWN0IHdpdGhvdXQgc3RvcHBpbmcgdXNlCisgICAgICoge0BsaW5rIE1lZGlhUm91dGVyI3Vuc2VsZWN0KGludCl9IHdpdGgKKyAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX0RJU0NPTk5FQ1RFRH0uCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNhbkRpc2Nvbm5lY3RBbmRLZWVwUGxheWluZygpIHsKKyAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0Qm9vbGVhbihLRVlfQ0FOX0RJU0NPTk5FQ1QsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGFuIHtAbGluayBJbnRlbnRTZW5kZXJ9IGZvciBzdGFydGluZyBhIHNldHRpbmdzIGFjdGl2aXR5IGZvciB0aGlzCisgICAgICogcm91dGUuIFRoZSBhY3Rpdml0eSBtYXkgaGF2ZSBzcGVjaWZpYyByb3V0ZSBzZXR0aW5ncyBvciBnZW5lcmFsIHNldHRpbmdzCisgICAgICogZm9yIHRoZSBjb25uZWN0ZWQgZGV2aWNlIG9yIHJvdXRlIHByb3ZpZGVyLgorICAgICAqCisgICAgICogQHJldHVybiBBbiB7QGxpbmsgSW50ZW50U2VuZGVyfSB0byBzdGFydCBhIHNldHRpbmdzIGFjdGl2aXR5LgorICAgICAqLworICAgIHB1YmxpYyBJbnRlbnRTZW5kZXIgZ2V0U2V0dGluZ3NBY3Rpdml0eSgpIHsKKyAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0UGFyY2VsYWJsZShLRVlfU0VUVElOR1NfSU5URU5UKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSByb3V0ZSdzIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBpbnRlbnR9IGZpbHRlcnMuCisgICAgICovCisgICAgcHVibGljIExpc3Q8SW50ZW50RmlsdGVyPiBnZXRDb250cm9sRmlsdGVycygpIHsKKyAgICAgICAgZW5zdXJlQ29udHJvbEZpbHRlcnMoKTsKKyAgICAgICAgcmV0dXJuIG1Db250cm9sRmlsdGVyczsKKyAgICB9CisKKyAgICB2b2lkIGVuc3VyZUNvbnRyb2xGaWx0ZXJzKCkgeworICAgICAgICBpZiAobUNvbnRyb2xGaWx0ZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIG1Db250cm9sRmlsdGVycyA9IG1CdW5kbGUuPEludGVudEZpbHRlcj5nZXRQYXJjZWxhYmxlQXJyYXlMaXN0KEtFWV9DT05UUk9MX0ZJTFRFUlMpOworICAgICAgICAgICAgaWYgKG1Db250cm9sRmlsdGVycyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUNvbnRyb2xGaWx0ZXJzID0gQ29sbGVjdGlvbnMuPEludGVudEZpbHRlcj5lbXB0eUxpc3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHR5cGUgb2YgcGxheWJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSB0eXBlIG9mIHBsYXliYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlOgorICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jUExBWUJBQ0tfVFlQRV9MT0NBTH0gb3IKKyAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI1BMQVlCQUNLX1RZUEVfUkVNT1RFfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFBsYXliYWNrVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEtFWV9QTEFZQkFDS19UWVBFLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uUExBWUJBQ0tfVFlQRV9SRU1PVEUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHJvdXRlJ3MgcGxheWJhY2sgc3RyZWFtLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UGxheWJhY2tTdHJlYW0oKSB7CisgICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfUExBWUJBQ0tfU1RSRUFNLCAtMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdHlwZSBvZiB0aGUgcmVjZWl2ZXIgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgdHlwZSBvZiB0aGUgcmVjZWl2ZXIgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlOgorICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jREVWSUNFX1RZUEVfVFZ9IG9yCisgICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNERVZJQ0VfVFlQRV9TUEVBS0VSfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldERldmljZVR5cGUoKSB7CisgICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfREVWSUNFX1RZUEUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHJvdXRlJ3MgY3VycmVudCB2b2x1bWUsIG9yIDAgaWYgdW5rbm93bi4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFZvbHVtZSgpIHsKKyAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEtFWV9WT0xVTUUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHJvdXRlJ3MgbWF4aW11bSB2b2x1bWUsIG9yIDAgaWYgdW5rbm93bi4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFZvbHVtZU1heCgpIHsKKyAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEtFWV9WT0xVTUVfTUFYKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGluZm9ybWF0aW9uIGFib3V0IGhvdyB2b2x1bWUgaXMgaGFuZGxlZCBvbiB0aGUgcm91dGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEhvdyB2b2x1bWUgaXMgaGFuZGxlZCBvbiB0aGUgcm91dGU6CisgICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNQTEFZQkFDS19WT0xVTUVfRklYRUR9IG9yCisgICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNQTEFZQkFDS19WT0xVTUVfVkFSSUFCTEV9LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0Vm9sdW1lSGFuZGxpbmcoKSB7CisgICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfVk9MVU1FX0hBTkRMSU5HLAorICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mby5QTEFZQkFDS19WT0xVTUVfRklYRUQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHJvdXRlJ3MgcHJlc2VudGF0aW9uIGRpc3BsYXkgaWQsIG9yIC0xIGlmIG5vbmUuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRQcmVzZW50YXRpb25EaXNwbGF5SWQoKSB7CisgICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludCgKKyAgICAgICAgICAgICAgICBLRVlfUFJFU0VOVEFUSU9OX0RJU1BMQVlfSUQsIE1lZGlhUm91dGVyLlJvdXRlSW5mby5QUkVTRU5UQVRJT05fRElTUExBWV9JRF9OT05FKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGEgYnVuZGxlIG9mIGV4dHJhcyBmb3IgdGhpcyByb3V0ZSBkZXNjcmlwdG9yLgorICAgICAqIFRoZSBleHRyYXMgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgYnV0IHRoZXkgbWF5IGJlIHVzZWQKKyAgICAgKiBieSBhcHBsaWNhdGlvbnMuCisgICAgICovCisgICAgcHVibGljIEJ1bmRsZSBnZXRFeHRyYXMoKSB7CisgICAgICAgIHJldHVybiBtQnVuZGxlLmdldEJ1bmRsZShLRVlfRVhUUkFTKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBtaW5pbXVtIGNsaWVudCB2ZXJzaW9uIHJlcXVpcmVkIGZvciB0aGlzIHJvdXRlLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKKyAgICBwdWJsaWMgaW50IGdldE1pbkNsaWVudFZlcnNpb24oKSB7CisgICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfTUlOX0NMSUVOVF9WRVJTSU9OLAorICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9WRVJTSU9OX1NUQVJUKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBtYXhpbXVtIGNsaWVudCB2ZXJzaW9uIHJlcXVpcmVkIGZvciB0aGlzIHJvdXRlLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKKyAgICBwdWJsaWMgaW50IGdldE1heENsaWVudFZlcnNpb24oKSB7CisgICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfTUFYX0NMSUVOVF9WRVJTSU9OLCBJbnRlZ2VyLk1BWF9WQUxVRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBkZXNjcmlwdG9yIGhhcyBhbGwgb2YgdGhlIHJlcXVpcmVkIGZpZWxkcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgeworICAgICAgICBlbnN1cmVDb250cm9sRmlsdGVycygpOworICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoZ2V0SWQoKSkKKyAgICAgICAgICAgICAgICB8fCBUZXh0VXRpbHMuaXNFbXB0eShnZXROYW1lKCkpCisgICAgICAgICAgICAgICAgfHwgbUNvbnRyb2xGaWx0ZXJzLmNvbnRhaW5zKG51bGwpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICByZXN1bHQuYXBwZW5kKCJNZWRpYVJvdXRlRGVzY3JpcHRvcnsgIik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoImlkPSIpLmFwcGVuZChnZXRJZCgpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBncm91cE1lbWJlcklkcz0iKS5hcHBlbmQoZ2V0R3JvdXBNZW1iZXJJZHMoKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgbmFtZT0iKS5hcHBlbmQoZ2V0TmFtZSgpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBkZXNjcmlwdGlvbj0iKS5hcHBlbmQoZ2V0RGVzY3JpcHRpb24oKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgaWNvblVyaT0iKS5hcHBlbmQoZ2V0SWNvblVyaSgpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBpc0VuYWJsZWQ9IikuYXBwZW5kKGlzRW5hYmxlZCgpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBpc0Nvbm5lY3Rpbmc9IikuYXBwZW5kKGlzQ29ubmVjdGluZygpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBjb25uZWN0aW9uU3RhdGU9IikuYXBwZW5kKGdldENvbm5lY3Rpb25TdGF0ZSgpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBjb250cm9sRmlsdGVycz0iKS5hcHBlbmQoQXJyYXlzLnRvU3RyaW5nKGdldENvbnRyb2xGaWx0ZXJzKCkudG9BcnJheSgpKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgcGxheWJhY2tUeXBlPSIpLmFwcGVuZChnZXRQbGF5YmFja1R5cGUoKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgcGxheWJhY2tTdHJlYW09IikuYXBwZW5kKGdldFBsYXliYWNrU3RyZWFtKCkpOworICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGRldmljZVR5cGU9IikuYXBwZW5kKGdldERldmljZVR5cGUoKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgdm9sdW1lPSIpLmFwcGVuZChnZXRWb2x1bWUoKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgdm9sdW1lTWF4PSIpLmFwcGVuZChnZXRWb2x1bWVNYXgoKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgdm9sdW1lSGFuZGxpbmc9IikuYXBwZW5kKGdldFZvbHVtZUhhbmRsaW5nKCkpOworICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHByZXNlbnRhdGlvbkRpc3BsYXlJZD0iKS5hcHBlbmQoZ2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKCkpOworICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGV4dHJhcz0iKS5hcHBlbmQoZ2V0RXh0cmFzKCkpOworICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGlzVmFsaWQ9IikuYXBwZW5kKGlzVmFsaWQoKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgbWluQ2xpZW50VmVyc2lvbj0iKS5hcHBlbmQoZ2V0TWluQ2xpZW50VmVyc2lvbigpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBtYXhDbGllbnRWZXJzaW9uPSIpLmFwcGVuZChnZXRNYXhDbGllbnRWZXJzaW9uKCkpOworICAgICAgICByZXN1bHQuYXBwZW5kKCIgfSIpOworICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydHMgdGhpcyBvYmplY3QgdG8gYSBidW5kbGUgZm9yIHNlcmlhbGl6YXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBjb250ZW50cyBvZiB0aGUgb2JqZWN0IHJlcHJlc2VudGVkIGFzIGEgYnVuZGxlLgorICAgICAqLworICAgIHB1YmxpYyBCdW5kbGUgYXNCdW5kbGUoKSB7CisgICAgICAgIHJldHVybiBtQnVuZGxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZnJvbSBhIGJ1bmRsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBidW5kbGUgVGhlIGJ1bmRsZSwgb3IgbnVsbCBpZiBub25lLgorICAgICAqIEByZXR1cm4gVGhlIG5ldyBpbnN0YW5jZSwgb3IgbnVsbCBpZiB0aGUgYnVuZGxlIHdhcyBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFSb3V0ZURlc2NyaXB0b3IgZnJvbUJ1bmRsZShCdW5kbGUgYnVuZGxlKSB7CisgICAgICAgIHJldHVybiBidW5kbGUgIT0gbnVsbCA/IG5ldyBNZWRpYVJvdXRlRGVzY3JpcHRvcihidW5kbGUsIG51bGwpIDogbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCdWlsZGVyIGZvciB7QGxpbmsgTWVkaWFSb3V0ZURlc2NyaXB0b3IgbWVkaWEgcm91dGUgZGVzY3JpcHRvcnN9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1CdW5kbGU7CisgICAgICAgIHByaXZhdGUgQXJyYXlMaXN0PFN0cmluZz4gbUdyb3VwTWVtYmVySWRzOworICAgICAgICBwcml2YXRlIEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+IG1Db250cm9sRmlsdGVyczsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIG1lZGlhIHJvdXRlIGRlc2NyaXB0b3IgYnVpbGRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGlkIFRoZSB1bmlxdWUgaWQgb2YgdGhlIHJvdXRlLgorICAgICAgICAgKiBAcGFyYW0gbmFtZSBUaGUgdXNlci12aXNpYmxlIG5hbWUgb2YgdGhlIHJvdXRlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgIHNldElkKGlkKTsKKyAgICAgICAgICAgIHNldE5hbWUobmFtZSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIG1lZGlhIHJvdXRlIGRlc2NyaXB0b3IgYnVpbGRlciB3aG9zZSBpbml0aWFsIGNvbnRlbnRzIGFyZQorICAgICAgICAgKiBjb3BpZWQgZnJvbSBhbiBleGlzdGluZyBkZXNjcmlwdG9yLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIoTWVkaWFSb3V0ZURlc2NyaXB0b3IgZGVzY3JpcHRvcikgeworICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImRlc2NyaXB0b3IgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZShkZXNjcmlwdG9yLm1CdW5kbGUpOworCisgICAgICAgICAgICBkZXNjcmlwdG9yLmVuc3VyZUNvbnRyb2xGaWx0ZXJzKCk7CisgICAgICAgICAgICBpZiAoIWRlc2NyaXB0b3IubUNvbnRyb2xGaWx0ZXJzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIG1Db250cm9sRmlsdGVycyA9IG5ldyBBcnJheUxpc3Q8SW50ZW50RmlsdGVyPihkZXNjcmlwdG9yLm1Db250cm9sRmlsdGVycyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgdW5pcXVlIGlkIG9mIHRoZSByb3V0ZS4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoZSByb3V0ZSBpZCBhc3NvY2lhdGVkIHdpdGggYSByb3V0ZSBkZXNjcmlwdG9yIGZ1bmN0aW9ucyBhcyBhIHN0YWJsZQorICAgICAgICAgKiBpZGVudGlmaWVyIGZvciB0aGUgcm91dGUgYW5kIG11c3QgYmUgdW5pcXVlIGFtb25nIGFsbCByb3V0ZXMgb2ZmZXJlZAorICAgICAgICAgKiBieSB0aGUgcHJvdmlkZXIuCisgICAgICAgICAqIDwvcD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldElkKFN0cmluZyBpZCkgeworICAgICAgICAgICAgbUJ1bmRsZS5wdXRTdHJpbmcoS0VZX0lELCBpZCk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGRzIGEgZ3JvdXAgbWVtYmVyIGlkIG9mIHRoZSByb3V0ZS4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIEEgcm91dGUgZGVzY3JpcHRvciB0aGF0IGhhcyBvbmUgb3IgbW9yZSBncm91cCBtZW1iZXIgcm91dGUgaWRzCisgICAgICAgICAqIHJlcHJlc2VudHMgYSByb3V0ZSBncm91cC4gQSBtZW1iZXIgcm91dGUgbWF5IGJlbG9uZyB0byBhbm90aGVyIGdyb3VwLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQorICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRHcm91cE1lbWJlcklkKFN0cmluZyBncm91cE1lbWJlcklkKSB7CisgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoZ3JvdXBNZW1iZXJJZCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJncm91cE1lbWJlcklkIG11c3Qgbm90IGJlIGVtcHR5Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtR3JvdXBNZW1iZXJJZHMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1Hcm91cE1lbWJlcklkcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFtR3JvdXBNZW1iZXJJZHMuY29udGFpbnMoZ3JvdXBNZW1iZXJJZCkpIHsKKyAgICAgICAgICAgICAgICBtR3JvdXBNZW1iZXJJZHMuYWRkKGdyb3VwTWVtYmVySWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkcyBhIGxpc3Qgb2YgZ3JvdXAgbWVtYmVyIGlkcyBvZiB0aGUgcm91dGUuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBBIHJvdXRlIGRlc2NyaXB0b3IgdGhhdCBoYXMgb25lIG9yIG1vcmUgZ3JvdXAgbWVtYmVyIHJvdXRlIGlkcworICAgICAgICAgKiByZXByZXNlbnRzIGEgcm91dGUgZ3JvdXAuIEEgbWVtYmVyIHJvdXRlIG1heSBiZWxvbmcgdG8gYW5vdGhlciBncm91cC4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkR3JvdXBNZW1iZXJJZHMoQ29sbGVjdGlvbjxTdHJpbmc+IGdyb3VwTWVtYmVySWRzKSB7CisgICAgICAgICAgICBpZiAoZ3JvdXBNZW1iZXJJZHMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImdyb3VwTWVtYmVySWRzIG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFncm91cE1lbWJlcklkcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBncm91cE1lbWJlcklkIDogZ3JvdXBNZW1iZXJJZHMpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkR3JvdXBNZW1iZXJJZChncm91cE1lbWJlcklkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSB1c2VyLXZpc2libGUgbmFtZSBvZiB0aGUgcm91dGUuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGUgcm91dGUgbmFtZSBpZGVudGlmaWVzIHRoZSBkZXN0aW5hdGlvbiByZXByZXNlbnRlZCBieSB0aGUgcm91dGUuCisgICAgICAgICAqIEl0IG1heSBiZSBhIHVzZXItc3VwcGxpZWQgbmFtZSwgYW4gYWxpYXMsIG9yIGRldmljZSBzZXJpYWwgbnVtYmVyLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICBtQnVuZGxlLnB1dFN0cmluZyhLRVlfTkFNRSwgbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSB1c2VyLXZpc2libGUgZGVzY3JpcHRpb24gb2YgdGhlIHJvdXRlLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhlIHJvdXRlIGRlc2NyaXB0aW9uIGRlc2NyaWJlcyB0aGUga2luZCBvZiBkZXN0aW5hdGlvbiByZXByZXNlbnRlZCBieSB0aGUgcm91dGUuCisgICAgICAgICAqIEl0IG1heSBiZSBhIHVzZXItc3VwcGxpZWQgc3RyaW5nLCBhIG1vZGVsIG51bWJlciBvciBicmFuZCBvZiBkZXZpY2UuCisgICAgICAgICAqIDwvcD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgeworICAgICAgICAgICAgbUJ1bmRsZS5wdXRTdHJpbmcoS0VZX0RFU0NSSVBUSU9OLCBkZXNjcmlwdGlvbik7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSBVUkkgb2YgdGhlIGljb24gcmVwcmVzZW50aW5nIHRoaXMgcm91dGUuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGlzIGljb24gd2lsbCBiZSB1c2VkIGluIHBpY2tlciBVSXMgaWYgYXZhaWxhYmxlLgorICAgICAgICAgKiA8L3A+PHA+CisgICAgICAgICAqIFRoZSBVUkkgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBmb3JtYXRzOgorICAgICAgICAgKiA8dWw+CisgICAgICAgICAqIDxsaT5jb250ZW50ICh7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlciNTQ0hFTUVfQ09OVEVOVH0pPC9saT4KKyAgICAgICAgICogPGxpPmFuZHJvaWQucmVzb3VyY2UgKHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyI1NDSEVNRV9BTkRST0lEX1JFU09VUkNFfSkKKyAgICAgICAgICogPC9saT4KKyAgICAgICAgICogPGxpPmZpbGUgKHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyI1NDSEVNRV9GSUxFfSk8L2xpPgorICAgICAgICAgKiA8L3VsPgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRJY29uVXJpKFVyaSBpY29uVXJpKSB7CisgICAgICAgICAgICBpZiAoaWNvblVyaSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaWNvblVyaSBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQnVuZGxlLnB1dFN0cmluZyhLRVlfSUNPTl9VUkksIGljb25VcmkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIHJvdXRlIGlzIGVuYWJsZWQuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBEaXNhYmxlZCByb3V0ZXMgcmVwcmVzZW50IHJvdXRlcyB0aGF0IGEgcm91dGUgcHJvdmlkZXIga25vd3MgYWJvdXQsIHN1Y2ggYXMgcGFpcmVkCisgICAgICAgICAqIFdpZmkgRGlzcGxheSByZWNlaXZlcnMsIGJ1dCB0aGF0IGFyZSBub3QgY3VycmVudGx5IGF2YWlsYWJsZSBmb3IgdXNlLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICAgICAgbUJ1bmRsZS5wdXRCb29sZWFuKEtFWV9FTkFCTEVELCBlbmFibGVkKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgd2hldGhlciB0aGUgcm91dGUgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgY29ubmVjdGluZyBhbmQgaXMgbm90IHlldAorICAgICAgICAgKiByZWFkeSBmb3IgdXNlLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNzZXRDb25uZWN0aW9uU3RhdGV9IGluc3RlYWQuCisgICAgICAgICAqLworICAgICAgICBARGVwcmVjYXRlZAorICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRDb25uZWN0aW5nKGJvb2xlYW4gY29ubmVjdGluZykgeworICAgICAgICAgICAgbUJ1bmRsZS5wdXRCb29sZWFuKEtFWV9DT05ORUNUSU5HLCBjb25uZWN0aW5nKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIHJvdXRlJ3MgY29ubmVjdGlvbiBzdGF0ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNvbm5lY3Rpb25TdGF0ZSBUaGUgY29ubmVjdGlvbiBzdGF0ZSBvZiB0aGUgcm91dGU6CisgICAgICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUR9LAorICAgICAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0NPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVElOR30sIG9yCisgICAgICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUR9LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Q29ubmVjdGlvblN0YXRlKGludCBjb25uZWN0aW9uU3RhdGUpIHsKKyAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9DT05ORUNUSU9OX1NUQVRFLCBjb25uZWN0aW9uU3RhdGUpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB3aGV0aGVyIHRoZSByb3V0ZSBjYW4gYmUgZGlzY29ubmVjdGVkIHdpdGhvdXQgc3RvcHBpbmcgcGxheWJhY2suCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRDYW5EaXNjb25uZWN0KGJvb2xlYW4gY2FuRGlzY29ubmVjdCkgeworICAgICAgICAgICAgbUJ1bmRsZS5wdXRCb29sZWFuKEtFWV9DQU5fRElTQ09OTkVDVCwgY2FuRGlzY29ubmVjdCk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIGFuIGludGVudCBzZW5kZXIgZm9yIGxhdW5jaGluZyB0aGUgc2V0dGluZ3MgYWN0aXZpdHkgZm9yIHRoaXMKKyAgICAgICAgICogcm91dGUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRTZXR0aW5nc0FjdGl2aXR5KEludGVudFNlbmRlciBpcykgeworICAgICAgICAgICAgbUJ1bmRsZS5wdXRQYXJjZWxhYmxlKEtFWV9TRVRUSU5HU19JTlRFTlQsIGlzKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZHMgYSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgaW50ZW50fSBmaWx0ZXIgZm9yIHRoZSByb3V0ZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZENvbnRyb2xGaWx0ZXIoSW50ZW50RmlsdGVyIGZpbHRlcikgeworICAgICAgICAgICAgaWYgKGZpbHRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZmlsdGVyIG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1Db250cm9sRmlsdGVycyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUNvbnRyb2xGaWx0ZXJzID0gbmV3IEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW1Db250cm9sRmlsdGVycy5jb250YWlucyhmaWx0ZXIpKSB7CisgICAgICAgICAgICAgICAgbUNvbnRyb2xGaWx0ZXJzLmFkZChmaWx0ZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkcyBhIGxpc3Qgb2Yge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGludGVudH0gZmlsdGVycyBmb3IgdGhlIHJvdXRlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkQ29udHJvbEZpbHRlcnMoQ29sbGVjdGlvbjxJbnRlbnRGaWx0ZXI+IGZpbHRlcnMpIHsKKyAgICAgICAgICAgIGlmIChmaWx0ZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJmaWx0ZXJzIG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFmaWx0ZXJzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGZvciAoSW50ZW50RmlsdGVyIGZpbHRlciA6IGZpbHRlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkQ29udHJvbEZpbHRlcihmaWx0ZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIHJvdXRlJ3MgcGxheWJhY2sgdHlwZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHBsYXliYWNrVHlwZSBUaGUgcGxheWJhY2sgdHlwZSBvZiB0aGUgcm91dGU6CisgICAgICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jUExBWUJBQ0tfVFlQRV9MT0NBTH0gb3IKKyAgICAgICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNQTEFZQkFDS19UWVBFX1JFTU9URX0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRQbGF5YmFja1R5cGUoaW50IHBsYXliYWNrVHlwZSkgeworICAgICAgICAgICAgbUJ1bmRsZS5wdXRJbnQoS0VZX1BMQVlCQUNLX1RZUEUsIHBsYXliYWNrVHlwZSk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSByb3V0ZSdzIHBsYXliYWNrIHN0cmVhbS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFBsYXliYWNrU3RyZWFtKGludCBwbGF5YmFja1N0cmVhbSkgeworICAgICAgICAgICAgbUJ1bmRsZS5wdXRJbnQoS0VZX1BMQVlCQUNLX1NUUkVBTSwgcGxheWJhY2tTdHJlYW0pOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgcm91dGUncyByZWNlaXZlciBkZXZpY2UgdHlwZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGRldmljZVR5cGUgVGhlIHJlY2VpdmUgZGV2aWNlIHR5cGUgb2YgdGhlIHJvdXRlOgorICAgICAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0RFVklDRV9UWVBFX1RWfSBvcgorICAgICAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0RFVklDRV9UWVBFX1NQRUFLRVJ9LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RGV2aWNlVHlwZShpbnQgZGV2aWNlVHlwZSkgeworICAgICAgICAgICAgbUJ1bmRsZS5wdXRJbnQoS0VZX0RFVklDRV9UWVBFLCBkZXZpY2VUeXBlKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIHJvdXRlJ3MgY3VycmVudCB2b2x1bWUsIG9yIDAgaWYgdW5rbm93bi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFZvbHVtZShpbnQgdm9sdW1lKSB7CisgICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfVk9MVU1FLCB2b2x1bWUpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgcm91dGUncyBtYXhpbXVtIHZvbHVtZSwgb3IgMCBpZiB1bmtub3duLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Vm9sdW1lTWF4KGludCB2b2x1bWVNYXgpIHsKKyAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9WT0xVTUVfTUFYLCB2b2x1bWVNYXgpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgcm91dGUncyB2b2x1bWUgaGFuZGxpbmcuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB2b2x1bWVIYW5kbGluZyBob3cgdm9sdW1lIGlzIGhhbmRsZWQgb24gdGhlIHJvdXRlOgorICAgICAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI1BMQVlCQUNLX1ZPTFVNRV9GSVhFRH0gb3IKKyAgICAgICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNQTEFZQkFDS19WT0xVTUVfVkFSSUFCTEV9LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Vm9sdW1lSGFuZGxpbmcoaW50IHZvbHVtZUhhbmRsaW5nKSB7CisgICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfVk9MVU1FX0hBTkRMSU5HLCB2b2x1bWVIYW5kbGluZyk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSByb3V0ZSdzIHByZXNlbnRhdGlvbiBkaXNwbGF5IGlkLCBvciAtMSBpZiBub25lLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKGludCBwcmVzZW50YXRpb25EaXNwbGF5SWQpIHsKKyAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9QUkVTRU5UQVRJT05fRElTUExBWV9JRCwgcHJlc2VudGF0aW9uRGlzcGxheUlkKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgYSBidW5kbGUgb2YgZXh0cmFzIGZvciB0aGlzIHJvdXRlIGRlc2NyaXB0b3IuCisgICAgICAgICAqIFRoZSBleHRyYXMgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgYnV0IHRoZXkgbWF5IGJlIHVzZWQKKyAgICAgICAgICogYnkgYXBwbGljYXRpb25zLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RXh0cmFzKEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgICAgIG1CdW5kbGUucHV0QnVuZGxlKEtFWV9FWFRSQVMsIGV4dHJhcyk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSByb3V0ZSdzIG1pbmltdW0gY2xpZW50IHZlcnNpb24uCisgICAgICAgICAqIEEgcm91dGVyIHdob3NlIHZlcnNpb24gaXMgbG93ZXIgdGhhbiB0aGlzIHdpbGwgbm90IGJlIGFibGUgdG8gY29ubmVjdCB0byB0aGlzIHJvdXRlLgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0TWluQ2xpZW50VmVyc2lvbihpbnQgbWluVmVyc2lvbikgeworICAgICAgICAgICAgbUJ1bmRsZS5wdXRJbnQoS0VZX01JTl9DTElFTlRfVkVSU0lPTiwgbWluVmVyc2lvbik7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSByb3V0ZSdzIG1heGltdW0gY2xpZW50IHZlcnNpb24uCisgICAgICAgICAqIEEgcm91dGVyIHdob3NlIHZlcnNpb24gaXMgaGlnaGVyIHRoYW4gdGhpcyB3aWxsIG5vdCBiZSBhYmxlIHRvIGNvbm5lY3QgdG8gdGhpcyByb3V0ZS4KKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldE1heENsaWVudFZlcnNpb24oaW50IG1heFZlcnNpb24pIHsKKyAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9NQVhfQ0xJRU5UX1ZFUlNJT04sIG1heFZlcnNpb24pOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQnVpbGRzIHRoZSB7QGxpbmsgTWVkaWFSb3V0ZURlc2NyaXB0b3IgbWVkaWEgcm91dGUgZGVzY3JpcHRvcn0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTWVkaWFSb3V0ZURlc2NyaXB0b3IgYnVpbGQoKSB7CisgICAgICAgICAgICBpZiAobUNvbnRyb2xGaWx0ZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQnVuZGxlLnB1dFBhcmNlbGFibGVBcnJheUxpc3QoS0VZX0NPTlRST0xfRklMVEVSUywgbUNvbnRyb2xGaWx0ZXJzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtR3JvdXBNZW1iZXJJZHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1CdW5kbGUucHV0U3RyaW5nQXJyYXlMaXN0KEtFWV9HUk9VUF9NRU1CRVJfSURTLCBtR3JvdXBNZW1iZXJJZHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVJvdXRlRGVzY3JpcHRvcihtQnVuZGxlLCBtQ29udHJvbEZpbHRlcnMpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzk2MjdmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0LmphdmEKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKKworLyoqCisgKiBEZXNjcmliZXMgdGhlIGtpbmRzIG9mIHJvdXRlcyB0aGF0IHRoZSBtZWRpYSByb3V0ZXIgd291bGQgbGlrZSB0byBkaXNjb3ZlcgorICogYW5kIHdoZXRoZXIgdG8gcGVyZm9ybSBhY3RpdmUgc2Nhbm5pbmcuCisgKiA8cD4KKyAqIFRoaXMgb2JqZWN0IGlzIGltbXV0YWJsZSBvbmNlIGNyZWF0ZWQuCisgKiA8L3A+CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TRUxFQ1RPUiA9ICJzZWxlY3RvciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BQ1RJVkVfU0NBTiA9ICJhY3RpdmVTY2FuIjsKKworICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1CdW5kbGU7CisgICAgcHJpdmF0ZSBNZWRpYVJvdXRlU2VsZWN0b3IgbVNlbGVjdG9yOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG1lZGlhIHJvdXRlIGRpc2NvdmVyeSByZXF1ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGVjdG9yIFRoZSByb3V0ZSBzZWxlY3RvciB0aGF0IHNwZWNpZmllcyB0aGUga2luZHMgb2Ygcm91dGVzIHRvIGRpc2NvdmVyLgorICAgICAqIEBwYXJhbSBhY3RpdmVTY2FuIFRydWUgaWYgYWN0aXZlIHNjYW5uaW5nIHNob3VsZCBiZSBwZXJmb3JtZWQuCisgICAgICovCisgICAgcHVibGljIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0KE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvciwgYm9vbGVhbiBhY3RpdmVTY2FuKSB7CisgICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKworICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICBtU2VsZWN0b3IgPSBzZWxlY3RvcjsKKyAgICAgICAgbUJ1bmRsZS5wdXRCdW5kbGUoS0VZX1NFTEVDVE9SLCBzZWxlY3Rvci5hc0J1bmRsZSgpKTsKKyAgICAgICAgbUJ1bmRsZS5wdXRCb29sZWFuKEtFWV9BQ1RJVkVfU0NBTiwgYWN0aXZlU2Nhbik7CisgICAgfQorCisgICAgcHJpdmF0ZSBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdChCdW5kbGUgYnVuZGxlKSB7CisgICAgICAgIG1CdW5kbGUgPSBidW5kbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgcm91dGUgc2VsZWN0b3IgdGhhdCBzcGVjaWZpZXMgdGhlIGtpbmRzIG9mIHJvdXRlcyB0byBkaXNjb3Zlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVkaWFSb3V0ZVNlbGVjdG9yIGdldFNlbGVjdG9yKCkgeworICAgICAgICBlbnN1cmVTZWxlY3RvcigpOworICAgICAgICByZXR1cm4gbVNlbGVjdG9yOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBlbnN1cmVTZWxlY3RvcigpIHsKKyAgICAgICAgaWYgKG1TZWxlY3RvciA9PSBudWxsKSB7CisgICAgICAgICAgICBtU2VsZWN0b3IgPSBNZWRpYVJvdXRlU2VsZWN0b3IuZnJvbUJ1bmRsZShtQnVuZGxlLmdldEJ1bmRsZShLRVlfU0VMRUNUT1IpKTsKKyAgICAgICAgICAgIGlmIChtU2VsZWN0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5FTVBUWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiBhY3RpdmUgc2Nhbm5pbmcgc2hvdWxkIGJlIHBlcmZvcm1lZC4KKyAgICAgKgorICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIjQ0FMTEJBQ0tfRkxBR19QRVJGT1JNX0FDVElWRV9TQ0FOCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNBY3RpdmVTY2FuKCkgeworICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRCb29sZWFuKEtFWV9BQ1RJVkVfU0NBTik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBkaXNjb3ZlcnkgcmVxdWVzdCBoYXMgYWxsIG9mIHRoZSByZXF1aXJlZCBmaWVsZHMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKKyAgICAgICAgZW5zdXJlU2VsZWN0b3IoKTsKKyAgICAgICAgcmV0dXJuIG1TZWxlY3Rvci5pc1ZhbGlkKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmIChvIGluc3RhbmNlb2YgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QpIHsKKyAgICAgICAgICAgIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IG90aGVyID0gKE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0KW87CisgICAgICAgICAgICByZXR1cm4gZ2V0U2VsZWN0b3IoKS5lcXVhbHMob3RoZXIuZ2V0U2VsZWN0b3IoKSkKKyAgICAgICAgICAgICAgICAgICAgJiYgaXNBY3RpdmVTY2FuKCkgPT0gb3RoZXIuaXNBY3RpdmVTY2FuKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIHJldHVybiBnZXRTZWxlY3RvcigpLmhhc2hDb2RlKCkgXiAoaXNBY3RpdmVTY2FuKCkgPyAxIDogMCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICByZXN1bHQuYXBwZW5kKCJEaXNjb3ZlcnlSZXF1ZXN0eyBzZWxlY3Rvcj0iKS5hcHBlbmQoZ2V0U2VsZWN0b3IoKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgYWN0aXZlU2Nhbj0iKS5hcHBlbmQoaXNBY3RpdmVTY2FuKCkpOworICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGlzVmFsaWQ9IikuYXBwZW5kKGlzVmFsaWQoKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiB9Iik7CisgICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0cyB0aGlzIG9iamVjdCB0byBhIGJ1bmRsZSBmb3Igc2VyaWFsaXphdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGNvbnRlbnRzIG9mIHRoZSBvYmplY3QgcmVwcmVzZW50ZWQgYXMgYSBidW5kbGUuCisgICAgICovCisgICAgcHVibGljIEJ1bmRsZSBhc0J1bmRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1CdW5kbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmcm9tIGEgYnVuZGxlLgorICAgICAqCisgICAgICogQHBhcmFtIGJ1bmRsZSBUaGUgYnVuZGxlLCBvciBudWxsIGlmIG5vbmUuCisgICAgICogQHJldHVybiBUaGUgbmV3IGluc3RhbmNlLCBvciBudWxsIGlmIHRoZSBidW5kbGUgd2FzIG51bGwuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCBmcm9tQnVuZGxlKEJ1bmRsZSBidW5kbGUpIHsKKyAgICAgICAgcmV0dXJuIGJ1bmRsZSAhPSBudWxsID8gbmV3IE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0KGJ1bmRsZSkgOiBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlUHJvdmlkZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWEyZTFhCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNDQ3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC51dGlsLk9iamVjdHNDb21wYXQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyLkNvbnRyb2xSZXF1ZXN0Q2FsbGJhY2s7CisKKy8qKgorICogTWVkaWEgcm91dGUgcHJvdmlkZXJzIGFyZSB1c2VkIHRvIHB1Ymxpc2ggYWRkaXRpb25hbCBtZWRpYSByb3V0ZXMgZm9yCisgKiB1c2Ugd2l0aGluIGFuIGFwcGxpY2F0aW9uLiAgTWVkaWEgcm91dGUgcHJvdmlkZXJzIG1heSBhbHNvIGJlIGRlY2xhcmVkCisgKiBhcyBhIHNlcnZpY2UgdG8gcHVibGlzaCBhZGRpdGlvbmFsIG1lZGlhIHJvdXRlcyB0byBhbGwgYXBwbGljYXRpb25zCisgKiBpbiB0aGUgc3lzdGVtLgorICogPHA+CisgKiBUaGUgcHVycG9zZSBvZiBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGlzIHRvIGRpc2NvdmVyIG1lZGlhIHJvdXRlcyB0aGF0IHNhdGlzZnkKKyAqIHRoZSBjcml0ZXJpYSBzcGVjaWZpZWQgYnkgdGhlIGN1cnJlbnQge0BsaW5rIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0fSBhbmQgcHVibGlzaCBhCisgKiB7QGxpbmsgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvcn0gd2l0aCBpbmZvcm1hdGlvbiBhYm91dCBlYWNoIHJvdXRlIGJ5IGNhbGxpbmcKKyAqIHtAbGluayAjc2V0RGVzY3JpcHRvcn0gdG8gbm90aWZ5IHRoZSBjdXJyZW50bHkgcmVnaXN0ZXJlZCB7QGxpbmsgQ2FsbGJhY2t9LgorICogPC9wPjxwPgorICogVGhlIHByb3ZpZGVyIHNob3VsZCB3YXRjaCBmb3IgY2hhbmdlcyB0byB0aGUgZGlzY292ZXJ5IHJlcXVlc3QgYnkgaW1wbGVtZW50aW5nCisgKiB7QGxpbmsgI29uRGlzY292ZXJ5UmVxdWVzdENoYW5nZWR9IGFuZCB1cGRhdGluZyB0aGUgc2V0IG9mIHJvdXRlcyB0aGF0IGl0IGlzCisgKiBhdHRlbXB0aW5nIHRvIGRpc2NvdmVyLiAgSXQgc2hvdWxkIGFsc28gaGFuZGxlIHJvdXRlIGNvbnRyb2wgcmVxdWVzdHMgc3VjaAorICogYXMgdm9sdW1lIGNoYW5nZXMgb3Ige0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGludGVudHN9CisgKiBieSBpbXBsZW1lbnRpbmcge0BsaW5rICNvbkNyZWF0ZVJvdXRlQ29udHJvbGxlcn0gdG8gcmV0dXJuIGEge0BsaW5rIFJvdXRlQ29udHJvbGxlcn0KKyAqIGZvciBhIHBhcnRpY3VsYXIgcm91dGUuCisgKiA8L3A+PHA+CisgKiBBIG1lZGlhIHJvdXRlIHByb3ZpZGVyIG1heSBiZSB1c2VkIHByaXZhdGVseSB3aXRoaW4gdGhlIHNjb3BlIG9mIGEgc2luZ2xlCisgKiBhcHBsaWNhdGlvbiBwcm9jZXNzIGJ5IGNhbGxpbmcge0BsaW5rIE1lZGlhUm91dGVyI2FkZFByb3ZpZGVyIE1lZGlhUm91dGVyLmFkZFByb3ZpZGVyfQorICogdG8gYWRkIGl0IHRvIHRoZSBsb2NhbCB7QGxpbmsgTWVkaWFSb3V0ZXJ9LiAgQSBtZWRpYSByb3V0ZSBwcm92aWRlciBtYXkgYWxzbyBiZSBtYWRlCisgKiBhdmFpbGFibGUgZ2xvYmFsbHkgdG8gYWxsIGFwcGxpY2F0aW9ucyBieSByZWdpc3RlcmluZyBhIHtAbGluayBNZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlfQorICogaW4gdGhlIHByb3ZpZGVyJ3MgbWFuaWZlc3QuICBXaGVuIHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBpcyByZWdpc3RlcmVkCisgKiBhcyBhIHNlcnZpY2UsIGFsbCBhcHBsaWNhdGlvbnMgdGhhdCB1c2UgdGhlIG1lZGlhIHJvdXRlciBBUEkgd2lsbCBiZSBhYmxlIHRvCisgKiBkaXNjb3ZlciBhbmQgdXNlZCB0aGUgcHJvdmlkZXIncyByb3V0ZXMgd2l0aG91dCBoYXZpbmcgdG8gaW5zdGFsbCBhbnl0aGluZyBlbHNlLgorICogPC9wPjxwPgorICogVGhpcyBvYmplY3QgbXVzdCBvbmx5IGJlIGFjY2Vzc2VkIG9uIHRoZSBtYWluIHRocmVhZC4KKyAqIDwvcD4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIE1lZGlhUm91dGVQcm92aWRlciB7CisgICAgc3RhdGljIGZpbmFsIGludCBNU0dfREVMSVZFUl9ERVNDUklQVE9SX0NIQU5HRUQgPSAxOworICAgIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0RFTElWRVJfRElTQ09WRVJZX1JFUVVFU1RfQ0hBTkdFRCA9IDI7CisKKyAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlck1ldGFkYXRhIG1NZXRhZGF0YTsKKyAgICBwcml2YXRlIGZpbmFsIFByb3ZpZGVySGFuZGxlciBtSGFuZGxlciA9IG5ldyBQcm92aWRlckhhbmRsZXIoKTsKKworICAgIHByaXZhdGUgQ2FsbGJhY2sgbUNhbGxiYWNrOworCisgICAgcHJpdmF0ZSBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCBtRGlzY292ZXJ5UmVxdWVzdDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVBlbmRpbmdEaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlOworCisgICAgcHJpdmF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIG1EZXNjcmlwdG9yOworICAgIHByaXZhdGUgYm9vbGVhbiBtUGVuZGluZ0Rlc2NyaXB0b3JDaGFuZ2U7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVkaWFSb3V0ZVByb3ZpZGVyKEBOb25OdWxsIENvbnRleHQgY29udGV4dCkgeworICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOworICAgIH0KKworICAgIE1lZGlhUm91dGVQcm92aWRlcihDb250ZXh0IGNvbnRleHQsIFByb3ZpZGVyTWV0YWRhdGEgbWV0YWRhdGEpIHsKKyAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udGV4dCBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIGlmIChtZXRhZGF0YSA9PSBudWxsKSB7CisgICAgICAgICAgICBtTWV0YWRhdGEgPSBuZXcgUHJvdmlkZXJNZXRhZGF0YShuZXcgQ29tcG9uZW50TmFtZShjb250ZXh0LCBnZXRDbGFzcygpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtTWV0YWRhdGEgPSBtZXRhZGF0YTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGNvbnRleHQgb2YgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBDb250ZXh0IGdldENvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBtQ29udGV4dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBwcm92aWRlcidzIGhhbmRsZXIgd2hpY2ggaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBtYWluIHRocmVhZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgSGFuZGxlciBnZXRIYW5kbGVyKCkgeworICAgICAgICByZXR1cm4gbUhhbmRsZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBzb21lIG1ldGFkYXRhIGFib3V0IHRoZSBwcm92aWRlcidzIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBQcm92aWRlck1ldGFkYXRhIGdldE1ldGFkYXRhKCkgeworICAgICAgICByZXR1cm4gbU1ldGFkYXRhOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcHJvdmlkZXIncyBkZXNjcmlwdG9yIGNoYW5nZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHVzZSwgb3IgbnVsbCBpZiBub25lLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldENhbGxiYWNrKEBOdWxsYWJsZSBDYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICBNZWRpYVJvdXRlci5jaGVja0NhbGxpbmdUaHJlYWQoKTsKKyAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgY3VycmVudCBkaXNjb3ZlcnkgcmVxdWVzdCB3aGljaCBpbmZvcm1zIHRoZSBwcm92aWRlciBhYm91dCB0aGUKKyAgICAgKiBraW5kcyBvZiByb3V0ZXMgdG8gZGlzY292ZXIgYW5kIHdoZXRoZXIgdG8gcGVyZm9ybSBhY3RpdmUgc2Nhbm5pbmcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IGRpc2NvdmVyeSByZXF1ZXN0LCBvciBudWxsIGlmIG5vIGRpc2NvdmVyeSBpcyBuZWVkZWQgYXQgdGhpcyB0aW1lLgorICAgICAqCisgICAgICogQHNlZSAjb25EaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZAorICAgICAqLworICAgIEBOdWxsYWJsZQorICAgIHB1YmxpYyBmaW5hbCBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCBnZXREaXNjb3ZlcnlSZXF1ZXN0KCkgeworICAgICAgICByZXR1cm4gbURpc2NvdmVyeVJlcXVlc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhIGRpc2NvdmVyeSByZXF1ZXN0IHRvIGluZm9ybSB0aGUgcHJvdmlkZXIgYWJvdXQgdGhlIGtpbmRzIG9mCisgICAgICogcm91dGVzIHRoYXQgaXRzIGNsaWVudHMgd291bGQgbGlrZSB0byBkaXNjb3ZlciBhbmQgd2hldGhlciB0byBwZXJmb3JtIGFjdGl2ZSBzY2FubmluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBkaXNjb3ZlcnkgcmVxdWVzdCwgb3IgbnVsbCBpZiBubyBkaXNjb3ZlcnkgaXMgbmVlZGVkIGF0IHRoaXMgdGltZS4KKyAgICAgKgorICAgICAqIEBzZWUgI29uRGlzY292ZXJ5UmVxdWVzdENoYW5nZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXREaXNjb3ZlcnlSZXF1ZXN0KE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgTWVkaWFSb3V0ZXIuY2hlY2tDYWxsaW5nVGhyZWFkKCk7CisKKyAgICAgICAgaWYgKE9iamVjdHNDb21wYXQuZXF1YWxzKG1EaXNjb3ZlcnlSZXF1ZXN0LCByZXF1ZXN0KSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbURpc2NvdmVyeVJlcXVlc3QgPSByZXF1ZXN0OworICAgICAgICBpZiAoIW1QZW5kaW5nRGlzY292ZXJ5UmVxdWVzdENoYW5nZSkgeworICAgICAgICAgICAgbVBlbmRpbmdEaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlID0gdHJ1ZTsKKyAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX0RFTElWRVJfRElTQ09WRVJZX1JFUVVFU1RfQ0hBTkdFRCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGRlbGl2ZXJEaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZCgpIHsKKyAgICAgICAgbVBlbmRpbmdEaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlID0gZmFsc2U7CisgICAgICAgIG9uRGlzY292ZXJ5UmVxdWVzdENoYW5nZWQobURpc2NvdmVyeVJlcXVlc3QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSB0aGUgbWVkaWEgcm91dGVyIHdoZW4gdGhlIHtAbGluayBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCBkaXNjb3ZlcnkgcmVxdWVzdH0KKyAgICAgKiBoYXMgY2hhbmdlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBXaGVuZXZlciBhbiBhcHBsaWNhdGlvbnMgY2FsbHMge0BsaW5rIE1lZGlhUm91dGVyI2FkZENhbGxiYWNrfSB0byByZWdpc3RlcgorICAgICAqIGEgY2FsbGJhY2ssIGl0IGFsc28gcHJvdmlkZXMgYSBzZWxlY3RvciB0byBzcGVjaWZ5IHRoZSBraW5kcyBvZiByb3V0ZXMgdGhhdAorICAgICAqIGl0IGlzIGludGVyZXN0ZWQgaW4uICBUaGUgbWVkaWEgcm91dGVyIGNvbWJpbmVzIGFsbCBvZiB0aGVzZSBzZWxlY3RvcnMgdG9nZXRoZXIKKyAgICAgKiB0byBnZW5lcmF0ZSBhIHtAbGluayBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdH0gYW5kIG5vdGlmaWVzIGVhY2ggcHJvdmlkZXIgd2hlbiBhIGNoYW5nZQorICAgICAqIG9jY3VycyBieSBjYWxsaW5nIHtAbGluayAjc2V0RGlzY292ZXJ5UmVxdWVzdH0gd2hpY2ggcG9zdHMgYSBtZXNzYWdlIHRvIGludm9rZQorICAgICAqIHRoaXMgbWV0aG9kIGFzeW5jaHJvbm91c2x5LgorICAgICAqIDwvcD48cD4KKyAgICAgKiBUaGUgcHJvdmlkZXIgc2hvdWxkIGV4YW1pbmUgdGhlIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBjYXRlZ29yaWVzfQorICAgICAqIGluIHRoZSBkaXNjb3ZlcnkgcmVxdWVzdCdzIHtAbGluayBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3J9IHRvIGRldGVybWluZSB3aGF0CisgICAgICoga2luZHMgb2Ygcm91dGVzIGl0IHNob3VsZCB0cnkgdG8gZGlzY292ZXIgYW5kIHdoZXRoZXIgaXQgc2hvdWxkIHBlcmZvcm0gYWN0aXZlCisgICAgICogb3IgcGFzc2l2ZSBzY2Fucy4gIEluIG1hbnkgY2FzZXMsIHRoZSBwcm92aWRlciBtYXkgYmUgYWJsZSB0byBzYXZlIHBvd2VyIGJ5CisgICAgICogZGV0ZXJtaW5pbmcgdGhhdCB0aGUgc2VsZWN0b3IgZG9lcyBub3QgY29udGFpbiBhbnkgY2F0ZWdvcmllcyB0aGF0IGl0IHN1cHBvcnRzCisgICAgICogYW5kIGl0IGNhbiB0aGVyZWZvcmUgYXZvaWQgcGVyZm9ybWluZyBhbnkgc2NhbnMgYXQgYWxsLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBuZXcgZGlzY292ZXJ5IHJlcXVlc3QsIG9yIG51bGwgaWYgbm8gZGlzY292ZXJ5IGlzIG5lZWRlZCBhdCB0aGlzIHRpbWUuCisgICAgICoKKyAgICAgKiBAc2VlIE1lZGlhUm91dGVyI2FkZENhbGxiYWNrCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25EaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZChATnVsbGFibGUgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgcmVxdWVzdCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHByb3ZpZGVyJ3MgZGVzY3JpcHRvci4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZGVzY3JpcHRvciBkZXNjcmliZXMgdGhlIHN0YXRlIG9mIHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBhbmQKKyAgICAgKiB0aGUgcm91dGVzIHRoYXQgaXQgcHVibGlzaGVzLiAgV2F0Y2ggZm9yIGNoYW5nZXMgdG8gdGhlIGRlc2NyaXB0b3IKKyAgICAgKiBieSByZWdpc3RlcmluZyBhIHtAbGluayBDYWxsYmFjayBjYWxsYmFja30gd2l0aCB7QGxpbmsgI3NldENhbGxiYWNrfS4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBkZXNjcmlwdG9yLCBvciBudWxsIGlmIG5vbmUuCisgICAgICoKKyAgICAgKiBAc2VlIENhbGxiYWNrI29uRGVzY3JpcHRvckNoYW5nZWQKKyAgICAgKi8KKyAgICBATnVsbGFibGUKKyAgICBwdWJsaWMgZmluYWwgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBnZXREZXNjcmlwdG9yKCkgeworICAgICAgICByZXR1cm4gbURlc2NyaXB0b3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgcHJvdmlkZXIncyBkZXNjcmlwdG9yLgorICAgICAqIDxwPgorICAgICAqIFRoZSBwcm92aWRlciBtdXN0IGNhbGwgdGhpcyBtZXRob2QgdG8gbm90aWZ5IHRoZSBjdXJyZW50bHkgcmVnaXN0ZXJlZAorICAgICAqIHtAbGluayBDYWxsYmFjayBjYWxsYmFja30gYWJvdXQgdGhlIGNoYW5nZSB0byB0aGUgcHJvdmlkZXIncyBkZXNjcmlwdG9yLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXNjcmlwdG9yIFRoZSB1cGRhdGVkIHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3IsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKgorICAgICAqIEBzZWUgQ2FsbGJhY2sjb25EZXNjcmlwdG9yQ2hhbmdlZAorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldERlc2NyaXB0b3IoQE51bGxhYmxlIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgeworICAgICAgICBNZWRpYVJvdXRlci5jaGVja0NhbGxpbmdUaHJlYWQoKTsKKworICAgICAgICBpZiAobURlc2NyaXB0b3IgIT0gZGVzY3JpcHRvcikgeworICAgICAgICAgICAgbURlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOworICAgICAgICAgICAgaWYgKCFtUGVuZGluZ0Rlc2NyaXB0b3JDaGFuZ2UpIHsKKyAgICAgICAgICAgICAgICBtUGVuZGluZ0Rlc2NyaXB0b3JDaGFuZ2UgPSB0cnVlOworICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX0RFTElWRVJfREVTQ1JJUFRPUl9DSEFOR0VEKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgZGVsaXZlckRlc2NyaXB0b3JDaGFuZ2VkKCkgeworICAgICAgICBtUGVuZGluZ0Rlc2NyaXB0b3JDaGFuZ2UgPSBmYWxzZTsKKworICAgICAgICBpZiAobUNhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1DYWxsYmFjay5vbkRlc2NyaXB0b3JDaGFuZ2VkKHRoaXMsIG1EZXNjcmlwdG9yKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSB0aGUgbWVkaWEgcm91dGVyIHRvIG9idGFpbiBhIHJvdXRlIGNvbnRyb2xsZXIgZm9yIGEgcGFydGljdWxhciByb3V0ZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbWVkaWEgcm91dGVyIHdpbGwgaW52b2tlIHRoZSB7QGxpbmsgUm91dGVDb250cm9sbGVyI29uUmVsZWFzZX0gbWV0aG9kIG9mIHRoZSByb3V0ZQorICAgICAqIGNvbnRyb2xsZXIgd2hlbiBpdCBpcyBubyBsb25nZXIgbmVlZGVkIHRvIGFsbG93IGl0IHRvIGZyZWUgaXRzIHJlc291cmNlcy4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcm91dGVJZCBUaGUgdW5pcXVlIGlkIG9mIHRoZSByb3V0ZS4KKyAgICAgKiBAcmV0dXJuIFRoZSByb3V0ZSBjb250cm9sbGVyLiAgUmV0dXJucyBudWxsIGlmIHRoZXJlIGlzIG5vIHN1Y2ggcm91dGUgb3IgaWYgdGhlIHJvdXRlCisgICAgICogY2Fubm90IGJlIGNvbnRyb2xsZWQgdXNpbmcgdGhlIHJvdXRlIGNvbnRyb2xsZXIgaW50ZXJmYWNlLgorICAgICAqLworICAgIEBOdWxsYWJsZQorICAgIHB1YmxpYyBSb3V0ZUNvbnRyb2xsZXIgb25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoQE5vbk51bGwgU3RyaW5nIHJvdXRlSWQpIHsKKyAgICAgICAgaWYgKHJvdXRlSWQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicm91dGVJZCBjYW5ub3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSB0aGUgbWVkaWEgcm91dGVyIHRvIG9idGFpbiBhIHJvdXRlIGNvbnRyb2xsZXIgZm9yIGEgcGFydGljdWxhciByb3V0ZSB3aGljaCBpcyBhCisgICAgICogbWVtYmVyIG9mIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUdyb3VwfS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbWVkaWEgcm91dGVyIHdpbGwgaW52b2tlIHRoZSB7QGxpbmsgUm91dGVDb250cm9sbGVyI29uUmVsZWFzZX0gbWV0aG9kIG9mIHRoZSByb3V0ZQorICAgICAqIGNvbnRyb2xsZXIgd2hlbiBpdCBpcyBubyBsb25nZXIgbmVlZGVkIHRvIGFsbG93IGl0IHRvIGZyZWUgaXRzIHJlc291cmNlcy4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcm91dGVJZCBUaGUgdW5pcXVlIGlkIG9mIHRoZSBtZW1iZXIgcm91dGUuCisgICAgICogQHBhcmFtIHJvdXRlR3JvdXBJZCBUaGUgdW5pcXVlIGlkIG9mIHRoZSByb3V0ZSBncm91cC4KKyAgICAgKiBAcmV0dXJuIFRoZSByb3V0ZSBjb250cm9sbGVyLiAgUmV0dXJucyBudWxsIGlmIHRoZXJlIGlzIG5vIHN1Y2ggcm91dGUgb3IgaWYgdGhlIHJvdXRlCisgICAgICogY2Fubm90IGJlIGNvbnRyb2xsZWQgdXNpbmcgdGhlIHJvdXRlIGNvbnRyb2xsZXIgaW50ZXJmYWNlLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKKyAgICBATnVsbGFibGUKKyAgICBwdWJsaWMgUm91dGVDb250cm9sbGVyIG9uQ3JlYXRlUm91dGVDb250cm9sbGVyKEBOb25OdWxsIFN0cmluZyByb3V0ZUlkLAorICAgICAgICAgICAgQE5vbk51bGwgU3RyaW5nIHJvdXRlR3JvdXBJZCkgeworICAgICAgICBpZiAocm91dGVJZCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZUlkIGNhbm5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJvdXRlR3JvdXBJZCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZUdyb3VwSWQgY2Fubm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIocm91dGVJZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVzY3JpYmVzIHByb3BlcnRpZXMgb2YgdGhlIHJvdXRlIHByb3ZpZGVyJ3MgaW1wbGVtZW50YXRpb24uCisgICAgICogPHA+CisgICAgICogVGhpcyBvYmplY3QgaXMgaW1tdXRhYmxlIG9uY2UgY3JlYXRlZC4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQcm92aWRlck1ldGFkYXRhIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb21wb25lbnROYW1lIG1Db21wb25lbnROYW1lOworCisgICAgICAgIFByb3ZpZGVyTWV0YWRhdGEoQ29tcG9uZW50TmFtZSBjb21wb25lbnROYW1lKSB7CisgICAgICAgICAgICBpZiAoY29tcG9uZW50TmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29tcG9uZW50TmFtZSBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29tcG9uZW50TmFtZSA9IGNvbXBvbmVudE5hbWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB0aGUgcHJvdmlkZXIncyBwYWNrYWdlIG5hbWUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Db21wb25lbnROYW1lLmdldFBhY2thZ2VOYW1lKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB0aGUgcHJvdmlkZXIncyBjb21wb25lbnQgbmFtZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBDb21wb25lbnROYW1lIGdldENvbXBvbmVudE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbUNvbXBvbmVudE5hbWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXJNZXRhZGF0YXsgY29tcG9uZW50TmFtZT0iCisgICAgICAgICAgICAgICAgICAgICsgbUNvbXBvbmVudE5hbWUuZmxhdHRlblRvU2hvcnRTdHJpbmcoKSArICIgfSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlcyBjb250cm9sIG92ZXIgYSBwYXJ0aWN1bGFyIHJvdXRlLgorICAgICAqIDxwPgorICAgICAqIFRoZSBtZWRpYSByb3V0ZXIgb2J0YWlucyBhIHJvdXRlIGNvbnRyb2xsZXIgZm9yIGEgcm91dGUgd2hlbmV2ZXIgaXQgbmVlZHMKKyAgICAgKiB0byBjb250cm9sIGEgcm91dGUuICBXaGVuIGEgcm91dGUgaXMgc2VsZWN0ZWQsIHRoZSBtZWRpYSByb3V0ZXIgaW52b2tlcworICAgICAqIHRoZSB7QGxpbmsgI29uU2VsZWN0fSBtZXRob2Qgb2YgaXRzIHJvdXRlIGNvbnRyb2xsZXIuICBXaGlsZSBzZWxlY3RlZCwKKyAgICAgKiB0aGUgbWVkaWEgcm91dGVyIG1heSBjYWxsIG90aGVyIG1ldGhvZHMgb2YgdGhlIHJvdXRlIGNvbnRyb2xsZXIgdG8KKyAgICAgKiByZXF1ZXN0IHRoYXQgaXQgcGVyZm9ybSBjZXJ0YWluIGFjdGlvbnMgdG8gdGhlIHJvdXRlLiAgV2hlbiBhIHJvdXRlIGlzCisgICAgICogdW5zZWxlY3RlZCwgdGhlIG1lZGlhIHJvdXRlciBpbnZva2VzIHRoZSB7QGxpbmsgI29uVW5zZWxlY3R9IG1ldGhvZCBvZiBpdHMKKyAgICAgKiByb3V0ZSBjb250cm9sbGVyLiAgV2hlbiB0aGUgbWVkaWEgcm91dGUgbm8gbG9uZ2VyIG5lZWRzIHRoZSByb3V0ZSBjb250cm9sbGVyCisgICAgICogaXQgd2lsbCBpbnZva2UgdGhlIHtAbGluayAjb25SZWxlYXNlfSBtZXRob2QgdG8gYWxsb3cgdGhlIHJvdXRlIGNvbnRyb2xsZXIKKyAgICAgKiB0byBmcmVlIGl0cyByZXNvdXJjZXMuCisgICAgICogPC9wPjxwPgorICAgICAqIFRoZXJlIG1heSBiZSBtdWx0aXBsZSByb3V0ZSBjb250cm9sbGVycyBzaW11bHRhbmVvdXNseSBhY3RpdmUgZm9yIHRoZQorICAgICAqIHNhbWUgcm91dGUuICBFYWNoIHJvdXRlIGNvbnRyb2xsZXIgd2lsbCBiZSByZWxlYXNlZCBzZXBhcmF0ZWx5LgorICAgICAqIDwvcD48cD4KKyAgICAgKiBBbGwgb3BlcmF0aW9ucyBvbiB0aGUgcm91dGUgY29udHJvbGxlciBhcmUgYXN5bmNocm9ub3VzIGFuZAorICAgICAqIHJlc3VsdHMgYXJlIGNvbW11bmljYXRlZCB2aWEgY2FsbGJhY2tzLgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIFJvdXRlQ29udHJvbGxlciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBSZWxlYXNlcyB0aGUgcm91dGUgY29udHJvbGxlciwgYWxsb3dpbmcgaXQgdG8gZnJlZSBpdHMgcmVzb3VyY2VzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25SZWxlYXNlKCkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNlbGVjdHMgdGhlIHJvdXRlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25TZWxlY3QoKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVW5zZWxlY3RzIHRoZSByb3V0ZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uVW5zZWxlY3QoKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVW5zZWxlY3RzIHRoZSByb3V0ZSBhbmQgcHJvdmlkZXMgYSByZWFzb24uIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCisgICAgICAgICAqIGNhbGxzIHtAbGluayAjb25VbnNlbGVjdCgpfS4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoZSByZWFzb24gcHJvdmlkZWQgd2lsbCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAgICAgICAgICogPHVsPgorICAgICAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9VTktOT1dOfTwvbGk+CisgICAgICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX0RJU0NPTk5FQ1RFRH08L2xpPgorICAgICAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9TVE9QUEVEfTwvbGk+CisgICAgICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX1JPVVRFX0NIQU5HRUR9PC9saT4KKyAgICAgICAgICogPC91bD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHJlYXNvbiBUaGUgcmVhc29uIGZvciB1bnNlbGVjdGluZyB0aGUgcm91dGUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvblVuc2VsZWN0KGludCByZWFzb24pIHsKKyAgICAgICAgICAgIG9uVW5zZWxlY3QoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXF1ZXN0cyB0byBzZXQgdGhlIHZvbHVtZSBvZiB0aGUgcm91dGUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB2b2x1bWUgVGhlIG5ldyB2b2x1bWUgdmFsdWUgYmV0d2VlbiAwIGFuZCB7QGxpbmsgTWVkaWFSb3V0ZURlc2NyaXB0b3IjZ2V0Vm9sdW1lTWF4fS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2V0Vm9sdW1lKGludCB2b2x1bWUpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXF1ZXN0cyBhbiBpbmNyZW1lbnRhbCB2b2x1bWUgdXBkYXRlIGZvciB0aGUgcm91dGUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBkZWx0YSBUaGUgZGVsdGEgdG8gYWRkIHRvIHRoZSBjdXJyZW50IHZvbHVtZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uVXBkYXRlVm9sdW1lKGludCBkZWx0YSkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBlcmZvcm1zIGEge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sfSByZXF1ZXN0CisgICAgICAgICAqIGFzeW5jaHJvbm91c2x5IG9uIGJlaGFsZiBvZiB0aGUgcm91dGUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBpbnRlbnQgQSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgaW50ZW50fS4KKyAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIEEge0BsaW5rIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2t9IHRvIGludm9rZSB3aXRoIHRoZSByZXN1bHQKKyAgICAgICAgICogb2YgdGhlIHJlcXVlc3QsIG9yIG51bGwgaWYgbm8gcmVzdWx0IGlzIHJlcXVpcmVkLgorICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGNvbnRyb2xsZXIgaW50ZW5kcyB0byBoYW5kbGUgdGhlIHJlcXVlc3QgYW5kIHdpbGwKKyAgICAgICAgICogaW52b2tlIHRoZSBjYWxsYmFjayB3aGVuIGZpbmlzaGVkLiAgRmFsc2UgaWYgdGhlIGNvbnRyb2xsZXIgd2lsbCBub3QKKyAgICAgICAgICogaGFuZGxlIHRoZSByZXF1ZXN0IGFuZCB3aWxsIG5vdCBpbnZva2UgdGhlIGNhbGxiYWNrLgorICAgICAgICAgKgorICAgICAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25Db250cm9sUmVxdWVzdChJbnRlbnQgaW50ZW50LCBATnVsbGFibGUgQ29udHJvbFJlcXVlc3RDYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGJhY2sgd2hpY2ggaXMgaW52b2tlZCB3aGVuIHJvdXRlIGluZm9ybWF0aW9uIGJlY29tZXMgYXZhaWxhYmxlIG9yIGNoYW5nZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBDYWxsYmFjayB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiBpbmZvcm1hdGlvbiBhYm91dCBhIHJvdXRlIHByb3ZpZGVyIGFuZCBpdHMgcm91dGVzIGNoYW5nZXMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwcm92aWRlciBUaGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgdGhhdCBjaGFuZ2VkLCBuZXZlciBudWxsLgorICAgICAgICAgKiBAcGFyYW0gZGVzY3JpcHRvciBUaGUgbmV3IG1lZGlhIHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3IsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRGVzY3JpcHRvckNoYW5nZWQoQE5vbk51bGwgTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyLAorICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgY2xhc3MgUHJvdmlkZXJIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7CisgICAgICAgIFByb3ZpZGVySGFuZGxlcigpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfREVMSVZFUl9ERVNDUklQVE9SX0NIQU5HRUQ6CisgICAgICAgICAgICAgICAgICAgIGRlbGl2ZXJEZXNjcmlwdG9yQ2hhbmdlZCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19ERUxJVkVSX0RJU0NPVkVSWV9SRVFVRVNUX0NIQU5HRUQ6CisgICAgICAgICAgICAgICAgICAgIGRlbGl2ZXJEaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMWNlMDkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvci5qYXZhCkBAIC0wLDAgKzEsMjA4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIERlc2NyaWJlcyB0aGUgc3RhdGUgb2YgYSBtZWRpYSByb3V0ZSBwcm92aWRlciBhbmQgdGhlIHJvdXRlcyB0aGF0IGl0IHB1Ymxpc2hlcy4KKyAqIDxwPgorICogVGhpcyBvYmplY3QgaXMgaW1tdXRhYmxlIG9uY2UgY3JlYXRlZCB1c2luZyBhIHtAbGluayBCdWlsZGVyfSBpbnN0YW5jZS4KKyAqIDwvcD4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUk9VVEVTID0gInJvdXRlcyI7CisKKyAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOworICAgIHByaXZhdGUgTGlzdDxNZWRpYVJvdXRlRGVzY3JpcHRvcj4gbVJvdXRlczsKKworICAgIHByaXZhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvcihCdW5kbGUgYnVuZGxlLCBMaXN0PE1lZGlhUm91dGVEZXNjcmlwdG9yPiByb3V0ZXMpIHsKKyAgICAgICAgbUJ1bmRsZSA9IGJ1bmRsZTsKKyAgICAgICAgbVJvdXRlcyA9IHJvdXRlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIGFsbCByb3V0ZXMgdGhhdCB0aGlzIHByb3ZpZGVyIGhhcyBwdWJsaXNoZWQuCisgICAgICovCisgICAgcHVibGljIExpc3Q8TWVkaWFSb3V0ZURlc2NyaXB0b3I+IGdldFJvdXRlcygpIHsKKyAgICAgICAgZW5zdXJlUm91dGVzKCk7CisgICAgICAgIHJldHVybiBtUm91dGVzOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBlbnN1cmVSb3V0ZXMoKSB7CisgICAgICAgIGlmIChtUm91dGVzID09IG51bGwpIHsKKyAgICAgICAgICAgIEFycmF5TGlzdDxCdW5kbGU+IHJvdXRlQnVuZGxlcyA9IG1CdW5kbGUuPEJ1bmRsZT5nZXRQYXJjZWxhYmxlQXJyYXlMaXN0KEtFWV9ST1VURVMpOworICAgICAgICAgICAgaWYgKHJvdXRlQnVuZGxlcyA9PSBudWxsIHx8IHJvdXRlQnVuZGxlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBtUm91dGVzID0gQ29sbGVjdGlvbnMuPE1lZGlhUm91dGVEZXNjcmlwdG9yPmVtcHR5TGlzdCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSByb3V0ZUJ1bmRsZXMuc2l6ZSgpOworICAgICAgICAgICAgICAgIG1Sb3V0ZXMgPSBuZXcgQXJyYXlMaXN0PE1lZGlhUm91dGVEZXNjcmlwdG9yPihjb3VudCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXMuYWRkKE1lZGlhUm91dGVEZXNjcmlwdG9yLmZyb21CdW5kbGUocm91dGVCdW5kbGVzLmdldChpKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgcHJvdmlkZXIgZGVzY3JpcHRvciBhbmQgYWxsIG9mIHRoZSByb3V0ZXMgdGhhdAorICAgICAqIGl0IGNvbnRhaW5zIGhhdmUgYWxsIG9mIHRoZSByZXF1aXJlZCBmaWVsZHMuCisgICAgICogPHA+CisgICAgICogVGhpcyB2ZXJpZmljYXRpb24gaXMgZGVlcC4gIElmIHRoZSBwcm92aWRlciBkZXNjcmlwdG9yIGlzIGtub3duIHRvIGJlCisgICAgICogdmFsaWQgdGhlbiBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGNhbGwge0BsaW5rICNpc1ZhbGlkfSBvbiBlYWNoIG9mIGl0cyByb3V0ZXMuCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7CisgICAgICAgIGVuc3VyZVJvdXRlcygpOworICAgICAgICBmaW5hbCBpbnQgcm91dGVDb3VudCA9IG1Sb3V0ZXMuc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvdXRlQ291bnQ7IGkrKykgeworICAgICAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3Igcm91dGUgPSBtUm91dGVzLmdldChpKTsKKyAgICAgICAgICAgIGlmIChyb3V0ZSA9PSBudWxsIHx8ICFyb3V0ZS5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICByZXN1bHQuYXBwZW5kKCJNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yeyAiKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgicm91dGVzPSIpLmFwcGVuZCgKKyAgICAgICAgICAgICAgICBBcnJheXMudG9TdHJpbmcoZ2V0Um91dGVzKCkudG9BcnJheSgpKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgaXNWYWxpZD0iKS5hcHBlbmQoaXNWYWxpZCgpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiIH0iKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIHRoaXMgb2JqZWN0IHRvIGEgYnVuZGxlIGZvciBzZXJpYWxpemF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgY29udGVudHMgb2YgdGhlIG9iamVjdCByZXByZXNlbnRlZCBhcyBhIGJ1bmRsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnVuZGxlIGFzQnVuZGxlKCkgeworICAgICAgICByZXR1cm4gbUJ1bmRsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZyb20gYSBidW5kbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVuZGxlIFRoZSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKiBAcmV0dXJuIFRoZSBuZXcgaW5zdGFuY2UsIG9yIG51bGwgaWYgdGhlIGJ1bmRsZSB3YXMgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZnJvbUJ1bmRsZShCdW5kbGUgYnVuZGxlKSB7CisgICAgICAgIHJldHVybiBidW5kbGUgIT0gbnVsbCA/IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yKGJ1bmRsZSwgbnVsbCkgOiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJ1aWxkZXIgZm9yIHtAbGluayBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3JzfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgeworICAgICAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOworICAgICAgICBwcml2YXRlIEFycmF5TGlzdDxNZWRpYVJvdXRlRGVzY3JpcHRvcj4gbVJvdXRlczsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhbiBlbXB0eSBtZWRpYSByb3V0ZSBwcm92aWRlciBkZXNjcmlwdG9yIGJ1aWxkZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlcigpIHsKKyAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3IgYnVpbGRlciB3aG9zZSBpbml0aWFsIGNvbnRlbnRzIGFyZQorICAgICAgICAgKiBjb3BpZWQgZnJvbSBhbiBleGlzdGluZyBkZXNjcmlwdG9yLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIoTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7CisgICAgICAgICAgICBpZiAoZGVzY3JpcHRvciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZGVzY3JpcHRvciBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKGRlc2NyaXB0b3IubUJ1bmRsZSk7CisKKyAgICAgICAgICAgIGRlc2NyaXB0b3IuZW5zdXJlUm91dGVzKCk7CisgICAgICAgICAgICBpZiAoIWRlc2NyaXB0b3IubVJvdXRlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBtUm91dGVzID0gbmV3IEFycmF5TGlzdDxNZWRpYVJvdXRlRGVzY3JpcHRvcj4oZGVzY3JpcHRvci5tUm91dGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGRzIGEgcm91dGUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRSb3V0ZShNZWRpYVJvdXRlRGVzY3JpcHRvciByb3V0ZSkgeworICAgICAgICAgICAgaWYgKHJvdXRlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZSBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtUm91dGVzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtUm91dGVzID0gbmV3IEFycmF5TGlzdDxNZWRpYVJvdXRlRGVzY3JpcHRvcj4oKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobVJvdXRlcy5jb250YWlucyhyb3V0ZSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZSBkZXNjcmlwdG9yIGFscmVhZHkgYWRkZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Sb3V0ZXMuYWRkKHJvdXRlKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZHMgYSBsaXN0IG9mIHJvdXRlcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZFJvdXRlcyhDb2xsZWN0aW9uPE1lZGlhUm91dGVEZXNjcmlwdG9yPiByb3V0ZXMpIHsKKyAgICAgICAgICAgIGlmIChyb3V0ZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvdXRlcyBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghcm91dGVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGZvciAoTWVkaWFSb3V0ZURlc2NyaXB0b3Igcm91dGUgOiByb3V0ZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkUm91dGUocm91dGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIGxpc3Qgb2Ygcm91dGVzLgorICAgICAgICAgKi8KKyAgICAgICAgQnVpbGRlciBzZXRSb3V0ZXMoQ29sbGVjdGlvbjxNZWRpYVJvdXRlRGVzY3JpcHRvcj4gcm91dGVzKSB7CisgICAgICAgICAgICBpZiAocm91dGVzID09IG51bGwgfHwgcm91dGVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIG1Sb3V0ZXMgPSBudWxsOworICAgICAgICAgICAgICAgIG1CdW5kbGUucmVtb3ZlKEtFWV9ST1VURVMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtUm91dGVzID0gbmV3IEFycmF5TGlzdDw+KHJvdXRlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBCdWlsZHMgdGhlIHtAbGluayBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3J9LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgYnVpbGQoKSB7CisgICAgICAgICAgICBpZiAobVJvdXRlcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVJvdXRlcy5zaXplKCk7CisgICAgICAgICAgICAgICAgQXJyYXlMaXN0PEJ1bmRsZT4gcm91dGVCdW5kbGVzID0gbmV3IEFycmF5TGlzdDxCdW5kbGU+KGNvdW50KTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcm91dGVCdW5kbGVzLmFkZChtUm91dGVzLmdldChpKS5hc0J1bmRsZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUJ1bmRsZS5wdXRQYXJjZWxhYmxlQXJyYXlMaXN0KEtFWV9ST1VURVMsIHJvdXRlQnVuZGxlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IobUJ1bmRsZSwgbVJvdXRlcyk7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlclByb3RvY29sLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmU5MzQzCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlclByb3RvY29sLmphdmEKQEAgLTAsMCArMSwyMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzZW5nZXI7CisKKy8qKgorICogRGVmaW5lcyB0aGUgY29tbXVuaWNhdGlvbiBwcm90b2NvbCBmb3IgbWVkaWEgcm91dGUgcHJvdmlkZXIgc2VydmljZXMuCisgKi8KK2Fic3RyYWN0IGNsYXNzIE1lZGlhUm91dGVQcm92aWRlclByb3RvY29sIHsKKyAgICAvKioKKyAgICAgKiBUaGUge0BsaW5rIEludGVudH0gdGhhdCBtdXN0IGJlIGRlY2xhcmVkIGFzIGhhbmRsZWQgYnkgdGhlIHNlcnZpY2UuCisgICAgICogUHV0IHRoaXMgaW4geW91ciBtYW5pZmVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX0lOVEVSRkFDRSA9CisgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlIjsKKworICAgIC8qCisgICAgICogTWVzc2FnZXMgc2VudCBmcm9tIHRoZSBjbGllbnQgdG8gdGhlIHNlcnZpY2UuCisgICAgICogRE8gTk9UIFJFTlVNQkVSIFRIRVNFIQorICAgICAqLworCisgICAgLyoqIChjbGllbnQgdjEpCisgICAgICogUmVnaXN0ZXIgY2xpZW50LgorICAgICAqIC0gcmVwbHlUbyA6IGNsaWVudCBtZXNzZW5nZXIKKyAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCisgICAgICogLSBhcmcyICAgIDogY2xpZW50IHZlcnNpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfTVNHX1JFR0lTVEVSID0gMTsKKworICAgIC8qKiAoY2xpZW50IHYxKQorICAgICAqIFVucmVnaXN0ZXIgY2xpZW50LgorICAgICAqIC0gcmVwbHlUbyA6IGNsaWVudCBtZXNzZW5nZXIKKyAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX01TR19VTlJFR0lTVEVSID0gMjsKKworICAgIC8qKiAoY2xpZW50IHYxKQorICAgICAqIENyZWF0ZSByb3V0ZSBjb250cm9sbGVyLgorICAgICAqIC0gcmVwbHlUbyA6IGNsaWVudCBtZXNzZW5nZXIKKyAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCisgICAgICogLSBhcmcyICAgIDogcm91dGUgY29udHJvbGxlciBpZAorICAgICAqIC0gQ0xJRU5UX0RBVEFfUk9VVEVfSUQgOiByb3V0ZSBpZCBzdHJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfTVNHX0NSRUFURV9ST1VURV9DT05UUk9MTEVSID0gMzsKKworICAgIC8qKiAoY2xpZW50IHYxKQorICAgICAqIFJlbGVhc2Ugcm91dGUgY29udHJvbGxlci4KKyAgICAgKiAtIHJlcGx5VG8gOiBjbGllbnQgbWVzc2VuZ2VyCisgICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAorICAgICAqIC0gYXJnMiAgICA6IHJvdXRlIGNvbnRyb2xsZXIgaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfTVNHX1JFTEVBU0VfUk9VVEVfQ09OVFJPTExFUiA9IDQ7CisKKyAgICAvKiogKGNsaWVudCB2MSkKKyAgICAgKiBTZWxlY3Qgcm91dGUuCisgICAgICogLSByZXBseVRvIDogY2xpZW50IG1lc3NlbmdlcgorICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKKyAgICAgKiAtIGFyZzIgICAgOiByb3V0ZSBjb250cm9sbGVyIGlkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX01TR19TRUxFQ1RfUk9VVEUgPSA1OworCisgICAgLyoqIChjbGllbnQgdjEpCisgICAgICogVW5zZWxlY3Qgcm91dGUuCisgICAgICogLSByZXBseVRvIDogY2xpZW50IG1lc3NlbmdlcgorICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKKyAgICAgKiAtIGFyZzIgICAgOiByb3V0ZSBjb250cm9sbGVyIGlkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX01TR19VTlNFTEVDVF9ST1VURSA9IDY7CisKKyAgICAvKiogKGNsaWVudCB2MSkKKyAgICAgKiBTZXQgcm91dGUgdm9sdW1lLgorICAgICAqIC0gcmVwbHlUbyA6IGNsaWVudCBtZXNzZW5nZXIKKyAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCisgICAgICogLSBhcmcyICAgIDogcm91dGUgY29udHJvbGxlciBpZAorICAgICAqIC0gQ0xJRU5UX0RBVEFfVk9MVU1FIDogdm9sdW1lIGludGVnZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfTVNHX1NFVF9ST1VURV9WT0xVTUUgPSA3OworCisgICAgLyoqIChjbGllbnQgdjEpCisgICAgICogVXBkYXRlIHJvdXRlIHZvbHVtZS4KKyAgICAgKiAtIHJlcGx5VG8gOiBjbGllbnQgbWVzc2VuZ2VyCisgICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAorICAgICAqIC0gYXJnMiAgICA6IHJvdXRlIGNvbnRyb2xsZXIgaWQKKyAgICAgKiAtIENMSUVOVF9EQVRBX1ZPTFVNRSA6IHZvbHVtZSBkZWx0YSBpbnRlZ2VyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX01TR19VUERBVEVfUk9VVEVfVk9MVU1FID0gODsKKworICAgIC8qKiAoY2xpZW50IHYxKQorICAgICAqIFJvdXRlIGNvbnRyb2wgcmVxdWVzdC4KKyAgICAgKiAtIHJlcGx5VG8gOiBjbGllbnQgbWVzc2VuZ2VyCisgICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAorICAgICAqIC0gYXJnMiAgICA6IHJvdXRlIGNvbnRyb2xsZXIgaWQKKyAgICAgKiAtIG9iaiAgICAgOiBtZWRpYSBjb250cm9sIGludGVudAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfUk9VVEVfQ09OVFJPTF9SRVFVRVNUID0gOTsKKworICAgIC8qKiAoY2xpZW50IHYxKQorICAgICAqIFNldHMgdGhlIGRpc2NvdmVyeSByZXF1ZXN0LgorICAgICAqIC0gcmVwbHlUbyA6IGNsaWVudCBtZXNzZW5nZXIKKyAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCisgICAgICogLSBvYmogICAgIDogZGlzY292ZXJ5IHJlcXVlc3QgYnVuZGxlLCBvciBudWxsIGlmIG5vbmUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfTVNHX1NFVF9ESVNDT1ZFUllfUkVRVUVTVCA9IDEwOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJRU5UX0RBVEFfUk9VVEVfSUQgPSAicm91dGVJZCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJRU5UX0RBVEFfUk9VVEVfTElCUkFSWV9HUk9VUCA9ICJyb3V0ZUdyb3VwSWQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMSUVOVF9EQVRBX1ZPTFVNRSA9ICJ2b2x1bWUiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMSUVOVF9EQVRBX1VOU0VMRUNUX1JFQVNPTiA9ICJ1bnNlbGVjdFJlYXNvbiI7CisKKyAgICAvKgorICAgICAqIE1lc3NhZ2VzIHNlbnQgZnJvbSB0aGUgc2VydmljZSB0byB0aGUgY2xpZW50LgorICAgICAqIERPIE5PVCBSRU5VTUJFUiBUSEVTRSEKKyAgICAgKi8KKworICAgIC8qKiAoc2VydmljZSB2MSkKKyAgICAgKiBHZW5lcmljIGZhaWx1cmUgc2VudCBpbiByZXNwb25zZSB0byBhbnkgdW5yZWNvZ25pemVkIG9yIG1hbGZvcm1lZCByZXF1ZXN0LgorICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX01TR19HRU5FUklDX0ZBSUxVUkUgPSAwOworCisgICAgLyoqIChzZXJ2aWNlIHYxKQorICAgICAqIEdlbmVyaWMgZmFpbHVyZSBzZW50IGluIHJlc3BvbnNlIHRvIGEgc3VjY2Vzc2Z1bCBtZXNzYWdlLgorICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX01TR19HRU5FUklDX1NVQ0NFU1MgPSAxOworCisgICAgLyoqIChzZXJ2aWNlIHYxKQorICAgICAqIFJlZ2lzdHJhdGlvbiBzdWNjZWVkZWQuCisgICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAorICAgICAqIC0gYXJnMiAgICA6IHNlcnZlciB2ZXJzaW9uCisgICAgICogLSBvYmogICAgIDogcm91dGUgcHJvdmlkZXIgZGVzY3JpcHRvciBidW5kbGUsIG9yIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX01TR19SRUdJU1RFUkVEID0gMjsKKworICAgIC8qKiAoc2VydmljZSB2MSkKKyAgICAgKiBSb3V0ZSBjb250cm9sIHJlcXVlc3Qgc3VjY2VzcyByZXN1bHQuCisgICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAorICAgICAqIC0gb2JqICAgICA6IHJlc3VsdCBkYXRhIGJ1bmRsZSwgb3IgbnVsbAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9TVUNDRUVERUQgPSAzOworCisgICAgLyoqIChzZXJ2aWNlIHYxKQorICAgICAqIFJvdXRlIGNvbnRyb2wgcmVxdWVzdCBmYWlsdXJlIHJlc3VsdC4KKyAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCisgICAgICogLSBvYmogICAgIDogcmVzdWx0IGRhdGEgYnVuZGxlLCBvciBudWxsCisgICAgICogLSBTRVJWSUNFX0RBVEFfRVJST1I6IGVycm9yIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX01TR19DT05UUk9MX1JFUVVFU1RfRkFJTEVEID0gNDsKKworICAgIC8qKiAoc2VydmljZSB2MSkKKyAgICAgKiBSb3V0ZSBwcm92aWRlciBkZXNjcmlwdG9yIGNoYW5nZWQuICAodW5zb2xpY2l0ZWQgZXZlbnQpCisgICAgICogLSBhcmcxICAgIDogcmVzZXJ2ZWQgKDApCisgICAgICogLSBvYmogICAgIDogcm91dGUgcHJvdmlkZXIgZGVzY3JpcHRvciBidW5kbGUsIG9yIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX01TR19ERVNDUklQVE9SX0NIQU5HRUQgPSA1OworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9EQVRBX0VSUk9SID0gImVycm9yIjsKKworICAgIC8qCisgICAgICogUmVjb2duaXplZCBjbGllbnQgdmVyc2lvbiBudW1iZXJzLiAgKFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLikKKyAgICAgKiBETyBOT1QgUkVOVU1CRVIgVEhFU0UhCisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgY2xpZW50IHZlcnNpb24gdXNlZCBmcm9tIHRoZSBiZWdpbm5pbmcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX1ZFUlNJT05fMSA9IDE7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY2xpZW50IHZlcnNpb24gdXNlZCBmcm9tIHN1cHBvcnQgbGlicmFyeSB2MjQuMS4wLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9WRVJTSU9OXzIgPSAyOworCisgICAgLyoqCisgICAgICogVGhlIGN1cnJlbnQgY2xpZW50IHZlcnNpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX1ZFUlNJT05fQ1VSUkVOVCA9IENMSUVOVF9WRVJTSU9OXzI7CisKKyAgICAvKgorICAgICAqIFJlY29nbml6ZWQgc2VydmVyIHZlcnNpb24gbnVtYmVycy4gIChSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4pCisgICAgICogRE8gTk9UIFJFTlVNQkVSIFRIRVNFIQorICAgICAqLworCisgICAgLyoqCisgICAgICogVGhlIHNlcnZpY2UgdmVyc2lvbiB1c2VkIGZyb20gdGhlIGJlZ2lubmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX1ZFUlNJT05fMSA9IDE7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY3VycmVudCBzZXJ2aWNlIHZlcnNpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9WRVJTSU9OX0NVUlJFTlQgPSBTRVJWSUNFX1ZFUlNJT05fMTsKKworICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX1ZFUlNJT05fU1RBUlQgPSBDTElFTlRfVkVSU0lPTl8xOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBtZXNzZW5nZXIgb2JqZWN0IGlzIHZhbGlkLgorICAgICAqIDxwPgorICAgICAqIFRoZSBtZXNzZW5nZXIgY29uc3RydWN0b3IgYW5kIHVucGFyY2VsaW5nIGNvZGUgZG9lcyBub3QgY2hlY2sgd2hldGhlciB0aGUKKyAgICAgKiBwcm92aWRlZCBJQmluZGVyIGlzIGEgdmFsaWQgSU1lc3NlbmdlciBvYmplY3QuICBBcyBhIHJlc3VsdCwgaXQncyBwb3NzaWJsZQorICAgICAqIGZvciBhIHBlZXIgdG8gc2VuZCBhbiBpbnZhbGlkIElCaW5kZXIgdGhhdCB3aWxsIHJlc3VsdCBpbiBjcmFzaGVzIGRvd25zdHJlYW0uCisgICAgICogVGhpcyBtZXRob2QgY2hlY2tzIHRoYXQgdGhlIG1lc3NlbmdlciBpcyBpbiBhIHZhbGlkIHN0YXRlLgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFJlbW90ZU1lc3NlbmdlcihNZXNzZW5nZXIgbWVzc2VuZ2VyKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbWVzc2VuZ2VyICE9IG51bGwgJiYgbWVzc2VuZ2VyLmdldEJpbmRlcigpICE9IG51bGw7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgbWVzc2VuZ2VyIHdhcyBjb25zdHJ1Y3RlZCB3aXRoIGEgYmluZGVyIGludGVyZmFjZSBvdGhlciB0aGFuCisgICAgICAgICAgICAvLyBJTWVzc2VuZ2VyIHRoZW4gdGhlIGNhbGwgdG8gZ2V0QmluZGVyKCkgd2lsbCBjcmFzaCB3aXRoIGFuIE5QRS4KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzY2RlMTAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsNzU5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7CisKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfREFUQV9ST1VURV9JRDsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAorICAgICAgICAuQ0xJRU5UX0RBVEFfUk9VVEVfTElCUkFSWV9HUk9VUDsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAorICAgICAgICAuQ0xJRU5UX0RBVEFfVU5TRUxFQ1RfUkVBU09OOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9EQVRBX1ZPTFVNRTsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAorICAgICAgICAuQ0xJRU5UX01TR19DUkVBVEVfUk9VVEVfQ09OVFJPTExFUjsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfTVNHX1JFR0lTVEVSOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCisgICAgICAgIC5DTElFTlRfTVNHX1JFTEVBU0VfUk9VVEVfQ09OVFJPTExFUjsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAorICAgICAgICAuQ0xJRU5UX01TR19ST1VURV9DT05UUk9MX1JFUVVFU1Q7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX01TR19TRUxFQ1RfUk9VVEU7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKKyAgICAgICAgLkNMSUVOVF9NU0dfU0VUX0RJU0NPVkVSWV9SRVFVRVNUOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCisgICAgICAgIC5DTElFTlRfTVNHX1NFVF9ST1VURV9WT0xVTUU7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX01TR19VTlJFR0lTVEVSOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCisgICAgICAgIC5DTElFTlRfTVNHX1VOU0VMRUNUX1JPVVRFOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCisgICAgICAgIC5DTElFTlRfTVNHX1VQREFURV9ST1VURV9WT0xVTUU7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX1ZFUlNJT05fMTsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5TRVJWSUNFX0RBVEFfRVJST1I7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKKyAgICAgICAgLlNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9GQUlMRUQ7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKKyAgICAgICAgLlNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9TVUNDRUVERUQ7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKKyAgICAgICAgLlNFUlZJQ0VfTVNHX0RFU0NSSVBUT1JfQ0hBTkdFRDsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAorICAgICAgICAuU0VSVklDRV9NU0dfR0VORVJJQ19GQUlMVVJFOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCisgICAgICAgIC5TRVJWSUNFX01TR19HRU5FUklDX1NVQ0NFU1M7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuU0VSVklDRV9NU0dfUkVHSVNURVJFRDsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5TRVJWSUNFX1ZFUlNJT05fQ1VSUkVOVDsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5pc1ZhbGlkUmVtb3RlTWVzc2VuZ2VyOworCitpbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuRGVhZE9iamVjdEV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlci5EZWF0aFJlY2lwaWVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzZW5nZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uVmlzaWJsZUZvclRlc3Rpbmc7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LnV0aWwuT2JqZWN0c0NvbXBhdDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKKworaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHNlcnZpY2VzLgorICogPHA+CisgKiBBIG1lZGlhIHJvdXRlciB3aWxsIGJpbmQgdG8gbWVkaWEgcm91dGUgcHJvdmlkZXIgc2VydmljZXMgd2hlbiBhIGNhbGxiYWNrIGlzIGFkZGVkIHZpYQorICoge0BsaW5rIE1lZGlhUm91dGVyI2FkZENhbGxiYWNrKE1lZGlhUm91dGVTZWxlY3RvciwgTWVkaWFSb3V0ZXIuQ2FsbGJhY2ssIGludCl9IHdpdGggYSBkaXNjb3ZlcnkKKyAqIGZsYWc6IHtAbGluayBNZWRpYVJvdXRlciNDQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZfSwKKyAqIHtAbGluayBNZWRpYVJvdXRlciNDQUxMQkFDS19GTEFHX0ZPUkNFX0RJU0NPVkVSWX0sIG9yCisgKiB7QGxpbmsgTWVkaWFSb3V0ZXIjQ0FMTEJBQ0tfRkxBR19QRVJGT1JNX0FDVElWRV9TQ0FOfSwgYW5kIHdpbGwgdW5iaW5kIHdoZW4gdGhlIGNhbGxiYWNrCisgKiBpcyByZW1vdmVkIHZpYSB7QGxpbmsgTWVkaWFSb3V0ZXIjcmVtb3ZlQ2FsbGJhY2soTWVkaWFSb3V0ZXIuQ2FsbGJhY2spfS4KKyAqIDwvcD48cD4KKyAqIFRvIGltcGxlbWVudCB5b3VyIG93biBtZWRpYSByb3V0ZSBwcm92aWRlciBzZXJ2aWNlLCBleHRlbmQgdGhpcyBjbGFzcyBhbmQKKyAqIG92ZXJyaWRlIHRoZSB7QGxpbmsgI29uQ3JlYXRlTWVkaWFSb3V0ZVByb3ZpZGVyfSBtZXRob2QgdG8gcmV0dXJuIGFuCisgKiBpbnN0YW5jZSBvZiB5b3VyIHtAbGluayBNZWRpYVJvdXRlUHJvdmlkZXJ9LgorICogPC9wPjxwPgorICogRGVjbGFyZSB5b3VyIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHNlcnZpY2UgaW4geW91ciBhcHBsaWNhdGlvbiBtYW5pZmVzdAorICogbGlrZSB0aGlzOgorICogPC9wPgorICogPHByZT4KKyAqICAgJmx0O3NlcnZpY2UgYW5kcm9pZDpuYW1lPSIuTXlNZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlIgorICogICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvbXlfbWVkaWFfcm91dGVfcHJvdmlkZXJfc2VydmljZSI+CisgKiAgICAgICAmbHQ7aW50ZW50LWZpbHRlcj4KKyAqICAgICAgICAgICAmbHQ7YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlIiAvPgorICogICAgICAgJmx0Oy9pbnRlbnQtZmlsdGVyPgorICogICAmbHQ7L3NlcnZpY2U+CisgKiA8L3ByZT4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIE1lZGlhUm91dGVQcm92aWRlclNlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlIHsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVJvdXRlUHJvdmlkZXJTcnYiOyAvLyBtYXguIDIzIGNoYXJzCisgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRyk7CisKKyAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxDbGllbnRSZWNvcmQ+IG1DbGllbnRzID0gbmV3IEFycmF5TGlzdDxDbGllbnRSZWNvcmQ+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBSZWNlaXZlSGFuZGxlciBtUmVjZWl2ZUhhbmRsZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBNZXNzZW5nZXIgbVJlY2VpdmVNZXNzZW5nZXI7CisgICAgZmluYWwgUHJpdmF0ZUhhbmRsZXIgbVByaXZhdGVIYW5kbGVyOworICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXJDYWxsYmFjayBtUHJvdmlkZXJDYWxsYmFjazsKKworICAgIE1lZGlhUm91dGVQcm92aWRlciBtUHJvdmlkZXI7CisgICAgcHJpdmF0ZSBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCBtQ29tcG9zaXRlRGlzY292ZXJ5UmVxdWVzdDsKKworICAgIC8qKgorICAgICAqIFRoZSB7QGxpbmsgSW50ZW50fSB0aGF0IG11c3QgYmUgZGVjbGFyZWQgYXMgaGFuZGxlZCBieSB0aGUgc2VydmljZS4KKyAgICAgKiBQdXQgdGhpcyBpbiB5b3VyIG1hbmlmZXN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfSU5URVJGQUNFID0gTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuU0VSVklDRV9JTlRFUkZBQ0U7CisKKyAgICAvKgorICAgICAqIFByaXZhdGUgbWVzc2FnZXMgdXNlZCBpbnRlcm5hbGx5LiAgKFllcywgeW91IGNhbiByZW51bWJlciB0aGVzZS4pCisgICAgICovCisKKyAgICBzdGF0aWMgZmluYWwgaW50IFBSSVZBVEVfTVNHX0NMSUVOVF9ESUVEID0gMTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBtZWRpYSByb3V0ZSBwcm92aWRlciBzZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyBNZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlKCkgeworICAgICAgICBtUmVjZWl2ZUhhbmRsZXIgPSBuZXcgUmVjZWl2ZUhhbmRsZXIodGhpcyk7CisgICAgICAgIG1SZWNlaXZlTWVzc2VuZ2VyID0gbmV3IE1lc3NlbmdlcihtUmVjZWl2ZUhhbmRsZXIpOworICAgICAgICBtUHJpdmF0ZUhhbmRsZXIgPSBuZXcgUHJpdmF0ZUhhbmRsZXIoKTsKKyAgICAgICAgbVByb3ZpZGVyQ2FsbGJhY2sgPSBuZXcgUHJvdmlkZXJDYWxsYmFjaygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSB0aGUgc3lzdGVtIHdoZW4gaXQgaXMgdGltZSB0byBjcmVhdGUgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgb2ZmZXJlZCBieSB0aGlzIHNlcnZpY2UsIG9yIG51bGwgaWYKKyAgICAgKiB0aGlzIHNlcnZpY2UgaGFzIGRlY2lkZWQgbm90IHRvIG9mZmVyIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IE1lZGlhUm91dGVQcm92aWRlciBvbkNyZWF0ZU1lZGlhUm91dGVQcm92aWRlcigpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgb2ZmZXJlZCBieSB0aGlzIHNlcnZpY2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBvZmZlcmVkIGJ5IHRoaXMgc2VydmljZSwgb3IgbnVsbCBpZgorICAgICAqIGl0IGhhcyBub3QgeWV0IGJlZW4gY3JlYXRlZC4KKyAgICAgKgorICAgICAqIEBzZWUgI29uQ3JlYXRlTWVkaWFSb3V0ZVByb3ZpZGVyKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgTWVkaWFSb3V0ZVByb3ZpZGVyIGdldE1lZGlhUm91dGVQcm92aWRlcigpIHsKKyAgICAgICAgcmV0dXJuIG1Qcm92aWRlcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSUJpbmRlciBvbkJpbmQoSW50ZW50IGludGVudCkgeworICAgICAgICBpZiAoaW50ZW50LmdldEFjdGlvbigpLmVxdWFscyhTRVJWSUNFX0lOVEVSRkFDRSkpIHsKKyAgICAgICAgICAgIGlmIChtUHJvdmlkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlciA9IG9uQ3JlYXRlTWVkaWFSb3V0ZVByb3ZpZGVyKCk7CisgICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3ZpZGVyUGFja2FnZSA9IHByb3ZpZGVyLmdldE1ldGFkYXRhKCkuZ2V0UGFja2FnZU5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm92aWRlclBhY2thZ2UuZXF1YWxzKGdldFBhY2thZ2VOYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJvbkNyZWF0ZU1lZGlhUm91dGVQcm92aWRlcigpIHJldHVybmVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYSBwcm92aWRlciB3aG9zZSBwYWNrYWdlIG5hbWUgZG9lcyBub3QgbWF0Y2ggdGhlIHBhY2thZ2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJuYW1lIG9mIHRoZSBzZXJ2aWNlLiAgQSBtZWRpYSByb3V0ZSBwcm92aWRlciBzZXJ2aWNlIGNhbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm9ubHkgZXhwb3J0IGl0cyBvd24gbWVkaWEgcm91dGUgcHJvdmlkZXJzLiAgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJQcm92aWRlciBwYWNrYWdlIG5hbWU6ICIgKyBwcm92aWRlclBhY2thZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLiAgU2VydmljZSBwYWNrYWdlIG5hbWU6ICIgKyBnZXRQYWNrYWdlTmFtZSgpICsgIi4iKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtUHJvdmlkZXIgPSBwcm92aWRlcjsKKyAgICAgICAgICAgICAgICAgICAgbVByb3ZpZGVyLnNldENhbGxiYWNrKG1Qcm92aWRlckNhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVByb3ZpZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVJlY2VpdmVNZXNzZW5nZXIuZ2V0QmluZGVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25VbmJpbmQoSW50ZW50IGludGVudCkgeworICAgICAgICBpZiAobVByb3ZpZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Qcm92aWRlci5zZXRDYWxsYmFjayhudWxsKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIub25VbmJpbmQoaW50ZW50KTsKKyAgICB9CisKKyAgICBib29sZWFuIG9uUmVnaXN0ZXJDbGllbnQoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCwgaW50IHZlcnNpb24pIHsKKyAgICAgICAgaWYgKHZlcnNpb24gPj0gQ0xJRU5UX1ZFUlNJT05fMSkgeworICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZENsaWVudChtZXNzZW5nZXIpOworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBuZXcgQ2xpZW50UmVjb3JkKG1lc3NlbmdlciwgdmVyc2lvbik7CisgICAgICAgICAgICAgICAgaWYgKGNsaWVudC5yZWdpc3RlcigpKSB7CisgICAgICAgICAgICAgICAgICAgIG1DbGllbnRzLmFkZChjbGllbnQpOworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUmVnaXN0ZXJlZCwgdmVyc2lvbj0iICsgdmVyc2lvbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RJZCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBtUHJvdmlkZXIuZ2V0RGVzY3JpcHRvcigpOworICAgICAgICAgICAgICAgICAgICAgICAgc2VuZFJlcGx5KG1lc3NlbmdlciwgU0VSVklDRV9NU0dfUkVHSVNURVJFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLCBTRVJWSUNFX1ZFUlNJT05fQ1VSUkVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRGVzY3JpcHRvckJ1bmRsZUZvckNsaWVudFZlcnNpb24oZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQubVZlcnNpb24pLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2xlYW4gb25VbnJlZ2lzdGVyQ2xpZW50KE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCByZXF1ZXN0SWQpIHsKKyAgICAgICAgaW50IGluZGV4ID0gZmluZENsaWVudChtZXNzZW5nZXIpOworICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgQ2xpZW50UmVjb3JkIGNsaWVudCA9IG1DbGllbnRzLnJlbW92ZShpbmRleCk7CisgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFVucmVnaXN0ZXJlZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2xpZW50LmRpc3Bvc2UoKTsKKyAgICAgICAgICAgIHNlbmRHZW5lcmljU3VjY2VzcyhtZXNzZW5nZXIsIHJlcXVlc3RJZCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdm9pZCBvbkJpbmRlckRpZWQoTWVzc2VuZ2VyIG1lc3NlbmdlcikgeworICAgICAgICBpbnQgaW5kZXggPSBmaW5kQ2xpZW50KG1lc3Nlbmdlcik7CisgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gbUNsaWVudHMucmVtb3ZlKGluZGV4KTsKKyAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogQmluZGVyIGRpZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsaWVudC5kaXNwb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sZWFuIG9uQ3JlYXRlUm91dGVDb250cm9sbGVyKE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCByZXF1ZXN0SWQsCisgICAgICAgICAgICBpbnQgY29udHJvbGxlcklkLCBTdHJpbmcgcm91dGVJZCwgU3RyaW5nIHJvdXRlR3JvdXBJZCkgeworICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gZ2V0Q2xpZW50KG1lc3Nlbmdlcik7CisgICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGNsaWVudC5jcmVhdGVSb3V0ZUNvbnRyb2xsZXIocm91dGVJZCwgcm91dGVHcm91cElkLCBjb250cm9sbGVySWQpKSB7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUm91dGUgY29udHJvbGxlciBjcmVhdGVkLCBjb250cm9sbGVySWQ9IiArIGNvbnRyb2xsZXJJZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgcm91dGVJZD0iICsgcm91dGVJZCArICIsIHJvdXRlR3JvdXBJZD0iICsgcm91dGVHcm91cElkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2VuZEdlbmVyaWNTdWNjZXNzKG1lc3NlbmdlciwgcmVxdWVzdElkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbGVhbiBvblJlbGVhc2VSb3V0ZUNvbnRyb2xsZXIoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCwKKyAgICAgICAgICAgIGludCBjb250cm9sbGVySWQpIHsKKyAgICAgICAgQ2xpZW50UmVjb3JkIGNsaWVudCA9IGdldENsaWVudChtZXNzZW5nZXIpOworICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChjbGllbnQucmVsZWFzZVJvdXRlQ29udHJvbGxlcihjb250cm9sbGVySWQpKSB7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUm91dGUgY29udHJvbGxlciByZWxlYXNlZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGNvbnRyb2xsZXJJZD0iICsgY29udHJvbGxlcklkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2VuZEdlbmVyaWNTdWNjZXNzKG1lc3NlbmdlciwgcmVxdWVzdElkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbGVhbiBvblNlbGVjdFJvdXRlKE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCByZXF1ZXN0SWQsCisgICAgICAgICAgICBpbnQgY29udHJvbGxlcklkKSB7CisgICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBnZXRDbGllbnQobWVzc2VuZ2VyKTsKKyAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPQorICAgICAgICAgICAgICAgICAgICBjbGllbnQuZ2V0Um91dGVDb250cm9sbGVyKGNvbnRyb2xsZXJJZCk7CisgICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29udHJvbGxlci5vblNlbGVjdCgpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFJvdXRlIHNlbGVjdGVkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgY29udHJvbGxlcklkPSIgKyBjb250cm9sbGVySWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZW5kR2VuZXJpY1N1Y2Nlc3MobWVzc2VuZ2VyLCByZXF1ZXN0SWQpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sZWFuIG9uVW5zZWxlY3RSb3V0ZShNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkLAorICAgICAgICAgICAgaW50IGNvbnRyb2xsZXJJZCwgaW50IHJlYXNvbikgeworICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gZ2V0Q2xpZW50KG1lc3Nlbmdlcik7CisgICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciBjb250cm9sbGVyID0KKyAgICAgICAgICAgICAgICAgICAgY2xpZW50LmdldFJvdXRlQ29udHJvbGxlcihjb250cm9sbGVySWQpOworICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25VbnNlbGVjdChyZWFzb24pOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFJvdXRlIHVuc2VsZWN0ZWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBjb250cm9sbGVySWQ9IiArIGNvbnRyb2xsZXJJZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlbmRHZW5lcmljU3VjY2VzcyhtZXNzZW5nZXIsIHJlcXVlc3RJZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2xlYW4gb25TZXRSb3V0ZVZvbHVtZShNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkLAorICAgICAgICAgICAgaW50IGNvbnRyb2xsZXJJZCwgaW50IHZvbHVtZSkgeworICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gZ2V0Q2xpZW50KG1lc3Nlbmdlcik7CisgICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciBjb250cm9sbGVyID0KKyAgICAgICAgICAgICAgICAgICAgY2xpZW50LmdldFJvdXRlQ29udHJvbGxlcihjb250cm9sbGVySWQpOworICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25TZXRWb2x1bWUodm9sdW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBSb3V0ZSB2b2x1bWUgY2hhbmdlZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGNvbnRyb2xsZXJJZD0iICsgY29udHJvbGxlcklkICsgIiwgdm9sdW1lPSIgKyB2b2x1bWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZW5kR2VuZXJpY1N1Y2Nlc3MobWVzc2VuZ2VyLCByZXF1ZXN0SWQpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sZWFuIG9uVXBkYXRlUm91dGVWb2x1bWUoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCwKKyAgICAgICAgICAgIGludCBjb250cm9sbGVySWQsIGludCBkZWx0YSkgeworICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gZ2V0Q2xpZW50KG1lc3Nlbmdlcik7CisgICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciBjb250cm9sbGVyID0KKyAgICAgICAgICAgICAgICAgICAgY2xpZW50LmdldFJvdXRlQ29udHJvbGxlcihjb250cm9sbGVySWQpOworICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25VcGRhdGVWb2x1bWUoZGVsdGEpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFJvdXRlIHZvbHVtZSB1cGRhdGVkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgY29udHJvbGxlcklkPSIgKyBjb250cm9sbGVySWQgKyAiLCBkZWx0YT0iICsgZGVsdGEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZW5kR2VuZXJpY1N1Y2Nlc3MobWVzc2VuZ2VyLCByZXF1ZXN0SWQpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sZWFuIG9uUm91dGVDb250cm9sUmVxdWVzdChmaW5hbCBNZXNzZW5nZXIgbWVzc2VuZ2VyLCBmaW5hbCBpbnQgcmVxdWVzdElkLAorICAgICAgICAgICAgZmluYWwgaW50IGNvbnRyb2xsZXJJZCwgZmluYWwgSW50ZW50IGludGVudCkgeworICAgICAgICBmaW5hbCBDbGllbnRSZWNvcmQgY2xpZW50ID0gZ2V0Q2xpZW50KG1lc3Nlbmdlcik7CisgICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciBjb250cm9sbGVyID0KKyAgICAgICAgICAgICAgICAgICAgY2xpZW50LmdldFJvdXRlQ29udHJvbGxlcihjb250cm9sbGVySWQpOworICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLkNvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgY2FsbGJhY2sgPSBudWxsOworICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0SWQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IG5ldyBNZWRpYVJvdXRlci5Db250cm9sUmVxdWVzdENhbGxiYWNrKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFJvdXRlIGNvbnRyb2wgcmVxdWVzdCBzdWNjZWVkZWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBjb250cm9sbGVySWQ9IiArIGNvbnRyb2xsZXJJZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgaW50ZW50PSIgKyBpbnRlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGRhdGE9IiArIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmluZENsaWVudChtZXNzZW5nZXIpID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZFJlcGx5KG1lc3NlbmdlciwgU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX1NVQ0NFRURFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsIDAsIGRhdGEsIG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKFN0cmluZyBlcnJvciwgQnVuZGxlIGRhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBSb3V0ZSBjb250cm9sIHJlcXVlc3QgZmFpbGVkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgY29udHJvbGxlcklkPSIgKyBjb250cm9sbGVySWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGludGVudD0iICsgaW50ZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBlcnJvcj0iICsgZXJyb3IgKyAiLCBkYXRhPSIgKyBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmRDbGllbnQobWVzc2VuZ2VyKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlLnB1dFN0cmluZyhTRVJWSUNFX0RBVEFfRVJST1IsIGVycm9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRSZXBseShtZXNzZW5nZXIsIFNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCwgMCwgZGF0YSwgYnVuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRSZXBseShtZXNzZW5nZXIsIFNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCwgMCwgZGF0YSwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjb250cm9sbGVyLm9uQ29udHJvbFJlcXVlc3QoaW50ZW50LCBjYWxsYmFjaykpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFJvdXRlIGNvbnRyb2wgcmVxdWVzdCBkZWxpdmVyZWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgY29udHJvbGxlcklkPSIgKyBjb250cm9sbGVySWQgKyAiLCBpbnRlbnQ9IiArIGludGVudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sZWFuIG9uU2V0RGlzY292ZXJ5UmVxdWVzdChNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkLAorICAgICAgICAgICAgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gZ2V0Q2xpZW50KG1lc3Nlbmdlcik7CisgICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgYm9vbGVhbiBhY3R1YWxseUNoYW5nZWQgPSBjbGllbnQuc2V0RGlzY292ZXJ5UmVxdWVzdChyZXF1ZXN0KTsKKyAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogU2V0IGRpc2NvdmVyeSByZXF1ZXN0LCByZXF1ZXN0PSIgKyByZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICArICIsIGFjdHVhbGx5Q2hhbmdlZD0iICsgYWN0dWFsbHlDaGFuZ2VkCisgICAgICAgICAgICAgICAgICAgICAgICArICIsIGNvbXBvc2l0ZURpc2NvdmVyeVJlcXVlc3Q9IiArIG1Db21wb3NpdGVEaXNjb3ZlcnlSZXF1ZXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlbmRHZW5lcmljU3VjY2VzcyhtZXNzZW5nZXIsIHJlcXVlc3RJZCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdm9pZCBzZW5kRGVzY3JpcHRvckNoYW5nZWQoTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7CisgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1DbGllbnRzLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gbUNsaWVudHMuZ2V0KGkpOworICAgICAgICAgICAgc2VuZFJlcGx5KGNsaWVudC5tTWVzc2VuZ2VyLCBTRVJWSUNFX01TR19ERVNDUklQVE9SX0NIQU5HRUQsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgIGNyZWF0ZURlc2NyaXB0b3JCdW5kbGVGb3JDbGllbnRWZXJzaW9uKGRlc2NyaXB0b3IsIGNsaWVudC5tVmVyc2lvbiksIG51bGwpOworICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBTZW50IGRlc2NyaXB0b3IgY2hhbmdlIGV2ZW50LCBkZXNjcmlwdG9yPSIgKyBkZXNjcmlwdG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHN0YXRpYyBCdW5kbGUgY3JlYXRlRGVzY3JpcHRvckJ1bmRsZUZvckNsaWVudFZlcnNpb24oTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yLAorICAgICAgICAgICAgaW50IGNsaWVudFZlcnNpb24pIHsKKyAgICAgICAgaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvci5CdWlsZGVyIGJ1aWxkZXIgPQorICAgICAgICAgICAgICAgIG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLkJ1aWxkZXIoZGVzY3JpcHRvcik7CisgICAgICAgIGJ1aWxkZXIuc2V0Um91dGVzKG51bGwpOworICAgICAgICBmb3IgKE1lZGlhUm91dGVEZXNjcmlwdG9yIHJvdXRlIDogZGVzY3JpcHRvci5nZXRSb3V0ZXMoKSkgeworICAgICAgICAgICAgaWYgKGNsaWVudFZlcnNpb24gPj0gcm91dGUuZ2V0TWluQ2xpZW50VmVyc2lvbigpCisgICAgICAgICAgICAgICAgICAgICYmIGNsaWVudFZlcnNpb24gPD0gcm91dGUuZ2V0TWF4Q2xpZW50VmVyc2lvbigpKSB7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hZGRSb3V0ZShyb3V0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKS5hc0J1bmRsZSgpOworICAgIH0KKworICAgIGJvb2xlYW4gdXBkYXRlQ29tcG9zaXRlRGlzY292ZXJ5UmVxdWVzdCgpIHsKKyAgICAgICAgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgY29tcG9zaXRlID0gbnVsbDsKKyAgICAgICAgTWVkaWFSb3V0ZVNlbGVjdG9yLkJ1aWxkZXIgc2VsZWN0b3JCdWlsZGVyID0gbnVsbDsKKyAgICAgICAgYm9vbGVhbiBhY3RpdmVTY2FuID0gZmFsc2U7CisgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1DbGllbnRzLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0ID0gbUNsaWVudHMuZ2V0KGkpLm1EaXNjb3ZlcnlSZXF1ZXN0OworICAgICAgICAgICAgaWYgKHJlcXVlc3QgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAmJiAoIXJlcXVlc3QuZ2V0U2VsZWN0b3IoKS5pc0VtcHR5KCkgfHwgcmVxdWVzdC5pc0FjdGl2ZVNjYW4oKSkpIHsKKyAgICAgICAgICAgICAgICBhY3RpdmVTY2FuIHw9IHJlcXVlc3QuaXNBY3RpdmVTY2FuKCk7CisgICAgICAgICAgICAgICAgaWYgKGNvbXBvc2l0ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZSA9IHJlcXVlc3Q7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdG9yQnVpbGRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvckJ1aWxkZXIgPSBuZXcgTWVkaWFSb3V0ZVNlbGVjdG9yLkJ1aWxkZXIoY29tcG9zaXRlLmdldFNlbGVjdG9yKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yQnVpbGRlci5hZGRTZWxlY3RvcihyZXF1ZXN0LmdldFNlbGVjdG9yKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc2VsZWN0b3JCdWlsZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbXBvc2l0ZSA9IG5ldyBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdChzZWxlY3RvckJ1aWxkZXIuYnVpbGQoKSwgYWN0aXZlU2Nhbik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFPYmplY3RzQ29tcGF0LmVxdWFscyhtQ29tcG9zaXRlRGlzY292ZXJ5UmVxdWVzdCwgY29tcG9zaXRlKSkgeworICAgICAgICAgICAgbUNvbXBvc2l0ZURpc2NvdmVyeVJlcXVlc3QgPSBjb21wb3NpdGU7CisgICAgICAgICAgICBtUHJvdmlkZXIuc2V0RGlzY292ZXJ5UmVxdWVzdChjb21wb3NpdGUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgQ2xpZW50UmVjb3JkIGdldENsaWVudChNZXNzZW5nZXIgbWVzc2VuZ2VyKSB7CisgICAgICAgIGludCBpbmRleCA9IGZpbmRDbGllbnQobWVzc2VuZ2VyKTsKKyAgICAgICAgcmV0dXJuIGluZGV4ID49IDAgPyBtQ2xpZW50cy5nZXQoaW5kZXgpIDogbnVsbDsKKyAgICB9CisKKyAgICBpbnQgZmluZENsaWVudChNZXNzZW5nZXIgbWVzc2VuZ2VyKSB7CisgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1DbGllbnRzLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gbUNsaWVudHMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKGNsaWVudC5oYXNNZXNzZW5nZXIobWVzc2VuZ2VyKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBzZW5kR2VuZXJpY0ZhaWx1cmUoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCkgeworICAgICAgICBpZiAocmVxdWVzdElkICE9IDApIHsKKyAgICAgICAgICAgIHNlbmRSZXBseShtZXNzZW5nZXIsIFNFUlZJQ0VfTVNHX0dFTkVSSUNfRkFJTFVSRSwgcmVxdWVzdElkLCAwLCBudWxsLCBudWxsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2VuZEdlbmVyaWNTdWNjZXNzKE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCByZXF1ZXN0SWQpIHsKKyAgICAgICAgaWYgKHJlcXVlc3RJZCAhPSAwKSB7CisgICAgICAgICAgICBzZW5kUmVwbHkobWVzc2VuZ2VyLCBTRVJWSUNFX01TR19HRU5FUklDX1NVQ0NFU1MsIHJlcXVlc3RJZCwgMCwgbnVsbCwgbnVsbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBzZW5kUmVwbHkoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHdoYXQsCisgICAgICAgICAgICBpbnQgcmVxdWVzdElkLCBpbnQgYXJnLCBPYmplY3Qgb2JqLCBCdW5kbGUgZGF0YSkgeworICAgICAgICBNZXNzYWdlIG1zZyA9IE1lc3NhZ2Uub2J0YWluKCk7CisgICAgICAgIG1zZy53aGF0ID0gd2hhdDsKKyAgICAgICAgbXNnLmFyZzEgPSByZXF1ZXN0SWQ7CisgICAgICAgIG1zZy5hcmcyID0gYXJnOworICAgICAgICBtc2cub2JqID0gb2JqOworICAgICAgICBtc2cuc2V0RGF0YShkYXRhKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1lc3Nlbmdlci5zZW5kKG1zZyk7CisgICAgICAgIH0gY2F0Y2ggKERlYWRPYmplY3RFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIFRoZSBjbGllbnQgZGllZC4KKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZCBub3Qgc2VuZCBtZXNzYWdlIHRvICIgKyBnZXRDbGllbnRJZChtZXNzZW5nZXIpLCBleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgU3RyaW5nIGdldENsaWVudElkKE1lc3NlbmdlciBtZXNzZW5nZXIpIHsKKyAgICAgICAgcmV0dXJuICJDbGllbnQgY29ubmVjdGlvbiAiICsgbWVzc2VuZ2VyLmdldEJpbmRlcigpLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBQcml2YXRlSGFuZGxlciBleHRlbmRzIEhhbmRsZXIgeworICAgICAgICBQcml2YXRlSGFuZGxlcigpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBQUklWQVRFX01TR19DTElFTlRfRElFRDoKKyAgICAgICAgICAgICAgICAgICAgb25CaW5kZXJEaWVkKChNZXNzZW5nZXIpbXNnLm9iaik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBQcm92aWRlckNhbGxiYWNrIGV4dGVuZHMgTWVkaWFSb3V0ZVByb3ZpZGVyLkNhbGxiYWNrIHsKKyAgICAgICAgUHJvdmlkZXJDYWxsYmFjaygpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkRlc2NyaXB0b3JDaGFuZ2VkKE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlciwKKyAgICAgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKKyAgICAgICAgICAgIHNlbmREZXNjcmlwdG9yQ2hhbmdlZChkZXNjcmlwdG9yKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgY2xhc3MgQ2xpZW50UmVjb3JkIGltcGxlbWVudHMgRGVhdGhSZWNpcGllbnQgeworICAgICAgICBwdWJsaWMgZmluYWwgTWVzc2VuZ2VyIG1NZXNzZW5nZXI7CisgICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgbVZlcnNpb247CisgICAgICAgIHB1YmxpYyBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCBtRGlzY292ZXJ5UmVxdWVzdDsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFNwYXJzZUFycmF5PE1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXI+IG1Db250cm9sbGVycyA9CisgICAgICAgICAgICAgICAgbmV3IFNwYXJzZUFycmF5PE1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXI+KCk7CisKKyAgICAgICAgcHVibGljIENsaWVudFJlY29yZChNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgdmVyc2lvbikgeworICAgICAgICAgICAgbU1lc3NlbmdlciA9IG1lc3NlbmdlcjsKKyAgICAgICAgICAgIG1WZXJzaW9uID0gdmVyc2lvbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIHJlZ2lzdGVyKCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtTWVzc2VuZ2VyLmdldEJpbmRlcigpLmxpbmtUb0RlYXRoKHRoaXMsIDApOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgYmluZGVyRGllZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKyAgICAgICAgICAgIGludCBjb3VudCA9IG1Db250cm9sbGVycy5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBtQ29udHJvbGxlcnMudmFsdWVBdChpKS5vblJlbGVhc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Db250cm9sbGVycy5jbGVhcigpOworCisgICAgICAgICAgICBtTWVzc2VuZ2VyLmdldEJpbmRlcigpLnVubGlua1RvRGVhdGgodGhpcywgMCk7CisKKyAgICAgICAgICAgIHNldERpc2NvdmVyeVJlcXVlc3QobnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNNZXNzZW5nZXIoTWVzc2VuZ2VyIG90aGVyKSB7CisgICAgICAgICAgICByZXR1cm4gbU1lc3Nlbmdlci5nZXRCaW5kZXIoKSA9PSBvdGhlci5nZXRCaW5kZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGNyZWF0ZVJvdXRlQ29udHJvbGxlcihTdHJpbmcgcm91dGVJZCwgU3RyaW5nIHJvdXRlR3JvdXBJZCwKKyAgICAgICAgICAgICAgICBpbnQgY29udHJvbGxlcklkKSB7CisgICAgICAgICAgICBpZiAobUNvbnRyb2xsZXJzLmluZGV4T2ZLZXkoY29udHJvbGxlcklkKSA8IDApIHsKKyAgICAgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPSByb3V0ZUdyb3VwSWQgPT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgPyBtUHJvdmlkZXIub25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIocm91dGVJZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDogbVByb3ZpZGVyLm9uQ3JlYXRlUm91dGVDb250cm9sbGVyKHJvdXRlSWQsIHJvdXRlR3JvdXBJZCk7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtQ29udHJvbGxlcnMucHV0KGNvbnRyb2xsZXJJZCwgY29udHJvbGxlcik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIHJlbGVhc2VSb3V0ZUNvbnRyb2xsZXIoaW50IGNvbnRyb2xsZXJJZCkgeworICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciBjb250cm9sbGVyID0gbUNvbnRyb2xsZXJzLmdldChjb250cm9sbGVySWQpOworICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1Db250cm9sbGVycy5yZW1vdmUoY29udHJvbGxlcklkKTsKKyAgICAgICAgICAgICAgICBjb250cm9sbGVyLm9uUmVsZWFzZSgpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXIgZ2V0Um91dGVDb250cm9sbGVyKGludCBjb250cm9sbGVySWQpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ29udHJvbGxlcnMuZ2V0KGNvbnRyb2xsZXJJZCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBzZXREaXNjb3ZlcnlSZXF1ZXN0KE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgICAgIGlmICghT2JqZWN0c0NvbXBhdC5lcXVhbHMobURpc2NvdmVyeVJlcXVlc3QsIHJlcXVlc3QpKSB7CisgICAgICAgICAgICAgICAgbURpc2NvdmVyeVJlcXVlc3QgPSByZXF1ZXN0OworICAgICAgICAgICAgICAgIHJldHVybiB1cGRhdGVDb21wb3NpdGVEaXNjb3ZlcnlSZXF1ZXN0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBSdW5zIG9uIGEgYmluZGVyIHRocmVhZC4KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGJpbmRlckRpZWQoKSB7CisgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIub2J0YWluTWVzc2FnZShQUklWQVRFX01TR19DTElFTlRfRElFRCwgbU1lc3Nlbmdlcikuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRDbGllbnRJZChtTWVzc2VuZ2VyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEhhbmRsZXIgdGhhdCByZWNlaXZlcyBtZXNzYWdlcyBmcm9tIGNsaWVudHMuCisgICAgICogPHA+CisgICAgICogVGhpcyBpbm5lciBjbGFzcyBpcyBzdGF0aWMgYW5kIG9ubHkgcmV0YWlucyBhIHdlYWsgcmVmZXJlbmNlIHRvIHRoZSBzZXJ2aWNlCisgICAgICogdG8gcHJldmVudCB0aGUgc2VydmljZSBmcm9tIGJlaW5nIGxlYWtlZCBpbiBjYXNlIG9uZSBvZiB0aGUgY2xpZW50cyBpcyBob2xkaW5nIGFuCisgICAgICogYWN0aXZlIHJlZmVyZW5jZSB0byB0aGUgc2VydmVyJ3MgbWVzc2VuZ2VyLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBUaGlzIGhhbmRsZXIgc2hvdWxkIG5vdCBiZSB1c2VkIHRvIGhhbmRsZSBhbnkgbWVzc2FnZXMgb3RoZXIgdGhhbiB0aG9zZQorICAgICAqIHRoYXQgY29tZSBmcm9tIHRoZSBjbGllbnQuCisgICAgICogPC9wPgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlY2VpdmVIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgV2Vha1JlZmVyZW5jZTxNZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlPiBtU2VydmljZVJlZjsKKworICAgICAgICBwdWJsaWMgUmVjZWl2ZUhhbmRsZXIoTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZSBzZXJ2aWNlKSB7CisgICAgICAgICAgICBtU2VydmljZVJlZiA9IG5ldyBXZWFrUmVmZXJlbmNlPE1lZGlhUm91dGVQcm92aWRlclNlcnZpY2U+KHNlcnZpY2UpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIGZpbmFsIE1lc3NlbmdlciBtZXNzZW5nZXIgPSBtc2cucmVwbHlUbzsKKyAgICAgICAgICAgIGlmIChpc1ZhbGlkUmVtb3RlTWVzc2VuZ2VyKG1lc3NlbmdlcikpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgd2hhdCA9IG1zZy53aGF0OworICAgICAgICAgICAgICAgIGZpbmFsIGludCByZXF1ZXN0SWQgPSBtc2cuYXJnMTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgYXJnID0gbXNnLmFyZzI7CisgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IG9iaiA9IG1zZy5vYmo7CisgICAgICAgICAgICAgICAgZmluYWwgQnVuZGxlIGRhdGEgPSBtc2cucGVla0RhdGEoKTsKKyAgICAgICAgICAgICAgICBpZiAoIXByb2Nlc3NNZXNzYWdlKHdoYXQsIG1lc3NlbmdlciwgcmVxdWVzdElkLCBhcmcsIG9iaiwgZGF0YSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGdldENsaWVudElkKG1lc3NlbmdlcikgKyAiOiBNZXNzYWdlIGZhaWxlZCwgd2hhdD0iICsgd2hhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHJlcXVlc3RJZD0iICsgcmVxdWVzdElkICsgIiwgYXJnPSIgKyBhcmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBvYmo9IiArIG9iaiArICIsIGRhdGE9IiArIGRhdGEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNlbmRHZW5lcmljRmFpbHVyZShtZXNzZW5nZXIsIHJlcXVlc3RJZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiSWdub3JpbmcgbWVzc2FnZSB3aXRob3V0IHZhbGlkIHJlcGx5IG1lc3Nlbmdlci4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoaW50IHdoYXQsCisgICAgICAgICAgICAgICAgTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCwgaW50IGFyZywgT2JqZWN0IG9iaiwgQnVuZGxlIGRhdGEpIHsKKyAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlclNlcnZpY2Ugc2VydmljZSA9IG1TZXJ2aWNlUmVmLmdldCgpOworICAgICAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAod2hhdCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfUkVHSVNURVI6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5vblJlZ2lzdGVyQ2xpZW50KG1lc3NlbmdlciwgcmVxdWVzdElkLCBhcmcpOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX01TR19VTlJFR0lTVEVSOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uub25VbnJlZ2lzdGVyQ2xpZW50KG1lc3NlbmdlciwgcmVxdWVzdElkKTsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfQ1JFQVRFX1JPVVRFX0NPTlRST0xMRVI6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByb3V0ZUlkID0gZGF0YS5nZXRTdHJpbmcoQ0xJRU5UX0RBVEFfUk9VVEVfSUQpOworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJvdXRlR3JvdXBJZCA9IGRhdGEuZ2V0U3RyaW5nKENMSUVOVF9EQVRBX1JPVVRFX0xJQlJBUllfR1JPVVApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlSWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLm9uQ3JlYXRlUm91dGVDb250cm9sbGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2VuZ2VyLCByZXF1ZXN0SWQsIGFyZywgcm91dGVJZCwgcm91dGVHcm91cElkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDTElFTlRfTVNHX1JFTEVBU0VfUk9VVEVfQ09OVFJPTExFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLm9uUmVsZWFzZVJvdXRlQ29udHJvbGxlcihtZXNzZW5nZXIsIHJlcXVlc3RJZCwgYXJnKTsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfU0VMRUNUX1JPVVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uub25TZWxlY3RSb3V0ZShtZXNzZW5nZXIsIHJlcXVlc3RJZCwgYXJnKTsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfVU5TRUxFQ1RfUk9VVEU6CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVhc29uID0gZGF0YSA9PSBudWxsID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX1VOS05PV04KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkYXRhLmdldEludChDTElFTlRfREFUQV9VTlNFTEVDVF9SRUFTT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX1VOS05PV04pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uub25VbnNlbGVjdFJvdXRlKG1lc3NlbmdlciwgcmVxdWVzdElkLCBhcmcsIHJlYXNvbik7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDTElFTlRfTVNHX1NFVF9ST1VURV9WT0xVTUU6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB2b2x1bWUgPSBkYXRhLmdldEludChDTElFTlRfREFUQV9WT0xVTUUsIC0xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2x1bWUgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLm9uU2V0Um91dGVWb2x1bWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzZW5nZXIsIHJlcXVlc3RJZCwgYXJnLCB2b2x1bWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfVVBEQVRFX1JPVVRFX1ZPTFVNRTogeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbHRhID0gZGF0YS5nZXRJbnQoQ0xJRU5UX0RBVEFfVk9MVU1FLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uub25VcGRhdGVSb3V0ZVZvbHVtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NlbmdlciwgcmVxdWVzdElkLCBhcmcsIGRlbHRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDTElFTlRfTVNHX1JPVVRFX0NPTlRST0xfUkVRVUVTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBJbnRlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5vblJvdXRlQ29udHJvbFJlcXVlc3QoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzZW5nZXIsIHJlcXVlc3RJZCwgYXJnLCAoSW50ZW50KW9iaik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfU0VUX0RJU0NPVkVSWV9SRVFVRVNUOiB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwgfHwgb2JqIGluc3RhbmNlb2YgQnVuZGxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgcmVxdWVzdCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdC5mcm9tQnVuZGxlKChCdW5kbGUpb2JqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5vblNldERpc2NvdmVyeVJlcXVlc3QoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzZW5nZXIsIHJlcXVlc3RJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgIT0gbnVsbCAmJiByZXF1ZXN0LmlzVmFsaWQoKSA/IHJlcXVlc3QgOiBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlU2VsZWN0b3IuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlU2VsZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjY5YjE5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVTZWxlY3Rvci5qYXZhCkBAIC0wLDAgKzEsMzA4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBEZXNjcmliZXMgdGhlIGNhcGFiaWxpdGllcyBvZiByb3V0ZXMgdGhhdCBhcHBsaWNhdGlvbnMgd291bGQgbGlrZSB0byBkaXNjb3ZlciBhbmQgdXNlLgorICogPHA+CisgKiBUaGlzIG9iamVjdCBpcyBpbW11dGFibGUgb25jZSBjcmVhdGVkIHVzaW5nIGEge0BsaW5rIEJ1aWxkZXJ9IGluc3RhbmNlLgorICogPC9wPgorICoKKyAqIDxoMz5FeGFtcGxlPC9oMz4KKyAqIDxwcmU+CisgKiBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3JCdWlsZGVyID0gbmV3IE1lZGlhUm91dGVTZWxlY3Rvci5CdWlsZGVyKCkKKyAqICAgICAgICAgLmFkZENvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9WSURFTykKKyAqICAgICAgICAgLmFkZENvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLKQorICogICAgICAgICAuYnVpbGQoKTsKKyAqCisgKiBNZWRpYVJvdXRlciByb3V0ZXIgPSBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZShjb250ZXh0KTsKKyAqIHJvdXRlci5hZGRDYWxsYmFjayhzZWxlY3RvciwgY2FsbGJhY2ssIE1lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUlkpOworICogPC9wcmU+CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBNZWRpYVJvdXRlU2VsZWN0b3IgeworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTlRST0xfQ0FURUdPUklFUyA9ICJjb250cm9sQ2F0ZWdvcmllcyI7CisKKyAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOworICAgIExpc3Q8U3RyaW5nPiBtQ29udHJvbENhdGVnb3JpZXM7CisKKyAgICAvKioKKyAgICAgKiBBbiBlbXB0eSBtZWRpYSByb3V0ZSBzZWxlY3RvciB0aGF0IHdpbGwgbm90IG1hdGNoIGFueSByb3V0ZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBNZWRpYVJvdXRlU2VsZWN0b3IgRU1QVFkgPSBuZXcgTWVkaWFSb3V0ZVNlbGVjdG9yKG5ldyBCdW5kbGUoKSwgbnVsbCk7CisKKyAgICBNZWRpYVJvdXRlU2VsZWN0b3IoQnVuZGxlIGJ1bmRsZSwgTGlzdDxTdHJpbmc+IGNvbnRyb2xDYXRlZ29yaWVzKSB7CisgICAgICAgIG1CdW5kbGUgPSBidW5kbGU7CisgICAgICAgIG1Db250cm9sQ2F0ZWdvcmllcyA9IGNvbnRyb2xDYXRlZ29yaWVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGxpc3Qgb2Yge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGNhdGVnb3JpZXN9IGluIHRoZSBzZWxlY3Rvci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgY2F0ZWdvcmllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldENvbnRyb2xDYXRlZ29yaWVzKCkgeworICAgICAgICBlbnN1cmVDb250cm9sQ2F0ZWdvcmllcygpOworICAgICAgICByZXR1cm4gbUNvbnRyb2xDYXRlZ29yaWVzOworICAgIH0KKworICAgIHZvaWQgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKSB7CisgICAgICAgIGlmIChtQ29udHJvbENhdGVnb3JpZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgbUNvbnRyb2xDYXRlZ29yaWVzID0gbUJ1bmRsZS5nZXRTdHJpbmdBcnJheUxpc3QoS0VZX0NPTlRST0xfQ0FURUdPUklFUyk7CisgICAgICAgICAgICBpZiAobUNvbnRyb2xDYXRlZ29yaWVzID09IG51bGwgfHwgbUNvbnRyb2xDYXRlZ29yaWVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIG1Db250cm9sQ2F0ZWdvcmllcyA9IENvbGxlY3Rpb25zLjxTdHJpbmc+ZW1wdHlMaXN0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlbGVjdG9yIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgY2F0ZWdvcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2F0ZWdvcnkgVGhlIGNhdGVnb3J5IHRvIGNoZWNrLgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY2F0ZWdvcnkgaXMgcHJlc2VudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNDb250cm9sQ2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5KSB7CisgICAgICAgIGlmIChjYXRlZ29yeSAhPSBudWxsKSB7CisgICAgICAgICAgICBlbnN1cmVDb250cm9sQ2F0ZWdvcmllcygpOworICAgICAgICAgICAgZmluYWwgaW50IGNhdGVnb3J5Q291bnQgPSBtQ29udHJvbENhdGVnb3JpZXMuc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYXRlZ29yeUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobUNvbnRyb2xDYXRlZ29yaWVzLmdldChpKS5lcXVhbHMoY2F0ZWdvcnkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZWxlY3RvciBtYXRjaGVzIGF0IGxlYXN0IG9uZSBvZiB0aGUgc3BlY2lmaWVkIGNvbnRyb2wgZmlsdGVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWx0ZXJzIFRoZSBsaXN0IG9mIGNvbnRyb2wgZmlsdGVycyB0byBjb25zaWRlci4KKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgYSBtYXRjaCBpcyBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzQ29udHJvbEZpbHRlcnMoTGlzdDxJbnRlbnRGaWx0ZXI+IGZpbHRlcnMpIHsKKyAgICAgICAgaWYgKGZpbHRlcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBjYXRlZ29yeUNvdW50ID0gbUNvbnRyb2xDYXRlZ29yaWVzLnNpemUoKTsKKyAgICAgICAgICAgIGlmIChjYXRlZ29yeUNvdW50ICE9IDApIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZmlsdGVyQ291bnQgPSBmaWx0ZXJzLnNpemUoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlckNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgSW50ZW50RmlsdGVyIGZpbHRlciA9IGZpbHRlcnMuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY2F0ZWdvcnlDb3VudDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlci5oYXNDYXRlZ29yeShtQ29udHJvbENhdGVnb3JpZXMuZ2V0KGopKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHNlbGVjdG9yIGNvbnRhaW5zIGFsbCBvZiB0aGUgY2FwYWJpbGl0aWVzIGRlc2NyaWJlZAorICAgICAqIGJ5IHRoZSBzcGVjaWZpZWQgc2VsZWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yIHRvIGJlIGV4YW1pbmVkLgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHNlbGVjdG9yIGNvbnRhaW5zIGFsbCBvZiB0aGUgY2FwYWJpbGl0aWVzIGRlc2NyaWJlZAorICAgICAqIGJ5IHRoZSBzcGVjaWZpZWQgc2VsZWN0b3IuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7CisgICAgICAgIGlmIChzZWxlY3RvciAhPSBudWxsKSB7CisgICAgICAgICAgICBlbnN1cmVDb250cm9sQ2F0ZWdvcmllcygpOworICAgICAgICAgICAgc2VsZWN0b3IuZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKKyAgICAgICAgICAgIHJldHVybiBtQ29udHJvbENhdGVnb3JpZXMuY29udGFpbnNBbGwoc2VsZWN0b3IubUNvbnRyb2xDYXRlZ29yaWVzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZWxlY3RvciBkb2VzIG5vdCBzcGVjaWZ5IGFueSBjYXBhYmlsaXRpZXMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKyAgICAgICAgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKKyAgICAgICAgcmV0dXJuIG1Db250cm9sQ2F0ZWdvcmllcy5pc0VtcHR5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZWxlY3RvciBoYXMgYWxsIG9mIHRoZSByZXF1aXJlZCBmaWVsZHMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKKyAgICAgICAgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKKyAgICAgICAgaWYgKG1Db250cm9sQ2F0ZWdvcmllcy5jb250YWlucyhudWxsKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE1lZGlhUm91dGVTZWxlY3RvcikgeworICAgICAgICAgICAgTWVkaWFSb3V0ZVNlbGVjdG9yIG90aGVyID0gKE1lZGlhUm91dGVTZWxlY3RvcilvOworICAgICAgICAgICAgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKKyAgICAgICAgICAgIG90aGVyLmVuc3VyZUNvbnRyb2xDYXRlZ29yaWVzKCk7CisgICAgICAgICAgICByZXR1cm4gbUNvbnRyb2xDYXRlZ29yaWVzLmVxdWFscyhvdGhlci5tQ29udHJvbENhdGVnb3JpZXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBlbnN1cmVDb250cm9sQ2F0ZWdvcmllcygpOworICAgICAgICByZXR1cm4gbUNvbnRyb2xDYXRlZ29yaWVzLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICByZXN1bHQuYXBwZW5kKCJNZWRpYVJvdXRlU2VsZWN0b3J7ICIpOworICAgICAgICByZXN1bHQuYXBwZW5kKCJjb250cm9sQ2F0ZWdvcmllcz0iKS5hcHBlbmQoCisgICAgICAgICAgICAgICAgQXJyYXlzLnRvU3RyaW5nKGdldENvbnRyb2xDYXRlZ29yaWVzKCkudG9BcnJheSgpKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiB9Iik7CisgICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0cyB0aGlzIG9iamVjdCB0byBhIGJ1bmRsZSBmb3Igc2VyaWFsaXphdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGNvbnRlbnRzIG9mIHRoZSBvYmplY3QgcmVwcmVzZW50ZWQgYXMgYSBidW5kbGUuCisgICAgICovCisgICAgcHVibGljIEJ1bmRsZSBhc0J1bmRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1CdW5kbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmcm9tIGEgYnVuZGxlLgorICAgICAqCisgICAgICogQHBhcmFtIGJ1bmRsZSBUaGUgYnVuZGxlLCBvciBudWxsIGlmIG5vbmUuCisgICAgICogQHJldHVybiBUaGUgbmV3IGluc3RhbmNlLCBvciBudWxsIGlmIHRoZSBidW5kbGUgd2FzIG51bGwuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBNZWRpYVJvdXRlU2VsZWN0b3IgZnJvbUJ1bmRsZShATnVsbGFibGUgQnVuZGxlIGJ1bmRsZSkgeworICAgICAgICByZXR1cm4gYnVuZGxlICE9IG51bGwgPyBuZXcgTWVkaWFSb3V0ZVNlbGVjdG9yKGJ1bmRsZSwgbnVsbCkgOiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJ1aWxkZXIgZm9yIHtAbGluayBNZWRpYVJvdXRlU2VsZWN0b3IgbWVkaWEgcm91dGUgc2VsZWN0b3JzfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgeworICAgICAgICBwcml2YXRlIEFycmF5TGlzdDxTdHJpbmc+IG1Db250cm9sQ2F0ZWdvcmllczsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhbiBlbXB0eSBtZWRpYSByb3V0ZSBzZWxlY3RvciBidWlsZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIoKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGRlc2NyaXB0b3IgYnVpbGRlciB3aG9zZSBpbml0aWFsIGNvbnRlbnRzIGFyZQorICAgICAgICAgKiBjb3BpZWQgZnJvbSBhbiBleGlzdGluZyBzZWxlY3Rvci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyKEBOb25OdWxsIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvcikgeworICAgICAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNlbGVjdG9yLmVuc3VyZUNvbnRyb2xDYXRlZ29yaWVzKCk7CisgICAgICAgICAgICBpZiAoIXNlbGVjdG9yLm1Db250cm9sQ2F0ZWdvcmllcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBtQ29udHJvbENhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oc2VsZWN0b3IubUNvbnRyb2xDYXRlZ29yaWVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGRzIGEge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGNhdGVnb3J5fSB0byB0aGUgYnVpbGRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNhdGVnb3J5IFRoZSBjYXRlZ29yeSB0byBhZGQgdG8gdGhlIHNldCBvZiBkZXNpcmVkIGNhcGFiaWxpdGllcywgc3VjaCBhcworICAgICAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0NBVEVHT1JZX0xJVkVfQVVESU99LgorICAgICAgICAgKiBAcmV0dXJuIFRoZSBidWlsZGVyIGluc3RhbmNlIGZvciBjaGFpbmluZy4KKyAgICAgICAgICovCisgICAgICAgIEBOb25OdWxsCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZENvbnRyb2xDYXRlZ29yeShATm9uTnVsbCBTdHJpbmcgY2F0ZWdvcnkpIHsKKyAgICAgICAgICAgIGlmIChjYXRlZ29yeSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2F0ZWdvcnkgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobUNvbnRyb2xDYXRlZ29yaWVzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQ29udHJvbENhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbUNvbnRyb2xDYXRlZ29yaWVzLmNvbnRhaW5zKGNhdGVnb3J5KSkgeworICAgICAgICAgICAgICAgIG1Db250cm9sQ2F0ZWdvcmllcy5hZGQoY2F0ZWdvcnkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkcyBhIGxpc3Qgb2Yge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGNhdGVnb3JpZXN9IHRvIHRoZSBidWlsZGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY2F0ZWdvcmllcyBUaGUgbGlzdCBjYXRlZ29yaWVzIHRvIGFkZCB0byB0aGUgc2V0IG9mIGRlc2lyZWQgY2FwYWJpbGl0aWVzLAorICAgICAgICAgKiBzdWNoIGFzIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfTElWRV9BVURJT30uCisgICAgICAgICAqIEByZXR1cm4gVGhlIGJ1aWxkZXIgaW5zdGFuY2UgZm9yIGNoYWluaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgQE5vbk51bGwKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkQ29udHJvbENhdGVnb3JpZXMoQE5vbk51bGwgQ29sbGVjdGlvbjxTdHJpbmc+IGNhdGVnb3JpZXMpIHsKKyAgICAgICAgICAgIGlmIChjYXRlZ29yaWVzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYXRlZ29yaWVzIG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFjYXRlZ29yaWVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGNhdGVnb3J5IDogY2F0ZWdvcmllcykgeworICAgICAgICAgICAgICAgICAgICBhZGRDb250cm9sQ2F0ZWdvcnkoY2F0ZWdvcnkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZHMgdGhlIGNvbnRlbnRzIG9mIGFuIGV4aXN0aW5nIG1lZGlhIHJvdXRlIHNlbGVjdG9yIHRvIHRoZSBidWlsZGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIHdob3NlIGNvbnRlbnRzIGFyZSB0byBiZSBhZGRlZC4KKyAgICAgICAgICogQHJldHVybiBUaGUgYnVpbGRlciBpbnN0YW5jZSBmb3IgY2hhaW5pbmcuCisgICAgICAgICAqLworICAgICAgICBATm9uTnVsbAorICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRTZWxlY3RvcihATm9uTnVsbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VsZWN0b3IgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhZGRDb250cm9sQ2F0ZWdvcmllcyhzZWxlY3Rvci5nZXRDb250cm9sQ2F0ZWdvcmllcygpKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJ1aWxkcyB0aGUge0BsaW5rIE1lZGlhUm91dGVTZWxlY3RvciBtZWRpYSByb3V0ZSBzZWxlY3Rvcn0uCisgICAgICAgICAqLworICAgICAgICBATm9uTnVsbAorICAgICAgICBwdWJsaWMgTWVkaWFSb3V0ZVNlbGVjdG9yIGJ1aWxkKCkgeworICAgICAgICAgICAgaWYgKG1Db250cm9sQ2F0ZWdvcmllcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVNUFRZOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmdBcnJheUxpc3QoS0VZX0NPTlRST0xfQ0FURUdPUklFUywgbUNvbnRyb2xDYXRlZ29yaWVzKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZVNlbGVjdG9yKGJ1bmRsZSwgbUNvbnRyb2xDYXRlZ29yaWVzKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMDA1MmUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZXIuamF2YQpAQCAtMCwwICsxLDI5OTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5JbnREZWY7CitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50U2VuZGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LmFwcC5BY3Rpdml0eU1hbmFnZXJDb21wYXQ7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LmhhcmR3YXJlLmRpc3BsYXkuRGlzcGxheU1hbmFnZXJDb21wYXQ7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0Lm1lZGlhLlZvbHVtZVByb3ZpZGVyQ29tcGF0OworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5tZWRpYS5zZXNzaW9uLk1lZGlhU2Vzc2lvbkNvbXBhdDsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQudXRpbC5QYWlyOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuRGlzcGxheTsKKworaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyLlByb3ZpZGVyTWV0YWRhdGE7CitpbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIE1lZGlhUm91dGVyIGFsbG93cyBhcHBsaWNhdGlvbnMgdG8gY29udHJvbCB0aGUgcm91dGluZyBvZiBtZWRpYSBjaGFubmVscworICogYW5kIHN0cmVhbXMgZnJvbSB0aGUgY3VycmVudCBkZXZpY2UgdG8gZXh0ZXJuYWwgc3BlYWtlcnMgYW5kIGRlc3RpbmF0aW9uIGRldmljZXMuCisgKiA8cD4KKyAqIEEgTWVkaWFSb3V0ZXIgaW5zdGFuY2UgaXMgcmV0cmlldmVkIHRocm91Z2gge0BsaW5rICNnZXRJbnN0YW5jZX0uICBBcHBsaWNhdGlvbnMKKyAqIGNhbiBxdWVyeSB0aGUgbWVkaWEgcm91dGVyIGFib3V0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcm91dGUgYW5kIGl0cyBjYXBhYmlsaXRpZXMKKyAqIHRvIGRldGVybWluZSBob3cgdG8gc2VuZCBjb250ZW50IHRvIHRoZSByb3V0ZSdzIGRlc3RpbmF0aW9uLiAgQXBwbGljYXRpb25zIGNhbgorICogYWxzbyB7QGxpbmsgUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdCBzZW5kIGNvbnRyb2wgcmVxdWVzdHN9IHRvIHRoZSByb3V0ZQorICogdG8gYXNrIHRoZSByb3V0ZSdzIGRlc3RpbmF0aW9uIHRvIHBlcmZvcm0gY2VydGFpbiByZW1vdGUgY29udHJvbCBmdW5jdGlvbnMKKyAqIHN1Y2ggYXMgcGxheWluZyBtZWRpYS4KKyAqIDwvcD48cD4KKyAqIFNlZSBhbHNvIHtAbGluayBNZWRpYVJvdXRlUHJvdmlkZXJ9IGZvciBpbmZvcm1hdGlvbiBvbiBob3cgYW4gYXBwbGljYXRpb24KKyAqIGNhbiBwdWJsaXNoIG5ldyBtZWRpYSByb3V0ZXMgdG8gdGhlIG1lZGlhIHJvdXRlci4KKyAqIDwvcD48cD4KKyAqIFRoZSBtZWRpYSByb3V0ZXIgQVBJIGlzIG5vdCB0aHJlYWQtc2FmZTsgYWxsIGludGVyYWN0aW9ucyB3aXRoIGl0IG11c3QgYmUKKyAqIGRvbmUgZnJvbSB0aGUgbWFpbiB0aHJlYWQgb2YgdGhlIHByb2Nlc3MuCisgKiA8L3A+CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBNZWRpYVJvdXRlciB7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFSb3V0ZXIiOworICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpOworCisgICAgLyoqCisgICAgICogUGFzc2VkIHRvIHtAbGluayBhbmRyb2lkLnN1cHBvcnQudjcubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciNvblVuc2VsZWN0KGludCl9CisgICAgICogYW5kIHtAbGluayBDYWxsYmFjayNvblJvdXRlVW5zZWxlY3RlZChNZWRpYVJvdXRlciwgUm91dGVJbmZvLCBpbnQpfSB3aGVuIHRoZSByZWFzb24gdGhlIHJvdXRlCisgICAgICogd2FzIHVuc2VsZWN0ZWQgaXMgdW5rbm93bi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTlNFTEVDVF9SRUFTT05fVU5LTk9XTiA9IDA7CisgICAgLyoqCisgICAgICogUGFzc2VkIHRvIHtAbGluayBhbmRyb2lkLnN1cHBvcnQudjcubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciNvblVuc2VsZWN0KGludCl9CisgICAgICogYW5kIHtAbGluayBDYWxsYmFjayNvblJvdXRlVW5zZWxlY3RlZChNZWRpYVJvdXRlciwgUm91dGVJbmZvLCBpbnQpfSB3aGVuIHRoZSB1c2VyIHByZXNzZWQKKyAgICAgKiB0aGUgZGlzY29ubmVjdCBidXR0b24gdG8gZGlzY29ubmVjdCBhbmQga2VlcCBwbGF5aW5nLgorICAgICAqIDxwPgorICAgICAqCisgICAgICogQHNlZSBNZWRpYVJvdXRlRGVzY3JpcHRvciNjYW5EaXNjb25uZWN0QW5kS2VlcFBsYXlpbmcoKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOU0VMRUNUX1JFQVNPTl9ESVNDT05ORUNURUQgPSAxOworICAgIC8qKgorICAgICAqIFBhc3NlZCB0byB7QGxpbmsgYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhLk1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXIjb25VbnNlbGVjdChpbnQpfQorICAgICAqIGFuZCB7QGxpbmsgQ2FsbGJhY2sjb25Sb3V0ZVVuc2VsZWN0ZWQoTWVkaWFSb3V0ZXIsIFJvdXRlSW5mbywgaW50KX0gd2hlbiB0aGUgdXNlciBwcmVzc2VkCisgICAgICogdGhlIHN0b3AgY2FzdGluZyBidXR0b24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5TRUxFQ1RfUkVBU09OX1NUT1BQRUQgPSAyOworICAgIC8qKgorICAgICAqIFBhc3NlZCB0byB7QGxpbmsgYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhLk1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXIjb25VbnNlbGVjdChpbnQpfQorICAgICAqIGFuZCB7QGxpbmsgQ2FsbGJhY2sjb25Sb3V0ZVVuc2VsZWN0ZWQoTWVkaWFSb3V0ZXIsIFJvdXRlSW5mbywgaW50KX0gd2hlbiB0aGUgdXNlciBzZWxlY3RlZAorICAgICAqIGEgZGlmZmVyZW50IHJvdXRlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOU0VMRUNUX1JFQVNPTl9ST1VURV9DSEFOR0VEID0gMzsKKworICAgIC8vIE1haW50YWlucyBnbG9iYWwgbWVkaWEgcm91dGVyIHN0YXRlIGZvciB0aGUgcHJvY2Vzcy4KKyAgICAvLyBUaGlzIGZpZWxkIGlzIGluaXRpYWxpemVkIGluIE1lZGlhUm91dGVyLmdldEluc3RhbmNlKCkgYmVmb3JlIGFueQorICAgIC8vIE1lZGlhUm91dGVyIG9iamVjdHMgYXJlIGluc3RhbnRpYXRlZCBzbyBpdCBpcyBndWFyYW50ZWVkIHRvIGJlCisgICAgLy8gdmFsaWQgd2hlbmV2ZXIgYW55IGluc3RhbmNlIG1ldGhvZCBpcyBpbnZva2VkLgorICAgIHN0YXRpYyBHbG9iYWxNZWRpYVJvdXRlciBzR2xvYmFsOworCisgICAgLy8gQ29udGV4dC1ib3VuZCBzdGF0ZSBvZiB0aGUgbWVkaWEgcm91dGVyLgorICAgIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisgICAgZmluYWwgQXJyYXlMaXN0PENhbGxiYWNrUmVjb3JkPiBtQ2FsbGJhY2tSZWNvcmRzID0gbmV3IEFycmF5TGlzdDxDYWxsYmFja1JlY29yZD4oKTsKKworICAgIEBJbnREZWYoZmxhZyA9IHRydWUsCisgICAgICAgICAgICB2YWx1ZSA9IHsKKyAgICAgICAgICAgICAgICAgICAgQ0FMTEJBQ0tfRkxBR19QRVJGT1JNX0FDVElWRV9TQ0FOLAorICAgICAgICAgICAgICAgICAgICBDQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZLAorICAgICAgICAgICAgICAgICAgICBDQUxMQkFDS19GTEFHX1VORklMVEVSRURfRVZFTlRTCisgICAgICAgICAgICB9CisgICAgKQorICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKKyAgICBwcml2YXRlIEBpbnRlcmZhY2UgQ2FsbGJhY2tGbGFncyB7fQorCisgICAgLyoqCisgICAgICogRmxhZyBmb3Ige0BsaW5rICNhZGRDYWxsYmFja306IEFjdGl2ZWx5IHNjYW4gZm9yIHJvdXRlcyB3aGlsZSB0aGlzIGNhbGxiYWNrCisgICAgICogaXMgcmVnaXN0ZXJlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBXaGVuIHRoaXMgZmxhZyBpcyBzcGVjaWZpZWQsIHRoZSBtZWRpYSByb3V0ZXIgd2lsbCBhY3RpdmVseSBzY2FuIGZvciBuZXcKKyAgICAgKiByb3V0ZXMuICBDZXJ0YWluIHJvdXRlcywgc3VjaCBhcyB3aWZpIGRpc3BsYXkgcm91dGVzLCBtYXkgbm90IGJlIGRpc2NvdmVyYWJsZQorICAgICAqIGV4Y2VwdCB3aGVuIGFjdGl2ZWx5IHNjYW5uaW5nLiAgVGhpcyBmbGFnIGlzIHR5cGljYWxseSB1c2VkIHdoZW4gdGhlIHJvdXRlIHBpY2tlcgorICAgICAqIGRpYWxvZyBoYXMgYmVlbiBvcGVuZWQgYnkgdGhlIHVzZXIgdG8gZW5zdXJlIHRoYXQgdGhlIHJvdXRlIGluZm9ybWF0aW9uIGlzCisgICAgICogdXAgdG8gZGF0ZS4KKyAgICAgKiA8L3A+PHA+CisgICAgICogQWN0aXZlIHNjYW5uaW5nIG1heSBjb25zdW1lIGEgc2lnbmlmaWNhbnQgYW1vdW50IG9mIHBvd2VyIGFuZCBtYXkgaGF2ZSBpbnRydXNpdmUKKyAgICAgKiBlZmZlY3RzIG9uIHdpcmVsZXNzIGNvbm5lY3Rpdml0eS4gIFRoZXJlZm9yZSBpdCBpcyBpbXBvcnRhbnQgdGhhdCBhY3RpdmUgc2Nhbm5pbmcKKyAgICAgKiBvbmx5IGJlIHJlcXVlc3RlZCB3aGVuIGl0IGlzIGFjdHVhbGx5IG5lZWRlZCB0byBzYXRpc2Z5IGEgdXNlciByZXF1ZXN0IHRvCisgICAgICogZGlzY292ZXIgYW5kIHNlbGVjdCBhIG5ldyByb3V0ZS4KKyAgICAgKiA8L3A+PHA+CisgICAgICogVGhpcyBmbGFnIGltcGxpZXMge0BsaW5rICNDQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZfSBidXQgcGVyZm9ybWluZworICAgICAqIGFjdGl2ZSBzY2FucyBpcyBtdWNoIG1vcmUgZXhwZW5zaXZlIHRoYW4gYSBub3JtYWwgZGlzY292ZXJ5IHJlcXVlc3QuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHNlZSAjQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTiA9IDEgPDwgMDsKKworICAgIC8qKgorICAgICAqIEZsYWcgZm9yIHtAbGluayAjYWRkQ2FsbGJhY2t9OiBEbyBub3QgZmlsdGVyIHJvdXRlIGV2ZW50cy4KKyAgICAgKiA8cD4KKyAgICAgKiBXaGVuIHRoaXMgZmxhZyBpcyBzcGVjaWZpZWQsIHRoZSBjYWxsYmFjayB3aWxsIGJlIGludm9rZWQgZm9yIGV2ZW50cyB0aGF0IGFmZmVjdCBhbnkKKyAgICAgKiByb3V0ZSBldmVuIGlmIHRoZXkgZG8gbm90IG1hdGNoIHRoZSBjYWxsYmFjaydzIGZpbHRlci4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FMTEJBQ0tfRkxBR19VTkZJTFRFUkVEX0VWRU5UUyA9IDEgPDwgMTsKKworICAgIC8qKgorICAgICAqIEZsYWcgZm9yIHtAbGluayAjYWRkQ2FsbGJhY2t9OiBSZXF1ZXN0IHBhc3NpdmUgcm91dGUgZGlzY292ZXJ5IHdoaWxlIHRoaXMKKyAgICAgKiBjYWxsYmFjayBpcyByZWdpc3RlcmVkLCBleGNlcHQgb24ge0BsaW5rIEFjdGl2aXR5TWFuYWdlciNpc0xvd1JhbURldmljZSBsb3ctUkFNIGRldmljZXN9LgorICAgICAqIDxwPgorICAgICAqIFdoZW4gdGhpcyBmbGFnIGlzIHNwZWNpZmllZCwgdGhlIG1lZGlhIHJvdXRlciB3aWxsIHRyeSB0byBkaXNjb3ZlciByb3V0ZXMuCisgICAgICogQWx0aG91Z2ggcm91dGUgZGlzY292ZXJ5IGlzIGludGVuZGVkIHRvIGJlIGVmZmljaWVudCwgY2hlY2tpbmcgZm9yIG5ldyByb3V0ZXMgbWF5CisgICAgICogcmVzdWx0IGluIHNvbWUgbmV0d29yayBhY3Rpdml0eSBhbmQgY291bGQgc2xvd2x5IGRyYWluIHRoZSBiYXR0ZXJ5LiAgVGhlcmVmb3JlCisgICAgICogYXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHNwZWNpZnkge0BsaW5rICNDQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZfSB3aGVuCisgICAgICogdGhleSBhcmUgcnVubmluZyBpbiB0aGUgZm9yZWdyb3VuZCBhbmQgd291bGQgbGlrZSB0byBwcm92aWRlIHRoZSB1c2VyIHdpdGggdGhlCisgICAgICogb3B0aW9uIG9mIGNvbm5lY3RpbmcgdG8gbmV3IHJvdXRlcy4KKyAgICAgKiA8L3A+PHA+CisgICAgICogQXBwbGljYXRpb25zIHNob3VsZCB0eXBpY2FsbHkgYWRkIGEgY2FsbGJhY2sgdXNpbmcgdGhpcyBmbGFnIGluIHRoZQorICAgICAqIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSBhY3Rpdml0eSdzfSB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25TdGFydCBvblN0YXJ0fQorICAgICAqIG1ldGhvZCBhbmQgcmVtb3ZlIGl0IGluIHRoZSB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25TdG9wIG9uU3RvcH0gbWV0aG9kLgorICAgICAqIFRoZSB7QGxpbmsgYW5kcm9pZC5zdXBwb3J0LnY3LmFwcC5NZWRpYVJvdXRlRGlzY292ZXJ5RnJhZ21lbnR9IGZyYWdtZW50IG1heQorICAgICAqIGFsc28gYmUgdXNlZCBmb3IgdGhpcyBwdXJwb3NlLgorICAgICAqIDwvcD48cCBjbGFzcz0ibm90ZSI+CisgICAgICogT24ge0BsaW5rIEFjdGl2aXR5TWFuYWdlciNpc0xvd1JhbURldmljZSBsb3ctUkFNIGRldmljZXN9IHRoaXMgZmxhZworICAgICAqIHdpbGwgYmUgaWdub3JlZC4gIFJlZmVyIHRvCisgICAgICoge0BsaW5rICNhZGRDYWxsYmFjayhNZWRpYVJvdXRlU2VsZWN0b3IsIENhbGxiYWNrLCBpbnQpIGFkZENhbGxiYWNrfSBmb3IgZGV0YWlscy4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAc2VlIGFuZHJvaWQuc3VwcG9ydC52Ny5hcHAuTWVkaWFSb3V0ZURpc2NvdmVyeUZyYWdtZW50CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWSA9IDEgPDwgMjsKKworICAgIC8qKgorICAgICAqIEZsYWcgZm9yIHtAbGluayAjYWRkQ2FsbGJhY2t9OiBSZXF1ZXN0IHBhc3NpdmUgcm91dGUgZGlzY292ZXJ5IHdoaWxlIHRoaXMKKyAgICAgKiBjYWxsYmFjayBpcyByZWdpc3RlcmVkLCBldmVuIG9uIHtAbGluayBBY3Rpdml0eU1hbmFnZXIjaXNMb3dSYW1EZXZpY2UgbG93LVJBTSBkZXZpY2VzfS4KKyAgICAgKiA8cCBjbGFzcz0ibm90ZSI+CisgICAgICogVGhpcyBmbGFnIGhhcyBhIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGltcGFjdCBvbiBsb3ctUkFNIGRldmljZXMKKyAgICAgKiBzaW5jZSBpdCBtYXkgY2F1c2UgbWFueSBtZWRpYSByb3V0ZSBwcm92aWRlcnMgdG8gYmUgc3RhcnRlZCBzaW11bHRhbmVvdXNseS4KKyAgICAgKiBJdCBpcyBtdWNoIGJldHRlciB0byB1c2Uge0BsaW5rICNDQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZfSBpbnN0ZWFkIHRvIGF2b2lkCisgICAgICogcGVyZm9ybWluZyBwYXNzaXZlIGRpc2NvdmVyeSBvbiB0aGVzZSBkZXZpY2VzIGFsdG9nZXRoZXIuICBSZWZlciB0bworICAgICAqIHtAbGluayAjYWRkQ2FsbGJhY2soTWVkaWFSb3V0ZVNlbGVjdG9yLCBDYWxsYmFjaywgaW50KSBhZGRDYWxsYmFja30gZm9yIGRldGFpbHMuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHNlZSBhbmRyb2lkLnN1cHBvcnQudjcuYXBwLk1lZGlhUm91dGVEaXNjb3ZlcnlGcmFnbWVudAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTExCQUNLX0ZMQUdfRk9SQ0VfRElTQ09WRVJZID0gMSA8PCAzOworCisgICAgLyoqCisgICAgICogRmxhZyBmb3Ige0BsaW5rICNpc1JvdXRlQXZhaWxhYmxlfTogSWdub3JlIHRoZSBkZWZhdWx0IHJvdXRlLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgZmxhZyBpcyB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIGEgbWF0Y2hpbmcgbm9uLWRlZmF1bHQgcm91dGUgaXMgYXZhaWxhYmxlLgorICAgICAqIFRoaXMgY29uc3RyYWludCBtYXkgYmUgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0byBvZmZlciB0aGUgcm91dGUgY2hvb3NlciBkaWFsb2cKKyAgICAgKiB0byB0aGUgdXNlci4gIFRoZXJlIGlzIG5vIHBvaW50IG9mZmVyaW5nIHRoZSBjaG9vc2VyIGlmIHRoZXJlIGFyZSBubworICAgICAqIG5vbi1kZWZhdWx0IGNob2ljZXMuCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFWQUlMQUJJTElUWV9GTEFHX0lHTk9SRV9ERUZBVUxUX1JPVVRFID0gMSA8PCAwOworCisgICAgLyoqCisgICAgICogRmxhZyBmb3Ige0BsaW5rICNpc1JvdXRlQXZhaWxhYmxlfTogUmVxdWlyZSBhbiBhY3R1YWwgcm91dGUgdG8gYmUgbWF0Y2hlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGlzIGZsYWcgaXMgbm90IHNldCwgdGhlbiB7QGxpbmsgI2lzUm91dGVBdmFpbGFibGV9IHdpbGwgcmV0dXJuIHRydWUKKyAgICAgKiBpZiBpdCBpcyBwb3NzaWJsZSB0byBkaXNjb3ZlciBhIG1hdGNoaW5nIHJvdXRlIGV2ZW4gaWYgZGlzY292ZXJ5IGlzIG5vdCBpbgorICAgICAqIHByb2dyZXNzIG9yIGlmIG5vIG1hdGNoaW5nIHJvdXRlIGhhcyB5ZXQgYmVlbiBmb3VuZC4gIFRoaXMgZmVhdHVyZSBpcyB1c2VkIHRvCisgICAgICogc2F2ZSByZXNvdXJjZXMgYnkgcmVtb3ZpbmcgdGhlIG5lZWQgdG8gcGVyZm9ybSBwYXNzaXZlIHJvdXRlIGRpc2NvdmVyeSBvbgorICAgICAqIHtAbGluayBBY3Rpdml0eU1hbmFnZXIjaXNMb3dSYW1EZXZpY2UgbG93LVJBTSBkZXZpY2VzfS4KKyAgICAgKiA8L3A+PHA+CisgICAgICogSWYgdGhpcyBmbGFnIGlzIHNldCwgdGhlbiB7QGxpbmsgI2lzUm91dGVBdmFpbGFibGV9IHdpbGwgb25seSByZXR1cm4gdHJ1ZSBpZgorICAgICAqIGEgbWF0Y2hpbmcgcm91dGUgaGFzIGFjdHVhbGx5IGJlZW4gZGlzY292ZXJlZC4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVZBSUxBQklMSVRZX0ZMQUdfUkVRVUlSRV9NQVRDSCA9IDEgPDwgMTsKKworICAgIHByaXZhdGUgTWVkaWFSb3V0ZXIoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGFuIGluc3RhbmNlIG9mIHRoZSBtZWRpYSByb3V0ZXIgc2VydmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnRleHQuCisgICAgICogPHA+CisgICAgICogVGhlIGFwcGxpY2F0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBob2xkaW5nIGEgc3Ryb25nIHJlZmVyZW5jZSB0byB0aGUgcmV0dXJuZWQKKyAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXJ9IGluc3RhbmNlLCBzdWNoIGFzIGJ5IHN0b3JpbmcgdGhlIGluc3RhbmNlIGluIGEgZmllbGQgb2YKKyAgICAgKiB0aGUge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5fSwgdG8gZW5zdXJlIHRoYXQgdGhlIG1lZGlhIHJvdXRlciByZW1haW5zIGFsaXZlCisgICAgICogYXMgbG9uZyBhcyB0aGUgYXBwbGljYXRpb24gaXMgdXNpbmcgaXRzIGZlYXR1cmVzLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBJbiBvdGhlciB3b3JkcywgdGhlIHN1cHBvcnQgbGlicmFyeSBvbmx5IGhvbGRzIGEge0BsaW5rIFdlYWtSZWZlcmVuY2Ugd2VhayByZWZlcmVuY2V9CisgICAgICogdG8gZWFjaCBtZWRpYSByb3V0ZXIgaW5zdGFuY2UuICBXaGVuIHRoZXJlIGFyZSBubyByZW1haW5pbmcgc3Ryb25nIHJlZmVyZW5jZXMgdG8gdGhlCisgICAgICogbWVkaWEgcm91dGVyIGluc3RhbmNlLCBhbGwgb2YgaXRzIGNhbGxiYWNrcyB3aWxsIGJlIHJlbW92ZWQgYW5kIHJvdXRlIGRpc2NvdmVyeQorICAgICAqIHdpbGwgbm8gbG9uZ2VyIGJlIHBlcmZvcm1lZCBvbiBpdHMgYmVoYWxmLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIG1lZGlhIHJvdXRlciBpbnN0YW5jZSBmb3IgdGhlIGNvbnRleHQuICBUaGUgYXBwbGljYXRpb24gbXVzdCBob2xkCisgICAgICogYSBzdHJvbmcgcmVmZXJlbmNlIHRvIHRoaXMgb2JqZWN0IGFzIGxvbmcgYXMgaXQgaXMgaW4gdXNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFSb3V0ZXIgZ2V0SW5zdGFuY2UoQE5vbk51bGwgQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbnRleHQgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOworCisgICAgICAgIGlmIChzR2xvYmFsID09IG51bGwpIHsKKyAgICAgICAgICAgIHNHbG9iYWwgPSBuZXcgR2xvYmFsTWVkaWFSb3V0ZXIoY29udGV4dC5nZXRBcHBsaWNhdGlvbkNvbnRleHQoKSk7CisgICAgICAgICAgICBzR2xvYmFsLnN0YXJ0KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNHbG9iYWwuZ2V0Um91dGVyKGNvbnRleHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGVzfSBjdXJyZW50bHkga25vd24gdG8KKyAgICAgKiB0aGlzIG1lZGlhIHJvdXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxSb3V0ZUluZm8+IGdldFJvdXRlcygpIHsKKyAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7CisgICAgICAgIHJldHVybiBzR2xvYmFsLmdldFJvdXRlcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHtAbGluayBNZWRpYVJvdXRlci5Qcm92aWRlckluZm8gcm91dGUgcHJvdmlkZXJzfQorICAgICAqIGN1cnJlbnRseSBrbm93biB0byB0aGlzIG1lZGlhIHJvdXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxQcm92aWRlckluZm8+IGdldFByb3ZpZGVycygpIHsKKyAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7CisgICAgICAgIHJldHVybiBzR2xvYmFsLmdldFByb3ZpZGVycygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGRlZmF1bHQgcm91dGUgZm9yIHBsYXlpbmcgbWVkaWEgY29udGVudCBvbiB0aGUgc3lzdGVtLgorICAgICAqIDxwPgorICAgICAqIFRoZSBzeXN0ZW0gYWx3YXlzIHByb3ZpZGVzIGEgZGVmYXVsdCByb3V0ZS4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBkZWZhdWx0IHJvdXRlLCB3aGljaCBpcyBndWFyYW50ZWVkIHRvIG5ldmVyIGJlIG51bGwuCisgICAgICovCisgICAgQE5vbk51bGwKKyAgICBwdWJsaWMgUm91dGVJbmZvIGdldERlZmF1bHRSb3V0ZSgpIHsKKyAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7CisgICAgICAgIHJldHVybiBzR2xvYmFsLmdldERlZmF1bHRSb3V0ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgYSBibHVldG9vdGggcm91dGUgZm9yIHBsYXlpbmcgbWVkaWEgY29udGVudCBvbiB0aGUgc3lzdGVtLgorICAgICAqCisgICAgICogQHJldHVybiBBIGJsdWV0b290aCByb3V0ZSwgaWYgZXhpc3QsIG90aGVyd2lzZSBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBSb3V0ZUluZm8gZ2V0Qmx1ZXRvb3RoUm91dGUoKSB7CisgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOworICAgICAgICByZXR1cm4gc0dsb2JhbC5nZXRCbHVldG9vdGhSb3V0ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByb3V0ZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgYXBwbGljYXRpb24gc2hvdWxkIGV4YW1pbmUgdGhlIHJvdXRlJ3MKKyAgICAgKiB7QGxpbmsgUm91dGVJbmZvI2dldENvbnRyb2xGaWx0ZXJzIG1lZGlhIGNvbnRyb2wgaW50ZW50IGZpbHRlcnN9IHRvIGFzc2VzcyB0aGUKKyAgICAgKiBjYXBhYmlsaXRpZXMgb2YgdGhlIHJvdXRlIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHVzZSBpdC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiA8aDM+RXhhbXBsZTwvaDM+CisgICAgICogPHByZT4KKyAgICAgKiBwdWJsaWMgYm9vbGVhbiBwbGF5TW92aWUoKSB7CisgICAgICogICAgIE1lZGlhUm91dGVyIG1lZGlhUm91dGVyID0gTWVkaWFSb3V0ZXIuZ2V0SW5zdGFuY2UoY29udGV4dCk7CisgICAgICogICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IG1lZGlhUm91dGVyLmdldFNlbGVjdGVkUm91dGUoKTsKKyAgICAgKgorICAgICAqICAgICAvLyBGaXJzdCB0cnkgdXNpbmcgdGhlIHJlbW90ZSBwbGF5YmFjayBpbnRlcmZhY2UsIGlmIHN1cHBvcnRlZC4KKyAgICAgKiAgICAgaWYgKHJvdXRlLnN1cHBvcnRzQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9SRU1PVEVfUExBWUJBQ0spKSB7CisgICAgICogICAgICAgICAvLyBUaGUgcm91dGUgc3VwcG9ydHMgcmVtb3RlIHBsYXliYWNrLgorICAgICAqICAgICAgICAgLy8gVHJ5IHRvIHNlbmQgaXQgdGhlIFVyaSBvZiB0aGUgbW92aWUgdG8gcGxheS4KKyAgICAgKiAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fUExBWSk7CisgICAgICogICAgICAgICBpbnRlbnQuYWRkQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyk7CisgICAgICogICAgICAgICBpbnRlbnQuc2V0RGF0YUFuZFR5cGUoImh0dHA6Ly9leGFtcGxlLmNvbS92aWRlb3MvbW92aWUubXA0IiwgInZpZGVvL21wNCIpOworICAgICAqICAgICAgICAgaWYgKHJvdXRlLnN1cHBvcnRzQ29udHJvbFJlcXVlc3QoaW50ZW50KSkgeworICAgICAqICAgICAgICAgICAgIHJvdXRlLnNlbmRDb250cm9sUmVxdWVzdChpbnRlbnQsIG51bGwpOworICAgICAqICAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBzZW50IHRoZSByZXF1ZXN0IHRvIHBsYXkgdGhlIG1vdmllCisgICAgICogICAgICAgICB9CisgICAgICogICAgIH0KKyAgICAgKgorICAgICAqICAgICAvLyBJZiByZW1vdGUgcGxheWJhY2sgd2FzIG5vdCBwb3NzaWJsZSwgdGhlbiBwbGF5IGxvY2FsbHkuCisgICAgICogICAgIGlmIChyb3V0ZS5zdXBwb3J0c0NvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9WSURFTykpIHsKKyAgICAgKiAgICAgICAgIC8vIFRoZSByb3V0ZSBzdXBwb3J0cyBsaXZlIHZpZGVvIHN0cmVhbWluZy4KKyAgICAgKiAgICAgICAgIC8vIFByZXBhcmUgdG8gcGxheSBjb250ZW50IGxvY2FsbHkgaW4gYSB3aW5kb3cgb3IgaW4gYSBwcmVzZW50YXRpb24uCisgICAgICogICAgICAgICByZXR1cm4gcGxheU1vdmllSW5XaW5kb3coKTsKKyAgICAgKiAgICAgfQorICAgICAqCisgICAgICogICAgIC8vIE5laXRoZXIgaW50ZXJmYWNlIGlzIHN1cHBvcnRlZCwgc28gd2UgY2FuJ3QgcGxheSB0aGUgbW92aWUgdG8gdGhpcyByb3V0ZS4KKyAgICAgKiAgICAgcmV0dXJuIGZhbHNlOworICAgICAqIH0KKyAgICAgKiA8L3ByZT4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHNlbGVjdGVkIHJvdXRlLCB3aGljaCBpcyBndWFyYW50ZWVkIHRvIG5ldmVyIGJlIG51bGwuCisgICAgICoKKyAgICAgKiBAc2VlIFJvdXRlSW5mbyNnZXRDb250cm9sRmlsdGVycworICAgICAqIEBzZWUgUm91dGVJbmZvI3N1cHBvcnRzQ29udHJvbENhdGVnb3J5CisgICAgICogQHNlZSBSb3V0ZUluZm8jc3VwcG9ydHNDb250cm9sUmVxdWVzdAorICAgICAqLworICAgIEBOb25OdWxsCisgICAgcHVibGljIFJvdXRlSW5mbyBnZXRTZWxlY3RlZFJvdXRlKCkgeworICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKKyAgICAgICAgcmV0dXJuIHNHbG9iYWwuZ2V0U2VsZWN0ZWRSb3V0ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNlbGVjdGVkIHJvdXRlIGlmIGl0IG1hdGNoZXMgdGhlIHNwZWNpZmllZCBzZWxlY3Rvciwgb3RoZXJ3aXNlCisgICAgICogc2VsZWN0cyB0aGUgZGVmYXVsdCByb3V0ZSBhbmQgcmV0dXJucyBpdC4gSWYgdGhlcmUgaXMgb25lIGxpdmUgYXVkaW8gcm91dGUKKyAgICAgKiAodXN1YWxseSBCbHVldG9vdGggQTJEUCksIGl0IHdpbGwgYmUgc2VsZWN0ZWQgaW5zdGVhZCBvZiBkZWZhdWx0IHJvdXRlLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGVjdG9yIFRoZSBzZWxlY3RvciB0byBtYXRjaC4KKyAgICAgKiBAcmV0dXJuIFRoZSBwcmV2aW91c2x5IHNlbGVjdGVkIHJvdXRlIGlmIGl0IG1hdGNoZWQgdGhlIHNlbGVjdG9yLCBvdGhlcndpc2UgdGhlCisgICAgICogbmV3bHkgc2VsZWN0ZWQgZGVmYXVsdCByb3V0ZSB3aGljaCBpcyBndWFyYW50ZWVkIHRvIG5ldmVyIGJlIG51bGwuCisgICAgICoKKyAgICAgKiBAc2VlIE1lZGlhUm91dGVTZWxlY3RvcgorICAgICAqIEBzZWUgUm91dGVJbmZvI21hdGNoZXNTZWxlY3RvcgorICAgICAqLworICAgIEBOb25OdWxsCisgICAgcHVibGljIFJvdXRlSW5mbyB1cGRhdGVTZWxlY3RlZFJvdXRlKEBOb25OdWxsIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvcikgeworICAgICAgICBpZiAoc2VsZWN0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VsZWN0b3IgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOworCisgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAidXBkYXRlU2VsZWN0ZWRSb3V0ZTogIiArIHNlbGVjdG9yKTsKKyAgICAgICAgfQorICAgICAgICBSb3V0ZUluZm8gcm91dGUgPSBzR2xvYmFsLmdldFNlbGVjdGVkUm91dGUoKTsKKyAgICAgICAgaWYgKCFyb3V0ZS5pc0RlZmF1bHRPckJsdWV0b290aCgpICYmICFyb3V0ZS5tYXRjaGVzU2VsZWN0b3Ioc2VsZWN0b3IpKSB7CisgICAgICAgICAgICByb3V0ZSA9IHNHbG9iYWwuY2hvb3NlRmFsbGJhY2tSb3V0ZSgpOworICAgICAgICAgICAgc0dsb2JhbC5zZWxlY3RSb3V0ZShyb3V0ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJvdXRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbGVjdHMgdGhlIHNwZWNpZmllZCByb3V0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb3V0ZSBUaGUgcm91dGUgdG8gc2VsZWN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlbGVjdFJvdXRlKEBOb25OdWxsIFJvdXRlSW5mbyByb3V0ZSkgeworICAgICAgICBpZiAocm91dGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicm91dGUgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOworCisgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAic2VsZWN0Um91dGU6ICIgKyByb3V0ZSk7CisgICAgICAgIH0KKyAgICAgICAgc0dsb2JhbC5zZWxlY3RSb3V0ZShyb3V0ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVW5zZWxlY3RzIHRoZSBjdXJyZW50IHJvdW5kIGFuZCBzZWxlY3RzIHRoZSBkZWZhdWx0IHJvdXRlIGluc3RlYWQuCisgICAgICogPHA+CisgICAgICogVGhlIHJlYXNvbiBnaXZlbiBtdXN0IGJlIG9uZSBvZjoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fVU5LTk9XTn08L2xpPgorICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX0RJU0NPTk5FQ1RFRH08L2xpPgorICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX1NUT1BQRUR9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9ST1VURV9DSEFOR0VEfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWFzb24gVGhlIHJlYXNvbiBmb3IgZGlzY29ubmVjdGluZyB0aGUgY3VycmVudCByb3V0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1bnNlbGVjdChpbnQgcmVhc29uKSB7CisgICAgICAgIGlmIChyZWFzb24gPCBNZWRpYVJvdXRlci5VTlNFTEVDVF9SRUFTT05fVU5LTk9XTiB8fAorICAgICAgICAgICAgICAgIHJlYXNvbiA+IE1lZGlhUm91dGVyLlVOU0VMRUNUX1JFQVNPTl9ST1VURV9DSEFOR0VEKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbnN1cHBvcnRlZCByZWFzb24gdG8gdW5zZWxlY3Qgcm91dGUiKTsKKyAgICAgICAgfQorICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKKworICAgICAgICAvLyBDaG9vc2UgdGhlIGZhbGxiYWNrIHJvdXRlIGlmIGl0J3Mgbm90IGFscmVhZHkgc2VsZWN0ZWQuCisgICAgICAgIC8vIE90aGVyd2lzZSwgc2VsZWN0IHRoZSBkZWZhdWx0IHJvdXRlLgorICAgICAgICBSb3V0ZUluZm8gZmFsbGJhY2tSb3V0ZSA9IHNHbG9iYWwuY2hvb3NlRmFsbGJhY2tSb3V0ZSgpOworICAgICAgICBpZiAoc0dsb2JhbC5nZXRTZWxlY3RlZFJvdXRlKCkgIT0gZmFsbGJhY2tSb3V0ZSkgeworICAgICAgICAgICAgc0dsb2JhbC5zZWxlY3RSb3V0ZShmYWxsYmFja1JvdXRlLCByZWFzb24pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc0dsb2JhbC5zZWxlY3RSb3V0ZShzR2xvYmFsLmdldERlZmF1bHRSb3V0ZSgpLCByZWFzb24pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIGEgcm91dGUgdGhhdCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgc2VsZWN0b3IuCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBhbnkgYXZhaWxhYmxlIHJvdXRlcyB0aGF0IG1hdGNoIHRoZQorICAgICAqIHNlbGVjdG9yIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGV5IGFyZSBlbmFibGVkIG9yIGRpc2FibGVkLiBJZiB0aGUKKyAgICAgKiB7QGxpbmsgI0FWQUlMQUJJTElUWV9GTEFHX0lHTk9SRV9ERUZBVUxUX1JPVVRFfSBmbGFnIGlzIHNwZWNpZmllZCwgdGhlbgorICAgICAqIHRoZSBtZXRob2Qgd2lsbCBvbmx5IGNvbnNpZGVyIG5vbi1kZWZhdWx0IHJvdXRlcy4KKyAgICAgKiA8L3A+CisgICAgICogPHAgY2xhc3M9Im5vdGUiPgorICAgICAqIE9uIHtAbGluayBBY3Rpdml0eU1hbmFnZXIjaXNMb3dSYW1EZXZpY2UgbG93LVJBTSBkZXZpY2VzfSB0aGlzIG1ldGhvZAorICAgICAqIHdpbGwgcmV0dXJuIHRydWUgaWYgaXQgaXMgcG9zc2libGUgdG8gZGlzY292ZXIgYSBtYXRjaGluZyByb3V0ZSBldmVuIGlmCisgICAgICogZGlzY292ZXJ5IGlzIG5vdCBpbiBwcm9ncmVzcyBvciBpZiBubyBtYXRjaGluZyByb3V0ZSBoYXMgeWV0IGJlZW4gZm91bmQuCisgICAgICogVXNlIHtAbGluayAjQVZBSUxBQklMSVRZX0ZMQUdfUkVRVUlSRV9NQVRDSH0gdG8gcmVxdWlyZSBhbiBhY3R1YWwgbWF0Y2guCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGVjdG9yIFRoZSBzZWxlY3RvciB0byBtYXRjaC4KKyAgICAgKiBAcGFyYW0gZmxhZ3MgRmxhZ3MgdG8gY29udHJvbCB0aGUgZGV0ZXJtaW5hdGlvbiBvZiB3aGV0aGVyIGEgcm91dGUgbWF5IGJlCisgICAgICogICAgICAgICAgICBhdmFpbGFibGUuIE1heSBiZSB6ZXJvIG9yIHNvbWUgY29tYmluYXRpb24gb2YKKyAgICAgKiAgICAgICAgICAgIHtAbGluayAjQVZBSUxBQklMSVRZX0ZMQUdfSUdOT1JFX0RFRkFVTFRfUk9VVEV9IGFuZAorICAgICAqICAgICAgICAgICAge0BsaW5rICNBVkFJTEFCSUxJVFlfRkxBR19SRVFVSVJFX01BVENIfS4KKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgYSBtYXRjaGluZyByb3V0ZSBtYXkgYmUgYXZhaWxhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUm91dGVBdmFpbGFibGUoQE5vbk51bGwgTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yLCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKKworICAgICAgICByZXR1cm4gc0dsb2JhbC5pc1JvdXRlQXZhaWxhYmxlKHNlbGVjdG9yLCBmbGFncyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgdG8gZGlzY292ZXIgcm91dGVzIHRoYXQgbWF0Y2ggdGhlIHNlbGVjdG9yIGFuZCB0byByZWNlaXZlCisgICAgICogZXZlbnRzIHdoZW4gdGhleSBjaGFuZ2UuCisgICAgICogPHA+CisgICAgICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgY2FsbGluZworICAgICAqIHtAbGluayAjYWRkQ2FsbGJhY2soTWVkaWFSb3V0ZVNlbGVjdG9yLCBDYWxsYmFjaywgaW50KX0gd2l0aG91dCBmbGFncy4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgQSByb3V0ZSBzZWxlY3RvciB0aGF0IGluZGljYXRlcyB0aGUga2luZHMgb2Ygcm91dGVzIHRoYXQgdGhlCisgICAgICogY2FsbGJhY2sgd291bGQgbGlrZSB0byBkaXNjb3Zlci4KKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIGFkZC4KKyAgICAgKiBAc2VlICNyZW1vdmVDYWxsYmFjaworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENhbGxiYWNrKE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvciwgQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgYWRkQ2FsbGJhY2soc2VsZWN0b3IsIGNhbGxiYWNrLCAwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayB0byBkaXNjb3ZlciByb3V0ZXMgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IgYW5kIHRvIHJlY2VpdmUKKyAgICAgKiBldmVudHMgd2hlbiB0aGV5IGNoYW5nZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgc2VsZWN0b3IgZGVzY3JpYmVzIHRoZSBraW5kcyBvZiByb3V0ZXMgdGhhdCB0aGUgYXBwbGljYXRpb24gd2FudHMgdG8KKyAgICAgKiBkaXNjb3Zlci4gIEZvciBleGFtcGxlLCBpZiB0aGUgYXBwbGljYXRpb24gd2FudHMgdG8gdXNlCisgICAgICogbGl2ZSBhdWRpbyByb3V0ZXMgdGhlbiBpdCBzaG91bGQgaW5jbHVkZSB0aGUKKyAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0NBVEVHT1JZX0xJVkVfQVVESU8gbGl2ZSBhdWRpbyBtZWRpYSBjb250cm9sIGludGVudCBjYXRlZ29yeX0KKyAgICAgKiBpbiBpdHMgc2VsZWN0b3Igd2hlbiBpdCBhZGRzIGEgY2FsbGJhY2sgdG8gdGhlIG1lZGlhIHJvdXRlci4KKyAgICAgKiBUaGUgc2VsZWN0b3IgbWF5IGluY2x1ZGUgYW55IG51bWJlciBvZiBjYXRlZ29yaWVzLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBJZiB0aGUgY2FsbGJhY2sgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkLCB0aGVuIHRoZSBzZWxlY3RvciBpcyBhZGRlZCB0bworICAgICAqIHRoZSBzZXQgb2Ygc2VsZWN0b3JzIGJlaW5nIG1vbml0b3JlZCBieSB0aGUgY2FsbGJhY2suCisgICAgICogPC9wPjxwPgorICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBjYWxsYmFjayB3aWxsIG9ubHkgYmUgaW52b2tlZCBmb3IgZXZlbnRzIHRoYXQgYWZmZWN0IHJvdXRlcworICAgICAqIHRoYXQgbWF0Y2ggdGhlIHNwZWNpZmllZCBzZWxlY3Rvci4gIEV2ZW50IGZpbHRlcmluZyBtYXkgYmUgZGlzYWJsZWQgYnkgc3BlY2lmeWluZworICAgICAqIHRoZSB7QGxpbmsgI0NBTExCQUNLX0ZMQUdfVU5GSUxURVJFRF9FVkVOVFN9IGZsYWcgd2hlbiB0aGUgY2FsbGJhY2sgaXMgcmVnaXN0ZXJlZC4KKyAgICAgKiA8L3A+PHA+CisgICAgICogQXBwbGljYXRpb25zIHNob3VsZCB1c2UgdGhlIHtAbGluayAjaXNSb3V0ZUF2YWlsYWJsZX0gbWV0aG9kIHRvIGRldGVybWluZQorICAgICAqIHdoZXRoZXIgaXMgaXQgcG9zc2libGUgdG8gZGlzY292ZXIgYSByb3V0ZSB3aXRoIHRoZSBkZXNpcmVkIGNhcGFiaWxpdGllcworICAgICAqIGFuZCB0aGVyZWZvcmUgd2hldGhlciB0aGUgbWVkaWEgcm91dGUgYnV0dG9uIHNob3VsZCBiZSBzaG93biB0byB0aGUgdXNlci4KKyAgICAgKiA8L3A+PHA+CisgICAgICogVGhlIHtAbGluayAjQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWX0gZmxhZyBzaG91bGQgYmUgdXNlZCB3aGlsZSB0aGUgYXBwbGljYXRpb24KKyAgICAgKiBpcyBpbiB0aGUgZm9yZWdyb3VuZCB0byByZXF1ZXN0IHRoYXQgcGFzc2l2ZSBkaXNjb3ZlcnkgYmUgcGVyZm9ybWVkIGlmIHRoZXJlIGFyZQorICAgICAqIHN1ZmZpY2llbnQgcmVzb3VyY2VzIHRvIGFsbG93IGNvbnRpbnVvdXMgcGFzc2l2ZSBkaXNjb3ZlcnkuCisgICAgICogT24ge0BsaW5rIEFjdGl2aXR5TWFuYWdlciNpc0xvd1JhbURldmljZSBsb3ctUkFNIGRldmljZXN9IHRoaXMgZmxhZyB3aWxsIGJlCisgICAgICogaWdub3JlZCB0byBjb25zZXJ2ZSByZXNvdXJjZXMuCisgICAgICogPC9wPjxwPgorICAgICAqIFRoZSB7QGxpbmsgI0NBTExCQUNLX0ZMQUdfRk9SQ0VfRElTQ09WRVJZfSBmbGFnIHNob3VsZCBiZSB1c2VkIHdoZW4KKyAgICAgKiBwYXNzaXZlIGRpc2NvdmVyeSBhYnNvbHV0ZWx5IG11c3QgYmUgcGVyZm9ybWVkLCBldmVuIG9uIGxvdy1SQU0gZGV2aWNlcy4KKyAgICAgKiBUaGlzIGZsYWcgaGFzIGEgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgaW1wYWN0IG9uIGxvdy1SQU0gZGV2aWNlcworICAgICAqIHNpbmNlIGl0IG1heSBjYXVzZSBtYW55IG1lZGlhIHJvdXRlIHByb3ZpZGVycyB0byBiZSBzdGFydGVkIHNpbXVsdGFuZW91c2x5LgorICAgICAqIEl0IGlzIG11Y2ggYmV0dGVyIHRvIHVzZSB7QGxpbmsgI0NBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUll9IGluc3RlYWQgdG8gYXZvaWQKKyAgICAgKiBwZXJmb3JtaW5nIHBhc3NpdmUgZGlzY292ZXJ5IG9uIHRoZXNlIGRldmljZXMgYWx0b2dldGhlci4KKyAgICAgKiA8L3A+PHA+CisgICAgICogVGhlIHtAbGluayAjQ0FMTEJBQ0tfRkxBR19QRVJGT1JNX0FDVElWRV9TQ0FOfSBmbGFnIHNob3VsZCBiZSB1c2VkIHdoZW4gdGhlCisgICAgICogbWVkaWEgcm91dGUgY2hvb3NlciBkaWFsb2cgaXMgc2hvd2luZyB0byBjb25maXJtIHRoZSBwcmVzZW5jZSBvZiBhdmFpbGFibGUKKyAgICAgKiByb3V0ZXMgdGhhdCB0aGUgdXNlciBtYXkgY29ubmVjdCB0by4gIFRoaXMgZmxhZyBtYXkgdXNlIHN1YnN0YW50aWFsbHkgbW9yZQorICAgICAqIHBvd2VyLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIDxoMz5FeGFtcGxlPC9oMz4KKyAgICAgKiA8cHJlPgorICAgICAqIHB1YmxpYyBjbGFzcyBNeUFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgICAqICAgICBwcml2YXRlIE1lZGlhUm91dGVyIG1Sb3V0ZXI7CisgICAgICogICAgIHByaXZhdGUgTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgbUNhbGxiYWNrOworICAgICAqICAgICBwcml2YXRlIE1lZGlhUm91dGVTZWxlY3RvciBtU2VsZWN0b3I7CisgICAgICoKKyAgICAgKiAgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAqICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgKgorICAgICAqICAgICAgICAgbVJvdXRlciA9IE1lZGlhcm91dGVyLmdldEluc3RhbmNlKHRoaXMpOworICAgICAqICAgICAgICAgbUNhbGxiYWNrID0gbmV3IE15Q2FsbGJhY2soKTsKKyAgICAgKiAgICAgICAgIG1TZWxlY3RvciA9IG5ldyBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlcigpCisgICAgICogICAgICAgICAgICAgICAgIC5hZGRDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfQVVESU8pCisgICAgICogICAgICAgICAgICAgICAgIC5hZGRDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX1JFTU9URV9QTEFZQkFDSykKKyAgICAgKiAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICogICAgIH0KKyAgICAgKgorICAgICAqICAgICAvLyBBZGQgdGhlIGNhbGxiYWNrIG9uIHN0YXJ0IHRvIHRlbGwgdGhlIG1lZGlhIHJvdXRlciB3aGF0IGtpbmRzIG9mIHJvdXRlcworICAgICAqICAgICAvLyB0aGUgYXBwbGljYXRpb24gaXMgaW50ZXJlc3RlZCBpbiBzbyB0aGF0IGl0IGNhbiB0cnkgdG8gZGlzY292ZXIgc3VpdGFibGUgb25lcy4KKyAgICAgKiAgICAgcHVibGljIHZvaWQgb25TdGFydCgpIHsKKyAgICAgKiAgICAgICAgIHN1cGVyLm9uU3RhcnQoKTsKKyAgICAgKgorICAgICAqICAgICAgICAgbWVkaWFSb3V0ZXIuYWRkQ2FsbGJhY2sobVNlbGVjdG9yLCBtQ2FsbGJhY2ssCisgICAgICogICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUlkpOworICAgICAqCisgICAgICogICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBtZWRpYVJvdXRlci51cGRhdGVTZWxlY3RlZFJvdXRlKG1TZWxlY3Rvcik7CisgICAgICogICAgICAgICAvLyBkbyBzb21ldGhpbmcgd2l0aCB0aGUgcm91dGUuLi4KKyAgICAgKiAgICAgfQorICAgICAqCisgICAgICogICAgIC8vIFJlbW92ZSB0aGUgc2VsZWN0b3Igb24gc3RvcCB0byB0ZWxsIHRoZSBtZWRpYSByb3V0ZXIgdGhhdCBpdCBubyBsb25nZXIKKyAgICAgKiAgICAgLy8gbmVlZHMgdG8gaW52ZXN0IGVmZm9ydCB0cnlpbmcgdG8gZGlzY292ZXIgcm91dGVzIG9mIHRoZXNlIGtpbmRzIGZvciBub3cuCisgICAgICogICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKKyAgICAgKiAgICAgICAgIHN1cGVyLm9uU3RvcCgpOworICAgICAqCisgICAgICogICAgICAgICBtZWRpYVJvdXRlci5yZW1vdmVDYWxsYmFjayhtQ2FsbGJhY2spOworICAgICAqICAgICB9CisgICAgICoKKyAgICAgKiAgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBNeUNhbGxiYWNrIGV4dGVuZHMgTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgeworICAgICAqICAgICAgICAgLy8gSW1wbGVtZW50IGNhbGxiYWNrIG1ldGhvZHMgYXMgbmVlZGVkLgorICAgICAqICAgICB9CisgICAgICogfQorICAgICAqIDwvcHJlPgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGVjdG9yIEEgcm91dGUgc2VsZWN0b3IgdGhhdCBpbmRpY2F0ZXMgdGhlIGtpbmRzIG9mIHJvdXRlcyB0aGF0IHRoZQorICAgICAqIGNhbGxiYWNrIHdvdWxkIGxpa2UgdG8gZGlzY292ZXIuCisgICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBhZGQuCisgICAgICogQHBhcmFtIGZsYWdzIEZsYWdzIHRvIGNvbnRyb2wgdGhlIGJlaGF2aW9yIG9mIHRoZSBjYWxsYmFjay4KKyAgICAgKiBNYXkgYmUgemVybyBvciBhIGNvbWJpbmF0aW9uIG9mIHtAbGluayAjQ0FMTEJBQ0tfRkxBR19QRVJGT1JNX0FDVElWRV9TQ0FOfSBhbmQKKyAgICAgKiB7QGxpbmsgI0NBTExCQUNLX0ZMQUdfVU5GSUxURVJFRF9FVkVOVFN9LgorICAgICAqIEBzZWUgI3JlbW92ZUNhbGxiYWNrCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ2FsbGJhY2soQE5vbk51bGwgTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yLCBATm9uTnVsbCBDYWxsYmFjayBjYWxsYmFjaywKKyAgICAgICAgICAgIEBDYWxsYmFja0ZsYWdzIGludCBmbGFncykgeworICAgICAgICBpZiAoc2VsZWN0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VsZWN0b3IgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGlmIChjYWxsYmFjayA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYWxsYmFjayBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7CisKKyAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJhZGRDYWxsYmFjazogc2VsZWN0b3I9IiArIHNlbGVjdG9yCisgICAgICAgICAgICAgICAgICAgICsgIiwgY2FsbGJhY2s9IiArIGNhbGxiYWNrICsgIiwgZmxhZ3M9IiArIEludGVnZXIudG9IZXhTdHJpbmcoZmxhZ3MpKTsKKyAgICAgICAgfQorCisgICAgICAgIENhbGxiYWNrUmVjb3JkIHJlY29yZDsKKyAgICAgICAgaW50IGluZGV4ID0gZmluZENhbGxiYWNrUmVjb3JkKGNhbGxiYWNrKTsKKyAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgcmVjb3JkID0gbmV3IENhbGxiYWNrUmVjb3JkKHRoaXMsIGNhbGxiYWNrKTsKKyAgICAgICAgICAgIG1DYWxsYmFja1JlY29yZHMuYWRkKHJlY29yZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZWNvcmQgPSBtQ2FsbGJhY2tSZWNvcmRzLmdldChpbmRleCk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiB1cGRhdGVOZWVkZWQgPSBmYWxzZTsKKyAgICAgICAgaWYgKChmbGFncyAmIH5yZWNvcmQubUZsYWdzKSAhPSAwKSB7CisgICAgICAgICAgICByZWNvcmQubUZsYWdzIHw9IGZsYWdzOworICAgICAgICAgICAgdXBkYXRlTmVlZGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXJlY29yZC5tU2VsZWN0b3IuY29udGFpbnMoc2VsZWN0b3IpKSB7CisgICAgICAgICAgICByZWNvcmQubVNlbGVjdG9yID0gbmV3IE1lZGlhUm91dGVTZWxlY3Rvci5CdWlsZGVyKHJlY29yZC5tU2VsZWN0b3IpCisgICAgICAgICAgICAgICAgICAgIC5hZGRTZWxlY3RvcihzZWxlY3RvcikKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgICAgICB1cGRhdGVOZWVkZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmICh1cGRhdGVOZWVkZWQpIHsKKyAgICAgICAgICAgIHNHbG9iYWwudXBkYXRlRGlzY292ZXJ5UmVxdWVzdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGNhbGxiYWNrLiAgSXQgd2lsbCBubyBsb25nZXIgcmVjZWl2ZSBldmVudHMgYWJvdXQKKyAgICAgKiBjaGFuZ2VzIHRvIG1lZGlhIHJvdXRlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gcmVtb3ZlLgorICAgICAqIEBzZWUgI2FkZENhbGxiYWNrCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQ2FsbGJhY2soQE5vbk51bGwgQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgaWYgKGNhbGxiYWNrID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbGxiYWNrIG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKKworICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgInJlbW92ZUNhbGxiYWNrOiBjYWxsYmFjaz0iICsgY2FsbGJhY2spOworICAgICAgICB9CisKKyAgICAgICAgaW50IGluZGV4ID0gZmluZENhbGxiYWNrUmVjb3JkKGNhbGxiYWNrKTsKKyAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgIG1DYWxsYmFja1JlY29yZHMucmVtb3ZlKGluZGV4KTsKKyAgICAgICAgICAgIHNHbG9iYWwudXBkYXRlRGlzY292ZXJ5UmVxdWVzdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZmluZENhbGxiYWNrUmVjb3JkKENhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1DYWxsYmFja1JlY29yZHMuc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChtQ2FsbGJhY2tSZWNvcmRzLmdldChpKS5tQ2FsbGJhY2sgPT0gY2FsbGJhY2spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIgd2l0aGluIHRoaXMgYXBwbGljYXRpb24gcHJvY2Vzcy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgcHJvdmlkZXIgd2lsbCBiZSBhZGRlZCB0byB0aGUgbGlzdCBvZiBwcm92aWRlcnMgdGhhdCBhbGwge0BsaW5rIE1lZGlhUm91dGVyfQorICAgICAqIGluc3RhbmNlcyB3aXRoaW4gdGhpcyBwcm9jZXNzIGNhbiB1c2UgdG8gZGlzY292ZXIgcm91dGVzLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm92aWRlckluc3RhbmNlIFRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBpbnN0YW5jZSB0byBhZGQuCisgICAgICoKKyAgICAgKiBAc2VlIE1lZGlhUm91dGVQcm92aWRlcgorICAgICAqIEBzZWUgI3JlbW92ZUNhbGxiYWNrCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUHJvdmlkZXIoQE5vbk51bGwgTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVySW5zdGFuY2UpIHsKKyAgICAgICAgaWYgKHByb3ZpZGVySW5zdGFuY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicHJvdmlkZXJJbnN0YW5jZSBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7CisKKyAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJhZGRQcm92aWRlcjogIiArIHByb3ZpZGVySW5zdGFuY2UpOworICAgICAgICB9CisgICAgICAgIHNHbG9iYWwuYWRkUHJvdmlkZXIocHJvdmlkZXJJbnN0YW5jZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVW5yZWdpc3RlcnMgYSBtZWRpYSByb3V0ZSBwcm92aWRlciB3aXRoaW4gdGhpcyBhcHBsaWNhdGlvbiBwcm9jZXNzLgorICAgICAqIDxwPgorICAgICAqIFRoZSBwcm92aWRlciB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCBvZiBwcm92aWRlcnMgdGhhdCBhbGwge0BsaW5rIE1lZGlhUm91dGVyfQorICAgICAqIGluc3RhbmNlcyB3aXRoaW4gdGhpcyBwcm9jZXNzIGNhbiB1c2UgdG8gZGlzY292ZXIgcm91dGVzLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm92aWRlckluc3RhbmNlIFRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBpbnN0YW5jZSB0byByZW1vdmUuCisgICAgICoKKyAgICAgKiBAc2VlIE1lZGlhUm91dGVQcm92aWRlcgorICAgICAqIEBzZWUgI2FkZENhbGxiYWNrCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUHJvdmlkZXIoQE5vbk51bGwgTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVySW5zdGFuY2UpIHsKKyAgICAgICAgaWYgKHByb3ZpZGVySW5zdGFuY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicHJvdmlkZXJJbnN0YW5jZSBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7CisKKyAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJyZW1vdmVQcm92aWRlcjogIiArIHByb3ZpZGVySW5zdGFuY2UpOworICAgICAgICB9CisgICAgICAgIHNHbG9iYWwucmVtb3ZlUHJvdmlkZXIocHJvdmlkZXJJbnN0YW5jZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIHJlbW90ZSBjb250cm9sIGNsaWVudCB0byBlbmFibGUgcmVtb3RlIGNvbnRyb2wgb2YgdGhlIHZvbHVtZQorICAgICAqIG9mIHRoZSBzZWxlY3RlZCByb3V0ZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgcmVtb3RlIGNvbnRyb2wgY2xpZW50IG11c3QgaGF2ZSBwcmV2aW91c2x5IGJlZW4gcmVnaXN0ZXJlZCB3aXRoCisgICAgICogdGhlIGF1ZGlvIG1hbmFnZXIgdXNpbmcgdGhlIHtAbGluayBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlciNyZWdpc3RlclJlbW90ZUNvbnRyb2xDbGllbnQKKyAgICAgKiBBdWRpb01hbmFnZXIucmVnaXN0ZXJSZW1vdGVDb250cm9sQ2xpZW50fSBtZXRob2QuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHJlbW90ZUNvbnRyb2xDbGllbnQgVGhlIHtAbGluayBhbmRyb2lkLm1lZGlhLlJlbW90ZUNvbnRyb2xDbGllbnR9IHRvIHJlZ2lzdGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFJlbW90ZUNvbnRyb2xDbGllbnQoQE5vbk51bGwgT2JqZWN0IHJlbW90ZUNvbnRyb2xDbGllbnQpIHsKKyAgICAgICAgaWYgKHJlbW90ZUNvbnRyb2xDbGllbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicmVtb3RlQ29udHJvbENsaWVudCBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7CisKKyAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJhZGRSZW1vdGVDb250cm9sQ2xpZW50OiAiICsgcmVtb3RlQ29udHJvbENsaWVudCk7CisgICAgICAgIH0KKyAgICAgICAgc0dsb2JhbC5hZGRSZW1vdGVDb250cm9sQ2xpZW50KHJlbW90ZUNvbnRyb2xDbGllbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYSByZW1vdGUgY29udHJvbCBjbGllbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVtb3RlQ29udHJvbENsaWVudCBUaGUge0BsaW5rIGFuZHJvaWQubWVkaWEuUmVtb3RlQ29udHJvbENsaWVudH0KKyAgICAgKiAgICAgICAgICAgIHRvIHVucmVnaXN0ZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUmVtb3RlQ29udHJvbENsaWVudChATm9uTnVsbCBPYmplY3QgcmVtb3RlQ29udHJvbENsaWVudCkgeworICAgICAgICBpZiAocmVtb3RlQ29udHJvbENsaWVudCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyZW1vdGVDb250cm9sQ2xpZW50IG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVtb3ZlUmVtb3RlQ29udHJvbENsaWVudDogIiArIHJlbW90ZUNvbnRyb2xDbGllbnQpOworICAgICAgICB9CisgICAgICAgIHNHbG9iYWwucmVtb3ZlUmVtb3RlQ29udHJvbENsaWVudChyZW1vdGVDb250cm9sQ2xpZW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBtZWRpYSBzZXNzaW9uIHRvIGVuYWJsZSByZW1vdGUgY29udHJvbCBvZiB0aGUgdm9sdW1lIG9mIHRoZQorICAgICAqIHNlbGVjdGVkIHJvdXRlLiBUaGlzIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2YKKyAgICAgKiB7QGxpbmsgI2FkZFJlbW90ZUNvbnRyb2xDbGllbnR9IHdoZW4gdXNpbmcgbWVkaWEgc2Vzc2lvbnMuIFNldCB0aGUKKyAgICAgKiBzZXNzaW9uIHRvIG51bGwgdG8gY2xlYXIgaXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVkaWFTZXNzaW9uIFRoZSB7QGxpbmsgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhU2Vzc2lvbn0gdG8KKyAgICAgKiAgICAgICAgICAgIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNZWRpYVNlc3Npb24oT2JqZWN0IG1lZGlhU2Vzc2lvbikgeworICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgImFkZE1lZGlhU2Vzc2lvbjogIiArIG1lZGlhU2Vzc2lvbik7CisgICAgICAgIH0KKyAgICAgICAgc0dsb2JhbC5zZXRNZWRpYVNlc3Npb24obWVkaWFTZXNzaW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgY29tcGF0IG1lZGlhIHNlc3Npb24gdG8gZW5hYmxlIHJlbW90ZSBjb250cm9sIG9mIHRoZSB2b2x1bWUgb2YgdGhlCisgICAgICogc2VsZWN0ZWQgcm91dGUuIFRoaXMgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZgorICAgICAqIHtAbGluayAjYWRkUmVtb3RlQ29udHJvbENsaWVudH0gd2hlbiB1c2luZyB7QGxpbmsgTWVkaWFTZXNzaW9uQ29tcGF0fS4KKyAgICAgKiBTZXQgdGhlIHNlc3Npb24gdG8gbnVsbCB0byBjbGVhciBpdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZWRpYVNlc3Npb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNZWRpYVNlc3Npb25Db21wYXQoTWVkaWFTZXNzaW9uQ29tcGF0IG1lZGlhU2Vzc2lvbikgeworICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgImFkZE1lZGlhU2Vzc2lvbkNvbXBhdDogIiArIG1lZGlhU2Vzc2lvbik7CisgICAgICAgIH0KKyAgICAgICAgc0dsb2JhbC5zZXRNZWRpYVNlc3Npb25Db21wYXQobWVkaWFTZXNzaW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVkaWFTZXNzaW9uQ29tcGF0LlRva2VuIGdldE1lZGlhU2Vzc2lvblRva2VuKCkgeworICAgICAgICByZXR1cm4gc0dsb2JhbC5nZXRNZWRpYVNlc3Npb25Ub2tlbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuc3VyZXMgdGhhdCBjYWxscyBpbnRvIHRoZSBtZWRpYSByb3V0ZXIgYXJlIG9uIHRoZSBjb3JyZWN0IHRocmVhZC4KKyAgICAgKiBJdCBwYXlzIHRvIGJlIGEgbGl0dGxlIHBhcmFub2lkIHdoZW4gZ2xvYmFsIHN0YXRlIGludmFyaWFudHMgYXJlIGF0IHJpc2suCisgICAgICovCisgICAgc3RhdGljIHZvaWQgY2hlY2tDYWxsaW5nVGhyZWFkKCkgeworICAgICAgICBpZiAoTG9vcGVyLm15TG9vcGVyKCkgIT0gTG9vcGVyLmdldE1haW5Mb29wZXIoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIG1lZGlhIHJvdXRlciBzZXJ2aWNlIG11c3Qgb25seSBiZSAiCisgICAgICAgICAgICAgICAgICAgICsgImFjY2Vzc2VkIG9uIHRoZSBhcHBsaWNhdGlvbidzIG1haW4gdGhyZWFkLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIDxUPiBib29sZWFuIGVxdWFsKFQgYSwgVCBiKSB7CisgICAgICAgIHJldHVybiBhID09IGIgfHwgKGEgIT0gbnVsbCAmJiBiICE9IG51bGwgJiYgYS5lcXVhbHMoYikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IGEgbWVkaWEgcm91dGUuCisgICAgICogPHA+CisgICAgICogRWFjaCBtZWRpYSByb3V0ZSBoYXMgYSBsaXN0IG9mIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbH0KKyAgICAgKiB7QGxpbmsgI2dldENvbnRyb2xGaWx0ZXJzIGludGVudCBmaWx0ZXJzfSB0aGF0IGRlc2NyaWJlIHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlCisgICAgICogcm91dGUgYW5kIHRoZSBtYW5uZXIgaW4gd2hpY2ggaXQgaXMgdXNlZCBhbmQgY29udHJvbGxlZC4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSb3V0ZUluZm8geworICAgICAgICBwcml2YXRlIGZpbmFsIFByb3ZpZGVySW5mbyBtUHJvdmlkZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1EZXNjcmlwdG9ySWQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1VbmlxdWVJZDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbU5hbWU7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1EZXNjcmlwdGlvbjsKKyAgICAgICAgcHJpdmF0ZSBVcmkgbUljb25Vcmk7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtRW5hYmxlZDsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Db25uZWN0aW5nOworICAgICAgICBwcml2YXRlIGludCBtQ29ubmVjdGlvblN0YXRlOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUNhbkRpc2Nvbm5lY3Q7CisgICAgICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PEludGVudEZpbHRlcj4gbUNvbnRyb2xGaWx0ZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIHByaXZhdGUgaW50IG1QbGF5YmFja1R5cGU7CisgICAgICAgIHByaXZhdGUgaW50IG1QbGF5YmFja1N0cmVhbTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbURldmljZVR5cGU7CisgICAgICAgIHByaXZhdGUgaW50IG1Wb2x1bWVIYW5kbGluZzsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVZvbHVtZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVZvbHVtZU1heDsKKyAgICAgICAgcHJpdmF0ZSBEaXNwbGF5IG1QcmVzZW50YXRpb25EaXNwbGF5OworICAgICAgICBwcml2YXRlIGludCBtUHJlc2VudGF0aW9uRGlzcGxheUlkID0gUFJFU0VOVEFUSU9OX0RJU1BMQVlfSURfTk9ORTsKKyAgICAgICAgcHJpdmF0ZSBCdW5kbGUgbUV4dHJhczsKKyAgICAgICAgcHJpdmF0ZSBJbnRlbnRTZW5kZXIgbVNldHRpbmdzSW50ZW50OworICAgICAgICBNZWRpYVJvdXRlRGVzY3JpcHRvciBtRGVzY3JpcHRvcjsKKworICAgICAgICBASW50RGVmKHtDT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRCwgQ09OTkVDVElPTl9TVEFURV9DT05ORUNUSU5HLAorICAgICAgICAgICAgICAgIENPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVEVEfSkKKyAgICAgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQorICAgICAgICBwcml2YXRlIEBpbnRlcmZhY2UgQ29ubmVjdGlvblN0YXRlIHt9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBkZWZhdWx0IGNvbm5lY3Rpb24gc3RhdGUgaW5kaWNhdGluZyB0aGUgcm91dGUgaXMgZGlzY29ubmVjdGVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAc2VlICNnZXRDb25uZWN0aW9uU3RhdGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVEID0gMDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQSBjb25uZWN0aW9uIHN0YXRlIGluZGljYXRpbmcgdGhlIHJvdXRlIGlzIGluIHRoZSBwcm9jZXNzIG9mIGNvbm5lY3RpbmcgYW5kIGlzIG5vdCB5ZXQKKyAgICAgICAgICogcmVhZHkgZm9yIHVzZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSAjZ2V0Q29ubmVjdGlvblN0YXRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RJTkcgPSAxOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBIGNvbm5lY3Rpb24gc3RhdGUgaW5kaWNhdGluZyB0aGUgcm91dGUgaXMgY29ubmVjdGVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAc2VlICNnZXRDb25uZWN0aW9uU3RhdGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVEVEID0gMjsKKworICAgICAgICBASW50RGVmKHtQTEFZQkFDS19UWVBFX0xPQ0FMLFBMQVlCQUNLX1RZUEVfUkVNT1RFfSkKKyAgICAgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQorICAgICAgICBwcml2YXRlIEBpbnRlcmZhY2UgUGxheWJhY2tUeXBlIHt9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBkZWZhdWx0IHBsYXliYWNrIHR5cGUsICJsb2NhbCIsIGluZGljYXRpbmcgdGhlIHByZXNlbnRhdGlvbiBvZiB0aGUgbWVkaWEKKyAgICAgICAgICogaXMgaGFwcGVuaW5nIG9uIHRoZSBzYW1lIGRldmljZSAoZS5nLiBhIHBob25lLCBhIHRhYmxldCkgYXMgd2hlcmUgaXQgaXMKKyAgICAgICAgICogY29udHJvbGxlZCBmcm9tLgorICAgICAgICAgKgorICAgICAgICAgKiBAc2VlICNnZXRQbGF5YmFja1R5cGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1RZUEVfTE9DQUwgPSAwOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBIHBsYXliYWNrIHR5cGUgaW5kaWNhdGluZyB0aGUgcHJlc2VudGF0aW9uIG9mIHRoZSBtZWRpYSBpcyBoYXBwZW5pbmcgb24KKyAgICAgICAgICogYSBkaWZmZXJlbnQgZGV2aWNlIChpLmUuIHRoZSByZW1vdGUgZGV2aWNlKSB0aGFuIHdoZXJlIGl0IGlzIGNvbnRyb2xsZWQgZnJvbS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSAjZ2V0UGxheWJhY2tUeXBlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19UWVBFX1JFTU9URSA9IDE7CisKKyAgICAgICAgQEludERlZih7REVWSUNFX1RZUEVfVU5LTk9XTiwgREVWSUNFX1RZUEVfVFYsIERFVklDRV9UWVBFX1NQRUFLRVIsIERFVklDRV9UWVBFX0JMVUVUT09USH0pCisgICAgICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKKyAgICAgICAgcHJpdmF0ZSBAaW50ZXJmYWNlIERldmljZVR5cGUge30KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGRlZmF1bHQgcmVjZWl2ZXIgZGV2aWNlIHR5cGUgb2YgdGhlIHJvdXRlIGluZGljYXRpbmcgdGhlIHR5cGUgaXMgdW5rbm93bi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSAjZ2V0RGV2aWNlVHlwZQorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1RZUEVfVU5LTk9XTiA9IDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEEgcmVjZWl2ZXIgZGV2aWNlIHR5cGUgb2YgdGhlIHJvdXRlIGluZGljYXRpbmcgdGhlIHByZXNlbnRhdGlvbiBvZiB0aGUgbWVkaWEgaXMgaGFwcGVuaW5nCisgICAgICAgICAqIG9uIGEgVFYuCisgICAgICAgICAqCisgICAgICAgICAqIEBzZWUgI2dldERldmljZVR5cGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9UWVBFX1RWID0gMTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQSByZWNlaXZlciBkZXZpY2UgdHlwZSBvZiB0aGUgcm91dGUgaW5kaWNhdGluZyB0aGUgcHJlc2VudGF0aW9uIG9mIHRoZSBtZWRpYSBpcyBoYXBwZW5pbmcKKyAgICAgICAgICogb24gYSBzcGVha2VyLgorICAgICAgICAgKgorICAgICAgICAgKiBAc2VlICNnZXREZXZpY2VUeXBlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfVFlQRV9TUEVBS0VSID0gMjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQSByZWNlaXZlciBkZXZpY2UgdHlwZSBvZiB0aGUgcm91dGUgaW5kaWNhdGluZyB0aGUgcHJlc2VudGF0aW9uIG9mIHRoZSBtZWRpYSBpcyBoYXBwZW5pbmcKKyAgICAgICAgICogb24gYSBibHVldG9vdGggZGV2aWNlIHN1Y2ggYXMgYSBibHVldG9vdGggc3BlYWtlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSAjZ2V0RGV2aWNlVHlwZQorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1RZUEVfQkxVRVRPT1RIID0gMzsKKworICAgICAgICBASW50RGVmKHtQTEFZQkFDS19WT0xVTUVfRklYRUQsUExBWUJBQ0tfVk9MVU1FX1ZBUklBQkxFfSkKKyAgICAgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQorICAgICAgICBwcml2YXRlIEBpbnRlcmZhY2UgUGxheWJhY2tWb2x1bWUge30KKworICAgICAgICAvKioKKyAgICAgICAgICogUGxheWJhY2sgaW5mb3JtYXRpb24gaW5kaWNhdGluZyB0aGUgcGxheWJhY2sgdm9sdW1lIGlzIGZpeGVkLCBpLmUuIGl0IGNhbm5vdCBiZQorICAgICAgICAgKiBjb250cm9sbGVkIGZyb20gdGhpcyBvYmplY3QuIEFuIGV4YW1wbGUgb2YgZml4ZWQgcGxheWJhY2sgdm9sdW1lIGlzIGEgcmVtb3RlIHBsYXllciwKKyAgICAgICAgICogcGxheWluZyBvdmVyIEhETUkgd2hlcmUgdGhlIHVzZXIgcHJlZmVycyB0byBjb250cm9sIHRoZSB2b2x1bWUgb24gdGhlIEhETUkgc2luaywgcmF0aGVyCisgICAgICAgICAqIHRoYW4gYXR0ZW51YXRlIGF0IHRoZSBzb3VyY2UuCisgICAgICAgICAqCisgICAgICAgICAqIEBzZWUgI2dldFZvbHVtZUhhbmRsaW5nCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19WT0xVTUVfRklYRUQgPSAwOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBQbGF5YmFjayBpbmZvcm1hdGlvbiBpbmRpY2F0aW5nIHRoZSBwbGF5YmFjayB2b2x1bWUgaXMgdmFyaWFibGUgYW5kIGNhbiBiZSBjb250cm9sbGVkCisgICAgICAgICAqIGZyb20gdGhpcyBvYmplY3QuCisgICAgICAgICAqCisgICAgICAgICAqIEBzZWUgI2dldFZvbHVtZUhhbmRsaW5nCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19WT0xVTUVfVkFSSUFCTEUgPSAxOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZGVmYXVsdCBwcmVzZW50YXRpb24gZGlzcGxheSBpZCBpbmRpY2F0aW5nIG5vIHByZXNlbnRhdGlvbiBkaXNwbGF5IGlzIGFzc29jaWF0ZWQKKyAgICAgICAgICogd2l0aCB0aGUgcm91dGUuCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQorICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVTRU5UQVRJT05fRElTUExBWV9JRF9OT05FID0gLTE7CisKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBDSEFOR0VfR0VORVJBTCA9IDEgPDwgMDsKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBDSEFOR0VfVk9MVU1FID0gMSA8PCAxOworICAgICAgICBzdGF0aWMgZmluYWwgaW50IENIQU5HRV9QUkVTRU5UQVRJT05fRElTUExBWSA9IDEgPDwgMjsKKworICAgICAgICAvLyBTaG91bGQgbWF0Y2ggdG8gU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyLlBBQ0tBR0VfTkFNRS4KKyAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBTWVNURU1fTUVESUFfUk9VVEVfUFJPVklERVJfUEFDS0FHRV9OQU1FID0gImFuZHJvaWQiOworCisgICAgICAgIFJvdXRlSW5mbyhQcm92aWRlckluZm8gcHJvdmlkZXIsIFN0cmluZyBkZXNjcmlwdG9ySWQsIFN0cmluZyB1bmlxdWVJZCkgeworICAgICAgICAgICAgbVByb3ZpZGVyID0gcHJvdmlkZXI7CisgICAgICAgICAgICBtRGVzY3JpcHRvcklkID0gZGVzY3JpcHRvcklkOworICAgICAgICAgICAgbVVuaXF1ZUlkID0gdW5pcXVlSWQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHJvdmlkZXIgb2YgdGhpcyBtZWRpYSByb3V0ZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBQcm92aWRlckluZm8gZ2V0UHJvdmlkZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gbVByb3ZpZGVyOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgdGhlIHVuaXF1ZSBpZCBvZiB0aGUgcm91dGUuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGUgcm91dGUgdW5pcXVlIGlkIGZ1bmN0aW9ucyBhcyBhIHN0YWJsZSBpZGVudGlmaWVyIGJ5IHdoaWNoIHRoZSByb3V0ZSBpcyBrbm93bi4KKyAgICAgICAgICogRm9yIGV4YW1wbGUsIGFuIGFwcGxpY2F0aW9uIGNhbiB1c2UgdGhpcyBpZCBhcyBhIHRva2VuIHRvIHJlbWVtYmVyIHRoZQorICAgICAgICAgKiBzZWxlY3RlZCByb3V0ZSBhY3Jvc3MgcmVzdGFydHMgb3IgdG8gY29tbXVuaWNhdGUgaXRzIGlkZW50aXR5IHRvIGEgc2VydmljZS4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFRoZSB1bmlxdWUgaWQgb2YgdGhlIHJvdXRlLCBuZXZlciBudWxsLgorICAgICAgICAgKi8KKyAgICAgICAgQE5vbk51bGwKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtVW5pcXVlSWQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB0aGUgdXNlci12aXNpYmxlIG5hbWUgb2YgdGhlIHJvdXRlLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhlIHJvdXRlIG5hbWUgaWRlbnRpZmllcyB0aGUgZGVzdGluYXRpb24gcmVwcmVzZW50ZWQgYnkgdGhlIHJvdXRlLgorICAgICAgICAgKiBJdCBtYXkgYmUgYSB1c2VyLXN1cHBsaWVkIG5hbWUsIGFuIGFsaWFzLCBvciBkZXZpY2Ugc2VyaWFsIG51bWJlci4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFRoZSB1c2VyLXZpc2libGUgbmFtZSBvZiBhIG1lZGlhIHJvdXRlLiAgVGhpcyBpcyB0aGUgc3RyaW5nIHByZXNlbnRlZAorICAgICAgICAgKiB0byB1c2VycyB3aG8gbWF5IHNlbGVjdCB0aGlzIGFzIHRoZSBhY3RpdmUgcm91dGUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbU5hbWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB0aGUgdXNlci12aXNpYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSByb3V0ZS4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoZSByb3V0ZSBkZXNjcmlwdGlvbiBkZXNjcmliZXMgdGhlIGtpbmQgb2YgZGVzdGluYXRpb24gcmVwcmVzZW50ZWQgYnkgdGhlIHJvdXRlLgorICAgICAgICAgKiBJdCBtYXkgYmUgYSB1c2VyLXN1cHBsaWVkIHN0cmluZywgYSBtb2RlbCBudW1iZXIgb3IgYnJhbmQgb2YgZGV2aWNlLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSByb3V0ZSwgb3IgbnVsbCBpZiBub25lLgorICAgICAgICAgKi8KKyAgICAgICAgQE51bGxhYmxlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gbURlc2NyaXB0aW9uOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgdGhlIFVSSSBvZiB0aGUgaWNvbiByZXByZXNlbnRpbmcgdGhpcyByb3V0ZS4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoaXMgaWNvbiB3aWxsIGJlIHVzZWQgaW4gcGlja2VyIFVJcyBpZiBhdmFpbGFibGUuCisgICAgICAgICAqIDwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBUaGUgVVJJIG9mIHRoZSBpY29uIHJlcHJlc2VudGluZyB0aGlzIHJvdXRlLCBvciBudWxsIGlmIG5vbmUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgVXJpIGdldEljb25VcmkoKSB7CisgICAgICAgICAgICByZXR1cm4gbUljb25Vcmk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcm91dGUgaXMgZW5hYmxlZCBhbmQgbWF5IGJlIHNlbGVjdGVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyByb3V0ZSBpcyBlbmFibGVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1FbmFibGVkOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgY29ubmVjdGluZyBhbmQgaXMgbm90CisgICAgICAgICAqIHlldCByZWFkeSBmb3IgdXNlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyByb3V0ZSBpcyBpbiB0aGUgcHJvY2VzcyBvZiBjb25uZWN0aW5nLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDb25uZWN0aW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Db25uZWN0aW5nOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgdGhlIGNvbm5lY3Rpb24gc3RhdGUgb2YgdGhlIHJvdXRlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFRoZSBjb25uZWN0aW9uIHN0YXRlIG9mIHRoaXMgcm91dGU6IHtAbGluayAjQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUR9LAorICAgICAgICAgKiB7QGxpbmsgI0NPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVElOR30sIG9yIHtAbGluayAjQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUR9LgorICAgICAgICAgKi8KKyAgICAgICAgQENvbm5lY3Rpb25TdGF0ZQorICAgICAgICBwdWJsaWMgaW50IGdldENvbm5lY3Rpb25TdGF0ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ29ubmVjdGlvblN0YXRlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIGN1cnJlbnRseSBzZWxlY3RlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoaXMgcm91dGUgaXMgY3VycmVudGx5IHNlbGVjdGVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAc2VlIE1lZGlhUm91dGVyI2dldFNlbGVjdGVkUm91dGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoKSB7CisgICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKKyAgICAgICAgICAgIHJldHVybiBzR2xvYmFsLmdldFNlbGVjdGVkUm91dGUoKSA9PSB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIHRoZSBkZWZhdWx0IHJvdXRlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyByb3V0ZSBpcyB0aGUgZGVmYXVsdCByb3V0ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSBNZWRpYVJvdXRlciNnZXREZWZhdWx0Um91dGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRGVmYXVsdCgpIHsKKyAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOworICAgICAgICAgICAgcmV0dXJuIHNHbG9iYWwuZ2V0RGVmYXVsdFJvdXRlKCkgPT0gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyByb3V0ZSBpcyBhIGJsdWV0b290aCByb3V0ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoaXMgcm91dGUgaXMgYSBibHVldG9vdGggcm91dGUuCisgICAgICAgICAqCisgICAgICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIjZ2V0Qmx1ZXRvb3RoUm91dGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQmx1ZXRvb3RoKCkgeworICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7CisgICAgICAgICAgICByZXR1cm4gc0dsb2JhbC5nZXRCbHVldG9vdGhSb3V0ZSgpID09IHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcm91dGUgaXMgdGhlIGRlZmF1bHQgcm91dGUgYW5kIHRoZSBkZXZpY2Ugc3BlYWtlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoaXMgcm91dGUgaXMgdGhlIGRlZmF1bHQgcm91dGUgYW5kIHRoZSBkZXZpY2Ugc3BlYWtlci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRGV2aWNlU3BlYWtlcigpIHsKKyAgICAgICAgICAgIGludCBkZWZhdWx0QXVkaW9Sb3V0ZU5hbWVSZXNvdXJjZUlkID0gUmVzb3VyY2VzLmdldFN5c3RlbSgpLmdldElkZW50aWZpZXIoCisgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0X2F1ZGlvX3JvdXRlX25hbWUiLCAic3RyaW5nIiwgImFuZHJvaWQiKTsKKyAgICAgICAgICAgIHJldHVybiBpc0RlZmF1bHQoKQorICAgICAgICAgICAgICAgICAgICAmJiBSZXNvdXJjZXMuZ2V0U3lzdGVtKCkuZ2V0VGV4dChkZWZhdWx0QXVkaW9Sb3V0ZU5hbWVSZXNvdXJjZUlkKS5lcXVhbHMobU5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgYSBsaXN0IG9mIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBpbnRlbnR9IGZpbHRlcnMgdGhhdAorICAgICAgICAgKiBkZXNjcmliZSB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoaXMgcm91dGUgYW5kIHRoZSBtZWRpYSBjb250cm9sIGFjdGlvbnMgdGhhdAorICAgICAgICAgKiBpdCBzdXBwb3J0cy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBBIGxpc3Qgb2YgaW50ZW50IGZpbHRlcnMgdGhhdCBzcGVjaWZpZXMgdGhlIG1lZGlhIGNvbnRyb2wgaW50ZW50cyB0aGF0CisgICAgICAgICAqIHRoaXMgcm91dGUgc3VwcG9ydHMuCisgICAgICAgICAqCisgICAgICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50CisgICAgICAgICAqIEBzZWUgI3N1cHBvcnRzQ29udHJvbENhdGVnb3J5CisgICAgICAgICAqIEBzZWUgI3N1cHBvcnRzQ29udHJvbFJlcXVlc3QKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBMaXN0PEludGVudEZpbHRlcj4gZ2V0Q29udHJvbEZpbHRlcnMoKSB7CisgICAgICAgICAgICByZXR1cm4gbUNvbnRyb2xGaWx0ZXJzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgYXQgbGVhc3Qgb25lIG9mIHRoZSBjYXBhYmlsaXRpZXMKKyAgICAgICAgICogZGVzY3JpYmVkIGJ5IGEgbWVkaWEgcm91dGUgc2VsZWN0b3IuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IgdGhhdCBzcGVjaWZpZXMgdGhlIGNhcGFiaWxpdGllcyB0byBjaGVjay4KKyAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyBhdCBsZWFzdCBvbmUgb2YgdGhlIGNhcGFiaWxpdGllcworICAgICAgICAgKiBkZXNjcmliZWQgaW4gdGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlc1NlbGVjdG9yKEBOb25OdWxsIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvcikgeworICAgICAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKKyAgICAgICAgICAgIHJldHVybiBzZWxlY3Rvci5tYXRjaGVzQ29udHJvbEZpbHRlcnMobUNvbnRyb2xGaWx0ZXJzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIHRoZSBzcGVjaWZpZWQKKyAgICAgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sfSBjYXRlZ29yeS4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIE1lZGlhIGNvbnRyb2wgY2F0ZWdvcmllcyBkZXNjcmliZSB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoaXMgcm91dGUKKyAgICAgICAgICogc3VjaCBhcyB3aGV0aGVyIGl0IHN1cHBvcnRzIGxpdmUgYXVkaW8gc3RyZWFtaW5nIG9yIHJlbW90ZSBwbGF5YmFjay4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY2F0ZWdvcnkgQSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2x9IGNhdGVnb3J5CisgICAgICAgICAqIHN1Y2ggYXMge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNDQVRFR09SWV9MSVZFX0FVRElPfSwKKyAgICAgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNDQVRFR09SWV9MSVZFX1ZJREVPfSwKKyAgICAgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0t9LCBvciBhIHByb3ZpZGVyLWRlZmluZWQKKyAgICAgICAgICogbWVkaWEgY29udHJvbCBjYXRlZ29yeS4KKyAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyB0aGUgc3BlY2lmaWVkIGludGVudCBjYXRlZ29yeS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQKKyAgICAgICAgICogQHNlZSAjZ2V0Q29udHJvbEZpbHRlcnMKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzQ29udHJvbENhdGVnb3J5KEBOb25OdWxsIFN0cmluZyBjYXRlZ29yeSkgeworICAgICAgICAgICAgaWYgKGNhdGVnb3J5ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYXRlZ29yeSBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKKworICAgICAgICAgICAgaW50IGNvdW50ID0gbUNvbnRyb2xGaWx0ZXJzLnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChtQ29udHJvbEZpbHRlcnMuZ2V0KGkpLmhhc0NhdGVnb3J5KGNhdGVnb3J5KSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyB0aGUgc3BlY2lmaWVkCisgICAgICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbH0gY2F0ZWdvcnkgYW5kIGFjdGlvbi4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIE1lZGlhIGNvbnRyb2wgYWN0aW9ucyBkZXNjcmliZSBzcGVjaWZpYyByZXF1ZXN0cyB0aGF0IGFuIGFwcGxpY2F0aW9uCisgICAgICAgICAqIGNhbiBhc2sgYSByb3V0ZSB0byBwZXJmb3JtLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjYXRlZ29yeSBBIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbH0gY2F0ZWdvcnkKKyAgICAgICAgICogc3VjaCBhcyB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0NBVEVHT1JZX0xJVkVfQVVESU99LAorICAgICAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0NBVEVHT1JZX0xJVkVfVklERU99LAorICAgICAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDS30sIG9yIGEgcHJvdmlkZXItZGVmaW5lZAorICAgICAgICAgKiBtZWRpYSBjb250cm9sIGNhdGVnb3J5LgorICAgICAgICAgKiBAcGFyYW0gYWN0aW9uIEEge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sfSBhY3Rpb24KKyAgICAgICAgICogc3VjaCBhcyB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QTEFZfS4KKyAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyB0aGUgc3BlY2lmaWVkIGludGVudCBhY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50CisgICAgICAgICAqIEBzZWUgI2dldENvbnRyb2xGaWx0ZXJzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0NvbnRyb2xBY3Rpb24oQE5vbk51bGwgU3RyaW5nIGNhdGVnb3J5LCBATm9uTnVsbCBTdHJpbmcgYWN0aW9uKSB7CisgICAgICAgICAgICBpZiAoY2F0ZWdvcnkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhdGVnb3J5IG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFjdGlvbiBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKKworICAgICAgICAgICAgaW50IGNvdW50ID0gbUNvbnRyb2xGaWx0ZXJzLnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBtQ29udHJvbEZpbHRlcnMuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIuaGFzQ2F0ZWdvcnkoY2F0ZWdvcnkpICYmIGZpbHRlci5oYXNBY3Rpb24oYWN0aW9uKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyB0aGUgc3BlY2lmaWVkCisgICAgICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbH0gcmVxdWVzdC4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIE1lZGlhIGNvbnRyb2wgcmVxdWVzdHMgYXJlIHVzZWQgdG8gcmVxdWVzdCB0aGUgcm91dGUgdG8gcGVyZm9ybQorICAgICAgICAgKiBhY3Rpb25zIHN1Y2ggYXMgc3RhcnRpbmcgcmVtb3RlIHBsYXliYWNrIG9mIGEgbWVkaWEgaXRlbS4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gaW50ZW50IEEge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGludGVudH0uCisgICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcm91dGUgY2FuIGhhbmRsZSB0aGUgc3BlY2lmaWVkIGludGVudC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQKKyAgICAgICAgICogQHNlZSAjZ2V0Q29udHJvbEZpbHRlcnMKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzQ29udHJvbFJlcXVlc3QoQE5vbk51bGwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgaWYgKGludGVudCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW50ZW50IG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOworCisgICAgICAgICAgICBDb250ZW50UmVzb2x2ZXIgY29udGVudFJlc29sdmVyID0gc0dsb2JhbC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKKyAgICAgICAgICAgIGludCBjb3VudCA9IG1Db250cm9sRmlsdGVycy5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobUNvbnRyb2xGaWx0ZXJzLmdldChpKS5tYXRjaChjb250ZW50UmVzb2x2ZXIsIGludGVudCwgdHJ1ZSwgVEFHKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZW5kcyBhIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbH0gcmVxdWVzdCB0byBiZSBwZXJmb3JtZWQKKyAgICAgICAgICogYXN5bmNocm9ub3VzbHkgYnkgdGhlIHJvdXRlJ3MgZGVzdGluYXRpb24uCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBNZWRpYSBjb250cm9sIHJlcXVlc3RzIGFyZSB1c2VkIHRvIHJlcXVlc3QgdGhlIHJvdXRlIHRvIHBlcmZvcm0KKyAgICAgICAgICogYWN0aW9ucyBzdWNoIGFzIHN0YXJ0aW5nIHJlbW90ZSBwbGF5YmFjayBvZiBhIG1lZGlhIGl0ZW0uCisgICAgICAgICAqIDwvcD48cD4KKyAgICAgICAgICogVGhpcyBmdW5jdGlvbiBtYXkgb25seSBiZSBjYWxsZWQgb24gYSBzZWxlY3RlZCByb3V0ZS4gIENvbnRyb2wgcmVxdWVzdHMKKyAgICAgICAgICogc2VudCB0byB1bnNlbGVjdGVkIHJvdXRlcyB3aWxsIGZhaWwuCisgICAgICAgICAqIDwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGludGVudCBBIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBpbnRlbnR9LgorICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSB7QGxpbmsgQ29udHJvbFJlcXVlc3RDYWxsYmFja30gdG8gaW52b2tlIHdpdGggdGhlIHJlc3VsdAorICAgICAgICAgKiBvZiB0aGUgcmVxdWVzdCwgb3IgbnVsbCBpZiBubyByZXN1bHQgaXMgcmVxdWlyZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZW5kQ29udHJvbFJlcXVlc3QoQE5vbk51bGwgSW50ZW50IGludGVudCwKKyAgICAgICAgICAgICAgICBATnVsbGFibGUgQ29udHJvbFJlcXVlc3RDYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICAgICAgaWYgKGludGVudCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW50ZW50IG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOworCisgICAgICAgICAgICBzR2xvYmFsLnNlbmRDb250cm9sUmVxdWVzdCh0aGlzLCBpbnRlbnQsIGNhbGxiYWNrKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHRoZSB0eXBlIG9mIHBsYXliYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFRoZSB0eXBlIG9mIHBsYXliYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlOiB7QGxpbmsgI1BMQVlCQUNLX1RZUEVfTE9DQUx9CisgICAgICAgICAqIG9yIHtAbGluayAjUExBWUJBQ0tfVFlQRV9SRU1PVEV9LgorICAgICAgICAgKi8KKyAgICAgICAgQFBsYXliYWNrVHlwZQorICAgICAgICBwdWJsaWMgaW50IGdldFBsYXliYWNrVHlwZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtUGxheWJhY2tUeXBlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgdGhlIGF1ZGlvIHN0cmVhbSBvdmVyIHdoaWNoIHRoZSBwbGF5YmFjayBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZSBpcyBwZXJmb3JtZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gVGhlIHN0cmVhbSBvdmVyIHdoaWNoIHRoZSBwbGF5YmFjayBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZSBpcyBwZXJmb3JtZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGdldFBsYXliYWNrU3RyZWFtKCkgeworICAgICAgICAgICAgcmV0dXJuIG1QbGF5YmFja1N0cmVhbTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHRoZSB0eXBlIG9mIHRoZSByZWNlaXZlciBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGUuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gVGhlIHR5cGUgb2YgdGhlIHJlY2VpdmVyIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZToKKyAgICAgICAgICoge0BsaW5rICNERVZJQ0VfVFlQRV9UVn0gb3Ige0BsaW5rICNERVZJQ0VfVFlQRV9TUEVBS0VSfS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0RGV2aWNlVHlwZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtRGV2aWNlVHlwZTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRPckJsdWV0b290aCgpIHsKKyAgICAgICAgICAgIGlmIChpc0RlZmF1bHQoKSB8fCBtRGV2aWNlVHlwZSA9PSBERVZJQ0VfVFlQRV9CTFVFVE9PVEgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciBwbGF0Zm9ybSB2ZXJzaW9uIDIzIG9yIGJlbG93IHdoZXJlIHRoZSBzeXN0ZW0gcm91dGUKKyAgICAgICAgICAgIC8vIHByb3ZpZGVyIGRvZXNuJ3Qgc3BlY2lmeSBkZXZpY2UgdHlwZSBmb3IgYmx1ZXRvb3RoIG1lZGlhIHJvdXRlcy4KKyAgICAgICAgICAgIHJldHVybiBpc1N5c3RlbU1lZGlhUm91dGVQcm92aWRlcih0aGlzKQorICAgICAgICAgICAgICAgICAgICAmJiBzdXBwb3J0c0NvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9BVURJTykKKyAgICAgICAgICAgICAgICAgICAgJiYgIXN1cHBvcnRzQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX1ZJREVPKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGUgcm91dGUgaXMgc2VsZWN0YWJsZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2xlYW4gaXNTZWxlY3RhYmxlKCkgeworICAgICAgICAgICAgLy8gVGhpcyB0ZXN0cyB3aGV0aGVyIHRoZSByb3V0ZSBpcyBzdGlsbCB2YWxpZCBhbmQgZW5hYmxlZC4KKyAgICAgICAgICAgIC8vIFRoZSByb3V0ZSBkZXNjcmlwdG9yIGZpZWxkIGlzIHNldCB0byBudWxsIHdoZW4gdGhlIHJvdXRlIGlzIHJlbW92ZWQuCisgICAgICAgICAgICByZXR1cm4gbURlc2NyaXB0b3IgIT0gbnVsbCAmJiBtRW5hYmxlZDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7CisgICAgICAgICAgICByZXR1cm4gVGV4dFV0aWxzLmVxdWFscyhyb3V0ZS5nZXRQcm92aWRlckluc3RhbmNlKCkuZ2V0TWV0YWRhdGEoKS5nZXRQYWNrYWdlTmFtZSgpLAorICAgICAgICAgICAgICAgICAgICBTWVNURU1fTUVESUFfUk9VVEVfUFJPVklERVJfUEFDS0FHRV9OQU1FKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIGluZm9ybWF0aW9uIGFib3V0IGhvdyB2b2x1bWUgaXMgaGFuZGxlZCBvbiB0aGUgcm91dGUuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gSG93IHZvbHVtZSBpcyBoYW5kbGVkIG9uIHRoZSByb3V0ZToge0BsaW5rICNQTEFZQkFDS19WT0xVTUVfRklYRUR9CisgICAgICAgICAqIG9yIHtAbGluayAjUExBWUJBQ0tfVk9MVU1FX1ZBUklBQkxFfS4KKyAgICAgICAgICovCisgICAgICAgIEBQbGF5YmFja1ZvbHVtZQorICAgICAgICBwdWJsaWMgaW50IGdldFZvbHVtZUhhbmRsaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Wb2x1bWVIYW5kbGluZzsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHRoZSBjdXJyZW50IHZvbHVtZSBmb3IgdGhpcyByb3V0ZS4gRGVwZW5kaW5nIG9uIHRoZSByb3V0ZSwgdGhpcyBtYXkgb25seQorICAgICAgICAgKiBiZSB2YWxpZCBpZiB0aGUgcm91dGUgaXMgY3VycmVudGx5IHNlbGVjdGVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFRoZSB2b2x1bWUgYXQgd2hpY2ggdGhlIHBsYXliYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlIGlzIHBlcmZvcm1lZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Vm9sdW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Wb2x1bWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB0aGUgbWF4aW11bSB2b2x1bWUgYXQgd2hpY2ggdGhlIHBsYXliYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlIGlzIHBlcmZvcm1lZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBUaGUgbWF4aW11bSB2b2x1bWUgYXQgd2hpY2ggdGhlIHBsYXliYWNrIGFzc29jaWF0ZWQgd2l0aAorICAgICAgICAgKiB0aGlzIHJvdXRlIGlzIHBlcmZvcm1lZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Vm9sdW1lTWF4KCkgeworICAgICAgICAgICAgcmV0dXJuIG1Wb2x1bWVNYXg7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB3aGV0aGVyIHRoaXMgcm91dGUgc3VwcG9ydHMgZGlzY29ubmVjdGluZyB3aXRob3V0IGludGVycnVwdGluZworICAgICAgICAgKiBwbGF5YmFjay4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoaXMgcm91dGUgY2FuIGRpc2Nvbm5lY3Qgd2l0aG91dCBzdG9wcGluZyBwbGF5YmFjaywKKyAgICAgICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBjYW5EaXNjb25uZWN0KCkgeworICAgICAgICAgICAgcmV0dXJuIG1DYW5EaXNjb25uZWN0OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlcXVlc3RzIGEgdm9sdW1lIGNoYW5nZSBmb3IgdGhpcyByb3V0ZSBhc3luY2hyb25vdXNseS4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoaXMgZnVuY3Rpb24gbWF5IG9ubHkgYmUgY2FsbGVkIG9uIGEgc2VsZWN0ZWQgcm91dGUuICBJdCB3aWxsIGhhdmUKKyAgICAgICAgICogbm8gZWZmZWN0IGlmIHRoZSByb3V0ZSBpcyBjdXJyZW50bHkgdW5zZWxlY3RlZC4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdm9sdW1lIFRoZSBuZXcgdm9sdW1lIHZhbHVlIGJldHdlZW4gMCBhbmQge0BsaW5rICNnZXRWb2x1bWVNYXh9LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgcmVxdWVzdFNldFZvbHVtZShpbnQgdm9sdW1lKSB7CisgICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKKyAgICAgICAgICAgIHNHbG9iYWwucmVxdWVzdFNldFZvbHVtZSh0aGlzLCBNYXRoLm1pbihtVm9sdW1lTWF4LCBNYXRoLm1heCgwLCB2b2x1bWUpKSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVxdWVzdHMgYW4gaW5jcmVtZW50YWwgdm9sdW1lIHVwZGF0ZSBmb3IgdGhpcyByb3V0ZSBhc3luY2hyb25vdXNseS4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoaXMgZnVuY3Rpb24gbWF5IG9ubHkgYmUgY2FsbGVkIG9uIGEgc2VsZWN0ZWQgcm91dGUuICBJdCB3aWxsIGhhdmUKKyAgICAgICAgICogbm8gZWZmZWN0IGlmIHRoZSByb3V0ZSBpcyBjdXJyZW50bHkgdW5zZWxlY3RlZC4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZGVsdGEgVGhlIGRlbHRhIHRvIGFkZCB0byB0aGUgY3VycmVudCB2b2x1bWUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCByZXF1ZXN0VXBkYXRlVm9sdW1lKGludCBkZWx0YSkgeworICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7CisgICAgICAgICAgICBpZiAoZGVsdGEgIT0gMCkgeworICAgICAgICAgICAgICAgIHNHbG9iYWwucmVxdWVzdFVwZGF0ZVZvbHVtZSh0aGlzLCBkZWx0YSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB0aGUge0BsaW5rIERpc3BsYXl9IHRoYXQgc2hvdWxkIGJlIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHRvIHNob3cKKyAgICAgICAgICogYSB7QGxpbmsgYW5kcm9pZC5hcHAuUHJlc2VudGF0aW9ufSBvbiBhbiBleHRlcm5hbCBkaXNwbGF5IHdoZW4gdGhpcyByb3V0ZSBpcyBzZWxlY3RlZC4KKyAgICAgICAgICogRGVwZW5kaW5nIG9uIHRoZSByb3V0ZSwgdGhpcyBtYXkgb25seSBiZSB2YWxpZCBpZiB0aGUgcm91dGUgaXMgY3VycmVudGx5CisgICAgICAgICAqIHNlbGVjdGVkLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhlIHByZWZlcnJlZCBwcmVzZW50YXRpb24gZGlzcGxheSBtYXkgY2hhbmdlIGluZGVwZW5kZW50bHkgb2YgdGhlIHJvdXRlCisgICAgICAgICAqIGJlaW5nIHNlbGVjdGVkIG9yIHVuc2VsZWN0ZWQuICBGb3IgZXhhbXBsZSwgdGhlIHByZXNlbnRhdGlvbiBkaXNwbGF5CisgICAgICAgICAqIG9mIHRoZSBkZWZhdWx0IHN5c3RlbSByb3V0ZSBtYXkgY2hhbmdlIHdoZW4gYW4gZXh0ZXJuYWwgSERNSSBkaXNwbGF5IGlzIGNvbm5lY3RlZAorICAgICAgICAgKiBvciBkaXNjb25uZWN0ZWQgZXZlbiB0aG91Z2ggdGhlIHJvdXRlIGl0c2VsZiBoYXMgbm90IGNoYW5nZWQuCisgICAgICAgICAqIDwvcD48cD4KKyAgICAgICAgICogVGhpcyBtZXRob2QgbWF5IHJldHVybiBudWxsIGlmIHRoZXJlIGlzIG5vIGV4dGVybmFsIGRpc3BsYXkgYXNzb2NpYXRlZCB3aXRoCisgICAgICAgICAqIHRoZSByb3V0ZSBvciBpZiB0aGUgZGlzcGxheSBpcyBub3QgcmVhZHkgdG8gc2hvdyBVSSB5ZXQuCisgICAgICAgICAqIDwvcD48cD4KKyAgICAgICAgICogVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBsaXN0ZW4gZm9yIGNoYW5nZXMgdG8gdGhlIHByZXNlbnRhdGlvbiBkaXNwbGF5CisgICAgICAgICAqIHVzaW5nIHRoZSB7QGxpbmsgQ2FsbGJhY2sjb25Sb3V0ZVByZXNlbnRhdGlvbkRpc3BsYXlDaGFuZ2VkfSBjYWxsYmFjayBhbmQKKyAgICAgICAgICogc2hvdyBvciBkaXNtaXNzIGl0cyB7QGxpbmsgYW5kcm9pZC5hcHAuUHJlc2VudGF0aW9ufSBhY2NvcmRpbmdseSB3aGVuIHRoZSBkaXNwbGF5CisgICAgICAgICAqIGJlY29tZXMgYXZhaWxhYmxlIG9yIGlzIHJlbW92ZWQuCisgICAgICAgICAqIDwvcD48cD4KKyAgICAgICAgICogVGhpcyBtZXRob2Qgb25seSBtYWtlcyBzZW5zZSBmb3IKKyAgICAgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNDQVRFR09SWV9MSVZFX1ZJREVPIGxpdmUgdmlkZW99IHJvdXRlcy4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFRoZSBwcmVmZXJyZWQgcHJlc2VudGF0aW9uIGRpc3BsYXkgdG8gdXNlIHdoZW4gdGhpcyByb3V0ZSBpcworICAgICAgICAgKiBzZWxlY3RlZCBvciBudWxsIGlmIG5vbmUuCisgICAgICAgICAqCisgICAgICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0NBVEVHT1JZX0xJVkVfVklERU8KKyAgICAgICAgICogQHNlZSBhbmRyb2lkLmFwcC5QcmVzZW50YXRpb24KKyAgICAgICAgICovCisgICAgICAgIEBOdWxsYWJsZQorICAgICAgICBwdWJsaWMgRGlzcGxheSBnZXRQcmVzZW50YXRpb25EaXNwbGF5KCkgeworICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7CisgICAgICAgICAgICBpZiAobVByZXNlbnRhdGlvbkRpc3BsYXlJZCA+PSAwICYmIG1QcmVzZW50YXRpb25EaXNwbGF5ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtUHJlc2VudGF0aW9uRGlzcGxheSA9IHNHbG9iYWwuZ2V0RGlzcGxheShtUHJlc2VudGF0aW9uRGlzcGxheUlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtUHJlc2VudGF0aW9uRGlzcGxheTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHRoZSByb3V0ZSdzIHByZXNlbnRhdGlvbiBkaXNwbGF5IGlkLCBvciAtMSBpZiBub25lLgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKKyAgICAgICAgcHVibGljIGludCBnZXRQcmVzZW50YXRpb25EaXNwbGF5SWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbVByZXNlbnRhdGlvbkRpc3BsYXlJZDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIGEgY29sbGVjdGlvbiBvZiBleHRyYSBwcm9wZXJ0aWVzIGFib3V0IHRoaXMgcm91dGUgdGhhdCB3ZXJlIHN1cHBsaWVkCisgICAgICAgICAqIGJ5IGl0cyBtZWRpYSByb3V0ZSBwcm92aWRlciwgb3IgbnVsbCBpZiBub25lLgorICAgICAgICAgKi8KKyAgICAgICAgQE51bGxhYmxlCisgICAgICAgIHB1YmxpYyBCdW5kbGUgZ2V0RXh0cmFzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1FeHRyYXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyBhbiBpbnRlbnQgc2VuZGVyIGZvciBsYXVuY2hpbmcgYSBzZXR0aW5ncyBhY3Rpdml0eSBmb3IgdGhpcworICAgICAgICAgKiByb3V0ZS4KKyAgICAgICAgICovCisgICAgICAgIEBOdWxsYWJsZQorICAgICAgICBwdWJsaWMgSW50ZW50U2VuZGVyIGdldFNldHRpbmdzSW50ZW50KCkgeworICAgICAgICAgICAgcmV0dXJuIG1TZXR0aW5nc0ludGVudDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZWxlY3RzIHRoaXMgbWVkaWEgcm91dGUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3QoKSB7CisgICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKKyAgICAgICAgICAgIHNHbG9iYWwuc2VsZWN0Um91dGUodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiTWVkaWFSb3V0ZXIuUm91dGVJbmZveyB1bmlxdWVJZD0iICsgbVVuaXF1ZUlkCisgICAgICAgICAgICAgICAgICAgICsgIiwgbmFtZT0iICsgbU5hbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBkZXNjcmlwdGlvbj0iICsgbURlc2NyaXB0aW9uCisgICAgICAgICAgICAgICAgICAgICsgIiwgaWNvblVyaT0iICsgbUljb25VcmkKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBlbmFibGVkPSIgKyBtRW5hYmxlZAorICAgICAgICAgICAgICAgICAgICArICIsIGNvbm5lY3Rpbmc9IiArIG1Db25uZWN0aW5nCisgICAgICAgICAgICAgICAgICAgICsgIiwgY29ubmVjdGlvblN0YXRlPSIgKyBtQ29ubmVjdGlvblN0YXRlCisgICAgICAgICAgICAgICAgICAgICsgIiwgY2FuRGlzY29ubmVjdD0iICsgbUNhbkRpc2Nvbm5lY3QKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBwbGF5YmFja1R5cGU9IiArIG1QbGF5YmFja1R5cGUKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBwbGF5YmFja1N0cmVhbT0iICsgbVBsYXliYWNrU3RyZWFtCisgICAgICAgICAgICAgICAgICAgICsgIiwgZGV2aWNlVHlwZT0iICsgbURldmljZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgKyAiLCB2b2x1bWVIYW5kbGluZz0iICsgbVZvbHVtZUhhbmRsaW5nCisgICAgICAgICAgICAgICAgICAgICsgIiwgdm9sdW1lPSIgKyBtVm9sdW1lCisgICAgICAgICAgICAgICAgICAgICsgIiwgdm9sdW1lTWF4PSIgKyBtVm9sdW1lTWF4CisgICAgICAgICAgICAgICAgICAgICsgIiwgcHJlc2VudGF0aW9uRGlzcGxheUlkPSIgKyBtUHJlc2VudGF0aW9uRGlzcGxheUlkCisgICAgICAgICAgICAgICAgICAgICsgIiwgZXh0cmFzPSIgKyBtRXh0cmFzCisgICAgICAgICAgICAgICAgICAgICsgIiwgc2V0dGluZ3NJbnRlbnQ9IiArIG1TZXR0aW5nc0ludGVudAorICAgICAgICAgICAgICAgICAgICArICIsIHByb3ZpZGVyUGFja2FnZU5hbWU9IiArIG1Qcm92aWRlci5nZXRQYWNrYWdlTmFtZSgpCisgICAgICAgICAgICAgICAgICAgICsgIiB9IjsKKyAgICAgICAgfQorCisgICAgICAgIGludCBtYXliZVVwZGF0ZURlc2NyaXB0b3IoTWVkaWFSb3V0ZURlc2NyaXB0b3IgZGVzY3JpcHRvcikgeworICAgICAgICAgICAgaW50IGNoYW5nZXMgPSAwOworICAgICAgICAgICAgaWYgKG1EZXNjcmlwdG9yICE9IGRlc2NyaXB0b3IpIHsKKyAgICAgICAgICAgICAgICBjaGFuZ2VzID0gdXBkYXRlRGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjaGFuZ2VzOworICAgICAgICB9CisKKyAgICAgICAgaW50IHVwZGF0ZURlc2NyaXB0b3IoTWVkaWFSb3V0ZURlc2NyaXB0b3IgZGVzY3JpcHRvcikgeworICAgICAgICAgICAgaW50IGNoYW5nZXMgPSAwOworICAgICAgICAgICAgbURlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOworICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmICghZXF1YWwobU5hbWUsIGRlc2NyaXB0b3IuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBtTmFtZSA9IGRlc2NyaXB0b3IuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWVxdWFsKG1EZXNjcmlwdGlvbiwgZGVzY3JpcHRvci5nZXREZXNjcmlwdGlvbigpKSkgeworICAgICAgICAgICAgICAgICAgICBtRGVzY3JpcHRpb24gPSBkZXNjcmlwdG9yLmdldERlc2NyaXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghZXF1YWwobUljb25VcmksIGRlc2NyaXB0b3IuZ2V0SWNvblVyaSgpKSkgeworICAgICAgICAgICAgICAgICAgICBtSWNvblVyaSA9IGRlc2NyaXB0b3IuZ2V0SWNvblVyaSgpOworICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobUVuYWJsZWQgIT0gZGVzY3JpcHRvci5pc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBtRW5hYmxlZCA9IGRlc2NyaXB0b3IuaXNFbmFibGVkKCk7CisgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtQ29ubmVjdGluZyAhPSBkZXNjcmlwdG9yLmlzQ29ubmVjdGluZygpKSB7CisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW5nID0gZGVzY3JpcHRvci5pc0Nvbm5lY3RpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1Db25uZWN0aW9uU3RhdGUgIT0gZGVzY3JpcHRvci5nZXRDb25uZWN0aW9uU3RhdGUoKSkgeworICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvblN0YXRlID0gZGVzY3JpcHRvci5nZXRDb25uZWN0aW9uU3RhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFtQ29udHJvbEZpbHRlcnMuZXF1YWxzKGRlc2NyaXB0b3IuZ2V0Q29udHJvbEZpbHRlcnMoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xGaWx0ZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIG1Db250cm9sRmlsdGVycy5hZGRBbGwoZGVzY3JpcHRvci5nZXRDb250cm9sRmlsdGVycygpKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1QbGF5YmFja1R5cGUgIT0gZGVzY3JpcHRvci5nZXRQbGF5YmFja1R5cGUoKSkgeworICAgICAgICAgICAgICAgICAgICBtUGxheWJhY2tUeXBlID0gZGVzY3JpcHRvci5nZXRQbGF5YmFja1R5cGUoKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1QbGF5YmFja1N0cmVhbSAhPSBkZXNjcmlwdG9yLmdldFBsYXliYWNrU3RyZWFtKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbVBsYXliYWNrU3RyZWFtID0gZGVzY3JpcHRvci5nZXRQbGF5YmFja1N0cmVhbSgpOworICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobURldmljZVR5cGUgIT0gZGVzY3JpcHRvci5nZXREZXZpY2VUeXBlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbURldmljZVR5cGUgPSBkZXNjcmlwdG9yLmdldERldmljZVR5cGUoKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1Wb2x1bWVIYW5kbGluZyAhPSBkZXNjcmlwdG9yLmdldFZvbHVtZUhhbmRsaW5nKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbVZvbHVtZUhhbmRsaW5nID0gZGVzY3JpcHRvci5nZXRWb2x1bWVIYW5kbGluZygpOworICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMIHwgQ0hBTkdFX1ZPTFVNRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1Wb2x1bWUgIT0gZGVzY3JpcHRvci5nZXRWb2x1bWUoKSkgeworICAgICAgICAgICAgICAgICAgICBtVm9sdW1lID0gZGVzY3JpcHRvci5nZXRWb2x1bWUoKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTCB8IENIQU5HRV9WT0xVTUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtVm9sdW1lTWF4ICE9IGRlc2NyaXB0b3IuZ2V0Vm9sdW1lTWF4KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbVZvbHVtZU1heCA9IGRlc2NyaXB0b3IuZ2V0Vm9sdW1lTWF4KCk7CisgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUwgfCBDSEFOR0VfVk9MVU1FOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobVByZXNlbnRhdGlvbkRpc3BsYXlJZCAhPSBkZXNjcmlwdG9yLmdldFByZXNlbnRhdGlvbkRpc3BsYXlJZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1QcmVzZW50YXRpb25EaXNwbGF5SWQgPSBkZXNjcmlwdG9yLmdldFByZXNlbnRhdGlvbkRpc3BsYXlJZCgpOworICAgICAgICAgICAgICAgICAgICBtUHJlc2VudGF0aW9uRGlzcGxheSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUwgfCBDSEFOR0VfUFJFU0VOVEFUSU9OX0RJU1BMQVk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghZXF1YWwobUV4dHJhcywgZGVzY3JpcHRvci5nZXRFeHRyYXMoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUV4dHJhcyA9IGRlc2NyaXB0b3IuZ2V0RXh0cmFzKCk7CisgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghZXF1YWwobVNldHRpbmdzSW50ZW50LCBkZXNjcmlwdG9yLmdldFNldHRpbmdzQWN0aXZpdHkoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzSW50ZW50ID0gZGVzY3JpcHRvci5nZXRTZXR0aW5nc0FjdGl2aXR5KCk7CisgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtQ2FuRGlzY29ubmVjdCAhPSBkZXNjcmlwdG9yLmNhbkRpc2Nvbm5lY3RBbmRLZWVwUGxheWluZygpKSB7CisgICAgICAgICAgICAgICAgICAgIG1DYW5EaXNjb25uZWN0ID0gZGVzY3JpcHRvci5jYW5EaXNjb25uZWN0QW5kS2VlcFBsYXlpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTCB8IENIQU5HRV9QUkVTRU5UQVRJT05fRElTUExBWTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY2hhbmdlczsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBnZXREZXNjcmlwdG9ySWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbURlc2NyaXB0b3JJZDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBAaGlkZSAqLworICAgICAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQorICAgICAgICBwdWJsaWMgTWVkaWFSb3V0ZVByb3ZpZGVyIGdldFByb3ZpZGVySW5zdGFuY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gbVByb3ZpZGVyLmdldFByb3ZpZGVySW5zdGFuY2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEluZm9ybWF0aW9uIGFib3V0IGEgcm91dGUgdGhhdCBjb25zaXN0cyBvZiBtdWx0aXBsZSBvdGhlciByb3V0ZXMgaW4gYSBncm91cC4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSb3V0ZUdyb3VwIGV4dGVuZHMgUm91dGVJbmZvIHsKKyAgICAgICAgcHJpdmF0ZSBMaXN0PFJvdXRlSW5mbz4gbVJvdXRlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgICAgIFJvdXRlR3JvdXAoUHJvdmlkZXJJbmZvIHByb3ZpZGVyLCBTdHJpbmcgZGVzY3JpcHRvcklkLCBTdHJpbmcgdW5pcXVlSWQpIHsKKyAgICAgICAgICAgIHN1cGVyKHByb3ZpZGVyLCBkZXNjcmlwdG9ySWQsIHVuaXF1ZUlkKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2Ygcm91dGVzIGluIHRoaXMgZ3JvdXAKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Um91dGVDb3VudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtUm91dGVzLnNpemUoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSByb3V0ZSBpbiB0aGlzIGdyb3VwIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGluZGV4IEluZGV4IHRvIGZldGNoCisgICAgICAgICAqIEByZXR1cm4gVGhlIHJvdXRlIGF0IGluZGV4CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgUm91dGVJbmZvIGdldFJvdXRlQXQoaW50IGluZGV4KSB7CisgICAgICAgICAgICByZXR1cm4gbVJvdXRlcy5nZXQoaW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIHJvdXRlcyBpbiB0aGlzIGdyb3VwCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgdGhlIHJvdXRlcyBpbiB0aGlzIGdyb3VwCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTGlzdDxSb3V0ZUluZm8+IGdldFJvdXRlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBtUm91dGVzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoc3VwZXIudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoJ1snKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1Sb3V0ZXMuc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSBzYi5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKG1Sb3V0ZXMuZ2V0KGkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNiLmFwcGVuZCgnXScpOworICAgICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgaW50IG1heWJlVXBkYXRlRGVzY3JpcHRvcihNZWRpYVJvdXRlRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7CisgICAgICAgICAgICBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChtRGVzY3JpcHRvciAhPSBkZXNjcmlwdG9yKSB7CisgICAgICAgICAgICAgICAgbURlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOworICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGdyb3VwTWVtYmVySWRzID0gZGVzY3JpcHRvci5nZXRHcm91cE1lbWJlcklkcygpOworICAgICAgICAgICAgICAgICAgICBMaXN0PFJvdXRlSW5mbz4gcm91dGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSBncm91cE1lbWJlcklkcy5zaXplKCkgIT0gbVJvdXRlcy5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGdyb3VwTWVtYmVySWQgOiBncm91cE1lbWJlcklkcykgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVuaXF1ZUlkID0gc0dsb2JhbC5nZXRVbmlxdWVJZChnZXRQcm92aWRlcigpLCBncm91cE1lbWJlcklkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJvdXRlSW5mbyBncm91cE1lbWJlciA9IHNHbG9iYWwuZ2V0Um91dGUodW5pcXVlSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwTWVtYmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZXMuYWRkKGdyb3VwTWVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoYW5nZWQgJiYgIW1Sb3V0ZXMuY29udGFpbnMoZ3JvdXBNZW1iZXIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoY2hhbmdlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVJvdXRlcyA9IHJvdXRlczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAoY2hhbmdlZCA/IENIQU5HRV9HRU5FUkFMIDogMCkgfCBzdXBlci51cGRhdGVEZXNjcmlwdG9yKGRlc2NyaXB0b3IpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgYSBtZWRpYSByb3V0ZSBwcm92aWRlci4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG9iamVjdCBtYXkgYmUgdXNlZCB0byBkZXRlcm1pbmUgd2hpY2ggbWVkaWEgcm91dGUgcHJvdmlkZXIgaGFzCisgICAgICogcHVibGlzaGVkIGEgcGFydGljdWxhciByb3V0ZS4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQcm92aWRlckluZm8geworICAgICAgICBwcml2YXRlIGZpbmFsIE1lZGlhUm91dGVQcm92aWRlciBtUHJvdmlkZXJJbnN0YW5jZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFJvdXRlSW5mbz4gbVJvdXRlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXJNZXRhZGF0YSBtTWV0YWRhdGE7CisgICAgICAgIHByaXZhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBtRGVzY3JpcHRvcjsKKyAgICAgICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlc291cmNlczsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1SZXNvdXJjZXNOb3RBdmFpbGFibGU7CisKKyAgICAgICAgUHJvdmlkZXJJbmZvKE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlcikgeworICAgICAgICAgICAgbVByb3ZpZGVySW5zdGFuY2UgPSBwcm92aWRlcjsKKyAgICAgICAgICAgIG1NZXRhZGF0YSA9IHByb3ZpZGVyLmdldE1ldGFkYXRhKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB0aGUgcHJvdmlkZXIncyB1bmRlcmx5aW5nIHtAbGluayBNZWRpYVJvdXRlUHJvdmlkZXJ9IGluc3RhbmNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE1lZGlhUm91dGVQcm92aWRlciBnZXRQcm92aWRlckluc3RhbmNlKCkgeworICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7CisgICAgICAgICAgICByZXR1cm4gbVByb3ZpZGVySW5zdGFuY2U7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbU1ldGFkYXRhLmdldFBhY2thZ2VOYW1lKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB0aGUgY29tcG9uZW50IG5hbWUgb2YgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIENvbXBvbmVudE5hbWUgZ2V0Q29tcG9uZW50TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTWV0YWRhdGEuZ2V0Q29tcG9uZW50TmFtZSgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgdGhlIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGVzfSBwdWJsaXNoZWQgYnkgdGhpcyByb3V0ZSBwcm92aWRlci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBMaXN0PFJvdXRlSW5mbz4gZ2V0Um91dGVzKCkgeworICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7CisgICAgICAgICAgICByZXR1cm4gbVJvdXRlczsKKyAgICAgICAgfQorCisgICAgICAgIFJlc291cmNlcyBnZXRSZXNvdXJjZXMoKSB7CisgICAgICAgICAgICBpZiAobVJlc291cmNlcyA9PSBudWxsICYmICFtUmVzb3VyY2VzTm90QXZhaWxhYmxlKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gZ2V0UGFja2FnZU5hbWUoKTsKKyAgICAgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBzR2xvYmFsLmdldFByb3ZpZGVyQ29udGV4dChwYWNrYWdlTmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJVbmFibGUgdG8gb2J0YWluIHJlc291cmNlcyBmb3Igcm91dGUgcHJvdmlkZXIgcGFja2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcGFja2FnZU5hbWUpOworICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzTm90QXZhaWxhYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbVJlc291cmNlczsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gdXBkYXRlRGVzY3JpcHRvcihNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKKyAgICAgICAgICAgIGlmIChtRGVzY3JpcHRvciAhPSBkZXNjcmlwdG9yKSB7CisgICAgICAgICAgICAgICAgbURlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaW50IGZpbmRSb3V0ZUJ5RGVzY3JpcHRvcklkKFN0cmluZyBpZCkgeworICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVJvdXRlcy5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobVJvdXRlcy5nZXQoaSkubURlc2NyaXB0b3JJZC5lcXVhbHMoaWQpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJNZWRpYVJvdXRlci5Sb3V0ZVByb3ZpZGVySW5mb3sgcGFja2FnZU5hbWU9IiArIGdldFBhY2thZ2VOYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiIH0iOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJmYWNlIGZvciByZWNlaXZpbmcgZXZlbnRzIGFib3V0IG1lZGlhIHJvdXRpbmcgY2hhbmdlcy4KKyAgICAgKiBBbGwgbWV0aG9kcyBvZiB0aGlzIGludGVyZmFjZSB3aWxsIGJlIGNhbGxlZCBmcm9tIHRoZSBhcHBsaWNhdGlvbidzIG1haW4gdGhyZWFkLgorICAgICAqIDxwPgorICAgICAqIEEgQ2FsbGJhY2sgd2lsbCBvbmx5IHJlY2VpdmUgZXZlbnRzIHJlbGV2YW50IHRvIHJvdXRlcyB0aGF0IHRoZSBjYWxsYmFjaworICAgICAqIHdhcyByZWdpc3RlcmVkIGZvciB1bmxlc3MgdGhlIHtAbGluayBNZWRpYVJvdXRlciNDQUxMQkFDS19GTEFHX1VORklMVEVSRURfRVZFTlRTfQorICAgICAqIGZsYWcgd2FzIHNwZWNpZmllZCBpbiB7QGxpbmsgTWVkaWFSb3V0ZXIjYWRkQ2FsbGJhY2soTWVkaWFSb3V0ZVNlbGVjdG9yLCBDYWxsYmFjaywgaW50KX0uCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHNlZSBNZWRpYVJvdXRlciNhZGRDYWxsYmFjayhNZWRpYVJvdXRlU2VsZWN0b3IsIENhbGxiYWNrLCBpbnQpCisgICAgICogQHNlZSBNZWRpYVJvdXRlciNyZW1vdmVDYWxsYmFjayhDYWxsYmFjaykKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIENhbGxiYWNrIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBzdXBwbGllZCBtZWRpYSByb3V0ZSBiZWNvbWVzIHNlbGVjdGVkIGFzIHRoZSBhY3RpdmUgcm91dGUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSByb3V0ZXIgVGhlIG1lZGlhIHJvdXRlciByZXBvcnRpbmcgdGhlIGV2ZW50LgorICAgICAgICAgKiBAcGFyYW0gcm91dGUgVGhlIHJvdXRlIHRoYXQgaGFzIGJlZW4gc2VsZWN0ZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlU2VsZWN0ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBSb3V0ZUluZm8gcm91dGUpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgc3VwcGxpZWQgbWVkaWEgcm91dGUgYmVjb21lcyB1bnNlbGVjdGVkIGFzIHRoZSBhY3RpdmUgcm91dGUuCisgICAgICAgICAqIEZvciBkZXRhaWxlZCByZWFzb24sIG92ZXJyaWRlIHtAbGluayAjb25Sb3V0ZVVuc2VsZWN0ZWQoTWVkaWFSb3V0ZXIsIFJvdXRlSW5mbywgaW50KX0KKyAgICAgICAgICogaW5zdGVhZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHJvdXRlciBUaGUgbWVkaWEgcm91dGVyIHJlcG9ydGluZyB0aGUgZXZlbnQuCisgICAgICAgICAqIEBwYXJhbSByb3V0ZSBUaGUgcm91dGUgdGhhdCBoYXMgYmVlbiB1bnNlbGVjdGVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVVuc2VsZWN0ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBSb3V0ZUluZm8gcm91dGUpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgc3VwcGxpZWQgbWVkaWEgcm91dGUgYmVjb21lcyB1bnNlbGVjdGVkIGFzIHRoZSBhY3RpdmUgcm91dGUuCisgICAgICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGNhbGxzIHtAbGluayAjb25Sb3V0ZVVuc2VsZWN0ZWR9LgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhlIHJlYXNvbiBwcm92aWRlZCB3aWxsIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorICAgICAgICAgKiA8dWw+CisgICAgICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX1VOS05PV059PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fRElTQ09OTkVDVEVEfTwvbGk+CisgICAgICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX1NUT1BQRUR9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fUk9VVEVfQ0hBTkdFRH08L2xpPgorICAgICAgICAgKiA8L3VsPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KKyAgICAgICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB0aGF0IGhhcyBiZWVuIHVuc2VsZWN0ZWQuCisgICAgICAgICAqIEBwYXJhbSByZWFzb24gVGhlIHJlYXNvbiBmb3IgdW5zZWxlY3RpbmcgdGhlIHJvdXRlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVVuc2VsZWN0ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBSb3V0ZUluZm8gcm91dGUsIGludCByZWFzb24pIHsKKyAgICAgICAgICAgIG9uUm91dGVVbnNlbGVjdGVkKHJvdXRlciwgcm91dGUpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIGEgbWVkaWEgcm91dGUgaGFzIGJlZW4gYWRkZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSByb3V0ZXIgVGhlIG1lZGlhIHJvdXRlciByZXBvcnRpbmcgdGhlIGV2ZW50LgorICAgICAgICAgKiBAcGFyYW0gcm91dGUgVGhlIHJvdXRlIHRoYXQgaGFzIGJlY29tZSBhdmFpbGFibGUgZm9yIHVzZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVBZGRlZChNZWRpYVJvdXRlciByb3V0ZXIsIFJvdXRlSW5mbyByb3V0ZSkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIGEgbWVkaWEgcm91dGUgaGFzIGJlZW4gcmVtb3ZlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHJvdXRlciBUaGUgbWVkaWEgcm91dGVyIHJlcG9ydGluZyB0aGUgZXZlbnQuCisgICAgICAgICAqIEBwYXJhbSByb3V0ZSBUaGUgcm91dGUgdGhhdCBoYXMgYmVlbiByZW1vdmVkIGZyb20gYXZhaWxhYmlsaXR5LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVJlbW92ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBSb3V0ZUluZm8gcm91dGUpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIHByb3BlcnR5IG9mIHRoZSBpbmRpY2F0ZWQgbWVkaWEgcm91dGUgaGFzIGNoYW5nZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSByb3V0ZXIgVGhlIG1lZGlhIHJvdXRlciByZXBvcnRpbmcgdGhlIGV2ZW50LgorICAgICAgICAgKiBAcGFyYW0gcm91dGUgVGhlIHJvdXRlIHRoYXQgd2FzIGNoYW5nZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQ2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIFJvdXRlSW5mbyByb3V0ZSkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIGEgbWVkaWEgcm91dGUncyB2b2x1bWUgY2hhbmdlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHJvdXRlciBUaGUgbWVkaWEgcm91dGVyIHJlcG9ydGluZyB0aGUgZXZlbnQuCisgICAgICAgICAqIEBwYXJhbSByb3V0ZSBUaGUgcm91dGUgd2hvc2Ugdm9sdW1lIGNoYW5nZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVm9sdW1lQ2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIFJvdXRlSW5mbyByb3V0ZSkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIGEgbWVkaWEgcm91dGUncyBwcmVzZW50YXRpb24gZGlzcGxheSBjaGFuZ2VzLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSByb3V0ZSdzIHByZXNlbnRhdGlvbiBkaXNwbGF5IGJlY29tZXMKKyAgICAgICAgICogYXZhaWxhYmxlLCBpcyByZW1vdmVkIG9yIGhhcyBjaGFuZ2VzIHRvIHNvbWUgb2YgaXRzIHByb3BlcnRpZXMgKHN1Y2ggYXMgaXRzIHNpemUpLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSByb3V0ZXIgVGhlIG1lZGlhIHJvdXRlciByZXBvcnRpbmcgdGhlIGV2ZW50LgorICAgICAgICAgKiBAcGFyYW0gcm91dGUgVGhlIHJvdXRlIHdob3NlIHByZXNlbnRhdGlvbiBkaXNwbGF5IGNoYW5nZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBzZWUgUm91dGVJbmZvI2dldFByZXNlbnRhdGlvbkRpc3BsYXkoKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVByZXNlbnRhdGlvbkRpc3BsYXlDaGFuZ2VkKE1lZGlhUm91dGVyIHJvdXRlciwgUm91dGVJbmZvIHJvdXRlKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBtZWRpYSByb3V0ZSBwcm92aWRlciBoYXMgYmVlbiBhZGRlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHJvdXRlciBUaGUgbWVkaWEgcm91dGVyIHJlcG9ydGluZyB0aGUgZXZlbnQuCisgICAgICAgICAqIEBwYXJhbSBwcm92aWRlciBUaGUgcHJvdmlkZXIgdGhhdCBoYXMgYmVjb21lIGF2YWlsYWJsZSBmb3IgdXNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlckFkZGVkKE1lZGlhUm91dGVyIHJvdXRlciwgUHJvdmlkZXJJbmZvIHByb3ZpZGVyKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBtZWRpYSByb3V0ZSBwcm92aWRlciBoYXMgYmVlbiByZW1vdmVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KKyAgICAgICAgICogQHBhcmFtIHByb3ZpZGVyIFRoZSBwcm92aWRlciB0aGF0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSBhdmFpbGFiaWxpdHkuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvblByb3ZpZGVyUmVtb3ZlZChNZWRpYVJvdXRlciByb3V0ZXIsIFByb3ZpZGVySW5mbyBwcm92aWRlcikgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIGEgcHJvcGVydHkgb2YgdGhlIGluZGljYXRlZCBtZWRpYSByb3V0ZSBwcm92aWRlciBoYXMgY2hhbmdlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHJvdXRlciBUaGUgbWVkaWEgcm91dGVyIHJlcG9ydGluZyB0aGUgZXZlbnQuCisgICAgICAgICAqIEBwYXJhbSBwcm92aWRlciBUaGUgcHJvdmlkZXIgdGhhdCB3YXMgY2hhbmdlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvdmlkZXJDaGFuZ2VkKE1lZGlhUm91dGVyIHJvdXRlciwgUHJvdmlkZXJJbmZvIHByb3ZpZGVyKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsYmFjayB3aGljaCBpcyBpbnZva2VkIHdpdGggdGhlIHJlc3VsdCBvZiBhIG1lZGlhIGNvbnRyb2wgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBzZWUgUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQ29udHJvbFJlcXVlc3RDYWxsYmFjayB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lZGlhIGNvbnRyb2wgcmVxdWVzdCBzdWNjZWVkcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGRhdGEgUmVzdWx0IGRhdGEsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgICAgICogQ29udGVudHMgZGVwZW5kIG9uIHRoZSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgYWN0aW9ufS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBtZWRpYSBjb250cm9sIHJlcXVlc3QgZmFpbHMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBlcnJvciBBIGxvY2FsaXplZCBlcnJvciBtZXNzYWdlIHdoaWNoIG1heSBiZSBzaG93biB0byB0aGUgdXNlciwgb3IgbnVsbAorICAgICAgICAgKiBpZiB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yIGlzIHVuY2xlYXIuCisgICAgICAgICAqIEBwYXJhbSBkYXRhIEVycm9yIGRhdGEsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgICAgICogQ29udGVudHMgZGVwZW5kIG9uIHRoZSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgYWN0aW9ufS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoU3RyaW5nIGVycm9yLCBCdW5kbGUgZGF0YSkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgQ2FsbGJhY2tSZWNvcmQgeworICAgICAgICBwdWJsaWMgZmluYWwgTWVkaWFSb3V0ZXIgbVJvdXRlcjsKKyAgICAgICAgcHVibGljIGZpbmFsIENhbGxiYWNrIG1DYWxsYmFjazsKKyAgICAgICAgcHVibGljIE1lZGlhUm91dGVTZWxlY3RvciBtU2VsZWN0b3I7CisgICAgICAgIHB1YmxpYyBpbnQgbUZsYWdzOworCisgICAgICAgIHB1YmxpYyBDYWxsYmFja1JlY29yZChNZWRpYVJvdXRlciByb3V0ZXIsIENhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgICAgICBtUm91dGVyID0gcm91dGVyOworICAgICAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgICAgICAgICBtU2VsZWN0b3IgPSBNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBmaWx0ZXJSb3V0ZUV2ZW50KFJvdXRlSW5mbyByb3V0ZSkgeworICAgICAgICAgICAgcmV0dXJuIChtRmxhZ3MgJiBDQUxMQkFDS19GTEFHX1VORklMVEVSRURfRVZFTlRTKSAhPSAwCisgICAgICAgICAgICAgICAgICAgIHx8IHJvdXRlLm1hdGNoZXNTZWxlY3RvcihtU2VsZWN0b3IpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2xvYmFsIHN0YXRlIGZvciB0aGUgbWVkaWEgcm91dGVyLgorICAgICAqIDxwPgorICAgICAqIE1lZGlhIHJvdXRlcyBhbmQgbWVkaWEgcm91dGUgcHJvdmlkZXJzIGFyZSBnbG9iYWwgdG8gdGhlIHByb2Nlc3M7IHRoZWlyCisgICAgICogc3RhdGUgYW5kIHRoZSBidWxrIG9mIHRoZSBtZWRpYSByb3V0ZXIgaW1wbGVtZW50YXRpb24gbGl2ZXMgaGVyZS4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgR2xvYmFsTWVkaWFSb3V0ZXIKKyAgICAgICAgICAgIGltcGxlbWVudHMgU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyLlN5bmNDYWxsYmFjaywKKyAgICAgICAgICAgIFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXJXYXRjaGVyLkNhbGxiYWNrIHsKKyAgICAgICAgZmluYWwgQ29udGV4dCBtQXBwbGljYXRpb25Db250ZXh0OworICAgICAgICBmaW5hbCBBcnJheUxpc3Q8V2Vha1JlZmVyZW5jZTxNZWRpYVJvdXRlcj4+IG1Sb3V0ZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFJvdXRlSW5mbz4gbVJvdXRlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBwcml2YXRlIGZpbmFsIE1hcDxQYWlyPFN0cmluZywgU3RyaW5nPiwgU3RyaW5nPiBtVW5pcXVlSWRNYXAgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFByb3ZpZGVySW5mbz4gbVByb3ZpZGVycyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxSZW1vdGVDb250cm9sQ2xpZW50UmVjb3JkPiBtUmVtb3RlQ29udHJvbENsaWVudHMgPQorICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmaW5hbCBSZW1vdGVDb250cm9sQ2xpZW50Q29tcGF0LlBsYXliYWNrSW5mbyBtUGxheWJhY2tJbmZvID0KKyAgICAgICAgICAgICAgICBuZXcgUmVtb3RlQ29udHJvbENsaWVudENvbXBhdC5QbGF5YmFja0luZm8oKTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlckNhbGxiYWNrIG1Qcm92aWRlckNhbGxiYWNrID0gbmV3IFByb3ZpZGVyQ2FsbGJhY2soKTsKKyAgICAgICAgZmluYWwgQ2FsbGJhY2tIYW5kbGVyIG1DYWxsYmFja0hhbmRsZXIgPSBuZXcgQ2FsbGJhY2tIYW5kbGVyKCk7CisgICAgICAgIHByaXZhdGUgZmluYWwgRGlzcGxheU1hbmFnZXJDb21wYXQgbURpc3BsYXlNYW5hZ2VyOworICAgICAgICBmaW5hbCBTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIgbVN5c3RlbVByb3ZpZGVyOworICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbUxvd1JhbTsKKworICAgICAgICBwcml2YXRlIFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXJXYXRjaGVyIG1SZWdpc3RlcmVkUHJvdmlkZXJXYXRjaGVyOworICAgICAgICBwcml2YXRlIFJvdXRlSW5mbyBtRGVmYXVsdFJvdXRlOworICAgICAgICBwcml2YXRlIFJvdXRlSW5mbyBtQmx1ZXRvb3RoUm91dGU7CisgICAgICAgIFJvdXRlSW5mbyBtU2VsZWN0ZWRSb3V0ZTsKKyAgICAgICAgcHJpdmF0ZSBSb3V0ZUNvbnRyb2xsZXIgbVNlbGVjdGVkUm91dGVDb250cm9sbGVyOworICAgICAgICAvLyBBIG1hcCBmcm9tIHJvdXRlIGRlc2NyaXB0b3IgSUQgdG8gUm91dGVDb250cm9sbGVyIGZvciB0aGUgbWVtYmVyIHJvdXRlcyBpbiB0aGUgY3VycmVudGx5CisgICAgICAgIC8vIHNlbGVjdGVkIHJvdXRlIGdyb3VwLgorICAgICAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFJvdXRlQ29udHJvbGxlcj4gbVJvdXRlQ29udHJvbGxlck1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCBtRGlzY292ZXJ5UmVxdWVzdDsKKyAgICAgICAgcHJpdmF0ZSBNZWRpYVNlc3Npb25SZWNvcmQgbU1lZGlhU2Vzc2lvbjsKKyAgICAgICAgTWVkaWFTZXNzaW9uQ29tcGF0IG1SY2NNZWRpYVNlc3Npb247CisgICAgICAgIHByaXZhdGUgTWVkaWFTZXNzaW9uQ29tcGF0IG1Db21wYXRTZXNzaW9uOworICAgICAgICBwcml2YXRlIE1lZGlhU2Vzc2lvbkNvbXBhdC5PbkFjdGl2ZUNoYW5nZUxpc3RlbmVyIG1TZXNzaW9uQWN0aXZlTGlzdGVuZXIgPQorICAgICAgICAgICAgICAgIG5ldyBNZWRpYVNlc3Npb25Db21wYXQuT25BY3RpdmVDaGFuZ2VMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25BY3RpdmVDaGFuZ2VkKCkgeworICAgICAgICAgICAgICAgIGlmKG1SY2NNZWRpYVNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobVJjY01lZGlhU2Vzc2lvbi5pc0FjdGl2ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRSZW1vdGVDb250cm9sQ2xpZW50KG1SY2NNZWRpYVNlc3Npb24uZ2V0UmVtb3RlQ29udHJvbENsaWVudCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZVJlbW90ZUNvbnRyb2xDbGllbnQobVJjY01lZGlhU2Vzc2lvbi5nZXRSZW1vdGVDb250cm9sQ2xpZW50KCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIEdsb2JhbE1lZGlhUm91dGVyKENvbnRleHQgYXBwbGljYXRpb25Db250ZXh0KSB7CisgICAgICAgICAgICBtQXBwbGljYXRpb25Db250ZXh0ID0gYXBwbGljYXRpb25Db250ZXh0OworICAgICAgICAgICAgbURpc3BsYXlNYW5hZ2VyID0gRGlzcGxheU1hbmFnZXJDb21wYXQuZ2V0SW5zdGFuY2UoYXBwbGljYXRpb25Db250ZXh0KTsKKyAgICAgICAgICAgIG1Mb3dSYW0gPSBBY3Rpdml0eU1hbmFnZXJDb21wYXQuaXNMb3dSYW1EZXZpY2UoCisgICAgICAgICAgICAgICAgICAgIChBY3Rpdml0eU1hbmFnZXIpYXBwbGljYXRpb25Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dC5BQ1RJVklUWV9TRVJWSUNFKSk7CisKKyAgICAgICAgICAgIC8vIEFkZCB0aGUgc3lzdGVtIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGZvciBpbnRlcm9wZXJhdGluZyB3aXRoCisgICAgICAgICAgICAvLyB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlci4gIFRoaXMgb25lIGlzIHNwZWNpYWwgYW5kIHJlY2VpdmVzCisgICAgICAgICAgICAvLyBzeW5jaHJvbml6YXRpb24gbWVzc2FnZXMgZnJvbSB0aGUgbWVkaWEgcm91dGVyLgorICAgICAgICAgICAgbVN5c3RlbVByb3ZpZGVyID0gU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyLm9idGFpbihhcHBsaWNhdGlvbkNvbnRleHQsIHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc3RhcnQoKSB7CisgICAgICAgICAgICBhZGRQcm92aWRlcihtU3lzdGVtUHJvdmlkZXIpOworCisgICAgICAgICAgICAvLyBTdGFydCB3YXRjaGluZyBmb3Igcm91dGVzIHB1Ymxpc2hlZCBieSByZWdpc3RlcmVkIG1lZGlhIHJvdXRlCisgICAgICAgICAgICAvLyBwcm92aWRlciBzZXJ2aWNlcy4KKyAgICAgICAgICAgIG1SZWdpc3RlcmVkUHJvdmlkZXJXYXRjaGVyID0gbmV3IFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXJXYXRjaGVyKAorICAgICAgICAgICAgICAgICAgICBtQXBwbGljYXRpb25Db250ZXh0LCB0aGlzKTsKKyAgICAgICAgICAgIG1SZWdpc3RlcmVkUHJvdmlkZXJXYXRjaGVyLnN0YXJ0KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTWVkaWFSb3V0ZXIgZ2V0Um91dGVyKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgTWVkaWFSb3V0ZXIgcm91dGVyOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1Sb3V0ZXJzLnNpemUoKTsgLS1pID49IDA7ICkgeworICAgICAgICAgICAgICAgIHJvdXRlciA9IG1Sb3V0ZXJzLmdldChpKS5nZXQoKTsKKyAgICAgICAgICAgICAgICBpZiAocm91dGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbVJvdXRlcnMucmVtb3ZlKGkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocm91dGVyLm1Db250ZXh0ID09IGNvbnRleHQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvdXRlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByb3V0ZXIgPSBuZXcgTWVkaWFSb3V0ZXIoY29udGV4dCk7CisgICAgICAgICAgICBtUm91dGVycy5hZGQobmV3IFdlYWtSZWZlcmVuY2U8TWVkaWFSb3V0ZXI+KHJvdXRlcikpOworICAgICAgICAgICAgcmV0dXJuIHJvdXRlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb250ZW50UmVzb2x2ZXIgZ2V0Q29udGVudFJlc29sdmVyKCkgeworICAgICAgICAgICAgcmV0dXJuIG1BcHBsaWNhdGlvbkNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ29udGV4dCBnZXRQcm92aWRlckNvbnRleHQoU3RyaW5nIHBhY2thZ2VOYW1lKSB7CisgICAgICAgICAgICBpZiAocGFja2FnZU5hbWUuZXF1YWxzKFN5c3RlbU1lZGlhUm91dGVQcm92aWRlci5QQUNLQUdFX05BTUUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1BcHBsaWNhdGlvbkNvbnRleHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBtQXBwbGljYXRpb25Db250ZXh0LmNyZWF0ZVBhY2thZ2VDb250ZXh0KAorICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUsIENvbnRleHQuQ09OVEVYVF9SRVNUUklDVEVEKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIERpc3BsYXkgZ2V0RGlzcGxheShpbnQgZGlzcGxheUlkKSB7CisgICAgICAgICAgICByZXR1cm4gbURpc3BsYXlNYW5hZ2VyLmdldERpc3BsYXkoZGlzcGxheUlkKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNlbmRDb250cm9sUmVxdWVzdChSb3V0ZUluZm8gcm91dGUsCisgICAgICAgICAgICAgICAgSW50ZW50IGludGVudCwgQ29udHJvbFJlcXVlc3RDYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICAgICAgaWYgKHJvdXRlID09IG1TZWxlY3RlZFJvdXRlICYmIG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlci5vbkNvbnRyb2xSZXF1ZXN0KGludGVudCwgY2FsbGJhY2spKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uRXJyb3IobnVsbCwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZXF1ZXN0U2V0Vm9sdW1lKFJvdXRlSW5mbyByb3V0ZSwgaW50IHZvbHVtZSkgeworICAgICAgICAgICAgaWYgKHJvdXRlID09IG1TZWxlY3RlZFJvdXRlICYmIG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVNlbGVjdGVkUm91dGVDb250cm9sbGVyLm9uU2V0Vm9sdW1lKHZvbHVtZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFtUm91dGVDb250cm9sbGVyTWFwLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIFJvdXRlQ29udHJvbGxlciBjb250cm9sbGVyID0gbVJvdXRlQ29udHJvbGxlck1hcC5nZXQocm91dGUubURlc2NyaXB0b3JJZCk7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLm9uU2V0Vm9sdW1lKHZvbHVtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVxdWVzdFVwZGF0ZVZvbHVtZShSb3V0ZUluZm8gcm91dGUsIGludCBkZWx0YSkgeworICAgICAgICAgICAgaWYgKHJvdXRlID09IG1TZWxlY3RlZFJvdXRlICYmIG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVNlbGVjdGVkUm91dGVDb250cm9sbGVyLm9uVXBkYXRlVm9sdW1lKGRlbHRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBSb3V0ZUluZm8gZ2V0Um91dGUoU3RyaW5nIHVuaXF1ZUlkKSB7CisgICAgICAgICAgICBmb3IgKFJvdXRlSW5mbyBpbmZvIDogbVJvdXRlcykgeworICAgICAgICAgICAgICAgIGlmIChpbmZvLm1VbmlxdWVJZC5lcXVhbHModW5pcXVlSWQpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmZvOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIExpc3Q8Um91dGVJbmZvPiBnZXRSb3V0ZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbVJvdXRlczsKKyAgICAgICAgfQorCisgICAgICAgIExpc3Q8UHJvdmlkZXJJbmZvPiBnZXRQcm92aWRlcnMoKSB7CisgICAgICAgICAgICByZXR1cm4gbVByb3ZpZGVyczsKKyAgICAgICAgfQorCisgICAgICAgIEBOb25OdWxsIFJvdXRlSW5mbyBnZXREZWZhdWx0Um91dGUoKSB7CisgICAgICAgICAgICBpZiAobURlZmF1bHRSb3V0ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIG9uY2UgdGhlIG1lZGlhIHJvdXRlciBoYXMgYmVlbiBmdWxseQorICAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemVkIGJ1dCBpdCBpcyBnb29kIHRvIGNoZWNrIGZvciB0aGUgZXJyb3IgaW4gY2FzZSB0aGVyZQorICAgICAgICAgICAgICAgIC8vIGlzIGEgYnVnIGluIHByb3ZpZGVyIGluaXRpYWxpemF0aW9uLgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZXJlIGlzIG5vIGRlZmF1bHQgcm91dGUuICAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJUaGUgbWVkaWEgcm91dGVyIGhhcyBub3QgeWV0IGJlZW4gZnVsbHkgaW5pdGlhbGl6ZWQuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbURlZmF1bHRSb3V0ZTsKKyAgICAgICAgfQorCisgICAgICAgIFJvdXRlSW5mbyBnZXRCbHVldG9vdGhSb3V0ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQmx1ZXRvb3RoUm91dGU7CisgICAgICAgIH0KKworICAgICAgICBATm9uTnVsbCBSb3V0ZUluZm8gZ2V0U2VsZWN0ZWRSb3V0ZSgpIHsKKyAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIG9uY2UgdGhlIG1lZGlhIHJvdXRlciBoYXMgYmVlbiBmdWxseQorICAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemVkIGJ1dCBpdCBpcyBnb29kIHRvIGNoZWNrIGZvciB0aGUgZXJyb3IgaW4gY2FzZSB0aGVyZQorICAgICAgICAgICAgICAgIC8vIGlzIGEgYnVnIGluIHByb3ZpZGVyIGluaXRpYWxpemF0aW9uLgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZXJlIGlzIG5vIGN1cnJlbnRseSBzZWxlY3RlZCByb3V0ZS4gICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIlRoZSBtZWRpYSByb3V0ZXIgaGFzIG5vdCB5ZXQgYmVlbiBmdWxseSBpbml0aWFsaXplZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtU2VsZWN0ZWRSb3V0ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2VsZWN0Um91dGUoQE5vbk51bGwgUm91dGVJbmZvIHJvdXRlKSB7CisgICAgICAgICAgICBzZWxlY3RSb3V0ZShyb3V0ZSwgTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX1JPVVRFX0NIQU5HRUQpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzZWxlY3RSb3V0ZShATm9uTnVsbCBSb3V0ZUluZm8gcm91dGUsIGludCB1bnNlbGVjdFJlYXNvbikgeworICAgICAgICAgICAgaWYgKCFtUm91dGVzLmNvbnRhaW5zKHJvdXRlKSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIklnbm9yaW5nIGF0dGVtcHQgdG8gc2VsZWN0IHJlbW92ZWQgcm91dGU6ICIgKyByb3V0ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFyb3V0ZS5tRW5hYmxlZCkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIklnbm9yaW5nIGF0dGVtcHQgdG8gc2VsZWN0IGRpc2FibGVkIHJvdXRlOiAiICsgcm91dGUpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldFNlbGVjdGVkUm91dGVJbnRlcm5hbChyb3V0ZSwgdW5zZWxlY3RSZWFzb24pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSb3V0ZUF2YWlsYWJsZShNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IsIGludCBmbGFncykgeworICAgICAgICAgICAgaWYgKHNlbGVjdG9yLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gT24gbG93LVJBTSBkZXZpY2VzLCBkbyBub3QgcmVseSBvbiBhY3R1YWwgZGlzY292ZXJ5IHJlc3VsdHMgdW5sZXNzIGFza2VkIHRvLgorICAgICAgICAgICAgaWYgKChmbGFncyAmIEFWQUlMQUJJTElUWV9GTEFHX1JFUVVJUkVfTUFUQ0gpID09IDAgJiYgbUxvd1JhbSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDaGVjayB3aGV0aGVyIGFueSBleGlzdGluZyByb3V0ZXMgbWF0Y2ggdGhlIHNlbGVjdG9yLgorICAgICAgICAgICAgZmluYWwgaW50IHJvdXRlQ291bnQgPSBtUm91dGVzLnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm91dGVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgUm91dGVJbmZvIHJvdXRlID0gbVJvdXRlcy5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKChmbGFncyAmIEFWQUlMQUJJTElUWV9GTEFHX0lHTk9SRV9ERUZBVUxUX1JPVVRFKSAhPSAwCisgICAgICAgICAgICAgICAgICAgICAgICAmJiByb3V0ZS5pc0RlZmF1bHRPckJsdWV0b290aCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocm91dGUubWF0Y2hlc1NlbGVjdG9yKHNlbGVjdG9yKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEl0IGRvZXNuJ3QgbG9vayBsaWtlIHdlIGNhbiBmaW5kIGEgbWF0Y2hpbmcgcm91dGUgcmlnaHQgbm93LgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlRGlzY292ZXJ5UmVxdWVzdCgpIHsKKyAgICAgICAgICAgIC8vIENvbWJpbmUgYWxsIG9mIHRoZSBjYWxsYmFjayBzZWxlY3RvcnMgYW5kIGFjdGl2ZSBzY2FuIGZsYWdzLgorICAgICAgICAgICAgYm9vbGVhbiBkaXNjb3ZlciA9IGZhbHNlOworICAgICAgICAgICAgYm9vbGVhbiBhY3RpdmVTY2FuID0gZmFsc2U7CisgICAgICAgICAgICBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlciBidWlsZGVyID0gbmV3IE1lZGlhUm91dGVTZWxlY3Rvci5CdWlsZGVyKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gbVJvdXRlcnMuc2l6ZSgpOyAtLWkgPj0gMDsgKSB7CisgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIgcm91dGVyID0gbVJvdXRlcnMuZ2V0KGkpLmdldCgpOworICAgICAgICAgICAgICAgIGlmIChyb3V0ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtUm91dGVycy5yZW1vdmUoaSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gcm91dGVyLm1DYWxsYmFja1JlY29yZHMuc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNvdW50OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENhbGxiYWNrUmVjb3JkIGNhbGxiYWNrID0gcm91dGVyLm1DYWxsYmFja1JlY29yZHMuZ2V0KGopOworICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hZGRTZWxlY3RvcihjYWxsYmFjay5tU2VsZWN0b3IpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChjYWxsYmFjay5tRmxhZ3MgJiBDQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU4pICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVTY2FuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjb3ZlciA9IHRydWU7IC8vIHBlcmZvcm0gYWN0aXZlIHNjYW4gaW1wbGllcyByZXF1ZXN0IGRpc2NvdmVyeQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChjYWxsYmFjay5tRmxhZ3MgJiBDQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtTG93UmFtKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvdmVyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGNhbGxiYWNrLm1GbGFncyAmIENBTExCQUNLX0ZMQUdfRk9SQ0VfRElTQ09WRVJZKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzY292ZXIgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yID0gZGlzY292ZXIgPyBidWlsZGVyLmJ1aWxkKCkgOiBNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFk7CisKKyAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBkaXNjb3ZlcnkgcmVxdWVzdC4KKyAgICAgICAgICAgIGlmIChtRGlzY292ZXJ5UmVxdWVzdCAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICYmIG1EaXNjb3ZlcnlSZXF1ZXN0LmdldFNlbGVjdG9yKCkuZXF1YWxzKHNlbGVjdG9yKQorICAgICAgICAgICAgICAgICAgICAmJiBtRGlzY292ZXJ5UmVxdWVzdC5pc0FjdGl2ZVNjYW4oKSA9PSBhY3RpdmVTY2FuKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBubyBjaGFuZ2UKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzZWxlY3Rvci5pc0VtcHR5KCkgJiYgIWFjdGl2ZVNjYW4pIHsKKyAgICAgICAgICAgICAgICAvLyBEaXNjb3ZlcnkgaXMgbm90IG5lZWRlZC4KKyAgICAgICAgICAgICAgICBpZiAobURpc2NvdmVyeVJlcXVlc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIG5vIGNoYW5nZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtRGlzY292ZXJ5UmVxdWVzdCA9IG51bGw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIERpc2NvdmVyeSBpcyBuZWVkZWQuCisgICAgICAgICAgICAgICAgbURpc2NvdmVyeVJlcXVlc3QgPSBuZXcgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3Qoc2VsZWN0b3IsIGFjdGl2ZVNjYW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiVXBkYXRlZCBkaXNjb3ZlcnkgcmVxdWVzdDogIiArIG1EaXNjb3ZlcnlSZXF1ZXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkaXNjb3ZlciAmJiAhYWN0aXZlU2NhbiAmJiBtTG93UmFtKSB7CisgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiRm9yY2luZyBwYXNzaXZlIHJvdXRlIGRpc2NvdmVyeSBvbiBhIGxvdy1SQU0gZGV2aWNlLCAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJzeXN0ZW0gcGVyZm9ybWFuY2UgbWF5IGJlIGFmZmVjdGVkLiAgUGxlYXNlIGNvbnNpZGVyIHVzaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIkNBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUlkgaW5zdGVhZCBvZiAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJDQUxMQkFDS19GTEFHX0ZPUkNFX0RJU0NPVkVSWS4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gTm90aWZ5IHByb3ZpZGVycy4KKyAgICAgICAgICAgIGZpbmFsIGludCBwcm92aWRlckNvdW50ID0gbVByb3ZpZGVycy5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3ZpZGVyQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIG1Qcm92aWRlcnMuZ2V0KGkpLm1Qcm92aWRlckluc3RhbmNlLnNldERpc2NvdmVyeVJlcXVlc3QobURpc2NvdmVyeVJlcXVlc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZFByb3ZpZGVyKE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlckluc3RhbmNlKSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kUHJvdmlkZXJJbmZvKHByb3ZpZGVySW5zdGFuY2UpOworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgIC8vIDEuIEFkZCB0aGUgcHJvdmlkZXIgdG8gdGhlIGxpc3QuCisgICAgICAgICAgICAgICAgUHJvdmlkZXJJbmZvIHByb3ZpZGVyID0gbmV3IFByb3ZpZGVySW5mbyhwcm92aWRlckluc3RhbmNlKTsKKyAgICAgICAgICAgICAgICBtUHJvdmlkZXJzLmFkZChwcm92aWRlcik7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlByb3ZpZGVyIGFkZGVkOiAiICsgcHJvdmlkZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnBvc3QoQ2FsbGJhY2tIYW5kbGVyLk1TR19QUk9WSURFUl9BRERFRCwgcHJvdmlkZXIpOworICAgICAgICAgICAgICAgIC8vIDIuIENyZWF0ZSB0aGUgcHJvdmlkZXIncyBjb250ZW50cy4KKyAgICAgICAgICAgICAgICB1cGRhdGVQcm92aWRlckNvbnRlbnRzKHByb3ZpZGVyLCBwcm92aWRlckluc3RhbmNlLmdldERlc2NyaXB0b3IoKSk7CisgICAgICAgICAgICAgICAgLy8gMy4gUmVnaXN0ZXIgdGhlIHByb3ZpZGVyIGNhbGxiYWNrLgorICAgICAgICAgICAgICAgIHByb3ZpZGVySW5zdGFuY2Uuc2V0Q2FsbGJhY2sobVByb3ZpZGVyQ2FsbGJhY2spOworICAgICAgICAgICAgICAgIC8vIDQuIFNldCB0aGUgZGlzY292ZXJ5IHJlcXVlc3QuCisgICAgICAgICAgICAgICAgcHJvdmlkZXJJbnN0YW5jZS5zZXREaXNjb3ZlcnlSZXF1ZXN0KG1EaXNjb3ZlcnlSZXF1ZXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmVQcm92aWRlcihNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXJJbnN0YW5jZSkgeworICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFByb3ZpZGVySW5mbyhwcm92aWRlckluc3RhbmNlKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gMS4gVW5yZWdpc3RlciB0aGUgcHJvdmlkZXIgY2FsbGJhY2suCisgICAgICAgICAgICAgICAgcHJvdmlkZXJJbnN0YW5jZS5zZXRDYWxsYmFjayhudWxsKTsKKyAgICAgICAgICAgICAgICAvLyAyLiBDbGVhciB0aGUgZGlzY292ZXJ5IHJlcXVlc3QuCisgICAgICAgICAgICAgICAgcHJvdmlkZXJJbnN0YW5jZS5zZXREaXNjb3ZlcnlSZXF1ZXN0KG51bGwpOworICAgICAgICAgICAgICAgIC8vIDMuIERlbGV0ZSB0aGUgcHJvdmlkZXIncyBjb250ZW50cy4KKyAgICAgICAgICAgICAgICBQcm92aWRlckluZm8gcHJvdmlkZXIgPSBtUHJvdmlkZXJzLmdldChpbmRleCk7CisgICAgICAgICAgICAgICAgdXBkYXRlUHJvdmlkZXJDb250ZW50cyhwcm92aWRlciwgbnVsbCk7CisgICAgICAgICAgICAgICAgLy8gNC4gUmVtb3ZlIHRoZSBwcm92aWRlciBmcm9tIHRoZSBsaXN0LgorICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJQcm92aWRlciByZW1vdmVkOiAiICsgcHJvdmlkZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnBvc3QoQ2FsbGJhY2tIYW5kbGVyLk1TR19QUk9WSURFUl9SRU1PVkVELCBwcm92aWRlcik7CisgICAgICAgICAgICAgICAgbVByb3ZpZGVycy5yZW1vdmUoaW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdm9pZCB1cGRhdGVQcm92aWRlckRlc2NyaXB0b3IoTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kUHJvdmlkZXJJbmZvKHByb3ZpZGVySW5zdGFuY2UpOworICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHByb3ZpZGVyJ3MgY29udGVudHMuCisgICAgICAgICAgICAgICAgUHJvdmlkZXJJbmZvIHByb3ZpZGVyID0gbVByb3ZpZGVycy5nZXQoaW5kZXgpOworICAgICAgICAgICAgICAgIHVwZGF0ZVByb3ZpZGVyQ29udGVudHMocHJvdmlkZXIsIGRlc2NyaXB0b3IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgZmluZFByb3ZpZGVySW5mbyhNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXJJbnN0YW5jZSkgeworICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVByb3ZpZGVycy5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobVByb3ZpZGVycy5nZXQoaSkubVByb3ZpZGVySW5zdGFuY2UgPT0gcHJvdmlkZXJJbnN0YW5jZSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgdXBkYXRlUHJvdmlkZXJDb250ZW50cyhQcm92aWRlckluZm8gcHJvdmlkZXIsCisgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBwcm92aWRlckRlc2NyaXB0b3IpIHsKKyAgICAgICAgICAgIGlmIChwcm92aWRlci51cGRhdGVEZXNjcmlwdG9yKHByb3ZpZGVyRGVzY3JpcHRvcikpIHsKKyAgICAgICAgICAgICAgICAvLyBVcGRhdGUgYWxsIGV4aXN0aW5nIHJvdXRlcyBhbmQgcmVvcmRlciB0aGVtIHRvIG1hdGNoCisgICAgICAgICAgICAgICAgLy8gdGhlIG9yZGVyIG9mIHRoZWlyIGRlc2NyaXB0b3JzLgorICAgICAgICAgICAgICAgIGludCB0YXJnZXRJbmRleCA9IDA7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBzZWxlY3RlZFJvdXRlRGVzY3JpcHRvckNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZiAocHJvdmlkZXJEZXNjcmlwdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVyRGVzY3JpcHRvci5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8TWVkaWFSb3V0ZURlc2NyaXB0b3I+IHJvdXRlRGVzY3JpcHRvcnMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlckRlc2NyaXB0b3IuZ2V0Um91dGVzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcm91dGVDb3VudCA9IHJvdXRlRGVzY3JpcHRvcnMuc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRpbmcgcm91dGUgZ3JvdXAncyBjb250ZW50cyByZXF1aXJlcyBhbGwgbWVtYmVyIHJvdXRlcycgaW5mb3JtYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGdyb3VwcyB0byB0aGUgbGlzdHMgYW5kIHVwZGF0ZSB0aGVtIGxhdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxQYWlyPFJvdXRlSW5mbywgTWVkaWFSb3V0ZURlc2NyaXB0b3I+PiBhZGRlZEdyb3VwcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxQYWlyPFJvdXRlSW5mbywgTWVkaWFSb3V0ZURlc2NyaXB0b3I+PiB1cGRhdGVkR3JvdXBzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvdXRlQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhUm91dGVEZXNjcmlwdG9yIHJvdXRlRGVzY3JpcHRvciA9IHJvdXRlRGVzY3JpcHRvcnMuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpZCA9IHJvdXRlRGVzY3JpcHRvci5nZXRJZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBzb3VyY2VJbmRleCA9IHByb3ZpZGVyLmZpbmRSb3V0ZUJ5RGVzY3JpcHRvcklkKGlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlSW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEuIEFkZCB0aGUgcm91dGUgdG8gdGhlIGxpc3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1bmlxdWVJZCA9IGFzc2lnblJvdXRlVW5pcXVlSWQocHJvdmlkZXIsIGlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0dyb3VwID0gcm91dGVEZXNjcmlwdG9yLmdldEdyb3VwTWVtYmVySWRzKCkgIT0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm91dGVJbmZvIHJvdXRlID0gaXNHcm91cCA/IG5ldyBSb3V0ZUdyb3VwKHByb3ZpZGVyLCBpZCwgdW5pcXVlSWQpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUm91dGVJbmZvKHByb3ZpZGVyLCBpZCwgdW5pcXVlSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlci5tUm91dGVzLmFkZCh0YXJnZXRJbmRleCsrLCByb3V0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXMuYWRkKHJvdXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMi4gQ3JlYXRlIHRoZSByb3V0ZSdzIGNvbnRlbnRzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNHcm91cCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkZWRHcm91cHMuYWRkKG5ldyBQYWlyPD4ocm91dGUsIHJvdXRlRGVzY3JpcHRvcikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUubWF5YmVVcGRhdGVEZXNjcmlwdG9yKHJvdXRlRGVzY3JpcHRvcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAzLiBOb3RpZnkgY2xpZW50cyBhYm91dCBhZGRpdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJvdXRlIGFkZGVkOiAiICsgcm91dGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KENhbGxiYWNrSGFuZGxlci5NU0dfUk9VVEVfQURERUQsIHJvdXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzb3VyY2VJbmRleCA8IHRhcmdldEluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIklnbm9yaW5nIHJvdXRlIGRlc2NyaXB0b3Igd2l0aCBkdXBsaWNhdGUgaWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJvdXRlRGVzY3JpcHRvcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMS4gUmVvcmRlciB0aGUgcm91dGUgd2l0aGluIHRoZSBsaXN0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3V0ZUluZm8gcm91dGUgPSBwcm92aWRlci5tUm91dGVzLmdldChzb3VyY2VJbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnN3YXAocHJvdmlkZXIubVJvdXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXgrKyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIuIFVwZGF0ZSB0aGUgcm91dGUncyBjb250ZW50cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlIGluc3RhbmNlb2YgUm91dGVHcm91cCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZEdyb3Vwcy5hZGQobmV3IFBhaXI8Pihyb3V0ZSwgcm91dGVEZXNjcmlwdG9yKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAzLiBOb3RpZnkgY2xpZW50cyBhYm91dCBjaGFuZ2VzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZVJvdXRlRGVzY3JpcHRvckFuZE5vdGlmeShyb3V0ZSwgcm91dGVEZXNjcmlwdG9yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlID09IG1TZWxlY3RlZFJvdXRlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUm91dGVEZXNjcmlwdG9yQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBuZXcgYW5kL29yIGV4aXN0aW5nIGdyb3Vwcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoUGFpcjxSb3V0ZUluZm8sIE1lZGlhUm91dGVEZXNjcmlwdG9yPiBwYWlyIDogYWRkZWRHcm91cHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3V0ZUluZm8gcm91dGUgPSBwYWlyLmZpcnN0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLm1heWJlVXBkYXRlRGVzY3JpcHRvcihwYWlyLnNlY29uZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJvdXRlIGFkZGVkOiAiICsgcm91dGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnBvc3QoQ2FsbGJhY2tIYW5kbGVyLk1TR19ST1VURV9BRERFRCwgcm91dGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChQYWlyPFJvdXRlSW5mbywgTWVkaWFSb3V0ZURlc2NyaXB0b3I+IHBhaXIgOiB1cGRhdGVkR3JvdXBzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm91dGVJbmZvIHJvdXRlID0gcGFpci5maXJzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXBkYXRlUm91dGVEZXNjcmlwdG9yQW5kTm90aWZ5KHJvdXRlLCBwYWlyLnNlY29uZCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm91dGUgPT0gbVNlbGVjdGVkUm91dGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUm91dGVEZXNjcmlwdG9yQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJJZ25vcmluZyBpbnZhbGlkIHByb3ZpZGVyIGRlc2NyaXB0b3I6ICIgKyBwcm92aWRlckRlc2NyaXB0b3IpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gRGlzcG9zZSBhbGwgcmVtYWluaW5nIHJvdXRlcyB0aGF0IGRvIG5vdCBoYXZlIG1hdGNoaW5nIGRlc2NyaXB0b3JzLgorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBwcm92aWRlci5tUm91dGVzLnNpemUoKSAtIDE7IGkgPj0gdGFyZ2V0SW5kZXg7IGktLSkgeworICAgICAgICAgICAgICAgICAgICAvLyAxLiBEZWxldGUgdGhlIHJvdXRlJ3MgY29udGVudHMuCisgICAgICAgICAgICAgICAgICAgIFJvdXRlSW5mbyByb3V0ZSA9IHByb3ZpZGVyLm1Sb3V0ZXMuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICByb3V0ZS5tYXliZVVwZGF0ZURlc2NyaXB0b3IobnVsbCk7CisgICAgICAgICAgICAgICAgICAgIC8vIDIuIFJlbW92ZSB0aGUgcm91dGUgZnJvbSB0aGUgbGlzdC4KKyAgICAgICAgICAgICAgICAgICAgbVJvdXRlcy5yZW1vdmUocm91dGUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgc2VsZWN0ZWQgcm91dGUgaWYgbmVlZGVkLgorICAgICAgICAgICAgICAgIHVwZGF0ZVNlbGVjdGVkUm91dGVJZk5lZWRlZChzZWxlY3RlZFJvdXRlRGVzY3JpcHRvckNoYW5nZWQpOworCisgICAgICAgICAgICAgICAgLy8gTm93IG5vdGlmeSBjbGllbnRzIGFib3V0IHJvdXRlcyB0aGF0IHdlcmUgcmVtb3ZlZC4KKyAgICAgICAgICAgICAgICAvLyBXZSBkbyB0aGlzIGFmdGVyIHVwZGF0aW5nIHRoZSBzZWxlY3RlZCByb3V0ZSB0byBlbnN1cmUKKyAgICAgICAgICAgICAgICAvLyB0aGF0IHRoZSBmcmFtZXdvcmsgbWVkaWEgcm91dGVyIG9ic2VydmVzIHRoZSBuZXcgcm91dGUKKyAgICAgICAgICAgICAgICAvLyBzZWxlY3Rpb24gYmVmb3JlIHRoZSByZW1vdmFsIHNpbmNlIHJlbW92aW5nIHRoZSBjdXJyZW50bHkKKyAgICAgICAgICAgICAgICAvLyBzZWxlY3RlZCByb3V0ZSBtYXkgaGF2ZSBzaWRlLWVmZmVjdHMuCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHByb3ZpZGVyLm1Sb3V0ZXMuc2l6ZSgpIC0gMTsgaSA+PSB0YXJnZXRJbmRleDsgaS0tKSB7CisgICAgICAgICAgICAgICAgICAgIFJvdXRlSW5mbyByb3V0ZSA9IHByb3ZpZGVyLm1Sb3V0ZXMucmVtb3ZlKGkpOworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJvdXRlIHJlbW92ZWQ6ICIgKyByb3V0ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KENhbGxiYWNrSGFuZGxlci5NU0dfUk9VVEVfUkVNT1ZFRCwgcm91dGUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIE5vdGlmeSBwcm92aWRlciBjaGFuZ2VkLgorICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJQcm92aWRlciBjaGFuZ2VkOiAiICsgcHJvdmlkZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnBvc3QoQ2FsbGJhY2tIYW5kbGVyLk1TR19QUk9WSURFUl9DSEFOR0VELCBwcm92aWRlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGludCB1cGRhdGVSb3V0ZURlc2NyaXB0b3JBbmROb3RpZnkoUm91dGVJbmZvIHJvdXRlLAorICAgICAgICAgICAgICAgIE1lZGlhUm91dGVEZXNjcmlwdG9yIHJvdXRlRGVzY3JpcHRvcikgeworICAgICAgICAgICAgaW50IGNoYW5nZXMgPSByb3V0ZS5tYXliZVVwZGF0ZURlc2NyaXB0b3Iocm91dGVEZXNjcmlwdG9yKTsKKyAgICAgICAgICAgIGlmIChjaGFuZ2VzICE9IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoKGNoYW5nZXMgJiBSb3V0ZUluZm8uQ0hBTkdFX0dFTkVSQUwpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSb3V0ZSBjaGFuZ2VkOiAiICsgcm91dGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsYmFja0hhbmRsZXIuTVNHX1JPVVRFX0NIQU5HRUQsIHJvdXRlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChjaGFuZ2VzICYgUm91dGVJbmZvLkNIQU5HRV9WT0xVTUUpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSb3V0ZSB2b2x1bWUgY2hhbmdlZDogIiArIHJvdXRlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnBvc3QoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGJhY2tIYW5kbGVyLk1TR19ST1VURV9WT0xVTUVfQ0hBTkdFRCwgcm91dGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKGNoYW5nZXMgJiBSb3V0ZUluZm8uQ0hBTkdFX1BSRVNFTlRBVElPTl9ESVNQTEFZKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUm91dGUgcHJlc2VudGF0aW9uIGRpc3BsYXkgY2hhbmdlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJvdXRlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnBvc3QoQ2FsbGJhY2tIYW5kbGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1TR19ST1VURV9QUkVTRU5UQVRJT05fRElTUExBWV9DSEFOR0VELCByb3V0ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGNoYW5nZXM7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFN0cmluZyBhc3NpZ25Sb3V0ZVVuaXF1ZUlkKFByb3ZpZGVySW5mbyBwcm92aWRlciwgU3RyaW5nIHJvdXRlRGVzY3JpcHRvcklkKSB7CisgICAgICAgICAgICAvLyBBbHRob3VnaCByb3V0ZSBkZXNjcmlwdG9yIGlkcyBhcmUgdW5pcXVlIHdpdGhpbiBhIHByb3ZpZGVyLCBpdCdzCisgICAgICAgICAgICAvLyBwb3NzaWJsZSBmb3IgdGhlcmUgdG8gYmUgdHdvIHByb3ZpZGVycyB3aXRoIHRoZSBzYW1lIHBhY2thZ2UgbmFtZS4KKyAgICAgICAgICAgIC8vIFRoZXJlZm9yZSB3ZSBtdXN0IGRlZHVwZSB0aGUgY29tcG9zaXRlIGlkLgorICAgICAgICAgICAgU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBwcm92aWRlci5nZXRDb21wb25lbnROYW1lKCkuZmxhdHRlblRvU2hvcnRTdHJpbmcoKTsKKyAgICAgICAgICAgIFN0cmluZyB1bmlxdWVJZCA9IGNvbXBvbmVudE5hbWUgKyAiOiIgKyByb3V0ZURlc2NyaXB0b3JJZDsKKyAgICAgICAgICAgIGlmIChmaW5kUm91dGVCeVVuaXF1ZUlkKHVuaXF1ZUlkKSA8IDApIHsKKyAgICAgICAgICAgICAgICBtVW5pcXVlSWRNYXAucHV0KG5ldyBQYWlyPD4oY29tcG9uZW50TmFtZSwgcm91dGVEZXNjcmlwdG9ySWQpLCB1bmlxdWVJZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHVuaXF1ZUlkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTG9nLncoVEFHLCAiRWl0aGVyICIgKyByb3V0ZURlc2NyaXB0b3JJZCArICIgaXNuJ3QgdW5pcXVlIGluICIgKyBjb21wb25lbnROYW1lCisgICAgICAgICAgICAgICAgICAgICsgIiBvciB3ZSdyZSB0cnlpbmcgdG8gYXNzaWduIGEgdW5pcXVlIElEIGZvciBhbiBhbHJlYWR5IGFkZGVkIHJvdXRlIik7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMjsgOyBpKyspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmV3VW5pcXVlSWQgPSBTdHJpbmcuZm9ybWF0KExvY2FsZS5VUywgIiVzXyVkIiwgdW5pcXVlSWQsIGkpOworICAgICAgICAgICAgICAgIGlmIChmaW5kUm91dGVCeVVuaXF1ZUlkKG5ld1VuaXF1ZUlkKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbVVuaXF1ZUlkTWFwLnB1dChuZXcgUGFpcjw+KGNvbXBvbmVudE5hbWUsIHJvdXRlRGVzY3JpcHRvcklkKSwgbmV3VW5pcXVlSWQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3VW5pcXVlSWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgZmluZFJvdXRlQnlVbmlxdWVJZChTdHJpbmcgdW5pcXVlSWQpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1Sb3V0ZXMuc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKG1Sb3V0ZXMuZ2V0KGkpLm1VbmlxdWVJZC5lcXVhbHModW5pcXVlSWQpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGdldFVuaXF1ZUlkKFByb3ZpZGVySW5mbyBwcm92aWRlciwgU3RyaW5nIHJvdXRlRGVzY3JpcHRvcklkKSB7CisgICAgICAgICAgICBTdHJpbmcgY29tcG9uZW50TmFtZSA9IHByb3ZpZGVyLmdldENvbXBvbmVudE5hbWUoKS5mbGF0dGVuVG9TaG9ydFN0cmluZygpOworICAgICAgICAgICAgcmV0dXJuIG1VbmlxdWVJZE1hcC5nZXQobmV3IFBhaXI8Pihjb21wb25lbnROYW1lLCByb3V0ZURlc2NyaXB0b3JJZCkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVNlbGVjdGVkUm91dGVJZk5lZWRlZChib29sZWFuIHNlbGVjdGVkUm91dGVEZXNjcmlwdG9yQ2hhbmdlZCkgeworICAgICAgICAgICAgLy8gVXBkYXRlIGRlZmF1bHQgcm91dGUuCisgICAgICAgICAgICBpZiAobURlZmF1bHRSb3V0ZSAhPSBudWxsICYmICFtRGVmYXVsdFJvdXRlLmlzU2VsZWN0YWJsZSgpKSB7CisgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiQ2xlYXJpbmcgdGhlIGRlZmF1bHQgcm91dGUgYmVjYXVzZSBpdCAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJpcyBubyBsb25nZXIgc2VsZWN0YWJsZTogIiArIG1EZWZhdWx0Um91dGUpOworICAgICAgICAgICAgICAgIG1EZWZhdWx0Um91dGUgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1EZWZhdWx0Um91dGUgPT0gbnVsbCAmJiAhbVJvdXRlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKFJvdXRlSW5mbyByb3V0ZSA6IG1Sb3V0ZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzU3lzdGVtRGVmYXVsdFJvdXRlKHJvdXRlKSAmJiByb3V0ZS5pc1NlbGVjdGFibGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbURlZmF1bHRSb3V0ZSA9IHJvdXRlOworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiRm91bmQgZGVmYXVsdCByb3V0ZTogIiArIG1EZWZhdWx0Um91dGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVwZGF0ZSBibHVldG9vdGggcm91dGUuCisgICAgICAgICAgICBpZiAobUJsdWV0b290aFJvdXRlICE9IG51bGwgJiYgIW1CbHVldG9vdGhSb3V0ZS5pc1NlbGVjdGFibGUoKSkgeworICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkNsZWFyaW5nIHRoZSBibHVldG9vdGggcm91dGUgYmVjYXVzZSBpdCAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJpcyBubyBsb25nZXIgc2VsZWN0YWJsZTogIiArIG1CbHVldG9vdGhSb3V0ZSk7CisgICAgICAgICAgICAgICAgbUJsdWV0b290aFJvdXRlID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtQmx1ZXRvb3RoUm91dGUgPT0gbnVsbCAmJiAhbVJvdXRlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKFJvdXRlSW5mbyByb3V0ZSA6IG1Sb3V0ZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzU3lzdGVtTGl2ZUF1ZGlvT25seVJvdXRlKHJvdXRlKSAmJiByb3V0ZS5pc1NlbGVjdGFibGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUJsdWV0b290aFJvdXRlID0gcm91dGU7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJGb3VuZCBibHVldG9vdGggcm91dGU6ICIgKyBtQmx1ZXRvb3RoUm91dGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVwZGF0ZSBzZWxlY3RlZCByb3V0ZS4KKyAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZSA9PSBudWxsIHx8ICFtU2VsZWN0ZWRSb3V0ZS5pc1NlbGVjdGFibGUoKSkgeworICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIlVuc2VsZWN0aW5nIHRoZSBjdXJyZW50IHJvdXRlIGJlY2F1c2UgaXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiaXMgbm8gbG9uZ2VyIHNlbGVjdGFibGU6ICIgKyBtU2VsZWN0ZWRSb3V0ZSk7CisgICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRSb3V0ZUludGVybmFsKGNob29zZUZhbGxiYWNrUm91dGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLlVOU0VMRUNUX1JFQVNPTl9VTktOT1dOKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRSb3V0ZURlc2NyaXB0b3JDaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgLy8gSW4gY2FzZSB0aGUgc2VsZWN0ZWQgcm91dGUgaXMgYSByb3V0ZSBncm91cCwgc2VsZWN0L3Vuc2VsZWN0IHJvdXRlIGNvbnRyb2xsZXJzCisgICAgICAgICAgICAgICAgLy8gZm9yIHRoZSBhZGRlZC9yZW1vdmVkIHJvdXRlIG1lbWJlcnMuCisgICAgICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFJvdXRlIGluc3RhbmNlb2YgUm91dGVHcm91cCkgeworICAgICAgICAgICAgICAgICAgICBMaXN0PFJvdXRlSW5mbz4gcm91dGVzID0gKChSb3V0ZUdyb3VwKSBtU2VsZWN0ZWRSb3V0ZSkuZ2V0Um91dGVzKCk7CisgICAgICAgICAgICAgICAgICAgIC8vIEJ1aWxkIGEgc2V0IG9mIGRlc2NyaXB0b3IgSURzIGZvciB0aGUgbmV3IHJvdXRlIGdyb3VwLgorICAgICAgICAgICAgICAgICAgICBTZXQ8U3RyaW5nPiBpZFNldCA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChSb3V0ZUluZm8gcm91dGUgOiByb3V0ZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlkU2V0LmFkZChyb3V0ZS5tRGVzY3JpcHRvcklkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBVbnNlbGVjdCByb3V0ZSBjb250cm9sbGVycyBmb3IgdGhlIHJlbW92ZWQgcm91dGVzLgorICAgICAgICAgICAgICAgICAgICBJdGVyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBSb3V0ZUNvbnRyb2xsZXI+PiBpdGVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUm91dGVDb250cm9sbGVyTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBNYXAuRW50cnk8U3RyaW5nLCBSb3V0ZUNvbnRyb2xsZXI+IGVudHJ5ID0gaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlkU2V0LmNvbnRhaW5zKGVudHJ5LmdldEtleSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvdXRlQ29udHJvbGxlciBjb250cm9sbGVyID0gZW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLm9uVW5zZWxlY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLm9uUmVsZWFzZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXIucmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gU2VsZWN0IHJvdXRlIGNvbnRyb2xsZXJzIGZvciB0aGUgYWRkZWQgcm91dGVzLgorICAgICAgICAgICAgICAgICAgICBmb3IgKFJvdXRlSW5mbyByb3V0ZSA6IHJvdXRlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtUm91dGVDb250cm9sbGVyTWFwLmNvbnRhaW5zS2V5KHJvdXRlLm1EZXNjcmlwdG9ySWQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPSByb3V0ZS5nZXRQcm92aWRlckluc3RhbmNlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vbkNyZWF0ZVJvdXRlQ29udHJvbGxlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUubURlc2NyaXB0b3JJZCwgbVNlbGVjdGVkUm91dGUubURlc2NyaXB0b3JJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5vblNlbGVjdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sb3V0ZUNvbnRyb2xsZXJNYXAucHV0KHJvdXRlLm1EZXNjcmlwdG9ySWQsIGNvbnRyb2xsZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgcGxheWJhY2sgaW5mbyBiZWNhdXNlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSByb3V0ZSBoYXZlIGNoYW5nZWQuCisgICAgICAgICAgICAgICAgdXBkYXRlUGxheWJhY2tJbmZvRnJvbVNlbGVjdGVkUm91dGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFJvdXRlSW5mbyBjaG9vc2VGYWxsYmFja1JvdXRlKCkgeworICAgICAgICAgICAgLy8gV2hlbiB0aGUgY3VycmVudCByb3V0ZSBpcyByZW1vdmVkIG9yIG5vIGxvbmdlciBzZWxlY3RhYmxlLAorICAgICAgICAgICAgLy8gd2Ugd2FudCB0byByZXZlcnQgdG8gYSBsaXZlIGF1ZGlvIHJvdXRlIGlmIHRoZXJlIGlzCisgICAgICAgICAgICAvLyBvbmUgKHVzdWFsbHkgQmx1ZXRvb3RoIEEyRFApLiAgRmFpbGluZyB0aGF0LCB1c2UKKyAgICAgICAgICAgIC8vIHRoZSBkZWZhdWx0IHJvdXRlLgorICAgICAgICAgICAgZm9yIChSb3V0ZUluZm8gcm91dGUgOiBtUm91dGVzKSB7CisgICAgICAgICAgICAgICAgaWYgKHJvdXRlICE9IG1EZWZhdWx0Um91dGUKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGlzU3lzdGVtTGl2ZUF1ZGlvT25seVJvdXRlKHJvdXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgcm91dGUuaXNTZWxlY3RhYmxlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvdXRlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtRGVmYXVsdFJvdXRlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzU3lzdGVtTGl2ZUF1ZGlvT25seVJvdXRlKFJvdXRlSW5mbyByb3V0ZSkgeworICAgICAgICAgICAgcmV0dXJuIHJvdXRlLmdldFByb3ZpZGVySW5zdGFuY2UoKSA9PSBtU3lzdGVtUHJvdmlkZXIKKyAgICAgICAgICAgICAgICAgICAgJiYgcm91dGUuc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfQVVESU8pCisgICAgICAgICAgICAgICAgICAgICYmICFyb3V0ZS5zdXBwb3J0c0NvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9WSURFTyk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNTeXN0ZW1EZWZhdWx0Um91dGUoUm91dGVJbmZvIHJvdXRlKSB7CisgICAgICAgICAgICByZXR1cm4gcm91dGUuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpID09IG1TeXN0ZW1Qcm92aWRlcgorICAgICAgICAgICAgICAgICAgICAmJiByb3V0ZS5tRGVzY3JpcHRvcklkLmVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIuREVGQVVMVF9ST1VURV9JRCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgc2V0U2VsZWN0ZWRSb3V0ZUludGVybmFsKEBOb25OdWxsIFJvdXRlSW5mbyByb3V0ZSwgaW50IHVuc2VsZWN0UmVhc29uKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBSZW1vdmUgdGhlIGZvbGxvd2luZyBsb2dnaW5nIHdoZW4gbm8gbG9uZ2VyIG5lZWRlZC4KKyAgICAgICAgICAgIGlmIChzR2xvYmFsID09IG51bGwgfHwgKG1CbHVldG9vdGhSb3V0ZSAhPSBudWxsICYmIHJvdXRlLmlzRGVmYXVsdCgpKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0YWNrVHJhY2VFbGVtZW50W10gY2FsbFN0YWNrID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgLy8gY2FsbFN0YWNrWzNdIGlzIHRoZSBjYWxsZXIgb2YgdGhpcyBtZXRob2QuCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDM7IGkgPCBjYWxsU3RhY2subGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgU3RhY2tUcmFjZUVsZW1lbnQgY2FsbGVyID0gY2FsbFN0YWNrW2ldOworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoY2FsbGVyLmdldENsYXNzTmFtZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIi4iKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoY2FsbGVyLmdldE1ldGhvZE5hbWUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCI6IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGNhbGxlci5nZXRMaW5lTnVtYmVyKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiICAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHNHbG9iYWwgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJzZXRTZWxlY3RlZFJvdXRlSW50ZXJuYWwgaXMgY2FsbGVkIHdoaWxlIHNHbG9iYWwgaXMgbnVsbDogcGtnTmFtZT0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtQXBwbGljYXRpb25Db250ZXh0LmdldFBhY2thZ2VOYW1lKCkgKyAiLCBjYWxsZXJzPSIgKyBzYi50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJEZWZhdWx0IHJvdXRlIGlzIHNlbGVjdGVkIHdoaWxlIGEgQlQgcm91dGUgaXMgYXZhaWxhYmxlOiBwa2dOYW1lPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1BcHBsaWNhdGlvbkNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSArICIsIGNhbGxlcnM9IiArIHNiLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFJvdXRlICE9IHJvdXRlKSB7CisgICAgICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFJvdXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSb3V0ZSB1bnNlbGVjdGVkOiAiICsgbVNlbGVjdGVkUm91dGUgKyAiIHJlYXNvbjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHVuc2VsZWN0UmVhc29uKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnBvc3QoQ2FsbGJhY2tIYW5kbGVyLk1TR19ST1VURV9VTlNFTEVDVEVELCBtU2VsZWN0ZWRSb3V0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNlbGVjdFJlYXNvbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkUm91dGVDb250cm9sbGVyLm9uVW5zZWxlY3QodW5zZWxlY3RSZWFzb24pOworICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkUm91dGVDb250cm9sbGVyLm9uUmVsZWFzZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkUm91dGVDb250cm9sbGVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIW1Sb3V0ZUNvbnRyb2xsZXJNYXAuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFJvdXRlQ29udHJvbGxlciBjb250cm9sbGVyIDogbVJvdXRlQ29udHJvbGxlck1hcC52YWx1ZXMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25VbnNlbGVjdCh1bnNlbGVjdFJlYXNvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5vblJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1Sb3V0ZUNvbnRyb2xsZXJNYXAuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlID0gcm91dGU7CisgICAgICAgICAgICAgICAgbVNlbGVjdGVkUm91dGVDb250cm9sbGVyID0gcm91dGUuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpLm9uQ3JlYXRlUm91dGVDb250cm9sbGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUubURlc2NyaXB0b3JJZCk7CisgICAgICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlci5vblNlbGVjdCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUm91dGUgc2VsZWN0ZWQ6ICIgKyBtU2VsZWN0ZWRSb3V0ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChDYWxsYmFja0hhbmRsZXIuTVNHX1JPVVRFX1NFTEVDVEVELCBtU2VsZWN0ZWRSb3V0ZSk7CisKKyAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGUgaW5zdGFuY2VvZiBSb3V0ZUdyb3VwKSB7CisgICAgICAgICAgICAgICAgICAgIExpc3Q8Um91dGVJbmZvPiByb3V0ZXMgPSAoKFJvdXRlR3JvdXApIG1TZWxlY3RlZFJvdXRlKS5nZXRSb3V0ZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgbVJvdXRlQ29udHJvbGxlck1hcC5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICBmb3IgKFJvdXRlSW5mbyByIDogcm91dGVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBSb3V0ZUNvbnRyb2xsZXIgY29udHJvbGxlciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpLm9uQ3JlYXRlUm91dGVDb250cm9sbGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIubURlc2NyaXB0b3JJZCwgbVNlbGVjdGVkUm91dGUubURlc2NyaXB0b3JJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLm9uU2VsZWN0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtUm91dGVDb250cm9sbGVyTWFwLnB1dChyLm1EZXNjcmlwdG9ySWQsIGNvbnRyb2xsZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdXBkYXRlUGxheWJhY2tJbmZvRnJvbVNlbGVjdGVkUm91dGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblN5c3RlbVJvdXRlU2VsZWN0ZWRCeURlc2NyaXB0b3JJZChTdHJpbmcgaWQpIHsKKyAgICAgICAgICAgIC8vIFN5c3RlbSByb3V0ZSBpcyBzZWxlY3RlZCwgZG8gbm90IHN5bmMgdGhlIHJvdXRlIHdlIHNlbGVjdGVkIGJlZm9yZS4KKyAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucmVtb3ZlTWVzc2FnZXMoQ2FsbGJhY2tIYW5kbGVyLk1TR19ST1VURV9TRUxFQ1RFRCk7CisgICAgICAgICAgICBpbnQgcHJvdmlkZXJJbmRleCA9IGZpbmRQcm92aWRlckluZm8obVN5c3RlbVByb3ZpZGVyKTsKKyAgICAgICAgICAgIGlmIChwcm92aWRlckluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICBQcm92aWRlckluZm8gcHJvdmlkZXIgPSBtUHJvdmlkZXJzLmdldChwcm92aWRlckluZGV4KTsKKyAgICAgICAgICAgICAgICBpbnQgcm91dGVJbmRleCA9IHByb3ZpZGVyLmZpbmRSb3V0ZUJ5RGVzY3JpcHRvcklkKGlkKTsKKyAgICAgICAgICAgICAgICBpZiAocm91dGVJbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyLm1Sb3V0ZXMuZ2V0KHJvdXRlSW5kZXgpLnNlbGVjdCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZFJlbW90ZUNvbnRyb2xDbGllbnQoT2JqZWN0IHJjYykgeworICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQocmNjKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICBSZW1vdGVDb250cm9sQ2xpZW50UmVjb3JkIHJlY29yZCA9IG5ldyBSZW1vdGVDb250cm9sQ2xpZW50UmVjb3JkKHJjYyk7CisgICAgICAgICAgICAgICAgbVJlbW90ZUNvbnRyb2xDbGllbnRzLmFkZChyZWNvcmQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlUmVtb3RlQ29udHJvbENsaWVudChPYmplY3QgcmNjKSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kUmVtb3RlQ29udHJvbENsaWVudFJlY29yZChyY2MpOworICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICBSZW1vdGVDb250cm9sQ2xpZW50UmVjb3JkIHJlY29yZCA9IG1SZW1vdGVDb250cm9sQ2xpZW50cy5yZW1vdmUoaW5kZXgpOworICAgICAgICAgICAgICAgIHJlY29yZC5kaXNjb25uZWN0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRNZWRpYVNlc3Npb24oT2JqZWN0IHNlc3Npb24pIHsKKyAgICAgICAgICAgIHNldE1lZGlhU2Vzc2lvblJlY29yZChzZXNzaW9uICE9IG51bGwgPyBuZXcgTWVkaWFTZXNzaW9uUmVjb3JkKHNlc3Npb24pIDogbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRNZWRpYVNlc3Npb25Db21wYXQoZmluYWwgTWVkaWFTZXNzaW9uQ29tcGF0IHNlc3Npb24pIHsKKyAgICAgICAgICAgIG1Db21wYXRTZXNzaW9uID0gc2Vzc2lvbjsKKyAgICAgICAgICAgIGlmIChhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+PSAyMSkgeworICAgICAgICAgICAgICAgIHNldE1lZGlhU2Vzc2lvblJlY29yZChzZXNzaW9uICE9IG51bGwgPyBuZXcgTWVkaWFTZXNzaW9uUmVjb3JkKHNlc3Npb24pIDogbnVsbCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTi5TREtfSU5UID49IDE0KSB7CisgICAgICAgICAgICAgICAgaWYgKG1SY2NNZWRpYVNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZW1vdmVSZW1vdGVDb250cm9sQ2xpZW50KG1SY2NNZWRpYVNlc3Npb24uZ2V0UmVtb3RlQ29udHJvbENsaWVudCgpKTsKKyAgICAgICAgICAgICAgICAgICAgbVJjY01lZGlhU2Vzc2lvbi5yZW1vdmVPbkFjdGl2ZUNoYW5nZUxpc3RlbmVyKG1TZXNzaW9uQWN0aXZlTGlzdGVuZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtUmNjTWVkaWFTZXNzaW9uID0gc2Vzc2lvbjsKKyAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uYWRkT25BY3RpdmVDaGFuZ2VMaXN0ZW5lcihtU2Vzc2lvbkFjdGl2ZUxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb24uaXNBY3RpdmUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWRkUmVtb3RlQ29udHJvbENsaWVudChzZXNzaW9uLmdldFJlbW90ZUNvbnRyb2xDbGllbnQoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgc2V0TWVkaWFTZXNzaW9uUmVjb3JkKE1lZGlhU2Vzc2lvblJlY29yZCBtZWRpYVNlc3Npb25SZWNvcmQpIHsKKyAgICAgICAgICAgIGlmIChtTWVkaWFTZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtTWVkaWFTZXNzaW9uLmNsZWFyVm9sdW1lSGFuZGxpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1NZWRpYVNlc3Npb24gPSBtZWRpYVNlc3Npb25SZWNvcmQ7CisgICAgICAgICAgICBpZiAobWVkaWFTZXNzaW9uUmVjb3JkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja0luZm9Gcm9tU2VsZWN0ZWRSb3V0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE1lZGlhU2Vzc2lvbkNvbXBhdC5Ub2tlbiBnZXRNZWRpYVNlc3Npb25Ub2tlbigpIHsKKyAgICAgICAgICAgIGlmIChtTWVkaWFTZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbU1lZGlhU2Vzc2lvbi5nZXRUb2tlbigpOworICAgICAgICAgICAgfSBlbHNlIGlmIChtQ29tcGF0U2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1Db21wYXRTZXNzaW9uLmdldFNlc3Npb25Ub2tlbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGludCBmaW5kUmVtb3RlQ29udHJvbENsaWVudFJlY29yZChPYmplY3QgcmNjKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtUmVtb3RlQ29udHJvbENsaWVudHMuc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgUmVtb3RlQ29udHJvbENsaWVudFJlY29yZCByZWNvcmQgPSBtUmVtb3RlQ29udHJvbENsaWVudHMuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChyZWNvcmQuZ2V0UmVtb3RlQ29udHJvbENsaWVudCgpID09IHJjYykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgdXBkYXRlUGxheWJhY2tJbmZvRnJvbVNlbGVjdGVkUm91dGUoKSB7CisgICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1QbGF5YmFja0luZm8udm9sdW1lID0gbVNlbGVjdGVkUm91dGUuZ2V0Vm9sdW1lKCk7CisgICAgICAgICAgICAgICAgbVBsYXliYWNrSW5mby52b2x1bWVNYXggPSBtU2VsZWN0ZWRSb3V0ZS5nZXRWb2x1bWVNYXgoKTsKKyAgICAgICAgICAgICAgICBtUGxheWJhY2tJbmZvLnZvbHVtZUhhbmRsaW5nID0gbVNlbGVjdGVkUm91dGUuZ2V0Vm9sdW1lSGFuZGxpbmcoKTsKKyAgICAgICAgICAgICAgICBtUGxheWJhY2tJbmZvLnBsYXliYWNrU3RyZWFtID0gbVNlbGVjdGVkUm91dGUuZ2V0UGxheWJhY2tTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICBtUGxheWJhY2tJbmZvLnBsYXliYWNrVHlwZSA9IG1TZWxlY3RlZFJvdXRlLmdldFBsYXliYWNrVHlwZSgpOworCisgICAgICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVJlbW90ZUNvbnRyb2xDbGllbnRzLnNpemUoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgUmVtb3RlQ29udHJvbENsaWVudFJlY29yZCByZWNvcmQgPSBtUmVtb3RlQ29udHJvbENsaWVudHMuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICByZWNvcmQudXBkYXRlUGxheWJhY2tJbmZvKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtTWVkaWFTZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFJvdXRlID09IGdldERlZmF1bHRSb3V0ZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbVNlbGVjdGVkUm91dGUgPT0gZ2V0Qmx1ZXRvb3RoUm91dGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9jYWwgcm91dGUKKyAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYVNlc3Npb24uY2xlYXJWb2x1bWVIYW5kbGluZygpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQFZvbHVtZVByb3ZpZGVyQ29tcGF0LkNvbnRyb2xUeXBlIGludCBjb250cm9sVHlwZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZVByb3ZpZGVyQ29tcGF0LlZPTFVNRV9DT05UUk9MX0ZJWEVEOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1QbGF5YmFja0luZm8udm9sdW1lSGFuZGxpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTWVkaWFSb3V0ZXIuUm91dGVJbmZvLlBMQVlCQUNLX1ZPTFVNRV9WQVJJQUJMRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xUeXBlID0gVm9sdW1lUHJvdmlkZXJDb21wYXQuVk9MVU1FX0NPTlRST0xfQUJTT0xVVEU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFTZXNzaW9uLmNvbmZpZ3VyZVZvbHVtZShjb250cm9sVHlwZSwgbVBsYXliYWNrSW5mby52b2x1bWVNYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5YmFja0luZm8udm9sdW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKG1NZWRpYVNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtTWVkaWFTZXNzaW9uLmNsZWFyVm9sdW1lSGFuZGxpbmcoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFByb3ZpZGVyQ2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVJvdXRlUHJvdmlkZXIuQ2FsbGJhY2sgeworICAgICAgICAgICAgUHJvdmlkZXJDYWxsYmFjaygpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkRlc2NyaXB0b3JDaGFuZ2VkKE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlciwKKyAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7CisgICAgICAgICAgICAgICAgdXBkYXRlUHJvdmlkZXJEZXNjcmlwdG9yKHByb3ZpZGVyLCBkZXNjcmlwdG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZmluYWwgY2xhc3MgTWVkaWFTZXNzaW9uUmVjb3JkIHsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgTWVkaWFTZXNzaW9uQ29tcGF0IG1Nc0NvbXBhdDsKKworICAgICAgICAgICAgcHJpdmF0ZSBAVm9sdW1lUHJvdmlkZXJDb21wYXQuQ29udHJvbFR5cGUgaW50IG1Db250cm9sVHlwZTsKKyAgICAgICAgICAgIHByaXZhdGUgaW50IG1NYXhWb2x1bWU7CisgICAgICAgICAgICBwcml2YXRlIFZvbHVtZVByb3ZpZGVyQ29tcGF0IG1WcENvbXBhdDsKKworICAgICAgICAgICAgcHVibGljIE1lZGlhU2Vzc2lvblJlY29yZChPYmplY3QgbWVkaWFTZXNzaW9uKSB7CisgICAgICAgICAgICAgICAgbU1zQ29tcGF0ID0gTWVkaWFTZXNzaW9uQ29tcGF0LmZyb21NZWRpYVNlc3Npb24obUFwcGxpY2F0aW9uQ29udGV4dCwgbWVkaWFTZXNzaW9uKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIE1lZGlhU2Vzc2lvblJlY29yZChNZWRpYVNlc3Npb25Db21wYXQgbWVkaWFTZXNzaW9uQ29tcGF0KSB7CisgICAgICAgICAgICAgICAgbU1zQ29tcGF0ID0gbWVkaWFTZXNzaW9uQ29tcGF0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBjb25maWd1cmVWb2x1bWUoQFZvbHVtZVByb3ZpZGVyQ29tcGF0LkNvbnRyb2xUeXBlIGludCBjb250cm9sVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgaW50IG1heCwgaW50IGN1cnJlbnQpIHsKKyAgICAgICAgICAgICAgICBpZiAobVZwQ29tcGF0ICE9IG51bGwgJiYgY29udHJvbFR5cGUgPT0gbUNvbnRyb2xUeXBlICYmIG1heCA9PSBtTWF4Vm9sdW1lKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmVuJ3QgY2hhbmdlZCBjb250cm9sIHR5cGUgb3IgbWF4IGp1c3Qgc2V0IHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBuZXcgY3VycmVudCB2b2x1bWUKKyAgICAgICAgICAgICAgICAgICAgbVZwQ29tcGF0LnNldEN1cnJlbnRWb2x1bWUoY3VycmVudCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIGNyZWF0ZSBhIG5ldyBwcm92aWRlciBhbmQgdXBkYXRlCisgICAgICAgICAgICAgICAgICAgIG1WcENvbXBhdCA9IG5ldyBWb2x1bWVQcm92aWRlckNvbXBhdChjb250cm9sVHlwZSwgbWF4LCBjdXJyZW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU2V0Vm9sdW1lVG8oZmluYWwgaW50IHZvbHVtZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlLnJlcXVlc3RTZXRWb2x1bWUodm9sdW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQWRqdXN0Vm9sdW1lKGZpbmFsIGludCBkaXJlY3Rpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFJvdXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZS5yZXF1ZXN0VXBkYXRlVm9sdW1lKGRpcmVjdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgbU1zQ29tcGF0LnNldFBsYXliYWNrVG9SZW1vdGUobVZwQ29tcGF0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyVm9sdW1lSGFuZGxpbmcoKSB7CisgICAgICAgICAgICAgICAgbU1zQ29tcGF0LnNldFBsYXliYWNrVG9Mb2NhbChtUGxheWJhY2tJbmZvLnBsYXliYWNrU3RyZWFtKTsKKyAgICAgICAgICAgICAgICBtVnBDb21wYXQgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgTWVkaWFTZXNzaW9uQ29tcGF0LlRva2VuIGdldFRva2VuKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBtTXNDb21wYXQuZ2V0U2Vzc2lvblRva2VuKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQKKyAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIFJlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQuVm9sdW1lQ2FsbGJhY2sgeworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZW1vdGVDb250cm9sQ2xpZW50Q29tcGF0IG1SY2NDb21wYXQ7CisgICAgICAgICAgICBwcml2YXRlIGJvb2xlYW4gbURpc2Nvbm5lY3RlZDsKKworICAgICAgICAgICAgcHVibGljIFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQoT2JqZWN0IHJjYykgeworICAgICAgICAgICAgICAgIG1SY2NDb21wYXQgPSBSZW1vdGVDb250cm9sQ2xpZW50Q29tcGF0Lm9idGFpbihtQXBwbGljYXRpb25Db250ZXh0LCByY2MpOworICAgICAgICAgICAgICAgIG1SY2NDb21wYXQuc2V0Vm9sdW1lQ2FsbGJhY2sodGhpcyk7CisgICAgICAgICAgICAgICAgdXBkYXRlUGxheWJhY2tJbmZvKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0UmVtb3RlQ29udHJvbENsaWVudCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVJjY0NvbXBhdC5nZXRSZW1vdGVDb250cm9sQ2xpZW50KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGRpc2Nvbm5lY3QoKSB7CisgICAgICAgICAgICAgICAgbURpc2Nvbm5lY3RlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgbVJjY0NvbXBhdC5zZXRWb2x1bWVDYWxsYmFjayhudWxsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlUGxheWJhY2tJbmZvKCkgeworICAgICAgICAgICAgICAgIG1SY2NDb21wYXQuc2V0UGxheWJhY2tJbmZvKG1QbGF5YmFja0luZm8pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lU2V0UmVxdWVzdChpbnQgdm9sdW1lKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtRGlzY29ubmVjdGVkICYmIG1TZWxlY3RlZFJvdXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkUm91dGUucmVxdWVzdFNldFZvbHVtZSh2b2x1bWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblZvbHVtZVVwZGF0ZVJlcXVlc3QoaW50IGRpcmVjdGlvbikgeworICAgICAgICAgICAgICAgIGlmICghbURpc2Nvbm5lY3RlZCAmJiBtU2VsZWN0ZWRSb3V0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlLnJlcXVlc3RVcGRhdGVWb2x1bWUoZGlyZWN0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGZpbmFsIGNsYXNzIENhbGxiYWNrSGFuZGxlciBleHRlbmRzIEhhbmRsZXIgeworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8Q2FsbGJhY2tSZWNvcmQ+IG1UZW1wQ2FsbGJhY2tSZWNvcmRzID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxDYWxsYmFja1JlY29yZD4oKTsKKworICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19UWVBFX01BU0sgPSAweGZmMDA7CisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1RZUEVfUk9VVEUgPSAweDAxMDA7CisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1RZUEVfUFJPVklERVIgPSAweDAyMDA7CisKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19ST1VURV9BRERFRCA9IE1TR19UWVBFX1JPVVRFIHwgMTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19ST1VURV9SRU1PVkVEID0gTVNHX1RZUEVfUk9VVEUgfCAyOworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JPVVRFX0NIQU5HRUQgPSBNU0dfVFlQRV9ST1VURSB8IDM7CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUk9VVEVfVk9MVU1FX0NIQU5HRUQgPSBNU0dfVFlQRV9ST1VURSB8IDQ7CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUk9VVEVfUFJFU0VOVEFUSU9OX0RJU1BMQVlfQ0hBTkdFRCA9IE1TR19UWVBFX1JPVVRFIHwgNTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19ST1VURV9TRUxFQ1RFRCA9IE1TR19UWVBFX1JPVVRFIHwgNjsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19ST1VURV9VTlNFTEVDVEVEID0gTVNHX1RZUEVfUk9VVEUgfCA3OworCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUFJPVklERVJfQURERUQgPSBNU0dfVFlQRV9QUk9WSURFUiB8IDE7CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUFJPVklERVJfUkVNT1ZFRCA9IE1TR19UWVBFX1BST1ZJREVSIHwgMjsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19QUk9WSURFUl9DSEFOR0VEID0gTVNHX1RZUEVfUFJPVklERVIgfCAzOworCisgICAgICAgICAgICBDYWxsYmFja0hhbmRsZXIoKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBvc3QoaW50IG1zZywgT2JqZWN0IG9iaikgeworICAgICAgICAgICAgICAgIG9idGFpbk1lc3NhZ2UobXNnLCBvYmopLnNlbmRUb1RhcmdldCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBwb3N0KGludCBtc2csIE9iamVjdCBvYmosIGludCBhcmcpIHsKKyAgICAgICAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBvYnRhaW5NZXNzYWdlKG1zZywgb2JqKTsKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFyZzEgPSBhcmc7CisgICAgICAgICAgICAgICAgbWVzc2FnZS5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHdoYXQgPSBtc2cud2hhdDsKKyAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3Qgb2JqID0gbXNnLm9iajsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgYXJnID0gbXNnLmFyZzE7CisKKyAgICAgICAgICAgICAgICBpZiAod2hhdCA9PSBNU0dfUk9VVEVfQ0hBTkdFRAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZ2V0U2VsZWN0ZWRSb3V0ZSgpLmdldElkKCkuZXF1YWxzKCgoUm91dGVJbmZvKSBvYmopLmdldElkKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVNlbGVjdGVkUm91dGVJZk5lZWRlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBTeW5jaHJvbml6ZSBzdGF0ZSB3aXRoIHRoZSBzeXN0ZW0gbWVkaWEgcm91dGVyLgorICAgICAgICAgICAgICAgIHN5bmNXaXRoU3lzdGVtUHJvdmlkZXIod2hhdCwgb2JqKTsKKworICAgICAgICAgICAgICAgIC8vIEludm9rZSBhbGwgcmVnaXN0ZXJlZCBjYWxsYmFja3MuCisgICAgICAgICAgICAgICAgLy8gQnVpbGQgYSBsaXN0IG9mIGNhbGxiYWNrcyBiZWZvcmUgaW52b2tpbmcgdGhlbSBpbiBjYXNlIGNhbGxiYWNrcworICAgICAgICAgICAgICAgIC8vIGFyZSBhZGRlZCBvciByZW1vdmVkIGR1cmluZyBkaXNwYXRjaC4KKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gbVJvdXRlcnMuc2l6ZSgpOyAtLWkgPj0gMDsgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlciByb3V0ZXIgPSBtUm91dGVycy5nZXQoaSkuZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm91dGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUm91dGVycy5yZW1vdmUoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UZW1wQ2FsbGJhY2tSZWNvcmRzLmFkZEFsbChyb3V0ZXIubUNhbGxiYWNrUmVjb3Jkcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY2FsbGJhY2tDb3VudCA9IG1UZW1wQ2FsbGJhY2tSZWNvcmRzLnNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYWxsYmFja0NvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludm9rZUNhbGxiYWNrKG1UZW1wQ2FsbGJhY2tSZWNvcmRzLmdldChpKSwgd2hhdCwgb2JqLCBhcmcpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgbVRlbXBDYWxsYmFja1JlY29yZHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgdm9pZCBzeW5jV2l0aFN5c3RlbVByb3ZpZGVyKGludCB3aGF0LCBPYmplY3Qgb2JqKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICh3aGF0KSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JPVVRFX0FEREVEOgorICAgICAgICAgICAgICAgICAgICAgICAgbVN5c3RlbVByb3ZpZGVyLm9uU3luY1JvdXRlQWRkZWQoKFJvdXRlSW5mbykgb2JqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9SRU1PVkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgbVN5c3RlbVByb3ZpZGVyLm9uU3luY1JvdXRlUmVtb3ZlZCgoUm91dGVJbmZvKSBvYmopOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JPVVRFX0NIQU5HRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICBtU3lzdGVtUHJvdmlkZXIub25TeW5jUm91dGVDaGFuZ2VkKChSb3V0ZUluZm8pIG9iaik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfU0VMRUNURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICBtU3lzdGVtUHJvdmlkZXIub25TeW5jUm91dGVTZWxlY3RlZCgoUm91dGVJbmZvKSBvYmopOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIHZvaWQgaW52b2tlQ2FsbGJhY2soQ2FsbGJhY2tSZWNvcmQgcmVjb3JkLCBpbnQgd2hhdCwgT2JqZWN0IG9iaiwgaW50IGFyZykgeworICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhUm91dGVyIHJvdXRlciA9IHJlY29yZC5tUm91dGVyOworICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhUm91dGVyLkNhbGxiYWNrIGNhbGxiYWNrID0gcmVjb3JkLm1DYWxsYmFjazsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHdoYXQgJiBNU0dfVFlQRV9NQVNLKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1RZUEVfUk9VVEU6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJvdXRlSW5mbyByb3V0ZSA9IChSb3V0ZUluZm8pb2JqOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWNvcmQuZmlsdGVyUm91dGVFdmVudChyb3V0ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAod2hhdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JPVVRFX0FEREVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblJvdXRlQWRkZWQocm91dGVyLCByb3V0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JPVVRFX1JFTU9WRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUm91dGVSZW1vdmVkKHJvdXRlciwgcm91dGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9DSEFOR0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblJvdXRlQ2hhbmdlZChyb3V0ZXIsIHJvdXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfVk9MVU1FX0NIQU5HRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUm91dGVWb2x1bWVDaGFuZ2VkKHJvdXRlciwgcm91dGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9QUkVTRU5UQVRJT05fRElTUExBWV9DSEFOR0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblJvdXRlUHJlc2VudGF0aW9uRGlzcGxheUNoYW5nZWQocm91dGVyLCByb3V0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JPVVRFX1NFTEVDVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblJvdXRlU2VsZWN0ZWQocm91dGVyLCByb3V0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JPVVRFX1VOU0VMRUNURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUm91dGVVbnNlbGVjdGVkKHJvdXRlciwgcm91dGUsIGFyZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfVFlQRV9QUk9WSURFUjogeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUHJvdmlkZXJJbmZvIHByb3ZpZGVyID0gKFByb3ZpZGVySW5mbylvYmo7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHdoYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19QUk9WSURFUl9BRERFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Qcm92aWRlckFkZGVkKHJvdXRlciwgcHJvdmlkZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19QUk9WSURFUl9SRU1PVkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblByb3ZpZGVyUmVtb3ZlZChyb3V0ZXIsIHByb3ZpZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUFJPVklERVJfQ0hBTkdFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Qcm92aWRlckNoYW5nZWQocm91dGVyLCBwcm92aWRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhU2Vzc2lvblN0YXR1cy5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhU2Vzc2lvblN0YXR1cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMDY1OTYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFTZXNzaW9uU3RhdHVzLmphdmEKQEAgLTAsMCArMSwyNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQudXRpbC5UaW1lVXRpbHM7CisKKy8qKgorICogRGVzY3JpYmVzIHRoZSBwbGF5YmFjayBzdGF0dXMgb2YgYSBtZWRpYSBzZXNzaW9uLgorICogPHA+CisgKiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgdGhlIHJlbW90ZSBwbGF5YmFjayBwcm90b2NvbCBkZXNjcmliZWQgYnkgdGhlCisgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IE1lZGlhQ29udHJvbEludGVudH0gY2xhc3MuCisgKiA8L3A+PHA+CisgKiBXaGVuIGEgbWVkaWEgc2Vzc2lvbiBpcyBjcmVhdGVkLCBpdCBpcyBpbml0aWFsbHkgaW4gdGhlCisgKiB7QGxpbmsgI1NFU1NJT05fU1RBVEVfQUNUSVZFIGFjdGl2ZX0gc3RhdGUuICBXaGVuIHRoZSBtZWRpYSBzZXNzaW9uIGVuZHMKKyAqIG5vcm1hbGx5LCBpdCB0cmFuc2l0aW9ucyB0byB0aGUge0BsaW5rICNTRVNTSU9OX1NUQVRFX0VOREVEIGVuZGVkfSBzdGF0ZS4KKyAqIElmIHRoZSBtZWRpYSBzZXNzaW9uIGlzIGludmFsaWRhdGVkIGR1ZSB0byBhbm90aGVyIHNlc3Npb24gZm9yY2libHkgdGFraW5nCisgKiBjb250cm9sIG9mIHRoZSByb3V0ZSwgdGhlbiBpdCB0cmFuc2l0aW9ucyB0byB0aGUKKyAqIHtAbGluayAjU0VTU0lPTl9TVEFURV9JTlZBTElEQVRFRCBpbnZhbGlkYXRlZH0gc3RhdGUuCisgKiBSZWZlciB0byB0aGUgZG9jdW1lbnRhdGlvbiBvZiBlYWNoIHN0YXRlIGZvciBhbiBleHBsYW5hdGlvbiBvZiBpdHMgbWVhbmluZy4KKyAqIDwvcD48cD4KKyAqIFRvIG1vbml0b3Igc2Vzc2lvbiBzdGF0dXMsIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgc3VwcGx5IGEge0BsaW5rIFBlbmRpbmdJbnRlbnR9IHRvIHVzZSBhcyB0aGUKKyAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjRVhUUkFfU0VTU0lPTl9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIHNlc3Npb24gc3RhdHVzIHVwZGF0ZSByZWNlaXZlcn0KKyAqIGZvciBhIGdpdmVuIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NUQVJUX1NFU1NJT04gc2Vzc2lvbiBzdGFydCByZXF1ZXN0fS4KKyAqIDwvcD48cD4KKyAqIFRoaXMgb2JqZWN0IGlzIGltbXV0YWJsZSBvbmNlIGNyZWF0ZWQgdXNpbmcgYSB7QGxpbmsgQnVpbGRlcn0gaW5zdGFuY2UuCisgKiA8L3A+CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBNZWRpYVNlc3Npb25TdGF0dXMgeworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1RJTUVTVEFNUCA9ICJ0aW1lc3RhbXAiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NFU1NJT05fU1RBVEUgPSAic2Vzc2lvblN0YXRlIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9RVUVVRV9QQVVTRUQgPSAicXVldWVQYXVzZWQiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0VYVFJBUyA9ICJleHRyYXMiOworCisgICAgZmluYWwgQnVuZGxlIG1CdW5kbGU7CisKKyAgICAvKioKKyAgICAgKiBTZXNzaW9uIHN0YXRlOiBBY3RpdmUuCisgICAgICogPHA+CisgICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIHNlc3Npb24gaXMgYWN0aXZlIGFuZCBpbiBjb250cm9sIG9mIHRoZSByb3V0ZS4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VTU0lPTl9TVEFURV9BQ1RJVkUgPSAwOworCisgICAgLyoqCisgICAgICogU2Vzc2lvbiBzdGF0ZTogRW5kZWQuCisgICAgICogPHA+CisgICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIHNlc3Npb24gd2FzIGVuZGVkIG5vcm1hbGx5IHVzaW5nIHRoZQorICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VORF9TRVNTSU9OIGVuZCBzZXNzaW9ufSBhY3Rpb24uCisgICAgICogPC9wPjxwPgorICAgICAqIEEgdGVybWluYXRlZCBtZWRpYSBzZXNzaW9uIGNhbm5vdCBiZSB1c2VkIGFueW1vcmUuICBUbyBwbGF5IG1vcmUgbWVkaWEsIHRoZQorICAgICAqIGFwcGxpY2F0aW9uIG11c3Qgc3RhcnQgYSBuZXcgc2Vzc2lvbi4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VTU0lPTl9TVEFURV9FTkRFRCA9IDE7CisKKyAgICAvKioKKyAgICAgKiBTZXNzaW9uIHN0YXRlOiBJbnZhbGlkYXRlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgc2Vzc2lvbiB3YXMgaW52YWxpZGF0ZWQgaW52b2x1bnRhcmlseSBkdWUgdG8KKyAgICAgKiBhbm90aGVyIHNlc3Npb24gdGFraW5nIGNvbnRyb2wgb2YgdGhlIHJvdXRlLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBBbiBpbnZhbGlkYXRlZCBtZWRpYSBzZXNzaW9uIGNhbm5vdCBiZSB1c2VkIGFueW1vcmUuICBUbyBwbGF5IG1vcmUgbWVkaWEsIHRoZQorICAgICAqIGFwcGxpY2F0aW9uIG11c3Qgc3RhcnQgYSBuZXcgc2Vzc2lvbi4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VTU0lPTl9TVEFURV9JTlZBTElEQVRFRCA9IDI7CisKKyAgICBNZWRpYVNlc3Npb25TdGF0dXMoQnVuZGxlIGJ1bmRsZSkgeworICAgICAgICBtQnVuZGxlID0gYnVuZGxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHRpbWVzdGFtcCBhc3NvY2lhdGVkIHdpdGggdGhlIHN0YXR1cyBpbmZvcm1hdGlvbiBpbgorICAgICAqIG1pbGxpc2Vjb25kcyBzaW5jZSBib290IGluIHRoZSB7QGxpbmsgU3lzdGVtQ2xvY2sjZWxhcHNlZFJlYWx0aW1lfSB0aW1lIGJhc2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBzdGF0dXMgdGltZXN0YW1wIGluIHRoZSB7QGxpbmsgU3lzdGVtQ2xvY2sjZWxhcHNlZFJlYWx0aW1lKCl9IHRpbWUgYmFzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRUaW1lc3RhbXAoKSB7CisgICAgICAgIHJldHVybiBtQnVuZGxlLmdldExvbmcoS0VZX1RJTUVTVEFNUCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgc2Vzc2lvbiBzdGF0ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHNlc3Npb24gc3RhdGUuICBPbmUgb2Yge0BsaW5rICNTRVNTSU9OX1NUQVRFX0FDVElWRX0sCisgICAgICoge0BsaW5rICNTRVNTSU9OX1NUQVRFX0VOREVEfSwgb3Ige0BsaW5rICNTRVNTSU9OX1NUQVRFX0lOVkFMSURBVEVEfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFNlc3Npb25TdGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEtFWV9TRVNTSU9OX1NUQVRFLCBTRVNTSU9OX1NUQVRFX0lOVkFMSURBVEVEKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlc3Npb24ncyBxdWV1ZSBpcyBwYXVzZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHNlc3Npb24ncyBxdWV1ZSBpcyBwYXVzZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNRdWV1ZVBhdXNlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0Qm9vbGVhbihLRVlfUVVFVUVfUEFVU0VEKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGEgYnVuZGxlIG9mIGV4dHJhcyBmb3IgdGhpcyBzdGF0dXMgb2JqZWN0LgorICAgICAqIFRoZSBleHRyYXMgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgYnV0IHRoZXkgbWF5IGJlIHVzZWQKKyAgICAgKiBieSBhcHBsaWNhdGlvbnMuCisgICAgICovCisgICAgcHVibGljIEJ1bmRsZSBnZXRFeHRyYXMoKSB7CisgICAgICAgIHJldHVybiBtQnVuZGxlLmdldEJ1bmRsZShLRVlfRVhUUkFTKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIk1lZGlhU2Vzc2lvblN0YXR1c3sgIik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoInRpbWVzdGFtcD0iKTsKKyAgICAgICAgVGltZVV0aWxzLmZvcm1hdER1cmF0aW9uKFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpIC0gZ2V0VGltZXN0YW1wKCksIHJlc3VsdCk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiBtcyBhZ28iKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBzZXNzaW9uU3RhdGU9IikuYXBwZW5kKHNlc3Npb25TdGF0ZVRvU3RyaW5nKGdldFNlc3Npb25TdGF0ZSgpKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgcXVldWVQYXVzZWQ9IikuYXBwZW5kKGlzUXVldWVQYXVzZWQoKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZXh0cmFzPSIpLmFwcGVuZChnZXRFeHRyYXMoKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiB9Iik7CisgICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc2Vzc2lvblN0YXRlVG9TdHJpbmcoaW50IHNlc3Npb25TdGF0ZSkgeworICAgICAgICBzd2l0Y2ggKHNlc3Npb25TdGF0ZSkgeworICAgICAgICAgICAgY2FzZSBTRVNTSU9OX1NUQVRFX0FDVElWRToKKyAgICAgICAgICAgICAgICByZXR1cm4gImFjdGl2ZSI7CisgICAgICAgICAgICBjYXNlIFNFU1NJT05fU1RBVEVfRU5ERUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJlbmRlZCI7CisgICAgICAgICAgICBjYXNlIFNFU1NJT05fU1RBVEVfSU5WQUxJREFURUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJpbnZhbGlkYXRlZCI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEludGVnZXIudG9TdHJpbmcoc2Vzc2lvblN0YXRlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0cyB0aGlzIG9iamVjdCB0byBhIGJ1bmRsZSBmb3Igc2VyaWFsaXphdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGNvbnRlbnRzIG9mIHRoZSBvYmplY3QgcmVwcmVzZW50ZWQgYXMgYSBidW5kbGUuCisgICAgICovCisgICAgcHVibGljIEJ1bmRsZSBhc0J1bmRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1CdW5kbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmcm9tIGEgYnVuZGxlLgorICAgICAqCisgICAgICogQHBhcmFtIGJ1bmRsZSBUaGUgYnVuZGxlLCBvciBudWxsIGlmIG5vbmUuCisgICAgICogQHJldHVybiBUaGUgbmV3IGluc3RhbmNlLCBvciBudWxsIGlmIHRoZSBidW5kbGUgd2FzIG51bGwuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBNZWRpYVNlc3Npb25TdGF0dXMgZnJvbUJ1bmRsZShCdW5kbGUgYnVuZGxlKSB7CisgICAgICAgIHJldHVybiBidW5kbGUgIT0gbnVsbCA/IG5ldyBNZWRpYVNlc3Npb25TdGF0dXMoYnVuZGxlKSA6IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQnVpbGRlciBmb3Ige0BsaW5rIE1lZGlhU2Vzc2lvblN0YXR1cyBtZWRpYSBzZXNzaW9uIHN0YXR1cyBvYmplY3RzfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgeworICAgICAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgbWVkaWEgc2Vzc2lvbiBzdGF0dXMgYnVpbGRlciB1c2luZyB0aGUgY3VycmVudCB0aW1lIGFzIHRoZQorICAgICAgICAgKiByZWZlcmVuY2UgdGltZXN0YW1wLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvblN0YXRlIFRoZSBzZXNzaW9uIHN0YXRlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIoaW50IHNlc3Npb25TdGF0ZSkgeworICAgICAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgIHNldFRpbWVzdGFtcChTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKSk7CisgICAgICAgICAgICBzZXRTZXNzaW9uU3RhdGUoc2Vzc2lvblN0YXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgbWVkaWEgc2Vzc2lvbiBzdGF0dXMgYnVpbGRlciB3aG9zZSBpbml0aWFsIGNvbnRlbnRzIGFyZQorICAgICAgICAgKiBjb3BpZWQgZnJvbSBhbiBleGlzdGluZyBzdGF0dXMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlcihNZWRpYVNlc3Npb25TdGF0dXMgc3RhdHVzKSB7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzdGF0dXMgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZShzdGF0dXMubUJ1bmRsZSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgdGltZXN0YW1wIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3RhdHVzIGluZm9ybWF0aW9uIGluCisgICAgICAgICAqIG1pbGxpc2Vjb25kcyBzaW5jZSBib290IGluIHRoZSB7QGxpbmsgU3lzdGVtQ2xvY2sjZWxhcHNlZFJlYWx0aW1lfSB0aW1lIGJhc2UuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRUaW1lc3RhbXAobG9uZyBlbGFwc2VkUmVhbHRpbWVUaW1lc3RhbXApIHsKKyAgICAgICAgICAgIG1CdW5kbGUucHV0TG9uZyhLRVlfVElNRVNUQU1QLCBlbGFwc2VkUmVhbHRpbWVUaW1lc3RhbXApOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgc2Vzc2lvbiBzdGF0ZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFNlc3Npb25TdGF0ZShpbnQgc2Vzc2lvblN0YXRlKSB7CisgICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfU0VTU0lPTl9TVEFURSwgc2Vzc2lvblN0YXRlKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgd2hldGhlciB0aGUgcXVldWUgaXMgcGF1c2VkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0UXVldWVQYXVzZWQoYm9vbGVhbiBxdWV1ZVBhdXNlZCkgeworICAgICAgICAgICAgbUJ1bmRsZS5wdXRCb29sZWFuKEtFWV9RVUVVRV9QQVVTRUQsIHF1ZXVlUGF1c2VkKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgYSBidW5kbGUgb2YgZXh0cmFzIGZvciB0aGlzIHN0YXR1cyBvYmplY3QuCisgICAgICAgICAqIFRoZSBleHRyYXMgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgYnV0IHRoZXkgbWF5IGJlIHVzZWQKKyAgICAgICAgICogYnkgYXBwbGljYXRpb25zLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RXh0cmFzKEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgICAgIG1CdW5kbGUucHV0QnVuZGxlKEtFWV9FWFRSQVMsIGV4dHJhcyk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBCdWlsZHMgdGhlIHtAbGluayBNZWRpYVNlc3Npb25TdGF0dXMgbWVkaWEgc2Vzc2lvbiBzdGF0dXMgb2JqZWN0fS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBNZWRpYVNlc3Npb25TdGF0dXMgYnVpbGQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvblN0YXR1cyhtQnVuZGxlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ZTRlMjgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNzQxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7CisKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfREFUQV9ST1VURV9JRDsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAorICAgICAgICAuQ0xJRU5UX0RBVEFfUk9VVEVfTElCUkFSWV9HUk9VUDsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAorICAgICAgICAuQ0xJRU5UX0RBVEFfVU5TRUxFQ1RfUkVBU09OOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9EQVRBX1ZPTFVNRTsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAorICAgICAgICAuQ0xJRU5UX01TR19DUkVBVEVfUk9VVEVfQ09OVFJPTExFUjsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfTVNHX1JFR0lTVEVSOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCisgICAgICAgIC5DTElFTlRfTVNHX1JFTEVBU0VfUk9VVEVfQ09OVFJPTExFUjsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAorICAgICAgICAuQ0xJRU5UX01TR19ST1VURV9DT05UUk9MX1JFUVVFU1Q7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX01TR19TRUxFQ1RfUk9VVEU7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKKyAgICAgICAgLkNMSUVOVF9NU0dfU0VUX0RJU0NPVkVSWV9SRVFVRVNUOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCisgICAgICAgIC5DTElFTlRfTVNHX1NFVF9ST1VURV9WT0xVTUU7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX01TR19VTlJFR0lTVEVSOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCisgICAgICAgIC5DTElFTlRfTVNHX1VOU0VMRUNUX1JPVVRFOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCisgICAgICAgIC5DTElFTlRfTVNHX1VQREFURV9ST1VURV9WT0xVTUU7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX1ZFUlNJT05fQ1VSUkVOVDsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5TRVJWSUNFX0RBVEFfRVJST1I7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKKyAgICAgICAgLlNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9GQUlMRUQ7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKKyAgICAgICAgLlNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9TVUNDRUVERUQ7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKKyAgICAgICAgLlNFUlZJQ0VfTVNHX0RFU0NSSVBUT1JfQ0hBTkdFRDsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAorICAgICAgICAuU0VSVklDRV9NU0dfR0VORVJJQ19GQUlMVVJFOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCisgICAgICAgIC5TRVJWSUNFX01TR19HRU5FUklDX1NVQ0NFU1M7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuU0VSVklDRV9NU0dfUkVHSVNURVJFRDsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5TRVJWSUNFX1ZFUlNJT05fMTsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5pc1ZhbGlkUmVtb3RlTWVzc2VuZ2VyOworCitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2VydmljZUNvbm5lY3Rpb247CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5EZWFkT2JqZWN0RXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyLkRlYXRoUmVjaXBpZW50OworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NlbmdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKKworaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXIuQ29udHJvbFJlcXVlc3RDYWxsYmFjazsKKworaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIE1haW50YWlucyBhIGNvbm5lY3Rpb24gdG8gYSBwYXJ0aWN1bGFyIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHNlcnZpY2UuCisgKi8KK2ZpbmFsIGNsYXNzIFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXIgZXh0ZW5kcyBNZWRpYVJvdXRlUHJvdmlkZXIKKyAgICAgICAgaW1wbGVtZW50cyBTZXJ2aWNlQ29ubmVjdGlvbiB7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFSb3V0ZVByb3ZpZGVyUHJveHkiOyAgLy8gbWF4LiAyMyBjaGFycworICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpOworCisgICAgcHJpdmF0ZSBmaW5hbCBDb21wb25lbnROYW1lIG1Db21wb25lbnROYW1lOworICAgIGZpbmFsIFByaXZhdGVIYW5kbGVyIG1Qcml2YXRlSGFuZGxlcjsKKyAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxDb250cm9sbGVyPiBtQ29udHJvbGxlcnMgPSBuZXcgQXJyYXlMaXN0PENvbnRyb2xsZXI+KCk7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbVN0YXJ0ZWQ7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Cb3VuZDsKKyAgICBwcml2YXRlIENvbm5lY3Rpb24gbUFjdGl2ZUNvbm5lY3Rpb247CisgICAgcHJpdmF0ZSBib29sZWFuIG1Db25uZWN0aW9uUmVhZHk7CisKKyAgICBwdWJsaWMgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcihDb250ZXh0IGNvbnRleHQsIENvbXBvbmVudE5hbWUgY29tcG9uZW50TmFtZSkgeworICAgICAgICBzdXBlcihjb250ZXh0LCBuZXcgUHJvdmlkZXJNZXRhZGF0YShjb21wb25lbnROYW1lKSk7CisKKyAgICAgICAgbUNvbXBvbmVudE5hbWUgPSBjb21wb25lbnROYW1lOworICAgICAgICBtUHJpdmF0ZUhhbmRsZXIgPSBuZXcgUHJpdmF0ZUhhbmRsZXIoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUm91dGVDb250cm9sbGVyIG9uQ3JlYXRlUm91dGVDb250cm9sbGVyKEBOb25OdWxsIFN0cmluZyByb3V0ZUlkKSB7CisgICAgICAgIGlmIChyb3V0ZUlkID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvdXRlSWQgY2Fubm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3JlYXRlUm91dGVDb250cm9sbGVyKHJvdXRlSWQsIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSb3V0ZUNvbnRyb2xsZXIgb25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoCisgICAgICAgICAgICBATm9uTnVsbCBTdHJpbmcgcm91dGVJZCwgQE5vbk51bGwgU3RyaW5nIHJvdXRlR3JvdXBJZCkgeworICAgICAgICBpZiAocm91dGVJZCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZUlkIGNhbm5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJvdXRlR3JvdXBJZCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZUdyb3VwSWQgY2Fubm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3JlYXRlUm91dGVDb250cm9sbGVyKHJvdXRlSWQsIHJvdXRlR3JvdXBJZCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25EaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZChNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIGlmIChtQ29ubmVjdGlvblJlYWR5KSB7CisgICAgICAgICAgICBtQWN0aXZlQ29ubmVjdGlvbi5zZXREaXNjb3ZlcnlSZXF1ZXN0KHJlcXVlc3QpOworICAgICAgICB9CisgICAgICAgIHVwZGF0ZUJpbmRpbmcoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VDb25uZWN0ZWQoQ29tcG9uZW50TmFtZSBuYW1lLCBJQmluZGVyIHNlcnZpY2UpIHsKKyAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBDb25uZWN0ZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtQm91bmQpIHsKKyAgICAgICAgICAgIGRpc2Nvbm5lY3QoKTsKKworICAgICAgICAgICAgTWVzc2VuZ2VyIG1lc3NlbmdlciA9IChzZXJ2aWNlICE9IG51bGwgPyBuZXcgTWVzc2VuZ2VyKHNlcnZpY2UpIDogbnVsbCk7CisgICAgICAgICAgICBpZiAoaXNWYWxpZFJlbW90ZU1lc3NlbmdlcihtZXNzZW5nZXIpKSB7CisgICAgICAgICAgICAgICAgQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24obWVzc2VuZ2VyKTsKKyAgICAgICAgICAgICAgICBpZiAoY29ubmVjdGlvbi5yZWdpc3RlcigpKSB7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVDb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IFJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCB0aGlzICsgIjogU2VydmljZSByZXR1cm5lZCBpbnZhbGlkIG1lc3NlbmdlciBiaW5kZXIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZURpc2Nvbm5lY3RlZChDb21wb25lbnROYW1lIG5hbWUpIHsKKyAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBTZXJ2aWNlIGRpc2Nvbm5lY3RlZCIpOworICAgICAgICB9CisgICAgICAgIGRpc2Nvbm5lY3QoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIlNlcnZpY2UgY29ubmVjdGlvbiAiICsgbUNvbXBvbmVudE5hbWUuZmxhdHRlblRvU2hvcnRTdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNDb21wb25lbnROYW1lKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGNsYXNzTmFtZSkgeworICAgICAgICByZXR1cm4gbUNvbXBvbmVudE5hbWUuZ2V0UGFja2FnZU5hbWUoKS5lcXVhbHMocGFja2FnZU5hbWUpCisgICAgICAgICAgICAgICAgJiYgbUNvbXBvbmVudE5hbWUuZ2V0Q2xhc3NOYW1lKCkuZXF1YWxzKGNsYXNzTmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB7CisgICAgICAgIGlmICghbVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IFN0YXJ0aW5nIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1TdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIHVwZGF0ZUJpbmRpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogU3RvcHBpbmciKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHVwZGF0ZUJpbmRpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlYmluZElmRGlzY29ubmVjdGVkKCkgeworICAgICAgICBpZiAobUFjdGl2ZUNvbm5lY3Rpb24gPT0gbnVsbCAmJiBzaG91bGRCaW5kKCkpIHsKKyAgICAgICAgICAgIHVuYmluZCgpOworICAgICAgICAgICAgYmluZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUJpbmRpbmcoKSB7CisgICAgICAgIGlmIChzaG91bGRCaW5kKCkpIHsKKyAgICAgICAgICAgIGJpbmQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVuYmluZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZEJpbmQoKSB7CisgICAgICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICAgICAgLy8gQmluZCB3aGVuZXZlciB0aGVyZSBpcyBhIGRpc2NvdmVyeSByZXF1ZXN0LgorICAgICAgICAgICAgaWYgKGdldERpc2NvdmVyeVJlcXVlc3QoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEJpbmQgd2hlbmV2ZXIgdGhlIGFwcGxpY2F0aW9uIGhhcyBhbiBhY3RpdmUgcm91dGUgY29udHJvbGxlci4KKyAgICAgICAgICAgIC8vIFRoaXMgbWVhbnMgdGhhdCBvbmUgb2YgdGhpcyBwcm92aWRlcidzIHJvdXRlcyBpcyBzZWxlY3RlZC4KKyAgICAgICAgICAgIGlmICghbUNvbnRyb2xsZXJzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYmluZCgpIHsKKyAgICAgICAgaWYgKCFtQm91bmQpIHsKKyAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IEJpbmRpbmciKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgSW50ZW50IHNlcnZpY2UgPSBuZXcgSW50ZW50KE1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLlNFUlZJQ0VfSU5URVJGQUNFKTsKKyAgICAgICAgICAgIHNlcnZpY2Uuc2V0Q29tcG9uZW50KG1Db21wb25lbnROYW1lKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbUJvdW5kID0gZ2V0Q29udGV4dCgpLmJpbmRTZXJ2aWNlKHNlcnZpY2UsIHRoaXMsIENvbnRleHQuQklORF9BVVRPX0NSRUFURSk7CisgICAgICAgICAgICAgICAgaWYgKCFtQm91bmQgJiYgREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogQmluZCBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBCaW5kIGZhaWxlZCIsIGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdW5iaW5kKCkgeworICAgICAgICBpZiAobUJvdW5kKSB7CisgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBVbmJpbmRpbmciKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUJvdW5kID0gZmFsc2U7CisgICAgICAgICAgICBkaXNjb25uZWN0KCk7CisgICAgICAgICAgICBnZXRDb250ZXh0KCkudW5iaW5kU2VydmljZSh0aGlzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgUm91dGVDb250cm9sbGVyIGNyZWF0ZVJvdXRlQ29udHJvbGxlcihTdHJpbmcgcm91dGVJZCwgU3RyaW5nIHJvdXRlR3JvdXBJZCkgeworICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBnZXREZXNjcmlwdG9yKCk7CisgICAgICAgIGlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgIExpc3Q8TWVkaWFSb3V0ZURlc2NyaXB0b3I+IHJvdXRlcyA9IGRlc2NyaXB0b3IuZ2V0Um91dGVzKCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSByb3V0ZXMuc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFSb3V0ZURlc2NyaXB0b3Igcm91dGUgPSByb3V0ZXMuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChyb3V0ZS5nZXRJZCgpLmVxdWFscyhyb3V0ZUlkKSkgeworICAgICAgICAgICAgICAgICAgICBDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBuZXcgQ29udHJvbGxlcihyb3V0ZUlkLCByb3V0ZUdyb3VwSWQpOworICAgICAgICAgICAgICAgICAgICBtQ29udHJvbGxlcnMuYWRkKGNvbnRyb2xsZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAobUNvbm5lY3Rpb25SZWFkeSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5hdHRhY2hDb25uZWN0aW9uKG1BY3RpdmVDb25uZWN0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB1cGRhdGVCaW5kaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250cm9sbGVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICB2b2lkIG9uQ29ubmVjdGlvblJlYWR5KENvbm5lY3Rpb24gY29ubmVjdGlvbikgeworICAgICAgICBpZiAobUFjdGl2ZUNvbm5lY3Rpb24gPT0gY29ubmVjdGlvbikgeworICAgICAgICAgICAgbUNvbm5lY3Rpb25SZWFkeSA9IHRydWU7CisgICAgICAgICAgICBhdHRhY2hDb250cm9sbGVyc1RvQ29ubmVjdGlvbigpOworCisgICAgICAgICAgICBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0ID0gZ2V0RGlzY292ZXJ5UmVxdWVzdCgpOworICAgICAgICAgICAgaWYgKHJlcXVlc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1BY3RpdmVDb25uZWN0aW9uLnNldERpc2NvdmVyeVJlcXVlc3QocmVxdWVzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIG9uQ29ubmVjdGlvbkRpZWQoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7CisgICAgICAgIGlmIChtQWN0aXZlQ29ubmVjdGlvbiA9PSBjb25uZWN0aW9uKSB7CisgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBTZXJ2aWNlIGNvbm5lY3Rpb24gZGllZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGlzY29ubmVjdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBvbkNvbm5lY3Rpb25FcnJvcihDb25uZWN0aW9uIGNvbm5lY3Rpb24sIFN0cmluZyBlcnJvcikgeworICAgICAgICBpZiAobUFjdGl2ZUNvbm5lY3Rpb24gPT0gY29ubmVjdGlvbikgeworICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogU2VydmljZSBjb25uZWN0aW9uIGVycm9yIC0gIiArIGVycm9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVuYmluZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBvbkNvbm5lY3Rpb25EZXNjcmlwdG9yQ2hhbmdlZChDb25uZWN0aW9uIGNvbm5lY3Rpb24sCisgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKKyAgICAgICAgaWYgKG1BY3RpdmVDb25uZWN0aW9uID09IGNvbm5lY3Rpb24pIHsKKyAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IERlc2NyaXB0b3IgY2hhbmdlZCwgZGVzY3JpcHRvcj0iICsgZGVzY3JpcHRvcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXREZXNjcmlwdG9yKGRlc2NyaXB0b3IpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRpc2Nvbm5lY3QoKSB7CisgICAgICAgIGlmIChtQWN0aXZlQ29ubmVjdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBzZXREZXNjcmlwdG9yKG51bGwpOworICAgICAgICAgICAgbUNvbm5lY3Rpb25SZWFkeSA9IGZhbHNlOworICAgICAgICAgICAgZGV0YWNoQ29udHJvbGxlcnNGcm9tQ29ubmVjdGlvbigpOworICAgICAgICAgICAgbUFjdGl2ZUNvbm5lY3Rpb24uZGlzcG9zZSgpOworICAgICAgICAgICAgbUFjdGl2ZUNvbm5lY3Rpb24gPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBvbkNvbnRyb2xsZXJSZWxlYXNlZChDb250cm9sbGVyIGNvbnRyb2xsZXIpIHsKKyAgICAgICAgbUNvbnRyb2xsZXJzLnJlbW92ZShjb250cm9sbGVyKTsKKyAgICAgICAgY29udHJvbGxlci5kZXRhY2hDb25uZWN0aW9uKCk7CisgICAgICAgIHVwZGF0ZUJpbmRpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXR0YWNoQ29udHJvbGxlcnNUb0Nvbm5lY3Rpb24oKSB7CisgICAgICAgIGludCBjb3VudCA9IG1Db250cm9sbGVycy5zaXplKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgbUNvbnRyb2xsZXJzLmdldChpKS5hdHRhY2hDb25uZWN0aW9uKG1BY3RpdmVDb25uZWN0aW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkZXRhY2hDb250cm9sbGVyc0Zyb21Db25uZWN0aW9uKCkgeworICAgICAgICBpbnQgY291bnQgPSBtQ29udHJvbGxlcnMuc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIG1Db250cm9sbGVycy5nZXQoaSkuZGV0YWNoQ29ubmVjdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBDb250cm9sbGVyIGV4dGVuZHMgUm91dGVDb250cm9sbGVyIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVJvdXRlSWQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Sb3V0ZUdyb3VwSWQ7CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1TZWxlY3RlZDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVBlbmRpbmdTZXRWb2x1bWUgPSAtMTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVBlbmRpbmdVcGRhdGVWb2x1bWVEZWx0YTsKKworICAgICAgICBwcml2YXRlIENvbm5lY3Rpb24gbUNvbm5lY3Rpb247CisgICAgICAgIHByaXZhdGUgaW50IG1Db250cm9sbGVySWQ7CisKKyAgICAgICAgcHVibGljIENvbnRyb2xsZXIoU3RyaW5nIHJvdXRlSWQsIFN0cmluZyByb3V0ZUdyb3VwSWQpIHsKKyAgICAgICAgICAgIG1Sb3V0ZUlkID0gcm91dGVJZDsKKyAgICAgICAgICAgIG1Sb3V0ZUdyb3VwSWQgPSByb3V0ZUdyb3VwSWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhdHRhY2hDb25uZWN0aW9uKENvbm5lY3Rpb24gY29ubmVjdGlvbikgeworICAgICAgICAgICAgbUNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworICAgICAgICAgICAgbUNvbnRyb2xsZXJJZCA9IGNvbm5lY3Rpb24uY3JlYXRlUm91dGVDb250cm9sbGVyKG1Sb3V0ZUlkLCBtUm91dGVHcm91cElkKTsKKyAgICAgICAgICAgIGlmIChtU2VsZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnNlbGVjdFJvdXRlKG1Db250cm9sbGVySWQpOworICAgICAgICAgICAgICAgIGlmIChtUGVuZGluZ1NldFZvbHVtZSA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uc2V0Vm9sdW1lKG1Db250cm9sbGVySWQsIG1QZW5kaW5nU2V0Vm9sdW1lKTsKKyAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdTZXRWb2x1bWUgPSAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1QZW5kaW5nVXBkYXRlVm9sdW1lRGVsdGEgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnVwZGF0ZVZvbHVtZShtQ29udHJvbGxlcklkLCBtUGVuZGluZ1VwZGF0ZVZvbHVtZURlbHRhKTsKKyAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdVcGRhdGVWb2x1bWVEZWx0YSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZGV0YWNoQ29ubmVjdGlvbigpIHsKKyAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb24ucmVsZWFzZVJvdXRlQ29udHJvbGxlcihtQ29udHJvbGxlcklkKTsKKyAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbiA9IG51bGw7CisgICAgICAgICAgICAgICAgbUNvbnRyb2xsZXJJZCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25SZWxlYXNlKCkgeworICAgICAgICAgICAgb25Db250cm9sbGVyUmVsZWFzZWQodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TZWxlY3QoKSB7CisgICAgICAgICAgICBtU2VsZWN0ZWQgPSB0cnVlOworICAgICAgICAgICAgaWYgKG1Db25uZWN0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbi5zZWxlY3RSb3V0ZShtQ29udHJvbGxlcklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblVuc2VsZWN0KCkgeworICAgICAgICAgICAgb25VbnNlbGVjdChNZWRpYVJvdXRlci5VTlNFTEVDVF9SRUFTT05fVU5LTk9XTik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25VbnNlbGVjdChpbnQgcmVhc29uKSB7CisgICAgICAgICAgICBtU2VsZWN0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb24udW5zZWxlY3RSb3V0ZShtQ29udHJvbGxlcklkLCByZWFzb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2V0Vm9sdW1lKGludCB2b2x1bWUpIHsKKyAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb24uc2V0Vm9sdW1lKG1Db250cm9sbGVySWQsIHZvbHVtZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1QZW5kaW5nU2V0Vm9sdW1lID0gdm9sdW1lOworICAgICAgICAgICAgICAgIG1QZW5kaW5nVXBkYXRlVm9sdW1lRGVsdGEgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uVXBkYXRlVm9sdW1lKGludCBkZWx0YSkgeworICAgICAgICAgICAgaWYgKG1Db25uZWN0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbi51cGRhdGVWb2x1bWUobUNvbnRyb2xsZXJJZCwgZGVsdGEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtUGVuZGluZ1VwZGF0ZVZvbHVtZURlbHRhICs9IGRlbHRhOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uQ29udHJvbFJlcXVlc3QoSW50ZW50IGludGVudCwgQ29udHJvbFJlcXVlc3RDYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICAgICAgaWYgKG1Db25uZWN0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbUNvbm5lY3Rpb24uc2VuZENvbnRyb2xSZXF1ZXN0KG1Db250cm9sbGVySWQsIGludGVudCwgY2FsbGJhY2spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBDb25uZWN0aW9uIGltcGxlbWVudHMgRGVhdGhSZWNpcGllbnQgeworICAgICAgICBwcml2YXRlIGZpbmFsIE1lc3NlbmdlciBtU2VydmljZU1lc3NlbmdlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZWNlaXZlSGFuZGxlciBtUmVjZWl2ZUhhbmRsZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgTWVzc2VuZ2VyIG1SZWNlaXZlTWVzc2VuZ2VyOworCisgICAgICAgIHByaXZhdGUgaW50IG1OZXh0UmVxdWVzdElkID0gMTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbU5leHRDb250cm9sbGVySWQgPSAxOworICAgICAgICBwcml2YXRlIGludCBtU2VydmljZVZlcnNpb247IC8vIG5vbi16ZXJvIHdoZW4gcmVnaXN0cmF0aW9uIGNvbXBsZXRlCisKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVBlbmRpbmdSZWdpc3RlclJlcXVlc3RJZDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTcGFyc2VBcnJheTxDb250cm9sUmVxdWVzdENhbGxiYWNrPiBtUGVuZGluZ0NhbGxiYWNrcyA9CisgICAgICAgICAgICAgICAgbmV3IFNwYXJzZUFycmF5PENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2s+KCk7CisKKyAgICAgICAgcHVibGljIENvbm5lY3Rpb24oTWVzc2VuZ2VyIHNlcnZpY2VNZXNzZW5nZXIpIHsKKyAgICAgICAgICAgIG1TZXJ2aWNlTWVzc2VuZ2VyID0gc2VydmljZU1lc3NlbmdlcjsKKyAgICAgICAgICAgIG1SZWNlaXZlSGFuZGxlciA9IG5ldyBSZWNlaXZlSGFuZGxlcih0aGlzKTsKKyAgICAgICAgICAgIG1SZWNlaXZlTWVzc2VuZ2VyID0gbmV3IE1lc3NlbmdlcihtUmVjZWl2ZUhhbmRsZXIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcmVnaXN0ZXIoKSB7CisgICAgICAgICAgICBtUGVuZGluZ1JlZ2lzdGVyUmVxdWVzdElkID0gbU5leHRSZXF1ZXN0SWQrKzsKKyAgICAgICAgICAgIGlmICghc2VuZFJlcXVlc3QoQ0xJRU5UX01TR19SRUdJU1RFUiwKKyAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdSZWdpc3RlclJlcXVlc3RJZCwKKyAgICAgICAgICAgICAgICAgICAgQ0xJRU5UX1ZFUlNJT05fQ1VSUkVOVCwgbnVsbCwgbnVsbCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNlcnZpY2VNZXNzZW5nZXIuZ2V0QmluZGVyKCkubGlua1RvRGVhdGgodGhpcywgMCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICBiaW5kZXJEaWVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworICAgICAgICAgICAgc2VuZFJlcXVlc3QoQ0xJRU5UX01TR19VTlJFR0lTVEVSLCAwLCAwLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIG1SZWNlaXZlSGFuZGxlci5kaXNwb3NlKCk7CisgICAgICAgICAgICBtU2VydmljZU1lc3Nlbmdlci5nZXRCaW5kZXIoKS51bmxpbmtUb0RlYXRoKHRoaXMsIDApOworCisgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBmYWlsUGVuZGluZ0NhbGxiYWNrcygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBmYWlsUGVuZGluZ0NhbGxiYWNrcygpIHsKKyAgICAgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1QZW5kaW5nQ2FsbGJhY2tzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgbVBlbmRpbmdDYWxsYmFja3MudmFsdWVBdChpKS5vbkVycm9yKG51bGwsIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVBlbmRpbmdDYWxsYmFja3MuY2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uR2VuZXJpY0ZhaWx1cmUoaW50IHJlcXVlc3RJZCkgeworICAgICAgICAgICAgaWYgKHJlcXVlc3RJZCA9PSBtUGVuZGluZ1JlZ2lzdGVyUmVxdWVzdElkKSB7CisgICAgICAgICAgICAgICAgbVBlbmRpbmdSZWdpc3RlclJlcXVlc3RJZCA9IDA7CisgICAgICAgICAgICAgICAgb25Db25uZWN0aW9uRXJyb3IodGhpcywgIlJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgY2FsbGJhY2sgPSBtUGVuZGluZ0NhbGxiYWNrcy5nZXQocmVxdWVzdElkKTsKKyAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVBlbmRpbmdDYWxsYmFja3MucmVtb3ZlKHJlcXVlc3RJZCk7CisgICAgICAgICAgICAgICAgY2FsbGJhY2sub25FcnJvcihudWxsLCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25HZW5lcmljU3VjY2VzcyhpbnQgcmVxdWVzdElkKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uUmVnaXN0ZXJlZChpbnQgcmVxdWVzdElkLCBpbnQgc2VydmljZVZlcnNpb24sCisgICAgICAgICAgICAgICAgQnVuZGxlIGRlc2NyaXB0b3JCdW5kbGUpIHsKKyAgICAgICAgICAgIGlmIChtU2VydmljZVZlcnNpb24gPT0gMAorICAgICAgICAgICAgICAgICAgICAmJiByZXF1ZXN0SWQgPT0gbVBlbmRpbmdSZWdpc3RlclJlcXVlc3RJZAorICAgICAgICAgICAgICAgICAgICAmJiBzZXJ2aWNlVmVyc2lvbiA+PSBTRVJWSUNFX1ZFUlNJT05fMSkgeworICAgICAgICAgICAgICAgIG1QZW5kaW5nUmVnaXN0ZXJSZXF1ZXN0SWQgPSAwOworICAgICAgICAgICAgICAgIG1TZXJ2aWNlVmVyc2lvbiA9IHNlcnZpY2VWZXJzaW9uOworICAgICAgICAgICAgICAgIG9uQ29ubmVjdGlvbkRlc2NyaXB0b3JDaGFuZ2VkKHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLmZyb21CdW5kbGUoZGVzY3JpcHRvckJ1bmRsZSkpOworICAgICAgICAgICAgICAgIG9uQ29ubmVjdGlvblJlYWR5KHRoaXMpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25EZXNjcmlwdG9yQ2hhbmdlZChCdW5kbGUgZGVzY3JpcHRvckJ1bmRsZSkgeworICAgICAgICAgICAgaWYgKG1TZXJ2aWNlVmVyc2lvbiAhPSAwKSB7CisgICAgICAgICAgICAgICAgb25Db25uZWN0aW9uRGVzY3JpcHRvckNoYW5nZWQodGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IuZnJvbUJ1bmRsZShkZXNjcmlwdG9yQnVuZGxlKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNvbnRyb2xSZXF1ZXN0U3VjY2VlZGVkKGludCByZXF1ZXN0SWQsIEJ1bmRsZSBkYXRhKSB7CisgICAgICAgICAgICBDb250cm9sUmVxdWVzdENhbGxiYWNrIGNhbGxiYWNrID0gbVBlbmRpbmdDYWxsYmFja3MuZ2V0KHJlcXVlc3RJZCk7CisgICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1QZW5kaW5nQ2FsbGJhY2tzLnJlbW92ZShyZXF1ZXN0SWQpOworICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUmVzdWx0KGRhdGEpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25Db250cm9sUmVxdWVzdEZhaWxlZChpbnQgcmVxdWVzdElkLCBTdHJpbmcgZXJyb3IsIEJ1bmRsZSBkYXRhKSB7CisgICAgICAgICAgICBDb250cm9sUmVxdWVzdENhbGxiYWNrIGNhbGxiYWNrID0gbVBlbmRpbmdDYWxsYmFja3MuZ2V0KHJlcXVlc3RJZCk7CisgICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1QZW5kaW5nQ2FsbGJhY2tzLnJlbW92ZShyZXF1ZXN0SWQpOworICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uRXJyb3IoZXJyb3IsIGRhdGEpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGJpbmRlckRpZWQoKSB7CisgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBvbkNvbm5lY3Rpb25EaWVkKENvbm5lY3Rpb24udGhpcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGNyZWF0ZVJvdXRlQ29udHJvbGxlcihTdHJpbmcgcm91dGVJZCwgU3RyaW5nIHJvdXRlR3JvdXBJZCkgeworICAgICAgICAgICAgaW50IGNvbnRyb2xsZXJJZCA9IG1OZXh0Q29udHJvbGxlcklkKys7CisgICAgICAgICAgICBCdW5kbGUgZGF0YSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgIGRhdGEucHV0U3RyaW5nKENMSUVOVF9EQVRBX1JPVVRFX0lELCByb3V0ZUlkKTsKKyAgICAgICAgICAgIGRhdGEucHV0U3RyaW5nKENMSUVOVF9EQVRBX1JPVVRFX0xJQlJBUllfR1JPVVAsIHJvdXRlR3JvdXBJZCk7CisgICAgICAgICAgICBzZW5kUmVxdWVzdChDTElFTlRfTVNHX0NSRUFURV9ST1VURV9DT05UUk9MTEVSLAorICAgICAgICAgICAgICAgICAgICBtTmV4dFJlcXVlc3RJZCsrLCBjb250cm9sbGVySWQsIG51bGwsIGRhdGEpOworICAgICAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXJJZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlbGVhc2VSb3V0ZUNvbnRyb2xsZXIoaW50IGNvbnRyb2xsZXJJZCkgeworICAgICAgICAgICAgc2VuZFJlcXVlc3QoQ0xJRU5UX01TR19SRUxFQVNFX1JPVVRFX0NPTlRST0xMRVIsCisgICAgICAgICAgICAgICAgICAgIG1OZXh0UmVxdWVzdElkKyssIGNvbnRyb2xsZXJJZCwgbnVsbCwgbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3RSb3V0ZShpbnQgY29udHJvbGxlcklkKSB7CisgICAgICAgICAgICBzZW5kUmVxdWVzdChDTElFTlRfTVNHX1NFTEVDVF9ST1VURSwKKyAgICAgICAgICAgICAgICAgICAgbU5leHRSZXF1ZXN0SWQrKywgY29udHJvbGxlcklkLCBudWxsLCBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHVuc2VsZWN0Um91dGUoaW50IGNvbnRyb2xsZXJJZCwgaW50IHJlYXNvbikgeworICAgICAgICAgICAgQnVuZGxlIGV4dHJhcyA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgIGV4dHJhcy5wdXRJbnQoQ0xJRU5UX0RBVEFfVU5TRUxFQ1RfUkVBU09OLCByZWFzb24pOworICAgICAgICAgICAgc2VuZFJlcXVlc3QoQ0xJRU5UX01TR19VTlNFTEVDVF9ST1VURSwKKyAgICAgICAgICAgICAgICAgICAgbU5leHRSZXF1ZXN0SWQrKywgY29udHJvbGxlcklkLCBudWxsLCBleHRyYXMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Vm9sdW1lKGludCBjb250cm9sbGVySWQsIGludCB2b2x1bWUpIHsKKyAgICAgICAgICAgIEJ1bmRsZSBkYXRhID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgZGF0YS5wdXRJbnQoQ0xJRU5UX0RBVEFfVk9MVU1FLCB2b2x1bWUpOworICAgICAgICAgICAgc2VuZFJlcXVlc3QoQ0xJRU5UX01TR19TRVRfUk9VVEVfVk9MVU1FLAorICAgICAgICAgICAgICAgICAgICBtTmV4dFJlcXVlc3RJZCsrLCBjb250cm9sbGVySWQsIG51bGwsIGRhdGEpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlVm9sdW1lKGludCBjb250cm9sbGVySWQsIGludCBkZWx0YSkgeworICAgICAgICAgICAgQnVuZGxlIGRhdGEgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICBkYXRhLnB1dEludChDTElFTlRfREFUQV9WT0xVTUUsIGRlbHRhKTsKKyAgICAgICAgICAgIHNlbmRSZXF1ZXN0KENMSUVOVF9NU0dfVVBEQVRFX1JPVVRFX1ZPTFVNRSwKKyAgICAgICAgICAgICAgICAgICAgbU5leHRSZXF1ZXN0SWQrKywgY29udHJvbGxlcklkLCBudWxsLCBkYXRhKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIHNlbmRDb250cm9sUmVxdWVzdChpbnQgY29udHJvbGxlcklkLCBJbnRlbnQgaW50ZW50LAorICAgICAgICAgICAgICAgIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgICAgIGludCByZXF1ZXN0SWQgPSBtTmV4dFJlcXVlc3RJZCsrOworICAgICAgICAgICAgaWYgKHNlbmRSZXF1ZXN0KENMSUVOVF9NU0dfUk9VVEVfQ09OVFJPTF9SRVFVRVNULAorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsIGNvbnRyb2xsZXJJZCwgaW50ZW50LCBudWxsKSkgeworICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nQ2FsbGJhY2tzLnB1dChyZXF1ZXN0SWQsIGNhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXREaXNjb3ZlcnlSZXF1ZXN0KE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgICAgIHNlbmRSZXF1ZXN0KENMSUVOVF9NU0dfU0VUX0RJU0NPVkVSWV9SRVFVRVNULAorICAgICAgICAgICAgICAgICAgICBtTmV4dFJlcXVlc3RJZCsrLCAwLCByZXF1ZXN0ICE9IG51bGwgPyByZXF1ZXN0LmFzQnVuZGxlKCkgOiBudWxsLCBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBzZW5kUmVxdWVzdChpbnQgd2hhdCwgaW50IHJlcXVlc3RJZCwgaW50IGFyZywgT2JqZWN0IG9iaiwgQnVuZGxlIGRhdGEpIHsKKyAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gTWVzc2FnZS5vYnRhaW4oKTsKKyAgICAgICAgICAgIG1zZy53aGF0ID0gd2hhdDsKKyAgICAgICAgICAgIG1zZy5hcmcxID0gcmVxdWVzdElkOworICAgICAgICAgICAgbXNnLmFyZzIgPSBhcmc7CisgICAgICAgICAgICBtc2cub2JqID0gb2JqOworICAgICAgICAgICAgbXNnLnNldERhdGEoZGF0YSk7CisgICAgICAgICAgICBtc2cucmVwbHlUbyA9IG1SZWNlaXZlTWVzc2VuZ2VyOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2VydmljZU1lc3Nlbmdlci5zZW5kKG1zZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9IGNhdGNoIChEZWFkT2JqZWN0RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIHNlcnZpY2UgZGllZC4KKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIGlmICh3aGF0ICE9IENMSUVOVF9NU0dfVU5SRUdJU1RFUikgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZCBub3Qgc2VuZCBtZXNzYWdlIHRvIHNlcnZpY2UuIiwgZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFByaXZhdGVIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7CisgICAgICAgIFByaXZhdGVIYW5kbGVyKCkgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSGFuZGxlciB0aGF0IHJlY2VpdmVzIG1lc3NhZ2VzIGZyb20gdGhlIHNlcnZlci4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGlubmVyIGNsYXNzIGlzIHN0YXRpYyBhbmQgb25seSByZXRhaW5zIGEgd2VhayByZWZlcmVuY2UgdG8gdGhlIGNvbm5lY3Rpb24KKyAgICAgKiB0byBwcmV2ZW50IHRoZSBjbGllbnQgZnJvbSBiZWluZyBsZWFrZWQgaW4gY2FzZSB0aGUgc2VydmljZSBpcyBob2xkaW5nIGFuCisgICAgICogYWN0aXZlIHJlZmVyZW5jZSB0byB0aGUgY2xpZW50J3MgbWVzc2VuZ2VyLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBUaGlzIGhhbmRsZXIgc2hvdWxkIG5vdCBiZSB1c2VkIHRvIGhhbmRsZSBhbnkgbWVzc2FnZXMgb3RoZXIgdGhhbiB0aG9zZQorICAgICAqIHRoYXQgY29tZSBmcm9tIHRoZSBzZXJ2aWNlLgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZWNlaXZlSGFuZGxlciBleHRlbmRzIEhhbmRsZXIgeworICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8Q29ubmVjdGlvbj4gbUNvbm5lY3Rpb25SZWY7CisKKyAgICAgICAgcHVibGljIFJlY2VpdmVIYW5kbGVyKENvbm5lY3Rpb24gY29ubmVjdGlvbikgeworICAgICAgICAgICAgbUNvbm5lY3Rpb25SZWYgPSBuZXcgV2Vha1JlZmVyZW5jZTxDb25uZWN0aW9uPihjb25uZWN0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisgICAgICAgICAgICBtQ29ubmVjdGlvblJlZi5jbGVhcigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IG1Db25uZWN0aW9uUmVmLmdldCgpOworICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCB3aGF0ID0gbXNnLndoYXQ7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHJlcXVlc3RJZCA9IG1zZy5hcmcxOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBhcmcgPSBtc2cuYXJnMjsKKyAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3Qgb2JqID0gbXNnLm9iajsKKyAgICAgICAgICAgICAgICBmaW5hbCBCdW5kbGUgZGF0YSA9IG1zZy5wZWVrRGF0YSgpOworICAgICAgICAgICAgICAgIGlmICghcHJvY2Vzc01lc3NhZ2UoY29ubmVjdGlvbiwgd2hhdCwgcmVxdWVzdElkLCBhcmcsIG9iaiwgZGF0YSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJVbmhhbmRsZWQgbWVzc2FnZSBmcm9tIHNlcnZlcjogIiArIG1zZyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoQ29ubmVjdGlvbiBjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgIGludCB3aGF0LCBpbnQgcmVxdWVzdElkLCBpbnQgYXJnLCBPYmplY3Qgb2JqLCBCdW5kbGUgZGF0YSkgeworICAgICAgICAgICAgc3dpdGNoICh3aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBTRVJWSUNFX01TR19HRU5FUklDX0ZBSUxVUkU6CisgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ub25HZW5lcmljRmFpbHVyZShyZXF1ZXN0SWQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAgICAgICAgIGNhc2UgU0VSVklDRV9NU0dfR0VORVJJQ19TVUNDRVNTOgorICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLm9uR2VuZXJpY1N1Y2Nlc3MocmVxdWVzdElkKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNFUlZJQ0VfTVNHX1JFR0lTVEVSRUQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCB8fCBvYmogaW5zdGFuY2VvZiBCdW5kbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLm9uUmVnaXN0ZXJlZChyZXF1ZXN0SWQsIGFyZywgKEJ1bmRsZSlvYmopOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBTRVJWSUNFX01TR19ERVNDUklQVE9SX0NIQU5HRUQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCB8fCBvYmogaW5zdGFuY2VvZiBCdW5kbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLm9uRGVzY3JpcHRvckNoYW5nZWQoKEJ1bmRsZSlvYmopOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBTRVJWSUNFX01TR19DT05UUk9MX1JFUVVFU1RfU1VDQ0VFREVEOgorICAgICAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwgfHwgb2JqIGluc3RhbmNlb2YgQnVuZGxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbi5vbkNvbnRyb2xSZXF1ZXN0U3VjY2VlZGVkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsIChCdW5kbGUpb2JqKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX0ZBSUxFRDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsIHx8IG9iaiBpbnN0YW5jZW9mIEJ1bmRsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVycm9yID0gKGRhdGEgPT0gbnVsbCA/IG51bGwgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmdldFN0cmluZyhTRVJWSUNFX0RBVEFfRVJST1IpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLm9uQ29udHJvbFJlcXVlc3RGYWlsZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCwgZXJyb3IsIChCdW5kbGUpb2JqKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyV2F0Y2hlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXJXYXRjaGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmExZjY0NwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyV2F0Y2hlci5qYXZhCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUmVzb2x2ZUluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlNlcnZpY2VJbmZvOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworCisvKioKKyAqIFdhdGNoZXMgZm9yIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHNlcnZpY2VzIHRvIGJlIGluc3RhbGxlZC4KKyAqIEFkZHMgYSBwcm92aWRlciB0byB0aGUgbWVkaWEgcm91dGVyIGZvciBlYWNoIHJlZ2lzdGVyZWQgc2VydmljZS4KKyAqCisgKiBAc2VlIFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXIKKyAqLworZmluYWwgY2xhc3MgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcldhdGNoZXIgeworICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcml2YXRlIGZpbmFsIENhbGxiYWNrIG1DYWxsYmFjazsKKyAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgbUhhbmRsZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBQYWNrYWdlTWFuYWdlciBtUGFja2FnZU1hbmFnZXI7CisKKyAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyPiBtUHJvdmlkZXJzID0KKyAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8UmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcj4oKTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVJ1bm5pbmc7CisKKyAgICBwdWJsaWMgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcldhdGNoZXIoQ29udGV4dCBjb250ZXh0LCBDYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgICBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7CisgICAgICAgIG1QYWNrYWdlTWFuYWdlciA9IGNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKKyAgICAgICAgaWYgKCFtUnVubmluZykgeworICAgICAgICAgICAgbVJ1bm5pbmcgPSB0cnVlOworCisgICAgICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOworICAgICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX1BBQ0tBR0VfQURERUQpOworICAgICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX1BBQ0tBR0VfUkVNT1ZFRCk7CisgICAgICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fUEFDS0FHRV9DSEFOR0VEKTsKKyAgICAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9QQUNLQUdFX1JFUExBQ0VEKTsKKyAgICAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9QQUNLQUdFX1JFU1RBUlRFRCk7CisgICAgICAgICAgICBmaWx0ZXIuYWRkRGF0YVNjaGVtZSgicGFja2FnZSIpOworICAgICAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtU2NhblBhY2thZ2VzUmVjZWl2ZXIsIGZpbHRlciwgbnVsbCwgbUhhbmRsZXIpOworCisgICAgICAgICAgICAvLyBTY2FuIHBhY2thZ2VzLgorICAgICAgICAgICAgLy8gQWxzbyBoYXMgdGhlIHNpZGUtZWZmZWN0IG9mIHJlc3RhcnRpbmcgcHJvdmlkZXJzIGlmIG5lZWRlZC4KKyAgICAgICAgICAgIG1IYW5kbGVyLnBvc3QobVNjYW5QYWNrYWdlc1J1bm5hYmxlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgICAgIGlmIChtUnVubmluZykgeworICAgICAgICAgICAgbVJ1bm5pbmcgPSBmYWxzZTsKKworICAgICAgICAgICAgbUNvbnRleHQudW5yZWdpc3RlclJlY2VpdmVyKG1TY2FuUGFja2FnZXNSZWNlaXZlcik7CisgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVNjYW5QYWNrYWdlc1J1bm5hYmxlKTsKKworICAgICAgICAgICAgLy8gU3RvcCBhbGwgcHJvdmlkZXJzLgorICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1Qcm92aWRlcnMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBtUHJvdmlkZXJzLmdldChpKS5zdG9wKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHNjYW5QYWNrYWdlcygpIHsKKyAgICAgICAgaWYgKCFtUnVubmluZykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gQWRkIHByb3ZpZGVycyBmb3IgYWxsIG5ldyBzZXJ2aWNlcy4KKyAgICAgICAgLy8gUmVvcmRlciB0aGUgbGlzdCBzbyB0aGF0IHByb3ZpZGVycyBsZWZ0IGF0IHRoZSBlbmQgd2lsbCBiZSB0aGUgb25lcyB0byByZW1vdmUuCisgICAgICAgIGludCB0YXJnZXRJbmRleCA9IDA7CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhUm91dGVQcm92aWRlclNlcnZpY2UuU0VSVklDRV9JTlRFUkZBQ0UpOworICAgICAgICBmb3IgKFJlc29sdmVJbmZvIHJlc29sdmVJbmZvIDogbVBhY2thZ2VNYW5hZ2VyLnF1ZXJ5SW50ZW50U2VydmljZXMoaW50ZW50LCAwKSkgeworICAgICAgICAgICAgU2VydmljZUluZm8gc2VydmljZUluZm8gPSByZXNvbHZlSW5mby5zZXJ2aWNlSW5mbzsKKyAgICAgICAgICAgIGlmIChzZXJ2aWNlSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW50IHNvdXJjZUluZGV4ID0gZmluZFByb3ZpZGVyKHNlcnZpY2VJbmZvLnBhY2thZ2VOYW1lLCBzZXJ2aWNlSW5mby5uYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoc291cmNlSW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyKG1Db250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb21wb25lbnROYW1lKHNlcnZpY2VJbmZvLnBhY2thZ2VOYW1lLCBzZXJ2aWNlSW5mby5uYW1lKSk7CisgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgICAgIG1Qcm92aWRlcnMuYWRkKHRhcmdldEluZGV4KyssIHByb3ZpZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLmFkZFByb3ZpZGVyKHByb3ZpZGVyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZUluZGV4ID49IHRhcmdldEluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXIgPSBtUHJvdmlkZXJzLmdldChzb3VyY2VJbmRleCk7CisgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyLnN0YXJ0KCk7IC8vIHJlc3RhcnQgdGhlIHByb3ZpZGVyIGlmIG5lZWRlZAorICAgICAgICAgICAgICAgICAgICBwcm92aWRlci5yZWJpbmRJZkRpc2Nvbm5lY3RlZCgpOworICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zd2FwKG1Qcm92aWRlcnMsIHNvdXJjZUluZGV4LCB0YXJnZXRJbmRleCsrKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZW1vdmUgcHJvdmlkZXJzIGZvciBtaXNzaW5nIHNlcnZpY2VzLgorICAgICAgICBpZiAodGFyZ2V0SW5kZXggPCBtUHJvdmlkZXJzLnNpemUoKSkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1Qcm92aWRlcnMuc2l6ZSgpIC0gMTsgaSA+PSB0YXJnZXRJbmRleDsgaS0tKSB7CisgICAgICAgICAgICAgICAgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlciA9IG1Qcm92aWRlcnMuZ2V0KGkpOworICAgICAgICAgICAgICAgIG1DYWxsYmFjay5yZW1vdmVQcm92aWRlcihwcm92aWRlcik7CisgICAgICAgICAgICAgICAgbVByb3ZpZGVycy5yZW1vdmUocHJvdmlkZXIpOworICAgICAgICAgICAgICAgIHByb3ZpZGVyLnN0b3AoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50IGZpbmRQcm92aWRlcihTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBjbGFzc05hbWUpIHsKKyAgICAgICAgaW50IGNvdW50ID0gbVByb3ZpZGVycy5zaXplKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlciA9IG1Qcm92aWRlcnMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKHByb3ZpZGVyLmhhc0NvbXBvbmVudE5hbWUocGFja2FnZU5hbWUsIGNsYXNzTmFtZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBCcm9hZGNhc3RSZWNlaXZlciBtU2NhblBhY2thZ2VzUmVjZWl2ZXIgPSBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICBzY2FuUGFja2FnZXMoKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIGZpbmFsIFJ1bm5hYmxlIG1TY2FuUGFja2FnZXNSdW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIHNjYW5QYWNrYWdlcygpOworICAgICAgICB9CisgICAgfTsKKworICAgIHB1YmxpYyBpbnRlcmZhY2UgQ2FsbGJhY2sgeworICAgICAgICB2b2lkIGFkZFByb3ZpZGVyKE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlcik7CisgICAgICAgIHZvaWQgcmVtb3ZlUHJvdmlkZXIoTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvUmVtb3RlQ29udHJvbENsaWVudENvbXBhdC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjY0NDliCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQuamF2YQpAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uUmVxdWlyZXNBcGk7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CisKKy8qKgorICogUHJvdmlkZXMgYWNjZXNzIHRvIGZlYXR1cmVzIG9mIHRoZSByZW1vdGUgY29udHJvbCBjbGllbnQuCisgKgorICogSGlkZGVuIGZvciBub3cgYnV0IHdlIG1pZ2h0IHdhbnQgdG8gbWFrZSB0aGlzIGF2YWlsYWJsZSB0byBhcHBsaWNhdGlvbnMKKyAqIGluIHRoZSBmdXR1cmUuCisgKi8KK2Fic3RyYWN0IGNsYXNzIFJlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQgeworICAgIHByb3RlY3RlZCBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworICAgIHByb3RlY3RlZCBmaW5hbCBPYmplY3QgbVJjYzsKKyAgICBwcm90ZWN0ZWQgVm9sdW1lQ2FsbGJhY2sgbVZvbHVtZUNhbGxiYWNrOworCisgICAgcHJvdGVjdGVkIFJlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQoQ29udGV4dCBjb250ZXh0LCBPYmplY3QgcmNjKSB7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgbVJjYyA9IHJjYzsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFJlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQgb2J0YWluKENvbnRleHQgY29udGV4dCwgT2JqZWN0IHJjYykgeworICAgICAgICBpZiAoQnVpbGQuVkVSU0lPTi5TREtfSU5UID49IDE2KSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEplbGx5YmVhbkltcGwoY29udGV4dCwgcmNjKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IExlZ2FjeUltcGwoY29udGV4dCwgcmNjKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldFJlbW90ZUNvbnRyb2xDbGllbnQoKSB7CisgICAgICAgIHJldHVybiBtUmNjOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGN1cnJlbnQgcGxheWJhY2sgaW5mb3JtYXRpb24uCisgICAgICogTXVzdCBiZSBjYWxsZWQgYXQgbGVhc3Qgb25jZSB0byBhdHRhY2ggdG8gdGhlIHJlbW90ZSBjb250cm9sIGNsaWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmZvIFRoZSBwbGF5YmFjayBpbmZvcm1hdGlvbi4gIE11c3Qgbm90IGJlIG51bGwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGxheWJhY2tJbmZvKFBsYXliYWNrSW5mbyBpbmZvKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhIGNhbGxiYWNrIHRvIHJlY2VpdmUgdm9sdW1lIGNoYW5nZSByZXF1ZXN0cyBmcm9tIHRoZSByZW1vdGUgY29udHJvbCBjbGllbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIHZvbHVtZSBjYWxsYmFjayB0byB1c2Ugb3IgbnVsbCBpZiBub25lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZvbHVtZUNhbGxiYWNrKFZvbHVtZUNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIG1Wb2x1bWVDYWxsYmFjayA9IGNhbGxiYWNrOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGxheWJhY2suCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQbGF5YmFja0luZm8geworICAgICAgICBwdWJsaWMgaW50IHZvbHVtZTsKKyAgICAgICAgcHVibGljIGludCB2b2x1bWVNYXg7CisgICAgICAgIHB1YmxpYyBpbnQgdm9sdW1lSGFuZGxpbmcgPSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uUExBWUJBQ0tfVk9MVU1FX0ZJWEVEOworICAgICAgICBwdWJsaWMgaW50IHBsYXliYWNrU3RyZWFtID0gQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQzsKKyAgICAgICAgcHVibGljIGludCBwbGF5YmFja1R5cGUgPSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uUExBWUJBQ0tfVFlQRV9SRU1PVEU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdm9sdW1lIHVwZGF0ZXMgYXJlIHJlcXVlc3RlZCBieSB0aGUgcmVtb3RlIGNvbnRyb2wgY2xpZW50LgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgVm9sdW1lQ2FsbGJhY2sgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHZvbHVtZSBzaG91bGQgYmUgaW5jcmVhc2VkIG9yIGRlY3JlYXNlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGRpcmVjdGlvbiBBbiBpbnRlZ2VyIGluZGljYXRpbmcgd2hldGhlciB0aGUgdm9sdW1lIGlzIHRvIGJlIGluY3JlYXNlZAorICAgICAgICAgKiAocG9zaXRpdmUgdmFsdWUpIG9yIGRlY3JlYXNlZCAobmVnYXRpdmUgdmFsdWUpLgorICAgICAgICAgKiBGb3IgYnVuZGxlZCBjaGFuZ2VzLCB0aGUgYWJzb2x1dGUgdmFsdWUgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgY2hhbmdlcworICAgICAgICAgKiBpbiB0aGUgc2FtZSBkaXJlY3Rpb24sIGUuZy4gKzMgY29ycmVzcG9uZHMgdG8gdGhyZWUgInZvbHVtZSB1cCIgY2hhbmdlcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lVXBkYXRlUmVxdWVzdChpbnQgZGlyZWN0aW9uKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHZvbHVtZSBmb3IgdGhlIHJvdXRlIHNob3VsZCBiZSBzZXQgdG8gdGhlIGdpdmVuIHZhbHVlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdm9sdW1lIEFuIGludGVnZXIgaW5kaWNhdGluZyB0aGUgbmV3IHZvbHVtZSB2YWx1ZSB0aGF0IHNob3VsZCBiZSB1c2VkLAorICAgICAgICAgKiBhbHdheXMgYmV0d2VlbiAwIGFuZCB0aGUgdmFsdWUgc2V0IGJ5IHtAbGluayBQbGF5YmFja0luZm8jdm9sdW1lTWF4fS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lU2V0UmVxdWVzdChpbnQgdm9sdW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMZWdhY3kgaW1wbGVtZW50YXRpb24gZm9yIHBsYXRmb3JtIHZlcnNpb25zIHByaW9yIHRvIEplbGx5YmVhbi4KKyAgICAgKiBEb2VzIG5vdGhpbmcuCisgICAgICovCisgICAgc3RhdGljIGNsYXNzIExlZ2FjeUltcGwgZXh0ZW5kcyBSZW1vdGVDb250cm9sQ2xpZW50Q29tcGF0IHsKKyAgICAgICAgcHVibGljIExlZ2FjeUltcGwoQ29udGV4dCBjb250ZXh0LCBPYmplY3QgcmNjKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCByY2MpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50YXRpb24gZm9yIEplbGx5YmVhbi4KKyAgICAgKgorICAgICAqIFRoZSBiYXNpYyBpZGVhIG9mIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgdG8gYXR0YWNoIHRoZSBSQ0MgdG8gYSBVc2VyUm91dGVJbmZvCisgICAgICogaW4gb3JkZXIgdG8gaG9vayB1cCBzdHJlYW0gbWV0YWRhdGEgYW5kIHZvbHVtZSBjYWxsYmFja3MgYmVjYXVzZSB0aGVyZSBpcyBubworICAgICAqIG90aGVyIEFQSSBhdmFpbGFibGUgdG8gZG8gc28gaW4gdGhpcyBwbGF0Zm9ybSB2ZXJzaW9uLiAgVGhlIFVzZXJSb3V0ZUluZm8gaXRzZWxmCisgICAgICogaXMgbm90IGF0dGFjaGVkIHRvIHRoZSBNZWRpYVJvdXRlciBzbyBpdCBpcyB0cmFuc3BhcmVudCB0byB0aGUgdXNlci4KKyAgICAgKi8KKyAgICAvLyBAQFJlcXVpcmVzQXBpKDE2KQorICAgIHN0YXRpYyBjbGFzcyBKZWxseWJlYW5JbXBsIGV4dGVuZHMgUmVtb3RlQ29udHJvbENsaWVudENvbXBhdCB7CisgICAgICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Sb3V0ZXJPYmo7CisgICAgICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Vc2VyUm91dGVDYXRlZ29yeU9iajsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbVVzZXJSb3V0ZU9iajsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1SZWdpc3RlcmVkOworCisgICAgICAgIHB1YmxpYyBKZWxseWJlYW5JbXBsKENvbnRleHQgY29udGV4dCwgT2JqZWN0IHJjYykgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgcmNjKTsKKworICAgICAgICAgICAgbVJvdXRlck9iaiA9IE1lZGlhUm91dGVySmVsbHliZWFuLmdldE1lZGlhUm91dGVyKGNvbnRleHQpOworICAgICAgICAgICAgbVVzZXJSb3V0ZUNhdGVnb3J5T2JqID0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uY3JlYXRlUm91dGVDYXRlZ29yeSgKKyAgICAgICAgICAgICAgICAgICAgbVJvdXRlck9iaiwgIiIsIGZhbHNlKTsKKyAgICAgICAgICAgIG1Vc2VyUm91dGVPYmogPSBNZWRpYVJvdXRlckplbGx5YmVhbi5jcmVhdGVVc2VyUm91dGUoCisgICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXJPYmosIG1Vc2VyUm91dGVDYXRlZ29yeU9iaik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UGxheWJhY2tJbmZvKFBsYXliYWNrSW5mbyBpbmZvKSB7CisgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFZvbHVtZSgKKyAgICAgICAgICAgICAgICAgICAgbVVzZXJSb3V0ZU9iaiwgaW5mby52b2x1bWUpOworICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRWb2x1bWVNYXgoCisgICAgICAgICAgICAgICAgICAgIG1Vc2VyUm91dGVPYmosIGluZm8udm9sdW1lTWF4KTsKKyAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0Vm9sdW1lSGFuZGxpbmcoCisgICAgICAgICAgICAgICAgICAgIG1Vc2VyUm91dGVPYmosIGluZm8udm9sdW1lSGFuZGxpbmcpOworICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRQbGF5YmFja1N0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgbVVzZXJSb3V0ZU9iaiwgaW5mby5wbGF5YmFja1N0cmVhbSk7CisgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFBsYXliYWNrVHlwZSgKKyAgICAgICAgICAgICAgICAgICAgbVVzZXJSb3V0ZU9iaiwgaW5mby5wbGF5YmFja1R5cGUpOworCisgICAgICAgICAgICBpZiAoIW1SZWdpc3RlcmVkKSB7CisgICAgICAgICAgICAgICAgbVJlZ2lzdGVyZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0Vm9sdW1lQ2FsbGJhY2sobVVzZXJSb3V0ZU9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLmNyZWF0ZVZvbHVtZUNhbGxiYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVm9sdW1lQ2FsbGJhY2tXcmFwcGVyKHRoaXMpKSk7CisgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRSZW1vdGVDb250cm9sQ2xpZW50KG1Vc2VyUm91dGVPYmosIG1SY2MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgVm9sdW1lQ2FsbGJhY2tXcmFwcGVyCisgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBNZWRpYVJvdXRlckplbGx5YmVhbi5Wb2x1bWVDYWxsYmFjayB7CisgICAgICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5LCB0aGUgZnJhbWV3b3JrIG5ldmVyIHVucmVnaXN0ZXJzIGl0cyB2b2x1bWUgb2JzZXJ2ZXIgZnJvbQorICAgICAgICAgICAgLy8gdGhlIGF1ZGlvIHNlcnZpY2Ugc28gdGhlIFVzZXJSb3V0ZUluZm8gb2JqZWN0IG1heSBsZWFrIGFsb25nIHdpdGgKKyAgICAgICAgICAgIC8vIGFueSBjYWxsYmFja3MgdGhhdCB3ZSBhdHRhY2ggdG8gaXQuICBVc2UgYSB3ZWFrIHJlZmVyZW5jZSB0byBwcmV2ZW50CisgICAgICAgICAgICAvLyB0aGUgdm9sdW1lIGNhbGxiYWNrIGZyb20gaG9sZGluZyBzdHJvbmcgcmVmZXJlbmNlcyB0byBhbnl0aGluZyBpbXBvcnRhbnQuCisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8SmVsbHliZWFuSW1wbD4gbUltcGxXZWFrOworCisgICAgICAgICAgICBwdWJsaWMgVm9sdW1lQ2FsbGJhY2tXcmFwcGVyKEplbGx5YmVhbkltcGwgaW1wbCkgeworICAgICAgICAgICAgICAgIG1JbXBsV2VhayA9IG5ldyBXZWFrUmVmZXJlbmNlPEplbGx5YmVhbkltcGw+KGltcGwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lVXBkYXRlUmVxdWVzdChPYmplY3Qgcm91dGVPYmosIGludCBkaXJlY3Rpb24pIHsKKyAgICAgICAgICAgICAgICBKZWxseWJlYW5JbXBsIGltcGwgPSBtSW1wbFdlYWsuZ2V0KCk7CisgICAgICAgICAgICAgICAgaWYgKGltcGwgIT0gbnVsbCAmJiBpbXBsLm1Wb2x1bWVDYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGltcGwubVZvbHVtZUNhbGxiYWNrLm9uVm9sdW1lVXBkYXRlUmVxdWVzdChkaXJlY3Rpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblZvbHVtZVNldFJlcXVlc3QoT2JqZWN0IHJvdXRlT2JqLCBpbnQgdm9sdW1lKSB7CisgICAgICAgICAgICAgICAgSmVsbHliZWFuSW1wbCBpbXBsID0gbUltcGxXZWFrLmdldCgpOworICAgICAgICAgICAgICAgIGlmIChpbXBsICE9IG51bGwgJiYgaW1wbC5tVm9sdW1lQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpbXBsLm1Wb2x1bWVDYWxsYmFjay5vblZvbHVtZVNldFJlcXVlc3Qodm9sdW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvUmVtb3RlUGxheWJhY2tDbGllbnQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZW1vdGVQbGF5YmFja0NsaWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZTE0OTcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvUmVtb3RlUGxheWJhY2tDbGllbnQuamF2YQpAQCAtMCwwICsxLDEwNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC51dGlsLk9iamVjdHNDb21wYXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworLyoqCisgKiBBIGhlbHBlciBjbGFzcyBmb3IgcGxheWluZyBtZWRpYSBvbiByZW1vdGUgcm91dGVzIHVzaW5nIHRoZSByZW1vdGUgcGxheWJhY2sgcHJvdG9jb2wKKyAqIGRlZmluZWQgYnkge0BsaW5rIE1lZGlhQ29udHJvbEludGVudH0uCisgKiA8cD4KKyAqIFRoZSBjbGllbnQgbWFpbnRhaW5zIHNlc3Npb24gc3RhdGUgYW5kIG9mZmVycyBhIHNpbXBsaWZpZWQgaW50ZXJmYWNlIGZvciBpc3N1aW5nCisgKiByZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBpbnRlbnRzIHRvIGEgc2luZ2xlIHJvdXRlLgorICogPC9wPgorICovCitwdWJsaWMgY2xhc3MgUmVtb3RlUGxheWJhY2tDbGllbnQgeworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlJlbW90ZVBsYXliYWNrQ2xpZW50IjsKKyAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKKworICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcml2YXRlIGZpbmFsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBtUm91dGU7CisgICAgcHJpdmF0ZSBmaW5hbCBBY3Rpb25SZWNlaXZlciBtQWN0aW9uUmVjZWl2ZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBQZW5kaW5nSW50ZW50IG1JdGVtU3RhdHVzUGVuZGluZ0ludGVudDsKKyAgICBwcml2YXRlIGZpbmFsIFBlbmRpbmdJbnRlbnQgbVNlc3Npb25TdGF0dXNQZW5kaW5nSW50ZW50OworICAgIHByaXZhdGUgZmluYWwgUGVuZGluZ0ludGVudCBtTWVzc2FnZVBlbmRpbmdJbnRlbnQ7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbVJvdXRlU3VwcG9ydHNSZW1vdGVQbGF5YmFjazsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVJvdXRlU3VwcG9ydHNRdWV1aW5nOworICAgIHByaXZhdGUgYm9vbGVhbiBtUm91dGVTdXBwb3J0c1Nlc3Npb25NYW5hZ2VtZW50OworICAgIHByaXZhdGUgYm9vbGVhbiBtUm91dGVTdXBwb3J0c01lc3NhZ2luZzsKKworICAgIFN0cmluZyBtU2Vzc2lvbklkOworICAgIFN0YXR1c0NhbGxiYWNrIG1TdGF0dXNDYWxsYmFjazsKKyAgICBPbk1lc3NhZ2VSZWNlaXZlZExpc3RlbmVyIG1Pbk1lc3NhZ2VSZWNlaXZlZExpc3RlbmVyOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHJlbW90ZSBwbGF5YmFjayBjbGllbnQgZm9yIGEgcm91dGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm91dGUgVGhlIG1lZGlhIHJvdXRlLgorICAgICAqLworICAgIHB1YmxpYyBSZW1vdGVQbGF5YmFja0NsaWVudChDb250ZXh0IGNvbnRleHQsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgeworICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250ZXh0IG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocm91dGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicm91dGUgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICB9CisKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICBtUm91dGUgPSByb3V0ZTsKKworICAgICAgICBJbnRlbnRGaWx0ZXIgYWN0aW9uRmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOworICAgICAgICBhY3Rpb25GaWx0ZXIuYWRkQWN0aW9uKEFjdGlvblJlY2VpdmVyLkFDVElPTl9JVEVNX1NUQVRVU19DSEFOR0VEKTsKKyAgICAgICAgYWN0aW9uRmlsdGVyLmFkZEFjdGlvbihBY3Rpb25SZWNlaXZlci5BQ1RJT05fU0VTU0lPTl9TVEFUVVNfQ0hBTkdFRCk7CisgICAgICAgIGFjdGlvbkZpbHRlci5hZGRBY3Rpb24oQWN0aW9uUmVjZWl2ZXIuQUNUSU9OX01FU1NBR0VfUkVDRUlWRUQpOworICAgICAgICBtQWN0aW9uUmVjZWl2ZXIgPSBuZXcgQWN0aW9uUmVjZWl2ZXIoKTsKKyAgICAgICAgY29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1BY3Rpb25SZWNlaXZlciwgYWN0aW9uRmlsdGVyKTsKKworICAgICAgICBJbnRlbnQgaXRlbVN0YXR1c0ludGVudCA9IG5ldyBJbnRlbnQoQWN0aW9uUmVjZWl2ZXIuQUNUSU9OX0lURU1fU1RBVFVTX0NIQU5HRUQpOworICAgICAgICBpdGVtU3RhdHVzSW50ZW50LnNldFBhY2thZ2UoY29udGV4dC5nZXRQYWNrYWdlTmFtZSgpKTsKKyAgICAgICAgbUl0ZW1TdGF0dXNQZW5kaW5nSW50ZW50ID0gUGVuZGluZ0ludGVudC5nZXRCcm9hZGNhc3QoCisgICAgICAgICAgICAgICAgY29udGV4dCwgMCwgaXRlbVN0YXR1c0ludGVudCwgMCk7CisKKyAgICAgICAgSW50ZW50IHNlc3Npb25TdGF0dXNJbnRlbnQgPSBuZXcgSW50ZW50KEFjdGlvblJlY2VpdmVyLkFDVElPTl9TRVNTSU9OX1NUQVRVU19DSEFOR0VEKTsKKyAgICAgICAgc2Vzc2lvblN0YXR1c0ludGVudC5zZXRQYWNrYWdlKGNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSk7CisgICAgICAgIG1TZXNzaW9uU3RhdHVzUGVuZGluZ0ludGVudCA9IFBlbmRpbmdJbnRlbnQuZ2V0QnJvYWRjYXN0KAorICAgICAgICAgICAgICAgIGNvbnRleHQsIDAsIHNlc3Npb25TdGF0dXNJbnRlbnQsIDApOworCisgICAgICAgIEludGVudCBtZXNzYWdlSW50ZW50ID0gbmV3IEludGVudChBY3Rpb25SZWNlaXZlci5BQ1RJT05fTUVTU0FHRV9SRUNFSVZFRCk7CisgICAgICAgIG1lc3NhZ2VJbnRlbnQuc2V0UGFja2FnZShjb250ZXh0LmdldFBhY2thZ2VOYW1lKCkpOworICAgICAgICBtTWVzc2FnZVBlbmRpbmdJbnRlbnQgPSBQZW5kaW5nSW50ZW50LmdldEJyb2FkY2FzdCgKKyAgICAgICAgICAgICAgICBjb250ZXh0LCAwLCBtZXNzYWdlSW50ZW50LCAwKTsKKyAgICAgICAgZGV0ZWN0RmVhdHVyZXMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlcyByZXNvdXJjZXMgb3duZWQgYnkgdGhlIGNsaWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlKCkgeworICAgICAgICBtQ29udGV4dC51bnJlZ2lzdGVyUmVjZWl2ZXIobUFjdGlvblJlY2VpdmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIHJlbW90ZSBwbGF5YmFjay4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCByZW1vdGUgcGxheWJhY2ssIHRoZW4gbm9uZSBvZiB0aGUgZnVuY3Rpb25hbGl0eQorICAgICAqIG9mZmVyZWQgYnkgdGhlIGNsaWVudCB3aWxsIGJlIGF2YWlsYWJsZS4KKyAgICAgKiA8L3A+PHA+CisgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyBhbGwgb2YgdGhlIGZvbGxvd2luZworICAgICAqIGFjdGlvbnM6IHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVkgcGxheX0sCisgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU0VFSyBzZWVrfSwKKyAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9HRVRfU1RBVFVTIGdldCBzdGF0dXN9LAorICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BBVVNFIHBhdXNlfSwKKyAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9SRVNVTUUgcmVzdW1lfSwKKyAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TVE9QIHN0b3B9LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiByZW1vdGUgcGxheWJhY2sgaXMgc3VwcG9ydGVkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQoKSB7CisgICAgICAgIHJldHVybiBtUm91dGVTdXBwb3J0c1JlbW90ZVBsYXliYWNrOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgcXVldWluZyBmZWF0dXJlcy4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCBxdWV1aW5nLCB0aGVuIGF0IG1vc3Qgb25lIG1lZGlhIGl0ZW0gY2FuIGJlIHBsYXllZAorICAgICAqIGF0IGEgdGltZSBhbmQgdGhlIHtAbGluayAjZW5xdWV1ZX0gbWV0aG9kIHdpbGwgbm90IGJlIGF2YWlsYWJsZS4KKyAgICAgKiA8L3A+PHA+CisgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyBhbGwgb2YgdGhlIGJhc2ljIHJlbW90ZSBwbGF5YmFjaworICAgICAqIGFjdGlvbnMgYW5kIGFsbCBvZiB0aGUgZm9sbG93aW5nIGFjdGlvbnM6CisgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5RVUVVRSBlbnF1ZXVlfSwKKyAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9SRU1PVkUgcmVtb3ZlfS4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgcXVldWluZyBpcyBzdXBwb3J0ZWQuICBJbXBsaWVzIHtAbGluayAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZH0KKyAgICAgKiBpcyBhbHNvIHRydWUuCisgICAgICoKKyAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNRdWV1aW5nU3VwcG9ydGVkKCkgeworICAgICAgICByZXR1cm4gbVJvdXRlU3VwcG9ydHNRdWV1aW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgc2Vzc2lvbiBtYW5hZ2VtZW50IGZlYXR1cmVzLgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IHNlc3Npb24gbWFuYWdlbWVudCwgdGhlbiB0aGUgc2Vzc2lvbiB3aWxsCisgICAgICogbm90IGJlIGNyZWF0ZWQgdW50aWwgdGhlIGZpcnN0IG1lZGlhIGl0ZW0gaXMgcGxheWVkLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIGFsbCBvZiB0aGUgYmFzaWMgcmVtb3RlIHBsYXliYWNrCisgICAgICogYWN0aW9ucyBhbmQgYWxsIG9mIHRoZSBmb2xsb3dpbmcgYWN0aW9uczoKKyAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TVEFSVF9TRVNTSU9OIHN0YXJ0IHNlc3Npb259LAorICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVUyBnZXQgc2Vzc2lvbiBzdGF0dXN9LAorICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VORF9TRVNTSU9OIGVuZCBzZXNzaW9ufS4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgc2Vzc2lvbiBtYW5hZ2VtZW50IGlzIHN1cHBvcnRlZC4KKyAgICAgKiBJbXBsaWVzIHtAbGluayAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZH0gaXMgYWxzbyB0cnVlLgorICAgICAqCisgICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU2Vzc2lvbk1hbmFnZW1lbnRTdXBwb3J0ZWQoKSB7CisgICAgICAgIHJldHVybiBtUm91dGVTdXBwb3J0c1Nlc3Npb25NYW5hZ2VtZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgbWVzc2FnZXMuCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyBhbGwgb2YgdGhlIGJhc2ljIHJlbW90ZSBwbGF5YmFjaworICAgICAqIGFjdGlvbnMgYW5kIGFsbCBvZiB0aGUgZm9sbG93aW5nIGFjdGlvbnM6CisgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RBUlRfU0VTU0lPTiBzdGFydCBzZXNzaW9ufSwKKyAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TRU5EX01FU1NBR0Ugc2VuZCBtZXNzYWdlfSwKKyAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTkRfU0VTU0lPTiBlbmQgc2Vzc2lvbn0uCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHJldHVybiBUcnVlIGlmIHNlc3Npb24gbWFuYWdlbWVudCBpcyBzdXBwb3J0ZWQuCisgICAgICogSW1wbGllcyB7QGxpbmsgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWR9IGlzIGFsc28gdHJ1ZS4KKyAgICAgKgorICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc01lc3NhZ2luZ1N1cHBvcnRlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1Sb3V0ZVN1cHBvcnRzTWVzc2FnaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGN1cnJlbnQgc2Vzc2lvbiBpZCBpZiB0aGVyZSBpcyBvbmUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHNlc3Npb24gaWQsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlc3Npb25JZCgpIHsKKyAgICAgICAgcmV0dXJuIG1TZXNzaW9uSWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY3VycmVudCBzZXNzaW9uIGlkLgorICAgICAqIDxwPgorICAgICAqIEl0IGlzIHVzdWFsbHkgbm90IG5lY2Vzc2FyeSB0byBzZXQgdGhlIHNlc3Npb24gaWQgZXhwbGljaXRseSBzaW5jZQorICAgICAqIGl0IGlzIGNyZWF0ZWQgYXMgYSBzaWRlLWVmZmVjdCBvZiBvdGhlciByZXF1ZXN0cyBzdWNoIGFzCisgICAgICoge0BsaW5rICNwbGF5fSwge0BsaW5rICNlbnF1ZXVlfSwgYW5kIHtAbGluayAjc3RhcnRTZXNzaW9ufS4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gc2Vzc2lvbklkIFRoZSBuZXcgc2Vzc2lvbiBpZCwgb3IgbnVsbCBpZiBub25lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlc3Npb25JZChTdHJpbmcgc2Vzc2lvbklkKSB7CisgICAgICAgIGlmICghT2JqZWN0c0NvbXBhdC5lcXVhbHMobVNlc3Npb25JZCwgc2Vzc2lvbklkKSkgeworICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU2Vzc2lvbiBpZCBpcyBub3c6ICIgKyBzZXNzaW9uSWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVNlc3Npb25JZCA9IHNlc3Npb25JZDsKKyAgICAgICAgICAgIGlmIChtU3RhdHVzQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1TdGF0dXNDYWxsYmFjay5vblNlc3Npb25DaGFuZ2VkKHNlc3Npb25JZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNsaWVudCBjdXJyZW50bHkgaGFzIGEgc2Vzc2lvbi4KKyAgICAgKiA8cD4KKyAgICAgKiBFcXVpdmFsZW50IHRvIGNoZWNraW5nIHdoZXRoZXIge0BsaW5rICNnZXRTZXNzaW9uSWR9IHJldHVybnMgYSBub24tbnVsbCByZXN1bHQuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZXJlIGlzIGEgY3VycmVudCBzZXNzaW9uLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc1Nlc3Npb24oKSB7CisgICAgICAgIHJldHVybiBtU2Vzc2lvbklkICE9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhIGNhbGxiYWNrIHRoYXQgc2hvdWxkIHJlY2VpdmUgc3RhdHVzIHVwZGF0ZXMgd2hlbiB0aGUgc3RhdGUgb2YKKyAgICAgKiBtZWRpYSBzZXNzaW9ucyBvciBtZWRpYSBpdGVtcyBjcmVhdGVkIGJ5IHRoaXMgaW5zdGFuY2Ugb2YgdGhlIHJlbW90ZQorICAgICAqIHBsYXliYWNrIGNsaWVudCBjaGFuZ2VzLgorICAgICAqIDxwPgorICAgICAqIFRoZSBjYWxsYmFjayBzaG91bGQgYmUgc2V0IGJlZm9yZSB0aGUgc2Vzc2lvbiBpcyBjcmVhdGVkIG9yIGFueSBwbGF5CisgICAgICogY29tbWFuZHMgYXJlIGlzc3VlZC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHNldC4gIE1heSBiZSBudWxsIHRvIHJlbW92ZSB0aGUgcHJldmlvdXMgY2FsbGJhY2suCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3RhdHVzQ2FsbGJhY2soU3RhdHVzQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgbVN0YXR1c0NhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhIGNhbGxiYWNrIHRoYXQgc2hvdWxkIHJlY2VpdmUgbWVzc2FnZXMgd2hlbiBhIG1lc3NhZ2UgaXMgc2VudCBmcm9tCisgICAgICogbWVkaWEgc2Vzc2lvbnMgY3JlYXRlZCBieSB0aGlzIGluc3RhbmNlIG9mIHRoZSByZW1vdGUgcGxheWJhY2sgY2xpZW50IGNoYW5nZXMuCisgICAgICogPHA+CisgICAgICogVGhlIGNhbGxiYWNrIHNob3VsZCBiZSBzZXQgYmVmb3JlIHRoZSBzZXNzaW9uIGlzIGNyZWF0ZWQuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBjYWxsYmFjayB0byBzZXQuICBNYXkgYmUgbnVsbCB0byByZW1vdmUgdGhlIHByZXZpb3VzIGNhbGxiYWNrLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE9uTWVzc2FnZVJlY2VpdmVkTGlzdGVuZXIoT25NZXNzYWdlUmVjZWl2ZWRMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBtT25NZXNzYWdlUmVjZWl2ZWRMaXN0ZW5lciA9IGxpc3RlbmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byBwbGF5IGEgbWVkaWEgaXRlbS4KKyAgICAgKiA8cD4KKyAgICAgKiBDbGVhcnMgdGhlIHF1ZXVlIGFuZCBzdGFydHMgcGxheWluZyB0aGUgbmV3IGl0ZW0gaW1tZWRpYXRlbHkuICBJZiB0aGUgcXVldWUKKyAgICAgKiB3YXMgcHJldmlvdXNseSBwYXVzZWQsIHRoZW4gaXQgaXMgcmVzdW1lZCBhcyBhIHNpZGUtZWZmZWN0IG9mIHRoaXMgcmVxdWVzdC4KKyAgICAgKiA8L3A+PHA+CisgICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uICBJZiBubyBzZXNzaW9uIGlzIGF2YWlsYWJsZSwgdGhlbgorICAgICAqIG9uZSBpcyBjcmVhdGVkIGltcGxpY2l0bHkuCisgICAgICogPC9wPjxwPgorICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QTEFZIEFDVElPTl9QTEFZfSBmb3IKKyAgICAgKiBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZW50VXJpIFRoZSBjb250ZW50IFVyaSB0byBwbGF5LgorICAgICAqIEBwYXJhbSBtaW1lVHlwZSBUaGUgbWltZSB0eXBlIG9mIHRoZSBjb250ZW50LCBvciBudWxsIGlmIHVua25vd24uCisgICAgICogQHBhcmFtIHBvc2l0aW9uTWlsbGlzIFRoZSBpbml0aWFsIGNvbnRlbnQgcG9zaXRpb24gZm9yIHRoZSBpdGVtIGluIG1pbGxpc2Vjb25kcywKKyAgICAgKiBvciA8Y29kZT4wPC9jb2RlPiB0byBzdGFydCBhdCB0aGUgYmVnaW5uaW5nLgorICAgICAqIEBwYXJhbSBtZXRhZGF0YSBUaGUgbWVkaWEgaXRlbSBtZXRhZGF0YSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKKyAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QTEFZfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgorICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgorICAgICAqCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCByZW1vdGUgcGxheWJhY2suCisgICAgICoKKyAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWQorICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwbGF5KFVyaSBjb250ZW50VXJpLCBTdHJpbmcgbWltZVR5cGUsIEJ1bmRsZSBtZXRhZGF0YSwKKyAgICAgICAgICAgIGxvbmcgcG9zaXRpb25NaWxsaXMsIEJ1bmRsZSBleHRyYXMsIEl0ZW1BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICBwbGF5T3JFbnF1ZXVlKGNvbnRlbnRVcmksIG1pbWVUeXBlLCBtZXRhZGF0YSwgcG9zaXRpb25NaWxsaXMsCisgICAgICAgICAgICAgICAgZXh0cmFzLCBjYWxsYmFjaywgTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9QTEFZKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gZW5xdWV1ZSBhIG1lZGlhIGl0ZW0uCisgICAgICogPHA+CisgICAgICogRW5xdWV1ZXMgYSBuZXcgaXRlbSB0byBwbGF5LiAgSWYgdGhlIHF1ZXVlIHdhcyBwcmV2aW91c2x5IHBhdXNlZCwgdGhlbiB3aWxsCisgICAgICogcmVtYWluIHBhdXNlZC4KKyAgICAgKiA8L3A+PHA+CisgICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uICBJZiBubyBzZXNzaW9uIGlzIGF2YWlsYWJsZSwgdGhlbgorICAgICAqIG9uZSBpcyBjcmVhdGVkIGltcGxpY2l0bHkuCisgICAgICogPC9wPjxwPgorICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTlFVRVVFIEFDVElPTl9FTlFVRVVFfSBmb3IKKyAgICAgKiBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZW50VXJpIFRoZSBjb250ZW50IFVyaSB0byBlbnF1ZXVlLgorICAgICAqIEBwYXJhbSBtaW1lVHlwZSBUaGUgbWltZSB0eXBlIG9mIHRoZSBjb250ZW50LCBvciBudWxsIGlmIHVua25vd24uCisgICAgICogQHBhcmFtIHBvc2l0aW9uTWlsbGlzIFRoZSBpbml0aWFsIGNvbnRlbnQgcG9zaXRpb24gZm9yIHRoZSBpdGVtIGluIG1pbGxpc2Vjb25kcywKKyAgICAgKiBvciA8Y29kZT4wPC9jb2RlPiB0byBzdGFydCBhdCB0aGUgYmVnaW5uaW5nLgorICAgICAqIEBwYXJhbSBtZXRhZGF0YSBUaGUgbWVkaWEgaXRlbSBtZXRhZGF0YSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKKyAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTlFVRVVFfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgorICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgorICAgICAqCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCBxdWV1aW5nLgorICAgICAqCisgICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VOUVVFVUUKKyAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCisgICAgICogQHNlZSAjaXNRdWV1aW5nU3VwcG9ydGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgZW5xdWV1ZShVcmkgY29udGVudFVyaSwgU3RyaW5nIG1pbWVUeXBlLCBCdW5kbGUgbWV0YWRhdGEsCisgICAgICAgICAgICBsb25nIHBvc2l0aW9uTWlsbGlzLCBCdW5kbGUgZXh0cmFzLCBJdGVtQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgcGxheU9yRW5xdWV1ZShjb250ZW50VXJpLCBtaW1lVHlwZSwgbWV0YWRhdGEsIHBvc2l0aW9uTWlsbGlzLAorICAgICAgICAgICAgICAgIGV4dHJhcywgY2FsbGJhY2ssIE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fRU5RVUVVRSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHBsYXlPckVucXVldWUoVXJpIGNvbnRlbnRVcmksIFN0cmluZyBtaW1lVHlwZSwgQnVuZGxlIG1ldGFkYXRhLAorICAgICAgICAgICAgbG9uZyBwb3NpdGlvbk1pbGxpcywgQnVuZGxlIGV4dHJhcywKKyAgICAgICAgICAgIGZpbmFsIEl0ZW1BY3Rpb25DYWxsYmFjayBjYWxsYmFjaywgU3RyaW5nIGFjdGlvbikgeworICAgICAgICBpZiAoY29udGVudFVyaSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250ZW50VXJpIG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICB0aHJvd0lmUmVtb3RlUGxheWJhY2tOb3RTdXBwb3J0ZWQoKTsKKyAgICAgICAgaWYgKGFjdGlvbi5lcXVhbHMoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9FTlFVRVVFKSkgeworICAgICAgICAgICAgdGhyb3dJZlF1ZXVpbmdOb3RTdXBwb3J0ZWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KGFjdGlvbik7CisgICAgICAgIGludGVudC5zZXREYXRhQW5kVHlwZShjb250ZW50VXJpLCBtaW1lVHlwZSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSLAorICAgICAgICAgICAgICAgIG1JdGVtU3RhdHVzUGVuZGluZ0ludGVudCk7CisgICAgICAgIGlmIChtZXRhZGF0YSAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX0lURU1fTUVUQURBVEEsIG1ldGFkYXRhKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocG9zaXRpb25NaWxsaXMgIT0gMCkgeworICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9JVEVNX0NPTlRFTlRfUE9TSVRJT04sIHBvc2l0aW9uTWlsbGlzKTsKKyAgICAgICAgfQorICAgICAgICBwZXJmb3JtSXRlbUFjdGlvbihpbnRlbnQsIG1TZXNzaW9uSWQsIG51bGwsIGV4dHJhcywgY2FsbGJhY2spOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byBzZWVrIHRvIGEgbmV3IHBvc2l0aW9uIGluIGEgbWVkaWEgaXRlbS4KKyAgICAgKiA8cD4KKyAgICAgKiBTZWVrcyB0byBhIG5ldyBwb3NpdGlvbi4gIElmIHRoZSBxdWV1ZSB3YXMgcHJldmlvdXNseSBwYXVzZWQgdGhlbiBpdAorICAgICAqIHJlbWFpbnMgcGF1c2VkIGJ1dCB0aGUgaXRlbSdzIG5ldyBwb3NpdGlvbiBpcyBzdGlsbCByZW1lbWJlcmVkLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBUaGUgcmVxdWVzdCBpcyBpc3N1ZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4KKyAgICAgKiA8L3A+PHA+CisgICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NFRUsgQUNUSU9OX1NFRUt9IGZvcgorICAgICAqIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbWFudGljcyBvZiB0aGlzIHJlcXVlc3QuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGl0ZW1JZCBUaGUgaXRlbSBpZC4KKyAgICAgKiBAcGFyYW0gcG9zaXRpb25NaWxsaXMgVGhlIG5ldyBjb250ZW50IHBvc2l0aW9uIGZvciB0aGUgaXRlbSBpbiBtaWxsaXNlY29uZHMsCisgICAgICogb3IgPGNvZGU+MDwvY29kZT4gdG8gc3RhcnQgYXQgdGhlIGJlZ2lubmluZy4KKyAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKKyAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TRUVLfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgorICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLgorICAgICAqCisgICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NFRUsKKyAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2VlayhTdHJpbmcgaXRlbUlkLCBsb25nIHBvc2l0aW9uTWlsbGlzLCBCdW5kbGUgZXh0cmFzLAorICAgICAgICAgICAgSXRlbUFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIGlmIChpdGVtSWQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbUlkIG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICB0aHJvd0lmTm9DdXJyZW50U2Vzc2lvbigpOworCisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fU0VFSyk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9DT05URU5UX1BPU0lUSU9OLCBwb3NpdGlvbk1pbGxpcyk7CisgICAgICAgIHBlcmZvcm1JdGVtQWN0aW9uKGludGVudCwgbVNlc3Npb25JZCwgaXRlbUlkLCBleHRyYXMsIGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gZ2V0IHRoZSBzdGF0dXMgb2YgYSBtZWRpYSBpdGVtLgorICAgICAqIDxwPgorICAgICAqIFRoZSByZXF1ZXN0IGlzIGlzc3VlZCBpbiB0aGUgY3VycmVudCBzZXNzaW9uLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fR0VUX1NUQVRVUyBBQ1RJT05fR0VUX1NUQVRVU30gZm9yCisgICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gaXRlbUlkIFRoZSBpdGVtIGlkLgorICAgICAqIEBwYXJhbSBleHRyYXMgQSBidW5kbGUgb2YgZXh0cmEgYXJndW1lbnRzIHRvIGJlIGFkZGVkIHRvIHRoZQorICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0dFVF9TVEFUVVN9IGludGVudCwgb3IgbnVsbCBpZiBub25lLgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuCisgICAgICogcHJvY2Vzc2VkLCBvciBudWxsIGlmIG5vbmUuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHNlc3Npb24uCisgICAgICoKKyAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fR0VUX1NUQVRVUworICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBnZXRTdGF0dXMoU3RyaW5nIGl0ZW1JZCwgQnVuZGxlIGV4dHJhcywgSXRlbUFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIGlmIChpdGVtSWQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbUlkIG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICB0aHJvd0lmTm9DdXJyZW50U2Vzc2lvbigpOworCisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fR0VUX1NUQVRVUyk7CisgICAgICAgIHBlcmZvcm1JdGVtQWN0aW9uKGludGVudCwgbVNlc3Npb25JZCwgaXRlbUlkLCBleHRyYXMsIGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gcmVtb3ZlIGEgbWVkaWEgaXRlbSBmcm9tIHRoZSBxdWV1ZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgcmVxdWVzdCBpcyBpc3N1ZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4KKyAgICAgKiA8L3A+PHA+CisgICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1JFTU9WRSBBQ1RJT05fUkVNT1ZFfSBmb3IKKyAgICAgKiBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpdGVtSWQgVGhlIGl0ZW0gaWQuCisgICAgICogQHBhcmFtIGV4dHJhcyBBIGJ1bmRsZSBvZiBleHRyYSBhcmd1bWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlCisgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUkVNT1ZFfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgorICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgcXVldWluZy4KKyAgICAgKgorICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9SRU1PVkUKKyAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCisgICAgICogQHNlZSAjaXNRdWV1aW5nU3VwcG9ydGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlKFN0cmluZyBpdGVtSWQsIEJ1bmRsZSBleHRyYXMsIEl0ZW1BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICBpZiAoaXRlbUlkID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW1JZCBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3dJZlF1ZXVpbmdOb3RTdXBwb3J0ZWQoKTsKKyAgICAgICAgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKTsKKworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1JFTU9WRSk7CisgICAgICAgIHBlcmZvcm1JdGVtQWN0aW9uKGludGVudCwgbVNlc3Npb25JZCwgaXRlbUlkLCBleHRyYXMsIGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gcGF1c2UgbWVkaWEgcGxheWJhY2suCisgICAgICogPHA+CisgICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uICBJZiBwbGF5YmFjayBpcyBhbHJlYWR5IHBhdXNlZAorICAgICAqIHRoZW4gdGhlIHJlcXVlc3QgaGFzIG5vIGVmZmVjdC4KKyAgICAgKiA8L3A+PHA+CisgICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BBVVNFIEFDVElPTl9QQVVTRX0gZm9yCisgICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKKyAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QQVVTRX0gaW50ZW50LCBvciBudWxsIGlmIG5vbmUuCisgICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4KKyAgICAgKiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgc2Vzc2lvbi4KKyAgICAgKgorICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QQVVTRQorICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYXVzZShCdW5kbGUgZXh0cmFzLCBTZXNzaW9uQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKTsKKworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1BBVVNFKTsKKyAgICAgICAgcGVyZm9ybVNlc3Npb25BY3Rpb24oaW50ZW50LCBtU2Vzc2lvbklkLCBleHRyYXMsIGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gcmVzdW1lICh1bnBhdXNlKSBtZWRpYSBwbGF5YmFjay4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgcmVxdWVzdCBpcyBpc3N1ZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4gIElmIHBsYXliYWNrIGlzIG5vdCBwYXVzZWQKKyAgICAgKiB0aGVuIHRoZSByZXF1ZXN0IGhhcyBubyBlZmZlY3QuCisgICAgICogPC9wPjxwPgorICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9SRVNVTUUgQUNUSU9OX1JFU1VNRX0gZm9yCisgICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKKyAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9SRVNVTUV9IGludGVudCwgb3IgbnVsbCBpZiBub25lLgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuCisgICAgICogcHJvY2Vzc2VkLCBvciBudWxsIGlmIG5vbmUuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHNlc3Npb24uCisgICAgICoKKyAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUkVTVU1FCisgICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc3VtZShCdW5kbGUgZXh0cmFzLCBTZXNzaW9uQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKTsKKworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1JFU1VNRSk7CisgICAgICAgIHBlcmZvcm1TZXNzaW9uQWN0aW9uKGludGVudCwgbVNlc3Npb25JZCwgZXh0cmFzLCBjYWxsYmFjayk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZHMgYSByZXF1ZXN0IHRvIHN0b3AgbWVkaWEgcGxheWJhY2sgYW5kIGNsZWFyIHRoZSBtZWRpYSBwbGF5YmFjayBxdWV1ZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgcmVxdWVzdCBpcyBpc3N1ZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4gIElmIHRoZSBxdWV1ZSBpcyBhbHJlYWR5CisgICAgICogZW1wdHkgdGhlbiB0aGUgcmVxdWVzdCBoYXMgbm8gZWZmZWN0LgorICAgICAqIDwvcD48cD4KKyAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RPUCBBQ1RJT05fU1RPUH0gZm9yCisgICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKKyAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TVE9QfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgorICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLgorICAgICAqCisgICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NUT1AKKyAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcChCdW5kbGUgZXh0cmFzLCBTZXNzaW9uQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKTsKKworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1NUT1ApOworICAgICAgICBwZXJmb3JtU2Vzc2lvbkFjdGlvbihpbnRlbnQsIG1TZXNzaW9uSWQsIGV4dHJhcywgY2FsbGJhY2spOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byBzdGFydCBhIG5ldyBtZWRpYSBwbGF5YmFjayBzZXNzaW9uLgorICAgICAqIDxwPgorICAgICAqIFRoZSBhcHBsaWNhdGlvbiBtdXN0IHdhaXQgZm9yIHRoZSBjYWxsYmFjayB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgcmVxdWVzdAorICAgICAqIGlzIGNvbXBsZXRlIGJlZm9yZSBpc3N1aW5nIG90aGVyIHJlcXVlc3RzIHRoYXQgYWZmZWN0IHRoZSBzZXNzaW9uLiAgSWYgdGhpcworICAgICAqIHJlcXVlc3QgaXMgc3VjY2Vzc2Z1bCB0aGVuIHRoZSBwcmV2aW91cyBzZXNzaW9uIHdpbGwgYmUgaW52YWxpZGF0ZWQuCisgICAgICogPC9wPjxwPgorICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TVEFSVF9TRVNTSU9OIEFDVElPTl9TVEFSVF9TRVNTSU9OfQorICAgICAqIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleHRyYXMgQSBidW5kbGUgb2YgZXh0cmEgYXJndW1lbnRzIHRvIGJlIGFkZGVkIHRvIHRoZQorICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NUQVJUX1NFU1NJT059IGludGVudCwgb3IgbnVsbCBpZiBub25lLgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuCisgICAgICogcHJvY2Vzc2VkLCBvciBudWxsIGlmIG5vbmUuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IHNlc3Npb24gbWFuYWdlbWVudC4KKyAgICAgKgorICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TVEFSVF9TRVNTSU9OCisgICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAorICAgICAqIEBzZWUgI2lzU2Vzc2lvbk1hbmFnZW1lbnRTdXBwb3J0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydFNlc3Npb24oQnVuZGxlIGV4dHJhcywgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIHRocm93SWZTZXNzaW9uTWFuYWdlbWVudE5vdFN1cHBvcnRlZCgpOworCisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fU1RBUlRfU0VTU0lPTik7CisgICAgICAgIGludGVudC5wdXRFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfU0VTU0lPTl9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSLAorICAgICAgICAgICAgICAgIG1TZXNzaW9uU3RhdHVzUGVuZGluZ0ludGVudCk7CisgICAgICAgIGlmIChtUm91dGVTdXBwb3J0c01lc3NhZ2luZykgeworICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9NRVNTQUdFX1JFQ0VJVkVSLCBtTWVzc2FnZVBlbmRpbmdJbnRlbnQpOworICAgICAgICB9CisgICAgICAgIHBlcmZvcm1TZXNzaW9uQWN0aW9uKGludGVudCwgbnVsbCwgZXh0cmFzLCBjYWxsYmFjayk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZHMgYSBtZXNzYWdlLgorICAgICAqIDxwPgorICAgICAqIFRoZSByZXF1ZXN0IGlzIGlzc3VlZCBpbiB0aGUgY3VycmVudCBzZXNzaW9uLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU0VORF9NRVNTQUdFfSBmb3IKKyAgICAgKiBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIEEgYnVuZGxlIG1lc3NhZ2UgZGVub3Rpbmcge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNFWFRSQV9NRVNTQUdFfS4KKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgc2Vzc2lvbi4KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IG1lc3NhZ2VzLgorICAgICAqCisgICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NFTkRfTUVTU0FHRQorICAgICAqIEBzZWUgI2lzTWVzc2FnaW5nU3VwcG9ydGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2VuZE1lc3NhZ2UoQnVuZGxlIG1lc3NhZ2UsIFNlc3Npb25BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICB0aHJvd0lmTm9DdXJyZW50U2Vzc2lvbigpOworICAgICAgICB0aHJvd0lmTWVzc2FnZU5vdFN1cHBvcnRlZCgpOworCisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fU0VORF9NRVNTQUdFKTsKKyAgICAgICAgcGVyZm9ybVNlc3Npb25BY3Rpb24oaW50ZW50LCBtU2Vzc2lvbklkLCBtZXNzYWdlLCBjYWxsYmFjayk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZHMgYSByZXF1ZXN0IHRvIGdldCB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBwbGF5YmFjayBzZXNzaW9uLgorICAgICAqIDxwPgorICAgICAqIFRoZSByZXF1ZXN0IGlzIGlzc3VlZCBpbiB0aGUgY3VycmVudCBzZXNzaW9uLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fR0VUX1NFU1NJT05fU1RBVFVTCisgICAgICogQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVU30gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbWFudGljcyBvZiB0aGlzIHJlcXVlc3QuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGV4dHJhcyBBIGJ1bmRsZSBvZiBleHRyYSBhcmd1bWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlCisgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fR0VUX1NFU1NJT05fU1RBVFVTfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgorICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgc2Vzc2lvbiBtYW5hZ2VtZW50LgorICAgICAqCisgICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVUworICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKKyAgICAgKiBAc2VlICNpc1Nlc3Npb25NYW5hZ2VtZW50U3VwcG9ydGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgZ2V0U2Vzc2lvblN0YXR1cyhCdW5kbGUgZXh0cmFzLCBTZXNzaW9uQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgdGhyb3dJZlNlc3Npb25NYW5hZ2VtZW50Tm90U3VwcG9ydGVkKCk7CisgICAgICAgIHRocm93SWZOb0N1cnJlbnRTZXNzaW9uKCk7CisKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVMpOworICAgICAgICBwZXJmb3JtU2Vzc2lvbkFjdGlvbihpbnRlbnQsIG1TZXNzaW9uSWQsIGV4dHJhcywgY2FsbGJhY2spOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byBlbmQgdGhlIG1lZGlhIHBsYXliYWNrIHNlc3Npb24uCisgICAgICogPHA+CisgICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uICBJZiB0aGlzIHJlcXVlc3QgaXMgc3VjY2Vzc2Z1bCwKKyAgICAgKiB0aGUge0BsaW5rICNnZXRTZXNzaW9uSWQgc2Vzc2lvbiBpZCBwcm9wZXJ0eX0gd2lsbCBiZSBzZXQgdG8gbnVsbCBhZnRlcgorICAgICAqIHRoZSBjYWxsYmFjayBpcyBpbnZva2VkLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5EX1NFU1NJT04gQUNUSU9OX0VORF9TRVNTSU9OfQorICAgICAqIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleHRyYXMgQSBidW5kbGUgb2YgZXh0cmEgYXJndW1lbnRzIHRvIGJlIGFkZGVkIHRvIHRoZQorICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VORF9TRVNTSU9OfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgorICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgc2Vzc2lvbiBtYW5hZ2VtZW50LgorICAgICAqCisgICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VORF9TRVNTSU9OCisgICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAorICAgICAqIEBzZWUgI2lzU2Vzc2lvbk1hbmFnZW1lbnRTdXBwb3J0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBlbmRTZXNzaW9uKEJ1bmRsZSBleHRyYXMsIFNlc3Npb25BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICB0aHJvd0lmU2Vzc2lvbk1hbmFnZW1lbnROb3RTdXBwb3J0ZWQoKTsKKyAgICAgICAgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKTsKKworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX0VORF9TRVNTSU9OKTsKKyAgICAgICAgcGVyZm9ybVNlc3Npb25BY3Rpb24oaW50ZW50LCBtU2Vzc2lvbklkLCBleHRyYXMsIGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcGVyZm9ybUl0ZW1BY3Rpb24oZmluYWwgSW50ZW50IGludGVudCwKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzZXNzaW9uSWQsIGZpbmFsIFN0cmluZyBpdGVtSWQsCisgICAgICAgICAgICBCdW5kbGUgZXh0cmFzLCBmaW5hbCBJdGVtQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgaW50ZW50LmFkZENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9SRU1PVEVfUExBWUJBQ0spOworICAgICAgICBpZiAoc2Vzc2lvbklkICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfU0VTU0lPTl9JRCwgc2Vzc2lvbklkKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXRlbUlkICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9JRCwgaXRlbUlkKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXh0cmFzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYXMoZXh0cmFzKTsKKyAgICAgICAgfQorICAgICAgICBsb2dSZXF1ZXN0KGludGVudCk7CisgICAgICAgIG1Sb3V0ZS5zZW5kQ29udHJvbFJlcXVlc3QoaW50ZW50LCBuZXcgTWVkaWFSb3V0ZXIuQ29udHJvbFJlcXVlc3RDYWxsYmFjaygpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWRSZXN1bHQgPSBpbmZlck1pc3NpbmdSZXN1bHQoc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZ2V0U3RyaW5nKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9TRVNTSU9OX0lEKSk7CisgICAgICAgICAgICAgICAgICAgIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzID0gTWVkaWFTZXNzaW9uU3RhdHVzLmZyb21CdW5kbGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5nZXRCdW5kbGUoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX1NFU1NJT05fU1RBVFVTKSk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpdGVtSWRSZXN1bHQgPSBpbmZlck1pc3NpbmdSZXN1bHQoaXRlbUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZ2V0U3RyaW5nKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9JVEVNX0lEKSk7CisgICAgICAgICAgICAgICAgICAgIE1lZGlhSXRlbVN0YXR1cyBpdGVtU3RhdHVzID0gTWVkaWFJdGVtU3RhdHVzLmZyb21CdW5kbGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5nZXRCdW5kbGUoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX0lURU1fU1RBVFVTKSk7CisgICAgICAgICAgICAgICAgICAgIGFkb3B0U2Vzc2lvbihzZXNzaW9uSWRSZXN1bHQpOworICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbklkUmVzdWx0ICE9IG51bGwgJiYgaXRlbUlkUmVzdWx0ICE9IG51bGwgJiYgaXRlbVN0YXR1cyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSZWNlaXZlZCByZXN1bHQgZnJvbSAiICsgaW50ZW50LmdldEFjdGlvbigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI6IGRhdGE9IiArIGJ1bmRsZVRvU3RyaW5nKGRhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHNlc3Npb25JZD0iICsgc2Vzc2lvbklkUmVzdWx0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHNlc3Npb25TdGF0dXM9IiArIHNlc3Npb25TdGF0dXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgaXRlbUlkPSIgKyBpdGVtSWRSZXN1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgaXRlbVN0YXR1cz0iICsgaXRlbVN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblJlc3VsdChkYXRhLCBzZXNzaW9uSWRSZXN1bHQsIHNlc3Npb25TdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1JZFJlc3VsdCwgaXRlbVN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaGFuZGxlSW52YWxpZFJlc3VsdChpbnRlbnQsIGNhbGxiYWNrLCBkYXRhKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKFN0cmluZyBlcnJvciwgQnVuZGxlIGRhdGEpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcihpbnRlbnQsIGNhbGxiYWNrLCBlcnJvciwgZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwZXJmb3JtU2Vzc2lvbkFjdGlvbihmaW5hbCBJbnRlbnQgaW50ZW50LCBmaW5hbCBTdHJpbmcgc2Vzc2lvbklkLAorICAgICAgICAgICAgQnVuZGxlIGV4dHJhcywgZmluYWwgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIGludGVudC5hZGRDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLKTsKKyAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX1NFU1NJT05fSUQsIHNlc3Npb25JZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGV4dHJhcyAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmFzKGV4dHJhcyk7CisgICAgICAgIH0KKyAgICAgICAgbG9nUmVxdWVzdChpbnRlbnQpOworICAgICAgICBtUm91dGUuc2VuZENvbnRyb2xSZXF1ZXN0KGludGVudCwgbmV3IE1lZGlhUm91dGVyLkNvbnRyb2xSZXF1ZXN0Q2FsbGJhY2soKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhKSB7CisgICAgICAgICAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkUmVzdWx0ID0gaW5mZXJNaXNzaW5nUmVzdWx0KHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmdldFN0cmluZyhNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfU0VTU0lPTl9JRCkpOworICAgICAgICAgICAgICAgICAgICBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cyA9IE1lZGlhU2Vzc2lvblN0YXR1cy5mcm9tQnVuZGxlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZ2V0QnVuZGxlKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9TRVNTSU9OX1NUQVRVUykpOworICAgICAgICAgICAgICAgICAgICBhZG9wdFNlc3Npb24oc2Vzc2lvbklkUmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb25JZFJlc3VsdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSZWNlaXZlZCByZXN1bHQgZnJvbSAiICsgaW50ZW50LmdldEFjdGlvbigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI6IGRhdGE9IiArIGJ1bmRsZVRvU3RyaW5nKGRhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHNlc3Npb25JZD0iICsgc2Vzc2lvbklkUmVzdWx0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHNlc3Npb25TdGF0dXM9IiArIHNlc3Npb25TdGF0dXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblJlc3VsdChkYXRhLCBzZXNzaW9uSWRSZXN1bHQsIHNlc3Npb25TdGF0dXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZW50LmdldEFjdGlvbigpLmVxdWFscyhNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX0VORF9TRVNTSU9OKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgc2Vzc2lvbklkUmVzdWx0LmVxdWFscyhtU2Vzc2lvbklkKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTZXNzaW9uSWQobnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGhhbmRsZUludmFsaWRSZXN1bHQoaW50ZW50LCBjYWxsYmFjaywgZGF0YSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihTdHJpbmcgZXJyb3IsIEJ1bmRsZSBkYXRhKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoaW50ZW50LCBjYWxsYmFjaywgZXJyb3IsIGRhdGEpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICB2b2lkIGFkb3B0U2Vzc2lvbihTdHJpbmcgc2Vzc2lvbklkKSB7CisgICAgICAgIGlmIChzZXNzaW9uSWQgIT0gbnVsbCkgeworICAgICAgICAgICAgc2V0U2Vzc2lvbklkKHNlc3Npb25JZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGhhbmRsZUludmFsaWRSZXN1bHQoSW50ZW50IGludGVudCwgQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2ssCisgICAgICAgICAgICBCdW5kbGUgZGF0YSkgeworICAgICAgICBMb2cudyhUQUcsICJSZWNlaXZlZCBpbnZhbGlkIHJlc3VsdCBkYXRhIGZyb20gIiArIGludGVudC5nZXRBY3Rpb24oKQorICAgICAgICAgICAgICAgICsgIjogZGF0YT0iICsgYnVuZGxlVG9TdHJpbmcoZGF0YSkpOworICAgICAgICBjYWxsYmFjay5vbkVycm9yKG51bGwsIE1lZGlhQ29udHJvbEludGVudC5FUlJPUl9VTktOT1dOLCBkYXRhKTsKKyAgICB9CisKKyAgICB2b2lkIGhhbmRsZUVycm9yKEludGVudCBpbnRlbnQsIEFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrLAorICAgICAgICAgICAgU3RyaW5nIGVycm9yLCBCdW5kbGUgZGF0YSkgeworICAgICAgICBmaW5hbCBpbnQgY29kZTsKKyAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkgeworICAgICAgICAgICAgY29kZSA9IGRhdGEuZ2V0SW50KE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9FUlJPUl9DT0RFLAorICAgICAgICAgICAgICAgICAgICBNZWRpYUNvbnRyb2xJbnRlbnQuRVJST1JfVU5LTk9XTik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb2RlID0gTWVkaWFDb250cm9sSW50ZW50LkVSUk9SX1VOS05PV047CisgICAgICAgIH0KKyAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJSZWNlaXZlZCBlcnJvciBmcm9tICIgKyBpbnRlbnQuZ2V0QWN0aW9uKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiOiBlcnJvcj0iICsgZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBjb2RlPSIgKyBjb2RlCisgICAgICAgICAgICAgICAgICAgICsgIiwgZGF0YT0iICsgYnVuZGxlVG9TdHJpbmcoZGF0YSkpOworICAgICAgICB9CisgICAgICAgIGNhbGxiYWNrLm9uRXJyb3IoZXJyb3IsIGNvZGUsIGRhdGEpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkZXRlY3RGZWF0dXJlcygpIHsKKyAgICAgICAgbVJvdXRlU3VwcG9ydHNSZW1vdGVQbGF5YmFjayA9IHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9QTEFZKQorICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9TRUVLKQorICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9HRVRfU1RBVFVTKQorICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9QQVVTRSkKKyAgICAgICAgICAgICAgICAmJiByb3V0ZVN1cHBvcnRzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fUkVTVU1FKQorICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9TVE9QKTsKKyAgICAgICAgbVJvdXRlU3VwcG9ydHNRdWV1aW5nID0gbVJvdXRlU3VwcG9ydHNSZW1vdGVQbGF5YmFjaworICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9FTlFVRVVFKQorICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9SRU1PVkUpOworICAgICAgICBtUm91dGVTdXBwb3J0c1Nlc3Npb25NYW5hZ2VtZW50ID0gbVJvdXRlU3VwcG9ydHNSZW1vdGVQbGF5YmFjaworICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9TVEFSVF9TRVNTSU9OKQorICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVMpCisgICAgICAgICAgICAgICAgJiYgcm91dGVTdXBwb3J0c0FjdGlvbihNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX0VORF9TRVNTSU9OKTsKKyAgICAgICAgbVJvdXRlU3VwcG9ydHNNZXNzYWdpbmcgPSBkb2VzUm91dGVTdXBwb3J0TWVzc2FnaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHJvdXRlU3VwcG9ydHNBY3Rpb24oU3RyaW5nIGFjdGlvbikgeworICAgICAgICByZXR1cm4gbVJvdXRlLnN1cHBvcnRzQ29udHJvbEFjdGlvbihNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLLCBhY3Rpb24pOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBkb2VzUm91dGVTdXBwb3J0TWVzc2FnaW5nKCkgeworICAgICAgICBmb3IgKEludGVudEZpbHRlciBmaWx0ZXIgOiBtUm91dGUuZ2V0Q29udHJvbEZpbHRlcnMoKSkgeworICAgICAgICAgICAgaWYgKGZpbHRlci5oYXNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9TRU5EX01FU1NBR0UpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0aHJvd0lmUmVtb3RlUGxheWJhY2tOb3RTdXBwb3J0ZWQoKSB7CisgICAgICAgIGlmICghbVJvdXRlU3VwcG9ydHNSZW1vdGVQbGF5YmFjaykgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCByZW1vdGUgcGxheWJhY2suIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGhyb3dJZlF1ZXVpbmdOb3RTdXBwb3J0ZWQoKSB7CisgICAgICAgIGlmICghbVJvdXRlU3VwcG9ydHNRdWV1aW5nKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IHF1ZXVpbmcuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGhyb3dJZlNlc3Npb25NYW5hZ2VtZW50Tm90U3VwcG9ydGVkKCkgeworICAgICAgICBpZiAoIW1Sb3V0ZVN1cHBvcnRzU2Vzc2lvbk1hbmFnZW1lbnQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgIgorICAgICAgICAgICAgICAgICAgICArICJzZXNzaW9uIG1hbmFnZW1lbnQuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGhyb3dJZk1lc3NhZ2VOb3RTdXBwb3J0ZWQoKSB7CisgICAgICAgIGlmICghbVJvdXRlU3VwcG9ydHNNZXNzYWdpbmcpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgbWVzc2FnZS4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0aHJvd0lmTm9DdXJyZW50U2Vzc2lvbigpIHsKKyAgICAgICAgaWYgKG1TZXNzaW9uSWQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIFN0cmluZyBpbmZlck1pc3NpbmdSZXN1bHQoU3RyaW5nIHJlcXVlc3QsIFN0cmluZyByZXN1bHQpIHsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBSZXN1bHQgaXMgbWlzc2luZy4KKyAgICAgICAgICAgIHJldHVybiByZXF1ZXN0OworICAgICAgICB9CisgICAgICAgIGlmIChyZXF1ZXN0ID09IG51bGwgfHwgcmVxdWVzdC5lcXVhbHMocmVzdWx0KSkgeworICAgICAgICAgICAgLy8gUmVxdWVzdCBkaWRuJ3Qgc3BlY2lmeSBhIHZhbHVlIG9yIHJlc3VsdCBtYXRjaGVzIHJlcXVlc3QuCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIC8vIFJlc3VsdCBjb25mbGljdHMgd2l0aCByZXF1ZXN0LgorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGxvZ1JlcXVlc3QoSW50ZW50IGludGVudCkgeworICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIlNlbmRpbmcgcmVxdWVzdDogIiArIGludGVudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgU3RyaW5nIGJ1bmRsZVRvU3RyaW5nKEJ1bmRsZSBidW5kbGUpIHsKKyAgICAgICAgaWYgKGJ1bmRsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBidW5kbGUuc2l6ZSgpOyAvLyBmb3JjZSBidW5kbGUgdG8gYmUgdW5wYXJjZWxsZWQKKyAgICAgICAgICAgIHJldHVybiBidW5kbGUudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gIm51bGwiOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgY2xhc3MgQWN0aW9uUmVjZWl2ZXIgZXh0ZW5kcyBCcm9hZGNhc3RSZWNlaXZlciB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9JVEVNX1NUQVRVU19DSEFOR0VEID0KKyAgICAgICAgICAgICAgICAiYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhLmFjdGlvbnMuQUNUSU9OX0lURU1fU1RBVFVTX0NIQU5HRUQiOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU0VTU0lPTl9TVEFUVVNfQ0hBTkdFRCA9CisgICAgICAgICAgICAgICAgImFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYS5hY3Rpb25zLkFDVElPTl9TRVNTSU9OX1NUQVRVU19DSEFOR0VEIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX01FU1NBR0VfUkVDRUlWRUQgPQorICAgICAgICAgICAgICAgICJhbmRyb2lkLnN1cHBvcnQudjcubWVkaWEuYWN0aW9ucy5BQ1RJT05fTUVTU0FHRV9SRUNFSVZFRCI7CisKKyAgICAgICAgQWN0aW9uUmVjZWl2ZXIoKSB7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZCA9IGludGVudC5nZXRTdHJpbmdFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfU0VTU0lPTl9JRCk7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbklkID09IG51bGwgfHwgIXNlc3Npb25JZC5lcXVhbHMobVNlc3Npb25JZCkpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJEaXNjYXJkaW5nIHNwdXJpb3VzIHN0YXR1cyBjYWxsYmFjayAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJ3aXRoIG1pc3Npbmcgb3IgaW52YWxpZCBzZXNzaW9uIGlkOiBzZXNzaW9uSWQ9IiArIHNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cyA9IE1lZGlhU2Vzc2lvblN0YXR1cy5mcm9tQnVuZGxlKAorICAgICAgICAgICAgICAgICAgICBpbnRlbnQuZ2V0QnVuZGxlRXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX1NFU1NJT05fU1RBVFVTKSk7CisgICAgICAgICAgICBTdHJpbmcgYWN0aW9uID0gaW50ZW50LmdldEFjdGlvbigpOworICAgICAgICAgICAgaWYgKGFjdGlvbi5lcXVhbHMoQUNUSU9OX0lURU1fU1RBVFVTX0NIQU5HRUQpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGl0ZW1JZCA9IGludGVudC5nZXRTdHJpbmdFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9JRCk7CisgICAgICAgICAgICAgICAgaWYgKGl0ZW1JZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkRpc2NhcmRpbmcgc3B1cmlvdXMgc3RhdHVzIGNhbGxiYWNrIHdpdGggbWlzc2luZyBpdGVtIGlkLiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMgPSBNZWRpYUl0ZW1TdGF0dXMuZnJvbUJ1bmRsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVudC5nZXRCdW5kbGVFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9TVEFUVVMpKTsKKyAgICAgICAgICAgICAgICBpZiAoaXRlbVN0YXR1cyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkRpc2NhcmRpbmcgc3B1cmlvdXMgc3RhdHVzIGNhbGxiYWNrIHdpdGggbWlzc2luZyBpdGVtIHN0YXR1cy4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSZWNlaXZlZCBpdGVtIHN0YXR1cyBjYWxsYmFjazogc2Vzc2lvbklkPSIgKyBzZXNzaW9uSWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHNlc3Npb25TdGF0dXM9IiArIHNlc3Npb25TdGF0dXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGl0ZW1JZD0iICsgaXRlbUlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBpdGVtU3RhdHVzPSIgKyBpdGVtU3RhdHVzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobVN0YXR1c0NhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXR1c0NhbGxiYWNrLm9uSXRlbVN0YXR1c0NoYW5nZWQoaW50ZW50LmdldEV4dHJhcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgc2Vzc2lvblN0YXR1cywgaXRlbUlkLCBpdGVtU3RhdHVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoQUNUSU9OX1NFU1NJT05fU1RBVFVTX0NIQU5HRUQpKSB7CisgICAgICAgICAgICAgICAgaWYgKHNlc3Npb25TdGF0dXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJEaXNjYXJkaW5nIHNwdXJpb3VzIG1lZGlhIHN0YXR1cyBjYWxsYmFjayB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIm1pc3Npbmcgc2Vzc2lvbiBzdGF0dXMuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmVjZWl2ZWQgc2Vzc2lvbiBzdGF0dXMgY2FsbGJhY2s6IHNlc3Npb25JZD0iICsgc2Vzc2lvbklkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBzZXNzaW9uU3RhdHVzPSIgKyBzZXNzaW9uU3RhdHVzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobVN0YXR1c0NhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXR1c0NhbGxiYWNrLm9uU2Vzc2lvblN0YXR1c0NoYW5nZWQoaW50ZW50LmdldEV4dHJhcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgc2Vzc2lvblN0YXR1cyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEFDVElPTl9NRVNTQUdFX1JFQ0VJVkVEKSkgeworICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSZWNlaXZlZCBtZXNzYWdlIGNhbGxiYWNrOiBzZXNzaW9uSWQ9IiArIHNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG1Pbk1lc3NhZ2VSZWNlaXZlZExpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbU9uTWVzc2FnZVJlY2VpdmVkTGlzdGVuZXIub25NZXNzYWdlUmVjZWl2ZWQoc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVudC5nZXRCdW5kbGVFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfTUVTU0FHRSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgY2FsbGJhY2sgdGhhdCB3aWxsIHJlY2VpdmUgbWVkaWEgc3RhdHVzIHVwZGF0ZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBTdGF0dXNDYWxsYmFjayB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgc3RhdHVzIG9mIGEgbWVkaWEgaXRlbSBjaGFuZ2VzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZGF0YSBUaGUgcmVzdWx0IGRhdGEgYnVuZGxlLgorICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvbklkIFRoZSBzZXNzaW9uIGlkLgorICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvblN0YXR1cyBUaGUgc2Vzc2lvbiBzdGF0dXMsIG9yIG51bGwgaWYgdW5rbm93bi4KKyAgICAgICAgICogQHBhcmFtIGl0ZW1JZCBUaGUgaXRlbSBpZC4KKyAgICAgICAgICogQHBhcmFtIGl0ZW1TdGF0dXMgVGhlIGl0ZW0gc3RhdHVzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25JdGVtU3RhdHVzQ2hhbmdlZChCdW5kbGUgZGF0YSwKKyAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cywKKyAgICAgICAgICAgICAgICBTdHJpbmcgaXRlbUlkLCBNZWRpYUl0ZW1TdGF0dXMgaXRlbVN0YXR1cykgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBzdGF0dXMgb2YgYSBtZWRpYSBzZXNzaW9uIGNoYW5nZXMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBkYXRhIFRoZSByZXN1bHQgZGF0YSBidW5kbGUuCisgICAgICAgICAqIEBwYXJhbSBzZXNzaW9uSWQgVGhlIHNlc3Npb24gaWQuCisgICAgICAgICAqIEBwYXJhbSBzZXNzaW9uU3RhdHVzIFRoZSBzZXNzaW9uIHN0YXR1cywgb3IgbnVsbCBpZiB1bmtub3duLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25TZXNzaW9uU3RhdHVzQ2hhbmdlZChCdW5kbGUgZGF0YSwKKyAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cykgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBzZXNzaW9uIG9mIHRoZSByZW1vdGUgcGxheWJhY2sgY2xpZW50IGNoYW5nZXMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzZXNzaW9uSWQgVGhlIG5ldyBzZXNzaW9uIGlkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25TZXNzaW9uQ2hhbmdlZChTdHJpbmcgc2Vzc2lvbklkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCYXNlIGNhbGxiYWNrIHR5cGUgZm9yIHJlbW90ZSBwbGF5YmFjayByZXF1ZXN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEFjdGlvbkNhbGxiYWNrIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIGEgbWVkaWEgY29udHJvbCByZXF1ZXN0IGZhaWxzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZXJyb3IgQSBsb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZSB3aGljaCBtYXkgYmUgc2hvd24gdG8gdGhlIHVzZXIsIG9yIG51bGwKKyAgICAgICAgICogaWYgdGhlIGNhdXNlIG9mIHRoZSBlcnJvciBpcyB1bmNsZWFyLgorICAgICAgICAgKiBAcGFyYW0gY29kZSBUaGUgZXJyb3IgY29kZSwgb3Ige0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNFUlJPUl9VTktOT1dOfSBpZiB1bmtub3duLgorICAgICAgICAgKiBAcGFyYW0gZGF0YSBUaGUgZXJyb3IgZGF0YSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoU3RyaW5nIGVycm9yLCBpbnQgY29kZSwgQnVuZGxlIGRhdGEpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxiYWNrIGZvciByZW1vdGUgcGxheWJhY2sgcmVxdWVzdHMgdGhhdCBvcGVyYXRlIG9uIGl0ZW1zLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgSXRlbUFjdGlvbkNhbGxiYWNrIGV4dGVuZHMgQWN0aW9uQ2FsbGJhY2sgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHJlcXVlc3Qgc3VjY2VlZHMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBkYXRhIFRoZSByZXN1bHQgZGF0YSBidW5kbGUuCisgICAgICAgICAqIEBwYXJhbSBzZXNzaW9uSWQgVGhlIHNlc3Npb24gaWQuCisgICAgICAgICAqIEBwYXJhbSBzZXNzaW9uU3RhdHVzIFRoZSBzZXNzaW9uIHN0YXR1cywgb3IgbnVsbCBpZiB1bmtub3duLgorICAgICAgICAgKiBAcGFyYW0gaXRlbUlkIFRoZSBpdGVtIGlkLgorICAgICAgICAgKiBAcGFyYW0gaXRlbVN0YXR1cyBUaGUgaXRlbSBzdGF0dXMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSwgU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMsCisgICAgICAgICAgICAgICAgU3RyaW5nIGl0ZW1JZCwgTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxiYWNrIGZvciByZW1vdGUgcGxheWJhY2sgcmVxdWVzdHMgdGhhdCBvcGVyYXRlIG9uIHNlc3Npb25zLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrIGV4dGVuZHMgQWN0aW9uQ2FsbGJhY2sgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHJlcXVlc3Qgc3VjY2VlZHMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBkYXRhIFRoZSByZXN1bHQgZGF0YSBidW5kbGUuCisgICAgICAgICAqIEBwYXJhbSBzZXNzaW9uSWQgVGhlIHNlc3Npb24gaWQuCisgICAgICAgICAqIEBwYXJhbSBzZXNzaW9uU3RhdHVzIFRoZSBzZXNzaW9uIHN0YXR1cywgb3IgbnVsbCBpZiB1bmtub3duLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEsIFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGNhbGxiYWNrIHRoYXQgd2lsbCByZWNlaXZlIG1lc3NhZ2VzIGZyb20gbWVkaWEgc2Vzc2lvbnMuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBPbk1lc3NhZ2VSZWNlaXZlZExpc3RlbmVyIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIGEgbWVzc2FnZSByZWNlaXZlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHNlc3Npb25JZCBUaGUgc2Vzc2lvbiBpZC4KKyAgICAgICAgICogQHBhcmFtIG1lc3NhZ2UgQSBidW5kbGUgbWVzc2FnZSBkZW5vdGluZyB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0VYVFJBX01FU1NBR0V9LgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChTdHJpbmcgc2Vzc2lvbklkLCBCdW5kbGUgbWVzc2FnZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1N5c3RlbU1lZGlhUm91dGVQcm92aWRlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1N5c3RlbU1lZGlhUm91dGVQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzODQ5MWYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw4ODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5SZXF1aXJlc0FwaTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuRGlzcGxheTsKKworaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5BcGlIZWxwZXI7CitpbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLlI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKKy8qKgorICogUHJvdmlkZXMgcm91dGVzIGZvciBidWlsdC1pbiBzeXN0ZW0gZGVzdGluYXRpb25zIHN1Y2ggYXMgdGhlIGxvY2FsIGRpc3BsYXkKKyAqIGFuZCBzcGVha2VyLiAgT24gSmVsbHliZWFuIGFuZCBuZXdlciBwbGF0Zm9ybSByZWxlYXNlcywgcXVlcmllcyB0aGUgZnJhbWV3b3JrCisgKiBNZWRpYVJvdXRlciBmb3IgZnJhbWV3b3JrLXByb3ZpZGVkIHJvdXRlcyBhbmQgcmVnaXN0ZXJzIG5vbi1mcmFtZXdvcmstcHJvdmlkZWQKKyAqIHJvdXRlcyBhcyB1c2VyIHJvdXRlcy4KKyAqLworYWJzdHJhY3QgY2xhc3MgU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyIGV4dGVuZHMgTWVkaWFSb3V0ZVByb3ZpZGVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlN5c3RlbU1lZGlhUm91dGVQcm92aWRlciI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX05BTUUgPSAiYW5kcm9pZCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9ST1VURV9JRCA9ICJERUZBVUxUX1JPVVRFIjsKKworICAgIHByb3RlY3RlZCBTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIG5ldyBQcm92aWRlck1ldGFkYXRhKG5ldyBDb21wb25lbnROYW1lKFBBQ0tBR0VfTkFNRSwKKyAgICAgICAgICAgICAgICBTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIuY2xhc3MuZ2V0TmFtZSgpKSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyIG9idGFpbihDb250ZXh0IGNvbnRleHQsIFN5bmNDYWxsYmFjayBzeW5jQ2FsbGJhY2spIHsKKyAgICAgICAgaWYgKEJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+PSAyNCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBBcGkyNEltcGwoY29udGV4dCwgc3luY0NhbGxiYWNrKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQnVpbGQuVkVSU0lPTi5TREtfSU5UID49IDE4KSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEplbGx5YmVhbk1yMkltcGwoY29udGV4dCwgc3luY0NhbGxiYWNrKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQnVpbGQuVkVSU0lPTi5TREtfSU5UID49IDE3KSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEplbGx5YmVhbk1yMUltcGwoY29udGV4dCwgc3luY0NhbGxiYWNrKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQnVpbGQuVkVSU0lPTi5TREtfSU5UID49IDE2KSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEplbGx5YmVhbkltcGwoY29udGV4dCwgc3luY0NhbGxiYWNrKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IExlZ2FjeUltcGwoY29udGV4dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgd2hlbiBhIHJvdXRlIGlzIGFkZGVkIHRvIHN5bmNocm9uaXplIHN0YXRlIHdpdGgKKyAgICAgKiB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvblN5bmNSb3V0ZUFkZGVkKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSB0aGUgbWVkaWEgcm91dGVyIHdoZW4gYSByb3V0ZSBpcyByZW1vdmVkIHRvIHN5bmNocm9uaXplIHN0YXRlIHdpdGgKKyAgICAgKiB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvblN5bmNSb3V0ZVJlbW92ZWQoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgd2hlbiBhIHJvdXRlIGlzIGNoYW5nZWQgdG8gc3luY2hyb25pemUgc3RhdGUgd2l0aAorICAgICAqIHRoZSBmcmFtZXdvcmsgbWVkaWEgcm91dGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uU3luY1JvdXRlQ2hhbmdlZChNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgdGhlIG1lZGlhIHJvdXRlciB3aGVuIGEgcm91dGUgaXMgc2VsZWN0ZWQgdG8gc3luY2hyb25pemUgc3RhdGUgd2l0aAorICAgICAqIHRoZSBmcmFtZXdvcmsgbWVkaWEgcm91dGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uU3luY1JvdXRlU2VsZWN0ZWQoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGJhY2tzIGludG8gdGhlIG1lZGlhIHJvdXRlciB0byBzeW5jaHJvbml6ZSBzdGF0ZSB3aXRoIHRoZSBmcmFtZXdvcmsgbWVkaWEgcm91dGVyLgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgU3luY0NhbGxiYWNrIHsKKyAgICAgICAgdm9pZCBvblN5c3RlbVJvdXRlU2VsZWN0ZWRCeURlc2NyaXB0b3JJZChTdHJpbmcgaWQpOworICAgIH0KKworICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0RGVmYXVsdFJvdXRlKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldFN5c3RlbVJvdXRlKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMZWdhY3kgaW1wbGVtZW50YXRpb24gZm9yIHBsYXRmb3JtIHZlcnNpb25zIHByaW9yIHRvIEplbGx5YmVhbi4KKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgTGVnYWN5SW1wbCBleHRlbmRzIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlciB7CisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfU1RSRUFNID0gQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQzsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBcnJheUxpc3Q8SW50ZW50RmlsdGVyPiBDT05UUk9MX0ZJTFRFUlM7CisgICAgICAgIHN0YXRpYyB7CisgICAgICAgICAgICBJbnRlbnRGaWx0ZXIgZiA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKKyAgICAgICAgICAgIGYuYWRkQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfQVVESU8pOworICAgICAgICAgICAgZi5hZGRDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9WSURFTyk7CisKKyAgICAgICAgICAgIENPTlRST0xfRklMVEVSUyA9IG5ldyBBcnJheUxpc3Q8SW50ZW50RmlsdGVyPigpOworICAgICAgICAgICAgQ09OVFJPTF9GSUxURVJTLmFkZChmKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIEF1ZGlvTWFuYWdlciBtQXVkaW9NYW5hZ2VyOworICAgICAgICBwcml2YXRlIGZpbmFsIFZvbHVtZUNoYW5nZVJlY2VpdmVyIG1Wb2x1bWVDaGFuZ2VSZWNlaXZlcjsKKyAgICAgICAgaW50IG1MYXN0UmVwb3J0ZWRWb2x1bWUgPSAtMTsKKworICAgICAgICBwdWJsaWMgTGVnYWN5SW1wbChDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICAgICAgbUF1ZGlvTWFuYWdlciA9IChBdWRpb01hbmFnZXIpY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQVVESU9fU0VSVklDRSk7CisgICAgICAgICAgICBtVm9sdW1lQ2hhbmdlUmVjZWl2ZXIgPSBuZXcgVm9sdW1lQ2hhbmdlUmVjZWl2ZXIoKTsKKworICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1Wb2x1bWVDaGFuZ2VSZWNlaXZlciwKKyAgICAgICAgICAgICAgICAgICAgbmV3IEludGVudEZpbHRlcihWb2x1bWVDaGFuZ2VSZWNlaXZlci5WT0xVTUVfQ0hBTkdFRF9BQ1RJT04pKTsKKyAgICAgICAgICAgIHB1Ymxpc2hSb3V0ZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgcHVibGlzaFJvdXRlcygpIHsKKyAgICAgICAgICAgIFJlc291cmNlcyByID0gZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpOworICAgICAgICAgICAgaW50IG1heFZvbHVtZSA9IG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtTWF4Vm9sdW1lKFBMQVlCQUNLX1NUUkVBTSk7CisgICAgICAgICAgICBtTGFzdFJlcG9ydGVkVm9sdW1lID0gbUF1ZGlvTWFuYWdlci5nZXRTdHJlYW1Wb2x1bWUoUExBWUJBQ0tfU1RSRUFNKTsKKyAgICAgICAgICAgIE1lZGlhUm91dGVEZXNjcmlwdG9yIGRlZmF1bHRSb3V0ZSA9IG5ldyBNZWRpYVJvdXRlRGVzY3JpcHRvci5CdWlsZGVyKAorICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1JPVVRFX0lELCByLmdldFN0cmluZyhSLnN0cmluZy5tcl9zeXN0ZW1fcm91dGVfbmFtZSkpCisgICAgICAgICAgICAgICAgICAgIC5hZGRDb250cm9sRmlsdGVycyhDT05UUk9MX0ZJTFRFUlMpCisgICAgICAgICAgICAgICAgICAgIC5zZXRQbGF5YmFja1N0cmVhbShQTEFZQkFDS19TVFJFQU0pCisgICAgICAgICAgICAgICAgICAgIC5zZXRQbGF5YmFja1R5cGUoTWVkaWFSb3V0ZXIuUm91dGVJbmZvLlBMQVlCQUNLX1RZUEVfTE9DQUwpCisgICAgICAgICAgICAgICAgICAgIC5zZXRWb2x1bWVIYW5kbGluZyhNZWRpYVJvdXRlci5Sb3V0ZUluZm8uUExBWUJBQ0tfVk9MVU1FX1ZBUklBQkxFKQorICAgICAgICAgICAgICAgICAgICAuc2V0Vm9sdW1lTWF4KG1heFZvbHVtZSkKKyAgICAgICAgICAgICAgICAgICAgLnNldFZvbHVtZShtTGFzdFJlcG9ydGVkVm9sdW1lKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBwcm92aWRlckRlc2NyaXB0b3IgPQorICAgICAgICAgICAgICAgICAgICBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvci5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgLmFkZFJvdXRlKGRlZmF1bHRSb3V0ZSkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgICAgICBzZXREZXNjcmlwdG9yKHByb3ZpZGVyRGVzY3JpcHRvcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJvdXRlQ29udHJvbGxlciBvbkNyZWF0ZVJvdXRlQ29udHJvbGxlcihTdHJpbmcgcm91dGVJZCkgeworICAgICAgICAgICAgaWYgKHJvdXRlSWQuZXF1YWxzKERFRkFVTFRfUk9VVEVfSUQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0Um91dGVDb250cm9sbGVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGNsYXNzIERlZmF1bHRSb3V0ZUNvbnRyb2xsZXIgZXh0ZW5kcyBSb3V0ZUNvbnRyb2xsZXIgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblNldFZvbHVtZShpbnQgdm9sdW1lKSB7CisgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRTdHJlYW1Wb2x1bWUoUExBWUJBQ0tfU1RSRUFNLCB2b2x1bWUsIDApOworICAgICAgICAgICAgICAgIHB1Ymxpc2hSb3V0ZXMoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblVwZGF0ZVZvbHVtZShpbnQgZGVsdGEpIHsKKyAgICAgICAgICAgICAgICBpbnQgdm9sdW1lID0gbUF1ZGlvTWFuYWdlci5nZXRTdHJlYW1Wb2x1bWUoUExBWUJBQ0tfU1RSRUFNKTsKKyAgICAgICAgICAgICAgICBpbnQgbWF4Vm9sdW1lID0gbUF1ZGlvTWFuYWdlci5nZXRTdHJlYW1NYXhWb2x1bWUoUExBWUJBQ0tfU1RSRUFNKTsKKyAgICAgICAgICAgICAgICBpbnQgbmV3Vm9sdW1lID0gTWF0aC5taW4obWF4Vm9sdW1lLCBNYXRoLm1heCgwLCB2b2x1bWUgKyBkZWx0YSkpOworICAgICAgICAgICAgICAgIGlmIChuZXdWb2x1bWUgIT0gdm9sdW1lKSB7CisgICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0U3RyZWFtVm9sdW1lKFBMQVlCQUNLX1NUUkVBTSwgdm9sdW1lLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHVibGlzaFJvdXRlcygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZmluYWwgY2xhc3MgVm9sdW1lQ2hhbmdlUmVjZWl2ZXIgZXh0ZW5kcyBCcm9hZGNhc3RSZWNlaXZlciB7CisgICAgICAgICAgICAvLyBUaGVzZSBjb25zdGFudHMgY29tZSBmcm9tIEF1ZGlvTWFuYWdlci4KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZPTFVNRV9DSEFOR0VEX0FDVElPTiA9CisgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLlZPTFVNRV9DSEFOR0VEX0FDVElPTiI7CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9WT0xVTUVfU1RSRUFNX1RZUEUgPQorICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5FWFRSQV9WT0xVTUVfU1RSRUFNX1RZUEUiOworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfVk9MVU1FX1NUUkVBTV9WQUxVRSA9CisgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLkVYVFJBX1ZPTFVNRV9TVFJFQU1fVkFMVUUiOworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgICAgICAgICBpZiAoaW50ZW50LmdldEFjdGlvbigpLmVxdWFscyhWT0xVTUVfQ0hBTkdFRF9BQ1RJT04pKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBzdHJlYW1UeXBlID0gaW50ZW50LmdldEludEV4dHJhKEVYVFJBX1ZPTFVNRV9TVFJFQU1fVFlQRSwgLTEpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtVHlwZSA9PSBQTEFZQkFDS19TVFJFQU0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB2b2x1bWUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoRVhUUkFfVk9MVU1FX1NUUkVBTV9WQUxVRSwgLTEpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZvbHVtZSA+PSAwICYmIHZvbHVtZSAhPSBtTGFzdFJlcG9ydGVkVm9sdW1lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGlzaFJvdXRlcygpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSmVsbHliZWFuIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIC8vIEBAUmVxdWlyZXNBcGkoMTYpCisgICAgc3RhdGljIGNsYXNzIEplbGx5YmVhbkltcGwgZXh0ZW5kcyBTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIKKyAgICAgICAgICAgIGltcGxlbWVudHMgTWVkaWFSb3V0ZXJKZWxseWJlYW4uQ2FsbGJhY2ssIE1lZGlhUm91dGVySmVsbHliZWFuLlZvbHVtZUNhbGxiYWNrIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXJyYXlMaXN0PEludGVudEZpbHRlcj4gTElWRV9BVURJT19DT05UUk9MX0ZJTFRFUlM7CisgICAgICAgIHN0YXRpYyB7CisgICAgICAgICAgICBJbnRlbnRGaWx0ZXIgZiA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKKyAgICAgICAgICAgIGYuYWRkQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfQVVESU8pOworCisgICAgICAgICAgICBMSVZFX0FVRElPX0NPTlRST0xfRklMVEVSUyA9IG5ldyBBcnJheUxpc3Q8SW50ZW50RmlsdGVyPigpOworICAgICAgICAgICAgTElWRV9BVURJT19DT05UUk9MX0ZJTFRFUlMuYWRkKGYpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXJyYXlMaXN0PEludGVudEZpbHRlcj4gTElWRV9WSURFT19DT05UUk9MX0ZJTFRFUlM7CisgICAgICAgIHN0YXRpYyB7CisgICAgICAgICAgICBJbnRlbnRGaWx0ZXIgZiA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKKyAgICAgICAgICAgIGYuYWRkQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfVklERU8pOworCisgICAgICAgICAgICBMSVZFX1ZJREVPX0NPTlRST0xfRklMVEVSUyA9IG5ldyBBcnJheUxpc3Q8SW50ZW50RmlsdGVyPigpOworICAgICAgICAgICAgTElWRV9WSURFT19DT05UUk9MX0ZJTFRFUlMuYWRkKGYpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTeW5jQ2FsbGJhY2sgbVN5bmNDYWxsYmFjazsKKworICAgICAgICBwcm90ZWN0ZWQgZmluYWwgT2JqZWN0IG1Sb3V0ZXJPYmo7CisgICAgICAgIHByb3RlY3RlZCBmaW5hbCBPYmplY3QgbUNhbGxiYWNrT2JqOworICAgICAgICBwcm90ZWN0ZWQgZmluYWwgT2JqZWN0IG1Wb2x1bWVDYWxsYmFja09iajsKKyAgICAgICAgcHJvdGVjdGVkIGZpbmFsIE9iamVjdCBtVXNlclJvdXRlQ2F0ZWdvcnlPYmo7CisgICAgICAgIHByb3RlY3RlZCBpbnQgbVJvdXRlVHlwZXM7CisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIG1BY3RpdmVTY2FuOworICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtQ2FsbGJhY2tSZWdpc3RlcmVkOworCisgICAgICAgIC8vIE1haW50YWlucyBhbiBhc3NvY2lhdGlvbiBmcm9tIGZyYW1ld29yayByb3V0ZXMgdG8gc3VwcG9ydCBsaWJyYXJ5IHJvdXRlcy4KKyAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGNhbm5vdCB1c2UgdGhlIHRhZyBmaWVsZCBmb3IgdGhpcyBiZWNhdXNlIGFuIGFwcGxpY2F0aW9uIG1heQorICAgICAgICAvLyBoYXZlIHB1Ymxpc2hlZCBpdHMgb3duIHVzZXIgcm91dGVzIHRvIHRoZSBmcmFtZXdvcmsgbWVkaWEgcm91dGVyIGFuZCBhbHJlYWR5CisgICAgICAgIC8vIHVzZWQgdGhlIHRhZyBmb3IgaXRzIG93biBwdXJwb3Nlcy4KKyAgICAgICAgcHJvdGVjdGVkIGZpbmFsIEFycmF5TGlzdDxTeXN0ZW1Sb3V0ZVJlY29yZD4gbVN5c3RlbVJvdXRlUmVjb3JkcyA9CisgICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxTeXN0ZW1Sb3V0ZVJlY29yZD4oKTsKKworICAgICAgICAvLyBNYWludGFpbnMgYW4gYXNzb2NpYXRpb24gZnJvbSBzdXBwb3J0IGxpYnJhcnkgcm91dGVzIHRvIGZyYW1ld29yayByb3V0ZXMuCisgICAgICAgIHByb3RlY3RlZCBmaW5hbCBBcnJheUxpc3Q8VXNlclJvdXRlUmVjb3JkPiBtVXNlclJvdXRlUmVjb3JkcyA9CisgICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxVc2VyUm91dGVSZWNvcmQ+KCk7CisKKyAgICAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlckplbGx5YmVhbi5TZWxlY3RSb3V0ZVdvcmthcm91bmQgbVNlbGVjdFJvdXRlV29ya2Fyb3VuZDsKKyAgICAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlckplbGx5YmVhbi5HZXREZWZhdWx0Um91dGVXb3JrYXJvdW5kIG1HZXREZWZhdWx0Um91dGVXb3JrYXJvdW5kOworCisgICAgICAgIHB1YmxpYyBKZWxseWJlYW5JbXBsKENvbnRleHQgY29udGV4dCwgU3luY0NhbGxiYWNrIHN5bmNDYWxsYmFjaykgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgICAgICBtU3luY0NhbGxiYWNrID0gc3luY0NhbGxiYWNrOworICAgICAgICAgICAgbVJvdXRlck9iaiA9IE1lZGlhUm91dGVySmVsbHliZWFuLmdldE1lZGlhUm91dGVyKGNvbnRleHQpOworICAgICAgICAgICAgbUNhbGxiYWNrT2JqID0gY3JlYXRlQ2FsbGJhY2tPYmooKTsKKyAgICAgICAgICAgIG1Wb2x1bWVDYWxsYmFja09iaiA9IGNyZWF0ZVZvbHVtZUNhbGxiYWNrT2JqKCk7CisKKyAgICAgICAgICAgIFJlc291cmNlcyByID0gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhjb250ZXh0KTsKKyAgICAgICAgICAgIG1Vc2VyUm91dGVDYXRlZ29yeU9iaiA9IE1lZGlhUm91dGVySmVsbHliZWFuLmNyZWF0ZVJvdXRlQ2F0ZWdvcnkoCisgICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXJPYmosIHIuZ2V0U3RyaW5nKFIuc3RyaW5nLm1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSksIGZhbHNlKTsKKworICAgICAgICAgICAgdXBkYXRlU3lzdGVtUm91dGVzKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJvdXRlQ29udHJvbGxlciBvbkNyZWF0ZVJvdXRlQ29udHJvbGxlcihTdHJpbmcgcm91dGVJZCkgeworICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFN5c3RlbVJvdXRlUmVjb3JkQnlEZXNjcmlwdG9ySWQocm91dGVJZCk7CisgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgIFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCA9IG1TeXN0ZW1Sb3V0ZVJlY29yZHMuZ2V0KGluZGV4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN5c3RlbVJvdXRlQ29udHJvbGxlcihyZWNvcmQubVJvdXRlT2JqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRGlzY292ZXJ5UmVxdWVzdENoYW5nZWQoTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICAgICAgaW50IG5ld1JvdXRlVHlwZXMgPSAwOworICAgICAgICAgICAgYm9vbGVhbiBuZXdBY3RpdmVTY2FuID0gZmFsc2U7CisgICAgICAgICAgICBpZiAocmVxdWVzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yID0gcmVxdWVzdC5nZXRTZWxlY3RvcigpOworICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBjYXRlZ29yaWVzID0gc2VsZWN0b3IuZ2V0Q29udHJvbENhdGVnb3JpZXMoKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBjYXRlZ29yaWVzLnNpemUoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNhdGVnb3J5ID0gY2F0ZWdvcmllcy5nZXQoaSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYXRlZ29yeS5lcXVhbHMoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfQVVESU8pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdSb3V0ZVR5cGVzIHw9IE1lZGlhUm91dGVySmVsbHliZWFuLlJPVVRFX1RZUEVfTElWRV9BVURJTzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjYXRlZ29yeS5lcXVhbHMoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfVklERU8pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdSb3V0ZVR5cGVzIHw9IE1lZGlhUm91dGVySmVsbHliZWFuLlJPVVRFX1RZUEVfTElWRV9WSURFTzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1JvdXRlVHlwZXMgfD0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uUk9VVEVfVFlQRV9VU0VSOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5ld0FjdGl2ZVNjYW4gPSByZXF1ZXN0LmlzQWN0aXZlU2NhbigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobVJvdXRlVHlwZXMgIT0gbmV3Um91dGVUeXBlcyB8fCBtQWN0aXZlU2NhbiAhPSBuZXdBY3RpdmVTY2FuKSB7CisgICAgICAgICAgICAgICAgbVJvdXRlVHlwZXMgPSBuZXdSb3V0ZVR5cGVzOworICAgICAgICAgICAgICAgIG1BY3RpdmVTY2FuID0gbmV3QWN0aXZlU2NhbjsKKyAgICAgICAgICAgICAgICB1cGRhdGVTeXN0ZW1Sb3V0ZXMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQWRkZWQoT2JqZWN0IHJvdXRlT2JqKSB7CisgICAgICAgICAgICBpZiAoYWRkU3lzdGVtUm91dGVOb1B1Ymxpc2gocm91dGVPYmopKSB7CisgICAgICAgICAgICAgICAgcHVibGlzaFJvdXRlcygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVN5c3RlbVJvdXRlcygpIHsKKyAgICAgICAgICAgIHVwZGF0ZUNhbGxiYWNrKCk7CisgICAgICAgICAgICBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoT2JqZWN0IHJvdXRlT2JqIDogTWVkaWFSb3V0ZXJKZWxseWJlYW4uZ2V0Um91dGVzKG1Sb3V0ZXJPYmopKSB7CisgICAgICAgICAgICAgICAgY2hhbmdlZCB8PSBhZGRTeXN0ZW1Sb3V0ZU5vUHVibGlzaChyb3V0ZU9iaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2hhbmdlZCkgeworICAgICAgICAgICAgICAgIHB1Ymxpc2hSb3V0ZXMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBhZGRTeXN0ZW1Sb3V0ZU5vUHVibGlzaChPYmplY3Qgcm91dGVPYmopIHsKKyAgICAgICAgICAgIGlmIChnZXRVc2VyUm91dGVSZWNvcmQocm91dGVPYmopID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgJiYgZmluZFN5c3RlbVJvdXRlUmVjb3JkKHJvdXRlT2JqKSA8IDApIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgaWQgPSBhc3NpZ25Sb3V0ZUlkKHJvdXRlT2JqKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQgPSBuZXcgU3lzdGVtUm91dGVSZWNvcmQocm91dGVPYmosIGlkKTsKKyAgICAgICAgICAgICAgICB1cGRhdGVTeXN0ZW1Sb3V0ZURlc2NyaXB0b3IocmVjb3JkKTsKKyAgICAgICAgICAgICAgICBtU3lzdGVtUm91dGVSZWNvcmRzLmFkZChyZWNvcmQpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgYXNzaWduUm91dGVJZChPYmplY3Qgcm91dGVPYmopIHsKKyAgICAgICAgICAgIC8vIFRPRE86IFRoZSBmcmFtZXdvcmsgbWVkaWEgcm91dGVyIHNob3VsZCBzdXBwbHkgYSB1bmlxdWUgcm91dGUgaWQgdGhhdAorICAgICAgICAgICAgLy8gd2UgY2FuIHVzZSBoZXJlLiAgRm9yIG5vdyB3ZSB1c2UgYSBoYXNoIG9mIHRoZSByb3V0ZSBuYW1lIGFuZCB0YWtlIGNhcmUKKyAgICAgICAgICAgIC8vIHRvIGRlZHVwZSBpdC4KKyAgICAgICAgICAgIGJvb2xlYW4gaXNEZWZhdWx0ID0gKGdldERlZmF1bHRSb3V0ZSgpID09IHJvdXRlT2JqKTsKKyAgICAgICAgICAgIFN0cmluZyBpZCA9IGlzRGVmYXVsdCA/IERFRkFVTFRfUk9VVEVfSUQgOgorICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KExvY2FsZS5VUywgIlJPVVRFXyUwOHgiLCBnZXRSb3V0ZU5hbWUocm91dGVPYmopLmhhc2hDb2RlKCkpOworICAgICAgICAgICAgaWYgKGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZEJ5RGVzY3JpcHRvcklkKGlkKSA8IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludCBpID0gMjsgOyBpKyspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmV3SWQgPSBTdHJpbmcuZm9ybWF0KExvY2FsZS5VUywgIiVzXyVkIiwgaWQsIGkpOworICAgICAgICAgICAgICAgIGlmIChmaW5kU3lzdGVtUm91dGVSZWNvcmRCeURlc2NyaXB0b3JJZChuZXdJZCkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdJZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVJlbW92ZWQoT2JqZWN0IHJvdXRlT2JqKSB7CisgICAgICAgICAgICBpZiAoZ2V0VXNlclJvdXRlUmVjb3JkKHJvdXRlT2JqKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFN5c3RlbVJvdXRlUmVjb3JkKHJvdXRlT2JqKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBtU3lzdGVtUm91dGVSZWNvcmRzLnJlbW92ZShpbmRleCk7CisgICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hSb3V0ZXMoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUNoYW5nZWQoT2JqZWN0IHJvdXRlT2JqKSB7CisgICAgICAgICAgICBpZiAoZ2V0VXNlclJvdXRlUmVjb3JkKHJvdXRlT2JqKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFN5c3RlbVJvdXRlUmVjb3JkKHJvdXRlT2JqKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQgPSBtU3lzdGVtUm91dGVSZWNvcmRzLmdldChpbmRleCk7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVN5c3RlbVJvdXRlRGVzY3JpcHRvcihyZWNvcmQpOworICAgICAgICAgICAgICAgICAgICBwdWJsaXNoUm91dGVzKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVWb2x1bWVDaGFuZ2VkKE9iamVjdCByb3V0ZU9iaikgeworICAgICAgICAgICAgaWYgKGdldFVzZXJSb3V0ZVJlY29yZChyb3V0ZU9iaikgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZChyb3V0ZU9iaik7CisgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkID0gbVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaW5kZXgpOworICAgICAgICAgICAgICAgICAgICBpbnQgbmV3Vm9sdW1lID0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLmdldFZvbHVtZShyb3V0ZU9iaik7CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdWb2x1bWUgIT0gcmVjb3JkLm1Sb3V0ZURlc2NyaXB0b3IuZ2V0Vm9sdW1lKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGVEZXNjcmlwdG9yID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE1lZGlhUm91dGVEZXNjcmlwdG9yLkJ1aWxkZXIocmVjb3JkLm1Sb3V0ZURlc2NyaXB0b3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRWb2x1bWUobmV3Vm9sdW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hSb3V0ZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlU2VsZWN0ZWQoaW50IHR5cGUsIE9iamVjdCByb3V0ZU9iaikgeworICAgICAgICAgICAgaWYgKHJvdXRlT2JqICE9IE1lZGlhUm91dGVySmVsbHliZWFuLmdldFNlbGVjdGVkUm91dGUobVJvdXRlck9iaiwKKyAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uQUxMX1JPVVRFX1RZUEVTKSkgeworICAgICAgICAgICAgICAgIC8vIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcm91dGUgaGFzIGFscmVhZHkgY2hhbmdlZCBzbyB0aGlzIGNhbGxiYWNrCisgICAgICAgICAgICAgICAgLy8gaXMgc3RhbGUuICBEcm9wIGl0IHRvIHByZXZlbnQgZ2V0dGluZyBpbnRvIHN5bmMgbG9vcHMuCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBVc2VyUm91dGVSZWNvcmQgdXNlclJvdXRlUmVjb3JkID0gZ2V0VXNlclJvdXRlUmVjb3JkKHJvdXRlT2JqKTsKKyAgICAgICAgICAgIGlmICh1c2VyUm91dGVSZWNvcmQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHVzZXJSb3V0ZVJlY29yZC5tUm91dGUuc2VsZWN0KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFNlbGVjdCB0aGUgcm91dGUgaWYgaXQgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGNvbXBhdCBtZWRpYSByb3V0ZXIuCisgICAgICAgICAgICAgICAgLy8gSWYgbm90LCB3ZSB3aWxsIHNlbGVjdCBpdCBpbnN0ZWFkIHdoZW4gdGhlIHJvdXRlIGlzIGFkZGVkLgorICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZChyb3V0ZU9iaik7CisgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkID0gbVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaW5kZXgpOworICAgICAgICAgICAgICAgICAgICBtU3luY0NhbGxiYWNrLm9uU3lzdGVtUm91dGVTZWxlY3RlZEJ5RGVzY3JpcHRvcklkKHJlY29yZC5tUm91dGVEZXNjcmlwdG9ySWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVW5zZWxlY3RlZChpbnQgdHlwZSwgT2JqZWN0IHJvdXRlT2JqKSB7CisgICAgICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIHdoZW4gYSByb3V0ZSBpcyB1bnNlbGVjdGVkLgorICAgICAgICAgICAgLy8gV2Ugb25seSBuZWVkIHRvIGhhbmRsZSB3aGVuIGEgcm91dGUgaXMgc2VsZWN0ZWQuCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUdyb3VwZWQoT2JqZWN0IHJvdXRlT2JqLCBPYmplY3QgZ3JvdXBPYmosIGludCBpbmRleCkgeworICAgICAgICAgICAgLy8gUm91dGUgZ3JvdXBpbmcgaXMgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyIHN1cHBvcnRlZC4KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVW5ncm91cGVkKE9iamVjdCByb3V0ZU9iaiwgT2JqZWN0IGdyb3VwT2JqKSB7CisgICAgICAgICAgICAvLyBSb3V0ZSBncm91cGluZyBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgc3VwcG9ydGVkLgorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lU2V0UmVxdWVzdChPYmplY3Qgcm91dGVPYmosIGludCB2b2x1bWUpIHsKKyAgICAgICAgICAgIFVzZXJSb3V0ZVJlY29yZCByZWNvcmQgPSBnZXRVc2VyUm91dGVSZWNvcmQocm91dGVPYmopOworICAgICAgICAgICAgaWYgKHJlY29yZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZS5yZXF1ZXN0U2V0Vm9sdW1lKHZvbHVtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVVcGRhdGVSZXF1ZXN0KE9iamVjdCByb3V0ZU9iaiwgaW50IGRpcmVjdGlvbikgeworICAgICAgICAgICAgVXNlclJvdXRlUmVjb3JkIHJlY29yZCA9IGdldFVzZXJSb3V0ZVJlY29yZChyb3V0ZU9iaik7CisgICAgICAgICAgICBpZiAocmVjb3JkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlLnJlcXVlc3RVcGRhdGVWb2x1bWUoZGlyZWN0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblN5bmNSb3V0ZUFkZGVkKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgeworICAgICAgICAgICAgaWYgKHJvdXRlLmdldFByb3ZpZGVySW5zdGFuY2UoKSAhPSB0aGlzKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IHJvdXRlT2JqID0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uY3JlYXRlVXNlclJvdXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgbVJvdXRlck9iaiwgbVVzZXJSb3V0ZUNhdGVnb3J5T2JqKTsKKyAgICAgICAgICAgICAgICBVc2VyUm91dGVSZWNvcmQgcmVjb3JkID0gbmV3IFVzZXJSb3V0ZVJlY29yZChyb3V0ZSwgcm91dGVPYmopOworICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5zZXRUYWcocm91dGVPYmosIHJlY29yZCk7CisgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRWb2x1bWVDYWxsYmFjayhyb3V0ZU9iaiwgbVZvbHVtZUNhbGxiYWNrT2JqKTsKKyAgICAgICAgICAgICAgICB1cGRhdGVVc2VyUm91dGVQcm9wZXJ0aWVzKHJlY29yZCk7CisgICAgICAgICAgICAgICAgbVVzZXJSb3V0ZVJlY29yZHMuYWRkKHJlY29yZCk7CisgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uYWRkVXNlclJvdXRlKG1Sb3V0ZXJPYmosIHJvdXRlT2JqKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIG5ld2x5IGFkZGVkIHJvdXRlIGlzIHRoZSBjb3VudGVycGFydCBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkCisgICAgICAgICAgICAgICAgLy8gcm91dGUgaW4gdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIgdGhlbiBlbnN1cmUgaXQgaXMgc2VsZWN0ZWQgaW4KKyAgICAgICAgICAgICAgICAvLyB0aGUgY29tcGF0IG1lZGlhIHJvdXRlci4KKyAgICAgICAgICAgICAgICBPYmplY3Qgcm91dGVPYmogPSBNZWRpYVJvdXRlckplbGx5YmVhbi5nZXRTZWxlY3RlZFJvdXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgbVJvdXRlck9iaiwgTWVkaWFSb3V0ZXJKZWxseWJlYW4uQUxMX1JPVVRFX1RZUEVTKTsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kU3lzdGVtUm91dGVSZWNvcmQocm91dGVPYmopOworICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCA9IG1TeXN0ZW1Sb3V0ZVJlY29yZHMuZ2V0KGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlY29yZC5tUm91dGVEZXNjcmlwdG9ySWQuZXF1YWxzKHJvdXRlLmdldERlc2NyaXB0b3JJZCgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUuc2VsZWN0KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TeW5jUm91dGVSZW1vdmVkKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgeworICAgICAgICAgICAgaWYgKHJvdXRlLmdldFByb3ZpZGVySW5zdGFuY2UoKSAhPSB0aGlzKSB7CisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFVzZXJSb3V0ZVJlY29yZChyb3V0ZSk7CisgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgVXNlclJvdXRlUmVjb3JkIHJlY29yZCA9IG1Vc2VyUm91dGVSZWNvcmRzLnJlbW92ZShpbmRleCk7CisgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5zZXRUYWcocmVjb3JkLm1Sb3V0ZU9iaiwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0Vm9sdW1lQ2FsbGJhY2socmVjb3JkLm1Sb3V0ZU9iaiwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLnJlbW92ZVVzZXJSb3V0ZShtUm91dGVyT2JqLCByZWNvcmQubVJvdXRlT2JqKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TeW5jUm91dGVDaGFuZ2VkKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgeworICAgICAgICAgICAgaWYgKHJvdXRlLmdldFByb3ZpZGVySW5zdGFuY2UoKSAhPSB0aGlzKSB7CisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFVzZXJSb3V0ZVJlY29yZChyb3V0ZSk7CisgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgVXNlclJvdXRlUmVjb3JkIHJlY29yZCA9IG1Vc2VyUm91dGVSZWNvcmRzLmdldChpbmRleCk7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVVzZXJSb3V0ZVByb3BlcnRpZXMocmVjb3JkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TeW5jUm91dGVTZWxlY3RlZChNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKKyAgICAgICAgICAgIGlmICghcm91dGUuaXNTZWxlY3RlZCgpKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGN1cnJlbnRseSBzZWxlY3RlZCByb3V0ZSBoYXMgYWxyZWFkeSBjaGFuZ2VkIHNvIHRoaXMgY2FsbGJhY2sKKyAgICAgICAgICAgICAgICAvLyBpcyBzdGFsZS4gIERyb3AgaXQgdG8gcHJldmVudCBnZXR0aW5nIGludG8gc3luYyBsb29wcy4KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChyb3V0ZS5nZXRQcm92aWRlckluc3RhbmNlKCkgIT0gdGhpcykgeworICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRVc2VyUm91dGVSZWNvcmQocm91dGUpOworICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIFVzZXJSb3V0ZVJlY29yZCByZWNvcmQgPSBtVXNlclJvdXRlUmVjb3Jkcy5nZXQoaW5kZXgpOworICAgICAgICAgICAgICAgICAgICBzZWxlY3RSb3V0ZShyZWNvcmQubVJvdXRlT2JqKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZEJ5RGVzY3JpcHRvcklkKHJvdXRlLmdldERlc2NyaXB0b3JJZCgpKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQgPSBtU3lzdGVtUm91dGVSZWNvcmRzLmdldChpbmRleCk7CisgICAgICAgICAgICAgICAgICAgIHNlbGVjdFJvdXRlKHJlY29yZC5tUm91dGVPYmopOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHB1Ymxpc2hSb3V0ZXMoKSB7CisgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLkJ1aWxkZXIgYnVpbGRlciA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLkJ1aWxkZXIoKTsKKyAgICAgICAgICAgIGludCBjb3VudCA9IG1TeXN0ZW1Sb3V0ZVJlY29yZHMuc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hZGRSb3V0ZShtU3lzdGVtUm91dGVSZWNvcmRzLmdldChpKS5tUm91dGVEZXNjcmlwdG9yKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2V0RGVzY3JpcHRvcihidWlsZGVyLmJ1aWxkKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGludCBmaW5kU3lzdGVtUm91dGVSZWNvcmQoT2JqZWN0IHJvdXRlT2JqKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtU3lzdGVtUm91dGVSZWNvcmRzLnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChtU3lzdGVtUm91dGVSZWNvcmRzLmdldChpKS5tUm91dGVPYmogPT0gcm91dGVPYmopIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGludCBmaW5kU3lzdGVtUm91dGVSZWNvcmRCeURlc2NyaXB0b3JJZChTdHJpbmcgaWQpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1TeXN0ZW1Sb3V0ZVJlY29yZHMuc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKG1TeXN0ZW1Sb3V0ZVJlY29yZHMuZ2V0KGkpLm1Sb3V0ZURlc2NyaXB0b3JJZC5lcXVhbHMoaWQpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBpbnQgZmluZFVzZXJSb3V0ZVJlY29yZChNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1Vc2VyUm91dGVSZWNvcmRzLnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChtVXNlclJvdXRlUmVjb3Jkcy5nZXQoaSkubVJvdXRlID09IHJvdXRlKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBVc2VyUm91dGVSZWNvcmQgZ2V0VXNlclJvdXRlUmVjb3JkKE9iamVjdCByb3V0ZU9iaikgeworICAgICAgICAgICAgT2JqZWN0IHRhZyA9IE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5nZXRUYWcocm91dGVPYmopOworICAgICAgICAgICAgcmV0dXJuIHRhZyBpbnN0YW5jZW9mIFVzZXJSb3V0ZVJlY29yZCA/IChVc2VyUm91dGVSZWNvcmQpdGFnIDogbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVN5c3RlbVJvdXRlRGVzY3JpcHRvcihTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQpIHsKKyAgICAgICAgICAgIC8vIFdlIG11c3QgYWx3YXlzIHJlY3JlYXRlIHRoZSByb3V0ZSBkZXNjcmlwdG9yIHdoZW4gbWFraW5nIGFueSBjaGFuZ2VzCisgICAgICAgICAgICAvLyBiZWNhdXNlIHRoZXkgYXJlIGludGVuZGVkIHRvIGJlIGltbXV0YWJsZSBvbmNlIHB1Ymxpc2hlZC4KKyAgICAgICAgICAgIE1lZGlhUm91dGVEZXNjcmlwdG9yLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBNZWRpYVJvdXRlRGVzY3JpcHRvci5CdWlsZGVyKAorICAgICAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlRGVzY3JpcHRvcklkLCBnZXRSb3V0ZU5hbWUocmVjb3JkLm1Sb3V0ZU9iaikpOworICAgICAgICAgICAgb25CdWlsZFN5c3RlbVJvdXRlRGVzY3JpcHRvcihyZWNvcmQsIGJ1aWxkZXIpOworICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZURlc2NyaXB0b3IgPSBidWlsZGVyLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJvdXRlTmFtZShPYmplY3Qgcm91dGVPYmopIHsKKyAgICAgICAgICAgIC8vIFJvdXRlcyBzaG91bGQgbm90IGhhdmUgbnVsbCBuYW1lcyBidXQgaXQgbWF5IGhhcHBlbiBmb3IgYmFkbHkgY29uZmlndXJlZAorICAgICAgICAgICAgLy8gdXNlciByb3V0ZXMuICBXZSB0b2xlcmF0ZSB0aGlzIGJ5IHVzaW5nIGFuIGVtcHR5IG5hbWUgc3RyaW5nIGhlcmUgYnV0CisgICAgICAgICAgICAvLyBzdWNoIHVubmFtZWQgcm91dGVzIHdpbGwgYmUgZGlzY2FyZGVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgdXBzdHJlYW0KKyAgICAgICAgICAgIC8vICh3aXRoIGEgbG9nIG1lc3NhZ2Ugc28gd2UgY2FuIHRyYWNrIGRvd24gdGhlIHByb2JsZW0pLgorICAgICAgICAgICAgQ2hhclNlcXVlbmNlIG5hbWUgPSBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uZ2V0TmFtZShyb3V0ZU9iaiwgZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgICAgIHJldHVybiBuYW1lICE9IG51bGwgPyBuYW1lLnRvU3RyaW5nKCkgOiAiIjsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uQnVpbGRTeXN0ZW1Sb3V0ZURlc2NyaXB0b3IoU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkLAorICAgICAgICAgICAgICAgIE1lZGlhUm91dGVEZXNjcmlwdG9yLkJ1aWxkZXIgYnVpbGRlcikgeworICAgICAgICAgICAgaW50IHN1cHBvcnRlZFR5cGVzID0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLmdldFN1cHBvcnRlZFR5cGVzKAorICAgICAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlT2JqKTsKKyAgICAgICAgICAgIGlmICgoc3VwcG9ydGVkVHlwZXMgJiBNZWRpYVJvdXRlckplbGx5YmVhbi5ST1VURV9UWVBFX0xJVkVfQVVESU8pICE9IDApIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFkZENvbnRyb2xGaWx0ZXJzKExJVkVfQVVESU9fQ09OVFJPTF9GSUxURVJTKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoc3VwcG9ydGVkVHlwZXMgJiBNZWRpYVJvdXRlckplbGx5YmVhbi5ST1VURV9UWVBFX0xJVkVfVklERU8pICE9IDApIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFkZENvbnRyb2xGaWx0ZXJzKExJVkVfVklERU9fQ09OVFJPTF9GSUxURVJTKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnVpbGRlci5zZXRQbGF5YmFja1R5cGUoCisgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5nZXRQbGF5YmFja1R5cGUocmVjb3JkLm1Sb3V0ZU9iaikpOworICAgICAgICAgICAgYnVpbGRlci5zZXRQbGF5YmFja1N0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLmdldFBsYXliYWNrU3RyZWFtKHJlY29yZC5tUm91dGVPYmopKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0Vm9sdW1lKAorICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uZ2V0Vm9sdW1lKHJlY29yZC5tUm91dGVPYmopKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0Vm9sdW1lTWF4KAorICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uZ2V0Vm9sdW1lTWF4KHJlY29yZC5tUm91dGVPYmopKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0Vm9sdW1lSGFuZGxpbmcoCisgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5nZXRWb2x1bWVIYW5kbGluZyhyZWNvcmQubVJvdXRlT2JqKSk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVVc2VyUm91dGVQcm9wZXJ0aWVzKFVzZXJSb3V0ZVJlY29yZCByZWNvcmQpIHsKKyAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0TmFtZSgKKyAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZU9iaiwgcmVjb3JkLm1Sb3V0ZS5nZXROYW1lKCkpOworICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRQbGF5YmFja1R5cGUoCisgICAgICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGVPYmosIHJlY29yZC5tUm91dGUuZ2V0UGxheWJhY2tUeXBlKCkpOworICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRQbGF5YmFja1N0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZU9iaiwgcmVjb3JkLm1Sb3V0ZS5nZXRQbGF5YmFja1N0cmVhbSgpKTsKKyAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0Vm9sdW1lKAorICAgICAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlT2JqLCByZWNvcmQubVJvdXRlLmdldFZvbHVtZSgpKTsKKyAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0Vm9sdW1lTWF4KAorICAgICAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlT2JqLCByZWNvcmQubVJvdXRlLmdldFZvbHVtZU1heCgpKTsKKyAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0Vm9sdW1lSGFuZGxpbmcoCisgICAgICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGVPYmosIHJlY29yZC5tUm91dGUuZ2V0Vm9sdW1lSGFuZGxpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDYWxsYmFjaygpIHsKKyAgICAgICAgICAgIGlmIChtQ2FsbGJhY2tSZWdpc3RlcmVkKSB7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrUmVnaXN0ZXJlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLnJlbW92ZUNhbGxiYWNrKG1Sb3V0ZXJPYmosIG1DYWxsYmFja09iaik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtUm91dGVUeXBlcyAhPSAwKSB7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrUmVnaXN0ZXJlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uYWRkQ2FsbGJhY2sobVJvdXRlck9iaiwgbVJvdXRlVHlwZXMsIG1DYWxsYmFja09iaik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZUNhbGxiYWNrT2JqKCkgeworICAgICAgICAgICAgcmV0dXJuIE1lZGlhUm91dGVySmVsbHliZWFuLmNyZWF0ZUNhbGxiYWNrKHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVWb2x1bWVDYWxsYmFja09iaigpIHsKKyAgICAgICAgICAgIHJldHVybiBNZWRpYVJvdXRlckplbGx5YmVhbi5jcmVhdGVWb2x1bWVDYWxsYmFjayh0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHNlbGVjdFJvdXRlKE9iamVjdCByb3V0ZU9iaikgeworICAgICAgICAgICAgaWYgKG1TZWxlY3RSb3V0ZVdvcmthcm91bmQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1TZWxlY3RSb3V0ZVdvcmthcm91bmQgPSBuZXcgTWVkaWFSb3V0ZXJKZWxseWJlYW4uU2VsZWN0Um91dGVXb3JrYXJvdW5kKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU2VsZWN0Um91dGVXb3JrYXJvdW5kLnNlbGVjdFJvdXRlKG1Sb3V0ZXJPYmosCisgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLkFMTF9ST1VURV9UWVBFUywgcm91dGVPYmopOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0RGVmYXVsdFJvdXRlKCkgeworICAgICAgICAgICAgaWYgKG1HZXREZWZhdWx0Um91dGVXb3JrYXJvdW5kID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtR2V0RGVmYXVsdFJvdXRlV29ya2Fyb3VuZCA9IG5ldyBNZWRpYVJvdXRlckplbGx5YmVhbi5HZXREZWZhdWx0Um91dGVXb3JrYXJvdW5kKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbUdldERlZmF1bHRSb3V0ZVdvcmthcm91bmQuZ2V0RGVmYXVsdFJvdXRlKG1Sb3V0ZXJPYmopOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0U3lzdGVtUm91dGUoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7CisgICAgICAgICAgICBpZiAocm91dGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFN5c3RlbVJvdXRlUmVjb3JkQnlEZXNjcmlwdG9ySWQocm91dGUuZ2V0RGVzY3JpcHRvcklkKCkpOworICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaW5kZXgpLm1Sb3V0ZU9iajsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlcHJlc2VudHMgYSByb3V0ZSB0aGF0IGlzIHByb3ZpZGVkIGJ5IHRoZSBmcmFtZXdvcmsgbWVkaWEgcm91dGVyCisgICAgICAgICAqIGFuZCBwdWJsaXNoZWQgYnkgdGhpcyByb3V0ZSBwcm92aWRlciB0byB0aGUgc3VwcG9ydCBsaWJyYXJ5IG1lZGlhIHJvdXRlci4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2xhc3MgU3lzdGVtUm91dGVSZWNvcmQgeworICAgICAgICAgICAgcHVibGljIGZpbmFsIE9iamVjdCBtUm91dGVPYmo7CisgICAgICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIG1Sb3V0ZURlc2NyaXB0b3JJZDsKKyAgICAgICAgICAgIHB1YmxpYyBNZWRpYVJvdXRlRGVzY3JpcHRvciBtUm91dGVEZXNjcmlwdG9yOyAvLyBhc3NpZ25lZCBpbW1lZGlhdGVseSBhZnRlciBjcmVhdGlvbgorCisgICAgICAgICAgICBwdWJsaWMgU3lzdGVtUm91dGVSZWNvcmQoT2JqZWN0IHJvdXRlT2JqLCBTdHJpbmcgaWQpIHsKKyAgICAgICAgICAgICAgICBtUm91dGVPYmogPSByb3V0ZU9iajsKKyAgICAgICAgICAgICAgICBtUm91dGVEZXNjcmlwdG9ySWQgPSBpZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXByZXNlbnRzIGEgcm91dGUgdGhhdCBpcyBwcm92aWRlZCBieSB0aGUgc3VwcG9ydCBsaWJyYXJ5IG1lZGlhIHJvdXRlcgorICAgICAgICAgKiBhbmQgcHVibGlzaGVkIGJ5IHRoaXMgcm91dGUgcHJvdmlkZXIgdG8gdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIuCisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNsYXNzIFVzZXJSb3V0ZVJlY29yZCB7CisgICAgICAgICAgICBwdWJsaWMgZmluYWwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIG1Sb3V0ZTsKKyAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBPYmplY3QgbVJvdXRlT2JqOworCisgICAgICAgICAgICBwdWJsaWMgVXNlclJvdXRlUmVjb3JkKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSwgT2JqZWN0IHJvdXRlT2JqKSB7CisgICAgICAgICAgICAgICAgbVJvdXRlID0gcm91dGU7CisgICAgICAgICAgICAgICAgbVJvdXRlT2JqID0gcm91dGVPYmo7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNsYXNzIFN5c3RlbVJvdXRlQ29udHJvbGxlciBleHRlbmRzIFJvdXRlQ29udHJvbGxlciB7CisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtUm91dGVPYmo7CisKKyAgICAgICAgICAgIHB1YmxpYyBTeXN0ZW1Sb3V0ZUNvbnRyb2xsZXIoT2JqZWN0IHJvdXRlT2JqKSB7CisgICAgICAgICAgICAgICAgbVJvdXRlT2JqID0gcm91dGVPYmo7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25TZXRWb2x1bWUoaW50IHZvbHVtZSkgeworICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5yZXF1ZXN0U2V0Vm9sdW1lKG1Sb3V0ZU9iaiwgdm9sdW1lKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblVwZGF0ZVZvbHVtZShpbnQgZGVsdGEpIHsKKyAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8ucmVxdWVzdFVwZGF0ZVZvbHVtZShtUm91dGVPYmosIGRlbHRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEplbGx5YmVhbiBNUjEgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgLy8gQEBSZXF1aXJlc0FwaSgxNykKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBKZWxseWJlYW5NcjFJbXBsIGV4dGVuZHMgSmVsbHliZWFuSW1wbAorICAgICAgICAgICAgaW1wbGVtZW50cyBNZWRpYVJvdXRlckplbGx5YmVhbk1yMS5DYWxsYmFjayB7CisgICAgICAgIHByaXZhdGUgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuQWN0aXZlU2Nhbldvcmthcm91bmQgbUFjdGl2ZVNjYW5Xb3JrYXJvdW5kOworICAgICAgICBwcml2YXRlIE1lZGlhUm91dGVySmVsbHliZWFuTXIxLklzQ29ubmVjdGluZ1dvcmthcm91bmQgbUlzQ29ubmVjdGluZ1dvcmthcm91bmQ7CisKKyAgICAgICAgcHVibGljIEplbGx5YmVhbk1yMUltcGwoQ29udGV4dCBjb250ZXh0LCBTeW5jQ2FsbGJhY2sgc3luY0NhbGxiYWNrKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBzeW5jQ2FsbGJhY2spOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVQcmVzZW50YXRpb25EaXNwbGF5Q2hhbmdlZChPYmplY3Qgcm91dGVPYmopIHsKKyAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZChyb3V0ZU9iaik7CisgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgIFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCA9IG1TeXN0ZW1Sb3V0ZVJlY29yZHMuZ2V0KGluZGV4KTsKKyAgICAgICAgICAgICAgICBEaXNwbGF5IG5ld1ByZXNlbnRhdGlvbkRpc3BsYXkgPQorICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuUm91dGVJbmZvLmdldFByZXNlbnRhdGlvbkRpc3BsYXkocm91dGVPYmopOworICAgICAgICAgICAgICAgIGludCBuZXdQcmVzZW50YXRpb25EaXNwbGF5SWQgPSAobmV3UHJlc2VudGF0aW9uRGlzcGxheSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICA/IG5ld1ByZXNlbnRhdGlvbkRpc3BsYXkuZ2V0RGlzcGxheUlkKCkgOiAtMSk7CisgICAgICAgICAgICAgICAgaWYgKG5ld1ByZXNlbnRhdGlvbkRpc3BsYXlJZAorICAgICAgICAgICAgICAgICAgICAgICAgIT0gcmVjb3JkLm1Sb3V0ZURlc2NyaXB0b3IuZ2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZURlc2NyaXB0b3IgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNZWRpYVJvdXRlRGVzY3JpcHRvci5CdWlsZGVyKHJlY29yZC5tUm91dGVEZXNjcmlwdG9yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmVzZW50YXRpb25EaXNwbGF5SWQobmV3UHJlc2VudGF0aW9uRGlzcGxheUlkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICAgICAgICAgICAgICBwdWJsaXNoUm91dGVzKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uQnVpbGRTeXN0ZW1Sb3V0ZURlc2NyaXB0b3IoU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkLAorICAgICAgICAgICAgICAgIE1lZGlhUm91dGVEZXNjcmlwdG9yLkJ1aWxkZXIgYnVpbGRlcikgeworICAgICAgICAgICAgc3VwZXIub25CdWlsZFN5c3RlbVJvdXRlRGVzY3JpcHRvcihyZWNvcmQsIGJ1aWxkZXIpOworCisgICAgICAgICAgICBpZiAoIU1lZGlhUm91dGVySmVsbHliZWFuTXIxLlJvdXRlSW5mby5pc0VuYWJsZWQocmVjb3JkLm1Sb3V0ZU9iaikpIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyLnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaXNDb25uZWN0aW5nKHJlY29yZCkpIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyLnNldENvbm5lY3RpbmcodHJ1ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIERpc3BsYXkgcHJlc2VudGF0aW9uRGlzcGxheSA9CisgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuTXIxLlJvdXRlSW5mby5nZXRQcmVzZW50YXRpb25EaXNwbGF5KHJlY29yZC5tUm91dGVPYmopOworICAgICAgICAgICAgaWYgKHByZXNlbnRhdGlvbkRpc3BsYXkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKHByZXNlbnRhdGlvbkRpc3BsYXkuZ2V0RGlzcGxheUlkKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUNhbGxiYWNrKCkgeworICAgICAgICAgICAgc3VwZXIudXBkYXRlQ2FsbGJhY2soKTsKKworICAgICAgICAgICAgaWYgKG1BY3RpdmVTY2FuV29ya2Fyb3VuZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUFjdGl2ZVNjYW5Xb3JrYXJvdW5kID0gbmV3IE1lZGlhUm91dGVySmVsbHliZWFuTXIxLkFjdGl2ZVNjYW5Xb3JrYXJvdW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLCBnZXRIYW5kbGVyKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUFjdGl2ZVNjYW5Xb3JrYXJvdW5kLnNldEFjdGl2ZVNjYW5Sb3V0ZVR5cGVzKG1BY3RpdmVTY2FuID8gbVJvdXRlVHlwZXMgOiAwKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZUNhbGxiYWNrT2JqKCkgeworICAgICAgICAgICAgcmV0dXJuIE1lZGlhUm91dGVySmVsbHliZWFuTXIxLmNyZWF0ZUNhbGxiYWNrKHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNDb25uZWN0aW5nKFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCkgeworICAgICAgICAgICAgaWYgKG1Jc0Nvbm5lY3RpbmdXb3JrYXJvdW5kID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtSXNDb25uZWN0aW5nV29ya2Fyb3VuZCA9IG5ldyBNZWRpYVJvdXRlckplbGx5YmVhbk1yMS5Jc0Nvbm5lY3RpbmdXb3JrYXJvdW5kKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbUlzQ29ubmVjdGluZ1dvcmthcm91bmQuaXNDb25uZWN0aW5nKHJlY29yZC5tUm91dGVPYmopOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSmVsbHliZWFuIE1SMiBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICAvLyBAQFJlcXVpcmVzQXBpKDE4KQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEplbGx5YmVhbk1yMkltcGwgZXh0ZW5kcyBKZWxseWJlYW5NcjFJbXBsIHsKKyAgICAgICAgcHVibGljIEplbGx5YmVhbk1yMkltcGwoQ29udGV4dCBjb250ZXh0LCBTeW5jQ2FsbGJhY2sgc3luY0NhbGxiYWNrKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBzeW5jQ2FsbGJhY2spOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uQnVpbGRTeXN0ZW1Sb3V0ZURlc2NyaXB0b3IoU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkLAorICAgICAgICAgICAgICAgIE1lZGlhUm91dGVEZXNjcmlwdG9yLkJ1aWxkZXIgYnVpbGRlcikgeworICAgICAgICAgICAgc3VwZXIub25CdWlsZFN5c3RlbVJvdXRlRGVzY3JpcHRvcihyZWNvcmQsIGJ1aWxkZXIpOworCisgICAgICAgICAgICBDaGFyU2VxdWVuY2UgZGVzY3JpcHRpb24gPQorICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbk1yMi5Sb3V0ZUluZm8uZ2V0RGVzY3JpcHRpb24ocmVjb3JkLm1Sb3V0ZU9iaik7CisgICAgICAgICAgICBpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24udG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgc2VsZWN0Um91dGUoT2JqZWN0IHJvdXRlT2JqKSB7CisgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5zZWxlY3RSb3V0ZShtUm91dGVyT2JqLAorICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5BTExfUk9VVEVfVFlQRVMsIHJvdXRlT2JqKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldERlZmF1bHRSb3V0ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBNZWRpYVJvdXRlckplbGx5YmVhbk1yMi5nZXREZWZhdWx0Um91dGUobVJvdXRlck9iaik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlVXNlclJvdXRlUHJvcGVydGllcyhVc2VyUm91dGVSZWNvcmQgcmVjb3JkKSB7CisgICAgICAgICAgICBzdXBlci51cGRhdGVVc2VyUm91dGVQcm9wZXJ0aWVzKHJlY29yZCk7CisKKyAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuTXIyLlVzZXJSb3V0ZUluZm8uc2V0RGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGVPYmosIHJlY29yZC5tUm91dGUuZ2V0RGVzY3JpcHRpb24oKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2FsbGJhY2soKSB7CisgICAgICAgICAgICBpZiAobUNhbGxiYWNrUmVnaXN0ZXJlZCkgeworICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLnJlbW92ZUNhbGxiYWNrKG1Sb3V0ZXJPYmosIG1DYWxsYmFja09iaik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1DYWxsYmFja1JlZ2lzdGVyZWQgPSB0cnVlOworICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjIuYWRkQ2FsbGJhY2sobVJvdXRlck9iaiwgbVJvdXRlVHlwZXMsIG1DYWxsYmFja09iaiwKKyAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19VTkZJTFRFUkVEX0VWRU5UUworICAgICAgICAgICAgICAgICAgICB8IChtQWN0aXZlU2NhbiA/IE1lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTiA6IDApKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0Nvbm5lY3RpbmcoU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkKSB7CisgICAgICAgICAgICByZXR1cm4gTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjIuUm91dGVJbmZvLmlzQ29ubmVjdGluZyhyZWNvcmQubVJvdXRlT2JqKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFwaTI0IGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIC8vIEBAUmVxdWlyZXNBcGkoMjQpCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQXBpMjRJbXBsIGV4dGVuZHMgSmVsbHliZWFuTXIySW1wbCB7CisgICAgICAgIHB1YmxpYyBBcGkyNEltcGwoQ29udGV4dCBjb250ZXh0LCBTeW5jQ2FsbGJhY2sgc3luY0NhbGxiYWNrKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBzeW5jQ2FsbGJhY2spOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uQnVpbGRTeXN0ZW1Sb3V0ZURlc2NyaXB0b3IoU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVEZXNjcmlwdG9yLkJ1aWxkZXIgYnVpbGRlcikgeworICAgICAgICAgICAgc3VwZXIub25CdWlsZFN5c3RlbVJvdXRlRGVzY3JpcHRvcihyZWNvcmQsIGJ1aWxkZXIpOworCisgICAgICAgICAgICBidWlsZGVyLnNldERldmljZVR5cGUoTWVkaWFSb3V0ZXJBcGkyNC5Sb3V0ZUluZm8uZ2V0RGV2aWNlVHlwZShyZWNvcmQubVJvdXRlT2JqKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvcGFja2FnZS5odG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTJhYWYyCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDkgQEAKKzxodG1sPgorCis8Ym9keT4KKworPHA+Q29udGFpbnMgQVBJcyB0aGF0IGNvbnRyb2wgdGhlIHJvdXRpbmcgb2YgbWVkaWEgY2hhbm5lbHMgYW5kIHN0cmVhbXMgZnJvbSB0aGUgY3VycmVudCBkZXZpY2UKKyAgdG8gZXh0ZXJuYWwgc3BlYWtlcnMgYW5kIGRlc3RpbmF0aW9uIGRldmljZXMuPC9wPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9CYXNlTGF5b3V0LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9CYXNlTGF5b3V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI2NDcxZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L0Jhc2VMYXlvdXQuamF2YQpAQCAtMCwwICsxLDIxNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC53aWRnZXQ7CisKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlZpZXdHcm91cFByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwLkxheW91dFBhcmFtczsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwLk1hcmdpbkxheW91dFBhcmFtczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK3B1YmxpYyBjbGFzcyBCYXNlTGF5b3V0IGV4dGVuZHMgVmlld0dyb3VwSW1wbCB7CisgICAgcHJpdmF0ZSBmaW5hbCBWaWV3R3JvdXAgbUluc3RhbmNlOworICAgIHByaXZhdGUgZmluYWwgVmlld0dyb3VwUHJvdmlkZXIgbVN1cGVyUHJvdmlkZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBWaWV3R3JvdXBQcm92aWRlciBtUHJpdmF0ZVByb3ZpZGVyOworCisgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8Vmlldz4gbU1hdGNoUGFyZW50Q2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PD4oMSk7CisKKyAgICBwdWJsaWMgQmFzZUxheW91dChWaWV3R3JvdXAgaW5zdGFuY2UsCisgICAgICAgICAgICBWaWV3R3JvdXBQcm92aWRlciBzdXBlclByb3ZpZGVyLCBWaWV3R3JvdXBQcm92aWRlciBwcml2YXRlUHJvdmlkZXIpIHsKKyAgICAgICAgc3VwZXIoaW5zdGFuY2UsIHN1cGVyUHJvdmlkZXIsIHByaXZhdGVQcm92aWRlcik7CisgICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOworICAgICAgICBtU3VwZXJQcm92aWRlciA9IHN1cGVyUHJvdmlkZXI7CisgICAgICAgIG1Qcml2YXRlUHJvdmlkZXIgPSBwcml2YXRlUHJvdmlkZXI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY2hlY2tMYXlvdXRQYXJhbXNfaW1wbChMYXlvdXRQYXJhbXMgcCkgeworICAgICAgICByZXR1cm4gcCBpbnN0YW5jZW9mIE1hcmdpbkxheW91dFBhcmFtczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGF5b3V0UGFyYW1zIGdlbmVyYXRlRGVmYXVsdExheW91dFBhcmFtc19pbXBsKCkgeworICAgICAgICByZXR1cm4gbmV3IE1hcmdpbkxheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULCBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGF5b3V0UGFyYW1zIGdlbmVyYXRlTGF5b3V0UGFyYW1zX2ltcGwoQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHJldHVybiBuZXcgTWFyZ2luTGF5b3V0UGFyYW1zKG1JbnN0YW5jZS5nZXRDb250ZXh0KCksIGF0dHJzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGF5b3V0UGFyYW1zIGdlbmVyYXRlTGF5b3V0UGFyYW1zX2ltcGwoTGF5b3V0UGFyYW1zIGxwKSB7CisgICAgICAgIGlmIChscCBpbnN0YW5jZW9mIE1hcmdpbkxheW91dFBhcmFtcykgeworICAgICAgICAgICAgcmV0dXJuIGxwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgTWFyZ2luTGF5b3V0UGFyYW1zKGxwKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbk1lYXN1cmVfaW1wbChpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7CisgICAgICAgIGludCBjb3VudCA9IG1JbnN0YW5jZS5nZXRDaGlsZENvdW50KCk7CisKKyAgICAgICAgZmluYWwgYm9vbGVhbiBtZWFzdXJlTWF0Y2hQYXJlbnRDaGlsZHJlbiA9CisgICAgICAgICAgICAgICAgVmlldy5NZWFzdXJlU3BlYy5nZXRNb2RlKHdpZHRoTWVhc3VyZVNwZWMpICE9IFZpZXcuTWVhc3VyZVNwZWMuRVhBQ1RMWSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgVmlldy5NZWFzdXJlU3BlYy5nZXRNb2RlKGhlaWdodE1lYXN1cmVTcGVjKSAhPSBWaWV3Lk1lYXN1cmVTcGVjLkVYQUNUTFk7CisgICAgICAgIG1NYXRjaFBhcmVudENoaWxkcmVuLmNsZWFyKCk7CisKKyAgICAgICAgaW50IG1heEhlaWdodCA9IDA7CisgICAgICAgIGludCBtYXhXaWR0aCA9IDA7CisgICAgICAgIGludCBjaGlsZFN0YXRlID0gMDsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBtSW5zdGFuY2UuZ2V0Q2hpbGRBdChpKTsKKyAgICAgICAgICAgIGlmIChjaGlsZC5nZXRWaXNpYmlsaXR5KCkgIT0gVmlldy5HT05FKSB7CisgICAgICAgICAgICAgICAgbVByaXZhdGVQcm92aWRlci5tZWFzdXJlQ2hpbGRXaXRoTWFyZ2luc19pbXBsKAorICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQsIHdpZHRoTWVhc3VyZVNwZWMsIDAsIGhlaWdodE1lYXN1cmVTcGVjLCAwKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBNYXJnaW5MYXlvdXRQYXJhbXMgbHAgPSAoTWFyZ2luTGF5b3V0UGFyYW1zKSBjaGlsZC5nZXRMYXlvdXRQYXJhbXMoKTsKKyAgICAgICAgICAgICAgICBtYXhXaWR0aCA9IE1hdGgubWF4KG1heFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuZ2V0TWVhc3VyZWRXaWR0aCgpICsgbHAubGVmdE1hcmdpbiArIGxwLnJpZ2h0TWFyZ2luKTsKKyAgICAgICAgICAgICAgICBtYXhIZWlnaHQgPSBNYXRoLm1heChtYXhIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5nZXRNZWFzdXJlZEhlaWdodCgpICsgbHAudG9wTWFyZ2luICsgbHAuYm90dG9tTWFyZ2luKTsKKyAgICAgICAgICAgICAgICBjaGlsZFN0YXRlID0gY2hpbGRTdGF0ZSB8IGNoaWxkLmdldE1lYXN1cmVkU3RhdGUoKTsKKyAgICAgICAgICAgICAgICBpZiAobWVhc3VyZU1hdGNoUGFyZW50Q2hpbGRyZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxwLndpZHRoID09IExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC5oZWlnaHQgPT0gTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbU1hdGNoUGFyZW50Q2hpbGRyZW4uYWRkKGNoaWxkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEFjY291bnQgZm9yIHBhZGRpbmcgdG9vCisgICAgICAgIG1heFdpZHRoICs9IGdldFBhZGRpbmdMZWZ0V2l0aEZvcmVncm91bmQoKSArIGdldFBhZGRpbmdSaWdodFdpdGhGb3JlZ3JvdW5kKCk7CisgICAgICAgIG1heEhlaWdodCArPSBnZXRQYWRkaW5nVG9wV2l0aEZvcmVncm91bmQoKSArIGdldFBhZGRpbmdCb3R0b21XaXRoRm9yZWdyb3VuZCgpOworCisgICAgICAgIC8vIENoZWNrIGFnYWluc3Qgb3VyIG1pbmltdW0gaGVpZ2h0IGFuZCB3aWR0aAorICAgICAgICBtYXhIZWlnaHQgPSBNYXRoLm1heChtYXhIZWlnaHQsIG1Qcml2YXRlUHJvdmlkZXIuZ2V0U3VnZ2VzdGVkTWluaW11bUhlaWdodF9pbXBsKCkpOworICAgICAgICBtYXhXaWR0aCA9IE1hdGgubWF4KG1heFdpZHRoLCBtUHJpdmF0ZVByb3ZpZGVyLmdldFN1Z2dlc3RlZE1pbmltdW1XaWR0aF9pbXBsKCkpOworCisgICAgICAgIC8vIENoZWNrIGFnYWluc3Qgb3VyIGZvcmVncm91bmQncyBtaW5pbXVtIGhlaWdodCBhbmQgd2lkdGgKKyAgICAgICAgZmluYWwgRHJhd2FibGUgZHJhd2FibGUgPSBtSW5zdGFuY2UuZ2V0Rm9yZWdyb3VuZCgpOworICAgICAgICBpZiAoZHJhd2FibGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbWF4SGVpZ2h0ID0gTWF0aC5tYXgobWF4SGVpZ2h0LCBkcmF3YWJsZS5nZXRNaW5pbXVtSGVpZ2h0KCkpOworICAgICAgICAgICAgbWF4V2lkdGggPSBNYXRoLm1heChtYXhXaWR0aCwgZHJhd2FibGUuZ2V0TWluaW11bVdpZHRoKCkpOworICAgICAgICB9CisKKyAgICAgICAgbVByaXZhdGVQcm92aWRlci5zZXRNZWFzdXJlZERpbWVuc2lvbl9pbXBsKAorICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5yZXNvbHZlU2l6ZUFuZFN0YXRlKG1heFdpZHRoLCB3aWR0aE1lYXN1cmVTcGVjLCBjaGlsZFN0YXRlKSwKKyAgICAgICAgICAgICAgICBtSW5zdGFuY2UucmVzb2x2ZVNpemVBbmRTdGF0ZShtYXhIZWlnaHQsIGhlaWdodE1lYXN1cmVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRTdGF0ZSA8PCBWaWV3Lk1FQVNVUkVEX0hFSUdIVF9TVEFURV9TSElGVCkpOworCisgICAgICAgIGNvdW50ID0gbU1hdGNoUGFyZW50Q2hpbGRyZW4uc2l6ZSgpOworICAgICAgICBpZiAoY291bnQgPiAxKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gbU1hdGNoUGFyZW50Q2hpbGRyZW4uZ2V0KGkpOworICAgICAgICAgICAgICAgIGZpbmFsIE1hcmdpbkxheW91dFBhcmFtcyBscCA9IChNYXJnaW5MYXlvdXRQYXJhbXMpIGNoaWxkLmdldExheW91dFBhcmFtcygpOworCisgICAgICAgICAgICAgICAgZmluYWwgaW50IGNoaWxkV2lkdGhNZWFzdXJlU3BlYzsKKyAgICAgICAgICAgICAgICBpZiAobHAud2lkdGggPT0gTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgd2lkdGggPSBNYXRoLm1heCgwLCBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRXaWR0aCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBnZXRQYWRkaW5nTGVmdFdpdGhGb3JlZ3JvdW5kKCkgLSBnZXRQYWRkaW5nUmlnaHRXaXRoRm9yZWdyb3VuZCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBscC5sZWZ0TWFyZ2luIC0gbHAucmlnaHRNYXJnaW4pOworICAgICAgICAgICAgICAgICAgICBjaGlsZFdpZHRoTWVhc3VyZVNwZWMgPSBWaWV3Lk1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgVmlldy5NZWFzdXJlU3BlYy5FWEFDVExZKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjaGlsZFdpZHRoTWVhc3VyZVNwZWMgPSBtSW5zdGFuY2UuZ2V0Q2hpbGRNZWFzdXJlU3BlYyh3aWR0aE1lYXN1cmVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFBhZGRpbmdMZWZ0V2l0aEZvcmVncm91bmQoKSArIGdldFBhZGRpbmdSaWdodFdpdGhGb3JlZ3JvdW5kKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAubGVmdE1hcmdpbiArIGxwLnJpZ2h0TWFyZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLndpZHRoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY2hpbGRIZWlnaHRNZWFzdXJlU3BlYzsKKyAgICAgICAgICAgICAgICBpZiAobHAuaGVpZ2h0ID09IExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IE1hdGgubWF4KDAsIG1JbnN0YW5jZS5nZXRNZWFzdXJlZEhlaWdodCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBnZXRQYWRkaW5nVG9wV2l0aEZvcmVncm91bmQoKSAtIGdldFBhZGRpbmdCb3R0b21XaXRoRm9yZWdyb3VuZCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBscC50b3BNYXJnaW4gLSBscC5ib3R0b21NYXJnaW4pOworICAgICAgICAgICAgICAgICAgICBjaGlsZEhlaWdodE1lYXN1cmVTcGVjID0gVmlldy5NZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCBWaWV3Lk1lYXN1cmVTcGVjLkVYQUNUTFkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkSGVpZ2h0TWVhc3VyZVNwZWMgPSBtSW5zdGFuY2UuZ2V0Q2hpbGRNZWFzdXJlU3BlYyhoZWlnaHRNZWFzdXJlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQYWRkaW5nVG9wV2l0aEZvcmVncm91bmQoKSArIGdldFBhZGRpbmdCb3R0b21XaXRoRm9yZWdyb3VuZCgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLnRvcE1hcmdpbiArIGxwLmJvdHRvbU1hcmdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC5oZWlnaHQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNoaWxkLm1lYXN1cmUoY2hpbGRXaWR0aE1lYXN1cmVTcGVjLCBjaGlsZEhlaWdodE1lYXN1cmVTcGVjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uTGF5b3V0X2ltcGwoYm9vbGVhbiBjaGFuZ2VkLCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tKSB7CisgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1JbnN0YW5jZS5nZXRDaGlsZENvdW50KCk7CisKKyAgICAgICAgZmluYWwgaW50IHBhcmVudExlZnQgPSBnZXRQYWRkaW5nTGVmdFdpdGhGb3JlZ3JvdW5kKCk7CisgICAgICAgIGZpbmFsIGludCBwYXJlbnRSaWdodCA9IHJpZ2h0IC0gbGVmdCAtIGdldFBhZGRpbmdSaWdodFdpdGhGb3JlZ3JvdW5kKCk7CisKKyAgICAgICAgZmluYWwgaW50IHBhcmVudFRvcCA9IGdldFBhZGRpbmdUb3BXaXRoRm9yZWdyb3VuZCgpOworICAgICAgICBmaW5hbCBpbnQgcGFyZW50Qm90dG9tID0gYm90dG9tIC0gdG9wIC0gZ2V0UGFkZGluZ0JvdHRvbVdpdGhGb3JlZ3JvdW5kKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gbUluc3RhbmNlLmdldENoaWxkQXQoaSk7CisgICAgICAgICAgICBpZiAoY2hpbGQuZ2V0VmlzaWJpbGl0eSgpICE9IFZpZXcuR09ORSkgeworICAgICAgICAgICAgICAgIGZpbmFsIE1hcmdpbkxheW91dFBhcmFtcyBscCA9IChNYXJnaW5MYXlvdXRQYXJhbXMpIGNoaWxkLmdldExheW91dFBhcmFtcygpOworCisgICAgICAgICAgICAgICAgZmluYWwgaW50IHdpZHRoID0gY2hpbGQuZ2V0TWVhc3VyZWRXaWR0aCgpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBoZWlnaHQgPSBjaGlsZC5nZXRNZWFzdXJlZEhlaWdodCgpOworCisgICAgICAgICAgICAgICAgaW50IGNoaWxkTGVmdDsKKyAgICAgICAgICAgICAgICBpbnQgY2hpbGRUb3A7CisKKyAgICAgICAgICAgICAgICBjaGlsZExlZnQgPSBwYXJlbnRMZWZ0ICsgKHBhcmVudFJpZ2h0IC0gcGFyZW50TGVmdCAtIHdpZHRoKSAvIDIgKworICAgICAgICAgICAgICAgICAgICAgICAgbHAubGVmdE1hcmdpbiAtIGxwLnJpZ2h0TWFyZ2luOworCisgICAgICAgICAgICAgICAgY2hpbGRUb3AgPSBwYXJlbnRUb3AgKyAocGFyZW50Qm90dG9tIC0gcGFyZW50VG9wIC0gaGVpZ2h0KSAvIDIgKworICAgICAgICAgICAgICAgICAgICAgICAgbHAudG9wTWFyZ2luIC0gbHAuYm90dG9tTWFyZ2luOworCisgICAgICAgICAgICAgICAgY2hpbGQubGF5b3V0KGNoaWxkTGVmdCwgY2hpbGRUb3AsIGNoaWxkTGVmdCArIHdpZHRoLCBjaGlsZFRvcCArIGhlaWdodCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBzaG91bGREZWxheUNoaWxkUHJlc3NlZFN0YXRlX2ltcGwoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBnZXRQYWRkaW5nTGVmdFdpdGhGb3JlZ3JvdW5kKCkgeworICAgICAgICByZXR1cm4gbUluc3RhbmNlLmlzRm9yZWdyb3VuZEluc2lkZVBhZGRpbmcoKSA/IE1hdGgubWF4KG1JbnN0YW5jZS5nZXRQYWRkaW5nTGVmdCgpLCAwKSA6CisgICAgICAgICAgICAgICAgbUluc3RhbmNlLmdldFBhZGRpbmdMZWZ0KCkgKyAwOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldFBhZGRpbmdSaWdodFdpdGhGb3JlZ3JvdW5kKCkgeworICAgICAgICByZXR1cm4gbUluc3RhbmNlLmlzRm9yZWdyb3VuZEluc2lkZVBhZGRpbmcoKSA/IE1hdGgubWF4KG1JbnN0YW5jZS5nZXRQYWRkaW5nUmlnaHQoKSwgMCkgOgorICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5nZXRQYWRkaW5nUmlnaHQoKSArIDA7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZ2V0UGFkZGluZ1RvcFdpdGhGb3JlZ3JvdW5kKCkgeworICAgICAgICByZXR1cm4gbUluc3RhbmNlLmlzRm9yZWdyb3VuZEluc2lkZVBhZGRpbmcoKSA/IE1hdGgubWF4KG1JbnN0YW5jZS5nZXRQYWRkaW5nVG9wKCksIDApIDoKKyAgICAgICAgICAgICAgICBtSW5zdGFuY2UuZ2V0UGFkZGluZ1RvcCgpICsgMDsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBnZXRQYWRkaW5nQm90dG9tV2l0aEZvcmVncm91bmQoKSB7CisgICAgICAgIHJldHVybiBtSW5zdGFuY2UuaXNGb3JlZ3JvdW5kSW5zaWRlUGFkZGluZygpID8gTWF0aC5tYXgobUluc3RhbmNlLmdldFBhZGRpbmdCb3R0b20oKSwgMCkgOgorICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5nZXRQYWRkaW5nQm90dG9tKCkgKyAwOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L01lZGlhQ29udHJvbFZpZXcySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvTWVkaWFDb250cm9sVmlldzJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FmZjE1MAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L01lZGlhQ29udHJvbFZpZXcySW1wbC5qYXZhCkBAIC0wLDAgKzEsMTcyMiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC53aWRnZXQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvaW50OworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uTWVkaWFDb250cm9sbGVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5QbGF5YmFja1N0YXRlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYUNvbnRyb2xWaWV3MlByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlZpZXdHcm91cFByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CYXNlQWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VCdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5NZWRpYUNvbnRyb2xWaWV3MjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5Qcm9ncmVzc0JhcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5Qb3B1cFdpbmRvdzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5SZWxhdGl2ZUxheW91dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TZWVrQmFyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNlZWtCYXIuT25TZWVrQmFyQ2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuQXBpSGVscGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5SOworaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwLk1lZGlhUm91dGVCdXR0b247CitpbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVTZWxlY3RvcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuRm9ybWF0dGVyOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKK3B1YmxpYyBjbGFzcyBNZWRpYUNvbnRyb2xWaWV3MkltcGwgZXh0ZW5kcyBCYXNlTGF5b3V0IGltcGxlbWVudHMgTWVkaWFDb250cm9sVmlldzJQcm92aWRlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYUNvbnRyb2xWaWV3MiI7CisKKyAgICBwcml2YXRlIGZpbmFsIE1lZGlhQ29udHJvbFZpZXcyIG1JbnN0YW5jZTsKKworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJHVU1FTlRfS0VZX0ZVTExTQ1JFRU4gPSAiZnVsbFNjcmVlbiI7CisKKyAgICAvLyBUT0RPOiBNb3ZlIHRoZXNlIGNvbnN0YW50cyB0byBwdWJsaWMgYXBpIHRvIHN1cHBvcnQgY3VzdG9tIHZpZGVvIHZpZXcuCisgICAgLy8gVE9ETzogQ29tYmluZSB0aGVzZSBjb25zdGFudHMgaW50byBvbmUgcmVnYXJkaW5nIFRyYWNrSW5mby4KKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9WSURFT19UUkFDS19DT1VOVCA9ICJWaWRlb1RyYWNrQ291bnQiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FVRElPX1RSQUNLX0NPVU5UID0gIkF1ZGlvVHJhY2tDb3VudCI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU1VCVElUTEVfVFJBQ0tfQ09VTlQgPSAiU3VidGl0bGVUcmFja0NvdW50IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QTEFZQkFDS19TUEVFRCA9ICJQbGF5YmFja1NwZWVkIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TRUxFQ1RFRF9BVURJT19JTkRFWCA9ICJTZWxlY3RlZEF1ZGlvSW5kZXgiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NFTEVDVEVEX1NVQlRJVExFX0lOREVYID0gIlNlbGVjdGVkU3VidGl0bGVJbmRleCI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVF9VUERBVEVfVFJBQ0tfU1RBVFVTID0gIlVwZGF0ZVRyYWNrU3RhdHVzIjsKKworICAgIC8vIFRPRE86IFJlbW92ZSB0aGlzIG9uY2UgaW50ZWdyYXRpbmcgd2l0aCBNZWRpYVNlc3Npb24yICYgTWVkaWFNZXRhZGF0YTIKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TVEFURV9JU19BRFZFUlRJU0VNRU5UID0gIk1lZGlhVHlwZUFkdmVydGlzZW1lbnQiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlRfVVBEQVRFX01FRElBX1RZUEVfU1RBVFVTID0gIlVwZGF0ZU1lZGlhVHlwZVN0YXR1cyI7CisKKyAgICAvLyBTdHJpbmcgZm9yIHNlbmRpbmcgY29tbWFuZCB0byBzaG93IHN1YnRpdGxlIHRvIE1lZGlhU2Vzc2lvbi4KKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfU0hPV19TVUJUSVRMRSA9ICJzaG93U3VidGl0bGUiOworICAgIC8vIFN0cmluZyBmb3Igc2VuZGluZyBjb21tYW5kIHRvIGhpZGUgc3VidGl0bGUgdG8gTWVkaWFTZXNzaW9uLgorICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9ISURFX1NVQlRJVExFID0gImhpZGVTdWJ0aXRsZSI7CisgICAgLy8gVE9ETzogcmVtb3ZlIG9uY2UgdGhlIGltcGxlbWVudGF0aW9uIGlzIHJldmlzZWQKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX1NFVF9GVUxMU0NSRUVOID0gInNldEZ1bGxzY3JlZW4iOworICAgIC8vIFN0cmluZyBmb3Igc2VuZGluZyBjb21tYW5kIHRvIHNlbGVjdCBhdWRpbyB0cmFjayB0byBNZWRpYVNlc3Npb24uCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX1NFTEVDVF9BVURJT19UUkFDSyA9ICJTZWxlY3RUcmFjayI7CisgICAgLy8gU3RyaW5nIGZvciBzZW5kaW5nIGNvbW1hbmQgdG8gc2V0IHBsYXliYWNrIHNwZWVkIHRvIE1lZGlhU2Vzc2lvbi4KKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfU0VUX1BMQVlCQUNLX1NQRUVEID0gIlNldFBsYXliYWNrU3BlZWQiOworICAgIC8vIFN0cmluZyBmb3Igc2VuZGluZyBjb21tYW5kIHRvIG11dGUgYXVkaW8gdG8gTWVkaWFTZXNzaW9uLgorICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9NVVRFPSAiTXV0ZSI7CisgICAgLy8gU3RyaW5nIGZvciBzZW5kaW5nIGNvbW1hbmQgdG8gdW5tdXRlIGF1ZGlvIHRvIE1lZGlhU2Vzc2lvbi4KKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfVU5NVVRFID0gIlVubXV0ZSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VUVElOR1NfTU9ERV9BVURJT19UUkFDSyA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFVFRJTkdTX01PREVfUExBWUJBQ0tfU1BFRUQgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRVRUSU5HU19NT0RFX0hFTFAgPSAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRVRUSU5HU19NT0RFX1NVQlRJVExFX1RSQUNLID0gMzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VUVElOR1NfTU9ERV9WSURFT19RVUFMSVRZID0gNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VUVElOR1NfTU9ERV9NQUlOID0gNTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfU1BFRURfMXhfSU5ERVggPSAzOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FRElBX1RZUEVfREVGQVVMVCA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FRElBX1RZUEVfTVVTSUMgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRURJQV9UWVBFX0FEVkVSVElTRU1FTlQgPSAyOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWkVfVFlQRV9FTUJFRERFRCA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWkVfVFlQRV9GVUxMID0gMTsKKyAgICAvLyBUT0RPOiBhZGQgc3VwcG9ydCBmb3IgTWluaW1hbCBzaXplIHR5cGUuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWkVfVFlQRV9NSU5JTUFMID0gMjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfUFJPR1JFU1MgPSAxMDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1BST0dSRVNTX1VQREFURV9USU1FX01TID0gMTAwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVXSU5EX1RJTUVfTVMgPSAxMDAwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRk9SV0FSRF9USU1FX01TID0gMzAwMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFEX1NLSVBfV0FJVF9USU1FX01TID0gNTAwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVTT1VSQ0VfTk9OX0VYSVNURU5UID0gLTE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX0VNUFRZID0gIiI7CisKKyAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzb3VyY2VzOworICAgIHByaXZhdGUgTWVkaWFDb250cm9sbGVyIG1Db250cm9sbGVyOworICAgIHByaXZhdGUgTWVkaWFDb250cm9sbGVyLlRyYW5zcG9ydENvbnRyb2xzIG1Db250cm9sczsKKyAgICBwcml2YXRlIFBsYXliYWNrU3RhdGUgbVBsYXliYWNrU3RhdGU7CisgICAgcHJpdmF0ZSBNZWRpYU1ldGFkYXRhIG1NZXRhZGF0YTsKKyAgICBwcml2YXRlIGludCBtRHVyYXRpb247CisgICAgcHJpdmF0ZSBpbnQgbVByZXZTdGF0ZTsKKyAgICBwcml2YXRlIGludCBtUHJldldpZHRoOworICAgIHByaXZhdGUgaW50IG1QcmV2SGVpZ2h0OworICAgIHByaXZhdGUgaW50IG1PcmlnaW5hbExlZnRCYXJXaWR0aDsKKyAgICBwcml2YXRlIGludCBtVmlkZW9UcmFja0NvdW50OworICAgIHByaXZhdGUgaW50IG1BdWRpb1RyYWNrQ291bnQ7CisgICAgcHJpdmF0ZSBpbnQgbVN1YnRpdGxlVHJhY2tDb3VudDsKKyAgICBwcml2YXRlIGludCBtU2V0dGluZ3NNb2RlOworICAgIHByaXZhdGUgaW50IG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleDsKKyAgICBwcml2YXRlIGludCBtU2VsZWN0ZWRBdWRpb1RyYWNrSW5kZXg7CisgICAgcHJpdmF0ZSBpbnQgbVNlbGVjdGVkVmlkZW9RdWFsaXR5SW5kZXg7CisgICAgcHJpdmF0ZSBpbnQgbVNlbGVjdGVkU3BlZWRJbmRleDsKKyAgICBwcml2YXRlIGludCBtRW1iZWRkZWRTZXR0aW5nc0l0ZW1XaWR0aDsKKyAgICBwcml2YXRlIGludCBtRnVsbFNldHRpbmdzSXRlbVdpZHRoOworICAgIHByaXZhdGUgaW50IG1FbWJlZGRlZFNldHRpbmdzSXRlbUhlaWdodDsKKyAgICBwcml2YXRlIGludCBtRnVsbFNldHRpbmdzSXRlbUhlaWdodDsKKyAgICBwcml2YXRlIGludCBtU2V0dGluZ3NXaW5kb3dNYXJnaW47CisgICAgcHJpdmF0ZSBpbnQgbU1lZGlhVHlwZTsKKyAgICBwcml2YXRlIGludCBtU2l6ZVR5cGU7CisgICAgcHJpdmF0ZSBsb25nIG1QbGF5YmFja0FjdGlvbnM7CisgICAgcHJpdmF0ZSBib29sZWFuIG1EcmFnZ2luZzsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzRnVsbFNjcmVlbjsKKyAgICBwcml2YXRlIGJvb2xlYW4gbU92ZXJmbG93RXhwYW5kZWQ7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Jc1N0b3BwZWQ7CisgICAgcHJpdmF0ZSBib29sZWFuIG1TdWJ0aXRsZUlzRW5hYmxlZDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVNlZWtBdmFpbGFibGU7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Jc0FkdmVydGlzZW1lbnQ7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Jc011dGU7CisgICAgcHJpdmF0ZSBib29sZWFuIG1OZWVkVVhVcGRhdGU7CisKKyAgICAvLyBSZWxhdGluZyB0byBUaXRsZSBCYXIgVmlldworICAgIHByaXZhdGUgVmlld0dyb3VwIG1Sb290OworICAgIHByaXZhdGUgVmlldyBtVGl0bGVCYXI7CisgICAgcHJpdmF0ZSBUZXh0VmlldyBtVGl0bGVWaWV3OworICAgIHByaXZhdGUgVmlldyBtQWRFeHRlcm5hbExpbms7CisgICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtQmFja0J1dHRvbjsKKyAgICBwcml2YXRlIE1lZGlhUm91dGVCdXR0b24gbVJvdXRlQnV0dG9uOworICAgIHByaXZhdGUgTWVkaWFSb3V0ZVNlbGVjdG9yIG1Sb3V0ZVNlbGVjdG9yOworCisgICAgLy8gUmVsYXRpbmcgdG8gQ2VudGVyIFZpZXcKKyAgICBwcml2YXRlIFZpZXdHcm91cCBtQ2VudGVyVmlldzsKKyAgICBwcml2YXRlIFZpZXcgbVRyYW5zcG9ydENvbnRyb2xzOworICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbVBsYXlQYXVzZUJ1dHRvbjsKKyAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1GZndkQnV0dG9uOworICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbVJld0J1dHRvbjsKKyAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1OZXh0QnV0dG9uOworICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbVByZXZCdXR0b247CisKKyAgICAvLyBSZWxhdGluZyB0byBNaW5pbWFsIEV4dHJhIFZpZXcKKyAgICBwcml2YXRlIExpbmVhckxheW91dCBtTWluaW1hbEV4dHJhVmlldzsKKworICAgIC8vIFJlbGF0aW5nIHRvIFByb2dyZXNzIEJhciBWaWV3CisgICAgcHJpdmF0ZSBQcm9ncmVzc0JhciBtUHJvZ3Jlc3M7CisgICAgcHJpdmF0ZSBWaWV3IG1Qcm9ncmVzc0J1ZmZlcjsKKworICAgIC8vIFJlbGF0aW5nIHRvIEJvdHRvbSBCYXIgVmlldworICAgIHByaXZhdGUgVmlld0dyb3VwIG1Cb3R0b21CYXI7CisKKyAgICAvLyBSZWxhdGluZyB0byBCb3R0b20gQmFyIExlZnQgVmlldworICAgIHByaXZhdGUgVmlld0dyb3VwIG1Cb3R0b21CYXJMZWZ0VmlldzsKKyAgICBwcml2YXRlIFZpZXdHcm91cCBtVGltZVZpZXc7CisgICAgcHJpdmF0ZSBUZXh0VmlldyBtRW5kVGltZTsKKyAgICBwcml2YXRlIFRleHRWaWV3IG1DdXJyZW50VGltZTsKKyAgICBwcml2YXRlIFRleHRWaWV3IG1BZFNraXBWaWV3OworICAgIHByaXZhdGUgU3RyaW5nQnVpbGRlciBtRm9ybWF0QnVpbGRlcjsKKyAgICBwcml2YXRlIEZvcm1hdHRlciBtRm9ybWF0dGVyOworCisgICAgLy8gUmVsYXRpbmcgdG8gQm90dG9tIEJhciBSaWdodCBWaWV3CisgICAgcHJpdmF0ZSBWaWV3R3JvdXAgbUJvdHRvbUJhclJpZ2h0VmlldzsKKyAgICBwcml2YXRlIFZpZXdHcm91cCBtQmFzaWNDb250cm9sczsKKyAgICBwcml2YXRlIFZpZXdHcm91cCBtRXh0cmFDb250cm9sczsKKyAgICBwcml2YXRlIFZpZXdHcm91cCBtQ3VzdG9tQnV0dG9uczsKKyAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1TdWJ0aXRsZUJ1dHRvbjsKKyAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1GdWxsU2NyZWVuQnV0dG9uOworICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbU92ZXJmbG93QnV0dG9uUmlnaHQ7CisgICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtT3ZlcmZsb3dCdXR0b25MZWZ0OworICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbU11dGVCdXR0b247CisgICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtVmlkZW9RdWFsaXR5QnV0dG9uOworICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbVNldHRpbmdzQnV0dG9uOworICAgIHByaXZhdGUgVGV4dFZpZXcgbUFkUmVtYWluaW5nVmlldzsKKworICAgIC8vIFJlbGF0aW5nIHRvIFNldHRpbmdzIExpc3QgVmlldworICAgIHByaXZhdGUgTGlzdFZpZXcgbVNldHRpbmdzTGlzdFZpZXc7CisgICAgcHJpdmF0ZSBQb3B1cFdpbmRvdyBtU2V0dGluZ3NXaW5kb3c7CisgICAgcHJpdmF0ZSBTZXR0aW5nc0FkYXB0ZXIgbVNldHRpbmdzQWRhcHRlcjsKKyAgICBwcml2YXRlIFN1YlNldHRpbmdzQWRhcHRlciBtU3ViU2V0dGluZ3NBZGFwdGVyOworICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1TZXR0aW5nc01haW5UZXh0c0xpc3Q7CisgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVNldHRpbmdzU3ViVGV4dHNMaXN0OworICAgIHByaXZhdGUgTGlzdDxJbnRlZ2VyPiBtU2V0dGluZ3NJY29uSWRzTGlzdDsKKyAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtU3VidGl0bGVEZXNjcmlwdGlvbnNMaXN0OworICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1BdWRpb1RyYWNrTGlzdDsKKyAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtVmlkZW9RdWFsaXR5TGlzdDsKKyAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtUGxheWJhY2tTcGVlZFRleHRMaXN0OworICAgIHByaXZhdGUgTGlzdDxGbG9hdD4gbVBsYXliYWNrU3BlZWRMaXN0OworCisgICAgcHVibGljIE1lZGlhQ29udHJvbFZpZXcySW1wbChNZWRpYUNvbnRyb2xWaWV3MiBpbnN0YW5jZSwKKyAgICAgICAgICAgIFZpZXdHcm91cFByb3ZpZGVyIHN1cGVyUHJvdmlkZXIsIFZpZXdHcm91cFByb3ZpZGVyIHByaXZhdGVQcm92aWRlcikgeworICAgICAgICBzdXBlcihpbnN0YW5jZSwgc3VwZXJQcm92aWRlciwgcHJpdmF0ZVByb3ZpZGVyKTsKKyAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShATnVsbGFibGUgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyLCBpbnQgZGVmU3R5bGVSZXMpIHsKKyAgICAgICAgbVJlc291cmNlcyA9IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUluc3RhbmNlLmdldENvbnRleHQoKSk7CisgICAgICAgIC8vIEluZmxhdGUgTWVkaWFDb250cm9sVmlldzIgZnJvbSBYTUwKKyAgICAgICAgbVJvb3QgPSBtYWtlQ29udHJvbGxlclZpZXcoKTsKKyAgICAgICAgbUluc3RhbmNlLmFkZFZpZXcobVJvb3QpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhU2Vzc2lvblRva2VuX2ltcGwoU2Vzc2lvblRva2VuMiB0b2tlbikgeworICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldE9uRnVsbFNjcmVlbkxpc3RlbmVyX2ltcGwoTWVkaWFDb250cm9sVmlldzIuT25GdWxsU2NyZWVuTGlzdGVuZXIgbCkgeworICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldENvbnRyb2xsZXJfaW1wbChNZWRpYUNvbnRyb2xsZXIgY29udHJvbGxlcikgeworICAgICAgICBtQ29udHJvbGxlciA9IGNvbnRyb2xsZXI7CisgICAgICAgIGlmIChjb250cm9sbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Db250cm9scyA9IGNvbnRyb2xsZXIuZ2V0VHJhbnNwb3J0Q29udHJvbHMoKTsKKyAgICAgICAgICAgIC8vIFNldCBtTWV0YWRhdGEgYW5kIG1QbGF5YmFja1N0YXRlIHRvIGV4aXN0aW5nIE1lZGlhU2Vzc2lvbiB2YXJpYWJsZXMgc2luY2UgdGhleSBtYXkKKyAgICAgICAgICAgIC8vIGJlIGNhbGxlZCBiZWZvcmUgdGhlIGNhbGxiYWNrIGlzIGNhbGxlZAorICAgICAgICAgICAgbVBsYXliYWNrU3RhdGUgPSBtQ29udHJvbGxlci5nZXRQbGF5YmFja1N0YXRlKCk7CisgICAgICAgICAgICBtTWV0YWRhdGEgPSBtQ29udHJvbGxlci5nZXRNZXRhZGF0YSgpOworICAgICAgICAgICAgdXBkYXRlRHVyYXRpb24oKTsKKyAgICAgICAgICAgIHVwZGF0ZVRpdGxlKCk7CisKKyAgICAgICAgICAgIG1Db250cm9sbGVyLnJlZ2lzdGVyQ2FsbGJhY2sobmV3IE1lZGlhQ29udHJvbGxlckNhbGxiYWNrKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0QnV0dG9uVmlzaWJpbGl0eV9pbXBsKGludCBidXR0b24sIGludCB2aXNpYmlsaXR5KSB7CisgICAgICAgIC8vIFRPRE86IGFkZCBtZW1iZXIgdmFyaWFibGVzIGZvciBGYXN0LUZvcndhcmQvUHJ2aW91cy9SZXdpbmQgYnV0dG9ucyB0byBzYXZlIHZpc2liaWxpdHkgaW4KKyAgICAgICAgLy8gb3JkZXIgdG8gcHJldmVudCBiZWluZyBvdmVycmlkZW4gaW5zaWRlIHVwZGF0ZUxheW91dCgpLgorICAgICAgICBzd2l0Y2ggKGJ1dHRvbikgeworICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3Mi5CVVRUT05fUExBWV9QQVVTRToKKyAgICAgICAgICAgICAgICBpZiAobVBsYXlQYXVzZUJ1dHRvbiAhPSBudWxsICYmIGNhblBhdXNlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzIuQlVUVE9OX0ZGV0Q6CisgICAgICAgICAgICAgICAgaWYgKG1GZndkQnV0dG9uICE9IG51bGwgJiYgY2FuU2Vla0ZvcndhcmQoKSkgeworICAgICAgICAgICAgICAgICAgICBtRmZ3ZEJ1dHRvbi5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzIuQlVUVE9OX1JFVzoKKyAgICAgICAgICAgICAgICBpZiAobVJld0J1dHRvbiAhPSBudWxsICYmIGNhblNlZWtCYWNrd2FyZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1SZXdCdXR0b24uc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcyLkJVVFRPTl9ORVhUOgorICAgICAgICAgICAgICAgIGlmIChtTmV4dEJ1dHRvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1OZXh0QnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3Mi5CVVRUT05fUFJFVjoKKyAgICAgICAgICAgICAgICBpZiAobVByZXZCdXR0b24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtUHJldkJ1dHRvbi5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzIuQlVUVE9OX1NVQlRJVExFOgorICAgICAgICAgICAgICAgIGlmIChtU3VidGl0bGVCdXR0b24gIT0gbnVsbCAmJiBtU3VidGl0bGVUcmFja0NvdW50ID4gMCkgeworICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVCdXR0b24uc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcyLkJVVFRPTl9GVUxMX1NDUkVFTjoKKyAgICAgICAgICAgICAgICBpZiAobUZ1bGxTY3JlZW5CdXR0b24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbi5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzIuQlVUVE9OX09WRVJGTE9XOgorICAgICAgICAgICAgICAgIGlmIChtT3ZlcmZsb3dCdXR0b25SaWdodCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1PdmVyZmxvd0J1dHRvblJpZ2h0LnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3Mi5CVVRUT05fTVVURToKKyAgICAgICAgICAgICAgICBpZiAobU11dGVCdXR0b24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtTXV0ZUJ1dHRvbi5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzIuQlVUVE9OX1NFVFRJTkdTOgorICAgICAgICAgICAgICAgIGlmIChtU2V0dGluZ3NCdXR0b24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NCdXR0b24uc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVxdWVzdFBsYXlCdXR0b25Gb2N1c19pbXBsKCkgeworICAgICAgICBpZiAobVBsYXlQYXVzZUJ1dHRvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnJlcXVlc3RGb2N1cygpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRBY2Nlc3NpYmlsaXR5Q2xhc3NOYW1lX2ltcGwoKSB7CisgICAgICAgIHJldHVybiBNZWRpYUNvbnRyb2xWaWV3Mi5jbGFzcy5nZXROYW1lKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50X2ltcGwoTW90aW9uRXZlbnQgZXYpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFRPRE86IFNob3VsZCB0aGlzIGZ1bmN0aW9uIGJlIHJlbW92ZWQ/CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25UcmFja2JhbGxFdmVudF9pbXBsKE1vdGlvbkV2ZW50IGV2KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbk1lYXN1cmVfaW1wbChpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7CisgICAgICAgIHN1cGVyLm9uTWVhc3VyZV9pbXBsKHdpZHRoTWVhc3VyZVNwZWMsIGhlaWdodE1lYXN1cmVTcGVjKTsKKworICAgICAgICAvLyBVcGRhdGUgbGF5b3V0IHdoZW4gdGhpcyB2aWV3J3Mgd2lkdGggY2hhbmdlcyBpbiBvcmRlciB0byBhdm9pZCBhbnkgVUkgb3ZlcmxhcCBiZXR3ZWVuCisgICAgICAgIC8vIHRyYW5zcG9ydCBjb250cm9scy4KKyAgICAgICAgaWYgKG1QcmV2V2lkdGggIT0gbUluc3RhbmNlLmdldE1lYXN1cmVkV2lkdGgoKQorICAgICAgICAgICAgICAgIHx8IG1QcmV2SGVpZ2h0ICE9IG1JbnN0YW5jZS5nZXRNZWFzdXJlZEhlaWdodCgpIHx8IG1OZWVkVVhVcGRhdGUpIHsKKyAgICAgICAgICAgIC8vIERpc21pc3MgU2V0dGluZ3NXaW5kb3cgaWYgaXQgaXMgc2hvd2luZy4KKyAgICAgICAgICAgIG1TZXR0aW5nc1dpbmRvdy5kaXNtaXNzKCk7CisKKyAgICAgICAgICAgIC8vIFRoZXNlIHZpZXdzIG1heSBub3QgaGF2ZSBiZWVuIGluaXRpYWxpemVkIHlldC4KKyAgICAgICAgICAgIGlmIChtVHJhbnNwb3J0Q29udHJvbHMuZ2V0V2lkdGgoKSA9PSAwIHx8IG1UaW1lVmlldy5nZXRXaWR0aCgpID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBjdXJyV2lkdGggPSBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRXaWR0aCgpOworICAgICAgICAgICAgaW50IGN1cnJIZWlnaHQgPSBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKKyAgICAgICAgICAgIFdpbmRvd01hbmFnZXIgbWFuYWdlciA9IChXaW5kb3dNYW5hZ2VyKSBtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLmdldEFwcGxpY2F0aW9uQ29udGV4dCgpCisgICAgICAgICAgICAgICAgICAgIC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuV0lORE9XX1NFUlZJQ0UpOworICAgICAgICAgICAgUG9pbnQgc2NyZWVuU2l6ZSA9IG5ldyBQb2ludCgpOworICAgICAgICAgICAgbWFuYWdlci5nZXREZWZhdWx0RGlzcGxheSgpLmdldFNpemUoc2NyZWVuU2l6ZSk7CisgICAgICAgICAgICBpbnQgc2NyZWVuV2lkdGggPSBzY3JlZW5TaXplLng7CisgICAgICAgICAgICBpbnQgc2NyZWVuSGVpZ2h0ID0gc2NyZWVuU2l6ZS55OworICAgICAgICAgICAgaW50IGZ1bGxJY29uU2l6ZSA9IG1SZXNvdXJjZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKFIuZGltZW4ubWN2Ml9mdWxsX2ljb25fc2l6ZSk7CisgICAgICAgICAgICBpbnQgZW1iZWRkZWRJY29uU2l6ZSA9IG1SZXNvdXJjZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAorICAgICAgICAgICAgICAgICAgICBSLmRpbWVuLm1jdjJfZW1iZWRkZWRfaWNvbl9zaXplKTsKKyAgICAgICAgICAgIGludCBtYXJnaW5TaXplID0gbVJlc291cmNlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoUi5kaW1lbi5tY3YyX2ljb25fbWFyZ2luKTsKKworICAgICAgICAgICAgLy8gVE9ETzogYWRkIHN1cHBvcnQgZm9yIEFkdmVydGlzZW1lbnQgTW9kZS4KKyAgICAgICAgICAgIGlmIChtTWVkaWFUeXBlID09IE1FRElBX1RZUEVfREVGQVVMVCkgeworICAgICAgICAgICAgICAgIC8vIE1heCBudW1iZXIgb2YgaWNvbnMgaW5zaWRlIEJvdHRvbUJhclJpZ2h0VmlldyBmb3IgTXVzaWMgbW9kZSBpcyA0LgorICAgICAgICAgICAgICAgIGludCBtYXhJY29uQ291bnQgPSA0OworICAgICAgICAgICAgICAgIHVwZGF0ZUxheW91dChtYXhJY29uQ291bnQsIGZ1bGxJY29uU2l6ZSwgZW1iZWRkZWRJY29uU2l6ZSwgbWFyZ2luU2l6ZSwgY3VycldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgY3VyckhlaWdodCwgc2NyZWVuV2lkdGgsIHNjcmVlbkhlaWdodCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1NZWRpYVR5cGUgPT0gTUVESUFfVFlQRV9NVVNJQykgeworICAgICAgICAgICAgICAgIGlmIChtTmVlZFVYVXBkYXRlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE9uZS10aW1lIG9wZXJhdGlvbiBmb3IgTXVzaWMgbWVkaWEgdHlwZQorICAgICAgICAgICAgICAgICAgICBtQmFzaWNDb250cm9scy5yZW1vdmVWaWV3KG1NdXRlQnV0dG9uKTsKKyAgICAgICAgICAgICAgICAgICAgbUV4dHJhQ29udHJvbHMuYWRkVmlldyhtTXV0ZUJ1dHRvbiwgMCk7CisgICAgICAgICAgICAgICAgICAgIG1WaWRlb1F1YWxpdHlCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgICAgICAgICBpZiAobUZmd2RCdXR0b24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUZmd2RCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChtUmV3QnV0dG9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1SZXdCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1OZWVkVVhVcGRhdGUgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIC8vIE1heCBudW1iZXIgb2YgaWNvbnMgaW5zaWRlIEJvdHRvbUJhclJpZ2h0VmlldyBmb3IgTXVzaWMgbW9kZSBpcyAzLgorICAgICAgICAgICAgICAgIGludCBtYXhJY29uQ291bnQgPSAzOworICAgICAgICAgICAgICAgIHVwZGF0ZUxheW91dChtYXhJY29uQ291bnQsIGZ1bGxJY29uU2l6ZSwgZW1iZWRkZWRJY29uU2l6ZSwgbWFyZ2luU2l6ZSwgY3VycldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgY3VyckhlaWdodCwgc2NyZWVuV2lkdGgsIHNjcmVlbkhlaWdodCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUHJldldpZHRoID0gY3VycldpZHRoOworICAgICAgICAgICAgbVByZXZIZWlnaHQgPSBjdXJySGVpZ2h0OworICAgICAgICB9CisgICAgICAgIC8vIFRPRE86IG1vdmUgdGhpcyB0byBhIGRpZmZlcmVudCBsb2NhdGlvbi4KKyAgICAgICAgLy8gVXBkYXRlIHRpdGxlIGJhciBwYXJhbWV0ZXJzIGluIG9yZGVyIHRvIGF2b2lkIG92ZXJsYXAgYmV0d2VlbiB0aXRsZSB2aWV3IGFuZCB0aGUgcmlnaHQKKyAgICAgICAgLy8gc2lkZSBvZiB0aGUgdGl0bGUgYmFyLgorICAgICAgICB1cGRhdGVUaXRsZUJhckxheW91dCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZWRfaW1wbChib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgc3VwZXIuc2V0RW5hYmxlZF9pbXBsKGVuYWJsZWQpOworCisgICAgICAgIC8vIFRPRE86IE1lcmdlIHRoZSBiZWxvdyBjb2RlIHdpdGggZGlzYWJsZVVuc3VwcG9ydGVkQnV0dG9ucygpLgorICAgICAgICBpZiAobVBsYXlQYXVzZUJ1dHRvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1GZndkQnV0dG9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1GZndkQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1SZXdCdXR0b24gIT0gbnVsbCkgeworICAgICAgICAgICAgbVJld0J1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOworICAgICAgICB9CisgICAgICAgIGlmIChtTmV4dEJ1dHRvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBtTmV4dEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOworICAgICAgICB9CisgICAgICAgIGlmIChtUHJldkJ1dHRvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBtUHJldkJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOworICAgICAgICB9CisgICAgICAgIGlmIChtUHJvZ3Jlc3MgIT0gbnVsbCkgeworICAgICAgICAgICAgbVByb2dyZXNzLnNldEVuYWJsZWQoZW5hYmxlZCk7CisgICAgICAgIH0KKyAgICAgICAgZGlzYWJsZVVuc3VwcG9ydGVkQnV0dG9ucygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uVmlzaWJpbGl0eUFnZ3JlZ2F0ZWRfaW1wbChib29sZWFuIGlzVmlzaWJsZSkgeworICAgICAgICBzdXBlci5vblZpc2liaWxpdHlBZ2dyZWdhdGVkX2ltcGwoaXNWaXNpYmxlKTsKKworICAgICAgICBpZiAoaXNWaXNpYmxlKSB7CisgICAgICAgICAgICBkaXNhYmxlVW5zdXBwb3J0ZWRCdXR0b25zKCk7CisgICAgICAgICAgICBtSW5zdGFuY2UucmVtb3ZlQ2FsbGJhY2tzKG1VcGRhdGVQcm9ncmVzcyk7CisgICAgICAgICAgICBtSW5zdGFuY2UucG9zdChtVXBkYXRlUHJvZ3Jlc3MpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUluc3RhbmNlLnJlbW92ZUNhbGxiYWNrcyhtVXBkYXRlUHJvZ3Jlc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Um91dGVTZWxlY3RvcihNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgbVJvdXRlU2VsZWN0b3IgPSBzZWxlY3RvcjsKKyAgICAgICAgaWYgKG1Sb3V0ZVNlbGVjdG9yICE9IG51bGwgJiYgIW1Sb3V0ZVNlbGVjdG9yLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgbVJvdXRlQnV0dG9uLnNldFJvdXRlU2VsZWN0b3Ioc2VsZWN0b3IsIE1lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTik7CisgICAgICAgICAgICBtUm91dGVCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVJvdXRlQnV0dG9uLnNldFJvdXRlU2VsZWN0b3IoTWVkaWFSb3V0ZVNlbGVjdG9yLkVNUFRZKTsKKyAgICAgICAgICAgIG1Sb3V0ZUJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBQcm90ZWN0ZWQgb3IgcHJpdmF0ZSBtZXRob2RzCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNQbGF5aW5nKCkgeworICAgICAgICBpZiAobVBsYXliYWNrU3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1QbGF5YmFja1N0YXRlLmdldFN0YXRlKCkgPT0gUGxheWJhY2tTdGF0ZS5TVEFURV9QTEFZSU5HOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBnZXRDdXJyZW50UG9zaXRpb24oKSB7CisgICAgICAgIG1QbGF5YmFja1N0YXRlID0gbUNvbnRyb2xsZXIuZ2V0UGxheWJhY2tTdGF0ZSgpOworICAgICAgICBpZiAobVBsYXliYWNrU3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIChpbnQpIG1QbGF5YmFja1N0YXRlLmdldFBvc2l0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZ2V0QnVmZmVyUGVyY2VudGFnZSgpIHsKKyAgICAgICAgaWYgKG1EdXJhdGlvbiA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBtUGxheWJhY2tTdGF0ZSA9IG1Db250cm9sbGVyLmdldFBsYXliYWNrU3RhdGUoKTsKKyAgICAgICAgaWYgKG1QbGF5YmFja1N0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGxvbmcgYnVmZmVyZWRQb3MgPSBtUGxheWJhY2tTdGF0ZS5nZXRCdWZmZXJlZFBvc2l0aW9uKCk7CisgICAgICAgICAgICByZXR1cm4gKGJ1ZmZlcmVkUG9zID09IC0xKSA/IC0xIDogKGludCkgKGJ1ZmZlcmVkUG9zICogMTAwIC8gbUR1cmF0aW9uKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gY2FuUGF1c2UoKSB7CisgICAgICAgIGlmIChtUGxheWJhY2tTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gKG1QbGF5YmFja1N0YXRlLmdldEFjdGlvbnMoKSAmIFBsYXliYWNrU3RhdGUuQUNUSU9OX1BBVVNFKSAhPSAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBjYW5TZWVrQmFja3dhcmQoKSB7CisgICAgICAgIGlmIChtUGxheWJhY2tTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gKG1QbGF5YmFja1N0YXRlLmdldEFjdGlvbnMoKSAmIFBsYXliYWNrU3RhdGUuQUNUSU9OX1JFV0lORCkgIT0gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gY2FuU2Vla0ZvcndhcmQoKSB7CisgICAgICAgIGlmIChtUGxheWJhY2tTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gKG1QbGF5YmFja1N0YXRlLmdldEFjdGlvbnMoKSAmIFBsYXliYWNrU3RhdGUuQUNUSU9OX0ZBU1RfRk9SV0FSRCkgIT0gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgdGhlIHZpZXcgdGhhdCBob2xkcyB0aGUgd2lkZ2V0cyB0aGF0IGNvbnRyb2wgcGxheWJhY2suCisgICAgICogRGVyaXZlZCBjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIHRvIGNyZWF0ZSB0aGVpciBvd24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBjb250cm9sbGVyIHZpZXcuCisgICAgICogQGhpZGUgVGhpcyBkb2Vzbid0IHdvcmsgYXMgYWR2ZXJ0aXNlZAorICAgICAqLworICAgIHByb3RlY3RlZCBWaWV3R3JvdXAgbWFrZUNvbnRyb2xsZXJWaWV3KCkgeworICAgICAgICBWaWV3R3JvdXAgcm9vdCA9IChWaWV3R3JvdXApIEFwaUhlbHBlci5pbmZsYXRlTGliTGF5b3V0KG1JbnN0YW5jZS5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgUi5sYXlvdXQubWVkaWFfY29udHJvbGxlcik7CisgICAgICAgIGluaXRDb250cm9sbGVyVmlldyhyb290KTsKKyAgICAgICAgcmV0dXJuIHJvb3Q7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRDb250cm9sbGVyVmlldyhWaWV3R3JvdXAgdikgeworICAgICAgICAvLyBSZWxhdGluZyB0byBUaXRsZSBCYXIgVmlldworICAgICAgICBtVGl0bGVCYXIgPSB2LmZpbmRWaWV3QnlJZChSLmlkLnRpdGxlX2Jhcik7CisgICAgICAgIG1UaXRsZVZpZXcgPSB2LmZpbmRWaWV3QnlJZChSLmlkLnRpdGxlX3RleHQpOworICAgICAgICBtQWRFeHRlcm5hbExpbmsgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmFkX2V4dGVybmFsX2xpbmspOworICAgICAgICBtQmFja0J1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQuYmFjayk7CisgICAgICAgIGlmIChtQmFja0J1dHRvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBtQmFja0J1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobUJhY2tMaXN0ZW5lcik7CisgICAgICAgICAgICBtQmFja0J1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgIH0KKyAgICAgICAgbVJvdXRlQnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC5jYXN0KTsKKworICAgICAgICAvLyBSZWxhdGluZyB0byBDZW50ZXIgVmlldworICAgICAgICBtQ2VudGVyVmlldyA9IHYuZmluZFZpZXdCeUlkKFIuaWQuY2VudGVyX3ZpZXcpOworICAgICAgICBtVHJhbnNwb3J0Q29udHJvbHMgPSBpbmZsYXRlVHJhbnNwb3J0Q29udHJvbHMoUi5sYXlvdXQuZW1iZWRkZWRfdHJhbnNwb3J0X2NvbnRyb2xzKTsKKyAgICAgICAgbUNlbnRlclZpZXcuYWRkVmlldyhtVHJhbnNwb3J0Q29udHJvbHMpOworCisgICAgICAgIC8vIFJlbGF0aW5nIHRvIE1pbmltYWwgRXh0cmEgVmlldworICAgICAgICBtTWluaW1hbEV4dHJhVmlldyA9IChMaW5lYXJMYXlvdXQpIHYuZmluZFZpZXdCeUlkKFIuaWQubWluaW1hbF9leHRyYV92aWV3KTsKKyAgICAgICAgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcyBwYXJhbXMgPQorICAgICAgICAgICAgICAgIChMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zKSBtTWluaW1hbEV4dHJhVmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKKyAgICAgICAgaW50IGljb25TaXplID0gbVJlc291cmNlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoUi5kaW1lbi5tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZSk7CisgICAgICAgIGludCBtYXJnaW5TaXplID0gbVJlc291cmNlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoUi5kaW1lbi5tY3YyX2ljb25fbWFyZ2luKTsKKyAgICAgICAgcGFyYW1zLnNldE1hcmdpbnMoMCwgKGljb25TaXplICsgbWFyZ2luU2l6ZSAqIDIpICogKC0xKSwgMCwgMCk7CisgICAgICAgIG1NaW5pbWFsRXh0cmFWaWV3LnNldExheW91dFBhcmFtcyhwYXJhbXMpOworICAgICAgICBtTWluaW1hbEV4dHJhVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisKKyAgICAgICAgLy8gUmVsYXRpbmcgdG8gUHJvZ3Jlc3MgQmFyIFZpZXcKKyAgICAgICAgbVByb2dyZXNzID0gdi5maW5kVmlld0J5SWQoUi5pZC5wcm9ncmVzcyk7CisgICAgICAgIGlmIChtUHJvZ3Jlc3MgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG1Qcm9ncmVzcyBpbnN0YW5jZW9mIFNlZWtCYXIpIHsKKyAgICAgICAgICAgICAgICBTZWVrQmFyIHNlZWtlciA9IChTZWVrQmFyKSBtUHJvZ3Jlc3M7CisgICAgICAgICAgICAgICAgc2Vla2VyLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKG1TZWVrTGlzdGVuZXIpOworICAgICAgICAgICAgICAgIHNlZWtlci5zZXRQcm9ncmVzc0RyYXdhYmxlKG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5jdXN0b21fcHJvZ3Jlc3MpKTsKKyAgICAgICAgICAgICAgICBzZWVrZXIuc2V0VGh1bWIobVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmN1c3RvbV9wcm9ncmVzc190aHVtYikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVByb2dyZXNzLnNldE1heChNQVhfUFJPR1JFU1MpOworICAgICAgICB9CisgICAgICAgIG1Qcm9ncmVzc0J1ZmZlciA9IHYuZmluZFZpZXdCeUlkKFIuaWQucHJvZ3Jlc3NfYnVmZmVyKTsKKworICAgICAgICAvLyBSZWxhdGluZyB0byBCb3R0b20gQmFyIFZpZXcKKyAgICAgICAgbUJvdHRvbUJhciA9IHYuZmluZFZpZXdCeUlkKFIuaWQuYm90dG9tX2Jhcik7CisKKyAgICAgICAgLy8gUmVsYXRpbmcgdG8gQm90dG9tIEJhciBMZWZ0IFZpZXcKKyAgICAgICAgbUJvdHRvbUJhckxlZnRWaWV3ID0gdi5maW5kVmlld0J5SWQoUi5pZC5ib3R0b21fYmFyX2xlZnQpOworICAgICAgICBtVGltZVZpZXcgPSB2LmZpbmRWaWV3QnlJZChSLmlkLnRpbWUpOworICAgICAgICBtRW5kVGltZSA9IHYuZmluZFZpZXdCeUlkKFIuaWQudGltZV9lbmQpOworICAgICAgICBtQ3VycmVudFRpbWUgPSB2LmZpbmRWaWV3QnlJZChSLmlkLnRpbWVfY3VycmVudCk7CisgICAgICAgIG1BZFNraXBWaWV3ID0gdi5maW5kVmlld0J5SWQoUi5pZC5hZF9za2lwX3RpbWUpOworICAgICAgICBtRm9ybWF0QnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIG1Gb3JtYXR0ZXIgPSBuZXcgRm9ybWF0dGVyKG1Gb3JtYXRCdWlsZGVyLCBMb2NhbGUuZ2V0RGVmYXVsdCgpKTsKKworICAgICAgICAvLyBSZWxhdGluZyB0byBCb3R0b20gQmFyIFJpZ2h0IFZpZXcKKyAgICAgICAgbUJvdHRvbUJhclJpZ2h0VmlldyA9IHYuZmluZFZpZXdCeUlkKFIuaWQuYm90dG9tX2Jhcl9yaWdodCk7CisgICAgICAgIG1CYXNpY0NvbnRyb2xzID0gdi5maW5kVmlld0J5SWQoUi5pZC5iYXNpY19jb250cm9scyk7CisgICAgICAgIG1FeHRyYUNvbnRyb2xzID0gdi5maW5kVmlld0J5SWQoUi5pZC5leHRyYV9jb250cm9scyk7CisgICAgICAgIG1DdXN0b21CdXR0b25zID0gdi5maW5kVmlld0J5SWQoUi5pZC5jdXN0b21fYnV0dG9ucyk7CisgICAgICAgIG1TdWJ0aXRsZUJ1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQuc3VidGl0bGUpOworICAgICAgICBpZiAobVN1YnRpdGxlQnV0dG9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TdWJ0aXRsZUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobVN1YnRpdGxlTGlzdGVuZXIpOworICAgICAgICB9CisgICAgICAgIG1GdWxsU2NyZWVuQnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC5mdWxsc2NyZWVuKTsKKyAgICAgICAgaWYgKG1GdWxsU2NyZWVuQnV0dG9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1GdWxsU2NyZWVuQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtRnVsbFNjcmVlbkxpc3RlbmVyKTsKKyAgICAgICAgICAgIC8vIFRPRE86IFNob3cgRnVsbHNjcmVlbiBidXR0b24gd2hlbiBvbmx5IGl0IGlzIHBvc3NpYmxlLgorICAgICAgICB9CisgICAgICAgIG1PdmVyZmxvd0J1dHRvblJpZ2h0ID0gdi5maW5kVmlld0J5SWQoUi5pZC5vdmVyZmxvd19yaWdodCk7CisgICAgICAgIGlmIChtT3ZlcmZsb3dCdXR0b25SaWdodCAhPSBudWxsKSB7CisgICAgICAgICAgICBtT3ZlcmZsb3dCdXR0b25SaWdodC5zZXRPbkNsaWNrTGlzdGVuZXIobU92ZXJmbG93UmlnaHRMaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICAgICAgbU92ZXJmbG93QnV0dG9uTGVmdCA9IHYuZmluZFZpZXdCeUlkKFIuaWQub3ZlcmZsb3dfbGVmdCk7CisgICAgICAgIGlmIChtT3ZlcmZsb3dCdXR0b25MZWZ0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1PdmVyZmxvd0J1dHRvbkxlZnQuc2V0T25DbGlja0xpc3RlbmVyKG1PdmVyZmxvd0xlZnRMaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICAgICAgbU11dGVCdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLm11dGUpOworICAgICAgICBpZiAobU11dGVCdXR0b24gIT0gbnVsbCkgeworICAgICAgICAgICAgbU11dGVCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1NdXRlQnV0dG9uTGlzdGVuZXIpOworICAgICAgICB9CisgICAgICAgIG1TZXR0aW5nc0J1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQuc2V0dGluZ3MpOworICAgICAgICBpZiAobVNldHRpbmdzQnV0dG9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TZXR0aW5nc0J1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobVNldHRpbmdzQnV0dG9uTGlzdGVuZXIpOworICAgICAgICB9CisgICAgICAgIG1WaWRlb1F1YWxpdHlCdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLnZpZGVvX3F1YWxpdHkpOworICAgICAgICBpZiAobVZpZGVvUXVhbGl0eUJ1dHRvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBtVmlkZW9RdWFsaXR5QnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtVmlkZW9RdWFsaXR5TGlzdGVuZXIpOworICAgICAgICB9CisgICAgICAgIG1BZFJlbWFpbmluZ1ZpZXcgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmFkX3JlbWFpbmluZyk7CisKKyAgICAgICAgLy8gUmVsYXRpbmcgdG8gU2V0dGluZ3MgTGlzdCBWaWV3CisgICAgICAgIGluaXRpYWxpemVTZXR0aW5nc0xpc3RzKCk7CisgICAgICAgIG1TZXR0aW5nc0xpc3RWaWV3ID0gKExpc3RWaWV3KSBBcGlIZWxwZXIuaW5mbGF0ZUxpYkxheW91dChtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgIFIubGF5b3V0LnNldHRpbmdzX2xpc3QpOworICAgICAgICBtU2V0dGluZ3NBZGFwdGVyID0gbmV3IFNldHRpbmdzQWRhcHRlcihtU2V0dGluZ3NNYWluVGV4dHNMaXN0LCBtU2V0dGluZ3NTdWJUZXh0c0xpc3QsCisgICAgICAgICAgICAgICAgbVNldHRpbmdzSWNvbklkc0xpc3QpOworICAgICAgICBtU3ViU2V0dGluZ3NBZGFwdGVyID0gbmV3IFN1YlNldHRpbmdzQWRhcHRlcihudWxsLCAwKTsKKyAgICAgICAgbVNldHRpbmdzTGlzdFZpZXcuc2V0QWRhcHRlcihtU2V0dGluZ3NBZGFwdGVyKTsKKyAgICAgICAgbVNldHRpbmdzTGlzdFZpZXcuc2V0Q2hvaWNlTW9kZShMaXN0Vmlldy5DSE9JQ0VfTU9ERV9TSU5HTEUpOworICAgICAgICBtU2V0dGluZ3NMaXN0Vmlldy5zZXRPbkl0ZW1DbGlja0xpc3RlbmVyKG1TZXR0aW5nc0l0ZW1DbGlja0xpc3RlbmVyKTsKKworICAgICAgICBtRW1iZWRkZWRTZXR0aW5nc0l0ZW1XaWR0aCA9IG1SZXNvdXJjZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAorICAgICAgICAgICAgICAgIFIuZGltZW4ubWN2Ml9lbWJlZGRlZF9zZXR0aW5nc193aWR0aCk7CisgICAgICAgIG1GdWxsU2V0dGluZ3NJdGVtV2lkdGggPSBtUmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZShSLmRpbWVuLm1jdjJfZnVsbF9zZXR0aW5nc193aWR0aCk7CisgICAgICAgIG1FbWJlZGRlZFNldHRpbmdzSXRlbUhlaWdodCA9IG1SZXNvdXJjZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAorICAgICAgICAgICAgICAgIFIuZGltZW4ubWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19oZWlnaHQpOworICAgICAgICBtRnVsbFNldHRpbmdzSXRlbUhlaWdodCA9IG1SZXNvdXJjZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAorICAgICAgICAgICAgICAgIFIuZGltZW4ubWN2Ml9mdWxsX3NldHRpbmdzX2hlaWdodCk7CisgICAgICAgIG1TZXR0aW5nc1dpbmRvd01hcmdpbiA9ICgtMSkgKiBtUmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKKyAgICAgICAgICAgICAgICBSLmRpbWVuLm1jdjJfc2V0dGluZ3Nfb2Zmc2V0KTsKKyAgICAgICAgbVNldHRpbmdzV2luZG93ID0gbmV3IFBvcHVwV2luZG93KG1TZXR0aW5nc0xpc3RWaWV3LCBtRW1iZWRkZWRTZXR0aW5nc0l0ZW1XaWR0aCwKKyAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGlzYWJsZSBwYXVzZSBvciBzZWVrIGJ1dHRvbnMgaWYgdGhlIHN0cmVhbSBjYW5ub3QgYmUgcGF1c2VkIG9yIHNlZWtlZC4KKyAgICAgKiBUaGlzIHJlcXVpcmVzIHRoZSBjb250cm9sIGludGVyZmFjZSB0byBiZSBhIE1lZGlhUGxheWVyQ29udHJvbEV4dAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBkaXNhYmxlVW5zdXBwb3J0ZWRCdXR0b25zKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKG1QbGF5UGF1c2VCdXR0b24gIT0gbnVsbCAmJiAhY2FuUGF1c2UoKSkgeworICAgICAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVJld0J1dHRvbiAhPSBudWxsICYmICFjYW5TZWVrQmFja3dhcmQoKSkgeworICAgICAgICAgICAgICAgIG1SZXdCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUZmd2RCdXR0b24gIT0gbnVsbCAmJiAhY2FuU2Vla0ZvcndhcmQoKSkgeworICAgICAgICAgICAgICAgIG1GZndkQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gVE9ETyBXaGF0IHdlIHJlYWxseSBzaG91bGQgZG8gaXMgYWRkIGEgY2FuU2VlayB0byB0aGUgTWVkaWFQbGF5ZXJDb250cm9sIGludGVyZmFjZTsKKyAgICAgICAgICAgIC8vIHRoaXMgc2NoZW1lIGNhbiBicmVhayB0aGUgY2FzZSB3aGVuIGFwcGxpY2F0aW9ucyB3YW50IHRvIGFsbG93IHNlZWsgdGhyb3VnaCB0aGUKKyAgICAgICAgICAgIC8vIHByb2dyZXNzIGJhciBidXQgZGlzYWJsZSBmb3J3YXJkL2JhY2t3YXJkIGJ1dHRvbnMuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSG93ZXZlciwgY3VycmVudGx5IHRoZSBmbGFncyBTRUVLX0JBQ0tXQVJEX0FWQUlMQUJMRSwgU0VFS19GT1JXQVJEX0FWQUlMQUJMRSwKKyAgICAgICAgICAgIC8vIGFuZCBTRUVLX0FWQUlMQUJMRSBhcmUgYWxsICh1bilzZXQgdG9nZXRoZXI7IGFzIHN1Y2ggdGhlIGFmb3JlbWVudGlvbmVkIGlzc3VlCisgICAgICAgICAgICAvLyBzaG91bGRuJ3QgYXJpc2UgaW4gZXhpc3RpbmcgYXBwbGljYXRpb25zLgorICAgICAgICAgICAgaWYgKG1Qcm9ncmVzcyAhPSBudWxsICYmICFjYW5TZWVrQmFja3dhcmQoKSAmJiAhY2FuU2Vla0ZvcndhcmQoKSkgeworICAgICAgICAgICAgICAgIG1Qcm9ncmVzcy5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSW5jb21wYXRpYmxlQ2xhc3NDaGFuZ2VFcnJvciBleCkgeworICAgICAgICAgICAgLy8gV2Ugd2VyZSBnaXZlbiBhbiBvbGQgdmVyc2lvbiBvZiB0aGUgaW50ZXJmYWNlLCB0aGF0IGRvZXNuJ3QgaGF2ZQorICAgICAgICAgICAgLy8gdGhlIGNhblBhdXNlL2NhblNlZWtYWVogbWV0aG9kcy4gVGhpcyBpcyBPSywgaXQganVzdCBtZWFucyB3ZQorICAgICAgICAgICAgLy8gYXNzdW1lIHRoZSBtZWRpYSBjYW4gYmUgcGF1c2VkIGFuZCBzZWVrZWQsIGFuZCBzbyB3ZSBkb24ndCBkaXNhYmxlCisgICAgICAgICAgICAvLyB0aGUgYnV0dG9ucy4KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgUnVubmFibGUgbVVwZGF0ZVByb2dyZXNzID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgaW50IHBvcyA9IHNldFByb2dyZXNzKCk7CisgICAgICAgICAgICBib29sZWFuIGlzU2hvd2luZyA9IG1JbnN0YW5jZS5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFOworICAgICAgICAgICAgaWYgKCFtRHJhZ2dpbmcgJiYgaXNTaG93aW5nICYmIGlzUGxheWluZygpKSB7CisgICAgICAgICAgICAgICAgbUluc3RhbmNlLnBvc3REZWxheWVkKG1VcGRhdGVQcm9ncmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUFJPR1JFU1NfVVBEQVRFX1RJTUVfTVMgLSAocG9zICUgREVGQVVMVF9QUk9HUkVTU19VUERBVEVfVElNRV9NUykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgU3RyaW5nIHN0cmluZ0ZvclRpbWUoaW50IHRpbWVNcykgeworICAgICAgICBpbnQgdG90YWxTZWNvbmRzID0gdGltZU1zIC8gMTAwMDsKKworICAgICAgICBpbnQgc2Vjb25kcyA9IHRvdGFsU2Vjb25kcyAlIDYwOworICAgICAgICBpbnQgbWludXRlcyA9ICh0b3RhbFNlY29uZHMgLyA2MCkgJSA2MDsKKyAgICAgICAgaW50IGhvdXJzID0gdG90YWxTZWNvbmRzIC8gMzYwMDsKKworICAgICAgICBtRm9ybWF0QnVpbGRlci5zZXRMZW5ndGgoMCk7CisgICAgICAgIGlmIChob3VycyA+IDApIHsKKyAgICAgICAgICAgIHJldHVybiBtRm9ybWF0dGVyLmZvcm1hdCgiJWQ6JTAyZDolMDJkIiwgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMpLnRvU3RyaW5nKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbUZvcm1hdHRlci5mb3JtYXQoIiUwMmQ6JTAyZCIsIG1pbnV0ZXMsIHNlY29uZHMpLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGludCBzZXRQcm9ncmVzcygpIHsKKyAgICAgICAgaWYgKG1Db250cm9sbGVyID09IG51bGwgfHwgbURyYWdnaW5nKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpbnQgcG9zaXRpb25PblByb2dyZXNzQmFyID0gMDsKKyAgICAgICAgaW50IGN1cnJlbnRQb3NpdGlvbiA9IGdldEN1cnJlbnRQb3NpdGlvbigpOworICAgICAgICBpZiAobUR1cmF0aW9uID4gMCkgeworICAgICAgICAgICAgcG9zaXRpb25PblByb2dyZXNzQmFyID0gKGludCkgKE1BWF9QUk9HUkVTUyAqIChsb25nKSBjdXJyZW50UG9zaXRpb24gLyBtRHVyYXRpb24pOworICAgICAgICB9CisgICAgICAgIGlmIChtUHJvZ3Jlc3MgIT0gbnVsbCAmJiBjdXJyZW50UG9zaXRpb24gIT0gbUR1cmF0aW9uKSB7CisgICAgICAgICAgICBtUHJvZ3Jlc3Muc2V0UHJvZ3Jlc3MocG9zaXRpb25PblByb2dyZXNzQmFyKTsKKyAgICAgICAgICAgIC8vIElmIHRoZSBtZWRpYSBpcyBhIGxvY2FsIGZpbGUsIHRoZXJlIGlzIG5vIG5lZWQgdG8gc2V0IGEgYnVmZmVyLCBzbyBzZXQgc2Vjb25kYXJ5CisgICAgICAgICAgICAvLyBwcm9ncmVzcyB0byBtYXhpbXVtLgorICAgICAgICAgICAgaWYgKGdldEJ1ZmZlclBlcmNlbnRhZ2UoKSA8IDApIHsKKyAgICAgICAgICAgICAgICBtUHJvZ3Jlc3Muc2V0U2Vjb25kYXJ5UHJvZ3Jlc3MoTUFYX1BST0dSRVNTKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVByb2dyZXNzLnNldFNlY29uZGFyeVByb2dyZXNzKGdldEJ1ZmZlclBlcmNlbnRhZ2UoKSAqIDEwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRW5kVGltZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtRW5kVGltZS5zZXRUZXh0KHN0cmluZ0ZvclRpbWUobUR1cmF0aW9uKSk7CisKKyAgICAgICAgfQorICAgICAgICBpZiAobUN1cnJlbnRUaW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1DdXJyZW50VGltZS5zZXRUZXh0KHN0cmluZ0ZvclRpbWUoY3VycmVudFBvc2l0aW9uKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUlzQWR2ZXJ0aXNlbWVudCkgeworICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSByZW1haW5pbmcgbnVtYmVyIG9mIHNlY29uZHMgdW50aWwgdGhlIGZpcnN0IDUgc2Vjb25kcyBvZiB0aGUKKyAgICAgICAgICAgIC8vIGFkdmVydGlzZW1lbnQuCisgICAgICAgICAgICBpZiAobUFkU2tpcFZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChjdXJyZW50UG9zaXRpb24gPD0gQURfU0tJUF9XQUlUX1RJTUVfTVMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1BZFNraXBWaWV3LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LkdPTkUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BZFNraXBWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2tpcFRpbWVUZXh0ID0gbVJlc291cmNlcy5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuTWVkaWFDb250cm9sVmlldzJfYWRfc2tpcF93YWl0X3RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBRF9TS0lQX1dBSVRfVElNRV9NUyAtIGN1cnJlbnRQb3NpdGlvbikgLyAxMDAwICsgMSkpOworICAgICAgICAgICAgICAgICAgICBtQWRTa2lwVmlldy5zZXRUZXh0KHNraXBUaW1lVGV4dCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1BZFNraXBWaWV3LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BZFNraXBWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1OZXh0QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtTmV4dEJ1dHRvbi5jbGVhckNvbG9yRmlsdGVyKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHJlbWFpbmluZyBudW1iZXIgb2Ygc2Vjb25kcyBvZiB0aGUgYWR2ZXJ0aXNlbWVudC4KKyAgICAgICAgICAgIGlmIChtQWRSZW1haW5pbmdWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnQgcmVtYWluaW5nVGltZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAobUR1cmF0aW9uIC0gY3VycmVudFBvc2l0aW9uIDwgMCkgPyAwIDogKG1EdXJhdGlvbiAtIGN1cnJlbnRQb3NpdGlvbik7CisgICAgICAgICAgICAgICAgU3RyaW5nIHJlbWFpbmluZ1RpbWVUZXh0ID0gbVJlc291cmNlcy5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5NZWRpYUNvbnRyb2xWaWV3Ml9hZF9yZW1haW5pbmdfdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ0ZvclRpbWUocmVtYWluaW5nVGltZSkpOworICAgICAgICAgICAgICAgIG1BZFJlbWFpbmluZ1ZpZXcuc2V0VGV4dChyZW1haW5pbmdUaW1lVGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnRQb3NpdGlvbjsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdG9nZ2xlUGF1c2VQbGF5U3RhdGUoKSB7CisgICAgICAgIGlmIChpc1BsYXlpbmcoKSkgeworICAgICAgICAgICAgbUNvbnRyb2xzLnBhdXNlKCk7CisgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCisgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19wbGF5X2NpcmNsZV9maWxsZWQsIG51bGwpKTsKKyAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX3BsYXlfYnV0dG9uX2Rlc2MpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Db250cm9scy5wbGF5KCk7CisgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCisgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19wYXVzZV9jaXJjbGVfZmlsbGVkLCBudWxsKSk7CisgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9wYXVzZV9idXR0b25fZGVzYykpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGhlcmUgYXJlIHR3byBzY2VuYXJpb3MgdGhhdCBjYW4gdHJpZ2dlciB0aGUgc2Vla2JhciBsaXN0ZW5lciB0byB0cmlnZ2VyOgorICAgIC8vCisgICAgLy8gVGhlIGZpcnN0IGlzIHRoZSB1c2VyIHVzaW5nIHRoZSB0b3VjaHBhZCB0byBhZGp1c3QgdGhlIHBvc2l0aXRvbiBvZiB0aGUKKyAgICAvLyBzZWVrYmFyJ3MgdGh1bWIuIEluIHRoaXMgY2FzZSBvblN0YXJ0VHJhY2tpbmdUb3VjaCBpcyBjYWxsZWQgZm9sbG93ZWQgYnkKKyAgICAvLyBhIG51bWJlciBvZiBvblByb2dyZXNzQ2hhbmdlZCBub3RpZmljYXRpb25zLCBjb25jbHVkZWQgYnkgb25TdG9wVHJhY2tpbmdUb3VjaC4KKyAgICAvLyBXZSdyZSBzZXR0aW5nIHRoZSBmaWVsZCAibURyYWdnaW5nIiB0byB0cnVlIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGRyYWdnaW5nCisgICAgLy8gc2Vzc2lvbiB0byBhdm9pZCBqdW1wcyBpbiB0aGUgcG9zaXRpb24gaW4gY2FzZSBvZiBvbmdvaW5nIHBsYXliYWNrLgorICAgIC8vCisgICAgLy8gVGhlIHNlY29uZCBzY2VuYXJpbyBpbnZvbHZlcyB0aGUgdXNlciBvcGVyYXRpbmcgdGhlIHNjcm9sbCBiYWxsLCBpbiB0aGlzCisgICAgLy8gY2FzZSB0aGVyZSBXT04nVCBCRSBvblN0YXJ0VHJhY2tpbmdUb3VjaC9vblN0b3BUcmFja2luZ1RvdWNoIG5vdGlmaWNhdGlvbnMsCisgICAgLy8gd2Ugd2lsbCBzaW1wbHkgYXBwbHkgdGhlIHVwZGF0ZWQgcG9zaXRpb24gd2l0aG91dCBzdXNwZW5kaW5nIHJlZ3VsYXIgdXBkYXRlcy4KKyAgICBwcml2YXRlIGZpbmFsIE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyIG1TZWVrTGlzdGVuZXIgPSBuZXcgT25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0VHJhY2tpbmdUb3VjaChTZWVrQmFyIGJhcikgeworICAgICAgICAgICAgaWYgKCFtU2Vla0F2YWlsYWJsZSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbURyYWdnaW5nID0gdHJ1ZTsKKworICAgICAgICAgICAgLy8gQnkgcmVtb3ZpbmcgdGhlc2UgcGVuZGluZyBwcm9ncmVzcyBtZXNzYWdlcyB3ZSBtYWtlIHN1cmUKKyAgICAgICAgICAgIC8vIHRoYXQgYSkgd2Ugd29uJ3QgdXBkYXRlIHRoZSBwcm9ncmVzcyB3aGlsZSB0aGUgdXNlciBhZGp1c3RzCisgICAgICAgICAgICAvLyB0aGUgc2Vla2JhciBhbmQgYikgb25jZSB0aGUgdXNlciBpcyBkb25lIGRyYWdnaW5nIHRoZSB0aHVtYgorICAgICAgICAgICAgLy8gd2Ugd2lsbCBwb3N0IG9uZSBvZiB0aGVzZSBtZXNzYWdlcyB0byB0aGUgcXVldWUgYWdhaW4gYW5kCisgICAgICAgICAgICAvLyB0aGlzIGVuc3VyZXMgdGhhdCB0aGVyZSB3aWxsIGJlIGV4YWN0bHkgb25lIG1lc3NhZ2UgcXVldWVkIHVwLgorICAgICAgICAgICAgbUluc3RhbmNlLnJlbW92ZUNhbGxiYWNrcyhtVXBkYXRlUHJvZ3Jlc3MpOworCisgICAgICAgICAgICAvLyBDaGVjayBpZiBwbGF5YmFjayBpcyBjdXJyZW50bHkgc3RvcHBlZC4gSW4gdGhpcyBjYXNlLCB1cGRhdGUgdGhlIHBhdXNlIGJ1dHRvbiB0bworICAgICAgICAgICAgLy8gc2hvdyB0aGUgcGxheSBpbWFnZSBpbnN0ZWFkIG9mIHRoZSByZXBsYXkgaW1hZ2UuCisgICAgICAgICAgICBpZiAobUlzU3RvcHBlZCkgeworICAgICAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19wbGF5X2NpcmNsZV9maWxsZWQsIG51bGwpKTsKKyAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfcGxheV9idXR0b25fZGVzYykpOworICAgICAgICAgICAgICAgIG1Jc1N0b3BwZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblByb2dyZXNzQ2hhbmdlZChTZWVrQmFyIGJhciwgaW50IHByb2dyZXNzLCBib29sZWFuIGZyb21Vc2VyKSB7CisgICAgICAgICAgICBpZiAoIW1TZWVrQXZhaWxhYmxlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFmcm9tVXNlcikgeworICAgICAgICAgICAgICAgIC8vIFdlJ3JlIG5vdCBpbnRlcmVzdGVkIGluIHByb2dyYW1tYXRpY2FsbHkgZ2VuZXJhdGVkIGNoYW5nZXMgdG8KKyAgICAgICAgICAgICAgICAvLyB0aGUgcHJvZ3Jlc3MgYmFyJ3MgcG9zaXRpb24uCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1EdXJhdGlvbiA+IDApIHsKKyAgICAgICAgICAgICAgICBpbnQgcG9zaXRpb24gPSAoaW50KSAoKChsb25nKSBtRHVyYXRpb24gKiBwcm9ncmVzcykgLyBNQVhfUFJPR1JFU1MpOworICAgICAgICAgICAgICAgIG1Db250cm9scy5zZWVrVG8ocG9zaXRpb24pOworCisgICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50VGltZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VGltZS5zZXRUZXh0KHN0cmluZ0ZvclRpbWUocG9zaXRpb24pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TdG9wVHJhY2tpbmdUb3VjaChTZWVrQmFyIGJhcikgeworICAgICAgICAgICAgaWYgKCFtU2Vla0F2YWlsYWJsZSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1EcmFnZ2luZyA9IGZhbHNlOworCisgICAgICAgICAgICBzZXRQcm9ncmVzcygpOworCisgICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCBwcm9ncmVzcyBpcyBwcm9wZXJseSB1cGRhdGVkIGluIHRoZSBmdXR1cmUsCisgICAgICAgICAgICAvLyB0aGUgY2FsbCB0byBzaG93KCkgZG9lcyBub3QgZ3VhcmFudGVlIHRoaXMgYmVjYXVzZSBpdCBpcyBhCisgICAgICAgICAgICAvLyBuby1vcCBpZiB3ZSBhcmUgYWxyZWFkeSBzaG93aW5nLgorICAgICAgICAgICAgbUluc3RhbmNlLnBvc3QobVVwZGF0ZVByb2dyZXNzKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1QbGF5UGF1c2VMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICB0b2dnbGVQYXVzZVBsYXlTdGF0ZSgpOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbVJld0xpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgIGludCBwb3MgPSBnZXRDdXJyZW50UG9zaXRpb24oKSAtIFJFV0lORF9USU1FX01TOworICAgICAgICAgICAgbUNvbnRyb2xzLnNlZWtUbyhwb3MpOworICAgICAgICAgICAgc2V0UHJvZ3Jlc3MoKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1GZndkTGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgaW50IHBvcyA9IGdldEN1cnJlbnRQb3NpdGlvbigpICsgRk9SV0FSRF9USU1FX01TOworICAgICAgICAgICAgbUNvbnRyb2xzLnNlZWtUbyhwb3MpOworICAgICAgICAgICAgc2V0UHJvZ3Jlc3MoKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1OZXh0TGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgbUNvbnRyb2xzLnNraXBUb05leHQoKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1QcmV2TGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgbUNvbnRyb2xzLnNraXBUb1ByZXZpb3VzKCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtQmFja0xpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IGltcGxlbWVudAorICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbVN1YnRpdGxlTGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgbVNldHRpbmdzTW9kZSA9IFNFVFRJTkdTX01PREVfU1VCVElUTEVfVFJBQ0s7CisgICAgICAgICAgICBtU3ViU2V0dGluZ3NBZGFwdGVyLnNldFRleHRzKG1TdWJ0aXRsZURlc2NyaXB0aW9uc0xpc3QpOworICAgICAgICAgICAgbVN1YlNldHRpbmdzQWRhcHRlci5zZXRDaGVja1Bvc2l0aW9uKG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCk7CisgICAgICAgICAgICBkaXNwbGF5U2V0dGluZ3NXaW5kb3cobVN1YlNldHRpbmdzQWRhcHRlcik7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtVmlkZW9RdWFsaXR5TGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgbVNldHRpbmdzTW9kZSA9IFNFVFRJTkdTX01PREVfVklERU9fUVVBTElUWTsKKyAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuc2V0VGV4dHMobVZpZGVvUXVhbGl0eUxpc3QpOworICAgICAgICAgICAgbVN1YlNldHRpbmdzQWRhcHRlci5zZXRDaGVja1Bvc2l0aW9uKG1TZWxlY3RlZFZpZGVvUXVhbGl0eUluZGV4KTsKKyAgICAgICAgICAgIGRpc3BsYXlTZXR0aW5nc1dpbmRvdyhtU3ViU2V0dGluZ3NBZGFwdGVyKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1GdWxsU2NyZWVuTGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc0VudGVyaW5nRnVsbFNjcmVlbiA9ICFtSXNGdWxsU2NyZWVuOworICAgICAgICAgICAgLy8gVE9ETzogUmUtYXJyYW5nZSB0aGUgYnV0dG9uIGxheW91dHMgYWNjb3JkaW5nIHRvIHRoZSBVWC4KKyAgICAgICAgICAgIGlmIChpc0VudGVyaW5nRnVsbFNjcmVlbikgeworICAgICAgICAgICAgICAgIG1GdWxsU2NyZWVuQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCisgICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfZnVsbHNjcmVlbl9leGl0LCBudWxsKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1GdWxsU2NyZWVuQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCisgICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfZnVsbHNjcmVlbiwgbnVsbCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQnVuZGxlIGFyZ3MgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICBhcmdzLnB1dEJvb2xlYW4oQVJHVU1FTlRfS0VZX0ZVTExTQ1JFRU4sIGlzRW50ZXJpbmdGdWxsU2NyZWVuKTsKKyAgICAgICAgICAgIG1Db250cm9sbGVyLnNlbmRDb21tYW5kKENPTU1BTkRfU0VUX0ZVTExTQ1JFRU4sIGFyZ3MsIG51bGwpOworCisgICAgICAgICAgICBtSXNGdWxsU2NyZWVuID0gaXNFbnRlcmluZ0Z1bGxTY3JlZW47CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtT3ZlcmZsb3dSaWdodExpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgIG1CYXNpY0NvbnRyb2xzLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgIG1FeHRyYUNvbnRyb2xzLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1PdmVyZmxvd0xlZnRMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICBtQmFzaWNDb250cm9scy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtRXh0cmFDb250cm9scy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtTXV0ZUJ1dHRvbkxpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgIGlmICghbUlzTXV0ZSkgeworICAgICAgICAgICAgICAgIG1NdXRlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCisgICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfbXV0ZSwgbnVsbCkpOworICAgICAgICAgICAgICAgIG1NdXRlQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfbXV0ZWRfYnV0dG9uX2Rlc2MpKTsKKyAgICAgICAgICAgICAgICBtSXNNdXRlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtQ29udHJvbGxlci5zZW5kQ29tbWFuZChDT01NQU5EX01VVEUsIG51bGwsIG51bGwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtTXV0ZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAorICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX3VubXV0ZSwgbnVsbCkpOworICAgICAgICAgICAgICAgIG1NdXRlQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfdW5tdXRlZF9idXR0b25fZGVzYykpOworICAgICAgICAgICAgICAgIG1Jc011dGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBtQ29udHJvbGxlci5zZW5kQ29tbWFuZChDT01NQU5EX1VOTVVURSwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtU2V0dGluZ3NCdXR0b25MaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICBtU2V0dGluZ3NNb2RlID0gU0VUVElOR1NfTU9ERV9NQUlOOworICAgICAgICAgICAgbVNldHRpbmdzQWRhcHRlci5zZXRTdWJUZXh0cyhtU2V0dGluZ3NTdWJUZXh0c0xpc3QpOworICAgICAgICAgICAgZGlzcGxheVNldHRpbmdzV2luZG93KG1TZXR0aW5nc0FkYXB0ZXIpOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgZmluYWwgQWRhcHRlclZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lciBtU2V0dGluZ3NJdGVtQ2xpY2tMaXN0ZW5lcgorICAgICAgICAgICAgPSBuZXcgQWRhcHRlclZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbUNsaWNrKEFkYXB0ZXJWaWV3PD8+IHBhcmVudCwgVmlldyB2aWV3LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgICAgIHN3aXRjaCAobVNldHRpbmdzTW9kZSkgeworICAgICAgICAgICAgICAgIGNhc2UgU0VUVElOR1NfTU9ERV9NQUlOOgorICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPT0gU0VUVElOR1NfTU9ERV9BVURJT19UUkFDSykgeworICAgICAgICAgICAgICAgICAgICAgICAgbVN1YlNldHRpbmdzQWRhcHRlci5zZXRUZXh0cyhtQXVkaW9UcmFja0xpc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgbVN1YlNldHRpbmdzQWRhcHRlci5zZXRDaGVja1Bvc2l0aW9uKG1TZWxlY3RlZEF1ZGlvVHJhY2tJbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NNb2RlID0gU0VUVElOR1NfTU9ERV9BVURJT19UUkFDSzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA9PSBTRVRUSU5HU19NT0RFX1BMQVlCQUNLX1NQRUVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3ViU2V0dGluZ3NBZGFwdGVyLnNldFRleHRzKG1QbGF5YmFja1NwZWVkVGV4dExpc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgbVN1YlNldHRpbmdzQWRhcHRlci5zZXRDaGVja1Bvc2l0aW9uKG1TZWxlY3RlZFNwZWVkSW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzTW9kZSA9IFNFVFRJTkdTX01PREVfUExBWUJBQ0tfU1BFRUQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gPT0gU0VUVElOR1NfTU9ERV9IRUxQKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc1dpbmRvdy5kaXNtaXNzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZGlzcGxheVNldHRpbmdzV2luZG93KG1TdWJTZXR0aW5nc0FkYXB0ZXIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNFVFRJTkdTX01PREVfQVVESU9fVFJBQ0s6CisgICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiAhPSBtU2VsZWN0ZWRBdWRpb1RyYWNrSW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZEF1ZGlvVHJhY2tJbmRleCA9IHBvc2l0aW9uOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1BdWRpb1RyYWNrQ291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVuZGxlIGV4dHJhID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhLnB1dEludChLRVlfU0VMRUNURURfQVVESU9fSU5ERVgsIHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udHJvbGxlci5zZW5kQ29tbWFuZChDT01NQU5EX1NFTEVDVF9BVURJT19UUkFDSywgZXh0cmEsIG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzU3ViVGV4dHNMaXN0LnNldChTRVRUSU5HU19NT0RFX0FVRElPX1RSQUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3ViU2V0dGluZ3NBZGFwdGVyLmdldE1haW5UZXh0KHBvc2l0aW9uKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzV2luZG93LmRpc21pc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTRVRUSU5HU19NT0RFX1BMQVlCQUNLX1NQRUVEOgorICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gIT0gbVNlbGVjdGVkU3BlZWRJbmRleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkU3BlZWRJbmRleCA9IHBvc2l0aW9uOworICAgICAgICAgICAgICAgICAgICAgICAgQnVuZGxlIGV4dHJhID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmEucHV0RmxvYXQoS0VZX1BMQVlCQUNLX1NQRUVELCBtUGxheWJhY2tTcGVlZExpc3QuZ2V0KHBvc2l0aW9uKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ29udHJvbGxlci5zZW5kQ29tbWFuZChDT01NQU5EX1NFVF9QTEFZQkFDS19TUEVFRCwgZXh0cmEsIG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzU3ViVGV4dHNMaXN0LnNldChTRVRUSU5HU19NT0RFX1BMQVlCQUNLX1NQRUVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3ViU2V0dGluZ3NBZGFwdGVyLmdldE1haW5UZXh0KHBvc2l0aW9uKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzV2luZG93LmRpc21pc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTRVRUSU5HU19NT0RFX0hFTFA6CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzLgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNFVFRJTkdTX01PREVfU1VCVElUTEVfVFJBQ0s6CisgICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiAhPSBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCA9IHBvc2l0aW9uOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1bmRsZSBleHRyYSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYS5wdXRJbnQoS0VZX1NFTEVDVEVEX1NVQlRJVExFX0lOREVYLCBwb3NpdGlvbiAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250cm9sbGVyLnNlbmRDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFDb250cm9sVmlldzJJbXBsLkNPTU1BTkRfU0hPV19TVUJUSVRMRSwgZXh0cmEsIG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX3N1YnRpdGxlX29uLCBudWxsKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfY2NfaXNfb24pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVJc0VuYWJsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udHJvbGxlci5zZW5kQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhQ29udHJvbFZpZXcySW1wbC5DT01NQU5EX0hJREVfU1VCVElUTEUsIG51bGwsIG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX3N1YnRpdGxlX29mZiwgbnVsbCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX2NjX2lzX29mZikpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlSXNFbmFibGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzV2luZG93LmRpc21pc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTRVRUSU5HU19NT0RFX1ZJREVPX1FVQUxJVFk6CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGFkZCBzdXBwb3J0IGZvciB2aWRlbyBxdWFsaXR5CisgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFZpZGVvUXVhbGl0eUluZGV4ID0gcG9zaXRpb247CisgICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc1dpbmRvdy5kaXNtaXNzKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVEdXJhdGlvbigpIHsKKyAgICAgICAgaWYgKG1NZXRhZGF0YSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobU1ldGFkYXRhLmNvbnRhaW5zS2V5KE1lZGlhTWV0YWRhdGEuTUVUQURBVEFfS0VZX0RVUkFUSU9OKSkgeworICAgICAgICAgICAgICAgIG1EdXJhdGlvbiA9IChpbnQpIG1NZXRhZGF0YS5nZXRMb25nKE1lZGlhTWV0YWRhdGEuTUVUQURBVEFfS0VZX0RVUkFUSU9OKTsKKyAgICAgICAgICAgICAgICAvLyB1cGRhdGUgcHJvZ3Jlc3MgYmFyCisgICAgICAgICAgICAgICAgc2V0UHJvZ3Jlc3MoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVUaXRsZSgpIHsKKyAgICAgICAgaWYgKG1NZXRhZGF0YSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobU1ldGFkYXRhLmNvbnRhaW5zS2V5KE1lZGlhTWV0YWRhdGEuTUVUQURBVEFfS0VZX1RJVExFKSkgeworICAgICAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dChtTWV0YWRhdGEuZ2V0U3RyaW5nKE1lZGlhTWV0YWRhdGEuTUVUQURBVEFfS0VZX1RJVExFKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGUgdGl0bGUgYmFyIGlzIG1hZGUgdXAgb2YgdHdvIHNlcGFyYXRlIExpbmVhckxheW91dHMuIElmIHRoZSBzdW0gb2YgdGhlIHR3byBiYXJzIGFyZQorICAgIC8vIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoZSB0aXRsZSBiYXIsIHJlZHVjZSB0aGUgc2l6ZSBvZiB0aGUgbGVmdCBiYXIgKHdoaWNoIG1ha2VzIHRoZQorICAgIC8vIFRleHRWaWV3IHRoYXQgY29udGFpbnMgdGhlIHRpdGxlIG9mIHRoZSBtZWRpYSBmaWxlIHNocmluaykuCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVRpdGxlQmFyTGF5b3V0KCkgeworICAgICAgICBpZiAobVRpdGxlQmFyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludCB0aXRsZUJhcldpZHRoID0gbVRpdGxlQmFyLmdldFdpZHRoKCk7CisKKyAgICAgICAgICAgIFZpZXcgbGVmdEJhciA9IG1UaXRsZUJhci5maW5kVmlld0J5SWQoUi5pZC50aXRsZV9iYXJfbGVmdCk7CisgICAgICAgICAgICBWaWV3IHJpZ2h0QmFyID0gbVRpdGxlQmFyLmZpbmRWaWV3QnlJZChSLmlkLnRpdGxlX2Jhcl9yaWdodCk7CisgICAgICAgICAgICBpbnQgbGVmdEJhcldpZHRoID0gbGVmdEJhci5nZXRXaWR0aCgpOworICAgICAgICAgICAgaW50IHJpZ2h0QmFyV2lkdGggPSByaWdodEJhci5nZXRXaWR0aCgpOworCisgICAgICAgICAgICBSZWxhdGl2ZUxheW91dC5MYXlvdXRQYXJhbXMgcGFyYW1zID0KKyAgICAgICAgICAgICAgICAgICAgKFJlbGF0aXZlTGF5b3V0LkxheW91dFBhcmFtcykgbGVmdEJhci5nZXRMYXlvdXRQYXJhbXMoKTsKKyAgICAgICAgICAgIGlmIChsZWZ0QmFyV2lkdGggKyByaWdodEJhcldpZHRoID4gdGl0bGVCYXJXaWR0aCkgeworICAgICAgICAgICAgICAgIHBhcmFtcy53aWR0aCA9IHRpdGxlQmFyV2lkdGggLSByaWdodEJhcldpZHRoOworICAgICAgICAgICAgICAgIG1PcmlnaW5hbExlZnRCYXJXaWR0aCA9IGxlZnRCYXJXaWR0aDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobGVmdEJhcldpZHRoICsgcmlnaHRCYXJXaWR0aCA8IHRpdGxlQmFyV2lkdGggJiYgbU9yaWdpbmFsTGVmdEJhcldpZHRoICE9IDApIHsKKyAgICAgICAgICAgICAgICBwYXJhbXMud2lkdGggPSBtT3JpZ2luYWxMZWZ0QmFyV2lkdGg7CisgICAgICAgICAgICAgICAgbU9yaWdpbmFsTGVmdEJhcldpZHRoID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxlZnRCYXIuc2V0TGF5b3V0UGFyYW1zKHBhcmFtcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlQXVkaW9NZXRhZGF0YSgpIHsKKyAgICAgICAgaWYgKG1NZWRpYVR5cGUgIT0gTUVESUFfVFlQRV9NVVNJQykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1NZXRhZGF0YSAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgdGl0bGVUZXh0ID0gIiI7CisgICAgICAgICAgICBTdHJpbmcgYXJ0aXN0VGV4dCA9ICIiOworICAgICAgICAgICAgaWYgKG1NZXRhZGF0YS5jb250YWluc0tleShNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9USVRMRSkpIHsKKyAgICAgICAgICAgICAgICB0aXRsZVRleHQgPSBtTWV0YWRhdGEuZ2V0U3RyaW5nKE1lZGlhTWV0YWRhdGEuTUVUQURBVEFfS0VZX1RJVExFKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGl0bGVUZXh0ID0gbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9tdXNpY190aXRsZV91bmtub3duX3RleHQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobU1ldGFkYXRhLmNvbnRhaW5zS2V5KE1lZGlhTWV0YWRhdGEuTUVUQURBVEFfS0VZX0FSVElTVCkpIHsKKyAgICAgICAgICAgICAgICBhcnRpc3RUZXh0ID0gbU1ldGFkYXRhLmdldFN0cmluZyhNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9BUlRJU1QpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhcnRpc3RUZXh0ID0gbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9tdXNpY19hcnRpc3RfdW5rbm93bl90ZXh0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVXBkYXRlIHRpdGxlIGZvciBFbWJlZGRlZCBzaXplIHR5cGUKKyAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dCh0aXRsZVRleHQgKyAiIC0gIiArIGFydGlzdFRleHQpOworCisgICAgICAgICAgICAvLyBTZXQgdG8gdHJ1ZSB0byB1cGRhdGUgbGF5b3V0IGluc2lkZSBvbk1lYXN1cmUoKQorICAgICAgICAgICAgbU5lZWRVWFVwZGF0ZSA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlTGF5b3V0KCkgeworICAgICAgICBpZiAobUlzQWR2ZXJ0aXNlbWVudCkgeworICAgICAgICAgICAgbVJld0J1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICBtRmZ3ZEJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICBtUHJldkJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICBtVGltZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworCisgICAgICAgICAgICBtQWRTa2lwVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtQWRSZW1haW5pbmdWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1BZEV4dGVybmFsTGluay5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisKKyAgICAgICAgICAgIG1Qcm9ncmVzcy5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgIG1OZXh0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0Q29sb3JGaWx0ZXIoUi5jb2xvci5ncmF5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1SZXdCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgbUZmd2RCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgbVByZXZCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgbVRpbWVWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKworICAgICAgICAgICAgbUFkU2tpcFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgbUFkUmVtYWluaW5nVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICBtQWRFeHRlcm5hbExpbmsuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworCisgICAgICAgICAgICBtUHJvZ3Jlc3Muc2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgIG1OZXh0QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgICAgICBtTmV4dEJ1dHRvbi5jbGVhckNvbG9yRmlsdGVyKCk7CisgICAgICAgICAgICBkaXNhYmxlVW5zdXBwb3J0ZWRCdXR0b25zKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlTGF5b3V0KGludCBtYXhJY29uQ291bnQsIGludCBmdWxsSWNvblNpemUsIGludCBlbWJlZGRlZEljb25TaXplLAorICAgICAgICAgICAgIGludCBtYXJnaW5TaXplLCBpbnQgY3VycldpZHRoLCBpbnQgY3VyckhlaWdodCwgaW50IHNjcmVlbldpZHRoLCBpbnQgc2NyZWVuSGVpZ2h0KSB7CisgICAgICAgIGludCBmdWxsQm90dG9tQmFyUmlnaHRXaWR0aE1heCA9IGZ1bGxJY29uU2l6ZSAqIG1heEljb25Db3VudAorICAgICAgICAgICAgICAgICsgbWFyZ2luU2l6ZSAqIChtYXhJY29uQ291bnQgKiAyKTsKKyAgICAgICAgaW50IGVtYmVkZGVkQm90dG9tQmFyUmlnaHRXaWR0aE1heCA9IGVtYmVkZGVkSWNvblNpemUgKiBtYXhJY29uQ291bnQKKyAgICAgICAgICAgICAgICArIG1hcmdpblNpemUgKiAobWF4SWNvbkNvdW50ICogMik7CisgICAgICAgIGludCBmdWxsV2lkdGggPSBtVHJhbnNwb3J0Q29udHJvbHMuZ2V0V2lkdGgoKSArIG1UaW1lVmlldy5nZXRXaWR0aCgpCisgICAgICAgICAgICAgICAgKyBmdWxsQm90dG9tQmFyUmlnaHRXaWR0aE1heDsKKyAgICAgICAgaW50IGVtYmVkZGVkV2lkdGggPSBtVGltZVZpZXcuZ2V0V2lkdGgoKSArIGVtYmVkZGVkQm90dG9tQmFyUmlnaHRXaWR0aE1heDsKKyAgICAgICAgaW50IHNjcmVlbk1heExlbmd0aCA9IE1hdGgubWF4KHNjcmVlbldpZHRoLCBzY3JlZW5IZWlnaHQpOworCisgICAgICAgIGlmIChmdWxsV2lkdGggPiBzY3JlZW5NYXhMZW5ndGgpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IHNjcmVlbiBtYXkgYmUgc21hbGxlciB0aGFuIHRoZSBsZW5ndGggbmVlZGVkIGZvciBGdWxsIHNpemUuCisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGlzRnVsbFNpemUgPSAobU1lZGlhVHlwZSA9PSBNRURJQV9UWVBFX0RFRkFVTFQpID8gKGN1cnJXaWR0aCA9PSBzY3JlZW5NYXhMZW5ndGgpIDoKKyAgICAgICAgICAgICAgICAoY3VycldpZHRoID09IHNjcmVlbldpZHRoICYmIGN1cnJIZWlnaHQgPT0gc2NyZWVuSGVpZ2h0KTsKKworICAgICAgICBpZiAoaXNGdWxsU2l6ZSkgeworICAgICAgICAgICAgaWYgKG1TaXplVHlwZSAhPSBTSVpFX1RZUEVfRlVMTCkgeworICAgICAgICAgICAgICAgIHVwZGF0ZUxheW91dEZvclNpemVDaGFuZ2UoU0laRV9UWVBFX0ZVTEwpOworICAgICAgICAgICAgICAgIGlmIChtTWVkaWFUeXBlID09IE1FRElBX1RZUEVfTVVTSUMpIHsKKyAgICAgICAgICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGVtYmVkZGVkV2lkdGggPD0gY3VycldpZHRoKSB7CisgICAgICAgICAgICBpZiAobVNpemVUeXBlICE9IFNJWkVfVFlQRV9FTUJFRERFRCkgeworICAgICAgICAgICAgICAgIHVwZGF0ZUxheW91dEZvclNpemVDaGFuZ2UoU0laRV9UWVBFX0VNQkVEREVEKTsKKyAgICAgICAgICAgICAgICBpZiAobU1lZGlhVHlwZSA9PSBNRURJQV9UWVBFX01VU0lDKSB7CisgICAgICAgICAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChtU2l6ZVR5cGUgIT0gU0laRV9UWVBFX01JTklNQUwpIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVMYXlvdXRGb3JTaXplQ2hhbmdlKFNJWkVfVFlQRV9NSU5JTUFMKTsKKyAgICAgICAgICAgICAgICBpZiAobU1lZGlhVHlwZSA9PSBNRURJQV9UWVBFX01VU0lDKSB7CisgICAgICAgICAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVMYXlvdXRGb3JTaXplQ2hhbmdlKGludCBzaXplVHlwZSkgeworICAgICAgICBtU2l6ZVR5cGUgPSBzaXplVHlwZTsKKyAgICAgICAgUmVsYXRpdmVMYXlvdXQuTGF5b3V0UGFyYW1zIHRpbWVWaWV3UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoUmVsYXRpdmVMYXlvdXQuTGF5b3V0UGFyYW1zKSBtVGltZVZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7CisgICAgICAgIFNlZWtCYXIgc2Vla2VyID0gKFNlZWtCYXIpIG1Qcm9ncmVzczsKKyAgICAgICAgc3dpdGNoIChtU2l6ZVR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgU0laRV9UWVBFX0VNQkVEREVEOgorICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIFRpdGxlIEJhcgorICAgICAgICAgICAgICAgIG1UaXRsZUJhci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgbUJhY2tCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworCisgICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gRnVsbCBTY3JlZW4gQnV0dG9uCisgICAgICAgICAgICAgICAgbU1pbmltYWxFeHRyYVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgICAgIG1GdWxsU2NyZWVuQnV0dG9uID0gbUJvdHRvbUJhclJpZ2h0Vmlldy5maW5kVmlld0J5SWQoUi5pZC5mdWxsc2NyZWVuKTsKKyAgICAgICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobUZ1bGxTY3JlZW5MaXN0ZW5lcik7CisKKyAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBDZW50ZXIgVmlldworICAgICAgICAgICAgICAgIG1DZW50ZXJWaWV3LnJlbW92ZUFsbFZpZXdzKCk7CisgICAgICAgICAgICAgICAgbUJvdHRvbUJhckxlZnRWaWV3LnJlbW92ZVZpZXcobVRyYW5zcG9ydENvbnRyb2xzKTsKKyAgICAgICAgICAgICAgICBtQm90dG9tQmFyTGVmdFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgICAgIG1UcmFuc3BvcnRDb250cm9scyA9IGluZmxhdGVUcmFuc3BvcnRDb250cm9scyhSLmxheW91dC5lbWJlZGRlZF90cmFuc3BvcnRfY29udHJvbHMpOworICAgICAgICAgICAgICAgIG1DZW50ZXJWaWV3LmFkZFZpZXcobVRyYW5zcG9ydENvbnRyb2xzKTsKKworICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIFByb2dyZXNzIEJhcgorICAgICAgICAgICAgICAgIHNlZWtlci5zZXRUaHVtYihtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuY3VzdG9tX3Byb2dyZXNzX3RodW1iKSk7CisgICAgICAgICAgICAgICAgbVByb2dyZXNzQnVmZmVyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKworICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIEJvdHRvbSBCYXIKKyAgICAgICAgICAgICAgICBtQm90dG9tQmFyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICBpZiAodGltZVZpZXdQYXJhbXMuZ2V0UnVsZShSZWxhdGl2ZUxheW91dC5MRUZUX09GKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRpbWVWaWV3UGFyYW1zLnJlbW92ZVJ1bGUoUmVsYXRpdmVMYXlvdXQuTEVGVF9PRik7CisgICAgICAgICAgICAgICAgICAgIHRpbWVWaWV3UGFyYW1zLmFkZFJ1bGUoUmVsYXRpdmVMYXlvdXQuUklHSFRfT0YsIFIuaWQuYm90dG9tX2Jhcl9sZWZ0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNJWkVfVFlQRV9GVUxMOgorICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIFRpdGxlIEJhcgorICAgICAgICAgICAgICAgIG1UaXRsZUJhci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgbUJhY2tCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworCisgICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gRnVsbCBTY3JlZW4gQnV0dG9uCisgICAgICAgICAgICAgICAgbU1pbmltYWxFeHRyYVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgICAgIG1GdWxsU2NyZWVuQnV0dG9uID0gbUJvdHRvbUJhclJpZ2h0Vmlldy5maW5kVmlld0J5SWQoUi5pZC5mdWxsc2NyZWVuKTsKKyAgICAgICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobUZ1bGxTY3JlZW5MaXN0ZW5lcik7CisKKyAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBDZW50ZXIgVmlldworICAgICAgICAgICAgICAgIG1DZW50ZXJWaWV3LnJlbW92ZUFsbFZpZXdzKCk7CisgICAgICAgICAgICAgICAgbUJvdHRvbUJhckxlZnRWaWV3LnJlbW92ZVZpZXcobVRyYW5zcG9ydENvbnRyb2xzKTsKKyAgICAgICAgICAgICAgICBtVHJhbnNwb3J0Q29udHJvbHMgPSBpbmZsYXRlVHJhbnNwb3J0Q29udHJvbHMoUi5sYXlvdXQuZnVsbF90cmFuc3BvcnRfY29udHJvbHMpOworICAgICAgICAgICAgICAgIG1Cb3R0b21CYXJMZWZ0Vmlldy5hZGRWaWV3KG1UcmFuc3BvcnRDb250cm9scywgMCk7CisgICAgICAgICAgICAgICAgbUJvdHRvbUJhckxlZnRWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKworICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIFByb2dyZXNzIEJhcgorICAgICAgICAgICAgICAgIHNlZWtlci5zZXRUaHVtYihtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuY3VzdG9tX3Byb2dyZXNzX3RodW1iKSk7CisgICAgICAgICAgICAgICAgbVByb2dyZXNzQnVmZmVyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKworICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIEJvdHRvbSBCYXIKKyAgICAgICAgICAgICAgICBtQm90dG9tQmFyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICBpZiAodGltZVZpZXdQYXJhbXMuZ2V0UnVsZShSZWxhdGl2ZUxheW91dC5SSUdIVF9PRikgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICB0aW1lVmlld1BhcmFtcy5yZW1vdmVSdWxlKFJlbGF0aXZlTGF5b3V0LlJJR0hUX09GKTsKKyAgICAgICAgICAgICAgICAgICAgdGltZVZpZXdQYXJhbXMuYWRkUnVsZShSZWxhdGl2ZUxheW91dC5MRUZUX09GLCBSLmlkLmJvdHRvbV9iYXJfcmlnaHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU0laRV9UWVBFX01JTklNQUw6CisgICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gVGl0bGUgQmFyCisgICAgICAgICAgICAgICAgbVRpdGxlQmFyLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgICAgICBtQmFja0J1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisKKyAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBGdWxsIFNjcmVlbiBCdXR0b24KKyAgICAgICAgICAgICAgICBtTWluaW1hbEV4dHJhVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24gPSBtTWluaW1hbEV4dHJhVmlldy5maW5kVmlld0J5SWQoUi5pZC5mdWxsc2NyZWVuKTsKKyAgICAgICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobUZ1bGxTY3JlZW5MaXN0ZW5lcik7CisKKyAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBDZW50ZXIgVmlldworICAgICAgICAgICAgICAgIG1DZW50ZXJWaWV3LnJlbW92ZUFsbFZpZXdzKCk7CisgICAgICAgICAgICAgICAgbUJvdHRvbUJhckxlZnRWaWV3LnJlbW92ZVZpZXcobVRyYW5zcG9ydENvbnRyb2xzKTsKKyAgICAgICAgICAgICAgICBtVHJhbnNwb3J0Q29udHJvbHMgPSBpbmZsYXRlVHJhbnNwb3J0Q29udHJvbHMoUi5sYXlvdXQubWluaW1hbF90cmFuc3BvcnRfY29udHJvbHMpOworICAgICAgICAgICAgICAgIG1DZW50ZXJWaWV3LmFkZFZpZXcobVRyYW5zcG9ydENvbnRyb2xzKTsKKworICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIFByb2dyZXNzIEJhcgorICAgICAgICAgICAgICAgIHNlZWtlci5zZXRUaHVtYihudWxsKTsKKyAgICAgICAgICAgICAgICBtUHJvZ3Jlc3NCdWZmZXIuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworCisgICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gQm90dG9tIEJhcgorICAgICAgICAgICAgICAgIG1Cb3R0b21CYXIuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIG1UaW1lVmlldy5zZXRMYXlvdXRQYXJhbXModGltZVZpZXdQYXJhbXMpOworCisgICAgICAgIGlmIChpc1BsYXlpbmcoKSkgeworICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAorICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfcGF1c2VfY2lyY2xlX2ZpbGxlZCwgbnVsbCkpOworICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfcGF1c2VfYnV0dG9uX2Rlc2MpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKKyAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX3BsYXlfY2lyY2xlX2ZpbGxlZCwgbnVsbCkpOworICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfcGxheV9idXR0b25fZGVzYykpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1Jc0Z1bGxTY3JlZW4pIHsKKyAgICAgICAgICAgIG1GdWxsU2NyZWVuQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCisgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19mdWxsc2NyZWVuX2V4aXQsIG51bGwpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1GdWxsU2NyZWVuQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCisgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19mdWxsc2NyZWVuLCBudWxsKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFZpZXcgaW5mbGF0ZVRyYW5zcG9ydENvbnRyb2xzKGludCBsYXlvdXRJZCkgeworICAgICAgICBWaWV3IHYgPSBBcGlIZWxwZXIuaW5mbGF0ZUxpYkxheW91dChtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLCBsYXlvdXRJZCk7CisgICAgICAgIG1QbGF5UGF1c2VCdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLnBhdXNlKTsKKyAgICAgICAgaWYgKG1QbGF5UGF1c2VCdXR0b24gIT0gbnVsbCkgeworICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5yZXF1ZXN0Rm9jdXMoKTsKKyAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1QbGF5UGF1c2VMaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICAgICAgbUZmd2RCdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLmZmd2QpOworICAgICAgICBpZiAobUZmd2RCdXR0b24gIT0gbnVsbCkgeworICAgICAgICAgICAgbUZmd2RCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1GZndkTGlzdGVuZXIpOworICAgICAgICAgICAgaWYgKG1NZWRpYVR5cGUgPT0gTUVESUFfVFlQRV9NVVNJQykgeworICAgICAgICAgICAgICAgIG1GZndkQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtUmV3QnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC5yZXcpOworICAgICAgICBpZiAobVJld0J1dHRvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBtUmV3QnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtUmV3TGlzdGVuZXIpOworICAgICAgICAgICAgaWYgKG1NZWRpYVR5cGUgPT0gTUVESUFfVFlQRV9NVVNJQykgeworICAgICAgICAgICAgICAgIG1SZXdCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIFRPRE86IEFkZCBzdXBwb3J0IGZvciBOZXh0IGFuZCBQcmV2aW91cyBidXR0b25zCisgICAgICAgIG1OZXh0QnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC5uZXh0KTsKKyAgICAgICAgaWYgKG1OZXh0QnV0dG9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1OZXh0QnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtTmV4dExpc3RlbmVyKTsKKyAgICAgICAgICAgIG1OZXh0QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgfQorICAgICAgICBtUHJldkJ1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQucHJldik7CisgICAgICAgIGlmIChtUHJldkJ1dHRvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBtUHJldkJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobVByZXZMaXN0ZW5lcik7CisgICAgICAgICAgICBtUHJldkJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHY7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVTZXR0aW5nc0xpc3RzKCkgeworICAgICAgICBtU2V0dGluZ3NNYWluVGV4dHNMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgIG1TZXR0aW5nc01haW5UZXh0c0xpc3QuYWRkKAorICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX2F1ZGlvX3RyYWNrX3RleHQpKTsKKyAgICAgICAgbVNldHRpbmdzTWFpblRleHRzTGlzdC5hZGQoCisgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcuTWVkaWFDb250cm9sVmlldzJfcGxheWJhY2tfc3BlZWRfdGV4dCkpOworICAgICAgICBtU2V0dGluZ3NNYWluVGV4dHNMaXN0LmFkZCgKKyAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5NZWRpYUNvbnRyb2xWaWV3Ml9oZWxwX3RleHQpKTsKKworICAgICAgICBtU2V0dGluZ3NTdWJUZXh0c0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgbVNldHRpbmdzU3ViVGV4dHNMaXN0LmFkZCgKKyAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5NZWRpYUNvbnRyb2xWaWV3Ml9hdWRpb190cmFja19ub25lX3RleHQpKTsKKyAgICAgICAgbVNldHRpbmdzU3ViVGV4dHNMaXN0LmFkZCgKKyAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZ0FycmF5KAorICAgICAgICAgICAgICAgICAgICAgICAgUi5hcnJheS5NZWRpYUNvbnRyb2xWaWV3Ml9wbGF5YmFja19zcGVlZHMpW1BMQVlCQUNLX1NQRUVEXzF4X0lOREVYXSk7CisgICAgICAgIG1TZXR0aW5nc1N1YlRleHRzTGlzdC5hZGQoUkVTT1VSQ0VfRU1QVFkpOworCisgICAgICAgIG1TZXR0aW5nc0ljb25JZHNMaXN0ID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworICAgICAgICBtU2V0dGluZ3NJY29uSWRzTGlzdC5hZGQoUi5kcmF3YWJsZS5pY19hdWRpb3RyYWNrKTsKKyAgICAgICAgbVNldHRpbmdzSWNvbklkc0xpc3QuYWRkKFIuZHJhd2FibGUuaWNfcGxheV9jaXJjbGVfZmlsbGVkKTsKKyAgICAgICAgbVNldHRpbmdzSWNvbklkc0xpc3QuYWRkKFIuZHJhd2FibGUuaWNfaGVscCk7CisKKyAgICAgICAgbUF1ZGlvVHJhY2tMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgIG1BdWRpb1RyYWNrTGlzdC5hZGQoCisgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcuTWVkaWFDb250cm9sVmlldzJfYXVkaW9fdHJhY2tfbm9uZV90ZXh0KSk7CisKKyAgICAgICAgbVZpZGVvUXVhbGl0eUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgbVZpZGVvUXVhbGl0eUxpc3QuYWRkKAorICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX3ZpZGVvX3F1YWxpdHlfYXV0b190ZXh0KSk7CisKKyAgICAgICAgbVBsYXliYWNrU3BlZWRUZXh0TGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nQXJyYXkoUi5hcnJheS5NZWRpYUNvbnRyb2xWaWV3Ml9wbGF5YmFja19zcGVlZHMpKSk7CisgICAgICAgIC8vIFNlbGVjdCB0aGUgIjF4IiBzcGVlZCBhcyB0aGUgZGVmYXVsdCB2YWx1ZS4KKyAgICAgICAgbVNlbGVjdGVkU3BlZWRJbmRleCA9IFBMQVlCQUNLX1NQRUVEXzF4X0lOREVYOworCisgICAgICAgIG1QbGF5YmFja1NwZWVkTGlzdCA9IG5ldyBBcnJheUxpc3Q8RmxvYXQ+KCk7CisgICAgICAgIGludFtdIHNwZWVkcyA9IG1SZXNvdXJjZXMuZ2V0SW50QXJyYXkoUi5hcnJheS5zcGVlZF9tdWx0aXBsaWVkX2J5XzEwMCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3BlZWRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBmbG9hdCBzcGVlZCA9IChmbG9hdCkgc3BlZWRzW2ldIC8gMTAwLjBmOworICAgICAgICAgICAgbVBsYXliYWNrU3BlZWRMaXN0LmFkZChzcGVlZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGlzcGxheVNldHRpbmdzV2luZG93KEJhc2VBZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICAgICAgLy8gU2V0IEFkYXB0ZXIKKyAgICAgICAgbVNldHRpbmdzTGlzdFZpZXcuc2V0QWRhcHRlcihhZGFwdGVyKTsKKworICAgICAgICAvLyBTZXQgd2lkdGggb2Ygd2luZG93CisgICAgICAgIGludCBpdGVtV2lkdGggPSAobVNpemVUeXBlID09IFNJWkVfVFlQRV9FTUJFRERFRCkKKyAgICAgICAgICAgICAgICA/IG1FbWJlZGRlZFNldHRpbmdzSXRlbVdpZHRoIDogbUZ1bGxTZXR0aW5nc0l0ZW1XaWR0aDsKKyAgICAgICAgbVNldHRpbmdzV2luZG93LnNldFdpZHRoKGl0ZW1XaWR0aCk7CisKKyAgICAgICAgLy8gQ2FsY3VsYXRlIGhlaWdodCBvZiB3aW5kb3cgYW5kIHNob3cKKyAgICAgICAgaW50IGl0ZW1IZWlnaHQgPSAobVNpemVUeXBlID09IFNJWkVfVFlQRV9FTUJFRERFRCkKKyAgICAgICAgICAgICAgICA/IG1FbWJlZGRlZFNldHRpbmdzSXRlbUhlaWdodCA6IG1GdWxsU2V0dGluZ3NJdGVtSGVpZ2h0OworICAgICAgICBpbnQgdG90YWxIZWlnaHQgPSBhZGFwdGVyLmdldENvdW50KCkgKiBpdGVtSGVpZ2h0OworICAgICAgICBtU2V0dGluZ3NXaW5kb3cuZGlzbWlzcygpOworICAgICAgICBtU2V0dGluZ3NXaW5kb3cuc2hvd0FzRHJvcERvd24obUluc3RhbmNlLCBtU2V0dGluZ3NXaW5kb3dNYXJnaW4sCisgICAgICAgICAgICAgICAgbVNldHRpbmdzV2luZG93TWFyZ2luIC0gdG90YWxIZWlnaHQsIEdyYXZpdHkuQk9UVE9NIHwgR3Jhdml0eS5SSUdIVCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBNZWRpYUNvbnRyb2xsZXJDYWxsYmFjayBleHRlbmRzIE1lZGlhQ29udHJvbGxlci5DYWxsYmFjayB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXliYWNrU3RhdGVDaGFuZ2VkKFBsYXliYWNrU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgICAgIG1QbGF5YmFja1N0YXRlID0gc3RhdGU7CisKKyAgICAgICAgICAgIC8vIFVwZGF0ZSBwYXVzZSBidXR0b24gZGVwZW5kaW5nIG9uIHBsYXliYWNrIHN0YXRlIGZvciB0aGUgZm9sbG93aW5nIHR3byByZWFzb25zOgorICAgICAgICAgICAgLy8gICAxKSBOZWVkIHRvIGhhbmRsZSBjYXNlIHdoZXJlIGFwcCBjdXN0b21pemVzIHBsYXliYWNrIHN0YXRlIGJlaGF2aW9yIHdoZW4gYXBwCisgICAgICAgICAgICAvLyAgICAgIGFjdGl2aXR5IGlzIHJlc3VtZWQuCisgICAgICAgICAgICAvLyAgIDIpIE5lZWQgdG8gaGFuZGxlIGNhc2Ugd2hlcmUgdGhlIG1lZGlhIGZpbGUgcmVhY2hlcyBlbmQgb2YgZHVyYXRpb24uCisgICAgICAgICAgICBpZiAobVBsYXliYWNrU3RhdGUuZ2V0U3RhdGUoKSAhPSBtUHJldlN0YXRlKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChtUGxheWJhY2tTdGF0ZS5nZXRTdGF0ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUGxheWJhY2tTdGF0ZS5TVEFURV9QTEFZSU5HOgorICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfcGF1c2VfY2lyY2xlX2ZpbGxlZCwgbnVsbCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfcGF1c2VfYnV0dG9uX2Rlc2MpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5yZW1vdmVDYWxsYmFja3MobVVwZGF0ZVByb2dyZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5wb3N0KG1VcGRhdGVQcm9ncmVzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBQbGF5YmFja1N0YXRlLlNUQVRFX1BBVVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX3BsYXlfY2lyY2xlX2ZpbGxlZCwgbnVsbCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfcGxheV9idXR0b25fZGVzYykpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUGxheWJhY2tTdGF0ZS5TVEFURV9TVE9QUEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfcmVwbGF5X2NpcmNsZV9maWxsZWQsIG51bGwpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX3JlcGxheV9idXR0b25fZGVzYykpOworICAgICAgICAgICAgICAgICAgICAgICAgbUlzU3RvcHBlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtUHJldlN0YXRlID0gbVBsYXliYWNrU3RhdGUuZ2V0U3RhdGUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1QbGF5YmFja0FjdGlvbnMgIT0gbVBsYXliYWNrU3RhdGUuZ2V0QWN0aW9ucygpKSB7CisgICAgICAgICAgICAgICAgbG9uZyBuZXdBY3Rpb25zID0gbVBsYXliYWNrU3RhdGUuZ2V0QWN0aW9ucygpOworICAgICAgICAgICAgICAgIGlmICgobmV3QWN0aW9ucyAmIFBsYXliYWNrU3RhdGUuQUNUSU9OX1BBVVNFKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKG5ld0FjdGlvbnMgJiBQbGF5YmFja1N0YXRlLkFDVElPTl9SRVdJTkQpICE9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIG1NZWRpYVR5cGUgIT0gTUVESUFfVFlQRV9NVVNJQykgeworICAgICAgICAgICAgICAgICAgICBpZiAobVJld0J1dHRvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtUmV3QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKG5ld0FjdGlvbnMgJiBQbGF5YmFja1N0YXRlLkFDVElPTl9GQVNUX0ZPUldBUkQpICE9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIG1NZWRpYVR5cGUgIT0gTUVESUFfVFlQRV9NVVNJQykgeworICAgICAgICAgICAgICAgICAgICBpZiAobUZmd2RCdXR0b24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUZmd2RCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgobmV3QWN0aW9ucyAmIFBsYXliYWNrU3RhdGUuQUNUSU9OX1NFRUtfVE8pICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbVNlZWtBdmFpbGFibGUgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1TZWVrQXZhaWxhYmxlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1QbGF5YmFja0FjdGlvbnMgPSBuZXdBY3Rpb25zOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBBZGQgYnV0dG9ucyBpZiBjdXN0b20gYWN0aW9ucyBhcmUgcHJlc2VudC4KKyAgICAgICAgICAgIExpc3Q8UGxheWJhY2tTdGF0ZS5DdXN0b21BY3Rpb24+IGN1c3RvbUFjdGlvbnMgPSBtUGxheWJhY2tTdGF0ZS5nZXRDdXN0b21BY3Rpb25zKCk7CisgICAgICAgICAgICBtQ3VzdG9tQnV0dG9ucy5yZW1vdmVBbGxWaWV3cygpOworICAgICAgICAgICAgaWYgKGN1c3RvbUFjdGlvbnMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIGZvciAoUGxheWJhY2tTdGF0ZS5DdXN0b21BY3Rpb24gYWN0aW9uIDogY3VzdG9tQWN0aW9ucykgeworICAgICAgICAgICAgICAgICAgICBJbWFnZUJ1dHRvbiBidXR0b24gPSBuZXcgSW1hZ2VCdXR0b24obUluc3RhbmNlLmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsIC8qIEF0dHJpYnV0ZVNldCAqLywgMCAvKiBTdHlsZSAqLyk7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IEFwcGx5IFIuc3R5bGUuQm90dG9tQmFyQnV0dG9uIHRvIHRoaXMgYnV0dG9uIHVzaW5nIGxpYnJhcnkgY29udGV4dC4KKyAgICAgICAgICAgICAgICAgICAgLy8gUmVmZXIgQ29uc3RydWN0b3Igd2l0aCBhcmd1bWVudCAoaW50IGRlZlN0eWxlUmVzKSBvZiBWaWV3LmphdmEKKyAgICAgICAgICAgICAgICAgICAgYnV0dG9uLnNldEltYWdlUmVzb3VyY2UoYWN0aW9uLmdldEljb24oKSk7CisgICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5zZXRUb29sdGlwVGV4dChhY3Rpb24uZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFjdGlvblN0cmluZyA9IGFjdGlvbi5nZXRBY3Rpb24oKS50b1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICBidXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBDdXJyZW50bHksIHdlIGFyZSBqdXN0IHNlbmRpbmcgZXh0cmFzIHRoYXQgY2FtZSBmcm9tIHNlc3Npb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXMgaXQgdGhlIHJpZ2h0IGJlaGF2aW9yPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250cm9scy5zZW5kQ3VzdG9tQWN0aW9uKGFjdGlvblN0cmluZywgYWN0aW9uLmdldEV4dHJhcygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2Uuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgbUN1c3RvbUJ1dHRvbnMuYWRkVmlldyhidXR0b24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbk1ldGFkYXRhQ2hhbmdlZChNZWRpYU1ldGFkYXRhIG1ldGFkYXRhKSB7CisgICAgICAgICAgICBtTWV0YWRhdGEgPSBtZXRhZGF0YTsKKyAgICAgICAgICAgIHVwZGF0ZUR1cmF0aW9uKCk7CisgICAgICAgICAgICB1cGRhdGVUaXRsZSgpOworICAgICAgICAgICAgdXBkYXRlQXVkaW9NZXRhZGF0YSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2Vzc2lvbkV2ZW50KFN0cmluZyBldmVudCwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICAgICAgc3dpdGNoIChldmVudCkgeworICAgICAgICAgICAgICAgIGNhc2UgRVZFTlRfVVBEQVRFX1RSQUNLX1NUQVRVUzoKKyAgICAgICAgICAgICAgICAgICAgbVZpZGVvVHJhY2tDb3VudCA9IGV4dHJhcy5nZXRJbnQoS0VZX1ZJREVPX1RSQUNLX0NPVU5UKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgb25lIG9yIG1vcmUgYXVkaW8gdHJhY2tzLCBhbmQgdGhpcyBpbmZvcm1hdGlvbiBoYXMgbm90IGJlZW4KKyAgICAgICAgICAgICAgICAgICAgLy8gcmVmbGVjdGVkIGludG8gdGhlIFNldHRpbmdzIHdpbmRvdyB5ZXQsIGF1dG9tYXRpY2FsbHkgY2hlY2sgdGhlIGZpcnN0IHRyYWNrLgorICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHRoZSBBdWRpbyBUcmFjayBzZWxlY3Rpb24gd2lsbCBiZSBkZWZhdWx0ZWQgdG8gIk5vbmUiLgorICAgICAgICAgICAgICAgICAgICBtQXVkaW9UcmFja0NvdW50ID0gZXh0cmFzLmdldEludChLRVlfQVVESU9fVFJBQ0tfQ09VTlQpOworICAgICAgICAgICAgICAgICAgICBtQXVkaW9UcmFja0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1BdWRpb1RyYWNrQ291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBhZGQgbW9yZSB0ZXh0IGFib3V0IHRyYWNrIGluZm8uCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1BdWRpb1RyYWNrQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0cmFjayA9IG1SZXNvdXJjZXMuZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuTWVkaWFDb250cm9sVmlldzJfYXVkaW9fdHJhY2tfbnVtYmVyX3RleHQsIGkgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9UcmFja0xpc3QuYWRkKHRyYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoYW5nZSBzdWIgdGV4dCBpbnNpZGUgdGhlIFNldHRpbmdzIHdpbmRvdy4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc1N1YlRleHRzTGlzdC5zZXQoU0VUVElOR1NfTU9ERV9BVURJT19UUkFDSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2tMaXN0LmdldCgwKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9UcmFja0xpc3QuYWRkKG1SZXNvdXJjZXMuZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5NZWRpYUNvbnRyb2xWaWV3Ml9hdWRpb190cmFja19ub25lX3RleHQpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobVZpZGVvVHJhY2tDb3VudCA9PSAwICYmIG1BdWRpb1RyYWNrQ291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFUeXBlID0gTUVESUFfVFlQRV9NVVNJQzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZVRyYWNrQ291bnQgPSBleHRyYXMuZ2V0SW50KEtFWV9TVUJUSVRMRV9UUkFDS19DT1VOVCk7CisgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZURlc2NyaXB0aW9uc0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1TdWJ0aXRsZVRyYWNrQ291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVEZXNjcmlwdGlvbnNMaXN0LmFkZChtUmVzb3VyY2VzLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuTWVkaWFDb250cm9sVmlldzJfc3VidGl0bGVfb2ZmX3RleHQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVN1YnRpdGxlVHJhY2tDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRyYWNrID0gbVJlc291cmNlcy5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5NZWRpYUNvbnRyb2xWaWV3Ml9zdWJ0aXRsZV90cmFja19udW1iZXJfdGV4dCwgaSArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZURlc2NyaXB0aW9uc0xpc3QuYWRkKHRyYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBFVkVOVF9VUERBVEVfTUVESUFfVFlQRV9TVEFUVVM6CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbmV3U3RhdHVzID0gZXh0cmFzLmdldEJvb2xlYW4oS0VZX1NUQVRFX0lTX0FEVkVSVElTRU1FTlQpOworICAgICAgICAgICAgICAgICAgICBpZiAobmV3U3RhdHVzICE9IG1Jc0FkdmVydGlzZW1lbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Jc0FkdmVydGlzZW1lbnQgPSBuZXdTdGF0dXM7CisgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVMYXlvdXQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgU2V0dGluZ3NBZGFwdGVyIGV4dGVuZHMgQmFzZUFkYXB0ZXIgeworICAgICAgICBwcml2YXRlIExpc3Q8SW50ZWdlcj4gbUljb25JZHM7CisgICAgICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1NYWluVGV4dHM7CisgICAgICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1TdWJUZXh0czsKKworICAgICAgICBwdWJsaWMgU2V0dGluZ3NBZGFwdGVyKExpc3Q8U3RyaW5nPiBtYWluVGV4dHMsIEBOdWxsYWJsZSBMaXN0PFN0cmluZz4gc3ViVGV4dHMsCisgICAgICAgICAgICAgICAgQE51bGxhYmxlIExpc3Q8SW50ZWdlcj4gaWNvbklkcykgeworICAgICAgICAgICAgbU1haW5UZXh0cyA9IG1haW5UZXh0czsKKyAgICAgICAgICAgIG1TdWJUZXh0cyA9IHN1YlRleHRzOworICAgICAgICAgICAgbUljb25JZHMgPSBpY29uSWRzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlU3ViVGV4dHMoTGlzdDxTdHJpbmc+IHN1YlRleHRzKSB7CisgICAgICAgICAgICBtU3ViVGV4dHMgPSBzdWJUZXh0czsKKyAgICAgICAgICAgIG5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1haW5UZXh0KGludCBwb3NpdGlvbikgeworICAgICAgICAgICAgaWYgKG1NYWluVGV4dHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA8IG1NYWluVGV4dHMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtTWFpblRleHRzLmdldChwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIFJFU09VUkNFX0VNUFRZOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7CisgICAgICAgICAgICByZXR1cm4gKG1NYWluVGV4dHMgPT0gbnVsbCkgPyAwIDogbU1haW5UZXh0cy5zaXplKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0SXRlbUlkKGludCBwb3NpdGlvbikgeworICAgICAgICAgICAgLy8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWItLWRvZXMgbm90IGhhdmUgYW55IHB1cnBvc2UgaGVyZQorICAgICAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMuCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEl0ZW0oaW50IHBvc2l0aW9uKSB7CisgICAgICAgICAgICAvLyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1Yi0tZG9lcyBub3QgaGF2ZSBhbnkgcHVycG9zZSBoZXJlCisgICAgICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcy4KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWaWV3IGdldFZpZXcoaW50IHBvc2l0aW9uLCBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgY29udGFpbmVyKSB7CisgICAgICAgICAgICBWaWV3IHJvdzsKKyAgICAgICAgICAgIGlmIChtU2l6ZVR5cGUgPT0gU0laRV9UWVBFX0ZVTEwpIHsKKyAgICAgICAgICAgICAgICByb3cgPSBBcGlIZWxwZXIuaW5mbGF0ZUxpYkxheW91dChtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgUi5sYXlvdXQuZnVsbF9zZXR0aW5nc19saXN0X2l0ZW0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByb3cgPSBBcGlIZWxwZXIuaW5mbGF0ZUxpYkxheW91dChtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgUi5sYXlvdXQuZW1iZWRkZWRfc2V0dGluZ3NfbGlzdF9pdGVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRleHRWaWV3IG1haW5UZXh0VmlldyA9IChUZXh0Vmlldykgcm93LmZpbmRWaWV3QnlJZChSLmlkLm1haW5fdGV4dCk7CisgICAgICAgICAgICBUZXh0VmlldyBzdWJUZXh0VmlldyA9IChUZXh0Vmlldykgcm93LmZpbmRWaWV3QnlJZChSLmlkLnN1Yl90ZXh0KTsKKyAgICAgICAgICAgIEltYWdlVmlldyBpY29uVmlldyA9IChJbWFnZVZpZXcpIHJvdy5maW5kVmlld0J5SWQoUi5pZC5pY29uKTsKKworICAgICAgICAgICAgLy8gU2V0IG1haW4gdGV4dAorICAgICAgICAgICAgbWFpblRleHRWaWV3LnNldFRleHQobU1haW5UZXh0cy5nZXQocG9zaXRpb24pKTsKKworICAgICAgICAgICAgLy8gUmVtb3ZlIHN1YiB0ZXh0IGFuZCBjZW50ZXIgdGhlIG1haW4gdGV4dCBpZiBzdWIgdGV4dHMgZG8gbm90IGV4aXN0IGF0IGFsbCBvciB0aGUgc3ViCisgICAgICAgICAgICAvLyB0ZXh0IGF0IHRoaXMgcGFydGljdWxhciBwb3NpdGlvbiBpcyBlbXB0eS4KKyAgICAgICAgICAgIGlmIChtU3ViVGV4dHMgPT0gbnVsbCB8fCBtU3ViVGV4dHMuZ2V0KHBvc2l0aW9uKSA9PSBSRVNPVVJDRV9FTVBUWSkgeworICAgICAgICAgICAgICAgIHN1YlRleHRWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBzZXQgc3ViIHRleHQuCisgICAgICAgICAgICAgICAgc3ViVGV4dFZpZXcuc2V0VGV4dChtU3ViVGV4dHMuZ2V0KHBvc2l0aW9uKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFJlbW92ZSBtYWluIGljb24gYW5kIHNldCB2aXNpYmlsaXR5IHRvIGdvbmUgaWYgaWNvbnMgYXJlIHNldCB0byBudWxsIG9yIHRoZSBpY29uIGF0CisgICAgICAgICAgICAvLyB0aGlzIHBhcnRpY3VsYXIgcG9zaXRpb24gaXMgc2V0IHRvIFJFU09VUkNFX05PTl9FWElTVEVOVC4KKyAgICAgICAgICAgIGlmIChtSWNvbklkcyA9PSBudWxsIHx8IG1JY29uSWRzLmdldChwb3NpdGlvbikgPT0gUkVTT1VSQ0VfTk9OX0VYSVNURU5UKSB7CisgICAgICAgICAgICAgICAgaWNvblZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHNldCBtYWluIGljb24uCisgICAgICAgICAgICAgICAgaWNvblZpZXcuc2V0SW1hZ2VEcmF3YWJsZShtUmVzb3VyY2VzLmdldERyYXdhYmxlKG1JY29uSWRzLmdldChwb3NpdGlvbiksIG51bGwpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByb3c7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRTdWJUZXh0cyhMaXN0PFN0cmluZz4gc3ViVGV4dHMpIHsKKyAgICAgICAgICAgIG1TdWJUZXh0cyA9IHN1YlRleHRzOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVE9ETzogZXh0ZW5kIHRoaXMgY2xhc3MgZnJvbSBTZXR0aW5nc0FkYXB0ZXIKKyAgICBwcml2YXRlIGNsYXNzIFN1YlNldHRpbmdzQWRhcHRlciBleHRlbmRzIEJhc2VBZGFwdGVyIHsKKyAgICAgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVRleHRzOworICAgICAgICBwcml2YXRlIGludCBtQ2hlY2tQb3NpdGlvbjsKKworICAgICAgICBwdWJsaWMgU3ViU2V0dGluZ3NBZGFwdGVyKExpc3Q8U3RyaW5nPiB0ZXh0cywgaW50IGNoZWNrUG9zaXRpb24pIHsKKyAgICAgICAgICAgIG1UZXh0cyA9IHRleHRzOworICAgICAgICAgICAgbUNoZWNrUG9zaXRpb24gPSBjaGVja1Bvc2l0aW9uOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRNYWluVGV4dChpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIGlmIChtVGV4dHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA8IG1UZXh0cy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1UZXh0cy5nZXQocG9zaXRpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBSRVNPVVJDRV9FTVBUWTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGdldENvdW50KCkgeworICAgICAgICAgICAgcmV0dXJuIChtVGV4dHMgPT0gbnVsbCkgPyAwIDogbVRleHRzLnNpemUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRJdGVtSWQoaW50IHBvc2l0aW9uKSB7CisgICAgICAgICAgICAvLyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1Yi0tZG9lcyBub3QgaGF2ZSBhbnkgcHVycG9zZSBoZXJlCisgICAgICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcy4KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0SXRlbShpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIC8vIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViLS1kb2VzIG5vdCBoYXZlIGFueSBwdXJwb3NlIGhlcmUKKyAgICAgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzLgorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFZpZXcgZ2V0VmlldyhpbnQgcG9zaXRpb24sIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBjb250YWluZXIpIHsKKyAgICAgICAgICAgIFZpZXcgcm93OworICAgICAgICAgICAgaWYgKG1TaXplVHlwZSA9PSBTSVpFX1RZUEVfRlVMTCkgeworICAgICAgICAgICAgICAgIHJvdyA9IEFwaUhlbHBlci5pbmZsYXRlTGliTGF5b3V0KG1JbnN0YW5jZS5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBSLmxheW91dC5mdWxsX3N1Yl9zZXR0aW5nc19saXN0X2l0ZW0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByb3cgPSBBcGlIZWxwZXIuaW5mbGF0ZUxpYkxheW91dChtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgUi5sYXlvdXQuZW1iZWRkZWRfc3ViX3NldHRpbmdzX2xpc3RfaXRlbSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUZXh0VmlldyB0ZXh0VmlldyA9IChUZXh0Vmlldykgcm93LmZpbmRWaWV3QnlJZChSLmlkLnRleHQpOworICAgICAgICAgICAgSW1hZ2VWaWV3IGNoZWNrVmlldyA9IChJbWFnZVZpZXcpIHJvdy5maW5kVmlld0J5SWQoUi5pZC5jaGVjayk7CisKKyAgICAgICAgICAgIHRleHRWaWV3LnNldFRleHQobVRleHRzLmdldChwb3NpdGlvbikpOworICAgICAgICAgICAgaWYgKHBvc2l0aW9uICE9IG1DaGVja1Bvc2l0aW9uKSB7CisgICAgICAgICAgICAgICAgY2hlY2tWaWV3LnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJvdzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFRleHRzKExpc3Q8U3RyaW5nPiB0ZXh0cykgeworICAgICAgICAgICAgbVRleHRzID0gdGV4dHM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRDaGVja1Bvc2l0aW9uKGludCBjaGVja1Bvc2l0aW9uKSB7CisgICAgICAgICAgICBtQ2hlY2tQb3NpdGlvbiA9IGNoZWNrUG9zaXRpb247CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9TdWJ0aXRsZVZpZXcuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1N1YnRpdGxlVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YjJjZDEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9TdWJ0aXRsZVZpZXcuamF2YQpAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC53aWRnZXQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OworCitpbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuc3VidGl0bGUuU3VidGl0bGVDb250cm9sbGVyLkFuY2hvcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5zdWJ0aXRsZS5TdWJ0aXRsZVRyYWNrLlJlbmRlcmluZ1dpZGdldDsKKworY2xhc3MgU3VidGl0bGVWaWV3IGV4dGVuZHMgRnJhbWVMYXlvdXQgaW1wbGVtZW50cyBBbmNob3IgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3VidGl0bGVWaWV3IjsKKworICAgIHByaXZhdGUgUmVuZGVyaW5nV2lkZ2V0IG1TdWJ0aXRsZVdpZGdldDsKKyAgICBwcml2YXRlIFJlbmRlcmluZ1dpZGdldC5PbkNoYW5nZWRMaXN0ZW5lciBtU3VidGl0bGVzQ2hhbmdlZExpc3RlbmVyOworCisgICAgcHVibGljIFN1YnRpdGxlVmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3VidGl0bGVWaWV3KENvbnRleHQgY29udGV4dCwgQE51bGxhYmxlIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3VidGl0bGVWaWV3KENvbnRleHQgY29udGV4dCwgQE51bGxhYmxlIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0cikgeworICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIsIDApOworICAgIH0KKworICAgIHB1YmxpYyBTdWJ0aXRsZVZpZXcoCisgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIEBOdWxsYWJsZSBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsIGludCBkZWZTdHlsZVJlcykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyLCBkZWZTdHlsZVJlcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0U3VidGl0bGVXaWRnZXQoUmVuZGVyaW5nV2lkZ2V0IHN1YnRpdGxlV2lkZ2V0KSB7CisgICAgICAgIGlmIChtU3VidGl0bGVXaWRnZXQgPT0gc3VidGl0bGVXaWRnZXQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGJvb2xlYW4gYXR0YWNoZWRUb1dpbmRvdyA9IGlzQXR0YWNoZWRUb1dpbmRvdygpOworICAgICAgICBpZiAobVN1YnRpdGxlV2lkZ2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChhdHRhY2hlZFRvV2luZG93KSB7CisgICAgICAgICAgICAgICAgbVN1YnRpdGxlV2lkZ2V0Lm9uRGV0YWNoZWRGcm9tV2luZG93KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1TdWJ0aXRsZVdpZGdldC5zZXRPbkNoYW5nZWRMaXN0ZW5lcihudWxsKTsKKyAgICAgICAgfQorICAgICAgICBtU3VidGl0bGVXaWRnZXQgPSBzdWJ0aXRsZVdpZGdldDsKKworICAgICAgICBpZiAoc3VidGl0bGVXaWRnZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG1TdWJ0aXRsZXNDaGFuZ2VkTGlzdGVuZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1TdWJ0aXRsZXNDaGFuZ2VkTGlzdGVuZXIgPSBuZXcgUmVuZGVyaW5nV2lkZ2V0Lk9uQ2hhbmdlZExpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DaGFuZ2VkKFJlbmRlcmluZ1dpZGdldCByZW5kZXJpbmdXaWRnZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNldFdpbGxOb3REcmF3KGZhbHNlKTsKKyAgICAgICAgICAgIHN1YnRpdGxlV2lkZ2V0LnNldE9uQ2hhbmdlZExpc3RlbmVyKG1TdWJ0aXRsZXNDaGFuZ2VkTGlzdGVuZXIpOworCisgICAgICAgICAgICBpZiAoYXR0YWNoZWRUb1dpbmRvdykgeworICAgICAgICAgICAgICAgIHN1YnRpdGxlV2lkZ2V0Lm9uQXR0YWNoZWRUb1dpbmRvdygpOworICAgICAgICAgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNldFdpbGxOb3REcmF3KHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgaW52YWxpZGF0ZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMb29wZXIgZ2V0U3VidGl0bGVMb29wZXIoKSB7CisgICAgICAgIHJldHVybiBMb29wZXIuZ2V0TWFpbkxvb3BlcigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQXR0YWNoZWRUb1dpbmRvdygpIHsKKyAgICAgICAgc3VwZXIub25BdHRhY2hlZFRvV2luZG93KCk7CisKKyAgICAgICAgaWYgKG1TdWJ0aXRsZVdpZGdldCAhPSBudWxsKSB7CisgICAgICAgICAgICBtU3VidGl0bGVXaWRnZXQub25BdHRhY2hlZFRvV2luZG93KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKKyAgICAgICAgc3VwZXIub25EZXRhY2hlZEZyb21XaW5kb3coKTsKKworICAgICAgICBpZiAobVN1YnRpdGxlV2lkZ2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TdWJ0aXRsZVdpZGdldC5vbkRldGFjaGVkRnJvbVdpbmRvdygpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25MYXlvdXQoYm9vbGVhbiBjaGFuZ2VkLCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tKSB7CisgICAgICAgIHN1cGVyLm9uTGF5b3V0KGNoYW5nZWQsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisKKyAgICAgICAgaWYgKG1TdWJ0aXRsZVdpZGdldCAhPSBudWxsKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgd2lkdGggPSBnZXRXaWR0aCgpIC0gZ2V0UGFkZGluZ0xlZnQoKSAtIGdldFBhZGRpbmdSaWdodCgpOworICAgICAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IGdldEhlaWdodCgpIC0gZ2V0UGFkZGluZ1RvcCgpIC0gZ2V0UGFkZGluZ0JvdHRvbSgpOworCisgICAgICAgICAgICBtU3VidGl0bGVXaWRnZXQuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICBzdXBlci5kcmF3KGNhbnZhcyk7CisKKyAgICAgICAgaWYgKG1TdWJ0aXRsZVdpZGdldCAhPSBudWxsKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgc2F2ZUNvdW50ID0gY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoZ2V0UGFkZGluZ0xlZnQoKSwgZ2V0UGFkZGluZ1RvcCgpKTsKKyAgICAgICAgICAgIG1TdWJ0aXRsZVdpZGdldC5kcmF3KGNhbnZhcyk7CisgICAgICAgICAgICBjYW52YXMucmVzdG9yZVRvQ291bnQoc2F2ZUNvdW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0QWNjZXNzaWJpbGl0eUNsYXNzTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIFN1YnRpdGxlVmlldy5jbGFzcy5nZXROYW1lKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9TdXJmYWNlVmlldy5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9TdXJmYWNlVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjOTJlODUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1N1cmZhY2VWaWV3LmphdmEKQEAgLTAsMCArMSwxOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQud2lkZ2V0OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLndpZGdldC5WaWRlb1ZpZXcyLlZJRVdfVFlQRV9TVVJGQUNFVklFVzsKKworY2xhc3MgVmlkZW9TdXJmYWNlVmlldyBleHRlbmRzIFN1cmZhY2VWaWV3IGltcGxlbWVudHMgVmlkZW9WaWV3SW50ZXJmYWNlLCBTdXJmYWNlSG9sZGVyLkNhbGxiYWNrIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlZpZGVvU3VyZmFjZVZpZXciOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSB0cnVlOyAvLyBTVE9QU0hJUDogTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpOworICAgIHByaXZhdGUgU3VyZmFjZUhvbGRlciBtU3VyZmFjZUhvbGRlciA9IG51bGw7CisgICAgcHJpdmF0ZSBTdXJmYWNlTGlzdGVuZXIgbVN1cmZhY2VMaXN0ZW5lciA9IG51bGw7CisgICAgcHJpdmF0ZSBNZWRpYVBsYXllcjIgbU1lZGlhUGxheWVyOworICAgIC8vIEEgZmxhZyB0byBpbmRpY2F0ZSB0YWtpbmcgb3ZlciBvdGhlciB2aWV3IHNob3VsZCBiZSBwcm9jZWVkLgorICAgIHByaXZhdGUgYm9vbGVhbiBtSXNUYWtpbmdPdmVyT2xkVmlldzsKKyAgICBwcml2YXRlIFZpZGVvVmlld0ludGVyZmFjZSBtT2xkVmlldzsKKworCisgICAgcHVibGljIFZpZGVvU3VyZmFjZVZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIFZpZGVvU3VyZmFjZVZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgMCk7CisgICAgfQorCisgICAgcHVibGljIFZpZGVvU3VyZmFjZVZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyLCAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmlkZW9TdXJmYWNlVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVmU3R5bGVSZXMpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0ciwgZGVmU3R5bGVSZXMpOworICAgICAgICBnZXRIb2xkZXIoKS5hZGRDYWxsYmFjayh0aGlzKTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gaW1wbGVtZW50cyBWaWRlb1ZpZXdJbnRlcmZhY2UKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBhc3NpZ25TdXJmYWNlVG9NZWRpYVBsYXllcihNZWRpYVBsYXllcjIgbXApIHsKKyAgICAgICAgTG9nLmQoVEFHLCAiYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIoKTogbVN1cmZhY2VIb2xkZXI6ICIgKyBtU3VyZmFjZUhvbGRlcik7CisgICAgICAgIGlmIChtcCA9PSBudWxsIHx8ICFoYXNBdmFpbGFibGVTdXJmYWNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBtcC5zZXREaXNwbGF5KG1TdXJmYWNlSG9sZGVyKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0U3VyZmFjZUxpc3RlbmVyKFN1cmZhY2VMaXN0ZW5lciBsKSB7CisgICAgICAgIG1TdXJmYWNlTGlzdGVuZXIgPSBsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0Vmlld1R5cGUoKSB7CisgICAgICAgIHJldHVybiBWSUVXX1RZUEVfU1VSRkFDRVZJRVc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0TWVkaWFQbGF5ZXIoTWVkaWFQbGF5ZXIyIG1wKSB7CisgICAgICAgIG1NZWRpYVBsYXllciA9IG1wOworICAgICAgICBpZiAobUlzVGFraW5nT3Zlck9sZFZpZXcpIHsKKyAgICAgICAgICAgIHRha2VPdmVyKG1PbGRWaWV3KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRha2VPdmVyKEBOb25OdWxsIFZpZGVvVmlld0ludGVyZmFjZSBvbGRWaWV3KSB7CisgICAgICAgIGlmIChhc3NpZ25TdXJmYWNlVG9NZWRpYVBsYXllcihtTWVkaWFQbGF5ZXIpKSB7CisgICAgICAgICAgICAoKFZpZXcpIG9sZFZpZXcpLnNldFZpc2liaWxpdHkoR09ORSk7CisgICAgICAgICAgICBtSXNUYWtpbmdPdmVyT2xkVmlldyA9IGZhbHNlOworICAgICAgICAgICAgbU9sZFZpZXcgPSBudWxsOworICAgICAgICAgICAgaWYgKG1TdXJmYWNlTGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1TdXJmYWNlTGlzdGVuZXIub25TdXJmYWNlVGFrZU92ZXJEb25lKHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUlzVGFraW5nT3Zlck9sZFZpZXcgPSB0cnVlOworICAgICAgICAgICAgbU9sZFZpZXcgPSBvbGRWaWV3OworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaGFzQXZhaWxhYmxlU3VyZmFjZSgpIHsKKyAgICAgICAgcmV0dXJuIChtU3VyZmFjZUhvbGRlciAhPSBudWxsICYmIG1TdXJmYWNlSG9sZGVyLmdldFN1cmZhY2UoKSAhPSBudWxsKTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gaW1wbGVtZW50cyBTdXJmYWNlSG9sZGVyLkNhbGxiYWNrCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3VyZmFjZUNyZWF0ZWQoU3VyZmFjZUhvbGRlciBob2xkZXIpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAic3VyZmFjZUNyZWF0ZWQ6IG1TdXJmYWNlSG9sZGVyOiAiICsgbVN1cmZhY2VIb2xkZXIgKyAiLCBuZXcgaG9sZGVyOiAiICsgaG9sZGVyKTsKKyAgICAgICAgbVN1cmZhY2VIb2xkZXIgPSBob2xkZXI7CisgICAgICAgIGlmIChtSXNUYWtpbmdPdmVyT2xkVmlldykgeworICAgICAgICAgICAgdGFrZU92ZXIobU9sZFZpZXcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIobU1lZGlhUGxheWVyKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtU3VyZmFjZUxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIFJlY3QgcmVjdCA9IG1TdXJmYWNlSG9sZGVyLmdldFN1cmZhY2VGcmFtZSgpOworICAgICAgICAgICAgbVN1cmZhY2VMaXN0ZW5lci5vblN1cmZhY2VDcmVhdGVkKHRoaXMsIHJlY3Qud2lkdGgoKSwgcmVjdC5oZWlnaHQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdXJmYWNlQ2hhbmdlZChTdXJmYWNlSG9sZGVyIGhvbGRlciwgaW50IGZvcm1hdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIGlmIChtU3VyZmFjZUxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TdXJmYWNlTGlzdGVuZXIub25TdXJmYWNlQ2hhbmdlZCh0aGlzLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHN1cmZhY2VEZXN0cm95ZWQoU3VyZmFjZUhvbGRlciBob2xkZXIpIHsKKyAgICAgICAgLy8gQWZ0ZXIgd2UgcmV0dXJuIGZyb20gdGhpcyB3ZSBjYW4ndCB1c2UgdGhlIHN1cmZhY2UgYW55IG1vcmUKKyAgICAgICAgbVN1cmZhY2VIb2xkZXIgPSBudWxsOworICAgICAgICBpZiAobVN1cmZhY2VMaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICBtU3VyZmFjZUxpc3RlbmVyLm9uU3VyZmFjZURlc3Ryb3llZCh0aGlzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRPRE86IEludmVzdGlnYXRlIHRoZSB3YXkgdG8gbW92ZSBvbk1lYXN1cmUoKSBjb2RlIGludG8gRnJhbWVMYXlvdXQuCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKKyAgICAgICAgaW50IHZpZGVvV2lkdGggPSAobU1lZGlhUGxheWVyID09IG51bGwpID8gMCA6IG1NZWRpYVBsYXllci5nZXRWaWRlb1dpZHRoKCk7CisgICAgICAgIGludCB2aWRlb0hlaWdodCA9IChtTWVkaWFQbGF5ZXIgPT0gbnVsbCkgPyAwIDogbU1lZGlhUGxheWVyLmdldFZpZGVvSGVpZ2h0KCk7CisgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAib25NZWFzdXJlKCIgKyBNZWFzdXJlU3BlYy50b1N0cmluZyh3aWR0aE1lYXN1cmVTcGVjKSArICIsICIKKyAgICAgICAgICAgICAgICAgICAgKyBNZWFzdXJlU3BlYy50b1N0cmluZyhoZWlnaHRNZWFzdXJlU3BlYykgKyAiKSIpOworICAgICAgICAgICAgTG9nLmkoVEFHLCAiIG1lYXN1cmVkU2l6ZTogIiArIGdldE1lYXN1cmVkV2lkdGgoKSArICIvIiArIGdldE1lYXN1cmVkSGVpZ2h0KCkpOworICAgICAgICAgICAgTG9nLmkoVEFHLCAiIHZpZXdTaXplOiAiICsgZ2V0V2lkdGgoKSArICIvIiArIGdldEhlaWdodCgpKTsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIiBtVmlkZW9XaWR0aC9oZWlnaHQ6ICIgKyB2aWRlb1dpZHRoICsgIiwgIiArIHZpZGVvSGVpZ2h0KTsKKyAgICAgICAgfQorCisgICAgICAgIGludCB3aWR0aCA9IGdldERlZmF1bHRTaXplKHZpZGVvV2lkdGgsIHdpZHRoTWVhc3VyZVNwZWMpOworICAgICAgICBpbnQgaGVpZ2h0ID0gZ2V0RGVmYXVsdFNpemUodmlkZW9IZWlnaHQsIGhlaWdodE1lYXN1cmVTcGVjKTsKKworICAgICAgICBpZiAodmlkZW9XaWR0aCA+IDAgJiYgdmlkZW9IZWlnaHQgPiAwKSB7CisgICAgICAgICAgICBpbnQgd2lkdGhTcGVjU2l6ZSA9IE1lYXN1cmVTcGVjLmdldFNpemUod2lkdGhNZWFzdXJlU3BlYyk7CisgICAgICAgICAgICBpbnQgaGVpZ2h0U3BlY1NpemUgPSBNZWFzdXJlU3BlYy5nZXRTaXplKGhlaWdodE1lYXN1cmVTcGVjKTsKKworICAgICAgICAgICAgd2lkdGggPSB3aWR0aFNwZWNTaXplOworICAgICAgICAgICAgaGVpZ2h0ID0gaGVpZ2h0U3BlY1NpemU7CisKKyAgICAgICAgICAgIC8vIGZvciBjb21wYXRpYmlsaXR5LCB3ZSBhZGp1c3Qgc2l6ZSBiYXNlZCBvbiBhc3BlY3QgcmF0aW8KKyAgICAgICAgICAgIGlmICh2aWRlb1dpZHRoICogaGVpZ2h0IDwgd2lkdGggKiB2aWRlb0hlaWdodCkgeworICAgICAgICAgICAgICAgIHdpZHRoID0gaGVpZ2h0ICogdmlkZW9XaWR0aCAvIHZpZGVvSGVpZ2h0OworICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJpbWFnZSB0b28gd2lkZSwgY29ycmVjdGluZy4gd2lkdGg6ICIgKyB3aWR0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICh2aWRlb1dpZHRoICogaGVpZ2h0ID4gd2lkdGggKiB2aWRlb0hlaWdodCkgeworICAgICAgICAgICAgICAgIGhlaWdodCA9IHdpZHRoICogdmlkZW9IZWlnaHQgLyB2aWRlb1dpZHRoOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJpbWFnZSB0b28gdGFsbCwgY29ycmVjdGluZy4gaGVpZ2h0OiAiICsgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBubyBzaXplIHlldCwganVzdCBhZG9wdCB0aGUgZ2l2ZW4gc3BlYyBzaXplcworICAgICAgICB9CisgICAgICAgIHNldE1lYXN1cmVkRGltZW5zaW9uKHdpZHRoLCBoZWlnaHQpOworICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgImVuZCBvZiBvbk1lYXN1cmUoKSIpOworICAgICAgICAgICAgTG9nLmkoVEFHLCAiIG1lYXN1cmVkU2l6ZTogIiArIGdldE1lYXN1cmVkV2lkdGgoKSArICIvIiArIGdldE1lYXN1cmVkSGVpZ2h0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJWaWV3VHlwZTogU3VyZmFjZVZpZXcgLyBWaXNpYmlsaXR5OiAiICsgZ2V0VmlzaWJpbGl0eSgpCisgICAgICAgICAgICAgICAgKyAiIC8gc3VyZmFjZUhvbGRlcjogIiArIG1TdXJmYWNlSG9sZGVyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZGVvVGV4dHVyZVZpZXcuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZGVvVGV4dHVyZVZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjRhM2FhCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9UZXh0dXJlVmlldy5qYXZhCkBAIC0wLDAgKzEsMjEwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLndpZGdldDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU3VyZmFjZVRleHR1cmU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjI7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5SZXF1aXJlc0FwaTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2U7CitpbXBvcnQgYW5kcm9pZC52aWV3LlRleHR1cmVWaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQud2lkZ2V0LlZpZGVvVmlldzIuVklFV19UWVBFX1RFWFRVUkVWSUVXOworCitAUmVxdWlyZXNBcGkoMjYpCitjbGFzcyBWaWRlb1RleHR1cmVWaWV3IGV4dGVuZHMgVGV4dHVyZVZpZXcKKyAgICAgICAgaW1wbGVtZW50cyBWaWRlb1ZpZXdJbnRlcmZhY2UsIFRleHR1cmVWaWV3LlN1cmZhY2VUZXh0dXJlTGlzdGVuZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiVmlkZW9UZXh0dXJlVmlldyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7IC8vIFNUT1BTSElQOiBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRyk7CisKKyAgICBwcml2YXRlIFN1cmZhY2VUZXh0dXJlIG1TdXJmYWNlVGV4dHVyZTsKKyAgICBwcml2YXRlIFN1cmZhY2UgbVN1cmZhY2U7CisgICAgcHJpdmF0ZSBTdXJmYWNlTGlzdGVuZXIgbVN1cmZhY2VMaXN0ZW5lcjsKKyAgICBwcml2YXRlIE1lZGlhUGxheWVyMiBtTWVkaWFQbGF5ZXI7CisgICAgLy8gQSBmbGFnIHRvIGluZGljYXRlIHRha2luZyBvdmVyIG90aGVyIHZpZXcgc2hvdWxkIGJlIHByb2NlZWQuCisgICAgcHJpdmF0ZSBib29sZWFuIG1Jc1Rha2luZ092ZXJPbGRWaWV3OworICAgIHByaXZhdGUgVmlkZW9WaWV3SW50ZXJmYWNlIG1PbGRWaWV3OworCisgICAgcHVibGljIFZpZGVvVGV4dHVyZVZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIFZpZGVvVGV4dHVyZVZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgMCk7CisgICAgfQorCisgICAgcHVibGljIFZpZGVvVGV4dHVyZVZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyLCAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmlkZW9UZXh0dXJlVmlldygKKyAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyLCBpbnQgZGVmU3R5bGVSZXMpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0ciwgZGVmU3R5bGVSZXMpOworICAgICAgICBzZXRTdXJmYWNlVGV4dHVyZUxpc3RlbmVyKHRoaXMpOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBpbXBsZW1lbnRzIFZpZGVvVmlld0ludGVyZmFjZQorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGFzc2lnblN1cmZhY2VUb01lZGlhUGxheWVyKE1lZGlhUGxheWVyMiBtcCkgeworICAgICAgICBMb2cuZChUQUcsICJhc3NpZ25TdXJmYWNlVG9NZWRpYVBsYXllcigpOiBtU3VyZmFjZVRleHR1cmU6ICIgKyBtU3VyZmFjZVRleHR1cmUpOworICAgICAgICBpZiAobXAgPT0gbnVsbCB8fCAhaGFzQXZhaWxhYmxlU3VyZmFjZSgpKSB7CisgICAgICAgICAgICAvLyBTdXJmYWNlIGlzIG5vdCByZWFkeS4KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBtcC5zZXRTdXJmYWNlKG1TdXJmYWNlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0U3VyZmFjZUxpc3RlbmVyKFN1cmZhY2VMaXN0ZW5lciBsKSB7CisgICAgICAgIG1TdXJmYWNlTGlzdGVuZXIgPSBsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0Vmlld1R5cGUoKSB7CisgICAgICAgIHJldHVybiBWSUVXX1RZUEVfVEVYVFVSRVZJRVc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0TWVkaWFQbGF5ZXIoTWVkaWFQbGF5ZXIyIG1wKSB7CisgICAgICAgIG1NZWRpYVBsYXllciA9IG1wOworICAgICAgICBpZiAobUlzVGFraW5nT3Zlck9sZFZpZXcpIHsKKyAgICAgICAgICAgIHRha2VPdmVyKG1PbGRWaWV3KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRha2VPdmVyKEBOb25OdWxsIFZpZGVvVmlld0ludGVyZmFjZSBvbGRWaWV3KSB7CisgICAgICAgIGlmIChhc3NpZ25TdXJmYWNlVG9NZWRpYVBsYXllcihtTWVkaWFQbGF5ZXIpKSB7CisgICAgICAgICAgICAoKFZpZXcpIG9sZFZpZXcpLnNldFZpc2liaWxpdHkoR09ORSk7CisgICAgICAgICAgICBtSXNUYWtpbmdPdmVyT2xkVmlldyA9IGZhbHNlOworICAgICAgICAgICAgbU9sZFZpZXcgPSBudWxsOworICAgICAgICAgICAgaWYgKG1TdXJmYWNlTGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1TdXJmYWNlTGlzdGVuZXIub25TdXJmYWNlVGFrZU92ZXJEb25lKHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUlzVGFraW5nT3Zlck9sZFZpZXcgPSB0cnVlOworICAgICAgICAgICAgbU9sZFZpZXcgPSBvbGRWaWV3OworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaGFzQXZhaWxhYmxlU3VyZmFjZSgpIHsKKyAgICAgICAgcmV0dXJuIChtU3VyZmFjZVRleHR1cmUgIT0gbnVsbCAmJiAhbVN1cmZhY2VUZXh0dXJlLmlzUmVsZWFzZWQoKSAmJiBtU3VyZmFjZSAhPSBudWxsKTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gaW1wbGVtZW50cyBUZXh0dXJlVmlldy5TdXJmYWNlVGV4dHVyZUxpc3RlbmVyCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TdXJmYWNlVGV4dHVyZUF2YWlsYWJsZShTdXJmYWNlVGV4dHVyZSBzdXJmYWNlVGV4dHVyZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIExvZy5kKFRBRywgIm9uU3VyZmFjZVRleHR1cmVBdmFpbGFibGU6IG1TdXJmYWNlVGV4dHVyZTogIiArIG1TdXJmYWNlVGV4dHVyZQorICAgICAgICAgICAgICAgICsgIiwgbmV3IHN1cmZhY2U6ICIgKyBzdXJmYWNlVGV4dHVyZSk7CisgICAgICAgIG1TdXJmYWNlVGV4dHVyZSA9IHN1cmZhY2VUZXh0dXJlOworICAgICAgICBtU3VyZmFjZSA9IG5ldyBTdXJmYWNlKG1TdXJmYWNlVGV4dHVyZSk7CisgICAgICAgIGlmIChtSXNUYWtpbmdPdmVyT2xkVmlldykgeworICAgICAgICAgICAgdGFrZU92ZXIobU9sZFZpZXcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIobU1lZGlhUGxheWVyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobVN1cmZhY2VMaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICBtU3VyZmFjZUxpc3RlbmVyLm9uU3VyZmFjZUNyZWF0ZWQodGhpcywgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VUZXh0dXJlU2l6ZUNoYW5nZWQoU3VyZmFjZVRleHR1cmUgc3VyZmFjZVRleHR1cmUsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICBpZiAobVN1cmZhY2VMaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICBtU3VyZmFjZUxpc3RlbmVyLm9uU3VyZmFjZUNoYW5nZWQodGhpcywgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gcmVxdWVzdExheW91dCgpOyAgLy8gVE9ETzogZmlndXJlIG91dCBpZiBpdCBzaG91bGQgYmUgY2FsbGVkIGhlcmU/CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TdXJmYWNlVGV4dHVyZVVwZGF0ZWQoU3VyZmFjZVRleHR1cmUgc3VyZmFjZSkgeworICAgICAgICAvLyBuby1vcAorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uU3VyZmFjZVRleHR1cmVEZXN0cm95ZWQoU3VyZmFjZVRleHR1cmUgc3VyZmFjZVRleHR1cmUpIHsKKyAgICAgICAgaWYgKG1TdXJmYWNlTGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVN1cmZhY2VMaXN0ZW5lci5vblN1cmZhY2VEZXN0cm95ZWQodGhpcyk7CisgICAgICAgIH0KKyAgICAgICAgbVN1cmZhY2VUZXh0dXJlID0gbnVsbDsKKyAgICAgICAgbVN1cmZhY2UgPSBudWxsOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgeworICAgICAgICBpbnQgdmlkZW9XaWR0aCA9IChtTWVkaWFQbGF5ZXIgPT0gbnVsbCkgPyAwIDogbU1lZGlhUGxheWVyLmdldFZpZGVvV2lkdGgoKTsKKyAgICAgICAgaW50IHZpZGVvSGVpZ2h0ID0gKG1NZWRpYVBsYXllciA9PSBudWxsKSA/IDAgOiBtTWVkaWFQbGF5ZXIuZ2V0VmlkZW9IZWlnaHQoKTsKKyAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJvbk1lYXN1cmUoIiArIE1lYXN1cmVTcGVjLnRvU3RyaW5nKHdpZHRoTWVhc3VyZVNwZWMpICsgIiwgIgorICAgICAgICAgICAgICAgICAgICArIE1lYXN1cmVTcGVjLnRvU3RyaW5nKGhlaWdodE1lYXN1cmVTcGVjKSArICIpIik7CisgICAgICAgICAgICBMb2cuaShUQUcsICIgbWVhc3VyZWRTaXplOiAiICsgZ2V0TWVhc3VyZWRXaWR0aCgpICsgIi8iICsgZ2V0TWVhc3VyZWRIZWlnaHQoKSk7CisgICAgICAgICAgICBMb2cuaShUQUcsICIgdmlld1NpemU6ICIgKyBnZXRXaWR0aCgpICsgIi8iICsgZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgTG9nLmkoVEFHLCAiIG1WaWRlb1dpZHRoL2hlaWdodDogIiArIHZpZGVvV2lkdGggKyAiLCAiICsgdmlkZW9IZWlnaHQpOworICAgICAgICB9CisKKyAgICAgICAgaW50IHdpZHRoID0gZ2V0RGVmYXVsdFNpemUodmlkZW9XaWR0aCwgd2lkdGhNZWFzdXJlU3BlYyk7CisgICAgICAgIGludCBoZWlnaHQgPSBnZXREZWZhdWx0U2l6ZSh2aWRlb0hlaWdodCwgaGVpZ2h0TWVhc3VyZVNwZWMpOworCisgICAgICAgIGlmICh2aWRlb1dpZHRoID4gMCAmJiB2aWRlb0hlaWdodCA+IDApIHsKKyAgICAgICAgICAgIGludCB3aWR0aFNwZWNTaXplID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZSh3aWR0aE1lYXN1cmVTcGVjKTsKKyAgICAgICAgICAgIGludCBoZWlnaHRTcGVjU2l6ZSA9IE1lYXN1cmVTcGVjLmdldFNpemUoaGVpZ2h0TWVhc3VyZVNwZWMpOworCisgICAgICAgICAgICB3aWR0aCA9IHdpZHRoU3BlY1NpemU7CisgICAgICAgICAgICBoZWlnaHQgPSBoZWlnaHRTcGVjU2l6ZTsKKworICAgICAgICAgICAgLy8gZm9yIGNvbXBhdGliaWxpdHksIHdlIGFkanVzdCBzaXplIGJhc2VkIG9uIGFzcGVjdCByYXRpbworICAgICAgICAgICAgaWYgKHZpZGVvV2lkdGggKiBoZWlnaHQgPCB3aWR0aCAqIHZpZGVvSGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgd2lkdGggPSBoZWlnaHQgKiB2aWRlb1dpZHRoIC8gdmlkZW9IZWlnaHQ7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImltYWdlIHRvbyB3aWRlLCBjb3JyZWN0aW5nLiB3aWR0aDogIiArIHdpZHRoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHZpZGVvV2lkdGggKiBoZWlnaHQgPiB3aWR0aCAqIHZpZGVvSGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgaGVpZ2h0ID0gd2lkdGggKiB2aWRlb0hlaWdodCAvIHZpZGVvV2lkdGg7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImltYWdlIHRvbyB0YWxsLCBjb3JyZWN0aW5nLiBoZWlnaHQ6ICIgKyBoZWlnaHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIG5vIHNpemUgeWV0LCBqdXN0IGFkb3B0IHRoZSBnaXZlbiBzcGVjIHNpemVzCisgICAgICAgIH0KKyAgICAgICAgc2V0TWVhc3VyZWREaW1lbnNpb24od2lkdGgsIGhlaWdodCk7CisgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLmkoVEFHLCAiZW5kIG9mIG9uTWVhc3VyZSgpIik7CisgICAgICAgICAgICBMb2cuaShUQUcsICIgbWVhc3VyZWRTaXplOiAiICsgZ2V0TWVhc3VyZWRXaWR0aCgpICsgIi8iICsgZ2V0TWVhc3VyZWRIZWlnaHQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIlZpZXdUeXBlOiBUZXh0dXJlVmlldyAvIFZpc2liaWxpdHk6ICIgKyBnZXRWaXNpYmlsaXR5KCkKKyAgICAgICAgICAgICAgICArICIgLyBzdXJmYWNlVGV4dHVyZTogIiArIG1TdXJmYWNlVGV4dHVyZTsKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZGVvVmlldzJJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1ZpZXcySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3Mjc5ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1ZpZXcySW1wbC5qYXZhCkBAIC0wLDAgKzEsMTQwNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC53aWRnZXQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlczsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvRm9jdXNSZXF1ZXN0OworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuRGF0YVNvdXJjZURlc2M7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyLk1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2s7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjIuT25TdWJ0aXRsZURhdGFMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyMkltcGw7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5TdWJ0aXRsZURhdGE7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhUmV0cmlldmVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWV0YWRhdGE7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5QbGF5YmFja1BhcmFtczsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlRpbWVkVGV4dDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uTWVkaWFDb250cm9sbGVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYUNvbnRyb2xsZXIuUGxheWJhY2tJbmZvOworaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb247CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLlBsYXliYWNrU3RhdGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yOworaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlZpZGVvVmlldzJQcm92aWRlcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5WaWV3R3JvdXBQcm92aWRlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Rhc2s7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwLkxheW91dFBhcmFtczsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTWVkaWFDb250cm9sVmlldzI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVmlkZW9WaWV3MjsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmdyYXBoaWNzLnBhbGV0dGUuUGFsZXR0ZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5Sb3V0ZVBsYXllcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5zdWJ0aXRsZS5DbG9zZWRDYXB0aW9uUmVuZGVyZXI7CitpbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuc3VidGl0bGUuU3VidGl0bGVDb250cm9sbGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnN1YnRpdGxlLlN1YnRpdGxlVHJhY2s7CitpbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLkFwaUhlbHBlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuUjsKK2ltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhSXRlbVN0YXR1czsKK2ltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhQ29udHJvbEludGVudDsKK2ltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVNlbGVjdG9yOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOworCitwdWJsaWMgY2xhc3MgVmlkZW9WaWV3MkltcGwgZXh0ZW5kcyBCYXNlTGF5b3V0CisgICAgICAgIGltcGxlbWVudHMgVmlkZW9WaWV3MlByb3ZpZGVyLCBWaWRlb1ZpZXdJbnRlcmZhY2UuU3VyZmFjZUxpc3RlbmVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlZpZGVvVmlldzIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSB0cnVlOyAvLyBTVE9QU0hJUDogTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgREVGQVVMVF9TSE9XX0NPTlRST0xMRVJfSU5URVJWQUxfTVMgPSAyMDAwOworCisgICAgcHJpdmF0ZSBmaW5hbCBWaWRlb1ZpZXcyIG1JbnN0YW5jZTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9FUlJPUiA9IC0xOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9JRExFID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUFJFUEFSSU5HID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUFJFUEFSRUQgPSAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9QTEFZSU5HID0gMzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUEFVU0VEID0gNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUExBWUJBQ0tfQ09NUExFVEVEID0gNTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX1RSQUNLX0lOREVYID0gLTE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgSU5WQUxJRF9TUEVFRCA9IDBmOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWkVfVFlQRV9FTUJFRERFRCA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWkVfVFlQRV9GVUxMID0gMTsKKyAgICAvLyBUT0RPOiBhZGQgc3VwcG9ydCBmb3IgTWluaW1hbCBzaXplIHR5cGUuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWkVfVFlQRV9NSU5JTUFMID0gMjsKKworICAgIHByaXZhdGUgQWNjZXNzaWJpbGl0eU1hbmFnZXIgbUFjY2Vzc2liaWxpdHlNYW5hZ2VyOworICAgIHByaXZhdGUgQXVkaW9NYW5hZ2VyIG1BdWRpb01hbmFnZXI7CisgICAgcHJpdmF0ZSBBdWRpb0F0dHJpYnV0ZXMgbUF1ZGlvQXR0cmlidXRlczsKKyAgICBwcml2YXRlIGludCBtQXVkaW9Gb2N1c1R5cGUgPSBBdWRpb01hbmFnZXIuQVVESU9GT0NVU19HQUlOOyAvLyBsZWdhY3kgZm9jdXMgZ2FpbgorCisgICAgcHJpdmF0ZSBQYWlyPEV4ZWN1dG9yLCBWaWRlb1ZpZXcyLk9uQ3VzdG9tQWN0aW9uTGlzdGVuZXI+IG1DdXN0b21BY3Rpb25MaXN0ZW5lclJlY29yZDsKKyAgICBwcml2YXRlIFZpZGVvVmlldzIuT25WaWV3VHlwZUNoYW5nZWRMaXN0ZW5lciBtVmlld1R5cGVDaGFuZ2VkTGlzdGVuZXI7CisgICAgcHJpdmF0ZSBWaWRlb1ZpZXcyLk9uRnVsbFNjcmVlblJlcXVlc3RMaXN0ZW5lciBtRnVsbFNjcmVlblJlcXVlc3RMaXN0ZW5lcjsKKworICAgIHByaXZhdGUgVmlkZW9WaWV3SW50ZXJmYWNlIG1DdXJyZW50VmlldzsKKyAgICBwcml2YXRlIFZpZGVvVGV4dHVyZVZpZXcgbVRleHR1cmVWaWV3OworICAgIHByaXZhdGUgVmlkZW9TdXJmYWNlVmlldyBtU3VyZmFjZVZpZXc7CisKKyAgICBwcml2YXRlIE1lZGlhUGxheWVyMiBtTWVkaWFQbGF5ZXI7CisgICAgcHJpdmF0ZSBEYXRhU291cmNlRGVzYyBtRHNkOworICAgIHByaXZhdGUgTWVkaWFDb250cm9sVmlldzIgbU1lZGlhQ29udHJvbFZpZXc7CisgICAgcHJpdmF0ZSBNZWRpYVNlc3Npb24gbU1lZGlhU2Vzc2lvbjsKKyAgICBwcml2YXRlIE1lZGlhQ29udHJvbGxlciBtTWVkaWFDb250cm9sbGVyOworICAgIHByaXZhdGUgTWV0YWRhdGEgbU1ldGFkYXRhOworICAgIHByaXZhdGUgTWVkaWFNZXRhZGF0YTIgbU1lZGlhTWV0YWRhdGE7CisgICAgcHJpdmF0ZSBNZWRpYU1ldGFkYXRhUmV0cmlldmVyIG1SZXRyaWV2ZXI7CisgICAgcHJpdmF0ZSBib29sZWFuIG1OZWVkVXBkYXRlTWVkaWFUeXBlOworICAgIHByaXZhdGUgQnVuZGxlIG1NZWRpYVR5cGVEYXRhOworICAgIHByaXZhdGUgU3RyaW5nIG1UaXRsZTsKKworICAgIC8vIFRPRE86IG1vdmUgbXVzaWMgdmlldyBpbnNpZGUgU3VyZmFjZVZpZXcvVGV4dHVyZVZpZXcgb3IgaW1wbGVtZW50IFZpZGVvVmlld0ludGVyZmFjZS4KKyAgICBwcml2YXRlIFdpbmRvd01hbmFnZXIgbU1hbmFnZXI7CisgICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlc291cmNlczsKKyAgICBwcml2YXRlIFZpZXcgbU11c2ljVmlldzsKKyAgICBwcml2YXRlIERyYXdhYmxlIG1NdXNpY0FsYnVtRHJhd2FibGU7CisgICAgcHJpdmF0ZSBTdHJpbmcgbU11c2ljVGl0bGVUZXh0OworICAgIHByaXZhdGUgU3RyaW5nIG1NdXNpY0FydGlzdFRleHQ7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Jc011c2ljTWVkaWFUeXBlOworICAgIHByaXZhdGUgaW50IG1QcmV2V2lkdGg7CisgICAgcHJpdmF0ZSBpbnQgbVByZXZIZWlnaHQ7CisgICAgcHJpdmF0ZSBpbnQgbURvbWluYW50Q29sb3I7CisgICAgcHJpdmF0ZSBpbnQgbVNpemVUeXBlOworCisgICAgcHJpdmF0ZSBQbGF5YmFja1N0YXRlLkJ1aWxkZXIgbVN0YXRlQnVpbGRlcjsKKyAgICBwcml2YXRlIExpc3Q8UGxheWJhY2tTdGF0ZS5DdXN0b21BY3Rpb24+IG1DdXN0b21BY3Rpb25MaXN0OworICAgIHByaXZhdGUgaW50IG1UYXJnZXRTdGF0ZSA9IFNUQVRFX0lETEU7CisgICAgcHJpdmF0ZSBpbnQgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX0lETEU7CisgICAgcHJpdmF0ZSBpbnQgbUN1cnJlbnRCdWZmZXJQZXJjZW50YWdlOworICAgIHByaXZhdGUgbG9uZyBtU2Vla1doZW5QcmVwYXJlZDsgIC8vIHJlY29yZGluZyB0aGUgc2VlayBwb3NpdGlvbiB3aGlsZSBwcmVwYXJpbmcKKworICAgIHByaXZhdGUgaW50IG1WaWRlb1dpZHRoOworICAgIHByaXZhdGUgaW50IG1WaWRlb0hlaWdodDsKKworICAgIHByaXZhdGUgQXJyYXlMaXN0PEludGVnZXI+IG1WaWRlb1RyYWNrSW5kaWNlczsKKyAgICBwcml2YXRlIEFycmF5TGlzdDxJbnRlZ2VyPiBtQXVkaW9UcmFja0luZGljZXM7CisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8UGFpcjxJbnRlZ2VyLCBTdWJ0aXRsZVRyYWNrPj4gbVN1YnRpdGxlVHJhY2tJbmRpY2VzOworICAgIHByaXZhdGUgU3VidGl0bGVDb250cm9sbGVyIG1TdWJ0aXRsZUNvbnRyb2xsZXI7CisKKyAgICAvLyBzZWxlY3RlZCB2aWRlby9hdWRpby9zdWJ0aXRsZSB0cmFjayBpbmRleCBhcyBNZWRpYVBsYXllcjIgcmV0dXJucworICAgIHByaXZhdGUgaW50IG1TZWxlY3RlZFZpZGVvVHJhY2tJbmRleDsKKyAgICBwcml2YXRlIGludCBtU2VsZWN0ZWRBdWRpb1RyYWNrSW5kZXg7CisgICAgcHJpdmF0ZSBpbnQgbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4OworCisgICAgcHJpdmF0ZSBTdWJ0aXRsZVZpZXcgbVN1YnRpdGxlVmlldzsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVN1YnRpdGxlRW5hYmxlZDsKKworICAgIHByaXZhdGUgZmxvYXQgbVNwZWVkOworICAgIC8vIFRPRE86IFJlbW92ZSBtRmFsbGJhY2tTcGVlZCB3aGVuIGludGVncmF0aW9uIHdpdGggTWVkaWFQbGF5ZXIyJ3MgbmV3IHNldFBsYXliYWNrUGFyYW1zKCkuCisgICAgLy8gUmVmZXI6IGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2RvY3VtZW50L2QvMW56QWZuczZpMmhKM1JrYVVyZTNRTVQ2d3NEZWRKNU9OTGlBX09PQkZGWDgvZWRpdAorICAgIHByaXZhdGUgZmxvYXQgbUZhbGxiYWNrU3BlZWQ7ICAvLyBrZWVwIHRoZSBvcmlnaW5hbCBzcGVlZCBiZWZvcmUgJ3BhdXNlJyBpcyBjYWxsZWQuCisgICAgcHJpdmF0ZSBmbG9hdCBtVm9sdW1lTGV2ZWxGbG9hdDsKKyAgICBwcml2YXRlIGludCBtVm9sdW1lTGV2ZWw7CisKKyAgICBwcml2YXRlIGxvbmcgbVNob3dDb250cm9sbGVySW50ZXJ2YWxNczsKKworICAgIHByaXZhdGUgTWVkaWFSb3V0ZXIgbU1lZGlhUm91dGVyOworICAgIHByaXZhdGUgTWVkaWFSb3V0ZVNlbGVjdG9yIG1Sb3V0ZVNlbGVjdG9yOworICAgIHByaXZhdGUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIG1Sb3V0ZTsKKyAgICBwcml2YXRlIFJvdXRlUGxheWVyIG1Sb3V0ZVBsYXllcjsKKworICAgIHByaXZhdGUgZmluYWwgTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgbVJvdXRlckNhbGxiYWNrID0gbmV3IE1lZGlhUm91dGVyLkNhbGxiYWNrKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVNlbGVjdGVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7CisgICAgICAgICAgICBpZiAocm91dGUuc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX1JFTU9URV9QTEFZQkFDSykpIHsKKyAgICAgICAgICAgICAgICAvLyBTdG9wIGxvY2FsIHBsYXliYWNrIChpZiBuZWNlc3NhcnkpCisgICAgICAgICAgICAgICAgcmVzZXRQbGF5ZXIoKTsKKyAgICAgICAgICAgICAgICBtUm91dGUgPSByb3V0ZTsKKyAgICAgICAgICAgICAgICBtUm91dGVQbGF5ZXIgPSBuZXcgUm91dGVQbGF5ZXIobUluc3RhbmNlLmdldENvbnRleHQoKSwgcm91dGUpOworICAgICAgICAgICAgICAgIG1Sb3V0ZVBsYXllci5zZXRQbGF5ZXJFdmVudENhbGxiYWNrKG5ldyBSb3V0ZVBsYXllci5QbGF5ZXJFdmVudENhbGxiYWNrKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25QbGF5ZXJTdGF0ZUNoYW5nZWQoTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBsYXliYWNrU3RhdGUuQnVpbGRlciBwc0J1aWxkZXIgPSBuZXcgUGxheWJhY2tTdGF0ZS5CdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwc0J1aWxkZXIuc2V0QWN0aW9ucyhSb3V0ZVBsYXllci5QTEFZQkFDS19BQ1RJT05TKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgcG9zaXRpb24gPSBpdGVtU3RhdHVzLmdldENvbnRlbnRQb3NpdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChpdGVtU3RhdHVzLmdldFBsYXliYWNrU3RhdGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFJdGVtU3RhdHVzLlBMQVlCQUNLX1NUQVRFX1BFTkRJTkc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzQnVpbGRlci5zZXRTdGF0ZShQbGF5YmFja1N0YXRlLlNUQVRFX05PTkUsIHBvc2l0aW9uLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX0lETEU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFJdGVtU3RhdHVzLlBMQVlCQUNLX1NUQVRFX1BMQVlJTkc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzQnVpbGRlci5zZXRTdGF0ZShQbGF5YmFja1N0YXRlLlNUQVRFX1BMQVlJTkcsIHBvc2l0aW9uLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX1BMQVlJTkc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFJdGVtU3RhdHVzLlBMQVlCQUNLX1NUQVRFX1BBVVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNCdWlsZGVyLnNldFN0YXRlKFBsYXliYWNrU3RhdGUuU1RBVEVfUEFVU0VELCBwb3NpdGlvbiwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QQVVTRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFJdGVtU3RhdHVzLlBMQVlCQUNLX1NUQVRFX0JVRkZFUklORzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNCdWlsZGVyLnNldFN0YXRlKFBsYXliYWNrU3RhdGUuU1RBVEVfQlVGRkVSSU5HLCBwb3NpdGlvbiwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QQVVTRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFJdGVtU3RhdHVzLlBMQVlCQUNLX1NUQVRFX0ZJTklTSEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc0J1aWxkZXIuc2V0U3RhdGUoUGxheWJhY2tTdGF0ZS5TVEFURV9TVE9QUEVELCBwb3NpdGlvbiwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QTEFZQkFDS19DT01QTEVURUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBQbGF5YmFja1N0YXRlIHBiU3RhdGUgPSBwc0J1aWxkZXIuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYVNlc3Npb24uc2V0UGxheWJhY2tTdGF0ZShwYlN0YXRlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFNZXRhZGF0YS5CdWlsZGVyIG1tQnVpbGRlciA9IG5ldyBNZWRpYU1ldGFkYXRhLkJ1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1tQnVpbGRlci5wdXRMb25nKE1lZGlhTWV0YWRhdGEuTUVUQURBVEFfS0VZX0RVUkFUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtU3RhdHVzLmdldENvbnRlbnREdXJhdGlvbigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYVNlc3Npb24uc2V0TWV0YWRhdGEobW1CdWlsZGVyLmJ1aWxkKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgLy8gU3RhcnQgcmVtb3RlIHBsYXliYWNrIChpZiBuZWNlc3NhcnkpCisgICAgICAgICAgICAgICAgbVJvdXRlUGxheWVyLm9wZW5WaWRlbyhtRHNkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVW5zZWxlY3RlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSwgaW50IHJlYXNvbikgeworICAgICAgICAgICAgaWYgKG1Sb3V0ZSAhPSBudWxsICYmIG1Sb3V0ZVBsYXllciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVJvdXRlUGxheWVyLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICBtUm91dGVQbGF5ZXIgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1Sb3V0ZSA9PSByb3V0ZSkgeworICAgICAgICAgICAgICAgIG1Sb3V0ZSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVhc29uICE9IE1lZGlhUm91dGVyLlVOU0VMRUNUX1JFQVNPTl9ST1VURV9DSEFOR0VEKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogUmVzdW1lIGxvY2FsIHBsYXliYWNrICAoaWYgbmVjZXNzYXJ5KQorICAgICAgICAgICAgICAgIG9wZW5WaWRlbyhtRHNkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBwdWJsaWMgVmlkZW9WaWV3MkltcGwoVmlkZW9WaWV3MiBpbnN0YW5jZSwKKyAgICAgICAgICAgIFZpZXdHcm91cFByb3ZpZGVyIHN1cGVyUHJvdmlkZXIsIFZpZXdHcm91cFByb3ZpZGVyIHByaXZhdGVQcm92aWRlcikgeworICAgICAgICBzdXBlcihpbnN0YW5jZSwgc3VwZXJQcm92aWRlciwgcHJpdmF0ZVByb3ZpZGVyKTsKKyAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShATnVsbGFibGUgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyLCBpbnQgZGVmU3R5bGVSZXMpIHsKKyAgICAgICAgbVZpZGVvV2lkdGggPSAwOworICAgICAgICBtVmlkZW9IZWlnaHQgPSAwOworICAgICAgICBtU3BlZWQgPSAxLjBmOworICAgICAgICBtRmFsbGJhY2tTcGVlZCA9IG1TcGVlZDsKKyAgICAgICAgbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4ID0gSU5WQUxJRF9UUkFDS19JTkRFWDsKKyAgICAgICAgLy8gVE9ETzogYWRkIGF0dHJpYnV0ZXMgdG8gZ2V0IHRoaXMgdmFsdWUuCisgICAgICAgIG1TaG93Q29udHJvbGxlckludGVydmFsTXMgPSBERUZBVUxUX1NIT1dfQ09OVFJPTExFUl9JTlRFUlZBTF9NUzsKKworICAgICAgICBtQWNjZXNzaWJpbGl0eU1hbmFnZXIgPSBBY2Nlc3NpYmlsaXR5TWFuYWdlci5nZXRJbnN0YW5jZShtSW5zdGFuY2UuZ2V0Q29udGV4dCgpKTsKKworICAgICAgICBtQXVkaW9NYW5hZ2VyID0gKEF1ZGlvTWFuYWdlcikgbUluc3RhbmNlLmdldENvbnRleHQoKQorICAgICAgICAgICAgICAgIC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQVVESU9fU0VSVklDRSk7CisgICAgICAgIG1BdWRpb0F0dHJpYnV0ZXMgPSBuZXcgQXVkaW9BdHRyaWJ1dGVzLkJ1aWxkZXIoKS5zZXRVc2FnZShBdWRpb0F0dHJpYnV0ZXMuVVNBR0VfTUVESUEpCisgICAgICAgICAgICAgICAgLnNldENvbnRlbnRUeXBlKEF1ZGlvQXR0cmlidXRlcy5DT05URU5UX1RZUEVfTU9WSUUpLmJ1aWxkKCk7CisgICAgICAgIG1JbnN0YW5jZS5zZXRGb2N1c2FibGUodHJ1ZSk7CisgICAgICAgIG1JbnN0YW5jZS5zZXRGb2N1c2FibGVJblRvdWNoTW9kZSh0cnVlKTsKKyAgICAgICAgbUluc3RhbmNlLnJlcXVlc3RGb2N1cygpOworCisgICAgICAgIC8vIFRPRE86IHRyeSB0byBrZWVwIGEgc2luZ2xlIGNoaWxkIGF0IGEgdGltZSByYXRoZXIgdGhhbiBhbHdheXMgaGF2aW5nIGJvdGguCisgICAgICAgIG1UZXh0dXJlVmlldyA9IG5ldyBWaWRlb1RleHR1cmVWaWV3KG1JbnN0YW5jZS5nZXRDb250ZXh0KCkpOworICAgICAgICBtU3VyZmFjZVZpZXcgPSBuZXcgVmlkZW9TdXJmYWNlVmlldyhtSW5zdGFuY2UuZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgTGF5b3V0UGFyYW1zIHBhcmFtcyA9IG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKKyAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKTsKKyAgICAgICAgbVRleHR1cmVWaWV3LnNldExheW91dFBhcmFtcyhwYXJhbXMpOworICAgICAgICBtU3VyZmFjZVZpZXcuc2V0TGF5b3V0UGFyYW1zKHBhcmFtcyk7CisgICAgICAgIG1UZXh0dXJlVmlldy5zZXRTdXJmYWNlTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1TdXJmYWNlVmlldy5zZXRTdXJmYWNlTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1JbnN0YW5jZS5hZGRWaWV3KG1UZXh0dXJlVmlldyk7CisgICAgICAgIG1JbnN0YW5jZS5hZGRWaWV3KG1TdXJmYWNlVmlldyk7CisKKyAgICAgICAgbVN1YnRpdGxlVmlldyA9IG5ldyBTdWJ0aXRsZVZpZXcobUluc3RhbmNlLmdldENvbnRleHQoKSk7CisgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0TGF5b3V0UGFyYW1zKHBhcmFtcyk7CisgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0QmFja2dyb3VuZENvbG9yKDApOworICAgICAgICBtSW5zdGFuY2UuYWRkVmlldyhtU3VidGl0bGVWaWV3KTsKKworICAgICAgICBib29sZWFuIGVuYWJsZUNvbnRyb2xWaWV3ID0gKGF0dHJzID09IG51bGwpIHx8IGF0dHJzLmdldEF0dHJpYnV0ZUJvb2xlYW5WYWx1ZSgKKyAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIiwKKyAgICAgICAgICAgICAgICAiZW5hYmxlQ29udHJvbFZpZXciLCB0cnVlKTsKKyAgICAgICAgaWYgKGVuYWJsZUNvbnRyb2xWaWV3KSB7CisgICAgICAgICAgICBtTWVkaWFDb250cm9sVmlldyA9IG5ldyBNZWRpYUNvbnRyb2xWaWV3MihtSW5zdGFuY2UuZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIG1TdWJ0aXRsZUVuYWJsZWQgPSAoYXR0cnMgPT0gbnVsbCkgfHwgYXR0cnMuZ2V0QXR0cmlidXRlQm9vbGVhblZhbHVlKAorICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiLAorICAgICAgICAgICAgICAgICJlbmFibGVTdWJ0aXRsZSIsIGZhbHNlKTsKKworICAgICAgICAvLyBUT0RPOiBDaG9vc2UgVGV4dHVyZVZpZXcgd2hlbiBTdXJmYWNlVmlldyBjYW5ub3QgYmUgY3JlYXRlZC4KKyAgICAgICAgLy8gQ2hvb3NlIHN1cmZhY2UgdmlldyBieSBkZWZhdWx0CisgICAgICAgIGludCB2aWV3VHlwZSA9IChhdHRycyA9PSBudWxsKSA/IFZpZGVvVmlldzIuVklFV19UWVBFX1NVUkZBQ0VWSUVXCisgICAgICAgICAgICAgICAgOiBhdHRycy5nZXRBdHRyaWJ1dGVJbnRWYWx1ZSgKKyAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIiwKKyAgICAgICAgICAgICAgICAidmlld1R5cGUiLCBWaWRlb1ZpZXcyLlZJRVdfVFlQRV9TVVJGQUNFVklFVyk7CisgICAgICAgIGlmICh2aWV3VHlwZSA9PSBWaWRlb1ZpZXcyLlZJRVdfVFlQRV9TVVJGQUNFVklFVykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAidmlld1R5cGUgYXR0cmlidXRlIGlzIHN1cmZhY2VWaWV3LiIpOworICAgICAgICAgICAgbVRleHR1cmVWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgIG1TdXJmYWNlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtQ3VycmVudFZpZXcgPSBtU3VyZmFjZVZpZXc7CisgICAgICAgIH0gZWxzZSBpZiAodmlld1R5cGUgPT0gVmlkZW9WaWV3Mi5WSUVXX1RZUEVfVEVYVFVSRVZJRVcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgInZpZXdUeXBlIGF0dHJpYnV0ZSBpcyB0ZXh0dXJlVmlldy4iKTsKKyAgICAgICAgICAgIG1UZXh0dXJlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtU3VyZmFjZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgbUN1cnJlbnRWaWV3ID0gbVRleHR1cmVWaWV3OworICAgICAgICB9CisKKyAgICAgICAgTWVkaWFSb3V0ZVNlbGVjdG9yLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlcigpOworICAgICAgICBidWlsZGVyLmFkZENvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLKTsKKyAgICAgICAgYnVpbGRlci5hZGRDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfQVVESU8pOworICAgICAgICBidWlsZGVyLmFkZENvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9WSURFTyk7CisgICAgICAgIG1Sb3V0ZVNlbGVjdG9yID0gYnVpbGRlci5idWlsZCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhQ29udHJvbFZpZXcyX2ltcGwoTWVkaWFDb250cm9sVmlldzIgbWVkaWFDb250cm9sVmlldywgbG9uZyBpbnRlcnZhbE1zKSB7CisgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3ID0gbWVkaWFDb250cm9sVmlldzsKKyAgICAgICAgbVNob3dDb250cm9sbGVySW50ZXJ2YWxNcyA9IGludGVydmFsTXM7CisgICAgICAgIC8vIFRPRE86IENhbGwgTWVkaWFDb250cm9sVmlldzIuc2V0Um91dGVTZWxlY3RvciBvbmx5IHdoZW4gY2FzdCBhdmFpbGFsYmUuCisgICAgICAgICgoTWVkaWFDb250cm9sVmlldzJJbXBsKSBtTWVkaWFDb250cm9sVmlldy5nZXRQcm92aWRlcigpKS5zZXRSb3V0ZVNlbGVjdG9yKG1Sb3V0ZVNlbGVjdG9yKTsKKworICAgICAgICBpZiAobUluc3RhbmNlLmlzQXR0YWNoZWRUb1dpbmRvdygpKSB7CisgICAgICAgICAgICBhdHRhY2hNZWRpYUNvbnRyb2xWaWV3KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWVkaWFDb250cm9sbGVyIGdldE1lZGlhQ29udHJvbGxlcl9pbXBsKCkgeworICAgICAgICBpZiAobU1lZGlhU2Vzc2lvbiA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNZWRpYVNlc3Npb24gaW5zdGFuY2UgaXMgbm90IGF2YWlsYWJsZS4iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbU1lZGlhQ29udHJvbGxlcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2Vzc2lvblRva2VuMiBnZXRNZWRpYVNlc3Npb25Ub2tlbl9pbXBsKCkgeworICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWVkaWFDb250cm9sVmlldzIgZ2V0TWVkaWFDb250cm9sVmlldzJfaW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIG1NZWRpYUNvbnRyb2xWaWV3OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNZWRpYU1ldGFkYXRhMiBnZXRNZWRpYU1ldGFkYXRhX2ltcGwoKSB7CisgICAgICAgIHJldHVybiBtTWVkaWFNZXRhZGF0YTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRNZWRpYU1ldGFkYXRhX2ltcGwoTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKKyAgICAgICAgLy8gVE9ETzogaW50ZWdyYXRlIHRoaXMgd2l0aCBNZWRpYVNlc3Npb24yI01lZGlhSXRlbTIKKyAgICAgICAgbU1lZGlhTWV0YWRhdGEgPSBtZXRhZGF0YTsKKworICAgICAgICAvLyBUT0RPOiBhZGQgc3VwcG9ydCBmb3IgaGFuZGxpbmcgd2Vic2l0ZSBsaW5rCisgICAgICAgIG1NZWRpYVR5cGVEYXRhID0gbmV3IEJ1bmRsZSgpOworICAgICAgICBib29sZWFuIGlzQWQgPSBtZXRhZGF0YSA9PSBudWxsID8KKyAgICAgICAgICAgICAgICBmYWxzZSA6IG1ldGFkYXRhLmdldExvbmcoTWVkaWFNZXRhZGF0YTIuTUVUQURBVEFfS0VZX0FEVkVSVElTRU1FTlQpICE9IDA7CisgICAgICAgIG1NZWRpYVR5cGVEYXRhLnB1dEJvb2xlYW4oCisgICAgICAgICAgICAgICAgTWVkaWFDb250cm9sVmlldzJJbXBsLktFWV9TVEFURV9JU19BRFZFUlRJU0VNRU5ULCBpc0FkKTsKKworICAgICAgICBpZiAobU1lZGlhU2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBtTWVkaWFTZXNzaW9uLnNlbmRTZXNzaW9uRXZlbnQoCisgICAgICAgICAgICAgICAgICAgIE1lZGlhQ29udHJvbFZpZXcySW1wbC5FVkVOVF9VUERBVEVfTUVESUFfVFlQRV9TVEFUVVMsIG1NZWRpYVR5cGVEYXRhKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFVwZGF0ZSBsYXRlciBpbnNpZGUgT25QcmVwYXJlZExpc3RlbmVyIGFmdGVyIE1lZGlhU2Vzc2lvbiBpcyBpbml0aWFsaXplZC4KKyAgICAgICAgICAgIG1OZWVkVXBkYXRlTWVkaWFUeXBlID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFN1YnRpdGxlRW5hYmxlZF9pbXBsKGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICAgIGlmIChlbmFibGUgIT0gbVN1YnRpdGxlRW5hYmxlZCkgeworICAgICAgICAgICAgc2VsZWN0T3JEZXNlbGVjdFN1YnRpdGxlKGVuYWJsZSk7CisgICAgICAgIH0KKyAgICAgICAgbVN1YnRpdGxlRW5hYmxlZCA9IGVuYWJsZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N1YnRpdGxlRW5hYmxlZF9pbXBsKCkgeworICAgICAgICByZXR1cm4gbVN1YnRpdGxlRW5hYmxlZDsKKyAgICB9CisKKyAgICAvLyBUT0RPOiByZW1vdmUgc2V0U3BlZWRfaW1wbCBvbmNlIE1lZGlhQ29udHJvbGxlcjIgaXMgcmVhZHkuCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0U3BlZWRfaW1wbChmbG9hdCBzcGVlZCkgeworICAgICAgICBpZiAoc3BlZWQgPD0gMC4wZikgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5zdXBwb3J0ZWQgc3BlZWQgKCIgKyBzcGVlZCArICIpIGlzIGlnbm9yZWQuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbVNwZWVkID0gc3BlZWQ7CisgICAgICAgIGlmIChtTWVkaWFQbGF5ZXIgIT0gbnVsbCAmJiBtTWVkaWFQbGF5ZXIuaXNQbGF5aW5nKCkpIHsKKyAgICAgICAgICAgIGFwcGx5U3BlZWQoKTsKKyAgICAgICAgfQorICAgICAgICB1cGRhdGVQbGF5YmFja1N0YXRlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0QXVkaW9Gb2N1c1JlcXVlc3RfaW1wbChpbnQgZm9jdXNHYWluKSB7CisgICAgICAgIGlmIChmb2N1c0dhaW4gIT0gQXVkaW9NYW5hZ2VyLkFVRElPRk9DVVNfTk9ORQorICAgICAgICAgICAgICAgICYmIGZvY3VzR2FpbiAhPSBBdWRpb01hbmFnZXIuQVVESU9GT0NVU19HQUlOCisgICAgICAgICAgICAgICAgJiYgZm9jdXNHYWluICE9IEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX0dBSU5fVFJBTlNJRU5UCisgICAgICAgICAgICAgICAgJiYgZm9jdXNHYWluICE9IEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX0dBSU5fVFJBTlNJRU5UX01BWV9EVUNLCisgICAgICAgICAgICAgICAgJiYgZm9jdXNHYWluICE9IEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX0dBSU5fVFJBTlNJRU5UX0VYQ0xVU0lWRSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBhdWRpbyBmb2N1cyB0eXBlICIgKyBmb2N1c0dhaW4pOworICAgICAgICB9CisgICAgICAgIG1BdWRpb0ZvY3VzVHlwZSA9IGZvY3VzR2FpbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRBdWRpb0F0dHJpYnV0ZXNfaW1wbChBdWRpb0F0dHJpYnV0ZXMgYXR0cmlidXRlcykgeworICAgICAgICBpZiAoYXR0cmlidXRlcyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIG51bGwgQXVkaW9BdHRyaWJ1dGVzIik7CisgICAgICAgIH0KKyAgICAgICAgbUF1ZGlvQXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VmlkZW9QYXRoX2ltcGwoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgbUluc3RhbmNlLnNldFZpZGVvVXJpKFVyaS5wYXJzZShwYXRoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VmlkZW9VcmlfaW1wbChVcmkgdXJpKSB7CisgICAgICAgIG1JbnN0YW5jZS5zZXRWaWRlb1VyaSh1cmksIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFZpZGVvVXJpX2ltcGwoVXJpIHVyaSwgTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzKSB7CisgICAgICAgIERhdGFTb3VyY2VEZXNjLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBEYXRhU291cmNlRGVzYy5CdWlsZGVyKCk7CisgICAgICAgIGJ1aWxkZXIuc2V0RGF0YVNvdXJjZShtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLCB1cmksIGhlYWRlcnMsIG51bGwpOworICAgICAgICBtSW5zdGFuY2Uuc2V0RGF0YVNvdXJjZShidWlsZGVyLmJ1aWxkKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhSXRlbV9pbXBsKE1lZGlhSXRlbTIgbWVkaWFJdGVtKSB7CisgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0RGF0YVNvdXJjZV9pbXBsKERhdGFTb3VyY2VEZXNjIGRzZCkgeworICAgICAgICBtRHNkID0gZHNkOworICAgICAgICBtU2Vla1doZW5QcmVwYXJlZCA9IDA7CisgICAgICAgIG9wZW5WaWRlbyhkc2QpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFZpZXdUeXBlX2ltcGwoaW50IHZpZXdUeXBlKSB7CisgICAgICAgIGlmICh2aWV3VHlwZSA9PSBtQ3VycmVudFZpZXcuZ2V0Vmlld1R5cGUoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFZpZGVvVmlld0ludGVyZmFjZSB0YXJnZXRWaWV3OworICAgICAgICBpZiAodmlld1R5cGUgPT0gVmlkZW9WaWV3Mi5WSUVXX1RZUEVfVEVYVFVSRVZJRVcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgInN3aXRjaGluZyB0byBUZXh0dXJlVmlldyIpOworICAgICAgICAgICAgdGFyZ2V0VmlldyA9IG1UZXh0dXJlVmlldzsKKyAgICAgICAgfSBlbHNlIGlmICh2aWV3VHlwZSA9PSBWaWRlb1ZpZXcyLlZJRVdfVFlQRV9TVVJGQUNFVklFVykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAic3dpdGNoaW5nIHRvIFN1cmZhY2VWaWV3Iik7CisgICAgICAgICAgICB0YXJnZXRWaWV3ID0gbVN1cmZhY2VWaWV3OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biB2aWV3IHR5cGU6ICIgKyB2aWV3VHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgKChWaWV3KSB0YXJnZXRWaWV3KS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgIHRhcmdldFZpZXcudGFrZU92ZXIobUN1cnJlbnRWaWV3KTsKKyAgICAgICAgbUluc3RhbmNlLnJlcXVlc3RMYXlvdXQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldFZpZXdUeXBlX2ltcGwoKSB7CisgICAgICAgIHJldHVybiBtQ3VycmVudFZpZXcuZ2V0Vmlld1R5cGUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21BY3Rpb25zX2ltcGwoCisgICAgICAgICAgICBMaXN0PFBsYXliYWNrU3RhdGUuQ3VzdG9tQWN0aW9uPiBhY3Rpb25MaXN0LAorICAgICAgICAgICAgRXhlY3V0b3IgZXhlY3V0b3IsIFZpZGVvVmlldzIuT25DdXN0b21BY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBtQ3VzdG9tQWN0aW9uTGlzdCA9IGFjdGlvbkxpc3Q7CisgICAgICAgIG1DdXN0b21BY3Rpb25MaXN0ZW5lclJlY29yZCA9IG5ldyBQYWlyPD4oZXhlY3V0b3IsIGxpc3RlbmVyKTsKKworICAgICAgICAvLyBDcmVhdGUgYSBuZXcgcGxheWJhY2sgYnVpbGRlciBpbiBvcmRlciB0byBjbGVhciBleGlzdGluZyB0aGUgY3VzdG9tIGFjdGlvbnMuCisgICAgICAgIG1TdGF0ZUJ1aWxkZXIgPSBudWxsOworICAgICAgICB1cGRhdGVQbGF5YmFja1N0YXRlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0T25WaWV3VHlwZUNoYW5nZWRMaXN0ZW5lcl9pbXBsKFZpZGVvVmlldzIuT25WaWV3VHlwZUNoYW5nZWRMaXN0ZW5lciBsKSB7CisgICAgICAgIG1WaWV3VHlwZUNoYW5nZWRMaXN0ZW5lciA9IGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0RnVsbFNjcmVlblJlcXVlc3RMaXN0ZW5lcl9pbXBsKFZpZGVvVmlldzIuT25GdWxsU2NyZWVuUmVxdWVzdExpc3RlbmVyIGwpIHsKKyAgICAgICAgbUZ1bGxTY3JlZW5SZXF1ZXN0TGlzdGVuZXIgPSBsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQXR0YWNoZWRUb1dpbmRvd19pbXBsKCkgeworICAgICAgICBzdXBlci5vbkF0dGFjaGVkVG9XaW5kb3dfaW1wbCgpOworCisgICAgICAgIC8vIENyZWF0ZSBNZWRpYVNlc3Npb24KKyAgICAgICAgbU1lZGlhU2Vzc2lvbiA9IG5ldyBNZWRpYVNlc3Npb24obUluc3RhbmNlLmdldENvbnRleHQoKSwgIlZpZGVvVmlldzJNZWRpYVNlc3Npb24iKTsKKyAgICAgICAgbU1lZGlhU2Vzc2lvbi5zZXRDYWxsYmFjayhuZXcgTWVkaWFTZXNzaW9uQ2FsbGJhY2soKSk7CisgICAgICAgIG1NZWRpYVNlc3Npb24uc2V0QWN0aXZlKHRydWUpOworICAgICAgICBtTWVkaWFDb250cm9sbGVyID0gbU1lZGlhU2Vzc2lvbi5nZXRDb250cm9sbGVyKCk7CisgICAgICAgIG1NZWRpYVJvdXRlciA9IE1lZGlhUm91dGVyLmdldEluc3RhbmNlKG1JbnN0YW5jZS5nZXRDb250ZXh0KCkpOworICAgICAgICBtTWVkaWFSb3V0ZXIuc2V0TWVkaWFTZXNzaW9uKG1NZWRpYVNlc3Npb24pOworICAgICAgICBtTWVkaWFSb3V0ZXIuYWRkQ2FsbGJhY2sobVJvdXRlU2VsZWN0b3IsIG1Sb3V0ZXJDYWxsYmFjayk7CisgICAgICAgIGF0dGFjaE1lZGlhQ29udHJvbFZpZXcoKTsKKyAgICAgICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgYWZ0ZXIgbW92aW5nIE1lZGlhU2Vzc2lvbiBjcmVhdGluZyBjb2RlIGluc2lkZSBpbml0aWFsaXppbmcgVmlkZW9WaWV3MgorICAgICAgICBpZiAobUN1cnJlbnRTdGF0ZSA9PSBTVEFURV9QUkVQQVJFRCkgeworICAgICAgICAgICAgZXh0cmFjdFRyYWNrcygpOworICAgICAgICAgICAgZXh0cmFjdE1ldGFkYXRhKCk7CisgICAgICAgICAgICBleHRyYWN0QXVkaW9NZXRhZGF0YSgpOworICAgICAgICAgICAgaWYgKG1OZWVkVXBkYXRlTWVkaWFUeXBlKSB7CisgICAgICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbi5zZW5kU2Vzc2lvbkV2ZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFDb250cm9sVmlldzJJbXBsLkVWRU5UX1VQREFURV9NRURJQV9UWVBFX1NUQVRVUywKKyAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYVR5cGVEYXRhKTsKKyAgICAgICAgICAgICAgICBtTmVlZFVwZGF0ZU1lZGlhVHlwZSA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3dfaW1wbCgpIHsKKyAgICAgICAgc3VwZXIub25EZXRhY2hlZEZyb21XaW5kb3dfaW1wbCgpOworCisgICAgICAgIG1NZWRpYVNlc3Npb24ucmVsZWFzZSgpOworICAgICAgICBtTWVkaWFTZXNzaW9uID0gbnVsbDsKKyAgICAgICAgbU1lZGlhQ29udHJvbGxlciA9IG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRBY2Nlc3NpYmlsaXR5Q2xhc3NOYW1lX2ltcGwoKSB7CisgICAgICAgIHJldHVybiBWaWRlb1ZpZXcyLmNsYXNzLmdldE5hbWUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnRfaW1wbChNb3Rpb25FdmVudCBldikgeworICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIm9uVG91Y2hFdmVudCgpLiBtQ3VycmVudFN0YXRlPSIgKyBtQ3VycmVudFN0YXRlCisgICAgICAgICAgICAgICAgICAgICsgIiwgbVRhcmdldFN0YXRlPSIgKyBtVGFyZ2V0U3RhdGUpOworICAgICAgICB9CisgICAgICAgIGlmIChldi5nZXRBY3Rpb24oKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fVVAgJiYgbU1lZGlhQ29udHJvbFZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKCFtSXNNdXNpY01lZGlhVHlwZSB8fCBtU2l6ZVR5cGUgIT0gU0laRV9UWVBFX0ZVTEwpIHsKKyAgICAgICAgICAgICAgICB0b2dnbGVNZWRpYUNvbnRyb2xWaWV3VmlzaWJpbGl0eSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHN1cGVyLm9uVG91Y2hFdmVudF9pbXBsKGV2KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblRyYWNrYmFsbEV2ZW50X2ltcGwoTW90aW9uRXZlbnQgZXYpIHsKKyAgICAgICAgaWYgKGV2LmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9VUCAmJiBtTWVkaWFDb250cm9sVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoIW1Jc011c2ljTWVkaWFUeXBlIHx8IG1TaXplVHlwZSAhPSBTSVpFX1RZUEVfRlVMTCkgeworICAgICAgICAgICAgICAgIHRvZ2dsZU1lZGlhQ29udHJvbFZpZXdWaXNpYmlsaXR5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3VwZXIub25UcmFja2JhbGxFdmVudF9pbXBsKGV2KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBkaXNwYXRjaFRvdWNoRXZlbnRfaW1wbChNb3Rpb25FdmVudCBldikgeworICAgICAgICAvLyBUT0RPOiBUZXN0IHRvdWNoIGV2ZW50IGhhbmRsaW5nIGxvZ2ljIHRob3JvdWdobHkgYW5kIHNpbXBsaWZ5IHRoZSBsb2dpYy4KKyAgICAgICAgcmV0dXJuIHN1cGVyLmRpc3BhdGNoVG91Y2hFdmVudF9pbXBsKGV2KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbk1lYXN1cmVfaW1wbChpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7CisgICAgICAgIHN1cGVyLm9uTWVhc3VyZV9pbXBsKHdpZHRoTWVhc3VyZVNwZWMsIGhlaWdodE1lYXN1cmVTcGVjKTsKKworICAgICAgICBpZiAobUlzTXVzaWNNZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIGlmIChtUHJldldpZHRoICE9IG1JbnN0YW5jZS5nZXRNZWFzdXJlZFdpZHRoKCkKKyAgICAgICAgICAgICAgICAgICAgfHwgbVByZXZIZWlnaHQgIT0gbUluc3RhbmNlLmdldE1lYXN1cmVkSGVpZ2h0KCkpIHsKKyAgICAgICAgICAgICAgICBpbnQgY3VycldpZHRoID0gbUluc3RhbmNlLmdldE1lYXN1cmVkV2lkdGgoKTsKKyAgICAgICAgICAgICAgICBpbnQgY3VyckhlaWdodCA9IG1JbnN0YW5jZS5nZXRNZWFzdXJlZEhlaWdodCgpOworICAgICAgICAgICAgICAgIFBvaW50IHNjcmVlblNpemUgPSBuZXcgUG9pbnQoKTsKKyAgICAgICAgICAgICAgICBtTWFuYWdlci5nZXREZWZhdWx0RGlzcGxheSgpLmdldFNpemUoc2NyZWVuU2l6ZSk7CisgICAgICAgICAgICAgICAgaW50IHNjcmVlbldpZHRoID0gc2NyZWVuU2l6ZS54OworICAgICAgICAgICAgICAgIGludCBzY3JlZW5IZWlnaHQgPSBzY3JlZW5TaXplLnk7CisKKyAgICAgICAgICAgICAgICBpZiAoY3VycldpZHRoID09IHNjcmVlbldpZHRoICYmIGN1cnJIZWlnaHQgPT0gc2NyZWVuSGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgICAgIGludCBvcmllbnRhdGlvbiA9IHJldHJpZXZlT3JpZW50YXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWVudGF0aW9uID09IEFjdGl2aXR5SW5mby5TQ1JFRU5fT1JJRU5UQVRJT05fTEFORFNDQVBFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZsYXRlTXVzaWNWaWV3KFIubGF5b3V0LmZ1bGxfbGFuZHNjYXBlX211c2ljKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZmxhdGVNdXNpY1ZpZXcoUi5sYXlvdXQuZnVsbF9wb3J0cmFpdF9tdXNpYyk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAobVNpemVUeXBlICE9IFNJWkVfVFlQRV9GVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU2l6ZVR5cGUgPSBTSVpFX1RZUEVfRlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBleGlzdGluZyBtRmFkZU91dCBjYWxsYmFjaworICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcucmVtb3ZlQ2FsbGJhY2tzKG1GYWRlT3V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtU2l6ZVR5cGUgIT0gU0laRV9UWVBFX0VNQkVEREVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU2l6ZVR5cGUgPSBTSVpFX1RZUEVfRU1CRURERUQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZsYXRlTXVzaWNWaWV3KFIubGF5b3V0LmVtYmVkZGVkX211c2ljKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCBuZXcgbUZhZGVPdXQgY2FsbGJhY2sKKyAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnBvc3REZWxheWVkKG1GYWRlT3V0LCBtU2hvd0NvbnRyb2xsZXJJbnRlcnZhbE1zKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtUHJldldpZHRoID0gY3VycldpZHRoOworICAgICAgICAgICAgICAgIG1QcmV2SGVpZ2h0ID0gY3VyckhlaWdodDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIEltcGxlbWVudHMgVmlkZW9WaWV3SW50ZXJmYWNlLlN1cmZhY2VMaXN0ZW5lcgorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TdXJmYWNlQ3JlYXRlZChWaWV3IHZpZXcsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIm9uU3VyZmFjZUNyZWF0ZWQoKS4gbUN1cnJlbnRTdGF0ZT0iICsgbUN1cnJlbnRTdGF0ZQorICAgICAgICAgICAgICAgICAgICArICIsIG1UYXJnZXRTdGF0ZT0iICsgbVRhcmdldFN0YXRlICsgIiwgd2lkdGgvaGVpZ2h0OiAiICsgd2lkdGggKyAiLyIgKyBoZWlnaHQKKyAgICAgICAgICAgICAgICAgICAgKyAiLCAiICsgdmlldy50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobmVlZFRvU3RhcnQoKSkgeworICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlci5nZXRUcmFuc3BvcnRDb250cm9scygpLnBsYXkoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZURlc3Ryb3llZChWaWV3IHZpZXcpIHsKKyAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJvblN1cmZhY2VEZXN0cm95ZWQoKS4gbUN1cnJlbnRTdGF0ZT0iICsgbUN1cnJlbnRTdGF0ZQorICAgICAgICAgICAgICAgICAgICArICIsIG1UYXJnZXRTdGF0ZT0iICsgbVRhcmdldFN0YXRlICsgIiwgIiArIHZpZXcudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VDaGFuZ2VkKFZpZXcgdmlldywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIC8vIFRPRE86IERvIHdlIG5lZWQgdG8gY2FsbCByZXF1ZXN0TGF5b3V0IGhlcmU/CisgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAib25TdXJmYWNlQ2hhbmdlZCgpLiB3aWR0aC9oZWlnaHQ6ICIgKyB3aWR0aCArICIvIiArIGhlaWdodAorICAgICAgICAgICAgICAgICAgICArICIsICIgKyB2aWV3LnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TdXJmYWNlVGFrZU92ZXJEb25lKFZpZGVvVmlld0ludGVyZmFjZSB2aWV3KSB7CisgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAib25TdXJmYWNlVGFrZU92ZXJEb25lKCkuIE5vdyBjdXJyZW50IHZpZXcgaXM6ICIgKyB2aWV3KTsKKyAgICAgICAgfQorICAgICAgICBtQ3VycmVudFZpZXcgPSB2aWV3OworICAgICAgICBpZiAobVZpZXdUeXBlQ2hhbmdlZExpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1WaWV3VHlwZUNoYW5nZWRMaXN0ZW5lci5vblZpZXdUeXBlQ2hhbmdlZChtSW5zdGFuY2UsIHZpZXcuZ2V0Vmlld1R5cGUoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5lZWRUb1N0YXJ0KCkpIHsKKyAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIuZ2V0VHJhbnNwb3J0Q29udHJvbHMoKS5wbGF5KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBQcm90ZWN0ZWQgb3IgcHJpdmF0ZSBtZXRob2RzCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBwcml2YXRlIHZvaWQgYXR0YWNoTWVkaWFDb250cm9sVmlldygpIHsKKyAgICAgICAgLy8gR2V0IE1lZGlhQ29udHJvbGxlciBmcm9tIE1lZGlhU2Vzc2lvbiBhbmQgc2V0IGl0IGluc2lkZSBNZWRpYUNvbnRyb2xWaWV3CisgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnNldENvbnRyb2xsZXIobU1lZGlhU2Vzc2lvbi5nZXRDb250cm9sbGVyKCkpOworCisgICAgICAgIExheW91dFBhcmFtcyBwYXJhbXMgPQorICAgICAgICAgICAgICAgIG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwgTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCk7CisgICAgICAgIG1JbnN0YW5jZS5hZGRWaWV3KG1NZWRpYUNvbnRyb2xWaWV3LCBwYXJhbXMpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc0luUGxheWJhY2tTdGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIChtTWVkaWFQbGF5ZXIgIT0gbnVsbCB8fCBtUm91dGVQbGF5ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAmJiBtQ3VycmVudFN0YXRlICE9IFNUQVRFX0VSUk9SCisgICAgICAgICAgICAgICAgJiYgbUN1cnJlbnRTdGF0ZSAhPSBTVEFURV9JRExFCisgICAgICAgICAgICAgICAgJiYgbUN1cnJlbnRTdGF0ZSAhPSBTVEFURV9QUkVQQVJJTkc7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIG5lZWRUb1N0YXJ0KCkgeworICAgICAgICByZXR1cm4gKG1NZWRpYVBsYXllciAhPSBudWxsIHx8IG1Sb3V0ZVBsYXllciAhPSBudWxsKQorICAgICAgICAgICAgICAgICYmIG1DdXJyZW50U3RhdGUgIT0gU1RBVEVfUExBWUlORworICAgICAgICAgICAgICAgICYmIG1UYXJnZXRTdGF0ZSA9PSBTVEFURV9QTEFZSU5HOworICAgIH0KKworICAgIC8vIENyZWF0ZXMgYSBNZWRpYVBsYXllcjIgaW5zdGFuY2UgYW5kIHByZXBhcmUgcGxheWJhY2suCisgICAgcHJpdmF0ZSB2b2lkIG9wZW5WaWRlbyhEYXRhU291cmNlRGVzYyBkc2QpIHsKKyAgICAgICAgVXJpIHVyaSA9IGRzZC5nZXRVcmkoKTsKKyAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzID0gZHNkLmdldFVyaUhlYWRlcnMoKTsKKyAgICAgICAgcmVzZXRQbGF5ZXIoKTsKKyAgICAgICAgaWYgKGlzUmVtb3RlUGxheWJhY2soKSkgeworICAgICAgICAgICAgbVJvdXRlUGxheWVyLm9wZW5WaWRlbyhkc2QpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChtQXVkaW9Gb2N1c1R5cGUgIT0gQXVkaW9NYW5hZ2VyLkFVRElPRk9DVVNfTk9ORSkgeworICAgICAgICAgICAgLy8gVE9ETyB0aGlzIHNob3VsZCBoYXZlIGEgZm9jdXMgbGlzdGVuZXIKKyAgICAgICAgICAgIEF1ZGlvRm9jdXNSZXF1ZXN0IGZvY3VzUmVxdWVzdDsKKyAgICAgICAgICAgIGZvY3VzUmVxdWVzdCA9IG5ldyBBdWRpb0ZvY3VzUmVxdWVzdC5CdWlsZGVyKG1BdWRpb0ZvY3VzVHlwZSkKKyAgICAgICAgICAgICAgICAgICAgLnNldEF1ZGlvQXR0cmlidXRlcyhtQXVkaW9BdHRyaWJ1dGVzKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgICAgIG1BdWRpb01hbmFnZXIucmVxdWVzdEF1ZGlvRm9jdXMoZm9jdXNSZXF1ZXN0KTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJvcGVuVmlkZW8oKTogY3JlYXRpbmcgbmV3IE1lZGlhUGxheWVyMiBpbnN0YW5jZS4iKTsKKyAgICAgICAgICAgIG1NZWRpYVBsYXllciA9IG5ldyBNZWRpYVBsYXllcjJJbXBsKCk7CisgICAgICAgICAgICBtU3VyZmFjZVZpZXcuc2V0TWVkaWFQbGF5ZXIobU1lZGlhUGxheWVyKTsKKyAgICAgICAgICAgIG1UZXh0dXJlVmlldy5zZXRNZWRpYVBsYXllcihtTWVkaWFQbGF5ZXIpOworICAgICAgICAgICAgbUN1cnJlbnRWaWV3LmFzc2lnblN1cmZhY2VUb01lZGlhUGxheWVyKG1NZWRpYVBsYXllcik7CisKKyAgICAgICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IG1JbnN0YW5jZS5nZXRDb250ZXh0KCk7CisgICAgICAgICAgICAvLyBUT0RPOiBBZGQgdGltZWx5IGZpcmluZyBsb2dpYyBmb3IgbW9yZSBhY2N1cmF0ZSBzeW5jIGJldHdlZW4gQ0MgYW5kIHZpZGVvIGZyYW1lCisgICAgICAgICAgICBtU3VidGl0bGVDb250cm9sbGVyID0gbmV3IFN1YnRpdGxlQ29udHJvbGxlcihjb250ZXh0KTsKKyAgICAgICAgICAgIG1TdWJ0aXRsZUNvbnRyb2xsZXIucmVnaXN0ZXJSZW5kZXJlcihuZXcgQ2xvc2VkQ2FwdGlvblJlbmRlcmVyKGNvbnRleHQpKTsKKyAgICAgICAgICAgIG1TdWJ0aXRsZUNvbnRyb2xsZXIuc2V0QW5jaG9yKChTdWJ0aXRsZUNvbnRyb2xsZXIuQW5jaG9yKSBtU3VidGl0bGVWaWV3KTsKKyAgICAgICAgICAgIEV4ZWN1dG9yIGV4ZWN1dG9yID0gbmV3IEV4ZWN1dG9yKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoUnVubmFibGUgcnVubmFibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgcnVubmFibGUucnVuKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIG1NZWRpYVBsYXllci5zZXRNZWRpYVBsYXllcjJFdmVudENhbGxiYWNrKGV4ZWN1dG9yLCBtTWVkaWFQbGF5ZXIyQ2FsbGJhY2spOworCisgICAgICAgICAgICBtQ3VycmVudEJ1ZmZlclBlcmNlbnRhZ2UgPSAtMTsKKyAgICAgICAgICAgIG1NZWRpYVBsYXllci5zZXREYXRhU291cmNlKGRzZCk7CisgICAgICAgICAgICBtTWVkaWFQbGF5ZXIuc2V0QXVkaW9BdHRyaWJ1dGVzKG1BdWRpb0F0dHJpYnV0ZXMpOworICAgICAgICAgICAgbU1lZGlhUGxheWVyLnNldE9uU3VidGl0bGVEYXRhTGlzdGVuZXIobVN1YnRpdGxlTGlzdGVuZXIpOworICAgICAgICAgICAgLy8gd2UgZG9uJ3Qgc2V0IHRoZSB0YXJnZXQgc3RhdGUgaGVyZSBlaXRoZXIsIGJ1dCBwcmVzZXJ2ZSB0aGUKKyAgICAgICAgICAgIC8vIHRhcmdldCBzdGF0ZSB0aGF0IHdhcyB0aGVyZSBiZWZvcmUuCisgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfUFJFUEFSSU5HOworICAgICAgICAgICAgbU1lZGlhUGxheWVyLnByZXBhcmUoKTsKKworICAgICAgICAgICAgLy8gU2F2ZSBmaWxlIG5hbWUgYXMgdGl0bGUgc2luY2UgdGhlIGZpbGUgbWF5IG5vdCBoYXZlIGEgdGl0bGUgTWV0YWRhdGEuCisgICAgICAgICAgICBtVGl0bGUgPSB1cmkuZ2V0UGF0aCgpOworICAgICAgICAgICAgU3RyaW5nIHNjaGVtZSA9IHVyaS5nZXRTY2hlbWUoKTsKKyAgICAgICAgICAgIGlmIChzY2hlbWUgIT0gbnVsbCAmJiBzY2hlbWUuZXF1YWxzKCJmaWxlIikpIHsKKyAgICAgICAgICAgICAgICBtVGl0bGUgPSB1cmkuZ2V0TGFzdFBhdGhTZWdtZW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUmV0cmlldmVyID0gbmV3IE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIoKTsKKyAgICAgICAgICAgIG1SZXRyaWV2ZXIuc2V0RGF0YVNvdXJjZShtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLCB1cmkpOworCisgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvcGVuVmlkZW8oKS4gbUN1cnJlbnRTdGF0ZT0iICsgbUN1cnJlbnRTdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBtVGFyZ2V0U3RhdGU9IiArIG1UYXJnZXRTdGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5hYmxlIHRvIG9wZW4gY29udGVudDogIiArIHVyaSwgZXgpOworICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX0VSUk9SOworICAgICAgICAgICAgbVRhcmdldFN0YXRlID0gU1RBVEVfRVJST1I7CisgICAgICAgICAgICBtTWVkaWFQbGF5ZXIyQ2FsbGJhY2sub25FcnJvcihtTWVkaWFQbGF5ZXIsIGRzZCwKKyAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIyLk1FRElBX0VSUk9SX1VOS05PV04sIE1lZGlhUGxheWVyMi5NRURJQV9FUlJPUl9JTyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFJlc2V0IHRoZSBtZWRpYSBwbGF5ZXIgaW4gYW55IHN0YXRlCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlc2V0UGxheWVyKCkgeworICAgICAgICBpZiAobU1lZGlhUGxheWVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIE1lZGlhUGxheWVyMiBwbGF5ZXIgPSBtTWVkaWFQbGF5ZXI7CisgICAgICAgICAgICBuZXcgQXN5bmNUYXNrPE1lZGlhUGxheWVyMiwgVm9pZCwgVm9pZD4oKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHJvdGVjdGVkIFZvaWQgZG9JbkJhY2tncm91bmQoTWVkaWFQbGF5ZXIyLi4uIHBsYXllcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogRml4IE5QRSB3aGlsZSBNZWRpYVBsYXllcjIuY2xvc2UoKQorICAgICAgICAgICAgICAgICAgICAvL3BsYXllcnNbMF0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfS5leGVjdXRlT25FeGVjdXRvcihBc3luY1Rhc2suU0VSSUFMX0VYRUNVVE9SLCBwbGF5ZXIpOworICAgICAgICAgICAgbU1lZGlhUGxheWVyID0gbnVsbDsKKyAgICAgICAgICAgIG1UZXh0dXJlVmlldy5zZXRNZWRpYVBsYXllcihudWxsKTsKKyAgICAgICAgICAgIG1TdXJmYWNlVmlldy5zZXRNZWRpYVBsYXllcihudWxsKTsKKyAgICAgICAgICAgIC8vbVBlbmRpbmdTdWJ0aXRsZVRyYWNrcy5jbGVhcigpOworICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX0lETEU7CisgICAgICAgICAgICBtVGFyZ2V0U3RhdGUgPSBTVEFURV9JRExFOworICAgICAgICAgICAgaWYgKG1BdWRpb0ZvY3VzVHlwZSAhPSBBdWRpb01hbmFnZXIuQVVESU9GT0NVU19OT05FKSB7CisgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5hYmFuZG9uQXVkaW9Gb2N1cyhudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtVmlkZW9XaWR0aCA9IDA7CisgICAgICAgIG1WaWRlb0hlaWdodCA9IDA7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVBsYXliYWNrU3RhdGUoKSB7CisgICAgICAgIGlmIChtU3RhdGVCdWlsZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIEdldCB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSBwbGF5ZXIgZm9yIHRoaXMgc3RyZWFtCisgICAgICAgICAgICBtTWV0YWRhdGEgPSBtTWVkaWFQbGF5ZXIuZ2V0TWV0YWRhdGEoTWVkaWFQbGF5ZXIyLk1FVEFEQVRBX0FMTCwKKyAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIyLkJZUEFTU19NRVRBREFUQV9GSUxURVIpOworCisgICAgICAgICAgICAvLyBBZGQgUGxheSBhY3Rpb24gYXMgZGVmYXVsdAorICAgICAgICAgICAgbG9uZyBwbGF5YmFja0FjdGlvbnMgPSBQbGF5YmFja1N0YXRlLkFDVElPTl9QTEFZOworICAgICAgICAgICAgaWYgKG1NZXRhZGF0YSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtTWV0YWRhdGEuaGFzKE1ldGFkYXRhLlBBVVNFX0FWQUlMQUJMRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1NZXRhZGF0YS5nZXRCb29sZWFuKE1ldGFkYXRhLlBBVVNFX0FWQUlMQUJMRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tBY3Rpb25zIHw9IFBsYXliYWNrU3RhdGUuQUNUSU9OX1BBVVNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIW1NZXRhZGF0YS5oYXMoTWV0YWRhdGEuU0VFS19CQUNLV0FSRF9BVkFJTEFCTEUpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBtTWV0YWRhdGEuZ2V0Qm9vbGVhbihNZXRhZGF0YS5TRUVLX0JBQ0tXQVJEX0FWQUlMQUJMRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tBY3Rpb25zIHw9IFBsYXliYWNrU3RhdGUuQUNUSU9OX1JFV0lORDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFtTWV0YWRhdGEuaGFzKE1ldGFkYXRhLlNFRUtfRk9SV0FSRF9BVkFJTEFCTEUpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBtTWV0YWRhdGEuZ2V0Qm9vbGVhbihNZXRhZGF0YS5TRUVLX0ZPUldBUkRfQVZBSUxBQkxFKSkgeworICAgICAgICAgICAgICAgICAgICBwbGF5YmFja0FjdGlvbnMgfD0gUGxheWJhY2tTdGF0ZS5BQ1RJT05fRkFTVF9GT1JXQVJEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIW1NZXRhZGF0YS5oYXMoTWV0YWRhdGEuU0VFS19BVkFJTEFCTEUpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBtTWV0YWRhdGEuZ2V0Qm9vbGVhbihNZXRhZGF0YS5TRUVLX0FWQUlMQUJMRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tBY3Rpb25zIHw9IFBsYXliYWNrU3RhdGUuQUNUSU9OX1NFRUtfVE87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwbGF5YmFja0FjdGlvbnMgfD0gKFBsYXliYWNrU3RhdGUuQUNUSU9OX1BBVVNFIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBsYXliYWNrU3RhdGUuQUNUSU9OX1JFV0lORCB8IFBsYXliYWNrU3RhdGUuQUNUSU9OX0ZBU1RfRk9SV0FSRCB8CisgICAgICAgICAgICAgICAgICAgICAgICBQbGF5YmFja1N0YXRlLkFDVElPTl9TRUVLX1RPKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TdGF0ZUJ1aWxkZXIgPSBuZXcgUGxheWJhY2tTdGF0ZS5CdWlsZGVyKCk7CisgICAgICAgICAgICBtU3RhdGVCdWlsZGVyLnNldEFjdGlvbnMocGxheWJhY2tBY3Rpb25zKTsKKworICAgICAgICAgICAgaWYgKG1DdXN0b21BY3Rpb25MaXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKFBsYXliYWNrU3RhdGUuQ3VzdG9tQWN0aW9uIGFjdGlvbiA6IG1DdXN0b21BY3Rpb25MaXN0KSB7CisgICAgICAgICAgICAgICAgICAgIG1TdGF0ZUJ1aWxkZXIuYWRkQ3VzdG9tQWN0aW9uKGFjdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1TdGF0ZUJ1aWxkZXIuc2V0U3RhdGUoZ2V0Q29ycmVzcG9uZGluZ1BsYXliYWNrU3RhdGUoKSwKKyAgICAgICAgICAgICAgICBtTWVkaWFQbGF5ZXIuZ2V0Q3VycmVudFBvc2l0aW9uKCksIG1TcGVlZCk7CisgICAgICAgIGlmIChtQ3VycmVudFN0YXRlICE9IFNUQVRFX0VSUk9SCisgICAgICAgICAgICAmJiBtQ3VycmVudFN0YXRlICE9IFNUQVRFX0lETEUKKyAgICAgICAgICAgICYmIG1DdXJyZW50U3RhdGUgIT0gU1RBVEVfUFJFUEFSSU5HKSB7CisgICAgICAgICAgICAvLyBUT0RPOiB0aGlzIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIE1lZGlhUGxheWVyMi5nZXRCdWZmZXJlZFBvc2l0aW9uKCkgb25jZSBpdCBpcworICAgICAgICAgICAgLy8gaW1wbGVtZW50ZWQuCisgICAgICAgICAgICBpZiAobUN1cnJlbnRCdWZmZXJQZXJjZW50YWdlID09IC0xKSB7CisgICAgICAgICAgICAgICAgbVN0YXRlQnVpbGRlci5zZXRCdWZmZXJlZFBvc2l0aW9uKC0xKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVN0YXRlQnVpbGRlci5zZXRCdWZmZXJlZFBvc2l0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpIChtQ3VycmVudEJ1ZmZlclBlcmNlbnRhZ2UgLyAxMDAuMCAqIG1NZWRpYVBsYXllci5nZXREdXJhdGlvbigpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBTZXQgUGxheWJhY2tTdGF0ZSBmb3IgTWVkaWFTZXNzaW9uCisgICAgICAgIGlmIChtTWVkaWFTZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIFBsYXliYWNrU3RhdGUgc3RhdGUgPSBtU3RhdGVCdWlsZGVyLmJ1aWxkKCk7CisgICAgICAgICAgICBtTWVkaWFTZXNzaW9uLnNldFBsYXliYWNrU3RhdGUoc3RhdGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZ2V0Q29ycmVzcG9uZGluZ1BsYXliYWNrU3RhdGUoKSB7CisgICAgICAgIHN3aXRjaCAobUN1cnJlbnRTdGF0ZSkgeworICAgICAgICAgICAgY2FzZSBTVEFURV9FUlJPUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gUGxheWJhY2tTdGF0ZS5TVEFURV9FUlJPUjsKKyAgICAgICAgICAgIGNhc2UgU1RBVEVfSURMRToKKyAgICAgICAgICAgICAgICByZXR1cm4gUGxheWJhY2tTdGF0ZS5TVEFURV9OT05FOworICAgICAgICAgICAgY2FzZSBTVEFURV9QUkVQQVJJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIFBsYXliYWNrU3RhdGUuU1RBVEVfQ09OTkVDVElORzsKKyAgICAgICAgICAgIGNhc2UgU1RBVEVfUFJFUEFSRUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIFBsYXliYWNrU3RhdGUuU1RBVEVfUEFVU0VEOworICAgICAgICAgICAgY2FzZSBTVEFURV9QTEFZSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiBQbGF5YmFja1N0YXRlLlNUQVRFX1BMQVlJTkc7CisgICAgICAgICAgICBjYXNlIFNUQVRFX1BBVVNFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gUGxheWJhY2tTdGF0ZS5TVEFURV9QQVVTRUQ7CisgICAgICAgICAgICBjYXNlIFNUQVRFX1BMQVlCQUNLX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gUGxheWJhY2tTdGF0ZS5TVEFURV9TVE9QUEVEOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIFJ1bm5hYmxlIG1GYWRlT3V0ID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgaWYgKG1DdXJyZW50U3RhdGUgPT0gU1RBVEVfUExBWUlORykgeworICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIHZvaWQgc2hvd0NvbnRyb2xsZXIoKSB7CisgICAgICAgIC8vIFRPRE86IERlY2lkZSB3aGF0IHRvIHNob3cgd2hlbiB0aGUgc3RhdGUgaXMgbm90IGluIHBsYXliYWNrIHN0YXRlCisgICAgICAgIGlmIChtTWVkaWFDb250cm9sVmlldyA9PSBudWxsIHx8ICFpc0luUGxheWJhY2tTdGF0ZSgpCisgICAgICAgICAgICAgICAgfHwgKG1Jc011c2ljTWVkaWFUeXBlICYmIG1TaXplVHlwZSA9PSBTSVpFX1RZUEVfRlVMTCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtTWVkaWFDb250cm9sVmlldy5yZW1vdmVDYWxsYmFja3MobUZhZGVPdXQpOworICAgICAgICBtTWVkaWFDb250cm9sVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgIGlmIChtU2hvd0NvbnRyb2xsZXJJbnRlcnZhbE1zICE9IDAKKyAgICAgICAgICAgICYmICFtQWNjZXNzaWJpbGl0eU1hbmFnZXIuaXNUb3VjaEV4cGxvcmF0aW9uRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBtTWVkaWFDb250cm9sVmlldy5wb3N0RGVsYXllZChtRmFkZU91dCwgbVNob3dDb250cm9sbGVySW50ZXJ2YWxNcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdG9nZ2xlTWVkaWFDb250cm9sVmlld1Zpc2liaWxpdHkoKSB7CisgICAgICAgIGlmIChtTWVkaWFDb250cm9sVmlldy5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7CisgICAgICAgICAgICBtTWVkaWFDb250cm9sVmlldy5yZW1vdmVDYWxsYmFja3MobUZhZGVPdXQpOworICAgICAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2hvd0NvbnRyb2xsZXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhcHBseVNwZWVkKCkgeworICAgICAgICBQbGF5YmFja1BhcmFtcyBwYXJhbXMgPSBtTWVkaWFQbGF5ZXIuZ2V0UGxheWJhY2tQYXJhbXMoKS5hbGxvd0RlZmF1bHRzKCk7CisgICAgICAgIGlmIChtU3BlZWQgIT0gcGFyYW1zLmdldFNwZWVkKCkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcGFyYW1zLnNldFNwZWVkKG1TcGVlZCk7CisgICAgICAgICAgICAgICAgbU1lZGlhUGxheWVyLnNldFBsYXliYWNrUGFyYW1zKHBhcmFtcyk7CisgICAgICAgICAgICAgICAgbUZhbGxiYWNrU3BlZWQgPSBtU3BlZWQ7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlBsYXliYWNrUGFyYW1zIGhhcyB1bnN1cHBvcnRlZCB2YWx1ZTogIiArIGUpOworICAgICAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCByZXZpc2UgdGhpcyBwYXJ0IGFmdGVyIGludGVncmF0aW5nIHdpdGggTVAyLgorICAgICAgICAgICAgICAgIC8vIElmIG1TcGVlZCBoYWQgYW4gaWxsZWdhbCB2YWx1ZSBmb3Igc3BlZWQgcmF0ZSwgc3lzdGVtIHdpbGwgZGV0ZXJtaW5lIGJlc3QKKyAgICAgICAgICAgICAgICAvLyBoYW5kbGluZyAoc2VlIFBsYXliYWNrUGFyYW1zLkFVRElPX0ZBTExCQUNLX01PREVfREVGQVVMVCkuCisgICAgICAgICAgICAgICAgLy8gTm90ZTogVGhlIHByZS1NUDIgcmV0dXJucyAwLjBmIHdoZW4gaXQgaXMgcGF1c2VkLiBJbiB0aGlzIGNhc2UsIFZpZGVvVmlldzIgd2lsbAorICAgICAgICAgICAgICAgIC8vIHVzZSBtRmFsbGJhY2tTcGVlZCBpbnN0ZWFkLgorICAgICAgICAgICAgICAgIGZsb2F0IGZhbGxiYWNrU3BlZWQgPSBtTWVkaWFQbGF5ZXIuZ2V0UGxheWJhY2tQYXJhbXMoKS5hbGxvd0RlZmF1bHRzKCkuZ2V0U3BlZWQoKTsKKyAgICAgICAgICAgICAgICBpZiAoZmFsbGJhY2tTcGVlZCA+IDAuMGYpIHsKKyAgICAgICAgICAgICAgICAgICAgbUZhbGxiYWNrU3BlZWQgPSBmYWxsYmFja1NwZWVkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtU3BlZWQgPSBtRmFsbGJhY2tTcGVlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc1JlbW90ZVBsYXliYWNrKCkgeworICAgICAgICBpZiAobU1lZGlhQ29udHJvbGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgUGxheWJhY2tJbmZvIHBsYXliYWNrSW5mbyA9IG1NZWRpYUNvbnRyb2xsZXIuZ2V0UGxheWJhY2tJbmZvKCk7CisgICAgICAgIHJldHVybiBwbGF5YmFja0luZm8gIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIHBsYXliYWNrSW5mby5nZXRQbGF5YmFja1R5cGUoKSA9PSBQbGF5YmFja0luZm8uUExBWUJBQ0tfVFlQRV9SRU1PVEU7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNlbGVjdE9yRGVzZWxlY3RTdWJ0aXRsZShib29sZWFuIHNlbGVjdCkgeworICAgICAgICBpZiAoIWlzSW5QbGF5YmFja1N0YXRlKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2VsZWN0KSB7CisgICAgICAgICAgICBpZiAobVN1YnRpdGxlVHJhY2tJbmRpY2VzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBtYWtlIHRoaXMgc2VsZWN0aW9uIGR5bmFtaWMKKyAgICAgICAgICAgICAgICBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXggPSBtU3VidGl0bGVUcmFja0luZGljZXMuZ2V0KDApLmZpcnN0OworICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUNvbnRyb2xsZXIuc2VsZWN0VHJhY2sobVN1YnRpdGxlVHJhY2tJbmRpY2VzLmdldCgwKS5zZWNvbmQpOworICAgICAgICAgICAgICAgIG1NZWRpYVBsYXllci5zZWxlY3RUcmFjayhtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXgpOworICAgICAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCAhPSBJTlZBTElEX1RSQUNLX0lOREVYKSB7CisgICAgICAgICAgICAgICAgbU1lZGlhUGxheWVyLmRlc2VsZWN0VHJhY2sobVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4KTsKKyAgICAgICAgICAgICAgICBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXggPSBJTlZBTElEX1RSQUNLX0lOREVYOworICAgICAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGV4dHJhY3RUcmFja3MoKSB7CisgICAgICAgIExpc3Q8TWVkaWFQbGF5ZXIyLlRyYWNrSW5mbz4gdHJhY2tJbmZvcyA9IG1NZWRpYVBsYXllci5nZXRUcmFja0luZm8oKTsKKyAgICAgICAgbVZpZGVvVHJhY2tJbmRpY2VzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIG1BdWRpb1RyYWNrSW5kaWNlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBtU3VidGl0bGVUcmFja0luZGljZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgbVN1YnRpdGxlQ29udHJvbGxlci5yZXNldCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRyYWNrSW5mb3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGludCB0cmFja1R5cGUgPSB0cmFja0luZm9zLmdldChpKS5nZXRUcmFja1R5cGUoKTsKKyAgICAgICAgICAgIGlmICh0cmFja1R5cGUgPT0gTWVkaWFQbGF5ZXIyLlRyYWNrSW5mby5NRURJQV9UUkFDS19UWVBFX1ZJREVPKSB7CisgICAgICAgICAgICAgICAgbVZpZGVvVHJhY2tJbmRpY2VzLmFkZChpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHJhY2tUeXBlID09IE1lZGlhUGxheWVyMi5UcmFja0luZm8uTUVESUFfVFJBQ0tfVFlQRV9BVURJTykgeworICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrSW5kaWNlcy5hZGQoaSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRyYWNrVHlwZSA9PSBNZWRpYVBsYXllcjIuVHJhY2tJbmZvLk1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEUKKyAgICAgICAgICAgICAgICAgICAgfHwgdHJhY2tUeXBlID09IE1lZGlhUGxheWVyMi5UcmFja0luZm8uTUVESUFfVFJBQ0tfVFlQRV9USU1FRFRFWFQpIHsKKyAgICAgICAgICAgICAgICBTdWJ0aXRsZVRyYWNrIHRyYWNrID0gbVN1YnRpdGxlQ29udHJvbGxlci5hZGRUcmFjayh0cmFja0luZm9zLmdldChpKS5nZXRGb3JtYXQoKSk7CisgICAgICAgICAgICAgICAgaWYgKHRyYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlVHJhY2tJbmRpY2VzLmFkZChuZXcgUGFpcjw+KGksIHRyYWNrKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIFNlbGVjdCBmaXJzdCB0cmFja3MgYXMgZGVmYXVsdAorICAgICAgICBpZiAobVZpZGVvVHJhY2tJbmRpY2VzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIG1TZWxlY3RlZFZpZGVvVHJhY2tJbmRleCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1BdWRpb1RyYWNrSW5kaWNlcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBtU2VsZWN0ZWRBdWRpb1RyYWNrSW5kZXggPSAwOworICAgICAgICB9CisgICAgICAgIGlmIChtVmlkZW9UcmFja0luZGljZXMuc2l6ZSgpID09IDAgJiYgbUF1ZGlvVHJhY2tJbmRpY2VzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIG1Jc011c2ljTWVkaWFUeXBlID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEJ1bmRsZSBkYXRhID0gbmV3IEJ1bmRsZSgpOworICAgICAgICBkYXRhLnB1dEludChNZWRpYUNvbnRyb2xWaWV3MkltcGwuS0VZX1ZJREVPX1RSQUNLX0NPVU5ULCBtVmlkZW9UcmFja0luZGljZXMuc2l6ZSgpKTsKKyAgICAgICAgZGF0YS5wdXRJbnQoTWVkaWFDb250cm9sVmlldzJJbXBsLktFWV9BVURJT19UUkFDS19DT1VOVCwgbUF1ZGlvVHJhY2tJbmRpY2VzLnNpemUoKSk7CisgICAgICAgIGRhdGEucHV0SW50KE1lZGlhQ29udHJvbFZpZXcySW1wbC5LRVlfU1VCVElUTEVfVFJBQ0tfQ09VTlQsIG1TdWJ0aXRsZVRyYWNrSW5kaWNlcy5zaXplKCkpOworICAgICAgICBpZiAobVN1YnRpdGxlVHJhY2tJbmRpY2VzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIHNlbGVjdE9yRGVzZWxlY3RTdWJ0aXRsZShtU3VidGl0bGVFbmFibGVkKTsKKyAgICAgICAgfQorICAgICAgICBtTWVkaWFTZXNzaW9uLnNlbmRTZXNzaW9uRXZlbnQoTWVkaWFDb250cm9sVmlldzJJbXBsLkVWRU5UX1VQREFURV9UUkFDS19TVEFUVVMsIGRhdGEpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBleHRyYWN0TWV0YWRhdGEoKSB7CisgICAgICAgIC8vIEdldCBhbmQgc2V0IGR1cmF0aW9uIGFuZCB0aXRsZSB2YWx1ZXMgYXMgTWVkaWFNZXRhZGF0YSBmb3IgTWVkaWFDb250cm9sVmlldzIKKyAgICAgICAgTWVkaWFNZXRhZGF0YS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgTWVkaWFNZXRhZGF0YS5CdWlsZGVyKCk7CisgICAgICAgIGlmIChtTWV0YWRhdGEgIT0gbnVsbCAmJiBtTWV0YWRhdGEuaGFzKE1ldGFkYXRhLlRJVExFKSkgeworICAgICAgICAgICAgbVRpdGxlID0gbU1ldGFkYXRhLmdldFN0cmluZyhNZXRhZGF0YS5USVRMRSk7CisgICAgICAgIH0KKyAgICAgICAgYnVpbGRlci5wdXRTdHJpbmcoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfVElUTEUsIG1UaXRsZSk7CisgICAgICAgIGJ1aWxkZXIucHV0TG9uZygKKyAgICAgICAgICAgICAgICBNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9EVVJBVElPTiwgbU1lZGlhUGxheWVyLmdldER1cmF0aW9uKCkpOworCisgICAgICAgIGlmIChtTWVkaWFTZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1NZWRpYVNlc3Npb24uc2V0TWV0YWRhdGEoYnVpbGRlci5idWlsZCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBleHRyYWN0QXVkaW9NZXRhZGF0YSgpIHsKKyAgICAgICAgaWYgKCFtSXNNdXNpY01lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbVJlc291cmNlcyA9IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUluc3RhbmNlLmdldENvbnRleHQoKSk7CisgICAgICAgIG1NYW5hZ2VyID0gKFdpbmRvd01hbmFnZXIpIG1JbnN0YW5jZS5nZXRDb250ZXh0KCkuZ2V0QXBwbGljYXRpb25Db250ZXh0KCkKKyAgICAgICAgICAgICAgICAuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LldJTkRPV19TRVJWSUNFKTsKKworICAgICAgICBieXRlW10gYWxidW0gPSBtUmV0cmlldmVyLmdldEVtYmVkZGVkUGljdHVyZSgpOworICAgICAgICBpZiAoYWxidW0gIT0gbnVsbCkgeworICAgICAgICAgICAgQml0bWFwIGJpdG1hcCA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlQnl0ZUFycmF5KGFsYnVtLCAwLCBhbGJ1bS5sZW5ndGgpOworICAgICAgICAgICAgbU11c2ljQWxidW1EcmF3YWJsZSA9IG5ldyBCaXRtYXBEcmF3YWJsZShiaXRtYXApOworCisgICAgICAgICAgICAvLyBUT0RPOiByZXBsYWNlIHdpdGggdmlzdWFsaXplcgorICAgICAgICAgICAgUGFsZXR0ZS5nZW5lcmF0ZUFzeW5jKGJpdG1hcCwgbmV3IFBhbGV0dGUuUGFsZXR0ZUFzeW5jTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25HZW5lcmF0ZWQoUGFsZXR0ZSBwYWxldHRlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGFkZCBkb21pbmFudCBjb2xvciBmb3IgZGVmYXVsdCBhbGJ1bSBpbWFnZS4KKyAgICAgICAgICAgICAgICAgICAgbURvbWluYW50Q29sb3IgPSBwYWxldHRlLmdldERvbWluYW50Q29sb3IoMCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtTXVzaWNWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1NdXNpY1ZpZXcuc2V0QmFja2dyb3VuZENvbG9yKG1Eb21pbmFudENvbG9yKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbU11c2ljQWxidW1EcmF3YWJsZSA9IG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19kZWZhdWx0X2FsYnVtX2ltYWdlKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyB0aXRsZSA9IG1SZXRyaWV2ZXIuZXh0cmFjdE1ldGFkYXRhKE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuTUVUQURBVEFfS0VZX1RJVExFKTsKKyAgICAgICAgaWYgKHRpdGxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1NdXNpY1RpdGxlVGV4dCA9IHRpdGxlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbU11c2ljVGl0bGVUZXh0ID0gbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9tdXNpY190aXRsZV91bmtub3duX3RleHQpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGFydGlzdCA9IG1SZXRyaWV2ZXIuZXh0cmFjdE1ldGFkYXRhKE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuTUVUQURBVEFfS0VZX0FSVElTVCk7CisgICAgICAgIGlmIChhcnRpc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgbU11c2ljQXJ0aXN0VGV4dCA9IGFydGlzdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1NdXNpY0FydGlzdFRleHQgPSBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX211c2ljX2FydGlzdF91bmtub3duX3RleHQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2VuZCB0aXRsZSBhbmQgYXJ0aXN0IHN0cmluZyB0byBNZWRpYUNvbnRyb2xWaWV3MgorICAgICAgICBNZWRpYU1ldGFkYXRhLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBNZWRpYU1ldGFkYXRhLkJ1aWxkZXIoKTsKKyAgICAgICAgYnVpbGRlci5wdXRTdHJpbmcoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfVElUTEUsIG1NdXNpY1RpdGxlVGV4dCk7CisgICAgICAgIGJ1aWxkZXIucHV0U3RyaW5nKE1lZGlhTWV0YWRhdGEuTUVUQURBVEFfS0VZX0FSVElTVCwgbU11c2ljQXJ0aXN0VGV4dCk7CisgICAgICAgIG1NZWRpYVNlc3Npb24uc2V0TWV0YWRhdGEoYnVpbGRlci5idWlsZCgpKTsKKworICAgICAgICAvLyBEaXNwbGF5IEVtYmVkZGVkIG1vZGUgYXMgZGVmYXVsdAorICAgICAgICBtSW5zdGFuY2UucmVtb3ZlVmlldyhtU3VyZmFjZVZpZXcpOworICAgICAgICBtSW5zdGFuY2UucmVtb3ZlVmlldyhtVGV4dHVyZVZpZXcpOworICAgICAgICBpbmZsYXRlTXVzaWNWaWV3KFIubGF5b3V0LmVtYmVkZGVkX211c2ljKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCByZXRyaWV2ZU9yaWVudGF0aW9uKCkgeworICAgICAgICBEaXNwbGF5TWV0cmljcyBkbSA9IFJlc291cmNlcy5nZXRTeXN0ZW0oKS5nZXREaXNwbGF5TWV0cmljcygpOworICAgICAgICBpbnQgd2lkdGggPSBkbS53aWR0aFBpeGVsczsKKyAgICAgICAgaW50IGhlaWdodCA9IGRtLmhlaWdodFBpeGVsczsKKworICAgICAgICByZXR1cm4gKGhlaWdodCA+IHdpZHRoKSA/CisgICAgICAgICAgICAgICAgQWN0aXZpdHlJbmZvLlNDUkVFTl9PUklFTlRBVElPTl9QT1JUUkFJVCA6CisgICAgICAgICAgICAgICAgQWN0aXZpdHlJbmZvLlNDUkVFTl9PUklFTlRBVElPTl9MQU5EU0NBUEU7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluZmxhdGVNdXNpY1ZpZXcoaW50IGxheW91dElkKSB7CisgICAgICAgIG1JbnN0YW5jZS5yZW1vdmVWaWV3KG1NdXNpY1ZpZXcpOworCisgICAgICAgIFZpZXcgdiA9IEFwaUhlbHBlci5pbmZsYXRlTGliTGF5b3V0KG1JbnN0YW5jZS5nZXRDb250ZXh0KCksIGxheW91dElkKTsKKyAgICAgICAgdi5zZXRCYWNrZ3JvdW5kQ29sb3IobURvbWluYW50Q29sb3IpOworCisgICAgICAgIEltYWdlVmlldyBhbGJ1bVZpZXcgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmFsYnVtKTsKKyAgICAgICAgaWYgKGFsYnVtVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBhbGJ1bVZpZXcuc2V0SW1hZ2VEcmF3YWJsZShtTXVzaWNBbGJ1bURyYXdhYmxlKTsKKyAgICAgICAgfQorCisgICAgICAgIFRleHRWaWV3IHRpdGxlVmlldyA9IHYuZmluZFZpZXdCeUlkKFIuaWQudGl0bGUpOworICAgICAgICBpZiAodGl0bGVWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRpdGxlVmlldy5zZXRUZXh0KG1NdXNpY1RpdGxlVGV4dCk7CisgICAgICAgIH0KKworICAgICAgICBUZXh0VmlldyBhcnRpc3RWaWV3ID0gdi5maW5kVmlld0J5SWQoUi5pZC5hcnRpc3QpOworICAgICAgICBpZiAoYXJ0aXN0VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBhcnRpc3RWaWV3LnNldFRleHQobU11c2ljQXJ0aXN0VGV4dCk7CisgICAgICAgIH0KKworICAgICAgICBtTXVzaWNWaWV3ID0gdjsKKyAgICAgICAgbUluc3RhbmNlLmFkZFZpZXcobU11c2ljVmlldywgMCk7CisgICAgfQorCisgICAgT25TdWJ0aXRsZURhdGFMaXN0ZW5lciBtU3VidGl0bGVMaXN0ZW5lciA9CisgICAgICAgICAgICBuZXcgT25TdWJ0aXRsZURhdGFMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1YnRpdGxlRGF0YShNZWRpYVBsYXllcjIgbXAsIFN1YnRpdGxlRGF0YSBkYXRhKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25TdWJ0aXRsZURhdGEoKTogZ2V0VHJhY2tJbmRleDogIiArIGRhdGEuZ2V0VHJhY2tJbmRleCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgZ2V0Q3VycmVudFBvc2l0aW9uOiAiICsgbXAuZ2V0Q3VycmVudFBvc2l0aW9uKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBnZXRTdGFydFRpbWVVcygpOiAiICsgZGF0YS5nZXRTdGFydFRpbWVVcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgZGlmZjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChkYXRhLmdldFN0YXJ0VGltZVVzKCkvMTAwMCAtIG1wLmdldEN1cnJlbnRQb3NpdGlvbigpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJtcywgZ2V0RHVyYXRpb25VcygpOiAiICsgZGF0YS5nZXREdXJhdGlvblVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCA9IGRhdGEuZ2V0VHJhY2tJbmRleCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT0gbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblN1YnRpdGxlRGF0YSgpOiBnZXRUcmFja0luZGV4OiAiICsgZGF0YS5nZXRUcmFja0luZGV4KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBzZWxlY3RlZCB0cmFjayBpbmRleDogIiArIG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChQYWlyPEludGVnZXIsIFN1YnRpdGxlVHJhY2s+IHAgOiBtU3VidGl0bGVUcmFja0luZGljZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwLmZpcnN0ID09IGluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VidGl0bGVUcmFjayB0cmFjayA9IHAuc2Vjb25kOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLm9uRGF0YShkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICBNZWRpYVBsYXllcjJFdmVudENhbGxiYWNrIG1NZWRpYVBsYXllcjJDYWxsYmFjayA9CisgICAgICAgICAgICBuZXcgTWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjaygpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblZpZGVvU2l6ZUNoYW5nZWQoCisgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25WaWRlb1NpemVDaGFuZ2VkKCk6IHNpemU6ICIgKyB3aWR0aCArICIvIiArIGhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbVZpZGVvV2lkdGggPSBtcC5nZXRWaWRlb1dpZHRoKCk7CisgICAgICAgICAgICAgICAgICAgIG1WaWRlb0hlaWdodCA9IG1wLmdldFZpZGVvSGVpZ2h0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25WaWRlb1NpemVDaGFuZ2VkKCk6IG1WaWRlb1NpemU6IiArIG1WaWRlb1dpZHRoICsgIi8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbVZpZGVvSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobVZpZGVvV2lkdGggIT0gMCAmJiBtVmlkZW9IZWlnaHQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnJlcXVlc3RMYXlvdXQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFRPRE86IFJlbW92ZSB0aW1lZCB0ZXh0IHJlbGF0ZWQgY29kZSBsYXRlciBvbmNlIHJlbGV2YW50IFJlbmRlcmVyIGlzIGRlZmluZWQuCisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBqdXN0IGZvciBkZWJ1Z2dpbmcgcHVycG9zZS4KKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblRpbWVkVGV4dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBUaW1lZFRleHQgdGV4dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiVGltZWRUZXh0OiAiICsgdGV4dC5nZXRUZXh0KCkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSW5mbygKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBpbnQgd2hhdCwgaW50IGV4dHJhKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IE1lZGlhUGxheWVyMi5NRURJQV9JTkZPX01FVEFEQVRBX1VQREFURSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdFRyYWNrcygpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLk1FRElBX0lORk9fUFJFUEFSRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25QcmVwYXJlZChtcCwgZHNkKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IE1lZGlhUGxheWVyMi5NRURJQV9JTkZPX1BMQVlCQUNLX0NPTVBMRVRFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQ29tcGxldGlvbihtcCwgZHNkKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IE1lZGlhUGxheWVyMi5NRURJQV9JTkZPX0JVRkZFUklOR19VUERBVEUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25CdWZmZXJpbmdVcGRhdGUobXAsIGRzZCwgZXh0cmEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBpbnQgZnJhbWV3b3JrRXJyLCBpbnQgaW1wbEVycikgeworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkVycm9yOiAiICsgZnJhbWV3b3JrRXJyICsgIiwiICsgaW1wbEVycik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX0VSUk9SOworICAgICAgICAgICAgICAgICAgICBtVGFyZ2V0U3RhdGUgPSBTVEFURV9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlUGxheWJhY2tTdGF0ZSgpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChtTWVkaWFDb250cm9sVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNhbGxDb21wbGV0ZWQoTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCB3aGF0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuQ0FMTF9DT01QTEVURURfU0VFS19UTyAmJiBzdGF0dXMgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlUGxheWJhY2tTdGF0ZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIG9uUHJlcGFyZWQoTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJPblByZXBhcmVkTGlzdGVuZXIoKS4gbUN1cnJlbnRTdGF0ZT0iICsgbUN1cnJlbnRTdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIG1UYXJnZXRTdGF0ZT0iICsgbVRhcmdldFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfUFJFUEFSRUQ7CisgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhbmQgc2V0IHBsYXliYWNrIHN0YXRlIGZvciBNZWRpYUNvbnRyb2xWaWV3MgorICAgICAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja1N0YXRlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogY2hhbmdlIHRoaXMgdG8gc2VuZCBUcmFja0luZm9zIHRvIE1lZGlhQ29udHJvbFZpZXcyCisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGNyZWF0ZSBNZWRpYVNlc3Npb24gd2hlbiBpbml0aWFsaXppbmcgVmlkZW9WaWV3MgorICAgICAgICAgICAgICAgICAgICBpZiAobU1lZGlhU2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0VHJhY2tzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0TWV0YWRhdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RBdWRpb01ldGFkYXRhKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAobU1lZGlhQ29udHJvbFZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcuc2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnQgdmlkZW9XaWR0aCA9IG1wLmdldFZpZGVvV2lkdGgoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHZpZGVvSGVpZ2h0ID0gbXAuZ2V0VmlkZW9IZWlnaHQoKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBtU2Vla1doZW5QcmVwYXJlZCBtYXkgYmUgY2hhbmdlZCBhZnRlciBzZWVrVG8oKSBjYWxsCisgICAgICAgICAgICAgICAgICAgIGxvbmcgc2Vla1RvUG9zaXRpb24gPSBtU2Vla1doZW5QcmVwYXJlZDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlZWtUb1Bvc2l0aW9uICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIuZ2V0VHJhbnNwb3J0Q29udHJvbHMoKS5zZWVrVG8oc2Vla1RvUG9zaXRpb24pOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvV2lkdGggIT0gMCAmJiB2aWRlb0hlaWdodCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW9XaWR0aCAhPSBtVmlkZW9XaWR0aCB8fCB2aWRlb0hlaWdodCAhPSBtVmlkZW9IZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiT25QcmVwYXJlZExpc3RlbmVyKCkgOiAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiIHZpZGVvIHNpemU6ICIgKyB2aWRlb1dpZHRoICsgIi8iICsgdmlkZW9IZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICIgbWVhc3VyZWRTaXplOiAiICsgbUluc3RhbmNlLmdldE1lYXN1cmVkV2lkdGgoKSArICIvIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUluc3RhbmNlLmdldE1lYXN1cmVkSGVpZ2h0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICIgdmlld1NpemU6ICIgKyBtSW5zdGFuY2UuZ2V0V2lkdGgoKSArICIvIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUluc3RhbmNlLmdldEhlaWdodCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvV2lkdGggPSB2aWRlb1dpZHRoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWRlb0hlaWdodCA9IHZpZGVvSGVpZ2h0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5yZXF1ZXN0TGF5b3V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZWVkVG9TdGFydCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlci5nZXRUcmFuc3BvcnRDb250cm9scygpLnBsYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IGtub3cgdGhlIHZpZGVvIHNpemUgeWV0LCBidXQgc2hvdWxkIHN0YXJ0IGFueXdheS4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSB2aWRlbyBzaXplIG1pZ2h0IGJlIHJlcG9ydGVkIHRvIHVzIGxhdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5lZWRUb1N0YXJ0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLmdldFRyYW5zcG9ydENvbnRyb2xzKCkucGxheSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIG9uQ29tcGxldGlvbihNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCkgeworICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfUExBWUJBQ0tfQ09NUExFVEVEOworICAgICAgICAgICAgICAgICAgICBtVGFyZ2V0U3RhdGUgPSBTVEFURV9QTEFZQkFDS19DT01QTEVURUQ7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrU3RhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1BdWRpb0ZvY3VzVHlwZSAhPSBBdWRpb01hbmFnZXIuQVVESU9GT0NVU19OT05FKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLmFiYW5kb25BdWRpb0ZvY3VzKG51bGwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIG9uQnVmZmVyaW5nVXBkYXRlKE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBpbnQgcGVyY2VudCkgeworICAgICAgICAgICAgICAgICAgICBtQ3VycmVudEJ1ZmZlclBlcmNlbnRhZ2UgPSBwZXJjZW50OworICAgICAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja1N0YXRlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgIHByaXZhdGUgY2xhc3MgTWVkaWFTZXNzaW9uQ2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVNlc3Npb24uQ2FsbGJhY2sgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Db21tYW5kKFN0cmluZyBjb21tYW5kLCBCdW5kbGUgYXJncywgUmVzdWx0UmVjZWl2ZXIgcmVjZWl2ZXIpIHsKKyAgICAgICAgICAgIGlmIChpc1JlbW90ZVBsYXliYWNrKCkpIHsKKyAgICAgICAgICAgICAgICBtUm91dGVQbGF5ZXIub25Db21tYW5kKGNvbW1hbmQsIGFyZ3MsIHJlY2VpdmVyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChjb21tYW5kKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzJJbXBsLkNPTU1BTkRfU0hPV19TVUJUSVRMRToKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdWJ0aXRsZUluZGV4ID0gYXJncy5nZXRJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhQ29udHJvbFZpZXcySW1wbC5LRVlfU0VMRUNURURfU1VCVElUTEVfSU5ERVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVkFMSURfVFJBQ0tfSU5ERVgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YnRpdGxlSW5kZXggIT0gSU5WQUxJRF9UUkFDS19JTkRFWCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdWJ0aXRsZVRyYWNrSW5kZXggPSBtU3VidGl0bGVUcmFja0luZGljZXMuZ2V0KHN1YnRpdGxlSW5kZXgpLmZpcnN0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJ0aXRsZVRyYWNrSW5kZXggIT0gbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCA9IHN1YnRpdGxlVHJhY2tJbmRleDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnNldFN1YnRpdGxlRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3MkltcGwuQ09NTUFORF9ISURFX1NVQlRJVExFOgorICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnNldFN1YnRpdGxlRW5hYmxlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3MkltcGwuQ09NTUFORF9TRVRfRlVMTFNDUkVFTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRnVsbFNjcmVlblJlcXVlc3RMaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5SZXF1ZXN0TGlzdGVuZXIub25GdWxsU2NyZWVuUmVxdWVzdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MuZ2V0Qm9vbGVhbihNZWRpYUNvbnRyb2xWaWV3MkltcGwuQVJHVU1FTlRfS0VZX0ZVTExTQ1JFRU4pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcySW1wbC5DT01NQU5EX1NFTEVDVF9BVURJT19UUkFDSzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb0luZGV4ID0gYXJncy5nZXRJbnQoTWVkaWFDb250cm9sVmlldzJJbXBsLktFWV9TRUxFQ1RFRF9BVURJT19JTkRFWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5WQUxJRF9UUkFDS19JTkRFWCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXVkaW9JbmRleCAhPSBJTlZBTElEX1RSQUNLX0lOREVYKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1ZGlvVHJhY2tJbmRleCA9IG1BdWRpb1RyYWNrSW5kaWNlcy5nZXQoYXVkaW9JbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvVHJhY2tJbmRleCAhPSBtU2VsZWN0ZWRBdWRpb1RyYWNrSW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkQXVkaW9UcmFja0luZGV4ID0gYXVkaW9UcmFja0luZGV4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFQbGF5ZXIuc2VsZWN0VHJhY2sobVNlbGVjdGVkQXVkaW9UcmFja0luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3MkltcGwuQ09NTUFORF9TRVRfUExBWUJBQ0tfU1BFRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzcGVlZCA9IGFyZ3MuZ2V0RmxvYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhQ29udHJvbFZpZXcySW1wbC5LRVlfUExBWUJBQ0tfU1BFRUQsIElOVkFMSURfU1BFRUQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwZWVkICE9IElOVkFMSURfU1BFRUQgJiYgc3BlZWQgIT0gbVNwZWVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnNldFNwZWVkKHNwZWVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3BlZWQgPSBzcGVlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcySW1wbC5DT01NQU5EX01VVEU6CisgICAgICAgICAgICAgICAgICAgICAgICBtVm9sdW1lTGV2ZWwgPSBtQXVkaW9NYW5hZ2VyLmdldFN0cmVhbVZvbHVtZShBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0U3RyZWFtVm9sdW1lKEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUMsIDAsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzJJbXBsLkNPTU1BTkRfVU5NVVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRTdHJlYW1Wb2x1bWUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQywgbVZvbHVtZUxldmVsLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNob3dDb250cm9sbGVyKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DdXN0b21BY3Rpb24oU3RyaW5nIGFjdGlvbiwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICAgICAgbUN1c3RvbUFjdGlvbkxpc3RlbmVyUmVjb3JkLmZpcnN0LmV4ZWN1dGUoKCkgLT4KKyAgICAgICAgICAgICAgICAgICAgbUN1c3RvbUFjdGlvbkxpc3RlbmVyUmVjb3JkLnNlY29uZC5vbkN1c3RvbUFjdGlvbihhY3Rpb24sIGV4dHJhcykpOworICAgICAgICAgICAgc2hvd0NvbnRyb2xsZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXkoKSB7CisgICAgICAgICAgICBpZiAoaXNJblBsYXliYWNrU3RhdGUoKSAmJiAobUN1cnJlbnRWaWV3Lmhhc0F2YWlsYWJsZVN1cmZhY2UoKSB8fCBtSXNNdXNpY01lZGlhVHlwZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNSZW1vdGVQbGF5YmFjaygpKSB7CisgICAgICAgICAgICAgICAgICAgIG1Sb3V0ZVBsYXllci5vblBsYXkoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhcHBseVNwZWVkKCk7CisgICAgICAgICAgICAgICAgICAgIG1NZWRpYVBsYXllci5wbGF5KCk7CisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QTEFZSU5HOworICAgICAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja1N0YXRlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QTEFZSU5HOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVRhcmdldFN0YXRlID0gU1RBVEVfUExBWUlORzsKKyAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9uUGxheSgpLiBtQ3VycmVudFN0YXRlPSIgKyBtQ3VycmVudFN0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICArICIsIG1UYXJnZXRTdGF0ZT0iICsgbVRhcmdldFN0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNob3dDb250cm9sbGVyKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25QYXVzZSgpIHsKKyAgICAgICAgICAgIGlmIChpc0luUGxheWJhY2tTdGF0ZSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzUmVtb3RlUGxheWJhY2soKSkgeworICAgICAgICAgICAgICAgICAgICBtUm91dGVQbGF5ZXIub25QYXVzZSgpOworICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfUEFVU0VEOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobU1lZGlhUGxheWVyLmlzUGxheWluZygpKSB7CisgICAgICAgICAgICAgICAgICAgIG1NZWRpYVBsYXllci5wYXVzZSgpOworICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfUEFVU0VEOworICAgICAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja1N0YXRlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbVRhcmdldFN0YXRlID0gU1RBVEVfUEFVU0VEOworICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25QYXVzZSgpLiBtQ3VycmVudFN0YXRlPSIgKyBtQ3VycmVudFN0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICArICIsIG1UYXJnZXRTdGF0ZT0iICsgbVRhcmdldFN0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNob3dDb250cm9sbGVyKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TZWVrVG8obG9uZyBwb3MpIHsKKyAgICAgICAgICAgIGlmIChpc0luUGxheWJhY2tTdGF0ZSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzUmVtb3RlUGxheWJhY2soKSkgeworICAgICAgICAgICAgICAgICAgICBtUm91dGVQbGF5ZXIub25TZWVrVG8ocG9zKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtTWVkaWFQbGF5ZXIuc2Vla1RvKHBvcywgTWVkaWFQbGF5ZXIyLlNFRUtfUFJFVklPVVNfU1lOQyk7CisgICAgICAgICAgICAgICAgICAgIG1TZWVrV2hlblByZXBhcmVkID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1TZWVrV2hlblByZXBhcmVkID0gcG9zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2hvd0NvbnRyb2xsZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblN0b3AoKSB7CisgICAgICAgICAgICBpZiAoaXNSZW1vdGVQbGF5YmFjaygpKSB7CisgICAgICAgICAgICAgICAgbVJvdXRlUGxheWVyLm9uU3RvcCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXNldFBsYXllcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2hvd0NvbnRyb2xsZXIoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZGVvVmlld0ludGVyZmFjZS5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9WaWV3SW50ZXJmYWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU0ZDQ3ZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZGVvVmlld0ludGVyZmFjZS5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQud2lkZ2V0OworCitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK2ludGVyZmFjZSBWaWRlb1ZpZXdJbnRlcmZhY2UgeworICAgIC8qKgorICAgICAqIEFzc2lnbnMgdGhlIHZpZXcncyBzdXJmYWNlIHRvIHRoZSBnaXZlbiBNZWRpYVBsYXllcjIgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbXAgTWVkaWFQbGF5ZXIyCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzdXJmYWNlIGlzIHN1Y2Nlc3NmdWxseSBhc3NpZ25lZCwgZmFsc2UgaWYgbm90LiBJdCB3aWxsIGZhaWwgdG8gYXNzaWduCisgICAgICogICAgICAgICBpZiBhbnkgb2YgTWVkaWFQbGF5ZXIyIG9yIHN1cmZhY2UgaXMgdW5hdmFpbGFibGUuCisgICAgICovCisgICAgYm9vbGVhbiBhc3NpZ25TdXJmYWNlVG9NZWRpYVBsYXllcihNZWRpYVBsYXllcjIgbXApOworICAgIHZvaWQgc2V0U3VyZmFjZUxpc3RlbmVyKFN1cmZhY2VMaXN0ZW5lciBsKTsKKyAgICBpbnQgZ2V0Vmlld1R5cGUoKTsKKyAgICB2b2lkIHNldE1lZGlhUGxheWVyKE1lZGlhUGxheWVyMiBtcCk7CisKKyAgICAvKioKKyAgICAgKiBUYWtlcyBvdmVyIG9sZFZpZXcuIEl0IG1lYW5zIHRoYXQgdGhlIE1lZGlhUGxheWVyMiB3aWxsIHN0YXJ0IHJlbmRlcmluZyBvbiB0aGlzIHZpZXcuCisgICAgICogVGhlIHZpc2liaWxpdHkgb2Ygb2xkVmlldyB3aWxsIGJlIHNldCBhcyB7QGxpbmsgVmlldy5HT05FfS4gSWYgdGhlIHZpZXcgZG9lc24ndCBoYXZlIGEKKyAgICAgKiBNZWRpYVBsYXllcjIgaW5zdGFuY2Ugb3IgaXRzIHN1cmZhY2UgaXMgbm90IGF2YWlsYWJsZSwgdGhlIGFjdHVhbCBleGVjdXRpb24gaXMgZGVmZXJyZWQgdW50aWwKKyAgICAgKiBhIE1lZGlhUGxheWVyMiBpbnN0YW5jZSBpcyBzZXQgYnkge0BsaW5rICNzZXRNZWRpYVBsYXllcn0gb3IgaXRzIHN1cmZhY2UgYmVjb21lcyBhdmFpbGFibGUuCisgICAgICoge0BsaW5rIFN1cmZhY2VMaXN0ZW5lci5vblN1cmZhY2VUYWtlT3ZlckRvbmV9IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGFjdHVhbCBleGVjdXRpb24gaXMKKyAgICAgKiBkb25lLgorICAgICAqCisgICAgICogQHBhcmFtIG9sZFZpZXcgVGhlIHZpZXcgdGhhdCBNZWRpYVBsYXllcjIgaXMgY3VycmVudGx5IHJlbmRlcmluZyBvbi4KKyAgICAgKi8KKyAgICB2b2lkIHRha2VPdmVyKEBOb25OdWxsIFZpZGVvVmlld0ludGVyZmFjZSBvbGRWaWV3KTsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyBpZiB0aGUgdmlldydzIHN1cmZhY2UgaXMgYXZhaWxhYmxlLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzdXJmYWNlIGlzIGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBib29sZWFuIGhhc0F2YWlsYWJsZVN1cmZhY2UoKTsKKworICAgIC8qKgorICAgICAqIEFuIGluc3RhbmNlIG9mIFZpZGVvVmlld0ludGVyZmFjZSBjYWxscyB0aGVzZSBzdXJmYWNlIG5vdGlmaWNhdGlvbiBtZXRob2RzIGFjY29yZGluZ2x5IGlmCisgICAgICogYSBsaXN0ZW5lciBoYXMgYmVlbiByZWdpc3RlcmVkIHZpYSB7QGxpbmsgI3NldFN1cmZhY2VMaXN0ZW5lcihTdXJmYWNlTGlzdGVuZXIpfS4KKyAgICAgKi8KKyAgICBpbnRlcmZhY2UgU3VyZmFjZUxpc3RlbmVyIHsKKyAgICAgICAgdm9pZCBvblN1cmZhY2VDcmVhdGVkKFZpZXcgdmlldywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKyAgICAgICAgdm9pZCBvblN1cmZhY2VEZXN0cm95ZWQoVmlldyB2aWV3KTsKKyAgICAgICAgdm9pZCBvblN1cmZhY2VDaGFuZ2VkKFZpZXcgdmlldywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKyAgICAgICAgdm9pZCBvblN1cmZhY2VUYWtlT3ZlckRvbmUoVmlkZW9WaWV3SW50ZXJmYWNlIHZpZXcpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZXdHcm91cEltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZXdHcm91cEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTA2ODI2Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlld0dyb3VwSW1wbC5qYXZhCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLndpZGdldDsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlZpZXdHcm91cFByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBWaWV3R3JvdXBJbXBsIGltcGxlbWVudHMgVmlld0dyb3VwUHJvdmlkZXIgeworICAgIHByaXZhdGUgZmluYWwgVmlld0dyb3VwUHJvdmlkZXIgbVN1cGVyUHJvdmlkZXI7CisKKyAgICBwdWJsaWMgVmlld0dyb3VwSW1wbChWaWV3R3JvdXAgaW5zdGFuY2UsCisgICAgICAgICAgICBWaWV3R3JvdXBQcm92aWRlciBzdXBlclByb3ZpZGVyLCBWaWV3R3JvdXBQcm92aWRlciBwcml2YXRlUHJvdmlkZXIpIHsKKyAgICAgICAgbVN1cGVyUHJvdmlkZXIgPSBzdXBlclByb3ZpZGVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQXR0YWNoZWRUb1dpbmRvd19pbXBsKCkgeworICAgICAgICBtU3VwZXJQcm92aWRlci5vbkF0dGFjaGVkVG9XaW5kb3dfaW1wbCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93X2ltcGwoKSB7CisgICAgICAgIG1TdXBlclByb3ZpZGVyLm9uRGV0YWNoZWRGcm9tV2luZG93X2ltcGwoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldEFjY2Vzc2liaWxpdHlDbGFzc05hbWVfaW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIG1TdXBlclByb3ZpZGVyLmdldEFjY2Vzc2liaWxpdHlDbGFzc05hbWVfaW1wbCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudF9pbXBsKE1vdGlvbkV2ZW50IGV2KSB7CisgICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5vblRvdWNoRXZlbnRfaW1wbChldik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25UcmFja2JhbGxFdmVudF9pbXBsKE1vdGlvbkV2ZW50IGV2KSB7CisgICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5vblRyYWNrYmFsbEV2ZW50X2ltcGwoZXYpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRmluaXNoSW5mbGF0ZV9pbXBsKCkgeworICAgICAgICBtU3VwZXJQcm92aWRlci5vbkZpbmlzaEluZmxhdGVfaW1wbCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZWRfaW1wbChib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgbVN1cGVyUHJvdmlkZXIuc2V0RW5hYmxlZF9pbXBsKGVuYWJsZWQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uVmlzaWJpbGl0eUFnZ3JlZ2F0ZWRfaW1wbChib29sZWFuIGlzVmlzaWJsZSkgeworICAgICAgICBtU3VwZXJQcm92aWRlci5vblZpc2liaWxpdHlBZ2dyZWdhdGVkX2ltcGwoaXNWaXNpYmxlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkxheW91dF9pbXBsKGJvb2xlYW4gY2hhbmdlZCwgaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSkgeworICAgICAgICBtU3VwZXJQcm92aWRlci5vbkxheW91dF9pbXBsKGNoYW5nZWQsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25NZWFzdXJlX2ltcGwoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgeworICAgICAgICBtU3VwZXJQcm92aWRlci5vbk1lYXN1cmVfaW1wbCh3aWR0aE1lYXN1cmVTcGVjLCBoZWlnaHRNZWFzdXJlU3BlYyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRTdWdnZXN0ZWRNaW5pbXVtV2lkdGhfaW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIG1TdXBlclByb3ZpZGVyLmdldFN1Z2dlc3RlZE1pbmltdW1XaWR0aF9pbXBsKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRTdWdnZXN0ZWRNaW5pbXVtSGVpZ2h0X2ltcGwoKSB7CisgICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5nZXRTdWdnZXN0ZWRNaW5pbXVtSGVpZ2h0X2ltcGwoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRNZWFzdXJlZERpbWVuc2lvbl9pbXBsKGludCBtZWFzdXJlZFdpZHRoLCBpbnQgbWVhc3VyZWRIZWlnaHQpIHsKKyAgICAgICAgbVN1cGVyUHJvdmlkZXIuc2V0TWVhc3VyZWREaW1lbnNpb25faW1wbChtZWFzdXJlZFdpZHRoLCBtZWFzdXJlZEhlaWdodCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hUb3VjaEV2ZW50X2ltcGwoTW90aW9uRXZlbnQgZXYpIHsKKyAgICAgICAgcmV0dXJuIG1TdXBlclByb3ZpZGVyLmRpc3BhdGNoVG91Y2hFdmVudF9pbXBsKGV2KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjaGVja0xheW91dFBhcmFtc19pbXBsKFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgcCkgeworICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIuY2hlY2tMYXlvdXRQYXJhbXNfaW1wbChwKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVmlld0dyb3VwLkxheW91dFBhcmFtcyBnZW5lcmF0ZURlZmF1bHRMYXlvdXRQYXJhbXNfaW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIG1TdXBlclByb3ZpZGVyLmdlbmVyYXRlRGVmYXVsdExheW91dFBhcmFtc19pbXBsKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgZ2VuZXJhdGVMYXlvdXRQYXJhbXNfaW1wbChBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgcmV0dXJuIG1TdXBlclByb3ZpZGVyLmdlbmVyYXRlTGF5b3V0UGFyYW1zX2ltcGwoYXR0cnMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIGdlbmVyYXRlTGF5b3V0UGFyYW1zX2ltcGwoVmlld0dyb3VwLkxheW91dFBhcmFtcyBscCkgeworICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIuZ2VuZXJhdGVMYXlvdXRQYXJhbXNfaW1wbChscCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gc2hvdWxkRGVsYXlDaGlsZFByZXNzZWRTdGF0ZV9pbXBsKCkgeworICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIuc2hvdWxkRGVsYXlDaGlsZFByZXNzZWRTdGF0ZV9pbXBsKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgbWVhc3VyZUNoaWxkV2l0aE1hcmdpbnNfaW1wbChWaWV3IGNoaWxkLAorICAgICAgICBpbnQgcGFyZW50V2lkdGhNZWFzdXJlU3BlYywgaW50IHdpZHRoVXNlZCwgaW50IHBhcmVudEhlaWdodE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0VXNlZCkgeworICAgICAgICBtU3VwZXJQcm92aWRlci5tZWFzdXJlQ2hpbGRXaXRoTWFyZ2luc19pbXBsKGNoaWxkLAorICAgICAgICAgICAgICAgIHBhcmVudFdpZHRoTWVhc3VyZVNwZWMsIHdpZHRoVXNlZCwgcGFyZW50SGVpZ2h0TWVhc3VyZVNwZWMsIGhlaWdodFVzZWQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy90ZXN0cy9BbmRyb2lkLm1rIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Rlc3RzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRkZmQyYQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy90ZXN0cy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzYgQEAKKyMgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKKyAgICBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzIFwKKyAgICBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicyBcCisgICAgbW9ja2l0by10YXJnZXQtbWludXMtanVuaXQ0IFwKKyAgICBqdW5pdAorCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBNZWRpYUNvbXBvbmVudHNUZXN0CisKK0xPQ0FMX0lOU1RSVU1FTlRBVElPTl9GT1IgOj0gTWVkaWFDb21wb25lbnRzCisKK0xPQ0FMX1BSSVZBVEVfUExBVEZPUk1fQVBJUyA6PSB0cnVlCisKK0xPQ0FMX0NFUlRJRklDQVRFIDo9IHBsYXRmb3JtCisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjU1MjY1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwzMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5tZWRpYS50ZXN0cyI+CisKKyAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpsYWJlbD0iTWVkaWEgQVBJIFRlc3QiPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPCEtLQorICAgIFRvIHJ1biB0aGUgdGVzdHMgdXNlIHRoZSBjb21tYW5kOgorICAgICJhZGIgc2hlbGwgYW0gaW5zdHJ1bWVudCAtdyBjb20uYW5kcm9pZC5tZWRpYS50ZXN0cy9hbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciIKKyAgICAtLT4KKyAgICA8aW5zdHJ1bWVudGF0aW9uCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQubWVkaWEudXBkYXRlIgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJNZWRpYSBBUEkgdGVzdCIgLz4KKworPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy90ZXN0cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvU2Vzc2lvblBsYXlsaXN0QWdlbnRUZXN0LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1Nlc3Npb25QbGF5bGlzdEFnZW50VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYjA4NDgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1Nlc3Npb25QbGF5bGlzdEFnZW50VGVzdC5qYXZhCkBAIC0wLDAgKzEsNjQyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOworCitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uKjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzOworaW1wb3J0IGFuZHJvaWQubWVkaWEuRGF0YVNvdXJjZURlc2M7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllckJhc2U7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllckJhc2UuUGxheWVyRXZlbnRDYWxsYmFjazsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWxpc3RBZ2VudDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLk9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXJUaHJlYWQ7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5tb2NraXRvLk1hdGNoZXJzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKKworLyoqCisgKiBUZXN0cyB7QGxpbmsgU2Vzc2lvblBsYXlsaXN0QWdlbnR9LgorICovCitwdWJsaWMgY2xhc3MgU2Vzc2lvblBsYXlsaXN0QWdlbnRUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNlc3Npb25QbGF5bGlzdEFnZW50VGVzdCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdBSVRfVElNRV9NUyA9IDEwMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfUkVQRUFUX01PREUgPSAtMTAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX1NIVUZGTEVfTU9ERSA9IC0xMDA7CisKKyAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXI7CisgICAgcHJpdmF0ZSBFeGVjdXRvciBtSGFuZGxlckV4ZWN1dG9yOworCisgICAgcHJpdmF0ZSBPYmplY3QgbVdhaXRMb2NrID0gbmV3IE9iamVjdCgpOworICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcml2YXRlIE1lZGlhU2Vzc2lvbjJJbXBsIG1TZXNzaW9uSW1wbDsKKyAgICBwcml2YXRlIE1lZGlhUGxheWVyQmFzZSBtUGxheWVyOworICAgIHByaXZhdGUgUGxheWVyRXZlbnRDYWxsYmFjayBtUGxheWVyRXZlbnRDYWxsYmFjazsKKyAgICBwcml2YXRlIFNlc3Npb25QbGF5bGlzdEFnZW50IG1BZ2VudDsKKyAgICBwcml2YXRlIE9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXIgbURhdGFTb3VyY2VIZWxwZXI7CisgICAgcHJpdmF0ZSBNeVBsYXlsaXN0RXZlbnRDYWxsYmFjayBtRXZlbnRDYWxsYmFjazsKKworICAgIHB1YmxpYyBjbGFzcyBNeVBsYXlsaXN0RXZlbnRDYWxsYmFjayBleHRlbmRzIE1lZGlhUGxheWxpc3RBZ2VudC5QbGF5bGlzdEV2ZW50Q2FsbGJhY2sgeworICAgICAgICBib29sZWFuIG9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkOworICAgICAgICBib29sZWFuIG9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWRDYWxsZWQ7CisgICAgICAgIGJvb2xlYW4gb25SZXBlYXRNb2RlQ2hhbmdlZENhbGxlZDsKKyAgICAgICAgYm9vbGVhbiBvblNodWZmbGVNb2RlQ2hhbmdlZENhbGxlZDsKKworICAgICAgICBwcml2YXRlIE9iamVjdCBtV2FpdExvY2s7CisKKyAgICAgICAgcHVibGljIE15UGxheWxpc3RFdmVudENhbGxiYWNrKE9iamVjdCB3YWl0TG9jaykgeworICAgICAgICAgICAgbVdhaXRMb2NrID0gd2FpdExvY2s7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgICAgIG9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7CisgICAgICAgICAgICBvblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7CisgICAgICAgICAgICBvblJlcGVhdE1vZGVDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7CisgICAgICAgICAgICBvblNodWZmbGVNb2RlQ2hhbmdlZENhbGxlZCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25QbGF5bGlzdENoYW5nZWQoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsIExpc3Q8TWVkaWFJdGVtMj4gbGlzdCwKKyAgICAgICAgICAgICAgICBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKKyAgICAgICAgICAgICAgICBvblBsYXlsaXN0Q2hhbmdlZENhbGxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgbVdhaXRMb2NrLm5vdGlmeSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZChNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwKKyAgICAgICAgICAgICAgICBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKKyAgICAgICAgICAgICAgICBvblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkQ2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtV2FpdExvY2subm90aWZ5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblJlcGVhdE1vZGVDaGFuZ2VkKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LCBpbnQgcmVwZWF0TW9kZSkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKKyAgICAgICAgICAgICAgICBvblJlcGVhdE1vZGVDaGFuZ2VkQ2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtV2FpdExvY2subm90aWZ5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblNodWZmbGVNb2RlQ2hhbmdlZChNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwgaW50IHNodWZmbGVNb2RlKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgeworICAgICAgICAgICAgICAgIG9uU2h1ZmZsZU1vZGVDaGFuZ2VkQ2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtV2FpdExvY2subm90aWZ5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgTXlEYXRhU291cmNlSGVscGVyIGltcGxlbWVudHMgT25EYXRhU291cmNlTWlzc2luZ0hlbHBlciB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRGF0YVNvdXJjZURlc2Mgb25EYXRhU291cmNlTWlzc2luZyhNZWRpYVNlc3Npb24yIHNlc3Npb24sIE1lZGlhSXRlbTIgaXRlbSkgeworICAgICAgICAgICAgaWYgKGl0ZW0uZ2V0TWVkaWFJZCgpLmNvbnRhaW5zKCJXSVRIT1VUX0RTRCIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IERhdGFTb3VyY2VEZXNjLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAuc2V0RGF0YVNvdXJjZShnZXRDb250ZXh0KCksIFVyaS5wYXJzZSgiZHNkOi8vdGVzdCIpKQorICAgICAgICAgICAgICAgICAgICAuc2V0TWVkaWFJZChpdGVtLmdldE1lZGlhSWQoKSkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgTW9ja1BsYXllciBleHRlbmRzIE1lZGlhUGxheWVyQmFzZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBwbGF5KCkgeworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHByZXBhcmUoKSB7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcGF1c2UoKSB7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2tpcFRvTmV4dCgpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZWVrVG8obG9uZyBwb3MpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGdldFBsYXllclN0YXRlKCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBnZXRCdWZmZXJpbmdTdGF0ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEF1ZGlvQXR0cmlidXRlcyhBdWRpb0F0dHJpYnV0ZXMgYXR0cmlidXRlcykgeworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBBdWRpb0F0dHJpYnV0ZXMgZ2V0QXVkaW9BdHRyaWJ1dGVzKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0RGF0YVNvdXJjZShEYXRhU291cmNlRGVzYyBkc2QpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXROZXh0RGF0YVNvdXJjZShEYXRhU291cmNlRGVzYyBkc2QpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXROZXh0RGF0YVNvdXJjZXMoTGlzdDxEYXRhU291cmNlRGVzYz4gZHNkcykgeworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBEYXRhU291cmNlRGVzYyBnZXRDdXJyZW50RGF0YVNvdXJjZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGxvb3BDdXJyZW50KGJvb2xlYW4gbG9vcCkgeworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFBsYXliYWNrU3BlZWQoZmxvYXQgc3BlZWQpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRQbGF5ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKSB7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGZsb2F0IGdldFBsYXllclZvbHVtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyUGxheWVyRXZlbnRDYWxsYmFjayhFeGVjdXRvciBlLCBQbGF5ZXJFdmVudENhbGxiYWNrIGNiKSB7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdW5yZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2soUGxheWVyRXZlbnRDYWxsYmFjayBjYikgeworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbUNvbnRleHQgPSBnZXRDb250ZXh0KCk7CisgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIGRleG1ha2VyIGJ1ZzogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9kZXhtYWtlci9pc3N1ZXMvZGV0YWlsP2lkPTIKKyAgICAgICAgLy8gRGV4bWFrZXIgaXMgdXNlZCBieSBtb2NraXRvLgorICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImRleG1ha2VyLmRleGNhY2hlIiwgbUNvbnRleHQuZ2V0Q2FjaGVEaXIoKS5nZXRQYXRoKCkpOworCisgICAgICAgIEhhbmRsZXJUaHJlYWQgaGFuZGxlclRocmVhZCA9IG5ldyBIYW5kbGVyVGhyZWFkKCJTZXNzaW9uUGxheWxpc3RBZ2VudCIpOworICAgICAgICBoYW5kbGVyVGhyZWFkLnN0YXJ0KCk7CisgICAgICAgIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoaGFuZGxlclRocmVhZC5nZXRMb29wZXIoKSk7CisgICAgICAgIG1IYW5kbGVyRXhlY3V0b3IgPSAocnVubmFibGUpIC0+IHsKKyAgICAgICAgICAgIG1IYW5kbGVyLnBvc3QocnVubmFibGUpOworICAgICAgICB9OworCisgICAgICAgIG1QbGF5ZXIgPSBtb2NrKE1vY2tQbGF5ZXIuY2xhc3MpOworICAgICAgICBkb0Fuc3dlcihpbnZvY2F0aW9uIC0+IHsKKyAgICAgICAgICAgIE9iamVjdFtdIGFyZ3MgPSBpbnZvY2F0aW9uLmdldEFyZ3VtZW50cygpOworICAgICAgICAgICAgbVBsYXllckV2ZW50Q2FsbGJhY2sgPSAoUGxheWVyRXZlbnRDYWxsYmFjaykgYXJnc1sxXTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9KS53aGVuKG1QbGF5ZXIpLnJlZ2lzdGVyUGxheWVyRXZlbnRDYWxsYmFjayhNYXRjaGVycy5hbnkoKSwgTWF0Y2hlcnMuYW55KCkpOworCisgICAgICAgIG1TZXNzaW9uSW1wbCA9IG1vY2soTWVkaWFTZXNzaW9uMkltcGwuY2xhc3MpOworICAgICAgICBtRGF0YVNvdXJjZUhlbHBlciA9IG5ldyBNeURhdGFTb3VyY2VIZWxwZXIoKTsKKyAgICAgICAgbUFnZW50ID0gbmV3IFNlc3Npb25QbGF5bGlzdEFnZW50KG1TZXNzaW9uSW1wbCwgbVBsYXllcik7CisgICAgICAgIG1BZ2VudC5zZXRPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyKG1EYXRhU291cmNlSGVscGVyKTsKKyAgICAgICAgbUV2ZW50Q2FsbGJhY2sgPSBuZXcgTXlQbGF5bGlzdEV2ZW50Q2FsbGJhY2sobVdhaXRMb2NrKTsKKyAgICAgICAgbUFnZW50LnJlZ2lzdGVyUGxheWxpc3RFdmVudENhbGxiYWNrKG1IYW5kbGVyRXhlY3V0b3IsIG1FdmVudENhbGxiYWNrKTsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtSGFuZGxlci5nZXRMb29wZXIoKS5xdWl0U2FmZWx5KCk7CisgICAgICAgIG1IYW5kbGVyID0gbnVsbDsKKyAgICAgICAgbUhhbmRsZXJFeGVjdXRvciA9IG51bGw7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0QW5kR2V0U2h1ZmxsZU1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IHNodWZmbGVNb2RlID0gbUFnZW50LmdldFNodWZmbGVNb2RlKCk7CisgICAgICAgIGlmIChzaHVmZmxlTW9kZSAhPSBNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX05PTkUpIHsKKyAgICAgICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgeworICAgICAgICAgICAgICAgIG1BZ2VudC5zZXRTaHVmZmxlTW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX05PTkUpOworICAgICAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblNodWZmbGVNb2RlQ2hhbmdlZENhbGxlZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9OT05FLCBtQWdlbnQuZ2V0U2h1ZmZsZU1vZGUoKSk7CisgICAgICAgIH0KKworICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgeworICAgICAgICAgICAgbUFnZW50LnNldFNodWZmbGVNb2RlKE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfQUxMKTsKKyAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uU2h1ZmZsZU1vZGVDaGFuZ2VkQ2FsbGVkKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9BTEwsIG1BZ2VudC5nZXRTaHVmZmxlTW9kZSgpKTsKKworICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgeworICAgICAgICAgICAgbUFnZW50LnNldFNodWZmbGVNb2RlKE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfR1JPVVApOworICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25TaHVmZmxlTW9kZUNoYW5nZWRDYWxsZWQpOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX0dST1VQLCBtQWdlbnQuZ2V0U2h1ZmZsZU1vZGUoKSk7CisKKyAgICAgICAgLy8gSU5WQUxJRF9TSFVGRkxFX01PREUgd2lsbCBub3QgY2hhbmdlIHRoZSBzaHVmZmxlIG1vZGUuCisgICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7CisgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7CisgICAgICAgICAgICBtQWdlbnQuc2V0U2h1ZmZsZU1vZGUoSU5WQUxJRF9TSFVGRkxFX01PREUpOworICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKG1FdmVudENhbGxiYWNrLm9uU2h1ZmZsZU1vZGVDaGFuZ2VkQ2FsbGVkKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9HUk9VUCwgbUFnZW50LmdldFNodWZmbGVNb2RlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNldEFuZEdldFJlcGVhdE1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IHJlcGVhdE1vZGUgPSBtQWdlbnQuZ2V0UmVwZWF0TW9kZSgpOworICAgICAgICBpZiAocmVwZWF0TW9kZSAhPSBNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfTk9ORSkgeworICAgICAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7CisgICAgICAgICAgICAgICAgbUFnZW50LnNldFJlcGVhdE1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX05PTkUpOworICAgICAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblJlcGVhdE1vZGVDaGFuZ2VkQ2FsbGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfTk9ORSwgbUFnZW50LmdldFJlcGVhdE1vZGUoKSk7CisgICAgICAgIH0KKworICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgeworICAgICAgICAgICAgbUFnZW50LnNldFJlcGVhdE1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX09ORSk7CisgICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblJlcGVhdE1vZGVDaGFuZ2VkQ2FsbGVkKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX09ORSwgbUFnZW50LmdldFJlcGVhdE1vZGUoKSk7CisKKyAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKKyAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKKyAgICAgICAgICAgIG1BZ2VudC5zZXRSZXBlYXRNb2RlKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9BTEwpOworICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25SZXBlYXRNb2RlQ2hhbmdlZENhbGxlZCk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9BTEwsIG1BZ2VudC5nZXRSZXBlYXRNb2RlKCkpOworCisgICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7CisgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7CisgICAgICAgICAgICBtQWdlbnQuc2V0UmVwZWF0TW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfR1JPVVApOworICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25SZXBlYXRNb2RlQ2hhbmdlZENhbGxlZCk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9HUk9VUCwgbUFnZW50LmdldFJlcGVhdE1vZGUoKSk7CisKKyAgICAgICAgLy8gSU5WQUxJRF9TSFVGRkxFX01PREUgd2lsbCBub3QgY2hhbmdlIHRoZSBzaHVmZmxlIG1vZGUuCisgICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7CisgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7CisgICAgICAgICAgICBtQWdlbnQuc2V0UmVwZWF0TW9kZShJTlZBTElEX1JFUEVBVF9NT0RFKTsKKyAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShtRXZlbnRDYWxsYmFjay5vblJlcGVhdE1vZGVDaGFuZ2VkQ2FsbGVkKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX0dST1VQLCBtQWdlbnQuZ2V0UmVwZWF0TW9kZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRQbGF5bGlzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbnQgbGlzdFNpemUgPSAxMDsKKyAgICAgICAgY3JlYXRlQW5kU2V0UGxheWxpc3QoMTApOworICAgICAgICBhc3NlcnRFcXVhbHMobGlzdFNpemUsIG1BZ2VudC5nZXRQbGF5bGlzdCgpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTa2lwSXRlbXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IGxpc3RTaXplID0gNTsKKyAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiBwbGF5bGlzdCA9IGNyZWF0ZUFuZFNldFBsYXlsaXN0KGxpc3RTaXplKTsKKworICAgICAgICBtQWdlbnQuc2V0UmVwZWF0TW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfTk9ORSk7CisgICAgICAgIC8vIFRlc3Qgc2tpcFRvUGxheWxpc3RJdGVtCisgICAgICAgIGZvciAoaW50IGkgPSBsaXN0U2l6ZSAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgICAgICBtQWdlbnQuc2tpcFRvUGxheWxpc3RJdGVtKHBsYXlsaXN0LmdldChpKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBUZXN0IHNraXBUb05leHRJdGVtCisgICAgICAgIC8vIGN1clBsYXlQb3MgPSAwCisgICAgICAgIGZvciAoaW50IGN1clBsYXlQb3MgPSAwOyBjdXJQbGF5UG9zIDwgbGlzdFNpemUgLSAxOyArK2N1clBsYXlQb3MpIHsKKyAgICAgICAgICAgIG1BZ2VudC5za2lwVG9OZXh0SXRlbSgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGN1clBsYXlQb3MgKyAxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKKyAgICAgICAgfQorICAgICAgICBtQWdlbnQuc2tpcFRvTmV4dEl0ZW0oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3RTaXplIC0gMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7CisKKyAgICAgICAgLy8gVGVzdCBza2lwVG9QcmV2aW91cworICAgICAgICAvLyBjdXJQbGF5UG9zID0gbGlzdFNpemUgLSAxCisgICAgICAgIGZvciAoaW50IGN1clBsYXlQb3MgPSBsaXN0U2l6ZSAtIDE7IGN1clBsYXlQb3MgPiAwOyAtLWN1clBsYXlQb3MpIHsKKyAgICAgICAgICAgIG1BZ2VudC5za2lwVG9QcmV2aW91c0l0ZW0oKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhjdXJQbGF5UG9zIC0gMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7CisgICAgICAgIH0KKyAgICAgICAgbUFnZW50LnNraXBUb1ByZXZpb3VzSXRlbSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7CisKKyAgICAgICAgbUFnZW50LnNldFJlcGVhdE1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX0FMTCk7CisgICAgICAgIC8vIFRlc3Qgc2tpcFRvUHJldmlvdXMgd2l0aCByZXBlYXQgbW9kZSBhbGwKKyAgICAgICAgLy8gY3VyUGxheVBvcyA9IDAKKyAgICAgICAgbUFnZW50LnNraXBUb1ByZXZpb3VzSXRlbSgpOworICAgICAgICBhc3NlcnRFcXVhbHMobGlzdFNpemUgLSAxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKKworICAgICAgICAvLyBUZXN0IHNraXBUb05leHQgd2l0aCByZXBlYXQgbW9kZSBhbGwKKyAgICAgICAgLy8gY3VyUGxheVBvcyA9IGxpc3RTaXplIC0gMQorICAgICAgICBtQWdlbnQuc2tpcFRvTmV4dEl0ZW0oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOworCisgICAgICAgIG1BZ2VudC5za2lwVG9QcmV2aW91c0l0ZW0oKTsKKyAgICAgICAgLy8gY3VyUGxheVBvcyA9IGxpc3RTaXplIC0gMSwgbmV4dFBsYXlQb3MgPSAwCisgICAgICAgIC8vIFRlc3QgbmV4dCBwbGF5IHBvcyBhZnRlciBzZXR0aW5nIHJlcGVhdCBtb2RlIG5vbmUuCisgICAgICAgIG1BZ2VudC5zZXRSZXBlYXRNb2RlKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9OT05FKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3RTaXplIC0gMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RWRpdFBsYXlsaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGludCBsaXN0U2l6ZSA9IDU7CisgICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gcGxheWxpc3QgPSBjcmVhdGVBbmRTZXRQbGF5bGlzdChsaXN0U2l6ZSk7CisKKyAgICAgICAgLy8gVGVzdCBhZGQgaXRlbTogWzAgKGN1ciksIDEsIDIsIDMsIDRdIC0+IFswIChjdXIpLCAxLCA1LCAyLCAzLCA0XQorICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOworICAgICAgICBNZWRpYUl0ZW0yIGl0ZW1fNSA9IGdlbmVyYXRlTWVkaWFJdGVtKDUpOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgeworICAgICAgICAgICAgcGxheWxpc3QuYWRkKDIsIGl0ZW1fNSk7CisgICAgICAgICAgICBtQWdlbnQuYWRkUGxheWxpc3RJdGVtKDIsIGl0ZW1fNSk7CisgICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKKworICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOworICAgICAgICAvLyBNb3ZlIGN1cnJlbnQ6IFswIChjdXIpLCAxLCA1LCAyLCAzLCA0XSAtPiBbMCwgMSwgNSAoY3VyKSwgMiwgMywgNF0KKyAgICAgICAgbUFnZW50LnNraXBUb1BsYXlsaXN0SXRlbShpdGVtXzUpOworICAgICAgICAvLyBSZW1vdmUgY3VycmVudCBpdGVtOiBbMCwgMSwgNSAoY3VyKSwgMiwgMywgNF0gLT4gWzAsIDEsIDIgKGN1ciksIDMsIDRdCisgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7CisgICAgICAgICAgICBwbGF5bGlzdC5yZW1vdmUoaXRlbV81KTsKKyAgICAgICAgICAgIG1BZ2VudC5yZW1vdmVQbGF5bGlzdEl0ZW0oaXRlbV81KTsKKyAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7CisKKyAgICAgICAgLy8gUmVtb3ZlIHByZXZpb3VzIGl0ZW06IFswLCAxLCAyIChjdXIpLCAzLCA0XSAtPiBbMCwgMiAoY3VyKSwgMywgNF0KKyAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKKyAgICAgICAgTWVkaWFJdGVtMiBwcmV2aW91c0l0ZW0gPSBwbGF5bGlzdC5nZXQoMSk7CisgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7CisgICAgICAgICAgICBwbGF5bGlzdC5yZW1vdmUocHJldmlvdXNJdGVtKTsKKyAgICAgICAgICAgIG1BZ2VudC5yZW1vdmVQbGF5bGlzdEl0ZW0ocHJldmlvdXNJdGVtKTsKKyAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7CisKKyAgICAgICAgLy8gUmVtb3ZlIG5leHQgaXRlbTogWzAsIDIgKGN1ciksIDMsIDRdIC0+IFswLCAyIChjdXIpLCA0XQorICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOworICAgICAgICBNZWRpYUl0ZW0yIG5leHRJdGVtID0gcGxheWxpc3QuZ2V0KDIpOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgeworICAgICAgICAgICAgcGxheWxpc3QucmVtb3ZlKG5leHRJdGVtKTsKKyAgICAgICAgICAgIG1BZ2VudC5yZW1vdmVQbGF5bGlzdEl0ZW0obmV4dEl0ZW0pOworICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKKworICAgICAgICAvLyBSZXBsYWNlIGl0ZW06IFswLCAyIChjdXIpLCA0XSAtPiBbMCwgMiAoY3VyKSwgNV0KKyAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKKyAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKKyAgICAgICAgICAgIHBsYXlsaXN0LnNldCgyLCBpdGVtXzUpOworICAgICAgICAgICAgbUFnZW50LnJlcGxhY2VQbGF5bGlzdEl0ZW0oMiwgaXRlbV81KTsKKyAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7CisKKyAgICAgICAgLy8gTW92ZSBsYXN0IGFuZCByZW1vdmUgdGhlIGxhc3QgaXRlbTogWzAsIDIgKGN1ciksIDVdIC0+IFswLCAyLCA1IChjdXIpXSAtPiBbMCwgMiAoY3VyKV0KKyAgICAgICAgTWVkaWFJdGVtMiBsYXN0SXRlbSA9IHBsYXlsaXN0LmdldCgxKTsKKyAgICAgICAgbUFnZW50LnNraXBUb1BsYXlsaXN0SXRlbShsYXN0SXRlbSk7CisgICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7CisgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7CisgICAgICAgICAgICBwbGF5bGlzdC5yZW1vdmUobGFzdEl0ZW0pOworICAgICAgICAgICAgbUFnZW50LnJlbW92ZVBsYXlsaXN0SXRlbShsYXN0SXRlbSk7CisgICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOworCisgICAgICAgIC8vIFJlbW92ZSBhbGwgaXRlbXMKKyAgICAgICAgZm9yIChpbnQgaSA9IHBsYXlsaXN0LnNpemUoKSAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBwbGF5bGlzdC5nZXQoaSk7CisgICAgICAgICAgICBtQWdlbnQuc2tpcFRvUGxheWxpc3RJdGVtKGl0ZW0pOworICAgICAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7CisgICAgICAgICAgICAgICAgcGxheWxpc3QucmVtb3ZlKGl0ZW0pOworICAgICAgICAgICAgICAgIG1BZ2VudC5yZW1vdmVQbGF5bGlzdEl0ZW0oaXRlbSk7CisgICAgICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNlc3Npb25QbGF5bGlzdEFnZW50Lk5PX1ZBTElEX0lURU1TLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBsYXlsaXN0V2l0aEludmFsaWRJdGVtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGludCBsaXN0U2l6ZSA9IDI7CisgICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gcGxheWxpc3QgPSBjcmVhdGVBbmRTZXRQbGF5bGlzdChsaXN0U2l6ZSk7CisKKyAgICAgICAgLy8gQWRkIGl0ZW06IFswIChjdXIpLCAxXSAtPiBbMCAoY3VyKSwgMyAobm9fZHNkKSwgMV0KKyAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKKyAgICAgICAgTWVkaWFJdGVtMiBpbnZhbGlkSXRlbTIgPSBnZW5lcmF0ZU1lZGlhSXRlbVdpdGhvdXREYXRhU291cmNlRGVzYygyKTsKKyAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKKyAgICAgICAgICAgIHBsYXlsaXN0LmFkZCgxLCBpbnZhbGlkSXRlbTIpOworICAgICAgICAgICAgbUFnZW50LmFkZFBsYXlsaXN0SXRlbSgxLCBpbnZhbGlkSXRlbTIpOworICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKKworICAgICAgICAvLyBUZXN0IHNraXAgdG8gbmV4dCBpdGVtOiAgWzAgKGN1ciksIDIgKG5vX2RzZCksIDFdIC0+IFswLCAyIChub19kc2QpLCAxIChjdXIpXQorICAgICAgICBtQWdlbnQuc2tpcFRvTmV4dEl0ZW0oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOworCisgICAgICAgIC8vIFRlc3Qgc2tpcCB0byBwcmV2aW91cyBpdGVtOiBbMCwgMiAobm9fZHNkKSwgMSAoY3VyKV0gLT4gWzAgKGN1ciksIDIgKG5vX2RzZCksIDFdCisgICAgICAgIG1BZ2VudC5za2lwVG9QcmV2aW91c0l0ZW0oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOworCisgICAgICAgIC8vIFJlbW92ZSBjdXJyZW50IGl0ZW06IFswIChjdXIpLCAyIChub19kc2QpLCAxXSAtPiBbMiAobm9fZHNkKSwgMSAoY3VyKV0KKyAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKKyAgICAgICAgTWVkaWFJdGVtMiBpdGVtID0gcGxheWxpc3QuZ2V0KDApOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgeworICAgICAgICAgICAgcGxheWxpc3QucmVtb3ZlKGl0ZW0pOworICAgICAgICAgICAgbUFnZW50LnJlbW92ZVBsYXlsaXN0SXRlbShpdGVtKTsKKyAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7CisKKyAgICAgICAgLy8gUmVtb3ZlIGN1cnJlbnQgaXRlbTogWzIgKG5vX2RzZCksIDEgKGN1cildIC0+IFsyIChub19kc2QpXQorICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOworICAgICAgICBpdGVtID0gcGxheWxpc3QuZ2V0KDEpOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgeworICAgICAgICAgICAgcGxheWxpc3QucmVtb3ZlKGl0ZW0pOworICAgICAgICAgICAgbUFnZW50LnJlbW92ZVBsYXlsaXN0SXRlbShpdGVtKTsKKyAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU2Vzc2lvblBsYXlsaXN0QWdlbnQuTk9fVkFMSURfSVRFTVMsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOworCisgICAgICAgIC8vIEFkZCBpbnZhbGlkIGl0ZW06IFsyIChub19kc2QpXSAtPiBbMCAobm9fZHNkKSwgMiAobm9fZHNkKV0KKyAgICAgICAgTWVkaWFJdGVtMiBpbnZhbGlkSXRlbTAgPSBnZW5lcmF0ZU1lZGlhSXRlbVdpdGhvdXREYXRhU291cmNlRGVzYygwKTsKKyAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKKyAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKKyAgICAgICAgICAgIHBsYXlsaXN0LmFkZCgwLCBpbnZhbGlkSXRlbTApOworICAgICAgICAgICAgbUFnZW50LmFkZFBsYXlsaXN0SXRlbSgwLCBpbnZhbGlkSXRlbTApOworICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTZXNzaW9uUGxheWxpc3RBZ2VudC5OT19WQUxJRF9JVEVNUywgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7CisKKyAgICAgICAgLy8gQWRkIHZhbGlkIGl0ZW06IFswIChub19kc2QpLCAyIChub19kc2QpXSAtPiBbMCAobm9fZHNkKSwgMSwgMiAobm9fZHNkKV0KKyAgICAgICAgTWVkaWFJdGVtMiBpbnZhbGlkSXRlbTEgPSBnZW5lcmF0ZU1lZGlhSXRlbSgxKTsKKyAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKKyAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKKyAgICAgICAgICAgIHBsYXlsaXN0LmFkZCgxLCBpbnZhbGlkSXRlbTEpOworICAgICAgICAgICAgbUFnZW50LmFkZFBsYXlsaXN0SXRlbSgxLCBpbnZhbGlkSXRlbTEpOworICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKKworICAgICAgICAvLyBSZXBsYWNlIHRoZSB2YWxpZCBpdGVtIHdpdGggYW4gaW52YWxpZCBpdGVtOgorICAgICAgICAvLyBbMCAobm9fZHNkKSwgMSAoY3VyKSwgMiAobm9fZHNkKV0gLT4gWzAgKG5vX2RzZCksIDMgKG5vX2RzZCksIDIgKG5vX2RzZCldCisgICAgICAgIE1lZGlhSXRlbTIgaW52YWxpZEl0ZW0zID0gZ2VuZXJhdGVNZWRpYUl0ZW1XaXRob3V0RGF0YVNvdXJjZURlc2MoMyk7CisgICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7CisgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7CisgICAgICAgICAgICBwbGF5bGlzdC5zZXQoMSwgaW52YWxpZEl0ZW0zKTsKKyAgICAgICAgICAgIG1BZ2VudC5yZXBsYWNlUGxheWxpc3RJdGVtKDEsIGludmFsaWRJdGVtMyk7CisgICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNlc3Npb25QbGF5bGlzdEFnZW50LkVORF9PRl9QTEFZTElTVCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGxheWxpc3RBZnRlck9uQ3VycmVudERhdGFTb3VyY2VDaGFuZ2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGludCBsaXN0U2l6ZSA9IDI7CisgICAgICAgIHZlcmlmeShtUGxheWVyKS5yZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2soTWF0Y2hlcnMuYW55KCksIE1hdGNoZXJzLmFueSgpKTsKKworICAgICAgICBjcmVhdGVBbmRTZXRQbGF5bGlzdChsaXN0U2l6ZSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKKworICAgICAgICBtUGxheWVyRXZlbnRDYWxsYmFjay5vbkN1cnJlbnREYXRhU291cmNlQ2hhbmdlZChtUGxheWVyLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOworICAgICAgICBtUGxheWVyRXZlbnRDYWxsYmFjay5vbkN1cnJlbnREYXRhU291cmNlQ2hhbmdlZChtUGxheWVyLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNlc3Npb25QbGF5bGlzdEFnZW50LkVORF9PRl9QTEFZTElTVCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7CisKKyAgICAgICAgbUFnZW50LnNraXBUb05leHRJdGVtKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhTZXNzaW9uUGxheWxpc3RBZ2VudC5FTkRfT0ZfUExBWUxJU1QsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOworCisgICAgICAgIG1BZ2VudC5zZXRSZXBlYXRNb2RlKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9PTkUpOworICAgICAgICBhc3NlcnRFcXVhbHMoU2Vzc2lvblBsYXlsaXN0QWdlbnQuRU5EX09GX1BMQVlMSVNULCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKKworICAgICAgICBtQWdlbnQuc2V0UmVwZWF0TW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfQUxMKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOworICAgICAgICBtUGxheWVyRXZlbnRDYWxsYmFjay5vbkN1cnJlbnREYXRhU291cmNlQ2hhbmdlZChtUGxheWVyLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOworICAgICAgICBtUGxheWVyRXZlbnRDYWxsYmFjay5vbkN1cnJlbnREYXRhU291cmNlQ2hhbmdlZChtUGxheWVyLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOworICAgIH0KKworICAgIHByaXZhdGUgTGlzdDxNZWRpYUl0ZW0yPiBjcmVhdGVBbmRTZXRQbGF5bGlzdChpbnQgbGlzdFNpemUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IGl0ZW1zID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdFNpemU7ICsraSkgeworICAgICAgICAgICAgaXRlbXMuYWRkKGdlbmVyYXRlTWVkaWFJdGVtKGkpKTsKKyAgICAgICAgfQorICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgeworICAgICAgICAgICAgbUFnZW50LnNldFBsYXlsaXN0KGl0ZW1zLCBudWxsKTsKKyAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaXRlbXM7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFBsYXlsaXN0RXF1YWxzKExpc3Q8TWVkaWFJdGVtMj4gZXhwZWN0ZWQsIExpc3Q8TWVkaWFJdGVtMj4gYWN0dWFsKSB7CisgICAgICAgIGlmIChleHBlY3RlZCA9PSBhY3R1YWwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKGV4cGVjdGVkICE9IG51bGwgJiYgYWN0dWFsICE9IG51bGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuc2l6ZSgpLCBhY3R1YWwuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZC5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleHBlY3RlZC5nZXQoaSkuZXF1YWxzKGFjdHVhbC5nZXQoaSkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgTWVkaWFJdGVtMiBnZW5lcmF0ZU1lZGlhSXRlbVdpdGhvdXREYXRhU291cmNlRGVzYyhpbnQga2V5KSB7CisgICAgICAgIHJldHVybiBuZXcgTWVkaWFJdGVtMi5CdWlsZGVyKDApCisgICAgICAgICAgICAgICAgLnNldE1lZGlhSWQoIlRFU1RfTUVESUFfSURfV0lUSE9VVF9EU0RfIiArIGtleSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIE1lZGlhSXRlbTIgZ2VuZXJhdGVNZWRpYUl0ZW0oaW50IGtleSkgeworICAgICAgICByZXR1cm4gbmV3IE1lZGlhSXRlbTIuQnVpbGRlcigwKQorICAgICAgICAgICAgICAgIC5zZXRNZWRpYUlkKCJURVNUX01FRElBX0lEXyIgKyBrZXkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvT1dORVJTIGIvcGFja2FnZXMvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYzRjZWYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9PV05FUlMKQEAgLTAsMCArMSw2IEBACitha2Vyc3RlbkBnb29nbGUuY29tCitkd2thbmdAZ29vZ2xlLmNvbQoramFld2FuQGdvb2dsZS5jb20KK21hcmNvbmVAZ29vZ2xlLmNvbQorc3VuZ3Nvb0Bnb29nbGUuY29tCit3amlhQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL09XTkVSUyBiL3NlcnZpY2VzL09XTkVSUwppbmRleCBkNTAwZGNlLi5kNWQwMGRhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9PV05FUlMKKysrIGIvc2VydmljZXMvT1dORVJTCkBAIC0xLDQgKzEsNCBAQAogZWxhdXJlbnRAZ29vZ2xlLmNvbQogZXRhbHZhbGFAZ29vZ2xlLmNvbQotZ2thc3RlbkBhbmRyb2lkLmNvbQorZ2thc3RlbkBnb29nbGUuY29tCiBodW5nYUBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLm1rCmluZGV4IGQwNDU0ZDQuLjc0MTllNjQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLm1rCkBAIC01MSw2ICs1MSw3IEBACiAgICAgbGlibWVkaWFsb2dzZXJ2aWNlIFwKICAgICBsaWJtZWRpYXV0aWxzIFwKICAgICBsaWJuYmFpbyBcCisgICAgbGlibmJsb2cgXAogICAgIGxpYnBvd2VybWFuYWdlciBcCiAgICAgbGlic2VydmljZXV0aWxpdHkgXAogICAgIGxpYm1lZGlhdXRpbHMgXApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcAppbmRleCAzOWYwNGZiLi5iZGQzOWM2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcApAQCAtMjgsNiArMjgsNyBAQAogCiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPGN1dGlscy9tdWx0aXVzZXIuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KQEAgLTM5LDggKzQwLDggQEAKICNpbmNsdWRlIDxtZW11bnJlYWNoYWJsZS9tZW11bnJlYWNoYWJsZS5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgPHV0aWxzL0F0b21pYy5oPgogCisjaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KQEAgLTU1LDYgKzU2LDcgQEAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9lZmZlY3RfYWVjLmg+CiAKICNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvc3RyaW5nLmg+CiAKICNpbmNsdWRlIDxwb3dlcm1hbmFnZXIvUG93ZXJNYW5hZ2VyLmg+CiAKQEAgLTE1NSw2ICsxNTcsOCBAQAogICAgICAgbUJ0TnJlY0lzT2ZmKGZhbHNlKSwKICAgICAgIG1Jc0xvd1JhbURldmljZSh0cnVlKSwKICAgICAgIG1Jc0RldmljZVR5cGVLbm93bihmYWxzZSksCisgICAgICBtVG90YWxNZW1vcnkoMCksCisgICAgICBtQ2xpZW50U2hhcmVkSGVhcFNpemUoa01pbmltdW1DbGllbnRTaGFyZWRIZWFwU2l6ZUJ5dGVzKSwKICAgICAgIG1HbG9iYWxFZmZlY3RFbmFibGVUaW1lKDApLAogICAgICAgbVN5c3RlbVJlYWR5KGZhbHNlKQogewpAQCAtMjYyLDYgKzI2Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfYmFzZV90ICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0NsaWVudCYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqZGV2aWNlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgKnNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPE1tYXBTdHJlYW1DYWxsYmFjaz4mIGNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8TW1hcFN0cmVhbUludGVyZmFjZT4mIGludGVyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmhhbmRsZSkKQEAgLTI3NCw3ICsyNzksOCBAQAogICAgIHN0YXR1c190IHJldCA9IE5PX0lOSVQ7CiAgICAgaWYgKGFmICE9IDApIHsKICAgICAgICAgcmV0ID0gYWYtPm9wZW5NbWFwU3RyZWFtKAotICAgICAgICAgICAgICAgIGRpcmVjdGlvbiwgYXR0ciwgY29uZmlnLCBjbGllbnQsIGRldmljZUlkLCBjYWxsYmFjaywgaW50ZXJmYWNlLCBoYW5kbGUpOworICAgICAgICAgICAgICAgIGRpcmVjdGlvbiwgYXR0ciwgY29uZmlnLCBjbGllbnQsIGRldmljZUlkLAorICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgY2FsbGJhY2ssIGludGVyZmFjZSwgaGFuZGxlKTsKICAgICB9CiAgICAgcmV0dXJuIHJldDsKIH0KQEAgLTI4NCw2ICsyOTAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfYmFzZV90ICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvQ2xpZW50JiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmRldmljZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgKnNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8TW1hcFN0cmVhbUNhbGxiYWNrPiYgY2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPE1tYXBTdHJlYW1JbnRlcmZhY2U+JiBpbnRlcmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmhhbmRsZSkKQEAgLTI5Miw4ICsyOTksMTAgQEAKICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQotCi0gICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCA9IChhdWRpb19zZXNzaW9uX3QpIG5ld0F1ZGlvVW5pcXVlSWQoQVVESU9fVU5JUVVFX0lEX1VTRV9TRVNTSU9OKTsKKyAgICBhdWRpb19zZXNzaW9uX3QgYWN0dWFsU2Vzc2lvbklkID0gKnNlc3Npb25JZDsKKyAgICBpZiAoYWN0dWFsU2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fQUxMT0NBVEUpIHsKKyAgICAgICAgYWN0dWFsU2Vzc2lvbklkID0gKGF1ZGlvX3Nlc3Npb25fdCkgbmV3QXVkaW9VbmlxdWVJZChBVURJT19VTklRVUVfSURfVVNFX1NFU1NJT04pOworICAgIH0KICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fREVGQVVMVDsKICAgICBhdWRpb19pb19oYW5kbGVfdCBpbyA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKQEAgLTMwMywxNyArMzEyLDE4IEBACiAgICAgICAgIGZ1bGxDb25maWcuY2hhbm5lbF9tYXNrID0gY29uZmlnLT5jaGFubmVsX21hc2s7CiAgICAgICAgIGZ1bGxDb25maWcuZm9ybWF0ID0gY29uZmlnLT5mb3JtYXQ7CiAgICAgICAgIHJldCA9IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGb3JBdHRyKGF0dHIsICZpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyZWFtVHlwZSwgY2xpZW50LmNsaWVudFVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsU2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyZWFtVHlwZSwgY2xpZW50LmNsaWVudFBpZCwgY2xpZW50LmNsaWVudFVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZ1bGxDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoQVVESU9fT1VUUFVUX0ZMQUdfTU1BUF9OT0lSUSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSWQsICZwb3J0SWQpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHJldCA9IEF1ZGlvU3lzdGVtOjpnZXRJbnB1dEZvckF0dHIoYXR0ciwgJmlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxTZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LmNsaWVudFBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQuY2xpZW50VWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC5wYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fSU5QVVRfRkxBR19NTUFQX05PSVJRLCBkZXZpY2VJZCwgJnBvcnRJZCk7CiAgICAgfQpAQCAtMzI2LDEzICszMzYsMTQgQEAKICAgICBzcDxNbWFwVGhyZWFkPiB0aHJlYWQgPSBtTW1hcFRocmVhZHMudmFsdWVGb3IoaW8pOwogICAgIGlmICh0aHJlYWQgIT0gMCkgewogICAgICAgICBpbnRlcmZhY2UgPSBuZXcgTW1hcFRocmVhZEhhbmRsZSh0aHJlYWQpOwotICAgICAgICB0aHJlYWQtPmNvbmZpZ3VyZShhdHRyLCBzdHJlYW1UeXBlLCBzZXNzaW9uSWQsIGNhbGxiYWNrLCAqZGV2aWNlSWQsIHBvcnRJZCk7CisgICAgICAgIHRocmVhZC0+Y29uZmlndXJlKGF0dHIsIHN0cmVhbVR5cGUsIGFjdHVhbFNlc3Npb25JZCwgY2FsbGJhY2ssICpkZXZpY2VJZCwgcG9ydElkKTsKICAgICAgICAgKmhhbmRsZSA9IHBvcnRJZDsKKyAgICAgICAgKnNlc3Npb25JZCA9IGFjdHVhbFNlc3Npb25JZDsKICAgICB9IGVsc2UgewogICAgICAgICBpZiAoZGlyZWN0aW9uID09IE1tYXBTdHJlYW1JbnRlcmZhY2U6OkRJUkVDVElPTl9PVVRQVVQpIHsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KGlvLCBzdHJlYW1UeXBlLCBzZXNzaW9uSWQpOworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQoaW8sIHN0cmVhbVR5cGUsIGFjdHVhbFNlc3Npb25JZCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUlucHV0KGlvLCBzZXNzaW9uSWQpOworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VJbnB1dChwb3J0SWQpOwogICAgICAgICB9CiAgICAgICAgIHJldCA9IE5PX0lOSVQ7CiAgICAgfQpAQCAtNjQxLDM4ICs2NTIsNTYgQEAKIAogLy8gSUF1ZGlvRmxpbmdlciBpbnRlcmZhY2UKIAotCi1zcDxJQXVkaW9UcmFjaz4gQXVkaW9GbGluZ2VyOjpjcmVhdGVUcmFjaygKLSAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAotICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICBzaXplX3QgKmZyYW1lQ291bnQsCi0gICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICpmbGFncywKLSAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICBwaWRfdCBwaWQsCi0gICAgICAgIHBpZF90IHRpZCwKLSAgICAgICAgYXVkaW9fc2Vzc2lvbl90ICpzZXNzaW9uSWQsCi0gICAgICAgIGludCBjbGllbnRVaWQsCi0gICAgICAgIHN0YXR1c190ICpzdGF0dXMsCi0gICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQorc3A8SUF1ZGlvVHJhY2s+IEF1ZGlvRmxpbmdlcjo6Y3JlYXRlVHJhY2soY29uc3QgQ3JlYXRlVHJhY2tJbnB1dCYgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVUcmFja091dHB1dCYgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cykKIHsKICAgICBzcDxQbGF5YmFja1RocmVhZDo6VHJhY2s+IHRyYWNrOwogICAgIHNwPFRyYWNrSGFuZGxlPiB0cmFja0hhbmRsZTsKICAgICBzcDxDbGllbnQ+IGNsaWVudDsKICAgICBzdGF0dXNfdCBsU3RhdHVzOwotICAgIGF1ZGlvX3Nlc3Npb25fdCBsU2Vzc2lvbklkOworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZTsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CiAKKyAgICBib29sIHVwZGF0ZVBpZCA9IChpbnB1dC5jbGllbnRJbmZvLmNsaWVudFBpZCA9PSAtMSk7CiAgICAgY29uc3QgdWlkX3QgY2FsbGluZ1VpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKLSAgICBpZiAocGlkID09IC0xIHx8ICFpc1RydXN0ZWRDYWxsaW5nVWlkKGNhbGxpbmdVaWQpKSB7CisgICAgdWlkX3QgY2xpZW50VWlkID0gaW5wdXQuY2xpZW50SW5mby5jbGllbnRVaWQ7CisgICAgaWYgKCFpc1RydXN0ZWRDYWxsaW5nVWlkKGNhbGxpbmdVaWQpKSB7CisgICAgICAgIEFMT0dXX0lGKGNsaWVudFVpZCAhPSBjYWxsaW5nVWlkLAorICAgICAgICAgICAgICAgICIlcyB1aWQgJWQgdHJpZWQgdG8gcGFzcyBpdHNlbGYgb2ZmIGFzICVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbGxpbmdVaWQsIGNsaWVudFVpZCk7CisgICAgICAgIGNsaWVudFVpZCA9IGNhbGxpbmdVaWQ7CisgICAgICAgIHVwZGF0ZVBpZCA9IHRydWU7CisgICAgfQorICAgIHBpZF90IGNsaWVudFBpZCA9IGlucHV0LmNsaWVudEluZm8uY2xpZW50UGlkOworICAgIGlmICh1cGRhdGVQaWQpIHsKICAgICAgICAgY29uc3QgcGlkX3QgY2FsbGluZ1BpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKLSAgICAgICAgQUxPR1dfSUYocGlkICE9IC0xICYmIHBpZCAhPSBjYWxsaW5nUGlkLAorICAgICAgICBBTE9HV19JRihjbGllbnRQaWQgIT0gLTEgJiYgY2xpZW50UGlkICE9IGNhbGxpbmdQaWQsCiAgICAgICAgICAgICAgICAgICIlcyB1aWQgJWQgcGlkICVkIHRyaWVkIHRvIHBhc3MgaXRzZWxmIG9mZiBhcyBwaWQgJWQiLAotICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY2FsbGluZ1VpZCwgY2FsbGluZ1BpZCwgcGlkKTsKLSAgICAgICAgcGlkID0gY2FsbGluZ1BpZDsKKyAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNhbGxpbmdVaWQsIGNhbGxpbmdQaWQsIGNsaWVudFBpZCk7CisgICAgICAgIGNsaWVudFBpZCA9IGNhbGxpbmdQaWQ7CiAgICAgfQogCisgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCA9IGlucHV0LnNlc3Npb25JZDsKKyAgICBpZiAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fQUxMT0NBVEUpIHsKKyAgICAgICAgc2Vzc2lvbklkID0gKGF1ZGlvX3Nlc3Npb25fdCkgbmV3QXVkaW9VbmlxdWVJZChBVURJT19VTklRVUVfSURfVVNFX1NFU1NJT04pOworICAgIH0gZWxzZSBpZiAoYXVkaW9fdW5pcXVlX2lkX2dldF91c2Uoc2Vzc2lvbklkKSAhPSBBVURJT19VTklRVUVfSURfVVNFX1NFU1NJT04pIHsKKyAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgZ290byBFeGl0OworICAgIH0KKworICAgIG91dHB1dC5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisgICAgb3V0cHV0Lm91dHB1dElkID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgb3V0cHV0LnNlbGVjdGVkRGV2aWNlSWQgPSBpbnB1dC5zZWxlY3RlZERldmljZUlkOworCisgICAgbFN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGb3JBdHRyKCZpbnB1dC5hdHRyLCAmb3V0cHV0Lm91dHB1dElkLCBzZXNzaW9uSWQsICZzdHJlYW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRQaWQsIGNsaWVudFVpZCwgJmlucHV0LmNvbmZpZywgaW5wdXQuZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXQuc2VsZWN0ZWREZXZpY2VJZCwgJnBvcnRJZCk7CisKKyAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUiB8fCBvdXRwdXQub3V0cHV0SWQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrKCkgZ2V0T3V0cHV0Rm9yQXR0cigpIHJldHVybiBlcnJvciAlZCBvciBpbnZhbGlkIG91dHB1dCBoYW5kbGUiLCBsU3RhdHVzKTsKKyAgICAgICAgZ290byBFeGl0OworICAgIH0KICAgICAvLyBjbGllbnQgQXVkaW9UcmFjazo6c2V0IGFscmVhZHkgaW1wbGVtZW50cyBBVURJT19TVFJFQU1fREVGQVVMVCA9PiBBVURJT19TVFJFQU1fTVVTSUMsCiAgICAgLy8gYnV0IGlmIHNvbWVvbmUgdXNlcyBiaW5kZXIgZGlyZWN0bHkgdGhleSBjb3VsZCBieXBhc3MgdGhhdCBhbmQgY2F1c2UgdXMgdG8gY3Jhc2gKICAgICBpZiAodWludDMyX3Qoc3RyZWFtVHlwZSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgewpAQCAtNjgxLDkxICs3MTAsNzYgQEAKICAgICAgICAgZ290byBFeGl0OwogICAgIH0KIAotICAgIC8vIGZ1cnRoZXIgc2FtcGxlIHJhdGUgY2hlY2tzIGFyZSBwZXJmb3JtZWQgYnkgY3JlYXRlVHJhY2tfbCgpIGRlcGVuZGluZyBvbiB0aGUgdGhyZWFkIHR5cGUKLSAgICBpZiAoc2FtcGxlUmF0ZSA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJjcmVhdGVUcmFjaygpIGludmFsaWQgc2FtcGxlIHJhdGUgJXUiLCBzYW1wbGVSYXRlKTsKLSAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KLQogICAgIC8vIGZ1cnRoZXIgY2hhbm5lbCBtYXNrIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGJ5IGNyZWF0ZVRyYWNrX2woKSBkZXBlbmRpbmcgb24gdGhlIHRocmVhZCB0eXBlCi0gICAgaWYgKCFhdWRpb19pc19vdXRwdXRfY2hhbm5lbChjaGFubmVsTWFzaykpIHsKLSAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrKCkgaW52YWxpZCBjaGFubmVsIG1hc2sgJSN4IiwgY2hhbm5lbE1hc2spOworICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2NoYW5uZWwoaW5wdXQuY29uZmlnLmNoYW5uZWxfbWFzaykpIHsKKyAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrKCkgaW52YWxpZCBjaGFubmVsIG1hc2sgJSN4IiwgaW5wdXQuY29uZmlnLmNoYW5uZWxfbWFzayk7CiAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgIGdvdG8gRXhpdDsKICAgICB9CiAKICAgICAvLyBmdXJ0aGVyIGZvcm1hdCBjaGVja3MgYXJlIHBlcmZvcm1lZCBieSBjcmVhdGVUcmFja19sKCkgZGVwZW5kaW5nIG9uIHRoZSB0aHJlYWQgdHlwZQotICAgIGlmICghYXVkaW9faXNfdmFsaWRfZm9ybWF0KGZvcm1hdCkpIHsKLSAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrKCkgaW52YWxpZCBmb3JtYXQgJSN4IiwgZm9ybWF0KTsKLSAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGlmIChzaGFyZWRCdWZmZXIgIT0gMCAmJiBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJjcmVhdGVUcmFjaygpIHNoYXJlZEJ1ZmZlciBpcyBub24tMCBidXQgaGFzIE5VTEwgcG9pbnRlcigpIik7CisgICAgaWYgKCFhdWRpb19pc192YWxpZF9mb3JtYXQoaW5wdXQuY29uZmlnLmZvcm1hdCkpIHsKKyAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrKCkgaW52YWxpZCBmb3JtYXQgJSN4IiwgaW5wdXQuY29uZmlnLmZvcm1hdCk7CiAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgIGdvdG8gRXhpdDsKICAgICB9CiAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIFBsYXliYWNrVGhyZWFkICp0aHJlYWQgPSBjaGVja1BsYXliYWNrVGhyZWFkX2wob3V0cHV0KTsKKyAgICAgICAgUGxheWJhY2tUaHJlYWQgKnRocmVhZCA9IGNoZWNrUGxheWJhY2tUaHJlYWRfbChvdXRwdXQub3V0cHV0SWQpOwogICAgICAgICBpZiAodGhyZWFkID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJubyBwbGF5YmFjayB0aHJlYWQgZm91bmQgZm9yIG91dHB1dCBoYW5kbGUgJWQiLCBvdXRwdXQpOworICAgICAgICAgICAgQUxPR0UoIm5vIHBsYXliYWNrIHRocmVhZCBmb3VuZCBmb3Igb3V0cHV0IGhhbmRsZSAlZCIsIG91dHB1dC5vdXRwdXRJZCk7CiAgICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgZ290byBFeGl0OwogICAgICAgICB9CiAKLSAgICAgICAgY2xpZW50ID0gcmVnaXN0ZXJQaWQocGlkKTsKKyAgICAgICAgY2xpZW50ID0gcmVnaXN0ZXJQaWQoY2xpZW50UGlkKTsKIAogICAgICAgICBQbGF5YmFja1RocmVhZCAqZWZmZWN0VGhyZWFkID0gTlVMTDsKLSAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBOVUxMICYmICpzZXNzaW9uSWQgIT0gQVVESU9fU0VTU0lPTl9BTExPQ0FURSkgewotICAgICAgICAgICAgaWYgKGF1ZGlvX3VuaXF1ZV9pZF9nZXRfdXNlKCpzZXNzaW9uSWQpICE9IEFVRElPX1VOSVFVRV9JRF9VU0VfU0VTU0lPTikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVUcmFjaygpIGludmFsaWQgc2Vzc2lvbiBJRCAlZCIsICpzZXNzaW9uSWQpOwotICAgICAgICAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbFNlc3Npb25JZCA9ICpzZXNzaW9uSWQ7Ci0gICAgICAgICAgICAvLyBjaGVjayBpZiBhbiBlZmZlY3QgY2hhaW4gd2l0aCB0aGUgc2FtZSBzZXNzaW9uIElEIGlzIHByZXNlbnQgb24gYW5vdGhlcgotICAgICAgICAgICAgLy8gb3V0cHV0IHRocmVhZCBhbmQgbW92ZSBpdCBoZXJlLgotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGxheWJhY2tUaHJlYWRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgc3A8UGxheWJhY2tUaHJlYWQ+IHQgPSBtUGxheWJhY2tUaHJlYWRzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1QbGF5YmFja1RocmVhZHMua2V5QXQoaSkgIT0gb3V0cHV0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNlc3Npb25zID0gdC0+aGFzQXVkaW9TZXNzaW9uKGxTZXNzaW9uSWQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbnMgJiBUaHJlYWRCYXNlOjpFRkZFQ1RfU0VTU0lPTikgewotICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0VGhyZWFkID0gdC5nZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgIC8vIGNoZWNrIGlmIGFuIGVmZmVjdCBjaGFpbiB3aXRoIHRoZSBzYW1lIHNlc3Npb24gSUQgaXMgcHJlc2VudCBvbiBhbm90aGVyCisgICAgICAgIC8vIG91dHB1dCB0aHJlYWQgYW5kIG1vdmUgaXQgaGVyZS4KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGxheWJhY2tUaHJlYWRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBzcDxQbGF5YmFja1RocmVhZD4gdCA9IG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgIGlmIChtUGxheWJhY2tUaHJlYWRzLmtleUF0KGkpICE9IG91dHB1dC5vdXRwdXRJZCkgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHNlc3Npb25zID0gdC0+aGFzQXVkaW9TZXNzaW9uKHNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgaWYgKHNlc3Npb25zICYgVGhyZWFkQmFzZTo6RUZGRUNUX1NFU1NJT04pIHsKKyAgICAgICAgICAgICAgICAgICAgZWZmZWN0VGhyZWFkID0gdC5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gaWYgbm8gYXVkaW8gc2Vzc2lvbiBpZCBpcyBwcm92aWRlZCwgY3JlYXRlIG9uZSBoZXJlCi0gICAgICAgICAgICBsU2Vzc2lvbklkID0gKGF1ZGlvX3Nlc3Npb25fdCkgbmV4dFVuaXF1ZUlkKEFVRElPX1VOSVFVRV9JRF9VU0VfU0VTU0lPTik7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbklkICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAqc2Vzc2lvbklkID0gbFNlc3Npb25JZDsKLSAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBBTE9HVigiY3JlYXRlVHJhY2soKSBsU2Vzc2lvbklkOiAlZCIsIGxTZXNzaW9uSWQpOworICAgICAgICBBTE9HVigiY3JlYXRlVHJhY2soKSBzZXNzaW9uSWQ6ICVkIiwgc2Vzc2lvbklkKTsKIAotICAgICAgICB0cmFjayA9IHRocmVhZC0+Y3JlYXRlVHJhY2tfbChjbGllbnQsIHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwKLSAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgc2hhcmVkQnVmZmVyLCBsU2Vzc2lvbklkLCBmbGFncywgdGlkLAotICAgICAgICAgICAgICAgIGNsaWVudFVpZCwgJmxTdGF0dXMsIHBvcnRJZCk7CisgICAgICAgIG91dHB1dC5zYW1wbGVSYXRlID0gaW5wdXQuY29uZmlnLnNhbXBsZV9yYXRlOworICAgICAgICBvdXRwdXQuZnJhbWVDb3VudCA9IGlucHV0LmZyYW1lQ291bnQ7CisgICAgICAgIG91dHB1dC5ub3RpZmljYXRpb25GcmFtZUNvdW50ID0gaW5wdXQubm90aWZpY2F0aW9uRnJhbWVDb3VudDsKKyAgICAgICAgb3V0cHV0LmZsYWdzID0gaW5wdXQuZmxhZ3M7CisKKyAgICAgICAgdHJhY2sgPSB0aHJlYWQtPmNyZWF0ZVRyYWNrX2woY2xpZW50LCBzdHJlYW1UeXBlLCBpbnB1dC5hdHRyLCAmb3V0cHV0LnNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNvbmZpZy5mb3JtYXQsIGlucHV0LmNvbmZpZy5jaGFubmVsX21hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXQuZnJhbWVDb3VudCwgJm91dHB1dC5ub3RpZmljYXRpb25GcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5ub3RpZmljYXRpb25zUGVyQnVmZmVyLCBpbnB1dC5zcGVlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2hhcmVkQnVmZmVyLCBzZXNzaW9uSWQsICZvdXRwdXQuZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNsaWVudEluZm8uY2xpZW50VGlkLCBjbGllbnRVaWQsICZsU3RhdHVzLCBwb3J0SWQpOwogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKChsU3RhdHVzID09IE5PX0VSUk9SKSAmJiAodHJhY2sgPT0gMCkpOwogICAgICAgICAvLyB3ZSBkb24ndCBhYm9ydCB5ZXQgaWYgbFN0YXR1cyAhPSBOT19FUlJPUjsgdGhlcmUgaXMgc3RpbGwgd29yayB0byBiZSBkb25lIHJlZ2FyZGxlc3MKIAorICAgICAgICBvdXRwdXQuYWZGcmFtZUNvdW50ID0gdGhyZWFkLT5mcmFtZUNvdW50KCk7CisgICAgICAgIG91dHB1dC5hZlNhbXBsZVJhdGUgPSB0aHJlYWQtPnNhbXBsZVJhdGUoKTsKKyAgICAgICAgb3V0cHV0LmFmTGF0ZW5jeU1zID0gdGhyZWFkLT5sYXRlbmN5KCk7CisKICAgICAgICAgLy8gbW92ZSBlZmZlY3QgY2hhaW4gdG8gdGhpcyBvdXRwdXQgdGhyZWFkIGlmIGFuIGVmZmVjdCBvbiBzYW1lIHNlc3Npb24gd2FzIHdhaXRpbmcKICAgICAgICAgLy8gZm9yIGEgdHJhY2sgdG8gYmUgY3JlYXRlZAogICAgICAgICBpZiAobFN0YXR1cyA9PSBOT19FUlJPUiAmJiBlZmZlY3RUaHJlYWQgIT0gTlVMTCkgewogICAgICAgICAgICAgLy8gbm8gcmlzayBvZiBkZWFkbG9jayBiZWNhdXNlIEF1ZGlvRmxpbmdlcjo6bUxvY2sgaXMgaGVsZAogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9kbCh0aHJlYWQtPm1Mb2NrKTsKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfc2woZWZmZWN0VGhyZWFkLT5tTG9jayk7Ci0gICAgICAgICAgICBtb3ZlRWZmZWN0Q2hhaW5fbChsU2Vzc2lvbklkLCBlZmZlY3RUaHJlYWQsIHRocmVhZCwgdHJ1ZSk7CisgICAgICAgICAgICBtb3ZlRWZmZWN0Q2hhaW5fbChzZXNzaW9uSWQsIGVmZmVjdFRocmVhZCwgdGhyZWFkLCB0cnVlKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIExvb2sgZm9yIHN5bmMgZXZlbnRzIGF3YWl0aW5nIGZvciBhIHNlc3Npb24gdG8gYmUgdXNlZC4KICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGVuZGluZ1N5bmNFdmVudHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChtUGVuZGluZ1N5bmNFdmVudHNbaV0tPnRyaWdnZXJTZXNzaW9uKCkgPT0gbFNlc3Npb25JZCkgeworICAgICAgICAgICAgaWYgKG1QZW5kaW5nU3luY0V2ZW50c1tpXS0+dHJpZ2dlclNlc3Npb24oKSA9PSBzZXNzaW9uSWQpIHsKICAgICAgICAgICAgICAgICBpZiAodGhyZWFkLT5pc1ZhbGlkU3luY0V2ZW50KG1QZW5kaW5nU3luY0V2ZW50c1tpXSkpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGxTdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSB0cmFjay0+c2V0U3luY0V2ZW50KG1QZW5kaW5nU3luY0V2ZW50c1tpXSk7CkBAIC03NzgsNyArNzkyLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHNldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbl9sKHRocmVhZCwgbFNlc3Npb25JZCk7CisgICAgICAgIHNldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbl9sKHRocmVhZCwgc2Vzc2lvbklkKTsKICAgICB9CiAKICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUikgewpAQCAtNzk4LDYgKzgxMiw5IEBACiAgICAgdHJhY2tIYW5kbGUgPSBuZXcgVHJhY2tIYW5kbGUodHJhY2spOwogCiBFeGl0OgorICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SICYmIG91dHB1dC5vdXRwdXRJZCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChvdXRwdXQub3V0cHV0SWQsIHN0cmVhbVR5cGUsIHNlc3Npb25JZCk7CisgICAgfQogICAgICpzdGF0dXMgPSBsU3RhdHVzOwogICAgIHJldHVybiB0cmFja0hhbmRsZTsKIH0KQEAgLTk4MSw2ICs5OTgsMTkgQEAKICAgICByZXR1cm4gbXV0ZTsKIH0KIAordm9pZCBBdWRpb0ZsaW5nZXI6OnNldFJlY29yZFNpbGVuY2VkKHVpZF90IHVpZCwgYm9vbCBzaWxlbmNlZCkKK3sKKyAgICBBTE9HVigiQXVkaW9GbGluZ2VyOjpzZXRSZWNvcmRTaWxlbmNlZCh1aWQ6JWQsIHNpbGVuY2VkOiVkKSIsIHVpZCwgc2lsZW5jZWQpOworCisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVJlY29yZFRocmVhZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbVJlY29yZFRocmVhZHNbaV0tPnNldFJlY29yZFNpbGVuY2VkKHVpZCwgc2lsZW5jZWQpOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1NbWFwVGhyZWFkcy5zaXplKCk7IGkrKykgeworICAgICAgICBtTW1hcFRocmVhZHNbaV0tPnNldFJlY29yZFNpbGVuY2VkKHVpZCwgc2lsZW5jZWQpOworICAgIH0KK30KKwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpzZXRNYXN0ZXJNdXRlKGJvb2wgbXV0ZWQpCiB7CiAgICAgc3RhdHVzX3QgcmV0ID0gaW5pdENoZWNrKCk7CkBAIC0xMDY5LDI2ICsxMDk5LDE3IEBACiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KKyAgICBpZiAob3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQogICAgIEFMT0dfQVNTRVJUKHN0cmVhbSAhPSBBVURJT19TVFJFQU1fUEFUQ0gsICJhdHRlbXB0IHRvIGNoYW5nZSBBVURJT19TVFJFQU1fUEFUQ0ggdm9sdW1lIik7CiAKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgVmVjdG9yPFZvbHVtZUludGVyZmFjZSAqPiB2b2x1bWVJbnRlcmZhY2VzOwotICAgIGlmIChvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgVm9sdW1lSW50ZXJmYWNlICp2b2x1bWVJbnRlcmZhY2UgPSBnZXRWb2x1bWVJbnRlcmZhY2VfbChvdXRwdXQpOwotICAgICAgICBpZiAodm9sdW1lSW50ZXJmYWNlID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgdm9sdW1lSW50ZXJmYWNlcy5hZGQodm9sdW1lSW50ZXJmYWNlKTsKKyAgICBWb2x1bWVJbnRlcmZhY2UgKnZvbHVtZUludGVyZmFjZSA9IGdldFZvbHVtZUludGVyZmFjZV9sKG91dHB1dCk7CisgICAgaWYgKHZvbHVtZUludGVyZmFjZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotCi0gICAgbVN0cmVhbVR5cGVzW3N0cmVhbV0udm9sdW1lID0gdmFsdWU7Ci0KLSAgICBpZiAodm9sdW1lSW50ZXJmYWNlcy5zaXplKCkgPT0gMCkgewotICAgICAgICB2b2x1bWVJbnRlcmZhY2VzID0gZ2V0QWxsVm9sdW1lSW50ZXJmYWNlc19sKCk7Ci0gICAgfQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdm9sdW1lSW50ZXJmYWNlcy5zaXplKCk7IGkrKykgewotICAgICAgICB2b2x1bWVJbnRlcmZhY2VzW2ldLT5zZXRTdHJlYW1Wb2x1bWUoc3RyZWFtLCB2YWx1ZSk7Ci0gICAgfQorICAgIHZvbHVtZUludGVyZmFjZS0+c2V0U3RyZWFtVm9sdW1lKHN0cmVhbSwgdmFsdWUpOwogCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtMTEyNywyMSArMTE0OCwxNyBAQAogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgcmV0dXJuIDAuMGY7CiAgICAgfQotCi0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIGZsb2F0IHZvbHVtZTsKLSAgICBpZiAob3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIFZvbHVtZUludGVyZmFjZSAqdm9sdW1lSW50ZXJmYWNlID0gZ2V0Vm9sdW1lSW50ZXJmYWNlX2wob3V0cHV0KTsKLSAgICAgICAgaWYgKHZvbHVtZUludGVyZmFjZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICB2b2x1bWUgPSB2b2x1bWVJbnRlcmZhY2UtPnN0cmVhbVZvbHVtZShzdHJlYW0pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdm9sdW1lID0gMC4wZjsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHZvbHVtZSA9IHN0cmVhbVZvbHVtZV9sKHN0cmVhbSk7CisgICAgaWYgKG91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICByZXR1cm4gMC4wZjsKICAgICB9CiAKLSAgICByZXR1cm4gdm9sdW1lOworICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBWb2x1bWVJbnRlcmZhY2UgKnZvbHVtZUludGVyZmFjZSA9IGdldFZvbHVtZUludGVyZmFjZV9sKG91dHB1dCk7CisgICAgaWYgKHZvbHVtZUludGVyZmFjZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwLjBmOworICAgIH0KKworICAgIHJldHVybiB2b2x1bWVJbnRlcmZhY2UtPnN0cmVhbVZvbHVtZShzdHJlYW0pOwogfQogCiBib29sIEF1ZGlvRmxpbmdlcjo6c3RyZWFtTXV0ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKQEAgLTExNjMsMTYgKzExODAsNTkgQEAKICAgICB9CiB9CiAKKy8vIEZpbHRlciByZXNlcnZlZCBrZXlzIGZyb20gc2V0UGFyYW1ldGVycygpIGJlZm9yZSBmb3J3YXJkaW5nIHRvIGF1ZGlvIEhBTCBvciBhY3RpbmcgdXBvbi4KKy8vIFNvbWUga2V5cyBhcmUgdXNlZCBmb3IgYXVkaW8gcm91dGluZyBhbmQgYXVkaW8gcGF0aCBjb25maWd1cmF0aW9uIGFuZCBzaG91bGQgYmUgcmVzZXJ2ZWQgZm9yIHVzZQorLy8gYnkgYXVkaW8gcG9saWN5IGFuZCBhdWRpbyBmbGluZ2VyIGZvciBmdW5jdGlvbmFsLCBwcml2YWN5IGFuZCBzZWN1cml0eSByZWFzb25zLgordm9pZCBBdWRpb0ZsaW5nZXI6OmZpbHRlclJlc2VydmVkUGFyYW1ldGVycyhTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzLCB1aWRfdCBjYWxsaW5nVWlkKQoreworICAgIHN0YXRpYyBjb25zdCBTdHJpbmc4IGtSZXNlcnZlZFBhcmFtZXRlcnNbXSA9IHsKKyAgICAgICAgU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Um91dGluZyksCisgICAgICAgIFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVNhbXBsaW5nUmF0ZSksCisgICAgICAgIFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleUZvcm1hdCksCisgICAgICAgIFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleUNoYW5uZWxzKSwKKyAgICAgICAgU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5RnJhbWVDb3VudCksCisgICAgICAgIFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleUlucHV0U291cmNlKSwKKyAgICAgICAgU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5TW9ub091dHB1dCksCisgICAgICAgIFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbUNvbm5lY3QpLAorICAgICAgICBTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1EaXNjb25uZWN0KSwKKyAgICAgICAgU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkRm9ybWF0cyksCisgICAgICAgIFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZENoYW5uZWxzKSwKKyAgICAgICAgU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkU2FtcGxpbmdSYXRlcyksCisgICAgfTsKKworICAgIC8vIG11bHRpdXNlciBmcmllbmRseSBhcHAgSUQgY2hlY2sgZm9yIHJlcXVlc3RzIGNvbWluZyBmcm9tIGF1ZGlvc2VydmVyCisgICAgaWYgKG11bHRpdXNlcl9nZXRfYXBwX2lkKGNhbGxpbmdVaWQpID09IEFJRF9BVURJT1NFUlZFUikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihrZXlWYWx1ZVBhaXJzKTsKKyAgICBTdHJpbmc4IHZhbHVlOworICAgIGZvciAoYXV0byYga2V5IDoga1Jlc2VydmVkUGFyYW1ldGVycykgeworICAgICAgICBpZiAocGFyYW0uZ2V0KGtleSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HVygiJXM6IGZpbHRlcmluZyBrZXkgJXMgdmFsdWUgJXMgZnJvbSB1aWQgJWQiLAorICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGtleS5zdHJpbmcoKSwgdmFsdWUuc3RyaW5nKCksIGNhbGxpbmdVaWQpOworICAgICAgICAgICAgcGFyYW0ucmVtb3ZlKGtleSk7CisgICAgICAgIH0KKyAgICB9CisgICAga2V5VmFsdWVQYWlycyA9IHBhcmFtLnRvU3RyaW5nKCk7Cit9CisKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6c2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycykKIHsKLSAgICBBTE9HVigic2V0UGFyYW1ldGVycygpOiBpbyAlZCwga2V5dmFsdWUgJXMsIGNhbGxpbmcgcGlkICVkIiwKLSAgICAgICAgICAgIGlvSGFuZGxlLCBrZXlWYWx1ZVBhaXJzLnN0cmluZygpLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpOworICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXJzKCk6IGlvICVkLCBrZXl2YWx1ZSAlcywgY2FsbGluZyBwaWQgJWQgY2FsbGluZyB1aWQgJWQiLAorICAgICAgICAgICAgaW9IYW5kbGUsIGtleVZhbHVlUGFpcnMuc3RyaW5nKCksCisgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7CiAKICAgICAvLyBjaGVjayBjYWxsaW5nIHBlcm1pc3Npb25zCiAgICAgaWYgKCFzZXR0aW5nc0FsbG93ZWQoKSkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQogCisgICAgU3RyaW5nOCBmaWx0ZXJlZEtleVZhbHVlUGFpcnMgPSBrZXlWYWx1ZVBhaXJzOworICAgIGZpbHRlclJlc2VydmVkUGFyYW1ldGVycyhmaWx0ZXJlZEtleVZhbHVlUGFpcnMsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7CisKKyAgICBBTE9HVigiJXM6IGZpbHRlcmVkIGtleXZhbHVlICVzIiwgX19mdW5jX18sIGZpbHRlcmVkS2V5VmFsdWVQYWlycy5zdHJpbmcoKSk7CisKICAgICAvLyBBVURJT19JT19IQU5ETEVfTk9ORSBtZWFucyB0aGUgcGFyYW1ldGVycyBhcmUgZ2xvYmFsIHRvIHRoZSBhdWRpbyBoYXJkd2FyZSBpbnRlcmZhY2UKICAgICBpZiAoaW9IYW5kbGUgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTExODMsNyArMTI0Myw3IEBACiAgICAgICAgICAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19TRVRfUEFSQU1FVEVSOwogICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9Id0RldnMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgICAgICBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+IGRldiA9IG1BdWRpb0h3RGV2cy52YWx1ZUF0KGkpLT5od0RldmljZSgpOwotICAgICAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IGRldi0+c2V0UGFyYW1ldGVycyhrZXlWYWx1ZVBhaXJzKTsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBkZXYtPnNldFBhcmFtZXRlcnMoZmlsdGVyZWRLZXlWYWx1ZVBhaXJzKTsKICAgICAgICAgICAgICAgICAvLyByZXR1cm4gc3VjY2VzcyBpZiBhdCBsZWFzdCBvbmUgYXVkaW8gZGV2aWNlIGFjY2VwdHMgdGhlIHBhcmFtZXRlcnMgYXMgbm90IGFsbAogICAgICAgICAgICAgICAgIC8vIEhBTHMgYXJlIHJlcXVlc3RlZCB0byBzdXBwb3J0IGFsbCBwYXJhbWV0ZXJzLiBJZiBubyBhdWRpbyBkZXZpY2Ugc3VwcG9ydHMgdGhlCiAgICAgICAgICAgICAgICAgLy8gcmVxdWVzdGVkIHBhcmFtZXRlcnMsIHRoZSBsYXN0IGVycm9yIGlzIHJlcG9ydGVkLgpAQCAtMTE5NCw3ICsxMjU0LDcgQEAKICAgICAgICAgICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX0lETEU7CiAgICAgICAgIH0KICAgICAgICAgLy8gZGlzYWJsZSBBRUMgYW5kIE5TIGlmIHRoZSBkZXZpY2UgaXMgYSBCVCBTQ08gaGVhZHNldCBzdXBwb3J0aW5nIHRob3NlIHByZSBwcm9jZXNzaW5ncwotICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKGtleVZhbHVlUGFpcnMpOworICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKGZpbHRlcmVkS2V5VmFsdWVQYWlycyk7CiAgICAgICAgIFN0cmluZzggdmFsdWU7CiAgICAgICAgIGlmIChwYXJhbS5nZXQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5QnROcmVjKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBib29sIGJ0TnJlY0lzT2ZmID0gKHZhbHVlID09IEF1ZGlvUGFyYW1ldGVyOjp2YWx1ZU9mZik7CkBAIC0xMjI3LDE2ICsxMjg3LDE2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAodGhyZWFkID09IHByaW1hcnlQbGF5YmFja1RocmVhZF9sKCkpIHsKICAgICAgICAgICAgIC8vIGluZGljYXRlIG91dHB1dCBkZXZpY2UgY2hhbmdlIHRvIGFsbCBpbnB1dCB0aHJlYWRzIGZvciBwcmUgcHJvY2Vzc2luZwotICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihrZXlWYWx1ZVBhaXJzKTsKKyAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoZmlsdGVyZWRLZXlWYWx1ZVBhaXJzKTsKICAgICAgICAgICAgIGludCB2YWx1ZTsKICAgICAgICAgICAgIGlmICgocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpLCB2YWx1ZSkgPT0gTk9fRVJST1IpICYmCiAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSAhPSAwKSkgewotICAgICAgICAgICAgICAgIGJyb2FjYXN0UGFyYW1ldGVyc1RvUmVjb3JkVGhyZWFkc19sKGtleVZhbHVlUGFpcnMpOworICAgICAgICAgICAgICAgIGJyb2FjYXN0UGFyYW1ldGVyc1RvUmVjb3JkVGhyZWFkc19sKGZpbHRlcmVkS2V5VmFsdWVQYWlycyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKHRocmVhZCAhPSAwKSB7Ci0gICAgICAgIHJldHVybiB0aHJlYWQtPnNldFBhcmFtZXRlcnMoa2V5VmFsdWVQYWlycyk7CisgICAgICAgIHJldHVybiB0aHJlYWQtPnNldFBhcmFtZXRlcnMoZmlsdGVyZWRLZXlWYWx1ZVBhaXJzKTsKICAgICB9CiAgICAgcmV0dXJuIEJBRF9WQUxVRTsKIH0KQEAgLTE0ODUsMTcgKzE1NDUsOSBAQAogICAgICAgICBtQXVkaW9GbGluZ2VyKGF1ZGlvRmxpbmdlciksCiAgICAgICAgIG1QaWQocGlkKQogewotICAgIHNpemVfdCBoZWFwU2l6ZSA9IHByb3BlcnR5X2dldF9pbnQzMigicm8uYWYuY2xpZW50X2hlYXBfc2l6ZV9rYnl0ZSIsIDApOwotICAgIGhlYXBTaXplICo9IDEwMjQ7Ci0gICAgaWYgKCFoZWFwU2l6ZSkgewotICAgICAgICBoZWFwU2l6ZSA9IGtDbGllbnRTaGFyZWRIZWFwU2l6ZUJ5dGVzOwotICAgICAgICAvLyBJbmNyZWFzZSBoZWFwIHNpemUgb24gbm9uIGxvdyByYW0gZGV2aWNlcyB0byBsaW1pdCByaXNrIG9mIHJlY29ubmVjdGlvbiBmYWlsdXJlIGZvcgotICAgICAgICAvLyBpbnZhbGlkYXRlZCB0cmFja3MKLSAgICAgICAgaWYgKCFhdWRpb0ZsaW5nZXItPmlzTG93UmFtRGV2aWNlKCkpIHsKLSAgICAgICAgICAgIGhlYXBTaXplICo9IGtDbGllbnRTaGFyZWRIZWFwU2l6ZU11bHRpcGxpZXI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbU1lbW9yeURlYWxlciA9IG5ldyBNZW1vcnlEZWFsZXIoaGVhcFNpemUsICJBdWRpb0ZsaW5nZXI6OkNsaWVudCIpOworICAgIG1NZW1vcnlEZWFsZXIgPSBuZXcgTWVtb3J5RGVhbGVyKAorICAgICAgICAgICAgYXVkaW9GbGluZ2VyLT5nZXRDbGllbnRTaGFyZWRIZWFwU2l6ZSgpLAorICAgICAgICAgICAgKHN0ZDo6c3RyaW5nKCJBdWRpb0ZsaW5nZXI6OkNsaWVudCgiKSArIHN0ZDo6dG9fc3RyaW5nKHBpZCkgKyAiKSIpLmNfc3RyKCkpOwogfQogCiAvLyBDbGllbnQgZGVzdHJ1Y3RvciBtdXN0IGJlIGNhbGxlZCB3aXRoIEF1ZGlvRmxpbmdlcjo6bUNsaWVudExvY2sgaGVsZApAQCAtMTU2NiwxMjAgKzE2MTgsMTQ0IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotc3A8SUF1ZGlvUmVjb3JkPiBBdWRpb0ZsaW5nZXI6Om9wZW5SZWNvcmQoCi0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKLSAgICAgICAgc2l6ZV90ICpmcmFtZUNvdW50LAotICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190ICpmbGFncywKLSAgICAgICAgcGlkX3QgcGlkLAotICAgICAgICBwaWRfdCB0aWQsCi0gICAgICAgIGludCBjbGllbnRVaWQsCi0gICAgICAgIGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbklkLAotICAgICAgICBzaXplX3QgKm5vdGlmaWNhdGlvbkZyYW1lcywKLSAgICAgICAgc3A8SU1lbW9yeT4mIGNibGssCi0gICAgICAgIHNwPElNZW1vcnk+JiBidWZmZXJzLAotICAgICAgICBzdGF0dXNfdCAqc3RhdHVzLAotICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKK3NwPG1lZGlhOjpJQXVkaW9SZWNvcmQ+IEF1ZGlvRmxpbmdlcjo6Y3JlYXRlUmVjb3JkKGNvbnN0IENyZWF0ZVJlY29yZElucHV0JiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZVJlY29yZE91dHB1dCYgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cykKIHsKICAgICBzcDxSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrPiByZWNvcmRUcmFjazsKICAgICBzcDxSZWNvcmRIYW5kbGU+IHJlY29yZEhhbmRsZTsKICAgICBzcDxDbGllbnQ+IGNsaWVudDsKICAgICBzdGF0dXNfdCBsU3RhdHVzOwotICAgIGF1ZGlvX3Nlc3Npb25fdCBsU2Vzc2lvbklkOworICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgPSBpbnB1dC5zZXNzaW9uSWQ7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOwogCi0gICAgY2Jsay5jbGVhcigpOwotICAgIGJ1ZmZlcnMuY2xlYXIoKTsKKyAgICBvdXRwdXQuY2Jsay5jbGVhcigpOworICAgIG91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgb3V0cHV0LmlucHV0SWQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKIAotICAgIGJvb2wgdXBkYXRlUGlkID0gKHBpZCA9PSAtMSk7CisgICAgYm9vbCB1cGRhdGVQaWQgPSAoaW5wdXQuY2xpZW50SW5mby5jbGllbnRQaWQgPT0gLTEpOwogICAgIGNvbnN0IHVpZF90IGNhbGxpbmdVaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CisgICAgdWlkX3QgY2xpZW50VWlkID0gaW5wdXQuY2xpZW50SW5mby5jbGllbnRVaWQ7CiAgICAgaWYgKCFpc1RydXN0ZWRDYWxsaW5nVWlkKGNhbGxpbmdVaWQpKSB7Ci0gICAgICAgIEFMT0dXX0lGKCh1aWRfdCljbGllbnRVaWQgIT0gY2FsbGluZ1VpZCwKLSAgICAgICAgICAgICAgICAiJXMgdWlkICVkIHRyaWVkIHRvIHBhc3MgaXRzZWxmIG9mZiBhcyAlZCIsIF9fRlVOQ1RJT05fXywgY2FsbGluZ1VpZCwgY2xpZW50VWlkKTsKKyAgICAgICAgQUxPR1dfSUYoY2xpZW50VWlkICE9IGNhbGxpbmdVaWQsCisgICAgICAgICAgICAgICAgIiVzIHVpZCAlZCB0cmllZCB0byBwYXNzIGl0c2VsZiBvZmYgYXMgJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FsbGluZ1VpZCwgY2xpZW50VWlkKTsKICAgICAgICAgY2xpZW50VWlkID0gY2FsbGluZ1VpZDsKICAgICAgICAgdXBkYXRlUGlkID0gdHJ1ZTsKICAgICB9Ci0KKyAgICBwaWRfdCBjbGllbnRQaWQgPSBpbnB1dC5jbGllbnRJbmZvLmNsaWVudFBpZDsKICAgICBpZiAodXBkYXRlUGlkKSB7CiAgICAgICAgIGNvbnN0IHBpZF90IGNhbGxpbmdQaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7Ci0gICAgICAgIEFMT0dXX0lGKHBpZCAhPSAtMSAmJiBwaWQgIT0gY2FsbGluZ1BpZCwKKyAgICAgICAgQUxPR1dfSUYoY2xpZW50UGlkICE9IC0xICYmIGNsaWVudFBpZCAhPSBjYWxsaW5nUGlkLAogICAgICAgICAgICAgICAgICAiJXMgdWlkICVkIHBpZCAlZCB0cmllZCB0byBwYXNzIGl0c2VsZiBvZmYgYXMgcGlkICVkIiwKLSAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNhbGxpbmdVaWQsIGNhbGxpbmdQaWQsIHBpZCk7Ci0gICAgICAgIHBpZCA9IGNhbGxpbmdQaWQ7Ci0gICAgfQotCi0gICAgLy8gY2hlY2sgY2FsbGluZyBwZXJtaXNzaW9ucwotICAgIGlmICghcmVjb3JkaW5nQWxsb3dlZChvcFBhY2thZ2VOYW1lLCB0aWQsIGNsaWVudFVpZCkpIHsKLSAgICAgICAgQUxPR0UoIm9wZW5SZWNvcmQoKSBwZXJtaXNzaW9uIGRlbmllZDogcmVjb3JkaW5nIG5vdCBhbGxvd2VkIik7Ci0gICAgICAgIGxTdGF0dXMgPSBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8vIGZ1cnRoZXIgc2FtcGxlIHJhdGUgY2hlY2tzIGFyZSBwZXJmb3JtZWQgYnkgY3JlYXRlUmVjb3JkVHJhY2tfbCgpCi0gICAgaWYgKHNhbXBsZVJhdGUgPT0gMCkgewotICAgICAgICBBTE9HRSgib3BlblJlY29yZCgpIGludmFsaWQgc2FtcGxlIHJhdGUgJXUiLCBzYW1wbGVSYXRlKTsKLSAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgZ290byBFeGl0OworICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY2FsbGluZ1VpZCwgY2FsbGluZ1BpZCwgY2xpZW50UGlkKTsKKyAgICAgICAgY2xpZW50UGlkID0gY2FsbGluZ1BpZDsKICAgICB9CiAKICAgICAvLyB3ZSBkb24ndCB5ZXQgc3VwcG9ydCBhbnl0aGluZyBvdGhlciB0aGFuIGxpbmVhciBQQ00KLSAgICBpZiAoIWF1ZGlvX2lzX3ZhbGlkX2Zvcm1hdChmb3JtYXQpIHx8ICFhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkpIHsKLSAgICAgICAgQUxPR0UoIm9wZW5SZWNvcmQoKSBpbnZhbGlkIGZvcm1hdCAlI3giLCBmb3JtYXQpOworICAgIGlmICghYXVkaW9faXNfdmFsaWRfZm9ybWF0KGlucHV0LmNvbmZpZy5mb3JtYXQpIHx8ICFhdWRpb19pc19saW5lYXJfcGNtKGlucHV0LmNvbmZpZy5mb3JtYXQpKSB7CisgICAgICAgIEFMT0dFKCJjcmVhdGVSZWNvcmQoKSBpbnZhbGlkIGZvcm1hdCAlI3giLCBpbnB1dC5jb25maWcuZm9ybWF0KTsKICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgZ290byBFeGl0OwogICAgIH0KIAogICAgIC8vIGZ1cnRoZXIgY2hhbm5lbCBtYXNrIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGJ5IGNyZWF0ZVJlY29yZFRyYWNrX2woKQotICAgIGlmICghYXVkaW9faXNfaW5wdXRfY2hhbm5lbChjaGFubmVsTWFzaykpIHsKLSAgICAgICAgQUxPR0UoIm9wZW5SZWNvcmQoKSBpbnZhbGlkIGNoYW5uZWwgbWFzayAlI3giLCBjaGFubmVsTWFzayk7CisgICAgaWYgKCFhdWRpb19pc19pbnB1dF9jaGFubmVsKGlucHV0LmNvbmZpZy5jaGFubmVsX21hc2spKSB7CisgICAgICAgIEFMT0dFKCJjcmVhdGVSZWNvcmQoKSBpbnZhbGlkIGNoYW5uZWwgbWFzayAlI3giLCBpbnB1dC5jb25maWcuY2hhbm5lbF9tYXNrKTsKICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgZ290byBFeGl0OwogICAgIH0KIAorICAgIGlmIChzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9BTExPQ0FURSkgeworICAgICAgICBzZXNzaW9uSWQgPSAoYXVkaW9fc2Vzc2lvbl90KSBuZXdBdWRpb1VuaXF1ZUlkKEFVRElPX1VOSVFVRV9JRF9VU0VfU0VTU0lPTik7CisgICAgfSBlbHNlIGlmIChhdWRpb191bmlxdWVfaWRfZ2V0X3VzZShzZXNzaW9uSWQpICE9IEFVRElPX1VOSVFVRV9JRF9VU0VfU0VTU0lPTikgeworICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgb3V0cHV0LnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKyAgICBvdXRwdXQuc2VsZWN0ZWREZXZpY2VJZCA9IGlucHV0LnNlbGVjdGVkRGV2aWNlSWQ7CisgICAgb3V0cHV0LmZsYWdzID0gaW5wdXQuZmxhZ3M7CisKKyAgICBjbGllbnQgPSByZWdpc3RlclBpZChjbGllbnRQaWQpOworCisgICAgLy8gTm90IGEgY29udmVudGlvbmFsIGxvb3AsIGJ1dCBhIHJldHJ5IGxvb3AgZm9yIGF0IG1vc3QgdHdvIGl0ZXJhdGlvbnMgdG90YWwuCisgICAgLy8gVHJ5IGZpcnN0IG1heWJlIHdpdGggRkFTVCBmbGFnIHRoZW4gdHJ5IGFnYWluIHdpdGhvdXQgRkFTVCBmbGFnIGlmIHRoYXQgZmFpbHMuCisgICAgLy8gRXhpdHMgbG9vcCB2aWEgYnJlYWsgb24gbm8gZXJyb3Igb2YgZ290IGV4aXQgb24gZXJyb3IKKyAgICAvLyBUaGUgc3A8PiByZWZlcmVuY2VzIHdpbGwgYmUgZHJvcHBlZCB3aGVuIHJlLWVudGVyaW5nIHNjb3BlLgorICAgIC8vIFRoZSBsYWNrIG9mIGluZGVudGF0aW9uIGlzIGRlbGliZXJhdGUsIHRvIHJlZHVjZSBjb2RlIGNodXJuIGFuZCBlYXNlIG1lcmdlcy4KKyAgICBmb3IgKDs7KSB7CisgICAgLy8gcmVsZWFzZSBwcmV2aW91c2x5IG9wZW5lZCBpbnB1dCBpZiByZXRyeWluZy4KKyAgICBpZiAob3V0cHV0LmlucHV0SWQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgcmVjb3JkVHJhY2suY2xlYXIoKTsKKyAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VJbnB1dChwb3J0SWQpOworICAgICAgICBvdXRwdXQuaW5wdXRJZCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICBvdXRwdXQuc2VsZWN0ZWREZXZpY2VJZCA9IGlucHV0LnNlbGVjdGVkRGV2aWNlSWQ7CisgICAgICAgIHBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgfQorICAgIGxTdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0SW5wdXRGb3JBdHRyKCZpbnB1dC5hdHRyLCAmb3V0cHV0LmlucHV0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIGNvbXBhcmUgdG8gQXVkaW9UcmFjaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRQaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQub3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0LmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmZsYWdzLCAmb3V0cHV0LnNlbGVjdGVkRGV2aWNlSWQsICZwb3J0SWQpOworCiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICBSZWNvcmRUaHJlYWQgKnRocmVhZCA9IGNoZWNrUmVjb3JkVGhyZWFkX2woaW5wdXQpOworICAgICAgICBSZWNvcmRUaHJlYWQgKnRocmVhZCA9IGNoZWNrUmVjb3JkVGhyZWFkX2wob3V0cHV0LmlucHV0SWQpOwogICAgICAgICBpZiAodGhyZWFkID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJvcGVuUmVjb3JkKCkgY2hlY2tSZWNvcmRUaHJlYWRfbCBmYWlsZWQiKTsKKyAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVSZWNvcmQoKSBjaGVja1JlY29yZFRocmVhZF9sIGZhaWxlZCIpOwogICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgICAgfQogCi0gICAgICAgIGNsaWVudCA9IHJlZ2lzdGVyUGlkKHBpZCk7CisgICAgICAgIEFMT0dWKCJjcmVhdGVSZWNvcmQoKSBsU2Vzc2lvbklkOiAlZCBpbnB1dCAlZCIsIHNlc3Npb25JZCwgb3V0cHV0LmlucHV0SWQpOwogCi0gICAgICAgIGlmIChzZXNzaW9uSWQgIT0gTlVMTCAmJiAqc2Vzc2lvbklkICE9IEFVRElPX1NFU1NJT05fQUxMT0NBVEUpIHsKLSAgICAgICAgICAgIGlmIChhdWRpb191bmlxdWVfaWRfZ2V0X3VzZSgqc2Vzc2lvbklkKSAhPSBBVURJT19VTklRVUVfSURfVVNFX1NFU1NJT04pIHsKLSAgICAgICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxTZXNzaW9uSWQgPSAqc2Vzc2lvbklkOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gaWYgbm8gYXVkaW8gc2Vzc2lvbiBpZCBpcyBwcm92aWRlZCwgY3JlYXRlIG9uZSBoZXJlCi0gICAgICAgICAgICBsU2Vzc2lvbklkID0gKGF1ZGlvX3Nlc3Npb25fdCkgbmV4dFVuaXF1ZUlkKEFVRElPX1VOSVFVRV9JRF9VU0VfU0VTU0lPTik7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbklkICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAqc2Vzc2lvbklkID0gbFNlc3Npb25JZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBBTE9HVigib3BlblJlY29yZCgpIGxTZXNzaW9uSWQ6ICVkIGlucHV0ICVkIiwgbFNlc3Npb25JZCwgaW5wdXQpOworICAgICAgICBvdXRwdXQuc2FtcGxlUmF0ZSA9IGlucHV0LmNvbmZpZy5zYW1wbGVfcmF0ZTsKKyAgICAgICAgb3V0cHV0LmZyYW1lQ291bnQgPSBpbnB1dC5mcmFtZUNvdW50OworICAgICAgICBvdXRwdXQubm90aWZpY2F0aW9uRnJhbWVDb3VudCA9IGlucHV0Lm5vdGlmaWNhdGlvbkZyYW1lQ291bnQ7CiAKLSAgICAgICAgcmVjb3JkVHJhY2sgPSB0aHJlYWQtPmNyZWF0ZVJlY29yZFRyYWNrX2woY2xpZW50LCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBsU2Vzc2lvbklkLCBub3RpZmljYXRpb25GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFVpZCwgZmxhZ3MsIHRpZCwgJmxTdGF0dXMsIHBvcnRJZCk7CisgICAgICAgIHJlY29yZFRyYWNrID0gdGhyZWFkLT5jcmVhdGVSZWNvcmRUcmFja19sKGNsaWVudCwgaW5wdXQuYXR0ciwgJm91dHB1dC5zYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25maWcuZm9ybWF0LCBpbnB1dC5jb25maWcuY2hhbm5lbF9tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0LmZyYW1lQ291bnQsIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dC5ub3RpZmljYXRpb25GcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRVaWQsICZvdXRwdXQuZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNsaWVudEluZm8uY2xpZW50VGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbFN0YXR1cywgcG9ydElkKTsKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigobFN0YXR1cyA9PSBOT19FUlJPUikgJiYgKHJlY29yZFRyYWNrID09IDApKTsKIAotICAgICAgICBpZiAobFN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgLy8gQ2hlY2sgaWYgb25lIGVmZmVjdCBjaGFpbiB3YXMgYXdhaXRpbmcgZm9yIGFuIEF1ZGlvUmVjb3JkIHRvIGJlIGNyZWF0ZWQgb24gdGhpcwotICAgICAgICAgICAgLy8gc2Vzc2lvbiBhbmQgbW92ZSBpdCB0byB0aGlzIHRocmVhZC4KLSAgICAgICAgICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IGdldE9ycGhhbkVmZmVjdENoYWluX2wobFNlc3Npb25JZCk7Ci0gICAgICAgICAgICBpZiAoY2hhaW4gIT0gMCkgewotICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbCh0aHJlYWQtPm1Mb2NrKTsKLSAgICAgICAgICAgICAgICB0aHJlYWQtPmFkZEVmZmVjdENoYWluX2woY2hhaW4pOwotICAgICAgICAgICAgfQorICAgICAgICAvLyBsU3RhdHVzID09IEJBRF9UWVBFIG1lYW5zIEZBU1QgZmxhZyB3YXMgcmVqZWN0ZWQ6IHJlcXVlc3QgYSBuZXcgaW5wdXQgZnJvbQorICAgICAgICAvLyBhdWRpbyBwb2xpY3kgbWFuYWdlciB3aXRob3V0IEZBU1QgY29uc3RyYWludAorICAgICAgICBpZiAobFN0YXR1cyA9PSBCQURfVFlQRSkgeworICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KKworICAgICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgZ290byBFeGl0OworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgb25lIGVmZmVjdCBjaGFpbiB3YXMgYXdhaXRpbmcgZm9yIGFuIEF1ZGlvUmVjb3JkIHRvIGJlIGNyZWF0ZWQgb24gdGhpcworICAgICAgICAvLyBzZXNzaW9uIGFuZCBtb3ZlIGl0IHRvIHRoaXMgdGhyZWFkLgorICAgICAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBnZXRPcnBoYW5FZmZlY3RDaGFpbl9sKHNlc3Npb25JZCk7CisgICAgICAgIGlmIChjaGFpbiAhPSAwKSB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodGhyZWFkLT5tTG9jayk7CisgICAgICAgICAgICB0aHJlYWQtPmFkZEVmZmVjdENoYWluX2woY2hhaW4pOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAvLyBFbmQgb2YgcmV0cnkgbG9vcC4KKyAgICAvLyBUaGUgbGFjayBvZiBpbmRlbnRhdGlvbiBpcyBkZWxpYmVyYXRlLCB0byByZWR1Y2UgY29kZSBjaHVybiBhbmQgZWFzZSBtZXJnZXMuCiAgICAgfQogCisgICAgb3V0cHV0LmNibGsgPSByZWNvcmRUcmFjay0+Z2V0Q2JsaygpOworICAgIG91dHB1dC5idWZmZXJzID0gcmVjb3JkVHJhY2stPmdldEJ1ZmZlcnMoKTsKKworICAgIC8vIHJldHVybiBoYW5kbGUgdG8gY2xpZW50CisgICAgcmVjb3JkSGFuZGxlID0gbmV3IFJlY29yZEhhbmRsZShyZWNvcmRUcmFjayk7CisKK0V4aXQ6CiAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgLy8gcmVtb3ZlIGxvY2FsIHN0cm9uZyByZWZlcmVuY2UgdG8gQ2xpZW50IGJlZm9yZSBkZWxldGluZyB0aGUgUmVjb3JkVHJhY2sgc28gdGhhdCB0aGUKICAgICAgICAgLy8gQ2xpZW50IGRlc3RydWN0b3IgaXMgY2FsbGVkIGJ5IHRoZSBUcmFja0Jhc2UgZGVzdHJ1Y3RvciB3aXRoIG1DbGllbnRMb2NrIGhlbGQKQEAgLTE2OTAsMTYgKzE3NjYsMTEgQEAKICAgICAgICAgICAgIGNsaWVudC5jbGVhcigpOwogICAgICAgICB9CiAgICAgICAgIHJlY29yZFRyYWNrLmNsZWFyKCk7Ci0gICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgaWYgKG91dHB1dC5pbnB1dElkICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUlucHV0KHBvcnRJZCk7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBjYmxrID0gcmVjb3JkVHJhY2stPmdldENibGsoKTsKLSAgICBidWZmZXJzID0gcmVjb3JkVHJhY2stPmdldEJ1ZmZlcnMoKTsKLQotICAgIC8vIHJldHVybiBoYW5kbGUgdG8gY2xpZW50Ci0gICAgcmVjb3JkSGFuZGxlID0gbmV3IFJlY29yZEhhbmRsZShyZWNvcmRUcmFjayk7Ci0KLUV4aXQ6CiAgICAgKnN0YXR1cyA9IGxTdGF0dXM7CiAgICAgcmV0dXJuIHJlY29yZEhhbmRsZTsKIH0KQEAgLTE4MTEsNyArMTg4Miw3IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpzZXRMb3dSYW1EZXZpY2UoYm9vbCBpc0xvd1JhbURldmljZSkKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6c2V0TG93UmFtRGV2aWNlKGJvb2wgaXNMb3dSYW1EZXZpY2UsIGludDY0X3QgdG90YWxNZW1vcnkpCiB7CiAgICAgdWlkX3QgdWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwogICAgIGlmICh1aWQgIT0gQUlEX1NZU1RFTSkgewpAQCAtMTgyMiwxMCArMTg5Myw0MyBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogICAgIG1Jc0xvd1JhbURldmljZSA9IGlzTG93UmFtRGV2aWNlOworICAgIG1Ub3RhbE1lbW9yeSA9IHRvdGFsTWVtb3J5OworICAgIC8vIG1Jc0xvd1JhbURldmljZSBhbmQgbVRvdGFsTWVtb3J5IGFyZSBvYnRhaW5lZCB0aHJvdWdoIEFjdGl2aXR5TWFuYWdlcjsKKyAgICAvLyBzZWUgQWN0aXZpdHlNYW5hZ2VyLmlzTG93UmFtRGV2aWNlKCkgYW5kIEFjdGl2aXR5TWFuYWdlci5nZXRNZW1vcnlJbmZvKCkuCisgICAgLy8gbUlzTG93UmFtRGV2aWNlIGdlbmVyYWxseSByZXByZXNlbnQgZGV2aWNlcyB3aXRoIGxlc3MgdGhhbiAxR0Igb2YgbWVtb3J5LAorICAgIC8vIHRob3VnaCBhY3R1YWwgc2V0dGluZyBpcyBkZXRlcm1pbmVkIHRocm91Z2ggZGV2aWNlIGNvbmZpZ3VyYXRpb24uCisgICAgY29uc3RleHByIGludDY0X3QgR0IgPSAxMDI0ICogMTAyNCAqIDEwMjQ7CisgICAgbUNsaWVudFNoYXJlZEhlYXBTaXplID0KKyAgICAgICAgICAgIGlzTG93UmFtRGV2aWNlID8ga01pbmltdW1DbGllbnRTaGFyZWRIZWFwU2l6ZUJ5dGVzCisgICAgICAgICAgICAgICAgICAgIDogbVRvdGFsTWVtb3J5IDwgMiAqIEdCID8gNCAqIGtNaW5pbXVtQ2xpZW50U2hhcmVkSGVhcFNpemVCeXRlcworICAgICAgICAgICAgICAgICAgICA6IG1Ub3RhbE1lbW9yeSA8IDMgKiBHQiA/IDggKiBrTWluaW11bUNsaWVudFNoYXJlZEhlYXBTaXplQnl0ZXMKKyAgICAgICAgICAgICAgICAgICAgOiBtVG90YWxNZW1vcnkgPCA0ICogR0IgPyAxNiAqIGtNaW5pbXVtQ2xpZW50U2hhcmVkSGVhcFNpemVCeXRlcworICAgICAgICAgICAgICAgICAgICA6IDMyICoga01pbmltdW1DbGllbnRTaGFyZWRIZWFwU2l6ZUJ5dGVzOwogICAgIG1Jc0RldmljZVR5cGVLbm93biA9IHRydWU7CisKKyAgICAvLyBUT0RPOiBDYWNoZSB0aGUgY2xpZW50IHNoYXJlZCBoZWFwIHNpemUgaW4gYSBwZXJzaXN0ZW50IHByb3BlcnR5LgorICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCBhIG5hdGl2ZSBwcm9jZXNzIG9yIEphdmEgc2VydmljZSBvciBhcHAgYWNjZXNzZXMgYXVkaW9zZXJ2ZXIKKyAgICAvLyBhZnRlciBpdCBpcyByZWdpc3RlcmVkIGJ5IHN5c3RlbSBzZXJ2ZXIsIGJ1dCBiZWZvcmUgQXVkaW9TZXJ2aWNlIHVwZGF0ZXMKKyAgICAvLyB0aGUgbWVtb3J5IGluZm8uICBUaGlzIHdvdWxkIG9jY3VyIGltbWVkaWF0ZWx5IGFmdGVyIGJvb3Qgb3IgYW4gYXVkaW9zZXJ2ZXIKKyAgICAvLyBjcmFzaCBhbmQgcmVzdG9yZS4gQmVmb3JlIHVwZGF0ZSBmcm9tIEF1ZGlvU2VydmljZSwgdGhlIGNsaWVudCB3b3VsZCBnZXQgdGhlCisgICAgLy8gbWluaW11bSBoZWFwIHNpemUuCisKKyAgICBBTE9HRCgiaXNMb3dSYW1EZXZpY2U6JXMgdG90YWxNZW1vcnk6JWxsZCBtQ2xpZW50U2hhcmVkSGVhcFNpemU6JXp1IiwKKyAgICAgICAgICAgIChpc0xvd1JhbURldmljZSA/ICJ0cnVlIiA6ICJmYWxzZSIpLAorICAgICAgICAgICAgKGxvbmcgbG9uZyltVG90YWxNZW1vcnksCisgICAgICAgICAgICBtQ2xpZW50U2hhcmVkSGVhcFNpemUubG9hZCgpKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK3NpemVfdCBBdWRpb0ZsaW5nZXI6OmdldENsaWVudFNoYXJlZEhlYXBTaXplKCkgY29uc3QKK3sKKyAgICBzaXplX3QgaGVhcFNpemVJbkJ5dGVzID0gcHJvcGVydHlfZ2V0X2ludDMyKCJyby5hZi5jbGllbnRfaGVhcF9zaXplX2tieXRlIiwgMCkgKiAxMDI0OworICAgIGlmIChoZWFwU2l6ZUluQnl0ZXMgIT0gMCkgeyAvLyByZWFkLW9ubHkgcHJvcGVydHkgb3ZlcnJpZGVzIGFsbC4KKyAgICAgICAgcmV0dXJuIGhlYXBTaXplSW5CeXRlczsKKyAgICB9CisgICAgcmV0dXJuIG1DbGllbnRTaGFyZWRIZWFwU2l6ZTsKK30KKwogYXVkaW9faHdfc3luY190IEF1ZGlvRmxpbmdlcjo6Z2V0QXVkaW9Id1N5bmNGb3JTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTE5MDAsNiArMjAwNCwxNCBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcykKK3sKKyAgICBBdXRvTXV0ZXggbG9jayhtSGFyZHdhcmVMb2NrKTsKKyAgICBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+IGRldiA9IG1QcmltYXJ5SGFyZHdhcmVEZXYtPmh3RGV2aWNlKCk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGV2LT5nZXRNaWNyb3Bob25lcyhtaWNyb3Bob25lcyk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwogLy8gc2V0QXVkaW9Id1N5bmNGb3JTZXNzaW9uX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIEF1ZGlvRmxpbmdlcjo6bUxvY2sgaGVsZAogdm9pZCBBdWRpb0ZsaW5nZXI6OnNldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbl9sKFBsYXliYWNrVGhyZWFkICp0aHJlYWQsIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpCiB7CkBAIC0yMDE0LDggKzIxMjYsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpsYXRlbmN5TXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpCiB7Ci0gICAgQUxPR0koIm9wZW5PdXRwdXQoKSB0aGlzICVwLCBtb2R1bGUgJWQgRGV2aWNlICV4LCBTYW1wbGluZ1JhdGUgJWQsIEZvcm1hdCAlIzA4eCwgQ2hhbm5lbHMgJXgsICIKLSAgICAgICAgICAgICAgImZsYWdzICV4IiwKKyAgICBBTE9HSSgib3Blbk91dHB1dCgpIHRoaXMgJXAsIG1vZHVsZSAlZCBEZXZpY2UgJSN4LCBTYW1wbGluZ1JhdGUgJWQsIEZvcm1hdCAlIzA4eCwgIgorICAgICAgICAgICAgICAiQ2hhbm5lbHMgJSN4LCBmbGFncyAlI3giLAogICAgICAgICAgICAgICB0aGlzLCBtb2R1bGUsCiAgICAgICAgICAgICAgIChkZXZpY2VzICE9IE5VTEwpID8gKmRldmljZXMgOiAwLAogICAgICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLApAQCAtMjI1Nyw4ICsyMzY5LDggQEAKICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gaW5TdHJlYW07CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5Id0hhbC0+b3BlbklucHV0U3RyZWFtKAogICAgICAgICAgICAgKmlucHV0LCBkZXZpY2VzLCAmaGFsY29uZmlnLCBmbGFncywgYWRkcmVzcy5zdHJpbmcoKSwgc291cmNlLCAmaW5TdHJlYW0pOwotICAgIEFMT0dWKCJvcGVuSW5wdXRfbCgpIG9wZW5JbnB1dFN0cmVhbSByZXR1cm5lZCBpbnB1dCAlcCwgZGV2aWNlcyAleCwgU2FtcGxpbmdSYXRlICVkIgotICAgICAgICAgICAiLCBGb3JtYXQgJSN4LCBDaGFubmVscyAleCwgZmxhZ3MgJSN4LCBzdGF0dXMgJWQgYWRkciAlcyIsCisgICAgQUxPR1YoIm9wZW5JbnB1dF9sKCkgb3BlbklucHV0U3RyZWFtIHJldHVybmVkIGlucHV0ICVwLCBkZXZpY2VzICUjeCwgU2FtcGxpbmdSYXRlICVkIgorICAgICAgICAgICAiLCBGb3JtYXQgJSN4LCBDaGFubmVscyAlI3gsIGZsYWdzICUjeCwgc3RhdHVzICVkIGFkZHIgJXMiLAogICAgICAgICAgICAgaW5TdHJlYW0uZ2V0KCksCiAgICAgICAgICAgICBkZXZpY2VzLAogICAgICAgICAgICAgaGFsY29uZmlnLnNhbXBsZV9yYXRlLApAQCAtMjU2OSw2ICsyNjgxLDcgQEAKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBsYXliYWNrVGhyZWFkcy5zaXplKCk7IGkrKykgewogICAgICAgICBzcDxQbGF5YmFja1RocmVhZD4gdCA9IG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKTsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHQtPm1Mb2NrKTsKICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCB0LT5tRWZmZWN0Q2hhaW5zLnNpemUoKTsgaisrKSB7CiAgICAgICAgICAgICBzcDxFZmZlY3RDaGFpbj4gZWMgPSB0LT5tRWZmZWN0Q2hhaW5zW2pdOwogICAgICAgICAgICAgaWYgKGVjLT5zZXNzaW9uSWQoKSA+IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCkgewpAQCAtMjU3OCw2ICsyNjkxLDcgQEAKICAgICB9CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUmVjb3JkVGhyZWFkcy5zaXplKCk7IGkrKykgewogICAgICAgICBzcDxSZWNvcmRUaHJlYWQ+IHQgPSBtUmVjb3JkVGhyZWFkcy52YWx1ZUF0KGkpOworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodC0+bUxvY2spOwogICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHQtPm1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBqKyspIHsKICAgICAgICAgICAgIHNwPEVmZmVjdENoYWluPiBlYyA9IHQtPm1FZmZlY3RDaGFpbnNbal07CiAgICAgICAgICAgICBjaGFpbnMucHVzaChlYyk7CkBAIC0yOTUyLDYgKzMwNjYsNyBAQAogCiAgICAgICAgIC8vIGNoZWNrIHJlY29yZGluZyBwZXJtaXNzaW9uIGZvciB2aXN1YWxpemVyCiAgICAgICAgIGlmICgobWVtY21wKCZkZXNjLnR5cGUsIFNMX0lJRF9WSVNVQUxJWkFUSU9OLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApICYmCisgICAgICAgICAgICAvLyBUT0RPOiBEbyB3ZSBuZWVkIHRvIHN0YXJ0L3N0b3Agb3AgLSBpLmUuIGlzIHRoZXJlIHJlY29yZGluZyBiZWluZyBwZXJmb3JtZWQ/CiAgICAgICAgICAgICAhcmVjb3JkaW5nQWxsb3dlZChvcFBhY2thZ2VOYW1lLCBwaWQsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkpIHsKICAgICAgICAgICAgIGxTdGF0dXMgPSBQRVJNSVNTSU9OX0RFTklFRDsKICAgICAgICAgICAgIGdvdG8gRXhpdDsKQEAgLTMwMzksMTYgKzMxNTQsMjEgQEAKICAgICAgICAgYm9vbCBwaW5uZWQgPSAoc2Vzc2lvbklkID4gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKSAmJiBpc1Nlc3Npb25BY3F1aXJlZF9sKHNlc3Npb25JZCk7CiAgICAgICAgIGhhbmRsZSA9IHRocmVhZC0+Y3JlYXRlRWZmZWN0X2woY2xpZW50LCBlZmZlY3RDbGllbnQsIHByaW9yaXR5LCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgJmRlc2MsIGVuYWJsZWQsICZsU3RhdHVzLCBwaW5uZWQpOwotICAgICAgICBpZiAoaGFuZGxlICE9IDAgJiYgaWQgIT0gTlVMTCkgewotICAgICAgICAgICAgKmlkID0gaGFuZGxlLT5pZCgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChoYW5kbGUgPT0gMCkgeworICAgICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUiAmJiBsU3RhdHVzICE9IEFMUkVBRFlfRVhJU1RTKSB7CiAgICAgICAgICAgICAvLyByZW1vdmUgbG9jYWwgc3Ryb25nIHJlZmVyZW5jZSB0byBDbGllbnQgd2l0aCBtQ2xpZW50TG9jayBoZWxkCiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2NsKG1DbGllbnRMb2NrKTsKICAgICAgICAgICAgIGNsaWVudC5jbGVhcigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gaGFuZGxlIG11c3QgYmUgdmFsaWQgaGVyZSwgYnV0IGNoZWNrIGFnYWluIHRvIGJlIHNhZmUuCisgICAgICAgICAgICBpZiAoaGFuZGxlLmdldCgpICE9IG51bGxwdHIgJiYgaWQgIT0gbnVsbHB0cikgKmlkID0gaGFuZGxlLT5pZCgpOwogICAgICAgICB9CiAgICAgfQogCisgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IgJiYgbFN0YXR1cyAhPSBBTFJFQURZX0VYSVNUUykgeworICAgICAgICAvLyBoYW5kbGUgbXVzdCBiZSBjbGVhcmVkIG91dHNpZGUgbG9jay4KKyAgICAgICAgaGFuZGxlLmNsZWFyKCk7CisgICAgfQorCiBFeGl0OgogICAgICpzdGF0dXMgPSBsU3RhdHVzOwogICAgIHJldHVybiBoYW5kbGU7CkBAIC0zMjcwLDggKzMzOTAsNyBAQAogICAgICAgICAvLyBUaGV5IHdvdWxkIGJvdGggdHJhdmVyc2UgdGhlIGRpcmVjdG9yeSwgYnV0IHRoZSByZXN1bHQgd291bGQgc2ltcGx5IGJlCiAgICAgICAgIC8vIGZhaWx1cmVzIGF0IHVubGluaygpIHdoaWNoIGFyZSBpZ25vcmVkLiAgSXQncyBhbHNvIHVubGlrZWx5IHNpbmNlCiAgICAgICAgIC8vIG5vcm1hbGx5IGR1bXBzeXMgaXMgb25seSBkb25lIGJ5IGJ1Z3JlcG9ydCBvciBmcm9tIHRoZSBjb21tYW5kIGxpbmUuCi0gICAgICAgIGNoYXIgdGVlUGF0aFszMisyNTZdOwotICAgICAgICBzdHJjcHkodGVlUGF0aCwgIi9kYXRhL21pc2MvYXVkaW9zZXJ2ZXIiKTsKKyAgICAgICAgY2hhciB0ZWVQYXRoW1BBVEhfTUFYXSA9ICIvZGF0YS9taXNjL2F1ZGlvc2VydmVyIjsKICAgICAgICAgc2l6ZV90IHRlZVBhdGhMZW4gPSBzdHJsZW4odGVlUGF0aCk7CiAgICAgICAgIERJUiAqZGlyID0gb3BlbmRpcih0ZWVQYXRoKTsKICAgICAgICAgdGVlUGF0aFt0ZWVQYXRoTGVuKytdID0gJy8nOwpAQCAtMzI4MSwyNyArMzQwMCwxOSBAQAogICAgICAgICAgICAgc3RydWN0IEVudHJ5IGVudHJpZXNbVEVFX01BWF9TT1JUXTsKICAgICAgICAgICAgIHNpemVfdCBlbnRyeUNvdW50ID0gMDsKICAgICAgICAgICAgIHdoaWxlIChlbnRyeUNvdW50IDwgVEVFX01BWF9TT1JUKSB7Ci0gICAgICAgICAgICAgICAgc3RydWN0IGRpcmVudCBkZTsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgZGlyZW50ICpyZXN1bHQgPSBOVUxMOwotICAgICAgICAgICAgICAgIGludCByYyA9IHJlYWRkaXJfcihkaXIsICZkZSwgJnJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJjICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coInJlYWRkaXJfciBmYWlsZWQgJWQiLCByYyk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gJmRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJyZWFkZGlyX3IgcmV0dXJuZWQgdW5leHBlY3RlZCByZXN1bHQgJXAgIT0gJXAiLCByZXN1bHQsICZkZSk7CisgICAgICAgICAgICAgICAgZXJybm8gPSAwOyAvLyBjbGVhciBlcnJubyBiZWZvcmUgcmVhZGRpcigpIHRvIHRyYWNrIHBvdGVudGlhbCBlcnJvcnMuCisgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGRpcmVudCAqcmVzdWx0ID0gcmVhZGRpcihkaXIpOworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBBTE9HV19JRihlcnJubyAhPSAwLCAidGVlIHJlYWRkaXIoKSBmYWlsdXJlICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBub24gLndhdiBmaWxlIGVudHJpZXMKLSAgICAgICAgICAgICAgICBzaXplX3QgbmFtZUxlbiA9IHN0cmxlbihkZS5kX25hbWUpOworICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBuYW1lTGVuID0gc3RybGVuKHJlc3VsdC0+ZF9uYW1lKTsKICAgICAgICAgICAgICAgICBpZiAobmFtZUxlbiA8PSA0IHx8IG5hbWVMZW4gPj0gVEVFX01BWF9GSUxFTkFNRSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyY21wKCZkZS5kX25hbWVbbmFtZUxlbiAtIDRdLCAiLndhdiIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJjbXAoJnJlc3VsdC0+ZF9uYW1lW25hbWVMZW4gLSA0XSwgIi53YXYiKSkgewogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3RyY3B5KGVudHJpZXNbZW50cnlDb3VudCsrXS5tRmlsZU5hbWUsIGRlLmRfbmFtZSk7CisgICAgICAgICAgICAgICAgKHZvaWQpYXVkaW9fdXRpbHNfc3RybGNweShlbnRyaWVzW2VudHJ5Q291bnQrK10ubUZpbGVOYW1lLCByZXN1bHQtPmRfbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAodm9pZCkgY2xvc2VkaXIoZGlyKTsKICAgICAgICAgICAgIGlmIChlbnRyeUNvdW50ID4gVEVFX01BWF9LRUVQKSB7CkBAIC0zMzcyLDggKzM0ODMsMTMgQEAKICAgICAgICAgICAgIC8vIEZJWE1FIG5vdCBiaWctZW5kaWFuIHNhZmUKICAgICAgICAgICAgIHdyaXRlKHRlZUZkLCAmdGVtcCwgc2l6ZW9mKHRlbXApKTsKICAgICAgICAgICAgIGNsb3NlKHRlZUZkKTsKLSAgICAgICAgICAgIGlmIChmZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgZHByaW50ZihmZCwgInRlZSBjb3BpZWQgdG8gJXNcbiIsIHRlZVBhdGgpOworICAgICAgICAgICAgLy8gVE9ETyBTaG91bGQgY3JlYXRlIGZpbGUgd2l0aCB0ZW1wb3JhcnkgbmFtZSBhbmQgdGhlbiByZW5hbWUgdG8gZmluYWwgaWYgbm9uLWVtcHR5LgorICAgICAgICAgICAgaWYgKHRvdGFsID4gMCkgeworICAgICAgICAgICAgICAgIGlmIChmZCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGRwcmludGYoZmQsICJ0ZWUgY29waWVkIHRvICVzXG4iLCB0ZWVQYXRoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHVubGluayh0ZWVQYXRoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChmZCA+PSAwKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmgKaW5kZXggNjM4OThhMC4uOTYzYTg3ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaApAQCAtMTksMjcgKzE5LDI5IEBACiAjZGVmaW5lIEFORFJPSURfQVVESU9fRkxJTkdFUl9ICiAKICNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPG11dGV4PgogI2luY2x1ZGUgPGRlcXVlPgogI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8bGltaXRzLmg+CiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+CiAKKyNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KIAogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb0ZsaW5nZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9JQXVkaW9GbGluZ2VyQ2xpZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvVHJhY2suaD4KLSNpbmNsdWRlIDxtZWRpYS9JQXVkaW9SZWNvcmQuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9NbWFwU3RyZWFtSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTW1hcFN0cmVhbUNhbGxiYWNrLmg+CiAKLSNpbmNsdWRlIDx1dGlscy9BdG9taWMuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+CkBAIC03MiwxMCArNzQsMTIgQEAKIAogI2luY2x1ZGUgPHBvd2VybWFuYWdlci9JUG93ZXJNYW5hZ2VyLmg+CiAKLSNpbmNsdWRlIDxtZWRpYS9uYmFpby9OQkxvZy5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL05CTG9nLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9BdWRpb0VmZmVjdFNoYXJlZC5oPgogI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oPgogCisjaW5jbHVkZSAiYW5kcm9pZC9tZWRpYS9CbkF1ZGlvUmVjb3JkLmgiCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgQXVkaW9NaXhlcjsKQEAgLTkzLDEyICs5Nyw2IEBACiAKIHN0YXRpYyBjb25zdCBuc2Vjc190IGtEZWZhdWx0U3RhbmRieVRpbWVJbk5zZWNzID0gc2Vjb25kcygzKTsKIAotCi0vLyBNYXggc2hhcmVkIG1lbW9yeSBzaXplIGZvciBhdWRpbyB0cmFja3MgYW5kIGF1ZGlvIHJlY29yZHMgcGVyIGNsaWVudCBwcm9jZXNzCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGtDbGllbnRTaGFyZWRIZWFwU2l6ZUJ5dGVzID0gMTAyNCoxMDI0OwotLy8gU2hhcmVkIG1lbW9yeSBzaXplIG11bHRpcGxpZXIgZm9yIG5vbiBsb3cgcmFtIGRldmljZXMKLXN0YXRpYyBjb25zdCBzaXplX3Qga0NsaWVudFNoYXJlZEhlYXBTaXplTXVsdGlwbGllciA9IDQ7Ci0KICNkZWZpbmUgSU5DTFVESU5HX0ZST01fQVVESU9GTElOR0VSX0gKIAogY2xhc3MgQXVkaW9GbGluZ2VyIDoKQEAgLTExMywzOSArMTExLDEzIEBACiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCiAgICAgLy8gSUF1ZGlvRmxpbmdlciBpbnRlcmZhY2UsIGluIGJpbmRlciBvcGNvZGUgb3JkZXIKLSAgICB2aXJ0dWFsIHNwPElBdWRpb1RyYWNrPiBjcmVhdGVUcmFjaygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnBGcmFtZUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCAqZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCB0aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpZW50VWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzIC8qbm9uLU5VTEwqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworICAgIHZpcnR1YWwgc3A8SUF1ZGlvVHJhY2s+IGNyZWF0ZVRyYWNrKGNvbnN0IENyZWF0ZVRyYWNrSW5wdXQmIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZVRyYWNrT3V0cHV0JiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cyk7CiAKLSAgICB2aXJ0dWFsIHNwPElBdWRpb1JlY29yZD4gb3BlblJlY29yZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnBGcmFtZUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190ICpmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCB0aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGllbnRVaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKm5vdGlmaWNhdGlvbkZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SU1lbW9yeT4mIGNibGssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElNZW1vcnk+JiBidWZmZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzIC8qbm9uLU5VTEwqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworICAgIHZpcnR1YWwgc3A8bWVkaWE6OklBdWRpb1JlY29yZD4gY3JlYXRlUmVjb3JkKGNvbnN0IENyZWF0ZVJlY29yZElucHV0JiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVSZWNvcmRPdXRwdXQmIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKTsKIAogICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIHNhbXBsZVJhdGUoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpIGNvbnN0OwogICAgIHZpcnR1YWwgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIGNvbnN0OwpAQCAtMTcyLDYgKzE0NCw4IEBACiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgc2V0TWljTXV0ZShib29sIHN0YXRlKTsKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBnZXRNaWNNdXRlKCkgY29uc3Q7CiAKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBzZXRSZWNvcmRTaWxlbmNlZCh1aWRfdCB1aWQsIGJvb2wgc2lsZW5jZWQpOworCiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgc2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycyk7CiAgICAgdmlydHVhbCAgICAgU3RyaW5nOCAgICAgZ2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5cykgY29uc3Q7CiAKQEAgLTI1MCw3ICsyMjQsNyBAQAogICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0UHJpbWFyeU91dHB1dFNhbXBsaW5nUmF0ZSgpOwogICAgIHZpcnR1YWwgc2l6ZV90IGdldFByaW1hcnlPdXRwdXRGcmFtZUNvdW50KCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldExvd1JhbURldmljZShib29sIGlzTG93UmFtRGV2aWNlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldExvd1JhbURldmljZShib29sIGlzTG93UmFtRGV2aWNlLCBpbnQ2NF90IHRvdGFsTWVtb3J5KSBvdmVycmlkZTsKIAogICAgIC8qIExpc3QgYXZhaWxhYmxlIGF1ZGlvIHBvcnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyh1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKQEAgLTI3OSw2ICsyNTMsOCBAQAogICAgIC8qIEluZGljYXRlIEpBVkEgc2VydmljZXMgYXJlIHJlYWR5IChzY2hlZHVsaW5nLCBwb3dlciBtYW5hZ2VtZW50IC4uLikgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IHN5c3RlbVJlYWR5KCk7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKTsKKwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKQEAgLTI5Niw2ICsyNzIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0NsaWVudCYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmRldmljZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPE1tYXBTdHJlYW1DYWxsYmFjaz4mIGNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPE1tYXBTdHJlYW1JbnRlcmZhY2U+JiBpbnRlcmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqaGFuZGxlKTsKQEAgLTUzNyw2ICs1MTQsMTMgQEAKICAgICB9OwogCiAgICAgLy8gLS0tIFBsYXliYWNrVGhyZWFkIC0tLQorI2lmZGVmIEZMT0FUX0VGRkVDVF9DSEFJTgorI2RlZmluZSBFRkZFQ1RfQlVGRkVSX0ZPUk1BVCBBVURJT19GT1JNQVRfUENNX0ZMT0FUCit1c2luZyBlZmZlY3RfYnVmZmVyX3QgPSBmbG9hdDsKKyNlbHNlCisjZGVmaW5lIEVGRkVDVF9CVUZGRVJfRk9STUFUIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUCit1c2luZyBlZmZlY3RfYnVmZmVyX3QgPSBpbnQxNl90OworI2VuZGlmCiAKICNpbmNsdWRlICJUaHJlYWRzLmgiCiAKQEAgLTU1NiwxMCArNTQwLDEwIEBACiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgcGF1c2UoKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBhdHRhY2hBdXhFZmZlY3QoaW50IGVmZmVjdElkKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpOwotICAgICAgICB2aXJ0dWFsIFZvbHVtZVNoYXBlcjo6U3RhdHVzIGFwcGx5Vm9sdW1lU2hhcGVyKAotICAgICAgICAgICAgICAgIGNvbnN0IHNwPFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4mIGNvbmZpZ3VyYXRpb24sCi0gICAgICAgICAgICAgICAgY29uc3Qgc3A8Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+JiBvcGVyYXRpb24pIG92ZXJyaWRlOwotICAgICAgICB2aXJ0dWFsIHNwPFZvbHVtZVNoYXBlcjo6U3RhdGU+IGdldFZvbHVtZVNoYXBlclN0YXRlKGludCBpZCkgb3ZlcnJpZGU7CisgICAgICAgIHZpcnR1YWwgbWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdHVzIGFwcGx5Vm9sdW1lU2hhcGVyKAorICAgICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24+JiBjb25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4mIG9wZXJhdGlvbikgb3ZlcnJpZGU7CisgICAgICAgIHZpcnR1YWwgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdGU+IGdldFZvbHVtZVNoYXBlclN0YXRlKGludCBpZCkgb3ZlcnJpZGU7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wJiB0aW1lc3RhbXApOwogICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHNpZ25hbCgpOyAvLyBzaWduYWwgcGxheWJhY2sgdGhyZWFkIGZvciBhIGNoYW5nZSBpbiBjb250cm9sIGJsb2NrCiAKQEAgLTU3MSwxNSArNTU1LDE1IEBACiAgICAgfTsKIAogICAgIC8vIHNlcnZlciBzaWRlIG9mIHRoZSBjbGllbnQncyBJQXVkaW9SZWNvcmQKLSAgICBjbGFzcyBSZWNvcmRIYW5kbGUgOiBwdWJsaWMgYW5kcm9pZDo6Qm5BdWRpb1JlY29yZCB7CisgICAgY2xhc3MgUmVjb3JkSGFuZGxlIDogcHVibGljIGFuZHJvaWQ6Om1lZGlhOjpCbkF1ZGlvUmVjb3JkIHsKICAgICBwdWJsaWM6CiAgICAgICAgIGV4cGxpY2l0IFJlY29yZEhhbmRsZShjb25zdCBzcDxSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrPiYgcmVjb3JkVHJhY2spOwogICAgICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5SZWNvcmRIYW5kbGUoKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydChpbnQgLypBdWRpb1N5c3RlbTo6c3luY19ldmVudF90Ki8gZXZlbnQsCi0gICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHRyaWdnZXJTZXNzaW9uKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICBzdG9wKCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25UcmFuc2FjdCgKLSAgICAgICAgICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpOworICAgICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgIHN0YXJ0KGludCAvKkF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QqLyBldmVudCwKKyAgICAgICAgICAgICAgICBpbnQgLyphdWRpb19zZXNzaW9uX3QqLyB0cmlnZ2VyU2Vzc2lvbik7CisgICAgICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgICBzdG9wKCk7CisgICAgICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgICBnZXRBY3RpdmVNaWNyb3Bob25lcygKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBhY3RpdmVNaWNyb3Bob25lcyk7CiAgICAgcHJpdmF0ZToKICAgICAgICAgY29uc3Qgc3A8UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjaz4gbVJlY29yZFRyYWNrOwogCkBAIC02MzUsOSArNjE5LDYgQEAKICAgICAgICAgICAgICAgLy8gbm8gcmFuZ2UgY2hlY2ssIEF1ZGlvRmxpbmdlcjo6bUxvY2sgaGVsZAogICAgICAgICAgICAgICBib29sIHN0cmVhbU11dGVfbChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gbVN0cmVhbVR5cGVzW3N0cmVhbV0ubXV0ZTsgfQotICAgICAgICAgICAgICAvLyBubyByYW5nZSBjaGVjaywgZG9lc24ndCBjaGVjayBwZXItdGhyZWFkIHN0cmVhbSB2b2x1bWUsIEF1ZGlvRmxpbmdlcjo6bUxvY2sgaGVsZAotICAgICAgICAgICAgICBmbG9hdCBzdHJlYW1Wb2x1bWVfbChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gbVN0cmVhbVR5cGVzW3N0cmVhbV0udm9sdW1lOyB9CiAgICAgICAgICAgICAgIHZvaWQgaW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+JiBpb0Rlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCA9IDApOwpAQCAtODE3LDYgKzc5OCw4IEBACiAKICAgICBzdGF0dXNfdCAgICBjaGVja1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0OwogCisgICAgdm9pZCAgICAgICAgZmlsdGVyUmVzZXJ2ZWRQYXJhbWV0ZXJzKFN0cmluZzgmIGtleVZhbHVlUGFpcnMsIHVpZF90IGNhbGxpbmdVaWQpOworCiAjaWZkZWYgVEVFX1NJTksKICAgICAvLyBhbGwgcmVjb3JkIHRocmVhZHMgc2VyaWFsbHkgc2hhcmUgYSBjb21tb24gdGVlIHNpbmssIHdoaWNoIGlzIHJlLWNyZWF0ZWQgb24gZm9ybWF0IGNoYW5nZQogICAgIHNwPE5CQUlPX1Npbms+ICAgbVJlY29yZFRlZVNpbms7CkBAIC04NDYsMTUgKzgyOSwxOCBAQAogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1RlZVNpbmtUcmFja0ZyYW1lc0RlZmF1bHQgPSAweDIwMDAwMDsKICNlbmRpZgogCi0gICAgLy8gVGhpcyBtZXRob2QgcmVhZHMgZnJvbSBhIHZhcmlhYmxlIHdpdGhvdXQgbUxvY2ssIGJ1dCB0aGUgdmFyaWFibGUgaXMgdXBkYXRlZCB1bmRlciBtTG9jay4gIFNvCi0gICAgLy8gd2UgbWlnaHQgcmVhZCBhIHN0YWxlIHZhbHVlLCBvciBhIHZhbHVlIHRoYXQncyBpbmNvbnNpc3RlbnQgd2l0aCByZXNwZWN0IHRvIG90aGVyIHZhcmlhYmxlcy4KLSAgICAvLyBJbiB0aGlzIGNhc2UsIGl0J3Mgc2FmZSBiZWNhdXNlIHRoZSByZXR1cm4gdmFsdWUgaXNuJ3QgdXNlZCBmb3IgbWFraW5nIGFuIGltcG9ydGFudCBkZWNpc2lvbi4KLSAgICAvLyBUaGUgcmVhc29uIHdlIGRvbid0IHdhbnQgdG8gdGFrZSBtTG9jayBpcyBiZWNhdXNlIGl0IGNvdWxkIGJsb2NrIHRoZSBjYWxsZXIgZm9yIGEgbG9uZyB0aW1lLgorICAgIC8vIFRoZXNlIG1ldGhvZHMgcmVhZCB2YXJpYWJsZXMgYXRvbWljYWxseSB3aXRob3V0IG1Mb2NrLAorICAgIC8vIHRob3VnaCB0aGUgdmFyaWFibGVzIGFyZSB1cGRhdGVkIHdpdGggbUxvY2suCiAgICAgYm9vbCAgICBpc0xvd1JhbURldmljZSgpIGNvbnN0IHsgcmV0dXJuIG1Jc0xvd1JhbURldmljZTsgfQorICAgIHNpemVfdCBnZXRDbGllbnRTaGFyZWRIZWFwU2l6ZSgpIGNvbnN0OwogCiBwcml2YXRlOgotICAgIGJvb2wgICAgbUlzTG93UmFtRGV2aWNlOworICAgIHN0ZDo6YXRvbWljPGJvb2w+IG1Jc0xvd1JhbURldmljZTsKICAgICBib29sICAgIG1Jc0RldmljZVR5cGVLbm93bjsKKyAgICBpbnQ2NF90IG1Ub3RhbE1lbW9yeTsKKyAgICBzdGQ6OmF0b21pYzxzaXplX3Q+IG1DbGllbnRTaGFyZWRIZWFwU2l6ZTsKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWluaW11bUNsaWVudFNoYXJlZEhlYXBTaXplQnl0ZXMgPSAxMDI0ICogMTAyNDsgLy8gMU1CCisKICAgICBuc2Vjc190IG1HbG9iYWxFZmZlY3RFbmFibGVUaW1lOyAgLy8gd2hlbiBhIGdsb2JhbCBlZmZlY3Qgd2FzIGxhc3QgZW5hYmxlZAogCiAgICAgc3A8UGF0Y2hQYW5lbD4gbVBhdGNoUGFuZWw7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQnVmTG9nLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9CdWZMb2cuY3BwCmluZGV4IDk2ODBlYjUuLmFlOTYwMzYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9CdWZMb2cuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9CdWZMb2cuY3BwCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8cHRocmVhZC5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvc3RyaW5nLmg+CiAKICNkZWZpbmUgTUlOKGEsIGIpICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCiAKQEAgLTExNywxMSArMTE4LDExIEBACiAgICAgbUJ5dGVDb3VudCA9IDBsOwogICAgIG1QYXVzZWQgPSBmYWxzZTsKICAgICBpZiAodGFnICE9IE5VTEwpIHsKLSAgICAgICAgc3RybmNweShtVGFnLCB0YWcsIEJVRkxPR1NUUkVBTV9NQVhfVEFHU0laRSk7CisgICAgICAgICh2b2lkKWF1ZGlvX3V0aWxzX3N0cmxjcHkobVRhZywgdGFnKTsKICAgICB9IGVsc2UgewogICAgICAgICBtVGFnWzBdID0gMDsKICAgICB9Ci0gICAgQUxPR1YoIkNyZWF0aW5nIEJ1ZkxvZ1N0cmVhbSBpZDolZCB0YWc6JXMgZm9ybWF0OiVkIGNoOiVkIHNyOiVkIG1heGJ5dGVzOiV6dSIsIG1JZCwgbVRhZywKKyAgICBBTE9HVigiQ3JlYXRpbmcgQnVmTG9nU3RyZWFtIGlkOiVkIHRhZzolcyBmb3JtYXQ6JSN4IGNoOiVkIHNyOiVkIG1heGJ5dGVzOiV6dSIsIG1JZCwgbVRhZywKICAgICAgICAgICAgIG1Gb3JtYXQsIG1DaGFubmVscywgbVNhbXBsaW5nUmF0ZSwgbU1heEJ5dGVzKTsKIAogICAgIC8vb3BlbiBmaWxlIChzKSwgaW5mbyBhYm91dCB0YWcsIGZvcm1hdCwgZXRjLgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0NvbmZpZ3VyYXRpb24uaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9Db25maWd1cmF0aW9uLmgKaW5kZXggODQ1Njk3YS4uZWRlOGUzZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0NvbmZpZ3VyYXRpb24uaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQ29uZmlndXJhdGlvbi5oCkBAIC00MSw0ICs0MSwxNSBAQAogLy8gdW5jb21tZW50IHRvIGxvZyBDUFUgc3RhdGlzdGljcyBldmVyeSBuIHdhbGwgY2xvY2sgc2Vjb25kcwogLy8jZGVmaW5lIERFQlVHX0NQVV9VU0FHRSAxMAogCisvLyBkZWZpbmUgRkxPQVRfRUZGRUNUX0NIQUlOIHRvIHJlcXVlc3QgZmxvYXQgZWZmZWN0cyAoZmFsbHMgYmFjayB0byBpbnQxNl90IGlmIHVuYXZhaWxhYmxlKQorI2RlZmluZSBGTE9BVF9FRkZFQ1RfQ0hBSU4KKworI2lmZGVmIEZMT0FUX0VGRkVDVF9DSEFJTgorLy8gZGVmaW5lIEZMT0FUX0FVWCB0byBwcm9jZXNzIGF1eCBlZmZlY3QgYnVmZmVycyBpbiBmbG9hdCAoRkxPQVRfRUZGRUNUX0NIQUlOIG11c3QgYmUgZGVmaW5lZCkKKyNkZWZpbmUgRkxPQVRfQVVYCisKKy8vIGRlZmluZSBNVUxUSUNIQU5ORUxfRUZGRUNUX0NIQUlOIHRvIGFsbG93IG11bHRpY2hhbm5lbCBlZmZlY3RzIChGTE9BVF9FRkZFQ1RfQ0hBSU4gZGVmaW5lZCkKKyNkZWZpbmUgTVVMVElDSEFOTkVMX0VGRkVDVF9DSEFJTgorI2VuZGlmCisKICNlbmRpZiAvLyBBTkRST0lEX0FVRElPRkxJTkdFUl9DT05GSUdVUkFUSU9OX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmNwcAppbmRleCBiZDVmMTQ2Li4yMDQ3ZGZkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwCkBAIC0xOSwxMSArMTksMTQgQEAKICNkZWZpbmUgTE9HX1RBRyAiQXVkaW9GbGluZ2VyIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCiAjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3RzL2VmZmVjdF9hZWMuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9lZmZlY3RfbnMuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9lZmZlY3RfdmlzdWFsaXplci5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2NoYW5uZWxzLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmg+CkBAIC00Nyw4ICs1MCw2IEBACiAjZGVmaW5lIEFMT0dWVihhLi4uKSBkbyB7IH0gd2hpbGUoMCkKICNlbmRpZgogCi0jZGVmaW5lIG1pbihhLCBiKSAoKGEpIDwgKGIpID8gKGEpIDogKGIpKQotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTY3LDEyICs2OCwxOSBAQAogICAgIDogbVBpbm5lZChwaW5uZWQpLAogICAgICAgbVRocmVhZCh0aHJlYWQpLCBtQ2hhaW4oY2hhaW4pLCBtSWQoaWQpLCBtU2Vzc2lvbklkKHNlc3Npb25JZCksCiAgICAgICBtRGVzY3JpcHRvcigqZGVzYyksCi0gICAgICAvLyBtQ29uZmlnIGlzIHNldCBieSBjb25maWd1cmUoKSBhbmQgbm90IHVzZWQgYmVmb3JlIHRoZW4KKyAgICAgIC8vIGNsZWFyIG1Db25maWcgdG8gZW5zdXJlIGNvbnNpc3RlbnQgaW5pdGlhbCB2YWx1ZSBvZiBidWZmZXIgZnJhbWVjb3VudAorICAgICAgLy8gaW4gY2FzZSBidWZmZXJzIGFyZSBhc3NvY2lhdGVkIGJ5IHNldEluQnVmZmVyKCkgb3Igc2V0T3V0QnVmZmVyKCkKKyAgICAgIC8vIHByaW9yIHRvIGNvbmZpZ3VyZSgpLgorICAgICAgbUNvbmZpZ3t7fSwge319LAogICAgICAgbVN0YXR1cyhOT19JTklUKSwgbVN0YXRlKElETEUpLAotICAgICAgLy8gbU1heERpc2FibGVXYWl0Q250IGlzIHNldCBieSBjb25maWd1cmUoKSBhbmQgbm90IHVzZWQgYmVmb3JlIHRoZW4KLSAgICAgIC8vIG1EaXNhYmxlV2FpdENudCBpcyBzZXQgYnkgcHJvY2VzcygpIGFuZCB1cGRhdGVTdGF0ZSgpIGFuZCBub3QgdXNlZCBiZWZvcmUgdGhlbgorICAgICAgbU1heERpc2FibGVXYWl0Q250KDEpLCAvLyBzZXQgYnkgY29uZmlndXJlKCksIHNob3VsZCBiZSA+PSAxCisgICAgICBtRGlzYWJsZVdhaXRDbnQoMCksICAgIC8vIHNldCBieSBwcm9jZXNzKCkgYW5kIHVwZGF0ZVN0YXRlKCkKICAgICAgIG1TdXNwZW5kZWQoZmFsc2UpLAorICAgICAgbU9mZmxvYWRlZChmYWxzZSksCiAgICAgICBtQXVkaW9GbGluZ2VyKHRocmVhZC0+bUF1ZGlvRmxpbmdlcikKKyNpZmRlZiBGTE9BVF9FRkZFQ1RfQ0hBSU4KKyAgICAgICwgbVN1cHBvcnRzRmxvYXQoZmFsc2UpCisjZW5kaWYKIHsKICAgICBBTE9HVigiQ29uc3RydWN0b3IgJXAgcGlubmVkICVkIiwgdGhpcywgcGlubmVkKTsKICAgICBpbnQgbFN0YXR1czsKQEAgLTI4NSw1NiArMjkzLDE5MCBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCisgICAgY29uc3QgdWludDMyX3QgaW5DaGFubmVsQ291bnQgPQorICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1Db25maWcuaW5wdXRDZmcuY2hhbm5lbHMpOworICAgIGNvbnN0IHVpbnQzMl90IG91dENoYW5uZWxDb3VudCA9CisgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobUNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMpOworICAgIGNvbnN0IGJvb2wgYXV4VHlwZSA9CisgICAgICAgICAgICAobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZOworCisgICAgLy8gc2FmZUlucHV0T3V0cHV0U2FtcGxlQ291bnQgaXMgMCBpZiB0aGUgY2hhbm5lbCBjb3VudCBiZXR3ZWVuIGlucHV0IGFuZCBvdXRwdXQKKyAgICAvLyBidWZmZXJzIGRvIG5vdCBtYXRjaC4gVGhpcyBwcmV2ZW50cyBhdXRvbWF0aWMgYWNjdW11bGF0aW9uIG9yIGNvcHlpbmcgYmV0d2VlbiB0aGUKKyAgICAvLyBpbnB1dCBhbmQgb3V0cHV0IGVmZmVjdCBidWZmZXJzIHdpdGhvdXQgYW4gaW50ZXJtZWRpYXJ5IGVmZmVjdCBwcm9jZXNzLgorICAgIC8vIFRPRE86IGNvbnNpZGVyIGltcGxlbWVudGluZyBjaGFubmVsIGNvbnZlcnNpb24uCisgICAgY29uc3Qgc2l6ZV90IHNhZmVJbnB1dE91dHB1dFNhbXBsZUNvdW50ID0KKyAgICAgICAgICAgIGluQ2hhbm5lbENvdW50ICE9IG91dENoYW5uZWxDb3VudCA/IDAKKyAgICAgICAgICAgICAgICAgICAgOiBvdXRDaGFubmVsQ291bnQgKiBzdGQ6Om1pbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50KTsKKyAgICBjb25zdCBhdXRvIGFjY3VtdWxhdGVJbnB1dFRvT3V0cHV0ID0gW3RoaXMsIHNhZmVJbnB1dE91dHB1dFNhbXBsZUNvdW50XSgpIHsKKyNpZmRlZiBGTE9BVF9FRkZFQ1RfQ0hBSU4KKyAgICAgICAgYWNjdW11bGF0ZV9mbG9hdCgKKyAgICAgICAgICAgICAgICBtQ29uZmlnLm91dHB1dENmZy5idWZmZXIuZjMyLAorICAgICAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLmYzMiwKKyAgICAgICAgICAgICAgICBzYWZlSW5wdXRPdXRwdXRTYW1wbGVDb3VudCk7CisjZWxzZQorICAgICAgICBhY2N1bXVsYXRlX2kxNigKKyAgICAgICAgICAgICAgICBtQ29uZmlnLm91dHB1dENmZy5idWZmZXIuczE2LAorICAgICAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLnMxNiwKKyAgICAgICAgICAgICAgICBzYWZlSW5wdXRPdXRwdXRTYW1wbGVDb3VudCk7CisjZW5kaWYKKyAgICB9OworICAgIGNvbnN0IGF1dG8gY29weUlucHV0VG9PdXRwdXQgPSBbdGhpcywgc2FmZUlucHV0T3V0cHV0U2FtcGxlQ291bnRdKCkgeworI2lmZGVmIEZMT0FUX0VGRkVDVF9DSEFJTgorICAgICAgICBtZW1jcHkoCisgICAgICAgICAgICAgICAgbUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLmYzMiwKKyAgICAgICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5mMzIsCisgICAgICAgICAgICAgICAgc2FmZUlucHV0T3V0cHV0U2FtcGxlQ291bnQgKiBzaXplb2YoKm1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5mMzIpKTsKKworI2Vsc2UKKyAgICAgICAgbWVtY3B5KAorICAgICAgICAgICAgICAgIG1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5zMTYsCisgICAgICAgICAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5idWZmZXIuczE2LAorICAgICAgICAgICAgICAgIHNhZmVJbnB1dE91dHB1dFNhbXBsZUNvdW50ICogc2l6ZW9mKCptQ29uZmlnLm91dHB1dENmZy5idWZmZXIuczE2KSk7CisjZW5kaWYKKyAgICB9OworCiAgICAgaWYgKGlzUHJvY2Vzc0VuYWJsZWQoKSkgewotICAgICAgICAvLyBkbyAzMiBiaXQgdG8gMTYgYml0IGNvbnZlcnNpb24gZm9yIGF1eGlsaWFyeSBlZmZlY3QgaW5wdXQgYnVmZmVyCi0gICAgICAgIGlmICgobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZKSB7Ci0gICAgICAgICAgICBkaXRoZXJBbmRDbGFtcChtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5zMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5idWZmZXIuczMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQvMik7Ci0gICAgICAgIH0KICAgICAgICAgaW50IHJldDsKICAgICAgICAgaWYgKGlzUHJvY2Vzc0ltcGxlbWVudGVkKCkpIHsKLSAgICAgICAgICAgIC8vIGRvIHRoZSBhY3R1YWwgcHJvY2Vzc2luZyBpbiB0aGUgZWZmZWN0IGVuZ2luZQotICAgICAgICAgICAgcmV0ID0gbUVmZmVjdEludGVyZmFjZS0+cHJvY2VzcygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLnJhdyAhPSBtQ29uZmlnLm91dHB1dENmZy5idWZmZXIucmF3KSB7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ250ID0gbUNvbmZpZy5pbnB1dENmZy5idWZmZXIuZnJhbWVDb3VudCAqIEZDQ18yOyAgLy9hbHdheXMgc3RlcmVvIGhlcmUKLSAgICAgICAgICAgICAgICBpbnQxNl90ICppbiA9IG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLnMxNjsKLSAgICAgICAgICAgICAgICBpbnQxNl90ICpvdXQgPSBtQ29uZmlnLm91dHB1dENmZy5idWZmZXIuczE2OworICAgICAgICAgICAgaWYgKGF1eFR5cGUpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBvdmVyd3JpdGUgdGhlIGF1eCBpbnB1dCBidWZmZXIgaGVyZSBhbmQgY2xlYXIgYWZ0ZXIgcHJvY2Vzc2luZy4KKyAgICAgICAgICAgICAgICAvLyBhdXggaW5wdXQgaXMgYWx3YXlzIG1vbm8uCisjaWZkZWYgRkxPQVRfRUZGRUNUX0NIQUlOCisgICAgICAgICAgICAgICAgaWYgKG1TdXBwb3J0c0Zsb2F0KSB7CisjaWZuZGVmIEZMT0FUX0FVWAorICAgICAgICAgICAgICAgICAgICAvLyBEbyBpbi1wbGFjZSBmbG9hdCBjb252ZXJzaW9uIGZvciBhdXhpbGlhcnkgZWZmZWN0IGlucHV0IGJ1ZmZlci4KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Fzc2VydChzaXplb2YoZmxvYXQpIDw9IHNpemVvZihpbnQzMl90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4tcGxhY2UgY29udmVyc2lvbiByZXF1aXJlcyBzaXplb2YoZmxvYXQpIDw9IHNpemVvZihpbnQzMl90KSIpOwogCi0gICAgICAgICAgICAgICAgaWYgKG1Db25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZyYW1lQ250OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dFtpXSA9IGNsYW1wMTYoKGludDMyX3Qpb3V0W2ldICsgKGludDMyX3QpaW5baV0pOworICAgICAgICAgICAgICAgICAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9xNF8yNygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5mMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5idWZmZXIuczMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQpOworI2VuZGlmIC8vICFGTE9BVF9BVVgKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyNlbmRpZiAvLyBGTE9BVF9FRkZFQ1RfQ0hBSU4KKyAgICAgICAgICAgICAgICB7CisjaWZkZWYgRkxPQVRfQVVYCisgICAgICAgICAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9mbG9hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5zMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5idWZmZXIuZjMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQpOworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX3E0XzI3KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLnMxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5zMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5idWZmZXIuZnJhbWVDb3VudCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjaWZkZWYgRkxPQVRfRUZGRUNUX0NIQUlOCisgICAgICAgICAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+IGluQnVmZmVyID0gbUluQnVmZmVyOworICAgICAgICAgICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiBvdXRCdWZmZXIgPSBtT3V0QnVmZmVyOworCisgICAgICAgICAgICBpZiAoIWF1eFR5cGUgJiYgbUluQ2hhbm5lbENvdW50UmVxdWVzdGVkICE9IGluQ2hhbm5lbENvdW50KSB7CisgICAgICAgICAgICAgICAgYWRqdXN0X2NoYW5uZWxzKAorICAgICAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXItPmF1ZGlvQnVmZmVyKCktPmYzMiwgbUluQ2hhbm5lbENvdW50UmVxdWVzdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgbUluQ29udmVyc2lvbkJ1ZmZlci0+YXVkaW9CdWZmZXIoKS0+ZjMyLCBpbkNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihmbG9hdCksCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZmxvYXQpCisgICAgICAgICAgICAgICAgICAgICAgICAqIG1JbkNoYW5uZWxDb3VudFJlcXVlc3RlZCAqIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgIGluQnVmZmVyID0gbUluQ29udmVyc2lvbkJ1ZmZlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtQ29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUKKyAgICAgICAgICAgICAgICAgICAgJiYgbU91dENoYW5uZWxDb3VudFJlcXVlc3RlZCAhPSBvdXRDaGFubmVsQ291bnQpIHsKKyAgICAgICAgICAgICAgICBhZGp1c3Rfc2VsZWN0ZWRfY2hhbm5lbHMoCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXItPmF1ZGlvQnVmZmVyKCktPmYzMiwgbU91dENoYW5uZWxDb3VudFJlcXVlc3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRDb252ZXJzaW9uQnVmZmVyLT5hdWRpb0J1ZmZlcigpLT5mMzIsIG91dENoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihmbG9hdCksCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZmxvYXQpCisgICAgICAgICAgICAgICAgICAgICAgICAqIG1PdXRDaGFubmVsQ291bnRSZXF1ZXN0ZWQgKiBtQ29uZmlnLm91dHB1dENmZy5idWZmZXIuZnJhbWVDb3VudCk7CisgICAgICAgICAgICAgICAgb3V0QnVmZmVyID0gbU91dENvbnZlcnNpb25CdWZmZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW1TdXBwb3J0c0Zsb2F0KSB7IC8vIGNvbnZlcnQgaW5wdXQgdG8gaW50MTZfdCBhcyBlZmZlY3QgZG9lc24ndCBzdXBwb3J0IGZsb2F0LgorICAgICAgICAgICAgICAgIGlmICghYXV4VHlwZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobUluQ29udmVyc2lvbkJ1ZmZlci5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXM6IG1JbkNvbnZlcnNpb25CdWZmZXIgaXMgbnVsbCwgYnlwYXNzaW5nIiwgX19mdW5jX18pOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBkYXRhX2J5cGFzczsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluQ29udmVyc2lvbkJ1ZmZlci0+YXVkaW9CdWZmZXIoKS0+czE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQnVmZmVyLT5hdWRpb0J1ZmZlcigpLT5mMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5DaGFubmVsQ291bnQgKiBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXIgPSBtSW5Db252ZXJzaW9uQnVmZmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobUNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtT3V0Q29udmVyc2lvbkJ1ZmZlci5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXM6IG1PdXRDb252ZXJzaW9uQnVmZmVyIGlzIG51bGwsIGJ5cGFzc2luZyIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZGF0YV9ieXBhc3M7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX2Zsb2F0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRDb252ZXJzaW9uQnVmZmVyLT5hdWRpb0J1ZmZlcigpLT5zMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT5hdWRpb0J1ZmZlcigpLT5mMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Q2hhbm5lbENvdW50ICogbUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXIgPSBtT3V0Q29udmVyc2lvbkJ1ZmZlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIHJldCA9IG1FZmZlY3RJbnRlcmZhY2UtPnByb2Nlc3MoKTsKKyNpZmRlZiBGTE9BVF9FRkZFQ1RfQ0hBSU4KKyAgICAgICAgICAgIGlmICghbVN1cHBvcnRzRmxvYXQpIHsgLy8gY29udmVydCBvdXRwdXQgaW50MTZfdCBiYWNrIHRvIGZsb2F0LgorICAgICAgICAgICAgICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4gdGFyZ2V0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRDaGFubmVsQ291bnRSZXF1ZXN0ZWQgIT0gb3V0Q2hhbm5lbENvdW50CisgICAgICAgICAgICAgICAgICAgICAgICA/IG1PdXRDb252ZXJzaW9uQnVmZmVyIDogbU91dEJ1ZmZlcjsKKworICAgICAgICAgICAgICAgIG1lbWNweV90b19mbG9hdF9mcm9tX2kxNigKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC0+YXVkaW9CdWZmZXIoKS0+ZjMyLAorICAgICAgICAgICAgICAgICAgICAgICAgbU91dENvbnZlcnNpb25CdWZmZXItPmF1ZGlvQnVmZmVyKCktPnMxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dENoYW5uZWxDb3VudCAqIG1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtT3V0Q2hhbm5lbENvdW50UmVxdWVzdGVkICE9IG91dENoYW5uZWxDb3VudCkgeworICAgICAgICAgICAgICAgIGFkanVzdF9zZWxlY3RlZF9jaGFubmVscyhtT3V0Q29udmVyc2lvbkJ1ZmZlci0+YXVkaW9CdWZmZXIoKS0+ZjMyLCBvdXRDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICBtT3V0QnVmZmVyLT5hdWRpb0J1ZmZlcigpLT5mMzIsIG1PdXRDaGFubmVsQ291bnRSZXF1ZXN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZmxvYXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGZsb2F0KSAqIG91dENoYW5uZWxDb3VudCAqIG1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50KTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9IGVsc2UgeworI2lmZGVmIEZMT0FUX0VGRkVDVF9DSEFJTgorICAgICAgICAgICAgZGF0YV9ieXBhc3M6CisjZW5kaWYKKyAgICAgICAgICAgIGlmICghYXV4VHlwZSAgLyogYXV4IGVmZmVjdHMgZG8gbm90IHJlcXVpcmUgZGF0YSBieXBhc3MgKi8KKyAgICAgICAgICAgICAgICAgICAgJiYgbUNvbmZpZy5pbnB1dENmZy5idWZmZXIucmF3ICE9IG1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5yYXcpIHsKKyAgICAgICAgICAgICAgICBpZiAobUNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSB7CisgICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVJbnB1dFRvT3V0cHV0KCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KG1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5yYXcsIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLnJhdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ250ICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgY29weUlucHV0VG9PdXRwdXQoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXQgPSAtRU5PREFUQTsKICAgICAgICAgfQorCiAgICAgICAgIC8vIGZvcmNlIHRyYW5zaXRpb24gdG8gSURMRSBzdGF0ZSB3aGVuIGVuZ2luZSBpcyByZWFkeQogICAgICAgICBpZiAobVN0YXRlID09IFNUT1BQRUQgJiYgcmV0ID09IC1FTk9EQVRBKSB7CiAgICAgICAgICAgICBtRGlzYWJsZVdhaXRDbnQgPSAxOwogICAgICAgICB9CiAKICAgICAgICAgLy8gY2xlYXIgYXV4aWxpYXJ5IGVmZmVjdCBpbnB1dCBidWZmZXIgZm9yIG5leHQgYWNjdW11bGF0aW9uCi0gICAgICAgIGlmICgobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZKSB7Ci0gICAgICAgICAgICBtZW1zZXQobUNvbmZpZy5pbnB1dENmZy5idWZmZXIucmF3LCAwLAotICAgICAgICAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQqc2l6ZW9mKGludDMyX3QpKTsKKyAgICAgICAgaWYgKGF1eFR5cGUpIHsKKyNpZmRlZiBGTE9BVF9BVVgKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBzaXplID0KKyAgICAgICAgICAgICAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5idWZmZXIuZnJhbWVDb3VudCAqIGluQ2hhbm5lbENvdW50ICogc2l6ZW9mKGZsb2F0KTsKKyNlbHNlCisgICAgICAgICAgICBjb25zdCBzaXplX3Qgc2l6ZSA9CisgICAgICAgICAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQgKiBpbkNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQzMl90KTsKKyNlbmRpZgorICAgICAgICAgICAgbWVtc2V0KG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLnJhdywgMCwgc2l6ZSk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9JTlNFUlQgJiYKKyAgICAgICAgICAgICAgICAvLyBtSW5CdWZmZXItPmF1ZGlvQnVmZmVyKCktPnJhdyAhPSBtT3V0QnVmZmVyLT5hdWRpb0J1ZmZlcigpLT5yYXcKICAgICAgICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5yYXcgIT0gbUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLnJhdykgewogICAgICAgICAvLyBJZiBhbiBpbnNlcnQgZWZmZWN0IGlzIGlkbGUgYW5kIGlucHV0IGJ1ZmZlciBpcyBkaWZmZXJlbnQgZnJvbSBvdXRwdXQgYnVmZmVyLAogICAgICAgICAvLyBhY2N1bXVsYXRlIGlucHV0IG9udG8gb3V0cHV0CiAgICAgICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IG1DaGFpbi5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChjaGFpbiAhPSAwICYmIGNoYWluLT5hY3RpdmVUcmFja0NudCgpICE9IDApIHsKLSAgICAgICAgICAgIHNpemVfdCBmcmFtZUNudCA9IG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQgKiBGQ0NfMjsgIC8vYWx3YXlzIHN0ZXJlbyBoZXJlCi0gICAgICAgICAgICBpbnQxNl90ICppbiA9IG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLnMxNjsKLSAgICAgICAgICAgIGludDE2X3QgKm91dCA9IG1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5zMTY7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZyYW1lQ250OyBpKyspIHsKLSAgICAgICAgICAgICAgICBvdXRbaV0gPSBjbGFtcDE2KChpbnQzMl90KW91dFtpXSArIChpbnQzMl90KWluW2ldKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKGNoYWluLmdldCgpICE9IG51bGxwdHIgJiYgY2hhaW4tPmFjdGl2ZVRyYWNrQ250KCkgIT0gMCkgeworICAgICAgICAgICAgYWNjdW11bGF0ZUlucHV0VG9PdXRwdXQoKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTM0OSw2ICs0OTEsNyBAQAogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6Y29uZmlndXJlKCkKIHsKKyAgICBBTE9HVlYoImNvbmZpZ3VyZSgpIHN0YXJ0ZWQiKTsKICAgICBzdGF0dXNfdCBzdGF0dXM7CiAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkOwogICAgIHVpbnQzMl90IHNpemU7CkBAIC0zNjYsMTUgKzUwOSwyOCBAQAogICAgIH0KIAogICAgIC8vIFRPRE86IGhhbmRsZSBjb25maWd1cmF0aW9uIG9mIGVmZmVjdHMgcmVwbGFjaW5nIHRyYWNrIHByb2Nlc3MKKyAgICAvLyBUT0RPOiBoYW5kbGUgY29uZmlndXJhdGlvbiBvZiBpbnB1dCAocmVjb3JkKSBTVyBlZmZlY3RzIGFib3ZlIHRoZSBIQUwsCisgICAgLy8gc2ltaWxhciB0byBvdXRwdXQgRUZGRUNUX0ZMQUdfVFlQRV9JTlNFUlQvUkVQTEFDRSwKKyAgICAvLyBpbiB3aGljaCBjYXNlIGlucHV0IGNoYW5uZWwgbWFza3Mgc2hvdWxkIGJlIHVzZWQgaGVyZS4KICAgICBjaGFubmVsTWFzayA9IHRocmVhZC0+Y2hhbm5lbE1hc2soKTsKKyAgICBtQ29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gY2hhbm5lbE1hc2s7CiAgICAgbUNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgPSBjaGFubmVsTWFzazsKIAogICAgIGlmICgobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZKSB7Ci0gICAgICAgIG1Db25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9NT05POwotICAgICAgICBtQ29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKLSAgICAgICAgQUxPR1YoIk92ZXJyaWRpbmcgYXV4aWxpYXJ5IGVmZmVjdCBpbnB1dCBhcyBNT05PIGFuZCBvdXRwdXQgYXMgU1RFUkVPIik7CisgICAgICAgIGlmIChtQ29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzICE9IEFVRElPX0NIQU5ORUxfT1VUX01PTk8pIHsKKyAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9NT05POworICAgICAgICAgICAgQUxPR1YoIk92ZXJyaWRpbmcgYXV4aWxpYXJ5IGVmZmVjdCBpbnB1dCBjaGFubmVscyAlI3ggYXMgTU9OTyIsCisgICAgICAgICAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuY2hhbm5lbHMpOworICAgICAgICB9CisjaWZuZGVmIE1VTFRJQ0hBTk5FTF9FRkZFQ1RfQ0hBSU4KKyAgICAgICAgaWYgKG1Db25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzICE9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTykgeworICAgICAgICAgICAgbUNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisgICAgICAgICAgICBBTE9HVigiT3ZlcnJpZGluZyBhdXhpbGlhcnkgZWZmZWN0IG91dHB1dCBjaGFubmVscyAlI3ggYXMgU1RFUkVPIiwKKyAgICAgICAgICAgICAgICAgICAgbUNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMpOworICAgICAgICB9CisjZW5kaWYKICAgICB9IGVsc2UgewotICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gY2hhbm5lbE1hc2s7CisjaWZuZGVmIE1VTFRJQ0hBTk5FTF9FRkZFQ1RfQ0hBSU4KICAgICAgICAgLy8gVE9ETzogVXBkYXRlIHRoaXMgbG9naWMgd2hlbiBtdWx0aWNoYW5uZWwgZWZmZWN0cyBhcmUgaW1wbGVtZW50ZWQuCiAgICAgICAgIC8vIEZvciBvZmZsb2FkZWQgdHJhY2tzIGNvbnNpZGVyIG1vbm8gb3V0cHV0IGFzIHN0ZXJlbyBmb3IgcHJvcGVyIGVmZmVjdCBpbml0aWFsaXphdGlvbgogICAgICAgICBpZiAoY2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTykgewpAQCAtMzgyLDEwICs1MzgsMTUgQEAKICAgICAgICAgICAgIG1Db25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwogICAgICAgICAgICAgQUxPR1YoIk92ZXJyaWRpbmcgZWZmZWN0IGlucHV0IGFuZCBvdXRwdXQgYXMgU1RFUkVPIik7CiAgICAgICAgIH0KKyNlbmRpZgogICAgIH0KKyAgICBtSW5DaGFubmVsQ291bnRSZXF1ZXN0ZWQgPQorICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1Db25maWcuaW5wdXRDZmcuY2hhbm5lbHMpOworICAgIG1PdXRDaGFubmVsQ291bnRSZXF1ZXN0ZWQgPQorICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1Db25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzKTsKIAotICAgIG1Db25maWcuaW5wdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7Ci0gICAgbUNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgbUNvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBFRkZFQ1RfQlVGRkVSX0ZPUk1BVDsKKyAgICBtQ29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBFRkZFQ1RfQlVGRkVSX0ZPUk1BVDsKICAgICBtQ29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IHRocmVhZC0+c2FtcGxlUmF0ZSgpOwogICAgIG1Db25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IG1Db25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlOwogICAgIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llID0gTlVMTDsKQEAgLTQxMywxMiArNTc0LDYgQEAKICAgICBtQ29uZmlnLm91dHB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19BTEw7CiAgICAgbUNvbmZpZy5pbnB1dENmZy5idWZmZXIuZnJhbWVDb3VudCA9IHRocmVhZC0+ZnJhbWVDb3VudCgpOwogICAgIG1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50ID0gbUNvbmZpZy5pbnB1dENmZy5idWZmZXIuZnJhbWVDb3VudDsKLSAgICBpZiAobUluQnVmZmVyICE9IDApIHsKLSAgICAgICAgbUluQnVmZmVyLT5zZXRGcmFtZUNvdW50KG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQpOwotICAgIH0KLSAgICBpZiAobU91dEJ1ZmZlciAhPSAwKSB7Ci0gICAgICAgIG1PdXRCdWZmZXItPnNldEZyYW1lQ291bnQobUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQpOwotICAgIH0KIAogICAgIEFMT0dWKCJjb25maWd1cmUoKSAlcCB0aHJlYWQgJXAgYnVmZmVyICVwIGZyYW1lY291bnQgJXp1IiwKICAgICAgICAgICAgIHRoaXMsIHRocmVhZC5nZXQoKSwgbUNvbmZpZy5pbnB1dENmZy5idWZmZXIucmF3LCBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50KTsKQEAgLTQyNiw0MyArNTgxLDEwOCBAQAogICAgIHN0YXR1c190IGNtZFN0YXR1czsKICAgICBzaXplID0gc2l6ZW9mKGludCk7CiAgICAgc3RhdHVzID0gbUVmZmVjdEludGVyZmFjZS0+Y29tbWFuZChFRkZFQ1RfQ01EX1NFVF9DT05GSUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihtQ29uZmlnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY21kU3RhdHVzKTsKLSAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgIHN0YXR1cyA9IGNtZFN0YXR1czsKICAgICB9CiAKLSAgICBpZiAoc3RhdHVzID09IDAgJiYKLSAgICAgICAgICAgIChtZW1jbXAoJm1EZXNjcmlwdG9yLnR5cGUsIFNMX0lJRF9WSVNVQUxJWkFUSU9OLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApKSB7Ci0gICAgICAgIHVpbnQzMl90IGJ1ZjMyW3NpemVvZihlZmZlY3RfcGFyYW1fdCkgLyBzaXplb2YodWludDMyX3QpICsgMl07Ci0gICAgICAgIGVmZmVjdF9wYXJhbV90ICpwID0gKGVmZmVjdF9wYXJhbV90ICopYnVmMzI7Ci0KLSAgICAgICAgcC0+cHNpemUgPSBzaXplb2YodWludDMyX3QpOwotICAgICAgICBwLT52c2l6ZSA9IHNpemVvZih1aW50MzJfdCk7Ci0gICAgICAgIHNpemUgPSBzaXplb2YoaW50KTsKLSAgICAgICAgKihpbnQzMl90ICopcC0+ZGF0YSA9IFZJU1VBTElaRVJfUEFSQU1fTEFURU5DWTsKLQotICAgICAgICB1aW50MzJfdCBsYXRlbmN5ID0gMDsKLSAgICAgICAgUGxheWJhY2tUaHJlYWQgKnBidCA9IHRocmVhZC0+bUF1ZGlvRmxpbmdlci0+Y2hlY2tQbGF5YmFja1RocmVhZF9sKHRocmVhZC0+bUlkKTsKLSAgICAgICAgaWYgKHBidCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBsYXRlbmN5ID0gcGJ0LT5sYXRlbmN5X2woKTsKKyNpZmRlZiBNVUxUSUNIQU5ORUxfRUZGRUNUX0NIQUlOCisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiAmJgorICAgICAgICAgICAgdGhyZWFkLT5pc091dHB1dCgpICYmCisgICAgICAgICAgICAobUNvbmZpZy5pbnB1dENmZy5jaGFubmVscyAhPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8KKyAgICAgICAgICAgICAgICAgICAgfHwgbUNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgIT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSkgeworICAgICAgICAvLyBPbGRlciBlZmZlY3RzIG1heSByZXF1aXJlIGV4YWN0IFNURVJFTyBwb3NpdGlvbiBtYXNrLgorICAgICAgICBpZiAobUNvbmZpZy5pbnB1dENmZy5jaGFubmVscyAhPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8KKyAgICAgICAgICAgICAgICAmJiAobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spICE9IEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZKSB7CisgICAgICAgICAgICBBTE9HVigiT3ZlcnJpZGluZyBlZmZlY3QgaW5wdXQgY2hhbm5lbHMgJSN4IGFzIFNURVJFTyIsIG1Db25maWcuaW5wdXRDZmcuY2hhbm5lbHMpOworICAgICAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKICAgICAgICAgfQorICAgICAgICBpZiAobUNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgIT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSB7CisgICAgICAgICAgICBBTE9HVigiT3ZlcnJpZGluZyBlZmZlY3Qgb3V0cHV0IGNoYW5uZWxzICUjeCBhcyBTVEVSRU8iLCBtQ29uZmlnLm91dHB1dENmZy5jaGFubmVscyk7CisgICAgICAgICAgICBtQ29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKyAgICAgICAgfQorICAgICAgICBzaXplID0gc2l6ZW9mKGludCk7CisgICAgICAgIHN0YXR1cyA9IG1FZmZlY3RJbnRlcmZhY2UtPmNvbW1hbmQoRUZGRUNUX0NNRF9TRVRfQ09ORklHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihtQ29uZmlnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY21kU3RhdHVzKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gY21kU3RhdHVzOworICAgICAgICB9CisgICAgfQorI2VuZGlmCiAKLSAgICAgICAgKigoaW50MzJfdCAqKXAtPmRhdGEgKyAxKT0gbGF0ZW5jeTsKLSAgICAgICAgbUVmZmVjdEludGVyZmFjZS0+Y29tbWFuZChFRkZFQ1RfQ01EX1NFVF9QQVJBTSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNtZFN0YXR1cyk7CisjaWZkZWYgRkxPQVRfRUZGRUNUX0NIQUlOCisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBtU3VwcG9ydHNGbG9hdCA9IHRydWU7CiAgICAgfQogCi0gICAgbU1heERpc2FibGVXYWl0Q250ID0gKE1BWF9ESVNBQkxFX1RJTUVfTVMgKiBtQ29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUpIC8KLSAgICAgICAgICAgICgxMDAwICogbUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR1YoIkVGRkVDVF9DTURfU0VUX0NPTkZJRyBmYWlsZWQgd2l0aCBmbG9hdCBmb3JtYXQsIHJldHJ5IHdpdGggaW50MTZfdC4iKTsKKyAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICAgICAgbUNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgICAgIHNpemUgPSBzaXplb2YoaW50KTsKKyAgICAgICAgc3RhdHVzID0gbUVmZmVjdEludGVyZmFjZS0+Y29tbWFuZChFRkZFQ1RfQ01EX1NFVF9DT05GSUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG1Db25maWcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjbWRTdGF0dXMpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBjbWRTdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgbVN1cHBvcnRzRmxvYXQgPSBmYWxzZTsKKyAgICAgICAgICAgIEFMT0dWVigiY29uZmlnIHdvcmtlZCB3aXRoIDE2IGJpdCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIiVzIGZhaWxlZCAlZCB3aXRoIGludDE2X3QgKGFzIHdlbGwgYXMgZmxvYXQpIiwgX19mdW5jX18sIHN0YXR1cyk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgLy8gRXN0YWJsaXNoIEJ1ZmZlciBzdHJhdGVneQorICAgICAgICBzZXRJbkJ1ZmZlcihtSW5CdWZmZXIpOworICAgICAgICBzZXRPdXRCdWZmZXIobU91dEJ1ZmZlcik7CisKKyAgICAgICAgLy8gVXBkYXRlIHZpc3VhbGl6ZXIgbGF0ZW5jeQorICAgICAgICBpZiAobWVtY21wKCZtRGVzY3JpcHRvci50eXBlLCBTTF9JSURfVklTVUFMSVpBVElPTiwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7CisgICAgICAgICAgICB1aW50MzJfdCBidWYzMltzaXplb2YoZWZmZWN0X3BhcmFtX3QpIC8gc2l6ZW9mKHVpbnQzMl90KSArIDJdOworICAgICAgICAgICAgZWZmZWN0X3BhcmFtX3QgKnAgPSAoZWZmZWN0X3BhcmFtX3QgKilidWYzMjsKKworICAgICAgICAgICAgcC0+cHNpemUgPSBzaXplb2YodWludDMyX3QpOworICAgICAgICAgICAgcC0+dnNpemUgPSBzaXplb2YodWludDMyX3QpOworICAgICAgICAgICAgc2l6ZSA9IHNpemVvZihpbnQpOworICAgICAgICAgICAgKihpbnQzMl90ICopcC0+ZGF0YSA9IFZJU1VBTElaRVJfUEFSQU1fTEFURU5DWTsKKworICAgICAgICAgICAgdWludDMyX3QgbGF0ZW5jeSA9IDA7CisgICAgICAgICAgICBQbGF5YmFja1RocmVhZCAqcGJ0ID0gdGhyZWFkLT5tQXVkaW9GbGluZ2VyLT5jaGVja1BsYXliYWNrVGhyZWFkX2wodGhyZWFkLT5tSWQpOworICAgICAgICAgICAgaWYgKHBidCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbGF0ZW5jeSA9IHBidC0+bGF0ZW5jeV9sKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICooKGludDMyX3QgKilwLT5kYXRhICsgMSk9IGxhdGVuY3k7CisgICAgICAgICAgICBtRWZmZWN0SW50ZXJmYWNlLT5jb21tYW5kKEVGRkVDVF9DTURfU0VUX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgOCwKKyAgICAgICAgICAgICAgICAgICAgJmJ1ZjMyLAorICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgJmNtZFN0YXR1cyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBtQ29uZmlnLm91dHB1dENmZy5idWZmZXIuZnJhbWVDb3VudCBjYW5ub3QgYmUgemVyby4KKyAgICBtTWF4RGlzYWJsZVdhaXRDbnQgPSAodWludDMyX3Qpc3RkOjptYXgoCisgICAgICAgICAgICAodWludDY0X3QpMSwgLy8gbU1heERpc2FibGVXYWl0Q250IG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uCisgICAgICAgICAgICAodWludDY0X3QpTUFYX0RJU0FCTEVfVElNRV9NUyAqIG1Db25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZQorICAgICAgICAgICAgICAgIC8gKCh1aW50NjRfdCkxMDAwICogbUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQpKTsKIAogZXhpdDoKKyAgICAvLyBUT0RPOiBjb25zaWRlciBjbGVhcmluZyBtQ29uZmlnIG9uIGVycm9yLgogICAgIG1TdGF0dXMgPSBzdGF0dXM7CisgICAgQUxPR1ZWKCJjb25maWd1cmUgZW5kZWQiKTsKICAgICByZXR1cm4gc3RhdHVzOwogfQogCkBAIC03NzQsNiArOTk0LDkgQEAKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6c2V0SW5CdWZmZXIoY29uc3Qgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiYgYnVmZmVyKSB7CisgICAgQUxPR1ZWKCJzZXRJbkJ1ZmZlciAlcCIsKCZidWZmZXIpKTsKKworICAgIC8vIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQgbWF5IGJlIHplcm8gaWYgY29uZmlndXJlKCkgaXMgbm90IGNhbGxlZCB5ZXQuCiAgICAgaWYgKGJ1ZmZlciAhPSAwKSB7CiAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLnJhdyA9IGJ1ZmZlci0+YXVkaW9CdWZmZXIoKS0+cmF3OwogICAgICAgICBidWZmZXItPnNldEZyYW1lQ291bnQobUNvbmZpZy5pbnB1dENmZy5idWZmZXIuZnJhbWVDb3VudCk7CkBAIC03ODIsOSArMTAwNSw0OCBAQAogICAgIH0KICAgICBtSW5CdWZmZXIgPSBidWZmZXI7CiAgICAgbUVmZmVjdEludGVyZmFjZS0+c2V0SW5CdWZmZXIoYnVmZmVyKTsKKworI2lmZGVmIEZMT0FUX0VGRkVDVF9DSEFJTgorICAgIC8vIGF1eCBlZmZlY3RzIGRvIGluIHBsYWNlIGNvbnZlcnNpb24gdG8gZmxvYXQgLSB3ZSBkb24ndCBhbGxvY2F0ZSBtSW5Db252ZXJzaW9uQnVmZmVyLgorICAgIC8vIFRoZW9yZXRpY2FsbHkgaW5zZXJ0IGVmZmVjdHMgY2FuIGFsc28gZG8gaW4tcGxhY2UgY29udmVyc2lvbnMgKGRlc3Ryb3lpbmcKKyAgICAvLyB0aGUgb3JpZ2luYWwgYnVmZmVyKSB3aGVuIHRoZSBvdXRwdXQgYnVmZmVyIGlzIGlkZW50aWNhbCB0byB0aGUgaW5wdXQgYnVmZmVyLAorICAgIC8vIGJ1dCB3ZSBkb24ndCBvcHRpbWl6ZSBmb3IgaXQgaGVyZS4KKyAgICBjb25zdCBib29sIGF1eFR5cGUgPSAobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZOworICAgIGNvbnN0IHVpbnQzMl90IGluQ2hhbm5lbENvdW50ID0KKyAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtQ29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzKTsKKyAgICBjb25zdCBib29sIGZvcm1hdE1pc21hdGNoID0gIW1TdXBwb3J0c0Zsb2F0IHx8IG1JbkNoYW5uZWxDb3VudFJlcXVlc3RlZCAhPSBpbkNoYW5uZWxDb3VudDsKKyAgICBpZiAoIWF1eFR5cGUgJiYgZm9ybWF0TWlzbWF0Y2ggJiYgbUluQnVmZmVyLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgLy8gd2UgbmVlZCB0byB0cmFuc2xhdGUgLSBjcmVhdGUgaGlkbCBzaGFyZWQgYnVmZmVyIGFuZCBpbnRlcmNlcHQKKyAgICAgICAgY29uc3Qgc2l6ZV90IGluRnJhbWVDb3VudCA9IG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQ7CisgICAgICAgIC8vIFVzZSBGQ0NfMiBpbiBjYXNlIG1JbkNoYW5uZWxDb3VudFJlcXVlc3RlZCBpcyBtb25vIGFuZCB0aGUgZWZmZWN0IGlzIHN0ZXJlby4KKyAgICAgICAgY29uc3QgdWludDMyX3QgaW5DaGFubmVscyA9IHN0ZDo6bWF4KCh1aW50MzJfdClGQ0NfMiwgbUluQ2hhbm5lbENvdW50UmVxdWVzdGVkKTsKKyAgICAgICAgY29uc3Qgc2l6ZV90IHNpemUgPSBpbkNoYW5uZWxzICogaW5GcmFtZUNvdW50ICogc3RkOjptYXgoc2l6ZW9mKGludDE2X3QpLCBzaXplb2YoZmxvYXQpKTsKKworICAgICAgICBBTE9HVigiJXM6IHNldEluQnVmZmVyIHVwZGF0aW5nIGZvciBpbkNoYW5uZWxzOiVkIGluRnJhbWVDb3VudDolenUgdG90YWwgc2l6ZTolenUiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBpbkNoYW5uZWxzLCBpbkZyYW1lQ291bnQsIHNpemUpOworCisgICAgICAgIGlmIChzaXplID4gMCAmJiAobUluQ29udmVyc2lvbkJ1ZmZlci5nZXQoKSA9PSBudWxscHRyCisgICAgICAgICAgICAgICAgfHwgc2l6ZSA+IG1JbkNvbnZlcnNpb25CdWZmZXItPmdldFNpemUoKSkpIHsKKyAgICAgICAgICAgIG1JbkNvbnZlcnNpb25CdWZmZXIuY2xlYXIoKTsKKyAgICAgICAgICAgIEFMT0dWKCIlczogYWxsb2NhdGluZyBtSW5Db252ZXJzaW9uQnVmZmVyICV6dSIsIF9fZnVuY19fLCBzaXplKTsKKyAgICAgICAgICAgIHNwPEF1ZGlvRmxpbmdlcj4gYXVkaW9GbGluZ2VyID0gbUF1ZGlvRmxpbmdlci5wcm9tb3RlKCk7CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGF1ZGlvRmxpbmdlciA9PSBudWxscHRyLCAiRU0gY291bGQgbm90IHJldHJpZXZlZCBhdWRpb0ZsaW5nZXIiKTsKKyAgICAgICAgICAgICh2b2lkKWF1ZGlvRmxpbmdlci0+bUVmZmVjdHNGYWN0b3J5SGFsLT5hbGxvY2F0ZUJ1ZmZlcihzaXplLCAmbUluQ29udmVyc2lvbkJ1ZmZlcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1JbkNvbnZlcnNpb25CdWZmZXIuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbUluQ29udmVyc2lvbkJ1ZmZlci0+c2V0RnJhbWVDb3VudChpbkZyYW1lQ291bnQpOworICAgICAgICAgICAgbUVmZmVjdEludGVyZmFjZS0+c2V0SW5CdWZmZXIobUluQ29udmVyc2lvbkJ1ZmZlcik7CisgICAgICAgIH0gZWxzZSBpZiAoc2l6ZSA+IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyBjYW5ub3QgY3JlYXRlIG1JbkNvbnZlcnNpb25CdWZmZXIiLCBfX2Z1bmNfXyk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6c2V0T3V0QnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcikgeworICAgIEFMT0dWVigic2V0T3V0QnVmZmVyICVwIiwoJmJ1ZmZlcikpOworCisgICAgLy8gbUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQgbWF5IGJlIHplcm8gaWYgY29uZmlndXJlKCkgaXMgbm90IGNhbGxlZCB5ZXQuCiAgICAgaWYgKGJ1ZmZlciAhPSAwKSB7CiAgICAgICAgIG1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5yYXcgPSBidWZmZXItPmF1ZGlvQnVmZmVyKCktPnJhdzsKICAgICAgICAgYnVmZmVyLT5zZXRGcmFtZUNvdW50KG1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50KTsKQEAgLTc5Myw2ICsxMDU1LDM4IEBACiAgICAgfQogICAgIG1PdXRCdWZmZXIgPSBidWZmZXI7CiAgICAgbUVmZmVjdEludGVyZmFjZS0+c2V0T3V0QnVmZmVyKGJ1ZmZlcik7CisKKyNpZmRlZiBGTE9BVF9FRkZFQ1RfQ0hBSU4KKyAgICAvLyBOb3RlOiBBbnkgZWZmZWN0IHRoYXQgZG9lcyBub3QgYWNjdW11bGF0ZSBkb2VzIG5vdCBuZWVkIG1PdXRDb252ZXJzaW9uQnVmZmVyIGFuZAorICAgIC8vIGNhbiBkbyBpbi1wbGFjZSBjb252ZXJzaW9uIGZyb20gaW50MTZfdCB0byBmbG9hdC4gIFdlIGRvbid0IG9wdGltaXplIGhlcmUuCisgICAgY29uc3QgdWludDMyX3Qgb3V0Q2hhbm5lbENvdW50ID0KKyAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtQ29uZmlnLm91dHB1dENmZy5jaGFubmVscyk7CisgICAgY29uc3QgYm9vbCBmb3JtYXRNaXNtYXRjaCA9ICFtU3VwcG9ydHNGbG9hdCB8fCBtT3V0Q2hhbm5lbENvdW50UmVxdWVzdGVkICE9IG91dENoYW5uZWxDb3VudDsKKyAgICBpZiAoZm9ybWF0TWlzbWF0Y2ggJiYgbU91dEJ1ZmZlci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIGNvbnN0IHNpemVfdCBvdXRGcmFtZUNvdW50ID0gbUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQ7CisgICAgICAgIC8vIFVzZSBGQ0NfMiBpbiBjYXNlIG1PdXRDaGFubmVsQ291bnRSZXF1ZXN0ZWQgaXMgbW9ubyBhbmQgdGhlIGVmZmVjdCBpcyBzdGVyZW8uCisgICAgICAgIGNvbnN0IHVpbnQzMl90IG91dENoYW5uZWxzID0gc3RkOjptYXgoKHVpbnQzMl90KUZDQ18yLCBtT3V0Q2hhbm5lbENvdW50UmVxdWVzdGVkKTsKKyAgICAgICAgY29uc3Qgc2l6ZV90IHNpemUgPSBvdXRDaGFubmVscyAqIG91dEZyYW1lQ291bnQgKiBzdGQ6Om1heChzaXplb2YoaW50MTZfdCksIHNpemVvZihmbG9hdCkpOworCisgICAgICAgIEFMT0dWKCIlczogc2V0T3V0QnVmZmVyIHVwZGF0aW5nIGZvciBvdXRDaGFubmVsczolZCBvdXRGcmFtZUNvdW50OiV6dSB0b3RhbCBzaXplOiV6dSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG91dENoYW5uZWxzLCBvdXRGcmFtZUNvdW50LCBzaXplKTsKKworICAgICAgICBpZiAoc2l6ZSA+IDAgJiYgKG1PdXRDb252ZXJzaW9uQnVmZmVyLmdldCgpID09IG51bGxwdHIKKyAgICAgICAgICAgICAgICB8fCBzaXplID4gbU91dENvbnZlcnNpb25CdWZmZXItPmdldFNpemUoKSkpIHsKKyAgICAgICAgICAgIG1PdXRDb252ZXJzaW9uQnVmZmVyLmNsZWFyKCk7CisgICAgICAgICAgICBBTE9HVigiJXM6IGFsbG9jYXRpbmcgbU91dENvbnZlcnNpb25CdWZmZXIgJXp1IiwgX19mdW5jX18sIHNpemUpOworICAgICAgICAgICAgc3A8QXVkaW9GbGluZ2VyPiBhdWRpb0ZsaW5nZXIgPSBtQXVkaW9GbGluZ2VyLnByb21vdGUoKTsKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoYXVkaW9GbGluZ2VyID09IG51bGxwdHIsICJFTSBjb3VsZCBub3QgcmV0cmlldmVkIGF1ZGlvRmxpbmdlciIpOworICAgICAgICAgICAgKHZvaWQpYXVkaW9GbGluZ2VyLT5tRWZmZWN0c0ZhY3RvcnlIYWwtPmFsbG9jYXRlQnVmZmVyKHNpemUsICZtT3V0Q29udmVyc2lvbkJ1ZmZlcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1PdXRDb252ZXJzaW9uQnVmZmVyLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1PdXRDb252ZXJzaW9uQnVmZmVyLT5zZXRGcmFtZUNvdW50KG91dEZyYW1lQ291bnQpOworICAgICAgICAgICAgbUVmZmVjdEludGVyZmFjZS0+c2V0T3V0QnVmZmVyKG1PdXRDb252ZXJzaW9uQnVmZmVyKTsKKyAgICAgICAgfSBlbHNlIGlmIChzaXplID4gMCkgeworICAgICAgICAgICAgQUxPR0UoIiVzIGNhbm5vdCBjcmVhdGUgbU91dENvbnZlcnNpb25CdWZmZXIiLCBfX2Z1bmNfXyk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OnNldFZvbHVtZSh1aW50MzJfdCAqbGVmdCwgdWludDMyX3QgKnJpZ2h0LCBib29sIGNvbnRyb2xsZXIpCkBAIC0xMDYzLDE1ICsxMzU3LDI2IEBACiAgICAgcmV0dXJuIHM7CiB9CiAKK3N0YXRpYyBzdGQ6OnN0cmluZyBkdW1wSW5PdXRCdWZmZXIoYm9vbCBpc0lucHV0LCBjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+ICZidWZmZXIpIHsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKworICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gIm51bGxwdHIiOyAvLyBtYWtlIGRpZmZlcmVudCB0aGFuIGJlbG93CisgICAgfSBlbHNlIGlmIChidWZmZXItPmV4dGVybmFsRGF0YSgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgc3MgPDwgKGlzSW5wdXQgPyBidWZmZXItPmV4dGVybmFsRGF0YSgpIDogYnVmZmVyLT5hdWRpb0J1ZmZlcigpLT5yYXcpCisgICAgICAgICAgICAgICAgPDwgIiAtPiAiCisgICAgICAgICAgICAgICAgPDwgKGlzSW5wdXQgPyBidWZmZXItPmF1ZGlvQnVmZmVyKCktPnJhdyA6IGJ1ZmZlci0+ZXh0ZXJuYWxEYXRhKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNzIDw8IGJ1ZmZlci0+YXVkaW9CdWZmZXIoKS0+cmF3OworICAgIH0KKyAgICByZXR1cm4gc3Muc3RyKCk7Cit9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwogICAgIFN0cmluZzggcmVzdWx0OwogCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRFZmZlY3QgSUQgJWQ6XG4iLCBtSWQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJcdEVmZmVjdCBJRCAlZDpcbiIsIG1JZCk7CiAKICAgICBib29sIGxvY2tlZCA9IEF1ZGlvRmxpbmdlcjo6ZHVtcFRyeUxvY2sobUxvY2spOwogICAgIC8vIGZhaWxlZCB0byBsb2NrIC0gQXVkaW9GbGluZ2VyIGlzIHByb2JhYmx5IGRlYWRsb2NrZWQKQEAgLTEwODAsNTkgKzEzODUsNjQgQEAKICAgICB9CiAKICAgICByZXN1bHQuYXBwZW5kKCJcdFx0U2Vzc2lvbiBTdGF0dXMgU3RhdGUgRW5naW5lOlxuIik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRcdCUwNWQgICAlMDNkICAgICUwM2QgICAlcFxuIiwKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJcdFx0JTA1ZCAgICUwM2QgICAgJTAzZCAgICVwXG4iLAogICAgICAgICAgICAgbVNlc3Npb25JZCwgbVN0YXR1cywgbVN0YXRlLCBtRWZmZWN0SW50ZXJmYWNlLmdldCgpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAKICAgICByZXN1bHQuYXBwZW5kKCJcdFx0RGVzY3JpcHRvcjpcbiIpOwogICAgIGNoYXIgdXVpZFN0cls2NF07CiAgICAgQXVkaW9FZmZlY3Q6Omd1aWRUb1N0cmluZygmbURlc2NyaXB0b3IudXVpZCwgdXVpZFN0ciwgc2l6ZW9mKHV1aWRTdHIpKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdFx0LSBVVUlEOiAlc1xuIiwgdXVpZFN0cik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIlx0XHQtIFVVSUQ6ICVzXG4iLCB1dWlkU3RyKTsKICAgICBBdWRpb0VmZmVjdDo6Z3VpZFRvU3RyaW5nKCZtRGVzY3JpcHRvci50eXBlLCB1dWlkU3RyLCBzaXplb2YodXVpZFN0cikpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0XHQtIFRZUEU6ICVzXG4iLCB1dWlkU3RyKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRcdC0gYXBpVmVyc2lvbjogJTA4WFxuXHRcdC0gZmxhZ3M6ICUwOFggKCVzKVxuIiwKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJcdFx0LSBUWVBFOiAlc1xuIiwgdXVpZFN0cik7CisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiXHRcdC0gYXBpVmVyc2lvbjogJTA4WFxuXHRcdC0gZmxhZ3M6ICUwOFggKCVzKVxuIiwKICAgICAgICAgICAgIG1EZXNjcmlwdG9yLmFwaVZlcnNpb24sCiAgICAgICAgICAgICBtRGVzY3JpcHRvci5mbGFncywKICAgICAgICAgICAgIGVmZmVjdEZsYWdzVG9TdHJpbmcobURlc2NyaXB0b3IuZmxhZ3MpLnN0cmluZygpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRcdC0gbmFtZTogJXNcbiIsCisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiXHRcdC0gbmFtZTogJXNcbiIsCiAgICAgICAgICAgICBtRGVzY3JpcHRvci5uYW1lKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRcdC0gaW1wbGVtZW50b3I6ICVzXG4iLAorCisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiXHRcdC0gaW1wbGVtZW50b3I6ICVzXG4iLAogICAgICAgICAgICAgbURlc2NyaXB0b3IuaW1wbGVtZW50b3IpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKworICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIlx0XHQtIGRhdGE6ICVzXG4iLCBtU3VwcG9ydHNGbG9hdCA/ICJmbG9hdCIgOiAiaW50MTYiKTsKIAogICAgIHJlc3VsdC5hcHBlbmQoIlx0XHQtIElucHV0IGNvbmZpZ3VyYXRpb246XG4iKTsKLSAgICByZXN1bHQuYXBwZW5kKCJcdFx0XHRGcmFtZXMgIFNtcCByYXRlIENoYW5uZWxzIEZvcm1hdCBCdWZmZXJcbiIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0XHRcdCUwNXp1ICAgJTA1ZCAgICAlMDh4ICU2ZCAoJXMpICVwXG4iLAorICAgIHJlc3VsdC5hcHBlbmQoIlx0XHRcdEJ1ZmZlciAgICAgRnJhbWVzICBTbXAgcmF0ZSBDaGFubmVscyBGb3JtYXRcbiIpOworICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIlx0XHRcdCVwICUwNXp1ICAgJTA1ZCAgICAlMDh4ICU2ZCAoJXMpXG4iLAorICAgICAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5idWZmZXIucmF3LAogICAgICAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5idWZmZXIuZnJhbWVDb3VudCwKICAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5jaGFubmVscywKICAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuZm9ybWF0LAotICAgICAgICAgICAgZm9ybWF0VG9TdHJpbmcoKGF1ZGlvX2Zvcm1hdF90KW1Db25maWcuaW5wdXRDZmcuZm9ybWF0KS5jX3N0cigpLAotICAgICAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5idWZmZXIucmF3KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICBmb3JtYXRUb1N0cmluZygoYXVkaW9fZm9ybWF0X3QpbUNvbmZpZy5pbnB1dENmZy5mb3JtYXQpLmNfc3RyKCkpOwogCiAgICAgcmVzdWx0LmFwcGVuZCgiXHRcdC0gT3V0cHV0IGNvbmZpZ3VyYXRpb246XG4iKTsKICAgICByZXN1bHQuYXBwZW5kKCJcdFx0XHRCdWZmZXIgICAgIEZyYW1lcyAgU21wIHJhdGUgQ2hhbm5lbHMgRm9ybWF0XG4iKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdFx0XHQlcCAlMDV6dSAgICUwNWQgICAgJTA4eCAlZCAoJXMpXG4iLAorICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIlx0XHRcdCVwICUwNXp1ICAgJTA1ZCAgICAlMDh4ICU2ZCAoJXMpXG4iLAogICAgICAgICAgICAgbUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLnJhdywKICAgICAgICAgICAgIG1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50LAogICAgICAgICAgICAgbUNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgbUNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMsCiAgICAgICAgICAgICBtQ29uZmlnLm91dHB1dENmZy5mb3JtYXQsCiAgICAgICAgICAgICBmb3JtYXRUb1N0cmluZygoYXVkaW9fZm9ybWF0X3QpbUNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0KS5jX3N0cigpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdFx0JXp1IENsaWVudHM6XG4iLCBtSGFuZGxlcy5zaXplKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyNpZmRlZiBGTE9BVF9FRkZFQ1RfQ0hBSU4KKworICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIlx0XHQtIEhBTCBidWZmZXJzOlxuIgorICAgICAgICAgICAgIlx0XHRcdEluKCVzKSBJbkNvbnZlcnNpb24oJXMpIE91dCglcykgT3V0Q29udmVyc2lvbiglcylcbiIsCisgICAgICAgICAgICBkdW1wSW5PdXRCdWZmZXIodHJ1ZSAvKiBpc0lucHV0ICovLCBtSW5CdWZmZXIpLmNfc3RyKCksCisgICAgICAgICAgICBkdW1wSW5PdXRCdWZmZXIodHJ1ZSAvKiBpc0lucHV0ICovLCBtSW5Db252ZXJzaW9uQnVmZmVyKS5jX3N0cigpLAorICAgICAgICAgICAgZHVtcEluT3V0QnVmZmVyKGZhbHNlIC8qIGlzSW5wdXQgKi8sIG1PdXRCdWZmZXIpLmNfc3RyKCksCisgICAgICAgICAgICBkdW1wSW5PdXRCdWZmZXIoZmFsc2UgLyogaXNJbnB1dCAqLywgbU91dENvbnZlcnNpb25CdWZmZXIpLmNfc3RyKCkpOworI2VuZGlmCisKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJcdFx0JXp1IENsaWVudHM6XG4iLCBtSGFuZGxlcy5zaXplKCkpOwogICAgIHJlc3VsdC5hcHBlbmQoIlx0XHRcdCAgUGlkIFByaW9yaXR5IEN0cmwgTG9ja2VkIGNsaWVudCBzZXJ2ZXJcbiIpOworICAgIGNoYXIgYnVmZmVyWzI1Nl07CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSGFuZGxlcy5zaXplKCk7ICsraSkgewogICAgICAgICBFZmZlY3RIYW5kbGUgKmhhbmRsZSA9IG1IYW5kbGVzW2ldOwogICAgICAgICBpZiAoaGFuZGxlICE9IE5VTEwgJiYgIWhhbmRsZS0+ZGlzY29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgIGhhbmRsZS0+ZHVtcFRvQnVmZmVyKGJ1ZmZlciwgU0laRSk7CisgICAgICAgICAgICBoYW5kbGUtPmR1bXBUb0J1ZmZlcihidWZmZXIsIHNpemVvZihidWZmZXIpKTsKICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICAgICAgfQogICAgIH0KQEAgLTE1OTgsMTIgKzE5MDgsOSBAQAogICAgIGlmIChtSW5CdWZmZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIC8vIFRPRE86IFRoaXMgd2lsbCBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSwgZGVwZW5kaW5nIG9uIG11bHRpY2hhbm5lbAotICAgIC8vIGFuZCBzYW1wbGUgZm9ybWF0IGNoYW5nZXMgZm9yIGVmZmVjdHMuCi0gICAgLy8gQ3VycmVudGx5IGVmZmVjdHMgcHJvY2Vzc2luZyBpcyBvbmx5IGF2YWlsYWJsZSBmb3Igc3RlcmVvLCBBVURJT19GT1JNQVRfUENNXzE2X0JJVAotICAgIC8vICg0IGJ5dGVzIGZyYW1lIHNpemUpCiAgICAgY29uc3Qgc2l6ZV90IGZyYW1lU2l6ZSA9Ci0gICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfc2FtcGxlKEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSAqIG1pbihGQ0NfMiwgdGhyZWFkLT5jaGFubmVsQ291bnQoKSk7CisgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfc2FtcGxlKEVGRkVDVF9CVUZGRVJfRk9STUFUKSAqIHRocmVhZC0+Y2hhbm5lbENvdW50KCk7CisKICAgICBtZW1zZXQobUluQnVmZmVyLT5hdWRpb0J1ZmZlcigpLT5yYXcsIDAsIHRocmVhZC0+ZnJhbWVDb3VudCgpICogZnJhbWVTaXplKTsKICAgICBtSW5CdWZmZXItPmNvbW1pdCgpOwogfQpAQCAtMTcxOCw4ICsyMDI1LDEzIEBACiAgICAgICAgIC8vIGNhbGxpbmcgdGhlIHByb2Nlc3MgaW4gZWZmZWN0IGVuZ2luZQogICAgICAgICBzaXplX3QgbnVtU2FtcGxlcyA9IHRocmVhZC0+ZnJhbWVDb3VudCgpOwogICAgICAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+IGhhbEJ1ZmZlcjsKLSAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlOjphbGxvY2F0ZSgKKyNpZmRlZiBGTE9BVF9FRkZFQ1RfQ0hBSU4KKyAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gdGhyZWFkLT5tQXVkaW9GbGluZ2VyLT5tRWZmZWN0c0ZhY3RvcnlIYWwtPmFsbG9jYXRlQnVmZmVyKAorICAgICAgICAgICAgICAgIG51bVNhbXBsZXMgKiBzaXplb2YoZmxvYXQpLCAmaGFsQnVmZmVyKTsKKyNlbHNlCisgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IHRocmVhZC0+bUF1ZGlvRmxpbmdlci0+bUVmZmVjdHNGYWN0b3J5SGFsLT5hbGxvY2F0ZUJ1ZmZlcigKICAgICAgICAgICAgICAgICBudW1TYW1wbGVzICogc2l6ZW9mKGludDMyX3QpLCAmaGFsQnVmZmVyKTsKKyNlbmRpZgogICAgICAgICBpZiAocmVzdWx0ICE9IE9LKSByZXR1cm4gcmVzdWx0OwogICAgICAgICBlZmZlY3QtPnNldEluQnVmZmVyKGhhbEJ1ZmZlcik7CiAgICAgICAgIC8vIGF1eGlsaWFyeSBlZmZlY3RzIG91dHB1dCBzYW1wbGVzIHRvIGNoYWluIGlucHV0IGJ1ZmZlciBmb3IgZnVydGhlciBwcm9jZXNzaW5nCkBAIC0xOTU5LDE5ICsyMjcxLDYgQEAKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGR1bXBJbk91dEJ1ZmZlcigKLSAgICAgICAgY2hhciAqZHVtcCwgc2l6ZV90IGR1bXBTaXplLCBib29sIGlzSW5wdXQsIEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZSAqYnVmZmVyKSB7Ci0gICAgaWYgKGJ1ZmZlciA9PSBudWxscHRyKSB7Ci0gICAgICAgIHNucHJpbnRmKGR1bXAsIGR1bXBTaXplLCAiJXAiLCBidWZmZXIpOwotICAgIH0gZWxzZSBpZiAoYnVmZmVyLT5leHRlcm5hbERhdGEoKSAhPSBudWxscHRyKSB7Ci0gICAgICAgIHNucHJpbnRmKGR1bXAsIGR1bXBTaXplLCAiJXAgLT4gJXAiLAotICAgICAgICAgICAgICAgIGlzSW5wdXQgPyBidWZmZXItPmV4dGVybmFsRGF0YSgpIDogYnVmZmVyLT5hdWRpb0J1ZmZlcigpLT5yYXcsCi0gICAgICAgICAgICAgICAgaXNJbnB1dCA/IGJ1ZmZlci0+YXVkaW9CdWZmZXIoKS0+cmF3IDogYnVmZmVyLT5leHRlcm5hbERhdGEoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc25wcmludGYoZHVtcCwgZHVtcFNpemUsICIlcCIsIGJ1ZmZlci0+YXVkaW9CdWZmZXIoKS0+cmF3KTsKLSAgICB9Ci19Ci0KIHZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCiB7CiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CkBAIC0xOTg5LDE1ICsyMjg4LDEzIEBACiAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJcdENvdWxkIG5vdCBsb2NrIG11dGV4OlxuIik7CiAgICAgICAgIH0KIAotICAgICAgICBjaGFyIGluQnVmZmVyU3RyWzY0XSwgb3V0QnVmZmVyU3RyWzY0XTsKLSAgICAgICAgZHVtcEluT3V0QnVmZmVyKGluQnVmZmVyU3RyLCBzaXplb2YoaW5CdWZmZXJTdHIpLCB0cnVlLCBtSW5CdWZmZXIuZ2V0KCkpOwotICAgICAgICBkdW1wSW5PdXRCdWZmZXIob3V0QnVmZmVyU3RyLCBzaXplb2Yob3V0QnVmZmVyU3RyKSwgZmFsc2UsIG1PdXRCdWZmZXIuZ2V0KCkpOwotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdCUtKnMlLSpzICAgQWN0aXZlIHRyYWNrczpcbiIsCi0gICAgICAgICAgICAgICAgKGludClzdHJsZW4oaW5CdWZmZXJTdHIpLCAiSW4gYnVmZmVyICAgICIsCi0gICAgICAgICAgICAgICAgKGludClzdHJsZW4ob3V0QnVmZmVyU3RyKSwgIk91dCBidWZmZXIgICAgICAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdCVzICAgJXMgICAlZFxuIiwgaW5CdWZmZXJTdHIsIG91dEJ1ZmZlclN0ciwgbUFjdGl2ZVRyYWNrQ250KTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBpbkJ1ZmZlclN0ciA9IGR1bXBJbk91dEJ1ZmZlcih0cnVlIC8qIGlzSW5wdXQgKi8sIG1JbkJ1ZmZlcik7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG91dEJ1ZmZlclN0ciA9IGR1bXBJbk91dEJ1ZmZlcihmYWxzZSAvKiBpc0lucHV0ICovLCBtT3V0QnVmZmVyKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiXHQlLSpzJS0qcyAgIEFjdGl2ZSB0cmFja3M6XG4iLAorICAgICAgICAgICAgICAgIChpbnQpaW5CdWZmZXJTdHIuc2l6ZSgpLCAiSW4gYnVmZmVyICAgICIsCisgICAgICAgICAgICAgICAgKGludClvdXRCdWZmZXJTdHIuc2l6ZSgpLCAiT3V0IGJ1ZmZlciAgICAgICIpOworICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJcdCVzICAgJXMgICAlZFxuIiwKKyAgICAgICAgICAgICAgICBpbkJ1ZmZlclN0ci5jX3N0cigpLCBvdXRCdWZmZXJTdHIuY19zdHIoKSwgbUFjdGl2ZVRyYWNrQ250KTsKICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiAKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1FZmZlY3RzOyArK2kpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5oCmluZGV4IGUyOTc5OGIuLjIzMjdiYjkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuaApAQCAtMTY4LDYgKzE2OCwxNCBAQAogICAgIGJvb2wgICAgIG1TdXNwZW5kZWQ7ICAgICAgICAgICAgLy8gZWZmZWN0IGlzIHN1c3BlbmRlZDogdGVtcG9yYXJpbHkgZGlzYWJsZWQgYnkgZnJhbWV3b3JrCiAgICAgYm9vbCAgICAgbU9mZmxvYWRlZDsgICAgICAgICAgICAvLyBlZmZlY3QgaXMgY3VycmVudGx5IG9mZmxvYWRlZCB0byB0aGUgYXVkaW8gRFNQCiAgICAgd3A8QXVkaW9GbGluZ2VyPiAgICBtQXVkaW9GbGluZ2VyOworCisjaWZkZWYgRkxPQVRfRUZGRUNUX0NIQUlOCisgICAgYm9vbCAgICBtU3VwcG9ydHNGbG9hdDsgICAgICAgICAvLyBlZmZlY3Qgc3VwcG9ydHMgZmxvYXQgcHJvY2Vzc2luZworICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4gbUluQ29udmVyc2lvbkJ1ZmZlcjsgIC8vIEJ1ZmZlcnMgZm9yIEhBTCBjb252ZXJzaW9uIGlmIG5lZWRlZC4KKyAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+IG1PdXRDb252ZXJzaW9uQnVmZmVyOworICAgIHVpbnQzMl90IG1JbkNoYW5uZWxDb3VudFJlcXVlc3RlZDsKKyAgICB1aW50MzJfdCBtT3V0Q2hhbm5lbENvdW50UmVxdWVzdGVkOworI2VuZGlmCiB9OwogCiAvLyBUaGUgRWZmZWN0SGFuZGxlIGNsYXNzIGltcGxlbWVudHMgdGhlIElFZmZlY3QgaW50ZXJmYWNlLiBJdCBwcm92aWRlcyByZXNvdXJjZXMKQEAgLTMwOCwxNCArMzE2LDE0IEBACiAgICAgdm9pZCBzZXRJbkJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpIHsKICAgICAgICAgbUluQnVmZmVyID0gYnVmZmVyOwogICAgIH0KLSAgICBpbnQxNl90ICppbkJ1ZmZlcigpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1JbkJ1ZmZlciAhPSAwID8gcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90Kj4obUluQnVmZmVyLT5wdHIoKSkgOiBOVUxMOworICAgIGVmZmVjdF9idWZmZXJfdCAqaW5CdWZmZXIoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtSW5CdWZmZXIgIT0gMCA/IHJlaW50ZXJwcmV0X2Nhc3Q8ZWZmZWN0X2J1ZmZlcl90Kj4obUluQnVmZmVyLT5wdHIoKSkgOiBOVUxMOwogICAgIH0KICAgICB2b2lkIHNldE91dEJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpIHsKICAgICAgICAgbU91dEJ1ZmZlciA9IGJ1ZmZlcjsKICAgICB9Ci0gICAgaW50MTZfdCAqb3V0QnVmZmVyKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbU91dEJ1ZmZlciAhPSAwID8gcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90Kj4obU91dEJ1ZmZlci0+cHRyKCkpIDogTlVMTDsKKyAgICBlZmZlY3RfYnVmZmVyX3QgKm91dEJ1ZmZlcigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1PdXRCdWZmZXIgIT0gMCA/IHJlaW50ZXJwcmV0X2Nhc3Q8ZWZmZWN0X2J1ZmZlcl90Kj4obU91dEJ1ZmZlci0+cHRyKCkpIDogTlVMTDsKICAgICB9CiAKICAgICB2b2lkIGluY1RyYWNrQ250KCkgeyBhbmRyb2lkX2F0b21pY19pbmMoJm1UcmFja0NudCk7IH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5jcHAKaW5kZXggYzEwZmEwNS4uNzliYjlmZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5jcHAKQEAgLTc5LDcgKzc5LDYgQEAKIAogICAgIHVuc2lnbmVkIGk7CiAgICAgZm9yIChpID0gMDsgaSA8IEZhc3RNaXhlclN0YXRlOjpzTWF4RmFzdFRyYWNrczsgKytpKSB7Ci0gICAgICAgIG1GYXN0VHJhY2tOYW1lc1tpXSA9IC0xOwogICAgICAgICBtR2VuZXJhdGlvbnNbaV0gPSAwOwogICAgIH0KICNpZmRlZiBGQVNUX1RIUkVBRF9TVEFUSVNUSUNTCkBAIC0xMzgsOCArMTM3LDYgQEAKIAogdm9pZCBGYXN0TWl4ZXI6Om9uU3RhdGVDaGFuZ2UoKQogewotICAgIC8vIGxvZyB0aGF0IGF1ZGlvIHdhcyB0dXJuZWQgb24vb2ZmCi0gICAgTE9HX0FVRElPX1NUQVRFKCk7CiAgICAgY29uc3QgRmFzdE1peGVyU3RhdGUgKiBjb25zdCBjdXJyZW50ID0gKGNvbnN0IEZhc3RNaXhlclN0YXRlICopIG1DdXJyZW50OwogICAgIGNvbnN0IEZhc3RNaXhlclN0YXRlICogY29uc3QgcHJldmlvdXMgPSAoY29uc3QgRmFzdE1peGVyU3RhdGUgKikgbVByZXZpb3VzOwogICAgIEZhc3RNaXhlckR1bXBTdGF0ZSAqIGNvbnN0IGR1bXBTdGF0ZSA9IChGYXN0TWl4ZXJEdW1wU3RhdGUgKikgbUR1bXBTdGF0ZTsKQEAgLTE5Miw3ICsxODksNyBAQAogICAgICAgICAgICAgLy8gRklYTUUgbmV3IG1heSBibG9jayBmb3IgdW5ib3VuZGVkIHRpbWUgYXQgaW50ZXJuYWwgbXV0ZXggb2YgdGhlIGhlYXAKICAgICAgICAgICAgIC8vICAgICAgIGltcGxlbWVudGF0aW9uOyBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gaGF2ZSBub3JtYWwgbWl4ZXIgYWxsb2NhdGUgZm9yIHVzCiAgICAgICAgICAgICAvLyAgICAgICB0byBhdm9pZCBibG9ja2luZyBoZXJlIGFuZCB0byBwcmV2ZW50IHBvc3NpYmxlIHByaW9yaXR5IGludmVyc2lvbgotICAgICAgICAgICAgbU1peGVyID0gbmV3IEF1ZGlvTWl4ZXIoZnJhbWVDb3VudCwgbVNhbXBsZVJhdGUsIEZhc3RNaXhlclN0YXRlOjpzTWF4RmFzdFRyYWNrcyk7CisgICAgICAgICAgICBtTWl4ZXIgPSBuZXcgQXVkaW9NaXhlcihmcmFtZUNvdW50LCBtU2FtcGxlUmF0ZSk7CiAgICAgICAgICAgICAvLyBGSVhNRSBTZWUgdGhlIG90aGVyIEZJWE1FIGF0IEZhc3RNaXhlcjo6c2V0TkJMb2dXcml0ZXIoKQogICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG1peGVyRnJhbWVTaXplID0gbVNpbmtDaGFubmVsQ291bnQKICAgICAgICAgICAgICAgICAgICAgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKG1NaXhlckJ1ZmZlckZvcm1hdCk7CkBAIC0yMTksMTEgKzIxNiw2IEBACiAgICAgICAgICAgICBtV2FybXVwTnNNYXggPSBMT05HX01BWDsKICAgICAgICAgfQogICAgICAgICBtTWl4ZXJCdWZmZXJTdGF0ZSA9IFVOREVGSU5FRDsKLSNpZiAhTE9HX05ERUJVRwotICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgRmFzdE1peGVyU3RhdGU6OnNNYXhGYXN0VHJhY2tzOyArK2kpIHsKLSAgICAgICAgICAgIG1GYXN0VHJhY2tOYW1lc1tpXSA9IC0xOwotICAgICAgICB9Ci0jZW5kaWYKICAgICAgICAgLy8gd2UgbmVlZCB0byByZWNvbmZpZ3VyZSBhbGwgYWN0aXZlIHRyYWNrcwogICAgICAgICBwcmV2aW91c1RyYWNrTWFzayA9IDA7CiAgICAgICAgIG1GYXN0VHJhY2tzR2VuID0gY3VycmVudC0+bUZhc3RUcmFja3NHZW4gLSAxOwpAQCAtMjM3LDcgKzIyOSw2IEBACiAgICAgZHVtcFN0YXRlLT5tVHJhY2tNYXNrID0gY3VycmVudFRyYWNrTWFzazsKICAgICBpZiAoY3VycmVudC0+bUZhc3RUcmFja3NHZW4gIT0gbUZhc3RUcmFja3NHZW4pIHsKICAgICAgICAgQUxPR19BU1NFUlQobU1peGVyQnVmZmVyICE9IE5VTEwpOwotICAgICAgICBpbnQgbmFtZTsKIAogICAgICAgICAvLyBwcm9jZXNzIHJlbW92ZWQgdHJhY2tzIGZpcnN0IHRvIGF2b2lkIHJ1bm5pbmcgb3V0IG9mIHRyYWNrIG5hbWVzCiAgICAgICAgIHVuc2lnbmVkIHJlbW92ZWRUcmFja3MgPSBwcmV2aW91c1RyYWNrTWFzayAmIH5jdXJyZW50VHJhY2tNYXNrOwpAQCAtMjQ3LDEzICsyMzgsOCBAQAogICAgICAgICAgICAgY29uc3QgRmFzdFRyYWNrKiBmYXN0VHJhY2sgPSAmY3VycmVudC0+bUZhc3RUcmFja3NbaV07CiAgICAgICAgICAgICBBTE9HX0FTU0VSVChmYXN0VHJhY2stPm1CdWZmZXJQcm92aWRlciA9PSBOVUxMKTsKICAgICAgICAgICAgIGlmIChtTWl4ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIG5hbWUgPSBtRmFzdFRyYWNrTmFtZXNbaV07Ci0gICAgICAgICAgICAgICAgQUxPR19BU1NFUlQobmFtZSA+PSAwKTsKLSAgICAgICAgICAgICAgICBtTWl4ZXItPmRlbGV0ZVRyYWNrTmFtZShuYW1lKTsKKyAgICAgICAgICAgICAgICBtTWl4ZXItPmRlc3Ryb3koaSk7CiAgICAgICAgICAgICB9Ci0jaWYgIUxPR19OREVCVUcKLSAgICAgICAgICAgIG1GYXN0VHJhY2tOYW1lc1tpXSA9IC0xOwotI2VuZGlmCiAgICAgICAgICAgICAvLyBkb24ndCByZXNldCB0cmFjayBkdW1wIHN0YXRlLCBzaW5jZSBvdGhlciBzaWRlIGlzIGlnbm9yaW5nIGl0CiAgICAgICAgICAgICBtR2VuZXJhdGlvbnNbaV0gPSBmYXN0VHJhY2stPm1HZW5lcmF0aW9uOwogICAgICAgICB9CkBAIC0yNjUsMTIgKzI1MSwxNyBAQAogICAgICAgICAgICAgYWRkZWRUcmFja3MgJj0gfigxIDw8IGkpOwogICAgICAgICAgICAgY29uc3QgRmFzdFRyYWNrKiBmYXN0VHJhY2sgPSAmY3VycmVudC0+bUZhc3RUcmFja3NbaV07CiAgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyICpidWZmZXJQcm92aWRlciA9IGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyOwotICAgICAgICAgICAgQUxPR19BU1NFUlQoYnVmZmVyUHJvdmlkZXIgIT0gTlVMTCAmJiBtRmFzdFRyYWNrTmFtZXNbaV0gPT0gLTEpOwogICAgICAgICAgICAgaWYgKG1NaXhlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbmFtZSA9IG1NaXhlci0+Z2V0VHJhY2tOYW1lKGZhc3RUcmFjay0+bUNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgIGNvbnN0IGludCBuYW1lID0gaTsgLy8gZm9yIGNsYXJpdHksIGNob29zZSBuYW1lIGFzIGZhc3QgdHJhY2sgaW5kZXguCisgICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbU1peGVyLT5jcmVhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tQ2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1Gb3JtYXQsIEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCk7Ci0gICAgICAgICAgICAgICAgQUxPR19BU1NFUlQobmFtZSA+PSAwKTsKLSAgICAgICAgICAgICAgICBtRmFzdFRyYWNrTmFtZXNbaV0gPSBuYW1lOworICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RhdHVzICE9IE5PX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBjYW5ub3QgY3JlYXRlIHRyYWNrIG5hbWUiCisgICAgICAgICAgICAgICAgICAgICAgICAiICVkLCBtYXNrICUjeCwgZm9ybWF0ICUjeCwgc2Vzc2lvbklkICVkIGluIEF1ZGlvTWl4ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1DaGFubmVsTWFzaywgZmFzdFRyYWNrLT5tRm9ybWF0LCBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpOwogICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0QnVmZmVyUHJvdmlkZXIobmFtZSwgYnVmZmVyUHJvdmlkZXIpOwogICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpNQUlOX0JVRkZFUiwKICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbU1peGVyQnVmZmVyKTsKQEAgLTMwMiw4ICsyOTMsNyBAQAogICAgICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIgKmJ1ZmZlclByb3ZpZGVyID0gZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXI7CiAgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoYnVmZmVyUHJvdmlkZXIgIT0gTlVMTCk7CiAgICAgICAgICAgICAgICAgaWYgKG1NaXhlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWUgPSBtRmFzdFRyYWNrTmFtZXNbaV07Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKG5hbWUgPj0gMCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBuYW1lID0gaTsKICAgICAgICAgICAgICAgICAgICAgbU1peGVyLT5zZXRCdWZmZXJQcm92aWRlcihuYW1lLCBidWZmZXJQcm92aWRlcik7CiAgICAgICAgICAgICAgICAgICAgIGlmIChmYXN0VHJhY2stPm1Wb2x1bWVQcm92aWRlciA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmID0gQXVkaW9NaXhlcjo6VU5JVFlfR0FJTl9GTE9BVDsKQEAgLTMzNiw3ICszMjYsMTMgQEAKIAogdm9pZCBGYXN0TWl4ZXI6Om9uV29yaygpCiB7Ci0gICAgTE9HX0hJU1RfVFMoKTsKKyAgICAvLyBUT0RPOiBwYXNzIGFuIElEIHBhcmFtZXRlciB0byBpbmRpY2F0ZSB3aGljaCB0aW1lIHNlcmllcyB3ZSB3YW50IHRvIHdyaXRlIHRvIGluIE5CTG9nLmNwcAorICAgIC8vIE9yOiBwYXNzIGJvdGggb2YgdGhlc2UgaW50byBhIHNpbmdsZSBjYWxsIHdpdGggYSBib29sZWFuCisgICAgaWYgKG1Jc1dhcm0pIHsKKyAgICAgICAgTE9HX0hJU1RfVFMoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dfQVVESU9fU1RBVEUoKTsKKyAgICB9CiAgICAgY29uc3QgRmFzdE1peGVyU3RhdGUgKiBjb25zdCBjdXJyZW50ID0gKGNvbnN0IEZhc3RNaXhlclN0YXRlICopIG1DdXJyZW50OwogICAgIEZhc3RNaXhlckR1bXBTdGF0ZSAqIGNvbnN0IGR1bXBTdGF0ZSA9IChGYXN0TWl4ZXJEdW1wU3RhdGUgKikgbUR1bXBTdGF0ZTsKICAgICBjb25zdCBGYXN0TWl4ZXJTdGF0ZTo6Q29tbWFuZCBjb21tYW5kID0gbUNvbW1hbmQ7CkBAIC0zNzQsOCArMzcwLDcgQEAKICAgICAgICAgICAgIHBlclRyYWNrVGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSXSA9IHRyYWNrRnJhbWVzV3JpdHRlbjsKICAgICAgICAgICAgIGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyLT5vblRpbWVzdGFtcChwZXJUcmFja1RpbWVzdGFtcCk7CiAKLSAgICAgICAgICAgIGludCBuYW1lID0gbUZhc3RUcmFja05hbWVzW2ldOwotICAgICAgICAgICAgQUxPR19BU1NFUlQobmFtZSA+PSAwKTsKKyAgICAgICAgICAgIGNvbnN0IGludCBuYW1lID0gaTsKICAgICAgICAgICAgIGlmIChmYXN0VHJhY2stPm1Wb2x1bWVQcm92aWRlciAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgZ2Fpbl9taW5pZmxvYXRfcGFja2VkX3QgdmxyID0gZmFzdFRyYWNrLT5tVm9sdW1lUHJvdmlkZXItPmdldFZvbHVtZUxSKCk7CiAgICAgICAgICAgICAgICAgZmxvYXQgdmxmID0gZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19sZWZ0KHZscikpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5oCmluZGV4IDkzMGZhOGQuLjIzNWQyM2YgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmgKQEAgLTU3LDggKzU3LDYgQEAKICAgICBzdGF0aWMgY29uc3QgRmFzdE1peGVyU3RhdGUgc0luaXRpYWw7CiAKICAgICBGYXN0TWl4ZXJTdGF0ZSAgbVByZUlkbGU7ICAgLy8gY29weSBvZiBzdGF0ZSBiZWZvcmUgd2Ugd2VudCBpbnRvIGlkbGUKLSAgICBpbnQgICAgICAgICAgICAgbUZhc3RUcmFja05hbWVzW0Zhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrc107Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZXMgdXNlZCBieSBtaXhlciB0byBpZGVudGlmeSB0cmFja3MKICAgICBpbnQgICAgICAgICAgICAgbUdlbmVyYXRpb25zW0Zhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrc107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxhc3Qgb2JzZXJ2ZWQgbUZhc3RUcmFja3NbaV0ubUdlbmVyYXRpb24KICAgICBOQkFJT19TaW5rKiAgICAgbU91dHB1dFNpbms7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuY3BwCmluZGV4IDY0NzVmMjIuLjJlNGZiOGMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuY3BwCkBAIC03OCw3ICs3OCwxMiBAQAogICAgIHVpbnQzMl90IGJvdW5kcyA9IG1Cb3VuZHM7CiAgICAgdWludDMyX3QgbmV3ZXN0T3BlbiA9IGJvdW5kcyAmIDB4RkZGRjsKICAgICB1aW50MzJfdCBvbGRlc3RDbG9zZWQgPSBib3VuZHMgPj4gMTY7Ci0gICAgdWludDMyX3QgbiA9IChuZXdlc3RPcGVuIC0gb2xkZXN0Q2xvc2VkKSAmIDB4RkZGRjsKKworICAgIC8vdWludDMyX3QgbiA9IChuZXdlc3RPcGVuIC0gb2xkZXN0Q2xvc2VkKSAmIDB4RkZGRjsKKyAgICB1aW50MzJfdCBuOworICAgIF9fYnVpbHRpbl9zdWJfb3ZlcmZsb3cobmV3ZXN0T3Blbiwgb2xkZXN0Q2xvc2VkLCAmbik7CisgICAgbiA9IG4gJiAweEZGRkY7CisKICAgICBpZiAobiA+IG1TYW1wbGluZ04pIHsKICAgICAgICAgQUxPR0UoInRvbyBtYW55IHNhbXBsZXMgJXUiLCBuKTsKICAgICAgICAgbiA9IG1TYW1wbGluZ047CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5oCmluZGV4IDVhNTVjN2EuLjJiZTFlOTEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5oCkBAIC0yMSw3ICsyMSw3IEBACiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8bWVkaWEvRXh0ZW5kZWRBdWRpb0J1ZmZlclByb3ZpZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJBSU8uaD4KLSNpbmNsdWRlIDxtZWRpYS9uYmFpby9OQkxvZy5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL05CTG9nLmg+CiAjaW5jbHVkZSAiRmFzdFRocmVhZFN0YXRlLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkLmNwcAppbmRleCA4NTg2NWI3Li5kYzE1NDg3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWQuY3BwCkBAIC0yOTcsNyArMjk3LDggQEAKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGkgPSBtQm91bmRzICYgKG1EdW1wU3RhdGUtPm1TYW1wbGluZ04gLSAxKTsKICAgICAgICAgICAgICAgICAgICAgbUJvdW5kcyA9IChtQm91bmRzICYgMHhGRkZGMDAwMCkgfCAoKG1Cb3VuZHMgKyAxKSAmIDB4RkZGRik7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtRnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUJvdW5kcyArPSAweDEwMDAwOworICAgICAgICAgICAgICAgICAgICAgICAgLy9tQm91bmRzICs9IDB4MTAwMDA7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fYWRkX292ZXJmbG93KG1Cb3VuZHMsIDB4MTAwMDAsICZtQm91bmRzKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghKG1Cb3VuZHMgJiAobUR1bXBTdGF0ZS0+bVNhbXBsaW5nTiAtIDEpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgbUZ1bGwgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZFN0YXRlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZFN0YXRlLmgKaW5kZXggZjE4Zjg0Ni4uNTRjMGRjNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWRTdGF0ZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkU3RhdGUuaApAQCAtMTksNyArMTksNyBAQAogCiAjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CTG9nLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvTkJMb2cuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTW1hcFRyYWNrcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL01tYXBUcmFja3MuaAppbmRleCAzNjZhMTY0Li42ZjU0NmMzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTW1hcFRyYWNrcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9NbWFwVHJhY2tzLmgKQEAgLTIzLDYgKzIzLDcgQEAKIGNsYXNzIE1tYXBUcmFjayA6IHB1YmxpYyBUcmFja0Jhc2UgewogcHVibGljOgogICAgICAgICAgICAgICAgIE1tYXBUcmFjayhUaHJlYWRCYXNlICp0aHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLApAQCAtNDIsNiArNDMsMTUgQEAKICAgICAgc3RhdGljIHZvaWQgICAgICAgIGFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KTsKICAgICAgICAgICAgIHZvaWQgICAgICAgIGFwcGVuZER1bXAoU3RyaW5nOCYgcmVzdWx0LCBib29sIGFjdGl2ZSk7CiAKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb3RlY3RlZCBieSBNTWFwVGhyZWFkOjptTG9jaworICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0U2lsZW5jZWRfbChib29sIHNpbGVuY2VkKSB7IG1TaWxlbmNlZCA9IHNpbGVuY2VkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TaWxlbmNlZE5vdGlmaWVkID0gZmFsc2U7fQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvdGVjdGVkIGJ5IE1NYXBUaHJlYWQ6Om1Mb2NrCisgICAgICAgICAgICBib29sICAgICAgICBpc1NpbGVuY2VkX2woKSBjb25zdCB7IHJldHVybiBtU2lsZW5jZWQ7IH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb3RlY3RlZCBieSBNTWFwVGhyZWFkOjptTG9jaworICAgICAgICAgICAgYm9vbCAgICAgICAgZ2V0QW5kU2V0U2lsZW5jZWROb3RpZmllZF9sKCkgeyBib29sIHNpbGVuY2VkTm90aWZpZWQgPSBtU2lsZW5jZWROb3RpZmllZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNpbGVuY2VkTm90aWZpZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2lsZW5jZWROb3RpZmllZDsgfQogcHJpdmF0ZToKICAgICBmcmllbmQgY2xhc3MgTW1hcFRocmVhZDsKIApAQCAtNTcsNSArNjcsNyBAQAogICAgIHZpcnR1YWwgdm9pZCBvblRpbWVzdGFtcChjb25zdCBFeHRlbmRlZFRpbWVzdGFtcCAmdGltZXN0YW1wKTsKIAogICAgIHBpZF90IG1QaWQ7CisgICAgYm9vbCAgbVNpbGVuY2VkOyAgICAgICAgICAgIC8vIHByb3RlY3RlZCBieSBNTWFwVGhyZWFkOjptTG9jaworICAgIGJvb2wgIG1TaWxlbmNlZE5vdGlmaWVkOyAgICAvLyBwcm90ZWN0ZWQgYnkgTU1hcFRocmVhZDo6bUxvY2sKIH07ICAvLyBlbmQgb2YgVHJhY2sKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL09XTkVSUyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9PV05FUlMKaW5kZXggNzAzZTRkMi4uZDAyZDllMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL09XTkVSUworKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvT1dORVJTCkBAIC0xLDMgKzEsNCBAQAogaHVuZ2FAZ29vZ2xlLmNvbQogam10cml2aUBnb29nbGUuY29tCiBtbmFnYW5vdkBnb29nbGUuY29tCitna2FzdGVuQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmNwcAppbmRleCAyN2M2ZDM1Li5lNWNiOGEyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuY3BwCkBAIC00OTcsOSArNDk3LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+bVBhdGNoUmVjb3JkLT5idWZmZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+bVBhdGNoUmVjb3JkLT5idWZmZXJTaXplKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSk7Ci0gICAgaWYgKHBhdGNoLT5tUGF0Y2hUcmFjayA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgfQogICAgIHN0YXR1cyA9IHBhdGNoLT5tUGF0Y2hUcmFjay0+aW5pdENoZWNrKCk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICByZXR1cm4gc3RhdHVzOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BsYXliYWNrVHJhY2tzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaAppbmRleCAxYzFhOTg5Li5hNzhiZTk5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaApAQCAtMjUsNiArMjUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2soICBQbGF5YmFja1RocmVhZCAqdGhyZWFkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxDbGllbnQ+JiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLApAQCAtNTEsNiArNTIsMTEgQEAKICAgICAgICAgICAgIHZvaWQgICAgICAgIGZsdXNoKCk7CiAgICAgICAgICAgICB2b2lkICAgICAgICBkZXN0cm95KCk7CiAgICAgICAgICAgICBpbnQgICAgICAgICBuYW1lKCkgY29uc3QgeyByZXR1cm4gbU5hbWU7IH0KKyAgICAgICAgICAgIHZvaWQgICAgICAgIHNldE5hbWUoaW50IG5hbWUpIHsKKyAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1OYW1lID49IDAgJiYgbmFtZSA+PSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzIGJvdGggb2xkIG5hbWUgJWQgYW5kIG5ldyBuYW1lICVkIGFyZSB2YWxpZCIsIF9fZnVuY19fLCBtTmFtZSwgbmFtZSk7CisgICAgICAgICAgICAgICAgbU5hbWUgPSBuYW1lOworICAgICAgICAgICAgfQogCiAgICAgdmlydHVhbCB1aW50MzJfdCAgICBzYW1wbGVSYXRlKCkgY29uc3Q7CiAKQEAgLTY4LDggKzc0LDggQEAKICAgICAgICAgICAgIHN0YXR1c190ICAgIGF0dGFjaEF1eEVmZmVjdChpbnQgRWZmZWN0SWQpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0QXV4QnVmZmVyKGludCBFZmZlY3RJZCwgaW50MzJfdCAqYnVmZmVyKTsKICAgICAgICAgICAgIGludDMyX3QgICAgICphdXhCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtQXV4QnVmZmVyOyB9Ci0gICAgICAgICAgICB2b2lkICAgICAgICBzZXRNYWluQnVmZmVyKGludDE2X3QgKmJ1ZmZlcikgeyBtTWFpbkJ1ZmZlciA9IGJ1ZmZlcjsgfQotICAgICAgICAgICAgaW50MTZfdCAgICAgKm1haW5CdWZmZXIoKSBjb25zdCB7IHJldHVybiBtTWFpbkJ1ZmZlcjsgfQorICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0TWFpbkJ1ZmZlcihlZmZlY3RfYnVmZmVyX3QgKmJ1ZmZlcikgeyBtTWFpbkJ1ZmZlciA9IGJ1ZmZlcjsgfQorICAgICAgICAgICAgZWZmZWN0X2J1ZmZlcl90ICptYWluQnVmZmVyKCkgY29uc3QgeyByZXR1cm4gbU1haW5CdWZmZXI7IH0KICAgICAgICAgICAgIGludCAgICAgICAgIGF1eEVmZmVjdElkKCkgY29uc3QgeyByZXR1cm4gbUF1eEVmZmVjdElkOyB9CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCk7CiAgICAgICAgICAgICB2b2lkICAgICAgICBzaWduYWwoKTsKQEAgLTgyLDExICs4OCwyOCBAQAogICAgIHZpcnR1YWwgYm9vbCAgICAgICAgaXNGYXN0VHJhY2soKSBjb25zdCB7IHJldHVybiAobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkgIT0gMDsgfQogCiAvLyBpbXBsZW1lbnQgdm9sdW1lIGhhbmRsaW5nLgotICAgVm9sdW1lU2hhcGVyOjpTdGF0dXMgYXBwbHlWb2x1bWVTaGFwZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4mIGNvbmZpZ3VyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPiYgb3BlcmF0aW9uKTsKLXNwPFZvbHVtZVNoYXBlcjo6U3RhdGU+IGdldFZvbHVtZVNoYXBlclN0YXRlKGludCBpZCk7Ci0gICAgc3A8Vm9sdW1lSGFuZGxlcj4gICBnZXRWb2x1bWVIYW5kbGVyKCkgeyByZXR1cm4gbVZvbHVtZUhhbmRsZXI7IH0KKyAgICBtZWRpYTo6Vm9sdW1lU2hhcGVyOjpTdGF0dXMgYXBwbHlWb2x1bWVTaGFwZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24+JiBjb25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+JiBvcGVyYXRpb24pOworICAgIHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6OlN0YXRlPiBnZXRWb2x1bWVTaGFwZXJTdGF0ZShpbnQgaWQpOworICAgIHNwPG1lZGlhOjpWb2x1bWVIYW5kbGVyPiAgIGdldFZvbHVtZUhhbmRsZXIoKSB7IHJldHVybiBtVm9sdW1lSGFuZGxlcjsgfQorICAgIC8qKiBTZXQgdGhlIGNvbXB1dGVkIG5vcm1hbGl6ZWQgZmluYWwgdm9sdW1lIG9mIHRoZSB0cmFjay4KKyAgICAgKiAhbWFzdGVyTXV0ZSAqIG1hc3RlclZvbHVtZSAqIHN0cmVhbVZvbHVtZSAqIGF2ZXJhZ2VMUlZvbHVtZSAqLworICAgIHZvaWQgICAgICAgICAgICAgICAgc2V0RmluYWxWb2x1bWUoZmxvYXQgdm9sdW1lKTsKKyAgICBmbG9hdCAgICAgICAgICAgICAgIGdldEZpbmFsVm9sdW1lKCkgY29uc3QgeyByZXR1cm4gbUZpbmFsVm9sdW1lOyB9CisKKyAgICAvKiogQHJldHVybiB0cnVlIGlmIHRoZSB0cmFjayBoYXMgY2hhbmdlZCAobWV0YWRhdGEgb3Igdm9sdW1lKSBzaW5jZQorICAgICAqICAgICAgICAgIHRoZSBsYXN0IHRpbWUgdGhpcyBmdW5jdGlvbiB3YXMgY2FsbGVkLAorICAgICAqICAgICAgICAgIHRydWUgaWYgdGhpcyBmdW5jdGlvbiB3YXMgbmV2ZXIgY2FsbGVkIHNpbmNlIHRoZSB0cmFjayBjcmVhdGlvbiwKKyAgICAgKiAgICAgICAgICBmYWxzZSBvdGhlcndpc2UuCisgICAgICogIFRocmVhZCBzYWZlLgorICAgICAqLworICAgIGJvb2wgICAgICAgICAgICByZWFkQW5kQ2xlYXJIYXNDaGFuZ2VkKCkgeyByZXR1cm4gIW1DaGFuZ2VOb3RpZmllZC50ZXN0X2FuZF9zZXQoKTsgfQorCisgICAgdXNpbmcgU291cmNlTWV0YWRhdGFzID0gc3RkOjp2ZWN0b3I8cGxheWJhY2tfdHJhY2tfbWV0YWRhdGFfdD47CisgICAgdXNpbmcgTWV0YWRhdGFJbnNlcnRlciA9IHN0ZDo6YmFja19pbnNlcnRfaXRlcmF0b3I8U291cmNlTWV0YWRhdGFzPjsKKyAgICAvKiogQ29weSB0aGUgdHJhY2sgbWV0YWRhdGEgaW4gdGhlIHByb3ZpZGVkIGl0ZXJhdG9yLiBUaHJlYWQgc2FmZS4gKi8KKyAgICB2aXJ0dWFsIHZvaWQgICAgY29weU1ldGFkYXRhVG8oTWV0YWRhdGFJbnNlcnRlciYgYmFja0luc2VydGVyKSBjb25zdDsKIAogcHJvdGVjdGVkOgogICAgIC8vIGZvciBudW1lcm91cwpAQCAtMTI3LDYgKzE1MCw4IEBACiAgICAgYm9vbCBwcmVzZW50YXRpb25Db21wbGV0ZShpbnQ2NF90IGZyYW1lc1dyaXR0ZW4sIHNpemVfdCBhdWRpb0hhbEZyYW1lcyk7CiAgICAgdm9pZCBzaWduYWxDbGllbnRGbGFnKGludDMyX3QgZmxhZyk7CiAKKyAgICAvKiogU2V0IHRoYXQgYSBtZXRhZGF0YSBoYXMgY2hhbmdlZCBhbmQgbmVlZHMgdG8gYmUgbm90aWZpZWQgdG8gYmFja2VuZC4gVGhyZWFkIHNhZmUuICovCisgICAgdm9pZCBzZXRNZXRhZGF0YUhhc0NoYW5nZWQoKSB7IG1DaGFuZ2VOb3RpZmllZC5jbGVhcigpOyB9CiBwdWJsaWM6CiAgICAgdm9pZCB0cmlnZ2VyRXZlbnRzKEF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QgdHlwZSk7CiAgICAgdmlydHVhbCB2b2lkIGludmFsaWRhdGUoKTsKQEAgLTE0NiwxMSArMTcxLDkgQEAKIAogICAgIGJvb2wgICAgICAgICAgICAgICAgbVJlc2V0RG9uZTsKICAgICBjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90IG1TdHJlYW1UeXBlOwotICAgIGludCAgICAgICAgICAgICAgICAgbU5hbWU7ICAgICAgLy8gdHJhY2sgbmFtZSBvbiB0aGUgbm9ybWFsIG1peGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkIHN0YXRpY2FsbHkgYXQgdHJhY2sgY3JlYXRpb24gdGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBpcyBldmVuIGFsbG9jYXRlZCAodGhvdWdoIHVudXNlZCkgZm9yIGZhc3QgdHJhY2tzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSBkb24ndCBhbGxvY2F0ZSB0cmFjayBuYW1lIGZvciBmYXN0IHRyYWNrcwotICAgIGludDE2X3QgICAgICAgICAgICAgKm1NYWluQnVmZmVyOworICAgIGludCAgICAgICAgICAgICAgICAgbU5hbWU7CisgICAgZWZmZWN0X2J1ZmZlcl90ICAgICAqbU1haW5CdWZmZXI7CisKICAgICBpbnQzMl90ICAgICAgICAgICAgICptQXV4QnVmZmVyOwogICAgIGludCAgICAgICAgICAgICAgICAgbUF1eEVmZmVjdElkOwogICAgIGJvb2wgICAgICAgICAgICAgICAgbUhhc1ZvbHVtZUNvbnRyb2xsZXI7CkBAIC0xNjMsNyArMTg2LDcgQEAKIAogICAgIEV4dGVuZGVkVGltZXN0YW1wICBtU2lua1RpbWVzdGFtcDsKIAotICAgIHNwPFZvbHVtZUhhbmRsZXI+ICBtVm9sdW1lSGFuZGxlcjsgLy8gaGFuZGxlcyBtdWx0aXBsZSBWb2x1bWVTaGFwZXIgY29uZmlncyBhbmQgb3BlcmF0aW9ucworICAgIHNwPG1lZGlhOjpWb2x1bWVIYW5kbGVyPiAgbVZvbHVtZUhhbmRsZXI7IC8vIGhhbmRsZXMgbXVsdGlwbGUgVm9sdW1lU2hhcGVyIGNvbmZpZ3MgYW5kIG9wZXJhdGlvbnMKIAogcHJpdmF0ZToKICAgICAvLyBUaGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgb25seSBmb3IgZmFzdCB0cmFja3MsIGFuZCBzaG91bGQgYmUgaW4gYSBzdWJjbGFzcwpAQCAtMTc4LDEwICsyMDEsMTMgQEAKICAgICB2b2xhdGlsZSBmbG9hdCAgICAgIG1DYWNoZWRWb2x1bWU7ICAvLyBjb21iaW5lZCBtYXN0ZXIgdm9sdW1lIGFuZCBzdHJlYW0gdHlwZSB2b2x1bWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gJ3ZvbGF0aWxlJyBtZWFucyBhY2Nlc3NlZCB3aXRob3V0IGxvY2sgb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiYXJyaWVyLCBidXQgaXMgcmVhZC93cml0dGVuIGF0b21pY2FsbHkKKyAgICBmbG9hdCAgICAgICAgICAgICAgIG1GaW5hbFZvbHVtZTsgLy8gY29tYmluZSBtYXN0ZXIgdm9sdW1lLCBzdHJlYW0gdHlwZSB2b2x1bWUgYW5kIHRyYWNrIHZvbHVtZQogICAgIHNwPEF1ZGlvVHJhY2tTZXJ2ZXJQcm94eT4gIG1BdWRpb1RyYWNrU2VydmVyUHJveHk7CiAgICAgYm9vbCAgICAgICAgICAgICAgICBtUmVzdW1lVG9TdG9wcGluZzsgLy8gdHJhY2sgd2FzIHBhdXNlZCBpbiBzdG9wcGluZyBzdGF0ZS4KICAgICBib29sICAgICAgICAgICAgICAgIG1GbHVzaEh3UGVuZGluZzsgLy8gdHJhY2sgcmVxdWVzdHMgZm9yIHRocmVhZCBmbHVzaAogICAgIGF1ZGlvX291dHB1dF9mbGFnc190IG1GbGFnczsKKyAgICAvLyBJZiB0aGUgbGFzdCB0cmFjayBjaGFuZ2Ugd2FzIG5vdGlmaWVkIHRvIHRoZSBjbGllbnQgd2l0aCByZWFkQW5kQ2xlYXJIYXNDaGFuZ2VkCisgICAgc3RkOjphdG9taWNfZmxhZyAgICAgbUNoYW5nZU5vdGlmaWVkID0gQVRPTUlDX0ZMQUdfSU5JVDsKIH07ICAvLyBlbmQgb2YgVHJhY2sKIAogCkBAIC0yMTIsOCArMjM4LDExIEBACiAgICAgICAgICAgICBib29sICAgICAgICBpc0FjdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIG1BY3RpdmU7IH0KICAgICBjb25zdCB3cDxUaHJlYWRCYXNlPiYgdGhyZWFkKCkgY29uc3QgeyByZXR1cm4gbVRocmVhZDsgfQogCi1wcml2YXRlOgorICAgICAgICAgICAgdm9pZCAgICAgICAgY29weU1ldGFkYXRhVG8oTWV0YWRhdGFJbnNlcnRlciYgYmFja0luc2VydGVyKSBjb25zdCBvdmVycmlkZTsKKyAgICAvKiogU2V0IHRoZSBtZXRhZGF0YXMgb2YgdGhlIHVwc3RyZWFtIHRyYWNrcy4gVGhyZWFkIHNhZmUuICovCisgICAgICAgICAgICB2b2lkICAgICAgICBzZXRNZXRhZGF0YXMoY29uc3QgU291cmNlTWV0YWRhdGFzJiBtZXRhZGF0YXMpOwogCitwcml2YXRlOgogICAgIHN0YXR1c190ICAgICAgICAgICAgb2J0YWluQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHdhaXRUaW1lTXMpOwogICAgIHZvaWQgICAgICAgICAgICAgICAgY2xlYXJCdWZmZXJRdWV1ZSgpOwpAQCAtMjI4LDYgKzI1NywyMCBAQAogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZlOwogICAgIER1cGxpY2F0aW5nVGhyZWFkKiBjb25zdCAgICBtU291cmNlVGhyZWFkOyAvLyBmb3Igd2FpdFRpbWVNcygpIGluIHdyaXRlKCkKICAgICBzcDxBdWRpb1RyYWNrQ2xpZW50UHJveHk+ICAgbUNsaWVudFByb3h5OworICAgIC8qKiBBdHRyaWJ1dGVzIG9mIHRoZSBzb3VyY2UgdHJhY2tzLgorICAgICAqCisgICAgICogVGhpcyBtZW1iZXIgbXVzdCBiZSBhY2Nlc3NlZCB3aXRoIG1UcmFja01ldGFkYXRhc011dGV4IHRha2VuLgorICAgICAqIFRoZXJlIGlzIG9uZSB3cml0ZXIgKGR1cGxpY2F0aW5nIHRocmVhZCkgYW5kIG9uZSByZWFkZXIgKGRvd25zdHJlYW0gbWl4ZXIpLgorICAgICAqCisgICAgICogVGhhdCBtZWFucyB0aGF0IHRoZSBkdXBsaWNhdGluZyB0aHJlYWQgY2FuIGJsb2NrIHRoZSBkb3duc3RyZWFtIG1peGVyCisgICAgICogdGhyZWFkIGFuZCB2aWNlIHZlcnNhIGZvciB0aGUgdGltZSBvZiB0aGUgY29weS4KKyAgICAgKiBJZiB0aGlzIGJlY29tZXMgYW4gaXNzdWUsIHRoZSBtZXRhZGF0YSBjb3VsZCBiZSBzdG9yZWQgaW4gYW4gYXRvbWljIHJhdyBwb2ludGVyLAorICAgICAqIGFuZCBhIGV4Y2hhbmdlIHdpdGggbnVsbHB0ciBhbmQgZGVsZXRlIGNhbiBiZSB1c2VkLgorICAgICAqIEFsdGVybmF0aXZlbHkgYSByZWFkLWNvcHktdXBkYXRlIG1pZ2h0IGJlIGltcGxlbWVudGVkLgorICAgICAqLworICAgIFNvdXJjZU1ldGFkYXRhcyBtVHJhY2tNZXRhZGF0YXM7CisgICAgLyoqIFByb3RlY3RzIG1UcmFja01ldGFkYXRhcyBhZ2FpbnN0IGNvbmN1cnJlbnQgYWNjZXNzLiAqLworICAgIG11dGFibGUgc3RkOjptdXRleCBtVHJhY2tNZXRhZGF0YXNNdXRleDsKIH07ICAvLyBlbmQgb2YgT3V0cHV0VHJhY2sKIAogLy8gcGxheWJhY2sgdHJhY2ssIHVzZWQgYnkgUGF0Y2hQYW5lbApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1JlY29yZFRyYWNrcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1JlY29yZFRyYWNrcy5oCmluZGV4IGY4ZGE3ODAuLmZjMmRiYmIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9SZWNvcmRUcmFja3MuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUmVjb3JkVHJhY2tzLmgKQEAgLTI0LDYgKzI0LDcgQEAKIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICAgIFJlY29yZFRyYWNrKFJlY29yZFRocmVhZCAqdGhyZWFkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxDbGllbnQ+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKQEAgLTYzLDYgKzY0LDExIEBACiAKICAgICB2aXJ0dWFsIGJvb2wgICAgICAgIGlzRmFzdFRyYWNrKCkgY29uc3QgeyByZXR1cm4gKG1GbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfRkFTVCkgIT0gMDsgfQogCisgICAgICAgICAgICB2b2lkICAgICAgICBzZXRTaWxlbmNlZChib29sIHNpbGVuY2VkKSB7IGlmICghaXNQYXRjaFRyYWNrKCkpIG1TaWxlbmNlZCA9IHNpbGVuY2VkOyB9CisgICAgICAgICAgICBib29sICAgICAgICBpc1NpbGVuY2VkKCkgY29uc3QgeyByZXR1cm4gbVNpbGVuY2VkOyB9CisKKyAgICAgICAgICAgIHN0YXR1c190ICAgIGdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKTsKKwogcHJpdmF0ZToKICAgICBmcmllbmQgY2xhc3MgQXVkaW9GbGluZ2VyOyAgLy8gZm9yIG1TdGF0ZQogCkBAIC05MSw2ICs5Nyw4IEBACiAgICAgICAgICAgICAvLyB1c2VkIGJ5IHRoZSByZWNvcmQgdGhyZWFkIHRvIGNvbnZlcnQgZnJhbWVzIHRvIHByb3BlciBkZXN0aW5hdGlvbiBmb3JtYXQKICAgICAgICAgICAgIFJlY29yZEJ1ZmZlckNvbnZlcnRlciAgICAgICAgICAgICAgKm1SZWNvcmRCdWZmZXJDb252ZXJ0ZXI7CiAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190ICAgICAgICAgICAgICAgIG1GbGFnczsKKworICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2lsZW5jZWQ7CiB9OwogCiAvLyBwbGF5YmFjayB0cmFjaywgdXNlZCBieSBQYXRjaFBhbmVsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5jcHAKaW5kZXggYzEwNDRlZi4uYWEyNjdlYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmNwcApAQCAtMzAsNiArMzAsOCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3N0YXRpYyBjb25zdCBTdHJpbmcxNiBzQW5kcm9pZFBlcm1pc3Npb25SZWNvcmRBdWRpbygiYW5kcm9pZC5wZXJtaXNzaW9uLlJFQ09SRF9BVURJTyIpOworCiAvLyBOb3QgdmFsaWQgdW50aWwgaW5pdGlhbGl6ZWQgYnkgQXVkaW9GbGluZ2VyIGNvbnN0cnVjdG9yLiAgSXQgd291bGQgaGF2ZSB0byBiZQogLy8gcmUtaW5pdGlhbGl6ZWQgaWYgdGhlIHByb2Nlc3MgY29udGFpbmluZyBBdWRpb0ZsaW5nZXIgc2VydmljZSBmb3JrcyAod2hpY2ggaXQgZG9lc24ndCkuCiAvLyBUaGlzIGlzIG9mdGVuIHVzZWQgdG8gdmFsaWRhdGUgYmluZGVyIGludGVyZmFjZSBjYWxscyB3aXRoaW4gYXVkaW9zZXJ2ZXIKQEAgLTQ4LDI2ICs1MCwxMSBAQAogICAgIH0KIH0KIAotYm9vbCByZWNvcmRpbmdBbGxvd2VkKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsIHVpZF90IHVpZCkgewotICAgIC8vIHdlJ3JlIGFsd2F5cyBPSy4KLSAgICBpZiAoZ2V0cGlkX2NhY2hlZCA9PSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpIHJldHVybiB0cnVlOwotCi0gICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNSZWNvcmRBdWRpbygiYW5kcm9pZC5wZXJtaXNzaW9uLlJFQ09SRF9BVURJTyIpOwotCi0gICAgLy8gV2Ugc3BlY2lmeSBhIHBpZCBhbmQgdWlkIGhlcmUgYXMgbWVkaWFzZXJ2ZXIgKGFrYSBNZWRpYVJlY29yZGVyIG9yIFN0YWdlRnJpZ2h0UmVjb3JkZXIpCi0gICAgLy8gbWF5IG9wZW4gYSByZWNvcmQgdHJhY2sgb24gYmVoYWxmIG9mIGEgY2xpZW50LiAgTm90ZSB0aGF0IHBpZCBtYXkgYmUgYSB0aWQuCi0gICAgLy8gSU1QT1JUQU5UOiBEb24ndCB1c2UgUGVybWlzc2lvbkNhY2hlIC0gYSBydW50aW1lIHBlcm1pc3Npb24gYW5kIG1heSBjaGFuZ2UuCi0gICAgY29uc3QgYm9vbCBvayA9IGNoZWNrUGVybWlzc2lvbihzUmVjb3JkQXVkaW8sIHBpZCwgdWlkKTsKLSAgICBpZiAoIW9rKSB7Ci0gICAgICAgIEFMT0dFKCJSZXF1ZXN0IHJlcXVpcmVzIGFuZHJvaWQucGVybWlzc2lvbi5SRUNPUkRfQVVESU8iKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworc3RhdGljIFN0cmluZzE2IHJlc29sdmVDYWxsaW5nUGFja2FnZShQZXJtaXNzaW9uQ29udHJvbGxlciYgcGVybWlzc2lvbkNvbnRyb2xsZXIsCisgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCB1aWRfdCB1aWQpIHsKKyAgICBpZiAob3BQYWNrYWdlTmFtZS5zaXplKCkgPiAwKSB7CisgICAgICAgIHJldHVybiBvcFBhY2thZ2VOYW1lOwogICAgIH0KLQotICAgIC8vIFRvIHBlcm1pdCBjb21tYW5kLWxpbmUgbmF0aXZlIHRlc3RzCi0gICAgaWYgKHVpZCA9PSBBSURfUk9PVCkgcmV0dXJuIHRydWU7Ci0KLSAgICBTdHJpbmcxNiBjaGVja2VkT3BQYWNrYWdlTmFtZSA9IG9wUGFja2FnZU5hbWU7Ci0KICAgICAvLyBJbiBzb21lIGNhc2VzIHRoZSBjYWxsaW5nIGNvZGUgaGFzIG5vIGFjY2VzcyB0byB0aGUgcGFja2FnZSBpdCBydW5zIHVuZGVyLgogICAgIC8vIEZvciBleGFtcGxlLCBjb2RlIHVzaW5nIHRoZSB3aWxoZWxtIGZyYW1ld29yaydzIE9wZW5TTC1FUyBBUElzLiBJbiB0aGlzCiAgICAgLy8gY2FzZSB3ZSB3aWxsIGdldCB0aGUgcGFja2FnZXMgZm9yIHRoZSBjYWxsaW5nIFVJRCBhbmQgcGljayB0aGUgZmlyc3Qgb25lCkBAIC03NSw0MCArNjIsODkgQEAKICAgICAvLyBhcyBmb3IgbGVnYWN5IGFwcHMgd2Ugd2lsbCB0b2dnbGUgdGhlIGFwcCBvcCBmb3IgYWxsIHBhY2thZ2VzIGluIHRoZSBVSUQuCiAgICAgLy8gVGhlIGNhdmVhdCBpcyB0aGF0IHRoZSBvcGVyYXRpb24gbWF5IGJlIGF0dHJpYnV0ZWQgdG8gdGhlIHdyb25nIHBhY2thZ2UgYW5kCiAgICAgLy8gc3RhdHMgYmFzZWQgb24gYXBwIG9wcyBtYXkgYmUgc2xpZ2h0bHkgb2ZmLgotICAgIGlmIChjaGVja2VkT3BQYWNrYWdlTmFtZS5zaXplKCkgPD0gMCkgewotICAgICAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7Ci0gICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJwZXJtaXNzaW9uIikpOwotICAgICAgICBpZiAoYmluZGVyID09IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJDYW5ub3QgZ2V0IHBlcm1pc3Npb24gc2VydmljZSIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9CisgICAgVmVjdG9yPFN0cmluZzE2PiBwYWNrYWdlczsKKyAgICBwZXJtaXNzaW9uQ29udHJvbGxlci5nZXRQYWNrYWdlc0ZvclVpZCh1aWQsIHBhY2thZ2VzKTsKKyAgICBpZiAocGFja2FnZXMuaXNFbXB0eSgpKSB7CisgICAgICAgIEFMT0dFKCJObyBwYWNrYWdlcyBmb3IgdWlkICVkIiwgdWlkKTsKKyAgICAgICAgcmV0dXJuIG9wUGFja2FnZU5hbWU7IC8vIGVtcHR5IHN0cmluZworICAgIH0KKyAgICByZXR1cm4gcGFja2FnZXNbMF07Cit9CiAKLSAgICAgICAgc3A8SVBlcm1pc3Npb25Db250cm9sbGVyPiBwZXJtQ3RybCA9IGludGVyZmFjZV9jYXN0PElQZXJtaXNzaW9uQ29udHJvbGxlcj4oYmluZGVyKTsKLSAgICAgICAgVmVjdG9yPFN0cmluZzE2PiBwYWNrYWdlczsKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0F1ZGlvU2VydmVyT3JSb290KHVpZF90IHVpZCkgeworICAgIC8vIEFJRF9ST09UIGlzIE9LIGZvciBjb21tYW5kLWxpbmUgdGVzdHMuICBOYXRpdmUgdW5mb3JrZWQgYXVkaW9zZXJ2ZXIgYWx3YXlzIE9LLgorICAgIHJldHVybiB1aWQgPT0gQUlEX1JPT1QgfHwgdWlkID09IEFJRF9BVURJT1NFUlZFUiA7Cit9CiAKLSAgICAgICAgcGVybUN0cmwtPmdldFBhY2thZ2VzRm9yVWlkKHVpZCwgcGFja2FnZXMpOworc3RhdGljIGJvb2wgY2hlY2tSZWNvcmRpbmdJbnRlcm5hbChjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgcGlkX3QgcGlkLAorICAgICAgICB1aWRfdCB1aWQsIGJvb2wgc3RhcnQpIHsKKyAgICAvLyBPa2F5IHRvIG5vdCB0cmFjayBpbiBhcHAgb3BzIGFzIGF1ZGlvIHNlcnZlciBpcyB1cyBhbmQgaWYKKyAgICAvLyBkZXZpY2UgaXMgcm9vdGVkIHNlY3VyaXR5IG1vZGVsIGlzIGNvbnNpZGVyZWQgY29tcHJvbWlzZWQuCisgICAgaWYgKGlzQXVkaW9TZXJ2ZXJPclJvb3QodWlkKSkgcmV0dXJuIHRydWU7CiAKLSAgICAgICAgaWYgKHBhY2thZ2VzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgQUxPR0UoIk5vIHBhY2thZ2VzIGZvciBjYWxsaW5nIFVJRCIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGNoZWNrZWRPcFBhY2thZ2VOYW1lID0gcGFja2FnZXNbMF07CisgICAgLy8gV2Ugc3BlY2lmeSBhIHBpZCBhbmQgdWlkIGhlcmUgYXMgbWVkaWFzZXJ2ZXIgKGFrYSBNZWRpYVJlY29yZGVyIG9yIFN0YWdlRnJpZ2h0UmVjb3JkZXIpCisgICAgLy8gbWF5IG9wZW4gYSByZWNvcmQgdHJhY2sgb24gYmVoYWxmIG9mIGEgY2xpZW50LiAgTm90ZSB0aGF0IHBpZCBtYXkgYmUgYSB0aWQuCisgICAgLy8gSU1QT1JUQU5UOiBET04nVCBVU0UgUGVybWlzc2lvbkNhY2hlIC0gUlVOVElNRSBQRVJNSVNTSU9OUyBDSEFOR0UuCisgICAgUGVybWlzc2lvbkNvbnRyb2xsZXIgcGVybWlzc2lvbkNvbnRyb2xsZXI7CisgICAgY29uc3QgYm9vbCBvayA9IHBlcm1pc3Npb25Db250cm9sbGVyLmNoZWNrUGVybWlzc2lvbihzQW5kcm9pZFBlcm1pc3Npb25SZWNvcmRBdWRpbywgcGlkLCB1aWQpOworICAgIGlmICghb2spIHsKKyAgICAgICAgQUxPR0UoIlJlcXVlc3QgcmVxdWlyZXMgJXMiLCBTdHJpbmc4KHNBbmRyb2lkUGVybWlzc2lvblJlY29yZEF1ZGlvKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFN0cmluZzE2IHJlc29sdmVkT3BQYWNrYWdlTmFtZSA9IHJlc29sdmVDYWxsaW5nUGFja2FnZSgKKyAgICAgICAgICAgIHBlcm1pc3Npb25Db250cm9sbGVyLCBvcFBhY2thZ2VOYW1lLCB1aWQpOworICAgIGlmIChyZXNvbHZlZE9wUGFja2FnZU5hbWUuc2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIEFwcE9wc01hbmFnZXIgYXBwT3BzOwotICAgIGlmIChhcHBPcHMubm90ZU9wKEFwcE9wc01hbmFnZXI6Ok9QX1JFQ09SRF9BVURJTywgdWlkLCBjaGVja2VkT3BQYWNrYWdlTmFtZSkKLSAgICAgICAgICAgICE9IEFwcE9wc01hbmFnZXI6Ok1PREVfQUxMT1dFRCkgewotICAgICAgICBBTE9HRSgiUmVxdWVzdCBkZW5pZWQgYnkgYXBwIG9wIE9QX1JFQ09SRF9BVURJTyIpOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgY29uc3QgaW50MzJfdCBvcCA9IGFwcE9wcy5wZXJtaXNzaW9uVG9PcENvZGUoc0FuZHJvaWRQZXJtaXNzaW9uUmVjb3JkQXVkaW8pOworICAgIGlmIChzdGFydCkgeworICAgICAgICBpZiAoYXBwT3BzLnN0YXJ0T3BOb1Rocm93KG9wLCB1aWQsIHJlc29sdmVkT3BQYWNrYWdlTmFtZSwgLypzdGFydElmTW9kZURlZmF1bHQqLyBmYWxzZSkKKyAgICAgICAgICAgICAgICAhPSBBcHBPcHNNYW5hZ2VyOjpNT0RFX0FMTE9XRUQpIHsKKyAgICAgICAgICAgIEFMT0dFKCJSZXF1ZXN0IGRlbmllZCBieSBhcHAgb3A6ICVkIiwgb3ApOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGFwcE9wcy5ub3RlT3Aob3AsIHVpZCwgcmVzb2x2ZWRPcFBhY2thZ2VOYW1lKSAhPSBBcHBPcHNNYW5hZ2VyOjpNT0RFX0FMTE9XRUQpIHsKKyAgICAgICAgICAgIEFMT0dFKCJSZXF1ZXN0IGRlbmllZCBieSBhcHAgb3A6ICVkIiwgb3ApOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKK2Jvb2wgcmVjb3JkaW5nQWxsb3dlZChjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgcGlkX3QgcGlkLCB1aWRfdCB1aWQpIHsKKyAgICByZXR1cm4gY2hlY2tSZWNvcmRpbmdJbnRlcm5hbChvcFBhY2thZ2VOYW1lLCBwaWQsIHVpZCwgLypzdGFydCovIGZhbHNlKTsKK30KKworYm9vbCBzdGFydFJlY29yZGluZyhjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgcGlkX3QgcGlkLCB1aWRfdCB1aWQpIHsKKyAgICAgcmV0dXJuIGNoZWNrUmVjb3JkaW5nSW50ZXJuYWwob3BQYWNrYWdlTmFtZSwgcGlkLCB1aWQsIC8qc3RhcnQqLyB0cnVlKTsKK30KKwordm9pZCBmaW5pc2hSZWNvcmRpbmcoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHVpZF90IHVpZCkgeworICAgIC8vIE9rYXkgdG8gbm90IHRyYWNrIGluIGFwcCBvcHMgYXMgYXVkaW8gc2VydmVyIGlzIHVzIGFuZCBpZgorICAgIC8vIGRldmljZSBpcyByb290ZWQgc2VjdXJpdHkgbW9kZWwgaXMgY29uc2lkZXJlZCBjb21wcm9taXNlZC4KKyAgICBpZiAoaXNBdWRpb1NlcnZlck9yUm9vdCh1aWQpKSByZXR1cm47CisKKyAgICBQZXJtaXNzaW9uQ29udHJvbGxlciBwZXJtaXNzaW9uQ29udHJvbGxlcjsKKyAgICBTdHJpbmcxNiByZXNvbHZlZE9wUGFja2FnZU5hbWUgPSByZXNvbHZlQ2FsbGluZ1BhY2thZ2UoCisgICAgICAgICAgICBwZXJtaXNzaW9uQ29udHJvbGxlciwgb3BQYWNrYWdlTmFtZSwgdWlkKTsKKyAgICBpZiAocmVzb2x2ZWRPcFBhY2thZ2VOYW1lLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBcHBPcHNNYW5hZ2VyIGFwcE9wczsKKyAgICBjb25zdCBpbnQzMl90IG9wID0gYXBwT3BzLnBlcm1pc3Npb25Ub09wQ29kZShzQW5kcm9pZFBlcm1pc3Npb25SZWNvcmRBdWRpbyk7CisgICAgYXBwT3BzLmZpbmlzaE9wKG9wLCB1aWQsIHJlc29sdmVkT3BQYWNrYWdlTmFtZSk7Cit9CisKIGJvb2wgY2FwdHVyZUF1ZGlvT3V0cHV0QWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCkgewogICAgIGlmIChnZXRwaWRfY2FjaGVkID09IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSkgcmV0dXJuIHRydWU7CiAgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNDYXB0dXJlQXVkaW9PdXRwdXQoImFuZHJvaWQucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX09VVFBVVCIpOwotICAgIGJvb2wgb2sgPSBjaGVja1Blcm1pc3Npb24oc0NhcHR1cmVBdWRpb091dHB1dCwgcGlkLCB1aWQpOworICAgIGJvb2wgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrUGVybWlzc2lvbihzQ2FwdHVyZUF1ZGlvT3V0cHV0LCBwaWQsIHVpZCk7CiAgICAgaWYgKCFvaykgQUxPR0UoIlJlcXVlc3QgcmVxdWlyZXMgYW5kcm9pZC5wZXJtaXNzaW9uLkNBUFRVUkVfQVVESU9fT1VUUFVUIik7CiAgICAgcmV0dXJuIG9rOwogfQpAQCAtMTUzLDQgKzE4OSwxMSBAQAogICAgIHJldHVybiBvazsKIH0KIAorYm9vbCBtb2RpZnlQaG9uZVN0YXRlQWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCkgeworICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzTW9kaWZ5UGhvbmVTdGF0ZSgiYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9QSE9ORV9TVEFURSIpOworICAgIGJvb2wgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrUGVybWlzc2lvbihzTW9kaWZ5UGhvbmVTdGF0ZSwgcGlkLCB1aWQpOworICAgIGlmICghb2spIEFMT0dFKCJSZXF1ZXN0IHJlcXVpcmVzIGFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfUEhPTkVfU1RBVEUiKTsKKyAgICByZXR1cm4gb2s7Cit9CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5oCmluZGV4IDA0Y2I5Y2QuLmY0NWFkYTEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuaApAQCAtMTYsMTQgKzE2LDE5IEBACiAKICNpbmNsdWRlIDx1bmlzdGQuaD4KIAorI2luY2x1ZGUgPGJpbmRlci9QZXJtaXNzaW9uQ29udHJvbGxlci5oPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGV4dGVybiBwaWRfdCBnZXRwaWRfY2FjaGVkOwogYm9vbCBpc1RydXN0ZWRDYWxsaW5nVWlkKHVpZF90IHVpZCk7CiBib29sIHJlY29yZGluZ0FsbG93ZWQoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHBpZF90IHBpZCwgdWlkX3QgdWlkKTsKK2Jvb2wgc3RhcnRSZWNvcmRpbmcoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHBpZF90IHBpZCwgdWlkX3QgdWlkKTsKK3ZvaWQgZmluaXNoUmVjb3JkaW5nKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCB1aWRfdCB1aWQpOwogYm9vbCBjYXB0dXJlQXVkaW9PdXRwdXRBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKTsKIGJvb2wgY2FwdHVyZUhvdHdvcmRBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKTsKIGJvb2wgc2V0dGluZ3NBbGxvd2VkKCk7CiBib29sIG1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKTsKIGJvb2wgZHVtcEFsbG93ZWQoKTsKK2Jvb2wgbW9kaWZ5UGhvbmVTdGF0ZUFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwCmluZGV4IGUyMDJjYTQuLmRjYWQ4NjYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAKQEAgLTU2LDYgKzU2LDkgQEAKIAogI2luY2x1ZGUgPHBvd2VybWFuYWdlci9Qb3dlck1hbmFnZXIuaD4KIAorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmg+CisKICNpbmNsdWRlICJBdWRpb0ZsaW5nZXIuaCIKICNpbmNsdWRlICJGYXN0TWl4ZXIuaCIKICNpbmNsdWRlICJGYXN0Q2FwdHVyZS5oIgpAQCAtMTE3Niw2ICsxMTc5LDcgQEAKIAogICAgIHN3aXRjaCAobVR5cGUpIHsKICAgICBjYXNlIE1JWEVSOiB7CisjaWZuZGVmIE1VTFRJQ0hBTk5FTF9FRkZFQ1RfQ0hBSU4KICAgICAgICAgLy8gUmVqZWN0IGFueSBlZmZlY3Qgb24gbWl4ZXIgbXVsdGljaGFubmVsIHNpbmtzLgogICAgICAgICAvLyBUT0RPOiBmaXggYm90aCBmb3JtYXQgYW5kIG11bHRpY2hhbm5lbCBpc3N1ZXMgd2l0aCBlZmZlY3RzLgogICAgICAgICBpZiAobUNoYW5uZWxDb3VudCAhPSBGQ0NfMikgewpAQCAtMTE4Myw2ICsxMTg3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgIiB0aHJlYWQgJXMiLCBkZXNjLT5uYW1lLCBtQ2hhbm5lbENvdW50LCBtVGhyZWFkTmFtZSk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CisjZW5kaWYKICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBtT3V0cHV0LT5mbGFnczsKICAgICAgICAgaWYgKGhhc0Zhc3RNaXhlcigpIHx8IChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpKSB7CiAgICAgICAgICAgICBpZiAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCkgewpAQCAtMTIyOSw2ICsxMjM0LDcgQEAKICAgICAgICAgICAgICAgICBkZXNjLT5uYW1lLCBtVGhyZWFkTmFtZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgY2FzZSBEVVBMSUNBVElORzoKKyNpZm5kZWYgTVVMVElDSEFOTkVMX0VGRkVDVF9DSEFJTgogICAgICAgICAvLyBSZWplY3QgYW55IGVmZmVjdCBvbiBtaXhlciBtdWx0aWNoYW5uZWwgc2lua3MuCiAgICAgICAgIC8vIFRPRE86IGZpeCBib3RoIGZvcm1hdCBhbmQgbXVsdGljaGFubmVsIGlzc3VlcyB3aXRoIGVmZmVjdHMuCiAgICAgICAgIGlmIChtQ2hhbm5lbENvdW50ICE9IEZDQ18yKSB7CkBAIC0xMjM2LDYgKzEyNDIsNyBAQAogICAgICAgICAgICAgICAgICAgICAiIG9uIERVUExJQ0FUSU5HIHRocmVhZCAlcyIsIGRlc2MtPm5hbWUsIG1DaGFubmVsQ291bnQsIG1UaHJlYWROYW1lKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KKyNlbmRpZgogICAgICAgICBpZiAoKHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSkgfHwgKHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpKSB7CiAgICAgICAgICAgICBBTE9HVygiY2hlY2tFZmZlY3RDb21wYXRpYmlsaXR5X2woKTogZ2xvYmFsIGVmZmVjdCAlcyBvbiBEVVBMSUNBVElORyIKICAgICAgICAgICAgICAgICAgICAgIiB0aHJlYWQgJXMiLCBkZXNjLT5uYW1lLCBtVGhyZWFkTmFtZSk7CkBAIC0xMzU0LDcgKzEzNjEsNyBAQAogICAgICAgICBpZiAoY2hhaW5DcmVhdGVkKSB7CiAgICAgICAgICAgICByZW1vdmVFZmZlY3RDaGFpbl9sKGNoYWluKTsKICAgICAgICAgfQotICAgICAgICBoYW5kbGUuY2xlYXIoKTsKKyAgICAgICAgLy8gaGFuZGxlIG11c3QgYmUgY2xlYXJlZCBieSBjYWxsZXIgdG8gYXZvaWQgZGVhZGxvY2suCiAgICAgfQogCiAgICAgKnN0YXR1cyA9IGxTdGF0dXM7CkBAIC0xNDEyLDcgKzE0MTksNyBAQAogICAgIGJvb2wgY2hhaW5DcmVhdGVkID0gZmFsc2U7CiAKICAgICBBTE9HRF9JRigobVR5cGUgPT0gT0ZGTE9BRCkgJiYgIWVmZmVjdC0+aXNPZmZsb2FkYWJsZSgpLAotICAgICAgICAgICAgICJhZGRFZmZlY3RfbCgpIG9uIG9mZmxvYWRlZCB0aHJlYWQgJXA6IGVmZmVjdCAlcyBkb2VzIG5vdCBzdXBwb3J0IG9mZmxvYWQgZmxhZ3MgJXgiLAorICAgICAgICAgICAgICJhZGRFZmZlY3RfbCgpIG9uIG9mZmxvYWRlZCB0aHJlYWQgJXA6IGVmZmVjdCAlcyBkb2VzIG5vdCBzdXBwb3J0IG9mZmxvYWQgZmxhZ3MgJSN4IiwKICAgICAgICAgICAgICAgICAgICAgdGhpcywgZWZmZWN0LT5kZXNjKCkubmFtZSwgZWZmZWN0LT5kZXNjKCkuZmxhZ3MpOwogCiAgICAgaWYgKGNoYWluID09IDApIHsKQEAgLTE1NDgsNiArMTU1NSw3IEBACiAgICAgbUFjdGl2ZVRyYWNrc0dlbmVyYXRpb24rKzsKICAgICBtTGF0ZXN0QWN0aXZlVHJhY2sgPSB0cmFjazsKICAgICArK21CYXR0ZXJ5Q291bnRlclt0cmFjay0+dWlkKCldLnNlY29uZDsKKyAgICBtSGFzQ2hhbmdlZCA9IHRydWU7CiAgICAgcmV0dXJuIG1BY3RpdmVUcmFja3MuYWRkKHRyYWNrKTsKIH0KIApAQCAtMTU2Miw2ICsxNTcwLDcgQEAKICAgICBtQWN0aXZlVHJhY2tzR2VuZXJhdGlvbisrOwogICAgIC0tbUJhdHRlcnlDb3VudGVyW3RyYWNrLT51aWQoKV0uc2Vjb25kOwogICAgIC8vIG1MYXRlc3RBY3RpdmVUcmFjayBpcyBub3QgY2xlYXJlZCBldmVuIGlmIGlzIHRoZSBzYW1lIGFzIHRyYWNrLgorICAgIG1IYXNDaGFuZ2VkID0gdHJ1ZTsKICAgICByZXR1cm4gaW5kZXg7CiB9CiAKQEAgLTE1NzIsNiArMTU4MSw3IEBACiAgICAgICAgIGxvZ1RyYWNrKCJjbGVhciIsIHRyYWNrKTsKICAgICB9CiAgICAgbUxhc3RBY3RpdmVUcmFja3NHZW5lcmF0aW9uID0gbUFjdGl2ZVRyYWNrc0dlbmVyYXRpb247CisgICAgaWYgKCFtQWN0aXZlVHJhY2tzLmVtcHR5KCkpIHsgbUhhc0NoYW5nZWQgPSB0cnVlOyB9CiAgICAgbUFjdGl2ZVRyYWNrcy5jbGVhcigpOwogICAgIG1MYXRlc3RBY3RpdmVUcmFjay5jbGVhcigpOwogICAgIG1CYXR0ZXJ5Q291bnRlci5jbGVhcigpOwpAQCAtMTYwOSw2ICsxNjE5LDEzIEBACiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorYm9vbCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OkFjdGl2ZVRyYWNrczxUPjo6cmVhZEFuZENsZWFySGFzQ2hhbmdlZCgpIHsKKyAgICBjb25zdCBib29sIGhhc0NoYW5nZWQgPSBtSGFzQ2hhbmdlZDsKKyAgICBtSGFzQ2hhbmdlZCA9IGZhbHNlOworICAgIHJldHVybiBoYXNDaGFuZ2VkOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KIHZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpBY3RpdmVUcmFja3M8VD46OmxvZ1RyYWNrKAogICAgICAgICBjb25zdCBjaGFyICpmdW5jTmFtZSwgY29uc3Qgc3A8VD4gJnRyYWNrKSBjb25zdCB7CiAgICAgaWYgKG1Mb2NhbExvZyAhPSBudWxscHRyKSB7CkBAIC0xNjU1LDYgKzE2NzIsNyBAQAogICAgICAgICBtU3VzcGVuZGVkRnJhbWVzKDApLAogICAgICAgICBtQWN0aXZlVHJhY2tzKCZ0aGlzLT5tTG9jYWxMb2cpLAogICAgICAgICAvLyBtU3RyZWFtVHlwZXNbXSBpbml0aWFsaXplZCBpbiBjb25zdHJ1Y3RvciBib2R5CisgICAgICAgIG1UcmFja3ModHlwZSA9PSBNSVhFUiksCiAgICAgICAgIG1PdXRwdXQob3V0cHV0KSwKICAgICAgICAgbUxhc3RXcml0ZVRpbWUoLTEpLCBtTnVtV3JpdGVzKDApLCBtTnVtRGVsYXllZFdyaXRlcygwKSwgbUluV3JpdGUoZmFsc2UpLAogICAgICAgICBtTWl4ZXJTdGF0dXMoTUlYRVJfSURMRSksCkBAIC0xNjk2LDExICsxNzE0LDE0IEBACiAgICAgcmVhZE91dHB1dFBhcmFtZXRlcnNfbCgpOwogCiAgICAgLy8gKysgb3BlcmF0b3IgZG9lcyBub3QgY29tcGlsZQotICAgIGZvciAoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBBVURJT19TVFJFQU1fTUlOOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fQ05UOworICAgIGZvciAoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBBVURJT19TVFJFQU1fTUlOOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7CiAgICAgICAgICAgICBzdHJlYW0gPSAoYXVkaW9fc3RyZWFtX3R5cGVfdCkgKHN0cmVhbSArIDEpKSB7Ci0gICAgICAgIG1TdHJlYW1UeXBlc1tzdHJlYW1dLnZvbHVtZSA9IG1BdWRpb0ZsaW5nZXItPnN0cmVhbVZvbHVtZV9sKHN0cmVhbSk7CisgICAgICAgIG1TdHJlYW1UeXBlc1tzdHJlYW1dLnZvbHVtZSA9IDAuMGY7CiAgICAgICAgIG1TdHJlYW1UeXBlc1tzdHJlYW1dLm11dGUgPSBtQXVkaW9GbGluZ2VyLT5zdHJlYW1NdXRlX2woc3RyZWFtKTsKICAgICB9CisgICAgLy8gQXVkaW8gcGF0Y2ggdm9sdW1lIGlzIGFsd2F5cyBtYXgKKyAgICBtU3RyZWFtVHlwZXNbQVVESU9fU1RSRUFNX1BBVENIXS52b2x1bWUgPSAxLjBmOworICAgIG1TdHJlYW1UeXBlc1tBVURJT19TVFJFQU1fUEFUQ0hdLm11dGUgPSBmYWxzZTsKIH0KIAogQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6flBsYXliYWNrVGhyZWFkKCkKQEAgLTE4MzcsMTAgKzE4NTgsMTQgQEAKIHNwPEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrPiBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpjcmVhdGVUcmFja19sKAogICAgICAgICBjb25zdCBzcDxBdWRpb0ZsaW5nZXI6OkNsaWVudD4mIGNsaWVudCwKICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAotICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAorICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHIsCisgICAgICAgIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwKICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgc2l6ZV90ICpwRnJhbWVDb3VudCwKKyAgICAgICAgc2l6ZV90ICpwTm90aWZpY2F0aW9uRnJhbWVDb3VudCwKKyAgICAgICAgdWludDMyX3Qgbm90aWZpY2F0aW9uc1BlckJ1ZmZlciwKKyAgICAgICAgZmxvYXQgc3BlZWQsCiAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCiAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCiAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICpmbGFncywKQEAgLTE4NTAsOSArMTg3NSwxNiBAQAogICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICBzaXplX3QgZnJhbWVDb3VudCA9ICpwRnJhbWVDb3VudDsKKyAgICBzaXplX3Qgbm90aWZpY2F0aW9uRnJhbWVDb3VudCA9ICpwTm90aWZpY2F0aW9uRnJhbWVDb3VudDsKICAgICBzcDxUcmFjaz4gdHJhY2s7CiAgICAgc3RhdHVzX3QgbFN0YXR1czsKICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBvdXRwdXRGbGFncyA9IG1PdXRwdXQtPmZsYWdzOworICAgIGF1ZGlvX291dHB1dF9mbGFnc190IHJlcXVlc3RlZEZsYWdzID0gKmZsYWdzOworCisgICAgaWYgKCpwU2FtcGxlUmF0ZSA9PSAwKSB7CisgICAgICAgICpwU2FtcGxlUmF0ZSA9IG1TYW1wbGVSYXRlOworICAgIH0KKyAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gKnBTYW1wbGVSYXRlOwogCiAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciBGQVNUIGZsYWcgY29uc2lkZXJlZCBPSyBpZiBmYXN0IG1peGVyIGlzIHByZXNlbnQKICAgICBpZiAoaGFzRmFzdE1peGVyKCkpIHsKQEAgLTE5MjksMzYgKzE5NjEsMTE0IEBACiAgICAgICAgICpmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoKmZsYWdzICYgfkFVRElPX09VVFBVVF9GTEFHX0ZBU1QpOwogICAgICAgfQogICAgIH0KLSAgICAvLyBGb3Igbm9ybWFsIFBDTSBzdHJlYW1pbmcgdHJhY2tzLCB1cGRhdGUgbWluaW11bSBmcmFtZSBjb3VudC4KLSAgICAvLyBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIEF1ZGlvVHJhY2sgY2FsY3VsYXRpb24sIGJ1ZmZlciBkZXB0aCBpcyBmb3JjZWQKLSAgICAvLyB0byBiZSBhdCBsZWFzdCAyIHggdGhlIG5vcm1hbCBtaXhlciBmcmFtZSBjb3VudCBhbmQgY292ZXIgYXVkaW8gaGFyZHdhcmUgbGF0ZW5jeS4KLSAgICAvLyBUaGlzIGlzIHByb2JhYmx5IHRvbyBjb25zZXJ2YXRpdmUsIGJ1dCBsZWdhY3kgYXBwbGljYXRpb24gY29kZSBtYXkgZGVwZW5kIG9uIGl0LgotICAgIC8vIElmIHlvdSBjaGFuZ2UgdGhpcyBjYWxjdWxhdGlvbiwgYWxzbyByZXZpZXcgdGhlIHN0YXJ0IHRocmVzaG9sZCB3aGljaCBpcyByZWxhdGVkLgotICAgIGlmICghKCpmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpCi0gICAgICAgICAgICAmJiBhdWRpb19oYXNfcHJvcG9ydGlvbmFsX2ZyYW1lcyhmb3JtYXQpICYmIHNoYXJlZEJ1ZmZlciA9PSAwKSB7Ci0gICAgICAgIC8vIHRoaXMgbXVzdCBtYXRjaCBBdWRpb1RyYWNrLmNwcCBjYWxjdWxhdGVNaW5GcmFtZUNvdW50KCkuCi0gICAgICAgIC8vIFRPRE86IE1vdmUgdG8gYSBjb21tb24gbGlicmFyeQotICAgICAgICB1aW50MzJfdCBsYXRlbmN5TXMgPSAwOwotICAgICAgICBsU3RhdHVzID0gbU91dHB1dC0+c3RyZWFtLT5nZXRMYXRlbmN5KCZsYXRlbmN5TXMpOwotICAgICAgICBpZiAobFN0YXR1cyAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIkVycm9yIHdoZW4gcmV0cmlldmluZyBvdXRwdXQgc3RyZWFtIGxhdGVuY3k6ICVkIiwgbFN0YXR1cyk7CisKKyAgICBpZiAoIWF1ZGlvX2hhc19wcm9wb3J0aW9uYWxfZnJhbWVzKGZvcm1hdCkpIHsKKyAgICAgICAgaWYgKHNoYXJlZEJ1ZmZlciAhPSAwKSB7CisgICAgICAgICAgICAvLyBTYW1lIGNvbW1lbnQgYXMgYmVsb3cgYWJvdXQgaWdub3JpbmcgZnJhbWVDb3VudCBwYXJhbWV0ZXIgZm9yIHNldCgpCisgICAgICAgICAgICBmcmFtZUNvdW50ID0gc2hhcmVkQnVmZmVyLT5zaXplKCk7CisgICAgICAgIH0gZWxzZSBpZiAoZnJhbWVDb3VudCA9PSAwKSB7CisgICAgICAgICAgICBmcmFtZUNvdW50ID0gbU5vcm1hbEZyYW1lQ291bnQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vdGlmaWNhdGlvbkZyYW1lQ291bnQgIT0gZnJhbWVDb3VudCkgeworICAgICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHNoYXJlZEJ1ZmZlciAhPSAwKSB7CisgICAgICAgIC8vIEZJWE1FOiBFbnN1cmUgY2xpZW50IHNpZGUgbWVtb3J5IGJ1ZmZlcnMgbmVlZAorICAgICAgICAvLyBub3QgaGF2ZSBhZGRpdGlvbmFsIGFsaWdubWVudCBiZXlvbmQgc2FtcGxlCisgICAgICAgIC8vIChlLmcuIDE2IGJpdCBzdGVyZW8gYWNjZXNzZWQgYXMgMzIgYml0IGZyYW1lKS4KKyAgICAgICAgc2l6ZV90IGFsaWdubWVudCA9IGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KTsKKyAgICAgICAgaWYgKGFsaWdubWVudCAmIDEpIHsKKyAgICAgICAgICAgIC8vIGZvciBBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQgKG5vdCBleHBvc2VkIHRocm91Z2ggSmF2YSkuCisgICAgICAgICAgICBhbGlnbm1lbnQgPSAxOworICAgICAgICB9CisgICAgICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaGFubmVsTWFzayk7CisgICAgICAgIHNpemVfdCBmcmFtZVNpemUgPSBjaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCk7CisgICAgICAgIGlmIChjaGFubmVsQ291bnQgPiAxKSB7CisgICAgICAgICAgICAvLyBNb3JlIHRoYW4gMiBjaGFubmVscyBkb2VzIG5vdCByZXF1aXJlIHN0cm9uZ2VyIGFsaWdubWVudCB0aGFuIHN0ZXJlbworICAgICAgICAgICAgYWxpZ25tZW50IDw8PSAxOworICAgICAgICB9CisgICAgICAgIGlmICgoKHVpbnRwdHJfdClzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSAmIChhbGlnbm1lbnQgLSAxKSkgIT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgYnVmZmVyIGFsaWdubWVudDogYWRkcmVzcyAlcCwgY2hhbm5lbCBjb3VudCAldSIsCisgICAgICAgICAgICAgICAgICBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSwgY2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICAgIH0KLSAgICAgICAgdWludDMyX3QgbWluQnVmQ291bnQgPSBsYXRlbmN5TXMgLyAoKDEwMDAgKiBtTm9ybWFsRnJhbWVDb3VudCkgLyBtU2FtcGxlUmF0ZSk7Ci0gICAgICAgIGlmIChtaW5CdWZDb3VudCA8IDIpIHsKLSAgICAgICAgICAgIG1pbkJ1ZkNvdW50ID0gMjsKKworICAgICAgICAvLyBXaGVuIGluaXRpYWxpemluZyBhIHNoYXJlZCBidWZmZXIgQXVkaW9UcmFjayB2aWEgY29uc3RydWN0b3JzLAorICAgICAgICAvLyB0aGVyZSdzIG5vIGZyYW1lQ291bnQgcGFyYW1ldGVyLgorICAgICAgICAvLyBCdXQgd2hlbiBpbml0aWFsaXppbmcgYSBzaGFyZWQgYnVmZmVyIEF1ZGlvVHJhY2sgdmlhIHNldCgpLAorICAgICAgICAvLyB0aGVyZSBfaXNfIGEgZnJhbWVDb3VudCBwYXJhbWV0ZXIuICBXZSBzaWxlbnRseSBpZ25vcmUgaXQuCisgICAgICAgIGZyYW1lQ291bnQgPSBzaGFyZWRCdWZmZXItPnNpemUoKSAvIGZyYW1lU2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBzaXplX3QgbWluRnJhbWVDb3VudCA9IDA7CisgICAgICAgIC8vIEZvciBmYXN0IHRyYWNrcyB3ZSB0cnkgdG8gcmVzcGVjdCB0aGUgYXBwbGljYXRpb24ncyByZXF1ZXN0IGZvciBub3RpZmljYXRpb25zIHBlciBidWZmZXIuCisgICAgICAgIGlmICgqZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSB7CisgICAgICAgICAgICBpZiAobm90aWZpY2F0aW9uc1BlckJ1ZmZlciA+IDApIHsKKyAgICAgICAgICAgICAgICAvLyBBdm9pZCBwb3NzaWJsZSBhcml0aG1ldGljIG92ZXJmbG93IGR1cmluZyBtdWx0aXBsaWNhdGlvbi4KKyAgICAgICAgICAgICAgICBpZiAobm90aWZpY2F0aW9uc1BlckJ1ZmZlciA+IFNJWkVfTUFYIC8gbUZyYW1lQ291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlJlcXVlc3RlZCBub3RpZmljYXRpb25QZXJCdWZmZXI9JXUgaWdub3JlZCBmb3IgSEFMIGZyYW1lQ291bnQ9JXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uc1BlckJ1ZmZlciwgbUZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1pbkZyYW1lQ291bnQgPSBtRnJhbWVDb3VudCAqIG5vdGlmaWNhdGlvbnNQZXJCdWZmZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gRm9yIG5vcm1hbCBQQ00gc3RyZWFtaW5nIHRyYWNrcywgdXBkYXRlIG1pbmltdW0gZnJhbWUgY291bnQuCisgICAgICAgICAgICAvLyBCdWZmZXIgZGVwdGggaXMgZm9yY2VkIHRvIGJlIGF0IGxlYXN0IDIgeCB0aGUgbm9ybWFsIG1peGVyIGZyYW1lIGNvdW50IGFuZAorICAgICAgICAgICAgLy8gY292ZXIgYXVkaW8gaGFyZHdhcmUgbGF0ZW5jeS4KKyAgICAgICAgICAgIC8vIFRoaXMgaXMgcHJvYmFibHkgdG9vIGNvbnNlcnZhdGl2ZSwgYnV0IGxlZ2FjeSBhcHBsaWNhdGlvbiBjb2RlIG1heSBkZXBlbmQgb24gaXQuCisgICAgICAgICAgICAvLyBJZiB5b3UgY2hhbmdlIHRoaXMgY2FsY3VsYXRpb24sIGFsc28gcmV2aWV3IHRoZSBzdGFydCB0aHJlc2hvbGQgd2hpY2ggaXMgcmVsYXRlZC4KKyAgICAgICAgICAgIHVpbnQzMl90IGxhdGVuY3lNcyA9IGxhdGVuY3lfbCgpOworICAgICAgICAgICAgaWYgKGxhdGVuY3lNcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkVycm9yIHdoZW4gcmV0cmlldmluZyBvdXRwdXQgc3RyZWFtIGxhdGVuY3kiKTsKKyAgICAgICAgICAgICAgICBsU3RhdHVzID0gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1pbkZyYW1lQ291bnQgPSBBdWRpb1N5c3RlbTo6Y2FsY3VsYXRlTWluRnJhbWVDb3VudChsYXRlbmN5TXMsIG1Ob3JtYWxGcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSwgc3BlZWQgLyosIDAgbU5vdGlmaWNhdGlvbnNQZXJCdWZmZXJSZXEqLyk7CisKICAgICAgICAgfQotICAgICAgICAvLyBGb3Igbm9ybWFsIG1peGluZyB0cmFja3MsIGlmIHNwZWVkIGlzID4gMS4wZiAobm9ybWFsKSwgQXVkaW9UcmFjawotICAgICAgICAvLyBvciB0aGUgY2xpZW50IHNob3VsZCBjb21wdXRlIGFuZCBwYXNzIGluIGEgbGFyZ2VyIGJ1ZmZlciByZXF1ZXN0LgotICAgICAgICBzaXplX3QgbWluRnJhbWVDb3VudCA9Ci0gICAgICAgICAgICAgICAgbWluQnVmQ291bnQgKiBzb3VyY2VGcmFtZXNOZWVkZWRXaXRoVGltZXN0cmV0Y2goCi0gICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBtTm9ybWFsRnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBBVURJT19USU1FU1RSRVRDSF9TUEVFRF9OT1JNQUwgLypzcGVlZCovKTsKLSAgICAgICAgaWYgKGZyYW1lQ291bnQgPCBtaW5GcmFtZUNvdW50KSB7IC8vIGluY2x1ZGluZyBmcmFtZUNvdW50ID09IDAKKyAgICAgICAgaWYgKGZyYW1lQ291bnQgPCBtaW5GcmFtZUNvdW50KSB7CiAgICAgICAgICAgICBmcmFtZUNvdW50ID0gbWluRnJhbWVDb3VudDsKICAgICAgICAgfQogICAgIH0KKworICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGFwcGxpY2F0aW9uIGlzIG5vdGlmaWVkIHdpdGggc3VmZmljaWVudCBtYXJnaW4gYmVmb3JlIHVuZGVycnVuLgorICAgIC8vIFRoZSBjbGllbnQgY2FuIGRpdmlkZSB0aGUgQXVkaW9UcmFjayBidWZmZXIgaW50byBzdWItYnVmZmVycywKKyAgICAvLyBhbmQgZXhwcmVzc2VzIGl0cyBkZXNpcmUgdG8gc2VydmVyIGFzIHRoZSBub3RpZmljYXRpb24gZnJhbWUgY291bnQuCisgICAgaWYgKHNoYXJlZEJ1ZmZlciA9PSAwICYmIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSkgeworICAgICAgICBzaXplX3QgbWF4Tm90aWZpY2F0aW9uRnJhbWVzOworICAgICAgICBpZiAoKmZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkgeworICAgICAgICAgICAgLy8gbm90aWZ5IGV2ZXJ5IEhBTCBidWZmZXIsIHJlZ2FyZGxlc3Mgb2YgdGhlIHNpemUgb2YgdGhlIHRyYWNrIGJ1ZmZlcgorICAgICAgICAgICAgbWF4Tm90aWZpY2F0aW9uRnJhbWVzID0gbUZyYW1lQ291bnQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBGb3Igbm9ybWFsIHRyYWNrcywgdXNlIGF0IGxlYXN0IGRvdWJsZS1idWZmZXJpbmcgaWYgbm8gc2FtcGxlIHJhdGUgY29udmVyc2lvbiwKKyAgICAgICAgICAgIC8vIG9yIGF0IGxlYXN0IHRyaXBsZS1idWZmZXJpbmcgaWYgdGhlcmUgaXMgc2FtcGxlIHJhdGUgY29udmVyc2lvbgorICAgICAgICAgICAgY29uc3QgaW50IG5CdWZmZXJpbmcgPSBzYW1wbGVSYXRlID09IG1TYW1wbGVSYXRlID8gMiA6IDM7CisgICAgICAgICAgICBtYXhOb3RpZmljYXRpb25GcmFtZXMgPSBmcmFtZUNvdW50IC8gbkJ1ZmZlcmluZzsKKyAgICAgICAgICAgIC8vIElmIGNsaWVudCByZXF1ZXN0ZWQgYSBmYXN0IHRyYWNrIGJ1dCB0aGlzIHdhcyBkZW5pZWQsIHRoZW4gdXNlIHRoZSBzbWFsbGVyIG1heGltdW0uCisgICAgICAgICAgICBpZiAocmVxdWVzdGVkRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSB7CisgICAgICAgICAgICAgICAgc2l6ZV90IG1heE5vdGlmaWNhdGlvbkZyYW1lc0Zhc3REZW5pZWQgPSBGTVNfMjAgKiBzYW1wbGVSYXRlIC8gMTAwMDsKKyAgICAgICAgICAgICAgICBpZiAobWF4Tm90aWZpY2F0aW9uRnJhbWVzID4gbWF4Tm90aWZpY2F0aW9uRnJhbWVzRmFzdERlbmllZCkgeworICAgICAgICAgICAgICAgICAgICBtYXhOb3RpZmljYXRpb25GcmFtZXMgPSBtYXhOb3RpZmljYXRpb25GcmFtZXNGYXN0RGVuaWVkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobm90aWZpY2F0aW9uRnJhbWVDb3VudCA9PSAwIHx8IG5vdGlmaWNhdGlvbkZyYW1lQ291bnQgPiBtYXhOb3RpZmljYXRpb25GcmFtZXMpIHsKKyAgICAgICAgICAgIGlmIChub3RpZmljYXRpb25GcmFtZUNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiQ2xpZW50IGRlZmF1bHRlZCBub3RpZmljYXRpb25GcmFtZXMgdG8gJXp1IGZvciBmcmFtZUNvdW50ICV6dSIsCisgICAgICAgICAgICAgICAgICAgIG1heE5vdGlmaWNhdGlvbkZyYW1lcywgZnJhbWVDb3VudCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCJDbGllbnQgYWRqdXN0ZWQgbm90aWZpY2F0aW9uRnJhbWVzIGZyb20gJXp1IHRvICV6dSBmb3IgZnJhbWVDb3VudCAlenUiLAorICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lQ291bnQsIG1heE5vdGlmaWNhdGlvbkZyYW1lcywgZnJhbWVDb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZUNvdW50ID0gbWF4Tm90aWZpY2F0aW9uRnJhbWVzOworICAgICAgICB9CisgICAgfQorCiAgICAgKnBGcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKKyAgICAqcE5vdGlmaWNhdGlvbkZyYW1lQ291bnQgPSBub3RpZmljYXRpb25GcmFtZUNvdW50OwogCiAgICAgc3dpdGNoIChtVHlwZSkgewogCkBAIC0yMDI3LDcgKzIxMzcsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgdHJhY2sgPSBuZXcgVHJhY2sodGhpcywgY2xpZW50LCBzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsCisgICAgICAgIHRyYWNrID0gbmV3IFRyYWNrKHRoaXMsIGNsaWVudCwgc3RyZWFtVHlwZSwgYXR0ciwgc2FtcGxlUmF0ZSwgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBidWZmZXIgKi8sIChzaXplX3QpMCAvKiBidWZmZXJTaXplICovLCBzaGFyZWRCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgdWlkLCAqZmxhZ3MsIFRyYWNrQmFzZTo6VFlQRV9ERUZBVUxULCBwb3J0SWQpOwpAQCAtMjA2Myw2ICsyMTczLDUzIEBACiAgICAgcmV0dXJuIHRyYWNrOwogfQogCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3NpemVfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFja3M8VD46OmFkZChjb25zdCBzcDxUPiAmdHJhY2spCit7CisgICAgY29uc3Qgc3NpemVfdCBpbmRleCA9IG1UcmFja3MuYWRkKHRyYWNrKTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAvLyBzZXQgbmFtZSBmb3IgdHJhY2sgd2hlbiBhZGRpbmcuCisgICAgICAgIGludCBuYW1lOworICAgICAgICBpZiAobVVudXNlZFRyYWNrTmFtZXMuZW1wdHkoKSkgeworICAgICAgICAgICAgbmFtZSA9IG1UcmFja3Muc2l6ZSgpIC0gMTsgLy8gbmV3IG5hbWUgezAgLi4uIHNpemUtMX0uCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyByZXVzZSBzbWFsbGVzdCBuYW1lIGZvciBkZWxldGVkIHRyYWNrLgorICAgICAgICAgICAgYXV0byBpdCA9IG1VbnVzZWRUcmFja05hbWVzLmJlZ2luKCk7CisgICAgICAgICAgICBuYW1lID0gKml0OworICAgICAgICAgICAgKHZvaWQpbVVudXNlZFRyYWNrTmFtZXMuZXJhc2UoaXQpOworICAgICAgICB9CisgICAgICAgIHRyYWNrLT5zZXROYW1lKG5hbWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImNhbm5vdCBhZGQgdHJhY2siKTsKKyAgICB9CisgICAgcmV0dXJuIGluZGV4OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3NpemVfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFja3M8VD46OnJlbW92ZShjb25zdCBzcDxUPiAmdHJhY2spCit7CisgICAgY29uc3QgaW50IG5hbWUgPSB0cmFjay0+bmFtZSgpOworICAgIGNvbnN0IHNzaXplX3QgaW5kZXggPSBtVHJhY2tzLnJlbW92ZSh0cmFjayk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgLy8gaW52YWxpZGF0ZSBuYW1lIHdoZW4gcmVtb3ZpbmcgZnJvbSBtVHJhY2tzLgorICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG5hbWUgPCAwLCAiaW52YWxpZCBuYW1lICVkIGZvciB0cmFjayBvbiBtVHJhY2tzIiwgbmFtZSk7CisKKyAgICAgICAgaWYgKG1TYXZlRGVsZXRlZFRyYWNrTmFtZXMpIHsKKyAgICAgICAgICAgIC8vIFdlIGNhbid0IGRpcmVjdGx5IGFjY2VzcyBtQXVkaW9NaXhlciBzaW5jZSB0aGUgY2FsbGVyIG1heSBiZSBvdXRzaWRlIG9mIHRocmVhZExvb3AuCisgICAgICAgICAgICAvLyBJbnN0ZWFkLCB3ZSBhZGQgdG8gbURlbGV0ZWRUcmFja05hbWVzIHdoaWNoIGlzIHNvbGVseSB1c2VkIGZvciBtQXVkaW9NaXhlciB1cGRhdGUsCisgICAgICAgICAgICAvLyB0byBiZSBoYW5kbGVkIHdoZW4gTWl4ZXJUaHJlYWQ6OnByZXBhcmVUcmFja3NfbCgpIG5leHQgY2hhbmdlcyBtQXVkaW9NaXhlci4KKyAgICAgICAgICAgIG1EZWxldGVkVHJhY2tOYW1lcy5lbXBsYWNlKG5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgbVVudXNlZFRyYWNrTmFtZXMuZW1wbGFjZShuYW1lKTsKKyAgICAgICAgdHJhY2stPnNldE5hbWUoVDo6VFJBQ0tfTkFNRV9QRU5ESU5HKTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG5hbWUgPj0gMCwKKyAgICAgICAgICAgICAgICAidmFsaWQgbmFtZSAlZCBmb3IgdHJhY2sgbm90IGluIG1UcmFja3MgKHJldHVybmVkICV6ZCkiLCBuYW1lLCBpbmRleCk7CisgICAgfQorICAgIHJldHVybiBpbmRleDsKK30KKwogdWludDMyX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6Y29ycmVjdExhdGVuY3lfbCh1aW50MzJfdCBsYXRlbmN5KSBjb25zdAogewogICAgIHJldHVybiBsYXRlbmN5OwpAQCAtMjIxOSw5ICsyMzc2LDYgQEAKICAgICBtTG9jYWxMb2cubG9nKCJyZW1vdmVUcmFja19sICglcCkgJXMiLCB0cmFjay5nZXQoKSwgcmVzdWx0LnN0cmluZygpKTsKIAogICAgIG1UcmFja3MucmVtb3ZlKHRyYWNrKTsKLSAgICBkZWxldGVUcmFja05hbWVfbCh0cmFjay0+bmFtZSgpKTsKLSAgICAvLyByZWR1bmRhbnQgYXMgdHJhY2sgaXMgYWJvdXQgdG8gYmUgZGVzdHJveWVkLCBmb3IgZHVtcHN5cyBvbmx5Ci0gICAgdHJhY2stPm1OYW1lID0gLTE7CiAgICAgaWYgKHRyYWNrLT5pc0Zhc3RUcmFjaygpKSB7CiAgICAgICAgIGludCBpbmRleCA9IHRyYWNrLT5tRmFzdEluZGV4OwogICAgICAgICBBTE9HX0FTU0VSVCgwIDwgaW5kZXggJiYgaW5kZXggPCAoaW50KUZhc3RNaXhlclN0YXRlOjpzTWF4RmFzdFRyYWNrcyk7CkBAIC0yNDQ5LDcgKzI2MDMsNyBAQAogICAgIGZyZWUobUVmZmVjdEJ1ZmZlcik7CiAgICAgbUVmZmVjdEJ1ZmZlciA9IE5VTEw7CiAgICAgaWYgKG1FZmZlY3RCdWZmZXJFbmFibGVkKSB7Ci0gICAgICAgIG1FZmZlY3RCdWZmZXJGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsgLy8gTm90ZTogRWZmZWN0cyBzdXBwb3J0IDE2YiBvbmx5CisgICAgICAgIG1FZmZlY3RCdWZmZXJGb3JtYXQgPSBFRkZFQ1RfQlVGRkVSX0ZPUk1BVDsKICAgICAgICAgbUVmZmVjdEJ1ZmZlclNpemUgPSBtTm9ybWFsRnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnQKICAgICAgICAgICAgICAgICAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobUVmZmVjdEJ1ZmZlckZvcm1hdCk7CiAgICAgICAgICh2b2lkKXBvc2l4X21lbWFsaWduKCZtRWZmZWN0QnVmZmVyLCAzMiwgbUVmZmVjdEJ1ZmZlclNpemUpOwpAQCAtMjQ2Nyw2ICsyNjIxLDM0IEBACiAgICAgfQogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OnVwZGF0ZU1ldGFkYXRhX2woKQoreworICAgIGlmIChtT3V0cHV0ID09IG51bGxwdHIgfHwgbU91dHB1dC0+c3RyZWFtID09IG51bGxwdHIgKSB7CisgICAgICAgIHJldHVybjsgLy8gVGhhdCBzaG91bGQgbm90IGhhcHBlbgorICAgIH0KKyAgICBib29sIGhhc0NoYW5nZWQgPSBtQWN0aXZlVHJhY2tzLnJlYWRBbmRDbGVhckhhc0NoYW5nZWQoKTsKKyAgICBmb3IgKGNvbnN0IHNwPFRyYWNrPiAmdHJhY2sgOiBtQWN0aXZlVHJhY2tzKSB7CisgICAgICAgIC8vIERvIG5vdCBzaG9ydC1jaXJjdWl0IGFzIGFsbCBoYXNDaGFuZ2VkIHN0YXRlcyBtdXN0IGJlIHJlc2V0CisgICAgICAgIC8vIGFzIGFsbCB0aGUgbWV0YWRhdGEgYXJlIGdvaW5nIHRvIGJlIHNlbnQKKyAgICAgICAgaGFzQ2hhbmdlZCB8PSB0cmFjay0+cmVhZEFuZENsZWFySGFzQ2hhbmdlZCgpOworICAgIH0KKyAgICBpZiAoIWhhc0NoYW5nZWQpIHsKKyAgICAgICAgcmV0dXJuOyAvLyBub3RoaW5nIHRvIGRvCisgICAgfQorICAgIFN0cmVhbU91dEhhbEludGVyZmFjZTo6U291cmNlTWV0YWRhdGEgbWV0YWRhdGE7CisgICAgYXV0byBiYWNrSW5zZXJ0ZXIgPSBzdGQ6OmJhY2tfaW5zZXJ0ZXIobWV0YWRhdGEudHJhY2tzKTsKKyAgICBmb3IgKGNvbnN0IHNwPFRyYWNrPiAmdHJhY2sgOiBtQWN0aXZlVHJhY2tzKSB7CisgICAgICAgIC8vIE5vIHRyYWNrIGlzIGludmFsaWQgYXMgdGhpcyBpcyBjYWxsZWQgYWZ0ZXIgcHJlcGFyZVRyYWNrX2wgaW4gdGhlIHNhbWUgY3JpdGljYWwgc2VjdGlvbgorICAgICAgICB0cmFjay0+Y29weU1ldGFkYXRhVG8oYmFja0luc2VydGVyKTsKKyAgICB9CisgICAgc2VuZE1ldGFkYXRhVG9CYWNrZW5kX2wobWV0YWRhdGEpOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OnNlbmRNZXRhZGF0YVRvQmFja2VuZF9sKAorICAgICAgICBjb25zdCBTdHJlYW1PdXRIYWxJbnRlcmZhY2U6OlNvdXJjZU1ldGFkYXRhJiBtZXRhZGF0YSkKK3sKKyAgICBtT3V0cHV0LT5zdHJlYW0tPnVwZGF0ZVNvdXJjZU1ldGFkYXRhKG1ldGFkYXRhKTsKK307CiAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpoYWxGcmFtZXMsIHVpbnQzMl90ICpkc3BGcmFtZXMpCiB7CkBAIC0yNjM4LDYgKzI4MjAsNyBAQAogLy8gc2hhcmVkIGJ5IE1JWEVSIGFuZCBESVJFQ1QsIG92ZXJyaWRkZW4gYnkgRFVQTElDQVRJTkcKIHNzaXplX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6dGhyZWFkTG9vcF93cml0ZSgpCiB7CisgICAgTE9HX0hJU1RfVFMoKTsKICAgICBtSW5Xcml0ZSA9IHRydWU7CiAgICAgc3NpemVfdCBieXRlc1dyaXR0ZW47CiAgICAgY29uc3Qgc2l6ZV90IG9mZnNldCA9IG1DdXJyZW50V3JpdGVMZW5ndGggLSBtQnl0ZXNSZW1haW5pbmc7CkBAIC0yNzg5LDI1ICsyOTcyLDI4IEBACiB7CiAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSBjaGFpbi0+c2Vzc2lvbklkKCk7CiAgICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiBoYWxJbkJ1ZmZlciwgaGFsT3V0QnVmZmVyOwotICAgIHN0YXR1c190IHJlc3VsdCA9IEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZTo6bWlycm9yKAorICAgIHN0YXR1c190IHJlc3VsdCA9IG1BdWRpb0ZsaW5nZXItPm1FZmZlY3RzRmFjdG9yeUhhbC0+bWlycm9yQnVmZmVyKAogICAgICAgICAgICAgbUVmZmVjdEJ1ZmZlckVuYWJsZWQgPyBtRWZmZWN0QnVmZmVyIDogbVNpbmtCdWZmZXIsCiAgICAgICAgICAgICBtRWZmZWN0QnVmZmVyRW5hYmxlZCA/IG1FZmZlY3RCdWZmZXJTaXplIDogbVNpbmtCdWZmZXJTaXplLAogICAgICAgICAgICAgJmhhbEluQnVmZmVyKTsKICAgICBpZiAocmVzdWx0ICE9IE9LKSByZXR1cm4gcmVzdWx0OwogICAgIGhhbE91dEJ1ZmZlciA9IGhhbEluQnVmZmVyOwotICAgIGludDE2X3QgKmJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCo+KGhhbEluQnVmZmVyLT5leHRlcm5hbERhdGEoKSk7Ci0KKyAgICBlZmZlY3RfYnVmZmVyX3QgKmJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZWZmZWN0X2J1ZmZlcl90Kj4oaGFsSW5CdWZmZXItPmV4dGVybmFsRGF0YSgpKTsKICAgICBBTE9HVigiYWRkRWZmZWN0Q2hhaW5fbCgpICVwIG9uIHRocmVhZCAlcCBmb3Igc2Vzc2lvbiAlZCIsIGNoYWluLmdldCgpLCB0aGlzLCBzZXNzaW9uKTsKICAgICBpZiAoc2Vzc2lvbiA+IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCkgewogICAgICAgICAvLyBPbmx5IG9uZSBlZmZlY3QgY2hhaW4gY2FuIGJlIHByZXNlbnQgaW4gZGlyZWN0IG91dHB1dCB0aHJlYWQgYW5kIGl0IHVzZXMKICAgICAgICAgLy8gdGhlIHNpbmsgYnVmZmVyIGFzIGlucHV0CiAgICAgICAgIGlmIChtVHlwZSAhPSBESVJFQ1QpIHsKICAgICAgICAgICAgIHNpemVfdCBudW1TYW1wbGVzID0gbU5vcm1hbEZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50OwotICAgICAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlOjphbGxvY2F0ZSgKLSAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcyAqIHNpemVvZihpbnQxNl90KSwKKyAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IG1BdWRpb0ZsaW5nZXItPm1FZmZlY3RzRmFjdG9yeUhhbC0+YWxsb2NhdGVCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMgKiBzaXplb2YoZWZmZWN0X2J1ZmZlcl90KSwKICAgICAgICAgICAgICAgICAgICAgJmhhbEluQnVmZmVyKTsKICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gT0spIHJldHVybiByZXN1bHQ7CisjaWZkZWYgRkxPQVRfRUZGRUNUX0NIQUlOCisgICAgICAgICAgICBidWZmZXIgPSBoYWxJbkJ1ZmZlci0+YXVkaW9CdWZmZXIoKS0+ZjMyOworI2Vsc2UKICAgICAgICAgICAgIGJ1ZmZlciA9IGhhbEluQnVmZmVyLT5hdWRpb0J1ZmZlcigpLT5zMTY7CisjZW5kaWYKICAgICAgICAgICAgIEFMT0dWKCJhZGRFZmZlY3RDaGFpbl9sKCkgY3JlYXRpbmcgbmV3IGlucHV0IGJ1ZmZlciAlcCBzZXNzaW9uICVkIiwKICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBzZXNzaW9uKTsKICAgICAgICAgfQpAQCAtMjg4Miw3ICszMDY4LDcgQEAKICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7ICsraSkgewogICAgICAgICAgICAgICAgIHNwPFRyYWNrPiB0cmFjayA9IG1UcmFja3NbaV07CiAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gdHJhY2stPnNlc3Npb25JZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyYWNrLT5zZXRNYWluQnVmZmVyKHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCo+KG1TaW5rQnVmZmVyKSk7CisgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5zZXRNYWluQnVmZmVyKHJlaW50ZXJwcmV0X2Nhc3Q8ZWZmZWN0X2J1ZmZlcl90Kj4obVNpbmtCdWZmZXIpKTsKICAgICAgICAgICAgICAgICAgICAgY2hhaW4tPmRlY1RyYWNrQ250KCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMzExNiw2ICszMzAyLDEwIEBACiAKICAgICAgICAgICAgICAgICAgICAgdGhyZWFkTG9vcF9zdGFuZGJ5KCk7CiAKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB3aGVyZSB3ZSBnbyBpbnRvIHN0YW5kYnkKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtU3RhbmRieSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HX0FVRElPX1NUQVRFKCk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbVN0YW5kYnkgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KIApAQCAtMzE1Niw2ICszMzQ2LDggQEAKIAogICAgICAgICAgICAgbUFjdGl2ZVRyYWNrcy51cGRhdGVQb3dlclN0YXRlKHRoaXMpOwogCisgICAgICAgICAgICB1cGRhdGVNZXRhZGF0YV9sKCk7CisKICAgICAgICAgICAgIC8vIHByZXZlbnQgYW55IGNoYW5nZXMgaW4gZWZmZWN0IGNoYWluIGxpc3QgYW5kIGluIGVhY2ggZWZmZWN0IGNoYWluCiAgICAgICAgICAgICAvLyBkdXJpbmcgbWl4aW5nIGFuZCBlZmZlY3QgcHJvY2VzcyBhcyB0aGUgYXVkaW8gYnVmZmVycyBjb3VsZCBiZSBkZWxldGVkCiAgICAgICAgICAgICAvLyBvciBtb2RpZmllZCBpZiBhbiBlZmZlY3QgaXMgY3JlYXRlZCBvciBkZWxldGVkCkBAIC0zMzA3LDEwICszNDk5LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyLiB0aHJlYWRMb29wX21peCAoc2lnbmlmaWNhbnQgZm9yIGhlYXZ5IG1peGluZywgZXNwZWNpYWxseQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgIG9uIGxvdyB0aWVyIHByb2Nlc3NvcnMpCiAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0J3MgT0sgaWYgZGVsdGFNcyBpcyBhbiBvdmVyZXN0aW1hdGUuCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGRlbHRhTXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGFzdFdyaXRlRmluaXNoZWQgLSBwcmV2aW91c0xhc3RXcml0ZUZpbmlzaGVkKSAvIDEwMDAwMDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHRocm90dGxlTXMgPSBtSGFsZkJ1ZmZlck1zIC0gZGVsdGFNczsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0J3MgT0sgaWYgZGVsdGFNcyAoYW5kIGRlbHRhTnMpIGlzIGFuIG92ZXJlc3RpbWF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3QgZGVsdGFOczsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbHRhTnMgPSBsYXN0V3JpdGVGaW5pc2hlZCAtIHByZXZpb3VzTGFzdFdyaXRlRmluaXNoZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fc3ViX292ZXJmbG93KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RXcml0ZUZpbmlzaGVkLHByZXZpb3VzTGFzdFdyaXRlRmluaXNoZWQsICZkZWx0YU5zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZGVsdGFNcyA9IGRlbHRhTnMgLyAxMDAwMDAwOworCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHRocm90dGxlTXMgPSAoaW50MzJfdCltSGFsZkJ1ZmZlck1zIC0gZGVsdGFNczsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc2lnbmVkKW1IYWxmQnVmZmVyTXMgPj0gdGhyb3R0bGVNcyAmJiB0aHJvdHRsZU1zID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzbGVlcCh0aHJvdHRsZU1zICogMTAwMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90aWZ5IG9mIHRocm90dGxlIHN0YXJ0IG9uIHZlcmJvc2UgbG9nCkBAIC0zMzI3LDcgKzM1MjMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaWZmID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3RpZnkgb2YgdGhyb3R0bGUgZW5kIG9uIGRlYnVnIGxvZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgcHJldmVudCBzcGFtbWluZyBmb3IgYmx1ZXRvb3RoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEX0lGKCFhdWRpb19pc19hMmRwX291dF9kZXZpY2Uob3V0RGV2aWNlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRF9JRighYXVkaW9faXNfYTJkcF9vdXRfZGV2aWNlKG91dERldmljZSgpKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhYXVkaW9faXNfaGVhcmluZ19haWRfb3V0X2RldmljZShvdXREZXZpY2UoKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1peGVyKCVwKSB0aHJvdHRsZSBlbmQ6IHRocm90dGxlIHRpbWUoJXUpIiwgdGhpcywgZGlmZik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UaHJlYWRUaHJvdHRsZUVuZE1zID0gbVRocmVhZFRocm90dGxlVGltZU1zOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTM1OTcsNyArMzc5NCw3IEBACiAgICAgICAgIC8vIG1Ob3JtYWxTaW5rIGJlbG93CiB7CiAgICAgQUxPR1YoIk1peGVyVGhyZWFkKCkgaWQ9JWQgZGV2aWNlPSUjeCB0eXBlPSVkIiwgaWQsIGRldmljZSwgdHlwZSk7Ci0gICAgQUxPR1YoIm1TYW1wbGVSYXRlPSV1LCBtQ2hhbm5lbE1hc2s9JSN4LCBtQ2hhbm5lbENvdW50PSV1LCBtRm9ybWF0PSVkLCBtRnJhbWVTaXplPSV6dSwgIgorICAgIEFMT0dWKCJtU2FtcGxlUmF0ZT0ldSwgbUNoYW5uZWxNYXNrPSUjeCwgbUNoYW5uZWxDb3VudD0ldSwgbUZvcm1hdD0lI3gsIG1GcmFtZVNpemU9JXp1LCAiCiAgICAgICAgICAgICAibUZyYW1lQ291bnQ9JXp1LCBtTm9ybWFsRnJhbWVDb3VudD0lenUiLAogICAgICAgICAgICAgbVNhbXBsZVJhdGUsIG1DaGFubmVsTWFzaywgbUNoYW5uZWxDb3VudCwgbUZvcm1hdCwgbUZyYW1lU2l6ZSwgbUZyYW1lQ291bnQsCiAgICAgICAgICAgICBtTm9ybWFsRnJhbWVDb3VudCk7CkBAIC0zNjY1LDcgKzM4NjIsNyBAQAogICAgICAgICBOQkFJT19Gb3JtYXQgb3JpZ2Zvcm1hdCA9IGZvcm1hdDsKICNlbmRpZgogICAgICAgICAvLyBhZGp1c3QgZm9ybWF0IHRvIG1hdGNoIHRoYXQgb2YgdGhlIEZhc3QgTWl4ZXIKLSAgICAgICAgQUxPR1YoImZvcm1hdCBjaGFuZ2VkIGZyb20gJWQgdG8gJWQiLCBmb3JtYXQubUZvcm1hdCwgZmFzdE1peGVyRm9ybWF0KTsKKyAgICAgICAgQUxPR1YoImZvcm1hdCBjaGFuZ2VkIGZyb20gJSN4IHRvICUjeCIsIGZvcm1hdC5tRm9ybWF0LCBmYXN0TWl4ZXJGb3JtYXQpOwogICAgICAgICBmb3JtYXQubUZvcm1hdCA9IGZhc3RNaXhlckZvcm1hdDsKICAgICAgICAgZm9ybWF0Lm1GcmFtZVNpemUgPSBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdC5tRm9ybWF0KSAqIGZvcm1hdC5tQ2hhbm5lbENvdW50OwogCkBAIC0zOTcyLDE2ICs0MTY5LDMxIEBACiAgICAgLy8gYnVmZmVyIHNpemUsIHRoZW4gd3JpdGUgMHMgdG8gdGhlIG91dHB1dAogICAgIGlmIChtU2xlZXBUaW1lVXMgPT0gMCkgewogICAgICAgICBpZiAobU1peGVyU3RhdHVzID09IE1JWEVSX1RSQUNLU19FTkFCTEVEKSB7Ci0gICAgICAgICAgICBtU2xlZXBUaW1lVXMgPSBtQWN0aXZlU2xlZXBUaW1lVXMgPj4gc2xlZXBUaW1lU2hpZnQ7Ci0gICAgICAgICAgICBpZiAobVNsZWVwVGltZVVzIDwga01pblRocmVhZFNsZWVwVGltZVVzKSB7Ci0gICAgICAgICAgICAgICAgbVNsZWVwVGltZVVzID0ga01pblRocmVhZFNsZWVwVGltZVVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gcmVkdWNlIHNsZWVwIHRpbWUgaW4gY2FzZSBvZiBjb25zZWN1dGl2ZSBhcHBsaWNhdGlvbiB1bmRlcnJ1bnMgdG8gYXZvaWQKLSAgICAgICAgICAgIC8vIHN0YXJ2aW5nIHRoZSBhdWRpbyBIQUwuIEFzIGFjdGl2ZVNsZWVwVGltZVVzKCkgaXMgbGFyZ2VyIHRoYW4gYSBidWZmZXIKLSAgICAgICAgICAgIC8vIGR1cmF0aW9uIHdlIHdvdWxkIGVuZCB1cCB3cml0aW5nIGxlc3MgZGF0YSB0aGFuIG5lZWRlZCBieSB0aGUgYXVkaW8gSEFMIGlmCi0gICAgICAgICAgICAvLyB0aGUgY29uZGl0aW9uIHBlcnNpc3RzLgotICAgICAgICAgICAgaWYgKHNsZWVwVGltZVNoaWZ0IDwga01heFRocmVhZFNsZWVwVGltZVNoaWZ0KSB7Ci0gICAgICAgICAgICAgICAgc2xlZXBUaW1lU2hpZnQrKzsKKyAgICAgICAgICAgIGlmIChtUGlwZVNpbmsuZ2V0KCkgIT0gbnVsbHB0ciAmJiBtUGlwZVNpbmsgPT0gbU5vcm1hbFNpbmspIHsKKyAgICAgICAgICAgICAgICAvLyBVc2luZyB0aGUgTW9ub3BpcGUgYXZhaWxhYmxlVG9Xcml0ZSwgd2UgZXN0aW1hdGUgdGhlCisgICAgICAgICAgICAgICAgLy8gc2xlZXAgdGltZSB0byByZXRyeSBmb3IgbW9yZSBkYXRhIChiZWZvcmUgd2UgdW5kZXJydW4pLgorICAgICAgICAgICAgICAgIE1vbm9QaXBlICptb25vUGlwZSA9IHN0YXRpY19jYXN0PE1vbm9QaXBlICo+KG1QaXBlU2luay5nZXQoKSk7CisgICAgICAgICAgICAgICAgY29uc3Qgc3NpemVfdCBhdmFpbGFibGVUb1dyaXRlID0gbVBpcGVTaW5rLT5hdmFpbGFibGVUb1dyaXRlKCk7CisgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IHBpcGVGcmFtZXMgPSBtb25vUGlwZS0+bWF4RnJhbWVzKCk7CisgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGZyYW1lc0xlZnQgPSBwaXBlRnJhbWVzIC0gbWF4KGF2YWlsYWJsZVRvV3JpdGUsIDApOworICAgICAgICAgICAgICAgIC8vIEhBTF9mcmFtZWNvdW50IDw9IGZyYW1lc0RlbGF5IH4gZnJhbWVzTGVmdCAvIDIgPD0gTm9ybWFsX01peGVyX2ZyYW1lY291bnQKKyAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgZnJhbWVzRGVsYXkgPSBzdGQ6Om1pbigKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50LCBtYXgoZnJhbWVzTGVmdCAvIDIsIG1GcmFtZUNvdW50KSk7CisgICAgICAgICAgICAgICAgQUxPR1YoInBpcGVGcmFtZXM6JXp1IGZyYW1lc0xlZnQ6JXp1IGZyYW1lc0RlbGF5OiV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgICBwaXBlRnJhbWVzLCBmcmFtZXNMZWZ0LCBmcmFtZXNEZWxheSk7CisgICAgICAgICAgICAgICAgbVNsZWVwVGltZVVzID0gZnJhbWVzRGVsYXkgKiBNSUNST1NfUEVSX1NFQ09ORCAvIG1TYW1wbGVSYXRlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtU2xlZXBUaW1lVXMgPSBtQWN0aXZlU2xlZXBUaW1lVXMgPj4gc2xlZXBUaW1lU2hpZnQ7CisgICAgICAgICAgICAgICAgaWYgKG1TbGVlcFRpbWVVcyA8IGtNaW5UaHJlYWRTbGVlcFRpbWVVcykgeworICAgICAgICAgICAgICAgICAgICBtU2xlZXBUaW1lVXMgPSBrTWluVGhyZWFkU2xlZXBUaW1lVXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIHJlZHVjZSBzbGVlcCB0aW1lIGluIGNhc2Ugb2YgY29uc2VjdXRpdmUgYXBwbGljYXRpb24gdW5kZXJydW5zIHRvIGF2b2lkCisgICAgICAgICAgICAgICAgLy8gc3RhcnZpbmcgdGhlIGF1ZGlvIEhBTC4gQXMgYWN0aXZlU2xlZXBUaW1lVXMoKSBpcyBsYXJnZXIgdGhhbiBhIGJ1ZmZlcgorICAgICAgICAgICAgICAgIC8vIGR1cmF0aW9uIHdlIHdvdWxkIGVuZCB1cCB3cml0aW5nIGxlc3MgZGF0YSB0aGFuIG5lZWRlZCBieSB0aGUgYXVkaW8gSEFMIGlmCisgICAgICAgICAgICAgICAgLy8gdGhlIGNvbmRpdGlvbiBwZXJzaXN0cy4KKyAgICAgICAgICAgICAgICBpZiAoc2xlZXBUaW1lU2hpZnQgPCBrTWF4VGhyZWFkU2xlZXBUaW1lU2hpZnQpIHsKKyAgICAgICAgICAgICAgICAgICAgc2xlZXBUaW1lU2hpZnQrKzsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtU2xlZXBUaW1lVXMgPSBtSWRsZVNsZWVwVGltZVVzOwpAQCAtNDAwNSw2ICs0MjE3LDE0IEBACiBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjptaXhlcl9zdGF0ZSBBdWRpb0ZsaW5nZXI6Ok1peGVyVGhyZWFkOjpwcmVwYXJlVHJhY2tzX2woCiAgICAgICAgIFZlY3Rvcjwgc3A8VHJhY2s+ID4gKnRyYWNrc1RvUmVtb3ZlKQogeworICAgIC8vIGNsZWFuIHVwIGRlbGV0ZWQgdHJhY2sgbmFtZXMgaW4gQXVkaW9NaXhlciBiZWZvcmUgYWxsb2NhdGluZyBuZXcgdHJhY2tzCisgICAgKHZvaWQpbVRyYWNrcy5wcm9jZXNzRGVsZXRlZFRyYWNrTmFtZXMoW3RoaXNdKGludCBuYW1lKSB7CisgICAgICAgIC8vIGZvciBlYWNoIG5hbWUsIGRlc3Ryb3kgaXQgaW4gdGhlIEF1ZGlvTWl4ZXIKKyAgICAgICAgaWYgKG1BdWRpb01peGVyLT5leGlzdHMobmFtZSkpIHsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5kZXN0cm95KG5hbWUpOworICAgICAgICB9CisgICAgfSk7CisgICAgbVRyYWNrcy5jbGVhckRlbGV0ZWRUcmFja05hbWVzKCk7CiAKICAgICBtaXhlcl9zdGF0ZSBtaXhlclN0YXR1cyA9IE1JWEVSX0lETEU7CiAgICAgLy8gZmluZCBvdXQgd2hpY2ggdHJhY2tzIG5lZWQgdG8gYmUgcHJvY2Vzc2VkCkBAIC00MTgyLDEzICs0NDAyLDE5IEBACiAgICAgICAgICAgICAgICAgICAgIGRpZE1vZGlmeSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIC8vIG5vIGFja25vd2xlZGdlbWVudCByZXF1aXJlZCBmb3IgbmV3bHkgYWN0aXZlIHRyYWNrcwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzcDxBdWRpb1RyYWNrU2VydmVyUHJveHk+IHByb3h5ID0gdHJhY2stPm1BdWRpb1RyYWNrU2VydmVyUHJveHk7CiAgICAgICAgICAgICAgICAgLy8gY2FjaGUgdGhlIGNvbWJpbmVkIG1hc3RlciB2b2x1bWUgYW5kIHN0cmVhbSB0eXBlIHZvbHVtZSBmb3IgZmFzdCBtaXhlcjsgdGhpcwogICAgICAgICAgICAgICAgIC8vIGxhY2tzIGFueSBzeW5jaHJvbml6YXRpb24gb3IgYmFycmllciBzbyBWb2x1bWVQcm92aWRlciBtYXkgcmVhZCBhIHN0YWxlIHZhbHVlCiAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgdmggPSB0cmFjay0+Z2V0Vm9sdW1lSGFuZGxlcigpLT5nZXRWb2x1bWUoCi0gICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzUmVsZWFzZWQoKSkuZmlyc3Q7Ci0gICAgICAgICAgICAgICAgdHJhY2stPm1DYWNoZWRWb2x1bWUgPSBtYXN0ZXJWb2x1bWUKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5LT5mcmFtZXNSZWxlYXNlZCgpKS5maXJzdDsKKyAgICAgICAgICAgICAgICBmbG9hdCB2b2x1bWUgPSBtYXN0ZXJWb2x1bWUKICAgICAgICAgICAgICAgICAgICAgICAgICogbVN0cmVhbVR5cGVzW3RyYWNrLT5zdHJlYW1UeXBlKCldLnZvbHVtZQogICAgICAgICAgICAgICAgICAgICAgICAgKiB2aDsKKyAgICAgICAgICAgICAgICB0cmFjay0+bUNhY2hlZFZvbHVtZSA9IHZvbHVtZTsKKyAgICAgICAgICAgICAgICBnYWluX21pbmlmbG9hdF9wYWNrZWRfdCB2bHIgPSBwcm94eS0+Z2V0Vm9sdW1lTFIoKTsKKyAgICAgICAgICAgICAgICBmbG9hdCB2bGYgPSB2b2x1bWUgKiBmbG9hdF9mcm9tX2dhaW4oZ2Fpbl9taW5pZmxvYXRfdW5wYWNrX2xlZnQodmxyKSk7CisgICAgICAgICAgICAgICAgZmxvYXQgdnJmID0gdm9sdW1lICogZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19yaWdodCh2bHIpKTsKKyAgICAgICAgICAgICAgICB0cmFjay0+c2V0RmluYWxWb2x1bWUoKHZsZiArIHZyZikgLyAyLmYpOwogICAgICAgICAgICAgICAgICsrZmFzdFRyYWNrczsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gd2FzIGl0IHByZXZpb3VzbHkgYWN0aXZlPwpAQCAtNDIwMSwxMCArNDQyNywxNiBAQAogICAgICAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIHdlJ3JlIGFib3V0IHRvIGRlY3JlbWVudCB0aGUgbGFzdCBzcDw+IG9uIHRob3NlIHRyYWNrcy4KICAgICAgICAgICAgICAgICAgICAgYmxvY2sgPSBGYXN0TWl4ZXJTdGF0ZVF1ZXVlOjpCTE9DS19VTlRJTF9BQ0tFRDsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJmYXN0IHRyYWNrICVkIHNob3VsZCBoYXZlIGJlZW4gYWN0aXZlOyAiCisgICAgICAgICAgICAgICAgICAgIC8vIEFMT0dXIHJhdGhlciB0aGFuIExPR19BTFdBWVNfRkFUQUwgYmVjYXVzZSBpdCBzZWVtcyB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgYW4KKyAgICAgICAgICAgICAgICAgICAgLy8gQXVkaW9UcmFjayBtYXkgc3RhcnQgKHdoaWNoIG1heSBub3QgYmUgd2l0aCBhIHN0YXJ0KCkgYnV0IHdpdGggYSB3cml0ZSgpCisgICAgICAgICAgICAgICAgICAgIC8vIGFmdGVyIHVuZGVycnVuKSBhbmQgaW1tZWRpYXRlbHkgcGF1c2VkIG9yIHJlbGVhc2VkLiAgSW4gdGhhdCBjYXNlIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBGYXN0VHJhY2sgc3RhdGUgaGFzbid0IGhhZCB0aW1lIHRvIHVwZGF0ZS4KKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyBSZW1vdmUgdGhlIEFMT0dXIHdoZW4gdGhpcyB0aGVvcnkgaXMgY29uZmlybWVkLgorICAgICAgICAgICAgICAgICAgICBBTE9HVygiZmFzdCB0cmFjayAlZCBzaG91bGQgaGF2ZSBiZWVuIGFjdGl2ZTsgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtU3RhdGU9JWQsIG1UcmFja01hc2s9JSN4LCByZWNlbnRVbmRlcnJ1bnM9JXUsIGlzU2hhcmVkPSVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqLCB0cmFjay0+bVN0YXRlLCBzdGF0ZS0+bVRyYWNrTWFzaywgcmVjZW50VW5kZXJydW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5zaGFyZWRCdWZmZXIoKSAhPSAwKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgdGhlIEZhc3RNaXhlciBzdGF0ZSBhbHJlYWR5IGhhcyB0aGUgdHJhY2sgaW5hY3RpdmUsIGRvIG5vdGhpbmcgaGVyZS4KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgdHJhY2tzVG9SZW1vdmUtPmFkZCh0cmFjayk7CiAgICAgICAgICAgICAgICAgLy8gQXZvaWRzIGEgbWlzbGVhZGluZyBkaXNwbGF5IGluIGR1bXBzeXMKQEAgLTQyMjAsNiArNDQ1MiwyNCBAQAogICAgICAgICAvLyBUaGUgZmlyc3QgdGltZSBhIHRyYWNrIGlzIGFkZGVkIHdlIHdhaXQKICAgICAgICAgLy8gZm9yIGFsbCBpdHMgYnVmZmVycyB0byBiZSBmaWxsZWQgYmVmb3JlIHByb2Nlc3NpbmcgaXQKICAgICAgICAgaW50IG5hbWUgPSB0cmFjay0+bmFtZSgpOworCisgICAgICAgIC8vIGlmIGFuIGFjdGl2ZSB0cmFjayBkb2Vzbid0IGV4aXN0IGluIHRoZSBBdWRpb01peGVyLCBjcmVhdGUgaXQuCisgICAgICAgIGlmICghbUF1ZGlvTWl4ZXItPmV4aXN0cyhuYW1lKSkgeworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUF1ZGlvTWl4ZXItPmNyZWF0ZSgKKyAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1DaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1Gb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tU2Vzc2lvbklkKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXM6IGNhbm5vdCBjcmVhdGUgdHJhY2sgbmFtZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgJWQsIG1hc2sgJSN4LCBmb3JtYXQgJSN4LCBzZXNzaW9uSWQgJWQgaW4gQXVkaW9NaXhlciIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbmFtZSwgdHJhY2stPm1DaGFubmVsTWFzaywgdHJhY2stPm1Gb3JtYXQsIHRyYWNrLT5tU2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICB0cmFja3NUb1JlbW92ZS0+YWRkKHRyYWNrKTsKKyAgICAgICAgICAgICAgICB0cmFjay0+aW52YWxpZGF0ZSgpOyAvLyBjb25zaWRlciBpdCBkZWFkLgorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSBlbm91Z2ggZnJhbWVzIHRvIG1peCBvbmUgZnVsbCBidWZmZXIuCiAgICAgICAgIC8vIGVuZm9yY2UgdGhpcyBjb25kaXRpb24gb25seSBvbmNlIHRvIGVuYWJsZSBkcmFpbmluZyB0aGUgYnVmZmVyIGluIGNhc2UgdGhlIGNsaWVudAogICAgICAgICAvLyBhcHAgZG9lcyBub3QgY2FsbCBzdG9wKCkgYW5kIHJlbGllcyBvbiB1bmRlcnJ1biB0byBzdG9wOgpAQCAtNDI0NSwyMCArNDQ5NSw5IEBACiAgICAgICAgIHNpemVfdCBmcmFtZXNSZWFkeSA9IHRyYWNrLT5mcmFtZXNSZWFkeSgpOwogICAgICAgICBpZiAoQVRSQUNFX0VOQUJMRUQoKSkgewogICAgICAgICAgICAgLy8gSSB3aXNoIHdlIGhhZCBmb3JtYXR0ZWQgdHJhY2UgbmFtZXMKLSAgICAgICAgICAgIGNoYXIgdHJhY2VOYW1lWzE2XTsKLSAgICAgICAgICAgIHN0cmNweSh0cmFjZU5hbWUsICJuUmR5Iik7Ci0gICAgICAgICAgICBpbnQgbmFtZSA9IHRyYWNrLT5uYW1lKCk7Ci0gICAgICAgICAgICBpZiAoQXVkaW9NaXhlcjo6VFJBQ0swIDw9IG5hbWUgJiYKLSAgICAgICAgICAgICAgICAgICAgbmFtZSA8IChpbnQpIChBdWRpb01peGVyOjpUUkFDSzAgKyBBdWRpb01peGVyOjpNQVhfTlVNX1RSQUNLUykpIHsKLSAgICAgICAgICAgICAgICBuYW1lIC09IEF1ZGlvTWl4ZXI6OlRSQUNLMDsKLSAgICAgICAgICAgICAgICB0cmFjZU5hbWVbNF0gPSAobmFtZSAvIDEwKSArICcwJzsKLSAgICAgICAgICAgICAgICB0cmFjZU5hbWVbNV0gPSAobmFtZSAlIDEwKSArICcwJzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdHJhY2VOYW1lWzRdID0gJz8nOwotICAgICAgICAgICAgICAgIHRyYWNlTmFtZVs1XSA9ICc/JzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyYWNlTmFtZVs2XSA9ICdcMCc7Ci0gICAgICAgICAgICBBVFJBQ0VfSU5UKHRyYWNlTmFtZSwgZnJhbWVzUmVhZHkpOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgdHJhY2VOYW1lKCJuUmR5Iik7CisgICAgICAgICAgICB0cmFjZU5hbWUgKz0gc3RkOjp0b19zdHJpbmcodHJhY2stPm5hbWUoKSk7CisgICAgICAgICAgICBBVFJBQ0VfSU5UKHRyYWNlTmFtZS5jX3N0cigpLCBmcmFtZXNSZWFkeSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKChmcmFtZXNSZWFkeSA+PSBtaW5GcmFtZXMpICYmIHRyYWNrLT5pc1JlYWR5KCkgJiYKICAgICAgICAgICAgICAgICAhdHJhY2stPmlzUGF1c2VkKCkgJiYgIXRyYWNrLT5pc1Rlcm1pbmF0ZWQoKSkKQEAgLTQzNTIsNiArNDU5MSw4IEBACiAgICAgICAgICAgICAgICAgdmFmID0gdiAqIHNlbmRMZXZlbCAqICgxLiAvIE1BWF9HQUlOX0lOVCk7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIHRyYWNrLT5zZXRGaW5hbFZvbHVtZSgodnJmICsgdmxmKSAvIDIuZik7CisKICAgICAgICAgICAgIC8vIERlbGVnYXRlIHZvbHVtZSBjb250cm9sIHRvIGVmZmVjdCBpbiB0cmFjayBlZmZlY3QgY2hhaW4gaWYgbmVlZGVkCiAgICAgICAgICAgICBpZiAoY2hhaW4gIT0gMCAmJiBjaGFpbi0+c2V0Vm9sdW1lX2woJnZsLCAmdnIpKSB7CiAgICAgICAgICAgICAgICAgLy8gRG8gbm90IHJhbXAgdm9sdW1lIGlmIHZvbHVtZSBpcyBjb250cm9sbGVkIGJ5IGVmZmVjdApAQCAtNDQ1Nyw3ICs0Njk4LDcgQEAKICAgICAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAotICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUlYRVJfRk9STUFULCAodm9pZCAqKUFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6Ok1JWEVSX0ZPUk1BVCwgKHZvaWQgKilFRkZFQ1RfQlVGRkVSX0ZPUk1BVCk7CiAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKQEAgLTQ1ODEsNiArNDgyMiwxOCBAQAogICAgICAgICB0cmFjay0+cmVzZXQoKTsKICAgICB9CiAKKyAgICAvLyBUcmFjayBkZXN0cnVjdGlvbiBtYXkgb2NjdXIgb3V0c2lkZSBvZiB0aHJlYWRMb29wIG9uY2UgaXQgaXMgcmVtb3ZlZCBmcm9tIGFjdGl2ZSB0cmFja3MuCisgICAgLy8gRW5zdXJlIHRoZSBBdWRpb01peGVyIGRvZXNuJ3QgaGF2ZSBhIHJhdyAiYnVmZmVyIHByb3ZpZGVyIiBwb2ludGVyIHRvIHRoZSB0cmFjayBpZgorICAgIC8vIGl0IGNlYXNlcyB0byBiZSBhY3RpdmUsIHRvIGFsbG93IHNhZmUgcmVtb3ZhbCBmcm9tIHRoZSBBdWRpb01peGVyIGF0IHRoZSBzdGFydAorICAgIC8vIG9mIHByZXBhcmVUcmFja3NfbCgpOyB0aGlzIHJlbGVhc2VzIGFueSBvdXRzdGFuZGluZyBidWZmZXIgYmFjayB0byB0aGUgdHJhY2suCisgICAgLy8gU2VlIGFsc28gdGhlIGltcGxlbWVudGF0aW9uIG9mIGRlc3Ryb3lUcmFja19sKCkuCisgICAgZm9yIChjb25zdCBhdXRvICZ0cmFjayA6ICp0cmFja3NUb1JlbW92ZSkgeworICAgICAgICBjb25zdCBpbnQgbmFtZSA9IHRyYWNrLT5uYW1lKCk7CisgICAgICAgIGlmIChtQXVkaW9NaXhlci0+ZXhpc3RzKG5hbWUpKSB7IC8vIE5vcm1hbCB0cmFja3MgaGVyZSwgZmFzdCB0cmFja3MgaW4gRmFzdE1peGVyLgorICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldEJ1ZmZlclByb3ZpZGVyKG5hbWUsIG51bGxwdHIgLyogYnVmZmVyUHJvdmlkZXIgKi8pOworICAgICAgICB9CisgICAgfQorCiAgICAgLy8gcmVtb3ZlIGFsbCB0aGUgdHJhY2tzIHRoYXQgbmVlZCB0byBiZS4uLgogICAgIHJlbW92ZVRyYWNrc19sKCp0cmFja3NUb1JlbW92ZSk7CiAKQEAgLTQ2MjQsNyArNDg3Nyw3IEBACiB9CiAKIC8vIHRyYWNrQ291bnRGb3JVaWRfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAotdWludDMyX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6dHJhY2tDb3VudEZvclVpZF9sKHVpZF90IHVpZCkKK3VpbnQzMl90IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OnRyYWNrQ291bnRGb3JVaWRfbCh1aWRfdCB1aWQpIGNvbnN0CiB7CiAgICAgdWludDMyX3QgdHJhY2tDb3VudCA9IDA7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKSA7IGkrKykgewpAQCAtNDYzNSwyMSArNDg4OCwyNCBAQAogICAgIHJldHVybiB0cmFja0NvdW50OwogfQogCi0vLyBnZXRUcmFja05hbWVfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAotaW50IEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6OmdldFRyYWNrTmFtZV9sKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsIHVpZF90IHVpZCkKKy8vIGlzVHJhY2tBbGxvd2VkX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKK2Jvb2wgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6aXNUcmFja0FsbG93ZWRfbCgKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwgdWlkX3QgdWlkKSBjb25zdAogewotICAgIGlmICh0cmFja0NvdW50Rm9yVWlkX2wodWlkKSA+IChQbGF5YmFja1RocmVhZDo6a01heFRyYWNrc1BlclVpZCAtIDEpKSB7Ci0gICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoIVBsYXliYWNrVGhyZWFkOjppc1RyYWNrQWxsb3dlZF9sKGNoYW5uZWxNYXNrLCBmb3JtYXQsIHNlc3Npb25JZCwgdWlkKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIHJldHVybiBtQXVkaW9NaXhlci0+Z2V0VHJhY2tOYW1lKGNoYW5uZWxNYXNrLCBmb3JtYXQsIHNlc3Npb25JZCk7Ci19Ci0KLS8vIGRlbGV0ZVRyYWNrTmFtZV9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCi12b2lkIEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6OmRlbGV0ZVRyYWNrTmFtZV9sKGludCBuYW1lKQotewotICAgIEFMT0dWKCJyZW1vdmUgdHJhY2sgKCVkKSBhbmQgZGVsZXRlIGZyb20gbWl4ZXIiLCBuYW1lKTsKLSAgICBtQXVkaW9NaXhlci0+ZGVsZXRlVHJhY2tOYW1lKG5hbWUpOworICAgIC8vIENoZWNrIHZhbGlkaXR5IGFzIHdlIGRvbid0IGNhbGwgQXVkaW9NaXhlcjo6Y3JlYXRlKCkgaGVyZS4KKyAgICBpZiAoIUF1ZGlvTWl4ZXI6OmlzVmFsaWRGb3JtYXQoZm9ybWF0KSkgeworICAgICAgICBBTE9HVygiJXM6IGludmFsaWQgZm9ybWF0OiAlI3giLCBfX2Z1bmNfXywgZm9ybWF0KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoIUF1ZGlvTWl4ZXI6OmlzVmFsaWRDaGFubmVsTWFzayhjaGFubmVsTWFzaykpIHsKKyAgICAgICAgQUxPR1coIiVzOiBpbnZhbGlkIGNoYW5uZWxNYXNrOiAlI3giLCBfX2Z1bmNfXywgY2hhbm5lbE1hc2spOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOwogfQogCiAvLyBjaGVja0Zvck5ld1BhcmFtZXRlcl9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCkBAIC00NzQyLDEzICs0OTk4LDE4IEBACiAgICAgICAgICAgICByZWFkT3V0cHV0UGFyYW1ldGVyc19sKCk7CiAgICAgICAgICAgICBkZWxldGUgbUF1ZGlvTWl4ZXI7CiAgICAgICAgICAgICBtQXVkaW9NaXhlciA9IG5ldyBBdWRpb01peGVyKG1Ob3JtYWxGcmFtZUNvdW50LCBtU2FtcGxlUmF0ZSk7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpIDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IG5hbWUgPSBnZXRUcmFja05hbWVfbChtVHJhY2tzW2ldLT5tQ2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tzW2ldLT5tRm9ybWF0LCBtVHJhY2tzW2ldLT5tU2Vzc2lvbklkLCBtVHJhY2tzW2ldLT51aWQoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWUgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtVHJhY2tzW2ldLT5tTmFtZSA9IG5hbWU7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnRyYWNrIDogbVRyYWNrcykgeworICAgICAgICAgICAgICAgIGNvbnN0IGludCBuYW1lID0gdHJhY2stPm5hbWUoKTsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQXVkaW9NaXhlci0+Y3JlYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tU2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICBBTE9HV19JRihzdGF0dXMgIT0gTk9fRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IGNhbm5vdCBjcmVhdGUgdHJhY2sgbmFtZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgJWQsIG1hc2sgJSN4LCBmb3JtYXQgJSN4LCBzZXNzaW9uSWQgJWQgaW4gQXVkaW9NaXhlciIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHRyYWNrLT5tQ2hhbm5lbE1hc2ssIHRyYWNrLT5tRm9ybWF0LCB0cmFjay0+bVNlc3Npb25JZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKEFVRElPX09VVFBVVF9DT05GSUdfQ0hBTkdFRCk7CiAgICAgICAgIH0KQEAgLTQ3NjIsNyArNTAyMyw3IEBACiB7CiAgICAgUGxheWJhY2tUaHJlYWQ6OmR1bXBJbnRlcm5hbHMoZmQsIGFyZ3MpOwogICAgIGRwcmludGYoZmQsICIgIFRocmVhZCB0aHJvdHRsZSB0aW1lIChtc2Vjcyk6ICV1XG4iLCBtVGhyZWFkVGhyb3R0bGVUaW1lTXMpOwotICAgIGRwcmludGYoZmQsICIgIEF1ZGlvTWl4ZXIgdHJhY2tzOiAweCUwOHhcbiIsIG1BdWRpb01peGVyLT50cmFja05hbWVzKCkpOworICAgIGRwcmludGYoZmQsICIgIEF1ZGlvTWl4ZXIgdHJhY2tzOiAlc1xuIiwgbUF1ZGlvTWl4ZXItPnRyYWNrTmFtZXMoKS5jX3N0cigpKTsKICAgICBkcHJpbnRmKGZkLCAiICBNYXN0ZXIgbW9ubzogJXNcbiIsIG1NYXN0ZXJNb25vID8gIm9uIiA6ICJvZmYiKTsKIAogICAgIGlmIChoYXNGYXN0TWl4ZXIoKSkgewpAQCAtNDg3Niw2ICs1MTM3LDcgQEAKICAgICB9CiAKICAgICBpZiAobGFzdFRyYWNrKSB7CisgICAgICAgIHRyYWNrLT5zZXRGaW5hbFZvbHVtZSgobGVmdCArIHJpZ2h0KSAvIDIuZik7CiAgICAgICAgIGlmIChsZWZ0ICE9IG1MZWZ0Vm9sRmxvYXQgfHwgcmlnaHQgIT0gbVJpZ2h0Vm9sRmxvYXQpIHsKICAgICAgICAgICAgIG1MZWZ0Vm9sRmxvYXQgPSBsZWZ0OwogICAgICAgICAgICAgbVJpZ2h0Vm9sRmxvYXQgPSByaWdodDsKQEAgLTUxOTcsMjEgKzU0NTksNiBAQAogICAgIHJldHVybiAhbVN0YW5kYnkgJiYgISh0cmFja1BhdXNlZCB8fCAobUh3UGF1c2VkICYmICF0cmFja1N0b3BwZWQpKTsKIH0KIAotLy8gZ2V0VHJhY2tOYW1lX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKLWludCBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6Z2V0VHJhY2tOYW1lX2woYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgX191bnVzZWQsCi0gICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCBfX3VudXNlZCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCBfX3VudXNlZCwgdWlkX3QgdWlkKQotewotICAgIGlmICh0cmFja0NvdW50Rm9yVWlkX2wodWlkKSA+IChQbGF5YmFja1RocmVhZDo6a01heFRyYWNrc1BlclVpZCAtIDEpKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8vIGRlbGV0ZVRyYWNrTmFtZV9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCi12b2lkIEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpkZWxldGVUcmFja05hbWVfbChpbnQgbmFtZSBfX3VudXNlZCkKLXsKLX0KLQogLy8gY2hlY2tGb3JOZXdQYXJhbWV0ZXJfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAogYm9vbCBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6Y2hlY2tGb3JOZXdQYXJhbWV0ZXJfbChjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190JiBzdGF0dXMpCkBAIC01NDQ5LDcgKzU2OTYsNyBAQAogICAgICAgICBtUGF1c2VkV3JpdGVMZW5ndGgoMCksIG1QYXVzZWRCeXRlc1JlbWFpbmluZygwKSwgbUtlZXBXYWtlTG9jayh0cnVlKSwKICAgICAgICAgbU9mZmxvYWRVbmRlcnJ1blBvc2l0aW9uKH4wTEwpCiB7Ci0gICAgLy9GSVhNRTogbVN0YW5kYnkgc2hvdWxkIGJlIHNldCB0byB0cnVlIGJ5IFRocmVhZEJhc2UgY29uc3RydWN0b3IKKyAgICAvL0ZJWE1FOiBtU3RhbmRieSBzaG91bGQgYmUgc2V0IHRvIHRydWUgYnkgVGhyZWFkQmFzZSBjb25zdHJ1Y3RvCiAgICAgbVN0YW5kYnkgPSB0cnVlOwogICAgIG1LZWVwV2FrZUxvY2sgPSBwcm9wZXJ0eV9nZXRfYm9vbCgicm8uYXVkaW8ub2ZmbG9hZF93YWtlbG9jayIsIHRydWUgLyogZGVmYXVsdF92YWx1ZSAqLyk7CiB9CkBAIC01ODI5LDYgKzYwNzYsMzEgQEAKICAgICB9CiB9CiAKK3ZvaWQgQXVkaW9GbGluZ2VyOjpEdXBsaWNhdGluZ1RocmVhZDo6ZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCit7CisgICAgTWl4ZXJUaHJlYWQ6OmR1bXBJbnRlcm5hbHMoZmQsIGFyZ3MpOworCisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgY29uc3Qgc2l6ZV90IG51bVRyYWNrcyA9IG1PdXRwdXRUcmFja3Muc2l6ZSgpOworICAgIHNzIDw8ICIgICIgPDwgbnVtVHJhY2tzIDw8ICIgT3V0cHV0VHJhY2tzIjsKKyAgICBpZiAobnVtVHJhY2tzID4gMCkgeworICAgICAgICBzcyA8PCAiOiI7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmdHJhY2sgOiBtT3V0cHV0VHJhY2tzKSB7CisgICAgICAgICAgICBjb25zdCBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSB0cmFjay0+dGhyZWFkKCkucHJvbW90ZSgpOworICAgICAgICAgICAgc3MgPDwgIiAoIiA8PCB0cmFjay0+bmFtZSgpIDw8ICIgOiAiOworICAgICAgICAgICAgaWYgKHRocmVhZC5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgc3MgPDwgdGhyZWFkLmdldCgpIDw8ICIsICIgPDwgdGhyZWFkLT5pZCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzcyA8PCAibnVsbCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcyA8PCAiKSI7CisgICAgICAgIH0KKyAgICB9CisgICAgc3MgPDwgIlxuIjsKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQgPSBzcy5zdHIoKTsKKyAgICB3cml0ZShmZCwgcmVzdWx0LmNfc3RyKCksIHJlc3VsdC5zaXplKCkpOworfQorCiB2b2lkIEF1ZGlvRmxpbmdlcjo6RHVwbGljYXRpbmdUaHJlYWQ6OnNhdmVPdXRwdXRUcmFja3MoKQogewogICAgIG91dHB1dFRyYWNrcyA9IG1PdXRwdXRUcmFja3M7CkBAIC01OTIzLDYgKzYxOTUsMTQgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAordm9pZCBBdWRpb0ZsaW5nZXI6OkR1cGxpY2F0aW5nVGhyZWFkOjpzZW5kTWV0YWRhdGFUb0JhY2tlbmRfbCgKKyAgICAgICAgY29uc3QgU3RyZWFtT3V0SGFsSW50ZXJmYWNlOjpTb3VyY2VNZXRhZGF0YSYgbWV0YWRhdGEpCit7CisgICAgZm9yIChhdXRvJiBvdXRwdXRUcmFjayA6IG91dHB1dFRyYWNrcykgeyAvLyBub3QgbU91dHB1dFRyYWNrcworICAgICAgICBvdXRwdXRUcmFjay0+c2V0TWV0YWRhdGFzKG1ldGFkYXRhLnRyYWNrcyk7CisgICAgfQorfQorCiB1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OkR1cGxpY2F0aW5nVGhyZWFkOjphY3RpdmVTbGVlcFRpbWVVcygpIGNvbnN0CiB7CiAgICAgcmV0dXJuIChtV2FpdFRpbWVNcyAqIDEwMDApIC8gMjsKQEAgLTYyNTAsNiArNjUzMCw4IEBACiAKICAgICAgICAgICAgIG1BY3RpdmVUcmFja3MudXBkYXRlUG93ZXJTdGF0ZSh0aGlzKTsKIAorICAgICAgICAgICAgdXBkYXRlTWV0YWRhdGFfbCgpOworCiAgICAgICAgICAgICBpZiAoYWxsU3RvcHBlZCkgewogICAgICAgICAgICAgICAgIHN0YW5kYnlJZk5vdEFscmVhZHlJblN0YW5kYnkoKTsKICAgICAgICAgICAgIH0KQEAgLTYzMzYsMTMgKzY2MTgsMjcgQEAKICAgICAgICAgaWYgKG1QaXBlU291cmNlICE9IDApIHsKICAgICAgICAgICAgIHNpemVfdCBmcmFtZXNUb1JlYWQgPSBtQnVmZmVyU2l6ZSAvIG1GcmFtZVNpemU7CiAgICAgICAgICAgICBmcmFtZXNUb1JlYWQgPSBtaW4obVJzbXBJbkZyYW1lc09BIC0gcmVhciwgbVJzbXBJbkZyYW1lc1AyIC8gMik7Ci0gICAgICAgICAgICBmcmFtZXNSZWFkID0gbVBpcGVTb3VyY2UtPnJlYWQoKHVpbnQ4X3QqKW1Sc21wSW5CdWZmZXIgKyByZWFyICogbUZyYW1lU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgZnJhbWVzVG9SZWFkKTsKLSAgICAgICAgICAgIC8vIHNpbmNlIHBpcGUgaXMgbm9uLWJsb2NraW5nLCBzaW11bGF0ZSBibG9ja2luZyBpbnB1dCBieSB3YWl0aW5nIGZvciAxLzIgb2YKLSAgICAgICAgICAgIC8vIGJ1ZmZlciBzaXplIG9yIGF0IGxlYXN0IGZvciAyMG1zLgotICAgICAgICAgICAgc2l6ZV90IHNsZWVwRnJhbWVzID0gbWF4KAotICAgICAgICAgICAgICAgICAgICBtaW4obVBpcGVGcmFtZXNQMiwgbVJzbXBJbkZyYW1lc1AyKSAvIDIsIEZNU18yMCAqIG1TYW1wbGVSYXRlIC8gMTAwMCk7Ci0gICAgICAgICAgICBpZiAoZnJhbWVzUmVhZCA8PSAoc3NpemVfdCkgc2xlZXBGcmFtZXMpIHsKKworICAgICAgICAgICAgLy8gVGhlIGF1ZGlvIGZpZm8gcmVhZCgpIHJldHVybnMgT1ZFUlJVTiBvbiBvdmVyZmxvdywgYW5kIGFkdmFuY2VzIHRoZSByZWFkIHBvaW50ZXIKKyAgICAgICAgICAgIC8vIHRvIHRoZSBmdWxsIGJ1ZmZlciBwb2ludCAoY2xlYXJpbmcgdGhlIG92ZXJmbG93IGNvbmRpdGlvbikuICBVcG9uIE9WRVJSVU4gZXJyb3IsCisgICAgICAgICAgICAvLyB3ZSBpbW1lZGlhdGVseSByZXRyeSB0aGUgcmVhZCgpIHRvIGdldCBkYXRhIGFuZCBwcmV2ZW50IGFub3RoZXIgb3ZlcmZsb3cuCisgICAgICAgICAgICBmb3IgKGludCByZXRyaWVzID0gMDsgcmV0cmllcyA8PSAyOyArK3JldHJpZXMpIHsKKyAgICAgICAgICAgICAgICBBTE9HV19JRihyZXRyaWVzID4gMCwgIm92ZXJydW4gb24gcmVhZCBmcm9tIHBpcGUsIHJldHJ5ICMlZCIsIHJldHJpZXMpOworICAgICAgICAgICAgICAgIGZyYW1lc1JlYWQgPSBtUGlwZVNvdXJjZS0+cmVhZCgodWludDhfdCopbVJzbXBJbkJ1ZmZlciArIHJlYXIgKiBtRnJhbWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzVG9SZWFkKTsKKyAgICAgICAgICAgICAgICBpZiAoZnJhbWVzUmVhZCAhPSBPVkVSUlVOKSBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29uc3Qgc3NpemVfdCBhdmFpbGFibGVUb1JlYWQgPSBtUGlwZVNvdXJjZS0+YXZhaWxhYmxlVG9SZWFkKCk7CisgICAgICAgICAgICBpZiAoYXZhaWxhYmxlVG9SZWFkID49IDApIHsKKyAgICAgICAgICAgICAgICAvLyBQaXBlU291cmNlIGlzIHRoZSBtYXN0ZXIgY2xvY2suICBJdCBpcyB1cCB0byB0aGUgQXVkaW9SZWNvcmQgY2xpZW50IHRvIGtlZXAgdXAuCisgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigoc2l6ZV90KWF2YWlsYWJsZVRvUmVhZCA+IG1QaXBlRnJhbWVzUDIsCisgICAgICAgICAgICAgICAgICAgICAgICAibW9yZSBmcmFtZXMgdG8gcmVhZCB0aGFuIGZpZm8gc2l6ZSwgJXpkID4gJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZVRvUmVhZCwgbVBpcGVGcmFtZXNQMik7CisgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IHBpcGVGcmFtZXNGcmVlID0gbVBpcGVGcmFtZXNQMiAtIGF2YWlsYWJsZVRvUmVhZDsKKyAgICAgICAgICAgICAgICBjb25zdCBzaXplX3Qgc2xlZXBGcmFtZXMgPSBtaW4ocGlwZUZyYW1lc0ZyZWUsIG1Sc21wSW5GcmFtZXNQMikgLyAyOworICAgICAgICAgICAgICAgIEFMT0dWVigibVBpcGVGcmFtZXNQMjolenUgbVJzbXBJbkZyYW1lc1AyOiV6dSBzbGVlcEZyYW1lczolenUgYXZhaWxhYmxlVG9SZWFkOiV6ZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBtUGlwZUZyYW1lc1AyLCBtUnNtcEluRnJhbWVzUDIsIHNsZWVwRnJhbWVzLCBhdmFpbGFibGVUb1JlYWQpOwogICAgICAgICAgICAgICAgIHNsZWVwVXMgPSAoc2xlZXBGcmFtZXMgKiAxMDAwMDAwTEwpIC8gbVNhbXBsZVJhdGU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZnJhbWVzUmVhZCA8IDApIHsKQEAgLTY0MjIsNiArNjcxOCw3IEBACiAgICAgICAgIHJlYXIgPSBtUnNtcEluUmVhciArPSBmcmFtZXNSZWFkOwogCiAgICAgICAgIHNpemUgPSBhY3RpdmVUcmFja3Muc2l6ZSgpOworCiAgICAgICAgIC8vIGxvb3Agb3ZlciBlYWNoIGFjdGl2ZSB0cmFjawogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgewogICAgICAgICAgICAgYWN0aXZlVHJhY2sgPSBhY3RpdmVUcmFja3NbaV07CkBAIC02NDc4LDYgKzY3NzUsMTEgQEAKICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlVHJhY2stPm1GcmFtZXNUb0Ryb3AgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVzT3V0ID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1TaW5rLmZyYW1lQ291bnQgPSBmcmFtZXNPdXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW5pdGl6ZSBiZWZvcmUgcmVsZWFzaW5nIGlmIHRoZSB0cmFjayBoYXMgbm8gYWNjZXNzIHRvIHRoZSBzb3VyY2UgZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gQW4gaWRsZSBVSUQgcmVjZWl2ZXMgc2lsZW5jZSBmcm9tIG5vbiB2aXJ0dWFsIGRldmljZXMgdW50aWwgYWN0aXZlCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlVHJhY2stPmlzU2lsZW5jZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChhY3RpdmVUcmFjay0+bVNpbmsucmF3LCAwLCBmcmFtZXNPdXQgKiBtRnJhbWVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5yZWxlYXNlQnVmZmVyKCZhY3RpdmVUcmFjay0+bVNpbmspOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTY2MDgsMTIgKzY5MTAsMTMgQEAKIC8vIFJlY29yZFRocmVhZDo6Y3JlYXRlUmVjb3JkVHJhY2tfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBoZWxkCiBzcDxBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s+IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpjcmVhdGVSZWNvcmRUcmFja19sKAogICAgICAgICBjb25zdCBzcDxBdWRpb0ZsaW5nZXI6OkNsaWVudD4mIGNsaWVudCwKLSAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyLAorICAgICAgICB1aW50MzJfdCAqcFNhbXBsZVJhdGUsCiAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgIHNpemVfdCAqcEZyYW1lQ291bnQsCiAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCi0gICAgICAgIHNpemVfdCAqbm90aWZpY2F0aW9uRnJhbWVzLAorICAgICAgICBzaXplX3QgKnBOb3RpZmljYXRpb25GcmFtZUNvdW50LAogICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgKmZsYWdzLAogICAgICAgICBwaWRfdCB0aWQsCkBAIC02NjIxLDE2ICs2OTI0LDMwIEBACiAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewogICAgIHNpemVfdCBmcmFtZUNvdW50ID0gKnBGcmFtZUNvdW50OworICAgIHNpemVfdCBub3RpZmljYXRpb25GcmFtZUNvdW50ID0gKnBOb3RpZmljYXRpb25GcmFtZUNvdW50OwogICAgIHNwPFJlY29yZFRyYWNrPiB0cmFjazsKICAgICBzdGF0dXNfdCBsU3RhdHVzOwogICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgaW5wdXRGbGFncyA9IG1JbnB1dC0+ZmxhZ3M7CisgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCByZXF1ZXN0ZWRGbGFncyA9ICpmbGFnczsKKyAgICB1aW50MzJfdCBzYW1wbGVSYXRlOworCisgICAgbFN0YXR1cyA9IGluaXRDaGVjaygpOworICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCJjcmVhdGVSZWNvcmRUcmFja19sKCkgYXVkaW8gZHJpdmVyIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgaWYgKCpwU2FtcGxlUmF0ZSA9PSAwKSB7CisgICAgICAgICpwU2FtcGxlUmF0ZSA9IG1TYW1wbGVSYXRlOworICAgIH0KKyAgICBzYW1wbGVSYXRlID0gKnBTYW1wbGVSYXRlOwogCiAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciBGQVNUIGZsYWcgY29uc2lkZXJlZCBPSyBpZiBmYXN0IGNhcHR1cmUgaXMgcHJlc2VudAogICAgIGlmIChoYXNGYXN0Q2FwdHVyZSgpKSB7CiAgICAgICAgIGlucHV0RmxhZ3MgPSAoYXVkaW9faW5wdXRfZmxhZ3NfdCkoaW5wdXRGbGFncyB8IEFVRElPX0lOUFVUX0ZMQUdfRkFTVCk7CiAgICAgfQogCi0gICAgLy8gQ2hlY2sgaWYgcmVxdWVzdGVkIGZsYWdzIGFyZSBjb21wYXRpYmxlIHdpdGggb3V0cHV0IHN0cmVhbSBmbGFncworICAgIC8vIENoZWNrIGlmIHJlcXVlc3RlZCBmbGFncyBhcmUgY29tcGF0aWJsZSB3aXRoIGlucHV0IHN0cmVhbSBmbGFncwogICAgIGlmICgoKmZsYWdzICYgaW5wdXRGbGFncykgIT0gKmZsYWdzKSB7CiAgICAgICAgIEFMT0dXKCJjcmVhdGVSZWNvcmRUcmFja19sKCk6IG1pc21hdGNoIGJldHdlZW4gcmVxdWVzdGVkIGZsYWdzICglMDh4KSBhbmQiCiAgICAgICAgICAgICAgICAgIiBpbnB1dCBmbGFncyAoJTA4eCkiLApAQCAtNjY4NSwxMiArNzAwMiwyMCBAQAogICAgICAgfQogICAgIH0KIAorICAgIC8vIElmIEZBU1Qgb3IgUkFXIGZsYWdzIHdlcmUgY29ycmVjdGVkLCBhc2sgY2FsbGVyIHRvIHJlcXVlc3QgbmV3IGlucHV0IGZyb20gYXVkaW8gcG9saWN5CisgICAgaWYgKCgqZmxhZ3MgJiBBVURJT19JTlBVVF9GTEFHX0ZBU1QpICE9CisgICAgICAgICAgICAocmVxdWVzdGVkRmxhZ3MgJiBBVURJT19JTlBVVF9GTEFHX0ZBU1QpKSB7CisgICAgICAgICpmbGFncyA9IChhdWRpb19pbnB1dF9mbGFnc190KSAoKmZsYWdzICYgfihBVURJT19JTlBVVF9GTEFHX0ZBU1QgfCBBVURJT19JTlBVVF9GTEFHX1JBVykpOworICAgICAgICBsU3RhdHVzID0gQkFEX1RZUEU7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisKICAgICAvLyBjb21wdXRlIHRyYWNrIGJ1ZmZlciBzaXplIGluIGZyYW1lcywgYW5kIHN1Z2dlc3QgdGhlIG5vdGlmaWNhdGlvbiBmcmFtZSBjb3VudAogICAgIGlmICgqZmxhZ3MgJiBBVURJT19JTlBVVF9GTEFHX0ZBU1QpIHsKICAgICAgICAgLy8gZmFzdCB0cmFjazogZnJhbWUgY291bnQgaXMgZXhhY3RseSB0aGUgcGlwZSBkZXB0aAogICAgICAgICBmcmFtZUNvdW50ID0gbVBpcGVGcmFtZXNQMjsKICAgICAgICAgLy8gaWdub3JlIHJlcXVlc3RlZCBub3RpZmljYXRpb25GcmFtZXMsIGFuZCBhbHdheXMgbm90aWZ5IGV4YWN0bHkgb25jZSBldmVyeSBIQUwgYnVmZmVyCi0gICAgICAgICpub3RpZmljYXRpb25GcmFtZXMgPSBtRnJhbWVDb3VudDsKKyAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVDb3VudCA9IG1GcmFtZUNvdW50OwogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIG5vdCBmYXN0IHRyYWNrOiBtYXggbm90aWZpY2F0aW9uIHBlcmlvZCBpcyByZXNhbXBsZWQgZXF1aXZhbGVudCBvZiBvbmUgSEFMIGJ1ZmZlciB0aW1lCiAgICAgICAgIC8vICAgICAgICAgICAgICAgICBvciAyMCBtcyBpZiB0aGVyZSBpcyBhIGZhc3QgY2FwdHVyZQpAQCAtNjcwOSwyMiArNzAzNCwxNyBAQAogICAgICAgICBjb25zdCBzaXplX3QgbWluRnJhbWVDb3VudCA9IG1heE5vdGlmaWNhdGlvbkZyYW1lcyAqCiAgICAgICAgICAgICAgICAgbWF4KGtNaW5Ob3RpZmljYXRpb25zLCBtaW5Ob3RpZmljYXRpb25zQnlNcyk7CiAgICAgICAgIGZyYW1lQ291bnQgPSBtYXgoZnJhbWVDb3VudCwgbWluRnJhbWVDb3VudCk7Ci0gICAgICAgIGlmICgqbm90aWZpY2F0aW9uRnJhbWVzID09IDAgfHwgKm5vdGlmaWNhdGlvbkZyYW1lcyA+IG1heE5vdGlmaWNhdGlvbkZyYW1lcykgewotICAgICAgICAgICAgKm5vdGlmaWNhdGlvbkZyYW1lcyA9IG1heE5vdGlmaWNhdGlvbkZyYW1lczsKKyAgICAgICAgaWYgKG5vdGlmaWNhdGlvbkZyYW1lQ291bnQgPT0gMCB8fCBub3RpZmljYXRpb25GcmFtZUNvdW50ID4gbWF4Tm90aWZpY2F0aW9uRnJhbWVzKSB7CisgICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZUNvdW50ID0gbWF4Tm90aWZpY2F0aW9uRnJhbWVzOwogICAgICAgICB9CiAgICAgfQogICAgICpwRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7Ci0KLSAgICBsU3RhdHVzID0gaW5pdENoZWNrKCk7Ci0gICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoImNyZWF0ZVJlY29yZFRyYWNrX2woKSBhdWRpbyBkcml2ZXIgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9CisgICAgKnBOb3RpZmljYXRpb25GcmFtZUNvdW50ID0gbm90aWZpY2F0aW9uRnJhbWVDb3VudDsKIAogICAgIHsgLy8gc2NvcGUgZm9yIG1Mb2NrCiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAKLSAgICAgICAgdHJhY2sgPSBuZXcgUmVjb3JkVHJhY2sodGhpcywgY2xpZW50LCBzYW1wbGVSYXRlLAorICAgICAgICB0cmFjayA9IG5ldyBSZWNvcmRUcmFjayh0aGlzLCBjbGllbnQsIGF0dHIsIHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qIGJ1ZmZlciAqLywgKHNpemVfdCkwIC8qIGJ1ZmZlclNpemUgKi8sIHNlc3Npb25JZCwgdWlkLAogICAgICAgICAgICAgICAgICAgICAgICpmbGFncywgVHJhY2tCYXNlOjpUWVBFX0RFRkFVTFQsIHBvcnRJZCk7CkBAIC02Nzc0LDcgKzcwOTQsNyBAQAogICAgICAgICAgICAgcmVjb3JkVHJhY2stPmNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIGRvIG5vdCB3YWl0IGZvciB0aGUgZXZlbnQgZm9yIG1vcmUgdGhhbiBBdWRpb1N5c3RlbTo6a1N5bmNSZWNvcmRTdGFydFRpbWVPdXRNcwotICAgICAgICAgICAgcmVjb3JkVHJhY2stPm1GcmFtZXNUb0Ryb3AgPSAtCisgICAgICAgICAgICByZWNvcmRUcmFjay0+bUZyYW1lc1RvRHJvcCA9IC0oc3NpemVfdCkKICAgICAgICAgICAgICAgICAgICAgKChBdWRpb1N5c3RlbTo6a1N5bmNSZWNvcmRTdGFydFRpbWVPdXRNcyAqIHJlY29yZFRyYWNrLT5tU2FtcGxlUmF0ZSkgLyAxMDAwKTsKICAgICAgICAgfQogICAgIH0KQEAgLTY4MDAsNyArNzEyMCw4IEBACiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwogICAgICAgICBpZiAocmVjb3JkVHJhY2stPmlzRXh0ZXJuYWxUcmFjaygpKSB7CiAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpzdGFydElucHV0KG1JZCwgcmVjb3JkVHJhY2stPnNlc3Npb25JZCgpKTsKKyAgICAgICAgICAgIGJvb2wgc2lsZW5jZWQ7CisgICAgICAgICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6c3RhcnRJbnB1dChyZWNvcmRUcmFjay0+cG9ydElkKCksICZzaWxlbmNlZCk7CiAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgICAgICAvLyBGSVhNRSBzaG91bGQgdmVyaWZ5IHRoYXQgcmVjb3JkVHJhY2sgaXMgc3RpbGwgaW4gbUFjdGl2ZVRyYWNrcwogICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewpAQCAtNjgwOSw2ICs3MTMwLDcgQEAKICAgICAgICAgICAgICAgICBBTE9HVigiUmVjb3JkVGhyZWFkOjpzdGFydCBlcnJvciAlZCIsIHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlY29yZFRyYWNrLT5zZXRTaWxlbmNlZChzaWxlbmNlZCk7CiAgICAgICAgIH0KICAgICAgICAgLy8gQ2F0Y2ggdXAgd2l0aCBjdXJyZW50IGJ1ZmZlciBpbmRpY2VzIGlmIHRocmVhZCBpcyBhbHJlYWR5IHJ1bm5pbmcuCiAgICAgICAgIC8vIFRoaXMgaXMgd2hhdCBtYWtlcyBhIG5ldyBjbGllbnQgZGlzY2FyZCBhbGwgYnVmZmVyZWQgZGF0YS4gIElmIHRoZSB0cmFjaydzIG1Sc21wSW5Gcm9udApAQCAtNjgzMSw3ICs3MTUzLDcgQEAKIAogc3RhcnRFcnJvcjoKICAgICBpZiAocmVjb3JkVHJhY2stPmlzRXh0ZXJuYWxUcmFjaygpKSB7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wSW5wdXQobUlkLCByZWNvcmRUcmFjay0+c2Vzc2lvbklkKCkpOworICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcElucHV0KHJlY29yZFRyYWNrLT5wb3J0SWQoKSk7CiAgICAgfQogICAgIHJlY29yZFRyYWNrLT5jbGVhclN5bmNTdGFydEV2ZW50KCk7CiAgICAgLy8gRklYTUUgSSB3b25kZXIgd2h5IHdlIGRvIG5vdCByZXNldCB0aGUgc3RhdGUgaGVyZT8KQEAgLTY5MDUsNiArNzIyNywzMiBAQAogI2VuZGlmCiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpnZXRBY3RpdmVNaWNyb3Bob25lcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogYWN0aXZlTWljcm9waG9uZXMpCit7CisgICAgQUxPR1YoIlJlY29yZFRocmVhZDo6Z2V0QWN0aXZlTWljcm9waG9uZXMiKTsKKyAgICBBdXRvTXV0ZXggX2wobUxvY2spOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1JbnB1dC0+c3RyZWFtLT5nZXRBY3RpdmVNaWNyb3Bob25lcyhhY3RpdmVNaWNyb3Bob25lcyk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6dXBkYXRlTWV0YWRhdGFfbCgpCit7CisgICAgaWYgKG1JbnB1dCA9PSBudWxscHRyIHx8IG1JbnB1dC0+c3RyZWFtID09IG51bGxwdHIgfHwKKyAgICAgICAgICAgICFtQWN0aXZlVHJhY2tzLnJlYWRBbmRDbGVhckhhc0NoYW5nZWQoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIFN0cmVhbUluSGFsSW50ZXJmYWNlOjpTaW5rTWV0YWRhdGEgbWV0YWRhdGE7CisgICAgZm9yIChjb25zdCBzcDxSZWNvcmRUcmFjaz4gJnRyYWNrIDogbUFjdGl2ZVRyYWNrcykgeworICAgICAgICAvLyBObyB0cmFjayBpcyBpbnZhbGlkIGFzIHRoaXMgaXMgY2FsbGVkIGFmdGVyIHByZXBhcmVUcmFja19sIGluIHRoZSBzYW1lIGNyaXRpY2FsIHNlY3Rpb24KKyAgICAgICAgbWV0YWRhdGEudHJhY2tzLnB1c2hfYmFjayh7CisgICAgICAgICAgICAgICAgLnNvdXJjZSA9IHRyYWNrLT5hdHRyaWJ1dGVzKCkuc291cmNlLAorICAgICAgICAgICAgICAgIC5nYWluID0gMSwgLy8gY2FwdHVyZSB0cmFja3MgZG8gbm90IGhhdmUgdm9sdW1lcworICAgICAgICB9KTsKKyAgICB9CisgICAgbUlucHV0LT5zdHJlYW0tPnVwZGF0ZVNpbmtNZXRhZGF0YShtZXRhZGF0YSk7Cit9CisKIC8vIGRlc3Ryb3lUcmFja19sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpkZXN0cm95VHJhY2tfbChjb25zdCBzcDxSZWNvcmRUcmFjaz4mIHRyYWNrKQogewpAQCAtNzAxMiw2ICs3MzYwLDE2IEBACiAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiB9CiAKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnNldFJlY29yZFNpbGVuY2VkKHVpZF90IHVpZCwgYm9vbCBzaWxlbmNlZCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCkgOyBpKyspIHsKKyAgICAgICAgc3A8UmVjb3JkVHJhY2s+IHRyYWNrID0gbVRyYWNrc1tpXTsKKyAgICAgICAgaWYgKHRyYWNrICE9IDAgJiYgdHJhY2stPnVpZCgpID09IHVpZCkgeworICAgICAgICAgICAgdHJhY2stPnNldFNpbGVuY2VkKHNpbGVuY2VkKTsKKyAgICAgICAgfQorICAgIH0KK30KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVzYW1wbGVyQnVmZmVyUHJvdmlkZXI6OnJlc2V0KCkKIHsKQEAgLTc1NjksNyArNzkyNyw5IEBACiAgICAgICBtU2Vzc2lvbklkKEFVRElPX1NFU1NJT05fTk9ORSksCiAgICAgICBtRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSksIG1Qb3J0SWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSksCiAgICAgICBtSGFsU3RyZWFtKHN0cmVhbSksIG1IYWxEZXZpY2UoaHdEZXYtPmh3RGV2aWNlKCkpLCBtQXVkaW9Id0Rldihod0RldiksCi0gICAgICBtQWN0aXZlVHJhY2tzKCZ0aGlzLT5tTG9jYWxMb2cpCisgICAgICBtQWN0aXZlVHJhY2tzKCZ0aGlzLT5tTG9jYWxMb2cpLAorICAgICAgbUhhbFZvbEZsb2F0KC0xLjBmKSwgLy8gSW5pdGlhbGl6ZSB0byBpbGxlZ2FsIHZhbHVlIHNvIGl0IGFsd2F5cyBnZXRzIHNldCBwcm9wZXJseSBsYXRlci4KKyAgICAgIG1Ob0NhbGxiYWNrV2FybmluZ0NvdW50KDApCiB7CiAgICAgbVN0YW5kYnkgPSB0cnVlOwogICAgIHJlYWRIYWxQYXJhbWV0ZXJzX2woKTsKQEAgLTc1ODcsMTQgKzc5NDcsMjEgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6OmRpc2Nvbm5lY3QoKQogewotICAgIGZvciAoY29uc3Qgc3A8TW1hcFRyYWNrPiAmdCA6IG1BY3RpdmVUcmFja3MpIHsKKyAgICBBY3RpdmVUcmFja3M8TW1hcFRyYWNrPiBhY3RpdmVUcmFja3M7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBmb3IgKGNvbnN0IHNwPE1tYXBUcmFjaz4gJnQgOiBtQWN0aXZlVHJhY2tzKSB7CisgICAgICAgICAgICBhY3RpdmVUcmFja3MuYWRkKHQpOworICAgICAgICB9CisgICAgfQorICAgIGZvciAoY29uc3Qgc3A8TW1hcFRyYWNrPiAmdCA6IGFjdGl2ZVRyYWNrcykgewogICAgICAgICBzdG9wKHQtPnBvcnRJZCgpKTsKICAgICB9CiAgICAgLy8gVGhpcyB3aWxsIGRlY3JlbWVudCByZWZlcmVuY2VzIGFuZCBtYXkgY2F1c2UgdGhlIGRlc3RydWN0aW9uIG9mIHRoaXMgdGhyZWFkLgogICAgIGlmIChpc091dHB1dCgpKSB7CiAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KG1JZCwgc3RyZWFtVHlwZSgpLCBtU2Vzc2lvbklkKTsKICAgICB9IGVsc2UgewotICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUlucHV0KG1JZCwgbVNlc3Npb25JZCk7CisgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQobVBvcnRJZCk7CiAgICAgfQogfQogCkBAIC03NjMyLDYgKzc5OTksMTcgQEAKICAgICByZXR1cm4gbUhhbFN0cmVhbS0+Z2V0TW1hcFBvc2l0aW9uKHBvc2l0aW9uKTsKIH0KIAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpleGl0U3RhbmRieSgpCit7CisgICAgc3RhdHVzX3QgcmV0ID0gbUhhbFN0cmVhbS0+c3RhcnQoKTsKKyAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCIlczogZXJyb3IgbUhhbFN0cmVhbS0+c3RhcnQoKSA9ICVkIGZvciBmaXJzdCB0cmFjayIsIF9fRlVOQ1RJT05fXywgcmV0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgbVN0YW5kYnkgPSBmYWxzZTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6c3RhcnQoY29uc3QgQXVkaW9DbGllbnQmIGNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqaGFuZGxlKQogewpAQCAtNzY0NSwxNyArODAyMyw3IEBACiAKICAgICBpZiAoKmhhbmRsZSA9PSBtUG9ydElkKSB7CiAgICAgICAgIC8vIGZvciB0aGUgZmlyc3QgdHJhY2ssIHJldXNlIHBvcnRJZCBhbmQgc2Vzc2lvbiBhbGxvY2F0ZWQgd2hlbiB0aGUgc3RyZWFtIHdhcyBvcGVuZWQKLSAgICAgICAgcmV0ID0gbUhhbFN0cmVhbS0+c3RhcnQoKTsKLSAgICAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBlcnJvciBtSGFsU3RyZWFtLT5zdGFydCgpID0gJWQgZm9yIGZpcnN0IHRyYWNrIiwgX19GVU5DVElPTl9fLCByZXQpOwotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgfQotICAgICAgICBtU3RhbmRieSA9IGZhbHNlOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotCi0gICAgaWYgKCFpc091dHB1dCgpICYmICFyZWNvcmRpbmdBbGxvd2VkKGNsaWVudC5wYWNrYWdlTmFtZSwgY2xpZW50LmNsaWVudFBpZCwgY2xpZW50LmNsaWVudFVpZCkpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgICAgICByZXR1cm4gZXhpdFN0YW5kYnkoKTsKICAgICB9CiAKICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CkBAIC03NjczLDYgKzgwNDEsNyBAQAogICAgICAgICByZXQgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0Rm9yQXR0cigmbUF0dHIsICZpbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LmNsaWVudFBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LmNsaWVudFVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCkBAIC03Njg4LDYgKzgwNTcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LmNsaWVudFBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQuY2xpZW50VWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC5wYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0lOUFVUX0ZMQUdfTU1BUF9OT0lSUSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGV2aWNlSWQsCkBAIC03NzAxLDMwICs4MDcxLDQ2IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCisgICAgYm9vbCBzaWxlbmNlZCA9IGZhbHNlOwogICAgIGlmIChpc091dHB1dCgpKSB7CiAgICAgICAgIHJldCA9IEF1ZGlvU3lzdGVtOjpzdGFydE91dHB1dChtSWQsIHN0cmVhbVR5cGUoKSwgbVNlc3Npb25JZCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0ID0gQXVkaW9TeXN0ZW06OnN0YXJ0SW5wdXQobUlkLCBtU2Vzc2lvbklkKTsKKyAgICAgICAgcmV0ID0gQXVkaW9TeXN0ZW06OnN0YXJ0SW5wdXQocG9ydElkLCAmc2lsZW5jZWQpOwogICAgIH0KIAorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgLy8gYWJvcnQgaWYgc3RhcnQgaXMgcmVqZWN0ZWQgYnkgYXVkaW8gcG9saWN5IG1hbmFnZXIKICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIEFMT0dFKCIlczogZXJyb3Igc3RhcnQgcmVqZWN0ZWQgYnkgQXVkaW9Qb2xpY3lNYW5hZ2VyID0gJWQiLCBfX0ZVTkNUSU9OX18sIHJldCk7CiAgICAgICAgIGlmIChtQWN0aXZlVHJhY2tzLnNpemUoKSAhPSAwKSB7CisgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgICAgIGlmIChpc091dHB1dCgpKSB7CiAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQobUlkLCBzdHJlYW1UeXBlKCksIG1TZXNzaW9uSWQpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUlucHV0KG1JZCwgbVNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VJbnB1dChwb3J0SWQpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbUhhbFN0cmVhbS0+c3RvcCgpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CiAKLSAgICBzcDxNbWFwVHJhY2s+IHRyYWNrID0gbmV3IE1tYXBUcmFjayh0aGlzLCBtU2FtcGxlUmF0ZSwgbUZvcm1hdCwgbUNoYW5uZWxNYXNrLCBtU2Vzc2lvbklkLAorICAgIGlmIChpc091dHB1dCgpKSB7CisgICAgICAgIC8vIGZvcmNlIHZvbHVtZSB1cGRhdGUgd2hlbiBhIG5ldyB0cmFjayBpcyBhZGRlZAorICAgICAgICBtSGFsVm9sRmxvYXQgPSAtMS4wZjsKKyAgICB9IGVsc2UgaWYgKCFzaWxlbmNlZCkgeworICAgICAgICBmb3IgKGNvbnN0IHNwPE1tYXBUcmFjaz4gJnRyYWNrIDogbUFjdGl2ZVRyYWNrcykgeworICAgICAgICAgICAgaWYgKHRyYWNrLT5pc1NpbGVuY2VkX2woKSAmJiB0cmFjay0+dWlkKCkgIT0gY2xpZW50LmNsaWVudFVpZCkKKyAgICAgICAgICAgICAgICB0cmFjay0+aW52YWxpZGF0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gR2l2ZW4gdGhhdCBNbWFwVGhyZWFkOjptQXR0ciBpcyBtdXRhYmxlLCBzaG91bGQgYSBNbWFwVHJhY2sgaGF2ZSBhdHRyaWJ1dGVzID8KKyAgICBzcDxNbWFwVHJhY2s+IHRyYWNrID0gbmV3IE1tYXBUcmFjayh0aGlzLCBtQXR0ciwgbVNhbXBsZVJhdGUsIG1Gb3JtYXQsIG1DaGFubmVsTWFzaywgbVNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQuY2xpZW50VWlkLCBjbGllbnQuY2xpZW50UGlkLCBwb3J0SWQpOwogCisgICAgdHJhY2stPnNldFNpbGVuY2VkX2woc2lsZW5jZWQpOwogICAgIG1BY3RpdmVUcmFja3MuYWRkKHRyYWNrKTsKICAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBnZXRFZmZlY3RDaGFpbl9sKG1TZXNzaW9uSWQpOwogICAgIGlmIChjaGFpbiAhPSAwKSB7CkBAIC03NzU0LDYgKzgxNDAsOCBAQAogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQogCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKwogICAgIHNwPE1tYXBUcmFjaz4gdHJhY2s7CiAgICAgZm9yIChjb25zdCBzcDxNbWFwVHJhY2s+ICZ0IDogbUFjdGl2ZVRyYWNrcykgewogICAgICAgICBpZiAoaGFuZGxlID09IHQtPnBvcnRJZCgpKSB7CkBAIC03NzY3LDEzICs4MTU1LDE1IEBACiAKICAgICBtQWN0aXZlVHJhY2tzLnJlbW92ZSh0cmFjayk7CiAKKyAgICBtTG9jay51bmxvY2soKTsKICAgICBpZiAoaXNPdXRwdXQoKSkgewogICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcE91dHB1dChtSWQsIHN0cmVhbVR5cGUoKSwgdHJhY2stPnNlc3Npb25JZCgpKTsKICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQobUlkLCBzdHJlYW1UeXBlKCksIHRyYWNrLT5zZXNzaW9uSWQoKSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BJbnB1dChtSWQsIHRyYWNrLT5zZXNzaW9uSWQoKSk7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQobUlkLCB0cmFjay0+c2Vzc2lvbklkKCkpOworICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcElucHV0KHRyYWNrLT5wb3J0SWQoKSk7CisgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQodHJhY2stPnBvcnRJZCgpKTsKICAgICB9CisgICAgbUxvY2subG9jaygpOwogCiAgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gZ2V0RWZmZWN0Q2hhaW5fbCh0cmFjay0+c2Vzc2lvbklkKCkpOwogICAgIGlmIChjaGFpbiAhPSAwKSB7CkBAIC03ODU4LDYgKzgyNDgsOCBAQAogCiAgICAgICAgIG1BY3RpdmVUcmFja3MudXBkYXRlUG93ZXJTdGF0ZSh0aGlzKTsKIAorICAgICAgICB1cGRhdGVNZXRhZGF0YV9sKCk7CisKICAgICAgICAgbG9ja0VmZmVjdENoYWluc19sKGVmZmVjdENoYWlucyk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZWZmZWN0Q2hhaW5zLnNpemUoKTsgaSArKykgewogICAgICAgICAgICAgZWZmZWN0Q2hhaW5zW2ldLT5wcm9jZXNzX2woKTsKQEAgLTgwMjMsNyArODQxNSw5IEBACiAgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woQVVESU9fT1VUUFVUX0NPTkZJR19DSEFOR0VEKTsKICAgICAgICAgc3A8TW1hcFN0cmVhbUNhbGxiYWNrPiBjYWxsYmFjayA9IG1DYWxsYmFjay5wcm9tb3RlKCk7CiAgICAgICAgIGlmIChtRGV2aWNlSWQgIT0gZGV2aWNlSWQgJiYgY2FsbGJhY2sgIT0gMCkgeworICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICBjYWxsYmFjay0+b25Sb3V0aW5nQ2hhbmdlZChkZXZpY2VJZCk7CisgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgIH0KICAgICAgICAgbURldmljZUlkID0gZGV2aWNlSWQ7CiAgICAgfQpAQCAtODAzMiw3ICs4NDI2LDkgQEAKICAgICAgICAgc2VuZElvQ29uZmlnRXZlbnRfbChBVURJT19JTlBVVF9DT05GSUdfQ0hBTkdFRCk7CiAgICAgICAgIHNwPE1tYXBTdHJlYW1DYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOwogICAgICAgICBpZiAobURldmljZUlkICE9IGRldmljZUlkICYmIGNhbGxiYWNrICE9IDApIHsKKyAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICAgICAgY2FsbGJhY2stPm9uUm91dGluZ0NoYW5nZWQoZGV2aWNlSWQpOworICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICB9CiAgICAgICAgIG1EZXZpY2VJZCA9IGRldmljZUlkOwogICAgIH0KQEAgLTgxOTgsOSArODU5NCwxMyBAQAogICAgICAgICBpZiAodHJhY2stPmlzSW52YWxpZCgpKSB7CiAgICAgICAgICAgICBzcDxNbWFwU3RyZWFtQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKICAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgY2FsbGJhY2stPm9uVGVhckRvd24oKTsKKyAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICBjYWxsYmFjay0+b25UZWFyRG93bih0cmFjay0+cG9ydElkKCkpOworICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobU5vQ2FsbGJhY2tXYXJuaW5nQ291bnQgPCBrTWF4Tm9DYWxsYmFja1dhcm5pbmdzKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIkNvdWxkIG5vdCBub3RpZnkgTU1BUCBzdHJlYW0gdGVhciBkb3duOiBubyBvblRlYXJEb3duIGNhbGxiYWNrISIpOworICAgICAgICAgICAgICAgIG1Ob0NhbGxiYWNrV2FybmluZ0NvdW50Kys7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTgyNTIsNyArODY1Miw5IEBACiAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXREZXZpY2UsIGF1ZGlvX2RldmljZXNfdCBpbkRldmljZSwgYm9vbCBzeXN0ZW1SZWFkeSkKICAgICA6IE1tYXBUaHJlYWQoYXVkaW9GbGluZ2VyLCBpZCwgaHdEZXYsIG91dHB1dC0+c3RyZWFtLCBvdXREZXZpY2UsIGluRGV2aWNlLCBzeXN0ZW1SZWFkeSksCiAgICAgICBtU3RyZWFtVHlwZShBVURJT19TVFJFQU1fTVVTSUMpLAotICAgICAgbVN0cmVhbVZvbHVtZSgxLjApLCBtU3RyZWFtTXV0ZShmYWxzZSksIG1PdXRwdXQob3V0cHV0KQorICAgICAgbVN0cmVhbVZvbHVtZSgxLjApLAorICAgICAgbVN0cmVhbU11dGUoZmFsc2UpLAorICAgICAgbU91dHB1dChvdXRwdXQpCiB7CiAgICAgc25wcmludGYobVRocmVhZE5hbWUsIGtUaHJlYWROYW1lTGVuZ3RoLCAiQXVkaW9NbWFwT3V0XyVYIiwgaWQpOwogICAgIG1DaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobUNoYW5uZWxNYXNrKTsKQEAgLTgzNjAsNyArODc2Miw2IEBACiAgICAgfQogCiAgICAgaWYgKHZvbHVtZSAhPSBtSGFsVm9sRmxvYXQpIHsKLSAgICAgICAgbUhhbFZvbEZsb2F0ID0gdm9sdW1lOwogCiAgICAgICAgIC8vIENvbnZlcnQgdm9sdW1lcyBmcm9tIGZsb2F0IHRvIDguMjQKICAgICAgICAgdWludDMyX3Qgdm9sID0gKHVpbnQzMl90KSh2b2x1bWUgKiAoMSA8PCAyNCkpOwpAQCAtODM3Myw3ICs4Nzc0LDEwIEBACiAgICAgICAgICAgICB2b2x1bWUgPSAoZmxvYXQpdm9sIC8gKDEgPDwgMjQpOwogICAgICAgICB9CiAgICAgICAgIC8vIFRyeSB0byB1c2UgSFcgdm9sdW1lIGNvbnRyb2wgYW5kIGZhbGwgYmFjayB0byBTVyBjb250cm9sIGlmIG5vdCBpbXBsZW1lbnRlZAotICAgICAgICBpZiAobU91dHB1dC0+c3RyZWFtLT5zZXRWb2x1bWUodm9sdW1lLCB2b2x1bWUpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIGlmIChtT3V0cHV0LT5zdHJlYW0tPnNldFZvbHVtZSh2b2x1bWUsIHZvbHVtZSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIG1IYWxWb2xGbG9hdCA9IHZvbHVtZTsgLy8gSFcgdm9sdW1lIGNvbnRyb2wgd29ya2VkLCBzbyB1cGRhdGUgdmFsdWUuCisgICAgICAgICAgICBtTm9DYWxsYmFja1dhcm5pbmdDb3VudCA9IDA7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBzcDxNbWFwU3RyZWFtQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKICAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSAwKSB7CiAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudDsKQEAgLTgzODYsMTQgKzg3OTAsMzkgQEAKICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoYW5uZWxDb3VudDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5hZGQodm9sdW1lKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUhhbFZvbEZsb2F0ID0gdm9sdW1lOyAvLyBTVyB2b2x1bWUgY29udHJvbCB3b3JrZWQsIHNvIHVwZGF0ZSB2YWx1ZS4KKyAgICAgICAgICAgICAgICBtTm9DYWxsYmFja1dhcm5pbmdDb3VudCA9IDA7CisgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICAgICAgY2FsbGJhY2stPm9uVm9sdW1lQ2hhbmdlZChtQ2hhbm5lbE1hc2ssIHZhbHVlcyk7CisgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiQ291bGQgbm90IHNldCBNTUFQIHN0cmVhbSB2b2x1bWU6IG5vIHZvbHVtZSBjYWxsYmFjayEiKTsKKyAgICAgICAgICAgICAgICBpZiAobU5vQ2FsbGJhY2tXYXJuaW5nQ291bnQgPCBrTWF4Tm9DYWxsYmFja1dhcm5pbmdzKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJDb3VsZCBub3Qgc2V0IE1NQVAgc3RyZWFtIHZvbHVtZTogbm8gdm9sdW1lIGNhbGxiYWNrISIpOworICAgICAgICAgICAgICAgICAgICBtTm9DYWxsYmFja1dhcm5pbmdDb3VudCsrOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIH0KIAordm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBQbGF5YmFja1RocmVhZDo6dXBkYXRlTWV0YWRhdGFfbCgpCit7CisgICAgaWYgKG1PdXRwdXQgPT0gbnVsbHB0ciB8fCBtT3V0cHV0LT5zdHJlYW0gPT0gbnVsbHB0ciB8fAorICAgICAgICAgICAgIW1BY3RpdmVUcmFja3MucmVhZEFuZENsZWFySGFzQ2hhbmdlZCgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgU3RyZWFtT3V0SGFsSW50ZXJmYWNlOjpTb3VyY2VNZXRhZGF0YSBtZXRhZGF0YTsKKyAgICBmb3IgKGNvbnN0IHNwPE1tYXBUcmFjaz4gJnRyYWNrIDogbUFjdGl2ZVRyYWNrcykgeworICAgICAgICAvLyBObyB0cmFjayBpcyBpbnZhbGlkIGFzIHRoaXMgaXMgY2FsbGVkIGFmdGVyIHByZXBhcmVUcmFja19sIGluIHRoZSBzYW1lIGNyaXRpY2FsIHNlY3Rpb24KKyAgICAgICAgbWV0YWRhdGEudHJhY2tzLnB1c2hfYmFjayh7CisgICAgICAgICAgICAgICAgLnVzYWdlID0gdHJhY2stPmF0dHJpYnV0ZXMoKS51c2FnZSwKKyAgICAgICAgICAgICAgICAuY29udGVudF90eXBlID0gdHJhY2stPmF0dHJpYnV0ZXMoKS5jb250ZW50X3R5cGUsCisgICAgICAgICAgICAgICAgLmdhaW4gPSBtSGFsVm9sRmxvYXQsIC8vIFRPRE86IHByb3BhZ2F0ZSBmcm9tIGFhdWRpbyBwcmUtbWl4IHZvbHVtZQorICAgICAgICB9KTsKKyAgICB9CisgICAgbU91dHB1dC0+c3RyZWFtLT51cGRhdGVTb3VyY2VNZXRhZGF0YShtZXRhZGF0YSk7Cit9CisKIHZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwUGxheWJhY2tUaHJlYWQ6OmNoZWNrU2lsZW50TW9kZV9sKCkKIHsKICAgICBpZiAoIW1NYXN0ZXJNdXRlKSB7CkBAIC04NDMxLDYgKzg4NjAsMTIgQEAKICAgICBtQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2sobUNoYW5uZWxNYXNrKTsKIH0KIAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpNbWFwQ2FwdHVyZVRocmVhZDo6ZXhpdFN0YW5kYnkoKQoreworICAgIG1JbnB1dC0+c3RyZWFtLT5zZXRHYWluKDEuMGYpOworICAgIHJldHVybiBNbWFwVGhyZWFkOjpleGl0U3RhbmRieSgpOworfQorCiBBdWRpb0ZsaW5nZXI6OkF1ZGlvU3RyZWFtSW4qIEF1ZGlvRmxpbmdlcjo6TW1hcENhcHR1cmVUaHJlYWQ6OmNsZWFySW5wdXQoKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC04NDM4LDQgKzg4NzMsNjEgQEAKICAgICBtSW5wdXQgPSBOVUxMOwogICAgIHJldHVybiBpbnB1dDsKIH0KKworCit2b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcENhcHR1cmVUaHJlYWQ6OnByb2Nlc3NWb2x1bWVfbCgpCit7CisgICAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7CisgICAgYm9vbCBzaWxlbmNlZCA9IGZhbHNlOworCisgICAgc3A8TW1hcFN0cmVhbUNhbGxiYWNrPiBjYWxsYmFjayA9IG1DYWxsYmFjay5wcm9tb3RlKCk7CisgICAgaWYgKGNhbGxiYWNrID09IDApIHsKKyAgICAgICAgaWYgKG1Ob0NhbGxiYWNrV2FybmluZ0NvdW50IDwga01heE5vQ2FsbGJhY2tXYXJuaW5ncykgeworICAgICAgICAgICAgQUxPR1coIkNvdWxkIG5vdCBzZXQgTU1BUCBzdHJlYW0gc2lsZW5jZWQ6IG5vIG9uU3RyZWFtU2lsZW5jZWQgY2FsbGJhY2shIik7CisgICAgICAgICAgICBtTm9DYWxsYmFja1dhcm5pbmdDb3VudCsrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQWZ0ZXIgYSBjaGFuZ2Ugb2NjdXJyZWQgaW4gdHJhY2sgc2lsZW5jZWQgc3RhdGUsIG11dGUgY2FwdHVyZSBpbiBhdWRpbyBEU1AgaWYgYXQgbGVhc3Qgb25lCisgICAgLy8gdHJhY2sgaXMgc2lsZW5jZWQgYW5kIHVubXV0ZSBvdGhlcndpc2UKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BY3RpdmVUcmFja3Muc2l6ZSgpICYmICFzaWxlbmNlZDsgaSsrKSB7CisgICAgICAgIGlmICghbUFjdGl2ZVRyYWNrc1tpXS0+Z2V0QW5kU2V0U2lsZW5jZWROb3RpZmllZF9sKCkpIHsKKyAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgc2lsZW5jZWQgPSBtQWN0aXZlVHJhY2tzW2ldLT5pc1NpbGVuY2VkX2woKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjaGFuZ2VkKSB7CisgICAgICAgIG1JbnB1dC0+c3RyZWFtLT5zZXRHYWluKHNpbGVuY2VkID8gMC4wZjogMS4wZik7CisgICAgfQorfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcENhcHR1cmVUaHJlYWQ6OnVwZGF0ZU1ldGFkYXRhX2woKQoreworICAgIGlmIChtSW5wdXQgPT0gbnVsbHB0ciB8fCBtSW5wdXQtPnN0cmVhbSA9PSBudWxscHRyIHx8CisgICAgICAgICAgICAhbUFjdGl2ZVRyYWNrcy5yZWFkQW5kQ2xlYXJIYXNDaGFuZ2VkKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBTdHJlYW1JbkhhbEludGVyZmFjZTo6U2lua01ldGFkYXRhIG1ldGFkYXRhOworICAgIGZvciAoY29uc3Qgc3A8TW1hcFRyYWNrPiAmdHJhY2sgOiBtQWN0aXZlVHJhY2tzKSB7CisgICAgICAgIC8vIE5vIHRyYWNrIGlzIGludmFsaWQgYXMgdGhpcyBpcyBjYWxsZWQgYWZ0ZXIgcHJlcGFyZVRyYWNrX2wgaW4gdGhlIHNhbWUgY3JpdGljYWwgc2VjdGlvbgorICAgICAgICBtZXRhZGF0YS50cmFja3MucHVzaF9iYWNrKHsKKyAgICAgICAgICAgICAgICAuc291cmNlID0gdHJhY2stPmF0dHJpYnV0ZXMoKS5zb3VyY2UsCisgICAgICAgICAgICAgICAgLmdhaW4gPSAxLCAvLyBjYXB0dXJlIHRyYWNrcyBkbyBub3QgaGF2ZSB2b2x1bWVzCisgICAgICAgIH0pOworICAgIH0KKyAgICBtSW5wdXQtPnN0cmVhbS0+dXBkYXRlU2lua01ldGFkYXRhKG1ldGFkYXRhKTsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBDYXB0dXJlVGhyZWFkOjpzZXRSZWNvcmRTaWxlbmNlZCh1aWRfdCB1aWQsIGJvb2wgc2lsZW5jZWQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BY3RpdmVUcmFja3Muc2l6ZSgpIDsgaSsrKSB7CisgICAgICAgIGlmIChtQWN0aXZlVHJhY2tzW2ldLT51aWQoKSA9PSB1aWQpIHsKKyAgICAgICAgICAgIG1BY3RpdmVUcmFja3NbaV0tPnNldFNpbGVuY2VkX2woc2lsZW5jZWQpOworICAgICAgICAgICAgYnJvYWRjYXN0X2woKTsKKyAgICAgICAgfQorICAgIH0KK30KKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmgKaW5kZXggZGQyYjg5Yi4uMjhkNDQ4MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oCkBAIC00MjUsNiArNDI1LDkgQEAKICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiBzb21lIGVmZmVjdHMgbXVzdCBiZSBzdXNwZW5kZWQgd2hlbiBhbiBlZmZlY3QgY2hhaW4gaXMgYWRkZWQKICAgICAgICAgICAgICAgICB2b2lkIGNoZWNrU3VzcGVuZE9uQWRkRWZmZWN0Q2hhaW5fbChjb25zdCBzcDxFZmZlY3RDaGFpbj4mIGNoYWluKTsKIAorICAgICAgICAgICAgICAgIC8vIHNlbmRzIHRoZSBtZXRhZGF0YSBvZiB0aGUgYWN0aXZlIHRyYWNrcyB0byB0aGUgSEFMCisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgdXBkYXRlTWV0YWRhdGFfbCgpID0gMDsKKwogICAgICAgICAgICAgICAgIFN0cmluZzE2IGdldFdha2VMb2NrVGFnKCk7CiAKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBwcmVFeGl0KCkgeyB9CkBAIC00ODUsNiArNDg4LDcgQEAKICAgICAgICAgICAgICAgICAvLyBVcGRhdGVkIGJ5IHVwZGF0ZVN1c3BlbmRlZFNlc3Npb25zX2woKSBvbmx5LgogICAgICAgICAgICAgICAgIEtleWVkVmVjdG9yPCBhdWRpb19zZXNzaW9uX3QsIEtleWVkVmVjdG9yPCBpbnQsIHNwPFN1c3BlbmRlZFNlc3Npb25EZXNjPiA+ID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3VzcGVuZGVkU2Vzc2lvbnM7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogYWRkIGNvbW1lbnQgYW5kIGFkanVzdCBzaXplIGFzIG5lZWRlZAogICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBzaXplX3QgICAgIGtMb2dTaXplID0gNCAqIDEwMjQ7CiAgICAgICAgICAgICAgICAgc3A8TkJMb2c6OldyaXRlcj4gICAgICAgbU5CTG9nV3JpdGVyOwogICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1TeXN0ZW1SZWFkeTsKQEAgLTU2Miw2ICs1NjYsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gcGVyaW9kaWNhbGx5IGNhbGxlZCBpbiB0aGUgdGhyZWFkTG9vcCgpIHRvIHVwZGF0ZSBwb3dlciBzdGF0ZSB1aWRzLgogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgdXBkYXRlUG93ZXJTdGF0ZShzcDxUaHJlYWRCYXNlPiB0aHJlYWQsIGJvb2wgZm9yY2UgPSBmYWxzZSk7CiAKKyAgICAgICAgICAgICAgICAgICAgLyoqIEByZXR1cm4gdHJ1ZSBpZiBvbmUgb3IgbW92ZSBhY3RpdmUgdHJhY2tzIHdhcyBhZGRlZCBvciByZW1vdmVkIHNpbmNlIHRoZQorICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICBsYXN0IHRpbWUgdGhpcyBmdW5jdGlvbiB3YXMgY2FsbGVkIG9yIHRoZSB2ZWN0b3Igd2FzIGNyZWF0ZWQuICovCisgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICByZWFkQW5kQ2xlYXJIYXNDaGFuZ2VkKCk7CisKICAgICAgICAgICAgICAgICBwcml2YXRlOgogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgbG9nVHJhY2soY29uc3QgY2hhciAqZnVuY05hbWUsIGNvbnN0IHNwPFQ+ICZ0cmFjaykgY29uc3Q7CiAKQEAgLTU4MCw2ICs1ODgsOCBAQAogICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgIG1MYXN0QWN0aXZlVHJhY2tzR2VuZXJhdGlvbjsKICAgICAgICAgICAgICAgICAgICAgd3A8VD4gICAgICAgICAgICAgICBtTGF0ZXN0QWN0aXZlVHJhY2s7IC8vIGxhdGVzdCB0cmFjayBhZGRlZCB0byBBY3RpdmVUcmFja3MKICAgICAgICAgICAgICAgICAgICAgU2ltcGxlTG9nICogY29uc3QgICBtTG9jYWxMb2c7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSB2ZWN0b3IgaGFzIGNoYW5nZWQgc2luY2UgbGFzdCBjYWxsIHRvIHJlYWRBbmRDbGVhckhhc0NoYW5nZWQKKyAgICAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICBtSGFzQ2hhbmdlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgICAgICBTaW1wbGVMb2cgbUxvY2FsTG9nOwpAQCAtNjIyLDggKzYzMiw4IEBACiAgICAgc3RhdGljIGNvbnN0IGludDhfdCBrTWF4VHJhY2tSZXRyaWVzT2ZmbG9hZCA9IDIwOwogICAgIHN0YXRpYyBjb25zdCBpbnQ4X3Qga01heFRyYWNrU3RhcnR1cFJldHJpZXNPZmZsb2FkID0gMTAwOwogICAgIHN0YXRpYyBjb25zdCBpbnQ4X3Qga01heFRyYWNrU3RvcFJldHJpZXNPZmZsb2FkID0gMjsKLSAgICAvLyAxNCB0cmFja3MgbWF4IHBlciBjbGllbnQgYWxsb3dzIGZvciAyIG1pc2JlaGF2aW5nIGFwcGxpY2F0aW9uIGxlYXZpbmcgNCBhdmFpbGFibGUgdHJhY2tzLgotICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrTWF4VHJhY2tzUGVyVWlkID0gMTQ7CisgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrTWF4VHJhY2tzUGVyVWlkID0gNDA7CisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga01heFRyYWNrcyA9IDI1NjsKIAogICAgIC8vIE1heGltdW0gZGVsYXkgKGluIG5hbm9zZWNvbmRzKSBmb3IgdXBjb21pbmcgYnVmZmVycyBpbiBzdXNwZW5kIG1vZGUsIG90aGVyd2lzZQogICAgIC8vIGlmIGRlbGF5IGlzIGdyZWF0ZXIsIHRoZSBlc3RpbWF0ZWQgdGltZSBmb3IgdGltZUxvb3BOZXh0TnMgaXMgcmVzZXQuCkBAIC03MDUsMTAgKzcxNSwxNCBAQAogICAgICAgICAgICAgICAgIHNwPFRyYWNrPiAgIGNyZWF0ZVRyYWNrX2woCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvRmxpbmdlcjo6Q2xpZW50PiYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqcEZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqcE5vdGlmaWNhdGlvbkZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5vdGlmaWNhdGlvbnNQZXJCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNwZWVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCAqZmxhZ3MsCkBAIC03MzcsMTEgKzc1MSwxMCBAQAogICAgIHZpcnR1YWwgICAgIFN0cmluZzggICAgIGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cyk7CiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgaW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkID0gMCk7CiAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgZ2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmhhbEZyYW1lcywgdWludDMyX3QgKmRzcEZyYW1lcyk7Ci0gICAgICAgICAgICAgICAgLy8gRklYTUUgcmVuYW1lIG1peEJ1ZmZlcigpIHRvIHNpbmtCdWZmZXIoKSBhbmQgcmVtb3ZlIGludDE2X3QqIGRlcGVuZGVuY3kuCiAgICAgICAgICAgICAgICAgLy8gQ29uc2lkZXIgYWxzbyByZW1vdmluZyBhbmQgcGFzc2luZyBhbiBleHBsaWNpdCBtTWFpbkJ1ZmZlciBpbml0aWFsaXphdGlvbgogICAgICAgICAgICAgICAgIC8vIHBhcmFtZXRlciB0byBBRjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpUcmFjaygpLgotICAgICAgICAgICAgICAgIGludDE2X3QgICAgICptaXhCdWZmZXIoKSBjb25zdCB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGludDE2X3QgKj4obVNpbmtCdWZmZXIpOyB9OworICAgICAgICAgICAgICAgIGVmZmVjdF9idWZmZXJfdCAqc2lua0J1ZmZlcigpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8ZWZmZWN0X2J1ZmZlcl90ICo+KG1TaW5rQnVmZmVyKTsgfTsKIAogICAgIHZpcnR1YWwgICAgIHZvaWQgZGV0YWNoQXV4RWZmZWN0X2woaW50IGVmZmVjdElkKTsKICAgICAgICAgICAgICAgICBzdGF0dXNfdCBhdHRhY2hBdXhFZmZlY3QoY29uc3Qgc3A8QXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s+JiB0cmFjaywKQEAgLTc3Niw2ICs3ODksMTYgQEAKIAogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIGlzT3V0cHV0KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQogCisgICAgICAgICAgICAgICAgLy8gcmV0dXJucyB0cnVlIGlmIHRoZSB0cmFjayBpcyBhbGxvd2VkIHRvIGJlIGFkZGVkIHRvIHRoZSB0aHJlYWQuCisgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgaXNUcmFja0FsbG93ZWRfbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0IF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJhY2tDb3VudEZvclVpZF9sKHVpZCkgPCBQbGF5YmFja1RocmVhZDo6a01heFRyYWNrc1BlclVpZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbVRyYWNrcy5zaXplKCkgPCBQbGF5YmFja1RocmVhZDo6a01heFRyYWNrczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKIHByb3RlY3RlZDoKICAgICAvLyB1cGRhdGVkIGJ5IHJlYWRPdXRwdXRQYXJhbWV0ZXJzX2woKQogICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vcm1hbEZyYW1lQ291bnQ7ICAvLyBub3JtYWwgbWl4ZXIgYW5kIGVmZmVjdHMKQEAgLTg2NCwxMiArODg3LDYgQEAKIHByb3RlY3RlZDoKICAgICBBY3RpdmVUcmFja3M8VHJhY2s+ICAgICBtQWN0aXZlVHJhY2tzOwogCi0gICAgLy8gQWxsb2NhdGUgYSB0cmFjayBuYW1lIGZvciBhIGdpdmVuIGNoYW5uZWwgbWFzay4KLSAgICAvLyAgIFJldHVybnMgbmFtZSA+PSAwIGlmIHN1Y2Nlc3NmdWwsIC0xIG9uIGZhaWx1cmUuCi0gICAgdmlydHVhbCBpbnQgICAgICAgICAgICAgZ2V0VHJhY2tOYW1lX2woYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLCB1aWRfdCB1aWQpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBkZWxldGVUcmFja05hbWVfbChpbnQgbmFtZSkgPSAwOwotCiAgICAgLy8gVGltZSB0byBzbGVlcCBiZXR3ZWVuIGN5Y2xlcyB3aGVuOgogICAgIHZpcnR1YWwgdWludDMyX3QgICAgICAgIGFjdGl2ZVNsZWVwVGltZVVzKCkgY29uc3Q7ICAgICAgLy8gbWl4ZXIgc3RhdGUgTUlYRVJfVFJBQ0tTX0VOQUJMRUQKICAgICB2aXJ0dWFsIHVpbnQzMl90ICAgICAgICBpZGxlU2xlZXBUaW1lVXMoKSBjb25zdCA9IDA7ICAgIC8vIG1peGVyIHN0YXRlIE1JWEVSX0lETEUKQEAgLTg5Nyw3ICs5MTQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbUh3U3VwcG9ydHNQYXVzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG1PdXRwdXQtPmZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQyk7IH0KIAotICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgIHRyYWNrQ291bnRGb3JVaWRfbCh1aWRfdCB1aWQpOworICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgIHRyYWNrQ291bnRGb3JVaWRfbCh1aWRfdCB1aWQpIGNvbnN0OwogCiBwcml2YXRlOgogCkBAIC05MTAsMTEgKzkyNyw3MCBAQAogICAgIHZvaWQgICAgICAgIHJlbW92ZVRyYWNrX2woY29uc3Qgc3A8VHJhY2s+JiB0cmFjayk7CiAKICAgICB2b2lkICAgICAgICByZWFkT3V0cHV0UGFyYW1ldGVyc19sKCk7CisgICAgdm9pZCAgICAgICAgdXBkYXRlTWV0YWRhdGFfbCgpIGZpbmFsOworICAgIHZpcnR1YWwgdm9pZCBzZW5kTWV0YWRhdGFUb0JhY2tlbmRfbChjb25zdCBTdHJlYW1PdXRIYWxJbnRlcmZhY2U6OlNvdXJjZU1ldGFkYXRhJiBtZXRhZGF0YSk7CiAKICAgICB2aXJ0dWFsIHZvaWQgZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogICAgIHZvaWQgICAgICAgIGR1bXBUcmFja3MoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIAotICAgIFNvcnRlZFZlY3Rvcjwgc3A8VHJhY2s+ID4gICAgICAgbVRyYWNrczsKKyAgICAvLyBUaGUgVHJhY2tzIGNsYXNzIG1hbmFnZXMgbmFtZXMgZm9yIGFsbCB0cmFja3MKKyAgICAvLyBhZGRlZCBhbmQgcmVtb3ZlZCBmcm9tIHRoZSBUaHJlYWQuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgY2xhc3MgVHJhY2tzIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFRyYWNrcyhib29sIHNhdmVEZWxldGVkVHJhY2tOYW1lcykgOgorICAgICAgICAgICAgbVNhdmVEZWxldGVkVHJhY2tOYW1lcyhzYXZlRGVsZXRlZFRyYWNrTmFtZXMpIHsgfQorCisgICAgICAgIC8vIFNvcnRlZFZlY3RvciBtZXRob2RzCisgICAgICAgIHNzaXplX3QgICAgICAgICBhZGQoY29uc3Qgc3A8VD4gJnRyYWNrKTsKKyAgICAgICAgc3NpemVfdCAgICAgICAgIHJlbW92ZShjb25zdCBzcDxUPiAmdHJhY2spOworICAgICAgICBzaXplX3QgICAgICAgICAgc2l6ZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtVHJhY2tzLnNpemUoKTsKKyAgICAgICAgfQorICAgICAgICBib29sICAgICAgICAgICAgaXNFbXB0eSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtVHJhY2tzLmlzRW1wdHkoKTsKKyAgICAgICAgfQorICAgICAgICBzc2l6ZV90ICAgICAgICAgaW5kZXhPZihjb25zdCBzcDxUPiAmaXRlbSkgeworICAgICAgICAgICAgcmV0dXJuIG1UcmFja3MuaW5kZXhPZihpdGVtKTsKKyAgICAgICAgfQorICAgICAgICBzcDxUPiAgICAgICAgICAgb3BlcmF0b3JbXShzaXplX3QgaW5kZXgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtVHJhY2tzW2luZGV4XTsKKyAgICAgICAgfQorICAgICAgICB0eXBlbmFtZSBTb3J0ZWRWZWN0b3I8c3A8VD4+OjppdGVyYXRvciBiZWdpbigpIHsKKyAgICAgICAgICAgIHJldHVybiBtVHJhY2tzLmJlZ2luKCk7CisgICAgICAgIH0KKyAgICAgICAgdHlwZW5hbWUgU29ydGVkVmVjdG9yPHNwPFQ+Pjo6aXRlcmF0b3IgZW5kKCkgeworICAgICAgICAgICAgcmV0dXJuIG1UcmFja3MuZW5kKCk7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgICAgICAgICAgcHJvY2Vzc0RlbGV0ZWRUcmFja05hbWVzKHN0ZDo6ZnVuY3Rpb248dm9pZChpbnQpPiBmKSB7CisgICAgICAgICAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IG1EZWxldGVkVHJhY2tOYW1lcy5zaXplKCk7CisgICAgICAgICAgICBpZiAoc2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGludCBuYW1lIDogbURlbGV0ZWRUcmFja05hbWVzKSB7CisgICAgICAgICAgICAgICAgICAgIGYobmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHNpemU7CisgICAgICAgIH0KKworICAgICAgICB2b2lkICAgICAgICAgICAgY2xlYXJEZWxldGVkVHJhY2tOYW1lcygpIHsgbURlbGV0ZWRUcmFja05hbWVzLmNsZWFyKCk7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIC8vIFRyYWNrIG5hbWVzIHBlbmRpbmcgZGVsZXRpb24gZm9yIE1JWEVSIHR5cGUgdGhyZWFkcworICAgICAgICBjb25zdCBib29sIG1TYXZlRGVsZXRlZFRyYWNrTmFtZXM7IC8vIHRydWUgdG8gZW5hYmxlIHRyYWNraW5nCisgICAgICAgIHN0ZDo6c2V0PGludD4gbURlbGV0ZWRUcmFja05hbWVzOworCisgICAgICAgIC8vIEZhc3QgbG9va3VwIG9mIHByZXZpb3VzbHkgZGVsZXRlZCB0cmFjayBuYW1lcyBmb3IgcmV1c2UuCisgICAgICAgIC8vIFRoaXMgaXMgYW4gYXJiaXRyYXJ5IGRlY2lzaW9uIChhY3R1YWxseSBhbnkgbm9uLW5lZ2F0aXZlCisgICAgICAgIC8vIGludGVnZXIgdGhhdCBpc24ndCBpbiBtVHJhY2tzWypdLT5uYW1lcygpIGNvdWxkIGJlIHVzZWQpIC0gd2UgYXR0ZW1wdAorICAgICAgICAvLyB0byB1c2UgdGhlIHNtYWxsZXN0IHBvc3NpYmxlIGF2YWlsYWJsZSBuYW1lLgorICAgICAgICBzdGQ6OnNldDxpbnQ+IG1VbnVzZWRUcmFja05hbWVzOworCisgICAgICAgIFNvcnRlZFZlY3RvcjxzcDxUPj4gbVRyYWNrczsgLy8gd3JhcHBlZCBTb3J0ZWRWZWN0b3IuCisgICAgfTsKKworICAgIFRyYWNrczxUcmFjaz4gICAgICAgICAgICAgICAgICAgbVRyYWNrczsKKwogICAgIHN0cmVhbV90eXBlX3QgICAgICAgICAgICAgICAgICAgbVN0cmVhbVR5cGVzW0FVRElPX1NUUkVBTV9DTlRdOwogICAgIEF1ZGlvU3RyZWFtT3V0ICAgICAgICAgICAgICAgICAgKm1PdXRwdXQ7CiAKQEAgLTk4NCw2ICsxMDYwLDcgQEAKICAgICBzcDxOQkFJT19Tb3VyY2U+ICAgICAgICBtVGVlU291cmNlOwogI2VuZGlmCiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbVNjcmVlblN0YXRlOyAgIC8vIGNhY2hlZCBjb3B5IG9mIGdTY3JlZW5TdGF0ZQorICAgIC8vIFRPRE86IGFkZCBjb21tZW50IGFuZCBhZGp1c3Qgc2l6ZSBhcyBuZWVkZWQKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90ICAgICBrRmFzdE1peGVyTG9nU2l6ZSA9IDggKiAxMDI0OwogICAgIHNwPE5CTG9nOjpXcml0ZXI+ICAgICAgIG1GYXN0TWl4ZXJOQkxvZ1dyaXRlcjsKIApAQCAtMTAyMCwxMSArMTA5NywxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QmIHN0YXR1cyk7CiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCisgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgaXNUcmFja0FsbG93ZWRfbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLCB1aWRfdCB1aWQpIGNvbnN0IG92ZXJyaWRlOwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgICAgIG1peGVyX3N0YXRlIHByZXBhcmVUcmFja3NfbChWZWN0b3I8IHNwPFRyYWNrPiA+ICp0cmFja3NUb1JlbW92ZSk7Ci0gICAgdmlydHVhbCAgICAgaW50ICAgICAgICAgZ2V0VHJhY2tOYW1lX2woYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLCB1aWRfdCB1aWQpOwotICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGRlbGV0ZVRyYWNrTmFtZV9sKGludCBuYW1lKTsKICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBpZGxlU2xlZXBUaW1lVXMoKSBjb25zdDsKICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBzdXNwZW5kU2xlZXBUaW1lVXMoKSBjb25zdDsKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBjYWNoZVBhcmFtZXRlcnNfbCgpOwpAQCAtMTEwMiw5ICsxMTc5LDYgQEAKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBmbHVzaEh3X2woKTsKIAogcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgICAgIGludCAgICAgICAgIGdldFRyYWNrTmFtZV9sKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwgdWlkX3QgdWlkKTsKLSAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBkZWxldGVUcmFja05hbWVfbChpbnQgbmFtZSk7CiAgICAgdmlydHVhbCAgICAgdWludDMyX3QgICAgYWN0aXZlU2xlZXBUaW1lVXMoKSBjb25zdDsKICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBpZGxlU2xlZXBUaW1lVXMoKSBjb25zdDsKICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBzdXNwZW5kU2xlZXBUaW1lVXMoKSBjb25zdDsKQEAgLTEyMDgsOSArMTI4MiwxNCBAQAogICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5EdXBsaWNhdGluZ1RocmVhZCgpOwogCiAgICAgLy8gVGhyZWFkIHZpcnR1YWxzCisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIG92ZXJyaWRlOworCiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgYWRkT3V0cHV0VHJhY2soTWl4ZXJUaHJlYWQqIHRocmVhZCk7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgcmVtb3ZlT3V0cHV0VHJhY2soTWl4ZXJUaHJlYWQqIHRocmVhZCk7CiAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgd2FpdFRpbWVNcygpIGNvbnN0IHsgcmV0dXJuIG1XYWl0VGltZU1zOyB9CisKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzZW5kTWV0YWRhdGFUb0JhY2tlbmRfbCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmVhbU91dEhhbEludGVyZmFjZTo6U291cmNlTWV0YWRhdGEmIG1ldGFkYXRhKSBvdmVycmlkZTsKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBhY3RpdmVTbGVlcFRpbWVVcygpIGNvbnN0OwogCkBAIC0xMzIzLDEyICsxNDAyLDEzIEBACiAKICAgICAgICAgICAgIHNwPEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjaz4gIGNyZWF0ZVJlY29yZFRyYWNrX2woCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvRmxpbmdlcjo6Q2xpZW50PiYgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHIsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpwRnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpub3RpZmljYXRpb25GcmFtZXMsCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqcE5vdGlmaWNhdGlvbkZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCAqZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgIHBpZF90IHRpZCwKQEAgLTEzOTIsNiArMTQ3MiwxMyBAQAogCiAgICAgICAgICAgICB2b2lkICAgICAgICBjaGVja0J0TnJlYygpOwogCisgICAgICAgICAgICAvLyBTZXRzIHRoZSBVSUQgcmVjb3JkcyBzaWxlbmNlCisgICAgICAgICAgICB2b2lkICAgICAgICBzZXRSZWNvcmRTaWxlbmNlZCh1aWRfdCB1aWQsIGJvb2wgc2lsZW5jZWQpOworCisgICAgICAgICAgICBzdGF0dXNfdCAgICBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBhY3RpdmVNaWNyb3Bob25lcyk7CisKKyAgICAgICAgICAgIHZvaWQgICAgICAgIHVwZGF0ZU1ldGFkYXRhX2woKSBvdmVycmlkZTsKKwogcHJpdmF0ZToKICAgICAgICAgICAgIC8vIEVudGVyIHN0YW5kYnkgaWYgbm90IGFscmVhZHkgaW4gc3RhbmRieSwgYW5kIHNldCBtU3RhbmRieSBmbGFnCiAgICAgICAgICAgICB2b2lkICAgIHN0YW5kYnlJZk5vdEFscmVhZHlJblN0YW5kYnkoKTsKQEAgLTE0NTYsNiArMTU0Myw3IEBACiAgICAgICAgICAgICAvLyBJZiBhIGZhc3QgY2FwdHVyZSBpcyBwcmVzZW50LCB0aGUgUGlwZSBhcyBJTWVtb3J5LCBvdGhlcndpc2UgY2xlYXIKICAgICAgICAgICAgIHNwPElNZW1vcnk+ICAgICAgICAgICAgICAgICAgICAgICAgIG1QaXBlTWVtb3J5OwogCisgICAgICAgICAgICAvLyBUT0RPOiBhZGQgY29tbWVudCBhbmQgYWRqdXN0IHNpemUgYXMgbmVlZGVkCiAgICAgICAgICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90ICAgICAgICAgICAgICAgICBrRmFzdENhcHR1cmVMb2dTaXplID0gNCAqIDEwMjQ7CiAgICAgICAgICAgICBzcDxOQkxvZzo6V3JpdGVyPiAgICAgICAgICAgICAgICAgICBtRmFzdENhcHR1cmVOQkxvZ1dyaXRlcjsKIApAQCAtMTUwMSw2ICsxNTg5LDcgQEAKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICB0aHJlYWRMb29wX2V4aXQoKTsKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICB0aHJlYWRMb29wX3N0YW5kYnkoKTsKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBzaG91bGRTdGFuZGJ5X2woKSB7IHJldHVybiBmYWxzZTsgfQorICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIGV4aXRTdGFuZGJ5KCk7CiAKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBpbml0Q2hlY2soKSBjb25zdCB7IHJldHVybiAobUhhbFN0cmVhbSA9PSAwKSA/IE5PX0lOSVQgOiBOT19FUlJPUjsgfQogICAgIHZpcnR1YWwgICAgIHNpemVfdCAgICAgIGZyYW1lQ291bnQoKSBjb25zdCB7IHJldHVybiBtRnJhbWVDb3VudDsgfQpAQCAtMTUzMyw2ICsxNjIyLDkgQEAKIAogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGludmFsaWRhdGVUcmFja3MoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlIF9fdW51c2VkKSB7fQogCisgICAgICAgICAgICAgICAgLy8gU2V0cyB0aGUgVUlEIHJlY29yZHMgc2lsZW5jZQorICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHNldFJlY29yZFNpbGVuY2VkKHVpZF90IHVpZCBfX3VudXNlZCwgYm9vbCBzaWxlbmNlZCBfX3VudXNlZCkge30KKwogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcFRyYWNrcyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwpAQCAtMTU0OSw2ICsxNjQxLDEwIEBACiAgICAgICAgICAgICAgICAgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAgbUhhbERldmljZTsKICAgICAgICAgICAgICAgICBBdWRpb0h3RGV2aWNlKiBjb25zdCAgICBtQXVkaW9Id0RldjsKICAgICAgICAgICAgICAgICBBY3RpdmVUcmFja3M8TW1hcFRyYWNrPiBtQWN0aXZlVHJhY2tzOworICAgICAgICAgICAgICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1IYWxWb2xGbG9hdDsKKworICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgIG1Ob0NhbGxiYWNrV2FybmluZ0NvdW50OworICAgICBzdGF0aWMgICAgIGNvbnN0ZXhwciBpbnQzMl90ICAgICAgIGtNYXhOb0NhbGxiYWNrV2FybmluZ3MgPSA1OwogfTsKIAogY2xhc3MgTW1hcFBsYXliYWNrVGhyZWFkIDogcHVibGljIE1tYXBUaHJlYWQsIHB1YmxpYyBWb2x1bWVJbnRlcmZhY2UKQEAgLTE1ODIsMTIgKzE2NzgsMTQgQEAKIAogICAgIHZpcnR1YWwgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSgpIHsgcmV0dXJuIG1TdHJlYW1UeXBlOyB9CiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgY2hlY2tTaWxlbnRNb2RlX2woKTsKLSAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBwcm9jZXNzVm9sdW1lX2woKTsKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICBwcm9jZXNzVm9sdW1lX2woKSBvdmVycmlkZTsKIAogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIAogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIGlzT3V0cHV0KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQogCisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgdXBkYXRlTWV0YWRhdGFfbCgpIG92ZXJyaWRlOworCiBwcm90ZWN0ZWQ6CiAKICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICAgICAgICAgbVN0cmVhbVR5cGU7CkBAIC0xNTk1LDcgKzE2OTMsNiBAQAogICAgICAgICAgICAgICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtVm9sdW1lOwogICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtTWFzdGVyTXV0ZTsKICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbU11dGU7Ci0gICAgICAgICAgICAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgIG1IYWxWb2xGbG9hdDsKICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbU91dCogICAgICAgICAgICAgbU91dHB1dDsKIH07CiAKQEAgLTE2MTAsOCArMTcwNywxMyBAQAogCiAgICAgICAgICAgICAgICAgQXVkaW9TdHJlYW1JbiogY2xlYXJJbnB1dCgpOwogCisgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgZXhpdFN0YW5kYnkoKSBvdmVycmlkZTsKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICAgICBpc091dHB1dCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9CiAKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICB1cGRhdGVNZXRhZGF0YV9sKCkgb3ZlcnJpZGU7CisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgcHJvY2Vzc1ZvbHVtZV9sKCkgb3ZlcnJpZGU7CisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgc2V0UmVjb3JkU2lsZW5jZWQodWlkX3QgdWlkLCBib29sIHNpbGVuY2VkKSBvdmVycmlkZTsKKwogcHJvdGVjdGVkOgogCiAgICAgICAgICAgICAgICAgQXVkaW9TdHJlYW1JbiogIG1JbnB1dDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja0Jhc2UuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja0Jhc2UuaAppbmRleCBkNGNlMGI0Li5jY2ZiNjlmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tCYXNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrQmFzZS5oCkBAIC01NCw4ICs1NCwxNCBAQAogICAgICAgICBUWVBFX1BBVENILAogICAgIH07CiAKKyAgICBlbnVtIHsKKyAgICAgICAgVFJBQ0tfTkFNRV9QRU5ESU5HID0gLTEsCisgICAgICAgIFRSQUNLX05BTUVfRkFJTFVSRSA9IC0yLAorICAgIH07CisKICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrQmFzZShUaHJlYWRCYXNlICp0aHJlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPENsaWVudD4mIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBtQXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKQEAgLTkyLDYgKzk4LDcgQEAKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGludmFsaWRhdGUoKSB7IG1Jc0ludmFsaWQgPSB0cnVlOyB9CiAgICAgICAgICAgICBib29sICAgICAgICBpc0ludmFsaWQoKSBjb25zdCB7IHJldHVybiBtSXNJbnZhbGlkOyB9CiAKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgIGF0dHJpYnV0ZXMoKSBjb25zdCB7IHJldHVybiBtQXR0cjsgfQogCiBwcm90ZWN0ZWQ6CiAgICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFRyYWNrQmFzZSk7CkBAIC0xODMsNiArMTkwLDcgQEAKICAgICBzaXplX3QgICAgICAgICAgICAgIG1CdWZmZXJTaXplOyAvLyBzaXplIG9mIG1CdWZmZXIgaW4gYnl0ZXMKICAgICAvLyB3ZSBkb24ndCByZWFsbHkgbmVlZCBhIGxvY2sgZm9yIHRoZXNlCiAgICAgdHJhY2tfc3RhdGUgICAgICAgICBtU3RhdGU7CisgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IG1BdHRyOwogICAgIGNvbnN0IHVpbnQzMl90ICAgICAgbVNhbXBsZVJhdGU7ICAgIC8vIGluaXRpYWwgc2FtcGxlIHJhdGUgb25seTsgZm9yIHRyYWNrcyB3aGljaAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBkeW5hbWljIHJhdGVzLCB0aGUgY3VycmVudCB2YWx1ZSBpcyBpbiBjb250cm9sIGJsb2NrCiAgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgbUZvcm1hdDsKQEAgLTE5Miw3ICsyMDAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlcmUgZm9yIEF1ZGlvVHJhY2sgKGJ1dCBub3QgQXVkaW9SZWNvcmQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gOC1iaXQgUENNIHNhbXBsZXMgYXJlIHN0b3JlZCBhcyAxNi1iaXQKICAgICBjb25zdCBzaXplX3QgICAgICAgIG1GcmFtZUNvdW50Oy8vIHNpemUgb2YgdHJhY2sgYnVmZmVyIGdpdmVuIGF0IGNyZWF0ZVRyYWNrKCkgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wZW5SZWNvcmQoKSwgYW5kIHRoZW4gYWRqdXN0ZWQgYXMgbmVlZGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGVSZWNvcmQoKSwgYW5kIHRoZW4gYWRqdXN0ZWQgYXMgbmVlZGVkCiAKICAgICBjb25zdCBhdWRpb19zZXNzaW9uX3QgbVNlc3Npb25JZDsKICAgICB1aWRfdCAgICAgICAgICAgICAgIG1VaWQ7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCmluZGV4IDBmMjUxNTMuLmE3YzQyNTMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCkBAIC01Miw2ICs1Miw3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAordXNpbmcgbWVkaWE6OlZvbHVtZVNoYXBlcjsKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vICAgICAgVHJhY2tCYXNlCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC02Miw2ICs2Myw3IEBACiBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OlRyYWNrQmFzZTo6VHJhY2tCYXNlKAogICAgICAgICAgICAgVGhyZWFkQmFzZSAqdGhyZWFkLAogICAgICAgICAgICAgY29uc3Qgc3A8Q2xpZW50PiYgY2xpZW50LAorICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyLAogICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLApAQCAtODAsNiArODIsNyBAQAogICAgICAgICBtQ2JsayhOVUxMKSwKICAgICAgICAgLy8gbUJ1ZmZlciwgbUJ1ZmZlclNpemUKICAgICAgICAgbVN0YXRlKElETEUpLAorICAgICAgICBtQXR0cihhdHRyKSwKICAgICAgICAgbVNhbXBsZVJhdGUoc2FtcGxlUmF0ZSksCiAgICAgICAgIG1Gb3JtYXQoZm9ybWF0KSwKICAgICAgICAgbUNoYW5uZWxNYXNrKGNoYW5uZWxNYXNrKSwKQEAgLTM3MSw2ICszNzQsNyBAQAogICAgICAgICAgICAgUGxheWJhY2tUaHJlYWQgKnRocmVhZCwKICAgICAgICAgICAgIGNvbnN0IHNwPENsaWVudD4mIGNsaWVudCwKICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0ciwKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKQEAgLTM4Myw3ICszODcsNyBAQAogICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICB0cmFja190eXBlIHR5cGUsCiAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKLSAgICA6ICAgVHJhY2tCYXNlKHRocmVhZCwgY2xpZW50LCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAorICAgIDogICBUcmFja0Jhc2UodGhyZWFkLCBjbGllbnQsIGF0dHIsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAoc2hhcmVkQnVmZmVyICE9IDApID8gc2hhcmVkQnVmZmVyLT5wb2ludGVyKCkgOiBidWZmZXIsCiAgICAgICAgICAgICAgICAgICAoc2hhcmVkQnVmZmVyICE9IDApID8gc2hhcmVkQnVmZmVyLT5zaXplKCkgOiBidWZmZXJTaXplLAogICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCB1aWQsIHRydWUgLyppc091dCovLApAQCAtMzkzLDE2ICszOTcsMTkgQEAKICAgICAvLyBtUmV0cnlDb3VudCBpbml0aWFsaXplZCBsYXRlciB3aGVuIG5lZWRlZAogICAgIG1TaGFyZWRCdWZmZXIoc2hhcmVkQnVmZmVyKSwKICAgICBtU3RyZWFtVHlwZShzdHJlYW1UeXBlKSwKLSAgICBtTmFtZSgtMSksICAvLyBzZWUgbm90ZSBiZWxvdwotICAgIG1NYWluQnVmZmVyKHRocmVhZC0+bWl4QnVmZmVyKCkpLAorICAgIG1OYW1lKFRSQUNLX05BTUVfRkFJTFVSRSksICAvLyBzZXQgdG8gVFJBQ0tfTkFNRV9QRU5ESU5HIG9uIGNvbnN0cnVjdG9yIHN1Y2Nlc3MuCisgICAgbU1haW5CdWZmZXIodGhyZWFkLT5zaW5rQnVmZmVyKCkpLAogICAgIG1BdXhCdWZmZXIoTlVMTCksCiAgICAgbUF1eEVmZmVjdElkKDApLCBtSGFzVm9sdW1lQ29udHJvbGxlcihmYWxzZSksCiAgICAgbVByZXNlbnRhdGlvbkNvbXBsZXRlRnJhbWVzKDApLAogICAgIG1GcmFtZU1hcCgxNiAvKiBzaW5rLWZyYW1lLXRvLXRyYWNrLWZyYW1lIG1hcCBtZW1vcnkgKi8pLAotICAgIG1Wb2x1bWVIYW5kbGVyKG5ldyBWb2x1bWVIYW5kbGVyKHNhbXBsZVJhdGUpKSwKKyAgICBtVm9sdW1lSGFuZGxlcihuZXcgbWVkaWE6OlZvbHVtZUhhbmRsZXIoc2FtcGxlUmF0ZSkpLAogICAgIC8vIG1TaW5rVGltZXN0YW1wCiAgICAgbUZhc3RJbmRleCgtMSksCiAgICAgbUNhY2hlZFZvbHVtZSgxLjApLAorICAgIC8qIFRoZSB0cmFjayBtaWdodCBub3QgcGxheSBpbW1lZGlhdGVseSBhZnRlciBiZWluZyBhY3RpdmUsIHNpbWlsYXJseSBhcyBpZiBpdHMgdm9sdW1lIHdhcyAwLgorICAgICAqIFdoZW4gdGhlIHRyYWNrIHN0YXJ0cyBwbGF5aW5nLCBpdHMgdm9sdW1lIHdpbGwgYmUgY29tcHV0ZWQuICovCisgICAgbUZpbmFsVm9sdW1lKDAuZiksCiAgICAgbVJlc3VtZVRvU3RvcHBpbmcoZmFsc2UpLAogICAgIG1GbHVzaEh3UGVuZGluZyhmYWxzZSksCiAgICAgbUZsYWdzKGZsYWdzKQpAQCAtNDI2LDkgKzQzMyw4IEBACiAgICAgfQogICAgIG1TZXJ2ZXJQcm94eSA9IG1BdWRpb1RyYWNrU2VydmVyUHJveHk7CiAKLSAgICBtTmFtZSA9IHRocmVhZC0+Z2V0VHJhY2tOYW1lX2woY2hhbm5lbE1hc2ssIGZvcm1hdCwgc2Vzc2lvbklkLCB1aWQpOwotICAgIGlmIChtTmFtZSA8IDApIHsKLSAgICAgICAgQUxPR0UoIm5vIG1vcmUgdHJhY2sgbmFtZXMgYXZhaWxhYmxlIik7CisgICAgaWYgKCF0aHJlYWQtPmlzVHJhY2tBbGxvd2VkX2woY2hhbm5lbE1hc2ssIGZvcm1hdCwgc2Vzc2lvbklkLCB1aWQpKSB7CisgICAgICAgIEFMT0dFKCJubyBtb3JlIHRyYWNrcyBhdmFpbGFibGUiKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICAvLyBvbmx5IGFsbG9jYXRlIGEgZmFzdCB0cmFjayBpbmRleCBpZiB3ZSB3ZXJlIGFibGUgdG8gYWxsb2NhdGUgYSBub3JtYWwgdHJhY2sgbmFtZQpAQCAtNDQ3LDYgKzQ1Myw3IEBACiAgICAgICAgIG1GYXN0SW5kZXggPSBpOwogICAgICAgICB0aHJlYWQtPm1GYXN0VHJhY2tBdmFpbE1hc2sgJj0gfigxIDw8IGkpOwogICAgIH0KKyAgICBtTmFtZSA9IFRSQUNLX05BTUVfUEVORElORzsKIH0KIAogQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6On5UcmFjaygpCkBAIC00NjUsNyArNDcyLDcgQEAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjppbml0Q2hlY2soKSBjb25zdAogewogICAgIHN0YXR1c190IHN0YXR1cyA9IFRyYWNrQmFzZTo6aW5pdENoZWNrKCk7Ci0gICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiBtTmFtZSA8IDApIHsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIG1OYW1lID09IFRSQUNLX05BTUVfRkFJTFVSRSkgewogICAgICAgICBzdGF0dXMgPSBOT19NRU1PUlk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CkBAIC01MjYsMTAgKzUzMywxMiBAQAogCiAgICAgaWYgKGlzRmFzdFRyYWNrKCkpIHsKICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiRiVjICUzZCIsIHRyYWNrVHlwZSwgbUZhc3RJbmRleCk7Ci0gICAgfSBlbHNlIGlmIChtTmFtZSA+PSBBdWRpb01peGVyOjpUUkFDSzApIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJWMgJTRkIiwgdHJhY2tUeXBlLCBtTmFtZSAtIEF1ZGlvTWl4ZXI6OlRSQUNLMCk7CisgICAgfSBlbHNlIGlmIChtTmFtZSA9PSBUUkFDS19OQU1FX1BFTkRJTkcpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJWMgcGVuZCIsIHRyYWNrVHlwZSk7CisgICAgfSBlbHNlIGlmIChtTmFtZSA9PSBUUkFDS19OQU1FX0ZBSUxVUkUpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJWMgZmFpbCIsIHRyYWNrVHlwZSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJWMgbm9uZSIsIHRyYWNrVHlwZSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiVjICU0ZCIsIHRyYWNrVHlwZSwgbU5hbWUpOwogICAgIH0KIAogICAgIGNoYXIgbm93SW5VbmRlcnJ1bjsKQEAgLTc1OCw2ICs3NjcsMTIgQEAKICAgICAgICAgICAgICAgICBtU3RhdGUgPSBzdGF0ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorCisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgfHwgc3RhdHVzID09IEFMUkVBRFlfRVhJU1RTKSB7CisgICAgICAgICAgICAvLyBmb3Igc3RyZWFtaW5nIHRyYWNrcywgcmVtb3ZlIHRoZSBidWZmZXIgcmVhZCBzdG9wIGxpbWl0LgorICAgICAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+c3RhcnQoKTsKKyAgICAgICAgfQorCiAgICAgICAgIC8vIHRyYWNrIHdhcyBhbHJlYWR5IGluIHRoZSBhY3RpdmUgbGlzdCwgbm90IGEgcHJvYmxlbQogICAgICAgICBpZiAoc3RhdHVzID09IEFMUkVBRFlfRVhJU1RTKSB7CiAgICAgICAgICAgICBzdGF0dXMgPSBOT19FUlJPUjsKQEAgLTk4NSw2ICsxMDAwLDIzIEBACiAgICAgcmV0dXJuIG1Wb2x1bWVIYW5kbGVyLT5nZXRWb2x1bWVTaGFwZXJTdGF0ZShpZCk7CiB9CiAKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OnNldEZpbmFsVm9sdW1lKGZsb2F0IHZvbHVtZSkKK3sKKyAgICBpZiAobUZpbmFsVm9sdW1lICE9IHZvbHVtZSkgeyAvLyBDb21wYXJlIHRvIGFuIGVwc2lsb24gaWYgdG9vIG1hbnkgbWVhbmluZ2xlc3MgdXBkYXRlcworICAgICAgICBtRmluYWxWb2x1bWUgPSB2b2x1bWU7CisgICAgICAgIHNldE1ldGFkYXRhSGFzQ2hhbmdlZCgpOworICAgIH0KK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6Y29weU1ldGFkYXRhVG8oTWV0YWRhdGFJbnNlcnRlciYgYmFja0luc2VydGVyKSBjb25zdAoreworICAgICpiYWNrSW5zZXJ0ZXIrKyA9IHsKKyAgICAgICAgICAgIC51c2FnZSA9IG1BdHRyLnVzYWdlLAorICAgICAgICAgICAgLmNvbnRlbnRfdHlwZSA9IG1BdHRyLmNvbnRlbnRfdHlwZSwKKyAgICAgICAgICAgIC5nYWluID0gbUZpbmFsVm9sdW1lLAorICAgIH07Cit9CisKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCkKIHsKICAgICBpZiAoIWlzT2ZmbG9hZGVkKCkgJiYgIWlzRGlyZWN0KCkpIHsKQEAgLTExMDEsMTEgKzExMzMsMTIgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6dHJpZ2dlckV2ZW50cyhBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IHR5cGUpCiB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU3luY0V2ZW50cy5zaXplKCk7IGkrKykgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVN5bmNFdmVudHMuc2l6ZSgpOykgewogICAgICAgICBpZiAobVN5bmNFdmVudHNbaV0tPnR5cGUoKSA9PSB0eXBlKSB7CiAgICAgICAgICAgICBtU3luY0V2ZW50c1tpXS0+dHJpZ2dlcigpOwogICAgICAgICAgICAgbVN5bmNFdmVudHMucmVtb3ZlQXQoaSk7Ci0gICAgICAgICAgICBpLS07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICArK2k7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0xMjU1LDYgKzEyODgsNyBAQAogICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgICAgICB1aWRfdCB1aWQpCiAgICAgOiAgIFRyYWNrKHBsYXliYWNrVGhyZWFkLCBOVUxMLCBBVURJT19TVFJFQU1fUEFUQ0gsCisgICAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdHt9IC8qIGN1cnJlbnRseSB1bnVzZWQgZm9yIG91dHB1dCB0cmFjayAqLywKICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBidWZmZXIgKi8sIChzaXplX3QpMCAvKiBidWZmZXJTaXplICovLCBudWxscHRyIC8qIHNoYXJlZEJ1ZmZlciAqLywKICAgICAgICAgICAgICAgQVVESU9fU0VTU0lPTl9OT05FLCB1aWQsIEFVRElPX09VVFBVVF9GTEFHX05PTkUsCkBAIC0xNDEzLDYgKzE0NDcsMjEgQEAKICAgICByZXR1cm4gb3V0cHV0QnVmZmVyRnVsbDsKIH0KIAordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpPdXRwdXRUcmFjazo6Y29weU1ldGFkYXRhVG8oTWV0YWRhdGFJbnNlcnRlciYgYmFja0luc2VydGVyKSBjb25zdAoreworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1UcmFja01ldGFkYXRhc011dGV4KTsKKyAgICBiYWNrSW5zZXJ0ZXIgPSBzdGQ6OmNvcHkobVRyYWNrTWV0YWRhdGFzLmJlZ2luKCksIG1UcmFja01ldGFkYXRhcy5lbmQoKSwgYmFja0luc2VydGVyKTsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpPdXRwdXRUcmFjazo6c2V0TWV0YWRhdGFzKGNvbnN0IFNvdXJjZU1ldGFkYXRhcyYgbWV0YWRhdGFzKSB7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtVHJhY2tNZXRhZGF0YXNNdXRleCk7CisgICAgICAgIG1UcmFja01ldGFkYXRhcyA9IG1ldGFkYXRhczsKKyAgICB9CisgICAgLy8gTm8gbmVlZCB0byBhZGp1c3QgbWV0YWRhdGEgdHJhY2sgdm9sdW1lcyBhcyBPdXRwdXRUcmFjayB2b2x1bWVzIGFyZSBhbHdheXMgMGRCRlMuCisgICAgc2V0TWV0YWRhdGFIYXNDaGFuZ2VkKCk7Cit9CisKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6Ok91dHB1dFRyYWNrOjpvYnRhaW5CdWZmZXIoCiAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyLCB1aW50MzJfdCB3YWl0VGltZU1zKQogewpAQCAtMTQ1Nyw2ICsxNTA2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKQogICAgIDogICBUcmFjayhwbGF5YmFja1RocmVhZCwgTlVMTCwgc3RyZWFtVHlwZSwKKyAgICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190e30gLyogY3VycmVudGx5IHVudXNlZCBmb3IgcGF0Y2ggdHJhY2sgKi8sCiAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgIGJ1ZmZlciwgYnVmZmVyU2l6ZSwgbnVsbHB0ciAvKiBzaGFyZWRCdWZmZXIgKi8sCiAgICAgICAgICAgICAgIEFVRElPX1NFU1NJT05fTk9ORSwgZ2V0dWlkKCksIGZsYWdzLCBUWVBFX1BBVENIKSwKQEAgLTE1MjEsOSArMTU3MSwxMSBAQAogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwogICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtNYXhUcmllcyA9IDU7CiAgICAgaW50MzJfdCB0cnlDb3VudGVyID0ga01heFRyaWVzOworICAgIGNvbnN0IHNpemVfdCBvcmlnaW5hbEZyYW1lQ291bnQgPSBidWZmZXItPm1GcmFtZUNvdW50OwogICAgIGRvIHsKICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT1RfRU5PVUdIX0RBVEEpIHsKICAgICAgICAgICAgIHJlc3RhcnRJZkRpc2FibGVkKCk7CisgICAgICAgICAgICBidWZmZXItPm1GcmFtZUNvdW50ID0gb3JpZ2luYWxGcmFtZUNvdW50OyAvLyBjbGVhcmVkIG9uIGVycm9yLCBtdXN0IGJlIHJlc3RvcmVkLgogICAgICAgICB9CiAgICAgICAgIHN0YXR1cyA9IG1Qcm94eS0+b2J0YWluQnVmZmVyKGJ1ZmZlciwgdGltZU91dCk7CiAgICAgfSB3aGlsZSAoKHN0YXR1cyA9PSBOT1RfRU5PVUdIX0RBVEEpICYmICh0cnlDb3VudGVyLS0gPiAwKSk7CkBAIC0xNTYxLDE0ICsxNjEzLDE2IEBACiAgICAgbVJlY29yZFRyYWNrLT5kZXN0cm95KCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkSGFuZGxlOjpzdGFydChpbnQgLypBdWRpb1N5c3RlbTo6c3luY19ldmVudF90Ki8gZXZlbnQsCi0gICAgICAgIGF1ZGlvX3Nlc3Npb25fdCB0cmlnZ2VyU2Vzc2lvbikgeworYmluZGVyOjpTdGF0dXMgQXVkaW9GbGluZ2VyOjpSZWNvcmRIYW5kbGU6OnN0YXJ0KGludCAvKkF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QqLyBldmVudCwKKyAgICAgICAgaW50IC8qYXVkaW9fc2Vzc2lvbl90Ki8gdHJpZ2dlclNlc3Npb24pIHsKICAgICBBTE9HVigiUmVjb3JkSGFuZGxlOjpzdGFydCgpIik7Ci0gICAgcmV0dXJuIG1SZWNvcmRUcmFjay0+c3RhcnQoKEF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QpZXZlbnQsIHRyaWdnZXJTZXNzaW9uKTsKKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKAorICAgICAgICBtUmVjb3JkVHJhY2stPnN0YXJ0KChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90KWV2ZW50LCAoYXVkaW9fc2Vzc2lvbl90KSB0cmlnZ2VyU2Vzc2lvbikpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkSGFuZGxlOjpzdG9wKCkgeworYmluZGVyOjpTdGF0dXMgQXVkaW9GbGluZ2VyOjpSZWNvcmRIYW5kbGU6OnN0b3AoKSB7CiAgICAgc3RvcF9ub252aXJ0dWFsKCk7CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkSGFuZGxlOjpzdG9wX25vbnZpcnR1YWwoKSB7CkBAIC0xNTc2LDEwICsxNjMwLDExIEBACiAgICAgbVJlY29yZFRyYWNrLT5zdG9wKCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkSGFuZGxlOjpvblRyYW5zYWN0KAotICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCi17Ci0gICAgcmV0dXJuIEJuQXVkaW9SZWNvcmQ6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKK2JpbmRlcjo6U3RhdHVzIEF1ZGlvRmxpbmdlcjo6UmVjb3JkSGFuZGxlOjpnZXRBY3RpdmVNaWNyb3Bob25lcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogYWN0aXZlTWljcm9waG9uZXMpIHsKKyAgICBBTE9HVigiUmVjb3JkSGFuZGxlOjpnZXRBY3RpdmVNaWNyb3Bob25lcygpIik7CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCgKKyAgICAgICAgICAgIG1SZWNvcmRUcmFjay0+Z2V0QWN0aXZlTWljcm9waG9uZXMoYWN0aXZlTWljcm9waG9uZXMpKTsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTU4OCw2ICsxNjQzLDcgQEAKIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6UmVjb3JkVHJhY2soCiAgICAgICAgICAgICBSZWNvcmRUaHJlYWQgKnRocmVhZCwKICAgICAgICAgICAgIGNvbnN0IHNwPENsaWVudD4mIGNsaWVudCwKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0ciwKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKQEAgLTE1OTksNyArMTY1NSw3IEBACiAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgdHJhY2tfdHlwZSB0eXBlLAogICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCi0gICAgOiAgIFRyYWNrQmFzZSh0aHJlYWQsIGNsaWVudCwgc2FtcGxlUmF0ZSwgZm9ybWF0LAorICAgIDogICBUcmFja0Jhc2UodGhyZWFkLCBjbGllbnQsIGF0dHIsIHNhbXBsZVJhdGUsIGZvcm1hdCwKICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBidWZmZXIsIGJ1ZmZlclNpemUsIHNlc3Npb25JZCwgdWlkLCBmYWxzZSAvKmlzT3V0Ki8sCiAgICAgICAgICAgICAgICAgICAodHlwZSA9PSBUWVBFX0RFRkFVTFQpID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgKChmbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfRkFTVCkgPyBBTExPQ19QSVBFIDogQUxMT0NfQ0JMSykgOgpAQCAtMTYwOSw3ICsxNjY1LDggQEAKICAgICAgICAgbUZyYW1lc1RvRHJvcCgwKSwKICAgICAgICAgbVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyKE5VTEwpLCAvLyBpbml0aWFsaXplIGluIGNhc2Ugb2YgZWFybHkgY29uc3RydWN0b3IgZXhpdAogICAgICAgICBtUmVjb3JkQnVmZmVyQ29udmVydGVyKE5VTEwpLAotICAgICAgICBtRmxhZ3MoZmxhZ3MpCisgICAgICAgIG1GbGFncyhmbGFncyksCisgICAgICAgIG1TaWxlbmNlZChmYWxzZSkKIHsKICAgICBpZiAobUNibGsgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CkBAIC0xNjg5LDcgKzE3NDYsNyBAQAogICAgIGlmICh0aHJlYWQgIT0gMCkgewogICAgICAgICBSZWNvcmRUaHJlYWQgKnJlY29yZFRocmVhZCA9IChSZWNvcmRUaHJlYWQgKil0aHJlYWQuZ2V0KCk7CiAgICAgICAgIGlmIChyZWNvcmRUaHJlYWQtPnN0b3AodGhpcykgJiYgaXNFeHRlcm5hbFRyYWNrKCkpIHsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wSW5wdXQobVRocmVhZElvSGFuZGxlLCBtU2Vzc2lvbklkKTsKKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wSW5wdXQobVBvcnRJZCk7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0xNzAxLDkgKzE3NTgsOSBAQAogICAgIHsKICAgICAgICAgaWYgKGlzRXh0ZXJuYWxUcmFjaygpKSB7CiAgICAgICAgICAgICBpZiAobVN0YXRlID09IEFDVElWRSB8fCBtU3RhdGUgPT0gUkVTVU1JTkcpIHsKLSAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcElucHV0KG1UaHJlYWRJb0hhbmRsZSwgbVNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BJbnB1dChtUG9ydElkKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQobVRocmVhZElvSGFuZGxlLCBtU2Vzc2lvbklkKTsKKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQobVBvcnRJZCk7CiAgICAgICAgIH0KICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CiAgICAgICAgIGlmICh0aHJlYWQgIT0gMCkgewpAQCAtMTcyOCwxNCArMTc4NSwxNCBAQAogCiAvKnN0YXRpYyovIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCkKIHsKLSAgICByZXN1bHQuYXBwZW5kKCJBY3RpdmUgQ2xpZW50IFNlc3Npb24gUyAgRmxhZ3MgICBGb3JtYXQgQ2huIG1hc2sgIFNSYXRlICAgU2VydmVyIEZybUNudFxuIik7CisgICAgcmVzdWx0LmFwcGVuZCgiQWN0aXZlIENsaWVudCBTZXNzaW9uIFMgIEZsYWdzICAgRm9ybWF0IENobiBtYXNrICBTUmF0ZSAgIFNlcnZlciBGcm1DbnQgU2lsXG4iKTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OmFwcGVuZER1bXAoU3RyaW5nOCYgcmVzdWx0LCBib29sIGFjdGl2ZSkKIHsKICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlYyU1cyAlNnUgJTd1ICUycyAweCUwM1ggIgogICAgICAgICAgICAgIiUwOFggJTA4WCAlNnUgIgotICAgICAgICAgICAgIiUwOFggJTZ6dVxuIiwKKyAgICAgICAgICAgICIlMDhYICU2enUgJTNjXG4iLAogICAgICAgICAgICAgaXNGYXN0VHJhY2soKSA/ICdGJyA6ICcgJywKICAgICAgICAgICAgIGFjdGl2ZSA/ICJ5ZXMiIDogIm5vIiwKICAgICAgICAgICAgIChtQ2xpZW50ID09IDApID8gZ2V0cGlkX2NhY2hlZCA6IG1DbGllbnQtPnBpZCgpLApAQCAtMTc0OCw3ICsxODA1LDggQEAKICAgICAgICAgICAgIG1TYW1wbGVSYXRlLAogCiAgICAgICAgICAgICBtQ2Jsay0+bVNlcnZlciwKLSAgICAgICAgICAgIG1GcmFtZUNvdW50CisgICAgICAgICAgICBtRnJhbWVDb3VudCwKKyAgICAgICAgICAgIGlzU2lsZW5jZWQoKSA/ICdzJyA6ICduJwogICAgICAgICAgICAgKTsKIH0KIApAQCAtMTc5NCw2ICsxODUyLDE4IEBACiAgICAgbVNlcnZlclByb3h5LT5zZXRUaW1lc3RhbXAobG9jYWwpOwogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OmdldEFjdGl2ZU1pY3JvcGhvbmVzKAorICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBhY3RpdmVNaWNyb3Bob25lcykKK3sKKyAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKKyAgICBpZiAodGhyZWFkICE9IDApIHsKKyAgICAgICAgUmVjb3JkVGhyZWFkICpyZWNvcmRUaHJlYWQgPSAoUmVjb3JkVGhyZWFkICopdGhyZWFkLmdldCgpOworICAgICAgICByZXR1cm4gcmVjb3JkVGhyZWFkLT5nZXRBY3RpdmVNaWNyb3Bob25lcyhhY3RpdmVNaWNyb3Bob25lcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9Cit9CisKIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZDo6UGF0Y2hSZWNvcmQoUmVjb3JkVGhyZWFkICpyZWNvcmRUaHJlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLApAQCAtMTgwMiw3ICsxODcyLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykKLSAgICA6ICAgUmVjb3JkVHJhY2socmVjb3JkVGhyZWFkLCBOVUxMLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAorICAgIDogICBSZWNvcmRUcmFjayhyZWNvcmRUaHJlYWQsIE5VTEwsCisgICAgICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190e30gLyogY3VycmVudGx5IHVudXNlZCBmb3IgcGF0Y2ggdHJhY2sgKi8sCisgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICBidWZmZXIsIGJ1ZmZlclNpemUsIEFVRElPX1NFU1NJT05fTk9ORSwgZ2V0dWlkKCksIGZsYWdzLCBUWVBFX1BBVENIKSwKICAgICAgICAgICAgICAgICBtUHJveHkobmV3IENsaWVudFByb3h5KG1DYmxrLCBtQnVmZmVyLCBmcmFtZUNvdW50LCBtRnJhbWVTaXplLCBmYWxzZSwgdHJ1ZSkpCiB7CkBAIC0xODYzLDYgKzE5MzUsNyBAQAogCiAKIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6TW1hcFRyYWNrOjpNbWFwVHJhY2soVGhyZWFkQmFzZSAqdGhyZWFkLAorICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHIsCiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCkBAIC0xODcwLDEzICsxOTQzLDEzIEBACiAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKLSAgICA6ICAgVHJhY2tCYXNlKHRocmVhZCwgTlVMTCwgc2FtcGxlUmF0ZSwgZm9ybWF0LAorICAgIDogICBUcmFja0Jhc2UodGhyZWFkLCBOVUxMLCBhdHRyLCBzYW1wbGVSYXRlLCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgKHNpemVfdCkwIC8qIGZyYW1lQ291bnQgKi8sCiAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qIGJ1ZmZlciAqLywgKHNpemVfdCkwIC8qIGJ1ZmZlclNpemUgKi8sCiAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIHVpZCwgZmFsc2UgLyogaXNPdXQgKi8sCiAgICAgICAgICAgICAgICAgICBBTExPQ19OT05FLAogICAgICAgICAgICAgICAgICAgVFlQRV9ERUZBVUxULCBwb3J0SWQpLAotICAgICAgICBtUGlkKHBpZCkKKyAgICAgICAgbVBpZChwaWQpLCBtU2lsZW5jZWQoZmFsc2UpLCBtU2lsZW5jZWROb3RpZmllZChmYWxzZSkKIHsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1R5cGVkTG9nZ2VyLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHlwZWRMb2dnZXIuaAppbmRleCA5MDlhZjA5Li4zOGMzYzAyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHlwZWRMb2dnZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHlwZWRMb2dnZXIuaApAQCAtMTgsNyArMTgsOSBAQAogI2lmbmRlZiBBTkRST0lEX1RZUEVEX0xPR0dFUl9ICiAjZGVmaW5lIEFORFJPSURfVFlQRURfTE9HR0VSX0gKIAotI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CTG9nLmg+CisvLyBUaGlzIGlzIHRoZSBjbGllbnQgQVBJIGZvciB0aGUgdHlwZWQgbG9nZ2VyLgorCisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvTkJMb2cuaD4KICNpbmNsdWRlIDxhbGdvcml0aG0+CiAKIC8qCkBAIC02Miw3ICs2NCw4IEBACiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3Qgbj4KLWNvbnN0ZXhwciBUIGZudjFhKGNvbnN0IGNoYXIgKCZmaWxlKVtuXSwgaW50IGkgPSBuIC0gMSkgeworX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCitjb25zdGV4cHIgVCBmbnYxYShjb25zdCBjaGFyICgmZmlsZSlbbl0sIHNzaXplX3QgaSA9IChzc2l6ZV90KW4gLSAxKSB7CiAgICAgcmV0dXJuIGkgPT0gLTEgPyBvZmZzZXRfYmFzaXM8VD4oKSA6IChmbnYxYTxUPihmaWxlLCBpIC0gMSkgXiBmaWxlW2ldKSAqIEZOVl9wcmltZTxUPigpOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQW5kcm9pZC5tawppbmRleCA2NTU3MWY5Li5kMjljYWUxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0FuZHJvaWQubWsKQEAgLTI1LDYgKzI1LDcgQEAKICAgICBsaWJzZXJ2aWNldXRpbGl0eSBcCiAgICAgbGliYXVkaW9wb2xpY3ltYW5hZ2VyIFwKICAgICBsaWJtZWRpYV9oZWxwZXIgXAorICAgIGxpYm1lZGlhbWV0cmljcyBcCiAgICAgbGliZWZmZWN0c2NvbmZpZwogCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKQEAgLTYwLDYgKzYxLDcgQEAKICAgICBhdWRpb19wb2xpY3lfY3JpdGVyaWEuY29uZiBcCiAKIExPQ0FMX0NfSU5DTFVERVMgKz0gZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW5jbHVkZQorTE9DQUxfQ19JTkNMVURFUyArPSBmcmFtZXdvcmtzL2F2L2luY2x1ZGUKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJhdWRpb3BvbGljeWVuZ2luZWNvbmZpZ3VyYWJsZQogCkBAIC03OCw2ICs4MCw3IEBACiAgICAgbGliYXVkaW9wb2xpY3ljb21wb25lbnRzCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGlibWVkaWFfaGVscGVyCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYm1lZGlhbWV0cmljcwogCiBpZmVxICgkKFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYpLCAxKQogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJpY3V1YyBsaWJ4bWwyCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaAppbmRleCA3YjE5ZjU4Li40ODEyYjFmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmgKQEAgLTY1LDE1ICs2NSwxOSBAQAogICAgICAgICBBUElfSU5QVVRfVEVMRVBIT05ZX1JYLCAvLyB1c2VkIGZvciBjYXB0dXJlIGZyb20gdGVsZXBob255IFJYIHBhdGgKICAgICB9IGlucHV0X3R5cGVfdDsKIAotICAgZW51bSB7CisgICAgZW51bSB7CiAgICAgICAgIEFQSV9JTlBVVF9DT05DVVJSRU5DWV9OT05FID0gMCwKICAgICAgICAgQVBJX0lOUFVUX0NPTkNVUlJFTkNZX0NBTEwgPSAoMSA8PCAwKSwgICAgICAvLyBDb25jdXJyZW5jeSB3aXRoIGEgY2FsbAogICAgICAgICBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfQ0FQVFVSRSA9ICgxIDw8IDEpLCAgIC8vIENvbmN1cnJlbmN5IHdpdGggYW5vdGhlciBjYXB0dXJlCisgICAgICAgIEFQSV9JTlBVVF9DT05DVVJSRU5DWV9IT1RXT1JEID0gKDEgPDwgMiksICAgLy8gQ29uY3VycmVuY3kgd2l0aCBhIGhvdHdvcmQKKyAgICAgICAgQVBJX0lOUFVUX0NPTkNVUlJFTkNZX1BSRUVNUFQgPSAoMSA8PCAzKSwgICAvLyBwcmUtZW1wdGVkIHNvbWVvbmUKKyAgICAgICAgICAgICAgICAvLyBOQjogcHJlZW1wdCBpcyBtYXJrZWQgb24gYSBzdWNjZXNzZnVsIHJldHVybiwgb3RoZXJzIGFyZSBvbiBmYWlsaW5nIGNhbGxzCisgICAgICAgIEFQSV9JTlBVVF9DT05DVVJSRU5DWV9MQVNUID0gKDEgPDwgNCksCiAKLSAgICAgICAgQVBJX0lOUFVUX0NPTkNVUlJFTkNZX0FMTCA9IChBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfQ0FMTCB8IEFQSV9JTlBVVF9DT05DVVJSRU5DWV9DQVBUVVJFKSwKLSAgIH07CisgICAgICAgIEFQSV9JTlBVVF9DT05DVVJSRU5DWV9BTEwgPSAoQVBJX0lOUFVUX0NPTkNVUlJFTkNZX0xBU1QgLSAxKSwKKyAgICB9OwogCi0gICB0eXBlZGVmIHVpbnQzMl90IGNvbmN1cnJlbmN5X3R5cGVfX21hc2tfdDsKKyAgICB0eXBlZGVmIHVpbnQzMl90IGNvbmN1cnJlbmN5X3R5cGVfX21hc2tfdDsKIAogcHVibGljOgogICAgIHZpcnR1YWwgfkF1ZGlvUG9saWN5SW50ZXJmYWNlKCkge30KQEAgLTEwOSwxOSArMTEzLDE0IEBACiAgICAgLy8KIAogICAgIC8vIHJlcXVlc3QgYW4gb3V0cHV0IGFwcHJvcHJpYXRlIGZvciBwbGF5YmFjayBvZiB0aGUgc3VwcGxpZWQgc3RyZWFtIHR5cGUgYW5kIHBhcmFtZXRlcnMKLSAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbykgPSAwOworICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgKnN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCAqZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpID0gMDsKICAgICAvLyBpbmRpY2F0ZXMgdG8gdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRoYXQgdGhlIG91dHB1dCBzdGFydHMgYmVpbmcgdXNlZCBieSBjb3JyZXNwb25kaW5nIHN0cmVhbS4KQEAgLTE1MCw2ICsxNDksNyBAQAogICAgIC8vIGluZGljYXRlcyB0byB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgdGhhdCB0aGUgaW5wdXQgc3RhcnRzIGJlaW5nIHVzZWQuCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzaWxlbmNlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY3VycmVuY3lfdHlwZV9fbWFza190ICpjb25jdXJyZW5jeSkgPSAwOwogICAgIC8vIGluZGljYXRlcyB0byB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgdGhhdCB0aGUgaW5wdXQgc3RvcHMgYmVpbmcgdXNlZC4KICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKQEAgLTI0NCw2ICsyNDQsMTQgQEAKIAogICAgIHZpcnR1YWwgZmxvYXQgICAgZ2V0U3RyZWFtVm9sdW1lREIoCiAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBpbmRleCwgYXVkaW9fZGV2aWNlc190IGRldmljZSkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdXJyb3VuZEZvcm1hdHModW5zaWduZWQgaW50ICpudW1TdXJyb3VuZEZvcm1hdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnN1cnJvdW5kRm9ybWF0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpzdXJyb3VuZEZvcm1hdHNFbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVwb3J0ZWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCwgYm9vbCBlbmFibGVkKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgICAgIHNldFJlY29yZFNpbGVuY2VkKHVpZF90IHVpZCwgYm9vbCBzaWxlbmNlZCk7CiB9OwogCiAKQEAgLTM2MCw2ICszNjgsNiBAQAogZXh0ZXJuICJDIiB2b2lkIGRlc3Ryb3lBdWRpb1BvbGljeU1hbmFnZXIoQXVkaW9Qb2xpY3lJbnRlcmZhY2UgKmludGVyZmFjZSk7CiAKIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmIC8vIEFORFJPSURfQVVESU9QT0xJQ1lfSU5URVJGQUNFX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL1ZvbHVtZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvVm9sdW1lLmgKaW5kZXggMTIzOWZlMC4uZmMwMTJhMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvVm9sdW1lLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvVm9sdW1lLmgKQEAgLTM4LDYgKzM4LDcgQEAKICAgICBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiwKICAgICBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UsCiAgICAgREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSwKKyAgICBERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQsCiAgICAgREVWSUNFX0NBVEVHT1JZX0NOVAogfTsKIApAQCAtMTI2LDYgKzEyNyw4IEBACiAgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTOgogICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfVVNCX0hFQURTRVQ6CiAgICAgICAgICAgICByZXR1cm4gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQ7CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9IRUFSSU5HX0FJRDoKKyAgICAgICAgICAgIHJldHVybiBERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQ7CiAgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9MSU5FOgogICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQVVYX0RJR0lUQUw6CiAgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9VU0JfREVWSUNFOgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvcG9saWN5LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9wb2xpY3kuaAppbmRleCAzMWYwNTUwLi45YmQ2OGUxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9wb2xpY3kuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9wb2xpY3kuaApAQCAtMzUsNyArMzUsOCBAQAogICogQSBkZXZpY2UgbWFzayBmb3IgYWxsIGF1ZGlvIGlucHV0IGRldmljZXMgdGhhdCBhcmUgY29uc2lkZXJlZCAidmlydHVhbCIgd2hlbiBldmFsdWF0aW5nCiAgKiBhY3RpdmUgaW5wdXRzIGluIGdldEFjdGl2ZUlucHV0cygpCiAgKi8KLSNkZWZpbmUgQVBNX0FVRElPX0lOX0RFVklDRV9WSVJUVUFMX0FMTCAgKEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYKQorI2RlZmluZSBBUE1fQVVESU9fSU5fREVWSUNFX1ZJUlRVQUxfQUxMIChBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWHxcCisgICAgICAgIEFVRElPX0RFVklDRV9JTl9CVVN8QVVESU9fREVWSUNFX0lOX0ZNX1RVTkVSKQogCiAKIC8qKgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9BbmRyb2lkLm1rCmluZGV4IGUyNjNjMGMuLmU2OWU2ODcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL0FuZHJvaWQubWsKQEAgLTM2LDYgKzM2LDcgQEAKICAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlIFwKICAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5IFwKICAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L3V0aWxpdGllcyBcCisgICAgc3lzdGVtL21lZGlhL2F1ZGlvX3V0aWxzL2luY2x1ZGUgXAogCiBpZmVxICgkKFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYpLCAxKQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Db2xsZWN0aW9ucy5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvQ29sbGVjdGlvbnMuaAppbmRleCA4ZjAwZDIyLi5mODZlNzVhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Db2xsZWN0aW9ucy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0NvbGxlY3Rpb25zLmgKQEAgLTQxLDQgKzQxLDQgQEAKICAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3Q7CiB9OwogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvR2Fpbi5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvR2Fpbi5oCmluZGV4IGNlYTVjMGIuLjRhYzUwOGYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0dhaW4uaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9HYWluLmgKQEAgLTY2LDQgKzY2LDQgQEAKICAgICBib29sICAgICAgICAgICAgICBtVXNlSW5DaGFubmVsTWFzazsKIH07CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9JbnB1dERlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0lucHV0RGVzY3JpcHRvci5oCmluZGV4IGIxNjliYWMuLmIyNWQ2ZDQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0lucHV0RGVzY3JpcHRvci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0lucHV0RGVzY3JpcHRvci5oCkBAIC0zNCw4ICszNCw4IEBACiBjbGFzcyBBdWRpb0lucHV0RGVzY3JpcHRvcjogcHVibGljIEF1ZGlvUG9ydENvbmZpZywgcHVibGljIEF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlcgogewogcHVibGljOgotICAgIGV4cGxpY2l0IEF1ZGlvSW5wdXREZXNjcmlwdG9yKGNvbnN0IHNwPElPUHJvZmlsZT4mIHByb2ZpbGUpOwotICAgIHZvaWQgc2V0SW9IYW5kbGUoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpOworICAgIGV4cGxpY2l0IEF1ZGlvSW5wdXREZXNjcmlwdG9yKGNvbnN0IHNwPElPUHJvZmlsZT4mIHByb2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSk7CiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXRJZCgpIGNvbnN0OwogICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBnZXRNb2R1bGVIYW5kbGUoKSBjb25zdDsKICAgICB1aW50MzJfdCBnZXRPcGVuUmVmQ291bnQoKSBjb25zdDsKQEAgLTczLDYgKzczLDIwIEBACiAKICAgICB2b2lkIHNldFBhdGNoSGFuZGxlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSk7CiAKKyAgICBzdGF0dXNfdCBvcGVuKGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQpOworICAgIC8vIENhbGxlZCB3aGVuIGEgc3RyZWFtIGlzIGFib3V0IHRvIGJlIHN0YXJ0ZWQuCisgICAgLy8gTm90ZTogY2FsbGVkIGFmdGVyIEF1ZGlvU2Vzc2lvbjo6Y2hhbmdlQWN0aXZlQ291bnQoMSkKKyAgICBzdGF0dXNfdCBzdGFydCgpOworICAgIC8vIENhbGxlZCBhZnRlciBhIHN0cmVhbSBpcyBzdG9wcGVkCisgICAgLy8gTm90ZTogY2FsbGVkIGFmdGVyIEF1ZGlvU2Vzc2lvbjo6Y2hhbmdlQWN0aXZlQ291bnQoLTEpCisgICAgdm9pZCBzdG9wKCk7CisgICAgdm9pZCBjbG9zZSgpOworCiBwcml2YXRlOgogICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICAgICAgICAgIG1QYXRjaEhhbmRsZTsKICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICAgICAgICAgICBtSWQ7CkBAIC04NSw2ICs5OSw3IEBACiAgICAgLy8gYSBwYXJ0aWN1bGFyIGlucHV0IHN0YXJ0ZWQgYW5kIHByZXZlbnQgcHJlZW1wdGlvbiBvZiB0aGlzIGFjdGl2ZSBpbnB1dCBieSB0aGlzIHNlc3Npb24uCiAgICAgLy8gV2UgYWxzbyBpbmhlcml0IHNlc3Npb25zIGZyb20gdGhlIHByZWVtcHRlZCBpbnB1dCB0byBhdm9pZCBhIDMgd2F5IHByZWVtcHRpb24gbG9vcCBldGMuLi4KICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9fc2Vzc2lvbl90PiBtUHJlZW1wdGVkU2Vzc2lvbnM7CisgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKm1DbGllbnRJbnRlcmZhY2U7CiB9OwogCiBjbGFzcyBBdWRpb0lucHV0Q29sbGVjdGlvbiA6CkBAIC0xMTIsNCArMTI3LDQgQEAKIH07CiAKIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb091dHB1dERlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb091dHB1dERlc2NyaXB0b3IuaAppbmRleCBjMDljYjVhLi41ZTVkMzhiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5oCkBAIC0xMDEsOCArMTAxLDYgQEAKIAogICAgIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKTsKIAotICAgIHZvaWQgc2V0SW9IYW5kbGUoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpOwotCiAgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKCkgY29uc3Q7CiAgICAgdmlydHVhbCBib29sIHNoYXJlc0h3TW9kdWxlV2l0aChjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjKTsKICAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBzdXBwb3J0ZWREZXZpY2VzKCk7CkBAIC0xMjIsNiArMTIwLDIzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZyA9IE5VTEwpIGNvbnN0OwogICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3Q7CiAKKyAgICAgICAgICAgIHN0YXR1c190IG9wZW4oY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0KTsKKyAgICAgICAgICAgIC8vIENhbGxlZCB3aGVuIGEgc3RyZWFtIGlzIGFib3V0IHRvIGJlIHN0YXJ0ZWQKKyAgICAgICAgICAgIC8vIE5vdGU6IGNhbGxlZCBiZWZvcmUgY2hhbmdlUmVmQ291bnQoMSk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGFydCgpOworICAgICAgICAgICAgLy8gQ2FsbGVkIGFmdGVyIGEgc3RyZWFtIGlzIHN0b3BwZWQuCisgICAgICAgICAgICAvLyBOb3RlOiBjYWxsZWQgYWZ0ZXIgY2hhbmdlUmVmQ291bnQoLTEpOworICAgICAgICAgICAgdm9pZCBzdG9wKCk7CisgICAgICAgICAgICB2b2lkIGNsb3NlKCk7CisgICAgICAgICAgICBzdGF0dXNfdCBvcGVuRHVwbGljYXRpbmcoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW9IYW5kbGUpOworCiAgICAgY29uc3Qgc3A8SU9Qcm9maWxlPiBtUHJvZmlsZTsgICAgICAgICAgLy8gSS9PIHByb2ZpbGUgdGhpcyBvdXRwdXQgZGVyaXZlcyBmcm9tCiAgICAgYXVkaW9faW9faGFuZGxlX3QgbUlvSGFuZGxlOyAgICAgICAgICAgLy8gb3V0cHV0IGhhbmRsZQogICAgIHVpbnQzMl90IG1MYXRlbmN5OyAgICAgICAgICAgICAgICAgIC8vCkBAIC0xNzUsMTAgKzE5MCwyOSBAQAogICAgIGJvb2wgaXNTdHJlYW1BY3RpdmVSZW1vdGVseShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKIAogICAgIC8qKgorICAgICAqIHJldHVybiB3aGV0aGVyIGEgc3RyZWFtIGlzIHBsYXlpbmcsIGJ1dCBub3Qgb24gYSAicmVtb3RlIiBkZXZpY2UuCisgICAgICogT3ZlcnJpZGUgdG8gY2hhbmdlIHRoZSBkZWZpbml0aW9uIG9mIGEgbG9jYWwvcmVtb3RlIHBsYXliYWNrLgorICAgICAqIFVzZWQgZm9yIGluc3RhbmNlIGJ5IHBvbGljeSBtYW5hZ2VyIHRvIGFsdGVyIHRoZSBzcGVha2VyIHBsYXliYWNrICgic3BlYWtlciBzYWZlIiBiZWhhdmlvcikKKyAgICAgKiB3aGVuIG1lZGlhIHBsYXlzIG9yIG5vdCBsb2NhbGx5LgorICAgICAqIEZvciB0aGUgYmFzZSBpbXBsZW1lbnRhdGlvbiwgInJlbW90ZWx5IiBtZWFucyBwbGF5aW5nIGR1cmluZyBzY3JlZW4gbWlycm9yaW5nLgorICAgICAqLworICAgIGJvb2wgaXNTdHJlYW1BY3RpdmVMb2NhbGx5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OworCisgICAgLyoqCiAgICAgICogcmV0dXJucyB0aGUgQTJEUCBvdXRwdXQgaGFuZGxlIGlmIGl0IGlzIG9wZW4gb3IgMCBvdGhlcndpc2UKICAgICAgKi8KICAgICBhdWRpb19pb19oYW5kbGVfdCBnZXRBMmRwT3V0cHV0KCkgY29uc3Q7CiAKKyAgICAvKioKKyAgICAgKiByZXR1cm5zIHRydWUgaWYgcHJpbWFyeSBIQUwgc3VwcG9ydHMgQTJEUCBPZmZsb2FkCisgICAgICovCisgICAgYm9vbCBpc0EyZHBPZmZsb2FkZWRPblByaW1hcnkoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIHJldHVybnMgdHJ1ZSBpZiBBMkRQIGlzIHN1cHBvcnRlZCAoZWl0aGVyIHZpYSBoYXJkd2FyZSBvZmZsb2FkIG9yIHNvZnR3YXJlIGVuY29kaW5nKQorICAgICAqLworICAgIGJvb2wgaXNBMmRwU3VwcG9ydGVkKCkgY29uc3Q7CisKICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZ2V0T3V0cHV0RnJvbUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgaWQpIGNvbnN0OwogCiAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGdldFByaW1hcnlPdXRwdXQoKSBjb25zdDsKQEAgLTIwOCw0ICsyNDIsNCBAQAogfTsKIAogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUGF0Y2guaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BhdGNoLmgKaW5kZXggMzg1ZjI1Ny4uYzFjM2YzYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUGF0Y2guaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9QYXRjaC5oCkBAIC0xNiw2ICsxNiw3IEBACiAKICNwcmFnbWEgb25jZQogCisjaW5jbHVkZSAiSGFuZGxlR2VuZXJhdG9yLmgiCiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgpAQCAtMjQsNyArMjUsNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIEF1ZGlvUGF0Y2ggOiBwdWJsaWMgUmVmQmFzZQorY2xhc3MgQXVkaW9QYXRjaCA6IHB1YmxpYyBSZWZCYXNlLCBwcml2YXRlIEhhbmRsZUdlbmVyYXRvcjxhdWRpb19wYXRjaF9oYW5kbGVfdD4KIHsKIHB1YmxpYzoKICAgICBBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsIHVpZF90IHVpZCk7CkBAIC0zNSw5ICszNiw2IEBACiAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIG1QYXRjaDsKICAgICB1aWRfdCBtVWlkOwogICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1BZlBhdGNoSGFuZGxlOwotCi1wcml2YXRlOgotICAgIHN0YXRpYyB2b2xhdGlsZSBpbnQzMl90IG1OZXh0VW5pcXVlSWQ7CiB9OwogCiBjbGFzcyBBdWRpb1BhdGNoQ29sbGVjdGlvbiA6IHB1YmxpYyBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9fcGF0Y2hfaGFuZGxlX3QsIHNwPEF1ZGlvUGF0Y2g+ID4KQEAgLTUyLDQgKzUwLDQgQEAKICAgICBzdGF0dXNfdCBkdW1wKGludCBmZCkgY29uc3Q7CiB9OwogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9saWN5Q29uZmlnLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lDb25maWcuaAppbmRleCBmMjc1NmI1Li40M2Y2ZWQ2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lDb25maWcuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lDb25maWcuaApAQCAtMzksMTQgKzM5LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVPdXRwdXREZXZpY2VzLAogICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciAmYXZhaWxhYmxlSW5wdXREZXZpY2VzLAogICAgICAgICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+ICZkZWZhdWx0T3V0cHV0RGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICBib29sICZpc1NwZWFrZXJEcmNFbmFibGVkLAogICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZUN1cnZlc0NvbGxlY3Rpb24gKnZvbHVtZXMgPSBudWxscHRyKQogICAgICAgICA6IG1Id01vZHVsZXMoaHdNb2R1bGVzKSwKICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyhhdmFpbGFibGVPdXRwdXREZXZpY2VzKSwKICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzKGF2YWlsYWJsZUlucHV0RGV2aWNlcyksCiAgICAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2VzKGRlZmF1bHRPdXRwdXREZXZpY2VzKSwKICAgICAgICAgICBtVm9sdW1lQ3VydmVzKHZvbHVtZXMpLAotICAgICAgICAgIG1Jc1NwZWFrZXJEcmNFbmFibGVkKGlzU3BlYWtlckRyY0VuYWJsZWQpCisgICAgICAgICAgbUlzU3BlYWtlckRyY0VuYWJsZWQoZmFsc2UpCiAgICAge30KIAogICAgIHZvaWQgc2V0Vm9sdW1lcyhjb25zdCBWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uICZ2b2x1bWVzKQpAQCAtODAsNiArNzksOCBAQAogICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5hZGQoYXZhaWxhYmxlT3V0cHV0RGV2aWNlcyk7CiAgICAgfQogCisgICAgYm9vbCBpc1NwZWFrZXJEcmNFbmFibGVkKCkgY29uc3QgeyByZXR1cm4gbUlzU3BlYWtlckRyY0VuYWJsZWQ7IH0KKwogICAgIHZvaWQgc2V0U3BlYWtlckRyY0VuYWJsZWQoYm9vbCBpc1NwZWFrZXJEcmNFbmFibGVkKQogICAgIHsKICAgICAgICAgbUlzU3BlYWtlckRyY0VuYWJsZWQgPSBpc1NwZWFrZXJEcmNFbmFibGVkOwpAQCAtMTEyLDcgKzExMyw3IEBACiAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmFkZChtRGVmYXVsdE91dHB1dERldmljZXMpOwogICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmFkZChkZWZhdWx0SW5wdXREZXZpY2UpOwogCi0gICAgICAgIG1vZHVsZSA9IG5ldyBId01vZHVsZSgicHJpbWFyeSIpOworICAgICAgICBtb2R1bGUgPSBuZXcgSHdNb2R1bGUoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1BSSU1BUlkpOwogCiAgICAgICAgIHNwPE91dHB1dFByb2ZpbGU+IG91dFByb2ZpbGU7CiAgICAgICAgIG91dFByb2ZpbGUgPSBuZXcgT3V0cHV0UHJvZmlsZShTdHJpbmc4KCJwcmltYXJ5IikpOwpAQCAtMTIxLDcgKzEyMiw3IEBACiAgICAgICAgICAgICAgICAgbmV3IEF1ZGlvUHJvZmlsZShBVURJT19GT1JNQVRfUENNXzE2X0JJVCwgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLCA0NDEwMCkpOwogICAgICAgICBvdXRQcm9maWxlLT5hZGRTdXBwb3J0ZWREZXZpY2UobURlZmF1bHRPdXRwdXREZXZpY2VzKTsKICAgICAgICAgb3V0UHJvZmlsZS0+c2V0RmxhZ3MoQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSk7Ci0gICAgICAgIG1vZHVsZS0+bU91dHB1dFByb2ZpbGVzLmFkZChvdXRQcm9maWxlKTsKKyAgICAgICAgbW9kdWxlLT5hZGRPdXRwdXRQcm9maWxlKG91dFByb2ZpbGUpOwogCiAgICAgICAgIHNwPElucHV0UHJvZmlsZT4gaW5Qcm9maWxlOwogICAgICAgICBpblByb2ZpbGUgPSBuZXcgSW5wdXRQcm9maWxlKFN0cmluZzgoInByaW1hcnkiKSk7CkBAIC0xMjksNyArMTMwLDcgQEAKICAgICAgICAgaW5Qcm9maWxlLT5hZGRBdWRpb1Byb2ZpbGUoCiAgICAgICAgICAgICAgICAgbmV3IEF1ZGlvUHJvZmlsZShBVURJT19GT1JNQVRfUENNXzE2X0JJVCwgQVVESU9fQ0hBTk5FTF9JTl9NT05PLCA4MDAwKSk7CiAgICAgICAgIGluUHJvZmlsZS0+YWRkU3VwcG9ydGVkRGV2aWNlKGRlZmF1bHRJbnB1dERldmljZSk7Ci0gICAgICAgIG1vZHVsZS0+bUlucHV0UHJvZmlsZXMuYWRkKGluUHJvZmlsZSk7CisgICAgICAgIG1vZHVsZS0+YWRkSW5wdXRQcm9maWxlKGluUHJvZmlsZSk7CiAKICAgICAgICAgbUh3TW9kdWxlcy5hZGQobW9kdWxlKTsKICAgICB9CkBAIC0xNDAsNyArMTQxLDEwIEBACiAgICAgRGV2aWNlVmVjdG9yICZtQXZhaWxhYmxlSW5wdXREZXZpY2VzOwogICAgIHNwPERldmljZURlc2NyaXB0b3I+ICZtRGVmYXVsdE91dHB1dERldmljZXM7CiAgICAgVm9sdW1lQ3VydmVzQ29sbGVjdGlvbiAqbVZvbHVtZUN1cnZlczsKLSAgICBib29sICZtSXNTcGVha2VyRHJjRW5hYmxlZDsKKyAgICAvLyBUT0RPOiByZW1vdmUgd2hlbiBsZWdhY3kgY29uZiBmaWxlIGlzIHJlbW92ZWQuIHRydWUgb24gZGV2aWNlcyB0aGF0IHVzZSBEUkMgb24gdGhlCisgICAgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIgcGF0aCB0byBib29zdCBzb2Z0IHNvdW5kcywgdXNlZCB0byBhZGp1c3Qgdm9sdW1lIGN1cnZlcyBhY2NvcmRpbmdseS4KKyAgICAvLyBOb3RlOiByZW1vdmUgYWxzbyBzcGVha2VyX2RyY19lbmFibGVkIGZyb20gZ2xvYmFsIGNvbmZpZ3VyYXRpb24gb2YgWE1MIGNvbmZpZyBmaWxlLgorICAgIGJvb2wgbUlzU3BlYWtlckRyY0VuYWJsZWQ7CiB9OwogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9saWN5TWl4LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lNaXguaAppbmRleCAwYmFjZWY3Li44ZmM2ZmU5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lNaXguaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lNaXguaApAQCAtODMsNCArODMsNCBAQAogICAgIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdDsKIH07CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb3J0LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb3J0LmgKaW5kZXggNGY3OWVkMi4uMDlhODZkZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9ydC5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvcnQuaApAQCAtMTgsNiArMTgsNyBAQAogCiAjaW5jbHVkZSAiQXVkaW9Db2xsZWN0aW9ucy5oIgogI2luY2x1ZGUgIkF1ZGlvUHJvZmlsZS5oIgorI2luY2x1ZGUgIkhhbmRsZUdlbmVyYXRvci5oIgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CkBAIC0zMiw3ICszMyw3IEBACiBjbGFzcyBBdWRpb1JvdXRlOwogdHlwZWRlZiBWZWN0b3I8c3A8QXVkaW9HYWluPiA+IEF1ZGlvR2FpbkNvbGxlY3Rpb247CiAKLWNsYXNzIEF1ZGlvUG9ydCA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UKK2NsYXNzIEF1ZGlvUG9ydCA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UsIHByaXZhdGUgSGFuZGxlR2VuZXJhdG9yPGF1ZGlvX3BvcnRfaGFuZGxlX3Q+CiB7CiBwdWJsaWM6CiAgICAgQXVkaW9Qb3J0KGNvbnN0IFN0cmluZzgmIG5hbWUsIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsICBhdWRpb19wb3J0X3JvbGVfdCByb2xlKSA6CkBAIC01MSw3ICs1Miw3IEBACiAgICAgdm9pZCBzZXRHYWlucyhjb25zdCBBdWRpb0dhaW5Db2xsZWN0aW9uICZnYWlucykgeyBtR2FpbnMgPSBnYWluczsgfQogICAgIGNvbnN0IEF1ZGlvR2FpbkNvbGxlY3Rpb24gJmdldEdhaW5zKCkgY29uc3QgeyByZXR1cm4gbUdhaW5zOyB9CiAKLSAgICB2b2lkIHNldEZsYWdzKHVpbnQzMl90IGZsYWdzKQorICAgIHZpcnR1YWwgdm9pZCBzZXRGbGFncyh1aW50MzJfdCBmbGFncykKICAgICB7CiAgICAgICAgIC8vZm9yY2UgZGlyZWN0IGZsYWcgaWYgb2ZmbG9hZCBmbGFnIGlzIHNldDogb2ZmbG9hZGluZyBpbXBsaWVzIGEgZGlyZWN0IG91dHB1dCBzdHJlYW0KICAgICAgICAgLy8gYW5kIGFsbCBjb21tb24gYmVoYXZpb3JzIGFyZSBkcml2ZW4gYnkgY2hlY2tpbmcgb25seSB0aGUgZGlyZWN0IGZsYWcKQEAgLTgzLDEyICs4NCw3IEBACiAgICAgYm9vbCBoYXNEeW5hbWljQXVkaW9Qcm9maWxlKCkgY29uc3QgeyByZXR1cm4gbVByb2ZpbGVzLmhhc0R5bmFtaWNQcm9maWxlKCk7IH0KIAogICAgIC8vIHNlYXJjaGVzIGZvciBhbiBleGFjdCBtYXRjaAotICAgIHN0YXR1c190IGNoZWNrRXhhY3RBdWRpb1Byb2ZpbGUodWludDMyX3Qgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbVByb2ZpbGVzLmNoZWNrRXhhY3RQcm9maWxlKHNhbXBsaW5nUmF0ZSwgY2hhbm5lbE1hc2ssIGZvcm1hdCk7Ci0gICAgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgY2hlY2tFeGFjdEF1ZGlvUHJvZmlsZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgY29uc3Q7CiAKICAgICAvLyBzZWFyY2hlcyBmb3IgYSBjb21wYXRpYmxlIG1hdGNoLCBjdXJyZW50bHkgaW1wbGVtZW50ZWQgZm9yIGlucHV0CiAgICAgLy8gcGFyYW1ldGVycyBhcmUgaW5wdXR8b3V0cHV0LCByZXR1cm5lZCB2YWx1ZSBpcyB0aGUgYmVzdCBtYXRjaC4KQEAgLTE1Miw3ICsxNDgsNiBAQAogICAgIHVpbnQzMl90IG1GbGFnczsgLy8gYXR0cmlidXRlIGZsYWdzIG1hc2sgKGUuZyBwcmltYXJ5IG91dHB1dCwgZGlyZWN0IG91dHB1dC4uLikuCiAgICAgQXVkaW9Qcm9maWxlVmVjdG9yIG1Qcm9maWxlczsgLy8gQXVkaW9Qcm9maWxlcyBzdXBwb3J0ZWQgYnkgdGhpcyBwb3J0IChmb3JtYXQsIFJhdGVzLCBDaGFubmVscykKICAgICBBdWRpb1JvdXRlVmVjdG9yIG1Sb3V0ZXM7IC8vIFJvdXRlcyBpbnZvbHZpbmcgdGhpcyBwb3J0Ci0gICAgc3RhdGljIHZvbGF0aWxlIGludDMyX3QgbU5leHRVbmlxdWVJZDsKIH07CiAKIGNsYXNzIEF1ZGlvUG9ydENvbmZpZyA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UKQEAgLTE3Niw0ICsxNzEsNCBAQAogICAgIHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyBtR2FpbjsKIH07CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qcm9maWxlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qcm9maWxlLmgKaW5kZXggNDA0ZTI3ZC4uODc0MWM2NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUHJvZmlsZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Byb2ZpbGUuaApAQCAtMzQ5LDQgKzM0OSw0IEBACiAKIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IEF1ZGlvUHJvZmlsZSAmbGVmdCwgY29uc3QgQXVkaW9Qcm9maWxlICZyaWdodCk7CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Sb3V0ZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUm91dGUuaAppbmRleCBkZjU0ZjQ4Li42YjI0ZmRlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Sb3V0ZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1JvdXRlLmgKQEAgLTU1LDQgKzU1LDQgQEAKIAogfTsKIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Nlc3Npb24uaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Nlc3Npb24uaAppbmRleCBjZWRmMjJkLi5kZDUyNDdkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9TZXNzaW9uLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU2Vzc2lvbi5oCkBAIC01NSw2ICs1NSw4IEBACiAgICAgdm9pZCBzZXRVaWQodWlkX3QgdWlkKSB7IG1SZWNvcmRDbGllbnRJbmZvLnVpZCA9IHVpZDsgfQogICAgIGJvb2wgbWF0Y2hlcyhjb25zdCBzcDxBdWRpb1Nlc3Npb24+ICZvdGhlcikgY29uc3Q7CiAgICAgYm9vbCBpc1NvdW5kVHJpZ2dlcigpIGNvbnN0IHsgcmV0dXJuIG1Jc1NvdW5kVHJpZ2dlcjsgfQorICAgIHZvaWQgc2V0U2lsZW5jZWQoYm9vbCBzaWxlbmNlZCkgeyBtU2lsZW5jZWQgPSBzaWxlbmNlZDsgfQorICAgIGJvb2wgaXNTaWxlbmNlZCgpIGNvbnN0IHsgcmV0dXJuIG1TaWxlbmNlZDsgfQogICAgIHVpbnQzMl90IG9wZW5Db3VudCgpIGNvbnN0IHsgcmV0dXJuIG1PcGVuQ291bnQ7IH0gOwogICAgIHVpbnQzMl90IGFjdGl2ZUNvdW50KCkgY29uc3QgeyByZXR1cm4gbUFjdGl2ZUNvdW50OyB9IDsKIApAQCAtNzAsNiArNzIsNyBAQAogICAgIGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWdfYmFzZSBtQ29uZmlnOwogICAgIGNvbnN0IGF1ZGlvX2lucHV0X2ZsYWdzX3QgbUZsYWdzOwogICAgIGJvb2wgIG1Jc1NvdW5kVHJpZ2dlcjsKKyAgICBib29sIG1TaWxlbmNlZDsKICAgICB1aW50MzJfdCAgbU9wZW5Db3VudDsKICAgICB1aW50MzJfdCAgbUFjdGl2ZUNvdW50OwogICAgIEF1ZGlvTWl4KiBtUG9saWN5TWl4OyAvLyBub24gTlVMTCB3aGVuIHVzZWQgYnkgYSBkeW5hbWljIHBvbGljeQpAQCAtMTAyLDQgKzEwNSw0IEBACiAgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGludCBzcGFjZXMpIGNvbnN0OwogfTsKIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1NvdXJjZURlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1NvdXJjZURlc2NyaXB0b3IuaAppbmRleCA3ZTFlMjRkLi4wZDkwZjQyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Tb3VyY2VEZXNjcmlwdG9yLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU291cmNlRGVzY3JpcHRvci5oCkBAIC01Niw0ICs1Niw0IEBACiAgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpIGNvbnN0OwogfTsKIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Db25maWdQYXJzaW5nVXRpbHMuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Db25maWdQYXJzaW5nVXRpbHMuaAppbmRleCBlZTk1Y2ViLi5hMDA3ODU0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQ29uZmlnUGFyc2luZ1V0aWxzLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0NvbmZpZ1BhcnNpbmdVdGlscy5oCkBAIC01Niw0ICs1Niw0IEBACiAgICAgc3RhdGljIHN0YXR1c190IGxvYWRId01vZHVsZShjbm9kZSAqcm9vdCwgc3A8SHdNb2R1bGU+ICZtb2R1bGUsIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcpOwogfTsKIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9EZXZpY2VEZXNjcmlwdG9yLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRGV2aWNlRGVzY3JpcHRvci5oCmluZGV4IDFhNjQ0ZDcuLjkyYTRjM2UgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9EZXZpY2VEZXNjcmlwdG9yLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0RldmljZURlc2NyaXB0b3IuaApAQCAtOTEsNCArOTEsNCBAQAogICAgIGF1ZGlvX2RldmljZXNfdCBtRGV2aWNlVHlwZXM7CiB9OwogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0VmZmVjdERlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9FZmZlY3REZXNjcmlwdG9yLmgKaW5kZXggOWVhMGFlYS4uMDQ4MzFjNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0VmZmVjdERlc2NyaXB0b3IuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRWZmZWN0RGVzY3JpcHRvci5oCkBAIC02OSw0ICs2OSw0IEBACiAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IE1BWF9FRkZFQ1RTX01FTU9SWSA9IDUxMjsKIH07CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvR2FpbnMuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9HYWlucy5oCmluZGV4IDM0YWZjOGMuLmNiMjI5YTQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9HYWlucy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9HYWlucy5oCkBAIC01Miw4ICs1Miw5IEBACiAgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0xpbmVhclZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzU2lsZW50Vm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOwogICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNGdWxsU2NhbGVWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07CisgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0hlYXJpbmdBaWRWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07CiAgICAgLy8gZGVmYXVsdCB2b2x1bWUgY3VydmVzIHBlciBzdHJlYW0gYW5kIGRldmljZSBjYXRlZ29yeS4gU2VlIGluaXRpYWxpemVWb2x1bWVDdXJ2ZXMoKQogICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpzVm9sdW1lUHJvZmlsZXNbQVVESU9fU1RSRUFNX0NOVF1bREVWSUNFX0NBVEVHT1JZX0NOVF07CiB9OwogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0hhbmRsZUdlbmVyYXRvci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0hhbmRsZUdlbmVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczN2EyZTAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSGFuZGxlR2VuZXJhdG9yLmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPGxpbWl0cz4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgSGFuZGxlR2VuZXJhdG9yIHsKKyAgcHJvdGVjdGVkOgorICAgIHN0YXRpYyBUIGdldE5leHRIYW5kbGUoKTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitUIEhhbmRsZUdlbmVyYXRvcjxUPjo6Z2V0TmV4dEhhbmRsZSgpIHsKKyAgICBzdGF0aWMgc3RkOjphdG9taWM8dWludDMyX3Q+IG1OZXh0VW5pcXVlSWQoMSk7CisgICAgdWludDMyX3QgaWQgPSBtTmV4dFVuaXF1ZUlkKys7CisgICAgd2hpbGUgKGlkID4gc3RkOjpudW1lcmljX2xpbWl0czxUPjo6bWF4KCkpIHsKKyAgICAgICAgaWQgLT0gc3RkOjpudW1lcmljX2xpbWl0czxUPjo6bWF4KCk7CisgICAgfQorICAgIHJldHVybiBzdGF0aWNfY2FzdDxUPihpZCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSHdNb2R1bGUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Id01vZHVsZS5oCmluZGV4IDI5YjZiOWMuLmNiOWY0OWUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Id01vZHVsZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Id01vZHVsZS5oCkBAIC00NCwxMiArNDQsMTAgQEAKIAogICAgIGNvbnN0IGNoYXIgKmdldE5hbWUoKSBjb25zdCB7IHJldHVybiBtTmFtZS5zdHJpbmcoKTsgfQogCi0KICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmdldERlY2xhcmVkRGV2aWNlcygpIGNvbnN0IHsgcmV0dXJuIG1EZWNsYXJlZERldmljZXM7IH0KICAgICB2b2lkIHNldERlY2xhcmVkRGV2aWNlcyhjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpOwogCiAgICAgY29uc3QgSW5wdXRQcm9maWxlQ29sbGVjdGlvbiAmZ2V0SW5wdXRQcm9maWxlcygpIGNvbnN0IHsgcmV0dXJuIG1JbnB1dFByb2ZpbGVzOyB9Ci0KICAgICBjb25zdCBPdXRwdXRQcm9maWxlQ29sbGVjdGlvbiAmZ2V0T3V0cHV0UHJvZmlsZXMoKSBjb25zdCB7IHJldHVybiBtT3V0cHV0UHJvZmlsZXM7IH0KIAogICAgIHZvaWQgc2V0UHJvZmlsZXMoY29uc3QgSU9Qcm9maWxlQ29sbGVjdGlvbiAmcHJvZmlsZXMpOwpAQCAtNzYsNiArNzQsNyBAQAogICAgIHN0YXR1c190IHJlbW92ZUlucHV0UHJvZmlsZShjb25zdCBTdHJpbmc4JiBuYW1lKTsKIAogICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBnZXRIYW5kbGUoKSBjb25zdCB7IHJldHVybiBtSGFuZGxlOyB9CisgICAgdm9pZCBzZXRIYW5kbGUoYXVkaW9fbW9kdWxlX2hhbmRsZV90IGhhbmRsZSk7CiAKICAgICBzcDxBdWRpb1BvcnQ+IGZpbmRQb3J0QnlUYWdOYW1lKGNvbnN0IFN0cmluZzggJnRhZ05hbWUpIGNvbnN0CiAgICAgewpAQCAtODUsMTQgKzg0LDEzIEBACiAgICAgLy8gVE9ETyByZW1vdmUgZnJvbSBoZXJlIChzcGxpdCBzZXJpYWxpemF0aW9uKQogICAgIHZvaWQgZHVtcChpbnQgZmQpOwogCitwcml2YXRlOgorICAgIHZvaWQgcmVmcmVzaFN1cHBvcnRlZERldmljZXMoKTsKKwogICAgIGNvbnN0IFN0cmluZzggbU5hbWU7IC8vIGJhc2UgbmFtZSBvZiB0aGUgYXVkaW8gSFcgbW9kdWxlIChwcmltYXJ5LCBhMmRwIC4uLikKICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbUhhbmRsZTsKICAgICBPdXRwdXRQcm9maWxlQ29sbGVjdGlvbiBtT3V0cHV0UHJvZmlsZXM7IC8vIG91dHB1dCBwcm9maWxlcyBleHBvc2VkIGJ5IHRoaXMgbW9kdWxlCiAgICAgSW5wdXRQcm9maWxlQ29sbGVjdGlvbiBtSW5wdXRQcm9maWxlczsgIC8vIGlucHV0IHByb2ZpbGVzIGV4cG9zZWQgYnkgdGhpcyBtb2R1bGUKLQotcHJpdmF0ZToKLSAgICB2b2lkIHJlZnJlc2hTdXBwb3J0ZWREZXZpY2VzKCk7Ci0KICAgICB1aW50MzJfdCBtSGFsVmVyc2lvbjsgLy8gYXVkaW8gSEFMIEFQSSB2ZXJzaW9uCiAgICAgRGV2aWNlVmVjdG9yIG1EZWNsYXJlZERldmljZXM7IC8vIGRldmljZXMgZGVjbGFyZWQgaW4gYXVkaW9fcG9saWN5IGNvbmZpZ3VyYXRpb24gZmlsZS4KICAgICBBdWRpb1JvdXRlVmVjdG9yIG1Sb3V0ZXM7CkBAIC0xMTQsNCArMTEyLDQgQEAKICAgICBzdGF0dXNfdCBkdW1wKGludCBmZCkgY29uc3Q7CiB9OwogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0lPUHJvZmlsZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0lPUHJvZmlsZS5oCmluZGV4IGVjMDRlZjcuLjY3YWM5YmMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JT1Byb2ZpbGUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSU9Qcm9maWxlLmgKQEAgLTM0LDExICszNCwyOSBAQAogewogcHVibGljOgogICAgIElPUHJvZmlsZShjb25zdCBTdHJpbmc4ICZuYW1lLCBhdWRpb19wb3J0X3JvbGVfdCByb2xlKQotICAgICAgICA6IEF1ZGlvUG9ydChuYW1lLCBBVURJT19QT1JUX1RZUEVfTUlYLCByb2xlKSB7fQorICAgICAgICA6IEF1ZGlvUG9ydChuYW1lLCBBVURJT19QT1JUX1RZUEVfTUlYLCByb2xlKSwKKyAgICAgICAgICBtYXhPcGVuQ291bnQoKHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSkgPyAxIDogMCksCisgICAgICAgICAgY3VyT3BlbkNvdW50KDApLAorICAgICAgICAgIG1heEFjdGl2ZUNvdW50KDEpLAorICAgICAgICAgIGN1ckFjdGl2ZUNvdW50KDApIHt9CiAKICAgICAvLyBGb3IgYSBQcm9maWxlIGFrYSBNaXhQb3J0LCB0YWcgbmFtZSBhbmQgbmFtZSBhcmUgZXF1aXZhbGVudC4KICAgICB2aXJ0dWFsIGNvbnN0IFN0cmluZzggZ2V0VGFnTmFtZSgpIGNvbnN0IHsgcmV0dXJuIGdldE5hbWUoKTsgfQogCisgICAgLy8gRklYTUU6IHRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugc2hhcmVkIE1NQVAgc3RyZWFtIGNsaWVudHMgdXNlIHRoZSBzYW1lIGF1ZGlvIHNlc3Npb24uCisgICAgLy8gT25jZSBjYXB0dXJlIGNsaWVudHMgYXJlIHRyYWNrZWQgaW5kaXZpZHVhbGx5IGFuZCBub3QgcGVyIHNlc3Npb24gdGhpcyBjYW4gYmUgcmVtb3ZlZAorICAgIC8vIE1NQVAgbm8gSVJRIGlucHV0IHN0cmVhbXMgZG8gbm90IGhhdmUgdGhlIGRlZmF1bHQgbGltaXRhdGlvbiBvZiBvbmUgYWN0aXZlIGNsaWVudAorICAgIC8vIG1heCBhcyB0aGV5IGNhbiBiZSB1c2VkIGluIHNoYXJlZCBtb2RlIGJ5IHRoZSBzYW1lIGFwcGxpY2F0aW9uLgorICAgIC8vIE5PVEU6IHRoaXMgd29ya3MgZm9yIGV4cGxpY2l0IHZhbHVlcyBzZXQgaW4gYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIGJlY2F1c2UKKyAgICAvLyBmbGFncyBhcmUgcGFyc2VkIGJlZm9yZSBtYXhBY3RpdmVDb3VudCBieSB0aGUgc2VyaWFsaXplci4KKyAgICB2b2lkIHNldEZsYWdzKHVpbnQzMl90IGZsYWdzKSBvdmVycmlkZQorICAgIHsKKyAgICAgICAgQXVkaW9Qb3J0OjpzZXRGbGFncyhmbGFncyk7CisgICAgICAgIGlmIChnZXRSb2xlKCkgPT0gQVVESU9fUE9SVF9ST0xFX1NJTksgJiYgKGZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19NTUFQX05PSVJRKSAhPSAwKSB7CisgICAgICAgICAgICBtYXhBY3RpdmVDb3VudCA9IDA7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvLyBUaGlzIG1ldGhvZCBpcyB1c2VkIGZvciBpbnB1dCBhbmQgZGlyZWN0IG91dHB1dCwgYW5kIGlzIG5vdCB1c2VkIGZvciBvdGhlciBvdXRwdXQuCiAgICAgLy8gSWYgcGFyYW1ldGVyIHVwZGF0ZWRTYW1wbGluZ1JhdGUgaXMgbm9uLU5VTEwsIGl0IGlzIGFzc2lnbmVkIHRoZSBhY3R1YWwgc2FtcGxlIHJhdGUuCiAgICAgLy8gRm9yIGlucHV0LCBmbGFncyBpcyBpbnRlcnByZXRlZCBhcyBhdWRpb19pbnB1dF9mbGFnc190LgpAQCAtNTEsNyArNjksOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqdXBkYXRlZEZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICp1cGRhdGVkQ2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKSBjb25zdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgcGFyYW1ldGVyIHR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZXhhY3RNYXRjaFJlcXVpcmVkRm9ySW5wdXRGbGFncyA9IGZhbHNlKSBjb25zdDsKIAogICAgIHZvaWQgZHVtcChpbnQgZmQpOwogICAgIHZvaWQgbG9nKCk7CkBAIC0xMDMsNiArMTIzLDM0IEBACiAKICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmdldFN1cHBvcnRlZERldmljZXMoKSBjb25zdCB7IHJldHVybiBtU3VwcG9ydGVkRGV2aWNlczsgfQogCisgICAgYm9vbCBjYW5PcGVuTmV3SW8oKSB7CisgICAgICAgIGlmIChtYXhPcGVuQ291bnQgPT0gMCB8fCBjdXJPcGVuQ291bnQgPCBtYXhPcGVuQ291bnQpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIGNhblN0YXJ0TmV3SW8oKSB7CisgICAgICAgIGlmIChtYXhBY3RpdmVDb3VudCA9PSAwIHx8IGN1ckFjdGl2ZUNvdW50IDwgbWF4QWN0aXZlQ291bnQpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBNYXhpbXVtIG51bWJlciBvZiBpbnB1dCBvciBvdXRwdXQgc3RyZWFtcyB0aGF0IGNhbiBiZSBzaW11bHRhbmVvdXNseSBvcGVuZWQgZm9yIHRoaXMgcHJvZmlsZS4KKyAgICAvLyBCeSBjb252ZW50aW9uIDAgbWVhbnMgbm8gbGltaXQuIFRvIHJlc3BlY3QgbGVnYWN5IGJlaGF2aW9yLCBpbml0aWFsaXplZCB0byAxIGZvciBvdXRwdXQKKyAgICAvLyBwcm9maWxlcyBhbmQgMCBmb3IgaW5wdXQgcHJvZmlsZXMKKyAgICB1aW50MzJfdCAgICAgbWF4T3BlbkNvdW50OworICAgIC8vIE51bWJlciBvZiBzdHJlYW1zIGN1cnJlbnRseSBvcGVuZWQgZm9yIHRoaXMgcHJvZmlsZS4KKyAgICB1aW50MzJfdCAgICAgY3VyT3BlbkNvdW50OworICAgIC8vIE1heGltdW0gbnVtYmVyIG9mIGlucHV0IG9yIG91dHB1dCBzdHJlYW1zIHRoYXQgY2FuIGJlIHNpbXVsdGFuZW91c2x5IGFjdGl2ZSBmb3IgdGhpcyBwcm9maWxlLgorICAgIC8vIEJ5IGNvbnZlbnRpb24gMCBtZWFucyBubyBsaW1pdC4gVG8gcmVzcGVjdCBsZWdhY3kgYmVoYXZpb3IsIGluaXRpYWxpemVkIHRvIDAgZm9yIG91dHB1dAorICAgIC8vIHByb2ZpbGVzIGFuZCAxIGZvciBpbnB1dCBwcm9maWxlcworICAgIHVpbnQzMl90ICAgICBtYXhBY3RpdmVDb3VudDsKKyAgICAvLyBOdW1iZXIgb2Ygc3RyZWFtcyBjdXJyZW50bHkgYWN0aXZlIGZvciB0aGlzIHByb2ZpbGUuIFRoaXMgaXMgbm90IHRoZSBudW1iZXIgb2YgYWN0aXZlIGNsaWVudHMKKyAgICAvLyAoQXVkaW9UcmFjayBvciBBdWRpb1JlY29yZCkgYnV0IHRoZSBudW1iZXIgb2YgYWN0aXZlIEhBTCBzdHJlYW1zLgorICAgIHVpbnQzMl90ICAgICBjdXJBY3RpdmVDb3VudDsKKwogcHJpdmF0ZToKICAgICBEZXZpY2VWZWN0b3IgbVN1cHBvcnRlZERldmljZXM7IC8vIHN1cHBvcnRlZCBkZXZpY2VzOiB0aGlzIGlucHV0L291dHB1dCBjYW4gYmUgcm91dGVkIGZyb20vdG8KIH07CkBAIC0xMTksNCArMTY3LDQgQEAKICAgICBleHBsaWNpdCBPdXRwdXRQcm9maWxlKGNvbnN0IFN0cmluZzggJm5hbWUpIDogSU9Qcm9maWxlKG5hbWUsIEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpIHt9CiB9OwogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0lWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSVZvbHVtZUN1cnZlc0NvbGxlY3Rpb24uaAppbmRleCBhM2RlNjg2Li5lMWY2YjA4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSVZvbHVtZUN1cnZlc0NvbGxlY3Rpb24uaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSVZvbHVtZUN1cnZlc0NvbGxlY3Rpb24uaApAQCAtMjUsNiArMjUsOCBAQAogY2xhc3MgSVZvbHVtZUN1cnZlc0NvbGxlY3Rpb24KIHsKIHB1YmxpYzoKKyAgICB2aXJ0dWFsIH5JVm9sdW1lQ3VydmVzQ29sbGVjdGlvbigpID0gZGVmYXVsdDsKKwogICAgIHZpcnR1YWwgdm9pZCBjbGVhckN1cnJlbnRWb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgPSAwOwogICAgIHZpcnR1YWwgdm9pZCBhZGRDdXJyZW50Vm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpID0gMDsKQEAgLTQ2LDkgKzQ4LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCkgY29uc3QgPSAwOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+SVZvbHVtZUN1cnZlc0NvbGxlY3Rpb24oKSB7fQogfTsKIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TZXJpYWxpemVyLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU2VyaWFsaXplci5oCmluZGV4IDA3OGI1ODIuLjI5ZGU4NDggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TZXJpYWxpemVyLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1NlcmlhbGl6ZXIuaApAQCAtOTIsNiArOTIsOCBAQAogICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBuYW1lW107CiAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHJvbGVbXTsKICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgZmxhZ3NbXTsKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgbWF4T3BlbkNvdW50W107CisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIG1heEFjdGl2ZUNvdW50W107CiAgICAgfTsKIAogICAgIHR5cGVkZWYgSU9Qcm9maWxlIEVsZW1lbnQ7CkBAIC0yMzQsNCArMjM2LDQgQEAKICAgICAvLyBDaGlsZHJlbiBhcmU6IE1vZHVsZXNUcmFpdHMsIFZvbHVtZVRyYWl0cwogfTsKIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TZXNzaW9uUm91dGUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TZXNzaW9uUm91dGUuaAppbmRleCA3NWJmZDlkLi4zMmI0NDQwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU2Vzc2lvblJvdXRlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1Nlc3Npb25Sb3V0ZS5oCkBAIC0yNCw2ICsyNCw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIERldmljZURlc2NyaXB0b3I7CitjbGFzcyBEZXZpY2VWZWN0b3I7CiAKIGNsYXNzIFNlc3Npb25Sb3V0ZSA6IHB1YmxpYyBSZWZCYXNlCiB7CkBAIC01NCw3ICs1NSw3IEBACiAKICAgICB2b2lkIGxvZyhjb25zdCBjaGFyKiBwcmVmaXgpOwogCi0gICAgYm9vbCBpc0FjdGl2ZSgpIHsKKyAgICBib29sIGlzQWN0aXZlT3JDaGFuZ2VkKCkgewogICAgICAgICByZXR1cm4gKG1EZXZpY2VEZXNjcmlwdG9yICE9IDApICYmIChtQ2hhbmdlZCB8fCAobUFjdGl2aXR5Q291bnQgPiAwKSk7CiAgICAgfQogCkBAIC05Niw5ICs5NywxMCBAQAogCiAgICAgaW50IGluY1JvdXRlQWN0aXZpdHkoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwogICAgIGludCBkZWNSb3V0ZUFjdGl2aXR5KGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLSAgICBib29sIGhhc1JvdXRlQ2hhbmdlZChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7IC8vIGFsc28gY2xlYXJzIHRoZSBjaGFuZ2VkIGZsYWcKKyAgICBib29sIGdldEFuZENsZWFyUm91dGVDaGFuZ2VkKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsgLy8gYWxzbyBjbGVhcnMgdGhlIGNoYW5nZWQgZmxhZwogICAgIHZvaWQgbG9nKGNvbnN0IGNoYXIqIGNhcHRpb24pOwotCisgICAgYXVkaW9fZGV2aWNlc190IGdldEFjdGl2ZURldmljZUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGF2YWlsYWJsZURldmljZXMpOwogICAgIC8vIFNwZWNpZnkgYW4gT3V0cHV0KFNpbmspIHJvdXRlIGJ5IHBhc3NpbmcgU2Vzc2lvblJvdXRlOjpTT1VSQ0VfVFlQRV9OQSBpbiB0aGUKICAgICAvLyBzb3VyY2UgYXJndW1lbnQuCiAgICAgLy8gU3BlY2lmeSBhbiBJbnB1dChTb3VyY2UpIHJvdXQgYnkgcGFzc2luZyBTZXNzaW9uUm91dGU6OkFVRElPX1NUUkVBTV9ERUZBVUxUCkBAIC0xMTUsNCArMTE3LDQgQEAKICAgICBjb25zdCBzZXNzaW9uX3JvdXRlX21hcF90eXBlX3QgbU1hcFR5cGU7CiB9OwogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1NvdW5kVHJpZ2dlclNlc3Npb24uaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Tb3VuZFRyaWdnZXJTZXNzaW9uLmgKaW5kZXggNDIwZTZkNy4uZjg5NTU5OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1NvdW5kVHJpZ2dlclNlc3Npb24uaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU291bmRUcmlnZ2VyU2Vzc2lvbi5oCkBAIC0zMCw0ICszMCw0IEBACiAgICAgc3RhdHVzX3QgYWNxdWlyZVNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKTsKIH07CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU3RyZWFtRGVzY3JpcHRvci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1N0cmVhbURlc2NyaXB0b3IuaAppbmRleCA4ODIyOTI3Li41MGIxMDM3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU3RyZWFtRGVzY3JpcHRvci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TdHJlYW1EZXNjcmlwdG9yLmgKQEAgLTEwNyw0ICsxMDcsNCBAQAogICAgIHZvaWQgc2V0Vm9sdW1lSW5kZXhNYXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0saW50IHZvbEluZGV4TWF4KTsKIH07CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvVHlwZUNvbnZlcnRlci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1R5cGVDb252ZXJ0ZXIuaAppbmRleCBmYzk1ZWI5Li42M2MxOWQxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvVHlwZUNvbnZlcnRlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9UeXBlQ29udmVydGVyLmgKQEAgLTU4LDQgKzU4LDQgQEAKIHRlbXBsYXRlIDw+CiBjb25zdCBSdWxlVHlwZUNvbnZlcnRlcjo6VGFibGUgUnVsZVR5cGVDb252ZXJ0ZXI6Om1UYWJsZVtdOwogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1ZvbHVtZUN1cnZlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvVm9sdW1lQ3VydmUuaAppbmRleCBlN2ZjZWZjLi4zZTZiMmI0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvVm9sdW1lQ3VydmUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvVm9sdW1lQ3VydmUuaApAQCAtMTM1LDcgKzEzNSwxMyBAQAogCiAgICAgZmxvYXQgdm9sSW5kZXhUb0RiKGRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXQsIGludCBpbmRleEluVWkpIGNvbnN0CiAgICAgewotICAgICAgICByZXR1cm4gZ2V0Q3VydmVzRm9yKGRldmljZUNhdCktPnZvbEluZGV4VG9EYihpbmRleEluVWksIG1JbmRleE1pbiwgbUluZGV4TWF4KTsKKyAgICAgICAgc3A8Vm9sdW1lQ3VydmU+IHZjID0gZ2V0Q3VydmVzRm9yKGRldmljZUNhdCk7CisgICAgICAgIGlmICh2YyAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gdmMtPnZvbEluZGV4VG9EYihpbmRleEluVWksIG1JbmRleE1pbiwgbUluZGV4TWF4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGRldmljZSBjYXRlZ29yeSAlZCBmb3IgVm9sdW1lIEN1cnZlIiwgZGV2aWNlQ2F0KTsKKyAgICAgICAgICAgIHJldHVybiAwLjBmOworICAgICAgICB9CiAgICAgfQogCiAgICAgdm9pZCBkdW1wKGludCBmZCwgaW50IHNwYWNlcywgYm9vbCBjdXJ2ZVBvaW50cyA9IGZhbHNlKSBjb25zdDsKQEAgLTIzMCw0ICsyMzYsNCBAQAogICAgIH0KIH07CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0NvbGxlY3Rpb25zLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvQ29sbGVjdGlvbnMuY3BwCmluZGV4IDYzNWZlNGQuLmNhNjdiODcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvQ29sbGVjdGlvbnMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvQ29sbGVjdGlvbnMuY3BwCkBAIC0yNywxNCArMjcsMTIgQEAKIAogc3A8QXVkaW9Qb3J0PiBBdWRpb1BvcnRWZWN0b3I6OmZpbmRCeVRhZ05hbWUoY29uc3QgU3RyaW5nOCAmdGFnTmFtZSkgY29uc3QKIHsKLSAgICBzcDxBdWRpb1BvcnQ+IHBvcnQgPSAwOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKGl0ZW1BdChpKS0+Z2V0VGFnTmFtZSgpID09IHRhZ05hbWUpIHsKLSAgICAgICAgICAgIHBvcnQgPSBpdGVtQXQoaSk7Ci0gICAgICAgICAgICBicmVhazsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHBvcnQgOiAqdGhpcykgeworICAgICAgICBpZiAocG9ydC0+Z2V0VGFnTmFtZSgpID09IHRhZ05hbWUpIHsKKyAgICAgICAgICAgIHJldHVybiBwb3J0OwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBwb3J0OworICAgIHJldHVybiBudWxscHRyOwogfQogCiBzdGF0dXNfdCBBdWRpb1JvdXRlVmVjdG9yOjpkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3QKQEAgLTU1LDQgKzUzLDQgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0dhaW4uY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9HYWluLmNwcAppbmRleCBlNDU0OTQxLi4xOTNkNGE2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0dhaW4uY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvR2Fpbi5jcHAKQEAgLTEyNiw0ICsxMjYsNCBAQAogICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogfQogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9JbnB1dERlc2NyaXB0b3IuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9JbnB1dERlc2NyaXB0b3IuY3BwCmluZGV4IDI0OTJlZDYuLjkyMzMyZmIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0lucHV0RGVzY3JpcHRvci5jcHAKQEAgLTE3LDYgKzE3LDcgQEAKICNkZWZpbmUgTE9HX1RBRyAiQVBNOjpBdWRpb0lucHV0RGVzY3JpcHRvciIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAorI2luY2x1ZGUgPEF1ZGlvUG9saWN5SW50ZXJmYWNlLmg+CiAjaW5jbHVkZSAiQXVkaW9JbnB1dERlc2NyaXB0b3IuaCIKICNpbmNsdWRlICJJT1Byb2ZpbGUuaCIKICNpbmNsdWRlICJBdWRpb0dhaW4uaCIKQEAgLTI2LDEwICsyNywxMiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLUF1ZGlvSW5wdXREZXNjcmlwdG9yOjpBdWRpb0lucHV0RGVzY3JpcHRvcihjb25zdCBzcDxJT1Byb2ZpbGU+JiBwcm9maWxlKQorQXVkaW9JbnB1dERlc2NyaXB0b3I6OkF1ZGlvSW5wdXREZXNjcmlwdG9yKGNvbnN0IHNwPElPUHJvZmlsZT4mIHByb2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSkKICAgICA6IG1Jb0hhbmRsZSgwKSwKICAgICAgIG1EZXZpY2UoQVVESU9fREVWSUNFX05PTkUpLCBtUG9saWN5TWl4KE5VTEwpLAotICAgICAgbVByb2ZpbGUocHJvZmlsZSksIG1QYXRjaEhhbmRsZShBVURJT19QQVRDSF9IQU5ETEVfTk9ORSksIG1JZCgwKQorICAgICAgbVByb2ZpbGUocHJvZmlsZSksIG1QYXRjaEhhbmRsZShBVURJT19QQVRDSF9IQU5ETEVfTk9ORSksIG1JZCgwKSwKKyAgICAgIG1DbGllbnRJbnRlcmZhY2UoY2xpZW50SW50ZXJmYWNlKQogewogICAgIGlmIChwcm9maWxlICE9IE5VTEwpIHsKICAgICAgICAgcHJvZmlsZS0+cGlja0F1ZGlvUHJvZmlsZShtU2FtcGxpbmdSYXRlLCBtQ2hhbm5lbE1hc2ssIG1Gb3JtYXQpOwpAQCAtMzksMTIgKzQyLDYgQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9JbnB1dERlc2NyaXB0b3I6OnNldElvSGFuZGxlKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKQotewotICAgIG1JZCA9IEF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCk7Ci0gICAgbUlvSGFuZGxlID0gaW9IYW5kbGU7Ci19Ci0KIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Z2V0TW9kdWxlSGFuZGxlKCkgY29uc3QKIHsKICAgICBpZiAobVByb2ZpbGUgPT0gMCkgewpAQCAtMTkyLDYgKzE4OSw5MyBAQAogICAgIHJldHVybiBjb25maWc7CiB9CiAKK3N0YXR1c190IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpvcGVuKGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQpCit7CisgICAgYXVkaW9fY29uZmlnX3QgbENvbmZpZzsKKyAgICBpZiAoY29uZmlnID09IG51bGxwdHIpIHsKKyAgICAgICAgbENvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKKyAgICAgICAgbENvbmZpZy5zYW1wbGVfcmF0ZSA9IG1TYW1wbGluZ1JhdGU7CisgICAgICAgIGxDb25maWcuY2hhbm5lbF9tYXNrID0gbUNoYW5uZWxNYXNrOworICAgICAgICBsQ29uZmlnLmZvcm1hdCA9IG1Gb3JtYXQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbENvbmZpZyA9ICpjb25maWc7CisgICAgfQorCisgICAgbURldmljZSA9IGRldmljZTsKKworICAgIEFMT0dWKCJvcGVuaW5nIGlucHV0IGZvciBkZXZpY2UgJTA4eCBhZGRyZXNzICVzIHByb2ZpbGUgJXAgbmFtZSAlcyIsCisgICAgICAgICAgbURldmljZSwgYWRkcmVzcy5zdHJpbmcoKSwgbVByb2ZpbGUuZ2V0KCksIG1Qcm9maWxlLT5nZXROYW1lKCkuc3RyaW5nKCkpOworCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUNsaWVudEludGVyZmFjZS0+b3BlbklucHV0KG1Qcm9maWxlLT5nZXRNb2R1bGVIYW5kbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtRGV2aWNlICE9IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlcyBvcGVuSW5wdXQgcmV0dXJuZWQgZGV2aWNlICUwOHggd2hlbiBnaXZlbiBkZXZpY2UgJTA4eCIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1EZXZpY2UsIGRldmljZSk7CisKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKmlucHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyBvcGVuSW5wdXQgcmV0dXJuZWQgaW5wdXQgaGFuZGxlICVkIGZvciBkZXZpY2UgJTA4eCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAqaW5wdXQsIGRldmljZSk7CisgICAgICAgIG1TYW1wbGluZ1JhdGUgPSBsQ29uZmlnLnNhbXBsZV9yYXRlOworICAgICAgICBtQ2hhbm5lbE1hc2sgPSBsQ29uZmlnLmNoYW5uZWxfbWFzazsKKyAgICAgICAgbUZvcm1hdCA9IGxDb25maWcuZm9ybWF0OworICAgICAgICBtSWQgPSBBdWRpb1BvcnQ6OmdldE5leHRVbmlxdWVJZCgpOworICAgICAgICBtSW9IYW5kbGUgPSAqaW5wdXQ7CisgICAgICAgIG1Qcm9maWxlLT5jdXJPcGVuQ291bnQrKzsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6c3RhcnQoKQoreworICAgIGlmIChnZXRBdWRpb1Nlc3Npb25Db3VudCh0cnVlLyphY3RpdmVPbmx5Ki8pID09IDEpIHsKKyAgICAgICAgaWYgKCFtUHJvZmlsZS0+Y2FuU3RhcnROZXdJbygpKSB7CisgICAgICAgICAgICBBTE9HSSgiJXMgbVByb2ZpbGUtPmN1ckFjdGl2ZUNvdW50ICVkIiwgX19mdW5jX18sIG1Qcm9maWxlLT5jdXJBY3RpdmVDb3VudCk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgbVByb2ZpbGUtPmN1ckFjdGl2ZUNvdW50Kys7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6c3RvcCgpCit7CisgICAgaWYgKCFpc0FjdGl2ZSgpKSB7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobVByb2ZpbGUtPmN1ckFjdGl2ZUNvdW50IDwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgaW52YWxpZCBwcm9maWxlIGFjdGl2ZSBjb3VudCAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qcm9maWxlLT5jdXJBY3RpdmVDb3VudCk7CisgICAgICAgIG1Qcm9maWxlLT5jdXJBY3RpdmVDb3VudC0tOworICAgIH0KK30KKwordm9pZCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Y2xvc2UoKQoreworICAgIGlmIChtSW9IYW5kbGUgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgbUNsaWVudEludGVyZmFjZS0+Y2xvc2VJbnB1dChtSW9IYW5kbGUpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1Qcm9maWxlLT5jdXJPcGVuQ291bnQgPCAxLCAiJXMgcHJvZmlsZSBvcGVuIGNvdW50ICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm9maWxlLT5jdXJPcGVuQ291bnQpOworICAgICAgICAvLyBkbyBub3QgY2FsbCBzdG9wKCkgaGVyZSBhcyBzdG9wKCkgaXMgc3VwcG9zZWQgdG8gYmUgY2FsbGVkIGFmdGVyCisgICAgICAgIC8vIEF1ZGlvU2Vzc2lvbjo6Y2hhbmdlQWN0aXZlQ291bnQoLTEpIGFuZCB3ZSBkb24ndCBrbm93IGhvdyBtYW55IHNlc3Npb25zCisgICAgICAgIC8vIGFyZSBzdGlsbCBhY3RpdmUgYXQgdGhpcyB0aW1lCisgICAgICAgIGlmIChpc0FjdGl2ZSgpKSB7CisgICAgICAgICAgICBtUHJvZmlsZS0+Y3VyQWN0aXZlQ291bnQtLTsKKyAgICAgICAgfQorICAgICAgICBtUHJvZmlsZS0+Y3VyT3BlbkNvdW50LS07CisgICAgICAgIG1Jb0hhbmRsZSA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgIH0KK30KKwogc3RhdHVzX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmR1bXAoaW50IGZkKQogewogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5jcHAKaW5kZXggODU5MzQ0NC4uMjk0YTJhNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb091dHB1dERlc2NyaXB0b3IuY3BwCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSAiQXVkaW9HYWluLmgiCiAjaW5jbHVkZSAiVm9sdW1lLmgiCiAjaW5jbHVkZSAiSHdNb2R1bGUuaCIKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5Lmg+CiAKIC8vIEEgZGV2aWNlIG1hc2sgZm9yIGFsbCBhdWRpbyBvdXRwdXQgZGV2aWNlcyB0aGF0IGFyZSBjb25zaWRlcmVkICJyZW1vdGUiIHdoZW4gZXZhbHVhdGluZwpAQCAtNDYsMTcgKzQ3LDE3IEBACiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fU1RSQVRFR0lFUzsgaSsrKSB7CiAgICAgICAgIG1TdHJhdGVneU11dGVkQnlEZXZpY2VbaV0gPSBmYWxzZTsKICAgICB9Ci0gICAgaWYgKHBvcnQgIT0gTlVMTCkgewotICAgICAgICBwb3J0LT5waWNrQXVkaW9Qcm9maWxlKG1TYW1wbGluZ1JhdGUsIG1DaGFubmVsTWFzaywgbUZvcm1hdCk7Ci0gICAgICAgIGlmIChwb3J0LT5tR2FpbnMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgcG9ydC0+bUdhaW5zWzBdLT5nZXREZWZhdWx0Q29uZmlnKCZtR2Fpbik7CisgICAgaWYgKG1Qb3J0LmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgbVBvcnQtPnBpY2tBdWRpb1Byb2ZpbGUobVNhbXBsaW5nUmF0ZSwgbUNoYW5uZWxNYXNrLCBtRm9ybWF0KTsKKyAgICAgICAgaWYgKG1Qb3J0LT5tR2FpbnMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgbVBvcnQtPm1HYWluc1swXS0+Z2V0RGVmYXVsdENvbmZpZygmbUdhaW4pOwogICAgICAgICB9CiAgICAgfQogfQogCiBhdWRpb19tb2R1bGVfaGFuZGxlX3QgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpnZXRNb2R1bGVIYW5kbGUoKSBjb25zdAogewotICAgIHJldHVybiBtUG9ydC0+Z2V0TW9kdWxlSGFuZGxlKCk7CisgICAgcmV0dXJuIG1Qb3J0LmdldCgpICE9IG51bGxwdHIgPyBtUG9ydC0+Z2V0TW9kdWxlSGFuZGxlKCkgOiBBVURJT19NT0RVTEVfSEFORExFX05PTkU7CiB9CiAKIGF1ZGlvX3BvcnRfaGFuZGxlX3QgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpnZXRJZCgpIGNvbnN0CkBAIC0xNzUsOSArMTc2LDkgQEAKICAgICBkc3RDb25maWctPmV4dC5taXgudXNlY2FzZS5zdHJlYW0gPSBBVURJT19TVFJFQU1fREVGQVVMVDsKIH0KIAotdm9pZCBBdWRpb091dHB1dERlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdAordm9pZCBBdWRpb091dHB1dERlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdAogeworICAgIC8vIFNob3VsZCBub3QgYmUgY2FsbGVkIGZvciBkdXBsaWNhdGVkIHBvcnRzLCBzZWUgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0Q29uZmlnLgogICAgIG1Qb3J0LT50b0F1ZGlvUG9ydChwb3J0KTsKICAgICBwb3J0LT5pZCA9IG1JZDsKICAgICBwb3J0LT5leHQubWl4Lmh3X21vZHVsZSA9IGdldE1vZHVsZUhhbmRsZSgpOwpAQCAtMjIxLDcgKzIyMiw3IEBACiBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6U3dBdWRpb091dHB1dERlc2NyaXB0b3IoY29uc3Qgc3A8SU9Qcm9maWxlPiYgcHJvZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKQogICAgIDogQXVkaW9PdXRwdXREZXNjcmlwdG9yKHByb2ZpbGUsIGNsaWVudEludGVyZmFjZSksCi0gICAgbVByb2ZpbGUocHJvZmlsZSksIG1Jb0hhbmRsZSgwKSwgbUxhdGVuY3koMCksCisgICAgbVByb2ZpbGUocHJvZmlsZSksIG1Jb0hhbmRsZShBVURJT19JT19IQU5ETEVfTk9ORSksIG1MYXRlbmN5KDApLAogICAgIG1GbGFncygoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpMCksIG1Qb2xpY3lNaXgoTlVMTCksCiAgICAgbU91dHB1dDEoMCksIG1PdXRwdXQyKDApLCBtRGlyZWN0T3BlbkNvdW50KDApLAogICAgIG1EaXJlY3RDbGllbnRTZXNzaW9uKEFVRElPX1NFU1NJT05fTk9ORSksIG1HbG9iYWxSZWZDb3VudCgwKQpAQCAtMjMxLDEzICsyMzIsNiBAQAogICAgIH0KIH0KIAotdm9pZCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0SW9IYW5kbGUoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpCi17Ci0gICAgbUlkID0gQXVkaW9Qb3J0OjpnZXROZXh0VW5pcXVlSWQoKTsKLSAgICBtSW9IYW5kbGUgPSBpb0hhbmRsZTsKLX0KLQotCiBzdGF0dXNfdCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQpCiB7CiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CkBAIC0zMzksNiArMzMzLDEwIEBACiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KKyAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYKSB7CisgICAgICAgIEFMT0dWKCJtYXggZ2FpbiB3aGVuIG91dHB1dCBkZXZpY2UgaXMgdGVsZXBob255IHR4Iik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KICAgICByZXR1cm4gZmFsc2U7CiB9CiAKQEAgLTM4Nyw2ICszODUsMTU0IEBACiAgICAgcmV0dXJuIGNoYW5nZWQ7CiB9CiAKK3N0YXR1c190IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpvcGVuKGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0KQoreworICAgIGF1ZGlvX2NvbmZpZ190IGxDb25maWc7CisgICAgaWYgKGNvbmZpZyA9PSBudWxscHRyKSB7CisgICAgICAgIGxDb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgICAgIGxDb25maWcuc2FtcGxlX3JhdGUgPSBtU2FtcGxpbmdSYXRlOworICAgICAgICBsQ29uZmlnLmNoYW5uZWxfbWFzayA9IG1DaGFubmVsTWFzazsKKyAgICAgICAgbENvbmZpZy5mb3JtYXQgPSBtRm9ybWF0OworICAgIH0gZWxzZSB7CisgICAgICAgIGxDb25maWcgPSAqY29uZmlnOworICAgIH0KKworICAgIG1EZXZpY2UgPSBkZXZpY2U7CisgICAgLy8gaWYgdGhlIHNlbGVjdGVkIHByb2ZpbGUgaXMgb2ZmbG9hZGVkIGFuZCBubyBvZmZsb2FkIGluZm8gd2FzIHNwZWNpZmllZCwKKyAgICAvLyBjcmVhdGUgYSBkZWZhdWx0IG9uZQorICAgIGlmICgobVByb2ZpbGUtPmdldEZsYWdzKCkgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSAmJgorICAgICAgICAgICAgbENvbmZpZy5vZmZsb2FkX2luZm8uZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CisgICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KShmbGFncyB8IEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpOworICAgICAgICBsQ29uZmlnLm9mZmxvYWRfaW5mbyA9IEFVRElPX0lORk9fSU5JVElBTElaRVI7CisgICAgICAgIGxDb25maWcub2ZmbG9hZF9pbmZvLnNhbXBsZV9yYXRlID0gbENvbmZpZy5zYW1wbGVfcmF0ZTsKKyAgICAgICAgbENvbmZpZy5vZmZsb2FkX2luZm8uY2hhbm5lbF9tYXNrID0gbENvbmZpZy5jaGFubmVsX21hc2s7CisgICAgICAgIGxDb25maWcub2ZmbG9hZF9pbmZvLmZvcm1hdCA9IGxDb25maWcuZm9ybWF0OworICAgICAgICBsQ29uZmlnLm9mZmxvYWRfaW5mby5zdHJlYW1fdHlwZSA9IHN0cmVhbTsKKyAgICAgICAgbENvbmZpZy5vZmZsb2FkX2luZm8uZHVyYXRpb25fdXMgPSAtMTsKKyAgICAgICAgbENvbmZpZy5vZmZsb2FkX2luZm8uaGFzX3ZpZGVvID0gdHJ1ZTsgLy8gY29uc2VydmF0aXZlCisgICAgICAgIGxDb25maWcub2ZmbG9hZF9pbmZvLmlzX3N0cmVhbWluZyA9IHRydWU7IC8vIGxpa2VseQorICAgIH0KKworICAgIG1GbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkobUZsYWdzIHwgZmxhZ3MpOworCisgICAgQUxPR1YoIm9wZW5pbmcgb3V0cHV0IGZvciBkZXZpY2UgJTA4eCBhZGRyZXNzICVzIHByb2ZpbGUgJXAgbmFtZSAlcyIsCisgICAgICAgICAgbURldmljZSwgYWRkcmVzcy5zdHJpbmcoKSwgbVByb2ZpbGUuZ2V0KCksIG1Qcm9maWxlLT5nZXROYW1lKCkuc3RyaW5nKCkpOworCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUNsaWVudEludGVyZmFjZS0+b3Blbk91dHB1dChtUHJvZmlsZS0+Z2V0TW9kdWxlSGFuZGxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtTGF0ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncyk7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtRGV2aWNlICE9IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlcyBvcGVuT3V0cHV0IHJldHVybmVkIGRldmljZSAlMDh4IHdoZW4gZ2l2ZW4gZGV2aWNlICUwOHgiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtRGV2aWNlLCBkZXZpY2UpOworCisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCpvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIG9wZW5PdXRwdXQgcmV0dXJuZWQgb3V0cHV0IGhhbmRsZSAlZCBmb3IgZGV2aWNlICUwOHgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgKm91dHB1dCwgZGV2aWNlKTsKKyAgICAgICAgbVNhbXBsaW5nUmF0ZSA9IGxDb25maWcuc2FtcGxlX3JhdGU7CisgICAgICAgIG1DaGFubmVsTWFzayA9IGxDb25maWcuY2hhbm5lbF9tYXNrOworICAgICAgICBtRm9ybWF0ID0gbENvbmZpZy5mb3JtYXQ7CisgICAgICAgIG1JZCA9IEF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCk7CisgICAgICAgIG1Jb0hhbmRsZSA9ICpvdXRwdXQ7CisgICAgICAgIG1Qcm9maWxlLT5jdXJPcGVuQ291bnQrKzsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c3RhcnQoKQoreworICAgIGlmIChpc0R1cGxpY2F0ZWQoKSkgeworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtT3V0cHV0MS0+c3RhcnQoKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBtT3V0cHV0Mi0+c3RhcnQoKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgbU91dHB1dDEtPnN0b3AoKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICBpZiAoIWlzQWN0aXZlKCkpIHsKKyAgICAgICAgaWYgKCFtUHJvZmlsZS0+Y2FuU3RhcnROZXdJbygpKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgbVByb2ZpbGUtPmN1ckFjdGl2ZUNvdW50Kys7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c3RvcCgpCit7CisgICAgaWYgKGlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgIG1PdXRwdXQxLT5zdG9wKCk7CisgICAgICAgIG1PdXRwdXQyLT5zdG9wKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIWlzQWN0aXZlKCkpIHsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtUHJvZmlsZS0+Y3VyQWN0aXZlQ291bnQgPCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyBpbnZhbGlkIHByb2ZpbGUgYWN0aXZlIGNvdW50ICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVByb2ZpbGUtPmN1ckFjdGl2ZUNvdW50KTsKKyAgICAgICAgbVByb2ZpbGUtPmN1ckFjdGl2ZUNvdW50LS07CisgICAgfQorfQorCit2b2lkIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpjbG9zZSgpCit7CisgICAgaWYgKG1Jb0hhbmRsZSAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbTsKKyAgICAgICAgcGFyYW0uYWRkKFN0cmluZzgoImNsb3NpbmciKSwgU3RyaW5nOCgidHJ1ZSIpKTsKKyAgICAgICAgbUNsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhtSW9IYW5kbGUsIHBhcmFtLnRvU3RyaW5nKCkpOworCisgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KG1Jb0hhbmRsZSk7CisKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtUHJvZmlsZS0+Y3VyT3BlbkNvdW50IDwgMSwgIiVzIHByb2ZpbGUgb3BlbiBjb3VudCAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvZmlsZS0+Y3VyT3BlbkNvdW50KTsKKyAgICAgICAgLy8gZG8gbm90IGNhbGwgc3RvcCgpIGhlcmUgYXMgc3RvcCgpIGlzIHN1cHBvc2VkIHRvIGJlIGNhbGxlZCBhZnRlciBjaGFuZ2VSZWZDb3VudCgtMSkKKyAgICAgICAgLy8gYW5kIHdlIGRvbid0IGtub3cgaG93IG1hbnkgc3RyZWFtcyBhcmUgc3RpbGwgYWN0aXZlIGF0IHRoaXMgdGltZQorICAgICAgICBpZiAoaXNBY3RpdmUoKSkgeworICAgICAgICAgICAgbVByb2ZpbGUtPmN1ckFjdGl2ZUNvdW50LS07CisgICAgICAgIH0KKyAgICAgICAgbVByb2ZpbGUtPmN1ck9wZW5Db3VudC0tOworICAgICAgICBtSW9IYW5kbGUgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICB9Cit9CisKK3N0YXR1c190IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpvcGVuRHVwbGljYXRpbmcoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppb0hhbmRsZSkKK3sKKyAgICAvLyBvcGVuIGEgZHVwbGljYXRpbmcgb3V0cHV0IHRocmVhZCBmb3IgdGhlIG5ldyBvdXRwdXQgYW5kIHRoZSBwcmltYXJ5IG91dHB1dAorICAgIC8vIE5vdGU6IG9wZW5EdXBsaWNhdGVPdXRwdXQoKSBBUEkgZXhwZWN0cyB0aGUgb3V0cHV0IGhhbmRsZXMgaW4gdGhlIHJldmVyc2Ugb3JkZXIgZnJvbSB0aGUKKyAgICAvLyBudW1iZXJpbmcgaW4gU3dBdWRpb091dHB1dERlc2NyaXB0b3IgbU91dHB1dDEgYW5kIG1PdXRwdXQyCisgICAgKmlvSGFuZGxlID0gbUNsaWVudEludGVyZmFjZS0+b3BlbkR1cGxpY2F0ZU91dHB1dChvdXRwdXQyLT5tSW9IYW5kbGUsIG91dHB1dDEtPm1Jb0hhbmRsZSk7CisgICAgaWYgKCppb0hhbmRsZSA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgbUlkID0gQXVkaW9Qb3J0OjpnZXROZXh0VW5pcXVlSWQoKTsKKyAgICBtSW9IYW5kbGUgPSAqaW9IYW5kbGU7CisgICAgbU91dHB1dDEgPSBvdXRwdXQxOworICAgIG1PdXRwdXQyID0gb3V0cHV0MjsKKyAgICBtU2FtcGxpbmdSYXRlID0gb3V0cHV0Mi0+bVNhbXBsaW5nUmF0ZTsKKyAgICBtRm9ybWF0ID0gb3V0cHV0Mi0+bUZvcm1hdDsKKyAgICBtQ2hhbm5lbE1hc2sgPSBvdXRwdXQyLT5tQ2hhbm5lbE1hc2s7CisgICAgbUxhdGVuY3kgPSBvdXRwdXQyLT5tTGF0ZW5jeTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwogLy8gSHdBdWRpb091dHB1dERlc2NyaXB0b3IgaW1wbGVtZW50YXRpb24KIEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcihjb25zdCBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+JiBzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSkKQEAgLTQ1Nyw2ICs2MDMsMTkgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKK2Jvb2wgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmlzU3RyZWFtQWN0aXZlTG9jYWxseShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0Cit7CisgICAgbnNlY3NfdCBzeXNUaW1lID0gc3lzdGVtVGltZSgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGhpcy0+c2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSB0aGlzLT52YWx1ZUF0KGkpOworICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNTdHJlYW1BY3RpdmUoc3RyZWFtLCBpblBhc3RNcywgc3lzVGltZSkKKyAgICAgICAgICAgICAgICAmJiAoKG91dHB1dERlc2MtPmRldmljZSgpICYgQVBNX0FVRElPX09VVF9ERVZJQ0VfUkVNT1RFX0FMTCkgPT0gMCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwogYm9vbCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6aXNTdHJlYW1BY3RpdmVSZW1vdGVseShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAogewpAQCAtNDg2LDYgKzY0NSwyOSBAQAogICAgIHJldHVybiAwOwogfQogCitib29sIFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc0EyZHBPZmZsb2FkZWRPblByaW1hcnkoKSBjb25zdAoreworICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBwcmltYXJ5T3V0cHV0ID0gZ2V0UHJpbWFyeU91dHB1dCgpOworCisgICAgaWYgKChwcmltYXJ5T3V0cHV0ICE9IE5VTEwpICYmIChwcmltYXJ5T3V0cHV0LT5tUHJvZmlsZSAhPSBOVUxMKQorICAgICAgICAmJiAocHJpbWFyeU91dHB1dC0+bVByb2ZpbGUtPm1Nb2R1bGUgIT0gTlVMTCkpIHsKKyAgICAgICAgc3A8SHdNb2R1bGU+IHByaW1hcnlId01vZHVsZSA9IHByaW1hcnlPdXRwdXQtPm1Qcm9maWxlLT5tTW9kdWxlOworICAgICAgICBWZWN0b3IgPHNwPElPUHJvZmlsZT4+IHByaW1hcnlId01vZHVsZU91dHB1dFByb2ZpbGVzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeUh3TW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHByaW1hcnlId01vZHVsZU91dHB1dFByb2ZpbGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAocHJpbWFyeUh3TW9kdWxlT3V0cHV0UHJvZmlsZXNbaV0tPnN1cHBvcnREZXZpY2UoQVVESU9fREVWSUNFX09VVF9BTExfQTJEUCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmlzQTJkcFN1cHBvcnRlZCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIChpc0EyZHBPZmZsb2FkZWRPblByaW1hcnkoKSB8fCAoZ2V0QTJkcE91dHB1dCgpICE9IDApKTsKK30KKwogc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjpnZXRQcmltYXJ5T3V0cHV0KCkgY29uc3QKIHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BhdGNoLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUGF0Y2guY3BwCmluZGV4IDMyNjA2ZWEuLmE5ZmU0OGQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUGF0Y2guY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUGF0Y2guY3BwCkBAIC0yMiwxNSArMjIsMTIgQEAKICNpbmNsdWRlICJUeXBlQ29udmVydGVyLmgiCiAKICNpbmNsdWRlIDxsb2cvbG9nLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1pbnQzMl90IHZvbGF0aWxlIEF1ZGlvUGF0Y2g6Om1OZXh0VW5pcXVlSWQgPSAxOwotCiBBdWRpb1BhdGNoOjpBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsIHVpZF90IHVpZCkgOgotICAgIG1IYW5kbGUoc3RhdGljX2Nhc3Q8YXVkaW9fcGF0Y2hfaGFuZGxlX3Q+KGFuZHJvaWRfYXRvbWljX2luYygmbU5leHRVbmlxdWVJZCkpKSwKKyAgICBtSGFuZGxlKEhhbmRsZUdlbmVyYXRvcjxhdWRpb19wYXRjaF9oYW5kbGVfdD46OmdldE5leHRIYW5kbGUoKSksCiAgICAgbVBhdGNoKCpwYXRjaCksCiAgICAgbVVpZCh1aWQpLAogICAgIG1BZlBhdGNoSGFuZGxlKEFVRElPX1BBVENIX0hBTkRMRV9OT05FKQpAQCAtMTc2LDQgKzE3Myw0IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qb3J0LmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9ydC5jcHAKaW5kZXggY2RhZmZlNy4uZDg1NTYyZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qb3J0LmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BvcnQuY3BwCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSAiSHdNb2R1bGUuaCIKICNpbmNsdWRlICJBdWRpb0dhaW4uaCIKICNpbmNsdWRlIDxwb2xpY3kuaD4KLSNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+CiAKICNpZm5kZWYgQVJSQVlfU0laRQogI2RlZmluZSBBUlJBWV9TSVpFKGEpIChzaXplb2YoYSkgLyBzaXplb2YoKGEpWzBdKSkKQEAgLTI5LDggKzI4LDYgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1pbnQzMl90IHZvbGF0aWxlIEF1ZGlvUG9ydDo6bU5leHRVbmlxdWVJZCA9IDE7Ci0KIC8vIC0tLSBBdWRpb1BvcnQgY2xhc3MgaW1wbGVtZW50YXRpb24KIHZvaWQgQXVkaW9Qb3J0OjphdHRhY2goY29uc3Qgc3A8SHdNb2R1bGU+JiBtb2R1bGUpCiB7CkBAIC00MCwzMSArMzcsMjIgQEAKIC8vIE5vdGUgdGhhdCBpcyBhIGRpZmZlcmVudCBuYW1lc3BhY2UgdGhhbiBBdWRpb0ZsaW5nZXIgdW5pcXVlIElEcwogYXVkaW9fcG9ydF9oYW5kbGVfdCBBdWRpb1BvcnQ6OmdldE5leHRVbmlxdWVJZCgpCiB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGF1ZGlvX3BvcnRfaGFuZGxlX3Q+KGFuZHJvaWRfYXRvbWljX2luYygmbU5leHRVbmlxdWVJZCkpOworICAgIHJldHVybiBnZXROZXh0SGFuZGxlKCk7CiB9CiAKIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBBdWRpb1BvcnQ6OmdldE1vZHVsZUhhbmRsZSgpIGNvbnN0CiB7Ci0gICAgaWYgKG1Nb2R1bGUgPT0gMCkgewotICAgICAgICByZXR1cm4gQVVESU9fTU9EVUxFX0hBTkRMRV9OT05FOwotICAgIH0KLSAgICByZXR1cm4gbU1vZHVsZS0+bUhhbmRsZTsKKyAgICByZXR1cm4gbU1vZHVsZSAhPSAwID8gbU1vZHVsZS0+Z2V0SGFuZGxlKCkgOiBBVURJT19NT0RVTEVfSEFORExFX05PTkU7CiB9CiAKIHVpbnQzMl90IEF1ZGlvUG9ydDo6Z2V0TW9kdWxlVmVyc2lvbk1ham9yKCkgY29uc3QKIHsKLSAgICBpZiAobU1vZHVsZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gbU1vZHVsZS0+Z2V0SGFsVmVyc2lvbk1ham9yKCk7CisgICAgcmV0dXJuIG1Nb2R1bGUgIT0gMCA/IG1Nb2R1bGUtPmdldEhhbFZlcnNpb25NYWpvcigpIDogMDsKIH0KIAogY29uc3QgY2hhciAqQXVkaW9Qb3J0OjpnZXRNb2R1bGVOYW1lKCkgY29uc3QKIHsKLSAgICBpZiAobU1vZHVsZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAiaW52YWxpZCBtb2R1bGUiOwotICAgIH0KLSAgICByZXR1cm4gbU1vZHVsZS0+Z2V0TmFtZSgpOworICAgIHJldHVybiBtTW9kdWxlICE9IDAgPyBtTW9kdWxlLT5nZXROYW1lKCkgOiAiaW52YWxpZCBtb2R1bGUiOwogfQogCiB2b2lkIEF1ZGlvUG9ydDo6dG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0CkBAIC03NCwxMSArNjIsMTEgQEAKICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9fZm9ybWF0X3Q+IGZsYXRlbmVkRm9ybWF0czsKICAgICBTYW1wbGVSYXRlVmVjdG9yIGZsYXRlbmVkUmF0ZXM7CiAgICAgQ2hhbm5lbHNWZWN0b3IgZmxhdGVuZWRDaGFubmVsczsKLSAgICBmb3IgKHNpemVfdCBwcm9maWxlSW5kZXggPSAwOyBwcm9maWxlSW5kZXggPCBtUHJvZmlsZXMuc2l6ZSgpOyBwcm9maWxlSW5kZXgrKykgewotICAgICAgICBpZiAobVByb2ZpbGVzW3Byb2ZpbGVJbmRleF0tPmlzVmFsaWQoKSkgewotICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0VG9FeHBvcnQgPSBtUHJvZmlsZXNbcHJvZmlsZUluZGV4XS0+Z2V0Rm9ybWF0KCk7Ci0gICAgICAgICAgICBjb25zdCBTYW1wbGVSYXRlVmVjdG9yICZyYXRlc1RvRXhwb3J0ID0gbVByb2ZpbGVzW3Byb2ZpbGVJbmRleF0tPmdldFNhbXBsZVJhdGVzKCk7Ci0gICAgICAgICAgICBjb25zdCBDaGFubmVsc1ZlY3RvciAmY2hhbm5lbHNUb0V4cG9ydCA9IG1Qcm9maWxlc1twcm9maWxlSW5kZXhdLT5nZXRDaGFubmVscygpOworICAgIGZvciAoY29uc3QgYXV0byYgcHJvZmlsZSA6IG1Qcm9maWxlcykgeworICAgICAgICBpZiAocHJvZmlsZS0+aXNWYWxpZCgpKSB7CisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXRUb0V4cG9ydCA9IHByb2ZpbGUtPmdldEZvcm1hdCgpOworICAgICAgICAgICAgY29uc3QgU2FtcGxlUmF0ZVZlY3RvciAmcmF0ZXNUb0V4cG9ydCA9IHByb2ZpbGUtPmdldFNhbXBsZVJhdGVzKCk7CisgICAgICAgICAgICBjb25zdCBDaGFubmVsc1ZlY3RvciAmY2hhbm5lbHNUb0V4cG9ydCA9IHByb2ZpbGUtPmdldENoYW5uZWxzKCk7CiAKICAgICAgICAgICAgIGlmIChmbGF0ZW5lZEZvcm1hdHMuaW5kZXhPZihmb3JtYXRUb0V4cG9ydCkgPCAwKSB7CiAgICAgICAgICAgICAgICAgZmxhdGVuZWRGb3JtYXRzLmFkZChmb3JtYXRUb0V4cG9ydCk7CkBAIC0xMzAsMTQgKzExOCwxMiBAQAogCiB2b2lkIEF1ZGlvUG9ydDo6aW1wb3J0QXVkaW9Qb3J0KGNvbnN0IHNwPEF1ZGlvUG9ydD4mIHBvcnQsIGJvb2wgZm9yY2UgX191bnVzZWQpCiB7Ci0gICAgc2l6ZV90IGluZGV4VG9JbXBvcnQ7Ci0gICAgZm9yIChpbmRleFRvSW1wb3J0ID0gMDsgaW5kZXhUb0ltcG9ydCA8IHBvcnQtPm1Qcm9maWxlcy5zaXplKCk7IGluZGV4VG9JbXBvcnQrKykgewotICAgICAgICBjb25zdCBzcDxBdWRpb1Byb2ZpbGU+ICZwcm9maWxlVG9JbXBvcnQgPSBwb3J0LT5tUHJvZmlsZXNbaW5kZXhUb0ltcG9ydF07CisgICAgZm9yIChjb25zdCBhdXRvJiBwcm9maWxlVG9JbXBvcnQgOiBwb3J0LT5tUHJvZmlsZXMpIHsKICAgICAgICAgaWYgKHByb2ZpbGVUb0ltcG9ydC0+aXNWYWxpZCgpKSB7CiAgICAgICAgICAgICAvLyBJbXBvcnQgb25seSB2YWxpZCBwb3J0LCBpLmUuIHZhbGlkIGZvcm1hdCwgbm9uIGVtcHR5IHJhdGVzIGFuZCBjaGFubmVscyBtYXNrcwogICAgICAgICAgICAgYm9vbCBoYXNTYW1lUHJvZmlsZSA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChzaXplX3QgcHJvZmlsZUluZGV4ID0gMDsgcHJvZmlsZUluZGV4IDwgbVByb2ZpbGVzLnNpemUoKTsgcHJvZmlsZUluZGV4KyspIHsKLSAgICAgICAgICAgICAgICBpZiAoKm1Qcm9maWxlc1twcm9maWxlSW5kZXhdID09ICpwcm9maWxlVG9JbXBvcnQpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgcHJvZmlsZSA6IG1Qcm9maWxlcykgeworICAgICAgICAgICAgICAgIGlmICgqcHJvZmlsZSA9PSAqcHJvZmlsZVRvSW1wb3J0KSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIG5ldmVyIGltcG9ydCBhIHByb2ZpbGUgdHdpY2UKICAgICAgICAgICAgICAgICAgICAgaGFzU2FtZVByb2ZpbGUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTE1MSw2ICsxMzcsMjYgQEAKICAgICB9CiB9CiAKK3N0YXR1c190IEF1ZGlvUG9ydDo6Y2hlY2tFeGFjdEF1ZGlvUHJvZmlsZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgY29uc3QKK3sKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICBhdXRvIGNvbmZpZ19tYXNrID0gY29uZmlnLT5jb25maWdfbWFzazsKKyAgICBpZiAoY29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19HQUlOKSB7CisgICAgICAgIGNvbmZpZ19tYXNrICY9IH5BVURJT19QT1JUX0NPTkZJR19HQUlOOworICAgICAgICBzdGF0dXMgPSBjaGVja0dhaW4oJmNvbmZpZy0+Z2FpbiwgY29uZmlnLT5nYWluLmluZGV4KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoY29uZmlnX21hc2sgIT0gMCkgeworICAgICAgICAvLyBUT0RPIHNob3VsZCB3ZSBjaGVjayBzYW1wbGVfcmF0ZSAvIGNoYW5uZWxfbWFzayAvIGZvcm1hdCBzZXBhcmF0ZWx5PworICAgICAgICBzdGF0dXMgPSBtUHJvZmlsZXMuY2hlY2tFeGFjdFByb2ZpbGUoY29uZmlnLT5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5mb3JtYXQpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCiB2b2lkIEF1ZGlvUG9ydDo6cGlja1NhbXBsaW5nUmF0ZSh1aW50MzJfdCAmcGlja2VkUmF0ZSxjb25zdCBTYW1wbGVSYXRlVmVjdG9yICZzYW1wbGluZ1JhdGVzKSBjb25zdAogewogICAgIHBpY2tlZFJhdGUgPSAwOwpAQCAtNDAzLDkgKzQwOSw3IEBACiAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9Ci0gICAgc3RhdHVzID0gYXVkaW9wb3J0LT5jaGVja0V4YWN0QXVkaW9Qcm9maWxlKGNvbmZpZy0+c2FtcGxlX3JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPmZvcm1hdCk7CisgICAgc3RhdHVzID0gYXVkaW9wb3J0LT5jaGVja0V4YWN0QXVkaW9Qcm9maWxlKGNvbmZpZyk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQpAQCAtNDE5LDEwICs0MjMsNiBAQAogICAgICAgICBtRm9ybWF0ID0gY29uZmlnLT5mb3JtYXQ7CiAgICAgfQogICAgIGlmIChjb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfR0FJTikgewotICAgICAgICBzdGF0dXMgPSBhdWRpb3BvcnQtPmNoZWNrR2FpbigmY29uZmlnLT5nYWluLCBjb25maWctPmdhaW4uaW5kZXgpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgICAgIH0KICAgICAgICAgbUdhaW4gPSBjb25maWctPmdhaW47CiAgICAgfQogCkBAIC00ODAsNCArNDgwLDQgQEAKICAgICB9CiB9CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1Byb2ZpbGUuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qcm9maWxlLmNwcAppbmRleCA5OGY3YTk0Li5mZDZmYzFjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1Byb2ZpbGUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUHJvZmlsZS5jcHAKQEAgLTIzMyw4ICsyMzMsNyBAQAogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQogCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBjb25zdCBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGUgPSBpdGVtQXQoaSk7CisgICAgZm9yIChjb25zdCBhdXRvJiBwcm9maWxlIDogKnRoaXMpIHsKICAgICAgICAgaWYgKHByb2ZpbGUtPmNoZWNrRXhhY3Qoc2FtcGxpbmdSYXRlLCBjaGFubmVsTWFzaywgZm9ybWF0KSA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CkBAIC0yODgsNCArMjg3LDQgQEAKICAgICByZXR1cm4gQXVkaW9Qb3J0Ojpjb21wYXJlRm9ybWF0cygoKnByb2ZpbGUxKS0+Z2V0Rm9ybWF0KCksICgqcHJvZmlsZTIpLT5nZXRGb3JtYXQoKSk7CiB9CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1Nlc3Npb24uY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9TZXNzaW9uLmNwcAppbmRleCA1YjU3ZDNkLi43Y2RhNDZiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1Nlc3Npb24uY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvU2Vzc2lvbi5jcHAKQEAgLTI5MCw0ICsyOTAsNCBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0NvbmZpZ1BhcnNpbmdVdGlscy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Db25maWdQYXJzaW5nVXRpbHMuY3BwCmluZGV4IGU1ODg4ZTIuLjFlMTA1ZjUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0NvbmZpZ1BhcnNpbmdVdGlscy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQ29uZmlnUGFyc2luZ1V0aWxzLmNwcApAQCAtNDE2LDQgKzQxNiw0IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRGV2aWNlRGVzY3JpcHRvci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9EZXZpY2VEZXNjcmlwdG9yLmNwcAppbmRleCBhMmMxMTY1Li4xOWMyMDYyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9EZXZpY2VEZXNjcmlwdG9yLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9EZXZpY2VEZXNjcmlwdG9yLmNwcApAQCAtMTcsNiArMTcsNyBAQAogI2RlZmluZSBMT0dfVEFHICJBUE06OkRldmljZXMiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKKyNpbmNsdWRlIDxhdWRpb191dGlscy9zdHJpbmcuaD4KICNpbmNsdWRlICJEZXZpY2VEZXNjcmlwdG9yLmgiCiAjaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgogI2luY2x1ZGUgIkF1ZGlvR2Fpbi5oIgpAQCAtNjAsNyArNjEsNyBAQAogdm9pZCBEZXZpY2VWZWN0b3I6OnJlZnJlc2hUeXBlcygpCiB7CiAgICAgbURldmljZVR5cGVzID0gQVVESU9fREVWSUNFX05PTkU7Ci0gICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewogICAgICAgICBtRGV2aWNlVHlwZXMgfD0gaXRlbUF0KGkpLT50eXBlKCk7CiAgICAgfQogICAgIEFMT0dWKCJEZXZpY2VWZWN0b3I6OnJlZnJlc2hUeXBlcygpIG1EZXZpY2VUeXBlcyAlMDh4IiwgbURldmljZVR5cGVzKTsKQEAgLTY4LDcgKzY5LDcgQEAKIAogc3NpemVfdCBEZXZpY2VWZWN0b3I6OmluZGV4T2YoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pIGNvbnN0CiB7Ci0gICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewogICAgICAgICBpZiAoaXRlbS0+ZXF1YWxzKGl0ZW1BdChpKSkpIHsKICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICB9CkBAIC03OCwxMiArNzksMTUgQEAKIAogdm9pZCBEZXZpY2VWZWN0b3I6OmFkZChjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpCiB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkZXZpY2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9IGRldmljZXMuaXRlbUF0KGkpOworICAgIGJvb2wgYWRkZWQgPSBmYWxzZTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6IGRldmljZXMpIHsKICAgICAgICAgaWYgKGluZGV4T2YoZGV2aWNlKSA8IDAgJiYgU29ydGVkVmVjdG9yOjphZGQoZGV2aWNlKSA+PSAwKSB7Ci0gICAgICAgICAgICByZWZyZXNoVHlwZXMoKTsKKyAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KKyAgICBpZiAoYWRkZWQpIHsKKyAgICAgICAgcmVmcmVzaFR5cGVzKCk7CisgICAgfQogfQogCiBzc2l6ZV90IERldmljZVZlY3Rvcjo6YWRkKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBpdGVtKQpAQCAtMTQ4LDE0ICsxNTIsMTIgQEAKIAogc3A8RGV2aWNlRGVzY3JpcHRvcj4gRGV2aWNlVmVjdG9yOjpnZXREZXZpY2VGcm9tSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBpZCkgY29uc3QKIHsKLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2U7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBpZiAoaXRlbUF0KGkpLT5nZXRJZCgpID09IGlkKSB7Ci0gICAgICAgICAgICBkZXZpY2UgPSBpdGVtQXQoaSk7Ci0gICAgICAgICAgICBicmVhazsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6ICp0aGlzKSB7CisgICAgICAgIGlmIChkZXZpY2UtPmdldElkKCkgPT0gaWQpIHsKKyAgICAgICAgICAgIHJldHVybiBkZXZpY2U7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIGRldmljZTsKKyAgICByZXR1cm4gbnVsbHB0cjsKIH0KIAogRGV2aWNlVmVjdG9yIERldmljZVZlY3Rvcjo6Z2V0RGV2aWNlc0Zyb21UeXBlKGF1ZGlvX2RldmljZXNfdCB0eXBlKSBjb25zdApAQCAtMTgwLDExICsxODIsOSBAQAogICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSwgY29uc3QgU3RyaW5nOCYgYWRkcmVzcykgY29uc3QKIHsKICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlczsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChpdGVtQXQoaSktPnR5cGUoKSA9PSB0eXBlKSB7Ci0gICAgICAgICAgICBpZiAoaXRlbUF0KGkpLT5tQWRkcmVzcyA9PSBhZGRyZXNzKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlcy5hZGQoaXRlbUF0KGkpKTsKLSAgICAgICAgICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6ICp0aGlzKSB7CisgICAgICAgIGlmIChkZXZpY2UtPnR5cGUoKSA9PSB0eXBlICYmIGRldmljZS0+bUFkZHJlc3MgPT0gYWRkcmVzcykgeworICAgICAgICAgICAgZGV2aWNlcy5hZGQoZGV2aWNlKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gZGV2aWNlczsKQEAgLTE5MiwxNCArMTkyLDEyIEBACiAKIHNwPERldmljZURlc2NyaXB0b3I+IERldmljZVZlY3Rvcjo6Z2V0RGV2aWNlRnJvbVRhZ05hbWUoY29uc3QgU3RyaW5nOCAmdGFnTmFtZSkgY29uc3QKIHsKLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2U7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBpZiAoaXRlbUF0KGkpLT5nZXRUYWdOYW1lKCkgPT0gdGFnTmFtZSkgewotICAgICAgICAgICAgZGV2aWNlID0gaXRlbUF0KGkpOwotICAgICAgICAgICAgYnJlYWs7CisgICAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2UgOiAqdGhpcykgeworICAgICAgICBpZiAoZGV2aWNlLT5nZXRUYWdOYW1lKCkgPT0gdGFnTmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIGRldmljZTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gZGV2aWNlOworICAgIHJldHVybiBudWxscHRyOwogfQogCiBzdGF0dXNfdCBEZXZpY2VWZWN0b3I6OmR1bXAoaW50IGZkLCBjb25zdCBTdHJpbmc4ICZ0YWcsIGludCBzcGFjZXMsIGJvb2wgdmVyYm9zZSkgY29uc3QKQEAgLTI0OCw4ICsyNDYsOSBAQAogICAgIC8vIHdpdGhvdXQgdGhlIHRlc3Q/CiAgICAgLy8gVGhpcyBoYXMgYmVlbiBkZW1vbnN0cmF0ZWQgdG8gTk9UIGJlIHRydWUgKGF0IHN0YXJ0IHVwKQogICAgIC8vIEFMT0dfQVNTRVJUKG1Nb2R1bGUgIT0gTlVMTCk7Ci0gICAgZHN0Q29uZmlnLT5leHQuZGV2aWNlLmh3X21vZHVsZSA9IG1Nb2R1bGUgIT0gMCA/IG1Nb2R1bGUtPm1IYW5kbGUgOiBBVURJT19NT0RVTEVfSEFORExFX05PTkU7Ci0gICAgc3RybmNweShkc3RDb25maWctPmV4dC5kZXZpY2UuYWRkcmVzcywgbUFkZHJlc3Muc3RyaW5nKCksIEFVRElPX0RFVklDRV9NQVhfQUREUkVTU19MRU4pOworICAgIGRzdENvbmZpZy0+ZXh0LmRldmljZS5od19tb2R1bGUgPQorICAgICAgICAgICAgbU1vZHVsZSAhPSAwID8gbU1vZHVsZS0+Z2V0SGFuZGxlKCkgOiBBVURJT19NT0RVTEVfSEFORExFX05PTkU7CisgICAgKHZvaWQpYXVkaW9fdXRpbHNfc3RybGNweV96ZXJvZmlsbChkc3RDb25maWctPmV4dC5kZXZpY2UuYWRkcmVzcywgbUFkZHJlc3Muc3RyaW5nKCkpOwogfQogCiB2b2lkIERldmljZURlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdApAQCAtMjU5LDggKzI1OCw4IEBACiAgICAgcG9ydC0+aWQgPSBtSWQ7CiAgICAgdG9BdWRpb1BvcnRDb25maWcoJnBvcnQtPmFjdGl2ZV9jb25maWcpOwogICAgIHBvcnQtPmV4dC5kZXZpY2UudHlwZSA9IG1EZXZpY2VUeXBlOwotICAgIHBvcnQtPmV4dC5kZXZpY2UuaHdfbW9kdWxlID0gbU1vZHVsZS0+bUhhbmRsZTsKLSAgICBzdHJuY3B5KHBvcnQtPmV4dC5kZXZpY2UuYWRkcmVzcywgbUFkZHJlc3Muc3RyaW5nKCksIEFVRElPX0RFVklDRV9NQVhfQUREUkVTU19MRU4pOworICAgIHBvcnQtPmV4dC5kZXZpY2UuaHdfbW9kdWxlID0gbU1vZHVsZS0+Z2V0SGFuZGxlKCk7CisgICAgKHZvaWQpYXVkaW9fdXRpbHNfc3RybGNweV96ZXJvZmlsbChwb3J0LT5leHQuZGV2aWNlLmFkZHJlc3MsIG1BZGRyZXNzLnN0cmluZygpKTsKIH0KIAogdm9pZCBEZXZpY2VEZXNjcmlwdG9yOjppbXBvcnRBdWRpb1BvcnQoY29uc3Qgc3A8QXVkaW9Qb3J0PiYgcG9ydCwgYm9vbCBmb3JjZSkgewpAQCAtMzEyLDQgKzMxMSw0IEBACiAgICAgQXVkaW9Qb3J0Ojpsb2coIiAgIik7CiB9CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9HYWlucy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9HYWlucy5jcHAKaW5kZXggZTNmYzlhOC4uNjQwN2ExNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvR2FpbnMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0dhaW5zLmNwcApAQCAtMTEzLDg2ICsxMTMsMTA0IEBACiAgICAgezAsIDAuMGZ9LCB7MSwgMC4wZn0sIHsyLCAwLjBmfSwgezEwMCwgMC4wZn0KIH07CiAKK2NvbnN0IFZvbHVtZUN1cnZlUG9pbnQKK0dhaW5zOjpzSGVhcmluZ0FpZFZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKKyAgICB7MSwgLTEyOC4wZn0sIHsyMCwgLTgwLjBmfSwgezYwLCAtNDAuMGZ9LCB7MTAwLCAwLjBmfQorfTsKKwogY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqR2FpbnM6OnNWb2x1bWVQcm9maWxlc1tBVURJT19TVFJFQU1fQ05UXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbREVWSUNFX0NBVEVHT1JZX0NOVF0gPSB7CiAgICAgeyAvLyBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTAogICAgICAgICBHYWluczo6c0RlZmF1bHRWb2ljZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAogICAgICAgICBHYWluczo6c1NwZWFrZXJWb2ljZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgogICAgICAgICBHYWluczo6c1NwZWFrZXJWb2ljZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQorICAgICAgICBHYWluczo6c0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgICAgIEdhaW5zOjpzSGVhcmluZ0FpZFZvbHVtZUN1cnZlICAgICAvLyBERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQKICAgICB9LAogICAgIHsgLy8gQVVESU9fU1RSRUFNX1NZU1RFTQogICAgICAgICBHYWluczo6c0hlYWRzZXRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKICAgICAgICAgR2FpbnM6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCiAgICAgICAgIEdhaW5zOjpzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlLCAgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIEdhaW5zOjpzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQorICAgICAgICBHYWluczo6c0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICAgICAgR2FpbnM6OnNIZWFyaW5nQWlkVm9sdW1lQ3VydmUgICAgICAgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECiAgICAgfSwKICAgICB7IC8vIEFVRElPX1NUUkVBTV9SSU5HCiAgICAgICAgIEdhaW5zOjpzRGVmYXVsdFZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAogICAgICAgICBHYWluczo6c1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKICAgICAgICAgR2FpbnM6OnNEZWZhdWx0Vm9sdW1lQ3VydmUsICAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgR2FpbnM6OnNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgICAgIEdhaW5zOjpzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQorICAgICAgICBHYWluczo6c0hlYXJpbmdBaWRWb2x1bWVDdXJ2ZSAvLyBERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQKICAgICB9LAogICAgIHsgLy8gQVVESU9fU1RSRUFNX01VU0lDCiAgICAgICAgIEdhaW5zOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCiAgICAgICAgIEdhaW5zOjpzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCiAgICAgICAgIEdhaW5zOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgICAgIEdhaW5zOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICAgICAgR2FpbnM6OnNIZWFyaW5nQWlkVm9sdW1lQ3VydmUgICAgIC8vIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRAogICAgIH0sCiAgICAgeyAvLyBBVURJT19TVFJFQU1fQUxBUk0KICAgICAgICAgR2FpbnM6OnNEZWZhdWx0Vm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCiAgICAgICAgIEdhaW5zOjpzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgogICAgICAgICBHYWluczo6c0RlZmF1bHRWb2x1bWVDdXJ2ZSwgIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICAgICAgR2FpbnM6OnNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgICAgIEdhaW5zOjpzSGVhcmluZ0FpZFZvbHVtZUN1cnZlIC8vIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRAogICAgIH0sCiAgICAgeyAvLyBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OCiAgICAgICAgIEdhaW5zOjpzRGVmYXVsdFZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAogICAgICAgICBHYWluczo6c1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKICAgICAgICAgR2FpbnM6OnNEZWZhdWx0Vm9sdW1lQ3VydmUsICAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgR2FpbnM6OnNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgICAgIEdhaW5zOjpzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQorICAgICAgICBHYWluczo6c0hlYXJpbmdBaWRWb2x1bWVDdXJ2ZSAvLyBERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQKICAgICB9LAogICAgIHsgLy8gQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08KICAgICAgICAgR2FpbnM6OnNEZWZhdWx0Vm9pY2VWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKICAgICAgICAgR2FpbnM6OnNTcGVha2VyVm9pY2VWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKICAgICAgICAgR2FpbnM6OnNEZWZhdWx0Vm9pY2VWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICAgICAgR2FpbnM6OnNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQorICAgICAgICBHYWluczo6c0hlYXJpbmdBaWRWb2x1bWVDdXJ2ZSAgICAgIC8vIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRAogICAgIH0sCiAgICAgeyAvLyBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRQogICAgICAgICBHYWluczo6c0hlYWRzZXRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKICAgICAgICAgR2FpbnM6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCiAgICAgICAgIEdhaW5zOjpzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgR2FpbnM6OnNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgICAgIEdhaW5zOjpzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQorICAgICAgICBHYWluczo6c0hlYXJpbmdBaWRWb2x1bWVDdXJ2ZSAgICAgICAvLyBERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQKICAgICB9LAogICAgIHsgIC8vIEFVRElPX1NUUkVBTV9EVE1GCiAgICAgICAgIEdhaW5zOjpzSGVhZHNldFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAogICAgICAgICBHYWluczo6c0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKICAgICAgICAgR2FpbnM6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICAgICAgR2FpbnM6OnNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgICAgIEdhaW5zOjpzSGVhcmluZ0FpZFZvbHVtZUN1cnZlICAgICAgIC8vIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRAogICAgIH0sCiAgICAgeyAvLyBBVURJT19TVFJFQU1fVFRTCiAgICAgICAvLyAiVHJhbnNtaXR0ZWQgVGhyb3VnaCBTcGVha2VyIjogYWx3YXlzIHNpbGVudCBleGNlcHQgb24gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKICAgICAgICAgR2FpbnM6OnNTaWxlbnRWb2x1bWVDdXJ2ZSwgICAgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKICAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKICAgICAgICAgR2FpbnM6OnNTaWxlbnRWb2x1bWVDdXJ2ZSwgICAgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIEdhaW5zOjpzU2lsZW50Vm9sdW1lQ3VydmUgICAgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICAgICAgR2FpbnM6OnNTaWxlbnRWb2x1bWVDdXJ2ZSwgICAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQorICAgICAgICBHYWluczo6c0hlYXJpbmdBaWRWb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECiAgICAgfSwKICAgICB7IC8vIEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZCiAgICAgICAgIEdhaW5zOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCiAgICAgICAgIEdhaW5zOjpzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCiAgICAgICAgIEdhaW5zOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgICAgIEdhaW5zOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICAgICAgR2FpbnM6OnNIZWFyaW5nQWlkVm9sdW1lQ3VydmUgICAgIC8vIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRAogICAgIH0sCiAgICAgeyAvLyBBVURJT19TVFJFQU1fUkVST1VUSU5HCiAgICAgICAgIEdhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCiAgICAgICAgIEdhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCiAgICAgICAgIEdhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgICAgIEdhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECiAgICAgfSwKICAgICB7IC8vIEFVRElPX1NUUkVBTV9QQVRDSAogICAgICAgICBHYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAogICAgICAgICBHYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgogICAgICAgICBHYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQorICAgICAgICBHYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgICAgIEdhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRAogICAgIH0sCiB9OwogCkBAIC0yMzUsNCArMjUzLDQgQEAKICAgICByZXR1cm4gZGVjaWJlbHM7CiB9CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Id01vZHVsZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Id01vZHVsZS5jcHAKaW5kZXggY2M1NmZiOC4uYWVmN2RiZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSHdNb2R1bGUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0h3TW9kdWxlLmNwcApAQCAtMTU0LDEwICsxNTQsOSBAQAogRGV2aWNlVmVjdG9yIEh3TW9kdWxlOjpnZXRSb3V0ZVNvdXJjZURldmljZXMoY29uc3Qgc3A8QXVkaW9Sb3V0ZT4gJnJvdXRlKSBjb25zdAogewogICAgIERldmljZVZlY3RvciBzb3VyY2VEZXZpY2VzOwotICAgIFZlY3RvciA8c3A8QXVkaW9Qb3J0PiA+IHNvdXJjZXMgPSByb3V0ZS0+Z2V0U291cmNlcygpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc291cmNlcy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAoc291cmNlc1tpXS0+Z2V0VHlwZSgpID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKLSAgICAgICAgICAgIHNvdXJjZURldmljZXMuYWRkKG1EZWNsYXJlZERldmljZXMuZ2V0RGV2aWNlRnJvbVRhZ05hbWUoc291cmNlc1tpXS0+Z2V0VGFnTmFtZSgpKSk7CisgICAgZm9yIChjb25zdCBhdXRvJiBzb3VyY2UgOiByb3V0ZS0+Z2V0U291cmNlcygpKSB7CisgICAgICAgIGlmIChzb3VyY2UtPmdldFR5cGUoKSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgICAgICAgICBzb3VyY2VEZXZpY2VzLmFkZChtRGVjbGFyZWREZXZpY2VzLmdldERldmljZUZyb21UYWdOYW1lKHNvdXJjZS0+Z2V0VGFnTmFtZSgpKSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHNvdXJjZURldmljZXM7CkBAIC0xNzMsMTcgKzE3MiwxNSBAQAogdm9pZCBId01vZHVsZTo6cmVmcmVzaFN1cHBvcnRlZERldmljZXMoKQogewogICAgIC8vIE5vdyB1cGRhdGluZyB0aGUgc3RyZWFtcyAoYWthIElPUHJvZmlsZSB1bnRpbCBub3cpIHN1cHBvcnRlZCBkZXZpY2VzCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRQcm9maWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICBzcDxJT1Byb2ZpbGU+IHN0cmVhbSA9IG1JbnB1dFByb2ZpbGVzW2ldOworICAgIGZvciAoY29uc3QgYXV0byYgc3RyZWFtIDogbUlucHV0UHJvZmlsZXMpIHsKICAgICAgICAgRGV2aWNlVmVjdG9yIHNvdXJjZURldmljZXM7Ci0gICAgICAgIGNvbnN0IEF1ZGlvUm91dGVWZWN0b3IgJnJvdXRlcyA9IHN0cmVhbS0+Z2V0Um91dGVzKCk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgcm91dGVzLnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICBzcDxBdWRpb1BvcnQ+IHNpbmsgPSByb3V0ZXNbal0tPmdldFNpbmsoKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiByb3V0ZSA6IHN0cmVhbS0+Z2V0Um91dGVzKCkpIHsKKyAgICAgICAgICAgIHNwPEF1ZGlvUG9ydD4gc2luayA9IHJvdXRlLT5nZXRTaW5rKCk7CiAgICAgICAgICAgICBpZiAoc2luayA9PSAwIHx8IHN0cmVhbSAhPSBzaW5rKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIHJvdXRlIGF0dGFjaGVkIHRvIGlucHV0IHN0cmVhbSIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBEZXZpY2VWZWN0b3Igc291cmNlRGV2aWNlc0ZvclJvdXRlID0gZ2V0Um91dGVTb3VyY2VEZXZpY2VzKHJvdXRlc1tqXSk7CisgICAgICAgICAgICBEZXZpY2VWZWN0b3Igc291cmNlRGV2aWNlc0ZvclJvdXRlID0gZ2V0Um91dGVTb3VyY2VEZXZpY2VzKHJvdXRlKTsKICAgICAgICAgICAgIGlmIChzb3VyY2VEZXZpY2VzRm9yUm91dGUuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIHNvdXJjZSBkZXZpY2VzIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgc3RyZWFtLT5nZXROYW1lKCkuc3RyaW5nKCkpOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtMTk2LDE3ICsxOTMsMTUgQEAKICAgICAgICAgfQogICAgICAgICBzdHJlYW0tPnNldFN1cHBvcnRlZERldmljZXMoc291cmNlRGV2aWNlcyk7CiAgICAgfQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dFByb2ZpbGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNwPElPUHJvZmlsZT4gc3RyZWFtID0gbU91dHB1dFByb2ZpbGVzW2ldOworICAgIGZvciAoY29uc3QgYXV0byYgc3RyZWFtIDogbU91dHB1dFByb2ZpbGVzKSB7CiAgICAgICAgIERldmljZVZlY3RvciBzaW5rRGV2aWNlczsKLSAgICAgICAgY29uc3QgQXVkaW9Sb3V0ZVZlY3RvciAmcm91dGVzID0gc3RyZWFtLT5nZXRSb3V0ZXMoKTsKLSAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCByb3V0ZXMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvUG9ydD4gc291cmNlID0gcm91dGVzW2pdLT5nZXRTb3VyY2VzKCkuZmluZEJ5VGFnTmFtZShzdHJlYW0tPmdldFRhZ05hbWUoKSk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgcm91dGUgOiBzdHJlYW0tPmdldFJvdXRlcygpKSB7CisgICAgICAgICAgICBzcDxBdWRpb1BvcnQ+IHNvdXJjZSA9IHJvdXRlLT5nZXRTb3VyY2VzKCkuZmluZEJ5VGFnTmFtZShzdHJlYW0tPmdldFRhZ05hbWUoKSk7CiAgICAgICAgICAgICBpZiAoc291cmNlID09IDAgfHwgc3RyZWFtICE9IHNvdXJjZSkgewogICAgICAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCByb3V0ZSBhdHRhY2hlZCB0byBvdXRwdXQgc3RyZWFtIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHNpbmtEZXZpY2UgPSBnZXRSb3V0ZVNpbmtEZXZpY2Uocm91dGVzW2pdKTsKKyAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHNpbmtEZXZpY2UgPSBnZXRSb3V0ZVNpbmtEZXZpY2Uocm91dGUpOwogICAgICAgICAgICAgaWYgKHNpbmtEZXZpY2UgPT0gMCkgewogICAgICAgICAgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCBzaW5rIGRldmljZSBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIHN0cmVhbS0+Z2V0TmFtZSgpLnN0cmluZygpKTsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTIxNyw2ICsyMTIsMTIgQEAKICAgICB9CiB9CiAKK3ZvaWQgSHdNb2R1bGU6OnNldEhhbmRsZShhdWRpb19tb2R1bGVfaGFuZGxlX3QgaGFuZGxlKSB7CisgICAgQUxPR1dfSUYobUhhbmRsZSAhPSBBVURJT19NT0RVTEVfSEFORExFX05PTkUsCisgICAgICAgICAgICAiSHdNb2R1bGUgaGFuZGxlIGlzIGNoYW5naW5nIGZyb20gJWQgdG8gJWQiLCBtSGFuZGxlLCBoYW5kbGUpOworICAgIG1IYW5kbGUgPSBoYW5kbGU7Cit9CisKIHZvaWQgSHdNb2R1bGU6OmR1bXAoaW50IGZkKQogewogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwpAQCAtMjUyLDYwICsyNTMsNDAgQEAKIAogc3AgPEh3TW9kdWxlPiBId01vZHVsZUNvbGxlY3Rpb246OmdldE1vZHVsZUZyb21OYW1lKGNvbnN0IGNoYXIgKm5hbWUpIGNvbnN0CiB7Ci0gICAgc3AgPEh3TW9kdWxlPiBtb2R1bGU7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKHN0cmNtcChpdGVtQXQoaSktPmdldE5hbWUoKSwgbmFtZSkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIGl0ZW1BdChpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIG1vZHVsZSA6ICp0aGlzKSB7CisgICAgICAgIGlmIChzdHJjbXAobW9kdWxlLT5nZXROYW1lKCksIG5hbWUpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBtb2R1bGU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIG1vZHVsZTsKKyAgICByZXR1cm4gbnVsbHB0cjsKIH0KIAotCiBzcCA8SHdNb2R1bGU+IEh3TW9kdWxlQ29sbGVjdGlvbjo6Z2V0TW9kdWxlRm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0CiB7Ci0gICAgc3AgPEh3TW9kdWxlPiBtb2R1bGU7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChpdGVtQXQoaSktPmdldEhhbmRsZSgpID09IDApIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZSkpIHsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgaXRlbUF0KGkpLT5tT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW1BdChpKS0+bU91dHB1dFByb2ZpbGVzW2pdLT5zdXBwb3J0RGV2aWNlKGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1BdChpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGl0ZW1BdChpKS0+bUlucHV0UHJvZmlsZXMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoaXRlbUF0KGkpLT5tSW5wdXRQcm9maWxlc1tqXS0+c3VwcG9ydERldmljZShkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtQXQoaSk7Ci0gICAgICAgICAgICAgICAgfQorICAgIGZvciAoY29uc3QgYXV0byYgbW9kdWxlIDogKnRoaXMpIHsKKyAgICAgICAgY29uc3QgYXV0byYgcHJvZmlsZXMgPSBhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZSkgPworICAgICAgICAgICAgICAgIG1vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKSA6IG1vZHVsZS0+Z2V0SW5wdXRQcm9maWxlcygpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHByb2ZpbGUgOiBwcm9maWxlcykgeworICAgICAgICAgICAgaWYgKHByb2ZpbGUtPnN1cHBvcnREZXZpY2UoZGV2aWNlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBtb2R1bGU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIG1vZHVsZTsKKyAgICByZXR1cm4gbnVsbHB0cjsKIH0KIAotc3A8RGV2aWNlRGVzY3JpcHRvcj4gIEh3TW9kdWxlQ29sbGVjdGlvbjo6Z2V0RGV2aWNlRGVzY3JpcHRvcihjb25zdCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbWF0Y2hBZHJlc3MpIGNvbnN0CitzcDxEZXZpY2VEZXNjcmlwdG9yPiBId01vZHVsZUNvbGxlY3Rpb246OmdldERldmljZURlc2NyaXB0b3IoY29uc3QgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG1hdGNoQWRyZXNzKSBjb25zdAogewotICAgIFN0cmluZzggYWRkcmVzcyA9IChkZXZpY2VfYWRkcmVzcyA9PSBOVUxMKSA/IFN0cmluZzgoIiIpIDogU3RyaW5nOChkZXZpY2VfYWRkcmVzcyk7CisgICAgU3RyaW5nOCBhZGRyZXNzID0gKGRldmljZV9hZGRyZXNzID09IG51bGxwdHIpID8gU3RyaW5nOCgiIikgOiBTdHJpbmc4KGRldmljZV9hZGRyZXNzKTsKICAgICAvLyBoYW5kbGUgbGVnYWN5IHJlbW90ZSBzdWJtaXggY2FzZSB3aGVyZSB0aGUgYWRkcmVzcyB3YXMgbm90IGFsd2F5cyBzcGVjaWZpZWQKICAgICBpZiAoZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2UpICYmIChhZGRyZXNzLmxlbmd0aCgpID09IDApKSB7CiAgICAgICAgIGFkZHJlc3MgPSBTdHJpbmc4KCIwIik7CiAgICAgfQogCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBjb25zdCBzcDxId01vZHVsZT4gaHdNb2R1bGUgPSBpdGVtQXQoaSk7Ci0gICAgICAgIGlmIChod01vZHVsZS0+bUhhbmRsZSA9PSAwKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQorICAgIGZvciAoY29uc3QgYXV0byYgaHdNb2R1bGUgOiAqdGhpcykgewogICAgICAgICBEZXZpY2VWZWN0b3IgZGVjbGFyZWREZXZpY2VzID0gaHdNb2R1bGUtPmdldERlY2xhcmVkRGV2aWNlcygpOwogICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdCA9IGRlY2xhcmVkRGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVBZGRyKGRldmljZSwgYWRkcmVzcyk7CiAgICAgICAgIGlmICghZGV2aWNlTGlzdC5pc0VtcHR5KCkpIHsKQEAgLTM0MCw0ICszMjEsNSBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAorCiB9IC8vbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0lPUHJvZmlsZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9JT1Byb2ZpbGUuY3BwCmluZGV4IDc0ZWY0ZWMuLmZiYzIzODQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0lPUHJvZmlsZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSU9Qcm9maWxlLmNwcApAQCAtMzUsNyArMzUsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnVwZGF0ZWRGb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICp1cGRhdGVkQ2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncykgY29uc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIHR5cGUgcHVubmluZyBoZXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZXhhY3RNYXRjaFJlcXVpcmVkRm9ySW5wdXRGbGFncykgY29uc3QKIHsKICAgICBjb25zdCBib29sIGlzUGxheWJhY2tUaHJlYWQgPQogICAgICAgICAgICAgZ2V0VHlwZSgpID09IEFVRElPX1BPUlRfVFlQRV9NSVggJiYgZ2V0Um9sZSgpID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0U7CkBAIC03MSw3ICs3MywxMyBAQAogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGNoZWNrRXhhY3RBdWRpb1Byb2ZpbGUoc2FtcGxpbmdSYXRlLCBjaGFubmVsTWFzaywgZm9ybWF0KSAhPSBOT19FUlJPUikgeworICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgY29uZmlnID0geworICAgICAgICAgICAgLmNvbmZpZ19tYXNrID0gQVVESU9fUE9SVF9DT05GSUdfQUxMICYgfkFVRElPX1BPUlRfQ09ORklHX0dBSU4sCisgICAgICAgICAgICAuc2FtcGxlX3JhdGUgPSBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAuY2hhbm5lbF9tYXNrID0gY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAuZm9ybWF0ID0gZm9ybWF0LAorICAgICAgICB9OworICAgICAgICBpZiAoY2hlY2tFeGFjdEF1ZGlvUHJvZmlsZSgmY29uZmlnKSAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQpAQCAtODQsNyArOTIsNyBAQAogICAgIC8vIEFuIGV4aXN0aW5nIG5vcm1hbCBzdHJlYW0gaXMgY29tcGF0aWJsZSB3aXRoIGEgZmFzdCB0cmFjayByZXF1ZXN0LAogICAgIC8vIGJ1dCB0aGUgZmFzdCByZXF1ZXN0IHdpbGwgYmUgZGVuaWVkIGJ5IEF1ZGlvRmxpbmdlciBhbmQgY29udmVydGVkIHRvIG5vcm1hbCB0cmFjay4KICAgICBpZiAoaXNSZWNvcmRUaHJlYWQgJiYgKChnZXRGbGFncygpIF4gZmxhZ3MpICYKLSAgICAgICAgICAgIH5BVURJT19JTlBVVF9GTEFHX0ZBU1QpKSB7CisgICAgICAgICAgICB+KGV4YWN0TWF0Y2hSZXF1aXJlZEZvcklucHV0RmxhZ3MgPyBBVURJT19JTlBVVF9GTEFHX05PTkUgOiBBVURJT19JTlBVVF9GTEFHX0ZBU1QpKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCkBAIC0xMjIsNiArMTMwLDE2IEBACiAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKICAgICBtU3VwcG9ydGVkRGV2aWNlcy5kdW1wKGZkLCBTdHJpbmc4KCJTdXBwb3J0ZWQiKSwgNCwgZmFsc2UpOworCisgICAgcmVzdWx0LmNsZWFyKCk7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG4gICAgLSBtYXhPcGVuQ291bnQ6ICV1IC0gY3VyT3BlbkNvdW50OiAldVxuIiwKKyAgICAgICAgICAgICBtYXhPcGVuQ291bnQsIGN1ck9wZW5Db3VudCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAtIG1heEFjdGl2ZUNvdW50OiAldSAtIGN1ckFjdGl2ZUNvdW50OiAldVxuIiwKKyAgICAgICAgICAgICBtYXhBY3RpdmVDb3VudCwgY3VyQWN0aXZlQ291bnQpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKworICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogfQogCiB2b2lkIElPUHJvZmlsZTo6bG9nKCkKQEAgLTEyOSw0ICsxNDcsNCBAQAogICAgIC8vIEBUT0RPOiBmb3J3YXJkIGxvZyB0byBBdWRpb1BvcnQKIH0KIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1NlcmlhbGl6ZXIuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU2VyaWFsaXplci5jcHAKaW5kZXggYTIyNDAwNC4uYTI1MzExMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU2VyaWFsaXplci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU2VyaWFsaXplci5jcHAKQEAgLTE0MCwxOSArMTQwLDE5IEBACiAgICAgfQogCiAgICAgc3RyaW5nIG1pblZhbHVlTUJMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6Om1pblZhbHVlTUIpOwotICAgIHVpbnQzMl90IG1pblZhbHVlTUI7CisgICAgaW50MzJfdCBtaW5WYWx1ZU1COwogICAgIGlmICghbWluVmFsdWVNQkxpdGVyYWwuZW1wdHkoKSAmJiBjb252ZXJ0VG8obWluVmFsdWVNQkxpdGVyYWwsIG1pblZhbHVlTUIpKSB7CiAgICAgICAgIGdhaW4tPnNldE1pblZhbHVlSW5NYihtaW5WYWx1ZU1CKTsKICAgICB9CiAKICAgICBzdHJpbmcgbWF4VmFsdWVNQkxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6bWF4VmFsdWVNQik7Ci0gICAgdWludDMyX3QgbWF4VmFsdWVNQjsKKyAgICBpbnQzMl90IG1heFZhbHVlTUI7CiAgICAgaWYgKCFtYXhWYWx1ZU1CTGl0ZXJhbC5lbXB0eSgpICYmIGNvbnZlcnRUbyhtYXhWYWx1ZU1CTGl0ZXJhbCwgbWF4VmFsdWVNQikpIHsKICAgICAgICAgZ2Fpbi0+c2V0TWF4VmFsdWVJbk1iKG1heFZhbHVlTUIpOwogICAgIH0KIAogICAgIHN0cmluZyBkZWZhdWx0VmFsdWVNQkxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6ZGVmYXVsdFZhbHVlTUIpOwotICAgIHVpbnQzMl90IGRlZmF1bHRWYWx1ZU1COworICAgIGludDMyX3QgZGVmYXVsdFZhbHVlTUI7CiAgICAgaWYgKCFkZWZhdWx0VmFsdWVNQkxpdGVyYWwuZW1wdHkoKSAmJiBjb252ZXJ0VG8oZGVmYXVsdFZhbHVlTUJMaXRlcmFsLCBkZWZhdWx0VmFsdWVNQikpIHsKICAgICAgICAgZ2Fpbi0+c2V0RGVmYXVsdFZhbHVlSW5NYihkZWZhdWx0VmFsdWVNQik7CiAgICAgfQpAQCAtMjE3LDYgKzIxNyw4IEBACiBjb25zdCBjaGFyIE1peFBvcnRUcmFpdHM6OkF0dHJpYnV0ZXM6Om5hbWVbXSA9ICJuYW1lIjsKIGNvbnN0IGNoYXIgTWl4UG9ydFRyYWl0czo6QXR0cmlidXRlczo6cm9sZVtdID0gInJvbGUiOwogY29uc3QgY2hhciBNaXhQb3J0VHJhaXRzOjpBdHRyaWJ1dGVzOjpmbGFnc1tdID0gImZsYWdzIjsKK2NvbnN0IGNoYXIgTWl4UG9ydFRyYWl0czo6QXR0cmlidXRlczo6bWF4T3BlbkNvdW50W10gPSAibWF4T3BlbkNvdW50IjsKK2NvbnN0IGNoYXIgTWl4UG9ydFRyYWl0czo6QXR0cmlidXRlczo6bWF4QWN0aXZlQ291bnRbXSA9ICJtYXhBY3RpdmVDb3VudCI7CiAKIHN0YXR1c190IE1peFBvcnRUcmFpdHM6OmRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKmNoaWxkLCBQdHJFbGVtZW50ICZtaXhQb3J0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggLypzZXJpYWxpemluZ0NvbnRleHQqLykKQEAgLTI1OSw2ICsyNjEsMTQgQEAKICAgICAgICAgICAgIG1peFBvcnQtPnNldEZsYWdzKElucHV0RmxhZ0NvbnZlcnRlcjo6bWFza0Zyb21TdHJpbmcoZmxhZ3MpKTsKICAgICAgICAgfQogICAgIH0KKyAgICBzdHJpbmcgbWF4T3BlbkNvdW50ID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjptYXhPcGVuQ291bnQpOworICAgIGlmICghbWF4T3BlbkNvdW50LmVtcHR5KCkpIHsKKyAgICAgICAgY29udmVydFRvKG1heE9wZW5Db3VudCwgbWl4UG9ydC0+bWF4T3BlbkNvdW50KTsKKyAgICB9CisgICAgc3RyaW5nIG1heEFjdGl2ZUNvdW50ID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjptYXhBY3RpdmVDb3VudCk7CisgICAgaWYgKCFtYXhBY3RpdmVDb3VudC5lbXB0eSgpKSB7CisgICAgICAgIGNvbnZlcnRUbyhtYXhBY3RpdmVDb3VudCwgbWl4UG9ydC0+bWF4QWN0aXZlQ291bnQpOworICAgIH0KICAgICAvLyBEZXNlcmlhbGl6ZSBjaGlsZHJlbgogICAgIEF1ZGlvR2FpblRyYWl0czo6Q29sbGVjdGlvbiBnYWluczsKICAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248QXVkaW9HYWluVHJhaXRzPihkb2MsIGNoaWxkLCBnYWlucywgTlVMTCk7CkBAIC02MzgsNCArNjQ4LDQgQEAKICAgICByZXR1cm4gYW5kcm9pZDo6T0s7CiB9CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9TZXNzaW9uUm91dGUuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU2Vzc2lvblJvdXRlLmNwcAppbmRleCA2ODlmNGU2Li5kMzQyMTRiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9TZXNzaW9uUm91dGUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1Nlc3Npb25Sb3V0ZS5jcHAKQEAgLTQwLDcgKzQwLDcgQEAKICAgICByZXR1cm4gaW5kZXhPZktleShzZXNzaW9uKSA+PSAwICYmIHZhbHVlRm9yKHNlc3Npb24pLT5tRGV2aWNlRGVzY3JpcHRvciAhPSAwOwogfQogCi1ib29sIFNlc3Npb25Sb3V0ZU1hcDo6aGFzUm91dGVDaGFuZ2VkKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorYm9vbCBTZXNzaW9uUm91dGVNYXA6OmdldEFuZENsZWFyUm91dGVDaGFuZ2VkKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQogewogICAgIGlmIChpbmRleE9mS2V5KHNlc3Npb24pID49IDApIHsKICAgICAgICAgaWYgKHZhbHVlRm9yKHNlc3Npb24pLT5tQ2hhbmdlZCkgewpAQCAtODIsNyArODIsNyBAQAogdm9pZCBTZXNzaW9uUm91dGVNYXA6OmxvZyhjb25zdCBjaGFyKiBjYXB0aW9uKQogewogICAgIEFMT0dJKCIlcyAtLS0tIiwgY2FwdGlvbik7Ci0gICAgZm9yKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgc2l6ZSgpOyBpbmRleCsrKSB7CisgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHNpemUoKTsgaW5kZXgrKykgewogICAgICAgICB2YWx1ZUF0KGluZGV4KS0+bG9nKCIgICIpOwogICAgIH0KIH0KQEAgLTEwNCw5ICsxMDQsNyBAQAogICAgIHNwPFNlc3Npb25Sb3V0ZT4gcm91dGUgPSBpbmRleE9mS2V5KHNlc3Npb24pID49IDAgPyB2YWx1ZUZvcihzZXNzaW9uKSA6IDA7CiAKICAgICBpZiAocm91dGUgIT0gMCkgewotICAgICAgICBpZiAoKChyb3V0ZS0+bURldmljZURlc2NyaXB0b3IgPT0gMCkgJiYgKGRlc2NyaXB0b3IgIT0gMCkpIHx8Ci0gICAgICAgICAgICAgICAgKChyb3V0ZS0+bURldmljZURlc2NyaXB0b3IgIT0gMCkgJiYKLSAgICAgICAgICAgICAgICAgKChkZXNjcmlwdG9yID09IDApIHx8ICghcm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yLT5lcXVhbHMoZGVzY3JpcHRvcikpKSkpIHsKKyAgICAgICAgaWYgKGRlc2NyaXB0b3IgIT0gMCB8fCByb3V0ZS0+bURldmljZURlc2NyaXB0b3IgIT0gMCkgewogICAgICAgICAgICAgcm91dGUtPm1DaGFuZ2VkID0gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICByb3V0ZS0+bVJlZkNvdW50Kys7CkBAIC0xMTQsMTEgKzExMiwyOSBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIHJvdXRlID0gbmV3IFNlc3Npb25Sb3V0ZShzZXNzaW9uLCBzdHJlYW1UeXBlLCBzb3VyY2UsIGRlc2NyaXB0b3IsIHVpZCk7CiAgICAgICAgIHJvdXRlLT5tUmVmQ291bnQrKzsKLSAgICAgICAgYWRkKHNlc3Npb24sIHJvdXRlKTsKICAgICAgICAgaWYgKGRlc2NyaXB0b3IgIT0gMCkgewogICAgICAgICAgICAgcm91dGUtPm1DaGFuZ2VkID0gdHJ1ZTsKICAgICAgICAgfQorICAgICAgICBhZGQoc2Vzc2lvbiwgcm91dGUpOwogICAgIH0KIH0KIAorYXVkaW9fZGV2aWNlc190IFNlc3Npb25Sb3V0ZU1hcDo6Z2V0QWN0aXZlRGV2aWNlRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGF2YWlsYWJsZURldmljZXMpCit7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IEFVRElPX0RFVklDRV9OT05FOworCisgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHNpemUoKTsgaW5kZXgrKykgeworICAgICAgICBzcDxTZXNzaW9uUm91dGU+IHJvdXRlID0gdmFsdWVBdChpbmRleCk7CisgICAgICAgIGlmIChzdHJlYW1UeXBlID09IHJvdXRlLT5tU3RyZWFtVHlwZSAmJiByb3V0ZS0+aXNBY3RpdmVPckNoYW5nZWQoKQorICAgICAgICAgICAgICAgICYmIHJvdXRlLT5tRGV2aWNlRGVzY3JpcHRvciAhPSAwKSB7CisgICAgICAgICAgICBkZXZpY2UgPSByb3V0ZS0+bURldmljZURlc2NyaXB0b3ItPnR5cGUoKTsKKyAgICAgICAgICAgIGlmICghYXZhaWxhYmxlRGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoZGV2aWNlKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZGV2aWNlOworfQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9TdHJlYW1EZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1N0cmVhbURlc2NyaXB0b3IuY3BwCmluZGV4IGIzMDE5ZTEuLjY1NjQ5ZmIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1N0cmVhbURlc2NyaXB0b3IuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1N0cmVhbURlc2NyaXB0b3IuY3BwCkBAIC0yMjMsNCArMjIzLDQgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9UeXBlQ29udmVydGVyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1R5cGVDb252ZXJ0ZXIuY3BwCmluZGV4IDAzNjIwMzcuLjZmNDhlYWUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1R5cGVDb252ZXJ0ZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1R5cGVDb252ZXJ0ZXIuY3BwCkBAIC0yOSw2ICsyOSw3IEBACiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKERFVklDRV9DQVRFR09SWV9TUEVBS0VSKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCksCiAgICAgVEVSTUlOQVRPUgogfTsKIApAQCAtNjUsNCArNjYsNCBAQAogdGVtcGxhdGUgY2xhc3MgVHlwZUNvbnZlcnRlcjxSb3V0ZUZsYWdUcmFpdHM+OwogdGVtcGxhdGUgY2xhc3MgVHlwZUNvbnZlcnRlcjxSdWxlVHJhaXRzPjsKIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1ZvbHVtZUN1cnZlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1ZvbHVtZUN1cnZlLmNwcAppbmRleCAxNGNhZjdjLi5hYzNmMWJjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Wb2x1bWVDdXJ2ZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvVm9sdW1lQ3VydmUuY3BwCkBAIC0yOSw2ICsyOSwxMyBAQAogICAgIHNpemVfdCBuYkN1cnZlUG9pbnRzID0gbUN1cnZlUG9pbnRzLnNpemUoKTsKICAgICAvLyB0aGUgdm9sdW1lIGluZGV4IGluIHRoZSBVSSBpcyByZWxhdGl2ZSB0byB0aGUgbWluIGFuZCBtYXggdm9sdW1lIGluZGljZXMgZm9yIHRoaXMgc3RyZWFtCiAgICAgaW50IG5iU3RlcHMgPSAxICsgbUN1cnZlUG9pbnRzW25iQ3VydmVQb2ludHMgLSAxXS5tSW5kZXggLSBtQ3VydmVQb2ludHNbMF0ubUluZGV4OworICAgIGlmIChpbmRleEluVWkgPCB2b2xJbmRleE1pbikgeworICAgICAgICBBTE9HVigiVk9MVU1FIHJlbWFwcGluZyBpbmRleCBmcm9tICVkIHRvIG1pbiBpbmRleCAlZCIsIGluZGV4SW5VaSwgdm9sSW5kZXhNaW4pOworICAgICAgICBpbmRleEluVWkgPSB2b2xJbmRleE1pbjsKKyAgICB9IGVsc2UgaWYgKGluZGV4SW5VaSA+IHZvbEluZGV4TWF4KSB7CisgICAgICAgIEFMT0dWKCJWT0xVTUUgcmVtYXBwaW5nIGluZGV4IGZyb20gJWQgdG8gbWF4IGluZGV4ICVkIiwgaW5kZXhJblVpLCB2b2xJbmRleE1heCk7CisgICAgICAgIGluZGV4SW5VaSA9IHZvbEluZGV4TWF4OworICAgIH0KICAgICBpbnQgdm9sSWR4ID0gKG5iU3RlcHMgKiAoaW5kZXhJblVpIC0gdm9sSW5kZXhNaW4pKSAvICh2b2xJbmRleE1heCAtIHZvbEluZGV4TWluKTsKIAogICAgIC8vIFdoZXJlIHdvdWxkIHRoaXMgdm9sdW1lIGluZGV4IGJlZW4gaW5zZXJ0ZWQgaW4gdGhlIGN1cnZlIHBvaW50CkBAIC0xMzgsNCArMTQ1LDQgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbAppbmRleCA3YWYyZjgxLi5hNzVmMWNiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKQEAgLTE2MywzNyArMTYzLDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM9InByaW1hcnkgb3V0cHV0LGRlZXBfYnVmZmVyLGNvbXByZXNzZWRfb2ZmbG9hZCxCVCBTQ08gSGVhZHNldCBNaWMsVGVsZXBob255IFJ4Ii8+CiAgICAgICAgICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iV2lyZWQgSGVhZHBob25lcyIKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcz0icHJpbWFyeSBvdXRwdXQsZGVlcF9idWZmZXIsY29tcHJlc3NlZF9vZmZsb2FkLEJUIFNDTyBIZWFkc2V0IE1pYyxUZWxlcGhvbnkgUngiLz4KLSAgICAgICAgICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJUZWxlcGhvbnkgVHgiCi0gICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM9InZvaWNlX3R4Ii8+CiAgICAgICAgICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0icHJpbWFyeSBpbnB1dCIKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcz0iQnVpbHQtSW4gTWljLEJ1aWx0LUluIEJhY2sgTWljLFdpcmVkIEhlYWRzZXQgTWljLEJUIFNDTyBIZWFkc2V0IE1pYyIvPgogICAgICAgICAgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IlRlbGVwaG9ueSBUeCIKLSAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcz0iQnVpbHQtSW4gTWljLEJ1aWx0LUluIEJhY2sgTWljLFdpcmVkIEhlYWRzZXQgTWljLEJUIFNDTyBIZWFkc2V0IE1pYyIvPgorICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzPSJCdWlsdC1JbiBNaWMsQnVpbHQtSW4gQmFjayBNaWMsV2lyZWQgSGVhZHNldCBNaWMsQlQgU0NPIEhlYWRzZXQgTWljLCB2b2ljZV90eCIvPgogICAgICAgICAgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9InZvaWNlX3J4IgogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzPSJUZWxlcGhvbnkgUngiLz4KICAgICAgICAgICAgIDwvcm91dGVzPgogCiAgICAgICAgIDwvbW9kdWxlPgogCi0gICAgICAgIDwhLS0gSERNSSBBdWRpbyBIQUwgLS0+Ci0gICAgICAgIDxtb2R1bGUgZGVzY3JpcHRpb249IkhETUkgQXVkaW8gSEFMIiBuYW1lPSJoZG1pIiB2ZXJzaW9uPSIyLjAiPgotICAgICAgICAgICAgPG1peFBvcnRzPgotICAgICAgICAgICAgICAgIDxtaXhQb3J0IG5hbWU9ImhkbWkgb3V0cHV0IiByb2xlPSJzb3VyY2UiPgotICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIi8+Ci0gICAgICAgICAgICAgICAgPC9taXhQb3J0PgotICAgICAgICAgICAgPC9taXhQb3J0cz4KLSAgICAgICAgICAgIDxkZXZpY2VQb3J0cz4KLSAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJIRE1JIE91dCIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9BVVhfRElHSVRBTCIgcm9sZT0ic2luayI+Ci0gICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+Ci0gICAgICAgICAgICAgICAgPC9kZXZpY2VQb3J0PgotICAgICAgICAgICAgPC9kZXZpY2VQb3J0cz4KLSAgICAgICAgICAgIDxyb3V0ZXM+Ci0gICAgICAgICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iSERNSSBPdXQiCi0gICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM9ImhkbWkgb3V0cHV0Ii8+Ci0gICAgICAgICAgICA8L3JvdXRlcz4KLSAgICAgICAgPC9tb2R1bGU+Ci0KICAgICAgICAgPCEtLSBBMmRwIEF1ZGlvIEhBTCAtLT4KICAgICAgICAgPHhpOmluY2x1ZGUgaHJlZj0iYTJkcF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiLz4KIApAQCAtMjAzLDYgKzE4Miw5IEBACiAgICAgICAgIDwhLS0gUmVtb3RlIFN1Ym1peCBBdWRpbyBIQUwgLS0+CiAgICAgICAgIDx4aTppbmNsdWRlIGhyZWY9InJfc3VibWl4X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCIvPgogCisgICAgICAgIDwhLS0gSGVhcmluZyBhaWQgQXVkaW8gSEFMIC0tPgorICAgICAgICA8eGk6aW5jbHVkZSBocmVmPSJoZWFyaW5nX2FpZF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiLz4KKwogICAgIDwvbW9kdWxlcz4KICAgICA8IS0tIEVuZCBvZiBNb2R1bGVzIHNlY3Rpb24gLS0+CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfdm9sdW1lcy54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X3ZvbHVtZXMueG1sCmluZGV4IDQzYTQ3YjAuLmVjNjRhN2MgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfdm9sdW1lcy54bWwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV92b2x1bWVzLnhtbApAQCAtNDMsNiArNDMsOCBAQAogICAgIDwvdm9sdW1lPgogICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9IkRFRkFVTFRfTUVESUFfVk9MVU1FX0NVUlZFIi8+CisgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9WT0lDRV9DQUxMIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPSJERUZBVUxUX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSIvPgogICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fU1lTVEVNIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiPgogICAgICAgICA8cG9pbnQ+MSwtMzAwMDwvcG9pbnQ+CiAgICAgICAgIDxwb2ludD4zMywtMjYwMDwvcG9pbnQ+CkBAIC01NSw2ICs1Nyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZj0iREVGQVVMVF9TWVNURU1fVk9MVU1FX0NVUlZFIi8+CiAgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9TWVNURU0iIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8dm9sdW1lIHN0cmVhbT0iQVVESU9fU1RSRUFNX1NZU1RFTSIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPSJERUZBVUxUX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSIvPgogICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fUklORyIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9IRUFEU0VUX1ZPTFVNRV9DVVJWRSIvPgogICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fUklORyIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIj4KQEAgLTY3LDYgKzcxLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0VfVk9MVU1FX0NVUlZFIi8+CiAgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9SSU5HIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBX1ZPTFVNRV9DVVJWRSIvPgorICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fUklORyIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZj0iREVGQVVMVF9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUiLz4KICAgICA8dm9sdW1lIHN0cmVhbT0iQVVESU9fU1RSRUFNX01VU0lDIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPSJERUZBVUxUX01FRElBX1ZPTFVNRV9DVVJWRSIvPgogICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fTVVTSUMiIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIKQEAgLTc1LDE4ICs4MSwyMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZj0iREVGQVVMVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KICAgICA8dm9sdW1lIHN0cmVhbT0iQVVESU9fU1RSRUFNX01VU0lDIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9IkRFRkFVTFRfTUVESUFfVk9MVU1FX0NVUlZFIi8+CisgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9NVVNJQyIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9IkRFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CiAgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9BTEFSTSIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfSEVBRFNFVF9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9IkRFRkFVTFRfTk9OX01VVEFCTEVfSEVBRFNFVF9WT0xVTUVfQ1VSVkUiLz4KICAgICA8dm9sdW1lIHN0cmVhbT0iQVVESU9fU1RSRUFNX0FMQVJNIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgotICAgICAgICA8cG9pbnQ+MSwtMjk3MDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4wLC0yOTcwPC9wb2ludD4KICAgICAgICAgPHBvaW50PjMzLC0yMDEwPC9wb2ludD4KICAgICAgICAgPHBvaW50PjY2LC0xMDIwPC9wb2ludD4KICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KICAgICA8L3ZvbHVtZT4KICAgICA8dm9sdW1lIHN0cmVhbT0iQVVESU9fU1RSRUFNX0FMQVJNIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0VfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX0VBUlBJRUNFX1ZPTFVNRV9DVVJWRSIvPgogICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fQUxBUk0iIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZj0iREVGQVVMVF9OT05fTVVUQUJMRV9FWFRfVk9MVU1FX0NVUlZFIi8+CisgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9BTEFSTSIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9IkRFRkFVTFRfTk9OX01VVEFCTEVfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CiAgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04iIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9IRUFEU0VUX1ZPTFVNRV9DVVJWRSIvPgogICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgpAQCAtOTksNiArMTA5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9FQVJQSUVDRV9WT0xVTUVfQ1VSVkUiLz4KICAgICA8dm9sdW1lIHN0cmVhbT0iQVVESU9fU1RSRUFNX05PVElGSUNBVElPTiIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBX1ZPTFVNRV9DVVJWRSIvPgorICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0hFQURTRVRfVk9MVU1FX0NVUlZFIi8+CiAgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiPgogICAgICAgICA8cG9pbnQ+MCwtNDIwMDwvcG9pbnQ+CiAgICAgICAgIDxwb2ludD4zMywtMjgwMDwvcG9pbnQ+CkBAIC0xMTksNiArMTMxLDggQEAKICAgICA8L3ZvbHVtZT4KICAgICA8dm9sdW1lIHN0cmVhbT0iQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08iIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPSJERUZBVUxUX01FRElBX1ZPTFVNRV9DVVJWRSIvPgorICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTyIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZj0iREVGQVVMVF9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUiLz4KICAgICA8dm9sdW1lIHN0cmVhbT0iQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUiIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCI+CiAgICAgICAgIDxwb2ludD4xLC0zMDAwPC9wb2ludD4KICAgICAgICAgPHBvaW50PjMzLC0yNjAwPC9wb2ludD4KQEAgLTEzMSw2ICsxNDUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPSJERUZBVUxUX1NZU1RFTV9WT0xVTUVfQ1VSVkUiLz4KICAgICA8dm9sdW1lIHN0cmVhbT0iQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUiIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9FWFRfTUVESUFfVk9MVU1FX0NVUlZFIi8+CisgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPSJERUZBVUxUX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSIvPgogICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fRFRNRiIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIj4KICAgICAgICAgPHBvaW50PjEsLTMwMDA8L3BvaW50PgogICAgICAgICA8cG9pbnQ+MzMsLTI2MDA8L3BvaW50PgpAQCAtMTQzLDYgKzE1OSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9IkRFRkFVTFRfU1lTVEVNX1ZPTFVNRV9DVVJWRSIvPgogICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fRFRNRiIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8dm9sdW1lIHN0cmVhbT0iQVVESU9fU1RSRUFNX0RUTUYiIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9IkRFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CiAgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9UVFMiIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPSJTSUxFTlRfVk9MVU1FX0NVUlZFIi8+CiAgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9UVFMiIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIKQEAgLTE1MSwxNCArMTY5LDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZj0iU0lMRU5UX1ZPTFVNRV9DVVJWRSIvPgogICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fVFRTIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPSJTSUxFTlRfVk9MVU1FX0NVUlZFIi8+CisgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9UVFMiIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZj0iU0lMRU5UX1ZPTFVNRV9DVVJWRSIvPgogICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPSJERUZBVUxUX01FRElBX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX1ZPTFVNRV9DVVJWRSIvPgogICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9TUEVBS0VSX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX1NQRUFLRVJfVk9MVU1FX0NVUlZFIi8+CiAgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPSJERUZBVUxUX01FRElBX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX1ZPTFVNRV9DVVJWRSIvPgogICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9IkRFRkFVTFRfTUVESUFfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9IkRFRkFVTFRfTk9OX01VVEFCTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSIvPgogICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fUkVST1VUSU5HIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KICAgICA8dm9sdW1lIHN0cmVhbT0iQVVESU9fU1RSRUFNX1JFUk9VVElORyIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIgpAQCAtMTY3LDYgKzE4OSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KICAgICA8dm9sdW1lIHN0cmVhbT0iQVVESU9fU1RSRUFNX1JFUk9VVElORyIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8dm9sdW1lIHN0cmVhbT0iQVVESU9fU1RSRUFNX1JFUk9VVElORyIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgogICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fUEFUQ0giIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIi8+CiAgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9QQVRDSCIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIgpAQCAtMTc1LDUgKzE5OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgogICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fUEFUQ0giIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8dm9sdW1lIHN0cmVhbT0iQVVESU9fU1RSRUFNX1BBVENIIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KIDwvdm9sdW1lcz4KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2RlZmF1bHRfdm9sdW1lX3RhYmxlcy54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvZGVmYXVsdF92b2x1bWVfdGFibGVzLnhtbAppbmRleCA5YTIyYjFkLi4yMDdiZTQxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvZGVmYXVsdF92b2x1bWVfdGFibGVzLnhtbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvZGVmYXVsdF92b2x1bWVfdGFibGVzLnhtbApAQCAtNjcsNCArNjcsNjMgQEAKICAgICAgICAgPHBvaW50PjYwLC0yMTAwPC9wb2ludD4KICAgICAgICAgPHBvaW50PjEwMCwtMTAwMDwvcG9pbnQ+CiAgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLSBEZWZhdWx0IEhlYXJpbmcgQWlkIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICAgICAgPHBvaW50PjEsLTEyNzAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjIwLC04MDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjYwLC00MDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisgICAgPCEtLSBOb24tbXV0YWJsZSBkZWZhdWx0IHZvbHVtZSBjdXJ2ZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICAgIDwhLS0gICAgICogZmlyc3QgcG9pbnQgaXMgYWx3YXlzIGZvciBpbmRleCAwICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgICA8IS0tICAgICAqIGF0dGVudWF0aW9uIGlzIHNtYWxsIGVub3VnaCB0aGF0IHN0cmVhbSBjYW4gc3RpbGwgYmUgaGVhcmQgLS0+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX05PTl9NVVRBQkxFX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLSBEZWZhdWx0IG5vbi1tdXRhYmxlIHJlZmVyZW5jZSBWb2x1bWUgQ3VydmUgLS0+CisgICAgPCEtLSAgICAgICAgYmFzZWQgb24gREVGQVVMVF9NRURJQV9WT0xVTUVfQ1VSVkUgLS0+CisgICAgICAgIDxwb2ludD4wLC01ODAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjIwLC00MDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjYwLC0xNzAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfTk9OX01VVEFCTEVfSEVBRFNFVF9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS1EZWZhdWx0IG5vbi1tdXRhYmxlIFZvbHVtZSBDdXJ2ZSBmb3IgaGVhZHNldCAtLT4KKyAgICA8IS0tICAgIGJhc2VkIG9uIERFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0hFQURTRVRfVk9MVU1FX0NVUlZFIC0tPgorICAgICAgICA8cG9pbnQ+MCwtNDk1MDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4zMywtMzM1MDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42NiwtMTcwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX05PTl9NVVRBQkxFX1NQRUFLRVJfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIERlZmF1bHQgbm9uLW11dGFibGUgU3BlYWtlciBWb2x1bWUgQ3VydmUgLS0+CisgICAgPCEtLSAgICBiYXNlZCBvbiBERUZBVUxUX0RFVklDRV9DQVRFR09SWV9TUEVBS0VSX1ZPTFVNRV9DVVJWRSAtLT4KKyAgICAgICAgPHBvaW50PjAsLTU4MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MjAsLTQwMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjAsLTE3MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9OT05fTVVUQUJMRV9FQVJQSUVDRV9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS1EZWZhdWx0IG5vbi1tdXRhYmxlIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICA8IS0tICAgIGJhc2VkIG9uIERFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFX1ZPTFVNRV9DVVJWRSAtLT4KKyAgICAgICAgPHBvaW50PjAsLTQ5NTA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MzMsLTMzNTA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjYsLTE3MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9OT05fTVVUQUJMRV9FWFRfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIERlZmF1bHQgbm9uLW11dGFibGUgRXh0IE1lZGlhIFN5c3RlbSBWb2x1bWUgQ3VydmUgLS0+CisgICAgPCEtLSAgICAgYmFzZWQgb24gREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBX1ZPTFVNRV9DVVJWRSAtLT4KKyAgICAgICAgPHBvaW50PjAsLTU4MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MjAsLTQwMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjAsLTIxMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLC0xMDAwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfTk9OX01VVEFCTEVfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIERlZmF1bHQgbm9uLW11dGFibGUgSGVhcmluZyBBaWQgVm9sdW1lIEN1cnZlIC0tPgorICAgIDwhLS0gICAgIGJhc2VkIG9uIERFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIC0tPgorICAgICAgICA8cG9pbnQ+MCwtMTI3MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MjAsLTgwMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjAsLTQwMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgogPC92b2x1bWVzPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2hlYXJpbmdfYWlkX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9oZWFyaW5nX2FpZF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M0OGU4OAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9oZWFyaW5nX2FpZF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKQEAgLTAsMCArMSwxNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gSGVhcmluZyBhaWQgQXVkaW8gSEFMIEF1ZGlvIFBvbGljeSBDb25maWd1cmF0aW9uIGZpbGUgLS0+Cis8bW9kdWxlIG5hbWU9ImhlYXJpbmdfYWlkIiBoYWxWZXJzaW9uPSIyLjAiPgorICAgIDxtaXhQb3J0cz4KKyAgICAgICAgPG1peFBvcnQgbmFtZT0iaGVhcmluZyBhaWQgb3V0cHV0IiByb2xlPSJzb3VyY2UiIGZsYWdzPSJBVURJT19PVVRQVVRfRkxBR19QUklNQVJZIj4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjI0MDAwLDE2MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KKyAgICAgICAgPC9taXhQb3J0PgorICAgIDwvbWl4UG9ydHM+CisgICAgPGRldmljZVBvcnRzPgorICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCVCBIZWFyaW5nIEFpZCBPdXQiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQiIHJvbGU9InNpbmsiLz4KKyAgICA8L2RldmljZVBvcnRzPgorICAgIDxyb3V0ZXM+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IkJUIEhlYXJpbmcgQWlkIE91dCIgc291cmNlcz0iaGVhcmluZyBhaWQgb3V0cHV0Ii8+CisgICAgPC9yb3V0ZXM+Cis8L21vZHVsZT4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZS5oCmluZGV4IDU2N2ZmOWUuLjA0NTk0ZjUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9BdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaApAQCAtMTM3LDQgKzEzNyw0IEBACiAgICAgdmlydHVhbCB+QXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlKCkge30KIH07CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyLmgKaW5kZXggODQ2ZmE0OC4uYjc5MDJjZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9BdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIuaApAQCAtNTksNCArNTksNCBAQAogICAgIHZpcnR1YWwgfkF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyKCkge30KIH07CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW5jbHVkZS9BdWRpb1BvbGljeUVuZ2luZUluc3RhbmNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW5jbHVkZS9BdWRpb1BvbGljeUVuZ2luZUluc3RhbmNlLmgKaW5kZXggNmM0YmUyYy4uYTU5N2U4NyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2luY2x1ZGUvQXVkaW9Qb2xpY3lFbmdpbmVJbnN0YW5jZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbmNsdWRlL0F1ZGlvUG9saWN5RW5naW5lSW5zdGFuY2UuaApAQCAtNzYsNiArNzYsNiBAQAogdGVtcGxhdGUgPD4KIEF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlICpFbmdpbmVJbnN0YW5jZTo6cXVlcnlJbnRlcmZhY2UoKSBjb25zdDsKIAotfTsgLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQorfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlLmgKaW5kZXggNzU5ZDBjOS4uMmUyOWE5YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2ludGVyZmFjZS9BdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UuaApAQCAtMTQzLDQgKzE0Myw0IEBACiAgICAgdmlydHVhbCB+QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UoKSB7fQogfTsKIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZS5oCmluZGV4IGJjNWUwMzUuLjMyOGQyM2QgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmUuaApAQCAtMTk0LDcgKzE5NCw3IEBACiAgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIgKm1BcG1PYnNlcnZlcjsKIH07CiAKLX07IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKK30gLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9hdWRpb19wb2xpY3lfY3JpdGVyaWFfY29uZi5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvYXVkaW9fcG9saWN5X2NyaXRlcmlhX2NvbmYuaAppbmRleCAzMWI3ZTBmLi5lNGZkMTc2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9hdWRpb19wb2xpY3lfY3JpdGVyaWFfY29uZi5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL2F1ZGlvX3BvbGljeV9jcml0ZXJpYV9jb25mLmgKQEAgLTYyLDcgKzYyLDggQEAKICAgICBbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9ET0NLXSA9ICAgICAgICAgICAgICAgICAiRm9yY2VVc2VGb3JEb2NrIiwKICAgICBbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU1dID0gICAgICAgICAgICAgICAiRm9yY2VVc2VGb3JTeXN0ZW0iLAogICAgIFtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0hETUlfU1lTVEVNX0FVRElPXSA9ICAgICJGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpbyIsCi0gICAgW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfRU5DT0RFRF9TVVJST1VORF0gPSAgICAgIkZvcmNlVXNlRm9yRW5jb2RlZFN1cnJvdW5kIgorICAgIFtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkRdID0gICAgICJGb3JjZVVzZUZvckVuY29kZWRTdXJyb3VuZCIsCisgICAgW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfVklCUkFURV9SSU5HSU5HXSA9ICAgICAgIkZvcmNlVXNlRm9yVmlicmF0ZVJpbmdpbmciCiB9OwogCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0VuZ2luZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9FbmdpbmUuY3BwCmluZGV4IDliZGI5OGMuLjNlMTNlNTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0VuZ2luZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmNwcApAQCAtMTQ4LDEyICsxNDgsMjAgQEAKICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRU5DT0RFRF9TVVJST1VORDoKICAgICAgICAgaWYgKGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSAmJgogICAgICAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9ORVZFUiAmJgotICAgICAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9BTFdBWVMpIHsKKyAgICAgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfQUxXQVlTICYmCisgICAgICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX01BTlVBTCkgewogICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9yIEVOQ09ERURfU1VSUk9VTkQiLCBjb25maWcpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogICAgICAgICBtRm9yY2VVc2VbdXNhZ2VdID0gY29uZmlnOwogICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfVklCUkFURV9SSU5HSU5HOgorICAgICAgICBpZiAoY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08gJiYgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT05FKSB7CisgICAgICAgICAgICBBTE9HVygic2V0Rm9yY2VVc2UoKSBpbnZhbGlkIGNvbmZpZyAlZCBmb3IgRk9SX1ZJQlJBVEVfUklOR0lORyIsIGNvbmZpZyk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7CisgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgdXNhZ2UgJWQiLCB1c2FnZSk7CiAgICAgICAgIGJyZWFrOyAvLyBUT0RPIHJldHVybiBCQURfVkFMVUU/CkBAIC0yMzgsMTggKzI0NiwxOSBAQAogICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZvdXRwdXRzID0gbUFwbU9ic2VydmVyLT5nZXRPdXRwdXRzKCk7CiAKICAgICByZXR1cm4gZ2V0RGV2aWNlRm9yU3RyYXRlZ3lJbnQoc3RyYXRlZ3ksIGF2YWlsYWJsZU91dHB1dERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUlucHV0RGV2aWNlcywgb3V0cHV0cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUlucHV0RGV2aWNlcywgb3V0cHV0cywgKHVpbnQzMl90KUFVRElPX0RFVklDRV9OT05FKTsKIH0KIAogCi0KIGF1ZGlvX2RldmljZXNfdCBFbmdpbmU6OmdldERldmljZUZvclN0cmF0ZWd5SW50KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciBhdmFpbGFibGVJbnB1dERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiAmb3V0cHV0cykgY29uc3QKKyAgICAgICAgRGV2aWNlVmVjdG9yIGF2YWlsYWJsZU91dHB1dERldmljZXMsCisgICAgICAgIERldmljZVZlY3RvciBhdmFpbGFibGVJbnB1dERldmljZXMsCisgICAgICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZvdXRwdXRzLAorICAgICAgICB1aW50MzJfdCBvdXRwdXREZXZpY2VUeXBlc1RvSWdub3JlKSBjb25zdAogewogICAgIHVpbnQzMl90IGRldmljZSA9IEFVRElPX0RFVklDRV9OT05FOwotICAgIHVpbnQzMl90IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpOworICAgIHVpbnQzMl90IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlID0KKyAgICAgICAgICAgIGF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSAmIH5vdXRwdXREZXZpY2VUeXBlc1RvSWdub3JlOwogCiAgICAgc3dpdGNoIChzdHJhdGVneSkgewogCkBAIC0yNTgsNDAgKzI2NywyNiBAQAogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUw6Ci0gICAgICAgIGlmIChpc0luQ2FsbCgpKSB7CisgICAgICAgIGlmIChpc0luQ2FsbCgpIHx8IG91dHB1dHMuaXNTdHJlYW1BY3RpdmVMb2NhbGx5KEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSkgewogICAgICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3lJbnQoCi0gICAgICAgICAgICAgICAgICAgIFNUUkFURUdZX1NPTklGSUNBVElPTiwgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgYXZhaWxhYmxlSW5wdXREZXZpY2VzLCBvdXRwdXRzKTsKLSAgICAgICAgfSBlbHNlIGlmIChvdXRwdXRzLmlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoQVVESU9fU1RSRUFNX01VU0lDLAotICAgICAgICAgICAgICAgIFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZKSkgewotICAgICAgICAgICAgLy8gd2hpbGUgbWVkaWEgaXMgcGxheWluZyBvbiBhIHJlbW90ZSBkZXZpY2UsIHVzZSB0aGUgdGhlIHNvbmlmaWNhdGlvbiBiZWhhdmlvci4KLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSB0ZXN0IHRoaXMgdXNlY2FzZSBiZWZvcmUgdGVzdGluZyBpZiBtZWRpYSBpcyBwbGF5aW5nIGJlY2F1c2UKLSAgICAgICAgICAgIC8vICAgdGhlIGlzU3RyZWFtQWN0aXZlKCkgbWV0aG9kIG9ubHkgaW5mb3JtcyBhYm91dCB0aGUgYWN0aXZpdHkgb2YgYSBzdHJlYW0sIG5vdAotICAgICAgICAgICAgLy8gICBpZiBpdCdzIGZvciBsb2NhbCBwbGF5YmFjay4gTm90ZSBhbHNvIHRoYXQgd2UgdXNlIHRoZSBzYW1lIGRlbGF5IGJldHdlZW4gYm90aCB0ZXN0cwotICAgICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3lJbnQoCi0gICAgICAgICAgICAgICAgICAgIFNUUkFURUdZX1NPTklGSUNBVElPTiwgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgYXZhaWxhYmxlSW5wdXREZXZpY2VzLCBvdXRwdXRzKTsKLSAgICAgICAgICAgIC8vdXNlciAic2FmZSIgc3BlYWtlciBpZiBhdmFpbGFibGUgaW5zdGVhZCBvZiBub3JtYWwgc3BlYWtlciB0byBhdm9pZCB0cmlnZ2VyaW5nCi0gICAgICAgICAgICAvL290aGVyIGFjb3VzdGljIHNhZmV0eSBtZWNoYW5pc21zIGZvciBub3RpZmljYXRpb24KLSAgICAgICAgICAgIGlmICgoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKSAmJgotICAgICAgICAgICAgICAgICAgICAoYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRSkpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2UgfD0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkU7Ci0gICAgICAgICAgICAgICAgZGV2aWNlICY9IH5BVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAob3V0cHV0cy5pc1N0cmVhbUFjdGl2ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX01VU0lDLCBTT05JRklDQVRJT05fUkVTUEVDVEZVTF9BRlRFUl9NVVNJQ19ERUxBWSkKLSAgICAgICAgICAgICAgICAgICAgfHwgb3V0cHV0cy5pc1N0cmVhbUFjdGl2ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSwgU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUxfQUZURVJfTVVTSUNfREVMQVkpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyB3aGlsZSBtZWRpYS9hMTF5IGlzIHBsYXlpbmcgKG9yIGhhcyByZWNlbnRseSBwbGF5ZWQpLCB1c2UgdGhlIHNhbWUgZGV2aWNlCi0gICAgICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneUludCgKLSAgICAgICAgICAgICAgICAgICAgU1RSQVRFR1lfTUVESUEsIGF2YWlsYWJsZU91dHB1dERldmljZXMsIGF2YWlsYWJsZUlucHV0RGV2aWNlcywgb3V0cHV0cyk7CisgICAgICAgICAgICAgICAgICAgIFNUUkFURUdZX1NPTklGSUNBVElPTiwgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgYXZhaWxhYmxlSW5wdXREZXZpY2VzLCBvdXRwdXRzLAorICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXZpY2VUeXBlc1RvSWdub3JlKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHdoZW4gbWVkaWEgaXMgbm90IHBsYXlpbmcgYW55bW9yZSwgZmFsbCBiYWNrIG9uIHRoZSBzb25pZmljYXRpb24gYmVoYXZpb3IKLSAgICAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5SW50KAotICAgICAgICAgICAgICAgICAgICBTVFJBVEVHWV9TT05JRklDQVRJT04sIGF2YWlsYWJsZU91dHB1dERldmljZXMsIGF2YWlsYWJsZUlucHV0RGV2aWNlcywgb3V0cHV0cyk7Ci0gICAgICAgICAgICAvL3VzZXIgInNhZmUiIHNwZWFrZXIgaWYgYXZhaWxhYmxlIGluc3RlYWQgb2Ygbm9ybWFsIHNwZWFrZXIgdG8gYXZvaWQgdHJpZ2dlcmluZwotICAgICAgICAgICAgLy9vdGhlciBhY291c3RpYyBzYWZldHkgbWVjaGFuaXNtcyBmb3Igbm90aWZpY2F0aW9uCi0gICAgICAgICAgICBpZiAoKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUikgJiYKLSAgICAgICAgICAgICAgICAgICAgKGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkUpKSB7CisgICAgICAgICAgICBib29sIG1lZGlhX2FjdGl2ZV9sb2NhbGx5ID0KKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0cy5pc1N0cmVhbUFjdGl2ZUxvY2FsbHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX01VU0lDLCBTT05JRklDQVRJT05fUkVTUEVDVEZVTF9BRlRFUl9NVVNJQ19ERUxBWSkKKyAgICAgICAgICAgICAgICAgICAgfHwgb3V0cHV0cy5pc1N0cmVhbUFjdGl2ZUxvY2FsbHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFksIFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZKTsKKyAgICAgICAgICAgIC8vIHJvdXRpbmcgaXMgc2FtZSBhcyBtZWRpYSB3aXRob3V0IHRoZSAicmVtb3RlIiBkZXZpY2UKKyAgICAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5SW50KFNUUkFURUdZX01FRElBLAorICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVJbnB1dERldmljZXMsIG91dHB1dHMsCisgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCB8IG91dHB1dERldmljZVR5cGVzVG9JZ25vcmUpOworICAgICAgICAgICAgLy8gaWYgbm8gbWVkaWEgaXMgcGxheWluZyBvbiB0aGUgZGV2aWNlLCBjaGVjayBmb3IgbWFuZGF0b3J5IHVzZSBvZiAic2FmZSIgc3BlYWtlcgorICAgICAgICAgICAgLy8gd2hlbiBtZWRpYSB3b3VsZCBoYXZlIHBsYXllZCBvbiBzcGVha2VyLCBhbmQgdGhlIHNhZmUgc3BlYWtlciBwYXRoIGlzIGF2YWlsYWJsZQorICAgICAgICAgICAgaWYgKCFtZWRpYV9hY3RpdmVfbG9jYWxseQorICAgICAgICAgICAgICAgICAgICAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKQorICAgICAgICAgICAgICAgICAgICAmJiAoYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRSkpIHsKICAgICAgICAgICAgICAgICBkZXZpY2UgfD0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkU7CiAgICAgICAgICAgICAgICAgZGV2aWNlICY9IH5BVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CiAgICAgICAgICAgICB9CkBAIC0zMDIsNyArMjk3LDggQEAKICAgICAgICAgaWYgKCFpc0luQ2FsbCgpKSB7CiAgICAgICAgICAgICAvLyB3aGVuIG9mZiBjYWxsLCBEVE1GIHN0cmF0ZWd5IGZvbGxvd3MgdGhlIHNhbWUgcnVsZXMgYXMgTUVESUEgc3RyYXRlZ3kKICAgICAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5SW50KAotICAgICAgICAgICAgICAgICAgICBTVFJBVEVHWV9NRURJQSwgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgYXZhaWxhYmxlSW5wdXREZXZpY2VzLCBvdXRwdXRzKTsKKyAgICAgICAgICAgICAgICAgICAgU1RSQVRFR1lfTUVESUEsIGF2YWlsYWJsZU91dHB1dERldmljZXMsIGF2YWlsYWJsZUlucHV0RGV2aWNlcywgb3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGV2aWNlVHlwZXNUb0lnbm9yZSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICAvLyB3aGVuIGluIGNhbGwsIERUTUYgYW5kIFBIT05FIHN0cmF0ZWdpZXMgZm9sbG93IHRoZSBzYW1lIHJ1bGVzCkBAIC0zMTgsOCArMzE0LDE0IEBACiAgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IHByaW1hcnlPdXRwdXQgPSBvdXRwdXRzLmdldFByaW1hcnlPdXRwdXQoKTsKICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBhdmFpbFByaW1hcnlJbnB1dERldmljZXMgPQogICAgICAgICAgICAgICAgICBhdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21Id01vZHVsZShwcmltYXJ5T3V0cHV0LT5nZXRNb2R1bGVIYW5kbGUoKSk7CisKKyAgICAgICAgICAgIC8vIFRPRE86IGdldFByaW1hcnlPdXRwdXQgcmV0dXJuIG9ubHkgZGV2aWNlcyBmcm9tIGZpcnN0IG1vZHVsZSBpbgorICAgICAgICAgICAgLy8gYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sLCBoZWFyaW5nIGFpZCBpcyBub3QgdGhlcmUsIGJ1dCBpdCdzCisgICAgICAgICAgICAvLyBhIHByaW1hcnkgZGV2aWNlCisgICAgICAgICAgICAvLyBGSVhNRTogdGhpcyBpcyBub3QgdGhlIHJpZ2h0IHdheSBvZiBzb2x2aW5nIHRoaXMgcHJvYmxlbQogICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGF2YWlsUHJpbWFyeU91dHB1dERldmljZXMgPQotICAgICAgICAgICAgICAgICAgICBwcmltYXJ5T3V0cHV0LT5zdXBwb3J0ZWREZXZpY2VzKCkgJiBhdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCk7CisgICAgICAgICAgICAgICAgKHByaW1hcnlPdXRwdXQtPnN1cHBvcnRlZERldmljZXMoKSB8IEFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQpICYKKyAgICAgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCk7CiAKICAgICAgICAgICAgIGlmICgoKGF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpICYKICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1RFTEVQSE9OWV9SWCAmIH5BVURJT19ERVZJQ0VfQklUX0lOKSA9PSAwKSB8fApAQCAtMzQ0LDEwICszNDYsMTIgQEAKICAgICAgICAgICAgIC8vIEZBTEwgVEhST1VHSAogCiAgICAgICAgIGRlZmF1bHQ6ICAgIC8vIEZPUkNFX05PTkUKKyAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9IRUFSSU5HX0FJRDsKKyAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOwogICAgICAgICAgICAgLy8gd2hlbiBub3QgaW4gYSBwaG9uZSBjYWxsLCBwaG9uZSBzdHJhdGVneSBzaG91bGQgcm91dGUgU1RSRUFNX1ZPSUNFX0NBTEwgdG8gQTJEUAogICAgICAgICAgICAgaWYgKCFpc0luQ2FsbCgpICYmCiAgICAgICAgICAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQV0gIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PX0JUX0EyRFApICYmCi0gICAgICAgICAgICAgICAgICAgIChvdXRwdXRzLmdldEEyZHBPdXRwdXQoKSAhPSAwKSkgeworICAgICAgICAgICAgICAgICAgICAgb3V0cHV0cy5pc0EyZHBTdXBwb3J0ZWQoKSkgewogICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUDsKICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKICAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUzsKQEAgLTM4MSw3ICszODUsNyBAQAogICAgICAgICAgICAgLy8gQTJEUCBzcGVha2VyIHdoZW4gZm9yY2luZyB0byBzcGVha2VyIG91dHB1dAogICAgICAgICAgICAgaWYgKCFpc0luQ2FsbCgpICYmCiAgICAgICAgICAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQV0gIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PX0JUX0EyRFApICYmCi0gICAgICAgICAgICAgICAgICAgIChvdXRwdXRzLmdldEEyZHBPdXRwdXQoKSAhPSAwKSkgeworICAgICAgICAgICAgICAgICAgICAgb3V0cHV0cy5pc0EyZHBTdXBwb3J0ZWQoKSkgewogICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSOwogICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtNDA2LDkgKzQxMCwxMCBAQAogCiAgICAgICAgIC8vIElmIGluY2FsbCwganVzdCBzZWxlY3QgdGhlIFNUUkFURUdZX1BIT05FIGRldmljZTogVGhlIHJlc3Qgb2YgdGhlIGJlaGF2aW9yIGlzIGhhbmRsZWQgYnkKICAgICAgICAgLy8gaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkuCi0gICAgICAgIGlmIChpc0luQ2FsbCgpKSB7CisgICAgICAgIGlmIChpc0luQ2FsbCgpIHx8IG91dHB1dHMuaXNTdHJlYW1BY3RpdmVMb2NhbGx5KEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSkgewogICAgICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3lJbnQoCi0gICAgICAgICAgICAgICAgICAgIFNUUkFURUdZX1BIT05FLCBhdmFpbGFibGVPdXRwdXREZXZpY2VzLCBhdmFpbGFibGVJbnB1dERldmljZXMsIG91dHB1dHMpOworICAgICAgICAgICAgICAgICAgICBTVFJBVEVHWV9QSE9ORSwgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgYXZhaWxhYmxlSW5wdXREZXZpY2VzLCBvdXRwdXRzLAorICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXZpY2VUeXBlc1RvSWdub3JlKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIC8vIEZBTEwgVEhST1VHSApAQCAtNDI2LDggKzQzMSw3IEBACiAKICAgICAgICAgLy8gaWYgU0NPIGhlYWRzZXQgaXMgY29ubmVjdGVkIGFuZCB3ZSBhcmUgdG9sZCB0byB1c2UgaXQsIHBsYXkgcmluZ3RvbmUgb3ZlcgogICAgICAgICAvLyBzcGVha2VyIGFuZCBCVCBTQ08KLSAgICAgICAgaWYgKCgoYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9TQ08pICE9IDApICYmCi0gICAgICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT05dID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pKSB7CisgICAgICAgIGlmICgoYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9TQ08pICE9IDApIHsKICAgICAgICAgICAgIHVpbnQzMl90IGRldmljZTIgPSBBVURJT19ERVZJQ0VfTk9ORTsKICAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19DQVJLSVQ7CiAgICAgICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewpAQCAtNDM2LDEwICs0NDAsMjkgQEAKICAgICAgICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7CiAgICAgICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZGV2aWNlMiAhPSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgICAgIGRldmljZSB8PSBkZXZpY2UyOwotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgLy8gVXNlIE9OTFkgQmx1ZXRvb3RoIFNDTyBvdXRwdXQgd2hlbiByaW5naW5nIGluIHZpYnJhdGlvbiBtb2RlCisgICAgICAgICAgICBpZiAoISgobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfU1lTVEVNX0VORk9SQ0VEKQorICAgICAgICAgICAgICAgICAgICAmJiAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSkpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1ZJQlJBVEVfUklOR0lOR10KKyAgICAgICAgICAgICAgICAgICAgICAgID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRldmljZTIgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSA9IGRldmljZTI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFVzZSBib3RoIEJsdWV0b290aCBTQ08gYW5kIHBob25lIGRlZmF1bHQgb3V0cHV0IHdoZW4gcmluZ2luZyBpbiBub3JtYWwgbW9kZQorICAgICAgICAgICAgaWYgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT05dID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pIHsKKyAgICAgICAgICAgICAgICBpZiAoKHN0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlIHw9IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFOworICAgICAgICAgICAgICAgICAgICBkZXZpY2UgJj0gfkFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGRldmljZTIgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlIHw9IGRldmljZTI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAvLyBUaGUgc2Vjb25kIGRldmljZSB1c2VkIGZvciBzb25pZmljYXRpb24gaXMgdGhlIHNhbWUgYXMgdGhlIGRldmljZSB1c2VkIGJ5IG1lZGlhIHN0cmF0ZWd5CkBAIC00NjMsMTEgKzQ4NiwxMyBAQAogICAgICAgICAgICAgaWYgKG91dHB1dHMuaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX1JJTkcpIHx8CiAgICAgICAgICAgICAgICAgICAgIG91dHB1dHMuaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX0FMQVJNKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBnZXREZXZpY2VGb3JTdHJhdGVneUludCgKLSAgICAgICAgICAgICAgICAgICAgU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCBhdmFpbGFibGVPdXRwdXREZXZpY2VzLCBhdmFpbGFibGVJbnB1dERldmljZXMsIG91dHB1dHMpOworICAgICAgICAgICAgICAgICAgICBTVFJBVEVHWV9TT05JRklDQVRJT04sIGF2YWlsYWJsZU91dHB1dERldmljZXMsIGF2YWlsYWJsZUlucHV0RGV2aWNlcywgb3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGV2aWNlVHlwZXNUb0lnbm9yZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoaXNJbkNhbGwoKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBnZXREZXZpY2VGb3JTdHJhdGVneUludCgKLSAgICAgICAgICAgICAgICAgICAgICAgIFNUUkFURUdZX1BIT05FLCBhdmFpbGFibGVPdXRwdXREZXZpY2VzLCBhdmFpbGFibGVJbnB1dERldmljZXMsIG91dHB1dHMpOworICAgICAgICAgICAgICAgICAgICAgICAgU1RSQVRFR1lfUEhPTkUsIGF2YWlsYWJsZU91dHB1dERldmljZXMsIGF2YWlsYWJsZUlucHV0RGV2aWNlcywgb3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERldmljZVR5cGVzVG9JZ25vcmUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIC8vIEZvciBvdGhlciBjYXNlcywgU1RSQVRFR1lfQUNDRVNTSUJJTElUWSBiZWhhdmVzIGxpa2UgU1RSQVRFR1lfTUVESUEKQEAgLTQ4NiwxMiArNTExLDE2IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKGlzSW5DYWxsKCkgJiYgKHN0cmF0ZWd5ID09IFNUUkFURUdZX01FRElBKSkgewogICAgICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3lJbnQoCi0gICAgICAgICAgICAgICAgICAgIFNUUkFURUdZX1BIT05FLCBhdmFpbGFibGVPdXRwdXREZXZpY2VzLCBhdmFpbGFibGVJbnB1dERldmljZXMsIG91dHB1dHMpOworICAgICAgICAgICAgICAgICAgICBTVFJBVEVHWV9QSE9ORSwgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgYXZhaWxhYmxlSW5wdXREZXZpY2VzLCBvdXRwdXRzLAorICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXZpY2VUeXBlc1RvSWdub3JlKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CisgICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0hFQVJJTkdfQUlEOworICAgICAgICB9CiAgICAgICAgIGlmICgoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgJiYKICAgICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUFdICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT19CVF9BMkRQKSAmJgotICAgICAgICAgICAgICAgIChvdXRwdXRzLmdldEEyZHBPdXRwdXQoKSAhPSAwKSkgeworICAgICAgICAgICAgICAgICBvdXRwdXRzLmlzQTJkcFN1cHBvcnRlZCgpKSB7CiAgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQOwogICAgICAgICAgICAgaWYgKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKICAgICAgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVM7CkBAIC01OTEsNiArNjIwLDIzIEBACiAKICAgICB1aW50MzJfdCBkZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKIAorICAgIC8vIHdoZW4gYSBjYWxsIGlzIGFjdGl2ZSwgZm9yY2UgZGV2aWNlIHNlbGVjdGlvbiB0byBtYXRjaCBzb3VyY2UgVk9JQ0VfQ09NTVVOSUNBVElPTgorICAgIC8vIGZvciBtb3N0IG90aGVyIGlucHV0IHNvdXJjZXMgdG8gYXZvaWQgcmVyb3V0aW5nIGNhbGwgVFggYXVkaW8KKyAgICBpZiAoaXNJbkNhbGwoKSkgeworICAgICAgICBzd2l0Y2ggKGlucHV0U291cmNlKSB7CisgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX0RFRkFVTFQ6CisgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX01JQzoKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT046CisgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX1VOUFJPQ0VTU0VEOgorICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9IT1RXT1JEOgorICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9DQU1DT1JERVI6CisgICAgICAgICAgICBpbnB1dFNvdXJjZSA9IEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHN3aXRjaCAoaW5wdXRTb3VyY2UpIHsKICAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9VUExJTks6CiAgICAgICBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fVk9JQ0VfQ0FMTCkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9FbmdpbmUuaAppbmRleCA1NzUzOGM0Li4wNjE4NmMxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9FbmdpbmUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9FbmdpbmUuaApAQCAtMTI2LDkgKzEyNiwxMCBAQAogICAgIHJvdXRpbmdfc3RyYXRlZ3kgZ2V0U3RyYXRlZ3lGb3JVc2FnZShhdWRpb191c2FnZV90IHVzYWdlKTsKICAgICBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9yU3RyYXRlZ3kocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkgY29uc3Q7CiAgICAgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvclN0cmF0ZWd5SW50KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciBhdmFpbGFibGVPdXRwdXREZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlSW5wdXREZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiAmb3V0cHV0cykgY29uc3Q7CisgICAgICAgICAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywKKyAgICAgICAgICAgIERldmljZVZlY3RvciBhdmFpbGFibGVJbnB1dERldmljZXMsCisgICAgICAgICAgICBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiAmb3V0cHV0cywKKyAgICAgICAgICAgIHVpbnQzMl90IG91dHB1dERldmljZVR5cGVzVG9JZ25vcmUpIGNvbnN0OwogICAgIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSkgY29uc3Q7CiAgICAgYXVkaW9fbW9kZV90IG1QaG9uZVN0YXRlOyAgLyoqPCBjdXJyZW50IHBob25lIHN0YXRlLiAqLwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyL0F1ZGlvUG9saWN5RmFjdG9yeS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyL0F1ZGlvUG9saWN5RmFjdG9yeS5jcHAKaW5kZXggOTkxMGExZi4uM2VmYTFiMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlci9BdWRpb1BvbGljeUZhY3RvcnkuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXIvQXVkaW9Qb2xpY3lGYWN0b3J5LmNwcApAQCAtMjksNCArMjksNCBAQAogICAgIGRlbGV0ZSBpbnRlcmZhY2U7CiB9CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcAppbmRleCBiZGZhZjJmLi4zNzc1NTUxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAKQEAgLTI2LDEzICsyNiwxNCBAQAogCiAjZGVmaW5lIEFVRElPX1BPTElDWV9YTUxfQ09ORklHX0ZJTEVfUEFUSF9NQVhfTEVOR1RIIDEyOAogI2RlZmluZSBBVURJT19QT0xJQ1lfWE1MX0NPTkZJR19GSUxFX05BTUUgImF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCIKKyNkZWZpbmUgQVVESU9fUE9MSUNZX0EyRFBfT0ZGTE9BRF9ESVNBQkxFRF9YTUxfQ09ORklHX0ZJTEVfTkFNRSBcCisgICAgICAgICJhdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9hMmRwX29mZmxvYWRfZGlzYWJsZWQueG1sIgogCiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxtYXRoLmg+CiAKICNpbmNsdWRlIDxBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxBdWRpb1BvbGljeUVuZ2luZUluc3RhbmNlLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KQEAgLTU5LDYgKzYwLDI2IEBACiAvLyBtZWRpYSAvIG5vdGlmaWNhdGlvbiAvIHN5c3RlbSB2b2x1bWUuCiBjb25zdGV4cHIgZmxvYXQgSU5fQ0FMTF9FQVJQSUVDRV9IRUFEUk9PTV9EQiA9IDMuZjsKIAorI2RlZmluZSBBUlJBWV9TSVpFKGEpIChzaXplb2YoYSkgLyBzaXplb2YoKGEpWzBdKSkKKy8vIEFycmF5IG9mIGFsbCBzdXJyb3VuZCBmb3JtYXRzLgorc3RhdGljIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IFNVUlJPVU5EX0ZPUk1BVFNbXSA9IHsKKyAgICBBVURJT19GT1JNQVRfQUMzLAorICAgIEFVRElPX0ZPUk1BVF9FX0FDMywKKyAgICBBVURJT19GT1JNQVRfRFRTLAorICAgIEFVRElPX0ZPUk1BVF9EVFNfSEQsCisgICAgQVVESU9fRk9STUFUX0FBQ19MQywKKyAgICBBVURJT19GT1JNQVRfRE9MQllfVFJVRUhELAorICAgIEFVRElPX0ZPUk1BVF9FX0FDM19KT0MsCit9OworLy8gQXJyYXkgb2YgYWxsIEFBQyBmb3JtYXRzLiBXaGVuIEFBQyBpcyBlbmFibGVkIGJ5IHVzZXJzLCBhbGwgQUFDIGZvcm1hdHMgc2hvdWxkIGJlIGVuYWJsZWQuCitzdGF0aWMgY29uc3QgYXVkaW9fZm9ybWF0X3QgQUFDX0ZPUk1BVFNbXSA9IHsKKyAgICBBVURJT19GT1JNQVRfQUFDX0xDLAorICAgIEFVRElPX0ZPUk1BVF9BQUNfSEVfVjEsCisgICAgQVVESU9fRk9STUFUX0FBQ19IRV9WMiwKKyAgICBBVURJT19GT1JNQVRfQUFDX0VMRCwKKyAgICBBVURJT19GT1JNQVRfQUFDX1hIRSwKK307CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEF1ZGlvUG9saWN5SW50ZXJmYWNlIGltcGxlbWVudGF0aW9uCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC02OCw3ICs4OSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKQogewotICAgIHJldHVybiBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoZGV2aWNlLCBzdGF0ZSwgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoZGV2aWNlLCBzdGF0ZSwgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lKTsKKyAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOworICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpicm9hZGNhc3REZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKQEAgLTg4LDcgKzExMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSkKIHsKICAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KCkgZGV2aWNlOiAweCVYLCBzdGF0ZSAlZCwgYWRkcmVzcyAlcyBuYW1lICVzIiwKLS0gICAgICAgICAgICBkZXZpY2UsIHN0YXRlLCBkZXZpY2VfYWRkcmVzcywgZGV2aWNlX25hbWUpOworICAgICAgICAgICAgZGV2aWNlLCBzdGF0ZSwgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lKTsKIAogICAgIC8vIGNvbm5lY3QvZGlzY29ubmVjdCBvbmx5IDEgZGV2aWNlIGF0IGEgdGltZQogICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpICYmICFhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlKSkgcmV0dXJuIEJBRF9WQUxVRTsKQEAgLTE4MywxNCArMjA2LDE0IEBACiAgICAgICAgIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpOwogICAgICAgICAvLyBvdXRwdXRzIG11c3QgYmUgY2xvc2VkIGFmdGVyIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpIGlzIGV4ZWN1dGVkCiAgICAgICAgIGlmICghb3V0cHV0cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0c1tpXSk7CisgICAgICAgICAgICBmb3IgKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA6IG91dHB1dHMpIHsKKyAgICAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CiAgICAgICAgICAgICAgICAgLy8gY2xvc2UgdW51c2VkIG91dHB1dHMgYWZ0ZXIgZGV2aWNlIGRpc2Nvbm5lY3Rpb24gb3IgZGlyZWN0IG91dHB1dHMgdGhhdCBoYXZlIGJlZW4KICAgICAgICAgICAgICAgICAvLyBvcGVuZWQgYnkgY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgdG8gcXVlcnkgZHluYW1pYyBwYXJhbWV0ZXJzCiAgICAgICAgICAgICAgICAgaWYgKChzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgKCgoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSAhPSAwKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgIChkZXNjLT5tRGlyZWN0T3BlbkNvdW50ID09IDApKSkgewotICAgICAgICAgICAgICAgICAgICBjbG9zZU91dHB1dChvdXRwdXRzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgY2xvc2VPdXRwdXQob3V0cHV0KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBjaGVjayBhZ2FpbiBhZnRlciBjbG9zaW5nIEEyRFAgb3V0cHV0IHRvIHJlc2V0IG1BMmRwU3VzcGVuZGVkIGlmIG5lZWRlZApAQCAtMzQ1LDYgKzM2OCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSkKIHsKICAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgU3RyaW5nOCByZXBseTsKKyAgICBBdWRpb1BhcmFtZXRlciBwYXJhbTsKKyAgICBpbnQgaXNSZWNvbmZpZ0EyZHBTdXBwb3J0ZWQgPSAwOwogCiAgICAgQUxPR1YoImhhbmRsZURldmljZUNvbmZpZ0NoYW5nZSgoKSBkZXZpY2U6IDB4JVgsIGFkZHJlc3MgJXMgbmFtZSAlcyIsCiAgICAgICAgICAgZGV2aWNlLCBkZXZpY2VfYWRkcmVzcywgZGV2aWNlX25hbWUpOwpAQCAtMzYxLDYgKzM4NywyNiBAQAogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQogCisgICAgLy8gRm9yIG9mZmxvYWRlZCBBMkRQLCBIdyBtb2R1bGVzIG1heSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvCisgICAgLy8gY29uZmlndXJlIGNvZGVjcy4gQ2hlY2sgaWYgYW55IG9mIHRoZSBsb2FkZWQgaHcgbW9kdWxlcworICAgIC8vIHN1cHBvcnRzIHRoaXMuCisgICAgLy8gSWYgc3VwcG9ydGVkLCBzZW5kIGEgc2V0IHBhcmFtZXRlciB0byBjb25maWd1cmUgQTJEUCBjb2RlY3MKKyAgICAvLyBhbmQgcmV0dXJuLiBObyBuZWVkIHRvIHRvZ2dsZSBkZXZpY2Ugc3RhdGUuCisgICAgaWYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApIHsKKyAgICAgICAgcmVwbHkgPSBtcENsaWVudEludGVyZmFjZS0+Z2V0UGFyYW1ldGVycygKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fSU9fSEFORExFX05PTkUsCisgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJlY29uZmlnQTJkcFN1cHBvcnRlZCkpOworICAgICAgICBBdWRpb1BhcmFtZXRlciByZXBsaWVkUGFyYW1ldGVycyhyZXBseSk7CisgICAgICAgIHJlcGxpZWRQYXJhbWV0ZXJzLmdldEludCgKKyAgICAgICAgICAgICAgICBTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSZWNvbmZpZ0EyZHBTdXBwb3J0ZWQpLCBpc1JlY29uZmlnQTJkcFN1cHBvcnRlZCk7CisgICAgICAgIGlmIChpc1JlY29uZmlnQTJkcFN1cHBvcnRlZCkgeworICAgICAgICAgICAgY29uc3QgU3RyaW5nOCBrZXkoQXVkaW9QYXJhbWV0ZXI6OmtleVJlY29uZmlnQTJkcCk7CisgICAgICAgICAgICBwYXJhbS5hZGQoa2V5LCBTdHJpbmc4KCJ0cnVlIikpOworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoQVVESU9fSU9fSEFORExFX05PTkUsIHBhcmFtLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorCiAgICAgLy8gVG9nZ2xlIHRoZSBkZXZpY2Ugc3RhdGU6IFVOQVZBSUxBQkxFIC0+IEFWQUlMQUJMRQogICAgIC8vIFRoaXMgd2lsbCBmb3JjZSByZWFkaW5nIGFnYWluIHRoZSBkZXZpY2UgY29uZmlndXJhdGlvbgogICAgIHN0YXR1cyA9IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsCkBAIC0zODcsOSArNDMzLDYgQEAKIHVpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6dXBkYXRlQ2FsbFJvdXRpbmcoYXVkaW9fZGV2aWNlc190IHJ4RGV2aWNlLCB1aW50MzJfdCBkZWxheU1zKQogewogICAgIGJvb2wgY3JlYXRlVHhQYXRjaCA9IGZhbHNlOwotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBhZlBhdGNoSGFuZGxlOwotICAgIERldmljZVZlY3RvciBkZXZpY2VMaXN0OwogICAgIHVpbnQzMl90IG11dGVXYWl0TXMgPSAwOwogCiAgICAgaWYoIWhhc1ByaW1hcnlPdXRwdXQoKSB8fCBtUHJpbWFyeU91dHB1dC0+ZGV2aWNlKCkgPT0gQVVESU9fREVWSUNFX09VVF9TVFVCKSB7CkBAIC00MjEsODcgKzQ2NCw1MyBAQAogICAgICAgICAgICAgY3JlYXRlVHhQYXRjaCA9IHRydWU7CiAgICAgICAgIH0KICAgICB9IGVsc2UgeyAvLyBjcmVhdGUgUlggcGF0aCBhdWRpbyBwYXRjaAotICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggcGF0Y2g7Ci0KLSAgICAgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAxOwotICAgICAgICBwYXRjaC5udW1fc2lua3MgPSAxOwotICAgICAgICBkZXZpY2VMaXN0ID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKHJ4RGV2aWNlKTsKLSAgICAgICAgQUxPR19BU1NFUlQoIWRldmljZUxpc3QuaXNFbXB0eSgpLAotICAgICAgICAgICAgICAgICAgICAidXBkYXRlQ2FsbFJvdXRpbmcoKSBzZWxlY3RlZCBkZXZpY2Ugbm90IGluIG91dHB1dCBkZXZpY2UgbGlzdCIpOwotICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiByeFNpbmtEZXZpY2VEZXNjID0gZGV2aWNlTGlzdC5pdGVtQXQoMCk7Ci0gICAgICAgIGRldmljZUxpc3QgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYKTsKLSAgICAgICAgQUxPR19BU1NFUlQoIWRldmljZUxpc3QuaXNFbXB0eSgpLAotICAgICAgICAgICAgICAgICAgICAidXBkYXRlQ2FsbFJvdXRpbmcoKSBubyB0ZWxlcGhvbnkgUlggZGV2aWNlIik7Ci0gICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHJ4U291cmNlRGV2aWNlRGVzYyA9IGRldmljZUxpc3QuaXRlbUF0KDApOwotCi0gICAgICAgIHJ4U291cmNlRGV2aWNlRGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNvdXJjZXNbMF0pOwotICAgICAgICByeFNpbmtEZXZpY2VEZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc2lua3NbMF0pOwotCi0gICAgICAgIC8vIHJlcXVlc3QgdG8gcmV1c2UgZXhpc3Rpbmcgb3V0cHV0IHN0cmVhbSBpZiBvbmUgaXMgYWxyZWFkeSBvcGVuZWQgdG8gcmVhY2ggdGhlIFJYIGRldmljZQotICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXRzRm9yRGV2aWNlKHJ4RGV2aWNlLCBtT3V0cHV0cyk7Ci0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IHNlbGVjdE91dHB1dChvdXRwdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9JTlZBTElEKTsKLSAgICAgICAgaWYgKG91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwotICAgICAgICAgICAgQUxPR19BU1NFUlQoIW91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgInVwZGF0ZUNhbGxSb3V0aW5nKCkgUlggZGV2aWNlIG91dHB1dCBpcyBkdXBsaWNhdGVkIik7Ci0gICAgICAgICAgICBvdXRwdXREZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc291cmNlc1sxXSk7Ci0gICAgICAgICAgICBwYXRjaC5zb3VyY2VzWzFdLmV4dC5taXgudXNlY2FzZS5zdHJlYW0gPSBBVURJT19TVFJFQU1fUEFUQ0g7Ci0gICAgICAgICAgICBwYXRjaC5udW1fc291cmNlcyA9IDI7Ci0gICAgICAgIH0KLQotICAgICAgICBhZlBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0gICAgICAgIHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKCZwYXRjaCwgJmFmUGF0Y2hIYW5kbGUsIGRlbGF5TXMpOwotICAgICAgICBBTE9HV19JRihzdGF0dXMgIT0gTk9fRVJST1IsICJ1cGRhdGVDYWxsUm91dGluZygpIGVycm9yICVkIGNyZWF0aW5nIFJYIGF1ZGlvIHBhdGNoIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgbUNhbGxSeFBhdGNoID0gbmV3IEF1ZGlvUGF0Y2goJnBhdGNoLCBtVWlkQ2FjaGVkKTsKLSAgICAgICAgICAgIG1DYWxsUnhQYXRjaC0+bUFmUGF0Y2hIYW5kbGUgPSBhZlBhdGNoSGFuZGxlOwotICAgICAgICAgICAgbUNhbGxSeFBhdGNoLT5tVWlkID0gbVVpZENhY2hlZDsKLSAgICAgICAgfQorICAgICAgICBtQ2FsbFJ4UGF0Y2ggPSBjcmVhdGVUZWxlcGhvbnlQYXRjaCh0cnVlIC8qaXNSeCovLCByeERldmljZSwgZGVsYXlNcyk7CiAgICAgICAgIGNyZWF0ZVR4UGF0Y2ggPSB0cnVlOwogICAgIH0KICAgICBpZiAoY3JlYXRlVHhQYXRjaCkgeyAvLyBjcmVhdGUgVFggcGF0aCBhdWRpbyBwYXRjaAotICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggcGF0Y2g7CisgICAgICAgIG1DYWxsVHhQYXRjaCA9IGNyZWF0ZVRlbGVwaG9ueVBhdGNoKGZhbHNlIC8qaXNSeCovLCB0eERldmljZSwgZGVsYXlNcyk7CisgICAgfQogCi0gICAgICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMTsKLSAgICAgICAgcGF0Y2gubnVtX3NpbmtzID0gMTsKLSAgICAgICAgZGV2aWNlTGlzdCA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKHR4RGV2aWNlKTsKLSAgICAgICAgQUxPR19BU1NFUlQoIWRldmljZUxpc3QuaXNFbXB0eSgpLAotICAgICAgICAgICAgICAgICAgICAidXBkYXRlQ2FsbFJvdXRpbmcoKSBzZWxlY3RlZCBkZXZpY2Ugbm90IGluIGlucHV0IGRldmljZSBsaXN0Iik7Ci0gICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHR4U291cmNlRGV2aWNlRGVzYyA9IGRldmljZUxpc3QuaXRlbUF0KDApOwotICAgICAgICB0eFNvdXJjZURldmljZURlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zb3VyY2VzWzBdKTsKLSAgICAgICAgZGV2aWNlTGlzdCA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShBVURJT19ERVZJQ0VfT1VUX1RFTEVQSE9OWV9UWCk7Ci0gICAgICAgIEFMT0dfQVNTRVJUKCFkZXZpY2VMaXN0LmlzRW1wdHkoKSwKLSAgICAgICAgICAgICAgICAgICAgInVwZGF0ZUNhbGxSb3V0aW5nKCkgbm8gdGVsZXBob255IFRYIGRldmljZSIpOwotICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiB0eFNpbmtEZXZpY2VEZXNjID0gZGV2aWNlTGlzdC5pdGVtQXQoMCk7Ci0gICAgICAgIHR4U2lua0RldmljZURlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zaW5rc1swXSk7CisgICAgcmV0dXJuIG11dGVXYWl0TXM7Cit9CiAKLSAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0c0ZvckRldmljZShBVURJT19ERVZJQ0VfT1VUX1RFTEVQSE9OWV9UWCwgbU91dHB1dHMpOwotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfSU5WQUxJRCk7Ci0gICAgICAgIC8vIHJlcXVlc3QgdG8gcmV1c2UgZXhpc3Rpbmcgb3V0cHV0IHN0cmVhbSBpZiBvbmUgaXMgYWxyZWFkeSBvcGVuZWQgdG8gcmVhY2ggdGhlIFRYCi0gICAgICAgIC8vIHBhdGggb3V0cHV0IGRldmljZQotICAgICAgICBpZiAob3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwotICAgICAgICAgICAgQUxPR19BU1NFUlQoIW91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgInVwZGF0ZUNhbGxSb3V0aW5nKCkgUlggZGV2aWNlIG91dHB1dCBpcyBkdXBsaWNhdGVkIik7Ci0gICAgICAgICAgICBvdXRwdXREZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc291cmNlc1sxXSk7Ci0gICAgICAgICAgICBwYXRjaC5zb3VyY2VzWzFdLmV4dC5taXgudXNlY2FzZS5zdHJlYW0gPSBBVURJT19TVFJFQU1fUEFUQ0g7Ci0gICAgICAgICAgICBwYXRjaC5udW1fc291cmNlcyA9IDI7Ci0gICAgICAgIH0KK3NwPEF1ZGlvUGF0Y2g+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y3JlYXRlVGVsZXBob255UGF0Y2goCisgICAgICAgIGJvb2wgaXNSeCwgYXVkaW9fZGV2aWNlc190IGRldmljZSwgdWludDMyX3QgZGVsYXlNcykgeworICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDsKKyAgICBwYXRjaC5udW1fc291cmNlcyA9IDE7CisgICAgcGF0Y2gubnVtX3NpbmtzID0gMTsKIAorICAgIHNwPERldmljZURlc2NyaXB0b3I+IHR4U291cmNlRGV2aWNlRGVzYzsKKyAgICBpZiAoaXNSeCkgeworICAgICAgICBmaWxsQXVkaW9Qb3J0Q29uZmlnRm9yRGV2aWNlKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLCBkZXZpY2UsICZwYXRjaC5zaW5rc1swXSk7CisgICAgICAgIGZpbGxBdWRpb1BvcnRDb25maWdGb3JEZXZpY2UoCisgICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcywgQVVESU9fREVWSUNFX0lOX1RFTEVQSE9OWV9SWCwgJnBhdGNoLnNvdXJjZXNbMF0pOworICAgIH0gZWxzZSB7CisgICAgICAgIHR4U291cmNlRGV2aWNlRGVzYyA9IGZpbGxBdWRpb1BvcnRDb25maWdGb3JEZXZpY2UoCisgICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcywgZGV2aWNlLCAmcGF0Y2guc291cmNlc1swXSk7CisgICAgICAgIGZpbGxBdWRpb1BvcnRDb25maWdGb3JEZXZpY2UoCisgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMsIEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYLCAmcGF0Y2guc2lua3NbMF0pOworICAgIH0KKworICAgIGF1ZGlvX2RldmljZXNfdCBvdXRwdXREZXZpY2UgPSBpc1J4ID8gZGV2aWNlIDogQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFg7CisgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZShvdXRwdXREZXZpY2UsIG1PdXRwdXRzKTsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cywgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgQVVESU9fRk9STUFUX0lOVkFMSUQpOworICAgIC8vIHJlcXVlc3QgdG8gcmV1c2UgZXhpc3Rpbmcgb3V0cHV0IHN0cmVhbSBpZiBvbmUgaXMgYWxyZWFkeSBvcGVuZWQgdG8gcmVhY2ggdGhlIHRhcmdldCBkZXZpY2UKKyAgICBpZiAob3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CisgICAgICAgIEFMT0dfQVNTRVJUKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSwKKyAgICAgICAgICAgICAgICAiJXMoKSAlI3ggZGV2aWNlIG91dHB1dCAlZCBpcyBkdXBsaWNhdGVkIiwgX19mdW5jX18sIG91dHB1dERldmljZSwgb3V0cHV0KTsKKyAgICAgICAgb3V0cHV0RGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNvdXJjZXNbMV0pOworICAgICAgICBwYXRjaC5zb3VyY2VzWzFdLmV4dC5taXgudXNlY2FzZS5zdHJlYW0gPSBBVURJT19TVFJFQU1fUEFUQ0g7CisgICAgICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMjsKKyAgICB9CisKKyAgICBpZiAoIWlzUngpIHsKICAgICAgICAgLy8gdGVybWluYXRlIGFjdGl2ZSBjYXB0dXJlIGlmIG9uIHRoZSBzYW1lIEhXIG1vZHVsZSBhcyB0aGUgY2FsbCBUWCBzb3VyY2UgZGV2aWNlCiAgICAgICAgIC8vIEZJWE1FOiB3b3VsZCBiZSBiZXR0ZXIgdG8gcmVmaW5lIHRvIG9ubHkgaW5wdXRzIHdob3NlIHByb2ZpbGUgY29ubmVjdHMgdG8gdGhlCiAgICAgICAgIC8vIGNhbGwgVFggZGV2aWNlIGJ1dCB0aGlzIGluZm9ybWF0aW9uIGlzIG5vdCBpbiB0aGUgYXVkaW8gcGF0Y2ggYW5kIGxvZ2ljIGhlcmUgbXVzdCBiZQogICAgICAgICAvLyBzeW1tZXRyaWMgdG8gdGhlIG9uZSBpbiBzdGFydElucHV0KCkKLSAgICAgICAgVmVjdG9yPHNwIDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gPiBhY3RpdmVJbnB1dHMgPSBtSW5wdXRzLmdldEFjdGl2ZUlucHV0cygpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFjdGl2ZUlucHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGFjdGl2ZURlc2MgPSBhY3RpdmVJbnB1dHNbaV07CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgYWN0aXZlRGVzYyA6IG1JbnB1dHMuZ2V0QWN0aXZlSW5wdXRzKCkpIHsKICAgICAgICAgICAgIGlmIChhY3RpdmVEZXNjLT5oYXNTYW1lSHdNb2R1bGVBcyh0eFNvdXJjZURldmljZURlc2MpKSB7CiAgICAgICAgICAgICAgICAgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbiBhY3RpdmVTZXNzaW9ucyA9CiAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVEZXNjLT5nZXRBdWRpb1Nlc3Npb25zKHRydWUgLyphY3RpdmVPbmx5Ki8pOwpAQCAtNTEyLDE5ICs1MjEsMjkgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQotICAgICAgICBhZlBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0gICAgICAgIHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKCZwYXRjaCwgJmFmUGF0Y2hIYW5kbGUsIGRlbGF5TXMpOwotICAgICAgICBBTE9HV19JRihzdGF0dXMgIT0gTk9fRVJST1IsICJzZXRQaG9uZVN0YXRlKCkgZXJyb3IgJWQgY3JlYXRpbmcgVFggYXVkaW8gcGF0Y2giLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBtQ2FsbFR4UGF0Y2ggPSBuZXcgQXVkaW9QYXRjaCgmcGF0Y2gsIG1VaWRDYWNoZWQpOwotICAgICAgICAgICAgbUNhbGxUeFBhdGNoLT5tQWZQYXRjaEhhbmRsZSA9IGFmUGF0Y2hIYW5kbGU7Ci0gICAgICAgICAgICBtQ2FsbFR4UGF0Y2gtPm1VaWQgPSBtVWlkQ2FjaGVkOwotICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIG11dGVXYWl0TXM7CisgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgYWZQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKCZwYXRjaCwgJmFmUGF0Y2hIYW5kbGUsIGRlbGF5TXMpOworICAgIEFMT0dXX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwKKyAgICAgICAgICAgICIlcygpIGVycm9yICVkIGNyZWF0aW5nICVzIGF1ZGlvIHBhdGNoIiwgX19mdW5jX18sIHN0YXR1cywgaXNSeCA/ICJSWCIgOiAiVFgiKTsKKyAgICBzcDxBdWRpb1BhdGNoPiBhdWRpb1BhdGNoOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgYXVkaW9QYXRjaCA9IG5ldyBBdWRpb1BhdGNoKCZwYXRjaCwgbVVpZENhY2hlZCk7CisgICAgICAgIGF1ZGlvUGF0Y2gtPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKKyAgICAgICAgYXVkaW9QYXRjaC0+bVVpZCA9IG1VaWRDYWNoZWQ7CisgICAgfQorICAgIHJldHVybiBhdWRpb1BhdGNoOworfQorCitzcDxEZXZpY2VEZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1hbmFnZXI6OmZpbGxBdWRpb1BvcnRDb25maWdGb3JEZXZpY2UoCisgICAgICAgIGNvbnN0IERldmljZVZlY3RvciYgZGV2aWNlcywgYXVkaW9fZGV2aWNlc190IGRldmljZSwgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgeworICAgIERldmljZVZlY3RvciBkZXZpY2VMaXN0ID0gZGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoZGV2aWNlKTsKKyAgICBBTE9HX0FTU0VSVCghZGV2aWNlTGlzdC5pc0VtcHR5KCksCisgICAgICAgICAgICAiJXMoKSBzZWxlY3RlZCBkZXZpY2UgdHlwZSAlI3ggaXMgbm90IGluIGRldmljZXMgbGlzdCIsIF9fZnVuY19fLCBkZXZpY2UpOworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZURlc2MgPSBkZXZpY2VMaXN0Lml0ZW1BdCgwKTsKKyAgICBkZXZpY2VEZXNjLT50b0F1ZGlvUG9ydENvbmZpZyhjb25maWcpOworICAgIHJldHVybiBkZXZpY2VEZXNjOwogfQogCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUpCkBAIC02MTQsNiArNjMzLDE2IEBACiAgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIHJ4RGV2aWNlLCBmb3JjZSwgMCk7CiAgICAgICAgIH0KICAgICB9CisKKyAgICAvLyByZWV2YWx1YXRlIHJvdXRpbmcgb24gYWxsIG91dHB1dHMgaW4gY2FzZSB0cmFja3MgaGF2ZSBiZWVuIHN0YXJ0ZWQgZHVyaW5nIHRoZSBjYWxsCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2UoZGVzYywgdHJ1ZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgaWYgKHN0YXRlICE9IEFVRElPX01PREVfSU5fQ0FMTCB8fCBkZXNjICE9IG1QcmltYXJ5T3V0cHV0KSB7CisgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2UoZGVzYywgbmV3RGV2aWNlLCAobmV3RGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSwgMCAvKmRlbGF5TXMqLyk7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvLyBpZiBlbnRlcmluZyBpbiBjYWxsIHN0YXRlLCBoYW5kbGUgc3BlY2lhbCBjYXNlIG9mIGFjdGl2ZSBzdHJlYW1zCiAgICAgLy8gcGVydGFpbmluZyB0byBzb25pZmljYXRpb24gc3RyYXRlZ3kgc2VlIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpCiAgICAgaWYgKGlzU3RhdGVJbkNhbGwoc3RhdGUpKSB7CkBAIC02ODMsOSArNzEyLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIFZlY3RvcjxzcCA8QXVkaW9JbnB1dERlc2NyaXB0b3I+ID4gYWN0aXZlSW5wdXRzID0gbUlucHV0cy5nZXRBY3RpdmVJbnB1dHMoKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFjdGl2ZUlucHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gYWN0aXZlRGVzYyA9IGFjdGl2ZUlucHV0c1tpXTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGFjdGl2ZURlc2MgOiBtSW5wdXRzLmdldEFjdGl2ZUlucHV0cygpKSB7CiAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdJbnB1dERldmljZShhY3RpdmVEZXNjKTsKICAgICAgICAgLy8gRm9yY2UgbmV3IGlucHV0IHNlbGVjdGlvbiBpZiB0aGUgbmV3IGRldmljZSBjYW4gbm90IGJlIHJlYWNoZWQgdmlhIGN1cnJlbnQgaW5wdXQKICAgICAgICAgaWYgKGFjdGl2ZURlc2MtPm1Qcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzKCkudHlwZXMoKSAmCkBAIC03MjEsMTIgKzc0OCw4IEBACiAKICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGU7CiAKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Id01vZHVsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKG1Id01vZHVsZXNbaV0tPm1IYW5kbGUgPT0gMCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gY3VyUHJvZmlsZSA9IG1Id01vZHVsZXNbaV0tPm1PdXRwdXRQcm9maWxlc1tqXTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGh3TW9kdWxlIDogbUh3TW9kdWxlcykgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGN1clByb2ZpbGUgOiBod01vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKSkgewogICAgICAgICAgICAgaWYgKCFjdXJQcm9maWxlLT5pc0NvbXBhdGlibGVQcm9maWxlKGRldmljZSwgU3RyaW5nOCgiIiksCiAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSwgTlVMTCAvKnVwZGF0ZWRTYW1wbGluZ1JhdGUqLywKICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBOVUxMIC8qdXBkYXRlZEZvcm1hdCovLApAQCAtNzUxLDIwICs3NzQsMjIgQEAKICAgICByZXR1cm4gcHJvZmlsZTsKIH0KIAotYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKQorYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCiB7CiAgICAgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSA9IGdldFN0cmF0ZWd5KHN0cmVhbSk7CiAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLSAgICBBTE9HVigiZ2V0T3V0cHV0KCkgZGV2aWNlICVkLCBzdHJlYW0gJWQsIHNhbXBsaW5nUmF0ZSAlZCwgZm9ybWF0ICV4LCBjaGFubmVsTWFzayAleCwgZmxhZ3MgJXgiLAotICAgICAgICAgIGRldmljZSwgc3RyZWFtLCBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZsYWdzKTsKIAotICAgIHJldHVybiBnZXRPdXRwdXRGb3JEZXZpY2UoZGV2aWNlLCBBVURJT19TRVNTSU9OX0FMTE9DQVRFLCBzdHJlYW0sIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIGZsYWdzLCBvZmZsb2FkSW5mbyk7CisgICAgLy8gTm90ZSB0aGF0IHJlbGF0ZWQgbWV0aG9kIGdldE91dHB1dEZvckF0dHIoKSB1c2VzIGdldE91dHB1dEZvckRldmljZSgpIG5vdCBzZWxlY3RPdXRwdXQoKS4KKyAgICAvLyBXZSB1c2Ugc2VsZWN0T3V0cHV0KCkgaGVyZSBzaW5jZSB3ZSBkb24ndCBoYXZlIHRoZSBkZXNpcmVkIEF1ZGlvVHJhY2sgc2FtcGxlIHJhdGUsCisgICAgLy8gZm9ybWF0LCBmbGFncywgZXRjLiBUaGlzIG1heSByZXN1bHQgaW4gc29tZSBkaXNjcmVwYW5jeSBmb3IgZnVuY3Rpb25zIHRoYXQgdXRpbGl6ZQorICAgIC8vIGdldE91dHB1dCgpIHNvbGVseSBvbiBhdWRpb19zdHJlYW1fdHlwZSBzdWNoIGFzIEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGcmFtZUNvdW50KCkKKyAgICAvLyBhbmQgQXVkaW9TeXN0ZW06OmdldE91dHB1dFNhbXBsaW5nUmF0ZSgpLgorCisgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZShkZXZpY2UsIG1PdXRwdXRzKTsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cywgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgQVVESU9fRk9STUFUX0lOVkFMSUQpOworCisgICAgQUxPR1YoImdldE91dHB1dCgpIHN0cmVhbSAlZCBzZWxlY3RlZCBkZXZpY2UgJTA4eCwgb3V0cHV0ICVkIiwgc3RyZWFtLCBkZXZpY2UsIG91dHB1dCk7CisgICAgcmV0dXJuIG91dHB1dDsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKQEAgLTc3Myw3ICs3OTgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgKnN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCAqZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpCiB7CkBAIC04MjUsMTIgKzg1MCw3IEBACiAgICAgLy8gRXhwbGljaXQgcm91dGluZz8KICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjOwogICAgIGlmICgqc2VsZWN0ZWREZXZpY2VJZCAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF2YWlsYWJsZU91dHB1dERldmljZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpXS0+Z2V0SWQoKSA9PSAqc2VsZWN0ZWREZXZpY2VJZCkgewotICAgICAgICAgICAgICAgIGRldmljZURlc2MgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpXTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBkZXZpY2VEZXNjID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKCpzZWxlY3RlZERldmljZUlkKTsKICAgICB9CiAgICAgbU91dHB1dFJvdXRlcy5hZGRSb3V0ZShzZXNzaW9uLCAqc3RyZWFtLCBTZXNzaW9uUm91dGU6OlNPVVJDRV9UWVBFX05BLCBkZXZpY2VEZXNjLCB1aWQpOwogCkBAIC04MzgsMTUgKzg1OCwxNCBAQAogICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CiAKICAgICBpZiAoKGF0dHJpYnV0ZXMuZmxhZ3MgJiBBVURJT19GTEFHX0hXX0FWX1NZTkMpICE9IDApIHsKLSAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKGZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQyk7CisgICAgICAgICpmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoKmZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQyk7CiAgICAgfQogCi0gICAgQUxPR1YoImdldE91dHB1dEZvckF0dHIoKSBkZXZpY2UgMHgleCwgc2FtcGxpbmdSYXRlICVkLCBmb3JtYXQgJXgsIGNoYW5uZWxNYXNrICV4LCBmbGFncyAleCIsCi0gICAgICAgICAgZGV2aWNlLCBjb25maWctPnNhbXBsZV9yYXRlLCBjb25maWctPmZvcm1hdCwgY29uZmlnLT5jaGFubmVsX21hc2ssIGZsYWdzKTsKKyAgICBBTE9HVigiZ2V0T3V0cHV0Rm9yQXR0cigpIGRldmljZSAweCV4LCBzYW1wbGluZyByYXRlICVkLCBmb3JtYXQgJSN4LCBjaGFubmVsIG1hc2sgJSN4LCAiCisgICAgICAgICAgImZsYWdzICUjeCIsCisgICAgICAgICAgZGV2aWNlLCBjb25maWctPnNhbXBsZV9yYXRlLCBjb25maWctPmZvcm1hdCwgY29uZmlnLT5jaGFubmVsX21hc2ssICpmbGFncyk7CiAKLSAgICAqb3V0cHV0ID0gZ2V0T3V0cHV0Rm9yRGV2aWNlKGRldmljZSwgc2Vzc2lvbiwgKnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCAmY29uZmlnLT5vZmZsb2FkX2luZm8pOworICAgICpvdXRwdXQgPSBnZXRPdXRwdXRGb3JEZXZpY2UoZGV2aWNlLCBzZXNzaW9uLCAqc3RyZWFtLCBjb25maWcsIGZsYWdzKTsKICAgICBpZiAoKm91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICBtT3V0cHV0Um91dGVzLnJlbW92ZVJvdXRlKHNlc3Npb24pOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC04NjUsOTIgKzg4NCw1MyBAQAogICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbykKKyAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgKmZsYWdzKQogewogICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgIHN0YXR1c190IHN0YXR1czsKIAotI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCi0gICAgaWYgKG1DdXJPdXRwdXQgIT0gMCkgewotICAgICAgICBBTE9HVigiZ2V0T3V0cHV0KCkgdGVzdCBvdXRwdXQgbUN1ck91dHB1dCAlZCwgc2FtcGxpbmdSYXRlICVkLCBmb3JtYXQgJWQsIGNoYW5uZWxNYXNrICV4LCBtRGlyZWN0T3V0cHV0ICVkIiwKLSAgICAgICAgICAgICAgICBtQ3VyT3V0cHV0LCBtVGVzdFNhbXBsaW5nUmF0ZSwgbVRlc3RGb3JtYXQsIG1UZXN0Q2hhbm5lbHMsIG1EaXJlY3RPdXRwdXQpOwotCi0gICAgICAgIGlmIChtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0gPT0gMCkgewotICAgICAgICAgICAgQUxPR1YoImdldE91dHB1dCgpIG9wZW5pbmcgdGVzdCBvdXRwdXQiKTsKLSAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG5ldyBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcihOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlKTsKLSAgICAgICAgICAgIG91dHB1dERlc2MtPm1EZXZpY2UgPSBtVGVzdERldmljZTsKLSAgICAgICAgICAgIG91dHB1dERlc2MtPm1MYXRlbmN5ID0gbVRlc3RMYXRlbmN5TXM7Ci0gICAgICAgICAgICBvdXRwdXREZXNjLT5tRmxhZ3MgPQotICAgICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKG1EaXJlY3RPdXRwdXQgPyBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QgOiAwKTsKLSAgICAgICAgICAgIG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dID0gMDsKLSAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKLSAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IG1UZXN0U2FtcGxpbmdSYXRlOwotICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IG1UZXN0Q2hhbm5lbHM7Ci0gICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gbVRlc3RGb3JtYXQ7Ci0gICAgICAgICAgICBpZiAob2ZmbG9hZEluZm8gIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8gPSAqb2ZmbG9hZEluZm87Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3Blbk91dHB1dCgwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bURldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCgiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tTGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUZsYWdzKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOwotICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1Gb3JtYXQgPSBjb25maWcuZm9ybWF0OwotICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1DaGFubmVsTWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7Ci0gICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgb3V0cHV0Q21kID0gQXVkaW9QYXJhbWV0ZXIoKTsKLSAgICAgICAgICAgICAgICBvdXRwdXRDbWQuYWRkSW50KFN0cmluZzgoInNldF9pZCIpLG1DdXJPdXRwdXQpOwotICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSxvdXRwdXRDbWQudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgYWRkT3V0cHV0KG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSwgb3V0cHV0RGVzYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XTsKLSAgICB9Ci0jZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAotCiAgICAgLy8gb3BlbiBhIGRpcmVjdCBvdXRwdXQgaWYgcmVxdWlyZWQgYnkgc3BlY2lmaWVkIHBhcmFtZXRlcnMKICAgICAvL2ZvcmNlIGRpcmVjdCBmbGFnIGlmIG9mZmxvYWQgZmxhZyBpcyBzZXQ6IG9mZmxvYWRpbmcgaW1wbGllcyBhIGRpcmVjdCBvdXRwdXQgc3RyZWFtCiAgICAgLy8gYW5kIGFsbCBjb21tb24gYmVoYXZpb3JzIGFyZSBkcml2ZW4gYnkgY2hlY2tpbmcgb25seSB0aGUgZGlyZWN0IGZsYWcKICAgICAvLyB0aGlzIHNob3VsZCBub3JtYWxseSBiZSBzZXQgYXBwcm9wcmlhdGVseSBpbiB0aGUgcG9saWN5IGNvbmZpZ3VyYXRpb24gZmlsZQotICAgIGlmICgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSAhPSAwKSB7Ci0gICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KShmbGFncyB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CisgICAgaWYgKCgqZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSAhPSAwKSB7CisgICAgICAgICpmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoKmZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKICAgICB9Ci0gICAgaWYgKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMpICE9IDApIHsKLSAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKGZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKKyAgICBpZiAoKCpmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMpICE9IDApIHsKKyAgICAgICAgKmZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSgqZmxhZ3MgfCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOwogICAgIH0KICAgICAvLyBvbmx5IGFsbG93IGRlZXAgYnVmZmVyaW5nIGZvciBtdXNpYyBzdHJlYW0gdHlwZQogICAgIGlmIChzdHJlYW0gIT0gQVVESU9fU1RSRUFNX01VU0lDKSB7Ci0gICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KShmbGFncyAmfkFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSKTsKKyAgICAgICAgKmZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSgqZmxhZ3MgJn5BVURJT19PVVRQVVRfRkxBR19ERUVQX0JVRkZFUik7CiAgICAgfSBlbHNlIGlmICgvKiBzdHJlYW0gPT0gQVVESU9fU1RSRUFNX01VU0lDICYmICovCi0gICAgICAgICAgICBmbGFncyA9PSBBVURJT19PVVRQVVRfRkxBR19OT05FICYmCisgICAgICAgICAgICAqZmxhZ3MgPT0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSAmJgogICAgICAgICAgICAgcHJvcGVydHlfZ2V0X2Jvb2woImF1ZGlvLmRlZXBfYnVmZmVyLm1lZGlhIiwgZmFsc2UgLyogZGVmYXVsdF92YWx1ZSAqLykpIHsKICAgICAgICAgLy8gdXNlIERFRVBfQlVGRkVSIGFzIGRlZmF1bHQgb3V0cHV0IGZvciBtdXNpYyBzdHJlYW0gdHlwZQotICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdClBVURJT19PVVRQVVRfRkxBR19ERUVQX0JVRkZFUjsKKyAgICAgICAgKmZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KUFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSOwogICAgIH0KICAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9UVFMpIHsKLSAgICAgICAgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19UVFM7CisgICAgICAgICpmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX1RUUzsKICAgICB9IGVsc2UgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCAmJgotICAgICAgICAgICAgICAgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKSB7Ci0gICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KShBVURJT19PVVRQVVRfRkxBR19WT0lQX1JYIHwKKyAgICAgICAgICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oY29uZmlnLT5mb3JtYXQpKSB7CisgICAgICAgICpmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoQVVESU9fT1VUUFVUX0ZMQUdfVk9JUF9SWCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOwogICAgICAgICBBTE9HVigiU2V0IFZvSVAgYW5kIERpcmVjdCBvdXRwdXQgZmxhZ3MgZm9yIFBDTSBmb3JtYXQiKTsKKyAgICB9IGVsc2UgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX1RFTEVQSE9OWV9UWCAmJgorICAgICAgICBzdHJlYW0gPT0gQVVESU9fU1RSRUFNX01VU0lDICYmCisgICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oY29uZmlnLT5mb3JtYXQpICYmCisgICAgICAgIGlzSW5DYWxsKCkpIHsKKyAgICAgICAgKmZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KUFVRElPX09VVFBVVF9GTEFHX0lOQ0FMTF9NVVNJQzsKICAgICB9CiAKKwogICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZTsKIAogICAgIC8vIHNraXAgZGlyZWN0IG91dHB1dCBzZWxlY3Rpb24gaWYgdGhlIHJlcXVlc3QgY2FuIG9idmlvdXNseSBiZSBhdHRhY2hlZCB0byBhIG1peGVkIG91dHB1dAogICAgIC8vIGFuZCBub3QgZXhwbGljaXRseSByZXF1ZXN0ZWQKLSAgICBpZiAoKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgPT0gMCkgJiYKLSAgICAgICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSAmJiBzYW1wbGluZ1JhdGUgPD0gU0FNUExFX1JBVEVfSFpfTUFYICYmCi0gICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spIDw9IDIpIHsKKyAgICBpZiAoKCgqZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpID09IDApICYmCisgICAgICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKGNvbmZpZy0+Zm9ybWF0KSAmJiBjb25maWctPnNhbXBsZV9yYXRlIDw9IFNBTVBMRV9SQVRFX0haX01BWCAmJgorICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNvbmZpZy0+Y2hhbm5lbF9tYXNrKSA8PSAyKSB7CiAgICAgICAgIGdvdG8gbm9uX2RpcmVjdF9vdXRwdXQ7CiAgICAgfQogCkBAIC05NjEsMTA1ICs5NDEsNjYgQEAKICAgICAvLyBUaGlzIG1heSBwcmV2ZW50IG9mZmxvYWRpbmcgaW4gcmFyZSBzaXR1YXRpb25zIHdoZXJlIGVmZmVjdHMgYXJlIGxlZnQgYWN0aXZlIGJ5IGFwcHMKICAgICAvLyBpbiB0aGUgYmFja2dyb3VuZC4KIAotICAgIGlmICgoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgPT0gMCkgfHwKKyAgICBpZiAoKCgqZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSA9PSAwKSB8fAogICAgICAgICAgICAgIShtRWZmZWN0cy5pc05vbk9mZmxvYWRhYmxlRWZmZWN0RW5hYmxlZCgpIHx8IG1NYXN0ZXJNb25vKSkgewogICAgICAgICBwcm9maWxlID0gZ2V0UHJvZmlsZUZvckRpcmVjdE91dHB1dChkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5jaGFubmVsX21hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KSpmbGFncyk7CiAgICAgfQogCiAgICAgaWYgKHByb2ZpbGUgIT0gMCkgewotICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IE5VTEw7Ci0KKyAgICAgICAgLy8gZXhjbHVzaXZlIG91dHB1dHMgZm9yIE1NQVAgYW5kIE9mZmxvYWQgYXJlIGVuZm9yY2VkIGJ5IGRpZmZlcmVudCBzZXNzaW9uIGlkcy4KICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwogICAgICAgICAgICAgaWYgKCFkZXNjLT5pc0R1cGxpY2F0ZWQoKSAmJiAocHJvZmlsZSA9PSBkZXNjLT5tUHJvZmlsZSkpIHsKLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjID0gZGVzYzsKICAgICAgICAgICAgICAgICAvLyByZXVzZSBkaXJlY3Qgb3V0cHV0IGlmIGN1cnJlbnRseSBvcGVuIGJ5IHRoZSBzYW1lIGNsaWVudAogICAgICAgICAgICAgICAgIC8vIGFuZCBjb25maWd1cmVkIHdpdGggc2FtZSBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgaWYgKChzYW1wbGluZ1JhdGUgPT0gb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0c19tYXRjaChmb3JtYXQsIG91dHB1dERlc2MtPm1Gb3JtYXQpICYmCi0gICAgICAgICAgICAgICAgICAgIChjaGFubmVsTWFzayA9PSBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2spKSB7Ci0gICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBvdXRwdXREZXNjLT5tRGlyZWN0Q2xpZW50U2Vzc2lvbikgewotICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1EaXJlY3RPcGVuQ291bnQrKzsKLSAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiZ2V0T3V0cHV0KCkgcmV1c2luZyBkaXJlY3Qgb3V0cHV0ICVkIGZvciBzZXNzaW9uICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0cy5rZXlBdChpKSwgc2Vzc2lvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1PdXRwdXRzLmtleUF0KGkpOwotICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiZ2V0T3V0cHV0KCkgZG8gbm90IHJldXNlIGRpcmVjdCBvdXRwdXQgYmVjYXVzZSBjdXJyZW50IGNsaWVudCAoJWQpICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXMgbm90IHRoZSBzYW1lIGFzIHJlcXVlc3RpbmcgY2xpZW50ICglZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1EaXJlY3RDbGllbnRTZXNzaW9uLCBzZXNzaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICBnb3RvIG5vbl9kaXJlY3Rfb3V0cHV0OwotICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgoY29uZmlnLT5zYW1wbGVfcmF0ZSA9PSBkZXNjLT5tU2FtcGxpbmdSYXRlKSAmJgorICAgICAgICAgICAgICAgICAgICAoY29uZmlnLT5mb3JtYXQgPT0gZGVzYy0+bUZvcm1hdCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKGNvbmZpZy0+Y2hhbm5lbF9tYXNrID09IGRlc2MtPm1DaGFubmVsTWFzaykgJiYKKyAgICAgICAgICAgICAgICAgICAgKHNlc3Npb24gPT0gZGVzYy0+bURpcmVjdENsaWVudFNlc3Npb24pKSB7CisgICAgICAgICAgICAgICAgICAgIGRlc2MtPm1EaXJlY3RPcGVuQ291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0koImdldE91dHB1dEZvckRldmljZSgpIHJldXNpbmcgZGlyZWN0IG91dHB1dCAlZCBmb3Igc2Vzc2lvbiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0cy5rZXlBdChpKSwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtT3V0cHV0cy5rZXlBdChpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgLy8gY2xvc2UgZGlyZWN0IG91dHB1dCBpZiBjdXJyZW50bHkgb3BlbiBhbmQgY29uZmlndXJlZCB3aXRoIGRpZmZlcmVudCBwYXJhbWV0ZXJzCi0gICAgICAgIGlmIChvdXRwdXREZXNjICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGNsb3NlT3V0cHV0KG91dHB1dERlc2MtPm1Jb0hhbmRsZSk7CisKKyAgICAgICAgaWYgKCFwcm9maWxlLT5jYW5PcGVuTmV3SW8oKSkgeworICAgICAgICAgICAgZ290byBub25fZGlyZWN0X291dHB1dDsKICAgICAgICAgfQogCi0gICAgICAgIC8vIGlmIHRoZSBzZWxlY3RlZCBwcm9maWxlIGlzIG9mZmxvYWRlZCBhbmQgbm8gb2ZmbG9hZCBpbmZvIHdhcyBzcGVjaWZpZWQsCi0gICAgICAgIC8vIGNyZWF0ZSBhIGRlZmF1bHQgb25lCi0gICAgICAgIGF1ZGlvX29mZmxvYWRfaW5mb190IGRlZmF1bHRPZmZsb2FkSW5mbyA9IEFVRElPX0lORk9fSU5JVElBTElaRVI7Ci0gICAgICAgIGlmICgocHJvZmlsZS0+Z2V0RmxhZ3MoKSAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICYmICFvZmZsb2FkSW5mbykgewotICAgICAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKGZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCk7Ci0gICAgICAgICAgICBkZWZhdWx0T2ZmbG9hZEluZm8uc2FtcGxlX3JhdGUgPSBzYW1wbGluZ1JhdGU7Ci0gICAgICAgICAgICBkZWZhdWx0T2ZmbG9hZEluZm8uY2hhbm5lbF9tYXNrID0gY2hhbm5lbE1hc2s7Ci0gICAgICAgICAgICBkZWZhdWx0T2ZmbG9hZEluZm8uZm9ybWF0ID0gZm9ybWF0OwotICAgICAgICAgICAgZGVmYXVsdE9mZmxvYWRJbmZvLnN0cmVhbV90eXBlID0gc3RyZWFtOwotICAgICAgICAgICAgZGVmYXVsdE9mZmxvYWRJbmZvLmJpdF9yYXRlID0gMDsKLSAgICAgICAgICAgIGRlZmF1bHRPZmZsb2FkSW5mby5kdXJhdGlvbl91cyA9IC0xOwotICAgICAgICAgICAgZGVmYXVsdE9mZmxvYWRJbmZvLmhhc192aWRlbyA9IHRydWU7IC8vIGNvbnNlcnZhdGl2ZQotICAgICAgICAgICAgZGVmYXVsdE9mZmxvYWRJbmZvLmlzX3N0cmVhbWluZyA9IHRydWU7IC8vIGxpa2VseQotICAgICAgICAgICAgb2ZmbG9hZEluZm8gPSAmZGVmYXVsdE9mZmxvYWRJbmZvOwotICAgICAgICB9CisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0KKyAgICAgICAgICAgICAgICBuZXcgU3dBdWRpb091dHB1dERlc2NyaXB0b3IocHJvZmlsZSwgbXBDbGllbnRJbnRlcmZhY2UpOwogCi0gICAgICAgIG91dHB1dERlc2MgPSBuZXcgU3dBdWRpb091dHB1dERlc2NyaXB0b3IocHJvZmlsZSwgbXBDbGllbnRJbnRlcmZhY2UpOwotICAgICAgICBvdXRwdXREZXNjLT5tRGV2aWNlID0gZGV2aWNlOwotICAgICAgICBvdXRwdXREZXNjLT5tTGF0ZW5jeSA9IDA7Ci0gICAgICAgIG91dHB1dERlc2MtPm1GbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkob3V0cHV0RGVzYy0+bUZsYWdzIHwgZmxhZ3MpOwotICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7Ci0gICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IHNhbXBsaW5nUmF0ZTsKLSAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IGNoYW5uZWxNYXNrOwotICAgICAgICBjb25maWcuZm9ybWF0ID0gZm9ybWF0OwotICAgICAgICBpZiAob2ZmbG9hZEluZm8gIT0gTlVMTCkgewotICAgICAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mbyA9ICpvZmZsb2FkSW5mbzsKLSAgICAgICAgfQogICAgICAgICBEZXZpY2VWZWN0b3Igb3V0cHV0RGV2aWNlcyA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpOwogICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBvdXRwdXREZXZpY2VzLnNpemUoKSA+IDAgPyBvdXRwdXREZXZpY2VzLml0ZW1BdCgwKS0+bUFkZHJlc3MKICAgICAgICAgICAgICAgICA6IFN0cmluZzgoIiIpOwotICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3Blbk91dHB1dChwcm9maWxlLT5nZXRNb2R1bGVIYW5kbGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1EZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tTGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUZsYWdzKTsKKworICAgICAgICBzdGF0dXMgPSBvdXRwdXREZXNjLT5vcGVuKGNvbmZpZywgZGV2aWNlLCBhZGRyZXNzLCBzdHJlYW0sICpmbGFncywgJm91dHB1dCk7CiAKICAgICAgICAgLy8gb25seSBhY2NlcHQgYW4gb3V0cHV0IHdpdGggdGhlIHJlcXVlc3RlZCBwYXJhbWV0ZXJzCiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwKLSAgICAgICAgICAgIChzYW1wbGluZ1JhdGUgIT0gMCAmJiBzYW1wbGluZ1JhdGUgIT0gY29uZmlnLnNhbXBsZV9yYXRlKSB8fAotICAgICAgICAgICAgKGZvcm1hdCAhPSBBVURJT19GT1JNQVRfREVGQVVMVCAmJiAhYXVkaW9fZm9ybWF0c19tYXRjaChmb3JtYXQsIGNvbmZpZy5mb3JtYXQpKSB8fAotICAgICAgICAgICAgKGNoYW5uZWxNYXNrICE9IDAgJiYgY2hhbm5lbE1hc2sgIT0gY29uZmlnLmNoYW5uZWxfbWFzaykpIHsKLSAgICAgICAgICAgIEFMT0dWKCJnZXRPdXRwdXQoKSBmYWlsZWQgb3BlbmluZyBkaXJlY3Qgb3V0cHV0OiBvdXRwdXQgJWQgc2FtcGxpbmdSYXRlICVkICVkLCIKLSAgICAgICAgICAgICAgICAgICAgImZvcm1hdCAlZCAlZCwgY2hhbm5lbE1hc2sgJTA0eCAlMDR4Iiwgb3V0cHV0LCBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGUsIGZvcm1hdCwgb3V0cHV0RGVzYy0+bUZvcm1hdCwgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1DaGFubmVsTWFzayk7CisgICAgICAgICAgICAoY29uZmlnLT5zYW1wbGVfcmF0ZSAhPSAwICYmIGNvbmZpZy0+c2FtcGxlX3JhdGUgIT0gb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSkgfHwKKyAgICAgICAgICAgIChjb25maWctPmZvcm1hdCAhPSBBVURJT19GT1JNQVRfREVGQVVMVCAmJiBjb25maWctPmZvcm1hdCAhPSBvdXRwdXREZXNjLT5tRm9ybWF0KSB8fAorICAgICAgICAgICAgKGNvbmZpZy0+Y2hhbm5lbF9tYXNrICE9IDAgJiYgY29uZmlnLT5jaGFubmVsX21hc2sgIT0gb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrKSkgeworICAgICAgICAgICAgQUxPR1YoImdldE91dHB1dEZvckRldmljZSgpIGZhaWxlZCBvcGVuaW5nIGRpcmVjdCBvdXRwdXQ6IG91dHB1dCAlZCBzYW1wbGUgcmF0ZSAlZCAlZCwiCisgICAgICAgICAgICAgICAgICAgICJmb3JtYXQgJWQgJWQsIGNoYW5uZWwgbWFzayAlMDR4ICUwNHgiLCBvdXRwdXQsIGNvbmZpZy0+c2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBvdXRwdXREZXNjLT5tRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICBjb25maWctPmNoYW5uZWxfbWFzaywgb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrKTsKICAgICAgICAgICAgIGlmIChvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5jbG9zZSgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gZmFsbCBiYWNrIHRvIG1peGVyIG91dHB1dCBpZiBwb3NzaWJsZSB3aGVuIHRoZSBkaXJlY3Qgb3V0cHV0IGNvdWxkIG5vdCBiZSBvcGVuCi0gICAgICAgICAgICBpZiAoYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpICYmIHNhbXBsaW5nUmF0ZSA8PSBTQU1QTEVfUkFURV9IWl9NQVgpIHsKKyAgICAgICAgICAgIGlmIChhdWRpb19pc19saW5lYXJfcGNtKGNvbmZpZy0+Zm9ybWF0KSAmJgorICAgICAgICAgICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlICA8PSBTQU1QTEVfUkFURV9IWl9NQVgpIHsKICAgICAgICAgICAgICAgICBnb3RvIG5vbl9kaXJlY3Rfb3V0cHV0OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgICAgICB9Ci0gICAgICAgIG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7Ci0gICAgICAgIG91dHB1dERlc2MtPm1DaGFubmVsTWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7Ci0gICAgICAgIG91dHB1dERlc2MtPm1Gb3JtYXQgPSBjb25maWcuZm9ybWF0OwogICAgICAgICBvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSA9IDA7CiAgICAgICAgIG91dHB1dERlc2MtPm1TdG9wVGltZVtzdHJlYW1dID0gMDsKICAgICAgICAgb3V0cHV0RGVzYy0+bURpcmVjdE9wZW5Db3VudCA9IDE7CkBAIC0xMDY3LDcgKzEwMDgsNyBAQAogCiAgICAgICAgIGFkZE91dHB1dChvdXRwdXQsIG91dHB1dERlc2MpOwogICAgICAgICBtUHJldmlvdXNPdXRwdXRzID0gbU91dHB1dHM7Ci0gICAgICAgIEFMT0dWKCJnZXRPdXRwdXQoKSByZXR1cm5zIG5ldyBkaXJlY3Qgb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICAgICAgQUxPR1YoImdldE91dHB1dEZvckRldmljZSgpIHJldHVybnMgbmV3IGRpcmVjdCBvdXRwdXQgJWQiLCBvdXRwdXQpOwogICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CiAgICAgICAgIHJldHVybiBvdXRwdXQ7CiAgICAgfQpAQCAtMTA3Niw3ICsxMDE3LDcgQEAKIAogICAgIC8vIEEgcmVxdWVzdCBmb3IgSFcgQS9WIHN5bmMgY2Fubm90IGZhbGxiYWNrIHRvIGEgbWl4ZWQgb3V0cHV0IGJlY2F1c2UgdGltZQogICAgIC8vIHN0YW1wcyBhcmUgZW1iZWRkZWQgaW4gYXVkaW8gZGF0YQotICAgIGlmICgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DKSAhPSAwKSB7CisgICAgaWYgKCgqZmxhZ3MgJiAoQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQyB8IEFVRElPX09VVFBVVF9GTEFHX01NQVBfTk9JUlEpKSAhPSAwKSB7CiAgICAgICAgIHJldHVybiBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICB9CiAKQEAgLTEwODUsMTcgKzEwMjYsMTggQEAKICAgICAvLyBvcGVuIGEgbm9uIGRpcmVjdCBvdXRwdXQKIAogICAgIC8vIGZvciBub24gZGlyZWN0IG91dHB1dHMsIG9ubHkgUENNIGlzIHN1cHBvcnRlZAotICAgIGlmIChhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkpIHsKKyAgICBpZiAoYXVkaW9faXNfbGluZWFyX3BjbShjb25maWctPmZvcm1hdCkpIHsKICAgICAgICAgLy8gZ2V0IHdoaWNoIG91dHB1dCBpcyBzdWl0YWJsZSBmb3IgdGhlIHNwZWNpZmllZCBzdHJlYW0uIFRoZSBhY3R1YWwKICAgICAgICAgLy8gcm91dGluZyBjaGFuZ2Ugd2lsbCBoYXBwZW4gd2hlbiBzdGFydE91dHB1dCgpIHdpbGwgYmUgY2FsbGVkCiAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2UoZGV2aWNlLCBtT3V0cHV0cyk7CiAKICAgICAgICAgLy8gYXQgdGhpcyBzdGFnZSB3ZSBzaG91bGQgaWdub3JlIHRoZSBESVJFQ1QgZmxhZyBhcyBubyBkaXJlY3Qgb3V0cHV0IGNvdWxkIGJlIGZvdW5kIGVhcmxpZXIKLSAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKGZsYWdzICYgfkFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7Ci0gICAgICAgIG91dHB1dCA9IHNlbGVjdE91dHB1dChvdXRwdXRzLCBmbGFncywgZm9ybWF0KTsKKyAgICAgICAgKmZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSgqZmxhZ3MgJiB+QVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKKyAgICAgICAgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMsICpmbGFncywgY29uZmlnLT5mb3JtYXQpOwogICAgIH0KLSAgICBBTE9HV19JRigob3V0cHV0ID09IDApLCAiZ2V0T3V0cHV0KCkgY291bGQgbm90IGZpbmQgb3V0cHV0IGZvciBzdHJlYW0gJWQsIHNhbXBsaW5nUmF0ZSAlZCwiCi0gICAgICAgICAgICAiZm9ybWF0ICVkLCBjaGFubmVscyAleCwgZmxhZ3MgJXgiLCBzdHJlYW0sIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZmxhZ3MpOworICAgIEFMT0dXX0lGKChvdXRwdXQgPT0gMCksICJnZXRPdXRwdXRGb3JEZXZpY2UoKSBjb3VsZCBub3QgZmluZCBvdXRwdXQgZm9yIHN0cmVhbSAlZCwgIgorICAgICAgICAgICAgInNhbXBsaW5nIHJhdGUgJWQsIGZvcm1hdCAlI3gsIGNoYW5uZWxzICUjeCwgZmxhZ3MgJSN4IiwKKyAgICAgICAgICAgIHN0cmVhbSwgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLCAqZmxhZ3MpOwogCiAgICAgcmV0dXJuIG91dHB1dDsKIH0KQEAgLTExMTMsMjYgKzEwNTUsMjYgQEAKICAgICAvLyA0OiB0aGUgZmlyc3Qgb3V0cHV0IGluIHRoZSBsaXN0CiAKICAgICBpZiAob3V0cHV0cy5zaXplKCkgPT0gMCkgewotICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgIH0KICAgICBpZiAob3V0cHV0cy5zaXplKCkgPT0gMSkgewogICAgICAgICByZXR1cm4gb3V0cHV0c1swXTsKICAgICB9CiAKICAgICBpbnQgbWF4Q29tbW9uRmxhZ3MgPSAwOwotICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dEZvckZsYWdzID0gMDsKLSAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXRGb3JQcmltYXJ5ID0gMDsKLSAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXRGb3JGb3JtYXQgPSAwOworICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dEZvckZsYWdzID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0Rm9yUHJpbWFyeSA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dEZvckZvcm1hdCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgIGF1ZGlvX2Zvcm1hdF90IGJlc3RGb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKICAgICBhdWRpb19mb3JtYXRfdCBiZXN0Rm9ybWF0Rm9yRmxhZ3MgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKIAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dHNbaV0pOworICAgIGZvciAoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0IDogb3V0cHV0cykgeworICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CiAgICAgICAgIGlmICghb3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKICAgICAgICAgICAgIC8vIGlmIGEgdmFsaWQgZm9ybWF0IGlzIHNwZWNpZmllZCwgc2tpcCBvdXRwdXQgaWYgbm90IGNvbXBhdGlibGUKICAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gQVVESU9fRk9STUFUX0lOVkFMSUQpIHsKICAgICAgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghYXVkaW9fZm9ybWF0c19tYXRjaChmb3JtYXQsIG91dHB1dERlc2MtPm1Gb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gb3V0cHV0RGVzYy0+bUZvcm1hdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkpIHsKQEAgLTExNDAsNyArMTA4Miw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChBdWRpb1BvcnQ6OmlzQmV0dGVyRm9ybWF0TWF0Y2goCiAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRm9ybWF0LCBiZXN0Rm9ybWF0LCBmb3JtYXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dEZvckZvcm1hdCA9IG91dHB1dHNbaV07CisgICAgICAgICAgICAgICAgICAgIG91dHB1dEZvckZvcm1hdCA9IG91dHB1dDsKICAgICAgICAgICAgICAgICAgICAgYmVzdEZvcm1hdCA9IG91dHB1dERlc2MtPm1Gb3JtYXQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMTE0OCwzMSArMTA5MCwzMiBAQAogICAgICAgICAgICAgaW50IGNvbW1vbkZsYWdzID0gcG9wY291bnQob3V0cHV0RGVzYy0+bVByb2ZpbGUtPmdldEZsYWdzKCkgJiBmbGFncyk7CiAgICAgICAgICAgICBpZiAoY29tbW9uRmxhZ3MgPj0gbWF4Q29tbW9uRmxhZ3MpIHsKICAgICAgICAgICAgICAgICBpZiAoY29tbW9uRmxhZ3MgPT0gbWF4Q29tbW9uRmxhZ3MpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKEF1ZGlvUG9ydDo6aXNCZXR0ZXJGb3JtYXRNYXRjaCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRm9ybWF0LCBiZXN0Rm9ybWF0Rm9yRmxhZ3MsIGZvcm1hdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEZvckZsYWdzID0gb3V0cHV0c1tpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSBBVURJT19GT1JNQVRfSU5WQUxJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIEF1ZGlvUG9ydDo6aXNCZXR0ZXJGb3JtYXRNYXRjaCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1Gb3JtYXQsIGJlc3RGb3JtYXRGb3JGbGFncywgZm9ybWF0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0Rm9yRmxhZ3MgPSBvdXRwdXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0Rm9ybWF0Rm9yRmxhZ3MgPSBvdXRwdXREZXNjLT5tRm9ybWF0OwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0Rm9yRmxhZ3MgPSBvdXRwdXRzW2ldOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRGb3JGbGFncyA9IG91dHB1dDsKICAgICAgICAgICAgICAgICAgICAgbWF4Q29tbW9uRmxhZ3MgPSBjb21tb25GbGFnczsKICAgICAgICAgICAgICAgICAgICAgYmVzdEZvcm1hdEZvckZsYWdzID0gb3V0cHV0RGVzYy0+bUZvcm1hdDsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQUxPR1YoInNlbGVjdE91dHB1dCgpIGNvbW1vbkZsYWdzIGZvciBvdXRwdXQgJWQsICUwNHgiLCBvdXRwdXRzW2ldLCBjb21tb25GbGFncyk7CisgICAgICAgICAgICAgICAgQUxPR1YoInNlbGVjdE91dHB1dCgpIGNvbW1vbkZsYWdzIGZvciBvdXRwdXQgJWQsICUwNHgiLCBvdXRwdXQsIGNvbW1vbkZsYWdzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5tUHJvZmlsZS0+Z2V0RmxhZ3MoKSAmIEFVRElPX09VVFBVVF9GTEFHX1BSSU1BUlkpIHsKLSAgICAgICAgICAgICAgICBvdXRwdXRGb3JQcmltYXJ5ID0gb3V0cHV0c1tpXTsKKyAgICAgICAgICAgICAgICBvdXRwdXRGb3JQcmltYXJ5ID0gb3V0cHV0OwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKG91dHB1dEZvckZsYWdzICE9IDApIHsKKyAgICBpZiAob3V0cHV0Rm9yRmxhZ3MgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgcmV0dXJuIG91dHB1dEZvckZsYWdzOwogICAgIH0KLSAgICBpZiAob3V0cHV0Rm9yRm9ybWF0ICE9IDApIHsKKyAgICBpZiAob3V0cHV0Rm9yRm9ybWF0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgIHJldHVybiBvdXRwdXRGb3JGb3JtYXQ7CiAgICAgfQotICAgIGlmIChvdXRwdXRGb3JQcmltYXJ5ICE9IDApIHsKKyAgICBpZiAob3V0cHV0Rm9yUHJpbWFyeSAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICByZXR1cm4gb3V0cHV0Rm9yUHJpbWFyeTsKICAgICB9CiAKQEAgLTExOTMsNiArMTEzNiwxMSBAQAogCiAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGluZGV4KTsKIAorICAgIHN0YXR1c190IHN0YXR1cyA9IG91dHB1dERlc2MtPnN0YXJ0KCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKwogICAgIC8vIFJvdXRpbmc/CiAgICAgbU91dHB1dFJvdXRlcy5pbmNSb3V0ZUFjdGl2aXR5KHNlc3Npb24pOwogCkBAIC0xMjA3LDE5ICsxMTU1LDIyIEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBuZXdEZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVg7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKG1PdXRwdXRSb3V0ZXMuaGFzUm91dGVDaGFuZ2VkKHNlc3Npb24pKSB7CisgICAgfSBlbHNlIGlmIChtT3V0cHV0Um91dGVzLmdldEFuZENsZWFyUm91dGVDaGFuZ2VkKHNlc3Npb24pKSB7CiAgICAgICAgIG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShvdXRwdXREZXNjLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLSAgICAgICAgY2hlY2tTdHJhdGVneVJvdXRlKGdldFN0cmF0ZWd5KHN0cmVhbSksIG91dHB1dCk7CisgICAgICAgIGlmIChuZXdEZXZpY2UgIT0gb3V0cHV0RGVzYy0+ZGV2aWNlKCkpIHsKKyAgICAgICAgICAgIGNoZWNrU3RyYXRlZ3lSb3V0ZShnZXRTdHJhdGVneShzdHJlYW0pLCBvdXRwdXQpOworICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgbmV3RGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7CiAgICAgfQogCiAgICAgdWludDMyX3QgZGVsYXlNcyA9IDA7CiAKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdGFydFNvdXJjZShvdXRwdXREZXNjLCBzdHJlYW0sIG5ld0RldmljZSwgYWRkcmVzcywgJmRlbGF5TXMpOworICAgIHN0YXR1cyA9IHN0YXJ0U291cmNlKG91dHB1dERlc2MsIHN0cmVhbSwgbmV3RGV2aWNlLCBhZGRyZXNzLCAmZGVsYXlNcyk7CiAKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIG1PdXRwdXRSb3V0ZXMuZGVjUm91dGVBY3Rpdml0eShzZXNzaW9uKTsKKyAgICAgICAgb3V0cHV0RGVzYy0+c3RvcCgpOwogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KICAgICAvLyBBdXRvbWF0aWNhbGx5IGVuYWJsZSB0aGUgcmVtb3RlIHN1Ym1peCBpbnB1dCB3aGVuIG91dHB1dCBpcyBzdGFydGVkIG9uIGEgcmUgcm91dGluZyBtaXgKQEAgLTEyNjYsNiArMTIxNywxMiBAQAogICAgIGJvb2wgZm9yY2UgPSAhb3V0cHV0RGVzYy0+aXNBY3RpdmUoKSAmJgogICAgICAgICAgICAgKG91dHB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkgPT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpOwogCisgICAgLy8gcmVxdWlyZXNNdXRlQ2hlY2sgaXMgZmFsc2Ugd2hlbiB3ZSBjYW4gYnlwYXNzIG11dGUgc3RyYXRlZ3kuCisgICAgLy8gSXQgY292ZXJzIGEgY29tbW9uIGNhc2Ugd2hlbiB0aGVyZSBpcyBubyBtYXRlcmlhbGx5IGFjdGl2ZSBhdWRpbworICAgIC8vIGFuZCBtdXRpbmcgd291bGQgcmVzdWx0IGluIHVubmVjZXNzYXJ5IGRlbGF5IGFuZCBkcm9wcGVkIGF1ZGlvLgorICAgIGNvbnN0IHVpbnQzMl90IG91dHB1dExhdGVuY3lNcyA9IG91dHB1dERlc2MtPmxhdGVuY3koKTsKKyAgICBib29sIHJlcXVpcmVzTXV0ZUNoZWNrID0gb3V0cHV0RGVzYy0+aXNBY3RpdmUob3V0cHV0TGF0ZW5jeU1zICogMik7ICAvLyBhY2NvdW50IGZvciBkcmFpbgorCiAgICAgLy8gaW5jcmVtZW50IHVzYWdlIGNvdW50IGZvciB0aGlzIHN0cmVhbSBvbiB0aGUgcmVxdWVzdGVkIG91dHB1dDoKICAgICAvLyBOT1RFIHRoYXQgdGhlIHVzYWdlIGNvdW50IGlzIHRoZSBzYW1lIGZvciBkdXBsaWNhdGVkIG91dHB1dCBhbmQgaGFyZHdhcmUgb3V0cHV0IHdoaWNoIGlzCiAgICAgLy8gbmVjZXNzYXJ5IGZvciBhIGNvcnJlY3QgY29udHJvbCBvZiBoYXJkd2FyZSBvdXRwdXQgcm91dGluZyBieSBzdGFydE91dHB1dCgpIGFuZCBzdG9wT3V0cHV0KCkKQEAgLTEyODksMjkgKzEyNDYsNDQgQEAKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKICAgICAgICAgICAgIGlmIChkZXNjICE9IG91dHB1dERlc2MpIHsKKyAgICAgICAgICAgICAgICAvLyBBbiBvdXRwdXQgaGFzIGEgc2hhcmVkIGRldmljZSBpZgorICAgICAgICAgICAgICAgIC8vIC0gbWFuYWdlZCBieSB0aGUgc2FtZSBodyBtb2R1bGUKKyAgICAgICAgICAgICAgICAvLyAtIHN1cHBvcnRzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZGV2aWNlCisgICAgICAgICAgICAgICAgY29uc3QgYm9vbCBzaGFyZWREZXZpY2UgPSBvdXRwdXREZXNjLT5zaGFyZXNId01vZHVsZVdpdGgoZGVzYykKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIChkZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkgJiBkZXZpY2UpICE9IEFVRElPX0RFVklDRV9OT05FOworCiAgICAgICAgICAgICAgICAgLy8gZm9yY2UgYSBkZXZpY2UgY2hhbmdlIGlmIGFueSBvdGhlciBvdXRwdXQgaXM6CiAgICAgICAgICAgICAgICAgLy8gLSBtYW5hZ2VkIGJ5IHRoZSBzYW1lIGh3IG1vZHVsZQotICAgICAgICAgICAgICAgIC8vIC0gaGFzIGEgY3VycmVudCBkZXZpY2Ugc2VsZWN0aW9uIHRoYXQgZGlmZmVycyBmcm9tIHNlbGVjdGVkIGRldmljZS4KICAgICAgICAgICAgICAgICAvLyAtIHN1cHBvcnRzIGN1cnJlbnRseSBzZWxlY3RlZCBkZXZpY2UKKyAgICAgICAgICAgICAgICAvLyAtIGhhcyBhIGN1cnJlbnQgZGV2aWNlIHNlbGVjdGlvbiB0aGF0IGRpZmZlcnMgZnJvbSBzZWxlY3RlZCBkZXZpY2UuCiAgICAgICAgICAgICAgICAgLy8gLSBoYXMgYW4gYWN0aXZlIGF1ZGlvIHBhdGNoCiAgICAgICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCB0aGUgYXVkaW8gSEFMIG11c3QgcmVjZWl2ZSB0aGUgbmV3IGRldmljZSBzZWxlY3Rpb24gc28gdGhhdCBpdCBjYW4KLSAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgdGhlIGRldmljZSBjdXJyZW50bHkgc2VsZWN0ZWQgYnkgdGhlIG90aGVyIGFjdGl2ZSBvdXRwdXQuCi0gICAgICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPnNoYXJlc0h3TW9kdWxlV2l0aChkZXNjKSAmJgorICAgICAgICAgICAgICAgIC8vIGNoYW5nZSB0aGUgZGV2aWNlIGN1cnJlbnRseSBzZWxlY3RlZCBieSB0aGUgb3RoZXIgb3V0cHV0LgorICAgICAgICAgICAgICAgIGlmIChzaGFyZWREZXZpY2UgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPmRldmljZSgpICE9IGRldmljZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpICYgZGV2aWNlICYmCiAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5nZXRQYXRjaEhhbmRsZSgpICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7CiAgICAgICAgICAgICAgICAgICAgIGZvcmNlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgLy8gd2FpdCBmb3IgYXVkaW8gb24gb3RoZXIgYWN0aXZlIG91dHB1dHMgdG8gYmUgcHJlc2VudGVkIHdoZW4gc3RhcnRpbmcKICAgICAgICAgICAgICAgICAvLyBhIG5vdGlmaWNhdGlvbiBzbyB0aGF0IGF1ZGlvIGZvY3VzIGVmZmVjdCBjYW4gcHJvcGFnYXRlLCBvciB0aGF0IGEgbXV0ZS91bm11dGUKICAgICAgICAgICAgICAgICAvLyBldmVudCBvY2N1cnJlZCBmb3IgYmVhY29uCi0gICAgICAgICAgICAgICAgdWludDMyX3QgbGF0ZW5jeSA9IGRlc2MtPmxhdGVuY3koKTsKLSAgICAgICAgICAgICAgICBpZiAoc2hvdWxkV2FpdCAmJiBkZXNjLT5pc0FjdGl2ZShsYXRlbmN5ICogMikgJiYgKHdhaXRNcyA8IGxhdGVuY3kpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdhaXRNcyA9IGxhdGVuY3k7CisgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgbGF0ZW5jeU1zID0gZGVzYy0+bGF0ZW5jeSgpOworICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgaXNBY3RpdmUgPSBkZXNjLT5pc0FjdGl2ZShsYXRlbmN5TXMgKiAyKTsgIC8vIGFjY291bnQgZm9yIGRyYWluCisKKyAgICAgICAgICAgICAgICBpZiAoc2hvdWxkV2FpdCAmJiBpc0FjdGl2ZSAmJiAod2FpdE1zIDwgbGF0ZW5jeU1zKSkgeworICAgICAgICAgICAgICAgICAgICB3YWl0TXMgPSBsYXRlbmN5TXM7CiAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gUmVxdWlyZSBtdXRlIGNoZWNrIGlmIGFub3RoZXIgb3V0cHV0IGlzIG9uIGEgc2hhcmVkIGRldmljZQorICAgICAgICAgICAgICAgIC8vIGFuZCBjdXJyZW50bHkgYWN0aXZlIHRvIGhhdmUgcHJvcGVyIGRyYWluIGFuZCBhdm9pZCBwb3BzLgorICAgICAgICAgICAgICAgIC8vIE5vdGUgcmVzdG9yaW5nIEF1ZGlvVHJhY2tzIG9udG8gdGhpcyBvdXRwdXQgbmVlZHMgdG8gaW52b2tlCisgICAgICAgICAgICAgICAgLy8gYSB2b2x1bWUgcmFtcCBpZiB0aGVyZSBpcyBubyBtdXRlLgorICAgICAgICAgICAgICAgIHJlcXVpcmVzTXV0ZUNoZWNrIHw9IHNoYXJlZERldmljZSAmJiBpc0FjdGl2ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICB1aW50MzJfdCBtdXRlV2FpdE1zID0gc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsIGRldmljZSwgZm9yY2UsIDAsIE5VTEwsIGFkZHJlc3MpOworCisgICAgICAgIGNvbnN0IHVpbnQzMl90IG11dGVXYWl0TXMgPQorICAgICAgICAgICAgICAgIHNldE91dHB1dERldmljZShvdXRwdXREZXNjLCBkZXZpY2UsIGZvcmNlLCAwLCBOVUxMLCBhZGRyZXNzLCByZXF1aXJlc011dGVDaGVjayk7CiAKICAgICAgICAgLy8gaGFuZGxlIHNwZWNpYWwgY2FzZSBmb3Igc29uaWZpY2F0aW9uIHdoaWxlIGluIGNhbGwKICAgICAgICAgaWYgKGlzSW5DYWxsKCkpIHsKQEAgLTEzMzYsNiArMTMwOCwxOSBAQAogICAgICAgICBpZiAod2FpdE1zID4gbXV0ZVdhaXRNcykgewogICAgICAgICAgICAgKmRlbGF5TXMgPSB3YWl0TXMgLSBtdXRlV2FpdE1zOwogICAgICAgICB9CisKKyAgICAgICAgLy8gRklYTUU6IEEgZGV2aWNlIGNoYW5nZSAobXV0ZVdhaXRNcyA+IDApIGxpa2VseSBpbnRyb2R1Y2VzIGEgdm9sdW1lIGNoYW5nZS4KKyAgICAgICAgLy8gQSB2b2x1bWUgY2hhbmdlIGVuYWN0ZWQgYnkgQVBNIHdpdGggMCBkZWxheSBpcyBub3Qgc3luY2hyb25vdXMsIGFzIGl0IGdvZXMKKyAgICAgICAgLy8gdmlhIEF1ZGlvQ29tbWFuZFRocmVhZCB0byBBdWRpb0ZsaW5nZXIuICBIZW5jZSBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSB2b2x1bWUKKyAgICAgICAgLy8gY2hhbmdlIG9jY3VycyBhZnRlciB0aGUgTWl4ZXJUaHJlYWQgc3RhcnRzIGFuZCBjYXVzZXMgYSBzdHJlYW0gdm9sdW1lCisgICAgICAgIC8vIGdsaXRjaC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gV2UgZG8gbm90IGludHJvZHVjZSBhZGRpdGlvbmFsIGRlbGF5IGhlcmUuCisgICAgfQorCisgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSAmJgorICAgICAgICAgICAgbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pID09IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpIHsKKyAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKFNUUkFURUdZX1NPTklGSUNBVElPTiwgdHJ1ZSwgb3V0cHV0RGVzYyk7CiAgICAgfQogCiAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtMTM3OSw3ICsxMzY0LDEyIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gc3RvcFNvdXJjZShvdXRwdXREZXNjLCBzdHJlYW0sIGZvcmNlRGV2aWNlVXBkYXRlKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdG9wU291cmNlKG91dHB1dERlc2MsIHN0cmVhbSwgZm9yY2VEZXZpY2VVcGRhdGUpOworCisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiApIHsKKyAgICAgICAgb3V0cHV0RGVzYy0+c3RvcCgpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0b3BTb3VyY2UoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKQEAgLTE0MjAsNiArMTQxMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAobmV3RGV2aWNlICE9IGRlc2MtPmRldmljZSgpKSkgewogICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlMiA9IGdldE5ld091dHB1dERldmljZShkZXNjLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSA9IGRlc2MtPmRldmljZSgpICE9IG5ld0RldmljZTI7CisKICAgICAgICAgICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKGRlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdEZXZpY2UyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2UsCkBAIC0xNDMzLDYgKzE0MjQsMTIgQEAKICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgb3V0cHV0cyBpZiBzdG9wcGluZyBvbmUgd2l0aCBhIHN0cmVhbSB0aGF0IGNhbiBhZmZlY3Qgbm90aWZpY2F0aW9uIHJvdXRpbmcKICAgICAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvblJvdXRpbmdGb3JTdHJlYW0oc3RyZWFtKTsKICAgICAgICAgfQorCisgICAgICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUgJiYKKyAgICAgICAgICAgICAgICBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkgeworICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKFNUUkFURUdZX1NPTklGSUNBVElPTiwgZmFsc2UsIG91dHB1dERlc2MpOworICAgICAgICB9CisKICAgICAgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fTVVTSUMpIHsKICAgICAgICAgICAgIHNlbGVjdE91dHB1dEZvck11c2ljRWZmZWN0cygpOwogICAgICAgICB9CkBAIC0xNDU0LDE5ICsxNDUxLDYgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCi0gICAgaW50IHRlc3RJbmRleCA9IHRlc3RPdXRwdXRJbmRleChvdXRwdXQpOwotICAgIGlmICh0ZXN0SW5kZXggIT0gMCkgewotICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzQWN0aXZlKCkpIHsKLSAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChvdXRwdXQpOwotICAgICAgICAgICAgcmVtb3ZlT3V0cHV0KG91dHB1dCk7Ci0gICAgICAgICAgICBtVGVzdE91dHB1dHNbdGVzdEluZGV4XSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCi0KICAgICAvLyBSb3V0aW5nCiAgICAgbU91dHB1dFJvdXRlcy5yZW1vdmVSb3V0ZShzZXNzaW9uKTsKIApAQCAtMTQ5NSw3ICsxNDc5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X3R5cGVfdCAqaW5wdXRUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKQogewotICAgIEFMT0dWKCJnZXRJbnB1dEZvckF0dHIoKSBzb3VyY2UgJWQsIHNhbXBsaW5nUmF0ZSAlZCwgZm9ybWF0ICVkLCBjaGFubmVsTWFzayAleCwiCisgICAgQUxPR1YoImdldElucHV0Rm9yQXR0cigpIHNvdXJjZSAlZCwgc2FtcGxpbmcgcmF0ZSAlZCwgZm9ybWF0ICUjeCwgY2hhbm5lbCBtYXNrICUjeCwiCiAgICAgICAgICAgICAic2Vzc2lvbiAlZCwgZmxhZ3MgJSN4IiwKICAgICAgICAgICBhdHRyLT5zb3VyY2UsIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywgc2Vzc2lvbiwgZmxhZ3MpOwogCkBAIC0xNTA3LDE1ICsxNDkxLDE0IEBACiAgICAgQXVkaW9NaXggKnBvbGljeU1peCA9IE5VTEw7CiAgICAgRGV2aWNlVmVjdG9yIGlucHV0RGV2aWNlczsKIAorICAgIGlmIChpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfREVGQVVMVCkgeworICAgICAgICBpbnB1dFNvdXJjZSA9IEFVRElPX1NPVVJDRV9NSUM7CisgICAgfQorCiAgICAgLy8gRXhwbGljaXQgcm91dGluZz8KICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjOwogICAgIGlmICgqc2VsZWN0ZWREZXZpY2VJZCAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPmdldElkKCkgPT0gKnNlbGVjdGVkRGV2aWNlSWQpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2VEZXNjID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBkZXZpY2VEZXNjID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQoKnNlbGVjdGVkRGV2aWNlSWQpOwogICAgIH0KICAgICBtSW5wdXRSb3V0ZXMuYWRkUm91dGUoc2Vzc2lvbiwgU2Vzc2lvblJvdXRlOjpTVFJFQU1fVFlQRV9OQSwgaW5wdXRTb3VyY2UsIGRldmljZURlc2MsIHVpZCk7CiAKQEAgLTE1MzgsMTQgKzE1MjEsMTkgQEAKICAgICAgICAgfQogICAgICAgICAvLyBGb3IgTU1BUCBtb2RlLCB0aGUgZmlyc3QgY2FsbCB0byBnZXRJbnB1dEZvckF0dHIoKSBpcyBtYWRlIG9uIGJlaGFsZiBvZiBhdWRpb2ZsaW5nZXIuCiAgICAgICAgIC8vIFRoZSBzZWNvbmQgY2FsbCBpcyBmb3IgdGhlIGZpcnN0IGFjdGl2ZSBjbGllbnQgYW5kIHNldHMgdGhlIFVJRC4gQW55IGZ1cnRoZXIgY2FsbAotICAgICAgICAvLyBjb3JyZXNwb25kcyB0byBhIG5ldyBjbGllbnQgYW5kIGlzIG9ubHkgcGVybWl0dGVkIGZyb20gdGhlIHNhbWUgVUlkLgorICAgICAgICAvLyBjb3JyZXNwb25kcyB0byBhIG5ldyBjbGllbnQgYW5kIGlzIG9ubHkgcGVybWl0dGVkIGZyb20gdGhlIHNhbWUgVUlELgorICAgICAgICAvLyBJZiB0aGUgZmlyc3QgVUlEIGlzIHNpbGVuY2VkLCBhbGxvdyBhIG5ldyBVSUQgY29ubmVjdGlvbiBhbmQgcmVwbGFjZSB3aXRoIG5ldyBVSUQKICAgICAgICAgaWYgKGF1ZGlvU2Vzc2lvbi0+b3BlbkNvdW50KCkgPT0gMSkgewogICAgICAgICAgICAgYXVkaW9TZXNzaW9uLT5zZXRVaWQodWlkKTsKICAgICAgICAgfSBlbHNlIGlmIChhdWRpb1Nlc3Npb24tPnVpZCgpICE9IHVpZCkgewotICAgICAgICAgICAgQUxPR1coImdldElucHV0Rm9yQXR0cigpIGJhZCB1aWQgJWQgZm9yIHNlc3Npb24gJWQgdWlkICVkIiwKLSAgICAgICAgICAgICAgICAgIHVpZCwgc2Vzc2lvbiwgYXVkaW9TZXNzaW9uLT51aWQoKSk7Ci0gICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICBpZiAoIWF1ZGlvU2Vzc2lvbi0+aXNTaWxlbmNlZCgpKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImdldElucHV0Rm9yQXR0cigpIGJhZCB1aWQgJWQgZm9yIHNlc3Npb24gJWQgdWlkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICB1aWQsIHNlc3Npb24sIGF1ZGlvU2Vzc2lvbi0+dWlkKCkpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdWRpb1Nlc3Npb24tPnNldFVpZCh1aWQpOworICAgICAgICAgICAgYXVkaW9TZXNzaW9uLT5zZXRTaWxlbmNlZChmYWxzZSk7CiAgICAgICAgIH0KICAgICAgICAgYXVkaW9TZXNzaW9uLT5jaGFuZ2VPcGVuQ291bnQoMSk7CiAgICAgICAgICppbnB1dFR5cGUgPSBBUElfSU5QVVRfTEVHQUNZOwpAQCAtMTU2Myw5ICsxNTUxLDYgQEAKICAgICAqaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX0lOVkFMSUQ7CiAKLSAgICBpZiAoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0RFRkFVTFQpIHsKLSAgICAgICAgaW5wdXRTb3VyY2UgPSBBVURJT19TT1VSQ0VfTUlDOwotICAgIH0KICAgICBoYWxJbnB1dFNvdXJjZSA9IGlucHV0U291cmNlOwogCiAgICAgLy8gVE9ETzogY2hlY2sgZm9yIGV4aXN0aW5nIGNsaWVudCBmb3IgdGhpcyBwb3J0IElECkBAIC0xNjE1LDcgKzE2MDAsNyBAQAogICAgIH0KIAogICAgICppbnB1dCA9IGdldElucHV0Rm9yRGV2aWNlKGRldmljZSwgYWRkcmVzcywgc2Vzc2lvbiwgdWlkLCBpbnB1dFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLCBjb25maWctPmZvcm1hdCwgY29uZmlnLT5jaGFubmVsX21hc2ssIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZywgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5TWl4KTsKICAgICBpZiAoKmlucHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMTY0Miw5ICsxNjI3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peCAqcG9saWN5TWl4KQogewpAQCAtMTY2MywxOCArMTY0NiwyMCBAQAogICAgICAgICAgICAgaGFsSW5wdXRTb3VyY2UgPSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT047CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OICYmCi0gICAgICAgICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oY29uZmlnLT5mb3JtYXQpKSB7CiAgICAgICAgIGZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpKGZsYWdzIHwgQVVESU9fSU5QVVRfRkxBR19WT0lQX1RYKTsKICAgICB9CiAKICAgICAvLyBmaW5kIGEgY29tcGF0aWJsZSBpbnB1dCBwcm9maWxlIChub3QgbmVjZXNzYXJpbHkgaWRlbnRpY2FsIGluIHBhcmFtZXRlcnMpCiAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlOwotICAgIC8vIHNhbXBsaW5nUmF0ZSBhbmQgZmxhZ3MgbWF5IGJlIHVwZGF0ZWQgYnkgZ2V0SW5wdXRQcm9maWxlCi0gICAgdWludDMyX3QgcHJvZmlsZVNhbXBsaW5nUmF0ZSA9IChzYW1wbGluZ1JhdGUgPT0gMCkgPyBTQU1QTEVfUkFURV9IWl9ERUZBVUxUIDogc2FtcGxpbmdSYXRlOwotICAgIGF1ZGlvX2Zvcm1hdF90IHByb2ZpbGVGb3JtYXQgPSBmb3JtYXQ7Ci0gICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgcHJvZmlsZUNoYW5uZWxNYXNrID0gY2hhbm5lbE1hc2s7CisgICAgLy8gc2FtcGxpbmcgcmF0ZSBhbmQgZmxhZ3MgbWF5IGJlIHVwZGF0ZWQgYnkgZ2V0SW5wdXRQcm9maWxlCisgICAgdWludDMyX3QgcHJvZmlsZVNhbXBsaW5nUmF0ZSA9IChjb25maWctPnNhbXBsZV9yYXRlID09IDApID8KKyAgICAgICAgICAgIFNBTVBMRV9SQVRFX0haX0RFRkFVTFQgOiBjb25maWctPnNhbXBsZV9yYXRlOworICAgIGF1ZGlvX2Zvcm1hdF90IHByb2ZpbGVGb3JtYXQ7CisgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgcHJvZmlsZUNoYW5uZWxNYXNrID0gY29uZmlnLT5jaGFubmVsX21hc2s7CiAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBwcm9maWxlRmxhZ3MgPSBmbGFnczsKICAgICBmb3IgKDs7KSB7CisgICAgICAgIHByb2ZpbGVGb3JtYXQgPSBjb25maWctPmZvcm1hdDsgLy8gcmVzZXQgZWFjaCB0aW1lIHRocm91Z2ggbG9vcCwgaW4gY2FzZSBpdCBpcyB1cGRhdGVkCiAgICAgICAgIHByb2ZpbGUgPSBnZXRJbnB1dFByb2ZpbGUoZGV2aWNlLCBhZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVTYW1wbGluZ1JhdGUsIHByb2ZpbGVGb3JtYXQsIHByb2ZpbGVDaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlRmxhZ3MpOwpAQCAtMTY4NSwxMyArMTY3MCwxNCBAQAogICAgICAgICB9IGVsc2UgaWYgKHByb2ZpbGVGbGFncyAhPSBBVURJT19JTlBVVF9GTEFHX05PTkUpIHsKICAgICAgICAgICAgIHByb2ZpbGVGbGFncyA9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORTsgLy8gcmV0cnkKICAgICAgICAgfSBlbHNlIHsgLy8gZmFpbAotICAgICAgICAgICAgQUxPR1coImdldElucHV0Rm9yRGV2aWNlKCkgY291bGQgbm90IGZpbmQgcHJvZmlsZSBmb3IgZGV2aWNlIDB4JVgsIgotICAgICAgICAgICAgICAgICAgInNhbXBsaW5nUmF0ZSAldSwgZm9ybWF0ICUjeCwgY2hhbm5lbE1hc2sgMHglWCwgZmxhZ3MgJSN4IiwKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlLCBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZsYWdzKTsKKyAgICAgICAgICAgIEFMT0dXKCJnZXRJbnB1dEZvckRldmljZSgpIGNvdWxkIG5vdCBmaW5kIHByb2ZpbGUgZm9yIGRldmljZSAweCVYLCAiCisgICAgICAgICAgICAgICAgICAic2FtcGxpbmcgcmF0ZSAldSwgZm9ybWF0ICUjeCwgY2hhbm5lbCBtYXNrIDB4JVgsIGZsYWdzICUjeCIsCisgICAgICAgICAgICAgICAgICAgIGRldmljZSwgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLCBmbGFncyk7CiAgICAgICAgICAgICByZXR1cm4gaW5wdXQ7CiAgICAgICAgIH0KICAgICB9CiAgICAgLy8gUGljayBpbnB1dCBzYW1wbGluZyByYXRlIGlmIG5vdCBzcGVjaWZpZWQgYnkgY2xpZW50CisgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gY29uZmlnLT5zYW1wbGVfcmF0ZTsKICAgICBpZiAoc2FtcGxpbmdSYXRlID09IDApIHsKICAgICAgICAgc2FtcGxpbmdSYXRlID0gcHJvZmlsZVNhbXBsaW5nUmF0ZTsKICAgICB9CkBAIC0xNzAyLDE0ICsxNjg4LDE0IEBACiAgICAgfQogCiAgICAgc3A8QXVkaW9TZXNzaW9uPiBhdWRpb1Nlc3Npb24gPSBuZXcgQXVkaW9TZXNzaW9uKHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU291bmRUcmlnZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xpY3lNaXgsIG1wQ2xpZW50SW50ZXJmYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Zm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NvdW5kVHJpZ2dlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5TWl4LCBtcENsaWVudEludGVyZmFjZSk7CiAKIC8vIEZJWE1FOiBkaXNhYmxlIGNvbmN1cnJlbnQgY2FwdHVyZSB1bnRpbCBVSSBpcyByZWFkeQogI2lmIDAKQEAgLTE3NTMsOCArMTczOSw4IEBACiAgICAgICAgICAgICAvLyBjYW4gYmUgc2VsZWN0ZWQuCiAgICAgICAgICAgICBpZiAoIWlzQ29uY3VycmVudFNvdXJjZShpbnB1dFNvdXJjZSkgJiYKICAgICAgICAgICAgICAgICAgICAgKChkZXNjLT5tU2FtcGxpbmdSYXRlICE9IHNhbXBsaW5nUmF0ZSB8fAotICAgICAgICAgICAgICAgICAgICBkZXNjLT5tQ2hhbm5lbE1hc2sgIT0gY2hhbm5lbE1hc2sgfHwKLSAgICAgICAgICAgICAgICAgICAgIWF1ZGlvX2Zvcm1hdHNfbWF0Y2goZGVzYy0+bUZvcm1hdCwgZm9ybWF0KSkgJiYKKyAgICAgICAgICAgICAgICAgICAgZGVzYy0+bUNoYW5uZWxNYXNrICE9IGNvbmZpZy0+Y2hhbm5lbF9tYXNrIHx8CisgICAgICAgICAgICAgICAgICAgICFhdWRpb19mb3JtYXRzX21hdGNoKGRlc2MtPm1Gb3JtYXQsIGNvbmZpZy0+Zm9ybWF0KSkgJiYKICAgICAgICAgICAgICAgICAgICAgKHNvdXJjZV9wcmlvcml0eShkZXNjLT5nZXRIaWdoZXN0UHJpb3JpdHlTb3VyY2UoZmFsc2UgLyphY3RpdmVPbmx5Ki8pKSA8CiAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VfcHJpb3JpdHkoaW5wdXRTb3VyY2UpKSkpIHsKICAgICAgICAgICAgICAgICByZXVzZWRJbnB1dERlc2MgPSBkZXNjOwpAQCAtMTc3Nyw0NCArMTc2Myw0MCBAQAogICAgIH0KICNlbmRpZgogCi0gICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOwotICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IHByb2ZpbGVTYW1wbGluZ1JhdGU7Ci0gICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IHByb2ZpbGVDaGFubmVsTWFzazsKLSAgICBjb25maWcuZm9ybWF0ID0gcHJvZmlsZUZvcm1hdDsKKyAgICBpZiAoIXByb2ZpbGUtPmNhbk9wZW5OZXdJbygpKSB7CisgICAgICAgIHJldHVybiBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICB9CisKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbmV3IEF1ZGlvSW5wdXREZXNjcmlwdG9yKHByb2ZpbGUsIG1wQ2xpZW50SW50ZXJmYWNlKTsKKworICAgIGF1ZGlvX2NvbmZpZ190IGxDb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgbENvbmZpZy5zYW1wbGVfcmF0ZSA9IHByb2ZpbGVTYW1wbGluZ1JhdGU7CisgICAgbENvbmZpZy5jaGFubmVsX21hc2sgPSBwcm9maWxlQ2hhbm5lbE1hc2s7CisgICAgbENvbmZpZy5mb3JtYXQgPSBwcm9maWxlRm9ybWF0OwogCiAgICAgaWYgKGFkZHJlc3MgPT0gIiIpIHsKICAgICAgICAgRGV2aWNlVmVjdG9yIGlucHV0RGV2aWNlcyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZSk7Ci0gICAgICAgIC8vICAgdGhlIGlucHV0cyB2ZWN0b3IgbXVzdCBiZSBvZiBzaXplIDEsIGJ1dCB3ZSBkb24ndCB3YW50IHRvIGNyYXNoIGhlcmUKKyAgICAgICAgLy8gdGhlIGlucHV0cyB2ZWN0b3IgbXVzdCBiZSBvZiBzaXplID49IDEsIGJ1dCB3ZSBkb24ndCB3YW50IHRvIGNyYXNoIGhlcmUKICAgICAgICAgYWRkcmVzcyA9IGlucHV0RGV2aWNlcy5zaXplKCkgPiAwID8gaW5wdXREZXZpY2VzLml0ZW1BdCgwKS0+bUFkZHJlc3MgOiBTdHJpbmc4KCIiKTsKICAgICB9CiAKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3BlbklucHV0KHByb2ZpbGUtPmdldE1vZHVsZUhhbmRsZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsSW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlRmxhZ3MpOworICAgIHN0YXR1c190IHN0YXR1cyA9IGlucHV0RGVzYy0+b3BlbigmbENvbmZpZywgZGV2aWNlLCBhZGRyZXNzLAorICAgICAgICAgICAgaGFsSW5wdXRTb3VyY2UsIHByb2ZpbGVGbGFncywgJmlucHV0KTsKIAogICAgIC8vIG9ubHkgYWNjZXB0IGlucHV0IHdpdGggdGhlIGV4YWN0IHJlcXVlc3RlZCBzZXQgb2YgcGFyYW1ldGVycwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwgaW5wdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUgfHwKLSAgICAgICAgKHByb2ZpbGVTYW1wbGluZ1JhdGUgIT0gY29uZmlnLnNhbXBsZV9yYXRlKSB8fAotICAgICAgICAhYXVkaW9fZm9ybWF0c19tYXRjaChwcm9maWxlRm9ybWF0LCBjb25maWcuZm9ybWF0KSB8fAotICAgICAgICAocHJvZmlsZUNoYW5uZWxNYXNrICE9IGNvbmZpZy5jaGFubmVsX21hc2spKSB7Ci0gICAgICAgIEFMT0dXKCJnZXRJbnB1dEZvckF0dHIoKSBmYWlsZWQgb3BlbmluZyBpbnB1dDogc2FtcGxpbmdSYXRlICVkIgotICAgICAgICAgICAgICAiLCBmb3JtYXQgJWQsIGNoYW5uZWxNYXNrICV4IiwKLSAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2spOworICAgICAgICAocHJvZmlsZVNhbXBsaW5nUmF0ZSAhPSBsQ29uZmlnLnNhbXBsZV9yYXRlKSB8fAorICAgICAgICAhYXVkaW9fZm9ybWF0c19tYXRjaChwcm9maWxlRm9ybWF0LCBsQ29uZmlnLmZvcm1hdCkgfHwKKyAgICAgICAgKHByb2ZpbGVDaGFubmVsTWFzayAhPSBsQ29uZmlnLmNoYW5uZWxfbWFzaykpIHsKKyAgICAgICAgQUxPR1coImdldElucHV0Rm9yQXR0cigpIGZhaWxlZCBvcGVuaW5nIGlucHV0OiBzYW1wbGluZyByYXRlICVkIgorICAgICAgICAgICAgICAiLCBmb3JtYXQgJSN4LCBjaGFubmVsIG1hc2sgJSN4IiwKKyAgICAgICAgICAgICAgcHJvZmlsZVNhbXBsaW5nUmF0ZSwgcHJvZmlsZUZvcm1hdCwgcHJvZmlsZUNoYW5uZWxNYXNrKTsKICAgICAgICAgaWYgKGlucHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VJbnB1dChpbnB1dCk7CisgICAgICAgICAgICBpbnB1dERlc2MtPmNsb3NlKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgIH0KIAotICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBuZXcgQXVkaW9JbnB1dERlc2NyaXB0b3IocHJvZmlsZSk7Ci0gICAgaW5wdXREZXNjLT5tU2FtcGxpbmdSYXRlID0gcHJvZmlsZVNhbXBsaW5nUmF0ZTsKLSAgICBpbnB1dERlc2MtPm1Gb3JtYXQgPSBwcm9maWxlRm9ybWF0OwotICAgIGlucHV0RGVzYy0+bUNoYW5uZWxNYXNrID0gcHJvZmlsZUNoYW5uZWxNYXNrOwotICAgIGlucHV0RGVzYy0+bURldmljZSA9IGRldmljZTsKICAgICBpbnB1dERlc2MtPm1Qb2xpY3lNaXggPSBwb2xpY3lNaXg7CiAgICAgaW5wdXREZXNjLT5hZGRBdWRpb1Nlc3Npb24oc2Vzc2lvbiwgYXVkaW9TZXNzaW9uKTsKIApAQCAtMTg1NSw5ICsxODM3LDcgQEAKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgVmVjdG9yPCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gPiBhY3RpdmVJbnB1dHMgPSBtSW5wdXRzLmdldEFjdGl2ZUlucHV0cygpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgIGFjdGl2ZUlucHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gYWN0aXZlSW5wdXQgPSBhY3RpdmVJbnB1dHNbaV07CisgICAgZm9yIChjb25zdCBhdXRvJiBhY3RpdmVJbnB1dCA6IG1JbnB1dHMuZ2V0QWN0aXZlSW5wdXRzKCkpIHsKICAgICAgICAgaWYgKCFpc0NvbmN1cnJlbnRTb3VyY2UoYWN0aXZlSW5wdXQtPmlucHV0U291cmNlKHRydWUpKSAmJgogICAgICAgICAgICAgICAgICFpc192aXJ0dWFsX2lucHV0X2RldmljZShhY3RpdmVJbnB1dC0+bURldmljZSkpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTE5MDQsMTAgKzE4ODQsMTUgQEAKIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2lsZW5jZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY3VycmVuY3lfdHlwZV9fbWFza190ICpjb25jdXJyZW5jeSkKIHsKLSAgICBBTE9HVigic3RhcnRJbnB1dCgpIGlucHV0ICVkIiwgaW5wdXQpOworCisgICAgQUxPR1YoIkF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRJbnB1dChpbnB1dDolZCwgc2Vzc2lvbjolZCwgc2lsZW5jZWQ6JWQsIGNvbmN1cnJlbmN5OiVkKSIsCisgICAgICAgICAgICBpbnB1dCwgc2Vzc2lvbiwgc2lsZW5jZWQsICpjb25jdXJyZW5jeSk7CisKICAgICAqY29uY3VycmVuY3kgPSBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfTk9ORTsKKwogICAgIHNzaXplX3QgaW5kZXggPSBtSW5wdXRzLmluZGV4T2ZLZXkoaW5wdXQpOwogICAgIGlmIChpbmRleCA8IDApIHsKICAgICAgICAgQUxPR1coInN0YXJ0SW5wdXQoKSB1bmtub3duIGlucHV0ICVkIiwgaW5wdXQpOwpAQCAtMTkzOSwxNyArMTkyNCwzNyBAQAogICAgICAgICBpZiAobUNhbGxUeFBhdGNoICE9IDAgJiYKICAgICAgICAgICAgIGlucHV0RGVzYy0+Z2V0TW9kdWxlSGFuZGxlKCkgPT0gbUNhbGxUeFBhdGNoLT5tUGF0Y2guc291cmNlc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSkgewogICAgICAgICAgICAgQUxPR1coInN0YXJ0SW5wdXQoJWQpIGZhaWxlZDogY2FsbCBpbiBwcm9ncmVzcyIsIGlucHV0KTsKKyAgICAgICAgICAgICpjb25jdXJyZW5jeSB8PSBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfQ0FMTDsKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgfQogCi0gICAgICAgIFZlY3Rvcjwgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+ID4gYWN0aXZlSW5wdXRzID0gbUlucHV0cy5nZXRBY3RpdmVJbnB1dHMoKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhY3RpdmVJbnB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBhY3RpdmVEZXNjID0gYWN0aXZlSW5wdXRzW2ldOworICAgICAgICBWZWN0b3I8c3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+PiBhY3RpdmVJbnB1dHMgPSBtSW5wdXRzLmdldEFjdGl2ZUlucHV0cygpOwogCi0gICAgICAgICAgICBpZiAoaXNfdmlydHVhbF9pbnB1dF9kZXZpY2UoYWN0aXZlRGVzYy0+bURldmljZSkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgLy8gSWYgYSBVSUQgaXMgaWRsZSBhbmQgcmVjb3JkcyBzaWxlbmNlIGFuZCBhbm90aGVyIG5vdCBzaWxlbmNlZCByZWNvcmRpbmcgc3RhcnRzCisgICAgICAgIC8vIGZyb20gYW5vdGhlciBVSUQgKGlkbGUgb3IgYWN0aXZlKSB3ZSBzdG9wIHRoZSBjdXJyZW50IGlkbGUgVUlEIHJlY29yZGluZyBpbgorICAgICAgICAvLyBmYXZvciBvZiB0aGUgbmV3IG9uZSAtICJUaGVyZSBjYW4gYmUgb25seSBvbmUiIFRNCisgICAgICAgIGlmICghc2lsZW5jZWQpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgYWN0aXZlRGVzYyA6IGFjdGl2ZUlucHV0cykgeworICAgICAgICAgICAgICAgIGlmICgoYXVkaW9TZXNzaW9uLT5mbGFncygpICYgQVVESU9fSU5QVVRfRkxBR19NTUFQX05PSVJRKSAhPSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVEZXNjLT5nZXRJZCgpID09IGlucHV0RGVzYy0+Z2V0SWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbiBhY3RpdmVTZXNzaW9ucyA9IGFjdGl2ZURlc2MtPmdldEF1ZGlvU2Vzc2lvbnMoCisgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qYWN0aXZlT25seSovKTsKKyAgICAgICAgICAgICAgICBzcDxBdWRpb1Nlc3Npb24+IGFjdGl2ZVNlc3Npb24gPSBhY3RpdmVTZXNzaW9ucy52YWx1ZUF0KDApOworICAgICAgICAgICAgICAgIGlmIChhY3RpdmVTZXNzaW9uLT5pc1NpbGVuY2VkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgYWN0aXZlSW5wdXQgPSBhY3RpdmVEZXNjLT5tSW9IYW5kbGU7CisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBhY3RpdmVTZXNzaW9uSWQgPSBhY3RpdmVTZXNzaW9uLT5zZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgICAgIHN0b3BJbnB1dChhY3RpdmVJbnB1dCwgYWN0aXZlU2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUlucHV0KGFjdGl2ZUlucHV0LCBhY3RpdmVTZXNzaW9uSWQpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigic3RhcnRJbnB1dCglZCkgc3RvcHBpbmcgc2lsZW5jZWQgaW5wdXQgJWQiLCBpbnB1dCwgYWN0aXZlSW5wdXQpOworICAgICAgICAgICAgICAgICAgICBhY3RpdmVJbnB1dHMgPSBtSW5wdXRzLmdldEFjdGl2ZUlucHV0cygpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgfQogCisgICAgICAgIGZvciAoY29uc3QgYXV0byYgYWN0aXZlRGVzYyA6IGFjdGl2ZUlucHV0cykgewogICAgICAgICAgICAgaWYgKChhdWRpb1Nlc3Npb24tPmZsYWdzKCkgJiBBVURJT19JTlBVVF9GTEFHX01NQVBfTk9JUlEpICE9IDAgJiYKICAgICAgICAgICAgICAgICAgICAgYWN0aXZlRGVzYy0+Z2V0SWQoKSA9PSBpbnB1dERlc2MtPmdldElkKCkpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTE5NjIsMTcgKzE5NjcsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJzdGFydElucHV0KCVkKSBmYWlsZWQgZm9yIEhPVFdPUkQ6ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm90aGVyIGlucHV0ICVkIGFscmVhZHkgc3RhcnRlZCBmb3IgSE9UV09SRCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwgYWN0aXZlRGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpjb25jdXJyZW5jeSB8PSBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfSE9UV09SRDsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJzdGFydElucHV0KCVkKSBmYWlsZWQgZm9yIEhPVFdPUkQ6IG90aGVyIGlucHV0ICVkIGFscmVhZHkgc3RhcnRlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LCBhY3RpdmVEZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAqY29uY3VycmVuY3kgfD0gQVBJX0lOUFVUX0NPTkNVUlJFTkNZX0NBUFRVUkU7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlmIChhY3RpdmVTb3VyY2UgIT0gQVVESU9fU09VUkNFX0hPVFdPUkQpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1coInN0YXJ0SW5wdXQoJWQpIGZhaWxlZDogb3RoZXIgaW5wdXQgJWQgYWxyZWFkeSBzdGFydGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsIGFjdGl2ZURlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICpjb25jdXJyZW5jeSB8PSBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfQ0FQVFVSRTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTE5ODUsMTMgKzE5OTMsNyBAQAogICAgICAgICAgICAgaW5wdXREZXNjLT5pc1NvdW5kVHJpZ2dlcigpID8gc291bmRUcmlnZ2VyU3VwcG9ydHNDb25jdXJyZW50Q2FwdHVyZSgpIDogZmFsc2U7CiAKICAgICAgICAgLy8gaWYgY2FwdHVyZSBpcyBhbGxvd2VkLCBwcmVlbXB0IGN1cnJlbnRseSBhY3RpdmUgSE9UV09SRCBjYXB0dXJlcwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFjdGl2ZUlucHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGFjdGl2ZURlc2MgPSBhY3RpdmVJbnB1dHNbaV07Ci0KLSAgICAgICAgICAgIGlmIChpc192aXJ0dWFsX2lucHV0X2RldmljZShhY3RpdmVEZXNjLT5tRGV2aWNlKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCisgICAgICAgIGZvciAoY29uc3QgYXV0byYgYWN0aXZlRGVzYyA6IGFjdGl2ZUlucHV0cykgewogICAgICAgICAgICAgaWYgKGFsbG93Q29uY3VycmVudFdpdGhTb3VuZFRyaWdnZXIgJiYgYWN0aXZlRGVzYy0+aXNTb3VuZFRyaWdnZXIoKSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQpAQCAtMjAwMyw2ICsyMDA1LDcgQEAKICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgYWN0aXZlU2Vzc2lvbiA9IGFjdGl2ZVNlc3Npb25zLmtleUF0KDApOwogICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGFjdGl2ZUhhbmRsZSA9IGFjdGl2ZURlc2MtPm1Jb0hhbmRsZTsKICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9fc2Vzc2lvbl90PiBzZXNzaW9ucyA9IGFjdGl2ZURlc2MtPmdldFByZWVtcHRlZFNlc3Npb25zKCk7CisgICAgICAgICAgICAgICAgKmNvbmN1cnJlbmN5IHw9IEFQSV9JTlBVVF9DT05DVVJSRU5DWV9QUkVFTVBUOwogICAgICAgICAgICAgICAgIHNlc3Npb25zLmFkZChhY3RpdmVTZXNzaW9uKTsKICAgICAgICAgICAgICAgICBpbnB1dERlc2MtPnNldFByZWVtcHRlZFNlc3Npb25zKHNlc3Npb25zKTsKICAgICAgICAgICAgICAgICBzdG9wSW5wdXQoYWN0aXZlSGFuZGxlLCBhY3RpdmVTZXNzaW9uKTsKQEAgLTIwMTQsNiArMjAxNyw5IEBACiAgICAgfQogI2VuZGlmCiAKKyAgICAvLyBNYWtlIHN1cmUgd2Ugc3RhcnQgd2l0aCB0aGUgY29ycmVjdCBzaWxlbmNlIHN0YXRlCisgICAgYXVkaW9TZXNzaW9uLT5zZXRTaWxlbmNlZChzaWxlbmNlZCk7CisKICAgICAvLyBpbmNyZW1lbnQgYWN0aXZpdHkgY291bnQgYmVmb3JlIGNhbGxpbmcgZ2V0TmV3SW5wdXREZXZpY2UoKSBiZWxvdyBhcyBvbmx5IGFjdGl2ZSBzZXNzaW9ucwogICAgIC8vIGFyZSBjb25zaWRlcmVkIGZvciBkZXZpY2Ugc2VsZWN0aW9uCiAgICAgYXVkaW9TZXNzaW9uLT5jaGFuZ2VBY3RpdmVDb3VudCgxKTsKQEAgLTIwMjEsMTIgKzIwMjcsMTkgQEAKICAgICAvLyBSb3V0aW5nPwogICAgIG1JbnB1dFJvdXRlcy5pbmNSb3V0ZUFjdGl2aXR5KHNlc3Npb24pOwogCi0gICAgaWYgKGF1ZGlvU2Vzc2lvbi0+YWN0aXZlQ291bnQoKSA9PSAxIHx8IG1JbnB1dFJvdXRlcy5oYXNSb3V0ZUNoYW5nZWQoc2Vzc2lvbikpIHsKKyAgICBpZiAoYXVkaW9TZXNzaW9uLT5hY3RpdmVDb3VudCgpID09IDEgfHwgbUlucHV0Um91dGVzLmdldEFuZENsZWFyUm91dGVDaGFuZ2VkKHNlc3Npb24pKSB7CiAgICAgICAgIC8vIGluZGljYXRlIGFjdGl2ZSBjYXB0dXJlIHRvIHNvdW5kIHRyaWdnZXIgc2VydmljZSBpZiBzdGFydGluZyBjYXB0dXJlIGZyb20gYSBtaWMgb24KICAgICAgICAgLy8gcHJpbWFyeSBIVyBtb2R1bGUKICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGdldE5ld0lucHV0RGV2aWNlKGlucHV0RGVzYyk7CiAgICAgICAgIHNldElucHV0RGV2aWNlKGlucHV0LCBkZXZpY2UsIHRydWUgLyogZm9yY2UgKi8pOwogCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGlucHV0RGVzYy0+c3RhcnQoKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgbUlucHV0Um91dGVzLmRlY1JvdXRlQWN0aXZpdHkoc2Vzc2lvbik7CisgICAgICAgICAgICBhdWRpb1Nlc3Npb24tPmNoYW5nZUFjdGl2ZUNvdW50KC0xKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKwogICAgICAgICBpZiAoaW5wdXREZXNjLT5nZXRBdWRpb1Nlc3Npb25Db3VudCh0cnVlLyphY3RpdmVPbmx5Ki8pID09IDEpIHsKICAgICAgICAgICAgIC8vIGlmIGlucHV0IG1hcHMgdG8gYSBkeW5hbWljIHBvbGljeSB3aXRoIGFuIGFjdGl2aXR5IGxpc3RlbmVyLCBub3RpZnkgb2Ygc3RhdGUgY2hhbmdlCiAgICAgICAgICAgICBpZiAoKGlucHV0RGVzYy0+bVBvbGljeU1peCAhPSBOVUxMKQpAQCAtMjA5Myw3ICsyMTA2LDcgQEAKICAgICBtSW5wdXRSb3V0ZXMuZGVjUm91dGVBY3Rpdml0eShzZXNzaW9uKTsKIAogICAgIGlmIChhdWRpb1Nlc3Npb24tPmFjdGl2ZUNvdW50KCkgPT0gMCkgewotCisgICAgICAgIGlucHV0RGVzYy0+c3RvcCgpOwogICAgICAgICBpZiAoaW5wdXREZXNjLT5pc0FjdGl2ZSgpKSB7CiAgICAgICAgICAgICBzZXRJbnB1dERldmljZShpbnB1dCwgZ2V0TmV3SW5wdXREZXZpY2UoaW5wdXREZXNjKSwgZmFsc2UgLyogZm9yY2UgKi8pOwogICAgICAgICB9IGVsc2UgewpAQCAtMjEzOSw3ICsyMTUyLDYgQEAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQogewotCiAgICAgQUxPR1YoInJlbGVhc2VJbnB1dCgpICVkIiwgaW5wdXQpOwogICAgIHNzaXplX3QgaW5kZXggPSBtSW5wdXRzLmluZGV4T2ZLZXkoaW5wdXQpOwogICAgIGlmIChpbmRleCA8IDApIHsKQEAgLTIxODIsNyArMjE5NCw3IEBACiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2xvc2VBbGxJbnB1dHMoKSB7CiAgICAgYm9vbCBwYXRjaFJlbW92ZWQgPSBmYWxzZTsKIAotICAgIGZvcihzaXplX3QgaW5wdXRfaW5kZXggPSAwOyBpbnB1dF9pbmRleCA8IG1JbnB1dHMuc2l6ZSgpOyBpbnB1dF9pbmRleCsrKSB7CisgICAgZm9yIChzaXplX3QgaW5wdXRfaW5kZXggPSAwOyBpbnB1dF9pbmRleCA8IG1JbnB1dHMuc2l6ZSgpOyBpbnB1dF9pbmRleCsrKSB7CiAgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5wdXRfaW5kZXgpOwogICAgICAgICBzc2l6ZV90IHBhdGNoX2luZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGlucHV0RGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSk7CiAgICAgICAgIGlmIChwYXRjaF9pbmRleCA+PSAwKSB7CkBAIC0yMTkxLDggKzIyMDMsOSBAQAogICAgICAgICAgICAgbUF1ZGlvUGF0Y2hlcy5yZW1vdmVJdGVtc0F0KHBhdGNoX2luZGV4KTsKICAgICAgICAgICAgIHBhdGNoUmVtb3ZlZCA9IHRydWU7CiAgICAgICAgIH0KLSAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlSW5wdXQobUlucHV0cy5rZXlBdChpbnB1dF9pbmRleCkpOworICAgICAgICBpbnB1dERlc2MtPmNsb3NlKCk7CiAgICAgfQorICAgIG1JbnB1dFJvdXRlcy5jbGVhcigpOwogICAgIG1JbnB1dHMuY2xlYXIoKTsKICAgICBTb3VuZFRyaWdnZXI6OnNldENhcHR1cmVTdGF0ZShmYWxzZSk7CiAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKQEAgLTIyMjMsNyArMjIzNiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQogewogCi0gICAgaWYgKChpbmRleCA8IG1Wb2x1bWVDdXJ2ZXMtPmdldFZvbHVtZUluZGV4TWluKHN0cmVhbSkpIHx8CisgICAgLy8gVk9JQ0VfQ0FMTCBzdHJlYW0gaGFzIG1pblZvbHVtZUluZGV4ID4gMCAgYnV0IGNhbiBiZSBtdXRlZCBkaXJlY3RseSBieSBhbgorICAgIC8vIGFwcCB0aGF0IGhhcyBNT0RJRllfUEhPTkVfU1RBVEUgcGVybWlzc2lvbi4KKyAgICBpZiAoKChpbmRleCA8IG1Wb2x1bWVDdXJ2ZXMtPmdldFZvbHVtZUluZGV4TWluKHN0cmVhbSkpICYmCisgICAgICAgICAgICAhKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCAmJiBpbmRleCA9PSAwKSkgfHwKICAgICAgICAgICAgIChpbmRleCA+IG1Wb2x1bWVDdXJ2ZXMtPmdldFZvbHVtZUluZGV4TWF4KHN0cmVhbSkpKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQpAQCAtMjM0NiwyMSArMjM2MiwyMSBAQAogICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXREZWVwQnVmZmVyID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dFByaW1hcnkgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKIAotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0c1tpXSk7CisgICAgICAgIGZvciAoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0IDogb3V0cHV0cykgeworICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwogICAgICAgICAgICAgaWYgKGFjdGl2ZU9ubHkgJiYgIWRlc2MtPmlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9NVVNJQykpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dWKCJzZWxlY3RPdXRwdXRGb3JNdXNpY0VmZmVjdHMgYWN0aXZlT25seSAlZCBvdXRwdXRzWyV6dV0gZmxhZ3MgMHglMDh4IiwKLSAgICAgICAgICAgICAgICAgIGFjdGl2ZU9ubHksIGksIGRlc2MtPm1GbGFncyk7CisgICAgICAgICAgICBBTE9HVigic2VsZWN0T3V0cHV0Rm9yTXVzaWNFZmZlY3RzIGFjdGl2ZU9ubHkgJWQgb3V0cHV0ICVkIGZsYWdzIDB4JTA4eCIsCisgICAgICAgICAgICAgICAgICBhY3RpdmVPbmx5LCBvdXRwdXQsIGRlc2MtPm1GbGFncyk7CiAgICAgICAgICAgICBpZiAoKGRlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDApIHsKLSAgICAgICAgICAgICAgICBvdXRwdXRPZmZsb2FkZWQgPSBvdXRwdXRzW2ldOworICAgICAgICAgICAgICAgIG91dHB1dE9mZmxvYWRlZCA9IG91dHB1dDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICgoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfREVFUF9CVUZGRVIpICE9IDApIHsKLSAgICAgICAgICAgICAgICBvdXRwdXREZWVwQnVmZmVyID0gb3V0cHV0c1tpXTsKKyAgICAgICAgICAgICAgICBvdXRwdXREZWVwQnVmZmVyID0gb3V0cHV0OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKChkZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19QUklNQVJZKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0UHJpbWFyeSA9IG91dHB1dHNbaV07CisgICAgICAgICAgICAgICAgb3V0cHV0UHJpbWFyeSA9IG91dHB1dDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAob3V0cHV0T2ZmbG9hZGVkICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CkBAIC0yNDcxLDIzICsyNDg3LDE2IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBpZiAoKG1peGVzW2ldLm1Sb3V0ZUZsYWdzICYgTUlYX1JPVVRFX0ZMQUdfTE9PUF9CQUNLKSA9PSBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0spIHsKLSAgICAgICAgICAgIC8vIExvb3AgYmFjayB0aHJvdWdoICJyZW1vdGUgc3VibWl4IgotICAgICAgICAgICAgaWYgKHJTdWJtaXhNb2R1bGUgPT0gMCkgewotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBpIDwgbUh3TW9kdWxlcy5zaXplKCk7IGorKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RyY21wKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9SRU1PVEVfU1VCTUlYLCBtSHdNb2R1bGVzW2pdLT5tTmFtZSkgPT0gMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1Id01vZHVsZXNbal0tPm1IYW5kbGUgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgclN1Ym1peE1vZHVsZSA9IG1Id01vZHVsZXNbal07Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgQUxPR1YoInJlZ2lzdGVyUG9saWN5TWl4ZXMoKSBtaXggJXp1IG9mICV6dSBpcyBMT09QX0JBQ0siLCBpLCBtaXhlcy5zaXplKCkpOwotCiAgICAgICAgICAgICBpZiAoclN1Ym1peE1vZHVsZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiBVbmFibGUgdG8gZmluZCBhdWRpbyBtb2R1bGUgZm9yIHN1Ym1peCwgYWJvcnRpbmcgbWl4ICV6dSByZWdpc3RyYXRpb24iLCBpKTsKLSAgICAgICAgICAgICAgICByZXMgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICByU3VibWl4TW9kdWxlID0gbUh3TW9kdWxlcy5nZXRNb2R1bGVGcm9tTmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9SRU1PVEVfU1VCTUlYKTsKKyAgICAgICAgICAgICAgICBpZiAoclN1Ym1peE1vZHVsZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIgVW5hYmxlIHRvIGZpbmQgYXVkaW8gbW9kdWxlIGZvciBzdWJtaXgsIGFib3J0aW5nIG1peCAlenUgcmVnaXN0cmF0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gbWl4ZXNbaV0ubURldmljZUFkZHJlc3M7CkBAIC0yNTY2LDI0ICsyNTc1LDE5IEBACiAgICAgc3RhdHVzX3QgcmVzID0gTk9fRVJST1I7CiAgICAgc3A8SHdNb2R1bGU+IHJTdWJtaXhNb2R1bGU7CiAgICAgLy8gZXhhbWluZSBlYWNoIG1peCdzIHJvdXRlIHR5cGUKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1peGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmICgobWl4ZXNbaV0ubVJvdXRlRmxhZ3MgJiBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0spID09IE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDSykgeworICAgIGZvciAoY29uc3QgYXV0byYgbWl4IDogbWl4ZXMpIHsKKyAgICAgICAgaWYgKChtaXgubVJvdXRlRmxhZ3MgJiBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0spID09IE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDSykgewogCiAgICAgICAgICAgICBpZiAoclN1Ym1peE1vZHVsZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGkgPCBtSHdNb2R1bGVzLnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdHJjbXAoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1JFTU9URV9TVUJNSVgsIG1Id01vZHVsZXNbal0tPm1OYW1lKSA9PSAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbUh3TW9kdWxlc1tqXS0+bUhhbmRsZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByU3VibWl4TW9kdWxlID0gbUh3TW9kdWxlc1tqXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgclN1Ym1peE1vZHVsZSA9IG1Id01vZHVsZXMuZ2V0TW9kdWxlRnJvbU5hbWUoCisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUkVNT1RFX1NVQk1JWCk7CisgICAgICAgICAgICAgICAgaWYgKHJTdWJtaXhNb2R1bGUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJTdWJtaXhNb2R1bGUgPT0gMCkgewotICAgICAgICAgICAgICAgIHJlcyA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBtaXhlc1tpXS5tRGV2aWNlQWRkcmVzczsKKyAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IG1peC5tRGV2aWNlQWRkcmVzczsKIAogICAgICAgICAgICAgaWYgKG1Qb2xpY3lNaXhlcy51bnJlZ2lzdGVyTWl4KGFkZHJlc3MpICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgcmVzID0gSU5WQUxJRF9PUEVSQVRJT047CkBAIC0yNjA1LDggKzI2MDksOCBAQAogICAgICAgICAgICAgclN1Ym1peE1vZHVsZS0+cmVtb3ZlT3V0cHV0UHJvZmlsZShhZGRyZXNzKTsKICAgICAgICAgICAgIHJTdWJtaXhNb2R1bGUtPnJlbW92ZUlucHV0UHJvZmlsZShhZGRyZXNzKTsKIAotICAgICAgICB9IGlmICgobWl4ZXNbaV0ubVJvdXRlRmxhZ3MgJiBNSVhfUk9VVEVfRkxBR19SRU5ERVIpID09IE1JWF9ST1VURV9GTEFHX1JFTkRFUikgewotICAgICAgICAgICAgaWYgKG1Qb2xpY3lNaXhlcy51bnJlZ2lzdGVyTWl4KG1peGVzW2ldLm1EZXZpY2VBZGRyZXNzKSAhPSBOT19FUlJPUikgeworICAgICAgICB9IGlmICgobWl4Lm1Sb3V0ZUZsYWdzICYgTUlYX1JPVVRFX0ZMQUdfUkVOREVSKSA9PSBNSVhfUk9VVEVfRkxBR19SRU5ERVIpIHsKKyAgICAgICAgICAgIGlmIChtUG9saWN5TWl4ZXMudW5yZWdpc3Rlck1peChtaXgubURldmljZUFkZHJlc3MpICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgcmVzID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CkBAIC0yNjU4LDcgKzI2NjIsNyBAQAogCiAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZHVtcChmZCwgU3RyaW5nOCgiQXZhaWxhYmxlIG91dHB1dCIpKTsKICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmR1bXAoZmQsIFN0cmluZzgoIkF2YWlsYWJsZSBpbnB1dCIpKTsKLSAgICBtSHdNb2R1bGVzLmR1bXAoZmQpOworICAgIG1Id01vZHVsZXNBbGwuZHVtcChmZCk7CiAgICAgbU91dHB1dHMuZHVtcChmZCk7CiAgICAgbUlucHV0cy5kdW1wKGZkKTsKICAgICBtVm9sdW1lQ3VydmVzLT5kdW1wKGZkKTsKQEAgLTI3NjMsMjMgKzI3NjcsMjMgQEAKICAgICAgICAgLy8gZG8gbm90IHJlcG9ydCBkZXZpY2VzIHdpdGggdHlwZSBBVURJT19ERVZJQ0VfSU5fU1RVQiBvciBBVURJT19ERVZJQ0VfT1VUX1NUVUIKICAgICAgICAgLy8gYXMgdGhleSBhcmUgdXNlZCBieSBzdHViIEhBTHMgYnkgY29udmVudGlvbgogICAgICAgICBpZiAocm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSyB8fCByb2xlID09IEFVRElPX1BPUlRfUk9MRV9OT05FKSB7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2ldLT50eXBlKCkgPT0gQVVESU9fREVWSUNFX09VVF9TVFVCKSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGRldiA6IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzKSB7CisgICAgICAgICAgICAgICAgaWYgKGRldi0+dHlwZSgpID09IEFVRElPX0RFVklDRV9PVVRfU1RVQikgewogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKHBvcnRzV3JpdHRlbiA8IHBvcnRzTWF4KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2ldLT50b0F1ZGlvUG9ydCgmcG9ydHNbcG9ydHNXcml0dGVuKytdKTsKKyAgICAgICAgICAgICAgICAgICAgZGV2LT50b0F1ZGlvUG9ydCgmcG9ydHNbcG9ydHNXcml0dGVuKytdKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgKCpudW1fcG9ydHMpKys7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSB8fCByb2xlID09IEFVRElPX1BPUlRfUk9MRV9OT05FKSB7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdmFpbGFibGVJbnB1dERldmljZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+dHlwZSgpID09IEFVRElPX0RFVklDRV9JTl9TVFVCKSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGRldiA6IG1BdmFpbGFibGVJbnB1dERldmljZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGV2LT50eXBlKCkgPT0gQVVESU9fREVWSUNFX0lOX1NUVUIpIHsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChwb3J0c1dyaXR0ZW4gPCBwb3J0c01heCkgewotICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT50b0F1ZGlvUG9ydCgmcG9ydHNbcG9ydHNXcml0dGVuKytdKTsKKyAgICAgICAgICAgICAgICAgICAgZGV2LT50b0F1ZGlvUG9ydCgmcG9ydHNbcG9ydHNXcml0dGVuKytdKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgKCpudW1fcG9ydHMpKys7CiAgICAgICAgICAgICB9CkBAIC0yODEwLDkgKzI4MTQsMzIgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0IF9fdW51c2VkKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpCiB7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIGlmIChwb3J0ID09IG51bGxwdHIgfHwgcG9ydC0+aWQgPT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXYgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQocG9ydC0+aWQpOworICAgIGlmIChkZXYgIT0gMCkgeworICAgICAgICBkZXYtPnRvQXVkaW9Qb3J0KHBvcnQpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorICAgIGRldiA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKHBvcnQtPmlkKTsKKyAgICBpZiAoZGV2ICE9IDApIHsKKyAgICAgICAgZGV2LT50b0F1ZGlvUG9ydChwb3J0KTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0ID0gbU91dHB1dHMuZ2V0T3V0cHV0RnJvbUlkKHBvcnQtPmlkKTsKKyAgICBpZiAob3V0ICE9IDApIHsKKyAgICAgICAgb3V0LT50b0F1ZGlvUG9ydChwb3J0KTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW4gPSBtSW5wdXRzLmdldElucHV0RnJvbUlkKHBvcnQtPmlkKTsKKyAgICBpZiAoaW4gIT0gMCkgeworICAgICAgICBpbi0+dG9BdWRpb1BvcnQocG9ydCk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCkBAIC0zMDE4LDcgKzMwNDUsNyBAQAogICAgICAgICAgICAgICAgIHNpbmtEZXZpY2VEZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmbmV3UGF0Y2guc2lua3NbaV0sICZwYXRjaC0+c2lua3NbaV0pOwogCiAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGEgc29mdHdhcmUgYnJpZGdlIGluIFBhdGNoUGFuZWwgaWY6Ci0gICAgICAgICAgICAgICAgLy8gLSBzb3VyY2UgYW5kIHNpbmsgZGV2aWNlcyBhcmUgb24gZGlmZmVybnQgSFcgbW9kdWxlcyBPUgorICAgICAgICAgICAgICAgIC8vIC0gc291cmNlIGFuZCBzaW5rIGRldmljZXMgYXJlIG9uIGRpZmZlcmVudCBIVyBtb2R1bGVzIE9SCiAgICAgICAgICAgICAgICAgLy8gLSBhdWRpbyBIQUwgdmVyc2lvbiBpcyA8IDMuMAogICAgICAgICAgICAgICAgIGlmICghc3JjRGV2aWNlRGVzYy0+aGFzU2FtZUh3TW9kdWxlQXMoc2lua0RldmljZURlc2MpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAoc3JjRGV2aWNlRGVzYy0+bU1vZHVsZS0+Z2V0SGFsVmVyc2lvbk1ham9yKCkgPCAzKSkgewpAQCAtMzI3NCw4ICszMzAxLDggQEAKICAgICAgICAgfQogICAgIH0KICAgICAvLyByZXJvdXRlIG91dHB1dHMgaWYgbmVjZXNzYXJ5Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhZmZlY3RlZFN0cmF0ZWdpZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgY2hlY2tTdHJhdGVneVJvdXRlKGFmZmVjdGVkU3RyYXRlZ2llc1tpXSwgQVVESU9fSU9fSEFORExFX05PTkUpOworICAgIGZvciAoY29uc3QgYXV0byYgc3RyYXRlZ3kgOiBhZmZlY3RlZFN0cmF0ZWdpZXMpIHsKKyAgICAgICAgY2hlY2tTdHJhdGVneVJvdXRlKHN0cmF0ZWd5LCBBVURJT19JT19IQU5ETEVfTk9ORSk7CiAgICAgfQogCiAgICAgLy8gcmVtb3ZlIGlucHV0IHJvdXRlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyB1aWQKQEAgLTMyOTcsOCArMzMyNCw4IEBACiAgICAgICAgICAgICBpbnB1dHNUb0Nsb3NlLmFkZChpbnB1dERlc2MtPm1Jb0hhbmRsZSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbnB1dHNUb0Nsb3NlLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGNsb3NlSW5wdXQoaW5wdXRzVG9DbG9zZVtpXSk7CisgICAgZm9yIChjb25zdCBhdXRvJiBpbnB1dCA6IGlucHV0c1RvQ2xvc2UpIHsKKyAgICAgICAgY2xvc2VJbnB1dChpbnB1dCk7CiAgICAgfQogfQogCkBAIC0zNDAxLDYgKzM0MjgsMTEgQEAKICAgICAgICAgICAgIEFMT0dWKCIlcyBvdXRwdXQgZm9yIGRldmljZSAlMDh4IGlzIGR1cGxpY2F0ZWQiLCBfX0ZVTkNUSU9OX18sIHNpbmtEZXZpY2UpOwogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICB9CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG91dHB1dERlc2MtPnN0YXJ0KCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKwogICAgICAgICAvLyBjcmVhdGUgYSBzcGVjaWFsIHBhdGNoIHdpdGggbm8gc2luayBhbmQgdHdvIHNvdXJjZXM6CiAgICAgICAgIC8vIC0gdGhlIHNlY29uZCBzb3VyY2UgaW5kaWNhdGVzIHRvIFBhdGNoUGFuZWwgdGhyb3VnaCB3aGljaCBvdXRwdXQgbWl4IHRoaXMgcGF0Y2ggc2hvdWxkCiAgICAgICAgIC8vIGJlIGNvbm5lY3RlZCBhcyB3ZWxsIGFzIHRoZSBzdHJlYW0gdHlwZSBmb3Igdm9sdW1lIGNvbnRyb2wKQEAgLTM0MTEsNyArMzQ0Myw3IEBACiAgICAgICAgIHNyY0RldmljZURlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC0+c291cmNlc1swXSwgTlVMTCk7CiAgICAgICAgIG91dHB1dERlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC0+c291cmNlc1sxXSwgTlVMTCk7CiAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzFdLmV4dC5taXgudXNlY2FzZS5zdHJlYW0gPSBzdHJlYW07Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKHBhdGNoLAorICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaChwYXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmUGF0Y2hIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwogICAgICAgICBBTE9HVigiJXMgcGF0Y2ggcGFuZWwgcmV0dXJuZWQgJWQgcGF0Y2hIYW5kbGUgJWQiLCBfX0ZVTkNUSU9OX18sCkBAIC0zNDc1LDggKzM1MDcsOCBAQAogICAgICAgICAgICAgICAgIG9mZmxvYWRlZC5wdXNoKGRlc2MtPm1Jb0hhbmRsZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvZmZsb2FkZWQuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIGNsb3NlT3V0cHV0KG9mZmxvYWRlZFtpXSk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgaGFuZGxlIDogb2ZmbG9hZGVkKSB7CisgICAgICAgICAgICBjbG9zZU91dHB1dChoYW5kbGUpOwogICAgICAgICB9CiAgICAgfQogICAgIC8vIHVwZGF0ZSBtYXN0ZXIgbW9ubyBmb3IgYWxsIHJlbWFpbmluZyBvdXRwdXRzCkBAIC0zNDk4LDYgKzM1MzAsMjkyIEBACiAgICAgcmV0dXJuIGNvbXB1dGVWb2x1bWUoc3RyZWFtLCBpbmRleCwgZGV2aWNlKTsKIH0KIAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRTdXBwb3J0ZWRGb3JtYXRzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdFZlY3RvciYgZm9ybWF0cykgeworICAgIGlmIChpb0hhbmRsZSA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBTdHJpbmc4IHJlcGx5OworICAgIHJlcGx5ID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMoCisgICAgICAgICAgICBpb0hhbmRsZSwgU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkRm9ybWF0cykpOworICAgIEFMT0dWKCIlczogc3VwcG9ydGVkIGZvcm1hdHMgJXMiLCBfX0ZVTkNUSU9OX18sIHJlcGx5LnN0cmluZygpKTsKKyAgICBBdWRpb1BhcmFtZXRlciByZXBsaWVkUGFyYW1ldGVycyhyZXBseSk7CisgICAgaWYgKHJlcGxpZWRQYXJhbWV0ZXJzLmdldCgKKyAgICAgICAgICAgIFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZEZvcm1hdHMpLCByZXBseSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gcmV0cmlldmUgZm9ybWF0LCBiYWlsaW5nIG91dCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGZvciAoYXV0byBmb3JtYXQgOiBmb3JtYXRzRnJvbVN0cmluZyhyZXBseS5zdHJpbmcoKSkpIHsKKyAgICAgICAgLy8gT25seSBBVURJT19GT1JNQVRfQUFDX0xDIHdpbGwgYmUgdXNlZCBpbiBTZXR0aW5ncyBVSSBmb3IgYWxsIEFBQyBmb3JtYXRzLgorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoQUFDX0ZPUk1BVFMpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChmb3JtYXQgPT0gQUFDX0ZPUk1BVFNbaV0pIHsKKyAgICAgICAgICAgICAgICBmb3JtYXQgPSBBVURJT19GT1JNQVRfQUFDX0xDOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJvb2wgZXhpc3QgPSBmYWxzZTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmb3JtYXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZm9ybWF0ID09IGZvcm1hdHNbaV0pIHsKKyAgICAgICAgICAgICAgICBleGlzdCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYm9vbCBpc1N1cnJvdW5kRm9ybWF0ID0gZmFsc2U7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShTVVJST1VORF9GT1JNQVRTKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoU1VSUk9VTkRfRk9STUFUU1tpXSA9PSBmb3JtYXQpIHsKKyAgICAgICAgICAgICAgICBpc1N1cnJvdW5kRm9ybWF0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWV4aXN0ICYmIGlzU3Vycm91bmRGb3JtYXQpIHsKKyAgICAgICAgICAgIGZvcm1hdHMuYWRkKGZvcm1hdCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFN1cnJvdW5kRm9ybWF0cyh1bnNpZ25lZCBpbnQgKm51bVN1cnJvdW5kRm9ybWF0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpzdXJyb3VuZEZvcm1hdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpzdXJyb3VuZEZvcm1hdHNFbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXBvcnRlZCkKK3sKKyAgICBpZiAobnVtU3Vycm91bmRGb3JtYXRzID09IE5VTEwgfHwgKCpudW1TdXJyb3VuZEZvcm1hdHMgIT0gMCAmJgorICAgICAgICAgICAgKHN1cnJvdW5kRm9ybWF0cyA9PSBOVUxMIHx8IHN1cnJvdW5kRm9ybWF0c0VuYWJsZWQgPT0gTlVMTCkpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEFMT0dWKCJnZXRTdXJyb3VuZEZvcm1hdHMoKSBudW1TdXJyb3VuZEZvcm1hdHMgJWQgc3Vycm91bmRGb3JtYXRzICVwIHN1cnJvdW5kRm9ybWF0c0VuYWJsZWQgJXAiLAorICAgICAgICAgICAgKm51bVN1cnJvdW5kRm9ybWF0cywgc3Vycm91bmRGb3JtYXRzLCBzdXJyb3VuZEZvcm1hdHNFbmFibGVkKTsKKworICAgIC8vIE9ubHkgcmV0dXJuIHZhbHVlIGlmIHRoZXJlIGlzIEhETUkgb3V0cHV0LgorICAgIGlmICgobUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSAmIEFVRElPX0RFVklDRV9PVVRfSERNSSkgPT0gMCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc2l6ZV90IGZvcm1hdHNXcml0dGVuID0gMDsKKyAgICBzaXplX3QgZm9ybWF0c01heCA9ICpudW1TdXJyb3VuZEZvcm1hdHM7CisgICAgKm51bVN1cnJvdW5kRm9ybWF0cyA9IDA7CisgICAgRm9ybWF0VmVjdG9yIGZvcm1hdHM7CisgICAgaWYgKHJlcG9ydGVkKSB7CisgICAgICAgIC8vIE9ubHkgZ2V0IHN1cnJvdW5kIGZvcm1hdHMgd2hpY2ggYXJlIHJlcG9ydGVkIGJ5IGRldmljZS4KKyAgICAgICAgLy8gRmlyc3QgbGlzdCBhbHJlYWR5IG9wZW4gb3V0cHV0cyB0aGF0IGNhbiBiZSByb3V0ZWQgdG8gdGhpcyBkZXZpY2UKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IEFVRElPX0RFVklDRV9PVVRfSERNSTsKKyAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzOworICAgICAgICBib29sIHJlcG9ydGVkRm9ybWF0Rm91bmQgPSBmYWxzZTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYzsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBpZiAoIWRlc2MtPmlzRHVwbGljYXRlZCgpICYmIChkZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkgJiBkZXZpY2UpKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0cy5hZGQobU91dHB1dHMua2V5QXQoaSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIE9wZW4gYW4gb3V0cHV0IHRvIHF1ZXJ5IGR5bmFtaWMgcGFyYW1ldGVycy4KKyAgICAgICAgRGV2aWNlVmVjdG9yIGhkbWlPdXRwdXREZXZpY2VzID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKAorICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfSERNSSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGRtaU91dHB1dERldmljZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IGhkbWlPdXRwdXREZXZpY2VzW2ldLT5tQWRkcmVzczsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgaHdNb2R1bGUgOiBtSHdNb2R1bGVzKSB7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBod01vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKS5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBod01vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKVtpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPnN1cHBvcnREZXZpY2UoQVVESU9fREVWSUNFX09VVF9IRE1JKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPnN1cHBvcnREZXZpY2VBZGRyZXNzKGFkZHJlc3MpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgajsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBvdXRwdXRzLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dHMuaXRlbUF0KGopKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRlc2MtPmlzRHVwbGljYXRlZCgpICYmIGRlc2MtPm1Qcm9maWxlID09IHByb2ZpbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGogIT0gb3V0cHV0cy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBnZXRTdXBwb3J0ZWRGb3JtYXRzKG91dHB1dHMuaXRlbUF0KGopLCBmb3JtYXRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRlZEZvcm1hdEZvdW5kIHw9IChzdGF0dXMgPT0gTk9fRVJST1IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByb2ZpbGUtPmNhbk9wZW5OZXdJbygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIk1heCBPdXRwdXQgbnVtYmVyICV1IGFscmVhZHkgb3BlbmVkIGZvciB0aGlzIHByb2ZpbGUgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1heE9wZW5Db3VudCwgcHJvZmlsZS0+Z2V0VGFnTmFtZSgpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigib3BlbmluZyBvdXRwdXQgZm9yIGRldmljZSAlMDh4IHdpdGggcGFyYW1zICVzIHByb2ZpbGUgJXAgbmFtZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsIGFkZHJlc3Muc3RyaW5nKCksIHByb2ZpbGUuZ2V0KCksIHByb2ZpbGUtPmdldE5hbWUoKS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjID0gbmV3IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yKHByb2ZpbGUsIG1wQ2xpZW50SW50ZXJmYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGVzYy0+b3BlbihudWxscHRyLCBkZXZpY2UsIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9ERUZBVUxULCBBVURJT19PVVRQVVRfRkxBR19OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGdldFN1cHBvcnRlZEZvcm1hdHMob3V0cHV0LCBmb3JtYXRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRlZEZvcm1hdEZvdW5kIHw9IChzdGF0dXMgPT0gTk9fRVJST1IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXJlcG9ydGVkRm9ybWF0Rm91bmQpIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKFNVUlJPVU5EX0ZPUk1BVFMpOyBpKyspIHsKKyAgICAgICAgICAgIGZvcm1hdHMuYWRkKFNVUlJPVU5EX0ZPUk1BVFNbaV0pOworICAgICAgICB9CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZm9ybWF0cy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAoZm9ybWF0c1dyaXR0ZW4gPCBmb3JtYXRzTWF4KSB7CisgICAgICAgICAgICBzdXJyb3VuZEZvcm1hdHNbZm9ybWF0c1dyaXR0ZW5dID0gZm9ybWF0c1tpXTsKKyAgICAgICAgICAgIGJvb2wgZm9ybWF0RW5hYmxlZCA9IGZhbHNlOworICAgICAgICAgICAgaWYgKGZvcm1hdHNbaV0gPT0gQVVESU9fRk9STUFUX0FBQ19MQykgeworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgQVJSQVlfU0laRShBQUNfRk9STUFUUyk7IGorKykgeworICAgICAgICAgICAgICAgICAgICBmb3JtYXRFbmFibGVkID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3Vycm91bmRGb3JtYXRzLmZpbmQoQUFDX0ZPUk1BVFNbaV0pICE9IG1TdXJyb3VuZEZvcm1hdHMuZW5kKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9ybWF0RW5hYmxlZCA9IG1TdXJyb3VuZEZvcm1hdHMuZmluZChmb3JtYXRzW2ldKSAhPSBtU3Vycm91bmRGb3JtYXRzLmVuZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3Vycm91bmRGb3JtYXRzRW5hYmxlZFtmb3JtYXRzV3JpdHRlbisrXSA9IGZvcm1hdEVuYWJsZWQ7CisgICAgICAgIH0KKyAgICAgICAgKCpudW1TdXJyb3VuZEZvcm1hdHMpKys7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQsIGJvb2wgZW5hYmxlZCkKK3sKKyAgICAvLyBDaGVjayBpZiBhdWRpbyBmb3JtYXQgaXMgYSBzdXJyb3VuZCBmb3JtYXRzLgorICAgIGJvb2wgaXNTdXJyb3VuZEZvcm1hdCA9IGZhbHNlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShTVVJST1VORF9GT1JNQVRTKTsgaSsrKSB7CisgICAgICAgIGlmIChhdWRpb0Zvcm1hdCA9PSBTVVJST1VORF9GT1JNQVRTW2ldKSB7CisgICAgICAgICAgICBpc1N1cnJvdW5kRm9ybWF0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmICghaXNTdXJyb3VuZEZvcm1hdCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIFNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIE1BTlVBTC4KKyAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGZvcmNlVXNlID0gbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoCisgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9FTkNPREVEX1NVUlJPVU5EKTsKKyAgICBpZiAoZm9yY2VVc2UgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfTUFOVUFMKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAoKG1TdXJyb3VuZEZvcm1hdHMuZmluZChhdWRpb0Zvcm1hdCkgIT0gbVN1cnJvdW5kRm9ybWF0cy5lbmQoKSAmJiBlbmFibGVkKQorICAgICAgICAgICAgfHwgKG1TdXJyb3VuZEZvcm1hdHMuZmluZChhdWRpb0Zvcm1hdCkgPT0gbVN1cnJvdW5kRm9ybWF0cy5lbmQoKSAmJiAhZW5hYmxlZCkpIHsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIC8vIFRoZSBvcGVyYXRpb24gaXMgdmFsaWQgb25seSB3aGVuIHRoZXJlIGlzIEhETUkgb3V0cHV0IGF2YWlsYWJsZS4KKyAgICBpZiAoKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCkgJiBBVURJT19ERVZJQ0VfT1VUX0hETUkpID09IDApIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgIGlmIChhdWRpb0Zvcm1hdCA9PSBBVURJT19GT1JNQVRfQUFDX0xDKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoQUFDX0ZPUk1BVFMpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtU3Vycm91bmRGb3JtYXRzLmluc2VydChBQUNfRk9STUFUU1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU3Vycm91bmRGb3JtYXRzLmluc2VydChhdWRpb0Zvcm1hdCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoYXVkaW9Gb3JtYXQgPT0gQVVESU9fRk9STUFUX0FBQ19MQykgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKEFBQ19GT1JNQVRTKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgbVN1cnJvdW5kRm9ybWF0cy5lcmFzZShBQUNfRk9STUFUU1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU3Vycm91bmRGb3JtYXRzLmVyYXNlKGF1ZGlvRm9ybWF0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjOworICAgIGJvb2wgcHJvZmlsZVVwZGF0ZWQgPSBmYWxzZTsKKyAgICBEZXZpY2VWZWN0b3IgaGRtaU91dHB1dERldmljZXMgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoCisgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0hETUkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGRtaU91dHB1dERldmljZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgLy8gU2ltdWxhdGUgcmVjb25uZWN0aW9uIHRvIHVwZGF0ZSBlbmFibGVkIHN1cnJvdW5kIHNvdW5kIGZvcm1hdHMuCisgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IGhkbWlPdXRwdXREZXZpY2VzW2ldLT5tQWRkcmVzczsKKyAgICAgICAgU3RyaW5nOCBuYW1lID0gaGRtaU91dHB1dERldmljZXNbaV0tPmdldE5hbWUoKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9PVVRfSERNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX09VVF9IRE1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCkpOworICAgICAgICBwcm9maWxlVXBkYXRlZCB8PSAoc3RhdHVzID09IE5PX0VSUk9SKTsKKyAgICB9CisgICAgRGV2aWNlVmVjdG9yIGhkbWlJbnB1dERldmljZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZSgKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fSERNSSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZG1pSW5wdXREZXZpY2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIC8vIFNpbXVsYXRlIHJlY29ubmVjdGlvbiB0byB1cGRhdGUgZW5hYmxlZCBzdXJyb3VuZCBzb3VuZCBmb3JtYXRzLgorICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBoZG1pSW5wdXREZXZpY2VzW2ldLT5tQWRkcmVzczsKKyAgICAgICAgU3RyaW5nOCBuYW1lID0gaGRtaUlucHV0RGV2aWNlc1tpXS0+Z2V0TmFtZSgpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX0lOX0hETUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9JTl9IRE1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCkpOworICAgICAgICBwcm9maWxlVXBkYXRlZCB8PSAoc3RhdHVzID09IE5PX0VSUk9SKTsKKyAgICB9CisKKyAgICAvLyBVbmRvIHRoZSBzdXJyb3VuZCBmb3JtYXRzIGNoYW5nZSBkdWUgdG8gbm8gYXVkaW8gcHJvZmlsZXMgdXBkYXRlZC4KKyAgICBpZiAoIXByb2ZpbGVVcGRhdGVkKSB7CisgICAgICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgICAgICBpZiAoYXVkaW9Gb3JtYXQgPT0gQVVESU9fRk9STUFUX0FBQ19MQykgeworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShBQUNfRk9STUFUUyk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBtU3Vycm91bmRGb3JtYXRzLmVyYXNlKEFBQ19GT1JNQVRTW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1TdXJyb3VuZEZvcm1hdHMuZXJhc2UoYXVkaW9Gb3JtYXQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGF1ZGlvRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9BQUNfTEMpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoQUFDX0ZPUk1BVFMpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgbVN1cnJvdW5kRm9ybWF0cy5pbnNlcnQoQUFDX0ZPUk1BVFNbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVN1cnJvdW5kRm9ybWF0cy5pbnNlcnQoYXVkaW9Gb3JtYXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHByb2ZpbGVVcGRhdGVkID8gTk9fRVJST1IgOiBJTlZBTElEX09QRVJBVElPTjsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFJlY29yZFNpbGVuY2VkKHVpZF90IHVpZCwgYm9vbCBzaWxlbmNlZCkKK3sKKyAgICBBTE9HVigiQXVkaW9Qb2xpY3lNYW5hZ2VyOnNldFJlY29yZFNpbGVuY2VkKHVpZDolZCwgc2lsZW5jZWQ6JWQpIiwgdWlkLCBzaWxlbmNlZCk7CisKKyAgICBWZWN0b3I8c3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+ID4gYWN0aXZlSW5wdXRzID0gbUlucHV0cy5nZXRBY3RpdmVJbnB1dHMoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFjdGl2ZUlucHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gYWN0aXZlRGVzYyA9IGFjdGl2ZUlucHV0c1tpXTsKKyAgICAgICAgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbiBhY3RpdmVTZXNzaW9ucyA9IGFjdGl2ZURlc2MtPmdldEF1ZGlvU2Vzc2lvbnModHJ1ZSk7CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgYWN0aXZlU2Vzc2lvbnMuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgIHNwPEF1ZGlvU2Vzc2lvbj4gYWN0aXZlU2Vzc2lvbiA9IGFjdGl2ZVNlc3Npb25zLnZhbHVlQXQoaik7CisgICAgICAgICAgICBpZiAoYWN0aXZlU2Vzc2lvbi0+dWlkKCkgPT0gdWlkKSB7CisgICAgICAgICAgICAgICAgYWN0aXZlU2Vzc2lvbi0+c2V0U2lsZW5jZWQoc2lsZW5jZWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmRpc2Nvbm5lY3RBdWRpb1NvdXJjZShjb25zdCBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+JiBzb3VyY2VEZXNjKQogewogICAgIEFMT0dWKCIlcyBoYW5kbGUgJWQiLCBfX0ZVTkNUSU9OX18sIHNvdXJjZURlc2MtPmdldEhhbmRsZSgpKTsKQEAgLTM1MTMsNyArMzgzMSwxMCBAQAogICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gc3RyZWFtVHlwZWZyb21BdHRyaWJ1dGVzSW50KCZzb3VyY2VEZXNjLT5tQXR0cmlidXRlcyk7CiAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IHN3T3V0cHV0RGVzYyA9IHNvdXJjZURlc2MtPm1Td091dHB1dC5wcm9tb3RlKCk7CiAgICAgaWYgKHN3T3V0cHV0RGVzYyAhPSAwKSB7Ci0gICAgICAgIHN0b3BTb3VyY2Uoc3dPdXRwdXREZXNjLCBzdHJlYW0sIGZhbHNlKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RvcFNvdXJjZShzd091dHB1dERlc2MsIHN0cmVhbSwgZmFsc2UpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzd091dHB1dERlc2MtPnN0b3AoKTsKKyAgICAgICAgfQogICAgICAgICBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSwgMCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgc3A8SHdBdWRpb091dHB1dERlc2NyaXB0b3I+IGh3T3V0cHV0RGVzYyA9IHNvdXJjZURlc2MtPm1Id091dHB1dC5wcm9tb3RlKCk7CkBAIC0zNTQ5LDcgKzM4NzAsNyBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpCiB7Ci0gICAgcmV0dXJuIGFuZHJvaWRfYXRvbWljX2luYygmbUF1ZGlvUG9ydEdlbmVyYXRpb24pOworICAgIHJldHVybiBtQXVkaW9Qb3J0R2VuZXJhdGlvbisrOwogfQogCiAjaWZkZWYgVVNFX1hNTF9BVURJT19QT0xJQ1lfQ09ORgpAQCAtMzU2MSwzMSArMzg4Miw0NyBAQAogCiBzdGF0aWMgc3RhdHVzX3QgZGVzZXJpYWxpemVBdWRpb1BvbGljeVhtbENvbmZpZyhBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnKSB7CiAgICAgY2hhciBhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGVbQVVESU9fUE9MSUNZX1hNTF9DT05GSUdfRklMRV9QQVRIX01BWF9MRU5HVEhdOworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIqPiBmaWxlTmFtZXM7CiAgICAgc3RhdHVzX3QgcmV0OwogCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQ29uZmlnTG9jYXRpb25MaXN0U2l6ZTsgaSsrKSB7Ci0gICAgICAgIFBvbGljeVNlcmlhbGl6ZXIgc2VyaWFsaXplcjsKLSAgICAgICAgc25wcmludGYoYXVkaW9Qb2xpY3lYbWxDb25maWdGaWxlLAotICAgICAgICAgICAgICAgICBzaXplb2YoYXVkaW9Qb2xpY3lYbWxDb25maWdGaWxlKSwKLSAgICAgICAgICAgICAgICAgIiVzLyVzIiwKLSAgICAgICAgICAgICAgICAga0NvbmZpZ0xvY2F0aW9uTGlzdFtpXSwKLSAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX1hNTF9DT05GSUdfRklMRV9OQU1FKTsKLSAgICAgICAgcmV0ID0gc2VyaWFsaXplci5kZXNlcmlhbGl6ZShhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGUsIGNvbmZpZyk7Ci0gICAgICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIGJyZWFrOworICAgIGlmIChwcm9wZXJ0eV9nZXRfYm9vbCgicm8uYmx1ZXRvb3RoLmEyZHBfb2ZmbG9hZC5zdXBwb3J0ZWQiLCBmYWxzZSkgJiYKKyAgICAgICAgcHJvcGVydHlfZ2V0X2Jvb2woInBlcnNpc3QuYmx1ZXRvb3RoLmEyZHBfb2ZmbG9hZC5kaXNhYmxlZCIsIGZhbHNlKSkgeworICAgICAgICAvLyBBMkRQIG9mZmxvYWQgc3VwcG9ydGVkIGJ1dCBkaXNhYmxlZDogdHJ5IHRvIHVzZSBzcGVjaWFsIFhNTCBmaWxlCisgICAgICAgIGZpbGVOYW1lcy5wdXNoX2JhY2soQVVESU9fUE9MSUNZX0EyRFBfT0ZGTE9BRF9ESVNBQkxFRF9YTUxfQ09ORklHX0ZJTEVfTkFNRSk7CisgICAgfQorICAgIGZpbGVOYW1lcy5wdXNoX2JhY2soQVVESU9fUE9MSUNZX1hNTF9DT05GSUdfRklMRV9OQU1FKTsKKworICAgIGZvciAoY29uc3QgY2hhciogZmlsZU5hbWUgOiBmaWxlTmFtZXMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQ29uZmlnTG9jYXRpb25MaXN0U2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBQb2xpY3lTZXJpYWxpemVyIHNlcmlhbGl6ZXI7CisgICAgICAgICAgICBzbnByaW50ZihhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGUsIHNpemVvZihhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGUpLAorICAgICAgICAgICAgICAgICAgICAgIiVzLyVzIiwga0NvbmZpZ0xvY2F0aW9uTGlzdFtpXSwgZmlsZU5hbWUpOworICAgICAgICAgICAgcmV0ID0gc2VyaWFsaXplci5kZXNlcmlhbGl6ZShhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGUsIGNvbmZpZyk7CisgICAgICAgICAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gcmV0OwogfQogI2VuZGlmCiAKLUF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb2xpY3lNYW5hZ2VyKEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpCitBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9saWN5TWFuYWdlcihBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAvKmZvclRlc3RpbmcqLykKICAgICA6Ci0jaWZkZWYgQVVESU9fUE9MSUNZX1RFU1QKLSAgICBUaHJlYWQoZmFsc2UpLAotI2VuZGlmIC8vQVVESU9fUE9MSUNZX1RFU1QKKyAgICBtVWlkQ2FjaGVkKGdldHVpZCgpKSwKKyAgICBtcENsaWVudEludGVyZmFjZShjbGllbnRJbnRlcmZhY2UpLAogICAgIG1MaW1pdFJpbmd0b25lVm9sdW1lKGZhbHNlKSwgbUxhc3RWb2ljZVZvbHVtZSgtMS4wZiksCiAgICAgbUEyZHBTdXNwZW5kZWQoZmFsc2UpLAorI2lmZGVmIFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYKKyAgICBtVm9sdW1lQ3VydmVzKG5ldyBWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uKCkpLAorICAgIG1Db25maWcobUh3TW9kdWxlc0FsbCwgbUF2YWlsYWJsZU91dHB1dERldmljZXMsIG1BdmFpbGFibGVJbnB1dERldmljZXMsCisgICAgICAgICAgICBtRGVmYXVsdE91dHB1dERldmljZSwgc3RhdGljX2Nhc3Q8Vm9sdW1lQ3VydmVzQ29sbGVjdGlvbio+KG1Wb2x1bWVDdXJ2ZXMuZ2V0KCkpKSwKKyNlbHNlCisgICAgbVZvbHVtZUN1cnZlcyhuZXcgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb24oKSksCisgICAgbUNvbmZpZyhtSHdNb2R1bGVzQWxsLCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgbUF2YWlsYWJsZUlucHV0RGV2aWNlcywKKyAgICAgICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlKSwKKyNlbmRpZgogICAgIG1BdWRpb1BvcnRHZW5lcmF0aW9uKDEpLAogICAgIG1CZWFjb25NdXRlUmVmQ291bnQoMCksCiAgICAgbUJlYWNvblBsYXlpbmdSZWZDb3VudCgwKSwKQEAgLTM1OTUsNzAgKzM5MzIsNzIgQEAKICAgICBtTXVzaWNFZmZlY3RPdXRwdXQoQVVESU9fSU9fSEFORExFX05PTkUpLAogICAgIG1IYXNDb21wdXRlZFNvdW5kVHJpZ2dlclN1cHBvcnRzQ29uY3VycmVudENhcHR1cmUoZmFsc2UpCiB7Ci0gICAgbVVpZENhY2hlZCA9IGdldHVpZCgpOwotICAgIG1wQ2xpZW50SW50ZXJmYWNlID0gY2xpZW50SW50ZXJmYWNlOworfQogCi0gICAgLy8gVE9ETzogcmVtb3ZlIHdoZW4gbGVnYWN5IGNvbmYgZmlsZSBpcyByZW1vdmVkLiB0cnVlIG9uIGRldmljZXMgdGhhdCB1c2UgRFJDIG9uIHRoZQotICAgIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSIHBhdGggdG8gYm9vc3Qgc29mdCBzb3VuZHMsIHVzZWQgdG8gYWRqdXN0IHZvbHVtZSBjdXJ2ZXMgYWNjb3JkaW5nbHkuCi0gICAgLy8gTm90ZTogcmVtb3ZlIGFsc28gc3BlYWtlcl9kcmNfZW5hYmxlZCBmcm9tIGdsb2JhbCBjb25maWd1cmF0aW9uIG9mIFhNTCBjb25maWcgZmlsZS4KLSAgICBib29sIHNwZWFrZXJEcmNFbmFibGVkID0gZmFsc2U7CitBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9saWN5TWFuYWdlcihBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKQorICAgICAgICA6IEF1ZGlvUG9saWN5TWFuYWdlcihjbGllbnRJbnRlcmZhY2UsIGZhbHNlIC8qZm9yVGVzdGluZyovKQoreworICAgIGxvYWRDb25maWcoKTsKKyAgICBpbml0aWFsaXplKCk7Cit9CiAKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpsb2FkQ29uZmlnKCkgewogI2lmZGVmIFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYKLSAgICBtVm9sdW1lQ3VydmVzID0gbmV3IFZvbHVtZUN1cnZlc0NvbGxlY3Rpb24oKTsKLSAgICBBdWRpb1BvbGljeUNvbmZpZyBjb25maWcobUh3TW9kdWxlcywgbUF2YWlsYWJsZU91dHB1dERldmljZXMsIG1BdmFpbGFibGVJbnB1dERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlLCBzcGVha2VyRHJjRW5hYmxlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Vm9sdW1lQ3VydmVzQ29sbGVjdGlvbiAqPihtVm9sdW1lQ3VydmVzKSk7Ci0gICAgaWYgKGRlc2VyaWFsaXplQXVkaW9Qb2xpY3lYbWxDb25maWcoY29uZmlnKSAhPSBOT19FUlJPUikgeworICAgIGlmIChkZXNlcmlhbGl6ZUF1ZGlvUG9saWN5WG1sQ29uZmlnKGdldENvbmZpZygpKSAhPSBOT19FUlJPUikgewogI2Vsc2UKLSAgICBtVm9sdW1lQ3VydmVzID0gbmV3IFN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uKCk7Ci0gICAgQXVkaW9Qb2xpY3lDb25maWcgY29uZmlnKG1Id01vZHVsZXMsIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGVmYXVsdE91dHB1dERldmljZSwgc3BlYWtlckRyY0VuYWJsZWQpOwotICAgIGlmICgoQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkQ29uZmlnKEFVRElPX1BPTElDWV9WRU5ET1JfQ09ORklHX0ZJTEUsIGNvbmZpZykgIT0gTk9fRVJST1IpICYmCi0gICAgICAgICAgICAoQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkQ29uZmlnKEFVRElPX1BPTElDWV9DT05GSUdfRklMRSwgY29uZmlnKSAhPSBOT19FUlJPUikpIHsKKyAgICBpZiAoKENvbmZpZ1BhcnNpbmdVdGlsczo6bG9hZENvbmZpZyhBVURJT19QT0xJQ1lfVkVORE9SX0NPTkZJR19GSUxFLCBnZXRDb25maWcoKSkgIT0gTk9fRVJST1IpCisgICAgICAgICAgICYmIChDb25maWdQYXJzaW5nVXRpbHM6OmxvYWRDb25maWcoQVVESU9fUE9MSUNZX0NPTkZJR19GSUxFLCBnZXRDb25maWcoKSkgIT0gTk9fRVJST1IpKSB7CiAjZW5kaWYKICAgICAgICAgQUxPR0UoImNvdWxkIG5vdCBsb2FkIGF1ZGlvIHBvbGljeSBjb25maWd1cmF0aW9uIGZpbGUsIHNldHRpbmcgZGVmYXVsdHMiKTsKLSAgICAgICAgY29uZmlnLnNldERlZmF1bHQoKTsKKyAgICAgICAgZ2V0Q29uZmlnKCkuc2V0RGVmYXVsdCgpOwogICAgIH0KLSAgICAvLyBtdXN0IGJlIGRvbmUgYWZ0ZXIgcmVhZGluZyB0aGUgcG9saWN5IChzaW5jZSBjb25kaXRpb25uZWQgYnkgU3BlYWtlciBEcmMgRW5hYmxpbmcpCi0gICAgbVZvbHVtZUN1cnZlcy0+aW5pdGlhbGl6ZVZvbHVtZUN1cnZlcyhzcGVha2VyRHJjRW5hYmxlZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6aW5pdGlhbGl6ZSgpIHsKKyAgICBtVm9sdW1lQ3VydmVzLT5pbml0aWFsaXplVm9sdW1lQ3VydmVzKGdldENvbmZpZygpLmlzU3BlYWtlckRyY0VuYWJsZWQoKSk7CiAKICAgICAvLyBPbmNlIHBvbGljeSBjb25maWcgaGFzIGJlZW4gcGFyc2VkLCByZXRyaWV2ZSBhbiBpbnN0YW5jZSBvZiB0aGUgZW5naW5lIGFuZCBpbml0aWFsaXplIGl0LgogICAgIGF1ZGlvX3BvbGljeTo6RW5naW5lSW5zdGFuY2UgKmVuZ2luZUluc3RhbmNlID0gYXVkaW9fcG9saWN5OjpFbmdpbmVJbnN0YW5jZTo6Z2V0SW5zdGFuY2UoKTsKICAgICBpZiAoIWVuZ2luZUluc3RhbmNlKSB7CiAgICAgICAgIEFMT0dFKCIlczogIENvdWxkIG5vdCBnZXQgYW4gaW5zdGFuY2Ugb2YgcG9saWN5IGVuZ2luZSIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybjsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogICAgIC8vIFJldHJpZXZlIHRoZSBQb2xpY3kgTWFuYWdlciBJbnRlcmZhY2UKICAgICBtRW5naW5lID0gZW5naW5lSW5zdGFuY2UtPnF1ZXJ5SW50ZXJmYWNlPEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZT4oKTsKICAgICBpZiAobUVuZ2luZSA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGdldCBQb2xpY3kgRW5naW5lIEludGVyZmFjZSIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybjsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogICAgIG1FbmdpbmUtPnNldE9ic2VydmVyKHRoaXMpOwogICAgIHN0YXR1c190IHN0YXR1cyA9IG1FbmdpbmUtPmluaXRDaGVjaygpOwotICAgICh2b2lkKSBzdGF0dXM7Ci0gICAgQUxPR19BU1NFUlQoc3RhdHVzID09IE5PX0VSUk9SLCAiUG9saWN5IGVuZ2luZSBub3QgaW5pdGlhbGl6ZWQoZXJyPSVkKSIsIHN0YXR1cyk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICBMT0dfRkFUQUwoIlBvbGljeSBlbmdpbmUgbm90IGluaXRpYWxpemVkKGVycj0lZCkiLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KIAogICAgIC8vIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzIGFuZCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzIG5vdyBjb250YWluIGFsbCBhdHRhY2hlZCBkZXZpY2VzCiAgICAgLy8gb3BlbiBhbGwgb3V0cHV0IHN0cmVhbXMgbmVlZGVkIHRvIGFjY2VzcyBhdHRhY2hlZCBkZXZpY2VzCiAgICAgYXVkaW9fZGV2aWNlc190IG91dHB1dERldmljZVR5cGVzID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKTsKICAgICBhdWRpb19kZXZpY2VzX3QgaW5wdXREZXZpY2VUeXBlcyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMudHlwZXMoKSAmIH5BVURJT19ERVZJQ0VfQklUX0lOOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUh3TW9kdWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICBtSHdNb2R1bGVzW2ldLT5tSGFuZGxlID0gbXBDbGllbnRJbnRlcmZhY2UtPmxvYWRId01vZHVsZShtSHdNb2R1bGVzW2ldLT5nZXROYW1lKCkpOwotICAgICAgICBpZiAobUh3TW9kdWxlc1tpXS0+bUhhbmRsZSA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HVygiY291bGQgbm90IG9wZW4gSFcgbW9kdWxlICVzIiwgbUh3TW9kdWxlc1tpXS0+Z2V0TmFtZSgpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGh3TW9kdWxlIDogbUh3TW9kdWxlc0FsbCkgeworICAgICAgICBod01vZHVsZS0+c2V0SGFuZGxlKG1wQ2xpZW50SW50ZXJmYWNlLT5sb2FkSHdNb2R1bGUoaHdNb2R1bGUtPmdldE5hbWUoKSkpOworICAgICAgICBpZiAoaHdNb2R1bGUtPmdldEhhbmRsZSgpID09IEFVRElPX01PRFVMRV9IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgQUxPR1coImNvdWxkIG5vdCBvcGVuIEhXIG1vZHVsZSAlcyIsIGh3TW9kdWxlLT5nZXROYW1lKCkpOwogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KKyAgICAgICAgbUh3TW9kdWxlcy5wdXNoX2JhY2soaHdNb2R1bGUpOwogICAgICAgICAvLyBvcGVuIGFsbCBvdXRwdXQgc3RyZWFtcyBuZWVkZWQgdG8gYWNjZXNzIGF0dGFjaGVkIGRldmljZXMKICAgICAgICAgLy8gZXhjZXB0IGZvciBkaXJlY3Qgb3V0cHV0IHN0cmVhbXMgdGhhdCBhcmUgb25seSBvcGVuZWQgd2hlbiB0aGV5IGFyZSBhY3R1YWxseQogICAgICAgICAvLyByZXF1aXJlZCBieSBhbiBhcHAuCiAgICAgICAgIC8vIFRoaXMgYWxzbyB2YWxpZGF0ZXMgbUF2YWlsYWJsZU91dHB1dERldmljZXMgbGlzdAotICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1Id01vZHVsZXNbaV0tPm1PdXRwdXRQcm9maWxlcy5zaXplKCk7IGorKykKLSAgICAgICAgewotICAgICAgICAgICAgY29uc3Qgc3A8SU9Qcm9maWxlPiBvdXRQcm9maWxlID0gbUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzW2pdOwotCisgICAgICAgIGZvciAoY29uc3QgYXV0byYgb3V0UHJvZmlsZSA6IGh3TW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpKSB7CisgICAgICAgICAgICBpZiAoIW91dFByb2ZpbGUtPmNhbk9wZW5OZXdJbygpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgT3V0cHV0IHByb2ZpbGUgbWF4IG9wZW4gY291bnQgJXUgZm9yIHByb2ZpbGUgJXMiLAorICAgICAgICAgICAgICAgICAgICAgIG91dFByb2ZpbGUtPm1heE9wZW5Db3VudCwgb3V0UHJvZmlsZS0+Z2V0VGFnTmFtZSgpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCFvdXRQcm9maWxlLT5oYXNTdXBwb3J0ZWREZXZpY2VzKCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiT3V0cHV0IHByb2ZpbGUgY29udGFpbnMgbm8gZGV2aWNlIG9uIG1vZHVsZSAlcyIsIG1Id01vZHVsZXNbaV0tPmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgQUxPR1coIk91dHB1dCBwcm9maWxlIGNvbnRhaW5zIG5vIGRldmljZSBvbiBtb2R1bGUgJXMiLCBod01vZHVsZS0+Z2V0TmFtZSgpKTsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICgob3V0UHJvZmlsZS0+Z2V0RmxhZ3MoKSAmIEFVRElPX09VVFBVVF9GTEFHX1RUUykgIT0gMCkgewpAQCAtMzY4NSwzNSArNDAyNCwyMCBAQAogICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzRm9yVHlwZSA9IHN1cHBvcnRlZERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKHByb2ZpbGVUeXBlKTsKICAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IGRldmljZXNGb3JUeXBlLnNpemUoKSA+IDAgPyBkZXZpY2VzRm9yVHlwZS5pdGVtQXQoMCktPm1BZGRyZXNzCiAgICAgICAgICAgICAgICAgICAgIDogU3RyaW5nOCgiIik7Ci0KLSAgICAgICAgICAgIG91dHB1dERlc2MtPm1EZXZpY2UgPSBwcm9maWxlVHlwZTsKLSAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKLSAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGU7Ci0gICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrOwotICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IG91dHB1dERlc2MtPm1Gb3JtYXQ7CiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuT3V0cHV0KG91dFByb2ZpbGUtPmdldE1vZHVsZUhhbmRsZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bURldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bUxhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRmxhZ3MpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gb3V0cHV0RGVzYy0+b3BlbihudWxscHRyLCBwcm9maWxlVHlwZSwgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fREVGQVVMVCwgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgJm91dHB1dCk7CiAKICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICBBTE9HVygiQ2Fubm90IG9wZW4gb3V0cHV0IHN0cmVhbSBmb3IgZGV2aWNlICUwOHggb24gaHcgbW9kdWxlICVzIiwKICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgIG1Id01vZHVsZXNbaV0tPmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgaHdNb2R1bGUtPmdldE5hbWUoKSk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7Ci0gICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKLQotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrICA8IHN1cHBvcnRlZERldmljZXMuc2l6ZSgpOyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmluZGV4T2Yoc3VwcG9ydGVkRGV2aWNlc1trXSk7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBkZXYgOiBzdXBwb3J0ZWREZXZpY2VzKSB7CisgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5pbmRleE9mKGRldik7CiAgICAgICAgICAgICAgICAgICAgIC8vIGdpdmUgYSB2YWxpZCBJRCB0byBhbiBhdHRhY2hlZCBkZXZpY2Ugb25jZSBjb25maXJtZWQgaXQgaXMgcmVhY2hhYmxlCiAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwICYmICFtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpbmRleF0tPmlzQXR0YWNoZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXNbaW5kZXhdLT5hdHRhY2gobUh3TW9kdWxlc1tpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpbmRleF0tPmF0dGFjaChod01vZHVsZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKG1QcmltYXJ5T3V0cHV0ID09IDAgJiYKQEAgLTM3MjIsMjEgKzQwNDYsMjMgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYWRkT3V0cHV0KG91dHB1dCwgb3V0cHV0RGVzYyk7CiAgICAgICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgLy8gb3BlbiBpbnB1dCBzdHJlYW1zIG5lZWRlZCB0byBhY2Nlc3MgYXR0YWNoZWQgZGV2aWNlcyB0byB2YWxpZGF0ZQogICAgICAgICAvLyBtQXZhaWxhYmxlSW5wdXREZXZpY2VzIGxpc3QKLSAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtSHdNb2R1bGVzW2ldLT5tSW5wdXRQcm9maWxlcy5zaXplKCk7IGorKykKLSAgICAgICAgewotICAgICAgICAgICAgY29uc3Qgc3A8SU9Qcm9maWxlPiBpblByb2ZpbGUgPSBtSHdNb2R1bGVzW2ldLT5tSW5wdXRQcm9maWxlc1tqXTsKLQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGluUHJvZmlsZSA6IGh3TW9kdWxlLT5nZXRJbnB1dFByb2ZpbGVzKCkpIHsKKyAgICAgICAgICAgIGlmICghaW5Qcm9maWxlLT5jYW5PcGVuTmV3SW8oKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIElucHV0IHByb2ZpbGUgbWF4IG9wZW4gY291bnQgJXUgZm9yIHByb2ZpbGUgJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGluUHJvZmlsZS0+bWF4T3BlbkNvdW50LCBpblByb2ZpbGUtPmdldFRhZ05hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICghaW5Qcm9maWxlLT5oYXNTdXBwb3J0ZWREZXZpY2VzKCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiSW5wdXQgcHJvZmlsZSBjb250YWlucyBubyBkZXZpY2Ugb24gbW9kdWxlICVzIiwgbUh3TW9kdWxlc1tpXS0+Z2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBBTE9HVygiSW5wdXQgcHJvZmlsZSBjb250YWlucyBubyBkZXZpY2Ugb24gbW9kdWxlICVzIiwgaHdNb2R1bGUtPmdldE5hbWUoKSk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBjaG9zZSBmaXJzdCBkZXZpY2UgcHJlc2VudCBpbiBwcm9maWxlJ3MgU3VwcG9ydGVkRGV2aWNlcyBhbHNvIHBhcnQgb2YKQEAgLTM3NDcsNDkgKzQwNzMsNDAgQEAKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPQotICAgICAgICAgICAgICAgICAgICBuZXcgQXVkaW9JbnB1dERlc2NyaXB0b3IoaW5Qcm9maWxlKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3IEF1ZGlvSW5wdXREZXNjcmlwdG9yKGluUHJvZmlsZSwgbXBDbGllbnRJbnRlcmZhY2UpOwogCi0gICAgICAgICAgICBpbnB1dERlc2MtPm1EZXZpY2UgPSBwcm9maWxlVHlwZTsKLQotICAgICAgICAgICAgLy8gZmluZCB0aGUgYWRkcmVzcwogICAgICAgICAgICAgRGV2aWNlVmVjdG9yIGlucHV0RGV2aWNlcyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKHByb2ZpbGVUeXBlKTsKLSAgICAgICAgICAgIC8vICAgdGhlIGlucHV0cyB2ZWN0b3IgbXVzdCBiZSBvZiBzaXplIDEsIGJ1dCB3ZSBkb24ndCB3YW50IHRvIGNyYXNoIGhlcmUKKyAgICAgICAgICAgIC8vICAgdGhlIGlucHV0cyB2ZWN0b3IgbXVzdCBiZSBvZiBzaXplID49IDEsIGJ1dCB3ZSBkb24ndCB3YW50IHRvIGNyYXNoIGhlcmUKICAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IGlucHV0RGV2aWNlcy5zaXplKCkgPiAwID8gaW5wdXREZXZpY2VzLml0ZW1BdCgwKS0+bUFkZHJlc3MKICAgICAgICAgICAgICAgICAgICAgOiBTdHJpbmc4KCIiKTsKICAgICAgICAgICAgIEFMT0dWKCIgIGZvciBpbnB1dCBkZXZpY2UgMHgleCB1c2luZyBhZGRyZXNzICVzIiwgcHJvZmlsZVR5cGUsIGFkZHJlc3Muc3RyaW5nKCkpOwogICAgICAgICAgICAgQUxPR0VfSUYoaW5wdXREZXZpY2VzLnNpemUoKSA9PSAwLCAiSW5wdXQgZGV2aWNlIGxpc3QgaXMgZW1wdHkhIik7CiAKLSAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKLSAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IGlucHV0RGVzYy0+bVNhbXBsaW5nUmF0ZTsKLSAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBpbnB1dERlc2MtPm1DaGFubmVsTWFzazsKLSAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBpbnB1dERlc2MtPm1Gb3JtYXQ7CiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPm9wZW5JbnB1dChpblByb2ZpbGUtPmdldE1vZHVsZUhhbmRsZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dERlc2MtPm1EZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9NSUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0lOUFVUX0ZMQUdfTk9ORSk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbnB1dERlc2MtPm9wZW4obnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9NSUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fSU5QVVRfRkxBR19OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dCk7CiAKICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJnN1cHBvcnRlZERldmljZXMgPSBpblByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayAgPCBzdXBwb3J0ZWREZXZpY2VzLnNpemUoKTsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5pbmRleE9mKHN1cHBvcnRlZERldmljZXNba10pOworICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgZGV2IDogaW5Qcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuaW5kZXhPZihkZXYpOwogICAgICAgICAgICAgICAgICAgICAvLyBnaXZlIGEgdmFsaWQgSUQgdG8gYW4gYXR0YWNoZWQgZGV2aWNlIG9uY2UgY29uZmlybWVkIGl0IGlzIHJlYWNoYWJsZQogICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9IG1BdmFpbGFibGVJbnB1dERldmljZXNbaW5kZXhdOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkZXZEZXNjLT5pc0F0dGFjaGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5hdHRhY2gobUh3TW9kdWxlc1tpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+YXR0YWNoKGh3TW9kdWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5pbXBvcnRBdWRpb1BvcnQoaW5Qcm9maWxlLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VJbnB1dChpbnB1dCk7CisgICAgICAgICAgICAgICAgaW5wdXREZXNjLT5jbG9zZSgpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBBTE9HVygiQ2Fubm90IG9wZW4gaW5wdXQgc3RyZWFtIGZvciBkZXZpY2UgJTA4eCBvbiBodyBtb2R1bGUgJXMiLAotICAgICAgICAgICAgICAgICAgICAgIGlucHV0RGVzYy0+bURldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICBtSHdNb2R1bGVzW2ldLT5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgIGh3TW9kdWxlLT5nZXROYW1lKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMzgxOSw1MyArNDEzNiw0MyBAQAogICAgIC8vIG1ha2Ugc3VyZSBkZWZhdWx0IGRldmljZSBpcyByZWFjaGFibGUKICAgICBpZiAobURlZmF1bHRPdXRwdXREZXZpY2UgPT0gMCB8fCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5pbmRleE9mKG1EZWZhdWx0T3V0cHV0RGV2aWNlKSA8IDApIHsKICAgICAgICAgQUxPR0UoIkRlZmF1bHQgZGV2aWNlICUwOHggaXMgdW5yZWFjaGFibGUiLCBtRGVmYXVsdE91dHB1dERldmljZS0+dHlwZSgpKTsKKyAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKKyAgICB9CisgICAgLy8gSWYgbWljcm9waG9uZXMgYWRkcmVzcyBpcyBlbXB0eSwgc2V0IGl0IGFjY29yZGluZyB0byBkZXZpY2UgdHlwZQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpICA8IG1BdmFpbGFibGVJbnB1dERldmljZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPm1BZGRyZXNzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgaWYgKG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPnR5cGUoKSA9PSBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpIHsKKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT5tQWRkcmVzcyA9IFN0cmluZzgoQVVESU9fQk9UVE9NX01JQ1JPUEhPTkVfQUREUkVTUyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPnR5cGUoKSA9PSBBVURJT19ERVZJQ0VfSU5fQkFDS19NSUMpIHsKKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT5tQWRkcmVzcyA9IFN0cmluZzgoQVVESU9fQkFDS19NSUNST1BIT05FX0FERFJFU1MpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCi0gICAgQUxPR0VfSUYoKG1QcmltYXJ5T3V0cHV0ID09IDApLCAiRmFpbGVkIHRvIG9wZW4gcHJpbWFyeSBvdXRwdXQiKTsKKyAgICBpZiAobVByaW1hcnlPdXRwdXQgPT0gMCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9wZW4gcHJpbWFyeSBvdXRwdXQiKTsKKyAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKKyAgICB9CiAKICAgICB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpOwotCi0jaWZkZWYgQVVESU9fUE9MSUNZX1RFU1QKLSAgICBpZiAobVByaW1hcnlPdXRwdXQgIT0gMCkgewotICAgICAgICBBdWRpb1BhcmFtZXRlciBvdXRwdXRDbWQgPSBBdWRpb1BhcmFtZXRlcigpOwotICAgICAgICBvdXRwdXRDbWQuYWRkSW50KFN0cmluZzgoInNldF9pZCIpLCAwKTsKLSAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMobVByaW1hcnlPdXRwdXQtPm1Jb0hhbmRsZSwgb3V0cHV0Q21kLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIG1UZXN0RGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOwotICAgICAgICBtVGVzdFNhbXBsaW5nUmF0ZSA9IDQ0MTAwOwotICAgICAgICBtVGVzdEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwotICAgICAgICBtVGVzdENoYW5uZWxzID0gIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKLSAgICAgICAgbVRlc3RMYXRlbmN5TXMgPSAwOwotICAgICAgICBtQ3VyT3V0cHV0ID0gMDsKLSAgICAgICAgbURpcmVjdE91dHB1dCA9IGZhbHNlOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9URVNUX09VVFBVVFM7IGkrKykgewotICAgICAgICAgICAgbVRlc3RPdXRwdXRzW2ldID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgICAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdCIpOwotICAgICAgICBydW4oYnVmZmVyLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKLSAgICB9Ci0jZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAorICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIEF1ZGlvUG9saWN5TWFuYWdlcjo6fkF1ZGlvUG9saWN5TWFuYWdlcigpCiB7Ci0jaWZkZWYgQVVESU9fUE9MSUNZX1RFU1QKLSAgICBleGl0KCk7Ci0jZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAogICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQobU91dHB1dHMua2V5QXQoaSkpOworICAgICAgICBtT3V0cHV0cy52YWx1ZUF0KGkpLT5jbG9zZSgpOwogICAgfQogICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZUlucHV0KG1JbnB1dHMua2V5QXQoaSkpOworICAgICAgICBtSW5wdXRzLnZhbHVlQXQoaSktPmNsb3NlKCk7CiAgICB9CiAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5jbGVhcigpOwogICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5jbGVhcigpOwogICAgbU91dHB1dHMuY2xlYXIoKTsKICAgIG1JbnB1dHMuY2xlYXIoKTsKICAgIG1Id01vZHVsZXMuY2xlYXIoKTsKKyAgIG1Id01vZHVsZXNBbGwuY2xlYXIoKTsKKyAgIG1TdXJyb3VuZEZvcm1hdHMuY2xlYXIoKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppbml0Q2hlY2soKQpAQCAtMzg3MywxNzAgKzQxODAsMTMgQEAKICAgICByZXR1cm4gaGFzUHJpbWFyeU91dHB1dCgpID8gTk9fRVJST1IgOiBOT19JTklUOwogfQogCi0jaWZkZWYgQVVESU9fUE9MSUNZX1RFU1QKLWJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp0aHJlYWRMb29wKCkKLXsKLSAgICBBTE9HVigiZW50ZXJpbmcgdGhyZWFkTG9vcCgpIik7Ci0gICAgd2hpbGUgKCFleGl0UGVuZGluZygpKQotICAgIHsKLSAgICAgICAgU3RyaW5nOCBjb21tYW5kOwotICAgICAgICBpbnQgdmFsdWVJbnQ7Ci0gICAgICAgIFN0cmluZzggdmFsdWU7Ci0KLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgbVdhaXRXb3JrQ1Yud2FpdFJlbGF0aXZlKG1Mb2NrLCBtaWxsaXNlY29uZHMoNTApKTsKLQotICAgICAgICBjb21tYW5kID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMoMCwgU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5IikpOwotICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKGNvbW1hbmQpOwotCi0gICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5IiksIHZhbHVlSW50KSA9PSBOT19FUlJPUiAmJgotICAgICAgICAgICAgdmFsdWVJbnQgIT0gMCkgewotICAgICAgICAgICAgQUxPR1YoIlRlc3QgY29tbWFuZCAlcyByZWNlaXZlZCIsIGNvbW1hbmQuc3RyaW5nKCkpOwotICAgICAgICAgICAgU3RyaW5nOCB0YXJnZXQ7Ci0gICAgICAgICAgICBpZiAocGFyYW0uZ2V0KFN0cmluZzgoInRhcmdldCIpLCB0YXJnZXQpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0ID0gIk1hbmFnZXIiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfb3V0cHV0IiksIHZhbHVlSW50KSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHBhcmFtLnJlbW92ZShTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfb3V0cHV0IikpOwotICAgICAgICAgICAgICAgIG1DdXJPdXRwdXQgPSB2YWx1ZUludDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXJhbS5nZXQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2RpcmVjdCIpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBwYXJhbS5yZW1vdmUoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2RpcmVjdCIpKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gImZhbHNlIikgewotICAgICAgICAgICAgICAgICAgICBtRGlyZWN0T3V0cHV0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAidHJ1ZSIpIHsKLSAgICAgICAgICAgICAgICAgICAgbURpcmVjdE91dHB1dCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfaW5wdXQiKSwgdmFsdWVJbnQpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcGFyYW0ucmVtb3ZlKFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9pbnB1dCIpKTsKLSAgICAgICAgICAgICAgICBtVGVzdElucHV0ID0gdmFsdWVJbnQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwYXJhbS5nZXQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2Zvcm1hdCIpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBwYXJhbS5yZW1vdmUoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2Zvcm1hdCIpKTsKLSAgICAgICAgICAgICAgICBpbnQgZm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09ICJQQ00gMTYgYml0cyIpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAiUENNIDggYml0cyIpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV84X0JJVDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09ICJDb21wcmVzc2VkIE1QMyIpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gQVVESU9fRk9STUFUX01QMzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSBBVURJT19GT1JNQVRfSU5WQUxJRCkgewotICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID09ICJNYW5hZ2VyIikgewotICAgICAgICAgICAgICAgICAgICAgICAgbVRlc3RGb3JtYXQgPSBmb3JtYXQ7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIG91dHB1dFBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRGb3JtYXRzKSwgZm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSwgb3V0cHV0UGFyYW0udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocGFyYW0uZ2V0KFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9jaGFubmVscyIpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBwYXJhbS5yZW1vdmUoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2NoYW5uZWxzIikpOwotICAgICAgICAgICAgICAgIGludCBjaGFubmVscyA9IDA7Ci0KLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gIkNoYW5uZWxzIFN0ZXJlbyIpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMgPSAgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gIkNoYW5uZWxzIE1vbm8iKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzID0gIEFVRElPX0NIQU5ORUxfT1VUX01PTk87Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChjaGFubmVscyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgPT0gIk1hbmFnZXIiKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVGVzdENoYW5uZWxzID0gY2hhbm5lbHM7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIG91dHB1dFBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRDaGFubmVscyksIGNoYW5uZWxzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSwgb3V0cHV0UGFyYW0udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9zYW1wbGVSYXRlIiksIHZhbHVlSW50KSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHBhcmFtLnJlbW92ZShTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfc2FtcGxlUmF0ZSIpKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWVJbnQgPj0gMCAmJiB2YWx1ZUludCA8PSA5NjAwMCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgc2FtcGxpbmdSYXRlID0gdmFsdWVJbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgPT0gIk1hbmFnZXIiKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVGVzdFNhbXBsaW5nUmF0ZSA9IHNhbXBsaW5nUmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0gIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgb3V0cHV0UGFyYW0gPSBBdWRpb1BhcmFtZXRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGFyYW0uYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZFNhbXBsaW5nUmF0ZXMpLCBzYW1wbGluZ1JhdGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdLCBvdXRwdXRQYXJhbS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHBhcmFtLmdldChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfcmVvcGVuIiksIHZhbHVlKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHBhcmFtLnJlbW92ZShTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfcmVvcGVuIikpOwotCi0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChtUHJpbWFyeU91dHB1dCk7KTsKLQotICAgICAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGVIYW5kbGUgPSBtUHJpbWFyeU91dHB1dC0+Z2V0TW9kdWxlSGFuZGxlKCk7Ci0KLSAgICAgICAgICAgICAgICByZW1vdmVPdXRwdXQobVByaW1hcnlPdXRwdXQtPm1Jb0hhbmRsZSk7Ci0gICAgICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBuZXcgQXVkaW9PdXRwdXREZXNjcmlwdG9yKE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UpOwotICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1EZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7Ci0gICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOwotICAgICAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGU7Ci0gICAgICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IG91dHB1dERlc2MtPm1DaGFubmVsTWFzazsKLSAgICAgICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gb3V0cHV0RGVzYy0+bUZvcm1hdDsKLSAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGU7Ci0gICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPm9wZW5PdXRwdXQobW9kdWxlSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bURldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bUxhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUZsYWdzKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVvcGVuIGhhcmR3YXJlIG91dHB1dCBzdHJlYW0sICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJzYW1wbGluZ1JhdGU6ICVkLCBmb3JtYXQgJWQsIGNoYW5uZWxzICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGUsIG91dHB1dERlc2MtPm1Gb3JtYXQsIG91dHB1dERlc2MtPm1DaGFubmVsTWFzayk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7Ci0gICAgICAgICAgICAgICAgICAgIG1QcmltYXJ5T3V0cHV0ID0gb3V0cHV0RGVzYzsKLSAgICAgICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgb3V0cHV0Q21kID0gQXVkaW9QYXJhbWV0ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0Q21kLmFkZEludChTdHJpbmc4KCJzZXRfaWQiKSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKGhhbmRsZSwgb3V0cHV0Q21kLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICBhZGRPdXRwdXQoaGFuZGxlLCBvdXRwdXREZXNjKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoMCwgU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5PSIpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpleGl0KCkKLXsKLSAgICB7Ci0gICAgICAgIEF1dG9NdXRleCBfbChtTG9jayk7Ci0gICAgICAgIHJlcXVlc3RFeGl0KCk7Ci0gICAgICAgIG1XYWl0V29ya0NWLnNpZ25hbCgpOwotICAgIH0KLSAgICByZXF1ZXN0RXhpdEFuZFdhaXQoKTsKLX0KLQotaW50IEF1ZGlvUG9saWN5TWFuYWdlcjo6dGVzdE91dHB1dEluZGV4KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKLXsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9URVNUX09VVFBVVFM7IGkrKykgewotICAgICAgICBpZiAob3V0cHV0ID09IG1UZXN0T3V0cHV0c1tpXSkgcmV0dXJuIGk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotI2VuZGlmIC8vQVVESU9fUE9MSUNZX1RFU1QKLQogLy8gLS0tCiAKLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjphZGRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MpCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6YWRkT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjKQogewotICAgIG91dHB1dERlc2MtPnNldElvSGFuZGxlKG91dHB1dCk7CiAgICAgbU91dHB1dHMuYWRkKG91dHB1dCwgb3V0cHV0RGVzYyk7CisgICAgYXBwbHlTdHJlYW1Wb2x1bWVzKG91dHB1dERlc2MsIEFVRElPX0RFVklDRV9OT05FLCAwIC8qIGRlbGF5TXMgKi8sIHRydWUgLyogZm9yY2UgKi8pOwogICAgIHVwZGF0ZU1vbm8ob3V0cHV0KTsgLy8gdXBkYXRlIG1vbm8gc3RhdHVzIHdoZW4gYWRkaW5nIHRvIG91dHB1dCBsaXN0CiAgICAgc2VsZWN0T3V0cHV0Rm9yTXVzaWNFZmZlY3RzKCk7CiAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKQEAgLTQwNDgsOSArNDE5OCw5IEBACiAgICAgc2VsZWN0T3V0cHV0Rm9yTXVzaWNFZmZlY3RzKCk7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjphZGRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwgY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+JiBpbnB1dERlc2MpCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6YWRkSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+JiBpbnB1dERlc2MpCiB7Ci0gICAgaW5wdXREZXNjLT5zZXRJb0hhbmRsZShpbnB1dCk7CiAgICAgbUlucHV0cy5hZGQoaW5wdXQsIGlucHV0RGVzYyk7CiAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKIH0KQEAgLTQwOTcsMTkgKzQyNDcsMTUgQEAKICAgICAgICAgfQogICAgICAgICAvLyB0aGVuIGxvb2sgZm9yIG91dHB1dCBwcm9maWxlcyB0aGF0IGNhbiBiZSByb3V0ZWQgdG8gdGhpcyBkZXZpY2UKICAgICAgICAgU29ydGVkVmVjdG9yPCBzcDxJT1Byb2ZpbGU+ID4gcHJvZmlsZXM7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUh3TW9kdWxlcy5zaXplKCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG1Id01vZHVsZXNbaV0tPm1IYW5kbGUgPT0gMCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gbUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzW2pdOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGh3TW9kdWxlIDogbUh3TW9kdWxlcykgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBod01vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKS5zaXplKCk7IGorKykgeworICAgICAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IGh3TW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpW2pdOwogICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5zdXBwb3J0RGV2aWNlKGRldmljZSkpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5zdXBwb3J0RGV2aWNlQWRkcmVzcyhhZGRyZXNzKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZXMuYWRkKHByb2ZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBhZGRpbmcgcHJvZmlsZSAlenUgZnJvbSBtb2R1bGUgJXp1IiwgaiwgaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IGFkZGluZyBwcm9maWxlICV6dSBmcm9tIG1vZHVsZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGosIGh3TW9kdWxlLT5nZXROYW1lKCkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtNDE0NCwzMCArNDI5MCwyMCBAQAogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAoIXByb2ZpbGUtPmNhbk9wZW5OZXdJbygpKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIk1heCBPdXRwdXQgbnVtYmVyICV1IGFscmVhZHkgb3BlbmVkIGZvciB0aGlzIHByb2ZpbGUgJXMiLAorICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1heE9wZW5Db3VudCwgcHJvZmlsZS0+Z2V0VGFnTmFtZSgpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBBTE9HVigib3BlbmluZyBvdXRwdXQgZm9yIGRldmljZSAlMDh4IHdpdGggcGFyYW1zICVzIHByb2ZpbGUgJXAgbmFtZSAlcyIsCiAgICAgICAgICAgICAgICAgICBkZXZpY2UsIGFkZHJlc3Muc3RyaW5nKCksIHByb2ZpbGUuZ2V0KCksIHByb2ZpbGUtPmdldE5hbWUoKS5zdHJpbmcoKSk7CiAgICAgICAgICAgICBkZXNjID0gbmV3IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yKHByb2ZpbGUsIG1wQ2xpZW50SW50ZXJmYWNlKTsKLSAgICAgICAgICAgIGRlc2MtPm1EZXZpY2UgPSBkZXZpY2U7Ci0gICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7Ci0gICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBkZXNjLT5tU2FtcGxpbmdSYXRlOwotICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IGRlc2MtPm1DaGFubmVsTWFzazsKLSAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBkZXNjLT5tRm9ybWF0OwotICAgICAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mby5zYW1wbGVfcmF0ZSA9IGRlc2MtPm1TYW1wbGluZ1JhdGU7Ci0gICAgICAgICAgICBjb25maWcub2ZmbG9hZF9pbmZvLmNoYW5uZWxfbWFzayA9IGRlc2MtPm1DaGFubmVsTWFzazsKLSAgICAgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uZm9ybWF0ID0gZGVzYy0+bUZvcm1hdDsKICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPm9wZW5PdXRwdXQocHJvZmlsZS0+Z2V0TW9kdWxlSGFuZGxlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjLT5tRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjLT5tTGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPm1GbGFncyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgZGVzYy0+bVNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKLSAgICAgICAgICAgICAgICBkZXNjLT5tQ2hhbm5lbE1hc2sgPSBjb25maWcuY2hhbm5lbF9tYXNrOwotICAgICAgICAgICAgICAgIGRlc2MtPm1Gb3JtYXQgPSBjb25maWcuZm9ybWF0OworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGVzYy0+b3BlbihudWxscHRyLCBkZXZpY2UsIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9ERUZBVUxULCBBVURJT19PVVRQVVRfRkxBR19OT05FLCAmb3V0cHV0KTsKIAorICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIC8vIEhlcmUgaXMgd2hlcmUgdGhlIG91dF9zZXRfcGFyYW1ldGVycygpIGZvciBjYXJkICYgZGV2aWNlIGdldHMgY2FsbGVkCiAgICAgICAgICAgICAgICAgaWYgKCFhZGRyZXNzLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICBjaGFyICpwYXJhbSA9IGF1ZGlvX2RldmljZV9hZGRyZXNzX3RvX3BhcmFtZXRlcihkZXZpY2UsIGFkZHJlc3MpOwpAQCAtNDE3NywyNyArNDMxMywyMSBAQAogICAgICAgICAgICAgICAgIHVwZGF0ZUF1ZGlvUHJvZmlsZXMoZGV2aWNlLCBvdXRwdXQsIHByb2ZpbGUtPmdldEF1ZGlvUHJvZmlsZXMoKSk7CiAgICAgICAgICAgICAgICAgaWYgKCFwcm9maWxlLT5oYXNWYWxpZEF1ZGlvUHJvZmlsZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKSBtaXNzaW5nIHBhcmFtIik7Ci0gICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICBkZXNjLT5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb2ZpbGUtPmhhc0R5bmFtaWNBdWRpb1Byb2ZpbGUoKSkgewotICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgZGVzYy0+Y2xvc2UoKTsKICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7Ci0gICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPnBpY2tBdWRpb1Byb2ZpbGUoY29uZmlnLnNhbXBsZV9yYXRlLCBjb25maWcuY2hhbm5lbF9tYXNrLCBjb25maWcuZm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5waWNrQXVkaW9Qcm9maWxlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSwgY29uZmlnLmNoYW5uZWxfbWFzaywgY29uZmlnLmZvcm1hdCk7CiAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uc2FtcGxlX3JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7CiAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uY2hhbm5lbF9tYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKICAgICAgICAgICAgICAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mby5mb3JtYXQgPSBjb25maWcuZm9ybWF0OwotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3Blbk91dHB1dChwcm9maWxlLT5nZXRNb2R1bGVIYW5kbGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2MtPm1EZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjLT5tTGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+bUZsYWdzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+bVNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPm1DaGFubmVsTWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5tRm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNjLT5vcGVuKCZjb25maWcsIGRldmljZSwgYWRkcmVzcywgQVVESU9fU1RSRUFNX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgJm91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtNDIxOSwzMSArNDM0OSwyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0cHV0cyB1c2VkIGJ5IGR5bmFtaWMgcG9saWN5IG1peGVzCiAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBkdXBsaWNhdGVkT3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBpbml0aWFsIHN0cmVhbSB2b2x1bWUgZm9yIGRldmljZQotICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlTdHJlYW1Wb2x1bWVzKGRlc2MsIGRldmljZSwgMCwgdHJ1ZSk7Ci0KICAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETzogY29uZmlndXJlIGF1ZGlvIGVmZmVjdCBvdXRwdXQgc3RhZ2UgaGVyZQogCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvcGVuIGEgZHVwbGljYXRpbmcgb3V0cHV0IHRocmVhZCBmb3IgdGhlIG5ldyBvdXRwdXQgYW5kIHRoZSBwcmltYXJ5IG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlZE91dHB1dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuRHVwbGljYXRlT3V0cHV0KG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByaW1hcnlPdXRwdXQtPm1Jb0hhbmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHVwbGljYXRlZE91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGR1cE91dHB1dERlc2MgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3dBdWRpb091dHB1dERlc2NyaXB0b3IoTlVMTCwgbXBDbGllbnRJbnRlcmZhY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZHVwT3V0cHV0RGVzYy0+b3BlbkR1cGxpY2F0aW5nKG1QcmltYXJ5T3V0cHV0LCBkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXBsaWNhdGVkT3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgZHVwbGljYXRlZCBvdXRwdXQgZGVzY3JpcHRvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkdXBPdXRwdXREZXNjID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcihOVUxMLCBtcENsaWVudEludGVyZmFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwT3V0cHV0RGVzYy0+bU91dHB1dDEgPSBtUHJpbWFyeU91dHB1dDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBPdXRwdXREZXNjLT5tT3V0cHV0MiA9IGRlc2M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwT3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSA9IGRlc2MtPm1TYW1wbGluZ1JhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwT3V0cHV0RGVzYy0+bUZvcm1hdCA9IGRlc2MtPm1Gb3JtYXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwT3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrID0gZGVzYy0+bUNoYW5uZWxNYXNrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cE91dHB1dERlc2MtPm1MYXRlbmN5ID0gZGVzYy0+bUxhdGVuY3k7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkT3V0cHV0KGR1cGxpY2F0ZWRPdXRwdXQsIGR1cE91dHB1dERlc2MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5U3RyZWFtVm9sdW1lcyhkdXBPdXRwdXREZXNjLCBkZXZpY2UsIDAsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgY291bGQgbm90IG9wZW4gZHVwIG91dHB1dCBmb3IgJWQgYW5kICVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmltYXJ5T3V0cHV0LT5tSW9IYW5kbGUsIG91dHB1dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+Y2xvc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVPdXRwdXQob3V0cHV0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwpAQCAtNDI5NSwxNyArNDQxNCwxMyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIC8vIENsZWFyIGFueSBwcm9maWxlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGRpc2Nvbm5lY3RlZCBkZXZpY2UuCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUh3TW9kdWxlcy5zaXplKCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG1Id01vZHVsZXNbaV0tPm1IYW5kbGUgPT0gMCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gbUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzW2pdOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGh3TW9kdWxlIDogbUh3TW9kdWxlcykgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBod01vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKS5zaXplKCk7IGorKykgeworICAgICAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IGh3TW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpW2pdOwogICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5zdXBwb3J0RGV2aWNlKGRldmljZSkpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsZWFyaW5nIGRpcmVjdCBvdXRwdXQgcHJvZmlsZSAlenUgb24gbW9kdWxlICV6dSIsIGosIGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbGVhcmluZyBkaXJlY3Qgb3V0cHV0IHByb2ZpbGUgJXp1IG9uIG1vZHVsZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiwgaHdNb2R1bGUtPmdldE5hbWUoKSk7CiAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPmNsZWFyQXVkaW9Qcm9maWxlcygpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTQzMzksMjMgKzQ0NTQsMTggQEAKIAogICAgICAgICAvLyB0aGVuIGxvb2sgZm9yIGlucHV0IHByb2ZpbGVzIHRoYXQgY2FuIGJlIHJvdXRlZCB0byB0aGlzIGRldmljZQogICAgICAgICBTb3J0ZWRWZWN0b3I8IHNwPElPUHJvZmlsZT4gPiBwcm9maWxlczsKLSAgICAgICAgZm9yIChzaXplX3QgbW9kdWxlX2lkeCA9IDA7IG1vZHVsZV9pZHggPCBtSHdNb2R1bGVzLnNpemUoKTsgbW9kdWxlX2lkeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobUh3TW9kdWxlc1ttb2R1bGVfaWR4XS0+bUhhbmRsZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgaHdNb2R1bGUgOiBtSHdNb2R1bGVzKSB7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBwcm9maWxlX2luZGV4ID0gMDsKLSAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCA8IG1Id01vZHVsZXNbbW9kdWxlX2lkeF0tPm1JbnB1dFByb2ZpbGVzLnNpemUoKTsKLSAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IG1Id01vZHVsZXNbbW9kdWxlX2lkeF0tPm1JbnB1dFByb2ZpbGVzW3Byb2ZpbGVfaW5kZXhdOworICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4IDwgaHdNb2R1bGUtPmdldElucHV0UHJvZmlsZXMoKS5zaXplKCk7CisgICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgrKykgeworICAgICAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IGh3TW9kdWxlLT5nZXRJbnB1dFByb2ZpbGVzKClbcHJvZmlsZV9pbmRleF07CiAKICAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+c3VwcG9ydERldmljZShkZXZpY2UpKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmICghZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2UpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+c3VwcG9ydERldmljZUFkZHJlc3MoYWRkcmVzcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVzLmFkZChwcm9maWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBhZGRpbmcgcHJvZmlsZSAlenUgZnJvbSBtb2R1bGUgJXp1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgsIG1vZHVsZV9pZHgpOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IGFkZGluZyBwcm9maWxlICV6dSBmcm9tIG1vZHVsZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgsIGh3TW9kdWxlLT5nZXROYW1lKCkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtNDM3MSw2ICs0NDgxLDcgQEAKICAgICAgICAgZm9yIChzc2l6ZV90IHByb2ZpbGVfaW5kZXggPSAwOyBwcm9maWxlX2luZGV4IDwgKHNzaXplX3QpcHJvZmlsZXMuc2l6ZSgpOyBwcm9maWxlX2luZGV4KyspIHsKIAogICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gcHJvZmlsZXNbcHJvZmlsZV9pbmRleF07CisKICAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaWYgb25lIGlucHV0IGlzIGFscmVhZHkgb3BlbmVkIGZvciB0aGlzIHByb2ZpbGUKICAgICAgICAgICAgIHNpemVfdCBpbnB1dF9pbmRleDsKICAgICAgICAgICAgIGZvciAoaW5wdXRfaW5kZXggPSAwOyBpbnB1dF9pbmRleCA8IG1JbnB1dHMuc2l6ZSgpOyBpbnB1dF9pbmRleCsrKSB7CkBAIC00Mzg2LDMxICs0NDk3LDIyIEBACiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIEFMT0dWKCJvcGVuaW5nIGlucHV0IGZvciBkZXZpY2UgMHglWCB3aXRoIHBhcmFtcyAlcyIsIGRldmljZSwgYWRkcmVzcy5zdHJpbmcoKSk7Ci0gICAgICAgICAgICBkZXNjID0gbmV3IEF1ZGlvSW5wdXREZXNjcmlwdG9yKHByb2ZpbGUpOwotICAgICAgICAgICAgZGVzYy0+bURldmljZSA9IGRldmljZTsKLSAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKLSAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IGRlc2MtPm1TYW1wbGluZ1JhdGU7Ci0gICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gZGVzYy0+bUNoYW5uZWxNYXNrOwotICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IGRlc2MtPm1Gb3JtYXQ7CisgICAgICAgICAgICBpZiAoIXByb2ZpbGUtPmNhbk9wZW5OZXdJbygpKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIk1heCBJbnB1dCBudW1iZXIgJXUgYWxyZWFkeSBvcGVuZWQgZm9yIHRoaXMgcHJvZmlsZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bWF4T3BlbkNvdW50LCBwcm9maWxlLT5nZXRUYWdOYW1lKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlc2MgPSBuZXcgQXVkaW9JbnB1dERlc2NyaXB0b3IocHJvZmlsZSwgbXBDbGllbnRJbnRlcmZhY2UpOwogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLQotICAgICAgICAgICAgQUxPR1YoIm9wZW5pbmcgaW5wdXRwdXQgZm9yIGRldmljZSAlMDh4IHdpdGggcGFyYW1zICVzIHByb2ZpbGUgJXAgbmFtZSAlcyIsCi0gICAgICAgICAgICAgICAgICBkZXNjLT5tRGV2aWNlLCBhZGRyZXNzLnN0cmluZygpLCBwcm9maWxlLmdldCgpLCBwcm9maWxlLT5nZXROYW1lKCkuc3RyaW5nKCkpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3BlbklucHV0KHByb2ZpbGUtPmdldE1vZHVsZUhhbmRsZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjLT5tRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfTUlDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19JTlBVVF9GTEFHX05PTkUgLypGSVhNRSovKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRlc2MtPm9wZW4obnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfTUlDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19JTlBVVF9GTEFHX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dCk7CiAKICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBkZXNjLT5tU2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOwotICAgICAgICAgICAgICAgIGRlc2MtPm1DaGFubmVsTWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7Ci0gICAgICAgICAgICAgICAgZGVzYy0+bUZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7Ci0KICAgICAgICAgICAgICAgICBpZiAoIWFkZHJlc3MuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnBhcmFtID0gYXVkaW9fZGV2aWNlX2FkZHJlc3NfdG9fcGFyYW1ldGVyKGRldmljZSwgYWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKGlucHV0LCBTdHJpbmc4KHBhcmFtKSk7CkBAIC00NDE5LDcgKzQ1MjEsNyBAQAogICAgICAgICAgICAgICAgIHVwZGF0ZUF1ZGlvUHJvZmlsZXMoZGV2aWNlLCBpbnB1dCwgcHJvZmlsZS0+Z2V0QXVkaW9Qcm9maWxlcygpKTsKICAgICAgICAgICAgICAgICBpZiAoIXByb2ZpbGUtPmhhc1ZhbGlkQXVkaW9Qcm9maWxlKCkpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1coImNoZWNrSW5wdXRzRm9yRGV2aWNlKCkgZGlyZWN0IGlucHV0IG1pc3NpbmcgcGFyYW0iKTsKLSAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlSW5wdXQoaW5wdXQpOworICAgICAgICAgICAgICAgICAgICBkZXNjLT5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICBpbnB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgICAgICAgICAgICAgIH0KIApAQCAtNDQ1NywxNyArNDU1OSwxNCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIC8vIENsZWFyIGFueSBwcm9maWxlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGRpc2Nvbm5lY3RlZCBkZXZpY2UuCi0gICAgICAgIGZvciAoc2l6ZV90IG1vZHVsZV9pbmRleCA9IDA7IG1vZHVsZV9pbmRleCA8IG1Id01vZHVsZXMuc2l6ZSgpOyBtb2R1bGVfaW5kZXgrKykgewotICAgICAgICAgICAgaWYgKG1Id01vZHVsZXNbbW9kdWxlX2luZGV4XS0+bUhhbmRsZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgaHdNb2R1bGUgOiBtSHdNb2R1bGVzKSB7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBwcm9maWxlX2luZGV4ID0gMDsKLSAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCA8IG1Id01vZHVsZXNbbW9kdWxlX2luZGV4XS0+bUlucHV0UHJvZmlsZXMuc2l6ZSgpOworICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4IDwgaHdNb2R1bGUtPmdldElucHV0UHJvZmlsZXMoKS5zaXplKCk7CiAgICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgrKykgewotICAgICAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IG1Id01vZHVsZXNbbW9kdWxlX2luZGV4XS0+bUlucHV0UHJvZmlsZXNbcHJvZmlsZV9pbmRleF07CisgICAgICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gaHdNb2R1bGUtPmdldElucHV0UHJvZmlsZXMoKVtwcm9maWxlX2luZGV4XTsKICAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+c3VwcG9ydERldmljZShkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBjbGVhcmluZyBkaXJlY3QgaW5wdXQgcHJvZmlsZSAlenUgb24gbW9kdWxlICV6dSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgsIG1vZHVsZV9pbmRleCk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBjbGVhcmluZyBkaXJlY3QgaW5wdXQgcHJvZmlsZSAlenUgb24gbW9kdWxlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4LCBod01vZHVsZS0+Z2V0TmFtZSgpKTsKICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+Y2xlYXJBdWRpb1Byb2ZpbGVzKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtNDQ5NSw3ICs0NTk0LDcgQEAKICAgICAgICAgaWYgKGR1cE91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpICYmCiAgICAgICAgICAgICAgICAgKGR1cE91dHB1dERlc2MtPm1PdXRwdXQxID09IG91dHB1dERlc2MgfHwKICAgICAgICAgICAgICAgICBkdXBPdXRwdXREZXNjLT5tT3V0cHV0MiA9PSBvdXRwdXREZXNjKSkgewotICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjMjsKKyAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjMjsKICAgICAgICAgICAgIGlmIChkdXBPdXRwdXREZXNjLT5tT3V0cHV0MSA9PSBvdXRwdXREZXNjKSB7CiAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYzIgPSBkdXBPdXRwdXREZXNjLT5tT3V0cHV0MjsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC00NTA1LDEwICs0NjA0LDE2IEBACiAgICAgICAgICAgICAvLyBhbmQgYXMgdGhleSB3ZXJlIGFsc28gcmVmZXJlbmNlZCBvbiB0aGUgb3RoZXIgb3V0cHV0LCB0aGUgcmVmZXJlbmNlCiAgICAgICAgICAgICAvLyBjb3VudCBmb3IgdGhlaXIgc3RyZWFtIHR5cGUgbXVzdCBiZSBhZGp1c3RlZCBhY2NvcmRpbmdseSBvbgogICAgICAgICAgICAgLy8gdGhlIG90aGVyIG91dHB1dC4KKyAgICAgICAgICAgIGJvb2wgd2FzQWN0aXZlID0gb3V0cHV0RGVzYzItPmlzQWN0aXZlKCk7CiAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IEFVRElPX1NUUkVBTV9DTlQ7IGorKykgewogICAgICAgICAgICAgICAgIGludCByZWZDb3VudCA9IGR1cE91dHB1dERlc2MtPm1SZWZDb3VudFtqXTsKICAgICAgICAgICAgICAgICBvdXRwdXREZXNjMi0+Y2hhbmdlUmVmQ291bnQoKGF1ZGlvX3N0cmVhbV90eXBlX3QpaiwtcmVmQ291bnQpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gc3RvcCgpIHdpbGwgYmUgYSBubyBvcCBpZiB0aGUgb3V0cHV0IGlzIHN0aWxsIGFjdGl2ZSBidXQgaXMgbmVlZGVkIGluIGNhc2UgYWxsCisgICAgICAgICAgICAvLyBhY3RpdmUgc3RyZWFtcyByZWZjb3VudHMgd2hlcmUgY2xlYXJlZCBhYm92ZQorICAgICAgICAgICAgaWYgKHdhc0FjdGl2ZSkgeworICAgICAgICAgICAgICAgIG91dHB1dERlc2MyLT5zdG9wKCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBkdXBsaWNhdGVkT3V0cHV0ID0gbU91dHB1dHMua2V5QXQoaSk7CiAgICAgICAgICAgICBBTE9HVigiY2xvc2VPdXRwdXQoKSBjbG9zaW5nIGFsc28gZHVwbGljYXRlZCBvdXRwdXQgJWQiLCBkdXBsaWNhdGVkT3V0cHV0KTsKIApAQCAtNDUyNywxMSArNDYzMiw4IEBACiAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CiAgICAgfQogCi0gICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW07Ci0gICAgcGFyYW0uYWRkKFN0cmluZzgoImNsb3NpbmciKSwgU3RyaW5nOCgidHJ1ZSIpKTsKLSAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhvdXRwdXQsIHBhcmFtLnRvU3RyaW5nKCkpOworICAgIG91dHB1dERlc2MtPmNsb3NlKCk7CiAKLSAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQob3V0cHV0KTsKICAgICByZW1vdmVPdXRwdXQob3V0cHV0KTsKICAgICBtUHJldmlvdXNPdXRwdXRzID0gbU91dHB1dHM7CiB9CkBAIC00NTU2LDcgKzQ2NTgsNyBAQAogICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwogICAgIH0KIAotICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZUlucHV0KGlucHV0KTsKKyAgICBpbnB1dERlc2MtPmNsb3NlKCk7CiAgICAgbUlucHV0cy5yZW1vdmVJdGVtKGlucHV0KTsKIH0KIApAQCAtNDYxOSwxNyArNDcyMSwyNiBAQAogICAgIH0KIAogICAgIGlmICghdmVjdG9yc0VxdWFsKHNyY091dHB1dHMsZHN0T3V0cHV0cykpIHsKKyAgICAgICAgLy8gZ2V0IG1heGltdW0gbGF0ZW5jeSBvZiBhbGwgc291cmNlIG91dHB1dHMgdG8gZGV0ZXJtaW5lIHRoZSBtaW5pbXVtIG11dGUgdGltZSBndWFyYW50ZWVpbmcKKyAgICAgICAgLy8gYXVkaW8gZnJvbSBpbnZhbGlkYXRlZCB0cmFja3Mgd2lsbCBiZSByZW5kZXJlZCB3aGVuIHVubXV0aW5nCisgICAgICAgIHVpbnQzMl90IG1heExhdGVuY3kgPSAwOworICAgICAgICBmb3IgKGF1ZGlvX2lvX2hhbmRsZV90IHNyY091dCA6IHNyY091dHB1dHMpIHsKKyAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbVByZXZpb3VzT3V0cHV0cy52YWx1ZUZvcihzcmNPdXQpOworICAgICAgICAgICAgaWYgKGRlc2MgIT0gMCAmJiBtYXhMYXRlbmN5IDwgZGVzYy0+bGF0ZW5jeSgpKSB7CisgICAgICAgICAgICAgICAgbWF4TGF0ZW5jeSA9IGRlc2MtPmxhdGVuY3koKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRGb3JTdHJhdGVneSgpIHN0cmF0ZWd5ICVkLCBtb3ZpbmcgZnJvbSBvdXRwdXQgJWQgdG8gb3V0cHV0ICVkIiwKICAgICAgICAgICAgICAgc3RyYXRlZ3ksIHNyY091dHB1dHNbMF0sIGRzdE91dHB1dHNbMF0pOwogICAgICAgICAvLyBtdXRlIHN0cmF0ZWd5IHdoaWxlIG1vdmluZyB0cmFja3MgZnJvbSBvbmUgb3V0cHV0IHRvIGFub3RoZXIKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzcmNPdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKHNyY091dHB1dHNbaV0pOwotICAgICAgICAgICAgaWYgKGlzU3RyYXRlZ3lBY3RpdmUoZGVzYywgc3RyYXRlZ3kpKSB7CisgICAgICAgIGZvciAoYXVkaW9faW9faGFuZGxlX3Qgc3JjT3V0IDogc3JjT3V0cHV0cykgeworICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtUHJldmlvdXNPdXRwdXRzLnZhbHVlRm9yKHNyY091dCk7CisgICAgICAgICAgICBpZiAoZGVzYyAhPSAwICYmIGlzU3RyYXRlZ3lBY3RpdmUoZGVzYywgc3RyYXRlZ3kpKSB7CiAgICAgICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKHN0cmF0ZWd5LCB0cnVlLCBkZXNjKTsKLSAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoc3RyYXRlZ3ksIGZhbHNlLCBkZXNjLCBNVVRFX1RJTUVfTVMsIG5ld0RldmljZSk7CisgICAgICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKHN0cmF0ZWd5LCBmYWxzZSwgZGVzYywgbWF4TGF0ZW5jeSAqIExBVEVOQ1lfTVVURV9GQUNUT1IsIG5ld0RldmljZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+IHNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgIGdldFNvdXJjZUZvclN0cmF0ZWd5T25PdXRwdXQoc3JjT3V0cHV0c1tpXSwgc3RyYXRlZ3kpOworICAgICAgICAgICAgICAgICAgICBnZXRTb3VyY2VGb3JTdHJhdGVneU9uT3V0cHV0KHNyY091dCwgc3RyYXRlZ3kpOwogICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSAwKXsKICAgICAgICAgICAgICAgICBjb25uZWN0QXVkaW9Tb3VyY2Uoc291cmNlKTsKICAgICAgICAgICAgIH0KQEAgLTQ2NjYsNyArNDc3Nyw3IEBACiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tBMmRwU3VzcGVuZCgpCiB7CiAgICAgYXVkaW9faW9faGFuZGxlX3QgYTJkcE91dHB1dCA9IG1PdXRwdXRzLmdldEEyZHBPdXRwdXQoKTsKLSAgICBpZiAoYTJkcE91dHB1dCA9PSAwKSB7CisgICAgaWYgKGEyZHBPdXRwdXQgPT0gMCB8fCBtT3V0cHV0cy5pc0EyZHBPZmZsb2FkZWRPblByaW1hcnkoKSkgewogICAgICAgICBtQTJkcFN1c3BlbmRlZCA9IGZhbHNlOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNDcyOCw2ICs0ODM5LDIwIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvLyBDaGVjayBpZiBhbiBleHBsaWNpdCByb3V0aW5nIHJlcXVlc3QgZXhpc3RzIGZvciBhbiBhY3RpdmUgc3RyZWFtIG9uIHRoaXMgb3V0cHV0IGFuZAorICAgIC8vIHVzZSBpdCBpbiBwcmlvcml0eSBiZWZvcmUgYW55IG90aGVyIHJ1bGUKKyAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7IHN0cmVhbSsrKSB7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5pc1N0cmVhbUFjdGl2ZSgoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0pKSB7CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZm9yY2VkRGV2aWNlID0KKyAgICAgICAgICAgICAgICAgICAgbU91dHB1dFJvdXRlcy5nZXRBY3RpdmVEZXZpY2VGb3JTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtLCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyk7CisKKyAgICAgICAgICAgIGlmIChmb3JjZWREZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZm9yY2VkRGV2aWNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgLy8gY2hlY2sgdGhlIGZvbGxvd2luZyBieSBvcmRlciBvZiBwcmlvcml0eSB0byByZXF1ZXN0IGEgcm91dGluZyBjaGFuZ2UgaWYgbmVjZXNzYXJ5OgogICAgIC8vIDE6IHRoZSBzdHJhdGVneSBlbmZvcmNlZCBhdWRpYmxlIGlzIGFjdGl2ZSBhbmQgZW5mb3JjZWQgb24gdGhlIG91dHB1dDoKICAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IGVuZm9yY2VkIGF1ZGlibGUKQEAgLTQ3ODksMTAgKzQ5MTQsMTMgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8vIElmIHdlIGFyZSBub3QgaW4gY2FsbCBhbmQgbm8gY2xpZW50IGlzIGFjdGl2ZSBvbiB0aGlzIGlucHV0LCB0aGlzIG1ldGhvZHMgcmV0dXJucworICAgIC8vIEFVRElPX0RFVklDRV9OT05FLCBjYXVzaW5nIHRoZSBwYXRjaCBvbiB0aGUgaW5wdXQgc3RyZWFtIHRvIGJlIHJlbGVhc2VkLgogICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSA9IGlucHV0RGVzYy0+Z2V0SGlnaGVzdFByaW9yaXR5U291cmNlKHRydWUgLyphY3RpdmVPbmx5Ki8pOwotICAgIGlmIChpc0luQ2FsbCgpKSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OKTsKLSAgICB9IGVsc2UgaWYgKHNvdXJjZSAhPSBBVURJT19TT1VSQ0VfREVGQVVMVCkgeworICAgIGlmIChzb3VyY2UgPT0gQVVESU9fU09VUkNFX0RFRkFVTFQgJiYgaXNJbkNhbGwoKSkgeworICAgICAgICBzb3VyY2UgPSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTjsKKyAgICB9CisgICAgaWYgKHNvdXJjZSAhPSBBVURJT19TT1VSQ0VfREVGQVVMVCkgewogICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShzb3VyY2UpOwogICAgIH0KIApAQCAtNDgyMyw5ICs0OTUxLDggQEAKICAgICAgICAgcm91dGluZ19zdHJhdGVneSBjdXJTdHJhdGVneSA9IGdldFN0cmF0ZWd5KChhdWRpb19zdHJlYW1fdHlwZV90KWN1clN0cmVhbSk7CiAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBjdXJEZXZpY2VzID0KICAgICAgICAgICAgICAgICBnZXREZXZpY2VGb3JTdHJhdGVneSgocm91dGluZ19zdHJhdGVneSljdXJTdHJhdGVneSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2UoY3VyRGV2aWNlcywgbU91dHB1dHMpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dHNbaV0pOworICAgICAgICBmb3IgKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA6IGdldE91dHB1dHNGb3JEZXZpY2UoY3VyRGV2aWNlcywgbU91dHB1dHMpKSB7CisgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwogICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzU3RyZWFtQWN0aXZlKChhdWRpb19zdHJlYW1fdHlwZV90KWN1clN0cmVhbSkpIHsKICAgICAgICAgICAgICAgICBjdXJEZXZpY2VzIHw9IG91dHB1dERlc2MtPmRldmljZSgpOwogICAgICAgICAgICAgfQpAQCAtNDkzMywxOSArNTA2MCwxNiBAQAogYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlRm9yU3RyYXRlZ3kocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbUNhY2hlKQogewotICAgIC8vIFJvdXRpbmcKLSAgICAvLyBzZWUgaWYgd2UgaGF2ZSBhbiBleHBsaWNpdCByb3V0ZQotICAgIC8vIHNjYW4gdGhlIHdob2xlIFJvdXRlTWFwLCBmb3IgZWFjaCBlbnRyeSwgY29udmVydCB0aGUgc3RyZWFtIHR5cGUgdG8gYSBzdHJhdGVneQotICAgIC8vIChnZXRTdHJhdGVneShzdHJlYW0pKS4KLSAgICAvLyBpZiB0aGUgc3RyYXRlZ3kgZnJvbSB0aGUgc3RyZWFtIHR5cGUgaW4gdGhlIFJvdXRlTWFwIGlzIHRoZSBzYW1lIGFzIHRoZSBhcmd1bWVudCBhYm92ZSwKLSAgICAvLyBhbmQgYWN0aXZpdHkgY291bnQgaXMgbm9uLXplcm8gYW5kIHRoZSBkZXZpY2UgaW4gdGhlIHJvdXRlIGRlc2NyaXB0b3IgaXMgYXZhaWxhYmxlCi0gICAgLy8gdGhlbiBzZWxlY3QgdGhpcyBkZXZpY2UuCi0gICAgZm9yIChzaXplX3Qgcm91dGVJbmRleCA9IDA7IHJvdXRlSW5kZXggPCBtT3V0cHV0Um91dGVzLnNpemUoKTsgcm91dGVJbmRleCsrKSB7Ci0gICAgICAgIHNwPFNlc3Npb25Sb3V0ZT4gcm91dGUgPSBtT3V0cHV0Um91dGVzLnZhbHVlQXQocm91dGVJbmRleCk7Ci0gICAgICAgIHJvdXRpbmdfc3RyYXRlZ3kgcm91dGVTdHJhdGVneSA9IGdldFN0cmF0ZWd5KHJvdXRlLT5tU3RyZWFtVHlwZSk7Ci0gICAgICAgIGlmICgocm91dGVTdHJhdGVneSA9PSBzdHJhdGVneSkgJiYgcm91dGUtPmlzQWN0aXZlKCkgJiYKLSAgICAgICAgICAgICAgICAobUF2YWlsYWJsZU91dHB1dERldmljZXMuaW5kZXhPZihyb3V0ZS0+bURldmljZURlc2NyaXB0b3IpID49IDApKSB7Ci0gICAgICAgICAgICByZXR1cm4gcm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yLT50eXBlKCk7CisgICAgLy8gQ2hlY2sgaWYgYW4gZXhwbGljaXQgcm91dGluZyByZXF1ZXN0IGV4aXN0cyBmb3IgYSBzdHJlYW0gdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoZQorICAgIC8vIHNwZWNpZmllZCBzdHJhdGVneSBhbmQgdXNlIGl0IGluIHByaW9yaXR5IG92ZXIgZGVmYXVsdCByb3V0aW5nIHJ1bGVzLgorICAgIGZvciAoaW50IHN0cmVhbSA9IDA7IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9GT1JfUE9MSUNZX0NOVDsgc3RyZWFtKyspIHsKKyAgICAgICAgaWYgKGdldFN0cmF0ZWd5KChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSkgPT0gc3RyYXRlZ3kpIHsKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBmb3JjZWREZXZpY2UgPQorICAgICAgICAgICAgICAgICAgICBtT3V0cHV0Um91dGVzLmdldEFjdGl2ZURldmljZUZvclN0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0sIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzKTsKKyAgICAgICAgICAgIGlmIChmb3JjZWREZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZm9yY2VkRGV2aWNlOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC01MDU1LDIxICs1MTc5LDI0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhZGRyZXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVxdWlyZXNNdXRlQ2hlY2spCiB7CiAgICAgQUxPR1YoInNldE91dHB1dERldmljZSgpIGRldmljZSAlMDR4IGRlbGF5TXMgJWQiLCBkZXZpY2UsIGRlbGF5TXMpOwogICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtOwogICAgIHVpbnQzMl90IG11dGVXYWl0TXM7CiAKICAgICBpZiAob3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKLSAgICAgICAgbXV0ZVdhaXRNcyA9IHNldE91dHB1dERldmljZShvdXRwdXREZXNjLT5zdWJPdXRwdXQxKCksIGRldmljZSwgZm9yY2UsIGRlbGF5TXMpOwotICAgICAgICBtdXRlV2FpdE1zICs9IHNldE91dHB1dERldmljZShvdXRwdXREZXNjLT5zdWJPdXRwdXQyKCksIGRldmljZSwgZm9yY2UsIGRlbGF5TXMpOworICAgICAgICBtdXRlV2FpdE1zID0gc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MtPnN1Yk91dHB1dDEoKSwgZGV2aWNlLCBmb3JjZSwgZGVsYXlNcywKKyAgICAgICAgICAgICAgICBudWxscHRyIC8qIHBhdGNoSGFuZGxlICovLCBudWxscHRyIC8qIGFkZHJlc3MgKi8sIHJlcXVpcmVzTXV0ZUNoZWNrKTsKKyAgICAgICAgbXV0ZVdhaXRNcyArPSBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYy0+c3ViT3V0cHV0MigpLCBkZXZpY2UsIGZvcmNlLCBkZWxheU1zLAorICAgICAgICAgICAgICAgIG51bGxwdHIgLyogcGF0Y2hIYW5kbGUgKi8sIG51bGxwdHIgLyogYWRkcmVzcyAqLywgcmVxdWlyZXNNdXRlQ2hlY2spOwogICAgICAgICByZXR1cm4gbXV0ZVdhaXRNczsKICAgICB9CiAgICAgLy8gbm8gbmVlZCB0byBwcm9jZWVkIGlmIG5ldyBkZXZpY2UgaXMgbm90IEFVRElPX0RFVklDRV9OT05FIGFuZCBub3Qgc3VwcG9ydGVkIGJ5IGN1cnJlbnQKICAgICAvLyBvdXRwdXQgcHJvZmlsZQogICAgIGlmICgoZGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSAmJgotICAgICAgICAgICAgKChkZXZpY2UgJiBvdXRwdXREZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkpID09IDApKSB7CisgICAgICAgICAgICAoKGRldmljZSAmIG91dHB1dERlc2MtPnN1cHBvcnRlZERldmljZXMoKSkgPT0gQVVESU9fREVWSUNFX05PTkUpKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIApAQCAtNTA4Myw3ICs1MjEwLDE0IEBACiAgICAgaWYgKGRldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgewogICAgICAgICBvdXRwdXREZXNjLT5tRGV2aWNlID0gZGV2aWNlOwogICAgIH0KLSAgICBtdXRlV2FpdE1zID0gY2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcyhvdXRwdXREZXNjLCBwcmV2RGV2aWNlLCBkZWxheU1zKTsKKworICAgIC8vIGlmIHRoZSBvdXRwdXRzIGFyZSBub3QgbWF0ZXJpYWxseSBhY3RpdmUsIHRoZXJlIGlzIG5vIG5lZWQgdG8gbXV0ZS4KKyAgICBpZiAocmVxdWlyZXNNdXRlQ2hlY2spIHsKKyAgICAgICAgbXV0ZVdhaXRNcyA9IGNoZWNrRGV2aWNlTXV0ZVN0cmF0ZWdpZXMob3V0cHV0RGVzYywgcHJldkRldmljZSwgZGVsYXlNcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIiVzOiBzdXBwcmVzc2luZyBjaGVja0RldmljZU11dGVTdHJhdGVnaWVzIiwgX19mdW5jX18pOworICAgICAgICBtdXRlV2FpdE1zID0gMDsKKyAgICB9CiAKICAgICAvLyBEbyBub3QgY2hhbmdlIHRoZSByb3V0aW5nIGlmOgogICAgIC8vICAgICAgdGhlIHJlcXVlc3RlZCBkZXZpY2UgaXMgQVVESU9fREVWSUNFX05PTkUKQEAgLTUyOTksMjcgKzU0MzMsNDYgQEAKICAgICAvLyBUT0RPOiBwZXJoYXBzIGlzQ29tcGF0aWJsZVByb2ZpbGUgc2hvdWxkIHJldHVybiBhICJtYXRjaGluZyIgc2NvcmUgc28gd2UgY2FuIHJldHVybgogICAgIC8vIHRoZSBiZXN0IG1hdGNoaW5nIHByb2ZpbGUsIG5vdCB0aGUgZmlyc3Qgb25lLgogCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSHdNb2R1bGVzLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKG1Id01vZHVsZXNbaV0tPm1IYW5kbGUgPT0gMCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtSHdNb2R1bGVzW2ldLT5tSW5wdXRQcm9maWxlcy5zaXplKCk7IGorKykKLSAgICAgICAgewotICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gbUh3TW9kdWxlc1tpXS0+bUlucHV0UHJvZmlsZXNbal07CisgICAgc3A8SU9Qcm9maWxlPiBmaXJzdEluZXhhY3Q7CisgICAgdWludDMyX3QgdXBkYXRlZFNhbXBsaW5nUmF0ZSA9IDA7CisgICAgYXVkaW9fZm9ybWF0X3QgdXBkYXRlZEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOworICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IHVwZGF0ZWRDaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfSU5WQUxJRDsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGh3TW9kdWxlIDogbUh3TW9kdWxlcykgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHByb2ZpbGUgOiBod01vZHVsZS0+Z2V0SW5wdXRQcm9maWxlcygpKSB7CiAgICAgICAgICAgICAvLyBwcm9maWxlLT5sb2coKTsKKyAgICAgICAgICAgIC8vdXBkYXRlZEZvcm1hdCA9IGZvcm1hdDsKICAgICAgICAgICAgIGlmIChwcm9maWxlLT5pc0NvbXBhdGlibGVQcm9maWxlKGRldmljZSwgYWRkcmVzcywgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsaW5nUmF0ZSAvKnVwZGF0ZWRTYW1wbGluZ1JhdGUqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGluZ1JhdGUgIC8qdXBkYXRlZFNhbXBsaW5nUmF0ZSovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcm1hdCAvKnVwZGF0ZWRGb3JtYXQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3JtYXQsICAgICAgIC8qdXBkYXRlZEZvcm1hdCovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFubmVsTWFzayAvKnVwZGF0ZWRDaGFubmVsTWFzayovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KSBmbGFncykpIHsKLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoYW5uZWxNYXNrICAgLyp1cGRhdGVkQ2hhbm5lbE1hc2sqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIHVnbHkgY2FzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KSBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLypleGFjdE1hdGNoUmVxdWlyZWRGb3JJbnB1dEZsYWdzKi8pKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHByb2ZpbGU7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmlyc3RJbmV4YWN0ID09IG51bGxwdHIgJiYgcHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShkZXZpY2UsIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXBkYXRlZFNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1cGRhdGVkRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXBkYXRlZENoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgdWdseSBjYXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLypleGFjdE1hdGNoUmVxdWlyZWRGb3JJbnB1dEZsYWdzKi8pKSB7CisgICAgICAgICAgICAgICAgZmlyc3RJbmV4YWN0ID0gcHJvZmlsZTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICB9CiAgICAgfQorICAgIGlmIChmaXJzdEluZXhhY3QgIT0gbnVsbHB0cikgeworICAgICAgICBzYW1wbGluZ1JhdGUgPSB1cGRhdGVkU2FtcGxpbmdSYXRlOworICAgICAgICBmb3JtYXQgPSB1cGRhdGVkRm9ybWF0OworICAgICAgICBjaGFubmVsTWFzayA9IHVwZGF0ZWRDaGFubmVsTWFzazsKKyAgICAgICAgcmV0dXJuIGZpcnN0SW5leGFjdDsKKyAgICB9CiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTUzNDYsNyArNTQ5OSw3IEBACiAgICAgLy8gdGhlbiBzZWxlY3QgdGhpcyBkZXZpY2UuCiAgICAgZm9yIChzaXplX3Qgcm91dGVJbmRleCA9IDA7IHJvdXRlSW5kZXggPCBtSW5wdXRSb3V0ZXMuc2l6ZSgpOyByb3V0ZUluZGV4KyspIHsKICAgICAgICAgIHNwPFNlc3Npb25Sb3V0ZT4gcm91dGUgPSBtSW5wdXRSb3V0ZXMudmFsdWVBdChyb3V0ZUluZGV4KTsKLSAgICAgICAgIGlmICgoaW5wdXRTb3VyY2UgPT0gcm91dGUtPm1Tb3VyY2UpICYmIHJvdXRlLT5pc0FjdGl2ZSgpICYmCisgICAgICAgICBpZiAoKGlucHV0U291cmNlID09IHJvdXRlLT5tU291cmNlKSAmJiByb3V0ZS0+aXNBY3RpdmVPckNoYW5nZWQoKSAmJgogICAgICAgICAgICAgICAgICAobUF2YWlsYWJsZUlucHV0RGV2aWNlcy5pbmRleE9mKHJvdXRlLT5tRGV2aWNlRGVzY3JpcHRvcikgPj0gMCkpIHsKICAgICAgICAgICAgICByZXR1cm4gcm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yLT50eXBlKCk7CiAgICAgICAgICB9CkBAIC01MzczLDcgKzU1MjYsOCBAQAogICAgIH0KIAogICAgIC8vIGluLWNhbGw6IGFsd2F5cyBjYXAgZWFycGllY2Ugdm9sdW1lIGJ5IHZvaWNlIHZvbHVtZSArIHNvbWUgbG93IGhlYWRyb29tCi0gICAgaWYgKChzdHJlYW0gIT0gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0VBUlBJRUNFKSAmJiBpc0luQ2FsbCgpKSB7CisgICAgaWYgKChzdHJlYW0gIT0gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0VBUlBJRUNFKSAmJgorICAgICAgICAgICAgKGlzSW5DYWxsKCkgfHwgbU91dHB1dHMuaXNTdHJlYW1BY3RpdmVMb2NhbGx5KEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSkpIHsKICAgICAgICAgc3dpdGNoIChzdHJlYW0pIHsKICAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fU1lTVEVNOgogICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9SSU5HOgpAQCAtNTM4Myw4ICs1NTM3LDExIEBACiAgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEU6CiAgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX0RUTUY6CiAgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFk6IHsKLSAgICAgICAgICAgIGNvbnN0IGZsb2F0IG1heFZvaWNlVm9sRGIgPSBjb21wdXRlVm9sdW1lKEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMLCBpbmRleCwgZGV2aWNlKQotICAgICAgICAgICAgICAgICAgICArIElOX0NBTExfRUFSUElFQ0VfSEVBRFJPT01fREI7CisgICAgICAgICAgICBpbnQgdm9pY2VWb2x1bWVJbmRleCA9CisgICAgICAgICAgICAgICAgbVZvbHVtZUN1cnZlcy0+Z2V0Vm9sdW1lSW5kZXgoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwsIEFVRElPX0RFVklDRV9PVVRfRUFSUElFQ0UpOworICAgICAgICAgICAgY29uc3QgZmxvYXQgbWF4Vm9pY2VWb2xEYiA9CisgICAgICAgICAgICAgICAgY29tcHV0ZVZvbHVtZShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCwgdm9pY2VWb2x1bWVJbmRleCwgQVVESU9fREVWSUNFX09VVF9FQVJQSUVDRSkKKyAgICAgICAgICAgICAgICArIElOX0NBTExfRUFSUElFQ0VfSEVBRFJPT01fREI7CiAgICAgICAgICAgICBpZiAodm9sdW1lREIgPiBtYXhWb2ljZVZvbERiKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoImNvbXB1dGVWb2x1bWUoKSBzdHJlYW0gJWQgYXQgdm9sPSVmIG92ZXJyaWRlbiBieSBzdHJlYW0gJWQgYXQgdm9sPSVmIiwKICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgdm9sdW1lREIsIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMLCBtYXhWb2ljZVZvbERiKTsKQEAgLTU0MDgsNyArNTU2NSw4IEBACiAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMgfAogICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEU0VUIHwKICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FIHwKLSAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfVVNCX0hFQURTRVQpKSAmJgorICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9VU0JfSEVBRFNFVCB8CisgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0hFQVJJTkdfQUlEKSkgJiYKICAgICAgICAgKChzdHJlYW1fc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKQogICAgICAgICAgICAgICAgIHx8IChzdHJlYW1fc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwpCiAgICAgICAgICAgICAgICAgfHwgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fU1lTVEVNKQpAQCAtNTQ4MSw3ICs1NjM5LDEwIEBACiAgICAgfQogCiAgICAgZmxvYXQgdm9sdW1lRGIgPSBjb21wdXRlVm9sdW1lKHN0cmVhbSwgaW5kZXgsIGRldmljZSk7Ci0gICAgaWYgKG91dHB1dERlc2MtPmlzRml4ZWRWb2x1bWUoZGV2aWNlKSkgeworICAgIGlmIChvdXRwdXREZXNjLT5pc0ZpeGVkVm9sdW1lKGRldmljZSkgfHwKKyAgICAgICAgICAgIC8vIEZvcmNlIFZvSVAgdm9sdW1lIHRvIG1heCBmb3IgYmx1ZXRvb3RoIFNDTworICAgICAgICAgICAgKChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwgfHwgc3RyZWFtID09IEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPKSAmJgorICAgICAgICAgICAgIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9TQ08pICE9IDApKSB7CiAgICAgICAgIHZvbHVtZURiID0gMC4wZjsKICAgICB9CiAKQEAgLTU3ODIsNzcgKzU5NDMsMTEwIEBACiAgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQpOwogICAgIEFMT0dEKCIlczogZm9yY2VkIHVzZSA9ICVkIiwgX19GVU5DVElPTl9fLCBmb3JjZVVzZSk7CiAKLSAgICAvLyBBbmFseXplIG9yaWdpbmFsIHN1cHBvcnQgZm9yIHZhcmlvdXMgZm9ybWF0cy4KLSAgICBib29sIHN1cHBvcnRzQUMzID0gZmFsc2U7Ci0gICAgYm9vbCBzdXBwb3J0c090aGVyU3Vycm91bmQgPSBmYWxzZTsKLSAgICBib29sIHN1cHBvcnRzSUVDNjE5MzcgPSBmYWxzZTsKLSAgICBmb3IgKHNpemVfdCBmb3JtYXRJbmRleCA9IDA7IGZvcm1hdEluZGV4IDwgZm9ybWF0cy5zaXplKCk7IGZvcm1hdEluZGV4KyspIHsKLSAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gZm9ybWF0c1tmb3JtYXRJbmRleF07Ci0gICAgICAgIHN3aXRjaCAoZm9ybWF0KSB7Ci0gICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9BQzM6Ci0gICAgICAgICAgICAgICAgc3VwcG9ydHNBQzMgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfRV9BQzM6Ci0gICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9EVFM6Ci0gICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9EVFNfSEQ6Ci0gICAgICAgICAgICAgICAgc3VwcG9ydHNPdGhlclN1cnJvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0lFQzYxOTM3OgotICAgICAgICAgICAgICAgIHN1cHBvcnRzSUVDNjE5MzcgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAvLyBJZiBNQU5VQUwsIGtlZXAgdGhlIHN1cHBvcnRlZCBzdXJyb3VuZCBzb3VuZCBmb3JtYXRzIGFzIGN1cnJlbnQgZW5hYmxlZCBvbmVzLgorICAgIGlmIChmb3JjZVVzZSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9NQU5VQUwpIHsKKyAgICAgICAgZm9ybWF0cy5jbGVhcigpOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBtU3Vycm91bmRGb3JtYXRzLmJlZ2luKCk7IGl0ICE9IG1TdXJyb3VuZEZvcm1hdHMuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgICAgIGZvcm1hdHMuYWRkKCppdCk7CiAgICAgICAgIH0KLSAgICB9CisgICAgICAgIC8vIEFsd2F5cyBlbmFibGUgSUVDNjE5Mzcgd2hlbiBpbiBNQU5VQUwgbW9kZS4KKyAgICAgICAgZm9ybWF0cy5hZGQoQVVESU9fRk9STUFUX0lFQzYxOTM3KTsKKyAgICB9IGVsc2UgeyAvLyBORVZFUiwgQVVUTyBvciBBTFdBWVMKKyAgICAgICAgLy8gQW5hbHl6ZSBvcmlnaW5hbCBzdXBwb3J0IGZvciB2YXJpb3VzIGZvcm1hdHMuCisgICAgICAgIGJvb2wgc3VwcG9ydHNBQzMgPSBmYWxzZTsKKyAgICAgICAgYm9vbCBzdXBwb3J0c090aGVyU3Vycm91bmQgPSBmYWxzZTsKKyAgICAgICAgYm9vbCBzdXBwb3J0c0lFQzYxOTM3ID0gZmFsc2U7CisgICAgICAgIG1TdXJyb3VuZEZvcm1hdHMuY2xlYXIoKTsKKyAgICAgICAgZm9yIChzc2l6ZV90IGZvcm1hdEluZGV4ID0gMDsgZm9ybWF0SW5kZXggPCAoc3NpemVfdClmb3JtYXRzLnNpemUoKTsgZm9ybWF0SW5kZXgrKykgeworICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gZm9ybWF0c1tmb3JtYXRJbmRleF07CisgICAgICAgICAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0FDMzoKKyAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHNBQzMgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9FX0FDMzoKKyAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9EVFM6CisgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfRFRTX0hEOgorICAgICAgICAgICAgICAgICAgICAvLyBJZiBBTFdBWVMsIHJlbW92ZSBhbGwgb3RoZXIgc3Vycm91bmQgZm9ybWF0cyBoZXJlCisgICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIHdlIHdpbGwgYWRkIHRoZW0gbGF0ZXIuCisgICAgICAgICAgICAgICAgICAgIGlmIChmb3JjZVVzZSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9BTFdBWVMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHMucmVtb3ZlQXQoZm9ybWF0SW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0SW5kZXgtLTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzdXBwb3J0c090aGVyU3Vycm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9JRUM2MTkzNzoKKyAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHNJRUM2MTkzNyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLSAgICAvLyBNb2RpZnkgZm9ybWF0cyBiYXNlZCBvbiBzdXJyb3VuZCBwcmVmZXJlbmNlcy4KLSAgICAvLyBJZiBORVZFUiwgcmVtb3ZlIHN1cHBvcnQgZm9yIHN1cnJvdW5kIGZvcm1hdHMuCi0gICAgaWYgKGZvcmNlVXNlID09IEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX05FVkVSKSB7Ci0gICAgICAgIGlmIChzdXBwb3J0c0FDMyB8fCBzdXBwb3J0c090aGVyU3Vycm91bmQgfHwgc3VwcG9ydHNJRUM2MTkzNykgewotICAgICAgICAgICAgLy8gUmVtb3ZlIHN1cnJvdW5kIHNvdW5kIHJlbGF0ZWQgZm9ybWF0cy4KLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGZvcm1hdEluZGV4ID0gMDsgZm9ybWF0SW5kZXggPCBmb3JtYXRzLnNpemUoKTsgKSB7CisgICAgICAgIC8vIE1vZGlmeSBmb3JtYXRzIGJhc2VkIG9uIHN1cnJvdW5kIHByZWZlcmVuY2VzLgorICAgICAgICAvLyBJZiBORVZFUiwgcmVtb3ZlIHN1cHBvcnQgZm9yIHN1cnJvdW5kIGZvcm1hdHMuCisgICAgICAgIGlmIChmb3JjZVVzZSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9ORVZFUikgeworICAgICAgICAgICAgaWYgKHN1cHBvcnRzQUMzIHx8IHN1cHBvcnRzT3RoZXJTdXJyb3VuZCB8fCBzdXBwb3J0c0lFQzYxOTM3KSB7CisgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHN1cnJvdW5kIHNvdW5kIHJlbGF0ZWQgZm9ybWF0cy4KKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBmb3JtYXRJbmRleCA9IDA7IGZvcm1hdEluZGV4IDwgZm9ybWF0cy5zaXplKCk7ICkgeworICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBmb3JtYXRzW2Zvcm1hdEluZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGZvcm1hdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfQUMzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfRV9BQzM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9EVFM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9EVFNfSEQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9JRUM2MTkzNzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRzLnJlbW92ZUF0KGZvcm1hdEluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0SW5kZXgrKzsgLy8ga2VlcCBpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN1cHBvcnRzQUMzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgc3VwcG9ydHNPdGhlclN1cnJvdW5kID0gZmFsc2U7CisgICAgICAgICAgICAgICAgc3VwcG9ydHNJRUM2MTkzNyA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeyAvLyBBVVRPIG9yIEFMV0FZUworICAgICAgICAgICAgLy8gTW9zdCBUVnMgc3VwcG9ydCBBQzMgZXZlbiBpZiB0aGV5IGRvIG5vdCByZXBvcnQgaXQgaW4gdGhlIEVESUQuCisgICAgICAgICAgICBpZiAoKGFsd2F5c0ZvcmNlQUMzIHx8IChmb3JjZVVzZSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9BTFdBWVMpKQorICAgICAgICAgICAgICAgICAgICAmJiAhc3VwcG9ydHNBQzMpIHsKKyAgICAgICAgICAgICAgICBmb3JtYXRzLmFkZChBVURJT19GT1JNQVRfQUMzKTsKKyAgICAgICAgICAgICAgICBzdXBwb3J0c0FDMyA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIElmIEFMV0FZUywgYWRkIHN1cHBvcnQgZm9yIHJhdyBzdXJyb3VuZCBmb3JtYXRzIGlmIGFsbCBhcmUgbWlzc2luZy4KKyAgICAgICAgICAgIC8vIFRoaXMgYXNzdW1lcyB0aGF0IGlmIGFueSBvZiB0aGVzZSBmb3JtYXRzIGFyZSByZXBvcnRlZCBieSB0aGUgSEFMCisgICAgICAgICAgICAvLyB0aGVuIHRoZSByZXBvcnQgaXMgdmFsaWQgYW5kIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuCisgICAgICAgICAgICBpZiAoZm9yY2VVc2UgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfQUxXQVlTKSB7CisgICAgICAgICAgICAgICAgZm9ybWF0cy5hZGQoQVVESU9fRk9STUFUX0VfQUMzKTsKKyAgICAgICAgICAgICAgICBmb3JtYXRzLmFkZChBVURJT19GT1JNQVRfRFRTKTsKKyAgICAgICAgICAgICAgICBmb3JtYXRzLmFkZChBVURJT19GT1JNQVRfRFRTX0hEKTsKKyAgICAgICAgICAgICAgICBzdXBwb3J0c090aGVyU3Vycm91bmQgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBBZGQgc3VwcG9ydCBmb3IgSUVDNjE5MzcgaWYgYW55IHJhdyBzdXJyb3VuZCBzdXBwb3J0ZWQuCisgICAgICAgICAgICAvLyBUaGUgSEFMIGNvdWxkIGRvIHRoaXMgYnV0IGFkZCBpdCBoZXJlLCBqdXN0IGluIGNhc2UuCisgICAgICAgICAgICBpZiAoKHN1cHBvcnRzQUMzIHx8IHN1cHBvcnRzT3RoZXJTdXJyb3VuZCkgJiYgIXN1cHBvcnRzSUVDNjE5MzcpIHsKKyAgICAgICAgICAgICAgICBmb3JtYXRzLmFkZChBVURJT19GT1JNQVRfSUVDNjE5MzcpOworICAgICAgICAgICAgICAgIHN1cHBvcnRzSUVDNjE5MzcgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBBZGQgcmVwb3J0ZWQgc3Vycm91bmQgc291bmQgZm9ybWF0cyB0byBlbmFibGVkIHN1cnJvdW5kIGZvcm1hdHMuCisgICAgICAgICAgICBmb3IgKHNpemVfdCBmb3JtYXRJbmRleCA9IDA7IGZvcm1hdEluZGV4IDwgZm9ybWF0cy5zaXplKCk7IGZvcm1hdEluZGV4KyspIHsKICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBmb3JtYXRzW2Zvcm1hdEluZGV4XTsKICAgICAgICAgICAgICAgICBzd2l0Y2goZm9ybWF0KSB7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0FDMzoKICAgICAgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfRV9BQzM6CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0RUUzoKICAgICAgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfRFRTX0hEOgotICAgICAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9JRUM2MTkzNzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHMucmVtb3ZlQXQoZm9ybWF0SW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0FBQ19MQzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfRE9MQllfVFJVRUhEOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9FX0FDM19KT0M6CisgICAgICAgICAgICAgICAgICAgICAgICBtU3Vycm91bmRGb3JtYXRzLmluc2VydChmb3JtYXQpOwogICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0SW5kZXgrKzsgLy8ga2VlcCBpdAogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3VwcG9ydHNBQzMgPSBmYWxzZTsKLSAgICAgICAgICAgIHN1cHBvcnRzT3RoZXJTdXJyb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgc3VwcG9ydHNJRUM2MTkzNyA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsgLy8gQVVUTyBvciBBTFdBWVMKLSAgICAgICAgLy8gTW9zdCBUVnMgc3VwcG9ydCBBQzMgZXZlbiBpZiB0aGV5IGRvIG5vdCByZXBvcnQgaXQgaW4gdGhlIEVESUQuCi0gICAgICAgIGlmICgoYWx3YXlzRm9yY2VBQzMgfHwgKGZvcmNlVXNlID09IEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX0FMV0FZUykpCi0gICAgICAgICAgICAgICAgJiYgIXN1cHBvcnRzQUMzKSB7Ci0gICAgICAgICAgICBmb3JtYXRzLmFkZChBVURJT19GT1JNQVRfQUMzKTsKLSAgICAgICAgICAgIHN1cHBvcnRzQUMzID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIEFMV0FZUywgYWRkIHN1cHBvcnQgZm9yIHJhdyBzdXJyb3VuZCBmb3JtYXRzIGlmIGFsbCBhcmUgbWlzc2luZy4KLSAgICAgICAgLy8gVGhpcyBhc3N1bWVzIHRoYXQgaWYgYW55IG9mIHRoZXNlIGZvcm1hdHMgYXJlIHJlcG9ydGVkIGJ5IHRoZSBIQUwKLSAgICAgICAgLy8gdGhlbiB0aGUgcmVwb3J0IGlzIHZhbGlkIGFuZCBzaG91bGQgbm90IGJlIG1vZGlmaWVkLgotICAgICAgICBpZiAoKGZvcmNlVXNlID09IEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX0FMV0FZUykKLSAgICAgICAgICAgICAgICAmJiAhc3VwcG9ydHNPdGhlclN1cnJvdW5kKSB7Ci0gICAgICAgICAgICBmb3JtYXRzLmFkZChBVURJT19GT1JNQVRfRV9BQzMpOwotICAgICAgICAgICAgZm9ybWF0cy5hZGQoQVVESU9fRk9STUFUX0RUUyk7Ci0gICAgICAgICAgICBmb3JtYXRzLmFkZChBVURJT19GT1JNQVRfRFRTX0hEKTsKLSAgICAgICAgICAgIHN1cHBvcnRzT3RoZXJTdXJyb3VuZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBZGQgc3VwcG9ydCBmb3IgSUVDNjE5MzcgaWYgYW55IHJhdyBzdXJyb3VuZCBzdXBwb3J0ZWQuCi0gICAgICAgIC8vIFRoZSBIQUwgY291bGQgZG8gdGhpcyBidXQgYWRkIGl0IGhlcmUsIGp1c3QgaW4gY2FzZS4KLSAgICAgICAgaWYgKChzdXBwb3J0c0FDMyB8fCBzdXBwb3J0c090aGVyU3Vycm91bmQpICYmICFzdXBwb3J0c0lFQzYxOTM3KSB7Ci0gICAgICAgICAgICBmb3JtYXRzLmFkZChBVURJT19GT1JNQVRfSUVDNjE5MzcpOwotICAgICAgICAgICAgc3VwcG9ydHNJRUM2MTkzNyA9IHRydWU7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC01ODc0LDEyICs2MDY4LDEyIEBACiAgICAgICAgICAgICAgICAgbWFza0luZGV4Kys7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAvLyBJZiBBTFdBWVMsIHRoZW4gbWFrZSBzdXJlIHdlIGF0IGxlYXN0IHN1cHBvcnQgNS4xCi0gICAgfSBlbHNlIGlmIChmb3JjZVVzZSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9BTFdBWVMpIHsKKyAgICAvLyBJZiBBTFdBWVMgb3IgTUFOVUFMLCB0aGVuIG1ha2Ugc3VyZSB3ZSBhdCBsZWFzdCBzdXBwb3J0IDUuMQorICAgIH0gZWxzZSBpZiAoZm9yY2VVc2UgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfQUxXQVlTCisgICAgICAgICAgICB8fCBmb3JjZVVzZSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9NQU5VQUwpIHsKICAgICAgICAgYm9vbCBzdXBwb3J0czVkb3QxID0gZmFsc2U7CiAgICAgICAgIC8vIEFyZSB0aGVyZSBhbnkgY2hhbm5lbCBtYXNrcyB0aGF0IGNhbiBiZSBjb25zaWRlcmVkICJzdXJyb3VuZCI/Ci0gICAgICAgIGZvciAoc2l6ZV90IG1hc2tJbmRleCA9IDA7IG1hc2tJbmRleCA8IGNoYW5uZWxNYXNrcy5zaXplKCk7IG1hc2tJbmRleCsrKSB7Ci0gICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrc1ttYXNrSW5kZXhdOworICAgICAgICBmb3IgKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrIDogY2hhbm5lbE1hc2tzKSB7CiAgICAgICAgICAgICBpZiAoKGNoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSkgPT0gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSkgewogICAgICAgICAgICAgICAgIHN1cHBvcnRzNWRvdDEgPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtNTkwMyw3ICs2MDk3LDcgQEAKICAgICBpZiAocHJvZmlsZXMuaGFzRHluYW1pY0Zvcm1hdCgpKSB7CiAgICAgICAgIHJlcGx5ID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMoCiAgICAgICAgICAgICAgICAgaW9IYW5kbGUsIFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZEZvcm1hdHMpKTsKLSAgICAgICAgQUxPR1YoIiVzOiBzdXBwb3J0ZWQgZm9ybWF0cyAlcyIsIF9fRlVOQ1RJT05fXywgcmVwbHkuc3RyaW5nKCkpOworICAgICAgICBBTE9HVigiJXM6IHN1cHBvcnRlZCBmb3JtYXRzICVkLCAlcyIsIF9fRlVOQ1RJT05fXywgaW9IYW5kbGUsIHJlcGx5LnN0cmluZygpKTsKICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcmVwbGllZFBhcmFtZXRlcnMocmVwbHkpOwogICAgICAgICBpZiAocmVwbGllZFBhcmFtZXRlcnMuZ2V0KAogICAgICAgICAgICAgICAgIFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZEZvcm1hdHMpLCByZXBseSkgIT0gTk9fRVJST1IpIHsKQEAgLTU5MTYsMTAgKzYxMTAsOCBAQAogICAgICAgICB9CiAgICAgICAgIHByb2ZpbGVzLnNldEZvcm1hdHMoZm9ybWF0cyk7CiAgICAgfQotICAgIGNvbnN0IEZvcm1hdFZlY3RvciAmc3VwcG9ydGVkRm9ybWF0cyA9IHByb2ZpbGVzLmdldFN1cHBvcnRlZEZvcm1hdHMoKTsKIAotICAgIGZvciAoc2l6ZV90IGZvcm1hdEluZGV4ID0gMDsgZm9ybWF0SW5kZXggPCBzdXBwb3J0ZWRGb3JtYXRzLnNpemUoKTsgZm9ybWF0SW5kZXgrKykgewotICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBzdXBwb3J0ZWRGb3JtYXRzW2Zvcm1hdEluZGV4XTsKKyAgICBmb3IgKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA6IHByb2ZpbGVzLmdldFN1cHBvcnRlZEZvcm1hdHMoKSkgewogICAgICAgICBDaGFubmVsc1ZlY3RvciBjaGFubmVsTWFza3M7CiAgICAgICAgIFNhbXBsZVJhdGVWZWN0b3Igc2FtcGxpbmdSYXRlczsKICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcmVxdWVzdGVkUGFyYW1ldGVyczsKQEAgLTU5NTUsNCArNjE0Nyw0IEBACiAgICAgfQogfQogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuaAppbmRleCA4MmM0YzM1Li5iOTU0NzE0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuaApAQCAtMTYsNiArMTYsMTAgQEAKIAogI3ByYWdtYSBvbmNlCiAKKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisKICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxjdXRpbHMvY29uZmlnX3V0aWxzLmg+CkBAIC0zMSw2ICszNSw3IEBACiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIuaD4KICNpbmNsdWRlIDxBdWRpb0dhaW4uaD4KKyNpbmNsdWRlIDxBdWRpb1BvbGljeUNvbmZpZy5oPgogI2luY2x1ZGUgPEF1ZGlvUG9ydC5oPgogI2luY2x1ZGUgPEF1ZGlvUGF0Y2guaD4KICNpbmNsdWRlIDxEZXZpY2VEZXNjcmlwdG9yLmg+CkBAIC02Myw2ICs2OCwxMCBAQAogLy8gaXMgc3dpdGNoZWQKICNkZWZpbmUgTVVURV9USU1FX01TIDIwMDAKIAorLy8gbXVsdGlwbGljYXRpb24gZmFjdG9yIGFwcGxpZWQgdG8gb3V0cHV0IGxhdGVuY3kgd2hlbiBjYWxjdWxhdGluZyBhIHNhZmUgbXV0ZSBkZWxheSB3aGVuCisvLyBpbnZhbGlkYXRpbmcgdHJhY2tzCisjZGVmaW5lIExBVEVOQ1lfTVVURV9GQUNUT1IgNAorCiAjZGVmaW5lIE5VTV9URVNUX09VVFBVVFMgNQogCiAjZGVmaW5lIE5VTV9WT0xfQ1VSVkVfS05FRVMgMgpAQCAtNzYsMTAgKzg1LDYgQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogY2xhc3MgQXVkaW9Qb2xpY3lNYW5hZ2VyIDogcHVibGljIEF1ZGlvUG9saWN5SW50ZXJmYWNlLCBwdWJsaWMgQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIKLQotI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCi0gICAgLCBwdWJsaWMgVGhyZWFkCi0jZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAogewogCiBwdWJsaWM6CkBAIC0xMDMsMTkgKzEwOCwxNCBAQAogCiAgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRTeXN0ZW1Qcm9wZXJ0eShjb25zdCBjaGFyKiBwcm9wZXJ0eSwgY29uc3QgY2hhciogdmFsdWUpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpOwotICAgICAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKTsKKyAgICAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE91dHB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAqc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgKmZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LApAQCAtMTQwLDYgKzE0MCw3IEBACiAgICAgICAgIC8vIGluZGljYXRlcyB0byB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgdGhhdCB0aGUgaW5wdXQgc3RhcnRzIGJlaW5nIHVzZWQuCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzaWxlbmNlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmN1cnJlbmN5X3R5cGVfX21hc2tfdCAqY29uY3VycmVuY3kpOwogCiAgICAgICAgIC8vIGluZGljYXRlcyB0byB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgdGhhdCB0aGUgaW5wdXQgc3RvcHMgYmVpbmcgdXNlZC4KQEAgLTIzNywxMCArMjM4LDMzIEBACiAgICAgICAgIHZpcnR1YWwgZmxvYXQgICAgZ2V0U3RyZWFtVm9sdW1lREIoCiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgaW5kZXgsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOwogCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3Vycm91bmRGb3JtYXRzKHVuc2lnbmVkIGludCAqbnVtU3Vycm91bmRGb3JtYXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqc3Vycm91bmRGb3JtYXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpzdXJyb3VuZEZvcm1hdHNFbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlcG9ydGVkKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQsIGJvb2wgZW5hYmxlZCk7CisKICAgICAgICAgLy8gcmV0dXJuIHRoZSBzdHJhdGVneSBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4gc3RyZWFtIHR5cGUKICAgICAgICAgcm91dGluZ19zdHJhdGVneSBnZXRTdHJhdGVneShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3Q7CiAKKyAgICAgICAgdmlydHVhbCB2b2lkIHNldFJlY29yZFNpbGVuY2VkKHVpZF90IHVpZCwgYm9vbCBzaWxlbmNlZCk7CisKIHByb3RlY3RlZDoKKyAgICAgICAgLy8gQSBjb25zdHJ1Y3RvciB0aGF0IGFsbG93cyBtb3JlIGZpbmUtZ3JhaW5lZCBjb250cm9sIG92ZXIgaW5pdGlhbGl6YXRpb24gcHJvY2VzcywKKyAgICAgICAgLy8gdXNlZCBpbiBhdXRvbWF0aWMgdGVzdHMuCisgICAgICAgIEF1ZGlvUG9saWN5TWFuYWdlcihBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlLCBib29sIGZvclRlc3RpbmcpOworCisgICAgICAgIC8vIFRoZXNlIG1ldGhvZHMgc2hvdWxkIGJlIHVzZWQgd2hlbiBmaW5lciBjb250cm9sIG92ZXIgQVBNIGluaXRpYWxpemF0aW9uCisgICAgICAgIC8vIGlzIG5lZWRlZCwgZS5nLiBpbiB0ZXN0cy4gTXVzdCBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGNvbnN0cnVjdG9yCisgICAgICAgIC8vIHRoYXQgb25seSBwZXJmb3JtcyBmaWVsZHMgaW5pdGlhbGl6YXRpb24uIFRoZSBwdWJsaWMgY29uc3RydWN0b3IgY29tcHJpc2VzCisgICAgICAgIC8vIHRoZXNlIHN0ZXBzIGluIHRoZSBmb2xsb3dpbmcgc2VxdWVuY2U6CisgICAgICAgIC8vICAgLSBmaWVsZCBpbml0aWFsaXppbmcgY29uc3RydWN0b3I7CisgICAgICAgIC8vICAgLSBsb2FkQ29uZmlnOworICAgICAgICAvLyAgIC0gaW5pdGlhbGl6ZS4KKyAgICAgICAgQXVkaW9Qb2xpY3lDb25maWcmIGdldENvbmZpZygpIHsgcmV0dXJuIG1Db25maWc7IH0KKyAgICAgICAgdm9pZCBsb2FkQ29uZmlnKCk7CisgICAgICAgIHN0YXR1c190IGluaXRpYWxpemUoKTsKKwogICAgICAgICAvLyBGcm9tIEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyCiAgICAgICAgIHZpcnR1YWwgY29uc3QgQXVkaW9QYXRjaENvbGxlY3Rpb24gJmdldEF1ZGlvUGF0Y2hlcygpIGNvbnN0CiAgICAgICAgIHsKQEAgLTI3NSw3ICsyOTksNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gbURlZmF1bHRPdXRwdXREZXZpY2U7CiAgICAgICAgIH0KLXByb3RlY3RlZDoKKwogICAgICAgICB2b2lkIGFkZE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYyk7CiAgICAgICAgIHZvaWQgcmVtb3ZlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CiAgICAgICAgIHZvaWQgYWRkSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsIGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiYgaW5wdXREZXNjKTsKQEAgLTMwNCw3ICszMjgsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWRkcmVzcyA9IE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXF1aXJlc011dGVDaGVjayA9IHRydWUpOwogICAgICAgICBzdGF0dXNfdCByZXNldE91dHB1dERldmljZShjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSA9IE5VTEwpOwpAQCAtNDE5LDExICs0NDQsNiBAQAogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gbUVmZmVjdHMuZ2V0TWF4RWZmZWN0c01lbW9yeSgpOwogICAgICAgICB9Ci0jaWZkZWYgQVVESU9fUE9MSUNZX1RFU1QKLSAgICAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgdGhyZWFkTG9vcCgpOwotICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBleGl0KCk7Ci0gICAgICAgIGludCB0ZXN0T3V0cHV0SW5kZXgoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKLSNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCiAKICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBnZXRPdXRwdXRzRm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiYgb3Blbk91dHB1dHMpOwpAQCAtNDgxLDYgKzUwMSw5IEBACiAgICAgICAgIH0KIAogICAgICAgICB1aW50MzJfdCB1cGRhdGVDYWxsUm91dGluZyhhdWRpb19kZXZpY2VzX3QgcnhEZXZpY2UsIHVpbnQzMl90IGRlbGF5TXMgPSAwKTsKKyAgICAgICAgc3A8QXVkaW9QYXRjaD4gY3JlYXRlVGVsZXBob255UGF0Y2goYm9vbCBpc1J4LCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCB1aW50MzJfdCBkZWxheU1zKTsKKyAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZmlsbEF1ZGlvUG9ydENvbmZpZ0ZvckRldmljZSgKKyAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGRldmljZXMsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOwogCiAgICAgICAgIC8vIGlmIGFyZ3VtZW50ICJkZXZpY2UiIGlzIGRpZmZlcmVudCBmcm9tIEFVRElPX0RFVklDRV9OT05FLCAgc3RhcnRTb3VyY2UoKSB3aWxsIGZvcmNlCiAgICAgICAgIC8vIHRoZSByZS1ldmFsdWF0aW9uIG9mIHRoZSBvdXRwdXQgZGV2aWNlLgpAQCAtNTM0LDE4ICs1NTcsMjAgQEAKICAgICAgICAgU2Vzc2lvblJvdXRlTWFwIG1PdXRwdXRSb3V0ZXMgPSBTZXNzaW9uUm91dGVNYXAoU2Vzc2lvblJvdXRlTWFwOjpNQVBUWVBFX09VVFBVVCk7CiAgICAgICAgIFNlc3Npb25Sb3V0ZU1hcCBtSW5wdXRSb3V0ZXMgPSBTZXNzaW9uUm91dGVNYXAoU2Vzc2lvblJvdXRlTWFwOjpNQVBUWVBFX0lOUFVUKTsKIAotICAgICAgICBJVm9sdW1lQ3VydmVzQ29sbGVjdGlvbiAqbVZvbHVtZUN1cnZlczsgLy8gVm9sdW1lIEN1cnZlcyBwZXIgdXNlIGNhc2UgYW5kIGRldmljZSBjYXRlZ29yeQotCiAgICAgICAgIGJvb2wgICAgbUxpbWl0UmluZ3RvbmVWb2x1bWU7ICAgICAgICAvLyBsaW1pdCByaW5ndG9uZSB2b2x1bWUgdG8gbXVzaWMgdm9sdW1lIGlmIGhlYWRzZXQgY29ubmVjdGVkCiAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBtRGV2aWNlRm9yU3RyYXRlZ3lbTlVNX1NUUkFURUdJRVNdOwogICAgICAgICBmbG9hdCAgIG1MYXN0Vm9pY2VWb2x1bWU7ICAgICAgICAgICAgLy8gbGFzdCB2b2ljZSB2b2x1bWUgdmFsdWUgc2VudCB0byBhdWRpbyBIQUwKLQotICAgICAgICBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbiBtRWZmZWN0czsgIC8vIGxpc3Qgb2YgcmVnaXN0ZXJlZCBhdWRpbyBlZmZlY3RzCiAgICAgICAgIGJvb2wgICAgbUEyZHBTdXNwZW5kZWQ7ICAvLyB0cnVlIGlmIEEyRFAgb3V0cHV0IGlzIHN1c3BlbmRlZAotICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBtRGVmYXVsdE91dHB1dERldmljZTsgLy8gb3V0cHV0IGRldmljZSBzZWxlY3RlZCBieSBkZWZhdWx0IGF0IGJvb3QgdGltZQotICAgICAgICBId01vZHVsZUNvbGxlY3Rpb24gbUh3TW9kdWxlczsKIAotICAgICAgICB2b2xhdGlsZSBpbnQzMl90IG1BdWRpb1BvcnRHZW5lcmF0aW9uOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SVZvbHVtZUN1cnZlc0NvbGxlY3Rpb24+IG1Wb2x1bWVDdXJ2ZXM7IC8vIFZvbHVtZSBDdXJ2ZXMgcGVyIHVzZSBjYXNlIGFuZCBkZXZpY2UgY2F0ZWdvcnkKKyAgICAgICAgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24gbUVmZmVjdHM7ICAvLyBsaXN0IG9mIHJlZ2lzdGVyZWQgYXVkaW8gZWZmZWN0cworICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBtRGVmYXVsdE91dHB1dERldmljZTsgLy8gb3V0cHV0IGRldmljZSBzZWxlY3RlZCBieSBkZWZhdWx0IGF0IGJvb3QgdGltZQorICAgICAgICBId01vZHVsZUNvbGxlY3Rpb24gbUh3TW9kdWxlczsgLy8gY29udGFpbnMgb25seSBtb2R1bGVzIHRoYXQgaGF2ZSBiZWVuIGxvYWRlZCBzdWNjZXNzZnVsbHkKKyAgICAgICAgSHdNb2R1bGVDb2xsZWN0aW9uIG1Id01vZHVsZXNBbGw7IC8vIG5vcm1hbGx5IG5vdCBuZWVkZWQsIHVzZWQgZHVyaW5nIGNvbnN0cnVjdGlvbiBhbmQgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkdW1wcworICAgICAgICBBdWRpb1BvbGljeUNvbmZpZyBtQ29uZmlnOworCisgICAgICAgIHN0ZDo6YXRvbWljPHVpbnQzMl90PiBtQXVkaW9Qb3J0R2VuZXJhdGlvbjsKIAogICAgICAgICBBdWRpb1BhdGNoQ29sbGVjdGlvbiBtQXVkaW9QYXRjaGVzOwogCkBAIC01NzQsMzEgKzU5OSwyMCBAQAogICAgICAgICBBdWRpb1BvbGljeU1peENvbGxlY3Rpb24gbVBvbGljeU1peGVzOyAvLyBsaXN0IG9mIHJlZ2lzdGVyZWQgbWl4ZXMKICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgbU11c2ljRWZmZWN0T3V0cHV0OyAgICAgLy8gb3V0cHV0IHNlbGVjdGVkIGZvciBtdXNpYyBlZmZlY3RzCiAKLQotI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCi0gICAgICAgIE11dGV4ICAgbUxvY2s7Ci0gICAgICAgIENvbmRpdGlvbiBtV2FpdFdvcmtDVjsKLQotICAgICAgICBpbnQgICAgICAgICAgICAgbUN1ck91dHB1dDsKLSAgICAgICAgYm9vbCAgICAgICAgICAgIG1EaXJlY3RPdXRwdXQ7Ci0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG1UZXN0T3V0cHV0c1tOVU1fVEVTVF9PVVRQVVRTXTsKLSAgICAgICAgaW50ICAgICAgICAgICAgIG1UZXN0SW5wdXQ7Ci0gICAgICAgIHVpbnQzMl90ICAgICAgICBtVGVzdERldmljZTsKLSAgICAgICAgdWludDMyX3QgICAgICAgIG1UZXN0U2FtcGxpbmdSYXRlOwotICAgICAgICB1aW50MzJfdCAgICAgICAgbVRlc3RGb3JtYXQ7Ci0gICAgICAgIHVpbnQzMl90ICAgICAgICBtVGVzdENoYW5uZWxzOwotICAgICAgICB1aW50MzJfdCAgICAgICAgbVRlc3RMYXRlbmN5TXM7Ci0jZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAotCiAgICAgICAgIHVpbnQzMl90IG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CiAKICAgICAgICAgLy8gQXVkaW8gUG9saWN5IEVuZ2luZSBJbnRlcmZhY2UuCiAgICAgICAgIEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZSAqbUVuZ2luZTsKKworICAgICAgICAvLyBTdXJyb3VuZCBmb3JtYXRzIHRoYXQgYXJlIGVuYWJsZWQuCisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxhdWRpb19mb3JtYXRfdD4gbVN1cnJvdW5kRm9ybWF0czsKIHByaXZhdGU6CiAgICAgICAgIC8vIEFkZCBvciByZW1vdmUgQUMzIERUUyBlbmNvZGluZ3MgYmFzZWQgb24gdXNlciBwcmVmZXJlbmNlcy4KICAgICAgICAgdm9pZCBmaWx0ZXJTdXJyb3VuZEZvcm1hdHMoRm9ybWF0VmVjdG9yICpmb3JtYXRzUHRyKTsKICAgICAgICAgdm9pZCBmaWx0ZXJTdXJyb3VuZENoYW5uZWxNYXNrcyhDaGFubmVsc1ZlY3RvciAqY2hhbm5lbE1hc2tzUHRyKTsKIAorICAgICAgICBzdGF0dXNfdCBnZXRTdXBwb3J0ZWRGb3JtYXRzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBGb3JtYXRWZWN0b3ImIGZvcm1hdHMpOworCiAgICAgICAgIC8vIElmIGFueSwgcmVzb2x2ZSBhbnkgImR5bmFtaWMiIGZpZWxkcyBvZiBhbiBBdWRpbyBQcm9maWxlcyBjb2xsZWN0aW9uCiAgICAgICAgIHZvaWQgdXBkYXRlQXVkaW9Qcm9maWxlcyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwKICAgICAgICAgICAgICAgICBBdWRpb1Byb2ZpbGVWZWN0b3IgJnByb2ZpbGVzKTsKQEAgLTYzMCwyMCArNjQ0LDE1IEBACiAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyk7CisgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCAqZmxhZ3MpOwogICAgICAgICAvLyBpbnRlcm5hbCBtZXRob2QgdG8gcmV0dXJuIHRoZSBpbnB1dCBoYW5kbGUgZm9yIHRoZSBnaXZlbiBkZXZpY2UgYW5kIGZvcm1hdAogICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBnZXRJbnB1dEZvckRldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcywKICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjb25maWcsCiAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICBBdWRpb01peCAqcG9saWN5TWl4KTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUNsaWVudEltcGwuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUNsaWVudEltcGwuY3BwCmluZGV4IDMxYzk1NzUuLmIwNjRmOGMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAKQEAgLTIzMyw0ICsyMzMsNCBAQAogICAgIHJldHVybiBBdWRpb1N5c3RlbTo6bmV3QXVkaW9VbmlxdWVJZCh1c2UpOwogfQogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuY3BwCmluZGV4IDg0YjEwNzMuLmM3ZGZlMGYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAKQEAgLTM5OSwxMSArMzk5LDEyIEBACiAgICAgICAgIHdoaWxlIChwb3MgKyBzaXplID4gKnRvdFNpemUpIHsKICAgICAgICAgICAgICp0b3RTaXplICs9ICgoKnRvdFNpemUgKyA3KSAvIDgpICogNDsKICAgICAgICAgfQotICAgICAgICAqcGFyYW0gPSAoY2hhciAqKXJlYWxsb2MoKnBhcmFtLCAqdG90U2l6ZSk7Ci0gICAgICAgIGlmICgqcGFyYW0gPT0gTlVMTCkgeworICAgICAgICBjaGFyICpuZXdQYXJhbSA9IChjaGFyICopcmVhbGxvYygqcGFyYW0sICp0b3RTaXplKTsKKyAgICAgICAgaWYgKG5ld1BhcmFtID09IE5VTEwpIHsKICAgICAgICAgICAgIEFMT0dFKCIlcyByZWFsbG9jIGVycm9yIGZvciBzaXplICV6dSIsIF9fZnVuY19fLCAqdG90U2l6ZSk7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQorICAgICAgICAqcGFyYW0gPSBuZXdQYXJhbTsKICAgICB9CiAgICAgKmN1clNpemUgPSBwb3MgKyBzaXplOwogICAgIHJldHVybiBwb3M7CkBAIC03NDQsNCArNzQ1LDQgQEAKIH0KIAogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmgKaW5kZXggNTlkNWQxNC4uNjIzMTgwZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5oCkBAIC0xOTIsNiArMTkyLDYgQEAKICAgICBLZXllZFZlY3RvcjwgYXVkaW9fc2Vzc2lvbl90LCBFZmZlY3RWZWN0b3IqID4gbU91dHB1dFNlc3Npb25zOwogfTsKIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmIC8vIEFORFJPSURfQVVESU9QT0xJQ1lFRkZFQ1RTX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcAppbmRleCBiN2JjZTU1Li43MzM3ZjA0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwCkBAIC0xOCw4ICsxOCwxMSBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFBbmFseXRpY3NJdGVtLmg+CisKICNpbmNsdWRlICJBdWRpb1BvbGljeVNlcnZpY2UuaCIKICNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTQ0LDYgKzQ3LDcgQEAKIAogICAgIEFMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSIpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfYWRkcmVzcywgZGV2aWNlX25hbWUpOwogfQpAQCAtNTUsNiArNTksNyBAQAogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEU7CiAgICAgfQorICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CiAgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfYWRkcmVzcyk7CiB9CkBAIC03Miw2ICs3Nyw3IEBACiAKICAgICBBTE9HVigiaGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKCkiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CiAgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmhhbmRsZURldmljZUNvbmZpZ0NoYW5nZShkZXZpY2UsIGRldmljZV9hZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX25hbWUpOwogfQpAQCAtOTQsMTAgKzEwMCwxMCBAQAogICAgIC8vIG9wZXJhdGlvbiBmcm9tIHBvbGljeSBtYW5hZ2VyIHN0YW5kcG9pbnQgKG5vIG90aGVyIG9wZXJhdGlvbiAoZS5nIHRyYWNrIHN0YXJ0IG9yIHN0b3ApCiAgICAgLy8gY2FuIGJlIGludGVybGVhdmVkKS4KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotCiAgICAgLy8gVE9ETzogY2hlY2sgaWYgaXQgaXMgbW9yZSBhcHByb3ByaWF0ZSB0byBkbyBpdCBpbiBwbGF0Zm9ybSBzcGVjaWZpYyBwb2xpY3kgbWFuYWdlcgogICAgIEF1ZGlvU3lzdGVtOjpzZXRNb2RlKHN0YXRlKTsKIAorICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CiAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0UGhvbmVTdGF0ZShzdGF0ZSk7CiAgICAgbVBob25lU3RhdGUgPSBzdGF0ZTsKICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC0xMTUsOSArMTIxLDExIEBACiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgaWYgKCFzZXR0aW5nc0FsbG93ZWQoKSkgeworCisgICAgaWYgKCFtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCkpIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KKwogICAgIGlmICh1c2FnZSA8IDAgfHwgdXNhZ2UgPj0gQVVESU9fUE9MSUNZX0ZPUkNFX1VTRV9DTlQpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CkBAIC0xMjYsNiArMTM0LDcgQEAKICAgICB9CiAgICAgQUxPR1YoInNldEZvcmNlVXNlKCkiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CiAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0Rm9yY2VVc2UodXNhZ2UsIGNvbmZpZyk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtMTM4LDE1ICsxNDcsMTEgQEAKICAgICBpZiAodXNhZ2UgPCAwIHx8IHVzYWdlID49IEFVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UKSB7CiAgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORTsKICAgICB9CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0Rm9yY2VVc2UodXNhZ2UpOwogfQogCi1hdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKIHsKICAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fUFVCTElDX0NOVCkgewogICAgICAgICByZXR1cm4gQVVESU9fSU9fSEFORExFX05PTkU7CkBAIC0xNTYsMTQgKzE2MSwxNSBAQAogICAgIH0KICAgICBBTE9HVigiZ2V0T3V0cHV0KCkiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRPdXRwdXQoc3RyZWFtLCBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmbGFncywgb2ZmbG9hZEluZm8pOworICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldE91dHB1dChzdHJlYW0pOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldE91dHB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKQEAgLTE3Myw3ICsxNzksNyBAQAogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIEFMT0dWKCJnZXRPdXRwdXQoKSIpOworICAgIEFMT0dWKCJnZXRPdXRwdXRGb3JBdHRyKCkiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCiAgICAgY29uc3QgdWlkX3QgY2FsbGluZ1VpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKQEAgLTE4Miw5ICsxODgsMjcgQEAKICAgICAgICAgICAgICAgICAiJXMgdWlkICVkIHRyaWVkIHRvIHBhc3MgaXRzZWxmIG9mZiBhcyAlZCIsIF9fRlVOQ1RJT05fXywgY2FsbGluZ1VpZCwgdWlkKTsKICAgICAgICAgdWlkID0gY2FsbGluZ1VpZDsKICAgICB9Ci0gICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldE91dHB1dEZvckF0dHIoYXR0ciwgb3V0cHV0LCBzZXNzaW9uLCBzdHJlYW0sIHVpZCwKKyAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBvcmlnaW5hbEZsYWdzID0gZmxhZ3M7CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRPdXRwdXRGb3JBdHRyKGF0dHIsIG91dHB1dCwgc2Vzc2lvbiwgc3RyZWFtLCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBzZWxlY3RlZERldmljZUlkLCBwb3J0SWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywgc2VsZWN0ZWREZXZpY2VJZCwgcG9ydElkKTsKKworICAgIC8vIEZJWE1FOiBJbnRyb2R1Y2UgYSB3YXkgdG8gY2hlY2sgZm9yIHRoZSB0aGUgdGVsZXBob255IGRldmljZSBiZWZvcmUgb3BlbmluZyB0aGUgb3V0cHV0CisgICAgaWYgKChyZXN1bHQgPT0gTk9fRVJST1IpICYmCisgICAgICAgIChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0lOQ0FMTF9NVVNJQykgJiYKKyAgICAgICAgIW1vZGlmeVBob25lU3RhdGVBbGxvd2VkKHBpZCwgdWlkKSkgeworICAgICAgICAvLyBJZiB0aGUgYXBwIHRyaWVzIHRvIHBsYXkgbXVzaWMgdGhyb3VnaCB0aGUgdGVsZXBob255IGRldmljZSBhbmQgZG9lc24ndCBoYXZlIHBlcm1pc3Npb24KKyAgICAgICAgLy8gdGhlIGZhbGxiYWNrIHRvIHRoZSBkZWZhdWx0IG91dHB1dCBkZXZpY2UuCisgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VPdXRwdXQoKm91dHB1dCwgKnN0cmVhbSwgc2Vzc2lvbik7CisgICAgICAgIGZsYWdzID0gb3JpZ2luYWxGbGFnczsKKyAgICAgICAgKnNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgICAgICAqcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICAgICAgcmVzdWx0ID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0T3V0cHV0Rm9yQXR0cihhdHRyLCBvdXRwdXQsIHNlc3Npb24sIHN0cmVhbSwgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsIHNlbGVjdGVkRGV2aWNlSWQsIHBvcnRJZCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LApAQCAtMjExLDYgKzIzNSw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwogICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdGFydE91dHB1dChvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CiB9CiAKQEAgLTI0Nyw2ICsyNzIsNyBAQAogICAgICAgICB9CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RvcE91dHB1dChvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CiB9CiAKQEAgLTI2Nyw2ICsyOTMsNyBAQAogewogICAgIEFMT0dWKCJkb1JlbGVhc2VPdXRwdXQgZnJvbSB0aWQgJWQiLCBnZXR0aWQoKSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAvLyBjYWxsZWQgZnJvbSBpbnRlcm5hbCB0aHJlYWQ6IG5vIG5lZWQgdG8gY2xlYXIgY2FsbGVyIGlkZW50aXR5CiAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVsZWFzZU91dHB1dChvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CiB9CiAKQEAgLTI3NSw2ICszMDIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLApAQCAtMjgzLDkgKzMxMSwxMCBAQAogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQorCiAgICAgLy8gYWxyZWFkeSBjaGVja2VkIGJ5IGNsaWVudCwgYnV0IGRvdWJsZS1jaGVjayBpbiBjYXNlIHRoZSBjbGllbnQgd3JhcHBlciBpcyBieXBhc3NlZAotICAgIGlmIChhdHRyLT5zb3VyY2UgPj0gQVVESU9fU09VUkNFX0NOVCAmJiBhdHRyLT5zb3VyY2UgIT0gQVVESU9fU09VUkNFX0hPVFdPUkQgJiYKLSAgICAgICAgYXR0ci0+c291cmNlICE9IEFVRElPX1NPVVJDRV9GTV9UVU5FUikgeworICAgIGlmIChhdHRyLT5zb3VyY2UgPCBBVURJT19TT1VSQ0VfREVGQVVMVCAmJiBhdHRyLT5zb3VyY2UgPj0gQVVESU9fU09VUkNFX0NOVCAmJgorICAgICAgICAgICAgYXR0ci0+c291cmNlICE9IEFVRElPX1NPVVJDRV9IT1RXT1JEICYmIGF0dHItPnNvdXJjZSAhPSBBVURJT19TT1VSQ0VfRk1fVFVORVIpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKQEAgLTMwNiw2ICszMzUsMjAgQEAKICAgICAgICAgcGlkID0gY2FsbGluZ1BpZDsKICAgICB9CiAKKyAgICAvLyBjaGVjayBjYWxsaW5nIHBlcm1pc3Npb25zCisgICAgaWYgKCFyZWNvcmRpbmdBbGxvd2VkKG9wUGFja2FnZU5hbWUsIHBpZCwgdWlkKSkgeworICAgICAgICBBTE9HRSgiJXMgcGVybWlzc2lvbiBkZW5pZWQ6IHJlY29yZGluZyBub3QgYWxsb3dlZCBmb3IgdWlkICVkIHBpZCAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIHVpZCwgcGlkKTsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIGlmICgoYXR0ci0+c291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9VUExJTksgfHwKKyAgICAgICAgYXR0ci0+c291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9ET1dOTElOSyB8fAorICAgICAgICBhdHRyLT5zb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX0NBTEwpICYmCisgICAgICAgICFjYXB0dXJlQXVkaW9PdXRwdXRBbGxvd2VkKHBpZCwgdWlkKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCiAgICAgaWYgKChhdHRyLT5zb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpICYmICFjYXB0dXJlSG90d29yZEFsbG93ZWQocGlkLCB1aWQpKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQpAQCAtMzE2LDExICszNTksMTQgQEAKICAgICAgICAgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OmlucHV0X3R5cGVfdCBpbnB1dFR5cGU7CiAKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgLy8gdGhlIGF1ZGlvX2luX2Fjb3VzdGljc190IHBhcmFtZXRlciBpcyBpZ25vcmVkIGJ5IGdldF9pbnB1dCgpCi0gICAgICAgIHN0YXR1cyA9IG1BdWRpb1BvbGljeU1hbmFnZXItPmdldElucHV0Rm9yQXR0cihhdHRyLCBpbnB1dCwgc2Vzc2lvbiwgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBzZWxlY3RlZERldmljZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXRUeXBlLCBwb3J0SWQpOworICAgICAgICB7CisgICAgICAgICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOworICAgICAgICAgICAgLy8gdGhlIGF1ZGlvX2luX2Fjb3VzdGljc190IHBhcmFtZXRlciBpcyBpZ25vcmVkIGJ5IGdldF9pbnB1dCgpCisgICAgICAgICAgICBzdGF0dXMgPSBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRJbnB1dEZvckF0dHIoYXR0ciwgaW5wdXQsIHNlc3Npb24sIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBzZWxlY3RlZERldmljZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0VHlwZSwgcG9ydElkKTsKKyAgICAgICAgfQogICAgICAgICBhdWRpb1BvbGljeUVmZmVjdHMgPSBtQXVkaW9Qb2xpY3lFZmZlY3RzOwogCiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKQEAgLTM1MSwxMCArMzk3LDE5IEBACiAKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBQRVJNSVNTSU9OX0RFTklFRCkgeworICAgICAgICAgICAgICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CiAgICAgICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVsZWFzZUlucHV0KCppbnB1dCwgc2Vzc2lvbik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgICAgICB9CisKKyAgICAgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IGNsaWVudCA9CisgICAgICAgICAgICAgICAgbmV3IEF1ZGlvUmVjb3JkQ2xpZW50KCphdHRyLCAqaW5wdXQsIHVpZCwgcGlkLCBvcFBhY2thZ2VOYW1lLCBzZXNzaW9uKTsKKyAgICAgICAgY2xpZW50LT5hY3RpdmUgPSBmYWxzZTsKKyAgICAgICAgY2xpZW50LT5pc0NvbmN1cnJlbnQgPSBmYWxzZTsKKyAgICAgICAgY2xpZW50LT5pc1ZpcnR1YWxEZXZpY2UgPSBmYWxzZTsgLy9UT0RPIDogdXBkYXRlIGZyb20gQVBNLT5nZXRJbnB1dEZvckF0dHIoKQorICAgICAgICBjbGllbnQtPmRldmljZUlkID0gKnNlbGVjdGVkRGV2aWNlSWQ7CisgICAgICAgIG1BdWRpb1JlY29yZENsaWVudHMuYWRkKCpwb3J0SWQsIGNsaWVudCk7CiAgICAgfQogCiAgICAgaWYgKGF1ZGlvUG9saWN5RWZmZWN0cyAhPSAwKSB7CkBAIC0zNjcsMTUgKzQyMiwxNDcgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKKy8vIHRoaXMgaXMgcmVwbGljYXRlZCBmcm9tIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9SZWNvcmQuY3BwCisvLyBYWFggLS0gZmlndXJlIG91dCBob3cgdG8gcHV0IGl0IGludG8gYSBjb21tb24sIHNoYXJlZCBsb2NhdGlvbgorCitzdGF0aWMgc3RkOjpzdHJpbmcgYXVkaW9Tb3VyY2VTdHJpbmcoYXVkaW9fc291cmNlX3QgdmFsdWUpIHsKKyAgICBzdGQ6OnN0cmluZyBzb3VyY2U7CisgICAgaWYgKFNvdXJjZVR5cGVDb252ZXJ0ZXI6OnRvU3RyaW5nKHZhbHVlLCBzb3VyY2UpKSB7CisgICAgICAgIHJldHVybiBzb3VyY2U7CisgICAgfQorICAgIGNoYXIgcmF3YnVmZmVyWzE2XTsgIC8vIHJvb20gZm9yICIlZCIKKyAgICBzbnByaW50ZihyYXdidWZmZXIsIHNpemVvZihyYXdidWZmZXIpLCAiJWQiLCB2YWx1ZSk7CisgICAgcmV0dXJuIHJhd2J1ZmZlcjsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIGF1ZGlvQ29uY3VycmVuY3lTdHJpbmcoCisgICAgICAgIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpjb25jdXJyZW5jeV90eXBlX19tYXNrX3QgY29uY3VycmVuY3kpCit7CisgICAgY2hhciBidWZmZXJbNjRdOyAvLyBvdmVyc2l6ZWQKKyAgICBpZiAoY29uY3VycmVuY3kgJiBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX0NPTkNVUlJFTkNZX0FMTCkgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiJXMlcyVzJXMiLAorICAgICAgICAgICAgKGNvbmN1cnJlbmN5ICYgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9DT05DVVJSRU5DWV9DQUxMKT8gIixjYWxsIjoiIiwKKyAgICAgICAgICAgIChjb25jdXJyZW5jeSAmIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfQ0FQVFVSRSk/ICIsY2FwdHVyZSI6IiIsCisgICAgICAgICAgICAoY29uY3VycmVuY3kgJiBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX0NPTkNVUlJFTkNZX0hPVFdPUkQpPyAiLGhvdHdvcmQiOiIiLAorICAgICAgICAgICAgKGNvbmN1cnJlbmN5ICYgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9DT05DVVJSRU5DWV9QUkVFTVBUKT8gIixwcmVlbXB0IjoiIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIixub25lIik7CisgICAgfQorCisgICAgcmV0dXJuICZidWZmZXJbMV07Cit9CisKK3N0ZDo6c3RyaW5nIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGV2aWNlVHlwZVN0ckZvclBvcnRJZChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgeworICAgIHN0ZDo6c3RyaW5nIHR5cGVTdHI7CisgICAgc3RydWN0IGF1ZGlvX3BvcnQgcG9ydCA9IHt9OworICAgIHBvcnQuaWQgPSBwb3J0SWQ7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0QXVkaW9Qb3J0KCZwb3J0KTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIHBvcnQudHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgICAgIGRldmljZVRvU3RyaW5nKHBvcnQuZXh0LmRldmljZS50eXBlLCB0eXBlU3RyKTsKKyAgICB9CisgICAgcmV0dXJuIHR5cGVTdHI7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwgYm9vbCAqc2lsZW5jZWQpCiB7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CisgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IGNsaWVudDsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICAgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1JlY29yZENsaWVudHMuaW5kZXhPZktleShwb3J0SWQpOworICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgY2xpZW50ID0gbUF1ZGlvUmVjb3JkQ2xpZW50cy52YWx1ZUF0KGluZGV4KTsKKyAgICB9CisKKyAgICAvLyBjaGVjayBjYWxsaW5nIHBlcm1pc3Npb25zCisgICAgaWYgKCFzdGFydFJlY29yZGluZyhjbGllbnQtPm9wUGFja2FnZU5hbWUsIGNsaWVudC0+cGlkLCBjbGllbnQtPnVpZCkpIHsKKyAgICAgICAgQUxPR0UoIiVzIHBlcm1pc3Npb24gZGVuaWVkOiByZWNvcmRpbmcgbm90IGFsbG93ZWQgZm9yIHVpZCAlZCBwaWQgJWQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjbGllbnQtPnVpZCwgY2xpZW50LT5waWQpOworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgLy8gSWYgVUlEIGluYWN0aXZlIGl0IHJlY29yZHMgc2lsZW5jZSB1bnRpbCBiZWNvbWluZyBhY3RpdmUKKyAgICAqc2lsZW5jZWQgPSAhbVVpZFBvbGljeS0+aXNVaWRBY3RpdmUoY2xpZW50LT51aWQpICYmICFjbGllbnQtPmlzVmlydHVhbERldmljZTsKKwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OmNvbmN1cnJlbmN5X3R5cGVfX21hc2tfdCBjb25jdXJyZW5jeTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdGFydElucHV0KGlucHV0LCBzZXNzaW9uLCAmY29uY3VycmVuY3kpOworICAgIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpjb25jdXJyZW5jeV90eXBlX19tYXNrX3QgY29uY3VycmVuY3kgPQorICAgICAgICAgICAgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9DT05DVVJSRU5DWV9OT05FOworCisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIHsKKyAgICAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKKyAgICAgICAgc3RhdHVzID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RhcnRJbnB1dCgKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50LT5pbnB1dCwgY2xpZW50LT5zZXNzaW9uLCAqc2lsZW5jZWQsICZjb25jdXJyZW5jeSk7CisKKyAgICB9CisKKyAgICAvLyBpbmNsdWRpbmcgc3VjY2Vzc2VzIGdldHMgdmVyeSB2ZXJib3NlCisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9Qb2xpY3lbXSA9ICJhdWRpb3BvbGljeSI7CisKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1BvbGljeVJlYXNvbltdID0gImFuZHJvaWQubWVkaWEuYXVkaW9wb2xpY3kucmVhc29uIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1BvbGljeVN0YXR1c1tdID0gImFuZHJvaWQubWVkaWEuYXVkaW9wb2xpY3kuc3RhdHVzIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1BvbGljeVJxc3RTcmNbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvcG9saWN5LnJxc3Quc3JjIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1BvbGljeVJxc3RQa2dbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvcG9saWN5LnJxc3QucGtnIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1BvbGljeVJxc3RTZXNzaW9uW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3BvbGljeS5ycXN0LnNlc3Npb24iOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvUG9saWN5UnFzdERldmljZVtdID0KKyAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5hdWRpb3BvbGljeS5ycXN0LmRldmljZSI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9Qb2xpY3lBY3RpdmVTcmNbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvcG9saWN5LmFjdGl2ZS5zcmMiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvUG9saWN5QWN0aXZlUGtnW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3BvbGljeS5hY3RpdmUucGtnIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1BvbGljeUFjdGl2ZVNlc3Npb25bXSA9CisgICAgICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuYXVkaW9wb2xpY3kuYWN0aXZlLnNlc3Npb24iOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvUG9saWN5QWN0aXZlRGV2aWNlW10gPQorICAgICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmF1ZGlvcG9saWN5LmFjdGl2ZS5kZXZpY2UiOworCisgICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IG5ldyBNZWRpYUFuYWx5dGljc0l0ZW0oa0F1ZGlvUG9saWN5KTsKKyAgICAgICAgaWYgKGl0ZW0gIT0gTlVMTCkgeworCisgICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1BvbGljeVJlYXNvbiwgYXVkaW9Db25jdXJyZW5jeVN0cmluZyhjb25jdXJyZW5jeSkuY19zdHIoKSk7CisgICAgICAgICAgICBpdGVtLT5zZXRJbnQzMihrQXVkaW9Qb2xpY3lTdGF0dXMsIHN0YXR1cyk7CisKKyAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUG9saWN5UnFzdFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Tb3VyY2VTdHJpbmcoY2xpZW50LT5hdHRyaWJ1dGVzLnNvdXJjZSkuY19zdHIoKSk7CisgICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1BvbGljeVJxc3RQa2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKFN0cmluZzgoY2xpZW50LT5vcFBhY2thZ2VOYW1lKS5zdHJpbmcoKSkuY19zdHIoKSk7CisgICAgICAgICAgICBpdGVtLT5zZXRJbnQzMihrQXVkaW9Qb2xpY3lScXN0U2Vzc2lvbiwgY2xpZW50LT5zZXNzaW9uKTsKKworICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZygKKyAgICAgICAgICAgICAgICAgICAga0F1ZGlvUG9saWN5UnFzdERldmljZSwgZ2V0RGV2aWNlVHlwZVN0ckZvclBvcnRJZChjbGllbnQtPmRldmljZUlkKS5jX3N0cigpKTsKKworICAgICAgICAgICAgLy8gZmlndXJlIG91dCB3aG8gaXMgYWN0aXZlCisgICAgICAgICAgICAvLyBOQjogbWlnaHQgdGhlIG90aGVyIHBhcnR5IGhhdmUgZ2l2ZW4gdXAgdGhlIG1pY3JvcGhvbmUgc2luY2UgdGhlbj8gaG93IHN1cmUuCisgICAgICAgICAgICAvLyBwZXJoYXBzIGNvdWxkIGhhdmUgZ2l2ZW4gdXAgb24gaXQuCisgICAgICAgICAgICAvLyB3ZSBob2xkIG1Mb2NrLCBzbyBwZXJoYXBzIHdlJ3JlIHNhZmUgZm9yIHRoaXMgbG9vcGluZworICAgICAgICAgICAgaWYgKGNvbmN1cnJlbmN5ICE9IEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfTk9ORSkgeworICAgICAgICAgICAgICAgIGludCBjb3VudCA9IG1BdWRpb1JlY29yZENsaWVudHMuc2l6ZSgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpPGNvdW50IDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwb3J0SWQgPT0gbUF1ZGlvUmVjb3JkQ2xpZW50cy5rZXlBdChpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IG90aGVyID0gbUF1ZGlvUmVjb3JkQ2xpZW50cy52YWx1ZUF0KGkpOworICAgICAgICAgICAgICAgICAgICBpZiAob3RoZXItPmFjdGl2ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2VlcHMgdGhlIGxhc3Qgb2YgdGhlIGNsaWVudHMgbWFya2VkIGFjdGl2ZQorICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9Qb2xpY3lBY3RpdmVTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvU291cmNlU3RyaW5nKG90aGVyLT5hdHRyaWJ1dGVzLnNvdXJjZSkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1BvbGljeUFjdGl2ZVBrZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyhTdHJpbmc4KG90aGVyLT5vcFBhY2thZ2VOYW1lKS5zdHJpbmcoKSkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5zZXRJbnQzMihrQXVkaW9Qb2xpY3lBY3RpdmVTZXNzaW9uLCBvdGhlci0+c2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1BvbGljeUFjdGl2ZURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlVHlwZVN0ckZvclBvcnRJZChvdGhlci0+ZGV2aWNlSWQpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaXRlbS0+c2VsZnJlY29yZCgpOworICAgICAgICAgICAgZGVsZXRlIGl0ZW07CisgICAgICAgICAgICBpdGVtID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KIAogICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihjb25jdXJyZW5jeSAmIH5BdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX0NPTkNVUlJFTkNZX0FMTCwKQEAgLTM4OCw0MyArNTc1LDY3IEBACiAgICAgICAgIGlmIChjb25jdXJyZW5jeSAmIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfQ0FQVFVSRSkgewogICAgICAgICAgICAgLy9UT0RPOiBjaGVjayBjb25jdXJyZW50IGNhcHR1cmUgcGVybWlzc2lvbgogICAgICAgICB9CisKKyAgICAgICAgY2xpZW50LT5hY3RpdmUgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIGZpbmlzaFJlY29yZGluZyhjbGllbnQtPm9wUGFja2FnZU5hbWUsIGNsaWVudC0+dWlkKTsKICAgICB9CiAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdG9wSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdG9wSW5wdXQoaW5wdXQsIHNlc3Npb24pOworICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9SZWNvcmRDbGllbnRzLmluZGV4T2ZLZXkocG9ydElkKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IGNsaWVudCA9IG1BdWRpb1JlY29yZENsaWVudHMudmFsdWVBdChpbmRleCk7CisKKyAgICBjbGllbnQtPmFjdGl2ZSA9IGZhbHNlOworCisgICAgLy8gZmluaXNoIHRoZSByZWNvcmRpbmcgYXBwIG9wCisgICAgZmluaXNoUmVjb3JkaW5nKGNsaWVudC0+b3BQYWNrYWdlTmFtZSwgY2xpZW50LT51aWQpOworICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnN0b3BJbnB1dChjbGllbnQtPmlucHV0LCBjbGllbnQtPnNlc3Npb24pOwogfQogCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6cmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWxlYXNlSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CisgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IGNsaWVudDsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgICAgIGF1ZGlvUG9saWN5RWZmZWN0cyA9IG1BdWRpb1BvbGljeUVmZmVjdHM7CisgICAgICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9SZWNvcmRDbGllbnRzLmluZGV4T2ZLZXkocG9ydElkKTsKKyAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNsaWVudCA9IG1BdWRpb1JlY29yZENsaWVudHMudmFsdWVBdChpbmRleCk7CisgICAgICAgIG1BdWRpb1JlY29yZENsaWVudHMucmVtb3ZlSXRlbShwb3J0SWQpOworICAgIH0KKyAgICBpZiAoY2xpZW50ID09IDApIHsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBpZiAoYXVkaW9Qb2xpY3lFZmZlY3RzICE9IDApIHsKICAgICAgICAgLy8gcmVsZWFzZSBhdWRpbyBwcm9jZXNzb3JzIGZyb20gdGhlIGlucHV0Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9saWN5RWZmZWN0cy0+cmVsZWFzZUlucHV0RWZmZWN0cyhpbnB1dCwgc2Vzc2lvbik7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9saWN5RWZmZWN0cy0+cmVsZWFzZUlucHV0RWZmZWN0cyhjbGllbnQtPmlucHV0LCBjbGllbnQtPnNlc3Npb24pOwogICAgICAgICBpZihzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gcmVsZWFzZSBlZmZlY3RzIG9uIGlucHV0ICVkIiwgaW5wdXQpOworICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byByZWxlYXNlIGVmZmVjdHMgb24gaW5wdXQgJWQiLCBjbGllbnQtPmlucHV0KTsKICAgICAgICAgfQogICAgIH0KICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VJbnB1dChpbnB1dCwgc2Vzc2lvbik7CisgICAgICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CisgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VJbnB1dChjbGllbnQtPmlucHV0LCBjbGllbnQtPnNlc3Npb24pOwogICAgIH0KIH0KIApAQCAtNDQyLDYgKzY1Myw3IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5pbml0U3RyZWFtVm9sdW1lKHN0cmVhbSwgaW5kZXhNaW4sIGluZGV4TWF4KTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC00NjAsNiArNjcyLDcgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwogICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zZXRTdHJlYW1Wb2x1bWVJbmRleChzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKTsKQEAgLTQ3Niw2ICs2ODksNyBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CiAgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldFN0cmVhbVZvbHVtZUluZGV4KHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpOwpAQCAtNDg5LDYgKzcwMyw3IEBACiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gMDsKICAgICB9CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oc3RyZWFtKTsKIH0KIApAQCAtNTAzLDYgKzcxOCw3IEBACiAgICAgICAgIHJldHVybiBBVURJT19ERVZJQ0VfTk9ORTsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwogICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXREZXZpY2VzRm9yU3RyZWFtKHN0cmVhbSk7CiB9CiAKQEAgLTUxMyw2ICs3MjksNyBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwogICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRPdXRwdXRGb3JFZmZlY3QoZGVzYyk7CiB9CiAKQEAgLTUyNiw2ICs3NDMsNyBAQAogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1FZmZlY3RzTG9jayk7CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVnaXN0ZXJFZmZlY3QoZGVzYywgaW8sIHN0cmF0ZWd5LCBzZXNzaW9uLCBpZCk7CiB9CiAKQEAgLTUzNSw2ICs3NTMsNyBAQAogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1FZmZlY3RzTG9jayk7CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+dW5yZWdpc3RlckVmZmVjdChpZCk7CiB9CiAKQEAgLTU0NCw2ICs3NjMsNyBAQAogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1FZmZlY3RzTG9jayk7CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0RWZmZWN0RW5hYmxlZChpZCwgZW5hYmxlZCk7CiB9CiAKQEAgLTU1Niw2ICs3NzYsNyBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+aXNTdHJlYW1BY3RpdmUoc3RyZWFtLCBpblBhc3RNcyk7CiB9CiAKQEAgLTU2OCw2ICs3ODksNyBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+aXNTdHJlYW1BY3RpdmVSZW1vdGVseShzdHJlYW0sIGluUGFzdE1zKTsKIH0KIApAQCAtNTc3LDYgKzc5OSw3IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwogICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5pc1NvdXJjZUFjdGl2ZShzb3VyY2UpOwogfQogCkBAIC02MTAsNiArODMzLDcgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIE11dGV4OjpBdXRvbG9jayBfbGUobUVmZmVjdHNMb2NrKTsgLy8gaXNPZmZsb2FkU3VwcG9ydGVkIHF1ZXJpZXMgZm9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vbi1vZmZsb2FkYWJsZSBlZmZlY3RzCisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+aXNPZmZsb2FkU3VwcG9ydGVkKGluZm8pOwogfQogCkBAIC02MjMsNyArODQ3LDcgQEAKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLQorICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CiAgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmxpc3RBdWRpb1BvcnRzKHJvbGUsIHR5cGUsIG51bV9wb3J0cywgcG9ydHMsIGdlbmVyYXRpb24pOwogfQogCkBAIC02MzMsNyArODU3LDcgQEAKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLQorICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CiAgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldEF1ZGlvUG9ydChwb3J0KTsKIH0KIApAQCAtNjQ3LDYgKzg3MSw3IEBACiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Y3JlYXRlQXVkaW9QYXRjaChwYXRjaCwgaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpOwogfQpAQCAtNjYwLDcgKzg4NSw3IEBACiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0KKyAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwogICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlQXVkaW9QYXRjaChoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7CiB9CkBAIC02NzMsNyArODk4LDcgQEAKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLQorICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CiAgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmxpc3RBdWRpb1BhdGNoZXMobnVtX3BhdGNoZXMsIHBhdGNoZXMsIGdlbmVyYXRpb24pOwogfQogCkBAIC02ODYsNyArOTExLDcgQEAKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLQorICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CiAgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldEF1ZGlvUG9ydENvbmZpZyhjb25maWcpOwogfQogCkBAIC02OTgsNyArOTIzLDcgQEAKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLQorICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CiAgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKHNlc3Npb24sIGlvSGFuZGxlLCBkZXZpY2UpOwogfQogCkBAIC03MDgsNyArOTMzLDcgQEAKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLQorICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CiAgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VTb3VuZFRyaWdnZXJTZXNzaW9uKHNlc3Npb24pOwogfQogCkBAIC03MjEsNiArOTQ2LDcgQEAKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KKyAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwogICAgIGlmIChyZWdpc3RyYXRpb24pIHsKICAgICAgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlZ2lzdGVyUG9saWN5TWl4ZXMobWl4ZXMpOwogICAgIH0gZWxzZSB7CkBAIC03MzYsNyArOTYyLDcgQEAKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLQorICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CiAgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnN0YXJ0QXVkaW9Tb3VyY2Uoc291cmNlLCBhdHRyaWJ1dGVzLCBoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKTsKIH0KQEAgLTc0Nyw3ICs5NzMsNyBAQAogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotCisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RvcEF1ZGlvU291cmNlKGhhbmRsZSk7CiB9CiAKQEAgLTc2MCw2ICs5ODYsNyBAQAogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0TWFzdGVyTW9ubyhtb25vKTsKIH0KIApAQCAtNzY5LDYgKzk5Niw3IEBACiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CiAgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldE1hc3Rlck1vbm8obW9ubyk7CiB9CiAKQEAgLTc4MCw4ICsxMDA4LDMyIEBACiAgICAgICAgIHJldHVybiBOQU47CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0U3RyZWFtVm9sdW1lREIoc3RyZWFtLCBpbmRleCwgZGV2aWNlKTsKIH0KIAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRTdXJyb3VuZEZvcm1hdHModW5zaWduZWQgaW50ICpudW1TdXJyb3VuZEZvcm1hdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqc3Vycm91bmRGb3JtYXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqc3Vycm91bmRGb3JtYXRzRW5hYmxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVwb3J0ZWQpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRTdXJyb3VuZEZvcm1hdHMobnVtU3Vycm91bmRGb3JtYXRzLCBzdXJyb3VuZEZvcm1hdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJyb3VuZEZvcm1hdHNFbmFibGVkLCByZXBvcnRlZCk7Cit9CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCwgYm9vbCBlbmFibGVkKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKGF1ZGlvRm9ybWF0LCBlbmFibGVkKTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwCmluZGV4IGI0MTc2MzEuLmYzY2RkYzMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5jcHAKQEAgLTI2LDggKzI2LDEyIEBACiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8Y3V0aWxzL211bHRpdXNlci5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8YmluZGVyL0FjdGl2aXR5TWFuYWdlci5oPgorI2luY2x1ZGUgPGJpbmRlci9QZXJtaXNzaW9uQ29udHJvbGxlci5oPgorI2luY2x1ZGUgPGJpbmRlci9JUmVzdWx0UmVjZWl2ZXIuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KICNpbmNsdWRlICJBdWRpb1BvbGljeVNlcnZpY2UuaCIKQEAgLTM5LDYgKzQzLDggQEAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+CiAKKyNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdGF0aWMgY29uc3QgY2hhciBrRGVhZGxvY2tlZFN0cmluZ1tdID0gIkF1ZGlvUG9saWN5U2VydmljZSBtYXkgYmUgZGVhZGxvY2tlZFxuIjsKQEAgLTQ5LDYgKzU1LDcgQEAKIAogc3RhdGljIGNvbnN0IG5zZWNzX3Qga0F1ZGlvQ29tbWFuZFRpbWVvdXROcyA9IHNlY29uZHMoMyk7IC8vIDMgc2Vjb25kcwogCitzdGF0aWMgY29uc3QgU3RyaW5nMTYgc01hbmFnZUF1ZGlvUG9saWN5UGVybWlzc2lvbigiYW5kcm9pZC5wZXJtaXNzaW9uLk1BTkFHRV9BVURJT19QT0xJQ1kiKTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC03OSw2ICs4Niw5IEBACiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgICAgIG1BdWRpb1BvbGljeUVmZmVjdHMgPSBhdWRpb1BvbGljeUVmZmVjdHM7CiAgICAgfQorCisgICAgbVVpZFBvbGljeSA9IG5ldyBVaWRQb2xpY3kodGhpcyk7CisgICAgbVVpZFBvbGljeS0+cmVnaXN0ZXJTZWxmKCk7CiB9CiAKIEF1ZGlvUG9saWN5U2VydmljZTo6fkF1ZGlvUG9saWN5U2VydmljZSgpCkBAIC05Miw2ICsxMDIsOSBAQAogCiAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMuY2xlYXIoKTsKICAgICBtQXVkaW9Qb2xpY3lFZmZlY3RzLmNsZWFyKCk7CisKKyAgICBtVWlkUG9saWN5LT51bnJlZ2lzdGVyU2VsZigpOworICAgIG1VaWRQb2xpY3kuY2xlYXIoKTsKIH0KIAogLy8gQSBub3RpZmljYXRpb24gY2xpZW50IGlzIGFsd2F5cyByZWdpc3RlcmVkIGJ5IEF1ZGlvU3lzdGVtIHdoZW4gdGhlIGNsaWVudCBwcm9jZXNzCkBAIC0xMzksNiArMTUyLDcgQEAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyKSB7CisgICAgICAgICAgICAvLyBjYWxsZWQgZnJvbSBiaW5kZXIgZGVhdGggbm90aWZpY2F0aW9uOiBubyBuZWVkIHRvIGNsZWFyIGNhbGxlciBpZGVudGl0eQogICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVsZWFzZVJlc291cmNlc0ZvclVpZCh1aWQpOwogICAgICAgICB9CiAgICAgfQpAQCAtMjYxLDcgKzI3NSw3IEBACiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6Tm90aWZpY2F0aW9uQ2xpZW50OjpvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZSgKICAgICAgICAgY29uc3QgU3RyaW5nOCYgcmVnSWQsIGludDMyX3Qgc3RhdGUpCiB7Ci0gICAgaWYgKG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgIT0gMCkgeworICAgIGlmIChtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50ICE9IDAgJiYgbXVsdGl1c2VyX2dldF9hcHBfaWQobVVpZCkgPCBBSURfQVBQX1NUQVJUKSB7CiAgICAgICAgIG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQtPm9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKHJlZ0lkLCBzdGF0ZSk7CiAgICAgfQogfQpAQCAtMjcxLDcgKzI4NSw3IEBACiAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAogICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkKIHsKLSAgICBpZiAobUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCAhPSAwKSB7CisgICAgaWYgKG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgIT0gMCAmJiBtdWx0aXVzZXJfZ2V0X2FwcF9pZChtVWlkKSA8IEFJRF9BUFBfU1RBUlQpIHsKICAgICAgICAgbUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC0+b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGV2ZW50LCBjbGllbnRJbmZvLAogICAgICAgICAgICAgICAgIGNsaWVudENvbmZpZywgZGV2aWNlQ29uZmlnLCBwYXRjaEhhbmRsZSk7CiAgICAgfQpAQCAtMzE4LDYgKzMzMiwyMSBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFJlY29yZFNpbGVuY2VkKHVpZF90IHVpZCwgYm9vbCBzaWxlbmNlZCkKK3sKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyKSB7CisgICAgICAgICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOworICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0UmVjb3JkU2lsZW5jZWQodWlkLCBzaWxlbmNlZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYpIHsKKyAgICAgICAgYWYtPnNldFJlY29yZFNpbGVuY2VkKHVpZCwgc2lsZW5jZWQpOworICAgIH0KK30KKwogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKIHsKICAgICBpZiAoIWR1bXBBbGxvd2VkKCkpIHsKQEAgLTM2MSwxMSArMzkwLDI0OCBAQAogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6Om9uVHJhbnNhY3QoCi0gICAgICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCi17CisgICAgICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpIHsKKyAgICBzd2l0Y2ggKGNvZGUpIHsKKyAgICAgICAgY2FzZSBTSEVMTF9DT01NQU5EX1RSQU5TQUNUSU9OOiB7CisgICAgICAgICAgICBpbnQgaW4gPSBkYXRhLnJlYWRGaWxlRGVzY3JpcHRvcigpOworICAgICAgICAgICAgaW50IG91dCA9IGRhdGEucmVhZEZpbGVEZXNjcmlwdG9yKCk7CisgICAgICAgICAgICBpbnQgZXJyID0gZGF0YS5yZWFkRmlsZURlc2NyaXB0b3IoKTsKKyAgICAgICAgICAgIGludCBhcmdjID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIFZlY3RvcjxTdHJpbmcxNj4gYXJnczsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJnYyAmJiBkYXRhLmRhdGFBdmFpbCgpID4gMDsgaSsrKSB7CisgICAgICAgICAgICAgICBhcmdzLmFkZChkYXRhLnJlYWRTdHJpbmcxNigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPElCaW5kZXI+IHVudXNlZENhbGxiYWNrOworICAgICAgICAgICAgc3A8SVJlc3VsdFJlY2VpdmVyPiByZXN1bHRSZWNlaXZlcjsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1czsKKyAgICAgICAgICAgIGlmICgoc3RhdHVzID0gZGF0YS5yZWFkTnVsbGFibGVTdHJvbmdCaW5kZXIoJnVudXNlZENhbGxiYWNrKSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChzdGF0dXMgPSBkYXRhLnJlYWROdWxsYWJsZVN0cm9uZ0JpbmRlcigmcmVzdWx0UmVjZWl2ZXIpKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXMgPSBzaGVsbENvbW1hbmQoaW4sIG91dCwgZXJyLCBhcmdzKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHRSZWNlaXZlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0UmVjZWl2ZXItPnNlbmQoc3RhdHVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHJldHVybiBCbkF1ZGlvUG9saWN5U2VydmljZTo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogfQogCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tIFNoZWxsIGNvbW1hbmQgaW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBOT1RFOiBUaGlzIGlzIGEgcmVtb3RlIEFQSSAtIG1ha2Ugc3VyZSBhbGwgYXJncyBhcmUgdmFsaWRhdGVkCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNoZWxsQ29tbWFuZChpbnQgaW4sIGludCBvdXQsIGludCBlcnIsIFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIHsKKyAgICBpZiAoIWNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc01hbmFnZUF1ZGlvUG9saWN5UGVybWlzc2lvbiwgbnVsbHB0ciwgbnVsbHB0cikpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICBpZiAoaW4gPT0gQkFEX1RZUEUgfHwgb3V0ID09IEJBRF9UWVBFIHx8IGVyciA9PSBCQURfVFlQRSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAoYXJncy5zaXplKCkgPT0gMyAmJiBhcmdzWzBdID09IFN0cmluZzE2KCJzZXQtdWlkLXN0YXRlIikpIHsKKyAgICAgICAgcmV0dXJuIGhhbmRsZVNldFVpZFN0YXRlKGFyZ3MsIGVycik7CisgICAgfSBlbHNlIGlmIChhcmdzLnNpemUoKSA9PSAyICYmIGFyZ3NbMF0gPT0gU3RyaW5nMTYoInJlc2V0LXVpZC1zdGF0ZSIpKSB7CisgICAgICAgIHJldHVybiBoYW5kbGVSZXNldFVpZFN0YXRlKGFyZ3MsIGVycik7CisgICAgfSBlbHNlIGlmIChhcmdzLnNpemUoKSA9PSAyICYmIGFyZ3NbMF0gPT0gU3RyaW5nMTYoImdldC11aWQtc3RhdGUiKSkgeworICAgICAgICByZXR1cm4gaGFuZGxlR2V0VWlkU3RhdGUoYXJncywgb3V0LCBlcnIpOworICAgIH0gZWxzZSBpZiAoYXJncy5zaXplKCkgPT0gMSAmJiBhcmdzWzBdID09IFN0cmluZzE2KCJoZWxwIikpIHsKKyAgICAgICAgcHJpbnRIZWxwKG91dCk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgcHJpbnRIZWxwKGVycik7CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpoYW5kbGVTZXRVaWRTdGF0ZShWZWN0b3I8U3RyaW5nMTY+JiBhcmdzLCBpbnQgZXJyKSB7CisgICAgUGVybWlzc2lvbkNvbnRyb2xsZXIgcGM7CisgICAgaW50IHVpZCA9IHBjLmdldFBhY2thZ2VVaWQoYXJnc1sxXSwgMCk7CisgICAgaWYgKHVpZCA8PSAwKSB7CisgICAgICAgIEFMT0dFKCJVbmtub3duIHBhY2thZ2U6ICclcyciLCBTdHJpbmc4KGFyZ3NbMV0pLnN0cmluZygpKTsKKyAgICAgICAgZHByaW50ZihlcnIsICJVbmtub3duIHBhY2thZ2U6ICclcydcbiIsIFN0cmluZzgoYXJnc1sxXSkuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBib29sIGFjdGl2ZSA9IGZhbHNlOworICAgIGlmIChhcmdzWzJdID09IFN0cmluZzE2KCJhY3RpdmUiKSkgeworICAgICAgICBhY3RpdmUgPSB0cnVlOworICAgIH0gZWxzZSBpZiAoKGFyZ3NbMl0gIT0gU3RyaW5nMTYoImlkbGUiKSkpIHsKKyAgICAgICAgQUxPR0UoIkV4cGVjdGVkIGFjdGl2ZSBvciBpZGxlIGJ1dCBnb3Q6ICclcyciLCBTdHJpbmc4KGFyZ3NbMl0pLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgbVVpZFBvbGljeS0+YWRkT3ZlcnJpZGVVaWQodWlkLCBhY3RpdmUpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpoYW5kbGVSZXNldFVpZFN0YXRlKFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MsIGludCBlcnIpIHsKKyAgICBQZXJtaXNzaW9uQ29udHJvbGxlciBwYzsKKyAgICBpbnQgdWlkID0gcGMuZ2V0UGFja2FnZVVpZChhcmdzWzFdLCAwKTsKKyAgICBpZiAodWlkIDwgMCkgeworICAgICAgICBBTE9HRSgiVW5rbm93biBwYWNrYWdlOiAnJXMnIiwgU3RyaW5nOChhcmdzWzFdKS5zdHJpbmcoKSk7CisgICAgICAgIGRwcmludGYoZXJyLCAiVW5rbm93biBwYWNrYWdlOiAnJXMnXG4iLCBTdHJpbmc4KGFyZ3NbMV0pLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgbVVpZFBvbGljeS0+cmVtb3ZlT3ZlcnJpZGVVaWQodWlkKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6aGFuZGxlR2V0VWlkU3RhdGUoVmVjdG9yPFN0cmluZzE2PiYgYXJncywgaW50IG91dCwgaW50IGVycikgeworICAgIFBlcm1pc3Npb25Db250cm9sbGVyIHBjOworICAgIGludCB1aWQgPSBwYy5nZXRQYWNrYWdlVWlkKGFyZ3NbMV0sIDApOworICAgIGlmICh1aWQgPCAwKSB7CisgICAgICAgIEFMT0dFKCJVbmtub3duIHBhY2thZ2U6ICclcyciLCBTdHJpbmc4KGFyZ3NbMV0pLnN0cmluZygpKTsKKyAgICAgICAgZHByaW50ZihlcnIsICJVbmtub3duIHBhY2thZ2U6ICclcydcbiIsIFN0cmluZzgoYXJnc1sxXSkuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAobVVpZFBvbGljeS0+aXNVaWRBY3RpdmUodWlkKSkgeworICAgICAgICByZXR1cm4gZHByaW50ZihvdXQsICJhY3RpdmVcbiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBkcHJpbnRmKG91dCwgImlkbGVcbiIpOworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpwcmludEhlbHAoaW50IG91dCkgeworICAgIHJldHVybiBkcHJpbnRmKG91dCwgIkF1ZGlvIHBvbGljeSBzZXJ2aWNlIGNvbW1hbmRzOlxuIgorICAgICAgICAiICBnZXQtdWlkLXN0YXRlIDxQQUNLQUdFPiBnZXRzIHRoZSB1aWQgc3RhdGVcbiIKKyAgICAgICAgIiAgc2V0LXVpZC1zdGF0ZSA8UEFDS0FHRT4gPGFjdGl2ZXxpZGxlPiBvdmVycmlkZXMgdGhlIHVpZCBzdGF0ZVxuIgorICAgICAgICAiICByZXNldC11aWQtc3RhdGUgPFBBQ0tBR0U+IGNsZWFycyB0aGUgdWlkIHN0YXRlIG92ZXJyaWRlXG4iCisgICAgICAgICIgIGhlbHAgcHJpbnQgdGhpcyBtZXNzYWdlXG4iKTsKK30KKworLy8gLS0tLS0tLS0tLS0gIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5IGltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6cmVnaXN0ZXJTZWxmKCkgeworICAgIEFjdGl2aXR5TWFuYWdlciBhbTsKKyAgICBhbS5yZWdpc3RlclVpZE9ic2VydmVyKHRoaXMsIEFjdGl2aXR5TWFuYWdlcjo6VUlEX09CU0VSVkVSX0dPTkUKKyAgICAgICAgICAgIHwgQWN0aXZpdHlNYW5hZ2VyOjpVSURfT0JTRVJWRVJfSURMRQorICAgICAgICAgICAgfCBBY3Rpdml0eU1hbmFnZXI6OlVJRF9PQlNFUlZFUl9BQ1RJVkUsCisgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTiwKKyAgICAgICAgICAgIFN0cmluZzE2KCJhdWRpb3NlcnZlciIpKTsKKyAgICBzdGF0dXNfdCByZXMgPSBhbS5saW5rVG9EZWF0aCh0aGlzKTsKKyAgICBpZiAoIXJlcykgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBtT2JzZXJ2ZXJSZWdpc3RlcmVkID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiVWlkUG9saWN5OjpyZWdpc3RlclNlbGYgbGlua1RvRGVhdGggZmFpbGVkOiAlZCIsIHJlcyk7CisgICAgICAgIGFtLnVucmVnaXN0ZXJVaWRPYnNlcnZlcih0aGlzKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6OnVucmVnaXN0ZXJTZWxmKCkgeworICAgIEFjdGl2aXR5TWFuYWdlciBhbTsKKyAgICBhbS51bmxpbmtUb0RlYXRoKHRoaXMpOworICAgIGFtLnVucmVnaXN0ZXJVaWRPYnNlcnZlcih0aGlzKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1PYnNlcnZlclJlZ2lzdGVyZWQgPSBmYWxzZTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6YmluZGVyRGllZChfX3VudXNlZCBjb25zdCB3cDxJQmluZGVyPiAmd2hvKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtQ2FjaGVkVWlkcy5jbGVhcigpOworICAgIG1PYnNlcnZlclJlZ2lzdGVyZWQgPSBmYWxzZTsKK30KKworYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6aXNVaWRBY3RpdmUodWlkX3QgdWlkKSB7CisgICAgaWYgKGlzU2VydmljZVVpZCh1aWQpKSByZXR1cm4gdHJ1ZTsKKyAgICBib29sIG5lZWRUb1JlcmVnaXN0ZXIgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIG5lZWRUb1JlcmVnaXN0ZXIgPSAhbU9ic2VydmVyUmVnaXN0ZXJlZDsKKyAgICB9CisgICAgaWYgKG5lZWRUb1JlcmVnaXN0ZXIpIHsKKyAgICAgICAgLy8gTG9va3MgbGlrZSBBY3Rpdml0eU1hbmFnZXIgaGFzIGRpZWQgcHJldmlvdXNseSwgYXR0ZW1wdCB0byByZS1yZWdpc3Rlci4KKyAgICAgICAgcmVnaXN0ZXJTZWxmKCk7CisgICAgfQorICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgYXV0byBvdmVycmlkZUl0ZXIgPSBtT3ZlcnJpZGVVaWRzLmZpbmQodWlkKTsKKyAgICAgICAgaWYgKG92ZXJyaWRlSXRlciAhPSBtT3ZlcnJpZGVVaWRzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gb3ZlcnJpZGVJdGVyLT5zZWNvbmQ7CisgICAgICAgIH0KKyAgICAgICAgLy8gSW4gYW4gYWJzZW5zZSBvZiB0aGUgQWN0aXZpdHlNYW5hZ2VyLCBhc3N1bWUgZXZlcnl0aGluZyB0byBiZSBhY3RpdmUuCisgICAgICAgIGlmICghbU9ic2VydmVyUmVnaXN0ZXJlZCkgcmV0dXJuIHRydWU7CisgICAgICAgIGF1dG8gY2FjaGVJdGVyID0gbUNhY2hlZFVpZHMuZmluZCh1aWQpOworICAgICAgICBpZiAoY2FjaGVJdGVyICE9IG1DYWNoZWRVaWRzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gY2FjaGVJdGVyLT5zZWNvbmQ7CisgICAgICAgIH0KKyAgICB9CisgICAgQWN0aXZpdHlNYW5hZ2VyIGFtOworICAgIGJvb2wgYWN0aXZlID0gYW0uaXNVaWRBY3RpdmUodWlkLCBTdHJpbmcxNigiYXVkaW9zZXJ2ZXIiKSk7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBtQ2FjaGVkVWlkcy5pbnNlcnQoc3RkOjpwYWlyPHVpZF90LCBib29sPih1aWQsIGFjdGl2ZSkpOworICAgIH0KKyAgICByZXR1cm4gYWN0aXZlOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5OjpvblVpZEFjdGl2ZSh1aWRfdCB1aWQpIHsKKyAgICB1cGRhdGVVaWRDYWNoZSh1aWQsIHRydWUsIHRydWUpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5OjpvblVpZEdvbmUodWlkX3QgdWlkLCBfX3VudXNlZCBib29sIGRpc2FibGVkKSB7CisgICAgdXBkYXRlVWlkQ2FjaGUodWlkLCBmYWxzZSwgZmFsc2UpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5OjpvblVpZElkbGUodWlkX3QgdWlkLCBfX3VudXNlZCBib29sIGRpc2FibGVkKSB7CisgICAgdXBkYXRlVWlkQ2FjaGUodWlkLCBmYWxzZSwgdHJ1ZSk7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6OmlzU2VydmljZVVpZCh1aWRfdCB1aWQpIGNvbnN0IHsKKyAgICByZXR1cm4gbXVsdGl1c2VyX2dldF9hcHBfaWQodWlkKSA8IEFJRF9BUFBfU1RBUlQ7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6Om5vdGlmeVNlcnZpY2UodWlkX3QgdWlkLCBib29sIGFjdGl2ZSkgeworICAgIHNwPEF1ZGlvUG9saWN5U2VydmljZT4gc2VydmljZSA9IG1TZXJ2aWNlLnByb21vdGUoKTsKKyAgICBpZiAoc2VydmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIHNlcnZpY2UtPnNldFJlY29yZFNpbGVuY2VkKHVpZCwgIWFjdGl2ZSk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojp1cGRhdGVPdmVycmlkZVVpZCh1aWRfdCB1aWQsIGJvb2wgYWN0aXZlLCBib29sIGluc2VydCkgeworICAgIGlmIChpc1NlcnZpY2VVaWQodWlkKSkgcmV0dXJuOworICAgIGJvb2wgd2FzT3ZlcnJpZGRlbiA9IGZhbHNlLCB3YXNBY3RpdmUgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIHVwZGF0ZVVpZExvY2tlZCgmbU92ZXJyaWRlVWlkcywgdWlkLCBhY3RpdmUsIGluc2VydCwgJndhc092ZXJyaWRkZW4sICZ3YXNBY3RpdmUpOworICAgIH0KKyAgICBpZiAoIXdhc092ZXJyaWRkZW4gJiYgaW5zZXJ0KSB7CisgICAgICAgIG5vdGlmeVNlcnZpY2UodWlkLCBhY3RpdmUpOyAgLy8gU3RhcnRlZCB0byBvdmVycmlkZS4KKyAgICB9IGVsc2UgaWYgKHdhc092ZXJyaWRkZW4gJiYgIWluc2VydCkgeworICAgICAgICBub3RpZnlTZXJ2aWNlKHVpZCwgaXNVaWRBY3RpdmUodWlkKSk7ICAvLyBPdmVycmlkZSBjZWFzZWQsIG5vdGlmeSB3aXRoIGdyb3VuZCB0cnV0aC4KKyAgICB9IGVsc2UgaWYgKHdhc0FjdGl2ZSAhPSBhY3RpdmUpIHsKKyAgICAgICAgbm90aWZ5U2VydmljZSh1aWQsIGFjdGl2ZSk7ICAvLyBPdmVycmlkZSB1cGRhdGVkLgorICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6dXBkYXRlVWlkQ2FjaGUodWlkX3QgdWlkLCBib29sIGFjdGl2ZSwgYm9vbCBpbnNlcnQpIHsKKyAgICBpZiAoaXNTZXJ2aWNlVWlkKHVpZCkpIHJldHVybjsKKyAgICBib29sIHdhc0FjdGl2ZSA9IGZhbHNlOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgdXBkYXRlVWlkTG9ja2VkKCZtQ2FjaGVkVWlkcywgdWlkLCBhY3RpdmUsIGluc2VydCwgbnVsbHB0ciwgJndhc0FjdGl2ZSk7CisgICAgICAgIC8vIERvIG5vdCBub3RpZnkgc2VydmljZSBpZiBjdXJyZW50bHkgb3ZlcnJpZGRlbi4KKyAgICAgICAgaWYgKG1PdmVycmlkZVVpZHMuZmluZCh1aWQpICE9IG1PdmVycmlkZVVpZHMuZW5kKCkpIHJldHVybjsKKyAgICB9CisgICAgYm9vbCBub3dBY3RpdmUgPSBhY3RpdmUgJiYgaW5zZXJ0OworICAgIGlmICh3YXNBY3RpdmUgIT0gbm93QWN0aXZlKSBub3RpZnlTZXJ2aWNlKHVpZCwgbm93QWN0aXZlKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6dXBkYXRlVWlkTG9ja2VkKHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwgYm9vbD4gKnVpZHMsCisgICAgICAgIHVpZF90IHVpZCwgYm9vbCBhY3RpdmUsIGJvb2wgaW5zZXJ0LCBib29sICp3YXNUaGVyZSwgYm9vbCAqd2FzQWN0aXZlKSB7CisgICAgYXV0byBpdCA9IHVpZHMtPmZpbmQodWlkKTsKKyAgICBpZiAoaXQgIT0gdWlkcy0+ZW5kKCkpIHsKKyAgICAgICAgaWYgKHdhc1RoZXJlICE9IG51bGxwdHIpICp3YXNUaGVyZSA9IHRydWU7CisgICAgICAgIGlmICh3YXNBY3RpdmUgIT0gbnVsbHB0cikgKndhc0FjdGl2ZSA9IGl0LT5zZWNvbmQ7CisgICAgICAgIGlmIChpbnNlcnQpIHsKKyAgICAgICAgICAgIGl0LT5zZWNvbmQgPSBhY3RpdmU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1aWRzLT5lcmFzZShpdCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGluc2VydCkgeworICAgICAgICB1aWRzLT5pbnNlcnQoc3RkOjpwYWlyPHVpZF90LCBib29sPih1aWQsIGFjdGl2ZSkpOworICAgIH0KK30KIAogLy8gLS0tLS0tLS0tLS0gIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkIGltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0KIApAQCAtODU5LDcgKzExMjUsNyBAQAogICAgIH0KIAogICAgIC8vIGNoZWNrIHNhbWUgcGVuZGluZyBjb21tYW5kcyB3aXRoIGxhdGVyIHRpbWUgc3RhbXBzIGFuZCBlbGltaW5hdGUgdGhlbQotICAgIGZvciAoaSA9IG1BdWRpb0NvbW1hbmRzLnNpemUoKS0xOyBpID49IDA7IGktLSkgeworICAgIGZvciAoaSA9IChzc2l6ZV90KW1BdWRpb0NvbW1hbmRzLnNpemUoKS0xOyBpID49IDA7IGktLSkgewogICAgICAgICBzcDxBdWRpb0NvbW1hbmQ+IGNvbW1hbmQyID0gbUF1ZGlvQ29tbWFuZHNbaV07CiAgICAgICAgIC8vIGNvbW1hbmRzIGFyZSBzb3J0ZWQgYnkgaW5jcmVhc2luZyB0aW1lIHN0YW1wOiBubyBuZWVkIHRvIHNjYW4gdGhlIHJlc3Qgb2YgbUF1ZGlvQ29tbWFuZHMKICAgICAgICAgaWYgKGNvbW1hbmQyLT5tVGltZSA8PSBjb21tYW5kLT5tVGltZSkgYnJlYWs7CkBAIC0xMTQ2LDQgKzE0MTIsNCBAQAogaW50IGFwc19zZXRfdm9pY2Vfdm9sdW1lKHZvaWQgKnNlcnZpY2UsIGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5X21zKTsKIH07CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuaAppbmRleCAzOGQ0YjE3Li40MDdkN2E1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDxiaW5kZXIvQmluZGVyU2VydmljZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JVWlkT2JzZXJ2ZXIuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oPgpAQCAtMzMsOSArMzQsMTIgQEAKICNpbmNsdWRlICJBdWRpb1BvbGljeUVmZmVjdHMuaCIKICNpbmNsdWRlICJtYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuaCIKIAorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBjbGFzcyBBdWRpb1BvbGljeVNlcnZpY2UgOgpAQCAtNjgsMTcgKzcyLDEyIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKTsKICAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZ2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKTsKLSAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IE5VTEwpOworICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE91dHB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCkBAIC05OCwxNiArOTcsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCA9IE5VTEwpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqc2lsZW5jZWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1pbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWF4KTsKQEAgLTIwNSw2ICsyMDMsMTIgQEAKICAgICB2aXJ0dWFsIGZsb2F0ICAgIGdldFN0cmVhbVZvbHVtZURCKAogICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgaW5kZXgsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdXJyb3VuZEZvcm1hdHModW5zaWduZWQgaW50ICpudW1TdXJyb3VuZEZvcm1hdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnN1cnJvdW5kRm9ybWF0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpzdXJyb3VuZEZvcm1hdHNFbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVwb3J0ZWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0LCBib29sIGVuYWJsZWQpOworCiAgICAgICAgICAgICBzdGF0dXNfdCBkb1N0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKQEAgLTI0MSw2ICsyNDUsNjggQEAKIAogICAgICAgICAgICAgc3RhdHVzX3QgZHVtcEludGVybmFscyhpbnQgZmQpOwogCisgICAgLy8gSGFuZGxlcyBiaW5kZXIgc2hlbGwgY29tbWFuZHMKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNoZWxsQ29tbWFuZChpbnQgaW4sIGludCBvdXQsIGludCBlcnIsIFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOworCisgICAgLy8gU2V0cyB3aGV0aGVyIHRoZSBnaXZlbiBVSUQgcmVjb3JkcyBvbmx5IHNpbGVuY2UKKyAgICB2aXJ0dWFsIHZvaWQgc2V0UmVjb3JkU2lsZW5jZWQodWlkX3QgdWlkLCBib29sIHNpbGVuY2VkKTsKKworICAgIC8vIE92ZXJyaWRlcyB0aGUgVUlEIHN0YXRlIGFzIGlmIGl0IGlzIGlkbGUKKyAgICBzdGF0dXNfdCBoYW5kbGVTZXRVaWRTdGF0ZShWZWN0b3I8U3RyaW5nMTY+JiBhcmdzLCBpbnQgZXJyKTsKKworICAgIC8vIENsZWFycyB0aGUgb3ZlcnJpZGUgZm9yIHRoZSBVSUQgc3RhdGUKKyAgICBzdGF0dXNfdCBoYW5kbGVSZXNldFVpZFN0YXRlKFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MsIGludCBlcnIpOworCisgICAgLy8gR2V0cyB0aGUgVUlEIHN0YXRlCisgICAgc3RhdHVzX3QgaGFuZGxlR2V0VWlkU3RhdGUoVmVjdG9yPFN0cmluZzE2PiYgYXJncywgaW50IG91dCwgaW50IGVycik7CisKKyAgICAvLyBQcmludHMgdGhlIHNoZWxsIGNvbW1hbmQgaGVscAorICAgIHN0YXR1c190IHByaW50SGVscChpbnQgb3V0KTsKKworICAgIHN0ZDo6c3RyaW5nIGdldERldmljZVR5cGVTdHJGb3JQb3J0SWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworCisgICAgLy8gSWYgcmVjb3JkaW5nIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBVSUQgaXMgYWxsb3dlZCB0byBkbyB0aGF0LiBJZiB0aGUgVUlEIGlzIGlkbGUKKyAgICAvLyB0aGVuIGl0IGNhbm5vdCByZWNvcmQgYW5kIGdldHMgYnVmZmVycyB3aXRoIHplcm9zIC0gc2lsZW5jZS4gQXMgc29vbiBhcyB0aGUgVUlECisgICAgLy8gdHJhbnNpdGlvbnMgdG8gYW4gYWN0aXZlIHN0YXRlIHdlIHdpbGwgc3RhcnQgcmVwb3J0aW5nIGJ1ZmZlcnMgd2l0aCBkYXRhLiBUaGlzIGFwcHJvYWNoCisgICAgLy8gdHJhbnNwYXJlbnRseSBoYW5kbGVzIHJlY29yZGluZyB3aGlsZSB0aGUgVUlEIHRyYW5zaXRpb25zIGJldHdlZW4gaWRsZS9hY3RpdmUgc3RhdGUKKyAgICAvLyBhdm9pZGluZyB0byBnZXQgc3R1Y2sgaW4gYSBzdGF0ZSByZWNlaXZpbmcgbm9uLWVtcHR5IGJ1ZmZlcnMgd2hpbGUgaWRsZSBvciBpbiBhIHN0YXRlCisgICAgLy8gcmVjZWl2aW5nIGVtcHR5IGJ1ZmZlcnMgd2hpbGUgYWN0aXZlLgorICAgIGNsYXNzIFVpZFBvbGljeSA6IHB1YmxpYyBCblVpZE9ic2VydmVyLCBwdWJsaWMgdmlydHVhbCBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCB7CisgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBVaWRQb2xpY3kod3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiBzZXJ2aWNlKQorICAgICAgICAgICAgICAgIDogbVNlcnZpY2Uoc2VydmljZSksIG1PYnNlcnZlclJlZ2lzdGVyZWQoZmFsc2UpIHt9CisKKyAgICAgICAgdm9pZCByZWdpc3RlclNlbGYoKTsKKyAgICAgICAgdm9pZCB1bnJlZ2lzdGVyU2VsZigpOworCisgICAgICAgIC8vIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IGltcGxlbWVudGF0aW9uCisgICAgICAgIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiAmd2hvKSBvdmVycmlkZTsKKworICAgICAgICBib29sIGlzVWlkQWN0aXZlKHVpZF90IHVpZCk7CisKKyAgICAgICAgLy8gQm5VaWRPYnNlcnZlciBpbXBsZW1lbnRhdGlvbgorICAgICAgICB2b2lkIG9uVWlkQWN0aXZlKHVpZF90IHVpZCkgb3ZlcnJpZGU7CisgICAgICAgIHZvaWQgb25VaWRHb25lKHVpZF90IHVpZCwgYm9vbCBkaXNhYmxlZCkgb3ZlcnJpZGU7CisgICAgICAgIHZvaWQgb25VaWRJZGxlKHVpZF90IHVpZCwgYm9vbCBkaXNhYmxlZCkgb3ZlcnJpZGU7CisKKyAgICAgICAgdm9pZCBhZGRPdmVycmlkZVVpZCh1aWRfdCB1aWQsIGJvb2wgYWN0aXZlKSB7IHVwZGF0ZU92ZXJyaWRlVWlkKHVpZCwgYWN0aXZlLCB0cnVlKTsgfQorICAgICAgICB2b2lkIHJlbW92ZU92ZXJyaWRlVWlkKHVpZF90IHVpZCkgeyB1cGRhdGVPdmVycmlkZVVpZCh1aWQsIGZhbHNlLCBmYWxzZSk7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGJvb2wgaXNTZXJ2aWNlVWlkKHVpZF90IHVpZCkgY29uc3Q7CisgICAgICAgIHZvaWQgbm90aWZ5U2VydmljZSh1aWRfdCB1aWQsIGJvb2wgYWN0aXZlKTsKKyAgICAgICAgdm9pZCB1cGRhdGVPdmVycmlkZVVpZCh1aWRfdCB1aWQsIGJvb2wgYWN0aXZlLCBib29sIGluc2VydCk7CisgICAgICAgIHZvaWQgdXBkYXRlVWlkQ2FjaGUodWlkX3QgdWlkLCBib29sIGFjdGl2ZSwgYm9vbCBpbnNlcnQpOworICAgICAgICB2b2lkIHVwZGF0ZVVpZExvY2tlZChzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsIGJvb2w+ICp1aWRzLAorICAgICAgICAgICAgICAgIHVpZF90IHVpZCwgYm9vbCBhY3RpdmUsIGJvb2wgaW5zZXJ0LCBib29sICp3YXNUaGVyZSwgYm9vbCAqd2FzQWN0aXZlKTsKKworICAgICAgICB3cDxBdWRpb1BvbGljeVNlcnZpY2U+IG1TZXJ2aWNlOworICAgICAgICBNdXRleCBtTG9jazsKKyAgICAgICAgYm9vbCBtT2JzZXJ2ZXJSZWdpc3RlcmVkOworICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsIGJvb2w+IG1PdmVycmlkZVVpZHM7CisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwgYm9vbD4gbUNhY2hlZFVpZHM7CisgICAgfTsKKwogICAgIC8vIFRocmVhZCB1c2VkIGZvciB0b25lIHBsYXliYWNrIGFuZCB0byBzZW5kIGF1ZGlvIGNvbmZpZyBjb21tYW5kcyB0byBhdWRpbyBmbGluZ2VyCiAgICAgLy8gRm9yIHRvbmUgcGxheWJhY2ssIHVzaW5nIGEgc2VwYXJhdGUgdGhyZWFkIGlzIG5lY2Vzc2FyeSB0byBhdm9pZCBkZWFkbG9jayB3aXRoIG1Mb2NrIGJlY2F1c2UKICAgICAvLyBzdGFydFRvbmUoKSBhbmQgc3RvcFRvbmUoKSBhcmUgbm9ybWFsbHkgY2FsbGVkIHdpdGggbUxvY2sgbG9ja2VkIGFuZCByZXF1ZXN0aW5nIGEgdG9uZSBzdGFydApAQCAtMzEyLDcgKzM3OCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpOwogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBpbnNlcnRDb21tYW5kX2woQXVkaW9Db21tYW5kICpjb21tYW5kLCBpbnQgZGVsYXlNcyA9IDApOwotCiAgICAgcHJpdmF0ZToKICAgICAgICAgY2xhc3MgQXVkaW9Db21tYW5kRGF0YTsKIApAQCAtNTU4LDYgKzYyMyw0OCBAQAogICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9Qb3J0Q2FsbGJhY2tzRW5hYmxlZDsKICAgICB9OwogCisgICAgLy8gLS0tIEF1ZGlvUmVjb3JkQ2xpZW50IC0tLQorICAgIC8vIEluZm9ybWF0aW9uIGFib3V0IGVhY2ggcmVnaXN0ZXJlZCBBdWRpb1JlY29yZCBjbGllbnQKKyAgICAvLyAoYmV0d2VlbiBjYWxscyB0byBnZXRJbnB1dEZvckF0dHIoKSBhbmQgcmVsZWFzZUlucHV0KCkpCisgICAgY2xhc3MgQXVkaW9SZWNvcmRDbGllbnQgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgcHVibGljOgorICAgICAgICAgICAgICAgIEF1ZGlvUmVjb3JkQ2xpZW50KGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LCB1aWRfdCB1aWQsIHBpZF90IHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgY29uc3QgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyhhdHRyaWJ1dGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoaW5wdXQpLCB1aWQodWlkKSwgcGlkKHBpZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wUGFja2FnZU5hbWUob3BQYWNrYWdlTmFtZSksIHNlc3Npb24oc2Vzc2lvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZShmYWxzZSksIGlzQ29uY3VycmVudChmYWxzZSksIGlzVmlydHVhbERldmljZShmYWxzZSkge30KKyAgICAgICAgdmlydHVhbCB+QXVkaW9SZWNvcmRDbGllbnQoKSB7fQorCisgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzOyAvLyBzb3VyY2UsIGZsYWdzIC4uLgorICAgICAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBpbnB1dDsgICAgICAgLy8gYXVkaW8gSEFMIGlucHV0IElPIGhhbmRsZQorICAgICAgICBjb25zdCB1aWRfdCB1aWQ7ICAgICAgICAgICAgICAgICAgICAgLy8gY2xpZW50IFVJRAorICAgICAgICBjb25zdCBwaWRfdCBwaWQ7ICAgICAgICAgICAgICAgICAgICAgLy8gY2xpZW50IFBJRAorICAgICAgICBjb25zdCBTdHJpbmcxNiBvcFBhY2thZ2VOYW1lOyAgICAgICAgLy8gY2xpZW50IHBhY2thZ2UgbmFtZQorICAgICAgICBjb25zdCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbjsgICAgICAgLy8gYXVkaW8gc2Vzc2lvbiBJRAorICAgICAgICBib29sIGFjdGl2ZTsgICAgICAgICAgICAgICAgICAgLy8gQ2FwdHVyZSBpcyBhY3RpdmUgb3IgaW5hY3RpdmUKKyAgICAgICAgYm9vbCBpc0NvbmN1cnJlbnQ7ICAgICAgICAgICAgIC8vIGlzIGFsbG93ZWQgdG8gY29uY3VycmVudCBjYXB0dXJlCisgICAgICAgIGJvb2wgaXNWaXJ0dWFsRGV2aWNlOyAgICAgICAgICAvLyB1c2VzIHZpcnR1YWwgZGV2aWNlOiB1cGRhdGVkIGJ5IEFQTTo6Z2V0SW5wdXRGb3JBdHRyKCkKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZDsgIC8vIHNlbGVjdGVkIGlucHV0IGRldmljZSBwb3J0IElECisgICAgfTsKKworICAgIC8vIEEgY2xhc3MgYXV0b21hdGljYWxseSBjbGVhcmluZyBhbmQgcmVzdG9yaW5nIGJpbmRlciBjYWxsZXIgaWRlbnRpdHkgaW5zaWRlCisgICAgLy8gYSBjb2RlIGJsb2NrIChzY29wZWQgdmFyaWFibGUpCisgICAgLy8gRGVjbGFyZSBvbmUgc3lzdGVtYXRpY2FsbHkgYmVmb3JlIGNhbGxpbmcgQXVkaW9Qb2xpY3lNYW5hZ2VyIG1ldGhvZHMgc28gdGhhdCB0aGV5IGFyZQorICAgIC8vIGV4ZWN1dGVkIHdpdGggdGhlIHNhbWUgbGV2ZWwgb2YgcHJpdmlsZWdlIGFzIGF1ZGlvc2VydmVyIHByb2Nlc3MuCisgICAgY2xhc3MgQXV0b0NhbGxlckNsZWFyIHsKKyAgICBwdWJsaWM6CisgICAgICAgICAgICBBdXRvQ2FsbGVyQ2xlYXIoKSA6CisgICAgICAgICAgICAgICAgbVRva2VuKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCkpIHt9CisgICAgICAgICAgICB+QXV0b0NhbGxlckNsZWFyKCkgeworICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkobVRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGNvbnN0ICAgaW50NjRfdCBtVG9rZW47CisgICAgfTsKKwogICAgIC8vIEludGVybmFsIGR1bXAgdXRpbGl0aWVzLgogICAgIHN0YXR1c190IGR1bXBQZXJtaXNzaW9uRGVuaWFsKGludCBmZCk7CiAKQEAgLTU4MSw4ICs2ODgsMTEgQEAKICAgICAvLyBNYW5hZ2UgYWxsIGVmZmVjdHMgY29uZmlndXJlZCBpbiBhdWRpb19lZmZlY3RzLmNvbmYKICAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+IG1BdWRpb1BvbGljeUVmZmVjdHM7CiAgICAgYXVkaW9fbW9kZV90IG1QaG9uZVN0YXRlOworCisgICAgc3A8VWlkUG9saWN5PiBtVWlkUG9saWN5OworICAgIERlZmF1bHRLZXllZFZlY3RvcjwgYXVkaW9fcG9ydF9oYW5kbGVfdCwgc3A8QXVkaW9SZWNvcmRDbGllbnQ+ID4gICBtQXVkaW9SZWNvcmRDbGllbnRzOwogfTsKIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmIC8vIEFORFJPSURfQVVESU9QT0xJQ1lTRVJWSUNFX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0M2RhZWEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzIgQEAKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5IFwKKyAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZSBcCisgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZSBcCisgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvdXRpbGl0aWVzCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICBsaWJhdWRpb3BvbGljeW1hbmFnZXJkZWZhdWx0IFwKKyAgbGliYmFzZSBcCisgIGxpYmxvZyBcCisgIGxpYm1lZGlhX2hlbHBlciBcCisgIGxpYnV0aWxzIFwKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCisgIGxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cyBcCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgIGF1ZGlvcG9saWN5bWFuYWdlcl90ZXN0cy5jcHAgXAorCitMT0NBTF9NT0RVTEUgOj0gYXVkaW9wb2xpY3lfdGVzdHMKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworTE9DQUxfQ0ZMQUdTIDo9IC1XZXJyb3IgLVdhbGwKKworTE9DQUxfTVVMVElMSUIgOj0gJChBVURJT1NFUlZFUl9NVUxUSUxJQikKKworaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lUZXN0Q2xpZW50LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeVRlc3RDbGllbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjgyMjJjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lUZXN0Q2xpZW50LmgKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkF1ZGlvUG9saWN5SW50ZXJmYWNlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQXVkaW9Qb2xpY3lUZXN0Q2xpZW50IDogcHVibGljIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlCit7CitwdWJsaWM6CisgICAgdmlydHVhbCB+QXVkaW9Qb2xpY3lUZXN0Q2xpZW50KCkgPSBkZWZhdWx0OworCisgICAgLy8gQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgSW1wbGVtZW50YXRpb24KKyAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbG9hZEh3TW9kdWxlKGNvbnN0IGNoYXIqIC8qbmFtZSovKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBBVURJT19NT0RVTEVfSEFORExFX05PTkU7CisgICAgfQorICAgIHN0YXR1c190IG9wZW5PdXRwdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IC8qbW9kdWxlKi8sCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCogLypvdXRwdXQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190KiAvKmNvbmZpZyovLAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190KiAvKmRldmljZXMqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIC8qYWRkcmVzcyovLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIC8qbGF0ZW5jeU1zKi8sCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCAvKmZsYWdzKi8pIG92ZXJyaWRlIHsgcmV0dXJuIE5PX0lOSVQ7IH0KKyAgICBhdWRpb19pb19oYW5kbGVfdCBvcGVuRHVwbGljYXRlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IC8qb3V0cHV0MSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgLypvdXRwdXQyKi8pIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgIH0KKyAgICBzdGF0dXNfdCBjbG9zZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCAvKm91dHB1dCovKSBvdmVycmlkZSB7IHJldHVybiBOT19JTklUOyB9CisgICAgc3RhdHVzX3Qgc3VzcGVuZE91dHB1dChhdWRpb19pb19oYW5kbGVfdCAvKm91dHB1dCovKSBvdmVycmlkZSB7IHJldHVybiBOT19JTklUOyB9CisgICAgc3RhdHVzX3QgcmVzdG9yZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCAvKm91dHB1dCovKSBvdmVycmlkZSB7IHJldHVybiBOT19JTklUOyB9CisgICAgc3RhdHVzX3Qgb3BlbklucHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCAvKm1vZHVsZSovLAorICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCogLyppbnB1dCovLAorICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCogLypjb25maWcqLywKKyAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190KiAvKmRldmljZSovLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiAvKmFkZHJlc3MqLywKKyAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgLypzb3VyY2UqLywKKyAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCAvKmZsYWdzKi8pIG92ZXJyaWRlIHsgcmV0dXJuIE5PX0lOSVQ7IH0KKyAgICBzdGF0dXNfdCBjbG9zZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IC8qaW5wdXQqLykgb3ZlcnJpZGUgeyByZXR1cm4gTk9fSU5JVDsgfQorICAgIHN0YXR1c190IHNldFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IC8qc3RyZWFtKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IC8qdm9sdW1lKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IC8qb3V0cHV0Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKmRlbGF5TXMqLykgb3ZlcnJpZGUgeyByZXR1cm4gTk9fSU5JVDsgfQorICAgIHN0YXR1c190IGludmFsaWRhdGVTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCAvKnN0cmVhbSovKSBvdmVycmlkZSB7IHJldHVybiBOT19JTklUOyB9CisgICAgdm9pZCBzZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IC8qaW9IYW5kbGUqLywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgLyprZXlWYWx1ZVBhaXJzKi8sCisgICAgICAgICAgICAgICAgICAgICAgIGludCAvKmRlbGF5TXMqLykgb3ZlcnJpZGUgeyB9CisgICAgU3RyaW5nOCBnZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IC8qaW9IYW5kbGUqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgLyprZXlzKi8pIG92ZXJyaWRlIHsgcmV0dXJuIFN0cmluZzgoKTsgfQorICAgIHN0YXR1c190IHN0YXJ0VG9uZShhdWRpb19wb2xpY3lfdG9uZV90IC8qdG9uZSovLAorICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IC8qc3RyZWFtKi8pIG92ZXJyaWRlIHsgcmV0dXJuIE5PX0lOSVQ7IH0KKyAgICBzdGF0dXNfdCBzdG9wVG9uZSgpIG92ZXJyaWRlIHsgcmV0dXJuIE5PX0lOSVQ7IH0KKyAgICBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCAvKnZvbHVtZSovLCBpbnQgLypkZWxheU1zKi8pIG92ZXJyaWRlIHsgcmV0dXJuIE5PX0lOSVQ7IH0KKyAgICBzdGF0dXNfdCBtb3ZlRWZmZWN0cyhhdWRpb19zZXNzaW9uX3QgLypzZXNzaW9uKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgLypzcmNPdXRwdXQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAvKmRzdE91dHB1dCovKSBvdmVycmlkZSB7IHJldHVybiBOT19JTklUOyB9CisgICAgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2gqIC8qcGF0Y2gqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90KiAvKmhhbmRsZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qZGVsYXlNcyovKSBvdmVycmlkZSB7IHJldHVybiBOT19JTklUOyB9CisgICAgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgLypoYW5kbGUqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLypkZWxheU1zKi8pIG92ZXJyaWRlIHsgcmV0dXJuIE5PX0lOSVQ7IH0KKyAgICBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnKiAvKmNvbmZpZyovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLypkZWxheU1zKi8pIG92ZXJyaWRlIHsgcmV0dXJuIE5PX0lOSVQ7IH0KKyAgICB2b2lkIG9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpIG92ZXJyaWRlIHsgfQorICAgIHZvaWQgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpIG92ZXJyaWRlIHsgfQorICAgIGF1ZGlvX3VuaXF1ZV9pZF90IG5ld0F1ZGlvVW5pcXVlSWQoYXVkaW9fdW5pcXVlX2lkX3VzZV90IC8qdXNlKi8pIG92ZXJyaWRlIHsgcmV0dXJuIDA7IH0KKyAgICB2b2lkIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKFN0cmluZzggLypyZWdJZCovLCBpbnQzMl90IC8qc3RhdGUqLykgb3ZlcnJpZGUgeyB9CisgICAgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IC8qZXZlbnQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCogLypjbGllbnRJbmZvKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZ19iYXNlKiAvKmNsaWVudENvbmZpZyovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWdfYmFzZSogLypkZXZpY2VDb25maWcqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAvKnBhdGNoSGFuZGxlKi8pIG92ZXJyaWRlIHsgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lUZXN0TWFuYWdlci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lUZXN0TWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNTQzYTYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeVRlc3RNYW5hZ2VyLmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIm1hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEF1ZGlvUG9saWN5VGVzdE1hbmFnZXIgOiBwdWJsaWMgQXVkaW9Qb2xpY3lNYW5hZ2VyIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IEF1ZGlvUG9saWN5VGVzdE1hbmFnZXIoQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSkKKyAgICAgICAgICAgIDogQXVkaW9Qb2xpY3lNYW5hZ2VyKGNsaWVudEludGVyZmFjZSwgdHJ1ZSAvKmZvclRlc3RpbmcqLykgeyB9CisgICAgdXNpbmcgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRDb25maWc7CisgICAgdXNpbmcgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppbml0aWFsaXplOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL2F1ZGlvcG9saWN5bWFuYWdlcl90ZXN0cy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9hdWRpb3BvbGljeW1hbmFnZXJfdGVzdHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NTkzYjgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9hdWRpb3BvbGljeW1hbmFnZXJfdGVzdHMuY3BwCkBAIC0wLDAgKzEsMTk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzZXQ+CisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSAiQXVkaW9Qb2xpY3lUZXN0Q2xpZW50LmgiCisjaW5jbHVkZSAiQXVkaW9Qb2xpY3lUZXN0TWFuYWdlci5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworVEVTVChBdWRpb1BvbGljeU1hbmFnZXJUZXN0SW5pdCwgRmFpbHVyZSkgeworICAgIEF1ZGlvUG9saWN5VGVzdENsaWVudCBjbGllbnQ7CisgICAgQXVkaW9Qb2xpY3lUZXN0TWFuYWdlciBtYW5hZ2VyKCZjbGllbnQpOworICAgIG1hbmFnZXIuZ2V0Q29uZmlnKCkuc2V0RGVmYXVsdCgpOworICAgIC8vIFNpbmNlIHRoZSBkZWZhdWx0IGNsaWVudCBmYWlscyB0byBvcGVuIGFueXRoaW5nLAorICAgIC8vIEFQTSBzaG91bGQgaW5kaWNhdGUgdGhhdCB0aGUgaW5pdGlhbGl6YXRpb24gZGlkbid0IHN1Y2NlZWQuCisgICAgQVNTRVJUX0VRKE5PX0lOSVQsIG1hbmFnZXIuaW5pdGlhbGl6ZSgpKTsKKyAgICBBU1NFUlRfRVEoTk9fSU5JVCwgbWFuYWdlci5pbml0Q2hlY2soKSk7Cit9CisKKworY2xhc3MgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdENsaWVudCA6IHB1YmxpYyBBdWRpb1BvbGljeVRlc3RDbGllbnQgeworICBwdWJsaWM6CisgICAgLy8gQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgaW1wbGVtZW50YXRpb24KKyAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbG9hZEh3TW9kdWxlKGNvbnN0IGNoYXIqIC8qbmFtZSovKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtTmV4dE1vZHVsZUhhbmRsZSsrOworICAgIH0KKworICAgIHN0YXR1c190IG9wZW5PdXRwdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90KiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCogLypjb25maWcqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCogLypkZXZpY2VzKi8sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiAvKmFkZHJlc3MqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiAvKmxhdGVuY3lNcyovLAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgLypmbGFncyovKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtb2R1bGUgPj0gbU5leHRNb2R1bGVIYW5kbGUpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogTW9kdWxlIGhhbmRsZSAlZCBoYXMgbm90IGJlZW4gYWxsb2NhdGVkIHlldCAobmV4dCBpcyAlZCkiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbW9kdWxlLCBtTmV4dE1vZHVsZUhhbmRsZSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgICpvdXRwdXQgPSBtTmV4dElvSGFuZGxlKys7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBvcGVuSW5wdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QqIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCogLypjb25maWcqLywKKyAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190KiAvKmRldmljZSovLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiAvKmFkZHJlc3MqLywKKyAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgLypzb3VyY2UqLywKKyAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCAvKmZsYWdzKi8pIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1vZHVsZSA+PSBtTmV4dE1vZHVsZUhhbmRsZSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBNb2R1bGUgaGFuZGxlICVkIGhhcyBub3QgYmVlbiBhbGxvY2F0ZWQgeWV0IChuZXh0IGlzICVkKSIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtb2R1bGUsIG1OZXh0TW9kdWxlSGFuZGxlKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgKmlucHV0ID0gbU5leHRJb0hhbmRsZSsrOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2gqIC8qcGF0Y2gqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90KiBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLypkZWxheU1zKi8pIG92ZXJyaWRlIHsKKyAgICAgICAgKmhhbmRsZSA9IG1OZXh0UGF0Y2hIYW5kbGUrKzsKKyAgICAgICAgbUFjdGl2ZVBhdGNoZXMuaW5zZXJ0KCpoYW5kbGUpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKmRlbGF5TXMqLykgb3ZlcnJpZGUgeworICAgICAgICBpZiAobUFjdGl2ZVBhdGNoZXMuZXJhc2UoaGFuZGxlKSAhPSAxKSB7CisgICAgICAgICAgICBpZiAoaGFuZGxlID49IG1OZXh0UGF0Y2hIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFBhdGNoIGhhbmRsZSAlZCBoYXMgbm90IGJlZW4gYWxsb2NhdGVkIHlldCAobmV4dCBpcyAlZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGhhbmRsZSwgbU5leHRQYXRjaEhhbmRsZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQXR0ZW1wdCB0byByZWxlYXNlIHBhdGNoICVkIHR3aWNlIiwgX19mdW5jX18sIGhhbmRsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICAvLyBIZWxwZXIgbWV0aG9kcyBmb3IgdGVzdHMKKyAgICBzaXplX3QgZ2V0QWN0aXZlUGF0Y2hlc0NvdW50KCkgY29uc3QgeyByZXR1cm4gbUFjdGl2ZVBhdGNoZXMuc2l6ZSgpOyB9CisKKyAgcHJpdmF0ZToKKyAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbU5leHRNb2R1bGVIYW5kbGUgPSBBVURJT19NT0RVTEVfSEFORExFX05PTkUgKyAxOworICAgIGF1ZGlvX2lvX2hhbmRsZV90IG1OZXh0SW9IYW5kbGUgPSBBVURJT19JT19IQU5ETEVfTk9ORSArIDE7CisgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbU5leHRQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FICsgMTsKKyAgICBzdGQ6OnNldDxhdWRpb19wYXRjaF9oYW5kbGVfdD4gbUFjdGl2ZVBhdGNoZXM7Cit9OworCitjbGFzcyBBdWRpb1BvbGljeU1hbmFnZXJUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworICBwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCk7CisgICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCk7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdENsaWVudD4gbUNsaWVudDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QXVkaW9Qb2xpY3lUZXN0TWFuYWdlcj4gbU1hbmFnZXI7Cit9OworCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlclRlc3Q6OlNldFVwKCkgeworICAgIG1DbGllbnQucmVzZXQobmV3IEF1ZGlvUG9saWN5TWFuYWdlclRlc3RDbGllbnQpOworICAgIG1NYW5hZ2VyLnJlc2V0KG5ldyBBdWRpb1BvbGljeVRlc3RNYW5hZ2VyKG1DbGllbnQuZ2V0KCkpKTsKKyAgICBtTWFuYWdlci0+Z2V0Q29uZmlnKCkuc2V0RGVmYXVsdCgpOworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbU1hbmFnZXItPmluaXRpYWxpemUoKSk7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtTWFuYWdlci0+aW5pdENoZWNrKCkpOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlclRlc3Q6OlRlYXJEb3duKCkgeworICAgIG1NYW5hZ2VyLnJlc2V0KCk7CisgICAgbUNsaWVudC5yZXNldCgpOworfQorCitURVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdCwgSW5pdFN1Y2Nlc3MpIHsKKyAgICAvLyBTZXRVcCBtdXN0IGZpbmlzaCB3aXRoIG5vIGFzc2VydGlvbnMuCit9CisKK1RFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0LCBDcmVhdGVBdWRpb1BhdGNoRmFpbHVyZSkgeworICAgIGF1ZGlvX3BhdGNoIHBhdGNoe307CisgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgY29uc3Qgc2l6ZV90IHBhdGNoQ291bnRCZWZvcmUgPSBtQ2xpZW50LT5nZXRBY3RpdmVQYXRjaGVzQ291bnQoKTsKKyAgICBBU1NFUlRfRVEoQkFEX1ZBTFVFLCBtTWFuYWdlci0+Y3JlYXRlQXVkaW9QYXRjaChudWxscHRyLCAmaGFuZGxlLCAwKSk7CisgICAgQVNTRVJUX0VRKEJBRF9WQUxVRSwgbU1hbmFnZXItPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLCBudWxscHRyLCAwKSk7CisgICAgQVNTRVJUX0VRKEJBRF9WQUxVRSwgbU1hbmFnZXItPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLCAmaGFuZGxlLCAwKSk7CisgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSBBVURJT19QQVRDSF9QT1JUU19NQVggKyAxOworICAgIHBhdGNoLm51bV9zaW5rcyA9IDE7CisgICAgQVNTRVJUX0VRKEJBRF9WQUxVRSwgbU1hbmFnZXItPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLCAmaGFuZGxlLCAwKSk7CisgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAxOworICAgIHBhdGNoLm51bV9zaW5rcyA9IEFVRElPX1BBVENIX1BPUlRTX01BWCArIDE7CisgICAgQVNTRVJUX0VRKEJBRF9WQUxVRSwgbU1hbmFnZXItPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLCAmaGFuZGxlLCAwKSk7CisgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAyOworICAgIHBhdGNoLm51bV9zaW5rcyA9IDE7CisgICAgQVNTRVJUX0VRKElOVkFMSURfT1BFUkFUSU9OLCBtTWFuYWdlci0+Y3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsICZoYW5kbGUsIDApKTsKKyAgICBwYXRjaCA9IHt9OworICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMTsKKyAgICBwYXRjaC5zb3VyY2VzWzBdLnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU0lOSzsKKyAgICBwYXRjaC5udW1fc2lua3MgPSAxOworICAgIHBhdGNoLnNpbmtzWzBdLnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU0lOSzsKKyAgICBBU1NFUlRfRVEoSU5WQUxJRF9PUEVSQVRJT04sIG1NYW5hZ2VyLT5jcmVhdGVBdWRpb1BhdGNoKCZwYXRjaCwgJmhhbmRsZSwgMCkpOworICAgIHBhdGNoID0ge307CisgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAxOworICAgIHBhdGNoLnNvdXJjZXNbMF0ucm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0U7CisgICAgcGF0Y2gubnVtX3NpbmtzID0gMTsKKyAgICBwYXRjaC5zaW5rc1swXS5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRTsKKyAgICBBU1NFUlRfRVEoSU5WQUxJRF9PUEVSQVRJT04sIG1NYW5hZ2VyLT5jcmVhdGVBdWRpb1BhdGNoKCZwYXRjaCwgJmhhbmRsZSwgMCkpOworICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBoYW5kbGUgaXMgbGVmdCB1bmNoYW5nZWQuCisgICAgQVNTRVJUX0VRKEFVRElPX1BBVENIX0hBTkRMRV9OT05FLCBoYW5kbGUpOworICAgIEFTU0VSVF9FUShwYXRjaENvdW50QmVmb3JlLCBtQ2xpZW50LT5nZXRBY3RpdmVQYXRjaGVzQ291bnQoKSk7Cit9CisKK1RFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0LCBDcmVhdGVBdWRpb1BhdGNoRnJvbU1peCkgeworICAgIGF1ZGlvX3BhdGNoIHBhdGNoe307CisgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgdWlkX3QgdWlkID0gNDI7CisgICAgY29uc3Qgc2l6ZV90IHBhdGNoQ291bnRCZWZvcmUgPSBtQ2xpZW50LT5nZXRBY3RpdmVQYXRjaGVzQ291bnQoKTsKKyAgICBwYXRjaC5udW1fc291cmNlcyA9IDE7CisgICAgeworICAgICAgICBhdXRvJiBzcmMgPSBwYXRjaC5zb3VyY2VzWzBdOworICAgICAgICBzcmMucm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0U7CisgICAgICAgIHNyYy50eXBlID0gQVVESU9fUE9SVF9UWVBFX01JWDsKKyAgICAgICAgc3JjLmlkID0gbU1hbmFnZXItPmdldENvbmZpZygpLmdldEF2YWlsYWJsZUlucHV0RGV2aWNlcygpWzBdLT5nZXRJZCgpOworICAgICAgICAvLyBOb3RlOiB0aGVzZSBhcmUgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIG91dHB1dCBkZXZpY2UuCisgICAgICAgIHNyYy5zYW1wbGVfcmF0ZSA9IDQ0MTAwOworICAgICAgICBzcmMuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgICAgIHNyYy5jaGFubmVsX21hc2sgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisgICAgfQorICAgIHBhdGNoLm51bV9zaW5rcyA9IDE7CisgICAgeworICAgICAgICBhdXRvJiBzaW5rID0gcGF0Y2guc2lua3NbMF07CisgICAgICAgIHNpbmsucm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TSU5LOworICAgICAgICBzaW5rLnR5cGUgPSBBVURJT19QT1JUX1RZUEVfREVWSUNFOworICAgICAgICBzaW5rLmlkID0gbU1hbmFnZXItPmdldENvbmZpZygpLmdldERlZmF1bHRPdXRwdXREZXZpY2UoKS0+Z2V0SWQoKTsKKyAgICB9CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtTWFuYWdlci0+Y3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsICZoYW5kbGUsIHVpZCkpOworICAgIEFTU0VSVF9ORShBVURJT19QQVRDSF9IQU5ETEVfTk9ORSwgaGFuZGxlKTsKKyAgICBBU1NFUlRfRVEocGF0Y2hDb3VudEJlZm9yZSArIDEsIG1DbGllbnQtPmdldEFjdGl2ZVBhdGNoZXNDb3VudCgpKTsKK30KKworLy8gVE9ETzogQWRkIHBhdGNoIGNyZWF0aW9uIHRlc3RzIHRoYXQgaW52b2x2ZSBhbHJlYWR5IGV4aXN0aW5nIHBhdGNoCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5tawppbmRleCA3ZWMzY2NiLi45NjI2MWFiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsKQEAgLTUxLDYgKzUxLDcgQEAKICAgICBkZXZpY2UzL1N0YXR1c1RyYWNrZXIuY3BwIFwKICAgICBkZXZpY2UzL0NhbWVyYTNCdWZmZXJNYW5hZ2VyLmNwcCBcCiAgICAgZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuY3BwIFwKKyAgICBkZXZpY2UzL0Rpc3RvcnRpb25NYXBwZXIuY3BwIFwKICAgICBndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmNwcCBcCiAgICAgdXRpbHMvQ2FtZXJhVHJhY2VzLmNwcCBcCiAgICAgdXRpbHMvQXV0b0NvbmRpdGlvbkxvY2suY3BwIFwKQEAgLTYwLDYgKzYxLDcgQEAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVM6PSBcCiAgICAgbGlidWkgXAogICAgIGxpYmxvZyBcCisgICAgbGlidXRpbHNjYWxsc3RhY2sgXAogICAgIGxpYnV0aWxzIFwKICAgICBsaWJiaW5kZXIgXAogICAgIGxpYmN1dGlscyBcCkBAIC03OCw3ICs4MCw4IEBACiAgICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi40IFwKICAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMS4wIFwKICAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy4yIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy4zCisgICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMyBcCisgICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuNAogCiBMT0NBTF9FWFBPUlRfU0hBUkVEX0xJQlJBUllfSEVBREVSUyA6PSBsaWJiaW5kZXIgbGliY2FtZXJhX2NsaWVudCBsaWJmbXEKIApAQCAtOTEsOSArOTQsMTEgQEAKIAogTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXh0cmEgLVdlcnJvcgogCi0jIFdvcmthcm91bmQgZm9yIGludmFsaWQgdW51c2VkLWxhbWJkYS1jYXB0dXJlIHdhcm5pbmcgaHR0cDovL2IvMzgzNDk0OTEKLUxPQ0FMX0NMQU5HX0NGTEFHUyArPSAtV25vLWVycm9yPXVudXNlZC1sYW1iZGEtY2FwdHVyZQotCiBMT0NBTF9NT0RVTEU6PSBsaWJjYW1lcmFzZXJ2aWNlCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworIyBCdWlsZCB0ZXN0cyB0b28KKworaW5jbHVkZSAkKExPQ0FMX1BBVEgpL3Rlc3RzL0FuZHJvaWQubWsKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhRmxhc2hsaWdodC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFGbGFzaGxpZ2h0LmNwcAppbmRleCBlMDZhODFmLi40NzFjNzdkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFGbGFzaGxpZ2h0LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFGbGFzaGxpZ2h0LmNwcApAQCAtMzIsMTMgKzMyLDE1IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpUb3JjaE1vZGVTdGF0dXM7CisKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gQ2FtZXJhRmxhc2hsaWdodCBpbXBsZW1lbnRhdGlvbiBiZWdpbnMKIC8vIHVzZWQgYnkgY2FtZXJhIHNlcnZpY2UgdG8gY29udHJvbCBmbGFzaGZsaWdodC4KIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBDYW1lcmFGbGFzaGxpZ2h0OjpDYW1lcmFGbGFzaGxpZ2h0KHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gcHJvdmlkZXJNYW5hZ2VyLAotICAgICAgICBjYW1lcmFfbW9kdWxlX2NhbGxiYWNrc190KiBjYWxsYmFja3MpIDoKKyAgICAgICAgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpTdGF0dXNMaXN0ZW5lciogY2FsbGJhY2tzKSA6CiAgICAgICAgIG1Qcm92aWRlck1hbmFnZXIocHJvdmlkZXJNYW5hZ2VyKSwKICAgICAgICAgbUNhbGxiYWNrcyhjYWxsYmFja3MpLAogICAgICAgICBtRmxhc2hsaWdodE1hcEluaXRpYWxpemVkKGZhbHNlKSB7CkBAIC01OSw3ICs2MSw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gT25seSBIQUwxIGRldmljZXMgZG8gbm90IHN1cHBvcnQgc2V0VG9yY2hNb2RlCiAgICAgICAgIG1GbGFzaENvbnRyb2wgPQotICAgICAgICAgICAgICAgIG5ldyBDYW1lcmFIYXJkd2FyZUludGVyZmFjZUZsYXNoQ29udHJvbChtUHJvdmlkZXJNYW5hZ2VyLCAqbUNhbGxiYWNrcyk7CisgICAgICAgICAgICAgICAgbmV3IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlRmxhc2hDb250cm9sKG1Qcm92aWRlck1hbmFnZXIsIG1DYWxsYmFja3MpOwogICAgIH0KIAogICAgIHJldHVybiBPSzsKQEAgLTExOCwxOSArMTIwLDE1IEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAotaW50IENhbWVyYUZsYXNobGlnaHQ6OmdldE51bWJlck9mQ2FtZXJhcygpIHsKLSAgICByZXR1cm4gbVByb3ZpZGVyTWFuYWdlci0+Z2V0QVBJMUNvbXBhdGlibGVDYW1lcmFDb3VudCgpOwotfQotCiBzdGF0dXNfdCBDYW1lcmFGbGFzaGxpZ2h0OjpmaW5kRmxhc2hVbml0cygpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAgICAgc3RhdHVzX3QgcmVzOwogCiAgICAgc3RkOjp2ZWN0b3I8U3RyaW5nOD4gY2FtZXJhSWRzOwotICAgIGludCBudW1iZXJPZkNhbWVyYXMgPSBnZXROdW1iZXJPZkNhbWVyYXMoKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gaWRzID0gbVByb3ZpZGVyTWFuYWdlci0+Z2V0QVBJMUNvbXBhdGlibGVDYW1lcmFEZXZpY2VJZHMoKTsKKyAgICBpbnQgbnVtYmVyT2ZDYW1lcmFzID0gc3RhdGljX2Nhc3Q8aW50PihpZHMuc2l6ZSgpKTsKICAgICBjYW1lcmFJZHMucmVzaXplKG51bWJlck9mQ2FtZXJhcyk7CiAgICAgLy8gTm8gbW9kdWxlLCBtdXN0IGJlIHByb3ZpZGVyCi0gICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGlkcyA9IG1Qcm92aWRlck1hbmFnZXItPmdldEFQSTFDb21wYXRpYmxlQ2FtZXJhRGV2aWNlSWRzKCk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYW1lcmFJZHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgY2FtZXJhSWRzW2ldID0gU3RyaW5nOChpZHNbaV0uY19zdHIoKSk7CiAgICAgfQpAQCAtMTg0LDcgKzE4Miw4IEBACiAKICAgICBzc2l6ZV90IGluZGV4ID0gbUhhc0ZsYXNobGlnaHRNYXAuaW5kZXhPZktleShjYW1lcmFJZCk7CiAgICAgaWYgKGluZGV4ID09IE5BTUVfTk9UX0ZPVU5EKSB7Ci0gICAgICAgIEFMT0dFKCIlczogY2FtZXJhICVzIG5vdCBwcmVzZW50IHdoZW4gZmluZEZsYXNoVW5pdHMoKSB3YXMgY2FsbGVkIiwKKyAgICAgICAgLy8gTWlnaHQgYmUgZXh0ZXJuYWwgY2FtZXJhCisgICAgICAgIEFMT0dXKCIlczogY2FtZXJhICVzIG5vdCBwcmVzZW50IHdoZW4gZmluZEZsYXNoVW5pdHMoKSB3YXMgY2FsbGVkIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLnN0cmluZygpKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTIxOCwxMiArMjE3LDEzIEBACiAKICAgICAgICAgaWYgKG1PcGVuZWRDYW1lcmFJZHMuc2l6ZSgpID09IDApIHsKICAgICAgICAgICAgIC8vIG5vdGlmeSB0b3JjaCB1bmF2YWlsYWJsZSBmb3IgYWxsIGNhbWVyYXMgd2l0aCBhIGZsYXNoCi0gICAgICAgICAgICBpbnQgbnVtQ2FtZXJhcyA9IGdldE51bWJlck9mQ2FtZXJhcygpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGlkcyA9IG1Qcm92aWRlck1hbmFnZXItPmdldEFQSTFDb21wYXRpYmxlQ2FtZXJhRGV2aWNlSWRzKCk7CisgICAgICAgICAgICBpbnQgbnVtQ2FtZXJhcyA9IHN0YXRpY19jYXN0PGludD4oaWRzLnNpemUoKSk7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNhbWVyYXM7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChoYXNGbGFzaFVuaXRMb2NrZWQoU3RyaW5nODo6Zm9ybWF0KCIlZCIsIGkpKSkgewotICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tzLT50b3JjaF9tb2RlX3N0YXR1c19jaGFuZ2UobUNhbGxiYWNrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4Ojpmb3JtYXQoIiVkIiwgaSkuc3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVE9SQ0hfTU9ERV9TVEFUVVNfTk9UX0FWQUlMQUJMRSk7CisgICAgICAgICAgICAgICAgU3RyaW5nOCBpZDgoaWRzW2ldLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGlmIChoYXNGbGFzaFVuaXRMb2NrZWQoaWQ4KSkgeworICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tzLT5vblRvcmNoU3RhdHVzQ2hhbmdlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDgsIFRvcmNoTW9kZVN0YXR1czo6Tk9UX0FWQUlMQUJMRSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yNjMsMTIgKzI2MywxMyBAQAogCiAgICAgaWYgKGlzQmFja3dhcmRDb21wYXRpYmxlTW9kZShjYW1lcmFJZCkpIHsKICAgICAgICAgLy8gbm90aWZ5IHRvcmNoIGF2YWlsYWJsZSBmb3IgYWxsIGNhbWVyYXMgd2l0aCBhIGZsYXNoCi0gICAgICAgIGludCBudW1DYW1lcmFzID0gZ2V0TnVtYmVyT2ZDYW1lcmFzKCk7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBpZHMgPSBtUHJvdmlkZXJNYW5hZ2VyLT5nZXRBUEkxQ29tcGF0aWJsZUNhbWVyYURldmljZUlkcygpOworICAgICAgICBpbnQgbnVtQ2FtZXJhcyA9IHN0YXRpY19jYXN0PGludD4oaWRzLnNpemUoKSk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ2FtZXJhczsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaGFzRmxhc2hVbml0TG9ja2VkKFN0cmluZzg6OmZvcm1hdCgiJWQiLCBpKSkpIHsKLSAgICAgICAgICAgICAgICBtQ2FsbGJhY2tzLT50b3JjaF9tb2RlX3N0YXR1c19jaGFuZ2UobUNhbGxiYWNrcywKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzg6OmZvcm1hdCgiJWQiLCBpKS5zdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRPUkNIX01PREVfU1RBVFVTX0FWQUlMQUJMRV9PRkYpOworICAgICAgICAgICAgU3RyaW5nOCBpZDgoaWRzW2ldLmNfc3RyKCkpOworICAgICAgICAgICAgaWYgKGhhc0ZsYXNoVW5pdExvY2tlZChpZDgpKSB7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrcy0+b25Ub3JjaFN0YXR1c0NoYW5nZWQoCisgICAgICAgICAgICAgICAgICAgICAgICBpZDgsIFRvcmNoTW9kZVN0YXR1czo6QVZBSUxBQkxFX09GRik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0zMTUsOSArMzE2LDkgQEAKIAogQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2VGbGFzaENvbnRyb2w6OkNhbWVyYUhhcmR3YXJlSW50ZXJmYWNlRmxhc2hDb250cm9sKAogICAgICAgICBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIsCi0gICAgICAgIGNvbnN0IGNhbWVyYV9tb2R1bGVfY2FsbGJhY2tzX3QmIGNhbGxiYWNrcykgOgorICAgICAgICBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlN0YXR1c0xpc3RlbmVyKiBjYWxsYmFja3MpIDoKICAgICAgICAgbVByb3ZpZGVyTWFuYWdlcihtYW5hZ2VyKSwKLSAgICAgICAgbUNhbGxiYWNrcygmY2FsbGJhY2tzKSwKKyAgICAgICAgbUNhbGxiYWNrcyhjYWxsYmFja3MpLAogICAgICAgICBtVG9yY2hFbmFibGVkKGZhbHNlKSB7CiB9CiAKQEAgLTMzMyw4ICszMzQsNyBAQAogICAgICAgICBpZiAobUNhbGxiYWNrcykgewogICAgICAgICAgICAgQUxPR1YoIiVzOiBub3RpZnkgdGhlIGZyYW1ld29yayB0aGF0IHRvcmNoIHdhcyB0dXJuZWQgb2ZmIiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgIG1DYWxsYmFja3MtPnRvcmNoX21vZGVfc3RhdHVzX2NoYW5nZShtQ2FsbGJhY2tzLAotICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhSWQuc3RyaW5nKCksIFRPUkNIX01PREVfU1RBVFVTX0FWQUlMQUJMRV9PRkYpOworICAgICAgICAgICAgbUNhbGxiYWNrcy0+b25Ub3JjaFN0YXR1c0NoYW5nZWQobUNhbWVyYUlkLCBUb3JjaE1vZGVTdGF0dXM6OkFWQUlMQUJMRV9PRkYpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtMzY4LDggKzM2OCw3IEBACiAgICAgICAgIC8vIGRpc2FibGluZyB0aGUgdG9yY2ggbW9kZSBvZiBjdXJyZW50bHkgb3BlbmVkIGRldmljZQogICAgICAgICBkaXNjb25uZWN0Q2FtZXJhRGV2aWNlKCk7CiAgICAgICAgIG1Ub3JjaEVuYWJsZWQgPSBmYWxzZTsKLSAgICAgICAgbUNhbGxiYWNrcy0+dG9yY2hfbW9kZV9zdGF0dXNfY2hhbmdlKG1DYWxsYmFja3MsCi0gICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSwgVE9SQ0hfTU9ERV9TVEFUVVNfQVZBSUxBQkxFX09GRik7CisgICAgICAgIG1DYWxsYmFja3MtPm9uVG9yY2hTdGF0dXNDaGFuZ2VkKGNhbWVyYUlkLCBUb3JjaE1vZGVTdGF0dXM6OkFWQUlMQUJMRV9PRkYpOwogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCkBAIC0zNzksOCArMzc4LDcgQEAKICAgICB9CiAKICAgICBtVG9yY2hFbmFibGVkID0gdHJ1ZTsKLSAgICBtQ2FsbGJhY2tzLT50b3JjaF9tb2RlX3N0YXR1c19jaGFuZ2UobUNhbGxiYWNrcywKLSAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpLCBUT1JDSF9NT0RFX1NUQVRVU19BVkFJTEFCTEVfT04pOworICAgIG1DYWxsYmFja3MtPm9uVG9yY2hTdGF0dXNDaGFuZ2VkKGNhbWVyYUlkLCBUb3JjaE1vZGVTdGF0dXM6OkFWQUlMQUJMRV9PTik7CiAgICAgcmV0dXJuIE9LOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFGbGFzaGxpZ2h0LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFGbGFzaGxpZ2h0LmgKaW5kZXggYzg2ZWU4NS4uMWJhYWJhMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhRmxhc2hsaWdodC5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUZsYXNobGlnaHQuaApAQCAtMTksNyArMTksNiBAQAogCiAjaW5jbHVkZSA8Z3VpL0dMQ29uc3VtZXIuaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2NhbWVyYV9jb21tb24uaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgogI2luY2x1ZGUgImNvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuaCIKQEAgLTU1LDcgKzU0LDcgQEAKIGNsYXNzIENhbWVyYUZsYXNobGlnaHQgOiBwdWJsaWMgdmlydHVhbCBWaXJ0dWFsTGlnaHRSZWZCYXNlIHsKICAgICBwdWJsaWM6CiAgICAgICAgIENhbWVyYUZsYXNobGlnaHQoc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBwcm92aWRlck1hbmFnZXIsCi0gICAgICAgICAgICAgICAgY2FtZXJhX21vZHVsZV9jYWxsYmFja3NfdCogY2FsbGJhY2tzKTsKKyAgICAgICAgICAgICAgICBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlN0YXR1c0xpc3RlbmVyKiBjYWxsYmFja3MpOwogICAgICAgICB2aXJ0dWFsIH5DYW1lcmFGbGFzaGxpZ2h0KCk7CiAKICAgICAgICAgLy8gRmluZCBhbGwgZmxhc2ggdW5pdHMuIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIG90aGVyIG1ldGhvZHMuIEFsbApAQCAtOTMsMTMgKzkyLDExIEBACiAgICAgICAgIC8vIG9wZW5pbmcgY2FtZXJhcykKICAgICAgICAgYm9vbCBpc0JhY2t3YXJkQ29tcGF0aWJsZU1vZGUoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQpOwogCi0gICAgICAgIGludCBnZXROdW1iZXJPZkNhbWVyYXMoKTsKLQogICAgICAgICBzcDxGbGFzaENvbnRyb2xCYXNlPiBtRmxhc2hDb250cm9sOwogCiAgICAgICAgIHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbVByb3ZpZGVyTWFuYWdlcjsKIAotICAgICAgICBjb25zdCBjYW1lcmFfbW9kdWxlX2NhbGxiYWNrc190ICptQ2FsbGJhY2tzOworICAgICAgICBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlN0YXR1c0xpc3RlbmVyKiBtQ2FsbGJhY2tzOwogICAgICAgICBTb3J0ZWRWZWN0b3I8U3RyaW5nOD4gbU9wZW5lZENhbWVyYUlkczsKIAogICAgICAgICAvLyBjYW1lcmEgaWQgLT4gaWYgaXQgaGFzIGEgZmxhc2ggdW5pdApAQCAtMTM0LDcgKzEzMSw3IEBACiAgICAgcHVibGljOgogICAgICAgICBDYW1lcmFIYXJkd2FyZUludGVyZmFjZUZsYXNoQ29udHJvbCgKICAgICAgICAgICAgICAgICBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIsCi0gICAgICAgICAgICAgICAgY29uc3QgY2FtZXJhX21vZHVsZV9jYWxsYmFja3NfdCYgY2FsbGJhY2tzKTsKKyAgICAgICAgICAgICAgICBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlN0YXR1c0xpc3RlbmVyKiBjYWxsYmFja3MpOwogICAgICAgICB2aXJ0dWFsIH5DYW1lcmFIYXJkd2FyZUludGVyZmFjZUZsYXNoQ29udHJvbCgpOwogCiAgICAgICAgIC8vIEZsYXNoQ29udHJvbEJhc2UKQEAgLTE2Niw3ICsxNjMsNyBAQAogICAgICAgICBzdGF0dXNfdCBoYXNGbGFzaFVuaXRMb2NrZWQoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGJvb2wgKmhhc0ZsYXNoLCBib29sIGtlZXBEZXZpY2VPcGVuKTsKIAogICAgICAgICBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1Qcm92aWRlck1hbmFnZXI7Ci0gICAgICAgIGNvbnN0IGNhbWVyYV9tb2R1bGVfY2FsbGJhY2tzX3QgKm1DYWxsYmFja3M7CisgICAgICAgIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6U3RhdHVzTGlzdGVuZXIqIG1DYWxsYmFja3M7CiAgICAgICAgIHNwPENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlPiBtRGV2aWNlOwogICAgICAgICBTdHJpbmc4IG1DYW1lcmFJZDsKICAgICAgICAgQ2FtZXJhUGFyYW1ldGVycyBtUGFyYW1ldGVyczsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKaW5kZXggMjBiZDVlNC4uMjgyODcxYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKQEAgLTMzLDE0ICszMywxOCBAQAogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL21hY3Jvcy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wYXJzZWludC5oPgorI2luY2x1ZGUgPGJpbmRlci9BY3Rpdml0eU1hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvQXBwT3BzTWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5QmFzZS5oPgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlIZWFwQmFzZS5oPgorI2luY2x1ZGUgPGJpbmRlci9QZXJtaXNzaW9uQ29udHJvbGxlci5oPgogI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzSW5mb1NlcnZpY2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVJlc3VsdFJlY2VpdmVyLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL21pc2MuaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgogI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWVtdW5yZWFjaGFibGUvbWVtdW5yZWFjaGFibGUuaD4KQEAgLTYzLDYgKzY3LDcgQEAKICNpbmNsdWRlICJhcGkxL0NhbWVyYTJDbGllbnQuaCIKICNpbmNsdWRlICJhcGkyL0NhbWVyYURldmljZUNsaWVudC5oIgogI2luY2x1ZGUgInV0aWxzL0NhbWVyYVRyYWNlcy5oIgorI2luY2x1ZGUgInV0aWxzL1RhZ01vbml0b3IuaCIKIAogbmFtZXNwYWNlIHsKICAgICBjb25zdCBjaGFyKiBrUGVybWlzc2lvblNlcnZpY2VOYW1lID0gInBlcm1pc3Npb24iOwpAQCAtMTAzLDc3ICsxMDgsMTMgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1leHRlcm4gIkMiIHsKLXN0YXRpYyB2b2lkIGNhbWVyYV9kZXZpY2Vfc3RhdHVzX2NoYW5nZSgKLSAgICAgICAgY29uc3Qgc3RydWN0IGNhbWVyYV9tb2R1bGVfY2FsbGJhY2tzKiBjYWxsYmFja3MsCi0gICAgICAgIGludCBjYW1lcmFfaWQsCi0gICAgICAgIGludCBuZXdfc3RhdHVzKSB7Ci0gICAgc3A8Q2FtZXJhU2VydmljZT4gY3MgPSBjb25zdF9jYXN0PENhbWVyYVNlcnZpY2UqPigKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IENhbWVyYVNlcnZpY2UqPihjYWxsYmFja3MpKTsKLSAgICBTdHJpbmc4IGlkID0gU3RyaW5nODo6Zm9ybWF0KCIlZCIsIGNhbWVyYV9pZCk7Ci0KLSAgICBDYW1lcmFEZXZpY2VTdGF0dXMgbmV3U3RhdHVze0NhbWVyYURldmljZVN0YXR1czo6Tk9UX1BSRVNFTlR9OwotICAgIHN3aXRjaCAobmV3X3N0YXR1cykgewotICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfU1RBVFVTX05PVF9QUkVTRU5UOgotICAgICAgICAgICAgbmV3U3RhdHVzID0gQ2FtZXJhRGV2aWNlU3RhdHVzOjpOT1RfUFJFU0VOVDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfU1RBVFVTX1BSRVNFTlQ6Ci0gICAgICAgICAgICBuZXdTdGF0dXMgPSBDYW1lcmFEZXZpY2VTdGF0dXM6OlBSRVNFTlQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX1NUQVRVU19FTlVNRVJBVElORzoKLSAgICAgICAgICAgIG5ld1N0YXR1cyA9IENhbWVyYURldmljZVN0YXR1czo6RU5VTUVSQVRJTkc7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dXKCJVbmtub3duIGRldmljZSBzdGF0dXMgY2hhbmdlIHRvICVkIiwgbmV3X3N0YXR1cyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgY3MtPm9uRGV2aWNlU3RhdHVzQ2hhbmdlZChpZCwgbmV3U3RhdHVzKTsKLX0KLQotc3RhdGljIHZvaWQgdG9yY2hfbW9kZV9zdGF0dXNfY2hhbmdlKAotICAgICAgICBjb25zdCBzdHJ1Y3QgY2FtZXJhX21vZHVsZV9jYWxsYmFja3MqIGNhbGxiYWNrcywKLSAgICAgICAgY29uc3QgY2hhciogY2FtZXJhX2lkLAotICAgICAgICBpbnQgbmV3X3N0YXR1cykgewotICAgIGlmICghY2FsbGJhY2tzIHx8ICFjYW1lcmFfaWQpIHsKLSAgICAgICAgQUxPR0UoIiVzIGludmFsaWQgcGFyYW1ldGVycy4gY2FsbGJhY2tzICVwLCBjYW1lcmFfaWQgJXAiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgY2FsbGJhY2tzLCBjYW1lcmFfaWQpOwotICAgIH0KLSAgICBzcDxDYW1lcmFTZXJ2aWNlPiBjcyA9IGNvbnN0X2Nhc3Q8Q2FtZXJhU2VydmljZSo+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBDYW1lcmFTZXJ2aWNlKj4oY2FsbGJhY2tzKSk7Ci0KLSAgICBUb3JjaE1vZGVTdGF0dXMgc3RhdHVzOwotICAgIHN3aXRjaCAobmV3X3N0YXR1cykgewotICAgICAgICBjYXNlIFRPUkNIX01PREVfU1RBVFVTX05PVF9BVkFJTEFCTEU6Ci0gICAgICAgICAgICBzdGF0dXMgPSBUb3JjaE1vZGVTdGF0dXM6Ok5PVF9BVkFJTEFCTEU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUT1JDSF9NT0RFX1NUQVRVU19BVkFJTEFCTEVfT0ZGOgotICAgICAgICAgICAgc3RhdHVzID0gVG9yY2hNb2RlU3RhdHVzOjpBVkFJTEFCTEVfT0ZGOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVE9SQ0hfTU9ERV9TVEFUVVNfQVZBSUxBQkxFX09OOgotICAgICAgICAgICAgc3RhdHVzID0gVG9yY2hNb2RlU3RhdHVzOjpBVkFJTEFCTEVfT047Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dFKCJVbmtub3duIHRvcmNoIHN0YXR1cyAlZCIsIG5ld19zdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGNzLT5vblRvcmNoU3RhdHVzQ2hhbmdlZCgKLSAgICAgICAgU3RyaW5nOChjYW1lcmFfaWQpLAotICAgICAgICBzdGF0dXMpOwotfQotfSAvLyBleHRlcm4gIkMiCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyBjb25zdCBTdHJpbmcxNiBzTWFuYWdlQ2FtZXJhUGVybWlzc2lvbigiYW5kcm9pZC5wZXJtaXNzaW9uLk1BTkFHRV9DQU1FUkEiKTsKIAogQ2FtZXJhU2VydmljZTo6Q2FtZXJhU2VydmljZSgpIDoKICAgICAgICAgbUV2ZW50TG9nKERFRkFVTFRfRVZFTlRfTE9HX0xFTkdUSCksCi0gICAgICAgIG1OdW1iZXJPZkNhbWVyYXMoMCksIG1OdW1iZXJPZk5vcm1hbENhbWVyYXMoMCksCisgICAgICAgIG1OdW1iZXJPZkNhbWVyYXMoMCksCiAgICAgICAgIG1Tb3VuZFJlZigwKSwgbUluaXRpYWxpemVkKGZhbHNlKSB7CiAgICAgQUxPR0koIkNhbWVyYVNlcnZpY2Ugc3RhcnRlZCAocGlkPSVkKSIsIGdldHBpZCgpKTsKLQotICAgIHRoaXMtPmNhbWVyYV9kZXZpY2Vfc3RhdHVzX2NoYW5nZSA9IGFuZHJvaWQ6OmNhbWVyYV9kZXZpY2Vfc3RhdHVzX2NoYW5nZTsKLSAgICB0aGlzLT50b3JjaF9tb2RlX3N0YXR1c19jaGFuZ2UgPSBhbmRyb2lkOjp0b3JjaF9tb2RlX3N0YXR1c19jaGFuZ2U7Ci0KICAgICBtU2VydmljZUxvY2tXcmFwcGVyID0gc3RkOjptYWtlX3NoYXJlZDxXYWl0YWJsZU11dGV4V3JhcHBlcj4oJm1TZXJ2aWNlTG9jayk7CiB9CiAKQEAgLTE5Niw3NiArMTM3LDUwIEBACiAgICAgfQogCiAgICAgQ2FtZXJhU2VydmljZTo6cGluZ0NhbWVyYVNlcnZpY2VQcm94eSgpOworCisgICAgbVVpZFBvbGljeSA9IG5ldyBVaWRQb2xpY3kodGhpcyk7CisgICAgbVVpZFBvbGljeS0+cmVnaXN0ZXJTZWxmKCk7CiB9CiAKIHN0YXR1c190IENhbWVyYVNlcnZpY2U6OmVudW1lcmF0ZVByb3ZpZGVycygpIHsKICAgICBzdGF0dXNfdCByZXM7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGwobVNlcnZpY2VMb2NrKTsKIAotICAgIGlmIChudWxscHRyID09IG1DYW1lcmFQcm92aWRlck1hbmFnZXIuZ2V0KCkpIHsKLSAgICAgICAgbUNhbWVyYVByb3ZpZGVyTWFuYWdlciA9IG5ldyBDYW1lcmFQcm92aWRlck1hbmFnZXIoKTsKLSAgICAgICAgcmVzID0gbUNhbWVyYVByb3ZpZGVyTWFuYWdlci0+aW5pdGlhbGl6ZSh0aGlzKTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gaW5pdGlhbGl6ZSBjYW1lcmEgcHJvdmlkZXIgbWFuYWdlcjogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICB9Ci0gICAgfQorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBkZXZpY2VJZHM7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtU2VydmljZUxvY2spOwogCi0gICAgbU51bWJlck9mQ2FtZXJhcyA9IG1DYW1lcmFQcm92aWRlck1hbmFnZXItPmdldENhbWVyYUNvdW50KCk7Ci0gICAgbU51bWJlck9mTm9ybWFsQ2FtZXJhcyA9Ci0gICAgICAgICAgICBtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLT5nZXRBUEkxQ29tcGF0aWJsZUNhbWVyYUNvdW50KCk7Ci0KLSAgICAvLyBTZXR1cCB2ZW5kb3IgdGFncyBiZWZvcmUgd2UgY2FsbCBnZXRfY2FtZXJhX2luZm8gdGhlIGZpcnN0IHRpbWUKLSAgICAvLyBiZWNhdXNlIEhBTCBtaWdodCBuZWVkIHRvIHNldHVwIHN0YXRpYyB2ZW5kb3Iga2V5cyBpbiBnZXRfY2FtZXJhX2luZm8KLSAgICAvLyBUT0RPOiBtYXliZSBwdXQgdGhpcyBpbnRvIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6aW5pdGlhbGl6ZSgpPwotICAgIG1DYW1lcmFQcm92aWRlck1hbmFnZXItPnNldFVwVmVuZG9yVGFncygpOwotCi0gICAgaWYgKG51bGxwdHIgPT0gbUZsYXNobGlnaHQuZ2V0KCkpIHsKLSAgICAgICAgbUZsYXNobGlnaHQgPSBuZXcgQ2FtZXJhRmxhc2hsaWdodChtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLCB0aGlzKTsKLSAgICB9Ci0KLSAgICByZXMgPSBtRmxhc2hsaWdodC0+ZmluZEZsYXNoVW5pdHMoKTsKLSAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZW51bWVyYXRlIGZsYXNoIHVuaXRzOiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgfQotCi0gICAgZm9yIChhdXRvJiBjYW1lcmFJZCA6IG1DYW1lcmFQcm92aWRlck1hbmFnZXItPmdldENhbWVyYURldmljZUlkcygpKSB7Ci0gICAgICAgIFN0cmluZzggaWQ4ID0gU3RyaW5nOChjYW1lcmFJZC5jX3N0cigpKTsKLSAgICAgICAgYm9vbCBjYW1lcmFGb3VuZCA9IGZhbHNlOwotICAgICAgICB7Ci0KLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1DYW1lcmFTdGF0ZXNMb2NrKTsKLSAgICAgICAgICAgIGF1dG8gaXRlciA9IG1DYW1lcmFTdGF0ZXMuZmluZChpZDgpOwotICAgICAgICAgICAgaWYgKGl0ZXIgIT0gbUNhbWVyYVN0YXRlcy5lbmQoKSkgewotICAgICAgICAgICAgICAgIGNhbWVyYUZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghY2FtZXJhRm91bmQpIHsKLSAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhUmVzb3VyY2VDb3N0IGNvc3Q7Ci0gICAgICAgICAgICByZXMgPSBtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLT5nZXRSZXNvdXJjZUNvc3QoY2FtZXJhSWQsICZjb3N0KTsKKyAgICAgICAgaWYgKG51bGxwdHIgPT0gbUNhbWVyYVByb3ZpZGVyTWFuYWdlci5nZXQoKSkgeworICAgICAgICAgICAgbUNhbWVyYVByb3ZpZGVyTWFuYWdlciA9IG5ldyBDYW1lcmFQcm92aWRlck1hbmFnZXIoKTsKKyAgICAgICAgICAgIHJlcyA9IG1DYW1lcmFQcm92aWRlck1hbmFnZXItPmluaXRpYWxpemUodGhpcyk7CiAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBxdWVyeSBkZXZpY2UgcmVzb3VyY2UgY29zdDogJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RkOjpzZXQ8U3RyaW5nOD4gY29uZmxpY3Rpbmc7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvc3QuY29uZmxpY3RpbmdEZXZpY2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgY29uZmxpY3RpbmcuZW1wbGFjZShTdHJpbmc4KGNvc3QuY29uZmxpY3RpbmdEZXZpY2VzW2ldLmNfc3RyKCkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1DYW1lcmFTdGF0ZXNMb2NrKTsKLSAgICAgICAgICAgICAgICBtQ2FtZXJhU3RhdGVzLmVtcGxhY2UoaWQ4LAotICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPENhbWVyYVN0YXRlPihpZDgsIGNvc3QucmVzb3VyY2VDb3N0LCBjb25mbGljdGluZykpOworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGluaXRpYWxpemUgY2FtZXJhIHByb3ZpZGVyIG1hbmFnZXI6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKworICAgICAgICAvLyBTZXR1cCB2ZW5kb3IgdGFncyBiZWZvcmUgd2UgY2FsbCBnZXRfY2FtZXJhX2luZm8gdGhlIGZpcnN0IHRpbWUKKyAgICAgICAgLy8gYmVjYXVzZSBIQUwgbWlnaHQgbmVlZCB0byBzZXR1cCBzdGF0aWMgdmVuZG9yIGtleXMgaW4gZ2V0X2NhbWVyYV9pbmZvCisgICAgICAgIC8vIFRPRE86IG1heWJlIHB1dCB0aGlzIGludG8gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjppbml0aWFsaXplKCk/CisgICAgICAgIG1DYW1lcmFQcm92aWRlck1hbmFnZXItPnNldFVwVmVuZG9yVGFncygpOworCisgICAgICAgIGlmIChudWxscHRyID09IG1GbGFzaGxpZ2h0LmdldCgpKSB7CisgICAgICAgICAgICBtRmxhc2hsaWdodCA9IG5ldyBDYW1lcmFGbGFzaGxpZ2h0KG1DYW1lcmFQcm92aWRlck1hbmFnZXIsIHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgcmVzID0gbUZsYXNobGlnaHQtPmZpbmRGbGFzaFVuaXRzKCk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZW51bWVyYXRlIGZsYXNoIHVuaXRzOiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIH0KKworICAgICAgICBkZXZpY2VJZHMgPSBtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLT5nZXRDYW1lcmFEZXZpY2VJZHMoKTsKKyAgICB9CisKKworICAgIGZvciAoYXV0byYgY2FtZXJhSWQgOiBkZXZpY2VJZHMpIHsKKyAgICAgICAgU3RyaW5nOCBpZDggPSBTdHJpbmc4KGNhbWVyYUlkLmNfc3RyKCkpOwogICAgICAgICBvbkRldmljZVN0YXR1c0NoYW5nZWQoaWQ4LCBDYW1lcmFEZXZpY2VTdGF0dXM6OlBSRVNFTlQpOwotCi0gICAgICAgIGlmIChtRmxhc2hsaWdodC0+aGFzRmxhc2hVbml0KGlkOCkpIHsKLSAgICAgICAgICAgIG1Ub3JjaFN0YXR1c01hcC5hZGQoaWQ4LCBUb3JjaE1vZGVTdGF0dXM6OkFWQUlMQUJMRV9PRkYpOwotICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwpAQCAtMjk0LDEyICsyMDksNjEgQEAKIAogQ2FtZXJhU2VydmljZTo6fkNhbWVyYVNlcnZpY2UoKSB7CiAgICAgVmVuZG9yVGFnRGVzY3JpcHRvcjo6Y2xlYXJHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yKCk7CisgICAgbVVpZFBvbGljeS0+dW5yZWdpc3RlclNlbGYoKTsKIH0KIAogdm9pZCBDYW1lcmFTZXJ2aWNlOjpvbk5ld1Byb3ZpZGVyUmVnaXN0ZXJlZCgpIHsKICAgICBlbnVtZXJhdGVQcm92aWRlcnMoKTsKIH0KIAordm9pZCBDYW1lcmFTZXJ2aWNlOjp1cGRhdGVDYW1lcmFOdW1BbmRJZHMoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVNlcnZpY2VMb2NrKTsKKyAgICBtTnVtYmVyT2ZDYW1lcmFzID0gbUNhbWVyYVByb3ZpZGVyTWFuYWdlci0+Z2V0Q2FtZXJhQ291bnQoKTsKKyAgICBtTm9ybWFsRGV2aWNlSWRzID0KKyAgICAgICAgICAgIG1DYW1lcmFQcm92aWRlck1hbmFnZXItPmdldEFQSTFDb21wYXRpYmxlQ2FtZXJhRGV2aWNlSWRzKCk7Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmljZTo6YWRkU3RhdGVzKGNvbnN0IFN0cmluZzggaWQpIHsKKyAgICBzdGQ6OnN0cmluZyBjYW1lcmFJZChpZC5jX3N0cigpKTsKKyAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYVJlc291cmNlQ29zdCBjb3N0OworICAgIHN0YXR1c190IHJlcyA9IG1DYW1lcmFQcm92aWRlck1hbmFnZXItPmdldFJlc291cmNlQ29zdChjYW1lcmFJZCwgJmNvc3QpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBxdWVyeSBkZXZpY2UgcmVzb3VyY2UgY29zdDogJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN0ZDo6c2V0PFN0cmluZzg+IGNvbmZsaWN0aW5nOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29zdC5jb25mbGljdGluZ0RldmljZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uZmxpY3RpbmcuZW1wbGFjZShTdHJpbmc4KGNvc3QuY29uZmxpY3RpbmdEZXZpY2VzW2ldLmNfc3RyKCkpKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1DYW1lcmFTdGF0ZXNMb2NrKTsKKyAgICAgICAgbUNhbWVyYVN0YXRlcy5lbXBsYWNlKGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPENhbWVyYVN0YXRlPihpZCwgY29zdC5yZXNvdXJjZUNvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmxpY3RpbmcpKTsKKyAgICB9CisKKyAgICBpZiAobUZsYXNobGlnaHQtPmhhc0ZsYXNoVW5pdChpZCkpIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1Ub3JjaFN0YXR1c011dGV4KTsKKyAgICAgICAgbVRvcmNoU3RhdHVzTWFwLmFkZChpZCwgVG9yY2hNb2RlU3RhdHVzOjpBVkFJTEFCTEVfT0ZGKTsKKyAgICB9CisKKyAgICB1cGRhdGVDYW1lcmFOdW1BbmRJZHMoKTsKKyAgICBsb2dEZXZpY2VBZGRlZChpZCwgIkRldmljZSBhZGRlZCIpOworfQorCit2b2lkIENhbWVyYVNlcnZpY2U6OnJlbW92ZVN0YXRlcyhjb25zdCBTdHJpbmc4IGlkKSB7CisgICAgdXBkYXRlQ2FtZXJhTnVtQW5kSWRzKCk7CisgICAgaWYgKG1GbGFzaGxpZ2h0LT5oYXNGbGFzaFVuaXQoaWQpKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhbChtVG9yY2hTdGF0dXNNdXRleCk7CisgICAgICAgIG1Ub3JjaFN0YXR1c01hcC5yZW1vdmVJdGVtKGlkKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1DYW1lcmFTdGF0ZXNMb2NrKTsKKyAgICAgICAgbUNhbWVyYVN0YXRlcy5lcmFzZShpZCk7CisgICAgfQorfQorCiB2b2lkIENhbWVyYVNlcnZpY2U6Om9uRGV2aWNlU3RhdHVzQ2hhbmdlZChjb25zdCBTdHJpbmc4JiBpZCwKICAgICAgICAgQ2FtZXJhRGV2aWNlU3RhdHVzIG5ld0hhbFN0YXR1cykgewogICAgIEFMT0dJKCIlczogU3RhdHVzIGNoYW5nZWQgZm9yIGNhbWVyYUlkPSVzLCBuZXdTdGF0dXM9JWQiLCBfX0ZVTkNUSU9OX18sCkBAIC0zMTEsOCArMjc1LDEzIEBACiAKICAgICBpZiAoc3RhdGUgPT0gbnVsbHB0cikgewogICAgICAgICBpZiAobmV3U3RhdHVzID09IFN0YXR1c0ludGVybmFsOjpQUkVTRU5UKSB7Ci0gICAgICAgICAgICBBTE9HVygiJXM6IFVua25vd24gY2FtZXJhIElEICVzLCBwcm9iYWJseSBuZXdseSByZWdpc3RlcmVkPyIsCisgICAgICAgICAgICBBTE9HSSgiJXM6IFVua25vd24gY2FtZXJhIElEICVzLCBhIG5ldyBjYW1lcmEgaXMgYWRkZWQiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLnN0cmluZygpKTsKKworICAgICAgICAgICAgLy8gRmlyc3QgYWRkIGFzIGFic2VudCB0byBtYWtlIHN1cmUgY2xpZW50cyBhcmUgbm90aWZpZWQgYmVsb3cKKyAgICAgICAgICAgIGFkZFN0YXRlcyhpZCk7CisKKyAgICAgICAgICAgIHVwZGF0ZVN0YXR1cyhuZXdTdGF0dXMsIGlkKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQmFkIGNhbWVyYSBJRCAlcyIsIF9fRlVOQ1RJT05fXywgaWQuc3RyaW5nKCkpOwogICAgICAgICB9CkBAIC0zMjksMTUgKzI5OCwxNiBAQAogICAgIGlmIChuZXdTdGF0dXMgPT0gU3RhdHVzSW50ZXJuYWw6Ok5PVF9QUkVTRU5UKSB7CiAgICAgICAgIGxvZ0RldmljZVJlbW92ZWQoaWQsIFN0cmluZzg6OmZvcm1hdCgiRGV2aWNlIHN0YXR1cyBjaGFuZ2VkIGZyb20gJWQgdG8gJWQiLCBvbGRTdGF0dXMsCiAgICAgICAgICAgICAgICAgbmV3U3RhdHVzKSk7CisKKyAgICAgICAgLy8gU2V0IHRoZSBkZXZpY2Ugc3RhdHVzIHRvIE5PVF9QUkVTRU5ULCBjbGllbnRzIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gY29ubmVjdAorICAgICAgICAvLyB0byB0aGlzIGRldmljZSB1bnRpbCB0aGUgc3RhdHVzIGNoYW5nZXMKKyAgICAgICAgdXBkYXRlU3RhdHVzKFN0YXR1c0ludGVybmFsOjpOT1RfUFJFU0VOVCwgaWQpOworCiAgICAgICAgIHNwPEJhc2ljQ2xpZW50PiBjbGllbnRUb0Rpc2Nvbm5lY3Q7CiAgICAgICAgIHsKICAgICAgICAgICAgIC8vIERvbid0IGRvIHRoaXMgaW4gdXBkYXRlU3RhdHVzIHRvIGF2b2lkIGRlYWRsb2NrIG92ZXIgbVNlcnZpY2VMb2NrCiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2VydmljZUxvY2spOwogCi0gICAgICAgICAgICAvLyBTZXQgdGhlIGRldmljZSBzdGF0dXMgdG8gTk9UX1BSRVNFTlQsIGNsaWVudHMgd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byBjb25uZWN0Ci0gICAgICAgICAgICAvLyB0byB0aGlzIGRldmljZSB1bnRpbCB0aGUgc3RhdHVzIGNoYW5nZXMKLSAgICAgICAgICAgIHVwZGF0ZVN0YXR1cyhTdGF0dXNJbnRlcm5hbDo6Tk9UX1BSRVNFTlQsIGlkKTsKLQogICAgICAgICAgICAgLy8gUmVtb3ZlIGNhY2hlZCBzaGltIHBhcmFtZXRlcnMKICAgICAgICAgICAgIHN0YXRlLT5zZXRTaGltUGFyYW1zKENhbWVyYVBhcmFtZXRlcnMoKSk7CiAKQEAgLTM1OSw2ICszMjksNyBAQAogICAgICAgICAgICAgY2xpZW50VG9EaXNjb25uZWN0LT5kaXNjb25uZWN0KCk7CiAgICAgICAgIH0KIAorICAgICAgICByZW1vdmVTdGF0ZXMoaWQpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChvbGRTdGF0dXMgPT0gU3RhdHVzSW50ZXJuYWw6Ok5PVF9QUkVTRU5UKSB7CiAgICAgICAgICAgICBsb2dEZXZpY2VBZGRlZChpZCwgU3RyaW5nODo6Zm9ybWF0KCJEZXZpY2Ugc3RhdHVzIGNoYW5nZWQgZnJvbSAlZCB0byAlZCIsIG9sZFN0YXR1cywKQEAgLTQzOSw3ICs0MTAsNyBAQAogICAgIE11dGV4OjpBdXRvbG9jayBsKG1TZXJ2aWNlTG9jayk7CiAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgIGNhc2UgQ0FNRVJBX1RZUEVfQkFDS1dBUkRfQ09NUEFUSUJMRToKLSAgICAgICAgICAgICpudW1DYW1lcmFzID0gbU51bWJlck9mTm9ybWFsQ2FtZXJhczsKKyAgICAgICAgICAgICpudW1DYW1lcmFzID0gc3RhdGljX2Nhc3Q8aW50PihtTm9ybWFsRGV2aWNlSWRzLnNpemUoKSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBDQU1FUkFfVFlQRV9BTEw6CiAgICAgICAgICAgICAqbnVtQ2FtZXJhcyA9IG1OdW1iZXJPZkNhbWVyYXM7CkBAIC00NjksNyArNDQwLDggQEAKICAgICB9CiAKICAgICBTdGF0dXMgcmV0ID0gU3RhdHVzOjpvaygpOwotICAgIHN0YXR1c190IGVyciA9IG1DYW1lcmFQcm92aWRlck1hbmFnZXItPmdldENhbWVyYUluZm8oc3RkOjp0b19zdHJpbmcoY2FtZXJhSWQpLCBjYW1lcmFJbmZvKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLT5nZXRDYW1lcmFJbmZvKAorICAgICAgICAgICAgY2FtZXJhSWRJbnRUb1N0ckxvY2tlZChjYW1lcmFJZCksIGNhbWVyYUluZm8pOwogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgcmV0ID0gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9JTlZBTElEX09QRVJBVElPTiwKICAgICAgICAgICAgICAgICAiRXJyb3IgcmV0cmlldmluZyBjYW1lcmEgaW5mbyBmcm9tIGRldmljZSAlZDogJXMgKCVkKSIsIGNhbWVyYUlkLApAQCAtNDc5LDEzICs0NTEsMTkgQEAKICAgICByZXR1cm4gcmV0OwogfQogCi1pbnQgQ2FtZXJhU2VydmljZTo6Y2FtZXJhSWRUb0ludChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCkgewotICAgIGludCBpZDsKLSAgICBib29sIHN1Y2Nlc3MgPSBiYXNlOjpQYXJzZUludChjYW1lcmFJZC5zdHJpbmcoKSwgJmlkLCAwKTsKLSAgICBpZiAoIXN1Y2Nlc3MpIHsKLSAgICAgICAgcmV0dXJuIC0xOworc3RkOjpzdHJpbmcgQ2FtZXJhU2VydmljZTo6Y2FtZXJhSWRJbnRUb1N0ckxvY2tlZChpbnQgY2FtZXJhSWRJbnQpIHsKKyAgICBpZiAoY2FtZXJhSWRJbnQgPCAwIHx8IGNhbWVyYUlkSW50ID49IHN0YXRpY19jYXN0PGludD4obU5vcm1hbERldmljZUlkcy5zaXplKCkpKSB7CisgICAgICAgIEFMT0dFKCIlczogaW5wdXQgaWQgJWQgaW52YWxpZDogdmFsaWQgcmFuZ2UgICgwLCAlenUpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkSW50LCBtTm9ybWFsRGV2aWNlSWRzLnNpemUoKSk7CisgICAgICAgIHJldHVybiBzdGQ6OnN0cmluZ3t9OwogICAgIH0KLSAgICByZXR1cm4gaWQ7CisKKyAgICByZXR1cm4gbU5vcm1hbERldmljZUlkc1tjYW1lcmFJZEludF07Cit9CisKK1N0cmluZzggQ2FtZXJhU2VydmljZTo6Y2FtZXJhSWRJbnRUb1N0cihpbnQgY2FtZXJhSWRJbnQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2VydmljZUxvY2spOworICAgIHJldHVybiBTdHJpbmc4KGNhbWVyYUlkSW50VG9TdHJMb2NrZWQoY2FtZXJhSWRJbnQpLmNfc3RyKCkpOwogfQogCiBTdGF0dXMgQ2FtZXJhU2VydmljZTo6Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNvbnN0IFN0cmluZzE2JiBjYW1lcmFJZCwKQEAgLTYwMiw4ICs1ODAsOCBAQAogCiBTdGF0dXMgQ2FtZXJhU2VydmljZTo6bWFrZUNsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgY29uc3Qgc3A8SUludGVyZmFjZT4mIGNhbWVyYUNiLCBjb25zdCBTdHJpbmcxNiYgcGFja2FnZU5hbWUsIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAotICAgICAgICBpbnQgZmFjaW5nLCBpbnQgY2xpZW50UGlkLCB1aWRfdCBjbGllbnRVaWQsIGludCBzZXJ2aWNlUGlkLCBib29sIGxlZ2FjeU1vZGUsCi0gICAgICAgIGludCBoYWxWZXJzaW9uLCBpbnQgZGV2aWNlVmVyc2lvbiwgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsCisgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsIGludCBmYWNpbmcsIGludCBjbGllbnRQaWQsIHVpZF90IGNsaWVudFVpZCwgaW50IHNlcnZpY2VQaWQsCisgICAgICAgIGJvb2wgbGVnYWN5TW9kZSwgaW50IGhhbFZlcnNpb24sIGludCBkZXZpY2VWZXJzaW9uLCBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwKICAgICAgICAgLypvdXQqL3NwPEJhc2ljQ2xpZW50PiogY2xpZW50KSB7CiAKICAgICBpZiAoaGFsVmVyc2lvbiA8IDAgfHwgaGFsVmVyc2lvbiA9PSBkZXZpY2VWZXJzaW9uKSB7CkBAIC02MTMsOCArNTkxLDkgQEAKICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wOgogICAgICAgICAgICAgaWYgKGVmZmVjdGl2ZUFwaUxldmVsID09IEFQSV8xKSB7ICAvLyBDYW1lcmExIEFQSSByb3V0ZQogICAgICAgICAgICAgICAgIHNwPElDYW1lcmFDbGllbnQ+IHRtcCA9IHN0YXRpY19jYXN0PElDYW1lcmFDbGllbnQqPihjYW1lcmFDYi5nZXQoKSk7Ci0gICAgICAgICAgICAgICAgKmNsaWVudCA9IG5ldyBDYW1lcmFDbGllbnQoY2FtZXJhU2VydmljZSwgdG1wLCBwYWNrYWdlTmFtZSwgY2FtZXJhSWRUb0ludChjYW1lcmFJZCksCi0gICAgICAgICAgICAgICAgICAgICAgICBmYWNpbmcsIGNsaWVudFBpZCwgY2xpZW50VWlkLCBnZXRwaWQoKSwgbGVnYWN5TW9kZSk7CisgICAgICAgICAgICAgICAgKmNsaWVudCA9IG5ldyBDYW1lcmFDbGllbnQoY2FtZXJhU2VydmljZSwgdG1wLCBwYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaTFDYW1lcmFJZCwgZmFjaW5nLCBjbGllbnRQaWQsIGNsaWVudFVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldHBpZCgpLCBsZWdhY3lNb2RlKTsKICAgICAgICAgICAgIH0gZWxzZSB7IC8vIENhbWVyYTIgQVBJIHJvdXRlCiAgICAgICAgICAgICAgICAgQUxPR1coIkNhbWVyYSB1c2luZyBvbGQgSEFMIHZlcnNpb246ICVkIiwgZGV2aWNlVmVyc2lvbik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfREVQUkVDQVRFRF9IQUwsCkBAIC02MjksOCArNjA4LDEwIEBACiAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNDoKICAgICAgICAgICAgIGlmIChlZmZlY3RpdmVBcGlMZXZlbCA9PSBBUElfMSkgeyAvLyBDYW1lcmExIEFQSSByb3V0ZQogICAgICAgICAgICAgICAgIHNwPElDYW1lcmFDbGllbnQ+IHRtcCA9IHN0YXRpY19jYXN0PElDYW1lcmFDbGllbnQqPihjYW1lcmFDYi5nZXQoKSk7Ci0gICAgICAgICAgICAgICAgKmNsaWVudCA9IG5ldyBDYW1lcmEyQ2xpZW50KGNhbWVyYVNlcnZpY2UsIHRtcCwgcGFja2FnZU5hbWUsIGNhbWVyYUlkVG9JbnQoY2FtZXJhSWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgZmFjaW5nLCBjbGllbnRQaWQsIGNsaWVudFVpZCwgc2VydmljZVBpZCwgbGVnYWN5TW9kZSk7CisgICAgICAgICAgICAgICAgKmNsaWVudCA9IG5ldyBDYW1lcmEyQ2xpZW50KGNhbWVyYVNlcnZpY2UsIHRtcCwgcGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCwgYXBpMUNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgZmFjaW5nLCBjbGllbnRQaWQsIGNsaWVudFVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VQaWQsIGxlZ2FjeU1vZGUpOwogICAgICAgICAgICAgfSBlbHNlIHsgLy8gQ2FtZXJhMiBBUEkgcm91dGUKICAgICAgICAgICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4gdG1wID0KICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzKj4oY2FtZXJhQ2IuZ2V0KCkpOwpAQCAtNjUyLDggKzYzMyw5IEBACiAgICAgICAgICAgICBoYWxWZXJzaW9uID09IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wKSB7CiAgICAgICAgICAgICAvLyBPbmx5IHN1cHBvcnQgaGlnaGVyIEhBTCB2ZXJzaW9uIGRldmljZSBvcGVuZWQgYXMgSEFMMS4wIGRldmljZS4KICAgICAgICAgICAgIHNwPElDYW1lcmFDbGllbnQ+IHRtcCA9IHN0YXRpY19jYXN0PElDYW1lcmFDbGllbnQqPihjYW1lcmFDYi5nZXQoKSk7Ci0gICAgICAgICAgICAqY2xpZW50ID0gbmV3IENhbWVyYUNsaWVudChjYW1lcmFTZXJ2aWNlLCB0bXAsIHBhY2thZ2VOYW1lLCBjYW1lcmFJZFRvSW50KGNhbWVyYUlkKSwKLSAgICAgICAgICAgICAgICAgICAgZmFjaW5nLCBjbGllbnRQaWQsIGNsaWVudFVpZCwgc2VydmljZVBpZCwgbGVnYWN5TW9kZSk7CisgICAgICAgICAgICAqY2xpZW50ID0gbmV3IENhbWVyYUNsaWVudChjYW1lcmFTZXJ2aWNlLCB0bXAsIHBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICBhcGkxQ2FtZXJhSWQsIGZhY2luZywgY2xpZW50UGlkLCBjbGllbnRVaWQsCisgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VQaWQsIGxlZ2FjeU1vZGUpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gT3RoZXIgY29tYmluYXRpb25zIChlLmcuIEhBTDMueCBvcGVuIGFzIEhBTDIueCkgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0LgogICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgY2FtZXJhIEhBTCB2ZXJzaW9uICV4OiBIQUwgJXggZGV2aWNlIGNhbiBvbmx5IGJlIgpAQCAtNzQ5LDcgKzczMSw4IEBACiAgICAgU3RhdHVzIHJldCA9IFN0YXR1czo6b2soKTsKICAgICBzcDxDbGllbnQ+IHRtcCA9IG51bGxwdHI7CiAgICAgaWYgKCEocmV0ID0gY29ubmVjdEhlbHBlcjxJQ2FtZXJhQ2xpZW50LENsaWVudD4oCi0gICAgICAgICAgICBzcDxJQ2FtZXJhQ2xpZW50PntudWxscHRyfSwgaWQsIHN0YXRpY19jYXN0PGludD4oQ0FNRVJBX0hBTF9BUElfVkVSU0lPTl9VTlNQRUNJRklFRCksCisgICAgICAgICAgICBzcDxJQ2FtZXJhQ2xpZW50PntudWxscHRyfSwgaWQsIGNhbWVyYUlkLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihDQU1FUkFfSEFMX0FQSV9WRVJTSU9OX1VOU1BFQ0lGSUVEKSwKICAgICAgICAgICAgIGludGVybmFsUGFja2FnZU5hbWUsIHVpZCwgVVNFX0NBTExJTkdfUElELAogICAgICAgICAgICAgQVBJXzEsIC8qbGVnYWN5TW9kZSovIGZhbHNlLCAvKnNoaW1VcGRhdGVPbmx5Ki8gdHJ1ZSwKICAgICAgICAgICAgIC8qb3V0Ki8gdG1wKQpAQCAtOTIyLDYgKzkwNSwxNSBAQAogICAgICAgICAgICAgICAgIGNsaWVudE5hbWU4LnN0cmluZygpLCBjbGllbnRVaWQsIGNsaWVudFBpZCwgY2FtZXJhSWQuc3RyaW5nKCkpOwogICAgIH0KIAorICAgIC8vIE1ha2Ugc3VyZSB0aGUgVUlEIGlzIGluIGFuIGFjdGl2ZSBzdGF0ZSB0byB1c2UgdGhlIGNhbWVyYQorICAgIGlmICghbVVpZFBvbGljeS0+aXNVaWRBY3RpdmUoY2FsbGluZ1VpZCwgU3RyaW5nMTYoY2xpZW50TmFtZTgpKSkgeworICAgICAgICBBTE9HRSgiQWNjZXNzIERlbmlhbDogY2FuJ3QgdXNlIHRoZSBjYW1lcmEgZnJvbSBhbiBpZGxlIFVJRCBwaWQ9JWQsIHVpZD0lZCIsCisgICAgICAgICAgICBjbGllbnRQaWQsIGNsaWVudFVpZCk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKEVSUk9SX0RJU0FCTEVELAorICAgICAgICAgICAgICAgICJDYWxsZXIgXCIlc1wiIChQSUQgJWQsIFVJRCAlZCkgY2Fubm90IG9wZW4gY2FtZXJhIFwiJXNcIiBmcm9tIGJhY2tncm91bmQiLAorICAgICAgICAgICAgICAgIGNsaWVudE5hbWU4LnN0cmluZygpLCBjbGllbnRVaWQsIGNsaWVudFBpZCwgY2FtZXJhSWQuc3RyaW5nKCkpOworICAgIH0KKwogICAgIC8vIE9ubHkgdXNlIHBhc3NlZCBpbiBjbGllbnRQaWQgdG8gY2hlY2sgcGVybWlzc2lvbi4gVXNlIGNhbGxpbmcgUElEIGFzIHRoZSBjbGllbnQgUElEIHRoYXQncwogICAgIC8vIGNvbm5lY3RlZCB0byBjYW1lcmEgc2VydmljZSBkaXJlY3RseS4KICAgICBvcmlnaW5hbENsaWVudFBpZCA9IGNsaWVudFBpZDsKQEAgLTExOTMsNyArMTE4NSw3IEBACiAKIFN0YXR1cyBDYW1lcmFTZXJ2aWNlOjpjb25uZWN0KAogICAgICAgICBjb25zdCBzcDxJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50LAotICAgICAgICBpbnQgY2FtZXJhSWQsCisgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsCiAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKICAgICAgICAgaW50IGNsaWVudFVpZCwKICAgICAgICAgaW50IGNsaWVudFBpZCwKQEAgLTEyMDIsOSArMTE5NCwxMCBAQAogCiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBTdGF0dXMgcmV0ID0gU3RhdHVzOjpvaygpOwotICAgIFN0cmluZzggaWQgPSBTdHJpbmc4Ojpmb3JtYXQoIiVkIiwgY2FtZXJhSWQpOworCisgICAgU3RyaW5nOCBpZCA9IGNhbWVyYUlkSW50VG9TdHIoYXBpMUNhbWVyYUlkKTsKICAgICBzcDxDbGllbnQ+IGNsaWVudCA9IG51bGxwdHI7Ci0gICAgcmV0ID0gY29ubmVjdEhlbHBlcjxJQ2FtZXJhQ2xpZW50LENsaWVudD4oY2FtZXJhQ2xpZW50LCBpZCwKKyAgICByZXQgPSBjb25uZWN0SGVscGVyPElDYW1lcmFDbGllbnQsQ2xpZW50PihjYW1lcmFDbGllbnQsIGlkLCBhcGkxQ2FtZXJhSWQsCiAgICAgICAgICAgICBDQU1FUkFfSEFMX0FQSV9WRVJTSU9OX1VOU1BFQ0lGSUVELCBjbGllbnRQYWNrYWdlTmFtZSwgY2xpZW50VWlkLCBjbGllbnRQaWQsIEFQSV8xLAogICAgICAgICAgICAgLypsZWdhY3lNb2RlKi8gZmFsc2UsIC8qc2hpbVVwZGF0ZU9ubHkqLyBmYWxzZSwKICAgICAgICAgICAgIC8qb3V0Ki9jbGllbnQpOwpAQCAtMTIyMSwxOCArMTIxNCwxOCBAQAogCiBTdGF0dXMgQ2FtZXJhU2VydmljZTo6Y29ubmVjdExlZ2FjeSgKICAgICAgICAgY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCwKLSAgICAgICAgaW50IGNhbWVyYUlkLCBpbnQgaGFsVmVyc2lvbiwKKyAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwgaW50IGhhbFZlcnNpb24sCiAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKICAgICAgICAgaW50IGNsaWVudFVpZCwKICAgICAgICAgLypvdXQqLwogICAgICAgICBzcDxJQ2FtZXJhPiogZGV2aWNlKSB7CiAKICAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIFN0cmluZzggaWQgPSBTdHJpbmc4Ojpmb3JtYXQoIiVkIiwgY2FtZXJhSWQpOworICAgIFN0cmluZzggaWQgPSBjYW1lcmFJZEludFRvU3RyKGFwaTFDYW1lcmFJZCk7CiAKICAgICBTdGF0dXMgcmV0ID0gU3RhdHVzOjpvaygpOwogICAgIHNwPENsaWVudD4gY2xpZW50ID0gbnVsbHB0cjsKLSAgICByZXQgPSBjb25uZWN0SGVscGVyPElDYW1lcmFDbGllbnQsQ2xpZW50PihjYW1lcmFDbGllbnQsIGlkLCBoYWxWZXJzaW9uLAorICAgIHJldCA9IGNvbm5lY3RIZWxwZXI8SUNhbWVyYUNsaWVudCxDbGllbnQ+KGNhbWVyYUNsaWVudCwgaWQsIGFwaTFDYW1lcmFJZCwgaGFsVmVyc2lvbiwKICAgICAgICAgICAgIGNsaWVudFBhY2thZ2VOYW1lLCBjbGllbnRVaWQsIFVTRV9DQUxMSU5HX1BJRCwgQVBJXzEsCiAgICAgICAgICAgICAvKmxlZ2FjeU1vZGUqLyB0cnVlLCAvKnNoaW1VcGRhdGVPbmx5Ki8gZmFsc2UsCiAgICAgICAgICAgICAvKm91dCovY2xpZW50KTsKQEAgLTEyNjAsNiArMTI1Myw3IEBACiAgICAgU3RyaW5nOCBpZCA9IFN0cmluZzgoY2FtZXJhSWQpOwogICAgIHNwPENhbWVyYURldmljZUNsaWVudD4gY2xpZW50ID0gbnVsbHB0cjsKICAgICByZXQgPSBjb25uZWN0SGVscGVyPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLENhbWVyYURldmljZUNsaWVudD4oY2FtZXJhQ2IsIGlkLAorICAgICAgICAgICAgLyphcGkxQ2FtZXJhSWQqLy0xLAogICAgICAgICAgICAgQ0FNRVJBX0hBTF9BUElfVkVSU0lPTl9VTlNQRUNJRklFRCwgY2xpZW50UGFja2FnZU5hbWUsCiAgICAgICAgICAgICBjbGllbnRVaWQsIFVTRV9DQUxMSU5HX1BJRCwgQVBJXzIsCiAgICAgICAgICAgICAvKmxlZ2FjeU1vZGUqLyBmYWxzZSwgLypzaGltVXBkYXRlT25seSovIGZhbHNlLApAQCAtMTI3Nyw4ICsxMjcxLDggQEAKIAogdGVtcGxhdGU8Y2xhc3MgQ0FMTEJBQ0ssIGNsYXNzIENMSUVOVD4KIFN0YXR1cyBDYW1lcmFTZXJ2aWNlOjpjb25uZWN0SGVscGVyKGNvbnN0IHNwPENBTExCQUNLPiYgY2FtZXJhQ2IsIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAotICAgICAgICBpbnQgaGFsVmVyc2lvbiwgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLCBpbnQgY2xpZW50VWlkLCBpbnQgY2xpZW50UGlkLAotICAgICAgICBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwgYm9vbCBsZWdhY3lNb2RlLCBib29sIHNoaW1VcGRhdGVPbmx5LAorICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLCBpbnQgaGFsVmVyc2lvbiwgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLCBpbnQgY2xpZW50VWlkLAorICAgICAgICBpbnQgY2xpZW50UGlkLCBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwgYm9vbCBsZWdhY3lNb2RlLCBib29sIHNoaW1VcGRhdGVPbmx5LAogICAgICAgICAvKm91dCovc3A8Q0xJRU5UPiYgZGV2aWNlKSB7CiAgICAgYmluZGVyOjpTdGF0dXMgcmV0ID0gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiAKQEAgLTEzNjEsOCArMTM1NSwxMCBAQAogICAgICAgICB9CiAKICAgICAgICAgc3A8QmFzaWNDbGllbnQ+IHRtcCA9IG51bGxwdHI7Ci0gICAgICAgIGlmKCEocmV0ID0gbWFrZUNsaWVudCh0aGlzLCBjYW1lcmFDYiwgY2xpZW50UGFja2FnZU5hbWUsIGNhbWVyYUlkLCBmYWNpbmcsIGNsaWVudFBpZCwKLSAgICAgICAgICAgICAgICBjbGllbnRVaWQsIGdldHBpZCgpLCBsZWdhY3lNb2RlLCBoYWxWZXJzaW9uLCBkZXZpY2VWZXJzaW9uLCBlZmZlY3RpdmVBcGlMZXZlbCwKKyAgICAgICAgaWYoIShyZXQgPSBtYWtlQ2xpZW50KHRoaXMsIGNhbWVyYUNiLCBjbGllbnRQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICBjYW1lcmFJZCwgYXBpMUNhbWVyYUlkLCBmYWNpbmcsCisgICAgICAgICAgICAgICAgY2xpZW50UGlkLCBjbGllbnRVaWQsIGdldHBpZCgpLCBsZWdhY3lNb2RlLAorICAgICAgICAgICAgICAgIGhhbFZlcnNpb24sIGRldmljZVZlcnNpb24sIGVmZmVjdGl2ZUFwaUxldmVsLAogICAgICAgICAgICAgICAgIC8qb3V0Ki8mdG1wKSkuaXNPaygpKSB7CiAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICB9CkBAIC0xMzcxLDcgKzEzNjcsNyBAQAogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGNsaWVudC5nZXQoKSA9PSBudWxscHRyLCAiJXM6IENhbWVyYVNlcnZpY2UgaW4gaW52YWxpZCBzdGF0ZSIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKIAotICAgICAgICBlcnIgPSBjbGllbnQtPmluaXRpYWxpemUobUNhbWVyYVByb3ZpZGVyTWFuYWdlcik7CisgICAgICAgIGVyciA9IGNsaWVudC0+aW5pdGlhbGl6ZShtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLCBtTW9uaXRvclRhZ3MpOwogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBpbml0aWFsaXplIGNsaWVudCBmcm9tIEhBTC4iLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICAgICAgLy8gRXJyb3JzIGNvdWxkIGJlIGZyb20gdGhlIEhBTCBtb2R1bGUgb3BlbiBjYWxsIG9yIGZyb20gQXBwT3BzTWFuYWdlcgpAQCAtMTU1Niw2ICsxNTUyLDkgQEAKIAogICAgIHN3aXRjaChldmVudElkKSB7CiAgICAgICAgIGNhc2UgSUNhbWVyYVNlcnZpY2U6OkVWRU5UX1VTRVJfU1dJVENIRUQ6IHsKKyAgICAgICAgICAgIC8vIFRyeSB0byByZWdpc3RlciBmb3IgVUlEIHBvbGljeSB1cGRhdGVzLCBpbiBjYXNlIHdlJ3JlIHJlY292ZXJpbmcKKyAgICAgICAgICAgIC8vIGZyb20gYSBzeXN0ZW0gc2VydmVyIGNyYXNoCisgICAgICAgICAgICBtVWlkUG9saWN5LT5yZWdpc3RlclNlbGYoKTsKICAgICAgICAgICAgIGRvVXNlclN3aXRjaCgvKm5ld1VzZXJJZHMqLyBhcmdzKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xNzQwLDggKzE3MzksNiBAQAogfQogCiBib29sIENhbWVyYVNlcnZpY2U6OmV2aWN0Q2xpZW50SWRCeVJlbW90ZShjb25zdCB3cDxJQmluZGVyPiYgcmVtb3RlKSB7Ci0gICAgY29uc3QgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7Ci0gICAgY29uc3QgaW50IHNlcnZpY2VQaWQgPSBnZXRwaWQoKTsKICAgICBib29sIHJldCA9IGZhbHNlOwogICAgIHsKICAgICAgICAgLy8gQWNxdWlyZSBtU2VydmljZUxvY2sgYW5kIHByZXZlbnQgb3RoZXIgY2xpZW50cyBmcm9tIGNvbm5lY3RpbmcKQEAgLTE3NTcsOCArMTc1NCw3IEBACiAgICAgICAgICAgICAgICAgbUFjdGl2ZUNsaWVudE1hbmFnZXIucmVtb3ZlKGkpOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJlbW90ZSA9PSBjbGllbnRTcC0+Z2V0UmVtb3RlKCkgJiYgKGNhbGxpbmdQaWQgPT0gc2VydmljZVBpZCB8fAotICAgICAgICAgICAgICAgICAgICBjYWxsaW5nUGlkID09IGNsaWVudFNwLT5nZXRDbGllbnRQaWQoKSkpIHsKKyAgICAgICAgICAgIGlmIChyZW1vdGUgPT0gY2xpZW50U3AtPmdldFJlbW90ZSgpKSB7CiAgICAgICAgICAgICAgICAgbUFjdGl2ZUNsaWVudE1hbmFnZXIucmVtb3ZlKGkpOwogICAgICAgICAgICAgICAgIGV2aWN0ZWQucHVzaF9iYWNrKGNsaWVudFNwKTsKIApAQCAtMTk1OCw2ICsxOTU0LDMwIEBACiAKICAgICAvLyBQZXJtaXNzaW9uIGNoZWNrcwogICAgIHN3aXRjaCAoY29kZSkgeworICAgICAgICBjYXNlIFNIRUxMX0NPTU1BTkRfVFJBTlNBQ1RJT046IHsKKyAgICAgICAgICAgIGludCBpbiA9IGRhdGEucmVhZEZpbGVEZXNjcmlwdG9yKCk7CisgICAgICAgICAgICBpbnQgb3V0ID0gZGF0YS5yZWFkRmlsZURlc2NyaXB0b3IoKTsKKyAgICAgICAgICAgIGludCBlcnIgPSBkYXRhLnJlYWRGaWxlRGVzY3JpcHRvcigpOworICAgICAgICAgICAgaW50IGFyZ2MgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgVmVjdG9yPFN0cmluZzE2PiBhcmdzOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdjICYmIGRhdGEuZGF0YUF2YWlsKCkgPiAwOyBpKyspIHsKKyAgICAgICAgICAgICAgIGFyZ3MuYWRkKGRhdGEucmVhZFN0cmluZzE2KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8SUJpbmRlcj4gdW51c2VkQ2FsbGJhY2s7CisgICAgICAgICAgICBzcDxJUmVzdWx0UmVjZWl2ZXI+IHJlc3VsdFJlY2VpdmVyOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgICAgICAgICAgaWYgKChzdGF0dXMgPSBkYXRhLnJlYWROdWxsYWJsZVN0cm9uZ0JpbmRlcigmdW51c2VkQ2FsbGJhY2spKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHN0YXR1cyA9IGRhdGEucmVhZE51bGxhYmxlU3Ryb25nQmluZGVyKCZyZXN1bHRSZWNlaXZlcikpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cyA9IHNoZWxsQ29tbWFuZChpbiwgb3V0LCBlcnIsIGFyZ3MpOworICAgICAgICAgICAgaWYgKHJlc3VsdFJlY2VpdmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICByZXN1bHRSZWNlaXZlci0+c2VuZChzdGF0dXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CiAgICAgICAgIGNhc2UgQm5DYW1lcmFTZXJ2aWNlOjpOT1RJRllTWVNURU1FVkVOVDogewogICAgICAgICAgICAgaWYgKHBpZCAhPSBzZWxmUGlkKSB7CiAgICAgICAgICAgICAgICAgLy8gRW5zdXJlIHdlJ3JlIGJlaW5nIGNhbGxlZCBieSBzeXN0ZW1fc2VydmVyLCBvciBzaW1pbGFyIHByb2Nlc3Mgd2l0aApAQCAtMTk4MSwxNCArMjAwMSwxOCBAQAogLy8gQSByZWZlcmVuY2UgY291bnQgaXMga2VwdCB0byBkZXRlcm1pbmUgd2hlbiB3ZSB3aWxsIGFjdHVhbGx5IHJlbGVhc2UgdGhlCiAvLyBtZWRpYSBwbGF5ZXJzLgogCi1NZWRpYVBsYXllciogQ2FtZXJhU2VydmljZTo6bmV3TWVkaWFQbGF5ZXIoY29uc3QgY2hhciAqZmlsZSkgewotICAgIE1lZGlhUGxheWVyKiBtcCA9IG5ldyBNZWRpYVBsYXllcigpOwotICAgIGlmIChtcC0+c2V0RGF0YVNvdXJjZShOVUxMIC8qIGh0dHBTZXJ2aWNlICovLCBmaWxlLCBOVUxMKSA9PSBOT19FUlJPUikgeworc3A8TWVkaWFQbGF5ZXI+IENhbWVyYVNlcnZpY2U6Om5ld01lZGlhUGxheWVyKGNvbnN0IGNoYXIgKmZpbGUpIHsKKyAgICBzcDxNZWRpYVBsYXllcj4gbXAgPSBuZXcgTWVkaWFQbGF5ZXIoKTsKKyAgICBzdGF0dXNfdCBlcnJvcjsKKyAgICBpZiAoKGVycm9yID0gbXAtPnNldERhdGFTb3VyY2UoTlVMTCAvKiBodHRwU2VydmljZSAqLywgZmlsZSwgTlVMTCkpID09IE5PX0VSUk9SKSB7CiAgICAgICAgIG1wLT5zZXRBdWRpb1N0cmVhbVR5cGUoQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUpOwotICAgICAgICBtcC0+cHJlcGFyZSgpOwotICAgIH0gZWxzZSB7CisgICAgICAgIGVycm9yID0gbXAtPnByZXBhcmUoKTsKKyAgICB9CisgICAgaWYgKGVycm9yICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gbG9hZCBDYW1lcmFTZXJ2aWNlIHNvdW5kczogJXMiLCBmaWxlKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIG1wLT5kaXNjb25uZWN0KCk7CisgICAgICAgIG1wLmNsZWFyKCk7CisgICAgICAgIHJldHVybiBudWxscHRyOwogICAgIH0KICAgICByZXR1cm4gbXA7CiB9CkBAIC0yMDAwLDkgKzIwMjQsMTkgQEAKICAgICBMT0cxKCJDYW1lcmFTZXJ2aWNlOjpsb2FkU291bmQgcmVmPSVkIiwgbVNvdW5kUmVmKTsKICAgICBpZiAobVNvdW5kUmVmKyspIHJldHVybjsKIAotICAgIG1Tb3VuZFBsYXllcltTT1VORF9TSFVUVEVSXSA9IG5ld01lZGlhUGxheWVyKCIvc3lzdGVtL21lZGlhL2F1ZGlvL3VpL2NhbWVyYV9jbGljay5vZ2ciKTsKLSAgICBtU291bmRQbGF5ZXJbU09VTkRfUkVDT1JESU5HX1NUQVJUXSA9IG5ld01lZGlhUGxheWVyKCIvc3lzdGVtL21lZGlhL2F1ZGlvL3VpL1ZpZGVvUmVjb3JkLm9nZyIpOwotICAgIG1Tb3VuZFBsYXllcltTT1VORF9SRUNPUkRJTkdfU1RPUF0gPSBuZXdNZWRpYVBsYXllcigiL3N5c3RlbS9tZWRpYS9hdWRpby91aS9WaWRlb1N0b3Aub2dnIik7CisgICAgbVNvdW5kUGxheWVyW1NPVU5EX1NIVVRURVJdID0gbmV3TWVkaWFQbGF5ZXIoIi9wcm9kdWN0L21lZGlhL2F1ZGlvL3VpL2NhbWVyYV9jbGljay5vZ2ciKTsKKyAgICBpZiAobVNvdW5kUGxheWVyW1NPVU5EX1NIVVRURVJdID09IG51bGxwdHIpIHsKKyAgICAgICAgbVNvdW5kUGxheWVyW1NPVU5EX1NIVVRURVJdID0gbmV3TWVkaWFQbGF5ZXIoIi9zeXN0ZW0vbWVkaWEvYXVkaW8vdWkvY2FtZXJhX2NsaWNrLm9nZyIpOworICAgIH0KKyAgICBtU291bmRQbGF5ZXJbU09VTkRfUkVDT1JESU5HX1NUQVJUXSA9IG5ld01lZGlhUGxheWVyKCIvcHJvZHVjdC9tZWRpYS9hdWRpby91aS9WaWRlb1JlY29yZC5vZ2ciKTsKKyAgICBpZiAobVNvdW5kUGxheWVyW1NPVU5EX1JFQ09SRElOR19TVEFSVF0gPT0gbnVsbHB0cikgeworICAgICAgICBtU291bmRQbGF5ZXJbU09VTkRfUkVDT1JESU5HX1NUQVJUXSA9CisgICAgICAgICAgICAgICAgbmV3TWVkaWFQbGF5ZXIoIi9zeXN0ZW0vbWVkaWEvYXVkaW8vdWkvVmlkZW9SZWNvcmQub2dnIik7CisgICAgfQorICAgIG1Tb3VuZFBsYXllcltTT1VORF9SRUNPUkRJTkdfU1RPUF0gPSBuZXdNZWRpYVBsYXllcigiL3Byb2R1Y3QvbWVkaWEvYXVkaW8vdWkvVmlkZW9TdG9wLm9nZyIpOworICAgIGlmIChtU291bmRQbGF5ZXJbU09VTkRfUkVDT1JESU5HX1NUT1BdID09IG51bGxwdHIpIHsKKyAgICAgICAgbVNvdW5kUGxheWVyW1NPVU5EX1JFQ09SRElOR19TVE9QXSA9IG5ld01lZGlhUGxheWVyKCIvc3lzdGVtL21lZGlhL2F1ZGlvL3VpL1ZpZGVvU3RvcC5vZ2ciKTsKKyAgICB9CiB9CiAKIHZvaWQgQ2FtZXJhU2VydmljZTo6cmVsZWFzZVNvdW5kKCkgewpAQCAtMjAzNSw3ICsyMDY5LDggQEAKIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6Q2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICBjb25zdCBzcDxJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50LAogICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkU3RyLCBpbnQgY2FtZXJhRmFjaW5nLAorICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZFN0ciwKKyAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwgaW50IGNhbWVyYUZhY2luZywKICAgICAgICAgaW50IGNsaWVudFBpZCwgdWlkX3QgY2xpZW50VWlkLAogICAgICAgICBpbnQgc2VydmljZVBpZCkgOgogICAgICAgICBDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudChjYW1lcmFTZXJ2aWNlLApAQCAtMjA0NCw3ICsyMDc5LDcgQEAKICAgICAgICAgICAgICAgICBjYW1lcmFJZFN0ciwgY2FtZXJhRmFjaW5nLAogICAgICAgICAgICAgICAgIGNsaWVudFBpZCwgY2xpZW50VWlkLAogICAgICAgICAgICAgICAgIHNlcnZpY2VQaWQpLAotICAgICAgICBtQ2FtZXJhSWQoQ2FtZXJhU2VydmljZTo6Y2FtZXJhSWRUb0ludChjYW1lcmFJZFN0cikpCisgICAgICAgIG1DYW1lcmFJZChhcGkxQ2FtZXJhSWQpCiB7CiAgICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CiAgICAgTE9HMSgiQ2xpZW50OjpDbGllbnQgRSAocGlkICVkLCBpZCAlZCkiLCBjYWxsaW5nUGlkLCBtQ2FtZXJhSWQpOwpAQCAtMjE5MSw4ICsyMjI2LDggQEAKIAogICAgIG1BcHBPcHNNYW5hZ2VyLnN0YXJ0V2F0Y2hpbmdNb2RlKEFwcE9wc01hbmFnZXI6Ok9QX0NBTUVSQSwKICAgICAgICAgICAgIG1DbGllbnRQYWNrYWdlTmFtZSwgbU9wc0NhbGxiYWNrKTsKLSAgICByZXMgPSBtQXBwT3BzTWFuYWdlci5zdGFydE9wKEFwcE9wc01hbmFnZXI6Ok9QX0NBTUVSQSwKLSAgICAgICAgICAgIG1DbGllbnRVaWQsIG1DbGllbnRQYWNrYWdlTmFtZSk7CisgICAgcmVzID0gbUFwcE9wc01hbmFnZXIuc3RhcnRPcE5vVGhyb3coQXBwT3BzTWFuYWdlcjo6T1BfQ0FNRVJBLAorICAgICAgICAgICAgbUNsaWVudFVpZCwgbUNsaWVudFBhY2thZ2VOYW1lLCAvKnN0YXJ0SWZNb2RlRGVmYXVsdCovIGZhbHNlKTsKIAogICAgIGlmIChyZXMgPT0gQXBwT3BzTWFuYWdlcjo6TU9ERV9FUlJPUkVEKSB7CiAgICAgICAgIEFMT0dJKCJDYW1lcmEgJXM6IEFjY2VzcyBmb3IgXCIlc1wiIGhhcyBiZWVuIHJldm9rZWQiLApAQCAtMjIxMiw5ICsyMjQ3LDEzIEBACiAgICAgLy8gVHJhbnNpdGlvbiBkZXZpY2UgYXZhaWxhYmlsaXR5IGxpc3RlbmVycyBmcm9tIFBSRVNFTlQgLT4gTk9UX0FWQUlMQUJMRQogICAgIHNDYW1lcmFTZXJ2aWNlLT51cGRhdGVTdGF0dXMoU3RhdHVzSW50ZXJuYWw6Ok5PVF9BVkFJTEFCTEUsIG1DYW1lcmFJZFN0cik7CiAKKyAgICBpbnQgYXBpTGV2ZWwgPSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VQcm94eTo6Q0FNRVJBX0FQSV9MRVZFTF8xOworICAgIGlmIChjYW5DYXN0VG9BcGlDbGllbnQoQVBJXzIpKSB7CisgICAgICAgIGFwaUxldmVsID0gaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlUHJveHk6OkNBTUVSQV9BUElfTEVWRUxfMjsKKyAgICB9CiAgICAgLy8gVHJhbnNpdGlvbiBkZXZpY2Ugc3RhdGUgdG8gT1BFTgogICAgIHNDYW1lcmFTZXJ2aWNlLT51cGRhdGVQcm94eURldmljZVN0YXRlKElDYW1lcmFTZXJ2aWNlUHJveHk6OkNBTUVSQV9TVEFURV9PUEVOLAotICAgICAgICAgICAgbUNhbWVyYUlkU3RyLCBtQ2FtZXJhRmFjaW5nLCBtQ2xpZW50UGFja2FnZU5hbWUpOworICAgICAgICAgICAgbUNhbWVyYUlkU3RyLCBtQ2FtZXJhRmFjaW5nLCBtQ2xpZW50UGFja2FnZU5hbWUsIGFwaUxldmVsKTsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTIyMjksMTYgKzIyNjgsMjMgQEAKICAgICAgICAgICAgICAgICBtQ2xpZW50UGFja2FnZU5hbWUpOwogICAgICAgICBtT3BzQWN0aXZlID0gZmFsc2U7CiAKKyAgICAgICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhIGNsaWVudCBkaXNjb25uZWN0cy4gVGhpcyBzaG91bGQKKyAgICAgICAgLy8gcmVsZWFzZSB0aGUgY2FtZXJhLCBidXQgYWN0dWFsbHkgb25seSBpZiBpdCB3YXMgaW4gYSBwcm9wZXIKKyAgICAgICAgLy8gZnVuY3Rpb25hbCBzdGF0ZSwgaS5lLiB3aXRoIHN0YXR1cyBOT1RfQVZBSUxBQkxFCiAgICAgICAgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxTdGF0dXNJbnRlcm5hbD4gcmVqZWN0ZWQgPSB7U3RhdHVzSW50ZXJuYWw6OlBSRVNFTlQsCi0gICAgICAgICAgICAgICAgU3RhdHVzSW50ZXJuYWw6OkVOVU1FUkFUSU5HfTsKKyAgICAgICAgICAgICAgICBTdGF0dXNJbnRlcm5hbDo6RU5VTUVSQVRJTkcsIFN0YXR1c0ludGVybmFsOjpOT1RfUFJFU0VOVH07CiAKICAgICAgICAgLy8gVHJhbnNpdGlvbiB0byBQUkVTRU5UIGlmIHRoZSBjYW1lcmEgaXMgbm90IGluIGVpdGhlciBvZiB0aGUgcmVqZWN0ZWQgc3RhdGVzCiAgICAgICAgIHNDYW1lcmFTZXJ2aWNlLT51cGRhdGVTdGF0dXMoU3RhdHVzSW50ZXJuYWw6OlBSRVNFTlQsCiAgICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLCByZWplY3RlZCk7CiAKKyAgICAgICAgaW50IGFwaUxldmVsID0gaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlUHJveHk6OkNBTUVSQV9BUElfTEVWRUxfMTsKKyAgICAgICAgaWYgKGNhbkNhc3RUb0FwaUNsaWVudChBUElfMikpIHsKKyAgICAgICAgICAgIGFwaUxldmVsID0gaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlUHJveHk6OkNBTUVSQV9BUElfTEVWRUxfMjsKKyAgICAgICAgfQogICAgICAgICAvLyBUcmFuc2l0aW9uIGRldmljZSBzdGF0ZSB0byBDTE9TRUQKICAgICAgICAgc0NhbWVyYVNlcnZpY2UtPnVwZGF0ZVByb3h5RGV2aWNlU3RhdGUoSUNhbWVyYVNlcnZpY2VQcm94eTo6Q0FNRVJBX1NUQVRFX0NMT1NFRCwKLSAgICAgICAgICAgICAgICBtQ2FtZXJhSWRTdHIsIG1DYW1lcmFGYWNpbmcsIG1DbGllbnRQYWNrYWdlTmFtZSk7CisgICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLCBtQ2FtZXJhRmFjaW5nLCBtQ2xpZW50UGFja2FnZU5hbWUsIGFwaUxldmVsKTsKICAgICB9CiAgICAgLy8gQWx3YXlzIHN0b3Agd2F0Y2hpbmcsIGV2ZW4gaWYgbm8gY2FtZXJhIG9wIGlzIGFjdGl2ZQogICAgIGlmIChtT3BzQ2FsbGJhY2sgIT0gTlVMTCkgewpAQCAtMjI3MiwyMyArMjMxOCwzMiBAQAogICAgIGlmIChyZXMgIT0gQXBwT3BzTWFuYWdlcjo6TU9ERV9BTExPV0VEKSB7CiAgICAgICAgIEFMT0dJKCJDYW1lcmEgJXM6IEFjY2VzcyBmb3IgXCIlc1wiIHJldm9rZWQiLCBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksCiAgICAgICAgICAgICAgICAgbXlOYW1lLnN0cmluZygpKTsKLSAgICAgICAgLy8gUmVzZXQgdGhlIGNsaWVudCBQSUQgdG8gYWxsb3cgc2VydmVyLWluaXRpYXRlZCBkaXNjb25uZWN0LAotICAgICAgICAvLyBhbmQgdG8gcHJldmVudCBmdXJ0aGVyIGNhbGxzIGJ5IGNsaWVudC4KLSAgICAgICAgbUNsaWVudFBpZCA9IGdldENhbGxpbmdQaWQoKTsKLSAgICAgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcyByZXN1bHRFeHRyYXM7IC8vIGEgZHVtbXkgcmVzdWx0IChpbnZhbGlkKQotICAgICAgICBub3RpZnlFcnJvcihoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1NFUlZJQ0UsIHJlc3VsdEV4dHJhcyk7Ci0gICAgICAgIGRpc2Nvbm5lY3QoKTsKKyAgICAgICAgYmxvY2soKTsKICAgICB9CiB9CiAKK3ZvaWQgQ2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQ6OmJsb2NrKCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICAvLyBSZXNldCB0aGUgY2xpZW50IFBJRCB0byBhbGxvdyBzZXJ2ZXItaW5pdGlhdGVkIGRpc2Nvbm5lY3QsCisgICAgLy8gYW5kIHRvIHByZXZlbnQgZnVydGhlciBjYWxscyBieSBjbGllbnQuCisgICAgbUNsaWVudFBpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdEV4dHJhczsgLy8gYSBkdW1teSByZXN1bHQgKGludmFsaWQpCisgICAgbm90aWZ5RXJyb3IoaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9ESVNBQkxFRCwgcmVzdWx0RXh0cmFzKTsKKyAgICBkaXNjb25uZWN0KCk7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogdm9pZCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6Om5vdGlmeUVycm9yKGludDMyX3QgZXJyb3JDb2RlLAogICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIHsKLSAgICAodm9pZCkgZXJyb3JDb2RlOwogICAgICh2b2lkKSByZXN1bHRFeHRyYXM7CiAgICAgaWYgKG1SZW1vdGVDYWxsYmFjayAhPSBOVUxMKSB7Ci0gICAgICAgIG1SZW1vdGVDYWxsYmFjay0+bm90aWZ5Q2FsbGJhY2soQ0FNRVJBX01TR19FUlJPUiwgQ0FNRVJBX0VSUk9SX1JFTEVBU0VELCAwKTsKKyAgICAgICAgaW50MzJfdCBhcGkxRXJyb3JDb2RlID0gQ0FNRVJBX0VSUk9SX1JFTEVBU0VEOworICAgICAgICBpZiAoZXJyb3JDb2RlID09IGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfRElTQUJMRUQpIHsKKyAgICAgICAgICAgIGFwaTFFcnJvckNvZGUgPSBDQU1FUkFfRVJST1JfRElTQUJMRUQ7CisgICAgICAgIH0KKyAgICAgICAgbVJlbW90ZUNhbGxiYWNrLT5ub3RpZnlDYWxsYmFjayhDQU1FUkFfTVNHX0VSUk9SLCBhcGkxRXJyb3JDb2RlLCAwKTsKICAgICB9IGVsc2UgewogICAgICAgICBBTE9HRSgibVJlbW90ZUNhbGxiYWNrIGlzIE5VTEwhISIpOwogICAgIH0KQEAgLTIzMTcsMTIgKzIzNzIsMTM5IEBACiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAgICAgICAgICAgICAgVWlkUG9saWN5CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgQ2FtZXJhU2VydmljZTo6VWlkUG9saWN5OjpyZWdpc3RlclNlbGYoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1VaWRMb2NrKTsKKworICAgIEFjdGl2aXR5TWFuYWdlciBhbTsKKyAgICBpZiAobVJlZ2lzdGVyZWQpIHJldHVybjsKKyAgICBhbS5yZWdpc3RlclVpZE9ic2VydmVyKHRoaXMsIEFjdGl2aXR5TWFuYWdlcjo6VUlEX09CU0VSVkVSX0dPTkUKKyAgICAgICAgICAgIHwgQWN0aXZpdHlNYW5hZ2VyOjpVSURfT0JTRVJWRVJfSURMRQorICAgICAgICAgICAgfCBBY3Rpdml0eU1hbmFnZXI6OlVJRF9PQlNFUlZFUl9BQ1RJVkUsCisgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTiwKKyAgICAgICAgICAgIFN0cmluZzE2KCJjYW1lcmFzZXJ2ZXIiKSk7CisgICAgc3RhdHVzX3QgcmVzID0gYW0ubGlua1RvRGVhdGgodGhpcyk7CisgICAgaWYgKHJlcyA9PSBPSykgeworICAgICAgICBtUmVnaXN0ZXJlZCA9IHRydWU7CisgICAgICAgIEFMT0dWKCJVaWRQb2xpY3k6IFJlZ2lzdGVyZWQgd2l0aCBBY3Rpdml0eU1hbmFnZXIiKTsKKyAgICB9Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmljZTo6VWlkUG9saWN5Ojp1bnJlZ2lzdGVyU2VsZigpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobVVpZExvY2spOworCisgICAgQWN0aXZpdHlNYW5hZ2VyIGFtOworICAgIGFtLnVucmVnaXN0ZXJVaWRPYnNlcnZlcih0aGlzKTsKKyAgICBhbS51bmxpbmtUb0RlYXRoKHRoaXMpOworICAgIG1SZWdpc3RlcmVkID0gZmFsc2U7CisgICAgbUFjdGl2ZVVpZHMuY2xlYXIoKTsKKyAgICBBTE9HVigiVWlkUG9saWN5OiBVbnJlZ2lzdGVyZWQgd2l0aCBBY3Rpdml0eU1hbmFnZXIiKTsKK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpVaWRQb2xpY3k6Om9uVWlkR29uZSh1aWRfdCB1aWQsIGJvb2wgZGlzYWJsZWQpIHsKKyAgICBvblVpZElkbGUodWlkLCBkaXNhYmxlZCk7Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmljZTo6VWlkUG9saWN5OjpvblVpZEFjdGl2ZSh1aWRfdCB1aWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobVVpZExvY2spOworICAgIG1BY3RpdmVVaWRzLmluc2VydCh1aWQpOworfQorCit2b2lkIENhbWVyYVNlcnZpY2U6OlVpZFBvbGljeTo6b25VaWRJZGxlKHVpZF90IHVpZCwgYm9vbCAvKiBkaXNhYmxlZCAqLykgeworICAgIGJvb2wgZGVsZXRlZCA9IGZhbHNlOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1VaWRMb2NrKTsKKyAgICAgICAgaWYgKG1BY3RpdmVVaWRzLmVyYXNlKHVpZCkgPiAwKSB7CisgICAgICAgICAgICBkZWxldGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZGVsZXRlZCkgeworICAgICAgICBzcDxDYW1lcmFTZXJ2aWNlPiBzZXJ2aWNlID0gbVNlcnZpY2UucHJvbW90ZSgpOworICAgICAgICBpZiAoc2VydmljZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBzZXJ2aWNlLT5ibG9ja0NsaWVudHNGb3JVaWQodWlkKTsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBDYW1lcmFTZXJ2aWNlOjpVaWRQb2xpY3k6OmlzVWlkQWN0aXZlKHVpZF90IHVpZCwgU3RyaW5nMTYgY2FsbGluZ1BhY2thZ2UpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobVVpZExvY2spOworICAgIHJldHVybiBpc1VpZEFjdGl2ZUxvY2tlZCh1aWQsIGNhbGxpbmdQYWNrYWdlKTsKK30KKworYm9vbCBDYW1lcmFTZXJ2aWNlOjpVaWRQb2xpY3k6OmlzVWlkQWN0aXZlTG9ja2VkKHVpZF90IHVpZCwgU3RyaW5nMTYgY2FsbGluZ1BhY2thZ2UpIHsKKyAgICAvLyBOb24tYXBwIFVJRHMgYXJlIGNvbnNpZGVyZWQgYWx3YXlzIGFjdGl2ZQorICAgIC8vIElmIGFjdGl2aXR5IG1hbmFnZXIgaXMgdW5yZWFjaGFibGUsIGFzc3VtZSBldmVyeXRoaW5nIGlzIGFjdGl2ZQorICAgIGlmICh1aWQgPCBGSVJTVF9BUFBMSUNBVElPTl9VSUQgfHwgIW1SZWdpc3RlcmVkKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBhdXRvIGl0ID0gbU92ZXJyaWRlVWlkcy5maW5kKHVpZCk7CisgICAgaWYgKGl0ICE9IG1PdmVycmlkZVVpZHMuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisgICAgfQorICAgIGJvb2wgYWN0aXZlID0gbUFjdGl2ZVVpZHMuZmluZCh1aWQpICE9IG1BY3RpdmVVaWRzLmVuZCgpOworICAgIGlmICghYWN0aXZlKSB7CisgICAgICAgIC8vIFdlIHdhbnQgYWN0aXZlIFVJRHMgdG8gYWx3YXlzIGFjY2VzcyBjYW1lcmEgd2l0aCB0aGVpciBmaXJzdCBhdHRlbXB0IHNpbmNlCisgICAgICAgIC8vIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGUgYXBwIGlzIHJvYnVzdGx5IHdyaXR0ZW4gYW5kIHdvdWxkIHJldHJ5IGdldHRpbmcKKyAgICAgICAgLy8gdGhlIGNhbWVyYSBvbiBmYWlsdXJlLiBUaGUgaW52ZXJzZSBjYXNlIGlzIG5vdCBhIHByb2JsZW0gYXMgd2Ugd291bGQgdGFrZQorICAgICAgICAvLyBjYW1lcmEgYXdheSBzb29uIG9uY2Ugd2UgZ2V0IHRoZSBjYWxsYmFjayB0aGF0IHRoZSB1aWQgaXMgbm8gbG9uZ2VyIGFjdGl2ZS4KKyAgICAgICAgQWN0aXZpdHlNYW5hZ2VyIGFtOworICAgICAgICAvLyBPa2F5IHRvIGFjY2VzcyB3aXRoIGEgbG9jayBoZWxkIGFzIFVJRCBjaGFuZ2VzIGFyZSBkaXNwYXRjaGVkIHdpdGhvdXQKKyAgICAgICAgLy8gYSBsb2NrIGFuZCB3ZSBhcmUgYSBoaWdoZXIgbGV2ZWwgY29tcG9uZW50LgorICAgICAgICBhY3RpdmUgPSBhbS5pc1VpZEFjdGl2ZSh1aWQsIGNhbGxpbmdQYWNrYWdlKTsKKyAgICAgICAgaWYgKGFjdGl2ZSkgeworICAgICAgICAgICAgLy8gTm93IHRoYXQgd2UgZm91bmQgb3V0IHRoZSBVSUQgaXMgYWN0dWFsbHkgYWN0aXZlLCBjYWNoZSB0aGF0CisgICAgICAgICAgICBtQWN0aXZlVWlkcy5pbnNlcnQodWlkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYWN0aXZlOworfQorCit2b2lkIENhbWVyYVNlcnZpY2U6OlVpZFBvbGljeTo6VWlkUG9saWN5OjphZGRPdmVycmlkZVVpZCh1aWRfdCB1aWQsCisgICAgICAgIFN0cmluZzE2IGNhbGxpbmdQYWNrYWdlLCBib29sIGFjdGl2ZSkgeworICAgIHVwZGF0ZU92ZXJyaWRlVWlkKHVpZCwgY2FsbGluZ1BhY2thZ2UsIGFjdGl2ZSwgdHJ1ZSk7Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmljZTo6VWlkUG9saWN5OjpyZW1vdmVPdmVycmlkZVVpZCh1aWRfdCB1aWQsIFN0cmluZzE2IGNhbGxpbmdQYWNrYWdlKSB7CisgICAgdXBkYXRlT3ZlcnJpZGVVaWQodWlkLCBjYWxsaW5nUGFja2FnZSwgZmFsc2UsIGZhbHNlKTsKK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpVaWRQb2xpY3k6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIC8qd2hvKi8pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobVVpZExvY2spOworICAgIEFMT0dWKCJVaWRQb2xpY3k6IEFjdGl2aXR5TWFuYWdlciBoYXMgZGllZCIpOworICAgIG1SZWdpc3RlcmVkID0gZmFsc2U7CisgICAgbUFjdGl2ZVVpZHMuY2xlYXIoKTsKK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpVaWRQb2xpY3k6OnVwZGF0ZU92ZXJyaWRlVWlkKHVpZF90IHVpZCwgU3RyaW5nMTYgY2FsbGluZ1BhY2thZ2UsCisgICAgICAgIGJvb2wgYWN0aXZlLCBib29sIGluc2VydCkgeworICAgIGJvb2wgd2FzQWN0aXZlID0gZmFsc2U7CisgICAgYm9vbCBpc0FjdGl2ZSA9IGZhbHNlOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1VaWRMb2NrKTsKKyAgICAgICAgd2FzQWN0aXZlID0gaXNVaWRBY3RpdmVMb2NrZWQodWlkLCBjYWxsaW5nUGFja2FnZSk7CisgICAgICAgIG1PdmVycmlkZVVpZHMuZXJhc2UodWlkKTsKKyAgICAgICAgaWYgKGluc2VydCkgeworICAgICAgICAgICAgbU92ZXJyaWRlVWlkcy5pbnNlcnQoc3RkOjpwYWlyPHVpZF90LCBib29sPih1aWQsIGFjdGl2ZSkpOworICAgICAgICB9CisgICAgICAgIGlzQWN0aXZlID0gaXNVaWRBY3RpdmVMb2NrZWQodWlkLCBjYWxsaW5nUGFja2FnZSk7CisgICAgfQorICAgIGlmICh3YXNBY3RpdmUgIT0gaXNBY3RpdmUgJiYgIWlzQWN0aXZlKSB7CisgICAgICAgIHNwPENhbWVyYVNlcnZpY2U+IHNlcnZpY2UgPSBtU2VydmljZS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHNlcnZpY2UtPmJsb2NrQ2xpZW50c0ZvclVpZCh1aWQpOworICAgICAgICB9CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyAgICAgICAgICAgICAgICAgIENhbWVyYVN0YXRlCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIENhbWVyYVNlcnZpY2U6OkNhbWVyYVN0YXRlOjpDYW1lcmFTdGF0ZShjb25zdCBTdHJpbmc4JiBpZCwgaW50IGNvc3QsCiAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PFN0cmluZzg+JiBjb25mbGljdGluZykgOiBtSWQoaWQpLAotICAgICAgICBtU3RhdHVzKFN0YXR1c0ludGVybmFsOjpQUkVTRU5UKSwgbUNvc3QoY29zdCksIG1Db25mbGljdGluZyhjb25mbGljdGluZykge30KKyAgICAgICAgbVN0YXR1cyhTdGF0dXNJbnRlcm5hbDo6Tk9UX1BSRVNFTlQpLCBtQ29zdChjb3N0KSwgbUNvbmZsaWN0aW5nKGNvbmZsaWN0aW5nKSB7fQogCiBDYW1lcmFTZXJ2aWNlOjpDYW1lcmFTdGF0ZTo6fkNhbWVyYVN0YXRlKCkge30KIApAQCAtMjQ5OCw3ICsyNjgwLDEwIEBACiAgICAgfQogICAgIGRwcmludGYoZmQsICJcbj09IFNlcnZpY2UgZ2xvYmFsIGluZm86ID09XG5cbiIpOwogICAgIGRwcmludGYoZmQsICJOdW1iZXIgb2YgY2FtZXJhIGRldmljZXM6ICVkXG4iLCBtTnVtYmVyT2ZDYW1lcmFzKTsKLSAgICBkcHJpbnRmKGZkLCAiTnVtYmVyIG9mIG5vcm1hbCBjYW1lcmEgZGV2aWNlczogJWRcbiIsIG1OdW1iZXJPZk5vcm1hbENhbWVyYXMpOworICAgIGRwcmludGYoZmQsICJOdW1iZXIgb2Ygbm9ybWFsIGNhbWVyYSBkZXZpY2VzOiAlenVcbiIsIG1Ob3JtYWxEZXZpY2VJZHMuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Ob3JtYWxEZXZpY2VJZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgICBEZXZpY2UgJXp1IG1hcHMgdG8gXCIlc1wiXG4iLCBpLCBtTm9ybWFsRGV2aWNlSWRzW2ldLmNfc3RyKCkpOworICAgIH0KICAgICBTdHJpbmc4IGFjdGl2ZUNsaWVudFN0cmluZyA9IG1BY3RpdmVDbGllbnRNYW5hZ2VyLnRvU3RyaW5nKCk7CiAgICAgZHByaW50ZihmZCwgIkFjdGl2ZSBDYW1lcmEgQ2xpZW50czpcbiVzIiwgYWN0aXZlQ2xpZW50U3RyaW5nLnN0cmluZygpKTsKICAgICBkcHJpbnRmKGZkLCAiQWxsb3dlZCB1c2VyIElEczogJXNcbiIsIHRvU3RyaW5nKG1BbGxvd2VkVXNlcnMpLnN0cmluZygpKTsKQEAgLTI1MTAsNiArMjY5NSwxNiBAQAogICAgICAgICBkcHJpbnRmKGZkLCAiQ2FtZXJhU3RhdGVzIGluIHVzZSwgbWF5IGJlIGRlYWRsb2NrZWRcbiIpOwogICAgIH0KIAorICAgIGludCBhcmdTaXplID0gYXJncy5zaXplKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdTaXplOyBpKyspIHsKKyAgICAgICAgaWYgKGFyZ3NbaV0gPT0gVGFnTW9uaXRvcjo6a01vbml0b3JPcHRpb24pIHsKKyAgICAgICAgICAgIGlmIChpICsgMSA8IGFyZ1NpemUpIHsKKyAgICAgICAgICAgICAgICBtTW9uaXRvclRhZ3MgPSBTdHJpbmc4KGFyZ3NbaSArIDFdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCiAgICAgZm9yIChhdXRvJiBzdGF0ZSA6IG1DYW1lcmFTdGF0ZXMpIHsKICAgICAgICAgU3RyaW5nOCBjYW1lcmFJZCA9IHN0YXRlLmZpcnN0OwogCkBAIC0yNjM3LDcgKzI4MzIsNyBAQAogICAgICAgKiBXaGlsZSB0ZW1wdGluZyB0byBwcm9tb3RlIHRoZSB3cDxJQmluZGVyPiBpbnRvIGEgc3AsIGl0J3MgYWN0dWFsbHkgbm90IHN1cHBvcnRlZCBieSB0aGUKICAgICAgICogYmluZGVyIGRyaXZlcgogICAgICAgKi8KLQorICAgIC8vIFBJRCBoZXJlIGlzIGFwcHJveGltYXRlIGFuZCBjYW4gYmUgd3JvbmcuCiAgICAgbG9nQ2xpZW50RGllZChnZXRDYWxsaW5nUGlkKCksIFN0cmluZzgoIkJpbmRlciBkaWVkIHVuZXhwZWN0ZWRseSIpKTsKIAogICAgIC8vIGNoZWNrIHRvcmNoIGNsaWVudApAQCAtMjc0MywxMSArMjkzOCwxMSBAQAogfQogCiB2b2lkIENhbWVyYVNlcnZpY2U6OnVwZGF0ZVByb3h5RGV2aWNlU3RhdGUoaW50IG5ld1N0YXRlLAotICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgaW50IGZhY2luZywgY29uc3QgU3RyaW5nMTYmIGNsaWVudE5hbWUpIHsKKyAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGludCBmYWNpbmcsIGNvbnN0IFN0cmluZzE2JiBjbGllbnROYW1lLCBpbnQgYXBpTGV2ZWwpIHsKICAgICBzcDxJQ2FtZXJhU2VydmljZVByb3h5PiBwcm94eUJpbmRlciA9IGdldENhbWVyYVNlcnZpY2VQcm94eSgpOwogICAgIGlmIChwcm94eUJpbmRlciA9PSBudWxscHRyKSByZXR1cm47CiAgICAgU3RyaW5nMTYgaWQoY2FtZXJhSWQpOwotICAgIHByb3h5QmluZGVyLT5ub3RpZnlDYW1lcmFTdGF0ZShpZCwgbmV3U3RhdGUsIGZhY2luZywgY2xpZW50TmFtZSk7CisgICAgcHJveHlCaW5kZXItPm5vdGlmeUNhbWVyYVN0YXRlKGlkLCBuZXdTdGF0ZSwgZmFjaW5nLCBjbGllbnROYW1lLCBhcGlMZXZlbCk7CiB9CiAKIHN0YXR1c190IENhbWVyYVNlcnZpY2U6OmdldFRvcmNoU3RhdHVzTG9ja2VkKApAQCAtMjc3Nyw0ICsyOTcyLDkyIEBACiAgICAgcmV0dXJuIE9LOwogfQogCit2b2lkIENhbWVyYVNlcnZpY2U6OmJsb2NrQ2xpZW50c0ZvclVpZCh1aWRfdCB1aWQpIHsKKyAgICBjb25zdCBhdXRvIGNsaWVudHMgPSBtQWN0aXZlQ2xpZW50TWFuYWdlci5nZXRBbGwoKTsKKyAgICBmb3IgKGF1dG8mIGN1cnJlbnQgOiBjbGllbnRzKSB7CisgICAgICAgIGlmIChjdXJyZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8gYmFzaWNDbGllbnQgPSBjdXJyZW50LT5nZXRWYWx1ZSgpOworICAgICAgICAgICAgaWYgKGJhc2ljQ2xpZW50LmdldCgpICE9IG51bGxwdHIgJiYgYmFzaWNDbGllbnQtPmdldENsaWVudFVpZCgpID09IHVpZCkgeworICAgICAgICAgICAgICAgIGJhc2ljQ2xpZW50LT5ibG9jaygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvLyBOT1RFOiBUaGlzIGlzIGEgcmVtb3RlIEFQSSAtIG1ha2Ugc3VyZSBhbGwgYXJncyBhcmUgdmFsaWRhdGVkCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpzaGVsbENvbW1hbmQoaW50IGluLCBpbnQgb3V0LCBpbnQgZXJyLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSB7CisgICAgaWYgKCFjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNNYW5hZ2VDYW1lcmFQZXJtaXNzaW9uLCBudWxscHRyLCBudWxscHRyKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIGlmIChpbiA9PSBCQURfVFlQRSB8fCBvdXQgPT0gQkFEX1RZUEUgfHwgZXJyID09IEJBRF9UWVBFKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmIChhcmdzLnNpemUoKSA9PSAzICYmIGFyZ3NbMF0gPT0gU3RyaW5nMTYoInNldC11aWQtc3RhdGUiKSkgeworICAgICAgICByZXR1cm4gaGFuZGxlU2V0VWlkU3RhdGUoYXJncywgZXJyKTsKKyAgICB9IGVsc2UgaWYgKGFyZ3Muc2l6ZSgpID09IDIgJiYgYXJnc1swXSA9PSBTdHJpbmcxNigicmVzZXQtdWlkLXN0YXRlIikpIHsKKyAgICAgICAgcmV0dXJuIGhhbmRsZVJlc2V0VWlkU3RhdGUoYXJncywgZXJyKTsKKyAgICB9IGVsc2UgaWYgKGFyZ3Muc2l6ZSgpID09IDIgJiYgYXJnc1swXSA9PSBTdHJpbmcxNigiZ2V0LXVpZC1zdGF0ZSIpKSB7CisgICAgICAgIHJldHVybiBoYW5kbGVHZXRVaWRTdGF0ZShhcmdzLCBvdXQsIGVycik7CisgICAgfSBlbHNlIGlmIChhcmdzLnNpemUoKSA9PSAxICYmIGFyZ3NbMF0gPT0gU3RyaW5nMTYoImhlbHAiKSkgeworICAgICAgICBwcmludEhlbHAob3V0KTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICBwcmludEhlbHAoZXJyKTsKKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpoYW5kbGVTZXRVaWRTdGF0ZShjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzLCBpbnQgZXJyKSB7CisgICAgUGVybWlzc2lvbkNvbnRyb2xsZXIgcGM7CisgICAgaW50IHVpZCA9IHBjLmdldFBhY2thZ2VVaWQoYXJnc1sxXSwgMCk7CisgICAgaWYgKHVpZCA8PSAwKSB7CisgICAgICAgIEFMT0dFKCJVbmtub3duIHBhY2thZ2U6ICclcyciLCBTdHJpbmc4KGFyZ3NbMV0pLnN0cmluZygpKTsKKyAgICAgICAgZHByaW50ZihlcnIsICJVbmtub3duIHBhY2thZ2U6ICclcydcbiIsIFN0cmluZzgoYXJnc1sxXSkuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBib29sIGFjdGl2ZSA9IGZhbHNlOworICAgIGlmIChhcmdzWzJdID09IFN0cmluZzE2KCJhY3RpdmUiKSkgeworICAgICAgICBhY3RpdmUgPSB0cnVlOworICAgIH0gZWxzZSBpZiAoKGFyZ3NbMl0gIT0gU3RyaW5nMTYoImlkbGUiKSkpIHsKKyAgICAgICAgQUxPR0UoIkV4cGVjdGVkIGFjdGl2ZSBvciBpZGxlIGJ1dCBnb3Q6ICclcyciLCBTdHJpbmc4KGFyZ3NbMl0pLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgbVVpZFBvbGljeS0+YWRkT3ZlcnJpZGVVaWQodWlkLCBhcmdzWzFdLCBhY3RpdmUpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6aGFuZGxlUmVzZXRVaWRTdGF0ZShjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzLCBpbnQgZXJyKSB7CisgICAgUGVybWlzc2lvbkNvbnRyb2xsZXIgcGM7CisgICAgaW50IHVpZCA9IHBjLmdldFBhY2thZ2VVaWQoYXJnc1sxXSwgMCk7CisgICAgaWYgKHVpZCA8IDApIHsKKyAgICAgICAgQUxPR0UoIlVua25vd24gcGFja2FnZTogJyVzJyIsIFN0cmluZzgoYXJnc1sxXSkuc3RyaW5nKCkpOworICAgICAgICBkcHJpbnRmKGVyciwgIlVua25vd24gcGFja2FnZTogJyVzJ1xuIiwgU3RyaW5nOChhcmdzWzFdKS5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIG1VaWRQb2xpY3ktPnJlbW92ZU92ZXJyaWRlVWlkKHVpZCwgYXJnc1sxXSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpoYW5kbGVHZXRVaWRTdGF0ZShjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzLCBpbnQgb3V0LCBpbnQgZXJyKSB7CisgICAgUGVybWlzc2lvbkNvbnRyb2xsZXIgcGM7CisgICAgaW50IHVpZCA9IHBjLmdldFBhY2thZ2VVaWQoYXJnc1sxXSwgMCk7CisgICAgaWYgKHVpZCA8PSAwKSB7CisgICAgICAgIEFMT0dFKCJVbmtub3duIHBhY2thZ2U6ICclcyciLCBTdHJpbmc4KGFyZ3NbMV0pLnN0cmluZygpKTsKKyAgICAgICAgZHByaW50ZihlcnIsICJVbmtub3duIHBhY2thZ2U6ICclcydcbiIsIFN0cmluZzgoYXJnc1sxXSkuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAobVVpZFBvbGljeS0+aXNVaWRBY3RpdmUodWlkLCBhcmdzWzFdKSkgeworICAgICAgICByZXR1cm4gZHByaW50ZihvdXQsICJhY3RpdmVcbiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBkcHJpbnRmKG91dCwgImlkbGVcbiIpOworICAgIH0KK30KKworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6cHJpbnRIZWxwKGludCBvdXQpIHsKKyAgICByZXR1cm4gZHByaW50ZihvdXQsICJDYW1lcmEgc2VydmljZSBjb21tYW5kczpcbiIKKyAgICAgICAgIiAgZ2V0LXVpZC1zdGF0ZSA8UEFDS0FHRT4gZ2V0cyB0aGUgdWlkIHN0YXRlXG4iCisgICAgICAgICIgIHNldC11aWQtc3RhdGUgPFBBQ0tBR0U+IDxhY3RpdmV8aWRsZT4gb3ZlcnJpZGVzIHRoZSB1aWQgc3RhdGVcbiIKKyAgICAgICAgIiAgcmVzZXQtdWlkLXN0YXRlIDxQQUNLQUdFPiBjbGVhcnMgdGhlIHVpZCBzdGF0ZSBvdmVycmlkZVxuIgorICAgICAgICAiICBoZWxwIHByaW50IHRoaXMgbWVzc2FnZVxuIik7Cit9CisKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKaW5kZXggNmQ1ZGRlOC4uOGQ0YmNkYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaApAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGJpbmRlci9BcHBPcHNNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YmluZGVyL0JpbmRlclNlcnZpY2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvSUFwcE9wc0NhbGxiYWNrLmg+CisjaW5jbHVkZSA8YmluZGVyL0lVaWRPYnNlcnZlci5oPgogI2luY2x1ZGUgPGhhcmR3YXJlL2NhbWVyYS5oPgogCiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvY29tbW9uLzEuMC90eXBlcy5oPgpAQCAtNDcsNiArNDgsOCBAQAogI2luY2x1ZGUgPG1hcD4KICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNTksNyArNjIsNiBAQAogICAgIHB1YmxpYyBCaW5kZXJTZXJ2aWNlPENhbWVyYVNlcnZpY2U+LAogICAgIHB1YmxpYyB2aXJ0dWFsIDo6YW5kcm9pZDo6aGFyZHdhcmU6OkJuQ2FtZXJhU2VydmljZSwKICAgICBwdWJsaWMgdmlydHVhbCBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCwKLSAgICBwdWJsaWMgY2FtZXJhX21vZHVsZV9jYWxsYmFja3NfdCwKICAgICBwdWJsaWMgdmlydHVhbCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlN0YXR1c0xpc3RlbmVyCiB7CiAgICAgZnJpZW5kIGNsYXNzIEJpbmRlclNlcnZpY2U8Q2FtZXJhU2VydmljZT47CkBAIC0xNjMsNiArMTY1LDggQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzaGVsbENvbW1hbmQoaW50IGluLCBpbnQgb3V0LCBpbnQgZXJyLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKwogICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgIC8vIENsaWVudCBmdW5jdGlvbmFsaXR5CiAKQEAgLTE4NSw3ICsxODksOCBAQAogICAgICAgICAgICAgaW50IG5ld1N0YXRlLAogICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCiAgICAgICAgICAgICBpbnQgZmFjaW5nLAotICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudE5hbWUpOworICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudE5hbWUsCisgICAgICAgICAgICBpbnQgYXBpTGV2ZWwpOwogCiAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgLy8gQ2FtZXJhRGV2aWNlRmFjdG9yeSBmdW5jdGlvbmFsaXR5CkBAIC0yMDAsNyArMjA1LDggQEAKIAogICAgIGNsYXNzIEJhc2ljQ2xpZW50IDogcHVibGljIHZpcnR1YWwgUmVmQmFzZSB7CiAgICAgcHVibGljOgotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgIGluaXRpYWxpemUoc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyKSA9IDA7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgaW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIsCisgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgbW9uaXRvclRhZ3MpID0gMDsKICAgICAgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBkaXNjb25uZWN0KCk7CiAKICAgICAgICAgLy8gYmVjYXVzZSB3ZSBjYW4ndCB2aXJ0dWFsbHkgaW5oZXJpdCBJSW50ZXJmYWNlLCB3aGljaCBicmVha3MKQEAgLTIzMyw2ICsyMzksOSBAQAogICAgICAgICAvLyBDaGVjayB3aGF0IEFQSSBsZXZlbCBpcyB1c2VkIGZvciB0aGlzIGNsaWVudC4gVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSB3aGljaAogICAgICAgICAvLyBzdXBlcmNsYXNzIHRoaXMgY2FuIGJlIGNhc3QgdG8uCiAgICAgICAgIHZpcnR1YWwgYm9vbCBjYW5DYXN0VG9BcGlDbGllbnQoYXBpTGV2ZWwgbGV2ZWwpIGNvbnN0OworCisgICAgICAgIC8vIEJsb2NrIHRoZSBjbGllbnQgZm9ybSB1c2luZyB0aGUgY2FtZXJhCisgICAgICAgIHZpcnR1YWwgdm9pZCBibG9jaygpOwogICAgIHByb3RlY3RlZDoKICAgICAgICAgQmFzaWNDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUJpbmRlcj4mIHJlbW90ZUNhbGxiYWNrLApAQCAtMzI1LDYgKzMzNCw3IEBACiAgICAgICAgICAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OklDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsCiAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkU3RyLAorICAgICAgICAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsCiAgICAgICAgICAgICAgICAgaW50IGNhbWVyYUZhY2luZywKICAgICAgICAgICAgICAgICBpbnQgY2xpZW50UGlkLAogICAgICAgICAgICAgICAgIHVpZF90IGNsaWVudFVpZCwKQEAgLTUwNiwxMiArNTE2LDUxIEBACiAgICAgICAgIENhbWVyYVBhcmFtZXRlcnMgbVNoaW1QYXJhbXM7CiAgICAgfTsgLy8gY2xhc3MgQ2FtZXJhU3RhdGUKIAorICAgIC8vIE9ic2VydmVyIGZvciBVSUQgbGlmZWN5Y2xlIGVuZm9yY2luZyB0aGF0IFVJRHMgaW4gaWRsZQorICAgIC8vIHN0YXRlIGNhbm5vdCB1c2UgdGhlIGNhbWVyYSB0byBwcm90ZWN0IHVzZXIgcHJpdmFjeS4KKyAgICBjbGFzcyBVaWRQb2xpY3kgOiBwdWJsaWMgQm5VaWRPYnNlcnZlciwgcHVibGljIHZpcnR1YWwgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgeworICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgVWlkUG9saWN5KHNwPENhbWVyYVNlcnZpY2U+IHNlcnZpY2UpCisgICAgICAgICAgICAgICAgOiBtUmVnaXN0ZXJlZChmYWxzZSksIG1TZXJ2aWNlKHNlcnZpY2UpIHt9CisKKyAgICAgICAgdm9pZCByZWdpc3RlclNlbGYoKTsKKyAgICAgICAgdm9pZCB1bnJlZ2lzdGVyU2VsZigpOworCisgICAgICAgIGJvb2wgaXNVaWRBY3RpdmUodWlkX3QgdWlkLCBTdHJpbmcxNiBjYWxsaW5nUGFja2FnZSk7CisKKyAgICAgICAgdm9pZCBvblVpZEdvbmUodWlkX3QgdWlkLCBib29sIGRpc2FibGVkKTsKKyAgICAgICAgdm9pZCBvblVpZEFjdGl2ZSh1aWRfdCB1aWQpOworICAgICAgICB2b2lkIG9uVWlkSWRsZSh1aWRfdCB1aWQsIGJvb2wgZGlzYWJsZWQpOworCisgICAgICAgIHZvaWQgYWRkT3ZlcnJpZGVVaWQodWlkX3QgdWlkLCBTdHJpbmcxNiBjYWxsaW5nUGFja2FnZSwgYm9vbCBhY3RpdmUpOworICAgICAgICB2b2lkIHJlbW92ZU92ZXJyaWRlVWlkKHVpZF90IHVpZCwgU3RyaW5nMTYgY2FsbGluZ1BhY2thZ2UpOworCisgICAgICAgIC8vIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IGltcGxlbWVudGF0aW9uCisgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICZ3aG8pOworICAgIHByaXZhdGU6CisgICAgICAgIGJvb2wgaXNVaWRBY3RpdmVMb2NrZWQodWlkX3QgdWlkLCBTdHJpbmcxNiBjYWxsaW5nUGFja2FnZSk7CisgICAgICAgIHZvaWQgdXBkYXRlT3ZlcnJpZGVVaWQodWlkX3QgdWlkLCBTdHJpbmcxNiBjYWxsaW5nUGFja2FnZSwgYm9vbCBhY3RpdmUsIGJvb2wgaW5zZXJ0KTsKKworICAgICAgICBNdXRleCBtVWlkTG9jazsKKyAgICAgICAgYm9vbCBtUmVnaXN0ZXJlZDsKKyAgICAgICAgd3A8Q2FtZXJhU2VydmljZT4gbVNlcnZpY2U7CisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDx1aWRfdD4gbUFjdGl2ZVVpZHM7CisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwgYm9vbD4gbU92ZXJyaWRlVWlkczsKKyAgICB9OyAvLyBjbGFzcyBVaWRQb2xpY3kKKworICAgIHNwPFVpZFBvbGljeT4gbVVpZFBvbGljeTsKKwogICAgIC8vIERlbGF5LWxvYWQgdGhlIENhbWVyYSBIQUwgbW9kdWxlCiAgICAgdmlydHVhbCB2b2lkIG9uRmlyc3RSZWYoKTsKIAogICAgIC8vIEV1bWVyYXRlIGFsbCBjYW1lcmEgcHJvdmlkZXJzIGluIHRoZSBzeXN0ZW0KICAgICBzdGF0dXNfdCBlbnVtZXJhdGVQcm92aWRlcnMoKTsKIAorICAgIC8vIEFkZC9yZW1vdmUgYSBuZXcgY2FtZXJhIHRvIGNhbWVyYSBhbmQgdG9yY2ggc3RhdGUgbGlzdHMgb3IgcmVtb3ZlIGFuIHVucGx1Z2dlZCBvbmUKKyAgICAvLyBDYWxsZXIgbXVzdCBub3QgaG9sZCBtU2VydmljZUxvY2sKKyAgICB2b2lkIGFkZFN0YXRlcyhjb25zdCBTdHJpbmc4IGlkKTsKKyAgICB2b2lkIHJlbW92ZVN0YXRlcyhjb25zdCBTdHJpbmc4IGlkKTsKKwogICAgIC8vIENoZWNrIGlmIHdlIGNhbiBjb25uZWN0LCBiZWZvcmUgd2UgYWNxdWlyZSB0aGUgc2VydmljZSBsb2NrLgogICAgIC8vIFRoZSByZXR1cm5lZCBvcmlnaW5hbENsaWVudFBpZCBpcyB0aGUgUElEIG9mIHRoZSBvcmlnaW5hbCBwcm9jZXNzIHRoYXQgd2FudHMgdG8gY29ubmVjdCB0bwogICAgIC8vIGNhbWVyYS4KQEAgLTUzNSw3ICs1ODQsNyBAQAogICAgIC8vIFNpbmdsZSBpbXBsZW1lbnRhdGlvbiBzaGFyZWQgYmV0d2VlbiB0aGUgdmFyaW91cyBjb25uZWN0IGNhbGxzCiAgICAgdGVtcGxhdGU8Y2xhc3MgQ0FMTEJBQ0ssIGNsYXNzIENMSUVOVD4KICAgICBiaW5kZXI6OlN0YXR1cyBjb25uZWN0SGVscGVyKGNvbnN0IHNwPENBTExCQUNLPiYgY2FtZXJhQ2IsIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAotICAgICAgICAgICAgaW50IGhhbFZlcnNpb24sIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsIGludCBoYWxWZXJzaW9uLCBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCiAgICAgICAgICAgICBpbnQgY2xpZW50VWlkLCBpbnQgY2xpZW50UGlkLAogICAgICAgICAgICAgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsIGJvb2wgbGVnYWN5TW9kZSwgYm9vbCBzaGltVXBkYXRlT25seSwKICAgICAgICAgICAgIC8qb3V0Ki9zcDxDTElFTlQ+JiBkZXZpY2UpOwpAQCAtNTYyLDYgKzYxMSw5IEBACiAgICAgUmluZ0J1ZmZlcjxTdHJpbmc4PiBtRXZlbnRMb2c7CiAgICAgTXV0ZXggbUxvZ0xvY2s7CiAKKyAgICAvLyBUaGUgbGFzdCBtb25pdG9yZWQgdGFncyBzZXQgYnkgY2xpZW50CisgICAgU3RyaW5nOCBtTW9uaXRvclRhZ3M7CisKICAgICAvLyBDdXJyZW50bHkgYWxsb3dlZCB1c2VyIElEcwogICAgIHN0ZDo6c2V0PHVzZXJpZF90PiBtQWxsb3dlZFVzZXJzOwogCkBAIC01OTcsOSArNjQ5LDE2IEBACiAgICAgdm9pZCBmaW5pc2hDb25uZWN0TG9ja2VkKGNvbnN0IHNwPEJhc2ljQ2xpZW50PiYgY2xpZW50LCBjb25zdCBEZXNjcmlwdG9yUHRyJiBkZXNjKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGludGVnZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gY2FtZXJhIElEIHN0cmluZywgb3IgLTEgb24gZmFpbHVyZS4KKyAgICAgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIGNhbWVyYSBJZCBzdHJpbmcgbWFwcGVkIHRvIGEgY2FtZXJhIGlkIGludAorICAgICAqIEVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCB3aGVuIHRoZSBjYW1lcmFJZEludCBpcyBpbnZhbGlkLgogICAgICAqLwotICAgIHN0YXRpYyBpbnQgY2FtZXJhSWRUb0ludChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCk7CisgICAgU3RyaW5nOCBjYW1lcmFJZEludFRvU3RyKGludCBjYW1lcmFJZEludCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIGNhbWVyYSBJZCBzdHJpbmcgbWFwcGVkIHRvIGEgY2FtZXJhIGlkIGludAorICAgICAqIEVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCB3aGVuIHRoZSBjYW1lcmFJZEludCBpcyBpbnZhbGlkLgorICAgICAqLworICAgIHN0ZDo6c3RyaW5nIGNhbWVyYUlkSW50VG9TdHJMb2NrZWQoaW50IGNhbWVyYUlkSW50KTsKIAogICAgIC8qKgogICAgICAqIFJlbW92ZSBhIHNpbmdsZSBjbGllbnQgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gY2FtZXJhIGlkIGZyb20gdGhlIGxpc3Qgb2YgYWN0aXZlIGNsaWVudHMuCkBAIC02NjcsMTEgKzcyNiwxNyBAQAogICAgICAqLwogICAgIHZvaWQgZHVtcEV2ZW50TG9nKGludCBmZCk7CiAKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGFjcXVpcmUgbVNlcnZpY2VMb2NrCisgICAgICovCisgICAgdm9pZCB1cGRhdGVDYW1lcmFOdW1BbmRJZHMoKTsKKwogICAgIGludCAgICAgICAgICAgICAgICAgbU51bWJlck9mQ2FtZXJhczsKLSAgICBpbnQgICAgICAgICAgICAgICAgIG1OdW1iZXJPZk5vcm1hbENhbWVyYXM7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbU5vcm1hbERldmljZUlkczsKIAogICAgIC8vIHNvdW5kcwotICAgIE1lZGlhUGxheWVyKiAgICAgICAgbmV3TWVkaWFQbGF5ZXIoY29uc3QgY2hhciAqZmlsZSk7CisgICAgc3A8TWVkaWFQbGF5ZXI+ICAgICBuZXdNZWRpYVBsYXllcihjb25zdCBjaGFyICpmaWxlKTsKIAogICAgIE11dGV4ICAgICAgICAgICAgICAgbVNvdW5kTG9jazsKICAgICBzcDxNZWRpYVBsYXllcj4gICAgIG1Tb3VuZFBsYXllcltOVU1fU09VTkRTXTsKQEAgLTc1Miw2ICs4MTcsMjEgQEAKICAgICAgKi8KICAgICBiaW5kZXI6OlN0YXR1cyAgICAgIGdldExlZ2FjeVBhcmFtZXRlcnNMYXp5KGludCBjYW1lcmFJZCwgLypvdXQqL0NhbWVyYVBhcmFtZXRlcnMqIHBhcmFtZXRlcnMpOwogCisgICAgLy8gQmxvY2tzIGFsbCBjbGllbnRzIGZyb20gdGhlIFVJRAorICAgIHZvaWQgYmxvY2tDbGllbnRzRm9yVWlkKHVpZF90IHVpZCk7CisKKyAgICAvLyBPdmVycmlkZXMgdGhlIFVJRCBzdGF0ZSBhcyBpZiBpdCBpcyBpZGxlCisgICAgc3RhdHVzX3QgaGFuZGxlU2V0VWlkU3RhdGUoY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncywgaW50IGVycik7CisKKyAgICAvLyBDbGVhcnMgdGhlIG92ZXJyaWRlIGZvciB0aGUgVUlEIHN0YXRlCisgICAgc3RhdHVzX3QgaGFuZGxlUmVzZXRVaWRTdGF0ZShjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzLCBpbnQgZXJyKTsKKworICAgIC8vIEdldHMgdGhlIFVJRCBzdGF0ZQorICAgIHN0YXR1c190IGhhbmRsZUdldFVpZFN0YXRlKGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MsIGludCBvdXQsIGludCBlcnIpOworCisgICAgLy8gUHJpbnRzIHRoZSBzaGVsbCBjb21tYW5kIGhlbHAKKyAgICBzdGF0dXNfdCBwcmludEhlbHAoaW50IG91dCk7CisKICAgICBzdGF0aWMgaW50IGdldENhbGxpbmdQaWQoKTsKIAogICAgIHN0YXRpYyBpbnQgZ2V0Q2FsbGluZ1VpZCgpOwpAQCAtNzYzLDggKzg0Myw4IEBACiAKICAgICBzdGF0aWMgYmluZGVyOjpTdGF0dXMgbWFrZUNsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IHNwPElJbnRlcmZhY2U+JiBjYW1lcmFDYiwgY29uc3QgU3RyaW5nMTYmIHBhY2thZ2VOYW1lLCBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKLSAgICAgICAgICAgIGludCBmYWNpbmcsIGludCBjbGllbnRQaWQsIHVpZF90IGNsaWVudFVpZCwgaW50IHNlcnZpY2VQaWQsIGJvb2wgbGVnYWN5TW9kZSwKLSAgICAgICAgICAgIGludCBoYWxWZXJzaW9uLCBpbnQgZGV2aWNlVmVyc2lvbiwgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsCisgICAgICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLCBpbnQgZmFjaW5nLCBpbnQgY2xpZW50UGlkLCB1aWRfdCBjbGllbnRVaWQsIGludCBzZXJ2aWNlUGlkLAorICAgICAgICAgICAgYm9vbCBsZWdhY3lNb2RlLCBpbnQgaGFsVmVyc2lvbiwgaW50IGRldmljZVZlcnNpb24sIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLAogICAgICAgICAgICAgLypvdXQqL3NwPEJhc2ljQ2xpZW50PiogY2xpZW50KTsKIAogICAgIHN0YXR1c190IGNoZWNrQ2FtZXJhQWNjZXNzKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwCmluZGV4IDU4NWQyZWIuLjY1ZmFhYzkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcApAQCAtNDksMTYgKzQ5LDE3IEBACiBDYW1lcmEyQ2xpZW50OjpDYW1lcmEyQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICBjb25zdCBzcDxoYXJkd2FyZTo6SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCwKICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICBpbnQgY2FtZXJhSWQsCisgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYURldmljZUlkLAorICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLAogICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLAogICAgICAgICBpbnQgY2xpZW50UGlkLAogICAgICAgICB1aWRfdCBjbGllbnRVaWQsCiAgICAgICAgIGludCBzZXJ2aWNlUGlkLAogICAgICAgICBib29sIGxlZ2FjeU1vZGUpOgogICAgICAgICBDYW1lcmEyQ2xpZW50QmFzZShjYW1lcmFTZXJ2aWNlLCBjYW1lcmFDbGllbnQsIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgIFN0cmluZzg6OmZvcm1hdCgiJWQiLCBjYW1lcmFJZCksIGNhbWVyYUZhY2luZywKKyAgICAgICAgICAgICAgICBjYW1lcmFEZXZpY2VJZCwgYXBpMUNhbWVyYUlkLCBjYW1lcmFGYWNpbmcsCiAgICAgICAgICAgICAgICAgY2xpZW50UGlkLCBjbGllbnRVaWQsIHNlcnZpY2VQaWQpLAotICAgICAgICBtUGFyYW1ldGVycyhjYW1lcmFJZCwgY2FtZXJhRmFjaW5nKQorICAgICAgICBtUGFyYW1ldGVycyhhcGkxQ2FtZXJhSWQsIGNhbWVyYUZhY2luZykKIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogCkBAIC02OCw4ICs2OSw4IEBACiAgICAgbUxlZ2FjeU1vZGUgPSBsZWdhY3lNb2RlOwogfQogCi1zdGF0dXNfdCBDYW1lcmEyQ2xpZW50Ojppbml0aWFsaXplKHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlcikgewotICAgIHJldHVybiBpbml0aWFsaXplSW1wbChtYW5hZ2VyKTsKK3N0YXR1c190IENhbWVyYTJDbGllbnQ6OmluaXRpYWxpemUoc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyLCBjb25zdCBTdHJpbmc4JiBtb25pdG9yVGFncykgeworICAgIHJldHVybiBpbml0aWFsaXplSW1wbChtYW5hZ2VyLCBtb25pdG9yVGFncyk7CiB9CiAKIGJvb2wgQ2FtZXJhMkNsaWVudDo6aXNac2xFbmFibGVkSW5TdGlsbFRlbXBsYXRlKCkgewpAQCAtODcsMTMgKzg4LDEzIEBACiB9CiAKIHRlbXBsYXRlPHR5cGVuYW1lIFRQcm92aWRlclB0cj4KLXN0YXR1c190IENhbWVyYTJDbGllbnQ6OmluaXRpYWxpemVJbXBsKFRQcm92aWRlclB0ciBwcm92aWRlclB0cikKK3N0YXR1c190IENhbWVyYTJDbGllbnQ6OmluaXRpYWxpemVJbXBsKFRQcm92aWRlclB0ciBwcm92aWRlclB0ciwgY29uc3QgU3RyaW5nOCYgbW9uaXRvclRhZ3MpCiB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBBTE9HVigiJXM6IEluaXRpYWxpemluZyBjbGllbnQgZm9yIGNhbWVyYSAlZCIsIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKICAgICBzdGF0dXNfdCByZXM7CiAKLSAgICByZXMgPSBDYW1lcmEyQ2xpZW50QmFzZTo6aW5pdGlhbGl6ZShwcm92aWRlclB0cik7CisgICAgcmVzID0gQ2FtZXJhMkNsaWVudEJhc2U6OmluaXRpYWxpemUocHJvdmlkZXJQdHIsIG1vbml0b3JUYWdzKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQpAQCAtNzc4LDcgKzc3OSwzNSBAQAogICAgIGludCBsYXN0SnBlZ1N0cmVhbUlkID0gbUpwZWdQcm9jZXNzb3ItPmdldFN0cmVhbUlkKCk7CiAgICAgLy8gSWYganBlZyBzdHJlYW0gd2lsbCBzbG93IGRvd24gcHJldmlldywgbWFrZSBzdXJlIHdlIHJlbW92ZSBpdCBiZWZvcmUgc3RhcnRpbmcgcHJldmlldwogICAgIGlmIChwYXJhbXMuc2xvd0pwZWdNb2RlKSB7Ci0gICAgICAgIG1KcGVnUHJvY2Vzc29yLT5kZWxldGVTdHJlYW0oKTsKKyAgICAgICAgLy8gUGF1c2UgcHJldmlldyBpZiB3ZSBhcmUgc3RyZWFtaW5nCisgICAgICAgIGludDMyX3QgYWN0aXZlUmVxdWVzdElkID0gbVN0cmVhbWluZ1Byb2Nlc3Nvci0+Z2V0QWN0aXZlUmVxdWVzdElkKCk7CisgICAgICAgIGlmIChhY3RpdmVSZXF1ZXN0SWQgIT0gMCkgeworICAgICAgICAgICAgcmVzID0gbVN0cmVhbWluZ1Byb2Nlc3Nvci0+dG9nZ2xlUGF1c2VTdHJlYW0oLypwYXVzZSovdHJ1ZSk7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IHBhdXNlIHN0cmVhbWluZzogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXMgPSBtRGV2aWNlLT53YWl0VW50aWxEcmFpbmVkKCk7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFdhaXRpbmcgdG8gc3RvcCBzdHJlYW1pbmcgZmFpbGVkOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJlcyA9IG1KcGVnUHJvY2Vzc29yLT5kZWxldGVTdHJlYW0oKTsKKworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogZGVsZXRlIEpwZWcgc3RyZWFtIGZhaWxlZDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYWN0aXZlUmVxdWVzdElkICE9IDApIHsKKyAgICAgICAgICAgIHJlcyA9IG1TdHJlYW1pbmdQcm9jZXNzb3ItPnRvZ2dsZVBhdXNlU3RyZWFtKC8qcGF1c2UqL2ZhbHNlKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgdW5wYXVzZSBzdHJlYW1pbmc6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmVzID0gdXBkYXRlUHJvY2Vzc29yU3RyZWFtKG1KcGVnUHJvY2Vzc29yLCBwYXJhbXMpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oCmluZGV4IDVhZjc0ZWIuLjQ0OTI5YzMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oCkBAIC05MSw3ICs5MSw4IEBACiAgICAgQ2FtZXJhMkNsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50LAogICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgaW50IGNhbWVyYUlkLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhRGV2aWNlSWQsCisgICAgICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLAogICAgICAgICAgICAgaW50IGNhbWVyYUZhY2luZywKICAgICAgICAgICAgIGludCBjbGllbnRQaWQsCiAgICAgICAgICAgICB1aWRfdCBjbGllbnRVaWQsCkBAIC0xMDAsNyArMTAxLDggQEAKIAogICAgIHZpcnR1YWwgfkNhbWVyYTJDbGllbnQoKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBtb25pdG9yVGFncykgb3ZlcnJpZGU7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIApAQCAtMjIzLDcgKzIyNSw3IEBACiAgICAgc3RhdHVzX3Qgb3ZlcnJpZGVWaWRlb1NuYXBzaG90U2l6ZShQYXJhbWV0ZXJzICZwYXJhbXMpOwogCiAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVFByb3ZpZGVyUHRyPgotICAgIHN0YXR1c190IGluaXRpYWxpemVJbXBsKFRQcm92aWRlclB0ciBwcm92aWRlclB0cik7CisgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZUltcGwoVFByb3ZpZGVyUHRyIHByb3ZpZGVyUHRyLCBjb25zdCBTdHJpbmc4JiBtb25pdG9yVGFncyk7CiAKICAgICBib29sIGlzWnNsRW5hYmxlZEluU3RpbGxUZW1wbGF0ZSgpOwogfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmNwcAppbmRleCBhNDA3ZDBiLi5mMTIwM2Y5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuY3BwCkBAIC00Miw3ICs0Miw3IEBACiAgICAgICAgIGludCBjbGllbnRQaWQsIGludCBjbGllbnRVaWQsCiAgICAgICAgIGludCBzZXJ2aWNlUGlkLCBib29sIGxlZ2FjeU1vZGUpOgogICAgICAgICBDbGllbnQoY2FtZXJhU2VydmljZSwgY2FtZXJhQ2xpZW50LCBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICBTdHJpbmc4Ojpmb3JtYXQoIiVkIiwgY2FtZXJhSWQpLCBjYW1lcmFGYWNpbmcsIGNsaWVudFBpZCwKKyAgICAgICAgICAgICAgICBTdHJpbmc4Ojpmb3JtYXQoIiVkIiwgY2FtZXJhSWQpLCBjYW1lcmFJZCwgY2FtZXJhRmFjaW5nLCBjbGllbnRQaWQsCiAgICAgICAgICAgICAgICAgY2xpZW50VWlkLCBzZXJ2aWNlUGlkKQogewogICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOwpAQCAtNjIsNyArNjIsOCBAQAogICAgIExPRzEoIkNhbWVyYUNsaWVudDo6Q2FtZXJhQ2xpZW50IFggKHBpZCAlZCwgaWQgJWQpIiwgY2FsbGluZ1BpZCwgY2FtZXJhSWQpOwogfQogCi1zdGF0dXNfdCBDYW1lcmFDbGllbnQ6OmluaXRpYWxpemUoc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyKSB7CitzdGF0dXNfdCBDYW1lcmFDbGllbnQ6OmluaXRpYWxpemUoc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyLAorICAgICAgICBjb25zdCBTdHJpbmc4JiAvKm1vbml0b3JUYWdzKi8pIHsKICAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKICAgICBzdGF0dXNfdCByZXM7CiAKQEAgLTEzNiw3ICsxMzcsMTIgQEAKICAgICBjb25zdCBjaGFyICplbmRkdW1wID0gIlxuXG4iOwogICAgIHdyaXRlKGZkLCBlbmRkdW1wLCBzdHJsZW4oZW5kZHVtcCkpOwogCi0gICAgcmV0dXJuIG1IYXJkd2FyZS0+ZHVtcChmZCwgYXJncyk7CisgICAgc3A8Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U+IGhhcmR3YXJlID0gbUhhcmR3YXJlOworICAgIGlmIChoYXJkd2FyZSAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBoYXJkd2FyZS0+ZHVtcChmZCwgYXJncyk7CisgICAgfQorICAgIEFMT0dJKCIlczogY2FtZXJhIGRldmljZSBjbG9zZWQgYWxyZWFkeSwgc2tpcCBkdW1waW5nIiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gT0s7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTI1Nyw3ICsyNjMsOCBAQAogICAgIG1IYXJkd2FyZS0+c3RvcFByZXZpZXcoKTsKICAgICBzQ2FtZXJhU2VydmljZS0+dXBkYXRlUHJveHlEZXZpY2VTdGF0ZSgKICAgICAgICAgICAgIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZVByb3h5OjpDQU1FUkFfU1RBVEVfSURMRSwKLSAgICAgICAgICAgIG1DYW1lcmFJZFN0ciwgbUNhbWVyYUZhY2luZywgbUNsaWVudFBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgIG1DYW1lcmFJZFN0ciwgbUNhbWVyYUZhY2luZywgbUNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlUHJveHk6OkNBTUVSQV9BUElfTEVWRUxfMSk7CiAgICAgbUhhcmR3YXJlLT5jYW5jZWxQaWN0dXJlKCk7CiAgICAgLy8gUmVsZWFzZSB0aGUgaGFyZHdhcmUgcmVzb3VyY2VzLgogICAgIG1IYXJkd2FyZS0+cmVsZWFzZSgpOwpAQCAtNDE5LDcgKzQyNiw4IEBACiAgICAgaWYgKHJlc3VsdCA9PSBOT19FUlJPUikgewogICAgICAgICBzQ2FtZXJhU2VydmljZS0+dXBkYXRlUHJveHlEZXZpY2VTdGF0ZSgKICAgICAgICAgICAgIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZVByb3h5OjpDQU1FUkFfU1RBVEVfQUNUSVZFLAotICAgICAgICAgICAgbUNhbWVyYUlkU3RyLCBtQ2FtZXJhRmFjaW5nLCBtQ2xpZW50UGFja2FnZU5hbWUpOworICAgICAgICAgICAgbUNhbWVyYUlkU3RyLCBtQ2FtZXJhRmFjaW5nLCBtQ2xpZW50UGFja2FnZU5hbWUsCisgICAgICAgICAgICBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VQcm94eTo6Q0FNRVJBX0FQSV9MRVZFTF8xKTsKICAgICB9CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTQ2Miw3ICs0NzAsOCBAQAogICAgIG1IYXJkd2FyZS0+c3RvcFByZXZpZXcoKTsKICAgICBzQ2FtZXJhU2VydmljZS0+dXBkYXRlUHJveHlEZXZpY2VTdGF0ZSgKICAgICAgICAgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlUHJveHk6OkNBTUVSQV9TVEFURV9JRExFLAotICAgICAgICBtQ2FtZXJhSWRTdHIsIG1DYW1lcmFGYWNpbmcsIG1DbGllbnRQYWNrYWdlTmFtZSk7CisgICAgICAgIG1DYW1lcmFJZFN0ciwgbUNhbWVyYUZhY2luZywgbUNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VQcm94eTo6Q0FNRVJBX0FQSV9MRVZFTF8xKTsKICAgICBtUHJldmlld0J1ZmZlci5jbGVhcigpOwogfQogCkBAIC01MDMsNyArNTEyLDcgQEAKIAogdm9pZCBDYW1lcmFDbGllbnQ6OnJlbGVhc2VSZWNvcmRpbmdGcmFtZUhhbmRsZShuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSkgewogICAgIGlmIChoYW5kbGUgPT0gbnVsbHB0cikgcmV0dXJuOwotCisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIHNwPElNZW1vcnk+IGRhdGFQdHI7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtQXZhaWxhYmxlQ2FsbGJhY2tCdWZmZXJzTG9jayk7CkBAIC01MjcsMTcgKzUzNiwyMiBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgVmlkZW9OYXRpdmVIYW5kbGVNZXRhZGF0YSAqbWV0YWRhdGEgPSAoVmlkZW9OYXRpdmVIYW5kbGVNZXRhZGF0YSopKGRhdGFQdHItPnBvaW50ZXIoKSk7Ci0gICAgbWV0YWRhdGEtPmVUeXBlID0ga01ldGFkYXRhQnVmZmVyVHlwZU5hdGl2ZUhhbmRsZVNvdXJjZTsKLSAgICBtZXRhZGF0YS0+cEhhbmRsZSA9IGhhbmRsZTsKLQotICAgIG1IYXJkd2FyZS0+cmVsZWFzZVJlY29yZGluZ0ZyYW1lKGRhdGFQdHIpOworICAgIGlmIChtSGFyZHdhcmUgIT0gbnVsbHB0cikgeworICAgICAgICBWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhICptZXRhZGF0YSA9IChWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhKikoZGF0YVB0ci0+cG9pbnRlcigpKTsKKyAgICAgICAgbWV0YWRhdGEtPmVUeXBlID0ga01ldGFkYXRhQnVmZmVyVHlwZU5hdGl2ZUhhbmRsZVNvdXJjZTsKKyAgICAgICAgbWV0YWRhdGEtPnBIYW5kbGUgPSBoYW5kbGU7CisgICAgICAgIG1IYXJkd2FyZS0+cmVsZWFzZVJlY29yZGluZ0ZyYW1lKGRhdGFQdHIpOworICAgIH0KIH0KIAogdm9pZCBDYW1lcmFDbGllbnQ6OnJlbGVhc2VSZWNvcmRpbmdGcmFtZUhhbmRsZUJhdGNoKGNvbnN0IHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+JiBoYW5kbGVzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGJvb2wgZGlzY29ubmVjdGVkID0gKG1IYXJkd2FyZSA9PSBudWxscHRyKTsKICAgICBzaXplX3QgbiA9IGhhbmRsZXMuc2l6ZSgpOwogICAgIHN0ZDo6dmVjdG9yPHNwPElNZW1vcnk+PiBmcmFtZXM7Ci0gICAgZnJhbWVzLnJlc2VydmUobik7CisgICAgaWYgKCFkaXNjb25uZWN0ZWQpIHsKKyAgICAgICAgZnJhbWVzLnJlc2VydmUobik7CisgICAgfQogICAgIGJvb2wgZXJyb3IgPSBmYWxzZTsKICAgICBmb3IgKGF1dG8mIGhhbmRsZSA6IGhhbmRsZXMpIHsKICAgICAgICAgc3A8SU1lbW9yeT4gZGF0YVB0cjsKQEAgLTU2MSwxMCArNTc1LDEyIEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIFZpZGVvTmF0aXZlSGFuZGxlTWV0YWRhdGEgKm1ldGFkYXRhID0gKFZpZGVvTmF0aXZlSGFuZGxlTWV0YWRhdGEqKShkYXRhUHRyLT5wb2ludGVyKCkpOwotICAgICAgICBtZXRhZGF0YS0+ZVR5cGUgPSBrTWV0YWRhdGFCdWZmZXJUeXBlTmF0aXZlSGFuZGxlU291cmNlOwotICAgICAgICBtZXRhZGF0YS0+cEhhbmRsZSA9IGhhbmRsZTsKLSAgICAgICAgZnJhbWVzLnB1c2hfYmFjayhkYXRhUHRyKTsKKyAgICAgICAgaWYgKCFkaXNjb25uZWN0ZWQpIHsKKyAgICAgICAgICAgIFZpZGVvTmF0aXZlSGFuZGxlTWV0YWRhdGEgKm1ldGFkYXRhID0gKFZpZGVvTmF0aXZlSGFuZGxlTWV0YWRhdGEqKShkYXRhUHRyLT5wb2ludGVyKCkpOworICAgICAgICAgICAgbWV0YWRhdGEtPmVUeXBlID0ga01ldGFkYXRhQnVmZmVyVHlwZU5hdGl2ZUhhbmRsZVNvdXJjZTsKKyAgICAgICAgICAgIG1ldGFkYXRhLT5wSGFuZGxlID0gaGFuZGxlOworICAgICAgICAgICAgZnJhbWVzLnB1c2hfYmFjayhkYXRhUHRyKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChlcnJvcikgewpAQCAtNTcyLDcgKzU4OCw3IEBACiAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKGhhbmRsZSk7CiAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoYW5kbGUpOwogICAgICAgICB9Ci0gICAgfSBlbHNlIHsKKyAgICB9IGVsc2UgaWYgKCFkaXNjb25uZWN0ZWQpIHsKICAgICAgICAgbUhhcmR3YXJlLT5yZWxlYXNlUmVjb3JkaW5nRnJhbWVCYXRjaChmcmFtZXMpOwogICAgIH0KICAgICByZXR1cm47CkBAIC05NjEsNyArOTc3LDggQEAKICAgICAvLyBpZGxlIG5vdywgdW50aWwgcHJldmlldyBpcyByZXN0YXJ0ZWQKICAgICBzQ2FtZXJhU2VydmljZS0+dXBkYXRlUHJveHlEZXZpY2VTdGF0ZSgKICAgICAgICAgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlUHJveHk6OkNBTUVSQV9TVEFURV9JRExFLAotICAgICAgICBtQ2FtZXJhSWRTdHIsIG1DYW1lcmFGYWNpbmcsIG1DbGllbnRQYWNrYWdlTmFtZSk7CisgICAgICAgIG1DYW1lcmFJZFN0ciwgbUNhbWVyYUZhY2luZywgbUNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VQcm94eTo6Q0FNRVJBX0FQSV9MRVZFTF8xKTsKIAogICAgIG1Mb2NrLnVubG9jaygpOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmgKaW5kZXggN2Y5M2ZlZi4uMTkxMDUzNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5oCkBAIC03Miw3ICs3Miw4IEBACiAgICAgICAgICAgICBib29sIGxlZ2FjeU1vZGUgPSBmYWxzZSk7CiAgICAgfkNhbWVyYUNsaWVudCgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplKHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlcikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplKHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlciwKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIG1vbml0b3JUYWdzKSBvdmVycmlkZTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FsbGJhY2tQcm9jZXNzb3IuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhbGxiYWNrUHJvY2Vzc29yLmNwcAppbmRleCAwZDJkYmExLi5hNzFhNzMyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FsbGJhY2tQcm9jZXNzb3IuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5jcHAKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxMi0yMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE1NCw3ICsxNTQsOCBAQAogICAgICAgICAgICAgICAgIGNhbGxiYWNrRm9ybWF0LCBwYXJhbXMucHJldmlld0Zvcm1hdCk7CiAgICAgICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlU3RyZWFtKG1DYWxsYmFja1dpbmRvdywKICAgICAgICAgICAgICAgICBwYXJhbXMucHJldmlld1dpZHRoLCBwYXJhbXMucHJldmlld0hlaWdodCwgY2FsbGJhY2tGb3JtYXQsCi0gICAgICAgICAgICAgICAgSEFMX0RBVEFTUEFDRV9WMF9KRklGLCBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl8wLCAmbUNhbGxiYWNrU3RyZWFtSWQpOworICAgICAgICAgICAgICAgIEhBTF9EQVRBU1BBQ0VfVjBfSkZJRiwgQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fMCwgJm1DYWxsYmFja1N0cmVhbUlkLAorICAgICAgICAgICAgICAgIFN0cmluZzgoKSk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBjcmVhdGUgb3V0cHV0IHN0cmVhbSBmb3IgY2FsbGJhY2tzOiAiCiAgICAgICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtSWQsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmNwcAppbmRleCA2ZTIxMTI2Li4wYzczOGU3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5jcHAKQEAgLTE5Nyw3ICsxOTcsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlUmVjdHNbaSo0ICsgMl0sIHNjYWxlckNyb3ApOwogICAgICAgICAgICAgZmFjZS5yZWN0WzNdID0gbC5tUGFyYW1ldGVycy5hcnJheVlUb05vcm1hbGl6ZWRXaXRoQ3JvcCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZVJlY3RzW2kqNCArIDNdLCBzY2FsZXJDcm9wKTsKLQogICAgICAgICAgICAgZmFjZS5zY29yZSA9IGZhY2VTY29yZXNbaV07CiAgICAgICAgICAgICBpZiAoZmFjZURldGVjdE1vZGUgPT0gQU5EUk9JRF9TVEFUSVNUSUNTX0ZBQ0VfREVURUNUX01PREVfRlVMTCkgewogICAgICAgICAgICAgICAgIGZhY2UuaWQgPSBmYWNlSWRzW2ldOwpAQCAtMjkyLDcgKzI5MSw4IEBACiAgICAgfQogCiAgICAgLy8gT25jZSBhbGwgM0Egc3RhdGVzIGFyZSByZWNlaXZlZCwgbm90aWZ5IHRoZSBjbGllbnQgYWJvdXQgM0EgY2hhbmdlcy4KLSAgICBpZiAocGVuZGluZ1N0YXRlLmFlU3RhdGUgIT0gbTNhU3RhdGUuYWVTdGF0ZSkgeworICAgIGlmIChwZW5kaW5nU3RhdGUuYWVTdGF0ZSAhPSBtM2FTdGF0ZS5hZVN0YXRlIHx8CisgICAgICAgICAgICBwZW5kaW5nU3RhdGUuYWVUcmlnZ2VySWQgPiBtM2FTdGF0ZS5hZVRyaWdnZXJJZCkgewogICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogQUUgc3RhdGUgJWQtPiVkIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLAogICAgICAgICAgICAgICAgIG0zYVN0YXRlLmFlU3RhdGUsIHBlbmRpbmdTdGF0ZS5hZVN0YXRlKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmNwcApvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IGQ4YjdhZjIuLmI3MDIwZmUKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDEyLTIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTY4LDcgKzE2OCw4IEBACiAgICAgICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlU3RyZWFtKG1DYXB0dXJlV2luZG93LAogICAgICAgICAgICAgICAgIHBhcmFtcy5waWN0dXJlV2lkdGgsIHBhcmFtcy5waWN0dXJlSGVpZ2h0LAogICAgICAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfQkxPQiwgSEFMX0RBVEFTUEFDRV9WMF9KRklGLAotICAgICAgICAgICAgICAgIENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzAsICZtQ2FwdHVyZVN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl8wLCAmbUNhcHR1cmVTdHJlYW1JZCwKKyAgICAgICAgICAgICAgICBTdHJpbmc4KCkpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgY3JlYXRlIG91dHB1dCBzdHJlYW0gZm9yIGNhcHR1cmU6ICIKICAgICAgICAgICAgICAgICAgICAgIiVzICglZCkiLCBfX0ZVTkNUSU9OX18sIG1JZCwKQEAgLTE5OCw3ICsxOTksMTEgQEAKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgfQogCi0gICAgICAgIGRldmljZS0+ZGVsZXRlU3RyZWFtKG1DYXB0dXJlU3RyZWFtSWQpOworICAgICAgICBzdGF0dXNfdCByZXMgPSBkZXZpY2UtPmRlbGV0ZVN0cmVhbShtQ2FwdHVyZVN0cmVhbUlkKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBkZWxldGUgc3RyZWFtICVkIGZhaWxlZCEiLCBfX0ZVTkNUSU9OX18sIG1DYXB0dXJlU3RyZWFtSWQpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQogCiAgICAgICAgIG1DYXB0dXJlSGVhcC5jbGVhcigpOwogICAgICAgICBtQ2FwdHVyZVdpbmRvdy5jbGVhcigpOwpAQCAtMzk1LDcgKzQwMCw3IEBACiAgICAgfQogCiAgICAgLy8gUmVhZCBKRklGIHNlZ21lbnQgbWFya2Vycywgc2tpcCBvdmVyIHNlZ21lbnQgZGF0YQotICAgIHNpemUgPSAwOworICAgIHNpemUgPSBNQVJLRVJfTEVOR1RIOyAvL2p1bXAgU09JOwogICAgIHdoaWxlIChzaXplIDw9IG1heFNpemUgLSBNQVJLRVJfTEVOR1RIKSB7CiAgICAgICAgIHNlZ21lbnRfdCAqc2VnbWVudCA9IChzZWdtZW50X3QqKShqcGVnQnVmZmVyICsgc2l6ZSk7CiAgICAgICAgIHVpbnQ4X3QgdHlwZSA9IGNoZWNrSnBlZ01hcmtlcihzZWdtZW50LT5tYXJrZXIpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwCmluZGV4IDZmYjVjMjEuLmQ2NmRlYzQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAKQEAgLTI0Miw3ICsyNDIsOSBAQAogICAgICAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCwgYXZhaWxhYmxlRnBzUmFuZ2VzLmRhdGEuaTMyW2krMV0pKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaSAhPSAwKSBzdXBwb3J0ZWRQcmV2aWV3RnBzUmFuZ2UgKz0gIiwiOworICAgICAgICAgICAgaWYgKHN1cHBvcnRlZFByZXZpZXdGcHNSYW5nZS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBzdXBwb3J0ZWRQcmV2aWV3RnBzUmFuZ2UgKz0gIiwiOworICAgICAgICAgICAgfQogICAgICAgICAgICAgc3VwcG9ydGVkUHJldmlld0Zwc1JhbmdlICs9IFN0cmluZzg6OmZvcm1hdCgiKCVkLCVkKSIsCiAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUZwc1Jhbmdlcy5kYXRhLmkzMltpXSAqIGtGcHNUb0FwaVNjYWxlLAogICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVGcHNSYW5nZXMuZGF0YS5pMzJbaSsxXSAqIGtGcHNUb0FwaVNjYWxlKTsKQEAgLTc1OSwxMiArNzYxLDE3IEBACiAgICAgZm9jdXNpbmdBcmVhcy5jbGVhcigpOwogICAgIGZvY3VzaW5nQXJlYXMuYWRkKFBhcmFtZXRlcnM6OkFyZWEoMCwwLDAsMCwwKSk7CiAKLSAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVGb2NhbExlbmd0aHMgPQotICAgICAgICBzdGF0aWNJbmZvKEFORFJPSURfTEVOU19JTkZPX0FWQUlMQUJMRV9GT0NBTF9MRU5HVEhTLCAwLCAwLCBmYWxzZSk7Ci0gICAgaWYgKCFhdmFpbGFibGVGb2NhbExlbmd0aHMuY291bnQpIHJldHVybiBOT19JTklUOworICAgIGlmIChmYXN0SW5mby5pc0V4dGVybmFsQ2FtZXJhKSB7CisgICAgICAgIHBhcmFtcy5zZXRGbG9hdChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfRk9DQUxfTEVOR1RILCAtMS4wKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVGb2NhbExlbmd0aHMgPQorICAgICAgICAgICAgc3RhdGljSW5mbyhBTkRST0lEX0xFTlNfSU5GT19BVkFJTEFCTEVfRk9DQUxfTEVOR1RIUywgMCwgMCwgZmFsc2UpOworICAgICAgICBpZiAoIWF2YWlsYWJsZUZvY2FsTGVuZ3Rocy5jb3VudCkgcmV0dXJuIE5PX0lOSVQ7CiAKLSAgICBmbG9hdCBtaW5Gb2NhbExlbmd0aCA9IGF2YWlsYWJsZUZvY2FsTGVuZ3Rocy5kYXRhLmZbMF07Ci0gICAgcGFyYW1zLnNldEZsb2F0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9GT0NBTF9MRU5HVEgsIG1pbkZvY2FsTGVuZ3RoKTsKKyAgICAgICAgZmxvYXQgbWluRm9jYWxMZW5ndGggPSBhdmFpbGFibGVGb2NhbExlbmd0aHMuZGF0YS5mWzBdOworICAgICAgICBwYXJhbXMuc2V0RmxvYXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0ZPQ0FMX0xFTkdUSCwgbWluRm9jYWxMZW5ndGgpOworICAgIH0KKwogCiAgICAgZmxvYXQgaG9yaXpGb3YsIHZlcnRGb3Y7CiAgICAgcmVzID0gY2FsY3VsYXRlUGljdHVyZUZvdnMoJmhvcml6Rm92LCAmdmVydEZvdik7CkBAIC05NDcsMTMgKzk1NCwyNCBAQAogICAgICAgICBjb25zdCB1aW50OF90ICpjYXBzID0gYXZhaWxhYmxlQ2FwYWJpbGl0aWVzLmRhdGEudTg7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXZhaWxhYmxlQ2FwYWJpbGl0aWVzLmNvdW50OyBpKyspIHsKICAgICAgICAgICAgIGlmIChBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19QUklWQVRFX1JFUFJPQ0VTU0lORyA9PQotICAgICAgICAgICAgICAgIGNhcHNbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgY2Fwc1tpXSkgewogICAgICAgICAgICAgICAgIGlzWnNsUmVwcm9jZXNzUHJlc2VudCA9IHRydWU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpc0Rpc3RvcnRpb25Db3JyZWN0aW9uU3VwcG9ydGVkID0gZmFsc2U7CisgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZGlzdG9ydGlvbkNvcnJlY3Rpb25Nb2RlcyA9CisgICAgICAgICAgICBzdGF0aWNJbmZvKEFORFJPSURfRElTVE9SVElPTl9DT1JSRUNUSU9OX0FWQUlMQUJMRV9NT0RFUyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkaXN0b3J0aW9uQ29ycmVjdGlvbk1vZGVzLmNvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKGRpc3RvcnRpb25Db3JyZWN0aW9uTW9kZXMuZGF0YS51OFtpXSAhPQorICAgICAgICAgICAgICAgIEFORFJPSURfRElTVE9SVElPTl9DT1JSRUNUSU9OX01PREVfT0ZGKSB7CisgICAgICAgICAgICBpc0Rpc3RvcnRpb25Db3JyZWN0aW9uU3VwcG9ydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCiAgICAgaWYgKGlzRGV2aWNlWnNsU3VwcG9ydGVkIHx8IHNsb3dKcGVnTW9kZSB8fAogICAgICAgICAgICAgcHJvcGVydHlfZ2V0X2Jvb2woImNhbWVyYS5kaXNhYmxlX3pzbF9tb2RlIiwgZmFsc2UpKSB7CiAgICAgICAgIEFMT0dJKCJDYW1lcmEgJWQ6IERpc2FibGluZyBaU0wgbW9kZSIsIGNhbWVyYUlkKTsKQEAgLTEwOTEsOSArMTEwOSwxNSBAQAogICAgICAgICAgICAgZm9jdXNEaXN0YW5jZUNhbGlicmF0aW9uLmRhdGEudThbMF0gIT0KICAgICAgICAgICAgIEFORFJPSURfTEVOU19JTkZPX0ZPQ1VTX0RJU1RBTkNFX0NBTElCUkFUSU9OX1VOQ0FMSUJSQVRFRCk7CiAKKworICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGh3TGV2ZWwgPSBzdGF0aWNJbmZvKEFORFJPSURfSU5GT19TVVBQT1JURURfSEFSRFdBUkVfTEVWRUwpOworICAgIGlmICghaHdMZXZlbC5jb3VudCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgZmFzdEluZm8uaXNFeHRlcm5hbENhbWVyYSA9CisgICAgICAgICAgICBod0xldmVsLmRhdGEudThbMF0gPT0gQU5EUk9JRF9JTkZPX1NVUFBPUlRFRF9IQVJEV0FSRV9MRVZFTF9FWFRFUk5BTDsKKwogICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGF2YWlsYWJsZUZvY2FsTGVuZ3RocyA9Ci0gICAgICAgIHN0YXRpY0luZm8oQU5EUk9JRF9MRU5TX0lORk9fQVZBSUxBQkxFX0ZPQ0FMX0xFTkdUSFMpOwotICAgIGlmICghYXZhaWxhYmxlRm9jYWxMZW5ndGhzLmNvdW50KSByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgc3RhdGljSW5mbyhBTkRST0lEX0xFTlNfSU5GT19BVkFJTEFCTEVfRk9DQUxfTEVOR1RIUywgMCwgMCwgLypyZXF1aXJlZCovZmFsc2UpOworICAgIGlmICghYXZhaWxhYmxlRm9jYWxMZW5ndGhzLmNvdW50ICYmICFmYXN0SW5mby5pc0V4dGVybmFsQ2FtZXJhKSByZXR1cm4gTk9fSU5JVDsKIAogICAgIFNvcnRlZFZlY3RvcjxpbnQzMl90PiBhdmFpbGFibGVGb3JtYXRzID0gZ2V0QXZhaWxhYmxlT3V0cHV0Rm9ybWF0cygpOwogICAgIGlmICghYXZhaWxhYmxlRm9ybWF0cy5zaXplKCkpIHJldHVybiBOT19JTklUOwpAQCAtMTE3OCwxMCArMTIwMiwxNCBAQAogCiAgICAgLy8gRmluZCBzbWFsbGVzdCAod2lkZXN0LWFuZ2xlKSBmb2NhbCBsZW5ndGggdG8gdXNlIGFzIGJhc2lzIG9mIHN0aWxsCiAgICAgLy8gcGljdHVyZSBGT1YgcmVwb3J0aW5nLgotICAgIGZhc3RJbmZvLm1pbkZvY2FsTGVuZ3RoID0gYXZhaWxhYmxlRm9jYWxMZW5ndGhzLmRhdGEuZlswXTsKLSAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IGF2YWlsYWJsZUZvY2FsTGVuZ3Rocy5jb3VudDsgaSsrKSB7Ci0gICAgICAgIGlmIChmYXN0SW5mby5taW5Gb2NhbExlbmd0aCA+IGF2YWlsYWJsZUZvY2FsTGVuZ3Rocy5kYXRhLmZbaV0pIHsKLSAgICAgICAgICAgIGZhc3RJbmZvLm1pbkZvY2FsTGVuZ3RoID0gYXZhaWxhYmxlRm9jYWxMZW5ndGhzLmRhdGEuZltpXTsKKyAgICBpZiAoZmFzdEluZm8uaXNFeHRlcm5hbENhbWVyYSkgeworICAgICAgICBmYXN0SW5mby5taW5Gb2NhbExlbmd0aCA9IC0xLjA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmFzdEluZm8ubWluRm9jYWxMZW5ndGggPSBhdmFpbGFibGVGb2NhbExlbmd0aHMuZGF0YS5mWzBdOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IGF2YWlsYWJsZUZvY2FsTGVuZ3Rocy5jb3VudDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZmFzdEluZm8ubWluRm9jYWxMZW5ndGggPiBhdmFpbGFibGVGb2NhbExlbmd0aHMuZGF0YS5mW2ldKSB7CisgICAgICAgICAgICAgICAgZmFzdEluZm8ubWluRm9jYWxMZW5ndGggPSBhdmFpbGFibGVGb2NhbExlbmd0aHMuZGF0YS5mW2ldOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0xMTk4LDYgKzEyMjYsMzUgQEAKIAogICAgIGZhc3RJbmZvLm1heEpwZWdTaXplID0gZ2V0TWF4U2l6ZShnZXRBdmFpbGFibGVKcGVnU2l6ZXMoKSk7CiAKKyAgICBpc1pzbFJlcHJvY2Vzc1ByZXNlbnQgPSBmYWxzZTsKKyAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVDYXBhYmlsaXRpZXMgPQorICAgICAgICBzdGF0aWNJbmZvKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTKTsKKyAgICBpZiAoMCA8IGF2YWlsYWJsZUNhcGFiaWxpdGllcy5jb3VudCkgeworICAgICAgICBjb25zdCB1aW50OF90ICpjYXBzID0gYXZhaWxhYmxlQ2FwYWJpbGl0aWVzLmRhdGEudTg7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXZhaWxhYmxlQ2FwYWJpbGl0aWVzLmNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19QUklWQVRFX1JFUFJPQ0VTU0lORyA9PQorICAgICAgICAgICAgICAgICAgICBjYXBzW2ldKSB7CisgICAgICAgICAgICAgICAgaXNac2xSZXByb2Nlc3NQcmVzZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaXNac2xSZXByb2Nlc3NQcmVzZW50KSB7CisgICAgICAgIFZlY3RvcjxTdHJlYW1Db25maWd1cmF0aW9uPiBzY3MgPSBnZXRTdHJlYW1Db25maWd1cmF0aW9ucygpOworICAgICAgICBTaXplIG1heFByaXZJbnB1dFNpemUgPSB7MCwgMH07CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgc2MgOiBzY3MpIHsKKyAgICAgICAgICAgIGlmIChzYy5pc0lucHV0ID09IEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlNfSU5QVVQgJiYKKyAgICAgICAgICAgICAgICAgICAgc2MuZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCkgeworICAgICAgICAgICAgICAgIGlmIChzYy53aWR0aCAqIHNjLmhlaWdodCA+IG1heFByaXZJbnB1dFNpemUud2lkdGggKiBtYXhQcml2SW5wdXRTaXplLmhlaWdodCkgeworICAgICAgICAgICAgICAgICAgICBtYXhQcml2SW5wdXRTaXplID0ge3NjLndpZHRoLCBzYy5oZWlnaHR9OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmYXN0SW5mby5tYXhac2xTaXplID0gbWF4UHJpdklucHV0U2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBmYXN0SW5mby5tYXhac2xTaXplID0gezAsIDB9OworICAgIH0KKwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMTMyNCw4ICsxMzgxLDggQEAKICAgICB7CiAgICAgICAgIGNvbnN0IGNoYXIgKmZwc1JhbmdlLCAqZnBzU2luZ2xlOwogCi0gICAgICAgIGZwc1JhbmdlID0gbmV3UGFyYW1zLmdldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUFJFVklFV19GUkFNRV9SQVRFKTsKLSAgICAgICAgZnBzU2luZ2xlID0gbmV3UGFyYW1zLmdldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUFJFVklFV19GUFNfUkFOR0UpOworICAgICAgICBmcHNTaW5nbGUgPSBuZXdQYXJhbXMuZ2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9QUkVWSUVXX0ZSQU1FX1JBVEUpOworICAgICAgICBmcHNSYW5nZSA9IG5ld1BhcmFtcy5nZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1BSRVZJRVdfRlBTX1JBTkdFKTsKIAogICAgICAgICAvKioKICAgICAgICAgICogUGljayBlaXRoZXIgdGhlIHJhbmdlIG9yIHRoZSBzaW5nbGUga2V5IGlmIG9ubHkgb25lIHdhcyBzZXQuCkBAIC0yMDUxLDE1ICsyMTA4LDI0IEBACiAKICAgICBpZiAoaW50ZW50LmNvdW50ID09IDApIHJldHVybiBCQURfVkFMVUU7CiAKKyAgICB1aW50OF90IGRpc3RvcnRpb25Nb2RlID0gQU5EUk9JRF9ESVNUT1JUSU9OX0NPUlJFQ1RJT05fTU9ERV9PRkY7CiAgICAgaWYgKGludGVudC5kYXRhLnU4WzBdID09IEFORFJPSURfQ09OVFJPTF9DQVBUVVJFX0lOVEVOVF9TVElMTF9DQVBUVVJFKSB7CiAgICAgICAgIHJlcyA9IHJlcXVlc3QtPnVwZGF0ZShBTkRST0lEX0NPTlRST0xfQUVfVEFSR0VUX0ZQU19SQU5HRSwKICAgICAgICAgICAgICAgICBmYXN0SW5mby5iZXN0U3RpbGxDYXB0dXJlRnBzUmFuZ2UsIDIpOworICAgICAgICBkaXN0b3J0aW9uTW9kZSA9IEFORFJPSURfRElTVE9SVElPTl9DT1JSRUNUSU9OX01PREVfSElHSF9RVUFMSVRZOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHJlcyA9IHJlcXVlc3QtPnVwZGF0ZShBTkRST0lEX0NPTlRST0xfQUVfVEFSR0VUX0ZQU19SQU5HRSwKICAgICAgICAgICAgICAgICBwcmV2aWV3RnBzUmFuZ2UsIDIpOworICAgICAgICBkaXN0b3J0aW9uTW9kZSA9IEFORFJPSURfRElTVE9SVElPTl9DT1JSRUNUSU9OX01PREVfRkFTVDsKICAgICB9CiAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKIAorICAgIGlmIChpc0Rpc3RvcnRpb25Db3JyZWN0aW9uU3VwcG9ydGVkKSB7CisgICAgICAgIHJlcyA9IHJlcXVlc3QtPnVwZGF0ZShBTkRST0lEX0RJU1RPUlRJT05fQ09SUkVDVElPTl9NT0RFLAorICAgICAgICAgICAgICAgICZkaXN0b3J0aW9uTW9kZSwgMSk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CisgICAgfQorCiAgICAgaWYgKGF1dG9XaGl0ZUJhbGFuY2VMb2NrQXZhaWxhYmxlKSB7CiAgICAgICAgIHVpbnQ4X3QgcmVxV2JMb2NrID0gYXV0b1doaXRlQmFsYW5jZUxvY2sgPwogICAgICAgICAgICAgICAgIEFORFJPSURfQ09OVFJPTF9BV0JfTE9DS19PTiA6IEFORFJPSURfQ09OVFJPTF9BV0JfTE9DS19PRkY7CkBAIC0yMjAyLDYgKzIyNjgsMTQgQEAKICAgICAgICAgICAgICAgICBub3JtYWxpemVkWFRvQXJyYXkobWV0ZXJpbmdBcmVhc1tqXS5yaWdodCk7CiAgICAgICAgICAgICByZXFNZXRlcmluZ0FyZWFzW2kgKyAzXSA9CiAgICAgICAgICAgICAgICAgbm9ybWFsaXplZFlUb0FycmF5KG1ldGVyaW5nQXJlYXNbal0uYm90dG9tKTsKKyAgICAgICAgICAgIC8vIFJlcXVlc3RlZCBzaXplIG1heSBiZSB6ZXJvIGJ5IHJvdW5kaW5nIGVycm9yIHdpdGgvd2l0aG91dCB6b29taW5nLgorICAgICAgICAgICAgLy8gVGhlIGFlIHJlZ2lvbnMgc2hvdWxkIGJlIGF0IGxlYXN0IDEgaWYgbWV0ZXJpbmcgd2lkdGgvaGVpZ2h0IGlzIG5vdCB6ZXJvLgorICAgICAgICAgICAgaWYgKHJlcU1ldGVyaW5nQXJlYXNbaSArIDBdID09IHJlcU1ldGVyaW5nQXJlYXNbaSArIDJdKSB7CisgICAgICAgICAgICAgICAgcmVxTWV0ZXJpbmdBcmVhc1tpICsgMl0rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZXFNZXRlcmluZ0FyZWFzW2kgKyAxXSA9PSByZXFNZXRlcmluZ0FyZWFzW2kgKyAzXSkgeworICAgICAgICAgICAgICAgIHJlcU1ldGVyaW5nQXJlYXNbaSArIDNdKys7CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByZXFNZXRlcmluZ0FyZWFzW2kgKyAwXSA9IDA7CiAgICAgICAgICAgICByZXFNZXRlcmluZ0FyZWFzW2kgKyAxXSA9IDA7CkBAIC0yODYyLDggKzI5MzYsMTMgQEAKICAgICAgICAgaWYgKHNjLmlzSW5wdXQgPT0gQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OU19PVVRQVVQgJiYKICAgICAgICAgICAgICAgICBzYy5mb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEICYmCiAgICAgICAgICAgICAgICAgc2Mud2lkdGggPD0gbGltaXQud2lkdGggJiYgc2MuaGVpZ2h0IDw9IGxpbWl0LmhlaWdodCkgewotICAgICAgICAgICAgU2l6ZSBzeiA9IHtzYy53aWR0aCwgc2MuaGVpZ2h0fTsKLSAgICAgICAgICAgIHNpemVzLT5wdXNoKHN6KTsKKyAgICAgICAgICAgIGludDY0X3QgbWluRnJhbWVEdXJhdGlvbiA9IGdldE1pbkZyYW1lRHVyYXRpb25OcygKKyAgICAgICAgICAgICAgICAgICAge3NjLndpZHRoLCBzYy5oZWlnaHR9LCBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQpOworICAgICAgICAgICAgaWYgKG1pbkZyYW1lRHVyYXRpb24gPiBNQVhfUFJFVklFV19SRUNPUkRfRFVSQVRJT05fTlMpIHsKKyAgICAgICAgICAgICAgICAvLyBGaWx0ZXIgc2xvdyBzaXplcyBmcm9tIHByZXZpZXcvcmVjb3JkCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzaXplcy0+cHVzaCh7c2Mud2lkdGgsIHNjLmhlaWdodH0pOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zMDczLDYgKzMxNTIsMTYgQEAKIAogc3RhdHVzX3QgUGFyYW1ldGVyczo6Y2FsY3VsYXRlUGljdHVyZUZvdnMoZmxvYXQgKmhvcml6Rm92LCBmbG9hdCAqdmVydEZvdikKICAgICAgICAgY29uc3QgeworICAgIGlmIChmYXN0SW5mby5pc0V4dGVybmFsQ2FtZXJhKSB7CisgICAgICAgIGlmIChob3JpekZvdiAhPSBOVUxMKSB7CisgICAgICAgICAgICAqaG9yaXpGb3YgPSAtMS4wOworICAgICAgICB9CisgICAgICAgIGlmICh2ZXJ0Rm92ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICp2ZXJ0Rm92ID0gLTEuMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCiAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3Qgc2Vuc29yU2l6ZSA9CiAgICAgICAgICAgICBzdGF0aWNJbmZvKEFORFJPSURfU0VOU09SX0lORk9fUEhZU0lDQUxfU0laRSwgMiwgMik7CiAgICAgaWYgKCFzZW5zb3JTaXplLmNvdW50KSByZXR1cm4gTk9fSU5JVDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5oCmluZGV4IDE3ZTNkNzUuLjk3ZjhlYTcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuaApAQCAtMTc3LDYgKzE3Nyw4IEBACiAgICAgYm9vbCBpc1pzbFJlcHJvY2Vzc1ByZXNlbnQ7CiAgICAgLy8gV2hldGhlciB0aGUgZGV2aWNlIHN1cHBvcnRzIGVuYWJsZVpzbC4KICAgICBib29sIGlzRGV2aWNlWnNsU3VwcG9ydGVkOworICAgIC8vIFdoZXRoZXIgdGhlIGRldmljZSBzdXBwb3J0cyBnZW9tZXRyaWMgZGlzdG9ydGlvbiBjb3JyZWN0aW9uCisgICAgYm9vbCBpc0Rpc3RvcnRpb25Db3JyZWN0aW9uU3VwcG9ydGVkOwogCiAgICAgLy8gT3ZlcmFsbCBjYW1lcmEgc3RhdGUKICAgICBlbnVtIFN0YXRlIHsKQEAgLTIwNyw2ICsyMDksMTEgQEAKICAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBGUFNfTUFSR0lOID0gMTsKICAgICAvLyBNYXggRlBTIGZvciBkZWZhdWx0IHBhcmFtZXRlcnMKICAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBNQVhfREVGQVVMVF9GUFMgPSAzMDsKKyAgICAvLyBNaW5pbXVtIEZQUyBmb3IgYSBzaXplIHRvIGJlIGxpc3RlZCBpbiBzdXBwb3J0ZWQgcHJldmlldy92aWRlbyBzaXplcworICAgIC8vIFNldCB0byBzbGlnaHRseSBsZXNzIHRoYW4gMzAuMCB0byBoYXZlIHNvbWUgdG9sZXJhbmNlIG1hcmdpbgorICAgIHN0YXRpYyBjb25zdGV4cHIgZG91YmxlIE1JTl9QUkVWSUVXX1JFQ09SRF9GUFMgPSAyOS45NzsKKyAgICAvLyBNYXhpbXVtIGZyYW1lIGR1cmF0aW9uIGZvciBhIHNpemUgdG8gYmUgbGlzdGVkIGluIHN1cHBvcnRlZCBwcmV2aWV3L3ZpZGVvIHNpemVzCisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IE1BWF9QUkVWSUVXX1JFQ09SRF9EVVJBVElPTl9OUyA9IDFlOSAvIE1JTl9QUkVWSUVXX1JFQ09SRF9GUFM7CiAKICAgICAvLyBGdWxsIHN0YXRpYyBjYW1lcmEgaW5mbywgb2JqZWN0IG93bmVkIGJ5IHNvbWVvbmUgZWxzZSwgc3VjaCBhcwogICAgIC8vIENhbWVyYTJEZXZpY2UuCkBAIC0yMzMsOSArMjQwLDExIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH07CiAgICAgICAgIERlZmF1bHRLZXllZFZlY3Rvcjx1aW50OF90LCBPdmVycmlkZU1vZGVzPiBzY2VuZU1vZGVPdmVycmlkZXM7CisgICAgICAgIGJvb2wgaXNFeHRlcm5hbENhbWVyYTsKICAgICAgICAgZmxvYXQgbWluRm9jYWxMZW5ndGg7CiAgICAgICAgIGJvb2wgdXNlRmxleGlibGVZdXY7CiAgICAgICAgIFNpemUgbWF4SnBlZ1NpemU7CisgICAgICAgIFNpemUgbWF4WnNsU2l6ZTsKICAgICB9IGZhc3RJbmZvOwogCiAgICAgLy8gUXVpcmtzIGluZm9ybWF0aW9uOyB0aGVzZSBhcmUgc2hvcnQtbGl2ZWQgZmxhZ3MgdG8gZW5hYmxlIHdvcmthcm91bmRzIGZvcgpAQCAtMzgwLDYgKzM4OSw3IEBACiAgICAgVmVjdG9yPFNpemU+IGF2YWlsYWJsZVByZXZpZXdTaXplczsKICAgICBWZWN0b3I8U2l6ZT4gYXZhaWxhYmxlVmlkZW9TaXplczsKICAgICAvLyBHZXQgc2l6ZSBsaXN0ICh0aGF0IGFyZSBubyBsYXJnZXIgdGhhbiBsaW1pdCkgZnJvbSBzdGF0aWMgbWV0YWRhdGEuCisgICAgLy8gVGhpcyBtZXRob2QgZmlsdGVyZWQgc2l6ZSB3aXRoIG1pbkZyYW1lRHVyYXRpb24gPCBNQVhfUFJFVklFV19SRUNPUkRfRFVSQVRJT05fTlMKICAgICBzdGF0dXNfdCBnZXRGaWx0ZXJlZFNpemVzKFNpemUgbGltaXQsIFZlY3RvcjxTaXplPiAqc2l6ZXMpOwogICAgIC8vIEdldCBtYXggc2l6ZSAoZnJvbSB0aGUgc2l6ZSBhcnJheSkgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBhc3BlY3QgcmF0aW8uCiAgICAgU2l6ZSBnZXRNYXhTaXplRm9yUmF0aW8oZmxvYXQgcmF0aW8sIGNvbnN0IGludDMyX3QqIHNpemVBcnJheSwgc2l6ZV90IGNvdW50KTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9TdHJlYW1pbmdQcm9jZXNzb3IuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1N0cmVhbWluZ1Byb2Nlc3Nvci5jcHAKaW5kZXggNzNkY2E3My4uMDc4NmY1MyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1N0cmVhbWluZ1Byb2Nlc3Nvci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1N0cmVhbWluZ1Byb2Nlc3Nvci5jcHAKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxMi0yMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE5NCw3ICsxOTQsNyBAQAogICAgICAgICByZXMgPSBkZXZpY2UtPmNyZWF0ZVN0cmVhbShtUHJldmlld1dpbmRvdywKICAgICAgICAgICAgICAgICBwYXJhbXMucHJldmlld1dpZHRoLCBwYXJhbXMucHJldmlld0hlaWdodCwKICAgICAgICAgICAgICAgICBDQU1FUkEyX0hBTF9QSVhFTF9GT1JNQVRfT1BBUVVFLCBIQUxfREFUQVNQQUNFX1VOS05PV04sCi0gICAgICAgICAgICAgICAgQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fMCwgJm1QcmV2aWV3U3RyZWFtSWQpOworICAgICAgICAgICAgICAgIENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzAsICZtUHJldmlld1N0cmVhbUlkLCBTdHJpbmc4KCkpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogVW5hYmxlIHRvIGNyZWF0ZSBwcmV2aWV3IHN0cmVhbTogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKQEAgLTM3OSw3ICszNzksOCBAQAogICAgICAgICByZXMgPSBkZXZpY2UtPmNyZWF0ZVN0cmVhbShtUmVjb3JkaW5nV2luZG93LAogICAgICAgICAgICAgICAgIHBhcmFtcy52aWRlb1dpZHRoLCBwYXJhbXMudmlkZW9IZWlnaHQsCiAgICAgICAgICAgICAgICAgcGFyYW1zLnZpZGVvRm9ybWF0LCBwYXJhbXMudmlkZW9EYXRhU3BhY2UsCi0gICAgICAgICAgICAgICAgQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fMCwgJm1SZWNvcmRpbmdTdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fMCwgJm1SZWNvcmRpbmdTdHJlYW1JZCwKKyAgICAgICAgICAgICAgICBTdHJpbmc4KCkpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgY3JlYXRlIG91dHB1dCBzdHJlYW0gZm9yIHJlY29yZGluZzogIgogICAgICAgICAgICAgICAgICAgICAiJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgbUlkLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmNwcAppbmRleCBiMDYwN2ZiLi44ZGM5ODYzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDEzLTIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMjMxLDYzICsyMzEsOSBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgaWYgKChtWnNsU3RyZWFtSWQgIT0gTk9fU1RSRUFNKSB8fCAobUlucHV0U3RyZWFtSWQgIT0gTk9fU1RSRUFNKSkgewotICAgICAgICAvLyBDaGVjayBpZiBzdHJlYW0gcGFyYW1ldGVycyBoYXZlIHRvIGNoYW5nZQotICAgICAgICBDYW1lcmFEZXZpY2VCYXNlOjpTdHJlYW1JbmZvIHN0cmVhbUluZm87Ci0gICAgICAgIHJlcyA9IGRldmljZS0+Z2V0U3RyZWFtSW5mbyhtWnNsU3RyZWFtSWQsICZzdHJlYW1JbmZvKTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IEVycm9yIHF1ZXJ5aW5nIGNhcHR1cmUgb3V0cHV0IHN0cmVhbSBpbmZvOiAiCi0gICAgICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICBjbGllbnQtPmdldENhbWVyYUlkKCksIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3RyZWFtSW5mby53aWR0aCAhPSAodWludDMyX3QpcGFyYW1zLmZhc3RJbmZvLmFycmF5V2lkdGggfHwKLSAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLmhlaWdodCAhPSAodWludDMyX3QpcGFyYW1zLmZhc3RJbmZvLmFycmF5SGVpZ2h0KSB7Ci0gICAgICAgICAgICBpZiAobVpzbFN0cmVhbUlkICE9IE5PX1NUUkVBTSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBEZWxldGluZyBzdHJlYW0gJWQgc2luY2UgdGhlIGJ1ZmZlciAiCi0gICAgICAgICAgICAgICAgICAgICAgImRpbWVuc2lvbnMgY2hhbmdlZCIsCi0gICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2xpZW50LT5nZXRDYW1lcmFJZCgpLCBtWnNsU3RyZWFtSWQpOwotICAgICAgICAgICAgICAgIHJlcyA9IGRldmljZS0+ZGVsZXRlU3RyZWFtKG1ac2xTdHJlYW1JZCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlcyA9PSAtRUJVU1kpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IERldmljZSBpcyBidXN5LCBjYWxsIHVwZGF0ZVN0cmVhbSBhZ2FpbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIgYWZ0ZXIgaXQgYmVjb21lcyBpZGxlIiwgX19GVU5DVElPTl9fLCBtSWQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZihyZXMgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFVuYWJsZSB0byBkZWxldGUgb2xkIG91dHB1dCBzdHJlYW0gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3IgWlNMOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC0+Z2V0Q2FtZXJhSWQoKSwgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1ac2xTdHJlYW1JZCA9IE5PX1NUUkVBTTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1JbnB1dFN0cmVhbUlkICE9IE5PX1NUUkVBTSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBEZWxldGluZyBzdHJlYW0gJWQgc2luY2UgdGhlIGJ1ZmZlciAiCi0gICAgICAgICAgICAgICAgICAgICAgImRpbWVuc2lvbnMgY2hhbmdlZCIsCi0gICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2xpZW50LT5nZXRDYW1lcmFJZCgpLCBtSW5wdXRTdHJlYW1JZCk7Ci0gICAgICAgICAgICAgICAgcmVzID0gZGV2aWNlLT5kZWxldGVTdHJlYW0obUlucHV0U3RyZWFtSWQpOwotICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gLUVCVVNZKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBEZXZpY2UgaXMgYnVzeSwgY2FsbCB1cGRhdGVTdHJlYW0gYWdhaW4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiIGFmdGVyIGl0IGJlY29tZXMgaWRsZSIsIF9fRlVOQ1RJT05fXywgbUlkKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBVbmFibGUgdG8gZGVsZXRlIG9sZCBvdXRwdXQgc3RyZWFtICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIFpTTDogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQtPmdldENhbWVyYUlkKCksIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtSW5wdXRTdHJlYW1JZCA9IE5PX1NUUkVBTTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChudWxscHRyICE9IG1JbnB1dFByb2R1Y2VyLmdldCgpKSB7Ci0gICAgICAgICAgICAgICAgbUlucHV0UHJvZHVjZXItPmRpc2Nvbm5lY3QoTkFUSVZFX1dJTkRPV19BUElfQ1BVKTsKLSAgICAgICAgICAgICAgICBtSW5wdXRQcm9kdWNlci5jbGVhcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCiAgICAgaWYgKG1JbnB1dFN0cmVhbUlkID09IE5PX1NUUkVBTSkgewotICAgICAgICByZXMgPSBkZXZpY2UtPmNyZWF0ZUlucHV0U3RyZWFtKHBhcmFtcy5mYXN0SW5mby5hcnJheVdpZHRoLAotICAgICAgICAgICAgcGFyYW1zLmZhc3RJbmZvLmFycmF5SGVpZ2h0LCBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQsCisgICAgICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlSW5wdXRTdHJlYW0ocGFyYW1zLmZhc3RJbmZvLm1heFpzbFNpemUud2lkdGgsCisgICAgICAgICAgICBwYXJhbXMuZmFzdEluZm8ubWF4WnNsU2l6ZS5oZWlnaHQsIEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCwKICAgICAgICAgICAgICZtSW5wdXRTdHJlYW1JZCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBjcmVhdGUgaW5wdXQgc3RyZWFtOiAiCkBAIC0zMDksOSArMjU1LDEwIEBACiAgICAgICAgIG1Qcm9kdWNlci0+c2V0TmFtZShTdHJpbmc4KCJDYW1lcmEyLVpzbFJpbmdCdWZmZXJDb25zdW1lciIpKTsKICAgICAgICAgc3A8U3VyZmFjZT4gb3V0U3VyZmFjZSA9IG5ldyBTdXJmYWNlKHByb2R1Y2VyKTsKIAotICAgICAgICByZXMgPSBkZXZpY2UtPmNyZWF0ZVN0cmVhbShvdXRTdXJmYWNlLCBwYXJhbXMuZmFzdEluZm8uYXJyYXlXaWR0aCwKLSAgICAgICAgICAgIHBhcmFtcy5mYXN0SW5mby5hcnJheUhlaWdodCwgSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVELAotICAgICAgICAgICAgSEFMX0RBVEFTUEFDRV9VTktOT1dOLCBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl8wLCAmbVpzbFN0cmVhbUlkKTsKKyAgICAgICAgcmVzID0gZGV2aWNlLT5jcmVhdGVTdHJlYW0ob3V0U3VyZmFjZSwgcGFyYW1zLmZhc3RJbmZvLm1heFpzbFNpemUud2lkdGgsCisgICAgICAgICAgICBwYXJhbXMuZmFzdEluZm8ubWF4WnNsU2l6ZS5oZWlnaHQsIEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCwKKyAgICAgICAgICAgIEhBTF9EQVRBU1BBQ0VfVU5LTk9XTiwgQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fMCwgJm1ac2xTdHJlYW1JZCwKKyAgICAgICAgICAgIFN0cmluZzgoKSk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBjcmVhdGUgWlNMIHN0cmVhbTogIgogICAgICAgICAgICAgICAgICAgICAiJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgY2xpZW50LT5nZXRDYW1lcmFJZCgpLApAQCAtODU1LDI5ICs4MDIsMjUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOwogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdWludDhfdCBhZk1vZGUgPSBlbnRyeS5kYXRhLnU4WzBdOwotICAgICAgICAgICAgICAgIGlmIChhZk1vZGUgPT0gQU5EUk9JRF9DT05UUk9MX0FGX01PREVfT0ZGKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNraXAgYWxsIHRoZSBaU0wgYnVmZmVyIGZvciBtYW51YWwgQUYgbW9kZSwgYXMgd2UgZG9uJ3QgcmVhbGx5Ci0gICAgICAgICAgICAgICAgICAgIC8vIGtub3cgdGhlIGFmIHN0YXRlLgotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgICAgICAvLyBDaGVjayBBRiBzdGF0ZSBpZiBkZXZpY2UgaGFzIGZvY3VzZXIgYW5kIGZvY3VzIG1vZGUgaXNuJ3QgZml4ZWQKLSAgICAgICAgICAgICAgICBpZiAobUhhc0ZvY3VzZXIgJiYgIWlzRml4ZWRGb2N1c01vZGUoYWZNb2RlKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGNhbmRpZGF0ZSBmcmFtZSBoYXMgZ29vZCBmb2N1cy4KLSAgICAgICAgICAgICAgICAgICAgZW50cnkgPSBmcmFtZS5maW5kKEFORFJPSURfQ09OVFJPTF9BRl9TVEFURSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeS5jb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXM6IFpTTCBxdWV1ZSBmcmFtZSBoYXMgbm8gQUYgc3RhdGUgZmllbGQhIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYWZTdGF0ZSA9IGVudHJ5LmRhdGEudThbMF07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhZlN0YXRlICE9IEFORFJPSURfQ09OVFJPTF9BRl9TVEFURV9QQVNTSVZFX0ZPQ1VTRUQgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZlN0YXRlICE9IEFORFJPSURfQ09OVFJPTF9BRl9TVEFURV9GT0NVU0VEX0xPQ0tFRCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmU3RhdGUgIT0gQU5EUk9JRF9DT05UUk9MX0FGX1NUQVRFX05PVF9GT0NVU0VEX0xPQ0tFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1ZWKCIlczogWlNMIHF1ZXVlIGZyYW1lIEFGIHN0YXRlIGlzICVkIGlzIG5vdCBnb29kIGZvciBjYXB0dXJlLCBza2lwIGl0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBhZlN0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmIChtSGFzRm9jdXNlcikgeworICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFmTW9kZSA9IGVudHJ5LmRhdGEudThbMF07CisgICAgICAgICAgICAgICAgICAgIGlmICghaXNGaXhlZEZvY3VzTW9kZShhZk1vZGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGNhbmRpZGF0ZSBmcmFtZSBoYXMgZ29vZCBmb2N1cy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5ID0gZnJhbWUuZmluZChBTkRST0lEX0NPTlRST0xfQUZfU1RBVEUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXM6IFpTTCBxdWV1ZSBmcmFtZSBoYXMgbm8gQUYgc3RhdGUgZmllbGQhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFmU3RhdGUgPSBlbnRyeS5kYXRhLnU4WzBdOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFmU3RhdGUgIT0gQU5EUk9JRF9DT05UUk9MX0FGX1NUQVRFX1BBU1NJVkVfRk9DVVNFRCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZlN0YXRlICE9IEFORFJPSURfQ09OVFJPTF9BRl9TVEFURV9GT0NVU0VEX0xPQ0tFRCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZlN0YXRlICE9IEFORFJPSURfQ09OVFJPTF9BRl9TVEFURV9OT1RfRk9DVVNFRF9MT0NLRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVlYoIiVzOiBaU0wgcXVldWUgZnJhbWUgQUYgc3RhdGUgaXMgJWQgaXMgbm90IGdvb2QgZm9yIGNhcHR1cmUsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBza2lwIGl0IiwgX19GVU5DVElPTl9fLCBhZlN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwCmluZGV4IGMwM2U4YTIuLjk4ZDA1MzQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxMy0yMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTI4LDYgKzI4LDggQEAKICNpbmNsdWRlICJjb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oIgogI2luY2x1ZGUgImFwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgiCiAKKyNpbmNsdWRlIDxjYW1lcmFfbWV0YWRhdGFfaGlkZGVuLmg+CisKIC8vIENvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGNvbnN0cnVjdGluZyBiaW5kZXI6OlN0YXR1cyBvYmplY3RzIGZvciBlcnJvciByZXR1cm5zCiAKICNkZWZpbmUgU1RBVFVTX0VSUk9SKGVycm9yQ29kZSwgZXJyb3JTdHJpbmcpIFwKQEAgLTQ3LDYgKzQ5LDcgQEAKICAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+JiByZW1vdGVDYWxsYmFjaywKICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAogICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKKyAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwKICAgICAgICAgaW50IGNhbWVyYUZhY2luZywKICAgICAgICAgaW50IGNsaWVudFBpZCwKICAgICAgICAgdWlkX3QgY2xpZW50VWlkLApAQCAtNjAsNiArNjMsOCBAQAogICAgICAgICAgICAgY2xpZW50VWlkLAogICAgICAgICAgICAgc2VydmljZVBpZCksCiAgICAgbVJlbW90ZUNhbGxiYWNrKHJlbW90ZUNhbGxiYWNrKSB7CisgICAgLy8gV2UgZG9uJ3QgbmVlZCBpdCBmb3IgQVBJMiBjbGllbnRzLCBidXQgQ2FtZXJhMkNsaWVudEJhc2UgcmVxdWlyZXMgaXQuCisgICAgKHZvaWQpIGFwaTFDYW1lcmFJZDsKIH0KIAogLy8gSW50ZXJmYWNlIHVzZWQgYnkgQ2FtZXJhU2VydmljZQpAQCAtNzMsNyArNzgsOCBAQAogICAgICAgICB1aWRfdCBjbGllbnRVaWQsCiAgICAgICAgIGludCBzZXJ2aWNlUGlkKSA6CiAgICAgQ2FtZXJhMkNsaWVudEJhc2UoY2FtZXJhU2VydmljZSwgcmVtb3RlQ2FsbGJhY2ssIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgIGNhbWVyYUlkLCBjYW1lcmFGYWNpbmcsIGNsaWVudFBpZCwgY2xpZW50VWlkLCBzZXJ2aWNlUGlkKSwKKyAgICAgICAgICAgICAgICBjYW1lcmFJZCwgLypBUEkxIGNhbWVyYSBJRCovIC0xLAorICAgICAgICAgICAgICAgIGNhbWVyYUZhY2luZywgY2xpZW50UGlkLCBjbGllbnRVaWQsIHNlcnZpY2VQaWQpLAogICAgIG1JbnB1dFN0cmVhbSgpLAogICAgIG1TdHJlYW1pbmdSZXF1ZXN0SWQoUkVRVUVTVF9JRF9OT05FKSwKICAgICBtUmVxdWVzdElkQ291bnRlcigwKSB7CkBAIC04MiwxNiArODgsMTcgQEAKICAgICBBTE9HSSgiQ2FtZXJhRGV2aWNlQ2xpZW50ICVzOiBPcGVuZWQiLCBjYW1lcmFJZC5zdHJpbmcoKSk7CiB9CiAKLXN0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6aW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIpIHsKLSAgICByZXR1cm4gaW5pdGlhbGl6ZUltcGwobWFuYWdlcik7CitzdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnQ6OmluaXRpYWxpemUoc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyLAorICAgICAgICBjb25zdCBTdHJpbmc4JiBtb25pdG9yVGFncykgeworICAgIHJldHVybiBpbml0aWFsaXplSW1wbChtYW5hZ2VyLCBtb25pdG9yVGFncyk7CiB9CiAKIHRlbXBsYXRlPHR5cGVuYW1lIFRQcm92aWRlclB0cj4KLXN0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6aW5pdGlhbGl6ZUltcGwoVFByb3ZpZGVyUHRyIHByb3ZpZGVyUHRyKSB7CitzdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnQ6OmluaXRpYWxpemVJbXBsKFRQcm92aWRlclB0ciBwcm92aWRlclB0ciwgY29uc3QgU3RyaW5nOCYgbW9uaXRvclRhZ3MpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIHN0YXR1c190IHJlczsKIAotICAgIHJlcyA9IENhbWVyYTJDbGllbnRCYXNlOjppbml0aWFsaXplKHByb3ZpZGVyUHRyKTsKKyAgICByZXMgPSBDYW1lcmEyQ2xpZW50QmFzZTo6aW5pdGlhbGl6ZShwcm92aWRlclB0ciwgbW9uaXRvclRhZ3MpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CkBAIC0xMDYsNiArMTEzLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbGlzdGVuZXIqL3RoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qc2VuZFBhcnRpYWxzKi90cnVlKTsKIAorICAgIGF1dG8gZGV2aWNlSW5mbyA9IG1EZXZpY2UtPmluZm8oKTsKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBwaHlzaWNhbEtleXNFbnRyeSA9IGRldmljZUluZm8uZmluZCgKKyAgICAgICAgICAgIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfUEhZU0lDQUxfQ0FNRVJBX1JFUVVFU1RfS0VZUyk7CisgICAgaWYgKHBoeXNpY2FsS2V5c0VudHJ5LmNvdW50ID4gMCkgeworICAgICAgICBtU3VwcG9ydGVkUGh5c2ljYWxSZXF1ZXN0S2V5cy5pbnNlcnQobVN1cHBvcnRlZFBoeXNpY2FsUmVxdWVzdEtleXMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICBwaHlzaWNhbEtleXNFbnRyeS5kYXRhLmkzMiwKKyAgICAgICAgICAgICAgICBwaHlzaWNhbEtleXNFbnRyeS5kYXRhLmkzMiArIHBoeXNpY2FsS2V5c0VudHJ5LmNvdW50KTsKKyAgICB9CisKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTEyMSw2ICsxMzcsMzcgQEAKICAgICByZXR1cm4gc3VibWl0UmVxdWVzdExpc3QocmVxdWVzdExpc3QsIHN0cmVhbWluZywgc3VibWl0SW5mbyk7CiB9CiAKK2JpbmRlcjo6U3RhdHVzIENhbWVyYURldmljZUNsaWVudDo6aW5zZXJ0R2JwTG9ja2VkKGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBnYnAsCisgICAgICAgIFN1cmZhY2VNYXAqIG91dFN1cmZhY2VNYXAsIFZlY3RvcjxpbnQzMl90Piogb3V0cHV0U3RyZWFtSWRzLCBpbnQzMl90ICpjdXJyZW50U3RyZWFtSWQpIHsKKyAgICBpbnQgaWR4ID0gbVN0cmVhbU1hcC5pbmRleE9mS2V5KElJbnRlcmZhY2U6OmFzQmluZGVyKGdicCkpOworCisgICAgLy8gVHJ5aW5nIHRvIHN1Ym1pdCByZXF1ZXN0IHdpdGggc3VyZmFjZSB0aGF0IHdhc24ndCBjcmVhdGVkCisgICAgaWYgKGlkeCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlczogVHJpZWQgdG8gc3VibWl0IGEgcmVxdWVzdCB3aXRoIGEgc3VyZmFjZSB0aGF0IgorICAgICAgICAgICAgICAgICIgd2UgaGF2ZSBub3QgY2FsbGVkIGNyZWF0ZVN0cmVhbSBvbiIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWRTdHIuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsCisgICAgICAgICAgICAgICAgIlJlcXVlc3QgdGFyZ2V0cyBTdXJmYWNlIHRoYXQgaXMgbm90IHBhcnQgb2YgY3VycmVudCBjYXB0dXJlIHNlc3Npb24iKTsKKyAgICB9CisKKyAgICBjb25zdCBTdHJlYW1TdXJmYWNlSWQmIHN0cmVhbVN1cmZhY2VJZCA9IG1TdHJlYW1NYXAudmFsdWVBdChpZHgpOworICAgIGlmIChvdXRTdXJmYWNlTWFwLT5maW5kKHN0cmVhbVN1cmZhY2VJZC5zdHJlYW1JZCgpKSA9PSBvdXRTdXJmYWNlTWFwLT5lbmQoKSkgeworICAgICAgICAoKm91dFN1cmZhY2VNYXApW3N0cmVhbVN1cmZhY2VJZC5zdHJlYW1JZCgpXSA9IHN0ZDo6dmVjdG9yPHNpemVfdD4oKTsKKyAgICAgICAgb3V0cHV0U3RyZWFtSWRzLT5wdXNoX2JhY2soc3RyZWFtU3VyZmFjZUlkLnN0cmVhbUlkKCkpOworICAgIH0KKyAgICAoKm91dFN1cmZhY2VNYXApW3N0cmVhbVN1cmZhY2VJZC5zdHJlYW1JZCgpXS5wdXNoX2JhY2soc3RyZWFtU3VyZmFjZUlkLnN1cmZhY2VJZCgpKTsKKworICAgIEFMT0dWKCIlczogQ2FtZXJhICVzOiBBcHBlbmRpbmcgb3V0cHV0IHN0cmVhbSAlZCBzdXJmYWNlICVkIHRvIHJlcXVlc3QiLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksIHN0cmVhbVN1cmZhY2VJZC5zdHJlYW1JZCgpLAorICAgICAgICAgICAgc3RyZWFtU3VyZmFjZUlkLnN1cmZhY2VJZCgpKTsKKworICAgIGlmIChjdXJyZW50U3RyZWFtSWQgIT0gbnVsbHB0cikgeworICAgICAgICAqY3VycmVudFN0cmVhbUlkID0gc3RyZWFtU3VyZmFjZUlkLnN0cmVhbUlkKCk7CisgICAgfQorCisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCiBiaW5kZXI6OlN0YXR1cyBDYW1lcmFEZXZpY2VDbGllbnQ6OnN1Ym1pdFJlcXVlc3RMaXN0KAogICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxoYXJkd2FyZTo6Y2FtZXJhMjo6Q2FwdHVyZVJlcXVlc3Q+JiByZXF1ZXN0cywKICAgICAgICAgYm9vbCBzdHJlYW1pbmcsCkBAIC0xNDcsNyArMTk0LDcgQEAKICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCAiRW1wdHkgcmVxdWVzdCBsaXN0Iik7CiAgICAgfQogCi0gICAgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gbWV0YWRhdGFSZXF1ZXN0TGlzdDsKKyAgICBMaXN0PGNvbnN0IENhbWVyYURldmljZUJhc2U6OlBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NMaXN0PiBtZXRhZGF0YVJlcXVlc3RMaXN0OwogICAgIHN0ZDo6bGlzdDxjb25zdCBTdXJmYWNlTWFwPiBzdXJmYWNlTWFwTGlzdDsKICAgICBzdWJtaXRJbmZvLT5tUmVxdWVzdElkID0gbVJlcXVlc3RJZENvdW50ZXI7CiAgICAgdWludDMyX3QgbG9vcENvdW50ZXIgPSAwOwpAQCAtMTY1LDc1ICsyMTIsMTYzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhSWRTdHIuc3RyaW5nKCkpOwogICAgICAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwKICAgICAgICAgICAgICAgICAgICAgICAgICJSZXBlYXRpbmcgcmVwcm9jZXNzIHJlcXVlc3RzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocmVxdWVzdC5tUGh5c2ljYWxDYW1lcmFTZXR0aW5ncy5zaXplKCkgPiAxKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJXM6IHJlcHJvY2VzcyByZXF1ZXN0cyBub3Qgc3VwcG9ydGVkIGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAibXVsdGlwbGUgcGh5c2ljYWwgY2FtZXJhcy4iLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhSWRTdHIuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJSZXByb2Nlc3MgcmVxdWVzdHMgbm90IHN1cHBvcnRlZCBmb3IgbXVsdGlwbGUgY2FtZXJhcyIpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgQ2FtZXJhTWV0YWRhdGEgbWV0YWRhdGEocmVxdWVzdC5tTWV0YWRhdGEpOwotICAgICAgICBpZiAobWV0YWRhdGEuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlczogU2VudCBlbXB0eSBtZXRhZGF0YSBwYWNrZXQuIFJlamVjdGluZyByZXF1ZXN0LiIsCi0gICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWRTdHIuc3RyaW5nKCkpOworICAgICAgICBpZiAocmVxdWVzdC5tUGh5c2ljYWxDYW1lcmFTZXR0aW5ncy5lbXB0eSgpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlczogcmVxdWVzdCBkb2Vzbid0IGNvbnRhaW4gYW55IHNldHRpbmdzLiIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpKTsKICAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwKLSAgICAgICAgICAgICAgICAgICAgIlJlcXVlc3Qgc2V0dGluZ3MgYXJlIGVtcHR5Iik7Ci0gICAgICAgIH0gZWxzZSBpZiAocmVxdWVzdC5tU3VyZmFjZUxpc3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICJSZXF1ZXN0IGRvZXNuJ3QgY29udGFpbiBhbnkgc2V0dGluZ3MiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vVGhlIGZpcnN0IGNhcHR1cmUgc2V0dGluZ3Mgc2hvdWxkIGFsd2F5cyBtYXRjaCB0aGUgbG9naWNhbCBjYW1lcmEgaWQKKyAgICAgICAgU3RyaW5nOCBsb2dpY2FsSWQocmVxdWVzdC5tUGh5c2ljYWxDYW1lcmFTZXR0aW5ncy5iZWdpbigpLT5pZC5jX3N0cigpKTsKKyAgICAgICAgaWYgKG1EZXZpY2UtPmdldElkKCkgIT0gbG9naWNhbElkKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlczogSW52YWxpZCBjYW1lcmEgcmVxdWVzdCBzZXR0aW5ncy4iLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSk7CisgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsCisgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGNhbWVyYSByZXF1ZXN0IHNldHRpbmdzIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVxdWVzdC5tU3VyZmFjZUxpc3QuaXNFbXB0eSgpICYmIHJlcXVlc3QubVN0cmVhbUlkeExpc3Quc2l6ZSgpID09IDApIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVzOiBSZXF1ZXN0cyBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHN1cmZhY2UgdGFyZ2V0LiAiCiAgICAgICAgICAgICAgICAgICAgICJSZWplY3RpbmcgcmVxdWVzdC4iLCBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSk7CiAgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsCiAgICAgICAgICAgICAgICAgICAgICJSZXF1ZXN0IGhhcyBubyBvdXRwdXQgdGFyZ2V0cyIpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCFlbmZvcmNlUmVxdWVzdFBlcm1pc3Npb25zKG1ldGFkYXRhKSkgewotICAgICAgICAgICAgLy8gQ2FsbGVlIGxvZ3MKLSAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfUEVSTUlTU0lPTl9ERU5JRUQsCi0gICAgICAgICAgICAgICAgICAgICJDYWxsZXIgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGNoYW5nZSByZXN0cmljdGVkIGNvbnRyb2xzIik7Ci0gICAgICAgIH0KLQogICAgICAgICAvKioKICAgICAgICAgICogV3JpdGUgaW4gdGhlIG91dHB1dCBzdHJlYW0gSURzIGFuZCBtYXAgZnJvbSBzdHJlYW0gSUQgdG8gc3VyZmFjZSBJRAogICAgICAgICAgKiB3aGljaCB3ZSBjYWxjdWxhdGUgZnJvbSB0aGUgY2FwdHVyZSByZXF1ZXN0J3MgbGlzdCBvZiBzdXJmYWNlIHRhcmdldAogICAgICAgICAgKi8KICAgICAgICAgU3VyZmFjZU1hcCBzdXJmYWNlTWFwOwogICAgICAgICBWZWN0b3I8aW50MzJfdD4gb3V0cHV0U3RyZWFtSWRzOwotICAgICAgICBmb3IgKHNwPFN1cmZhY2U+IHN1cmZhY2UgOiByZXF1ZXN0Lm1TdXJmYWNlTGlzdCkgewotICAgICAgICAgICAgaWYgKHN1cmZhY2UgPT0gMCkgY29udGludWU7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiByZXF1ZXN0ZWRQaHlzaWNhbElkczsKKyAgICAgICAgaWYgKHJlcXVlc3QubVN1cmZhY2VMaXN0LnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGZvciAoc3A8U3VyZmFjZT4gc3VyZmFjZSA6IHJlcXVlc3QubVN1cmZhY2VMaXN0KSB7CisgICAgICAgICAgICAgICAgaWYgKHN1cmZhY2UgPT0gMCkgY29udGludWU7CiAKLSAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGdicCA9IHN1cmZhY2UtPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKTsKLSAgICAgICAgICAgIGludCBpZHggPSBtU3RyZWFtTWFwLmluZGV4T2ZLZXkoSUludGVyZmFjZTo6YXNCaW5kZXIoZ2JwKSk7CisgICAgICAgICAgICAgICAgaW50MzJfdCBzdHJlYW1JZDsKKyAgICAgICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBnYnAgPSBzdXJmYWNlLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCk7CisgICAgICAgICAgICAgICAgcmVzID0gaW5zZXJ0R2JwTG9ja2VkKGdicCwgJnN1cmZhY2VNYXAsICZvdXRwdXRTdHJlYW1JZHMsICZzdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgaWYgKCFyZXMuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBUcnlpbmcgdG8gc3VibWl0IHJlcXVlc3Qgd2l0aCBzdXJmYWNlIHRoYXQgd2Fzbid0IGNyZWF0ZWQKLSAgICAgICAgICAgIGlmIChpZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlczogVHJpZWQgdG8gc3VibWl0IGEgcmVxdWVzdCB3aXRoIGEgc3VyZmFjZSB0aGF0IgotICAgICAgICAgICAgICAgICAgICAgICAgIiB3ZSBoYXZlIG5vdCBjYWxsZWQgY3JlYXRlU3RyZWFtIG9uIiwKKyAgICAgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUNvbmZpZ3VyZWRPdXRwdXRzLmluZGV4T2ZLZXkoc3RyZWFtSWQpOworICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZzggcmVxdWVzdGVkUGh5c2ljYWxJZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29uZmlndXJlZE91dHB1dHMudmFsdWVBdChpbmRleCkuZ2V0UGh5c2ljYWxDYW1lcmFJZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkUGh5c2ljYWxJZHMucHVzaF9iYWNrKHJlcXVlc3RlZFBoeXNpY2FsSWQuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlczogT3V0cHV0IHN0cmVhbSBJZCBub3QgZm91bmQgYW1vbmcgY29uZmlndXJlZCBvdXRwdXRzISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXF1ZXN0Lm1TdHJlYW1JZHhMaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IHN0cmVhbUlkID0gcmVxdWVzdC5tU3RyZWFtSWR4TGlzdC5pdGVtQXQoaSk7CisgICAgICAgICAgICAgICAgaW50IHN1cmZhY2VJZHggPSByZXF1ZXN0Lm1TdXJmYWNlSWR4TGlzdC5pdGVtQXQoaSk7CisKKyAgICAgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUNvbmZpZ3VyZWRPdXRwdXRzLmluZGV4T2ZLZXkoc3RyZWFtSWQpOworICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJXM6IFRyaWVkIHRvIHN1Ym1pdCBhIHJlcXVlc3Qgd2l0aCBhIHN1cmZhY2UgdGhhdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHdlIGhhdmUgbm90IGNhbGxlZCBjcmVhdGVTdHJlYW0gb246IHN0cmVhbSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksIHN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXF1ZXN0IHRhcmdldHMgU3VyZmFjZSB0aGF0IGlzIG5vdCBwYXJ0IG9mIGN1cnJlbnQgY2FwdHVyZSBzZXNzaW9uIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29uc3QgYXV0byYgZ2JwcyA9IG1Db25maWd1cmVkT3V0cHV0cy52YWx1ZUF0KGluZGV4KS5nZXRHcmFwaGljQnVmZmVyUHJvZHVjZXJzKCk7CisgICAgICAgICAgICAgICAgaWYgKChzaXplX3Qpc3VyZmFjZUlkeCA+PSBnYnBzLnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlczogVHJpZWQgdG8gc3VibWl0IGEgcmVxdWVzdCB3aXRoIGEgc3VyZmFjZSB0aGF0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgd2UgaGF2ZSBub3QgY2FsbGVkIGNyZWF0ZVN0cmVhbSBvbjogc3RyZWFtICVkLCBzdXJmYWNlSWR4ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgc3RyZWFtSWQsIHN1cmZhY2VJZHgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlcXVlc3QgdGFyZ2V0cyBTdXJmYWNlIGhhcyBpbnZhbGlkIHN1cmZhY2UgaW5kZXgiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXMgPSBpbnNlcnRHYnBMb2NrZWQoZ2Jwc1tzdXJmYWNlSWR4XSwgJnN1cmZhY2VNYXAsICZvdXRwdXRTdHJlYW1JZHMsIG51bGxwdHIpOworICAgICAgICAgICAgICAgIGlmICghcmVzLmlzT2soKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFN0cmluZzggcmVxdWVzdGVkUGh5c2ljYWxJZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db25maWd1cmVkT3V0cHV0cy52YWx1ZUF0KGluZGV4KS5nZXRQaHlzaWNhbENhbWVyYUlkKCkpOworICAgICAgICAgICAgICAgIHJlcXVlc3RlZFBoeXNpY2FsSWRzLnB1c2hfYmFjayhyZXF1ZXN0ZWRQaHlzaWNhbElkLnN0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIENhbWVyYURldmljZUJhc2U6OlBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NMaXN0IHBoeXNpY2FsU2V0dGluZ3NMaXN0OworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogcmVxdWVzdC5tUGh5c2ljYWxDYW1lcmFTZXR0aW5ncykgeworICAgICAgICAgICAgaWYgKGl0LnNldHRpbmdzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVzOiBTZW50IGVtcHR5IG1ldGFkYXRhIHBhY2tldC4gUmVqZWN0aW5nIHJlcXVlc3QuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkU3RyLnN0cmluZygpKTsKICAgICAgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAiUmVxdWVzdCB0YXJnZXRzIFN1cmZhY2UgdGhhdCBpcyBub3QgcGFydCBvZiBjdXJyZW50IGNhcHR1cmUgc2Vzc2lvbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgIlJlcXVlc3Qgc2V0dGluZ3MgYXJlIGVtcHR5Iik7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGNvbnN0IFN0cmVhbVN1cmZhY2VJZCYgc3RyZWFtU3VyZmFjZUlkID0gbVN0cmVhbU1hcC52YWx1ZUF0KGlkeCk7Ci0gICAgICAgICAgICBpZiAoc3VyZmFjZU1hcC5maW5kKHN0cmVhbVN1cmZhY2VJZC5zdHJlYW1JZCgpKSA9PSBzdXJmYWNlTWFwLmVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgc3VyZmFjZU1hcFtzdHJlYW1TdXJmYWNlSWQuc3RyZWFtSWQoKV0gPSBzdGQ6OnZlY3RvcjxzaXplX3Q+KCk7Ci0gICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtSWRzLnB1c2hfYmFjayhzdHJlYW1TdXJmYWNlSWQuc3RyZWFtSWQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdXJmYWNlTWFwW3N0cmVhbVN1cmZhY2VJZC5zdHJlYW1JZCgpXS5wdXNoX2JhY2soc3RyZWFtU3VyZmFjZUlkLnN1cmZhY2VJZCgpKTsKKyAgICAgICAgICAgIFN0cmluZzggcGh5c2ljYWxJZChpdC5pZC5jX3N0cigpKTsKKyAgICAgICAgICAgIGlmIChwaHlzaWNhbElkICE9IG1EZXZpY2UtPmdldElkKCkpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGZvdW5kID0gc3RkOjpmaW5kKHJlcXVlc3RlZFBoeXNpY2FsSWRzLmJlZ2luKCksIHJlcXVlc3RlZFBoeXNpY2FsSWRzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgaXQuaWQpOworICAgICAgICAgICAgICAgIGlmIChmb3VuZCA9PSByZXF1ZXN0ZWRQaHlzaWNhbElkcy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlczogUGh5c2ljYWwgY2FtZXJhIGlkOiAlcyBub3QgcGFydCBvZiBhdHRhY2hlZCBvdXRwdXRzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksIHBoeXNpY2FsSWQuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgcGh5c2ljYWwgY2FtZXJhIGlkIik7CisgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlczogQXBwZW5kaW5nIG91dHB1dCBzdHJlYW0gJWQgc3VyZmFjZSAlZCB0byByZXF1ZXN0IiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksIHN0cmVhbVN1cmZhY2VJZC5zdHJlYW1JZCgpLAotICAgICAgICAgICAgICAgICAgICBzdHJlYW1TdXJmYWNlSWQuc3VyZmFjZUlkKCkpOworICAgICAgICAgICAgICAgIGlmICghbVN1cHBvcnRlZFBoeXNpY2FsUmVxdWVzdEtleXMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBGaWx0ZXIgb3V0IGFueSB1bnN1cHBvcnRlZCBwaHlzaWNhbCByZXF1ZXN0IGtleXMuCisgICAgICAgICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhIGZpbHRlcmVkUGFyYW1zKG1TdXBwb3J0ZWRQaHlzaWNhbFJlcXVlc3RLZXlzLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV90ICptZXRhID0gY29uc3RfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCAqPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZFBhcmFtcy5nZXRBbmRMb2NrKCkpOworICAgICAgICAgICAgICAgICAgICBzZXRfY2FtZXJhX21ldGFkYXRhX3ZlbmRvcl9pZChtZXRhLCBtRGV2aWNlLT5nZXRWZW5kb3JUYWdJZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRQYXJhbXMudW5sb2NrKG1ldGEpOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYga2V5SXQgOiBtU3VwcG9ydGVkUGh5c2ljYWxSZXF1ZXN0S2V5cykgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGVudHJ5ID0gaXQuc2V0dGluZ3MuZmluZChrZXlJdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkuY291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRQYXJhbXMudXBkYXRlKGVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsU2V0dGluZ3NMaXN0LnB1c2hfYmFjayh7aXQuaWQsIGZpbHRlcmVkUGFyYW1zfSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwaHlzaWNhbFNldHRpbmdzTGlzdC5wdXNoX2JhY2soe2l0LmlkLCBpdC5zZXR0aW5nc30pOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgbWV0YWRhdGEudXBkYXRlKEFORFJPSURfUkVRVUVTVF9PVVRQVVRfU1RSRUFNUywgJm91dHB1dFN0cmVhbUlkc1swXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbUlkcy5zaXplKCkpOworICAgICAgICBpZiAoIWVuZm9yY2VSZXF1ZXN0UGVybWlzc2lvbnMocGh5c2ljYWxTZXR0aW5nc0xpc3QuYmVnaW4oKS0+bWV0YWRhdGEpKSB7CisgICAgICAgICAgICAvLyBDYWxsZWUgbG9ncworICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9QRVJNSVNTSU9OX0RFTklFRCwKKyAgICAgICAgICAgICAgICAgICAgIkNhbGxlciBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gY2hhbmdlIHJlc3RyaWN0ZWQgY29udHJvbHMiKTsKKyAgICAgICAgfQorCisgICAgICAgIHBoeXNpY2FsU2V0dGluZ3NMaXN0LmJlZ2luKCktPm1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfT1VUUFVUX1NUUkVBTVMsCisgICAgICAgICAgICAgICAgJm91dHB1dFN0cmVhbUlkc1swXSwgb3V0cHV0U3RyZWFtSWRzLnNpemUoKSk7CiAKICAgICAgICAgaWYgKHJlcXVlc3QubUlzUmVwcm9jZXNzKSB7Ci0gICAgICAgICAgICBtZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX0lOUFVUX1NUUkVBTVMsICZtSW5wdXRTdHJlYW0uaWQsIDEpOworICAgICAgICAgICAgcGh5c2ljYWxTZXR0aW5nc0xpc3QuYmVnaW4oKS0+bWV0YWRhdGEudXBkYXRlKEFORFJPSURfUkVRVUVTVF9JTlBVVF9TVFJFQU1TLAorICAgICAgICAgICAgICAgICAgICAmbUlucHV0U3RyZWFtLmlkLCAxKTsKICAgICAgICAgfQogCi0gICAgICAgIG1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfSUQsICYoc3VibWl0SW5mby0+bVJlcXVlc3RJZCksIC8qc2l6ZSovMSk7CisgICAgICAgIHBoeXNpY2FsU2V0dGluZ3NMaXN0LmJlZ2luKCktPm1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfSUQsCisgICAgICAgICAgICAgICAgJihzdWJtaXRJbmZvLT5tUmVxdWVzdElkKSwgLypzaXplKi8xKTsKICAgICAgICAgbG9vcENvdW50ZXIrKzsgLy8gbG9vcENvdW50ZXIgc3RhcnRzIGZyb20gMQogICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlczogQ3JlYXRpbmcgcmVxdWVzdCB3aXRoIElEICVkICglZCBvZiAlenUpIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgc3VibWl0SW5mby0+bVJlcXVlc3RJZCwKICAgICAgICAgICAgICAgICBsb29wQ291bnRlciwgcmVxdWVzdHMuc2l6ZSgpKTsKIAotICAgICAgICBtZXRhZGF0YVJlcXVlc3RMaXN0LnB1c2hfYmFjayhtZXRhZGF0YSk7CisgICAgICAgIG1ldGFkYXRhUmVxdWVzdExpc3QucHVzaF9iYWNrKHBoeXNpY2FsU2V0dGluZ3NMaXN0KTsKICAgICAgICAgc3VyZmFjZU1hcExpc3QucHVzaF9iYWNrKHN1cmZhY2VNYXApOwogICAgIH0KICAgICBtUmVxdWVzdElkQ291bnRlcisrOwpAQCAtMzE4LDcgKzQ1Myw4IEBACiAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOwogfQogCi1iaW5kZXI6OlN0YXR1cyBDYW1lcmFEZXZpY2VDbGllbnQ6OmVuZENvbmZpZ3VyZShpbnQgb3BlcmF0aW5nTW9kZSkgeworYmluZGVyOjpTdGF0dXMgQ2FtZXJhRGV2aWNlQ2xpZW50OjplbmRDb25maWd1cmUoaW50IG9wZXJhdGluZ01vZGUsCisgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmEyOjppbXBsOjpDYW1lcmFNZXRhZGF0YU5hdGl2ZSYgc2Vzc2lvblBhcmFtcykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgQUxPR1YoIiVzOiBlbmRpbmcgY29uZmlndXJlICglZCBpbnB1dCBzdHJlYW0sICV6dSBvdXRwdXQgc3VyZmFjZXMpIiwKICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlucHV0U3RyZWFtLmNvbmZpZ3VyZWQgPyAxIDogMCwKQEAgLTM2NCw3ICs1MDAsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgc3RhdHVzX3QgZXJyID0gbURldmljZS0+Y29uZmlndXJlU3RyZWFtcyhvcGVyYXRpbmdNb2RlKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtRGV2aWNlLT5jb25maWd1cmVTdHJlYW1zKHNlc3Npb25QYXJhbXMsIG9wZXJhdGluZ01vZGUpOwogICAgIGlmIChlcnIgPT0gQkFEX1ZBTFVFKSB7CiAgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6IFVuc3VwcG9ydGVkIHNldCBvZiBpbnB1dHMvb3V0cHV0cyBwcm92aWRlZCIsCiAgICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpKTsKQEAgLTQzOSw2ICs1NzUsOCBAQAogICAgICAgICAgICAgICAgIG1TdHJlYW1NYXAucmVtb3ZlSXRlbShzdXJmYWNlKTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgbUNvbmZpZ3VyZWRPdXRwdXRzLnJlbW92ZUl0ZW0oc3RyZWFtSWQpOworCiAgICAgICAgICAgICBpZiAoZEluZGV4ICE9IE5BTUVfTk9UX0ZPVU5EKSB7CiAgICAgICAgICAgICAgICAgbURlZmVycmVkU3RyZWFtcy5yZW1vdmVJdGVtc0F0KGRJbmRleCk7CiAgICAgICAgICAgICB9CkBAIC00NjQsNiArNjAyLDcgQEAKICAgICBzaXplX3QgbnVtQnVmZmVyUHJvZHVjZXJzID0gYnVmZmVyUHJvZHVjZXJzLnNpemUoKTsKICAgICBib29sIGRlZmVycmVkQ29uc3VtZXIgPSBvdXRwdXRDb25maWd1cmF0aW9uLmlzRGVmZXJyZWQoKTsKICAgICBib29sIGlzU2hhcmVkID0gb3V0cHV0Q29uZmlndXJhdGlvbi5pc1NoYXJlZCgpOworICAgIFN0cmluZzggcGh5c2ljYWxDYW1lcmFJZCA9IFN0cmluZzgob3V0cHV0Q29uZmlndXJhdGlvbi5nZXRQaHlzaWNhbENhbWVyYUlkKCkpOwogCiAgICAgaWYgKG51bUJ1ZmZlclByb2R1Y2VycyA+IE1BWF9TVVJGQUNFU19QRVJfU1RSRUFNKSB7CiAgICAgICAgIEFMT0dFKCIlczogR3JhcGhpY0J1ZmZlclByb2R1Y2VyIGNvdW50ICV6dSBmb3Igc3RyZWFtIGV4Y2VlZHMgbGltaXQgb2YgJWQiLApAQCAtNDg1LDYgKzYyNCwyMCBAQAogICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0RJU0NPTk5FQ1RFRCwgIkNhbWVyYSBkZXZpY2Ugbm8gbG9uZ2VyIGFsaXZlIik7CiAgICAgfQogCisgICAgaWYgKHBoeXNpY2FsQ2FtZXJhSWQuc2l6ZSgpID4gMCkgeworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGh5c2ljYWxDYW1lcmFJZHM7CisgICAgICAgIHN0ZDo6c3RyaW5nIHBoeXNpY2FsSWQocGh5c2ljYWxDYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgICAgIGJvb2wgbG9naWNhbENhbWVyYSA9CisgICAgICAgICAgICAgICAgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjppc0xvZ2ljYWxDYW1lcmEobURldmljZS0+aW5mbygpLCAmcGh5c2ljYWxDYW1lcmFJZHMpOworICAgICAgICBpZiAoIWxvZ2ljYWxDYW1lcmEgfHwKKyAgICAgICAgICAgICAgICBzdGQ6OmZpbmQocGh5c2ljYWxDYW1lcmFJZHMuYmVnaW4oKSwgcGh5c2ljYWxDYW1lcmFJZHMuZW5kKCksIHBoeXNpY2FsSWQpID09CisgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZHMuZW5kKCkpIHsKKyAgICAgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6IENhbWVyYSBkb2Vzbid0IHN1cHBvcnQgcGh5c2ljYWxDYW1lcmFJZCAlcy4iLAorICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksIHBoeXNpY2FsQ2FtZXJhSWQuc3RyaW5nKCkpOworICAgICAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgbXNnLnN0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KICAgICBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4gc3VyZmFjZXM7CiAgICAgc3RkOjp2ZWN0b3I8c3A8SUJpbmRlcj4+IGJpbmRlcnM7CiAgICAgc3RhdHVzX3QgZXJyOwpAQCAtNTE0LDE0ICs2NjcsNiBAQAogICAgICAgICAgICAgcmV0dXJuIHJlczsKIAogICAgICAgICBpZiAoIWlzU3RyZWFtSW5mb1ZhbGlkKSB7Ci0gICAgICAgICAgICAvLyBTdHJlYW1pbmcgc2hhcmluZyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgSU1QTEVNRU5UQVRJT05fREVGSU5FRAotICAgICAgICAgICAgLy8gZm9ybWF0cy4KLSAgICAgICAgICAgIGlmIChpc1NoYXJlZCAmJiBzdHJlYW1JbmZvLmZvcm1hdCAhPSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVzOiBTdHJlYW0gc2hhcmluZyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgIgotICAgICAgICAgICAgICAgICAgICAgICAgIklNUExFTUVOVEFUSU9OX0RFRklORUQgZm9ybWF0IiwgbUNhbWVyYUlkU3RyLnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICBBTE9HVygiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgbXNnLnN0cmluZygpKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlzU3RyZWFtSW5mb1ZhbGlkID0gdHJ1ZTsKICAgICAgICAgfQogCkBAIC01MzAsMTAgKzY3NSwxMiBAQAogICAgIH0KIAogICAgIGludCBzdHJlYW1JZCA9IGNhbWVyYTM6OkNBTUVSQTNfU1RSRUFNX0lEX0lOVkFMSUQ7CisgICAgc3RkOjp2ZWN0b3I8aW50PiBzdXJmYWNlSWRzOwogICAgIGVyciA9IG1EZXZpY2UtPmNyZWF0ZVN0cmVhbShzdXJmYWNlcywgZGVmZXJyZWRDb25zdW1lciwgc3RyZWFtSW5mby53aWR0aCwKICAgICAgICAgICAgIHN0cmVhbUluZm8uaGVpZ2h0LCBzdHJlYW1JbmZvLmZvcm1hdCwgc3RyZWFtSW5mby5kYXRhU3BhY2UsCiAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90PihvdXRwdXRDb25maWd1cmF0aW9uLmdldFJvdGF0aW9uKCkpLAotICAgICAgICAgICAgJnN0cmVhbUlkLCBvdXRwdXRDb25maWd1cmF0aW9uLmdldFN1cmZhY2VTZXRJRCgpLCBpc1NoYXJlZCk7CisgICAgICAgICAgICAmc3RyZWFtSWQsIHBoeXNpY2FsQ2FtZXJhSWQsICZzdXJmYWNlSWRzLCBvdXRwdXRDb25maWd1cmF0aW9uLmdldFN1cmZhY2VTZXRJRCgpLAorICAgICAgICAgICAgaXNTaGFyZWQpOwogCiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICByZXMgPSBTVEFUVVNfRVJST1JfRk1UKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lOVkFMSURfT1BFUkFUSU9OLApAQCAtNTQ1LDkgKzY5MiwxMSBAQAogICAgICAgICBmb3IgKGF1dG8mIGJpbmRlciA6IGJpbmRlcnMpIHsKICAgICAgICAgICAgIEFMT0dWKCIlczogbVN0cmVhbU1hcCBhZGQgYmluZGVyICVwIHN0cmVhbUlkICVkLCBzdXJmYWNlSWQgJWQiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJpbmRlci5nZXQoKSwgc3RyZWFtSWQsIGkpOwotICAgICAgICAgICAgbVN0cmVhbU1hcC5hZGQoYmluZGVyLCBTdHJlYW1TdXJmYWNlSWQoc3RyZWFtSWQsIGkrKykpOworICAgICAgICAgICAgbVN0cmVhbU1hcC5hZGQoYmluZGVyLCBTdHJlYW1TdXJmYWNlSWQoc3RyZWFtSWQsIHN1cmZhY2VJZHNbaV0pKTsKKyAgICAgICAgICAgIGkrKzsKICAgICAgICAgfQogCisgICAgICAgIG1Db25maWd1cmVkT3V0cHV0cy5hZGQoc3RyZWFtSWQsIG91dHB1dENvbmZpZ3VyYXRpb24pOwogICAgICAgICBtU3RyZWFtSW5mb01hcFtzdHJlYW1JZF0gPSBzdHJlYW1JbmZvOwogCiAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVzOiBTdWNjZXNzZnVsbHkgY3JlYXRlZCBhIG5ldyBzdHJlYW0gSUQgJWQgZm9yIG91dHB1dCBzdXJmYWNlIgpAQCAtNTkyLDEwICs3NDEsMTQgQEAKICAgICB9CiAgICAgaW50IHN0cmVhbUlkID0gY2FtZXJhMzo6Q0FNRVJBM19TVFJFQU1fSURfSU5WQUxJRDsKICAgICBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4gbm9TdXJmYWNlOworICAgIHN0ZDo6dmVjdG9yPGludD4gc3VyZmFjZUlkczsKKyAgICBTdHJpbmc4IHBoeXNpY2FsQ2FtZXJhSWQob3V0cHV0Q29uZmlndXJhdGlvbi5nZXRQaHlzaWNhbENhbWVyYUlkKCkpOwogICAgIGVyciA9IG1EZXZpY2UtPmNyZWF0ZVN0cmVhbShub1N1cmZhY2UsIC8qaGFzRGVmZXJyZWRDb25zdW1lciovdHJ1ZSwgd2lkdGgsCiAgICAgICAgICAgICBoZWlnaHQsIGZvcm1hdCwgZGF0YVNwYWNlLAogICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2FtZXJhM19zdHJlYW1fcm90YXRpb25fdD4ob3V0cHV0Q29uZmlndXJhdGlvbi5nZXRSb3RhdGlvbigpKSwKLSAgICAgICAgICAgICZzdHJlYW1JZCwgb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRTdXJmYWNlU2V0SUQoKSwgaXNTaGFyZWQsIGNvbnN1bWVyVXNhZ2UpOworICAgICAgICAgICAgJnN0cmVhbUlkLCBwaHlzaWNhbENhbWVyYUlkLCAmc3VyZmFjZUlkcywKKyAgICAgICAgICAgIG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0U3VyZmFjZVNldElEKCksIGlzU2hhcmVkLAorICAgICAgICAgICAgY29uc3VtZXJVc2FnZSk7CiAKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIHJlcyA9IFNUQVRVU19FUlJPUl9GTVQoQ2FtZXJhU2VydmljZTo6RVJST1JfSU5WQUxJRF9PUEVSQVRJT04sCkBAIC02NjgsNyArODIxLDcgQEAKIAogICAgIGlmIChtSW5wdXRTdHJlYW0uY29uZmlndXJlZCkgewogICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVzOiBBbHJlYWR5IGhhcyBhbiBpbnB1dCBzdHJlYW0gIgotICAgICAgICAgICAgICAgICJjb25maWd1cmVkIChJRCAlemQpIiwgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBtSW5wdXRTdHJlYW0uaWQpOworICAgICAgICAgICAgICAgICJjb25maWd1cmVkIChJRCAlZCkiLCBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksIG1JbnB1dFN0cmVhbS5pZCk7CiAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSApOwogICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0FMUkVBRFlfRVhJU1RTLCBtc2cuc3RyaW5nKCkpOwogICAgIH0KQEAgLTcyMSw2ICs4NzQsMTI0IEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAorYmluZGVyOjpTdGF0dXMgQ2FtZXJhRGV2aWNlQ2xpZW50Ojp1cGRhdGVPdXRwdXRDb25maWd1cmF0aW9uKGludCBzdHJlYW1JZCwKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTI6OnBhcmFtczo6T3V0cHV0Q29uZmlndXJhdGlvbiAmb3V0cHV0Q29uZmlndXJhdGlvbikgeworICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICBiaW5kZXI6OlN0YXR1cyByZXM7CisgICAgaWYgKCEocmVzID0gY2hlY2tQaWRTdGF0dXMoX19GVU5DVElPTl9fKSkuaXNPaygpKSByZXR1cm4gcmVzOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOworCisgICAgaWYgKCFtRGV2aWNlLmdldCgpKSB7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfRElTQ09OTkVDVEVELCAiQ2FtZXJhIGRldmljZSBubyBsb25nZXIgYWxpdmUiKTsKKyAgICB9CisKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiA+JiBidWZmZXJQcm9kdWNlcnMgPQorICAgICAgICAgICAgb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRHcmFwaGljQnVmZmVyUHJvZHVjZXJzKCk7CisgICAgYXV0byBwcm9kdWNlckNvdW50ID0gYnVmZmVyUHJvZHVjZXJzLnNpemUoKTsKKyAgICBpZiAocHJvZHVjZXJDb3VudCA9PSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogYnVmZmVyUHJvZHVjZXJzIG11c3Qgbm90IGJlIGVtcHR5IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULAorICAgICAgICAgICAgICAgICJidWZmZXJQcm9kdWNlcnMgbXVzdCBub3QgYmUgZW1wdHkiKTsKKyAgICB9CisKKyAgICAvLyBUaGUgZmlyc3Qgb3V0cHV0IGlzIHRoZSBvbmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBvdXRwdXQgY29uZmlndXJhdGlvbi4KKyAgICAvLyBJdCBzaG91bGQgYWx3YXlzIGJlIHByZXNlbnQsIHZhbGlkIGFuZCB0aGUgY29ycmVzcG9uZGluZyBzdHJlYW0gaWQgc2hvdWxkIG1hdGNoLgorICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IElJbnRlcmZhY2U6OmFzQmluZGVyKGJ1ZmZlclByb2R1Y2Vyc1swXSk7CisgICAgc3NpemVfdCBpbmRleCA9IG1TdHJlYW1NYXAuaW5kZXhPZktleShiaW5kZXIpOworICAgIGlmIChpbmRleCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICBBTE9HRSgiJXM6IE91dHB1dGNvbmZpZ3VyYXRpb24gaXMgaW52YWxpZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwKKyAgICAgICAgICAgICAgICAiT3V0cHV0Q29uZmlndXJhdGlvbiBpcyBpbnZhbGlkIik7CisgICAgfQorICAgIGlmIChtU3RyZWFtTWFwLnZhbHVlRm9yKGJpbmRlcikuc3RyZWFtSWQoKSAhPSBzdHJlYW1JZCkgeworICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSBJZDogJWQgcHJvdmlkZWQgZG9lc24ndCBtYXRjaCB0aGUgaWQ6ICVkIGluIHRoZSBzdHJlYW0gbWFwIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkLCBtU3RyZWFtTWFwLnZhbHVlRm9yKGJpbmRlcikuc3RyZWFtSWQoKSk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwKKyAgICAgICAgICAgICAgICAiU3RyZWFtIGlkIGlzIGludmFsaWQiKTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxzaXplX3Q+IHJlbW92ZWRTdXJmYWNlSWRzOworICAgIHN0ZDo6dmVjdG9yPHNwPElCaW5kZXI+PiByZW1vdmVkT3V0cHV0czsKKyAgICBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4gbmV3T3V0cHV0czsKKyAgICBzdGQ6OnZlY3RvcjxPdXRwdXRTdHJlYW1JbmZvPiBzdHJlYW1JbmZvczsKKyAgICBLZXllZFZlY3RvcjxzcDxJQmluZGVyPiwgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4+IG5ld091dHB1dHNNYXA7CisgICAgZm9yIChhdXRvICZpdCA6IGJ1ZmZlclByb2R1Y2VycykgeworICAgICAgICBuZXdPdXRwdXRzTWFwLmFkZChJSW50ZXJmYWNlOjphc0JpbmRlcihpdCksIGl0KTsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TdHJlYW1NYXAuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3NpemVfdCBpZHggPSBuZXdPdXRwdXRzTWFwLmluZGV4T2ZLZXkobVN0cmVhbU1hcC5rZXlBdChpKSk7CisgICAgICAgIGlmIChpZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgIGlmIChtU3RyZWFtTWFwW2ldLnN0cmVhbUlkKCkgPT0gc3RyZWFtSWQpIHsKKyAgICAgICAgICAgICAgICByZW1vdmVkU3VyZmFjZUlkcy5wdXNoX2JhY2sobVN0cmVhbU1hcFtpXS5zdXJmYWNlSWQoKSk7CisgICAgICAgICAgICAgICAgcmVtb3ZlZE91dHB1dHMucHVzaF9iYWNrKG1TdHJlYW1NYXAua2V5QXQoaSkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG1TdHJlYW1NYXBbaV0uc3RyZWFtSWQoKSAhPSBzdHJlYW1JZCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogT3V0cHV0IHN1cmZhY2UgYWxyZWFkeSBwYXJ0IG9mIGEgZGlmZmVyZW50IHN0cmVhbSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgIlRhcmdldCBTdXJmYWNlIGlzIGludmFsaWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5ld091dHB1dHNNYXAucmVtb3ZlSXRlbXNBdChpZHgpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuZXdPdXRwdXRzTWFwLnNpemUoKTsgaSsrKSB7CisgICAgICAgIE91dHB1dFN0cmVhbUluZm8gb3V0SW5mbzsKKyAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZTsKKyAgICAgICAgcmVzID0gY3JlYXRlU3VyZmFjZUZyb21HYnAob3V0SW5mbywgLyppc1N0cmVhbUluZm9WYWxpZCovIGZhbHNlLCBzdXJmYWNlLAorICAgICAgICAgICAgICAgIG5ld091dHB1dHNNYXAudmFsdWVBdChpKSk7CisgICAgICAgIGlmICghcmVzLmlzT2soKSkKKyAgICAgICAgICAgIHJldHVybiByZXM7CisKKyAgICAgICAgc3RyZWFtSW5mb3MucHVzaF9iYWNrKG91dEluZm8pOworICAgICAgICBuZXdPdXRwdXRzLnB1c2hfYmFjayhzdXJmYWNlKTsKKyAgICB9CisKKyAgICAvL1RyaXZpYWwgY2FzZSBubyBjaGFuZ2VzIHJlcXVpcmVkCisgICAgaWYgKHJlbW92ZWRTdXJmYWNlSWRzLmVtcHR5KCkgJiYgbmV3T3V0cHV0cy5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKKyAgICB9CisKKyAgICBLZXllZFZlY3RvcjxzcDxTdXJmYWNlPiwgc2l6ZV90PiBvdXRwdXRNYXA7CisgICAgYXV0byByZXQgPSBtRGV2aWNlLT51cGRhdGVTdHJlYW0oc3RyZWFtSWQsIG5ld091dHB1dHMsIHN0cmVhbUluZm9zLCByZW1vdmVkU3VyZmFjZUlkcywKKyAgICAgICAgICAgICZvdXRwdXRNYXApOworICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgc3dpdGNoIChyZXQpIHsKKyAgICAgICAgICAgIGNhc2UgTkFNRV9OT1RfRk9VTkQ6CisgICAgICAgICAgICBjYXNlIEJBRF9WQUxVRToKKyAgICAgICAgICAgIGNhc2UgLUVCVVNZOgorICAgICAgICAgICAgICAgIHJlcyA9IFNUQVRVU19FUlJPUl9GTVQoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW1lcmEgJXM6IEVycm9yIHVwZGF0aW5nIHN0cmVhbTogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksIHN0cmVycm9yKHJldCksIHJldCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJlcyA9IFNUQVRVU19FUlJPUl9GTVQoQ2FtZXJhU2VydmljZTo6RVJST1JfSU5WQUxJRF9PUEVSQVRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2FtZXJhICVzOiBFcnJvciB1cGRhdGluZyBzdHJlYW06ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBzdHJlcnJvcihyZXQpLCByZXQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZpdCA6IHJlbW92ZWRPdXRwdXRzKSB7CisgICAgICAgICAgICBtU3RyZWFtTWFwLnJlbW92ZUl0ZW0oaXQpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRwdXRNYXAuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIG1TdHJlYW1NYXAuYWRkKElJbnRlcmZhY2U6OmFzQmluZGVyKG91dHB1dE1hcC5rZXlBdChpKS0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpKSwKKyAgICAgICAgICAgICAgICAgICAgU3RyZWFtU3VyZmFjZUlkKHN0cmVhbUlkLCBvdXRwdXRNYXAudmFsdWVBdChpKSkpOworICAgICAgICB9CisKKyAgICAgICAgbUNvbmZpZ3VyZWRPdXRwdXRzLnJlcGxhY2VWYWx1ZUZvcihzdHJlYW1JZCwgb3V0cHV0Q29uZmlndXJhdGlvbik7CisKKyAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJXM6IFN1Y2Nlc3NmdWwgc3RyZWFtIElEICVkIHVwZGF0ZSIsCisgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgc3RyZWFtSWQpOworICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKIGJvb2wgQ2FtZXJhRGV2aWNlQ2xpZW50Ojppc1B1YmxpY0Zvcm1hdChpbnQzMl90IGZvcm1hdCkKIHsKICAgICBzd2l0Y2goZm9ybWF0KSB7CkBAIC03MzksMTAgKzEwMTAsNiBAQAogICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfQkxPQjoKICAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ6CiAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfODg4OgotICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIyXzg4ODoKLSAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQ0NF84ODg6Ci0gICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9GTEVYX1JHQl84ODg6Ci0gICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9GTEVYX1JHQkFfODg4ODoKICAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMl9TUDoKICAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDckNiXzQyMF9TUDoKICAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMl9JOgpAQCAtODIwLDkgKzEwODcsMTAgQEAKICAgICB9CiAKICAgICAvLyBGSVhNRTogcmVtb3ZlIHRoaXMgb3ZlcnJpZGUgc2luY2UgdGhlIGRlZmF1bHQgZm9ybWF0IHNob3VsZCBiZQotICAgIC8vICAgICAgIElNUExFTUVOVEFUSU9OX0RFRklORUQuIGIvOTQ4NzQ4MgotICAgIGlmIChmb3JtYXQgPj0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODggJiYKLSAgICAgICAgZm9ybWF0IDw9IEhBTF9QSVhFTF9GT1JNQVRfQkdSQV84ODg4KSB7CisgICAgLy8gICAgICAgSU1QTEVNRU5UQVRJT05fREVGSU5FRC4gYi85NDg3NDgyICYgYi8zNTMxNzk0NAorICAgIGlmICgoZm9ybWF0ID49IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4ICYmIGZvcm1hdCA8PSBIQUxfUElYRUxfRk9STUFUX0JHUkFfODg4OCkgJiYKKyAgICAgICAgICAgICgoY29uc3VtZXJVc2FnZSAmIEdSQUxMT0NfVVNBR0VfSFdfTUFTSykgJiYKKyAgICAgICAgICAgICAoKGNvbnN1bWVyVXNhZ2UgJiBHUkFMTE9DX1VTQUdFX1NXX1JFQURfTUFTSykgPT0gMCkpKSB7CiAgICAgICAgIEFMT0dXKCIlczogQ2FtZXJhICVzOiBPdmVycmlkaW5nIGZvcm1hdCAlI3ggdG8gSU1QTEVNRU5UQVRJT05fREVGSU5FRCIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksIGZvcm1hdCk7CiAgICAgICAgIGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRDsKQEAgLTEyNDIsMTUgKzE1MTAsMTIgQEAKICAgICB9CiAKICAgICBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4gY29uc3VtZXJTdXJmYWNlczsKLSAgICBzdGQ6OnZlY3RvcjxzaXplX3Q+IGNvbnN1bWVyU3VyZmFjZUlkczsKLSAgICBzaXplX3Qgc3VyZmFjZUlkID0gMDsKICAgICBmb3IgKGF1dG8mIGJ1ZmZlclByb2R1Y2VyIDogYnVmZmVyUHJvZHVjZXJzKSB7CiAgICAgICAgIC8vIERvbid0IGNyZWF0ZSBtdWx0aXBsZSBzdHJlYW1zIGZvciB0aGUgc2FtZSB0YXJnZXQgc3VyZmFjZQogICAgICAgICBzc2l6ZV90IGluZGV4ID0gbVN0cmVhbU1hcC5pbmRleE9mS2V5KElJbnRlcmZhY2U6OmFzQmluZGVyKGJ1ZmZlclByb2R1Y2VyKSk7CiAgICAgICAgIGlmIChpbmRleCAhPSBOQU1FX05PVF9GT1VORCkgewogICAgICAgICAgICAgQUxPR1YoIkNhbWVyYSAlczogU3VyZmFjZSBhbHJlYWR5IGhhcyBhIHN0cmVhbSBjcmVhdGVkICIKICAgICAgICAgICAgICAgICAgICAgIiBmb3IgaXQgKElEICV6ZCkiLCBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksIGluZGV4KTsKLSAgICAgICAgICAgIHN1cmZhY2VJZCsrOwogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIApAQCAtMTI2Miw4ICsxNTI3LDYgQEAKICAgICAgICAgICAgIHJldHVybiByZXM7CiAKICAgICAgICAgY29uc3VtZXJTdXJmYWNlcy5wdXNoX2JhY2soc3VyZmFjZSk7Ci0gICAgICAgIGNvbnN1bWVyU3VyZmFjZUlkcy5wdXNoX2JhY2soc3VyZmFjZUlkKTsKLSAgICAgICAgc3VyZmFjZUlkKys7CiAgICAgfQogCiAgICAgLy8gR3JhY2VmdWxseSBoYW5kbGUgY2FzZSB3aGVyZSBmaW5hbGl6ZU91dHB1dENvbmZpZ3VyYXRpb25zIGlzIGNhbGxlZApAQCAtMTI3NSwxMiArMTUzOCwxMyBAQAogCiAgICAgLy8gRmluaXNoIHRoZSBkZWZlcnJlZCBzdHJlYW0gY29uZmlndXJhdGlvbiB3aXRoIHRoZSBzdXJmYWNlLgogICAgIHN0YXR1c190IGVycjsKLSAgICBlcnIgPSBtRGV2aWNlLT5zZXRDb25zdW1lclN1cmZhY2VzKHN0cmVhbUlkLCBjb25zdW1lclN1cmZhY2VzKTsKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IGNvbnN1bWVyU3VyZmFjZUlkczsKKyAgICBlcnIgPSBtRGV2aWNlLT5zZXRDb25zdW1lclN1cmZhY2VzKHN0cmVhbUlkLCBjb25zdW1lclN1cmZhY2VzLCAmY29uc3VtZXJTdXJmYWNlSWRzKTsKICAgICBpZiAoZXJyID09IE9LKSB7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29uc3VtZXJTdXJmYWNlcy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gSUludGVyZmFjZTo6YXNCaW5kZXIoCiAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVyU3VyZmFjZXNbaV0tPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSk7Ci0gICAgICAgICAgICBBTE9HVigiJXM6IG1TdHJlYW1NYXAgYWRkIGJpbmRlciAlcCBzdHJlYW1JZCAlZCwgc3VyZmFjZUlkICV6dSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgIEFMT0dWKCIlczogbVN0cmVhbU1hcCBhZGQgYmluZGVyICVwIHN0cmVhbUlkICVkLCBzdXJmYWNlSWQgJWQiLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgICAgICAgIGJpbmRlci5nZXQoKSwgc3RyZWFtSWQsIGNvbnN1bWVyU3VyZmFjZUlkc1tpXSk7CiAgICAgICAgICAgICBtU3RyZWFtTWFwLmFkZChiaW5kZXIsIFN0cmVhbVN1cmZhY2VJZChzdHJlYW1JZCwgY29uc3VtZXJTdXJmYWNlSWRzW2ldKSk7CiAgICAgICAgIH0KQEAgLTEyODgsNiArMTU1Miw3IEBACiAgICAgICAgICAgICBtRGVmZXJyZWRTdHJlYW1zLnJlbW92ZUl0ZW1zQXQoZGVmZXJyZWRTdHJlYW1JbmRleCk7CiAgICAgICAgIH0KICAgICAgICAgbVN0cmVhbUluZm9NYXBbc3RyZWFtSWRdLmZpbmFsaXplZCA9IHRydWU7CisgICAgICAgIG1Db25maWd1cmVkT3V0cHV0cy5yZXBsYWNlVmFsdWVGb3Ioc3RyZWFtSWQsIG91dHB1dENvbmZpZ3VyYXRpb24pOwogICAgIH0gZWxzZSBpZiAoZXJyID09IE5PX0lOSVQpIHsKICAgICAgICAgcmVzID0gU1RBVFVTX0VSUk9SX0ZNVChDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULAogICAgICAgICAgICAgICAgICJDYW1lcmEgJXM6IERlZmVycmVkIHN1cmZhY2UgaXMgaW52YWxpZDogJXMgKCVkKSIsCkBAIC0xNDMyLDcgKzE2OTcsOCBAQAogICAgIC8vIFRocmVhZC1zYWZlLiBObyBsb2NrIG5lY2Vzc2FyeS4KICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4gcmVtb3RlQ2IgPSBtUmVtb3RlQ2FsbGJhY2s7CiAgICAgaWYgKHJlbW90ZUNiICE9IE5VTEwpIHsKLSAgICAgICAgcmVtb3RlQ2ItPm9uUmVzdWx0UmVjZWl2ZWQocmVzdWx0Lm1NZXRhZGF0YSwgcmVzdWx0Lm1SZXN1bHRFeHRyYXMpOworICAgICAgICByZW1vdGVDYi0+b25SZXN1bHRSZWNlaXZlZChyZXN1bHQubU1ldGFkYXRhLCByZXN1bHQubVJlc3VsdEV4dHJhcywKKyAgICAgICAgICAgICAgICByZXN1bHQubVBoeXNpY2FsTWV0YWRhdGFzKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5oCmluZGV4IDUwNjYxY2IuLjVhYWY1YWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDEzLTIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMjYsNiArMjYsOCBAQAogI2luY2x1ZGUgImNvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuaCIKICNpbmNsdWRlICJjb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaCIKIAordXNpbmcgYW5kcm9pZDo6Y2FtZXJhMzo6T3V0cHV0U3RyZWFtSW5mbzsKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQ2FtZXJhRGV2aWNlQ2xpZW50QmFzZSA6CkBAIC00Myw2ICs0NSw3IEBACiAgICAgICAgICAgICBjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4mIHJlbW90ZUNhbGxiYWNrLAogICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCisgICAgICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLAogICAgICAgICAgICAgaW50IGNhbWVyYUZhY2luZywKICAgICAgICAgICAgIGludCBjbGllbnRQaWQsCiAgICAgICAgICAgICB1aWRfdCBjbGllbnRVaWQsCkBAIC04Myw3ICs4Niw4IEBACiAKICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIGJlZ2luQ29uZmlndXJlKCkgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIGVuZENvbmZpZ3VyZShpbnQgb3BlcmF0aW5nTW9kZSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBlbmRDb25maWd1cmUoaW50IG9wZXJhdGluZ01vZGUsCisgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhMjo6aW1wbDo6Q2FtZXJhTWV0YWRhdGFOYXRpdmUmIHNlc3Npb25QYXJhbXMpIG92ZXJyaWRlOwogCiAgICAgLy8gUmV0dXJucyAtRUJVU1kgaWYgZGV2aWNlIGlzIG5vdCBpZGxlIG9yIGluIGVycm9yIHN0YXRlCiAgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBkZWxldGVTdHJlYW0oaW50IHN0cmVhbUlkKSBvdmVycmlkZTsKQEAgLTEzMSw2ICsxMzUsMTAgQEAKICAgICAvLyBQcmVwYXJlIHN0cmVhbSBieSBwcmVhbGxvY2F0aW5nIHVwIHRvIG1heENvdW50IG9mIGl0cyBidWZmZXJzCiAgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBwcmVwYXJlMihpbnQzMl90IG1heENvdW50LCBpbnQzMl90IHN0cmVhbUlkKSBvdmVycmlkZTsKIAorICAgIC8vIFVwZGF0ZSBhbiBvdXRwdXQgY29uZmlndXJhdGlvbgorICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgdXBkYXRlT3V0cHV0Q29uZmlndXJhdGlvbihpbnQgc3RyZWFtSWQsCisgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhMjo6cGFyYW1zOjpPdXRwdXRDb25maWd1cmF0aW9uICZvdXRwdXRDb25maWd1cmF0aW9uKSBvdmVycmlkZTsKKwogICAgIC8vIEZpbmFsaXplIHRoZSBvdXRwdXQgY29uZmlndXJhdGlvbnMgd2l0aCBzdXJmYWNlcyBub3QgYWRkZWQgYmVmb3JlLgogICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgZmluYWxpemVPdXRwdXRDb25maWd1cmF0aW9ucyhpbnQzMl90IHN0cmVhbUlkLAogICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTI6OnBhcmFtczo6T3V0cHV0Q29uZmlndXJhdGlvbiAmb3V0cHV0Q29uZmlndXJhdGlvbikgb3ZlcnJpZGU7CkBAIC0xNDksNyArMTU3LDggQEAKICAgICAgICAgICAgIGludCBzZXJ2aWNlUGlkKTsKICAgICB2aXJ0dWFsIH5DYW1lcmFEZXZpY2VDbGllbnQoKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBpbml0aWFsaXplKHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlcikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGluaXRpYWxpemUoc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgbW9uaXRvclRhZ3MpIG92ZXJyaWRlOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIApAQCAtMjA2LDI0ICsyMTUsNiBAQAogCiAgICAgfTsgLy8gY2xhc3MgU3RyZWFtU3VyZmFjZUlkCiAKLSAgICAvLyBPdXRwdXRTdHJlYW1JbmZvIGRlc2NyaWJlcyB0aGUgcHJvcGVydHkgb2YgYSBjYW1lcmEgc3RyZWFtLgotICAgIGNsYXNzIE91dHB1dFN0cmVhbUluZm8gewotICAgIHB1YmxpYzoKLSAgICAgICAgaW50IHdpZHRoOwotICAgICAgICBpbnQgaGVpZ2h0OwotICAgICAgICBpbnQgZm9ybWF0OwotICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2U7Ci0gICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2U7Ci0gICAgICAgIGJvb2wgZmluYWxpemVkID0gZmFsc2U7Ci0gICAgICAgIE91dHB1dFN0cmVhbUluZm8oKSA6Ci0gICAgICAgICAgICAgICAgd2lkdGgoLTEpLCBoZWlnaHQoLTEpLCBmb3JtYXQoLTEpLCBkYXRhU3BhY2UoSEFMX0RBVEFTUEFDRV9VTktOT1dOKSwKLSAgICAgICAgICAgICAgICBjb25zdW1lclVzYWdlKDApIHt9Ci0gICAgICAgIE91dHB1dFN0cmVhbUluZm8oaW50IF93aWR0aCwgaW50IF9oZWlnaHQsIGludCBfZm9ybWF0LCBhbmRyb2lkX2RhdGFzcGFjZSBfZGF0YVNwYWNlLAotICAgICAgICAgICAgICAgIHVpbnQ2NF90IF9jb25zdW1lclVzYWdlKSA6Ci0gICAgICAgICAgICAgICAgICAgIHdpZHRoKF93aWR0aCksIGhlaWdodChfaGVpZ2h0KSwgZm9ybWF0KF9mb3JtYXQpLAotICAgICAgICAgICAgICAgICAgICBkYXRhU3BhY2UoX2RhdGFTcGFjZSksIGNvbnN1bWVyVXNhZ2UoX2NvbnN1bWVyVXNhZ2UpIHt9Ci0gICAgfTsKLQogcHJpdmF0ZToKICAgICAvKiogSUNhbWVyYURldmljZVVzZXIgaW50ZXJmYWNlLXJlbGF0ZWQgcHJpdmF0ZSBtZW1iZXJzICovCiAKQEAgLTIzMiw4ICsyMjMsMTAgQEAKICAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBGUkFNRV9QUk9DRVNTT1JfTElTVEVORVJfTUlOX0lEID0gMDsKICAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBGUkFNRV9QUk9DRVNTT1JfTElTVEVORVJfTUFYX0lEID0gMHg3ZmZmZmZmZkw7CiAKKyAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBtU3VwcG9ydGVkUGh5c2ljYWxSZXF1ZXN0S2V5czsKKwogICAgIHRlbXBsYXRlPHR5cGVuYW1lIFRQcm92aWRlclB0cj4KLSAgICBzdGF0dXNfdCAgICAgIGluaXRpYWxpemVJbXBsKFRQcm92aWRlclB0ciBwcm92aWRlclB0cik7CisgICAgc3RhdHVzX3QgICAgICBpbml0aWFsaXplSW1wbChUUHJvdmlkZXJQdHIgcHJvdmlkZXJQdHIsIGNvbnN0IFN0cmluZzgmIG1vbml0b3JUYWdzKTsKIAogICAgIC8qKiBVdGlsaXR5IG1lbWJlcnMgKi8KICAgICBiaW5kZXI6OlN0YXR1cyBjaGVja1BpZFN0YXR1cyhjb25zdCBjaGFyKiBjaGVja0xvY2F0aW9uKTsKQEAgLTI2Nyw5ICsyNjAsMjIgQEAKICAgICBiaW5kZXI6OlN0YXR1cyBjcmVhdGVTdXJmYWNlRnJvbUdicChPdXRwdXRTdHJlYW1JbmZvJiBzdHJlYW1JbmZvLCBib29sIGlzU3RyZWFtSW5mb1ZhbGlkLAogICAgICAgICAgICAgc3A8U3VyZmFjZT4mIHN1cmZhY2UsIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBnYnApOwogCisKKyAgICAvLyBVdGlsaXR5IG1ldGhvZCB0byBpbnNlcnQgdGhlIHN1cmZhY2UgaW50byBTdXJmYWNlTWFwCisgICAgYmluZGVyOjpTdGF0dXMgaW5zZXJ0R2JwTG9ja2VkKGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBnYnAsCisgICAgICAgICAgICAvKm91dCovU3VyZmFjZU1hcCogc3VyZmFjZU1hcCwgLypvdXQqL1ZlY3RvcjxpbnQzMl90Piogc3RyZWFtSWRzLAorICAgICAgICAgICAgLypvdXQqL2ludDMyX3QqICBjdXJyZW50U3RyZWFtSWQpOworCisgICAgLy8gQ2hlY2sgdGhhdCB0aGUgcGh5c2ljYWxDYW1lcmFJZCBwYXNzZWQgaW4gaXMgc3Bwb3J0ZWQgYnkgdGhlIGNhbWVyYQorICAgIC8vIGRldmljZS4KKyAgICBib29sIGNoZWNrUGh5c2ljYWxDYW1lcmFJZChjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkKTsKKwogICAgIC8vIElHcmFwaGljc0J1ZmZlclByb2R1Y2VyIGJpbmRlciAtPiBTdHJlYW0gSUQgKyBTdXJmYWNlIElEIGZvciBvdXRwdXQgc3RyZWFtcwogICAgIEtleWVkVmVjdG9yPHNwPElCaW5kZXI+LCBTdHJlYW1TdXJmYWNlSWQ+IG1TdHJlYW1NYXA7CiAKKyAgICAvLyBTdHJlYW0gSUQgLT4gT3V0cHV0Q29uZmlndXJhdGlvbi4gVXNlZCBmb3IgbG9va2luZyB1cCBTdXJmYWNlIGJ5IHN0cmVhbS9zdXJmYWNlIGluZGV4CisgICAgS2V5ZWRWZWN0b3I8aW50MzJfdCwgaGFyZHdhcmU6OmNhbWVyYTI6OnBhcmFtczo6T3V0cHV0Q29uZmlndXJhdGlvbj4gbUNvbmZpZ3VyZWRPdXRwdXRzOworCiAgICAgc3RydWN0IElucHV0U3RyZWFtQ29uZmlndXJhdGlvbiB7CiAgICAgICAgIGJvb2wgY29uZmlndXJlZDsKICAgICAgICAgaW50MzJfdCB3aWR0aDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwCmluZGV4IDUxZWYxNjAuLmNlMDA2YTcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcApAQCAtNDgsMTUgKzQ4LDE2IEBACiAgICAgICAgIGNvbnN0IHNwPFRDYW1DYWxsYmFja3M+JiByZW1vdGVDYWxsYmFjaywKICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAogICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKKyAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwKICAgICAgICAgaW50IGNhbWVyYUZhY2luZywKICAgICAgICAgaW50IGNsaWVudFBpZCwKICAgICAgICAgdWlkX3QgY2xpZW50VWlkLAogICAgICAgICBpbnQgc2VydmljZVBpZCk6CiAgICAgICAgIFRDbGllbnRCYXNlKGNhbWVyYVNlcnZpY2UsIHJlbW90ZUNhbGxiYWNrLCBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICBjYW1lcmFJZCwgY2FtZXJhRmFjaW5nLCBjbGllbnRQaWQsIGNsaWVudFVpZCwgc2VydmljZVBpZCksCisgICAgICAgICAgICAgICAgY2FtZXJhSWQsIGFwaTFDYW1lcmFJZCwgY2FtZXJhRmFjaW5nLCBjbGllbnRQaWQsIGNsaWVudFVpZCwgc2VydmljZVBpZCksCiAgICAgICAgIG1TaGFyZWRDYW1lcmFDYWxsYmFja3MocmVtb3RlQ2FsbGJhY2spLAogICAgICAgICBtRGV2aWNlVmVyc2lvbihjYW1lcmFTZXJ2aWNlLT5nZXREZXZpY2VWZXJzaW9uKFRDbGllbnRCYXNlOjptQ2FtZXJhSWRTdHIpKSwKLSAgICAgICAgbURldmljZUFjdGl2ZShmYWxzZSkKKyAgICAgICAgbURldmljZUFjdGl2ZShmYWxzZSksIG1BcGkxQ2FtZXJhSWQoYXBpMUNhbWVyYUlkKQogewogICAgIEFMT0dJKCJDYW1lcmEgJXM6IE9wZW5lZC4gQ2xpZW50OiAlcyAoUElEICVkLCBVSUQgJWQpIiwgY2FtZXJhSWQuc3RyaW5nKCksCiAgICAgICAgICAgICBTdHJpbmc4KGNsaWVudFBhY2thZ2VOYW1lKS5zdHJpbmcoKSwgY2xpZW50UGlkLCBjbGllbnRVaWQpOwpAQCAtNzksMTMgKzgwLDE1IEBACiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUQ2xpZW50QmFzZT4KLXN0YXR1c190IENhbWVyYTJDbGllbnRCYXNlPFRDbGllbnRCYXNlPjo6aW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIpIHsKLSAgICByZXR1cm4gaW5pdGlhbGl6ZUltcGwobWFuYWdlcik7CitzdGF0dXNfdCBDYW1lcmEyQ2xpZW50QmFzZTxUQ2xpZW50QmFzZT46OmluaXRpYWxpemUoc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyLAorICAgICAgICBjb25zdCBTdHJpbmc4JiBtb25pdG9yVGFncykgeworICAgIHJldHVybiBpbml0aWFsaXplSW1wbChtYW5hZ2VyLCBtb25pdG9yVGFncyk7CiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUQ2xpZW50QmFzZT4KIHRlbXBsYXRlIDx0eXBlbmFtZSBUUHJvdmlkZXJQdHI+Ci1zdGF0dXNfdCBDYW1lcmEyQ2xpZW50QmFzZTxUQ2xpZW50QmFzZT46OmluaXRpYWxpemVJbXBsKFRQcm92aWRlclB0ciBwcm92aWRlclB0cikgeworc3RhdHVzX3QgQ2FtZXJhMkNsaWVudEJhc2U8VENsaWVudEJhc2U+Ojppbml0aWFsaXplSW1wbChUUHJvdmlkZXJQdHIgcHJvdmlkZXJQdHIsCisgICAgICAgIGNvbnN0IFN0cmluZzgmIG1vbml0b3JUYWdzKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBBTE9HVigiJXM6IEluaXRpYWxpemluZyBjbGllbnQgZm9yIGNhbWVyYSAlcyIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICBUQ2xpZW50QmFzZTo6bUNhbWVyYUlkU3RyLnN0cmluZygpKTsKQEAgLTEwMyw3ICsxMDYsNyBAQAogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAKLSAgICByZXMgPSBtRGV2aWNlLT5pbml0aWFsaXplKHByb3ZpZGVyUHRyKTsKKyAgICByZXMgPSBtRGV2aWNlLT5pbml0aWFsaXplKHByb3ZpZGVyUHRyLCBtb25pdG9yVGFncyk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlczogdW5hYmxlIHRvIGluaXRpYWxpemUgZGV2aWNlOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIFRDbGllbnRCYXNlOjptQ2FtZXJhSWRTdHIuc3RyaW5nKCksIHN0cmVycm9yKC1yZXMpLCByZXMpOwpAQCAtMTU2LDEzICsxNTksMTQgQEAKICAgICByZXN1bHQgPSAiICBEZXZpY2UgZHVtcDpcbiI7CiAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiAKLSAgICBpZiAoIW1EZXZpY2UuZ2V0KCkpIHsKKyAgICBzcDxDYW1lcmFEZXZpY2VCYXNlPiBkZXZpY2UgPSBtRGV2aWNlOworICAgIGlmICghZGV2aWNlLmdldCgpKSB7CiAgICAgICAgIHJlc3VsdCA9ICIgICoqKiBEZXZpY2UgaXMgZGV0YWNoZWRcbiI7CiAgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQogCi0gICAgc3RhdHVzX3QgcmVzID0gbURldmljZS0+ZHVtcChmZCwgYXJncyk7CisgICAgc3RhdHVzX3QgcmVzID0gZGV2aWNlLT5kdW1wKGZkLCBhcmdzKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIHJlc3VsdCA9IFN0cmluZzg6OmZvcm1hdCgiICAgRXJyb3IgZHVtcGluZyBkZXZpY2U6ICVzICglZCkiLAogICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOwpAQCAtMjQ5LDcgKzI1Myw5IEBACiAgICAgaWYgKG1EZXZpY2VBY3RpdmUpIHsKICAgICAgICAgZ2V0Q2FtZXJhU2VydmljZSgpLT51cGRhdGVQcm94eURldmljZVN0YXRlKAogICAgICAgICAgICAgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlUHJveHk6OkNBTUVSQV9TVEFURV9JRExFLCBUQ2xpZW50QmFzZTo6bUNhbWVyYUlkU3RyLAotICAgICAgICAgICAgVENsaWVudEJhc2U6Om1DYW1lcmFGYWNpbmcsIFRDbGllbnRCYXNlOjptQ2xpZW50UGFja2FnZU5hbWUpOworICAgICAgICAgICAgVENsaWVudEJhc2U6Om1DYW1lcmFGYWNpbmcsIFRDbGllbnRCYXNlOjptQ2xpZW50UGFja2FnZU5hbWUsCisgICAgICAgICAgICAoKG1BcGkxQ2FtZXJhSWQgPCAwKSA/IGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZVByb3h5OjpDQU1FUkFfQVBJX0xFVkVMXzIgOgorICAgICAgICAgICAgIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZVByb3h5OjpDQU1FUkFfQVBJX0xFVkVMXzEpKTsKICAgICB9CiAgICAgbURldmljZUFjdGl2ZSA9IGZhbHNlOwogCkBAIC0yNjUsNyArMjcxLDkgQEAKICAgICBpZiAoIW1EZXZpY2VBY3RpdmUpIHsKICAgICAgICAgZ2V0Q2FtZXJhU2VydmljZSgpLT51cGRhdGVQcm94eURldmljZVN0YXRlKAogICAgICAgICAgICAgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlUHJveHk6OkNBTUVSQV9TVEFURV9BQ1RJVkUsIFRDbGllbnRCYXNlOjptQ2FtZXJhSWRTdHIsCi0gICAgICAgICAgICBUQ2xpZW50QmFzZTo6bUNhbWVyYUZhY2luZywgVENsaWVudEJhc2U6Om1DbGllbnRQYWNrYWdlTmFtZSk7CisgICAgICAgICAgICBUQ2xpZW50QmFzZTo6bUNhbWVyYUZhY2luZywgVENsaWVudEJhc2U6Om1DbGllbnRQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICgobUFwaTFDYW1lcmFJZCA8IDApID8gaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlUHJveHk6OkNBTUVSQV9BUElfTEVWRUxfMiA6CisgICAgICAgICAgICAgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlUHJveHk6OkNBTUVSQV9BUElfTEVWRUxfMSkpOwogICAgIH0KICAgICBtRGV2aWNlQWN0aXZlID0gdHJ1ZTsKIApAQCAtMzI4LDcgKzMzNiw3IEBACiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUQ2xpZW50QmFzZT4KIGludCBDYW1lcmEyQ2xpZW50QmFzZTxUQ2xpZW50QmFzZT46OmdldENhbWVyYUlkKCkgY29uc3QgewotICAgIHJldHVybiBzdGQ6OnN0b2koVENsaWVudEJhc2U6Om1DYW1lcmFJZFN0ci5zdHJpbmcoKSk7CisgICAgcmV0dXJuIG1BcGkxQ2FtZXJhSWQ7CiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUQ2xpZW50QmFzZT4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmgKaW5kZXggZTg5OGQ1ZC4uZTc0ZmJkZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmgKQEAgLTQ5LDEzICs0OSwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFRDYW1DYWxsYmFja3M+JiByZW1vdGVDYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwKICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLAogICAgICAgICAgICAgICAgICAgICAgIGludCBjbGllbnRQaWQsCiAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgY2xpZW50VWlkLAogICAgICAgICAgICAgICAgICAgICAgIGludCBzZXJ2aWNlUGlkKTsKICAgICB2aXJ0dWFsIH5DYW1lcmEyQ2xpZW50QmFzZSgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGluaXRpYWxpemUoc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgaW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIsIGNvbnN0IFN0cmluZzgmIG1vbml0b3JUYWdzKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgZHVtcENsaWVudChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCiAgICAgLyoqCkBAIC0xNDAsOSArMTQxLDExIEBACiAKICAgICBib29sICAgICAgICAgICAgICAgICAgbURldmljZUFjdGl2ZTsKIAorICAgIGNvbnN0IGludCAgICAgICAgICAgICBtQXBpMUNhbWVyYUlkOyAvLyAtMSBpZiBjbGllbnQgaXMgQVBJMgorCiBwcml2YXRlOgogICAgIHRlbXBsYXRlPHR5cGVuYW1lIFRQcm92aWRlclB0cj4KLSAgICBzdGF0dXNfdCAgICAgICAgICAgICAgaW5pdGlhbGl6ZUltcGwoVFByb3ZpZGVyUHRyIHByb3ZpZGVyUHRyKTsKKyAgICBzdGF0dXNfdCAgICAgICAgICAgICAgaW5pdGlhbGl6ZUltcGwoVFByb3ZpZGVyUHRyIHByb3ZpZGVyUHRyLCBjb25zdCBTdHJpbmc4JiBtb25pdG9yVGFncyk7CiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYURldmljZUJhc2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgKaW5kZXggYTkwMDUwZS4uMGJhNzQwMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYURldmljZUJhc2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMTMtMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KICNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CiAKQEAgLTU0LDcgKzU1LDEyIEBACiAgICAgICovCiAgICAgdmlydHVhbCBjb25zdCBTdHJpbmc4JiBnZXRJZCgpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIpID0gMDsKKyAgICAvKioKKyAgICAgKiBUaGUgZGV2aWNlIHZlbmRvciB0YWcgSUQKKyAgICAgKi8KKyAgICB2aXJ0dWFsIG1ldGFkYXRhX3ZlbmRvcl9pZF90IGdldFZlbmRvclRhZ0lkKCkgY29uc3QgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplKHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlciwgY29uc3QgU3RyaW5nOCYgbW9uaXRvclRhZ3MpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGRpc2Nvbm5lY3QoKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSA9IDA7CkBAIC02NCw2ICs3MCwxMiBAQAogICAgICAqLwogICAgIHZpcnR1YWwgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGluZm8oKSBjb25zdCA9IDA7CiAKKyAgICBzdHJ1Y3QgUGh5c2ljYWxDYW1lcmFTZXR0aW5ncyB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGNhbWVyYUlkOworICAgICAgICBDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YTsKKyAgICB9OworICAgIHR5cGVkZWYgTGlzdDxQaHlzaWNhbENhbWVyYVNldHRpbmdzPiBQaHlzaWNhbENhbWVyYVNldHRpbmdzTGlzdDsKKwogICAgIC8qKgogICAgICAqIFN1Ym1pdCByZXF1ZXN0IGZvciBjYXB0dXJlLiBUaGUgQ2FtZXJhRGV2aWNlIHRha2VzIG93bmVyc2hpcCBvZiB0aGUKICAgICAgKiBwYXNzZWQtaW4gYnVmZmVyLgpAQCAtNzUsNyArODcsNyBAQAogICAgICAqIFN1Ym1pdCBhIGxpc3Qgb2YgcmVxdWVzdHMuCiAgICAgICogT3V0cHV0IGxhc3RGcmFtZU51bWJlciBpcyB0aGUgZXhwZWN0ZWQgbGFzdCBmcmFtZSBudW1iZXIgb2YgdGhlIGxpc3Qgb2YgcmVxdWVzdHMuCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjYXB0dXJlTGlzdChjb25zdCBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiAmcmVxdWVzdHMsCisgICAgdmlydHVhbCBzdGF0dXNfdCBjYXB0dXJlTGlzdChjb25zdCBMaXN0PGNvbnN0IFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NMaXN0PiAmcmVxdWVzdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Omxpc3Q8Y29uc3QgU3VyZmFjZU1hcD4gJnN1cmZhY2VNYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCkgPSAwOwogCkBAIC05MSw3ICsxMDMsNyBAQAogICAgICAqIFN1Ym1pdCBhIGxpc3Qgb2YgcmVxdWVzdHMgZm9yIHN0cmVhbWluZy4KICAgICAgKiBPdXRwdXQgbGFzdEZyYW1lTnVtYmVyIGlzIHRoZSBsYXN0IGZyYW1lIG51bWJlciBvZiB0aGUgcHJldmlvdXMgc3RyZWFtaW5nIHJlcXVlc3QuCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1pbmdSZXF1ZXN0TGlzdChjb25zdCBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiAmcmVxdWVzdHMsCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1pbmdSZXF1ZXN0TGlzdChjb25zdCBMaXN0PGNvbnN0IFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NMaXN0PiAmcmVxdWVzdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Omxpc3Q8Y29uc3QgU3VyZmFjZU1hcD4gJnN1cmZhY2VNYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCkgPSAwOwogCkBAIC0xMTgsNiArMTMwLDggQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVN0cmVhbShzcDxTdXJmYWNlPiBjb25zdW1lciwKICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCiAgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAqc3VyZmFjZUlkcyA9IG51bGxwdHIsCiAgICAgICAgICAgICBpbnQgc3RyZWFtU2V0SWQgPSBjYW1lcmEzOjpDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCwKICAgICAgICAgICAgIGJvb2wgaXNTaGFyZWQgPSBmYWxzZSwgdWludDY0X3QgY29uc3VtZXJVc2FnZSA9IDApID0gMDsKIApAQCAtMTMxLDYgKzE0NSw4IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVTdHJlYW0oY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+JiBjb25zdW1lcnMsCiAgICAgICAgICAgICBib29sIGhhc0RlZmVycmVkQ29uc3VtZXIsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCiAgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAqc3VyZmFjZUlkcyA9IG51bGxwdHIsCiAgICAgICAgICAgICBpbnQgc3RyZWFtU2V0SWQgPSBjYW1lcmEzOjpDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCwKICAgICAgICAgICAgIGJvb2wgaXNTaGFyZWQgPSBmYWxzZSwgdWludDY0X3QgY29uc3VtZXJVc2FnZSA9IDApID0gMDsKIApAQCAtMjA5LDcgKzIyNSw4IEBACiAgICAgICogLSBCQURfVkFMVUUgaWYgdGhlIHNldCBvZiBzdHJlYW1zIHdhcyBpbnZhbGlkIChlLmcuIGZtdHMgb3Igc2l6ZXMpCiAgICAgICogLSBJTlZBTElEX09QRVJBVElPTiBpZiB0aGUgZGV2aWNlIHdhcyBpbiB0aGUgd3Jvbmcgc3RhdGUKICAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVN0cmVhbXMoaW50IG9wZXJhdGluZ01vZGUgPSAwKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVTdHJlYW1zKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzZXNzaW9uUGFyYW1zLAorICAgICAgICAgICAgaW50IG9wZXJhdGluZ01vZGUgPSAwKSA9IDA7CiAKICAgICAvLyBnZXQgdGhlIGJ1ZmZlciBwcm9kdWNlciBvZiB0aGUgaW5wdXQgc3RyZWFtCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEJ1ZmZlclByb2R1Y2VyKApAQCAtMzQ3LDcgKzM2NCwxNSBAQAogICAgICAqIFNldCB0aGUgZGVmZXJyZWQgY29uc3VtZXIgc3VyZmFjZSBhbmQgZmluaXNoIHRoZSByZXN0IG9mIHRoZSBzdHJlYW0gY29uZmlndXJhdGlvbi4KICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IHNldENvbnN1bWVyU3VyZmFjZXMoaW50IHN0cmVhbUlkLAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+JiBjb25zdW1lcnMpID0gMDsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgY29uc3VtZXJzLCBzdGQ6OnZlY3RvcjxpbnQ+ICpzdXJmYWNlSWRzIC8qb3V0Ki8pID0gMDsKKworICAgIC8qKgorICAgICAqIFVwZGF0ZSBhIGdpdmVuIHN0cmVhbS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHVwZGF0ZVN0cmVhbShpbnQgc3RyZWFtSWQsIGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiAmbmV3U3VyZmFjZXMsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxhbmRyb2lkOjpjYW1lcmEzOjpPdXRwdXRTdHJlYW1JbmZvPiAmb3V0cHV0SW5mbywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4gJnJlbW92ZWRTdXJmYWNlSWRzLAorICAgICAgICAgICAgS2V5ZWRWZWN0b3I8c3A8U3VyZmFjZT4sIHNpemVfdD4gKm91dHB1dE1hcC8qb3V0Ki8pID0gMDsKIAogICAgIC8qKgogICAgICAqIERyb3AgYnVmZmVycyBmb3Igc3RyZWFtIG9mIHN0cmVhbUlkIGlmIGRyb3BwaW5nIGlzIHRydWUuIElmIGRyb3BwaW5nIGlzIGZhbHNlLCBkbyBub3QKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5jcHAKaW5kZXggZTZhNmEyMS4uNDNmMWE5MSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5jcHAKQEAgLTIwLDExICsyMCwxMyBAQAogCiAjaW5jbHVkZSAiQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmgiCiAKKyNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8Y2hyb25vPgogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8aGlkbC9TZXJ2aWNlTWFuYWdlbWVudC5oPgogI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiAjaW5jbHVkZSA8Y2FtZXJhX21ldGFkYXRhX2hpZGRlbi5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wYXJzZWludC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTM1LDkgKzM3LDcgQEAKIC8vIEhhcmRjb2RlZCBuYW1lIGZvciB0aGUgcGFzc3Rocm91Z2ggSEFMIGltcGxlbWVudGF0aW9uLCBzaW5jZSBpdCBjYW4ndCBiZSBkaXNjb3ZlcmVkIHZpYSB0aGUKIC8vIHNlcnZpY2UgbWFuYWdlcgogY29uc3Qgc3RkOjpzdHJpbmcga0xlZ2FjeVByb3ZpZGVyTmFtZSgibGVnYWN5LzAiKTsKLQotLy8gU2xhc2gtc2VwYXJhdGVkIGxpc3Qgb2YgcHJvdmlkZXIgdHlwZXMgdG8gY29uc2lkZXIgZm9yIHVzZSB2aWEgdGhlIG9sZCBjYW1lcmEgQVBJCi1jb25zdCBzdGQ6OnN0cmluZyBrU3RhbmRhcmRQcm92aWRlclR5cGVzKCJpbnRlcm5hbC9sZWdhY3kiKTsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtFeHRlcm5hbFByb3ZpZGVyTmFtZSgiZXh0ZXJuYWwvMCIpOwogCiB9IC8vIGFub255bW91cyBuYW1lc3BhY2UKIApAQCAtNjksNiArNjksNyBAQAogCiAgICAgLy8gU2VlIGlmIHRoZXJlJ3MgYSBwYXNzdGhyb3VnaCBIQUwsIGJ1dCBsZXQncyBub3QgY29tcGxhaW4gaWYgdGhlcmUncyBub3QKICAgICBhZGRQcm92aWRlckxvY2tlZChrTGVnYWN5UHJvdmlkZXJOYW1lLCAvKmV4cGVjdGVkKi8gZmFsc2UpOworICAgIGFkZFByb3ZpZGVyTG9ja2VkKGtFeHRlcm5hbFByb3ZpZGVyTmFtZSwgLypleHBlY3RlZCovIGZhbHNlKTsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTc3LDE4ICs3OCw3IEBACiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKICAgICBpbnQgY291bnQgPSAwOwogICAgIGZvciAoYXV0byYgcHJvdmlkZXIgOiBtUHJvdmlkZXJzKSB7Ci0gICAgICAgIGNvdW50ICs9IHByb3ZpZGVyLT5tVW5pcXVlRGV2aWNlQ291bnQ7Ci0gICAgfQotICAgIHJldHVybiBjb3VudDsKLX0KLQotaW50IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6Z2V0QVBJMUNvbXBhdGlibGVDYW1lcmFDb3VudCgpIGNvbnN0IHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOwotICAgIGludCBjb3VudCA9IDA7Ci0gICAgZm9yIChhdXRvJiBwcm92aWRlciA6IG1Qcm92aWRlcnMpIHsKLSAgICAgICAgaWYgKGtTdGFuZGFyZFByb3ZpZGVyVHlwZXMuZmluZChwcm92aWRlci0+Z2V0VHlwZSgpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgICAgICAgICAgY291bnQgKz0gcHJvdmlkZXItPm1VbmlxdWVBUEkxQ29tcGF0aWJsZUNhbWVyYUlkcy5zaXplKCk7Ci0gICAgICAgIH0KKyAgICAgICAgY291bnQgKz0gcHJvdmlkZXItPm1VbmlxdWVDYW1lcmFJZHMuc2l6ZSgpOwogICAgIH0KICAgICByZXR1cm4gY291bnQ7CiB9CkBAIC0xMDgsMTIgKzk4LDMzIEBACiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZGV2aWNlSWRzOwogICAgIGZvciAoYXV0byYgcHJvdmlkZXIgOiBtUHJvdmlkZXJzKSB7Ci0gICAgICAgIGlmIChrU3RhbmRhcmRQcm92aWRlclR5cGVzLmZpbmQocHJvdmlkZXItPmdldFR5cGUoKSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICAgICAgICAgIGZvciAoYXV0byYgaWQgOiBwcm92aWRlci0+bVVuaXF1ZUFQSTFDb21wYXRpYmxlQ2FtZXJhSWRzKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlSWRzLnB1c2hfYmFjayhpZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHByb3ZpZGVyRGV2aWNlSWRzID0gcHJvdmlkZXItPm1VbmlxdWVBUEkxQ29tcGF0aWJsZUNhbWVyYUlkczsKKworICAgICAgICAvLyBBUEkxIGFwcCBkb2Vzbid0IGhhbmRsZSBsb2dpY2FsIGFuZCBwaHlzaWNhbCBjYW1lcmEgZGV2aWNlcyB3ZWxsLiBTbworICAgICAgICAvLyBmb3IgZWFjaCBbbG9naWNhbCwgcGh5c2ljYWwxLCBwaHlzaWNhbDIsIC4uLl0gaWQgY29tYm8sIG9ubHkgdGFrZSB0aGUKKyAgICAgICAgLy8gZmlyc3QgaWQgYWR2ZXJ0aXNlZCBieSBIQUwsIGFuZCBmaWx0ZXIgb3V0IHRoZSByZXN0LgorICAgICAgICBmaWx0ZXJMb2dpY2FsQ2FtZXJhSWRzTG9ja2VkKHByb3ZpZGVyRGV2aWNlSWRzKTsKKworICAgICAgICBkZXZpY2VJZHMuaW5zZXJ0KGRldmljZUlkcy5lbmQoKSwgcHJvdmlkZXJEZXZpY2VJZHMuYmVnaW4oKSwgcHJvdmlkZXJEZXZpY2VJZHMuZW5kKCkpOwogICAgIH0KKworICAgIHN0ZDo6c29ydChkZXZpY2VJZHMuYmVnaW4oKSwgZGV2aWNlSWRzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3Qgc3RkOjpzdHJpbmcmIGEsIGNvbnN0IHN0ZDo6c3RyaW5nJiBiKSAtPiBib29sIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBhVWludCA9IDAsIGJVaW50ID0gMDsKKyAgICAgICAgICAgICAgICBib29sIGFJc1VpbnQgPSBiYXNlOjpQYXJzZVVpbnQoYSwgJmFVaW50KTsKKyAgICAgICAgICAgICAgICBib29sIGJJc1VpbnQgPSBiYXNlOjpQYXJzZVVpbnQoYiwgJmJVaW50KTsKKworICAgICAgICAgICAgICAgIC8vIFVpbnQgZGV2aWNlIElEcyBmaXJzdAorICAgICAgICAgICAgICAgIGlmIChhSXNVaW50ICYmIGJJc1VpbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFVaW50IDwgYlVpbnQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhSXNVaW50KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYklzVWludCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFNpbXBsZSBzdHJpbmcgY29tcGFyZSBpZiBib3RoIGlkIGFyZSBub3QgdWludAorICAgICAgICAgICAgICAgIHJldHVybiBhIDwgYjsKKyAgICAgICAgICAgIH0pOwogICAgIHJldHVybiBkZXZpY2VJZHM7CiB9CiAKQEAgLTE2NiwxMSArMTc3LDcgQEAKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKICAgICAgICAgQ2FtZXJhTWV0YWRhdGEqIGNoYXJhY3RlcmlzdGljcykgY29uc3QgewogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7Ci0KLSAgICBhdXRvIGRldmljZUluZm8gPSBmaW5kRGV2aWNlSW5mb0xvY2tlZChpZCwgLyptaW5WZXJzaW9uKi8gezMsMH0sIC8qbWF4VmVyc2lvbiovIHs0LDB9KTsKLSAgICBpZiAoZGV2aWNlSW5mbyA9PSBudWxscHRyKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7Ci0KLSAgICByZXR1cm4gZGV2aWNlSW5mby0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNoYXJhY3RlcmlzdGljcyk7CisgICAgcmV0dXJuIGdldENhbWVyYUNoYXJhY3RlcmlzdGljc0xvY2tlZChpZCwgY2hhcmFjdGVyaXN0aWNzKTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpnZXRIaWdoZXN0U3VwcG9ydGVkVmVyc2lvbihjb25zdCBzdGQ6OnN0cmluZyAmaWQsCkBAIC0zODUsNiArMzkyLDM3IEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAorYm9vbCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmlzTG9naWNhbENhbWVyYShjb25zdCBDYW1lcmFNZXRhZGF0YSYgc3RhdGljSW5mbywKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBwaHlzaWNhbENhbWVyYUlkcykgeworICAgIGJvb2wgaXNMb2dpY2FsQ2FtID0gZmFsc2U7CisgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZW50cnlDYXA7CisKKyAgICBlbnRyeUNhcCA9IHN0YXRpY0luZm8uZmluZChBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbnRyeUNhcC5jb3VudDsgKytpKSB7CisgICAgICAgIHVpbnQ4X3QgY2FwYWJpbGl0eSA9IGVudHJ5Q2FwLmRhdGEudThbaV07CisgICAgICAgIGlmIChjYXBhYmlsaXR5ID09IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX0xPR0lDQUxfTVVMVElfQ0FNRVJBKSB7CisgICAgICAgICAgICBpc0xvZ2ljYWxDYW0gPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFpc0xvZ2ljYWxDYW0pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGVudHJ5SWRzID0gc3RhdGljSW5mby5maW5kKEFORFJPSURfTE9HSUNBTF9NVUxUSV9DQU1FUkFfUEhZU0lDQUxfSURTKTsKKyAgICBjb25zdCB1aW50OF90KiBpZHMgPSBlbnRyeUlkcy5kYXRhLnU4OworICAgIHNpemVfdCBzdGFydCA9IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbnRyeUlkcy5jb3VudDsgKytpKSB7CisgICAgICAgIGlmIChpZHNbaV0gPT0gJ1wwJykgeworICAgICAgICAgICAgaWYgKHN0YXJ0ICE9IGkpIHsKKyAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkcy0+cHVzaF9iYWNrKChjb25zdCBjaGFyKilpZHMrc3RhcnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhcnQgPSBpKzE7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6YWRkUHJvdmlkZXJMb2NrZWQoY29uc3Qgc3RkOjpzdHJpbmcmIG5ld1Byb3ZpZGVyLCBib29sIGV4cGVjdGVkKSB7CiAgICAgZm9yIChjb25zdCBhdXRvJiBwcm92aWRlckluZm8gOiBtUHJvdmlkZXJzKSB7CiAgICAgICAgIGlmIChwcm92aWRlckluZm8tPm1Qcm92aWRlck5hbWUgPT0gbmV3UHJvdmlkZXIpIHsKQEAgLTQ3OCw2ICs1MTYsOCBAQAogICAgIH0KICAgICBBTE9HSSgiQ29ubmVjdGluZyB0byBuZXcgY2FtZXJhIHByb3ZpZGVyOiAlcywgaXNSZW1vdGU/ICVkIiwKICAgICAgICAgICAgIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgbUludGVyZmFjZS0+aXNSZW1vdGUoKSk7CisgICAgLy8gY2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlIGNhbGxiYWNrcyBtYXkgYmUgY2FsbGVkIChhbmQgY2F1c2luZyBuZXcgZGV2aWNlcyBhZGRlZCkKKyAgICAvLyBiZWZvcmUgc2V0Q2FsbGJhY2sgcmV0dXJucwogICAgIGhhcmR3YXJlOjpSZXR1cm48U3RhdHVzPiBzdGF0dXMgPSBtSW50ZXJmYWNlLT5zZXRDYWxsYmFjayh0aGlzKTsKICAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBzZXR0aW5nIHVwIGNhbGxiYWNrcyB3aXRoIGNhbWVyYSBwcm92aWRlciAnJXMnOiAlcyIsCkBAIC01MzQsMTcgKzU3NCwxMCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgZm9yIChhdXRvJiBkZXZpY2UgOiBtRGV2aWNlcykgewotICAgICAgICBtVW5pcXVlQ2FtZXJhSWRzLmluc2VydChkZXZpY2UtPm1JZCk7Ci0gICAgICAgIGlmIChkZXZpY2UtPmlzQVBJMUNvbXBhdGlibGUoKSkgewotICAgICAgICAgICAgbVVuaXF1ZUFQSTFDb21wYXRpYmxlQ2FtZXJhSWRzLmluc2VydChkZXZpY2UtPm1JZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbVVuaXF1ZURldmljZUNvdW50ID0gbVVuaXF1ZUNhbWVyYUlkcy5zaXplKCk7Ci0KICAgICBBTE9HSSgiQ2FtZXJhIHByb3ZpZGVyICVzIHJlYWR5IHdpdGggJXp1IGNhbWVyYSBkZXZpY2VzIiwKICAgICAgICAgICAgIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgbURldmljZXMuc2l6ZSgpKTsKIAorICAgIG1Jbml0aWFsaXplZCA9IHRydWU7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC01OTIsMTUgKzYyNSwzNiBAQAogICAgIH0KICAgICBpZiAoZGV2aWNlSW5mbyA9PSBudWxscHRyKSByZXR1cm4gQkFEX1ZBTFVFOwogICAgIGRldmljZUluZm8tPm1TdGF0dXMgPSBpbml0aWFsU3RhdHVzOworICAgIGJvb2wgaXNBUEkxQ29tcGF0aWJsZSA9IGRldmljZUluZm8tPmlzQVBJMUNvbXBhdGlibGUoKTsKIAogICAgIG1EZXZpY2VzLnB1c2hfYmFjayhzdGQ6Om1vdmUoZGV2aWNlSW5mbykpOwogCisgICAgbVVuaXF1ZUNhbWVyYUlkcy5pbnNlcnQoaWQpOworICAgIGlmIChpc0FQSTFDb21wYXRpYmxlKSB7CisgICAgICAgIG1VbmlxdWVBUEkxQ29tcGF0aWJsZUNhbWVyYUlkcy5wdXNoX2JhY2soaWQpOworICAgIH0KKwogICAgIGlmIChwYXJzZWRJZCAhPSBudWxscHRyKSB7CiAgICAgICAgICpwYXJzZWRJZCA9IGlkOwogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CiAKK3ZvaWQgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OnJlbW92ZURldmljZShzdGQ6OnN0cmluZyBpZCkgeworICAgIGZvciAoYXV0byBpdCA9IG1EZXZpY2VzLmJlZ2luKCk7IGl0ICE9IG1EZXZpY2VzLmVuZCgpOyBpdCsrKSB7CisgICAgICAgIGlmICgoKml0KS0+bUlkID09IGlkKSB7CisgICAgICAgICAgICBtVW5pcXVlQ2FtZXJhSWRzLmVyYXNlKGlkKTsKKyAgICAgICAgICAgIGlmICgoKml0KS0+aXNBUEkxQ29tcGF0aWJsZSgpKSB7CisgICAgICAgICAgICAgICAgbVVuaXF1ZUFQSTFDb21wYXRpYmxlQ2FtZXJhSWRzLmVyYXNlKHN0ZDo6cmVtb3ZlKAorICAgICAgICAgICAgICAgICAgICAgICAgbVVuaXF1ZUFQSTFDb21wYXRpYmxlQ2FtZXJhSWRzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICBtVW5pcXVlQVBJMUNvbXBhdGlibGVDYW1lcmFJZHMuZW5kKCksIGlkKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRGV2aWNlcy5lcmFzZShpdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKwogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JikgY29uc3QgewogICAgIGRwcmludGYoZmQsICI9PSBDYW1lcmEgUHJvdmlkZXIgSEFMICVzICh2Mi40LCAlcykgc3RhdGljIGluZm86ICV6dSBkZXZpY2VzOiA9PVxuIiwKICAgICAgICAgICAgIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgbUludGVyZmFjZS0+aXNSZW1vdGUoKSA/ICJyZW1vdGUiIDogInBhc3N0aHJvdWdoIiwKQEAgLTY0Myw2ICs2OTcsMTQgQEAKICAgICAgICAgICAgIGRwcmludGYoZmQsICIgIEFQSTIgY2FtZXJhIGNoYXJhY3RlcmlzdGljczpcbiIpOwogICAgICAgICAgICAgaW5mbzIuZHVtcChmZCwgLyp2ZXJib3NpdHkqLyAyLCAvKmluZGVudGF0aW9uKi8gNCk7CiAgICAgICAgIH0KKworICAgICAgICBkcHJpbnRmKGZkLCAiPT0gQ2FtZXJhIEhBTCBkZXZpY2UgJXMgKHYlZC4lZCkgZHVtcFN0YXRlOiA9PVxuIiwgZGV2aWNlLT5tTmFtZS5jX3N0cigpLAorICAgICAgICAgICAgICAgIGRldmljZS0+bVZlcnNpb24uZ2V0X21ham9yKCksIGRldmljZS0+bVZlcnNpb24uZ2V0X21pbm9yKCkpOworICAgICAgICByZXMgPSBkZXZpY2UtPmR1bXBTdGF0ZShmZCk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIGRwcmludGYoZmQsICIgICA8RXJyb3IgZHVtcGluZyBkZXZpY2UgJXMgc3RhdGU6ICVzICglZCk+XG4iLAorICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPm1OYW1lLmNfc3RyKCksIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBPSzsKIH0KQEAgLTY1Miw2ICs3MTQsNyBAQAogICAgICAgICBDYW1lcmFEZXZpY2VTdGF0dXMgbmV3U3RhdHVzKSB7CiAgICAgc3A8U3RhdHVzTGlzdGVuZXI+IGxpc3RlbmVyOwogICAgIHN0ZDo6c3RyaW5nIGlkOworICAgIGJvb2wgaW5pdGlhbGl6ZWQgPSBmYWxzZTsKICAgICB7CiAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKICAgICAgICAgYm9vbCBrbm93biA9IGZhbHNlOwpAQCAtNjc0LDExICs3MzcsMTcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGFkZERldmljZShjYW1lcmFEZXZpY2VOYW1lLCBuZXdTdGF0dXMsICZpZCk7CisgICAgICAgIH0gZWxzZSBpZiAobmV3U3RhdHVzID09IENhbWVyYURldmljZVN0YXR1czo6Tk9UX1BSRVNFTlQpIHsKKyAgICAgICAgICAgIHJlbW92ZURldmljZShpZCk7CiAgICAgICAgIH0KICAgICAgICAgbGlzdGVuZXIgPSBtTWFuYWdlci0+Z2V0U3RhdHVzTGlzdGVuZXIoKTsKKyAgICAgICAgaW5pdGlhbGl6ZWQgPSBtSW5pdGlhbGl6ZWQ7CiAgICAgfQogICAgIC8vIENhbGwgd2l0aG91dCBsb2NrIGhlbGQgdG8gYWxsb3cgcmVlbnRyYW5jeSBpbnRvIHByb3ZpZGVyIG1hbmFnZXIKLSAgICBpZiAobGlzdGVuZXIgIT0gbnVsbHB0cikgeworICAgIC8vIERvbid0IHNlbmQgdGhlIGNhbGxiYWNrIGlmIHByb3ZpZGVySW5mbyBoYXNuJ3QgYmVlbiBpbml0aWFsaXplZC4KKyAgICAvLyBDYW1lcmFTZXJ2aWNlIHdpbGwgaW5pdGlhbGl6ZSBkZXZpY2Ugc3RhdHVzIGFmdGVyIHByb3ZpZGVyIGlzCisgICAgLy8gaW5pdGlhbGl6ZWQKKyAgICBpZiAobGlzdGVuZXIgIT0gbnVsbHB0ciAmJiBpbml0aWFsaXplZCkgewogICAgICAgICBsaXN0ZW5lci0+b25EZXZpY2VTdGF0dXNDaGFuZ2VkKFN0cmluZzgoaWQuY19zdHIoKSksIG5ld1N0YXR1cyk7CiAgICAgfQogICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwpAQCAtNzQ4LDYgKzgxNywxOCBAQAogICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSwgc3RhdHVzVG9TdHJpbmcoc3RhdHVzKSk7CiAgICAgICAgIHJldHVybiBudWxscHRyOwogICAgIH0KKworICAgIGZvciAoYXV0byYgY29uZmxpY3ROYW1lIDogcmVzb3VyY2VDb3N0LmNvbmZsaWN0aW5nRGV2aWNlcykgeworICAgICAgICB1aW50MTZfdCBtYWpvciwgbWlub3I7CisgICAgICAgIHN0ZDo6c3RyaW5nIHR5cGUsIGlkOworICAgICAgICBzdGF0dXNfdCByZXMgPSBwYXJzZURldmljZU5hbWUoY29uZmxpY3ROYW1lLCAmbWFqb3IsICZtaW5vciwgJnR5cGUsICZpZCk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHBhcnNlIGNvbmZsaWN0aW5nIGRldmljZSAlcyIsIF9fRlVOQ1RJT05fXywgY29uZmxpY3ROYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgY29uZmxpY3ROYW1lID0gaWQ7CisgICAgfQorCiAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxEZXZpY2VJbmZvPigKICAgICAgICAgbmV3IERldmljZUluZm9UKG5hbWUsIHRhZ0lkLCBpZCwgbWlub3JWZXJzaW9uLCByZXNvdXJjZUNvc3QsCiAgICAgICAgICAgICAgICAgY2FtZXJhSW50ZXJmYWNlKSk7CkBAIC05MDgsNiArOTg5LDE3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzE6OmR1bXBTdGF0ZShpbnQgZmQpIGNvbnN0IHsKKyAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsMCk7CisgICAgaGFuZGxlLT5kYXRhWzBdID0gZmQ7CisgICAgaGFyZHdhcmU6OlJldHVybjxTdGF0dXM+IHMgPSBtSW50ZXJmYWNlLT5kdW1wU3RhdGUoaGFuZGxlKTsKKyAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoYW5kbGUpOworICAgIGlmICghcy5pc09rKCkpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICByZXR1cm4gbWFwVG9TdGF0dXNUKHMpOworfQorCiBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OkRldmljZUluZm8zKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAogICAgICAgICBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCB0YWdJZCwgY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAogICAgICAgICB1aW50MTZfdCBtaW5vclZlcnNpb24sCkBAIC0xMDExLDYgKzExMDMsMTcgQEAKICAgICByZXR1cm4gaXNCYWNrd2FyZENvbXBhdGlibGU7CiB9CiAKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6ZHVtcFN0YXRlKGludCBmZCkgY29uc3QgeworICAgIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwwKTsKKyAgICBoYW5kbGUtPmRhdGFbMF0gPSBmZDsKKyAgICBhdXRvIHJldCA9IG1JbnRlcmZhY2UtPmR1bXBTdGF0ZShoYW5kbGUpOworICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhhbmRsZSk7CisgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmdldENhbWVyYUNoYXJhY3RlcmlzdGljcygKICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgKmNoYXJhY3RlcmlzdGljcykgY29uc3QgewogICAgIGlmIChjaGFyYWN0ZXJpc3RpY3MgPT0gbnVsbHB0cikgcmV0dXJuIEJBRF9WQUxVRTsKQEAgLTEzNDQsOSArMTQ0Nyw1NSBAQAogICAgICAgICBkZXNjLT5tUmV2ZXJzZU1hcHBpbmdbcmV2ZXJzZUluZGV4XS0+YWRkKGRlc2MtPm1UYWdUb05hbWVNYXAudmFsdWVGb3IodGFnKSwgdGFnKTsKICAgICB9CiAKLSAgICBkZXNjcmlwdG9yID0gZGVzYzsKKyAgICBkZXNjcmlwdG9yID0gc3RkOjptb3ZlKGRlc2MpOwogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3NMb2NrZWQoY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAorICAgICAgICBDYW1lcmFNZXRhZGF0YSogY2hhcmFjdGVyaXN0aWNzKSBjb25zdCB7CisgICAgYXV0byBkZXZpY2VJbmZvID0gZmluZERldmljZUluZm9Mb2NrZWQoaWQsIC8qbWluVmVyc2lvbiovIHszLDB9LCAvKm1heFZlcnNpb24qLyB7NCwwfSk7CisgICAgaWYgKGRldmljZUluZm8gPT0gbnVsbHB0cikgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworCisgICAgcmV0dXJuIGRldmljZUluZm8tPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjaGFyYWN0ZXJpc3RpY3MpOworfQorCit2b2lkIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6ZmlsdGVyTG9naWNhbENhbWVyYUlkc0xvY2tlZCgKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBkZXZpY2VJZHMpIGNvbnN0Cit7CisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiByZW1vdmVkSWRzOworCisgICAgZm9yIChhdXRvJiBkZXZpY2VJZCA6IGRldmljZUlkcykgeworICAgICAgICBDYW1lcmFNZXRhZGF0YSBpbmZvOworICAgICAgICBzdGF0dXNfdCByZXMgPSBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3NMb2NrZWQoZGV2aWNlSWQsICZpbmZvKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzIGZvciBpZCAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlSWQuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBpZENvbWJvIGNvbnRhaW5zIHRoZSBpZHMgb2YgYSBsb2dpY2FsIGNhbWVyYSBhbmQgaXRzIHBoeXNpY2FsIGNhbWVyYXMKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGlkQ29tYm87CisgICAgICAgIGJvb2wgbG9naWNhbENhbWVyYSA9IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6aXNMb2dpY2FsQ2FtZXJhKGluZm8sICZpZENvbWJvKTsKKyAgICAgICAgaWYgKCFsb2dpY2FsQ2FtZXJhKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZENvbWJvLnB1c2hfYmFjayhkZXZpY2VJZCk7CisKKyAgICAgICAgZm9yIChhdXRvJiBpZCA6IGRldmljZUlkcykgeworICAgICAgICAgICAgYXV0byBmb3VuZElkID0gc3RkOjpmaW5kKGlkQ29tYm8uYmVnaW4oKSwgaWRDb21iby5lbmQoKSwgaWQpOworICAgICAgICAgICAgaWYgKGZvdW5kSWQgPT0gaWRDb21iby5lbmQoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZENvbWJvLmVyYXNlKGZvdW5kSWQpOworICAgICAgICAgICAgcmVtb3ZlZElkcy5pbnNlcnQoaWRDb21iby5iZWdpbigpLCBpZENvbWJvLmVuZCgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgZGV2aWNlSWRzLmVyYXNlKHN0ZDo6cmVtb3ZlX2lmKGRldmljZUlkcy5iZWdpbigpLCBkZXZpY2VJZHMuZW5kKCksCisgICAgICAgICAgICBbJnJlbW92ZWRJZHNdKGNvbnN0IHN0ZDo6c3RyaW5nJiBzKSB7cmV0dXJuIHJlbW92ZWRJZHMuZmluZChzKSAhPSByZW1vdmVkSWRzLmVuZCgpO30pLAorICAgICAgICAgICAgZGV2aWNlSWRzLmVuZCgpKTsKK30KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5oCmluZGV4IGU4MjI4MmYuLmI4YjhiOGMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmgKQEAgLTE4LDcgKzE4LDcgQEAKICNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkFQUk9WSURFUl9ICiAKICNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPG11dGV4PgogCkBAIC0xMjUsMTYgKzEyNSwxNCBAQAogICAgICAqLwogICAgIGludCBnZXRDYW1lcmFDb3VudCgpIGNvbnN0OwogCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGdldENhbWVyYURldmljZUlkcygpIGNvbnN0OworCiAgICAgLyoqCiAgICAgICogUmV0cmlldmUgdGhlIG51bWJlciBvZiBBUEkxIGNvbXBhdGlibGUgY2FtZXJhczsgdGhlc2UgYXJlIGludGVybmFsIGFuZAogICAgICAqIGJhY2t3YXJkcy1jb21wYXRpYmxlLiBUaGlzIGlzIHRoZSBzZXQgb2YgY2FtZXJhcyB0aGF0IHdpbGwgYmUKLSAgICAgKiBhY2Nlc3NpYmxlIHZpYSB0aGUgb2xkIGNhbWVyYSBBUEksIHdpdGggSURzIGluIHJhbmdlIG9mCi0gICAgICogWzAsIGdldEFQSTFDb21wYXRpYmxlQ2FtZXJhQ291bnQoKS0xXS4gVGhpcyB2YWx1ZSBpcyBub3QgZXhwZWN0ZWQgdG8gY2hhbmdlIGR5bmFtaWNhbGx5LgorICAgICAqIGFjY2Vzc2libGUgdmlhIHRoZSBvbGQgY2FtZXJhIEFQSS4KKyAgICAgKiBUaGUgcmV0dXJuIHZhbHVlIG1heSBjaGFuZ2UgZHluYW1pY2FsbHkgZHVlIHRvIGV4dGVybmFsIGNhbWVyYSBob3RwbHVnLgogICAgICAqLwotICAgIGludCBnZXRBUEkxQ29tcGF0aWJsZUNhbWVyYUNvdW50KCkgY29uc3Q7Ci0KLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZ2V0Q2FtZXJhRGV2aWNlSWRzKCkgY29uc3Q7Ci0KICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZ2V0QVBJMUNvbXBhdGlibGVDYW1lcmFEZXZpY2VJZHMoKSBjb25zdDsKIAogICAgIC8qKgpAQCAtMjMyLDYgKzIzMCwxMyBAQAogICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbiBtaW5WZXJzaW9uID0gaGFyZHdhcmU6OmhpZGxfdmVyc2lvbnswLDB9LAogICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbiBtYXhWZXJzaW9uID0gaGFyZHdhcmU6OmhpZGxfdmVyc2lvbnsxMDAwLDB9KSBjb25zdDsKIAorICAgIC8qCisgICAgICogQ2hlY2sgaWYgYSBjYW1lcmEgd2l0aCBzdGF0aWNJbmZvIGlzIGEgbG9naWNhbCBjYW1lcmEuIEFuZCBpZiB5ZXMsIHJldHVybgorICAgICAqIHRoZSBwaHlzaWNhbCBjYW1lcmEgaWRzLgorICAgICAqLworICAgIHN0YXRpYyBib29sIGlzTG9naWNhbENhbWVyYShjb25zdCBDYW1lcmFNZXRhZGF0YSYgc3RhdGljSW5mbywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogcGh5c2ljYWxDYW1lcmFJZHMpOworCiBwcml2YXRlOgogICAgIC8vIEFsbCBwcml2YXRlIG1lbWJlcnMsIHVubGVzcyBvdGhlcndpc2Ugbm90ZWQsIGV4cGVjdCBtSW50ZXJmYWNlTXV0ZXggdG8gYmUgbG9ja2VkIGJlZm9yZSB1c2UKICAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbUludGVyZmFjZU11dGV4OwpAQCAtMjkzLDYgKzI5OCw3IEBACiAgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFRvcmNoTW9kZShib29sIGVuYWJsZWQpID0gMDsKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FtZXJhSW5mbyhoYXJkd2FyZTo6Q2FtZXJhSW5mbyAqaW5mbykgY29uc3QgPSAwOwogICAgICAgICAgICAgdmlydHVhbCBib29sIGlzQVBJMUNvbXBhdGlibGUoKSBjb25zdCA9IDA7CisgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXBTdGF0ZShpbnQgZmQpIGNvbnN0ID0gMDsKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKENhbWVyYU1ldGFkYXRhICpjaGFyYWN0ZXJpc3RpY3MpIGNvbnN0IHsKICAgICAgICAgICAgICAgICAodm9pZCkgY2hhcmFjdGVyaXN0aWNzOwogICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTMxMyw5ICszMTksOSBAQAogICAgICAgICAgICAgc3RhdGljIHN0YXR1c190IHNldFRvcmNoTW9kZShJbnRlcmZhY2VUJiBpbnRlcmZhY2UsIGJvb2wgZW5hYmxlZCk7CiAgICAgICAgIH07CiAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxEZXZpY2VJbmZvPj4gbURldmljZXM7Ci0gICAgICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBtVW5pcXVlQ2FtZXJhSWRzOworICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IG1VbmlxdWVDYW1lcmFJZHM7CiAgICAgICAgIGludCBtVW5pcXVlRGV2aWNlQ291bnQ7Ci0gICAgICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBtVW5pcXVlQVBJMUNvbXBhdGlibGVDYW1lcmFJZHM7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtVW5pcXVlQVBJMUNvbXBhdGlibGVDYW1lcmFJZHM7CiAKICAgICAgICAgLy8gSEFMdjEtc3BlY2lmaWMgY2FtZXJhIGZpZWxkcywgaW5jbHVkaW5nIHRoZSBhY3R1YWwgZGV2aWNlIGludGVyZmFjZQogICAgICAgICBzdHJ1Y3QgRGV2aWNlSW5mbzEgOiBwdWJsaWMgRGV2aWNlSW5mbyB7CkBAIC0zMjYsNiArMzMyLDcgQEAKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FtZXJhSW5mbyhoYXJkd2FyZTo6Q2FtZXJhSW5mbyAqaW5mbykgY29uc3Qgb3ZlcnJpZGU7CiAgICAgICAgICAgICAvL0luIGNhc2Ugb2YgRGV2aWNlMUluZm8gYXNzdW1lIHRoYXQgd2UgYXJlIGFsd2F5cyBBUEkxIGNvbXBhdGlibGUKICAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBpc0FQSTFDb21wYXRpYmxlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQorICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wU3RhdGUoaW50IGZkKSBjb25zdCBvdmVycmlkZTsKICAgICAgICAgICAgIERldmljZUluZm8xKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCB0YWdJZCwKICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCB1aW50MTZfdCBtaW5vclZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhUmVzb3VyY2VDb3N0JiByZXNvdXJjZUNvc3QsCkBAIC0zNDMsNiArMzUwLDcgQEAKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VG9yY2hNb2RlKGJvb2wgZW5hYmxlZCkgb3ZlcnJpZGU7CiAgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhbWVyYUluZm8oaGFyZHdhcmU6OkNhbWVyYUluZm8gKmluZm8pIGNvbnN0IG92ZXJyaWRlOwogICAgICAgICAgICAgdmlydHVhbCBib29sIGlzQVBJMUNvbXBhdGlibGUoKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcFN0YXRlKGludCBmZCkgY29uc3Qgb3ZlcnJpZGU7CiAgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhbWVyYUNoYXJhY3RlcmlzdGljcygKICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgKmNoYXJhY3RlcmlzdGljcykgY29uc3Qgb3ZlcnJpZGU7CiAKQEAgLTM2Myw2ICszNzEsOCBAQAogCiAgICAgICAgIENhbWVyYVByb3ZpZGVyTWFuYWdlciAqbU1hbmFnZXI7CiAKKyAgICAgICAgYm9vbCBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKwogICAgICAgICAvLyBUZW1wbGF0ZWQgbWV0aG9kIHRvIGluc3RhbnRpYXRlIHRoZSByaWdodCBraW5kIG9mIERldmljZUluZm8gYW5kIGNhbGwgdGhlCiAgICAgICAgIC8vIHJpZ2h0IENhbWVyYVByb3ZpZGVyIGdldENhbWVyYURldmljZUludGVyZmFjZV8qIG1ldGhvZC4KICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgRGV2aWNlSW5mb1Q+CkBAIC0zODQsNiArMzk0LDggQEAKIAogICAgICAgICAvLyBHZW5lcmF0ZSB2ZW5kb3IgdGFnIGlkCiAgICAgICAgIHN0YXRpYyBtZXRhZGF0YV92ZW5kb3JfaWRfdCBnZW5lcmF0ZVZlbmRvclRhZ0lkKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKTsKKworICAgICAgICB2b2lkIHJlbW92ZURldmljZShzdGQ6OnN0cmluZyBpZCk7CiAgICAgfTsKIAogICAgIC8vIFV0aWxpdHkgdG8gZmluZCBhIERldmljZUluZm8gYnkgSUQ7IHBvaW50ZXIgaXMgb25seSB2YWxpZCB3aGlsZSBtSW50ZXJmYWNlTXV0ZXggaXMgaGVsZApAQCAtNDA5LDYgKzQyMSw5IEBACiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIHRvcmNoU3RhdHVzVG9TdHJpbmcoCiAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6VG9yY2hNb2RlU3RhdHVzJik7CiAKKyAgICBzdGF0dXNfdCBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3NMb2NrZWQoY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAorICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEqIGNoYXJhY3RlcmlzdGljcykgY29uc3Q7CisgICAgdm9pZCBmaWx0ZXJMb2dpY2FsQ2FtZXJhSWRzTG9ja2VkKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgZGV2aWNlSWRzKSBjb25zdDsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwCmluZGV4IGE5ODBjZGUuLjU0MzkxNGUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDEzLTIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMzksNiArMzksOCBAQAogCiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KIAorI2luY2x1ZGUgPHV0aWxpdHk+CisKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgpAQCAtNzUsNyArNzcsOCBAQAogICAgICAgICBtTmV4dFNodXR0ZXJGcmFtZU51bWJlcigwKSwKICAgICAgICAgbU5leHRSZXByb2Nlc3NTaHV0dGVyRnJhbWVOdW1iZXIoMCksCiAgICAgICAgIG1MaXN0ZW5lcihOVUxMKSwKLSAgICAgICAgbVZlbmRvclRhZ0lkKENBTUVSQV9NRVRBREFUQV9JTlZBTElEX1ZFTkRPUl9JRCkKKyAgICAgICAgbVZlbmRvclRhZ0lkKENBTUVSQV9NRVRBREFUQV9JTlZBTElEX1ZFTkRPUl9JRCksCisgICAgICAgIG1MYXN0VGVtcGxhdGVJZCgtMSkKIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIGNhbWVyYTNfY2FsbGJhY2tfb3BzOjpub3RpZnkgPSAmc05vdGlmeTsKQEAgLTk0LDcgKzk3LDcgQEAKICAgICByZXR1cm4gbUlkOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjppbml0aWFsaXplKHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlcikgeworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6aW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIsIGNvbnN0IFN0cmluZzgmIG1vbml0b3JUYWdzKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKQEAgLTE2Nyw2ICsxNzAsMTAgQEAKICAgICBtSW50ZXJmYWNlID0gbmV3IEhhbEludGVyZmFjZShzZXNzaW9uLCBxdWV1ZSk7CiAgICAgc3RkOjpzdHJpbmcgcHJvdmlkZXJUeXBlOwogICAgIG1WZW5kb3JUYWdJZCA9IG1hbmFnZXItPmdldFByb3ZpZGVyVGFnSWRMb2NrZWQobUlkLnN0cmluZygpKTsKKyAgICBtVGFnTW9uaXRvci5pbml0aWFsaXplKG1WZW5kb3JUYWdJZCk7CisgICAgaWYgKCFtb25pdG9yVGFncy5pc0VtcHR5KCkpIHsKKyAgICAgICAgbVRhZ01vbml0b3IucGFyc2VUYWdzVG9Nb25pdG9yKFN0cmluZzgobW9uaXRvclRhZ3MpKTsKKyAgICB9CiAKICAgICByZXR1cm4gaW5pdGlhbGl6ZUNvbW1vbkxvY2tlZCgpOwogfQpAQCAtMTkwLDEwICsxOTcsMTQgQEAKICAgICAvKiogQ3JlYXRlIGJ1ZmZlciBtYW5hZ2VyICovCiAgICAgbUJ1ZmZlck1hbmFnZXIgPSBuZXcgQ2FtZXJhM0J1ZmZlck1hbmFnZXIoKTsKIAotICAgIG1UYWdNb25pdG9yLmluaXRpYWxpemUobVZlbmRvclRhZ0lkKTsKLQorICAgIFZlY3RvcjxpbnQzMl90PiBzZXNzaW9uUGFyYW1LZXlzOworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IHNlc3Npb25LZXlzRW50cnkgPSBtRGV2aWNlSW5mby5maW5kKAorICAgICAgICAgICAgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9TRVNTSU9OX0tFWVMpOworICAgIGlmIChzZXNzaW9uS2V5c0VudHJ5LmNvdW50ID4gMCkgeworICAgICAgICBzZXNzaW9uUGFyYW1LZXlzLmluc2VydEFycmF5QXQoc2Vzc2lvbktleXNFbnRyeS5kYXRhLmkzMiwgMCwgc2Vzc2lvbktleXNFbnRyeS5jb3VudCk7CisgICAgfQogICAgIC8qKiBTdGFydCB1cCByZXF1ZXN0IHF1ZXVlIHRocmVhZCAqLwotICAgIG1SZXF1ZXN0VGhyZWFkID0gbmV3IFJlcXVlc3RUaHJlYWQodGhpcywgbVN0YXR1c1RyYWNrZXIsIG1JbnRlcmZhY2UpOworICAgIG1SZXF1ZXN0VGhyZWFkID0gbmV3IFJlcXVlc3RUaHJlYWQodGhpcywgbVN0YXR1c1RyYWNrZXIsIG1JbnRlcmZhY2UsIHNlc3Npb25QYXJhbUtleXMpOwogICAgIHJlcyA9IG1SZXF1ZXN0VGhyZWFkLT5ydW4oU3RyaW5nODo6Zm9ybWF0KCJDM0Rldi0lcy1SZXFRdWV1ZSIsIG1JZC5zdHJpbmcoKSkuc3RyaW5nKCkpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgU0VUX0VSUl9MKCJVbmFibGUgdG8gc3RhcnQgcmVxdWVzdCBxdWV1ZSB0aHJlYWQ6ICVzICglZCkiLApAQCAtMjM4LDYgKzI0OSwxNCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgaWYgKERpc3RvcnRpb25NYXBwZXI6OmlzRGlzdG9ydGlvblN1cHBvcnRlZChtRGV2aWNlSW5mbykpIHsKKyAgICAgICAgcmVzID0gbURpc3RvcnRpb25NYXBwZXIuc2V0dXBTdGF0aWNJbmZvKG1EZXZpY2VJbmZvKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgU0VUX0VSUl9MKCJVbmFibGUgdG8gcmVhZCBuZWNlc3NhcnkgY2FsaWJyYXRpb24gZmllbGRzIGZvciBkaXN0b3J0aW9uIGNvcnJlY3Rpb24iKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTU3NCwxMyArNTkzLDEyIEBACiAgICAgYm9vbCBkdW1wVGVtcGxhdGVzID0gZmFsc2U7CiAKICAgICBTdHJpbmcxNiB0ZW1wbGF0ZXNPcHRpb24oIi10Iik7Ci0gICAgU3RyaW5nMTYgbW9uaXRvck9wdGlvbigiLW0iKTsKICAgICBpbnQgbiA9IGFyZ3Muc2l6ZSgpOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgIGlmIChhcmdzW2ldID09IHRlbXBsYXRlc09wdGlvbikgewogICAgICAgICAgICAgZHVtcFRlbXBsYXRlcyA9IHRydWU7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGFyZ3NbaV0gPT0gbW9uaXRvck9wdGlvbikgeworICAgICAgICBpZiAoYXJnc1tpXSA9PSBUYWdNb25pdG9yOjprTW9uaXRvck9wdGlvbikgewogICAgICAgICAgICAgaWYgKGkgKyAxIDwgbikgewogICAgICAgICAgICAgICAgIFN0cmluZzggbW9uaXRvclRhZ3MgPSBTdHJpbmc4KGFyZ3NbaSArIDFdKTsKICAgICAgICAgICAgICAgICBpZiAobW9uaXRvclRhZ3MgPT0gIm9mZiIpIHsKQEAgLTY2MSwxMyArNjc5LDEzIEBACiAgICAgfQogCiAgICAgaWYgKGR1bXBUZW1wbGF0ZXMpIHsKLSAgICAgICAgY29uc3QgY2hhciAqdGVtcGxhdGVOYW1lc1tdID0geworICAgICAgICBjb25zdCBjaGFyICp0ZW1wbGF0ZU5hbWVzW0NBTUVSQTNfVEVNUExBVEVfQ09VTlRdID0gewogICAgICAgICAgICAgIlRFTVBMQVRFX1BSRVZJRVciLAogICAgICAgICAgICAgIlRFTVBMQVRFX1NUSUxMX0NBUFRVUkUiLAogICAgICAgICAgICAgIlRFTVBMQVRFX1ZJREVPX1JFQ09SRCIsCiAgICAgICAgICAgICAiVEVNUExBVEVfVklERU9fU05BUFNIT1QiLAogICAgICAgICAgICAgIlRFTVBMQVRFX1pFUk9fU0hVVFRFUl9MQUciLAotICAgICAgICAgICAgIlRFTVBMQVRFX01BTlVBTCIKKyAgICAgICAgICAgICJURU1QTEFURV9NQU5VQUwiLAogICAgICAgICB9OwogCiAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgQ0FNRVJBM19URU1QTEFURV9DT1VOVDsgaSsrKSB7CkBAIC03MzMsNyArNzUxLDcgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Y29udmVydE1ldGFkYXRhTGlzdFRvUmVxdWVzdExpc3RMb2NrZWQoCi0gICAgICAgIGNvbnN0IExpc3Q8Y29uc3QgQ2FtZXJhTWV0YWRhdGE+ICZtZXRhZGF0YUxpc3QsCisgICAgICAgIGNvbnN0IExpc3Q8Y29uc3QgUGh5c2ljYWxDYW1lcmFTZXR0aW5nc0xpc3Q+ICZtZXRhZGF0YUxpc3QsCiAgICAgICAgIGNvbnN0IHN0ZDo6bGlzdDxjb25zdCBTdXJmYWNlTWFwPiAmc3VyZmFjZU1hcHMsCiAgICAgICAgIGJvb2wgcmVwZWF0aW5nLAogICAgICAgICBSZXF1ZXN0TGlzdCAqcmVxdWVzdExpc3QpIHsKQEAgLTc0Myw3ICs3NjEsNyBAQAogICAgIH0KIAogICAgIGludDMyX3QgYnVyc3RJZCA9IDA7Ci0gICAgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT46OmNvbnN0X2l0ZXJhdG9yIG1ldGFkYXRhSXQgPSBtZXRhZGF0YUxpc3QuYmVnaW4oKTsKKyAgICBMaXN0PGNvbnN0IFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NMaXN0Pjo6Y29uc3RfaXRlcmF0b3IgbWV0YWRhdGFJdCA9IG1ldGFkYXRhTGlzdC5iZWdpbigpOwogICAgIHN0ZDo6bGlzdDxjb25zdCBTdXJmYWNlTWFwPjo6Y29uc3RfaXRlcmF0b3Igc3VyZmFjZU1hcEl0ID0gc3VyZmFjZU1hcHMuYmVnaW4oKTsKICAgICBmb3IgKDsgbWV0YWRhdGFJdCAhPSBtZXRhZGF0YUxpc3QuZW5kKCkgJiYgc3VyZmFjZU1hcEl0ICE9IHN1cmZhY2VNYXBzLmVuZCgpOwogICAgICAgICAgICAgKyttZXRhZGF0YUl0LCArK3N1cmZhY2VNYXBJdCkgewpAQCAtNzU3LDEyICs3NzUsMTMgQEAKIAogICAgICAgICAvLyBTZXR1cCBidXJzdCBJZCBhbmQgcmVxdWVzdCBJZAogICAgICAgICBuZXdSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLmJ1cnN0SWQgPSBidXJzdElkKys7Ci0gICAgICAgIGlmIChtZXRhZGF0YUl0LT5leGlzdHMoQU5EUk9JRF9SRVFVRVNUX0lEKSkgewotICAgICAgICAgICAgaWYgKG1ldGFkYXRhSXQtPmZpbmQoQU5EUk9JRF9SRVFVRVNUX0lEKS5jb3VudCA9PSAwKSB7CisgICAgICAgIGlmIChtZXRhZGF0YUl0LT5iZWdpbigpLT5tZXRhZGF0YS5leGlzdHMoQU5EUk9JRF9SRVFVRVNUX0lEKSkgeworICAgICAgICAgICAgaWYgKG1ldGFkYXRhSXQtPmJlZ2luKCktPm1ldGFkYXRhLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0lEKS5jb3VudCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgQ0xPR0UoIlJlcXVlc3RJRCBlbnRyeSBleGlzdHM7IGJ1dCBtdXN0IG5vdCBiZSBlbXB0eSBpbiBtZXRhZGF0YSIpOwogICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBuZXdSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLnJlcXVlc3RJZCA9IG1ldGFkYXRhSXQtPmZpbmQoQU5EUk9JRF9SRVFVRVNUX0lEKS5kYXRhLmkzMlswXTsKKyAgICAgICAgICAgIG5ld1JlcXVlc3QtPm1SZXN1bHRFeHRyYXMucmVxdWVzdElkID0gbWV0YWRhdGFJdC0+YmVnaW4oKS0+bWV0YWRhdGEuZmluZCgKKyAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9SRVFVRVNUX0lEKS5kYXRhLmkzMlswXTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIENMT0dFKCJSZXF1ZXN0SUQgZG9lcyBub3QgZXhpc3QgaW4gbWV0YWRhdGEiKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CkBAIC03OTQsMTcgKzgxMywxOSBAQAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Y2FwdHVyZShDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCwgaW50NjRfdCogLypsYXN0RnJhbWVOdW1iZXIqLykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAKLSAgICBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiByZXF1ZXN0czsKKyAgICBMaXN0PGNvbnN0IFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NMaXN0PiByZXF1ZXN0c0xpc3Q7CiAgICAgc3RkOjpsaXN0PGNvbnN0IFN1cmZhY2VNYXA+IHN1cmZhY2VNYXBzOwotICAgIGNvbnZlcnRUb1JlcXVlc3RMaXN0KHJlcXVlc3RzLCBzdXJmYWNlTWFwcywgcmVxdWVzdCk7CisgICAgY29udmVydFRvUmVxdWVzdExpc3QocmVxdWVzdHNMaXN0LCBzdXJmYWNlTWFwcywgcmVxdWVzdCk7CiAKLSAgICByZXR1cm4gY2FwdHVyZUxpc3QocmVxdWVzdHMsIHN1cmZhY2VNYXBzLCAvKmxhc3RGcmFtZU51bWJlciovTlVMTCk7CisgICAgcmV0dXJuIGNhcHR1cmVMaXN0KHJlcXVlc3RzTGlzdCwgc3VyZmFjZU1hcHMsIC8qbGFzdEZyYW1lTnVtYmVyKi9OVUxMKTsKIH0KIAotdm9pZCBDYW1lcmEzRGV2aWNlOjpjb252ZXJ0VG9SZXF1ZXN0TGlzdChMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiYgcmVxdWVzdHMsCit2b2lkIENhbWVyYTNEZXZpY2U6OmNvbnZlcnRUb1JlcXVlc3RMaXN0KExpc3Q8Y29uc3QgUGh5c2ljYWxDYW1lcmFTZXR0aW5nc0xpc3Q+JiByZXF1ZXN0c0xpc3QsCiAgICAgICAgIHN0ZDo6bGlzdDxjb25zdCBTdXJmYWNlTWFwPiYgc3VyZmFjZU1hcHMsCiAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiByZXF1ZXN0KSB7Ci0gICAgcmVxdWVzdHMucHVzaF9iYWNrKHJlcXVlc3QpOworICAgIFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NMaXN0IHJlcXVlc3RMaXN0OworICAgIHJlcXVlc3RMaXN0LnB1c2hfYmFjayh7c3RkOjpzdHJpbmcoZ2V0SWQoKS5zdHJpbmcoKSksIHJlcXVlc3R9KTsKKyAgICByZXF1ZXN0c0xpc3QucHVzaF9iYWNrKHJlcXVlc3RMaXN0KTsKIAogICAgIFN1cmZhY2VNYXAgc3VyZmFjZU1hcDsKICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgc3RyZWFtcyA9IHJlcXVlc3QuZmluZChBTkRST0lEX1JFUVVFU1RfT1VUUFVUX1NUUkVBTVMpOwpAQCAtODE3LDcgKzgzOCw3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OnN1Ym1pdFJlcXVlc3RzSGVscGVyKAotICAgICAgICBjb25zdCBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiAmcmVxdWVzdHMsCisgICAgICAgIGNvbnN0IExpc3Q8Y29uc3QgUGh5c2ljYWxDYW1lcmFTZXR0aW5nc0xpc3Q+ICZyZXF1ZXN0cywKICAgICAgICAgY29uc3Qgc3RkOjpsaXN0PGNvbnN0IFN1cmZhY2VNYXA+ICZzdXJmYWNlTWFwcywKICAgICAgICAgYm9vbCByZXBlYXRpbmcsCiAgICAgICAgIC8qb3V0Ki8KQEAgLTg2MywxMSArODg0LDkgQEAKICAgICByZXR1cm4gcmVzOwogfQogCi0vLyBPbmx5IG9uZSBwcm9jZXNzQ2FwdHVyZVJlc3VsdCBzaG91bGQgYmUgY2FsbGVkIGF0IGEgdGltZSwgc28KLS8vIHRoZSBsb2NrcyB3b24ndCBibG9jay4gVGhlIGxvY2tzIGFyZSBwcmVzZW50IGhlcmUgc2ltcGx5IHRvIGVuZm9yY2UgdGhpcy4KLWhhcmR3YXJlOjpSZXR1cm48dm9pZD4gQ2FtZXJhM0RldmljZTo6cHJvY2Vzc0NhcHR1cmVSZXN1bHQoCitoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IENhbWVyYTNEZXZpY2U6OnByb2Nlc3NDYXB0dXJlUmVzdWx0XzNfNCgKICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAotICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FwdHVyZVJlc3VsdD4mIHJlc3VsdHMpIHsKKyAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OkNhcHR1cmVSZXN1bHQ+JiByZXN1bHRzKSB7CiAgICAgLy8gSWRlYWxseSB3ZSBzaG91bGQgZ3JhYiBtTG9jaywgYnV0IHRoYXQgY2FuIGxlYWQgdG8gZGVhZGxvY2ssIGFuZAogICAgIC8vIGl0J3Mgbm90IHN1cGVyIGltcG9ydGFudCB0byBnZXQgdXAgdG8gZGF0ZSB2YWx1ZSBvZiBtU3RhdHVzIGZvciB0aGlzCiAgICAgLy8gd2FybmluZyBwcmludCwgaGVuY2Ugc2tpcHBpbmcgdGhlIGxvY2sgaGVyZQpAQCAtODkxLDQ1ICs5MTAsMTIxIEBACiAgICAgICAgIH0KICAgICB9CiAgICAgZm9yIChjb25zdCBhdXRvJiByZXN1bHQgOiByZXN1bHRzKSB7Ci0gICAgICAgIHByb2Nlc3NPbmVDYXB0dXJlUmVzdWx0TG9ja2VkKHJlc3VsdCk7CisgICAgICAgIHByb2Nlc3NPbmVDYXB0dXJlUmVzdWx0TG9ja2VkKHJlc3VsdC52M18yLCByZXN1bHQucGh5c2ljYWxDYW1lcmFNZXRhZGF0YSk7CiAgICAgfQogICAgIG1Qcm9jZXNzQ2FwdHVyZVJlc3VsdExvY2sudW5sb2NrKCk7CiAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CiB9CiAKKy8vIE9ubHkgb25lIHByb2Nlc3NDYXB0dXJlUmVzdWx0IHNob3VsZCBiZSBjYWxsZWQgYXQgYSB0aW1lLCBzbworLy8gdGhlIGxvY2tzIHdvbid0IGJsb2NrLiBUaGUgbG9ja3MgYXJlIHByZXNlbnQgaGVyZSBzaW1wbHkgdG8gZW5mb3JjZSB0aGlzLgoraGFyZHdhcmU6OlJldHVybjx2b2lkPiBDYW1lcmEzRGV2aWNlOjpwcm9jZXNzQ2FwdHVyZVJlc3VsdCgKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAorICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FwdHVyZVJlc3VsdD4mIHJlc3VsdHMpIHsKKyAgICBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpQaHlzaWNhbENhbWVyYU1ldGFkYXRhPiBub1BoeXNNZXRhZGF0YTsKKworICAgIC8vIElkZWFsbHkgd2Ugc2hvdWxkIGdyYWIgbUxvY2ssIGJ1dCB0aGF0IGNhbiBsZWFkIHRvIGRlYWRsb2NrLCBhbmQKKyAgICAvLyBpdCdzIG5vdCBzdXBlciBpbXBvcnRhbnQgdG8gZ2V0IHVwIHRvIGRhdGUgdmFsdWUgb2YgbVN0YXR1cyBmb3IgdGhpcworICAgIC8vIHdhcm5pbmcgcHJpbnQsIGhlbmNlIHNraXBwaW5nIHRoZSBsb2NrIGhlcmUKKyAgICBpZiAobVN0YXR1cyA9PSBTVEFUVVNfRVJST1IpIHsKKyAgICAgICAgLy8gUGVyIEFQSSBjb250cmFjdCwgSEFMIHNob3VsZCBhY3QgYXMgY2xvc2VkIGFmdGVyIGRldmljZSBlcnJvcgorICAgICAgICAvLyBCdXQgbVN0YXR1cyBjYW4gYmUgc2V0IHRvIGVycm9yIGJ5IGZyYW1ld29yayBhcyB3ZWxsLCBzbyBqdXN0IGxvZworICAgICAgICAvLyBhIHdhcm5pbmcgaGVyZS4KKyAgICAgICAgQUxPR1coIiVzOiByZWNlaXZlZCBjYXB0dXJlIHJlc3VsdCBpbiBlcnJvciBzdGF0ZS4iLCBfX0ZVTkNUSU9OX18pOworICAgIH0KKworICAgIGlmIChtUHJvY2Vzc0NhcHR1cmVSZXN1bHRMb2NrLnRyeUxvY2soKSAhPSBPSykgeworICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW47IGl0IGluZGljYXRlcyBhIHdyb25nIGNsaWVudCBpbXBsZW1lbnRhdGlvbgorICAgICAgICAvLyB0aGF0IGRvZXNuJ3QgZm9sbG93IHRoZSBjb250cmFjdC4gQnV0LCB3ZSBjYW4gYmUgdG9sZXJhbnQgaGVyZS4KKyAgICAgICAgQUxPR0UoIiVzOiBjYWxsYmFjayBvdmVybGFwcGVkISB3YWl0aW5nIDFzLi4uIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICBpZiAobVByb2Nlc3NDYXB0dXJlUmVzdWx0TG9jay50aW1lZExvY2soMTAwMDAwMDAwMCAvKiAxcyAqLykgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogY2Fubm90IGFjcXVpcmUgbG9jayBpbiAxcywgZHJvcHBpbmcgcmVzdWx0cyIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAvLyByZWFsbHkgZG9uJ3Qga25vdyB3aGF0IHRvIGRvLCBzbyBiYWlsIG91dC4KKyAgICAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgICAgICB9CisgICAgfQorICAgIGZvciAoY29uc3QgYXV0byYgcmVzdWx0IDogcmVzdWx0cykgeworICAgICAgICBwcm9jZXNzT25lQ2FwdHVyZVJlc3VsdExvY2tlZChyZXN1bHQsIG5vUGh5c01ldGFkYXRhKTsKKyAgICB9CisgICAgbVByb2Nlc3NDYXB0dXJlUmVzdWx0TG9jay51bmxvY2soKTsKKyAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKK30KKworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6cmVhZE9uZUNhbWVyYU1ldGFkYXRhTG9ja2VkKAorICAgICAgICB1aW50NjRfdCBmbXFSZXN1bHRTaXplLCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkNhbWVyYU1ldGFkYXRhJiByZXN1bHRNZXRhZGF0YSwKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpDYW1lcmFNZXRhZGF0YSYgcmVzdWx0KSB7CisgICAgaWYgKGZtcVJlc3VsdFNpemUgPiAwKSB7CisgICAgICAgIHJlc3VsdE1ldGFkYXRhLnJlc2l6ZShmbXFSZXN1bHRTaXplKTsKKyAgICAgICAgaWYgKG1SZXN1bHRNZXRhZGF0YVF1ZXVlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7IC8vIGxvZ2dlZCBpbiBpbml0aWFsaXplKCkKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1SZXN1bHRNZXRhZGF0YVF1ZXVlLT5yZWFkKHJlc3VsdE1ldGFkYXRhLmRhdGEoKSwgZm1xUmVzdWx0U2l6ZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IHJlYWQgY2FtZXJhIG1ldGFkYXRhIGZyb20gZm1xLCBzaXplID0gJSIgUFJJdTY0LAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGZtcVJlc3VsdFNpemUpOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0TWV0YWRhdGEuc2V0VG9FeHRlcm5hbChjb25zdF9jYXN0PHVpbnQ4X3QgKj4ocmVzdWx0LmRhdGEoKSksCisgICAgICAgICAgICAgICAgcmVzdWx0LnNpemUoKSk7CisgICAgfQorCisgICAgaWYgKHJlc3VsdE1ldGFkYXRhLnNpemUoKSAhPSAwKSB7CisgICAgICAgIHN0YXR1c190IHJlczsKKyAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QqIG1ldGFkYXRhID0KKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90Kj4ocmVzdWx0TWV0YWRhdGEuZGF0YSgpKTsKKyAgICAgICAgc2l6ZV90IGV4cGVjdGVkX21ldGFkYXRhX3NpemUgPSByZXN1bHRNZXRhZGF0YS5zaXplKCk7CisgICAgICAgIGlmICgocmVzID0gdmFsaWRhdGVfY2FtZXJhX21ldGFkYXRhX3N0cnVjdHVyZShtZXRhZGF0YSwgJmV4cGVjdGVkX21ldGFkYXRhX3NpemUpKSAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGNhbWVyYSBtZXRhZGF0YSByZWNlaXZlZCBieSBjYW1lcmEgc2VydmljZSBmcm9tIEhBTDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKIHZvaWQgQ2FtZXJhM0RldmljZTo6cHJvY2Vzc09uZUNhcHR1cmVSZXN1bHRMb2NrZWQoCi0gICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FwdHVyZVJlc3VsdCYgcmVzdWx0KSB7CisgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FwdHVyZVJlc3VsdCYgcmVzdWx0LAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8CisgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpQaHlzaWNhbENhbWVyYU1ldGFkYXRhPiBwaHlzaWNhbENhbWVyYU1ldGFkYXRhcykgewogICAgIGNhbWVyYTNfY2FwdHVyZV9yZXN1bHQgcjsKICAgICBzdGF0dXNfdCByZXM7CiAgICAgci5mcmFtZV9udW1iZXIgPSByZXN1bHQuZnJhbWVOdW1iZXI7CiAKKyAgICAvLyBSZWFkIGFuZCB2YWxpZGF0ZSB0aGUgcmVzdWx0IG1ldGFkYXRhLgogICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FtZXJhTWV0YWRhdGEgcmVzdWx0TWV0YWRhdGE7Ci0gICAgaWYgKHJlc3VsdC5mbXFSZXN1bHRTaXplID4gMCkgewotICAgICAgICByZXN1bHRNZXRhZGF0YS5yZXNpemUocmVzdWx0LmZtcVJlc3VsdFNpemUpOwotICAgICAgICBpZiAobVJlc3VsdE1ldGFkYXRhUXVldWUgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgcmV0dXJuOyAvLyBsb2dnZWQgaW4gaW5pdGlhbGl6ZSgpCi0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtUmVzdWx0TWV0YWRhdGFRdWV1ZS0+cmVhZChyZXN1bHRNZXRhZGF0YS5kYXRhKCksIHJlc3VsdC5mbXFSZXN1bHRTaXplKSkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBGcmFtZSAlZDogQ2Fubm90IHJlYWQgY2FtZXJhIG1ldGFkYXRhIGZyb20gZm1xLCBzaXplID0gJSIgUFJJdTY0LAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlc3VsdC5mcmFtZU51bWJlciwgcmVzdWx0LmZtcVJlc3VsdFNpemUpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmVzdWx0TWV0YWRhdGEuc2V0VG9FeHRlcm5hbChjb25zdF9jYXN0PHVpbnQ4X3QgKj4ocmVzdWx0LnJlc3VsdC5kYXRhKCkpLAotICAgICAgICAgICAgICAgIHJlc3VsdC5yZXN1bHQuc2l6ZSgpKTsKKyAgICByZXMgPSByZWFkT25lQ2FtZXJhTWV0YWRhdGFMb2NrZWQocmVzdWx0LmZtcVJlc3VsdFNpemUsIHJlc3VsdE1ldGFkYXRhLCByZXN1bHQucmVzdWx0KTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEZhaWxlZCB0byByZWFkIGNhcHR1cmUgcmVzdWx0IG1ldGFkYXRhIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlc3VsdC5mcmFtZU51bWJlcik7CisgICAgICAgIHJldHVybjsKICAgICB9CisgICAgci5yZXN1bHQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90Kj4ocmVzdWx0TWV0YWRhdGEuZGF0YSgpKTsKIAotICAgIGlmIChyZXN1bHRNZXRhZGF0YS5zaXplKCkgIT0gMCkgewotICAgICAgICByLnJlc3VsdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2FtZXJhX21ldGFkYXRhX3QqPihyZXN1bHRNZXRhZGF0YS5kYXRhKCkpOwotICAgICAgICBzaXplX3QgZXhwZWN0ZWRfbWV0YWRhdGFfc2l6ZSA9IHJlc3VsdE1ldGFkYXRhLnNpemUoKTsKLSAgICAgICAgaWYgKChyZXMgPSB2YWxpZGF0ZV9jYW1lcmFfbWV0YWRhdGFfc3RydWN0dXJlKHIucmVzdWx0LCAmZXhwZWN0ZWRfbWV0YWRhdGFfc2l6ZSkpICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IEZyYW1lICVkOiBJbnZhbGlkIGNhbWVyYSBtZXRhZGF0YSByZWNlaXZlZCBieSBjYW1lcmEgc2VydmljZSBmcm9tIEhBTDogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVzdWx0LmZyYW1lTnVtYmVyLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAvLyBSZWFkIGFuZCB2YWxpZGF0ZSBwaHlzaWNhbCBjYW1lcmEgbWV0YWRhdGEKKyAgICBzaXplX3QgcGh5c1Jlc3VsdENvdW50ID0gcGh5c2ljYWxDYW1lcmFNZXRhZGF0YXMuc2l6ZSgpOworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIqPiBwaHlzQ2FtSWRzKHBoeXNSZXN1bHRDb3VudCk7CisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKj4gcGh5Q2FtTWV0YWRhdGFzKHBoeXNSZXN1bHRDb3VudCk7CisgICAgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpDYW1lcmFNZXRhZGF0YT4gcGh5c1Jlc3VsdE1ldGFkYXRhOworICAgIHBoeXNSZXN1bHRNZXRhZGF0YS5yZXNpemUocGh5c1Jlc3VsdENvdW50KTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBoeXNpY2FsQ2FtZXJhTWV0YWRhdGFzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHJlcyA9IHJlYWRPbmVDYW1lcmFNZXRhZGF0YUxvY2tlZChwaHlzaWNhbENhbWVyYU1ldGFkYXRhc1tpXS5mbXFNZXRhZGF0YVNpemUsCisgICAgICAgICAgICAgICAgcGh5c1Jlc3VsdE1ldGFkYXRhW2ldLCBwaHlzaWNhbENhbWVyYU1ldGFkYXRhc1tpXS5tZXRhZGF0YSk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEZhaWxlZCB0byByZWFkIGNhcHR1cmUgcmVzdWx0IG1ldGFkYXRhIGZvciBjYW1lcmEgJXMiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlc3VsdC5mcmFtZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFNZXRhZGF0YXNbaV0ucGh5c2ljYWxDYW1lcmFJZC5jX3N0cigpKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHIucmVzdWx0ID0gbnVsbHB0cjsKKyAgICAgICAgcGh5c0NhbUlkc1tpXSA9IHBoeXNpY2FsQ2FtZXJhTWV0YWRhdGFzW2ldLnBoeXNpY2FsQ2FtZXJhSWQuY19zdHIoKTsKKyAgICAgICAgcGh5Q2FtTWV0YWRhdGFzW2ldID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCo+KAorICAgICAgICAgICAgICAgIHBoeXNSZXN1bHRNZXRhZGF0YVtpXS5kYXRhKCkpOwogICAgIH0KKyAgICByLm51bV9waHlzY2FtX21ldGFkYXRhID0gcGh5c1Jlc3VsdENvdW50OworICAgIHIucGh5c2NhbV9pZHMgPSBwaHlzQ2FtSWRzLmRhdGEoKTsKKyAgICByLnBoeXNjYW1fbWV0YWRhdGEgPSBwaHlDYW1NZXRhZGF0YXMuZGF0YSgpOwogCiAgICAgc3RkOjp2ZWN0b3I8Y2FtZXJhM19zdHJlYW1fYnVmZmVyX3Q+IG91dHB1dEJ1ZmZlcnMocmVzdWx0Lm91dHB1dEJ1ZmZlcnMuc2l6ZSgpKTsKICAgICBzdGQ6OnZlY3RvcjxidWZmZXJfaGFuZGxlX3Q+IG91dHB1dEJ1ZmZlckhhbmRsZXMocmVzdWx0Lm91dHB1dEJ1ZmZlcnMuc2l6ZSgpKTsKQEAgLTEwNjcsNDIgKzExNjIsNDMgQEAKICAgICBub3RpZnkoJm0pOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjYXB0dXJlTGlzdChjb25zdCBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiAmcmVxdWVzdHMsCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjYXB0dXJlTGlzdChjb25zdCBMaXN0PGNvbnN0IFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NMaXN0PiAmcmVxdWVzdHNMaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpsaXN0PGNvbnN0IFN1cmZhY2VNYXA+ICZzdXJmYWNlTWFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlcikgewogICAgIEFUUkFDRV9DQUxMKCk7CiAKLSAgICByZXR1cm4gc3VibWl0UmVxdWVzdHNIZWxwZXIocmVxdWVzdHMsIHN1cmZhY2VNYXBzLCAvKnJlcGVhdGluZyovZmFsc2UsIGxhc3RGcmFtZU51bWJlcik7CisgICAgcmV0dXJuIHN1Ym1pdFJlcXVlc3RzSGVscGVyKHJlcXVlc3RzTGlzdCwgc3VyZmFjZU1hcHMsIC8qcmVwZWF0aW5nKi9mYWxzZSwgbGFzdEZyYW1lTnVtYmVyKTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6c2V0U3RyZWFtaW5nUmVxdWVzdChjb25zdCBDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogLypsYXN0RnJhbWVOdW1iZXIqLykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAKLSAgICBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiByZXF1ZXN0czsKKyAgICBMaXN0PGNvbnN0IFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NMaXN0PiByZXF1ZXN0c0xpc3Q7CiAgICAgc3RkOjpsaXN0PGNvbnN0IFN1cmZhY2VNYXA+IHN1cmZhY2VNYXBzOwotICAgIGNvbnZlcnRUb1JlcXVlc3RMaXN0KHJlcXVlc3RzLCBzdXJmYWNlTWFwcywgcmVxdWVzdCk7CisgICAgY29udmVydFRvUmVxdWVzdExpc3QocmVxdWVzdHNMaXN0LCBzdXJmYWNlTWFwcywgcmVxdWVzdCk7CiAKLSAgICByZXR1cm4gc2V0U3RyZWFtaW5nUmVxdWVzdExpc3QocmVxdWVzdHMsIC8qc3VyZmFjZU1hcCovc3VyZmFjZU1hcHMsCisgICAgcmV0dXJuIHNldFN0cmVhbWluZ1JlcXVlc3RMaXN0KHJlcXVlc3RzTGlzdCwgLypzdXJmYWNlTWFwKi9zdXJmYWNlTWFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypsYXN0RnJhbWVOdW1iZXIqL05VTEwpOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpzZXRTdHJlYW1pbmdSZXF1ZXN0TGlzdChjb25zdCBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiAmcmVxdWVzdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Omxpc3Q8Y29uc3QgU3VyZmFjZU1hcD4gJnN1cmZhY2VNYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyKSB7CitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpzZXRTdHJlYW1pbmdSZXF1ZXN0TGlzdCgKKyAgICAgICAgY29uc3QgTGlzdDxjb25zdCBQaHlzaWNhbENhbWVyYVNldHRpbmdzTGlzdD4gJnJlcXVlc3RzTGlzdCwKKyAgICAgICAgY29uc3Qgc3RkOjpsaXN0PGNvbnN0IFN1cmZhY2VNYXA+ICZzdXJmYWNlTWFwcywgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKIAotICAgIHJldHVybiBzdWJtaXRSZXF1ZXN0c0hlbHBlcihyZXF1ZXN0cywgc3VyZmFjZU1hcHMsIC8qcmVwZWF0aW5nKi90cnVlLCBsYXN0RnJhbWVOdW1iZXIpOworICAgIHJldHVybiBzdWJtaXRSZXF1ZXN0c0hlbHBlcihyZXF1ZXN0c0xpc3QsIHN1cmZhY2VNYXBzLCAvKnJlcGVhdGluZyovdHJ1ZSwgbGFzdEZyYW1lTnVtYmVyKTsKIH0KIAogc3A8Q2FtZXJhM0RldmljZTo6Q2FwdHVyZVJlcXVlc3Q+IENhbWVyYTNEZXZpY2U6OnNldFVwUmVxdWVzdExvY2tlZCgKLSAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QsIGNvbnN0IFN1cmZhY2VNYXAgJnN1cmZhY2VNYXApIHsKKyAgICAgICAgY29uc3QgUGh5c2ljYWxDYW1lcmFTZXR0aW5nc0xpc3QgJnJlcXVlc3QsIGNvbnN0IFN1cmZhY2VNYXAgJnN1cmZhY2VNYXApIHsKICAgICBzdGF0dXNfdCByZXM7CiAKICAgICBpZiAobVN0YXR1cyA9PSBTVEFUVVNfVU5DT05GSUdVUkVEIHx8IG1OZWVkQ29uZmlnKSB7CiAgICAgICAgIC8vIFRoaXMgcG9pbnQgc2hvdWxkIG9ubHkgYmUgcmVhY2hlZCB2aWEgQVBJMSAoQVBJMiBtdXN0IGV4cGxpY2l0bHkgY2FsbCBjb25maWd1cmVTdHJlYW1zKQogICAgICAgICAvLyBzbyB1bmlsYXRlcmFsbHkgc2VsZWN0IG5vcm1hbCBvcGVyYXRpbmcgbW9kZS4KLSAgICAgICAgcmVzID0gY29uZmlndXJlU3RyZWFtc0xvY2tlZChDQU1FUkEzX1NUUkVBTV9DT05GSUdVUkFUSU9OX05PUk1BTF9NT0RFKTsKKyAgICAgICAgcmVzID0gZmlsdGVyUGFyYW1zQW5kQ29uZmlndXJlTG9ja2VkKHJlcXVlc3QuYmVnaW4oKS0+bWV0YWRhdGEsCisgICAgICAgICAgICAgICAgQ0FNRVJBM19TVFJFQU1fQ09ORklHVVJBVElPTl9OT1JNQUxfTU9ERSk7CiAgICAgICAgIC8vIFN0cmVhbSBjb25maWd1cmF0aW9uIGZhaWxlZC4gQ2xpZW50IG1pZ2h0IHRyeSBvdGhlciBjb25maWd1cmFpdG9ucy4KICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQ0xPR0UoIkNhbid0IHNldCB1cCBzdHJlYW1zOiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CkBAIC0xMjA1LDggKzEzMDEsOCBAQAogICAgIC8vIENvbnRpbnVlIGNhcHR1cmVzIGlmIGFjdGl2ZSBhdCBzdGFydAogICAgIGlmICh3YXNBY3RpdmUpIHsKICAgICAgICAgQUxPR1YoIiVzOiBSZXN0YXJ0aW5nIGFjdGl2aXR5IHRvIHJlY29uZmlndXJlIHN0cmVhbXMiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICAvLyBSZXVzZSBjdXJyZW50IG9wZXJhdGluZyBtb2RlIGZvciBuZXcgc3RyZWFtIGNvbmZpZwotICAgICAgICByZXMgPSBjb25maWd1cmVTdHJlYW1zTG9ja2VkKG1PcGVyYXRpbmdNb2RlKTsKKyAgICAgICAgLy8gUmV1c2UgY3VycmVudCBvcGVyYXRpbmcgbW9kZSBhbmQgc2Vzc2lvbiBwYXJhbWV0ZXJzIGZvciBuZXcgc3RyZWFtIGNvbmZpZworICAgICAgICByZXMgPSBjb25maWd1cmVTdHJlYW1zTG9ja2VkKG1PcGVyYXRpbmdNb2RlLCBtU2Vzc2lvblBhcmFtcyk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FuJ3QgcmVjb25maWd1cmUgZGV2aWNlIGZvciBuZXcgc3RyZWFtICVkOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtTmV4dFN0cmVhbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKQEAgLTEyMjIsNyArMTMxOCw4IEBACiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjcmVhdGVTdHJlYW0oc3A8U3VyZmFjZT4gY29uc3VtZXIsCiAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAogICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBpbnQgKmlkLAotICAgICAgICAgICAgaW50IHN0cmVhbVNldElkLCBib29sIGlzU2hhcmVkLCB1aW50NjRfdCBjb25zdW1lclVzYWdlKSB7CisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAqc3VyZmFjZUlkcywgaW50IHN0cmVhbVNldElkLCBib29sIGlzU2hhcmVkLCB1aW50NjRfdCBjb25zdW1lclVzYWdlKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKIAogICAgIGlmIChjb25zdW1lciA9PSBudWxscHRyKSB7CkBAIC0xMjM0LDIwICsxMzMxLDI0IEBACiAgICAgY29uc3VtZXJzLnB1c2hfYmFjayhjb25zdW1lcik7CiAKICAgICByZXR1cm4gY3JlYXRlU3RyZWFtKGNvbnN1bWVycywgLypoYXNEZWZlcnJlZENvbnN1bWVyKi8gZmFsc2UsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICBmb3JtYXQsIGRhdGFTcGFjZSwgcm90YXRpb24sIGlkLCBzdHJlYW1TZXRJZCwgaXNTaGFyZWQsIGNvbnN1bWVyVXNhZ2UpOworICAgICAgICAgICAgZm9ybWF0LCBkYXRhU3BhY2UsIHJvdGF0aW9uLCBpZCwgcGh5c2ljYWxDYW1lcmFJZCwgc3VyZmFjZUlkcywgc3RyZWFtU2V0SWQsCisgICAgICAgICAgICBpc1NoYXJlZCwgY29uc3VtZXJVc2FnZSk7CiB9CiAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OmNyZWF0ZVN0cmVhbShjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4mIGNvbnN1bWVycywKICAgICAgICAgYm9vbCBoYXNEZWZlcnJlZENvbnN1bWVyLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAogICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQsCi0gICAgICAgIGludCBzdHJlYW1TZXRJZCwgYm9vbCBpc1NoYXJlZCwgdWludDY0X3QgY29uc3VtZXJVc2FnZSkgeworICAgICAgICBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+ICpzdXJmYWNlSWRzLCBpbnQgc3RyZWFtU2V0SWQsIGJvb2wgaXNTaGFyZWQsIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOworCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKICAgICBuc2Vjc190IG1heEV4cGVjdGVkRHVyYXRpb24gPSBnZXRFeHBlY3RlZEluRmxpZ2h0RHVyYXRpb24oKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAgICAgQUxPR1YoIkNhbWVyYSAlczogQ3JlYXRpbmcgbmV3IHN0cmVhbSAlZDogJWQgeCAlZCwgZm9ybWF0ICVkLCBkYXRhc3BhY2UgJWQgcm90YXRpb24gJWQiCi0gICAgICAgICAgICAiIGNvbnN1bWVyIHVzYWdlICUiIFBSSXU2NCAiLCBpc1NoYXJlZCAlZCIsIG1JZC5zdHJpbmcoKSwgbU5leHRTdHJlYW1JZCwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LAotICAgICAgICAgICAgZGF0YVNwYWNlLCByb3RhdGlvbiwgY29uc3VtZXJVc2FnZSwgaXNTaGFyZWQpOworICAgICAgICAgICAgIiBjb25zdW1lciB1c2FnZSAlIiBQUkl1NjQgIiwgaXNTaGFyZWQgJWQsIHBoeXNpY2FsQ2FtZXJhSWQgJXMiLCBtSWQuc3RyaW5nKCksCisgICAgICAgICAgICBtTmV4dFN0cmVhbUlkLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIGRhdGFTcGFjZSwgcm90YXRpb24sIGNvbnN1bWVyVXNhZ2UsIGlzU2hhcmVkLAorICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZC5zdHJpbmcoKSk7CiAKICAgICBzdGF0dXNfdCByZXM7CiAgICAgYm9vbCB3YXNBY3RpdmUgPSBmYWxzZTsKQEAgLTEzMDcsNyArMTQwOCw3IEBACiAgICAgICAgIH0KICAgICAgICAgbmV3U3RyZWFtID0gbmV3IENhbWVyYTNPdXRwdXRTdHJlYW0obU5leHRTdHJlYW1JZCwgY29uc3VtZXJzWzBdLAogICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGJsb2JCdWZmZXJTaXplLCBmb3JtYXQsIGRhdGFTcGFjZSwgcm90YXRpb24sCi0gICAgICAgICAgICAgICAgbVRpbWVzdGFtcE9mZnNldCwgc3RyZWFtU2V0SWQpOworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBPZmZzZXQsIHBoeXNpY2FsQ2FtZXJhSWQsIHN0cmVhbVNldElkKTsKICAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX1JBV19PUEFRVUUpIHsKICAgICAgICAgc3NpemVfdCByYXdPcGFxdWVCdWZmZXJTaXplID0gZ2V0UmF3T3BhcXVlQnVmZmVyU2l6ZSh3aWR0aCwgaGVpZ2h0KTsKICAgICAgICAgaWYgKHJhd09wYXF1ZUJ1ZmZlclNpemUgPD0gMCkgewpAQCAtMTMxNiwyMCArMTQxNywzMyBAQAogICAgICAgICB9CiAgICAgICAgIG5ld1N0cmVhbSA9IG5ldyBDYW1lcmEzT3V0cHV0U3RyZWFtKG1OZXh0U3RyZWFtSWQsIGNvbnN1bWVyc1swXSwKICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCByYXdPcGFxdWVCdWZmZXJTaXplLCBmb3JtYXQsIGRhdGFTcGFjZSwgcm90YXRpb24sCi0gICAgICAgICAgICAgICAgbVRpbWVzdGFtcE9mZnNldCwgc3RyZWFtU2V0SWQpOworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBPZmZzZXQsIHBoeXNpY2FsQ2FtZXJhSWQsIHN0cmVhbVNldElkKTsKICAgICB9IGVsc2UgaWYgKGlzU2hhcmVkKSB7CiAgICAgICAgIG5ld1N0cmVhbSA9IG5ldyBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtKG1OZXh0U3RyZWFtSWQsIGNvbnN1bWVycywKICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIGNvbnN1bWVyVXNhZ2UsIGRhdGFTcGFjZSwgcm90YXRpb24sCi0gICAgICAgICAgICAgICAgbVRpbWVzdGFtcE9mZnNldCwgc3RyZWFtU2V0SWQpOworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBPZmZzZXQsIHBoeXNpY2FsQ2FtZXJhSWQsIHN0cmVhbVNldElkKTsKICAgICB9IGVsc2UgaWYgKGNvbnN1bWVycy5zaXplKCkgPT0gMCAmJiBoYXNEZWZlcnJlZENvbnN1bWVyKSB7CiAgICAgICAgIG5ld1N0cmVhbSA9IG5ldyBDYW1lcmEzT3V0cHV0U3RyZWFtKG1OZXh0U3RyZWFtSWQsCiAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBjb25zdW1lclVzYWdlLCBkYXRhU3BhY2UsIHJvdGF0aW9uLAotICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBPZmZzZXQsIHN0cmVhbVNldElkKTsKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wT2Zmc2V0LCBwaHlzaWNhbENhbWVyYUlkLCBzdHJlYW1TZXRJZCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbmV3U3RyZWFtID0gbmV3IENhbWVyYTNPdXRwdXRTdHJlYW0obU5leHRTdHJlYW1JZCwgY29uc3VtZXJzWzBdLAogICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgZGF0YVNwYWNlLCByb3RhdGlvbiwKLSAgICAgICAgICAgICAgICBtVGltZXN0YW1wT2Zmc2V0LCBzdHJlYW1TZXRJZCk7CisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcE9mZnNldCwgcGh5c2ljYWxDYW1lcmFJZCwgc3RyZWFtU2V0SWQpOwogICAgIH0KKworICAgIHNpemVfdCBjb25zdW1lckNvdW50ID0gY29uc3VtZXJzLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbnN1bWVyQ291bnQ7IGkrKykgeworICAgICAgICBpbnQgaWQgPSBuZXdTdHJlYW0tPmdldFN1cmZhY2VJZChjb25zdW1lcnNbaV0pOworICAgICAgICBpZiAoaWQgPCAwKSB7CisgICAgICAgICAgICBTRVRfRVJSX0woIkludmFsaWQgc3VyZmFjZSBpZCIpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3VyZmFjZUlkcyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBzdXJmYWNlSWRzLT5wdXNoX2JhY2soaWQpOworICAgICAgICB9CisgICAgfQorCiAgICAgbmV3U3RyZWFtLT5zZXRTdGF0dXNUcmFja2VyKG1TdGF0dXNUcmFja2VyKTsKIAogICAgIG5ld1N0cmVhbS0+c2V0QnVmZmVyTWFuYWdlcihtQnVmZmVyTWFuYWdlcik7CkBAIC0xMzQ2LDggKzE0NjAsOCBAQAogICAgIC8vIENvbnRpbnVlIGNhcHR1cmVzIGlmIGFjdGl2ZSBhdCBzdGFydAogICAgIGlmICh3YXNBY3RpdmUpIHsKICAgICAgICAgQUxPR1YoIiVzOiBSZXN0YXJ0aW5nIGFjdGl2aXR5IHRvIHJlY29uZmlndXJlIHN0cmVhbXMiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICAvLyBSZXVzZSBjdXJyZW50IG9wZXJhdGluZyBtb2RlIGZvciBuZXcgc3RyZWFtIGNvbmZpZwotICAgICAgICByZXMgPSBjb25maWd1cmVTdHJlYW1zTG9ja2VkKG1PcGVyYXRpbmdNb2RlKTsKKyAgICAgICAgLy8gUmV1c2UgY3VycmVudCBvcGVyYXRpbmcgbW9kZSBhbmQgc2Vzc2lvbiBwYXJhbWV0ZXJzIGZvciBuZXcgc3RyZWFtIGNvbmZpZworICAgICAgICByZXMgPSBjb25maWd1cmVTdHJlYW1zTG9ja2VkKG1PcGVyYXRpbmdNb2RlLCBtU2Vzc2lvblBhcmFtcyk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIENMT0dFKCJDYW4ndCByZWNvbmZpZ3VyZSBkZXZpY2UgZm9yIG5ldyBzdHJlYW0gJWQ6ICVzICglZCkiLAogICAgICAgICAgICAgICAgICAgICBtTmV4dFN0cmVhbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKQEAgLTE0NDUsNyArMTU1OSw3IEBACiAgICAgLy8gQ2FtZXJhRGV2aWNlIHNlbWFudGljcyByZXF1aXJlIGRldmljZSB0byBhbHJlYWR5IGJlIGlkbGUgYmVmb3JlCiAgICAgLy8gZGVsZXRlU3RyZWFtIGlzIGNhbGxlZCwgdW5saWtlIGZvciBjcmVhdGVTdHJlYW0uCiAgICAgaWYgKG1TdGF0dXMgPT0gU1RBVFVTX0FDVElWRSkgewotICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlczogRGV2aWNlIG5vdCBpZGxlIiwgX19GVU5DVElPTl9fLCBtSWQuc3RyaW5nKCkpOworICAgICAgICBBTE9HVygiJXM6IENhbWVyYSAlczogRGV2aWNlIG5vdCBpZGxlIiwgX19GVU5DVElPTl9fLCBtSWQuc3RyaW5nKCkpOwogICAgICAgICByZXR1cm4gLUVCVVNZOwogICAgIH0KIApAQCAtMTQ4NSwxNCArMTU5OSw1MCBAQAogICAgIHJldHVybiByZXM7CiB9CiAKLXN0YXR1c190IENhbWVyYTNEZXZpY2U6OmNvbmZpZ3VyZVN0cmVhbXMoaW50IG9wZXJhdGluZ01vZGUpIHsKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OmNvbmZpZ3VyZVN0cmVhbXMoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHNlc3Npb25QYXJhbXMsIGludCBvcGVyYXRpbmdNb2RlKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBBTE9HVigiJXM6IEUiLCBfX0ZVTkNUSU9OX18pOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAKLSAgICByZXR1cm4gY29uZmlndXJlU3RyZWFtc0xvY2tlZChvcGVyYXRpbmdNb2RlKTsKKyAgICAvLyBJbiBjYXNlIHRoZSBjbGllbnQgZG9lc24ndCBpbmNsdWRlIGFueSBzZXNzaW9uIHBhcmFtZXRlciwgdHJ5IGEKKyAgICAvLyBzcGVjdWxhdGl2ZSBjb25maWd1cmF0aW9uIHVzaW5nIHRoZSB2YWx1ZXMgZnJvbSB0aGUgbGFzdCBjYWNoZWQKKyAgICAvLyBkZWZhdWx0IHJlcXVlc3QuCisgICAgaWYgKHNlc3Npb25QYXJhbXMuaXNFbXB0eSgpICYmCisgICAgICAgICAgICAoKG1MYXN0VGVtcGxhdGVJZCA+IDApICYmIChtTGFzdFRlbXBsYXRlSWQgPCBDQU1FUkEzX1RFTVBMQVRFX0NPVU5UKSkgJiYKKyAgICAgICAgICAgICghbVJlcXVlc3RUZW1wbGF0ZUNhY2hlW21MYXN0VGVtcGxhdGVJZF0uaXNFbXB0eSgpKSkgeworICAgICAgICBBTE9HVigiJXM6IFNwZWN1bGF0aXZlIHNlc3Npb24gcGFyYW0gY29uZmlndXJhdGlvbiB3aXRoIHRlbXBsYXRlIGlkOiAlZCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgIG1MYXN0VGVtcGxhdGVJZCk7CisgICAgICAgIHJldHVybiBmaWx0ZXJQYXJhbXNBbmRDb25maWd1cmVMb2NrZWQobVJlcXVlc3RUZW1wbGF0ZUNhY2hlW21MYXN0VGVtcGxhdGVJZF0sCisgICAgICAgICAgICAgICAgb3BlcmF0aW5nTW9kZSk7CisgICAgfQorCisgICAgcmV0dXJuIGZpbHRlclBhcmFtc0FuZENvbmZpZ3VyZUxvY2tlZChzZXNzaW9uUGFyYW1zLCBvcGVyYXRpbmdNb2RlKTsKK30KKworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6ZmlsdGVyUGFyYW1zQW5kQ29uZmlndXJlTG9ja2VkKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzZXNzaW9uUGFyYW1zLAorICAgICAgICBpbnQgb3BlcmF0aW5nTW9kZSkgeworICAgIC8vRmlsdGVyIG91dCBhbnkgaW5jb21pbmcgc2Vzc2lvbiBwYXJhbWV0ZXJzCisgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEgcGFyYW1zKHNlc3Npb25QYXJhbXMpOworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGF2YWlsYWJsZVNlc3Npb25LZXlzID0gbURldmljZUluZm8uZmluZCgKKyAgICAgICAgICAgIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfU0VTU0lPTl9LRVlTKTsKKyAgICBDYW1lcmFNZXRhZGF0YSBmaWx0ZXJlZFBhcmFtcyhhdmFpbGFibGVTZXNzaW9uS2V5cy5jb3VudCk7CisgICAgY2FtZXJhX21ldGFkYXRhX3QgKm1ldGEgPSBjb25zdF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90ICo+KAorICAgICAgICAgICAgZmlsdGVyZWRQYXJhbXMuZ2V0QW5kTG9jaygpKTsKKyAgICBzZXRfY2FtZXJhX21ldGFkYXRhX3ZlbmRvcl9pZChtZXRhLCBtVmVuZG9yVGFnSWQpOworICAgIGZpbHRlcmVkUGFyYW1zLnVubG9jayhtZXRhKTsKKyAgICBpZiAoYXZhaWxhYmxlU2Vzc2lvbktleXMuY291bnQgPiAwKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXZhaWxhYmxlU2Vzc2lvbktleXMuY291bnQ7IGkrKykgeworICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGVudHJ5ID0gcGFyYW1zLmZpbmQoCisgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZVNlc3Npb25LZXlzLmRhdGEuaTMyW2ldKTsKKyAgICAgICAgICAgIGlmIChlbnRyeS5jb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICBmaWx0ZXJlZFBhcmFtcy51cGRhdGUoZW50cnkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQob3BlcmF0aW5nTW9kZSwgZmlsdGVyZWRQYXJhbXMpOwogfQogCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpnZXRJbnB1dEJ1ZmZlclByb2R1Y2VyKApAQCAtMTU0NCw2ICsxNjk0LDcgQEAKIAogICAgICAgICBpZiAoIW1SZXF1ZXN0VGVtcGxhdGVDYWNoZVt0ZW1wbGF0ZUlkXS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICpyZXF1ZXN0ID0gbVJlcXVlc3RUZW1wbGF0ZUNhY2hlW3RlbXBsYXRlSWRdOworICAgICAgICAgICAgbUxhc3RUZW1wbGF0ZUlkID0gdGVtcGxhdGVJZDsKICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQogICAgIH0KQEAgLTE1NjgsNiArMTcxOSw3IEBACiAgICAgICAgIG1SZXF1ZXN0VGVtcGxhdGVDYWNoZVt0ZW1wbGF0ZUlkXS5hY3F1aXJlKHJhd1JlcXVlc3QpOwogCiAgICAgICAgICpyZXF1ZXN0ID0gbVJlcXVlc3RUZW1wbGF0ZUNhY2hlW3RlbXBsYXRlSWRdOworICAgICAgICBtTGFzdFRlbXBsYXRlSWQgPSB0ZW1wbGF0ZUlkOwogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CkBAIC0xNjE0LDEwICsxNzY2LDE2IEBACiAgICAgbVN0YXR1c0NoYW5nZWQuYnJvYWRjYXN0KCk7CiB9CiAKK3ZvaWQgQ2FtZXJhM0RldmljZTo6cGF1c2VTdGF0ZU5vdGlmeShib29sIGVuYWJsZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworCisgICAgbVBhdXNlU3RhdGVOb3RpZnkgPSBlbmFibGU7Cit9CisKIC8vIFBhdXNlIHRvIHJlY29uZmlndXJlCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjppbnRlcm5hbFBhdXNlQW5kV2FpdExvY2tlZChuc2Vjc190IG1heEV4cGVjdGVkRHVyYXRpb24pIHsKICAgICBtUmVxdWVzdFRocmVhZC0+c2V0UGF1c2VkKHRydWUpOwotICAgIG1QYXVzZVN0YXRlTm90aWZ5ID0gdHJ1ZTsKIAogICAgIEFMT0dWKCIlczogQ2FtZXJhICVzOiBJbnRlcm5hbCB3YWl0IHVudGlsIGlkbGUgKCUgIiBQUklpNjQgIiBucykiLCBfX0ZVTkNUSU9OX18sIG1JZC5zdHJpbmcoKSwKICAgICAgICAgICBtYXhFeHBlY3RlZER1cmF0aW9uKTsKQEAgLTE2MzYsNiArMTc5NCw4IEBACiAKICAgICBtUmVxdWVzdFRocmVhZC0+c2V0UGF1c2VkKGZhbHNlKTsKIAorICAgIEFMT0dWKCIlczogQ2FtZXJhICVzOiBJbnRlcm5hbCB3YWl0IHVudGlsIGFjdGl2ZSAoJSAiIFBSSWk2NCAiIG5zKSIsIF9fRlVOQ1RJT05fXywgbUlkLnN0cmluZygpLAorICAgICAgICAgICAga0FjdGl2ZVRpbWVvdXQpOwogICAgIHJlcyA9IHdhaXRVbnRpbFN0YXRlVGhlblJlbG9jaygvKmFjdGl2ZSovIHRydWUsIGtBY3RpdmVUaW1lb3V0KTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIFNFVF9FUlJfTCgiQ2FuJ3QgdHJhbnNpdGlvbiB0byBhY3RpdmUgaW4gJWYgc2Vjb25kcyEiLApAQCAtMTc0NCw2ICsxOTA0LDcgQEAKICAgICBDYXB0dXJlUmVzdWx0ICZyZXN1bHQgPSAqKG1SZXN1bHRRdWV1ZS5iZWdpbigpKTsKICAgICBmcmFtZS0+bVJlc3VsdEV4dHJhcyA9IHJlc3VsdC5tUmVzdWx0RXh0cmFzOwogICAgIGZyYW1lLT5tTWV0YWRhdGEuYWNxdWlyZShyZXN1bHQubU1ldGFkYXRhKTsKKyAgICBmcmFtZS0+bVBoeXNpY2FsTWV0YWRhdGFzID0gc3RkOjptb3ZlKHJlc3VsdC5tUGh5c2ljYWxNZXRhZGF0YXMpOwogICAgIG1SZXN1bHRRdWV1ZS5lcmFzZShtUmVzdWx0UXVldWUuYmVnaW4oKSk7CiAKICAgICByZXR1cm4gT0s7CkBAIC0xOTE2LDggKzIwNzcsOCBAQAogICAgICAgICBpZiAobVN0YXR1cyAhPSBTVEFUVVNfQUNUSVZFICYmIG1TdGF0dXMgIT0gU1RBVFVTX0NPTkZJR1VSRUQpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlczogTm93ICVzIiwgX19GVU5DVElPTl9fLCBtSWQuc3RyaW5nKCksCi0gICAgICAgICAgICAgICAgaWRsZSA/ICJpZGxlIiA6ICJhY3RpdmUiKTsKKyAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJXM6IE5vdyAlcywgcGF1c2VTdGF0ZTogJXMiLCBfX0ZVTkNUSU9OX18sIG1JZC5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICBpZGxlID8gImlkbGUiIDogImFjdGl2ZSIsIG1QYXVzZVN0YXRlTm90aWZ5ID8gInRydWUiIDogImZhbHNlIik7CiAgICAgICAgIGludGVybmFsVXBkYXRlU3RhdHVzTG9ja2VkKGlkbGUgPyBTVEFUVVNfQ09ORklHVVJFRCA6IFNUQVRVU19BQ1RJVkUpOwogCiAgICAgICAgIC8vIFNraXAgbm90aWZ5aW5nIGxpc3RlbmVyIGlmIHdlJ3JlIGRvaW5nIHNvbWUgdXNlci10cmFuc3BhcmVudApAQCAtMTkzNiwxMCArMjA5NywxNSBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpzZXRDb25zdW1lclN1cmZhY2VzKGludCBzdHJlYW1JZCwKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+JiBjb25zdW1lcnMpIHsKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+JiBjb25zdW1lcnMsIHN0ZDo6dmVjdG9yPGludD4gKnN1cmZhY2VJZHMpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlczogQ2FtZXJhICVzOiBzZXQgY29uc3VtZXIgc3VyZmFjZSBmb3Igc3RyZWFtICVkIiwKICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLnN0cmluZygpLCBzdHJlYW1JZCk7CisKKyAgICBpZiAoc3VyZmFjZUlkcyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAKQEAgLTE5NjAsNiArMjEyNiwxNSBAQAogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAorICAgIGZvciAoYXV0byAmY29uc3VtZXIgOiBjb25zdW1lcnMpIHsKKyAgICAgICAgaW50IGlkID0gc3RyZWFtLT5nZXRTdXJmYWNlSWQoY29uc3VtZXIpOworICAgICAgICBpZiAoaWQgPCAwKSB7CisgICAgICAgICAgICBDTE9HRSgiSW52YWxpZCBzdXJmYWNlIGlkISIpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBzdXJmYWNlSWRzLT5wdXNoX2JhY2soaWQpOworICAgIH0KKwogICAgIGlmIChzdHJlYW0tPmlzQ29uc3VtZXJDb25maWd1cmF0aW9uRGVmZXJyZWQoKSkgewogICAgICAgICBpZiAoIXN0cmVhbS0+aXNDb25maWd1cmluZygpKSB7CiAgICAgICAgICAgICBDTE9HRSgiU3RyZWFtICVkIHdhcyBhbHJlYWR5IGZ1bGx5IGNvbmZpZ3VyZWQuIiwgc3RyZWFtSWQpOwpAQCAtMTk3Nyw2ICsyMTUyLDQwIEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjp1cGRhdGVTdHJlYW0oaW50IHN0cmVhbUlkLCBjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4gJm5ld1N1cmZhY2VzLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxPdXRwdXRTdHJlYW1JbmZvPiAmb3V0cHV0SW5mbywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiAmcmVtb3ZlZFN1cmZhY2VJZHMsIEtleWVkVmVjdG9yPHNwPFN1cmZhY2U+LCBzaXplX3Q+ICpvdXRwdXRNYXApIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKworICAgIHNzaXplX3QgaWR4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShzdHJlYW1JZCk7CisgICAgaWYgKGlkeCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICBDTE9HRSgiU3RyZWFtICVkIGlzIHVua25vd24iLCBzdHJlYW1JZCk7CisgICAgICAgIHJldHVybiBpZHg7CisgICAgfQorCisgICAgZm9yIChjb25zdCBhdXRvICZpdCA6IHJlbW92ZWRTdXJmYWNlSWRzKSB7CisgICAgICAgIGlmIChtUmVxdWVzdFRocmVhZC0+aXNPdXRwdXRTdXJmYWNlUGVuZGluZyhzdHJlYW1JZCwgaXQpKSB7CisgICAgICAgICAgICBDTE9HRSgiU2hhcmVkIHN1cmZhY2Ugc3RpbGwgcGFydCBvZiBhIHBlbmRpbmcgcmVxdWVzdCEiKTsKKyAgICAgICAgICAgIHJldHVybiAtRUJVU1k7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtc1tpZHhdOworICAgIHN0YXR1c190IHJlcyA9IHN0cmVhbS0+dXBkYXRlU3RyZWFtKG5ld1N1cmZhY2VzLCBvdXRwdXRJbmZvLCByZW1vdmVkU3VyZmFjZUlkcywgb3V0cHV0TWFwKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIENMT0dFKCJTdHJlYW0gJWQgZmFpbGVkIHRvIHVwZGF0ZSBzdHJlYW0gKGVycm9yICVkICVzKSAiLAorICAgICAgICAgICAgICBzdHJlYW1JZCwgcmVzLCBzdHJlcnJvcigtcmVzKSk7CisgICAgICAgIGlmIChyZXMgPT0gVU5LTk9XTl9FUlJPUikgeworICAgICAgICAgICAgU0VUX0VSUl9MKCIlczogU3RyZWFtIHVwZGF0ZSBmYWlsZWQgdG8gcmV2ZXJ0IHRvIHByZXZpb3VzIG91dHB1dCBjb25maWd1cmF0aW9uISIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpkcm9wU3RyZWFtQnVmZmVycyhib29sIGRyb3BwaW5nLCBpbnQgc3RyZWFtSWQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKQEAgLTE5OTYsMTUgKzIyMDUsMTUgQEAKICAqLwogCiBzcDxDYW1lcmEzRGV2aWNlOjpDYXB0dXJlUmVxdWVzdD4gQ2FtZXJhM0RldmljZTo6Y3JlYXRlQ2FwdHVyZVJlcXVlc3QoCi0gICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0LCBjb25zdCBTdXJmYWNlTWFwICZzdXJmYWNlTWFwKSB7CisgICAgICAgIGNvbnN0IFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NMaXN0ICZyZXF1ZXN0LCBjb25zdCBTdXJmYWNlTWFwICZzdXJmYWNlTWFwKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBzdGF0dXNfdCByZXM7CiAKICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gbmV3UmVxdWVzdCA9IG5ldyBDYXB0dXJlUmVxdWVzdDsKLSAgICBuZXdSZXF1ZXN0LT5tU2V0dGluZ3MgPSByZXF1ZXN0OworICAgIG5ld1JlcXVlc3QtPm1TZXR0aW5nc0xpc3QgPSByZXF1ZXN0OwogCiAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgaW5wdXRTdHJlYW1zID0KLSAgICAgICAgICAgIG5ld1JlcXVlc3QtPm1TZXR0aW5ncy5maW5kKEFORFJPSURfUkVRVUVTVF9JTlBVVF9TVFJFQU1TKTsKKyAgICAgICAgICAgIG5ld1JlcXVlc3QtPm1TZXR0aW5nc0xpc3QuYmVnaW4oKS0+bWV0YWRhdGEuZmluZChBTkRST0lEX1JFUVVFU1RfSU5QVVRfU1RSRUFNUyk7CiAgICAgaWYgKGlucHV0U3RyZWFtcy5jb3VudCA+IDApIHsKICAgICAgICAgaWYgKG1JbnB1dFN0cmVhbSA9PSBOVUxMIHx8CiAgICAgICAgICAgICAgICAgbUlucHV0U3RyZWFtLT5nZXRJZCgpICE9IGlucHV0U3RyZWFtcy5kYXRhLmkzMlswXSkgewpAQCAtMjAzMCwxMSArMjIzOSwxMSBAQAogICAgICAgICB9CiAKICAgICAgICAgbmV3UmVxdWVzdC0+bUlucHV0U3RyZWFtID0gbUlucHV0U3RyZWFtOwotICAgICAgICBuZXdSZXF1ZXN0LT5tU2V0dGluZ3MuZXJhc2UoQU5EUk9JRF9SRVFVRVNUX0lOUFVUX1NUUkVBTVMpOworICAgICAgICBuZXdSZXF1ZXN0LT5tU2V0dGluZ3NMaXN0LmJlZ2luKCktPm1ldGFkYXRhLmVyYXNlKEFORFJPSURfUkVRVUVTVF9JTlBVVF9TVFJFQU1TKTsKICAgICB9CiAKICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBzdHJlYW1zID0KLSAgICAgICAgICAgIG5ld1JlcXVlc3QtPm1TZXR0aW5ncy5maW5kKEFORFJPSURfUkVRVUVTVF9PVVRQVVRfU1RSRUFNUyk7CisgICAgICAgICAgICBuZXdSZXF1ZXN0LT5tU2V0dGluZ3NMaXN0LmJlZ2luKCktPm1ldGFkYXRhLmZpbmQoQU5EUk9JRF9SRVFVRVNUX09VVFBVVF9TVFJFQU1TKTsKICAgICBpZiAoc3RyZWFtcy5jb3VudCA9PSAwKSB7CiAgICAgICAgIENMT0dFKCJaZXJvIG91dHB1dCBzdHJlYW1zIHNwZWNpZmllZCEiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0yMDgyLDcgKzIyOTEsNyBAQAogCiAgICAgICAgIG5ld1JlcXVlc3QtPm1PdXRwdXRTdHJlYW1zLnB1c2goc3RyZWFtKTsKICAgICB9Ci0gICAgbmV3UmVxdWVzdC0+bVNldHRpbmdzLmVyYXNlKEFORFJPSURfUkVRVUVTVF9PVVRQVVRfU1RSRUFNUyk7CisgICAgbmV3UmVxdWVzdC0+bVNldHRpbmdzTGlzdC5iZWdpbigpLT5tZXRhZGF0YS5lcmFzZShBTkRST0lEX1JFUVVFU1RfT1VUUFVUX1NUUkVBTVMpOwogICAgIG5ld1JlcXVlc3QtPm1CYXRjaFNpemUgPSAxOwogCiAgICAgcmV0dXJuIG5ld1JlcXVlc3Q7CkBAIC0yMTI0LDkgKzIzMzMsNDcgQEAKICAgICAvLyBwcm9wZXJseSBjbGVhbiB0aGluZ3MgdXAKICAgICBpbnRlcm5hbFVwZGF0ZVN0YXR1c0xvY2tlZChTVEFUVVNfVU5DT05GSUdVUkVEKTsKICAgICBtTmVlZENvbmZpZyA9IHRydWU7CisKKyAgICByZXMgPSBtUHJlcGFyZXJUaHJlYWQtPnJlc3VtZSgpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJXM6IFByZXBhcmVyIHRocmVhZCBmYWlsZWQgdG8gcmVzdW1lISIsIF9fRlVOQ1RJT05fXywgbUlkLnN0cmluZygpKTsKKyAgICB9CiB9CiAKLXN0YXR1c190IENhbWVyYTNEZXZpY2U6OmNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQoaW50IG9wZXJhdGluZ01vZGUpIHsKK2Jvb2wgQ2FtZXJhM0RldmljZTo6cmVjb25maWd1cmVDYW1lcmEoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHNlc3Npb25QYXJhbXMpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGJvb2wgcmV0ID0gZmFsc2U7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOworICAgIG5zZWNzX3QgbWF4RXhwZWN0ZWREdXJhdGlvbiA9IGdldEV4cGVjdGVkSW5GbGlnaHREdXJhdGlvbigpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIGF1dG8gcmMgPSBpbnRlcm5hbFBhdXNlQW5kV2FpdExvY2tlZChtYXhFeHBlY3RlZER1cmF0aW9uKTsKKyAgICBpZiAocmMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgbU5lZWRDb25maWcgPSB0cnVlOworICAgICAgICByYyA9IGNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQobU9wZXJhdGluZ01vZGUsIHNlc3Npb25QYXJhbXMsIC8qbm90aWZ5UmVxdWVzdFRocmVhZCovIGZhbHNlKTsKKyAgICAgICAgaWYgKHJjID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICAgICAgbVBhdXNlU3RhdGVOb3RpZnkgPSBmYWxzZTsKKyAgICAgICAgICAgIC8vTW92aW5nIHRvIGFjdGl2ZSBzdGF0ZSB3aGlsZSBob2xkaW5nICdtTG9jaycgaXMgaW1wb3J0YW50LgorICAgICAgICAgICAgLy9UaGVyZSBjb3VsZCBiZSBwZW5kaW5nIGNhbGxzIHRvICdjcmVhdGUtL2RlbGV0ZVN0cmVhbScgd2hpY2gKKyAgICAgICAgICAgIC8vd2lsbCB0cmlnZ2VyIGFub3RoZXIgc3RyZWFtIGNvbmZpZ3VyYXRpb24gd2hpbGUgdGhlIGFscmVhZHkKKyAgICAgICAgICAgIC8vcHJlc2VudCBzdHJlYW1zIGVuZCB1cCB3aXRoIG91dHN0YW5kaW5nIGJ1ZmZlcnMgdGhhdCB3aWxsCisgICAgICAgICAgICAvL25vdCBnZXQgZHJhaW5lZC4KKyAgICAgICAgICAgIGludGVybmFsVXBkYXRlU3RhdHVzTG9ja2VkKFNUQVRVU19BQ1RJVkUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2V0RXJyb3JTdGF0ZUxvY2tlZCgiJXM6IEZhaWxlZCB0byByZS1jb25maWd1cmUgY2FtZXJhOiAlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmMpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcGF1c2Ugc3RyZWFtaW5nOiAlZCIsIF9fRlVOQ1RJT05fXywgcmMpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OmNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQoaW50IG9wZXJhdGluZ01vZGUsCisgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzZXNzaW9uUGFyYW1zLCBib29sIG5vdGlmeVJlcXVlc3RUaHJlYWQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIHN0YXR1c190IHJlczsKIApAQCAtMjE2NywxMiArMjQxNCwxNiBAQAogICAgIC8vIFN0YXJ0IGNvbmZpZ3VyaW5nIHRoZSBzdHJlYW1zCiAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJXM6IFN0YXJ0aW5nIHN0cmVhbSBjb25maWd1cmF0aW9uIiwgX19GVU5DVElPTl9fLCBtSWQuc3RyaW5nKCkpOwogCisgICAgbVByZXBhcmVyVGhyZWFkLT5wYXVzZSgpOworCiAgICAgY2FtZXJhM19zdHJlYW1fY29uZmlndXJhdGlvbiBjb25maWc7CiAgICAgY29uZmlnLm9wZXJhdGlvbl9tb2RlID0gbU9wZXJhdGluZ01vZGU7CiAgICAgY29uZmlnLm51bV9zdHJlYW1zID0gKG1JbnB1dFN0cmVhbSAhPSBOVUxMKSArIG1PdXRwdXRTdHJlYW1zLnNpemUoKTsKIAogICAgIFZlY3RvcjxjYW1lcmEzX3N0cmVhbV90Kj4gc3RyZWFtczsKICAgICBzdHJlYW1zLnNldENhcGFjaXR5KGNvbmZpZy5udW1fc3RyZWFtcyk7CisgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IGJ1ZmZlclNpemVzKGNvbmZpZy5udW1fc3RyZWFtcywgMCk7CisKIAogICAgIGlmIChtSW5wdXRTdHJlYW0gIT0gTlVMTCkgewogICAgICAgICBjYW1lcmEzX3N0cmVhbV90ICppbnB1dFN0cmVhbTsKQEAgLTIyMDMsNiArMjQ1NCwxNCBAQAogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICB9CiAgICAgICAgIHN0cmVhbXMuYWRkKG91dHB1dFN0cmVhbSk7CisKKyAgICAgICAgaWYgKG91dHB1dFN0cmVhbS0+Zm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQiAmJgorICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS0+ZGF0YV9zcGFjZSA9PSBIQUxfREFUQVNQQUNFX1YwX0pGSUYpIHsKKyAgICAgICAgICAgIHNpemVfdCBrID0gaSArICgobUlucHV0U3RyZWFtICE9IG51bGxwdHIpID8gMSA6IDApOyAvLyBJbnB1dCBzdHJlYW0gaWYgcHJlc2VudCBzaG91bGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHdheXMgb2NjdXB5IHRoZSBpbml0aWFsIGVudHJ5LgorICAgICAgICAgICAgYnVmZmVyU2l6ZXNba10gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oCisgICAgICAgICAgICAgICAgICAgIGdldEpwZWdCdWZmZXJTaXplKG91dHB1dFN0cmVhbS0+d2lkdGgsIG91dHB1dFN0cmVhbS0+aGVpZ2h0KSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBjb25maWcuc3RyZWFtcyA9IHN0cmVhbXMuZWRpdEFycmF5KCk7CkBAIC0yMjEwLDcgKzI0NjksOSBAQAogICAgIC8vIERvIHRoZSBIQUwgY29uZmlndXJhdGlvbjsgd2lsbCBwb3RlbnRpYWxseSB0b3VjaCBzdHJlYW0KICAgICAvLyBtYXhfYnVmZmVycywgdXNhZ2UsIHByaXYgZmllbGRzLgogCi0gICAgcmVzID0gbUludGVyZmFjZS0+Y29uZmlndXJlU3RyZWFtcygmY29uZmlnKTsKKyAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqc2Vzc2lvbkJ1ZmZlciA9IHNlc3Npb25QYXJhbXMuZ2V0QW5kTG9jaygpOworICAgIHJlcyA9IG1JbnRlcmZhY2UtPmNvbmZpZ3VyZVN0cmVhbXMoc2Vzc2lvbkJ1ZmZlciwgJmNvbmZpZywgYnVmZmVyU2l6ZXMpOworICAgIHNlc3Npb25QYXJhbXMudW5sb2NrKHNlc3Npb25CdWZmZXIpOwogCiAgICAgaWYgKHJlcyA9PSBCQURfVkFMVUUpIHsKICAgICAgICAgLy8gSEFMIHJlamVjdGVkIHRoaXMgc2V0IG9mIHN0cmVhbXMgYXMgdW5zdXBwb3J0ZWQsIGNsZWFuIHVwIGNvbmZpZwpAQCAtMjI1Niw3ICsyNTE3LDkgQEAKIAogICAgIC8vIFJlcXVlc3QgdGhyZWFkIG5lZWRzIHRvIGtub3cgdG8gYXZvaWQgdXNpbmcgcmVwZWF0LWxhc3Qtc2V0dGluZ3MgcHJvdG9jb2wKICAgICAvLyBhY3Jvc3MgY29uZmlndXJlX3N0cmVhbXMoKSBjYWxscwotICAgIG1SZXF1ZXN0VGhyZWFkLT5jb25maWd1cmF0aW9uQ29tcGxldGUobUlzQ29uc3RyYWluZWRIaWdoU3BlZWRDb25maWd1cmF0aW9uKTsKKyAgICBpZiAobm90aWZ5UmVxdWVzdFRocmVhZCkgeworICAgICAgICBtUmVxdWVzdFRocmVhZC0+Y29uZmlndXJhdGlvbkNvbXBsZXRlKG1Jc0NvbnN0cmFpbmVkSGlnaFNwZWVkQ29uZmlndXJhdGlvbiwgc2Vzc2lvblBhcmFtcyk7CisgICAgfQogCiAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwogICAgIHByb3BlcnR5X2dldCgiY2FtZXJhLmZpZm8uZGlzYWJsZSIsIHZhbHVlLCAiMCIpOwpAQCAtMjI3NSw2ICsyNTM4LDE0IEBACiAgICAgfQogCiAgICAgLy8gVXBkYXRlIGRldmljZSBzdGF0ZQorICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpuZXdTZXNzaW9uUGFyYW1zID0gc2Vzc2lvblBhcmFtcy5nZXRBbmRMb2NrKCk7CisgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKmN1cnJlbnRTZXNzaW9uUGFyYW1zID0gbVNlc3Npb25QYXJhbXMuZ2V0QW5kTG9jaygpOworICAgIGJvb2wgdXBkYXRlU2Vzc2lvblBhcmFtcyA9IChuZXdTZXNzaW9uUGFyYW1zICE9IGN1cnJlbnRTZXNzaW9uUGFyYW1zKSA/IHRydWUgOiBmYWxzZTsKKyAgICBzZXNzaW9uUGFyYW1zLnVubG9jayhuZXdTZXNzaW9uUGFyYW1zKTsKKyAgICBtU2Vzc2lvblBhcmFtcy51bmxvY2soY3VycmVudFNlc3Npb25QYXJhbXMpOworICAgIGlmICh1cGRhdGVTZXNzaW9uUGFyYW1zKSAgeworICAgICAgICBtU2Vzc2lvblBhcmFtcyA9IHNlc3Npb25QYXJhbXM7CisgICAgfQogCiAgICAgbU5lZWRDb25maWcgPSBmYWxzZTsKIApAQCAtMjI4Niw2ICsyNTU3LDEyIEBACiAgICAgLy8gdGVhciBkb3duIHRoZSBkZWxldGVkIHN0cmVhbXMgYWZ0ZXIgY29uZmlndXJlIHN0cmVhbXMuCiAgICAgbURlbGV0ZWRTdHJlYW1zLmNsZWFyKCk7CiAKKyAgICBhdXRvIHJjID0gbVByZXBhcmVyVGhyZWFkLT5yZXN1bWUoKTsKKyAgICBpZiAocmMgIT0gT0spIHsKKyAgICAgICAgU0VUX0VSUl9MKCIlczogQ2FtZXJhICVzOiBQcmVwYXJlciB0aHJlYWQgZmFpbGVkIHRvIHJlc3VtZSEiLCBfX0ZVTkNUSU9OX18sIG1JZC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTI0MTEsMTMgKzI2ODgsMTQgQEAKIAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6cmVnaXN0ZXJJbkZsaWdodCh1aW50MzJfdCBmcmFtZU51bWJlciwKICAgICAgICAgaW50MzJfdCBudW1CdWZmZXJzLCBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdEV4dHJhcywgYm9vbCBoYXNJbnB1dCwKLSAgICAgICAgYm9vbCBoYXNBcHBDYWxsYmFjaywgbnNlY3NfdCBtYXhFeHBlY3RlZER1cmF0aW9uKSB7CisgICAgICAgIGJvb2wgaGFzQXBwQ2FsbGJhY2ssIG5zZWNzX3QgbWF4RXhwZWN0ZWREdXJhdGlvbiwKKyAgICAgICAgc3RkOjpzZXQ8U3RyaW5nOD4mIHBoeXNpY2FsQ2FtZXJhSWRzKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5GbGlnaHRMb2NrKTsKIAogICAgIHNzaXplX3QgcmVzOwogICAgIHJlcyA9IG1JbkZsaWdodE1hcC5hZGQoZnJhbWVOdW1iZXIsIEluRmxpZ2h0UmVxdWVzdChudW1CdWZmZXJzLCByZXN1bHRFeHRyYXMsIGhhc0lucHV0LAotICAgICAgICAgICAgaGFzQXBwQ2FsbGJhY2ssIG1heEV4cGVjdGVkRHVyYXRpb24pKTsKKyAgICAgICAgICAgIGhhc0FwcENhbGxiYWNrLCBtYXhFeHBlY3RlZER1cmF0aW9uLCBwaHlzaWNhbENhbWVyYUlkcykpOwogICAgIGlmIChyZXMgPCAwKSByZXR1cm4gcmVzOwogCiAgICAgaWYgKG1JbkZsaWdodE1hcC5zaXplKCkgPT0gMSkgewpAQCAtMjY1Nyw3ICsyOTM1LDggQEAKICAgICAgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcyAmcmVzdWx0RXh0cmFzLAogICAgICAgICBDYW1lcmFNZXRhZGF0YSAmY29sbGVjdGVkUGFydGlhbFJlc3VsdCwKICAgICAgICAgdWludDMyX3QgZnJhbWVOdW1iZXIsCi0gICAgICAgIGJvb2wgcmVwcm9jZXNzKSB7CisgICAgICAgIGJvb2wgcmVwcm9jZXNzLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiYgcGh5c2ljYWxNZXRhZGF0YXMpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIGlmIChwZW5kaW5nTWV0YWRhdGEuaXNFbXB0eSgpKQogICAgICAgICByZXR1cm47CkBAIC0yNjg2LDYgKzI5NjUsNyBAQAogICAgIENhcHR1cmVSZXN1bHQgY2FwdHVyZVJlc3VsdDsKICAgICBjYXB0dXJlUmVzdWx0Lm1SZXN1bHRFeHRyYXMgPSByZXN1bHRFeHRyYXM7CiAgICAgY2FwdHVyZVJlc3VsdC5tTWV0YWRhdGEgPSBwZW5kaW5nTWV0YWRhdGE7CisgICAgY2FwdHVyZVJlc3VsdC5tUGh5c2ljYWxNZXRhZGF0YXMgPSBwaHlzaWNhbE1ldGFkYXRhczsKIAogICAgIC8vIEFwcGVuZCBhbnkgcHJldmlvdXMgcGFydGlhbHMgdG8gZm9ybSBhIGNvbXBsZXRlIHJlc3VsdAogICAgIGlmIChtVXNlUGFydGlhbFJlc3VsdCAmJiAhY29sbGVjdGVkUGFydGlhbFJlc3VsdC5pc0VtcHR5KCkpIHsKQEAgLTI3MDEsNiArMjk4MSwyMyBAQAogICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KKyAgICBmb3IgKGF1dG8mIHBoeXNpY2FsTWV0YWRhdGEgOiBjYXB0dXJlUmVzdWx0Lm1QaHlzaWNhbE1ldGFkYXRhcykgeworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgdGltZXN0YW1wID0KKyAgICAgICAgICAgICAgICBwaHlzaWNhbE1ldGFkYXRhLm1QaHlzaWNhbENhbWVyYU1ldGFkYXRhLmZpbmQoQU5EUk9JRF9TRU5TT1JfVElNRVNUQU1QKTsKKyAgICAgICAgaWYgKHRpbWVzdGFtcC5jb3VudCA9PSAwKSB7CisgICAgICAgICAgICBTRVRfRVJSKCJObyB0aW1lc3RhbXAgcHJvdmlkZWQgYnkgSEFMIGZvciBwaHlzaWNhbCBjYW1lcmEgJXMgZnJhbWUgJWQhIiwKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChwaHlzaWNhbE1ldGFkYXRhLm1QaHlzaWNhbENhbWVyYUlkKS5jX3N0cigpLCBmcmFtZU51bWJlcik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBGaXggdXAgc29tZSByZXN1bHQgbWV0YWRhdGEgdG8gYWNjb3VudCBmb3IgSEFMLWxldmVsIGRpc3RvcnRpb24gY29ycmVjdGlvbgorICAgIHN0YXR1c190IHJlcyA9IG1EaXN0b3J0aW9uTWFwcGVyLmNvcnJlY3RDYXB0dXJlUmVzdWx0KCZjYXB0dXJlUmVzdWx0Lm1NZXRhZGF0YSk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBTRVRfRVJSKCJVbmFibGUgdG8gY29ycmVjdCBjYXB0dXJlIHJlc3VsdCBtZXRhZGF0YSBmb3IgZnJhbWUgJWQ6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyLCBzdHJlcnJvcihyZXMpLCByZXMpOworICAgICAgICByZXR1cm47CisgICAgfQogCiAgICAgbVRhZ01vbml0b3IubW9uaXRvck1ldGFkYXRhKFRhZ01vbml0b3I6OlJFU1VMVCwKICAgICAgICAgICAgIGZyYW1lTnVtYmVyLCB0aW1lc3RhbXAuZGF0YS5pNjRbMF0sIGNhcHR1cmVSZXN1bHQubU1ldGFkYXRhKTsKQEAgLTI3MzYsNyArMzAzMyw2IEBACiAKICAgICBib29sIGlzUGFydGlhbFJlc3VsdCA9IGZhbHNlOwogICAgIENhbWVyYU1ldGFkYXRhIGNvbGxlY3RlZFBhcnRpYWxSZXN1bHQ7Ci0gICAgQ2FwdHVyZVJlc3VsdEV4dHJhcyByZXN1bHRFeHRyYXM7CiAgICAgYm9vbCBoYXNJbnB1dEJ1ZmZlckluUmVxdWVzdCA9IGZhbHNlOwogCiAgICAgLy8gR2V0IHNodXR0ZXIgdGltZXN0YW1wIGFuZCByZXN1bHRFeHRyYXMgZnJvbSBsaXN0IG9mIGluLWZsaWdodCByZXF1ZXN0cywKQEAgLTI3NzcsNiArMzA3MywxMSBAQAogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlzUGFydGlhbFJlc3VsdCA9IChyZXN1bHQtPnBhcnRpYWxfcmVzdWx0IDwgbU51bVBhcnRpYWxSZXN1bHRzKTsKKyAgICAgICAgICAgIGlmIChpc1BhcnRpYWxSZXN1bHQgJiYgcmVzdWx0LT5udW1fcGh5c2NhbV9tZXRhZGF0YSkgeworICAgICAgICAgICAgICAgIFNFVF9FUlIoIlJlc3VsdCBpcyBtYWxmb3JtZWQgZm9yIGZyYW1lICVkOiBwYXJ0aWFsX3Jlc3VsdCBub3QgYWxsb3dlZCBmb3IiCisgICAgICAgICAgICAgICAgICAgICAgICAiIHBoeXNpY2FsIGNhbWVyYSByZXN1bHQiLCBmcmFtZU51bWJlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGlzUGFydGlhbFJlc3VsdCkgewogICAgICAgICAgICAgICAgIHJlcXVlc3QuY29sbGVjdGVkUGFydGlhbFJlc3VsdC5hcHBlbmQocmVzdWx0LT5yZXN1bHQpOwogICAgICAgICAgICAgfQpAQCAtMjc5MywxMSArMzA5NCwyOCBAQAogCiAgICAgICAgIC8vIERpZCB3ZSBnZXQgdGhlIChmaW5hbCkgcmVzdWx0IG1ldGFkYXRhIGZvciB0aGlzIGNhcHR1cmU/CiAgICAgICAgIGlmIChyZXN1bHQtPnJlc3VsdCAhPSBOVUxMICYmICFpc1BhcnRpYWxSZXN1bHQpIHsKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0LnBoeXNpY2FsQ2FtZXJhSWRzLnNpemUoKSAhPSByZXN1bHQtPm51bV9waHlzY2FtX21ldGFkYXRhKSB7CisgICAgICAgICAgICAgICAgU0VUX0VSUigiUmVxdWVzdGVkIHBoeXNpY2FsIENhbWVyYSBJZHMgJWQgbm90IGVxdWFsIHRvIG51bWJlciBvZiBtZXRhZGF0YSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnBoeXNpY2FsQ2FtZXJhSWRzLnNpemUoKSwgcmVzdWx0LT5udW1fcGh5c2NhbV9tZXRhZGF0YSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHJlcXVlc3QuaGF2ZVJlc3VsdE1ldGFkYXRhKSB7CiAgICAgICAgICAgICAgICAgU0VUX0VSUigiQ2FsbGVkIG11bHRpcGxlIHRpbWVzIHdpdGggbWV0YWRhdGEgZm9yIGZyYW1lICVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcmVzdWx0LT5udW1fcGh5c2NhbV9tZXRhZGF0YTsgaSsrKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nOCBwaHlzaWNhbElkKHJlc3VsdC0+cGh5c2NhbV9pZHNbaV0pOworICAgICAgICAgICAgICAgIHN0ZDo6c2V0PFN0cmluZzg+OjppdGVyYXRvciBjYW1lcmFJZEl0ZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5waHlzaWNhbENhbWVyYUlkcy5maW5kKHBoeXNpY2FsSWQpOworICAgICAgICAgICAgICAgIGlmIChjYW1lcmFJZEl0ZXIgIT0gcmVxdWVzdC5waHlzaWNhbENhbWVyYUlkcy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnBoeXNpY2FsQ2FtZXJhSWRzLmVyYXNlKGNhbWVyYUlkSXRlcik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgU0VUX0VSUigiVG90YWwgcmVzdWx0IGZvciBmcmFtZSAlZCBoYXMgYWxyZWFkeSByZXR1cm5lZCBmb3IgY2FtZXJhICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZU51bWJlciwgcGh5c2ljYWxJZC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChtVXNlUGFydGlhbFJlc3VsdCAmJgogICAgICAgICAgICAgICAgICAgICAhcmVxdWVzdC5jb2xsZWN0ZWRQYXJ0aWFsUmVzdWx0LmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIGNvbGxlY3RlZFBhcnRpYWxSZXN1bHQuYWNxdWlyZSgKQEAgLTI4NDIsMTUgKzMxNjAsMjEgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChyZXN1bHQtPnJlc3VsdCAhPSBOVUxMICYmICFpc1BhcnRpYWxSZXN1bHQpIHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCByZXN1bHQtPm51bV9waHlzY2FtX21ldGFkYXRhOyBpKyspIHsKKyAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSBwaHlzaWNhbE1ldGFkYXRhOworICAgICAgICAgICAgICAgIHBoeXNpY2FsTWV0YWRhdGEuYXBwZW5kKHJlc3VsdC0+cGh5c2NhbV9tZXRhZGF0YVtpXSk7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5waHlzaWNhbE1ldGFkYXRhcy5wdXNoX2JhY2soe1N0cmluZzE2KHJlc3VsdC0+cGh5c2NhbV9pZHNbaV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxNZXRhZGF0YX0pOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHNodXR0ZXJUaW1lc3RhbXAgPT0gMCkgewogICAgICAgICAgICAgICAgIHJlcXVlc3QucGVuZGluZ01ldGFkYXRhID0gcmVzdWx0LT5yZXN1bHQ7CiAgICAgICAgICAgICAgICAgcmVxdWVzdC5jb2xsZWN0ZWRQYXJ0aWFsUmVzdWx0ID0gY29sbGVjdGVkUGFydGlhbFJlc3VsdDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocmVxdWVzdC5oYXNDYWxsYmFjaykgeworICAgICAgICAgICB9IGVsc2UgaWYgKHJlcXVlc3QuaGFzQ2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YTsKICAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IHJlc3VsdC0+cmVzdWx0OwogICAgICAgICAgICAgICAgIHNlbmRDYXB0dXJlUmVzdWx0KG1ldGFkYXRhLCByZXF1ZXN0LnJlc3VsdEV4dHJhcywKICAgICAgICAgICAgICAgICAgICAgY29sbGVjdGVkUGFydGlhbFJlc3VsdCwgZnJhbWVOdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgIGhhc0lucHV0QnVmZmVySW5SZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgaGFzSW5wdXRCdWZmZXJJblJlcXVlc3QsIHJlcXVlc3QucGh5c2ljYWxNZXRhZGF0YXMpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTMwMzYsNyArMzM2MCw3IEBACiAgICAgICAgICAgICAgICAgLy8gc2VuZCBwZW5kaW5nIHJlc3VsdCBhbmQgYnVmZmVycwogICAgICAgICAgICAgICAgIHNlbmRDYXB0dXJlUmVzdWx0KHIucGVuZGluZ01ldGFkYXRhLCByLnJlc3VsdEV4dHJhcywKICAgICAgICAgICAgICAgICAgICAgci5jb2xsZWN0ZWRQYXJ0aWFsUmVzdWx0LCBtc2cuZnJhbWVfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICByLmhhc0lucHV0QnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgci5oYXNJbnB1dEJ1ZmZlciwgci5waHlzaWNhbE1ldGFkYXRhcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm5PdXRwdXRCdWZmZXJzKHIucGVuZGluZ091dHB1dEJ1ZmZlcnMuYXJyYXkoKSwKICAgICAgICAgICAgICAgICByLnBlbmRpbmdPdXRwdXRCdWZmZXJzLnNpemUoKSwgci5zaHV0dGVyVGltZXN0YW1wKTsKQEAgLTMwNTEsNyArMzM3NSw2IEBACiAgICAgfQogfQogCi0KIENhbWVyYU1ldGFkYXRhIENhbWVyYTNEZXZpY2U6OmdldExhdGVzdFJlcXVlc3RMb2NrZWQoKSB7CiAgICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKIApAQCAtMzA3OCw3ICszNDAxLDE4IEBACiAgICAgICAgICAgICBzcDxJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gJnNlc3Npb24sCiAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UmVxdWVzdE1ldGFkYXRhUXVldWU+IHF1ZXVlKSA6CiAgICAgICAgIG1IaWRsU2Vzc2lvbihzZXNzaW9uKSwKLSAgICAgICAgbVJlcXVlc3RNZXRhZGF0YVF1ZXVlKHF1ZXVlKSB7fQorICAgICAgICBtUmVxdWVzdE1ldGFkYXRhUXVldWUocXVldWUpIHsKKyAgICAvLyBDaGVjayB3aXRoIGhhcmR3YXJlIHNlcnZpY2UgbWFuYWdlciBpZiB3ZSBjYW4gZG93bmNhc3QgdGhlc2UgaW50ZXJmYWNlcworICAgIC8vIFNvbWV3aGF0IGV4cGVuc2l2ZSwgc28gY2FjaGUgdGhlIHJlc3VsdHMgYXQgc3RhcnR1cAorICAgIGF1dG8gY2FzdFJlc3VsdF8zXzQgPSBkZXZpY2U6OlYzXzQ6OklDYW1lcmFEZXZpY2VTZXNzaW9uOjpjYXN0RnJvbShtSGlkbFNlc3Npb24pOworICAgIGlmIChjYXN0UmVzdWx0XzNfNC5pc09rKCkpIHsKKyAgICAgICAgbUhpZGxTZXNzaW9uXzNfNCA9IGNhc3RSZXN1bHRfM180OworICAgIH0KKyAgICBhdXRvIGNhc3RSZXN1bHRfM18zID0gZGV2aWNlOjpWM18zOjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbjo6Y2FzdEZyb20obUhpZGxTZXNzaW9uKTsKKyAgICBpZiAoY2FzdFJlc3VsdF8zXzMuaXNPaygpKSB7CisgICAgICAgIG1IaWRsU2Vzc2lvbl8zXzMgPSBjYXN0UmVzdWx0XzNfMzsKKyAgICB9Cit9CiAKIENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6SGFsSW50ZXJmYWNlKCkge30KIApAQCAtMzA5MSw2ICszNDI1LDggQEAKIH0KIAogdm9pZCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OmNsZWFyKCkgeworICAgIG1IaWRsU2Vzc2lvbl8zXzQuY2xlYXIoKTsKKyAgICBtSGlkbFNlc3Npb25fM18zLmNsZWFyKCk7CiAgICAgbUhpZGxTZXNzaW9uLmNsZWFyKCk7CiB9CiAKQEAgLTMxMDYsNiArMzQ0MiwyOSBAQAogICAgIHN0YXR1c190IHJlcyA9IE9LOwogCiAgICAgY29tbW9uOjpWMV8wOjpTdGF0dXMgc3RhdHVzOworCisgICAgYXV0byByZXF1ZXN0Q2FsbGJhY2sgPSBbJnN0YXR1cywgJnJlcXVlc3RUZW1wbGF0ZV0KKyAgICAgICAgICAgIChjb21tb246OlYxXzA6OlN0YXR1cyBzLCBjb25zdCBkZXZpY2U6OlYzXzI6OkNhbWVyYU1ldGFkYXRhJiByZXF1ZXN0KSB7CisgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBjb21tb246OlYxXzA6OlN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGEgKnIgPQorICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCo+KHJlcXVlc3QuZGF0YSgpKTsKKyAgICAgICAgICAgICAgICBzaXplX3QgZXhwZWN0ZWRTaXplID0gcmVxdWVzdC5zaXplKCk7CisgICAgICAgICAgICAgICAgaW50IHJldCA9IHZhbGlkYXRlX2NhbWVyYV9tZXRhZGF0YV9zdHJ1Y3R1cmUociwgJmV4cGVjdGVkU2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA9PSBPSyB8fCByZXQgPT0gQ0FNRVJBX01FVEFEQVRBX1ZBTElEQVRJT05fU0hJRlRFRCkgeworICAgICAgICAgICAgICAgICAgICAqcmVxdWVzdFRlbXBsYXRlID0gY2xvbmVfY2FtZXJhX21ldGFkYXRhKHIpOworICAgICAgICAgICAgICAgICAgICBpZiAoKnJlcXVlc3RUZW1wbGF0ZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjbG9uZSBjYW1lcmEgbWV0YWRhdGEgcmVjZWl2ZWQgZnJvbSBIQUwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gY29tbW9uOjpWMV8wOjpTdGF0dXM6OklOVEVSTkFMX0VSUk9SOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBNYWxmb3JtZWQgY2FtZXJhIG1ldGFkYXRhIHJlY2VpdmVkIGZyb20gSEFMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gY29tbW9uOjpWMV8wOjpTdGF0dXM6OklOVEVSTkFMX0VSUk9SOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IGVycjsKICAgICBSZXF1ZXN0VGVtcGxhdGUgaWQ7CiAgICAgc3dpdGNoICh0ZW1wbGF0ZUlkKSB7CiAgICAgICAgIGNhc2UgQ0FNRVJBM19URU1QTEFURV9QUkVWSUVXOgpAQCAtMzEyNywzMSArMzQ4NiwxMSBAQAogICAgICAgICAgICAgaWQgPSBSZXF1ZXN0VGVtcGxhdGU6Ok1BTlVBTDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gVW5rbm93biB0ZW1wbGF0ZSBJRAorICAgICAgICAgICAgLy8gVW5rbm93biB0ZW1wbGF0ZSBJRCwgb3IgdGhpcyBIQUwgaXMgdG9vIG9sZCB0byBzdXBwb3J0IGl0CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbi0+Y29uc3RydWN0RGVmYXVsdFJlcXVlc3RTZXR0aW5ncyhpZCwKLSAgICAgICAgICAgIFsmc3RhdHVzLCAmcmVxdWVzdFRlbXBsYXRlXQotICAgICAgICAgICAgKGNvbW1vbjo6VjFfMDo6U3RhdHVzIHMsIGNvbnN0IGRldmljZTo6VjNfMjo6Q2FtZXJhTWV0YWRhdGEmIHJlcXVlc3QpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gY29tbW9uOjpWMV8wOjpTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YSAqciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCo+KHJlcXVlc3QuZGF0YSgpKTsKLSAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGV4cGVjdGVkU2l6ZSA9IHJlcXVlc3Quc2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gdmFsaWRhdGVfY2FtZXJhX21ldGFkYXRhX3N0cnVjdHVyZShyLCAmZXhwZWN0ZWRTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA9PSBPSyB8fCByZXQgPT0gQ0FNRVJBX01FVEFEQVRBX1ZBTElEQVRJT05fU0hJRlRFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgKnJlcXVlc3RUZW1wbGF0ZSA9IGNsb25lX2NhbWVyYV9tZXRhZGF0YShyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqcmVxdWVzdFRlbXBsYXRlID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjbG9uZSBjYW1lcmEgbWV0YWRhdGEgcmVjZWl2ZWQgZnJvbSBIQUwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBjb21tb246OlYxXzA6OlN0YXR1czo6SU5URVJOQUxfRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IE1hbGZvcm1lZCBjYW1lcmEgbWV0YWRhdGEgcmVjZWl2ZWQgZnJvbSBIQUwiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gY29tbW9uOjpWMV8wOjpTdGF0dXM6OklOVEVSTkFMX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7CisgICAgZXJyID0gbUhpZGxTZXNzaW9uLT5jb25zdHJ1Y3REZWZhdWx0UmVxdWVzdFNldHRpbmdzKGlkLCByZXF1ZXN0Q2FsbGJhY2spOworCiAgICAgaWYgKCFlcnIuaXNPaygpKSB7CiAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKICAgICAgICAgcmVzID0gREVBRF9PQkpFQ1Q7CkBAIC0zMTYyLDE3ICszNTAxLDIxIEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpjb25maWd1cmVTdHJlYW1zKGNhbWVyYTNfc3RyZWFtX2NvbmZpZ3VyYXRpb24gKmNvbmZpZykgeworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpjb25maWd1cmVTdHJlYW1zKGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpzZXNzaW9uUGFyYW1zLAorICAgICAgICBjYW1lcmEzX3N0cmVhbV9jb25maWd1cmF0aW9uICpjb25maWcsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYgYnVmZmVyU2l6ZXMpIHsKICAgICBBVFJBQ0VfTkFNRSgiQ2FtZXJhSGFsOjpjb25maWd1cmVTdHJlYW1zIik7CiAgICAgaWYgKCF2YWxpZCgpKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgc3RhdHVzX3QgcmVzID0gT0s7CiAKICAgICAvLyBDb252ZXJ0IHN0cmVhbSBjb25maWcgdG8gSElETAogICAgIHN0ZDo6c2V0PGludD4gYWN0aXZlU3RyZWFtczsKLSAgICBTdHJlYW1Db25maWd1cmF0aW9uIHJlcXVlc3RlZENvbmZpZ3VyYXRpb247Ci0gICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbi5zdHJlYW1zLnJlc2l6ZShjb25maWctPm51bV9zdHJlYW1zKTsKKyAgICBkZXZpY2U6OlYzXzI6OlN0cmVhbUNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfMjsKKyAgICBkZXZpY2U6OlYzXzQ6OlN0cmVhbUNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNDsKKyAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM18yLnN0cmVhbXMucmVzaXplKGNvbmZpZy0+bnVtX3N0cmVhbXMpOworICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzQuc3RyZWFtcy5yZXNpemUoY29uZmlnLT5udW1fc3RyZWFtcyk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb25maWctPm51bV9zdHJlYW1zOyBpKyspIHsKLSAgICAgICAgU3RyZWFtICZkc3QgPSByZXF1ZXN0ZWRDb25maWd1cmF0aW9uLnN0cmVhbXNbaV07CisgICAgICAgIGRldmljZTo6VjNfMjo6U3RyZWFtICZkc3QzXzIgPSByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM18yLnN0cmVhbXNbaV07CisgICAgICAgIGRldmljZTo6VjNfNDo6U3RyZWFtICZkc3QzXzQgPSByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM180LnN0cmVhbXNbaV07CiAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3QgKnNyYyA9IGNvbmZpZy0+c3RyZWFtc1tpXTsKIAogICAgICAgICBDYW1lcmEzU3RyZWFtKiBjYW0zc3RyZWFtID0gQ2FtZXJhM1N0cmVhbTo6Y2FzdChzcmMpOwpAQCAtMzE5MSwxNCArMzUzNCwxOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCwgY29uZmlnLT5zdHJlYW1zW2ldLT5zdHJlYW1fdHlwZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQotICAgICAgICBkc3QuaWQgPSBzdHJlYW1JZDsKLSAgICAgICAgZHN0LnN0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOwotICAgICAgICBkc3Qud2lkdGggPSBzcmMtPndpZHRoOwotICAgICAgICBkc3QuaGVpZ2h0ID0gc3JjLT5oZWlnaHQ7Ci0gICAgICAgIGRzdC5mb3JtYXQgPSBtYXBUb1BpeGVsRm9ybWF0KHNyYy0+Zm9ybWF0KTsKLSAgICAgICAgZHN0LnVzYWdlID0gbWFwVG9Db25zdW1lclVzYWdlKGNhbTNzdHJlYW0tPmdldFVzYWdlKCkpOwotICAgICAgICBkc3QuZGF0YVNwYWNlID0gbWFwVG9IaWRsRGF0YXNwYWNlKHNyYy0+ZGF0YV9zcGFjZSk7Ci0gICAgICAgIGRzdC5yb3RhdGlvbiA9IG1hcFRvU3RyZWFtUm90YXRpb24oKGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3QpIHNyYy0+cm90YXRpb24pOworICAgICAgICBkc3QzXzIuaWQgPSBzdHJlYW1JZDsKKyAgICAgICAgZHN0M18yLnN0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOworICAgICAgICBkc3QzXzIud2lkdGggPSBzcmMtPndpZHRoOworICAgICAgICBkc3QzXzIuaGVpZ2h0ID0gc3JjLT5oZWlnaHQ7CisgICAgICAgIGRzdDNfMi5mb3JtYXQgPSBtYXBUb1BpeGVsRm9ybWF0KHNyYy0+Zm9ybWF0KTsKKyAgICAgICAgZHN0M18yLnVzYWdlID0gbWFwVG9Db25zdW1lclVzYWdlKGNhbTNzdHJlYW0tPmdldFVzYWdlKCkpOworICAgICAgICBkc3QzXzIuZGF0YVNwYWNlID0gbWFwVG9IaWRsRGF0YXNwYWNlKHNyYy0+ZGF0YV9zcGFjZSk7CisgICAgICAgIGRzdDNfMi5yb3RhdGlvbiA9IG1hcFRvU3RyZWFtUm90YXRpb24oKGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3QpIHNyYy0+cm90YXRpb24pOworICAgICAgICBkc3QzXzQudjNfMiA9IGRzdDNfMjsKKyAgICAgICAgZHN0M180LmJ1ZmZlclNpemUgPSBidWZmZXJTaXplc1tpXTsKKyAgICAgICAgaWYgKHNyYy0+cGh5c2ljYWxfY2FtZXJhX2lkICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGRzdDNfNC5waHlzaWNhbENhbWVyYUlkID0gc3JjLT5waHlzaWNhbF9jYW1lcmFfaWQ7CisgICAgICAgIH0KIAogICAgICAgICBhY3RpdmVTdHJlYW1zLmluc2VydChzdHJlYW1JZCk7CiAgICAgICAgIC8vIENyZWF0ZSBCdWZmZXIgSUQgbWFwIGlmIG5lY2Vzc2FyeQpAQCAtMzIxNywzMSArMzU2NSw0NiBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUgb3BlcmF0aW9uTW9kZTsKICAgICByZXMgPSBtYXBUb1N0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlKAogICAgICAgICAgICAgKGNhbWVyYTNfc3RyZWFtX2NvbmZpZ3VyYXRpb25fbW9kZV90KSBjb25maWctPm9wZXJhdGlvbl9tb2RlLAotICAgICAgICAgICAgLypvdXQqLyAmcmVxdWVzdGVkQ29uZmlndXJhdGlvbi5vcGVyYXRpb25Nb2RlKTsKKyAgICAgICAgICAgIC8qb3V0Ki8gJm9wZXJhdGlvbk1vZGUpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CisgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfMi5vcGVyYXRpb25Nb2RlID0gb3BlcmF0aW9uTW9kZTsKKyAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM180Lm9wZXJhdGlvbk1vZGUgPSBvcGVyYXRpb25Nb2RlOworICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzQuc2Vzc2lvblBhcmFtcy5zZXRUb0V4dGVybmFsKAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oY29uc3RfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCo+KHNlc3Npb25QYXJhbXMpKSwKKyAgICAgICAgICAgIGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShzZXNzaW9uUGFyYW1zKSk7CiAKICAgICAvLyBJbnZva2UgY29uZmlndXJlU3RyZWFtcwotCiAgICAgZGV2aWNlOjpWM18zOjpIYWxTdHJlYW1Db25maWd1cmF0aW9uIGZpbmFsQ29uZmlndXJhdGlvbjsKICAgICBjb21tb246OlYxXzA6OlN0YXR1cyBzdGF0dXM7CiAKLSAgICAvLyBTZWUgaWYgd2UgaGF2ZSB2My4zIEhBTAotICAgIHNwPGRldmljZTo6VjNfMzo6SUNhbWVyYURldmljZVNlc3Npb24+IGhpZGxTZXNzaW9uXzNfMzsKLSAgICBhdXRvIGNhc3RSZXN1bHQgPSBkZXZpY2U6OlYzXzM6OklDYW1lcmFEZXZpY2VTZXNzaW9uOjpjYXN0RnJvbShtSGlkbFNlc3Npb24pOwotICAgIGlmIChjYXN0UmVzdWx0LmlzT2soKSkgewotICAgICAgICBoaWRsU2Vzc2lvbl8zXzMgPSBjYXN0UmVzdWx0OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3Igd2hlbiBjYXN0aW5nIElDYW1lcmFEZXZpY2VTZXNzaW9uOiAlcyIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICBjYXN0UmVzdWx0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgfQotICAgIGlmIChoaWRsU2Vzc2lvbl8zXzMgIT0gbnVsbHB0cikgeworICAgIC8vIFNlZSBpZiB3ZSBoYXZlIHYzLjQgb3IgdjMuMyBIQUwKKyAgICBpZiAobUhpZGxTZXNzaW9uXzNfNCAhPSBudWxscHRyKSB7CisgICAgICAgIC8vIFdlIGRvOyB1c2UgdjMuNCBmb3IgdGhlIGNhbGwKKyAgICAgICAgQUxPR1YoIiVzOiB2My40IGRldmljZSBmb3VuZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGRldmljZTo6VjNfNDo6SGFsU3RyZWFtQ29uZmlndXJhdGlvbiBmaW5hbENvbmZpZ3VyYXRpb24zXzQ7CisgICAgICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uXzNfNC0+Y29uZmlndXJlU3RyZWFtc18zXzQocmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNCwKKyAgICAgICAgICAgIFsmc3RhdHVzLCAmZmluYWxDb25maWd1cmF0aW9uM180XQorICAgICAgICAgICAgKGNvbW1vbjo6VjFfMDo6U3RhdHVzIHMsIGNvbnN0IGRldmljZTo6VjNfNDo6SGFsU3RyZWFtQ29uZmlndXJhdGlvbiYgaGFsQ29uZmlndXJhdGlvbikgeworICAgICAgICAgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbjNfNCA9IGhhbENvbmZpZ3VyYXRpb247CisgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIWVyci5pc09rKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtcy5yZXNpemUoZmluYWxDb25maWd1cmF0aW9uM180LnN0cmVhbXMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmaW5hbENvbmZpZ3VyYXRpb24zXzQuc3RyZWFtcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXNbaV0gPSBmaW5hbENvbmZpZ3VyYXRpb24zXzQuc3RyZWFtc1tpXS52M18zOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChtSGlkbFNlc3Npb25fM18zICE9IG51bGxwdHIpIHsKICAgICAgICAgLy8gV2UgZG87IHVzZSB2My4zIGZvciB0aGUgY2FsbAogICAgICAgICBBTE9HVigiJXM6IHYzLjMgZGV2aWNlIGZvdW5kIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgYXV0byBlcnIgPSBoaWRsU2Vzc2lvbl8zXzMtPmNvbmZpZ3VyZVN0cmVhbXNfM18zKHJlcXVlc3RlZENvbmZpZ3VyYXRpb24sCisgICAgICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uXzNfMy0+Y29uZmlndXJlU3RyZWFtc18zXzMocmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfMiwKICAgICAgICAgICAgIFsmc3RhdHVzLCAmZmluYWxDb25maWd1cmF0aW9uXQogICAgICAgICAgICAgKGNvbW1vbjo6VjFfMDo6U3RhdHVzIHMsIGNvbnN0IGRldmljZTo6VjNfMzo6SGFsU3RyZWFtQ29uZmlndXJhdGlvbiYgaGFsQ29uZmlndXJhdGlvbikgewogICAgICAgICAgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbiA9IGhhbENvbmZpZ3VyYXRpb247CkBAIC0zMjU1LDcgKzM2MTgsNyBAQAogICAgICAgICAvLyBXZSBkb24ndDsgdXNlIHYzLjIgY2FsbCBhbmQgY29uc3RydWN0IGEgdjMuMyBIYWxTdHJlYW1Db25maWd1cmF0aW9uCiAgICAgICAgIEFMT0dWKCIlczogdjMuMiBkZXZpY2UgZm91bmQiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICBIYWxTdHJlYW1Db25maWd1cmF0aW9uIGZpbmFsQ29uZmlndXJhdGlvbl8zXzI7Ci0gICAgICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uLT5jb25maWd1cmVTdHJlYW1zKHJlcXVlc3RlZENvbmZpZ3VyYXRpb24sCisgICAgICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uLT5jb25maWd1cmVTdHJlYW1zKHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzIsCiAgICAgICAgICAgICAgICAgWyZzdGF0dXMsICZmaW5hbENvbmZpZ3VyYXRpb25fM18yXQogICAgICAgICAgICAgICAgIChjb21tb246OlYxXzA6OlN0YXR1cyBzLCBjb25zdCBIYWxTdHJlYW1Db25maWd1cmF0aW9uJiBoYWxDb25maWd1cmF0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbl8zXzIgPSBoYWxDb25maWd1cmF0aW9uOwpAQCAtMzI2OSw3ICszNjMyLDcgQEAKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmaW5hbENvbmZpZ3VyYXRpb25fM18yLnN0cmVhbXMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zW2ldLnYzXzIgPSBmaW5hbENvbmZpZ3VyYXRpb25fM18yLnN0cmVhbXNbaV07CiAgICAgICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtc1tpXS5vdmVycmlkZURhdGFTcGFjZSA9Ci0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24uc3RyZWFtc1tpXS5kYXRhU3BhY2U7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzIuc3RyZWFtc1tpXS5kYXRhU3BhY2U7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTM0MjMsMTMgKzM3ODYsMjkgQEAKICAgICBBVFJBQ0VfTkFNRSgiQ2FtZXJhSGFsOjpwcm9jZXNzQmF0Y2hDYXB0dXJlUmVxdWVzdHMiKTsKICAgICBpZiAoIXZhbGlkKCkpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKIAorICAgIHNwPGRldmljZTo6VjNfNDo6SUNhbWVyYURldmljZVNlc3Npb24+IGhpZGxTZXNzaW9uXzNfNDsKKyAgICBhdXRvIGNhc3RSZXN1bHRfM180ID0gZGV2aWNlOjpWM180OjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbjo6Y2FzdEZyb20obUhpZGxTZXNzaW9uKTsKKyAgICBpZiAoY2FzdFJlc3VsdF8zXzQuaXNPaygpKSB7CisgICAgICAgIGhpZGxTZXNzaW9uXzNfNCA9IGNhc3RSZXN1bHRfM180OworICAgIH0KKwogICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxkZXZpY2U6OlYzXzI6OkNhcHR1cmVSZXF1ZXN0PiBjYXB0dXJlUmVxdWVzdHM7CisgICAgaGFyZHdhcmU6OmhpZGxfdmVjPGRldmljZTo6VjNfNDo6Q2FwdHVyZVJlcXVlc3Q+IGNhcHR1cmVSZXF1ZXN0c18zXzQ7CiAgICAgc2l6ZV90IGJhdGNoU2l6ZSA9IHJlcXVlc3RzLnNpemUoKTsKLSAgICBjYXB0dXJlUmVxdWVzdHMucmVzaXplKGJhdGNoU2l6ZSk7CisgICAgaWYgKGhpZGxTZXNzaW9uXzNfNCAhPSBudWxscHRyKSB7CisgICAgICAgIGNhcHR1cmVSZXF1ZXN0c18zXzQucmVzaXplKGJhdGNoU2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2FwdHVyZVJlcXVlc3RzLnJlc2l6ZShiYXRjaFNpemUpOworICAgIH0KICAgICBzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiBoYW5kbGVzQ3JlYXRlZDsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYmF0Y2hTaXplOyBpKyspIHsKLSAgICAgICAgd3JhcEFzSGlkbFJlcXVlc3QocmVxdWVzdHNbaV0sIC8qb3V0Ki8mY2FwdHVyZVJlcXVlc3RzW2ldLCAvKm91dCovJmhhbmRsZXNDcmVhdGVkKTsKKyAgICAgICAgaWYgKGhpZGxTZXNzaW9uXzNfNCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICB3cmFwQXNIaWRsUmVxdWVzdChyZXF1ZXN0c1tpXSwgLypvdXQqLyZjYXB0dXJlUmVxdWVzdHNfM180W2ldLnYzXzIsCisgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8maGFuZGxlc0NyZWF0ZWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd3JhcEFzSGlkbFJlcXVlc3QocmVxdWVzdHNbaV0sIC8qb3V0Ki8mY2FwdHVyZVJlcXVlc3RzW2ldLCAvKm91dCovJmhhbmRsZXNDcmVhdGVkKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHN0ZDo6dmVjdG9yPGRldmljZTo6VjNfMjo6QnVmZmVyQ2FjaGU+IGNhY2hlc1RvUmVtb3ZlOwpAQCAtMzQ1MCw3ICszODI5LDEyIEBACiAgICAgLy8gV3JpdGUgbWV0YWRhdGEgdG8gRk1RLgogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYmF0Y2hTaXplOyBpKyspIHsKICAgICAgICAgY2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCogcmVxdWVzdCA9IHJlcXVlc3RzW2ldOwotICAgICAgICBkZXZpY2U6OlYzXzI6OkNhcHR1cmVSZXF1ZXN0KiBjYXB0dXJlUmVxdWVzdCA9ICZjYXB0dXJlUmVxdWVzdHNbaV07CisgICAgICAgIGRldmljZTo6VjNfMjo6Q2FwdHVyZVJlcXVlc3QqIGNhcHR1cmVSZXF1ZXN0OworICAgICAgICBpZiAoaGlkbFNlc3Npb25fM180ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0ID0gJmNhcHR1cmVSZXF1ZXN0c18zXzRbaV0udjNfMjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0ID0gJmNhcHR1cmVSZXF1ZXN0c1tpXTsKKyAgICAgICAgfQogCiAgICAgICAgIGlmIChyZXF1ZXN0LT5zZXR0aW5ncyAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICBzaXplX3Qgc2V0dGluZ3NTaXplID0gZ2V0X2NhbWVyYV9tZXRhZGF0YV9zaXplKHJlcXVlc3QtPnNldHRpbmdzKTsKQEAgLTM0NzIsMTIgKzM4NTYsNTIgQEAKICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5zZXR0aW5ncy5yZXNpemUoMCk7CiAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+Zm1xU2V0dGluZ3NTaXplID0gMHU7CiAgICAgICAgIH0KKworICAgICAgICBpZiAoaGlkbFNlc3Npb25fM180ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0c18zXzRbaV0ucGh5c2ljYWxDYW1lcmFTZXR0aW5ncy5yZXNpemUocmVxdWVzdC0+bnVtX3BoeXNjYW1fc2V0dGluZ3MpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCByZXF1ZXN0LT5udW1fcGh5c2NhbV9zZXR0aW5nczsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3QtPnBoeXNjYW1fc2V0dGluZ3MgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2V0dGluZ3NTaXplID0gZ2V0X2NhbWVyYV9tZXRhZGF0YV9zaXplKHJlcXVlc3QtPnBoeXNjYW1fc2V0dGluZ3Nbal0pOworICAgICAgICAgICAgICAgICAgICBpZiAobVJlcXVlc3RNZXRhZGF0YVF1ZXVlICE9IG51bGxwdHIgJiYgbVJlcXVlc3RNZXRhZGF0YVF1ZXVlLT53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmVxdWVzdC0+cGh5c2NhbV9zZXR0aW5nc1tqXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzU2l6ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0c18zXzRbaV0ucGh5c2ljYWxDYW1lcmFTZXR0aW5nc1tqXS5zZXR0aW5ncy5yZXNpemUoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdHNfM180W2ldLnBoeXNpY2FsQ2FtZXJhU2V0dGluZ3Nbal0uZm1xU2V0dGluZ3NTaXplID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nc1NpemU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVJlcXVlc3RNZXRhZGF0YVF1ZXVlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXM6IGNvdWxkbid0IHV0aWxpemUgZm1xLCBmYWxsYmFjayB0byBod2JpbmRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdHNfM180W2ldLnBoeXNpY2FsQ2FtZXJhU2V0dGluZ3Nbal0uc2V0dGluZ3Muc2V0VG9FeHRlcm5hbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oY29uc3RfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCo+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPnBoeXNjYW1fc2V0dGluZ3Nbal0pKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2NhbWVyYV9tZXRhZGF0YV9zaXplKHJlcXVlc3QtPnBoeXNjYW1fc2V0dGluZ3Nbal0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0c18zXzRbaV0ucGh5c2ljYWxDYW1lcmFTZXR0aW5nc1tqXS5mbXFTZXR0aW5nc1NpemUgPSAwdTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0c18zXzRbaV0ucGh5c2ljYWxDYW1lcmFTZXR0aW5nc1tqXS5mbXFTZXR0aW5nc1NpemUgPSAwdTsKKyAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3RzXzNfNFtpXS5waHlzaWNhbENhbWVyYVNldHRpbmdzW2pdLnNldHRpbmdzLnJlc2l6ZSgwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3RzXzNfNFtpXS5waHlzaWNhbENhbWVyYVNldHRpbmdzW2pdLnBoeXNpY2FsQ2FtZXJhSWQgPQorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LT5waHlzY2FtX2lkW2pdOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQotICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uLT5wcm9jZXNzQ2FwdHVyZVJlcXVlc3QoY2FwdHVyZVJlcXVlc3RzLCBjYWNoZXNUb1JlbW92ZSwKKworICAgIGhhcmR3YXJlOjpkZXRhaWxzOjpyZXR1cm5fc3RhdHVzIGVycjsKKyAgICBpZiAoaGlkbFNlc3Npb25fM180ICE9IG51bGxwdHIpIHsKKyAgICAgICAgZXJyID0gaGlkbFNlc3Npb25fM180LT5wcm9jZXNzQ2FwdHVyZVJlcXVlc3RfM180KGNhcHR1cmVSZXF1ZXN0c18zXzQsIGNhY2hlc1RvUmVtb3ZlLAogICAgICAgICAgICAgWyZzdGF0dXMsICZudW1SZXF1ZXN0UHJvY2Vzc2VkXSAoYXV0byBzLCB1aW50MzJfdCBuKSB7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKICAgICAgICAgICAgICAgICAqbnVtUmVxdWVzdFByb2Nlc3NlZCA9IG47CiAgICAgICAgICAgICB9KTsKKyAgICB9IGVsc2UgeworICAgICAgICBlcnIgPSBtSGlkbFNlc3Npb24tPnByb2Nlc3NDYXB0dXJlUmVxdWVzdChjYXB0dXJlUmVxdWVzdHMsIGNhY2hlc1RvUmVtb3ZlLAorICAgICAgICAgICAgWyZzdGF0dXMsICZudW1SZXF1ZXN0UHJvY2Vzc2VkXSAoYXV0byBzLCB1aW50MzJfdCBuKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICAqbnVtUmVxdWVzdFByb2Nlc3NlZCA9IG47CisgICAgICAgICAgICB9KTsKKyAgICB9CiAgICAgaWYgKCFlcnIuaXNPaygpKSB7CiAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwpAQCAtMzYzNSw3ICs0MDU5LDcgQEAKIAogQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6UmVxdWVzdFRocmVhZCh3cDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQsCiAgICAgICAgIHNwPFN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIsCi0gICAgICAgIHNwPEhhbEludGVyZmFjZT4gaW50ZXJmYWNlKSA6CisgICAgICAgIHNwPEhhbEludGVyZmFjZT4gaW50ZXJmYWNlLCBjb25zdCBWZWN0b3I8aW50MzJfdD4mIHNlc3Npb25QYXJhbUtleXMpIDoKICAgICAgICAgVGhyZWFkKC8qY2FuQ2FsbEphdmEqL2ZhbHNlKSwKICAgICAgICAgbVBhcmVudChwYXJlbnQpLAogICAgICAgICBtU3RhdHVzVHJhY2tlcihzdGF0dXNUcmFja2VyKSwKQEAgLTM2NTIsNyArNDA3NiwxMCBAQAogICAgICAgICBtUmVwZWF0aW5nTGFzdEZyYW1lTnVtYmVyKAogICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyOjpOT19JTl9GTElHSFRfUkVQRUFUSU5HX0ZSQU1FUyksCiAgICAgICAgIG1QcmVwYXJlVmlkZW9TdHJlYW0oZmFsc2UpLAotICAgICAgICBtUmVxdWVzdExhdGVuY3koa1JlcXVlc3RMYXRlbmN5QmluU2l6ZSkgeworICAgICAgICBtQ29uc3RyYWluZWRNb2RlKGZhbHNlKSwKKyAgICAgICAgbVJlcXVlc3RMYXRlbmN5KGtSZXF1ZXN0TGF0ZW5jeUJpblNpemUpLAorICAgICAgICBtU2Vzc2lvblBhcmFtS2V5cyhzZXNzaW9uUGFyYW1LZXlzKSwKKyAgICAgICAgbUxhdGVzdFNlc3Npb25QYXJhbXMoc2Vzc2lvblBhcmFtS2V5cy5zaXplKCkpIHsKICAgICBtU3RhdHVzSWQgPSBzdGF0dXNUcmFja2VyLT5hZGRDb21wb25lbnQoKTsKIH0KIApAQCAtMzY2NSwxMiArNDA5MiwxNSBAQAogICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOwogfQogCi12b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OmNvbmZpZ3VyYXRpb25Db21wbGV0ZShib29sIGlzQ29uc3RyYWluZWRIaWdoU3BlZWQpIHsKK3ZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6Y29uZmlndXJhdGlvbkNvbXBsZXRlKGJvb2wgaXNDb25zdHJhaW5lZEhpZ2hTcGVlZCwKKyAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHNlc3Npb25QYXJhbXMpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7CiAgICAgbVJlY29uZmlndXJlZCA9IHRydWU7CisgICAgbUxhdGVzdFNlc3Npb25QYXJhbXMgPSBzZXNzaW9uUGFyYW1zOwogICAgIC8vIFByZXBhcmUgdmlkZW8gc3RyZWFtIGZvciBoaWdoIHNwZWVkIHJlY29yZGluZy4KICAgICBtUHJlcGFyZVZpZGVvU3RyZWFtID0gaXNDb25zdHJhaW5lZEhpZ2hTcGVlZDsKKyAgICBtQ29uc3RyYWluZWRNb2RlID0gaXNDb25zdHJhaW5lZEhpZ2hTcGVlZDsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6cXVldWVSZXF1ZXN0TGlzdCgKQEAgLTM5MjgsOSArNDM1OCw5IEBACiAgICAgdWludDMyX3QgbnVtUmVxdWVzdFByb2Nlc3NlZCA9IDA7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBiYXRjaFNpemU7IGkrKykgewogICAgICAgICByZXF1ZXN0c1tpXSA9ICZtTmV4dFJlcXVlc3RzLmVkaXRJdGVtQXQoaSkuaGFsUmVxdWVzdDsKKyAgICAgICAgQVRSQUNFX0FTWU5DX0JFR0lOKCJmcmFtZSBjYXB0dXJlIiwgbU5leHRSZXF1ZXN0c1tpXS5oYWxSZXF1ZXN0LmZyYW1lX251bWJlcik7CiAgICAgfQogCi0gICAgQVRSQUNFX0FTWU5DX0JFR0lOKCJiYXRjaCBmcmFtZSBjYXB0dXJlIiwgbU5leHRSZXF1ZXN0c1swXS5oYWxSZXF1ZXN0LmZyYW1lX251bWJlcik7CiAgICAgcmVzID0gbUludGVyZmFjZS0+cHJvY2Vzc0JhdGNoQ2FwdHVyZVJlcXVlc3RzKHJlcXVlc3RzLCAmbnVtUmVxdWVzdFByb2Nlc3NlZCk7CiAKICAgICBib29sIHRyaWdnZXJSZW1vdmVGYWlsZWQgPSBmYWxzZTsKQEAgLTM5NTYsOSArNDM4NiwxMiBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKG5leHRSZXF1ZXN0LmhhbFJlcXVlc3Quc2V0dGluZ3MgIT0gTlVMTCkgewotICAgICAgICAgICAgbmV4dFJlcXVlc3QuY2FwdHVyZVJlcXVlc3QtPm1TZXR0aW5ncy51bmxvY2sobmV4dFJlcXVlc3QuaGFsUmVxdWVzdC5zZXR0aW5ncyk7CisgICAgICAgICAgICBuZXh0UmVxdWVzdC5jYXB0dXJlUmVxdWVzdC0+bVNldHRpbmdzTGlzdC5iZWdpbigpLT5tZXRhZGF0YS51bmxvY2soCisgICAgICAgICAgICAgICAgICAgIG5leHRSZXF1ZXN0LmhhbFJlcXVlc3Quc2V0dGluZ3MpOwogICAgICAgICB9CiAKKyAgICAgICAgY2xlYW51cFBoeXNpY2FsU2V0dGluZ3MobmV4dFJlcXVlc3QuY2FwdHVyZVJlcXVlc3QsICZuZXh0UmVxdWVzdC5oYWxSZXF1ZXN0KTsKKwogICAgICAgICBpZiAoIXRyaWdnZXJSZW1vdmVGYWlsZWQpIHsKICAgICAgICAgICAgIC8vIFJlbW92ZSBhbnkgcHJldmlvdXNseSBxdWV1ZWQgdHJpZ2dlcnMgKGFmdGVyIHVubG9jaykKICAgICAgICAgICAgIHN0YXR1c190IHJlbW92ZVRyaWdnZXJSZXMgPSByZW1vdmVUcmlnZ2VycyhtUHJldlJlcXVlc3QpOwpAQCAtNDAyNyw5ICs0NDYwLDEyIEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAobmV4dFJlcXVlc3QuaGFsUmVxdWVzdC5zZXR0aW5ncyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBuZXh0UmVxdWVzdC5jYXB0dXJlUmVxdWVzdC0+bVNldHRpbmdzLnVubG9jayhuZXh0UmVxdWVzdC5oYWxSZXF1ZXN0LnNldHRpbmdzKTsKKyAgICAgICAgICAgIG5leHRSZXF1ZXN0LmNhcHR1cmVSZXF1ZXN0LT5tU2V0dGluZ3NMaXN0LmJlZ2luKCktPm1ldGFkYXRhLnVubG9jaygKKyAgICAgICAgICAgICAgICAgICAgbmV4dFJlcXVlc3QuaGFsUmVxdWVzdC5zZXR0aW5ncyk7CiAgICAgICAgIH0KIAorICAgICAgICBjbGVhbnVwUGh5c2ljYWxTZXR0aW5ncyhuZXh0UmVxdWVzdC5jYXB0dXJlUmVxdWVzdCwgJm5leHRSZXF1ZXN0LmhhbFJlcXVlc3QpOworCiAgICAgICAgIC8vIFJlbW92ZSBhbnkgcHJldmlvdXNseSBxdWV1ZWQgdHJpZ2dlcnMgKGFmdGVyIHVubG9jaykKICAgICAgICAgcmVzID0gcmVtb3ZlVHJpZ2dlcnMobVByZXZSZXF1ZXN0KTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewpAQCAtNDA3OSw2ICs0NTE1LDY1IEBACiAgICAgcmV0dXJuIG1heEV4cGVjdGVkRHVyYXRpb247CiB9CiAKK2Jvb2wgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6c2tpcEhGUlRhcmdldEZQU1VwZGF0ZShpbnQzMl90IHRhZywKKyAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QmIG5ld0VudHJ5LCBjb25zdCBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCYgY3VycmVudEVudHJ5KSB7CisgICAgaWYgKG1Db25zdHJhaW5lZE1vZGUgJiYgKEFORFJPSURfQ09OVFJPTF9BRV9UQVJHRVRfRlBTX1JBTkdFID09IHRhZykgJiYKKyAgICAgICAgICAgIChuZXdFbnRyeS5jb3VudCA9PSBjdXJyZW50RW50cnkuY291bnQpICYmIChjdXJyZW50RW50cnkuY291bnQgPT0gMikgJiYKKyAgICAgICAgICAgIChjdXJyZW50RW50cnkuZGF0YS5pMzJbMV0gPT0gbmV3RW50cnkuZGF0YS5pMzJbMV0pKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjp1cGRhdGVTZXNzaW9uUGFyYW1ldGVycyhjb25zdCBDYW1lcmFNZXRhZGF0YSYgc2V0dGluZ3MpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGJvb2wgdXBkYXRlc0RldGVjdGVkID0gZmFsc2U7CisKKyAgICBmb3IgKGF1dG8gdGFnIDogbVNlc3Npb25QYXJhbUtleXMpIHsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGVudHJ5ID0gc2V0dGluZ3MuZmluZCh0YWcpOworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgbGFzdEVudHJ5ID0gbUxhdGVzdFNlc3Npb25QYXJhbXMuZmluZCh0YWcpOworCisgICAgICAgIGlmIChlbnRyeS5jb3VudCA+IDApIHsKKyAgICAgICAgICAgIGJvb2wgaXNEaWZmZXJlbnQgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChsYXN0RW50cnkuY291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgLy8gSGF2ZSBhIGxhc3QgdmFsdWUsIGNvbXBhcmUgdG8gc2VlIGlmIGNoYW5nZWQKKyAgICAgICAgICAgICAgICBpZiAobGFzdEVudHJ5LnR5cGUgPT0gZW50cnkudHlwZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEVudHJ5LmNvdW50ID09IGVudHJ5LmNvdW50KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgdHlwZSBhbmQgY291bnQsIGNvbXBhcmUgdmFsdWVzCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBieXRlc1BlclZhbHVlID0gY2FtZXJhX21ldGFkYXRhX3R5cGVfc2l6ZVtsYXN0RW50cnkudHlwZV07CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBlbnRyeUJ5dGVzID0gYnl0ZXNQZXJWYWx1ZSAqIGxhc3RFbnRyeS5jb3VudDsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNtcCA9IG1lbWNtcChlbnRyeS5kYXRhLnU4LCBsYXN0RW50cnkuZGF0YS51OCwgZW50cnlCeXRlcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbXAgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaXNEaWZmZXJlbnQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ291bnQgb3IgdHlwZSBoYXMgY2hhbmdlZAorICAgICAgICAgICAgICAgICAgICBpc0RpZmZlcmVudCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBObyBsYXN0IGVudHJ5LCBzbyBhbHdheXMgY29uc2lkZXIgdG8gYmUgZGlmZmVyZW50CisgICAgICAgICAgICAgICAgaXNEaWZmZXJlbnQgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaXNEaWZmZXJlbnQpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXM6IFNlc3Npb24gcGFyYW1ldGVyIHRhZyBpZCAlZCBjaGFuZ2VkIiwgX19GVU5DVElPTl9fLCB0YWcpOworICAgICAgICAgICAgICAgIGlmICghc2tpcEhGUlRhcmdldEZQU1VwZGF0ZSh0YWcsIGVudHJ5LCBsYXN0RW50cnkpKSB7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZXNEZXRlY3RlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1MYXRlc3RTZXNzaW9uUGFyYW1zLnVwZGF0ZShlbnRyeSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobGFzdEVudHJ5LmNvdW50ID4gMCkgeworICAgICAgICAgICAgLy8gVmFsdWUgaGFzIGJlZW4gcmVtb3ZlZAorICAgICAgICAgICAgQUxPR1YoIiVzOiBTZXNzaW9uIHBhcmFtZXRlciB0YWcgaWQgJWQgcmVtb3ZlZCIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICAgICAgICAgIG1MYXRlc3RTZXNzaW9uUGFyYW1zLmVyYXNlKHRhZyk7CisgICAgICAgICAgICB1cGRhdGVzRGV0ZWN0ZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHVwZGF0ZXNEZXRlY3RlZDsKK30KKwogYm9vbCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjp0aHJlYWRMb29wKCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgc3RhdHVzX3QgcmVzOwpAQCAtNDA5Nyw3ICs0NTkyLDcgQEAKICAgICAvLyBHZXQgdGhlIGxhdGVzdCByZXF1ZXN0IElELCBpZiBhbnkKICAgICBpbnQgbGF0ZXN0UmVxdWVzdElkOwogICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IHJlcXVlc3RJZEVudHJ5ID0gbU5leHRSZXF1ZXN0c1ttTmV4dFJlcXVlc3RzLnNpemUoKSAtIDFdLgotICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1TZXR0aW5ncy5maW5kKEFORFJPSURfUkVRVUVTVF9JRCk7CisgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+bVNldHRpbmdzTGlzdC5iZWdpbigpLT5tZXRhZGF0YS5maW5kKEFORFJPSURfUkVRVUVTVF9JRCk7CiAgICAgaWYgKHJlcXVlc3RJZEVudHJ5LmNvdW50ID4gMCkgewogICAgICAgICBsYXRlc3RSZXF1ZXN0SWQgPSByZXF1ZXN0SWRFbnRyeS5kYXRhLmkzMlswXTsKICAgICB9IGVsc2UgewpAQCAtNDEwNSw2ICs0NjAwLDUzIEBACiAgICAgICAgIGxhdGVzdFJlcXVlc3RJZCA9IE5BTUVfTk9UX0ZPVU5EOwogICAgIH0KIAorICAgIC8vICdtTmV4dFJlcXVlc3RzJyB3aWxsIGF0IHRoaXMgcG9pbnQgY29udGFpbiBlaXRoZXIgYSBzZXQgb2YgSEZSIGJhdGNoZWQgcmVxdWVzdHMKKyAgICAvLyAgb3IgYSBzaW5nbGUgcmVxdWVzdCBmcm9tIHN0cmVhbWluZyBvciBidXJzdC4gSW4gZWl0aGVyIGNhc2UgdGhlIGZpcnN0IGVsZW1lbnQKKyAgICAvLyAgc2hvdWxkIGNvbnRhaW4gdGhlIGxhdGVzdCBjYW1lcmEgc2V0dGluZ3MgdGhhdCB3ZSBuZWVkIHRvIGNoZWNrIGZvciBhbnkgc2Vzc2lvbgorICAgIC8vICBwYXJhbWV0ZXIgdXBkYXRlcy4KKyAgICBpZiAodXBkYXRlU2Vzc2lvblBhcmFtZXRlcnMobU5leHRSZXF1ZXN0c1swXS5jYXB0dXJlUmVxdWVzdC0+bVNldHRpbmdzTGlzdC5iZWdpbigpLT5tZXRhZGF0YSkpIHsKKyAgICAgICAgcmVzID0gT0s7CisKKyAgICAgICAgLy9JbnB1dCBzdHJlYW0gYnVmZmVycyBhcmUgYWxyZWFkeSBhY3F1aXJlZCBhdCB0aGlzIHBvaW50IHNvIGFuIGlucHV0IHN0cmVhbQorICAgICAgICAvL3dpbGwgbm90IGJlIGFibGUgdG8gbW92ZSB0byBpZGxlIHN0YXRlIHVubGVzcyB3ZSBmb3JjZSBpdC4KKyAgICAgICAgaWYgKG1OZXh0UmVxdWVzdHNbMF0uY2FwdHVyZVJlcXVlc3QtPm1JbnB1dFN0cmVhbSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICByZXMgPSBtTmV4dFJlcXVlc3RzWzBdLmNhcHR1cmVSZXF1ZXN0LT5tSW5wdXRTdHJlYW0tPmZvcmNlVG9JZGxlKCk7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZm9yY2UgaWRsZSBpbnB1dCBzdHJlYW06ICVkIiwgX19GVU5DVElPTl9fLCByZXMpOworICAgICAgICAgICAgICAgIGNsZWFuVXBGYWlsZWRSZXF1ZXN0cygvKnNlbmRSZXF1ZXN0RXJyb3IqLyBmYWxzZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlcyA9PSBPSykgeworICAgICAgICAgICAgc3A8U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlciA9IG1TdGF0dXNUcmFja2VyLnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXNUcmFja2VyICE9IDApIHsKKyAgICAgICAgICAgICAgICBzcDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQgPSBtUGFyZW50LnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50LT5wYXVzZVN0YXRlTm90aWZ5KHRydWUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN0YXR1c1RyYWNrZXItPm1hcmtDb21wb25lbnRJZGxlKG1TdGF0dXNJZCwgRmVuY2U6Ok5PX0ZFTkNFKTsKKworICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBtUmVjb25maWd1cmVkIHw9IHBhcmVudC0+cmVjb25maWd1cmVDYW1lcmEobUxhdGVzdFNlc3Npb25QYXJhbXMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN0YXR1c1RyYWNrZXItPm1hcmtDb21wb25lbnRBY3RpdmUobVN0YXR1c0lkKTsKKyAgICAgICAgICAgICAgICBzZXRQYXVzZWQoZmFsc2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobU5leHRSZXF1ZXN0c1swXS5jYXB0dXJlUmVxdWVzdC0+bUlucHV0U3RyZWFtICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBtTmV4dFJlcXVlc3RzWzBdLmNhcHR1cmVSZXF1ZXN0LT5tSW5wdXRTdHJlYW0tPnJlc3RvcmVDb25maWd1cmVkU3RhdGUoKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlc3RvcmUgY29uZmlndXJlZCBpbnB1dCBzdHJlYW06ICVkIiwgX19GVU5DVElPTl9fLCByZXMpOworICAgICAgICAgICAgICAgICAgICBjbGVhblVwRmFpbGVkUmVxdWVzdHMoLypzZW5kUmVxdWVzdEVycm9yKi8gZmFsc2UpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgLy8gUHJlcGFyZSBhIGJhdGNoIG9mIEhBTCByZXF1ZXN0cyBhbmQgb3V0cHV0IGJ1ZmZlcnMuCiAgICAgcmVzID0gcHJlcGFyZUhhbFJlcXVlc3RzKCk7CiAgICAgaWYgKHJlcyA9PSBUSU1FRF9PVVQpIHsKQEAgLTQxNzksMTkgKzQ3MjEsMjAgQEAKIAogICAgICAgICAvLyBJbnNlcnQgYW55IHF1ZXVlZCB0cmlnZ2VycyAoYmVmb3JlIG1ldGFkYXRhIGlzIGxvY2tlZCkKICAgICAgICAgc3RhdHVzX3QgcmVzID0gaW5zZXJ0VHJpZ2dlcnMoY2FwdHVyZVJlcXVlc3QpOwotCiAgICAgICAgIGlmIChyZXMgPCAwKSB7CiAgICAgICAgICAgICBTRVRfRVJSKCJSZXF1ZXN0VGhyZWFkOiBVbmFibGUgdG8gaW5zZXJ0IHRyaWdnZXJzICIKICAgICAgICAgICAgICAgICAgICAgIihjYXB0dXJlIHJlcXVlc3QgJWQsIEhBTCBkZXZpY2U6ICVzICglZCkiLAogICAgICAgICAgICAgICAgICAgICBoYWxSZXF1ZXN0LT5mcmFtZV9udW1iZXIsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICB9CisKICAgICAgICAgaW50IHRyaWdnZXJDb3VudCA9IHJlczsKICAgICAgICAgYm9vbCB0cmlnZ2Vyc01peGVkSW4gPSAodHJpZ2dlckNvdW50ID4gMCB8fCBtUHJldlRyaWdnZXJzID4gMCk7CiAgICAgICAgIG1QcmV2VHJpZ2dlcnMgPSB0cmlnZ2VyQ291bnQ7CiAKICAgICAgICAgLy8gSWYgdGhlIHJlcXVlc3QgaXMgdGhlIHNhbWUgYXMgbGFzdCwgb3Igd2UgaGFkIHRyaWdnZXJzIGxhc3QgdGltZQotICAgICAgICBpZiAobVByZXZSZXF1ZXN0ICE9IGNhcHR1cmVSZXF1ZXN0IHx8IHRyaWdnZXJzTWl4ZWRJbikgeworICAgICAgICBib29sIG5ld1JlcXVlc3QgPSBtUHJldlJlcXVlc3QgIT0gY2FwdHVyZVJlcXVlc3QgfHwgdHJpZ2dlcnNNaXhlZEluOworICAgICAgICBpZiAobmV3UmVxdWVzdCkgewogICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgKiBIQUwgd29ya2Fyb3VuZDoKICAgICAgICAgICAgICAqIEluc2VydCBhIGR1bW15IHRyaWdnZXIgSUQgaWYgYSB0cmlnZ2VyIGlzIHNldCBidXQgbm8gdHJpZ2dlciBJRCBpcwpAQCAtNDIwNCwxMiArNDc0NywyNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIENvcnJlY3QgbWV0YWRhdGEgcmVnaW9ucyBmb3IgZGlzdG9ydGlvbiBjb3JyZWN0aW9uIGlmIGVuYWJsZWQKKyAgICAgICAgICAgICAgICBzcDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQgPSBtUGFyZW50LnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gcGFyZW50LT5tRGlzdG9ydGlvbk1hcHBlci5jb3JyZWN0Q2FwdHVyZVJlcXVlc3QoCisgICAgICAgICAgICAgICAgICAgICAgICAmKGNhcHR1cmVSZXF1ZXN0LT5tU2V0dGluZ3NMaXN0LmJlZ2luKCktPm1ldGFkYXRhKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9FUlIoIlJlcXVlc3RUaHJlYWQ6IFVuYWJsZSB0byBjb3JyZWN0IGNhcHR1cmUgcmVxdWVzdHMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIGxlbnMgZGlzdG9ydGlvbiBmb3IgcmVxdWVzdCAlZDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbFJlcXVlc3QtPmZyYW1lX251bWJlciwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICogVGhlIHJlcXVlc3Qgc2hvdWxkIGJlIHByZXNvcnRlZCBzbyBhY2Nlc3NlcyBpbiBIQUwKICAgICAgICAgICAgICAqICAgYXJlIE8obG9nbikuIFNpZGVub3RlLCBzb3J0aW5nIGEgc29ydGVkIG1ldGFkYXRhIGlzIG5vcC4KICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1TZXR0aW5ncy5zb3J0KCk7Ci0gICAgICAgICAgICBoYWxSZXF1ZXN0LT5zZXR0aW5ncyA9IGNhcHR1cmVSZXF1ZXN0LT5tU2V0dGluZ3MuZ2V0QW5kTG9jaygpOworICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1TZXR0aW5nc0xpc3QuYmVnaW4oKS0+bWV0YWRhdGEuc29ydCgpOworICAgICAgICAgICAgaGFsUmVxdWVzdC0+c2V0dGluZ3MgPSBjYXB0dXJlUmVxdWVzdC0+bVNldHRpbmdzTGlzdC5iZWdpbigpLT5tZXRhZGF0YS5nZXRBbmRMb2NrKCk7CiAgICAgICAgICAgICBtUHJldlJlcXVlc3QgPSBjYXB0dXJlUmVxdWVzdDsKICAgICAgICAgICAgIEFMT0dWVigiJXM6IFJlcXVlc3Qgc2V0dGluZ3MgYXJlIE5FVyIsIF9fRlVOQ1RJT05fXyk7CiAKQEAgLTQyMzMsNiArNDc5MSwyNiBAQAogICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAoY2FwdHVyZVJlcXVlc3QtPm1TZXR0aW5nc0xpc3Quc2l6ZSgpID4gMSkgeworICAgICAgICAgICAgaGFsUmVxdWVzdC0+bnVtX3BoeXNjYW1fc2V0dGluZ3MgPSBjYXB0dXJlUmVxdWVzdC0+bVNldHRpbmdzTGlzdC5zaXplKCkgLSAxOworICAgICAgICAgICAgaGFsUmVxdWVzdC0+cGh5c2NhbV9pZCA9IG5ldyBjb25zdCBjaGFyKiBbaGFsUmVxdWVzdC0+bnVtX3BoeXNjYW1fc2V0dGluZ3NdOworICAgICAgICAgICAgaWYgKG5ld1JlcXVlc3QpIHsKKyAgICAgICAgICAgICAgICBoYWxSZXF1ZXN0LT5waHlzY2FtX3NldHRpbmdzID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IGNvbnN0IGNhbWVyYV9tZXRhZGF0YSogW2hhbFJlcXVlc3QtPm51bV9waHlzY2FtX3NldHRpbmdzXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaGFsUmVxdWVzdC0+cGh5c2NhbV9zZXR0aW5ncyA9IG51bGxwdHI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdXRvIGl0ID0gKytjYXB0dXJlUmVxdWVzdC0+bVNldHRpbmdzTGlzdC5iZWdpbigpOworICAgICAgICAgICAgc2l6ZV90IGkgPSAwOworICAgICAgICAgICAgZm9yICg7IGl0ICE9IGNhcHR1cmVSZXF1ZXN0LT5tU2V0dGluZ3NMaXN0LmVuZCgpOyBpdCsrLCBpKyspIHsKKyAgICAgICAgICAgICAgICBoYWxSZXF1ZXN0LT5waHlzY2FtX2lkW2ldID0gaXQtPmNhbWVyYUlkLmNfc3RyKCk7CisgICAgICAgICAgICAgICAgaWYgKG5ld1JlcXVlc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgaXQtPm1ldGFkYXRhLnNvcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgaGFsUmVxdWVzdC0+cGh5c2NhbV9zZXR0aW5nc1tpXSA9IGl0LT5tZXRhZGF0YS5nZXRBbmRMb2NrKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgdWludDMyX3QgdG90YWxOdW1CdWZmZXJzID0gMDsKIAogICAgICAgICAvLyBGaWxsIGluIGJ1ZmZlcnMKQEAgLTQyNDYsNiArNDgyNCw3IEBACiAgICAgICAgIG91dHB1dEJ1ZmZlcnMtPmluc2VydEF0KGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90KCksIDAsCiAgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1PdXRwdXRTdHJlYW1zLnNpemUoKSk7CiAgICAgICAgIGhhbFJlcXVlc3QtPm91dHB1dF9idWZmZXJzID0gb3V0cHV0QnVmZmVycy0+YXJyYXkoKTsKKyAgICAgICAgc3RkOjpzZXQ8U3RyaW5nOD4gcmVxdWVzdGVkUGh5c2ljYWxDYW1lcmFzOwogICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGNhcHR1cmVSZXF1ZXN0LT5tT3V0cHV0U3RyZWFtcy5zaXplKCk7IGorKykgewogICAgICAgICAgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gb3V0cHV0U3RyZWFtID0gY2FwdHVyZVJlcXVlc3QtPm1PdXRwdXRTdHJlYW1zLmVkaXRJdGVtQXQoaik7CiAKQEAgLTQyNzYsOCArNDg1NSwxOCBAQAogCiAgICAgICAgICAgICAgICAgcmV0dXJuIFRJTUVEX09VVDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhhbFJlcXVlc3QtPm51bV9vdXRwdXRfYnVmZmVycysrOwogCisgICAgICAgICAgICBTdHJpbmc4IHBoeXNpY2FsQ2FtZXJhSWQgPSBvdXRwdXRTdHJlYW0tPmdldFBoeXNpY2FsQ2FtZXJhSWQoKTsKKworICAgICAgICAgICAgaWYgKCFwaHlzaWNhbENhbWVyYUlkLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIC8vIFBoeXNpY2FsIHN0cmVhbSBpc24ndCBzdXBwb3J0ZWQgZm9yIGlucHV0IHJlcXVlc3QuCisgICAgICAgICAgICAgICAgaWYgKGhhbFJlcXVlc3QtPmlucHV0X2J1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICBDTE9HRSgiUGh5c2ljYWwgc3RyZWFtIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGlucHV0IHJlcXVlc3QiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXF1ZXN0ZWRQaHlzaWNhbENhbWVyYXMuaW5zZXJ0KHBoeXNpY2FsQ2FtZXJhSWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaGFsUmVxdWVzdC0+bnVtX291dHB1dF9idWZmZXJzKys7CiAgICAgICAgIH0KICAgICAgICAgdG90YWxOdW1CdWZmZXJzICs9IGhhbFJlcXVlc3QtPm51bV9vdXRwdXRfYnVmZmVyczsKIApAQCAtNDMwMCw3ICs0ODg5LDggQEAKICAgICAgICAgICAgICAgICB0b3RhbE51bUJ1ZmZlcnMsIGNhcHR1cmVSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLAogICAgICAgICAgICAgICAgIC8qaGFzSW5wdXQqL2hhbFJlcXVlc3QtPmlucHV0X2J1ZmZlciAhPSBOVUxMLAogICAgICAgICAgICAgICAgIGhhc0NhbGxiYWNrLAotICAgICAgICAgICAgICAgIGNhbGN1bGF0ZU1heEV4cGVjdGVkRHVyYXRpb24oaGFsUmVxdWVzdC0+c2V0dGluZ3MpKTsKKyAgICAgICAgICAgICAgICBjYWxjdWxhdGVNYXhFeHBlY3RlZER1cmF0aW9uKGhhbFJlcXVlc3QtPnNldHRpbmdzKSwKKyAgICAgICAgICAgICAgICByZXF1ZXN0ZWRQaHlzaWNhbENhbWVyYXMpOwogICAgICAgICBBTE9HVlYoIiVzOiByZWdpc3RlcmVkIGluIGZsaWdodCByZXF1ZXN0SWQgPSAlIiBQUklkMzIgIiwgZnJhbWVOdW1iZXIgPSAlIiBQUklkNjQKICAgICAgICAgICAgICAgICIsIGJ1cnN0SWQgPSAlIiBQUklkMzIgIi4iLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKQEAgLTQzNTYsNiArNDk0Niw0NiBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAorYm9vbCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjppc091dHB1dFN1cmZhY2VQZW5kaW5nKGludCBzdHJlYW1JZCwgc2l6ZV90IHN1cmZhY2VJZCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVJlcXVlc3RMb2NrKTsKKworICAgIGZvciAoY29uc3QgYXV0byYgbmV4dFJlcXVlc3QgOiBtTmV4dFJlcXVlc3RzKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgcyA6IG5leHRSZXF1ZXN0LmNhcHR1cmVSZXF1ZXN0LT5tT3V0cHV0U3VyZmFjZXMpIHsKKyAgICAgICAgICAgIGlmIChzLmZpcnN0ID09IHN0cmVhbUlkKSB7CisgICAgICAgICAgICAgICAgY29uc3QgYXV0byAmaXQgPSBzdGQ6OmZpbmQocy5zZWNvbmQuYmVnaW4oKSwgcy5zZWNvbmQuZW5kKCksIHN1cmZhY2VJZCk7CisgICAgICAgICAgICAgICAgaWYgKGl0ICE9IHMuc2Vjb25kLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoY29uc3QgYXV0byYgcmVxdWVzdCA6IG1SZXF1ZXN0UXVldWUpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzIDogcmVxdWVzdC0+bU91dHB1dFN1cmZhY2VzKSB7CisgICAgICAgICAgICBpZiAocy5maXJzdCA9PSBzdHJlYW1JZCkgeworICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gJml0ID0gc3RkOjpmaW5kKHMuc2Vjb25kLmJlZ2luKCksIHMuc2Vjb25kLmVuZCgpLCBzdXJmYWNlSWQpOworICAgICAgICAgICAgICAgIGlmIChpdCAhPSBzLnNlY29uZC5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChjb25zdCBhdXRvJiByZXF1ZXN0IDogbVJlcGVhdGluZ1JlcXVlc3RzKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgcyA6IHJlcXVlc3QtPm1PdXRwdXRTdXJmYWNlcykgeworICAgICAgICAgICAgaWYgKHMuZmlyc3QgPT0gc3RyZWFtSWQpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBhdXRvICZpdCA9IHN0ZDo6ZmluZChzLnNlY29uZC5iZWdpbigpLCBzLnNlY29uZC5lbmQoKSwgc3VyZmFjZUlkKTsKKyAgICAgICAgICAgICAgICBpZiAoaXQgIT0gcy5zZWNvbmQuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKwogbnNlY3NfdCBDYW1lcmEzRGV2aWNlOjpnZXRFeHBlY3RlZEluRmxpZ2h0RHVyYXRpb24oKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYWwobUluRmxpZ2h0TG9jayk7CkBAIC00MzYzLDYgKzQ5OTMsMzAgQEAKICAgICAgICAgICAgIG1FeHBlY3RlZEluZmxpZ2h0RHVyYXRpb24gOiBrTWluSW5mbGlnaHREdXJhdGlvbjsKIH0KIAordm9pZCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpjbGVhbnVwUGh5c2ljYWxTZXR0aW5ncyhzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCwKKyAgICAgICAgY2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCAqaGFsUmVxdWVzdCkgeworICAgIGlmICgocmVxdWVzdCA9PSBudWxscHRyKSB8fCAoaGFsUmVxdWVzdCA9PSBudWxscHRyKSkgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgcmVxdWVzdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGhhbFJlcXVlc3QtPm51bV9waHlzY2FtX3NldHRpbmdzID4gMCkgeworICAgICAgICBpZiAoaGFsUmVxdWVzdC0+cGh5c2NhbV9pZCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBkZWxldGUgW10gaGFsUmVxdWVzdC0+cGh5c2NhbV9pZDsKKyAgICAgICAgICAgIGhhbFJlcXVlc3QtPnBoeXNjYW1faWQgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIGlmIChoYWxSZXF1ZXN0LT5waHlzY2FtX3NldHRpbmdzICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGF1dG8gaXQgPSArKyhyZXF1ZXN0LT5tU2V0dGluZ3NMaXN0LmJlZ2luKCkpOworICAgICAgICAgICAgc2l6ZV90IGkgPSAwOworICAgICAgICAgICAgZm9yICg7IGl0ICE9IHJlcXVlc3QtPm1TZXR0aW5nc0xpc3QuZW5kKCk7IGl0KyssIGkrKykgeworICAgICAgICAgICAgICAgIGl0LT5tZXRhZGF0YS51bmxvY2soaGFsUmVxdWVzdC0+cGh5c2NhbV9zZXR0aW5nc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWxldGUgW10gaGFsUmVxdWVzdC0+cGh5c2NhbV9zZXR0aW5nczsKKyAgICAgICAgICAgIGhhbFJlcXVlc3QtPnBoeXNjYW1fc2V0dGluZ3MgPSBudWxscHRyOworICAgICAgICB9CisgICAgfQorfQorCiB2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OmNsZWFuVXBGYWlsZWRSZXF1ZXN0cyhib29sIHNlbmRSZXF1ZXN0RXJyb3IpIHsKICAgICBpZiAobU5leHRSZXF1ZXN0cy5lbXB0eSgpKSB7CiAgICAgICAgIHJldHVybjsKQEAgLTQzNzksOSArNTAzMywxMSBAQAogICAgICAgICBWZWN0b3I8Y2FtZXJhM19zdHJlYW1fYnVmZmVyX3Q+KiBvdXRwdXRCdWZmZXJzID0gJm5leHRSZXF1ZXN0Lm91dHB1dEJ1ZmZlcnM7CiAKICAgICAgICAgaWYgKGhhbFJlcXVlc3QtPnNldHRpbmdzICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tU2V0dGluZ3MudW5sb2NrKGhhbFJlcXVlc3QtPnNldHRpbmdzKTsKKyAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tU2V0dGluZ3NMaXN0LmJlZ2luKCktPm1ldGFkYXRhLnVubG9jayhoYWxSZXF1ZXN0LT5zZXR0aW5ncyk7CiAgICAgICAgIH0KIAorICAgICAgICBjbGVhbnVwUGh5c2ljYWxTZXR0aW5ncyhjYXB0dXJlUmVxdWVzdCwgaGFsUmVxdWVzdCk7CisKICAgICAgICAgaWYgKGNhcHR1cmVSZXF1ZXN0LT5tSW5wdXRTdHJlYW0gIT0gTlVMTCkgewogICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1JbnB1dEJ1ZmZlci5zdGF0dXMgPSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1I7CiAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+bUlucHV0U3RyZWFtLT5yZXR1cm5JbnB1dEJ1ZmZlcihjYXB0dXJlUmVxdWVzdC0+bUlucHV0QnVmZmVyKTsKQEAgLTQ2NDUsNyArNTMwMSw3IEBACiAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKICAgICB9CiAKLSAgICBDYW1lcmFNZXRhZGF0YSAmbWV0YWRhdGEgPSByZXF1ZXN0LT5tU2V0dGluZ3M7CisgICAgQ2FtZXJhTWV0YWRhdGEgJm1ldGFkYXRhID0gcmVxdWVzdC0+bVNldHRpbmdzTGlzdC5iZWdpbigpLT5tZXRhZGF0YTsKICAgICBzaXplX3QgY291bnQgPSBtVHJpZ2dlck1hcC5zaXplKCk7CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKQEAgLTQ3MjgsNyArNTM4NCw3IEBACiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYWwobVRyaWdnZXJNdXRleCk7CiAKLSAgICBDYW1lcmFNZXRhZGF0YSAmbWV0YWRhdGEgPSByZXF1ZXN0LT5tU2V0dGluZ3M7CisgICAgQ2FtZXJhTWV0YWRhdGEgJm1ldGFkYXRhID0gcmVxdWVzdC0+bVNldHRpbmdzTGlzdC5iZWdpbigpLT5tZXRhZGF0YTsKIAogICAgIC8qKgogICAgICAqIFJlcGxhY2UgYWxsIG9sZCBlbnRyaWVzIHdpdGggdGhlaXIgb2xkIHZhbHVlcy4KQEAgLTQ3OTMsNyArNTQ0OSw3IEBACiAgICAgc3RhdGljIGNvbnN0IGludDMyX3QgZHVtbXlUcmlnZ2VySWQgPSAxOwogICAgIHN0YXR1c190IHJlczsKIAotICAgIENhbWVyYU1ldGFkYXRhICZtZXRhZGF0YSA9IHJlcXVlc3QtPm1TZXR0aW5nczsKKyAgICBDYW1lcmFNZXRhZGF0YSAmbWV0YWRhdGEgPSByZXF1ZXN0LT5tU2V0dGluZ3NMaXN0LmJlZ2luKCktPm1ldGFkYXRhOwogCiAgICAgLy8gSWYgQUYgdHJpZ2dlciBpcyBhY3RpdmUsIGluc2VydCBhIGR1bW15IEFGIHRyaWdnZXIgSUQgaWYgbm9uZSBhbHJlYWR5CiAgICAgLy8gZXhpc3RzCkBAIC00ODI4LDcgKzU0ODQsNyBAQAogCiBDYW1lcmEzRGV2aWNlOjpQcmVwYXJlclRocmVhZDo6UHJlcGFyZXJUaHJlYWQoKSA6CiAgICAgICAgIFRocmVhZCgvKmNhbkNhbGxKYXZhKi9mYWxzZSksIG1MaXN0ZW5lcihudWxscHRyKSwKLSAgICAgICAgbUFjdGl2ZShmYWxzZSksIG1DYW5jZWxOb3coZmFsc2UpIHsKKyAgICAgICAgbUFjdGl2ZShmYWxzZSksIG1DYW5jZWxOb3coZmFsc2UpLCBtQ3VycmVudE1heENvdW50KDApLCBtQ3VycmVudFByZXBhcmVDb21wbGV0ZShmYWxzZSkgewogfQogCiBDYW1lcmEzRGV2aWNlOjpQcmVwYXJlclRocmVhZDo6flByZXBhcmVyVGhyZWFkKCkgewpAQCAtNDg3OSwxOCArNTUzNSwxMDEgQEAKICAgICB9CiAKICAgICAvLyBxdWV1ZSB1cCB0aGUgd29yawotICAgIG1QZW5kaW5nU3RyZWFtcy5wdXNoX2JhY2soc3RyZWFtKTsKKyAgICBtUGVuZGluZ1N0cmVhbXMuZW1wbGFjZShtYXhDb3VudCwgc3RyZWFtKTsKICAgICBBTE9HVigiJXM6IFN0cmVhbSAlZCBxdWV1ZWQgZm9yIHByZXBhcmluZyIsIF9fRlVOQ1RJT05fXywgc3RyZWFtLT5nZXRJZCgpKTsKIAogICAgIHJldHVybiBPSzsKIH0KIAordm9pZCBDYW1lcmEzRGV2aWNlOjpQcmVwYXJlclRocmVhZDo6cGF1c2UoKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQsIHNwPGNhbWVyYTM6OkNhbWVyYTNTdHJlYW1JbnRlcmZhY2U+ID4gcGVuZGluZ1N0cmVhbXM7CisgICAgcGVuZGluZ1N0cmVhbXMuaW5zZXJ0KG1QZW5kaW5nU3RyZWFtcy5iZWdpbigpLCBtUGVuZGluZ1N0cmVhbXMuZW5kKCkpOworICAgIHNwPGNhbWVyYTM6OkNhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IGN1cnJlbnRTdHJlYW0gPSBtQ3VycmVudFN0cmVhbTsKKyAgICBpbnQgY3VycmVudE1heENvdW50ID0gbUN1cnJlbnRNYXhDb3VudDsKKyAgICBtUGVuZGluZ1N0cmVhbXMuY2xlYXIoKTsKKyAgICBtQ2FuY2VsTm93ID0gdHJ1ZTsKKyAgICB3aGlsZSAobUFjdGl2ZSkgeworICAgICAgICBhdXRvIHJlcyA9IG1UaHJlYWRBY3RpdmVTaWduYWwud2FpdFJlbGF0aXZlKG1Mb2NrLCBrQWN0aXZlVGltZW91dCk7CisgICAgICAgIGlmIChyZXMgPT0gVElNRURfT1VUKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFRpbWVkIG91dCB3YWl0aW5nIG9uIHByZXBhcmUgdGhyZWFkISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEVuY291bnRlcmVkIGFuIGVycm9yOiAlZCB3YWl0aW5nIG9uIHByZXBhcmUgdGhyZWFkISIsIF9fRlVOQ1RJT05fXywgcmVzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vQ2hlY2sgd2hldGhlciB0aGUgcHJlcGFyZSB0aHJlYWQgd2FzIGFibGUgdG8gY29tcGxldGUgdGhlIGN1cnJlbnQKKyAgICAvL3N0cmVhbS4gSW4gY2FzZSB3b3JrIGlzIHN0aWxsIHBlbmRpbmcgZW1wbGFjZSBpdCBhbG9uZyB3aXRoIHRoZSByZXN0CisgICAgLy9vZiB0aGUgc3RyZWFtcyBpbiB0aGUgcGVuZGluZyBsaXN0LgorICAgIGlmIChjdXJyZW50U3RyZWFtICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKCFtQ3VycmVudFByZXBhcmVDb21wbGV0ZSkgeworICAgICAgICAgICAgcGVuZGluZ1N0cmVhbXMuZW1wbGFjZShjdXJyZW50TWF4Q291bnQsIGN1cnJlbnRTdHJlYW0pOworICAgICAgICB9CisgICAgfQorCisgICAgbVBlbmRpbmdTdHJlYW1zLmluc2VydChwZW5kaW5nU3RyZWFtcy5iZWdpbigpLCBwZW5kaW5nU3RyZWFtcy5lbmQoKSk7CisgICAgZm9yIChjb25zdCBhdXRvJiBpdCA6IG1QZW5kaW5nU3RyZWFtcykgeworICAgICAgICBpdC5zZWNvbmQtPmNhbmNlbFByZXBhcmUoKTsKKyAgICB9Cit9CisKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OlByZXBhcmVyVGhyZWFkOjpyZXN1bWUoKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBzdGF0dXNfdCByZXM7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgc3A8Tm90aWZpY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVyID0gbUxpc3RlbmVyLnByb21vdGUoKTsKKworICAgIGlmIChtQWN0aXZlKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJ5aW5nIHRvIHJlc3VtZSBhbiBhbHJlYWR5IGFjdGl2ZSBwcmVwYXJlIHRocmVhZCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBhdXRvIGl0ID0gbVBlbmRpbmdTdHJlYW1zLmJlZ2luKCk7CisgICAgZm9yICg7IGl0ICE9IG1QZW5kaW5nU3RyZWFtcy5lbmQoKTspIHsKKyAgICAgICAgcmVzID0gaXQtPnNlY29uZC0+c3RhcnRQcmVwYXJlKGl0LT5maXJzdCk7CisgICAgICAgIGlmIChyZXMgPT0gT0spIHsKKyAgICAgICAgICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXItPm5vdGlmeVByZXBhcmVkKGl0LT5zZWNvbmQtPmdldElkKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaXQgPSBtUGVuZGluZ1N0cmVhbXMuZXJhc2UoaXQpOworICAgICAgICB9IGVsc2UgaWYgKHJlcyAhPSBOT1RfRU5PVUdIX0RBVEEpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHN0YXJ0IHByZXBhcmVyIHN0cmVhbTogJWQgKCVzKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgcmVzLCBzdHJlcnJvcigtcmVzKSk7CisgICAgICAgICAgICBpdCA9IG1QZW5kaW5nU3RyZWFtcy5lcmFzZShpdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpdCsrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1QZW5kaW5nU3RyZWFtcy5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICByZXMgPSBUaHJlYWQ6OnJ1bigiQzNQcmVwVGhyZWFkIiwgUFJJT1JJVFlfQkFDS0dST1VORCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBzdGFydCBwcmVwYXJlciBzdHJlYW06ICVkICglcykiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVzLCBzdHJlcnJvcigtcmVzKSk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIG1DYW5jZWxOb3cgPSBmYWxzZTsKKyAgICBtQWN0aXZlID0gdHJ1ZTsKKyAgICBBTE9HVigiJXM6IFByZXBhcmVyIHN0cmVhbSBzdGFydGVkIiwgX19GVU5DVElPTl9fKTsKKworICAgIHJldHVybiBPSzsKK30KKwogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6UHJlcGFyZXJUaHJlYWQ6OmNsZWFyKCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogCi0gICAgZm9yIChjb25zdCBhdXRvJiBzdHJlYW0gOiBtUGVuZGluZ1N0cmVhbXMpIHsKLSAgICAgICAgc3RyZWFtLT5jYW5jZWxQcmVwYXJlKCk7CisgICAgZm9yIChjb25zdCBhdXRvJiBpdCA6IG1QZW5kaW5nU3RyZWFtcykgeworICAgICAgICBpdC5zZWNvbmQtPmNhbmNlbFByZXBhcmUoKTsKICAgICB9CiAgICAgbVBlbmRpbmdTdHJlYW1zLmNsZWFyKCk7CiAgICAgbUNhbmNlbE5vdyA9IHRydWU7CkBAIC00OTE1LDEyICs1NjU0LDE1IEBACiAgICAgICAgICAgICAgICAgLy8gdGhyZWFkTG9vcCBfbXVzdCBub3RfIHJlLWFjcXVpcmUgbUxvY2sgYWZ0ZXIgaXQgc2V0cyBtQWN0aXZlIHRvIGZhbHNlOyB3b3VsZAogICAgICAgICAgICAgICAgIC8vIGNhdXNlIGRlYWRsb2NrIHdpdGggcHJlcGFyZSgpJ3MgcmVxdWVzdEV4aXRBbmRXYWl0IHRyaWdnZXJlZCBieSAhbUFjdGl2ZS4KICAgICAgICAgICAgICAgICBtQWN0aXZlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbVRocmVhZEFjdGl2ZVNpZ25hbC5zaWduYWwoKTsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIEdldCBuZXh0IHN0cmVhbSB0byBwcmVwYXJlCiAgICAgICAgICAgICBhdXRvIGl0ID0gbVBlbmRpbmdTdHJlYW1zLmJlZ2luKCk7Ci0gICAgICAgICAgICBtQ3VycmVudFN0cmVhbSA9ICppdDsKKyAgICAgICAgICAgIG1DdXJyZW50U3RyZWFtID0gaXQtPnNlY29uZDsKKyAgICAgICAgICAgIG1DdXJyZW50TWF4Q291bnQgPSBpdC0+Zmlyc3Q7CisgICAgICAgICAgICBtQ3VycmVudFByZXBhcmVDb21wbGV0ZSA9IGZhbHNlOwogICAgICAgICAgICAgbVBlbmRpbmdTdHJlYW1zLmVyYXNlKGl0KTsKICAgICAgICAgICAgIEFUUkFDRV9BU1lOQ19CRUdJTigic3RyZWFtIHByZXBhcmUiLCBtQ3VycmVudFN0cmVhbS0+Z2V0SWQoKSk7CiAgICAgICAgICAgICBBTE9HVigiJXM6IFByZXBhcmluZyBzdHJlYW0gJWQiLCBfX0ZVTkNUSU9OX18sIG1DdXJyZW50U3RyZWFtLT5nZXRJZCgpKTsKQEAgLTQ5NTUsNiArNTY5Nyw3IEBACiAKICAgICBBVFJBQ0VfQVNZTkNfRU5EKCJzdHJlYW0gcHJlcGFyZSIsIG1DdXJyZW50U3RyZWFtLT5nZXRJZCgpKTsKICAgICBtQ3VycmVudFN0cmVhbS5jbGVhcigpOworICAgIG1DdXJyZW50UHJlcGFyZUNvbXBsZXRlID0gdHJ1ZTsKIAogICAgIHJldHVybiB0cnVlOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaAppbmRleCAwODFhZjE5Li5kOGZlMTlmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDEzLTIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSA8dXRpbGl0eT4KICNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPHNldD4KIAogI2luY2x1ZGUgPHV0aWxzL0NvbmRpdGlvbi5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgpAQCAtMzEsNyArMzIsOSBAQAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjIvSUNhbWVyYURldmljZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjIvSUNhbWVyYURldmljZVNlc3Npb24uaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy4zL0lDYW1lcmFEZXZpY2VTZXNzaW9uLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNC9JQ2FtZXJhRGV2aWNlU2Vzc2lvbi5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjIvSUNhbWVyYURldmljZUNhbGxiYWNrLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNC9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2suaD4KICNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CiAjaW5jbHVkZSA8aGFyZHdhcmUvY2FtZXJhMy5oPgogCkBAIC00MCwxMCArNDMsMTMgQEAKICNpbmNsdWRlICJjb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oIgogI2luY2x1ZGUgImRldmljZTMvU3RhdHVzVHJhY2tlci5oIgogI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM0J1ZmZlck1hbmFnZXIuaCIKKyNpbmNsdWRlICJkZXZpY2UzL0Rpc3RvcnRpb25NYXBwZXIuaCIKICNpbmNsdWRlICJ1dGlscy9UYWdNb25pdG9yLmgiCiAjaW5jbHVkZSAidXRpbHMvTGF0ZW5jeUhpc3RvZ3JhbS5oIgogI2luY2x1ZGUgPGNhbWVyYV9tZXRhZGF0YV9oaWRkZW4uaD4KIAordXNpbmcgYW5kcm9pZDo6Y2FtZXJhMzo6T3V0cHV0U3RyZWFtSW5mbzsKKwogLyoqCiAgKiBGdW5jdGlvbiBwb2ludGVyIHR5cGVzIHdpdGggQyBjYWxsaW5nIGNvbnZlbnRpb24gdG8KICAqIHVzZSBmb3IgSEFMIGNhbGxiYWNrIGZ1bmN0aW9ucy4KQEAgLTc0LDcgKzgwLDcgQEAKICAqLwogY2xhc3MgQ2FtZXJhM0RldmljZSA6CiAgICAgICAgICAgICBwdWJsaWMgQ2FtZXJhRGV2aWNlQmFzZSwKLSAgICAgICAgICAgIHZpcnR1YWwgcHVibGljIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZUNhbGxiYWNrLAorICAgICAgICAgICAgdmlydHVhbCBwdWJsaWMgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2ssCiAgICAgICAgICAgICBwcml2YXRlIGNhbWVyYTNfY2FsbGJhY2tfb3BzIHsKICAgcHVibGljOgogCkBAIC04OCw4ICs5NCwxMCBAQAogCiAgICAgY29uc3QgU3RyaW5nOCYgZ2V0SWQoKSBjb25zdCBvdmVycmlkZTsKIAorICAgIG1ldGFkYXRhX3ZlbmRvcl9pZF90IGdldFZlbmRvclRhZ0lkKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbVZlbmRvclRhZ0lkOyB9CisKICAgICAvLyBUcmFuc2l0aW9ucyB0byBpZGxlIHN0YXRlIG9uIHN1Y2Nlc3MuCi0gICAgc3RhdHVzX3QgaW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGluaXRpYWxpemUoc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyLCBjb25zdCBTdHJpbmc4JiBtb25pdG9yVGFncykgb3ZlcnJpZGU7CiAgICAgc3RhdHVzX3QgZGlzY29ubmVjdCgpIG92ZXJyaWRlOwogICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSBvdmVycmlkZTsKICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgaW5mbygpIGNvbnN0IG92ZXJyaWRlOwpAQCAtOTcsMTIgKzEwNSwxMiBAQAogICAgIC8vIENhcHR1cmUgYW5kIHNldFN0cmVhbWluZ1JlcXVlc3Qgd2lsbCBjb25maWd1cmUgc3RyZWFtcyBpZiBjdXJyZW50bHkgaW4KICAgICAvLyBpZGxlIHN0YXRlCiAgICAgc3RhdHVzX3QgY2FwdHVyZShDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCwgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCkgb3ZlcnJpZGU7Ci0gICAgc3RhdHVzX3QgY2FwdHVyZUxpc3QoY29uc3QgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gJnJlcXVlc3RzLAorICAgIHN0YXR1c190IGNhcHR1cmVMaXN0KGNvbnN0IExpc3Q8Y29uc3QgUGh5c2ljYWxDYW1lcmFTZXR0aW5nc0xpc3Q+ICZyZXF1ZXN0c0xpc3QsCiAgICAgICAgICAgICBjb25zdCBzdGQ6Omxpc3Q8Y29uc3QgU3VyZmFjZU1hcD4gJnN1cmZhY2VNYXBzLAogICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCkgb3ZlcnJpZGU7CiAgICAgc3RhdHVzX3Qgc2V0U3RyZWFtaW5nUmVxdWVzdChjb25zdCBDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCwKICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpIG92ZXJyaWRlOwotICAgIHN0YXR1c190IHNldFN0cmVhbWluZ1JlcXVlc3RMaXN0KGNvbnN0IExpc3Q8Y29uc3QgQ2FtZXJhTWV0YWRhdGE+ICZyZXF1ZXN0cywKKyAgICBzdGF0dXNfdCBzZXRTdHJlYW1pbmdSZXF1ZXN0TGlzdChjb25zdCBMaXN0PGNvbnN0IFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NMaXN0PiAmcmVxdWVzdHNMaXN0LAogICAgICAgICAgICAgY29uc3Qgc3RkOjpsaXN0PGNvbnN0IFN1cmZhY2VNYXA+ICZzdXJmYWNlTWFwcywKICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpIG92ZXJyaWRlOwogICAgIHN0YXR1c190IGNsZWFyU3RyZWFtaW5nUmVxdWVzdChpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKSBvdmVycmlkZTsKQEAgLTExNywxMSArMTI1LDE1IEBACiAgICAgc3RhdHVzX3QgY3JlYXRlU3RyZWFtKHNwPFN1cmZhY2U+IGNvbnN1bWVyLAogICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKICAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgaW50ICppZCwKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+ICpzdXJmYWNlSWRzID0gbnVsbHB0ciwKICAgICAgICAgICAgIGludCBzdHJlYW1TZXRJZCA9IGNhbWVyYTM6OkNBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElELAogICAgICAgICAgICAgYm9vbCBpc1NoYXJlZCA9IGZhbHNlLCB1aW50NjRfdCBjb25zdW1lclVzYWdlID0gMCkgb3ZlcnJpZGU7CiAgICAgc3RhdHVzX3QgY3JlYXRlU3RyZWFtKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgY29uc3VtZXJzLAogICAgICAgICAgICAgYm9vbCBoYXNEZWZlcnJlZENvbnN1bWVyLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAogICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBpbnQgKmlkLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gKnN1cmZhY2VJZHMgPSBudWxscHRyLAogICAgICAgICAgICAgaW50IHN0cmVhbVNldElkID0gY2FtZXJhMzo6Q0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQsCiAgICAgICAgICAgICBib29sIGlzU2hhcmVkID0gZmFsc2UsIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UgPSAwKSBvdmVycmlkZTsKIApAQCAtMTM0LDcgKzE0Niw4IEBACiAKICAgICBzdGF0dXNfdCBkZWxldGVTdHJlYW0oaW50IGlkKSBvdmVycmlkZTsKIAotICAgIHN0YXR1c190IGNvbmZpZ3VyZVN0cmVhbXMoaW50IG9wZXJhdGluZ01vZGUgPQorICAgIHN0YXR1c190IGNvbmZpZ3VyZVN0cmVhbXMoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHNlc3Npb25QYXJhbXMsCisgICAgICAgICAgICBpbnQgb3BlcmF0aW5nTW9kZSA9CiAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtQ29uZmlndXJhdGlvbk1vZGU6Ok5PUk1BTF9NT0RFKSkKICAgICAgICAgICAgIG92ZXJyaWRlOwogICAgIHN0YXR1c190IGdldElucHV0QnVmZmVyUHJvZHVjZXIoCkBAIC0xNzYsNyArMTg5LDE3IEBACiAgICAgICogU2V0IHRoZSBkZWZlcnJlZCBjb25zdW1lciBzdXJmYWNlcyB0byB0aGUgb3V0cHV0IHN0cmVhbSBhbmQgZmluaXNoIHRoZSBkZWZlcnJlZAogICAgICAqIGNvbnN1bWVyIGNvbmZpZ3VyYXRpb24uCiAgICAgICovCi0gICAgc3RhdHVzX3Qgc2V0Q29uc3VtZXJTdXJmYWNlcyhpbnQgc3RyZWFtSWQsIGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgY29uc3VtZXJzKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBzZXRDb25zdW1lclN1cmZhY2VzKAorICAgICAgICAgICAgaW50IHN0cmVhbUlkLCBjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4mIGNvbnN1bWVycywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gKnN1cmZhY2VJZHMgLypvdXQqLykgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGUgYSBnaXZlbiBzdHJlYW0uCisgICAgICovCisgICAgc3RhdHVzX3QgdXBkYXRlU3RyZWFtKGludCBzdHJlYW1JZCwgY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+ICZuZXdTdXJmYWNlcywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE91dHB1dFN0cmVhbUluZm8+ICZvdXRwdXRJbmZvLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiAmcmVtb3ZlZFN1cmZhY2VJZHMsCisgICAgICAgICAgICBLZXllZFZlY3RvcjxzcDxTdXJmYWNlPiwgc2l6ZV90PiAqb3V0cHV0TWFwLypvdXQqLyk7CiAKICAgICAvKioKICAgICAgKiBEcm9wIGJ1ZmZlcnMgZm9yIHN0cmVhbSBvZiBzdHJlYW1JZCBpZiBkcm9wcGluZyBpcyB0cnVlLiBJZiBkcm9wcGluZyBpcyBmYWxzZSwgZG8gbm90CkBAIC0yMjIsNiArMjQ1LDkgQEAKIAogICAgIC8vIEN1cnJlbnQgc3RyZWFtIGNvbmZpZ3VyYXRpb24gbW9kZTsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBtT3BlcmF0aW5nTW9kZTsKKyAgICAvLyBDdXJyZW50IHNlc3Npb24gd2lkZSBwYXJhbWV0ZXJzCisgICAgaGFyZHdhcmU6OmNhbWVyYTI6OmltcGw6OkNhbWVyYU1ldGFkYXRhTmF0aXZlIG1TZXNzaW9uUGFyYW1zOworCiAgICAgLy8gQ29uc3RhbnQgdG8gdXNlIGZvciBubyBzZXQgb3BlcmF0aW5nIG1vZGUKICAgICBzdGF0aWMgY29uc3QgaW50ICAgICAgICAgICBOT19NT0RFID0gLTE7CiAKQEAgLTI1OCw3ICsyODQsOSBAQAogICAgICAgICAvLyBDYWxsZXIgdGFrZXMgb3duZXJzaGlwIG9mIHJlcXVlc3RUZW1wbGF0ZQogICAgICAgICBzdGF0dXNfdCBjb25zdHJ1Y3REZWZhdWx0UmVxdWVzdFNldHRpbmdzKGNhbWVyYTNfcmVxdWVzdF90ZW1wbGF0ZV90IHRlbXBsYXRlSWQsCiAgICAgICAgICAgICAgICAgLypvdXQqLyBjYW1lcmFfbWV0YWRhdGFfdCAqKnJlcXVlc3RUZW1wbGF0ZSk7Ci0gICAgICAgIHN0YXR1c190IGNvbmZpZ3VyZVN0cmVhbXMoLyppbm91dCovIGNhbWVyYTNfc3RyZWFtX2NvbmZpZ3VyYXRpb24gKmNvbmZpZyk7CisgICAgICAgIHN0YXR1c190IGNvbmZpZ3VyZVN0cmVhbXMoY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnNlc3Npb25QYXJhbXMsCisgICAgICAgICAgICAgICAgLyppbm91dCovIGNhbWVyYTNfc3RyZWFtX2NvbmZpZ3VyYXRpb24gKmNvbmZpZywKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4mIGJ1ZmZlclNpemVzKTsKICAgICAgICAgc3RhdHVzX3QgcHJvY2Vzc0NhcHR1cmVSZXF1ZXN0KGNhbWVyYTNfY2FwdHVyZV9yZXF1ZXN0X3QgKnJlcXVlc3QpOwogICAgICAgICBzdGF0dXNfdCBwcm9jZXNzQmF0Y2hDYXB0dXJlUmVxdWVzdHMoCiAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCo+JiByZXF1ZXN0cywKQEAgLTI3Niw3ICszMDQsMTMgQEAKICAgICAgICAgdm9pZCBnZXRJbmZsaWdodEJ1ZmZlcktleXMoc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+Piogb3V0KTsKIAogICAgICAgcHJpdmF0ZToKKyAgICAgICAgLy8gQWx3YXlzIHZhbGlkCiAgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZVNlc3Npb24+IG1IaWRsU2Vzc2lvbjsKKyAgICAgICAgLy8gVmFsaWQgaWYgSUNhbWVyYURldmljZVNlc3Npb24gaXMgQDMuMyBvciBuZXdlcgorICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzM6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiBtSGlkbFNlc3Npb25fM18zOworICAgICAgICAvLyBWYWxpZCBpZiBJQ2FtZXJhRGV2aWNlU2Vzc2lvbiBpcyBAMy40IG9yIG5ld2VyCisgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6SUNhbWVyYURldmljZVNlc3Npb24+IG1IaWRsU2Vzc2lvbl8zXzQ7CisKICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBtUmVxdWVzdE1ldGFkYXRhUXVldWU7CiAKICAgICAgICAgc3RkOjptdXRleCBtSW5mbGlnaHRMb2NrOwpAQCAtNDA3LDcgKzQ0MSw3IEBACiAKICAgICBjbGFzcyBDYXB0dXJlUmVxdWVzdCA6IHB1YmxpYyBMaWdodFJlZkJhc2U8Q2FwdHVyZVJlcXVlc3Q+IHsKICAgICAgIHB1YmxpYzoKLSAgICAgICAgQ2FtZXJhTWV0YWRhdGEgICAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzOworICAgICAgICBQaHlzaWNhbENhbWVyYVNldHRpbmdzTGlzdCAgICAgICAgICBtU2V0dGluZ3NMaXN0OwogICAgICAgICBzcDxjYW1lcmEzOjpDYW1lcmEzU3RyZWFtPiAgICAgICAgICBtSW5wdXRTdHJlYW07CiAgICAgICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90ICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlcjsKICAgICAgICAgVmVjdG9yPHNwPGNhbWVyYTM6OkNhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+ID4KQEAgLTQyNywyNiArNDYxLDI4IEBACiAgICAgc3RhdHVzX3QgY2hlY2tTdGF0dXNPa1RvQ2FwdHVyZUxvY2tlZCgpOwogCiAgICAgc3RhdHVzX3QgY29udmVydE1ldGFkYXRhTGlzdFRvUmVxdWVzdExpc3RMb2NrZWQoCi0gICAgICAgICAgICBjb25zdCBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiAmbWV0YWRhdGFMaXN0LAorICAgICAgICAgICAgY29uc3QgTGlzdDxjb25zdCBQaHlzaWNhbENhbWVyYVNldHRpbmdzTGlzdD4gJm1ldGFkYXRhTGlzdCwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bGlzdDxjb25zdCBTdXJmYWNlTWFwPiAmc3VyZmFjZU1hcHMsCiAgICAgICAgICAgICBib29sIHJlcGVhdGluZywKICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgIFJlcXVlc3RMaXN0ICpyZXF1ZXN0TGlzdCk7CiAKLSAgICB2b2lkIGNvbnZlcnRUb1JlcXVlc3RMaXN0KExpc3Q8Y29uc3QgQ2FtZXJhTWV0YWRhdGE+JiByZXF1ZXN0cywKKyAgICB2b2lkIGNvbnZlcnRUb1JlcXVlc3RMaXN0KExpc3Q8Y29uc3QgUGh5c2ljYWxDYW1lcmFTZXR0aW5nc0xpc3Q+JiByZXF1ZXN0c0xpc3QsCiAgICAgICAgICAgICBzdGQ6Omxpc3Q8Y29uc3QgU3VyZmFjZU1hcD4mIHN1cmZhY2VNYXBzLAogICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHJlcXVlc3QpOwogCi0gICAgc3RhdHVzX3Qgc3VibWl0UmVxdWVzdHNIZWxwZXIoY29uc3QgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gJnJlcXVlc3RzLAorICAgIHN0YXR1c190IHN1Ym1pdFJlcXVlc3RzSGVscGVyKGNvbnN0IExpc3Q8Y29uc3QgUGh5c2ljYWxDYW1lcmFTZXR0aW5nc0xpc3Q+ICZyZXF1ZXN0c0xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpsaXN0PGNvbnN0IFN1cmZhY2VNYXA+ICZzdXJmYWNlTWFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlcGVhdGluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKIAogCiAgICAgLyoqCi0gICAgICogSW1wbGVtZW50YXRpb24gb2YgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2sKKyAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OklDYW1lcmFEZXZpY2VDYWxsYmFjawogICAgICAqLwotCisgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiBwcm9jZXNzQ2FwdHVyZVJlc3VsdF8zXzQoCisgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8CisgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6Q2FwdHVyZVJlc3VsdD4mIHJlc3VsdHMpIG92ZXJyaWRlOwogICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcHJvY2Vzc0NhcHR1cmVSZXN1bHQoCiAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8CiAgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FwdHVyZVJlc3VsdD4mIHJlc3VsdHMpIG92ZXJyaWRlOwpAQCAtNDU2LDcgKzQ5MiwxMyBAQAogCiAgICAgLy8gSGFuZGxlIG9uZSBjYXB0dXJlIHJlc3VsdC4gQXNzdW1lIHRoYXQgbVByb2Nlc3NDYXB0dXJlUmVzdWx0TG9jayBpcyBoZWxkLgogICAgIHZvaWQgcHJvY2Vzc09uZUNhcHR1cmVSZXN1bHRMb2NrZWQoCi0gICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkNhcHR1cmVSZXN1bHQmIHJlc3VsdHMpOworICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpDYXB0dXJlUmVzdWx0JiByZXN1bHQsCisgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8CisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlBoeXNpY2FsQ2FtZXJhTWV0YWRhdGE+IHBoeXNpY2FsQ2FtZXJhTWV0YWRhdGFzKTsKKyAgICBzdGF0dXNfdCByZWFkT25lQ2FtZXJhTWV0YWRhdGFMb2NrZWQodWludDY0X3QgZm1xUmVzdWx0U2l6ZSwKKyAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FtZXJhTWV0YWRhdGEmIHJlc3VsdE1ldGFkYXRhLAorICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpDYW1lcmFNZXRhZGF0YSYgcmVzdWx0KTsKKwogICAgIC8vIEhhbmRsZSBvbmUgbm90aWZ5IG1lc3NhZ2UKICAgICB2b2lkIG5vdGlmeShjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6Ok5vdGlmeU1zZyYgbXNnKTsKIApAQCAtNTIyLDIxICs1NjQsNDEgQEAKICAgICAgKiBEbyBjb21tb24gd29yayBmb3Igc2V0dGluZyB1cCBhIHN0cmVhbWluZyBvciBzaW5nbGUgY2FwdHVyZSByZXF1ZXN0LgogICAgICAqIE9uIHN1Y2Nlc3MsIHdpbGwgdHJhbnNpdGlvbiB0byBBQ1RJVkUgaWYgaW4gSURMRS4KICAgICAgKi8KLSAgICBzcDxDYXB0dXJlUmVxdWVzdD4gc2V0VXBSZXF1ZXN0TG9ja2VkKGNvbnN0IENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0LAorICAgIHNwPENhcHR1cmVSZXF1ZXN0PiBzZXRVcFJlcXVlc3RMb2NrZWQoY29uc3QgUGh5c2ljYWxDYW1lcmFTZXR0aW5nc0xpc3QgJnJlcXVlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdXJmYWNlTWFwICZzdXJmYWNlTWFwKTsKIAogICAgIC8qKgogICAgICAqIEJ1aWxkIGEgQ2FwdHVyZVJlcXVlc3QgcmVxdWVzdCBmcm9tIHRoZSBDYW1lcmFEZXZpY2VCYXNlIHJlcXVlc3QKICAgICAgKiBzZXR0aW5ncy4KICAgICAgKi8KLSAgICBzcDxDYXB0dXJlUmVxdWVzdD4gY3JlYXRlQ2FwdHVyZVJlcXVlc3QoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QsCisgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IGNyZWF0ZUNhcHR1cmVSZXF1ZXN0KGNvbnN0IFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NMaXN0ICZyZXF1ZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdXJmYWNlTWFwICZzdXJmYWNlTWFwKTsKIAogICAgIC8qKgorICAgICAqIFBhdXNlIHN0YXRlIHVwZGF0ZXMgdG8gdGhlIGNsaWVudCBhcHBsaWNhdGlvbi4gIE5lZWRlZCB0byBtYXNrIG91dCBpZGxlL2FjdGl2ZQorICAgICAqIHRyYW5zaXRpb25zIGR1cmluZyBpbnRlcm5hbCByZWNvbmZpZ3VyZQorICAgICAqLworICAgIHZvaWQgcGF1c2VTdGF0ZU5vdGlmeShib29sIGVuYWJsZSk7CisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbGx5IHJlLWNvbmZpZ3VyZSBjYW1lcmEgZGV2aWNlIHVzaW5nIG5ldyBzZXNzaW9uIHBhcmFtZXRlcnMuCisgICAgICogVGhpcyB3aWxsIGdldCB0cmlnZ2VyZWQgYnkgdGhlIHJlcXVlc3QgdGhyZWFkLiBCZSBzdXJlIHRvIGNhbGwKKyAgICAgKiBwYXVzZVN0YXRlTm90aWZ5KHRydWUpIGJlZm9yZSBnb2luZyBpZGxlIGluIHRoZSByZXF1ZXN0aW5nIGxvY2F0aW9uLgorICAgICAqLworICAgIGJvb2wgcmVjb25maWd1cmVDYW1lcmEoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHNlc3Npb25QYXJhbXMpOworCisgICAgLyoqCisgICAgICogRmlsdGVyIHN0cmVhbSBzZXNzaW9uIHBhcmFtZXRlcnMgYW5kIGNvbmZpZ3VyZSBjYW1lcmEgSEFMLgorICAgICAqLworICAgIHN0YXR1c190IGZpbHRlclBhcmFtc0FuZENvbmZpZ3VyZUxvY2tlZChjb25zdCBDYW1lcmFNZXRhZGF0YSYgc2Vzc2lvblBhcmFtcywKKyAgICAgICAgICAgIGludCBvcGVyYXRpbmdNb2RlKTsKKworICAgIC8qKgogICAgICAqIFRha2UgdGhlIGN1cnJlbnRseS1kZWZpbmVkIHNldCBvZiBzdHJlYW1zIGFuZCBjb25maWd1cmUgdGhlIEhBTCB0byB1c2UKICAgICAgKiB0aGVtLiBUaGlzIGlzIGEgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbiAobWF5IGJlIHNldmVyYWwgaHVuZGVyZWQgbXMpLgogICAgICAqLwotICAgIHN0YXR1c190ICAgICAgICAgICBjb25maWd1cmVTdHJlYW1zTG9ja2VkKGludCBvcGVyYXRpbmdNb2RlKTsKKyAgICBzdGF0dXNfdCAgICAgICAgICAgY29uZmlndXJlU3RyZWFtc0xvY2tlZChpbnQgb3BlcmF0aW5nTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzZXNzaW9uUGFyYW1zLCBib29sIG5vdGlmeVJlcXVlc3RUaHJlYWQgPSB0cnVlKTsKIAogICAgIC8qKgogICAgICAqIENhbmNlbCBzdHJlYW0gY29uZmlndXJhdGlvbiB0aGF0IGRpZCBub3QgZmluaXNoIHN1Y2Nlc3NmdWxseS4KQEAgLTYzNSw3ICs2OTcsNyBAQAogCiAgICAgICAgIFJlcXVlc3RUaHJlYWQod3A8Q2FtZXJhM0RldmljZT4gcGFyZW50LAogICAgICAgICAgICAgICAgIHNwPGNhbWVyYTM6OlN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIsCi0gICAgICAgICAgICAgICAgc3A8SGFsSW50ZXJmYWNlPiBpbnRlcmZhY2UpOworICAgICAgICAgICAgICAgIHNwPEhhbEludGVyZmFjZT4gaW50ZXJmYWNlLCBjb25zdCBWZWN0b3I8aW50MzJfdD4mIHNlc3Npb25QYXJhbUtleXMpOwogICAgICAgICB+UmVxdWVzdFRocmVhZCgpOwogCiAgICAgICAgIHZvaWQgICAgIHNldE5vdGlmaWNhdGlvbkxpc3RlbmVyKHdwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcik7CkBAIC02NDMsNyArNzA1LDggQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIENhbGwgYWZ0ZXIgc3RyZWFtIChyZSktY29uZmlndXJhdGlvbiBpcyBjb21wbGV0ZWQuCiAgICAgICAgICAqLwotICAgICAgICB2b2lkICAgICBjb25maWd1cmF0aW9uQ29tcGxldGUoYm9vbCBpc0NvbnN0cmFpbmVkSGlnaFNwZWVkKTsKKyAgICAgICAgdm9pZCAgICAgY29uZmlndXJhdGlvbkNvbXBsZXRlKGJvb2wgaXNDb25zdHJhaW5lZEhpZ2hTcGVlZCwKKyAgICAgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgc2Vzc2lvblBhcmFtcyk7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFNldCBvciBjbGVhciB0aGUgbGlzdCBvZiByZXBlYXRpbmcgcmVxdWVzdHMuIERvZXMgbm90IGJsb2NrCkBAIC03MTEsNiArNzc0LDEyIEBACiAgICAgICAgICAqLwogICAgICAgICBib29sIGlzU3RyZWFtUGVuZGluZyhzcDxjYW1lcmEzOjpDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiYgc3RyZWFtKTsKIAorICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzdXJmYWNlIGlzIGEgdGFyZ2V0IG9mIGFueSBxdWV1ZWQgb3IgcmVwZWF0aW5nCisgICAgICAgICAqIGNhcHR1cmUgcmVxdWVzdAorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBpc091dHB1dFN1cmZhY2VQZW5kaW5nKGludCBzdHJlYW1JZCwgc2l6ZV90IHN1cmZhY2VJZCk7CisKICAgICAgICAgLy8gZHVtcCBwcm9jZXNzQ2FwdHVyZVJlcXVlc3QgbGF0ZW5jeQogICAgICAgICB2b2lkIGR1bXBDYXB0dXJlUmVxdWVzdExhdGVuY3koaW50IGZkLCBjb25zdCBjaGFyKiBuYW1lKSB7CiAgICAgICAgICAgICBtUmVxdWVzdExhdGVuY3kuZHVtcChmZCwgbmFtZSk7CkBAIC03NjQsNiArODMzLDEwIEBACiAgICAgICAgIC8vIFN0b3AgdGhlIHJlcGVhdGluZyByZXF1ZXN0IGlmIGFueSBvZiBpdHMgb3V0cHV0IHN0cmVhbXMgaXMgYWJhbmRvbmVkLgogICAgICAgICB2b2lkIGNoZWNrQW5kU3RvcFJlcGVhdGluZ1JlcXVlc3QoKTsKIAorICAgICAgICAvLyBSZWxlYXNlIHBoeXNpY2FsIGNhbWVyYSBzZXR0aW5ncyBhbmQgY2FtZXJhIGlkIHJlc291cmNlcy4KKyAgICAgICAgdm9pZCBjbGVhbnVwUGh5c2ljYWxTZXR0aW5ncyhzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAvKm91dCovY2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCAqaGFsUmVxdWVzdCk7CisKICAgICAgICAgLy8gUGF1c2UgaGFuZGxpbmcKICAgICAgICAgYm9vbCAgICAgICAgICAgICAgIHdhaXRJZlBhdXNlZCgpOwogICAgICAgICB2b2lkICAgICAgICAgICAgICAgdW5wYXVzZUZvck5ld1JlcXVlc3RzKCk7CkBAIC03ODYsNiArODU5LDE3IEBACiAgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgZXhwZWN0ZWQgbWF4aW11bSBkdXJhdGlvbiBmb3IgYSByZXF1ZXN0CiAgICAgICAgIG5zZWNzX3QgY2FsY3VsYXRlTWF4RXhwZWN0ZWREdXJhdGlvbihjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqcmVxdWVzdCk7CiAKKyAgICAgICAgLy8gQ2hlY2sgYW5kIHVwZGF0ZSBsYXRlc3Qgc2Vzc2lvbiBwYXJhbWV0ZXJzIGJhc2VkIG9uIHRoZSBjdXJyZW50IHJlcXVlc3Qgc2V0dGluZ3MuCisgICAgICAgIGJvb2wgdXBkYXRlU2Vzc2lvblBhcmFtZXRlcnMoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHNldHRpbmdzKTsKKworICAgICAgICAvLyBDaGVjayB3aGV0aGVyIEZQUyByYW5nZSBzZXNzaW9uIHBhcmFtZXRlciByZS1jb25maWd1cmF0aW9uIGlzIG5lZWRlZCBpbiBjb25zdHJhaW5lZAorICAgICAgICAvLyBoaWdoIHNwZWVkIHJlY29yZGluZyBjYW1lcmEgc2Vzc2lvbnMuCisgICAgICAgIGJvb2wgc2tpcEhGUlRhcmdldEZQU1VwZGF0ZShpbnQzMl90IHRhZywgY29uc3QgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QmIG5ld0VudHJ5LAorICAgICAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90JiBjdXJyZW50RW50cnkpOworCisgICAgICAgIC8vIFJlLWNvbmZpZ3VyZSBjYW1lcmEgdXNpbmcgdGhlIGxhdGVzdCBzZXNzaW9uIHBhcmFtZXRlcnMuCisgICAgICAgIGJvb2wgcmVjb25maWd1cmVDYW1lcmEoKTsKKwogICAgICAgICB3cDxDYW1lcmEzRGV2aWNlPiAgbVBhcmVudDsKICAgICAgICAgd3A8Y2FtZXJhMzo6U3RhdHVzVHJhY2tlcj4gIG1TdGF0dXNUcmFja2VyOwogICAgICAgICBzcDxIYWxJbnRlcmZhY2U+ICAgbUludGVyZmFjZTsKQEAgLTg0MSw4ICs5MjUsMTMgQEAKICAgICAgICAgLy8gRmxhZyBpbmRpY2F0aW5nIGlmIHdlIHNob3VsZCBwcmVwYXJlIHZpZGVvIHN0cmVhbSBmb3IgdmlkZW8gcmVxdWVzdHMuCiAgICAgICAgIGJvb2wgICAgICAgICAgICAgICBtUHJlcGFyZVZpZGVvU3RyZWFtOwogCisgICAgICAgIGJvb2wgICAgICAgICAgICAgICBtQ29uc3RyYWluZWRNb2RlOworCiAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtSZXF1ZXN0TGF0ZW5jeUJpblNpemUgPSA0MDsgLy8gaW4gbXMKICAgICAgICAgQ2FtZXJhTGF0ZW5jeUhpc3RvZ3JhbSBtUmVxdWVzdExhdGVuY3k7CisKKyAgICAgICAgVmVjdG9yPGludDMyX3Q+ICAgIG1TZXNzaW9uUGFyYW1LZXlzOworICAgICAgICBDYW1lcmFNZXRhZGF0YSAgICAgbUxhdGVzdFNlc3Npb25QYXJhbXM7CiAgICAgfTsKICAgICBzcDxSZXF1ZXN0VGhyZWFkPiBtUmVxdWVzdFRocmVhZDsKIApAQCAtODk3LDYgKzk4NiwxMiBAQAogICAgICAgICAvLyBSRVFVRVNUL1JFU1VMVCBlcnJvci4KICAgICAgICAgYm9vbCBza2lwUmVzdWx0TWV0YWRhdGE7CiAKKyAgICAgICAgLy8gVGhlIHBoeXNpY2FsIGNhbWVyYSBpZHMgYmVpbmcgcmVxdWVzdGVkLgorICAgICAgICBzdGQ6OnNldDxTdHJpbmc4PiBwaHlzaWNhbENhbWVyYUlkczsKKworICAgICAgICAvLyBNYXAgb2YgcGh5c2ljYWxDYW1lcmFJZCA8LT4gTWV0YWRhdGEKKyAgICAgICAgc3RkOjp2ZWN0b3I8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4gcGh5c2ljYWxNZXRhZGF0YXM7CisKICAgICAgICAgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvciBuZWVkZWQgYnkgS2V5ZWRWZWN0b3IKICAgICAgICAgSW5GbGlnaHRSZXF1ZXN0KCkgOgogICAgICAgICAgICAgICAgIHNodXR0ZXJUaW1lc3RhbXAoMCksCkBAIC05MTEsNyArMTAwNiw4IEBACiAgICAgICAgIH0KIAogICAgICAgICBJbkZsaWdodFJlcXVlc3QoaW50IG51bUJ1ZmZlcnMsIENhcHR1cmVSZXN1bHRFeHRyYXMgZXh0cmFzLCBib29sIGhhc0lucHV0LAotICAgICAgICAgICAgICAgIGJvb2wgaGFzQXBwQ2FsbGJhY2ssIG5zZWNzX3QgbWF4RHVyYXRpb24pIDoKKyAgICAgICAgICAgICAgICBib29sIGhhc0FwcENhbGxiYWNrLCBuc2Vjc190IG1heER1cmF0aW9uLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PFN0cmluZzg+JiBwaHlzaWNhbENhbWVyYUlkU2V0KSA6CiAgICAgICAgICAgICAgICAgc2h1dHRlclRpbWVzdGFtcCgwKSwKICAgICAgICAgICAgICAgICBzZW5zb3JUaW1lc3RhbXAoMCksCiAgICAgICAgICAgICAgICAgcmVxdWVzdFN0YXR1cyhPSyksCkBAIC05MjEsNyArMTAxNyw4IEBACiAgICAgICAgICAgICAgICAgaGFzSW5wdXRCdWZmZXIoaGFzSW5wdXQpLAogICAgICAgICAgICAgICAgIGhhc0NhbGxiYWNrKGhhc0FwcENhbGxiYWNrKSwKICAgICAgICAgICAgICAgICBtYXhFeHBlY3RlZER1cmF0aW9uKG1heER1cmF0aW9uKSwKLSAgICAgICAgICAgICAgICBza2lwUmVzdWx0TWV0YWRhdGEoZmFsc2UpIHsKKyAgICAgICAgICAgICAgICBza2lwUmVzdWx0TWV0YWRhdGEoZmFsc2UpLAorICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWRzKHBoeXNpY2FsQ2FtZXJhSWRTZXQpIHsKICAgICAgICAgfQogICAgIH07CiAKQEAgLTkzOCw3ICsxMDM1LDcgQEAKIAogICAgIHN0YXR1c190IHJlZ2lzdGVySW5GbGlnaHQodWludDMyX3QgZnJhbWVOdW1iZXIsCiAgICAgICAgICAgICBpbnQzMl90IG51bUJ1ZmZlcnMsIENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzLCBib29sIGhhc0lucHV0LAotICAgICAgICAgICAgYm9vbCBjYWxsYmFjaywgbnNlY3NfdCBtYXhFeHBlY3RlZER1cmF0aW9uKTsKKyAgICAgICAgICAgIGJvb2wgY2FsbGJhY2ssIG5zZWNzX3QgbWF4RXhwZWN0ZWREdXJhdGlvbiwgc3RkOjpzZXQ8U3RyaW5nOD4mIHBoeXNpY2FsQ2FtZXJhSWRzKTsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gZXhwZWN0ZWQgdGltZSBpdCdsbCB0YWtlIGZvciBhbGwgY3VycmVudGx5IGluLWZsaWdodApAQCAtOTgwLDIxICsxMDc3LDM0IEBACiAgICAgICAgICAqLwogICAgICAgICBzdGF0dXNfdCBjbGVhcigpOwogCisgICAgICAgIC8qKgorICAgICAgICAgKiBQYXVzZSBhbGwgcHJlcGFyYXRpb24gYWN0aXZpdGllcworICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBwYXVzZSgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXN1bWUgcHJlcGFyYXRpb24gYWN0aXZpdGllcworICAgICAgICAgKi8KKyAgICAgICAgc3RhdHVzX3QgcmVzdW1lKCk7CisKICAgICAgIHByaXZhdGU6CiAgICAgICAgIE11dGV4IG1Mb2NrOworICAgICAgICBDb25kaXRpb24gbVRocmVhZEFjdGl2ZVNpZ25hbDsKIAogICAgICAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpOwogCiAgICAgICAgIC8vIEd1YXJkZWQgYnkgbUxvY2sKIAogICAgICAgICB3cDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gbUxpc3RlbmVyOwotICAgICAgICBMaXN0PHNwPGNhbWVyYTM6OkNhbWVyYTNTdHJlYW1JbnRlcmZhY2U+ID4gbVBlbmRpbmdTdHJlYW1zOworICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50LCBzcDxjYW1lcmEzOjpDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiA+IG1QZW5kaW5nU3RyZWFtczsKICAgICAgICAgYm9vbCBtQWN0aXZlOwogICAgICAgICBib29sIG1DYW5jZWxOb3c7CiAKICAgICAgICAgLy8gT25seSBhY2Nlc3NlZCBieSB0aHJlYWRMb29wIGFuZCB0aGUgZGVzdHJ1Y3RvcgogCiAgICAgICAgIHNwPGNhbWVyYTM6OkNhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IG1DdXJyZW50U3RyZWFtOworICAgICAgICBpbnQgbUN1cnJlbnRNYXhDb3VudDsKKyAgICAgICAgYm9vbCBtQ3VycmVudFByZXBhcmVDb21wbGV0ZTsKICAgICB9OwogICAgIHNwPFByZXBhcmVyVGhyZWFkPiBtUHJlcGFyZXJUaHJlYWQ7CiAKQEAgLTEwNDYsNyArMTE1Niw5IEBACiAgICAgdm9pZCBzZW5kQ2FwdHVyZVJlc3VsdChDYW1lcmFNZXRhZGF0YSAmcGVuZGluZ01ldGFkYXRhLAogICAgICAgICAgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcyAmcmVzdWx0RXh0cmFzLAogICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgJmNvbGxlY3RlZFBhcnRpYWxSZXN1bHQsIHVpbnQzMl90IGZyYW1lTnVtYmVyLAotICAgICAgICAgICAgYm9vbCByZXByb2Nlc3MpOworICAgICAgICAgICAgYm9vbCByZXByb2Nlc3MsIGNvbnN0IHN0ZDo6dmVjdG9yPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+JiBwaHlzaWNhbE1ldGFkYXRhcyk7CisKKyAgICBib29sIGlzTGFzdEZ1bGxSZXN1bHQoY29uc3QgSW5GbGlnaHRSZXF1ZXN0JiBpbkZsaWdodFJlcXVlc3QpOwogCiAgICAgLy8gSW5zZXJ0IHRoZSByZXN1bHQgdG8gdGhlIHJlc3VsdCBxdWV1ZSBhZnRlciB1cGRhdGluZyBmcmFtZSBudW1iZXIgYW5kIG92ZXJyaWRpbmcgQUUKICAgICAvLyB0cmlnZ2VyIGNhbmNlbC4KQEAgLTEwNjgsNiArMTE4MCwxMiBAQAogCiAgICAgLyoqKiogRW5kIHNjb3BlIGZvciBtSW5GbGlnaHRMb2NrICoqKiovCiAKKyAgICAvKioKKyAgICAgKiBEaXN0b3J0aW9uIGNvcnJlY3Rpb24gc3VwcG9ydAorICAgICAqLworCisgICAgY2FtZXJhMzo6RGlzdG9ydGlvbk1hcHBlciBtRGlzdG9ydGlvbk1hcHBlcjsKKwogICAgIC8vIERlYnVnIHRyYWNrZXIgZm9yIG1ldGFkYXRhIHRhZyB2YWx1ZSBjaGFuZ2VzCiAgICAgLy8gLSBFbmFibGVkIHdpdGggdGhlIC1tIDx0YWdsaXN0PiBvcHRpb24gdG8gZHVtcHN5cywgc3VjaCBhcwogICAgIC8vICAgZHVtcHN5cyAtbSBhbmRyb2lkLmNvbnRyb2wuYWVTdGF0ZSxhbmRyb2lkLmNvbnRyb2wuYWVNb2RlCkBAIC0xMDgwLDYgKzExOTgsOSBAQAogCiAgICAgbWV0YWRhdGFfdmVuZG9yX2lkX3QgbVZlbmRvclRhZ0lkOwogCisgICAgLy8gQ2FjaGVkIGxhc3QgcmVxdWVzdGVkIHRlbXBsYXRlIGlkCisgICAgaW50IG1MYXN0VGVtcGxhdGVJZDsKKwogICAgIC8qKgogICAgICAqIFN0YXRpYyBjYWxsYmFjayBmb3J3YXJkaW5nIG1ldGhvZHMgZnJvbSBIQUwgdG8gaW5zdGFuY2UKICAgICAgKi8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmNwcAppbmRleCA4NGZiODkwLi5mYjFmZjc3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uY3BwCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0yNiw5ICsyNiwxMiBAQAogCiBuYW1lc3BhY2UgY2FtZXJhMyB7CiAKK2NvbnN0IFN0cmluZzggQ2FtZXJhM0R1bW15U3RyZWFtOjpEVU1NWV9JRDsKKwogQ2FtZXJhM0R1bW15U3RyZWFtOjpDYW1lcmEzRHVtbXlTdHJlYW0oaW50IGlkKSA6CiAgICAgICAgIENhbWVyYTNJT1N0cmVhbUJhc2UoaWQsIENBTUVSQTNfU1RSRUFNX09VVFBVVCwgRFVNTVlfV0lEVEgsIERVTU1ZX0hFSUdIVCwKLSAgICAgICAgICAgICAgICAvKm1heFNpemUqLzAsIERVTU1ZX0ZPUk1BVCwgRFVNTVlfREFUQVNQQUNFLCBEVU1NWV9ST1RBVElPTikgeworICAgICAgICAgICAgICAgIC8qbWF4U2l6ZSovMCwgRFVNTVlfRk9STUFULCBEVU1NWV9EQVRBU1BBQ0UsIERVTU1ZX1JPVEFUSU9OLAorICAgICAgICAgICAgICAgIERVTU1ZX0lEKSB7CiAKIH0KIApAQCAtMTEyLDExICsxMTUsMjQgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK2NvbnN0IFN0cmluZzgmIENhbWVyYTNEdW1teVN0cmVhbTo6Z2V0UGh5c2ljYWxDYW1lcmFJZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gRFVNTVlfSUQ7Cit9CisKIHN0YXR1c190IENhbWVyYTNEdW1teVN0cmVhbTo6c2V0Q29uc3VtZXJzKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgLypjb25zdW1lcnMqLykgewogICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBEdW1teSBzdHJlYW0gZG9lc24ndCBzdXBwb3J0IHNldCBjb25zdW1lciBzdXJmYWNlISIsCiAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCk7CiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQorCitzdGF0dXNfdCBDYW1lcmEzRHVtbXlTdHJlYW06OnVwZGF0ZVN0cmVhbShjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4gJi8qb3V0cHV0U3VyZmFjZXMqLywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE91dHB1dFN0cmVhbUluZm8+ICYvKm91dHB1dEluZm8qLywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4gJi8qcmVtb3ZlZFN1cmZhY2VJZHMqLywKKyAgICAgICAgICAgIEtleWVkVmVjdG9yPHNwPFN1cmZhY2U+LCBzaXplX3Q+ICogLypvdXRwdXRNYXAqLykgeworICAgIEFMT0dFKCIlczogdGhpcyBtZXRob2QgaXMgbm90IHN1cHBvcnRlZCEiLCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKwogfTsgLy8gbmFtZXNwYWNlIGNhbWVyYTMKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5oCmluZGV4IDk3MTA3NjUuLjQ2Mjc1NDggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDE0LTIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtNjMsNiArNjMsMTEgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGRyb3BCdWZmZXJzKGJvb2wgLypkcm9wcGluZyovKSBvdmVycmlkZTsKIAogICAgIC8qKgorICAgICAqIFF1ZXJ5IHRoZSBwaHlzaWNhbCBjYW1lcmEgaWQgZm9yIHRoZSBvdXRwdXQgc3RyZWFtLgorICAgICAqLworICAgIHZpcnR1YWwgY29uc3QgU3RyaW5nOCYgZ2V0UGh5c2ljYWxDYW1lcmFJZCgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgLyoqCiAgICAgICogUmV0dXJuIGlmIHRoaXMgb3V0cHV0IHN0cmVhbSBpcyBmb3IgdmlkZW8gZW5jb2RpbmcuCiAgICAgICovCiAgICAgYm9vbCBpc1ZpZGVvU3RyZWFtKCkgY29uc3Q7CkBAIC03Nyw2ICs4MiwxOSBAQAogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q29uc3VtZXJzKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgY29uc3VtZXJzKTsKIAorICAgIC8qKgorICAgICAqIFF1ZXJ5IHRoZSBvdXRwdXQgc3VyZmFjZSBpZC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHNzaXplX3QgZ2V0U3VyZmFjZUlkKGNvbnN0IHNwPFN1cmZhY2U+ICYvKnN1cmZhY2UqLykgeyByZXR1cm4gMDsgfQorCisgICAgLyoqCisgICAgICogVXBkYXRlIHRoZSBzdHJlYW0gb3V0cHV0IHN1cmZhY2VzLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgdXBkYXRlU3RyZWFtKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiAmb3V0cHV0U3VyZmFjZXMsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxPdXRwdXRTdHJlYW1JbmZvPiAmb3V0cHV0SW5mbywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4gJnJlbW92ZWRTdXJmYWNlSWRzLAorICAgICAgICAgICAgS2V5ZWRWZWN0b3I8c3A8U3VyZmFjZT4sIHNpemVfdD4gKm91dHB1dE1hcC8qb3V0Ki8pOworCiAgIHByb3RlY3RlZDoKIAogICAgIC8qKgpAQCAtMTAxLDYgKzExOSw3IEBACiAgICAgc3RhdGljIGNvbnN0IGFuZHJvaWRfZGF0YXNwYWNlIERVTU1ZX0RBVEFTUEFDRSA9IEhBTF9EQVRBU1BBQ0VfVU5LTk9XTjsKICAgICBzdGF0aWMgY29uc3QgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCBEVU1NWV9ST1RBVElPTiA9IENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzA7CiAgICAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IERVTU1ZX1VTQUdFID0gR1JBTExPQ19VU0FHRV9IV19DT01QT1NFUjsKKyAgICBzdGF0aWMgY29uc3QgU3RyaW5nOCBEVU1NWV9JRDsKIAogICAgIC8qKgogICAgICAqIEludGVybmFsIENhbWVyYTNTdHJlYW0gaW50ZXJmYWNlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmNwcAppbmRleCBhNTI0MjJkLi4zYzFlNDNkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxMy0yMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTMxLDkgKzMxLDExIEBACiAKIENhbWVyYTNJT1N0cmVhbUJhc2U6OkNhbWVyYTNJT1N0cmVhbUJhc2UoaW50IGlkLCBjYW1lcmEzX3N0cmVhbV90eXBlX3QgdHlwZSwKICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgc2l6ZV90IG1heFNpemUsIGludCBmb3JtYXQsCi0gICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgaW50IHNldElkKSA6CisgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwKKyAgICAgICAgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwgaW50IHNldElkKSA6CiAgICAgICAgIENhbWVyYTNTdHJlYW0oaWQsIHR5cGUsCi0gICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgbWF4U2l6ZSwgZm9ybWF0LCBkYXRhU3BhY2UsIHJvdGF0aW9uLCBzZXRJZCksCisgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgbWF4U2l6ZSwgZm9ybWF0LCBkYXRhU3BhY2UsIHJvdGF0aW9uLAorICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWQsIHNldElkKSwKICAgICAgICAgbVRvdGFsQnVmZmVyQ291bnQoMCksCiAgICAgICAgIG1IYW5kb3V0VG90YWxCdWZmZXJDb3VudCgwKSwKICAgICAgICAgbUhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudCgwKSwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmgKaW5kZXggMjM3NjA1OC4uMGEzMWQ0NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxMy0yMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTM1LDYgKzM1LDcgQEAKICAgICBDYW1lcmEzSU9TdHJlYW1CYXNlKGludCBpZCwgY2FtZXJhM19zdHJlYW1fdHlwZV90IHR5cGUsCiAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBzaXplX3QgbWF4U2l6ZSwgaW50IGZvcm1hdCwKICAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCiAgICAgICAgICAgICBpbnQgc2V0SWQgPSBDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCk7CiAKICAgcHVibGljOgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwCmluZGV4IDJjYjFlYTcuLjAxN2Q3YmUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxMy0yMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTI3LDEwICsyNywxMyBAQAogCiBuYW1lc3BhY2UgY2FtZXJhMyB7CiAKK2NvbnN0IFN0cmluZzggQ2FtZXJhM0lucHV0U3RyZWFtOjpEVU1NWV9JRDsKKwogQ2FtZXJhM0lucHV0U3RyZWFtOjpDYW1lcmEzSW5wdXRTdHJlYW0oaW50IGlkLAogICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0KSA6CiAgICAgICAgIENhbWVyYTNJT1N0cmVhbUJhc2UoaWQsIENBTUVSQTNfU1RSRUFNX0lOUFVULCB3aWR0aCwgaGVpZ2h0LCAvKm1heFNpemUqLzAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBIQUxfREFUQVNQQUNFX1VOS05PV04sIENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIEhBTF9EQVRBU1BBQ0VfVU5LTk9XTiwgQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEVU1NWV9JRCkgewogCiAgICAgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IpIHsKICAgICAgICAgQUxPR0UoIiVzOiBCYWQgZm9ybWF0LCBCTE9CIG5vdCBzdXBwb3J0ZWQiLCBfX0ZVTkNUSU9OX18pOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmgKaW5kZXggODEyMjZmOC4uMDczMjQ2NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMTMtMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC01Myw2ICs1Myw4IEBACiAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbVByb2R1Y2VyOwogICAgIFZlY3RvcjxCdWZmZXJJdGVtPiBtQnVmZmVyc0luRmxpZ2h0OwogCisgICAgc3RhdGljIGNvbnN0IFN0cmluZzggRFVNTVlfSUQ7CisKICAgICAvKioKICAgICAgKiBDYW1lcmEzSU9TdHJlYW1CYXNlCiAgICAgICovCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcAppbmRleCA4NDYwYzM0Li5iM2MzNzE3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxMy0yMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTM1LDkgKzM1LDExIEBACiAgICAgICAgIHNwPFN1cmZhY2U+IGNvbnN1bWVyLAogICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAogICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sCi0gICAgICAgIG5zZWNzX3QgdGltZXN0YW1wT2Zmc2V0LCBpbnQgc2V0SWQpIDoKKyAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXBPZmZzZXQsIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgIGludCBzZXRJZCkgOgogICAgICAgICBDYW1lcmEzSU9TdHJlYW1CYXNlKGlkLCBDQU1FUkEzX1NUUkVBTV9PVVRQVVQsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXhTaXplKi8wLCBmb3JtYXQsIGRhdGFTcGFjZSwgcm90YXRpb24sIHNldElkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1heFNpemUqLzAsIGZvcm1hdCwgZGF0YVNwYWNlLCByb3RhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkLCBzZXRJZCksCiAgICAgICAgIG1Db25zdW1lcihjb25zdW1lciksCiAgICAgICAgIG1UcmFuc2Zvcm0oMCksCiAgICAgICAgIG1UcmFjZUZpcnN0QnVmZmVyKHRydWUpLApAQCAtNjEsOSArNjMsOSBAQAogICAgICAgICBzcDxTdXJmYWNlPiBjb25zdW1lciwKICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgc2l6ZV90IG1heFNpemUsIGludCBmb3JtYXQsCiAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwKLSAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXBPZmZzZXQsIGludCBzZXRJZCkgOgorICAgICAgICBuc2Vjc190IHRpbWVzdGFtcE9mZnNldCwgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwgaW50IHNldElkKSA6CiAgICAgICAgIENhbWVyYTNJT1N0cmVhbUJhc2UoaWQsIENBTUVSQTNfU1RSRUFNX09VVFBVVCwgd2lkdGgsIGhlaWdodCwgbWF4U2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGRhdGFTcGFjZSwgcm90YXRpb24sIHNldElkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGRhdGFTcGFjZSwgcm90YXRpb24sIHBoeXNpY2FsQ2FtZXJhSWQsIHNldElkKSwKICAgICAgICAgbUNvbnN1bWVyKGNvbnN1bWVyKSwKICAgICAgICAgbVRyYW5zZm9ybSgwKSwKICAgICAgICAgbVRyYWNlRmlyc3RCdWZmZXIodHJ1ZSksCkBAIC05Myw5ICs5NSwxMSBAQAogQ2FtZXJhM091dHB1dFN0cmVhbTo6Q2FtZXJhM091dHB1dFN0cmVhbShpbnQgaWQsCiAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCiAgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UsIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwKLSAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgbnNlY3NfdCB0aW1lc3RhbXBPZmZzZXQsIGludCBzZXRJZCkgOgorICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBuc2Vjc190IHRpbWVzdGFtcE9mZnNldCwKKyAgICAgICAgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwgaW50IHNldElkKSA6CiAgICAgICAgIENhbWVyYTNJT1N0cmVhbUJhc2UoaWQsIENBTUVSQTNfU1RSRUFNX09VVFBVVCwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1heFNpemUqLzAsIGZvcm1hdCwgZGF0YVNwYWNlLCByb3RhdGlvbiwgc2V0SWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWF4U2l6ZSovMCwgZm9ybWF0LCBkYXRhU3BhY2UsIHJvdGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWQsIHNldElkKSwKICAgICAgICAgbUNvbnN1bWVyKG51bGxwdHIpLAogICAgICAgICBtVHJhbnNmb3JtKDApLAogICAgICAgICBtVHJhY2VGaXJzdEJ1ZmZlcih0cnVlKSwKQEAgLTEzMSwxMSArMTM1LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSwgbnNlY3NfdCB0aW1lc3RhbXBPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXRJZCkgOgogICAgICAgICBDYW1lcmEzSU9TdHJlYW1CYXNlKGlkLCB0eXBlLCB3aWR0aCwgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWF4U2l6ZSovMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGRhdGFTcGFjZSwgcm90YXRpb24sIHNldElkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGRhdGFTcGFjZSwgcm90YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZCwgc2V0SWQpLAogICAgICAgICBtVHJhbnNmb3JtKDApLAogICAgICAgICBtVHJhY2VGaXJzdEJ1ZmZlcih0cnVlKSwKICAgICAgICAgbVVzZU1vbm9UaW1lc3RhbXAoZmFsc2UpLApAQCAtNzAwLDYgKzcwNiwxNCBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhM091dHB1dFN0cmVhbTo6dXBkYXRlU3RyZWFtKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiAmLypvdXRwdXRTdXJmYWNlcyovLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8T3V0cHV0U3RyZWFtSW5mbz4gJi8qb3V0cHV0SW5mbyovLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiAmLypyZW1vdmVkU3VyZmFjZUlkcyovLAorICAgICAgICAgICAgS2V5ZWRWZWN0b3I8c3A8U3VyZmFjZT4sIHNpemVfdD4gKiAvKm91dHB1dE1hcG8qLykgeworICAgIEFMT0dFKCIlczogdGhpcyBtZXRob2QgaXMgbm90IHN1cHBvcnRlZCEiLCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKwogdm9pZCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpCdWZmZXJSZWxlYXNlZExpc3RlbmVyOjpvbkJ1ZmZlclJlbGVhc2VkKCkgewogICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW0+IHN0cmVhbSA9IG1QYXJlbnQucHJvbW90ZSgpOwogICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgewpAQCAtNzM3LDcgKzc1MSw3IEBACiAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNwPEdyYXBoaWNCdWZmZXI+PiYgcmVtb3ZlZEJ1ZmZlcnMpIHsKICAgICBzcDxDYW1lcmEzU3RyZWFtQnVmZmVyRnJlZWRMaXN0ZW5lcj4gY2FsbGJhY2sgPSBtQnVmZmVyRnJlZWRMaXN0ZW5lci5wcm9tb3RlKCk7CiAgICAgaWYgKGNhbGxiYWNrICE9IG51bGxwdHIpIHsKLSAgICAgICAgZm9yIChhdXRvIGdiIDogcmVtb3ZlZEJ1ZmZlcnMpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBnYiA6IHJlbW92ZWRCdWZmZXJzKSB7CiAgICAgICAgICAgICBjYWxsYmFjay0+b25CdWZmZXJGcmVlZChtSWQsIGdiLT5oYW5kbGUpOwogICAgICAgICB9CiAgICAgfQpAQCAtNzkyLDYgKzgwNiwxMSBAQAogICAgIHJldHVybiBPSzsKIH0KIAorY29uc3QgU3RyaW5nOCYgQ2FtZXJhM091dHB1dFN0cmVhbTo6Z2V0UGh5c2ljYWxDYW1lcmFJZCgpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgcmV0dXJuIHBoeXNpY2FsQ2FtZXJhSWQoKTsKK30KKwogc3RhdHVzX3QgQ2FtZXJhM091dHB1dFN0cmVhbTo6bm90aWZ5QnVmZmVyUmVsZWFzZWQoQU5hdGl2ZVdpbmRvd0J1ZmZlciogLyphbndCdWZmZXIqLykgewogICAgIHJldHVybiBPSzsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmgKaW5kZXggNDg2NWJlNy4uNmYzNmY5MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxMy0yMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTgyLDcgKzgyLDggQEAKICAgICBDYW1lcmEzT3V0cHV0U3RyZWFtKGludCBpZCwgc3A8U3VyZmFjZT4gY29uc3VtZXIsCiAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAogICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLAotICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXBPZmZzZXQsIGludCBzZXRJZCA9IENBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElEKTsKKyAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wT2Zmc2V0LCBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICAgICAgaW50IHNldElkID0gQ0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQpOwogCiAgICAgLyoqCiAgICAgICogU2V0IHVwIGEgc3RyZWFtIGZvciBmb3JtYXRzIHRoYXQgaGF2ZSBhIHZhcmlhYmxlIGJ1ZmZlciBzaXplIGZvciB0aGUgc2FtZQpAQCAtOTMsNyArOTQsOCBAQAogICAgIENhbWVyYTNPdXRwdXRTdHJlYW0oaW50IGlkLCBzcDxTdXJmYWNlPiBjb25zdW1lciwKICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHNpemVfdCBtYXhTaXplLCBpbnQgZm9ybWF0LAogICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLAotICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXBPZmZzZXQsIGludCBzZXRJZCA9IENBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElEKTsKKyAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wT2Zmc2V0LCBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICAgICAgaW50IHNldElkID0gQ0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQpOwogCiAgICAgLyoqCiAgICAgICogU2V0IHVwIGEgc3RyZWFtIHdpdGggZGVmZXJyZWQgY29uc3VtZXIgZm9yIGZvcm1hdHMgdGhhdCBoYXZlIDIgZGltZW5zaW9ucywgc3VjaCBhcwpAQCAtMTAzLDYgKzEwNSw3IEBACiAgICAgQ2FtZXJhM091dHB1dFN0cmVhbShpbnQgaWQsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCiAgICAgICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlLCBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsCiAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBuc2Vjc190IHRpbWVzdGFtcE9mZnNldCwKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCiAgICAgICAgICAgICBpbnQgc2V0SWQgPSBDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCk7CiAKICAgICB2aXJ0dWFsIH5DYW1lcmEzT3V0cHV0U3RyZWFtKCk7CkBAIC0xNzEsMTYgKzE3NCwzNSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZHJvcEJ1ZmZlcnMoYm9vbCBkcm9wcGluZykgb3ZlcnJpZGU7CiAKICAgICAvKioKKyAgICAgKiBRdWVyeSB0aGUgcGh5c2ljYWwgY2FtZXJhIGlkIGZvciB0aGUgb3V0cHV0IHN0cmVhbS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGNvbnN0IFN0cmluZzgmIGdldFBoeXNpY2FsQ2FtZXJhSWQoKSBjb25zdCBvdmVycmlkZTsKKworICAgIC8qKgogICAgICAqIFNldCB0aGUgZ3JhcGhpYyBidWZmZXIgbWFuYWdlciB0byBnZXQvcmV0dXJuIHRoZSBzdHJlYW0gYnVmZmVycy4KICAgICAgKgogICAgICAqIEl0IGlzIG9ubHkgbGVnYWwgdG8gY2FsbCB0aGlzIG1ldGhvZCB3aGVuIHN0cmVhbSBpcyBpbiBTVEFURV9DT05TVFJVQ1RFRCBzdGF0ZS4KICAgICAgKi8KICAgICBzdGF0dXNfdCBzZXRCdWZmZXJNYW5hZ2VyKHNwPENhbWVyYTNCdWZmZXJNYW5hZ2VyPiBidWZmZXJNYW5hZ2VyKTsKIAorICAgIC8qKgorICAgICAqIFF1ZXJ5IHRoZSBvdXB1dCBzdXJmYWNlIGlkLgorICAgICAqLworICAgIHZpcnR1YWwgc3NpemVfdCBnZXRTdXJmYWNlSWQoY29uc3Qgc3A8U3VyZmFjZT4gJi8qc3VyZmFjZSovKSB7IHJldHVybiAwOyB9CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGUgdGhlIHN0cmVhbSBvdXRwdXQgc3VyZmFjZXMuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCB1cGRhdGVTdHJlYW0oY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+ICZvdXRwdXRTdXJmYWNlcywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE91dHB1dFN0cmVhbUluZm8+ICZvdXRwdXRJbmZvLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiAmcmVtb3ZlZFN1cmZhY2VJZHMsCisgICAgICAgICAgICBLZXllZFZlY3RvcjxzcDxTdXJmYWNlPiwgc2l6ZV90PiAqb3V0cHV0TWFwLypvdXQqLyk7CisKICAgcHJvdGVjdGVkOgogICAgIENhbWVyYTNPdXRwdXRTdHJlYW0oaW50IGlkLCBjYW1lcmEzX3N0cmVhbV90eXBlX3QgdHlwZSwKICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCiAgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAogICAgICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSA9IDAsIG5zZWNzX3QgdGltZXN0YW1wT2Zmc2V0ID0gMCwKICAgICAgICAgICAgIGludCBzZXRJZCA9IENBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElEKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2UuaAppbmRleCAxNzE5ZDc0Li5hNzExYTZkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2UuaApAQCAtMTgsNiArMTgsNyBAQAogI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBM19PVVRQVVRfU1RSRUFNX0lOVEVSRkFDRV9ICiAKICNpbmNsdWRlICJDYW1lcmEzU3RyZWFtSW50ZXJmYWNlLmgiCisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC02MSw5ICs2MiwyNyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGV0YWNoQnVmZmVyKHNwPEdyYXBoaWNCdWZmZXI+KiBidWZmZXIsIGludCogZmVuY2VGZCkgPSAwOwogCiAgICAgLyoqCisgICAgICogUXVlcnkgdGhlIHN1cmZhY2UgaWQuCisgICAgICovCisgICAgdmlydHVhbCBzc2l6ZV90IGdldFN1cmZhY2VJZChjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSkgPSAwOworCisgICAgLyoqCisgICAgICogVXBkYXRlIHRoZSBzdHJlYW0gb3V0cHV0IHN1cmZhY2VzLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgdXBkYXRlU3RyZWFtKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiAmb3V0cHV0U3VyZmFjZXMsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxPdXRwdXRTdHJlYW1JbmZvPiAmb3V0cHV0SW5mbywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4gJnJlbW92ZWRTdXJmYWNlSWRzLAorICAgICAgICAgICAgS2V5ZWRWZWN0b3I8c3A8U3VyZmFjZT4sIHNpemVfdD4gKm91dHB1dE1hcC8qb3V0Ki8pID0gMDsKKworICAgIC8qKgogICAgICAqIERyb3AgYnVmZmVycyBpZiBkcm9wcGluZyBpcyB0cnVlLiBJZiBkcm9wcGluZyBpcyBmYWxzZSwgZG8gbm90IGRyb3AgYnVmZmVycy4KICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IGRyb3BCdWZmZXJzKGJvb2wgLypkcm9wcGluZyovKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBRdWVyeSB0aGUgcGh5c2ljYWwgY2FtZXJhIGlkIGZvciB0aGUgb3V0cHV0IHN0cmVhbS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGNvbnN0IFN0cmluZzgmIGdldFBoeXNpY2FsQ2FtZXJhSWQoKSBjb25zdCA9IDA7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBjYW1lcmEzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmNwcAppbmRleCA1MDUxNzExLi4yYmI5ZmY3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5jcHAKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxNi0yMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTIwLDE2ICsyMCwyNSBAQAogCiBuYW1lc3BhY2UgY2FtZXJhMyB7CiAKK2NvbnN0IHNpemVfdCBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtOjprTWF4T3V0cHV0czsKKwogQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbTo6Q2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbShpbnQgaWQsCiAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgc3VyZmFjZXMsCiAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCiAgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UsIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwKICAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwKLSAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXBPZmZzZXQsIGludCBzZXRJZCkgOgorICAgICAgICBuc2Vjc190IHRpbWVzdGFtcE9mZnNldCwgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKKyAgICAgICAgaW50IHNldElkKSA6CiAgICAgICAgIENhbWVyYTNPdXRwdXRTdHJlYW0oaWQsIENBTUVSQTNfU1RSRUFNX09VVFBVVCwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGRhdGFTcGFjZSwgcm90YXRpb24sIGNvbnN1bWVyVXNhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wT2Zmc2V0LCBzZXRJZCksCi0gICAgICAgIG1TdXJmYWNlcyhzdXJmYWNlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgZGF0YVNwYWNlLCByb3RhdGlvbiwgcGh5c2ljYWxDYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lclVzYWdlLCB0aW1lc3RhbXBPZmZzZXQsIHNldElkKSB7CisgICAgc2l6ZV90IGNvbnN1bWVyQ291bnQgPSBzdGQ6Om1pbihzdXJmYWNlcy5zaXplKCksIGtNYXhPdXRwdXRzKTsKKyAgICBpZiAoc3VyZmFjZXMuc2l6ZSgpID4gY29uc3VtZXJDb3VudCkgeworICAgICAgICBBTE9HRSgiJXM6IFRyeWluZyB0byBhZGQgbW9yZSBjb25zdW1lcnMgdGhhbiB0aGUgbWF4aW11bSAiLCBfX2Z1bmNfXyk7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29uc3VtZXJDb3VudDsgaSsrKSB7CisgICAgICAgIG1TdXJmYWNlc1tpXSA9IHN1cmZhY2VzW2ldOworICAgIH0KIH0KIAogQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbTo6fkNhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0oKSB7CkBAIC00NCw3ICs1MywxNiBAQAogICAgIHVpbnQ2NF90IHVzYWdlOwogICAgIGdldEVuZHBvaW50VXNhZ2UoJnVzYWdlKTsKIAotICAgIHJlcyA9IG1TdHJlYW1TcGxpdHRlci0+Y29ubmVjdChtU3VyZmFjZXMsIHVzYWdlLCBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMsICZtQ29uc3VtZXIpOworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzaXplX3QsIHNwPFN1cmZhY2U+PiBpbml0aWFsU3VyZmFjZXM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTWF4T3V0cHV0czsgaSsrKSB7CisgICAgICAgIGlmIChtU3VyZmFjZXNbaV0gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgaW5pdGlhbFN1cmZhY2VzLmVtcGxhY2UoaSwgbVN1cmZhY2VzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGFuZHJvaWQ6OlBpeGVsRm9ybWF0IGZvcm1hdCA9IGlzRm9ybWF0T3ZlcnJpZGRlbigpID8gZ2V0T3JpZ2luYWxGb3JtYXQoKSA6IGdldEZvcm1hdCgpOworICAgIHJlcyA9IG1TdHJlYW1TcGxpdHRlci0+Y29ubmVjdChpbml0aWFsU3VyZmFjZXMsIHVzYWdlLCBtVXNhZ2UsIGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVycywKKyAgICAgICAgICAgIGdldFdpZHRoKCksIGdldEhlaWdodCgpLCBmb3JtYXQsICZtQ29uc3VtZXIpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gY29ubmVjdCB0byBzdHJlYW0gc3BsaXR0ZXI6ICVzKCVkKSIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKQEAgLTY4LDcgKzg2LDExIEBACiAKIGJvb2wgQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbTo6aXNDb25zdW1lckNvbmZpZ3VyYXRpb25EZWZlcnJlZChzaXplX3Qgc3VyZmFjZV9pZCkgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKLSAgICByZXR1cm4gKHN1cmZhY2VfaWQgPj0gbVN1cmZhY2VzLnNpemUoKSk7CisgICAgaWYgKHN1cmZhY2VfaWQgPj0ga01heE91dHB1dHMpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIChtU3VyZmFjZXNbc3VyZmFjZV9pZF0gPT0gbnVsbHB0cik7CiB9CiAKIHN0YXR1c190IENhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW06OnNldENvbnN1bWVycyhjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4mIHN1cmZhY2VzKSB7CkBAIC04NSwxMSArMTA3LDE3IEBACiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIH0KIAotICAgICAgICBtU3VyZmFjZXMucHVzaF9iYWNrKHN1cmZhY2UpOworICAgICAgICBzc2l6ZV90IGlkID0gZ2V0TmV4dFN1cmZhY2VJZExvY2tlZCgpOworICAgICAgICBpZiAoaWQgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IE5vIHN1cmZhY2UgaWRzIGF2YWlsYWJsZSEiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CisKKyAgICAgICAgbVN1cmZhY2VzW2lkXSA9IHN1cmZhY2U7CiAKICAgICAgICAgLy8gT25seSBjYWxsIGFkZE91dHB1dCBpZiB0aGUgc3BsaXR0ZXIgaGFzIGJlZW4gY29ubmVjdGVkLgogICAgICAgICBpZiAobVN0cmVhbVNwbGl0dGVyICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHJldCA9IG1TdHJlYW1TcGxpdHRlci0+YWRkT3V0cHV0KHN1cmZhY2UpOworICAgICAgICAgICAgcmV0ID0gbVN0cmVhbVNwbGl0dGVyLT5hZGRPdXRwdXQoaWQsIHN1cmZhY2UpOwogICAgICAgICAgICAgaWYgKHJldCAhPSBPSykgewogICAgICAgICAgICAgICAgIEFMT0dFKCIlczogYWRkT3V0cHV0IGZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJWQiLCBfX0ZVTkNUSU9OX18sIHJldCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKQEAgLTIwMCw5ICsyMjgsOSBAQAogICAgICAgICAvLyBDYWxsZWQgYmVmb3JlIHNoYXJlZCBidWZmZXIgcXVldWUgaXMgY29uc3RydWN0ZWQuCiAgICAgICAgICp1c2FnZSA9IGdldFByZXNldENvbnN1bWVyVXNhZ2UoKTsKIAotICAgICAgICBmb3IgKGF1dG8gc3VyZmFjZSA6IG1TdXJmYWNlcykgewotICAgICAgICAgICAgaWYgKHN1cmZhY2UgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIHJlcyA9IGdldEVuZHBvaW50VXNhZ2VGb3JTdXJmYWNlKCZ1LCBzdXJmYWNlKTsKKyAgICAgICAgZm9yIChzaXplX3QgaWQgPSAwOyBpZCA8IGtNYXhPdXRwdXRzOyBpZCsrKSB7CisgICAgICAgICAgICBpZiAobVN1cmZhY2VzW2lkXSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgcmVzID0gZ2V0RW5kcG9pbnRVc2FnZUZvclN1cmZhY2UoJnUsIG1TdXJmYWNlc1tpZF0pOwogICAgICAgICAgICAgICAgICp1c2FnZSB8PSB1OwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yMTUsNiArMjQzLDE0MCBAQAogICAgIHJldHVybiByZXM7CiB9CiAKK3NzaXplX3QgQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbTo6Z2V0TmV4dFN1cmZhY2VJZExvY2tlZCgpIHsKKyAgICBzc2l6ZV90IGlkID0gLTE7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTWF4T3V0cHV0czsgaSsrKSB7CisgICAgICAgIGlmIChtU3VyZmFjZXNbaV0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgaWQgPSBpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gaWQ7Cit9CisKK3NzaXplX3QgQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbTo6Z2V0U3VyZmFjZUlkKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIHNzaXplX3QgaWQgPSAtMTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhPdXRwdXRzOyBpKyspIHsKKyAgICAgICAgaWYgKG1TdXJmYWNlc1tpXSA9PSBzdXJmYWNlKSB7CisgICAgICAgICAgICBpZCA9IGk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBpZDsKK30KKworc3RhdHVzX3QgQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbTo6cmV2ZXJ0UGFydGlhbFVwZGF0ZUxvY2tlZCgKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8c3A8U3VyZmFjZT4sIHNpemVfdD4gJnJlbW92ZWRTdXJmYWNlcywKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8c3A8U3VyZmFjZT4sIHNpemVfdD4gJmF0dGFjaGVkU3VyZmFjZXMpIHsKKyAgICBzdGF0dXNfdCByZXQgPSBPSzsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXR0YWNoZWRTdXJmYWNlcy5zaXplKCk7IGkrKykgeworICAgICAgICBzaXplX3QgaW5kZXggPSBhdHRhY2hlZFN1cmZhY2VzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmIChtU3RyZWFtU3BsaXR0ZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0ID0gbVN0cmVhbVNwbGl0dGVyLT5yZW1vdmVPdXRwdXQoaW5kZXgpOworICAgICAgICAgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1TdXJmYWNlc1tpbmRleF0gPSBudWxscHRyOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVtb3ZlZFN1cmZhY2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNpemVfdCBpbmRleCA9IHJlbW92ZWRTdXJmYWNlcy52YWx1ZUF0KGkpOworICAgICAgICBpZiAobVN0cmVhbVNwbGl0dGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldCA9IG1TdHJlYW1TcGxpdHRlci0+YWRkT3V0cHV0KGluZGV4LCByZW1vdmVkU3VyZmFjZXMua2V5QXQoaSkpOworICAgICAgICAgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1TdXJmYWNlc1tpbmRleF0gPSByZW1vdmVkU3VyZmFjZXMua2V5QXQoaSk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdHVzX3QgQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbTo6dXBkYXRlU3RyZWFtKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiAmb3V0cHV0U3VyZmFjZXMsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE91dHB1dFN0cmVhbUluZm8+ICZvdXRwdXRJbmZvLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+ICZyZW1vdmVkU3VyZmFjZUlkcywKKyAgICAgICAgS2V5ZWRWZWN0b3I8c3A8U3VyZmFjZT4sIHNpemVfdD4gKm91dHB1dE1hcCkgeworICAgIHN0YXR1c190IHJldCA9IE9LOworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKworICAgIGlmICgob3V0cHV0TWFwID09IG51bGxwdHIpIHx8IChvdXRwdXRJbmZvLnNpemUoKSAhPSBvdXRwdXRTdXJmYWNlcy5zaXplKCkpIHx8CisgICAgICAgICAgICAob3V0cHV0U3VyZmFjZXMuc2l6ZSgpID4ga01heE91dHB1dHMpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgdWludDY0X3QgdXNhZ2U7CisgICAgZ2V0RW5kcG9pbnRVc2FnZSgmdXNhZ2UpOworICAgIEtleWVkVmVjdG9yPHNwPFN1cmZhY2U+LCBzaXplX3Q+IHJlbW92ZWRTdXJmYWNlczsKKyAgICAvL0NoZWNrIHdoZXRoZXIgdGhlIG5ldyBzdXJmYWNlcyBhcmUgY29tcGF0aWJsZS4KKyAgICBmb3IgKGNvbnN0IGF1dG8gJmluZm9JdCA6IG91dHB1dEluZm8pIHsKKyAgICAgICAgYm9vbCBpbWdSZWFkZXJVc2FnZSA9IChpbmZvSXQuY29uc3VtZXJVc2FnZSAmIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTikgPyB0cnVlIDogZmFsc2U7CisgICAgICAgIGJvb2wgc2l6ZU1pc21hdGNoID0gKChzdGF0aWNfY2FzdDx1aW50MzJfdD4oaW5mb0l0LndpZHRoKSAhPSBnZXRXaWR0aCgpKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDMyX3Q+IChpbmZvSXQuaGVpZ2h0KSAhPSBnZXRIZWlnaHQoKSkpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSA6IGZhbHNlOworICAgICAgICBpZiAoKGltZ1JlYWRlclVzYWdlICYmIHNpemVNaXNtYXRjaCkgfHwKKyAgICAgICAgICAgICAgICAoaW5mb0l0LmZvcm1hdCAhPSBnZXRPcmlnaW5hbEZvcm1hdCgpICYmIGluZm9JdC5mb3JtYXQgIT0gZ2V0Rm9ybWF0KCkpIHx8CisgICAgICAgICAgICAgICAgKGluZm9JdC5kYXRhU3BhY2UgIT0gZ2V0RGF0YVNwYWNlKCkgJiYKKyAgICAgICAgICAgICAgICAgaW5mb0l0LmRhdGFTcGFjZSAhPSBnZXRPcmlnaW5hbERhdGFTcGFjZSgpKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBTaGFyZWQgc3VyZmFjZSBwYXJhbWV0ZXJzIGZvcm1hdDogMHgleCBkYXRhU3BhY2U6IDB4JXggIgorICAgICAgICAgICAgICAgICAgICAiIGRvbid0IG1hdGNoIHNvdXJjZSBzdHJlYW0gZm9ybWF0OiAweCV4ICBkYXRhU3BhY2U6IDB4JXgiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIGluZm9JdC5mb3JtYXQsIGluZm9JdC5kYXRhU3BhY2UsIGdldEZvcm1hdCgpLCBnZXREYXRhU3BhY2UoKSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfQorCisgICAgLy9GaXJzdCByZW1vdmUgYWxsIGFic2VudCBvdXRwdXRzCisgICAgZm9yIChjb25zdCBhdXRvICZpdCA6IHJlbW92ZWRTdXJmYWNlSWRzKSB7CisgICAgICAgIGlmIChtU3RyZWFtU3BsaXR0ZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0ID0gbVN0cmVhbVNwbGl0dGVyLT5yZW1vdmVPdXRwdXQoaXQpOworICAgICAgICAgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHdpdGggZXJyb3IgY29kZSAlZCIsIF9fRlVOQ1RJT05fXywgcmV0KTsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSByZXZlcnRQYXJ0aWFsVXBkYXRlTG9ja2VkKHJlbW92ZWRTdXJmYWNlcywgKm91dHB1dE1hcCk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVN1cmZhY2VzW2l0XSA9IG51bGxwdHI7CisgICAgICAgIHJlbW92ZWRTdXJmYWNlcy5hZGQobVN1cmZhY2VzW2l0XSwgaXQpOworICAgIH0KKworICAgIC8vTmV4dCBhZGQgdGhlIG5ldyBvdXRwdXRzCisgICAgZm9yIChjb25zdCBhdXRvICZpdCA6IG91dHB1dFN1cmZhY2VzKSB7CisgICAgICAgIHNzaXplX3Qgc3VyZmFjZUlkID0gZ2V0TmV4dFN1cmZhY2VJZExvY2tlZCgpOworICAgICAgICBpZiAoc3VyZmFjZUlkIDwgMCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBObyBtb3JlIGF2YWlsYWJsZSBvdXRwdXQgc2xvdHMhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IHJldmVydFBhcnRpYWxVcGRhdGVMb2NrZWQocmVtb3ZlZFN1cmZhY2VzLCAqb3V0cHV0TWFwKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQorICAgICAgICBpZiAobVN0cmVhbVNwbGl0dGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldCA9IG1TdHJlYW1TcGxpdHRlci0+YWRkT3V0cHV0KHN1cmZhY2VJZCwgaXQpOworICAgICAgICAgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHdpdGggZXJyb3IgY29kZSAlZCIsIF9fRlVOQ1RJT05fXywgcmV0KTsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSByZXZlcnRQYXJ0aWFsVXBkYXRlTG9ja2VkKHJlbW92ZWRTdXJmYWNlcywgKm91dHB1dE1hcCk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1TdXJmYWNlc1tzdXJmYWNlSWRdID0gaXQ7CisgICAgICAgIG91dHB1dE1hcC0+YWRkKGl0LCBzdXJmYWNlSWQpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKIH0gLy8gbmFtZXNwYWNlIGNhbWVyYTMKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uaAppbmRleCAyMmJiMmZjLi4wMmIxYzA5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDE2LTIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMzYsNiArMzYsNyBAQAogICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKICAgICAgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UsIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwKICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIG5zZWNzX3QgdGltZXN0YW1wT2Zmc2V0LAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKICAgICAgICAgICAgIGludCBzZXRJZCA9IENBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElEKTsKIAogICAgIHZpcnR1YWwgfkNhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0oKTsKQEAgLTQ2LDkgKzQ3LDI0IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldENvbnN1bWVycyhjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4mIGNvbnN1bWVycyk7CiAKKyAgICB2aXJ0dWFsIHNzaXplX3QgZ2V0U3VyZmFjZUlkKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgdXBkYXRlU3RyZWFtKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiAmb3V0cHV0U3VyZmFjZXMsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxPdXRwdXRTdHJlYW1JbmZvPiAmb3V0cHV0SW5mbywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4gJnJlbW92ZWRTdXJmYWNlSWRzLAorICAgICAgICAgICAgS2V5ZWRWZWN0b3I8c3A8U3VyZmFjZT4sIHNpemVfdD4gKm91dHB1dE1hcC8qb3V0Ki8pOworCiBwcml2YXRlOgotICAgIC8vIFN1cmZhY2VzIHBhc3NlZCBpbiBjb25zdHJ1Y3RvciBmcm9tIGFwcAotICAgIHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+ID4gbVN1cmZhY2VzOworCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4T3V0cHV0cyA9IDQ7CisKKyAgICAvLyBNYXAgc3VyZmFjZUlkIC0+IG91dHB1dCBzdXJmYWNlcworICAgIHNwPFN1cmZhY2U+IG1TdXJmYWNlc1trTWF4T3V0cHV0c107CisKKyAgICBzc2l6ZV90IGdldE5leHRTdXJmYWNlSWRMb2NrZWQoKTsKKworICAgIHN0YXR1c190IHJldmVydFBhcnRpYWxVcGRhdGVMb2NrZWQoY29uc3QgS2V5ZWRWZWN0b3I8c3A8U3VyZmFjZT4sIHNpemVfdD4gJnJlbW92ZWRTdXJmYWNlcywKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPHNwPFN1cmZhY2U+LCBzaXplX3Q+ICZhdHRhY2hlZFN1cmZhY2VzKTsKIAogICAgIC8qKgogICAgICAqIFRoZSBDYW1lcmEzU3RyZWFtU3BsaXR0ZXIgb2JqZWN0IHRoaXMgc3RyZWFtIHVzZXMgZm9yIHN0cmVhbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAKaW5kZXggZmJlOGY0Zi4uMTEwNWI3NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMTMtMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC00Nyw3ICs0Nyw4IEBACiBDYW1lcmEzU3RyZWFtOjpDYW1lcmEzU3RyZWFtKGludCBpZCwKICAgICAgICAgY2FtZXJhM19zdHJlYW1fdHlwZSB0eXBlLAogICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBzaXplX3QgbWF4U2l6ZSwgaW50IGZvcm1hdCwKLSAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBpbnQgc2V0SWQpIDoKKyAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLAorICAgICAgICBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLCBpbnQgc2V0SWQpIDoKICAgICBjYW1lcmEzX3N0cmVhbSgpLAogICAgIG1JZChpZCksCiAgICAgbVNldElkKHNldElkKSwKQEAgLTY0LDcgKzY1LDggQEAKICAgICBtTGFzdE1heENvdW50KENhbWVyYTNTdHJlYW1JbnRlcmZhY2U6OkFMTE9DQVRFX1BJUEVMSU5FX01BWCksCiAgICAgbUJ1ZmZlckxpbWl0TGF0ZW5jeShrQnVmZmVyTGltaXRMYXRlbmN5QmluU2l6ZSksCiAgICAgbUZvcm1hdE92ZXJyaWRkZW4oZmFsc2UpLAotICAgIG1PcmlnaW5hbEZvcm1hdCgtMSkgeworICAgIG1PcmlnaW5hbEZvcm1hdCgtMSksCisgICAgbVBoeXNpY2FsQ2FtZXJhSWQocGh5c2ljYWxDYW1lcmFJZCkgewogCiAgICAgY2FtZXJhM19zdHJlYW06OnN0cmVhbV90eXBlID0gdHlwZTsKICAgICBjYW1lcmEzX3N0cmVhbTo6d2lkdGggPSB3aWR0aDsKQEAgLTc0LDYgKzc2LDcgQEAKICAgICBjYW1lcmEzX3N0cmVhbTo6cm90YXRpb24gPSByb3RhdGlvbjsKICAgICBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMgPSAwOwogICAgIGNhbWVyYTNfc3RyZWFtOjpwcml2ID0gTlVMTDsKKyAgICBjYW1lcmEzX3N0cmVhbTo6cGh5c2ljYWxfY2FtZXJhX2lkID0gbVBoeXNpY2FsQ2FtZXJhSWQuc3RyaW5nKCk7CiAKICAgICBpZiAoKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IgfHwgZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfUkFXX09QQVFVRSkgJiYKICAgICAgICAgICAgIG1heFNpemUgPT0gMCkgewpAQCAtMTQwLDYgKzE0Myw3OSBAQAogICAgIHJldHVybiBtT3JpZ2luYWxEYXRhU3BhY2U7CiB9CiAKK2NvbnN0IFN0cmluZzgmIENhbWVyYTNTdHJlYW06OnBoeXNpY2FsQ2FtZXJhSWQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1QaHlzaWNhbENhbWVyYUlkOworfQorCitzdGF0dXNfdCBDYW1lcmEzU3RyZWFtOjpmb3JjZVRvSWRsZSgpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICBzdGF0dXNfdCByZXM7CisKKyAgICBzd2l0Y2ggKG1TdGF0ZSkgeworICAgICAgICBjYXNlIFNUQVRFX0VSUk9SOgorICAgICAgICBjYXNlIFNUQVRFX0NPTlNUUlVDVEVEOgorICAgICAgICBjYXNlIFNUQVRFX0lOX0NPTkZJRzoKKyAgICAgICAgY2FzZSBTVEFURV9QUkVQQVJJTkc6CisgICAgICAgIGNhc2UgU1RBVEVfSU5fUkVDT05GSUc6CisgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgc3RhdGU6ICVkIiwgX19GVU5DVElPTl9fLCBtU3RhdGUpOworICAgICAgICAgICAgcmVzID0gTk9fSU5JVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNUQVRFX0NPTkZJR1VSRUQ6CisgICAgICAgICAgICBpZiAoaGFzT3V0c3RhbmRpbmdCdWZmZXJzTG9ja2VkKCkpIHsKKyAgICAgICAgICAgICAgICBzcDxTdGF0dXNUcmFja2VyPiBzdGF0dXNUcmFja2VyID0gbVN0YXR1c1RyYWNrZXIucHJvbW90ZSgpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXNUcmFja2VyICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzVHJhY2tlci0+bWFya0NvbXBvbmVudElkbGUobVN0YXR1c0lkLCBGZW5jZTo6Tk9fRkVOQ0UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfSU5fSURMRTsKKyAgICAgICAgICAgIHJlcyA9IE9LOworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5rbm93biBzdGF0ZSAlZCIsIF9fRlVOQ1RJT05fXywgbVN0YXRlKTsKKyAgICAgICAgICAgIHJlcyA9IE5PX0lOSVQ7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbTo6cmVzdG9yZUNvbmZpZ3VyZWRTdGF0ZSgpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICBzdGF0dXNfdCByZXM7CisKKyAgICBzd2l0Y2ggKG1TdGF0ZSkgeworICAgICAgICBjYXNlIFNUQVRFX0VSUk9SOgorICAgICAgICBjYXNlIFNUQVRFX0NPTlNUUlVDVEVEOgorICAgICAgICBjYXNlIFNUQVRFX0lOX0NPTkZJRzoKKyAgICAgICAgY2FzZSBTVEFURV9QUkVQQVJJTkc6CisgICAgICAgIGNhc2UgU1RBVEVfSU5fUkVDT05GSUc6CisgICAgICAgIGNhc2UgU1RBVEVfQ09ORklHVVJFRDoKKyAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBzdGF0ZTogJWQiLCBfX0ZVTkNUSU9OX18sIG1TdGF0ZSk7CisgICAgICAgICAgICByZXMgPSBOT19JTklUOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1RBVEVfSU5fSURMRToKKyAgICAgICAgICAgIGlmIChoYXNPdXRzdGFuZGluZ0J1ZmZlcnNMb2NrZWQoKSkgeworICAgICAgICAgICAgICAgIHNwPFN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIgPSBtU3RhdHVzVHJhY2tlci5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1c1RyYWNrZXIgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXNUcmFja2VyLT5tYXJrQ29tcG9uZW50QWN0aXZlKG1TdGF0dXNJZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9DT05GSUdVUkVEOworICAgICAgICAgICAgcmVzID0gT0s7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmtub3duIHN0YXRlICVkIiwgX19GVU5DVElPTl9fLCBtU3RhdGUpOworICAgICAgICAgICAgcmVzID0gTk9fSU5JVDsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCiBjYW1lcmEzX3N0cmVhbSogQ2FtZXJhM1N0cmVhbTo6c3RhcnRDb25maWd1cmF0aW9uKCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwpAQCAtMTUwLDYgKzIyNiw3IEBACiAgICAgICAgICAgICBBTE9HRSgiJXM6IEluIGVycm9yIHN0YXRlIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICBjYXNlIFNUQVRFX0NPTlNUUlVDVEVEOgorICAgICAgICBjYXNlIFNUQVRFX0lOX0lETEU6CiAgICAgICAgICAgICAvLyBPSwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgU1RBVEVfSU5fQ09ORklHOgpAQCAtMTc5LDYgKzI1NiwxMSBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKKyAgICBpZiAobVN0YXRlID09IFNUQVRFX0lOX0lETEUpIHsKKyAgICAgICAgLy8gU2tpcCBjb25maWd1cmF0aW9uLgorICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKICAgICAvLyBTdG9wIHRyYWNraW5nIGlmIGN1cnJlbnRseSBkb2luZyBzbwogICAgIGlmIChtU3RhdHVzSWQgIT0gU3RhdHVzVHJhY2tlcjo6Tk9fU1RBVFVTX0lEKSB7CiAgICAgICAgIHNwPFN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIgPSBtU3RhdHVzVHJhY2tlci5wcm9tb3RlKCk7CkBAIC0yMTksNiArMzAxLDkgQEAKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmlzaCBjb25maWd1cmF0aW9uIHRoYXQgaGFzbid0IGJlZW4gc3RhcnRlZCIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIGNhc2UgU1RBVEVfSU5fSURMRToKKyAgICAgICAgICAgIC8vU2tpcCBjb25maWd1cmF0aW9uIGluIHRoaXMgc3RhdGUKKyAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIEFMT0dFKCIlczogVW5rbm93biBzdGF0ZSIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC0yNjcsNiArMzUyLDcgQEAKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgY2FzZSBTVEFURV9JTl9DT05GSUc6CiAgICAgICAgIGNhc2UgU1RBVEVfSU5fUkVDT05GSUc6CisgICAgICAgIGNhc2UgU1RBVEVfSU5fSURMRToKICAgICAgICAgICAgIC8vIE9LCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBTVEFURV9DT05TVFJVQ1RFRDoKQEAgLTI4Miw3ICszNjgsOSBAQAogICAgIG1Vc2FnZSA9IG1PbGRVc2FnZTsKICAgICBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMgPSBtT2xkTWF4QnVmZmVyczsKIAotICAgIG1TdGF0ZSA9IChtU3RhdGUgPT0gU1RBVEVfSU5fUkVDT05GSUcpID8gU1RBVEVfQ09ORklHVVJFRCA6IFNUQVRFX0NPTlNUUlVDVEVEOworICAgIG1TdGF0ZSA9ICgobVN0YXRlID09IFNUQVRFX0lOX1JFQ09ORklHKSB8fCAobVN0YXRlID09IFNUQVRFX0lOX0lETEUpKSA/IFNUQVRFX0NPTkZJR1VSRUQgOgorICAgICAgICAgICAgU1RBVEVfQ09OU1RSVUNURUQ7CisKICAgICByZXR1cm4gT0s7CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmgKaW5kZXggNmU3OTEyZS4uYTYwY2I1NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxMy0yMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTY4LDYgKzY4LDEyIEBACiAgKiAgICBkdXJhdGlvbi4gIEluIHRoaXMgc3RhdGUsIG9ubHkgcHJlcGFyZU5leHRCdWZmZXIoKSBhbmQgY2FuY2VsUHJlcGFyZSgpCiAgKiAgICBtYXkgYmUgY2FsbGVkLgogICoKKyAqICBTVEFURV9JTl9JRExFOiBUaGlzIGlzIGEgdGVtcG9yYXJ5IHN0YXRlIG9ubHkgaW50ZW5kZWQgdG8gYmUgdXNlZCBmb3IgaW5wdXQKKyAqICAgIHN0cmVhbXMgYW5kIG9ubHkgZm9yIHRoZSBjYXNlIHdoZXJlIHdlIG5lZWQgdG8gcmUtY29uZmlndXJlIHRoZSBjYW1lcmEgZGV2aWNlCisgKiAgICB3aGlsZSB0aGUgaW5wdXQgc3RyZWFtIGhhcyBhbiBvdXRzdGFuZGluZyBidWZmZXIuIEFsbCBvdGhlciBzdHJlYW1zIHNob3VsZCBub3QKKyAqICAgIGJlIGFibGUgdG8gc3dpdGNoIHRvIHRoaXMgc3RhdGUuIEZvciB0aGVtIHRoaXMgaXMgaW52YWxpZCBhbmQgc2hvdWxkIGJlIGhhbmRsZWQKKyAqICAgIGFzIGFuIHVua25vd24gc3RhdGUuCisgKgogICogVHJhbnNpdGlvbiB0YWJsZToKICAqCiAgKiAgICA8bm9uZT4gICAgICAgICAgICAgICA9PiBTVEFURV9DT05TVFJVQ1RFRDoKQEAgLTk4LDYgKzEwNCwxMSBAQAogICogICAgICAgIGFsbCBzdHJlYW0gYnVmZmVycywgb3IgY2FuY2VsUHJlcGFyZSBpcyBjYWxsZWQuCiAgKiAgICBTVEFURV9DT05GSUdVUkVEICAgICA9PiBTVEFURV9BQkFORE9ORUQ6CiAgKiAgICAgICAgV2hlbiB0aGUgYnVmZmVyIHF1ZXVlIG9mIHRoZSBzdHJlYW0gaXMgYWJhbmRvbmVkLgorICogICAgU1RBVEVfQ09ORklHVVJFRCAgICAgPT4gU1RBVEVfSU5fSURMRToKKyAqICAgICAgICBPbmx5IGZvciBhbiBpbnB1dCBzdHJlYW0gd2hpY2ggaGFzIGFuIG91dHN0YW5kaW5nIGJ1ZmZlci4KKyAqICAgIFNUQVRFX0lOX0lETEUgICAgID0+IFNUQVRFX0NPTkZJR1VSRUQ6CisgKiAgICAgICAgQWZ0ZXIgdGhlIGludGVybmFsIHJlLWNvbmZpZ3VyYXRpb24sIHRoZSBpbnB1dCBzaG91bGQgcmV2ZXJ0IGJhY2sgdG8KKyAqICAgICAgICB0aGUgY29uZmlndXJlZCBzdGF0ZS4KICAqCiAgKiBTdGF0dXMgVHJhY2tpbmc6CiAgKiAgICBFYWNoIHN0cmVhbSBpcyB0cmFja2VkIGJ5IFN0YXR1c1RyYWNrZXIgYXMgYSBzZXBhcmF0ZSBjb21wb25lbnQsCkBAIC0xMDgsNyArMTE5LDkgQEAKICAqCiAgKiAgICAtIEFDVElWRTogT25lIG9yIG1vcmUgYnVmZmVycyBoYXZlIGJlZW4gaGFuZGVkIG91dCAod2l0aCAjZ2V0QnVmZmVyKS4KICAqICAgIC0gSURMRTogQWxsIGJ1ZmZlcnMgaGF2ZSBiZWVuIHJldHVybmVkICh3aXRoICNyZXR1cm5CdWZmZXIpLCBhbmQgdGhlaXIKLSAqICAgICAgICAgIHJlc3BlY3RpdmUgcmVsZWFzZV9mZW5jZShzKSBoYXZlIGJlZW4gc2lnbmFsZWQuCisgKiAgICAgICAgICByZXNwZWN0aXZlIHJlbGVhc2VfZmVuY2UocykgaGF2ZSBiZWVuIHNpZ25hbGVkLiBUaGUgb25seSBleGNlcHRpb24gdG8gdGhpcworICogICAgICAgICAgcnVsZSBpcyBhbiBpbnB1dCBzdHJlYW0gdGhhdCBtb3ZlcyB0byAiU1RBVEVfSU5fSURMRSIgZHVyaW5nIGludGVybmFsCisgKiAgICAgICAgICByZS1jb25maWd1cmF0aW9uLgogICoKICAqICAgIEEgdHlwaWNhbCB1c2UgY2FzZSBpcyBvdXRwdXQgc3RyZWFtcy4gV2hlbiB0aGUgSEFMIGhhcyBhbnkgYnVmZmVycwogICogICAgZGVxdWV1ZWQsIHRoZSBzdHJlYW0gaXMgbWFya2VkIEFDVElWRS4gV2hlbiB0aGUgSEFMIHJldHVybnMgYWxsIGJ1ZmZlcnMKQEAgLTE1Miw2ICsxNjUsNyBAQAogICAgIHZvaWQgICAgICAgICAgICAgIHNldERhdGFTcGFjZU92ZXJyaWRlKGJvb2wgZGF0YVNwYWNlT3ZlcnJpZGVuKTsKICAgICBib29sICAgICAgICAgICAgICBpc0RhdGFTcGFjZU92ZXJyaWRkZW4oKSBjb25zdDsKICAgICBhbmRyb2lkX2RhdGFzcGFjZSBnZXRPcmlnaW5hbERhdGFTcGFjZSgpIGNvbnN0OworICAgIGNvbnN0IFN0cmluZzgmICAgIHBoeXNpY2FsQ2FtZXJhSWQoKSBjb25zdDsKIAogICAgIGNhbWVyYTNfc3RyZWFtKiAgIGFzSGFsU3RyZWFtKCkgb3ZlcnJpZGUgewogICAgICAgICByZXR1cm4gdGhpczsKQEAgLTM4Niw2ICs0MDAsMTkgQEAKICAgICAgKi8KICAgICBib29sICAgICAgICAgICAgIGlzQWJhbmRvbmVkKCkgY29uc3Q7CiAKKyAgICAvKioKKyAgICAgKiBTd2l0Y2ggYSBjb25maWd1cmVkIHN0cmVhbSB3aXRoIHBvc3NpYmx5IG91dHN0YW5kaW5nIGJ1ZmZlcnMgaW4gaWRsZQorICAgICAqIHN0YXRlLiBDb25maWd1cmF0aW9uIGZvciBzdWNoIHN0cmVhbXMgd2lsbCBiZSBza2lwcGVkIGFzc3VtaW5nIHRoZXJlCisgICAgICogYXJlIG5vIGNoYW5nZXMgdG8gdGhlIHN0cmVhbSBwYXJhbWV0ZXJzLgorICAgICAqLworICAgIHN0YXR1c190ICAgICAgICAgZm9yY2VUb0lkbGUoKTsKKworICAgIC8qKgorICAgICAqIFJlc3RvcmUgYSBmb3JjZWQgaWRsZSBzdHJlYW0gdG8gY29uZmlndXJlZCBzdGF0ZSwgbWFya2luZyBpdCBhY3RpdmUKKyAgICAgKiBpbiBjYXNlIGl0IGNvbnRhaW5zIG91dHN0YW5kaW5nIGJ1ZmZlcnMuCisgICAgICovCisgICAgc3RhdHVzX3QgICAgICAgICByZXN0b3JlQ29uZmlndXJlZFN0YXRlKCk7CisKICAgcHJvdGVjdGVkOgogICAgIGNvbnN0IGludCBtSWQ7CiAgICAgLyoqCkBAIC00MTQsNyArNDQxLDggQEAKICAgICAgICAgU1RBVEVfSU5fUkVDT05GSUcsCiAgICAgICAgIFNUQVRFX0NPTkZJR1VSRUQsCiAgICAgICAgIFNUQVRFX1BSRVBBUklORywKLSAgICAgICAgU1RBVEVfQUJBTkRPTkVECisgICAgICAgIFNUQVRFX0FCQU5ET05FRCwKKyAgICAgICAgU1RBVEVfSU5fSURMRQogICAgIH0gbVN0YXRlOwogCiAgICAgbXV0YWJsZSBNdXRleCBtTG9jazsKQEAgLTQyMiw3ICs0NTAsNyBAQAogICAgIENhbWVyYTNTdHJlYW0oaW50IGlkLCBjYW1lcmEzX3N0cmVhbV90eXBlIHR5cGUsCiAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBzaXplX3QgbWF4U2l6ZSwgaW50IGZvcm1hdCwKICAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwKLSAgICAgICAgICAgIGludCBzZXRJZCk7CisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLCBpbnQgc2V0SWQpOwogCiAgICAgd3A8Q2FtZXJhM1N0cmVhbUJ1ZmZlckZyZWVkTGlzdGVuZXI+IG1CdWZmZXJGcmVlZExpc3RlbmVyOwogCkBAIC01MjksNiArNTU3LDcgQEAKICAgICBib29sIG1EYXRhU3BhY2VPdmVycmlkZGVuOwogICAgIGFuZHJvaWRfZGF0YXNwYWNlIG1PcmlnaW5hbERhdGFTcGFjZTsKIAorICAgIFN0cmluZzggbVBoeXNpY2FsQ2FtZXJhSWQ7CiB9OyAvLyBjbGFzcyBDYW1lcmEzU3RyZWFtCiAKIH07IC8vIG5hbWVzcGFjZSBjYW1lcmEzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1JbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oCmluZGV4IGNjOWJmOGUuLjllZDcxODQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oCkBAIC00Myw2ICs0MywyNCBAQAogCiBjbGFzcyBTdGF0dXNUcmFja2VyOwogCisvLyBPdXRwdXRTdHJlYW1JbmZvIGRlc2NyaWJlcyB0aGUgcHJvcGVydHkgb2YgYSBjYW1lcmEgc3RyZWFtLgorY2xhc3MgT3V0cHV0U3RyZWFtSW5mbyB7CisgICAgcHVibGljOgorICAgICAgICBpbnQgd2lkdGg7CisgICAgICAgIGludCBoZWlnaHQ7CisgICAgICAgIGludCBmb3JtYXQ7CisgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZTsKKyAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZTsKKyAgICAgICAgYm9vbCBmaW5hbGl6ZWQgPSBmYWxzZTsKKyAgICAgICAgT3V0cHV0U3RyZWFtSW5mbygpIDoKKyAgICAgICAgICAgIHdpZHRoKC0xKSwgaGVpZ2h0KC0xKSwgZm9ybWF0KC0xKSwgZGF0YVNwYWNlKEhBTF9EQVRBU1BBQ0VfVU5LTk9XTiksCisgICAgICAgICAgICBjb25zdW1lclVzYWdlKDApIHt9CisgICAgICAgIE91dHB1dFN0cmVhbUluZm8oaW50IF93aWR0aCwgaW50IF9oZWlnaHQsIGludCBfZm9ybWF0LCBhbmRyb2lkX2RhdGFzcGFjZSBfZGF0YVNwYWNlLAorICAgICAgICAgICAgICAgIHVpbnQ2NF90IF9jb25zdW1lclVzYWdlKSA6CisgICAgICAgICAgICB3aWR0aChfd2lkdGgpLCBoZWlnaHQoX2hlaWdodCksIGZvcm1hdChfZm9ybWF0KSwKKyAgICAgICAgICAgIGRhdGFTcGFjZShfZGF0YVNwYWNlKSwgY29uc3VtZXJVc2FnZShfY29uc3VtZXJVc2FnZSkge30KK307CisKIC8qKgogICogQW4gaW50ZXJmYWNlIGZvciBtYW5hZ2luZyBhIHNpbmdsZSBzdHJlYW0gb2YgaW5wdXQgYW5kL29yIG91dHB1dCBkYXRhIGZyb20KICAqIHRoZSBjYW1lcmEgZGV2aWNlLgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuY3BwCmluZGV4IGEwYTUwYzIuLjU5YWM2MzYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5jcHAKQEAgLTM4LDggKzM4LDkgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdGF0dXNfdCBDYW1lcmEzU3RyZWFtU3BsaXR0ZXI6OmNvbm5lY3QoY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4gPiYgc3VyZmFjZXMsCi0gICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UsIHNpemVfdCBoYWxNYXhCdWZmZXJzLCBzcDxTdXJmYWNlPiogY29uc3VtZXIpIHsKK3N0YXR1c190IENhbWVyYTNTdHJlYW1TcGxpdHRlcjo6Y29ubmVjdChjb25zdCBzdGQ6OnVub3JkZXJlZF9tYXA8c2l6ZV90LCBzcDxTdXJmYWNlPj4gJnN1cmZhY2VzLAorICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlLCB1aW50NjRfdCBwcm9kdWNlclVzYWdlLCBzaXplX3QgaGFsTWF4QnVmZmVycywgdWludDMyX3Qgd2lkdGgsCisgICAgICAgIHVpbnQzMl90IGhlaWdodCwgYW5kcm9pZDo6UGl4ZWxGb3JtYXQgZm9ybWF0LCBzcDxTdXJmYWNlPiogY29uc3VtZXIpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIGlmIChjb25zdW1lciA9PSBudWxscHRyKSB7CiAgICAgICAgIFNQX0xPR0UoIiVzOiBjb25zdW1lciBwb2ludGVyIGlzIE5VTEwiLCBfX0ZVTkNUSU9OX18pOwpAQCAtNjIsMTIgKzYzLDEyIEBACiAgICAgbUNvbnN1bWVyTmFtZSA9IGdldFVuaXF1ZUNvbnN1bWVyTmFtZSgpOwogICAgIC8vIEFkZCBvdXRwdXQgc3VyZmFjZXMuIFRoaXMgaGFzIHRvIGJlIGJlZm9yZSBjcmVhdGluZyBpbnRlcm5hbCBidWZmZXIgcXVldWUKICAgICAvLyBpbiBvcmRlciB0byBnZXQgbWF4IGNvbnN1bWVyIHNpZGUgYnVmZmVycy4KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN1cmZhY2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChzdXJmYWNlc1tpXSA9PSBudWxscHRyKSB7CisgICAgZm9yIChhdXRvICZpdCA6IHN1cmZhY2VzKSB7CisgICAgICAgIGlmIChpdC5zZWNvbmQgPT0gbnVsbHB0cikgewogICAgICAgICAgICAgU1BfTE9HRSgiJXM6IEZhdGFsOiBzdXJmYWNlIGlzIE5VTEwiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQotICAgICAgICByZXMgPSBhZGRPdXRwdXRMb2NrZWQoc3VyZmFjZXNbaV0pOworICAgICAgICByZXMgPSBhZGRPdXRwdXRMb2NrZWQoaXQuZmlyc3QsIGl0LnNlY29uZCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIFNQX0xPR0UoIiVzOiBGYWlsZWQgdG8gYWRkIG91dHB1dCBzdXJmYWNlOiAlcyglZCkiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOwpAQCAtOTQsOCArOTUsMjAgQEAKICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKICAgICB9CiAKKyAgICByZXMgPSBtUHJvZHVjZXItPnNldEFzeW5jTW9kZSh0cnVlKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIFNQX0xPR0UoIiVzOiBGYWlsZWQgdG8gZW5hYmxlIGlucHV0IHF1ZXVlIGFzeW5jIG1vZGU6ICVzKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKICAgICByZXMgPSBtQ29uc3VtZXItPmNvbnN1bWVyQ29ubmVjdCh0aGlzLCAvKiBjb250cm9sbGVkQnlBcHAgKi8gZmFsc2UpOwogCisgICAgbVdpZHRoID0gd2lkdGg7CisgICAgbUhlaWdodCA9IGhlaWdodDsKKyAgICBtRm9ybWF0ID0gZm9ybWF0OworICAgIG1Qcm9kdWNlclVzYWdlID0gcHJvZHVjZXJVc2FnZTsKKwogICAgIFNQX0xPR1YoIiVzOiBjb25uZWN0ZWQiLCBfX0ZVTkNUSU9OX18pOwogICAgIHJldHVybiByZXM7CiB9CkBAIC0xMTcsMTAgKzEzMCwxMyBAQAogICAgIG1Ob3RpZmllcnMuY2xlYXIoKTsKIAogICAgIGZvciAoYXV0byYgb3V0cHV0IDogbU91dHB1dHMpIHsKLSAgICAgICAgb3V0cHV0LT5kaXNjb25uZWN0KE5BVElWRV9XSU5ET1dfQVBJX0NBTUVSQSk7CisgICAgICAgIGlmIChvdXRwdXQuc2Vjb25kICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG91dHB1dC5zZWNvbmQtPmRpc2Nvbm5lY3QoTkFUSVZFX1dJTkRPV19BUElfQ0FNRVJBKTsKKyAgICAgICAgfQogICAgIH0KICAgICBtT3V0cHV0cy5jbGVhcigpOwogICAgIG1PdXRwdXRTbG90cy5jbGVhcigpOworICAgIG1Db25zdW1lckJ1ZmZlckNvdW50LmNsZWFyKCk7CiAKICAgICBtQ29uc3VtZXItPmNvbnN1bWVyRGlzY29ubmVjdCgpOwogCkBAIC0xMzksMTAgKzE1NSwxMCBAQAogICAgIGRpc2Nvbm5lY3QoKTsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbVNwbGl0dGVyOjphZGRPdXRwdXQoY29uc3Qgc3A8U3VyZmFjZT4mIG91dHB1dFF1ZXVlKSB7CitzdGF0dXNfdCBDYW1lcmEzU3RyZWFtU3BsaXR0ZXI6OmFkZE91dHB1dChzaXplX3Qgc3VyZmFjZUlkLCBjb25zdCBzcDxTdXJmYWNlPiYgb3V0cHV0UXVldWUpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0gICAgc3RhdHVzX3QgcmVzID0gYWRkT3V0cHV0TG9ja2VkKG91dHB1dFF1ZXVlKTsKKyAgICBzdGF0dXNfdCByZXMgPSBhZGRPdXRwdXRMb2NrZWQoc3VyZmFjZUlkLCBvdXRwdXRRdWV1ZSk7CiAKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIFNQX0xPR0UoIiVzOiBhZGRPdXRwdXRMb2NrZWQgZmFpbGVkICVkIiwgX19GVU5DVElPTl9fLCByZXMpOwpAQCAtMTU0LDE4ICsxNzAsMzAgQEAKICAgICByZXR1cm4gcmVzOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzU3RyZWFtU3BsaXR0ZXI6OmFkZE91dHB1dExvY2tlZChjb25zdCBzcDxTdXJmYWNlPiYgb3V0cHV0UXVldWUpIHsKK3N0YXR1c190IENhbWVyYTNTdHJlYW1TcGxpdHRlcjo6YWRkT3V0cHV0TG9ja2VkKHNpemVfdCBzdXJmYWNlSWQsIGNvbnN0IHNwPFN1cmZhY2U+JiBvdXRwdXRRdWV1ZSkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgaWYgKG91dHB1dFF1ZXVlID09IG51bGxwdHIpIHsKICAgICAgICAgU1BfTE9HRSgiYWRkT3V0cHV0OiBvdXRwdXRRdWV1ZSBtdXN0IG5vdCBiZSBOVUxMIik7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCisgICAgaWYgKG1PdXRwdXRzW3N1cmZhY2VJZF0gIT0gbnVsbHB0cikgeworICAgICAgICBTUF9MT0dFKCIlczogc3VyZmFjZUlkOiAldSBhbHJlYWR5IHRha2VuISIsIF9fRlVOQ1RJT05fXywgKHVuc2lnbmVkKSBzdXJmYWNlSWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICBzdGF0dXNfdCByZXMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2RpbWVuc2lvbnMob3V0cHV0UXVldWUuZ2V0KCksCisgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOworICAgIGlmIChyZXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgU1BfTE9HRSgiYWRkT3V0cHV0OiBmYWlsZWQgdG8gc2V0IGJ1ZmZlciBkaW1lbnNpb25zICglZCkiLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKwogICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGdicCA9IG91dHB1dFF1ZXVlLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCk7CiAgICAgLy8gQ29ubmVjdCB0byB0aGUgYnVmZmVyIHByb2R1Y2VyCiAgICAgc3A8T3V0cHV0TGlzdGVuZXI+IGxpc3RlbmVyKG5ldyBPdXRwdXRMaXN0ZW5lcih0aGlzLCBnYnApKTsKICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihnYnApLT5saW5rVG9EZWF0aChsaXN0ZW5lcik7Ci0gICAgc3RhdHVzX3QgcmVzID0gb3V0cHV0UXVldWUtPmNvbm5lY3QoTkFUSVZFX1dJTkRPV19BUElfQ0FNRVJBLCBsaXN0ZW5lcik7CisgICAgcmVzID0gb3V0cHV0UXVldWUtPmNvbm5lY3QoTkFUSVZFX1dJTkRPV19BUElfQ0FNRVJBLCBsaXN0ZW5lcik7CiAgICAgaWYgKHJlcyAhPSBOT19FUlJPUikgewogICAgICAgICBTUF9MT0dFKCJhZGRPdXRwdXQ6IGZhaWxlZCB0byBjb25uZWN0ICglZCkiLCByZXMpOwogICAgICAgICByZXR1cm4gcmVzOwpAQCAtMTg0LDcgKzIxMiwxMSBAQAogCiAgICAgU1BfTE9HVigiJXM6IENvbnN1bWVyIHdhbnRzICVkIGJ1ZmZlcnMsIFByb2R1Y2VyIHdhbnRzICV6dSIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgIG1heENvbnN1bWVyQnVmZmVycywgbU1heEhhbEJ1ZmZlcnMpOwotICAgIHNpemVfdCB0b3RhbEJ1ZmZlckNvdW50ID0gbWF4Q29uc3VtZXJCdWZmZXJzICsgbU1heEhhbEJ1ZmZlcnM7CisgICAgLy8gVGhlIG91dHB1dCBzbG90IGNvdW50IHJlcXVpcmVtZW50IGNhbiBjaGFuZ2UgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGFtb3VudAorICAgIC8vIG9mIG91dHB1dHMgYW5kIGluY29taW5nIGJ1ZmZlciBjb25zdW1wdGlvbiByYXRlLiBUbyBhdm9pZCBhbnkgaXNzdWVzIHdpdGgKKyAgICAvLyBpbnN1ZmZpY2llbnQgc2xvdHMsIHNldCB0aGVpciBjb3VudCB0byB0aGUgbWF4aW11bSBzdXBwb3J0ZWQuIFRoZSBvdXRwdXQKKyAgICAvLyBzdXJmYWNlIGJ1ZmZlciBhbGxvY2F0aW9uIGlzIGRpc2FibGVkIHNvIG5vIHJlYWwgYnVmZmVycyB3aWxsIGdldCBhbGxvY2F0ZWQuCisgICAgc2l6ZV90IHRvdGFsQnVmZmVyQ291bnQgPSBCdWZmZXJRdWV1ZTo6TlVNX0JVRkZFUl9TTE9UUzsKICAgICByZXMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJfY291bnQob3V0cHV0UXVldWUuZ2V0KCksCiAgICAgICAgICAgICB0b3RhbEJ1ZmZlckNvdW50KTsKICAgICBpZiAocmVzICE9IE9LKSB7CkBAIC0yMDgsNyArMjQwLDggQEAKICAgICB9CiAKICAgICAvLyBBZGQgbmV3IGVudHJ5IGludG8gbU91dHB1dHMKLSAgICBtT3V0cHV0cy5wdXNoX2JhY2soZ2JwKTsKKyAgICBtT3V0cHV0c1tzdXJmYWNlSWRdID0gZ2JwOworICAgIG1Db25zdW1lckJ1ZmZlckNvdW50W3N1cmZhY2VJZF0gPSBtYXhDb25zdW1lckJ1ZmZlcnM7CiAgICAgbU5vdGlmaWVyc1tnYnBdID0gbGlzdGVuZXI7CiAgICAgbU91dHB1dFNsb3RzW2dicF0gPSBzdGQ6Om1ha2VfdW5pcXVlPE91dHB1dFNsb3RzPih0b3RhbEJ1ZmZlckNvdW50KTsKIApAQCAtMjE2LDggKzI0OSw4MCBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbVNwbGl0dGVyOjpyZW1vdmVPdXRwdXQoc2l6ZV90IHN1cmZhY2VJZCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKKworICAgIHN0YXR1c190IHJlcyA9IHJlbW92ZU91dHB1dExvY2tlZChzdXJmYWNlSWQpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgU1BfTE9HRSgiJXM6IHJlbW92ZU91dHB1dExvY2tlZCBmYWlsZWQgJWQiLCBfX0ZVTkNUSU9OX18sIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgcmVzID0gbUNvbnN1bWVyLT5zZXRNYXhBY3F1aXJlZEJ1ZmZlckNvdW50KG1NYXhDb25zdW1lckJ1ZmZlcnMrMSk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBTUF9MT0dFKCIlczogc2V0TWF4QWNxdWlyZWRCdWZmZXJDb3VudCBmYWlsZWQgJWQiLCBfX0ZVTkNUSU9OX18sIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbVNwbGl0dGVyOjpyZW1vdmVPdXRwdXRMb2NrZWQoc2l6ZV90IHN1cmZhY2VJZCkgeworICAgIGlmIChtT3V0cHV0c1tzdXJmYWNlSWRdID09IG51bGxwdHIpIHsKKyAgICAgICAgU1BfTE9HRSgiJXM6IG91dHB1dCBzdXJmYWNlIGlzIG5vdCBwcmVzZW50ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gZ2JwID0gbU91dHB1dHNbc3VyZmFjZUlkXTsKKyAgICAvL1NlYXJjaCBhbmQgZGVjcmVtZW50IHRoZSByZWYuIGNvdW50IG9mIGFueSBidWZmZXJzIHRoYXQgYXJlCisgICAgLy9zdGlsbCBhdHRhY2hlZCB0byB0aGUgcmVtb3ZlZCBzdXJmYWNlLgorICAgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBwZW5kaW5nQnVmZmVySWRzOworICAgIGF1dG8mIG91dHB1dFNsb3RzID0gKm1PdXRwdXRTbG90c1tnYnBdOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0U2xvdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG91dHB1dFNsb3RzW2ldICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHBlbmRpbmdCdWZmZXJJZHMucHVzaF9iYWNrKG91dHB1dFNsb3RzW2ldLT5nZXRJZCgpKTsKKyAgICAgICAgICAgIGF1dG8gcmMgPSBnYnAtPmRldGFjaEJ1ZmZlcihpKTsKKyAgICAgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIC8vQnVmZmVycyB0aGF0IGZhaWwgdG8gZGV0YWNoIGhlcmUgd2lsbCBiZSBzY2hlZHVsZWQgZm9yIGRldGFjaCBpbiB0aGUKKyAgICAgICAgICAgICAgICAvL2lucHV0IGJ1ZmZlciBxdWV1ZSBhbmQgdGhlIHJlc3Qgb2YgdGhlIHJlZ2lzdGVyZWQgb3V0cHV0cyBpbnN0ZWFkLgorICAgICAgICAgICAgICAgIC8vVGhpcyB3aWxsIGhlbHAgZW5zdXJlIHRoYXQgY2FtZXJhIHN0b3BzIGFjY2Vzc2luZyBidWZmZXJzIHRoYXQgc3RpbGwKKyAgICAgICAgICAgICAgICAvL2NhbiBnZXQgcmVmZXJlbmNlZCBieSB0aGUgZGlzY29ubmVjdGVkIG91dHB1dC4KKyAgICAgICAgICAgICAgICBtRGV0YWNoZWRCdWZmZXJzLmVtcGxhY2Uob3V0cHV0U2xvdHNbaV0tPmdldElkKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG1PdXRwdXRzW3N1cmZhY2VJZF0gPSBudWxscHRyOworICAgIG1PdXRwdXRTbG90c1tnYnBdID0gbnVsbHB0cjsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmlkIDogcGVuZGluZ0J1ZmZlcklkcykgeworICAgICAgICBkZWNyZW1lbnRCdWZSZWZDb3VudExvY2tlZChpZCwgc3VyZmFjZUlkKTsKKyAgICB9CisKKyAgICBhdXRvIHJlcyA9IElJbnRlcmZhY2U6OmFzQmluZGVyKGdicCktPnVubGlua1RvRGVhdGgobU5vdGlmaWVyc1tnYnBdKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIFNQX0xPR0UoIiVzOiBGYWlsZWQgdG8gdW5saW5rIHByb2R1Y2VyIGRlYXRoIGxpc3RlbmVyOiAlZCAiLCBfX0ZVTkNUSU9OX18sIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgcmVzID0gZ2JwLT5kaXNjb25uZWN0KE5BVElWRV9XSU5ET1dfQVBJX0NBTUVSQSk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBTUF9MT0dFKCIlczogVW5hYmxlIGRpc2Nvbm5lY3QgZnJvbSBwcm9kdWNlciBpbnRlcmZhY2U6ICVkICIsIF9fRlVOQ1RJT05fXywgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBtTm90aWZpZXJzW2dicF0gPSBudWxscHRyOworICAgIGlmIChtQ29uc3VtZXJCdWZmZXJDb3VudFtzdXJmYWNlSWRdIDwgbU1heEhhbEJ1ZmZlcnMpIHsKKyAgICAgICAgbU1heENvbnN1bWVyQnVmZmVycyAtPSBtQ29uc3VtZXJCdWZmZXJDb3VudFtzdXJmYWNlSWRdOworICAgIH0gZWxzZSB7CisgICAgICAgIFNQX0xPR0UoIiVzOiBDYWNoZWQgY29uc3VtZXIgYnVmZmVyIGNvdW50IG1pc21hdGNoISIsIF9fRlVOQ1RJT05fXyk7CisgICAgfQorICAgIG1Db25zdW1lckJ1ZmZlckNvdW50W3N1cmZhY2VJZF0gPSAwOworCisgICAgcmV0dXJuIHJlczsKK30KKwogc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbVNwbGl0dGVyOjpvdXRwdXRCdWZmZXJMb2NrZWQoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIG91dHB1dCwKLSAgICAgICAgY29uc3QgQnVmZmVySXRlbSYgYnVmZmVySXRlbSkgeworICAgICAgICBjb25zdCBCdWZmZXJJdGVtJiBidWZmZXJJdGVtLCBzaXplX3Qgc3VyZmFjZUlkKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBzdGF0dXNfdCByZXM7CiAgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCBxdWV1ZUlucHV0KApAQCAtMjQyLDYgKzM0NywxMSBAQAogCiAgICAgU1BfTE9HVigiJXM6IFF1ZXVpbmcgYnVmZmVyIHRvIGJ1ZmZlciBxdWV1ZSAlcCBzbG90ICVkIHJldHVybnMgJWQiLAogICAgICAgICAgICAgX19GVU5DVElPTl9fLCBvdXRwdXQuZ2V0KCksIHNsb3QsIHJlcyk7CisgICAgLy9EdXJpbmcgYnVmZmVyIHF1ZXVlICdtTXV0ZXgnIGlzIG5vdCBoZWxkIHdoaWNoIG1ha2VzIHRoZSByZW1vdmFsIG9mCisgICAgLy8ib3V0cHV0IiBwb3NzaWJsZS4gQ2hlY2sgd2hldGhlciB0aGlzIGlzIHRoZSBjYXNlIGFuZCByZXR1cm4uCisgICAgaWYgKG1PdXRwdXRTbG90c1tvdXRwdXRdID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBpZiAocmVzICE9IE5PX0lOSVQgJiYgcmVzICE9IERFQURfT0JKRUNUKSB7CiAgICAgICAgICAgICBTUF9MT0dFKCJRdWV1aW5nIGJ1ZmZlciB0byBvdXRwdXQgZmFpbGVkICglZCkiLCByZXMpOwpAQCAtMjUwLDcgKzM2MCw3IEBACiAgICAgICAgIC8vIHRoYXQsIGluY3JlbWVudCB0aGUgcmVsZWFzZSBjb3VudCBzbyB0aGF0IHdlIHN0aWxsIHJlbGVhc2UgdGhpcwogICAgICAgICAvLyBidWZmZXIgZXZlbnR1YWxseSwgYW5kIG1vdmUgb24gdG8gdGhlIG5leHQgb3V0cHV0CiAgICAgICAgIG9uQWJhbmRvbmVkTG9ja2VkKCk7Ci0gICAgICAgIGRlY3JlbWVudEJ1ZlJlZkNvdW50TG9ja2VkKGJ1ZmZlckl0ZW0ubUdyYXBoaWNCdWZmZXItPmdldElkKCksIG91dHB1dCk7CisgICAgICAgIGRlY3JlbWVudEJ1ZlJlZkNvdW50TG9ja2VkKGJ1ZmZlckl0ZW0ubUdyYXBoaWNCdWZmZXItPmdldElkKCksIHN1cmZhY2VJZCk7CiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCkBAIC0yNTgsNyArMzY4LDcgQEAKICAgICAvLyBxdWV1ZSwgbm8gb25CdWZmZXJSZWxlYXNlZCBpcyBjYWxsZWQgYnkgdGhlIGJ1ZmZlciBxdWV1ZS4KICAgICAvLyBQcm9hY3RpdmVseSB0cmlnZ2VyIHRoZSBjYWxsYmFjayB0byBhdm9pZCBidWZmZXIgbG9zcy4KICAgICBpZiAocXVldWVPdXRwdXQuYnVmZmVyUmVwbGFjZWQpIHsKLSAgICAgICAgb25CdWZmZXJSZWxlYXNlZEJ5T3V0cHV0TG9ja2VkKG91dHB1dCk7CisgICAgICAgIG9uQnVmZmVyUmVwbGFjZWRMb2NrZWQob3V0cHV0LCBzdXJmYWNlSWQpOwogICAgIH0KIAogICAgIHJldHVybiByZXM7CkBAIC0yNzEsNyArMzgxLDYgQEAKIAogc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbVNwbGl0dGVyOjpub3RpZnlCdWZmZXJSZWxlYXNlZChjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgYnVmZmVyKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKLSAgICBzdGF0dXNfdCByZXMgPSBPSzsKIAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7CiAKQEAgLTI3OSwxNyArMzg4LDcgQEAKICAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyVHJhY2tlcj4gdHJhY2tlcl9wdHIgPSBzdGQ6Om1vdmUobUJ1ZmZlcnNbYnVmZmVySWRdKTsKICAgICBtQnVmZmVycy5lcmFzZShidWZmZXJJZCk7CiAKLSAgICBmb3IgKGNvbnN0IGF1dG8gc3VyZmFjZSA6IHRyYWNrZXJfcHRyLT5yZXF1ZXN0ZWRTdXJmYWNlcygpKSB7Ci0gICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBnYnAgPSBtT3V0cHV0c1tzdXJmYWNlXTsKLSAgICAgICAgT3V0cHV0U2xvdHMmIG91dHB1dFNsb3RzID0gKihtT3V0cHV0U2xvdHNbZ2JwXSk7Ci0gICAgICAgIGludCBzbG90ID0gZ2V0U2xvdEZvck91dHB1dExvY2tlZChnYnAsIGJ1ZmZlcik7Ci0gICAgICAgIGlmIChzbG90ICE9IEJ1ZmZlckl0ZW06OklOVkFMSURfQlVGRkVSX1NMT1QpIHsKLSAgICAgICAgICAgICBnYnAtPmRldGFjaEJ1ZmZlcihzbG90KTsKLSAgICAgICAgICAgICBvdXRwdXRTbG90c1tzbG90XS5jbGVhcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlczsKKyAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IENhbWVyYTNTdHJlYW1TcGxpdHRlcjo6YXR0YWNoQnVmZmVyVG9PdXRwdXRzKEFOYXRpdmVXaW5kb3dCdWZmZXIqIGFuYiwKQEAgLTMwNyw3ICs0MDYsMTUgQEAKIAogICAgIGZvciAoYXV0byYgc3VyZmFjZV9pZCA6IHN1cmZhY2VfaWRzKSB7CiAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBnYnAgPSBtT3V0cHV0c1tzdXJmYWNlX2lkXTsKLSAgICAgICAgaW50IHNsb3QgPSBCdWZmZXJJdGVtOjpJTlZBTElEX0JVRkZFUl9TTE9UOworICAgICAgICBpZiAoZ2JwLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIC8vT3V0cHV0IHN1cmZhY2UgZ290IGxpa2VseSByZW1vdmVkIGJ5IGNsaWVudC4KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGludCBzbG90ID0gZ2V0U2xvdEZvck91dHB1dExvY2tlZChnYnAsIGdiKTsKKyAgICAgICAgaWYgKHNsb3QgIT0gQnVmZmVySXRlbTo6SU5WQUxJRF9CVUZGRVJfU0xPVCkgeworICAgICAgICAgICAgLy9CdWZmZXIgaXMgYWxyZWFkeSBhdHRhY2hlZCB0byB0aGlzIG91dHB1dCBzdXJmYWNlLgorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KICAgICAgICAgLy9UZW1wb3Jhcmx5IFVubG9jayB0aGUgbXV0ZXggd2hlbiB0cnlpbmcgdG8gYXR0YWNoQnVmZmVyIHRvIHRoZSBvdXRwdXQKICAgICAgICAgLy9xdWV1ZSwgYmVjYXVzZSBhdHRhY2hCdWZmZXIgY291bGQgYmxvY2sgaW4gY2FzZSBvZiBhIHNsb3cgY29uc3VtZXIuIElmCiAgICAgICAgIC8vd2UgYmxvY2sgd2hpbGUgaG9sZGluZyB0aGUgbG9jaywgb25GcmFtZUF2YWlsYWJsZSBhbmQgb25CdWZmZXJSZWxlYXNlZApAQCAtMzIwLDEyICs0MjcsMjUgQEAKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBnYnAuZ2V0KCksIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQorICAgICAgICBpZiAoKHNsb3QgPCAwKSB8fCAoc2xvdCA+IEJ1ZmZlclF1ZXVlOjpOVU1fQlVGRkVSX1NMT1RTKSkgeworICAgICAgICAgICAgU1BfTE9HRSgiJXM6IFNsb3QgcmVjZWl2ZWQgJWQgZWl0aGVyIGJpZ2dlciB0aGFuIGV4cGVjdGVkIG1heGltdW0gJWQgb3IgbmVnYXRpdmUhIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzbG90LCBCdWZmZXJRdWV1ZTo6TlVNX0JVRkZFUl9TTE9UUyk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIC8vRHVyaW5nIGJ1ZmZlciBhdHRhY2ggJ21NdXRleCcgaXMgbm90IGhlbGQgd2hpY2ggbWFrZXMgdGhlIHJlbW92YWwgb2YKKyAgICAgICAgLy8iZ2JwIiBwb3NzaWJsZS4gQ2hlY2sgd2hldGhlciB0aGlzIGlzIHRoZSBjYXNlIGFuZCBjb250aW51ZS4KKyAgICAgICAgaWYgKG1PdXRwdXRTbG90c1tnYnBdID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAgICAgICAgIGF1dG8mIG91dHB1dFNsb3RzID0gKm1PdXRwdXRTbG90c1tnYnBdOworICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8c2l6ZV90PiAoc2xvdCArIDEpID4gb3V0cHV0U2xvdHMuc2l6ZSgpKSB7CisgICAgICAgICAgICBvdXRwdXRTbG90cy5yZXNpemUoc2xvdCArIDEpOworICAgICAgICB9CiAgICAgICAgIGlmIChvdXRwdXRTbG90c1tzbG90XSAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICAvLyBJZiB0aGUgYnVmZmVyIGlzIGF0dGFjaGVkIHRvIGEgc2xvdCB3aGljaCBhbHJlYWR5IGNvbnRhaW5zIGEgYnVmZmVyLAogICAgICAgICAgICAgLy8gdGhlIHByZXZpb3VzIGJ1ZmZlciB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgb3V0cHV0IHF1ZXVlLiBEZWNyZW1lbnQKICAgICAgICAgICAgIC8vIHRoZSByZWZlcmVuY2UgY291bnQgYWNjb3JkaW5nbHkuCi0gICAgICAgICAgICBkZWNyZW1lbnRCdWZSZWZDb3VudExvY2tlZChvdXRwdXRTbG90c1tzbG90XS0+Z2V0SWQoKSwgZ2JwKTsKKyAgICAgICAgICAgIGRlY3JlbWVudEJ1ZlJlZkNvdW50TG9ja2VkKG91dHB1dFNsb3RzW3Nsb3RdLT5nZXRJZCgpLCBzdXJmYWNlX2lkKTsKICAgICAgICAgfQogICAgICAgICBTUF9MT0dWKCIlczogQXR0YWNoZWQgYnVmZmVyICVwIHRvIHNsb3QgJWQgb24gb3V0cHV0ICVwLiIsX19GVU5DVElPTl9fLCBnYi5nZXQoKSwKICAgICAgICAgICAgICAgICBzbG90LCBnYnAuZ2V0KCkpOwpAQCAtMzQ5LDcgKzQ2OSwyMSBAQAogICAgICAgICBtT25GcmFtZUF2YWlsYWJsZVJlcy5zdG9yZShyZXMpOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGlmIChtQnVmZmVycy5maW5kKGJ1ZmZlckl0ZW0ubUdyYXBoaWNCdWZmZXItPmdldElkKCkpID09IG1CdWZmZXJzLmVuZCgpKSB7CisKKyAgICB1aW50NjRfdCBidWZmZXJJZDsKKyAgICBpZiAoYnVmZmVySXRlbS5tR3JhcGhpY0J1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgIG1JbnB1dFNsb3RzW2J1ZmZlckl0ZW0ubVNsb3RdID0gYnVmZmVySXRlbTsKKyAgICB9IGVsc2UgaWYgKGJ1ZmZlckl0ZW0ubUFjcXVpcmVDYWxsZWQpIHsKKyAgICAgICAgYnVmZmVySXRlbS5tR3JhcGhpY0J1ZmZlciA9IG1JbnB1dFNsb3RzW2J1ZmZlckl0ZW0ubVNsb3RdLm1HcmFwaGljQnVmZmVyOworICAgICAgICBtSW5wdXRTbG90c1tidWZmZXJJdGVtLm1TbG90XS5tRnJhbWVOdW1iZXIgPSBidWZmZXJJdGVtLm1GcmFtZU51bWJlcjsKKyAgICB9IGVsc2UgeworICAgICAgICBTUF9MT0dFKCIlczogSW52YWxpZCBpbnB1dCBncmFwaGljIGJ1ZmZlciEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXMgPSBCQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYnVmZmVySWQgPSBidWZmZXJJdGVtLm1HcmFwaGljQnVmZmVyLT5nZXRJZCgpOworCisgICAgaWYgKG1CdWZmZXJzLmZpbmQoYnVmZmVySWQpID09IG1CdWZmZXJzLmVuZCgpKSB7CiAgICAgICAgIFNQX0xPR0UoIiVzOiBBY3F1aXJlZCBidWZmZXIgZG9lc24ndCBleGlzdCBpbiBhdHRhY2hlZCBidWZmZXIgbWFwIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOwogICAgICAgICBtT25GcmFtZUF2YWlsYWJsZVJlcy5zdG9yZShJTlZBTElEX09QRVJBVElPTik7CkBAIC0zNTksMjQgKzQ5MywxOSBAQAogICAgIFNQX0xPR1YoImFjcXVpcmVkIGJ1ZmZlciAlIiBQUklkNjQgIiBmcm9tIGlucHV0IGF0IHNsb3QgJWQiLAogICAgICAgICAgICAgYnVmZmVySXRlbS5tR3JhcGhpY0J1ZmZlci0+Z2V0SWQoKSwgYnVmZmVySXRlbS5tU2xvdCk7CiAKLSAgICByZXMgPSBtQ29uc3VtZXItPmRldGFjaEJ1ZmZlcihidWZmZXJJdGVtLm1TbG90KTsKLSAgICBpZiAocmVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIFNQX0xPR0UoIiVzOiBkZXRhY2hpbmcgYnVmZmVyIGZyb20gaW5wdXQgZmFpbGVkICglZCkiLCBfX0ZVTkNUSU9OX18sIHJlcyk7Ci0gICAgICAgIG1PbkZyYW1lQXZhaWxhYmxlUmVzLnN0b3JlKHJlcyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KICAgICAvLyBBdHRhY2ggYW5kIHF1ZXVlIHRoZSBidWZmZXIgdG8gZWFjaCBvZiB0aGUgb3V0cHV0cwotICAgIEJ1ZmZlclRyYWNrZXImIHRyYWNrZXIgPSAqKG1CdWZmZXJzW2J1ZmZlckl0ZW0ubUdyYXBoaWNCdWZmZXItPmdldElkKCldKTsKKyAgICBCdWZmZXJUcmFja2VyJiB0cmFja2VyID0gKihtQnVmZmVyc1tidWZmZXJJZF0pOwogCiAgICAgU1BfTE9HVigiJXM6IEJ1ZmZlclRyYWNrZXIgZm9yIGJ1ZmZlciAlIiBQUklkNjQgIiwgbnVtYmVyIG9mIHJlcXVlc3RzICV6dSIsCiAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmZmVySXRlbS5tR3JhcGhpY0J1ZmZlci0+Z2V0SWQoKSwgdHJhY2tlci5yZXF1ZXN0ZWRTdXJmYWNlcygpLnNpemUoKSk7CiAgICAgZm9yIChjb25zdCBhdXRvIGlkIDogdHJhY2tlci5yZXF1ZXN0ZWRTdXJmYWNlcygpKSB7CiAKLSAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihpZCA+PSBtT3V0cHV0cy5zaXplKCksCi0gICAgICAgICAgICAgICAgInJlcXVlc3RlZCBzdXJmYWNlIGlkIGV4Y2VlZGluZyBtYXggcmVnaXN0ZXJlZCBpZHMiKTsKKyAgICAgICAgaWYgKG1PdXRwdXRzW2lkXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAvL091dHB1dCBzdXJmYWNlIGdvdCBsaWtlbHkgcmVtb3ZlZCBieSBjbGllbnQuCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogCi0gICAgICAgIHJlcyA9IG91dHB1dEJ1ZmZlckxvY2tlZChtT3V0cHV0c1tpZF0sIGJ1ZmZlckl0ZW0pOworICAgICAgICByZXMgPSBvdXRwdXRCdWZmZXJMb2NrZWQobU91dHB1dHNbaWRdLCBidWZmZXJJdGVtLCBpZCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIFNQX0xPR0UoIiVzOiBvdXRwdXRCdWZmZXJMb2NrZWQgZmFpbGVkICVkIiwgX19GVU5DVElPTl9fLCByZXMpOwogICAgICAgICAgICAgbU9uRnJhbWVBdmFpbGFibGVSZXMuc3RvcmUocmVzKTsKQEAgLTM4OSwxMiArNTE4LDE0IEBACiAgICAgbU9uRnJhbWVBdmFpbGFibGVSZXMuc3RvcmUocmVzKTsKIH0KIAotdm9pZCBDYW1lcmEzU3RyZWFtU3BsaXR0ZXI6OmRlY3JlbWVudEJ1ZlJlZkNvdW50TG9ja2VkKHVpbnQ2NF90IGlkLAotICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgZnJvbSkgewordm9pZCBDYW1lcmEzU3RyZWFtU3BsaXR0ZXI6OmRlY3JlbWVudEJ1ZlJlZkNvdW50TG9ja2VkKHVpbnQ2NF90IGlkLCBzaXplX3Qgc3VyZmFjZUlkKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKLSAgICBzaXplX3QgcmVmZXJlbmNlQ291bnQgPSBtQnVmZmVyc1tpZF0tPmRlY3JlbWVudFJlZmVyZW5jZUNvdW50TG9ja2VkKCk7CiAKLSAgICByZW1vdmVTbG90Rm9yT3V0cHV0TG9ja2VkKGZyb20sIG1CdWZmZXJzW2lkXS0+Z2V0QnVmZmVyKCkpOworICAgIGlmIChtQnVmZmVyc1tpZF0gPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2l6ZV90IHJlZmVyZW5jZUNvdW50ID0gbUJ1ZmZlcnNbaWRdLT5kZWNyZW1lbnRSZWZlcmVuY2VDb3VudExvY2tlZChzdXJmYWNlSWQpOwogICAgIGlmIChyZWZlcmVuY2VDb3VudCA+IDApIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTQwNywxNCArNTM4LDI4IEBACiAgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlclRyYWNrZXI+IHRyYWNrZXJfcHRyID0gc3RkOjptb3ZlKG1CdWZmZXJzW2lkXSk7CiAgICAgbUJ1ZmZlcnMuZXJhc2UoaWQpOwogCi0gICAgLy8gQXR0YWNoIGFuZCByZWxlYXNlIHRoZSBidWZmZXIgYmFjayB0byB0aGUgaW5wdXQKLSAgICBpbnQgY29uc3VtZXJTbG90ID0gQnVmZmVySXRlbTo6SU5WQUxJRF9CVUZGRVJfU0xPVDsKLSAgICBzdGF0dXNfdCByZXMgPSBtQ29uc3VtZXItPmF0dGFjaEJ1ZmZlcigmY29uc3VtZXJTbG90LCB0cmFja2VyX3B0ci0+Z2V0QnVmZmVyKCkpOwotICAgIGlmIChyZXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgU1BfTE9HRSgiJXM6IGF0dGFjaGluZyBidWZmZXIgdG8gaW5wdXQgZmFpbGVkICglZCkiLCBfX0ZVTkNUSU9OX18sIHJlcyk7CisgICAgdWludDY0X3QgYnVmZmVySWQgPSB0cmFja2VyX3B0ci0+Z2V0QnVmZmVyKCktPmdldElkKCk7CisgICAgaW50IGNvbnN1bWVyU2xvdCA9IC0xOworICAgIHVpbnQ2NF90IGZyYW1lTnVtYmVyOworICAgIGF1dG8gaW5wdXRTbG90ID0gbUlucHV0U2xvdHMuYmVnaW4oKTsKKyAgICBmb3IgKDsgaW5wdXRTbG90ICE9IG1JbnB1dFNsb3RzLmVuZCgpOyBpbnB1dFNsb3QrKykgeworICAgICAgICBpZiAoaW5wdXRTbG90LT5zZWNvbmQubUdyYXBoaWNCdWZmZXItPmdldElkKCkgPT0gYnVmZmVySWQpIHsKKyAgICAgICAgICAgIGNvbnN1bWVyU2xvdCA9IGlucHV0U2xvdC0+c2Vjb25kLm1TbG90OworICAgICAgICAgICAgZnJhbWVOdW1iZXIgPSBpbnB1dFNsb3QtPnNlY29uZC5tRnJhbWVOdW1iZXI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoY29uc3VtZXJTbG90ID09IC0xKSB7CisgICAgICAgIFNQX0xPR0UoIiVzOiBCdWZmZXIgbWlzc2luZyBpbnNpZGUgaW5wdXQgc2xvdHMhIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIGF1dG8gZGV0YWNoQnVmZmVyID0gbURldGFjaGVkQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICBib29sIGRldGFjaCA9IChkZXRhY2hCdWZmZXIgIT0gbURldGFjaGVkQnVmZmVycy5lbmQoKSk7CisgICAgaWYgKGRldGFjaCkgeworICAgICAgICBtRGV0YWNoZWRCdWZmZXJzLmVyYXNlKGRldGFjaEJ1ZmZlcik7CisgICAgICAgIG1JbnB1dFNsb3RzLmVyYXNlKGlucHV0U2xvdCk7CisgICAgfQogICAgIC8vIFRlbXBvcmFyaWx5IHVubG9jayBtdXRleCB0byBhdm9pZCBjaXJjdWxhciBsb2NrOgogICAgIC8vIDEuIFRoaXMgZnVuY3Rpb24gaG9sZHMgc3BsaXR0ZXIgbG9jaywgY2FsbHMgcmVsZWFzZUJ1ZmZlciB3aGljaCB0cmlnZ2VycwogICAgIC8vIG9uQnVmZmVyUmVsZWFzZWQgaW4gQ2FtZXJhM091dHB1dFN0cmVhbS4gb25CdWZmZXJSZWxlYXNlZCB3YWl0cyBvbiB0aGUKQEAgLTQyNCw1NyArNTY5LDEyNiBAQAogICAgIC8vIHNwbGl0dGVyIGxvY2suCiAgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gY29uc3VtZXIobUNvbnN1bWVyKTsKICAgICBtTXV0ZXgudW5sb2NrKCk7CisgICAgaW50IHJlcyA9IE5PX0VSUk9SOwogICAgIGlmIChjb25zdW1lciAhPSBudWxscHRyKSB7Ci0gICAgICAgIHJlcyA9IGNvbnN1bWVyLT5yZWxlYXNlQnVmZmVyKGNvbnN1bWVyU2xvdCwgLyogZnJhbWVOdW1iZXIgKi8gMCwKLSAgICAgICAgICAgICAgICBFR0xfTk9fRElTUExBWSwgRUdMX05PX1NZTkNfS0hSLCB0cmFja2VyX3B0ci0+Z2V0TWVyZ2VkRmVuY2UoKSk7CisgICAgICAgIGlmIChkZXRhY2gpIHsKKyAgICAgICAgICAgIHJlcyA9IGNvbnN1bWVyLT5kZXRhY2hCdWZmZXIoY29uc3VtZXJTbG90KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlcyA9IGNvbnN1bWVyLT5yZWxlYXNlQnVmZmVyKGNvbnN1bWVyU2xvdCwgZnJhbWVOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgIEVHTF9OT19ESVNQTEFZLCBFR0xfTk9fU1lOQ19LSFIsIHRyYWNrZXJfcHRyLT5nZXRNZXJnZWRGZW5jZSgpKTsKKyAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIFNQX0xPR0UoIiVzOiBjb25zdW1lciBoYXMgYmVjb21lIG51bGwhIiwgX19GVU5DVElPTl9fKTsKICAgICB9CiAgICAgbU11dGV4LmxvY2soKTsKLSAgICAvLyBJZiB0aGUgcHJvZHVjZXIgb2YgdGhpcyBxdWV1ZSBpcyBkaXNjb25uZWN0ZWQsIC0yMiBlcnJvciB3aWxsIG9jY3VyCisKICAgICBpZiAocmVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIFNQX0xPR0UoIiVzOiByZWxlYXNlQnVmZmVyIHJldHVybnMgJWQiLCBfX0ZVTkNUSU9OX18sIHJlcyk7CisgICAgICAgIGlmIChkZXRhY2gpIHsKKyAgICAgICAgICAgIFNQX0xPR0UoIiVzOiBkZXRhY2hCdWZmZXIgcmV0dXJucyAlZCIsIF9fRlVOQ1RJT05fXywgcmVzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFNQX0xPR0UoIiVzOiByZWxlYXNlQnVmZmVyIHJldHVybnMgJWQiLCBfX0ZVTkNUSU9OX18sIHJlcyk7CisgICAgICAgIH0KICAgICB9CiB9CiAKIHZvaWQgQ2FtZXJhM1N0cmVhbVNwbGl0dGVyOjpvbkJ1ZmZlclJlbGVhc2VkQnlPdXRwdXQoCiAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBmcm9tKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotCi0gICAgb25CdWZmZXJSZWxlYXNlZEJ5T3V0cHV0TG9ja2VkKGZyb20pOwotfQotCi12b2lkIENhbWVyYTNTdHJlYW1TcGxpdHRlcjo6b25CdWZmZXJSZWxlYXNlZEJ5T3V0cHV0TG9ja2VkKAotICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgZnJvbSkgewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmZmVyOwogICAgIHNwPEZlbmNlPiBmZW5jZTsKLSAgICBzdGF0dXNfdCByZXMgPSBmcm9tLT5kZXRhY2hOZXh0QnVmZmVyKCZidWZmZXIsICZmZW5jZSk7Ci0gICAgaWYgKHJlcyA9PSBOT19JTklUKSB7Ci0gICAgICAgIC8vIElmIHdlIGp1c3QgZGlzY292ZXJlZCB0aGF0IHRoaXMgb3V0cHV0IGhhcyBiZWVuIGFiYW5kb25lZCwgbm90ZSB0aGF0LAotICAgICAgICAvLyBidXQgd2UgY2FuJ3QgZG8gYW55dGhpbmcgZWxzZSwgc2luY2UgYnVmZmVyIGlzIGludmFsaWQKLSAgICAgICAgb25BYmFuZG9uZWRMb2NrZWQoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gZWxzZSBpZiAocmVzID09IE5PX01FTU9SWSkgewotICAgICAgICBTUF9MT0dWKCIlczogTm8gZnJlZSBidWZmZXJzIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gZWxzZSBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIFNQX0xPR0UoIiVzOiBkZXRhY2hpbmcgYnVmZmVyIGZyb20gb3V0cHV0IGZhaWxlZCAoJWQpIiwgX19GVU5DVElPTl9fLCByZXMpOworCisgICAgaW50IHNsb3QgPSBCdWZmZXJJdGVtOjpJTlZBTElEX0JVRkZFUl9TTE9UOworICAgIGF1dG8gcmVzID0gZnJvbS0+ZGVxdWV1ZUJ1ZmZlcigmc2xvdCwgJmZlbmNlLCBtV2lkdGgsIG1IZWlnaHQsIG1Gb3JtYXQsIG1Qcm9kdWNlclVzYWdlLAorICAgICAgICAgICAgbnVsbHB0ciwgbnVsbHB0cik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKKyAgICBoYW5kbGVPdXRwdXREZXF1ZXVlU3RhdHVzTG9ja2VkKHJlcywgc2xvdCk7CisgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICByZXR1cm47CiAgICAgfQogCisgICAgc2l6ZV90IHN1cmZhY2VJZCA9IDA7CisgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgIGZvciAoY29uc3QgYXV0byYgaXQgOiBtT3V0cHV0cykgeworICAgICAgICBpZiAoaXQuc2Vjb25kID09IGZyb20pIHsKKyAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgIHN1cmZhY2VJZCA9IGl0LmZpcnN0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFmb3VuZCkgeworICAgICAgICBTUF9MT0dWKCIlczogb3V0cHV0IHN1cmZhY2Ugbm90IHJlZ2lzdGVyZWQgYW55bW9yZSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcmV0dXJuT3V0cHV0QnVmZmVyTG9ja2VkKGZlbmNlLCBmcm9tLCBzdXJmYWNlSWQsIHNsb3QpOworfQorCit2b2lkIENhbWVyYTNTdHJlYW1TcGxpdHRlcjo6b25CdWZmZXJSZXBsYWNlZExvY2tlZCgKKyAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGZyb20sIHNpemVfdCBzdXJmYWNlSWQpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIHNwPEZlbmNlPiBmZW5jZTsKKworICAgIGludCBzbG90ID0gQnVmZmVySXRlbTo6SU5WQUxJRF9CVUZGRVJfU0xPVDsKKyAgICBhdXRvIHJlcyA9IGZyb20tPmRlcXVldWVCdWZmZXIoJnNsb3QsICZmZW5jZSwgbVdpZHRoLCBtSGVpZ2h0LCBtRm9ybWF0LCBtUHJvZHVjZXJVc2FnZSwKKyAgICAgICAgICAgIG51bGxwdHIsIG51bGxwdHIpOworICAgIGhhbmRsZU91dHB1dERlcXVldWVTdGF0dXNMb2NrZWQocmVzLCBzbG90KTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICByZXR1cm5PdXRwdXRCdWZmZXJMb2NrZWQoZmVuY2UsIGZyb20sIHN1cmZhY2VJZCwgc2xvdCk7Cit9CisKK3ZvaWQgQ2FtZXJhM1N0cmVhbVNwbGl0dGVyOjpyZXR1cm5PdXRwdXRCdWZmZXJMb2NrZWQoY29uc3Qgc3A8RmVuY2U+JiBmZW5jZSwKKyAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGZyb20sIHNpemVfdCBzdXJmYWNlSWQsIGludCBzbG90KSB7CisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmZmVyOworCisgICAgaWYgKG1PdXRwdXRTbG90c1tmcm9tXSA9PSBudWxscHRyKSB7CisgICAgICAgIC8vT3V0cHV0IHN1cmZhY2UgZ290IGxpa2VseSByZW1vdmVkIGJ5IGNsaWVudC4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGF1dG8gb3V0cHV0U2xvdHMgPSAqbU91dHB1dFNsb3RzW2Zyb21dOworICAgIGJ1ZmZlciA9IG91dHB1dFNsb3RzW3Nsb3RdOwogICAgIEJ1ZmZlclRyYWNrZXImIHRyYWNrZXIgPSAqKG1CdWZmZXJzW2J1ZmZlci0+Z2V0SWQoKV0pOwogICAgIC8vIE1lcmdlIHRoZSByZWxlYXNlIGZlbmNlIG9mIHRoZSBpbmNvbWluZyBidWZmZXIgc28gdGhhdCB0aGUgZmVuY2Ugd2Ugc2VuZAogICAgIC8vIGJhY2sgdG8gdGhlIGlucHV0IGluY2x1ZGVzIGFsbCBvZiB0aGUgb3V0cHV0cycgZmVuY2VzCiAgICAgaWYgKGZlbmNlICE9IG51bGxwdHIgJiYgZmVuY2UtPmlzVmFsaWQoKSkgewogICAgICAgICB0cmFja2VyLm1lcmdlRmVuY2UoZmVuY2UpOwogICAgIH0KLSAgICBTUF9MT0dWKCJkZXRhY2hlZCBidWZmZXIgJSIgUFJJZDY0ICIgJXAgZnJvbSBvdXRwdXQgJXAiLAotICAgICAgICAgICAgYnVmZmVyLT5nZXRJZCgpLCBidWZmZXIuZ2V0KCksIGZyb20uZ2V0KCkpOworCisgICAgYXV0byBkZXRhY2hCdWZmZXIgPSBtRGV0YWNoZWRCdWZmZXJzLmZpbmQoYnVmZmVyLT5nZXRJZCgpKTsKKyAgICBib29sIGRldGFjaCA9IChkZXRhY2hCdWZmZXIgIT0gbURldGFjaGVkQnVmZmVycy5lbmQoKSk7CisgICAgaWYgKGRldGFjaCkgeworICAgICAgICBhdXRvIHJlcyA9IGZyb20tPmRldGFjaEJ1ZmZlcihzbG90KTsKKyAgICAgICAgaWYgKHJlcyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgb3V0cHV0U2xvdHNbc2xvdF0gPSBudWxscHRyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU1BfTE9HRSgiJXM6IGRldGFjaCBidWZmZXIgZnJvbSBvdXRwdXQgZmFpbGVkICglZCkiLCBfX0ZVTkNUSU9OX18sIHJlcyk7CisgICAgICAgIH0KKyAgICB9CiAKICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBpcyB0aGUgbGFzdCBvdXRzdGFuZGluZyByZWZlcmVuY2UgdG8gdGhpcyBidWZmZXIKLSAgICBkZWNyZW1lbnRCdWZSZWZDb3VudExvY2tlZChidWZmZXItPmdldElkKCksIGZyb20pOworICAgIGRlY3JlbWVudEJ1ZlJlZkNvdW50TG9ja2VkKGJ1ZmZlci0+Z2V0SWQoKSwgc3VyZmFjZUlkKTsKK30KKwordm9pZCBDYW1lcmEzU3RyZWFtU3BsaXR0ZXI6OmhhbmRsZU91dHB1dERlcXVldWVTdGF0dXNMb2NrZWQoc3RhdHVzX3QgcmVzLCBpbnQgc2xvdCkgeworICAgIGlmIChyZXMgPT0gTk9fSU5JVCkgeworICAgICAgICAvLyBJZiB3ZSBqdXN0IGRpc2NvdmVyZWQgdGhhdCB0aGlzIG91dHB1dCBoYXMgYmVlbiBhYmFuZG9uZWQsIG5vdGUgdGhhdCwKKyAgICAgICAgLy8gYnV0IHdlIGNhbid0IGRvIGFueXRoaW5nIGVsc2UsIHNpbmNlIGJ1ZmZlciBpcyBpbnZhbGlkCisgICAgICAgIG9uQWJhbmRvbmVkTG9ja2VkKCk7CisgICAgfSBlbHNlIGlmIChyZXMgPT0gSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6QlVGRkVSX05FRURTX1JFQUxMT0NBVElPTikgeworICAgICAgICBTUF9MT0dFKCIlczogUHJvZHVjZXIgbmVlZHMgdG8gcmUtYWxsb2NhdGUgYnVmZmVyISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIFNQX0xPR0UoIiVzOiBUaGlzIHNob3VsZCBub3QgaGFwcGVuIHdpdGggYnVmZmVyIGFsbG9jYXRpb24gZGlzYWJsZWQhIiwgX19GVU5DVElPTl9fKTsKKyAgICB9IGVsc2UgaWYgKHJlcyA9PSBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpSRUxFQVNFX0FMTF9CVUZGRVJTKSB7CisgICAgICAgIFNQX0xPR0UoIiVzOiBBbGwgc2xvdC0+YnVmZmVyIG1hcHBpbmcgc2hvdWxkIGJlIHJlbGVhc2VkISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIFNQX0xPR0UoIiVzOiBUaGlzIHNob3VsZCBub3QgaGFwcGVuIHdpdGggYnVmZmVyIGFsbG9jYXRpb24gZGlzYWJsZWQhIiwgX19GVU5DVElPTl9fKTsKKyAgICB9IGVsc2UgaWYgKHJlcyA9PSBOT19NRU1PUlkpIHsKKyAgICAgICAgU1BfTE9HRSgiJXM6IE5vIGZyZWUgYnVmZmVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgfSBlbHNlIGlmIChyZXMgPT0gV09VTERfQkxPQ0spIHsKKyAgICAgICAgU1BfTE9HRSgiJXM6IERlcXVldWUgY2FsbCB3aWxsIGJsb2NrIiwgX19GVU5DVElPTl9fKTsKKyAgICB9IGVsc2UgaWYgKHJlcyAhPSBPSyB8fCAoc2xvdCA9PSBCdWZmZXJJdGVtOjpJTlZBTElEX0JVRkZFUl9TTE9UKSkgeworICAgICAgICBTUF9MT0dFKCIlczogZGVxdWV1ZSBidWZmZXIgZnJvbSBvdXRwdXQgZmFpbGVkICglZCkiLCBfX0ZVTkNUSU9OX18sIHJlcyk7CisgICAgfQogfQogCiB2b2lkIENhbWVyYTNTdHJlYW1TcGxpdHRlcjo6b25BYmFuZG9uZWRMb2NrZWQoKSB7CkBAIC01MDEsMjcgKzcxNSwxMSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgU1BfTE9HRSgiJXM6IENhbm5vdCBmaW5kIHNsb3QgZm9yIGdiICVwIG9uIG91dHB1dCAlcCIsIF9fRlVOQ1RJT05fXywgZ2IuZ2V0KCksCisgICAgU1BfTE9HVigiJXM6IENhbm5vdCBmaW5kIHNsb3QgZm9yIGdiICVwIG9uIG91dHB1dCAlcCIsIF9fRlVOQ1RJT05fXywgZ2IuZ2V0KCksCiAgICAgICAgICAgICBnYnAuZ2V0KCkpOwogICAgIHJldHVybiBCdWZmZXJJdGVtOjpJTlZBTElEX0JVRkZFUl9TTE9UOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzU3RyZWFtU3BsaXR0ZXI6OnJlbW92ZVNsb3RGb3JPdXRwdXRMb2NrZWQoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGdicCwKLSAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4mIGdiKSB7Ci0gICAgYXV0byYgb3V0cHV0U2xvdHMgPSAqbU91dHB1dFNsb3RzW2dicF07Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dHB1dFNsb3RzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChvdXRwdXRTbG90c1tpXSA9PSBnYikgewotICAgICAgICAgICBvdXRwdXRTbG90c1tpXS5jbGVhcigpOwotICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBTUF9MT0dFKCIlczogQ2Fubm90IGZpbmQgc2xvdCBmb3IgZ2IgJXAgb24gb3V0cHV0ICVwIiwgX19GVU5DVElPTl9fLCBnYi5nZXQoKSwKLSAgICAgICAgICAgIGdicC5nZXQoKSk7Ci0gICAgcmV0dXJuIEJBRF9WQUxVRTsKLX0KLQogQ2FtZXJhM1N0cmVhbVNwbGl0dGVyOjpPdXRwdXRMaXN0ZW5lcjo6T3V0cHV0TGlzdGVuZXIoCiAgICAgICAgIHdwPENhbWVyYTNTdHJlYW1TcGxpdHRlcj4gc3BsaXR0ZXIsCiAgICAgICAgIHdwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG91dHB1dCkKQEAgLTU1Myw3ICs3NTEsMTQgQEAKICAgICBtTWVyZ2VkRmVuY2UgPSBGZW5jZTo6bWVyZ2UoU3RyaW5nOCgiQ2FtZXJhM1N0cmVhbVNwbGl0dGVyIiksIG1NZXJnZWRGZW5jZSwgd2l0aCk7CiB9CiAKLXNpemVfdCBDYW1lcmEzU3RyZWFtU3BsaXR0ZXI6OkJ1ZmZlclRyYWNrZXI6OmRlY3JlbWVudFJlZmVyZW5jZUNvdW50TG9ja2VkKCkgeworc2l6ZV90IENhbWVyYTNTdHJlYW1TcGxpdHRlcjo6QnVmZmVyVHJhY2tlcjo6ZGVjcmVtZW50UmVmZXJlbmNlQ291bnRMb2NrZWQoc2l6ZV90IHN1cmZhY2VJZCkgeworICAgIGNvbnN0IGF1dG8mIGl0ID0gc3RkOjpmaW5kKG1SZXF1ZXN0ZWRTdXJmYWNlcy5iZWdpbigpLCBtUmVxdWVzdGVkU3VyZmFjZXMuZW5kKCksIHN1cmZhY2VJZCk7CisgICAgaWYgKGl0ID09IG1SZXF1ZXN0ZWRTdXJmYWNlcy5lbmQoKSkgeworICAgICAgICByZXR1cm4gbVJlZmVyZW5jZUNvdW50OworICAgIH0gZWxzZSB7CisgICAgICAgIG1SZXF1ZXN0ZWRTdXJmYWNlcy5lcmFzZShpdCk7CisgICAgfQorCiAgICAgaWYgKG1SZWZlcmVuY2VDb3VudCA+IDApCiAgICAgICAgIC0tbVJlZmVyZW5jZUNvdW50OwogICAgIHJldHVybiBtUmVmZXJlbmNlQ291bnQ7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuaAppbmRleCAzYjg4MzllLi5mZWExYmRiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmgKQEAgLTE3LDYgKzE3LDggQEAKICNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX1NUUkVBTVNQTElUVEVSX0gKICNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX1NUUkVBTVNQTElUVEVSX0gKIAorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisKICNpbmNsdWRlIDxndWkvSUNvbnN1bWVyTGlzdGVuZXIuaD4KICNpbmNsdWRlIDxndWkvSVByb2R1Y2VyTGlzdGVuZXIuaD4KICNpbmNsdWRlIDxndWkvQnVmZmVySXRlbUNvbnN1bWVyLmg+CkBAIC01MSwyMiArNTMsMjUgQEAKIAogICAgIC8vIENvbm5lY3QgdG8gdGhlIHN0cmVhbSBzcGxpdHRlciBieSBjcmVhdGluZyBidWZmZXIgcXVldWUgYW5kIGNvbm5lY3RpbmcgaXQKICAgICAvLyB3aXRoIG91dHB1dCBzdXJmYWNlcy4KLSAgICBzdGF0dXNfdCBjb25uZWN0KGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+ID4mIHN1cmZhY2VzLAotICAgICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSwgc2l6ZV90IGhhbE1heEJ1ZmZlcnMsCi0gICAgICAgICAgICBzcDxTdXJmYWNlPiogY29uc3VtZXIpOworICAgIHN0YXR1c190IGNvbm5lY3QoY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPHNpemVfdCwgc3A8U3VyZmFjZT4+ICZzdXJmYWNlcywKKyAgICAgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UsIHVpbnQ2NF90IHByb2R1Y2VyVXNhZ2UsIHNpemVfdCBoYWxNYXhCdWZmZXJzLCB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCwgYW5kcm9pZDo6UGl4ZWxGb3JtYXQgZm9ybWF0LCBzcDxTdXJmYWNlPiogY29uc3VtZXIpOwogCiAgICAgLy8gYWRkT3V0cHV0IGFkZHMgYW4gb3V0cHV0IEJ1ZmZlclF1ZXVlIHRvIHRoZSBzcGxpdHRlci4gVGhlIHNwbGl0dGVyCiAgICAgLy8gY29ubmVjdHMgdG8gb3V0cHV0UXVldWUgYXMgYSBDUFUgcHJvZHVjZXIsIGFuZCBhbnkgYnVmZmVycyBxdWV1ZWQKLSAgICAvLyB0byB0aGUgaW5wdXQgd2lsbCBiZSBxdWV1ZWQgdG8gZWFjaCBvdXRwdXQuIEl0IGlzIGFzc3VtZWQgdGhhdCBhbGwgb2YgdGhlCi0gICAgLy8gb3V0cHV0cyBhcmUgYWRkZWQgYmVmb3JlIGFueSBidWZmZXJzIGFyZSBxdWV1ZWQgb24gdGhlIGlucHV0LiBJZiBhbnkKLSAgICAvLyBvdXRwdXQgaXMgYWJhbmRvbmVkIGJ5IGl0cyBjb25zdW1lciwgdGhlIHNwbGl0dGVyIHdpbGwgYWJhbmRvbiBpdHMgaW5wdXQKLSAgICAvLyBxdWV1ZSAoc2VlIG9uQWJhbmRvbmVkKS4KKyAgICAvLyB0byB0aGUgaW5wdXQgd2lsbCBiZSBxdWV1ZWQgdG8gZWFjaCBvdXRwdXQuIElmIGFueSAgb3V0cHV0IGlzIGFiYW5kb25lZAorICAgIC8vIGJ5IGl0cyBjb25zdW1lciwgdGhlIHNwbGl0dGVyIHdpbGwgYWJhbmRvbiBpdHMgaW5wdXQgcXVldWUgKHNlZSBvbkFiYW5kb25lZCkuCiAgICAgLy8KICAgICAvLyBBIHJldHVybiB2YWx1ZSBvdGhlciB0aGFuIE5PX0VSUk9SIG1lYW5zIHRoYXQgYW4gZXJyb3IgaGFzIG9jY3VycmVkIGFuZAogICAgIC8vIG91dHB1dFF1ZXVlIGhhcyBub3QgYmVlbiBhZGRlZCB0byB0aGUgc3BsaXR0ZXIuIEJBRF9WQUxVRSBpcyByZXR1cm5lZCBpZgogICAgIC8vIG91dHB1dFF1ZXVlIGlzIE5VTEwuIFNlZSBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpjb25uZWN0IGZvciBleHBsYW5hdGlvbnMKICAgICAvLyBvZiBvdGhlciBlcnJvciBjb2Rlcy4KLSAgICBzdGF0dXNfdCBhZGRPdXRwdXQoY29uc3Qgc3A8U3VyZmFjZT4mIG91dHB1dFF1ZXVlKTsKKyAgICBzdGF0dXNfdCBhZGRPdXRwdXQoc2l6ZV90IHN1cmZhY2VJZCwgY29uc3Qgc3A8U3VyZmFjZT4mIG91dHB1dFF1ZXVlKTsKKworICAgIC8vcmVtb3ZlT3V0cHV0IHdpbGwgcmVtb3ZlIGEgQnVmZmVyUXVldWUgdGhhdCB3YXMgcHJldmlvdXNseSBhZGRlZCB0bworICAgIC8vdGhlIHNwbGl0dGVyIG91dHB1dHMuIEFueSBwZW5kaW5nIGJ1ZmZlcnMgaW4gdGhlIEJ1ZmZlclF1ZXVlIHdpbGwgZ2V0CisgICAgLy9yZWNsYWltZWQuCisgICAgc3RhdHVzX3QgcmVtb3ZlT3V0cHV0KHNpemVfdCBzdXJmYWNlSWQpOwogCiAgICAgLy8gTm90aWZpY2F0aW9uIHRoYXQgdGhlIGdyYXBoaWMgYnVmZmVyIGhhcyBiZWVuIHJlbGVhc2VkIHRvIHRoZSBpbnB1dAogICAgIC8vIEJ1ZmZlclF1ZXVlLiBUaGUgYnVmZmVyIHNob3VsZCBiZSByZXVzZWQgYnkgdGhlIGNhbWVyYSBkZXZpY2UgaW5zdGVhZCBvZgpAQCAtMTE3LDEwICsxMjIsOCBAQAogICAgIC8vIG9uRnJhbWVBdmFpbGFibGUgY2FsbCB0byBwcm9jZWVkLgogICAgIHZvaWQgb25CdWZmZXJSZWxlYXNlZEJ5T3V0cHV0KGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBmcm9tKTsKIAotICAgIC8vIFRoaXMgaXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIG9uQnVmZmVyUmVsZWFzZWRCeU91dHB1dCB3aXRob3V0IHRoZSBtdXRleCBsb2NrZWQuCi0gICAgLy8gSXQgY291bGQgZWl0aGVyIGJlIGNhbGxlZCBmcm9tIG9uQnVmZmVyUmVsZWFzZWRCeU91dHB1dCBvciBmcm9tCi0gICAgLy8gb25GcmFtZUF2YWlsYWJsZSB3aGVuIGEgYnVmZmVyIGluIHRoZSBhc3luYyBidWZmZXIgcXVldWUgaXMgb3ZlcndyaXR0ZW4uCi0gICAgdm9pZCBvbkJ1ZmZlclJlbGVhc2VkQnlPdXRwdXRMb2NrZWQoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGZyb20pOworICAgIC8vIENhbGxlZCBieSBvdXRwdXRCdWZmZXJMb2NrZWQgd2hlbiBhIGJ1ZmZlciBpbiB0aGUgYXN5bmMgYnVmZmVyIHF1ZXVlIGdvdCByZXBsYWNlZC4KKyAgICB2b2lkIG9uQnVmZmVyUmVwbGFjZWRMb2NrZWQoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGZyb20sIHNpemVfdCBzdXJmYWNlSWQpOwogCiAgICAgLy8gV2hlbiB0aGlzIGlzIGNhbGxlZCwgdGhlIHNwbGl0dGVyIGRpc2Nvbm5lY3RzIGZyb20gKGkuZS4sIGFiYW5kb25zKSBpdHMKICAgICAvLyBpbnB1dCBxdWV1ZSBhbmQgc2lnbmFscyBhbnkgd2FpdGluZyBvbkZyYW1lQXZhaWxhYmxlIGNhbGxzIHRvIHdha2UgdXAuCkBAIC0xMzEsNyArMTM0LDE0IEBACiAKICAgICAvLyBEZWNyZW1lbnQgdGhlIGJ1ZmZlcidzIHJlZmVyZW5jZSBjb3VudC4gT25jZSB0aGUgcmVmZXJlbmNlIGNvdW50IGJlY29tZXMKICAgICAvLyAwLCByZXR1cm4gdGhlIGJ1ZmZlciBiYWNrIHRvIHRoZSBpbnB1dCBCdWZmZXJRdWV1ZS4KLSAgICB2b2lkIGRlY3JlbWVudEJ1ZlJlZkNvdW50TG9ja2VkKHVpbnQ2NF90IGlkLCBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgZnJvbSk7CisgICAgdm9pZCBkZWNyZW1lbnRCdWZSZWZDb3VudExvY2tlZCh1aW50NjRfdCBpZCwgc2l6ZV90IHN1cmZhY2VJZCk7CisKKyAgICAvLyBDaGVjayBmb3IgYW5kIGhhbmRsZSBhbnkgb3V0cHV0IHN1cmZhY2UgZGVxdWV1ZSBlcnJvcnMuCisgICAgdm9pZCBoYW5kbGVPdXRwdXREZXF1ZXVlU3RhdHVzTG9ja2VkKHN0YXR1c190IHJlcywgaW50IHNsb3QpOworCisgICAgLy8gSGFuZGxlcyByZWxlYXNlZCBvdXRwdXQgc3VyZmFjZSBidWZmZXJzLgorICAgIHZvaWQgcmV0dXJuT3V0cHV0QnVmZmVyTG9ja2VkKGNvbnN0IHNwPEZlbmNlPiYgZmVuY2UsIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBmcm9tLAorICAgICAgICAgICAgc2l6ZV90IHN1cmZhY2VJZCwgaW50IHNsb3QpOwogCiAgICAgLy8gVGhpcyBpcyBhIHRoaW4gd3JhcHBlciBjbGFzcyB0aGF0IGxldHMgdXMgZGV0ZXJtaW5lIHdoaWNoIEJ1ZmZlclF1ZXVlCiAgICAgLy8gdGhlIElQcm9kdWNlckxpc3RlbmVyOjpvbkJ1ZmZlclJlbGVhc2VkIGNhbGxiYWNrIGlzIGFzc29jaWF0ZWQgd2l0aC4gV2UKQEAgLTE2OCw3ICsxNzgsNyBAQAogCiAgICAgICAgIC8vIFJldHVybnMgdGhlIG5ldyB2YWx1ZQogICAgICAgICAvLyBPbmx5IGNhbGxlZCB3aGlsZSBtTXV0ZXggaXMgaGVsZAotICAgICAgICBzaXplX3QgZGVjcmVtZW50UmVmZXJlbmNlQ291bnRMb2NrZWQoKTsKKyAgICAgICAgc2l6ZV90IGRlY3JlbWVudFJlZmVyZW5jZUNvdW50TG9ja2VkKHNpemVfdCBzdXJmYWNlSWQpOwogCiAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4gcmVxdWVzdGVkU3VyZmFjZXMoKSBjb25zdCB7IHJldHVybiBtUmVxdWVzdGVkU3VyZmFjZXM7IH0KIApAQCAtMTkxLDEzICsyMDEsMTUgQEAKICAgICAvLyBNdXN0IGJlIGFjY2Vzc2VkIHRocm91Z2ggUmVmQmFzZQogICAgIHZpcnR1YWwgfkNhbWVyYTNTdHJlYW1TcGxpdHRlcigpOwogCi0gICAgc3RhdHVzX3QgYWRkT3V0cHV0TG9ja2VkKGNvbnN0IHNwPFN1cmZhY2U+JiBvdXRwdXRRdWV1ZSk7CisgICAgc3RhdHVzX3QgYWRkT3V0cHV0TG9ja2VkKHNpemVfdCBzdXJmYWNlSWQsIGNvbnN0IHNwPFN1cmZhY2U+JiBvdXRwdXRRdWV1ZSk7CisKKyAgICBzdGF0dXNfdCByZW1vdmVPdXRwdXRMb2NrZWQoc2l6ZV90IHN1cmZhY2VJZCk7CiAKICAgICAvLyBTZW5kIGEgYnVmZmVyIHRvIHBhcnRpY3VsYXIgb3V0cHV0LCBhbmQgaW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQKICAgICAvLyBvZiB0aGUgYnVmZmVyLiBJZiB0aGlzIG91dHB1dCBpcyBhYmFuZG9uZWQsIHRoZSBidWZmZXIncyByZWZlcmVuY2UgY291bnQKICAgICAvLyB3b24ndCBiZSBpbmNyZW1lbnRlZC4KICAgICBzdGF0dXNfdCBvdXRwdXRCdWZmZXJMb2NrZWQoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIG91dHB1dCwKLSAgICAgICAgICAgIGNvbnN0IEJ1ZmZlckl0ZW0mIGJ1ZmZlckl0ZW0pOworICAgICAgICAgICAgY29uc3QgQnVmZmVySXRlbSYgYnVmZmVySXRlbSwgc2l6ZV90IHN1cmZhY2VJZCk7CiAKICAgICAvLyBHZXQgdW5pcXVlIG5hbWUgZm9yIHRoZSBidWZmZXIgcXVldWUgY29uc3VtZXIKICAgICBTdHJpbmc4IGdldFVuaXF1ZUNvbnN1bWVyTmFtZSgpOwpAQCAtMjA1LDE0ICsyMTcsMTQgQEAKICAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBCdWZmZXJRdWV1ZSBzbG90IHdoZXJlIGEgcGFydGljdWxhciBidWZmZXIgaXMgYXR0YWNoZWQgdG8uCiAgICAgaW50IGdldFNsb3RGb3JPdXRwdXRMb2NrZWQoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGdicCwKICAgICAgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiBnYik7Ci0gICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIHJlbW92ZSB0aGUgYnVmZmVyIGZyb20gdGhlIEJ1ZmZlclF1ZXVlIHNsb3QKLSAgICBzdGF0dXNfdCByZW1vdmVTbG90Rm9yT3V0cHV0TG9ja2VkKGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBnYnAsCi0gICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgZ2IpOwotCiAKICAgICAvLyBTdW0gb2YgbWF4IGNvbnN1bWVyIGJ1ZmZlcnMgZm9yIGFsbCBvdXRwdXRzCiAgICAgc2l6ZV90IG1NYXhDb25zdW1lckJ1ZmZlcnMgPSAwOwogICAgIHNpemVfdCBtTWF4SGFsQnVmZmVycyA9IDA7CisgICAgdWludDMyX3QgbVdpZHRoID0gMDsKKyAgICB1aW50MzJfdCBtSGVpZ2h0ID0gMDsKKyAgICBhbmRyb2lkOjpQaXhlbEZvcm1hdCBtRm9ybWF0ID0gYW5kcm9pZDo6UElYRUxfRk9STUFUX05PTkU7CisgICAgdWludDY0X3QgbVByb2R1Y2VyVXNhZ2UgPSAwOwogCiAgICAgc3RhdGljIGNvbnN0IG5zZWNzX3Qga0RlcXVldWVCdWZmZXJUaW1lb3V0ICAgPSBzMm5zKDEpOyAvLyAxIHNlYwogCkBAIC0yMjMsNyArMjM1LDE1IEBACiAgICAgc3A8QnVmZmVySXRlbUNvbnN1bWVyPiBtQnVmZmVySXRlbUNvbnN1bWVyOwogICAgIHNwPFN1cmZhY2U+IG1TdXJmYWNlOwogCi0gICAgc3RkOjp2ZWN0b3I8c3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gPiBtT3V0cHV0czsKKyAgICAvL01hcCBncmFwaGljIGJ1ZmZlciBpZHMgLT4gYnVmZmVyIGl0ZW1zCisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQ2NF90LCBCdWZmZXJJdGVtPiBtSW5wdXRTbG90czsKKworICAgIC8vTWFwIHN1cmZhY2UgaWRzIC0+IGdicCBvdXRwdXRzCisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPGludCwgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gPiBtT3V0cHV0czsKKworICAgIC8vTWFwIHN1cmZhY2UgaWRzIC0+IGNvbnN1bWVyIGJ1ZmZlciBjb3VudAorICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQsIHNpemVfdCA+IG1Db25zdW1lckJ1ZmZlckNvdW50OworCiAgICAgLy8gTWFwIG9mIEdyYXBoaWNCdWZmZXIgSURzIChHcmFwaGljQnVmZmVyOjpnZXRJZCgpKSB0byBidWZmZXIgdHJhY2tpbmcKICAgICAvLyBvYmplY3RzICh3aGljaCBhcmUgbW9zdGx5IGZvciBjb3VudGluZyBob3cgbWFueSBvdXRwdXRzIGhhdmUgcmVsZWFzZWQgdGhlCiAgICAgLy8gYnVmZmVyLCBidXQgYWxzbyBjb250YWluIG1lcmdlZCByZWxlYXNlIGZlbmNlcykuCkBAIC0yNDIsNiArMjYyLDEwIEBACiAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+LCBzdGQ6OnVuaXF1ZV9wdHI8T3V0cHV0U2xvdHM+LAogICAgICAgICAgICAgR0JQSGFzaD4gbU91dHB1dFNsb3RzOwogCisgICAgLy9BIHNldCBvZiBidWZmZXJzIHRoYXQgY291bGQgcG90ZW50aWFsbHkgc3RheSBpbiBzb21lIG9mIHRoZSBvdXRwdXRzIGFmdGVyIHJlbW92YWwKKyAgICAvL2FuZCB0aGVyZWZvcmUgc2hvdWxkIGJlIGRldGFjaGVkIGZyb20gdGhlIGlucHV0IHF1ZXVlLgorICAgIHN0ZDo6dW5vcmRlcmVkX3NldDx1aW50NjRfdD4gbURldGFjaGVkQnVmZmVyczsKKwogICAgIC8vIExhdGVzdCBvbkZyYW1lQXZhaWxhYmxlIHJldHVybiB2YWx1ZQogICAgIHN0ZDo6YXRvbWljPHN0YXR1c190PiBtT25GcmFtZUF2YWlsYWJsZVJlc3swfTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9EaXN0b3J0aW9uTWFwcGVyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvRGlzdG9ydGlvbk1hcHBlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIyOTA3OQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvRGlzdG9ydGlvbk1hcHBlci5jcHAKQEAgLTAsMCArMSw0NDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkNhbWVyYTMtRGlzdE1hcHBlciIKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8Y21hdGg+CisKKyNpbmNsdWRlICJkZXZpY2UzL0Rpc3RvcnRpb25NYXBwZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgY2FtZXJhMyB7CisKKy8qKgorICogTWV0YWRhdGEga2V5cyB0byBjb3JyZWN0IHdoZW4gYWRqdXN0aW5nIGNvb3JkaW5hdGVzIGZvciBkaXN0b3J0aW9uIGNvcnJlY3Rpb24KKyAqLworCisvLyBCb3RoIGNhcHR1cmUgcmVxdWVzdCBhbmQgcmVzdWx0Citjb25zdGV4cHIgc3RkOjphcnJheTx1aW50MzJfdCwgMz4gRGlzdG9ydGlvbk1hcHBlcjo6a01ldGVyaW5nUmVnaW9uc1RvQ29ycmVjdCA9IHsKKyAgICBBTkRST0lEX0NPTlRST0xfQUZfUkVHSU9OUywKKyAgICBBTkRST0lEX0NPTlRST0xfQUVfUkVHSU9OUywKKyAgICBBTkRST0lEX0NPTlRST0xfQVdCX1JFR0lPTlMKK307CisKKy8vIE9ubHkgY2FwdHVyZSByZXF1ZXN0Citjb25zdGV4cHIgc3RkOjphcnJheTx1aW50MzJfdCwgMT4gRGlzdG9ydGlvbk1hcHBlcjo6a1JlcXVlc3RSZWN0c1RvQ29ycmVjdCA9IHsKKyAgICBBTkRST0lEX1NDQUxFUl9DUk9QX1JFR0lPTiwKK307CisKKy8vIE9ubHkgZm9yIGNhcHR1cmUgcmVzdWx0Citjb25zdGV4cHIgc3RkOjphcnJheTx1aW50MzJfdCwgMj4gRGlzdG9ydGlvbk1hcHBlcjo6a1Jlc3VsdFJlY3RzVG9Db3JyZWN0ID0geworICAgIEFORFJPSURfU0NBTEVSX0NST1BfUkVHSU9OLAorICAgIEFORFJPSURfU1RBVElTVElDU19GQUNFX1JFQ1RBTkdMRVMKK307CisKKy8vIE9ubHkgZm9yIGNhcHR1cmUgcmVzdWx0Citjb25zdGV4cHIgc3RkOjphcnJheTx1aW50MzJfdCwgMT4gRGlzdG9ydGlvbk1hcHBlcjo6a1Jlc3VsdFBvaW50c1RvQ29ycmVjdCA9IHsKKyAgICBBTkRST0lEX1NUQVRJU1RJQ1NfRkFDRV9MQU5ETUFSS1MsCit9OworCisKK0Rpc3RvcnRpb25NYXBwZXI6OkRpc3RvcnRpb25NYXBwZXIoKSA6IG1WYWxpZE1hcHBpbmcoZmFsc2UpLCBtVmFsaWRHcmlkcyhmYWxzZSkgeworfQorCitib29sIERpc3RvcnRpb25NYXBwZXI6OmlzRGlzdG9ydGlvblN1cHBvcnRlZChjb25zdCBDYW1lcmFNZXRhZGF0YSAmcmVzdWx0KSB7CisgICAgYm9vbCBpc0Rpc3RvcnRpb25Db3JyZWN0aW9uU3VwcG9ydGVkID0gZmFsc2U7CisgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZGlzdG9ydGlvbkNvcnJlY3Rpb25Nb2RlcyA9CisgICAgICAgICAgICByZXN1bHQuZmluZChBTkRST0lEX0RJU1RPUlRJT05fQ09SUkVDVElPTl9BVkFJTEFCTEVfTU9ERVMpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGlzdG9ydGlvbkNvcnJlY3Rpb25Nb2Rlcy5jb3VudDsgaSsrKSB7CisgICAgICAgIGlmIChkaXN0b3J0aW9uQ29ycmVjdGlvbk1vZGVzLmRhdGEudThbaV0gIT0KKyAgICAgICAgICAgICAgICBBTkRST0lEX0RJU1RPUlRJT05fQ09SUkVDVElPTl9NT0RFX09GRikgeworICAgICAgICAgICAgaXNEaXN0b3J0aW9uQ29ycmVjdGlvblN1cHBvcnRlZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaXNEaXN0b3J0aW9uQ29ycmVjdGlvblN1cHBvcnRlZDsKK30KKworc3RhdHVzX3QgRGlzdG9ydGlvbk1hcHBlcjo6c2V0dXBTdGF0aWNJbmZvKGNvbnN0IENhbWVyYU1ldGFkYXRhICZkZXZpY2VJbmZvKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhcnJheTsKKworICAgIGFycmF5ID0gZGV2aWNlSW5mby5maW5kKEFORFJPSURfU0VOU09SX0lORk9fUFJFX0NPUlJFQ1RJT05fQUNUSVZFX0FSUkFZX1NJWkUpOworICAgIGlmIChhcnJheS5jb3VudCAhPSA0KSByZXR1cm4gQkFEX1ZBTFVFOworCisgICAgbUFycmF5V2lkdGggPSBhcnJheS5kYXRhLmkzMlsyXTsKKyAgICBtQXJyYXlIZWlnaHQgPSBhcnJheS5kYXRhLmkzMlszXTsKKworICAgIHJldHVybiB1cGRhdGVDYWxpYnJhdGlvbihkZXZpY2VJbmZvKTsKK30KKworYm9vbCBEaXN0b3J0aW9uTWFwcGVyOjpjYWxpYnJhdGlvblZhbGlkKCkgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisKKyAgICByZXR1cm4gbVZhbGlkTWFwcGluZzsKK30KKworc3RhdHVzX3QgRGlzdG9ydGlvbk1hcHBlcjo6Y29ycmVjdENhcHR1cmVSZXF1ZXN0KENhbWVyYU1ldGFkYXRhICpyZXF1ZXN0KSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICBzdGF0dXNfdCByZXM7CisKKyAgICBpZiAoIW1WYWxpZE1hcHBpbmcpIHJldHVybiBPSzsKKworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGU7CisgICAgZSA9IHJlcXVlc3QtPmZpbmQoQU5EUk9JRF9ESVNUT1JUSU9OX0NPUlJFQ1RJT05fTU9ERSk7CisgICAgaWYgKGUuY291bnQgIT0gMCAmJiBlLmRhdGEudThbMF0gIT0gQU5EUk9JRF9ESVNUT1JUSU9OX0NPUlJFQ1RJT05fTU9ERV9PRkYpIHsKKyAgICAgICAgZm9yIChhdXRvIHJlZ2lvbiA6IGtNZXRlcmluZ1JlZ2lvbnNUb0NvcnJlY3QpIHsKKyAgICAgICAgICAgIGUgPSByZXF1ZXN0LT5maW5kKHJlZ2lvbik7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGUuY291bnQ7IGogKz0gNSkgeworICAgICAgICAgICAgICAgIHJlcyA9IG1hcENvcnJlY3RlZFRvUmF3KGUuZGF0YS5pMzIgKyBqLCAyKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoYXV0byByZWN0IDoga1JlcXVlc3RSZWN0c1RvQ29ycmVjdCkgeworICAgICAgICAgICAgZSA9IHJlcXVlc3QtPmZpbmQocmVjdCk7CisgICAgICAgICAgICByZXMgPSBtYXBDb3JyZWN0ZWRSZWN0VG9SYXcoZS5kYXRhLmkzMiwgZS5jb3VudCAvIDQpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgRGlzdG9ydGlvbk1hcHBlcjo6Y29ycmVjdENhcHR1cmVSZXN1bHQoQ2FtZXJhTWV0YWRhdGEgKnJlc3VsdCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgc3RhdHVzX3QgcmVzOworCisgICAgaWYgKCFtVmFsaWRNYXBwaW5nKSByZXR1cm4gT0s7CisKKyAgICByZXMgPSB1cGRhdGVDYWxpYnJhdGlvbigqcmVzdWx0KTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJGYWlsdXJlIHRvIHVwZGF0ZSBsZW5zIGNhbGlicmF0aW9uIGluZm9ybWF0aW9uIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBlOworICAgIGUgPSByZXN1bHQtPmZpbmQoQU5EUk9JRF9ESVNUT1JUSU9OX0NPUlJFQ1RJT05fTU9ERSk7CisgICAgaWYgKGUuY291bnQgIT0gMCAmJiBlLmRhdGEudThbMF0gIT0gQU5EUk9JRF9ESVNUT1JUSU9OX0NPUlJFQ1RJT05fTU9ERV9PRkYpIHsKKyAgICAgICAgZm9yIChhdXRvIHJlZ2lvbiA6IGtNZXRlcmluZ1JlZ2lvbnNUb0NvcnJlY3QpIHsKKyAgICAgICAgICAgIGUgPSByZXN1bHQtPmZpbmQocmVnaW9uKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgZS5jb3VudDsgaiArPSA1KSB7CisgICAgICAgICAgICAgICAgcmVzID0gbWFwUmF3VG9Db3JyZWN0ZWQoZS5kYXRhLmkzMiArIGosIDIpOworICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChhdXRvIHJlY3QgOiBrUmVzdWx0UmVjdHNUb0NvcnJlY3QpIHsKKyAgICAgICAgICAgIGUgPSByZXN1bHQtPmZpbmQocmVjdCk7CisgICAgICAgICAgICByZXMgPSBtYXBSYXdSZWN0VG9Db3JyZWN0ZWQoZS5kYXRhLmkzMiwgZS5jb3VudCAvIDQpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGF1dG8gcHRzIDoga1Jlc3VsdFBvaW50c1RvQ29ycmVjdCkgeworICAgICAgICAgICAgZSA9IHJlc3VsdC0+ZmluZChwdHMpOworICAgICAgICAgICAgcmVzID0gbWFwUmF3VG9Db3JyZWN0ZWQoZS5kYXRhLmkzMiwgZS5jb3VudCAvIDIpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworLy8gVXRpbGl0eSBtZXRob2RzOyBub3QgZ3VhcmRlZCBieSBtdXRleAorCitzdGF0dXNfdCBEaXN0b3J0aW9uTWFwcGVyOjp1cGRhdGVDYWxpYnJhdGlvbihjb25zdCBDYW1lcmFNZXRhZGF0YSAmcmVzdWx0KSB7CisgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgY2FsaWIsIGRpc3RvcnRpb247CisKKyAgICBjYWxpYiA9IHJlc3VsdC5maW5kKEFORFJPSURfTEVOU19JTlRSSU5TSUNfQ0FMSUJSQVRJT04pOworICAgIGRpc3RvcnRpb24gPSByZXN1bHQuZmluZChBTkRST0lEX0xFTlNfRElTVE9SVElPTik7CisKKyAgICBpZiAoY2FsaWIuY291bnQgIT0gNSkgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICBpZiAoZGlzdG9ydGlvbi5jb3VudCAhPSA1KSByZXR1cm4gQkFEX1ZBTFVFOworCisgICAgLy8gU2tpcCByZWRvaW5nIHdvcmsgaWYgbm8gY2hhbmdlIHRvIGNhbGlicmF0aW9uIGZpZWxkcworICAgIGlmIChtVmFsaWRNYXBwaW5nICYmCisgICAgICAgICAgICBtRnggPT0gY2FsaWIuZGF0YS5mWzBdICYmCisgICAgICAgICAgICBtRnkgPT0gY2FsaWIuZGF0YS5mWzFdICYmCisgICAgICAgICAgICBtQ3ggPT0gY2FsaWIuZGF0YS5mWzJdICYmCisgICAgICAgICAgICBtQ3kgPT0gY2FsaWIuZGF0YS5mWzNdICYmCisgICAgICAgICAgICBtUyA9PSBjYWxpYi5kYXRhLmZbNF0pIHsKKyAgICAgICAgYm9vbCBub0NoYW5nZSA9IHRydWU7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGlzdG9ydGlvbi5jb3VudDsgaSsrKSB7CisgICAgICAgICAgICBpZiAobUtbaV0gIT0gZGlzdG9ydGlvbi5kYXRhLmZbaV0pIHsKKyAgICAgICAgICAgICAgICBub0NoYW5nZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChub0NoYW5nZSkgcmV0dXJuIE9LOworICAgIH0KKworICAgIG1GeCA9IGNhbGliLmRhdGEuZlswXTsKKyAgICBtRnkgPSBjYWxpYi5kYXRhLmZbMV07CisgICAgbUN4ID0gY2FsaWIuZGF0YS5mWzJdOworICAgIG1DeSA9IGNhbGliLmRhdGEuZlszXTsKKyAgICBtUyA9IGNhbGliLmRhdGEuZls0XTsKKworICAgIG1JbnZGeCA9IDEgLyBtRng7CisgICAgbUludkZ5ID0gMSAvIG1GeTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGlzdG9ydGlvbi5jb3VudDsgaSsrKSB7CisgICAgICAgIG1LW2ldID0gZGlzdG9ydGlvbi5kYXRhLmZbaV07CisgICAgfQorCisgICAgbVZhbGlkTWFwcGluZyA9IHRydWU7CisgICAgLy8gTmVlZCB0byByZWNhbGN1bGF0ZSBncmlkCisgICAgbVZhbGlkR3JpZHMgPSBmYWxzZTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgRGlzdG9ydGlvbk1hcHBlcjo6bWFwUmF3VG9Db3JyZWN0ZWQoaW50MzJfdCAqY29vcmRQYWlycywgaW50IGNvb3JkQ291bnQpIHsKKyAgICBpZiAoIW1WYWxpZE1hcHBpbmcpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKworICAgIGlmICghbVZhbGlkR3JpZHMpIHsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gYnVpbGRHcmlkcygpOworICAgICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOworICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29vcmRDb3VudCAqIDI7IGkgKz0gMikgeworICAgICAgICBjb25zdCBHcmlkUXVhZCAqcXVhZCA9IGZpbmRFbmNsb3NpbmdRdWFkKGNvb3JkUGFpcnMgKyBpLCBtRGlzdG9ydGVkR3JpZCk7CisgICAgICAgIGlmIChxdWFkID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJSYXcgdG8gY29ycmVjdGVkIG1hcHBpbmcgZmFpbHVyZTogTm8gcXVhZCBmb3VuZCIpOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJzcmMgeHk6ICVkLCAlZCwgZW5jbG9zaW5nIHF1YWQ6ICglZiwgJWYpLCAoJWYsICVmKSwgKCVmLCAlZiksICglZiwgJWYpIiwKKyAgICAgICAgICAgICAgICBjb29yZFBhaXJzW2ldLCBjb29yZFBhaXJzW2krMV0sCisgICAgICAgICAgICAgICAgcXVhZC0+Y29vcmRzWzBdLCBxdWFkLT5jb29yZHNbMV0sCisgICAgICAgICAgICAgICAgcXVhZC0+Y29vcmRzWzJdLCBxdWFkLT5jb29yZHNbM10sCisgICAgICAgICAgICAgICAgcXVhZC0+Y29vcmRzWzRdLCBxdWFkLT5jb29yZHNbNV0sCisgICAgICAgICAgICAgICAgcXVhZC0+Y29vcmRzWzZdLCBxdWFkLT5jb29yZHNbN10pOworCisgICAgICAgIGNvbnN0IEdyaWRRdWFkICpjb3JyUXVhZCA9IHF1YWQtPnNyYzsKKyAgICAgICAgaWYgKGNvcnJRdWFkID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJSYXcgdG8gY29ycmVjdGVkIG1hcHBpbmcgZmFpbHVyZTogTm8gc3JjIHF1YWQgZm91bmQiKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiICAgICAgICAgICAgICBjb3JyIHF1YWQ6ICglZiwgJWYpLCAoJWYsICVmKSwgKCVmLCAlZiksICglZiwgJWYpIiwKKyAgICAgICAgICAgICAgICBjb3JyUXVhZC0+Y29vcmRzWzBdLCBjb3JyUXVhZC0+Y29vcmRzWzFdLAorICAgICAgICAgICAgICAgIGNvcnJRdWFkLT5jb29yZHNbMl0sIGNvcnJRdWFkLT5jb29yZHNbM10sCisgICAgICAgICAgICAgICAgY29yclF1YWQtPmNvb3Jkc1s0XSwgY29yclF1YWQtPmNvb3Jkc1s1XSwKKyAgICAgICAgICAgICAgICBjb3JyUXVhZC0+Y29vcmRzWzZdLCBjb3JyUXVhZC0+Y29vcmRzWzddKTsKKworICAgICAgICBmbG9hdCB1ID0gY2FsY3VsYXRlVW9yVihjb29yZFBhaXJzICsgaSwgKnF1YWQsIC8qY2FsY3VsYXRlVSovIHRydWUpOworICAgICAgICBmbG9hdCB2ID0gY2FsY3VsYXRlVW9yVihjb29yZFBhaXJzICsgaSwgKnF1YWQsIC8qY2FsY3VsYXRlVSovIGZhbHNlKTsKKworICAgICAgICBBTE9HVigidXY6ICVmLCAlZiIsIHUsIHYpOworCisgICAgICAgIC8vIEludGVycG9sYXRlIGFsb25nIHRvcCBlZGdlIG9mIGNvcnJlY3RlZCBxdWFkICh3aGljaCBhcmUgYXhpcy1hbGlnbmVkKSBmb3IgeAorICAgICAgICBmbG9hdCBjb3JyWCA9IGNvcnJRdWFkLT5jb29yZHNbMF0gKyB1ICogKGNvcnJRdWFkLT5jb29yZHNbMl0gLSBjb3JyUXVhZC0+Y29vcmRzWzBdKTsKKyAgICAgICAgLy8gSW50ZXJwb2xhdGUgYWxvbmcgbGVmdCBlZGdlIG9mIGNvcnJlY3RlZCBxdWFkICh3aGljaCBhcmUgYXhpcy1hbGlnbmVkKSBmb3IgeQorICAgICAgICBmbG9hdCBjb3JyWSA9IGNvcnJRdWFkLT5jb29yZHNbMV0gKyB2ICogKGNvcnJRdWFkLT5jb29yZHNbN10gLSBjb3JyUXVhZC0+Y29vcmRzWzFdKTsKKworICAgICAgICBjb29yZFBhaXJzW2ldID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RkOjpyb3VuZChjb3JyWCkpOworICAgICAgICBjb29yZFBhaXJzW2kgKyAxXSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHN0ZDo6cm91bmQoY29yclkpKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IERpc3RvcnRpb25NYXBwZXI6Om1hcFJhd1JlY3RUb0NvcnJlY3RlZChpbnQzMl90ICpyZWN0cywgaW50IHJlY3RDb3VudCkgeworICAgIGlmICghbVZhbGlkTWFwcGluZykgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVjdENvdW50ICogNDsgaSArPSA0KSB7CisgICAgICAgIC8vIE1hcCBmcm9tIChsLCB0LCB3aWR0aCwgaGVpZ2h0KSB0byAobCwgdCwgciwgYikKKyAgICAgICAgaW50MzJfdCBjb29yZHNbNF0gPSB7CisgICAgICAgICAgICByZWN0c1tpXSwKKyAgICAgICAgICAgIHJlY3RzW2kgKyAxXSwKKyAgICAgICAgICAgIHJlY3RzW2ldICsgcmVjdHNbaSArIDJdLAorICAgICAgICAgICAgcmVjdHNbaSArIDFdICsgcmVjdHNbaSArIDNdCisgICAgICAgIH07CisKKyAgICAgICAgbWFwUmF3VG9Db3JyZWN0ZWQoY29vcmRzLCAyKTsKKworICAgICAgICAvLyBNYXAgYmFjayB0byAobCwgdCwgd2lkdGgsIGhlaWdodCkKKyAgICAgICAgcmVjdHNbaV0gPSBjb29yZHNbMF07CisgICAgICAgIHJlY3RzW2kgKyAxXSA9IGNvb3Jkc1sxXTsKKyAgICAgICAgcmVjdHNbaSArIDJdID0gY29vcmRzWzJdIC0gY29vcmRzWzBdOworICAgICAgICByZWN0c1tpICsgM10gPSBjb29yZHNbM10gLSBjb29yZHNbMV07CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RhdHVzX3QgRGlzdG9ydGlvbk1hcHBlcjo6bWFwQ29ycmVjdGVkVG9SYXcoVCAqY29vcmRQYWlycywgaW50IGNvb3JkQ291bnQpIGNvbnN0IHsKKyAgICBpZiAoIW1WYWxpZE1hcHBpbmcpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29vcmRDb3VudCAqIDI7IGkgKz0gMikgeworICAgICAgICAvLyBNb3ZlIHRvIG5vcm1hbGl6ZWQgc3BhY2UKKyAgICAgICAgZmxvYXQgeXdpID0gKGNvb3JkUGFpcnNbaSArIDFdIC0gbUN5KSAqIG1JbnZGeTsKKyAgICAgICAgZmxvYXQgeHdpID0gKGNvb3JkUGFpcnNbaV0gLSBtQ3ggLSBtUyAqIHl3aSkgKiBtSW52Rng7CisgICAgICAgIC8vIEFwcGx5IGRpc3RvcnRpb24gbW9kZWwgdG8gY2FsY3VsYXRlIHJhdyBpbWFnZSBjb29yZGluYXRlcworICAgICAgICBmbG9hdCByU3EgPSB4d2kgKiB4d2kgKyB5d2kgKiB5d2k7CisgICAgICAgIGZsb2F0IEZyID0gMS5mICsgKG1LWzBdICogclNxKSArIChtS1sxXSAqIHJTcSAqIHJTcSkgKyAobUtbMl0gKiByU3EgKiByU3EgKiByU3EpOworICAgICAgICBmbG9hdCB4YyA9IHh3aSAqIEZyICsgKG1LWzNdICogMiAqIHh3aSAqIHl3aSkgKyBtS1s0XSAqIChyU3EgKyAyICogeHdpICogeHdpKTsKKyAgICAgICAgZmxvYXQgeWMgPSB5d2kgKiBGciArIChtS1s0XSAqIDIgKiB4d2kgKiB5d2kpICsgbUtbM10gKiAoclNxICsgMiAqIHl3aSAqIHl3aSk7CisgICAgICAgIC8vIE1vdmUgYmFjayB0byBpbWFnZSBzcGFjZQorICAgICAgICBmbG9hdCB4ciA9IG1GeCAqIHhjICsgbVMgKiB5YyArIG1DeDsKKyAgICAgICAgZmxvYXQgeXIgPSBtRnkgKiB5YyArIG1DeTsKKworICAgICAgICBjb29yZFBhaXJzW2ldID0gc3RhdGljX2Nhc3Q8VD4oc3RkOjpyb3VuZCh4cikpOworICAgICAgICBjb29yZFBhaXJzW2kgKyAxXSA9IHN0YXRpY19jYXN0PFQ+KHN0ZDo6cm91bmQoeXIpKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3RlbXBsYXRlIHN0YXR1c190IERpc3RvcnRpb25NYXBwZXI6Om1hcENvcnJlY3RlZFRvUmF3KGludDMyX3QqLCBpbnQpIGNvbnN0OwordGVtcGxhdGUgc3RhdHVzX3QgRGlzdG9ydGlvbk1hcHBlcjo6bWFwQ29ycmVjdGVkVG9SYXcoZmxvYXQqLCBpbnQpIGNvbnN0OworCitzdGF0dXNfdCBEaXN0b3J0aW9uTWFwcGVyOjptYXBDb3JyZWN0ZWRSZWN0VG9SYXcoaW50MzJfdCAqcmVjdHMsIGludCByZWN0Q291bnQpIGNvbnN0IHsKKyAgICBpZiAoIW1WYWxpZE1hcHBpbmcpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVjdENvdW50ICogNDsgaSArPSA0KSB7CisgICAgICAgIC8vIE1hcCBmcm9tIChsLCB0LCB3aWR0aCwgaGVpZ2h0KSB0byAobCwgdCwgciwgYikKKyAgICAgICAgaW50MzJfdCBjb29yZHNbNF0gPSB7CisgICAgICAgICAgICByZWN0c1tpXSwKKyAgICAgICAgICAgIHJlY3RzW2kgKyAxXSwKKyAgICAgICAgICAgIHJlY3RzW2ldICsgcmVjdHNbaSArIDJdLAorICAgICAgICAgICAgcmVjdHNbaSArIDFdICsgcmVjdHNbaSArIDNdCisgICAgICAgIH07CisKKyAgICAgICAgbWFwQ29ycmVjdGVkVG9SYXcoY29vcmRzLCAyKTsKKworICAgICAgICAvLyBNYXAgYmFjayB0byAobCwgdCwgd2lkdGgsIGhlaWdodCkKKyAgICAgICAgcmVjdHNbaV0gPSBjb29yZHNbMF07CisgICAgICAgIHJlY3RzW2kgKyAxXSA9IGNvb3Jkc1sxXTsKKyAgICAgICAgcmVjdHNbaSArIDJdID0gY29vcmRzWzJdIC0gY29vcmRzWzBdOworICAgICAgICByZWN0c1tpICsgM10gPSBjb29yZHNbM10gLSBjb29yZHNbMV07CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBEaXN0b3J0aW9uTWFwcGVyOjpidWlsZEdyaWRzKCkgeworICAgIGlmIChtQ29ycmVjdGVkR3JpZC5zaXplKCkgIT0ga0dyaWRTaXplICoga0dyaWRTaXplKSB7CisgICAgICAgIG1Db3JyZWN0ZWRHcmlkLnJlc2l6ZShrR3JpZFNpemUgKiBrR3JpZFNpemUpOworICAgICAgICBtRGlzdG9ydGVkR3JpZC5yZXNpemUoa0dyaWRTaXplICoga0dyaWRTaXplKTsKKyAgICB9CisKKyAgICBmbG9hdCBncmlkTWFyZ2luID0gbUFycmF5V2lkdGggKiBrR3JpZE1hcmdpbjsKKyAgICBmbG9hdCBncmlkU3BhY2luZ1ggPSAobUFycmF5V2lkdGggKyAyICogZ3JpZE1hcmdpbikgLyBrR3JpZFNpemU7CisgICAgZmxvYXQgZ3JpZFNwYWNpbmdZID0gKG1BcnJheUhlaWdodCArIDIgKiBncmlkTWFyZ2luKSAvIGtHcmlkU2l6ZTsKKworICAgIHNpemVfdCBpbmRleCA9IDA7CisgICAgZmxvYXQgeCA9IC1ncmlkTWFyZ2luOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga0dyaWRTaXplOyBpKyssIHggKz0gZ3JpZFNwYWNpbmdYKSB7CisgICAgICAgIGZsb2F0IHkgPSAtZ3JpZE1hcmdpbjsKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBrR3JpZFNpemU7IGorKywgeSArPSBncmlkU3BhY2luZ1ksIGluZGV4KyspIHsKKyAgICAgICAgICAgIG1Db3JyZWN0ZWRHcmlkW2luZGV4XS5zcmMgPSBudWxscHRyOworICAgICAgICAgICAgbUNvcnJlY3RlZEdyaWRbaW5kZXhdLmNvb3JkcyA9IHsKKyAgICAgICAgICAgICAgICB4LCB5LAorICAgICAgICAgICAgICAgIHggKyBncmlkU3BhY2luZ1gsIHksCisgICAgICAgICAgICAgICAgeCArIGdyaWRTcGFjaW5nWCwgeSArIGdyaWRTcGFjaW5nWSwKKyAgICAgICAgICAgICAgICB4LCB5ICsgZ3JpZFNwYWNpbmdZCisgICAgICAgICAgICB9OworICAgICAgICAgICAgbURpc3RvcnRlZEdyaWRbaW5kZXhdLnNyYyA9ICZtQ29ycmVjdGVkR3JpZFtpbmRleF07CisgICAgICAgICAgICBtRGlzdG9ydGVkR3JpZFtpbmRleF0uY29vcmRzID0gbUNvcnJlY3RlZEdyaWRbaW5kZXhdLmNvb3JkczsKKyAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IG1hcENvcnJlY3RlZFRvUmF3KG1EaXN0b3J0ZWRHcmlkW2luZGV4XS5jb29yZHMuZGF0YSgpLCA0KTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtVmFsaWRHcmlkcyA9IHRydWU7CisgICAgcmV0dXJuIE9LOworfQorCitjb25zdCBEaXN0b3J0aW9uTWFwcGVyOjpHcmlkUXVhZCogRGlzdG9ydGlvbk1hcHBlcjo6ZmluZEVuY2xvc2luZ1F1YWQoCisgICAgICAgIGNvbnN0IGludDMyX3QgcHRbMl0sIGNvbnN0IHN0ZDo6dmVjdG9yPEdyaWRRdWFkPiYgZ3JpZCkgeworICAgIGNvbnN0IGZsb2F0IHggPSBwdFswXTsKKyAgICBjb25zdCBmbG9hdCB5ID0gcHRbMV07CisKKyAgICBmb3IgKGNvbnN0IEdyaWRRdWFkJiBxdWFkIDogZ3JpZCkgeworICAgICAgICBjb25zdCBmbG9hdCAmeDEgPSBxdWFkLmNvb3Jkc1swXTsKKyAgICAgICAgY29uc3QgZmxvYXQgJnkxID0gcXVhZC5jb29yZHNbMV07CisgICAgICAgIGNvbnN0IGZsb2F0ICZ4MiA9IHF1YWQuY29vcmRzWzJdOworICAgICAgICBjb25zdCBmbG9hdCAmeTIgPSBxdWFkLmNvb3Jkc1szXTsKKyAgICAgICAgY29uc3QgZmxvYXQgJngzID0gcXVhZC5jb29yZHNbNF07CisgICAgICAgIGNvbnN0IGZsb2F0ICZ5MyA9IHF1YWQuY29vcmRzWzVdOworICAgICAgICBjb25zdCBmbG9hdCAmeDQgPSBxdWFkLmNvb3Jkc1s2XTsKKyAgICAgICAgY29uc3QgZmxvYXQgJnk0ID0gcXVhZC5jb29yZHNbN107CisKKyAgICAgICAgLy8gUG9pbnQtaW4tcXVhZCB0ZXN0OgorCisgICAgICAgIC8vIFF1YWQgaGFzIGNvcm5lcnMgUDEtUDQ7IGlmIFAgaXMgd2l0aGluIHRoZSBxdWFkLCB0aGVuIGl0IGlzIG9uIHRoZSBzYW1lIHNpZGUgb2YgYWxsIHRoZQorICAgICAgICAvLyBlZGdlcyAob3Igb24gdG9wIG9mIG9uZSBvZiB0aGUgZWRnZXMgb3IgY29ybmVycyksIHRyYXZlcnNlZCBpbiBhIGNvbnNpc3RlbnQgZGlyZWN0aW9uLgorICAgICAgICAvLyBUaGlzIG1lYW5zIHRoYXQgdGhlIGNyb3NzIHByb2R1Y3Qgb2YgZWRnZSBFbiA9IFBuLT5QKG4rMSBtb2QgNCkgYW5kIGxpbmUgRXAgPSBQbi0+UCBtdXN0CisgICAgICAgIC8vIGhhdmUgdGhlIHNhbWUgc2lnbiAob3IgYmUgemVybykgZm9yIGFsbCBlZGdlcy4KKyAgICAgICAgLy8gRm9yIGNsb2Nrd2lzZSB0cmF2ZXJzYWwsIHRoZSBzaWduIHNob3VsZCBiZSBuZWdhdGl2ZSBvciB6ZXJvIGZvciBFcCB4IEVuLCBpbmRpY2F0aW5nIHRoYXQKKyAgICAgICAgLy8gRW4gaXMgdG8gdGhlIGxlZnQgb2YgRXAsIG9yIG92ZXJsYXBwaW5nLgorICAgICAgICBmbG9hdCBzMSA9ICh4IC0geDEpICogKHkyIC0geTEpIC0gKHkgLSB5MSkgKiAoeDIgLSB4MSk7CisgICAgICAgIGlmIChzMSA+IDApIGNvbnRpbnVlOworICAgICAgICBmbG9hdCBzMiA9ICh4IC0geDIpICogKHkzIC0geTIpIC0gKHkgLSB5MikgKiAoeDMgLSB4Mik7CisgICAgICAgIGlmIChzMiA+IDApIGNvbnRpbnVlOworICAgICAgICBmbG9hdCBzMyA9ICh4IC0geDMpICogKHk0IC0geTMpIC0gKHkgLSB5MykgKiAoeDQgLSB4Myk7CisgICAgICAgIGlmIChzMyA+IDApIGNvbnRpbnVlOworICAgICAgICBmbG9hdCBzNCA9ICh4IC0geDQpICogKHkxIC0geTQpIC0gKHkgLSB5NCkgKiAoeDEgLSB4NCk7CisgICAgICAgIGlmIChzNCA+IDApIGNvbnRpbnVlOworCisgICAgICAgIHJldHVybiAmcXVhZDsKKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK2Zsb2F0IERpc3RvcnRpb25NYXBwZXI6OmNhbGN1bGF0ZVVvclYoY29uc3QgaW50MzJfdCBwdFsyXSwgY29uc3QgR3JpZFF1YWQmIHF1YWQsIGJvb2wgY2FsY3VsYXRlVSkgeworICAgIGNvbnN0IGZsb2F0IHggPSBwdFswXTsKKyAgICBjb25zdCBmbG9hdCB5ID0gcHRbMV07CisgICAgY29uc3QgZmxvYXQgJngxID0gcXVhZC5jb29yZHNbMF07CisgICAgY29uc3QgZmxvYXQgJnkxID0gcXVhZC5jb29yZHNbMV07CisgICAgY29uc3QgZmxvYXQgJngyID0gY2FsY3VsYXRlVSA/IHF1YWQuY29vcmRzWzJdIDogcXVhZC5jb29yZHNbNl07CisgICAgY29uc3QgZmxvYXQgJnkyID0gY2FsY3VsYXRlVSA/IHF1YWQuY29vcmRzWzNdIDogcXVhZC5jb29yZHNbN107CisgICAgY29uc3QgZmxvYXQgJngzID0gcXVhZC5jb29yZHNbNF07CisgICAgY29uc3QgZmxvYXQgJnkzID0gcXVhZC5jb29yZHNbNV07CisgICAgY29uc3QgZmxvYXQgJng0ID0gY2FsY3VsYXRlVSA/IHF1YWQuY29vcmRzWzZdIDogcXVhZC5jb29yZHNbMl07CisgICAgY29uc3QgZmxvYXQgJnk0ID0gY2FsY3VsYXRlVSA/IHF1YWQuY29vcmRzWzddIDogcXVhZC5jb29yZHNbM107CisKKyAgICBmbG9hdCBhID0gKHgxIC0geDIpICogKHkxIC0geTIgKyB5MyAtIHk0KSAtICh5MSAtIHkyKSAqICh4MSAtIHgyICsgeDMgLSB4NCk7CisgICAgZmxvYXQgYiA9ICh4IC0geDEpICogKHkxIC0geTIgKyB5MyAtIHk0KSArICh4MSAtIHgyKSAqICh5NCAtIHkxKSAtCisgICAgICAgICAgICAgICh5IC0geTEpICogKHgxIC0geDIgKyB4MyAtIHg0KSAtICh5MSAtIHkyKSAqICh4NCAtIHgxKTsKKyAgICBmbG9hdCBjID0gKHggLSB4MSkgKiAoeTQgLSB5MSkgLSAoeSAtIHkxKSAqICh4NCAtIHgxKTsKKworICAgIGlmIChhID09IDApIHsKKyAgICAgICAgLy8gT25lIHNvbHV0aW9uIG1heSBoYXBwZW4gaWYgZWRnZXMgYXJlIHBhcmFsbGVsCisgICAgICAgIGZsb2F0IHUwID0gLWMgLyBiOworICAgICAgICBBTE9HVigidTA6ICUuOWcsIGI6ICVmLCBjOiAlZiIsIHUwLCBiLCBjKTsKKyAgICAgICAgcmV0dXJuIHUwOworICAgIH0KKworICAgIGZsb2F0IGRldCA9IGIgKiBiIC0gNCAqIGEgKiBjOworICAgIGlmIChkZXQgPCAwKSB7CisgICAgICAgIC8vIFNhbml0eSBjaGVjayAtIHNob3VsZCBub3QgaGFwcGVuIGlmIHB0IGlzIHdpdGhpbiB0aGUgcXVhZAorICAgICAgICBBTE9HRSgiQmFkIGRldGVybWluYW50ISBhOiAlZiwgYjogJWYsIGM6ICVmLCBkZXQ6ICVmIiwgYSxiLGMsZGV0KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8vIFNlbGVjdCBtb3JlIG51bWVyaWNhbGx5IHN0YWJsZSBzb2x1dGlvbgorICAgIGZsb2F0IHNxZGV0ID0gYiA+IDAgPyAtc3RkOjpzcXJ0KGRldCkgOiBzdGQ6OnNxcnQoZGV0KTsKKworICAgIGZsb2F0IHUxID0gKC1iICsgc3FkZXQpIC8gKDIgKiBhKTsKKyAgICBBTE9HVigidTE6ICUuOWciLCB1MSk7CisgICAgaWYgKDAgLSBrRmxvYXRGdXp6IDwgdTEgJiYgdTEgPCAxICsga0Zsb2F0RnV6eikgcmV0dXJuIHUxOworCisgICAgZmxvYXQgdTIgPSBjIC8gKGEgKiB1MSk7CisgICAgQUxPR1YoInUyOiAlLjlnIiwgdTIpOworICAgIGlmICgwIC0ga0Zsb2F0RnV6eiA8IHUyICYmIHUyIDwgMSArIGtGbG9hdEZ1enopIHJldHVybiB1MjsKKworICAgIC8vIExhc3QgcmVzb3J0LCByZXR1cm4gdGhlIHNtYWxsZXItbWFnbml0dWRlIHNvbHV0aW9uCisgICAgcmV0dXJuIGZhYnModTEpIDwgZmFicyh1MikgPyB1MSA6IHUyOworfQorCit9IC8vIG5hbWVzcGFjZSBjYW1lcmEzCisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvRGlzdG9ydGlvbk1hcHBlci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9EaXN0b3J0aW9uTWFwcGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZkNzE1YgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvRGlzdG9ydGlvbk1hcHBlci5oCkBAIC0wLDAgKzEsMTgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfRElTVE9SVElPTk1BUFBFUl9ICisjZGVmaW5lIEFORFJPSURfU0VSVkVSU19ESVNUT1JUSU9OTUFQUEVSX0gKKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPGFycmF5PgorI2luY2x1ZGUgPG11dGV4PgorCisjaW5jbHVkZSAiY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIGNhbWVyYTMgeworCisvKioKKyAqIFV0aWxpdGllcyB0byB0cmFuc2Zvcm0gYmV0d2VlbiByYXcgKGRpc3RvcnRlZCkgYW5kIHdhcnBlZCAoY29ycmVjdGVkKSBjb29yZGluYXRlIHN5c3RlbXMKKyAqIGZvciBjYW1lcmFzIHRoYXQgc3VwcG9ydCBnZW9tZXRyaWMgZGlzdG9ydGlvbgorICovCitjbGFzcyBEaXN0b3J0aW9uTWFwcGVyIHsKKyAgcHVibGljOgorICAgIERpc3RvcnRpb25NYXBwZXIoKTsKKworICAgIC8qKgorICAgICAqIENoZWNrIHdoZXRoZXIgZGlzdG9ydGlvbiBjb3JyZWN0aW9uIGlzIHN1cHBvcnRlZCBieSB0aGUgY2FtZXJhIEhBTAorICAgICAqLworICAgIHN0YXRpYyBib29sIGlzRGlzdG9ydGlvblN1cHBvcnRlZChjb25zdCBDYW1lcmFNZXRhZGF0YSAmZGV2aWNlSW5mbyk7CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGUgc3RhdGljIGxlbnMgY2FsaWJyYXRpb24gaW5mbyBmcm9tIGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzZXR1cFN0YXRpY0luZm8oY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmRldmljZUluZm8pOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgZGlzdG9ydGlvbiBjb3JyZWN0aW9uIGNhbiBiZSBhcHBsaWVkIGN1cnJlbnRseQorICAgICAqLworICAgIGJvb2wgY2FsaWJyYXRpb25WYWxpZCgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQ29ycmVjdCBjYXB0dXJlIHJlcXVlc3QgaWYgZGlzdG9ydGlvbiBjb3JyZWN0aW9uIGlzIGVuYWJsZWQKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBjb3JyZWN0Q2FwdHVyZVJlcXVlc3QoQ2FtZXJhTWV0YWRhdGEgKnJlcXVlc3QpOworCisgICAgLyoqCisgICAgICogQ29ycmVjdCBjYXB0dXJlIHJlc3VsdCBpZiBkaXN0b3J0aW9uIGNvcnJlY3Rpb24gaXMgZW5hYmxlZAorICAgICAqLworICAgIHN0YXR1c190IGNvcnJlY3RDYXB0dXJlUmVzdWx0KENhbWVyYU1ldGFkYXRhICpyZXF1ZXN0KTsKKworCisgIHB1YmxpYzogLy8gVmlzaWJsZSBmb3IgdGVzdGluZy4gTm90IGd1YXJkZWQgYnkgbXV0ZXg7IGRvIG5vdCB1c2UgY29uY3VycmVudGx5CisgICAgLyoqCisgICAgICogVXBkYXRlIGxlbnMgY2FsaWJyYXRpb24gZnJvbSBjYXB0dXJlIHJlc3VsdHMgb3IgZXF1aXZhbGVudAorICAgICAqLworICAgIHN0YXR1c190IHVwZGF0ZUNhbGlicmF0aW9uKGNvbnN0IENhbWVyYU1ldGFkYXRhICZyZXN1bHQpOworCisgICAgLyoqCisgICAgICogVHJhbnNmb3JtIGZyb20gZGlzdG9ydGVkIChvcmlnaW5hbCkgdG8gY29ycmVjdGVkICh3YXJwZWQpIGNvb3JkaW5hdGVzLgorICAgICAqIENvb3JkaW5hdGVzIGFyZSB0cmFuc2Zvcm1lZCBpbi1wbGFjZQorICAgICAqCisgICAgICogICBjb29yZFBhaXJzOiBBIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgY29uc2VjdXRpdmUgKHgseSkgcG9pbnRzCisgICAgICogICBjb29yZENvdW50OiBOdW1iZXIgb2YgKHgseSkgcGFpcnMgdG8gdHJhbnNmb3JtCisgICAgICovCisgICAgc3RhdHVzX3QgbWFwUmF3VG9Db3JyZWN0ZWQoaW50MzJfdCAqY29vcmRQYWlycywgaW50IGNvb3JkQ291bnQpOworCisgICAgLyoqCisgICAgICogVHJhbnNmb3JtIGZyb20gZGlzdG9ydGVkIChvcmlnaW5hbCkgdG8gY29ycmVjdGVkICh3YXJwZWQpIGNvb3JkaW5hdGVzLgorICAgICAqIENvb3JkaW5hdGVzIGFyZSB0cmFuc2Zvcm1lZCBpbi1wbGFjZQorICAgICAqCisgICAgICogICByZWN0czogQSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGNvbnNlY3V0aXZlICh4LHksIHcsIGgpIHJlY3RhbmdsZXMKKyAgICAgKiAgIHJlY3RDb3VudDogTnVtYmVyIG9mIHJlY3RhbmdsZXMgdG8gdHJhbnNmb3JtCisgICAgICovCisgICAgc3RhdHVzX3QgbWFwUmF3UmVjdFRvQ29ycmVjdGVkKGludDMyX3QgKnJlY3RzLCBpbnQgcmVjdENvdW50KTsKKworICAgIC8qKgorICAgICAqIFRyYW5zZm9ybSBmcm9tIGNvcnJlY3RlZCAod2FycGVkKSB0byBkaXN0b3J0ZWQgKG9yaWdpbmFsKSBjb29yZGluYXRlcy4KKyAgICAgKiBDb29yZGluYXRlcyBhcmUgdHJhbnNmb3JtZWQgaW4tcGxhY2UKKyAgICAgKgorICAgICAqICAgY29vcmRQYWlyczogQSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGNvbnNlY3V0aXZlICh4LHkpIHBvaW50cworICAgICAqICAgY29vcmRDb3VudDogTnVtYmVyIG9mICh4LHkpIHBhaXJzIHRvIHRyYW5zZm9ybQorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RhdHVzX3QgbWFwQ29ycmVjdGVkVG9SYXcoVCogY29vcmRQYWlycywgaW50IGNvb3JkQ291bnQpIGNvbnN0OworCisgICAgLyoqCisgICAgICogVHJhbnNmb3JtIGZyb20gY29ycmVjdGVkICh3YXJwZWQpIHRvIGRpc3RvcnRlZCAob3JpZ2luYWwpIGNvb3JkaW5hdGVzLgorICAgICAqIENvb3JkaW5hdGVzIGFyZSB0cmFuc2Zvcm1lZCBpbi1wbGFjZQorICAgICAqCisgICAgICogICByZWN0czogQSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGNvbnNlY3V0aXZlICh4LHksIHcsIGgpIHJlY3RhbmdsZXMKKyAgICAgKiAgIHJlY3RDb3VudDogTnVtYmVyIG9mIHJlY3RhbmdsZXMgdG8gdHJhbnNmb3JtCisgICAgICovCisgICAgc3RhdHVzX3QgbWFwQ29ycmVjdGVkUmVjdFRvUmF3KGludDMyX3QgKnJlY3RzLCBpbnQgcmVjdENvdW50KSBjb25zdDsKKworICAgIHN0cnVjdCBHcmlkUXVhZCB7CisgICAgICAgIC8vIFNvdXJjZSBncmlkIHF1YWQsIG9yIG51bGwKKyAgICAgICAgY29uc3QgR3JpZFF1YWQgKnNyYzsKKyAgICAgICAgLy8geCx5IGNvb3JkaW5hdGVzIG9mIGNvcm5lcnMsIGluCisgICAgICAgIC8vIGNsb2Nrd2lzZSBvcmRlcgorICAgICAgICBzdGQ6OmFycmF5PGZsb2F0LCA4PiBjb29yZHM7CisgICAgfTsKKworICAgIC8vIEZpbmQgd2hpY2ggZ3JpZCBxdWFkIGVuY2xvc2VzIHRoZSBwb2ludDsgcmV0dXJucyBudWxsIGlmIG5vbmUgZG8KKyAgICBzdGF0aWMgY29uc3QgR3JpZFF1YWQqIGZpbmRFbmNsb3NpbmdRdWFkKAorICAgICAgICAgICAgY29uc3QgaW50MzJfdCBwdFsyXSwgY29uc3Qgc3RkOjp2ZWN0b3I8R3JpZFF1YWQ+JiBncmlkKTsKKworICAgIC8vIENhbGN1bGF0ZSAnaG9yaXpvbnRhbCcgaW50ZXJwb2xhdGlvbiBjb29yZGluYXRlIGZvciB0aGUgcG9pbnQgYW5kIHRoZSBxdWFkCisgICAgLy8gQXNzdW1lcyB0aGUgcG9pbnQgUCBpcyB3aXRoaW4gdGhlIHF1YWQgUS4KKyAgICAvLyBHaXZlbiBxdWFkIHdpdGggcG9pbnRzIFAxLVA0LCBhbmQgZWRnZXMgRTEyLUU0MSwgYW5kIGNvbnNpZGVyaW5nIHRoZSBlZGdlIHNlZ21lbnRzIGFzCisgICAgLy8gZnVuY3Rpb25zIG9mIFU6IEUxMih1KSwgd2hlcmUgRTEyKDApID0gUDEgYW5kIEUxMigxKSA9IFAyLCB0aGVuIHdlIHdhbnQgdG8gZmluZCBhIHUKKyAgICAvLyBzdWNoIHRoYXQgdGhlIGVkZ2UgRTEyKHUpIC0+IEU0Myh1KSBjb250YWlucyBwb2ludCBQLgorICAgIC8vIFRoaXMgY2FuIGJlIGRldGVybWluZWQgYnkgY2hlY2tpbmcgaWYgdGhlIGNyb3NzIHByb2R1Y3Qgb2YgdmVjdG9yIFtFMTIodSktRTQzKHUpXSBhbmQKKyAgICAvLyB2ZWN0b3IgW0UxMih1KS1QXSBpcyB6ZXJvLiBTb2x2aW5nIHRoZSBlcXVhdGlvbgorICAgIC8vIFtFMTIodSktRTQzKHUpXSB4IFtFMTIodSktUF0gPSAwIGdpdmVzIGEgcXVhZHJhdGljIGVxdWF0aW9uIGluIHU7IHRoZSBzb2x1dGlvbiBpbiB0aGUgcmFuZ2UKKyAgICAvLyAwIHRvIDEgaXMgdGhlIG9uZSBjaG9zZW4uCisgICAgLy8gSWYgY2FsY3VsYXRlVSBpcyB0cnVlLCB0aGVuIGFuIGludGVycG9sYXRpb24gY29vcmRpbmF0ZSBmb3IgZWRnZXMgRTEyIGFuZCBFNDMgaXMgZm91bmQ7CisgICAgLy8gaWYgaXQgaXMgZmFsc2UsIHRoZW4gYW4gaW50ZXJwb2xhdGlvbiBjb29yZGluYXRlIGZvciBlZGdlcyBFMTQgYW5kIEUyMyBpcyBmb3VuZC4KKyAgICBzdGF0aWMgZmxvYXQgY2FsY3VsYXRlVW9yVihjb25zdCBpbnQzMl90IHB0WzJdLCBjb25zdCBHcmlkUXVhZCYgcXVhZCwgYm9vbCBjYWxjdWxhdGVVKTsKKworICBwcml2YXRlOgorICAgIG11dGFibGUgc3RkOjptdXRleCBtTXV0ZXg7CisKKyAgICAvLyBOdW1iZXIgb2YgcXVhZHMgaW4gZWFjaCBkaW1lbnNpb24gb2YgdGhlIG1hcHBpbmcgZ3JpZHMKKyAgICBjb25zdGV4cHIgc3RhdGljIHNpemVfdCBrR3JpZFNpemUgPSAxNTsKKyAgICAvLyBNYXJnaW4gdG8gZXhwYW5kIHRoZSBncmlkIGJ5IHRvIGVuc3VyZSBpdCBkb2Vzbid0IGNsaXAgdGhlIGRvbWFpbgorICAgIGNvbnN0ZXhwciBzdGF0aWMgZmxvYXQga0dyaWRNYXJnaW4gPSAwLjA1ZjsKKyAgICAvLyBGdXp6aW5lc3MgZm9yIGZsb2F0IGluZXF1YWxpdHkgdGVzdHMKKyAgICBjb25zdGV4cHIgc3RhdGljIGZsb2F0IGtGbG9hdEZ1enogPSAxZS00OworCisgICAgLy8gTWV0YWRhdGEga2V5IGxpc3RzIHRvIGNvcnJlY3QKKworICAgIC8vIEJvdGggY2FwdHVyZSByZXF1ZXN0IGFuZCByZXN1bHQKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjphcnJheTx1aW50MzJfdCwgMz4ga01ldGVyaW5nUmVnaW9uc1RvQ29ycmVjdDsKKworICAgIC8vIE9ubHkgY2FwdHVyZSByZXF1ZXN0CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6YXJyYXk8dWludDMyX3QsIDE+IGtSZXF1ZXN0UmVjdHNUb0NvcnJlY3Q7CisKKyAgICAvLyBPbmx5IGNhcHR1cmUgcmVzdWx0CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6YXJyYXk8dWludDMyX3QsIDI+IGtSZXN1bHRSZWN0c1RvQ29ycmVjdDsKKworICAgIC8vIE9ubHkgZm9yIGNhcHR1cmUgcmVzdWx0cworICAgIHN0YXRpYyBjb25zdCBzdGQ6OmFycmF5PHVpbnQzMl90LCAxPiBrUmVzdWx0UG9pbnRzVG9Db3JyZWN0OworCisgICAgLy8gVXRpbGl0eSB0byBjcmVhdGUgcmV2ZXJzZSBtYXBwaW5nIGdyaWRzCisgICAgc3RhdHVzX3QgYnVpbGRHcmlkcygpOworCisKKyAgICBib29sIG1WYWxpZE1hcHBpbmc7CisgICAgYm9vbCBtVmFsaWRHcmlkczsKKworICAgIC8vIGludHJpc2ljIHBhcmFtZXRlcnMsIGluIHBpeGVscworICAgIGZsb2F0IG1GeCwgbUZ5LCBtQ3gsIG1DeSwgbVM7CisgICAgLy8gcHJlLWNhbGN1bGF0ZWQgaW52ZXJzZXMgZm9yIHNwZWVkCisgICAgZmxvYXQgbUludkZ4LCBtSW52Rnk7CisgICAgLy8gcmFkaWFsL3RhbmdlbnRpYWwgZGlzdG9ydGlvbiBwYXJhbWV0ZXJzCisgICAgZmxvYXQgbUtbNV07CisKKyAgICAvLyBwcmUtY29ycmVjdGlvbiBhY3RpdmUgYXJyYXkgZGltZW5zaW9ucworICAgIGludCBtQXJyYXlXaWR0aCwgbUFycmF5SGVpZ2h0OworCisgICAgc3RkOjp2ZWN0b3I8R3JpZFF1YWQ+IG1Db3JyZWN0ZWRHcmlkOworICAgIHN0ZDo6dmVjdG9yPEdyaWRRdWFkPiBtRGlzdG9ydGVkR3JpZDsKKworfTsgLy8gY2xhc3MgRGlzdG9ydGlvbk1hcHBlcgorCit9IC8vIG5hbWVzcGFjZSBjYW1lcmEzCisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9BbmRyb2lkLm1rIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvQW5kcm9pZC5tawppbmRleCAzN2EwNWMyLi5mNzcwNjljIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0FuZHJvaWQubWsKQEAgLTE4LDYgKzE4LDcgQEAKIExPQ0FMX1NSQ19GSUxFUzo9ICQoY2FsbCBhbGwtY3BwLWZpbGVzLXVuZGVyLCAuKQogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJiYXNlIFwKICAgICBsaWJjdXRpbHMgXAogICAgIGxpYmNhbWVyYXNlcnZpY2UgXAogICAgIGxpYmhpZGxiYXNlIFwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0NhbWVyYVByb3ZpZGVyTWFuYWdlclRlc3QuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyVGVzdC5jcHAKaW5kZXggYzFkNmU4NS4uZWY5M2Q5YSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyVGVzdC5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyVGVzdC5jcHAKQEAgLTE5MCw2ICsxOTAsNyBAQAogICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXMpIG92ZXJyaWRlIHt9CiAgICAgdm9pZCBvblRvcmNoU3RhdHVzQ2hhbmdlZChjb25zdCBTdHJpbmc4ICYsCiAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlRvcmNoTW9kZVN0YXR1cykgb3ZlcnJpZGUge30KKyAgICB2b2lkIG9uTmV3UHJvdmlkZXJSZWdpc3RlcmVkKCkgb3ZlcnJpZGUge30KIH07CiAKIFRFU1QoQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyVGVzdCwgSW5pdGlhbGl6ZVRlc3QpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0Rpc3RvcnRpb25NYXBwZXJDb21wLnB5IGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvRGlzdG9ydGlvbk1hcHBlckNvbXAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVhMzZhNwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0Rpc3RvcnRpb25NYXBwZXJDb21wLnB5CkBAIC0wLDAgKzEsNDcgQEAKKyMgQ2FsY3VsYXRlcyBjb21wYXJpc29uIG91dHB1dCB2YWx1ZXMgZm9yIERpc3RvcnRpb25NYXBwZXJUZXN0LmNwcDpDb21wYXJlVG9PcGVuQ1YKKyMKKyMgQXNzdW1lcyBhIHB5dGhvbiB0aGF0IGhhcyBudW1weSBhbmQgY3YyIChPcGVuQ1YpIGF2YWlsYWJsZQorCitpbXBvcnQgbnVtcHkgYXMgbnAKK2ltcG9ydCBjdjIKKworRnggPSAxMDAwCitGeSA9IDEwMDAKK0N4ID0gNTAwCitDeSA9IDUwMAorIyBzID0gMCAtIG5vdCBzdXBwb3J0ZWQgYnkgT3BlbkNWCisKK0sgPSBucC5hcnJheShbW0Z4LCAwLCBDeF0sWzAsIEZ5LCBDeV0sWzAsIDAsIDFdXSkKKworIyBPcmRlciBpcyBrMSwgazIsIHQxLCB0MiwgazMKK2Rpc3QgPSBucC5hcnJheShbMC4xLCAtMC4wMDMsIDAuMDIsIDAuMDEsIDAuMDA0XSkKKworbnAucmFuZG9tLnNlZWQoMTIzNCkKKworYWN0aXZlQXJyYXkgPSBucC5hcnJheShbWzEwMDAsIDc1MF1dKQorCityYXdDb29yZHMgPSBucC5mbG9vcihucC5yYW5kb20ucmFuZCgxMDAwLDIpICogYWN0aXZlQXJyYXkpCisKKyMgT3BlbkNWIG5lZWRzIGVpdGhlciByb3cgY291bnQgb3IgY29sIGNvdW50ID0gMSBmb3Igc29tZSByZWFzb24KK3Jhd0Nvb3JkczIgPSByYXdDb29yZHMucmVzaGFwZSgtMSwgMSwgMikKKworIyBQIGlzIHRoZSBvdXRwdXQgY2FtZXJhIG1hdHJpeCwgSyBpcyB0aGUgaW5wdXQ7IHVzZSB0aGUgc2FtZSBmb3IgYm90aAorZXhwQ29vcmRzID0gY3YyLnVuZGlzdG9ydFBvaW50cyhyYXdDb29yZHMyLCBLLCBkaXN0LCBQID0gSykKKword2l0aCBvcGVuKCdEaXN0b3J0aW9uTWFwcGVyVGVzdF9PcGVuQ3ZEYXRhLmgnLCd3JykgYXMgZjoKKyAgZi53cml0ZSgnLy8gR2VuZXJhdGVkIGJ5IERpc3RvcnRpb25NYXBwZXJDb21wLnB5XG4nKTsKKyAgZi53cml0ZSgnLy8gZm9yIHVzZSBieSBEaXN0b3J0aW9uTWFwcGVyVGVzdC5jcHBcblxuJyk7CisKKyAgZi53cml0ZSgnbmFtZXNwYWNlIG9wZW5DdkRhdGEge1xuJykKKyAgZi53cml0ZSgnc3RkOjphcnJheTxpbnQzMl90LCAlZD4gcmF3Q29vcmRzID0ge1xuJyAlIChyYXdDb29yZHMuc2hhcGVbMF0gKiByYXdDb29yZHMuc2hhcGVbMV0pKQorICBmb3IgaSBpbiByYW5nZShyYXdDb29yZHMuc2hhcGVbMF0pOgorICAgIGYud3JpdGUoJyAgJWQsICVkLFxuJyAlIChyYXdDb29yZHNbaV1bMF0sIHJhd0Nvb3Jkc1tpXVsxXSkpCisgIGYud3JpdGUoJ307XG4nKQorCisgIGYud3JpdGUoJ3N0ZDo6YXJyYXk8aW50MzJfdCwgJWQ+IGV4cENvb3JkcyA9IHtcbicgJSAoZXhwQ29vcmRzLnNoYXBlWzBdICogZXhwQ29vcmRzLnNoYXBlWzJdKSkKKyAgZm9yIGkgaW4gcmFuZ2UoZXhwQ29vcmRzLnNoYXBlWzBdKToKKyAgICBmLndyaXRlKCcgICVkLCAlZCxcbicgJSAoZXhwQ29vcmRzW2ldWzBdWzBdLCBleHBDb29yZHNbaV1bMF1bMV0pKQorICBmLndyaXRlKCd9O1xuJykKKyAgZi53cml0ZSgnfSAvLyBuYW1lc3BhY2Ugb3BlbkN2RGF0YVxuJykKKworcHJpbnQgIkRpc3RvcnRpb25NYXBwZXJUZXN0X09wZW5DdkRhdGEuaCBnZW5lcmF0ZWQiCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9EaXN0b3J0aW9uTWFwcGVyVGVzdC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9EaXN0b3J0aW9uTWFwcGVyVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ4OTkzMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0Rpc3RvcnRpb25NYXBwZXJUZXN0LmNwcApAQCAtMCwwICsxLDI3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkRpc3RvcnRpb25NYXBwZXJUZXN0IgorCisjaW5jbHVkZSA8cmFuZG9tPgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2Nocm9ub191dGlscy5oPgorCisjaW5jbHVkZSAiLi4vZGV2aWNlMy9EaXN0b3J0aW9uTWFwcGVyLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmNhbWVyYTM7CisKKworaW50MzJfdCB0ZXN0QWN0aXZlQXJyYXlbXSA9IHsxMDAsIDEwMCwgMTAwMCwgNzUwfTsKKworZmxvYXQgdGVzdElDYWxbXSA9IHsgMTAwMC5mLCAxMDAwLmYsIDUwMC5mLCA1MDAuZiwgMC5mIH07CisKK2Zsb2F0IGlkZW50aXR5RGlzdG9ydGlvbltdID0geyAwLmYsIDAuZiwgMC5mLCAwLmYsIDAuZn07CisKK3N0ZDo6YXJyYXk8aW50MzJfdCwgMTI+IGJhc2ljQ29vcmRzID0geworICAgIDAsIDAsCisgICAgdGVzdEFjdGl2ZUFycmF5WzJdIC0gMSwgMCwKKyAgICB0ZXN0QWN0aXZlQXJyYXlbMl0gLSAxLCAgdGVzdEFjdGl2ZUFycmF5WzNdIC0gMSwKKyAgICAwLCB0ZXN0QWN0aXZlQXJyYXlbM10gLSAxLAorICAgIHRlc3RBY3RpdmVBcnJheVsyXSAvIDIsIHRlc3RBY3RpdmVBcnJheVszXSAvIDIsCisgICAgMjUxLCA0MDMgIC8vIEEgcGFydGljdWxhcmx5IGJhZCBjb29yZGluYXRlIGZvciBjdXJyZW50IGdyaWQgY291bnQvYXJyYXkgc2l6ZQorfTsKKworCit2b2lkIHNldHVwVGVzdE1hcHBlcihEaXN0b3J0aW9uTWFwcGVyICptLCBmbG9hdCBkaXN0b3J0aW9uWzVdKSB7CisgICAgQ2FtZXJhTWV0YWRhdGEgZGV2aWNlSW5mbzsKKworICAgIGRldmljZUluZm8udXBkYXRlKEFORFJPSURfU0VOU09SX0lORk9fUFJFX0NPUlJFQ1RJT05fQUNUSVZFX0FSUkFZX1NJWkUsCisgICAgICAgICAgICB0ZXN0QWN0aXZlQXJyYXksIDQpOworCisgICAgZGV2aWNlSW5mby51cGRhdGUoQU5EUk9JRF9MRU5TX0lOVFJJTlNJQ19DQUxJQlJBVElPTiwKKyAgICAgICAgICAgIHRlc3RJQ2FsLCA1KTsKKworICAgIGRldmljZUluZm8udXBkYXRlKEFORFJPSURfTEVOU19ESVNUT1JUSU9OLAorICAgICAgICAgICAgZGlzdG9ydGlvbiwgNSk7CisKKyAgICBtLT5zZXR1cFN0YXRpY0luZm8oZGV2aWNlSW5mbyk7Cit9CisKK1RFU1QoRGlzdG9ydGlvbk1hcHBlclRlc3QsIEluaXRpYWxpemF0aW9uKSB7CisgICAgQ2FtZXJhTWV0YWRhdGEgZGV2aWNlSW5mbzsKKworICAgIEFTU0VSVF9GQUxTRShEaXN0b3J0aW9uTWFwcGVyOjppc0Rpc3RvcnRpb25TdXBwb3J0ZWQoZGV2aWNlSW5mbykpOworCisgICAgdWludDhfdCBkaXN0b3J0aW9uTW9kZXNbXSA9CisgICAgICAgICAgICB7QU5EUk9JRF9ESVNUT1JUSU9OX0NPUlJFQ1RJT05fTU9ERV9PRkYsCisgICAgICAgICAgICAgQU5EUk9JRF9ESVNUT1JUSU9OX0NPUlJFQ1RJT05fTU9ERV9GQVNULAorICAgICAgICAgICAgIEFORFJPSURfRElTVE9SVElPTl9DT1JSRUNUSU9OX01PREVfSElHSF9RVUFMSVRZfTsKKworICAgIGRldmljZUluZm8udXBkYXRlKEFORFJPSURfRElTVE9SVElPTl9DT1JSRUNUSU9OX0FWQUlMQUJMRV9NT0RFUywKKyAgICAgICAgICAgIGRpc3RvcnRpb25Nb2RlcywgMSk7CisKKyAgICBBU1NFUlRfRkFMU0UoRGlzdG9ydGlvbk1hcHBlcjo6aXNEaXN0b3J0aW9uU3VwcG9ydGVkKGRldmljZUluZm8pKTsKKworICAgIGRldmljZUluZm8udXBkYXRlKEFORFJPSURfRElTVE9SVElPTl9DT1JSRUNUSU9OX0FWQUlMQUJMRV9NT0RFUywKKyAgICAgICAgICAgIGRpc3RvcnRpb25Nb2RlcywgMyk7CisKKyAgICBBU1NFUlRfVFJVRShEaXN0b3J0aW9uTWFwcGVyOjppc0Rpc3RvcnRpb25TdXBwb3J0ZWQoZGV2aWNlSW5mbykpOworCisgICAgRGlzdG9ydGlvbk1hcHBlciBtOworCisgICAgQVNTRVJUX0ZBTFNFKG0uY2FsaWJyYXRpb25WYWxpZCgpKTsKKworICAgIEFTU0VSVF9ORShtLnNldHVwU3RhdGljSW5mbyhkZXZpY2VJbmZvKSwgT0spOworCisgICAgQVNTRVJUX0ZBTFNFKG0uY2FsaWJyYXRpb25WYWxpZCgpKTsKKworICAgIGRldmljZUluZm8udXBkYXRlKEFORFJPSURfU0VOU09SX0lORk9fUFJFX0NPUlJFQ1RJT05fQUNUSVZFX0FSUkFZX1NJWkUsCisgICAgICAgICAgICB0ZXN0QWN0aXZlQXJyYXksIDQpOworCisgICAgZGV2aWNlSW5mby51cGRhdGUoQU5EUk9JRF9MRU5TX0lOVFJJTlNJQ19DQUxJQlJBVElPTiwKKyAgICAgICAgICAgIHRlc3RJQ2FsLCA1KTsKKworICAgIGRldmljZUluZm8udXBkYXRlKEFORFJPSURfTEVOU19ESVNUT1JUSU9OLAorICAgICAgICAgICAgaWRlbnRpdHlEaXN0b3J0aW9uLCA1KTsKKworICAgIEFTU0VSVF9FUShtLnNldHVwU3RhdGljSW5mbyhkZXZpY2VJbmZvKSwgT0spOworCisgICAgQVNTRVJUX1RSVUUobS5jYWxpYnJhdGlvblZhbGlkKCkpOworCisgICAgQ2FtZXJhTWV0YWRhdGEgY2FwdHVyZVJlc3VsdDsKKworICAgIEFTU0VSVF9ORShtLnVwZGF0ZUNhbGlicmF0aW9uKGNhcHR1cmVSZXN1bHQpLCBPSyk7CisKKyAgICBjYXB0dXJlUmVzdWx0LnVwZGF0ZShBTkRST0lEX0xFTlNfSU5UUklOU0lDX0NBTElCUkFUSU9OLAorICAgICAgICAgICAgdGVzdElDYWwsIDUpOworICAgIGNhcHR1cmVSZXN1bHQudXBkYXRlKEFORFJPSURfTEVOU19ESVNUT1JUSU9OLAorICAgICAgICAgICAgaWRlbnRpdHlEaXN0b3J0aW9uLCA1KTsKKworICAgIEFTU0VSVF9FUShtLnVwZGF0ZUNhbGlicmF0aW9uKGNhcHR1cmVSZXN1bHQpLCBPSyk7CisKK30KKworVEVTVChEaXN0b3J0aW9uTWFwcGVyVGVzdCwgSWRlbnRpdHlUcmFuc2Zvcm0pIHsKKyAgICBzdGF0dXNfdCByZXM7CisKKyAgICBEaXN0b3J0aW9uTWFwcGVyIG07CisgICAgc2V0dXBUZXN0TWFwcGVyKCZtLCBpZGVudGl0eURpc3RvcnRpb24pOworCisgICAgYXV0byBjb29yZHMgPSBiYXNpY0Nvb3JkczsKKyAgICByZXMgPSBtLm1hcENvcnJlY3RlZFRvUmF3KGNvb3Jkcy5kYXRhKCksIDUpOworICAgIEFTU0VSVF9FUShyZXMsIE9LKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29vcmRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIEVYUEVDVF9FUShjb29yZHNbaV0sIGJhc2ljQ29vcmRzW2ldKTsKKyAgICB9CisKKyAgICByZXMgPSBtLm1hcFJhd1RvQ29ycmVjdGVkKGNvb3Jkcy5kYXRhKCksIDUpOworICAgIEFTU0VSVF9FUShyZXMsIE9LKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29vcmRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIEVYUEVDVF9FUShjb29yZHNbaV0sIGJhc2ljQ29vcmRzW2ldKTsKKyAgICB9CisKKyAgICBzdGQ6OmFycmF5PGludDMyX3QsIDg+IHJlY3RzID0geworICAgICAgICAwLCAwLCAxMDAsIDEwMCwKKyAgICAgICAgdGVzdEFjdGl2ZUFycmF5WzJdIC0gMTAwLCB0ZXN0QWN0aXZlQXJyYXlbM10tMTAwLCAxMDAsIDEwMAorICAgIH07CisKKyAgICBhdXRvIHJlY3RzT3JpZyA9IHJlY3RzOworICAgIHJlcyA9IG0ubWFwQ29ycmVjdGVkUmVjdFRvUmF3KHJlY3RzLmRhdGEoKSwgMik7CisgICAgQVNTRVJUX0VRKHJlcywgT0spOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZWN0cy5zaXplKCk7IGkrKykgeworICAgICAgICBFWFBFQ1RfRVEocmVjdHNbaV0sIHJlY3RzT3JpZ1tpXSk7CisgICAgfQorCisgICAgcmVzID0gbS5tYXBSYXdSZWN0VG9Db3JyZWN0ZWQocmVjdHMuZGF0YSgpLCAyKTsKKyAgICBBU1NFUlRfRVEocmVzLCBPSyk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlY3RzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIEVYUEVDVF9FUShyZWN0c1tpXSwgcmVjdHNPcmlnW2ldKTsKKyAgICB9Cit9CisKK1RFU1QoRGlzdG9ydGlvbk1hcHBlclRlc3QsIExhcmdlVHJhbnNmb3JtKSB7CisgICAgc3RhdHVzX3QgcmVzOworICAgIGNvbnN0ZXhwciBpbnQgbWF4QWxsb3dlZFBpeGVsRXJyb3IgPSAyOyAvLyBNYXhpbXVtIHBlci1waXhlbCBlcnJvciBhbGxvd2VkCisgICAgY29uc3RleHByIGludCBidWNrZXRzUGVyUGl4ZWwgPSAzOyAvLyBIaXN0b2dyYW0gZ3JhbnVsYXJpdHkKKworICAgIHVuc2lnbmVkIGludCBzZWVkID0gMTIzNDsgLy8gRW5zdXJlIHJlcGVhdGFiaWxpdHkgZm9yIGRlYnVnZ2luZworICAgIGNvbnN0IHNpemVfdCBjb29yZENvdW50ID0gMWU2OyAvLyBOdW1iZXIgb2YgcmFuZG9tIHRlc3QgcG9pbnRzCisKKyAgICBmbG9hdCBiaWdEaXN0b3J0aW9uW10gPSB7MC4xLCAtMC4wMDMsIDAuMDA0LCAwLjAyLCAwLjAxfTsKKworICAgIERpc3RvcnRpb25NYXBwZXIgbTsKKyAgICBzZXR1cFRlc3RNYXBwZXIoJm0sIGJpZ0Rpc3RvcnRpb24pOworCisgICAgc3RkOjpkZWZhdWx0X3JhbmRvbV9lbmdpbmUgZ2VuKHNlZWQpOworCisgICAgc3RkOjp1bmlmb3JtX2ludF9kaXN0cmlidXRpb248aW50PiB4X2Rpc3QoMCwgdGVzdEFjdGl2ZUFycmF5WzJdIC0gMSk7CisgICAgc3RkOjp1bmlmb3JtX2ludF9kaXN0cmlidXRpb248aW50PiB5X2Rpc3QoMCwgdGVzdEFjdGl2ZUFycmF5WzNdIC0gMSk7CisKKyAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiByYW5kQ29vcmRzKGNvb3JkQ291bnQgKiAyKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmFuZENvb3Jkcy5zaXplKCk7IGkgKz0gMikgeworICAgICAgICByYW5kQ29vcmRzW2ldID0geF9kaXN0KGdlbik7CisgICAgICAgIHJhbmRDb29yZHNbaSArIDFdID0geV9kaXN0KGdlbik7CisgICAgfQorCisgICAgcmFuZENvb3Jkcy5pbnNlcnQocmFuZENvb3Jkcy5lbmQoKSwgYmFzaWNDb29yZHMuYmVnaW4oKSwgYmFzaWNDb29yZHMuZW5kKCkpOworCisgICAgYXV0byBvcmlnQ29vcmRzID0gcmFuZENvb3JkczsKKworICAgIGJhc2U6OlRpbWVyIGNvcnJlY3RlZFRvUmF3VGltZXI7CisgICAgcmVzID0gbS5tYXBDb3JyZWN0ZWRUb1JhdyhyYW5kQ29vcmRzLmRhdGEoKSwgcmFuZENvb3Jkcy5zaXplKCkgLyAyKTsKKyAgICBhdXRvIGNvcnJlY3RlZFRvUmF3RHVyYXRpb25NcyA9IGNvcnJlY3RlZFRvUmF3VGltZXIuZHVyYXRpb24oKTsKKyAgICBFWFBFQ1RfRVEocmVzLCBPSyk7CisKKyAgICBiYXNlOjpUaW1lciByYXdUb0NvcnJlY3RlZFRpbWVyOworICAgIHJlcyA9IG0ubWFwUmF3VG9Db3JyZWN0ZWQocmFuZENvb3Jkcy5kYXRhKCksIHJhbmRDb29yZHMuc2l6ZSgpIC8gMik7CisgICAgYXV0byByYXdUb0NvcnJlY3RlZER1cmF0aW9uTXMgPSByYXdUb0NvcnJlY3RlZFRpbWVyLmR1cmF0aW9uKCk7CisgICAgRVhQRUNUX0VRKHJlcywgT0spOworCisgICAgZmxvYXQgY29ycmVjdGVkVG9SYXdEdXJhdGlvblBlckNvb3JkVXMgPQorICAgICAgICAgICAgKHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjpkdXJhdGlvbjxkb3VibGUsIHN0ZDo6bWljcm8+PigKKyAgICAgICAgICAgICAgICBjb3JyZWN0ZWRUb1Jhd0R1cmF0aW9uTXMpIC8gKHJhbmRDb29yZHMuc2l6ZSgpIC8gMikgKS5jb3VudCgpOworICAgIGZsb2F0IHJhd1RvQ29ycmVjdGVkRHVyYXRpb25QZXJDb29yZFVzID0KKyAgICAgICAgICAgIChzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6ZHVyYXRpb248ZG91YmxlLCBzdGQ6Om1pY3JvPj4oCisgICAgICAgICAgICAgICAgcmF3VG9Db3JyZWN0ZWREdXJhdGlvbk1zKSAvIChyYW5kQ29vcmRzLnNpemUoKSAvIDIpICkuY291bnQoKTsKKworICAgIFJlY29yZFByb3BlcnR5KCJDb3JyZWN0ZWRUb1Jhd0R1cmF0aW9uUGVyQ29vcmRVcyIsCisgICAgICAgICAgICBiYXNlOjpTdHJpbmdQcmludGYoIiVmIiwgY29ycmVjdGVkVG9SYXdEdXJhdGlvblBlckNvb3JkVXMpKTsKKyAgICBSZWNvcmRQcm9wZXJ0eSgiUmF3VG9Db3JyZWN0ZWREdXJhdGlvblBlckNvb3JkVXMiLAorICAgICAgICAgICAgYmFzZTo6U3RyaW5nUHJpbnRmKCIlZiIsIHJhd1RvQ29ycmVjdGVkRHVyYXRpb25QZXJDb29yZFVzKSk7CisKKyAgICAvLyBDYWxjdWxhdGUgbWFwcGluZyBlcnJvcnMgYWZ0ZXIgcm91bmQgdHJpcAorICAgIGZsb2F0IHRvdGFsRXJyb3JTcSA9IDA7CisgICAgLy8gQmFzaWMgaGlzdG9ncmFtOyBidWNrZXRzIGdvIGZyb20gW04gdG8gTisxKQorICAgIHN0ZDo6YXJyYXk8aW50LCBtYXhBbGxvd2VkUGl4ZWxFcnJvciAqIGJ1Y2tldHNQZXJQaXhlbD4gaGlzdG9ncmFtID0gezB9OworICAgIGludCBvdXRPZkhpc3RvZ3JhbSA9IDA7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJhbmRDb29yZHMuc2l6ZSgpOyBpICs9IDIpIHsKKyAgICAgICAgaW50IHhPcmlnID0gb3JpZ0Nvb3Jkc1tpXTsKKyAgICAgICAgaW50IHlPcmlnID0gb3JpZ0Nvb3Jkc1tpICsgMV07CisgICAgICAgIGludCB4TWFwcGVkID0gcmFuZENvb3Jkc1tpXTsKKyAgICAgICAgaW50IHlNYXBwZWQgPSByYW5kQ29vcmRzW2kgKyAxXTsKKworICAgICAgICBmbG9hdCBlcnJvclNxID0gKHhNYXBwZWQgLSB4T3JpZykgKiAoeE1hcHBlZCAtIHhPcmlnKSArCisgICAgICAgICAgICAgICAgKHlNYXBwZWQgLSB5T3JpZykgKiAoeU1hcHBlZCAtIHlPcmlnKTsKKworICAgICAgICBFWFBFQ1RfTEUoZXJyb3JTcSwgbWF4QWxsb3dlZFBpeGVsRXJyb3IgKiBtYXhBbGxvd2VkUGl4ZWxFcnJvcikgPDwgIiggIiA8PAorICAgICAgICAgICAgICAgIHhPcmlnIDw8ICIsIiA8PCB5T3JpZyA8PCAiKSAtPiAoIiA8PCB4TWFwcGVkIDw8ICIsIiA8PCB5TWFwcGVkIDw8ICIpIjsKKworICAgICAgICAvLyBOb3RlOiBJbnRlZ2VyIGNvb3JkaW5hdGVzLCBzbyBoaXN0b2dyYW0gd2lsbCBiZSBjbHVtcHk7IGVycm9yIGRpc3RhbmNlcyBjYW4gb25seSBiZSBvZgorICAgICAgICAvLyBmb3JtIHNxcnQoWF4yK1leMikgd2hlcmUgWCwgWSBhcmUgaW50ZWdlcnMsIHNvOgorICAgICAgICAvLyAgICAwLCAxLCBzcXJ0KDIpLCAyLCBzcXJ0KDUpLCBzcXJ0KDgpLCAzLCBzcXJ0KDEwKSwgc3FydCgxMyksIDQgLi4uCisgICAgICAgIHRvdGFsRXJyb3JTcSArPSBlcnJvclNxOworICAgICAgICBmbG9hdCBlcnJvckRpc3QgPSBzdGQ6OnNxcnQoZXJyb3JTcSk7CisgICAgICAgIGlmIChlcnJvckRpc3QgPCBtYXhBbGxvd2VkUGl4ZWxFcnJvcikgeworICAgICAgICAgICAgaW50IGhpc3RCdWNrZXQgPSBzdGF0aWNfY2FzdDxpbnQ+KGVycm9yRGlzdCAqIGJ1Y2tldHNQZXJQaXhlbCk7IC8vIHJvdW5kcyBkb3duCisgICAgICAgICAgICBoaXN0b2dyYW1baGlzdEJ1Y2tldF0rKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dE9mSGlzdG9ncmFtKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbG9hdCBybXNFcnJvciA9IHN0ZDo6c3FydCh0b3RhbEVycm9yU3EgLyByYW5kQ29vcmRzLnNpemUoKSk7CisgICAgUmVjb3JkUHJvcGVydHkoIlJtc0Vycm9yIiwgYmFzZTo6U3RyaW5nUHJpbnRmKCIlZiIsIHJtc0Vycm9yKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoaXN0b2dyYW0uc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgbGFiZWwgPSBiYXNlOjpTdHJpbmdQcmludGYoIkhpc3RvZ3JhbUJpblslZiwlZikiLAorICAgICAgICAgICAgICAgIChmbG9hdClpL2J1Y2tldHNQZXJQaXhlbCwgKGZsb2F0KShpICsgMSkvYnVja2V0c1BlclBpeGVsKTsKKyAgICAgICAgUmVjb3JkUHJvcGVydHkobGFiZWwsIGhpc3RvZ3JhbVtpXSk7CisgICAgfQorICAgIFJlY29yZFByb3BlcnR5KCJIaXN0b2dyYW1PdXRPZlJhbmdlIiwgb3V0T2ZIaXN0b2dyYW0pOworfQorCisvLyBDb21wYXJlIGFnYWluc3QgdmFsdWVzIGNhbGN1bGF0ZWQgYnkgT3BlbkNWCisvLyB1bmRpc3RvcnRQb2ludHMoKSBtZXRob2QsIHdoaWNoIGlzIHRoZSBzYW1lIGFzIG1hcFJhd1RvQ29ycmVjdGVkCisvLyBTZWUgc2NyaXB0IERpc3RvcnRpb25NYXBwZXJDb21wLnB5CisjaW5jbHVkZSAiRGlzdG9ydGlvbk1hcHBlclRlc3RfT3BlbkN2RGF0YS5oIgorCitURVNUKERpc3RvcnRpb25NYXBwZXJUZXN0LCBDb21wYXJlVG9PcGVuQ1YpIHsKKyAgICBzdGF0dXNfdCByZXM7CisKKyAgICBmbG9hdCBiaWdEaXN0b3J0aW9uW10gPSB7MC4xLCAtMC4wMDMsIDAuMDA0LCAwLjAyLCAwLjAxfTsKKworICAgIC8vIEV4cGVjdCB0byBtYXRjaCB3aXRoaW4gc3FydCgyKSByYWRpdXMgcGl4ZWxzCisgICAgY29uc3QgaW50MzJfdCBtYXhTcUVycm9yID0gMjsKKworICAgIERpc3RvcnRpb25NYXBwZXIgbTsKKyAgICBzZXR1cFRlc3RNYXBwZXIoJm0sIGJpZ0Rpc3RvcnRpb24pOworCisgICAgdXNpbmcgbmFtZXNwYWNlIG9wZW5DdkRhdGE7CisKKyAgICByZXMgPSBtLm1hcFJhd1RvQ29ycmVjdGVkKHJhd0Nvb3Jkcy5kYXRhKCksIHJhd0Nvb3Jkcy5zaXplKCkgLyAyKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmF3Q29vcmRzLnNpemUoKTsgaSs9MikgeworICAgICAgICBpbnQzMl90IGRpc3QgPSAocmF3Q29vcmRzW2ldIC0gZXhwQ29vcmRzW2ldKSAqIChyYXdDb29yZHNbaV0gLSBleHBDb29yZHNbaV0pICsKKyAgICAgICAgICAgICAgIChyYXdDb29yZHNbaSArIDFdIC0gZXhwQ29vcmRzW2kgKyAxXSkgKiAocmF3Q29vcmRzW2kgKyAxXSAtIGV4cENvb3Jkc1tpICsgMV0pOworICAgICAgICBFWFBFQ1RfTEUoZGlzdCwgbWF4U3FFcnJvcikKKyAgICAgICAgICAgICAgICA8PCAiKCIgPDwgcmF3Q29vcmRzW2ldIDw8ICIsICIgPDwgcmF3Q29vcmRzW2kgKyAxXSA8PCAiKSAhPSAoIgorICAgICAgICAgICAgICAgIDw8IGV4cENvb3Jkc1tpXSA8PCAiLCAiIDw8IGV4cENvb3Jkc1tpICsgMV0gPDwgIikiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0Rpc3RvcnRpb25NYXBwZXJUZXN0X09wZW5DdkRhdGEuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0Rpc3RvcnRpb25NYXBwZXJUZXN0X09wZW5DdkRhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTk2YmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvRGlzdG9ydGlvbk1hcHBlclRlc3RfT3BlbkN2RGF0YS5oCkBAIC0wLDAgKzEsMjAwOSBAQAorLy8gR2VuZXJhdGVkIGJ5IERpc3RvcnRpb25NYXBwZXJDb21wLnB5CisvLyBmb3IgdXNlIGJ5IERpc3RvcnRpb25NYXBwZXJUZXN0LmNwcAorCituYW1lc3BhY2Ugb3BlbkN2RGF0YSB7CitzdGQ6OmFycmF5PGludDMyX3QsIDIwMDA+IHJhd0Nvb3JkcyA9IHsKKyAgMTkxLCA0NjYsCisgIDQzNywgNTg5LAorICA3NzksIDIwNCwKKyAgMjc2LCA2MDEsCisgIDk1OCwgNjU2LAorICAzNTcsIDM3NSwKKyAgNjgzLCA1MzQsCisgIDM3MCwgNDIwLAorICA1MDMsIDEwLAorICA3NzIsIDY2MSwKKyAgMzY0LCA0NjEsCisgIDc1LCAyNzYsCisgIDkzMywgNDg4LAorICAzOTcsIDU5MSwKKyAgMzE2LCA0MjYsCisgIDg2OSwgMzI3LAorICA4MDIsIDEwNywKKyAgNzA0LCA1MjgsCisgIDIxOCwgNjkzLAorICA0NDIsIDY4MSwKKyAgNTksIDEzOCwKKyAgNDcsIDUwNiwKKyAgNTk0LCAzOTksCisgIDQzLCA0MjEsCisgIDMyOSwgMzc3LAorICAxMTEsIDQ1NSwKKyAgNTY1LCA1LAorICA2MTcsIDY4NCwKKyAgNzkwLCA3NDQsCisgIDk1OCwgNTkzLAorICAyODUsIDQ2OCwKKyAgNDc4LCAxNDYsCisgIDM4MiwgNDAsCisgIDQ1MSwgNzM2LAorICAxMjMsIDg5LAorICA3MzgsIDQ0MCwKKyAgNDcxLCA4MCwKKyAgMjI5LCA2NzQsCisgIDQxNiwgNDAxLAorICA2LCAyMjUsCisgIDQzNiwgNDU5LAorICA5MTgsIDQ2OSwKKyAgNzA1LCAxMTIsCisgIDc0NiwgNjIzLAorICA2MzMsIDMyOCwKKyAgMTUyLCA0MjYsCisgIDUyOCwgNzEzLAorICA0ODAsIDM3NiwKKyAgNTM2LCA2MTQsCisgIDU3LCA1MDIsCisgIDc2NywgNTMxLAorICA3OTYsIDQxOCwKKyAgOTY1LCAxMTAsCisgIDI5LCA0NDUsCisgIDExNCwgNzEzLAorICAzMjUsIDE0NSwKKyAgNDU3LCA2OTAsCisgIDg3OSwgMTg5LAorICAzNDgsIDEzNiwKKyAgOTAxLCA1MjksCisgIDcyNiwgNjc1LAorICA3NzksIDQ0OSwKKyAgMjkxLCAxMTMsCisgIDMzNSwgNDkzLAorICA3MywgNDEsCisgIDMyMywgNDQyLAorICA4NTMsIDIxNSwKKyAgMTczLCAxMDAsCisgIDk5NCwgMTM0LAorICAzMTcsIDQyNiwKKyAgOSwgNjc1LAorICA5NzcsIDQxNywKKyAgODQsIDI0OSwKKyAgNzI4LCAxMDYsCisgIDU1MiwgMjA0LAorICA5NzQsIDUwMCwKKyAgMjU1LCA4MSwKKyAgNzc2LCA1ODYsCisgIDc2MSwgNjg1LAorICA2NTgsIDQyNiwKKyAgMjAxLCA1MjMsCisgIDk1MiwgNjY3LAorICA5OTMsIDYxNCwKKyAgNTQ1LCAzMzgsCisgIDg5MCwgNzI5LAorICA1OTMsIDI3NCwKKyAgMzIzLCA2NTMsCisgIDIxNSwgNTUxLAorICAzNjUsIDYwMSwKKyAgNzgyLCA1MjYsCisgIDYyMiwgMzcwLAorICA4NDAsIDUzNCwKKyAgNDQzLCAyMywKKyAgMzYzLCA1NDgsCisgIDQ3NSwgMjU4LAorICA2NDAsIDk0LAorICAxNzEsIDU1MiwKKyAgMTI3LCAyNzcsCisgIDYwNCwgNzcsCisgIDgwMiwgNzA5LAorICA5NzksIDY2MCwKKyAgNjI3LCA2OTcsCisgIDcyNCwgNTM3LAorICA0MSwgMzI5LAorICAyODIsIDI1MSwKKyAgODMsIDU3MCwKKyAgNTA5LCA0OTUsCisgIDYzMCwgMjc4LAorICA0NDYsIDMxMSwKKyAgNDgwLCA3MzcsCisgIDM3MywgOSwKKyAgOTIxLCA2NTQsCisgIDM1MSwgNDcyLAorICAzNTcsIDE1OSwKKyAgMjIzLCAzMTQsCisgIDcyLCA0ODgsCisgIDc1NSwgNjk5LAorICAzNzYsIDIyMiwKKyAgMzcxLCA2MjAsCisgIDkwMSwgMzIwLAorICAyLCAzMSwKKyAgMTQxLCA0NDgsCisgIDEwNiwgMjIyLAorICA1OCwgNDY1LAorICAyMiwgNjQxLAorICAzMDYsIDU2OSwKKyAgNTYzLCAyOCwKKyAgNTY1LCA0OTQsCisgIDE4MywgNTk4LAorICA2MTIsIDQxNiwKKyAgNjI5LCA1MTQsCisgIDI0MCwgNTkwLAorICA4NTYsIDU0NSwKKyAgNjkyLCAzNTQsCisgIDg1NiwgNDk4LAorICAzMzMsIDM4OCwKKyAgMzk0LCAyMywKKyAgNTc2LCA2MzcsCisgIDk1MSwgNTEyLAorICA3NiwgMzA3LAorICA0MSwgMTMwLAorICA1NjUsIDEyOSwKKyAgNTY2LCAzODUsCisgIDg2OCwgNTQwLAorICA5MDMsIDIwOCwKKyAgMjU2LCA1MjQsCisgIDkwMSwgNzM3LAorICA2NDAsIDI0NywKKyAgNjA2LCA2MTYsCisgIDYyNywgODgsCisgIDI4NSwgNzQwLAorICA0MzEsIDQzMCwKKyAgNTI3LCAxNDgsCisgIDE2NSwgMzc1LAorICA5OTAsIDI5NSwKKyAgNzE0LCAxMzEsCisgIDcwLCAxMTgsCisgIDE2MSwgMjEyLAorICA1MzYsIDU3OSwKKyAgODgwLCA0NzgsCisgIDg1MiwgNDQ4LAorICA2OTMsIDQwMiwKKyAgODg5LCAzOSwKKyAgNzgzLCAxMDgsCisgIDU4LCA0NCwKKyAgNTEsIDM4NiwKKyAgNDA0LCA3NDksCisgIDEwOCwgMjQ1LAorICA5OTcsIDMwMCwKKyAgODgzLCA0MjYsCisgIDk1MywgNjY0LAorICA3NzksIDIzLAorICA5NjIsIDM4OSwKKyAgMjA3LCA2NTYsCisgIDIyNCwgMTAzLAorICA3MjUsIDczMCwKKyAgNTM1LCAzMzMsCisgIDIyLCA0NTQsCisgIDk2NCwgNzI1LAorICA5MzAsIDEzOCwKKyAgNjIyLCAzMDksCisgIDM2MywgMjcsCisgIDg2OCwgNTA0LAorICA4NywgNjY1LAorICA3ODIsIDIzNywKKyAgODE4LCAzODAsCisgIDIxLCAzMjUsCisgIDQ0NiwgMTc5LAorICA4MzAsIDU1OCwKKyAgNTg2LCAzNjksCisgIDQ4NywgMjAwLAorICA2MDUsIDU2NSwKKyAgMjcwLCAzOTEsCisgIDk4LCA1MzUsCisgIDg4NCwgNDI1LAorICA5OTQsIDEzNCwKKyAgMTIsIDM0MiwKKyAgOTMxLCA2MzQsCisgIDQ3MywgNjc2LAorICAyMjUsIDIyOCwKKyAgNzE0LCA1NDMsCisgIDE4LCAyMTQsCisgIDU4MCwgNjk4LAorICAzMzgsIDkwLAorICA1MTYsIDUyNCwKKyAgMjk4LCA2NDYsCisgIDkwNSwgNTc2LAorICAyNjEsIDcwMywKKyAgOTM4LCA1NTgsCisgIDkxMCwgMTc3LAorICA0OTQsIDYwNywKKyAgOTU0LCA0NzgsCisgIDkxMCwgNTE5LAorICA0MiwgNjI1LAorICAzNjksIDcwMiwKKyAgNDgzLCA5MywKKyAgOTY0LCAxMiwKKyAgNjc2LCAxMDUsCisgIDE1NSwgNDg3LAorICA5ODEsIDUyMSwKKyAgNzYxLCAzMTgsCisgIDEzOCwgMTYyLAorICA3NjQsIDQwLAorICA0OTAsIDEzNSwKKyAgNjMwLCA0MTMsCisgIDU2NywgNjEzLAorICA5MzgsIDE0NCwKKyAgNzEyLCA1MjMsCisgIDI1OCwgNjg2LAorICA1MzIsIDQxOCwKKyAgMzIyLCAyNTMsCisgIDMzMiwgNzM0LAorICAyMDMsIDUwMCwKKyAgNTc0LCAzOCwKKyAgNTQyLCAxNTUsCisgIDkxLCA2NTIsCisgIDI3LCA3MjYsCisgIDMyNywgMzA3LAorICAxMzUsIDk1LAorICA0MTMsIDQ2MywKKyAgMTMyLCA3MzAsCisgIDE4MCwgNTcwLAorICA0ODIsIDU3NiwKKyAgMzAyLCAxMSwKKyAgNDYzLCA1MjcsCisgIDY2LCA1MDEsCisgIDM0NSwgNDQzLAorICAyMjksIDIwMCwKKyAgOTMyLCA2MTksCisgIDE0NSwgNDg1LAorICA4ODMsIDU1NiwKKyAgNTE1LCAxMDEsCisgIDM5LCA2MjUsCisgIDExNywgMzkyLAorICA4NzMsIDI5LAorICA2OTIsIDM1NywKKyAgMTY5LCA0NywKKyAgMzIsIDE4MSwKKyAgMTEyLCAzMDMsCisgIDQyLCA2OTQsCisgIDkzNSwgNjA3LAorICAxODgsIDQ0MCwKKyAgOTAzLCA3MjUsCisgIDY3LCAyMzgsCisgIDY5NiwgNDgwLAorICA2MzIsIDYyMSwKKyAgNzEzLCAyNTEsCisgIDE2NywgNTczLAorICAzNTksIDY2LAorICA3MjksIDY2MCwKKyAgNDEsIDEzMSwKKyAgNDIwLCAyNTUsCisgIDQ0LCA4NCwKKyAgNDM4LCA1MywKKyAgODE2LCA2NDksCisgIDEzMSwgMTQ0LAorICA0MzcsIDcyOCwKKyAgNzczLCA5OCwKKyAgOTI3LCA2MjAsCisgIDM5MiwgMTA1LAorICA1MiwgNjksCisgIDg4NiwgMTI2LAorICAzNjIsIDQ5MCwKKyAgNjA0LCAyOTYsCisgIDM3NCwgNDcsCisgIDQyOCwgNTM5LAorICA3NjgsIDE0NSwKKyAgODYyLCAyMSwKKyAgOTAyLCAxNzcsCisgIDEyOCwgMjM4LAorICA4NDgsIDYyNCwKKyAgMzQ1LCAxNzksCisgIDUzNSwgMjAzLAorICAzNCwgNDcwLAorICA1MjAsIDMxLAorICA3NTcsIDc0MSwKKyAgODAxLCAyNTcsCisgIDMzNSwgMjYzLAorICA0NDIsIDQzNCwKKyAgNjE3LCAxMzIsCisgIDg2NCwgNTMyLAorICAxNzAsIDY0MSwKKyAgMTksIDQ4MSwKKyAgMTYyLCAxOTMsCisgIDM0MiwgNCwKKyAgNDM4LCA1OTcsCisgIDY3NSwgNDA4LAorICA1NjQsIDEwLAorICA2MDgsIDc0MSwKKyAgMjI0LCA0NDAsCisgIDgzNSwgNTk0LAorICAzMjksIDI2NywKKyAgOTYwLCAxNjcsCisgIDIxMSwgMTE1LAorICA0OTUsIDE5NSwKKyAgNTU1LCA1NCwKKyAgMzc4LCAzNDUsCisgIDc3OCwgNTQwLAorICAyMzEsIDE4LAorICAyNTcsIDMwNywKKyAgOCwgMzUzLAorICA4NTIsIDY5MiwKKyAgMjMxLCA3NDMsCisgIDUsIDI1MSwKKyAgNzg5LCA3MywKKyAgNDQyLCAyODUsCisgIDgzMiwgNTMzLAorICAzNTUsIDE4LAorICA2OTMsIDMxNSwKKyAgODU4LCA0MzEsCisgIDk0MCwgNjYwLAorICA0NTgsIDEyLAorICA2OCwgMjQwLAorICA1OTIsIDQ1NywKKyAgNTEyLCAxMDgsCisgIDg3NiwgNTUzLAorICAzNzMsIDYyMSwKKyAgOTAsIDQ4LAorICA1MDUsIDcwMCwKKyAgMTQ4LCA0MjcsCisgIDU5LCAxMjYsCisgIDY5LCA2NzksCisgIDQ0NywgNzksCisgIDY2NSwgMzc2LAorICA0MDksIDU0NSwKKyAgMTcyLCAyODgsCisgIDI2NywgMjMxLAorICAxNzcsIDM2MSwKKyAgNjI5LCA0NCwKKyAgMTk2LCAyMDksCisgIDcwNywgMjQ1LAorICA0MjUsIDUyOCwKKyAgMTU5LCAzMjksCisgIDYyOSwgNjkzLAorICAzNTYsIDYxNCwKKyAgNjQwLCA1MzYsCisgIDczOCwgNzI4LAorICAyNDYsIDMxLAorICAyNDcsIDMzLAorICA3MDUsIDYyNiwKKyAgOTM0LCAzNTMsCisgIDUxMiwgMTk3LAorICA5OCwgNTk5LAorICAxNDIsIDYwNCwKKyAgODc5LCAzNzQsCisgIDkxNCwgMzA5LAorICAyMDAsIDQ4MiwKKyAgMzk5LCA0NjAsCisgIDQzNywgNDQ0LAorICA5NTEsIDQxNCwKKyAgOTAzLCAxMDMsCisgIDEsIDQ1OSwKKyAgNTQxLCA1ODUsCisgIDgyMSwgNzE1LAorICA2MDksIDIxNywKKyAgODI2LCAyODIsCisgIDYwOSwgNDY1LAorICA0NDEsIDE0OSwKKyAgNDQzLCA2OTMsCisgIDY3MSwgNjEsCisgIDU3MiwgOTAsCisgIDk5OSwgNzQ4LAorICA2OTQsIDI4MCwKKyAgNDAxLCA2OTMsCisgIDI0NCwgNDk4LAorICA0ODEsIDI2LAorICAxMTAsIDY3MSwKKyAgODkyLCA2ODYsCisgIDMwNywgMjIzLAorICA2NTksIDQ0NiwKKyAgOTg0LCA0NjEsCisgIDE1NCwgNjIzLAorICA4MTUsIDY5LAorICA4ODcsIDEyLAorICA4NjMsIDY3NCwKKyAgODUwLCA0ODksCisgIDMyOCwgNDA5LAorICAyMzcsIDY1MywKKyAgMTc2LCAyNzcsCisgIDc1OSwgMjI5LAorICA2MTYsIDE2NCwKKyAgODcyLCA0ODUsCisgIDQ3MywgMTc1LAorICA4MzMsIDczLAorICAyMDUsIDE3NiwKKyAgNTk2LCA0NzEsCisgIDk4MiwgMTMyLAorICA3OTksIDExNiwKKyAgMzYwLCA3MTYsCisgIDEzMCwgMjA0LAorICA4MDksIDcyNCwKKyAgOTIsIDQzNywKKyAgNDA1LCA2NzQsCisgIDg0LCAxMzUsCisgIDUwLCAyMjUsCisgIDE5MCwgNiwKKyAgMTI3LCA4NCwKKyAgNzMwLCAxNzksCisgIDkwMSwgMjQ2LAorICA4NzQsIDE3NywKKyAgMzc4LCA0MDYsCisgIDUxNSwgMzEwLAorICAzODgsIDI1NSwKKyAgNDAyLCAzNDIsCisgIDM4MiwgNDkzLAorICA4ODEsIDQyOSwKKyAgNDI4LCAxOTMsCisgIDg2NSwgMTI5LAorICA1NzksIDU0NSwKKyAgNzMwLCAzMDIsCisgIDExNywgNTcyLAorICA1MzMsIDU0MSwKKyAgNTk3LCAzMTcsCisgIDkzMywgNzQ1LAorICA1NDcsIDU0NywKKyAgMjcsIDY0NywKKyAgOTk4LCAyNDMsCisgIDg1MCwgNDU4LAorICA0NDEsIDM5NSwKKyAgNzc5LCAxODgsCisgIDQ2MiwgNjM1LAorICA2NzgsIDI3NSwKKyAgMTM3LCAzMDIsCisgIDkzMSwgNTA0LAorICA0MTksIDQyNiwKKyAgNDEsIDc0NiwKKyAgNjE5LCA1ODQsCisgIDkzMSwgMjU2LAorICA4MTEsIDY1NCwKKyAgNjY1LCA0NDEsCisgIDg5MywgMzM2LAorICAyNDQsIDYxMCwKKyAgNjk3LCAzMDcsCisgIDUsIDcxNSwKKyAgNjA1LCA0LAorICA0OTgsIDQ0OCwKKyAgMzAwLCAzNDYsCisgIDQ5NSwgNDM5LAorICA4NjksIDYyNCwKKyAgNzc4LCA0MTEsCisgIDYxMywgNTUwLAorICA1NjYsIDU4MSwKKyAgOTg2LCA1OTEsCisgIDYxNCwgMTE4LAorICA0NzYsIDIxMiwKKyAgMTUzLCA1ODIsCisgIDU4LCA1OSwKKyAgNjY0LCAzOTIsCisgIDQ0NiwgMjMwLAorICAxNywgMjIwLAorICAyNjcsIDI3LAorICA4MDQsIDI1MCwKKyAgODkxLCA2MDcsCisgIDk2NCwgNzE4LAorICA1OTEsIDIzMywKKyAgOTE4LCAzNywKKyAgMjI1LCAyNzIsCisgIDQxMiwgNzA4LAorICA1NzksIDE0MCwKKyAgNTk2LCA3MDAsCisgIDEzNCwgNzM2LAorICAxNTMsIDYxNSwKKyAgNjc3LCAzMDMsCisgIDIxNywgNTgwLAorICA4NDcsIDM5NywKKyAgNDA5LCAxMywKKyAgMTQ4LCA2MDMsCisgIDQxOSwgMjU0LAorICAyOTcsIDUzOCwKKyAgOTk3LCA0MTMsCisgIDg4OSwgMTI2LAorICA4ODMsIDUyNywKKyAgNDIyLCA2NDcsCisgIDIzNSwgNDIyLAorICAyNiwgMjg1LAorICAzNjEsIDY4LAorICA0NSwgMjU2LAorICAzNTUsIDc0NiwKKyAgOTQ0LCA5OCwKKyAgNTE4LCAzNTcsCisgIDQwMSwgNjk3LAorICA1MTUsIDYwNywKKyAgODgxLCA1NzIsCisgIDQ2NCwgNTUsCisgIDQ3MCwgMTUwLAorICAyMDgsIDEzMywKKyAgMzU0LCA2ODMsCisgIDQzMywgMTMzLAorICA3NTIsIDM3LAorICA4MiwgMjgsCisgIDQ2NSwgNDUyLAorICAxODEsIDM4OSwKKyAgNzEwLCA2OTMsCisgIDUyOSwgNzI4LAorICA1NDcsIDQsCisgIDQ3MiwgMzkxLAorICAxNTIsIDQ5MCwKKyAgMTMwLCAzNDAsCisgIDk4MiwgOTksCisgIDYwLCA1MCwKKyAgOTYsIDYxNCwKKyAgNjI5LCA1ODcsCisgIDc3LCA3MjgsCisgIDg4MiwgNDcyLAorICA5MjksIDI5OCwKKyAgNDg4LCA1MTQsCisgIDI4MSwgNTA3LAorICA0OTUsIDU5MywKKyAgMjE4LCA1NTksCisgIDQ1NCwgMzA2LAorICA5MjIsIDExMywKKyAgMTMwLCAyODYsCisgIDU0MSwgNzA4LAorICAzMjMsIDczLAorICA5NDcsIDY0MiwKKyAgMjYsIDg4LAorICA4MjksIDEwMywKKyAgNTY5LCAzNTgsCisgIDMwNiwgNDIsCisgIDkzNiwgNjc4LAorICA3MjIsIDQ5MCwKKyAgMzkyLCA3MzAsCisgIDcxMSwgMzY5LAorICAzMjYsIDg2LAorICA5NzIsIDIwNSwKKyAgMTg3LCAxNjEsCisgIDc2MCwgNzA4LAorICA1MDEsIDQ5NiwKKyAgMzQ3LCA5NiwKKyAgNjgxLCAyOTMsCisgIDI2LCAzNzUsCisgIDUyOCwgMTY3LAorICAxLCAzMzQsCisgIDUwNSwgNjAsCisgIDgyMiwgMTgwLAorICA5LCAxNjgsCisgIDg0LCA2MTksCisgIDcxNCwgMTgzLAorICA2MywgMzIwLAorICA3MDYsIDUzOCwKKyAgMTkzLCA1NTUsCisgIDk1NiwgMzg2LAorICA0MzAsIDE3LAorICA1MDcsIDUxNCwKKyAgMTM4LCA1MDQsCisgIDM5LCAzMjMsCisgIDg1NCwgMzE2LAorICA4OCwgNDIsCisgIDEwMywgMzYzLAorICA2NzQsIDY4LAorICA4MzIsIDU4MiwKKyAgNjEsIDI0MSwKKyAgMzc3LCAzNzYsCisgIDQ0OSwgMzUwLAorICAxMDQsIDI4MCwKKyAgMjEsIDMzNiwKKyAgODkzLCA1ODEsCisgIDI0OSwgNTQ4LAorICAzMTUsIDM3MiwKKyAgNTAsIDQzNiwKKyAgMjgyLCAyMjAsCisgIDEyNiwgNjY5LAorICA0NTEsIDQ4OCwKKyAgODA5LCAyMTIsCisgIDI3MywgMjg5LAorICA0MjEsIDY5OSwKKyAgODY3LCAzMzMsCisgIDI5LCA4MCwKKyAgMTk2LCAxNzgsCisgIDgyNCwgNjcyLAorICAyNywgNDI5LAorICA4MDUsIDMxNSwKKyAgNTI1LCAyMTQsCisgIDY1OCwgNjcsCisgIDgyMiwgNjA1LAorICAxOTEsIDQ3OCwKKyAgODMyLCAzNTIsCisgIDU4MCwgODEsCisgIDQ2MiwgNjY0LAorICA0NjQsIDM0OSwKKyAgMTk2LCAyOSwKKyAgNjE1LCA0MjMsCisgIDEwOCwgNTU2LAorICAxODMsIDI2MSwKKyAgNDgwLCA0ODIsCisgIDYyMSwgNTcwLAorICAyODYsIDM2OSwKKyAgNjgxLCAzODIsCisgIDc2OCwgMjI0LAorICA1NDYsIDE4MywKKyAgNDQzLCA2MDcsCisgIDEwMywgMTcyLAorICA3OTEsIDQyNCwKKyAgODI3LCA3MzEsCisgIDk2NSwgNzEyLAorICA1NTEsIDY5LAorICA3NDAsIDQyMywKKyAgNzQ1LCAzNDEsCisgIDE1NSwgNzQ2LAorICA4ODksIDYwMiwKKyAgNDExLCAxNTksCisgIDI5NCwgNDY3LAorICAyNDgsIDU5OSwKKyAgMTgsIDM2MCwKKyAgNzM0LCA1MTIsCisgIDQyMSwgNTE5LAorICAzNjcsIDE3NCwKKyAgNzg1LCA1NDUsCisgIDcwNiwgMjMsCisgIDIzOSwgMjc4LAorICA1ODEsIDY1LAorICAyMzIsIDYwOSwKKyAgNzUyLCA2MDMsCisgIDI5NCwgNTg1LAorICAyMjQsIDIxNywKKyAgODQ4LCA1NTgsCisgIDMzMiwgNDI1LAorICA2OTksIDY4LAorICA1MywgNjQ3LAorICA2MjksIDY1MiwKKyAgODcsIDY0OSwKKyAgNDEsIDcxOCwKKyAgMjI3LCA1NjMsCisgIDQwMCwgMzAyLAorICAyNTMsIDM4MCwKKyAgMTg0LCA0MiwKKyAgMzY2LCA1MzksCisgIDQ3NCwgNjkxLAorICAxNzAsIDUzOCwKKyAgODY5LCA5NiwKKyAgOTc0LCA1NjUsCisgIDkxNiwgMjgsCisgIDI4NSwgNjE3LAorICAyNzQsIDM4LAorICAxNDcsIDEyLAorICA3ODIsIDI2MSwKKyAgNzQ5LCA0MSwKKyAgNzgsIDU5MiwKKyAgMzcwLCA4MywKKyAgNDA1LCA0ODgsCisgIDQzNiwgMTUxLAorICA0NDMsIDU1NiwKKyAgOTYsIDM4MywKKyAgODQzLCA3NDUsCisgIDYzMCwgMjE0LAorICAxMjYsIDEwLAorICAzMzgsIDM2MywKKyAgNTQ2LCAyNywKKyAgNjEsIDE3LAorICA1MDcsIDE5OSwKKyAgNDQ1LCA3MzAsCisgIDc5NywgMjEzLAorICA1NTUsIDE0OCwKKyAgNzkwLCA2NSwKKyAgODM3LCAxODAsCisgIDQzNCwgMzIwLAorICAxMDIsIDY4MSwKKyAgMTQ5LCA2ODAsCisgIDEwLCAxMzAsCisgIDgzOSwgMjMyLAorICA4NDgsIDY4MywKKyAgODk5LCA2NTAsCisgIDgzNywgMTkwLAorICA4NDMsIDQ2MywKKyAgOTg0LCA0NTcsCisgIDY1MSwgNDkwLAorICA1NTIsIDEzOSwKKyAgOTgwLCA3MSwKKyAgNzQ4LCAzOTMsCisgIDI5MCwgMTcxLAorICA1MDMsIDY5OCwKKyAgNTc0LCA3NDIsCisgIDQyOSwgMzEyLAorICA2MjcsIDY4MCwKKyAgNjksIDQxMiwKKyAgMTU0LCA1MzgsCisgIDEzNSwgMywKKyAgNTM3LCAxMiwKKyAgNTM1LCAzNCwKKyAgMTUzLCA2MzIsCisgIDc5NywgMjI3LAorICAzOTgsIDMzNiwKKyAgMjAsIDQ2MywKKyAgODA0LCAxNzUsCisgIDQwMCwgMzY5LAorICA1MDEsIDI1MCwKKyAgMTA1LCA0ODAsCisgIDE1MSwgMTQ2LAorICA1NywgNjg2LAorICA4MzAsIDExOSwKKyAgODY3LCAzODAsCisgIDEyOCwgODQsCisgIDIyMiwgNjY3LAorICA0NTAsIDUyMiwKKyAgMzkwLCA0NjYsCisgIDcxNiwgMzc1LAorICA3NjAsIDYyNCwKKyAgNTU5LCA0MDcsCisgIDU4NywgMTgsCisgIDk4OSwgNTMsCisgIDgxNywgMTAyLAorICAxNTMsIDI2OSwKKyAgMjUzLCAxNjQsCisgIDU2MywgMzYwLAorICA5MywgMzg1LAorICAxOTcsIDM2MCwKKyAgMjc3LCA3LAorICA4ODcsIDI4MCwKKyAgNDE2LCA2NTgsCisgIDc2MCwgNDExLAorICA5MDIsIDY5MCwKKyAgNDY1LCA0MjQsCisgIDI4LCAxMDUsCisgIDM5OSwgNjIwLAorICA0NTUsIDUyMCwKKyAgNjM3LCA0OTEsCisgIDc2OSwgMCwKKyAgMzAwLCA1MjEsCisgIDkwLCAzOTIsCisgIDg5NCwgNzIyLAorICA3MDUsIDU3MywKKyAgMzQ0LCAxODgsCisgIDY2NywgMTExLAorICA0NzAsIDE2LAorICA3NTksIDE1NCwKKyAgODQwLCA1ODEsCisgIDE3NiwgNjYzLAorICA5MywgMTUxLAorICAzNzIsIDEzMCwKKyAgMzQ1LCA0MjUsCisgIDE1NiwgNTgxLAorICAzMywgOCwKKyAgMzIwLCAzOTUsCisgIDYyOSwgNjYxLAorICA2NDEsIDE3LAorICA2OTUsIDY2MywKKyAgNzUxLCAxOTcsCisgIDUwNywgOTMsCisgIDYwOCwgNTE5LAorICA3NywgMzAzLAorICA1MTMsIDYwNSwKKyAgOTgsIDM1NCwKKyAgNTY3LCA0MDEsCisgIDE4NCwgNDQwLAorICA3ODUsIDc0OCwKKyAgNTIsIDMyLAorICA1MjgsIDQ1MiwKKyAgODIsIDUzMiwKKyAgMTE2LCAxNDcsCisgIDc3OSwgMzQxLAorICAzMDgsIDI3NSwKKyAgNzYzLCAxMzUsCisgIDEzNywgMzc1LAorICAxNCwgMjYwLAorICAzMzcsIDM3OCwKKyAgNDkyLCAyNjIsCisgIDIwMiwgMTE5LAorICA1NjEsIDMzNCwKKyAgODU1LCA2ODMsCisgIDg3NiwgNzI0LAorICAyMDIsIDU0NCwKKyAgNTcxLCA0MzcsCisgIDQ1NiwgNDM2LAorICA2NywgNCwKKyAgNDY4LCA1OTIsCisgIDkyMiwgNTQwLAorICAxMjUsIDUzOSwKKyAgNjE1LCAyOTAsCisgIDc4NSwgNzYsCisgIDQwMiwgNTU2LAorICAxMiwgNjk2LAorICA0NjAsIDUyLAorICA5MDksIDkyLAorICA4OTQsIDE1MywKKyAgOTMxLCAzNzMsCisgIDM2MCwgMTIwLAorICA3MjYsIDYyNiwKKyAgMzE4LCA3MzMsCisgIDQ3MiwgNDI0LAorICAxNDYsIDc0LAorICA4NiwgNTY0LAorICA3NDIsIDIzNiwKKyAgODQ1LCA0MDAsCisgIDgzMiwgMTM5LAorICAyNzUsIDQzNywKKyAgOTI5LCA0MiwKKyAgODE4LCAxMjMsCisgIDQzOSwgMjc0LAorICA2NSwgNTkwLAorICA1MTIsIDEzMiwKKyAgNTIwLCA0NDMsCisgIDQ0NCwgMTA3LAorICA5NjEsIDMxMywKKyAgMTMwLCA0ODgsCisgIDU4NywgMTkxLAorICAyODcsIDYwMywKKyAgNTYsIDIwOCwKKyAgOTM2LCA2MjgsCisgIDkwOCwgNDQ1LAorICA3NzMsIDI1OCwKKyAgMzgzLCAyODMsCisgIDQyNSwgNTMwLAorICAyNDQsIDEzMywKKyAgMjE2LCA1NDMsCisgIDYzMSwgNTk1LAorICA3ODUsIDEwOCwKKyAgODcsIDE5MiwKKyAgNjQwLCA0MjcsCisgIDg4OSwgNjg4LAorICAxNTIsIDg5LAorICAxMCwgMjA5LAorICAxMjIsIDM0MywKKyAgMTg4LCA1LAorICA4OTYsIDc0OCwKKyAgODA2LCAyMiwKKyAgNTM1LCA0NTcsCisgIDg1MSwgMzA3LAorICAyNjEsIDU2NiwKKyAgNzkxLCA1OTAsCisgIDk0NywgMzAwLAorICA2NTgsIDM5NCwKKyAgNDE4LCAzMDUsCisgIDM3MSwgNjMyLAorICA0NzAsIDQzOCwKKyAgMTY1LCA0MTAsCisgIDUzOCwgMzgwLAorICA2NDMsIDQwOCwKKyAgMzE4LCA1OTEsCisgIDU2NCwgMzExLAorICAzMjcsIDY5MCwKKyAgOTMwLCA4LAorICA5MywgMTAwLAorICA2MjcsIDE5NiwKKyAgNTgyLCA0MTYsCisgIDIwMCwgNDkyLAorICA5NDMsIDI2NywKKyAgMzEsIDM1NSwKKyAgNjcsIDM3NCwKKyAgNjkyLCA1NywKKyAgMjI5LCAzNzMsCisgIDU0MiwgMzcxLAorICA4MDEsIDIzMCwKKyAgMTE0LCA0MjAsCisgIDc2OSwgMzI2LAorICA4MywgNDQ4LAorICA4NDYsIDEzNywKKyAgOTEyLCA3NywKKyAgMTI2LCAzLAorICA3ODQsIDQyMCwKKyAgNjYwLCAzOTEsCisgIDc5NSwgMTg4LAorICA1MzAsIDQyLAorICAxMzcsIDEwNiwKKyAgNjYzLCA4MCwKKyAgNzU3LCAzNDAsCisgIDY5NCwgMjY3LAorICA3NjgsIDYxMiwKKyAgOTI2LCAxNTUsCisgIDYwMCwgMjUsCisgIDI5MiwgMzEsCisgIDk3LCAyMjUsCisgIDYwLCA0MzcsCisgIDcyNCwgNTYzLAorICA2OTgsIDg1LAorICAyODYsIDE5NiwKKyAgNjYsIDEsCisgIDI2OSwgMjUsCisgIDQ2NywgNDA1LAorICAyMDQsIDE3MSwKKyAgNjUzLCAxNCwKKyAgMjk5LCAzNjAsCisgIDUyMSwgNzE5LAorICA3NjAsIDYwMiwKKyAgMzI5LCAyODIsCisgIDY4NywgNTMwLAorICAxMTAsIDIwMCwKKyAgMzAsIDMwMCwKKyAgNiwgNTAxLAorICA4NjgsIDI4MSwKKyAgMjgxLCA3NiwKKyAgODA1LCAzNjMsCisgIDg3NiwgMTE0LAorICAyMTksIDU0OSwKKyAgNjUsIDYxMSwKKyAgODU5LCAyMywKKyAgNjYsIDM1NCwKKyAgMjA1LCAxNjksCisgIDQzNCwgMTc0LAorICA4MjgsIDY2OCwKKyAgODE0LCA3MjAsCisgIDY2MywgMzQsCisgIDg3NSwgNzA3LAorICA5NjksIDU2MSwKKyAgOTMyLCA2NiwKKyAgODM0LCA1NDgsCisgIDk2MSwgODYsCisgIDI2MywgMTQ4LAorICAxNDUsIDIwMiwKKyAgODMsIDE0NiwKKyAgOTQ3LCA3MjcsCisgIDMsIDEzOCwKKyAgOTI3LCA1MTQsCisgIDgxNCwgNzQyLAorICA4MCwgNDMwLAorICA4NjYsIDE4NCwKKyAgNTkzLCA3MzEsCisgIDE5MywgMjE5LAorICA0OTYsIDQ5MCwKKyAgNjA2LCA1MzAsCisgIDMxNCwgMzM0LAorICAzMDEsIDMyNywKKyAgNTAsIDcxNSwKKyAgMTc4LCA1NywKKyAgOTM2LCA2MjYsCisgIDk3MiwgNjE3LAorICAzMywgNDI3LAorICAxNDcsIDQzNSwKKyAgODMsIDM0MSwKKyAgODU5LCAyNDQsCisgIDMzNywgNjg4LAorICA2MzcsIDEyNCwKKyAgODc0LCA3MSwKKyAgNTkwLCA0NzQsCisgIDMzMiwgMTIwLAorICA2NDAsIDI5MCwKKyAgODE2LCAxNzEsCisgIDY2NSwgNDMxLAorICA3OSwgMzEsCisgIDg1NywgMTEwLAorICAxMDMsIDc5LAorICAyOTMsIDM5NywKKyAgODY2LCA2NTEsCisgIDM1NiwgNzMsCisgIDQzOCwgNzEwLAorICA0MSwgMjMzLAorICA3ODIsIDU5NiwKKyAgODUyLCA0MDcsCisgIDU5MCwgMTA0LAorICAzNCwgMTE2LAorICA3NTYsIDI3NiwKKyAgMjgyLCAxODEsCisgIDg3MSwgMjc1LAorICA4ODgsIDcxMiwKKyAgODcyLCAyNzksCisgIDY0NSwgMzI0LAorICA3MzAsIDUyNCwKKyAgNDMwLCAzMDIsCisgIDYwMSwgNDg2LAorICAxMTQsIDUyOSwKKyAgMzU5LCAzMTcsCisgIDMxMywgNDI2LAorICAzMywgNzMyLAorICA5NzAsIDIxMSwKKyAgNjU3LCA1ODIsCisgIDk0NSwgNTAxLAorICA0NTAsIDYzMCwKKyAgODIyLCA2OTcsCisgIDcwMiwgNjAwLAorICA5NTgsIDI4OSwKKyAgNzMyLCA5NiwKKyAgMjA1LCA2NjIsCisgIDY5NSwgNTMzLAorICAzNjksIDQzMywKKyAgODMsIDQ0NSwKKyAgMTc2LCAzMTUsCisgIDIzOSwgOTUsCisgIDg5NSwgNjgyLAorICA2MjgsIDExOCwKKyAgNzMwLCA3NDEsCisgIDc3OSwgNzM0LAorICA4MDQsIDMxNCwKKyAgNDY1LCA1NjcsCisgIDgxMCwgMTA2LAorICA4MSwgMjY4LAorICA5NjgsIDUxOCwKKyAgMjIsIDE1OSwKKyAgNzI2LCA1MDQsCisgIDM4LCAyNjksCisgIDc1MSwgNjQ5LAorICA5NTQsIDY1OSwKK307CitzdGQ6OmFycmF5PGludDMyX3QsIDIwMDA+IGV4cENvb3JkcyA9IHsKKyAgMTkwLCA0NjQsCisgIDQzNywgNTg4LAorICA3NzQsIDIwMywKKyAgMjc2LCA1OTksCisgIDkzOSwgNjQ2LAorICAzNTYsIDM3MywKKyAgNjgxLCA1MzMsCisgIDM2OSwgNDE5LAorICA1MDAsIDcsCisgIDc2NSwgNjU1LAorICAzNjMsIDQ2MCwKKyAgNzUsIDI3MiwKKyAgOTIwLCA0ODQsCisgIDM5NywgNTkwLAorICAzMTUsIDQyNCwKKyAgODYxLCAzMjYsCisgIDc5NSwgMTA3LAorICA3MDEsIDUyNiwKKyAgMjIwLCA2ODgsCisgIDQ0MiwgNjc4LAorICA1OSwgMTM0LAorICA1MCwgNTAxLAorICA1OTMsIDM5OCwKKyAgNDQsIDQxNywKKyAgMzI3LCAzNzUsCisgIDExMSwgNDUyLAorICA1NjIsIDMsCisgIDYxNCwgNjgwLAorICA3ODAsIDczNCwKKyAgOTQxLCA1ODYsCisgIDI4NCwgNDY3LAorICA0NzYsIDE0MiwKKyAgMzc5LCAzNiwKKyAgNDUxLCA3MzEsCisgIDEyMiwgODUsCisgIDczNSwgNDM5LAorICA0NjksIDc2LAorICAyMzEsIDY3MCwKKyAgNDE1LCA0MDAsCisgIDgsIDIyMSwKKyAgNDM1LCA0NTgsCisgIDkwNiwgNDY2LAorICA3MDEsIDExMSwKKyAgNzQxLCA2MTksCisgIDYzMiwgMzI3LAorICAxNTEsIDQyMywKKyAgNTI3LCA3MDksCisgIDQ3OSwgMzc1LAorICA1MzUsIDYxMiwKKyAgNTksIDQ5OCwKKyAgNzYyLCA1MjksCisgIDc5MSwgNDE3LAorICA5NDgsIDExMywKKyAgMzEsIDQ0MSwKKyAgMTE5LCA3MDUsCisgIDMyMywgMTQxLAorICA0NTcsIDY4NywKKyAgODY5LCAxODksCisgIDM0NiwgMTMyLAorICA4OTAsIDUyNSwKKyAgNzIxLCA2NzAsCisgIDc3NSwgNDQ4LAorICAyODgsIDEwOCwKKyAgMzM0LCA0OTIsCisgIDc0LCAzOCwKKyAgMzIyLCA0NDEsCisgIDg0NSwgMjE1LAorICAxNzEsIDk2LAorICA5NzUsIDEzNywKKyAgMzE2LCA0MjUsCisgIDE3LCA2NjUsCisgIDk2MSwgNDE0LAorICA4MywgMjQ1LAorICA3MjMsIDEwNSwKKyAgNTUxLCAyMDEsCisgIDk1OCwgNDk1LAorICAyNTMsIDc3LAorICA3NzAsIDU4MywKKyAgNzU0LCA2NzksCisgIDY1NywgNDI1LAorICAyMDEsIDUyMSwKKyAgOTM0LCA2NTcsCisgIDk3MywgNjA1LAorICA1NDQsIDMzNiwKKyAgODc1LCA3MTcsCisgIDU5MiwgMjcyLAorICAzMjMsIDY1MCwKKyAgMjE1LCA1NDksCisgIDM2NSwgNjAwLAorICA3NzcsIDUyNCwKKyAgNjIxLCAzNjksCisgIDgzMiwgNTMxLAorICA0NDAsIDE5LAorICAzNjIsIDU0NywKKyAgNDc0LCAyNTUsCisgIDYzNywgOTIsCisgIDE3MSwgNTQ5LAorICAxMjYsIDI3MywKKyAgNjAxLCA3NCwKKyAgNzkyLCA3MDEsCisgIDk1OSwgNjQ5LAorICA2MjQsIDY5MiwKKyAgNzIxLCA1MzUsCisgIDQyLCAzMjUsCisgIDI4MCwgMjQ3LAorICA4NiwgNTY1LAorICA1MDgsIDQ5NCwKKyAgNjI5LCAyNzYsCisgIDQ0NSwgMzA5LAorICA0NzksIDczMiwKKyAgMzcwLCA1LAorICA5MDUsIDY0NSwKKyAgMzUwLCA0NzEsCisgIDM1NSwgMTU1LAorICAyMjEsIDMxMSwKKyAgNzMsIDQ4NCwKKyAgNzQ4LCA2OTIsCisgIDM3NCwgMjE4LAorICAzNzEsIDYxOCwKKyAgODkxLCAzMTksCisgIDYsIDI5LAorICAxNDEsIDQ0NSwKKyAgMTA1LCAyMTgsCisgIDYwLCA0NjEsCisgIDI4LCA2MzMsCisgIDMwNiwgNTY3LAorICA1NjAsIDI1LAorICA1NjQsIDQ5MywKKyAgMTg0LCA1OTUsCisgIDYxMSwgNDE1LAorICA2MjgsIDUxMywKKyAgMjQwLCA1ODcsCisgIDg0NywgNTQxLAorICA2OTAsIDM1MywKKyAgODQ4LCA0OTUsCisgIDMzMSwgMzg2LAorICAzOTEsIDE5LAorICA1NzUsIDYzNSwKKyAgOTM2LCA1MDcsCisgIDc2LCAzMDMsCisgIDQyLCAxMjYsCisgIDU2MywgMTI2LAorICA1NjUsIDM4NCwKKyAgODU4LCA1MzYsCisgIDg5MiwgMjA5LAorICAyNTUsIDUyMiwKKyAgODg0LCA3MjQsCisgIDYzOSwgMjQ1LAorICA2MDQsIDYxNCwKKyAgNjI0LCA4NiwKKyAgMjg3LCA3MzQsCisgIDQzMCwgNDI5LAorICA1MjUsIDE0NSwKKyAgMTY0LCAzNzIsCisgIDk3NCwgMjk1LAorICA3MTAsIDEzMCwKKyAgNzAsIDExNCwKKyAgMTU5LCAyMDgsCisgIDUzNSwgNTc4LAorICA4NzEsIDQ3NSwKKyAgODQ0LCA0NDYsCisgIDY5MSwgNDAxLAorICA4NzYsIDQzLAorICA3NzcsIDEwOCwKKyAgNTksIDQxLAorICA1MiwgMzgyLAorICA0MDQsIDc0NCwKKyAgMTA3LCAyNDEsCisgIDk4MCwgMzAwLAorICA4NzQsIDQyNCwKKyAgOTM1LCA2NTQsCisgIDc3MSwgMjQsCisgIDk0OCwgMzg3LAorICAyMDksIDY1MiwKKyAgMjIyLCA5OSwKKyAgNzE4LCA3MjIsCisgIDUzNCwgMzMxLAorICAyNSwgNDQ5LAorICA5NDMsIDcxMSwKKyAgOTE2LCAxNDAsCisgIDYyMSwgMzA3LAorICAzNjAsIDIzLAorICA4NTksIDUwMSwKKyAgOTIsIDY1OCwKKyAgNzc3LCAyMzYsCisgIDgxMiwgMzc5LAorICAyMiwgMzIxLAorICA0NDQsIDE3NSwKKyAgODIyLCA1NTQsCisgIDU4NSwgMzY4LAorICA0ODYsIDE5NywKKyAgNjA0LCA1NjQsCisgIDI2OCwgMzg5LAorICAxMDAsIDUzMSwKKyAgODc1LCA0MjMsCisgIDk3NSwgMTM3LAorICAxNCwgMzM4LAorICA5MTUsIDYyNiwKKyAgNDcyLCA2NzMsCisgIDIyMywgMjI0LAorICA3MTEsIDU0MSwKKyAgMTksIDIxMCwKKyAgNTc4LCA2OTQsCisgIDMzNiwgODUsCisgIDUxNSwgNTIzLAorICAyOTgsIDY0MywKKyAgODkyLCA1NzAsCisgIDI2MywgNjk4LAorICA5MjMsIDU1MiwKKyAgODk4LCAxNzgsCisgIDQ5MywgNjA2LAorICA5NDAsIDQ3NCwKKyAgODk4LCA1MTUsCisgIDQ3LCA2MTgsCisgIDM2OSwgNjk4LAorICA0ODEsIDg5LAorICA5NDUsIDE4LAorICA2NzMsIDEwMywKKyAgMTU1LCA0ODQsCisgIDk2NCwgNTE2LAorICA3NTcsIDMxNywKKyAgMTM2LCAxNTgsCisgIDc1NywgNDEsCisgIDQ4OCwgMTMxLAorICA2MjksIDQxMiwKKyAgNTY2LCA2MTEsCisgIDkyNCwgMTQ2LAorICA3MDksIDUyMSwKKyAgMjU5LCA2ODIsCisgIDUzMSwgNDE3LAorICAzMjAsIDI1MCwKKyAgMzMzLCA3MjksCisgIDIwMiwgNDk4LAorICA1NzEsIDM1LAorICA1NDAsIDE1MiwKKyAgOTUsIDY0NSwKKyAgMzYsIDcxNSwKKyAgMzI1LCAzMDQsCisgIDEzNCwgOTEsCisgIDQxMiwgNDYyLAorICAxMzcsIDcyMiwKKyAgMTgxLCA1NjcsCisgIDQ4MSwgNTc1LAorICAzMDAsIDcsCisgIDQ2MiwgNTI2LAorICA2OCwgNDk3LAorICAzNDQsIDQ0MiwKKyAgMjI3LCAxOTYsCisgIDkxNywgNjExLAorICAxNDUsIDQ4MiwKKyAgODcyLCA1NTEsCisgIDUxMywgOTcsCisgIDQ0LCA2MTgsCisgIDExNiwgMzg5LAorICA4NjEsIDMyLAorICA2OTAsIDM1NiwKKyAgMTY4LCA0MywKKyAgMzMsIDE3NywKKyAgMTExLCAyOTksCisgIDQ5LCA2ODUsCisgIDkyMCwgNjAwLAorICAxODcsIDQzOCwKKyAgODg3LCA3MTMsCisgIDY3LCAyMzQsCisgIDY5NCwgNDc5LAorICA2MzAsIDYxOSwKKyAgNzEwLCAyNTAsCisgIDE2OCwgNTcwLAorICAzNTYsIDYyLAorICA3MjQsIDY1NSwKKyAgNDIsIDEyNywKKyAgNDE4LCAyNTIsCisgIDQ1LCA4MSwKKyAgNDM2LCA0OSwKKyAgODA3LCA2NDMsCisgIDEzMCwgMTQwLAorICA0MzcsIDcyMywKKyAgNzY3LCA5OCwKKyAgOTEyLCA2MTIsCisgIDM5MCwgMTAxLAorICA1MywgNjYsCisgIDg3NSwgMTI4LAorICAzNjEsIDQ4OSwKKyAgNjAzLCAyOTQsCisgIDM3MSwgNDMsCisgIDQyNywgNTM4LAorICA3NjMsIDE0NCwKKyAgODUwLCAyNCwKKyAgODkxLCAxNzgsCisgIDEyNiwgMjM0LAorICA4MzgsIDYxOCwKKyAgMzQzLCAxNzUsCisgIDUzNCwgMjAwLAorICAzNiwgNDY2LAorICA1MTcsIDI4LAorICA3NDksIDczMiwKKyAgNzk2LCAyNTYsCisgIDMzMywgMjYwLAorICA0NDEsIDQzMywKKyAgNjE1LCAxMjksCisgIDg1NSwgNTI4LAorICAxNzIsIDYzNiwKKyAgMjIsIDQ3NiwKKyAgMTYwLCAxODksCisgIDMzOSwgMCwKKyAgNDM4LCA1OTYsCisgIDY3MywgNDA3LAorICA1NjEsIDgsCisgIDYwNSwgNzM1LAorICAyMjMsIDQzOCwKKyAgODI2LCA1ODksCisgIDMyNywgMjY0LAorICA5NDUsIDE2OSwKKyAgMjA5LCAxMTEsCisgIDQ5NCwgMTkyLAorICA1NTIsIDUxLAorICAzNzcsIDM0MywKKyAgNzczLCA1MzcsCisgIDIyOSwgMTQsCisgIDI1NSwgMzA0LAorICAxMCwgMzQ5LAorICA4NDAsIDY4MywKKyAgMjM0LCA3MzYsCisgIDcsIDI0NywKKyAgNzgyLCA3MywKKyAgNDQxLCAyODIsCisgIDgyNCwgNTMwLAorICAzNTIsIDE0LAorICA2OTEsIDMxNCwKKyAgODUwLCA0MjksCisgIDkyMywgNjUwLAorICA0NTUsIDgsCisgIDY4LCAyMzYsCisgIDU5MSwgNDU2LAorICA1MTAsIDEwNCwKKyAgODY2LCA1NDksCisgIDM3MywgNjE5LAorICA5MCwgNDUsCisgIDUwNCwgNjk2LAorICAxNDcsIDQyNCwKKyAgNTksIDEyMiwKKyAgNzUsIDY3MSwKKyAgNDQ1LCA3NSwKKyAgNjY0LCAzNzUsCisgIDQwOCwgNTQ0LAorICAxNzAsIDI4NCwKKyAgMjY1LCAyMjcsCisgIDE3NSwgMzU4LAorICA2MjUsIDQyLAorICAxOTQsIDIwNSwKKyAgNzA0LCAyNDQsCisgIDQyNCwgNTI3LAorICAxNTcsIDMyNiwKKyAgNjI2LCA2ODksCisgIDM1NiwgNjEyLAorICA2MzgsIDUzNSwKKyAgNzMxLCA3MjAsCisgIDI0NCwgMjcsCisgIDI0NSwgMjksCisgIDcwMSwgNjIzLAorICA5MjIsIDM1MiwKKyAgNTExLCAxOTQsCisgIDEwMSwgNTk0LAorICAxNDQsIDYwMCwKKyAgODcwLCAzNzMsCisgIDkwMywgMzA4LAorICAxOTksIDQ4MCwKKyAgMzk4LCA0NTksCisgIDQzNiwgNDQzLAorICA5MzgsIDQxMiwKKyAgODkxLCAxMDUsCisgIDQsIDQ1NCwKKyAgNTQwLCA1ODQsCisgIDgxMCwgNzA2LAorICA2MDgsIDIxNSwKKyAgODIwLCAyODEsCisgIDYwOCwgNDY0LAorICA0MzksIDE0NSwKKyAgNDQzLCA2OTAsCisgIDY2NywgNjAsCisgIDU3MCwgODcsCisgIDk3NCwgNzMxLAorICA2OTIsIDI3OSwKKyAgNDAxLCA2OTAsCisgIDI0MywgNDk2LAorICA0NzgsIDIyLAorICAxMTQsIDY2NCwKKyAgODc4LCA2NzYsCisgIDMwNSwgMjE5LAorICA2NTgsIDQ0NSwKKyAgOTY3LCA0NTcsCisgIDE1NiwgNjE5LAorICA4MDcsIDcwLAorICA4NzMsIDE2LAorICA4NTEsIDY2NiwKKyAgODQyLCA0ODYsCisgIDMyNywgNDA3LAorICAyMzgsIDY0OSwKKyAgMTc0LCAyNzMsCisgIDc1NSwgMjI4LAorICA2MTQsIDE2MSwKKyAgODYzLCA0ODIsCisgIDQ3MSwgMTcxLAorICA4MjQsIDc0LAorICAyMDMsIDE3MiwKKyAgNTk1LCA0NzAsCisgIDk2NCwgMTM1LAorICA3OTIsIDExNiwKKyAgMzYxLCA3MTIsCisgIDEyOCwgMjAwLAorICA3OTksIDcxNSwKKyAgOTIsIDQzNCwKKyAgNDA1LCA2NzEsCisgIDg0LCAxMzEsCisgIDUwLCAyMjEsCisgIDE4OSwgMywKKyAgMTI2LCA4MCwKKyAgNzI2LCAxNzgsCisgIDg5MSwgMjQ2LAorICA4NjUsIDE3OCwKKyAgMzc3LCA0MDUsCisgIDUxNCwgMzA4LAorICAzODYsIDI1MiwKKyAgNDAxLCAzNDAsCisgIDM4MSwgNDkyLAorICA4NzIsIDQyNywKKyAgNDI2LCAxODksCisgIDg1NSwgMTMwLAorICA1NzgsIDU0NCwKKyAgNzI3LCAzMDEsCisgIDExOSwgNTY4LAorICA1MzIsIDU0MCwKKyAgNTk2LCAzMTUsCisgIDkxNCwgNzMxLAorICA1NDYsIDU0NiwKKyAgMzMsIDYzOSwKKyAgOTgxLCAyNDQsCisgIDg0MiwgNDU2LAorICA0NDAsIDM5NCwKKyAgNzc0LCAxODcsCisgIDQ2MiwgNjMzLAorICA2NzYsIDI3MywKKyAgMTM1LCAyOTgsCisgIDkxOCwgNTAwLAorICA0MTgsIDQyNSwKKyAgNTAsIDczNCwKKyAgNjE3LCA1ODIsCisgIDkxOSwgMjU2LAorICA4MDIsIDY0OCwKKyAgNjY0LCA0NDAsCisgIDg4NCwgMzM1LAorICAyNDQsIDYwNywKKyAgNjk1LCAzMDYsCisgIDE0LCA3MDQsCisgIDYwMSwgMiwKKyAgNDk3LCA0NDcsCisgIDI5OCwgMzQ0LAorICA0OTQsIDQzOCwKKyAgODU4LCA2MTgsCisgIDc3NCwgNDEwLAorICA2MTIsIDU0OSwKKyAgNTY1LCA1ODAsCisgIDk2NywgNTgzLAorICA2MTIsIDExNSwKKyAgNDc1LCAyMDksCisgIDE1NCwgNTc4LAorICA1OSwgNTYsCisgIDY2MywgMzkxLAorICA0NDQsIDIyNywKKyAgMTgsIDIxNiwKKyAgMjY1LCAyMywKKyAgNzk5LCAyNDksCisgIDg3OSwgNjAxLAorICA5NDMsIDcwNCwKKyAgNTkwLCAyMzEsCisgIDkwMywgNDEsCisgIDIyMywgMjY4LAorICA0MTIsIDcwNCwKKyAgNTc3LCAxMzcsCisgIDU5NCwgNjk2LAorICAxMzksIDcyNywKKyAgMTU1LCA2MTEsCisgIDY3NSwgMzAyLAorICAyMTcsIDU3NywKKyAgODQwLCAzOTYsCisgIDQwNiwgOSwKKyAgMTUwLCA1OTksCisgIDQxNywgMjUxLAorICAyOTYsIDUzNywKKyAgOTgwLCA0MTAsCisgIDg3OCwgMTI4LAorICA4NzMsIDUyMywKKyAgNDIyLCA2NDUsCisgIDIzNCwgNDIwLAorICAyNywgMjgxLAorICAzNTgsIDY0LAorICA0NSwgMjUyLAorICAzNTYsIDc0MCwKKyAgOTI5LCAxMDEsCisgIDUxNywgMzU2LAorICA0MDEsIDY5NCwKKyAgNTE0LCA2MDYsCisgIDg3MCwgNTY3LAorICA0NjIsIDUxLAorICA0NjgsIDE0NiwKKyAgMjA2LCAxMjksCisgIDM1NCwgNjgwLAorICA0MzEsIDEyOSwKKyAgNzQ1LCAzNywKKyAgODMsIDI1LAorICA0NjQsIDQ1MSwKKyAgMTgwLCAzODYsCisgIDcwNSwgNjg3LAorICA1MjgsIDcyMywKKyAgNTQ0LCAxLAorICA0NzEsIDM5MCwKKyAgMTUyLCA0ODcsCisgIDEyOSwgMzM3LAorICA5NjQsIDEwMywKKyAgNjEsIDQ3LAorICA5OSwgNjA5LAorICA2MjcsIDU4NSwKKyAgODQsIDcxOCwKKyAgODczLCA0NjksCisgIDkxNywgMjk4LAorICA0ODgsIDUxMywKKyAgMjgwLCA1MDYsCisgIDQ5NCwgNTkyLAorICAyMTgsIDU1NywKKyAgNDUzLCAzMDQsCisgIDkwOCwgMTE1LAorICAxMjksIDI4MiwKKyAgNTQwLCA3MDQsCisgIDMyMCwgNjksCisgIDkzMCwgNjMzLAorICAyOCwgODUsCisgIDgyMSwgMTA0LAorICA1NjgsIDM1NywKKyAgMzA0LCAzOCwKKyAgOTE5LCA2NjcsCisgIDcxOSwgNDg5LAorICAzOTIsIDcyNSwKKyAgNzA5LCAzNjgsCisgIDMyMywgODEsCisgIDk1NiwgMjA2LAorICAxODUsIDE1NywKKyAgNzUzLCA3MDEsCisgIDUwMCwgNDk1LAorICAzNDUsIDkyLAorICA2NzksIDI5MiwKKyAgMjcsIDM3MSwKKyAgNTI2LCAxNjQsCisgIDMsIDMzMCwKKyAgNTAzLCA1NiwKKyAgODE1LCAxODAsCisgIDExLCAxNjQsCisgIDg4LCA2MTMsCisgIDcxMSwgMTgyLAorICA2MywgMzE2LAorICA3MDMsIDUzNiwKKyAgMTkzLCA1NTIsCisgIDk0MiwgMzg0LAorICA0MjcsIDEzLAorICA1MDYsIDUxMywKKyAgMTM4LCA1MDEsCisgIDQwLCAzMTksCisgIDg0NywgMzE1LAorICA4OCwgMzksCisgIDEwMiwgMzYwLAorICA2NzAsIDY2LAorICA4MjQsIDU3OCwKKyAgNjEsIDIzNywKKyAgMzc2LCAzNzQsCisgIDQ0OCwgMzQ4LAorICAxMDMsIDI3NiwKKyAgMjIsIDMzMiwKKyAgODgxLCA1NzYsCisgIDI0OSwgNTQ2LAorICAzMTMsIDM3MCwKKyAgNTEsIDQzMiwKKyAgMjgwLCAyMTYsCisgIDEzMCwgNjYzLAorICA0NTAsIDQ4NywKKyAgODAzLCAyMTEsCisgIDI3MSwgMjg2LAorICA0MjEsIDY5NiwKKyAgODU5LCAzMzIsCisgIDMxLCA3NywKKyAgMTk0LCAxNzQsCisgIDgxNCwgNjY1LAorICAyOSwgNDI1LAorICA4MDAsIDMxNCwKKyAgNTI0LCAyMTEsCisgIDY1NCwgNjUsCisgIDgxNCwgNjAwLAorICAxOTAsIDQ3NiwKKyAgODI2LCAzNTEsCisgIDU3NywgNzgsCisgIDQ2MiwgNjYyLAorICA0NjMsIDM0NywKKyAgMTk0LCAyNSwKKyAgNjE0LCA0MjIsCisgIDExMCwgNTUyLAorICAxODEsIDI1NywKKyAgNDc5LCA0ODEsCisgIDYxOSwgNTY5LAorICAyODQsIDM2NywKKyAgNjc5LCAzODEsCisgIDc2NCwgMjIzLAorICA1NDUsIDE4MCwKKyAgNDQzLCA2MDYsCisgIDEwMiwgMTY4LAorICA3ODYsIDQyMywKKyAgODE2LCA3MjEsCisgIDk0NCwgNjk5LAorICA1NDgsIDY2LAorICA3MzcsIDQyMiwKKyAgNzQyLCAzNDAsCisgIDE2MCwgNzM3LAorICA4NzcsIDU5NiwKKyAgNDA5LCAxNTUsCisgIDI5MywgNDY2LAorICAyNDgsIDU5NiwKKyAgMjAsIDM1NiwKKyAgNzMxLCA1MTAsCisgIDQyMCwgNTE4LAorICAzNjUsIDE3MCwKKyAgNzc5LCA1NDIsCisgIDcwMCwgMjMsCisgIDIzNywgMjc1LAorICA1NzgsIDYyLAorICAyMzMsIDYwNiwKKyAgNzQ3LCA1OTksCisgIDI5NCwgNTgzLAorICAyMjIsIDIxMywKKyAgODM5LCA1NTQsCisgIDMzMSwgNDI0LAorICA2OTQsIDY3LAorICA1OCwgNjQwLAorICA2MjcsIDY0OSwKKyAgOTEsIDY0MiwKKyAgNDksIDcwOCwKKyAgMjI3LCA1NjEsCisgIDM5OCwgMjk5LAorICAyNTEsIDM3OCwKKyAgMTgyLCAzOCwKKyAgMzY1LCA1MzgsCisgIDQ3MywgNjg4LAorICAxNzAsIDUzNSwKKyAgODU4LCA5OCwKKyAgOTU2LCA1NTgsCisgIDkwMSwgMzMsCisgIDI4NSwgNjE1LAorICAyNzIsIDM0LAorICAxNDYsIDksCisgIDc3OCwgMjYwLAorICA3NDMsIDQxLAorICA4MSwgNTg3LAorICAzNjgsIDc5LAorICA0MDQsIDQ4NywKKyAgNDM0LCAxNDcsCisgIDQ0MywgNTU1LAorICA5NiwgMzgwLAorICA4MzAsIDczNCwKKyAgNjI4LCAyMTIsCisgIDEyNiwgNywKKyAgMzM2LCAzNjEsCisgIDU0MywgMjQsCisgIDYyLCAxNSwKKyAgNTA2LCAxOTYsCisgIDQ0NSwgNzI1LAorICA3OTIsIDIxMiwKKyAgNTUzLCAxNDUsCisgIDc4MywgNjYsCisgIDgyOSwgMTgwLAorICA0MzMsIDMxOCwKKyAgMTA3LCA2NzQsCisgIDE1MiwgNjc0LAorICAxMiwgMTI3LAorICA4MzIsIDIzMiwKKyAgODM3LCA2NzUsCisgIDg4NSwgNjQyLAorICA4MzAsIDE5MCwKKyAgODM2LCA0NjEsCisgIDk2NywgNDUzLAorICA2NTAsIDQ4OSwKKyAgNTUwLCAxMzYsCisgIDk2MSwgNzYsCisgIDc0NSwgMzkyLAorICAyODgsIDE2NywKKyAgNTAyLCA2OTQsCisgIDU3MiwgNzM2LAorICA0MjgsIDMxMCwKKyAgNjI0LCA2NzYsCisgIDcwLCA0MDgsCisgIDE1NSwgNTM1LAorICAxMzUsIDAsCisgIDUzNCwgOSwKKyAgNTMyLCAzMSwKKyAgMTU1LCA2MjcsCisgIDc5MiwgMjI2LAorICAzOTcsIDMzNCwKKyAgMjMsIDQ1OCwKKyAgNzk4LCAxNzUsCisgIDM5OSwgMzY3LAorICA1MDAsIDI0NywKKyAgMTA2LCA0NzcsCisgIDE0OSwgMTQyLAorICA2MywgNjc3LAorICA4MjIsIDEyMCwKKyAgODU5LCAzNzksCisgIDEyNywgODAsCisgIDIyNCwgNjYzLAorICA0NDksIDUyMSwKKyAgMzg5LCA0NjUsCisgIDcxNCwgMzc0LAorICA3NTQsIDYyMCwKKyAgNTU4LCA0MDYsCisgIDU4NCwgMTYsCisgIDk2OSwgNTksCisgIDgwOSwgMTAzLAorICAxNTEsIDI2NSwKKyAgMjUxLCAxNjAsCisgIDU2MiwgMzU5LAorICA5MywgMzgyLAorICAxOTUsIDM1NywKKyAgMjc1LCAzLAorICA4NzgsIDI4MCwKKyAgNDE2LCA2NTYsCisgIDc1NiwgNDEwLAorICA4ODcsIDY4MCwKKyAgNDY0LCA0MjMsCisgIDMwLCAxMDIsCisgIDM5OSwgNjE4LAorICA0NTQsIDUxOSwKKyAgNjM2LCA0OTAsCisgIDc2MSwgMiwKKyAgMjk5LCA1MjAsCisgIDkwLCAzODgsCisgIDg3OCwgNzEwLAorICA3MDIsIDU3MSwKKyAgMzQyLCAxODQsCisgIDY2NCwgMTA5LAorICA0NjcsIDEyLAorICA3NTQsIDE1MywKKyAgODMxLCA1NzcsCisgIDE3OCwgNjU4LAorICA5MiwgMTQ3LAorICAzNzAsIDEyNiwKKyAgMzQ0LCA0MjQsCisgIDE1NywgNTc3LAorICAzNiwgNywKKyAgMzE4LCAzOTMsCisgIDYyNiwgNjU4LAorICA2MzcsIDE2LAorICA2OTEsIDY1OSwKKyAgNzQ3LCAxOTYsCisgIDUwNSwgODksCisgIDYwNywgNTE4LAorICA3NywgMjk5LAorICA1MTIsIDYwNCwKKyAgOTcsIDM1MCwKKyAgNTY2LCA0MDAsCisgIDE4MywgNDM4LAorICA3NzUsIDczOCwKKyAgNTQsIDMwLAorICA1MjcsIDQ1MSwKKyAgODQsIDUyOCwKKyAgMTE1LCAxNDMsCisgIDc3NSwgMzQwLAorICAzMDYsIDI3MiwKKyAgNzU4LCAxMzQsCisgIDEzNiwgMzcyLAorICAxNSwgMjU2LAorICAzMzUsIDM3NiwKKyAgNDkxLCAyNTksCisgIDIwMCwgMTE1LAorICA1NjAsIDMzMiwKKyAgODQzLCA2NzUsCisgIDg2MiwgNzEzLAorICAyMDIsIDU0MSwKKyAgNTcwLCA0MzYsCisgIDQ1NSwgNDM1LAorICA2OCwgMiwKKyAgNDY4LCA1OTEsCisgIDkwOSwgNTM1LAorICAxMjYsIDUzNSwKKyAgNjE0LCAyODgsCisgIDc3OCwgNzYsCisgIDQwMiwgNTU1LAorICAyMCwgNjg2LAorICA0NTgsIDQ4LAorICA4OTYsIDk1LAorICA4ODMsIDE1NCwKKyAgOTE5LCAzNzIsCisgIDM1OCwgMTE2LAorICA3MjEsIDYyMiwKKyAgMzE5LCA3MjgsCisgIDQ3MSwgNDIzLAorICAxNDUsIDcwLAorICA4OCwgNTU5LAorICA3MzksIDIzNSwKKyAgODM4LCAzOTksCisgIDgyNCwgMTM5LAorICAyNzQsIDQzNSwKKyAgOTEzLCA0NiwKKyAgODEwLCAxMjMsCisgIDQzOCwgMjcxLAorICA2OSwgNTg0LAorICA1MTAsIDEyOCwKKyAgNTE5LCA0NDIsCisgIDQ0MiwgMTAzLAorICA5NDcsIDMxMiwKKyAgMTMwLCA0ODUsCisgIDU4NSwgMTg4LAorICAyODcsIDYwMSwKKyAgNTYsIDIwNCwKKyAgOTIwLCA2MjAsCisgIDg5NywgNDQzLAorICA3NjksIDI1NywKKyAgMzgxLCAyODAsCisgIDQyNCwgNTI5LAorICAyNDIsIDEyOSwKKyAgMjE2LCA1NDEsCisgIDYyOSwgNTkzLAorICA3NzksIDEwOCwKKyAgODYsIDE4OCwKKyAgNjM5LCA0MjYsCisgIDg3NSwgNjc4LAorICAxNTEsIDg1LAorICAxMiwgMjA1LAorICAxMjEsIDM0MCwKKyAgMTg3LCAyLAorICA4NzksIDczNSwKKyAgNzk3LCAyNCwKKyAgNTM0LCA0NTYsCisgIDg0NCwgMzA2LAorICAyNjEsIDU2NCwKKyAgNzg0LCA1ODYsCisgIDkzNCwgMzAwLAorICA2NTcsIDM5MywKKyAgNDE3LCAzMDMsCisgIDM3MSwgNjMwLAorICA0NjksIDQzNywKKyAgMTY0LCA0MDcsCisgIDUzNywgMzc5LAorICA2NDIsIDQwNywKKyAgMzE4LCA1ODksCisgIDU2MywgMzA5LAorICAzMjgsIDY4NiwKKyAgOTEzLCAxNCwKKyAgOTMsIDk2LAorICA2MjUsIDE5NCwKKyAgNTgxLCA0MTUsCisgIDE5OSwgNDkwLAorICA5MzAsIDI2NywKKyAgMzIsIDM1MSwKKyAgNjcsIDM3MCwKKyAgNjg3LCA1NiwKKyAgMjI3LCAzNzAsCisgIDU0MSwgMzcwLAorICA3OTYsIDIyOSwKKyAgMTE0LCA0MTcsCisgIDc2NSwgMzI1LAorICA4NCwgNDQ0LAorICA4MzcsIDEzOCwKKyAgODk4LCA4MCwKKyAgMTI2LCAwLAorICA3ODAsIDQxOSwKKyAgNjU5LCAzOTAsCisgIDc4OSwgMTg3LAorICA1MjcsIDM5LAorICAxMzYsIDEwMiwKKyAgNjU5LCA3OCwKKyAgNzU0LCAzMzksCisgIDY5MiwgMjY2LAorICA3NjIsIDYwOCwKKyAgOTEzLCAxNTcsCisgIDU5NywgMjMsCisgIDI5MCwgMjcsCisgIDk2LCAyMjEsCisgIDYxLCA0MzMsCisgIDcyMCwgNTYxLAorICA2OTQsIDg0LAorICAyODQsIDE5MiwKKyAgNjgsIDAsCisgIDI2NywgMjEsCisgIDQ2NiwgNDA0LAorICAyMDIsIDE2NywKKyAgNjQ5LCAxMywKKyAgMjk3LCAzNTgsCisgIDUyMCwgNzE1LAorICA3NTUsIDU5OCwKKyAgMzI3LCAyNzksCisgIDY4NSwgNTI5LAorICAxMDksIDE5NiwKKyAgMzEsIDI5NiwKKyAgMTAsIDQ5NiwKKyAgODYwLCAyODAsCisgIDI3OSwgNzIsCisgIDgwMCwgMzYyLAorICA4NjUsIDExNiwKKyAgMjE5LCA1NDcsCisgIDY5LCA2MDUsCisgIDg0NywgMjYsCisgIDY2LCAzNTAsCisgIDIwMywgMTY1LAorICA0MzIsIDE3MCwKKyAgODE4LCA2NjEsCisgIDgwNCwgNzExLAorICA2NTksIDMzLAorICA4NjEsIDY5NywKKyAgOTUyLCA1NTUsCisgIDkxNywgNzAsCisgIDgyNiwgNTQ0LAorICA5NDQsIDkwLAorICAyNjAsIDE0NCwKKyAgMTQzLCAxOTgsCisgIDgzLCAxNDIsCisgIDkyNywgNzEzLAorICA1LCAxMzUsCisgIDkxNCwgNTEwLAorICA4MDMsIDczMiwKKyAgODEsIDQyNiwKKyAgODU3LCAxODQsCisgIDU5MCwgNzI2LAorICAxOTEsIDIxNSwKKyAgNDk1LCA0ODksCisgIDYwNSwgNTI5LAorICAzMTIsIDMzMiwKKyAgMjk5LCAzMjQsCisgIDU3LCA3MDUsCisgIDE3NiwgNTMsCisgIDkyMCwgNjE4LAorICA5NTMsIDYwOCwKKyAgMzUsIDQyMywKKyAgMTQ2LCA0MzIsCisgIDgzLCAzMzcsCisgIDg1MSwgMjQ0LAorICAzMzgsIDY4NCwKKyAgNjM0LCAxMjIsCisgIDg2MywgNzMsCisgIDU4OSwgNDczLAorICAzMzAsIDExNiwKKyAgNjM5LCAyODgsCisgIDgwOSwgMTcxLAorICA2NjQsIDQzMCwKKyAgODAsIDI4LAorICA4NDcsIDExMSwKKyAgMTAzLCA3NSwKKyAgMjkxLCAzOTUsCisgIDg1NCwgNjQ0LAorICAzNTMsIDY5LAorICA0MzgsIDcwNiwKKyAgNDEsIDIyOSwKKyAgNzc2LCA1OTIsCisgIDg0NSwgNDA1LAorICA1ODgsIDEwMSwKKyAgMzUsIDExMywKKyAgNzUyLCAyNzUsCisgIDI4MCwgMTc3LAorICA4NjMsIDI3NSwKKyAgODczLCA3MDEsCisgIDg2NCwgMjc5LAorICA2NDQsIDMyMywKKyAgNzI3LCA1MjIsCisgIDQyOSwgMzAwLAorICA2MDAsIDQ4NSwKKyAgMTE1LCA1MjUsCisgIDM1NywgMzE1LAorICAzMTIsIDQyNCwKKyAgNDIsIDcyMSwKKyAgOTU1LCAyMTIsCisgIDY1NSwgNTgwLAorICA5MzEsIDQ5NywKKyAgNDUwLCA2MjgsCisgIDgxMiwgNjg5LAorICA2OTgsIDU5NywKKyAgOTQ0LCAyODksCisgIDcyNywgOTUsCisgIDIwNywgNjU3LAorICA2OTIsIDUzMSwKKyAgMzY4LCA0MzIsCisgIDg0LCA0NDEsCisgIDE3NCwgMzEyLAorICAyMzcsIDkxLAorICA4ODEsIDY3MiwKKyAgNjI1LCAxMTYsCisgIDcyMywgNzMzLAorICA3NzAsIDcyNSwKKyAgNzk5LCAzMTMsCisgIDQ2NSwgNTY2LAorICA4MDMsIDEwNiwKKyAgODAsIDI2NCwKKyAgOTUyLCA1MTMsCisgIDIzLCAxNTUsCisgIDcyMywgNTAyLAorICAzOSwgMjY1LAorICA3NDUsIDY0NCwKKyAgOTM2LCA2NDksCit9OworfSAvLyBuYW1lc3BhY2Ugb3BlbkN2RGF0YQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvVGFnTW9uaXRvci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9UYWdNb25pdG9yLmNwcAppbmRleCBkZWM5N2Q3Li5jMGEzNTNmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9UYWdNb25pdG9yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9UYWdNb25pdG9yLmNwcApAQCAtMzMsNiArMzMsOCBAQAogICAgICAgICBtVmVuZG9yVGFnSWQoQ0FNRVJBX01FVEFEQVRBX0lOVkFMSURfVkVORE9SX0lEKQoge30KIAorY29uc3QgU3RyaW5nMTYgVGFnTW9uaXRvcjo6a01vbml0b3JPcHRpb24gPSBTdHJpbmcxNigiLW0iKTsKKwogY29uc3QgY2hhciogVGFnTW9uaXRvcjo6azNhVGFncyA9CiAgICAgICAgICJhbmRyb2lkLmNvbnRyb2wuYWVNb2RlLCBhbmRyb2lkLmNvbnRyb2wuYWZNb2RlLCBhbmRyb2lkLmNvbnRyb2wuYXdiTW9kZSwiCiAgICAgICAgICJhbmRyb2lkLmNvbnRyb2wuYWVTdGF0ZSwgYW5kcm9pZC5jb250cm9sLmFmU3RhdGUsIGFuZHJvaWQuY29udHJvbC5hd2JTdGF0ZSwiCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9UYWdNb25pdG9yLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9UYWdNb25pdG9yLmgKaW5kZXggNzE1NTMxNC4uMmRlY2U2MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvVGFnTW9uaXRvci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1RhZ01vbml0b3IuaApAQCAtMzgsNiArMzgsMTAgQEAKICAqIGJ1ZmZlciBsb2cgdGhhdCBjYW4gYmUgZHVtcGVkIGF0IHdpbGwuICovCiBjbGFzcyBUYWdNb25pdG9yIHsKICAgcHVibGljOgorCisgICAgLy8gTW9uaXRvciBhcmd1bWVudAorICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBrTW9uaXRvck9wdGlvbjsKKwogICAgIGVudW0gZXZlbnRTb3VyY2UgewogICAgICAgICBSRVFVRVNULAogICAgICAgICBSRVNVTFQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9BbmRyb2lkLm1rCmluZGV4IDllMjgxM2UuLjJlZWI3ZmEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvQW5kcm9pZC5tawpAQCAtNiwxMSArNiw2IEBACiAKIExPQ0FMX1NSQ19GSUxFUzo9IFwKICAgICBtYWluX21lZGlhbWV0cmljcy5jcHAgICAgICAgICAgICAgIFwKLSAgICBNZXRyaWNzU3VtbWFyaXplckNvZGVjLmNwcCAgICAgICAgIFwKLSAgICBNZXRyaWNzU3VtbWFyaXplckV4dHJhY3Rvci5jcHAgICAgIFwKLSAgICBNZXRyaWNzU3VtbWFyaXplclBsYXllci5jcHAgICAgICAgIFwKLSAgICBNZXRyaWNzU3VtbWFyaXplclJlY29yZGVyLmNwcCAgICAgIFwKLSAgICBNZXRyaWNzU3VtbWFyaXplci5jcHAgICAgICAgICAgICAgIFwKICAgICBNZWRpYUFuYWx5dGljc1NlcnZpY2UuY3BwCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5jcHAKaW5kZXggYzdmOTI3MC4uNGIwNTM5NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZWRpYUFuYWx5dGljc1NlcnZpY2UuY3BwCkBAIC03NCwyNiArNzQsMTEgQEAKIAogI2luY2x1ZGUgIk1lZGlhQW5hbHl0aWNzU2VydmljZS5oIgogCi0jaW5jbHVkZSAiTWV0cmljc1N1bW1hcml6ZXIuaCIKLSNpbmNsdWRlICJNZXRyaWNzU3VtbWFyaXplckNvZGVjLmgiCi0jaW5jbHVkZSAiTWV0cmljc1N1bW1hcml6ZXJFeHRyYWN0b3IuaCIKLSNpbmNsdWRlICJNZXRyaWNzU3VtbWFyaXplclBsYXllci5oIgotI2luY2x1ZGUgIk1ldHJpY3NTdW1tYXJpemVyUmVjb3JkZXIuaCIKLQotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKICAgICB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6YmFzZTsKICAgICB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6Y29udGVudDo6cG07CiAKLQotCi0vLyBzdW1tYXJpemVkIHJlY29yZHMKLS8vIHVwIHRvIDM2IHNldHMsIGVhY2ggY292ZXJpbmcgYW4gaG91ciAtLSBzbyBhdCBsZWFzdCAxLjUgZGF5cwotLy8gKHdpbGwgYmUgbG9uZ2VyIGlmIHRoZXJlIGFyZSBob3VycyB3aXRob3V0IGFueSBtZWRpYSBhY3Rpb24pCi1zdGF0aWMgY29uc3QgbnNlY3NfdCBrTmV3U2V0SW50ZXJ2YWxOcyA9IDM2MDAqKDEwMDAqMTAwMCoxMDAwbGwpOwotc3RhdGljIGNvbnN0IGludCBrTWF4UmVjb3JkU2V0cyA9IDM2OwotCiAvLyBpbmRpdmlkdWFsIHJlY29yZHMga2VwdCBpbiBtZW1vcnk6IGFnZSBvciBjb3VudAogLy8gYWdlOiA8PSAzNiBob3VycyAoMS41IGRheXMpCiAvLyBjb3VudDogaGFyZCBsaW1pdCBvZiAjIHJlY29yZHMKQEAgLTEwOCw2NiArOTMsMTMgQEAKICAgICAgICAgICAgIFN0cmluZzE2KGtTZXJ2aWNlTmFtZSksIG5ldyBNZWRpYUFuYWx5dGljc1NlcnZpY2UoKSk7CiB9CiAKLS8vIGhhbmRsZSBzZXRzIG9mIHN1bW1hcml6ZXJzCi1NZWRpYUFuYWx5dGljc1NlcnZpY2U6OlN1bW1hcml6ZXJTZXQ6OlN1bW1hcml6ZXJTZXQoKSB7Ci0gICAgbVN1bW1hcml6ZXJzID0gbmV3IExpc3Q8TWV0cmljc1N1bW1hcml6ZXIgKj4oKTsKLX0KLQotTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpTdW1tYXJpemVyU2V0Ojp+U3VtbWFyaXplclNldCgpIHsKLSAgICAvLyBlbXB0eSB0aGUgbGlzdAotICAgIExpc3Q8TWV0cmljc1N1bW1hcml6ZXIgKj4gKmwgPSBtU3VtbWFyaXplcnM7Ci0gICAgd2hpbGUgKGwtPnNpemUoKSA+IDApIHsKLSAgICAgICAgTWV0cmljc1N1bW1hcml6ZXIgKnN1bW1hcml6ZXIgPSAqKGwtPmJlZ2luKCkpOwotICAgICAgICBsLT5lcmFzZShsLT5iZWdpbigpKTsKLSAgICAgICAgZGVsZXRlIHN1bW1hcml6ZXI7Ci0gICAgfQotfQotCi12b2lkIE1lZGlhQW5hbHl0aWNzU2VydmljZTo6bmV3U3VtbWFyaXplclNldCgpIHsKLSAgICBBTE9HRCgiTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpuZXdTdW1tYXJpemVyU2V0Iik7Ci0gICAgTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpTdW1tYXJpemVyU2V0ICpzZXQgPSBuZXcgTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpTdW1tYXJpemVyU2V0KCk7Ci0gICAgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1JFQUxUSU1FKTsKLSAgICBzZXQtPnNldFN0YXJ0ZWQobm93KTsKLQotICAgIHNldC0+YXBwZW5kU3VtbWFyaXplcihuZXcgTWV0cmljc1N1bW1hcml6ZXJFeHRyYWN0b3IoImV4dHJhY3RvciIpKTsKLSAgICBzZXQtPmFwcGVuZFN1bW1hcml6ZXIobmV3IE1ldHJpY3NTdW1tYXJpemVyQ29kZWMoImNvZGVjIikpOwotICAgIHNldC0+YXBwZW5kU3VtbWFyaXplcihuZXcgTWV0cmljc1N1bW1hcml6ZXJQbGF5ZXIoIm51cGxheWVyIikpOwotICAgIHNldC0+YXBwZW5kU3VtbWFyaXplcihuZXcgTWV0cmljc1N1bW1hcml6ZXJSZWNvcmRlcigicmVjb3JkZXIiKSk7Ci0KLSAgICAvLyBBTFdBWVMgYXQgdGhlIGVuZCwgc2luY2UgaXQgY2F0Y2hlcyBldmVyeXRoaW5nCi0gICAgc2V0LT5hcHBlbmRTdW1tYXJpemVyKG5ldyBNZXRyaWNzU3VtbWFyaXplcihOVUxMKSk7Ci0KLSAgICAvLyBpbmplY3QgdGhpcyBzZXQgYXQgdGhlIEJBQ0sgb2YgdGhlIGxpc3QuCi0gICAgbVN1bW1hcml6ZXJTZXRzLT5wdXNoX2JhY2soc2V0KTsKLSAgICBtQ3VycmVudFNldCA9IHNldDsKLQotICAgIC8vIGxpbWl0IHRoZSAjIHRoYXQgd2UgaGF2ZQotICAgIGlmIChtTWF4UmVjb3JkU2V0cyA+IDApIHsKLSAgICAgICAgTGlzdDxTdW1tYXJpemVyU2V0ICo+ICpsID0gbVN1bW1hcml6ZXJTZXRzOwotICAgICAgICB3aGlsZSAobC0+c2l6ZSgpID4gKHNpemVfdCkgbU1heFJlY29yZFNldHMpIHsKLSAgICAgICAgICAgIEFMT0dEKCJEZWxldGluZyBvbGRlc3QgcmVjb3JkIHNldC4uLi4iKTsKLSAgICAgICAgICAgIE1lZGlhQW5hbHl0aWNzU2VydmljZTo6U3VtbWFyaXplclNldCAqb3NldCA9ICoobC0+YmVnaW4oKSk7Ci0gICAgICAgICAgICBsLT5lcmFzZShsLT5iZWdpbigpKTsKLSAgICAgICAgICAgIGRlbGV0ZSBvc2V0OwotICAgICAgICAgICAgbVNldHNEaXNjYXJkZWQrKzsKLSAgICAgICAgfQotICAgIH0KLX0KLQogTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpNZWRpYUFuYWx5dGljc1NlcnZpY2UoKQogICAgICAgICA6IG1NYXhSZWNvcmRzKGtNYXhSZWNvcmRzKSwKICAgICAgICAgICBtTWF4UmVjb3JkQWdlTnMoa01heFJlY29yZEFnZU5zKSwKLSAgICAgICAgICBtTWF4UmVjb3JkU2V0cyhrTWF4UmVjb3JkU2V0cyksCi0gICAgICAgICAgbU5ld1NldEludGVydmFsKGtOZXdTZXRJbnRlcnZhbE5zKSwKLSAgICAgICAgICBtRHVtcFByb3RvKE1lZGlhQW5hbHl0aWNzSXRlbTo6UFJPVE9fVjApIHsKKyAgICAgICAgICBtRHVtcFByb3RvKE1lZGlhQW5hbHl0aWNzSXRlbTo6UFJPVE9fVjEpLAorICAgICAgICAgIG1EdW1wUHJvdG9EZWZhdWx0KE1lZGlhQW5hbHl0aWNzSXRlbTo6UFJPVE9fVjEpIHsKIAogICAgIEFMT0dEKCJNZWRpYUFuYWx5dGljc1NlcnZpY2UgY3JlYXRlZCIpOwotICAgIC8vIGNsZWFyIG91ciBxdWV1ZXMKLSAgICBtT3BlbiA9IG5ldyBMaXN0PE1lZGlhQW5hbHl0aWNzSXRlbSAqPigpOwotICAgIG1GaW5hbGl6ZWQgPSBuZXcgTGlzdDxNZWRpYUFuYWx5dGljc0l0ZW0gKj4oKTsKLQotICAgIG1TdW1tYXJpemVyU2V0cyA9IG5ldyBMaXN0PE1lZGlhQW5hbHl0aWNzU2VydmljZTo6U3VtbWFyaXplclNldCAqPigpOwotICAgIG5ld1N1bW1hcml6ZXJTZXQoKTsKIAogICAgIG1JdGVtc1N1Ym1pdHRlZCA9IDA7CiAgICAgbUl0ZW1zRmluYWxpemVkID0gMDsKQEAgLTE4MywyOCArMTE1LDEzIEBACiBNZWRpYUFuYWx5dGljc1NlcnZpY2U6On5NZWRpYUFuYWx5dGljc1NlcnZpY2UoKSB7CiAgICAgICAgIEFMT0dEKCJNZWRpYUFuYWx5dGljc1NlcnZpY2UgZGVzdHJveWVkIik7CiAKLSAgICAvLyBjbGVhbiBvdXQgbU9wZW4gYW5kIG1GaW5hbGl6ZWQKLSAgICB3aGlsZSAobU9wZW4tPnNpemUoKSA+IDApIHsKLSAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtICogb2l0ZW0gPSAqKG1PcGVuLT5iZWdpbigpKTsKLSAgICAgICAgbU9wZW4tPmVyYXNlKG1PcGVuLT5iZWdpbigpKTsKKyAgICB3aGlsZSAobUl0ZW1zLnNpemUoKSA+IDApIHsKKyAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtICogb2l0ZW0gPSAqKG1JdGVtcy5iZWdpbigpKTsKKyAgICAgICAgbUl0ZW1zLmVyYXNlKG1JdGVtcy5iZWdpbigpKTsKICAgICAgICAgZGVsZXRlIG9pdGVtOwogICAgICAgICBtSXRlbXNEaXNjYXJkZWQrKzsKICAgICAgICAgbUl0ZW1zRGlzY2FyZGVkQ291bnQrKzsKICAgICB9Ci0gICAgZGVsZXRlIG1PcGVuOwotICAgIG1PcGVuID0gTlVMTDsKLQotICAgIHdoaWxlIChtRmluYWxpemVkLT5zaXplKCkgPiAwKSB7Ci0gICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAqIG9pdGVtID0gKihtRmluYWxpemVkLT5iZWdpbigpKTsKLSAgICAgICAgbUZpbmFsaXplZC0+ZXJhc2UobUZpbmFsaXplZC0+YmVnaW4oKSk7Ci0gICAgICAgIGRlbGV0ZSBvaXRlbTsKLSAgICAgICAgbUl0ZW1zRGlzY2FyZGVkKys7Ci0gICAgICAgIG1JdGVtc0Rpc2NhcmRlZENvdW50Kys7Ci0gICAgfQotICAgIGRlbGV0ZSBtRmluYWxpemVkOwotICAgIG1GaW5hbGl6ZWQgPSBOVUxMOwotCi0gICAgLy8gWFhYOiBjbGVhbiBvdXQgdGhlIHN1bW1hcmllcwogfQogCiAKQEAgLTIxNiw5ICsxMzMsMTQgQEAKIH0KIAogLy8gY2FsbGVyIHN1cnJlbmRlcnMgb3duZXJzaGlwIG9mICdpdGVtJwotTWVkaWFBbmFseXRpY3NJdGVtOjpTZXNzaW9uSURfdCBNZWRpYUFuYWx5dGljc1NlcnZpY2U6OnN1Ym1pdChNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0sIGJvb2wgZm9yY2VuZXcpIHsKK01lZGlhQW5hbHl0aWNzSXRlbTo6U2Vzc2lvbklEX3QgTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpzdWJtaXQoTWVkaWFBbmFseXRpY3NJdGVtICppdGVtLCBib29sIGZvcmNlbmV3KQoreworICAgIFVOVVNFRChmb3JjZW5ldyk7CiAKLSAgICBNZWRpYUFuYWx5dGljc0l0ZW06OlNlc3Npb25JRF90IGlkID0gTWVkaWFBbmFseXRpY3NJdGVtOjpTZXNzaW9uSURJbnZhbGlkOworICAgIC8vIGZpbGwgaW4gYSBzZXNzaW9uSUQgaWYgd2UgZG8gbm90IHlldCBoYXZlIG9uZQorICAgIGlmIChpdGVtLT5nZXRTZXNzaW9uSUQoKSA8PSBNZWRpYUFuYWx5dGljc0l0ZW06OlNlc3Npb25JRE5vbmUpIHsKKyAgICAgICAgaXRlbS0+c2V0U2Vzc2lvbklEKGdlbmVyYXRlVW5pcXVlU2Vzc2lvbklEKCkpOworICAgIH0KIAogICAgIC8vIHdlIGNvbnRyb2wgdGhlc2UsIGdlbmVyYWxseSBub3QgdHJ1c3RpbmcgdXNlciBpbnB1dAogICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9SRUFMVElNRSk7CkBAIC0yMzEsOSArMTUzLDcgQEAKICAgICBpbnQgdWlkX2dpdmVuID0gaXRlbS0+Z2V0VWlkKCk7CiAgICAgaW50IHBpZF9naXZlbiA9IGl0ZW0tPmdldFBpZCgpOwogCi0gICAgLy8gYWx0aG91Z2ggd2UgZG8gbWFrZSBleGNlcHRpb25zIGZvciBwYXJ0aWN1bGFyIGNsaWVudCB1aWRzCi0gICAgLy8gdGhhdCB3ZSBrbm93IHdlIHRydXN0LgotICAgIC8vCisgICAgLy8gYWx0aG91Z2ggd2UgZG8gbWFrZSBleGNlcHRpb25zIGZvciBzb21lIHRydXN0ZWQgY2xpZW50IHVpZHMKICAgICBib29sIGlzVHJ1c3RlZCA9IGZhbHNlOwogCiAgICAgQUxPR1YoImNhbGxlciBoYXMgdWlkPSVkLCBlbWJlZGRlZCB1aWQ9JWQiLCB1aWQsIHVpZF9naXZlbik7CkBAIC0yNTksNyArMTc5LDYgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAotCiAgICAgLy8gT3ZlcndyaXRlIHBhY2thZ2UgbmFtZSBhbmQgdmVyc2lvbiBpZiB0aGUgY2FsbGVyIHdhcyB1bnRydXN0ZWQuCiAgICAgaWYgKCFpc1RydXN0ZWQpIHsKICAgICAgIHNldFBrZ0luZm8oaXRlbSwgaXRlbS0+Z2V0VWlkKCksIHRydWUsIHRydWUpOwpAQCAtMjcxLDcgKzE5MCw3IEBACiAgICAgfQogCiAgICAgQUxPR1YoImdpdmVuIHVpZCAlZDsgc2FuaXRpemVkIHVpZDogJWQgc2FuaXRpemVkIHBrZzogJXMgIgotICAgICAgICAgICJzYW5pdGl6ZWQgcGtnIHZlcnNpb246ICVkIiwKKyAgICAgICAgICAic2FuaXRpemVkIHBrZyB2ZXJzaW9uOiAlIiAgUFJJZDY0LAogICAgICAgICAgIHVpZF9naXZlbiwgaXRlbS0+Z2V0VWlkKCksCiAgICAgICAgICAgaXRlbS0+Z2V0UGtnTmFtZSgpLmNfc3RyKCksCiAgICAgICAgICAgaXRlbS0+Z2V0UGtnVmVyc2lvbkNvZGUoKSk7CkBAIC0yODQsNzcgKzIwMywyMyBAQAogICAgICAgICByZXR1cm4gTWVkaWFBbmFseXRpY3NJdGVtOjpTZXNzaW9uSURJbnZhbGlkOwogICAgIH0KIAotCi0gICAgLy8gaWYgd2UgaGF2ZSBhIHNlc2lzb25pZCBpbiB0aGUgbmV3IHJlY29yZCwgbG9vayB0byBtYWtlCisgICAgLy8gWFhYOiBpZiB3ZSBoYXZlIGEgc2Vzc2lvbmlkIGluIHRoZSBuZXcgcmVjb3JkLCBsb29rIHRvIG1ha2UKICAgICAvLyBzdXJlIGl0IGRvZXNuJ3QgYXBwZWFyIGluIHRoZSBmaW5hbGl6ZWQgbGlzdC4KICAgICAvLyBYWFg6IHRoaXMgaXMgZm9yIHNlY3VyaXR5IC8gRE9TIHByZXZlbnRpb24uCiAgICAgLy8gbWF5IGFsc28gcmVxdWlyZSB0aGF0IHdlIHBlcnNpc3QgdGhlIHVuaXF1ZSBzZXNzaW9uSURzCiAgICAgLy8gYWNyb3NzIGJvb3RzIFtpbnN0ZWFkIG9mIHdpdGhpbiBhIHNpbmdsZSBib290XQogCi0KLSAgICAvLyBtYXRjaCB0aGlzIG5ldyByZWNvcmQgdXAgYWdhaW5zdCByZWNvcmRzIGluIHRoZSBvcGVuCi0gICAgLy8gbGlzdC4uLgotICAgIC8vIGlmIHRoZXJlJ3MgYSBtYXRjaCwgbWVyZ2UgdGhlbSB0b2dldGhlcgotICAgIC8vIGRlYWwgd2l0aCBtb3ZpbmcgdGhlIG9sZCAvIG1lcmdlZCByZWNvcmQgaW50byB0aGUgZmluYWxpemVkIHF1ZQotCi0gICAgYm9vbCBmaW5hbGl6aW5nID0gaXRlbS0+Z2V0RmluYWxpemVkKCk7Ci0KLSAgICAvLyBpZiBmaW5hbGl6aW5nLCB3ZSdsbCByZW1vdmUgaXQKLSAgICBNZWRpYUFuYWx5dGljc0l0ZW0gKm9pdGVtID0gZmluZEl0ZW0obU9wZW4sIGl0ZW0sIGZpbmFsaXppbmcgfCBmb3JjZW5ldyk7Ci0gICAgaWYgKG9pdGVtICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKGZvcmNlbmV3KSB7Ci0gICAgICAgICAgICAvLyBvbGQgb25lIGdldHMgZmluYWxpemVkLCB0aGVuIHdlIGluc2VydCB0aGUgbmV3IG9uZQotICAgICAgICAgICAgLy8gc28gd2UnbGwgaGF2ZSAyIHJlY29yZHMgYXQgdGhlIGVuZCBvZiB0aGlzLgotICAgICAgICAgICAgLy8gYnV0IGRvbid0IGZpbmFsaXplIGFuIGVtcHR5IHJlY29yZAotICAgICAgICAgICAgaWYgKG9pdGVtLT5jb3VudCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSdyZSByZXNwb25zaWJsZSBmb3IgZGlzcG9zaW5nIG9mIHRoZSBkZWFkIHJlY29yZAotICAgICAgICAgICAgICAgIGRlbGV0ZSBvaXRlbTsKLSAgICAgICAgICAgICAgICBvaXRlbSA9IE5VTEw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG9pdGVtLT5zZXRGaW5hbGl6ZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgc3VtbWFyaXplKG9pdGVtKTsKLSAgICAgICAgICAgICAgICBzYXZlSXRlbShtRmluYWxpemVkLCBvaXRlbSwgMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBuZXcgcmVjb3JkIGNvdWxkIGl0c2VsZiBiZSBtYXJrZWQgZmluYWxpemVkLi4uCi0gICAgICAgICAgICBpZiAoZmluYWxpemluZykgewotICAgICAgICAgICAgICAgIHN1bW1hcml6ZShpdGVtKTsKLSAgICAgICAgICAgICAgICBzYXZlSXRlbShtRmluYWxpemVkLCBpdGVtLCAwKTsKLSAgICAgICAgICAgICAgICBtSXRlbXNGaW5hbGl6ZWQrKzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2F2ZUl0ZW0obU9wZW4sIGl0ZW0sIDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWQgPSBpdGVtLT5nZXRTZXNzaW9uSUQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGNvbWJpbmUgdGhlIHJlY29yZHMsIHNlbmQgaXQgdG8gZmluYWxpemVkIGlmIGFwcHJvcHJpYXRlCi0gICAgICAgICAgICBvaXRlbS0+bWVyZ2UoaXRlbSk7Ci0gICAgICAgICAgICBpZiAoZmluYWxpemluZykgewotICAgICAgICAgICAgICAgIHN1bW1hcml6ZShvaXRlbSk7Ci0gICAgICAgICAgICAgICAgc2F2ZUl0ZW0obUZpbmFsaXplZCwgb2l0ZW0sIDApOwotICAgICAgICAgICAgICAgIG1JdGVtc0ZpbmFsaXplZCsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWQgPSBvaXRlbS0+Z2V0U2Vzc2lvbklEKCk7Ci0KLSAgICAgICAgICAgIC8vIHdlJ3JlIHJlc3BvbnNpYmxlIGZvciBkaXNwb3Npbmcgb2YgdGhlIGRlYWQgcmVjb3JkCi0gICAgICAgICAgICBkZWxldGUgaXRlbTsKLSAgICAgICAgICAgIGl0ZW0gPSBOVUxMOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gbm90aGluZyB0byBtZXJnZSwgc2F2ZSB0aGUgbmV3IHJlY29yZAotICAgICAgICBpZCA9IGl0ZW0tPmdldFNlc3Npb25JRCgpOwotICAgICAgICBpZiAoZmluYWxpemluZykgewotICAgICAgICAgICAgaWYgKGl0ZW0tPmNvdW50KCkgPT0gMCkgewotICAgICAgICAgICAgICAgIC8vIGRyb3AgZW1wdHkgcmVjb3JkcwotICAgICAgICAgICAgICAgIGRlbGV0ZSBpdGVtOwotICAgICAgICAgICAgICAgIGl0ZW0gPSBOVUxMOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdW1tYXJpemUoaXRlbSk7Ci0gICAgICAgICAgICAgICAgc2F2ZUl0ZW0obUZpbmFsaXplZCwgaXRlbSwgMCk7Ci0gICAgICAgICAgICAgICAgbUl0ZW1zRmluYWxpemVkKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzYXZlSXRlbShtT3BlbiwgaXRlbSwgMSk7Ci0gICAgICAgIH0KKyAgICBpZiAoaXRlbS0+Y291bnQoKSA9PSAwKSB7CisgICAgICAgIC8vIGRyb3AgZW1wdHkgcmVjb3JkcworICAgICAgICBkZWxldGUgaXRlbTsKKyAgICAgICAgaXRlbSA9IE5VTEw7CisgICAgICAgIHJldHVybiBNZWRpYUFuYWx5dGljc0l0ZW06OlNlc3Npb25JREludmFsaWQ7CiAgICAgfQorCisgICAgLy8gc2F2ZSB0aGUgbmV3IHJlY29yZAorICAgIE1lZGlhQW5hbHl0aWNzSXRlbTo6U2Vzc2lvbklEX3QgaWQgPSBpdGVtLT5nZXRTZXNzaW9uSUQoKTsKKyAgICBzYXZlSXRlbShpdGVtKTsKKyAgICBtSXRlbXNGaW5hbGl6ZWQrKzsKICAgICByZXR1cm4gaWQ7CiB9CiAKQEAgLTM3NiwyOSArMjQxLDI2IEBACiAgICAgfQogCiAgICAgLy8gY3JhY2sgYW55IHBhcmFtZXRlcnMKLSAgICBTdHJpbmcxNiBzdW1tYXJ5T3B0aW9uKCItc3VtbWFyeSIpOwotICAgIGJvb2wgc3VtbWFyeSA9IGZhbHNlOwogICAgIFN0cmluZzE2IHByb3RvT3B0aW9uKCItcHJvdG8iKTsKKyAgICBpbnQgY2hvc2VuUHJvdG8gPSBtRHVtcFByb3RvRGVmYXVsdDsKICAgICBTdHJpbmcxNiBjbGVhck9wdGlvbigiLWNsZWFyIik7CiAgICAgYm9vbCBjbGVhciA9IGZhbHNlOwogICAgIFN0cmluZzE2IHNpbmNlT3B0aW9uKCItc2luY2UiKTsKICAgICBuc2Vjc190IHRzX3NpbmNlID0gMDsKICAgICBTdHJpbmcxNiBoZWxwT3B0aW9uKCItaGVscCIpOwogICAgIFN0cmluZzE2IG9ubHlPcHRpb24oIi1vbmx5Iik7Ci0gICAgQVN0cmluZyBvbmx5OworICAgIHN0ZDo6c3RyaW5nIG9ubHk7CiAgICAgaW50IG4gPSBhcmdzLnNpemUoKTsKIAogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgIFN0cmluZzggbXlhcmcoYXJnc1tpXSk7CiAgICAgICAgIGlmIChhcmdzW2ldID09IGNsZWFyT3B0aW9uKSB7CiAgICAgICAgICAgICBjbGVhciA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXSA9PSBzdW1tYXJ5T3B0aW9uKSB7Ci0gICAgICAgICAgICBzdW1tYXJ5ID0gdHJ1ZTsKICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldID09IHByb3RvT3B0aW9uKSB7CiAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICBpZiAoaSA8IG4pIHsKICAgICAgICAgICAgICAgICBTdHJpbmc4IHZhbHVlKGFyZ3NbaV0pOwotICAgICAgICAgICAgICAgIGludCBwcm90byA9IE1lZGlhQW5hbHl0aWNzSXRlbTo6UFJPVE9fVjA7ICAgICAgIC8vIGRlZmF1bHQgdG8gb3JpZ2luYWwKKyAgICAgICAgICAgICAgICBpbnQgcHJvdG8gPSBNZWRpYUFuYWx5dGljc0l0ZW06OlBST1RPX1YwOwogICAgICAgICAgICAgICAgIGNoYXIgKmVuZHA7CiAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcCA9IHZhbHVlLnN0cmluZygpOwogICAgICAgICAgICAgICAgIHByb3RvID0gc3RydG9sKHAsICZlbmRwLCAxMCk7CkBAIC00MDgsOCArMjcwLDEyIEBACiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvdG8gPiBNZWRpYUFuYWx5dGljc0l0ZW06OlBST1RPX0xBU1QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvID0gTWVkaWFBbmFseXRpY3NJdGVtOjpQUk9UT19MQVNUOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1EdW1wUHJvdG8gPSBwcm90bzsKKyAgICAgICAgICAgICAgICAgICAgY2hvc2VuUHJvdG8gPSBwcm90bzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJ1bmFibGUgdG8gcGFyc2UgdmFsdWUgZm9yIC1wcm90b1xuXG4iKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIm1pc3NpbmcgdmFsdWUgZm9yIC1wcm90b1xuXG4iKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldID09IHNpbmNlT3B0aW9uKSB7CiAgICAgICAgICAgICBpKys7CkBAIC00MzUsOCArMzAxLDcgQEAKICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldID09IGhlbHBPcHRpb24pIHsKICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIlJlY29nbml6ZWQgcGFyYW1ldGVyczpcbiIpOwogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiLWhlbHAgICAgICAgIHRoaXMgaGVscCBtZXNzYWdlXG4iKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIi1wcm90byBYICAgICBkdW1wIHVzaW5nIHByb3RvY29sIFggKGRlZmF1bHRzIHRvIDEpIik7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCItc3VtbWFyeSAgICAgc2hvdyBzdW1tYXJ5IGluZm9cbiIpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiLXByb3RvICMgICAgIGR1bXAgdXNpbmcgcHJvdG9jb2wgIyIpOwogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiLWNsZWFyICAgICAgIGNsZWFycyBvdXQgc2F2ZWQgcmVjb3Jkc1xuIik7CiAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCItb25seSBYICAgICAgcHJvY2VzcyByZWNvcmRzIGZvciBjb21wb25lbnQgWFxuIik7CiAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCItc2luY2UgWCAgICAgaW5jbHVkZSByZWNvcmRzIHNpbmNlIFhcbiIpOwpAQCAtNDQ3LDYgKzMxMiw5IEBACiAgICAgfQogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAvLyBtdXRleCBiZXR3ZWVuIGluc2VydGlvbiBhbmQgZHVtcGluZyB0aGUgY29udGVudHMKKworICAgIG1EdW1wUHJvdG8gPSBjaG9zZW5Qcm90bzsKIAogICAgIC8vIHdlIEFMV0FZUyBkdW1wIHRoaXMgcGllY2UKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJEdW1wIG9mIHRoZSAlcyBwcm9jZXNzOlxuIiwga1NlcnZpY2VOYW1lKTsKQEAgLTQ1NCwxOSArMzIyLDE0IEBACiAKICAgICBkdW1wSGVhZGVycyhyZXN1bHQsIHRzX3NpbmNlKTsKIAotICAgIC8vIHdhbnQgZXhhY3RseSAxLCB0byBhdm9pZCBjb25mdXNpbmcgZm9sa3MgdGhhdCBwYXJzZSB0aGUgb3V0cHV0Ci0gICAgaWYgKHN1bW1hcnkpIHsKLSAgICAgICAgZHVtcFN1bW1hcmllcyhyZXN1bHQsIHRzX3NpbmNlLCBvbmx5LmNfc3RyKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGR1bXBSZWNlbnQocmVzdWx0LCB0c19zaW5jZSwgb25seS5jX3N0cigpKTsKLSAgICB9CisgICAgZHVtcFJlY2VudChyZXN1bHQsIHRzX3NpbmNlLCBvbmx5LmNfc3RyKCkpOwogCiAKICAgICBpZiAoY2xlYXIpIHsKICAgICAgICAgLy8gcmVtb3ZlIGV2ZXJ5dGhpbmcgZnJvbSB0aGUgZmluYWxpemVkIHF1ZXVlCi0gICAgICAgIHdoaWxlIChtRmluYWxpemVkLT5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0gKiBvaXRlbSA9ICoobUZpbmFsaXplZC0+YmVnaW4oKSk7Ci0gICAgICAgICAgICBtRmluYWxpemVkLT5lcmFzZShtRmluYWxpemVkLT5iZWdpbigpKTsKKyAgICAgICAgd2hpbGUgKG1JdGVtcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0gKiBvaXRlbSA9ICoobUl0ZW1zLmJlZ2luKCkpOworICAgICAgICAgICAgbUl0ZW1zLmVyYXNlKG1JdGVtcy5iZWdpbigpKTsKICAgICAgICAgICAgIGRlbGV0ZSBvaXRlbTsKICAgICAgICAgICAgIG1JdGVtc0Rpc2NhcmRlZCsrOwogICAgICAgICB9CkBAIC00ODAsNyArMzQzLDggQEAKIH0KIAogLy8gZHVtcCBoZWFkZXJzCi12b2lkIE1lZGlhQW5hbHl0aWNzU2VydmljZTo6ZHVtcEhlYWRlcnMoU3RyaW5nOCAmcmVzdWx0LCBuc2Vjc190IHRzX3NpbmNlKSB7Cit2b2lkIE1lZGlhQW5hbHl0aWNzU2VydmljZTo6ZHVtcEhlYWRlcnMoU3RyaW5nOCAmcmVzdWx0LCBuc2Vjc190IHRzX3NpbmNlKQorewogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gNTEyOwogICAgIGNoYXIgYnVmZmVyW1NJWkVdOwogCkBAIC00OTcsNyArMzYxLDcgQEAKIAogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwKICAgICAgICAgIlNpbmNlIEJvb3Q6IFN1Ym1pc3Npb25zOiAlOCIgUFJJZDY0Ci0gICAgICAgICAgICAiIEZpbmFsaXphdGlvbnM6ICU4IiBQUklkNjQgIlxuIiwKKyAgICAgICAgICAgICIgQWNjZXB0ZWQ6ICU4IiBQUklkNjQgIlxuIiwKICAgICAgICAgbUl0ZW1zU3VibWl0dGVkLCBtSXRlbXNGaW5hbGl6ZWQpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsCkBAIC01MDUsNTMgKzM2OSwxNyBAQAogICAgICAgICAgICAgIiAoYnkgQ291bnQ6ICUiIFBSSWQ2NCAiIGJ5IEV4cGlyYXRpb246ICUiIFBSSWQ2NCAiKVxuIiwKICAgICAgICAgIG1JdGVtc0Rpc2NhcmRlZCwgbUl0ZW1zRGlzY2FyZGVkQ291bnQsIG1JdGVtc0Rpc2NhcmRlZEV4cGlyZSk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwKLSAgICAgICAgIlN1bW1hcnkgU2V0cyBEaXNjYXJkZWQ6ICUiIFBSSWQ2NCAiXG4iLCBtU2V0c0Rpc2NhcmRlZCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIGlmICh0c19zaW5jZSAhPSAwKSB7CiAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwKLSAgICAgICAgICAgICJEdW1waW5nIFF1ZXVlIGVudHJpZXMgbW9yZSByZWNlbnQgdGhhbjogJSIgUFJJZDY0ICJcbiIsCisgICAgICAgICAgICAiRW1pdHRpbmcgUXVldWUgZW50cmllcyBtb3JlIHJlY2VudCB0aGFuOiAlIiBQUklkNjQgIlxuIiwKICAgICAgICAgICAgIChpbnQ2NF90KSB0c19zaW5jZSk7CiAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICB9CiB9CiAKLS8vIGR1bXAgc3VtbWFyeSBpbmZvCi12b2lkIE1lZGlhQW5hbHl0aWNzU2VydmljZTo6ZHVtcFN1bW1hcmllcyhTdHJpbmc4ICZyZXN1bHQsIG5zZWNzX3QgdHNfc2luY2UsIGNvbnN0IGNoYXIgKm9ubHkpIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDUxMjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBpbnQgc2xvdCA9IDA7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcblN1bW1hcml6ZWQgTWV0cmljczpcbiIpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQotICAgIGlmIChvbmx5ICE9IE5VTEwgJiYgKm9ubHkgPT0gJ1wwJykgewotICAgICAgICBvbmx5ID0gTlVMTDsKLSAgICB9Ci0KLSAgICAvLyBoYXZlIGVhY2ggb2YgdGhlIGRpc3RpbGxlcnMgZHVtcCByZWNvcmRzCi0gICAgaWYgKG1TdW1tYXJpemVyU2V0cyAhPSBOVUxMKSB7Ci0gICAgICAgIExpc3Q8U3VtbWFyaXplclNldCAqPjo6aXRlcmF0b3IgaXRTZXQgPSBtU3VtbWFyaXplclNldHMtPmJlZ2luKCk7Ci0gICAgICAgIGZvciAoOyBpdFNldCAhPSBtU3VtbWFyaXplclNldHMtPmVuZCgpOyBpdFNldCsrKSB7Ci0gICAgICAgICAgICBuc2Vjc190IHdoZW4gPSAoKml0U2V0KS0+Z2V0U3RhcnRlZCgpOwotICAgICAgICAgICAgaWYgKHdoZW4gPCB0c19zaW5jZSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTGlzdDxNZXRyaWNzU3VtbWFyaXplciAqPiAqbGlzdCA9ICgqaXRTZXQpLT5nZXRTdW1tYXJpemVycygpOwotICAgICAgICAgICAgTGlzdDxNZXRyaWNzU3VtbWFyaXplciAqPjo6aXRlcmF0b3IgaXQgPSBsaXN0LT5iZWdpbigpOwotICAgICAgICAgICAgZm9yICg7IGl0ICE9IGxpc3QtPmVuZCgpOyBpdCsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG9ubHkgIT0gTlVMTCAmJiBzdHJjbXAob25seSwgKCppdCktPmdldEtleSgpKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJUb2xkIHRvIG9taXQgJyVzJyIsICgqaXQpLT5nZXRLZXkoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFTdHJpbmcgZGlzdGlsbGVkID0gKCppdCktPmR1bXBTdW1tYXJ5KHNsb3QsIG9ubHkpOwotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoZGlzdGlsbGVkLmNfc3RyKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCiAvLyB0aGUgcmVjZW50LCBkZXRhaWxlZCBxdWV1ZXMKLXZvaWQgTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpkdW1wUmVjZW50KFN0cmluZzggJnJlc3VsdCwgbnNlY3NfdCB0c19zaW5jZSwgY29uc3QgY2hhciAqIG9ubHkpIHsKK3ZvaWQgTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpkdW1wUmVjZW50KFN0cmluZzggJnJlc3VsdCwgbnNlY3NfdCB0c19zaW5jZSwgY29uc3QgY2hhciAqIG9ubHkpCit7CiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSA1MTI7CiAgICAgY2hhciBidWZmZXJbU0laRV07CiAKQEAgLTU2MiwzMCArMzkwLDI3IEBACiAgICAgLy8gc2hvdyB0aGUgcmVjZW50bHkgcmVjb3JkZWQgcmVjb3JkcwogICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICJcbkZpbmFsaXplZCBNZXRyaWNzIChvbGRlc3QgZmlyc3QpOlxuIik7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHJlc3VsdC5hcHBlbmQodGhpcy0+ZHVtcFF1ZXVlKG1GaW5hbGl6ZWQsIHRzX3NpbmNlLCBvbmx5KSk7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiXG5Jbi1Qcm9ncmVzcyBNZXRyaWNzIChuZXdlc3QgZmlyc3QpOlxuIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHJlc3VsdC5hcHBlbmQodGhpcy0+ZHVtcFF1ZXVlKG1PcGVuLCB0c19zaW5jZSwgb25seSkpOworICAgIHJlc3VsdC5hcHBlbmQodGhpcy0+ZHVtcFF1ZXVlKHRzX3NpbmNlLCBvbmx5KSk7CiAKICAgICAvLyBzaG93IHdobyBpcyBjb25uZWN0ZWQgYW5kIGluamVjdGluZyByZWNvcmRzPwogICAgIC8vIHRhbGsgYWJvdXQgIyByZWNvcmRzIGZlZCB0byB0aGUgJ3JlYWRlcnMnCiAgICAgLy8gdGFsayBhYm91dCAjIHJlY29yZHMgd2UgZGlzY2FyZGVkLCBwZXJoYXBzICJkaXNjYXJkZWQgdy9vIHJlYWRpbmciIHRvbwogfQorCiAvLyBjYWxsZXIgaGFzIGxvY2tlZCBtTG9jay4uLgotU3RyaW5nOCBNZWRpYUFuYWx5dGljc1NlcnZpY2U6OmR1bXBRdWV1ZShMaXN0PE1lZGlhQW5hbHl0aWNzSXRlbSAqPiAqdGhlTGlzdCkgewotICAgIHJldHVybiBkdW1wUXVldWUodGhlTGlzdCwgKG5zZWNzX3QpIDAsIE5VTEwpOworU3RyaW5nOCBNZWRpYUFuYWx5dGljc1NlcnZpY2U6OmR1bXBRdWV1ZSgpIHsKKyAgICByZXR1cm4gZHVtcFF1ZXVlKChuc2Vjc190KSAwLCBOVUxMKTsKIH0KIAotU3RyaW5nOCBNZWRpYUFuYWx5dGljc1NlcnZpY2U6OmR1bXBRdWV1ZShMaXN0PE1lZGlhQW5hbHl0aWNzSXRlbSAqPiAqdGhlTGlzdCwgbnNlY3NfdCB0c19zaW5jZSwgY29uc3QgY2hhciAqIG9ubHkpIHsKK1N0cmluZzggTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpkdW1wUXVldWUobnNlY3NfdCB0c19zaW5jZSwgY29uc3QgY2hhciAqIG9ubHkpIHsKICAgICBTdHJpbmc4IHJlc3VsdDsKICAgICBpbnQgc2xvdCA9IDA7CiAKLSAgICBpZiAodGhlTGlzdC0+ZW1wdHkoKSkgeworICAgIGlmIChtSXRlbXMuZW1wdHkoKSkgewogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiZW1wdHlcbiIpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIExpc3Q8TWVkaWFBbmFseXRpY3NJdGVtICo+OjppdGVyYXRvciBpdCA9IHRoZUxpc3QtPmJlZ2luKCk7Ci0gICAgICAgIGZvciAoOyBpdCAhPSB0aGVMaXN0LT5lbmQoKTsgaXQrKykgeworICAgICAgICBMaXN0PE1lZGlhQW5hbHl0aWNzSXRlbSAqPjo6aXRlcmF0b3IgaXQgPSBtSXRlbXMuYmVnaW4oKTsKKyAgICAgICAgZm9yICg7IGl0ICE9IG1JdGVtcy5lbmQoKTsgaXQrKykgewogICAgICAgICAgICAgbnNlY3NfdCB3aGVuID0gKCppdCktPmdldFRpbWVzdGFtcCgpOwogICAgICAgICAgICAgaWYgKHdoZW4gPCB0c19zaW5jZSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtNTk1LDcgKzQyMCw3IEBACiAgICAgICAgICAgICAgICAgQUxPR1YoIk9taXQgJyVzJywgaXQncyBub3QgJyVzJyIsICgqaXQpLT5nZXRLZXkoKS5jX3N0cigpLCBvbmx5KTsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFTdHJpbmcgZW50cnkgPSAoKml0KS0+dG9TdHJpbmcobUR1bXBQcm90byk7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBlbnRyeSA9ICgqaXQpLT50b1N0cmluZyhtRHVtcFByb3RvKTsKICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiU1ZDogJXNcbiIsIHNsb3QsIGVudHJ5LmNfc3RyKCkpOwogICAgICAgICAgICAgc2xvdCsrOwogICAgICAgICB9CkBAIC02MDYsMjUgKzQzMSwyNSBAQAogCiAvLwogLy8gT3VyIENoZWFwIGluLWNvcmUsIG5vbi1wZXJzaXN0ZW50IHJlY29yZHMgbWFuYWdlbWVudC4KLS8vIFhYWDogcmV3cml0ZSB0aGlzIHRvIG1hbmFnZSBwZXJzaXN0ZW5jZSwgZXRjLgogCiAvLyBpbnNlcnQgYXBwcm9wcmlhdGVseSBpbnRvIHF1ZXVlCi12b2lkIE1lZGlhQW5hbHl0aWNzU2VydmljZTo6c2F2ZUl0ZW0oTGlzdDxNZWRpYUFuYWx5dGljc0l0ZW0gKj4gKmwsIE1lZGlhQW5hbHl0aWNzSXRlbSAqIGl0ZW0sIGludCBmcm9udCkgewordm9pZCBNZWRpYUFuYWx5dGljc1NlcnZpY2U6OnNhdmVJdGVtKE1lZGlhQW5hbHl0aWNzSXRlbSAqIGl0ZW0pCit7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIC8vIG11dGV4IGJldHdlZW4gaW5zZXJ0aW9uIGFuZCBkdW1waW5nIHRoZSBjb250ZW50cwogCi0gICAgLy8gYWRkaW5nIGF0IGJhY2sgb2YgcXVldWUgKGZpZm8gb3JkZXIpCi0gICAgaWYgKGZyb250KSAgewotICAgICAgICBsLT5wdXNoX2Zyb250KGl0ZW0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGwtPnB1c2hfYmFjayhpdGVtKTsKLSAgICB9CisgICAgLy8gd2Ugd2FudCB0byBkdW1wICdpbiBGSUZPIG9yZGVyJywgc28gaW5zZXJ0IGF0IHRoZSBlbmQKKyAgICBtSXRlbXMucHVzaF9iYWNrKGl0ZW0pOwogCiAgICAgLy8ga2VlcCByZW1vdmluZyBvbGQgcmVjb3JkcyB0aGUgZnJvbnQgdW50aWwgd2UncmUgaW4tYm91bmRzIChjb3VudCkKICAgICBpZiAobU1heFJlY29yZHMgPiAwKSB7Ci0gICAgICAgIHdoaWxlIChsLT5zaXplKCkgPiAoc2l6ZV90KSBtTWF4UmVjb3JkcykgewotICAgICAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtICogb2l0ZW0gPSAqKGwtPmJlZ2luKCkpOwotICAgICAgICAgICAgbC0+ZXJhc2UobC0+YmVnaW4oKSk7CisgICAgICAgIHdoaWxlIChtSXRlbXMuc2l6ZSgpID4gKHNpemVfdCkgbU1heFJlY29yZHMpIHsKKyAgICAgICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAqIG9pdGVtID0gKihtSXRlbXMuYmVnaW4oKSk7CisgICAgICAgICAgICBpZiAob2l0ZW0gPT0gaXRlbSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUl0ZW1zLmVyYXNlKG1JdGVtcy5iZWdpbigpKTsKICAgICAgICAgICAgIGRlbGV0ZSBvaXRlbTsKICAgICAgICAgICAgIG1JdGVtc0Rpc2NhcmRlZCsrOwogICAgICAgICAgICAgbUl0ZW1zRGlzY2FyZGVkQ291bnQrKzsKQEAgLTYzMiwxNyArNDU3LDIxIEBACiAgICAgfQogCiAgICAgLy8ga2VlcCByZW1vdmluZyBvbGQgcmVjb3JkcyB0aGUgZnJvbnQgdW50aWwgd2UncmUgaW4tYm91bmRzIChjb3VudCkKKyAgICAvLyBOQjogZXhwaXJlZCBlbnRyaWVzIGFyZW4ndCByZW1vdmVkIHVudGlsIHRoZSBuZXh0IGluc2VydGlvbiwgd2hpY2ggY291bGQgYmUgYSB3aGlsZQogICAgIGlmIChtTWF4UmVjb3JkQWdlTnMgPiAwKSB7CiAgICAgICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9SRUFMVElNRSk7Ci0gICAgICAgIHdoaWxlIChsLT5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0gKiBvaXRlbSA9ICoobC0+YmVnaW4oKSk7CisgICAgICAgIHdoaWxlIChtSXRlbXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtICogb2l0ZW0gPSAqKG1JdGVtcy5iZWdpbigpKTsKICAgICAgICAgICAgIG5zZWNzX3Qgd2hlbiA9IG9pdGVtLT5nZXRUaW1lc3RhbXAoKTsKKyAgICAgICAgICAgIGlmIChvaXRlbSA9PSBpdGVtKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBjYXJlZnVsIGFib3V0IHRpbWVqdW1wcyB0b28KICAgICAgICAgICAgIGlmICgobm93ID4gd2hlbikgJiYgKG5vdy13aGVuKSA8PSBtTWF4UmVjb3JkQWdlTnMpIHsKICAgICAgICAgICAgICAgICAvLyB0aGlzIChhbmQgdGhlIHJlc3QpIGFyZSByZWNlbnQgZW5vdWdoIHRvIGtlZXAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGwtPmVyYXNlKGwtPmJlZ2luKCkpOworICAgICAgICAgICAgbUl0ZW1zLmVyYXNlKG1JdGVtcy5iZWdpbigpKTsKICAgICAgICAgICAgIGRlbGV0ZSBvaXRlbTsKICAgICAgICAgICAgIG1JdGVtc0Rpc2NhcmRlZCsrOwogICAgICAgICAgICAgbUl0ZW1zRGlzY2FyZGVkRXhwaXJlKys7CkBAIC02NTAsODUgKzQ3OSwxNCBAQAogICAgIH0KIH0KIAotLy8gYXJlIHRoZXkgYWxpa2UgZW5vdWdoIHRoYXQgbml0ZW0gY2FuIGJlIGZvbGRlZCBpbnRvIG9pdGVtPwotc3RhdGljIGJvb2wgY29tcGF0aWJsZUl0ZW1zKE1lZGlhQW5hbHl0aWNzSXRlbSAqIG9pdGVtLCBNZWRpYUFuYWx5dGljc0l0ZW0gKiBuaXRlbSkgewotCi0gICAgLy8gZ2VuZXJhbCBzYWZldHkKLSAgICBpZiAobml0ZW0tPmdldFVpZCgpICE9IG9pdGVtLT5nZXRVaWQoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChuaXRlbS0+Z2V0UGlkKCkgIT0gb2l0ZW0tPmdldFBpZCgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBrZXkgLS0gbmVlZHMgdG8gbWF0Y2gKLSAgICBpZiAobml0ZW0tPmdldEtleSgpID09IG9pdGVtLT5nZXRLZXkoKSkgewotICAgICAgICAvLyBzdGlsbCBpbiB0aGUgZ2FtZS4KLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gc2Vzc2lvbiBpZCAtLSBlbXB0eSBmaWVsZCBpbiBuZXcgaXMgYWxsb3dlZAotICAgIE1lZGlhQW5hbHl0aWNzSXRlbTo6U2Vzc2lvbklEX3Qgb3Nlc3Npb24gPSBvaXRlbS0+Z2V0U2Vzc2lvbklEKCk7Ci0gICAgTWVkaWFBbmFseXRpY3NJdGVtOjpTZXNzaW9uSURfdCBuc2Vzc2lvbiA9IG5pdGVtLT5nZXRTZXNzaW9uSUQoKTsKLSAgICBpZiAobnNlc3Npb24gIT0gb3Nlc3Npb24pIHsKLSAgICAgICAgLy8gaW5jb21pbmcgJzAnIG1hdGNoZXMgdmFsdWUgaW4gb3Nlc3Npb24KLSAgICAgICAgaWYgKG5zZXNzaW9uICE9IDApIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi0vLyBmaW5kIHRoZSBpbmNvbXBsZXRlIHJlY29yZCB0aGF0IHRoaXMgd2lsbCBvdmVybGF5Ci1NZWRpYUFuYWx5dGljc0l0ZW0gKk1lZGlhQW5hbHl0aWNzU2VydmljZTo6ZmluZEl0ZW0oTGlzdDxNZWRpYUFuYWx5dGljc0l0ZW0qPiAqdGhlTGlzdCwgTWVkaWFBbmFseXRpY3NJdGVtICpuaXRlbSwgYm9vbCByZW1vdmVpdCkgewotICAgIGlmIChuaXRlbSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IE5VTEw7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotCi0gICAgZm9yIChMaXN0PE1lZGlhQW5hbHl0aWNzSXRlbSAqPjo6aXRlcmF0b3IgaXQgPSB0aGVMaXN0LT5iZWdpbigpOwotICAgICAgICBpdCAhPSB0aGVMaXN0LT5lbmQoKTsgaXQrKykgewotICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0gKnRtcCA9ICgqaXQpOwotCi0gICAgICAgIGlmICghY29tcGF0aWJsZUl0ZW1zKHRtcCwgbml0ZW0pKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHdlIG1hdGNoISB0aGlzIGlzIHRoZSBvbmUgSSB3YW50LgotICAgICAgICBpZiAocmVtb3ZlaXQpIHsKLSAgICAgICAgICAgIHRoZUxpc3QtPmVyYXNlKGl0KTsKLSAgICAgICAgfQotICAgICAgICBpdGVtID0gdG1wOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIGl0ZW07Ci19Ci0KLQotLy8gZGVsZXRlIHRoZSBpbmRpY2F0ZWQgcmVjb3JkCi12b2lkIE1lZGlhQW5hbHl0aWNzU2VydmljZTo6ZGVsZXRlSXRlbShMaXN0PE1lZGlhQW5hbHl0aWNzSXRlbSAqPiAqbCwgTWVkaWFBbmFseXRpY3NJdGVtICppdGVtKSB7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotCi0gICAgZm9yIChMaXN0PE1lZGlhQW5hbHl0aWNzSXRlbSAqPjo6aXRlcmF0b3IgaXQgPSBsLT5iZWdpbigpOwotICAgICAgICBpdCAhPSBsLT5lbmQoKTsgaXQrKykgewotICAgICAgICBpZiAoKCppdCktPmdldFNlc3Npb25JRCgpICE9IGl0ZW0tPmdldFNlc3Npb25JRCgpKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGRlbGV0ZSAqaXQ7Ci0gICAgICAgIGwtPmVyYXNlKGl0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi1zdGF0aWMgQVN0cmluZyBhbGxvd2VkS2V5c1tdID0KK3N0YXRpYyBzdGQ6OnN0cmluZyBhbGxvd2VkS2V5c1tdID0KIHsKKyAgICAiYXVkaW9wb2xpY3kiLAorICAgICJhdWRpb3JlY29yZCIsCisgICAgImF1ZGlvdHJhY2siLAogICAgICJjb2RlYyIsCi0gICAgImV4dHJhY3RvciIKKyAgICAiZXh0cmFjdG9yIiwKKyAgICAibnVwbGF5ZXIiLAogfTsKIAogc3RhdGljIGNvbnN0IGludCBuQWxsb3dlZEtleXMgPSBzaXplb2YoYWxsb3dlZEtleXMpIC8gc2l6ZW9mKGFsbG93ZWRLZXlzWzBdKTsKQEAgLTczOSw3ICs0OTcsNyBAQAogICAgIC8vIHVudHJ1c3RlZCB1aWRzIGNhbiBvbmx5IHNlbmQgdXMgYSBsaW1pdGVkIHNldCBvZiBrZXlzCiAgICAgaWYgKGlzVHJ1c3RlZCA9PSBmYWxzZSkgewogICAgICAgICAvLyByZXN0cmljdCB0byBhIHNwZWNpZmljIHNldCBvZiBrZXlzCi0gICAgICAgIEFTdHJpbmcga2V5ID0gaXRlbS0+Z2V0S2V5KCk7CisgICAgICAgIHN0ZDo6c3RyaW5nIGtleSA9IGl0ZW0tPmdldEtleSgpOwogCiAgICAgICAgIHNpemVfdCBpOwogICAgICAgICBmb3IoaSA9IDA7IGkgPCBuQWxsb3dlZEtleXM7IGkrKykgewpAQCAtNzY0LDUwICs1MjIsMTMgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLS8vIGluc2VydCBpbnRvIHRoZSBhcHByb3ByaWF0ZSBzdW1tYXJpemVyLgotLy8gd2UgbWFrZSBvdXIgb3duIGNvcHkgdG8gc2F2ZS9zdW1tYXJpemUKLXZvaWQgTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpzdW1tYXJpemUoTWVkaWFBbmFseXRpY3NJdGVtICppdGVtKSB7Ci0KLSAgICBBTE9HVigiTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpzdW1tYXJpemUoKSIpOwotCi0gICAgaWYgKGl0ZW0gPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1JFQUxUSU1FKTsKLSAgICBpZiAobUN1cnJlbnRTZXQgPT0gTlVMTAotICAgICAgICB8fCAobUN1cnJlbnRTZXQtPmdldFN0YXJ0ZWQoKSArIG1OZXdTZXRJbnRlcnZhbCA8IG5vdykpIHsKLSAgICAgICAgbmV3U3VtbWFyaXplclNldCgpOwotICAgIH0KLQotICAgIGlmIChtQ3VycmVudFNldCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBMaXN0PE1ldHJpY3NTdW1tYXJpemVyICo+ICpzdW1tYXJpemVycyA9IG1DdXJyZW50U2V0LT5nZXRTdW1tYXJpemVycygpOwotICAgIExpc3Q8TWV0cmljc1N1bW1hcml6ZXIgKj46Oml0ZXJhdG9yIGl0ID0gc3VtbWFyaXplcnMtPmJlZ2luKCk7Ci0gICAgZm9yICg7IGl0ICE9IHN1bW1hcml6ZXJzLT5lbmQoKTsgaXQrKykgewotICAgICAgICBpZiAoKCppdCktPmlzTWluZSgqaXRlbSkpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChpdCA9PSBzdW1tYXJpemVycy0+ZW5kKCkpIHsKLSAgICAgICAgQUxPR0QoIm5vIGhhbmRsZXIgZm9yIHR5cGUgJXMiLCBpdGVtLT5nZXRLZXkoKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgIC8vIG5vIGhhbmRsZXIKLSAgICB9Ci0KLSAgICAvLyBpbnZva2UgdGhlIHN1bW1hcml6ZXIuIHN1bW1hcml6ZXIgd2lsbCBtYWtlIHdoYXRldmVyIGNvcGllcwotICAgIC8vIGl0IHdhbnRzOyB0aGUgY2FsbGVyIHJldGFpbnMgb3duZXJzaGlwIG9mIGl0ZW0uCi0KLSAgICAoKml0KS0+aGFuZGxlUmVjb3JkKGl0ZW0pOwotCi19Ci0KIC8vIGhvdyBsb25nIHdlIGhvbGQgcGFja2FnZSBpbmZvIGJlZm9yZSB3ZSByZS1mZXRjaCBpdAogI2RlZmluZSBQS0dfRVhQSVJBVElPTl9OUyAoMzAqNjAqMTAwMDAwMDAwMGxsKSAgIC8vIDMwIG1pbnV0ZXMsIGluIG5zZWNzCiAKIC8vIGdpdmUgbWUgdGhlIHBhY2thZ2UgbmFtZSwgcGVyaGFwcyBnb2luZyB0byBmaW5kIGl0Ci12b2lkIE1lZGlhQW5hbHl0aWNzU2VydmljZTo6c2V0UGtnSW5mbyhNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0sIHVpZF90IHVpZCwgYm9vbCBzZXROYW1lLCBib29sIHNldFZlcnNpb24pIHsKKy8vIG1hbmFnZXMgaXRzIG93biBtdXRleCBvcGVyYXRpb25zIGludGVybmFsbHkKK3ZvaWQgTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpzZXRQa2dJbmZvKE1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSwgdWlkX3QgdWlkLCBib29sIHNldE5hbWUsIGJvb2wgc2V0VmVyc2lvbikKK3sKICAgICBBTE9HVigiYXNraW5nIGZvciBwYWNrYWdlbmFtZSB0byBnbyB3aXRoIHVpZD0lZCIsIHVpZCk7CiAKICAgICBpZiAoIXNldE5hbWUgJiYgIXNldFZlcnNpb24pIHsKQEAgLTgxNywzMiArNTM4LDM2IEBACiAKICAgICBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfUkVBTFRJTUUpOwogICAgIHN0cnVjdCBVaWRUb1BrZ01hcCBtYXBwaW5nOwotICAgIG1hcHBpbmcudWlkID0gKC0xKTsKKyAgICBtYXBwaW5nLnVpZCA9ICh1aWRfdCkoLTEpOwogCi0gICAgc3NpemVfdCBpID0gbVBrZ01hcHBpbmdzLmluZGV4T2ZLZXkodWlkKTsKLSAgICBpZiAoaSA+PSAwKSB7Ci0gICAgICAgIG1hcHBpbmcgPSBtUGtnTWFwcGluZ3MudmFsdWVBdChpKTsKLSAgICAgICAgQUxPR1YoIkV4cGlyYXRpb24/IHVpZCAlZCBleHBpcmF0aW9uICUiIFBSSWQ2NCAiIG5vdyAlIiBQUklkNjQsCi0gICAgICAgICAgICAgIHVpZCwgbWFwcGluZy5leHBpcmF0aW9uLCBub3cpOwotICAgICAgICBpZiAobWFwcGluZy5leHBpcmF0aW9uIDwgbm93KSB7Ci0gICAgICAgICAgICAvLyBwdXJnZSBvdXIgY3VycmVudCBlbnRyeSBhbmQgcmUtcXVlcnkKLSAgICAgICAgICAgIEFMT0dWKCJlbnRyeSBmb3IgdWlkICVkIGV4cGlyZWQsIG5vdz0gJSIgUFJJZDY0ICIiLCB1aWQsIG5vdyk7Ci0gICAgICAgICAgICBtUGtnTWFwcGluZ3MucmVtb3ZlSXRlbXNBdChpLCAxKTsKLSAgICAgICAgICAgIC8vIGNvdWxkIGNoZWF0IGFuZCB1c2UgYSBnb3RvIGJhY2sgdG8gdGhlIHRvcCBvZiB0aGUgcm91dGluZS4KLSAgICAgICAgICAgIC8vIGEgZ29vZCBjb21waWxlciBzaG91bGQgcmVjb2duaXplIHRoZSBsb2NhbCB0YWlsIHJlY3Vyc2lvbi4uLgotICAgICAgICAgICAgcmV0dXJuIHNldFBrZ0luZm8oaXRlbSwgdWlkLCBzZXROYW1lLCBzZXRWZXJzaW9uKTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9ja19tYXBwaW5ncyk7CisgICAgICAgIGludCBpID0gbVBrZ01hcHBpbmdzLmluZGV4T2ZLZXkodWlkKTsKKyAgICAgICAgaWYgKGkgPj0gMCkgeworICAgICAgICAgICAgbWFwcGluZyA9IG1Qa2dNYXBwaW5ncy52YWx1ZUF0KGkpOworICAgICAgICAgICAgQUxPR1YoIkV4cGlyYXRpb24/IHVpZCAlZCBleHBpcmF0aW9uICUiIFBSSWQ2NCAiIG5vdyAlIiBQUklkNjQsCisgICAgICAgICAgICAgICAgICB1aWQsIG1hcHBpbmcuZXhwaXJhdGlvbiwgbm93KTsKKyAgICAgICAgICAgIGlmIChtYXBwaW5nLmV4cGlyYXRpb24gPD0gbm93KSB7CisgICAgICAgICAgICAgICAgLy8gcHVyZ2UgdGhlIHN0YWxlIGVudHJ5IGFuZCBmYWxsIGludG8gcmUtZmV0Y2hpbmcKKyAgICAgICAgICAgICAgICBBTE9HVigiZW50cnkgZm9yIHVpZCAlZCBleHBpcmVkLCBub3c9ICUiIFBSSWQ2NCAiIiwgdWlkLCBub3cpOworICAgICAgICAgICAgICAgIG1Qa2dNYXBwaW5ncy5yZW1vdmVJdGVtc0F0KGkpOworICAgICAgICAgICAgICAgIG1hcHBpbmcudWlkID0gKHVpZF90KSgtMSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBBU3RyaW5nIHBrZzsKKyAgICB9CisKKyAgICAvLyBpZiB3ZSBkaWQgbm90IGZpbmQgaXQKKyAgICBpZiAobWFwcGluZy51aWQgPT0gKHVpZF90KSgtMSkpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgcGtnOwogICAgICAgICBzdGQ6OnN0cmluZyBpbnN0YWxsZXIgPSAiIjsKLSAgICAgICAgaW50MzJfdCB2ZXJzaW9uQ29kZSA9IDA7CisgICAgICAgIGludDY0X3QgdmVyc2lvbkNvZGUgPSAwOwogCiAgICAgICAgIHN0cnVjdCBwYXNzd2QgKnB3ID0gZ2V0cHd1aWQodWlkKTsKICAgICAgICAgaWYgKHB3KSB7CiAgICAgICAgICAgICBwa2cgPSBwdy0+cHdfbmFtZTsKICAgICAgICAgfQogCi0gICAgICAgIC8vIGZpbmQgdGhlIHByb3BlciB2YWx1ZSAtLSBzaG91bGQgd2UgY2FjaGUgdGhpcyBiaW5kZXI/PworICAgICAgICAvLyBmaW5kIHRoZSBwcm9wZXIgdmFsdWUKIAogICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBOVUxMOwogICAgICAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CkBAIC04NzUsNyArNjAwLDcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gc3RyaXAgYW55IGxlYWRpbmcgInNoYXJlZDoiIHN0cmluZ3MgdGhhdCBjYW1lIGJhY2sKLSAgICAgICAgICAgIGlmIChwa2cuc3RhcnRzV2l0aCgic2hhcmVkOiIpKSB7CisgICAgICAgICAgICBpZiAocGtnLmNvbXBhcmUoMCwgNywgInNoYXJlZDoiKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgcGtnLmVyYXNlKDAsIDcpOwogICAgICAgICAgICAgfQogCkBAIC05MDUsNyArNjMwLDcgQEAKICAgICAgICAgICAgICAgICB9CiAKIAotICAgICAgICAgICAgICAgIEFMT0dWKCJwYWNrYWdlICclcycgaW5zdGFsbGVkIGJ5ICclcycgdmVyc2lvbmNvZGUgJWQgLyAlMDh4IiwKKyAgICAgICAgICAgICAgICBBTE9HVigicGFja2FnZSAnJXMnIGluc3RhbGxlZCBieSAnJXMnIHZlcnNpb25jb2RlICUiICBQUklkNjQgIiAvICUiIFBSSXg2NCwKICAgICAgICAgICAgICAgICAgICAgICBwa2cuY19zdHIoKSwgaW5zdGFsbGVyLmNfc3RyKCksIHZlcnNpb25Db2RlLCB2ZXJzaW9uQ29kZSk7CiAKICAgICAgICAgICAgICAgICBpZiAoc3RybmNtcChpbnN0YWxsZXIuY19zdHIoKSwgImNvbS5hbmRyb2lkLiIsIDEyKSA9PSAwKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZWRpYUFuYWx5dGljc1NlcnZpY2UuaCBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5oCmluZGV4IDUyZTQ2MzEuLmIzYzkwMmEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5oCisrKyBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5oCkBAIC0yOCw5ICsyOCw2IEBACiAKICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmg+CiAKLSNpbmNsdWRlICJNZXRyaWNzU3VtbWFyaXplci5oIgotCi0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgTWVkaWFBbmFseXRpY3NTZXJ2aWNlIDogcHVibGljIEJuTWVkaWFBbmFseXRpY3NTZXJ2aWNlCkBAIC01Niw3ICs1Myw2IEBACiAgICAgaW50NjRfdCBtSXRlbXNEaXNjYXJkZWQ7CiAgICAgaW50NjRfdCBtSXRlbXNEaXNjYXJkZWRFeHBpcmU7CiAgICAgaW50NjRfdCBtSXRlbXNEaXNjYXJkZWRDb3VudDsKLSAgICBpbnQ2NF90IG1TZXRzRGlzY2FyZGVkOwogICAgIE1lZGlhQW5hbHl0aWNzSXRlbTo6U2Vzc2lvbklEX3QgbUxhc3RTZXNzaW9uSUQ7CiAKICAgICAvLyBwYXJ0aXRpb25lZCBhIGJpdCBzbyB3ZSBkb24ndCBvdmVyIHNlcmlhbGl6ZQpAQCAtNzksNTQgKzc1LDE1IEBACiAgICAgYm9vbCBjb250ZW50VmFsaWQoTWVkaWFBbmFseXRpY3NJdGVtICppdGVtLCBib29sIGlzVHJ1c3RlZCk7CiAgICAgYm9vbCByYXRlTGltaXRlZChNZWRpYUFuYWx5dGljc0l0ZW0gKik7CiAKLSAgICAvLyB0aGUgb25lcyB0aGF0IGFyZSBzdGlsbCBvcGVuCi0gICAgLy8gKG5ld2VzdCBhdCBmcm9udCkgc2luY2Ugd2Uga2VlcCBsb29raW5nIGZvciB0aGVtCi0gICAgTGlzdDxNZWRpYUFuYWx5dGljc0l0ZW0gKj4gKm1PcGVuOwotICAgIC8vIHRoZSBvbmVzIHdlJ3ZlIGZpbmFsaXplZAogICAgIC8vIChvbGRlc3QgYXQgZnJvbnQpIHNvIGl0IHByaW50cyBuaWNlbHkgZm9yIGR1bXBzeXMKLSAgICBMaXN0PE1lZGlhQW5hbHl0aWNzSXRlbSAqPiAqbUZpbmFsaXplZDsKLSAgICAvLyBzZWFyY2hpbmcgd2l0aGluIHRoZXNlIHF1ZXVlczogcXVldWUsIGtleQotICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAqZmluZEl0ZW0oTGlzdDxNZWRpYUFuYWx5dGljc0l0ZW0gKj4gKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0gKiwgYm9vbCByZW1vdmVpdCk7Ci0KLSAgICAvLyBzdW1tYXJpemVycwotICAgIHZvaWQgc3VtbWFyaXplKE1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSk7Ci0gICAgY2xhc3MgU3VtbWFyaXplclNldCB7Ci0gICAgICAgIG5zZWNzX3QgbVN0YXJ0ZWQ7Ci0gICAgICAgIExpc3Q8TWV0cmljc1N1bW1hcml6ZXIgKj4gKm1TdW1tYXJpemVyczsKLQotICAgICAgcHVibGljOgotICAgICAgICB2b2lkIGFwcGVuZFN1bW1hcml6ZXIoTWV0cmljc1N1bW1hcml6ZXIgKnMpIHsKLSAgICAgICAgICAgIGlmIChzKSB7Ci0gICAgICAgICAgICAgICAgbVN1bW1hcml6ZXJzLT5wdXNoX2JhY2socyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIG5zZWNzX3QgZ2V0U3RhcnRlZCgpIHsgcmV0dXJuIG1TdGFydGVkO30KLSAgICAgICAgdm9pZCBzZXRTdGFydGVkKG5zZWNzX3Qgc3RhcnRlZCkge21TdGFydGVkID0gc3RhcnRlZDt9Ci0gICAgICAgIExpc3Q8TWV0cmljc1N1bW1hcml6ZXIgKj4gKmdldFN1bW1hcml6ZXJzKCkgeyByZXR1cm4gbVN1bW1hcml6ZXJzO30KLQotICAgICAgICBTdW1tYXJpemVyU2V0KCk7Ci0gICAgICAgIH5TdW1tYXJpemVyU2V0KCk7Ci0gICAgfTsKLSAgICB2b2lkIG5ld1N1bW1hcml6ZXJTZXQoKTsKLSAgICBMaXN0PFN1bW1hcml6ZXJTZXQgKj4gKm1TdW1tYXJpemVyU2V0czsKLSAgICBTdW1tYXJpemVyU2V0ICptQ3VycmVudFNldDsKLSAgICBMaXN0PE1ldHJpY3NTdW1tYXJpemVyICo+ICpnZXRGaXJzdFNldCgpIHsKLSAgICAgICAgTGlzdDxTdW1tYXJpemVyU2V0ICo+OjppdGVyYXRvciBmaXJzdCA9IG1TdW1tYXJpemVyU2V0cy0+YmVnaW4oKTsKLSAgICAgICAgaWYgKGZpcnN0ICE9IG1TdW1tYXJpemVyU2V0cy0+ZW5kKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAoKmZpcnN0KS0+Z2V0U3VtbWFyaXplcnMoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICB2b2lkIHNhdmVJdGVtKE1lZGlhQW5hbHl0aWNzSXRlbSk7Ci0gICAgdm9pZCBzYXZlSXRlbShMaXN0PE1lZGlhQW5hbHl0aWNzSXRlbSAqPiAqLCBNZWRpYUFuYWx5dGljc0l0ZW0gKiwgaW50KTsKLSAgICB2b2lkIGRlbGV0ZUl0ZW0oTGlzdDxNZWRpYUFuYWx5dGljc0l0ZW0gKj4gKiwgTWVkaWFBbmFseXRpY3NJdGVtICopOworICAgIExpc3Q8TWVkaWFBbmFseXRpY3NJdGVtICo+IG1JdGVtczsKKyAgICB2b2lkIHNhdmVJdGVtKE1lZGlhQW5hbHl0aWNzSXRlbSAqKTsKIAogICAgIC8vIHN1cHBvcnQgZm9yIGdlbmVyYXRpbmcgb3V0cHV0CiAgICAgaW50IG1EdW1wUHJvdG87Ci0gICAgU3RyaW5nOCBkdW1wUXVldWUoTGlzdDxNZWRpYUFuYWx5dGljc0l0ZW0qPiAqKTsKLSAgICBTdHJpbmc4IGR1bXBRdWV1ZShMaXN0PE1lZGlhQW5hbHl0aWNzSXRlbSo+ICosIG5zZWNzX3QsIGNvbnN0IGNoYXIgKm9ubHkpOworICAgIGludCBtRHVtcFByb3RvRGVmYXVsdDsKKyAgICBTdHJpbmc4IGR1bXBRdWV1ZSgpOworICAgIFN0cmluZzggZHVtcFF1ZXVlKG5zZWNzX3QsIGNvbnN0IGNoYXIgKm9ubHkpOwogCiAgICAgdm9pZCBkdW1wSGVhZGVycyhTdHJpbmc4ICZyZXN1bHQsIG5zZWNzX3QgdHNfc2luY2UpOwogICAgIHZvaWQgZHVtcFN1bW1hcmllcyhTdHJpbmc4ICZyZXN1bHQsIG5zZWNzX3QgdHNfc2luY2UsIGNvbnN0IGNoYXIgKiBvbmx5KTsKQEAgLTEzNSw5ICs5Miw5IEBACiAgICAgLy8gbWFwcGluZyB1aWRzIHRvIHBhY2thZ2UgbmFtZXMKICAgICBzdHJ1Y3QgVWlkVG9Qa2dNYXAgewogICAgICAgICB1aWRfdCB1aWQ7Ci0gICAgICAgIEFTdHJpbmcgcGtnOwotICAgICAgICBBU3RyaW5nIGluc3RhbGxlcjsKLSAgICAgICAgaW50MzJfdCB2ZXJzaW9uQ29kZTsKKyAgICAgICAgc3RkOjpzdHJpbmcgcGtnOworICAgICAgICBzdGQ6OnN0cmluZyBpbnN0YWxsZXI7CisgICAgICAgIGludDY0X3QgdmVyc2lvbkNvZGU7CiAgICAgICAgIG5zZWNzX3QgZXhwaXJhdGlvbjsKICAgICB9OwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZXRyaWNzU3VtbWFyaXplci5jcHAgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZXRyaWNzU3VtbWFyaXplci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZmUwZWMuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWV0cmljc1N1bW1hcml6ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIk1ldHJpY3NTdW1tYXJpemVyIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLQotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmg+Ci0KLSNpbmNsdWRlICJNZXRyaWNzU3VtbWFyaXplci5oIgotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotI2RlZmluZSBERUJVR19TT1JUICAgICAgMAotI2RlZmluZSBERUJVR19RVUVVRSAgICAgMAotCi0KLU1ldHJpY3NTdW1tYXJpemVyOjpNZXRyaWNzU3VtbWFyaXplcihjb25zdCBjaGFyICprZXkpCi0gICAgOiBtSWdub3JhYmxlcyhOVUxMKQotewotICAgIEFMT0dWKCJNZXRyaWNzU3VtbWFyaXplcjo6TWV0cmljc1N1bW1hcml6ZXIiKTsKLQotICAgIGlmIChrZXkgPT0gTlVMTCkgewotICAgICAgICBtS2V5ID0ga2V5OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1LZXkgPSBzdHJkdXAoa2V5KTsKLSAgICB9Ci0KLSAgICBtU3VtbWFyaWVzID0gbmV3IExpc3Q8TWVkaWFBbmFseXRpY3NJdGVtICo+KCk7Ci19Ci0KLU1ldHJpY3NTdW1tYXJpemVyOjp+TWV0cmljc1N1bW1hcml6ZXIoKQotewotICAgIEFMT0dWKCJNZXRyaWNzU3VtbWFyaXplcjo6fk1ldHJpY3NTdW1tYXJpemVyIik7Ci0gICAgaWYgKG1LZXkpIHsKLSAgICAgICAgZnJlZSgodm9pZCAqKW1LZXkpOwotICAgICAgICBtS2V5ID0gTlVMTDsKLSAgICB9Ci0KLSAgICAvLyBjbGVhciB0aGUgbGlzdCBvZiBpdGVtcyB3ZSBoYXZlIHNhdmVkCi0gICAgd2hpbGUgKG1TdW1tYXJpZXMtPnNpemUoKSA+IDApIHsKLSAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtICogb2l0ZW0gPSAqKG1TdW1tYXJpZXMtPmJlZ2luKCkpOwotICAgICAgICBpZiAoREVCVUdfUVVFVUUpIHsKLSAgICAgICAgICAgIEFMT0dEKCJ6YXAgb2xkIHJlY29yZDoga2V5ICVzIHNlc3Npb25JRCAlIiBQUklkNjQgIiB0cyAlIiBQUklkNjQgIiIsCi0gICAgICAgICAgICAgICAgb2l0ZW0tPmdldEtleSgpLmNfc3RyKCksIG9pdGVtLT5nZXRTZXNzaW9uSUQoKSwKLSAgICAgICAgICAgICAgICBvaXRlbS0+Z2V0VGltZXN0YW1wKCkpOwotICAgICAgICB9Ci0gICAgICAgIG1TdW1tYXJpZXMtPmVyYXNlKG1TdW1tYXJpZXMtPmJlZ2luKCkpOwotICAgICAgICBkZWxldGUgb2l0ZW07Ci0gICAgfQotfQotCi0vLyBzbyB3ZSBrbm93IHdoYXQgc3VtbWFyaXplciB3ZSB3ZXJlIHVzaW5nCi1jb25zdCBjaGFyICpNZXRyaWNzU3VtbWFyaXplcjo6Z2V0S2V5KCkgewotICAgIGNvbnN0IGNoYXIgKnZhbHVlID0gbUtleTsKLSAgICBpZiAodmFsdWUgPT0gTlVMTCkgewotICAgICAgICB2YWx1ZSA9ICJ1bmtub3duIjsKLSAgICB9Ci0gICAgcmV0dXJuIHZhbHVlOwotfQotCi0vLyBzaG91bGQgdGhlIHJlY29yZCBiZSBnaXZlbiB0byB0aGlzIHN1bW1hcml6ZXIKLWJvb2wgTWV0cmljc1N1bW1hcml6ZXI6OmlzTWluZShNZWRpYUFuYWx5dGljc0l0ZW0gJml0ZW0pCi17Ci0gICAgaWYgKG1LZXkgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgQVN0cmluZyBpdGVtS2V5ID0gaXRlbS5nZXRLZXkoKTsKLSAgICBpZiAoc3RyY21wKG1LZXksIGl0ZW1LZXkuY19zdHIoKSkgIT0gMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi1BU3RyaW5nIE1ldHJpY3NTdW1tYXJpemVyOjpkdW1wU3VtbWFyeShpbnQgJnNsb3QpCi17Ci0gICAgcmV0dXJuIGR1bXBTdW1tYXJ5KHNsb3QsIE5VTEwpOwotfQotCi1BU3RyaW5nIE1ldHJpY3NTdW1tYXJpemVyOjpkdW1wU3VtbWFyeShpbnQgJnNsb3QsIGNvbnN0IGNoYXIgKm9ubHkpCi17Ci0gICAgQVN0cmluZyB2YWx1ZSA9ICIiOwotCi0gICAgTGlzdDxNZWRpYUFuYWx5dGljc0l0ZW0gKj46Oml0ZXJhdG9yIGl0ID0gbVN1bW1hcmllcy0+YmVnaW4oKTsKLSAgICBpZiAoaXQgIT0gbVN1bW1hcmllcy0+ZW5kKCkpIHsKLSAgICAgICAgY2hhciBidWZbMTZdOyAgIC8vIGVub3VnaCBmb3IgIiMjIyMjOiAiCi0gICAgICAgIGZvciAoOyBpdCAhPSBtU3VtbWFyaWVzLT5lbmQoKTsgaXQrKykgewotICAgICAgICAgICAgaWYgKG9ubHkgIT0gTlVMTCAmJiBzdHJjbXAob25seSwgKCppdCktPmdldEtleSgpLmNfc3RyKCkpICE9IDApIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFTdHJpbmcgZW50cnkgPSAoKml0KS0+dG9TdHJpbmcoKTsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlNWQ6ICIsIHNsb3QpOwotICAgICAgICAgICAgdmFsdWUuYXBwZW5kKGJ1Zik7Ci0gICAgICAgICAgICB2YWx1ZS5hcHBlbmQoZW50cnkuY19zdHIoKSk7Ci0gICAgICAgICAgICB2YWx1ZS5hcHBlbmQoIlxuIik7Ci0gICAgICAgICAgICBzbG90Kys7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHZhbHVlOwotfQotCi12b2lkIE1ldHJpY3NTdW1tYXJpemVyOjpzZXRJZ25vcmFibGVzKGNvbnN0IGNoYXIgKippZ25vcmFibGVzKSB7Ci0gICAgbUlnbm9yYWJsZXMgPSBpZ25vcmFibGVzOwotfQotCi1jb25zdCBjaGFyICoqTWV0cmljc1N1bW1hcml6ZXI6OmdldElnbm9yYWJsZXMoKSB7Ci0gICAgcmV0dXJuIG1JZ25vcmFibGVzOwotfQotCi12b2lkIE1ldHJpY3NTdW1tYXJpemVyOjpoYW5kbGVSZWNvcmQoTWVkaWFBbmFseXRpY3NJdGVtICppdGVtKSB7Ci0KLSAgICBBTE9HVigiTWV0cmljc1N1bW1hcml6ZXI6OmhhbmRsZVJlY29yZCgpIGZvciAlcyIsCi0gICAgICAgICAgICAgICAgaXRlbSA9PSBOVUxMID8gIjxub3RoaW5nPiIgOiBpdGVtLT50b1N0cmluZygpLmNfc3RyKCkpOwotCi0gICAgaWYgKGl0ZW0gPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgTGlzdDxNZWRpYUFuYWx5dGljc0l0ZW0gKj46Oml0ZXJhdG9yIGl0ID0gbVN1bW1hcmllcy0+YmVnaW4oKTsKLSAgICBmb3IgKDsgaXQgIT0gbVN1bW1hcmllcy0+ZW5kKCk7IGl0KyspIHsKLSAgICAgICAgYm9vbCBnb29kID0gc2FtZUF0dHJpYnV0ZXMoKCppdCksIGl0ZW0sIGdldElnbm9yYWJsZXMoKSk7Ci0gICAgICAgIEFMT0dWKCJNYXRjaCBhZ2FpbnN0ICVzIHNheXMgJWQiLCAoKml0KS0+dG9TdHJpbmcoKS5jX3N0cigpLCBnb29kKTsKLSAgICAgICAgaWYgKGdvb2QpCi0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKGl0ID09IG1TdW1tYXJpZXMtPmVuZCgpKSB7Ci0gICAgICAgICAgICBBTE9HVigic2F2ZSBuZXcgcmVjb3JkIik7Ci0gICAgICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0gKm5pdGVtID0gaXRlbS0+ZHVwKCk7Ci0gICAgICAgICAgICBpZiAobml0ZW0gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJ1bmFibGUgdG8gc2F2ZSBNZWRpYU1ldHJpY3MgcmVjb3JkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzb3J0UHJvcHMobml0ZW0pOwotICAgICAgICAgICAgbml0ZW0tPnNldEludDMyKCJhZ2dyZWdhdGVkIiwxKTsKLSAgICAgICAgICAgIG1lcmdlUmVjb3JkKCpuaXRlbSwgKml0ZW0pOwotICAgICAgICAgICAgbVN1bW1hcmllcy0+cHVzaF9iYWNrKG5pdGVtKTsKLSAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1YoImluY3JlbWVudCBleGlzdGluZyByZWNvcmQiKTsKLSAgICAgICAgICAgICgqaXQpLT5hZGRJbnQzMigiYWdncmVnYXRlZCIsMSk7Ci0gICAgICAgICAgICBtZXJnZVJlY29yZCgqKCppdCksICppdGVtKTsKLSAgICB9Ci19Ci0KLXZvaWQgTWV0cmljc1N1bW1hcml6ZXI6Om1lcmdlUmVjb3JkKE1lZGlhQW5hbHl0aWNzSXRlbSAmLypoYXZlKi8sIE1lZGlhQW5hbHl0aWNzSXRlbSAmLyppdGVtKi8pIHsKLSAgICAvLyBkZWZhdWx0IGlzIG5vIGZ1cnRoZXIgbWFzc2FnaW5nLgotICAgIEFMT0dWKCJNZXRyaWNzU3VtbWFyaXplcjo6bWVyZ2VSZWNvcmQoKSBbZGVmYXVsdF0iKTsKLSAgICByZXR1cm47Ci19Ci0KLS8vIGtlZXAgc29tZSBzdGF0cyBmb3IgdGhpbmdzOiBzdW1zLCBjb3VudHMsIHN0YW5kYXJkIGRldmlhdGlvbgotLy8gdGhlIGludGVnZXIgdmVyc2lvbiAtLSBhbGwgb2YgdGhlc2UgcGllY2VzIGFyZSBpbiA2NCBiaXRzCi12b2lkIE1ldHJpY3NTdW1tYXJpemVyOjptaW5NYXhWYXI2NChNZWRpYUFuYWx5dGljc0l0ZW0gJnN1bW1hdGlvbiwgY29uc3QgY2hhciAqa2V5LCBpbnQ2NF90IHZhbHVlKSB7Ci0gICAgaWYgKGtleSA9PSBOVUxMKQotICAgICAgICByZXR1cm47Ci0gICAgaW50IGxlbiA9IHN0cmxlbihrZXkpICsgMzI7Ci0gICAgY2hhciAqdG1wS2V5ID0gKGNoYXIgKiltYWxsb2MobGVuKTsKLQotICAgIGlmICh0bXBLZXkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gTiAtIGNvdW50IG9mIHNhbXBsZXMKLSAgICBzbnByaW50Zih0bXBLZXksIGxlbiwgIiVzLm4iLCBrZXkpOwotICAgIHN1bW1hdGlvbi5hZGRJbnQ2NCh0bXBLZXksIDEpOwotCi0gICAgLy8gemVybyAtIGNvdW50IG9mIHNhbXBsZXMgdGhhdCBhcmUgemVybwotICAgIGlmICh2YWx1ZSA9PSAwKSB7Ci0gICAgICAgIHNucHJpbnRmKHRtcEtleSwgbGVuLCAiJXMuemVybyIsIGtleSk7Ci0gICAgICAgIGludDY0X3QgemVybyA9IDA7Ci0gICAgICAgICh2b2lkKSBzdW1tYXRpb24uZ2V0SW50NjQodG1wS2V5LCZ6ZXJvKTsKLSAgICAgICAgemVybysrOwotICAgICAgICBzdW1tYXRpb24uc2V0SW50NjQodG1wS2V5LCB6ZXJvKTsKLSAgICB9Ci0KLSAgICAvLyBtaW4KLSAgICBzbnByaW50Zih0bXBLZXksIGxlbiwgIiVzLm1pbiIsIGtleSk7Ci0gICAgaW50NjRfdCBtaW4gPSB2YWx1ZTsKLSAgICBpZiAoc3VtbWF0aW9uLmdldEludDY0KHRtcEtleSwmbWluKSkgewotICAgICAgICBpZiAobWluID4gdmFsdWUpIHsKLSAgICAgICAgICAgIHN1bW1hdGlvbi5zZXRJbnQ2NCh0bXBLZXksIHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHN1bW1hdGlvbi5zZXRJbnQ2NCh0bXBLZXksIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvLyBtYXgKLSAgICBzbnByaW50Zih0bXBLZXksIGxlbiwgIiVzLm1heCIsIGtleSk7Ci0gICAgaW50NjRfdCBtYXggPSB2YWx1ZTsKLSAgICBpZiAoc3VtbWF0aW9uLmdldEludDY0KHRtcEtleSwmbWF4KSkgewotICAgICAgICBpZiAobWF4IDwgdmFsdWUpIHsKLSAgICAgICAgICAgIHN1bW1hdGlvbi5zZXRJbnQ2NCh0bXBLZXksIHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHN1bW1hdGlvbi5zZXRJbnQ2NCh0bXBLZXksIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvLyBjb21wb25lbnRzIGZvciBtZWFuLCBzdGRkZXY7Ci0gICAgLy8gc3RkZGV2ID0gc3FydCgxLzQqKHN1bXgyIC0gKDIqc3VteCpzdW14L24pICsgKChzdW14L24pXjIpKSkKLSAgICAvLyBzdW0geAotICAgIHNucHJpbnRmKHRtcEtleSwgbGVuLCAiJXMuc3VtWCIsIGtleSk7Ci0gICAgc3VtbWF0aW9uLmFkZEludDY0KHRtcEtleSwgdmFsdWUpOwotICAgIC8vIHN1bSB4XjIKLSAgICBzbnByaW50Zih0bXBLZXksIGxlbiwgIiVzLnN1bVgyIiwga2V5KTsKLSAgICBzdW1tYXRpb24uYWRkSW50NjQodG1wS2V5LCB2YWx1ZSp2YWx1ZSk7Ci0KLQotICAgIC8vIGxhc3QgdGhpbmcgd2UgZG8gLS0gcmVtb3ZlIHRoZSBiYXNlIGtleSBmcm9tIHRoZSBzdW1tYXRpb24KLSAgICAvLyByZWNvcmQgc28gd2Ugd29uJ3QgZ2V0IGNvbmZ1c2VkIGFib3V0IGl0IGhhdmluZyBib3RoIGluZGl2aWR1YWwKLSAgICAvLyBhbmQgc3VtbWFyeSBpbmZvcm1hdGlvbiBpbiB0aGVyZS4KLSAgICBzdW1tYXRpb24ucmVtb3ZlUHJvcChrZXkpOwotCi0gICAgZnJlZSh0bXBLZXkpOwotfQotCi0KLS8vCi0vLyBDb21wYXJhdG9ycwotLy8KLQotLy8gdGVzdGluZyB0aGF0IGFsbCBvZiAnc2luZ2xlJyBpcyBpbiAnc3VtbScKLS8vIGFuZCB0aGF0IHRoZSB2YWx1ZXMgbWF0Y2guCi0vLyAnc3VtbScgbWF5IGhhdmUgZXh0cmEgZmllbGRzLgotLy8gJ2lnbm9yYWJsZScgaXMgYSBzZXQgb2YgdGhpbmdzIHRoYXQgd2UgZG9uJ3Qgd29ycnkgYWJvdXQgbWF0Y2hpbmcgdXAKLS8vICh1c3VhbGx5IHRpbWUtIG9yIGNvdW50LWJhc2VkIHZhbHVlcyB3ZSdsbCBzdW0gZWxzZXdoZXJlKQotYm9vbCBNZXRyaWNzU3VtbWFyaXplcjo6c2FtZUF0dHJpYnV0ZXMoTWVkaWFBbmFseXRpY3NJdGVtICpzdW1tLCBNZWRpYUFuYWx5dGljc0l0ZW0gKnNpbmdsZSwgY29uc3QgY2hhciAqKmlnbm9yYWJsZSkgewotCi0gICAgaWYgKHNpbmdsZSA9PSBOVUxMIHx8IHN1bW0gPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIEFMT0dWKCJNZXRyaWNzU3VtbWFyaXplcjo6c2FtZUF0dHJpYnV0ZXMoKTogc3VtbSAlcyIsIHN1bW0tPnRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgQUxPR1YoIk1ldHJpY3NTdW1tYXJpemVyOjpzYW1lQXR0cmlidXRlcygpOiBzaW5nbGUgJXMiLCBzaW5nbGUtPnRvU3RyaW5nKCkuY19zdHIoKSk7Ci0KLSAgICAvLyBrZWVwIGRpZmZlcmVudCBzb3VyY2VzL3VzZXJzIHNlcGFyYXRlCi0gICAgaWYgKHNpbmdsZS0+bVVpZCAhPSBzdW1tLT5tVWlkKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyB0aGlzIGNhbiBiZSBtYWRlIGJldHRlci4KLSAgICBmb3Ioc2l6ZV90IGk9MDtpPHNpbmdsZS0+bVByb3BDb3VudDtpKyspIHsKLSAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtOjpQcm9wICpwcm9wMSA9ICYoc2luZ2xlLT5tUHJvcHNbaV0pOwotICAgICAgICBjb25zdCBjaGFyICphdHRyTmFtZSA9IHByb3AxLT5tTmFtZTsKLQotICAgICAgICAvLyBpcyBpdCBzb21ldGhpbmcgd2Ugc2hvdWxkIGlnbm9yZQotICAgICAgICBpZiAoaWdub3JhYmxlICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKippZyA9IGlnbm9yYWJsZTsKLSAgICAgICAgICAgIGZvciAoOyppZzsgaWcrKykgewotICAgICAgICAgICAgICAgIGlmIChzdHJjbXAoKmlnLCBhdHRyTmFtZSkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKmlnKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIndlIGRvbid0IG1pbmQgdGhhdCBpdCBoYXMgYXR0ciAnJXMnIiwgYXR0ck5hbWUpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtOjpQcm9wICpwcm9wMiA9IHN1bW0tPmZpbmRQcm9wKGF0dHJOYW1lKTsKLSAgICAgICAgaWYgKHByb3AyID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dWKCJzdW1tIGRvZXNuJ3QgaGF2ZSB0aGlzIGF0dHIiKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcDEtPm1UeXBlICE9IHByb3AyLT5tVHlwZSkgewotICAgICAgICAgICAgQUxPR1YoIm1pc21hdGNoZWQgYXR0ciB0eXBlcyIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAocHJvcDEtPm1UeXBlKSB7Ci0gICAgICAgICAgICBjYXNlIE1lZGlhQW5hbHl0aWNzSXRlbTo6a1R5cGVJbnQzMjoKLSAgICAgICAgICAgICAgICBpZiAocHJvcDEtPnUuaW50MzJWYWx1ZSAhPSBwcm9wMi0+dS5pbnQzMlZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJtaXNtYXRjaCB2YWx1ZXMiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTWVkaWFBbmFseXRpY3NJdGVtOjprVHlwZUludDY0OgotICAgICAgICAgICAgICAgIGlmIChwcm9wMS0+dS5pbnQ2NFZhbHVlICE9IHByb3AyLT51LmludDY0VmFsdWUpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm1pc21hdGNoIHZhbHVlcyIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNZWRpYUFuYWx5dGljc0l0ZW06OmtUeXBlRG91YmxlOgotICAgICAgICAgICAgICAgIC8vIFhYWDogd2F0Y2ggb3V0IGZvciBmbG9hdGluZyBwb2ludCBjb21wYXJpc29ucyEKLSAgICAgICAgICAgICAgICBpZiAocHJvcDEtPnUuZG91YmxlVmFsdWUgIT0gcHJvcDItPnUuZG91YmxlVmFsdWUpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm1pc21hdGNoIHZhbHVlcyIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNZWRpYUFuYWx5dGljc0l0ZW06OmtUeXBlQ1N0cmluZzoKLSAgICAgICAgICAgICAgICBpZiAoc3RyY21wKHByb3AxLT51LkNTdHJpbmdWYWx1ZSwgcHJvcDItPnUuQ1N0cmluZ1ZhbHVlKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJtaXNtYXRjaCB2YWx1ZXMiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTWVkaWFBbmFseXRpY3NJdGVtOjprVHlwZVJhdGU6Ci0gICAgICAgICAgICAgICAgaWYgKHByb3AxLT51LnJhdGUuY291bnQgIT0gcHJvcDItPnUucmF0ZS5jb3VudCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigibWlzbWF0Y2ggdmFsdWVzIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHByb3AxLT51LnJhdGUuZHVyYXRpb24gIT0gcHJvcDItPnUucmF0ZS5kdXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigibWlzbWF0Y2ggdmFsdWVzIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIEFMT0dWKCJtaXNtYXRjaCB2YWx1ZXMgaW4gZGVmYXVsdCB0eXBlIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLQotaW50IE1ldHJpY3NTdW1tYXJpemVyOjpQcm9wU29ydGVyKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpIHsKLSAgICBNZWRpYUFuYWx5dGljc0l0ZW06OlByb3AgKmFpID0gKE1lZGlhQW5hbHl0aWNzSXRlbTo6UHJvcCAqKWE7Ci0gICAgTWVkaWFBbmFseXRpY3NJdGVtOjpQcm9wICpiaSA9IChNZWRpYUFuYWx5dGljc0l0ZW06OlByb3AgKiliOwotICAgIHJldHVybiBzdHJjbXAoYWktPm1OYW1lLCBiaS0+bU5hbWUpOwotfQotCi0vLyB3ZSBzb3J0IGluIHRoZSBzdW1tYXJpZXMgc28gdGhhdCBpdCBsb29rcyBwcmV0dHkgaW4gdGhlIGR1bXBzeXMKLXZvaWQgTWV0cmljc1N1bW1hcml6ZXI6OnNvcnRQcm9wcyhNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0pIHsKLSAgICBpZiAoaXRlbS0+bVByb3BDb3VudCAhPSAwKSB7Ci0gICAgICAgIHFzb3J0KGl0ZW0tPm1Qcm9wcywgaXRlbS0+bVByb3BDb3VudCwKLSAgICAgICAgICAgICAgc2l6ZW9mKE1lZGlhQW5hbHl0aWNzSXRlbTo6UHJvcCksIE1ldHJpY3NTdW1tYXJpemVyOjpQcm9wU29ydGVyKTsKLSAgICB9Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01ldHJpY3NTdW1tYXJpemVyLmggYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZXRyaWNzU3VtbWFyaXplci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWYwNzg2Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01ldHJpY3NTdW1tYXJpemVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0jaWZuZGVmIEFORFJPSURfTUVUUklDU1NVTU1BUklaRVJfSAotI2RlZmluZSBBTkRST0lEX01FVFJJQ1NTVU1NQVJJWkVSX0gKLQotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmg+Ci0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBNZXRyaWNzU3VtbWFyaXplcgotewotCi0gcHVibGljOgotCi0gICAgTWV0cmljc1N1bW1hcml6ZXIoY29uc3QgY2hhciAqa2V5KTsKLSAgICB2aXJ0dWFsIH5NZXRyaWNzU3VtbWFyaXplcigpOwotCi0gICAgLy8gc2hvdyB0aGUga2V5Ci0gICAgY29uc3QgY2hhciAqIGdldEtleSgpOwotCi0gICAgLy8gc2hvdWxkIHRoZSByZWNvcmQgYmUgZ2l2ZW4gdG8gdGhpcyBzdW1tYXJpemVyCi0gICAgYm9vbCBpc01pbmUoTWVkaWFBbmFseXRpY3NJdGVtICZpdGVtKTsKLQotICAgIC8vIGhhbmQgdGhlIHJlY29yZCB0byB0aGlzIHN1bW1hcml6ZXIKLSAgICB2b2lkIGhhbmRsZVJlY29yZChNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0pOwotCi0gICAgdmlydHVhbCB2b2lkIG1lcmdlUmVjb3JkKE1lZGlhQW5hbHl0aWNzSXRlbSAmaGF2ZSwgTWVkaWFBbmFseXRpY3NJdGVtICZpbmNvbWluZyk7Ci0KLSAgICAvLyBkdW1wIHRoZSBzdW1tYXJpemVkIHJlY29yZHMgKGZvciBkdW1wc3lzKQotICAgIEFTdHJpbmcgZHVtcFN1bW1hcnkoaW50ICZzbG90KTsKLSAgICBBU3RyaW5nIGR1bXBTdW1tYXJ5KGludCAmc2xvdCwgY29uc3QgY2hhciAqb25seSk7Ci0KLSAgICB2b2lkIHNldElnbm9yYWJsZXMoY29uc3QgY2hhciAqKik7Ci0gICAgY29uc3QgY2hhciAqKmdldElnbm9yYWJsZXMoKTsKLQotIHByb3RlY3RlZDoKLQotICAgIC8vIHZhcmlvdXMgY29tcGFyYXRvcnMKLSAgICAvLyAiZG8gdGhlc2UgcmVjb3JkcyBoYXZlIHNhbWUgYXR0cmlidXRlcyBhbmQgdmFsdWVzIGluIHRob3NlIGF0dHJzIgotICAgIGJvb2wgc2FtZUF0dHJpYnV0ZXMoTWVkaWFBbmFseXRpY3NJdGVtICpzdW1tLCBNZWRpYUFuYWx5dGljc0l0ZW0gKnNpbmdsZSwgY29uc3QgY2hhciAqKmlnbm9yZWFibGVzKTsKLQotICAgIHZvaWQgbWluTWF4VmFyNjQoTWVkaWFBbmFseXRpY3NJdGVtICZzdW1tLCBjb25zdCBjaGFyICprZXksIGludDY0X3QgdmFsdWUpOwotCi0gICAgc3RhdGljIGludCBQcm9wU29ydGVyKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpOwotICAgIHZvaWQgc29ydFByb3BzKE1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSk7Ci0KLSBwcml2YXRlOgotICAgIGNvbnN0IGNoYXIgKm1LZXk7Ci0gICAgY29uc3QgY2hhciAqKm1JZ25vcmFibGVzOwotICAgIExpc3Q8TWVkaWFBbmFseXRpY3NJdGVtICo+ICptU3VtbWFyaWVzOwotCi0KLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfTUVUUklDU1NVTU1BUklaRVJfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWV0cmljc1N1bW1hcml6ZXJDb2RlYy5jcHAgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZXRyaWNzU3VtbWFyaXplckNvZGVjLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFmM2M5YS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZXRyaWNzU3VtbWFyaXplckNvZGVjLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIk1ldHJpY3NTdW1tYXJpemVyQ29kZWMiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KLQotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUFuYWx5dGljc1NlcnZpY2UuaD4KLQotI2luY2x1ZGUgIk1ldHJpY3NTdW1tYXJpemVyLmgiCi0jaW5jbHVkZSAiTWV0cmljc1N1bW1hcml6ZXJDb2RlYy5oIgotCi0KLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLU1ldHJpY3NTdW1tYXJpemVyQ29kZWM6Ok1ldHJpY3NTdW1tYXJpemVyQ29kZWMoY29uc3QgY2hhciAqa2V5KQotICAgIDogTWV0cmljc1N1bW1hcml6ZXIoa2V5KQotewotICAgIEFMT0dWKCJNZXRyaWNzU3VtbWFyaXplckNvZGVjOjpNZXRyaWNzU3VtbWFyaXplckNvZGVjIik7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01ldHJpY3NTdW1tYXJpemVyQ29kZWMuaCBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01ldHJpY3NTdW1tYXJpemVyQ29kZWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAxMTk2Zi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZXRyaWNzU3VtbWFyaXplckNvZGVjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0jaWZuZGVmIEFORFJPSURfTUVUUklDU1NVTU1BUklaRVJDT0RFQ19ICi0jZGVmaW5lIEFORFJPSURfTUVUUklDU1NVTU1BUklaRVJDT0RFQ19ICi0KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgotCi0jaW5jbHVkZSA8bWVkaWEvSU1lZGlhQW5hbHl0aWNzU2VydmljZS5oPgotI2luY2x1ZGUgIk1ldHJpY3NTdW1tYXJpemVyLmgiCi0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBNZXRyaWNzU3VtbWFyaXplckNvZGVjIDogcHVibGljIE1ldHJpY3NTdW1tYXJpemVyCi17Ci0KLSBwdWJsaWM6Ci0KLSAgICBNZXRyaWNzU3VtbWFyaXplckNvZGVjKGNvbnN0IGNoYXIgKmtleSk7Ci0gICAgdmlydHVhbCB+TWV0cmljc1N1bW1hcml6ZXJDb2RlYygpIHt9OwotCi19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX01FVFJJQ1NTVU1NQVJJWkVSQ09ERUNfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWV0cmljc1N1bW1hcml6ZXJFeHRyYWN0b3IuY3BwIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWV0cmljc1N1bW1hcml6ZXJFeHRyYWN0b3IuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTBmODdkLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01ldHJpY3NTdW1tYXJpemVyRXh0cmFjdG9yLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIk1ldHJpY3NTdW1tYXJpemVyRXh0cmFjdG9yIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KLQotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUFuYWx5dGljc1NlcnZpY2UuaD4KLQotI2luY2x1ZGUgIk1ldHJpY3NTdW1tYXJpemVyLmgiCi0jaW5jbHVkZSAiTWV0cmljc1N1bW1hcml6ZXJFeHRyYWN0b3IuaCIKLQotCi0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1NZXRyaWNzU3VtbWFyaXplckV4dHJhY3Rvcjo6TWV0cmljc1N1bW1hcml6ZXJFeHRyYWN0b3IoY29uc3QgY2hhciAqa2V5KQotICAgIDogTWV0cmljc1N1bW1hcml6ZXIoa2V5KQotewotICAgIEFMT0dWKCJNZXRyaWNzU3VtbWFyaXplckV4dHJhY3Rvcjo6TWV0cmljc1N1bW1hcml6ZXJFeHRyYWN0b3IiKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWV0cmljc1N1bW1hcml6ZXJFeHRyYWN0b3IuaCBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01ldHJpY3NTdW1tYXJpemVyRXh0cmFjdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZTA1MmIuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWV0cmljc1N1bW1hcml6ZXJFeHRyYWN0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLSNpZm5kZWYgQU5EUk9JRF9NRVRSSUNTU1VNTUFSSVpFUkVYVFJBQ1RPUl9ICi0jZGVmaW5lIEFORFJPSURfTUVUUklDU1NVTU1BUklaRVJFWFRSQUNUT1JfSAotCi0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KLQotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUFuYWx5dGljc1NlcnZpY2UuaD4KLSNpbmNsdWRlICJNZXRyaWNzU3VtbWFyaXplci5oIgotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgTWV0cmljc1N1bW1hcml6ZXJFeHRyYWN0b3IgOiBwdWJsaWMgTWV0cmljc1N1bW1hcml6ZXIKLXsKLQotIHB1YmxpYzoKLQotICAgIE1ldHJpY3NTdW1tYXJpemVyRXh0cmFjdG9yKGNvbnN0IGNoYXIgKmtleSk7Ci0gICAgdmlydHVhbCB+TWV0cmljc1N1bW1hcml6ZXJFeHRyYWN0b3IoKSB7fTsKLQotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9NRVRSSUNTU1VNTUFSSVpFUkVYVFJBQ1RPUl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZXRyaWNzU3VtbWFyaXplclBsYXllci5jcHAgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZXRyaWNzU3VtbWFyaXplclBsYXllci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ODJjYjkuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWV0cmljc1N1bW1hcml6ZXJQbGF5ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiTWV0cmljc1N1bW1hcml6ZXJQbGF5ZXIiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KLQotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUFuYWx5dGljc1NlcnZpY2UuaD4KLQotI2luY2x1ZGUgIk1ldHJpY3NTdW1tYXJpemVyLmgiCi0jaW5jbHVkZSAiTWV0cmljc1N1bW1hcml6ZXJQbGF5ZXIuaCIKLQotCi0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgY29uc3QgY2hhciAqcGxheWVyX2lnbm9yYWJsZVtdID0gewotICAgICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmR1cmF0aW9uTXMiLAotICAgICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLnBsYXlpbmdNcyIsCi0gICAgImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZnJhbWVzIiwKLSAgICAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5kcm9wcGVkIiwKLSAgICAwCi19OwotCi1NZXRyaWNzU3VtbWFyaXplclBsYXllcjo6TWV0cmljc1N1bW1hcml6ZXJQbGF5ZXIoY29uc3QgY2hhciAqa2V5KQotICAgIDogTWV0cmljc1N1bW1hcml6ZXIoa2V5KQotewotICAgIEFMT0dWKCJNZXRyaWNzU3VtbWFyaXplclBsYXllcjo6TWV0cmljc1N1bW1hcml6ZXJQbGF5ZXIiKTsKLSAgICBzZXRJZ25vcmFibGVzKHBsYXllcl9pZ25vcmFibGUpOwotfQotCi0vLyBOQjogdGhpcyBpcyBhbHNvIGNhbGxlZCBmb3IgdGhlIGZpcnN0IHRpbWUgLS0gc28gc3VtbWF0aW9uID09IGl0ZW0KLS8vIE5vdCBzdXJlIGlmIHdlIG5lZWQgYSBmbGFnIGZvciB0aGF0IG9yIG5vdC4KLS8vIEluIHRoaXMgcGFydGljdWxhciBtZXJnZVJlY29yZCgpIGNvZGUgLS0gd2UncmUnIG9rIGZvciB0aGlzLgotdm9pZCBNZXRyaWNzU3VtbWFyaXplclBsYXllcjo6bWVyZ2VSZWNvcmQoTWVkaWFBbmFseXRpY3NJdGVtICZzdW1tYXRpb24sIE1lZGlhQW5hbHl0aWNzSXRlbSAmaXRlbSkgewotCi0gICAgQUxPR1YoIk1ldHJpY3NTdW1tYXJpemVyUGxheWVyOjptZXJnZVJlY29yZCgpIik7Ci0KLQotICAgIGludDY0X3QgZHVyYXRpb24gPSAwOwotICAgIGlmIChpdGVtLmdldEludDY0KCJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmR1cmF0aW9uTXMiLCAmZHVyYXRpb24pKSB7Ci0gICAgICAgIEFMT0dWKCJmb3VuZCBkdXJhdGlvbk1zIG9mICUiIFBSSWQ2NCwgZHVyYXRpb24pOwotICAgICAgICBtaW5NYXhWYXI2NChzdW1tYXRpb24sICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmR1cmF0aW9uTXMiLCBkdXJhdGlvbik7Ci0gICAgfQotCi0gICAgaW50NjRfdCBwbGF5aW5nID0gMDsKLSAgICBpZiAoaXRlbS5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5wbGF5aW5nTXMiLCAmcGxheWluZykpIHsKLSAgICAgICAgQUxPR1YoImZvdW5kIHBsYXlpbmdNcyBvZiAlIiBQUklkNjQsIHBsYXlpbmcpOwotICAgIH0KLSAgICBpZiAocGxheWluZyA+PSAwKSB7Ci0gICAgICAgIG1pbk1heFZhcjY0KHN1bW1hdGlvbiwiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5wbGF5aW5nTXMiLHBsYXlpbmcpOwotICAgIH0KLQotICAgIGludDY0X3QgZnJhbWVzID0gMDsKLSAgICBpZiAoaXRlbS5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5mcmFtZXMiLCAmZnJhbWVzKSkgewotICAgICAgICBBTE9HVigiZm91bmQgZnJhbWVzcyBvZiAlIiBQUklkNjQsIGZyYW1lcyk7Ci0gICAgfQotICAgIGlmIChmcmFtZXMgPj0gMCkgewotICAgICAgICBtaW5NYXhWYXI2NChzdW1tYXRpb24sImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZnJhbWVzIixmcmFtZXMpOwotICAgIH0KLQotICAgIGludDY0X3QgZHJvcHBlZCA9IDA7Ci0gICAgaWYgKGl0ZW0uZ2V0SW50NjQoImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZHJvcHBlZCIsICZkcm9wcGVkKSkgewotICAgICAgICBBTE9HVigiZm91bmQgZHJvcHBlZCBvZiAlIiBQUklkNjQsIGRyb3BwZWQpOwotICAgIH0KLSAgICBpZiAoZHJvcHBlZCA+PSAwKSB7Ci0gICAgICAgIG1pbk1heFZhcjY0KHN1bW1hdGlvbiwiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5kcm9wcGVkIixkcm9wcGVkKTsKLSAgICB9Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01ldHJpY3NTdW1tYXJpemVyUGxheWVyLmggYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZXRyaWNzU3VtbWFyaXplclBsYXllci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDFiZjc0Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01ldHJpY3NTdW1tYXJpemVyUGxheWVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0jaWZuZGVmIEFORFJPSURfTUVUUklDU1NVTU1BUklaRVJQTEFZRVJfSAotI2RlZmluZSBBTkRST0lEX01FVFJJQ1NTVU1NQVJJWkVSUExBWUVSX0gKLQotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmg+Ci0jaW5jbHVkZSAiTWV0cmljc1N1bW1hcml6ZXIuaCIKLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIE1ldHJpY3NTdW1tYXJpemVyUGxheWVyIDogcHVibGljIE1ldHJpY3NTdW1tYXJpemVyCi17Ci0KLSBwdWJsaWM6Ci0KLSAgICBNZXRyaWNzU3VtbWFyaXplclBsYXllcihjb25zdCBjaGFyICprZXkpOwotICAgIHZpcnR1YWwgfk1ldHJpY3NTdW1tYXJpemVyUGxheWVyKCkge307Ci0KLSAgICB2aXJ0dWFsIHZvaWQgbWVyZ2VSZWNvcmQoTWVkaWFBbmFseXRpY3NJdGVtICZoYXZlLCBNZWRpYUFuYWx5dGljc0l0ZW0gJmluY29taW5nKTsKLQotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9NRVRSSUNTU1VNTUFSSVpFUlBMQVlFUl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZXRyaWNzU3VtbWFyaXplclJlY29yZGVyLmNwcCBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01ldHJpY3NTdW1tYXJpemVyUmVjb3JkZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjkxOWMzLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01ldHJpY3NTdW1tYXJpemVyUmVjb3JkZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiTWV0cmljc1N1bW1hcml6ZXJSZWNvcmRlciIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgotCi0jaW5jbHVkZSA8bWVkaWEvSU1lZGlhQW5hbHl0aWNzU2VydmljZS5oPgotCi0jaW5jbHVkZSAiTWV0cmljc1N1bW1hcml6ZXIuaCIKLSNpbmNsdWRlICJNZXRyaWNzU3VtbWFyaXplclJlY29yZGVyLmgiCi0KLQotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotTWV0cmljc1N1bW1hcml6ZXJSZWNvcmRlcjo6TWV0cmljc1N1bW1hcml6ZXJSZWNvcmRlcihjb25zdCBjaGFyICprZXkpCi0gICAgOiBNZXRyaWNzU3VtbWFyaXplcihrZXkpCi17Ci0gICAgQUxPR1YoIk1ldHJpY3NTdW1tYXJpemVyUmVjb3JkZXI6Ok1ldHJpY3NTdW1tYXJpemVyUmVjb3JkZXIiKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWV0cmljc1N1bW1hcml6ZXJSZWNvcmRlci5oIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWV0cmljc1N1bW1hcml6ZXJSZWNvcmRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjNiYWFiLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01ldHJpY3NTdW1tYXJpemVyUmVjb3JkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLSNpZm5kZWYgQU5EUk9JRF9NRVRSSUNTU1VNTUFSSVpFUlJFQ09SREVSX0gKLSNkZWZpbmUgQU5EUk9JRF9NRVRSSUNTU1VNTUFSSVpFUlJFQ09SREVSX0gKLQotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmg+Ci0jaW5jbHVkZSAiTWV0cmljc1N1bW1hcml6ZXIuaCIKLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIE1ldHJpY3NTdW1tYXJpemVyUmVjb3JkZXIgOiBwdWJsaWMgTWV0cmljc1N1bW1hcml6ZXIKLXsKLQotIHB1YmxpYzoKLQotICAgIE1ldHJpY3NTdW1tYXJpemVyUmVjb3JkZXIoY29uc3QgY2hhciAqa2V5KTsKLSAgICB2aXJ0dWFsIH5NZXRyaWNzU3VtbWFyaXplclJlY29yZGVyKCkge307Ci0KLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfTUVUUklDU1NVTU1BUklaRVJSRUNPUkRFUl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9PV05FUlMgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFmMjU4YgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL09XTkVSUwpAQCAtMCwwICsxIEBACitlc3NpY2tAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLm1rIGIvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLm1rCmluZGV4IGZhZWIwYTcuLjg2MzFjMzkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhY29kZWMvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL0FuZHJvaWQubWsKQEAgLTEsMzEgKzEsNDEgQEAKIExPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKIAotIyBzZXJ2aWNlIGxpYnJhcnkKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfU1JDX0ZJTEVTIDo9IE1lZGlhQ29kZWNTZXJ2aWNlLmNwcAotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgbGlibWVkaWFfb214IFwKLSAgICBsaWJiaW5kZXIgXAotICAgIGxpYmd1aSBcCi0gICAgbGlidXRpbHMgXAotICAgIGxpYmxvZyBcCi0gICAgbGlic3RhZ2VmcmlnaHRfb214IFwKLSAgICBsaWJzdGFnZWZyaWdodF94bWxwYXJzZXIKLUxPQ0FMX01PRFVMRTo9IGxpYm1lZGlhY29kZWNzZXJ2aWNlCi1MT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKLUxPQ0FMXzMyX0JJVF9PTkxZIDo9IHRydWUKLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKK19zb2Z0d2FyZV9jb2RlY3MgOj0gXAorICAgIGxpYnN0YWdlZnJpZ2h0X3NvZnRfYWFjZGVjIFwKKyAgICBsaWJzdGFnZWZyaWdodF9zb2Z0X2FhY2VuYyBcCisgICAgbGlic3RhZ2VmcmlnaHRfc29mdF9hbXJkZWMgXAorICAgIGxpYnN0YWdlZnJpZ2h0X3NvZnRfYW1ybmJlbmMgXAorICAgIGxpYnN0YWdlZnJpZ2h0X3NvZnRfYW1yd2JlbmMgXAorICAgIGxpYnN0YWdlZnJpZ2h0X3NvZnRfYXZjZGVjIFwKKyAgICBsaWJzdGFnZWZyaWdodF9zb2Z0X2F2Y2VuYyBcCisgICAgbGlic3RhZ2VmcmlnaHRfc29mdF9mbGFjZGVjIFwKKyAgICBsaWJzdGFnZWZyaWdodF9zb2Z0X2ZsYWNlbmMgXAorICAgIGxpYnN0YWdlZnJpZ2h0X3NvZnRfZzcxMWRlYyBcCisgICAgbGlic3RhZ2VmcmlnaHRfc29mdF9nc21kZWMgXAorICAgIGxpYnN0YWdlZnJpZ2h0X3NvZnRfaGV2Y2RlYyBcCisgICAgbGlic3RhZ2VmcmlnaHRfc29mdF9tcDNkZWMgXAorICAgIGxpYnN0YWdlZnJpZ2h0X3NvZnRfbXBlZzJkZWMgXAorICAgIGxpYnN0YWdlZnJpZ2h0X3NvZnRfbXBlZzRkZWMgXAorICAgIGxpYnN0YWdlZnJpZ2h0X3NvZnRfbXBlZzRlbmMgXAorICAgIGxpYnN0YWdlZnJpZ2h0X3NvZnRfb3B1c2RlYyBcCisgICAgbGlic3RhZ2VmcmlnaHRfc29mdF9yYXdkZWMgXAorICAgIGxpYnN0YWdlZnJpZ2h0X3NvZnRfdm9yYmlzZGVjIFwKKyAgICBsaWJzdGFnZWZyaWdodF9zb2Z0X3ZweGRlYyBcCisgICAgbGlic3RhZ2VmcmlnaHRfc29mdF92cHhlbmMgXAogCiAjIHNlcnZpY2UgZXhlY3V0YWJsZQogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisjIHNlY2NvbXAgaXMgbm90IHJlcXVpcmVkIGZvciBjb3ZlcmFnZSBidWlsZC4KK2lmbmVxICgkKE5BVElWRV9DT1ZFUkFHRSksdHJ1ZSkKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gY3Jhc2hfZHVtcC5wb2xpY3kKIExPQ0FMX1JFUVVJUkVEX01PRFVMRVNfYXJtIDo9IG1lZGlhY29kZWMucG9saWN5CitMT0NBTF9SRVFVSVJFRF9NT0RVTEVTX3g4NiA6PSBtZWRpYWNvZGVjLnBvbGljeQorZW5kaWYKIExPQ0FMX1NSQ19GSUxFUyA6PSBtYWluX2NvZGVjc2VydmljZS5jcHAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICAgIGxpYm1lZGlhX29teCBcCi0gICAgbGlibWVkaWFjb2RlY3NlcnZpY2UgXAogICAgIGxpYmJpbmRlciBcCiAgICAgbGlidXRpbHMgXAotICAgIGxpYmd1aSBcCiAgICAgbGlibG9nIFwKICAgICBsaWJiYXNlIFwKICAgICBsaWJhdnNlcnZpY2VzX21pbmlqYWlsX3ZlbmRvciBcCkBAIC00MSwxMSArNTEsMjEgQEAKIExPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IGh3CiBMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKIExPQ0FMXzMyX0JJVF9PTkxZIDo9IHRydWUKKyMgU2luY2UgdGhpcyBpcyAzMi1iaXQtb25seSBtb2R1bGUsIG9ubHkgMzItYml0IHZlcnNpb24gb2YgdGhlIGNvZGVjcyBhcmUgaW5zdGFsbGVkLgorIyBUT0RPKGIvNzIzNDM1MDcpOiBlbGltaW5hdGUgdGhlIG5lZWQgZm9yIG1hbnVhbGx5IGFkZGluZyAudmVuZG9yIHN1ZmZpeC4gVGhpcyBzaG91bGQgYmUgZG9uZQorIyBieSB0aGUgYnVpbGQgc3lzdGVtLgorTE9DQUxfUkVRVUlSRURfTU9EVUxFUyArPSBcCiskKGZvcmVhY2ggY29kZWMsJChfc29mdHdhcmVfY29kZWNzKSxcCisgICQoZXZhbCBfdmVuZG9yX3N1ZmZpeCA6PSAkKGlmICQoQk9BUkRfVk5ES19WRVJTSU9OKSwudmVuZG9yKSlcCisgICQoY29kZWMpJChfdmVuZG9yX3N1ZmZpeClcCispCitfc29mdHdhcmVfY29kZWNzIDo9CiBMT0NBTF9JTklUX1JDIDo9IGFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMC1zZXJ2aWNlLnJjCisKIGluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQogCiAjIHNlcnZpY2Ugc2VjY29tcCBwb2xpY3kKLWlmZXEgKCQoVEFSR0VUX0FSQ0gpLCAkKGZpbHRlciAkKFRBUkdFVF9BUkNIKSwgYXJtIGFybTY0KSkKK2lmZXEgKCQoVEFSR0VUX0FSQ0gpLCAkKGZpbHRlciAkKFRBUkdFVF9BUkNIKSwgeDg2IHg4Nl82NCBhcm0gYXJtNjQpKQogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiBMT0NBTF9NT0RVTEUgOj0gbWVkaWFjb2RlYy5wb2xpY3kKIExPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKQEAgLTUzLDcgKzczLDExIEBACiAjIG1lZGlhY29kZWMgcnVucyBpbiAzMi1iaXQgY29tYmF0aWJpbGl0eSBtb2RlLiBGb3IgNjQgYml0IGFyY2hpdGVjdHVyZXMsCiAjIHVzZSB0aGUgMzIgYml0IHBvbGljeQogaWZkZWYgVEFSR0VUXzJORF9BUkNICisgIGlmbmVxICgkKFRBUkdFVF9UUkFOU0xBVEVfMk5EX0FSQ0gpLHRydWUpCiAgICAgTE9DQUxfU1JDX0ZJTEVTIDo9IHNlY2NvbXBfcG9saWN5L21lZGlhY29kZWMtJChUQVJHRVRfMk5EX0FSQ0gpLnBvbGljeQorICBlbHNlCisgICAgTE9DQUxfU1JDX0ZJTEVTIDo9IHNlY2NvbXBfcG9saWN5L21lZGlhY29kZWMtJChUQVJHRVRfQVJDSCkucG9saWN5CisgIGVuZGlmCiBlbHNlCiAgICAgTE9DQUxfU1JDX0ZJTEVTIDo9IHNlY2NvbXBfcG9saWN5L21lZGlhY29kZWMtJChUQVJHRVRfQVJDSCkucG9saWN5CiBlbmRpZgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9NZWRpYUNvZGVjU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL01lZGlhQ29kZWNTZXJ2aWNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI1MTBjNi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL01lZGlhQ29kZWNTZXJ2aWNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIk1lZGlhQ29kZWNTZXJ2aWNlIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiTWVkaWFDb2RlY1NlcnZpY2UuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zcDxJT01YPiBNZWRpYUNvZGVjU2VydmljZTo6Z2V0T01YKCkgewotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1PTVhMb2NrKTsKLQotICAgIGlmIChtT01YLmdldCgpID09IE5VTEwpIHsKLSAgICAgICAgbU9NWCA9IG5ldyBPTVgoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbU9NWDsKLX0KLQotc3A8SU9NWFN0b3JlPiBNZWRpYUNvZGVjU2VydmljZTo6Z2V0T01YU3RvcmUoKSB7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU9NWFN0b3JlTG9jayk7Ci0KLSAgICBpZiAobU9NWFN0b3JlLmdldCgpID09IE5VTEwpIHsKLSAgICAgICAgbU9NWFN0b3JlID0gbmV3IE9NWFN0b3JlKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1PTVhTdG9yZTsKLX0KLQotc3RhdHVzX3QgTWVkaWFDb2RlY1NlcnZpY2U6Om9uVHJhbnNhY3QodWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LAotICAgICAgICB1aW50MzJfdCBmbGFncykKLXsKLSAgICByZXR1cm4gQm5NZWRpYUNvZGVjU2VydmljZTo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwotfQotCi19ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvTWVkaWFDb2RlY1NlcnZpY2UuaCBiL3NlcnZpY2VzL21lZGlhY29kZWMvTWVkaWFDb2RlY1NlcnZpY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMwMTEzNS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL01lZGlhQ29kZWNTZXJ2aWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX01FRElBX0NPREVDX1NFUlZJQ0VfSAotI2RlZmluZSBBTkRST0lEX01FRElBX0NPREVDX1NFUlZJQ0VfSAotCi0jaW5jbHVkZSA8YmluZGVyL0JpbmRlclNlcnZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFDb2RlY1NlcnZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFN0b3JlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgTWVkaWFDb2RlY1NlcnZpY2UgOiBwdWJsaWMgQmluZGVyU2VydmljZTxNZWRpYUNvZGVjU2VydmljZT4sCi0gICAgICAgIHB1YmxpYyBCbk1lZGlhQ29kZWNTZXJ2aWNlCi17Ci0gICAgZnJpZW5kIGNsYXNzIEJpbmRlclNlcnZpY2U8TWVkaWFDb2RlY1NlcnZpY2U+OyAgICAvLyBmb3IgTWVkaWFDb2RlY1NlcnZpY2UoKQotcHVibGljOgotICAgIE1lZGlhQ29kZWNTZXJ2aWNlKCkgOiBCbk1lZGlhQ29kZWNTZXJ2aWNlKCkgeyB9Ci0gICAgdmlydHVhbCB+TWVkaWFDb2RlY1NlcnZpY2UoKSB7IH0KLSAgICB2aXJ0dWFsIHZvaWQgb25GaXJzdFJlZigpIHsgfQotCi0gICAgc3RhdGljIGNvbnN0IGNoYXIqICAgIGdldFNlcnZpY2VOYW1lKCkgeyByZXR1cm4gIm1lZGlhLmNvZGVjIjsgfQotCi0gICAgdmlydHVhbCBzcDxJT01YPiAgICAgIGdldE9NWCgpOwotCi0gICAgdmlydHVhbCBzcDxJT01YU3RvcmU+IGdldE9NWFN0b3JlKCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgb25UcmFuc2FjdCh1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpOwotCi1wcml2YXRlOgotICAgIE11dGV4ICAgICAgICAgICAgICAgICBtT01YTG9jazsKLSAgICBzcDxJT01YPiAgICAgICAgICAgICAgbU9NWDsKLSAgICBNdXRleCAgICAgICAgICAgICAgICAgbU9NWFN0b3JlTG9jazsKLSAgICBzcDxJT01YU3RvcmU+ICAgICAgICAgbU9NWFN0b3JlOwotfTsKLQotfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9DT0RFQ19TRVJWSUNFX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wLXNlcnZpY2UucmMgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL2FuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMC1zZXJ2aWNlLnJjCmluZGV4IGVjNTFkNjUuLjNlZjlhODUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhY29kZWMvYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wLXNlcnZpY2UucmMKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAtc2VydmljZS5yYwpAQCAtMSw0ICsxLDQgQEAKLXNlcnZpY2UgbWVkaWFjb2RlYyAvdmVuZG9yL2Jpbi9ody9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAtc2VydmljZQorc2VydmljZSB2ZW5kb3IubWVkaWEub214IC92ZW5kb3IvYmluL2h3L2FuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMC1zZXJ2aWNlCiAgICAgY2xhc3MgbWFpbgogICAgIHVzZXIgbWVkaWFjb2RlYwogICAgIGdyb3VwIGNhbWVyYSBkcm1ycGMgbWVkaWFkcm0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvbWFpbl9jb2RlY3NlcnZpY2UuY3BwIGIvc2VydmljZXMvbWVkaWFjb2RlYy9tYWluX2NvZGVjc2VydmljZS5jcHAKaW5kZXggNzlkNmRhNS4uNTE2MTlmNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFjb2RlYy9tYWluX2NvZGVjc2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9tYWluX2NvZGVjc2VydmljZS5jcHAKQEAgLTE1LDI2ICsxNSwxOSBAQAogKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwogCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLQotI2luY2x1ZGUgPHN0cmluZz4KLQogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CiAKIC8vIGZyb20gTE9DQUxfQ19JTkNMVURFUwotI2luY2x1ZGUgIk1lZGlhQ29kZWNTZXJ2aWNlLmgiCiAjaW5jbHVkZSAibWluaWphaWwuaCIKIAorI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KICNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9PbXguaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL09teFN0b3JlLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9Db2RlY1NlcnZpY2VSZWdpc3RyYW50Lmg+CisjaW5jbHVkZSA8ZGxmY24uaD4KKwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKIC8vIE11c3QgbWF0Y2ggbG9jYXRpb24gaW4gQW5kcm9pZC5tay4KQEAgLTQ1LDIxICszOCwzMiBAQAogCiBpbnQgbWFpbihpbnQgYXJnYyBfX3VudXNlZCwgY2hhcioqIGFyZ3YpCiB7CisgICAgc3RyY3B5KGFyZ3ZbMF0sICJtZWRpYS5jb2RlYyIpOwogICAgIExPRyhJTkZPKSA8PCAibWVkaWFjb2RlY3NlcnZpY2Ugc3RhcnRpbmciOwotICAgIGJvb2wgdHJlYmxlID0gcHJvcGVydHlfZ2V0X2Jvb2woInBlcnNpc3QubWVkaWEudHJlYmxlX29teCIsIHRydWUpOwotICAgIGlmICh0cmVibGUpIHsKLSAgICAgIGFuZHJvaWQ6OlByb2Nlc3NTdGF0ZTo6aW5pdFdpdGhEcml2ZXIoIi9kZXYvdm5kYmluZGVyIik7Ci0gICAgfQotCiAgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOwogICAgIFNldFVwTWluaWphaWwoa1N5c3RlbVNlY2NvbXBQb2xpY3lQYXRoLCBrVmVuZG9yU2VjY29tcFBvbGljeVBhdGgpOwogCi0gICAgc3RyY3B5KGFyZ3ZbMF0sICJtZWRpYS5jb2RlYyIpOworICAgIGFuZHJvaWQ6OlByb2Nlc3NTdGF0ZTo6aW5pdFdpdGhEcml2ZXIoIi9kZXYvdm5kYmluZGVyIik7CisgICAgYW5kcm9pZDo6UHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwogCiAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29uZmlndXJlUnBjVGhyZWFkcG9vbCg2NCwgZmFsc2UpOwotICAgIHNwPFByb2Nlc3NTdGF0ZT4gcHJvYyhQcm9jZXNzU3RhdGU6OnNlbGYoKSk7CiAKLSAgICBpZiAodHJlYmxlKSB7CisgICAgLy8gUmVnaXN0cmF0aW9uIG9mIGN1c3RvbWl6ZWQgY29kZWMgc2VydmljZXMKKyAgICB2b2lkICpyZWdpc3RyYW50TGliID0gZGxvcGVuKAorICAgICAgICAgICAgImxpYm1lZGlhX2NvZGVjc2VydmljZXJlZ2lzdHJhbnQuc28iLAorICAgICAgICAgICAgUlRMRF9OT1cgfCBSVExEX0xPQ0FMKTsKKyAgICBpZiAocmVnaXN0cmFudExpYikgeworICAgICAgICBSZWdpc3RlckNvZGVjU2VydmljZXNGdW5jIHJlZ2lzdGVyQ29kZWNTZXJ2aWNlcyA9CisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxSZWdpc3RlckNvZGVjU2VydmljZXNGdW5jPigKKyAgICAgICAgICAgICAgICBkbHN5bShyZWdpc3RyYW50TGliLCAiUmVnaXN0ZXJDb2RlY1NlcnZpY2VzIikpOworICAgICAgICBpZiAocmVnaXN0ZXJDb2RlY1NlcnZpY2VzKSB7CisgICAgICAgICAgICByZWdpc3RlckNvZGVjU2VydmljZXMoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiQ2Fubm90IHJlZ2lzdGVyIGFkZGl0aW9uYWwgc2VydmljZXMgIgorICAgICAgICAgICAgICAgICAgICAiLS0gY29ycnVwdGVkIGxpYnJhcnkuIjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIERlZmF1bHQgY29kZWMgc2VydmljZXMKICAgICAgICAgdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA7CiAgICAgICAgIHNwPElPbXhTdG9yZT4gb214U3RvcmUgPSBuZXcgaW1wbGVtZW50YXRpb246Ok9teFN0b3JlKCk7CiAgICAgICAgIGlmIChvbXhTdG9yZSA9PSBudWxscHRyKSB7CkBAIC03MywxMyArNzcsOSBAQAogICAgICAgICB9IGVsc2UgaWYgKG9teC0+cmVnaXN0ZXJBc1NlcnZpY2UoKSAhPSBPSykgewogICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IHJlZ2lzdGVyIElPbXggSEFMIHNlcnZpY2UuIjsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiVHJlYmxlIE9NWCBzZXJ2aWNlIGNyZWF0ZWQuIjsKKyAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiSU9teCBIQUwgc2VydmljZSBjcmVhdGVkLiI7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBNZWRpYUNvZGVjU2VydmljZTo6aW5zdGFudGlhdGUoKTsKLSAgICAgICAgTE9HKElORk8pIDw8ICJOb24tVHJlYmxlIE9NWCBzZXJ2aWNlIGNyZWF0ZWQuIjsKICAgICB9CiAKLSAgICBQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7Ci0gICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+am9pblRocmVhZFBvb2woKTsKKyAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpqb2luUnBjVGhyZWFkcG9vbCgpOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYWNvZGVjLWFybS5wb2xpY3kgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhY29kZWMtYXJtLnBvbGljeQppbmRleCBjYmQ3ZmI5Li42ZWM4ODk1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhY29kZWMtYXJtLnBvbGljeQorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhY29kZWMtYXJtLnBvbGljeQpAQCAtNTMsMTggKzUzLDYgQEAKIGZzdGF0YXQ2NDogMQogdWdldHJsaW1pdDogMQogZ2V0ZGVudHM2NDogMQorZ2V0cmFuZG9tOiAxCiAKLSMgZm9yIGF0dGFjaGluZyB0byBkZWJ1Z2dlcmQgb24gcHJvY2VzcyBjcmFzaAotc2lnYWN0aW9uOiAxCi10Z2tpbGw6IDEKLXNvY2tldDogMQotY29ubmVjdDogMQotZmNudGw2NDogMQotcnRfdGdzaWdxdWV1ZWluZm86IDEKLWdldGV1aWQzMjogMQotZ2V0Z2lkMzI6IDEKLWdldGVnaWQzMjogMQotZ2V0Z3JvdXBzMzI6IDEKLXJlY3Ztc2c6IDEKLWdldHBpZDogMQotZ2V0dGlkOiAxCitAaW5jbHVkZSAvc3lzdGVtL2V0Yy9zZWNjb21wX3BvbGljeS9jcmFzaF9kdW1wLmFybS5wb2xpY3kKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFjb2RlYy14ODYucG9saWN5IGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYWNvZGVjLXg4Ni5wb2xpY3kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJiZTU1MgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFjb2RlYy14ODYucG9saWN5CkBAIC0wLDAgKzEsNTggQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3JlYWQ6IDEKK21wcm90ZWN0OiAxCitwcmN0bDogMQorb3BlbmF0OiAxCitvcGVuOiAxCitnZXR1aWQzMjogMQord3JpdGV2OiAxCitpb2N0bDogMQorY2xvc2U6IDEKK21tYXAyOiAxCitmc3RhdDY0OiAxCitzdGF0NjQ6IDEKK21hZHZpc2U6IDEKK2ZzdGF0YXQ2NDogMQorZnV0ZXg6IDEKK211bm1hcDogMQorZmFjY2Vzc2F0OiAxCitfbGxzZWVrOiAxCitsc2VlazogMQorY2xvbmU6IDEKK3NpZ2FsdHN0YWNrOiAxCitzZXRwcmlvcml0eTogMQorcmVzdGFydF9zeXNjYWxsOiAxCitleGl0OiAxCitleGl0X2dyb3VwOiAxCitydF9zaWdyZXR1cm46IDEKK3VnZXRybGltaXQ6IDEKK3JlYWRsaW5rYXQ6IDEKK19sbHNlZWs6IDEKK2ZzdGF0ZnM2NDogMQorcHJlYWQ2NDogMQorbXJlbWFwOiAxCitkdXA6IDEKK3NldF90aWRfYWRkcmVzczogMQord3JpdGU6IDEKK25hbm9zbGVlcDogMQorCisjIFJlcXVpcmVkIGJ5IEFkZHJlc3NTYW5pdGl6ZXIKK2dldHRpZDogMQorc2NoZWRfeWllbGQ6IDEKK2dldHBpZDogMQorZ2V0dGlkOiAxCisKK0BpbmNsdWRlIC9zeXN0ZW0vZXRjL3NlY2NvbXBfcG9saWN5L2NyYXNoX2R1bXAueDg2LnBvbGljeQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFkcm0vQW5kcm9pZC5tayBiL3NlcnZpY2VzL21lZGlhZHJtL0FuZHJvaWQubWsKaW5kZXggMmRhYTgyOS4uZTg3MDk2NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFkcm0vQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9tZWRpYWRybS9BbmRyb2lkLm1rCkBAIC0yOCw3ICsyOCw4IEBACiAgICAgbGliaGlkbGJhc2UgXAogICAgIGxpYmhpZGxtZW1vcnkgXAogICAgIGxpYmhpZGx0cmFuc3BvcnQgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMAorICAgIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMCBcCisgICAgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xCiAKIExPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2V4dHJhIC1XZXJyb3IKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFkcm0vTWVkaWFEcm1TZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhZHJtL01lZGlhRHJtU2VydmljZS5jcHAKaW5kZXggYTM2OGMxMS4uNWFmZDA3OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFkcm0vTWVkaWFEcm1TZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYWRybS9NZWRpYURybVNlcnZpY2UuY3BwCkBAIC0yNCw4ICsyNCw4IEBACiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSA8bWVkaWEvQ3J5cHRvSGFsLmg+Ci0jaW5jbHVkZSA8bWVkaWEvRHJtSGFsLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vQ3J5cHRvSGFsLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vRHJtSGFsLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFkcm0vTWVkaWFEcm1TZXJ2aWNlLmggYi9zZXJ2aWNlcy9tZWRpYWRybS9NZWRpYURybVNlcnZpY2UuaAppbmRleCBlY2MyZGE3Li4zNjA3MjAxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWRybS9NZWRpYURybVNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9tZWRpYWRybS9NZWRpYURybVNlcnZpY2UuaApAQCAtMjQsNyArMjQsNyBAQAogCiAjaW5jbHVkZSA8bWVkaWEvTWV0YWRhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSU1lZGlhRHJtU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0lNZWRpYURybVNlcnZpY2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9BbmRyb2lkLm1rIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvQW5kcm9pZC5tawppbmRleCAxZWJiN2ZmLi43YzY1MjdmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL0FuZHJvaWQubWsKQEAgLTIsNyArMiwxMSBAQAogCiAjIHNlcnZpY2UgbGlicmFyeQogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9TUkNfRklMRVMgOj0gTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcAorTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcCBcCisgICAgTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmNwcCBcCisKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGlibWVkaWEgbGlic3RhZ2VmcmlnaHQgbGliYmluZGVyIGxpYnV0aWxzIGxpYmxvZwogTE9DQUxfTU9EVUxFOj0gbGlibWVkaWFleHRyYWN0b3JzZXJ2aWNlCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCkBAIC0xMSw5ICsxNSwyNCBAQAogIyBzZXJ2aWNlIGV4ZWN1dGFibGUKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogIyBzZWNjb21wIGZpbHRlcnMgYXJlIGRlZmluZWQgZm9yIHRoZSBmb2xsb3dpbmcgYXJjaGl0ZWN0dXJlczoKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gY3Jhc2hfZHVtcC5wb2xpY3kKIExPQ0FMX1JFUVVJUkVEX01PRFVMRVNfYXJtIDo9IG1lZGlhZXh0cmFjdG9yLnBvbGljeQogTE9DQUxfUkVRVUlSRURfTU9EVUxFU19hcm02NCA6PSBtZWRpYWV4dHJhY3Rvci5wb2xpY3kKIExPQ0FMX1JFUVVJUkVEX01PRFVMRVNfeDg2IDo9IG1lZGlhZXh0cmFjdG9yLnBvbGljeQorCisjIGV4dHJhY3RvciBsaWJyYXJpZXMKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVMgKz0gXAorICAgIGxpYmFhY2V4dHJhY3RvciBcCisgICAgbGliYW1yZXh0cmFjdG9yIFwKKyAgICBsaWJmbGFjZXh0cmFjdG9yIFwKKyAgICBsaWJtaWRpZXh0cmFjdG9yIFwKKyAgICBsaWJta3ZleHRyYWN0b3IgXAorICAgIGxpYm1wM2V4dHJhY3RvciBcCisgICAgbGlibXA0ZXh0cmFjdG9yIFwKKyAgICBsaWJtcGVnMmV4dHJhY3RvciBcCisgICAgbGlib2dnZXh0cmFjdG9yIFwKKyAgICBsaWJ3YXZleHRyYWN0b3IgXAorCiBMT0NBTF9TUkNfRklMRVMgOj0gbWFpbl9leHRyYWN0b3JzZXJ2aWNlLmNwcAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJtZWRpYSBsaWJtZWRpYWV4dHJhY3RvcnNlcnZpY2UgbGliYmluZGVyIGxpYnV0aWxzIFwKICAgICBsaWJsb2cgbGliYmFzZSBsaWJpY3V1YyBsaWJhdnNlcnZpY2VzX21pbmlqYWlsCkBAIC0yMSwxMCArNDAsMTEgQEAKIExPQ0FMX01PRFVMRTo9IG1lZGlhZXh0cmFjdG9yCiBMT0NBTF9JTklUX1JDIDo9IG1lZGlhZXh0cmFjdG9yLnJjCiBMT0NBTF9DX0lOQ0xVREVTIDo9IGZyYW1ld29ya3MvYXYvbWVkaWEvbGlibWVkaWEKK0xPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKIAogIyBzZXJ2aWNlIHNlY2NvbXAgZmlsdGVyCi1pZmVxICgkKFRBUkdFVF9BUkNIKSwgJChmaWx0ZXIgJChUQVJHRVRfQVJDSCksIGFybSBhcm02NCB4ODYpKQoraWZlcSAoJChUQVJHRVRfQVJDSCksICQoZmlsdGVyICQoVEFSR0VUX0FSQ0gpLCBhcm0gYXJtNjQgeDg2IHg4Nl82NCkpCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIExPQ0FMX01PRFVMRSA6PSBtZWRpYWV4dHJhY3Rvci5wb2xpY3kKIExPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwCmluZGV4IDA4Y2JlZjYuLmYwZjQ0ZjUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcApAQCAtMjAsOCArMjAsMTEgQEAKIAogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZUZhY3RvcnkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZURhdGFTb3VyY2UuaD4KICNpbmNsdWRlICJNZWRpYUV4dHJhY3RvclNlcnZpY2UuaCIKIApAQCAtMzEsMjkgKzM0LDI5IEBACiAgICAgICAgIGNvbnN0IHNwPElEYXRhU291cmNlPiAmcmVtb3RlU291cmNlLCBjb25zdCBjaGFyICptaW1lKSB7CiAgICAgQUxPR1YoIkBAQCBNZWRpYUV4dHJhY3RvclNlcnZpY2U6Om1ha2VFeHRyYWN0b3IgZm9yICVzIiwgbWltZSk7CiAKLSAgICBzcDxEYXRhU291cmNlPiBsb2NhbFNvdXJjZSA9IERhdGFTb3VyY2U6OkNyZWF0ZUZyb21JRGF0YVNvdXJjZShyZW1vdGVTb3VyY2UpOworICAgIHNwPERhdGFTb3VyY2U+IGxvY2FsU291cmNlID0gQ3JlYXRlRGF0YVNvdXJjZUZyb21JRGF0YVNvdXJjZShyZW1vdGVTb3VyY2UpOwogCi0gICAgc3A8SU1lZGlhRXh0cmFjdG9yPiByZXQgPSBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRlRnJvbVNlcnZpY2UobG9jYWxTb3VyY2UsIG1pbWUpOworICAgIHNwPElNZWRpYUV4dHJhY3Rvcj4gZXh0cmFjdG9yID0gTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpDcmVhdGVGcm9tU2VydmljZShsb2NhbFNvdXJjZSwgbWltZSk7CiAKICAgICBBTE9HVigiZXh0cmFjdG9yIHNlcnZpY2UgY3JlYXRlZCAlcCAoJXMpIiwKLSAgICAgICAgICAgIHJldC5nZXQoKSwKLSAgICAgICAgICAgIHJldCA9PSBOVUxMID8gIiIgOiByZXQtPm5hbWUoKSk7CisgICAgICAgICAgICBleHRyYWN0b3IuZ2V0KCksCisgICAgICAgICAgICBleHRyYWN0b3IgPT0gbnVsbHB0ciA/ICIiIDogZXh0cmFjdG9yLT5uYW1lKCkpOwogCi0gICAgaWYgKHJldCAhPSBOVUxMKSB7Ci0gICAgICAgIHJlZ2lzdGVyTWVkaWFFeHRyYWN0b3IocmV0LCBsb2NhbFNvdXJjZSwgbWltZSk7CisgICAgaWYgKGV4dHJhY3RvciAhPSBudWxscHRyKSB7CisgICAgICAgIHJlZ2lzdGVyTWVkaWFFeHRyYWN0b3IoZXh0cmFjdG9yLCBsb2NhbFNvdXJjZSwgbWltZSk7CisgICAgICAgIHJldHVybiBleHRyYWN0b3I7CiAgICAgfQotCi0gICAgcmV0dXJuIHJldDsKKyAgICByZXR1cm4gbnVsbHB0cjsKIH0KIAogc3A8SURhdGFTb3VyY2U+IE1lZGlhRXh0cmFjdG9yU2VydmljZTo6bWFrZUlEYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKQogewotICAgIHNwPERhdGFTb3VyY2U+IHNvdXJjZSA9IERhdGFTb3VyY2U6OkNyZWF0ZUZyb21GZChmZCwgb2Zmc2V0LCBsZW5ndGgpOwotICAgIHJldHVybiBzb3VyY2UuZ2V0KCkgIT0gbnVsbHB0ciA/IHNvdXJjZS0+YXNJRGF0YVNvdXJjZSgpIDogbnVsbHB0cjsKKyAgICBzcDxEYXRhU291cmNlPiBzb3VyY2UgPSBEYXRhU291cmNlRmFjdG9yeTo6Q3JlYXRlRnJvbUZkKGZkLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgcmV0dXJuIENyZWF0ZUlEYXRhU291cmNlRnJvbURhdGFTb3VyY2Uoc291cmNlKTsKIH0KIAogc3RhdHVzX3QgTWVkaWFFeHRyYWN0b3JTZXJ2aWNlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgewotICAgIHJldHVybiBkdW1wRXh0cmFjdG9ycyhmZCwgYXJncyk7CisgICAgcmV0dXJuIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6ZHVtcChmZCwgYXJncykgfHwgZHVtcEV4dHJhY3RvcnMoZmQsIGFyZ3MpOwogfQogCiBzdGF0dXNfdCBNZWRpYUV4dHJhY3RvclNlcnZpY2U6Om9uVHJhbnNhY3QodWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDczYTY5OAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5jcHAKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UiCisjZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CisKKyNpbmNsdWRlICJNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKKworYmluZGVyOjpTdGF0dXMgTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlOjpsb2FkUGx1Z2lucyhjb25zdCA6OnN0ZDo6c3RyaW5nJiBhcGtQYXRoKSB7CisgICAgQUxPR1YoImxvYWRQbHVnaW5zICVzIiwgYXBrUGF0aC5jX3N0cigpKTsKKyAgICBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OkxvYWRQbHVnaW5zKGFwa1BhdGgpOworICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKworfSAgIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuaCBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMTVmNmQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuaApAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfRVhUUkFDVE9SX1VQREFURV9TRVJWSUNFX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9FWFRSQUNUT1JfVVBEQVRFX1NFUlZJQ0VfSAorCisjaW5jbHVkZSA8YmluZGVyL0JpbmRlclNlcnZpY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0JuTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CisKK2NsYXNzIE1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZQorICAgIDogcHVibGljIEJpbmRlclNlcnZpY2U8TWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlPiwgcHVibGljIEJuTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlCit7CisgICAgZnJpZW5kIGNsYXNzIEJpbmRlclNlcnZpY2U8TWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlPjsKK3B1YmxpYzoKKyAgICBNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UoKSA6IEJuTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlKCkgeyB9CisgICAgdmlydHVhbCB+TWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlKCkgeyB9CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGdldFNlcnZpY2VOYW1lKCkgeyByZXR1cm4gIm1lZGlhLmV4dHJhY3Rvci51cGRhdGUiOyB9CisgICAgYmluZGVyOjpTdGF0dXMgbG9hZFBsdWdpbnMoY29uc3QgOjpzdGQ6OnN0cmluZyYgYXBrUGF0aCk7Cit9OworCit9ICAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX01FRElBX0VYVFJBQ1RPUl9VUERBVEVfU0VSVklDRV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9tYWluX2V4dHJhY3RvcnNlcnZpY2UuY3BwIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvbWFpbl9leHRyYWN0b3JzZXJ2aWNlLmNwcAppbmRleCA2YTUzMjBkLi44ZDMzNTlhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9tYWluX2V4dHJhY3RvcnNlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL21haW5fZXh0cmFjdG9yc2VydmljZS5jcHAKQEAgLTI1LDExICsyNSwxMyBAQAogI2luY2x1ZGUgPHN0cmluZz4KIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDx1dGlscy9taXNjLmg+CiAKIC8vIGZyb20gTE9DQUxfQ19JTkNMVURFUwogI2luY2x1ZGUgIkljdVV0aWxzLmgiCiAjaW5jbHVkZSAiTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmgiCisjaW5jbHVkZSAiTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmgiCiAjaW5jbHVkZSAiTWVkaWFVdGlscy5oIgogI2luY2x1ZGUgIm1pbmlqYWlsLmgiCiAKQEAgLTYzLDYgKzY1LDEyIEBACiAgICAgc3A8UHJvY2Vzc1N0YXRlPiBwcm9jKFByb2Nlc3NTdGF0ZTo6c2VsZigpKTsKICAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CiAgICAgTWVkaWFFeHRyYWN0b3JTZXJ2aWNlOjppbnN0YW50aWF0ZSgpOworCisgICAgc3RkOjpzdHJpbmcgdmFsdWUgPSBiYXNlOjpHZXRQcm9wZXJ0eSgicm8uYnVpbGQudHlwZSIsICJ1bmtub3duIik7CisgICAgaWYgKHZhbHVlID09ICJ1c2VyZGVidWciIHx8IHZhbHVlID09ICJlbmciKSB7CisgICAgICAgIG1lZGlhOjpNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2U6Omluc3RhbnRpYXRlKCk7CisgICAgfQorCiAgICAgUHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwogICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmpvaW5UaHJlYWRQb29sKCk7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9zZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci1hcm0ucG9saWN5IGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3Ivc2VjY29tcF9wb2xpY3kvbWVkaWFleHRyYWN0b3ItYXJtLnBvbGljeQppbmRleCAyM2QzNDlkLi44NzAxOGVkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9zZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci1hcm0ucG9saWN5CisrKyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL3NlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLWFybS5wb2xpY3kKQEAgLTM5LDI1ICszOSwxMyBAQAogZ2V0ZWdpZDMyOiAxCiBnZXRncm91cHMzMjogMQogbmFub3NsZWVwOiAxCitnZXRyYW5kb206IDEKKworIyBmb3IgZHluYW1pY2FsbHkgbG9hZGluZyBleHRyYWN0b3JzCitwcmVhZDY0OiAxCiAKICMgZm9yIEZpbGVTb3VyY2UKIHJlYWRsaW5rYXQ6IDEKIF9sbHNlZWs6IDEKIAotIyBmb3IgYXR0YWNoaW5nIHRvIGRlYnVnZ2VyZCBvbiBwcm9jZXNzIGNyYXNoCi1zaWdhY3Rpb246IDEKLXRna2lsbDogMQotc29ja2V0OiAxCi1jb25uZWN0OiAxCi1yZWN2bXNnOiAxCi1mY250bDY0OiAxCi1ydF90Z3NpZ3F1ZXVlaW5mbzogMQotZ2V0ZXVpZDMyOiAxCi1nZXRnaWQzMjogMQotZ2V0ZWdpZDMyOiAxCi1nZXRncm91cHMzMjogMQotZ2V0ZGVudHM2NDogMQotcGlwZTI6IDEKLXBwb2xsOiAxCi1nZXRwaWQ6IDEKLWdldHRpZDogMQorQGluY2x1ZGUgL3N5c3RlbS9ldGMvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC5hcm0ucG9saWN5CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9zZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci1hcm02NC5wb2xpY3kgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9zZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci1hcm02NC5wb2xpY3kKaW5kZXggNDJlMGQ3NS4uZDcwZTI3YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3Ivc2VjY29tcF9wb2xpY3kvbWVkaWFleHRyYWN0b3ItYXJtNjQucG9saWN5CisrKyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL3NlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLWFybTY0LnBvbGljeQpAQCAtMTksNiArMTksNyBAQAogc2V0cHJpb3JpdHk6IDEKIHNpZ2FsdHN0YWNrOiAxCiBjbG9uZTogMQorc2NoZWRfc2V0c2NoZWR1bGVyOiAxCiBsc2VlazogMQogbmV3ZnN0YXRhdDogMQogZmFjY2Vzc2F0OiAxCkBAIC0yOCwyNyArMjksMTUgQEAKIHJ0X3NpZ3JldHVybjogMQogZ2V0cmxpbWl0OiAxCiBuYW5vc2xlZXA6IDEKK2dldHJhbmRvbTogMQogCiAjIGZvciBGaWxlU291cmNlCiByZWFkbGlua2F0OiAxCi1fbGxzZWVrOiAxCiAKLSMgZm9yIGF0dGFjaGluZyB0byBkZWJ1Z2dlcmQgb24gcHJvY2VzcyBjcmFzaAotdGdraWxsOiAxCi1ydF9zaWdwcm9jbWFzazogMQotcnRfc2lnYWN0aW9uOiAxCi0jIHNvY2tldDogYXJnMCA9PSBBRl9MT0NBTAotc29ja2V0OiBhcmcwID09IDEKLWNvbm5lY3Q6IDEKLXJlY3Ztc2c6IDEKLXJ0X3Rnc2lncXVldWVpbmZvOiAxCi13cml0ZXY6IDEKLWdldGV1aWQ6IDEKLWdldGdpZDogMQotZ2V0ZWdpZDogMQotZ2V0Z3JvdXBzOiAxCisjIGZvciBkeW5hbWljYWxseSBsb2FkaW5nIGV4dHJhY3RvcnMKIGdldGRlbnRzNjQ6IDEKLXBpcGUyOiAxCi1wcG9sbDogMQotZ2V0cGlkOiAxCi1nZXR0aWQ6IDEKK3JlYWRsaW5rYXQ6IDEKK3ByZWFkNjQ6IDEKK21yZW1hcDogMQorCitAaW5jbHVkZSAvc3lzdGVtL2V0Yy9zZWNjb21wX3BvbGljeS9jcmFzaF9kdW1wLmFybTY0LnBvbGljeQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3Ivc2VjY29tcF9wb2xpY3kvbWVkaWFleHRyYWN0b3IteDg2LnBvbGljeSBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL3NlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLXg4Ni5wb2xpY3kKaW5kZXggNzY0MDNmMi4uZDczOWJhMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3Ivc2VjY29tcF9wb2xpY3kvbWVkaWFleHRyYWN0b3IteDg2LnBvbGljeQorKysgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9zZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci14ODYucG9saWN5CkBAIC0zNywyOCArMzcsMjIgQEAKIGdldGVnaWQzMjogMQogZ2V0Z3JvdXBzMzI6IDEKIG5hbm9zbGVlcDogMQorZ2V0cmFuZG9tOiAxCisKKyMgZm9yIGR5bmFtaWNhbGx5IGxvYWRpbmcgZXh0cmFjdG9ycworZ2V0ZGVudHM2NDogMQorcmVhZGxpbmthdDogMQorcHJlYWQ2NDogMQorbXJlbWFwOiAxCiAKICMgZm9yIEZpbGVTb3VyY2UKIHJlYWRsaW5rYXQ6IDEKIF9sbHNlZWs6IDEKIAotIyBmb3IgYXR0YWNoaW5nIHRvIGRlYnVnZ2VyZCBvbiBwcm9jZXNzIGNyYXNoCi1zb2NrZXRjYWxsOiAxCi1zaWdhY3Rpb246IDEKLXRna2lsbDogMQotcnRfc2lncHJvY21hc2s6IDEKLWZjbnRsNjQ6IDEKLXJ0X3Rnc2lncXVldWVpbmZvOiAxCi1nZXRldWlkMzI6IDEKLWdldGdpZDMyOiAxCi1nZXRlZ2lkMzI6IDEKLWdldGdyb3VwczMyOiAxCi1nZXRkZW50czY0OiAxCi1waXBlMjogMQotcHBvbGw6IDEKLQogIyBSZXF1aXJlZCBieSBBZGRyZXNzU2FuaXRpemVyCiBnZXR0aWQ6IDEKIHNjaGVkX3lpZWxkOiAxCiBnZXRwaWQ6IDEKIGdldHRpZDogMQorCitAaW5jbHVkZSAvc3lzdGVtL2V0Yy9zZWNjb21wX3BvbGljeS9jcmFzaF9kdW1wLng4Ni5wb2xpY3kKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL3NlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLXg4Nl82NC5wb2xpY3kgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9zZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci14ODZfNjQucG9saWN5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYzYzc3ODAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9zZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci14ODZfNjQucG9saWN5CkBAIC0wLDAgKzEsNTcgQEAKKyMgT3JnYW5pemVkIGJ5IGZyZXF1ZW5jeSBvZiBzeXN0ZW1jYWxsIC0gaW4gZGVzY2VuZGluZyBvcmRlciBmb3IKKyMgYmVzdCBwZXJmb3JtYW5jZS4KK2lvY3RsOiAxCitmdXRleDogMQorcHJjdGw6IDEKK3dyaXRlOiAxCitnZXRwcmlvcml0eTogMQorY2xvc2U6IDEKK2R1cDogMQorbXVubWFwOiAxCittbWFwOiAxCittYWR2aXNlOiAxCitvcGVuYXQ6IDEKK2Nsb2NrX2dldHRpbWU6IDEKK3dyaXRldjogMQorYnJrOiAxCittcHJvdGVjdDogMQorcmVhZDogMQorbHNlZWs6IDEKK2Nsb25lOiAxCitnZXR1aWQ6IDEKK3NldHByaW9yaXR5OiAxCitzaWdhbHRzdGFjazogMQorbmV3ZnN0YXRhdDogMQorcmVzdGFydF9zeXNjYWxsOiAxCitleGl0OiAxCitleGl0X2dyb3VwOiAxCitydF9zaWdyZXR1cm46IDEKK2ZhY2Nlc3NhdDogMQorc2NoZWRfc2V0c2NoZWR1bGVyOiAxCitnZXRybGltaXQ6IDEKK25hbm9zbGVlcDogMQorCisjIGZvciBGaWxlU291cmNlCityZWFkbGlua2F0OiAxCisKKyMgZm9yIGF0dGFjaGluZyB0byBkZWJ1Z2dlcmQgb24gcHJvY2VzcyBjcmFzaAordGdraWxsOiAxCitzb2NrZXQ6IGFyZzAgPT0gMQorY29ubmVjdDogMQorZmNudGw6IDEKK3J0X3NpZ3Byb2NtYXNrOiAxCitydF9zaWdhY3Rpb246IDEKK3J0X3Rnc2lncXVldWVpbmZvOiAxCitnZXRldWlkOiAxCitnZXRnaWQ6IDEKK2dldGVnaWQ6IDEKK2dldGdyb3VwczogMQorZ2V0ZGVudHM2NDogMQorcGlwZTI6IDEKK3Bwb2xsOiAxCisKKyMgUmVxdWlyZWQgYnkgQWRkcmVzc1Nhbml0aXplcgorZ2V0dGlkOiAxCitzY2hlZF95aWVsZDogMQorZ2V0cGlkOiAxCitnZXR0aWQ6IDEKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbG9nL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9tZWRpYWxvZy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZTZkZmMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWxvZy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMjIgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGlibWVkaWFsb2dzZXJ2aWNlIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIklNZWRpYUxvZ1NlcnZpY2UuY3BwIiwKKyAgICAgICAgIk1lZGlhTG9nU2VydmljZS5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm5iYWlvIiwKKyAgICAgICAgImxpYm5ibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFsb2cvQW5kcm9pZC5tayBiL3NlcnZpY2VzL21lZGlhbG9nL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyM2IxODYuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvbWVkaWFsb2cvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSBNZWRpYUxvZ1NlcnZpY2UuY3BwIElNZWRpYUxvZ1NlcnZpY2UuY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYmluZGVyIGxpYnV0aWxzIGxpYmxvZyBsaWJuYmFpbyBsaWJhdWRpb3V0aWxzCi0KLUxPQ0FMX01VTFRJTElCIDo9ICQoQVVESU9TRVJWRVJfTVVMVElMSUIpCi0KLUxPQ0FMX01PRFVMRTo9IGxpYm1lZGlhbG9nc2VydmljZQotCi1MT0NBTF9DX0lOQ0xVREVTIDo9ICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykKLQotTE9DQUxfQ0ZMQUdTIDo9IC1XZXJyb3IgLVdhbGwKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFsb2cvTWVkaWFMb2dTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhbG9nL01lZGlhTG9nU2VydmljZS5jcHAKaW5kZXggYTU1MTJlMS4uMWJlNTU0NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFsb2cvTWVkaWFMb2dTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYWxvZy9NZWRpYUxvZ1NlcnZpY2UuY3BwCkBAIC0yMCwxOSArMjAsMjUgQEAKICNpbmNsdWRlIDxzeXMvbW1hbi5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPGJpbmRlci9QZXJtaXNzaW9uQ2FjaGUuaD4KLSNpbmNsdWRlIDxtZWRpYS9uYmFpby9OQkxvZy5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL05CTG9nLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CiAjaW5jbHVkZSAiTWVkaWFMb2dTZXJ2aWNlLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotIHN0YXRpYyBjb25zdCBjaGFyIGtEZWFkbG9ja2VkU3RyaW5nW10gPSAiTWVkaWFMb2dTZXJ2aWNlIG1heSBiZSBkZWFkbG9ja2VkXG4iOworc3RhdGljIGNvbnN0IGNoYXIga0RlYWRsb2NrZWRTdHJpbmdbXSA9ICJNZWRpYUxvZ1NlcnZpY2UgbWF5IGJlIGRlYWRsb2NrZWRcbiI7CisKKy8vIG1NZXJnZXIsIG1NZXJnZVJlYWRlciwgYW5kIG1NZXJnZVRocmVhZCBhbGwgcG9pbnQgdG8gdGhlIHNhbWUgbG9jYXRpb24gaW4gbWVtb3J5CisvLyBtTWVyZ2VyU2hhcmVkLiBUaGlzIGlzIHRoZSBsb2NhbCBtZW1vcnkgRklGTyBjb250YWluaW5nIGRhdGEgbWVyZ2VkIGZyb20gYWxsCisvLyBpbmRpdmlkdWFsIHRocmVhZCBGSUZPcyBpbiBzaGFyZWQgbWVtb3J5LiBtTWVyZ2VUaHJlYWQgaXMgdXNlZCB0byBwZXJpb2RpY2FsbHkKKy8vIGNhbGwgTkJMb2c6Ok1lcmdlcjo6bWVyZ2UoKSB0byBjb2xsZWN0IHRoZSBkYXRhIGFuZCB3cml0ZSBpdCB0byB0aGUgRklGTywgYW5kIGNhbGwKKy8vIE5CTG9nOjpNZXJnZVJlYWRlcjo6Z2V0QW5kUHJvY2Vzc1NuYXBzaG90IHRvIHByb2Nlc3MgdGhlIG1lcmdlZCBkYXRhLgogTWVkaWFMb2dTZXJ2aWNlOjpNZWRpYUxvZ1NlcnZpY2UoKSA6CiAgICAgQm5NZWRpYUxvZ1NlcnZpY2UoKSwKICAgICBtTWVyZ2VyU2hhcmVkKChOQkxvZzo6U2hhcmVkKikgbWFsbG9jKE5CTG9nOjpUaW1lbGluZTo6c2hhcmVkU2l6ZShrTWVyZ2VCdWZmZXJTaXplKSkpLAogICAgIG1NZXJnZXIobU1lcmdlclNoYXJlZCwga01lcmdlQnVmZmVyU2l6ZSksCiAgICAgbU1lcmdlUmVhZGVyKG1NZXJnZXJTaGFyZWQsIGtNZXJnZUJ1ZmZlclNpemUsIG1NZXJnZXIpLAotICAgIG1NZXJnZVRocmVhZChuZXcgTkJMb2c6Ok1lcmdlVGhyZWFkKG1NZXJnZXIpKQorICAgIG1NZXJnZVRocmVhZChuZXcgTkJMb2c6Ok1lcmdlVGhyZWFkKG1NZXJnZXIsIG1NZXJnZVJlYWRlcikpCiB7CiAgICAgbU1lcmdlVGhyZWFkLT5ydW4oIk1lcmdlVGhyZWFkIik7CiB9CkBAIC0xMjMsMTUgKzEyOSwxMCBAQAogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dJKCIlczoiLCBuYW1lZFJlYWRlci5uYW1lKCkpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBUT0RPIFRoaXMgY29kZSBpcyBmb3IgdGVzdGluZywgcmVtb3ZlIGl0IHdoZW4gZG9uZQotICAgICAgICAgICAgICAgIC8vIG5hbWVkUmVhZGVyLnJlYWRlcigpLT5kdW1wKGZkLCAwIC8qaW5kZW50Ki8pOwogICAgICAgICAgICAgfQotCiAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgfQogICAgIH0KLQotICAgIC8vIEZJWE1FIHJlcXVlc3QgbWVyZ2UgdG8gbWFrZSBzdXJlIGxvZyBpcyB1cCB0byBkYXRlCiAgICAgbU1lcmdlUmVhZGVyLmR1bXAoZmQpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbG9nL01lZGlhTG9nU2VydmljZS5oIGIvc2VydmljZXMvbWVkaWFsb2cvTWVkaWFMb2dTZXJ2aWNlLmgKaW5kZXggMzlkOWNjMC4uYzk0NWQxZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFsb2cvTWVkaWFMb2dTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvbWVkaWFsb2cvTWVkaWFMb2dTZXJ2aWNlLmgKQEAgLTE5LDcgKzE5LDcgQEAKIAogI2luY2x1ZGUgPGJpbmRlci9CaW5kZXJTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhTG9nU2VydmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CTG9nLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvTkJMb2cuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWxvZy9PV05FUlMgYi9zZXJ2aWNlcy9tZWRpYWxvZy9PV05FUlMKaW5kZXggZmI4YjhlZS4uMjE3MjNiYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFsb2cvT1dORVJTCisrKyBiL3NlcnZpY2VzL21lZGlhbG9nL09XTkVSUwpAQCAtMSwzICsxLDMgQEAKIGVsYXVyZW50QGdvb2dsZS5jb20KLWdrYXN0ZW5AYW5kcm9pZC5jb20KK2drYXN0ZW5AZ29vZ2xlLmNvbQogaHVuZ2FAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmNwcAppbmRleCA3OGJiNTg3Li4yOGJmZDNmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmNwcApAQCAtMzEsNyArMzEsOCBAQAogCiAjaW5jbHVkZSAiUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5oIgogI2luY2x1ZGUgIlNlcnZpY2VMb2cuaCIKLQorI2luY2x1ZGUgIm1lZGlhdXRpbHMvU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuaCIKKyNpbmNsdWRlIDxjdXRpbHMvc2NoZWRfcG9saWN5Lmg+CiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIG5hbWVzcGFjZSB7CkBAIC0xMTEsNiArMTEyLDcgQEAKICAgICBSZXNvdXJjZUluZm8gaW5mbzsKICAgICBpbmZvLmNsaWVudElkID0gY2xpZW50SWQ7CiAgICAgaW5mby5jbGllbnQgPSBjbGllbnQ7CisgICAgaW5mby5jcHVCb29zdCA9IGZhbHNlOwogICAgIGluZm9zLnB1c2hfYmFjayhpbmZvKTsKICAgICByZXR1cm4gaW5mb3MuZWRpdEl0ZW1BdChpbmZvcy5zaXplKCkgLSAxKTsKIH0KQEAgLTIwMSw3ICsyMDMsOCBAQAogICAgIDogbVByb2Nlc3NJbmZvKHByb2Nlc3NJbmZvKSwKICAgICAgIG1TZXJ2aWNlTG9nKG5ldyBTZXJ2aWNlTG9nKCkpLAogICAgICAgbVN1cHBvcnRzTXVsdGlwbGVTZWN1cmVDb2RlY3ModHJ1ZSksCi0gICAgICBtU3VwcG9ydHNTZWN1cmVXaXRoTm9uU2VjdXJlQ29kZWModHJ1ZSkge30KKyAgICAgIG1TdXBwb3J0c1NlY3VyZVdpdGhOb25TZWN1cmVDb2RlYyh0cnVlKSwKKyAgICAgIG1DcHVCb29zdENvdW50KDApIHt9CiAKIFJlc291cmNlTWFuYWdlclNlcnZpY2U6On5SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlKCkge30KIApAQCAtMjM5LDYgKzI0MiwxOSBAQAogICAgIFJlc291cmNlSW5mbyYgaW5mbyA9IGdldFJlc291cmNlSW5mb0ZvckVkaXQoY2xpZW50SWQsIGNsaWVudCwgaW5mb3MpOwogICAgIC8vIFRPRE86IGRvIHRoZSBtZXJnZSBpbnN0ZWFkIG9mIGFwcGVuZC4KICAgICBpbmZvLnJlc291cmNlcy5hcHBlbmRWZWN0b3IocmVzb3VyY2VzKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVzb3VyY2VzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmIChyZXNvdXJjZXNbaV0ubVR5cGUgPT0gTWVkaWFSZXNvdXJjZTo6a0NwdUJvb3N0ICYmICFpbmZvLmNwdUJvb3N0KSB7CisgICAgICAgICAgICBpbmZvLmNwdUJvb3N0ID0gdHJ1ZTsKKyAgICAgICAgICAgIC8vIFJlcXVlc3QgaXQgb24gZXZlcnkgbmV3IGluc3RhbmNlIG9mIGtDcHVCb29zdCwgYXMgdGhlIG1lZGlhLmNvZGVjCisgICAgICAgICAgICAvLyBjb3VsZCBoYXZlIGRpZWQsIGlmIHdlIG9ubHkgZG8gaXQgdGhlIGZpcnN0IHRpbWUgc3Vic2VxdWVudCBpbnN0YW5jZXMKKyAgICAgICAgICAgIC8vIG5ldmVyIGdldHMgdGhlIGJvb3N0LgorICAgICAgICAgICAgaWYgKHJlcXVlc3RDcHVzZXRCb29zdCh0cnVlLCB0aGlzKSAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dXKCJjb3VsZG4ndCByZXF1ZXN0IGNwdXNldCBib29zdCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNwdUJvb3N0Q291bnQrKzsKKyAgICAgICAgfQorICAgIH0KICAgICBpZiAoaW5mby5kZWF0aE5vdGlmaWVyID09IG51bGxwdHIpIHsKICAgICAgICAgaW5mby5kZWF0aE5vdGlmaWVyID0gbmV3IERlYXRoTm90aWZpZXIodGhpcywgcGlkLCBjbGllbnRJZCk7CiAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKGNsaWVudCktPmxpbmtUb0RlYXRoKGluZm8uZGVhdGhOb3RpZmllcik7CkBAIC0yNzAsNiArMjg2LDExIEBACiAgICAgUmVzb3VyY2VJbmZvcyAmaW5mb3MgPSBtTWFwLmVkaXRWYWx1ZUF0KGluZGV4KTsKICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGluZm9zLnNpemUoKTsgKytqKSB7CiAgICAgICAgIGlmIChpbmZvc1tqXS5jbGllbnRJZCA9PSBjbGllbnRJZCkgeworICAgICAgICAgICAgaWYgKGluZm9zW2pdLmNwdUJvb3N0ICYmIG1DcHVCb29zdENvdW50ID4gMCkgeworICAgICAgICAgICAgICAgIGlmICgtLW1DcHVCb29zdENvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdENwdXNldEJvb3N0KGZhbHNlLCB0aGlzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihpbmZvc1tqXS5jbGllbnQpLT51bmxpbmtUb0RlYXRoKGluZm9zW2pdLmRlYXRoTm90aWZpZXIpOwogICAgICAgICAgICAgaiA9IGluZm9zLnJlbW92ZUF0KGopOwogICAgICAgICAgICAgZm91bmQgPSB0cnVlOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5oIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5oCmluZGV4IDllOTdhYzAuLjgyZDJhMGIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlTWFuYWdlclNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmgKQEAgLTM4LDYgKzM4LDcgQEAKICAgICBzcDxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiBjbGllbnQ7CiAgICAgc3A8SUJpbmRlcjo6RGVhdGhSZWNpcGllbnQ+IGRlYXRoTm90aWZpZXI7CiAgICAgVmVjdG9yPE1lZGlhUmVzb3VyY2U+IHJlc291cmNlczsKKyAgICBib29sIGNwdUJvb3N0OwogfTsKIAogdHlwZWRlZiBWZWN0b3I8UmVzb3VyY2VJbmZvPiBSZXNvdXJjZUluZm9zOwpAQCAtMTEyLDYgKzExMyw3IEBACiAgICAgUGlkUmVzb3VyY2VJbmZvc01hcCBtTWFwOwogICAgIGJvb2wgbVN1cHBvcnRzTXVsdGlwbGVTZWN1cmVDb2RlY3M7CiAgICAgYm9vbCBtU3VwcG9ydHNTZWN1cmVXaXRoTm9uU2VjdXJlQ29kZWM7CisgICAgaW50MzJfdCBtQ3B1Qm9vc3RDb3VudDsKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21pbmlqYWlsL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9taW5pamFpbC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YTk0Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9taW5pamFpbC9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzggQEAKK21pbmlqYWlsX2NvbW1vbl9jZmxhZ3MgPSBbCisgICAgIi1XYWxsIiwKKyAgICAiLVdlcnJvciIsCitdCisKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGliYXZzZXJ2aWNlc19taW5pamFpbF9kZWZhdWx0cyIsCisgICAgc3JjczogWyJtaW5pamFpbC5jcHAiXSwKKyAgICBjZmxhZ3M6IG1pbmlqYWlsX2NvbW1vbl9jZmxhZ3MsCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGlibWluaWphaWwiLAorICAgIF0sCit9CisKKy8vIFNtYWxsIGxpYnJhcnkgZm9yIG1lZGlhLmV4dHJhY3RvciBhbmQgbWVkaWEuY29kZWMgc2FuZGJveGluZy4KK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliYXZzZXJ2aWNlc19taW5pamFpbCIsCisgICAgZGVmYXVsdHM6IFsibGliYXZzZXJ2aWNlc19taW5pamFpbF9kZWZhdWx0cyJdLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLiJdLAorfQorCisvLyBTbWFsbCBsaWJyYXJ5IGZvciBtZWRpYS5leHRyYWN0b3IgYW5kIG1lZGlhLmNvZGVjIHNhbmRib3hpbmcuCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmF2c2VydmljZXNfbWluaWphaWxfdmVuZG9yIiwKKyAgICB2ZW5kb3I6IHRydWUsCisgICAgZGVmYXVsdHM6IFsibGliYXZzZXJ2aWNlc19taW5pamFpbF9kZWZhdWx0cyJdLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLiJdLAorfQorCisvLyBVbml0IHRlc3RzLgorY2NfdGVzdCB7CisgICAgbmFtZTogImxpYmF2c2VydmljZXNfbWluaWphaWxfdW5pdHRlc3QiLAorICAgIGRlZmF1bHRzOiBbImxpYmF2c2VydmljZXNfbWluaWphaWxfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJhdl9zZXJ2aWNlc19taW5pamFpbF91bml0dGVzdC5jcHAiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9taW5pamFpbC9BbmRyb2lkLm1rIGIvc2VydmljZXMvbWluaWphaWwvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZmY2FjYy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9taW5pamFpbC9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotCi0jIFNtYWxsIGxpYnJhcnkgZm9yIG1lZGlhLmV4dHJhY3RvciBhbmQgbWVkaWEuY29kZWMgc2FuZGJveGluZy4KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFIDo9IGxpYmF2c2VydmljZXNfbWluaWphaWwKLUxPQ0FMX1NSQ19GSUxFUyA6PSBtaW5pamFpbC5jcHAKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYmFzZSBsaWJtaW5pamFpbAotTE9DQUxfRVhQT1JUX0NfSU5DTFVERV9ESVJTIDo9ICQoTE9DQUxfUEFUSCkKLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQotIyBTbWFsbCBsaWJyYXJ5IGZvciBtZWRpYS5leHRyYWN0b3IgYW5kIG1lZGlhLmNvZGVjIHNhbmRib3hpbmcuCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRSA6PSBsaWJhdnNlcnZpY2VzX21pbmlqYWlsX3ZlbmRvcgotTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCi1MT0NBTF9TUkNfRklMRVMgOj0gbWluaWphaWwuY3BwCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmJhc2UgbGlibWluaWphaWxfdmVuZG9yCi1MT0NBTF9FWFBPUlRfQ19JTkNMVURFX0RJUlMgOj0gJChMT0NBTF9QQVRIKQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQotCi0jIFVuaXQgdGVzdHMuCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRSA6PSBsaWJhdnNlcnZpY2VzX21pbmlqYWlsX3VuaXR0ZXN0Ci1MT0NBTF9TUkNfRklMRVMgOj0gbWluaWphaWwuY3BwIGF2X3NlcnZpY2VzX21pbmlqYWlsX3VuaXR0ZXN0LmNwcAotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJiYXNlIGxpYm1pbmlqYWlsCi1pbmNsdWRlICQoQlVJTERfTkFUSVZFX1RFU1QpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9taW5pamFpbC9PV05FUlMgYi9zZXJ2aWNlcy9taW5pamFpbC9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlmNGY5ZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21pbmlqYWlsL09XTkVSUwpAQCAtMCwwICsxLDIgQEAKK2pvcmdlbG9AZ29vZ2xlLmNvbQorbWFyY29uZUBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9DbGllbnRUcmFja2VyLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0NsaWVudFRyYWNrZXIuY3BwCmluZGV4IDc1MzkyYmQuLjcyNjRhOWIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0NsaWVudFRyYWNrZXIuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0NsaWVudFRyYWNrZXIuY3BwCkBAIC0xNSwxMiArMTUsMTQgQEAKICAqLwogCiAKLSNkZWZpbmUgTE9HX1RBRyAiQUF1ZGlvU2VydmljZSIKKyNkZWZpbmUgTE9HX1RBRyAiQUF1ZGlvQ2xpZW50VHJhY2tlciIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8aW9zdHJlYW0+CiAjaW5jbHVkZSA8bWFwPgogI2luY2x1ZGUgPG11dGV4PgogI2luY2x1ZGUgPHV0aWxzL1NpbmdsZXRvbi5oPgpAQCAtMzksNyArNDEsNiBAQAogICAgICAgICA6IFNpbmdsZXRvbjxBQXVkaW9DbGllbnRUcmFja2VyPigpIHsKIH0KIAotCiBzdGQ6OnN0cmluZyBBQXVkaW9DbGllbnRUcmFja2VyOjpkdW1wKCkgY29uc3QgewogICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHJlc3VsdDsKICAgICBjb25zdCBib29sIGlzTG9ja2VkID0gQUF1ZGlvX3RyeVVudGlsVHJ1ZSgKQEAgLTY0LDggKzY1LDcgQEAKIC8vIENyZWF0ZSBhIHRyYWNrZXIgZm9yIHRoZSBjbGllbnQuCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvQ2xpZW50VHJhY2tlcjo6cmVnaXN0ZXJDbGllbnQocGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQUF1ZGlvQ2xpZW50PiYgY2xpZW50KSB7Ci0gICAgQUxPR1YoIkFBdWRpb0NsaWVudFRyYWNrZXI6OnJlZ2lzdGVyQ2xpZW50KCksIGNhbGxpbmcgcGlkID0gJWQsIGdldHBpZCgpID0gJWRcbiIsCi0gICAgICAgICAgcGlkLCBnZXRwaWQoKSk7CisgICAgQUxPR1YoInJlZ2lzdGVyQ2xpZW50KCksIGNhbGxpbmcgcGlkID0gJWQsIGdldHBpZCgpID0gJWRcbiIsIHBpZCwgZ2V0cGlkKCkpOwogCiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOwogICAgIGlmIChtTm90aWZpY2F0aW9uQ2xpZW50cy5jb3VudChwaWQpID09IDApIHsKQEAgLTc0LDE4ICs3NCwxNiBAQAogCiAgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IElJbnRlcmZhY2U6OmFzQmluZGVyKGNsaWVudCk7CiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGJpbmRlci0+bGlua1RvRGVhdGgobm90aWZpY2F0aW9uQ2xpZW50KTsKLSAgICAgICAgQUxPR1dfSUYoc3RhdHVzICE9IE5PX0VSUk9SLAotICAgICAgICAgICAgICAgICAiQUF1ZGlvQ2xpZW50VHJhY2tlcjo6cmVnaXN0ZXJDbGllbnQoKSBsaW5rVG9EZWF0aCA9ICVkXG4iLCBzdGF0dXMpOworICAgICAgICBBTE9HV19JRihzdGF0dXMgIT0gTk9fRVJST1IsICJyZWdpc3RlckNsaWVudCgpIGxpbmtUb0RlYXRoID0gJWRcbiIsIHN0YXR1cyk7CiAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChzdGF0dXMpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dXKCJBQXVkaW9DbGllbnRUcmFja2VyOjpyZWdpc3RlckNsaWVudCglZCkgYWxyZWFkeSByZWdpc3RlcmVkISIsIHBpZCk7CisgICAgICAgIEFMT0dXKCJyZWdpc3RlckNsaWVudCglZCkgYWxyZWFkeSByZWdpc3RlcmVkISIsIHBpZCk7CiAgICAgICAgIHJldHVybiBBQVVESU9fT0s7IC8vIFRPRE8gc2hvdWxkIHRoaXMgYmUgY29uc2lkZXJlZCBhbiBlcnJvcgogICAgIH0KIH0KIAogdm9pZCBBQXVkaW9DbGllbnRUcmFja2VyOjp1bnJlZ2lzdGVyQ2xpZW50KHBpZF90IHBpZCkgewotICAgIEFMT0dWKCJBQXVkaW9DbGllbnRUcmFja2VyOjp1bnJlZ2lzdGVyQ2xpZW50KCksIGNhbGxpbmcgcGlkID0gJWQsIGdldHBpZCgpID0gJWRcbiIsCi0gICAgICAgICAgcGlkLCBnZXRwaWQoKSk7CisgICAgQUxPR1YoInVucmVnaXN0ZXJDbGllbnQoKSwgY2FsbGluZyBwaWQgPSAlZCwgZ2V0cGlkKCkgPSAlZFxuIiwgcGlkLCBnZXRwaWQoKSk7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOwogICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLmVyYXNlKHBpZCk7CiB9CkBAIC0xMDMsMTIgKzEwMSwxMiBAQAogYWF1ZGlvX3Jlc3VsdF90CiBBQXVkaW9DbGllbnRUcmFja2VyOjpyZWdpc3RlckNsaWVudFN0cmVhbShwaWRfdCBwaWQsIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtKSB7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKLSAgICBBTE9HVigiQUF1ZGlvQ2xpZW50VHJhY2tlcjo6cmVnaXN0ZXJDbGllbnRTdHJlYW0oJWQsICVwKVxuIiwgcGlkLCBzZXJ2aWNlU3RyZWFtLmdldCgpKTsKKyAgICBBTE9HVigicmVnaXN0ZXJDbGllbnRTdHJlYW0oJWQsICVwKVxuIiwgcGlkLCBzZXJ2aWNlU3RyZWFtLmdldCgpKTsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CiAgICAgc3A8Tm90aWZpY2F0aW9uQ2xpZW50PiBub3RpZmljYXRpb25DbGllbnQgPSBtTm90aWZpY2F0aW9uQ2xpZW50c1twaWRdOwogICAgIGlmIChub3RpZmljYXRpb25DbGllbnQgPT0gMCkgewogICAgICAgICAvLyBUaGlzIHdpbGwgZ2V0IGNhbGxlZCB0aGUgZmlyc3QgdGltZSB0aGUgYXVkaW8gc2VydmVyIHJlZ2lzdGVycyBhbiBpbnRlcm5hbCBzdHJlYW0uCi0gICAgICAgIEFMT0dWKCJBQXVkaW9DbGllbnRUcmFja2VyOjpyZWdpc3RlckNsaWVudFN0cmVhbSglZCwpIHVucmVjb2duaXplZCBwaWRcbiIsIHBpZCk7CisgICAgICAgIEFMT0dWKCJyZWdpc3RlckNsaWVudFN0cmVhbSglZCwpIHVucmVjb2duaXplZCBwaWRcbiIsIHBpZCk7CiAgICAgICAgIG5vdGlmaWNhdGlvbkNsaWVudCA9IG5ldyBOb3RpZmljYXRpb25DbGllbnQocGlkKTsKICAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHNbcGlkXSA9IG5vdGlmaWNhdGlvbkNsaWVudDsKICAgICB9CkBAIC0xMjAsMTUgKzExOCwxNSBAQAogYWF1ZGlvX3Jlc3VsdF90CiBBQXVkaW9DbGllbnRUcmFja2VyOjp1bnJlZ2lzdGVyQ2xpZW50U3RyZWFtKHBpZF90IHBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHNlcnZpY2VTdHJlYW0pIHsKLSAgICBBTE9HVigiQUF1ZGlvQ2xpZW50VHJhY2tlcjo6dW5yZWdpc3RlckNsaWVudFN0cmVhbSglZCwgJXApXG4iLCBwaWQsIHNlcnZpY2VTdHJlYW0uZ2V0KCkpOworICAgIEFMT0dWKCJ1bnJlZ2lzdGVyQ2xpZW50U3RyZWFtKCVkLCAlcClcbiIsIHBpZCwgc2VydmljZVN0cmVhbS5nZXQoKSk7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOwogICAgIGF1dG8gaXQgPSBtTm90aWZpY2F0aW9uQ2xpZW50cy5maW5kKHBpZCk7CiAgICAgaWYgKGl0ICE9IG1Ob3RpZmljYXRpb25DbGllbnRzLmVuZCgpKSB7Ci0gICAgICAgIEFMT0dWKCJBQXVkaW9DbGllbnRUcmFja2VyOjp1bnJlZ2lzdGVyQ2xpZW50U3RyZWFtKCVkLCAlcCkgZm91bmQgTm90aWZpY2F0aW9uQ2xpZW50XG4iLAorICAgICAgICBBTE9HVigidW5yZWdpc3RlckNsaWVudFN0cmVhbSglZCwgJXApIGZvdW5kIE5vdGlmaWNhdGlvbkNsaWVudFxuIiwKICAgICAgICAgICAgICAgcGlkLCBzZXJ2aWNlU3RyZWFtLmdldCgpKTsKICAgICAgICAgaXQtPnNlY29uZC0+dW5yZWdpc3RlckNsaWVudFN0cmVhbShzZXJ2aWNlU3RyZWFtKTsKICAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiQUF1ZGlvQ2xpZW50VHJhY2tlcjo6dW5yZWdpc3RlckNsaWVudFN0cmVhbSglZCwgJXApIG1pc3NpbmcgTm90aWZpY2F0aW9uQ2xpZW50XG4iLAorICAgICAgICBBTE9HRSgidW5yZWdpc3RlckNsaWVudFN0cmVhbSglZCwgJXApIG1pc3NpbmcgTm90aWZpY2F0aW9uQ2xpZW50XG4iLAogICAgICAgICAgICAgICBwaWQsIHNlcnZpY2VTdHJlYW0uZ2V0KCkpOwogICAgIH0KICAgICByZXR1cm4gQUFVRElPX09LOwpAQCAtMTM2LDExICsxMzQsMTEgQEAKIAogQUF1ZGlvQ2xpZW50VHJhY2tlcjo6Tm90aWZpY2F0aW9uQ2xpZW50OjpOb3RpZmljYXRpb25DbGllbnQocGlkX3QgcGlkKQogICAgICAgICA6IG1Qcm9jZXNzSWQocGlkKSB7Ci0gICAgLy9BTE9HRCgiQUF1ZGlvQ2xpZW50VHJhY2tlcjo6Tm90aWZpY2F0aW9uQ2xpZW50KCVkKSBjcmVhdGVkICVwXG4iLCBwaWQsIHRoaXMpOworICAgIC8vQUxPR0QoIk5vdGlmaWNhdGlvbkNsaWVudCglZCkgY3JlYXRlZCAlcFxuIiwgcGlkLCB0aGlzKTsKIH0KIAogQUF1ZGlvQ2xpZW50VHJhY2tlcjo6Tm90aWZpY2F0aW9uQ2xpZW50Ojp+Tm90aWZpY2F0aW9uQ2xpZW50KCkgewotICAgIC8vQUxPR0QoIkFBdWRpb0NsaWVudFRyYWNrZXI6On5Ob3RpZmljYXRpb25DbGllbnQoKSBkZXN0cm95ZWQgJXBcbiIsIHRoaXMpOworICAgIC8vQUxPR0QoIn5Ob3RpZmljYXRpb25DbGllbnQoKSBkZXN0cm95ZWQgJXBcbiIsIHRoaXMpOwogfQogCiBpbnQzMl90IEFBdWRpb0NsaWVudFRyYWNrZXI6Ok5vdGlmaWNhdGlvbkNsaWVudDo6Z2V0U3RyZWFtQ291bnQoKSB7CkBAIC0xNzIsMTQgKzE3MCwxNCBAQAogCiAgICAgICAgIHsKICAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKLSAgICAgICAgICAgIGZvciAoYXV0byBzZXJ2aWNlU3RyZWFtIDogbVN0cmVhbXMpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgc2VydmljZVN0cmVhbSA6IG1TdHJlYW1zKSB7CiAgICAgICAgICAgICAgICAgc3RyZWFtc1RvQ2xvc2UuaW5zZXJ0KHNlcnZpY2VTdHJlYW0pOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgZm9yIChhdXRvIHNlcnZpY2VTdHJlYW0gOiBzdHJlYW1zVG9DbG9zZSkgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHNlcnZpY2VTdHJlYW0gOiBzdHJlYW1zVG9DbG9zZSkgewogICAgICAgICAgICAgYWF1ZGlvX2hhbmRsZV90IGhhbmRsZSA9IHNlcnZpY2VTdHJlYW0tPmdldEhhbmRsZSgpOwotICAgICAgICAgICAgQUxPR1coIkFBdWRpb0NsaWVudFRyYWNrZXI6OmJpbmRlckRpZWQoKSBjbG9zZSBhYmFuZG9uZWQgc3RyZWFtIDB4JTA4WFxuIiwgaGFuZGxlKTsKKyAgICAgICAgICAgIEFMT0dXKCJiaW5kZXJEaWVkKCkgY2xvc2UgYWJhbmRvbmVkIHN0cmVhbSAweCUwOFhcbiIsIGhhbmRsZSk7CiAgICAgICAgICAgICBhYXVkaW9TZXJ2aWNlLT5jbG9zZVN0cmVhbShoYW5kbGUpOwogICAgICAgICB9CiAgICAgICAgIC8vIG1TdHJlYW1zIHNob3VsZCBiZSBlbXB0eSBub3cKQEAgLTIwMCw4ICsxOTgsMTAgQEAKICAgICB9CiAKICAgICByZXN1bHQgPDwgIiAgY2xpZW50OiBwaWQgPSAiIDw8IG1Qcm9jZXNzSWQgPDwgIiBoYXMgIiA8PCBtU3RyZWFtcy5zaXplKCkgPDwgIiBzdHJlYW1zXG4iOwotICAgIGZvciAoYXV0byBzZXJ2aWNlU3RyZWFtIDogbVN0cmVhbXMpIHsKLSAgICAgICAgcmVzdWx0IDw8ICIgICAgIHN0cmVhbTogMHgiIDw8IHN0ZDo6aGV4IDw8IHNlcnZpY2VTdHJlYW0tPmdldEhhbmRsZSgpIDw8IHN0ZDo6ZGVjIDw8ICJcbiI7CisgICAgZm9yIChjb25zdCBhdXRvJiBzZXJ2aWNlU3RyZWFtIDogbVN0cmVhbXMpIHsKKyAgICAgICAgcmVzdWx0IDw8ICIgICAgIHN0cmVhbTogMHgiIDw8IHN0ZDo6c2V0ZmlsbCgnMCcpIDw8IHN0ZDo6c2V0dyg4KSA8PCBzdGQ6OmhleAorICAgICAgICAgICAgICAgPDwgc2VydmljZVN0cmVhbS0+Z2V0SGFuZGxlKCkKKyAgICAgICAgICAgICAgIDw8IHN0ZDo6ZGVjIDw8IHN0ZDo6c2V0ZmlsbCgnICcpIDw8ICJcbiI7CiAgICAgfQogCiAgICAgaWYgKGlzTG9ja2VkKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLmNwcAppbmRleCBmOTk2Zjc0Li4wNGZlZTEzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0VuZHBvaW50TWFuYWdlci5jcHAKQEAgLTY3LDExICs2NywxNyBAQAogCiAgICAgICAgIHJlc3VsdCA8PCAiRXhjbHVzaXZlIE1NQVAgRW5kcG9pbnRzOiAiIDw8IG1FeGNsdXNpdmVTdHJlYW1zLnNpemUoKSA8PCAiXG4iOwogICAgICAgICBpbmRleCA9IDA7Ci0gICAgICAgIGZvciAoY29uc3QgYXV0byAmb3V0cHV0IDogbUV4Y2x1c2l2ZVN0cmVhbXMpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZzdHJlYW0gOiBtRXhjbHVzaXZlU3RyZWFtcykgewogICAgICAgICAgICAgcmVzdWx0IDw8ICIgICMiIDw8IGluZGV4KysgPDwgIjoiOwotICAgICAgICAgICAgcmVzdWx0IDw8IG91dHB1dC0+ZHVtcCgpIDw8ICJcbiI7CisgICAgICAgICAgICByZXN1bHQgPDwgc3RyZWFtLT5kdW1wKCkgPDwgIlxuIjsKICAgICAgICAgfQogCisgICAgICAgIHJlc3VsdCA8PCAiICBFeGNsdXNpdmVTZWFyY2hDb3VudDogICIgPDwgbUV4Y2x1c2l2ZVNlYXJjaENvdW50IDw8ICJcbiI7CisgICAgICAgIHJlc3VsdCA8PCAiICBFeGNsdXNpdmVGb3VuZENvdW50OiAgICIgPDwgbUV4Y2x1c2l2ZUZvdW5kQ291bnQgPDwgIlxuIjsKKyAgICAgICAgcmVzdWx0IDw8ICIgIEV4Y2x1c2l2ZU9wZW5Db3VudDogICAgIiA8PCBtRXhjbHVzaXZlT3BlbkNvdW50IDw8ICJcbiI7CisgICAgICAgIHJlc3VsdCA8PCAiICBFeGNsdXNpdmVDbG9zZUNvdW50OiAgICIgPDwgbUV4Y2x1c2l2ZUNsb3NlQ291bnQgPDwgIlxuIjsKKyAgICAgICAgcmVzdWx0IDw8ICJcbiI7CisKICAgICAgICAgaWYgKGlzRXhjbHVzaXZlTG9ja2VkKSB7CiAgICAgICAgICAgICBtRXhjbHVzaXZlTG9jay51bmxvY2soKTsKICAgICAgICAgfQpAQCAtNzksMTEgKzg1LDE3IEBACiAKICAgICByZXN1bHQgPDwgIlNoYXJlZCBFbmRwb2ludHM6ICIgPDwgbVNoYXJlZFN0cmVhbXMuc2l6ZSgpIDw8ICJcbiI7CiAgICAgaW5kZXggPSAwOwotICAgIGZvciAoY29uc3QgYXV0byAmaW5wdXQgOiBtU2hhcmVkU3RyZWFtcykgeworICAgIGZvciAoY29uc3QgYXV0byAmc3RyZWFtIDogbVNoYXJlZFN0cmVhbXMpIHsKICAgICAgICAgcmVzdWx0IDw8ICIgICMiIDw8IGluZGV4KysgPDwgIjoiOwotICAgICAgICByZXN1bHQgPDwgaW5wdXQtPmR1bXAoKSA8PCAiXG4iOworICAgICAgICByZXN1bHQgPDwgc3RyZWFtLT5kdW1wKCkgPDwgIlxuIjsKICAgICB9CiAKKyAgICByZXN1bHQgPDwgIiAgU2hhcmVkU2VhcmNoQ291bnQ6ICAgICAiIDw8IG1TaGFyZWRTZWFyY2hDb3VudCA8PCAiXG4iOworICAgIHJlc3VsdCA8PCAiICBTaGFyZWRGb3VuZENvdW50OiAgICAgICIgPDwgbVNoYXJlZEZvdW5kQ291bnQgPDwgIlxuIjsKKyAgICByZXN1bHQgPDwgIiAgU2hhcmVkT3BlbkNvdW50OiAgICAgICAiIDw8IG1TaGFyZWRPcGVuQ291bnQgPDwgIlxuIjsKKyAgICByZXN1bHQgPDwgIiAgU2hhcmVkQ2xvc2VDb3VudDogICAgICAiIDw8IG1TaGFyZWRDbG9zZUNvdW50IDw8ICJcbiI7CisgICAgcmVzdWx0IDw8ICJcbiI7CisKICAgICBpZiAoaXNTaGFyZWRMb2NrZWQpIHsKICAgICAgICAgbVNoYXJlZExvY2sudW5sb2NrKCk7CiAgICAgfQpAQCAtOTUsMTUgKzEwNywxNyBAQAogc3A8QUF1ZGlvU2VydmljZUVuZHBvaW50PiBBQXVkaW9FbmRwb2ludE1hbmFnZXI6OmZpbmRFeGNsdXNpdmVFbmRwb2ludF9sKAogICAgICAgICBjb25zdCBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uKSB7CiAgICAgc3A8QUF1ZGlvU2VydmljZUVuZHBvaW50PiBlbmRwb2ludDsKKyAgICBtRXhjbHVzaXZlU2VhcmNoQ291bnQrKzsKICAgICBmb3IgKGNvbnN0IGF1dG8gZXAgOiBtRXhjbHVzaXZlU3RyZWFtcykgewogICAgICAgICBpZiAoZXAtPm1hdGNoZXMoY29uZmlndXJhdGlvbikpIHsKKyAgICAgICAgICAgIG1FeGNsdXNpdmVGb3VuZENvdW50Kys7CiAgICAgICAgICAgICBlbmRwb2ludCA9IGVwOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBBTE9HVigiQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLmZpbmRFeGNsdXNpdmVFbmRwb2ludF9sKCksIGZvdW5kICVwIGZvciBkZXZpY2UgPSAlZCIsCi0gICAgICAgICAgZW5kcG9pbnQuZ2V0KCksIGNvbmZpZ3VyYXRpb24uZ2V0RGV2aWNlSWQoKSk7CisgICAgQUxPR1YoImZpbmRFeGNsdXNpdmVFbmRwb2ludF9sKCksIGZvdW5kICVwIGZvciBkZXZpY2UgPSAlZCwgc2Vzc2lvbklkID0gJWQiLAorICAgICAgICAgIGVuZHBvaW50LmdldCgpLCBjb25maWd1cmF0aW9uLmdldERldmljZUlkKCksIGNvbmZpZ3VyYXRpb24uZ2V0U2Vzc2lvbklkKCkpOwogICAgIHJldHVybiBlbmRwb2ludDsKIH0KIApAQCAtMTExLDE1ICsxMjUsMTcgQEAKIHNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZD4gQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyOjpmaW5kU2hhcmVkRW5kcG9pbnRfbCgKICAgICAgICAgY29uc3QgQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbikgewogICAgIHNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZD4gZW5kcG9pbnQ7CisgICAgbVNoYXJlZFNlYXJjaENvdW50Kys7CiAgICAgZm9yIChjb25zdCBhdXRvIGVwICA6IG1TaGFyZWRTdHJlYW1zKSB7CiAgICAgICAgIGlmIChlcC0+bWF0Y2hlcyhjb25maWd1cmF0aW9uKSkgeworICAgICAgICAgICAgbVNoYXJlZEZvdW5kQ291bnQrKzsKICAgICAgICAgICAgIGVuZHBvaW50ID0gZXA7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIAotICAgIEFMT0dWKCJBQXVkaW9FbmRwb2ludE1hbmFnZXIuZmluZFNoYXJlZEVuZHBvaW50X2woKSwgZm91bmQgJXAgZm9yIGRldmljZSA9ICVkIiwKLSAgICAgICAgICBlbmRwb2ludC5nZXQoKSwgY29uZmlndXJhdGlvbi5nZXREZXZpY2VJZCgpKTsKKyAgICBBTE9HVigiZmluZFNoYXJlZEVuZHBvaW50X2woKSwgZm91bmQgJXAgZm9yIGRldmljZSA9ICVkLCBzZXNzaW9uSWQgPSAlZCIsCisgICAgICAgICAgZW5kcG9pbnQuZ2V0KCksIGNvbmZpZ3VyYXRpb24uZ2V0RGV2aWNlSWQoKSwgY29uZmlndXJhdGlvbi5nZXRTZXNzaW9uSWQoKSk7CiAgICAgcmV0dXJuIGVuZHBvaW50OwogfQogCkBAIC0xMzQsNyArMTUwLDcgQEAKIH0KIAogc3A8QUF1ZGlvU2VydmljZUVuZHBvaW50PiBBQXVkaW9FbmRwb2ludE1hbmFnZXI6Om9wZW5FeGNsdXNpdmVFbmRwb2ludCgKLSAgICAgICAgQUF1ZGlvU2VydmljZSAmYWF1ZGlvU2VydmljZSBfX3VudXNlZCwKKyAgICAgICAgQUF1ZGlvU2VydmljZSAmYWF1ZGlvU2VydmljZSwKICAgICAgICAgY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KSB7CiAKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtRXhjbHVzaXZlTG9jayk7CkBAIC0xNDYsMjQgKzE2MiwyMyBAQAogCiAgICAgLy8gSWYgd2UgZmluZCBhbiBleGlzdGluZyBvbmUgdGhlbiB0aGlzIG9uZSBjYW5ub3QgYmUgZXhjbHVzaXZlLgogICAgIGlmIChlbmRwb2ludC5nZXQoKSAhPSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9FbmRwb2ludE1hbmFnZXIub3BlbkV4Y2x1c2l2ZUVuZHBvaW50KCkgYWxyZWFkeSBpbiB1c2UiKTsKKyAgICAgICAgQUxPR1coIm9wZW5FeGNsdXNpdmVFbmRwb2ludCgpIGFscmVhZHkgaW4gdXNlIik7CiAgICAgICAgIC8vIEFscmVhZHkgb3BlbiBzbyBkbyBub3QgYWxsb3cgYSBzZWNvbmQgc3RyZWFtLgogICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICB9IGVsc2UgewotICAgICAgICBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQPiBlbmRwb2ludE1NYXAgPSBuZXcgQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUCgpOwotICAgICAgICBBTE9HRSgiQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLm9wZW5FbmRwb2ludCgpLGNyZWF0ZWQgTU1BUCAlcCIsIGVuZHBvaW50TU1hcC5nZXQoKSk7CisgICAgICAgIHNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA+IGVuZHBvaW50TU1hcCA9IG5ldyBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQKGFhdWRpb1NlcnZpY2UpOworICAgICAgICBBTE9HVigib3BlbkV4Y2x1c2l2ZUVuZHBvaW50KCksIG5vIG1hdGNoIHNvIHRyeSB0byBvcGVuIE1NQVAgJXAgZm9yIGRldiAlZCIsCisgICAgICAgICAgICAgIGVuZHBvaW50TU1hcC5nZXQoKSwgY29uZmlndXJhdGlvbi5nZXREZXZpY2VJZCgpKTsKICAgICAgICAgZW5kcG9pbnQgPSBlbmRwb2ludE1NYXA7CiAKICAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IGVuZHBvaW50LT5vcGVuKHJlcXVlc3QpOwogICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICAgICAgQUxPR0UoIkFBdWRpb0VuZHBvaW50TWFuYWdlci5vcGVuRW5kcG9pbnQoKSwgb3BlbiBmYWlsZWQiKTsKKyAgICAgICAgICAgIEFMT0dFKCJvcGVuRXhjbHVzaXZlRW5kcG9pbnQoKSwgb3BlbiBmYWlsZWQiKTsKICAgICAgICAgICAgIGVuZHBvaW50LmNsZWFyKCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtRXhjbHVzaXZlU3RyZWFtcy5wdXNoX2JhY2soZW5kcG9pbnRNTWFwKTsKKyAgICAgICAgICAgIG1FeGNsdXNpdmVPcGVuQ291bnQrKzsKICAgICAgICAgfQotCi0gICAgICAgIEFMT0dEKCJBQXVkaW9FbmRwb2ludE1hbmFnZXIub3BlbkVuZHBvaW50KCksIGNyZWF0ZWQgJXAgZm9yIGRldmljZSA9ICVkIiwKLSAgICAgICAgICAgICAgZW5kcG9pbnQuZ2V0KCksIGNvbmZpZ3VyYXRpb24uZ2V0RGV2aWNlSWQoKSk7CiAgICAgfQogCiAgICAgaWYgKGVuZHBvaW50LmdldCgpICE9IG51bGxwdHIpIHsKQEAgLTIwMywxNCArMjE4LDE0IEBACiAgICAgICAgIGlmIChlbmRwb2ludC5nZXQoKSAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gZW5kcG9pbnQtPm9wZW4ocmVxdWVzdCk7CiAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICAgICAgICAgIEFMT0dFKCJBQXVkaW9FbmRwb2ludE1hbmFnZXIub3BlbkVuZHBvaW50KCksIG9wZW4gZmFpbGVkIik7CiAgICAgICAgICAgICAgICAgZW5kcG9pbnQuY2xlYXIoKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbVNoYXJlZFN0cmVhbXMucHVzaF9iYWNrKGVuZHBvaW50KTsKKyAgICAgICAgICAgICAgICBtU2hhcmVkT3BlbkNvdW50Kys7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgQUxPR0QoIkFBdWRpb0VuZHBvaW50TWFuYWdlci5vcGVuU2hhcmVkRW5kcG9pbnQoKSwgY3JlYXRlZCAlcCBmb3IgZGV2aWNlID0gJWQsIGRpciA9ICVkIiwKLSAgICAgICAgICAgICAgZW5kcG9pbnQuZ2V0KCksIGNvbmZpZ3VyYXRpb24uZ2V0RGV2aWNlSWQoKSwgKGludClkaXJlY3Rpb24pOworICAgICAgICBBTE9HVigiJXMoKSwgY3JlYXRlZCBlbmRwb2ludCAlcCwgcmVxdWVzdGVkIGRldmljZSA9ICVkLCBkaXIgPSAlZCIsCisgICAgICAgICAgICAgIF9fZnVuY19fLCBlbmRwb2ludC5nZXQoKSwgY29uZmlndXJhdGlvbi5nZXREZXZpY2VJZCgpLCAoaW50KWRpcmVjdGlvbik7CiAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwogICAgIH0KIApAQCAtMjM5LDE1ICsyNTQsMTYgQEAKICAgICBpbnQzMl90IG5ld1JlZkNvdW50ID0gc2VydmljZUVuZHBvaW50LT5nZXRPcGVuQ291bnQoKSAtIDE7CiAgICAgc2VydmljZUVuZHBvaW50LT5zZXRPcGVuQ291bnQobmV3UmVmQ291bnQpOwogCi0gICAgLy8gSWYgbm8gbG9uZ2VyIGluIHVzZSB0aGVuIGNsb3NlIGFuZCBkZWxldGUgaXQuCisgICAgLy8gSWYgbm8gbG9uZ2VyIGluIHVzZSB0aGVuIGFjdHVhbGx5IGNsb3NlIGl0LgogICAgIGlmIChuZXdSZWZDb3VudCA8PSAwKSB7CiAgICAgICAgIG1FeGNsdXNpdmVTdHJlYW1zLmVyYXNlKAogICAgICAgICAgICAgICAgIHN0ZDo6cmVtb3ZlKG1FeGNsdXNpdmVTdHJlYW1zLmJlZ2luKCksIG1FeGNsdXNpdmVTdHJlYW1zLmVuZCgpLCBzZXJ2aWNlRW5kcG9pbnQpLAogICAgICAgICAgICAgICAgIG1FeGNsdXNpdmVTdHJlYW1zLmVuZCgpKTsKIAogICAgICAgICBzZXJ2aWNlRW5kcG9pbnQtPmNsb3NlKCk7Ci0gICAgICAgIEFMT0dEKCJBQXVkaW9FbmRwb2ludE1hbmFnZXI6OmNsb3NlRXhjbHVzaXZlRW5kcG9pbnQoKSAlcCBmb3IgZGV2aWNlICVkIiwKLSAgICAgICAgICAgICAgc2VydmljZUVuZHBvaW50LmdldCgpLCBzZXJ2aWNlRW5kcG9pbnQtPmdldERldmljZUlkKCkpOworICAgICAgICBtRXhjbHVzaXZlQ2xvc2VDb3VudCsrOworICAgICAgICBBTE9HVigiJXMoKSAlcCBmb3IgZGV2aWNlICVkIiwKKyAgICAgICAgICAgICAgX19mdW5jX18sIHNlcnZpY2VFbmRwb2ludC5nZXQoKSwgc2VydmljZUVuZHBvaW50LT5nZXREZXZpY2VJZCgpKTsKICAgICB9CiB9CiAKQEAgLTI2MSwxNCArMjc3LDE1IEBACiAgICAgaW50MzJfdCBuZXdSZWZDb3VudCA9IHNlcnZpY2VFbmRwb2ludC0+Z2V0T3BlbkNvdW50KCkgLSAxOwogICAgIHNlcnZpY2VFbmRwb2ludC0+c2V0T3BlbkNvdW50KG5ld1JlZkNvdW50KTsKIAotICAgIC8vIElmIG5vIGxvbmdlciBpbiB1c2UgdGhlbiBjbG9zZSBhbmQgZGVsZXRlIGl0LgorICAgIC8vIElmIG5vIGxvbmdlciBpbiB1c2UgdGhlbiBhY3R1YWxseSBjbG9zZSBpdC4KICAgICBpZiAobmV3UmVmQ291bnQgPD0gMCkgewogICAgICAgICBtU2hhcmVkU3RyZWFtcy5lcmFzZSgKICAgICAgICAgICAgICAgICBzdGQ6OnJlbW92ZShtU2hhcmVkU3RyZWFtcy5iZWdpbigpLCBtU2hhcmVkU3RyZWFtcy5lbmQoKSwgc2VydmljZUVuZHBvaW50KSwKICAgICAgICAgICAgICAgICBtU2hhcmVkU3RyZWFtcy5lbmQoKSk7CiAKICAgICAgICAgc2VydmljZUVuZHBvaW50LT5jbG9zZSgpOwotICAgICAgICBBTE9HRCgiQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyOjpjbG9zZVNoYXJlZEVuZHBvaW50KCkgJXAgZm9yIGRldmljZSAlZCIsCi0gICAgICAgICAgICAgIHNlcnZpY2VFbmRwb2ludC5nZXQoKSwgc2VydmljZUVuZHBvaW50LT5nZXREZXZpY2VJZCgpKTsKKyAgICAgICAgbVNoYXJlZENsb3NlQ291bnQrKzsKKyAgICAgICAgQUxPR1YoIiVzKCkgJXAgZm9yIGRldmljZSAlZCIsCisgICAgICAgICAgICAgIF9fZnVuY19fLCBzZXJ2aWNlRW5kcG9pbnQuZ2V0KCksIHNlcnZpY2VFbmRwb2ludC0+Z2V0RGV2aWNlSWQoKSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuaAppbmRleCAzMmM4NDU0Li4xOTNiZGVlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuaApAQCAtNDcsNyArNDcsNyBAQAogICAgIHN0ZDo6c3RyaW5nIGR1bXAoKSBjb25zdDsKIAogICAgIC8qKgotICAgICAqIEZpbmQgYSBzZXJ2aWNlIGVuZHBvaW50IGZvciB0aGUgZ2l2ZW4gZGV2aWNlSWQgYW5kIGRpcmVjdGlvbi4KKyAgICAgKiBGaW5kIGEgc2VydmljZSBlbmRwb2ludCBmb3IgdGhlIGdpdmVuIGRldmljZUlkLCBzZXNzaW9uSWQgYW5kIGRpcmVjdGlvbi4KICAgICAgKiBJZiBhbiBlbmRwb2ludCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IHRoZW4gdHJ5IHRvIGNyZWF0ZSBvbmUuCiAgICAgICoKICAgICAgKiBAcGFyYW0gYXVkaW9TZXJ2aWNlCkBAIC04Nyw4ICs4NywxNyBAQAogICAgIG11dGFibGUgc3RkOjptdXRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRXhjbHVzaXZlTG9jazsKICAgICBzdGQ6OnZlY3RvcjxhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQPj4gICAgbUV4Y2x1c2l2ZVN0cmVhbXM7CiAKKyAgICAvLyBNb2RpZmllZCB1bmRlciBhIGxvY2suCisgICAgaW50MzJfdCBtRXhjbHVzaXZlU2VhcmNoQ291bnQgPSAwOyAvLyBudW1iZXIgb2YgdGltZXMgd2UgU0VBUkNIRUQgZm9yIGFuIGV4Y2x1c2l2ZSBlbmRwb2ludAorICAgIGludDMyX3QgbUV4Y2x1c2l2ZUZvdW5kQ291bnQgID0gMDsgLy8gbnVtYmVyIG9mIHRpbWVzIHdlIEZPVU5EIGFuIGV4Y2x1c2l2ZSBlbmRwb2ludAorICAgIGludDMyX3QgbUV4Y2x1c2l2ZU9wZW5Db3VudCAgID0gMDsgLy8gbnVtYmVyIG9mIHRpbWVzIHdlIE9QRU5FRCBhbiBleGNsdXNpdmUgZW5kcG9pbnQKKyAgICBpbnQzMl90IG1FeGNsdXNpdmVDbG9zZUNvdW50ICA9IDA7IC8vIG51bWJlciBvZiB0aW1lcyB3ZSBDTE9TRUQgYW4gZXhjbHVzaXZlIGVuZHBvaW50CisgICAgLy8gU2FtZSBhcyBhYm92ZSBidXQgZm9yIFNIQVJFRCBlbmRwb2ludHMuCisgICAgaW50MzJfdCBtU2hhcmVkU2VhcmNoQ291bnQgICAgPSAwOworICAgIGludDMyX3QgbVNoYXJlZEZvdW5kQ291bnQgICAgID0gMDsKKyAgICBpbnQzMl90IG1TaGFyZWRPcGVuQ291bnQgICAgICA9IDA7CisgICAgaW50MzJfdCBtU2hhcmVkQ2xvc2VDb3VudCAgICAgPSAwOwogfTsKLQogfSAvKiBuYW1lc3BhY2UgYWF1ZGlvICovCiAKICNlbmRpZiAvL0FBVURJT19BQVVESU9fRU5EUE9JTlRfTUFOQUdFUl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9NaXhlci5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9NaXhlci5jcHAKaW5kZXggOTUyYWE4Mi4uYjAzMTg4OCAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvTWl4ZXIuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb01peGVyLmNwcApAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2RlZmluZSBMT0dfVEFHICJBQXVkaW9TZXJ2aWNlIgorI2RlZmluZSBMT0dfVEFHICJBQXVkaW9NaXhlciIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIApAQCAtNDksMTAgKzQ5LDkgQEAKICAgICBtZW1zZXQobU91dHB1dEJ1ZmZlciwgMCwgbUJ1ZmZlclNpemVJbkJ5dGVzKTsKIH0KIAotYm9vbCBBQXVkaW9NaXhlcjo6bWl4KGludCB0cmFja0luZGV4LCBGaWZvQnVmZmVyICpmaWZvLCBmbG9hdCB2b2x1bWUpIHsKK2ludDMyX3QgQUF1ZGlvTWl4ZXI6Om1peChpbnQgc3RyZWFtSW5kZXgsIEZpZm9CdWZmZXIgKmZpZm8sIGJvb2wgYWxsb3dVbmRlcmZsb3cpIHsKICAgICBXcmFwcGluZ0J1ZmZlciB3cmFwcGluZ0J1ZmZlcjsKICAgICBmbG9hdCAqZGVzdGluYXRpb24gPSBtT3V0cHV0QnVmZmVyOwotICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzTGVmdCA9IG1GcmFtZXNQZXJCdXJzdDsKIAogI2lmIEFBVURJT19NSVhFUl9BVFJBQ0VfRU5BQkxFRAogICAgIEFUUkFDRV9CRUdJTigiYWFNaXgiKTsKQEAgLTYzLDQ4ICs2Miw1NyBAQAogI2lmIEFBVURJT19NSVhFUl9BVFJBQ0VfRU5BQkxFRAogICAgIGlmIChBVFJBQ0VfRU5BQkxFRCgpKSB7CiAgICAgICAgIGNoYXIgcmR5VGV4dFtdID0gImFhTWl4UmR5IyI7Ci0gICAgICAgIGNoYXIgbGV0dGVyID0gJ0EnICsgKHRyYWNrSW5kZXggJSAyNik7CisgICAgICAgIGNoYXIgbGV0dGVyID0gJ0EnICsgKHN0cmVhbUluZGV4ICUgMjYpOwogICAgICAgICByZHlUZXh0W3NpemVvZihyZHlUZXh0KSAtIDJdID0gbGV0dGVyOwogICAgICAgICBBVFJBQ0VfSU5UKHJkeVRleHQsIGZ1bGxGcmFtZXMpOwogICAgIH0KICNlbHNlIC8qIE1JWEVSX0FUUkFDRV9FTkFCTEVEICovCiAgICAgKHZvaWQpIHRyYWNrSW5kZXg7Ci0gICAgKHZvaWQpIGZ1bGxGcmFtZXM7CiAjZW5kaWYgLyogQUFVRElPX01JWEVSX0FUUkFDRV9FTkFCTEVEICovCiAKKyAgICAvLyBJZiBhbGxvd1VuZGVyZmxvdyB0aGVuIGFsd2F5cyBhZHZhbmNlIGJ5IG9uZSBidXJzdCBldmVuIGlmIHdlIGRvIG5vdCBoYXZlIHRoZSBkYXRhLgorICAgIC8vIE90aGVyd2lzZSB0aGUgc3RyZWFtIHRpbWluZyB3aWxsIGRyaWZ0IHdoZW5ldmVyIHRoZXJlIGlzIGFuIHVuZGVyZmxvdy4KKyAgICAvLyBUaGlzIGFjdHVhbCB1bmRlcmZsb3cgY2FuIHRoZW4gYmUgZGV0ZWN0ZWQgYnkgdGhlIGNsaWVudCBmb3IgWFJ1biBjb3VudGluZy4KKyAgICAvLworICAgIC8vIEdlbmVyYWxseSwgYWxsb3dVbmRlcmZsb3cgd2lsbCBiZSBmYWxzZSB3aGVuIHN0b3BwaW5nIGEgc3RyZWFtIGFuZCB3ZSB3YW50IHRvCisgICAgLy8gdXNlIHVwIHdoYXRldmVyIGRhdGEgaXMgaW4gdGhlIHF1ZXVlLgorICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzRGVzaXJlZCA9IG1GcmFtZXNQZXJCdXJzdDsKKyAgICBpZiAoIWFsbG93VW5kZXJmbG93ICYmIGZ1bGxGcmFtZXMgPCBmcmFtZXNEZXNpcmVkKSB7CisgICAgICAgIGZyYW1lc0Rlc2lyZWQgPSBmdWxsRnJhbWVzOyAvLyBqdXN0IHVzZSB3aGF0IGlzIGF2YWlsYWJsZSB0aGVuIHN0b3AKKyAgICB9CisKICAgICAvLyBNaXggZGF0YSBpbiBvbmUgb3IgdHdvIHBhcnRzLgogICAgIGludCBwYXJ0SW5kZXggPSAwOworICAgIGludDMyX3QgZnJhbWVzTGVmdCA9IGZyYW1lc0Rlc2lyZWQ7CiAgICAgd2hpbGUgKGZyYW1lc0xlZnQgPiAwICYmIHBhcnRJbmRleCA8IFdyYXBwaW5nQnVmZmVyOjpTSVpFKSB7Ci0gICAgICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzVG9NaXggPSBmcmFtZXNMZWZ0OwotICAgICAgICBmaWZvX2ZyYW1lc190IGZyYW1lc0F2YWlsYWJsZSA9IHdyYXBwaW5nQnVmZmVyLm51bUZyYW1lc1twYXJ0SW5kZXhdOwotICAgICAgICBpZiAoZnJhbWVzQXZhaWxhYmxlID4gMCkgewotICAgICAgICAgICAgaWYgKGZyYW1lc1RvTWl4ID4gZnJhbWVzQXZhaWxhYmxlKSB7Ci0gICAgICAgICAgICAgICAgZnJhbWVzVG9NaXggPSBmcmFtZXNBdmFpbGFibGU7CisgICAgICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzVG9NaXhGcm9tUGFydCA9IGZyYW1lc0xlZnQ7CisgICAgICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzQXZhaWxhYmxlRnJvbVBhcnQgPSB3cmFwcGluZ0J1ZmZlci5udW1GcmFtZXNbcGFydEluZGV4XTsKKyAgICAgICAgaWYgKGZyYW1lc0F2YWlsYWJsZUZyb21QYXJ0ID4gMCkgeworICAgICAgICAgICAgaWYgKGZyYW1lc1RvTWl4RnJvbVBhcnQgPiBmcmFtZXNBdmFpbGFibGVGcm9tUGFydCkgeworICAgICAgICAgICAgICAgIGZyYW1lc1RvTWl4RnJvbVBhcnQgPSBmcmFtZXNBdmFpbGFibGVGcm9tUGFydDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1peFBhcnQoZGVzdGluYXRpb24sIChmbG9hdCAqKXdyYXBwaW5nQnVmZmVyLmRhdGFbcGFydEluZGV4XSwgZnJhbWVzVG9NaXgsIHZvbHVtZSk7CisgICAgICAgICAgICBtaXhQYXJ0KGRlc3RpbmF0aW9uLCAoZmxvYXQgKil3cmFwcGluZ0J1ZmZlci5kYXRhW3BhcnRJbmRleF0sCisgICAgICAgICAgICAgICAgICAgIGZyYW1lc1RvTWl4RnJvbVBhcnQpOwogCi0gICAgICAgICAgICBkZXN0aW5hdGlvbiArPSBmcmFtZXNUb01peCAqIG1TYW1wbGVzUGVyRnJhbWU7Ci0gICAgICAgICAgICBmcmFtZXNMZWZ0IC09IGZyYW1lc1RvTWl4OworICAgICAgICAgICAgZGVzdGluYXRpb24gKz0gZnJhbWVzVG9NaXhGcm9tUGFydCAqIG1TYW1wbGVzUGVyRnJhbWU7CisgICAgICAgICAgICBmcmFtZXNMZWZ0IC09IGZyYW1lc1RvTWl4RnJvbVBhcnQ7CiAgICAgICAgIH0KICAgICAgICAgcGFydEluZGV4Kys7CiAgICAgfQotICAgIC8vIEFsd2F5cyBhZHZhbmNlIGJ5IG9uZSBidXJzdCBldmVuIGlmIHdlIGRvIG5vdCBoYXZlIHRoZSBkYXRhLgotICAgIC8vIE90aGVyd2lzZSB0aGUgc3RyZWFtIHRpbWluZyB3aWxsIGRyaWZ0IHdoZW5ldmVyIHRoZXJlIGlzIGFuIHVuZGVyZmxvdy4KLSAgICAvLyBUaGlzIGFjdHVhbCB1bmRlcmZsb3cgY2FuIHRoZW4gYmUgZGV0ZWN0ZWQgYnkgdGhlIGNsaWVudCBmb3IgWFJ1biBjb3VudGluZy4KLSAgICBmaWZvLT5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+YWR2YW5jZVJlYWRJbmRleChtRnJhbWVzUGVyQnVyc3QpOworICAgIGZpZm8tPmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5hZHZhbmNlUmVhZEluZGV4KGZyYW1lc0Rlc2lyZWQpOwogCiAjaWYgQUFVRElPX01JWEVSX0FUUkFDRV9FTkFCTEVECiAgICAgQVRSQUNFX0VORCgpOwogI2VuZGlmIC8qIEFBVURJT19NSVhFUl9BVFJBQ0VfRU5BQkxFRCAqLwogCi0gICAgcmV0dXJuIChmcmFtZXNMZWZ0ID4gMCk7IC8vIGRpZCBub3QgZ2V0IGFsbCB0aGUgZnJhbWVzIHdlIG5lZWRlZCwgaWUuICJ1bmRlcmZsb3ciCisgICAgcmV0dXJuIChmcmFtZXNEZXNpcmVkIC0gZnJhbWVzTGVmdCk7IC8vIGZyYW1lc1JlYWQKIH0KIAotdm9pZCBBQXVkaW9NaXhlcjo6bWl4UGFydChmbG9hdCAqZGVzdGluYXRpb24sIGZsb2F0ICpzb3VyY2UsIGludDMyX3QgbnVtRnJhbWVzLCBmbG9hdCB2b2x1bWUpIHsKK3ZvaWQgQUF1ZGlvTWl4ZXI6Om1peFBhcnQoZmxvYXQgKmRlc3RpbmF0aW9uLCBmbG9hdCAqc291cmNlLCBpbnQzMl90IG51bUZyYW1lcykgewogICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IG51bUZyYW1lcyAqIG1TYW1wbGVzUGVyRnJhbWU7CiAgICAgLy8gVE9ETyBtYXliZSBvcHRpbWl6ZSB1c2luZyBTSU1ECiAgICAgZm9yIChpbnQgc2FtcGxlSW5kZXggPSAwOyBzYW1wbGVJbmRleCA8IG51bVNhbXBsZXM7IHNhbXBsZUluZGV4KyspIHsKLSAgICAgICAgKmRlc3RpbmF0aW9uKysgKz0gKnNvdXJjZSsrICogdm9sdW1lOworICAgICAgICAqZGVzdGluYXRpb24rKyArPSAqc291cmNlKys7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9NaXhlci5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvTWl4ZXIuaAppbmRleCBhODA5MGJjLi5kNWFiYzViIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9NaXhlci5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb01peGVyLmgKQEAgLTMzLDIyICszMywyNCBAQAogCiAgICAgLyoqCiAgICAgICogTWl4IGZyb20gdGhpcyBGSUZPCi0gICAgICogQHBhcmFtIGZpZm8KLSAgICAgKiBAcGFyYW0gdm9sdW1lCi0gICAgICogQHJldHVybiB0cnVlIGlmIHVuZGVyZmxvd2VkCisgICAgICogQHBhcmFtIHN0cmVhbUluZGV4IGZvciBtYXJraW5nIHN0cmVhbSB2YXJpYWJsZXMgaW4gc3lzdHJhY2UKKyAgICAgKiBAcGFyYW0gZmlmbyB0byByZWFkIGZyb20KKyAgICAgKiBAcGFyYW0gYWxsb3dVbmRlcmZsb3cgaWYgdHJ1ZSB0aGVuIGFsbG93IG1peGVyIHRvIGFkdmFuY2UgcmVhZCBpbmRleCBwYXN0IHRoZSB3cml0ZSBpbmRleAorICAgICAqIEByZXR1cm4gZnJhbWVzIHJlYWQgZnJvbSB0aGlzIHN0cmVhbQogICAgICAqLwotICAgIGJvb2wgbWl4KGludCB0cmFja0luZGV4LCBhbmRyb2lkOjpGaWZvQnVmZmVyICpmaWZvLCBmbG9hdCB2b2x1bWUpOwotCi0gICAgdm9pZCBtaXhQYXJ0KGZsb2F0ICpkZXN0aW5hdGlvbiwgZmxvYXQgKnNvdXJjZSwgaW50MzJfdCBudW1GcmFtZXMsIGZsb2F0IHZvbHVtZSk7CisgICAgaW50MzJfdCBtaXgoaW50IHN0cmVhbUluZGV4LCBhbmRyb2lkOjpGaWZvQnVmZmVyICpmaWZvLCBib29sIGFsbG93VW5kZXJmbG93KTsKIAogICAgIGZsb2F0ICpnZXRPdXRwdXRCdWZmZXIoKTsKIAorICAgIGludDMyX3QgZ2V0RnJhbWVzUGVyQnVyc3QoKSBjb25zdCB7IHJldHVybiBtRnJhbWVzUGVyQnVyc3Q7IH0KKwogcHJpdmF0ZToKKyAgICB2b2lkIG1peFBhcnQoZmxvYXQgKmRlc3RpbmF0aW9uLCBmbG9hdCAqc291cmNlLCBpbnQzMl90IG51bUZyYW1lcyk7CisKICAgICBmbG9hdCAgICptT3V0cHV0QnVmZmVyID0gbnVsbHB0cjsKICAgICBpbnQzMl90ICBtU2FtcGxlc1BlckZyYW1lID0gMDsKICAgICBpbnQzMl90ICBtRnJhbWVzUGVyQnVyc3QgPSAwOwogICAgIGludDMyX3QgIG1CdWZmZXJTaXplSW5CeXRlcyA9IDA7CiB9OwogCi0KICNlbmRpZiAvL0FBVURJT19BQVVESU9fTUlYRVJfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlLmNwcAppbmRleCA1YTM0ODhkLi42YTcyZTViIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlLmNwcApAQCAtMzIsNyArMzIsNiBAQAogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2UuaCIKICNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5oIgogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuaCIKLSNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5oIgogI2luY2x1ZGUgImJpbmRpbmcvSUFBdWRpb1NlcnZpY2UuaCIKICNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCiAKQEAgLTkyLDE0ICs5MSwxNCBAQAogICAgIGlmIChwaWQgIT0gbUF1ZGlvQ2xpZW50LmNsaWVudFBpZCkgewogICAgICAgICBpbnQzMl90IGNvdW50ID0gQUF1ZGlvQ2xpZW50VHJhY2tlcjo6Z2V0SW5zdGFuY2UoKS5nZXRTdHJlYW1Db3VudChwaWQpOwogICAgICAgICBpZiAoY291bnQgPj0gTUFYX1NUUkVBTVNfUEVSX1BST0NFU1MpIHsKLSAgICAgICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlOjpvcGVuU3RyZWFtKCk6IGV4Y2VlZGVkIG1heCBzdHJlYW1zIHBlciBwcm9jZXNzICVkID49ICVkIiwKKyAgICAgICAgICAgIEFMT0dFKCJvcGVuU3RyZWFtKCk6IGV4Y2VlZGVkIG1heCBzdHJlYW1zIHBlciBwcm9jZXNzICVkID49ICVkIiwKICAgICAgICAgICAgICAgICAgIGNvdW50LCAgTUFYX1NUUkVBTVNfUEVSX1BST0NFU1MpOwogICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRTsKICAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChzaGFyaW5nTW9kZSAhPSBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSAmJiBzaGFyaW5nTW9kZSAhPSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCkgewotICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZTo6b3BlblN0cmVhbSgpOiB1bnJlY29nbml6ZWQgc2hhcmluZyBtb2RlID0gJWQiLCBzaGFyaW5nTW9kZSk7CisgICAgICAgIEFMT0dFKCJvcGVuU3RyZWFtKCk6IHVucmVjb2duaXplZCBzaGFyaW5nIG1vZGUgPSAlZCIsIHNoYXJpbmdNb2RlKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTExFR0FMX0FSR1VNRU5UOwogICAgIH0KIApAQCAtMTE0LDcgKzExMyw3IEBACiAgICAgICAgIHJlc3VsdCA9IHNlcnZpY2VTdHJlYW0tPm9wZW4ocmVxdWVzdCk7CiAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CiAgICAgICAgICAgICAvLyBDbGVhciBpdCBzbyB3ZSBjYW4gcG9zc2libHkgZmFsbCBiYWNrIHRvIHVzaW5nIGEgc2hhcmVkIHN0cmVhbS4KLSAgICAgICAgICAgIEFMT0dXKCJBQXVkaW9TZXJ2aWNlOjpvcGVuU3RyZWFtKCksIGNvdWxkIG5vdCBvcGVuIGluIEVYQ0xVU0lWRSBtb2RlIik7CisgICAgICAgICAgICBBTE9HVygib3BlblN0cmVhbSgpLCBjb3VsZCBub3Qgb3BlbiBpbiBFWENMVVNJVkUgbW9kZSIpOwogICAgICAgICAgICAgc2VydmljZVN0cmVhbS5jbGVhcigpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTI4LDEyICsxMjcsMTIgQEAKIAogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CiAgICAgICAgIHNlcnZpY2VTdHJlYW0uY2xlYXIoKTsKLSAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2U6Om9wZW5TdHJlYW0oKTogZmFpbGVkLCByZXR1cm4gJWQgPSAlcyIsCisgICAgICAgIEFMT0dFKCJvcGVuU3RyZWFtKCk6IGZhaWxlZCwgcmV0dXJuICVkID0gJXMiLAogICAgICAgICAgICAgICByZXN1bHQsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0gZWxzZSB7CiAgICAgICAgIGFhdWRpb19oYW5kbGVfdCBoYW5kbGUgPSBtU3RyZWFtVHJhY2tlci5hZGRTdHJlYW1Gb3JIYW5kbGUoc2VydmljZVN0cmVhbS5nZXQoKSk7Ci0gICAgICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlOjpvcGVuU3RyZWFtKCk6IGhhbmRsZSA9IDB4JTA4WCIsIGhhbmRsZSk7CisgICAgICAgIEFMT0dEKCJvcGVuU3RyZWFtKCk6IGhhbmRsZSA9IDB4JTA4WCIsIGhhbmRsZSk7CiAgICAgICAgIHNlcnZpY2VTdHJlYW0tPnNldEhhbmRsZShoYW5kbGUpOwogICAgICAgICBwaWRfdCBwaWQgPSByZXF1ZXN0LmdldFByb2Nlc3NJZCgpOwogICAgICAgICBBQXVkaW9DbGllbnRUcmFja2VyOjpnZXRJbnN0YW5jZSgpLnJlZ2lzdGVyQ2xpZW50U3RyZWFtKHBpZCwgc2VydmljZVN0cmVhbSk7CkBAIC0xNDIsMzQgKzE0MSw0OCBAQAogICAgIH0KIH0KIAorLy8gSWYgYSBjbG9zZSByZXF1ZXN0IGlzIHBlbmRpbmcgdGhlbiBjbG9zZSB0aGUgc3RyZWFtCitib29sIEFBdWRpb1NlcnZpY2U6OnJlbGVhc2VTdHJlYW0oY29uc3Qgc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+ICZzZXJ2aWNlU3RyZWFtKSB7CisgICAgYm9vbCBjbG9zZWQgPSBmYWxzZTsKKyAgICAvLyBkZWNyZW1lbnRBbmRSZW1vdmVTdHJlYW1CeUhhbmRsZSgpIHVzZXMgYSBsb2NrIHNvIHRoYXQgaWYgdGhlcmUgYXJlIHR3byBzaW11bHRhbmVvdXMgY2xvc2VzCisgICAgLy8gdGhlbiBvbmx5IG9uZSB3aWxsIGdldCB0aGUgcG9pbnRlciBhbmQgZG8gdGhlIGNsb3NlLgorICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBmb3VuZFN0cmVhbSA9IG1TdHJlYW1UcmFja2VyLmRlY3JlbWVudEFuZFJlbW92ZVN0cmVhbUJ5SGFuZGxlKAorICAgICAgICAgICAgc2VydmljZVN0cmVhbS0+Z2V0SGFuZGxlKCkpOworICAgIGlmIChmb3VuZFN0cmVhbS5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIGZvdW5kU3RyZWFtLT5jbG9zZSgpOworICAgICAgICBwaWRfdCBwaWQgPSBmb3VuZFN0cmVhbS0+Z2V0T3duZXJQcm9jZXNzSWQoKTsKKyAgICAgICAgQUF1ZGlvQ2xpZW50VHJhY2tlcjo6Z2V0SW5zdGFuY2UoKS51bnJlZ2lzdGVyQ2xpZW50U3RyZWFtKHBpZCwgZm91bmRTdHJlYW0pOworICAgICAgICBjbG9zZWQgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gY2xvc2VkOworfQorCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZTo6Y2hlY2tGb3JQZW5kaW5nQ2xvc2UoCisgICAgICAgIGNvbnN0IHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiAmc2VydmljZVN0cmVhbSwKKyAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IGRlZmF1bHRSZXN1bHQpIHsKKyAgICByZXR1cm4gcmVsZWFzZVN0cmVhbShzZXJ2aWNlU3RyZWFtKSA/IEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFIDogZGVmYXVsdFJlc3VsdDsKK30KKwogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2U6OmNsb3NlU3RyZWFtKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIHsKICAgICAvLyBDaGVjayBwZXJtaXNzaW9uIGFuZCBvd25lcnNoaXAgZmlyc3QuCiAgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHNlcnZpY2VTdHJlYW0gPSBjb252ZXJ0SGFuZGxlVG9TZXJ2aWNlU3RyZWFtKHN0cmVhbUhhbmRsZSk7CiAgICAgaWYgKHNlcnZpY2VTdHJlYW0uZ2V0KCkgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZTo6Y2xvc2VTdHJlYW0oMHglMHgpLCBpbGxlZ2FsIHN0cmVhbSBoYW5kbGUiLCBzdHJlYW1IYW5kbGUpOworICAgICAgICBBTE9HRSgiY2xvc2VTdHJlYW0oMHglMHgpLCBpbGxlZ2FsIHN0cmVhbSBoYW5kbGUiLCBzdHJlYW1IYW5kbGUpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFOwogICAgIH0KIAotICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlLmNsb3NlU3RyZWFtKDB4JTA4WCkiLCBzdHJlYW1IYW5kbGUpOwotICAgIC8vIFJlbW92ZSBoYW5kbGUgZnJvbSB0cmFja2VyIHNvIHRoYXQgd2UgY2Fubm90IGxvb2sgdXAgdGhlIHJhdyBhZGRyZXNzIGFueSBtb3JlLgotICAgIC8vIHJlbW92ZVN0cmVhbUJ5SGFuZGxlKCkgdXNlcyBhIGxvY2sgc28gdGhhdCBpZiB0aGVyZSBhcmUgdHdvIHNpbXVsdGFuZW91cyBjbG9zZXMKLSAgICAvLyB0aGVuIG9ubHkgb25lIHdpbGwgZ2V0IHRoZSBwb2ludGVyIGFuZCBkbyB0aGUgY2xvc2UuCi0gICAgc2VydmljZVN0cmVhbSA9IG1TdHJlYW1UcmFja2VyLnJlbW92ZVN0cmVhbUJ5SGFuZGxlKHN0cmVhbUhhbmRsZSk7Ci0gICAgaWYgKHNlcnZpY2VTdHJlYW0uZ2V0KCkgIT0gbnVsbHB0cikgewotICAgICAgICBzZXJ2aWNlU3RyZWFtLT5jbG9zZSgpOwotICAgICAgICBwaWRfdCBwaWQgPSBzZXJ2aWNlU3RyZWFtLT5nZXRPd25lclByb2Nlc3NJZCgpOwotICAgICAgICBBQXVkaW9DbGllbnRUcmFja2VyOjpnZXRJbnN0YW5jZSgpLnVucmVnaXN0ZXJDbGllbnRTdHJlYW0ocGlkLCBzZXJ2aWNlU3RyZWFtKTsKLSAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVygiQUF1ZGlvU2VydmljZTo6Y2xvc2VTdHJlYW0oMHglMHgpIGJlaW5nIGhhbmRsZWQgYnkgYW5vdGhlciB0aHJlYWQiLCBzdHJlYW1IYW5kbGUpOwotICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFOwotICAgIH0KKyAgICBwaWRfdCBwaWQgPSBzZXJ2aWNlU3RyZWFtLT5nZXRPd25lclByb2Nlc3NJZCgpOworICAgIEFBdWRpb0NsaWVudFRyYWNrZXI6OmdldEluc3RhbmNlKCkudW5yZWdpc3RlckNsaWVudFN0cmVhbShwaWQsIHNlcnZpY2VTdHJlYW0pOworCisgICAgc2VydmljZVN0cmVhbS0+bWFya0Nsb3NlTmVlZGVkKCk7CisgICAgKHZvaWQpIHJlbGVhc2VTdHJlYW0oc2VydmljZVN0cmVhbSk7CisgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KIAotCiBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gQUF1ZGlvU2VydmljZTo6Y29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbSgKICAgICAgICAgYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgewotICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtID0gbVN0cmVhbVRyYWNrZXIuZ2V0U3RyZWFtQnlIYW5kbGUoc3RyZWFtSGFuZGxlKTsKKyAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbSA9IG1TdHJlYW1UcmFja2VyLmdldFN0cmVhbUJ5SGFuZGxlQW5kSW5jcmVtZW50KAorICAgICAgICAgICAgc3RyZWFtSGFuZGxlKTsKICAgICBpZiAoc2VydmljZVN0cmVhbS5nZXQoKSAhPSBudWxscHRyKSB7CiAgICAgICAgIC8vIE9ubHkgYWxsb3cgb3duZXIgb3IgdGhlIGFhdWRpbyBzZXJ2aWNlIHRvIGFjY2VzcyB0aGUgc3RyZWFtLgogICAgICAgICBjb25zdCB1aWRfdCBjYWxsaW5nVXNlcklkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwpAQCAtMTgxLDcgKzE5NCw5IEBACiAgICAgICAgIGlmICghYWxsb3dlZCkgewogICAgICAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2U6IGNhbGxpbmcgdWlkICVkIGNhbm5vdCBhY2Nlc3Mgc3RyZWFtIDB4JTA4WCBvd25lZCBieSAlZCIsCiAgICAgICAgICAgICAgICAgICBjYWxsaW5nVXNlcklkLCBzdHJlYW1IYW5kbGUsIG93bmVyVXNlcklkKTsKLSAgICAgICAgICAgIHNlcnZpY2VTdHJlYW0gPSBudWxscHRyOworICAgICAgICAgICAgLy8gV2UgaW5jcmVtZW50ZWQgdGhlIHJlZmVyZW5jZSBjb3VudCBzbyB3ZSBtdXN0IGNoZWNrIGlmIGl0IG5lZWRzIHRvIGJlIGNsb3NlZC4KKyAgICAgICAgICAgIGNoZWNrRm9yUGVuZGluZ0Nsb3NlKHNlcnZpY2VTdHJlYW0sIEFBVURJT19PSyk7CisgICAgICAgICAgICBzZXJ2aWNlU3RyZWFtLmNsZWFyKCk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHNlcnZpY2VTdHJlYW07CkBAIC0xOTIsOTQgKzIwNyw5NyBAQAogICAgICAgICAgICAgICAgIGFhdWRpbzo6QXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJnBhcmNlbGFibGUpIHsKICAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbSA9IGNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKICAgICBpZiAoc2VydmljZVN0cmVhbS5nZXQoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlOjpnZXRTdHJlYW1EZXNjcmlwdGlvbigpLCBpbGxlZ2FsIHN0cmVhbSBoYW5kbGUgPSAweCUweCIsIHN0cmVhbUhhbmRsZSk7CisgICAgICAgIEFMT0dFKCJnZXRTdHJlYW1EZXNjcmlwdGlvbigpLCBpbGxlZ2FsIHN0cmVhbSBoYW5kbGUgPSAweCUweCIsIHN0cmVhbUhhbmRsZSk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9IQU5ETEU7CiAgICAgfQogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHNlcnZpY2VTdHJlYW0tPmdldERlc2NyaXB0aW9uKHBhcmNlbGFibGUpOwogICAgIC8vIHBhcmNlbGFibGUuZHVtcCgpOwotICAgIHJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIGNoZWNrRm9yUGVuZGluZ0Nsb3NlKHNlcnZpY2VTdHJlYW0sIHJlc3VsdCk7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlOjpzdGFydFN0cmVhbShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSB7CiAgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHNlcnZpY2VTdHJlYW0gPSBjb252ZXJ0SGFuZGxlVG9TZXJ2aWNlU3RyZWFtKHN0cmVhbUhhbmRsZSk7CiAgICAgaWYgKHNlcnZpY2VTdHJlYW0uZ2V0KCkgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZTo6c3RhcnRTdHJlYW0oKSwgaWxsZWdhbCBzdHJlYW0gaGFuZGxlID0gMHglMHgiLCBzdHJlYW1IYW5kbGUpOworICAgICAgICBBTE9HRSgic3RhcnRTdHJlYW0oKSwgaWxsZWdhbCBzdHJlYW0gaGFuZGxlID0gMHglMHgiLCBzdHJlYW1IYW5kbGUpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFOwogICAgIH0KIAotICAgIHJldHVybiBzZXJ2aWNlU3RyZWFtLT5zdGFydCgpOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzZXJ2aWNlU3RyZWFtLT5zdGFydCgpOworICAgIHJldHVybiBjaGVja0ZvclBlbmRpbmdDbG9zZShzZXJ2aWNlU3RyZWFtLCByZXN1bHQpOwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZTo6cGF1c2VTdHJlYW0oYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgewogICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtID0gY29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbShzdHJlYW1IYW5kbGUpOwogICAgIGlmIChzZXJ2aWNlU3RyZWFtLmdldCgpID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2U6OnBhdXNlU3RyZWFtKCksIGlsbGVnYWwgc3RyZWFtIGhhbmRsZSA9IDB4JTB4Iiwgc3RyZWFtSGFuZGxlKTsKKyAgICAgICAgQUxPR0UoInBhdXNlU3RyZWFtKCksIGlsbGVnYWwgc3RyZWFtIGhhbmRsZSA9IDB4JTB4Iiwgc3RyZWFtSGFuZGxlKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX0hBTkRMRTsKICAgICB9CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHNlcnZpY2VTdHJlYW0tPnBhdXNlKCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gY2hlY2tGb3JQZW5kaW5nQ2xvc2Uoc2VydmljZVN0cmVhbSwgcmVzdWx0KTsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2U6OnN0b3BTdHJlYW0oYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgewogICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtID0gY29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbShzdHJlYW1IYW5kbGUpOwogICAgIGlmIChzZXJ2aWNlU3RyZWFtLmdldCgpID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2U6OnN0b3BTdHJlYW0oKSwgaWxsZWdhbCBzdHJlYW0gaGFuZGxlID0gMHglMHgiLCBzdHJlYW1IYW5kbGUpOworICAgICAgICBBTE9HRSgic3RvcFN0cmVhbSgpLCBpbGxlZ2FsIHN0cmVhbSBoYW5kbGUgPSAweCUweCIsIHN0cmVhbUhhbmRsZSk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9IQU5ETEU7CiAgICAgfQogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzZXJ2aWNlU3RyZWFtLT5zdG9wKCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gY2hlY2tGb3JQZW5kaW5nQ2xvc2Uoc2VydmljZVN0cmVhbSwgcmVzdWx0KTsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2U6OmZsdXNoU3RyZWFtKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIHsKICAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbSA9IGNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKICAgICBpZiAoc2VydmljZVN0cmVhbS5nZXQoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlOjpmbHVzaFN0cmVhbSgpLCBpbGxlZ2FsIHN0cmVhbSBoYW5kbGUgPSAweCUweCIsIHN0cmVhbUhhbmRsZSk7CisgICAgICAgIEFMT0dFKCJmbHVzaFN0cmVhbSgpLCBpbGxlZ2FsIHN0cmVhbSBoYW5kbGUgPSAweCUweCIsIHN0cmVhbUhhbmRsZSk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9IQU5ETEU7CiAgICAgfQotICAgIHJldHVybiBzZXJ2aWNlU3RyZWFtLT5mbHVzaCgpOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzZXJ2aWNlU3RyZWFtLT5mbHVzaCgpOworICAgIHJldHVybiBjaGVja0ZvclBlbmRpbmdDbG9zZShzZXJ2aWNlU3RyZWFtLCByZXN1bHQpOwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZTo6cmVnaXN0ZXJBdWRpb1RocmVhZChhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgY2xpZW50VGhyZWFkSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHBlcmlvZE5hbm9zZWNvbmRzKSB7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKICAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbSA9IGNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKICAgICBpZiAoc2VydmljZVN0cmVhbS5nZXQoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlOjpyZWdpc3RlckF1ZGlvVGhyZWFkKCksIGlsbGVnYWwgc3RyZWFtIGhhbmRsZSA9IDB4JTB4Iiwgc3RyZWFtSGFuZGxlKTsKKyAgICAgICAgQUxPR0UoInJlZ2lzdGVyQXVkaW9UaHJlYWQoKSwgaWxsZWdhbCBzdHJlYW0gaGFuZGxlID0gMHglMHgiLCBzdHJlYW1IYW5kbGUpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFOwogICAgIH0KICAgICBpZiAoc2VydmljZVN0cmVhbS0+Z2V0UmVnaXN0ZXJlZFRocmVhZCgpICE9IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpJTExFR0FMX1RIUkVBRF9JRCkgewogICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZTo6cmVnaXN0ZXJBdWRpb1RocmVhZCgpLCB0aHJlYWQgYWxyZWFkeSByZWdpc3RlcmVkIik7Ci0gICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKLSAgICB9Ci0KLSAgICBjb25zdCBwaWRfdCBvd25lclBpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsgLy8gVE9ETyByZXZpZXcKLSAgICBzZXJ2aWNlU3RyZWFtLT5zZXRSZWdpc3RlcmVkVGhyZWFkKGNsaWVudFRocmVhZElkKTsKLSAgICBpbnQgZXJyID0gYW5kcm9pZDo6cmVxdWVzdFByaW9yaXR5KG93bmVyUGlkLCBjbGllbnRUaHJlYWRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfQVVESU9fUFJJT1JJVFksIHRydWUgLyogaXNGb3JBcHAgKi8pOwotICAgIGlmIChlcnIgIT0gMCl7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlOjpyZWdpc3RlckF1ZGlvVGhyZWFkKCVkKSBmYWlsZWQsIGVycm5vID0gJWQsIHByaW9yaXR5ID0gJWQiLAotICAgICAgICAgICAgICBjbGllbnRUaHJlYWRJZCwgZXJybm8sIERFRkFVTFRfQVVESU9fUFJJT1JJVFkpOwotICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVEVSTkFMOworICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gQUFVRElPX09LOworICAgICAgICBjb25zdCBwaWRfdCBvd25lclBpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsgLy8gVE9ETyByZXZpZXcKKyAgICAgICAgc2VydmljZVN0cmVhbS0+c2V0UmVnaXN0ZXJlZFRocmVhZChjbGllbnRUaHJlYWRJZCk7CisgICAgICAgIGludCBlcnIgPSBhbmRyb2lkOjpyZXF1ZXN0UHJpb3JpdHkob3duZXJQaWQsIGNsaWVudFRocmVhZElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfQVVESU9fUFJJT1JJVFksIHRydWUgLyogaXNGb3JBcHAgKi8pOworICAgICAgICBpZiAoZXJyICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlOjpyZWdpc3RlckF1ZGlvVGhyZWFkKCVkKSBmYWlsZWQsIGVycm5vID0gJWQsIHByaW9yaXR5ID0gJWQiLAorICAgICAgICAgICAgICAgICAgY2xpZW50VGhyZWFkSWQsIGVycm5vLCBERUZBVUxUX0FVRElPX1BSSU9SSVRZKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9JTlRFUk5BTDsKKyAgICAgICAgfQogICAgIH0KKyAgICByZXR1cm4gY2hlY2tGb3JQZW5kaW5nQ2xvc2Uoc2VydmljZVN0cmVhbSwgcmVzdWx0KTsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2U6OnVucmVnaXN0ZXJBdWRpb1RocmVhZChhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBjbGllbnRUaHJlYWRJZCkgeworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CiAgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHNlcnZpY2VTdHJlYW0gPSBjb252ZXJ0SGFuZGxlVG9TZXJ2aWNlU3RyZWFtKHN0cmVhbUhhbmRsZSk7CiAgICAgaWYgKHNlcnZpY2VTdHJlYW0uZ2V0KCkgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZTo6dW5yZWdpc3RlckF1ZGlvVGhyZWFkKCksIGlsbGVnYWwgc3RyZWFtIGhhbmRsZSA9IDB4JTB4IiwKLSAgICAgICAgICAgICAgc3RyZWFtSGFuZGxlKTsKKyAgICAgICAgQUxPR0UoIiVzKCksIGlsbGVnYWwgc3RyZWFtIGhhbmRsZSA9IDB4JTB4IiwgX19mdW5jX18sIHN0cmVhbUhhbmRsZSk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9IQU5ETEU7CiAgICAgfQogICAgIGlmIChzZXJ2aWNlU3RyZWFtLT5nZXRSZWdpc3RlcmVkVGhyZWFkKCkgIT0gY2xpZW50VGhyZWFkSWQpIHsKLSAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2U6OnVucmVnaXN0ZXJBdWRpb1RocmVhZCgpLCB3cm9uZyB0aHJlYWQiKTsKLSAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTExFR0FMX0FSR1VNRU5UOworICAgICAgICBBTE9HRSgiJXMoKSwgd3JvbmcgdGhyZWFkIiwgX19mdW5jX18pOworICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVDsKKyAgICB9IGVsc2UgeworICAgICAgICBzZXJ2aWNlU3RyZWFtLT5zZXRSZWdpc3RlcmVkVGhyZWFkKDApOwogICAgIH0KLSAgICBzZXJ2aWNlU3RyZWFtLT5zZXRSZWdpc3RlcmVkVGhyZWFkKDApOwotICAgIHJldHVybiBBQVVESU9fT0s7CisgICAgcmV0dXJuIGNoZWNrRm9yUGVuZGluZ0Nsb3NlKHNlcnZpY2VTdHJlYW0sIHJlc3VsdCk7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlOjpzdGFydENsaWVudChhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLApAQCAtMjg3LDIwICszMDUsMzUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpjbGllbnRIYW5kbGUpIHsKICAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbSA9IGNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKICAgICBpZiAoc2VydmljZVN0cmVhbS5nZXQoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlOjpzdGFydENsaWVudCgpLCBpbGxlZ2FsIHN0cmVhbSBoYW5kbGUgPSAweCUweCIsCi0gICAgICAgICAgICAgIHN0cmVhbUhhbmRsZSk7CisgICAgICAgIEFMT0dFKCIlcygpLCBpbGxlZ2FsIHN0cmVhbSBoYW5kbGUgPSAweCUweCIsIF9fZnVuY19fLCBzdHJlYW1IYW5kbGUpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFOwogICAgIH0KLSAgICByZXR1cm4gc2VydmljZVN0cmVhbS0+c3RhcnRDbGllbnQoY2xpZW50LCBjbGllbnRIYW5kbGUpOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzZXJ2aWNlU3RyZWFtLT5zdGFydENsaWVudChjbGllbnQsIGNsaWVudEhhbmRsZSk7CisgICAgcmV0dXJuIGNoZWNrRm9yUGVuZGluZ0Nsb3NlKHNlcnZpY2VTdHJlYW0sIHJlc3VsdCk7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlOjpzdG9wQ2xpZW50KGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGNsaWVudEhhbmRsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SGFuZGxlKSB7CiAgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHNlcnZpY2VTdHJlYW0gPSBjb252ZXJ0SGFuZGxlVG9TZXJ2aWNlU3RyZWFtKHN0cmVhbUhhbmRsZSk7CiAgICAgaWYgKHNlcnZpY2VTdHJlYW0uZ2V0KCkgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZTo6c3RvcENsaWVudCgpLCBpbGxlZ2FsIHN0cmVhbSBoYW5kbGUgPSAweCUweCIsCi0gICAgICAgICAgICAgIHN0cmVhbUhhbmRsZSk7CisgICAgICAgIEFMT0dFKCIlcygpLCBpbGxlZ2FsIHN0cmVhbSBoYW5kbGUgPSAweCUweCIsIF9fZnVuY19fLCBzdHJlYW1IYW5kbGUpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFOwogICAgIH0KLSAgICByZXR1cm4gc2VydmljZVN0cmVhbS0+c3RvcENsaWVudChjbGllbnRIYW5kbGUpOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzZXJ2aWNlU3RyZWFtLT5zdG9wQ2xpZW50KHBvcnRIYW5kbGUpOworICAgIHJldHVybiBjaGVja0ZvclBlbmRpbmdDbG9zZShzZXJ2aWNlU3RyZWFtLCByZXN1bHQpOworfQorCisvLyBUaGlzIGlzIG9ubHkgY2FsbGVkIGludGVybmFsbHkgd2hlbiBBdWRpb0ZsaW5nZXIgd2FudHMgdG8gdGVhciBkb3duIGEgc3RyZWFtLgorLy8gU28gd2UgZG8gbm90IGhhdmUgdG8gY2hlY2sgcGVybWlzc2lvbnMuCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZTo6ZGlzY29ubmVjdFN0cmVhbUJ5UG9ydEhhbmRsZShhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRIYW5kbGUpIHsKKyAgICBBTE9HRCgiJXMoJWQpIGNhbGxlZCIsIF9fZnVuY19fLCBwb3J0SGFuZGxlKTsKKyAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbSA9CisgICAgICAgICAgICBtU3RyZWFtVHJhY2tlci5maW5kU3RyZWFtQnlQb3J0SGFuZGxlQW5kSW5jcmVtZW50KHBvcnRIYW5kbGUpOworICAgIGlmIChzZXJ2aWNlU3RyZWFtLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzKCksIGNvdWxkIG5vdCBmaW5kIHN0cmVhbSB3aXRoIHBvcnRIYW5kbGUgPSAlZCIsIF9fZnVuY19fLCBwb3J0SGFuZGxlKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX0hBTkRMRTsKKyAgICB9CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHNlcnZpY2VTdHJlYW0tPnN0b3AoKTsKKyAgICBzZXJ2aWNlU3RyZWFtLT5kaXNjb25uZWN0KCk7CisgICAgcmV0dXJuIGNoZWNrRm9yUGVuZGluZ0Nsb3NlKHNlcnZpY2VTdHJlYW0sIHJlc3VsdCk7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlLmgKaW5kZXggZWVmMDgyNC4uZDIxYjFjZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZS5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2UuaApAQCAtODMsNiArODMsOCBAQAogICAgIGFhdWRpb19yZXN1bHRfdCBzdG9wQ2xpZW50KGFhdWRpbzo6YWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgY2xpZW50SGFuZGxlKSBvdmVycmlkZTsKIAorICAgIGFhdWRpb19yZXN1bHRfdCBkaXNjb25uZWN0U3RyZWFtQnlQb3J0SGFuZGxlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydEhhbmRsZSk7CisKIHByaXZhdGU6CiAKICAgICAvKioKQEAgLTk0LDkgKzk2LDE1IEBACiAgICAgICAgICAgICBhYXVkaW86OmFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpOwogCiAKLSAgICBhbmRyb2lkOjpBdWRpb0NsaWVudCBtQXVkaW9DbGllbnQ7CiAKLSAgICBhYXVkaW86OkFBdWRpb1N0cmVhbVRyYWNrZXIgICAgICAgICAgICAgICAgIG1TdHJlYW1UcmFja2VyOworICAgIGJvb2wgcmVsZWFzZVN0cmVhbShjb25zdCBzcDxhYXVkaW86OkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiAmc2VydmljZVN0cmVhbSk7CisKKyAgICBhYXVkaW9fcmVzdWx0X3QgY2hlY2tGb3JQZW5kaW5nQ2xvc2UoY29uc3Qgc3A8YWF1ZGlvOjpBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gJnNlcnZpY2VTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19yZXN1bHRfdCBkZWZhdWx0UmVzdWx0KTsKKworICAgIGFuZHJvaWQ6OkF1ZGlvQ2xpZW50ICAgICAgICAgICAgbUF1ZGlvQ2xpZW50OworCisgICAgYWF1ZGlvOjpBQXVkaW9TdHJlYW1UcmFja2VyICAgICBtU3RyZWFtVHJhY2tlcjsKIAogICAgIGVudW0gY29uc3RhbnRzIHsKICAgICAgICAgREVGQVVMVF9BVURJT19QUklPUklUWSA9IDIKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuY3BwCmluZGV4IDMwOTViYzkuLjAzNDkwMzQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmNwcApAQCAtMzksNyArMzksNyBAQAogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsgICAvLyBUT0RPIGp1c3QgaW1wb3J0IG5hbWVzIG5lZWRlZAogCiBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ6On5BQXVkaW9TZXJ2aWNlRW5kcG9pbnQoKSB7Ci0gICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VFbmRwb2ludDo6fkFBdWRpb1NlcnZpY2VFbmRwb2ludCgpIGRlc3Ryb3lpbmcgZW5kcG9pbnQgJXAiLCB0aGlzKTsKKyAgICBBTE9HRCgiJXMoJXApIGRlc3Ryb3llZCIsIF9fZnVuY19fLCB0aGlzKTsKIH0KIAogc3RkOjpzdHJpbmcgQUF1ZGlvU2VydmljZUVuZHBvaW50OjpkdW1wKCkgY29uc3QgewpAQCAtNTUsMTEgKzU1LDE3IEBACiAKICAgICByZXN1bHQgPDwgIiAgICBEaXJlY3Rpb246ICAgICAgICAgICAgIiA8PCAoKGdldERpcmVjdGlvbigpID09IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICJPVVRQVVQiIDogIklOUFVUIikgPDwgIlxuIjsKLSAgICByZXN1bHQgPDwgIiAgICBTYW1wbGUgUmF0ZTogICAgICAgICAgIiA8PCBnZXRTYW1wbGVSYXRlKCkgPDwgIlxuIjsKLSAgICByZXN1bHQgPDwgIiAgICBGcmFtZXMgUGVyIEJ1cnN0OiAgICAgIiA8PCBtRnJhbWVzUGVyQnVyc3QgPDwgIlxuIjsKLSAgICByZXN1bHQgPDwgIiAgICBSZWZlcmVuY2UgQ291bnQ6ICAgICAgIiA8PCBtT3BlbkNvdW50IDw8ICJcbiI7CiAgICAgcmVzdWx0IDw8ICIgICAgUmVxdWVzdGVkIERldmljZSBJZDogICIgPDwgbVJlcXVlc3RlZERldmljZUlkIDw8ICJcbiI7CiAgICAgcmVzdWx0IDw8ICIgICAgRGV2aWNlIElkOiAgICAgICAgICAgICIgPDwgZ2V0RGV2aWNlSWQoKSA8PCAiXG4iOworICAgIHJlc3VsdCA8PCAiICAgIFNhbXBsZSBSYXRlOiAgICAgICAgICAiIDw8IGdldFNhbXBsZVJhdGUoKSA8PCAiXG4iOworICAgIHJlc3VsdCA8PCAiICAgIENoYW5uZWwgQ291bnQ6ICAgICAgICAiIDw8IGdldFNhbXBsZXNQZXJGcmFtZSgpIDw8ICJcbiI7CisgICAgcmVzdWx0IDw8ICIgICAgRnJhbWVzIFBlciBCdXJzdDogICAgICIgPDwgbUZyYW1lc1BlckJ1cnN0IDw8ICJcbiI7CisgICAgcmVzdWx0IDw8ICIgICAgVXNhZ2U6ICAgICAgICAgICAgICAgICIgPDwgZ2V0VXNhZ2UoKSA8PCAiXG4iOworICAgIHJlc3VsdCA8PCAiICAgIENvbnRlbnRUeXBlOiAgICAgICAgICAiIDw8IGdldENvbnRlbnRUeXBlKCkgPDwgIlxuIjsKKyAgICByZXN1bHQgPDwgIiAgICBJbnB1dFByZXNldDogICAgICAgICAgIiA8PCBnZXRJbnB1dFByZXNldCgpIDw8ICJcbiI7CisgICAgcmVzdWx0IDw8ICIgICAgUmVmZXJlbmNlIENvdW50OiAgICAgICIgPDwgbU9wZW5Db3VudCA8PCAiXG4iOworICAgIHJlc3VsdCA8PCAiICAgIFNlc3Npb24gSWQ6ICAgICAgICAgICAiIDw8IGdldFNlc3Npb25JZCgpIDw8ICJcbiI7CisgICAgcmVzdWx0IDw8ICIgICAgQ29ubmVjdGVkOiAgICAgICAgICAgICIgPDwgbUNvbm5lY3RlZC5sb2FkKCkgPDwgIlxuIjsKICAgICByZXN1bHQgPDwgIiAgICBSZWdpc3RlcmVkIFN0cmVhbXM6IiA8PCAiXG4iOwogICAgIHJlc3VsdCA8PCBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpkdW1wSGVhZGVyKCkgPDwgIlxuIjsKICAgICBmb3IgKGNvbnN0IGF1dG8gc3RyZWFtIDogbVJlZ2lzdGVyZWRTdHJlYW1zKSB7CkBAIC03Miw5ICs3OCwyMiBAQAogICAgIHJldHVybiByZXN1bHQuc3RyKCk7CiB9CiAKLXZvaWQgQUF1ZGlvU2VydmljZUVuZHBvaW50OjpkaXNjb25uZWN0UmVnaXN0ZXJlZFN0cmVhbXMoKSB7CisvLyBAcmV0dXJuIHRydWUgaWYgc3RyZWFtIGZvdW5kCitib29sIEFBdWRpb1NlcnZpY2VFbmRwb2ludDo6aXNTdHJlYW1SZWdpc3RlcmVkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydEhhbmRsZSkgewogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrU3RyZWFtcyk7CiAgICAgZm9yIChjb25zdCBhdXRvIHN0cmVhbSA6IG1SZWdpc3RlcmVkU3RyZWFtcykgeworICAgICAgICBpZiAoc3RyZWFtLT5nZXRQb3J0SGFuZGxlKCkgPT0gcG9ydEhhbmRsZSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEFBdWRpb1NlcnZpY2VFbmRwb2ludDo6ZGlzY29ubmVjdFJlZ2lzdGVyZWRTdHJlYW1zKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrU3RyZWFtcyk7CisgICAgbUNvbm5lY3RlZC5zdG9yZShmYWxzZSk7CisgICAgZm9yIChjb25zdCBhdXRvIHN0cmVhbSA6IG1SZWdpc3RlcmVkU3RyZWFtcykgeworICAgICAgICBBTE9HRCgiZGlzY29ubmVjdFJlZ2lzdGVyZWRTdHJlYW1zKCkgc3RvcCBhbmQgZGlzY29ubmVjdCAlcCIsIHN0cmVhbS5nZXQoKSk7CiAgICAgICAgIHN0cmVhbS0+c3RvcCgpOwogICAgICAgICBzdHJlYW0tPmRpc2Nvbm5lY3QoKTsKICAgICB9CkBAIC05Niw2ICsxMTUsOSBAQAogfQogCiBib29sIEFBdWRpb1NlcnZpY2VFbmRwb2ludDo6bWF0Y2hlcyhjb25zdCBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uJiBjb25maWd1cmF0aW9uKSB7CisgICAgaWYgKCFtQ29ubmVjdGVkLmxvYWQoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7IC8vIE9ubHkgdXNlIGFuIGVuZHBvaW50IGlmIGl0IGlzIGNvbm5lY3RlZCB0byBhIGRldmljZS4KKyAgICB9CiAgICAgaWYgKGNvbmZpZ3VyYXRpb24uZ2V0RGlyZWN0aW9uKCkgIT0gZ2V0RGlyZWN0aW9uKCkpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTEwMyw2ICsxMjUsMTAgQEAKICAgICAgICAgY29uZmlndXJhdGlvbi5nZXREZXZpY2VJZCgpICE9IGdldERldmljZUlkKCkpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KKyAgICBpZiAoY29uZmlndXJhdGlvbi5nZXRTZXNzaW9uSWQoKSAhPSBBQVVESU9fU0VTU0lPTl9JRF9BTExPQ0FURSAmJgorICAgICAgICBjb25maWd1cmF0aW9uLmdldFNlc3Npb25JZCgpICE9IGdldFNlc3Npb25JZCgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAgICAgaWYgKGNvbmZpZ3VyYXRpb24uZ2V0U2FtcGxlUmF0ZSgpICE9IEFBVURJT19VTlNQRUNJRklFRCAmJgogICAgICAgICBjb25maWd1cmF0aW9uLmdldFNhbXBsZVJhdGUoKSAhPSBnZXRTYW1wbGVSYXRlKCkpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuaAppbmRleCBjMTljYzM1Li4yNTNmMjkwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuaApAQCAtOTcsNyArOTcsMTggQEAKICAgICAgICAgbU9wZW5Db3VudCA9IGNvdW50OwogICAgIH0KIAorICAgIGJvb2wgaXNDb25uZWN0ZWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQ29ubmVjdGVkOworICAgIH0KKwogcHJvdGVjdGVkOgorCisgICAgLyoqCisgICAgICogQHBhcmFtIHBvcnRIYW5kbGUKKyAgICAgKiBAcmV0dXJuIHJldHVybiB0cnVlIGlmIGEgc3RyZWFtIHdpdGggdGhlIGdpdmVuIHBvcnRIYW5kbGUgaXMgcmVnaXN0ZXJlZAorICAgICAqLworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICBpc1N0cmVhbVJlZ2lzdGVyZWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SGFuZGxlKTsKKwogICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0UmVnaXN0ZXJlZFN0cmVhbXMoKTsKIAogICAgIG11dGFibGUgc3RkOjptdXRleCAgICAgICBtTG9ja1N0cmVhbXM7CkBAIC0xMTEsNiArMTIyLDcgQEAKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgbU9wZW5Db3VudCA9IDA7CiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgIG1SZXF1ZXN0ZWREZXZpY2VJZCA9IDA7CiAKKyAgICBzdGQ6OmF0b21pYzxib29sPiAgICAgICAgbUNvbm5lY3RlZHt0cnVlfTsKIH07CiAKIH0gLyogbmFtZXNwYWNlIGFhdWRpbyAqLwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZS5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlLmNwcAppbmRleCBjN2Q5YjhlLi5lZmFjNzg4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlLmNwcApAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2RlZmluZSBMT0dfVEFHICJBQXVkaW9TZXJ2aWNlIgorI2RlZmluZSBMT0dfVEFHICJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCkBAIC01Nyw4ICs1Nyw3IEBACiAKIC8vIFJlYWQgZGF0YSBmcm9tIHRoZSBzaGFyZWQgTU1BUCBzdHJlYW0gYW5kIHRoZW4gZGlzdHJpYnV0ZSBpdCB0byB0aGUgY2xpZW50IHN0cmVhbXMuCiB2b2lkICpBQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlOjpjYWxsYmFja0xvb3AoKSB7Ci0gICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUoKTogY2FsbGJhY2tMb29wKCkgZW50ZXJpbmciKTsKLSAgICBpbnQzMl90IHVuZGVyZmxvd0NvdW50ID0gMDsKKyAgICBBTE9HRCgiY2FsbGJhY2tMb29wKCkgZW50ZXJpbmciKTsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOwogICAgIGludDY0X3QgdGltZW91dE5hbm9zID0gZ2V0U3RyZWFtSW50ZXJuYWwoKS0+Y2FsY3VsYXRlUmVhc29uYWJsZVRpbWVvdXQoKTsKIApAQCAtNzMsNyArNzIsNyBAQAogICAgICAgICAgICAgZGlzY29ubmVjdFJlZ2lzdGVyZWRTdHJlYW1zKCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgIT0gZ2V0RnJhbWVzUGVyQnVyc3QoKSkgewotICAgICAgICAgICAgQUxPR1coIkFBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUoKTogY2FsbGJhY2tMb29wKCkgcmVhZCAlZCAvICVkIiwKKyAgICAgICAgICAgIEFMT0dXKCJjYWxsYmFja0xvb3AoKSByZWFkICVkIC8gJWQiLAogICAgICAgICAgICAgICAgICAgcmVzdWx0LCBnZXRGcmFtZXNQZXJCdXJzdCgpKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xMDIsOSArMTAxLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwb3NpdGlvbk9mZnNldCA9IG1tYXBGcmFtZXNSZWFkIC0gY2xpZW50RnJhbWVzV3JpdHRlbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1TaGFyZWQtPnNldFRpbWVzdGFtcFBvc2l0aW9uT2Zmc2V0KHBvc2l0aW9uT2Zmc2V0KTsKIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElzIHRoZSBidWZmZXIgdG9vIGZ1bGwgdG8gd3JpdGUgYSBidXJzdD8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlmby0+Z2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCkgPAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGcmFtZXNQZXJCdXJzdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVyZmxvd0NvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGcmFtZXNQZXJCdXJzdCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVNoYXJlZC0+aW5jcmVtZW50WFJ1bkNvdW50KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlmby0+d3JpdGUobURpc3RyaWJ1dGlvbkJ1ZmZlciwgZ2V0RnJhbWVzUGVyQnVyc3QoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTI1LDYgKzEyNSw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBBTE9HRCgiQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZSgpOiBjYWxsYmFja0xvb3AoKSBleGl0aW5nLCAlZCB1bmRlcmZsb3dzIiwgdW5kZXJmbG93Q291bnQpOworICAgIEFMT0dEKCJjYWxsYmFja0xvb3AoKSBleGl0aW5nIik7CiAgICAgcmV0dXJuIE5VTEw7IC8vIFRPRE8gcmV2aWV3CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAuY3BwCmluZGV4IDdlNmUyNDcuLmY5ZTIxZmIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAuY3BwCkBAIC00OCw4ICs0OCwxMCBAQAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7ICAvLyBUT0RPIGp1c3QgaW1wb3J0IG5hbWVzIG5lZWRlZAogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsgICAvLyBUT0RPIGp1c3QgaW1wb3J0IG5hbWVzIG5lZWRlZAogCi1BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQKCkKLSAgICAgICAgOiAgbU1tYXBTdHJlYW0obnVsbHB0cikge30KKworQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6QUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUChBQXVkaW9TZXJ2aWNlICZhdWRpb1NlcnZpY2UpCisgICAgICAgIDogbU1tYXBTdHJlYW0obnVsbHB0cikKKyAgICAgICAgLCBtQUF1ZGlvU2VydmljZShhdWRpb1NlcnZpY2UpIHt9CiAKIEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6On5BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQKCkge30KIApAQCAtNzIsMTMgKzc0LDYgQEAKIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6Om9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KSB7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKLSAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IHsKLSAgICAgICAgICAgIC5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfTVVTSUMsCi0gICAgICAgICAgICAudXNhZ2UgPSBBVURJT19VU0FHRV9NRURJQSwKLSAgICAgICAgICAgIC5zb3VyY2UgPSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04sCi0gICAgICAgICAgICAuZmxhZ3MgPSBBVURJT19GTEFHX0xPV19MQVRFTkNZLAotICAgICAgICAgICAgLnRhZ3MgPSAiIgotICAgIH07CiAgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBjb25maWc7CiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZDsKIApAQCAtODcsNiArODIsMjggQEAKIAogICAgIGNvcHlGcm9tKHJlcXVlc3QuZ2V0Q29uc3RhbnRDb25maWd1cmF0aW9uKCkpOwogCisgICAgYWF1ZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiA9IGdldERpcmVjdGlvbigpOworCisgICAgY29uc3QgYXVkaW9fY29udGVudF90eXBlX3QgY29udGVudFR5cGUgPQorICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9jb250ZW50VHlwZVRvSW50ZXJuYWwoZ2V0Q29udGVudFR5cGUoKSk7CisgICAgLy8gVXNhZ2Ugb25seSB1c2VkIGZvciBPVVRQVVQKKyAgICBjb25zdCBhdWRpb191c2FnZV90IHVzYWdlID0gKGRpcmVjdGlvbiA9PSBBQVVESU9fRElSRUNUSU9OX09VVFBVVCkKKyAgICAgICAgICAgID8gQUF1ZGlvQ29udmVydF91c2FnZVRvSW50ZXJuYWwoZ2V0VXNhZ2UoKSkKKyAgICAgICAgICAgIDogQVVESU9fVVNBR0VfVU5LTk9XTjsKKyAgICBjb25zdCBhdWRpb19zb3VyY2VfdCBzb3VyY2UgPSAoZGlyZWN0aW9uID09IEFBVURJT19ESVJFQ1RJT05fSU5QVVQpCisgICAgICAgICAgICA/IEFBdWRpb0NvbnZlcnRfaW5wdXRQcmVzZXRUb0F1ZGlvU291cmNlKGdldElucHV0UHJlc2V0KCkpCisgICAgICAgICAgICA6IEFVRElPX1NPVVJDRV9ERUZBVUxUOworCisgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSB7CisgICAgICAgICAgICAuY29udGVudF90eXBlID0gY29udGVudFR5cGUsCisgICAgICAgICAgICAudXNhZ2UgPSB1c2FnZSwKKyAgICAgICAgICAgIC5zb3VyY2UgPSBzb3VyY2UsCisgICAgICAgICAgICAuZmxhZ3MgPSBBVURJT19GTEFHX0xPV19MQVRFTkNZLAorICAgICAgICAgICAgLnRhZ3MgPSAiIgorICAgIH07CisgICAgQUxPR0QoIiVzKCVwKSBNTUFQIGF0dHJpYnV0ZXMudXNhZ2UgPSAlZCwgY29udGVudF90eXBlID0gJWQsIHNvdXJjZSA9ICVkIiwKKyAgICAgICAgICBfX2Z1bmNfXywgdGhpcywgYXR0cmlidXRlcy51c2FnZSwgYXR0cmlidXRlcy5jb250ZW50X3R5cGUsIGF0dHJpYnV0ZXMuc291cmNlKTsKKwogICAgIG1NbWFwQ2xpZW50LmNsaWVudFVpZCA9IHJlcXVlc3QuZ2V0VXNlcklkKCk7CiAgICAgbU1tYXBDbGllbnQuY2xpZW50UGlkID0gcmVxdWVzdC5nZXRQcm9jZXNzSWQoKTsKICAgICBtTW1hcENsaWVudC5wYWNrYWdlTmFtZS5zZXRUbyhTdHJpbmcxNigiIikpOwpAQCAtMTA4LDcgKzEyNSw2IEBACiAKICAgICBpbnQzMl90IGFhdWRpb1NhbXBsZXNQZXJGcmFtZSA9IGdldFNhbXBsZXNQZXJGcmFtZSgpOwogCi0gICAgYWF1ZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiA9IGdldERpcmVjdGlvbigpOwogICAgIGlmIChkaXJlY3Rpb24gPT0gQUFVRElPX0RJUkVDVElPTl9PVVRQVVQpIHsKICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IChhYXVkaW9TYW1wbGVzUGVyRnJhbWUgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8KQEAgLTEyMiw3ICsxMzgsNyBAQAogICAgICAgICBtSGFyZHdhcmVUaW1lT2Zmc2V0TmFub3MgPSBJTlBVVF9FU1RJTUFURURfSEFSRFdBUkVfT0ZGU0VUX05BTk9TOyAvLyBmcmFtZXMgYXQgQURDIGVhcmxpZXIKIAogICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJvcGVuTW1hcFN0cmVhbSAtIGludmFsaWQgZGlyZWN0aW9uID0gJWQiLCBkaXJlY3Rpb24pOworICAgICAgICBBTE9HRSgiJXMoKSBpbnZhbGlkIGRpcmVjdGlvbiA9ICVkIiwgX19mdW5jX18sIGRpcmVjdGlvbik7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVDsKICAgICB9CiAKQEAgLTEzMSwyNyArMTQ3LDQyIEBACiAgICAgICAgICAgICA/IE1tYXBTdHJlYW1JbnRlcmZhY2U6OkRJUkVDVElPTl9PVVRQVVQKICAgICAgICAgICAgIDogTW1hcFN0cmVhbUludGVyZmFjZTo6RElSRUNUSU9OX0lOUFVUOwogCisgICAgYWF1ZGlvX3Nlc3Npb25faWRfdCByZXF1ZXN0ZWRTZXNzaW9uSWQgPSBnZXRTZXNzaW9uSWQoKTsKKyAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkID0gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTZXNzaW9uSWQocmVxdWVzdGVkU2Vzc2lvbklkKTsKKwogICAgIC8vIE9wZW4gSEFMIHN0cmVhbS4gU2V0IG1NbWFwU3RyZWFtCiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTW1hcFN0cmVhbUludGVyZmFjZTo6b3Blbk1tYXBTdHJlYW0oc3RyZWFtRGlyZWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1tYXBDbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgLy8gY2FsbGJhY2sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTW1hcFN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbVBvcnRIYW5kbGUpOwotICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpvcGVuKCkgbU1hcENsaWVudC51aWQgPSAlZCwgcGlkID0gJWQgPT4gcG9ydEhhbmRsZSA9ICVkXG4iLAotICAgICAgICAgIG1NbWFwQ2xpZW50LmNsaWVudFVpZCwgIG1NbWFwQ2xpZW50LmNsaWVudFBpZCwgbVBvcnRIYW5kbGUpOworICAgIEFMT0dEKCIlcygpIG1NYXBDbGllbnQudWlkID0gJWQsIHBpZCA9ICVkID0+IHBvcnRIYW5kbGUgPSAlZFxuIiwKKyAgICAgICAgICBfX2Z1bmNfXywgbU1tYXBDbGllbnQuY2xpZW50VWlkLCAgbU1tYXBDbGllbnQuY2xpZW50UGlkLCBtUG9ydEhhbmRsZSk7CiAgICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICBBTE9HRSgib3Blbk1tYXBTdHJlYW0gcmV0dXJuZWQgc3RhdHVzICVkIiwgc3RhdHVzKTsKKyAgICAgICAgQUxPR0UoIiVzKCkgb3Blbk1tYXBTdHJlYW0oKSByZXR1cm5lZCBzdGF0dXMgJWQiLCAgX19mdW5jX18sIHN0YXR1cyk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CiAgICAgfQogCiAgICAgaWYgKGRldmljZUlkID09IEFBVURJT19VTlNQRUNJRklFRCkgewotICAgICAgICBBTE9HVygiQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6b3BlbigpIC0gb3Blbk1tYXBTdHJlYW0oKSBmYWlsZWQgdG8gc2V0IGRldmljZUlkIik7CisgICAgICAgIEFMT0dXKCIlcygpIG9wZW5NbWFwU3RyZWFtKCkgZmFpbGVkIHRvIHNldCBkZXZpY2VJZCIsIF9fZnVuY19fKTsKICAgICB9CiAgICAgc2V0RGV2aWNlSWQoZGV2aWNlSWQpOwogCisgICAgaWYgKHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX0FMTE9DQVRFKSB7CisgICAgICAgIEFMT0dXKCIlcygpIC0gb3Blbk1tYXBTdHJlYW0oKSBmYWlsZWQgdG8gc2V0IHNlc3Npb25JZCIsIF9fZnVuY19fKTsKKyAgICB9CisKKyAgICBhYXVkaW9fc2Vzc2lvbl9pZF90IGFjdHVhbFNlc3Npb25JZCA9CisgICAgICAgICAgICAocmVxdWVzdGVkU2Vzc2lvbklkID09IEFBVURJT19TRVNTSU9OX0lEX05PTkUpCisgICAgICAgICAgICA/IEFBVURJT19TRVNTSU9OX0lEX05PTkUKKyAgICAgICAgICAgIDogKGFhdWRpb19zZXNzaW9uX2lkX3QpIHNlc3Npb25JZDsKKyAgICBzZXRTZXNzaW9uSWQoYWN0dWFsU2Vzc2lvbklkKTsKKyAgICBBTE9HRCgiJXMoKSBkZXZpY2VJZCA9ICVkLCBzZXNzaW9uSWQgPSAlZCIsIF9fZnVuY19fLCBnZXREZXZpY2VJZCgpLCBnZXRTZXNzaW9uSWQoKSk7CisKICAgICAvLyBDcmVhdGUgTU1BUC9OT0lSUSBidWZmZXIuCiAgICAgaW50MzJfdCBtaW5TaXplRnJhbWVzID0gZ2V0QnVmZmVyQ2FwYWNpdHkoKTsKICAgICBpZiAobWluU2l6ZUZyYW1lcyA8PSAwKSB7IC8vIHplcm8gd2lsbCBnZXQgcmVqZWN0ZWQKQEAgLTE1OSwxNCArMTkwLDE0IEBACiAgICAgfQogICAgIHN0YXR1cyA9IG1NbWFwU3RyZWFtLT5jcmVhdGVNbWFwQnVmZmVyKG1pblNpemVGcmFtZXMsICZtTW1hcEJ1ZmZlcmluZm8pOwogICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6Om9wZW4oKSAtIGNyZWF0ZU1tYXBCdWZmZXIoKSBmYWlsZWQgd2l0aCBzdGF0dXMgJWQgJXMiLAotICAgICAgICAgICAgICBzdGF0dXMsIHN0cmVycm9yKC1zdGF0dXMpKTsKKyAgICAgICAgQUxPR0UoIiVzKCkgLSBjcmVhdGVNbWFwQnVmZmVyKCkgZmFpbGVkIHdpdGggc3RhdHVzICVkICVzIiwKKyAgICAgICAgICAgICAgX19mdW5jX18sIHN0YXR1cywgc3RyZXJyb3IoLXN0YXR1cykpOwogICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0QoImNyZWF0ZU1tYXBCdWZmZXIgc3RhdHVzID0gJWQsIGJ1ZmZlcl9zaXplID0gJWQsIGJ1cnN0X3NpemUgJWQiCisgICAgICAgIEFMT0dEKCIlcygpIGNyZWF0ZU1tYXBCdWZmZXIoKSByZXR1cm5lZCA9ICVkLCBidWZmZXJfc2l6ZSA9ICVkLCBidXJzdF9zaXplICVkIgogICAgICAgICAgICAgICAgICAgICAgICIsIFNoYXJhYmxlIEZEOiAlcyIsCi0gICAgICAgICAgICAgIHN0YXR1cywKKyAgICAgICAgICAgICAgX19mdW5jX18sIHN0YXR1cywKICAgICAgICAgICAgICAgYWJzKG1NbWFwQnVmZmVyaW5mby5idWZmZXJfc2l6ZV9mcmFtZXMpLAogICAgICAgICAgICAgICBtTW1hcEJ1ZmZlcmluZm8uYnVyc3Rfc2l6ZV9mcmFtZXMsCiAgICAgICAgICAgICAgIG1NbWFwQnVmZmVyaW5mby5idWZmZXJfc2l6ZV9mcmFtZXMgPCAwID8gIlllcyIgOiAiTm8iKTsKQEAgLTE4Niw3ICsyMTcsNyBAQAogICAgICAgICAgICAgLy8gRmFsbGJhY2sgaXMgaGFuZGxlZCBieSBjYWxsZXIgYnV0IGluZGljYXRlIHdoYXQgaXMgcG9zc2libGUgaW4gY2FzZQogICAgICAgICAgICAgLy8gdGhpcyBpcyB1c2VkIGluIHRoZSBmdXR1cmUKICAgICAgICAgICAgIHNldFNoYXJpbmdNb2RlKEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEKTsKLSAgICAgICAgICAgIEFMT0dXKCJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpvcGVuKCkgLSBleGNsdXNpdmUgRkQgY2Fubm90IGJlIHVzZWQgYnkgY2xpZW50Iik7CisgICAgICAgICAgICBBTE9HVygiJXMoKSAtIGV4Y2x1c2l2ZSBGRCBjYW5ub3QgYmUgdXNlZCBieSBjbGllbnQiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CiAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9CkBAIC0yMDEsNyArMjMyLDcgQEAKICAgICAvLyBBc3N1bWUgdGhhdCBBdWRpb0ZsaW5nZXIgd2lsbCBjbG9zZSB0aGUgb3JpZ2luYWwgc2hhcmVkX21lbW9yeV9mZC4KICAgICBtQXVkaW9EYXRhRmlsZURlc2NyaXB0b3IucmVzZXQoZHVwKG1NbWFwQnVmZmVyaW5mby5zaGFyZWRfbWVtb3J5X2ZkKSk7CiAgICAgaWYgKG1BdWRpb0RhdGFGaWxlRGVzY3JpcHRvci5nZXQoKSA9PSAtMSkgewotICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6b3BlbigpIC0gY291bGQgbm90IGR1cCBzaGFyZWRfbWVtb3J5X2ZkIik7CisgICAgICAgIEFMT0dFKCIlcygpIC0gY291bGQgbm90IGR1cCBzaGFyZWRfbWVtb3J5X2ZkIiwgX19mdW5jX18pOwogICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfSU5URVJOQUw7CiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQpAQCAtMjE5LDEyICsyNTAsMTIgQEAKICAgICAgICAgYnVyc3RNaWNyb3MgPSBtRnJhbWVzUGVyQnVyc3QgKiBzdGF0aWNfY2FzdDxpbnQ2NF90PigxMDAwMDAwKSAvIGdldFNhbXBsZVJhdGUoKTsKICAgICB9IHdoaWxlIChidXJzdE1pY3JvcyA8IGJ1cnN0TWluTWljcm9zKTsKIAotICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpvcGVuKCkgb3JpZ2luYWwgYnVyc3QgPSAlZCwgbWluTWljcm9zID0gJWQsIHRvIGJ1cnN0ID0gJWRcbiIsCi0gICAgICAgICAgbU1tYXBCdWZmZXJpbmZvLmJ1cnN0X3NpemVfZnJhbWVzLCBidXJzdE1pbk1pY3JvcywgbUZyYW1lc1BlckJ1cnN0KTsKKyAgICBBTE9HRCgiJXMoKSBvcmlnaW5hbCBidXJzdCA9ICVkLCBtaW5NaWNyb3MgPSAlZCwgdG8gYnVyc3QgPSAlZFxuIiwKKyAgICAgICAgICBfX2Z1bmNfXywgbU1tYXBCdWZmZXJpbmZvLmJ1cnN0X3NpemVfZnJhbWVzLCBidXJzdE1pbk1pY3JvcywgbUZyYW1lc1BlckJ1cnN0KTsKIAotICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpvcGVuKCkgYWN0dWFsIHJhdGUgPSAlZCwgY2hhbm5lbHMgPSAlZCIKKyAgICBBTE9HRCgiJXMoKSBhY3R1YWwgcmF0ZSA9ICVkLCBjaGFubmVscyA9ICVkIgogICAgICAgICAgICIsIGRldmljZUlkID0gJWQsIGNhcGFjaXR5ID0gJWRcbiIsCi0gICAgICAgICAgZ2V0U2FtcGxlUmF0ZSgpLCBnZXRTYW1wbGVzUGVyRnJhbWUoKSwgZGV2aWNlSWQsIGdldEJ1ZmZlckNhcGFjaXR5KCkpOworICAgICAgICAgIF9fZnVuY19fLCBnZXRTYW1wbGVSYXRlKCksIGdldFNhbXBsZXNQZXJGcmFtZSgpLCBkZXZpY2VJZCwgZ2V0QnVmZmVyQ2FwYWNpdHkoKSk7CiAKICAgICByZXR1cm4gcmVzdWx0OwogCkBAIC0yMzQsOSArMjY1LDggQEAKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6OmNsb3NlKCkgewotCiAgICAgaWYgKG1NbWFwU3RyZWFtICE9IDApIHsKLSAgICAgICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6OmNsb3NlKCkgY2xlYXIoKSBlbmRwb2ludCIpOworICAgICAgICBBTE9HRCgiJXMoKSBjbGVhcigpIGVuZHBvaW50IiwgX19mdW5jX18pOwogICAgICAgICAvLyBOZWVkcyB0byBiZSBleHBsaWNpdGx5IGNsZWFyZWQgb3IgQ1RTIHdpbGwgZmFpbCBidXQgaXQgaXMgbm90IGNsZWFyIHdoeS4KICAgICAgICAgbU1tYXBTdHJlYW0uY2xlYXIoKTsKICAgICAgICAgLy8gQXBwYXJlbnRseSB0aGUgYWJvdmUgY2xvc2UgaXMgYXN5bmNocm9ub3VzLiBBbiBhdHRlbXB0IHRvIG9wZW4gYSBuZXcgZGV2aWNlCkBAIC0yNDksMTQgKzI3OSwyMSBAQAogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6c3RhcnRTdHJlYW0oc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmNsaWVudEhhbmRsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqY2xpZW50SGFuZGxlIF9fdW51c2VkKSB7CiAgICAgLy8gU3RhcnQgdGhlIGNsaWVudCBvbiBiZWhhbGYgb2YgdGhlIEFBdWRpbyBzZXJ2aWNlLgogICAgIC8vIFVzZSB0aGUgcG9ydCBoYW5kbGUgdGhhdCB3YXMgcHJvdmlkZWQgYnkgb3Blbk1tYXBTdHJlYW0oKS4KLSAgICByZXR1cm4gc3RhcnRDbGllbnQobU1tYXBDbGllbnQsICZtUG9ydEhhbmRsZSk7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCB0ZW1wSGFuZGxlID0gbVBvcnRIYW5kbGU7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHN0YXJ0Q2xpZW50KG1NbWFwQ2xpZW50LCAmdGVtcEhhbmRsZSk7CisgICAgLy8gV2hlbiBBdWRpb0ZsaW5nZXIgaXMgcGFzc2VkIGEgdmFsaWQgcG9ydCBoYW5kbGUgdGhlbiBpdCBzaG91bGQgbm90IGNoYW5nZSBpdC4KKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHRlbXBIYW5kbGUgIT0gbVBvcnRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAiJXMoKSBwb3J0IGhhbmRsZSBub3QgZXhwZWN0ZWQgdG8gY2hhbmdlIGZyb20gJWQgdG8gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SGFuZGxlLCB0ZW1wSGFuZGxlKTsKKyAgICBBTE9HVigiJXMoJXApIG1Qb3J0SGFuZGxlID0gJWQiLCBfX2Z1bmNfXywgc3RyZWFtLmdldCgpLCBtUG9ydEhhbmRsZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6OnN0b3BTdHJlYW0oc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBjbGllbnRIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBjbGllbnRIYW5kbGUgX191bnVzZWQpIHsKICAgICBtRnJhbWVzVHJhbnNmZXJyZWQucmVzZXQzMigpOwogCiAgICAgLy8gUm91bmQgNjQtYml0IGNvdW50ZXIgdXAgdG8gYSBtdWx0aXBsZSBvZiB0aGUgYnVmZmVyIGNhcGFjaXR5LgpAQCAtMjY1LDI2ICszMDIsMjcgQEAKICAgICAvLyB3aGVuIHRoZSBzdHJlYW0gaXMgc3RvcHBlZC4KICAgICBtRnJhbWVzVHJhbnNmZXJyZWQucm91bmRVcDY0KGdldEJ1ZmZlckNhcGFjaXR5KCkpOwogCisgICAgLy8gVXNlIHRoZSBwb3J0IGhhbmRsZSB0aGF0IHdhcyBwcm92aWRlZCBieSBvcGVuTW1hcFN0cmVhbSgpLgorICAgIEFMT0dWKCIlcyglcCkgbVBvcnRIYW5kbGUgPSAlZCIsIF9fZnVuY19fLCBzdHJlYW0uZ2V0KCksIG1Qb3J0SGFuZGxlKTsKICAgICByZXR1cm4gc3RvcENsaWVudChtUG9ydEhhbmRsZSk7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpzdGFydENsaWVudChjb25zdCBhbmRyb2lkOjpBdWRpb0NsaWVudCYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmNsaWVudEhhbmRsZSkgewogICAgIGlmIChtTW1hcFN0cmVhbSA9PSBudWxscHRyKSByZXR1cm4gQUFVRElPX0VSUk9SX05VTEw7Ci0gICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6OnN0YXJ0Q2xpZW50KCVwKHVpZD0lZCwgcGlkPSVkKSkiLAotICAgICAgICAgICZjbGllbnQsIGNsaWVudC5jbGllbnRVaWQsIGNsaWVudC5jbGllbnRQaWQpOworICAgIEFMT0dEKCIlcyglcCh1aWQ9JWQsIHBpZD0lZCkpIiwgX19mdW5jX18sICZjbGllbnQsIGNsaWVudC5jbGllbnRVaWQsIGNsaWVudC5jbGllbnRQaWQpOwogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgb3JpZ2luYWxIYW5kbGUgPSAgKmNsaWVudEhhbmRsZTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtTW1hcFN0cmVhbS0+c3RhcnQoY2xpZW50LCBjbGllbnRIYW5kbGUpOwogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChzdGF0dXMpOwotICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpzdGFydENsaWVudCgpICwgJWQgPT4gJWQgcmV0dXJucyAlZCIsCi0gICAgICAgICAgb3JpZ2luYWxIYW5kbGUsICpjbGllbnRIYW5kbGUsIHJlc3VsdCk7CisgICAgQUxPR0QoIiVzKCkgLCBwb3J0SGFuZGxlICVkID0+ICVkLCByZXR1cm5zICVkIiwgX19mdW5jX18sIG9yaWdpbmFsSGFuZGxlLCAqY2xpZW50SGFuZGxlLCByZXN1bHQpOwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpzdG9wQ2xpZW50KGF1ZGlvX3BvcnRfaGFuZGxlX3QgY2xpZW50SGFuZGxlKSB7CisgICAgQUxPR0QoIiVzKHBvcnRIYW5kbGUgPSAlZCksIGNhbGxlZCIsIF9fZnVuY19fLCBjbGllbnRIYW5kbGUpOwogICAgIGlmIChtTW1hcFN0cmVhbSA9PSBudWxscHRyKSByZXR1cm4gQUFVRElPX0VSUk9SX05VTEw7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KG1NbWFwU3RyZWFtLT5zdG9wKGNsaWVudEhhbmRsZSkpOwotICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpzdG9wQ2xpZW50KCVkKSByZXR1cm5zICVkIiwgY2xpZW50SGFuZGxlLCByZXN1bHQpOworICAgIEFMT0dEKCIlcyhwb3J0SGFuZGxlID0gJWQpLCByZXR1cm5zICVkIiwgX19mdW5jX18sIGNsaWVudEhhbmRsZSwgcmVzdWx0KTsKICAgICByZXR1cm4gcmVzdWx0OwogfQogCkBAIC0yOTYsMTMgKzMzNCwxMyBAQAogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX05VTEw7CiAgICAgfQogICAgIHN0YXR1c190IHN0YXR1cyA9IG1NbWFwU3RyZWFtLT5nZXRNbWFwUG9zaXRpb24oJnBvc2l0aW9uKTsKLSAgICBBTE9HVigiQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6Z2V0RnJlZVJ1bm5pbmdQb3NpdGlvbigpIHN0YXR1cz0gJWQsIHBvcyA9ICVkLCBuYW5vcyA9ICVsbGRcbiIsCi0gICAgICAgICAgc3RhdHVzLCBwb3NpdGlvbi5wb3NpdGlvbl9mcmFtZXMsIChsb25nIGxvbmcpIHBvc2l0aW9uLnRpbWVfbmFub3NlY29uZHMpOworICAgIEFMT0dWKCIlcygpIHN0YXR1cz0gJWQsIHBvcyA9ICVkLCBuYW5vcyA9ICVsbGRcbiIsCisgICAgICAgICAgX19mdW5jX18sIHN0YXR1cywgcG9zaXRpb24ucG9zaXRpb25fZnJhbWVzLCAobG9uZyBsb25nKSBwb3NpdGlvbi50aW1lX25hbm9zZWNvbmRzKTsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoc3RhdHVzKTsKICAgICBpZiAocmVzdWx0ID09IEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRSkgewotICAgICAgICBBTE9HVygic2VuZEN1cnJlbnRUaW1lc3RhbXAoKTogZ2V0TW1hcFBvc2l0aW9uKCkgaGFzIG5vIHBvc2l0aW9uIGRhdGEgYXZhaWxhYmxlIik7CisgICAgICAgIEFMT0dXKCIlcygpOiBnZXRNbWFwUG9zaXRpb24oKSBoYXMgbm8gcG9zaXRpb24gZGF0YSBhdmFpbGFibGUiLCBfX2Z1bmNfXyk7CiAgICAgfSBlbHNlIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgIEFMT0dFKCJzZW5kQ3VycmVudFRpbWVzdGFtcCgpOiBnZXRNbWFwUG9zaXRpb24oKSByZXR1cm5lZCBzdGF0dXMgJWQiLCBzdGF0dXMpOworICAgICAgICBBTE9HRSgiJXMoKTogZ2V0TW1hcFBvc2l0aW9uKCkgcmV0dXJuZWQgc3RhdHVzICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gQ29udmVydCAzMi1iaXQgcG9zaXRpb24gdG8gNjQtYml0IHBvc2l0aW9uLgogICAgICAgICBtRnJhbWVzVHJhbnNmZXJyZWQudXBkYXRlMzIocG9zaXRpb24ucG9zaXRpb25fZnJhbWVzKTsKQEAgLTMxNywxNyArMzU1LDI3IEBACiAgICAgcmV0dXJuIDA7IC8vIFRPRE8KIH0KIAotCi12b2lkIEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6Om9uVGVhckRvd24oKSB7Ci0gICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6Om9uVGVhckRvd24oKSBjYWxsZWQiKTsKLSAgICBkaXNjb25uZWN0UmVnaXN0ZXJlZFN0cmVhbXMoKTsKKy8vIFRoaXMgaXMgY2FsbGVkIGJ5IEF1ZGlvRmxpbmdlciB3aGVuIGl0IHdhbnRzIHRvIGRlc3Ryb3kgYSBzdHJlYW0uCit2b2lkIEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6Om9uVGVhckRvd24oYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SGFuZGxlKSB7CisgICAgQUxPR0QoIiVzKHBvcnRIYW5kbGUgPSAlZCkgY2FsbGVkIiwgX19mdW5jX18sIHBvcnRIYW5kbGUpOworICAgIC8vIEFyZSB3ZSB0ZWFyaW5nIGRvd24gdGhlIEVYQ0xVU0lWRSBNTUFQIHN0cmVhbT8KKyAgICBpZiAoaXNTdHJlYW1SZWdpc3RlcmVkKHBvcnRIYW5kbGUpKSB7CisgICAgICAgIEFMT0dEKCIlcyglZCkgdGVhcmluZyBkb3duIHRoaXMgZW50aXJlIE1NQVAgZW5kcG9pbnQiLCBfX2Z1bmNfXywgcG9ydEhhbmRsZSk7CisgICAgICAgIGRpc2Nvbm5lY3RSZWdpc3RlcmVkU3RyZWFtcygpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIE11c3QgYmUgYSBTSEFSRUQgc3RyZWFtPworICAgICAgICBBTE9HRCgiJXMoJWQpIGRpc2Nvbm5lY3QgYSBzcGVjaWZpYyBzdHJlYW0iLCBfX2Z1bmNfXywgcG9ydEhhbmRsZSk7CisgICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBtQUF1ZGlvU2VydmljZS5kaXNjb25uZWN0U3RyZWFtQnlQb3J0SGFuZGxlKHBvcnRIYW5kbGUpOworICAgICAgICBBTE9HRCgiJXMoJWQpIGRpc2Nvbm5lY3RTdHJlYW1CeVBvcnRIYW5kbGUgcmV0dXJuZWQgJWQiLCBfX2Z1bmNfXywgcG9ydEhhbmRsZSwgcmVzdWx0KTsKKyAgICB9CiB9OwogCiB2b2lkIEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6Om9uVm9sdW1lQ2hhbmdlZChhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpWZWN0b3I8ZmxvYXQ+IHZhbHVlcykgewotICAgIC8vIFRPRE8gZG8gd2UgcmVhbGx5IG5lZWQgYSBkaWZmZXJlbnQgdm9sdW1lIGZvciBlYWNoIGNoYW5uZWw/CisgICAgLy8gVE9ETyBEbyB3ZSByZWFsbHkgbmVlZCBhIGRpZmZlcmVudCB2b2x1bWUgZm9yIGVhY2ggY2hhbm5lbD8KKyAgICAvLyBXZSBnZXQgY2FsbGVkIHdpdGggYW4gYXJyYXkgZmlsbGVkIHdpdGggYSBzaW5nbGUgdmFsdWUhCiAgICAgZmxvYXQgdm9sdW1lID0gdmFsdWVzWzBdOwotICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpvblZvbHVtZUNoYW5nZWQoKSB2b2x1bWVbMF0gPSAlZiIsIHZvbHVtZSk7CisgICAgQUxPR0QoIiVzKCVwKSB2b2x1bWVbMF0gPSAlZiIsIF9fZnVuY19fLCB0aGlzLCB2b2x1bWUpOwogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrU3RyZWFtcyk7CiAgICAgZm9yKGNvbnN0IGF1dG8gc3RyZWFtIDogbVJlZ2lzdGVyZWRTdHJlYW1zKSB7CiAgICAgICAgIHN0cmVhbS0+b25Wb2x1bWVDaGFuZ2VkKHZvbHVtZSk7CkBAIC0zMzUsOCArMzgzLDcgQEAKIH07CiAKIHZvaWQgQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6b25Sb3V0aW5nQ2hhbmdlZChhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKSB7Ci0gICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6Om9uUm91dGluZ0NoYW5nZWQoKSBjYWxsZWQgd2l0aCAlZCwgb2xkID0gJWQiLAotICAgICAgICAgIGRldmljZUlkLCBnZXREZXZpY2VJZCgpKTsKKyAgICBBTE9HRCgiJXMoJXApIGNhbGxlZCB3aXRoIGRldiAlZCwgb2xkID0gJWQiLCBfX2Z1bmNfXywgdGhpcywgZGV2aWNlSWQsIGdldERldmljZUlkKCkpOwogICAgIGlmIChnZXREZXZpY2VJZCgpICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUgICYmIGdldERldmljZUlkKCkgIT0gZGV2aWNlSWQpIHsKICAgICAgICAgZGlzY29ubmVjdFJlZ2lzdGVyZWRTdHJlYW1zKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUC5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUC5oCmluZGV4IDE2YjYyNjkuLjVlODE1ZTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmgKQEAgLTQyLDcgKzQyLDcgQEAKICAgICAgICAgLCBwdWJsaWMgYW5kcm9pZDo6TW1hcFN0cmVhbUNhbGxiYWNrIHsKIAogcHVibGljOgotICAgIEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAoKTsKKyAgICBleHBsaWNpdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQKGFuZHJvaWQ6OkFBdWRpb1NlcnZpY2UgJmF1ZGlvU2VydmljZSk7CiAKICAgICB2aXJ0dWFsIH5BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQKCk7CiAKQEAgLTY4LDcgKzY4LDcgQEAKICAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0VGltZXN0YW1wKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLCBpbnQ2NF90ICp0aW1lTmFub3MpIG92ZXJyaWRlOwogCiAgICAgLy8gLS0tLS0tLS0tLS0tLS0gQ2FsbGJhY2sgZnVuY3Rpb25zIGZvciBNbWFwU3RyZWFtQ2FsbGJhY2sgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgdm9pZCBvblRlYXJEb3duKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblRlYXJEb3duKGF1ZGlvX3BvcnRfaGFuZGxlX3QgaGFuZGxlKSBvdmVycmlkZTsKIAogICAgIHZvaWQgb25Wb2x1bWVDaGFuZ2VkKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OlZlY3RvcjxmbG9hdD4gdmFsdWVzKSBvdmVycmlkZTsKQEAgLTg4LDggKzg4LDEyIEBACiAgICAgLy8gSW50ZXJmYWNlIHRvIHRoZSBBdWRpb0ZsaW5nZXIgTU1BUCBzdXBwb3J0LgogICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Ok1tYXBTdHJlYW1JbnRlcmZhY2U+IG1NbWFwU3RyZWFtOwogICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICAgICAgICAgICAgIG1NbWFwQnVmZmVyaW5mbzsKKworICAgIC8vIFRoZXJlIGlzIG9ubHkgb25lIHBvcnQgYXNzb2NpYXRlZCB3aXRoIGFuIE1NQVAgZW5kcG9pbnQuCiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICAgICAgICAgICAgICAgICAgICAgbVBvcnRIYW5kbGUgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOwogCisgICAgYW5kcm9pZDo6QUF1ZGlvU2VydmljZSAgICAgICAgICAgICAgICAgICAgJm1BQXVkaW9TZXJ2aWNlOworCiAgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkICAgICAgICAgICAgICAgICAgbUF1ZGlvRGF0YUZpbGVEZXNjcmlwdG9yOwogCiAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhhcmR3YXJlVGltZU9mZnNldE5hbm9zID0gMDsgLy8gVE9ETyBnZXQgZnJvbSBIQUwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5jcHAKaW5kZXggOWIxODMzYS4uYTI3NDQ2NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5jcHAKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmgiCiAjaW5jbHVkZSAiQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5oIgogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oIgorI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOyAgLy8gVE9ETyBqdXN0IGltcG9ydCBuYW1lcyBuZWVkZWQKIHVzaW5nIG5hbWVzcGFjZSBhYXVkaW87ICAgLy8gVE9ETyBqdXN0IGltcG9ydCBuYW1lcyBuZWVkZWQKQEAgLTQyLDEwICs0MywxMiBAQAogCiBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5OjpBQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5KEFBdWRpb1NlcnZpY2UgJmF1ZGlvU2VydmljZSkKICAgICAgICAgOiBtU3RyZWFtSW50ZXJuYWxQbGF5KGF1ZGlvU2VydmljZSwgdHJ1ZSkgeworICAgIEFMT0dEKCIlcyglcCkgY3JlYXRlZCIsIF9fZnVuY19fLCB0aGlzKTsKICAgICBtU3RyZWFtSW50ZXJuYWwgPSAmbVN0cmVhbUludGVybmFsUGxheTsKIH0KIAogQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheTo6fkFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkoKSB7CisgICAgQUxPR0QoIiVzKCVwKSBkZXN0cm95ZWQiLCBfX2Z1bmNfXywgdGhpcyk7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5OjpvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCkgewpAQCAtNjcsNiArNzAsNyBAQAogCiAvLyBNaXggZGF0YSBmcm9tIGVhY2ggYXBwbGljYXRpb24gc3RyZWFtIGFuZCB3cml0ZSByZXN1bHQgdG8gdGhlIHNoYXJlZCBNTUFQIHN0cmVhbS4KIHZvaWQgKkFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXk6OmNhbGxiYWNrTG9vcCgpIHsKKyAgICBBTE9HRCgiJXMoKSBlbnRlcmluZyA+Pj4+Pj4+Pj4+Pj4+Pj4gTUlYRVIiLCBfX2Z1bmNfXyk7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKICAgICBpbnQ2NF90IHRpbWVvdXROYW5vcyA9IGdldFN0cmVhbUludGVybmFsKCktPmNhbGN1bGF0ZVJlYXNvbmFibGVUaW1lb3V0KCk7CiAKQEAgLTgyLDkgKzg2LDEzIEBACiAgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2tTdHJlYW1zKTsKICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byBjbGllbnRTdHJlYW0gOiBtUmVnaXN0ZXJlZFN0cmVhbXMpIHsKICAgICAgICAgICAgICAgICBpbnQ2NF90IGNsaWVudEZyYW1lc1JlYWQgPSAwOworICAgICAgICAgICAgICAgIGJvb2wgYWxsb3dVbmRlcmZsb3cgPSB0cnVlOwogCi0gICAgICAgICAgICAgICAgaWYgKCFjbGllbnRTdHJlYW0tPmlzUnVubmluZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGFhdWRpb19zdHJlYW1fc3RhdGVfdCBzdGF0ZSA9IGNsaWVudFN0cmVhbS0+Z2V0U3RhdGUoKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUElORykgeworICAgICAgICAgICAgICAgICAgICBhbGxvd1VuZGVyZmxvdyA9IGZhbHNlOyAvLyBqdXN0IHJlYWQgd2hhdCBpcyBhbHJlYWR5IGluIHRoZSBGSUZPCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSAhPSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJURUQpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIHRoaXMgc3RyZWFtIGlzIG5vdCBydW5uaW5nIHNvIHNraXAgaXQuCiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZD4gc3RyZWFtU2hhcmVkID0KQEAgLTEwNCwxMCArMTEyLDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHBvc2l0aW9uT2Zmc2V0ID0gbW1hcEZyYW1lc1dyaXR0ZW4gLSBjbGllbnRGcmFtZXNSZWFkOwogICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtU2hhcmVkLT5zZXRUaW1lc3RhbXBQb3NpdGlvbk9mZnNldChwb3NpdGlvbk9mZnNldCk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZvbHVtZSA9IDEuMDsgLy8gdG8gbWF0Y2ggbGVnYWN5IHZvbHVtZQotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1bmRlcmZsb3dlZCA9IG1NaXhlci5taXgoaW5kZXgsIGZpZm8sIHZvbHVtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodW5kZXJmbG93ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1TaGFyZWQtPmluY3JlbWVudFhSdW5Db3VudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZXNNaXhlZCA9IG1NaXhlci5taXgoaW5kZXgsIGZpZm8sIGFsbG93VW5kZXJmbG93KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbVNoYXJlZC0+aXNGbG93aW5nKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25zaWRlciBpdCBhbiB1bmRlcmZsb3cgaWYgd2UgZ290IGxlc3MgdGhhbiBhIGJ1cnN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWZ0ZXIgdGhlIGRhdGEgc3RhcnRlZCBmbG93aW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdW5kZXJmbG93ZWQgPSBhbGxvd1VuZGVyZmxvdworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBmcmFtZXNNaXhlZCA8IG1NaXhlci5nZXRGcmFtZXNQZXJCdXJzdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bmRlcmZsb3dlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1TaGFyZWQtPmluY3JlbWVudFhSdW5Db3VudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZnJhbWVzTWl4ZWQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFyayBiZWdpbm5pbmcgb2YgZGF0YSBmbG93IGFmdGVyIGEgc3RhcnQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtU2hhcmVkLT5zZXRGbG93aW5nKHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50RnJhbWVzUmVhZCA9IGZpZm8tPmdldFJlYWRDb3VudGVyKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTEzMiwxMSArMTQ5LDEzIEBACiAgICAgICAgICAgICBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ6OmRpc2Nvbm5lY3RSZWdpc3RlcmVkU3RyZWFtcygpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0ICE9IGdldEZyYW1lc1BlckJ1cnN0KCkpIHsKLSAgICAgICAgICAgIEFMT0dXKCJBQXVkaW9TZXJ2aWNlRW5kcG9pbnQoKTogY2FsbGJhY2tMb29wKCkgd3JvdGUgJWQgLyAlZCIsCisgICAgICAgICAgICBBTE9HVygiY2FsbGJhY2tMb29wKCkgd3JvdGUgJWQgLyAlZCIsCiAgICAgICAgICAgICAgICAgICByZXN1bHQsIGdldEZyYW1lc1BlckJ1cnN0KCkpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBBTE9HRCgiJXMoKSBleGl0aW5nLCBlbmFibGVkID0gJWQsIHN0YXRlID0gJWQsIHJlc3VsdCA9ICVkIDw8PDw8PDw8PDw8PDwgTUlYRVIiLAorICAgICAgICAgIF9fZnVuY19fLCBtQ2FsbGJhY2tFbmFibGVkLmxvYWQoKSwgZ2V0U3RyZWFtSW50ZXJuYWwoKS0+Z2V0U3RhdGUoKSwgcmVzdWx0KTsKICAgICByZXR1cm4gTlVMTDsgLy8gVE9ETyByZXZpZXcKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuY3BwCmluZGV4IGNkNDAwNjYuLjYzYjk5ODMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmNwcApAQCAtNDcsNiArNDcsNyBAQAogICAgICAgICAgICA8PCBzdGQ6OnNldGZpbGwoJzAnKSA8PCBzdGQ6OnNldHcoOCkKICAgICAgICAgICAgPDwgc3RkOjpoZXggPDwgbVN0cmVhbUludGVybmFsLT5nZXRTZXJ2aWNlSGFuZGxlKCkKICAgICAgICAgICAgPDwgc3RkOjpkZWMgPDwgc3RkOjpzZXRmaWxsKCcgJyk7CisgICAgcmVzdWx0IDw8ICIsIFhSdW5zID0gIiA8PCBtU3RyZWFtSW50ZXJuYWwtPmdldFhSdW5Db3VudCgpOwogICAgIHJlc3VsdCA8PCAiXG4iOwogICAgIHJlc3VsdCA8PCAiICAgIFJ1bm5pbmcgU3RyZWFtIENvdW50OiAiIDw8IG1SdW5uaW5nU3RyZWFtQ291bnQgPDwgIlxuIjsKIApAQCAtNTksMTggKzYwLDE2IEBACiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKICAgICBjb25zdCBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uID0gcmVxdWVzdC5nZXRDb25zdGFudENvbmZpZ3VyYXRpb24oKTsKIAorICAgIGNvcHlGcm9tKGNvbmZpZ3VyYXRpb24pOwogICAgIG1SZXF1ZXN0ZWREZXZpY2VJZCA9IGNvbmZpZ3VyYXRpb24uZ2V0RGV2aWNlSWQoKTsKLSAgICBzZXREaXJlY3Rpb24oY29uZmlndXJhdGlvbi5nZXREaXJlY3Rpb24oKSk7CiAKICAgICBBdWRpb1N0cmVhbUJ1aWxkZXIgYnVpbGRlcjsKKyAgICBidWlsZGVyLmNvcHlGcm9tKGNvbmZpZ3VyYXRpb24pOworCiAgICAgYnVpbGRlci5zZXRTaGFyaW5nTW9kZShBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSk7CiAgICAgLy8gRG9uJ3QgZmFsbCBiYWNrIHRvIFNIQVJFRCBiZWNhdXNlIHRoYXQgd291bGQgY2F1c2UgcmVjdXJzaW9uLgogICAgIGJ1aWxkZXIuc2V0U2hhcmluZ01vZGVNYXRjaFJlcXVpcmVkKHRydWUpOwotICAgIGJ1aWxkZXIuc2V0RGV2aWNlSWQobVJlcXVlc3RlZERldmljZUlkKTsKLSAgICBidWlsZGVyLnNldEZvcm1hdChjb25maWd1cmF0aW9uLmdldEZvcm1hdCgpKTsKLSAgICBidWlsZGVyLnNldFNhbXBsZVJhdGUoY29uZmlndXJhdGlvbi5nZXRTYW1wbGVSYXRlKCkpOwotICAgIGJ1aWxkZXIuc2V0U2FtcGxlc1BlckZyYW1lKGNvbmZpZ3VyYXRpb24uZ2V0U2FtcGxlc1BlckZyYW1lKCkpOwotICAgIGJ1aWxkZXIuc2V0RGlyZWN0aW9uKGNvbmZpZ3VyYXRpb24uZ2V0RGlyZWN0aW9uKCkpOworCiAgICAgYnVpbGRlci5zZXRCdWZmZXJDYXBhY2l0eShERUZBVUxUX0JVRkZFUl9DQVBBQ0lUWSk7CiAKICAgICByZXN1bHQgPSBtU3RyZWFtSW50ZXJuYWwtPm9wZW4oYnVpbGRlcik7CkBAIC03OCw2ICs3Nyw3IEBACiAgICAgc2V0U2FtcGxlUmF0ZShtU3RyZWFtSW50ZXJuYWwtPmdldFNhbXBsZVJhdGUoKSk7CiAgICAgc2V0U2FtcGxlc1BlckZyYW1lKG1TdHJlYW1JbnRlcm5hbC0+Z2V0U2FtcGxlc1BlckZyYW1lKCkpOwogICAgIHNldERldmljZUlkKG1TdHJlYW1JbnRlcm5hbC0+Z2V0RGV2aWNlSWQoKSk7CisgICAgc2V0U2Vzc2lvbklkKG1TdHJlYW1JbnRlcm5hbC0+Z2V0U2Vzc2lvbklkKCkpOwogICAgIG1GcmFtZXNQZXJCdXJzdCA9IG1TdHJlYW1JbnRlcm5hbC0+Z2V0RnJhbWVzUGVyQnVyc3QoKTsKIAogICAgIHJldHVybiByZXN1bHQ7CkBAIC04OCwxMyArODgsMjIgQEAKIH0KIAogLy8gR2x1ZSBiZXR3ZWVuIEMgYW5kIEMrKyBjYWxsYmFja3MuCi1zdGF0aWMgdm9pZCAqYWF1ZGlvX2VuZHBvaW50X3RocmVhZF9wcm9jKHZvaWQgKmNvbnRleHQpIHsKLSAgICBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQgKmVuZHBvaW50ID0gKEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZCAqKSBjb250ZXh0OwotICAgIGlmIChlbmRwb2ludCAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlbmRwb2ludC0+Y2FsbGJhY2tMb29wKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CitzdGF0aWMgdm9pZCAqYWF1ZGlvX2VuZHBvaW50X3RocmVhZF9wcm9jKHZvaWQgKmFyZykgeworICAgIGFzc2VydChhcmcgIT0gbnVsbHB0cik7CisKKyAgICAvLyBUaGUgY2FsbGVyIHBhc3NlZCBpbiBhIHNtYXJ0IHBvaW50ZXIgdG8gcHJldmVudCB0aGUgZW5kcG9pbnQgZnJvbSBnZXR0aW5nIGRlbGV0ZWQKKyAgICAvLyB3aGlsZSB0aGUgdGhyZWFkIHdhcyBsYXVuY2hpbmcuCisgICAgc3A8QUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkPiAqZW5kcG9pbnRGb3JUaHJlYWQgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c3A8QUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkPiAqPihhcmcpOworICAgIHNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZD4gZW5kcG9pbnQgPSAqZW5kcG9pbnRGb3JUaHJlYWQ7CisgICAgZGVsZXRlIGVuZHBvaW50Rm9yVGhyZWFkOyAvLyBKdXN0IHVzZSBzY29wZWQgc21hcnQgcG9pbnRlci4gRG9uJ3QgbmVlZCB0aGlzIGFueW1vcmUuCisgICAgdm9pZCAqcmVzdWx0ID0gZW5kcG9pbnQtPmNhbGxiYWNrTG9vcCgpOworICAgIC8vIENsb3NlIG5vdyBzbyB0aGF0IHRoZSBIVyByZXNvdXJjZSBpcyBmcmVlZCBhbmQgd2UgY2FuIG9wZW4gYSBuZXcgZGV2aWNlLgorICAgIGlmICghZW5kcG9pbnQtPmlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgZW5kcG9pbnQtPmNsb3NlKCk7CiAgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IGFhdWRpbzo6QUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkOjpzdGFydFNoYXJpbmdUaHJlYWRfbCgpIHsKQEAgLTEwMyw3ICsxMTIsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBQVVESU9fTkFOT1NfUEVSX1NFQ09ORAogICAgICAgICAgICAgICAgICAgICAgICAgICAvIGdldFNhbXBsZVJhdGUoKTsKICAgICBtQ2FsbGJhY2tFbmFibGVkLnN0b3JlKHRydWUpOwotICAgIHJldHVybiBnZXRTdHJlYW1JbnRlcm5hbCgpLT5jcmVhdGVUaHJlYWQocGVyaW9kTmFub3MsIGFhdWRpb19lbmRwb2ludF90aHJlYWRfcHJvYywgdGhpcyk7CisgICAgLy8gUGFzcyBhIHNtYXJ0IHBvaW50ZXIgc28gdGhlIHRocmVhZCBjYW4gaG9sZCBhIHJlZmVyZW5jZS4KKyAgICBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ+ICplbmRwb2ludEZvclRocmVhZCA9IG5ldyBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ+KHRoaXMpOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBnZXRTdHJlYW1JbnRlcm5hbCgpLT5jcmVhdGVUaHJlYWQocGVyaW9kTmFub3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fZW5kcG9pbnRfdGhyZWFkX3Byb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludEZvclRocmVhZCk7CisgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgLy8gVGhlIHRocmVhZCBjYW4ndCBkZWxldGUgaXQgc28gd2UgaGF2ZSB0byBkbyBpdCBoZXJlLgorICAgICAgICBkZWxldGUgZW5kcG9pbnRGb3JUaHJlYWQ7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBhYXVkaW86OkFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZDo6c3RvcFNoYXJpbmdUaHJlYWQoKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oCmluZGV4IGUzYmQyYzEuLmQ2NzE3MTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oCkBAIC0zMCw4ICszMCw3IEBACiBuYW1lc3BhY2UgYWF1ZGlvIHsKIAogLyoqCi0gKiBUaGlzIFNlcnZpY2UgY2xhc3MgY29ycmVzcG9uZHMgdG8gYSBDbGllbnQgc3RyZWFtIHRoYXQgc2hhcmVzIGFuIE1NQVAgZGV2aWNlIHRocm91Z2ggYSBtaXhlcgotICogb3IgYW4gaW5wdXQgZGlzdHJpYnV0b3IuCisgKiBUaGlzIG1hbmFnZXMgYW4gQXVkaW9TdHJlYW1JbnRlcm5hbCB0aGF0IGlzIHNoYXJlZCBieSBtdWx0aXBsZSBDbGllbnQgc3RyZWFtcy4KICAqLwogY2xhc3MgQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkIDogcHVibGljIEFBdWRpb1NlcnZpY2VFbmRwb2ludCB7CiAKQEAgLTU1LDEyICs1NCwxMyBAQAogCiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgKmNhbGxiYWNrTG9vcCgpID0gMDsKIAorCitwcm90ZWN0ZWQ6CisKICAgICBBdWRpb1N0cmVhbUludGVybmFsICpnZXRTdHJlYW1JbnRlcm5hbCgpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1TdHJlYW1JbnRlcm5hbDsKICAgICB9OwogCi1wcm90ZWN0ZWQ6Ci0KICAgICBhYXVkaW9fcmVzdWx0X3QgICAgICAgICAgc3RhcnRTaGFyaW5nVGhyZWFkX2woKTsKIAogICAgIGFhdWRpb19yZXN1bHRfdCAgICAgICAgICBzdG9wU2hhcmluZ1RocmVhZCgpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuY3BwCmluZGV4IGQ5Yjg3NjYuLjlhZjhhZjMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5jcHAKQEAgLTQyLDcgKzQyLDcgQEAKIAogQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlKEFBdWRpb1NlcnZpY2UgJmF1ZGlvU2VydmljZSkKICAgICAgICAgOiBtVXBNZXNzYWdlUXVldWUobnVsbHB0cikKLSAgICAgICAgLCBtVGltZXN0YW1wVGhyZWFkKCkKKyAgICAgICAgLCBtVGltZXN0YW1wVGhyZWFkKCJBQVRpbWUiKQogICAgICAgICAsIG1BdG9taWNUaW1lc3RhbXAoKQogICAgICAgICAsIG1BdWRpb1NlcnZpY2UoYXVkaW9TZXJ2aWNlKSB7CiAgICAgbU1tYXBDbGllbnQuY2xpZW50VWlkID0gLTE7CkBAIC01MSw3ICs1MSw3IEBACiB9CiAKIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjp+QUF1ZGlvU2VydmljZVN0cmVhbUJhc2UoKSB7Ci0gICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjp+QUF1ZGlvU2VydmljZVN0cmVhbUJhc2UoKSBkZXN0cm95aW5nICVwIiwgdGhpcyk7CisgICAgQUxPR0QoIn5BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZSgpIGRlc3Ryb3lpbmcgJXAiLCB0aGlzKTsKICAgICAvLyBJZiB0aGUgc3RyZWFtIGlzIGRlbGV0ZWQgd2hlbiBPUEVOIG9yIGluIHVzZSB0aGVuIGF1ZGlvIHJlc291cmNlcyB3aWxsIGxlYWsuCiAgICAgLy8gVGhpcyB3b3VsZCBpbmRpY2F0ZSBhbiBpbnRlcm5hbCBlcnJvci4gU28gd2Ugd2FudCB0byBmaW5kIHRoaXMgQVNBUC4KICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCEoZ2V0U3RhdGUoKSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRApAQCAtNjEsNyArNjEsNyBAQAogfQogCiBzdGQ6OnN0cmluZyBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6ZHVtcEhlYWRlcigpIHsKLSAgICByZXR1cm4gc3RkOjpzdHJpbmcoIiAgICBUICAgSGFuZGxlICAgVUlkIFJ1biBTdGF0ZSBGb3JtYXQgQnVyc3QgQ2hhbiBDYXBhY2l0eSIpOworICAgIHJldHVybiBzdGQ6OnN0cmluZygiICAgIFQgICBIYW5kbGUgICBVSWQgICBQb3J0IFJ1biBTdGF0ZSBGb3JtYXQgQnVyc3QgQ2hhbiBDYXBhY2l0eSIpOwogfQogCiBzdGQ6OnN0cmluZyBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6ZHVtcCgpIGNvbnN0IHsKQEAgLTcwLDYgKzcwLDcgQEAKICAgICByZXN1bHQgPDwgIiAgICAweCIgPDwgc3RkOjpzZXRmaWxsKCcwJykgPDwgc3RkOjpzZXR3KDgpIDw8IHN0ZDo6aGV4IDw8IG1IYW5kbGUKICAgICAgICAgICAgPDwgc3RkOjpkZWMgPDwgc3RkOjpzZXRmaWxsKCcgJykgOwogICAgIHJlc3VsdCA8PCBzdGQ6OnNldHcoNikgPDwgbU1tYXBDbGllbnQuY2xpZW50VWlkOworICAgIHJlc3VsdCA8PCBzdGQ6OnNldHcoNykgPDwgbUNsaWVudEhhbmRsZTsKICAgICByZXN1bHQgPDwgc3RkOjpzZXR3KDQpIDw8IChpc1J1bm5pbmcoKSA/ICJ5ZXMiIDogIiBubyIpOwogICAgIHJlc3VsdCA8PCBzdGQ6OnNldHcoNikgPDwgZ2V0U3RhdGUoKTsKICAgICByZXN1bHQgPDwgc3RkOjpzZXR3KDcpIDw8IGdldEZvcm1hdCgpOwpAQCAtOTMsNyArOTQsNyBAQAogICAgIHsKICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVVwTWVzc2FnZVF1ZXVlTG9jayk7CiAgICAgICAgIGlmIChtVXBNZXNzYWdlUXVldWUgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpvcGVuKCkgY2FsbGVkIHR3aWNlIik7CisgICAgICAgICAgICBBTE9HRSgiJXMoKSBjYWxsZWQgdHdpY2UiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgICAgIH0KIApAQCAtMTExLDcgKzExMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmluZ01vZGUpOwogICAgICAgICBpZiAobVNlcnZpY2VFbmRwb2ludCA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6Om9wZW4oKSBvcGVuRW5kcG9pbnQoKSBmYWlsZWQiKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcygpIG9wZW5FbmRwb2ludCgpIGZhaWxlZCIsIF9fZnVuY19fKTsKICAgICAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRTsKICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgIH0KQEAgLTE0OCw3ICsxNDksNiBAQAogICAgICAgICBtU2VydmljZUVuZHBvaW50LmNsZWFyKCk7IC8vIGVuZHBvaW50IHdpbGwgaG9sZCB0aGUgcG9pbnRlciB1bnRpbCB0aGlzIG1ldGhvZCByZXR1cm5zLgogICAgIH0KIAotCiAgICAgewogICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtVXBNZXNzYWdlUXVldWVMb2NrKTsKICAgICAgICAgc3RvcFRpbWVzdGFtcFRocmVhZCgpOwpAQCAtMTgyLDYgKzE4Miw4IEBACiAgICAgICAgIHJldHVybiBBQVVESU9fT0s7CiAgICAgfQogCisgICAgc2V0Rmxvd2luZyhmYWxzZSk7CisKICAgICAvLyBTdGFydCB3aXRoIGZyZXNoIHByZXNlbnRhdGlvbiB0aW1lc3RhbXBzLgogICAgIG1BdG9taWNUaW1lc3RhbXAuY2xlYXIoKTsKIApAQCAtMjI2LDcgKzIyOCw3IEBACiAgICAgfQogICAgIHJlc3VsdCA9IGVuZHBvaW50LT5zdG9wU3RyZWFtKHRoaXMsIG1DbGllbnRIYW5kbGUpOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpwYXVzZSgpIG1TZXJ2aWNlRW5kcG9pbnQgcmV0dXJuZWQgJWQiLCByZXN1bHQpOworICAgICAgICBBTE9HRSgiJXMoKSBtU2VydmljZUVuZHBvaW50IHJldHVybmVkICVkLCAlcyIsIF9fZnVuY19fLCByZXN1bHQsIGdldFR5cGVUZXh0KCkpOwogICAgICAgICBkaXNjb25uZWN0KCk7IC8vIFRPRE8gc2hvdWxkIHdlIHJldHVybiBvciBwYXVzZSBCYXNlIGZpcnN0PwogICAgIH0KIApAQCAtMjQxLDYgKzI0Myw4IEBACiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCisgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUElORyk7CisKICAgICAvLyBTZW5kIGl0IG5vdyBiZWNhdXNlIHRoZSB0aW1lc3RhbXAgZ2V0cyByb3VuZGVkIHVwIHdoZW4gc3RvcFN0cmVhbSgpIGlzIGNhbGxlZCBiZWxvdy4KICAgICAvLyBBbHNvIHdlIGRvbid0IG5lZWQgdGhlIHRpbWVzdGFtcHMgd2hpbGUgd2UgYXJlIHNodXR0aW5nIGRvd24uCiAgICAgc2VuZEN1cnJlbnRUaW1lc3RhbXAoKTsgLy8gd2FybmluZyAtIHRoaXMgY2FsbHMgYSB2aXJ0dWFsIGZ1bmN0aW9uCkBAIC0yNTgsNyArMjYyLDcgQEAKICAgICAvLyBUT0RPIHdhaXQgZm9yIGRhdGEgdG8gYmUgcGxheWVkIG91dAogICAgIHJlc3VsdCA9IGVuZHBvaW50LT5zdG9wU3RyZWFtKHRoaXMsIG1DbGllbnRIYW5kbGUpOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpzdG9wKCkgbVNlcnZpY2VFbmRwb2ludCByZXR1cm5lZCAlZCIsIHJlc3VsdCk7CisgICAgICAgIEFMT0dFKCIlcygpIHN0b3BTdHJlYW0gcmV0dXJuZWQgJWQsICVzIiwgX19mdW5jX18sIHJlc3VsdCwgZ2V0VHlwZVRleHQoKSk7CiAgICAgICAgIGRpc2Nvbm5lY3QoKTsKICAgICAgICAgLy8gVE9ETyB3aGF0IHRvIGRvIHdpdGggcmVzdWx0IGhlcmU/CiAgICAgfQpAQCAtMjc4LDExICsyODIsMTEgQEAKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpmbHVzaCgpIHsKLSAgICBpZiAoZ2V0U3RhdGUoKSAhPSBBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNFRCkgewotICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OmZsdXNoKCkgc3RyZWFtIG5vdCBwYXVzZWQsIHN0YXRlID0gJXMiLAotICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFN0cmVhbVN0YXRlVG9UZXh0KG1TdGF0ZSkpOwotICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb19pc0ZsdXNoQWxsb3dlZChnZXRTdGF0ZSgpKTsKKyAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KKwogICAgIC8vIERhdGEgd2lsbCBnZXQgZmx1c2hlZCB3aGVuIHRoZSBjbGllbnQgcmVjZWl2ZXMgdGhlIEZMVVNIRUQgZXZlbnQuCiAgICAgc2VuZFNlcnZpY2VFdmVudChBQVVESU9fU0VSVklDRV9FVkVOVF9GTFVTSEVEKTsKICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX0ZMVVNIRUQpOwpAQCAtMjkxLDcgKzI5NSw3IEBACiAKIC8vIGltcGxlbWVudCBSdW5uYWJsZSwgcGVyaW9kaWNhbGx5IHNlbmQgdGltZXN0YW1wcyB0byBjbGllbnQKIHZvaWQgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnJ1bigpIHsKLSAgICBBTE9HRCgiQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnJ1bigpIGVudGVyaW5nIC0tLS0tLS0tLS0tLS0tLS0iKTsKKyAgICBBTE9HRCgiJXMoKSAlcyBlbnRlcmluZyA+Pj4+Pj4+Pj4+Pj4+PiBUSU1FU1RBTVBTIiwgX19mdW5jX18sIGdldFR5cGVUZXh0KCkpOwogICAgIFRpbWVzdGFtcFNjaGVkdWxlciB0aW1lc3RhbXBTY2hlZHVsZXI7CiAgICAgdGltZXN0YW1wU2NoZWR1bGVyLnNldEJ1cnN0UGVyaW9kKG1GcmFtZXNQZXJCdXJzdCwgZ2V0U2FtcGxlUmF0ZSgpKTsKICAgICB0aW1lc3RhbXBTY2hlZHVsZXIuc3RhcnQoQXVkaW9DbG9jazo6Z2V0TmFub3NlY29uZHMoKSk7CkBAIC0zMDksNyArMzEzLDcgQEAKICAgICAgICAgICAgIEF1ZGlvQ2xvY2s6OnNsZWVwVW50aWxOYW5vVGltZShuZXh0VGltZSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpydW4oKSBleGl0aW5nIC0tLS0tLS0tLS0tLS0tLS0iKTsKKyAgICBBTE9HRCgiJXMoKSAlcyBleGl0aW5nIDw8PDw8PDw8PDw8PDw8IFRJTUVTVEFNUFMiLCBfX2Z1bmNfXywgZ2V0VHlwZVRleHQoKSk7CiB9CiAKIHZvaWQgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OmRpc2Nvbm5lY3QoKSB7CkBAIC0zMjAsMTIgKzMyNCwxOSBAQAogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnNlbmRTZXJ2aWNlRXZlbnQoYWF1ZGlvX3NlcnZpY2VfZXZlbnRfdCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICBkYXRhRG91YmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGRhdGFMb25nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICBkYXRhRG91YmxlKSB7CiAgICAgQUF1ZGlvU2VydmljZU1lc3NhZ2UgY29tbWFuZDsKICAgICBjb21tYW5kLndoYXQgPSBBQXVkaW9TZXJ2aWNlTWVzc2FnZTo6Y29kZTo6RVZFTlQ7CiAgICAgY29tbWFuZC5ldmVudC5ldmVudCA9IGV2ZW50OwogICAgIGNvbW1hbmQuZXZlbnQuZGF0YURvdWJsZSA9IGRhdGFEb3VibGU7CisgICAgcmV0dXJuIHdyaXRlVXBNZXNzYWdlUXVldWUoJmNvbW1hbmQpOworfQorCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnNlbmRTZXJ2aWNlRXZlbnQoYWF1ZGlvX3NlcnZpY2VfZXZlbnRfdCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGRhdGFMb25nKSB7CisgICAgQUF1ZGlvU2VydmljZU1lc3NhZ2UgY29tbWFuZDsKKyAgICBjb21tYW5kLndoYXQgPSBBQXVkaW9TZXJ2aWNlTWVzc2FnZTo6Y29kZTo6RVZFTlQ7CisgICAgY29tbWFuZC5ldmVudC5ldmVudCA9IGV2ZW50OwogICAgIGNvbW1hbmQuZXZlbnQuZGF0YUxvbmcgPSBkYXRhTG9uZzsKICAgICByZXR1cm4gd3JpdGVVcE1lc3NhZ2VRdWV1ZSgmY29tbWFuZCk7CiB9CkBAIC0zMzMsMjUgKzM0NCwyOSBAQAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjp3cml0ZVVwTWVzc2FnZVF1ZXVlKEFBdWRpb1NlcnZpY2VNZXNzYWdlICpjb21tYW5kKSB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVVwTWVzc2FnZVF1ZXVlTG9jayk7CiAgICAgaWYgKG1VcE1lc3NhZ2VRdWV1ZSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJ3cml0ZVVwTWVzc2FnZVF1ZXVlKCk6IG1VcE1lc3NhZ2VRdWV1ZSBudWxsISAtIHN0cmVhbSBub3Qgb3BlbiIpOworICAgICAgICBBTE9HRSgiJXMoKTogbVVwTWVzc2FnZVF1ZXVlIG51bGwhIC0gc3RyZWFtIG5vdCBvcGVuIiwgX19mdW5jX18pOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX05VTEw7CiAgICAgfQogICAgIGludDMyX3QgY291bnQgPSBtVXBNZXNzYWdlUXVldWUtPmdldEZpZm9CdWZmZXIoKS0+d3JpdGUoY29tbWFuZCwgMSk7CiAgICAgaWYgKGNvdW50ICE9IDEpIHsKLSAgICAgICAgQUxPR0UoIndyaXRlVXBNZXNzYWdlUXVldWUoKTogUXVldWUgZnVsbC4gRGlkIGNsaWVudCBkaWU/Iik7CisgICAgICAgIEFMT0dFKCIlcygpOiBRdWV1ZSBmdWxsLiBEaWQgY2xpZW50IGRpZT8gJXMiLCBfX2Z1bmNfXywgZ2V0VHlwZVRleHQoKSk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfV09VTERfQkxPQ0s7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKICAgICB9CiB9CiAKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6c2VuZFhSdW5Db3VudChpbnQzMl90IHhSdW5Db3VudCkgeworICAgIHJldHVybiBzZW5kU2VydmljZUV2ZW50KEFBVURJT19TRVJWSUNFX0VWRU5UX1hSVU4sIChpbnQ2NF90KSB4UnVuQ291bnQpOworfQorCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnNlbmRDdXJyZW50VGltZXN0YW1wKCkgewogICAgIEFBdWRpb1NlcnZpY2VNZXNzYWdlIGNvbW1hbmQ7CiAgICAgLy8gU2VuZCBhIHRpbWVzdGFtcCBmb3IgdGhlIGNsb2NrIG1vZGVsLgogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBnZXRGcmVlUnVubmluZ1Bvc2l0aW9uKCZjb21tYW5kLnRpbWVzdGFtcC5wb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tbWFuZC50aW1lc3RhbXAudGltZXN0YW1wKTsKICAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgewotICAgICAgICBBTE9HVigic2VuZEN1cnJlbnRUaW1lc3RhbXAoKSBTRVJWSUNFICAlOGxsZCBhdCAlbGxkIiwKKyAgICAgICAgQUxPR1YoIiVzKCkgU0VSVklDRSAgJThsbGQgYXQgJWxsZCIsIF9fZnVuY19fLAogICAgICAgICAgICAgICAobG9uZyBsb25nKSBjb21tYW5kLnRpbWVzdGFtcC5wb3NpdGlvbiwKICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgY29tbWFuZC50aW1lc3RhbXAudGltZXN0YW1wKTsKICAgICAgICAgY29tbWFuZC53aGF0ID0gQUF1ZGlvU2VydmljZU1lc3NhZ2U6OmNvZGU6OlRJTUVTVEFNUF9TRVJWSUNFOwpAQCAtMzYyLDcgKzM3Nyw3IEBACiAgICAgICAgICAgICByZXN1bHQgPSBnZXRIYXJkd2FyZVRpbWVzdGFtcCgmY29tbWFuZC50aW1lc3RhbXAucG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tbWFuZC50aW1lc3RhbXAudGltZXN0YW1wKTsKICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInNlbmRDdXJyZW50VGltZXN0YW1wKCkgSEFSRFdBUkUgJThsbGQgYXQgJWxsZCIsCisgICAgICAgICAgICAgICAgQUxPR1YoIiVzKCkgSEFSRFdBUkUgJThsbGQgYXQgJWxsZCIsIF9fZnVuY19fLAogICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIGNvbW1hbmQudGltZXN0YW1wLnBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIGNvbW1hbmQudGltZXN0YW1wLnRpbWVzdGFtcCk7CiAgICAgICAgICAgICAgICAgY29tbWFuZC53aGF0ID0gQUF1ZGlvU2VydmljZU1lc3NhZ2U6OmNvZGU6OlRJTUVTVEFNUF9IQVJEV0FSRTsKQEAgLTM4NSw3ICs0MDAsNyBAQAogICAgIHsKICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVVwTWVzc2FnZVF1ZXVlTG9jayk7CiAgICAgICAgIGlmIChtVXBNZXNzYWdlUXVldWUgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgQUxPR0UoImdldERlc2NyaXB0aW9uKCk6IG1VcE1lc3NhZ2VRdWV1ZSBudWxsISAtIHN0cmVhbSBub3Qgb3BlbiIpOworICAgICAgICAgICAgQUxPR0UoIiVzKCk6IG1VcE1lc3NhZ2VRdWV1ZSBudWxsISAtIHN0cmVhbSBub3Qgb3BlbiIsIF9fZnVuY19fKTsKICAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfTlVMTDsKICAgICAgICAgfQogICAgICAgICAvLyBHYXRoZXIgaW5mb3JtYXRpb24gb24gdGhlIG1lc3NhZ2UgcXVldWUuCkBAIC0zOTgsMyArNDEzLDE0IEBACiB2b2lkIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpvblZvbHVtZUNoYW5nZWQoZmxvYXQgdm9sdW1lKSB7CiAgICAgc2VuZFNlcnZpY2VFdmVudChBQVVESU9fU0VSVklDRV9FVkVOVF9WT0xVTUUsIHZvbHVtZSk7CiB9CisKK2ludDMyX3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OmluY3JlbWVudFNlcnZpY2VSZWZlcmVuY2VDb3VudF9sKCkgeworICAgIHJldHVybiArK21DYWxsaW5nQ291bnQ7Cit9CisKK2ludDMyX3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OmRlY3JlbWVudFNlcnZpY2VSZWZlcmVuY2VDb3VudF9sKCkgeworICAgIGludDMyX3QgY291bnQgPSAtLW1DYWxsaW5nQ291bnQ7CisgICAgLy8gRWFjaCBjYWxsIHRvIGluY3JlbWVudCBzaG91bGQgYmUgYmFsYW5jZWQgd2l0aCBvbmUgY2FsbCB0byBkZWNyZW1lbnQuCisgICAgYXNzZXJ0KGNvdW50ID49IDApOworICAgIHJldHVybiBjb3VudDsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5oCmluZGV4IDgxNWIxY2MuLmExODE1ZDAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmgKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuaApAQCAtNTUsNyArNTUsNyBAQAogICAgICwgcHVibGljIFJ1bm5hYmxlICB7CiAKIHB1YmxpYzoKLSAgICBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZShhbmRyb2lkOjpBQXVkaW9TZXJ2aWNlICZhQXVkaW9TZXJ2aWNlKTsKKyAgICBleHBsaWNpdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZShhbmRyb2lkOjpBQXVkaW9TZXJ2aWNlICZhQXVkaW9TZXJ2aWNlKTsKIAogICAgIHZpcnR1YWwgfkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlKCk7CiAKQEAgLTEyOSwxMSArMTI5LDE1IEBACiAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAgICAgLyoqCi0gICAgICogU2VuZCBhIG1lc3NhZ2UgdG8gdGhlIGNsaWVudC4KKyAgICAgKiBTZW5kIGEgbWVzc2FnZSB0byB0aGUgY2xpZW50IHdpdGggYW4gaW50NjRfdCBkYXRhIHZhbHVlLgogICAgICAqLwogICAgIGFhdWRpb19yZXN1bHRfdCBzZW5kU2VydmljZUV2ZW50KGFhdWRpb19zZXJ2aWNlX2V2ZW50X3QgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICBkYXRhRG91YmxlID0gMC4wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZGF0YUxvbmcgPSAwKTsKKyAgICAvKioKKyAgICAgKiBTZW5kIGEgbWVzc2FnZSB0byB0aGUgY2xpZW50IHdpdGggYW4gZG91YmxlIGRhdGEgdmFsdWUuCisgICAgICovCisgICAgYWF1ZGlvX3Jlc3VsdF90IHNlbmRTZXJ2aWNlRXZlbnQoYWF1ZGlvX3NlcnZpY2VfZXZlbnRfdCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgIGRhdGFEb3VibGUpOwogCiAgICAgLyoqCiAgICAgICogRmlsbCBpbiBhIHBhcmNlbGFibGUgZGVzY3JpcHRpb24gb2Ygc3RyZWFtLgpAQCAtMTc2LDEyICsxODAsNjIgQEAKICAgICAgICAgbUhhbmRsZSA9IGhhbmRsZTsKICAgICB9CiAKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldFBvcnRIYW5kbGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQ2xpZW50SGFuZGxlOworICAgIH0KKwogICAgIGFhdWRpb19zdHJlYW1fc3RhdGVfdCBnZXRTdGF0ZSgpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1TdGF0ZTsKICAgICB9CiAKICAgICB2b2lkIG9uVm9sdW1lQ2hhbmdlZChmbG9hdCB2b2x1bWUpOwogCisgICAgLyoqCisgICAgICogU2V0IGZhbHNlIHdoZW4gdGhlIHN0cmVhbSBpcyBzdGFydGVkLgorICAgICAqIFNldCB0cnVlIHdoZW4gZGF0YSBpcyBmaXJzdCByZWFkIGZyb20gdGhlIHN0cmVhbS4KKyAgICAgKiBAcGFyYW0gYgorICAgICAqLworICAgIHZvaWQgc2V0Rmxvd2luZyhib29sIGIpIHsKKyAgICAgICAgbUZsb3dpbmcgPSBiOworICAgIH0KKworICAgIGJvb2wgaXNGbG93aW5nKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUZsb3dpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXRvbWljYWxseSBpbmNyZW1lbnQgdGhlIG51bWJlciBvZiBhY3RpdmUgcmVmZXJlbmNlcyB0byB0aGUgc3RyZWFtIGJ5IEFBdWRpb1NlcnZpY2UuCisgICAgICoKKyAgICAgKiBUaGlzIGlzIGNhbGxlZCB1bmRlciBhIGdsb2JhbCBsb2NrIGluIEFBdWRpb1N0cmVhbVRyYWNrZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHZhbHVlIGFmdGVyIHRoZSBpbmNyZW1lbnQKKyAgICAgKi8KKyAgICBpbnQzMl90IGluY3JlbWVudFNlcnZpY2VSZWZlcmVuY2VDb3VudF9sKCk7CisKKyAgICAvKioKKyAgICAgKiBBdG9taWNhbGx5IGRlY3JlbWVudCB0aGUgbnVtYmVyIG9mIGFjdGl2ZSByZWZlcmVuY2VzIHRvIHRoZSBzdHJlYW0gYnkgQUF1ZGlvU2VydmljZS4KKyAgICAgKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBhZnRlciBpbmNyZW1lbnRTZXJ2aWNlUmVmZXJlbmNlQ291bnRfbCgpLgorICAgICAqCisgICAgICogVGhpcyBpcyBjYWxsZWQgdW5kZXIgYSBnbG9iYWwgbG9jayBpbiBBQXVkaW9TdHJlYW1UcmFja2VyLgorICAgICAqCisgICAgICogQHJldHVybiB2YWx1ZSBhZnRlciB0aGUgZGVjcmVtZW50CisgICAgICovCisgICAgaW50MzJfdCBkZWNyZW1lbnRTZXJ2aWNlUmVmZXJlbmNlQ291bnRfbCgpOworCisgICAgYm9vbCBpc0Nsb3NlTmVlZGVkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUNsb3NlTmVlZGVkLmxvYWQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXJrIHRoaXMgc3RyZWFtIGFzIG5lZWRpbmcgdG8gYmUgY2xvc2VkLgorICAgICAqIE9uY2UgbWFya2VkIGZvciBjbG9zaW5nLCBpdCBjYW5ub3QgYmUgdW5tYXJrZWQuCisgICAgICovCisgICAgdm9pZCBtYXJrQ2xvc2VOZWVkZWQoKSB7CisgICAgICAgIG1DbG9zZU5lZWRlZC5zdG9yZSh0cnVlKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldFR5cGVUZXh0KCkgY29uc3QgeyByZXR1cm4gIkJhc2UiOyB9CisKIHByb3RlY3RlZDoKIAogICAgIC8qKgpAQCAtMjA0LDYgKzI1OCw4IEBACiAKICAgICBhYXVkaW9fcmVzdWx0X3Qgc2VuZEN1cnJlbnRUaW1lc3RhbXAoKTsKIAorICAgIGFhdWRpb19yZXN1bHRfdCBzZW5kWFJ1bkNvdW50KGludDMyX3QgeFJ1bkNvdW50KTsKKwogICAgIC8qKgogICAgICAqIEBwYXJhbSBwb3NpdGlvbkZyYW1lcwogICAgICAqIEBwYXJhbSB0aW1lTmFub3MKQEAgLTIyOCw2ICsyODQsNyBAQAogCiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgbUZyYW1lc1BlckJ1cnN0ID0gMDsKICAgICBhbmRyb2lkOjpBdWRpb0NsaWVudCAgICBtTW1hcENsaWVudDsgLy8gc2V0IGluIG9wZW4sIHVzZWQgaW4gTU1BUCBzdGFydCgpCisgICAgLy8gVE9ETyByZW5hbWUgbUNsaWVudEhhbmRsZSB0byBtUG9ydEhhbmRsZSB0byBiZSBtb3JlIGNvbnNpc3RlbnQgd2l0aCBBdWRpb0ZsaW5nZXIuCiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICAgbUNsaWVudEhhbmRsZSA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CiAKICAgICBTaW1wbGVEb3VibGVCdWZmZXI8VGltZXN0YW1wPiAgbUF0b21pY1RpbWVzdGFtcDsKQEAgLTI0Miw2ICsyOTksMTIgQEAKIAogcHJpdmF0ZToKICAgICBhYXVkaW9faGFuZGxlX3QgICAgICAgICBtSGFuZGxlID0gLTE7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbUZsb3dpbmcgPSBmYWxzZTsKKworICAgIC8vIFRoaXMgaXMgbW9kaWZpZWQgdW5kZXIgYSBnbG9iYWwgbG9jayBpbiBBQXVkaW9TdHJlYW1UcmFja2VyLgorICAgIGludDMyX3QgICAgICAgICAgICAgICAgIG1DYWxsaW5nQ291bnQgPSAwOworCisgICAgc3RkOjphdG9taWM8Ym9vbD4gICAgICAgbUNsb3NlTmVlZGVke2ZhbHNlfTsKIH07CiAKIH0gLyogbmFtZXNwYWNlIGFhdWRpbyAqLwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuY3BwCmluZGV4IDJlN2ZmOGIuLmM4NDUzMDkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5jcHAKQEAgLTg2LDkgKzg2LDcgQEAKICAgICByZXR1cm4gQUFVRElPX09LOwogfQogCi0vKioKLSAqIFN0YXJ0IHRoZSBmbG93IG9mIGRhdGEuCi0gKi8KKy8vIFN0YXJ0IHRoZSBmbG93IG9mIGRhdGEuCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6OnN0YXJ0RGV2aWNlKCkgewogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6c3RhcnREZXZpY2UoKTsKICAgICBpZiAoIW1JblNlcnZpY2UgJiYgcmVzdWx0ID09IEFBVURJT19PSykgewpAQCAtOTgsOSArOTYsNyBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLS8qKgotICogU3RvcCB0aGUgZmxvdyBvZiBkYXRhIHN1Y2ggdGhhdCBzdGFydCgpIGNhbiByZXN1bWUgd2l0aCBsb3NzIG9mIGRhdGEuCi0gKi8KKy8vIFN0b3AgdGhlIGZsb3cgb2YgZGF0YSBzdWNoIHRoYXQgc3RhcnQoKSBjYW4gcmVzdW1lIHdpdGggbG9zcyBvZiBkYXRhLgogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQOjpwYXVzZSgpIHsKICAgICBpZiAoIWlzUnVubmluZygpKSB7CiAgICAgICAgIHJldHVybiBBQVVESU9fT0s7CkBAIC0xOTMsOSArMTg5LDcgQEAKICAgICB9CiB9CiAKLS8qKgotICogR2V0IGFuIGltbXV0YWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgZGF0YSBxdWV1ZSBmcm9tIHRoZSBIQUwuCi0gKi8KKy8vIEdldCBhbiBpbW11dGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGRhdGEgcXVldWUgZnJvbSB0aGUgSEFMLgogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQOjpnZXRBdWRpb0RhdGFEZXNjcmlwdGlvbigKICAgICAgICAgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJnBhcmNlbGFibGUpCiB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuaAppbmRleCBlMjQxNWQwLi4xNTA5ZjdkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmgKQEAgLTY5LDkgKzY5LDcgQEAKIAogICAgIGFhdWRpb19yZXN1bHRfdCBjbG9zZSgpIG92ZXJyaWRlOwogCi0gICAgLyoqCi0gICAgICogU2VuZCBhIE1NQVAvTk9JUlEgYnVmZmVyIHRpbWVzdGFtcCB0byB0aGUgY2xpZW50LgotICAgICAqLworICAgIGNvbnN0IGNoYXIgKmdldFR5cGVUZXh0KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gIk1NQVAiOyB9CiAKIHByb3RlY3RlZDoKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmNwcAppbmRleCBmNTVjNDBkLi4wNWM1NzM1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmNwcApAQCAtNzQsNyArNzQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZyYW1lc1BlckJ1cnN0KSB7CiAKICAgICBpZiAocmVxdWVzdGVkQ2FwYWNpdHlGcmFtZXMgPiBNQVhfRlJBTUVTX1BFUl9CVUZGRVIpIHsKLSAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6OmNhbGN1bGF0ZUJ1ZmZlckNhcGFjaXR5KCkgcmVxdWVzdGVkIGNhcGFjaXR5ICVkID4gbWF4ICVkIiwKKyAgICAgICAgQUxPR0UoImNhbGN1bGF0ZUJ1ZmZlckNhcGFjaXR5KCkgcmVxdWVzdGVkIGNhcGFjaXR5ICVkID4gbWF4ICVkIiwKICAgICAgICAgICAgICAgcmVxdWVzdGVkQ2FwYWNpdHlGcmFtZXMsIE1BWF9GUkFNRVNfUEVSX0JVRkZFUik7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFOwogICAgIH0KQEAgLTk5LDcgKzk5LDcgQEAKICAgICB9CiAgICAgLy8gQ2hlY2sgZm9yIG51bWVyaWMgb3ZlcmZsb3cuCiAgICAgaWYgKG51bUJ1cnN0cyA+IDB4ODAwMCB8fCBmcmFtZXNQZXJCdXJzdCA+IDB4ODAwMCkgewotICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6Y2FsY3VsYXRlQnVmZmVyQ2FwYWNpdHkoKSBvdmVyZmxvdywgY2FwYWNpdHkgPSAlZCAqICVkIiwKKyAgICAgICAgQUxPR0UoImNhbGN1bGF0ZUJ1ZmZlckNhcGFjaXR5KCkgb3ZlcmZsb3csIGNhcGFjaXR5ID0gJWQgKiAlZCIsCiAgICAgICAgICAgICAgIG51bUJ1cnN0cywgZnJhbWVzUGVyQnVyc3QpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKICAgICB9CkBAIC0xMDcsMTEgKzEwNywxMSBAQAogCiAgICAgLy8gRmluYWwgc2FuaXR5IGNoZWNrLgogICAgIGlmIChjYXBhY2l0eUluRnJhbWVzID4gTUFYX0ZSQU1FU19QRVJfQlVGRkVSKSB7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpjYWxjdWxhdGVCdWZmZXJDYXBhY2l0eSgpIGNhbGMgY2FwYWNpdHkgJWQgPiBtYXggJWQiLAorICAgICAgICBBTE9HRSgiY2FsY3VsYXRlQnVmZmVyQ2FwYWNpdHkoKSBjYWxjIGNhcGFjaXR5ICVkID4gbWF4ICVkIiwKICAgICAgICAgICAgICAgY2FwYWNpdHlJbkZyYW1lcywgTUFYX0ZSQU1FU19QRVJfQlVGRkVSKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgfQotICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpjYWxjdWxhdGVCdWZmZXJDYXBhY2l0eSgpIHJlcXVlc3RlZCAlZCBmcmFtZXMsIGFjdHVhbCA9ICVkIiwKKyAgICBBTE9HRCgiY2FsY3VsYXRlQnVmZmVyQ2FwYWNpdHkoKSByZXF1ZXN0ZWQgJWQgZnJhbWVzLCBhY3R1YWwgPSAlZCIsCiAgICAgICAgICAgcmVxdWVzdGVkQ2FwYWNpdHlGcmFtZXMsIGNhcGFjaXR5SW5GcmFtZXMpOwogICAgIHJldHVybiBjYXBhY2l0eUluRnJhbWVzOwogfQpAQCAtMTIyLDcgKzEyMiw3IEBACiAKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6Om9wZW4ocmVxdWVzdCwgQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQpOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZSBvcGVuKCkgcmV0dXJuZWQgJWQiLCByZXN1bHQpOworICAgICAgICBBTE9HRSgiJXMoKSByZXR1cm5lZCAlZCIsIF9fZnVuY19fLCByZXN1bHQpOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIApAQCAtMTM5LDcgKzEzOSw3IEBACiAgICAgaWYgKGdldEZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQpIHsKICAgICAgICAgc2V0Rm9ybWF0KEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsKICAgICB9IGVsc2UgaWYgKGdldEZvcm1hdCgpICE9IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpvcGVuKCkgbUF1ZGlvRm9ybWF0ID0gJWQsIG5lZWQgRkxPQVQiLCBnZXRGb3JtYXQoKSk7CisgICAgICAgIEFMT0dEKCIlcygpIG1BdWRpb0Zvcm1hdCA9ICVkLCBuZWVkIEZMT0FUIiwgX19mdW5jX18sIGdldEZvcm1hdCgpKTsKICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX0lOVkFMSURfRk9STUFUOwogICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KQEAgLTE0OCw4ICsxNDgsOCBAQAogICAgIGlmIChnZXRTYW1wbGVSYXRlKCkgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7CiAgICAgICAgIHNldFNhbXBsZVJhdGUoZW5kcG9pbnQtPmdldFNhbXBsZVJhdGUoKSk7CiAgICAgfSBlbHNlIGlmIChnZXRTYW1wbGVSYXRlKCkgIT0gZW5kcG9pbnQtPmdldFNhbXBsZVJhdGUoKSkgewotICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6b3BlbigpIG1TYW1wbGVSYXRlID0gJWQsIG5lZWQgJWQiLAotICAgICAgICAgICAgICBnZXRTYW1wbGVSYXRlKCksIGVuZHBvaW50LT5nZXRTYW1wbGVSYXRlKCkpOworICAgICAgICBBTE9HRCgiJXMoKSBtU2FtcGxlUmF0ZSA9ICVkLCBuZWVkICVkIiwKKyAgICAgICAgICAgICAgX19mdW5jX18sIGdldFNhbXBsZVJhdGUoKSwgZW5kcG9pbnQtPmdldFNhbXBsZVJhdGUoKSk7CiAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9JTlZBTElEX1JBVEU7CiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQpAQCAtMTU4LDggKzE1OCw4IEBACiAgICAgaWYgKGdldFNhbXBsZXNQZXJGcmFtZSgpID09IEFBVURJT19VTlNQRUNJRklFRCkgewogICAgICAgICBzZXRTYW1wbGVzUGVyRnJhbWUoZW5kcG9pbnQtPmdldFNhbXBsZXNQZXJGcmFtZSgpKTsKICAgICB9IGVsc2UgaWYgKGdldFNhbXBsZXNQZXJGcmFtZSgpICE9IGVuZHBvaW50LT5nZXRTYW1wbGVzUGVyRnJhbWUoKSkgewotICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6b3BlbigpIG1TYW1wbGVzUGVyRnJhbWUgPSAlZCwgbmVlZCAlZCIsCi0gICAgICAgICAgICAgIGdldFNhbXBsZXNQZXJGcmFtZSgpLCBlbmRwb2ludC0+Z2V0U2FtcGxlc1BlckZyYW1lKCkpOworICAgICAgICBBTE9HRCgiJXMoKSBtU2FtcGxlc1BlckZyYW1lID0gJWQsIG5lZWQgJWQiLAorICAgICAgICAgICAgICBfX2Z1bmNfXywgZ2V0U2FtcGxlc1BlckZyYW1lKCksIGVuZHBvaW50LT5nZXRTYW1wbGVzUGVyRnJhbWUoKSk7CiAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQpAQCAtMTc4LDggKzE3OCw4IEBACiAgICAgICAgIG1BdWRpb0RhdGFRdWV1ZSA9IG5ldyBTaGFyZWRSaW5nQnVmZmVyKCk7CiAgICAgICAgIHJlc3VsdCA9IG1BdWRpb0RhdGFRdWV1ZS0+YWxsb2NhdGUoY2FsY3VsYXRlQnl0ZXNQZXJGcmFtZSgpLCBnZXRCdWZmZXJDYXBhY2l0eSgpKTsKICAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpvcGVuKCkgY291bGQgbm90IGFsbG9jYXRlIEZJRk8gd2l0aCAlZCBmcmFtZXMiLAotICAgICAgICAgICAgICAgICAgZ2V0QnVmZmVyQ2FwYWNpdHkoKSk7CisgICAgICAgICAgICBBTE9HRSgiJXMoKSBjb3VsZCBub3QgYWxsb2NhdGUgRklGTyB3aXRoICVkIGZyYW1lcyIsCisgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgZ2V0QnVmZmVyQ2FwYWNpdHkoKSk7CiAgICAgICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfTk9fTUVNT1JZOwogICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQpAQCAtMjIyLDcgKzIyMiw3IEBACiB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUF1ZGlvRGF0YVF1ZXVlTG9jayk7CiAgICAgaWYgKG1BdWRpb0RhdGFRdWV1ZSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJnZXRBdWRpb0RhdGFEZXNjcmlwdGlvbigpOiBtVXBNZXNzYWdlUXVldWUgbnVsbCEgLSBzdHJlYW0gbm90IG9wZW4iKTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IG1VcE1lc3NhZ2VRdWV1ZSBudWxsISAtIHN0cmVhbSBub3Qgb3BlbiIsIF9fZnVuY19fKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9OVUxMOwogICAgIH0KICAgICAvLyBHYXRoZXIgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgcXVldWUuCkBAIC0yNjYsOCArMjY2LDggQEAKICAgICAgICAgaW50NjRfdCBvZmZzZXQgPSBtVGltZXN0YW1wUG9zaXRpb25PZmZzZXQubG9hZCgpOwogICAgICAgICAvLyBUT0RPLCBkbyBub3QgZ28gYmVsb3cgc3RhcnRpbmcgdmFsdWUKICAgICAgICAgcG9zaXRpb24gLT0gb2Zmc2V0OyAvLyBPZmZzZXQgZnJvbSBzaGFyZWQgTU1BUCBzdHJlYW0KLSAgICAgICAgQUxPR1YoImdldEhhcmR3YXJlVGltZXN0YW1wKCkgJThsbGQgPSAlOGxsZCAtICU4bGxkIiwKLSAgICAgICAgICAgICAgKGxvbmcgbG9uZykgcG9zaXRpb24sIChsb25nIGxvbmcpIChwb3NpdGlvbiArIG9mZnNldCksIChsb25nIGxvbmcpIG9mZnNldCk7CisgICAgICAgIEFMT0dWKCIlcygpICU4bGxkID0gJThsbGQgLSAlOGxsZCIsCisgICAgICAgICAgICAgIF9fZnVuY19fLCAobG9uZyBsb25nKSBwb3NpdGlvbiwgKGxvbmcgbG9uZykgKHBvc2l0aW9uICsgb2Zmc2V0KSwgKGxvbmcgbG9uZykgb2Zmc2V0KTsKICAgICB9CiAgICAgKnBvc2l0aW9uRnJhbWVzID0gcG9zaXRpb247CiAgICAgcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuaAppbmRleCA4NDk5ZWE1Li42MTc2OWI1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmgKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5oCkBAIC0xLDQgKzEsNCBAQAotLyoKKyAvKgogICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKQEAgLTQzLDcgKzQzLDcgQEAKIGNsYXNzIEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQgOiBwdWJsaWMgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UgewogCiBwdWJsaWM6Ci0gICAgQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZChhbmRyb2lkOjpBQXVkaW9TZXJ2aWNlICZhQXVkaW9TZXJ2aWNlKTsKKyAgICBleHBsaWNpdCBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkKGFuZHJvaWQ6OkFBdWRpb1NlcnZpY2UgJmFBdWRpb1NlcnZpY2UpOwogICAgIHZpcnR1YWwgfkFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQoKSA9IGRlZmF1bHQ7CiAKICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZHVtcEhlYWRlcigpOwpAQCAtODAsMTMgKzgwLDE1IEBACiAgICAgfQogCiAgICAgdm9pZCBpbmNyZW1lbnRYUnVuQ291bnQoKSB7Ci0gICAgICAgIG1YUnVuQ291bnQrKzsKKyAgICAgICAgc2VuZFhSdW5Db3VudCgrK21YUnVuQ291bnQpOwogICAgIH0KIAogICAgIGludDMyX3QgZ2V0WFJ1bkNvdW50KCkgY29uc3QgewogICAgICAgICByZXR1cm4gbVhSdW5Db3VudC5sb2FkKCk7CiAgICAgfQogCisgICAgY29uc3QgY2hhciAqZ2V0VHlwZVRleHQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAiU2hhcmVkIjsgfQorCiBwcm90ZWN0ZWQ6CiAKICAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0QXVkaW9EYXRhRGVzY3JpcHRpb24oQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJnBhcmNlbGFibGUpIG92ZXJyaWRlOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU3RyZWFtVHJhY2tlci5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TdHJlYW1UcmFja2VyLmNwcAppbmRleCBlZjg4YjM0Li4zMzI4MTU5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TdHJlYW1UcmFja2VyLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TdHJlYW1UcmFja2VyLmNwcApAQCAtMzAsMjUgKzMwLDUyIEBACiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhYXVkaW87CiAKLXNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBBQXVkaW9TdHJlYW1UcmFja2VyOjpyZW1vdmVTdHJlYW1CeUhhbmRsZSgKK3NwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBBQXVkaW9TdHJlYW1UcmFja2VyOjpkZWNyZW1lbnRBbmRSZW1vdmVTdHJlYW1CeUhhbmRsZSgKICAgICAgICAgYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgewogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1IYW5kbGVMb2NrKTsKICAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbTsKICAgICBhdXRvIGl0ID0gbVN0cmVhbXNCeUhhbmRsZS5maW5kKHN0cmVhbUhhbmRsZSk7CiAgICAgaWYgKGl0ICE9IG1TdHJlYW1zQnlIYW5kbGUuZW5kKCkpIHsKLSAgICAgICAgc2VydmljZVN0cmVhbSA9IGl0LT5zZWNvbmQ7Ci0gICAgICAgIG1TdHJlYW1zQnlIYW5kbGUuZXJhc2UoaXQpOworICAgICAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gdGVtcFN0cmVhbSA9IGl0LT5zZWNvbmQ7CisgICAgICAgIC8vIERvZXMgdGhlIGNhbGxlciBuZWVkIHRvIGNsb3NlIHRoZSBzdHJlYW0/CisgICAgICAgIC8vIFRoZSByZWZlcmVuY2UgY291bnQgc2hvdWxkIG5ldmVyIGJlIG5lZ2F0aXZlLgorICAgICAgICAvLyBCdXQgaXQgaXMgc2FmZXIgdG8gY2hlY2sgZm9yIDw9IDAgdGhhbiA9PSAwLgorICAgICAgICBpZiAoKHRlbXBTdHJlYW0tPmRlY3JlbWVudFNlcnZpY2VSZWZlcmVuY2VDb3VudF9sKCkgPD0gMCkgJiYgdGVtcFN0cmVhbS0+aXNDbG9zZU5lZWRlZCgpKSB7CisgICAgICAgICAgICBzZXJ2aWNlU3RyZWFtID0gdGVtcFN0cmVhbTsgLy8gT25seSByZXR1cm4gc3RyZWFtIGlmIHJlYWR5IHRvIGJlIGNsb3NlZC4KKyAgICAgICAgICAgIG1TdHJlYW1zQnlIYW5kbGUuZXJhc2UoaXQpOworICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBzZXJ2aWNlU3RyZWFtOwogfQogCi1zcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gQUF1ZGlvU3RyZWFtVHJhY2tlcjo6Z2V0U3RyZWFtQnlIYW5kbGUoCitzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gQUF1ZGlvU3RyZWFtVHJhY2tlcjo6Z2V0U3RyZWFtQnlIYW5kbGVBbmRJbmNyZW1lbnQoCiAgICAgICAgIGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIHsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSGFuZGxlTG9jayk7CiAgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHNlcnZpY2VTdHJlYW07CiAgICAgYXV0byBpdCA9IG1TdHJlYW1zQnlIYW5kbGUuZmluZChzdHJlYW1IYW5kbGUpOwogICAgIGlmIChpdCAhPSBtU3RyZWFtc0J5SGFuZGxlLmVuZCgpKSB7CiAgICAgICAgIHNlcnZpY2VTdHJlYW0gPSBpdC0+c2Vjb25kOworICAgICAgICBzZXJ2aWNlU3RyZWFtLT5pbmNyZW1lbnRTZXJ2aWNlUmVmZXJlbmNlQ291bnRfbCgpOworICAgIH0KKyAgICByZXR1cm4gc2VydmljZVN0cmVhbTsKK30KKworLy8gVGhlIHBvcnQgaGFuZGxlIGlzIG9ubHkgYXZhaWxhYmxlIHdoZW4gdGhlIHN0cmVhbSBpcyBzdGFydGVkLgorLy8gU28gd2UgaGF2ZSB0byBpdGVyYXRlIG92ZXIgYWxsIHRoZSBzdHJlYW1zLgorLy8gTHVja2lseSB0aGlzIHJhcmVseSBoYXBwZW5zLgorc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IEFBdWRpb1N0cmVhbVRyYWNrZXI6OmZpbmRTdHJlYW1CeVBvcnRIYW5kbGVBbmRJbmNyZW1lbnQoCisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydEhhbmRsZSkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1IYW5kbGVMb2NrKTsKKyAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbTsKKyAgICBhdXRvIGl0ID0gbVN0cmVhbXNCeUhhbmRsZS5iZWdpbigpOworICAgIHdoaWxlIChpdCAhPSBtU3RyZWFtc0J5SGFuZGxlLmVuZCgpKSB7CisgICAgICAgIGF1dG8gY2FuZGlkYXRlID0gaXQtPnNlY29uZDsKKyAgICAgICAgaWYgKGNhbmRpZGF0ZS0+Z2V0UG9ydEhhbmRsZSgpID09IHBvcnRIYW5kbGUpIHsKKyAgICAgICAgICAgIHNlcnZpY2VTdHJlYW0gPSBjYW5kaWRhdGU7CisgICAgICAgICAgICBzZXJ2aWNlU3RyZWFtLT5pbmNyZW1lbnRTZXJ2aWNlUmVmZXJlbmNlQ291bnRfbCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaXQrKzsKICAgICB9CiAgICAgcmV0dXJuIHNlcnZpY2VTdHJlYW07CiB9CkBAIC02Niw3ICs5Myw3IEBACiAKIGFhdWRpb19oYW5kbGVfdCBBQXVkaW9TdHJlYW1UcmFja2VyOjphZGRTdHJlYW1Gb3JIYW5kbGUoc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHNlcnZpY2VTdHJlYW0pIHsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSGFuZGxlTG9jayk7Ci0gICAgYWF1ZGlvX2hhbmRsZV90IGhhbmRsZSA9IG1QcmV2aW91c0hhbmRsZS5sb2FkKCk7CisgICAgYWF1ZGlvX2hhbmRsZV90IGhhbmRsZSA9IG1QcmV2aW91c0hhbmRsZTsKICAgICAvLyBBc3NpZ24gYSB1bmlxdWUgaGFuZGxlLgogICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgIGhhbmRsZSA9IGJ1bXBIYW5kbGUoaGFuZGxlKTsKQEAgLTc4LDcgKzEwNSw3IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KLSAgICBtUHJldmlvdXNIYW5kbGUuc3RvcmUoaGFuZGxlKTsKKyAgICBtUHJldmlvdXNIYW5kbGUgPSBoYW5kbGU7CiAgICAgcmV0dXJuIGhhbmRsZTsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU3RyZWFtVHJhY2tlci5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU3RyZWFtVHJhY2tlci5oCmluZGV4IDcwZDQ0MGQuLjU3ZWM0MjYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1N0cmVhbVRyYWNrZXIuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TdHJlYW1UcmFja2VyLmgKQEAgLTMyLDE4ICszMiwzNiBAQAogCiBwdWJsaWM6CiAgICAgLyoqCi0gICAgICogUmVtb3ZlIHRoZSBzdHJlYW0gYXNzb2NpYXRlZCB3aXRoIHRoZSBoYW5kbGUuCisgICAgICogRmluZCB0aGUgc3RyZWFtIGFzc29jaWF0ZWQgd2l0aCB0aGUgaGFuZGxlLgorICAgICAqIERlY3JlbWVudCBpdHMgcmVmZXJlbmNlIGNvdW50ZXIuIElmIHplcm8gYW5kIHRoZSBzdHJlYW0gbmVlZHMKKyAgICAgKiB0byBiZSBjbG9zZWQgdGhlbiByZW1vdmUgdGhlIHN0cmVhbSBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgc3RyZWFtLgorICAgICAqIE90aGVyd2lzZSByZXR1cm4gbnVsbCBpZiBpdCBkb2VzIG5vdCBuZWVkIHRvIGJlIGNsb3NlZC4KKyAgICAgKgogICAgICAqIEBwYXJhbSBzdHJlYW1IYW5kbGUKLSAgICAgKiBAcmV0dXJuIHN0cm9uZyBwb2ludGVyIHRvIHRoZSBzdHJlYW0gaWYgZm91bmQgb3IgdG8gbnVsbHB0cgorICAgICAqIEByZXR1cm4gc3Ryb25nIHBvaW50ZXIgdG8gdGhlIHN0cmVhbSBpZiBpdCBuZWVkcyB0byBiZSBjbG9zZWQsIG9yIG51bGxwdHIKICAgICAgKi8KLSAgICBhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gcmVtb3ZlU3RyZWFtQnlIYW5kbGUoYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSk7CisgICAgYW5kcm9pZDo6c3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IGRlY3JlbWVudEFuZFJlbW92ZVN0cmVhbUJ5SGFuZGxlKAorICAgICAgICAgICAgYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSk7CiAKICAgICAvKioKICAgICAgKiBMb29rIHVwIGEgc3RyZWFtIGJhc2VkIG9uIHRoZSBoYW5kbGUuCisgICAgICogSW5jcmVtZW50IGl0cyBzZXJ2aWNlIHJlZmVyZW5jZSBjb3VudCBpZiBmb3VuZC4KKyAgICAgKgogICAgICAqIEBwYXJhbSBzdHJlYW1IYW5kbGUKLSAgICAgKiBAcmV0dXJuIHN0cm9uZyBwb2ludGVyIHRvIHRoZSBzdHJlYW0gaWYgZm91bmQgb3IgdG8gbnVsbHB0cgorICAgICAqIEByZXR1cm4gc3Ryb25nIHBvaW50ZXIgdG8gdGhlIHN0cmVhbSBpZiBmb3VuZCwgb3IgbnVsbHB0cgogICAgICAqLwotICAgIGFuZHJvaWQ6OnNwPGFhdWRpbzo6QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IGdldFN0cmVhbUJ5SGFuZGxlKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpOworICAgIGFuZHJvaWQ6OnNwPGFhdWRpbzo6QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IGdldFN0cmVhbUJ5SGFuZGxlQW5kSW5jcmVtZW50KAorICAgICAgICAgICAgYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSk7CisKKyAgICAvKioKKyAgICAgKiBMb29rIHVwIGEgc3RyZWFtIGJhc2VkIG9uIHRoZSBBdWRpb1BvbGljeSBwb3J0SGFuZGxlLgorICAgICAqIEluY3JlbWVudCBpdHMgc2VydmljZSByZWZlcmVuY2UgY291bnQgaWYgZm91bmQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcG9ydEhhbmRsZQorICAgICAqIEByZXR1cm4gc3Ryb25nIHBvaW50ZXIgdG8gdGhlIHN0cmVhbSBpZiBmb3VuZCwgb3IgbnVsbHB0cgorICAgICAqLworICAgIGFuZHJvaWQ6OnNwPGFhdWRpbzo6QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IGZpbmRTdHJlYW1CeVBvcnRIYW5kbGVBbmRJbmNyZW1lbnQoCisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRIYW5kbGUpOwogCiAgICAgLyoqCiAgICAgICogU3RvcmUgYSBzdHJvbmcgcG9pbnRlciB0byB0aGUgc3RyZWFtIGFuZCByZXR1cm4gYSB1bmlxdWUgaGFuZGxlIGZvciBmdXR1cmUgcmVmZXJlbmNlLgpAQCAtNjMsNyArODEsOSBAQAogCiAgICAgLy8gVHJhY2sgc3RyZWFtIHVzaW5nIGEgdW5pcXVlIGhhbmRsZSB0aGF0IHdyYXBzLiBPbmx5IHVzZSBwb3NpdGl2ZSBoYWxmLgogICAgIG11dGFibGUgc3RkOjptdXRleCAgICAgICAgICAgICAgICBtSGFuZGxlTG9jazsKLSAgICBzdGQ6OmF0b21pYzxhYXVkaW9faGFuZGxlX3Q+ICAgICAgbVByZXZpb3VzSGFuZGxlezB9OworICAgIC8vIHByb3RlY3RlZCBieSBtSGFuZGxlTG9jaworICAgIGFhdWRpb19oYW5kbGVfdCAgICAgICAgICAgICAgICAgICBtUHJldmlvdXNIYW5kbGUgPSAwOworICAgIC8vIHByb3RlY3RlZCBieSBtSGFuZGxlTG9jawogICAgIHN0ZDo6bWFwPGFhdWRpb19oYW5kbGVfdCwgYW5kcm9pZDo6c3A8YWF1ZGlvOjpBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4+IG1TdHJlYW1zQnlIYW5kbGU7CiB9OwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9UaHJlYWQuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvVGhyZWFkLmNwcAppbmRleCBjNmZiNTdkLi5lZDc4OTViIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9UaHJlYWQuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1RocmVhZC5jcHAKQEAgLTE0LDcgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNkZWZpbmUgTE9HX1RBRyAiQUF1ZGlvU2VydmljZSIKKyNkZWZpbmUgTE9HX1RBRyAiQUF1ZGlvVGhyZWFkIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCkBAIC0yNywxMiArMjcsMjYgQEAKIAogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsKIAorc3RkOjphdG9taWM8dWludDMyX3Q+IEFBdWRpb1RocmVhZDo6bU5leHRUaHJlYWRJbmRleHsxfTsKIAotQUF1ZGlvVGhyZWFkOjpBQXVkaW9UaHJlYWQoKQotICAgIDogbVJ1bm5hYmxlKG51bGxwdHIpCi0gICAgLCBtSGFzVGhyZWFkKGZhbHNlKSB7CitBQXVkaW9UaHJlYWQ6OkFBdWRpb1RocmVhZChjb25zdCBjaGFyICpwcmVmaXgpIHsKKyAgICBzZXR1cChwcmVmaXgpOworfQorCitBQXVkaW9UaHJlYWQ6OkFBdWRpb1RocmVhZCgpIHsKKyAgICBzZXR1cCgiQUF1ZGlvIik7Cit9CisKK3ZvaWQgQUF1ZGlvVGhyZWFkOjpzZXR1cChjb25zdCBjaGFyICpwcmVmaXgpIHsKICAgICAvLyBtVGhyZWFkIGlzIGEgcHRocmVhZF90IG9mIHVua25vd24gc2l6ZSBzbyB3ZSBuZWVkIG1lbXNldCgpLgogICAgIG1lbXNldCgmbVRocmVhZCwgMCwgc2l6ZW9mKG1UaHJlYWQpKTsKKworICAgIC8vIE5hbWUgdGhlIHRocmVhZCB3aXRoIGFuIGluY3JlYXNpbmcgaW5kZXgsICJwcmVmaXhfIyIsIGZvciBkZWJ1Z2dpbmcuCisgICAgdWludDMyX3QgaW5kZXggPSBtTmV4dFRocmVhZEluZGV4Kys7CisgICAgLy8gV3JhcCB0aGUgaW5kZXggc28gdGhhdCB3ZSBkbyBub3QgaGl0IHRoZSAxNiBjaGFyIGxpbWl0CisgICAgLy8gYW5kIHRvIGF2b2lkIGhhcmQtdG8tcmVhZCBsYXJnZSBudW1iZXJzLgorICAgIGluZGV4ID0gaW5kZXggJSAxMDAwMDA7IC8vIGFyYml0cmFyeQorICAgIHNucHJpbnRmKG1OYW1lLCBzaXplb2YobU5hbWUpLCAiJXNfJXUiLCBwcmVmaXgsIGluZGV4KTsKIH0KIAogdm9pZCBBQXVkaW9UaHJlYWQ6OmRpc3BhdGNoKCkgewpAQCAtNTMsNyArNjcsNyBAQAogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvVGhyZWFkOjpzdGFydChSdW5uYWJsZSAqcnVubmFibGUpIHsKICAgICBpZiAobUhhc1RocmVhZCkgewotICAgICAgICBBTE9HRSgiQUF1ZGlvVGhyZWFkOjpzdGFydCgpIC0gbUhhc1RocmVhZCBhbHJlYWR5IHRydWUiKTsKKyAgICAgICAgQUxPR0UoInN0YXJ0KCkgLSBtSGFzVGhyZWFkIGFscmVhZHkgdHJ1ZSIpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogICAgIC8vIG1SdW5uYWJsZSB3aWxsIGJlIHJlYWQgYnkgdGhlIG5ldyB0aHJlYWQgd2hlbiBpdCBzdGFydHMuCkBAIC02MSw5ICs3NSwxMSBAQAogICAgIG1SdW5uYWJsZSA9IHJ1bm5hYmxlOwogICAgIGludCBlcnIgPSBwdGhyZWFkX2NyZWF0ZSgmbVRocmVhZCwgbnVsbHB0ciwgQUF1ZGlvVGhyZWFkX2ludGVybmFsVGhyZWFkUHJvYywgdGhpcyk7CiAgICAgaWYgKGVyciAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9UaHJlYWQ6OnN0YXJ0KCkgLSBwdGhyZWFkX2NyZWF0ZSgpIHJldHVybmVkICVkICVzIiwgZXJyLCBzdHJlcnJvcihlcnIpKTsKKyAgICAgICAgQUxPR0UoInN0YXJ0KCkgLSBwdGhyZWFkX2NyZWF0ZSgpIHJldHVybmVkICVkICVzIiwgZXJyLCBzdHJlcnJvcihlcnIpKTsKICAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KC1lcnIpOwogICAgIH0gZWxzZSB7CisgICAgICAgIGludCBlcnIgPSBwdGhyZWFkX3NldG5hbWVfbnAobVRocmVhZCwgbU5hbWUpOworICAgICAgICBBTE9HV19JRigoZXJyICE9IDApLCAiQ291bGQgbm90IHNldCBuYW1lIG9mIEFBdWRpb1RocmVhZC4gZXJyID0gJWQiLCBlcnIpOwogICAgICAgICBtSGFzVGhyZWFkID0gdHJ1ZTsKICAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKICAgICB9CkBAIC03MSwxMyArODcsMTMgQEAKIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1RocmVhZDo6c3RvcCgpIHsKICAgICBpZiAoIW1IYXNUaHJlYWQpIHsKLSAgICAgICAgQUxPR0UoIkFBdWRpb1RocmVhZDo6c3RvcCgpIGJ1dCBubyB0aHJlYWQgcnVubmluZyIpOworICAgICAgICBBTE9HRSgic3RvcCgpIGJ1dCBubyB0aHJlYWQgcnVubmluZyIpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogICAgIGludCBlcnIgPSBwdGhyZWFkX2pvaW4obVRocmVhZCwgbnVsbHB0cik7CiAgICAgbUhhc1RocmVhZCA9IGZhbHNlOwogICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICBBTE9HRSgiQUF1ZGlvVGhyZWFkOjpzdG9wKCkgLSBwdGhyZWFkX2pvaW4oKSByZXR1cm5lZCAlZCAlcyIsIGVyciwgc3RyZXJyb3IoZXJyKSk7CisgICAgICAgIEFMT0dFKCJzdG9wKCkgLSBwdGhyZWFkX2pvaW4oKSByZXR1cm5lZCAlZCAlcyIsIGVyciwgc3RyZXJyb3IoZXJyKSk7CiAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdCgtZXJyKTsKICAgICB9IGVsc2UgewogICAgICAgICByZXR1cm4gQUFVRElPX09LOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvVGhyZWFkLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9UaHJlYWQuaAppbmRleCAwMmYxNDU5Li5kY2NlNjhhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9UaHJlYWQuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9UaHJlYWQuaApAQCAtNDMsNyArNDMsOSBAQAogewogcHVibGljOgogICAgIEFBdWRpb1RocmVhZCgpOwotICAgIEFBdWRpb1RocmVhZChSdW5uYWJsZSAqcnVubmFibGUpOworCisgICAgZXhwbGljaXQgQUF1ZGlvVGhyZWFkKGNvbnN0IGNoYXIgKnByZWZpeCk7CisKICAgICB2aXJ0dWFsIH5BQXVkaW9UaHJlYWQoKSA9IGRlZmF1bHQ7CiAKICAgICAvKioKQEAgLTY2LDEwICs2OCwxNSBAQAogICAgIHZvaWQgZGlzcGF0Y2goKTsgLy8gY2FsbGVkIGludGVybmFsbHkgZnJvbSAnQycgdGhyZWFkIHdyYXBwZXIKIAogcHJpdmF0ZToKLSAgICBSdW5uYWJsZSAgICAqbVJ1bm5hYmxlOwotICAgIGJvb2wgICAgICAgICBtSGFzVGhyZWFkOworCisgICAgdm9pZCBzZXR1cChjb25zdCBjaGFyICpwcmVmaXgpOworCisgICAgUnVubmFibGUgICAgKm1SdW5uYWJsZSA9IG51bGxwdHI7CisgICAgYm9vbCAgICAgICAgIG1IYXNUaHJlYWQgPSBmYWxzZTsKICAgICBwdGhyZWFkX3QgICAgbVRocmVhZDsgLy8gaW5pdGlhbGl6ZWQgaW4gY29uc3RydWN0b3IKIAorICAgIHN0YXRpYyBzdGQ6OmF0b21pYzx1aW50MzJfdD4gbU5leHRUaHJlYWRJbmRleDsKKyAgICBjaGFyICAgICAgICAgbU5hbWVbMTZdOyAvLyBtYXggbGVuZ3RoIGZvciBhIHB0aHJlYWRfbmFtZQogfTsKIAogfSAvKiBuYW1lc3BhY2UgYWF1ZGlvICovCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9TaGFyZWRNZW1vcnlQcm94eS5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9TaGFyZWRNZW1vcnlQcm94eS5jcHAKaW5kZXggYzMxNTU3ZS4uYzQzZWQyMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvU2hhcmVkTWVtb3J5UHJveHkuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL1NoYXJlZE1lbW9yeVByb3h5LmNwcApAQCAtMTQsMTAgKzE0LDEzIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jZGVmaW5lIExPR19UQUcgIkFBdWRpb1NlcnZpY2UiCisjZGVmaW5lIExPR19UQUcgIlNoYXJlZE1lbW9yeVByb3h5IgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2luY2x1ZGUgPGxvZy9sb2cuaD4KIAorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAjaW5jbHVkZSAiU2hhcmVkTWVtb3J5UHJveHkuaCIKIApAQCAtNDIsMTIgKzQ1LDEyIEBACiAKICAgICBtUHJveHlGaWxlRGVzY3JpcHRvciA9IGFzaG1lbV9jcmVhdGVfcmVnaW9uKCJBQXVkaW9Qcm94eURhdGFCdWZmZXIiLCBtU2hhcmVkTWVtb3J5U2l6ZUluQnl0ZXMpOwogICAgIGlmIChtUHJveHlGaWxlRGVzY3JpcHRvciA8IDApIHsKLSAgICAgICAgQUxPR0UoIlNoYXJlZE1lbW9yeVByb3h5OjpvcGVuKCkgYXNobWVtX2NyZWF0ZV9yZWdpb24oKSBmYWlsZWQgJWQiLCBlcnJubyk7CisgICAgICAgIEFMT0dFKCJvcGVuKCkgYXNobWVtX2NyZWF0ZV9yZWdpb24oKSBmYWlsZWQgJWQiLCBlcnJubyk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5URVJOQUw7CiAgICAgfQogICAgIGludCBlcnIgPSBhc2htZW1fc2V0X3Byb3RfcmVnaW9uKG1Qcm94eUZpbGVEZXNjcmlwdG9yLCBQUk9UX1JFQUR8UFJPVF9XUklURSk7CiAgICAgaWYgKGVyciA8IDApIHsKLSAgICAgICAgQUxPR0UoIlNoYXJlZE1lbW9yeVByb3h5OjpvcGVuKCkgYXNobWVtX3NldF9wcm90X3JlZ2lvbigpIGZhaWxlZCAlZCIsIGVycm5vKTsKKyAgICAgICAgQUxPR0UoIm9wZW4oKSBhc2htZW1fc2V0X3Byb3RfcmVnaW9uKCkgZmFpbGVkICVkIiwgZXJybm8pOwogICAgICAgICBjbG9zZShtUHJveHlGaWxlRGVzY3JpcHRvcik7CiAgICAgICAgIG1Qcm94eUZpbGVEZXNjcmlwdG9yID0gLTE7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5URVJOQUw7IC8vIFRPRE8gY29udmVydCBlcnJubyB0byBhIGJldHRlciBBQVVESU9fRVJST1I7CkBAIC01OSw3ICs2Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgTUFQX1NIQVJFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICBtT3JpZ2luYWxGaWxlRGVzY3JpcHRvciwgMCk7CiAgICAgaWYgKG1PcmlnaW5hbFNoYXJlZE1lbW9yeSA9PSBNQVBfRkFJTEVEKSB7Ci0gICAgICAgIEFMT0dFKCJTaGFyZWRNZW1vcnlQcm94eTo6b3BlbigpIG9yaWdpbmFsIG1tYXAoJWQpIGZhaWxlZCAlZCAoJXMpIiwKKyAgICAgICAgQUxPR0UoIm9wZW4oKSBvcmlnaW5hbCBtbWFwKCVkKSBmYWlsZWQgJWQgKCVzKSIsCiAgICAgICAgICAgICAgICAgbU9yaWdpbmFsRmlsZURlc2NyaXB0b3IsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVEVSTkFMOyAvLyBUT0RPIGNvbnZlcnQgZXJybm8gdG8gYSBiZXR0ZXIgQUFVRElPX0VSUk9SOwogICAgIH0KQEAgLTcwLDcgKzczLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBNQVBfU0hBUkVELAogICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcm94eUZpbGVEZXNjcmlwdG9yLCAwKTsKICAgICBpZiAobVByb3h5U2hhcmVkTWVtb3J5ICE9IG1PcmlnaW5hbFNoYXJlZE1lbW9yeSkgewotICAgICAgICBBTE9HRSgiU2hhcmVkTWVtb3J5UHJveHk6Om9wZW4oKSBwcm94eSBtbWFwKCVkKSBmYWlsZWQgJWQiLCBtUHJveHlGaWxlRGVzY3JpcHRvciwgZXJybm8pOworICAgICAgICBBTE9HRSgib3BlbigpIHByb3h5IG1tYXAoJWQpIGZhaWxlZCAlZCIsIG1Qcm94eUZpbGVEZXNjcmlwdG9yLCBlcnJubyk7CiAgICAgICAgIG11bm1hcChtT3JpZ2luYWxTaGFyZWRNZW1vcnksIG1TaGFyZWRNZW1vcnlTaXplSW5CeXRlcyk7CiAgICAgICAgIG1PcmlnaW5hbFNoYXJlZE1lbW9yeSA9IG51bGxwdHI7CiAgICAgICAgIGNsb3NlKG1Qcm94eUZpbGVEZXNjcmlwdG9yKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL1NoYXJlZFJpbmdCdWZmZXIuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvU2hhcmVkUmluZ0J1ZmZlci5jcHAKaW5kZXggODNiMjViMy4uMjQ1NDQ0NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvU2hhcmVkUmluZ0J1ZmZlci5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvU2hhcmVkUmluZ0J1ZmZlci5jcHAKQEAgLTE0LDcgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNkZWZpbmUgTE9HX1RBRyAiQUF1ZGlvU2VydmljZSIKKyNkZWZpbmUgTE9HX1RBRyAiU2hhcmVkUmluZ0J1ZmZlciIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIApAQCAtNDYsMTQgKzQ2LDE0IEBACiAgICAgbVNoYXJlZE1lbW9yeVNpemVJbkJ5dGVzID0gbURhdGFNZW1vcnlTaXplSW5CeXRlcyArICgyICogKHNpemVvZihmaWZvX2NvdW50ZXJfdCkpKTsKICAgICBtRmlsZURlc2NyaXB0b3IucmVzZXQoYXNobWVtX2NyZWF0ZV9yZWdpb24oIkFBdWRpb1NoYXJlZFJpbmdCdWZmZXIiLCBtU2hhcmVkTWVtb3J5U2l6ZUluQnl0ZXMpKTsKICAgICBpZiAobUZpbGVEZXNjcmlwdG9yLmdldCgpID09IC0xKSB7Ci0gICAgICAgIEFMT0dFKCJTaGFyZWRSaW5nQnVmZmVyOjphbGxvY2F0ZSgpIGFzaG1lbV9jcmVhdGVfcmVnaW9uKCkgZmFpbGVkICVkIiwgZXJybm8pOworICAgICAgICBBTE9HRSgiYWxsb2NhdGUoKSBhc2htZW1fY3JlYXRlX3JlZ2lvbigpIGZhaWxlZCAlZCIsIGVycm5vKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlRFUk5BTDsKICAgICB9Ci0gICAgQUxPR1YoIlNoYXJlZFJpbmdCdWZmZXI6OmFsbG9jYXRlKCkgbUZpbGVEZXNjcmlwdG9yID0gJWRcbiIsIG1GaWxlRGVzY3JpcHRvci5nZXQoKSk7CisgICAgQUxPR1YoImFsbG9jYXRlKCkgbUZpbGVEZXNjcmlwdG9yID0gJWRcbiIsIG1GaWxlRGVzY3JpcHRvci5nZXQoKSk7CiAKICAgICBpbnQgZXJyID0gYXNobWVtX3NldF9wcm90X3JlZ2lvbihtRmlsZURlc2NyaXB0b3IuZ2V0KCksIFBST1RfUkVBRHxQUk9UX1dSSVRFKTsgLy8gVE9ETyBlcnJvciBoYW5kbGluZz8KICAgICBpZiAoZXJyIDwgMCkgewotICAgICAgICBBTE9HRSgiU2hhcmVkUmluZ0J1ZmZlcjo6YWxsb2NhdGUoKSBhc2htZW1fc2V0X3Byb3RfcmVnaW9uKCkgZmFpbGVkICVkIiwgZXJybm8pOworICAgICAgICBBTE9HRSgiYWxsb2NhdGUoKSBhc2htZW1fc2V0X3Byb3RfcmVnaW9uKCkgZmFpbGVkICVkIiwgZXJybm8pOwogICAgICAgICBtRmlsZURlc2NyaXB0b3IucmVzZXQoKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlRFUk5BTDsgLy8gVE9ETyBjb252ZXJ0IGVycm5vIHRvIGEgYmV0dGVyIEFBVURJT19FUlJPUjsKICAgICB9CkBAIC02NCw3ICs2NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgTUFQX1NIQVJFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICBtRmlsZURlc2NyaXB0b3IuZ2V0KCksIDApOwogICAgIGlmIChtU2hhcmVkTWVtb3J5ID09IE1BUF9GQUlMRUQpIHsKLSAgICAgICAgQUxPR0UoIlNoYXJlZFJpbmdCdWZmZXI6OmFsbG9jYXRlKCkgbW1hcCgpIGZhaWxlZCAlZCIsIGVycm5vKTsKKyAgICAgICAgQUxPR0UoImFsbG9jYXRlKCkgbW1hcCgpIGZhaWxlZCAlZCIsIGVycm5vKTsKICAgICAgICAgbUZpbGVEZXNjcmlwdG9yLnJlc2V0KCk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5URVJOQUw7IC8vIFRPRE8gY29udmVydCBlcnJubyB0byBhIGJldHRlciBBQVVESU9fRVJST1I7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc291bmR0cmlnZ2VyL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvQW5kcm9pZC5tawppbmRleCAxMGVlMTQxLi5hZDM2NjZlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvQW5kcm9pZC5tawpAQCAtNDksMTEgKzQ5LDE2IEBACiBMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IFwKICAgICBsaWJod2JpbmRlciBcCiAgICAgbGliaGlkbGJhc2UgXAorICAgIGxpYmhpZGxtZW1vcnkgXAogICAgIGxpYmhpZGx0cmFuc3BvcnQgXAogICAgIGxpYmJhc2UgXAogICAgIGxpYmF1ZGlvaGFsIFwKKyAgICBsaWJhdWRpb2hhbF9kZWF0aGhhbmRsZXIgXAogICAgIGFuZHJvaWQuaGFyZHdhcmUuc291bmR0cmlnZ2VyQDIuMCBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25AMi4wCisgICAgYW5kcm9pZC5oYXJkd2FyZS5zb3VuZHRyaWdnZXJAMi4xIFwKKyAgICBhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkAyLjAgXAorICAgIGFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIFwKKyAgICBhbmRyb2lkLmhpZGwubWVtb3J5QDEuMAogZW5kaWYKIAogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSGlkbC5jcHAgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSGlkbC5jcHAKaW5kZXggMGNkNWNmNy4uYWRmMjUyZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbEhpZGwuY3BwCisrKyBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxIaWRsLmNwcApAQCAtMTcsMTcgKzE3LDg3IEBACiAjZGVmaW5lIExPR19UQUcgIlNvdW5kVHJpZ2dlckhhbEhpZGwiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKKyNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvYWxsb2NhdG9yLzEuMC9JQWxsb2NhdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvaGlkbC9IYWxEZWF0aEhhbmRsZXIuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlICJTb3VuZFRyaWdnZXJIYWxIaWRsLmgiCisjaW5jbHVkZSA8aGlkbG1lbW9yeS9tYXBwaW5nLmg+CiAjaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxod2JpbmRlci9Qcm9jZXNzU3RhdGUuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OlByb2Nlc3NTdGF0ZTsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb0RldmljZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlByb2Nlc3NTdGF0ZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlN0YXR1czsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb0RldmljZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwordXNpbmcgOjphbmRyb2lkOjpoaWRsOjphbGxvY2F0b3I6OlYxXzA6OklBbGxvY2F0b3I7Cit1c2luZyA6OmFuZHJvaWQ6OmhpZGw6Om1lbW9yeTo6VjFfMDo6SU1lbW9yeTsKKworbmFtZXNwYWNlIHsKKworLy8gQmFja3MgdXAgYnkgdGhlIHZlY3RvciB3aXRoIHRoZSBjb250ZW50cyBvZiBzaGFyZWQgbWVtb3J5LgorLy8gSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBwYXNzZWQgaGlkbF92ZWN0b3IgaXMgZW1wdHksIHNvIGl0J3MKKy8vIG5vdCBjbGVhcmVkIGlmIHRoZSBtZW1vcnkgaXMgYSBudWxsIG9iamVjdC4KKy8vIFRoZSBjYWxsZXIgbmVlZHMgdG8ga2VlcCB0aGUgcmV0dXJuZWQgc3A8SU1lbW9yeT4gYXMgbG9uZyBhcworLy8gdGhlIGRhdGEgaXMgbmVlZGVkLgorc3RkOjpwYWlyPGJvb2wsIHNwPElNZW1vcnk+PiBtZW1vcnlBc1ZlY3Rvcihjb25zdCBoaWRsX21lbW9yeSYgbSwgaGlkbF92ZWM8dWludDhfdD4qIHZlYykgeworICAgIHNwPElNZW1vcnk+IG1lbW9yeTsKKyAgICBpZiAobS5zaXplKCkgPT0gMCkgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIodHJ1ZSwgbWVtb3J5KTsKKyAgICB9CisgICAgbWVtb3J5ID0gbWFwTWVtb3J5KG0pOworICAgIGlmIChtZW1vcnkgIT0gbnVsbHB0cikgeworICAgICAgICBtZW1vcnktPnJlYWQoKTsKKyAgICAgICAgdmVjLT5zZXRUb0V4dGVybmFsKHN0YXRpY19jYXN0PHVpbnQ4X3QqPihzdGF0aWNfY2FzdDx2b2lkKj4obWVtb3J5LT5nZXRQb2ludGVyKCkpKSwKKyAgICAgICAgICAgICAgICBtZW1vcnktPmdldFNpemUoKSk7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcih0cnVlLCBtZW1vcnkpOworICAgIH0KKyAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBtYXAgSElETCBtZW1vcnkgdG8gSU1lbW9yeSIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoZmFsc2UsIG1lbW9yeSk7Cit9CisKKy8vIE1vdmVzIHRoZSBkYXRhIGZyb20gdGhlIHZlY3RvciBpbnRvIGFsbG9jYXRlZCBzaGFyZWQgbWVtb3J5LAorLy8gZW1wdHlpbmcgdGhlIHZlY3Rvci4KKy8vIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgcGFzc2VkIGhpZGxfbWVtb3J5IGlzIGEgbnVsbCBvYmplY3QsIHNvIGl0J3MKKy8vIG5vdCByZXNldCBpZiB0aGUgdmVjdG9yIGlzIGVtcHR5LgorLy8gVGhlIGNhbGxlciBuZWVkcyB0byBrZWVwIHRoZSByZXR1cm5lZCBzcDxJTWVtb3J5PiBhcyBsb25nIGFzCisvLyB0aGUgZGF0YSBpcyBuZWVkZWQuCitzdGQ6OnBhaXI8Ym9vbCwgc3A8SU1lbW9yeT4+IG1vdmVWZWN0b3JUb01lbW9yeShoaWRsX3ZlYzx1aW50OF90PiogdiwgaGlkbF9tZW1vcnkqIG1lbSkgeworICAgIHNwPElNZW1vcnk+IG1lbW9yeTsKKyAgICBpZiAodi0+c2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHRydWUsIG1lbW9yeSk7CisgICAgfQorICAgIHNwPElBbGxvY2F0b3I+IGFzaG1lbSA9IElBbGxvY2F0b3I6OmdldFNlcnZpY2UoImFzaG1lbSIpOworICAgIGlmIChhc2htZW0gPT0gMCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJldHJpZXZlIGFzaG1lbSBhbGxvY2F0b3Igc2VydmljZSIpOworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoZmFsc2UsIG1lbW9yeSk7CisgICAgfQorICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOworICAgIFJldHVybjx2b2lkPiByID0gYXNobWVtLT5hbGxvY2F0ZSh2LT5zaXplKCksIFsmXShib29sIHMsIGNvbnN0IGhpZGxfbWVtb3J5JiBtKSB7CisgICAgICAgIHN1Y2Nlc3MgPSBzOworICAgICAgICBpZiAoc3VjY2VzcykgKm1lbSA9IG07CisgICAgfSk7CisgICAgaWYgKHIuaXNPaygpICYmIHN1Y2Nlc3MpIHsKKyAgICAgICAgbWVtb3J5ID0gaGFyZHdhcmU6Om1hcE1lbW9yeSgqbWVtKTsKKyAgICAgICAgaWYgKG1lbW9yeSAhPSAwKSB7CisgICAgICAgICAgICBtZW1vcnktPnVwZGF0ZSgpOworICAgICAgICAgICAgbWVtY3B5KG1lbW9yeS0+Z2V0UG9pbnRlcigpLCB2LT5kYXRhKCksIHYtPnNpemUoKSk7CisgICAgICAgICAgICBtZW1vcnktPmNvbW1pdCgpOworICAgICAgICAgICAgdi0+cmVzaXplKDApOworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHRydWUsIG1lbW9yeSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG1hcCBhbGxvY2F0ZWQgYXNobWVtIik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGFsbG9jYXRlICVsbHUgYnl0ZXMgZnJvbSBhc2htZW0iLCAodW5zaWduZWQgbG9uZyBsb25nKXYtPnNpemUoKSk7CisgICAgfQorICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihmYWxzZSwgbWVtb3J5KTsKK30KKworfSAgLy8gbmFtZXNwYWNlCiAKIC8qIHN0YXRpYyAqLwogc3A8U291bmRUcmlnZ2VySGFsSW50ZXJmYWNlPiBTb3VuZFRyaWdnZXJIYWxJbnRlcmZhY2U6OmNvbm5lY3RNb2R1bGUoY29uc3QgY2hhciAqbW9kdWxlTmFtZSkKQEAgLTk0LDM2ICsxNjQsNjIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICJsb2FkU291bmRNb2RlbCgpOiB3cmFwIGFyb3VuZCBpbiBzb3VuZCBtb2RlbCBJRHMsIG51bSBsb2FkZWQgbW9kZWxzICV6ZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICBtU291bmRNb2RlbHMuc2l6ZSgpKTsKIAotICAgIElTb3VuZFRyaWdnZXJIdzo6U291bmRNb2RlbCAqaGFsU291bmRNb2RlbCA9Ci0gICAgICAgICAgICBjb252ZXJ0U291bmRNb2RlbFRvSGFsKHNvdW5kX21vZGVsKTsKLSAgICBpZiAoaGFsU291bmRNb2RlbCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQogICAgIFJldHVybjx2b2lkPiBoaWRsUmV0dXJuOwogICAgIGludCByZXQ7CiAgICAgU291bmRNb2RlbEhhbmRsZSBoYWxIYW5kbGU7Ci0gICAgewotICAgICAgICBBdXRvTXV0ZXggbG9jayhtSGFsTG9jayk7Ci0gICAgICAgIGlmIChzb3VuZF9tb2RlbC0+dHlwZSA9PSBTT1VORF9NT0RFTF9UWVBFX0tFWVBIUkFTRSkgeworICAgIHNwPFYyXzFfSVNvdW5kVHJpZ2dlckh3PiBzb3VuZHRyaWdnZXJfMl8xID0gdG9TZXJ2aWNlMl8xKHNvdW5kdHJpZ2dlcik7CisgICAgaWYgKHNvdW5kX21vZGVsLT50eXBlID09IFNPVU5EX01PREVMX1RZUEVfS0VZUEhSQVNFKSB7CisgICAgICAgIGlmICghc291bmR0cmlnZ2VyXzJfMSkgeworICAgICAgICAgICAgSVNvdW5kVHJpZ2dlckh3OjpQaHJhc2VTb3VuZE1vZGVsIGhhbFNvdW5kTW9kZWw7CisgICAgICAgICAgICBjb252ZXJ0UGhyYXNlU291bmRNb2RlbFRvSGFsKCZoYWxTb3VuZE1vZGVsLCBzb3VuZF9tb2RlbCk7CisgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhtSGFsTG9jayk7CiAgICAgICAgICAgICBoaWRsUmV0dXJuID0gc291bmR0cmlnZ2VyLT5sb2FkUGhyYXNlU291bmRNb2RlbCgKLSAgICAgICAgICAgICAgICAgICAgKihjb25zdCBJU291bmRUcmlnZ2VySHc6OlBocmFzZVNvdW5kTW9kZWwgKiloYWxTb3VuZE1vZGVsLAorICAgICAgICAgICAgICAgICAgICBoYWxTb3VuZE1vZGVsLAogICAgICAgICAgICAgICAgICAgICB0aGlzLCBtb2RlbElkLCBbJl0oaW50MzJfdCByZXR2YWwsIGF1dG8gcmVzKSB7Ci0gICAgICAgICAgICAgICAgcmV0ID0gcmV0dmFsOwotICAgICAgICAgICAgICAgIGhhbEhhbmRsZSA9IHJlczsKLSAgICAgICAgICAgIH0pOwotCisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSByZXR2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICBoYWxIYW5kbGUgPSByZXM7CisgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaGlkbFJldHVybiA9IHNvdW5kdHJpZ2dlci0+bG9hZFNvdW5kTW9kZWwoKmhhbFNvdW5kTW9kZWwsCisgICAgICAgICAgICBWMl8xX0lTb3VuZFRyaWdnZXJIdzo6UGhyYXNlU291bmRNb2RlbCBoYWxTb3VuZE1vZGVsOworICAgICAgICAgICAgYXV0byByZXN1bHQgPSBjb252ZXJ0UGhyYXNlU291bmRNb2RlbFRvSGFsKCZoYWxTb3VuZE1vZGVsLCBzb3VuZF9tb2RlbCk7CisgICAgICAgICAgICBpZiAocmVzdWx0LmZpcnN0KSB7CisgICAgICAgICAgICAgICAgQXV0b011dGV4IGxvY2sobUhhbExvY2spOworICAgICAgICAgICAgICAgIGhpZGxSZXR1cm4gPSBzb3VuZHRyaWdnZXJfMl8xLT5sb2FkUGhyYXNlU291bmRNb2RlbF8yXzEoCisgICAgICAgICAgICAgICAgICAgICAgICBoYWxTb3VuZE1vZGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgbW9kZWxJZCwgWyZdKGludDMyX3QgcmV0dmFsLCBhdXRvIHJlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHJldHZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxIYW5kbGUgPSByZXM7CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghc291bmR0cmlnZ2VyXzJfMSkgeworICAgICAgICAgICAgSVNvdW5kVHJpZ2dlckh3OjpTb3VuZE1vZGVsIGhhbFNvdW5kTW9kZWw7CisgICAgICAgICAgICBjb252ZXJ0U291bmRNb2RlbFRvSGFsKCZoYWxTb3VuZE1vZGVsLCBzb3VuZF9tb2RlbCk7CisgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhtSGFsTG9jayk7CisgICAgICAgICAgICBoaWRsUmV0dXJuID0gc291bmR0cmlnZ2VyLT5sb2FkU291bmRNb2RlbChoYWxTb3VuZE1vZGVsLAogICAgICAgICAgICAgICAgICAgICB0aGlzLCBtb2RlbElkLCBbJl0oaW50MzJfdCByZXR2YWwsIGF1dG8gcmVzKSB7Ci0gICAgICAgICAgICAgICAgcmV0ID0gcmV0dmFsOwotICAgICAgICAgICAgICAgIGhhbEhhbmRsZSA9IHJlczsKLSAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmV0dmFsOworICAgICAgICAgICAgICAgICAgICAgICAgaGFsSGFuZGxlID0gcmVzOworICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFYyXzFfSVNvdW5kVHJpZ2dlckh3OjpTb3VuZE1vZGVsIGhhbFNvdW5kTW9kZWw7CisgICAgICAgICAgICBhdXRvIHJlc3VsdCA9IGNvbnZlcnRTb3VuZE1vZGVsVG9IYWwoJmhhbFNvdW5kTW9kZWwsIHNvdW5kX21vZGVsKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQuZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhtSGFsTG9jayk7CisgICAgICAgICAgICAgICAgaGlkbFJldHVybiA9IHNvdW5kdHJpZ2dlcl8yXzEtPmxvYWRTb3VuZE1vZGVsXzJfMShoYWxTb3VuZE1vZGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgbW9kZWxJZCwgWyZdKGludDMyX3QgcmV0dmFsLCBhdXRvIHJlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHJldHZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxIYW5kbGUgPSByZXM7CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIGRlbGV0ZSBoYWxTb3VuZE1vZGVsOwotCiAgICAgaWYgKGhpZGxSZXR1cm4uaXNPaygpKSB7CiAgICAgICAgIGlmIChyZXQgPT0gMCkgewogICAgICAgICAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwpAQCAtMTg1LDE2ICsyODEsMjcgQEAKICAgICBtb2RlbC0+bVJlY29nbml0aW9uQ2FsbGJhY2sgPSBjYWxsYmFjazsKICAgICBtb2RlbC0+bVJlY29nbml0aW9uQ29va2llID0gY29va2llOwogCi0gICAgSVNvdW5kVHJpZ2dlckh3OjpSZWNvZ25pdGlvbkNvbmZpZyAqaGFsQ29uZmlnID0KLSAgICAgICAgICAgIGNvbnZlcnRSZWNvZ25pdGlvbkNvbmZpZ1RvSGFsKGNvbmZpZyk7Ci0KKyAgICBzcDxWMl8xX0lTb3VuZFRyaWdnZXJIdz4gc291bmR0cmlnZ2VyXzJfMSA9IHRvU2VydmljZTJfMShzb3VuZHRyaWdnZXIpOwogICAgIFJldHVybjxpbnQzMl90PiBoaWRsUmV0dXJuKDApOwotICAgIHsKLSAgICAgICAgQXV0b011dGV4IGxvY2sobUhhbExvY2spOwotICAgICAgICBoaWRsUmV0dXJuID0gc291bmR0cmlnZ2VyLT5zdGFydFJlY29nbml0aW9uKG1vZGVsLT5tSGFsSGFuZGxlLCAqaGFsQ29uZmlnLCB0aGlzLCBoYW5kbGUpOwotICAgIH0KIAotICAgIGRlbGV0ZSBoYWxDb25maWc7CisgICAgaWYgKCFzb3VuZHRyaWdnZXJfMl8xKSB7CisgICAgICAgIElTb3VuZFRyaWdnZXJIdzo6UmVjb2duaXRpb25Db25maWcgaGFsQ29uZmlnOworICAgICAgICBjb252ZXJ0UmVjb2duaXRpb25Db25maWdUb0hhbCgmaGFsQ29uZmlnLCBjb25maWcpOworICAgICAgICB7CisgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhtSGFsTG9jayk7CisgICAgICAgICAgICBoaWRsUmV0dXJuID0gc291bmR0cmlnZ2VyLT5zdGFydFJlY29nbml0aW9uKG1vZGVsLT5tSGFsSGFuZGxlLCBoYWxDb25maWcsIHRoaXMsIGhhbmRsZSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBWMl8xX0lTb3VuZFRyaWdnZXJIdzo6UmVjb2duaXRpb25Db25maWcgaGFsQ29uZmlnOworICAgICAgICBhdXRvIHJlc3VsdCA9IGNvbnZlcnRSZWNvZ25pdGlvbkNvbmZpZ1RvSGFsKCZoYWxDb25maWcsIGNvbmZpZyk7CisgICAgICAgIGlmIChyZXN1bHQuZmlyc3QpIHsKKyAgICAgICAgICAgIEF1dG9NdXRleCBsb2NrKG1IYWxMb2NrKTsKKyAgICAgICAgICAgIGhpZGxSZXR1cm4gPSBzb3VuZHRyaWdnZXJfMl8xLT5zdGFydFJlY29nbml0aW9uXzJfMSgKKyAgICAgICAgICAgICAgICAgICAgbW9kZWwtPm1IYWxIYW5kbGUsIGhhbENvbmZpZywgdGhpcywgaGFuZGxlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIH0KKyAgICB9CiAKICAgICBpZiAoIWhpZGxSZXR1cm4uaXNPaygpKSB7CiAgICAgICAgIEFMT0dFKCJzdGFydFJlY29nbml0aW9uIGVycm9yICVzIiwgaGlkbFJldHVybi5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwpAQCAtMjc1LDYgKzM4MiwxMiBAQAogICAgIHJldHVybiBtSVNvdW5kVHJpZ2dlcjsKIH0KIAorc3A8VjJfMV9JU291bmRUcmlnZ2VySHc+IFNvdW5kVHJpZ2dlckhhbEhpZGw6OnRvU2VydmljZTJfMShjb25zdCBzcDxJU291bmRUcmlnZ2VySHc+JiBzKQoreworICAgIGF1dG8gY2FzdFJlc3VsdF8yXzEgPSBWMl8xX0lTb3VuZFRyaWdnZXJIdzo6Y2FzdEZyb20ocyk7CisgICAgcmV0dXJuIGNhc3RSZXN1bHRfMl8xLmlzT2soKSA/IHN0YXRpY19jYXN0PHNwPFYyXzFfSVNvdW5kVHJpZ2dlckh3Pj4oY2FzdFJlc3VsdF8yXzEpIDogbnVsbHB0cjsKK30KKwogc3A8U291bmRUcmlnZ2VySGFsSGlkbDo6U291bmRNb2RlbD4gU291bmRUcmlnZ2VySGFsSGlkbDo6Z2V0TW9kZWwoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKQogewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKQEAgLTM0Nyw0MCArNDYwLDUyIEBACiAgICAgaGFsVHJpZ2dlclBocmFzZS0+dGV4dCA9IHRyaWdnZXJQaHJhc2UtPnRleHQ7CiB9CiAKLUlTb3VuZFRyaWdnZXJIdzo6U291bmRNb2RlbCAqU291bmRUcmlnZ2VySGFsSGlkbDo6Y29udmVydFNvdW5kTW9kZWxUb0hhbCgKKwordm9pZCBTb3VuZFRyaWdnZXJIYWxIaWRsOjpjb252ZXJ0VHJpZ2dlclBocmFzZXNUb0hhbCgKKyAgICAgICAgaGlkbF92ZWM8SVNvdW5kVHJpZ2dlckh3OjpQaHJhc2U+ICpoYWxUcmlnZ2VyUGhyYXNlcywKKyAgICAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfcGhyYXNlX3NvdW5kX21vZGVsICprZXlQaHJhc2VNb2RlbCkKK3sKKyAgICBoYWxUcmlnZ2VyUGhyYXNlcy0+cmVzaXplKGtleVBocmFzZU1vZGVsLT5udW1fcGhyYXNlcyk7CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBrZXlQaHJhc2VNb2RlbC0+bnVtX3BocmFzZXM7IGkrKykgeworICAgICAgICBjb252ZXJ0VHJpZ2dlclBocmFzZVRvSGFsKCYoKmhhbFRyaWdnZXJQaHJhc2VzKVtpXSwgJmtleVBocmFzZU1vZGVsLT5waHJhc2VzW2ldKTsKKyAgICB9Cit9CisKK3ZvaWQgU291bmRUcmlnZ2VySGFsSGlkbDo6Y29udmVydFNvdW5kTW9kZWxUb0hhbChJU291bmRUcmlnZ2VySHc6OlNvdW5kTW9kZWwgKmhhbE1vZGVsLAogICAgICAgICBjb25zdCBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9zb3VuZF9tb2RlbCAqc291bmRNb2RlbCkKIHsKLSAgICBJU291bmRUcmlnZ2VySHc6OlNvdW5kTW9kZWwgKmhhbE1vZGVsID0gTlVMTDsKLSAgICBpZiAoc291bmRNb2RlbC0+dHlwZSA9PSBTT1VORF9NT0RFTF9UWVBFX0tFWVBIUkFTRSkgewotICAgICAgICBJU291bmRUcmlnZ2VySHc6OlBocmFzZVNvdW5kTW9kZWwgKmhhbEtleVBocmFzZU1vZGVsID0KLSAgICAgICAgICAgICAgICBuZXcgSVNvdW5kVHJpZ2dlckh3OjpQaHJhc2VTb3VuZE1vZGVsKCk7Ci0gICAgICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX3BocmFzZV9zb3VuZF9tb2RlbCAqa2V5UGhyYXNlTW9kZWwgPQotICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9waHJhc2Vfc291bmRfbW9kZWwgKilzb3VuZE1vZGVsOwotICAgICAgICBJU291bmRUcmlnZ2VySHc6OlBocmFzZSAqaGFsUGhyYXNlcyA9Ci0gICAgICAgICAgICAgICAgbmV3IElTb3VuZFRyaWdnZXJIdzo6UGhyYXNlW2tleVBocmFzZU1vZGVsLT5udW1fcGhyYXNlc107Ci0KLQotICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGtleVBocmFzZU1vZGVsLT5udW1fcGhyYXNlczsgaSsrKSB7Ci0gICAgICAgICAgICBjb252ZXJ0VHJpZ2dlclBocmFzZVRvSGFsKCZoYWxQaHJhc2VzW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5UGhyYXNlTW9kZWwtPnBocmFzZXNbaV0pOwotICAgICAgICB9Ci0gICAgICAgIGhhbEtleVBocmFzZU1vZGVsLT5waHJhc2VzLnNldFRvRXh0ZXJuYWwoaGFsUGhyYXNlcywga2V5UGhyYXNlTW9kZWwtPm51bV9waHJhc2VzKTsKLSAgICAgICAgLy8gRklYTUU6IHRyYW5zZmVyIGJ1ZmZlciBvd25lcnNoaXAuIHNob3VsZCBoYXZlIGEgbWV0aG9kIGZvciB0aGF0IGluIGhpZGxfdmVjCi0gICAgICAgIGhhbEtleVBocmFzZU1vZGVsLT5waHJhc2VzLnJlc2l6ZShrZXlQaHJhc2VNb2RlbC0+bnVtX3BocmFzZXMpOwotCi0gICAgICAgIGRlbGV0ZVtdIGhhbFBocmFzZXM7Ci0KLSAgICAgICAgaGFsTW9kZWwgPSAoSVNvdW5kVHJpZ2dlckh3OjpTb3VuZE1vZGVsICopaGFsS2V5UGhyYXNlTW9kZWw7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaGFsTW9kZWwgPSBuZXcgSVNvdW5kVHJpZ2dlckh3OjpTb3VuZE1vZGVsKCk7Ci0gICAgfQogICAgIGhhbE1vZGVsLT50eXBlID0gKFNvdW5kTW9kZWxUeXBlKXNvdW5kTW9kZWwtPnR5cGU7CiAgICAgY29udmVydFV1aWRUb0hhbCgmaGFsTW9kZWwtPnV1aWQsICZzb3VuZE1vZGVsLT51dWlkKTsKICAgICBjb252ZXJ0VXVpZFRvSGFsKCZoYWxNb2RlbC0+dmVuZG9yVXVpZCwgJnNvdW5kTW9kZWwtPnZlbmRvcl91dWlkKTsKICAgICBoYWxNb2RlbC0+ZGF0YS5zZXRUb0V4dGVybmFsKCh1aW50OF90ICopc291bmRNb2RlbCArIHNvdW5kTW9kZWwtPmRhdGFfb2Zmc2V0LCBzb3VuZE1vZGVsLT5kYXRhX3NpemUpOwotICAgIGhhbE1vZGVsLT5kYXRhLnJlc2l6ZShzb3VuZE1vZGVsLT5kYXRhX3NpemUpOworfQogCi0gICAgcmV0dXJuIGhhbE1vZGVsOworc3RkOjpwYWlyPGJvb2wsIHNwPElNZW1vcnk+PiBTb3VuZFRyaWdnZXJIYWxIaWRsOjpjb252ZXJ0U291bmRNb2RlbFRvSGFsKAorICAgICAgICBWMl8xX0lTb3VuZFRyaWdnZXJIdzo6U291bmRNb2RlbCAqaGFsTW9kZWwsCisgICAgICAgIGNvbnN0IHN0cnVjdCBzb3VuZF90cmlnZ2VyX3NvdW5kX21vZGVsICpzb3VuZE1vZGVsKQoreworICAgIGNvbnZlcnRTb3VuZE1vZGVsVG9IYWwoJmhhbE1vZGVsLT5oZWFkZXIsIHNvdW5kTW9kZWwpOworICAgIHJldHVybiBtb3ZlVmVjdG9yVG9NZW1vcnkoJmhhbE1vZGVsLT5oZWFkZXIuZGF0YSwgJmhhbE1vZGVsLT5kYXRhKTsKK30KKwordm9pZCBTb3VuZFRyaWdnZXJIYWxIaWRsOjpjb252ZXJ0UGhyYXNlU291bmRNb2RlbFRvSGFsKAorICAgICAgICBJU291bmRUcmlnZ2VySHc6OlBocmFzZVNvdW5kTW9kZWwgKmhhbEtleVBocmFzZU1vZGVsLAorICAgICAgICBjb25zdCBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9zb3VuZF9tb2RlbCAqc291bmRNb2RlbCkKK3sKKyAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9waHJhc2Vfc291bmRfbW9kZWwgKmtleVBocmFzZU1vZGVsID0KKyAgICAgICAgICAgIChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9waHJhc2Vfc291bmRfbW9kZWwgKilzb3VuZE1vZGVsOworICAgIGNvbnZlcnRUcmlnZ2VyUGhyYXNlc1RvSGFsKCZoYWxLZXlQaHJhc2VNb2RlbC0+cGhyYXNlcywga2V5UGhyYXNlTW9kZWwpOworICAgIGNvbnZlcnRTb3VuZE1vZGVsVG9IYWwoJmhhbEtleVBocmFzZU1vZGVsLT5jb21tb24sIHNvdW5kTW9kZWwpOworfQorCitzdGQ6OnBhaXI8Ym9vbCwgc3A8SU1lbW9yeT4+IFNvdW5kVHJpZ2dlckhhbEhpZGw6OmNvbnZlcnRQaHJhc2VTb3VuZE1vZGVsVG9IYWwoCisgICAgICAgIFYyXzFfSVNvdW5kVHJpZ2dlckh3OjpQaHJhc2VTb3VuZE1vZGVsICpoYWxLZXlQaHJhc2VNb2RlbCwKKyAgICAgICAgY29uc3Qgc3RydWN0IHNvdW5kX3RyaWdnZXJfc291bmRfbW9kZWwgKnNvdW5kTW9kZWwpCit7CisgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfcGhyYXNlX3NvdW5kX21vZGVsICprZXlQaHJhc2VNb2RlbCA9CisgICAgICAgICAgICAoc3RydWN0IHNvdW5kX3RyaWdnZXJfcGhyYXNlX3NvdW5kX21vZGVsICopc291bmRNb2RlbDsKKyAgICBjb252ZXJ0VHJpZ2dlclBocmFzZXNUb0hhbCgmaGFsS2V5UGhyYXNlTW9kZWwtPnBocmFzZXMsIGtleVBocmFzZU1vZGVsKTsKKyAgICByZXR1cm4gY29udmVydFNvdW5kTW9kZWxUb0hhbCgmaGFsS2V5UGhyYXNlTW9kZWwtPmNvbW1vbiwgc291bmRNb2RlbCk7CiB9CiAKIHZvaWQgU291bmRUcmlnZ2VySGFsSGlkbDo6Y29udmVydFBocmFzZVJlY29nbml0aW9uRXh0cmFUb0hhbCgKQEAgLTM5MCw1MiArNTE1LDQyIEBACiAgICAgaGFsRXh0cmEtPmlkID0gZXh0cmEtPmlkOwogICAgIGhhbEV4dHJhLT5yZWNvZ25pdGlvbk1vZGVzID0gZXh0cmEtPnJlY29nbml0aW9uX21vZGVzOwogICAgIGhhbEV4dHJhLT5jb25maWRlbmNlTGV2ZWwgPSBleHRyYS0+Y29uZmlkZW5jZV9sZXZlbDsKLSAgICBDb25maWRlbmNlTGV2ZWwgKmhhbExldmVscyA9Ci0gICAgICAgICAgICBuZXcgQ29uZmlkZW5jZUxldmVsW2V4dHJhLT5udW1fbGV2ZWxzXTsKLSAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGV4dHJhLT5udW1fbGV2ZWxzOyBpKyspIHsKLSAgICAgICAgaGFsTGV2ZWxzW2ldLnVzZXJJZCA9IGV4dHJhLT5sZXZlbHNbaV0udXNlcl9pZDsKLSAgICAgICAgaGFsTGV2ZWxzW2ldLmxldmVsUGVyY2VudCA9IGV4dHJhLT5sZXZlbHNbaV0ubGV2ZWw7Ci0gICAgfQotICAgIGhhbEV4dHJhLT5sZXZlbHMuc2V0VG9FeHRlcm5hbChoYWxMZXZlbHMsIGV4dHJhLT5udW1fbGV2ZWxzKTsKLSAgICAvLyBGSVhNRTogdHJhbnNmZXIgYnVmZmVyIG93bmVyc2hpcC4gc2hvdWxkIGhhdmUgYSBtZXRob2QgZm9yIHRoYXQgaW4gaGlkbF92ZWMKICAgICBoYWxFeHRyYS0+bGV2ZWxzLnJlc2l6ZShleHRyYS0+bnVtX2xldmVscyk7Ci0KLSAgICBkZWxldGVbXSBoYWxMZXZlbHM7CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBleHRyYS0+bnVtX2xldmVsczsgaSsrKSB7CisgICAgICAgIGhhbEV4dHJhLT5sZXZlbHNbaV0udXNlcklkID0gZXh0cmEtPmxldmVsc1tpXS51c2VyX2lkOworICAgICAgICBoYWxFeHRyYS0+bGV2ZWxzW2ldLmxldmVsUGVyY2VudCA9IGV4dHJhLT5sZXZlbHNbaV0ubGV2ZWw7CisgICAgfQogfQogCi0KLUlTb3VuZFRyaWdnZXJIdzo6UmVjb2duaXRpb25Db25maWcgKlNvdW5kVHJpZ2dlckhhbEhpZGw6OmNvbnZlcnRSZWNvZ25pdGlvbkNvbmZpZ1RvSGFsKAordm9pZCBTb3VuZFRyaWdnZXJIYWxIaWRsOjpjb252ZXJ0UmVjb2duaXRpb25Db25maWdUb0hhbCgKKyAgICAgICAgSVNvdW5kVHJpZ2dlckh3OjpSZWNvZ25pdGlvbkNvbmZpZyAqaGFsQ29uZmlnLAogICAgICAgICBjb25zdCBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9jb25maWcgKmNvbmZpZykKIHsKLSAgICBJU291bmRUcmlnZ2VySHc6OlJlY29nbml0aW9uQ29uZmlnICpoYWxDb25maWcgPQotICAgICAgICAgICAgbmV3IElTb3VuZFRyaWdnZXJIdzo6UmVjb2duaXRpb25Db25maWcoKTsKLQogICAgIGhhbENvbmZpZy0+Y2FwdHVyZUhhbmRsZSA9IGNvbmZpZy0+Y2FwdHVyZV9oYW5kbGU7CiAgICAgaGFsQ29uZmlnLT5jYXB0dXJlRGV2aWNlID0gKEF1ZGlvRGV2aWNlKWNvbmZpZy0+Y2FwdHVyZV9kZXZpY2U7CiAgICAgaGFsQ29uZmlnLT5jYXB0dXJlUmVxdWVzdGVkID0gKHVpbnQzMl90KWNvbmZpZy0+Y2FwdHVyZV9yZXF1ZXN0ZWQ7CiAKLSAgICBQaHJhc2VSZWNvZ25pdGlvbkV4dHJhICpoYWxFeHRyYXMgPQotICAgICAgICAgICAgbmV3IFBocmFzZVJlY29nbml0aW9uRXh0cmFbY29uZmlnLT5udW1fcGhyYXNlc107Ci0KKyAgICBoYWxDb25maWctPnBocmFzZXMucmVzaXplKGNvbmZpZy0+bnVtX3BocmFzZXMpOwogICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgY29uZmlnLT5udW1fcGhyYXNlczsgaSsrKSB7Ci0gICAgICAgIGNvbnZlcnRQaHJhc2VSZWNvZ25pdGlvbkV4dHJhVG9IYWwoJmhhbEV4dHJhc1tpXSwKKyAgICAgICAgY29udmVydFBocmFzZVJlY29nbml0aW9uRXh0cmFUb0hhbCgmaGFsQ29uZmlnLT5waHJhc2VzW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWctPnBocmFzZXNbaV0pOwogICAgIH0KLSAgICBoYWxDb25maWctPnBocmFzZXMuc2V0VG9FeHRlcm5hbChoYWxFeHRyYXMsIGNvbmZpZy0+bnVtX3BocmFzZXMpOwotICAgIC8vIEZJWE1FOiB0cmFuc2ZlciBidWZmZXIgb3duZXJzaGlwLiBzaG91bGQgaGF2ZSBhIG1ldGhvZCBmb3IgdGhhdCBpbiBoaWRsX3ZlYwotICAgIGhhbENvbmZpZy0+cGhyYXNlcy5yZXNpemUoY29uZmlnLT5udW1fcGhyYXNlcyk7Ci0KLSAgICBkZWxldGVbXSBoYWxFeHRyYXM7CiAKICAgICBoYWxDb25maWctPmRhdGEuc2V0VG9FeHRlcm5hbCgodWludDhfdCAqKWNvbmZpZyArIGNvbmZpZy0+ZGF0YV9vZmZzZXQsIGNvbmZpZy0+ZGF0YV9zaXplKTsKK30KIAotICAgIHJldHVybiBoYWxDb25maWc7CitzdGQ6OnBhaXI8Ym9vbCwgc3A8SU1lbW9yeT4+IFNvdW5kVHJpZ2dlckhhbEhpZGw6OmNvbnZlcnRSZWNvZ25pdGlvbkNvbmZpZ1RvSGFsKAorICAgICAgICBWMl8xX0lTb3VuZFRyaWdnZXJIdzo6UmVjb2duaXRpb25Db25maWcgKmhhbENvbmZpZywKKyAgICAgICAgY29uc3Qgc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fY29uZmlnICpjb25maWcpCit7CisgICAgY29udmVydFJlY29nbml0aW9uQ29uZmlnVG9IYWwoJmhhbENvbmZpZy0+aGVhZGVyLCBjb25maWcpOworICAgIHJldHVybiBtb3ZlVmVjdG9yVG9NZW1vcnkoJmhhbENvbmZpZy0+aGVhZGVyLmRhdGEsICZoYWxDb25maWctPmRhdGEpOwogfQogCiAKIC8vIElTb3VuZFRyaWdnZXJId0NhbGxiYWNrCiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4gU291bmRUcmlnZ2VySGFsSGlkbDo6cmVjb2duaXRpb25DYWxsYmFjaygKLSAgICAgICAgY29uc3QgSVNvdW5kVHJpZ2dlckh3Q2FsbGJhY2s6OlJlY29nbml0aW9uRXZlbnQmIGhhbEV2ZW50LAorICAgICAgICBjb25zdCBWMl8wX0lTb3VuZFRyaWdnZXJId0NhbGxiYWNrOjpSZWNvZ25pdGlvbkV2ZW50JiBoYWxFdmVudCwKICAgICAgICAgQ2FsbGJhY2tDb29raWUgY29va2llKQogewogICAgIHNwPFNvdW5kTW9kZWw+IG1vZGVsOwpAQCAtNDU5LDcgKzU3NCw3IEBACiB9CiAKIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPiBTb3VuZFRyaWdnZXJIYWxIaWRsOjpwaHJhc2VSZWNvZ25pdGlvbkNhbGxiYWNrKAotICAgICAgICBjb25zdCBJU291bmRUcmlnZ2VySHdDYWxsYmFjazo6UGhyYXNlUmVjb2duaXRpb25FdmVudCYgaGFsRXZlbnQsCisgICAgICAgIGNvbnN0IFYyXzBfSVNvdW5kVHJpZ2dlckh3Q2FsbGJhY2s6OlBocmFzZVJlY29nbml0aW9uRXZlbnQmIGhhbEV2ZW50LAogICAgICAgICBDYWxsYmFja0Nvb2tpZSBjb29raWUpCiB7CiAgICAgc3A8U291bmRNb2RlbD4gbW9kZWw7CkBAIC00NzEsMTQgKzU4NiwxMyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fZXZlbnQgKmV2ZW50ID0gY29udmVydFJlY29nbml0aW9uRXZlbnRGcm9tSGFsKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgSVNvdW5kVHJpZ2dlckh3Q2FsbGJhY2s6OlJlY29nbml0aW9uRXZlbnQgKikmaGFsRXZlbnQpOworICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX3BocmFzZV9yZWNvZ25pdGlvbl9ldmVudCAqZXZlbnQgPQorICAgICAgICAgICAgY29udmVydFBocmFzZVJlY29nbml0aW9uRXZlbnRGcm9tSGFsKCZoYWxFdmVudCk7CiAgICAgaWYgKGV2ZW50ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIFJldHVybjx2b2lkPigpOwogICAgIH0KLQotICAgIGV2ZW50LT5tb2RlbCA9IG1vZGVsLT5tSGFuZGxlOwotICAgIG1vZGVsLT5tUmVjb2duaXRpb25DYWxsYmFjayhldmVudCwgbW9kZWwtPm1SZWNvZ25pdGlvbkNvb2tpZSk7CisgICAgZXZlbnQtPmNvbW1vbi5tb2RlbCA9IG1vZGVsLT5tSGFuZGxlOworICAgIG1vZGVsLT5tUmVjb2duaXRpb25DYWxsYmFjaygmZXZlbnQtPmNvbW1vbiwgbW9kZWwtPm1SZWNvZ25pdGlvbkNvb2tpZSk7CiAKICAgICBmcmVlKGV2ZW50KTsKIApAQCAtNDg2LDcgKzYwMCw3IEBACiB9CiAKIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPiBTb3VuZFRyaWdnZXJIYWxIaWRsOjpzb3VuZE1vZGVsQ2FsbGJhY2soCi0gICAgICAgIGNvbnN0IElTb3VuZFRyaWdnZXJId0NhbGxiYWNrOjpNb2RlbEV2ZW50JiBoYWxFdmVudCwKKyAgICAgICAgY29uc3QgVjJfMF9JU291bmRUcmlnZ2VySHdDYWxsYmFjazo6TW9kZWxFdmVudCYgaGFsRXZlbnQsCiAgICAgICAgIENhbGxiYWNrQ29va2llIGNvb2tpZSkKIHsKICAgICBzcDxTb3VuZE1vZGVsPiBtb2RlbDsKQEAgLTUxMSw5ICs2MjUsMzcgQEAKICAgICByZXR1cm4gUmV0dXJuPHZvaWQ+KCk7CiB9CiAKKzo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPiBTb3VuZFRyaWdnZXJIYWxIaWRsOjpyZWNvZ25pdGlvbkNhbGxiYWNrXzJfMSgKKyAgICAgICAgY29uc3QgSVNvdW5kVHJpZ2dlckh3Q2FsbGJhY2s6OlJlY29nbml0aW9uRXZlbnQmIGV2ZW50LCBDYWxsYmFja0Nvb2tpZSBjb29raWUpIHsKKyAgICAvLyBUaGUgZGF0YSB2ZWN0b3IgaW4gdGhlICdoZWFkZXInIHBhcnQgb2YgVjIuMSBzdHJ1Y3R1cmUgaXMgZW1wdHksIHRodXMgY29weWluZyBpcyBjaGVhcC4KKyAgICBWMl8wX0lTb3VuZFRyaWdnZXJId0NhbGxiYWNrOjpSZWNvZ25pdGlvbkV2ZW50IGV2ZW50XzJfMCA9IGV2ZW50LmhlYWRlcjsKKyAgICBhdXRvIHJlc3VsdCA9IG1lbW9yeUFzVmVjdG9yKGV2ZW50LmRhdGEsICZldmVudF8yXzAuZGF0YSk7CisgICAgcmV0dXJuIHJlc3VsdC5maXJzdCA/IHJlY29nbml0aW9uQ2FsbGJhY2soZXZlbnRfMl8wLCBjb29raWUpIDogVm9pZCgpOworfQorCis6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4gU291bmRUcmlnZ2VySGFsSGlkbDo6cGhyYXNlUmVjb2duaXRpb25DYWxsYmFja18yXzEoCisgICAgICAgIGNvbnN0IElTb3VuZFRyaWdnZXJId0NhbGxiYWNrOjpQaHJhc2VSZWNvZ25pdGlvbkV2ZW50JiBldmVudCwgaW50MzJfdCBjb29raWUpIHsKKyAgICBWMl8wX0lTb3VuZFRyaWdnZXJId0NhbGxiYWNrOjpQaHJhc2VSZWNvZ25pdGlvbkV2ZW50IGV2ZW50XzJfMDsKKyAgICAvLyBUaGUgZGF0YSB2ZWN0b3IgaW4gdGhlICdoZWFkZXInIHBhcnQgb2YgVjIuMSBzdHJ1Y3R1cmUgaXMgZW1wdHksIHRodXMgY29weWluZyBpcyBjaGVhcC4KKyAgICBldmVudF8yXzAuY29tbW9uID0gZXZlbnQuY29tbW9uLmhlYWRlcjsKKyAgICBldmVudF8yXzAucGhyYXNlRXh0cmFzLnNldFRvRXh0ZXJuYWwoCisgICAgICAgICAgICBjb25zdF9jYXN0PFBocmFzZVJlY29nbml0aW9uRXh0cmEqPihldmVudC5waHJhc2VFeHRyYXMuZGF0YSgpKSwKKyAgICAgICAgICAgIGV2ZW50LnBocmFzZUV4dHJhcy5zaXplKCkpOworICAgIGF1dG8gcmVzdWx0ID0gbWVtb3J5QXNWZWN0b3IoZXZlbnQuY29tbW9uLmRhdGEsICZldmVudF8yXzAuY29tbW9uLmRhdGEpOworICAgIHJldHVybiByZXN1bHQuZmlyc3QgPyBwaHJhc2VSZWNvZ25pdGlvbkNhbGxiYWNrKGV2ZW50XzJfMCwgY29va2llKSA6IFZvaWQoKTsKK30KKworOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IFNvdW5kVHJpZ2dlckhhbEhpZGw6OnNvdW5kTW9kZWxDYWxsYmFja18yXzEoCisgICAgICAgIGNvbnN0IElTb3VuZFRyaWdnZXJId0NhbGxiYWNrOjpNb2RlbEV2ZW50JiBldmVudCwgQ2FsbGJhY2tDb29raWUgY29va2llKSB7CisgICAgLy8gVGhlIGRhdGEgdmVjdG9yIGluIHRoZSAnaGVhZGVyJyBwYXJ0IG9mIFYyLjEgc3RydWN0dXJlIGlzIGVtcHR5LCB0aHVzIGNvcHlpbmcgaXMgY2hlYXAuCisgICAgVjJfMF9JU291bmRUcmlnZ2VySHdDYWxsYmFjazo6TW9kZWxFdmVudCBldmVudF8yXzAgPSBldmVudC5oZWFkZXI7CisgICAgYXV0byByZXN1bHQgPSBtZW1vcnlBc1ZlY3RvcihldmVudC5kYXRhLCAmZXZlbnRfMl8wLmRhdGEpOworICAgIHJldHVybiByZXN1bHQuZmlyc3QgPyBzb3VuZE1vZGVsQ2FsbGJhY2soZXZlbnRfMl8wLCBjb29raWUpIDogVm9pZCgpOworfQorCiAKIHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZGVsX2V2ZW50ICpTb3VuZFRyaWdnZXJIYWxIaWRsOjpjb252ZXJ0U291bmRNb2RlbEV2ZW50RnJvbUhhbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJU291bmRUcmlnZ2VySHdDYWxsYmFjazo6TW9kZWxFdmVudCAqaGFsRXZlbnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVjJfMF9JU291bmRUcmlnZ2VySHdDYWxsYmFjazo6TW9kZWxFdmVudCAqaGFsRXZlbnQpCiB7CiAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kZWxfZXZlbnQgKmV2ZW50ID0gKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZGVsX2V2ZW50ICopbWFsbG9jKAogICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZGVsX2V2ZW50KSArCkBAIC01NTAsMzcgKzY5Miw1NSBAQAogfQogCiAKLXN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2V2ZW50ICpTb3VuZFRyaWdnZXJIYWxIaWRsOjpjb252ZXJ0UmVjb2duaXRpb25FdmVudEZyb21IYWwoCi0gICAgICAgIGNvbnN0IElTb3VuZFRyaWdnZXJId0NhbGxiYWNrOjpSZWNvZ25pdGlvbkV2ZW50ICpoYWxFdmVudCkKK3N0cnVjdCBzb3VuZF90cmlnZ2VyX3BocmFzZV9yZWNvZ25pdGlvbl9ldmVudCogU291bmRUcmlnZ2VySGFsSGlkbDo6Y29udmVydFBocmFzZVJlY29nbml0aW9uRXZlbnRGcm9tSGFsKAorICAgICAgICBjb25zdCBWMl8wX0lTb3VuZFRyaWdnZXJId0NhbGxiYWNrOjpQaHJhc2VSZWNvZ25pdGlvbkV2ZW50ICpoYWxQaHJhc2VFdmVudCkKIHsKLSAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9ldmVudCAqZXZlbnQ7Ci0KLSAgICBpZiAoaGFsRXZlbnQtPnR5cGUgPT0gU291bmRNb2RlbFR5cGU6OktFWVBIUkFTRSkgewotICAgICAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9waHJhc2VfcmVjb2duaXRpb25fZXZlbnQgKnBocmFzZUV2ZW50ID0KLSAgICAgICAgICAgICAgICAoc3RydWN0IHNvdW5kX3RyaWdnZXJfcGhyYXNlX3JlY29nbml0aW9uX2V2ZW50ICopbWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3BocmFzZV9yZWNvZ25pdGlvbl9ldmVudCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgaGFsRXZlbnQtPmRhdGEuc2l6ZSgpKTsKLSAgICAgICAgaWYgKHBocmFzZUV2ZW50ID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IElTb3VuZFRyaWdnZXJId0NhbGxiYWNrOjpQaHJhc2VSZWNvZ25pdGlvbkV2ZW50ICpoYWxQaHJhc2VFdmVudCA9Ci0gICAgICAgICAgICAgICAgKGNvbnN0IElTb3VuZFRyaWdnZXJId0NhbGxiYWNrOjpQaHJhc2VSZWNvZ25pdGlvbkV2ZW50ICopaGFsRXZlbnQ7Ci0KLSAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBoYWxQaHJhc2VFdmVudC0+cGhyYXNlRXh0cmFzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBjb252ZXJ0UGhyYXNlUmVjb2duaXRpb25FeHRyYUZyb21IYWwoJnBocmFzZUV2ZW50LT5waHJhc2VfZXh0cmFzW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoYWxQaHJhc2VFdmVudC0+cGhyYXNlRXh0cmFzW2ldKTsKLSAgICAgICAgfQotICAgICAgICBwaHJhc2VFdmVudC0+bnVtX3BocmFzZXMgPSBoYWxQaHJhc2VFdmVudC0+cGhyYXNlRXh0cmFzLnNpemUoKTsKLSAgICAgICAgZXZlbnQgPSAoc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fZXZlbnQgKilwaHJhc2VFdmVudDsKLSAgICAgICAgZXZlbnQtPmRhdGFfb2Zmc2V0ID0gc2l6ZW9mKHNvdW5kX3RyaWdnZXJfcGhyYXNlX3JlY29nbml0aW9uX2V2ZW50KTsKLSAgICB9IGVsc2UgewotICAgICAgICBldmVudCA9IChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9ldmVudCAqKW1hbGxvYygKLSAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fZXZlbnQpICsgaGFsRXZlbnQtPmRhdGEuc2l6ZSgpKTsKLSAgICAgICAgaWYgKGV2ZW50ID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGV2ZW50LT5kYXRhX29mZnNldCA9IHNpemVvZihzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2V2ZW50KTsKKyAgICBpZiAoaGFsUGhyYXNlRXZlbnQtPmNvbW1vbi50eXBlICE9IFNvdW5kTW9kZWxUeXBlOjpLRVlQSFJBU0UpIHsKKyAgICAgICAgQUxPR0UoIlJlY2VpdmVkIG5vbi1rZXlwaHJhc2UgZXZlbnQgdHlwZSBhcyBQaHJhc2VSZWNvZ25pdGlvbkV2ZW50Iik7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KKyAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9waHJhc2VfcmVjb2duaXRpb25fZXZlbnQgKnBocmFzZUV2ZW50ID0KKyAgICAgICAgICAgIChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9waHJhc2VfcmVjb2duaXRpb25fZXZlbnQgKiltYWxsb2MoCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9waHJhc2VfcmVjb2duaXRpb25fZXZlbnQpICsKKyAgICAgICAgICAgICAgICAgICAgaGFsUGhyYXNlRXZlbnQtPmNvbW1vbi5kYXRhLnNpemUoKSk7CisgICAgaWYgKHBocmFzZUV2ZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHBocmFzZUV2ZW50LT5jb21tb24uZGF0YV9vZmZzZXQgPSBzaXplb2Yoc291bmRfdHJpZ2dlcl9waHJhc2VfcmVjb2duaXRpb25fZXZlbnQpOworCisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBoYWxQaHJhc2VFdmVudC0+cGhyYXNlRXh0cmFzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnZlcnRQaHJhc2VSZWNvZ25pdGlvbkV4dHJhRnJvbUhhbCgmcGhyYXNlRXZlbnQtPnBocmFzZV9leHRyYXNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFsUGhyYXNlRXZlbnQtPnBocmFzZUV4dHJhc1tpXSk7CisgICAgfQorICAgIHBocmFzZUV2ZW50LT5udW1fcGhyYXNlcyA9IGhhbFBocmFzZUV2ZW50LT5waHJhc2VFeHRyYXMuc2l6ZSgpOworCisgICAgZmlsbFJlY29nbml0aW9uRXZlbnRGcm9tSGFsKCZwaHJhc2VFdmVudC0+Y29tbW9uLCAmaGFsUGhyYXNlRXZlbnQtPmNvbW1vbik7CisgICAgcmV0dXJuIHBocmFzZUV2ZW50OworfQorCitzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9ldmVudCAqU291bmRUcmlnZ2VySGFsSGlkbDo6Y29udmVydFJlY29nbml0aW9uRXZlbnRGcm9tSGFsKAorICAgICAgICBjb25zdCBWMl8wX0lTb3VuZFRyaWdnZXJId0NhbGxiYWNrOjpSZWNvZ25pdGlvbkV2ZW50ICpoYWxFdmVudCkKK3sKKyAgICBpZiAoaGFsRXZlbnQtPnR5cGUgPT0gU291bmRNb2RlbFR5cGU6OktFWVBIUkFTRSkgeworICAgICAgICBBTE9HRSgiUmVjZWl2ZWQga2V5cGhyYXNlIGV2ZW50IHR5cGUgYXMgUmVjb2duaXRpb25FdmVudCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fZXZlbnQgKmV2ZW50OworICAgIGV2ZW50ID0gKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2V2ZW50ICopbWFsbG9jKAorICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2V2ZW50KSArIGhhbEV2ZW50LT5kYXRhLnNpemUoKSk7CisgICAgaWYgKGV2ZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGV2ZW50LT5kYXRhX29mZnNldCA9IHNpemVvZihzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2V2ZW50KTsKKworICAgIGZpbGxSZWNvZ25pdGlvbkV2ZW50RnJvbUhhbChldmVudCwgaGFsRXZlbnQpOworICAgIHJldHVybiBldmVudDsKK30KKwordm9pZCBTb3VuZFRyaWdnZXJIYWxIaWRsOjpmaWxsUmVjb2duaXRpb25FdmVudEZyb21IYWwoCisgICAgICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2V2ZW50ICpldmVudCwKKyAgICAgICAgY29uc3QgVjJfMF9JU291bmRUcmlnZ2VySHdDYWxsYmFjazo6UmVjb2duaXRpb25FdmVudCAqaGFsRXZlbnQpCit7CiAgICAgZXZlbnQtPnN0YXR1cyA9IChpbnQpaGFsRXZlbnQtPnN0YXR1czsKICAgICBldmVudC0+dHlwZSA9IChzb3VuZF90cmlnZ2VyX3NvdW5kX21vZGVsX3R5cGVfdCloYWxFdmVudC0+dHlwZTsKICAgICAvLyBldmVudC0+bW9kZWwgdG8gYmUgc2V0IGJ5IGNhbGxlcgpAQCAtNTk3LDggKzc1Nyw2IEBACiAgICAgdWludDhfdCAqZHN0ID0gKHVpbnQ4X3QgKilldmVudCArIGV2ZW50LT5kYXRhX29mZnNldDsKICAgICB1aW50OF90ICpzcmMgPSAodWludDhfdCAqKSZoYWxFdmVudC0+ZGF0YVswXTsKICAgICBtZW1jcHkoZHN0LCBzcmMsIGhhbEV2ZW50LT5kYXRhLnNpemUoKSk7Ci0KLSAgICByZXR1cm4gZXZlbnQ7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxIaWRsLmggYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSGlkbC5oCmluZGV4IDBjNjhjZjEuLjBiNDRhZTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxIaWRsLmgKKysrIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbEhpZGwuaApAQCAtMTcsNiArMTcsOCBAQAogI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NPVU5EVFJJR0dFUl9IQUxfSElETF9ICiAjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU09VTkRUUklHR0VSX0hBTF9ISURMX0gKIAorI2luY2x1ZGUgPHV0aWxpdHk+CisKICNpbmNsdWRlIDxzdGRhdG9taWMuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KQEAgLTI0LDIxICsyNiwyOSBAQAogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KICNpbmNsdWRlICJTb3VuZFRyaWdnZXJIYWxJbnRlcmZhY2UuaCIKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3NvdW5kdHJpZ2dlci8yLjAvdHlwZXMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3NvdW5kdHJpZ2dlci8yLjAvSVNvdW5kVHJpZ2dlckh3Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9zb3VuZHRyaWdnZXIvMi4xL0lTb3VuZFRyaWdnZXJIdy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvc291bmR0cmlnZ2VyLzIuMC9JU291bmRUcmlnZ2VySHdDYWxsYmFjay5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvc291bmR0cmlnZ2VyLzIuMS9JU291bmRUcmlnZ2VySHdDYWxsYmFjay5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpVdWlkOwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OnNvdW5kdHJpZ2dlcjo6VjJfMDo6Q29uZmlkZW5jZUxldmVsOwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OnNvdW5kdHJpZ2dlcjo6VjJfMDo6UGhyYXNlUmVjb2duaXRpb25FeHRyYTsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpzb3VuZHRyaWdnZXI6OlYyXzA6OlNvdW5kTW9kZWxUeXBlOwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OnNvdW5kdHJpZ2dlcjo6VjJfMDo6U291bmRNb2RlbEhhbmRsZTsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpzb3VuZHRyaWdnZXI6OlYyXzA6OklTb3VuZFRyaWdnZXJIdzsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpzb3VuZHRyaWdnZXI6OlYyXzA6OklTb3VuZFRyaWdnZXJId0NhbGxiYWNrOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6VXVpZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6c291bmR0cmlnZ2VyOjpWMl8wOjpDb25maWRlbmNlTGV2ZWw7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpzb3VuZHRyaWdnZXI6OlYyXzA6OlBocmFzZVJlY29nbml0aW9uRXh0cmE7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpzb3VuZHRyaWdnZXI6OlYyXzA6OlNvdW5kTW9kZWxUeXBlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6c291bmR0cmlnZ2VyOjpWMl8wOjpTb3VuZE1vZGVsSGFuZGxlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6c291bmR0cmlnZ2VyOjpWMl8wOjpJU291bmRUcmlnZ2VySHc7Cit1c2luZyBWMl8wX0lTb3VuZFRyaWdnZXJId0NhbGxiYWNrID0KKyAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6c291bmR0cmlnZ2VyOjpWMl8wOjpJU291bmRUcmlnZ2VySHdDYWxsYmFjazsKK3VzaW5nIFYyXzFfSVNvdW5kVHJpZ2dlckh3ID0KKyAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6c291bmR0cmlnZ2VyOjpWMl8xOjpJU291bmRUcmlnZ2VySHc7Cit1c2luZyBWMl8xX0lTb3VuZFRyaWdnZXJId0NhbGxiYWNrID0KKyAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6c291bmR0cmlnZ2VyOjpWMl8xOjpJU291bmRUcmlnZ2VySHdDYWxsYmFjazsKK3VzaW5nIDo6YW5kcm9pZDo6aGlkbDo6bWVtb3J5OjpWMV8wOjpJTWVtb3J5OwogCiBjbGFzcyBTb3VuZFRyaWdnZXJIYWxIaWRsIDogcHVibGljIFNvdW5kVHJpZ2dlckhhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdmlydHVhbCBJU291bmRUcmlnZ2VySHdDYWxsYmFjaworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2aXJ0dWFsIFYyXzFfSVNvdW5kVHJpZ2dlckh3Q2FsbGJhY2sKIAogewogcHVibGljOgpAQCAtODQsMTEgKzk0LDE3IEBACiAKICAgICAgICAgLy8gSVNvdW5kVHJpZ2dlckh3Q2FsbGJhY2sKICAgICAgICAgdmlydHVhbCA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmVjb2duaXRpb25DYWxsYmFjaygKLSAgICAgICAgICAgICAgICBjb25zdCBJU291bmRUcmlnZ2VySHdDYWxsYmFjazo6UmVjb2duaXRpb25FdmVudCYgZXZlbnQsIENhbGxiYWNrQ29va2llIGNvb2tpZSk7CisgICAgICAgICAgICAgICAgY29uc3QgVjJfMF9JU291bmRUcmlnZ2VySHdDYWxsYmFjazo6UmVjb2duaXRpb25FdmVudCYgZXZlbnQsIENhbGxiYWNrQ29va2llIGNvb2tpZSk7CiAgICAgICAgIHZpcnR1YWwgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHBocmFzZVJlY29nbml0aW9uQ2FsbGJhY2soCi0gICAgICAgICAgICAgICAgY29uc3QgSVNvdW5kVHJpZ2dlckh3Q2FsbGJhY2s6OlBocmFzZVJlY29nbml0aW9uRXZlbnQmIGV2ZW50LCBpbnQzMl90IGNvb2tpZSk7CisgICAgICAgICAgICAgICAgY29uc3QgVjJfMF9JU291bmRUcmlnZ2VySHdDYWxsYmFjazo6UGhyYXNlUmVjb2duaXRpb25FdmVudCYgZXZlbnQsIGludDMyX3QgY29va2llKTsKICAgICAgICAgdmlydHVhbCA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4gc291bmRNb2RlbENhbGxiYWNrKAotICAgICAgICAgICAgICAgIGNvbnN0IElTb3VuZFRyaWdnZXJId0NhbGxiYWNrOjpNb2RlbEV2ZW50JiBldmVudCwgQ2FsbGJhY2tDb29raWUgY29va2llKTsKKyAgICAgICAgICAgICAgICBjb25zdCBWMl8wX0lTb3VuZFRyaWdnZXJId0NhbGxiYWNrOjpNb2RlbEV2ZW50JiBldmVudCwgQ2FsbGJhY2tDb29raWUgY29va2llKTsKKyAgICAgICAgdmlydHVhbCA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmVjb2duaXRpb25DYWxsYmFja18yXzEoCisgICAgICAgICAgICAgICAgY29uc3QgUmVjb2duaXRpb25FdmVudCYgZXZlbnQsIENhbGxiYWNrQ29va2llIGNvb2tpZSk7CisgICAgICAgIHZpcnR1YWwgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHBocmFzZVJlY29nbml0aW9uQ2FsbGJhY2tfMl8xKAorICAgICAgICAgICAgICAgIGNvbnN0IFBocmFzZVJlY29nbml0aW9uRXZlbnQmIGV2ZW50LCBpbnQzMl90IGNvb2tpZSk7CisgICAgICAgIHZpcnR1YWwgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHNvdW5kTW9kZWxDYWxsYmFja18yXzEoCisgICAgICAgICAgICAgICAgY29uc3QgTW9kZWxFdmVudCYgZXZlbnQsIENhbGxiYWNrQ29va2llIGNvb2tpZSk7CiBwcml2YXRlOgogICAgICAgICBjbGFzcyBTb3VuZE1vZGVsIDogcHVibGljIFJlZkJhc2UgewogICAgICAgICBwdWJsaWM6CkBAIC0xMjQsMjUgKzE0MCw0OCBAQAogICAgICAgICB2b2lkIGNvbnZlcnRUcmlnZ2VyUGhyYXNlVG9IYWwoCiAgICAgICAgICAgICAgICAgSVNvdW5kVHJpZ2dlckh3OjpQaHJhc2UgKmhhbFRyaWdnZXJQaHJhc2UsCiAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHNvdW5kX3RyaWdnZXJfcGhyYXNlICp0cmlnZ2VyUGhyYXNlKTsKLSAgICAgICAgSVNvdW5kVHJpZ2dlckh3OjpTb3VuZE1vZGVsICpjb252ZXJ0U291bmRNb2RlbFRvSGFsKAorICAgICAgICB2b2lkIGNvbnZlcnRUcmlnZ2VyUGhyYXNlc1RvSGFsKAorICAgICAgICAgICAgICAgIGhpZGxfdmVjPElTb3VuZFRyaWdnZXJIdzo6UGhyYXNlPiAqaGFsVHJpZ2dlclBocmFzZXMsCisgICAgICAgICAgICAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfcGhyYXNlX3NvdW5kX21vZGVsICprZXlQaHJhc2VNb2RlbCk7CisgICAgICAgIHZvaWQgY29udmVydFNvdW5kTW9kZWxUb0hhbChJU291bmRUcmlnZ2VySHc6OlNvdW5kTW9kZWwgKmhhbE1vZGVsLAogICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBzb3VuZF90cmlnZ2VyX3NvdW5kX21vZGVsICpzb3VuZE1vZGVsKTsKKyAgICAgICAgc3RkOjpwYWlyPGJvb2wsIHNwPElNZW1vcnk+PiBjb252ZXJ0U291bmRNb2RlbFRvSGFsKAorICAgICAgICAgICAgICAgIFYyXzFfSVNvdW5kVHJpZ2dlckh3OjpTb3VuZE1vZGVsICpoYWxNb2RlbCwKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9zb3VuZF9tb2RlbCAqc291bmRNb2RlbCkKKyAgICAgICAgICAgICAgICBfX2F0dHJpYnV0ZV9fKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKKyAgICAgICAgdm9pZCBjb252ZXJ0UGhyYXNlU291bmRNb2RlbFRvSGFsKElTb3VuZFRyaWdnZXJIdzo6UGhyYXNlU291bmRNb2RlbCAqaGFsS2V5UGhyYXNlTW9kZWwsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHNvdW5kX3RyaWdnZXJfc291bmRfbW9kZWwgKnNvdW5kTW9kZWwpOworICAgICAgICBzdGQ6OnBhaXI8Ym9vbCwgc3A8SU1lbW9yeT4+IGNvbnZlcnRQaHJhc2VTb3VuZE1vZGVsVG9IYWwoCisgICAgICAgICAgICAgICAgVjJfMV9JU291bmRUcmlnZ2VySHc6OlBocmFzZVNvdW5kTW9kZWwgKmhhbEtleVBocmFzZU1vZGVsLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBzb3VuZF90cmlnZ2VyX3NvdW5kX21vZGVsICpzb3VuZE1vZGVsKQorICAgICAgICAgICAgICAgIF9fYXR0cmlidXRlX18oKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwogCiAgICAgICAgIHZvaWQgY29udmVydFBocmFzZVJlY29nbml0aW9uRXh0cmFUb0hhbCgKICAgICAgICAgICAgICAgICBQaHJhc2VSZWNvZ25pdGlvbkV4dHJhICpoYWxFeHRyYSwKICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9waHJhc2VfcmVjb2duaXRpb25fZXh0cmEgKmV4dHJhKTsKLSAgICAgICAgSVNvdW5kVHJpZ2dlckh3OjpSZWNvZ25pdGlvbkNvbmZpZyAqY29udmVydFJlY29nbml0aW9uQ29uZmlnVG9IYWwoCisgICAgICAgIHZvaWQgY29udmVydFJlY29nbml0aW9uQ29uZmlnVG9IYWwoSVNvdW5kVHJpZ2dlckh3OjpSZWNvZ25pdGlvbkNvbmZpZyAqaGFsQ29uZmlnLAogICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2NvbmZpZyAqY29uZmlnKTsKKyAgICAgICAgc3RkOjpwYWlyPGJvb2wsIHNwPElNZW1vcnk+PiBjb252ZXJ0UmVjb2duaXRpb25Db25maWdUb0hhbCgKKyAgICAgICAgICAgICAgICBWMl8xX0lTb3VuZFRyaWdnZXJIdzo6UmVjb2duaXRpb25Db25maWcgKmhhbENvbmZpZywKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9jb25maWcgKmNvbmZpZykKKyAgICAgICAgICAgICAgICBfX2F0dHJpYnV0ZV9fKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKIAogICAgICAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2RlbF9ldmVudCAqY29udmVydFNvdW5kTW9kZWxFdmVudEZyb21IYWwoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSVNvdW5kVHJpZ2dlckh3Q2FsbGJhY2s6Ok1vZGVsRXZlbnQgKmhhbEV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWMl8wX0lTb3VuZFRyaWdnZXJId0NhbGxiYWNrOjpNb2RlbEV2ZW50ICpoYWxFdmVudCk7CiAgICAgICAgIHZvaWQgY29udmVydFBocmFzZVJlY29nbml0aW9uRXh0cmFGcm9tSGFsKAogICAgICAgICAgICAgICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX3BocmFzZV9yZWNvZ25pdGlvbl9leHRyYSAqZXh0cmEsCiAgICAgICAgICAgICAgICAgY29uc3QgUGhyYXNlUmVjb2duaXRpb25FeHRyYSAqaGFsRXh0cmEpOworICAgICAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9waHJhc2VfcmVjb2duaXRpb25fZXZlbnQqIGNvbnZlcnRQaHJhc2VSZWNvZ25pdGlvbkV2ZW50RnJvbUhhbCgKKyAgICAgICAgICAgICAgICBjb25zdCBWMl8wX0lTb3VuZFRyaWdnZXJId0NhbGxiYWNrOjpQaHJhc2VSZWNvZ25pdGlvbkV2ZW50ICpoYWxQaHJhc2VFdmVudCk7CiAgICAgICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2V2ZW50ICpjb252ZXJ0UmVjb2duaXRpb25FdmVudEZyb21IYWwoCi0gICAgICAgICAgICAgICAgY29uc3QgSVNvdW5kVHJpZ2dlckh3Q2FsbGJhY2s6OlJlY29nbml0aW9uRXZlbnQgKmhhbEV2ZW50KTsKKyAgICAgICAgICAgICAgICBjb25zdCBWMl8wX0lTb3VuZFRyaWdnZXJId0NhbGxiYWNrOjpSZWNvZ25pdGlvbkV2ZW50ICpoYWxFdmVudCk7CisgICAgICAgIHZvaWQgZmlsbFJlY29nbml0aW9uRXZlbnRGcm9tSGFsKAorICAgICAgICAgICAgICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2V2ZW50ICpldmVudCwKKyAgICAgICAgICAgICAgICBjb25zdCBWMl8wX0lTb3VuZFRyaWdnZXJId0NhbGxiYWNrOjpSZWNvZ25pdGlvbkV2ZW50ICpoYWxFdmVudCk7CiAKICAgICAgICAgdWludDMyX3QgbmV4dFVuaXF1ZUlkKCk7CiAgICAgICAgIHNwPElTb3VuZFRyaWdnZXJIdz4gZ2V0U2VydmljZSgpOworICAgICAgICBzcDxWMl8xX0lTb3VuZFRyaWdnZXJIdz4gdG9TZXJ2aWNlMl8xKGNvbnN0IHNwPElTb3VuZFRyaWdnZXJIdz4mIHMpOwogICAgICAgICBzcDxTb3VuZE1vZGVsPiBnZXRNb2RlbChzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOwogICAgICAgICBzcDxTb3VuZE1vZGVsPiByZW1vdmVNb2RlbChzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCmluZGV4IDIyNTE5YTMuLmE3ZDZlODMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCkBAIC0yMDYsOSArMjA2LDEwIEBACiAgICAgc2VydmljZS0+c2VuZFJlY29nbml0aW9uRXZlbnQoZXZlbnQsIG1vZHVsZSk7CiB9CiAKLXNwPElNZW1vcnk+IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6cHJlcGFyZVJlY29nbml0aW9uRXZlbnRfbCgKK3NwPElNZW1vcnk+IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6cHJlcGFyZVJlY29nbml0aW9uRXZlbnQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fZXZlbnQgKmV2ZW50KQogeworICAgIEF1dG9NdXRleCBsb2NrKG1NZW1vcnlEZWFsZXJMb2NrKTsKICAgICBzcDxJTWVtb3J5PiBldmVudE1lbW9yeTsKIAogICAgIC8vc2FuaXRpemUgZXZlbnQKQEAgLTIxNiwyMSArMjE3LDIxIEBACiAgICAgY2FzZSBTT1VORF9NT0RFTF9UWVBFX0tFWVBIUkFTRToKICAgICAgICAgQUxPR1dfSUYoZXZlbnQtPmRhdGFfc2l6ZSAhPSAwICYmIGV2ZW50LT5kYXRhX29mZnNldCAhPQogICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHNvdW5kX3RyaWdnZXJfcGhyYXNlX3JlY29nbml0aW9uX2V2ZW50KSwKLSAgICAgICAgICAgICAgICAgICAgInByZXBhcmVSZWNvZ25pdGlvbkV2ZW50X2woKTogaW52YWxpZCBkYXRhIG9mZnNldCAldSBmb3Iga2V5cGhyYXNlIGV2ZW50IHR5cGUiLAorICAgICAgICAgICAgICAgICAgICAicHJlcGFyZVJlY29nbml0aW9uRXZlbnQoKTogaW52YWxpZCBkYXRhIG9mZnNldCAldSBmb3Iga2V5cGhyYXNlIGV2ZW50IHR5cGUiLAogICAgICAgICAgICAgICAgICAgICBldmVudC0+ZGF0YV9vZmZzZXQpOwogICAgICAgICBldmVudC0+ZGF0YV9vZmZzZXQgPSBzaXplb2Yoc3RydWN0IHNvdW5kX3RyaWdnZXJfcGhyYXNlX3JlY29nbml0aW9uX2V2ZW50KTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBTT1VORF9NT0RFTF9UWVBFX0dFTkVSSUM6CiAgICAgICAgIEFMT0dXX0lGKGV2ZW50LT5kYXRhX3NpemUgIT0gMCAmJiBldmVudC0+ZGF0YV9vZmZzZXQgIT0KICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBzb3VuZF90cmlnZ2VyX2dlbmVyaWNfcmVjb2duaXRpb25fZXZlbnQpLAotICAgICAgICAgICAgICAgICAgICAicHJlcGFyZVJlY29nbml0aW9uRXZlbnRfbCgpOiBpbnZhbGlkIGRhdGEgb2Zmc2V0ICV1IGZvciBnZW5lcmljIGV2ZW50IHR5cGUiLAorICAgICAgICAgICAgICAgICAgICAicHJlcGFyZVJlY29nbml0aW9uRXZlbnQoKTogaW52YWxpZCBkYXRhIG9mZnNldCAldSBmb3IgZ2VuZXJpYyBldmVudCB0eXBlIiwKICAgICAgICAgICAgICAgICAgICAgZXZlbnQtPmRhdGFfb2Zmc2V0KTsKICAgICAgICAgZXZlbnQtPmRhdGFfb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBzb3VuZF90cmlnZ2VyX2dlbmVyaWNfcmVjb2duaXRpb25fZXZlbnQpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIFNPVU5EX01PREVMX1RZUEVfVU5LTk9XTjoKICAgICAgICAgQUxPR1dfSUYoZXZlbnQtPmRhdGFfc2l6ZSAhPSAwICYmIGV2ZW50LT5kYXRhX29mZnNldCAhPQogICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fZXZlbnQpLAotICAgICAgICAgICAgICAgICAgICAicHJlcGFyZVJlY29nbml0aW9uRXZlbnRfbCgpOiBpbnZhbGlkIGRhdGEgb2Zmc2V0ICV1IGZvciB1bmtub3duIGV2ZW50IHR5cGUiLAorICAgICAgICAgICAgICAgICAgICAicHJlcGFyZVJlY29nbml0aW9uRXZlbnQoKTogaW52YWxpZCBkYXRhIG9mZnNldCAldSBmb3IgdW5rbm93biBldmVudCB0eXBlIiwKICAgICAgICAgICAgICAgICAgICAgZXZlbnQtPmRhdGFfb2Zmc2V0KTsKICAgICAgICAgZXZlbnQtPmRhdGFfb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2V2ZW50KTsKICAgICAgICAgYnJlYWs7CkBAIC0yNTEsMzAgKzI1MiwxOSBAQAogCiB2b2lkIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6c2VuZFJlY29nbml0aW9uRXZlbnQoc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fZXZlbnQgKmV2ZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZSAqbW9kdWxlKQotIHsKLSAgICAgQXV0b011dGV4IGxvY2sobVNlcnZpY2VMb2NrKTsKLSAgICAgaWYgKG1vZHVsZSA9PSBOVUxMKSB7Ci0gICAgICAgICByZXR1cm47Ci0gICAgIH0KLSAgICAgc3A8SU1lbW9yeT4gZXZlbnRNZW1vcnkgPSBwcmVwYXJlUmVjb2duaXRpb25FdmVudF9sKGV2ZW50KTsKLSAgICAgaWYgKGV2ZW50TWVtb3J5ID09IDApIHsKLSAgICAgICAgIHJldHVybjsKLSAgICAgfQotICAgICBzcDxNb2R1bGU+IHN0cm9uZ01vZHVsZTsKLSAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTW9kdWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgaWYgKG1Nb2R1bGVzLnZhbHVlQXQoaSkuZ2V0KCkgPT0gbW9kdWxlKSB7Ci0gICAgICAgICAgICAgc3Ryb25nTW9kdWxlID0gbU1vZHVsZXMudmFsdWVBdChpKTsKLSAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgICAgfQotICAgICBpZiAoc3Ryb25nTW9kdWxlID09IDApIHsKLSAgICAgICAgIHJldHVybjsKLSAgICAgfQoreworICAgIGlmIChtb2R1bGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNwPElNZW1vcnk+IGV2ZW50TWVtb3J5ID0gcHJlcGFyZVJlY29nbml0aW9uRXZlbnQoZXZlbnQpOworICAgIGlmIChldmVudE1lbW9yeSA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKICAgICBzcDxDYWxsYmFja0V2ZW50PiBjYWxsYmFja0V2ZW50ID0gbmV3IENhbGxiYWNrRXZlbnQoQ2FsbGJhY2tFdmVudDo6VFlQRV9SRUNPR05JVElPTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRNZW1vcnkpOwotICAgIGNhbGxiYWNrRXZlbnQtPnNldE1vZHVsZShzdHJvbmdNb2R1bGUpOwotICAgIHNlbmRDYWxsYmFja0V2ZW50X2woY2FsbGJhY2tFdmVudCk7CisgICAgY2FsbGJhY2tFdmVudC0+c2V0TW9kdWxlKG1vZHVsZSk7CisgICAgc2VuZENhbGxiYWNrRXZlbnQoY2FsbGJhY2tFdmVudCk7CiB9CiAKIC8vIHN0YXRpYwpAQCAtMjkzLDggKzI4Myw5IEBACiAgICAgc2VydmljZS0+c2VuZFNvdW5kTW9kZWxFdmVudChldmVudCwgbW9kdWxlKTsKIH0KIAotc3A8SU1lbW9yeT4gU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpwcmVwYXJlU291bmRNb2RlbEV2ZW50X2woc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kZWxfZXZlbnQgKmV2ZW50KQorc3A8SU1lbW9yeT4gU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpwcmVwYXJlU291bmRNb2RlbEV2ZW50KHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZGVsX2V2ZW50ICpldmVudCkKIHsKKyAgICBBdXRvTXV0ZXggbG9jayhtTWVtb3J5RGVhbGVyTG9jayk7CiAgICAgc3A8SU1lbW9yeT4gZXZlbnRNZW1vcnk7CiAKICAgICBzaXplX3Qgc2l6ZSA9IGV2ZW50LT5kYXRhX29mZnNldCArIGV2ZW50LT5kYXRhX3NpemU7CkBAIC0zMTEsMzAgKzMwMiwyMCBAQAogdm9pZCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6OnNlbmRTb3VuZE1vZGVsRXZlbnQoc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kZWxfZXZlbnQgKmV2ZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlICptb2R1bGUpCiB7Ci0gICAgQXV0b011dGV4IGxvY2sobVNlcnZpY2VMb2NrKTsKLSAgICBzcDxJTWVtb3J5PiBldmVudE1lbW9yeSA9IHByZXBhcmVTb3VuZE1vZGVsRXZlbnRfbChldmVudCk7CisgICAgc3A8SU1lbW9yeT4gZXZlbnRNZW1vcnkgPSBwcmVwYXJlU291bmRNb2RlbEV2ZW50KGV2ZW50KTsKICAgICBpZiAoZXZlbnRNZW1vcnkgPT0gMCkgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIHNwPE1vZHVsZT4gc3Ryb25nTW9kdWxlOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1vZHVsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKG1Nb2R1bGVzLnZhbHVlQXQoaSkuZ2V0KCkgPT0gbW9kdWxlKSB7Ci0gICAgICAgICAgICBzdHJvbmdNb2R1bGUgPSBtTW9kdWxlcy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHN0cm9uZ01vZHVsZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9CiAgICAgc3A8Q2FsbGJhY2tFdmVudD4gY2FsbGJhY2tFdmVudCA9IG5ldyBDYWxsYmFja0V2ZW50KENhbGxiYWNrRXZlbnQ6OlRZUEVfU09VTkRNT0RFTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRNZW1vcnkpOwotICAgIGNhbGxiYWNrRXZlbnQtPnNldE1vZHVsZShzdHJvbmdNb2R1bGUpOwotICAgIHNlbmRDYWxsYmFja0V2ZW50X2woY2FsbGJhY2tFdmVudCk7CisgICAgY2FsbGJhY2tFdmVudC0+c2V0TW9kdWxlKG1vZHVsZSk7CisgICAgc2VuZENhbGxiYWNrRXZlbnQoY2FsbGJhY2tFdmVudCk7CiB9CiAKIAotc3A8SU1lbW9yeT4gU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpwcmVwYXJlU2VydmljZVN0YXRlRXZlbnRfbChzb3VuZF90cmlnZ2VyX3NlcnZpY2Vfc3RhdGVfdCBzdGF0ZSkKK3NwPElNZW1vcnk+IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6cHJlcGFyZVNlcnZpY2VTdGF0ZUV2ZW50KHNvdW5kX3RyaWdnZXJfc2VydmljZV9zdGF0ZV90IHN0YXRlKQogeworICAgIEF1dG9NdXRleCBsb2NrKG1NZW1vcnlEZWFsZXJMb2NrKTsKICAgICBzcDxJTWVtb3J5PiBldmVudE1lbW9yeTsKIAogICAgIHNpemVfdCBzaXplID0gc2l6ZW9mKHNvdW5kX3RyaWdnZXJfc2VydmljZV9zdGF0ZV90KTsKQEAgLTM0Nyw0NSArMzI4LDMzIEBACiAgICAgcmV0dXJuIGV2ZW50TWVtb3J5OwogfQogCi0vLyBjYWxsIHdpdGggbVNlcnZpY2VMb2NrIGhlbGQKLXZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpzZW5kU2VydmljZVN0YXRlRXZlbnRfbChzb3VuZF90cmlnZ2VyX3NlcnZpY2Vfc3RhdGVfdCBzdGF0ZSwKK3ZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpzZW5kU2VydmljZVN0YXRlRXZlbnQoc291bmRfdHJpZ2dlcl9zZXJ2aWNlX3N0YXRlX3Qgc3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZSAqbW9kdWxlKQogewotICAgIHNwPElNZW1vcnk+IGV2ZW50TWVtb3J5ID0gcHJlcGFyZVNlcnZpY2VTdGF0ZUV2ZW50X2woc3RhdGUpOworICAgIHNwPElNZW1vcnk+IGV2ZW50TWVtb3J5ID0gcHJlcGFyZVNlcnZpY2VTdGF0ZUV2ZW50KHN0YXRlKTsKICAgICBpZiAoZXZlbnRNZW1vcnkgPT0gMCkgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIHNwPE1vZHVsZT4gc3Ryb25nTW9kdWxlOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1vZHVsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKG1Nb2R1bGVzLnZhbHVlQXQoaSkuZ2V0KCkgPT0gbW9kdWxlKSB7Ci0gICAgICAgICAgICBzdHJvbmdNb2R1bGUgPSBtTW9kdWxlcy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHN0cm9uZ01vZHVsZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9CiAgICAgc3A8Q2FsbGJhY2tFdmVudD4gY2FsbGJhY2tFdmVudCA9IG5ldyBDYWxsYmFja0V2ZW50KENhbGxiYWNrRXZlbnQ6OlRZUEVfU0VSVklDRV9TVEFURSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRNZW1vcnkpOwotICAgIGNhbGxiYWNrRXZlbnQtPnNldE1vZHVsZShzdHJvbmdNb2R1bGUpOwotICAgIHNlbmRDYWxsYmFja0V2ZW50X2woY2FsbGJhY2tFdmVudCk7CisgICAgY2FsbGJhY2tFdmVudC0+c2V0TW9kdWxlKG1vZHVsZSk7CisgICAgc2VuZENhbGxiYWNrRXZlbnQoY2FsbGJhY2tFdmVudCk7CiB9CiAKLXZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpzZW5kU2VydmljZVN0YXRlRXZlbnRfbChzb3VuZF90cmlnZ2VyX3NlcnZpY2Vfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVDbGllbnQgKm1vZHVsZUNsaWVudCkKK3ZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpzZW5kU2VydmljZVN0YXRlRXZlbnQoc291bmRfdHJpZ2dlcl9zZXJ2aWNlX3N0YXRlX3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZUNsaWVudCAqbW9kdWxlQ2xpZW50KQogewotICAgIHNwPElNZW1vcnk+IGV2ZW50TWVtb3J5ID0gcHJlcGFyZVNlcnZpY2VTdGF0ZUV2ZW50X2woc3RhdGUpOworICAgIHNwPElNZW1vcnk+IGV2ZW50TWVtb3J5ID0gcHJlcGFyZVNlcnZpY2VTdGF0ZUV2ZW50KHN0YXRlKTsKICAgICBpZiAoZXZlbnRNZW1vcnkgPT0gMCkgewogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIHNwPENhbGxiYWNrRXZlbnQ+IGNhbGxiYWNrRXZlbnQgPSBuZXcgQ2FsbGJhY2tFdmVudChDYWxsYmFja0V2ZW50OjpUWVBFX1NFUlZJQ0VfU1RBVEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TWVtb3J5KTsKICAgICBjYWxsYmFja0V2ZW50LT5zZXRNb2R1bGVDbGllbnQobW9kdWxlQ2xpZW50KTsKLSAgICBzZW5kQ2FsbGJhY2tFdmVudF9sKGNhbGxiYWNrRXZlbnQpOworICAgIHNlbmRDYWxsYmFja0V2ZW50KGNhbGxiYWNrRXZlbnQpOwogfQogCi0vLyBjYWxsIHdpdGggbVNlcnZpY2VMb2NrIGhlbGQKLXZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpzZW5kQ2FsbGJhY2tFdmVudF9sKGNvbnN0IHNwPENhbGxiYWNrRXZlbnQ+JiBldmVudCkKK3ZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpzZW5kQ2FsbGJhY2tFdmVudChjb25zdCBzcDxDYWxsYmFja0V2ZW50PiYgZXZlbnQpCiB7CiAgICAgbUNhbGxiYWNrVGhyZWFkLT5zZW5kQ2FsbGJhY2tFdmVudChldmVudCk7CiB9CkBAIC00MDQsNiArMzczLDE5IEBACiAgICAgICAgICAgICBpZiAobW9kdWxlQ2xpZW50ID09IDApIHsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBTYW5pdHkgY2hlY2sgb24gdGhpcyBiZWluZyBhIE1vZHVsZSB3ZSBrbm93IGFib3V0LgorICAgICAgICAgICAgYm9vbCBmb3VuZE1vZHVsZSA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTW9kdWxlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChtTW9kdWxlcy52YWx1ZUF0KGkpLmdldCgpID09IG1vZHVsZS5nZXQoKSkgeworICAgICAgICAgICAgICAgICAgICBmb3VuZE1vZHVsZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZm91bmRNb2R1bGUpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgib25DYWxsYmFja0V2ZW50IGZvciB1bmtub3duIG1vZHVsZSIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KICAgICBpZiAobW9kdWxlICE9IDApIHsKQEAgLTc1NywxMSArNzM5LDEyIEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKKyAgICBWZWN0b3I8IHNwPE1vZHVsZUNsaWVudD4gPiBjbGllbnRzOworCiAgICAgc3dpdGNoIChldmVudC0+bVR5cGUpIHsKICAgICBjYXNlIENhbGxiYWNrRXZlbnQ6OlRZUEVfUkVDT0dOSVRJT046IHsKICAgICAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fZXZlbnQgKnJlY29nbml0aW9uRXZlbnQgPQogICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9ldmVudCAqKWV2ZW50TWVtb3J5LT5wb2ludGVyKCk7Ci0gICAgICAgIHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+IGNsaWVudDsKICAgICAgICAgewogICAgICAgICAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgICAgICAgICAgc3A8TW9kZWw+IG1vZGVsID0gZ2V0TW9kZWwocmVjb2duaXRpb25FdmVudC0+bW9kZWwpOwpAQCAtNzc2LDE2ICs3NTksMTIgQEAKIAogICAgICAgICAgICAgcmVjb2duaXRpb25FdmVudC0+Y2FwdHVyZV9zZXNzaW9uID0gbW9kZWwtPm1DYXB0dXJlU2Vzc2lvbjsKICAgICAgICAgICAgIG1vZGVsLT5tU3RhdGUgPSBNb2RlbDo6U1RBVEVfSURMRTsKLSAgICAgICAgICAgIGNsaWVudCA9IG1vZGVsLT5tTW9kdWxlQ2xpZW50LT5jbGllbnQoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2xpZW50ICE9IDApIHsKLSAgICAgICAgICAgIGNsaWVudC0+b25SZWNvZ25pdGlvbkV2ZW50KGV2ZW50TWVtb3J5KTsKKyAgICAgICAgICAgIGNsaWVudHMuYWRkKG1vZGVsLT5tTW9kdWxlQ2xpZW50KTsKICAgICAgICAgfQogICAgIH0gYnJlYWs7CiAgICAgY2FzZSBDYWxsYmFja0V2ZW50OjpUWVBFX1NPVU5ETU9ERUw6IHsKICAgICAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kZWxfZXZlbnQgKnNvdW5kbW9kZWxFdmVudCA9CiAgICAgICAgICAgICAgICAgKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZGVsX2V2ZW50ICopZXZlbnRNZW1vcnktPnBvaW50ZXIoKTsKLSAgICAgICAgc3A8SVNvdW5kVHJpZ2dlckNsaWVudD4gY2xpZW50OwogICAgICAgICB7CiAgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAgICAgICAgICAgICBzcDxNb2RlbD4gbW9kZWwgPSBnZXRNb2RlbChzb3VuZG1vZGVsRXZlbnQtPm1vZGVsKTsKQEAgLTc5MywyOSArNzcyLDI2IEBACiAgICAgICAgICAgICAgICAgQUxPR1coIiVzIG1vZGVsID09IDAiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgY2xpZW50ID0gbW9kZWwtPm1Nb2R1bGVDbGllbnQtPmNsaWVudCgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjbGllbnQgIT0gMCkgewotICAgICAgICAgICAgY2xpZW50LT5vblNvdW5kTW9kZWxFdmVudChldmVudE1lbW9yeSk7CisgICAgICAgICAgICBjbGllbnRzLmFkZChtb2RlbC0+bU1vZHVsZUNsaWVudCk7CiAgICAgICAgIH0KICAgICB9IGJyZWFrOwogICAgIGNhc2UgQ2FsbGJhY2tFdmVudDo6VFlQRV9TRVJWSUNFX1NUQVRFOiB7Ci0gICAgICAgIFZlY3Rvcjwgc3A8SVNvdW5kVHJpZ2dlckNsaWVudD4gPiBjbGllbnRzOwogICAgICAgICB7CiAgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Nb2R1bGVDbGllbnRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1Nb2R1bGVDbGllbnRzW2ldICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY2xpZW50cy5hZGQobU1vZHVsZUNsaWVudHNbaV0tPmNsaWVudCgpKTsKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50cy5hZGQobU1vZHVsZUNsaWVudHNbaV0pOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNsaWVudHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGNsaWVudHNbaV0tPm9uU2VydmljZVN0YXRlQ2hhbmdlKGV2ZW50TWVtb3J5KTsKLSAgICAgICAgfQogICAgIH0gYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgib25DYWxsYmFja0V2ZW50IHVua25vd24gZXZlbnQgdHlwZSAlZCIsIGV2ZW50LT5tVHlwZSk7CiAgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjbGllbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNsaWVudHNbaV0tPm9uQ2FsbGJhY2tFdmVudChldmVudCk7CisgICAgfQogfQogCiBzcDxTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZGVsPiBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZHVsZTo6Z2V0TW9kZWwoCkBAIC04NzgsNyArODU0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgZXZlbnQuY29tbW9uLnR5cGUgPSBtb2RlbC0+bVR5cGU7CiAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmNvbW1vbi5tb2RlbCA9IG1vZGVsLT5tSGFuZGxlOwogICAgICAgICAgICAgICAgICAgICBldmVudC5jb21tb24uZGF0YV9zaXplID0gMDsKLSAgICAgICAgICAgICAgICAgICAgc3A8SU1lbW9yeT4gZXZlbnRNZW1vcnkgPSBzZXJ2aWNlLT5wcmVwYXJlUmVjb2duaXRpb25FdmVudF9sKCZldmVudC5jb21tb24pOworICAgICAgICAgICAgICAgICAgICBzcDxJTWVtb3J5PiBldmVudE1lbW9yeSA9IHNlcnZpY2UtPnByZXBhcmVSZWNvZ25pdGlvbkV2ZW50KCZldmVudC5jb21tb24pOwogICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnRNZW1vcnkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzLmFkZChldmVudE1lbW9yeSk7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTg4OSw3ICs4NjUsNyBAQAogICAgICAgICAgICAgICAgICAgICBldmVudC5jb21tb24udHlwZSA9IG1vZGVsLT5tVHlwZTsKICAgICAgICAgICAgICAgICAgICAgZXZlbnQuY29tbW9uLm1vZGVsID0gbW9kZWwtPm1IYW5kbGU7CiAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmNvbW1vbi5kYXRhX3NpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICBzcDxJTWVtb3J5PiBldmVudE1lbW9yeSA9IHNlcnZpY2UtPnByZXBhcmVSZWNvZ25pdGlvbkV2ZW50X2woJmV2ZW50LmNvbW1vbik7CisgICAgICAgICAgICAgICAgICAgIHNwPElNZW1vcnk+IGV2ZW50TWVtb3J5ID0gc2VydmljZS0+cHJlcGFyZVJlY29nbml0aW9uRXZlbnQoJmV2ZW50LmNvbW1vbik7CiAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudE1lbW9yeSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHMuYWRkKGV2ZW50TWVtb3J5KTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtOTAwLDcgKzg3Niw3IEBACiAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmNvbW1vbi50eXBlID0gbW9kZWwtPm1UeXBlOwogICAgICAgICAgICAgICAgICAgICBldmVudC5jb21tb24ubW9kZWwgPSBtb2RlbC0+bUhhbmRsZTsKICAgICAgICAgICAgICAgICAgICAgZXZlbnQuY29tbW9uLmRhdGFfc2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHNwPElNZW1vcnk+IGV2ZW50TWVtb3J5ID0gc2VydmljZS0+cHJlcGFyZVJlY29nbml0aW9uRXZlbnRfbCgmZXZlbnQuY29tbW9uKTsKKyAgICAgICAgICAgICAgICAgICAgc3A8SU1lbW9yeT4gZXZlbnRNZW1vcnkgPSBzZXJ2aWNlLT5wcmVwYXJlUmVjb2duaXRpb25FdmVudCgmZXZlbnQuY29tbW9uKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50TWVtb3J5ICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cy5hZGQoZXZlbnRNZW1vcnkpOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC05MTUsMTEgKzg5MSwxMSBAQAogICAgICAgICBzcDxDYWxsYmFja0V2ZW50PiBjYWxsYmFja0V2ZW50ID0gbmV3IENhbGxiYWNrRXZlbnQoQ2FsbGJhY2tFdmVudDo6VFlQRV9SRUNPR05JVElPTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c1tpXSk7CiAgICAgICAgIGNhbGxiYWNrRXZlbnQtPnNldE1vZHVsZSh0aGlzKTsKLSAgICAgICAgc2VydmljZS0+c2VuZENhbGxiYWNrRXZlbnRfbChjYWxsYmFja0V2ZW50KTsKKyAgICAgICAgc2VydmljZS0+c2VuZENhbGxiYWNrRXZlbnQoY2FsbGJhY2tFdmVudCk7CiAgICAgfQogCiBleGl0OgotICAgIHNlcnZpY2UtPnNlbmRTZXJ2aWNlU3RhdGVFdmVudF9sKHN0YXRlLCB0aGlzKTsKKyAgICBzZXJ2aWNlLT5zZW5kU2VydmljZVN0YXRlRXZlbnQoc3RhdGUsIHRoaXMpOwogfQogCiAKQEAgLTEwNjQsNyArMTA0MCw3IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICB9Ci0gICAgc2VydmljZS0+c2VuZFNlcnZpY2VTdGF0ZUV2ZW50X2woc3RhdGUsIHRoaXMpOworICAgIHNlcnZpY2UtPnNlbmRTZXJ2aWNlU3RhdGVFdmVudChzdGF0ZSwgdGhpcyk7CiB9CiAKIHZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGVDbGllbnQ6Om9uQ2FsbGJhY2tFdmVudChjb25zdCBzcDxDYWxsYmFja0V2ZW50PiYgZXZlbnQpCkBAIC0xMDc3LDE5ICsxMDUzLDI2IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBzd2l0Y2ggKGV2ZW50LT5tVHlwZSkgewotICAgIGNhc2UgQ2FsbGJhY2tFdmVudDo6VFlQRV9TRVJWSUNFX1NUQVRFOiB7Ci0gICAgICAgIHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+IGNsaWVudDsKLSAgICAgICAgewotICAgICAgICAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgICAgICAgICAgY2xpZW50ID0gbUNsaWVudDsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2xpZW50ICE9MCApIHsKKyAgICBzcDxJU291bmRUcmlnZ2VyQ2xpZW50PiBjbGllbnQ7CisgICAgeworICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgICAgIGNsaWVudCA9IG1DbGllbnQ7CisgICAgfQorCisgICAgaWYgKGNsaWVudCAhPSAwKSB7CisgICAgICAgIHN3aXRjaCAoZXZlbnQtPm1UeXBlKSB7CisgICAgICAgIGNhc2UgQ2FsbGJhY2tFdmVudDo6VFlQRV9SRUNPR05JVElPTjogeworICAgICAgICAgICAgY2xpZW50LT5vblJlY29nbml0aW9uRXZlbnQoZXZlbnRNZW1vcnkpOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIENhbGxiYWNrRXZlbnQ6OlRZUEVfU09VTkRNT0RFTDogeworICAgICAgICAgICAgY2xpZW50LT5vblNvdW5kTW9kZWxFdmVudChldmVudE1lbW9yeSk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgQ2FsbGJhY2tFdmVudDo6VFlQRV9TRVJWSUNFX1NUQVRFOiB7CiAgICAgICAgICAgICBjbGllbnQtPm9uU2VydmljZVN0YXRlQ2hhbmdlKGV2ZW50TWVtb3J5KTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIm9uQ2FsbGJhY2tFdmVudCB1bmtub3duIGV2ZW50IHR5cGUgJWQiLCBldmVudC0+bVR5cGUpOwogICAgICAgICB9Ci0gICAgfSBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJvbkNhbGxiYWNrRXZlbnQgdW5rbm93biBldmVudCB0eXBlICVkIiwgZXZlbnQtPm1UeXBlKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuaCBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuaAppbmRleCA5NWVmYzRiLi43MDhmYzk4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5oCkBAIC0yMTQsMTkgKzIxNCwxOSBAQAogICAgIH07CiAKICAgICBzdGF0aWMgdm9pZCByZWNvZ25pdGlvbkNhbGxiYWNrKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2V2ZW50ICpldmVudCwgdm9pZCAqY29va2llKTsKLSAgICAgICAgICAgc3A8SU1lbW9yeT4gcHJlcGFyZVJlY29nbml0aW9uRXZlbnRfbChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9ldmVudCAqZXZlbnQpOworICAgICAgICAgICBzcDxJTWVtb3J5PiBwcmVwYXJlUmVjb2duaXRpb25FdmVudChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9ldmVudCAqZXZlbnQpOwogICAgICAgICAgICB2b2lkIHNlbmRSZWNvZ25pdGlvbkV2ZW50KHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2V2ZW50ICpldmVudCwgTW9kdWxlICptb2R1bGUpOwogCiAgICAgc3RhdGljIHZvaWQgc291bmRNb2RlbENhbGxiYWNrKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZGVsX2V2ZW50ICpldmVudCwgdm9pZCAqY29va2llKTsKLSAgICAgICAgICAgc3A8SU1lbW9yeT4gcHJlcGFyZVNvdW5kTW9kZWxFdmVudF9sKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZGVsX2V2ZW50ICpldmVudCk7CisgICAgICAgICAgIHNwPElNZW1vcnk+IHByZXBhcmVTb3VuZE1vZGVsRXZlbnQoc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kZWxfZXZlbnQgKmV2ZW50KTsKICAgICAgICAgICAgdm9pZCBzZW5kU291bmRNb2RlbEV2ZW50KHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZGVsX2V2ZW50ICpldmVudCwgTW9kdWxlICptb2R1bGUpOwogCi0gICAgICAgICAgIHNwPElNZW1vcnk+IHByZXBhcmVTZXJ2aWNlU3RhdGVFdmVudF9sKHNvdW5kX3RyaWdnZXJfc2VydmljZV9zdGF0ZV90IHN0YXRlKTsKLSAgICAgICAgICAgdm9pZCBzZW5kU2VydmljZVN0YXRlRXZlbnRfbChzb3VuZF90cmlnZ2VyX3NlcnZpY2Vfc3RhdGVfdCBzdGF0ZSwgTW9kdWxlICptb2R1bGUpOwotICAgICAgICAgICB2b2lkIHNlbmRTZXJ2aWNlU3RhdGVFdmVudF9sKHNvdW5kX3RyaWdnZXJfc2VydmljZV9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZUNsaWVudCAqbW9kdWxlQ2xpZW50KTsKKyAgICAgICAgICAgc3A8SU1lbW9yeT4gcHJlcGFyZVNlcnZpY2VTdGF0ZUV2ZW50KHNvdW5kX3RyaWdnZXJfc2VydmljZV9zdGF0ZV90IHN0YXRlKTsKKyAgICAgICAgICAgdm9pZCBzZW5kU2VydmljZVN0YXRlRXZlbnQoc291bmRfdHJpZ2dlcl9zZXJ2aWNlX3N0YXRlX3Qgc3RhdGUsIE1vZHVsZSAqbW9kdWxlKTsKKyAgICAgICAgICAgdm9pZCBzZW5kU2VydmljZVN0YXRlRXZlbnQoc291bmRfdHJpZ2dlcl9zZXJ2aWNlX3N0YXRlX3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZUNsaWVudCAqbW9kdWxlQ2xpZW50KTsKIAotICAgICAgICAgICB2b2lkIHNlbmRDYWxsYmFja0V2ZW50X2woY29uc3Qgc3A8Q2FsbGJhY2tFdmVudD4mIGV2ZW50KTsKKyAgICAgICAgICAgdm9pZCBzZW5kQ2FsbGJhY2tFdmVudChjb25zdCBzcDxDYWxsYmFja0V2ZW50PiYgZXZlbnQpOwogICAgICAgICAgICB2b2lkIG9uQ2FsbGJhY2tFdmVudChjb25zdCBzcDxDYWxsYmFja0V2ZW50PiYgZXZlbnQpOwogCiBwcml2YXRlOgpAQCAtMjM4LDYgKzIzOCw3IEBACiAgICAgRGVmYXVsdEtleWVkVmVjdG9yPCBzb3VuZF90cmlnZ2VyX21vZHVsZV9oYW5kbGVfdCwgc3A8TW9kdWxlPiA+ICAgICBtTW9kdWxlczsKICAgICBzcDxDYWxsYmFja1RocmVhZD4gIG1DYWxsYmFja1RocmVhZDsKICAgICBzcDxNZW1vcnlEZWFsZXI+ICAgIG1NZW1vcnlEZWFsZXI7CisgICAgTXV0ZXggICAgICAgICAgICAgICBtTWVtb3J5RGVhbGVyTG9jazsKICAgICBib29sICAgICAgICAgICAgICAgIG1DYXB0dXJlU3RhdGU7CiB9OwogCmRpZmYgLS1naXQgYS90b29scy9PV05FUlMgYi90b29scy9PV05FUlMKaW5kZXggNmRjYjAzNS4uZjljYjU2NyAxMDA2NDQKLS0tIGEvdG9vbHMvT1dORVJTCisrKyBiL3Rvb2xzL09XTkVSUwpAQCAtMSArMSBAQAotZ2thc3RlbkBhbmRyb2lkLmNvbQorZ2thc3RlbkBnb29nbGUuY29tCmRpZmYgLS1naXQgYS90b29scy9yZXNhbXBsZXJfdG9vbHMvT1dORVJTIGIvdG9vbHMvcmVzYW1wbGVyX3Rvb2xzL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGE2Nzk4Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcmVzYW1wbGVyX3Rvb2xzL09XTkVSUwpAQCAtMCwwICsxIEBACitodW5nYUBnb29nbGUuY29tCg==